Version 2.1.1

Merge commit '2.1.1-dev.3.2' into stable
diff --git a/.github/no-response.yml b/.github/no-response.yml
index 6db0fdf..81cec3e 100644
--- a/.github/no-response.yml
+++ b/.github/no-response.yml
@@ -4,7 +4,7 @@
 daysUntilClose: 21
 
 # Label requiring a response.
-responseRequiredLabel: "need-info"
+responseRequiredLabel: "needs-info"
 
 # Comment to post when closing an Issue for lack of response.
 closeComment: >-
diff --git a/.gitignore b/.gitignore
index 48a1d61..3e23d6d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,6 +42,13 @@
 .vscode
 .history
 
+# analysis server files
+analysis_options.yaml
+compile_commands.json
+
+# GDB files
+.gdb_history
+
 # Built by chromebot and downloaded from Google Storage
 client/tests/drt
 
diff --git a/.packages b/.packages
index f9f0641..597ffb9 100644
--- a/.packages
+++ b/.packages
@@ -61,7 +61,6 @@
 markdown:third_party/pkg/markdown/lib
 matcher:third_party/pkg/matcher/lib
 meta:pkg/meta/lib
-microlytics:pkg/microlytics/lib
 mime:third_party/pkg/mime/lib
 mockito:third_party/pkg/mockito/lib
 mustache4dart:third_party/pkg/mustache4dart/lib
@@ -103,7 +102,6 @@
 test_process:third_party/pkg/test_process/lib
 test_reflective_loader:third_party/pkg/test_reflective_loader/lib
 testing:pkg/testing/lib
-tuple:third_party/pkg/tuple/lib
 typed_data:third_party/pkg/typed_data/lib
 unittest:third_party/pkg/unittest/lib
 usage:third_party/pkg/usage/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dc9f36f..43f645a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,215 @@
+## 2.1.1 - 2019-02-18
+
+This is a minor version release. Again, the team's focus was mostly on improving
+performance and stability after the large changes in Dart 2.0.0. In particular,
+dart2js now always uses the "fast startup" emitter and the old emitter has been
+removed.
+
+There are a couple of very minor **breaking changes:**
+
+*   In `dart:io`, adding to a closed `IOSink` now throws a `StateError`.
+
+*   On the Dart VM, a soundness hole when using `dart:mirrors` to reflectively
+    invoke a method in an incorrect way that violates its static types has
+    been fixed (Issue [35611][]).
+
+### Language
+
+This release has no language changes.
+
+### Core library
+
+#### `dart:core`
+
+*   Made `DateTime.parse()` also recognize `,` as a valid decimal separator
+    when parsing from a string (Issue [35576][]).
+
+[35576]: https://github.com/dart-lang/sdk/issues/35576
+
+#### `dart:html`
+
+*   Added methods `Element.removeAttribute`, `Element.removeAttributeNS`,
+    `Element.hasAttribute` and `Element.hasAttributeNS`. (Issue [35655][]).
+*   Improved dart2js compilation of `element.attributes.remove(name)` to
+    generate `element.removeAttribute(name)`, so that there is no performance
+    reason to migrate to the above methods.
+*   Fixed a number of `dart:html` bugs:
+
+    *   Fixed HTML API's with callback typedef to correctly convert Dart
+        functions to JS functions (Issue [35484]).
+    *   HttpStatus constants exposed in `dart:html` (Issue [34318]).
+    *   Expose DomName `ondblclick` and `dblclickEvent` for Angular analyzer.
+    *   Fixed `removeAll` on `classes`; `elements` parameter should be
+        `Iterable<Object>` to match Set's `removeAll` not `Iterable<E>` (Issue
+        [30278]).
+    *   Fixed a number of methods on DataTransferItem, Entry, FileEntry and
+        DirectoryEntry which previously returned NativeJavaScriptObject.  This
+        fixes handling drag/drop of files/directories (Issue [35510]).
+    *   Added ability to allow local file access from Chrome browser in ddb.
+
+[35655]: https://github.com/dart-lang/sdk/issues/35655
+[30278]: https://github.com/dart-lang/sdk/issues/30278
+[34318]: https://github.com/dart-lang/sdk/issues/34318
+[35484]: https://github.com/dart-lang/sdk/issues/35484
+[35510]: https://github.com/dart-lang/sdk/issues/35510
+
+#### `dart:io`
+
+*   **Breaking Change:** Adding to a closed `IOSink` now throws a `StateError`.
+*   Added ability to get and set low level socket options.
+
+[29554]: https://github.com/dart-lang/sdk/issues/29554
+
+### Dart VM
+
+In previous releases it was possible to violate static types using
+`dart:mirrors`. This code would run without any TypeErrors and print
+"impossible" output:
+
+```dart
+import 'dart:mirrors';
+
+class A {
+  void method(int v) {
+    if (v != null && v is! int) {
+      print("This should be impossible: expected null or int got ${v}");
+    }
+  }
+}
+
+void main() {
+  final obj = A();
+  reflect(obj).invoke(#method, ['not-an-number']);
+}
+```
+
+This bug is fixed now. Only code that already violates static typing will break.
+See Issue [35611][] for more details.
+
+[35611]: https://github.com/dart-lang/sdk/issues/35611
+
+### Dart for the Web
+
+#### dart2js
+
+*   The old "full emitter" back-end is removed and dart2js always uses the "fast
+    startup" back-end. The generated fast startup code is optimized to load
+    faster, even though it can be slightly larger. The `--fast-startup` and
+    `--no-fast-startup` are allowed but ignored. They will be removed in a
+    future version.
+
+*   We fixed a bug in how deferred constructor calls were incorrectly not marked
+    as deferred. The old behavior didn't cause breakages, but was imprecise and
+    pushed more code to the main output unit.
+
+*   A new deferred split algorithm implementation was added.
+
+    This implementation fixes a soundness bug and addresses performance issues
+    of the previous implementation, because of that it can have a visible impact
+    on apps. In particular:
+
+    *   We fixed a performance issue which was introduced when we migrated to
+        the common front-end. On large apps, the fix can cut 2/3 of the time
+        spent on this task.
+
+    *   We fixed a bug in how inferred types were categorized (Issue [35311][]).
+        The old behavior was unsound and could produce broken programs. The fix
+        may cause more code to be pulled into the main output unit.
+
+        This shows up frequently when returning deferred values from closures
+        since the closure's inferred return type is the deferred type. For
+        example, if you have:
+
+        ```dart
+        () async {
+          await deferred_prefix.loadLibrary();
+          return new deferred_prefix.Foo();
+        }
+        ```
+
+        The closure's return type is `Future<Foo>`. The old implementation
+        defers `Foo`, and incorrectly makes the return type `Future<dynamic>`.
+        This may break in places where the correct type is expected.
+
+        The new implementation will not defer `Foo`, and will place it in the
+        main output unit. If your intent is to defer it, then you need to ensure
+        the return type is not inferred to be `Foo`. For example, you can do so
+        by changing the code to a named closure with a declared type, or by
+        ensuring that the return expression has the type you want, like:
+
+        ```dart
+        () async {
+          await deferred_prefix.loadLibrary();
+          return new deferred_prefix.Foo() as dynamic;
+        }
+        ```
+
+        Because the new implementation might require you to inspect and fix your
+        app, we exposed two temporary flags:
+
+    *   The `--report-invalid-deferred-types` causes dart2js to run both the
+        old and new algorithms and report any cases where an invalid type was
+        detected.
+
+    *   The `--new-deferred-split` flag enables this new algorithm.
+
+*   The `--categories=*` flag is being replaced. `--categories=all` was only
+    used for testing and it is no longer supported. `--categories=Server`
+    continues to work at this time but it is deprecated, please use
+    `--server-mode` instead.
+
+*   The `--library-root` flag was replaced by `--libraries-spec`. This flag is
+    rarely used by developers invoking dart2js directly. It's important for
+    integrating dart2js with build systems. See `--help` for more details on the
+    new flag.
+
+[35311]: https://github.com/dart-lang/sdk/issues/35311
+
+### Tools
+
+#### Analyzer
+
+*   Support for `declarations-casts` has been removed and the `implicit-casts`
+    option now has the combined semantics of both options. This means that
+    users that disable `implicit-casts` might now see errors that were not
+    previously being reported.
+
+*   New hints added:
+
+    *   `NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR` and
+        `NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW` inform you when a
+        `@literal` const constructor is called in a non-const context (or with
+        `new`).
+    *   `INVALID_LITERAL_ANNOTATION` reports when something other than a const
+        constructor is annotated with `@literal`.
+    *   `SUBTYPE_OF_SEALED_CLASS` reports when any class or mixin subclasses
+        (extends, implements, mixes in, or constrains to) a `@sealed` class, and
+        the two are declared in different packages.
+    *   `MIXIN_ON_SEALED_CLASS` reports when a `@sealed` class is used as a
+        superclass constraint of a mixin.
+
+#### dartdoc
+
+Default styles now work much better on mobile. Simple browsing and searching of
+API docs now work in many cases.
+
+Upgraded the linter to `0.1.78` which adds the following improvements:
+
+*   Added `prefer_final_in_for_each`, `unnecessary_await_in_return`,
+    `use_function_type_syntax_for_parameters`,
+    `avoid_returning_null_for_future`, and `avoid_shadowing_type_parameters`.
+*   Updated `invariant_booleans` status to experimental.
+*   Fixed `type_annotate_public_apis` false positives on local functions.
+*   Fixed `avoid_shadowing_type_parameters` to report shadowed type parameters
+    in generic typedefs.
+*   Fixed `use_setters_to_change_properties` to not wrongly lint overriding
+    methods.
+*   Fixed `cascade_invocations` to not lint awaited targets.
+*   Fixed `prefer_conditional_assignment` false positives.
+*   Fixed `join_return_with_assignment` false positives.
+*   Fixed `cascade_invocations` false positives.
+*   Deprecated `prefer_bool_in_asserts` as it is redundant in Dart 2.
+
 ## 2.1.0 - 2018-11-15
 
 This is a minor version release. The team's focus was mostly on improving
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 88ffd12..80cdf8e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -11,7 +11,7 @@
       click that icon to report a bug on the page.
     * To report an API doc bug,
       [create an SDK issue](https://github.com/dart-lang/sdk/issues/new?title=API%20doc%20issue:).
-  * Contribute to the Dart developer websites such as [www.dartlang.org](https://www.dartlang.org) (repo: [dart-lang/site-www](https://github.com/dart-lang/site-www)) and [webdev.dartlang.org](https://webdev.dartlang.org) (repo: [dart-lang/site-webdev](https://github.com/dart-lang/site-webdev)). For more information, see [Writing for *.dartlang.org](https://github.com/dart-lang/site-www/wiki/Writing-for-dartlang.org).
+  * Contribute to the Dart developer websites such as [www.dartlang.org](https://www.dartlang.org) (repo: [dart-lang/site-www](https://github.com/dart-lang/site-www)) and [webdev.dartlang.org](https://webdev.dartlang.org) (repo: [dart-lang/site-webdev](https://github.com/dart-lang/site-webdev)). For more information, see [Writing for Dart and Flutter websites](https://github.com/dart-lang/site-shared/wiki/Writing-for-Dart-and-Flutter-websites).
   * Improve the API reference docs at [api.dartlang.org](https://api.dartlang.org) by editing doc comments in the [Dart SDK repo](https://github.com/dart-lang/sdk/tree/master/sdk/lib). For more information on how to write API docs, see [Effective Dart: Documentation](https://www.dartlang.org/guides/language/effective-dart/documentation).
 
 ## Before you contribute
diff --git a/DEPS b/DEPS
index 5323847..ae2451a 100644
--- a/DEPS
+++ b/DEPS
@@ -36,26 +36,28 @@
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  "co19_2_rev": "77825446f59893bb2b20f2e9517a4567e0371193",
+  "co19_2_rev": "9c03cd19b61a9307db192f174a7e7a1ec6759bb2",
 
-  # As Flutter does, we pull buildtools, including the clang toolchain, from
-  # Fuchsia. This revision should be kept up to date with the revision pulled
-  # by the Flutter engine. If there are problems with the toolchain, contact
-  # fuchsia-toolchain@.
-  "buildtools_revision": "446d5b1019dcbe7835236dc85261e91cf29a9239",
+  # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
+  # should be kept up to date with the revisions pulled by the Flutter engine.
+  # The list of revisions for these tools comes from Fuchsia, here:
+  # https://fuchsia.googlesource.com/buildtools/+/master/fuchsia.ensure
+  # If there are problems with the toolchain, contact fuchsia-toolchain@.
+  "clang_revision": "de39621f0f03f20633bdfa50bde97a3908bf6e98",
+  "gn_revision": "bdb0fd02324b120cacde634a9235405061c8ea06",
 
   # Scripts that make 'git cl format' work.
   "clang_format_scripts_rev": "c09c8deeac31f05bd801995c475e7c8070f9ecda",
 
-  "gperftools_revision": "9608fa3bcf8020d35f59fbf70cd3cbe4b015b972",
+  "gperftools_revision": "e9ab4c53041ac62feefbbb076d326e9a77dd1567",
 
   # Revisions of /third_party/* dependencies.
   "args_tag": "1.4.4",
   "async_tag": "2.0.8",
   "bazel_worker_tag": "0.1.14",
   "boolean_selector_tag" : "1.0.4",
-  "boringssl_gen_rev": "fc47eaa1a245d858bae462cd64d4155605b850ea",
-  "boringssl_rev" : "189270cd190267f5bd60cfe8f8ce7a61d07ba6f4",
+  "boringssl_gen_rev": "bbf52f18f425e29b1185f2f6753bec02ed8c5880",
+  "boringssl_rev" : "702e2b6d3831486535e958f262a05c75a5cb312e",
   "charcode_tag": "v1.1.2",
   "chrome_rev" : "19997",
   "cli_util_rev" : "4ad7ccbe3195fd2583b30f86a86697ef61e80f41",
@@ -63,7 +65,7 @@
   "convert_tag": "2.0.2",
   "crypto_tag" : "2.0.6",
   "csslib_tag" : "0.14.4+1",
-  "dart2js_info_tag" : "0.5.13",
+  "dart2js_info_tag" : "0.5.15",
 
   # Note: updates to dart_style have to be coordinated carefully with
   # the infrastructure-team so that the internal formatter in
@@ -77,11 +79,11 @@
   #     minutes later.
   #
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
-  "dart_style_tag": "1.2.0",  # Please see the note above before updating.
+  "dart_style_tag": "1.2.2",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "v0.24.1",
+  "dartdoc_tag" : "v0.27.0",
   "file_rev": "515ed1dd48740ab14b625de1be464cb2bca4fefd",  # 5.0.6
-  "fixnum_tag": "0.10.8",
+  "fixnum_tag": "0.10.9",
   "func_rev": "25eec48146a58967d75330075ab376b3838b18a8",
   "glob_tag": "1.1.7",
   "html_tag" : "0.13.3+2",
@@ -95,7 +97,7 @@
   "intl_tag": "0.15.7",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.9",
-  "linter_tag": "0.1.71",
+  "linter_tag": "0.1.78",
   "logging_tag": "0.11.3+2",
   "markdown_tag": "2.0.2",
   "matcher_tag": "0.12.3",
@@ -134,12 +136,11 @@
   "term_glyph_tag": "1.0.1",
   "test_reflective_loader_tag": "0.1.8",
   "test_tag": "1.3.4",
-  "tuple_tag": "v1.0.1",
   "typed_data_tag": "1.1.6",
   "unittest_rev": "2b8375bc98bb9dc81c539c91aaea6adce12e1072",
   "usage_tag": "3.4.0",
   "utf_tag": "0.9.0+5",
-  "watcher_rev": "0.9.7+10",
+  "watcher_rev": "0.9.7+12",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_tag": "1.0.9",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
@@ -152,34 +153,32 @@
 
 deps = {
   # Stuff needed for GN build.
-  Var("dart_root") + "/buildtools":
-     Var("fuchsia_git") + "/buildtools" + "@" + Var("buildtools_revision"),
   Var("dart_root") + "/buildtools/clang_format/script":
     Var("chromium_git") + "/chromium/llvm-project/cfe/tools/clang-format.git" +
     "@" + Var("clang_format_scripts_rev"),
 
   Var("dart_root") + "/tools/sdks": {
-      "packages": [
-          {
-              "package": "dart/dart-sdk/${{platform}}",
-              "version": "version:2.1.0-dev.6.0",
-          },
-      ],
+      "packages": [{
+          "package": "dart/dart-sdk/${{platform}}",
+          "version": "version:2.1.1-dev.1.0",
+      }],
       "dep_type": "cipd",
   },
   Var("dart_root") + "/third_party/d8": {
-      "packages": [
-          {
-              "package": "dart/d8",
-              "version": "version:6.9.427.23+1",
-          },
-      ],
+      "packages": [{
+          "package": "dart/d8",
+          "version": "version:6.9.427.23+1",
+      }],
       "dep_type": "cipd",
   },
 
-  Var("dart_root") + "/tests/co19_2/src":
-      Var("chromium_git") + "/external/github.com/dart-lang/co19.git" +
-      "@" + Var("co19_2_rev"),
+  Var("dart_root") + "/tests/co19_2/src": {
+      "packages": [{
+          "package": "dart/third_party/co19",
+          "version": "git_revision:" + Var("co19_2_rev"),
+      }],
+      "dep_type": "cipd",
+  },
 
   Var("dart_root") + "/third_party/zlib":
       Var("chromium_git") + "/chromium/src/third_party/zlib.git" +
@@ -191,6 +190,14 @@
       "https://boringssl.googlesource.com/boringssl.git" +
       "@" + Var("boringssl_rev"),
 
+  Var("dart_root") + "/third_party/gsutil": {
+      "packages": [{
+          "package": "infra/gsutil",
+          "version": "version:4.34",
+      }],
+      "dep_type": "cipd",
+  },
+
   Var("dart_root") + "/third_party/root_certificates":
       Var("dart_git") + "root_certificates.git" +
       "@" + Var("root_certificates_rev"),
@@ -355,8 +362,6 @@
   Var("dart_root") + "/third_party/pkg/test_reflective_loader":
       Var("dart_git") + "test_reflective_loader.git" +
       "@" + Var("test_reflective_loader_tag"),
-  Var("dart_root") + "/third_party/pkg/tuple":
-      Var("dart_git") + "tuple.git" + "@" + Var("tuple_tag"),
   Var("dart_root") + "/third_party/pkg/typed_data":
       Var("dart_git") + "typed_data.git" + "@" + Var("typed_data_tag"),
   # Unittest is an early version, 0.11.x, of the package "test"
@@ -379,6 +384,27 @@
       "@" + Var("web_socket_channel_tag"),
   Var("dart_root") + "/third_party/pkg/yaml":
       Var("dart_git") + "yaml.git" + "@" + Var("yaml_tag"),
+
+  Var("dart_root") + "/buildtools/" + Var("host_os") + "-" + Var("host_cpu") + "/clang": {
+      "packages": [
+          {
+              "package": "fuchsia/clang/${{platform}}",
+              "version": "git_revision:" + Var("clang_revision"),
+          },
+      ],
+      "condition": "(host_os == 'linux' or host_os == 'mac') and (host_cpu == 'x64' or host_cpu == 'arm64')",
+      "dep_type": "cipd",
+  },
+
+  Var("dart_root") + "/buildtools": {
+      "packages": [
+          {
+              "package": "gn/gn/${{platform}}",
+              "version": "git_revision:" + Var("gn_revision"),
+          },
+      ],
+      "dep_type": "cipd",
+  },
 }
 
 deps_os = {
@@ -433,20 +459,6 @@
     ],
   },
   {
-    "name": "gsutil",
-    "pattern": ".",
-    "action": [
-      "download_from_google_storage",
-      "--no_auth",
-      "--no_resume",
-      "--bucket",
-      "dart-dependencies",
-      "--extract",
-      "-s",
-      Var('dart_root') + "/third_party/gsutil.tar.gz.sha1",
-    ],
-  },
-  {
     # Pull Debian wheezy sysroot for i386 Linux
     'name': 'sysroot_i386',
     'pattern': '.',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 57b7bfa..f7291e8 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -168,15 +168,40 @@
         'DEPS file must have only dependencies from allowed hosts.',
         long_text=error.output)]
 
+def _CheckLayering(input_api, output_api):
+  """Run VM layering check.
+
+  This check validates that sources from one layer do not reference sources
+  from another layer accidentally.
+  """
+  # Run only if .cc or .h file was modified.
+  def is_cpp_file(path):
+    return path.endswith('.cc') or path.endswith('.h')
+  if all(not is_cpp_file(f.LocalPath()) for f in input_api.AffectedFiles()):
+    return []
+
+  local_root = input_api.change.RepositoryRoot()
+  layering_check = imp.load_source('layering_check',
+      os.path.join(local_root, 'runtime', 'tools', 'layering_check.py'))
+  errors = layering_check.DoCheck(local_root)
+  if errors:
+    return [output_api.PresubmitError(
+        'Layering check violation for C++ sources.',
+        long_text='\n'.join(errors))]
+  else:
+    return []
+
 
 def CheckChangeOnCommit(input_api, output_api):
   return (_CheckValidHostsInDEPS(input_api, output_api) +
           _CheckBuildStatus(input_api, output_api) +
           _CheckDartFormat(input_api, output_api) +
-          _CheckStatusFiles(input_api, output_api))
+          _CheckStatusFiles(input_api, output_api) +
+          _CheckLayering(input_api, output_api))
 
 
 def CheckChangeOnUpload(input_api, output_api):
   return (_CheckValidHostsInDEPS(input_api, output_api) +
           _CheckDartFormat(input_api, output_api) +
-          _CheckStatusFiles(input_api, output_api))
+          _CheckStatusFiles(input_api, output_api) +
+          _CheckLayering(input_api, output_api))
diff --git a/WATCHLISTS b/WATCHLISTS
index 5bd5095..598f0ab 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -65,10 +65,15 @@
     'runtime': {
       'filepath': '^runtime/',
     },
+    'vm_compiler': {
+      'filepath': '^runtime/(vm|docs)/compiler/',
+    },
   },
 
   'WATCHLISTS': {
     'build': [ 'zra@google.com', 'keertip@google.com' ],
+    'dart2js': [ 'johnniwinther@google.com', 'sigmund@google.com',
+                 'sra@google.com'],
     'front_end': [ 'dart-fe-team+reviews@google.com' ],
     'http': [ 'zra@google.com' ],
     'kernel': [ 'karlklose@google.com', 'jensj@google.com', 'kmillikin@google.com',
@@ -78,7 +83,6 @@
     'observatory': [ 'rmacnak@google.com' ],
     'package_vm': [ 'alexmarkov@google.com' ],
     'runtime': [ 'vm-dev@dartlang.org' ],
-    'dart2js': [ 'johnniwinther@google.com', 'sigmund@google.com',
-                 'sra@google.com'],
+    'vm_compiler': [ 'dart-vm-compiler-team+reviews@google.com' ],
   },
 }
diff --git a/build/config/android/BUILD.gn b/build/config/android/BUILD.gn
index 0cc38b7..c8c978a 100644
--- a/build/config/android/BUILD.gn
+++ b/build/config/android/BUILD.gn
@@ -8,7 +8,9 @@
 config("sdk") {
   if (sysroot != "") {
     cflags = [ "--sysroot=" + sysroot ]
-    ldflags = [ "--sysroot=" + sysroot ]
+    ldflags = [
+      "--sysroot=" + rebase_path("$android_ndk_root/$android_sysroot_subdir"),
+    ]
 
     # Need to get some linker flags out of the sysroot.
     sysroot_ld_path = rebase_path("//build/config/linux/sysroot_ld_path.py")
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index a6dcf78..38e3f8e 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -63,18 +63,16 @@
   # Subdirectories inside android_ndk_root that contain the sysroot for the
   # associated platform.
   if (current_cpu == "x64" || current_cpu == "arm64") {
-    _android_api_level = 22
+    android_api_level = 22
   } else {
-    _android_api_level = 16
+    android_api_level = 16
   }
-  x86_android_sysroot_subdir =
-      "platforms/android-${_android_api_level}/arch-x86"
-  arm_android_sysroot_subdir =
-      "platforms/android-${_android_api_level}/arch-arm"
+  x86_android_sysroot_subdir = "platforms/android-${android_api_level}/arch-x86"
+  arm_android_sysroot_subdir = "platforms/android-${android_api_level}/arch-arm"
   x86_64_android_sysroot_subdir =
-      "platforms/android-${_android_api_level}/arch-x86_64"
+      "platforms/android-${android_api_level}/arch-x86_64"
   arm64_android_sysroot_subdir =
-      "platforms/android-${_android_api_level}/arch-arm64"
+      "platforms/android-${android_api_level}/arch-arm64"
 
   # Toolchain root directory for each build. The actual binaries are inside
   # a "bin" directory inside of these.
@@ -90,25 +88,29 @@
   # like the toolchain roots.
   if (current_cpu == "x86") {
     android_prebuilt_arch = "android-x86"
-    _binary_prefix = "i686-linux-android"
+    android_target_triple = "i686-linux-android"
     android_toolchain_root = "$x86_android_toolchain_root"
+    android_sysroot_subdir = "$x86_android_sysroot_subdir"
   } else if (current_cpu == "arm") {
     android_prebuilt_arch = "android-arm"
-    _binary_prefix = "arm-linux-androideabi"
+    android_target_triple = "arm-linux-androideabi"
     android_toolchain_root = "$arm_android_toolchain_root"
+    android_sysroot_subdir = "$arm_android_sysroot_subdir"
   } else if (current_cpu == "x64") {
     android_prebuilt_arch = "android-x86_64"
-    _binary_prefix = "x86_64-linux-android"
+    android_target_triple = "x86_64-linux-android"
     android_toolchain_root = "$x86_64_android_toolchain_root"
+    android_sysroot_subdir = "$x86_64_android_sysroot_subdir"
   } else if (current_cpu == "arm64") {
     android_prebuilt_arch = "android-arm64"
-    _binary_prefix = "aarch64-linux-android"
+    android_target_triple = "aarch64-linux-android"
     android_toolchain_root = "$arm64_android_toolchain_root"
+    android_sysroot_subdir = "$arm64_android_sysroot_subdir"
   } else {
     assert(false, "Need android libgcc support for your target arch.")
   }
 
-  android_tool_prefix = "$android_toolchain_root/bin/$_binary_prefix-"
+  android_tool_prefix = "$android_toolchain_root/bin/$android_target_triple-"
   android_readelf = "${android_tool_prefix}readelf"
   android_objcopy = "${android_tool_prefix}objcopy"
   android_gdbserver =
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 8025521..6edb3b3 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -246,11 +246,14 @@
     ldflags += [ "-pthread" ]
     if (is_clang) {
       if (current_cpu == "arm") {
-        cflags += [ "--target=arm-linux-gnueabihf" ]
-        ldflags += [ "--target=arm-linux-gnueabihf" ]
+        cflags += [ "--target=armv7-linux-gnueabihf" ]
+        ldflags += [ "--target=armv7-linux-gnueabihf" ]
       } else if (current_cpu == "arm64") {
         cflags += [ "--target=aarch64-linux-gnu" ]
         ldflags += [ "--target=aarch64-linux-gnu" ]
+      } else if (current_cpu == "x86") {
+        cflags += [ "--target=i386-linux-gnu" ]
+        ldflags += [ "--target=i386-linux-gnu" ]
       }
     }
   }
@@ -261,12 +264,13 @@
     cflags += [ "-fcolor-diagnostics" ]
   }
 
-  # C++14 compiler flags setup.
+  # C++11 compiler flags setup.
   # ---------------------------
   if (is_win) {
+    # Up-to-date toolchain MSVC doesn't support c++11 flag any longer.
     cc_std = [ "/std:c++14" ]
   } else {
-    cc_std = [ "-std=c++14" ]
+    cc_std = [ "-std=c++11" ]
   }
   cflags_cc += cc_std
   cflags_objcc += cc_std
@@ -278,6 +282,7 @@
       "-ffunction-sections",
       "-funwind-tables",
       "-fno-short-enums",
+      "-nostdinc++",
     ]
     if (!is_clang) {
       # Clang doesn't support these flags.
@@ -444,14 +449,17 @@
     # strange errors. The include ordering here is important; change with
     # caution.
     cflags += [
-      "-isystem" +
-          rebase_path("$android_libcpp_root/libcxx/include", root_build_dir),
+      "-isystem" + rebase_path("$android_libcpp_root/include", root_build_dir),
       "-isystem" + rebase_path(
-              "$android_ndk_root/sources/cxx-stl/llvm-libc++abi/libcxxabi/include",
+              "$android_ndk_root/sources/cxx-stl/llvm-libc++abi/include",
               root_build_dir),
       "-isystem" +
           rebase_path("$android_ndk_root/sources/android/support/include",
                       root_build_dir),
+      "-isystem" + rebase_path(
+              "$android_ndk_root/sysroot/usr/include/$android_target_triple",
+              root_build_dir),
+      "-D__ANDROID_API__=$android_api_level",
     ]
 
     lib_dirs += [ "$android_libcpp_root/libs/$android_app_abi" ]
@@ -459,9 +467,12 @@
     libs += [
       "$android_libcpp_library",
       "c++abi",
-      "android_support",
     ]
 
+    if (android_api_level < 21) {
+      libs += [ "android_support" ]
+    }
+
     if (current_cpu == "arm") {
       libs += [ "unwind" ]
     }
@@ -692,7 +703,7 @@
       "-Wl,--gc-sections",
     ]
 
-    if (is_clang) {
+    if (is_clang && !using_sanitizer) {
       # Identical code folding to reduce size.
       # Warning: This changes C/C++ semantics of function pointer comparison.
       common_optimize_on_ldflags += [ "-Wl,--icf=all" ]
diff --git a/build/config/sysroot.gni b/build/config/sysroot.gni
index a4364ac..52a1b83 100644
--- a/build/config/sysroot.gni
+++ b/build/config/sysroot.gni
@@ -33,17 +33,7 @@
   sysroot = target_sysroot
 } else if (is_android) {
   import("//build/config/android/config.gni")
-  if (current_cpu == "x86") {
-    sysroot = rebase_path("$android_ndk_root/$x86_android_sysroot_subdir", root_build_dir)
-  } else if (current_cpu == "arm") {
-    sysroot = rebase_path("$android_ndk_root/$arm_android_sysroot_subdir", root_build_dir)
-  } else if (current_cpu == "x64") {
-    sysroot = rebase_path("$android_ndk_root/$x86_64_android_sysroot_subdir", root_build_dir)
-  } else if (current_cpu == "arm64") {
-    sysroot = rebase_path("$android_ndk_root/$arm64_android_sysroot_subdir", root_build_dir)
-  } else {
-    sysroot = ""
-  }
+  sysroot = rebase_path("$android_ndk_root/sysroot")
 } else if (is_mac) {
   import("//build/config/mac/mac_sdk.gni")
   sysroot = mac_sdk_path
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index cfc2f50..32eb669 100644
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -21,6 +21,7 @@
 import stat
 import subprocess
 import sys
+
 from gn_helpers import ToGNString
 
 
@@ -63,9 +64,14 @@
       win_sdk = toolchain_data['win8sdk']
     wdk = toolchain_data['wdk']
     # TODO(scottmg): The order unfortunately matters in these. They should be
-    # split into separate keys for x86 and x64. (See CopyDlls call below).
+    # split into separate keys for x64/x86/arm64. (See CopyDlls call below).
     # http://crbug.com/345992
     vs_runtime_dll_dirs = toolchain_data['runtime_dirs']
+    # The number of runtime_dirs in the toolchain_data was two (x64/x86) but
+    # changed to three (x64/x86/arm64) and this code needs to handle both
+    # possibilities, which can change independently from this code.
+    if len(vs_runtime_dll_dirs) == 2:
+      vs_runtime_dll_dirs.append('Arm64Unused')
 
     os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain
     os.environ['GYP_MSVS_VERSION'] = version
@@ -87,9 +93,12 @@
     # directory ensures that they are available when needed.
     bitness = platform.architecture()[0]
     # When running 64-bit python the x64 DLLs will be in System32
+    # ARM64 binaries will not be available in the system directories because we
+    # don't build on ARM64 machines.
     x64_path = 'System32' if bitness == '64bit' else 'Sysnative'
     x64_path = os.path.join(os.path.expandvars('%windir%'), x64_path)
-    vs_runtime_dll_dirs = [x64_path, os.path.expandvars('%windir%/SysWOW64')]
+    vs_runtime_dll_dirs = [x64_path, os.path.expandvars('%windir%/SysWOW64'),
+                           'Arm64Unused']
 
   return vs_runtime_dll_dirs
 
@@ -141,7 +150,6 @@
     raise Exception(('Visual Studio version %s (from GYP_MSVS_VERSION)'
                      ' not supported. Supported versions are: %s') % (
                        version_as_year, ', '.join(year_to_version.keys())))
-  version = year_to_version[version_as_year]
   if version_as_year == '2017':
     # The VC++ 2017 install location needs to be located using COM instead of
     # the registry. For details see:
@@ -201,16 +209,21 @@
       os.environ.get('WINDOWSSDKDIR',
                      os.path.expandvars('%ProgramFiles(x86)%'
                                         '\\Windows Kits\\10')))
-  ucrt_dll_dirs = os.path.join(win_sdk_dir, 'Redist', 'ucrt', 'DLLs',
-                               target_cpu)
-  ucrt_files = glob.glob(os.path.join(ucrt_dll_dirs, 'api-ms-win-*.dll'))
-  assert len(ucrt_files) > 0
-  for ucrt_src_file in ucrt_files:
-    file_part = os.path.basename(ucrt_src_file)
-    ucrt_dst_file = os.path.join(target_dir, file_part)
-    _CopyRuntimeImpl(ucrt_dst_file, ucrt_src_file, False)
-  _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix),
-                    os.path.join(source_dir, 'ucrtbase' + suffix))
+  # ARM64 doesn't have a redist for the ucrt DLLs because they are always
+  # present in the OS.
+  if target_cpu != 'arm64':
+    ucrt_dll_dirs = os.path.join(win_sdk_dir, 'Redist', 'ucrt', 'DLLs',
+                                 target_cpu)
+    ucrt_files = glob.glob(os.path.join(ucrt_dll_dirs, 'api-ms-win-*.dll'))
+    assert len(ucrt_files) > 0
+    for ucrt_src_file in ucrt_files:
+      file_part = os.path.basename(ucrt_src_file)
+      ucrt_dst_file = os.path.join(target_dir, file_part)
+      _CopyRuntimeImpl(ucrt_dst_file, ucrt_src_file, False)
+  # We must copy ucrtbase.dll for x64/x86, and ucrtbased.dll for all CPU types.
+  if target_cpu != 'arm64' or not suffix.startswith('.'):
+    _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix),
+                     os.path.join(source_dir, 'ucrtbase' + suffix))
 
 
 def FindVCToolsRoot():
@@ -249,6 +262,7 @@
     # from HostX86/x86.
     pgo_x86_runtime_dir = os.path.join(pgo_runtime_root, 'HostX86', 'x86')
     pgo_x64_runtime_dir = os.path.join(pgo_runtime_root, 'HostX64', 'x64')
+    pgo_arm64_runtime_dir = os.path.join(pgo_runtime_root, 'arm64')
   else:
     raise Exception('Unexpected toolchain version: %s.' % env_version)
 
@@ -261,8 +275,10 @@
       source = os.path.join(pgo_x86_runtime_dir, runtime)
     elif target_cpu == 'x64':
       source = os.path.join(pgo_x64_runtime_dir, runtime)
+    elif target_cpu == 'arm64':
+      source = os.path.join(pgo_arm64_runtime_dir, runtime)
     else:
-      raise NotImplementedError("Unexpected target_cpu value: " + target_cpu)
+      raise NotImplementedError('Unexpected target_cpu value: ' + target_cpu)
     if not os.path.exists(source):
       raise Exception('Unable to find %s.' % source)
     _CopyRuntimeImpl(os.path.join(target_dir, runtime), source)
@@ -271,7 +287,7 @@
 def _CopyRuntime(target_dir, source_dir, target_cpu, debug):
   """Copy the VS runtime DLLs, only if the target doesn't exist, but the target
   directory does exist. Handles VS 2015 and VS 2017."""
-  suffix = "d.dll" if debug else ".dll"
+  suffix = 'd.dll' if debug else '.dll'
   # VS 2017 uses the same CRT DLLs as VS 2015.
   _CopyUCRTRuntime(target_dir, source_dir, target_cpu, '%s140' + suffix,
                     suffix)
@@ -290,8 +306,15 @@
   if not vs_runtime_dll_dirs:
     return
 
-  x64_runtime, x86_runtime = vs_runtime_dll_dirs
-  runtime_dir = x64_runtime if target_cpu == 'x64' else x86_runtime
+  x64_runtime, x86_runtime, arm64_runtime = vs_runtime_dll_dirs
+  if target_cpu == 'x64':
+    runtime_dir = x64_runtime
+  elif target_cpu == 'x86':
+    runtime_dir = x86_runtime
+  elif target_cpu == 'arm64':
+    runtime_dir = arm64_runtime
+  else:
+    raise Exception('Unknown target_cpu: ' + target_cpu)
   _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=False)
   if configuration == 'Debug':
     _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=True)
@@ -424,7 +447,7 @@
 
 
 def NormalizePath(path):
-  while path.endswith("\\"):
+  while path.endswith('\\'):
     path = path[:-1]
   return path
 
@@ -476,4 +499,4 @@
 
 
 if __name__ == '__main__':
-  sys.exit(main())
\ No newline at end of file
+  sys.exit(main())
diff --git a/docs/language/.gitignore b/docs/language/.gitignore
index 13c7614..8c6cc1f 100644
--- a/docs/language/.gitignore
+++ b/docs/language/.gitignore
@@ -1,4 +1,7 @@
 dartLangSpec*.aux
+dartLangSpec*.idx
+dartLangSpec*.ilg
+dartLangSpec*.ind
 dartLangSpec*.log
 dartLangSpec*.out
 dartLangSpec*.pdf
diff --git a/docs/language/Makefile b/docs/language/Makefile
index 4819c23..1bdd95a 100644
--- a/docs/language/Makefile
+++ b/docs/language/Makefile
@@ -6,21 +6,25 @@
 
 pdf:
 	pdflatex $(SPEC)
+	makeindex $(NAME).idx
 	pdflatex $(SPEC)
 	pdflatex $(SPEC)
 
 pdfhash: hash_and_list
 	pdflatex $(HASH)
+	makeindex $(NAME)-hash.idx
 	pdflatex $(HASH)
 	pdflatex $(HASH)
 
 dvi:
 	latex $(SPEC)
+	makeindex $(NAME).idx
 	latex $(SPEC)
 	latex $(SPEC)
 
 dvihash: hash_and_list
 	latex $(HASH)
+	makeindex $(NAME)-hash.idx
 	latex $(HASH)
 	latex $(HASH)
 
@@ -39,4 +43,3 @@
 
 clean: cleanish
 	rm -f *.dvi *.pdf $(HASH) $(LIST)
- 
diff --git a/docs/language/dart.sty b/docs/language/dart.sty
index d6c265d..0776ec0 100644
--- a/docs/language/dart.sty
+++ b/docs/language/dart.sty
@@ -78,31 +78,50 @@
 
 % Used as line break in the right hand side of a grammar
 % alternative, that is, when starting a "continuation line".
-\newcommand{\gnewline}{\\\mbox{}\qquad{}}
+\newcommand{\gnewline}{\leavevmode\\}
 
 % Metavariables for argument lists.
 \newcommand{\argumentList}[1]{\metavar{{#1}s}}
 \newcommand{\parameterList}[1]{\metavar{{#1}s}}
 
-\newenvironment{Q}[1]{{\bf #1}}{}
-\newenvironment{rationale}[1]{{\it #1}}{}
-\newenvironment{commentary}[1]{{\sf #1}}{}
+% Colors used for for different kinds of text.
+\definecolor{normativeColor}{rgb}{0,0,0}
+\definecolor{commentaryColor}{rgb}{0.5,0.5,0.5}
+\definecolor{rationaleColor}{rgb}{0.5,0.5,0.5}
 
+% Environments for different kinds of text.
+\newenvironment{Q}[1]{{\bf{}Upcoming: {#1}}}{}
+\newenvironment{rationale}[1]{{\color{rationaleColor}\it{#1}}}{}
+\newenvironment{commentary}[1]{{\color{commentaryColor}\sf{#1}}}{}
+
+% Auxiliary functions.
 \newcommand{\flatten}[1]{\ensuremath{\mbox{\it flatten}({#1})}}
+\newcommand{\basetype}[1]{\ensuremath{\mbox{\it basetype}({#1})}}
+\newcommand{\overrides}[1]{\ensuremath{\mbox{\it overrides}({#1})}}
+\newcommand{\inherited}[1]{\ensuremath{\mbox{\it inherited}({#1})}}
 
 % Used as a mini-section marker, indicating visibly that a range of
 % text (usually just a couple of paragraphs) are concerned with one
 % specific topic in a list of similar topics (like many forms of
 % expressions of a similar nature).
 \newcommand{\Case}[1]{\textbf{Case }$\langle\hspace{0.1em}${#1}$\hspace{0.1em}\rangle$\textbf{.}}
+\newcommand{\EndCase}{\mbox{}\hfill$\scriptscriptstyle\Box$\xspace}
 
 \newenvironment{dartCode}[1][!ht] {
   \def\@programcr{\@addfield\strut}%
   \let\\=\@programcr%
   \relax\@vobeyspaces\obeylines%
-  \ttfamily%
+  \ttfamily\color{commentaryColor}%
   \vspace{1em}
-}{\vspace{1em}}
+}{\normalcolor\vspace{1em}}
+
+\newenvironment{normativeDartCode}[1][!ht] {
+  \def\@programcr{\@addfield\strut}%
+  \let\\=\@programcr%
+  \relax\@vobeyspaces\obeylines%
+  \ttfamily\color{normativeColor}%
+  \vspace{1em}
+}{\normalcolor\vspace{1em}}
 
 % Used for comments in a code context.
 \def\comment#1{\textsf{#1}}
@@ -110,6 +129,182 @@
 % A commonly used name for an identifier
 \newcommand{\id}{\metavar{id}}
 
+% Used for defining occurrence of phrase, with customized index entry.
+\newcommand{\IndexCustom}[2]{%
+  \leavevmode\marginpar{\ensuremath{\diamond}}\emph{#1}\index{#2}}
+
+% Used for a defining occurrence of a phrase, adding it to the index.
+\newcommand{\Index}[1]{\IndexCustom{#1}{#1}}
+
+% Same appearance, but not adding an entry to the index.
+\newcommand{\NoIndex}[1]{
+  \leavevmode\marginpar{\ensuremath{\diamond}}\emph{#1}}
+
+% Used to specify comma separated lists of similar symbols.
+\newcommand{\List}[3]{\ensuremath{{#1}_{#2},\,\ldots,\ {#1}_{#3}}}
+
+% Used to specify comma separated lists of pairs of similar symbols,
+% as needed, e.g., for declarations of formal parameters.
+% Parameters: Name of first part of pair, name of second part,
+% index at start, index at end.
+\newcommand{\PairList}[4]{\ensuremath{%
+  {#1}_{#3}\ {#2}_{#3},\,\ldots,\ {#1}_{#4}\ {#2}_{#4}}}
+
+% Used to specify comma separated lists of triples of similar symbols,
+% as needed, e.g., for declarations of formal parameters with defaults.
+% Parameters: Name of first part of triple, name of second part,
+% name of third part, index at start, index at end.
+\newcommand{\TripleList}[5]{\ensuremath{%
+  {#1}_{#4}\ {#2}_{#4}\ {#3}_{#4},\,\ldots,\ {#1}_{#5}\ {#2}_{#5}\ {#3}_{#5}}}
+
+% Used to abbreviate \EXTENDS{} in function types.
+\newcommand{\FunctionTypeExtends}{\ensuremath{\triangleleft}}
+
+% Used to specify comma separated lists of pairs of symbols
+% separated by \EXTENDS{}, as needed for type parameter declarations.
+% Parameters: Type parameter name, bound name, number of type parameters.
+\newcommand{\TypeParameters}[3]{\ensuremath{%
+  {#1}_1\,\EXTENDS\,{#2}_1,\,\ldots,\ %
+  {#1}_{#3}\,\EXTENDS\,{#2}_{#3}}}
+
+% Used to specify comma separated lists of symbols followed by
+% \EXTENDS{}, as needed for type parameter declarations where we do
+% not intend to refer explicitly to the bounds.
+% Parameters: Type parameter name, number of type parameters.
+\newcommand{\TypeParametersNoBounds}[2]{\ensuremath{%
+  {#1}_1\,\EXTENDS\,\ldots,\ \ldots,\ {#1}_{#2}\,\EXTENDS\,\ldots}}
+
+% For consistency, we may as well use this whenever possible.
+\newcommand{\TypeParametersStd}{\TypeParameters{X}{B}{s}}
+
+% Used to specify comma separated lists of pairs of symbols
+% separated by \EXTENDS{}, as needed for type parameter declarations.
+% Parameters: Type parameter name, bound name, number of type parameters.
+\newcommand{\FTTypeParameters}[3]{\ensuremath{%
+  {#1}_1\FunctionTypeExtends{#2}_1,\,\ldots,\ %
+  {#1}_{#3}\FunctionTypeExtends{#2}_{#3}}}
+
+% Used to specify non-generic function types: Same syntax as in source.
+% Arguments: Return type, formal parameter declarations.
+\newcommand{\FunctionTypeSimple}[2]{\code{\ensuremath{#1}\ \FUNCTION({#2})}}
+
+% Used to specify function types: Same syntax as in source.
+% Arguments: Return type, spacer, type parameter name, bound name,
+%   number of type parameters, formal parameter declarations.
+\newcommand{\FunctionType}[6]{\leavevmode\par\noindent\code{%
+  \ensuremath{#1}{#2}\FUNCTION<\FTTypeParameters{#3}{#4}{#5}>({#6})}}
+
+% Same as \FunctionType except suitable for inline usage, hence omitting
+% the spacer argument.
+\newcommand{\RawFunctionType}[5]{\code{%
+  \ensuremath{#1}\ \FUNCTION<\FTTypeParameters{#2}{#3}{#4}>({#5})}}
+
+% Used to specify function type parameter lists with positional optionals.
+% Arguments: Parameter type, number of required parameters,
+% number of optional parameters.
+\newcommand{\FunctionTypePositionalArguments}[3]{%
+  \List{#1}{1}{#2},\ [\List{#1}{{#2}+1}{{#2}+{#3}}]}
+
+\newcommand{\FunctionTypePositionalArgumentsStd}{%
+  \FunctionTypePositionalArguments{T}{n}{k}}
+
+% Used to specify function types with positional optionals:
+% Arguments: Return type, spacer, type parameter name, bound name,
+%   number of type parameters, parameter type, number of required parameters,
+%   number of optional parameters.
+\newcommand{\FunctionTypePositional}[8]{%
+  \FunctionType{#1}{#2}{#3}{#4}{#5}{%
+    \FunctionTypePositionalArguments{#6}{#7}{#8}}}
+
+% Same as \FunctionTypePositional except suitable for inline usage,
+% hence omitting the spacer argument.
+\newcommand{\RawFunctionTypePositional}[7]{%
+  \RawFunctionType{#1}{#2}{#3}{#4}{%
+    \FunctionTypePositionalArguments{#5}{#6}{#7}}}
+
+% Used to specify function type parameter lists with named optionals.
+% Arguments: Parameter type, number of required parameters,
+% name of optional parameters, number of optional parameters.
+\newcommand{\FunctionTypeNamedArguments}[4]{%
+  \List{#1}{1}{#2},\ \{\PairList{#1}{#3}{{#2}+1}{{#2}+{#4}}\}}
+  
+\newcommand{\FunctionTypeNamedArgumentsStd}{%
+  \FunctionTypeNamedArguments{T}{n}{x}{k}}
+
+% Used to specify function types with named parameters:
+% Arguments: Return type, spacer, type parameter name, bound name,
+%   number of type parameters, parameter type, number of required parameters,
+%   name of optional parameters, number of optional parameters.
+\newcommand{\FunctionTypeNamed}[9]{%
+  \FunctionType{#1}{#2}{#3}{#4}{#5}{%
+    \FunctionTypePositionalArguments{#6}{#7}{#8}{#9}}}
+
+% Same as \FunctionType except suitable for inline usage, hence omitting
+% the spacer argument.
+\newcommand{\RawFunctionTypeNamed}[8]{%
+  \RawFunctionType{#1}{#2}{#3}{#4}{%
+    \FunctionTypePositionalArguments{#5}{#6}{#7}{#8}}}
+
+% Used to specify function types with no optional parameters:
+% Arguments: Return type, spacer, type parameter name, bound name,
+%   number of type parameters, parameter type,
+%   number of parameters (all required).
+\newcommand{\FunctionTypeAllRequired}[7]{%
+  \FunctionType{#1}{#2}{#3}{#4}{#5}{\List{#6}{1}{#7}}}
+
+\newcommand{\FunctionTypePositionalStd}[1]{%
+  \FunctionTypePositional{#1}{ }{X}{B}{s}{T}{n}{k}}
+
+\newcommand{\RawFunctionTypePositionalStd}[1]{%
+  \RawFunctionTypePositional{#1}{X}{B}{s}{T}{n}{k}}
+
+\newcommand{\FunctionTypeNamedStd}[1]{%
+  \FunctionTypeNamed{#1}{ }{X}{B}{s}{T}{n}{x}{k}}
+
+\newcommand{\RawFunctionTypeNamedStd}[1]{%
+  \RawFunctionTypeNamed{#1}{X}{B}{s}{T}{n}{x}{k}}
+
+\newcommand{\FunctionTypeAllRequiredStd}[1]{%
+  \FunctionTypeAllRequired{#1}{ }{X}{B}{s}{T}{n}}
+
+\newcommand{\FunctionTypePositionalStdCr}[1]{%
+  \FunctionTypePositional{#1}{\\}{X}{B}{s}{T}{n}{k}}
+
+\newcommand{\FunctionTypeNamedStdCr}[1]{%
+  \FunctionTypeNamed{#1}{\\}{X}{B}{s}{T}{n}{x}{k}}
+
+\newcommand{\FunctionTypeAllRequiredStdCr}[1]{%
+  \FunctionTypeAllRequired{#1}{\\}{X}{B}{s}{T}{n}}
+
+\newcommand{\MoreSignatureSpecificSymbol}{\ensuremath{\preceq}}
+\newcommand{\NotMoreSignatureSpecificSymbol}{\ensuremath{\not\preceq}}
+\newcommand{\LessSignatureSpecificSymbol}{\ensuremath{\succeq}}
+
+\newcommand{\MoreSignatureSpecific}[2]{%
+  \ensuremath{{#1}\MoreSignatureSpecificSymbol{#2}}}
+\newcommand{\NotMoreSignatureSpecific}[2]{%
+  \ensuremath{{#1}\NotMoreSignatureSpecificSymbol{#2}}}
+
+% Judgment expressing that a subtype relation exists.
+\newcommand{\Subtype}[3]{\ensuremath{{#1}\vdash{#2}\,<:\,{#3}}}
+\newcommand{\SubtypeStd}[2]{\Subtype{\Gamma}{#1}{#2}}
+% Subtype judgment where the environment is omitted (NE: "no environment").
+\newcommand{\SubtypeNE}[2]{\ensuremath{{#1}\,<:\,{#2}}}
+
+% Judgment expressing that a supertype relation exists.
+\newcommand{\Supertype}[3]{\ensuremath{{#1}\vdash{#2}\,:>\,{#3}}}
+\newcommand{\SupertypeStd}[2]{\Supertype{\Gamma}{#1}{#2}}
+
+% Judgment expressing that an assignability relation exists.
+\newcommand{\AssignableRelationSymbol}{\ensuremath{\Longleftrightarrow}}
+\newcommand{\Assignable}[3]{%
+  \ensuremath{{#1}\vdash{#2}\,\AssignableRelationSymbol\,{#3}}}
+\newcommand{\AssignableStd}[2]{\Assignable{\Gamma}{#1}{#2}}
+
+% Semantic function delivering the superinterfaces of a class.
+\newcommand{\Superinterfaces}[1]{\ensuremath{\metavar{Superinterfaces}({#1})}}
+\newcommand{\Superinterface}[2]{{#1}\in\Superinterfaces{#2}}
+
 % ----------------------------------------------------------------------
 % Support for hash valued Location Markers
 
@@ -128,14 +323,15 @@
 \definecolor{LMdim}{gray}{1.0}
 
 % insert location marker showing hash value of following paragraph
-\newcommand{\LMHash}[1]{%
-  \hspace{0pt}\marginpar{\raisebox{0.5ex}{\miniscule{\color{LMdim}#1}}}}
+\newcommand{\LMHash}[1]{\leavevmode\marginpar{\quad%
+    \raisebox{0.5ex}{\miniscule{\color{LMdim}#1}}\vspace{-2\baselineskip}}%
+  \color{normativeColor}}
 
 % support convenient renewcommand
 \let\OriginalLMHash\LMHash
 
 % define a label, and show the associated logical location marker
 \newcommand{\LMLabel}[1]{%
-  \vspace{-\baselineskip}\hspace{0pt}\OriginalLMHash{\raisebox{10ex}{#1}}%
+  \vspace{-\baselineskip}\leavevmode\OriginalLMHash{\raisebox{10ex}{#1}}%
   \label{#1}}
 % ----------------------------------------------------------------------
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index c04765f..2202ec5 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -1,15 +1,21 @@
-\documentclass{article}
+\documentclass[makeidx]{article}
 \usepackage{xspace}
 \usepackage{epsfig}
-\usepackage{color}
+\usepackage{xcolor}
 \usepackage{syntax}
+\usepackage{amssymb}
+\usepackage[fleqn]{amsmath}
+\usepackage{amssymb}
+\usepackage{semantic}
 \usepackage{dart}
 \usepackage{hyperref}
 \usepackage{lmodern}
 \usepackage[T1]{fontenc}
+\usepackage{makeidx}
+\makeindex
 \title{Dart Programming Language Specification\\
 {5th edition draft}\\
-{\large Version 2.1.0-dev}}
+{\large Version 2.2.0-dev}}
 \author{}
 
 % For information about Location Markers (and in particular the
@@ -19,6 +25,17 @@
 % CHANGES
 % =======
 % Significant changes to the specification.
+% 2.2
+% - Specify whether the values of literal expressions override Object.==.
+% - Allow Type objects as case expressions and const map keys.
+% - Introduce set literals.
+% - Specify that a getter/setter and a method with the same basename is
+%   an error, also in the case where a class obtains both from its
+%   superinterfaces.
+% - Specify the Dart 2.0 rule that you cannot implement, extend or mix-in
+%   Function.
+% - Generalize specification of type aliases such that they can denote any
+%   type, not just function types.
 %
 % 2.1
 % - Remove 64-bit constraint on integer literals compiled to JavaScript numbers.
@@ -67,6 +84,21 @@
 %   must imply bound satisfaction everywhere in the body.
 % - Specify that super-bounded generic type alias applications must trigger
 %   a well-boundedness check on all types occurring in the denoted type.
+% - Corrected corner case of rules for generation of noSuchMethod forwarders.
+% - Integrate feature specification on parameters that are
+%   covariant-by-declaration.
+% - Integrate feature specification on parameters that are
+%   covariant-by-class.
+% - Correct section 'Type of a function', allowing for adjustments needed
+%   for rules related to covariant parameters.
+% - Specified the dynamic type of function objects in several contexts, such
+%   that the special treatment of covariant parameters can be mentioned.
+% - Specified what it means for an override relation to be correct, thus
+%   adding the parts that are not captured by a function type subtype check.
+% - Introduced the notion of member signatures, specified that they are the
+%   kind of entity that a class interface contains.
+% - Corrected super-boundedness check to take variance into account at the
+%   top level.
 %
 % 2.0
 % - Don't allow functions as assert test values.
@@ -128,6 +160,19 @@
 %   expressions.
 % - Add `as` and `is` expressions as constant expressions
 % - Make `^`, `|` and `&` operations on `bool` constant operations.
+% - Integrate subtyping.md. This introduces the Dart 2 rules for subtyping,
+%   which in particular means that the notion of being a more specific type
+%   is eliminated, and function types are made contravariant in their
+%   parameter types.
+% - Integrate instantiation to bound. This introduces the notions of raw
+%   types, the raw-depends relation, and simple bounds; and it specifies
+%   the algorithm which is used to expand a raw type (e.g., `C`) to a
+%   parameterized type (e.g., `C<int>`).
+% - Integrate invalid_returns.md. This replaces the rules about when it is
+%   an error to have `return;` or `return e;` in a function.
+% - Integrate generalized-void.md. Introduces syntactic support for using
+%   `void` in many new locations, including variable type annotations and
+%   actual type arguments; also adds errors for using values of type `void`.
 %
 % 1.15
 % - Change how language specification describes control flow.
@@ -189,7 +234,7 @@
 \section{Scope}
 \LMLabel{ecmaScope}
 
-\LMHash{}
+\LMHash{}%
 This Ecma standard specifies the syntax and semantics of the Dart programming language.
 It does not specify the APIs of the Dart libraries except where those library elements are essential to the correct functioning of the language itself (e.g., the existence of class \code{Object} with methods such as \code{noSuchMethod}, \code{runtimeType}).
 
@@ -197,17 +242,17 @@
 \section{Conformance}
 \LMLabel{ecmaConformance}
 
-\LMHash{}
+\LMHash{}%
 A conforming implementation of the Dart programming language must provide and support all the APIs (libraries, types, functions, getters, setters, whether top-level, static, instance or local) mandated in this specification.
 
-\LMHash{}
+\LMHash{}%
 A conforming implementation is permitted to provide additional APIs, but not additional syntax, except for experimental features in support of null-aware cascades that are likely to be introduced in the next revision of this specification.
 
 
 \section{Normative References}
 \LMLabel{ecmaNormativeReferences}
 
-\LMHash{}
+\LMHash{}%
 The following referenced documents are indispensable for the application of this document.
 For dated references, only the edition cited applies.
 For undated references, the latest edition of the referenced document (including any amendments) applies.
@@ -223,16 +268,17 @@
 \section{Terms and Definitions}
 \LMLabel{ecmaTermsAndDefinitions}
 
-\LMHash{}
+\LMHash{}%
 Terms and definitions used in this specification are given in the body of the specification proper.
-Such terms are highlighted in italics when they are introduced, e.g., `we use the term {\em verbosity} to refer to the property of excess verbiage'.
+Such terms are highlighted in italics when they are introduced, e.g., `we use the term \NoIndex{verbosity} to refer to the property of excess verbiage',
+and add a marker in the margin.
 % End Ecma Boilerplate
 
 
 \section{Notation}
 \LMLabel{notation}
 
-\LMHash{}
+\LMHash{}%
 We distinguish between normative and non-normative text.
 Normative text defines the rules of Dart.
 It is given in this font.
@@ -256,14 +302,14 @@
 \Q{Should the text at the end of the previous bullet be rationale or commentary?}
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Reserved words and built-in identifiers (\ref{identifierReference}) appear in {\bf bold}.
 
 \commentary{
 Examples would be \SWITCH{} or \CLASS{}.
 }
 
-\LMHash{}
+\LMHash{}%
 Grammar productions are given in a common variant of EBNF.
 The left hand side of a production ends with a colon.
 On the right hand side, alternation is represented by vertical bars, and sequencing by spacing.
@@ -280,7 +326,7 @@
 An example would be:
 }
 
-\begin{grammar}
+\begin{grammar}\color{commentaryColor}
 <aProduction> ::= <anAlternative>
   \alt <anotherAlternative>
   \alt <oneThing> <after> <another>
@@ -293,41 +339,44 @@
   \alt <A\_LEXICAL\_THING>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Both syntactic and lexical productions are represented this way.
 Lexical productions are distinguished by their names.
 The names of lexical productions consist exclusively of upper case characters and underscores.
 As always, within grammatical productions, whitespace and comments between elements of the production are implicitly ignored unless stated otherwise.
 Punctuation tokens appear in quotes.
 
-\LMHash{}
+\LMHash{}%
 Productions are embedded, as much as possible, in the discussion of the constructs they represent.
 
-\LMHash{}
-A {\em term} is a syntactic construct.
+\LMHash{}%
+A \Index{term} is a syntactic construct.
 It may be considered to be a piece of text which is derivable in the grammar,
 and it may be considered to be a tree created by such a derivation.
-An {\em immediate subterm} of a given term $t$ is a syntactic construct
+An \Index{immediate subterm} of a given term $t$ is a syntactic construct
 which corresponds to an immediate subtree of $t$ considered as a derivation tree.
-A {\em subterm} of a given term $t$ is $t$,
+A \Index{subterm} of a given term $t$ is $t$,
 or an immediate subterm of $t$,
 or a subterm of an immediate subterm of $t$.
 
-\LMHash{}
+\LMHash{}%
 A list $x_1, \ldots, x_n$ denotes any list of $n$ elements of the form $x_i, 1 \le i \le n$.
 Note that $n$ may be zero, in which case the list is empty.
 We use such lists extensively throughout this specification.
 
-\LMHash{}
+\LMHash{}%
 For $j \in 1 .. n$,
 let $y_j$ be an atomic syntactic entity (like an identifier),
 $x_j$ a composite syntactic entity (like an expression or a type),
 and $E$ again a composite syntactic entity.
-The notation $[x_1/y_1, \ldots, x_n/y_n]E$ then denotes a copy of $E$
+The notation
+\IndexCustom{$[x_1/y_1, \ldots, x_n/y_n]E$}{[x1/y1, ..., xn/yn]E@$[x/y\ldots]E$}
+then denotes a copy of $E$
 in which each occurrence of $y_i, 1 \le i \le n$ has been replaced by $x_i$.
 
-\LMHash{}
-This operation is also known as substitution, and it is the variant that avoids capture.
+\LMHash{}%
+This operation is also known as \Index{substitution},
+and it is the variant that avoids capture.
 That is, when $E$ contains a construct that introduces $y_i$ into a nested scope for some $i \in 1 .. n$,
 the substitution will not replace $y_i$ in that scope.
 Conversely, if such a replacement would put an identifier \id{} (a subterm of $x_i$) into a scope where \id{} is declared,
@@ -337,39 +386,53 @@
 In short, capture freedom ensures that the ``meaning'' of each identifier is preserved during substitution.
 }
 
-\LMHash{}
+\LMHash{}%
 We sometimes abuse list or map literal syntax, writing $[o_1, \ldots, o_n]$ (respectively $\{k_1: o_1, \ldots, k_n: o_n\}$) where the $o_i$ and $k_i$ may be objects rather than expressions.
 The intent is to denote a list (respectively map) object whose elements are the $o_i$ (respectively, whose keys are the $k_i$ and values are the $o_i$).
 
-\LMHash{}
-The specifications of operators often involve statements such as $x$ $op$ $y$ is equivalent to the method invocation $x.op(y)$.
+\LMHash{}%
+The specifications of operators often involve statements such as
+\code{$x$ \metavar{op} $y$}
+is equivalent to the method invocation
+\IndexCustom{\rm\code{$x$.\metavar{op}($y$)}}{x.op(y)@\code{$x$.\metavar{op}($y$)}}.
 Such specifications should be understood as a shorthand for:
 \begin{itemize}
 \item
-$x$ $op$ $y$ is equivalent to the method invocation $x.op'(y)$, assuming the class of $x$ actually declared a non-operator method named $op'$ defining the same function as the operator $op$.
+  $x$ $op$ $y$ is equivalent to the method invocation
+  \code{$x$.\metavar{op'}($y$)},
+  assuming the class of $x$ actually declared a non-operator method named $op'$
+  defining the same function as the operator $op$.
 \end{itemize}
 
 \rationale{
-This circumlocution is required because x.op(y), where op is an operator, is not legal syntax.
-However, it is painfully verbose, and we prefer to state this rule once here, and use a concise and clear notation across the specification.
+This circumlocution is required because
+{\rm\code{$x$.\metavar{op}($y$)}}, where op is an operator, is not legal syntax.
+However, it is painfully verbose, and we prefer to state this rule once here,
+and use a concise and clear notation across the specification.
 }
 
-\LMHash{}
+\LMHash{}%
 When the specification refers to the order given in the program, it means the order of the program source code text, scanning left-to-right and top-to-bottom.
 
-\LMHash{}
-When the specification refers to a {\em fresh variable}, it means a variable with a name that doesn't occur anywhere in the current program.
+\LMHash{}%
+When the specification refers to a
+\IndexCustom{fresh variable}{variable!fresh},
+it means a variable with a name that doesn't occur anywhere
+in the current program.
 When the specification introduces a fresh variable bound to a value, the fresh variable is implicitly bound in a surrounding scope.
 
-\LMHash{}
+\LMHash{}%
 References to otherwise unspecified names of program entities (such as classes or functions) are interpreted as the names of members of the Dart core library.
 
 \commentary{
 Examples would be the classes \code{Object} and \code{Type} representing the root of the class hierarchy and the reification of run-time types respectively.
 }
 
-\LMHash{}
-When the specification says that one piece of syntax {\em is equivalent to} another piece of syntax, it means that it is equivalent in all ways, and the former syntax should generate the same compile-time errors and have the same run-time behavior as the latter, if any.
+\LMHash{}%
+When the specification says that one piece of syntax \Index{is equivalent to}
+another piece of syntax, it means that it is equivalent in all ways,
+and the former syntax should generate the same compile-time errors
+and have the same run-time behavior as the latter, if any.
 \commentary{
 Error messages, if any, should always refer to the original syntax.
 }
@@ -379,12 +442,12 @@
 \section{Overview}
 \LMLabel{overview}
 
-\LMHash{}
+\LMHash{}%
 Dart is a class-based, single-inheritance, pure object-oriented programming language.
 Dart is optionally typed (\ref{types}) and supports reified generics.
 The run-time type of every object is represented as an instance of class \code{Type} which can be obtained by calling the getter \code{runtimeType} declared in class \code{Object}, the root of the Dart class hierarchy.
 
-\LMHash{}
+\LMHash{}%
 Dart programs may be statically checked.
 Programs with compile-time errors do not have a specified dynamic semantics.
 This specification makes no attempt to answer additional questions
@@ -404,7 +467,7 @@
 this specification makes no attempt to specify exactly what that means.
 }
 
-\LMHash{}
+\LMHash{}%
 As specified in this document,
 dynamic checks are guaranteed to be performed in certain situations,
 and certain violations of the type system throw exceptions at run time.
@@ -448,8 +511,9 @@
 A future version of this specification will also specify type inference.
 }
 
-\LMHash{}
-Dart programs are organized in a modular fashion into units called {\em libraries} (\ref{librariesAndScripts}).
+\LMHash{}%
+Dart programs are organized in a modular fashion into
+units called \NoIndex{libraries} (\ref{librariesAndScripts}).
 Libraries are units of encapsulation and may be mutually recursive.
 
 \commentary{
@@ -457,7 +521,7 @@
 To get multiple copies of a library running simultaneously, one needs to spawn an isolate.
 }
 
-\LMHash{}
+\LMHash{}%
 A dart program execution may occur with assertions enabled or disabled.
 The method used to enable or disable assertions is implementation specific.
 
@@ -465,13 +529,13 @@
 \subsection{Scoping}
 \LMLabel{scoping}
 
-\LMHash{}
-A {\em namespace} is a mapping of names denoting declarations to actual declarations.
+\LMHash{}%
+A \Index{namespace} is a mapping of names denoting declarations to actual declarations.
 Let $NS$ be a namespace.
-We say that a name $n$ {\em is in }$NS$ if $n$ is a key of $NS$.
-We say a declaration $d$ {\em is in }$NS$ if a key of $NS$ maps to $d$.
+We say that a name $n$ \Index{is in} $NS$ if $n$ is a key of $NS$.
+We say a declaration $d$ \NoIndex{is in} $NS$ if a key of $NS$ maps to $d$.
 
-\LMHash{}
+\LMHash{}%
 A scope $S_0$ induces a namespace $NS_0$ that maps the simple name of each variable, type or function declaration $d$ declared in $S_0$ to $d$.
 Labels are not included in the induced namespace of a scope; instead they have their own dedicated namespace.
 
@@ -480,7 +544,7 @@
 Similarly one cannot declare a top-level function with the same name as a library variable or a class.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if there is more than one entity with the same name declared in the same scope.
 
 \commentary{
@@ -488,14 +552,14 @@
 Setters have names that are distinct from the corresponding getters because they always have an = automatically added at the end, and unary minus has the special name unary-.
 }
 
-\LMHash{}
+\LMHash{}%
 Dart is lexically scoped.
 Scopes may nest.
-A name or declaration $d$ is {\em available in scope} $S$ if $d$ is in the namespace induced by $S$ or if $d$ is available in the lexically enclosing scope of $S$.
-We say that a name or declaration $d$ is {\em in scope} if $d$ is available in the current scope.
+A name or declaration $d$ is \Index{available in scope} $S$ if $d$ is in the namespace induced by $S$ or if $d$ is available in the lexically enclosing scope of $S$.
+We say that a name or declaration $d$ is \Index{in scope} if $d$ is available in the current scope.
 
-\LMHash{}
-If a declaration $d$ named $n$ is in the namespace induced by a scope $S$, then $d$ {\em hides} any declaration named $n$ that is available in the lexically enclosing scope of $S$.
+\LMHash{}%
+If a declaration $d$ named $n$ is in the namespace induced by a scope $S$, then $d$ \Index{hides} any declaration named $n$ that is available in the lexically enclosing scope of $S$.
 
 \commentary{
 A consequence of these rules is that it is possible to hide a type with a method or variable.
@@ -509,7 +573,7 @@
 \}
 \end{dartCode}
 
-\LMHash{}
+\LMHash{}%
 Names may be introduced into a scope by declarations within the scope or by other mechanisms such as imports or inheritance.
 
 \rationale{
@@ -562,20 +626,27 @@
 \subsection{Privacy}
 \LMLabel{privacy}
 
-\LMHash{}
-Dart supports two levels of privacy: {\em public} and {\em private}.
-A declaration is {\em private} if{}f its name is private, otherwise it is {\em public}.
-A name $q$ is private if{}f any one of the identifiers that comprise $q$ is private, otherwise it is {\em public}.
-An identifier is private if{}f it begins with an underscore (the \_ character) otherwise it is {\em public}.
+\LMHash{}%
+Dart supports two levels of \Index{privacy}: public and private.
+A declaration is \IndexCustom{private}{private!declaration}
+if{}f its name is private,
+otherwise it is \IndexCustom{public}{public!declaration}.
+A name $q$ is \IndexCustom{private}{private!name}
+if{}f any one of the identifiers that comprise $q$ is private,
+otherwise it is \IndexCustom{public}{public!name}.
+An identifier is \IndexCustom{private}{private!identifier}
+if{}f it begins with an underscore (the \_ character)
+otherwise it is \IndexCustom{public}{public!identifier}.
 
-\LMHash{}
-A declaration $m$ is {\em accessible to library $L$} if $m$ is declared in $L$ or if $m$ is public.
+\LMHash{}%
+A declaration $m$ is \Index{accessible to a library} $L$
+if $m$ is declared in $L$ or if $m$ is public.
 
 \commentary{
 This means private declarations may only be accessed within the library in which they are declared.
 }
 
-\LMHash{}
+\LMHash{}%
 Privacy applies only to declarations within a library, not to library declarations themselves.
 
 \rationale{
@@ -597,12 +668,12 @@
 \subsection{Concurrency}
 \LMLabel{concurrency}
 
-\LMHash{}
+\LMHash{}%
 Dart code is always single threaded.
 There is no shared-state concurrency in Dart.
-Concurrency is supported via actor-like entities called {\em isolates}.
+Concurrency is supported via actor-like entities called \Index{isolates}.
 
-\LMHash{}
+\LMHash{}%
 An isolate is a unit of concurrency.
 It has its own memory and its own thread of control.
 Isolates communicate by message passing (\ref{sendingMessages}).
@@ -613,11 +684,12 @@
 \section{Errors and Warnings}
 \LMLabel{errorsAndWarnings}
 
-\LMHash{}
+\LMHash{}%
 This specification distinguishes between several kinds of errors.
 
-\LMHash{}
-{\em Compile-time errors} are errors that preclude execution.
+\LMHash{}%
+\IndexCustom{Compile-time errors}{compile-time error}
+are errors that preclude execution.
 A compile-time error must be reported by a Dart compiler before the erroneous code is executed.
 
 \rationale{
@@ -637,14 +709,14 @@
 It is outside the scope of this document to specify how such transformations work, and where they may be applied.
 }
 
-\LMHash{}
+\LMHash{}%
 If an uncaught compile-time error occurs within the code of a running isolate $A$, $A$ is immediately suspended.
 The only circumstance where a compile-time error could be caught would be via code run reflectively, where the mirror system can catch it.
 
 \rationale{
 Typically, once a compile-time error is thrown and $A$ is suspended, $A$ will then be terminated.
 However, this depends on the overall environment.
-A Dart engine runs in the context of an {\em embedder},
+A Dart engine runs in the context of an \Index{embedder},
 a program that interfaces between the engine and the surrounding computing environment.
 The embedder will often be a web browser, but need not be; it may be a C++ program on the server for example.
 When an isolate fails with a compile-time error as described above, control returns to the embedder, along with an exception describing the problem.
@@ -652,38 +724,43 @@
 It is then the embedder's decision whether to terminate the isolate or not.
 }
 
-\LMHash{}
-{\em Compile-time warnings} are situations that do not preclude execution,
+\LMHash{}%
+\IndexCustom{Static warnings}{static warning}
+are situations that do not preclude execution,
 but which are unlikely to be intended,
 and likely to cause bugs or inconveniences.
-A compile-time warning must be reported by a Dart compiler before the associated code is executed.
+A static warning must be reported by a Dart compiler before the associated code is executed.
 
-\LMHash{}
-When this specification says that a {\em run-time error} occurs,
+\LMHash{}%
+When this specification says that a \Index{run-time error} occurs,
 it means that a corresponding error object is thrown.
-When it says that a {\em dynamic type error} occurs,
+When it says that a \Index{dynamic type error} occurs,
 it represents a failed run-time type check,
 and the object which is thrown implements \code{TypeError}.
 
-\LMHash{}
-Whenever we say that an exception $ex$ is {\em thrown},
-it acts like an expression had {\em thrown} (\ref{completion}) with $ex$ as exception object and with a stack trace corresponding to the current system state.
-When we say that {\em a} $C$ {\em is thrown}, where $C$ is a class, we mean that an instance of class $C$ is thrown.
+\LMHash{}%
+Whenever we say that an exception $ex$ is
+\IndexCustom{thrown}{throwing an exception},
+it acts like an expression had thrown (\ref{statementCompletion})
+with $ex$ as exception object and with a stack trace
+corresponding to the current system state.
+When we say that a $C$ \IndexCustom{is thrown}{throwing a class},
+where $C$ is a class, we mean that an instance of class $C$ is thrown.
 
-\LMHash{}
+\LMHash{}%
 If an uncaught exception is thrown by a running isolate $A$, $A$ is immediately suspended.
 
 
 \section{Variables}
 \LMLabel{variables}
 
-\LMHash{}
+\LMHash{}%
 Variables are storage locations in memory.
 
 \begin{grammar}
 <variableDeclaration> ::= <declaredIdentifier> (`,' <identifier>)*
 
-<declaredIdentifier> ::= <metadata> <finalConstVarOrType> <identifier>
+<declaredIdentifier> ::= <metadata> \COVARIANT{}? <finalConstVarOrType> <identifier>
 
 <finalConstVarOrType> ::= \FINAL{} <type>?
   \alt \CONST{} <type>?
@@ -692,7 +769,7 @@
 <varOrType> ::= \VAR{}
   \alt <type>
 
-<initializedVariableDeclaration> ::=
+<initializedVariableDeclaration> ::= \gnewline{}
   <declaredIdentifier> (`=' <expression>)? (`,' <initializedIdentifier>)*
 
 <initializedIdentifier> ::= <identifier> (`=' <expression>)?
@@ -700,18 +777,15 @@
 <initializedIdentifierList> ::= <initializedIdentifier> (`,' <initializedIdentifier>)*
 \end{grammar}
 
-\LMHash{}
-A variable declaration that contains one or more terms of the form
-\syntax{<identifier>}
-(\commentary{i.e., a declaration that declares two or more variables})
+\LMHash{}%
+A \synt{variableDeclaration} that declares two or more variables
 is equivalent to multiple variable declarations declaring
 the same set of variable names in the same order,
 with the same type and modifiers.
 
-\LMHash{}
-An \syntax{<initializedVariableDeclaration>} that contains one or more terms of the form
-\syntax{<initializedIdentifier>}
-(\commentary{that is, a declaration that declares two or more initialized variables})
+\LMHash{}%
+An \synt{initializedVariableDeclaration}
+that declares two or more variables
 is equivalent to multiple variable declarations declaring
 the same set of variable names, in the same order,
 with the same initialization, type, and modifiers.
@@ -727,61 +801,77 @@
 \code{\STATIC{} \FINAL{} String s1; \STATIC{} \FINAL{} String s2 = "foo";}.
 }
 
-\LMHash{}
+\LMHash{}%
+It is possible for a variable declaration to include the modifier \COVARIANT{}.
+The effect of doing this with an instance variable is described elsewhere
+(\ref{instanceVariables}).
+It is a compile-time error for the declaration of
+a variable which is not an instance variable
+to include the modifier \COVARIANT{}.
+
+\LMHash{}%
 In a variable declaration of one of the forms
 \code{$N$ $v$;}
 \code{$N$ $v$ = $e$;}
 where $N$ is derived from
 \syntax{<metadata> <finalConstVarOrType>},
-we say that $v$ is the {\em declaring occurrence} of the identifier.
+we say that $v$ is the \Index{declaring occurrence} of the identifier.
 For every identifier which is not a declaring occurrence,
-we say that it is an {\em referencing occurrence}.
+we say that it is an \Index{referencing occurrence}.
 We also abbreviate that to say that an identifier is
-a {\em declaring identifier} respectively an {\em referencing identifier}.
+a \Index{declaring identifier} respectively an \Index{referencing identifier}.
 
 \commentary{
 In an expression of the form \code{$e$.\id} it is possible that
 $e$ has static type \DYNAMIC{} and \id{} cannot be associated with
-any declaration named \id{} at compile-time,
+any specific declaration named \id{} at compile-time,
 but in this situation \id{} is still a referencing identifier.
 }
 
-\LMHash{}
-An {\em initializing variable declaration}
+\LMHash{}%
+An \Index{initializing variable declaration}
 is a variable declaration whose declaring identifier is
-immediately followed by `\code{=}' and an {\em initializing expression}.
+immediately followed by `\code{=}' and an \Index{initializing expression}.
 
-\LMHash{}
-A variable declared at the top-level of a library is referred to as either a {\em library variable} or a top-level variable.
+\LMHash{}%
+A variable declared at the top-level of a library is referred to as either a
+\IndexCustom{library variable}{variable!library} or a
+\IndexCustom{top-level variable}{variable!top-level}.
 
-\LMHash{}
-A {\em static variable} is a variable that is not associated with a particular instance, but rather with an entire library or class.
+\LMHash{}%
+A \IndexCustom{static variable}{variable!static}
+is a variable that is not associated with a particular instance,
+but rather with an entire library or class.
 Static variables include library variables and class variables.
 Class variables are variables whose declaration is immediately nested inside a class declaration and includes the modifier \STATIC{}.
 A library variable is implicitly static.
 It is a compile-time error to preface a top-level variable declaration with the built-in identifier (\ref{identifierReference}) \STATIC{}.
 
-\LMHash{}
-A {\em constant variable} is a variable whose declaration includes the modifier \CONST{}.
+\LMHash{}%
+A \IndexCustom{constant variable}{variable!constant}
+is a variable whose declaration includes the modifier \CONST{}.
 A constant variable must be initialized to a constant expression (\ref{constants}) or a compile-time error occurs.
 
-\LMHash{}
-A {\em final variable} is a variable whose binding is fixed upon initialization;
+\LMHash{}%
+A \IndexCustom{final variable}{variable!final}
+is a variable whose binding is fixed upon initialization;
 a final variable $v$ will always refer to the same object after $v$ has been initialized.
 A variable is final if{}f its declaration includes the modifier \FINAL{} or the modifier \CONST{}.
 
-\LMHash{}
-A {\em mutable variable} is a variable which is not final.
+\LMHash{}%
+A \IndexCustom{mutable variable}{variable!mutable}
+is a variable which is not final.
 
 %% Note that the following relies on the assumption that inference has
 %% already taken place, including member signature inference. For instance,
 %% if `var x;` is an instance variable declaration that overrides `T get x;`
 %% then we treat `var x;` as if it had been `T x;`.
 
-\LMHash{}
-The following rules apply to all static and instance variables.
+\LMHash{}%
+The following rules on implicitly induced getters and setters
+apply to all static and instance variables.
 
-\LMHash{}
+\LMHash{}%
 A variable declaration of one of the forms
 \code{$T$ $v$;}
 \code{$T$ $v$ = $e$;}
@@ -794,7 +884,7 @@
 (\ref{evaluationOfImplicitVariableGetters}).
 In these cases the static type of $v$ is $T$.
 
-\LMHash{}
+\LMHash{}%
 A variable declaration of one of the forms
 \code{\VAR{} $v$;}
 \code{\VAR{} $v$ = $e$;}
@@ -813,7 +903,7 @@
 In these cases, the static type of $v$ is \DYNAMIC{}
 (\ref{typeDynamic}).
 
-\LMHash{}
+\LMHash{}%
 A mutable variable declaration of the form
 \code{{} $T$ $v$;}
 or \code{$T$ $v$ = $e$;}
@@ -821,7 +911,7 @@
 \code{\VOID{} \SET{} $v$=($T$ $x$)}
 whose execution sets the value of $v$ to the incoming argument $x$.
 
-\LMHash{}
+\LMHash{}%
 A mutable variable declaration of the form
 \code{\VAR{} $v$;}
 or \code{\VAR{} $v$ = $e$;}
@@ -829,20 +919,20 @@
 \code{\VOID{} \SET{} $v$=(\DYNAMIC{} $x$)}
 whose execution sets the value of $v$ to the incoming argument $x$.
 
-\LMHash{}
+\LMHash{}%
 The scope into which the implicit getters and setters are introduced depends on the kind of variable declaration involved.
 
-\LMHash{}
+\LMHash{}%
 A library variable introduces a getter into the top level scope of the enclosing library.
 A static class variable introduces a static getter into the immediately enclosing class.
 An instance variable introduces an instance getter into the immediately enclosing class.
 
-\LMHash{}
+\LMHash{}%
 A mutable library variable introduces a setter into the top level scope of the enclosing library.
 A mutable static class variable introduces a static setter into the immediately enclosing class.
 A mutable instance variable introduces an instance setter into the immediately enclosing class.
 
-\LMHash{}
+\LMHash{}%
 Let $v$ be variable declared in an initializing variable declaration,
 and let $e$ be the associated initializing expression.
 It is a compile-time error if the static type of $e$ is not assignable to the declared type of $v$.
@@ -869,11 +959,11 @@
 but if there is no setter it will cause a dynamic error.
 }
 
-\LMHash{}
+\LMHash{}%
 A variable that has no initializing expression has the null object (\ref{null}) as its initial value.
 Otherwise, variable initialization proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Static variable declarations with an initializing expression are initialized lazily
 (\ref{evaluationOfImplicitVariableGetters}).
 
@@ -888,7 +978,7 @@
 (\ref{initializerLists}).
 }
 
-\LMHash{}
+\LMHash{}%
 Initialization of an instance variable $v$
 with an initializing expression $e$
 proceeds as follows:
@@ -911,7 +1001,7 @@
 will throw.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a dynamic type error if $o$ is not the null object (\ref{null})
 and the dynamic type of $o$ is not
 a subtype of the actual type of the variable $v$
@@ -921,7 +1011,7 @@
 \subsection{Evaluation of Implicit Variable Getters}
 \LMLabel{evaluationOfImplicitVariableGetters}
 
-\LMHash{}
+\LMHash{}%
 Let $d$ be the declaration of a static or instance variable $v$.
 If $d$ is an instance variable,
 then the invocation of the implicit getter of $v$ evaluates to
@@ -973,24 +1063,22 @@
 \section{Functions}
 \LMLabel{functions}
 
-\LMHash{}
+\LMHash{}%
 Functions abstract over executable actions.
 
 \begin{grammar}
-<functionSignature> ::= <metadata> <returnType>? <identifier> <formalParameterPart>
+<functionSignature> ::= \gnewline{}
+  <metadata> <type>? <identifier> <formalParameterPart>
 
 <formalParameterPart> ::= <typeParameters>? <formalParameterList>
 
-<returnType> ::= \VOID{}
-  \alt <type>
-
 <functionBody> ::= \ASYNC{}? `=>' <expression> `;'
   \alt (\ASYNC{} | \ASYNC `*' | \SYNC `*')? <block>
 
 <block> ::= `{' <statements> `}'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Functions can be introduced by function declarations (\ref{functionDeclarations}),
 method declarations (\ref{instanceMethods}, \ref{staticMethods}),
 getter declarations (\ref{getters}),
@@ -998,55 +1086,118 @@
 and constructor declarations (\ref{constructors});
 and they can be introduced by function literals (\ref{functionExpressions}).
 
-\LMHash{}
-Each declaration that introduces a function has a signature that specifies its return type, name, and formal parameter part,
-except that the return type may be omitted, and getters never have a formal parameter part.
+\LMHash{}%
+A function is \IndexCustom{asynchronous}{function!asynchronous}
+if its body is marked with the \ASYNC{} or \code{\ASYNC*} modifier.
+Otherwise the function is \IndexCustom{synchronous}{function!synchronous}.
+A function is a \IndexCustom{generator}{function!generator}
+if its body is marked with the \code{\SYNC*} or \code{\ASYNC*} modifier.
+Further details about these concepts are given below.
+
+\commentary{%
+Whether a function is synchronous or asynchronous is orthogonal to
+whether it is a generator or not.
+Generator functions are a sugar for functions
+that produce collections in a systematic way,
+by lazily applying a function that \emph{generates}
+individual elements of a collection.
+Dart provides such a sugar in both the synchronous case,
+where one returns an iterable,
+and in the asynchronous case, where one returns a stream.
+Dart also allows both synchronous and asynchronous functions
+that produce a single value.%
+}
+
+\LMHash{}%
+Each declaration that introduces a function has a signature that specifies
+its return type, name, and formal parameter part,
+except that the return type may be omitted,
+and getters never have a formal parameter part.
 Function literals have a formal parameter part, but no return type and no name.
-The formal parameter part optionally specifies the formal type parameter list of the function,
+The formal parameter part optionally specifies
+the formal type parameter list of the function,
 and it always specifies its formal parameter list.
 A function body is either:
 \begin{itemize}
-\item A block statement (\ref{blocks}) containing the statements (\ref{statements}) executed by the function, optionally marked with one of the modifiers: \ASYNC, \code{\ASYNC*} or \code{\SYNC*}.
+\item
+  a block statement (\ref{blocks}) containing
+  the statements (\ref{statements}) executed by the function,
+  optionally marked with one of the modifiers:
+  \ASYNC, \code{\ASYNC*} or \code{\SYNC*}.
+  %
+  Unless it is statically known that the body of the function
+  cannot complete normally
+  (\commentary{that is, it cannot reach the end and ``fall through''},
+  cf.~\ref{statementCompletion}),
+  it is a compile-time error if
+  the addition of \code{\RETURN;} at the end of the body
+  would be a compile-time error.
+  \commentary{%
+  For instance, it is an error if
+  the return type of a synchronous function is \code{int},
+  and the body may complete normally.
+  The precise rules are given in section~\ref{return}.%
+  }
 
-  \commentary{
-  Because Dart is optionally typed, we cannot guarantee that a function that does not return a value will not be used in the context of an expression.
+  \commentary{%
+  Because Dart supports dynamic function invocations,
+  we cannot guarantee that a function that does not return a value
+  will not be used in the context of an expression.
   Therefore, every function must return a value.
-  A function body that ends without doing a throw or return will cause the function to return the null object (\ref{null}),
+  A function body that ends without doing a throw or return
+  will cause the function to return the null object (\ref{null}),
   as will a \RETURN{} without an expression.
   For generator functions, the situation is more subtle.
-  See further discussion in section \ref{return}.
+  See further discussion in section~\ref{return}.%
   }
 
 OR
-\item of the form \code{=> $e$} or the form \code{\ASYNC{} => $e$}, which both return the value of the expression $e$ as if by a \code{return $e$}.
-  \commentary{
-  The other modifiers do not apply here, because they apply only to generators, discussed below,
-  and generators are not allowed to return a value, values are added to the generated stream or iterable using \YIELD{} instead.
+\item
+  of the form \code{=> $e$} or the form \code{\ASYNC{} => $e$},
+  which both return the value of the expression $e$ as if by a
+  \code{return $e$}.
+  \commentary{%
+  The other modifiers do not apply here,
+  because they apply only to generators, discussed below.
+  Generators are not allowed to return a value,
+  values are added to the generated stream or iterable using
+  \YIELD{} or \YIELD*.%
   }
-  Let $R$ be the static type of $e$
-  and let $T$ be the declared return type of the function that has this body.
-  It is a compile-time error unless one of the following conditions hold:
+  Let $T$ be the declared return type of the function that has this body.
+  It is a compile-time error if one of the following conditions hold:
   \begin{itemize}
-  \item $T$ is \VOID{}.
-  \item The function is synchronous and $R$ is assignable to $T$.
-  \item The function is asynchronous and \code{Future<\flatten{R}>} is assignable to $T$.
+  \item The function is synchronous, $T$ is not \VOID{},
+    and it would have been a compile-time error to declare the function with the body
+    \code{\{ \RETURN{} $e$; \}}
+    rather than \code{=> $e$}.
+    \commentary{%
+    In particular, $e$ can have \emph{any} type when the return type is \VOID.%
+    }
+    \rationale{%
+    This enables concise declarations of \VOID{} functions.
+    It is reasonably easy to understand such a function,
+    because the return type is textually near to the returned expression $e$.
+    In contrast, \code{\RETURN{} $e$;} in a block body is only allowed
+    for an $e$ with one of a few specific static types,
+    because it is less likely that the developer understands
+    that the returned value will not be used
+    (\ref{return}).%
+    }
+  \item The function is asynchronous, \flatten{T} is not \VOID{},
+    and it would have been a compile-time error to declare the function with the body
+    \code{\ASYNC{} \{ \RETURN{} $e$; \}}
+    rather than \code{\ASYNC{} => $e$}.
+    \commentary{%
+    In particular, $e$ can have \emph{any} type
+    when the flattened return type is \VOID,%
+    }
+    \rationale{%
+    and the rationale is similar to the synchronous case.%
+    }
   \end{itemize}
 \end{itemize}
 
-\LMHash{}
-A function is {\em asynchronous} if its body is marked with the \ASYNC{} or \code{\ASYNC*} modifier.
-Otherwise the function is {\em synchronous}.
-A function is a {\em generator} if its body is marked with the \code{\SYNC*} or \code{\ASYNC*} modifier.
-
-\commentary{
-Whether a function is synchronous or asynchronous is orthogonal to whether it is a generator or not.
-Generator functions are a sugar for functions that produce collections in a systematic way,
-by lazily applying a function that {\em generates} individual elements of a collection.
-Dart provides such a sugar in both the synchronous case, where one returns an iterable, and in the asynchronous case, where one returns a stream.
-Dart also allows both synchronous and asynchronous functions that produce a single value.
-}
-
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if an \ASYNC, \code{\ASYNC*} or \code{\SYNC*} modifier is attached to the body of a setter or constructor.
 
 \rationale{
@@ -1065,7 +1216,7 @@
 This situation is very unusual so it is not worth making an exception to the general rule for constructors in order to allow it.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the declared return type of a function marked \ASYNC{} is not a supertype of \code{Future<$T$>} for some type $T$.
 It is a compile-time error if the declared return type of a function marked \code{\SYNC*} is not a supertype of \code{Iterable<$T$>} for some type $T$.
 It is a compile-time error if the declared return type of a function marked \code{\ASYNC*} is not a supertype of \code{Stream<$T$>} for some type $T$.
@@ -1074,60 +1225,69 @@
 \subsection{Function Declarations}
 \LMLabel{functionDeclarations}
 
-\LMHash{}
-A {\em function declaration} is a function that is neither a member of a class nor a function literal.
-Function declarations include {\em library functions}, which are function declarations
+\LMHash{}%
+A \Index{function declaration} is a function that is neither a member of a class nor a function literal.
+Function declarations include exactly the following:
+\IndexCustom{library functions}{function!library},
+which are function declarations
 %(including getters and setters)
-at the top level of a library, and {\em local functions}, which are function declarations declared inside other functions.
+at the top level of a library, and
+\IndexCustom{local functions}{function!local},
+which are function declarations declared inside other functions.
 Library functions are often referred to simply as top-level functions.
 
-\LMHash{}
+\LMHash{}%
 A function declaration consists of an identifier indicating the function's name, possibly prefaced by a return type.
 The function name is followed by a signature and body.
 For getters, the signature is empty.
 The body is empty for functions that are external.
 
-\LMHash{}
+\LMHash{}%
 The scope of a library function is the scope of the enclosing library.
 The scope of a local function is described in section \ref{localFunctionDeclaration}.
 In both cases, the name of the function is in scope in its formal parameter scope (\ref{formalParameters}).
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error to preface a function declaration with the built-in identifier \STATIC{}.
 
-\LMHash{}
-When we say that a function $f_1$ {\em forwards} to another function $f_2$, we mean that invoking $f_1$ causes $f_2$ to be executed with the same arguments and/or receiver as $f_1$, and returns the result of executing $f_2$ to the caller of $f_1$, unless $f_2$ throws an exception, in which case $f_1$ throws the same exception.
+\LMHash{}%
+When we say that a function $f_1$ \Index{forwards} to another function $f_2$, we mean that invoking $f_1$ causes $f_2$ to be executed with the same arguments and/or receiver as $f_1$, and returns the result of executing $f_2$ to the caller of $f_1$, unless $f_2$ throws an exception, in which case $f_1$ throws the same exception.
 Furthermore, we only use the term for synthetic functions introduced by the specification.
 
 
 \subsection{Formal Parameters}
 \LMLabel{formalParameters}
 
-\LMHash{}
-Every non-getter function declaration includes a {\em formal parameter list},
+\LMHash{}%
+Every non-getter function declaration includes a \Index{formal parameter list},
 which consists of a list of required positional parameters (\ref{requiredFormals}),
 followed by any optional parameters (\ref{optionalFormals}).
 The optional parameters may be specified either as a set of named parameters or as a list of positional parameters, but not both.
 
-\LMHash{}
-Some function declarations include a {\em formal type parameter list} (\ref{functions}),
-in which case we say that it is a {\em generic function}.
-A {\em non-generic function} is a function which is not generic.
+\LMHash{}%
+Some function declarations include a
+\Index{formal type parameter list} (\ref{functions}),
+in which case we say that it is a
+\IndexCustom{generic function}{function!generic}.
+A \IndexCustom{non-generic function}{function!non-generic}
+is a function which is not generic.
 
-\LMHash{}
-The {\em formal parameter part} of a function declaration consists of the formal type parameter list, if any, and the formal parameter list.
+\LMHash{}%
+The \Index{formal parameter part} of a function declaration consists of the formal type parameter list, if any, and the formal parameter list.
 
 \commentary{
 The following kinds of functions cannot be generic:
 Getters, setters, operators, and constructors.
 }
 
-\LMHash{}
-The formal type parameter list of a function declaration introduces a new scope known as the function's {\em type parameter scope}.
+\LMHash{}%
+The formal type parameter list of a function declaration introduces
+a new scope known as the function's
+\IndexCustom{type parameter scope}{scope!type parameter}.
 The type parameter scope of a generic function $f$ is enclosed in the scope where $f$ is declared.
 Every formal type parameter introduces a type into the type parameter scope.
 
-\LMHash{}
+\LMHash{}%
 If it exists, the type parameter scope of a function $f$ is the current scope for the signature of $f$, and for the formal type parameter list itself;
 otherwise the scope where $f$ is declared is the current scope for the signature of $f$.
 
@@ -1142,8 +1302,9 @@
 \code{class D<X \EXTENDS{} Y, Y> \{ \ldots{} \}}.
 }
 
-\LMHash{}
-The formal parameter list of a function declaration introduces a new scope known as the function's {\em formal parameter scope}.
+\LMHash{}%
+The formal parameter list of a function declaration introduces a new scope known as the function's
+\IndexCustom{formal parameter scope}{scope!formal parameter}.
 The formal parameter scope of a non-generic function $f$ is enclosed in the scope where $f$ is declared.
 The formal parameter scope of a generic function $f$ is enclosed in the type parameter scope of $f$.
 Every formal parameter introduces a local variable into the formal parameter scope.
@@ -1155,8 +1316,9 @@
 but the formal parameters are not in scope in the signature.
 }
 
-\LMHash{}
-The body of a function declaration introduces a new scope known as the function's {\em body scope}.
+\LMHash{}%
+The body of a function declaration introduces a new scope known as the function's
+\IndexCustom{body scope}{scope!function body}.
 The body scope of a function $f$ is enclosed in the scope introduced by the formal parameter scope of $f$.
 
 %The formal parameter scope of a function maps the name of each formal parameter $p$ to the value $p$ is bound to.
@@ -1164,7 +1326,7 @@
 % The formal parameters of a function are processed in the enclosing scope of the function.
 % \commentary{this means that the parameters themselves may not be referenced within the formal parameter list.}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a formal parameter is declared as a constant variable (\ref{variables}).
 
 \begin{grammar}
@@ -1173,14 +1335,17 @@
   \alt `(' <normalFormalParameters> `,' <optionalFormalParameters> `)'
   \alt `(' <optionalFormalParameters> `)'
 
-<normalFormalParameters> ::= <normalFormalParameter> (`,' <normalFormalParameter>)*
+<normalFormalParameters> ::= \gnewline{}
+  <normalFormalParameter> (`,' <normalFormalParameter>)*
 
 <optionalFormalParameters> ::= <optionalPositionalFormalParameters>
   \alt <namedFormalParameters>
 
-<optionalPositionalFormalParameters> ::= `[' <defaultFormalParameter> (`,' <defaultFormalParameter>)* `,'? `]'
+<optionalPositionalFormalParameters> ::= \gnewline{}
+  `[' <defaultFormalParameter> (`,' <defaultFormalParameter>)* `,'? `]'
 
-<namedFormalParameters> ::= `{' <defaultNamedParameter> (`,' <defaultNamedParameter>)* `,'? `}'
+<namedFormalParameters> ::= \gnewline{}
+  `{' <defaultNamedParameter> (`,' <defaultNamedParameter>)* `,'? `}'
 \end{grammar}
 
 Formal parameter lists allow an optional trailing comma after the last parameter (\syntax{`,'?}).
@@ -1191,8 +1356,8 @@
 \subsubsection{Required Formals}
 \LMLabel{requiredFormals}
 
-\LMHash{}
-A {\em required formal parameter} may be specified in one of three ways:
+\LMHash{}%
+A \Index{required formal parameter} may be specified in one of three ways:
 \begin{itemize}
 \item By means of a function signature that names the parameter and describes its type as a function type (\ref{functionTypes}).
 It is a compile-time error if any default values are specified in the signature of such a function type.% explain what the type is in this case? Where is this described in general?
@@ -1205,32 +1370,37 @@
   \alt <fieldFormalParameter>
   \alt <simpleFormalParameter>
 
-<functionFormalParameter> ::= <metadata> \COVARIANT{}? <returnType>? <identifier>
-  \gnewline{} <formalParameterPart>
+<functionFormalParameter> ::= \gnewline{}
+  <metadata> \COVARIANT{}? <type>? <identifier> <formalParameterPart>
 
-<simpleFormalParameter> ::= <metadata> \COVARIANT{}? <finalConstVarOrType>? <identifier>
+<simpleFormalParameter> ::= <declaredIdentifier>
+  \alt <metadata> \COVARIANT{}? <identifier>
 
-<fieldFormalParameter> ::= <metadata> <finalConstVarOrType>? \THIS{} `.' <identifier>
-  \gnewline{} <formalParameterPart>?
+<fieldFormalParameter> ::= \gnewline{}
+  <metadata> <finalConstVarOrType>? \THIS{} `.' <identifier> \gnewline{}
+  <formalParameterPart>?
 \end{grammar}
 
-\LMHash{}
-It is possible to include the modifier \COVARIANT{} in some forms of parameter declarations.
-This modifier has no effect.
+\LMHash{}%
+It is possible to include the modifier \COVARIANT{}
+in some forms of parameter declarations.
+The effect of doing this is described in a separate section
+(\ref{covariantParameters}).
 
-\rationale{
-The modifier \COVARIANT{} is used in strong mode.
-The modifier is allowed here even though it has no effect, such that source code can be used in both contexts.
+\commentary{
+Note that the non-terminal \synt{normalFormalParameter} is also used
+in the grammar rules for optional parameters,
+which means that such parameters can also be covariant.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the modifier \COVARIANT{} occurs on a parameter of a function which is not an instance method, instance setter, or instance operator.
 
 
 \subsubsection{Optional Formals}
 \LMLabel{optionalFormals}
 
-\LMHash{}
+\LMHash{}%
 Optional parameters may be specified and provided with default values.
 
 \begin{grammar}
@@ -1240,18 +1410,17 @@
   \alt <normalFormalParameter> ( `:' <expression>)?
 \end{grammar}
 
-A \syntax{<defaultNamedParameter>} of the form
-\syntax{<normalFormalParameter> `:' <expression>}
-is equivalent to one of the form:
+The form \syntax{<normalFormalParameter> `:' <expression>}
+is equivalent to the form
 \syntax{<normalFormalParameter> `=' <expression>}.
 The colon-syntax is included only for backwards compatibility.
 It is deprecated and will be removed in a later version of the language specification.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the default value of an optional parameter is not a constant expression (\ref{constants}).
 If no default is explicitly specified for an optional parameter an implicit default of \NULL{} is provided.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the name of a named optional parameter begins with an `_' character.
 
 \rationale{
@@ -1262,80 +1431,290 @@
 }
 
 
+\subsubsection{Covariant Parameters}
+\LMLabel{covariantParameters}
+
+\LMHash{}%
+Dart allows formal parameters of instance methods,
+including setters and operators,
+to be declared \COVARIANT{}.
+\commentary{
+The syntax for doing this is specified in an earlier section (\ref{requiredFormals}).
+}
+
+\LMHash{}%
+It is a compile-time error if the modifier \COVARIANT{} occurs
+in the declaration of a formal parameter of a function
+which is not an instance method, an instance setter, or an operator.
+
+\commentary{
+As specified below, a parameter can also be covariant for other reasons.
+The overall effect of having a covariant parameter $p$
+in the signature of a given method $m$
+is to allow the type of $p$ to be overridden covariantly,
+which means that the type required at run time for a given actual argument
+may be a proper subtype of the type which is known at compile time
+at the call site.
+}
+
+\rationale{
+This mechanism allows developers to explicitly request that
+a compile-time guarantee which is otherwise supported
+(namely: that an actual argument whose static type satisfies the requirement
+will also do so at run time)
+is replaced by dynamic type checks.
+In return for accepting these dynamic type checks,
+developers can use covariant parameters to express software designs
+where the dynamic type checks are known (or at least trusted) to succeed,
+based on reasoning that the static type analysis does not capture.
+}
+
+\LMHash{}%
+Let $m$ be a method signature with formal type parameters
+\List{X}{1}{s},
+positional formal parameters \List{p}{1}{n},
+and named formal parameters \List{q}{1}{k}.
+Let $m'$ be a method signature with formal type parameters
+\List{X'\!}{1}{s},
+positional formal parameters \List{p'\!}{1}{n'},
+and named formal parameters \List{q'\!}{1}{k'}.
+%
+Assume that $j \in 1 .. n'$, and $j \leq n$;
+we say that $p'_j$ is the parameter in $m'$ that
+\IndexCustom{corresponds}{parameter corresponds to parameter}
+to the formal parameter $p_j$ in $m$.
+Assume that $j \in 1 .. k'$ and $l \in 1 .. k$;
+we say that $q'_j$ is the parameter in $m'$ that
+\NoIndex{corresponds} to the formal parameter
+$q_l$ in $m$ if $q'_j = q_l$.
+%
+Similarly, we say that the formal type parameter
+$X'_j$ from $m'$
+\NoIndex{corresponds} to the formal type parameter
+$X_j$ from $m$, for all $j \in 1 .. s$.
+
+\commentary{
+This includes the case where $m$ respectively $m'$ has
+optional positional parameters,
+in which case $k = 0$ respectively $k' = 0$ must hold,
+but we can have $n \not= n'$.
+The case where the numbers of formal type parameters differ is not relevant.
+}
+
+% Being covariant is a property of a parameter of the interface of a class;
+% this means that we only talk about the originating keyword \COVARIANT{}
+% and the class that contains the relevant declaration when we detect for
+% the first time that a given parameter is covariant. From that point and on
+% it is "carried" along the subtype links associated with class interfaces,
+% such that we can get it inductively from an indirect superinterface just
+% by checking whether the direct superinterfaces "have" a method signature
+% with the relevant name and a corresponding parameter, and then checking
+% that parameter. The same approach is applicable for covariant-by-class.
+
+\LMHash{}%
+Let $C$ be a class that declares a method $m$ which has
+a parameter $p$ whose declaration has the modifier \COVARIANT{};
+in this case we say that the parameter $p$ is
+\IndexCustom{covariant-by-declaration}{parameter!covariant-by-declaration}.
+%
+In this case the interface of $C$ has the method signature $m$,
+and that signature has the parameter $p$;
+we also say that the parameter $p$ in this method signature is
+\NoIndex{covariant-by-declaration}.
+%
+Finally, the parameter $p$ of the method signature $m$
+of the interface of a class $C$ is
+\NoIndex{covariant-by-declaration}
+if a direct superinterface of $C$
+has an accessible method signature $m'$ with the same name as $m$,
+which has a parameter $p'$ that corresponds to $p$,
+such that $p'$ is covariant-by-declaration.
+
+\LMHash{}%
+Assume that $C$ is a generic class with formal type parameter declarations
+\code{$X_1\ \EXTENDS\ B_1 \ldots,\ X_s\ \EXTENDS\ B_s$},
+let $m$ be a declaration of an instance method in $C$
+(which can be a method, a setter, or an operator),
+let $p$ be a parameter declared by $m$, and
+let $T$ be the declared type of $p$.
+%
+The parameter $p$ is
+\IndexCustom{covariant-by-class}{parameter!covariant-by-class}
+if, for any $j \in 1 .. s$,
+$X_j$ occurs in a covariant or an invariant position in $T$.
+%
+In this case the interface of $C$ also has the method signature $m$,
+and that signature has the parameter $p$;
+we also say that the parameter $p$ in this method signature is
+\NoIndex{covariant-by-class}.
+Finally, the parameter $p$ of the method signature $m$
+of the interface of the class $C$ is
+\NoIndex{covariant-by-class}
+if a direct superinterface of $C$
+has an accessible method signature $m'$ with the same name as $m$,
+which has a parameter $p'$ that corresponds to $p$,
+such that $p'$ is covariant-by-class.
+
+\LMHash{}%
+A formal parameter $p$ is
+\IndexCustom{covariant}{parameter!covariant}
+if $p$ is covariant-by-declaration or $p$ is covariant-by-class.
+
+\commentary{
+It is possible for a parameter to be simultaneously
+covariant-by-declaration and covariant-by-class.
+Note that a parameter may be
+covariant-by-declaration or covariant-by-class
+based on a declaration in any direct or indirect superinterface,
+including any superclass:
+The definitions above propagate these properties
+to an interface from each of its direct superinterfaces,
+but they will in turn receive the property from their direct superinterfaces,
+and so on.
+}
+
+
 \subsection{Type of a Function}
 \LMLabel{typeOfAFunction}
 
-\LMHash{}
-If a function declaration does not declare a return type explicitly, its return type is \DYNAMIC{} (\ref{typeDynamic}),
-unless it is a constructor function, in which case its return type is the immediately enclosing class,
-or it is a setter or operator \code{[]=}, in which case its return type is \VOID{}.
+\LMHash{}%
+This section specifies the static type which is ascribed to
+the function denoted by a function declaration,
+and the dynamic type of the corresponding function object.
 
-\LMHash{}
+\LMHash{}%
+In this specification,
+the notation used to denote the type of a function follows
+the syntax of the language, except that \EXTENDS{} is abbreviated to
+\FunctionTypeExtends.
+This means that every function type is of one of the forms
+\FunctionTypePositionalStd{T_0}
+\FunctionTypeNamedStd{T_0}
+
+\noindent
+where $T_0$ is the return type,
+$X_j$ are the formal type parameters with bounds $B_j$, $j \in 1 .. s$,
+$T_j$ are the formal parameter types for $j \in 1 .. n + k$.
+Non-generic function types are covered by the case $s = 0$,
+where the type parameter declaration list
+\code{<\ldots{}>}
+as a whole is omitted.
+%
+Similarly, the optional brackets \code{[]} and \code{\{\}} are omitted
+when there are no optional parameters.
+
+% We promise that the two forms always get the same treatment for k=0.
+\commentary{
+Both forms with optionals cover function types with no optionals when $k = 0$,
+and every rule in this specification is such that
+any of the two forms may be used without ambiguity
+to determine the treatment of function types with no optionals.
+}
+
+\LMHash{}%
+If a function declaration does not declare a return type explicitly,
+its return type is \DYNAMIC{} (\ref{typeDynamic}),
+unless it is a constructor,
+in which case it is not considered to have a return type,
+or it is a setter or operator \code{[]=},
+in which case its return type is \VOID{}.
+
+\LMHash{}%
 A function declaration may declare formal type parameters.
-The type of the function includes the names of the type parameters and their upper bounds.
+The type of the function includes the names of the type parameters
+and for each type parameter the upper bound,
+which is considered to be the built-in class \code{Object} if no bound is specified.
 When consistent renaming of type parameters can make two function types identical,
 they are considered to be the same type.
 
 \commentary{
-It is convenient to include the type parameter names in function types because they are needed in order to express such things as relations among different type parameters, and F-bounds.
-However, we do not wish to distinguish two function types if they have the same structure and only differ in the choice of names.
+It is convenient to include the formal type parameter names in function types
+because they are needed in order to express such things as relations among
+different type parameters, F-bounds, and the types of formal parameters.
+However, we do not wish to distinguish between two function types if they have
+the same structure and only differ in the choice of names.
 This treatment of names is also known as alpha-equivalence.
 }
 
-\LMHash{}
+\LMHash{}%
 In the following three paragraphs,
-if the number $m$ of formal type parameters is zero then the type parameter list in the function type should be omitted.
+if the number $m$ of formal type parameters is zero then
+the type parameter list in the function type is omitted.
 
-\LMHash{}
+\LMHash{}%
 Let $F$ be a function with
-formal type parameters $X_1\ B_1, \ldots,\ X_m\ B_m$,
-required formal parameters $T_1\ p_1, \ldots,\ T_n\ p_n$,
-return type $T_0$
+type parameters \TypeParametersStd,
+required formal parameter types \List{T}{1}{n},
+return type $T_0$,
 and no optional parameters.
-Then the type of $F$ is
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n$) $ \rightarrow T_0$}.
+Then the static type of $F$ is
+\FunctionTypeAllRequiredStd{T_0}.
 
-\LMHash{}
+\LMHash{}%
 Let $F$ be a function with
-formal type parameters $X_1\ B_1, \ldots,\ X_m\ B_m$,
-required formal parameters $T_1\ p_1, \ldots,\ T_n\ p_n$,
+type parameters \TypeParametersStd,
+required formal parameter types  \List{T}{1}{n},
 return type $T_0$
-and positional optional parameters $T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}$.
-Then the type of $F$ is
+and positional optional parameter types \List{T}{n+1}{n+k}.
+Then the static type of $F$ is
+\FunctionTypePositionalStd{T_0}.
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}$]) $ \rightarrow T_0$}.
-
-\LMHash{}
+\LMHash{}%
 Let $F$ be a function with
-formal type parameters $X_1\ B_1, \ldots,\ X_m\ B_m$,
-required formal parameters $T_1\ p_1, \ldots,\ T_n\ p_n$,
-return type $T_0$
-and named optional parameters $T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}$.
-Then the type of $F$ is
+type parameters \TypeParametersStd,
+required formal parameter types \List{T}{1}{n},
+return type $T_0$,
+and named parameters \PairList{T}{x}{n+1}{n+k}.
+Then the static type of $F$ is
+\FunctionTypeNamedStd{T_0}.
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}$\}) $ \rightarrow T_0$}.
-
-\LMHash{}
-The run-time type of a function object always implements the class \FUNCTION{}.
-
+\LMHash{}%
+Let $T$ be the static type of a function declaration $F$.
+Let $u$ be the run-time type of a function object $o$ obtained by
+function closurization
+(\ref{functionClosurization})
+or instance method closurization
+(\ref{ordinaryMemberClosurization})
+applied to $F$,
+and let $t$ be the actual type corresponding to $T$
+at the occasion where $o$ was created
+(\ref{actualTypeOfADeclaration}).
+\commentary{$T$ may contain free type variables, but $t$ contains their actual values.}
+The following must then hold:
+$u$ is a class that implements the built-in class \FUNCTION{};
+$u$ is a subtype of $t$;
+and $u$ is not a subtype of any function type which is a proper subtype of $t$.
 \commentary{
-One cannot assume, based on the above, that given a function \code{f}, \code{f.runtimeType} will actually be \FUNCTION{}, or that any two distinct function objects necessarily have the same run-time type.
+If we had omitted the last requirement then
+\code{f \IS{} int\,\FUNCTION([int])}
+could evaluate to \TRUE{} with the declaration
+\code{\VOID{} f()\,\{\}},
+e.g., by letting $u$ be \code{Null}.
 }
 
 \rationale{
-It is up to the implementation to choose an appropriate representation for function objects.
-For example, consider that a function object produced via property extraction treats equality differently from other function objects, and is therefore likely a different class.
-Implementations may also use different classes for function objects based on arity and or type.
-Arity may be implicitly affected by whether a function is an instance method (with an implicit receiver parameter) or not.
-The variations are manifold, and so this specification only guarantees that function objects are instances of some class that implements \FUNCTION{}.
+It is up to the implementation to choose
+an appropriate representation for function objects.
+For example, consider that
+a function object produced via property extraction
+treats equality differently from other function objects,
+and is therefore likely a different class.
+Implementations may also use different classes for function objects
+based on arity and or type.
+Arity may be implicitly affected by whether a function is
+an instance method (with an implicit receiver parameter) or not.
+The variations are manifold and, e.g.,
+one cannot assume that any two distinct function objects
+will necessarily have the same run-time type.
 }
 
 
 \subsection{External Functions}
 \LMLabel{externalFunctions}
 
-\LMHash{}
-An {\em external function} is a function whose body is provided separately from its declaration.
+\LMHash{}%
+An \IndexCustom{external function}{function!external}
+is a function whose body is provided separately from its declaration.
 An external function may be a top-level function (\ref{librariesAndScripts}), a method (\ref{instanceMethods}, \ref{staticMethods}), a getter (\ref{getters}), a setter (\ref{setters}) or a non-redirecting constructor (\ref{generativeConstructors}, \ref{factories}).
 External functions are introduced via the built-in identifier \EXTERNAL{} (\ref{identifierReference}) followed by the function signature.
 
@@ -1345,22 +1724,24 @@
 
 \commentary{
 Examples of external functions might be foreign functions (defined in C, or Javascript etc.), primitives of the implementation (as defined by the Dart run-time system), or code that was dynamically generated but whose interface is statically known.
-However, an abstract method is different from an external function, as it has {\em no} body.
+However, an abstract method is different from an external function,
+as it has \emph{no} body.
 }
 
-\LMHash{}
+\LMHash{}%
 An external function is connected to its body by an implementation specific mechanism.
 Attempting to invoke an external function that has not been connected to its body will throw a \code{NoSuchMethodError} or some subclass thereof.
 
-\LMHash{}
+\LMHash{}%
 The actual syntax is given in sections \ref{classes} and \ref{librariesAndScripts} below.
 
 
 \section{Classes}
 \LMLabel{classes}
 
-\LMHash{}
-A {\em class} defines the form and behavior of a set of objects which are its {\em instances}.
+\LMHash{}%
+A \Index{class} defines the form and behavior of a set of objects which are its
+\IndexCustom{instances}{instance}.
 Classes may be defined by class declarations as described below, or via mixin applications (\ref{mixinApplication}).
 
 \begin{grammar}
@@ -1369,14 +1750,15 @@
   \gnewline{} `{' (<metadata> <classMemberDefinition>)* `}'
   \alt <metadata> \ABSTRACT{}? \CLASS{} <mixinApplicationClass>
 
-<mixins> ::= \WITH{} <typeList>
+<mixins> ::= \WITH{} <typeNotVoidList>
+
+<typeNotVoidList> ::= <typeNotVoid> (`,' <typeNotVoid>)*
 
 <classMemberDefinition> ::= <declaration> `;'
   \alt <methodSignature> <functionBody>
 
 <methodSignature> ::= <constructorSignature> <initializers>?
   \alt <factoryConstructorSignature>
-% This doesn't work: `static @override foo() => 42`, but `functionSignature` starts with metadata. https://github.com/dart-lang/sdk/issues/29614
   \alt \STATIC{}? <functionSignature>
   \alt \STATIC{}? <getterSignature>
   \alt \STATIC{}? <setterSignature>
@@ -1389,67 +1771,117 @@
   \alt ((\EXTERNAL{} \STATIC{}?))? <getterSignature>
   \alt ((\EXTERNAL{} \STATIC{}?))? <setterSignature>
   \alt \EXTERNAL{}? <operatorSignature>
-% This doesn't work: `static @override foo() => 42`, but `functionSignature` starts with metadata. https://github.com/dart-lang/sdk/issues/29614
   \alt ((\EXTERNAL{} \STATIC{}?))? <functionSignature>
   \alt \STATIC{} (\FINAL{} | \CONST{}) <type>? <staticFinalDeclarationList>
-%      \CONST{} type? staticFinalDeclarationList;
   \alt \FINAL{} <type>? <initializedIdentifierList>
   \alt (\STATIC{} | \COVARIANT{})? (\VAR{} | <type>) <initializedIdentifierList>
 
-<staticFinalDeclarationList> ::= <staticFinalDeclaration> (`,' <staticFinalDeclaration>)*
+<staticFinalDeclarationList> ::= \gnewline{}
+  <staticFinalDeclaration> (`,' <staticFinalDeclaration>)*
 
 <staticFinalDeclaration> ::= <identifier> `=' <expression>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 It is possible to include the modifier \COVARIANT{} in some forms of declarations.
-This modifier has no effect.
+The effect of doing this is described elsewhere
+(\ref{covariantParameters}).
 
-\rationale{
-The modifier \COVARIANT{} is used in strong mode.
-The modifier is allowed here even though it has no effect, such that source code can be used in both contexts.
-}
-
-\LMHash{}
+\LMHash{}%
 A class has constructors, instance members and static members.
-The instance members of a class are its instance methods, getters, setters and instance variables.
-The static members of a class are its static methods, getters, setters and class variables.
-The members of a class are its static and instance members.
+The \IndexCustom{instance members}{members!instance} of a class
+are its instance methods, getters, setters and instance variables.
+The \IndexCustom{static members}{members!static} of a class
+are its static methods, getters, setters and class variables.
+The \IndexCustom{members}{members} of a class
+are its static and instance members.
 
-\LMHash{}
+\LMHash{}%
 A class has several scopes:
 \begin{itemize}
-\item A {\em type-parameter scope}, which is empty if the class is not generic (\ref{generics}).
+\item A \IndexCustom{type-parameter scope}{scope!type parameter},
+  which is empty if the class is not generic (\ref{generics}).
 The enclosing scope of the type-parameter scope of a class is the enclosing scope of the class declaration.
-\item A {\em static scope}.
+\item A \IndexCustom{static scope}{scope!static}.
 The enclosing scope of the static scope of a class is the type parameter scope (\ref{generics}) of the class.
-\item An {\em instance scope}.
+\item An \IndexCustom{instance scope}{scope!instance}.
 The enclosing scope of a class' instance scope is the class' static scope.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 The enclosing scope of an instance member declaration is the instance scope of the class in which it is declared.
 
-\LMHash{}
+\LMHash{}%
 The enclosing scope of a static member declaration is the static scope of the class in which it is declared.
 
-\LMHash{}
+\LMHash{}%
 Every class has a single superclass except class \code{Object} which has no superclass.
 A class may implement a number of interfaces by declaring them in its implements clause (\ref{superinterfaces}).
 
-\LMHash{}
-An {\em abstract class} is a class that is explicitly declared with the \ABSTRACT{} modifier, either by means of a class declaration or via a type alias (\ref{typedef}) for a mixin application (\ref{mixinApplication}).
-A {\em concrete class} is a class that is not abstract.
+\LMHash{}%
+An \IndexCustom{abstract class declaration}{class declaration!abstract}
+is a class declaration that is explicitly declared
+with the \ABSTRACT{} modifier.
+A \IndexCustom{concrete class declaration}{class declaration!concrete}
+is a class declaration that is not abstract.
+An \IndexCustom{abstract class}{class!abstract} is a class
+whose declaration is abstract, and
+a \IndexCustom{concrete class}{class!concrete} is a class
+whose declaration is concrete.
 
 \rationale{
 We want different behavior for concrete classes and abstract classes.
-If $A$ is intended to be abstract, we want the static checker to warn about any attempt to instantiate $A$, and we do not want the checker to complain about unimplemented methods in $A$.
-In contrast, if $A$ is intended to be concrete, the checker should warn about all unimplemented methods, but allow clients to instantiate it freely.
+If $A$ is intended to be abstract,
+we want the static checker to warn about any attempt to instantiate $A$,
+and we do not want the checker to complain about unimplemented methods in $A$.
+In contrast, if $A$ is intended to be concrete,
+the checker should warn about all unimplemented methods,
+but allow clients to instantiate it freely.
 }
 
-\LMHash{}
-The {\em interface of class $C$} is an implicit interface that declares instance members that correspond to the instance members declared by $C$, and whose direct superinterfaces are the direct superinterfaces of $C$ (\ref{superinterfaces}).
-When a class name appears as a type, that name denotes the interface of the class.
+\commentary{
+The interface of a class $C$ is
+an implicit interface that declares instance member signatures
+that correspond to the instance members declared by $C$,
+and whose direct superinterfaces are
+the direct superinterfaces of $C$
+(\ref{interfaces}, \ref{superinterfaces}).
+}
+
+\LMHash{}%
+When a class name appears as a type,
+that name denotes the interface of the class.
+
+\LMHash{}%
+% The use of 'concrete member' below may seem redundant, because a class
+% does not inherit abstract members from its superclass, but this
+% underscores the fact that even when an abstract declaration of $m$ is
+% declared in $C$, $C$ does not "have" $m$.
+A concrete class must fully implement its interface:
+Let $C$ be a concrete class with interface $I$.
+Assume that $I$ has an accessible member signature $m$.
+It is a compile-time error if $C$ does not have
+a concrete accessible member with the same name as $m$,
+unless $C$ has a non-trivial \code{noSuchMethod}
+(\ref{theMethodNoSuchMethod}).
+It is a compile-time error if $C$ has
+a concrete accessible member with the same name as $m$,
+with a method signature $m'$ which is not a correct override of $m$
+(\ref{correctMemberOverrides}),
+unless that concrete member is a \code{noSuchMethod} forwarder
+(\ref{theMethodNoSuchMethod}).
+
+\commentary{
+In particular, it is an error for a class to be concrete even if it inherits
+a member implementation for every member signature in its interface,
+unless each of them has parameters and types such that they satisfy
+the corresponding member signature.
+But when there is a non-trivial \code{noSuchMethod} it is allowed
+to leave some members unimplemented,
+and it is allowed to to have a \code{noSuchMethod} forwarder which does not
+satisfy the class interface
+(in which case it will be overridden by another \code{noSuchMethod} forwarder).
+}
 
 % making an exception for the setters generated for final fields is tempting but problematic.
 % If a super type defines a setter, it will be overridden yet have no impact on the interface.
@@ -1465,7 +1897,9 @@
 
 \commentary{
 Here are simple examples, that illustrate the difference between ``has a member'' and ``declares a member''.
-For example, \code{B} {\em declares} one member named \code{f}, but {\em has} two such members.
+For example, \code{B} \IndexCustom{declares}{declares member}
+ one member named \code{f},
+but \IndexCustom{has}{has member} two such members.
 The rules of inheritance determine what members a class has.
 }
 
@@ -1486,7 +1920,7 @@
 \}
 \end{dartCode}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a class named $C$ declares
 a member with basename (\ref{classMemberConflicts}) $C$.
 If a generic class named $G$ declares a type variable named $X$,
@@ -1499,34 +1933,84 @@
 \subsection{Instance Methods}
 \LMLabel{instanceMethods}
 
-\LMHash{}
-Instance methods are functions (\ref{functions}) whose declarations are immediately contained within a class declaration and that are not declared \STATIC{}.
-The instance methods of a class $C$ are those instance methods declared by $C$ and the instance methods inherited by $C$ from its superclass.
+\LMHash{}%
+\IndexCustom{Instance methods}{method!instance}
+are functions (\ref{functions})
+whose declarations are immediately contained within a class declaration
+and that are not declared \STATIC{}.
+The \Index{instance methods of a class} $C$ are the instance methods declared by $C$
+and the instance methods inherited by $C$ from its superclass
+(\ref{inheritanceAndOverriding}).
 
-\LMHash{}
-It is a compile-time error if an instance method $m_1$ overrides (\ref{inheritanceAndOverriding}) an instance member $m_2$ and $m_1$ has a greater number of required parameters than $m_2$.
-It is a compile-time error if an instance method $m_1$ overrides an instance member $m_2$ and $m_1$ has fewer positional parameters than $m_2$.
-It is a compile-time error if an instance method $m_1$ overrides an instance member $m_2$ and $m_1$ does not declare all the named parameters declared by $m_2$.
-
-\LMHash{}
-%% TODO(eernst): We need to use the concept of 'correctly overrides' rather than 'is a subtype of', e.g., to treat `void` correctly.
-It is a compile-time error if an instance method $m_1$ overrides an instance member $m_2$ and the type of $m_1$ is not a subtype of the type of $m_2$.
-It is a compile-time warning if an instance method $m_1$ overrides an instance member $m_2$, the signature of $m_2$ explicitly specifies a default value for a formal parameter $p$, and the signature of $m_1$ implies a different default value for $p$.
+\LMHash{}%
+Consider a class $C$.
+It is a compile-time error if an instance method declaration in $C$ has
+a member signature $m$
+(\ref{interfaces})
+% Note that $m'$ is accessible, due to the definition of 'overrides'.
+which overrides a member signature $m'$
+from a direct superinterface of $C$
+(\ref{interfaceInheritanceAndOverriding}),
+unless this is a correct member override
+(\ref{correctMemberOverrides}).
 
 \commentary{
-A method declaration may conflict with other declarations
+This is not the only kind of conflict that may exist:
+An instance member declaration $D$ may conflict with another declaration $D'$,
+even in the case where they do not have the same name
+or they are not the same kind of declaration.
+E.g., $D$ could be an instance getter and $D'$ a static setter
 (\ref{classMemberConflicts}).
 }
 
+\LMHash{}%
+For each parameter $p$ of $m$ where \COVARIANT{} is present,
+it is a compile-time error if there exists
+a direct or indirect superinterface $J$ of $C$ which has
+an accessible method signature $m''$ with the same name as $m$,
+such that $m''$ has a parameter $p''$ that corresponds to $p$
+(\ref{covariantParameters}),
+unless the type of $p$ is assignable to the type of $p''$.
+
+\commentary{
+This means that
+a parameter which is covariant-by-declaration can have a type
+which is a supertype or a subtype of the type of
+a corresponding parameter in a superinterface,
+but the two types cannot be unrelated.
+Note that this requirement must be satisfied
+for each direct or indirect superinterface separately,
+because assignability is not transitive.
+}
+
+\rationale{
+The superinterface may be the statically known type of the receiver,
+so this means that we relax the potential typing relationship
+between the statically known type of a parameter and the
+type which is actually required at run time
+to the assignability relationship,
+rather than the strict supertype relationship
+which applies to a parameter which is not covariant.
+It should be noted that it is not statically known
+at the call site whether any given parameter is covariant,
+because the covariance could be introduced in
+a proper subtype of the statically known type of the receiver.
+We chose to give priority to flexibility rather than safety here,
+because the whole point covariant parameters is that developers
+can make the choice to increase the flexibility
+in a trade-off where some static type safety is lost.
+}
+
 
 \subsubsection{Operators}
 \LMLabel{operators}
 
-\LMHash{}
-{\em Operators} are instance methods with special names.
+\LMHash{}%
+\IndexCustom{Operators}{operators} are instance methods with special names.
 
 \begin{grammar}
-<operatorSignature> ::= <returnType>? \OPERATOR{} <operator> <formalParameterList>
+<operatorSignature> ::= \gnewline{}
+  <type>? \OPERATOR{} <operator> <formalParameterList>
 
 <operator> ::= `~'
   \alt <binaryOperator>
@@ -1541,10 +2025,10 @@
   \alt <bitwiseOperator>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 An operator declaration is identified using the built-in identifier (\ref{identifierReference}) \OPERATOR{}.
 
-\LMHash{}
+\LMHash{}%
 The following names are allowed for user-defined operators:
 \syntax{`<'},
 \syntax{`>'},
@@ -1567,7 +2051,7 @@
 \syntax{`[]'},
 \syntax{`~'}.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the arity of the user-declared operator
 \syntax{`[]='} is not 2.
 It is a compile-time error if the arity of a user-declared operator with one of the names:
@@ -1601,23 +2085,23 @@
 If it has an argument, it denotes binary subtraction.
 }
 
-\LMHash{}
+\LMHash{}%
 The name of the unary operator \syntax{`-'} is \code{unary-}.
 
 \rationale{
 This device allows the two methods to be distinguished for purposes of method lookup, override and reflection.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the arity of the user-declared operator
 \syntax{`~'}
 is not 0.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error to declare an optional parameter in an operator.
 
-\LMHash{}
-It is a compile-time warning if the return type of a user-declared operator
+\LMHash{}%
+It is a static warning if the return type of a user-declared operator
 \syntax{`[]='}
 is explicitly declared and not \VOID{}.
 
@@ -1646,7 +2130,7 @@
 \subsubsection{The Method \code{noSuchMethod}}
 \LMLabel{theMethodNoSuchMethod}
 
-\LMHash{}
+\LMHash{}%
 The method \code{noSuchMethod} is invoked implicitly during execution
 in situations where one or more member lookups fail
 (\ref{ordinaryInvocation},
@@ -1677,8 +2161,8 @@
 as explained below.
 }
 
-\LMHash{}
-We say that a class $C$ {\em has a non-trivial \code{noSuchMethod}}
+\LMHash{}%
+We say that a class $C$ \Index{has a non-trivial \code{noSuchMethod}}
 if $C$ has a concrete member named \code{noSuchMethod}
 which is distinct from the one declared in the built-in class \code{Object}.
 
@@ -1717,10 +2201,10 @@
 \}
 \end{dartCode}
 
-\LMHash{}
+\LMHash{}%
 Let $C$ be a concrete class and
 let $L$ be the library that contains the declaration of $C$.
-The member $m$ is {\em noSuchMethod forwarded in} $C$ if{}f
+The member $m$ is \Index{noSuchMethod forwarded} in $C$ if{}f
 one of the following is true:
 
 \begin{itemize}
@@ -1740,10 +2224,11 @@
   a concrete declaration of $m$ accessible to $L_2$.
 \end{itemize}
 
-\LMHash{}
-For a concrete class $C$, a {\em \code{noSuchMethod} forwarder}
+\LMHash{}%
+For a concrete class $C$, a
+\IndexCustom{\code{noSuchMethod} forwarder}{noSuchMethod forwarder}
 is implicitly induced for each member $m$
-which is \code{noSuchMethod} forwarded.
+which is noSuchMethod forwarded.
 This is a concrete member of $C$
 with the signature taken from the interface of $C$ respectively $D$ above,
 and with the same default value for each optional parameter.
@@ -1792,11 +2277,11 @@
 because compilers control the treatment of private names.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a concrete class $C$ has
 a \code{noSuchMethod} forwarded method signature $S$
 for a method named $m$,
-and a superclass of $C$ has a concrete declaration of $m$
+and a superclass of $C$ has an accessible concrete declaration of $m$
 which is not a \code{noSuchMethod} forwarder.
 
 \commentary{
@@ -1846,7 +2331,7 @@
 and hence there is no error in that situation.
 }
 
-\LMHash{}
+\LMHash{}%
 For the dynamic semantics,
 assume that a class $C$ has an implicitly induced
 \code{noSuchMethod} forwarder named $m$,
@@ -1866,7 +2351,7 @@
 because the former is covered by $m = 0$.
 }
 
-\LMHash{}
+\LMHash{}%
 The execution of the body of $m$ creates
 an instance $im$ of the predefined class \code{Invocation}
 such that:
@@ -1888,7 +2373,7 @@
   \code{<Type>[$X_1, \ldots,\ X_r$]}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Next, \code{noSuchMethod} is invoked with $i$ as the actual argument,
 and the result obtained from there is returned by the execution of $m$.
 
@@ -1938,83 +2423,91 @@
 \subsection{Getters}
 \LMLabel{getters}
 
-\LMHash{}
+\LMHash{}%
 Getters are functions (\ref{functions}) that are used to retrieve the values of object properties.
 
 \begin{grammar}
-<getterSignature> ::= <returnType>? \GET{} <identifier>
+<getterSignature> ::= <type>? \GET{} <identifier>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 If no return type is specified, the return type of the getter is \DYNAMIC{}.
 
-\LMHash{}
+\LMHash{}%
 A getter definition that is prefixed with the \STATIC{} modifier defines a static getter.
 Otherwise, it defines an instance getter.
 The name of the getter is given by the identifier in the definition.
-The effect of a static getter declaration in class $C$ is to add an instance getter with the same name and signature to the \code{Type} object for class $C$ that forwards (\ref{functionDeclarations}) to the static getter.
 
-\LMHash{}
-The instance getters of a class $C$ are those instance getters declared by $C$, either implicitly or explicitly, and the instance getters inherited by $C$ from its superclass.
-The static getters of a class $C$ are those static getters declared by $C$.
+\LMHash{}%
+The \Index{instance getters of a class} $C$ are
+those instance getters declared by $C$,
+either implicitly or explicitly,
+and the instance getters inherited by $C$ from its superclass.
+The \Index{static getters of a class} $C$ are
+those static getters declared by $C$.
 
 \commentary{
 A getter declaration may conflict with other declarations
 (\ref{classMemberConflicts}).
 In particular, a getter can never override a method,
 and a method can never override a getter or an instance variable.
+The rules for when a getter correctly overrides another member
+are given elsewhere
+(\ref{correctMemberOverrides}).
 }
 
-\LMHash{}
-It is a compile-time error if a getter $m_1$ overrides (\ref{inheritanceAndOverriding}) a getter $m_2$
-and the return type of $m_1$ is not a subtype of the return type of $m_2$.
-
 
 \subsection{Setters}
 \LMLabel{setters}
 
-\LMHash{}
+\LMHash{}%
 Setters are functions (\ref{functions}) that are used to set the values of object properties.
 
 \begin{grammar}
-<setterSignature> ::= <returnType>? \SET{} <identifier> <formalParameterList>
+<setterSignature> ::= <type>? \SET{} <identifier> <formalParameterList>
 \end{grammar}
 
 \commentary{
 If no return type is specified, the return type of the setter is \VOID{} (\ref{typeOfAFunction}).
 }
 
-\LMHash{}
+\LMHash{}%
 A setter definition that is prefixed with the \STATIC{} modifier defines a static setter.
 Otherwise, it defines an instance setter.
 The name of a setter is obtained by appending the string `=' to the identifier given in its signature.
-The effect of a static setter declaration in class $C$ is to add an instance setter with the same name and signature to the \code{Type} object for class $C$ that forwards (\ref{functionDeclarations}) to the static setter.
 
 \commentary{
 Hence, a setter name can never conflict with, override or be overridden by a getter or method.
 }
 
-\LMHash{}
-The instance setters of a class $C$ are those instance setters declared by $C$ either implicitly or explicitly, and the instance setters inherited by $C$ from its superclass.
-The static setters of a class $C$ are those static setters declared by $C$.
+\LMHash{}%
+The \Index{instance setters of a class} $C$ are
+those instance setters declared by $C$
+either implicitly or explicitly,
+and the instance setters inherited by $C$ from its superclass.
+The \Index{static setters of a class} $C$ are
+those static setters declared by $C$,
+either implicitly or explicitly.
 
-\LMHash{}
-It is a compile-time error if a setter's formal parameter list does not consist of exactly one required formal parameter $p$.
+\LMHash{}%
+It is a compile-time error if a setter's formal parameter list
+does not consist of exactly one required formal parameter $p$.
 \rationale{
 We could enforce this via the grammar, but we'd have to specify the evaluation rules in that case.
 }
 
-\LMHash{}
-It is a compile-time warning if a setter declares a return type other than \VOID{}.
-It is a compile-time error if a setter $m_1$ overrides (\ref{inheritanceAndOverriding}) a setter $m_2$
-and the parameter type of $m_1$ is not a supertype of the parameter type of $m_2$.
-It is a compile-time warning if a class has
-a setter named $v=$ with argument type $T$ and
+\LMHash{}%
+It is a static warning if a setter declares a return type other than \VOID{}.
+It is a static warning if a class has
+a setter named \code{$v$=} with argument type $T$ and
 a getter named $v$ with return type $S$,
 and $S$ may not be assigned to $T$.
 
 \commentary{
-A setter declaration may conflict with other declarations
+The rules for when a setter correctly overrides another member
+are given elsewhere
+(\ref{correctMemberOverrides}).
+A setter declaration may conflict with other declarations as well
 (\ref{classMemberConflicts}).
 }
 
@@ -2022,19 +2515,28 @@
 \subsection{Abstract Instance Members}
 \LMLabel{abstractInstanceMembers}
 
-\LMHash{}
-An {\em abstract method} (respectively, {\em abstract getter} or {\em abstract setter)} is an instance method, getter or setter that is not declared \EXTERNAL{} and does not provide an implementation.
-A {\em concrete method} (respectively, {\em concrete getter} or {\em concrete setter)} is an instance method, getter or setter that is not abstract.
+\LMHash{}%
+An \IndexCustom{abstract method}{method!abstract}
+(respectively,
+\IndexCustom{abstract getter}{getter!abstract} or
+\IndexCustom{abstract setter}{setter!abstract})
+is an instance method, getter or setter that is not declared \EXTERNAL{} and does not provide an implementation.
+A \IndexCustom{concrete method}{method!concrete}
+(respectively,
+\IndexCustom{concrete getter}{getter!concrete} or
+\IndexCustom{concrete setter}{setter!concrete})
+is an instance method, getter or setter that is not abstract.
 
 \rationale{
-Earlier versions of Dart required that abstract members be identified by prefixing them with the modifier \ABSTRACT{}.
-The elimination of this requirement is motivated by the desire to use abstract classes as interfaces.
-Every Dart class induces an implicit interface.
-
-Using an abstract class instead of an interface has important advantages.
-An abstract class can provide default implementations; it can also provide static methods, obviating the need for service classes such as \code{Collections} or \code{Lists}, whose entire purpose is to group utilities related to a given type.
-
-Eliminating the requirement for an explicit modifier on members makes abstract classes more concise, making abstract classes an attractive substitute for interface declarations.
+Abstract instance members are useful because of their interplay with classes.
+Every Dart class induces an implicit interface,
+and Dart does not support specifying interfaces explicitly.
+Using an abstract class instead of a traditional interface
+has important advantages.
+An abstract class can provide default implementations.
+It can also provide static methods,
+obviating the need for service classes such as \code{Collections} or \code{Lists},
+whose entire purpose is to group utilities related to a given type.
 }
 
 \commentary{
@@ -2050,22 +2552,12 @@
 }
 
 \rationale{
-The purpose of an abstract method is to provide a declaration for purposes such as type checking and reflection.
-In classes used as mixins, it is often useful to introduce such declarations for methods that the mixin expects will be provided by the superclass the mixin is applied to.
+The purpose of an abstract method is to provide a declaration
+for purposes such as type checking and reflection.
+In mixins, it is often useful to introduce such declarations for methods that
+the mixin expects will be provided by the superclass the mixin is applied to.
 }
 
-\LMHash{}
-%% TODO(eernst): This is semi-redundant: We should define what it means for
-%% a class to be 'fully implemented' and require once and for all that it is
-%% a compile-time error if a concrete class is not fully implemented. That
-%% is very nearly what line 2706++ already says. This will then be commentary,
-%% just focusing on the case where a concrete $C$ _declares_ an abstract $m$.
-It is a compile-time error if an abstract member $m$ is declared or inherited in a concrete class $C$ unless:
-\begin{itemize}
-\item $m$ overrides a concrete member, or
-\item $C$ has a concrete \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
-\end{itemize}
-
 \rationale{
 We wish to detect if one declares a concrete class with abstract members.
 However, code like the following should work:
@@ -2093,11 +2585,16 @@
 \subsection{Instance Variables}
 \LMLabel{instanceVariables}
 
-\LMHash{}
-Instance variables are variables whose declarations are immediately contained within a class declaration and that are not declared \STATIC{}.
-The instance variables of a class $C$ are those instance variables declared by $C$ and the instance variables inherited by $C$ from its superclass.
+\LMHash{}%
+\IndexCustom{Instance variables}{variables!instance}
+are variables whose declarations
+are immediately contained within a class declaration
+and that are not declared \STATIC{}.
+The \Index{instance variables of a class} $C$ are
+the instance variables declared by $C$
+and the instance variables inherited by $C$ from its superclass.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if an instance variable is declared to be constant.
 
 \rationale{
@@ -2112,20 +2609,37 @@
 An instance getter for it can always be defined manually if desired.
 }
 
+\LMHash{}%
+It is possible for the declaration of an instance variable
+to include the modifier \COVARIANT{}
+(\ref{variables}).
+The effect of this is that the formal parameter of
+the corresponding implicitly induced setter
+is considered to be covariant-by-declaration
+(\ref{covariantParameters}).
+
+\commentary{
+The modifier \COVARIANT{} on an instance variable has no other effects.
+In particular, the return type of the implicitly induced getter
+can already be overridden covariantly without \COVARIANT{},
+and it can never be overridden to a supertype or an unrelated type,
+regardless of whether the modifier \COVARIANT{} is present.
+}
+
 
 \subsection{Constructors}
 \LMLabel{constructors}
 
-\LMHash{}
-A {\em constructor} is a special function that is used in instance creation expressions (\ref{instanceCreation}) to obtain objects, typically by creating or initializing them.
+\LMHash{}%
+A \Index{constructor} is a special function that is used in instance creation expressions (\ref{instanceCreation}) to obtain objects, typically by creating or initializing them.
 Constructors may be generative (\ref{generativeConstructors}) or they may be factories (\ref{factories}).
 
-\LMHash{}
-A {\em constructor name} always begins with the name of its immediately enclosing class, and may optionally be followed by a dot and an identifier \id.
+\LMHash{}%
+A \Index{constructor name} always begins with the name of its immediately enclosing class, and may optionally be followed by a dot and an identifier \id.
 It is a compile-time error if the name of a constructor is not a constructor name.
 
-\LMHash{}
-The {\em function type of a constructor} $k$ is the function type whose
+\LMHash{}%
+The \Index{function type of a constructor} $k$ is the function type whose
 return type is the class that contains the declaration of $k$,
 and whose formal parameter types, optionality, and names of named parameters
 correspond to the declaration of $k$.
@@ -2150,35 +2664,44 @@
 
 % The enclosing scope of a generative constructor is the instance scope of the class in which it is declared (but what about redirecting?)
 
-\LMHash{}
+\LMHash{}%
 If{}f no constructor is specified for a class $C$, it implicitly has a default constructor \code{C() : \SUPER{}() \{\}}, unless $C$ is class \code{Object}.
 
 
 \subsubsection{Generative Constructors}
 \LMLabel{generativeConstructors}
 
-\LMHash{}
-A {\em generative constructor} consists of a constructor name, a constructor parameter list, and either a redirect clause or an initializer list and an optional body.
+\LMHash{}%
+A \IndexCustom{generative constructor}{constructor!generative}
+declaration consists of a constructor name, a constructor parameter list,
+and either a redirect clause or an initializer list and an optional body.
 
 \begin{grammar}
-<constructorSignature> ::= <identifier> (`.' <identifier>)? <formalParameterList>
+<constructorSignature> ::= \gnewline{}
+  <identifier> (`.' <identifier>)? <formalParameterList>
 \end{grammar}
 
-\LMHash{}
-A {\em constructor parameter list} is a parenthesized, comma-separated list of formal constructor parameters.
-A {\em formal constructor parameter} is either a formal parameter (\ref{formalParameters}) or an initializing formal.
-An {\em initializing formal} has the form \code{\THIS{}.\id}, where \id{} is the name of an instance variable of the immediately enclosing class.
+\LMHash{}%
+A \Index{constructor parameter list} is a parenthesized, comma-separated list of formal constructor parameters.
+A \Index{formal constructor parameter} is either a formal parameter (\ref{formalParameters}) or an initializing formal.
+An \Index{initializing formal} has the form \code{\THIS{}.\id}, where \id{} is the name of an instance variable of the immediately enclosing class.
 It is a compile-time error if \id{} is not an instance variable of the immediately enclosing class.
 It is a compile-time error if an initializing formal is used by a function other than a non-redirecting generative constructor.
 
-\LMHash{}
+\LMHash{}%
 If an explicit type is attached to the initializing formal, that is its static type.
 Otherwise, the type of an initializing formal named \id{} is $T_{id}$, where $T_{id}$ is the type of the instance variable named \id{} in the immediately enclosing class.
 It is a compile-time error if the static type of \id{} is not a subtype of $T_{id}$.
 
-\LMHash{}
-Initializing formals constitute an exception to the rule that every formal parameter introduces a local variable into the formal parameter scope (\ref{formalParameters}).
-When the formal parameter list of a non-redirecting generative constructor contains any initializing formals, a new scope is introduced, the {\em formal parameter initializer scope}, which is the current scope of the initializer list of the constructor, and which is enclosed in the scope where the constructor is declared.
+\LMHash{}%
+Initializing formals constitute an exception to the rule that
+every formal parameter introduces a local variable into
+the formal parameter scope (\ref{formalParameters}).
+When the formal parameter list of a non-redirecting generative constructor
+contains any initializing formals, a new scope is introduced, the
+\IndexCustom{formal parameter initializer scope}{scope!formal parameter initializer},
+which is the current scope of the initializer list of the constructor,
+and which is enclosed in the scope where the constructor is declared.
 Each initializing formal in the formal parameter list introduces a final local variable into the formal parameter initializer scope, but not into the formal parameter scope; every other formal parameter introduces a local variable into both the formal parameter scope and the formal parameter initializer scope.
 
 \commentary{
@@ -2187,9 +2710,10 @@
 The type of the constructor is defined in terms of its formal parameters, including the initializing formals.
 }
 
-\LMHash{}
+\LMHash{}%
 Initializing formals are executed during the execution of generative constructors detailed below.
 Executing an initializing formal \code{\THIS{}.\id} causes the instance variable \id{} of the immediately surrounding class to be assigned the value of the corresponding actual parameter,
+%% TODO(eernst): This should be a compile-time error -- check, revise if true!
 unless \id{} is a final variable that has already been initialized, in which case a run-time error occurs.
 
 \commentary{
@@ -2214,8 +2738,8 @@
 \}
 \end{dartCode}
 
-\LMHash{}
-A {\em fresh instance} is an instance whose identity is distinct from any previously allocated instance of its class.
+\LMHash{}%
+A \Index{fresh instance} is an instance whose identity is distinct from any previously allocated instance of its class.
 A generative constructor always operates on a fresh instance of its immediately enclosing class.
 
 \commentary{
@@ -2224,15 +2748,17 @@
 See the section on instance creation (\ref{instanceCreation}).
 }
 
-\LMHash{}
+\LMHash{}%
 If a generative constructor $c$ is not a redirecting constructor and no body is provided, then $c$ implicitly has an empty body \code{\{\}}.
 
 
 \paragraph{Redirecting Generative Constructors}
 \LMLabel{redirectingGenerativeConstructors}
 
-\LMHash{}
-A generative constructor may be {\em redirecting}, in which case its only action is to invoke another generative constructor.
+\LMHash{}%
+A generative constructor may be
+\IndexCustom{redirecting}{constructor!redirecting},
+in which case its only action is to invoke another generative constructor.
 A redirecting constructor has no body;
 instead, it has a redirect clause that specifies which constructor the invocation is redirected to, and with which arguments.
 
@@ -2242,7 +2768,7 @@
 
 \def\ConstMetavar{\mbox{\CONST{}?}}
 
-\LMHash{}
+\LMHash{}%
 Assume that
 \code{$C$<$X_1\ \EXTENDS\ B_1 \ldots,\ X_m\ \EXTENDS\ B_m$>}
 is the name and formal type parameters of the enclosing class,
@@ -2262,8 +2788,10 @@
 
 \code{$\THIS{}.\id$($e_1 \ldots,\ e_p,\ x_1$: $e_{p+1}, \ldots,\ x_q$: $e_{p+q}$)}
 
-\LMHash{}
-The {\em redirectee constructor} for this declaration is then the constructor denoted by
+\LMHash{}%
+The
+\IndexCustom{redirectee constructor}{constructor!redirectee}
+for this declaration is then the constructor denoted by
 \code{$C$<$X_1 \ldots,\ X_m$>} respectively \code{$C$<$X_1 \ldots,\ X_m$>.\id}.
 It is a compile-time error if the static argument list type (\ref{actualArgumentLists}) of
 \code{($e_1 \ldots,\ e_p,\ x_1$: $e_{p+1}, \ldots,\ x_q$: $e_{p+q}$)}
@@ -2286,14 +2814,14 @@
 actual arguments to function invocations in general.
 }
 
-\LMHash{}
+\LMHash{}%
 When $\ConstMetavar$ is \CONST{},
 it is a compile-time error if the redirectee is not a constant constructor.
 Moreover, when $\ConstMetavar$ is \CONST{}, each
 $e_i,\ i \in 1 .. p+q$,
 must be a potentially constant expression (\ref{constantConstructors}).
 
-\LMHash{}
+\LMHash{}%
 It is a dynamic type error if an actual argument passed in an invocation of a redirecting generative constructor $k$
 is not a subtype of the actual type (\ref{actualTypeOfADeclaration})
 of the corresponding formal parameter in the declaration of $k$.
@@ -2306,15 +2834,19 @@
 \paragraph{Initializer Lists}
 \LMLabel{initializerLists}
 
-\LMHash{}
-An initializer list begins with a colon, and consists of a comma-separated list of individual {\em initializers}.
+\LMHash{}%
+An initializer list begins with a colon, and consists of a comma-separated list of individual \Index{initializers}.
 
 \commentary{
 There are three kinds of initializers.
 \begin{itemize}
-\item[$\bullet$] A {\em superinitializer} identifies a {\em superconstructor}\,---\,that is, a specific constructor of the superclass.
-Execution of the superinitializer causes the initializer list of the superconstructor to be executed.
-\item[$\bullet$] An {\em instance variable initializer} assigns a value to an individual instance variable.
+\item[$\bullet$] A \emph{superinitializer} identifies a
+  \emph{superconstructor}\,---\,that is,
+  a specific constructor of the superclass.
+  Execution of the superinitializer causes
+  the initializer list of the superconstructor to be executed.
+\item[$\bullet$] An \emph{instance variable initializer}
+  assigns a value to an individual instance variable.
 \item[$\bullet$] An assertion.
 \end{itemize}
 }
@@ -2327,19 +2859,20 @@
   \alt <fieldInitializer>
   \alt <assertion>
 
-<fieldInitializer> ::= (\THIS{} `.')? <identifier> `=' <conditionalExpression> <cascadeSection>*
+<fieldInitializer> ::= \gnewline{}
+  (\THIS{} `.')? <identifier> `=' <conditionalExpression> <cascadeSection>*
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 An initializer of the form \code{$v$ = $e$} is equivalent to
 an initializer of the form \code{\THIS{}.$v$ = $e$},
-both forms are called {\em instance variable initializers}.
+both forms are called \Index{instance variable initializers}.
 It is a compile-time error if the enclosing class does not declare an instance variable named $v$.
 Otherwise, let $T$ be the static type of $v$.
 It is a compile-time error unless the static type of $e$ is assignable to $T$.
 
-\LMHash{}
-Consider a {\em superinitializer} $s$ of the form
+\LMHash{}%
+Consider a \Index{superinitializer} $s$ of the form
 
 \code{\SUPER{}($a_1, \ldots,\ a_n,\ x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 respectively
@@ -2360,7 +2893,7 @@
 for the corresponding actual type arguments passed to the superclass
 in the header of the current class.
 
-\LMHash{}
+\LMHash{}%
 Let $k$ be a generative constructor.
 Then $k$ may include at most one superinitializer in its initializer list or a compile-time error occurs.
 If no superinitializer is provided, an implicit superinitializer of the form \SUPER{}() is added at the end of $k$'s initializer list,
@@ -2371,7 +2904,7 @@
 It is a compile-time error if $k$'s initializer list contains an initializer for a final variable $f$ whose declaration includes an initialization expression.
 It is a compile-time error if $k$ includes an initializing formal for a final variable $f$ whose declaration includes an initialization expression.
 
-\LMHash{}
+\LMHash{}%
 Let $f$ be a final instance variable declared in
 the immediately enclosing class.
 A compile-time error occurs unless $f$ is initialized
@@ -2382,21 +2915,21 @@
 \item $f$ has an initializer in $k$'s initializer list.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $k$'s initializer list contains an initializer for a variable that is not an instance variable declared in the immediately surrounding class.
 
 \commentary{
 The initializer list may of course contain an initializer for any instance variable declared by the immediately surrounding class, even if it is not final.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a generative constructor of class \code{Object} includes a superinitializer.
 
 
 \paragraph{Execution of Generative Constructors}
 \LMLabel{executionOfGenerativeConstructors}
 
-\LMHash{}
+\LMHash{}%
 Execution of a generative constructor $k$ of type $T$ to initialize a fresh instance $i$
 is always done with respect to a set of bindings for its formal parameters
 and the type parameters of the immediately enclosing class bound to
@@ -2407,7 +2940,7 @@
 However, they may also be determined by a reflective call.
 }
 
-\LMHash{}
+\LMHash{}%
 If $k$ is redirecting then its redirect clause has the form
 
 \code{\THIS{}.$g$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
@@ -2420,24 +2953,24 @@
 in an environment where the type parameters of the enclosing class are bound to
 $t_1, \ldots, t_m$.
 
-\LMHash{}
+\LMHash{}%
 Next, the body of $g$ is executed to initialize $i$ with respect to the bindings that map
 the formal parameters of $g$ to the corresponding objects in the actual argument list $a$,
 with \THIS{} bound to $i$,
 and the type parameters of the immediately enclosing class bound to $t_1, \ldots, t_m$.
 
-\LMHash{}
+\LMHash{}%
 Otherwise, $k$ is not redirecting.
 Execution then proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The instance variable declarations of the immediately enclosing class are visited in the order they appear in the program text.
 For each such declaration $d$, if $d$ has the form
 \code{\syntax{finalConstVarOrType} $v$ = $e$; }
 then $e$ is evaluated to an object $o$
 and the instance variable $v$ of $i$ is bound to $o$.
 
-\LMHash{}
+\LMHash{}%
 Any initializing formals declared in $k$'s parameter list are executed in the order they appear in the program text.
 % In fact, this order is unobservable; this could be done any time prior to running the body, since
 % these only effect \THIS{}.
@@ -2450,17 +2983,17 @@
 So we need to specify the order.
 }
 
-\LMHash{}
+\LMHash{}%
 Then if any instance variable of $i$ declared by the immediately enclosing class
 is not yet bound to a value,
 all such variables are initialized with the null object (\ref{null}).
 
-\LMHash{}
+\LMHash{}%
 Then, unless the enclosing class is \code{Object}, the explicitly specified or
 implicitly added superinitializer (\ref{initializerLists}) is executed to
 further initialize $i$.
 
-\LMHash{}
+\LMHash{}%
 After the superinitializer has completed, the body of $k$ is executed in a scope where \THIS{} is bound to $i$.
 
 \rationale{
@@ -2474,12 +3007,12 @@
 \paragraph{Execution of Initializer Lists}
 \LMLabel{executionOfInitializerLists}
 
-\LMHash{}
+\LMHash{}%
 During the execution of a generative constructor to initialize an instance $i$,
 execution of an initializer of the form \code{\THIS{}.$v$ = $e$}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First, the expression $e$ is evaluated to an object $o$.
 Then, the instance variable $v$ of $i$ is bound to $o$.
 It is a dynamic type error if $o$ is not the null object
@@ -2488,10 +3021,10 @@
 (\ref{actualTypeOfADeclaration})
 of the instance variable $v$.
 
-\LMHash{}
+\LMHash{}%
 Execution of an initializer that is an assertion proceeds by executing the assertion (\ref{assert}).
 
-\LMHash{}
+\LMHash{}%
 Consider a superinitializer $s$ of the form
 
 \code{\SUPER{}($a_1, \ldots,\ a_n,\ x_{n+1}: a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
@@ -2499,7 +3032,7 @@
 
 \code{\SUPER{}.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
-\LMHash{}
+\LMHash{}%
 Let $C$ be the class in which $s$ appears and let $S$ be the superclass of $C$.
 If $S$ is generic (\ref{generics}),
 let $u_1, \ldots, u_p$ be the actual type arguments passed to $S$,
@@ -2511,7 +3044,7 @@
 Let $k$ be the constructor declared in $S$ and named
 $S$ respectively \code{$S$.\id}.
 
-\LMHash{}
+\LMHash{}%
 Execution of $s$ proceeds as follows:
 The argument list
 \code{($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
@@ -2526,23 +3059,27 @@
 \subsubsection{Factories}
 \LMLabel{factories}
 
-\LMHash{}
-A {\em factory} is a constructor prefaced by the built-in identifier (\ref{identifierReference}) \FACTORY{}.
+\LMHash{}%
+A \IndexCustom{factory}{constructor!factory}
+is a constructor prefaced by the built-in identifier
+(\ref{identifierReference})
+\FACTORY{}.
 
 \begin{grammar}
-<factoryConstructorSignature> ::= \FACTORY{} <identifier> (`.' <identifier>)? <formalParameterList>
+<factoryConstructorSignature> ::= \gnewline{}
+  \FACTORY{} <identifier> (`.' <identifier>)? <formalParameterList>
 \end{grammar}
 
 %The enclosing scope of a factory constructor is the static scope \ref{} of the class in which it is declared.
 
-\LMHash{}
-The {\em return type} of a factory whose signature is of the form \FACTORY{} $M$ or the form \FACTORY{} \code{$M$.\id} is $M$ if $M$ is not a generic type;
+\LMHash{}%
+The return type of a factory whose signature is of the form \FACTORY{} $M$ or the form \FACTORY{} \code{$M$.\id} is $M$ if $M$ is not a generic type;
 otherwise the return type is \code{$M$<$T_1, \ldots,\ T_n$>} where $T_1, \ldots, T_n$ are the type parameters of the enclosing class.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $M$ is not the name of the immediately enclosing class.
 
-\LMHash{}
+\LMHash{}%
 It is a dynamic type error if a factory returns a non-null object
 whose type is not a subtype of its actual
 (\ref{actualTypeOfADeclaration})
@@ -2563,12 +3100,15 @@
 \paragraph{Redirecting Factory Constructors}
 \LMLabel{redirectingFactoryConstructors}
 
-\LMHash{}
-A {\em redirecting factory constructor} specifies a call to a constructor of another class that is to be used whenever the redirecting constructor is called.
+\LMHash{}%
+A \IndexCustom{redirecting factory constructor}{constructor!redirecting factory}
+specifies a call to a constructor of another class that is to be used
+whenever the redirecting constructor is called.
 
 \begin{grammar}
-<redirectingFactoryConstructorSignature> ::= \CONST{}? \FACTORY{} <identifier> (`.' <identifier>)? <formalParameterList>
-  \gnewline{} `=' <type> (`.' <identifier>)?
+<redirectingFactoryConstructorSignature> ::= \gnewline{}
+  \CONST{}? \FACTORY{} <identifier> (`.' <identifier>)? <formalParameterList> `='
+  \gnewline{} <typeNotVoid> (`.' <identifier>)?
 \end{grammar}
 
 Assume that
@@ -2579,20 +3119,20 @@
 $T$ is a type name, and \id{} is an identifier,
 then consider a declaration of a redirecting factory constructor $k$ of one of the forms
 
-\begin{dartCode}
+\begin{normativeDartCode}
 $\ConstMetavar$ \FACTORY{}
     $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $[$T_{n+1}\ x_{n+1}$=$d_1, \ldots,\ T_{n+k}\ x_{n+k}$=$d_k$]) = $R$;
 \\
 $\ConstMetavar$ \FACTORY{}
     $N$($T_1\ x_1 \ldots,\ T_n\ x_n,\ $\{$T_{n+1}\ x_{n+1}$=$d_1, \ldots,\ T_{n+k}\ x_{n+k}$=$d_k$\}) = $R$;
-\end{dartCode}
+\end{normativeDartCode}
 
 \noindent
 where $R$ is of one of the forms
 \code{$T$<$S_1 \ldots,\ S_p$>} or
 \code{$T$<$S_1 \ldots,\ S_p$>.\id}.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $T$ does not denote
 a class accessible in the current scope.
 If $T$ does denote such a class $D$,
@@ -2602,11 +3142,12 @@
 % redirections:
 Otherwise, it is a compile-time error
 if $R$ denotes a generative constructor and $D$ is abstract.
-Otherwise, the {\em redirectee constructor} for this declaration is
-the constructor denoted by $R$.
+Otherwise, the
+\IndexCustom{redirectee constructor}{constructor!redirectee}
+for this declaration is the constructor denoted by $R$.
 
-\LMHash{}
-A redirecting factory constructor $q'$ is {\em redirection-reachable}
+\LMHash{}%
+A redirecting factory constructor $q'$ is \Index{redirection-reachable}
 from a redirecting factory constructor $q$ if{}f
 $q'$ is the redirectee constructor of $q$,
 or $q''$ is the redirectee constructor of $q$
@@ -2614,7 +3155,7 @@
 It is a compile-time error if a redirecting factory constructor
 is redirection-reachable from itself.
 
-\LMHash{}
+\LMHash{}%
 Let $\argumentList{T}$ be the static argument list type (\ref{actualArgumentLists})
 \code{($T_1 \ldots,\ T_{n+k}$)}
 when $k$ takes no named arguments, and
@@ -2640,15 +3181,16 @@
 and/or the actual type argument list of the redirectee constructor is omitted (\ref{generics}).
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $k$ explicitly specifies a default value for an optional parameter.
 
 \commentary{
-Default values specified in $k$ would be ignored, since it is the {\em actual} parameters that are passed to $k'$.
+Default values specified in $k$ would be ignored,
+since it is the \emph{actual} parameters that are passed to $k'$.
 Hence, default values are disallowed.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a formal parameter of $k'$ has a default value
 whose type is not a subtype of the type annotation
 on the corresponding formal parameter in $k$.
@@ -2666,10 +3208,10 @@
 \end{itemize}
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $k$ is prefixed with the \CONST{} modifier but $k'$ is not a constant constructor (\ref{constantConstructors}).
 
-\LMHash{}
+\LMHash{}%
 Let $T_1, \ldots, T_m$ be the actual type arguments passed to $k'$
 in the declaration of $k$.
 Let $X_1, \ldots, X_m$ be the formal type arguments declared by
@@ -2685,22 +3227,22 @@
 the interface of the immediately enclosing class of $k$.
 }
 
-\LMHash{}
+\LMHash{}%
 For the dynamic semantics,
 assume that $k$ is a redirecting factory constructor
 and $k'$ is the redirectee of $k$.
 
-\LMHash{}
+\LMHash{}%
 It is a dynamic type error if an actual argument passed in an invocation of $k$
 is not a subtype of the actual type (\ref{actualTypeOfADeclaration})
 of the corresponding formal parameter in the declaration of $k$.
 
-\LMHash{}
+\LMHash{}%
 When the redirectee $k'$ is a factory constructor,
 execution of $k$ amounts to execution of $k'$ with the actual arguments passed to $k$.
 The result of the execution of $k'$ is the result of $k$.
 
-\LMHash{}
+\LMHash{}%
 When the redirectee $k'$ is a generative constructor,
 let $o$ be a fresh instance (\ref{generativeConstructors})
 of the class that contains $k'$.
@@ -2713,8 +3255,9 @@
 \subsubsection{Constant Constructors}
 \LMLabel{constantConstructors}
 
-\LMHash{}
-A {\em constant constructor} may be used to create compile-time constant (\ref{constants}) objects.
+\LMHash{}%
+A \IndexCustom{constant constructor}{constructor!constant}
+may be used to create compile-time constant (\ref{constants}) objects.
 A constant constructor is prefixed by the reserved word \CONST{}.
 
 \begin{grammar}
@@ -2727,28 +3270,28 @@
 All the work of a constant constructor must be handled via its initializers.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a constant constructor is declared by a class that has a mutable instance variable.
 
 \commentary{
 The above refers to both locally declared and inherited instance variables.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a constant constructor is declared by a class $C$ if any instance variable declared in $C$ is initialized with an expression that is not a constant expression.
 
 \commentary{
 A superclass of $C$ cannot declare such an initializer either, because it must necessarily declare constant constructor as well (unless it is \code{Object}, which declares no instance variables).
 }
 
-\LMHash{}
+\LMHash{}%
 The superinitializer that appears, explicitly or implicitly, in the initializer list of a constant constructor must specify a constant constructor of the superclass of the immediately enclosing class or a compile-time error occurs.
 
-\LMHash{}
+\LMHash{}%
 Any expression that appears within the initializer list of a constant constructor must be a potentially constant expression, or a compile-time error occurs.
 
-\LMHash{}
-A {\em potentially constant expression} is an expression $e$ that could be a valid constant expression if all formal parameters of $e$'s immediately enclosing constant constructor were treated as compile-time constants of appropriate types, and where $e$ is also a valid expression if all the formal parameters are treated as non-constant variables.
+\LMHash{}%
+A \Index{potentially constant expression} is an expression $e$ that could be a valid constant expression if all formal parameters of $e$'s immediately enclosing constant constructor were treated as compile-time constants of appropriate types, and where $e$ is also a valid expression if all the formal parameters are treated as non-constant variables.
 
 \commentary{
 The difference between a potentially constant expression and a constant expression (\ref{const}) deserves some explanation.
@@ -2805,7 +3348,7 @@
 This is precluded by the following rule, combined with the rules for evaluating constant objects (\ref{const}).
 }
 
-\LMHash{}
+\LMHash{}%
 When a constant constructor $k$ is invoked from a constant object expression,
 it is a compile-time error if
 the invocation of $k$ at run time would throw an exception,
@@ -2830,20 +3373,21 @@
 \subsection{Static Methods}
 \LMLabel{staticMethods}
 
-\LMHash{}
-{\em Static methods} are functions, other than getters or setters, whose declarations are immediately contained within a class declaration and that are declared \STATIC{}.
+\LMHash{}%
+\IndexCustom{Static methods}{method!static}
+are functions, other than getters or setters, whose declarations are immediately contained within a class declaration and that are declared \STATIC{}.
 The static methods of a class $C$ are those static methods declared by $C$.
 
-\LMHash{}
-The effect of a static method declaration in class $C$ is to add an instance method with the same name and signature to the \code{Type} object for class $C$ that forwards (\ref{functionDeclarations}) to the static method.
-
 \rationale{
 Inheritance of static methods has little utility in Dart.
 Static methods cannot be overridden.
-Any required static function can be obtained from its declaring library, and there is no need to bring it into scope via inheritance.
-Experience shows that developers are confused by the idea of inherited methods that are not instance methods.
+Any required static function can be obtained from its declaring library,
+and there is no need to bring it into scope via inheritance.
+Experience shows that developers are confused by
+the idea of inherited methods that are not instance methods.
 
-Of course, the entire notion of static methods is debatable, but it is retained here because so many programmers are familiar with it.
+Of course, the entire notion of static methods is debatable,
+but it is retained here because so many programmers are familiar with it.
 Dart static methods may be seen as functions of the enclosing library.
 }
 
@@ -2865,7 +3409,7 @@
 %% class (unless we start defining nested classes, such that the
 %% superclass can be declared in that scope).
 
-\LMHash{}
+\LMHash{}%
 The superclass $S'$ of a class $C$ whose declaration has a with clause
 \code{\WITH{} $M_1, \ldots,\ M_k$}
 and an extends clause
@@ -2882,12 +3426,12 @@
 \code{\EXTENDS{} Object}, and the rules above apply.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error to specify an \EXTENDS{} clause
 for class \code{Object}.
 
 \begin{grammar}
-<superclass> ::= \EXTENDS{} <type>
+<superclass> ::= \EXTENDS{} <typeNotVoid>
 \end{grammar}
 
 %The superclass clause of a class C is processed within the enclosing scope of the static scope of C.
@@ -2895,17 +3439,25 @@
 %This means that in a generic class, the type parameters of the generic are available in the superclass clause.
 %}
 
-\LMHash{}
+\LMHash{}%
 The scope of the \EXTENDS{} and \WITH{} clauses of a class $C$ is the type-parameter scope of $C$.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the type in the \EXTENDS{} clause of a class $C$ is
-a type variable (\ref{generics}), a type alias (\ref{typedef}),
+a type variable (\ref{generics}), a type alias that does not denote a class (\ref{typedef}),
 an enumerated type (\ref{enums}), a malformed type (\ref{staticTypes}),
 a deferred type (\ref{staticTypes}), type \DYNAMIC{} (\ref{typeDynamic}),
 or type \code{FutureOr<$T$>} for any $T$ (\ref{typeFutureOr}).
 
-\commentary{
+\commentary{%
+Note that \VOID{} is a reserved word,
+which implies that the same restrictions apply for the type \VOID,
+and similar restrictions are specified for other types like
+\code{Null} (\ref{null}) and
+\code{String} (\ref{strings}).%
+}
+
+\commentary{%
 The type parameters of a generic class are available in the lexical scope of the superclass clause, potentially shadowing classes in the surrounding scope.
 The following code is therefore illegal and should cause a compile-time error:
 }
@@ -2917,27 +3469,27 @@
 class G<T> extends T \{\}
 \end{dartCode}
 
-\LMHash{}
+\LMHash{}%
 %% TODO(eernst): Consider replacing all occurrences of `a superclass`
 %% by `a direct or indirect superclass`, because it's too confusing.
-A class $S$ is {\em a superclass} of a class $C$ if{}f either:
+A class $S$ is a \Index{superclass} of a class $C$ if{}f either:
 \begin{itemize}
 \item $S$ is the superclass of $C$, or
 \item $S$ is a superclass of a class $S'$,
 and $S'$ is the superclass of $C$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a class $C$ is a superclass of itself.
 
 
 \subsubsection{Inheritance and Overriding}
 \LMLabel{inheritanceAndOverriding}
 
-\LMHash{}
+\LMHash{}%
 Let $C$ be a class, let $A$ be a superclass of $C$, and
 let $S_1, \ldots, S_k$ be superclasses of $C$ that are also subclasses of $A$.
-$C$ {\em inherits} all concrete, accessible instance members of $A$
+$C$ \Index{inherits} all concrete, accessible instance members of $A$
 that have not been overridden by a concrete declaration in $C$ or in at least one of $S_1, \ldots, S_k$.
 
 \rationale{
@@ -2948,14 +3500,14 @@
 but the superclass chain of $S$ includes a class declared in $L_1$.
 }
 
-\LMHash{}
+\LMHash{}%
 A class may override instance members that would otherwise have been inherited from its superclass.
 
-\LMHash{}
+\LMHash{}%
 Let $C = S_0$ be a class declared in library $L$, and
 let $\{S_1, \ldots, S_k\}$ be the set of all superclasses of $C$,
 where $S_i$ is the superclass of $S_{i-1}$ for $i \in 1 .. k$.
-\commentary{This means that $S_k$ is the built-in class \code{Object}.}
+\commentary{$S_k$ is the built-in class \code{Object}.}
 Let $C$ declare a concrete member $m$, and
 let $m'$ be a concrete member of $S_j, j \in 1 .. k$, that has the same name as $m$,
 such that $m'$ is accessible to $L$.
@@ -2969,47 +3521,21 @@
 }
 
 \rationale{
-Again, a local definition of overriding would be preferable, but fails to account for library privacy.
-}
-
-\LMHash{}
-Whether an override is legal or not is described elsewhere in this specification (see \ref{instanceMethods}, \ref{getters} and \ref{setters}).
-
-\commentary{
-For example getters may not legally override methods and vice versa.
-Setters never override methods or getters, and vice versa, because their names always differ.
-}
-
-\rationale{
-It is nevertheless convenient to define the override relation between members in this way, so that we can concisely describe the illegal cases.
+Again, a local definition of overriding would be preferable,
+but fails to account for library privacy.
 }
 
 \commentary{
-Note that instance variables do not participate in the override relation, but the getters and setters they induce do.
-Also, getters don't override setters and vice versa.
-Finally, static members never override anything.
+Whether an override is legal or not is specified relative to
+all direct superinterfaces, not just the interface of the superclass,
+and that is described elsewhere
+(\ref{instanceMethods}).
+Static members never override anything,
+but they may participate in some conflicts
+involving declarations in superinterfaces
+(\ref{classMemberConflicts}).
 }
 
-\LMHash{}
-Let $C$ be a concrete class
-whose interface has an accessible member $m$ named \id{}.
-It is a compile-time error if $C$ does not have
-a concrete member $m'$ named \id{} which is a correct override of $m$,
-unless $C$ has a concrete method named \code{noSuchMethod}
-which is different from the one in the built-in class \code{Object},
-and $C$ does not have a concrete member named \id.
-
-\commentary{
-So it is an error even if $C$ does have a concrete member $m'$ named \id{}
-if $m'$ is an \emph{incorrect} override of $m$,
-also when $C$ has a \code{noSuchMethod} which is not from \code{Object}.
-Note that it is allowed to let inaccessible methods remain unimplemented;
-invocations of such methods will be redirected to \code{noSuchMethod}.
-}
-
-%% TODO(eernst): Why don't we just get rid of this list entirely?
-%% It's 'for convenience', but that's not otherwise a priority in this
-%% document, it is more important that it is correct and consistent.
 \commentary{
 For convenience, here is a summary of the relevant rules,
 using `error' to denote compile-time errors.
@@ -3040,26 +3566,9 @@
   they override each other.
   This may or may not be legal.
 \item \label{typeSigAssignable}
-  %% TODO(eernst): This is commentary, but we may need to adjust it
-  %% to say 'correctly overrides'.
   If two members override each other,
-  it is an error if their type signatures are not assignable to each other
-  (\ref{instanceMethods}, \ref{getters}, \ref{setters})
-  %% TODO(eernst): Revisit relative to the new subtyping.md rules.
-  (and since these are function types, this means the same as
-  "subtypes of each other").
-\item \label{requiredParams}
-  If two members override each other,
-  it is an error if the overriding member has
-  more required parameters than the overridden one (\ref{instanceMethods}).
-\item \label{optionalPositionals}
-  If two members override each other,
-  it is an error if the overriding member has
-  fewer positional parameters than the overridden one (\ref{instanceMethods}).
-\item \label{namedParams}
-  If two members override each other,
-  it is an error if the overriding member does not have
-  all the named parameters that the overridden one has (\ref{instanceMethods}).
+  it is an error unless it is a correct override
+  (\ref{correctMemberOverrides}).
 \item Setters, getters and operators never have
   optional parameters of any kind;
   it's an error (\ref{operators}, \ref{getters}, \ref{setters}).
@@ -3075,38 +3584,31 @@
   it has no body and is not labeled \EXTERNAL{}
   (\ref{abstractInstanceMembers}, \ref{externalFunctions}).
 \item A class is abstract if{}f it is explicitly labeled \ABSTRACT{}.
-\item It is an error if a concrete class has an abstract member
-  (declared or inherited), and there is no \code{noSuchMethod}.
+\item It is an error if a concrete class does not implement some member
+  of its interface, and there is no non-trivial \code{noSuchMethod}
+  (\ref{classes}).
 \item It is an error to call a non-factory constructor of an abstract class
   using an instance creation expression (\ref{instanceCreation}),
   such a constructor may only be invoked from another constructor
   using a super invocation (\ref{superInvocation}).
 \item If a class defines an instance member named $m$,
-  and any of its superinterfaces have a member named $m$,
+  and any of its superinterfaces have a member signature named $m$,
   the interface of the class contains the $m$ from the class itself.
-\item
-  %% TODO(eernst): This needs to be updated when we introduce the
-  %% new override/conflict rules.
-  An interface inherits all members of its superinterfaces
+\item An interface inherits all members of its superinterfaces
   that are not overridden and not members of multiple superinterfaces.
-\item
-  %% TODO(eernst): This must be rewritten when we introduce the new
-  %% override/conflict rules.
-  If multiple superinterfaces of an interface
-  define a member with the same name $m$,
+\item If multiple superinterfaces of an interface
+  define a member with the same name as $m$,
   then at most one member is inherited.
-  %% TODO(eernst): Switch to use 'correctly overrides' terminology.
   That member (if it exists) is the one whose type is a subtype
   of all the others.
-  If there is no such member, then an error occurs
+  If there is no such member, an error occurs
   (\ref{interfaceInheritanceAndOverriding}).
 \item Rule \ref{typeSigAssignable} applies to interfaces as well as classes
   (\ref{interfaceInheritanceAndOverriding}).
 \item It is an error if a concrete class does not have an implementation
   for a method in its interface
-  unless it has a concrete \code{noSuchMethod} method
-  (\ref{superinterfaces})
-  distinct from the one in class \code{Object}.
+  unless it has a non-trivial \code{noSuchMethod}
+  (\ref{theMethodNoSuchMethod}).
 \item The identifier of a named constructor cannot be
   the same as the name of a static member declared in the same class
   (\ref{classMemberConflicts}).
@@ -3116,22 +3618,23 @@
 
 \subsection{Superinterfaces}
 \LMLabel{superinterfaces}
-% what about rules about classes that fail to implement their interfaces?
 
-\LMHash{}
-A class has a set of direct superinterfaces.
-This set includes the interface of its superclass and the interfaces specified in the \IMPLEMENTS{} clause of the class.
+\LMHash{}%
+A class has a set of \Index{direct superinterfaces}.
+This set contains the interface of its superclass
+and the interfaces of the classes specified in
+the \IMPLEMENTS{} clause of the class.
 
 \begin{grammar}
-<interfaces> ::= \IMPLEMENTS{} <typeList>
+<interfaces> ::= \IMPLEMENTS{} <typeNotVoidList>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 The scope of the \IMPLEMENTS{} clause of a class $C$ is the type-parameter scope of $C$.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if an element in the type list of the \IMPLEMENTS{} clause of a class $C$ is
-a type variable (\ref{generics}), a type alias (\ref{typedef}),
+a type variable (\ref{generics}), a type alias that does not denote a class (\ref{typedef}),
 an enumerated type (\ref{enums}), a malformed type (\ref{staticTypes}),
 a deferred type (\ref{staticTypes}), type \DYNAMIC{} (\ref{typeDynamic}),
 or type \code{FutureOr<$T$>} for any $T$ (\ref{typeFutureOr}).
@@ -3148,152 +3651,576 @@
 As such, it is an indication that the programmer may very well have meant to say something else - and that is a mistake that should be called to her or his attention.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the interface of a class $C$ is a superinterface of itself.
 
-\LMHash{}
-Let $C$ be a concrete class that does not have a concrete \code{noSuchMethod()} method distinct from the one declared in class \code{Object}.
-%% TODO(eernst): Adjust to use 'correctly overrides' terminology.
-It is a compile-time error if the implicit interface of $C$ has an accessible instance member $m$ of type $F$,
-and $C$ does not declare or inherit a corresponding concrete instance member $m$ of type $F'$ such that $F' <: F$.
-
 \commentary{
 A class does not inherit members from its superinterfaces.
 However, its implicit interface does.
 }
 
-\rationale{
-We choose to raise these compile-time errors only for concrete classes;
-an abstract class might legitimately be designed with the expectation that concrete subclasses will implement part of the interface.
-We also disable these errors if a concrete \code{noSuchMethod()} declaration is present or inherited from any class other than \code{Object},
-unless a concrete member $m$ is declared or inherited.
-The point is that there is an error to disable,
-so the signature of the concrete $m$ is not a correct override of the signature in the class interface.
-Otherwise, when all such errors have been disabled,
-the supported interface is going to be implemented via \code{noSuchMethod()}
-and no actual declarations of the implemented interface's members are needed.
-This allows proxy classes for specific types to be implemented without provoking errors.
-}
-
-\LMHash{}
-%% TODO(eernst): Switch to use 'correctly overrides' terminology.
-It is a compile-time error if the implicit interface of a class $C$ has an instance member $m$ of type $F$ and $C$ declares or inherits a corresponding instance member $m$ of type $F'$ if $F'$ is not a subtype of $F$.
-
-\rationale{
-However, if a class does explicitly declare a member that conflicts with its superinterface, this always yields an error.
-}
-
 
 \subsection{Class Member Conflicts}
 \LMLabel{classMemberConflicts}
 
-\LMHash{}
+\LMHash{}%
 Some pairs of class member declarations cannot coexist,
 even though they do not both introduce the same name into the same scope.
 This section specifies these errors.
 
-\LMHash{}
-The {\em basename} of a getter or method named $n$ is $n$;
+\LMHash{}%
+The \Index{basename} of a getter or method named $n$ is $n$;
 the basename of a setter named \code{$n$=} is $n$.
 
-\LMHash{}
+\LMHash{}%
 Let $C$ be a class.
-It is a compile-time error if $C$ declares a
-\begin{itemize}
-\item constructor named \code{$C$.$n$} and a static member with basename $n$.
-\item getter or a setter with basename $n$, and has a method named $n$.
-\item method named $n$, and has a getter or a setter with basename $n$.
-\item static member with basename $n$, and has an instance member with basename $n$.
-\end{itemize}
+It is a compile-time error if $C$
+declares a constructor named \code{$C$.$n$} and
+a static member with basename $n$.
+It is a compile-time error if $C$
+declares a static member with basename $n$ and
+the interface of $C$ has an instance member with basename $n$.
+It is a compile-time error if the interface of $C$
+has a method named $n$ and a setter with basename $n$.
+
+\LMHash{}%
 These errors occur when the getters or setters are defined explicitly
 as well as when they are induced by variable declarations.
 
+\commentary{%
+Note that other errors which are similar in nature are covered elsewhere.
+For instance, if $C$ is a class that has two superinterfaces $I_1$ and $I_2$,
+where $I_1$ has a method named $m$
+and $I_2$ has a getter named $m$,
+then it is an error because the computation of the interface of $C$
+includes a computation of the combined member signature
+(\ref{combinedMemberSignatures})
+of that getter and that method,
+and it is an error for a combined member signature
+to include a getter and a non-getter.
+}
+
 
 \section{Interfaces}
 \LMLabel{interfaces}
 
+\LMHash{}%
+This section introduces the notion of interfaces.
+We define the notion of member signatures first,
+because that concept is needed in the definition of interfaces.
+
+% We need a separate concept of instance member signatures,
+% such that we can obtain a clean treatment of how to compute
+% the interface of a class and the common interface of a set
+% of superinterfaces, e.g., the superinterfaces of a class or
+% the common interface represented by an `on` clause in a
+% `mixin`. For instance, we do not want to specify each time
+% we check for conflicts that the body doesn't matter, or
+% that the metadata doesn't matter, the interface of a class
+% should simply never contain a body of any member in the
+% first place. Also the clear separation of a syntactic
+% declaration and a member signature provides a well-defined
+% occasion to introduce transformations, e.g., to replace
+% some parameter types by others, which is needed for the
+% specification of a correct override relation.
+
+\LMHash{}%
+A \Index{member signature} $s$
+can be derived from a class instance member declaration $D$.
+It contains the same information as $D$,
+except that $s$ omits the body, if any;
+it contains the return type and parameter types
+even if they are implicit in $D$;
+it omits the names of positional parameters;
+it omits the modifier \FINAL{} from each parameter, if any;
+it omits metadata
+(\ref{metadata});
+and it omits information about whether the member is
+\EXTERNAL{}, \ASYNC{}, \ASYNC*, or \SYNC*.
+It makes no difference whether $D$ is given as explicit syntax
+or it is induced implicitly, e.g., by a variable declaration.
+Finally, if $s$ has formal parameters,
+each of them has the modifier \COVARIANT{}
+(\ref{requiredFormals})
+if and only if that parameter is covariant-by-declaration
+(\ref{covariantParameters}).
+
+\LMHash{}%
+We use a syntax similar to that of an abstract member declaration
+to specify member signatures.
+The difference is that the names of positional parameters are omitted.
+This syntax is only used for the purposes of specification.
+
+\rationale{
+Member signatures are synthetic entities, that is,
+they are not supported as concrete syntax in a Dart program,
+they are computed entities used during static analysis.
+However, it is useful to be able to indicate the
+properties of a member signature in this specification
+via a syntactic representation.
+A member signature makes it explicit
+whether a parameter is covariant-by-declaration,
+but it remains implicit whether it is covariant-by-class
+(\ref{covariantParameters}).
+The reason for this is that the rule for determining whether
+a given override relation is correct
+(\ref{correctMemberOverrides})
+depends on the former and not on the latter.
+}
+
+\LMHash{}%
+Let $m$ be a method signature of the form
+
+\noindent
+\code{$T_0$ \id<\TypeParametersStd>(}
+
+\noindent
+\code{\qquad\qquad\List{\COVARIANT{}?\ T}{1}{n},}
+
+\noindent
+\code{\qquad\qquad[\PairList{\COVARIANT{}?\ T}{= d}{n+1}{n+k}])}.
+
+\noindent
+The \IndexCustom{function type of}{method signature!function type}
+$m$ is then
+
+\noindent
+\FunctionTypePositionalStd{T_0}.
+
+\LMHash{}%
+Let $m$ be a method signature of the form
+
+\noindent
+\code{$T_0$ \id<\TypeParametersStd>(}
+
+\noindent
+\code{\qquad\qquad\List{\COVARIANT{}?\ T}{1}{n},}
+
+\noindent
+\code{\qquad\qquad\{\TripleList{\COVARIANT{}?\ T}{x}{= d}{n+1}{n+k}\})}.
+
+\noindent
+The \NoIndex{function type of} $m$ is then
+
+\noindent
+\FunctionTypeNamedStd{T_0}.
+
+\LMHash{}%
+Let $m$ be a setter signature of the form
+\code{\VOID\ \SET\ \id(\COVARIANT?\ $T$ $p$)}.
+The \NoIndex{function type of} $m$ is then
+\FunctionTypeSimple{\VOID}{$T$}.
+
+\LMHash{}%
+The function type of a member signature remains unchanged if
+some or all default values are omitted.
+
+\commentary{
+We do not specify the function type of a getter signature.
+For such signatures we will instead directly refer to the return type.
+}
+
+\LMHash{}%
+An \Index{interface} is a synthetic entity that defines
+how one may interact with an object.
+An interface has method, getter and setter signatures,
+and a set of superinterfaces,
+which are again interfaces.
+Each interface is the implicit interface of a class,
+in which case we call it a
+\IndexCustom{class interface}{interface!class},
+or a combination of several other interfaces,
+in which case we call it a
+\IndexCustom{combined interface}{interface!combined}.
+
+\LMHash{}%
+Let $C$ be a class.
+The \Index{class interface} $I$ of $C$ is the interface that declares
+a member signature derived from
+each instance member declared by $C$.
+The \Index{direct superinterfaces} of $I$ are the direct superinterfaces of $C$
+(\ref{superinterfaces}).
+
+\commentary{
+We say that the class interface 'declares' these member signatures,
+such that we can say that an interface 'declares' or 'has' a member,
+just like we do for classes.
+Note that a member signature $s$ of the interface of class $C$
+may have a parameter $p$ with modifier \COVARIANT{},
+even though $s$ was derived from a declaration $D$ in $C$
+and the parameter corresponding to $p$ in $D$ does not
+have that modifier.
+This is because $p$ may have ``inherited''
+the property of being covariant-by-declaration
+from one of its superinterfaces
+(\ref{covariantParameters}).
+}
+
+\LMHash{}%
+%% TODO(eernst): 'list of interfaces' --> 'set of interfaces' if we
+%% switch to use a total order on top types for interface specificity.
+The \Index{combined interface} $I$ of a list of interfaces \List{I}{1}{k}
+is the interface that declares the set of member signatures $M$,
+where $M$ is determined as specified below.
+The \Index{direct superinterfaces} of $I$ is the set \List{I}{1}{k}.
+
+\LMHash{}%
+Let $M_0$ be the set of all member signatures declared by \List{I}{1}{k}.
+$M$ is then the smallest set satisfying the following:
+
+\begin{itemize}
+\item For each name \id{} and library $L$ such that $M_0$ contains
+  a member signature named \id{} which is accessible to $L$,
+  let $m$ be the combined member signature named \id{}
+  from \List{I}{1}{k} with respect to $L$.
+  It is a compile-time error
+  if the computation of this combined member signature failed.
+  Otherwise, $M$ contains $m$.
+\end{itemize}
+
+\rationale{
+Interfaces must be able to contain inaccessible member signatures,
+because they may be accessible from the interfaces associated with
+declarations of subtypes.
+}
+
+\commentary{%
+For instance, class $C$ in library $L$ may declare a private member named
+\code{\_foo},
+a class $D$ in a different library $L_2$ may extend $C$,
+and a class $E$ in library $L$ may extend $D$;
+$E$ may then declare a member that overrides \code{\_foo} from $C$,
+and that override relation must be checked based on the interface of $D$.
+So we cannot allow the interface of $D$
+to ``forget'' inaccessible members like \code{\_foo}.
+
+For conflicts the situation is even more demanding:
+Classes $C_1$ and $C_2$ in library $L$ may declare private members
+\code{String \_foo(int i)} and \code{int get \_foo},
+and a subtype $D_{12}$ in a different library $L_2$ may have
+an \IMPLEMENTS{} clause listing both $C_1$ and $C_2$.
+In that case we must report a conflict even though the conflicting
+declarations are not accessible to $L_2$,
+because those member signatures are then noSuchMethod forwarded
+(\ref{theMethodNoSuchMethod}),
+and an invocation of \code{\_foo} on an instance of $D$ in $L$
+must return an `int` according to the first member signature,
+and it must return a function object according to the second one,
+and an invocation of \code{\_foo(42)}
+must return a \code{String} with the first member signature, and it must fail
+(at compile time or, for a dynamic invocation, run time) with the second.
+}
+
+\rationale{%
+It may not be possible to satisfy such constraints simultaneously,
+and it will inevitably be a complex semantics,
+so we have chosen to make it an error.
+It is unfortunate that the addition of a private declaration
+in one library may break existing code in a different library.
+But it should be noted that the conflicts can be detected locally
+in the library where the private declarations exist,
+because they only arise for private members with
+the same name and incompatible signatures.
+Renaming that private member to anything not used in that library
+will eliminate the conflict and will not break any clients.
+}
+
+
+\subsection{Combined Member Signatures}
+\LMLabel{combinedMemberSignatures}
+
+\LMHash{}%
+This section specifies how to compute a member signature which will
+appropriately stand for a prioritized set of several member signatures,
+taken from a given list of interfaces.
+
+\commentary{
+In general, a combined member signature has a type which is
+a subtype of all the types given for that member.
+This is needed in order to ensure that the type of
+a member \id{} of a class $C$ is well-defined,
+even in the case where $C$ inherits
+several different declarations of \id{}
+and does not override \id{}.
+In case of failure, it serves to specify the situations
+where a developer must add a declaration in order to resolve an ambiguity.
+The member signatures are prioritized in the sense that we will select
+a member signature from the interface with the lowest possible index
+in the case where several member signatures are equally suitable
+to be chosen as the combined member signature.
+That is, ``the first interface wins''.
+}
+
+\LMHash{}%
+For the purposes of computing a combined member signature,
+we need a special notion of
+\IndexCustom{equality}{member signature equality}
+of member signatures.
+Two member signatures $m_1$ and $m_2$ are equal
+if{}f they have the same name,
+are accessible to the same set of libraries,
+have the same same return type (for getters),
+or the same function type and the same occurrences of \COVARIANT{}
+(for methods and setters).
+
+\commentary{
+In particular, private methods from different libraries are never equal.
+Top types differ as well.
+For instance,
+\FunctionTypeSimple{\DYNAMIC}{} and \FunctionTypeSimple{\code{Object}}{}
+are not equal, even though they are subtypes of each other.
+We need this distinction because management of top type discrepancies is
+one of the purposes of computing a combined interface.
+}
+
+\LMHash{}%
+Now we define combined member signatures.
+Let \id{} be an identifier, $L$ a library,
+\List{I}{1}{k} a list of interfaces,
+and $M_0$ the set of
+all member signatures from \List{I}{1}{k} named \id{}
+and accessible to $L$.
+The
+\IndexCustom{combined member signature
+  named \id{} from \List{I}{1}{k} with respect to $L$}{%
+  combined member signature}
+is the member signature which is obtained as follows:
+
+\LMHash{}%
+If $M_0$ is empty, computation of the combined member signature failed.
+
+\LMHash{}%
+If $M_0$ contains exactly one member signature $m'$,
+the combined member signature is $m'$.
+
+\LMHash{}%
+Otherwise, $M_0$ contains more than one member signature \List{m}{1}{q}.
+
+\LMHash{}%
+\Case{Failing mixtures}
+If $M_0$ contains at least one getter signature
+and at least one non-getter signature,
+the computation of the combined member signature failed.
+\EndCase
+
+\LMHash{}%
+\Case{Getters}
+If $M_0$ contains getter signatures only,
+the computation of the combined member signature proceeds as described below
+for methods and setters,
+except that it uses the return type of the getter signature
+where methods and setters use the function type of the member signature.
+\EndCase
+
+\LMHash{}%
+\Case{Methods and setters}
+In this case $M_0$ consists of setter signatures only,
+or method signatures only,
+because the name \id{} in the former case always end in \syntax{`='},
+which is never true in the latter case.
+
+\LMHash{}%
+Determine whether there exists a non-empty set $N \subseteq 1 .. q$ such that
+for each $i \in N$,
+the function type of $m_i$ is a subtype of
+the function type of $m_j$ for each $j \in 1 .. q$.
+%
+If no such set exists, the computation of the combined member signature failed.
+\commentary{%
+A useful intuition about this situation is that
+the given member signatures do not agree on
+which type is suitable for the member named \id.
+Otherwise we have a set of member signatures which are ``most specific''
+in the sense that their function types are subtypes of them all.
+}
+
+{ % Scope for N_min, M_min, N_firstMin.
+
+\def\Nall{\ensuremath{N_{\mbox{\scriptsize{}all}}}}
+\def\Mall{\ensuremath{M_{\mbox{\scriptsize{}all}}}}
+\def\MallFirst{\ensuremath{M_{\mbox{\scriptsize{}first}}}}
+
+\LMHash{}%
+Otherwise, when a set $N$ as specified above exists,
+let \Nall{} be the greatest set satisfying the requirement on $N$,
+and let $\Mall{} = \{ m_i\;|\;i \in \Nall\}$.
+\commentary{
+That is, \Mall{} contains all member signatures named \id{}
+with the most specific type.
+Dart subtyping is a partial pre-order,
+which ensures that such a greatest set of least elements exists,
+if any non-empty set of least elements exist.
+We can have several such signatures because member signatures
+can be such that they are not equal,
+and yet their function types are subtypes of each other.
+We need to compute one member signature from \Mall{},
+and we do that by using the ordering of the given interfaces.
+}
+
+\LMHash{}%
+Let $j \in 1 .. k$ be the smallest number such that
+$\MallFirst{} = \Mall{} \cap I_j$ is non-empty.
+Let $m_i$ be the single element that \MallFirst{} contains.
+\commentary{
+This set contains exactly one element because it is non-empty
+and no interface contains more than one member signature named \id.
+In other words, we choose $m_i$ as the member signature from
+the first possible interface
+among the most specific member signatures \Mall.
+}
+}
+
 \LMHash{}
-An {\em interface} defines how one may interact with an object.
-An interface has methods, getters and setters and a set of superinterfaces.
+The combined member signature is then $m'$,
+which is obtained from $m_i$ by adding the modifier \COVARIANT{}
+to each parameter $p$ (if it is not already present)
+when there exists a $j \in 1 .. q$
+such that the parameter corresponding to $p$
+(\ref{covariantParameters})
+has the modifier \COVARIANT{}.
+\commentary{
+In other words,
+each parameter in the combined member signature is marked covariant
+if any of the corresponding parameters are marked covariant,
+not just among the most specific signatures,
+but among \emph{all} signatures named \id{} (which are accessible to $L$)
+in the given list of interfaces.%
+}
+\EndCase
 
 
 \subsection{Superinterfaces}
 \LMLabel{interfaceSuperinterfaces}
 
-\LMHash{}
-An interface has a set of direct superinterfaces.
-
-\LMHash{}
-An interface $J$ is a superinterface of an interface $I$ if{}f either $J$ is a direct superinterface of $I$ or $J$ is a superinterface of a direct superinterface of $I$.
+\LMHash{}%
+An interface has a set of direct superinterfaces
+(\ref{interfaces}).
+An interface $J$ is a \Index{superinterface} of an interface $I$
+if{}f either $J$ is a direct superinterface of $I$
+or $J$ is a superinterface of a direct superinterface of $I$.
 
 
 \subsubsection{Inheritance and Overriding}
 \LMLabel{interfaceInheritanceAndOverriding}
 
-\LMHash{}
+\LMHash{}%
 Let $J$ be an interface and $K$ be a library.
-We define $inherited(J, K)$ to be the set of members $m$ such that all of the following hold:
+We define $\inherited{J, K}$ to be the set of member signatures $m$
+such that all of the following hold:
 \begin{itemize}
 \item $m$ is accessible to $K$ and
 \item $A$ is a direct superinterface of $J$ and either
   \begin{itemize}
-  \item $A$ declares a member $m$ or
-  \item $m$ is a member of $inherited(A, K)$.
+  \item $A$ declares a member signature $m$ or
+  \item $m$ is a member of $\inherited{A, K}$.
   \end{itemize}
 \item $m$ is not overridden by $J$.
 \end{itemize}
 
-\LMHash{}
-Furthermore, we define $overrides(J, K)$ to be the set of members $m'$ such that all of the following hold:
+\LMHash{}%
+Furthermore, we define $\overrides{J, K}$ to be
+the set of member signatures $m'$
+such that all of the following hold:
 \begin{itemize}
-\item $J$ is the implicit interface of a class $C$.
-\item $C$ declares a member $m$.
+\item $J$ is the interface of a class $C$.
+\item $C$ declares a member signature $m$.
 \item $m'$ has the same name as $m$.
 \item $m'$ is accessible to $K$.
 \item $A$ is a direct superinterface of $J$ and either
   \begin{itemize}
-  \item $A$ declares a member $m'$ or
+  \item $A$ declares a member signature $m'$ or
   \item $m'$ is a member of $inherited(A, K)$.
   \end{itemize}
 \end{itemize}
 
-\LMHash{}
-Let $I$ be the implicit interface of a class $C$ declared in library $L$.
-$I$ {\em inherits} all members of $inherited(I, L)$ and $I$ {\em overrides} $m'$ if $m' \in overrides(I, L)$.
+\LMHash{}%
+Let $I$ be the interface of a class $C$ declared in library $L$.
+$I$ \Index{inherits} all members of $\inherited{I, L}$
+and $I$ \Index{overrides} $m'$ if $m' \in \overrides{I, L}$.
 
-\LMHash{}
-All the compile-time errors pertaining to the overriding of instance members given in section \ref{classes} above hold for overriding between interfaces as well.
+\LMHash{}%
+All the compile-time errors pertaining to the overriding of instance members
+given in section~\ref{classes} hold for overriding between interfaces as well.
 
-\LMHash{}
-It is a compile-time error if $m$ is a method and $m'$ is a getter, or if $m$ is a getter and $m'$ is a method.
+\LMHash{}%
+If the above rule would cause multiple member signatures
+with the same name \id{} to be inherited then
+exactly one member is inherited, namely
+the combined member signature named \id{},
+from the direct superinterfaces
+% This is well-defined because $I$ is a class interface.
+in the textual order that they are declared,
+with respect to $L$
+(\ref{combinedMemberSignatures}).
+It is a compile-time error
+if the computation of said combined member signature fails.
 
-%Let $I = S_0$ be the implicit interface of a class $C$ declared in library $L$, and let $\{S_1, \ldots, S_k\}$ be the set of all superinterfaces of $I$.
+\subsubsection{Correct Member Overrides}
+\LMLabel{correctMemberOverrides}
 
-%Let $I$ be the implicit interface of a class $C$.  $I$ inherits any instance members of its superinterfaces that are not overridden by members declared in $C$.
+\LMHash{}%
+Let $m$ and $m'$ be member signatures with the same name \id.
+Then $m$ is a \Index{correct override} of $m'$
+if{}f the following criteria are all satisfied:
 
-% tighten definition? do we need chain as for classes?  Definition for interface override?
+\begin{itemize}
+\item
+  $m$ and $m'$ are both methods, both getters, or both setters.
+  % We cannot have a setter and a method, say, because they cannot have
+  % the same name. However, we must _allow_ $m$ and $m'$ to be two setters.
+\item
+  If $m$ and $m'$ are both methods or both setters:
+  Let $F$ be the function type of $m$
+  except that the parameter type is the built-in class \code{Object}
+  for each parameter of $m$ which has the modifier \COVARIANT{}.
+  Let $F'$ be the function type of $m'$.
+  $F$ must then be a subtype of $F'$.
 
-\LMHash{}
-However, if the above rules would cause multiple members $m_1, \ldots, m_k$ with the same name $n$ to be inherited (because identically named members existed in several superinterfaces) then at most one member is inherited.
-
-\LMHash{}
-If some but not all of the $m_i, 1 \le i \le k$ are getters, a compile-time error occurs.
-
-\LMHash{}
-%% TODO(eernst): Adjust to use 'correctly overrides' terminology.
-Otherwise, if the static types $T_1, \ldots, T_k$ of the members $m_1, \ldots, m_k$ are not identical then there must be an $x \in 1 .. k$ such that $T_x <: T_i$ for all $i \in 1 .. k$,
-or a compile-time error occurs.
-The member that is inherited  is $m_x$, if it exists.
+  \commentary{%
+  The subtype requirement ensures that argument list shapes
+  that are admissible for an invocation of a method with signature $m'$
+  are also admissible for an invocation of a method with signature $m$.
+  For instance, $m'$ may accept 2 or 3 positional arguments,
+  and $m$ may accept 1, 2, 3, or 4 positional arguments, but not vice versa.
+  This is a built-in property of the function type subtype rules.
+  %
+  Note that a member signature differs from
+  an underlying syntactic declaration $D$ in a class $C$.
+  In particular,
+  a parameter in a member signature has the modifier \COVARIANT{}
+  if and only if the parameter is covariant-by-declaration
+  (\ref{covariantParameters}),
+  and that may be the case due to declarations in a supertype of $C$,
+  so that modifier need not be present in $D$.
+  %
+  There is an additional potential compile-time error associated with
+  a parameter which is covariant-by-declaration
+  (\ref{instanceMethods}).
+  But we cannot cover that here as a property of member overrides,
+  because it is concerned with declarations in all superinterfaces,
+  indirect as well as direct.
+  }
+\item
+  If $m$ and $m'$ are both methods,
+  $p$ is an optional parameter of $m$,
+  $p'$ is the parameter of $m'$ corresponding to $p$,
+  $p$ has default value $d$ and $p'$ has default value $d'$,
+  then $d$ and $d'$ must be identical,
+  or a static warning occurs.
+\item
+  If $m$ and $m'$ are both getters:
+  The return type of $m$ must be a subtype of the return type of $m'$.
+\end{itemize}
 
 
 \section{Mixins}
 \LMLabel{mixins}
 
-\LMHash{}
+\LMHash{}%
 A mixin describes the difference between a class and its superclass.
 A mixin is always derived from an existing class declaration.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error to derive a mixin from a class which explicitly declares a generative constructor.
 It is a compile-time error to derive a mixin from a class which has a superclass other than \code{Object}.
 
@@ -3308,38 +4235,39 @@
 \subsection{Mixin Application}
 \LMLabel{mixinApplication}
 
-\LMHash{}
+\LMHash{}%
 A mixin may be applied to a superclass, yielding a new class.
 Mixin application occurs when one or more mixins are mixed into a class declaration via its \WITH{} clause.
 The mixin application may be used to extend a class per section \ref{classes};
 alternatively, a class may be defined as a mixin application as described in this section.
 It is a compile-time error if an element in the type list of the \WITH{} clause of a mixin application is
-a type variable (\ref{generics}), a type alias (\ref{typedef}),
+a type variable (\ref{generics}), a type alias that does not denote a class (\ref{typedef}),
 an enumerated type (\ref{enums}), a malformed type (\ref{staticTypes}),
 a deferred type (\ref{staticTypes}), type \DYNAMIC{} (\ref{typeDynamic}),
 or type \code{FutureOr<$T$>} for any $T$ (\ref{typeFutureOr}).
 
 \begin{grammar}
-<mixinApplicationClass> ::= <identifier> <typeParameters>? `=' <mixinApplication> `;'
+<mixinApplicationClass> ::= \gnewline{}
+  <identifier> <typeParameters>? `=' <mixinApplication> `;'
 
-<mixinApplication> ::= <type> <mixins> <interfaces>?
+<mixinApplication> ::= <typeNotVoid> <mixins> <interfaces>?
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 A mixin application of the form \code{$S$ \WITH{} $M$;} for the name $N$ defines a class $C$ with superclass $S$ and name $N$.
 
-\LMHash{}
+\LMHash{}%
 A mixin application of the form \code{$S$ \WITH{} $M_1,\ \ldots,\ M_k$;} for the name $N$ defines a class $C$ whose superclass is the application of the mixin composition (\ref{mixinComposition}) $M_{k-1} * \ldots * M_1$ to $S$ of a name that is a fresh identifer, and whose name is $N$.
 \rationale{The name of the resulting class is necessary because it is part of the names of the introduced constructors.}
 
-\LMHash{}
+\LMHash{}%
 In both cases above, $C$ declares the same instance members as $M$ (respectively, $M_k$),
 and it does not declare any static members.
 If any of the instance variables of $M$ (respectively, $M_k$) have initializers,
 they are executed in the instance scope of $M$ (respectively, $M_k$)
 to initialize the corresponding instance variables of $C$.
 
-\LMHash{}
+\LMHash{}%
 Let $L_C$ be the library containing the mixin application.
 \commentary{That is, the library containing the clause \code{$S$ \WITH{} $M$}
 or the clause \code{$S_0$ \WITH{} $M_1$, \ldots,\ $M_k$, $M$}.}
@@ -3349,9 +4277,9 @@
 
 For each generative constructor of the form \code{$S_q$($T_{1}$ $a_{1}$, $\ldots$, $T_{k}$ $a_{k}$)} of $S$ that is accessible to $L_C$, $C$ has an implicitly declared constructor of the form
 
-\begin{dartCode}
+\begin{normativeDartCode}
 $C_q$($T_{1}$ $a_{1}$, \ldots, $T_{k}$ $a_{k}$): $\SUPER_q$($a_{1}$, $\ldots$, $a_{k}$);
-\end{dartCode}
+\end{normativeDartCode}
 
 \noindent
 where $C_q$ is obtained from $S_q$ by replacing occurrences of $S_N$,
@@ -3360,13 +4288,13 @@
 If $S_q$ is a generative const constructor, and $M$ does not declare any
 fields, $C_q$ is also a const constructor.
 
-\LMHash{}
+\LMHash{}%
 For each generative constructor of the form \code{$S_q$($T_{1}$ $a_{1}$, \ldots , $T_{k}$ $a_{k}$, [$T_{k+1}$ $a_{k+1}$ = $d_1$, \ldots , $T_{k+p}$ $a_{k+p}$ = $d_p$])} of $S$ that is accessible to $L_C$, $C$ has an implicitly declared constructor of the form
 
-\begin{dartCode}
+\begin{normativeDartCode}
 $C_q$($T_{1}$ $a_{1}$, \ldots , $T_{k}$ $a_{k}$, [$T_{k+1}$ $a_{k+1}$ = $d'_{1}$, \ldots , $T_{k+p}$ $a_{k+p}$ = $d'_p$])
     : $\SUPER_q$($a_{1}$, \ldots , $a_{k}$, $a_{k+1}$, \ldots, $a_p$);
-\end{dartCode}
+\end{normativeDartCode}
 
 \noindent
 where $C_q$ is obtained from $S_q$ by replacing occurrences of $S_N$,
@@ -3378,13 +4306,13 @@
 If $S_q$ is a generative const constructor, and $M$ does not declare any
 fields, $C_q$ is also a const constructor.
 
-\LMHash{}
+\LMHash{}%
 For each generative constructor of the form \code{$S_q$($T_{1}$ $a_{1}$, \ldots , $T_{k}$ $a_{k}$, \{$T_{k+1}$ $a_{k+1}$ = $d_1$, \ldots , $T_{k+n}$ $a_{k+n}$ = $d_n$\})} of $S$ that is accessible to $L_C$, $C$ has an implicitly declared constructor of the form
 
-\begin{dartCode}
+\begin{normativeDartCode}
 $C_q$($T_{1}$ $a_{1}$, \ldots , $T_{k}$ $a_{k}$, \{$T_{k+1}$ $a_{k+1}$ = $d'_1$, \ldots , $T_{k+n}$ $a_{k+n}$ = $d'_n$\})
     : $\SUPER_q$($a_{1}$, \ldots , $a_{k}$, $a_{k+1}$: $a_{k+1}$, \ldots, $a_p$: $a_p$);
-\end{dartCode}
+\end{normativeDartCode}
 
 \noindent
 where $C_q$ is obtained from $S_q$ by replacing occurrences of $S_N$
@@ -3395,15 +4323,23 @@
 If $S_q$ is a generative const constructor, and $M$ does not declare any
 fields, $C_q$ is also a const constructor.
 
-\LMHash{}
+\LMHash{}%
 If the mixin application class declares interfaces, the resulting class also implements those interfaces.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $S$ is an enumerated type (\ref{enums}) or a malformed type.
 It is a compile-time error if $M$ (respectively, any of $M_1, \ldots, M_k$) is an enumerated type (\ref{enums}) or a malformed type.
 It is a compile-time error if a well formed mixin cannot be derived from $M$ (respectively, from each of $M_1, \ldots, M_k$).
 
-\LMHash{}
+\commentary{%
+Note that \VOID{} is a reserved word,
+which implies that the same restrictions apply for the type \VOID,
+and similar restrictions are specified for other types like
+\code{Null} (\ref{null}) and
+\code{String} (\ref{strings}).%
+}
+
+\LMHash{}%
 Let $K$ be a class declaration with the same constructors, superclass and interfaces as $C$, and the instance members declared by $M$ (respectively $M_1, \ldots, M_k$).
 It is a compile-time error if the declaration of $K$ would cause a compile-time error.
 
@@ -3413,19 +4349,19 @@
 this will result in a compile-time error just as if we had defined $K$ by means of an ordinary class declaration extending $S$, with a body that included $im$.
 }
 
-\LMHash{}
+\LMHash{}%
 The effect of a class definition of the form \code{\CLASS{} $C$ = $M$; } or the form \code{\CLASS{} $C<T_1, \ldots,\ T_n>$ = $M$; } in library $L$ is to introduce the name $C$ into the scope of $L$, bound to the class (\ref{classes}) defined by the mixin application $M$ for the name $C$.
 The name of the class is also set to $C$.
 If{}f the class is prefixed by the built-in identifier \ABSTRACT{}, the class being defined is an abstract class.
 
-\LMHash{}
+\LMHash{}%
 Let $M_A$ be a mixin derived from a class $M$ with direct superclass $S_{static}$, e.g., as defined by the class declaration \code{class M extends S$_{static}$ \{ \ldots \}}.
 
-\LMHash{}
+\LMHash{}%
 Let $A$ be an application of $M_A$.
 It is a compile-time error if the superclass of $A$ is not a subtype of $S_{static}$.
 
-\LMHash{}
+\LMHash{}%
 Let $C$ be a class declaration that includes $M_A$ in a with clause.
 It is a compile-time error if $C$ does not implement, directly or indirectly, all the direct superinterfaces of $M$.
 
@@ -3437,24 +4373,30 @@
 Dart does not directly support mixin composition, but the concept is useful when defining how the superclass of a class with a mixin clause is created.
 }
 
-\LMHash{}
-The {\em composition of two mixins}, $M_1<T_1, \ldots, T_{k_{M_1}}>$ and $M_2<U_1, \ldots, U_{k_{M_2}}>$, written $M_1<T_1, \ldots, T_{k_{M_1}}> * M_2<U_1, \ldots, U_{k_{M_2}}>$ defines an anonymous mixin such that for any class $S<V_1, \ldots, V_{k_S}>$, the application of
+\LMHash{}%
+The \Index{composition of two mixins},
+\code{$M_1$<$T_1, \ldots, T_{k_{M_1}}$>} and
+\code{$M_2$<$U_1, \ldots, U_{k_{M_2}}$>}, written
+\code{$M_1$<$T_1, \ldots, T_{k_{M_1}}$>$ * M_2$<$U_1, \ldots, U_{k_{M_2}}$>}
+defines an anonymous mixin such that for any class
+\code{$S$<$V_1, \ldots, V_{k_S}$>},
+the application of
 
-$M_1<T_1, \ldots, T_{k_{M_1}}> * M_2<U_1, \ldots, U_{k_{M_2}}>$
+\code{$M_1$<$T_1, \ldots, T_{k_{M_1}}$> $*$ $M_2$<$U_1, \ldots, U_{k_{M_2}}$>}
 
-to $S<V_1, \ldots, V_{k_S}>$ for the name $C$ is equivalent to
+to \code{$S$<$V_1, \ldots, V_{k_S}$>} for the name $C$ is equivalent to
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \ABSTRACT{} \CLASS{} $C<T_1, \ldots, T_{k_{M_1}}, U_1, \ldots, U_{k_{M_2}}, V_1, \ldots, V_{k_S}> = $
       $Id_2<U_1, \ldots, U_{k_{M_2}}, V_1 \ldots V_{k_S}>$ \WITH{} $M_1 <T_1, \ldots, T_{k_{M_1}}>$;
-\end{dartCode}
+\end{normativeDartCode}
 
 where $Id_2$ denotes
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \ABSTRACT{} \CLASS{} $Id_2<U_1, \ldots, U_{k_{M_2}}, V_1, \ldots, V_{k_S}> =$
                          $S<V_1, \ldots, V_{k_S}>$ \WITH{} $M_2<U_1, \ldots, U_{k_{M_2}}>$;
-\end{dartCode}
+\end{normativeDartCode}
 
 and $Id_2$ is a unique identifier that does not exist anywhere in the program.
 
@@ -3464,7 +4406,7 @@
 Consequently, no errors are raised if a mixin composition includes abstract members, or incompletely implements an interface.
 }
 
-\LMHash{}
+\LMHash{}%
 Mixin composition is associative.
 
 \commentary{
@@ -3476,8 +4418,8 @@
 \section{Enums}
 \LMLabel{enums}
 
-\LMHash{}
-An {\em enumerated type}, or {\em enum}, is used to represent a fixed number of constant values.
+\LMHash{}%
+An \Index{enumerated type}, or \Index{enum}, is used to represent a fixed number of constant values.
 
 \begin{grammar}
 <enumType> ::= <metadata> \ENUM{} <identifier>
@@ -3486,12 +4428,12 @@
 <enumEntry> ::= <metadata> <identifier>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 The declaration of an enum of the form
 \code{$m$ \ENUM{} $E$ \{$m_0\,\,\id_0, \ldots,\ m_{n-1}\,\,\id_{n-1}$\}}
 has the same effect as a class declaration
 
-\begin{dartCode}
+\begin{normativeDartCode}
 $m$ \CLASS{} $E$ \{
   \FINAL{} int index;
   \CONST{} $E$(\THIS{}.index);
@@ -3501,7 +4443,7 @@
   \STATIC{} \CONST{} List<$E$> values = const <$E$>[\id$_0, \ldots, $ \id$_{n-1}$];
   String toString() => \{ 0: `$E$.\id$_0$', $\ldots$, n-1: `$E$.\id$_{n-1}$'\}[index]
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 \commentary{
 It is also a compile-time error to subclass, mix-in or implement an enum or to explicitly instantiate an enum.
@@ -3512,10 +4454,10 @@
 \section{Generics}
 \LMLabel{generics}
 
-\LMHash{}
-A class declaration (\ref{classes}), type alias (\ref{typedef}), or function (\ref{functions}) $G$ may be {\em generic}, that is, $G$ may have formal type parameters declared.
+\LMHash{}%
+A class declaration (\ref{classes}), type alias (\ref{typedef}), or function (\ref{functions}) $G$ may be \Index{generic}, that is, $G$ may have formal type parameters declared.
 
-\LMHash{}
+\LMHash{}%
 When an entity in this specification is described as generic,
 and the special case is considered where the number of type arguments is zero,
 the type argument list should be omitted.
@@ -3530,70 +4472,102 @@
 operations where formal type parameters are replaced by actual type arguments.
 }
 
-\LMHash{}
-A {\em generic class declaration} introduces a generic class into the enclosing library scope.
-A {\em generic class} is a mapping that accepts a list of actual type arguments and maps them to a class.
-Consider a generic class declaration $G$ named \code{C} with formal type parameter declarations
+\LMHash{}%
+A \IndexCustom{generic class declaration}{class declaration!generic}
+introduces a generic class into the enclosing library scope.
+A \IndexCustom{generic class}{class!generic}
+is a mapping that accepts a list of actual type arguments and maps them to a class.
+Consider a generic class declaration $G$ named $C$ with formal type parameter declarations
 $X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$,
-and a parameterized type $T$ of the form \code{C<$T_1, \ldots,\ T_l$>}.
+and a parameterized type $T$ of the form \code{$C$<$T_1, \ldots,\ T_l$>}.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $m \not= l$.
 It is a compile-time error if $T$ is not well-bounded
 (\ref{superBoundedTypes}).
 
-\LMHash{}
-Otherwise, said parameterized type \code{C<$T_1, \ldots,\ T_m$>} denotes an application of the generic class declared by $G$ to the type arguments $T_1, \ldots, T_m$.
-This yields a class $C'$ whose members are equivalent to those of a class declaration which is obtained from the declaration of $G$ by replacing each occurrence of $X_j$ by $T_j$.
+\LMHash{}%
+Otherwise, said parameterized type \code{$C$<$T_1, \ldots,\ T_m$>} denotes an application of the generic class declared by $G$ to the type arguments $T_1, \ldots, T_m$.
+This yields a class $C'$ whose members are equivalent to those of a class declaration which is obtained from the declaration $G$ by replacing each occurrence of $X_j$ by $T_j$.
 \commentary{
 
 % TODO(eernst): make sure this list of properties is complete.
-Other properties of $C'$ such as the subtype relationships are specified elsewhere (\ref{interfaceTypes}).
+Other properties of $C'$ such as the subtype relationships are specified elsewhere
+(\ref{subtypes}).
 }
 
-\LMHash{}
-A {\em generic type alias}
-introduces a mapping from actual type argument lists to types.
-Consider a generic type alias declaration $G$ named \code{F}
-with formal type parameter declarations
-$X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$,
-%% TODO(eernst): 'right hand side' works only for a type alias using `=`.
-%% Explain what "the right hand side" means for an old-style declaration.
-and right hand side $T$.
+\LMHash{}%
+A \IndexCustom{generic type alias}{type alias!generic}
+is a declaration $D$ of one of the following forms:
 
-\LMHash{}
-Under the assumption that $X_1,\ \ldots,\ X_m$ are types such that
-$X_j <: B_j$, for all $j \in 1 .. m$,
-it is a compile-time error if any type in $T$ is not regular-bounded.
+\begin{itemize}
+\item \code{$m$ \TYPEDEF{} \id<\TypeParametersStd> = $T$;}
+\item \code{$m$ \TYPEDEF{} $S$?\ \id<\TypeParametersStd>(\\
+  \mbox\quad\PairList{T}{p}{1}{n},\ [\PairList{T}{p}{n+1}{n+k}]);}
+\item \code{$m$ \TYPEDEF{} $S$?\ \id<\TypeParametersStd>(\\
+  \mbox\quad\PairList{T}{p}{1}{n},\ \{\PairList{T}{p}{n+1}{n+k}\});}
+\end{itemize}
+
+\noindent
+where $m$ is derived from \synt{metadata},
+$T$ is a type,
+and \code{$S$?} is a type or the empty string.
+Let $S'$ be \code{$S$?} if it is a type, otherwise let $S'$ be \DYNAMIC.
+The associated function type of $D$, call it $F$, is, respectively:
+
+\begin{itemize}
+\item $T$
+\item \FunctionTypeSimple{S'}{\FunctionTypePositionalArgumentsStd}
+\item \FunctionTypeSimple{S'}{\FunctionTypeNamedArgumentsStd}
+\end{itemize}
+
+\LMHash{}%
+$D$ introduces a mapping from actual type argument lists to types.
+Under the assumption that \List{X}{1}{s} are types such that
+$X_j <: B_j$, for all $j \in 1 .. s$,
+it is a compile-time error if $T$ is not regular-bounded,
+and it is a compile-time error if any type occurring in $T$ is not well-bounded.
 
 \commentary{
 This means that the bounds declared for
 the formal type parameters of a generic type alias
 must be such that when they are satisfied,
-the bounds that pertain to any type in the body must also be satisfied.
+the bounds that pertain to the body are also satisfied,
+and a type occurring as a subterm of the body can violate its bounds,
+but only if it is a correct super-bounded type.
 }
 
-\LMHash{}
-Let $G$, \code{F}, and $X_1,\ \ldots,\ X_m$ be as defined above,
-let $T_1,\ \ldots,\ T_l$ be types,
-and let $S$ be the parameterized type \code{F<$T_1, \ldots,\ T_l$>}.
-It is a compile-time error if $m \not= l$.
-It is a compile-time error if $S$ is not well-bounded
+\LMHash{}%
+Moreover,
+let $T_1,\ \ldots,\ T_l$ be types
+and let $U$ be the parameterized type \code{\id<$T_1, \ldots,\ T_l$>}
+in a location where \id{} denotes $D$.
+It is a compile-time error if $l \not= s$.
+It is a compile-time error if $U$ is not well-bounded
 (\ref{superBoundedTypes}).
 
-\LMHash{}
-Otherwise, said parameterized type
-\code{F<$T_1, \ldots,\ T_m$>}
-denotes an application of the mapping denoted by $G$ to the type arguments
-$T_1, \ldots, T_m$.
-This yields the type
-$[T_1/X_1, \ldots, T_m/X_m]T$.
+\LMHash{}%
+Otherwise,
+$U$ denotes an application of the mapping denoted by $D$ to the type arguments
+$T_1, \ldots, T_s$,
+yielding the type
+$[T_1/X_1, \ldots, T_s/X_s]F$.
+
+\commentary{%
+Note that the type alias syntax without \syntax{`='}
+can only express function types,
+and it cannot express the type of a generic function.
+When such a type alias is generic,
+it always expresses a family of non-generic function types.
+These restrictions exist because that syntax was defined
+before generic functions were added to Dart.%
+}
 
 \rationale{
 The requirement that satisfaction of the bounds on
-the formal type parameters of a generic type alias $G$
+the formal type parameters of a generic type alias $D$
 must imply satisfaction of all bounds pertaining to
-every type that occurs in the body of $G$
+every type that occurs in the body of $D$
 limits the expressive power of generic type aliases.
 However, it would require the constraints on formal type parameters
 to be expressed in a much more powerful language
@@ -3623,19 +4597,20 @@
 they just cannot be abbreviated using a generic type alias.
 }
 
-\LMHash{}
-A {\em generic type} is a type which is introduced by
+\LMHash{}%
+A \IndexCustom{generic type}{type!generic} is a type which is introduced by
 a generic class declaration or a generic type alias,
 or it is the type \code{FutureOr}.
 
-\LMHash{}
-A {\em generic function declaration} introduces a generic function (\ref{formalParameters}) into the enclosing scope.
+\LMHash{}%
+A \IndexCustom{generic function declaration}{function declaration!generic}
+introduces a generic function (\ref{formalParameters}) into the enclosing scope.
 Consider a function invocation expression of the form
 \code{f<$T_1, \ldots,\ T_l$>(\ldots)},
 where the static type of \code{f} is a generic function type with formal type parameters
 $X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $m \not= l$.
 It is a compile-time error if there exists a $j$
 such that $T_j$ is not a subtype of $[T_1/X_1, \ldots, T_m/X_m]B_j$.
@@ -3647,13 +4622,13 @@
 }
 
 \begin{grammar}
-<typeParameter> ::= <metadata> <identifier> (\EXTENDS{} <type>)?
+<typeParameter> ::= <metadata> <identifier> (\EXTENDS{} <typeNotVoid>)?
 
 <typeParameters> ::= `<' <typeParameter> (`,' <typeParameter>)* `>'
 \end{grammar}
 
-\LMHash{}
-A type parameter $T$ may be suffixed with an \EXTENDS{} clause that specifies the {\em upper bound} for $T$.
+\LMHash{}%
+A type parameter $T$ may be suffixed with an \EXTENDS{} clause that specifies the \Index{upper bound} for $T$.
 If no \EXTENDS{} clause is present, the upper bound is \code{Object}.
 It is a compile-time error if a type parameter is a supertype of its upper bound
 when that upper bound is itself a type variable.
@@ -3665,7 +4640,7 @@
 \code{X \EXTENDS{} Y, Y \EXTENDS{} X}.
 }
 
-\LMHash{}
+\LMHash{}%
 Type parameters are declared in the type parameter scope of a class or function.
 The type parameters of a generic $G$ are in scope in the bounds of all of the type parameters of $G$.
 The type parameters of a generic class declaration $G$ are also in scope in the \EXTENDS{} and \IMPLEMENTS{} clauses of $G$ (if these exist) and in the body of $G$.
@@ -3754,25 +4729,25 @@
 \subsection{Variance}
 \LMLabel{variance}
 
-\LMHash{}
-We say that a type $S$ {\em occurs covariantly} in a type $T$ if{}f
+\LMHash{}%
+We say that a type $S$ \Index{occurs covariantly} in a type $T$ if{}f
 $S$ occurs in a covariant position in $T$,
 but not in a contravariant position,
 and not in an invariant position.
 
-\LMHash{}
-We say that a type $S$ {\em occurs contravariantly} in a type $T$ if{}f
+\LMHash{}%
+We say that a type $S$ \Index{occurs contravariantly} in a type $T$ if{}f
 $S$ occurs in a contravariant position in $T$,
 but not in a covariant position,
 and not in an invariant position.
 
-\LMHash{}
-We say that a type $S$ {\em occurs invariantly} in a type $T$ if{}f
+\LMHash{}%
+We say that a type $S$ \Index{occurs invariantly} in a type $T$ if{}f
 $S$ occurs in an invariant position in $T$,
 or $S$ occurs in a covariant position as well as a contravariant position.
 
-\LMHash{}
-We say that a type $S$ occurs {\em in a covariant position} in a type $T$
+\LMHash{}%
+We say that a type $S$ occurs in a \Index{covariant position} in a type $T$
 if{}f one of the following conditions is true:
 
 \begin{itemize}
@@ -3820,8 +4795,8 @@
   and $S$ occurs in a contravariant position in $S_j$.
 \end{itemize}
 
-\LMHash{}
-We say that a type $S$ occurs {\em in a contravariant position} in a type $T$
+\LMHash{}%
+We say that a type $S$ occurs in a \Index{contravariant position} in a type $T$
 if{}f one of the following conditions is true:
 
 \begin{itemize}
@@ -3868,8 +4843,8 @@
   and $S$ occurs in a covariant position in $S_j$.
 \end{itemize}
 
-\LMHash{}
-We say that a type $S$ occurs {\em in an invariant position} in a type $T$
+\LMHash{}%
+We say that a type $S$ occurs in an \Index{invariant position} in a type $T$
 if{}f one of the following conditions is true:
 
 \begin{itemize}
@@ -3906,17 +4881,21 @@
   and $S$ occurs in $S_j$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Consider a generic type alias declaration $G$
 with formal type parameter declarations
 $X_1\ \EXTENDS\ B_1, \ldots,\ X_m\ \EXTENDS\ B_m$,
 and right hand side $T$.
 Let $j \in 1 .. m$.
 %
-We say that {\em the formal type parameter} $X_j$ {\em is invariant}
-if{}f $X_j$ occurs invariantly in $T$,
-$X_j$ {\em is covariant} if{}f $X_j$ occurs covariantly in $T$,
-and $X_j$ {\em is contravariant} if{}f $X_j$ occurs contravariantly in $T$.
+We say that
+\IndexCustom{the formal type parameter $X_j$ is invariant}{%
+  type parameter!invariant}
+if{}f $X_j$ occurs invariantly in $T$, $X_j$
+\IndexCustom{is covariant}{type parameter!covariant}
+if{}f $X_j$ occurs covariantly in $T$, and $X_j$
+\IndexCustom{is contravariant}{type parameter!contravariant}
+if{}f $X_j$ occurs contravariantly in $T$.
 
 \rationale{
 Variance gives a characterization of the way a type varies
@@ -3938,13 +4917,13 @@
 \subsection{Super-Bounded Types}
 \LMLabel{superBoundedTypes}
 
-\LMHash{}
+\LMHash{}%
 This section describes how
 the declared upper bounds of formal type parameters are enforced,
 including some cases where a limited form of violation is allowed.
 
-\LMHash{}
-A {\em top type} is a type $T$ such that \code{Object} is a subtype of $T$.
+\LMHash{}%
+A \Index{top type} is a type $T$ such that \code{Object} is a subtype of $T$.
 \commentary{
 For instance, \code{Object}, \DYNAMIC, and \VOID{} are top types,
 and so are \code{FutureOr<\VOID>} and \code{FutureOr<FutureOr<\DYNAMIC>{}>}.
@@ -3957,22 +4936,22 @@
 % require that types must be regular-bounded when used in certain
 % situations.
 
-\LMHash{}
-Every type which is not a parameterized type is {\em regular-bounded}.
+\LMHash{}%
+Every type which is not a parameterized type is \Index{regular-bounded}.
 
 \commentary{
 In particular, every non-generic class and every function type
 is a regular-bounded type.
 }
 
-\LMHash{}
+\LMHash{}%
 Let $T$ be a parameterized type of the form
 \code{$G$<$S_1, \ldots,\ S_n$>}
 where $G$ denotes a generic class or a generic type alias.
 Let
 \code{$X_1\ \EXTENDS\ B_1, \ldots,\ X_n\ \EXTENDS\ B_n$}
 be the formal type parameter declarations of $G$.
-$T$ is {\em regular-bounded} if{}f
+$T$ is \Index{regular-bounded} if{}f
 $S_j$ is a subtype of
 $[S_1/X_1, \ldots,\ S_n/X_n]B_j$,
 for all $j \in 1 .. n$.
@@ -3982,24 +4961,21 @@
 that do not violate their type parameter bounds.
 }
 
-\LMHash{}
+\LMHash{}%
 Let $T$ be a parameterized type of the form
 \code{$G$<$S_1, \ldots,\ S_n$>}
 where $G$ denotes a generic class or a generic type alias.
-$T$ is {\em super-bounded} if{}f the following conditions are both true:
+$T$ is \Index{super-bounded} if{}f the following conditions are both true:
 
 \begin{itemize}
 \item
   $T$ is not regular-bounded.
 \item
-  For each $j \in 1 .. n$, let $S'_j$ be the result of replacing
-  every occurrence of a top type
-  in a covariant position in $S_j$ by \code{Null},
-  and every occurrence of \code{Null}
-  in a contravariant position in $S_j$ by \code{Object}.
-  It is then required that
-  \code{$G$<$S'_1, \ldots,\ S'_n$>}
-  is regular-bounded.
+  Let $T'$ be the result of replacing every occurrence in $T$
+  of a top type in a covariant position by \code{Null},
+  and every occurrence in $T$
+  of \code{Null} in a contravariant position by \code{Object}.
+  It is then required that $T'$ is regular-bounded.
   %
   Moreover, if $G$ denotes a generic type alias with body $U$,
   it is required that every type that occurs as a subterm of
@@ -4013,14 +4989,14 @@
 opposite extreme type, depending on their variance.
 }
 
-\LMHash{}
-A type $T$ is {\em well-bounded} if{}f
+\LMHash{}%
+A type $T$ is \Index{well-bounded} if{}f
 it is either regular-bounded or super-bounded.
 
-\LMHash{}
+\LMHash{}%
 Any use of a type $T$ which is not well-bounded is a compile-time error.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a parameterized type $T$ is super-bounded
 when it is used in any of the following ways:
 \begin{itemize}
@@ -4127,17 +5103,469 @@
 }
 
 
+\subsection{Instantiation to Bound}
+\LMLabel{instantiationToBound}
+
+\LMHash{}%
+This section describes how to compute type arguments
+that are omitted from a type,
+or from an invocation of a generic function.
+
+\commentary{%
+%% TODO(eernst): When we add a specification of type inference, we will adjust
+%% the specification of i2b such that it allows for taking initial values for
+%% the actual type arguments (that is, $U_{j,0}$ is given "from the caller" for
+%% some $j$; probably "the caller" will always be type inference), and all other
+%% parts of the algorithm remain unchanged.
+%% I think it will be more confusing than helpful to start writing this now,
+%% and it will be a small adjustment when we add a spec of type inference. So
+%% at this point we just specify i2b as a stand-alone algorithm.
+Note that type inference is assumed to have taken place already
+(\ref{overview}),
+so type arguments are not considered to be omitted if they are inferred.
+This means that instantiation to bound is a backup mechanism,
+which will be used when no information is available for inference.%
+}
+
+\LMHash{}%
+Consider the situation where a term $t$ of the form \synt{qualified}
+(\commentary{which is syntactically the same as \synt{typeName}})
+denotes a generic type declaration,
+and it is used as a type or as an expression in the enclosing program.
+\commentary{%
+This implies that type arguments are accepted, but not provided.%
+}
+We use the phrase
+\Index{raw type} respectively \Index{raw type expression}
+to identify such terms.
+In the following we only mention raw types,
+but everything said about raw types
+applies to raw type expressions in the obvious manner.
+
+\commentary{%
+For instance, with the declaration \code{Type listType() => List;},
+evaluation of the raw type expression \code{List} in the body yields
+an instance of class \code{Type} reifying \code{List<dynamic>},
+because \code{List} is subject to instantiation to bound.
+Note that \code{List<dynamic>} is not syntactically an expression,
+but it is still possible to get access to
+a \code{Type} instance reifying \code{List<dynamic>}
+without instantiation to bound,
+because it can be the value of a type variable.%
+}
+
+\rationale{%
+We can unambiguously define raw types to denote
+the result of applying the generic type
+to a list of implicitly provided actual type arguments,
+and instantiation to bound is a mechanism which does just that.
+This is because Dart does not, and will not, support higher-kinded types;
+for example, the value of a type variable $X$ will be a type,
+it cannot be the generic class \code{List} as such,
+and it cannot be applied to type arguments, e.g., \code{$X$<int>}.%
+}
+
+\rationale{%
+In the typical case where only covariance is encountered,
+instantiation to bound will yield a \emph{supertype} of
+all the regular-bounded types that can be expressed.
+This allows developers to consider a raw type as a type
+which is used to specify that
+``the actual type arguments do not matter''$\!$.%
+}
+\commentary{%
+For example, assuming the declaration
+\code{\CLASS{} C<X extends num> \{\ldots\}},
+instantiation to bound on \code{C} yields \code{C<num>},
+and this means that \code{C x;} can be used to declare a variable \code{x}
+whose value can be a \code{C<$T$>} for \emph{all possible} values of $T$.%
+}
+
+\rationale{%
+Conversely, consider the situation where
+a generic type alias denotes a function type,
+and it has one type parameter which is contravariant.
+Instantiation to bound on that type alias will then yield a \emph{subtype} of
+all the regular-bounded types that can be expressed
+by varying that type argument.
+This allows developers to consider such a type alias used as a raw type
+as a function type which allows the function to be passed to clients
+``where it does not matter which values
+for the type argument the client expects''$\!$.%
+}
+\commentary{%
+E.g., with
+\code{\TYPEDEF{} F<X> = \FUNCTION(X);}
+instantiation to bound on \code{F} yields \code{F<dynamic>},
+and this means that \code{F f;} can be used to declare a variable \code{f}
+whose value will be a function that can be passed to clients expecting
+an \code{F<$T$>} for \emph{all possible} values of $T$.
+}
+
+
+\subsubsection{Auxiliary Concepts for Instantiation to Bound}
+\LMLabel{auxiliaryConceptsForInstantiationToBound}
+
+\LMHash{}%
+Before we specify instantiation to bound we need to define two auxiliary concepts.
+Let $T$ be a raw type.
+A type $S$ then
+\IndexCustom{raw-depends on}{raw-depends on!type}
+$T$ if one or more of the following conditions hold:
+
+\begin{itemize}
+\item
+  $S$ is of the form \synt{typeName}, and $S$ is $T$.
+  \commentary{%
+  Note that this case is not applicable
+  if $S$ is a subterm of a term of the form
+  \syntax{$S$ <typeArguments>},
+  that is,
+  if $S$ receives any type arguments.
+  Also note that $S$ cannot be a type variable,
+  because then `$S$ is $T$' cannot hold.
+  See the discussion below and the reference to~\ref{subtypeRules}
+  for more details about why this is so.%
+  }
+\item
+  $S$ is of the form \syntax{<typeName> <typeArguments>},
+  and one of the type arguments raw-depends on $T$.
+\item
+  $S$ is of the form \syntax{<typeName> <typeArguments>?}\ where
+  \synt{typeName} denotes a type alias $F$,
+  and the body of $F$ raw-depends on $T$.
+\item
+  $S$ is of the form
+  \syntax{<type>? \FUNCTION{} <typeParameters>? <parameterTypeList>} and
+  \syntax{<type>?}\ raw-depends on $T$,
+  or a bound in \syntax{<typeParameters>?}\ raw-depends on $T$,
+  or a type in \synt{parameterTypeList} raw-depends on $T$.
+\end{itemize}
+
+\commentary{%
+Meta-variables
+(\ref{metaVariables})
+like $S$ and $T$ are understood to denote types,
+and they are considered to be equal (as in `$S$ is $T$')
+in the same sense as in the section about subtype rules
+(\ref{subtypeRules}).
+%
+In particular,
+even though two identical pieces of syntax may denote two distinct types,
+and two different pieces of syntax may denote the same type,
+the property of interest here is whether they denote the same type
+and not whether they are spelled identically.
+
+The intuition behind the situation where a type raw-depends on another type is
+that we need to compute any missing type arguments for the latter
+in order to be able to tell what the former means.
+
+In the rule about type aliases, $F$ may or may not be generic,
+and type arguments may or may not be present.
+However, there is no need to consider the result of substituting
+actual type arguments for formal type parameters in the body of $F$
+(or even the correctness of passing those type arguments to $F$),
+because we only need to inspect
+all types of the form \synt{typeName} in its body,
+and they are not affected by such a substitution.
+In other words, raw-dependency is a relation
+which is simple and cheap to compute.
+}
+
+\LMHash{}%
+Let $G$ be a generic class or a generic type alias
+with $k$ formal type parameter declarations
+containing formal type parameters \List{X}{1}{k} and bounds \List{B}{1}{k}.
+For any $j \in 1 .. k$,
+we say that the formal type parameter $X_j$ has a \Index{simple bound}
+when one of the following requirements is satisfied:
+
+\begin{itemize}
+\item $B_j$ is omitted.
+
+\item $B_j$ is included, but does not contain any of \List{X}{1}{k}.
+  If $B_j$ raw-depends on a raw type $T$
+  then every type parameter of $T$ must have a simple bound.
+\end{itemize}
+
+\LMHash{}%
+The notion of a simple bound must be interpreted inductively rather than
+coinductively, i.e., if a bound $B_j$ of a generic class or
+generic type alias $G$ is reached during an investigation of whether
+$B_j$ is a simple bound, the answer is no.
+
+\commentary{%
+For example, with
+\code{\CLASS{} C<X \EXTENDS{} C> \{\}},
+the type parameter \code{X} does not have a simple bound:
+A raw \code{C} is used as a bound for \code{X},
+so \code{C} must have simple bounds,
+but one of the bounds of \code{C} is the bound of \code{X},
+and that bound is \code{C}, so \code{C} must have simple bounds:
+That was a cycle, so the answer is ``no'',
+\code{C} does not have simple bounds.%
+}
+
+\LMHash{}%
+Let $G$ be a generic class or a generic type alias.
+We say that $G$
+\IndexCustom{has simple bounds}{type!generic, has simple bounds}
+if{}f every type parameter of $G$ has simple bounds.
+
+\commentary{%
+We can now specify in which sense instantiation to bound requires
+the involved types to be "simple enough".
+We impose the following constraint on all type parameter bounds,
+because all type parameters may be subject to instantiation to bound.%
+}
+
+\LMHash{}%
+It is a compile-time error
+if a formal type parameter bound $B$ contains a raw type $T$,
+unless $T$ has simple bounds.
+
+\commentary{%
+So type arguments on bounds can only be omitted
+if they themselves have simple bounds.
+In particular,
+\code{\CLASS{} C<X \EXTENDS{} C> \{\}}
+is a compile-time error,
+because the bound \code{C} is raw,
+and the formal type parameter \code{X}
+that corresponds to the omitted type argument
+does not have a simple bound.%
+}
+
+\LMHash{}%
+Let $T$ be a type of the form \synt{typeName}
+which denotes a generic class or a generic type alias
+(\commentary{so $T$ is raw}).
+Then $T$ is equivalent to the parameterized type which is
+the result obtained by applying instantiation to bound to $T$.
+It is a compile-time error if the instantiation to bound fails.
+
+\commentary{%
+This rule is applicable for all occurrences of raw types,
+e.g., when it occurs as a type annotation of a variable or a parameter,
+as a return type of a function,
+as a type which is tested in a type test,
+as the type in an \synt{onPart},
+etc.
+}
+
+\subsubsection{The Instantiation to Bound Algorithm}
+\LMLabel{theInstantiationToBoundAlgorithm}
+
+\LMHash{}%
+We now specify how the
+\Index{instantiation to bound}
+algorithm proceeds.
+Let $T$ be a raw type.
+Let \List{X}{1}{k} be the formal type parameters in the declaration of $G$,
+and let \List{B}{1}{k} be their bounds.
+For each $i \in 1 .. k$,
+let $S_i$ denote the result of instantiation to bound on $B_i$;
+in the case where the $i$th bound is omitted, let $S_i$ be \DYNAMIC.
+
+\commentary{%
+If $B_i$ for some $i$ is raw (in general: if it raw-depends on some type $U$)
+then all its (respectively $U$'s) omitted type arguments have simple bounds.
+This limits the complexity of instantiation to bound for $B_i$,
+and in particular it cannot involve a dependency cycle
+where we need the result from instantiation to bound for $G$
+in order to compute the instantiation to bound for $G$.%
+}
+
+\LMHash{}%
+Let $U_{i,0}$ be $S_i$, for all $i \in 1 .. k$.
+\commentary{%
+This is the "current value" of the bound for type variable $i$, at step 0;
+in general we will consider the current step, $m$, and use data for that step,
+e.g., the bound $U_{i,m}$, to compute the data for step $m + 1$.%
+}
+
+{ %% Scope for definitions of relations used during i2b
+
+\def\Depends{\ensuremath{\rightarrow_m}}
+\def\TransitivelyDepends{\ensuremath{\rightarrow^{+}_m}}
+
+\LMHash{}%
+Let \Depends{} be a relation among the type variables
+\List{X}{1}{k} such that
+$X_p \Depends X_q$ iff $X_q$ occurs in $U_{p,m}$.
+\commentary{%
+So each type variable is related to, that is, depends on,
+every type variable in its bound, which might include itself.%
+}
+Let \TransitivelyDepends{} be the transitive
+(\commentary{but not reflexive})
+closure of \Depends.
+For each $m$, let $U_{i,m+1}$, for $i \in 1 .. k$,
+be determined by the following iterative process, where $V_m$ denotes
+\code{$G$<$U_{1,m},\ \ldots,\ U_{k,m}$>}:
+
+\begin{itemize}
+\item[1.]
+  If there exists a $j \in 1 .. k$ such that
+  $X_j \TransitivelyDepends X_j$
+  (\commentary{that is, if the dependency graph has a cycle})
+  let \List{M}{1}{p} be the strongly connected components (SCCs)
+  with respect to \Depends{}.
+  \commentary{
+  That is, the maximal subsets of \List{X}{1}{k}
+  where every pair of variables in each subset
+  are related in both directions by \TransitivelyDepends;
+  note that the SCCs are pairwise disjoint;
+  also, they are uniquely defined up to reordering,
+  and the order does not matter for this algorithm.%
+  }
+  Let $M$ be the union of \List{M}{1}{p}
+  (\commentary{that is, all variables that participate in a dependency cycle}).
+  Let $i \in 1 .. k$.
+  If $X_i$ does not belong to $M$ then $U_{i,m+1}$ is $U_{i,m}$.
+  Otherwise there exists a $q$ such that $X_i \in M_q$;
+  $U_{i,m+1}$ is then obtained from $U_{i,m}$
+  by substituting \DYNAMIC{} for every occurrence of a variable in $M_q$
+  that is in a position in $V_m$ which is not contravariant,
+  and substituting \code{Null} for every occurrence of a variable in $M_q$
+  which is in a contravariant position in $V_m$.
+
+\item[2.]
+  Otherwise (\commentary{when there are no dependency cycles}),
+  let $j$ be the lowest number such that $X_j$ occurs in $U_{p,m}$ for some $p$
+  and $X_j \not\rightarrow_m X_q$ for all $q$ in $1 .. k$
+  (\commentary{%
+  that is, the bound of $X_j$ does not contain any type variables,
+  but $X_j$ occurs in the bound of some other type variable%
+  }).
+  Then, for all $i \in 1 .. k$,
+  $U_{i,m+1}$ is obtained from $U_{i,m}$
+  by substituting $U_{j,m}$ for every occurrence of $X_j$
+  that is in a position in $V_m$ which  is not contravariant,
+  and substituting \code{Null} for every occurrence of $X_j$
+  which is in a contravariant position in $V_m$.
+
+\item[3.]
+  Otherwise (\commentary{when there are no dependencies at all}),
+  terminate with the result \code{<$U_{1,m},\ \ldots,\ U_{k,m}$>}.
+\end{itemize}
+
+\commentary{%
+This process will always terminate, because the total number of
+occurrences of type variables from $\{\,\List{X}{1}{k}\,\}$ in
+the current bounds is strictly decreasing with each step, and we terminate
+when that number reaches zero.
+}
+
+\rationale{%
+It may seem somewhat arbitrary to treat unused and invariant parameters
+in the same way as covariant parameters,
+in particular because invariant parameters fail to satisfy the expectation that
+a raw type denotes a supertype of all the expressible regular-bounded types.
+
+We could easily have made every instantiation to bound an error
+when applied to a type where invariance occurs anywhere during the run of the algorithm.
+However, there are a number of cases where this choice produces a usable type,
+and we decided that it is not helpful to outlaw such cases.%
+}
+
+\begin{dartCode}
+\TYPEDEF{} Inv<X> = X \FUNCTION(X);
+\CLASS{} B<Y \EXTENDS{} num, Z \EXTENDS{} Inv<Y>{}> \{\}
+\\
+B b; // \comment{The raw B means} B<num, Inv<num>{}>.
+\end{dartCode}
+
+\commentary{%
+For example, the value of \code{b} can have dynamic type
+\code{B<int,\,int\,\FUNCTION(num)>}.
+However, the type arguments have to be chosen carefully,
+or the result will not be a subtype of \code{B}.
+For instance, \code{b} cannot have dynamic type
+\code{B<int, Inv<int>{}>},
+because \code{Inv<int>} is not a subtype of \code{Inv<num>}.%
+}
+
+\LMHash{}%
+A raw type $T$ is a compile-time error if instantiation to bound on $T$
+yields a type which is not well-bounded
+(\ref{superBoundedTypes}).
+
+\commentary{%
+This kind of error can occur, as demonstrated by the following example:%
+}
+
+\begin{dartCode}
+\CLASS{} C<X \EXTENDS{} C<X>{}> \{\}
+\TYPEDEF{} F<X \EXTENDS{} C<X>{}> = X \FUNCTION(X);
+\\
+F f; // \comment{Compile-time error.}
+\end{dartCode}
+
+\commentary{%
+With these declarations,
+the raw \code{F} which is used as a type annotation is a compile-time error:
+The algorithm yields \code{F<C<\DYNAMIC{}>{}>},
+and that is neither a regular-bounded nor a super-bounded type.
+%
+The resulting type can be specified explicitly as
+\code{C<\DYNAMIC{}> \FUNCTION(C<\DYNAMIC{}>)}.
+That type exists,
+we just cannot express it by passing a type argument to \code{F},
+so we make it an error rather than allowing it implicitly.%
+}
+
+\rationale{%
+The core reason why it makes sense to make such a raw type an error
+is that there is no subtype relationship
+between the relevant parameterized types.%
+}
+\commentary{%
+For instance, \code{F<T1>} and \code{F<T2>} are unrelated,
+even when \SubtypeNE{\code{T1}}{\code{T2}} or vice versa.
+In fact, there is no type \code{T} whatsoever
+such that a variable with declared type \code{F<T>}
+could be assigned to a variable of type
+\code{C<\DYNAMIC{}> \FUNCTION(C<\DYNAMIC{}>)}.
+%
+So the raw \code{F}, if permitted,
+would not be ``a supertype of \code{F<T>} for all possible \code{T}'',
+it would be a type which is unrelated to \code{F<T>}
+for \emph{every single} \code{T} that satisfies the bound of \code{F}.
+This is so useless that we made it an error.%
+}
+
+\LMHash{}%
+When instantiation to bound is applied to a type, it proceeds recursively:
+For a parameterized type \code{$G$<\List{T}{1}{k}>}
+it is applied to \List{T}{1}{k}.
+For a function type
+\FunctionTypePositionalStd{T_0}
+
+\noindent
+and a function type
+\FunctionTypeNamedStd{T_0}
+it is applied to \List{T}{0}{n+k}.
+
+\commentary{%
+This means that instantiation to bound has no effect on
+a type that does not contain any raw types.
+Conversely, instantiation to bound acts on types which are syntactic subterms,
+also when they are deeply nested.%
+}
+
+
 \section{Metadata}
 \LMLabel{metadata}
 
-\LMHash{}
+\LMHash{}%
 Dart supports metadata which is used to attach user defined annotations to program structures.
 
 \begin{grammar}
 <metadata> ::= (`@' <qualified> (`.' <identifier>)? (<arguments>)?)*
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Metadata consists of a series of annotations, each of which begin with the character @, followed by a constant expression that starts with an identifier.
 It is a compile-time error if the expression is not one of the following:
 \begin{itemize}
@@ -4145,7 +5573,7 @@
 \item A call to a constant constructor.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Metadata is associated with the abstract syntax tree of the program construct $p$ that immediately follows the metadata, assuming $p$ is not itself metadata or a comment.
 Metadata can be retrieved at run time via a reflective call, provided the annotated program construct $p$ is accessible via reflection.
 
@@ -4165,24 +5593,29 @@
 As noted above, the data can be retrieved statically if source code is available.
 }
 
-\LMHash{}
+\LMHash{}%
 Metadata can appear before a library, part header, class, typedef, type parameter, constructor, factory, function, parameter, or variable declaration and before an import, export or part directive.
 
-\LMHash{}
+\LMHash{}%
 The constant expression given in an annotation is type checked and evaluated in the scope surrounding the declaration being annotated.
 
 
 \section{Expressions}
 \LMLabel{expressions}
 
-\LMHash{}
+\LMHash{}%
 \label{evaluation}
-An {\em expression} is a fragment of Dart code that can be evaluated at run time.
-Evaluating an expression either {\em produces a value} (an object),
-or it {\em throws} an exception object and an associated stack trace.
-In the former case, we also say that the expression {\em evaluates to a value}.
+An \Index{expression} is a fragment of Dart code that can be evaluated at run time.
+Evaluating an expression either
+\IndexCustom{produces a value}{expression!produces a value}
+(an object),
+or it
+\IndexCustom{throws}{expression!throws}
+an exception object and an associated stack trace.
+In the former case, we also say that the expression
+\NoIndex{evaluates to a value}.
 
-\LMHash{}
+\LMHash{}%
 Every expression has an associated static type (\ref{staticTypes}) and
 may have an associated static context type.
 \commentary{The static context type represents
@@ -4193,7 +5626,7 @@
 of the expression.
 Every value has an associated dynamic type (\ref{dynamicTypeSystem}).
 
-\LMHash{}
+\LMHash{}%
 If evaluation of one expression, $e$, is defined in terms of evaluation of another expression, typically a subexpression of $e$,
 and the evaluation of the other expression throws an exception and a stack trace,
 the evaluation of $e$ stops at that point and throws the same exception object and stack trace.
@@ -4220,7 +5653,7 @@
   \alt `(' <expression> `)'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 An expression $e$ may always be enclosed in parentheses, but this never has any semantic effect on $e$.
 
 \commentary{
@@ -4232,7 +5665,7 @@
 \subsection{Object Identity}
 \LMLabel{objectIdentity}
 
-\LMHash{}
+\LMHash{}%
 The predefined Dart function \code{identical()} is defined such that \code{identical($c_1$, $c_2$)} if{}f:
 \begin{itemize}
 \item $c_1$ evaluates to either the null object (\ref{null}) or an instance of \code{bool} and \code{$c_1$ == $c_2$}, OR
@@ -4274,7 +5707,7 @@
 All usages of the word 'constant' in Dart are associated with compile time.
 A potentially constant expression is an expression that will generally yield
 a constant value when the value of certain parameters is given.
-The constant expressions is a subset of the potentially constant expressions that {\em can} be evaluated entirely at compile time.
+The constant expressions is a subset of the potentially constant expressions that \emph{can} be evaluated entirely at compile time.
 }
 
 \rationale{
@@ -4284,8 +5717,11 @@
 only members of the system classes \code{int}, \code{double}, \code{bool}, \code{String} or \code{Null}.
 }
 
-\LMHash{}
-The {\em potentially constant expressions} and {\em constant expressions} are the following:
+\LMHash{}%
+The \IndexCustom{potentially constant expressions}{%
+  potentially constant expression}
+and \IndexCustom{constant expressions}{constant expression}
+are the following:
 
 \begin{itemize}
 \item A literal boolean, \TRUE{} or \FALSE{} (\ref{booleans}), is a potentially constant and constant expression.
@@ -4326,7 +5762,7 @@
 \item A constant object expression (\ref{const}),
 \code{\CONST{} $C$<$T_1,\ \ldots,\ T_k$>(\metavar{arguments})} or
 \code{\CONST{} $C$<$T_1,\ \ldots,\ T_k$>.\id(\metavar{arguments})},
-or either expression without the leading \CONST{} that occurs in a constant context, is a potentially constant expression if $T_1$, \ldots{}, $T_k$ are constant type expressions, and the actual argument expressions in \metavar{arguments} are constant expressions.
+or either expression without the leading \CONST{} that occurs in a constant context, is a potentially constant expression.
 It is further a constant expression if the invocation evaluates to a value.
 % \ref{const} requires each actual argument to be a constant expression,
 % but here we also catch errors during evaluation, e.g., `C(1, 0)` where
@@ -4340,16 +5776,17 @@
 that occurs in a constant context, is a potentially constant expression if $T$ is a constant type expression, and $e_1$, \ldots{} , $e_n$ are constant expressions.
 It is further a constant expression if the list literal evaluates to a value.
 
+\item A constant set literal (\ref{set}),
+\code{\CONST{} <$T$>\{$e_1$, \ldots{}, $e_n$\}}, or
+\code{<$T$>\{$e_1$, \ldots{}, $e_n$\}}
+that occurs in a constant context, is a potentially constant expression if $T$ is a constant type expression, and $e_1$, \ldots{} , $e_n$ are constant expressions.
+It is further a constant expression if the list literal evaluates to a value.
+
 \item A constant map literal (\ref{maps}),
-\code{\CONST{} <$K$, $V$>\{$k_1$: $v_1$, \ldots{}, $k_n$: $v_n$\}}
-is a potentially constant expression if
-\begin{itemize}
-  \item $K$ and $V$ are constant type expressions,
-  \item $k_1$, \ldots{}, $k_n$ are constant expressions evaluating to values that are either \code{int} or \code{String} instances, created using a symbol literal or a const invocation of the \code{Symbol} constructor, or instances of classes that that do not override the \code{==} operator inherited from \code{Object}, and
-  \item $v_1$, \ldots{}, $v_n$ are constant expressions.
-\end{itemize}
+\code{\CONST{} <$K$, $V$>\{$k_1$: $v_1$, \ldots{}, $k_n$: $v_n$\}}, or
+\code{<$K$, $V$>\{$k_1$: $v_1$, \ldots{}, $k_n$: $v_n$\}} that occurs in a constant context,
+is a potentially constant expression.
 It is further a constant expression if the map literal evaluates to a value.
-%Should we also require the key instances to not override hashCode? Because Symbols do.
 
 \item A parenthesized expression \code{($e$)} is a potentially constant expression if $e$ is a potentially constant expression. It is further a constant expression if $e$ is a constant expression.
 
@@ -4419,12 +5856,12 @@
 
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 % New in 2.1.
 A constant type expression is one of:
 \begin{itemize}
 \item An simple or qualified identifier denoting a type declaration (a type alias, class or mixin declaration) that is not qualified by a deferred prefix,
-optionally followed by type arguments on the form
+optionally followed by type arguments of the form
 \code{<$T_1$,\ \ldots,\ $T_n$>}
 where $T_1$, \ldots{}, $T_n$ are constant type expressions.
 \item A type of the form \code{FutureOr<$T$>} where $T$ is a constant type expression.
@@ -4448,7 +5885,7 @@
 % A validly typed potentially constant expression can still fail when evaluated.
 % If that happens in a const invociation, it's a compile-time error.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if an expression is required to be a constant expression but its evaluation would throw an exception.
 It is a compile-time error if an assertion is evaluated as part of a constant object expression evaluation, and the assertion would throw an exception.
 
@@ -4515,7 +5952,7 @@
 \code{\CONST{} C(foo): \THIS.foo = foo ?? someDefaultValue;}
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the value of a constant expression depends on itself.
 
 \commentary{
@@ -4537,6 +5974,8 @@
   \alt <stringLiteral>
   \alt <symbolLiteral>
   \alt <mapLiteral>
+  \alt <setLiteral>
+  \alt <setOrMapLiteral>
   \alt <listLiteral>
 \end{grammar}
 
@@ -4544,14 +5983,14 @@
 \subsection{Null}
 \LMLabel{null}
 
-\LMHash{}
-The reserved word \NULL{} evaluates to the {\em null object}.
+\LMHash{}%
+The reserved word \NULL{} evaluates to the \Index{null object}.
 
 \begin{grammar}
 <nullLiteral> ::= \NULL{}
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 The null object is the sole instance of the built-in class \code{Null}.
 Attempting to instantiate \code{Null} causes a run-time error.
 It is a compile-time error for a class to extend, mix in or implement \code{Null}.
@@ -4559,15 +5998,16 @@
 \commentary{As such, it does not override the \code{==} operator inherited
 from the \code{Object} class.}
 
-\LMHash{}
+\LMHash{}%
 The static type of \NULL{} is the \code{Null} type.
 
 
 \subsection{Numbers}
 \LMLabel{numbers}
 
-\LMHash{}
-A {\em numeric literal} is either a decimal or hexadecimal numeral representing an integer value, or a decimal double representation.
+\LMHash{}%
+A \IndexCustom{numeric literal}{literal!numeric}
+is either a decimal or hexadecimal numeral representing an integer value, or a decimal double representation.
 
 \begin{grammar}
 <numericLiteral> ::= <NUMBER>
@@ -4586,20 +6026,22 @@
   \alt <DIGIT>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 A numeric literal starting with `0x' or `0X'
-is a {\em hexadecimal integer literal}.
+is a \IndexCustom{hexadecimal integer literal}{literal!hexadecimal integer}.
 It has the numeric integer value of the hexadecimal numeral
 following `0x' (respectively `0X').
 
-\LMHash{}
-A numeric literal that contains only decimal digits is a {\em decimal integer literal}.
+\LMHash{}%
+A numeric literal that contains only decimal digits is a
+\IndexCustom{decimal integer literal}{literal!decimal integer}.
 It has the numeric integer value of the decimal numeral.
 
-\LMHash{}
-An {\em integer literal} is either a hexadecimal integer literal or a decimal integer literal.
+\LMHash{}%
+An \IndexCustom{integer literal}{literal!integer}
+is either a hexadecimal integer literal or a decimal integer literal.
 
-\LMHash{}
+\LMHash{}%
 Let $l$ be an integer literal that is not the operand
 of by a unary minus operator,
 and let $T$ be the static context type of $l$.
@@ -4611,12 +6053,13 @@
   when it would satisfy the type requirement, and an \code{int} would not. Otherwise it is an \code{int}, even in situations where that is an error.
 }
 
-\LMHash{}
-A numeric literal that is not an integer literal is a {\em double literal}.
+\LMHash{}%
+A numeric literal that is not an integer literal is a
+\IndexCustom{double literal}{literal!double}.
 \commentary{A double literal always contains either a decimal point or an exponent part.}
 The static type of a double literal is \code{double}.
 
-\LMHash{}
+\LMHash{}%
 If $l$ is an integer literal with numeric value $i$ and static type \code{int},
 and $l$ is not the operand of a unary minus operator,
 then evaluation of $l$ proceeds as follows:
@@ -4642,16 +6085,16 @@
 exactly.
 }
 
-\LMHash{}
+\LMHash{}%
 A double literal evaluates to a an instance of the \code{double} class
 representing a 64 bit double precision floating point number
 as specified by the IEEE 754 standard.
 
-\LMHash{}
+\LMHash{}%
 An integer literal with static type \code{double} and numeric value $i$
 evaluates to an instance of the \code{double} class representing
 the value $i$. It is a compile-time error if the value $i$ cannot be
-represented {\em precisely} by the an instance of \code{double}.
+represented \emph{precisely} by the an instance of \code{double}.
 \commentary{
 A 64 bit double precision floating point number
 is usually taken to represent a range of real numbers
@@ -4662,36 +6105,40 @@
 is the precise value of the \code{double} instance.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error for a class to extend, mix in or implement \code{int}.
 It is a compile-time error for a class to extend, mix in or implement \code{double}.
 It is a compile-time error for any class other than \code{int} and \code{double} to extend, mix in or implement \code{num}.
 
-\LMHash{}
+\LMHash{}%
 The instances of \code{int} and \code{double} all override the \code{==} operator inherited from the \code{Object} class.
 
 \subsection{Booleans}
 \LMLabel{booleans}
 
-\LMHash{}
-The reserved words \TRUE{} and \FALSE{} evaluate to objects {\em true} and {\em false} that represent the boolean values true and false respectively.
-They are the {\em boolean literals}.
+\LMHash{}%
+The reserved words \TRUE{} and \FALSE{} evaluate to objects
+\IndexCustom{true}{true, the object} and
+\IndexCustom{false}{false, the object}
+that represent the boolean values true and false respectively.
+They are the \IndexCustom{boolean literals}{literal!boolean}.
 
 \begin{grammar}
 <booleanLiteral> ::= \TRUE{}
   \alt \FALSE{}
 \end{grammar}
 
-\LMHash{}
-Both {\em true} and {\em false} are instances of the built-in class \code{bool},
+\LMHash{}%
+Both \NoIndex{true} and \NoIndex{false} are instances of
+the built-in class \code{bool},
 and there are no other objects that implement \code{bool}.
 It is a compile-time error for a class to extend, mix in or implement \code{bool}.
 
-\LMHash{}
+\LMHash{}%
 The \code{bool} class does not override the \code{==} operator inherited from
 the \code{Object} class.
 
-\LMHash{}
+\LMHash{}%
 Invoking the getter \code{runtimeType} on a boolean value returns the \code{Type} object that is the value of the expression \code{bool}.
 The static type of a boolean literal is \code{bool}.
 
@@ -4699,8 +6146,8 @@
 \subsection{Strings}
 \LMLabel{strings}
 
-\LMHash{}
-A {\em string} is a sequence of UTF-16 code units.
+\LMHash{}%
+A \Index{string} is a sequence of UTF-16 code units.
 
 \rationale{
 This decision was made for compatibility with web browsers and Javascript.
@@ -4712,7 +6159,7 @@
 <stringLiteral> ::= (<multilineString> | <singleLineString>)+
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 A string can be a sequence of single line strings and multiline strings.
 
 \begin{grammar}
@@ -4722,7 +6169,7 @@
   \alt `r"' (\~{}( `"' | <NEWLINE>))* `"'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 A single line string is delimited by either matching single quotes or matching double quotes.
 
 \commentary{
@@ -4734,7 +6181,7 @@
 The grammar ensures that a single line string cannot span more than one line of source code, unless it includes an interpolated expression that spans multiple lines.
 }
 
-\LMHash{}
+\LMHash{}%
 Adjacent strings are implicitly concatenated to form a single string literal.
 
 \commentary{
@@ -4798,13 +6245,14 @@
   \alt `\\u' <HEX\_DIGIT> <HEX\_DIGIT> <HEX\_DIGIT> <HEX\_DIGIT>
   \alt `\\u{' <HEX\_DIGIT\_SEQUENCE> `}'
 
-<HEX\_DIGIT\_SEQUENCE> ::= <HEX\_DIGIT> <HEX\_DIGIT>? <HEX\_DIGIT>?
+<HEX\_DIGIT\_SEQUENCE> ::= \gnewline{}
+  <HEX\_DIGIT> <HEX\_DIGIT>? <HEX\_DIGIT>?
   \gnewline{} <HEX\_DIGIT>? <HEX\_DIGIT>? <HEX\_DIGIT>?
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Multiline strings are delimited by either matching triples of single quotes or matching triples of double quotes.
-If the first line of a multiline string consists solely of the whitespace characters defined by the production {\em WHITESPACE} (\ref{lexicalRules}), possibly prefixed by \syntax{`\\'}, then that line is ignored, including the line break at its end.
+If the first line of a multiline string consists solely of the whitespace characters defined by the production \synt{WHITESPACE} (\ref{lexicalRules}), possibly prefixed by \syntax{`\\'}, then that line is ignored, including the line break at its end.
 
 \rationale{
 The idea is to ignore a whitespace-only first line of a multiline string, where whitespace is defined as tabs, spaces and the final line break.
@@ -4815,7 +6263,7 @@
  %    """ ignored not. It depends if we mean whitespace before escapes are interpreted,
  % or after, or both.  See https://code.google.com/p/dart/issues/detail?id=23020
 
-\LMHash{}
+\LMHash{}%
 Strings support escape sequences for special characters.
 The escapes are:
 \begin{itemize}
@@ -4830,6 +6278,8 @@
 \syntax{`\\u{' <HEX\_DIGIT>$_1$ <HEX\_DIGIT>$_2$ `}'}.
 \item \syntax{`\\u' <HEX\_DIGIT>$_1$ <HEX\_DIGIT>$_2$ <HEX\_DIGIT>$_3$ <HEX\_DIGIT>$_4$},
 equivalent to
+
+\noindent
 \syntax{`\\u{' <HEX\_DIGIT>$_1$ <HEX\_DIGIT>$_2$ <HEX\_DIGIT>$_3$ <HEX\_DIGIT>$_4$ `}'}.
 \item \syntax{`\\u{' <HEX\_DIGIT\_SEQUENCE> `}'} is the Unicode code point represented by the
 \syntax{<HEX\_DIGIT\_SEQUENCE>}.
@@ -4841,16 +6291,16 @@
 \syntax{$\{$`n', `r', `f', `b', `t', `v', `x', `u'$\}$}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Any string may be prefixed with the character \syntax{`r'},
-indicating that it is a {\em raw string},
+indicating that it is a \Index{raw string},
 in which case no escapes or interpolations are recognized.
 
-\LMHash{}
+\LMHash{}%
 Line breaks in a multiline string are represented by the \syntax{<NEWLINE>} production.
 A line break introduces a single newline character into the string value.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a non-raw string literal contains a character sequence of the form \syntax{`\\x'} that is not followed by a sequence of two hexadecimal digits.
 It is a compile-time error if a non-raw string literal contains a character sequence of the form \syntax{`\\u'} that is not followed by either a sequence of four hexadecimal digits, or by curly brace delimited sequence of hexadecimal digits.
 
@@ -4876,7 +6326,7 @@
   \alt `\\r\\n'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 All string literals evaluate to instances of the built-in class \code{String}.
 It is a compile-time error for a class to extend, mix in or implement \code{String}.
 The \code{String} class overrides the \code{==} operator inherited from
@@ -4887,9 +6337,9 @@
 \subsubsection{String Interpolation}
 \LMLabel{stringInterpolation}
 
-\LMHash{}
+\LMHash{}%
 It is possible to embed expressions within non-raw string literals, such that these expressions are evaluated, and the resulting values are converted into strings and concatenated with the enclosing string.
-This process is known as {\em string interpolation}.
+This process is known as \Index{string interpolation}.
 
 \begin{grammar}
 <stringInterpolation> ::= `$' <IDENTIFIER\_NO\_DOLLAR>
@@ -4900,7 +6350,7 @@
 The reader will note that the expression inside the interpolation could itself include strings, which could again be interpolated recursively.
 }
 
-\LMHash{}
+\LMHash{}%
 An unescaped \syntax{`$'} character in a string signifies the beginning of an interpolated expression.
 The \syntax{`$'} sign may be followed by either:
 \begin{itemize}
@@ -4908,7 +6358,7 @@
 \item An expression $e$ delimited by curly braces.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 The form \code{\$\id} is equivalent to the form \code{\$\{\id\}}.
 An interpolated string, $s$, with content
 `\code{$s_0$\$\{$e_1$\}$s_1\ldots{}s_{n-1}$\$\{$e_n$\}$s_{n}$}' (where any of $s_0, \ldots, s_n$ can be empty)
@@ -4925,15 +6375,16 @@
 \subsection{Symbols}
 \LMLabel{symbols}
 
-\LMHash{}
-A {\em symbol literal} denotes a name that would be either
+\LMHash{}%
+A \IndexCustom{symbol literal}{literal!symbol}
+denotes a name that would be either
 a valid declaration name or a valid library name in a Dart program.
 
 \begin{grammar}
 <symbolLiteral> ::= `#' (<operator> | (<identifier> (`.' <identifier>)*))
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 A symbol literal \code{\#\id} where \id{} is an identifier
 that does not begin with an underscore ('\code{\_}'),
 evaluates to an instance of \code{Symbol} representing the identifier \id.
@@ -4943,7 +6394,7 @@
 or to a \code{Symbol} instance that is equal
 (according to the \code{==} operator \ref{equality}) to that instance.
 
-\LMHash{}
+\LMHash{}%
 A symbol literal \code{\#$\id.\id_2\ldots\id_n$}
 where $\id{} \ldots \id_n$ are identifiers,
 evaluates to an instance of \code{Symbol} representing that particular sequence of identifiers.
@@ -4954,21 +6405,21 @@
 \commentary{This kind of symbol literal denotes the name of a library declaration. Library names are not subject to library privacy, even
 if some of its identifiers begin with an underscore.}
 
-\LMHash{}
+\LMHash{}%
 A symbol literal \code{\#\metavar{operator}} evaluates to an instance of \code{Symbol}
 representing that particular operator name.
 All occurrences of \code{\#\metavar{operator}} evaluate to the same instance,
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is \code{==} to that instance.
 
-\LMHash{}
+\LMHash{}%
 A symbol literal \code{\#\_\id}, evaluates to an instance of \code{Symbol}
 representing the private identifier \code{\_\id} of the containing library.
-All occurrences of \code{\#\_\id} {\em in the same library} evaluate to the same instance,
+All occurrences of \code{\#\_\id} \emph{in the same library} evaluate to the same instance,
 and no other symbol literals evaluate to that \code{Symbol} instance
 or to a \code{Symbol} instance that is \code{==} to that instance.
 
-\LMHash{}
+\LMHash{}%
 The objects created by symbol literals all override
 the \code{==} operator inherited from the \code{Object} class.
 
@@ -4987,20 +6438,21 @@
 The fact that symbols are easy to type and can often act as convenient substitutes for enums are secondary benefits.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of a symbol literal is \code{Symbol}.
 
 \subsection{Lists}
 \LMLabel{lists}
 
-\LMHash{}
-A {\em list literal} denotes a list, which is an integer indexed collection of objects.
+\LMHash{}%
+A \IndexCustom{list literal}{literal!list}
+denotes a list, which is an integer indexed collection of objects.
 
 \begin{grammar}
 <listLiteral> ::= \CONST{}? <typeArguments>? `[' (<expressionList> `,'?)? `]'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 A list may contain zero or more objects.
 The number of elements in a list is its size.
 A list has an associated set of indices.
@@ -5008,22 +6460,27 @@
 A non-empty list has the index set $\{0, \ldots, n - 1\}$ where $n$ is the size of the list.
 It is a run-time error to attempt to access a list using an index that is not a member of its set of indices.
 
-\LMHash{}
-If a list literal begins with the reserved word \CONST{}, it is a {\em constant list literal} which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
-Otherwise, it is a {\em run-time list literal} and it is evaluated at run time.
+\LMHash{}%
+If a list literal begins with the reserved word \CONST{}, it is a
+\IndexCustom{constant list literal}{literal!list!constant}
+which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
+Otherwise, it is a
+\IndexCustom{run-time list literal}{literal!list!run-time}
+and it is evaluated at run time.
 Only run-time list literals can be mutated
 after they are created.
 Attempting to mutate a constant list literal will result in a dynamic error.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if an element of a constant list literal is not a constant expression.
 % Need 'free': `const <Function(Function<X>(X))>[]` is OK, but `X` is not free.
-It is a compile-time error if the type argument of a constant list literal is or contains a free type variable.
+It is a compile-time error if the type argument of a constant list literal is
+not a constant type expression.
 \rationale{
 The binding of a type parameter is not known at compile time, so we cannot use type parameters inside constant expressions.
 }
 
-\LMHash{}
+\LMHash{}%
 The value of a constant list literal
 \code{\CONST{} <$E$>[$e_1, \ldots, e_n$]}
 is an object $a$ whose class implements the built-in class
@@ -5034,7 +6491,7 @@
 is defined as the value of the constant list literal
 \code{\CONST{} <\DYNAMIC{}>[$e_1, \ldots, e_n$]}.
 
-\LMHash{}
+\LMHash{}%
 Let
 $list_1 =$ \code{\CONST{} <$V$>[$e_{11}, \ldots, e_{1n}$]}
 and
@@ -5046,7 +6503,7 @@
 In other words, constant list literals are canonicalized.
 }
 
-\LMHash{}
+\LMHash{}%
 A run-time list literal
 \code{<$E$>[$e_1, \ldots, e_n$]}
 is evaluated as follows:
@@ -5064,7 +6521,7 @@
 The result of the evaluation is $a$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 The objects created by list literals do not override
 the \code{==} operator inherited from the \code{Object} class.
 
@@ -5076,7 +6533,7 @@
 a dynamic type error will occur when $a[i]$ is assigned $o_{i-1}$.
 }
 
-\LMHash{}
+\LMHash{}%
 A run-time list literal
 \code{[$e_1, \ldots, e_n$]}
 is evaluated as
@@ -5090,13 +6547,13 @@
 containing two lists with type parameter \code{int}.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of a list literal of the form
 \code{\CONST{} <$E$>[$e_1, \ldots, e_n$]}
 or the form
 \code{<$E$>[$e_1, \ldots, e_n$]}
 is \code{List<$E$>}.
-The static type a list literal of the form
+The static type of a list literal of the form
 \code{\CONST{} [$e_1, \ldots, e_n$]}
 or the form
 \code{[$e_1, \ldots, e_n$]}
@@ -5106,42 +6563,69 @@
 \subsection{Maps}
 \LMLabel{maps}
 
-\LMHash{}
-A {\em map literal} denotes a map object.
+\LMHash{}%
+A \IndexCustom{map literal}{literal!map} denotes a map object.
 
 \begin{grammar}
 <mapLiteral> ::= \CONST{}? <typeArguments>?
-  \gnewline{} `{' (<mapLiteralEntry> (`,' <mapLiteralEntry>)* `,'?)? `\}'
+  \gnewline{} `{' <mapLiteralEntry> (`,' <mapLiteralEntry>)* `,'? `}'
 
 <mapLiteralEntry> ::= <expression> `:' <expression>
+
+<setOrMapLiteral> ::= \CONST{}? <typeArguments>? `{' `}'
 \end{grammar}
 
-\LMHash{}
-A {\em map literal} consists of zero or more entries.
-Each entry has a {\em key} and a {\em value}.
-Each key and each value is denoted by an expression.
+\LMHash{}%
+A \synt{setOrMapLiteral} $e$ is either a set literal (\ref {sets}) or a map literal,
+determined by the type parameters or static context type.
+If $e$ has exactly one type argument, then it is a set literal.
+If $e$ has two type arguments, then it is a map literal.
+If $e$ has three or more type arguments, it is a compile-time error.
+If $e$ has \emph{no} type arguments,
+then let $S$ be the static context type of the literal.
+If $\basetype{S}$ (\ref{typeFutureOr}) is a subtype of \code{Iterable<Object>}
+and $\basetype{S}$ is not a subtype of \code{Map<Object, Object>},
+then $e$ is set literal,
+and otherwise it is a map literal.
+A map literal derived from \synt{setOrMapLiteral}
+is treated the same way as one derived from \synt{mapLiteral},
+as described below.
 
-\LMHash{}
-If a map literal begins with the reserved word \CONST{}, it is a {\em constant map literal} which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
-Otherwise, it is a {\em run-time map literal} and it is evaluated at run time.
+\LMHash{}%
+A map literal consists of zero or more entries.
+Each entry has a \Index{key} and a \Index{value}.
+Each key and each value is denoted by an expression.
+It is a compile-time error if a map literal has one type argument,
+or more than two type arguments.
+
+\LMHash{}%
+If a map literal begins with the reserved word \CONST{}, it is a
+\IndexCustom{constant map literal}{literal!map!constant}
+which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
+Otherwise, it is a
+\IndexCustom{run-time map literal}{literal!map!run-time}
+and it is evaluated at run time.
 Only run-time map literals can be mutated after they are created.
 Attempting to mutate a constant map literal will result in a dynamic error.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if either a key or a value of an entry in a constant map literal is not a constant expression.
 It is a compile-time error if the key of an entry in a constant map literal is an instance of
 a class that has a concrete operator \syntax{`=='} declaration different from the one in \code{Object},
 unless the key is a string or an integer,
-or the key expression evaluates to an instance of the built-in
+the key expression evaluates to an instance of the built-in
 class \code{Symbol} which was originally obtained by evaluation of a
 literal symbol or
-a constant invocation of a constructor of the \code{Symbol} class.
+a constant invocation of a constructor of the \code{Symbol} class,
+or to an object implementing the built-in class \code{Type}
+which was originally obtained by evaluating a constant type literal
+(\ref{dynamicTypeSystem}).
 % Needs 'free': `const <int, Function(Function<X>(X))>{}` is OK, but
 % `X` is not free.
 It is a compile-time error if a type argument of a constant map literal
-is or contains a free type variable.
+is not a constant type expression \ref{constants}.
 
-\LMHash{}
+\LMHash{}%
 The value of a constant map literal
 \code{\CONST{} <$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
 is an object $m$ whose class implements the built-in class
@@ -5152,7 +6636,7 @@
 is defined as the value of a constant map literal
 \code{\CONST{} <\DYNAMIC{}, \DYNAMIC{}>\{$k_1:e_1, \ldots, k_n:e_n$\}}.
 
-\LMHash{}
+\LMHash{}%
 Let
 $map_1 =$ \code{\CONST{} <$K, V$>\{$k_{11}:e_{11}, \ldots, k_{1n}:e_{1n}$\}}
 and
@@ -5165,7 +6649,11 @@
 In other words, constant map literals are canonicalized.
 }
 
-\LMHash{}
+\LMHash{}%
+It is a compile-time error if two keys of a constant map literal are equal
+according to their \code{==} operator (\ref{equality}).
+
+\LMHash{}%
 A run-time map literal
 \code{<$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
 is evaluated as follows:
@@ -5175,29 +6663,26 @@
 first the expression $k_i$ is evaluated producing object $u_i$,
 and then $e_i$ is evaluated producing object $o_i$.
 This produces all the objects $u_1, o_1, \ldots, u_n, o_n$.
-\item A fresh instance (\ref{generativeConstructors}) $m$ whose class implements the built-in class
-\code{Map<$K, V$>} is allocated.
+\item A fresh instance (\ref{generativeConstructors}) $m$
+whose class implements the built-in class \code{Map<$K, V$>}, is allocated.
 \item
 The operator \syntax{`[]='} is invoked on $m$ with first argument $u_i$ and second argument $o_i$ for each $i \in 1 .. n$.
 \item
 The result of the evaluation is $m$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 The objects created by map literals do not override
 the \code{==} operator inherited from the \code{Object} class.
 
-\LMHash{}
+\LMHash{}%
 A run-time map literal
 \code{\{$k_1:e_1, \ldots, k_n:e_n$\}}
 is evaluated as
 
 \code{<\DYNAMIC{}, \DYNAMIC{}>\{$k_1:e_1, \ldots, k_n:e_n$\}}.
 
-\LMHash{}
-It is a compile-time error if two keys of a constant map literal are equal.
-
-\LMHash{}
+\LMHash{}%
 A map literal is ordered: iterating over the keys and/or values of the maps always happens in the
  order the keys appeared in the source code.
 
@@ -5205,7 +6690,7 @@
 Of course, if a key repeats, the order is defined by first occurrence, but the value is defined by the last.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of a map literal of the form
 \code{\CONST{} <$K, V$>\{$k_1:e_1, \ldots, k_n:e_n$\}}
 or the form
@@ -5219,11 +6704,126 @@
 \code{Map<\DYNAMIC{}, \DYNAMIC{}>}.
 
 
+\subsection{Sets}
+\LMLabel{sets}
+
+\LMHash{}%
+A \IndexCustom{set literal}{literal!set} denotes a set object.
+
+\begin{grammar}
+<setLiteral> ::= \CONST{}? <typeArguments>?
+  \gnewline{} `{' <expression> (`,' <expression>)* `,'? `\}'
+\end{grammar}
+
+\LMHash{}%
+A \synt{setOrMapLiteral} is either set literal or a map literal (\ref {maps}).
+A set literal derived from \synt{setOrMapLiteral}
+is treated the same way as one derived from \synt{setLiteral},
+as described below.
+
+\LMHash{}%
+A set literal consists of zero or more element expressions.
+It is a compile-time error if a set literal has more than one type argument.
+
+\LMHash{}%
+\rationale{
+A set literal with no type argument is always converted to a literal
+with a type argument by type inference (\ref{overview}), so the following
+section only address the behavior of literals with type arguments.}
+
+\LMHash{}%
+If a set literal begins with the reserved word \CONST{},
+or if it occurs in a constant context, then it is a
+\IndexCustom{constant set literal}{literal!set!constant}
+which is a constant expression (\ref{constants}) and therefore evaluated at compile time.
+Otherwise, it is a
+\IndexCustom{run-time set literal}{literal!set!run-time}
+and it is evaluated at run time.
+Only run-time set literals can be mutated after they are created.
+Attempting to mutate a constant set literal will result in a dynamic error.
+
+\LMHash{}%
+It is a compile-time error if an element expression in a constant set literal is not a constant expression.
+It is a compile-time error if the element object in a constant set literal is an instance of
+a class that has a concrete operator \syntax{`=='} declaration different from the one in \code{Object},
+unless the element is a string or an integer,
+the element expression evaluates to an instance of the built-in
+class \code{Symbol} which was originally obtained by evaluation of a
+literal symbol or
+a constant invocation of a constructor of the \code{Symbol} class,
+or to an object implementing the built-in class \code{Type}
+which was originally obtained by evaluating a constant type literal
+(\ref{dynamicTypeSystem}).
+It is a compile-time error if the type argument of a constant set literal
+is not a constant type expression \ref{constants}.
+It is a compile-time error if two elements of a constant set literal are equal
+according to their \code{==} operator (\ref{equality}).
+
+\LMHash{}%
+The value of a constant set literal with element expressions
+$e_1, \dots, e_n$ and type argument $E$
+is an object $s$ whose class implements the built-in class
+\code{Set<$E$>}.
+The elements of $m$ are $v_i, i \in 1 .. n$, where $v_i$ is the value of the constant expression $e_i$.
+
+\LMHash{}%
+Let $set_1$ be a constant set literal with type argument $E$
+and element expressions, in source order, $e_{11}, \ldots, e_{1n}$ evaluating
+to values $v_{11}, \ldots, v_{1n}$.
+Let $set_2$ be a constant set literal with type argument $F$
+and element expressions, in source order, $e_{21}, \ldots, e_{2n}$ evaluating
+to values $v_{21}, \ldots, v_{2n}$.
+If{}f \code{identical($v_{1i}$, $v_{2i}$)}
+for $i \in 1 .. n$, and $E$ and $F$ is the same type,
+then \code{identical($set_1$, $set_2$)}.
+\commentary{
+In other words, constant set literals are canonicalized if they have
+the same type and the same values in the same order.
+}
+Two constant set literals are never identical if they have different numbers
+of elements.
+
+\LMHash{}%
+A run-time set literal with element expressions $e_1, \ldots, e_n$
+(in source order) and with type argument $E$
+is evaluated as follows:
+\begin{itemize}
+\item
+For each $i \in 1 .. n$ in numeric order,
+the expression $e_i$ is evaluated producing object $v_i$.
+\item A fresh object (\ref{generativeConstructors}) $s$
+implementing the built-in class \code{Set<$E$>}, is created.
+\item The set $s$ is made to have the values $v_1, \ldots{} , v_n$ as elements,
+iterated in numerical order.
+\item
+The result of the evaluation is $s$.
+\end{itemize}
+
+\LMHash{}%
+The objects created by set literals do not override
+the \code{==} operator inherited from the \code{Object} class.
+
+\LMHash{}%
+A set literal is ordered: iterating over the elements of the sets
+always happens in the order the elements first appeared in the source code.
+
+\commentary{
+If a value repeats, the order is defined by first occurrence, but the value is defined by the last.
+}
+
+\LMHash{}%
+The static type of a set literal of the form
+\code{\CONST{} <$E$>\{$e_1, \ldots, e_n$\}}
+or the form
+\code{<$E$>\{$e_1, \ldots, e_n$\}}
+is
+\code{Set<$E$>}.
+
 \subsection{Throw}
 \LMLabel{throw}
 
-\LMHash{}
-The {\em throw expression} is used to throw an exception.
+\LMHash{}%
+The \Index{throw expression} is used to throw an exception.
 
 \begin{grammar}
 <throwExpression> ::= \THROW{} <expression>
@@ -5231,97 +6831,67 @@
 <throwExpressionWithoutCascade> ::= \THROW{} <expressionWithoutCascade>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a throw expression of the form \code{\THROW{} $e$;} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression $e$ is evaluated to a value $v$ (\ref{evaluation}).
 
 \commentary{
 There is no requirement that the expression $e$ must evaluate to any special kind of object.
 }
 
-\LMHash{}
+\LMHash{}%
 If $v$ is the null object (\ref{null}), then a \code{NullThrownError} is thrown.
 Otherwise let $t$ be a stack trace corresponding to the current execution state,
 and the \THROW{} statement throws with $v$ as exception object
 and $t$ as stack trace (\ref{evaluation}).
 
-\LMHash{}
+\LMHash{}%
 If $v$ is an instance of class \code{Error} or a subclass thereof,
 and it is the first time that \code{Error} object is thrown,
 the stack trace $t$ is stored on $v$ so that it will be returned
 by the $v$'s \code{stackTrace} getter
 
 \commentary{
-If the same \code{Error} object is thrown more than once, its \code{stackTrace} getter will return the stack trace from the {\em first} time it was thrown.
+If the same \code{Error} object is thrown more than once, its \code{stackTrace} getter will return the stack trace from the \emph{first} time it was thrown.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of a throw expression is $\bot$.
 
 
 \subsection{Function Expressions}
 \LMLabel{functionExpressions}
 
-\LMHash{}
-%% TODO(eernst): A function literal is a syntactic construct, and we may use
-%% function closurization to obtain a corresponding function object.
-A {\em function literal} is an object that encapsulates an executable unit of code.
+\LMHash{}%
+A \IndexCustom{function literal}{literal!function}
+is an anonymous declaration and an expression
+that encapsulates an executable unit of code.
 
 \begin{grammar}
 <functionExpression> ::= <formalParameterPart> <functionBody>
 \end{grammar}
 
-%% TODO[inference]: The static and dynamic type of a function literal
-%% interacts with inference: If a type-from-context $T$ exists and the
-%% function literal can be given a type which is a subtype of $T$, we may
-%% end up typing both the function as a whole and the body of the function
-%% very differently than we would in a situation where no type-from-context
-%% exists. So the rules below must be changed to be the default case (where
-%% no type-from-context is available, or it is `Object` or some other
-%% non-constraing type, and other cases where the type-from-context is
-%% actually used to select the function literal signature must be described
-%% specifically for each relevant type of situation.
+\LMHash{}%
+The grammar does not allow a function literal to declare a return type,
+but it is possible for a function literal to have a
+\IndexCustom{declared return type}{literal!function!declared return type},
+because it can be obtained by means of type inference.
+Such a return type is included
+when we refer to the declared return type of a function.
 
-\LMHash{}
-The class of a function literal implements the built-in class \FUNCTION{}.
+\commentary{%
+Type inference will be specified in a future version of this document.
+Currently we consider type inference to be a phase that has completed,
+and this document specifies the meaning of Dart programs
+where inferred types have already been added.
+}
 
-\LMHash{}
-The static type of a function literal of the form
-
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
-
-\code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$]) => $e$}
-
-\noindent
-is
-
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow T_0$},
-
-\noindent
-%% TODO[inference]: The static type of the function literal may come from context.
-where $T_0$ is the static type of $e$.
-
-\LMHash{}
-The static type of a function literal of the form
-
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
-
-\code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$]) \ASYNC{} => $e$}
-
-\noindent
-is
-
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
-
-\code{($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ Future<\flatten{T_0}>},
-
-\noindent
-where $T_0$ is the static type of $e$.
-
-\LMHash{}
-In the previous two paragraphs, the type argument lists are omitted in the case where $m = 0$, and \flatten{T} is defined as follows:
+\LMHash{}%
+We define the auxiliary function
+\IndexCustom{\flatten{T}}{flatten(t)@\emph{flatten}$(T)$},
+which is used below and in other sections, as follows:
 
 \begin{itemize}
 \item If $T$ is \code{FutureOr<$S$>} for some $S$ then $\flatten{T} = S$.
@@ -5329,10 +6899,10 @@
 \item Otherwise if
 \code{$T <:$ Future}
 then let $S$ be a type such that
-\code{$T <<$ Future<$S$>}
+\code{$T <:$ Future<$S$>}
 and for all $R$, if
-\code{$T <<$ Future<$R$>}
-then $S << R$.
+\code{$T <:$ Future<$R$>}
+then $S <: R$.
 
 \rationale{
 This ensures that
@@ -5349,166 +6919,249 @@
 \item In any other circumstance, $\flatten{T} = T$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
+\Case{Positional, arrow}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
+\code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$]) => $e$}
+
+\noindent
+is
+\FunctionTypePositionalStd{T_0},
+
+\noindent
+%% TODO[inference]: The static type of the function literal may come from context.
+where $T_0$ is the static type of $e$.
+\EndCase
+
+\LMHash{}%
+\Case{Positional, arrow, future}
+The static type of a function literal of the form
+
+\noindent
+\code{<\TypeParametersStd>}
+
+\noindent
+\code{($T_1\ a_1, \ldots,\ T_n\ a_n,$ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$]) \ASYNC{} => $e$}
+
+\noindent
+is
+\FunctionTypePositionalStdCr{\code{Future<\flatten{T_0}>}},
+
+\noindent
+where $T_0$ is the static type of $e$.
+\EndCase
+
+\LMHash{}%
+\Case{Named, arrow}
+The static type of a function literal of the form
+
+\noindent
+\code{<\TypeParametersStd>}
+
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ \{$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$\}) => $e$}
 
 \noindent
 is
-
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow T_0$},
+\FunctionTypeNamedStd{T_0},
 
 \noindent
 where $T_0$ is the static type of $e$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
+\Case{Named, arrow, future}
 The static type of a function literal of the form
 
-\code{<$X_1 B_1, \ldots,\ X_m B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ \{$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$\}) \ASYNC{} => $e$}
 
 \noindent
 is
-
-\code{<$X_1 B_1, \ldots,\ X_m B_m$>}
-
-\code{($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow$ Future<\flatten{T_0}>},
+\FunctionTypeNamedStdCr{\code{Future<\flatten{T_0}>}},
 
 \noindent
 where $T_0$ is the static type of $e$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
+\Case{Positional, block}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParameters{X}{B}{S}>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k}= d_k$]) \{ $s$ \}}
 
 \noindent
 is
+\FunctionTypePositionalStdCr{\DYNAMIC}
+\EndCase
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ \DYNAMIC{}}.
-
-\LMHash{}
+\LMHash{}%
+\Case{Positional, block, future}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$]) \ASYNC{} \{ $s$ \}}
 
 \noindent
 is
+%% TODO(eernst): Adjust to take type inference into account.
+\FunctionTypePositionalStdCr{\code{Future}}.
+\EndCase
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ Future}.
-
-\LMHash{}
+\LMHash{}%
+\Case{Positional, block, stream}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k}= d_k$]) \ASYNC*{} \{ $s$ \}}
 
 \noindent
 is
+%% TODO(eernst): Adjust to take type inference into account.
+\FunctionTypePositionalStdCr{\code{Stream}}.
+\EndCase
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ Stream}.
-
-\LMHash{}
+\LMHash{}%
+\Case{Positional, block, iterable}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k}= d_k$]) \SYNC*{} \{ $s$ \}}
 
 \noindent
 is
+%% TODO(eernst): Adjust to take type inference into account.
+\FunctionTypePositionalStdCr{\code{Iterable}}.
+\EndCase
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ Iterable}.
-
-\LMHash{}
+\LMHash{}%
+\Case{Named, block}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ [$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k}= d_k$]) \{ $s$ \}}
 
 \noindent
 is
+%% TODO(eernst): Adjust to take type inference into account.
+\FunctionTypePositionalStdCr{\DYNAMIC}.
+\EndCase
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ [$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$]) $ \rightarrow$ \DYNAMIC{}}.
-
-\LMHash{}
+\LMHash{}%
+\Case{Named, block, future}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ \{$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$\}) \ASYNC{} \{ $s$ \}}
 
 \noindent
 is
+%% TODO(eernst): Adjust to take type inference into account.
+\FunctionTypeNamedStdCr{\code{Future}}.
+\EndCase
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow$ Future}.
-
-\LMHash{}
+\LMHash{}%
+\Case{Named, block, stream}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ \{$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$\}) \ASYNC*{} \{ $s$ \}}
 
 \noindent
 is
+%% TODO(eernst): Adjust to take type inference into account.
+\FunctionTypeNamedStdCr{\code{Stream}}.
+\EndCase
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow$ Stream}.
-
-\LMHash{}
+\LMHash{}%
+\Case{Named, block, iterable}
 The static type of a function literal of the form
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>}
+\noindent
+\code{<\TypeParametersStd>}
 
+\noindent
 \code{($T_1\ a_1, \ldots,\ T_n\ a_n, $ \{$T_{n+1}\ x_{n+1} = d_1, \ldots,\ T_{n+k}\ x_{n+k} = d_k$\}) \SYNC*{} \{ $s$ \}}
 
 \noindent
 is
+%% TODO(eernst): Adjust to take type inference into account.
+\FunctionTypeNamedStdCr{\code{Iterable}}.
+\EndCase
 
-\code{<$X_1\ B_1, \ldots,\ X_m\ B_m$>($T_1, \ldots,\ T_n, $ \{$T_{n+1}\ x_{n+1}, \ldots,\ T_{n+k}\ x_{n+k}$\}) $ \rightarrow$ Iterable}.
-
-\LMHash{}
+\LMHash{}%
 In all of the above cases,
 the type argument lists are omitted when $m=0$,
-and whenever $T_i, 1 \le i \le n+k$, is not specified,
+and whenever $T_i$ is not specified, $i \in 1 .. n+k$,
 it is considered to have been specified as \DYNAMIC{}.
 
+\LMHash{}%
+Evaluation of a function literal yields a function object $o$.
+
+\commentary{
+The run-time type of $o$ is specified based on
+the static type $T$ of the function literal
+and the binding of type variables occurring in $T$
+at the occasion where the evaluation occurred
+(\ref{typeOfAFunction}).
+}
+
 
 \subsection{This}
 \LMLabel{this}
 
-\LMHash{}
+\LMHash{}%
 The reserved word \THIS{} denotes the target of the current instance member invocation.
 
 \begin{grammar}
 <thisExpression> ::= \THIS{}
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 The static type of \THIS{} is the interface of the immediately enclosing class.
 
 \commentary{
 We do not support self-types at this point.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if \THIS{} appears, implicitly or explicitly, in a top-level function or variable initializer, in a factory constructor, or in a static method or variable initializer, or in the initializer of an instance variable.
 
 
 \subsection{Instance Creation}
 \LMLabel{instanceCreation}
 
-\LMHash{}
+\LMHash{}%
 Instance creation expressions generally produce instances
 and invoke constructors to initialize them.
 
@@ -5525,7 +7178,7 @@
 
 %It is a compile-time error if a constructor of a non-generic type invoked by a new expression or a constant object expression is passed any type arguments. It is a compile-time error if a constructor of a generic type with $n$ type parameters invoked by a new expression or a constant object expression is passed $m$ type arguments where $m \ne n$, or if any of its type arguments is misconstructed (\ref{parameterizedTypes}).
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if
 the type $T$ in an instance creation expression of one of the forms
 
@@ -5546,14 +7199,14 @@
 \subsubsection{New}
 \LMLabel{new}
 
-\LMHash{}
-The {\em new expression} invokes a constructor (\ref{constructors}).
+\LMHash{}%
+The \Index{new expression} invokes a constructor (\ref{constructors}).
 
 \begin{grammar}
-<newExpression> ::= \NEW{} <type> (`.' <identifier>)? <arguments>
+<newExpression> ::= \NEW{} <typeNotVoid> (`.' <identifier>)? <arguments>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Let $e$ be a new expression of the form
 
 \code{\NEW{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
@@ -5561,15 +7214,16 @@
 
 \code{\NEW{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $T$ is not
 a class or a parameterized type accessible in the current scope,
 or if $T$ is a parameterized type which is not a class.
 \commentary{
-For instance, \code{\NEW{} F<int>()} is an error if \code{F} is a type alias.
+For instance, \code{\NEW{} F<int>()} is an error if \code{F} is a type alias
+that does not denote a class.
 }
 
-\LMHash{}
+\LMHash{}%
 If $T$ is a parameterized type (\ref{parameterizedTypes})
 \code{$S$<$U_1, \ldots,\ U_m$>},
 let $R$ be the generic class $S$,
@@ -5591,10 +7245,10 @@
   a constructor declared by $R$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Let $q$ be the above-mentioned constructor named \code{$R$.\id} or $R$.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $R$ is abstract
 and $q$ is not a factory constructor.
 It is a compile-time error if $R$ is a non-generic class
@@ -5611,7 +7265,7 @@
 and $T$ is not regular-bounded
 (\ref{superBoundedTypes}).
 
-\LMHash{}
+\LMHash{}%
 If $q$ is a redirecting factory constructor,
 it is a compile-time error if $q$ in some number of
 redirecting factory redirections redirects to itself.
@@ -5624,7 +7278,7 @@
 are detected at compile time.
 }
 
-\LMHash{}
+\LMHash{}%
 Let $S_i$ be the static type of
 the formal parameter of the constructor \code{$R$.\id} (respectively $R$)
 corresponding to the actual argument $a_i$, $i \in 1 .. n+k$.
@@ -5635,13 +7289,13 @@
 The non-generic case is covered with $m = 0$.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of $e$ is $T$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of $e$ proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First, the argument part
 
 \code{<$U_1, \ldots,\ U_m$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
@@ -5659,11 +7313,12 @@
 $[u_1/X_1, \ldots, u_m/X_m]S_j$,
 a dynamic type error occurs.
 
-\LMHash{}
+\LMHash{}%
 \Case{Non-loaded deferred constructors}
 If $T$ is a deferred type with prefix $p$, then if $p$ has not been successfully loaded, a dynamic error occurs.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{Generative constructors}
 When $q$ is a generative constructor
 (\ref{generativeConstructors})
@@ -5679,13 +7334,14 @@
 if $R$ is a generic class,
 with its type parameters bound to $u_1, \ldots, u_m$.
 
-\LMHash{}
-If execution of $q$ completes normally (\ref{completion}), $e$ evaluates to $i$.
+\LMHash{}%
+If execution of $q$ completes normally (\ref{statementCompletion}), $e$ evaluates to $i$.
 Otherwise execution of $q$ throws an exception object $x$ and stack trace $t$,
 and then evaluation of $e$ also throws exception object $x$ and stack trace $t$
 (\ref{evaluation}).
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{Redirecting factory constructors}
 When $q$ is a redirecting factory constructor
 (\ref{factories})
@@ -5698,18 +7354,19 @@
 in an environment where
 $v_j$ is a fresh variable bound to $o_j$ for $j \in 1 .. n + k$, and
 $X_j$ is bound to $u_j$ for $j \in 1 .. m$.
-\commentary{
-We need access to the type variables because $c$ may contain them.
+\commentary{%
+We need access to the type variables because $c$ may contain them.%
 }
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{Non-redirecting factory constructors}
 When $q$ is a non-redirecting factory constructor,
 the body of $q$ is executed with respect to
 the bindings that resulted from the evaluation of the argument list,
 and with the type parameters, if any, of $q$ bound to
 the actual type arguments $u_1, \ldots, u_m$.
-If this execution returns a value (\ref{completion}),
+If this execution returns a value (\ref{statementCompletion}),
 then $e$ evaluates to the returned value.
 Otherwise, if the execution completes normally or returns with no value,
 then $e$ evaluates to the null object (\ref{null}).
@@ -5720,20 +7377,21 @@
 A factory constructor can be declared in an abstract class and used safely,
 as it will either produce a valid instance or throw.
 }
+\EndCase
 
 
 \subsubsection{Const}
 \LMLabel{const}
 
-\LMHash{}
-A {\em constant object expression} invokes a constant constructor
+\LMHash{}%
+A \Index{constant object expression} invokes a constant constructor
 (\ref{constantConstructors}).
 
 \begin{grammar}
-<constObjectExpression> ::= \CONST{} <type> (`.' <identifier>)? <arguments>
+<constObjectExpression> ::= \CONST{} <typeNotVoid> (`.' <identifier>)? <arguments>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Let $e$ be a constant object expression of the form
 
 \code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
@@ -5741,7 +7399,7 @@
 
 \code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $T$ is not
 a class or a parameterized type accessible in the current scope,
 or if $T$ is a parameterized type which is not a class.
@@ -5751,11 +7409,11 @@
 In particular, $T$ must not be a type variable.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $a_i$ is not a constant expression
 for some $i \in 1 .. n + k$.
 
-\LMHash{}
+\LMHash{}%
 If $T$ is a parameterized type (\ref{parameterizedTypes})
 \code{$S$<$U_1, \ldots,\ U_m$>},
 let $R$ be the generic class $S$,
@@ -5764,9 +7422,9 @@
 be the formal type parameters of $S$.
 If $T$ is not a parameterized type, let $R$ be $T$.
 
-\LMHash{}
+\LMHash{}%
 If $T$ is a parameterized type,
-it is a compile-time error if $U_j$ contains a type variable for any
+it is a compile-time error if $U_j$ is not a constant type expression for any
 $j \in 1 .. m$.
 
 \begin{itemize}
@@ -5782,14 +7440,14 @@
   a constant constructor declared by $R$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Let $q$ be the above-mentioned constant constructor named \code{$R$.\id} or $R$.
 
 %% TODO(eernst): These errors are the same as with `new`. Can we avoid
 %% stating them twice? We'd need to refer to an awkwardly shaped portion
 %% of text in the previous subsection, or just loosely say "exactly the
 %% same errors"..
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $R$ is abstract
 and $q$ is not a factory constructor.
 It is a compile-time error if $R$ is a non-generic class
@@ -5806,7 +7464,7 @@
 and $T$ is not regular-bounded
 (\ref{superBoundedTypes}).
 
-\LMHash{}
+\LMHash{}%
 Let $S_i$ be the static type of
 the formal parameter of the constructor \code{$R$.\id} (respectively $R$)
 corresponding to the actual argument $a_i$, $i \in 1 .. n+k$.
@@ -5817,13 +7475,13 @@
 The non-generic case is covered with $m = 0$.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of $e$ is $T$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of $e$ proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 If $e$ is of the form
 \code{\CONST{} $T$.\id($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 let $i$ be the value of the expression $e'$:
@@ -5839,7 +7497,7 @@
 This means that the value is well-defined.
 }
 
-\LMHash{}
+\LMHash{}%
 If $e$ is of the form
 \code{\CONST{} $T$($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
 let $i$ be the value of
@@ -5848,7 +7506,7 @@
 Which is well-defined for the same reason.
 }
 
-\LMHash{}
+\LMHash{}%
 \begin{itemize}
 \item If during execution of the program,
   a constant object expression has already evaluated to
@@ -5876,7 +7534,7 @@
 The constructor need only be executed once per call site, at compile time.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if evaluation of a constant object
 results in an uncaught exception being thrown.
 
@@ -5918,11 +7576,11 @@
 \subsection{Spawning an Isolate}
 \LMLabel{spawningAnIsolate}
 
-\LMHash{}
+\LMHash{}%
 Spawning an isolate is accomplished via what is syntactically an ordinary library call, invoking one of the functions \code{spawnUri()} or \code{spawn()} defined in the \code{dart:isolate} library.
 However, such calls have the semantic effect of creating a new isolate with its own memory and thread of control.
 
-\LMHash{}
+\LMHash{}%
 An isolate's memory is finite, as is the space available to its thread's call stack.
 It is possible for a running isolate to exhaust its memory or stack, resulting in a run-time error that cannot be effectively caught, which will force the isolate to be suspended.
 
@@ -5934,7 +7592,7 @@
 \subsection{Function Invocation}
 \LMLabel{functionInvocation}
 
-\LMHash{}
+\LMHash{}%
 Function invocation occurs in the following cases:
 when a function expression (\ref{functionExpressions}) is invoked (\ref{functionExpressionInvocation}),
 when a method (\ref{methodInvocation}), getter (\ref{topLevelGetterInvocation}, \ref{propertyExtraction}) or setter (\ref{assignment}) is invoked,
@@ -5946,24 +7604,24 @@
 and the formal parameters of $f$ are bound to corresponding actual arguments.
 When the body of $f$ is executed it will be executed with the aforementioned bindings.
 
-\LMHash{}
+\LMHash{}%
 Executing a body of the form \code{=> $e$} is equivalent to executing a body of the form \code{\{ return $e$; \}}.
 Execution a body of the form \code{\ASYNC{} => $e$} is equivalent to executing a body of the form \code{\ASYNC{} \{ return $e$; \}}.
 
-\LMHash{}
+\LMHash{}%
 If $f$ is synchronous and is not a generator (\ref{functions}) then execution of the body of $f$ begins immediately.
-If the execution of the body of $f$ returns a value, $v$, (\ref{completion}), the invocation evaluates to $v$.
+If the execution of the body of $f$ returns a value, $v$, (\ref{statementCompletion}), the invocation evaluates to $v$.
 If the execution completes normally or it returns without a value, the invocation evaluates to the null object (\ref{null}).
 If the execution throws an exception object and stack trace, the invocation throws the same exception object and stack trace (\ref{evaluation}).
 
 \commentary{
-A complete function body can never break or contine (\ref{completion})
+A complete function body can never break or continue (\ref{statementCompletion})
 because a \BREAK{} or \CONTINUE{} statement must always occur inside the statement that is the target of the \BREAK{} or \CONTINUE{}.
 This means that a function body can only either complete normally, throw, or return.
 Completing normally or returning without a value is treated the same as returning the null object (\ref{null}), so the result of executing a function body can always be used as the result of evaluating an expression, either by evaluating to a value or by the evaluation throwing.
 }
 
-\LMHash{}
+\LMHash{}%
 If $f$ is marked \code{\SYNC*} (\ref{functions}),
 then a fresh instance (\ref{generativeConstructors}) $i$
 implementing \code{Iterable<$U$>} is immediately returned,
@@ -5978,7 +7636,7 @@
 The only method that needs to be added by the Dart implementation in that case is \code{iterator}.
 }
 
-\LMHash{}
+\LMHash{}%
 The iterable implementation must comply with the contract of \code{Iterable} and should not take any steps identified as exceptionally efficient in that contract.
 
 \commentary{
@@ -5989,11 +7647,11 @@
 It would not be acceptable to pre-compute the results of the generator and cache them, for example.
 }
 
-\LMHash{}
+\LMHash{}%
 When iteration over the iterable is started, by getting an iterator $j$ from the iterable and calling \code{moveNext()}, execution of the body of $f$ will begin.
-When execution of the body of $f$ completes (\ref{completion}),
+When execution of the body of $f$ completes (\ref{statementCompletion}),
 \begin{itemize}
-\item If it returns without a value or it completes normally (\ref{completion}), $j$ is positioned after its last element, so that its current value is the null object (\ref{null}) and the current call to \code{moveNext()} on $j$ returns false, as must all further calls.
+\item If it returns without a value or it completes normally (\ref{statementCompletion}), $j$ is positioned after its last element, so that its current value is the null object (\ref{null}) and the current call to \code{moveNext()} on $j$ returns false, as must all further calls.
 \item If it throws an exception object $e$ and stack trace $t$ then the current value of $j$ is the null object (\ref{null}) and the current call to \code{moveNext()} throws $e$ and $t$ as well.
 Further calls to \code{moveNext()} must return false.
 \end{itemize}
@@ -6012,14 +7670,14 @@
 If the iterator depends on external state that might change, it should check that the state is still valid after every yield (and maybe throw a \code{ConcurrentModificationError} if it isn't).
 }
 
-\LMHash{}
+\LMHash{}%
 Each iterator runs with its own shallow copies of all local variables; in particular, each iterator has the same initial arguments, even if their bindings are modified by the function.
 \commentary{
 Two executions of an iterator interact only via state outside the function.
 }
 % The alternative would be to cache the results of an iterator in the iterable, and check the cache at each \YIELD{}.  This would have strange issues as well. The yielded value might differ from the expression in the yield. And it is a potential memory leak as the cache is kept alive by any iterator.
 
-\LMHash{}
+\LMHash{}%
 If $f$ is marked \ASYNC{} (\ref{functions}),
 then a fresh instance (\ref{generativeConstructors}) $o$ is associated with the invocation,
 where the dynamic type of $o$ implements \code{Future<$flatten(T)$>},
@@ -6028,7 +7686,7 @@
 \commentary{
 The body of $f$ may suspend during the evaluation of an \AWAIT{} expression or execution of an asynchronous \FOR{} loop.
 }
-The future $o$ is completed when execution of the body of $f$ completes (\ref{completion}).
+The future $o$ is completed when execution of the body of $f$ completes (\ref{statementCompletion}).
 If execution of the body returns a value, $o$ is completed with that value,
 if it completes normally or returns without a value,
 $o$ is completed with the null object (\ref{null}),
@@ -6038,10 +7696,10 @@
 completion of $o$ happens at some future time after the invocation has returned.
 \rationale{
 The caller needs time to set up error handling for the returned future,
-so the future is not completed with an error {\em before} it has been returned.
+so the future is not completed with an error \emph{before} it has been returned.
 }
 
-\LMHash{}
+\LMHash{}%
 If $f$ is marked \code{\ASYNC*} (\ref{functions}),
 then a fresh instance (\ref{generativeConstructors}) $s$
 implementing \code{Stream<$U$>} is immediately returned,
@@ -6052,7 +7710,7 @@
 When $s$ is listened to, execution of the body of $f$ will begin.
 When execution of the body of $f$ completes:
 \begin{itemize}
-\item If it completes normally or returns with no value (\ref{completion}), then if $s$ has been canceled then its cancellation future is completed with the null object (\ref{null}).
+\item If it completes normally or returns with no value (\ref{statementCompletion}), then if $s$ has been canceled then its cancellation future is completed with the null object (\ref{null}).
 \item If it throws an exception object $e$ and stack trace $t$:
   \begin{itemize}
   \item If $s$ has been canceled then its cancellation future is completed with error $e$ and stack trace $t$.
@@ -6061,7 +7719,7 @@
 \item $s$ is closed.
 \end{itemize}
 \commentary{
-The body of an asynchronous generator function cannot break, continue or return a value (\ref{completion}).
+The body of an asynchronous generator function cannot break, continue or return a value (\ref{statementCompletion}).
 The first two are only allowed in contexts that will handle the break or continue, and return statements with an expression are not allowed in generator functions.
 }
 
@@ -6070,14 +7728,14 @@
 We choose to direct any exceptions that occur at this time to the cancellation future rather than have them be lost.
 }
 
-%\LMHash{}
+%\LMHash{}%
 %When a stream is canceled, the implementation must wait for the cancelation future returned by \code{cancell()} to complete before proceeding.
 
 
 \subsubsection{Actual Argument Lists}
 \LMLabel{actualArgumentLists}
 
-\LMHash{}
+\LMHash{}%
 Actual argument lists have the following syntax:
 
 \begin{grammar}
@@ -6089,20 +7747,20 @@
 <namedArgument> ::= <label> <expression>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Argument lists allow an optional trailing comma after the last argument (\syntax{`,'?}).
 An argument list with such a trailing comma is equivalent in all ways to the same parameter list without the trailing comma.
 All argument lists in this specification are shown without a trailing comma,
 but the rules and semantics apply equally to the corresponding argument list with a trailing comma.
 
-\LMHash{}
+\LMHash{}%
 Let $L$ be an argument list of the form
 \code{($e_1 \ldots,\ e_m,\ y_{m+1}$: $e_{m+1} \ldots,\ y_{m+p}$: $e_{m+p}$)}
 and assume that the static type of $e_i$ is $S_i$, $i \in 1 .. m+p$.
-The {\em static argument list type} of $L$ is then
+The \Index{static argument list type} of $L$ is then
 \code{($S_1 \ldots,\ S_m,\ S_{m+1}\ y_{m+1} \ldots,\ S_{m+p}\ y_{m+p}$)}.
 
-\LMHash{}
+\LMHash{}%
 Let $\argumentList{S}$ be the static argument list type
 
 \code{($S_1 \ldots,\ S_m,\ S_{m+1}\ y_{m+1} \ldots,\ S_{m+p}\ y_{m+p}$)}
@@ -6115,13 +7773,15 @@
 \noindent
 where each parameter may be marked \COVARIANT{} (\commentary{not shown, but allowed}).
 
-\LMHash{}
-We say that $\argumentList{S}$ {\em is a subtype match} for $\parameterList{P}$
+\LMHash{}%
+We say that $\argumentList{S}$ is
+a \Index{subtype match} for $\parameterList{P}$
 if{}f $p = 0$, $n \leq m \leq n+k$, and $S_i$ is a subtype of $T_i$ for all $i \in 1 .. m$.
-We say that $\argumentList{S}$ {\em is an assignable match} for $\parameterList{P}$
+We say that $\argumentList{S}$ is
+an \Index{assignable match} for $\parameterList{P}$
 if{}f $p = 0$, $n \leq m \leq n+k$, and $S_i$ is assignable to $T_i$ for all $i \in 1 .. m$.
 
-\LMHash{}
+\LMHash{}%
 Let $\argumentList{S}$ be the static argument list type
 
 \code{($S_1 \ldots,\ S_m,\ S_{m+1}\ y_{m+1} \ldots,\ S_{m+p}\ y_{m+p}$)}
@@ -6134,15 +7794,17 @@
 \noindent
 where each parameter may be marked \COVARIANT{} (\commentary{not shown, but allowed}).
 
-\LMHash{}
-We say that $\argumentList{S}$ {\em is a subtype match} for $\parameterList{P}$
+\LMHash{}%
+We say that $\argumentList{S}$ is
+a \Index{subtype match} for $\parameterList{P}$
 if{}f $m = n$,
 $\{y_{m+1}\ldots,\ y_{m+p}\} \subseteq \{x_{n+1}\ldots,\ x_{n+k}\}$,
 $S_i$ is a subtype of $T_i$ for all $i \in 1 .. m$,
 and $S_i$ is a subtype of $T_j$ whenever $y_i = x_j$ and
 $j \in n + 1 .. n + k$, for all
 $i \in m + 1 .. m + p$.
-We say that $\argumentList{S}$ {\em is an assignable match} for $\parameterList{P}$
+We say that $\argumentList{S}$
+is an \Index{assignable match} for $\parameterList{P}$
 if{}f $m = n$,
 $\{y_{m+1}\ldots,\ y_{m+p}\} \subseteq \{x_{n+1}\ldots,\ x_{n+k}\}$,
 $S_i$ is assignable to $T_i$ for all $i \in 1 .. m$,
@@ -6159,11 +7821,11 @@
 \subsubsection{Actual Argument List Evaluation}
 \LMLabel{actualArguments}
 
-\LMHash{}
+\LMHash{}%
 Function invocation involves evaluation of the list of actual arguments to the function,
 and binding of the results to the function's formal parameters.
 
-\LMHash{}
+\LMHash{}%
 When parsing an argument list, an ambiguity may arise because the same source code could be one generic function invocation,
 and it could be two or more relational expressions and/or shift expressions.
 In this situation, the expression is always parsed as a generic function invocation.
@@ -6184,14 +7846,14 @@
 Also, we expect that it will be more common to have generic function invocations as actual arguments than having relational or shift expressions that happen to match up and have parentheses at the end, such that the ambiguity arises.
 }
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an actual argument part of the form
 
 \code{<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_m,\ q_1$: $a_{m+1}, \ldots,\ q_l$: $a_{m+l}$)}
 
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The type arguments $A_1, \ldots, A_r$ are evaluated in the order they appear in the program, producing types $t_1, \ldots, t_r$.
 The arguments $a_1, \ldots, a_{m+l}$ are evaluated in the order they appear in the program, producing objects $o_1, \ldots, o_{m+l}$.
 
@@ -6211,7 +7873,7 @@
 and similarly for empty type parameter lists (\ref{generics}).
 }
 
-\LMHash{}
+\LMHash{}%
 Consider an invocation $i$ of a function $f$ with an actual argument part of the form
 \code{<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_m,\ q_1$: $a_{m+1}, \ldots,\ q_l$: $a_{m+l}$)}.
 
@@ -6244,19 +7906,19 @@
 the word `function' is more low-level than `function object',
 but `function' still denotes a semantic entity
 which is associated with a function declaration,
-even though there may not be corresponding entity in the heap at run time.
+even though there may not be a corresponding entity in the heap at run time.
 }
 
-\LMHash{}
+\LMHash{}%
 % We cannot pass the same named parameter twice.
 It is a compile-time error if $q_j = q_k$ for any $j \ne k$.
 
-\LMHash{}
+\LMHash{}%
 If the static type of $f$ is \DYNAMIC{} or the built-in class \FUNCTION{},
 no further static checks are performed and the static type of $i$ is \DYNAMIC{};
 otherwise, it is a compile-time error if the static type of $f$ is not a function type.
 
-\LMHash{}
+\LMHash{}%
 Otherwise, the static type of $f$ is a function type $F$.
 Let $S_0$ be the return type of $F$,
 let $X_1\ \EXTENDS\ B_1, \ldots, X_s\ \EXTENDS\ B_s$
@@ -6266,13 +7928,16 @@
 and let $p_{h+1}, \ldots, p_{h+k}$ be the optional parameters of $F$.
 Let $S_i$ be the static type of the formal parameters $p_i, i \in 1 .. h+k$,
 and for each $q$ let $S_q$ be the type of the parameter named $q$,
-where each parameter type is obtained by replacing $X_j$ by $A_j, j \in 1 .. s$, in the given parameter type annotation.
+where each parameter type is obtained by replacing $X_j$ by $A_j, j \in 1 .. s$,
+in the given parameter type annotation.
 Finally, let $T_i$ be the static type of $a_i$.
 
 \commentary{
-We have an actual argument list consisting of $r$ type arguments, $m$ positional arguments, and $l$ named arguments.
-We have a function with $s$ type parameters, $h$ required parameters, and $k$ optional parameters.
-Figure~\ref{fig:argumentsAndParameters} shows how this situation may arise.
+We have an actual argument list consisting of $r$ type arguments,
+$m$ positional arguments, and $l$ named arguments.
+We have a function with $s$ type parameters,
+$h$ required parameters, and $k$ optional parameters.
+Figure~\ref{fig:argumentsAndParameters} shows how this situation arises.
 }
 
 % View on declaration:
@@ -6334,7 +7999,7 @@
   \label{fig:argumentsAndParameters}
 \end{figure}
 
-\LMHash{}
+\LMHash{}%
 % Type inference is assumed complete, so we must have the correct number of type arguments.
 It is a compile-time error if $r \not= s$.
 It is a compile-time error if $r = s$ and for some $j \in 1 .. s$,
@@ -6352,20 +8017,46 @@
 For each named argument there must be a named parameter with the same name.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of $i$ is $[A_1/X_1, \ldots, A_r/X_s]S_0$.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $T_j$ may not be assigned to $S_j, j \in 1 .. m$.
 It is a compile-time error if $T_{m+j}$ may not be assigned to $S_{q_j}, j \in 1 .. l$.
 
-\LMHash{}
+\commentary{
+Consider the case where the function invocation in focus here is
+an instance method invocation.
+In that case, for each actual argument,
+the corresponding parameter may be covariant.
+However, the above assignability requirements apply equally
+both when the parameter is covariant and when it is not.
+}
+
+\rationale{
+Parameter covariance in an instance method invocation can be introduced by
+a subtype of the statically known receiver type,
+which means that any attempt to flag a given actual argument as dangerous
+due to the dynamic type check that it will be subjected to
+will be incomplete:
+some actual arguments can be subjected to such a dynamic type check
+even though this is not known statically at the call site.
+This is not surprising for a mechanism like parameter covariance which is
+designed for the very purpose of allowing developers to explicitly request
+that this specific kind of compile-time safety is violated.
+The point is that this mechanism postpones the enforcement of
+the underlying invariant to run time,
+and in return allows some useful program designs
+that would otherwise be rejected at compile-time.
+}
+
+\LMHash{}%
 For the dynamic semantics,
 let $f$ be a function with $s$ type parameters and $h$ required parameters;
 let $p_1, \ldots, p_n$ be the positional parameters of $f$;
 and let $p_{h+1}, \ldots, p_{h+k}$ be the optional parameters declared by $f$.
 
-\LMHash{}
+\LMHash{}%
 An evaluated actual argument part
 
 \code{<$t_1, \ldots,\ t_r$>($o_1, \ldots,\ o_m,\ q_1$: $o_{m+1},\ \ldots,\ q_l$: $o_{m+l}$)}
@@ -6378,7 +8069,7 @@
 \noindent
 is bound to the formal type parameters and formal parameters of $f$ as follows:
 
-\LMHash{}
+\LMHash{}%
 % Passing a wrong number of actual type arguments.
 If $r = 0$ and $s > 0$ then replace the actual type argument list:
 %% TODO[instantiate-to-bound]: The actual type arguments passed here
@@ -6406,7 +8097,7 @@
 All of these remaining parameters are necessarily optional and thus have default values.
 }
 
-\LMHash{}
+\LMHash{}%
 % Check the type arguments.
 It is a dynamic type error if $t_i$ is not a subtype of the actual bound
 (\ref{actualTypeOfADeclaration})
@@ -6426,7 +8117,7 @@
 \subsubsection{Unqualified Invocation}
 \LMLabel{unqualifiedInvocation}
 
-\LMHash{}
+\LMHash{}%
 An unqualified function invocation $i$ has the form
 
 \code{\id<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
@@ -6438,13 +8129,13 @@
 Note that the type argument list is omitted when $r = 0$ (\ref{generics}).
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $i$ occurs inside a top-level or static function
 (be it function, method, getter, or setter)
 or a top-level or static variable initializer,
 and there is no lexically visible declaration named \id{} in scope.
 
-\LMHash{}
+\LMHash{}%
 If there exists a lexically visible declaration named \id,
 let $f_{id}$ be the innermost such declaration.
 Then:
@@ -6483,7 +8174,7 @@
 \subsubsection{Function Expression Invocation}
 \LMLabel{functionExpressionInvocation}
 
-\LMHash{}
+\LMHash{}%
 A function expression invocation $i$ has the form
 
 \code{$e_f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)},
@@ -6495,7 +8186,7 @@
 Note that the type argument list is omitted when $r = 0$ (\ref{generics}).
 }
 
-\LMHash{}
+\LMHash{}%
 If $e_f$ is an identifier \id, then \id{} must necessarily denote
 a local function, a library function, a library or static getter or a variable as described above,
 or $i$ is not considered a function expression invocation.
@@ -6509,7 +8200,7 @@
 but $e_f$ may also have other forms, e.g., \code{p.C}.
 }
 
-\LMHash{}
+\LMHash{}%
 If $e_f$ is a property extraction expression (\ref{propertyExtraction}),
 then $i$ isn't a function expression invocation and is instead recognized as an ordinary method invocation (\ref{ordinaryInvocation}).
 
@@ -6520,12 +8211,12 @@
 The \code{Invocation} passed to \code{noSuchMethod()} would describe a call to a method \code{$b$} with argument \code{$x$} in the former case, and a call to a getter \code{$b$} (with no arguments) in the latter.
 }
 
-\LMHash{}
+\LMHash{}%
 Let $F$ be the static type of $e_f$.
 The static analysis of $i$ is performed as specified in Section~\ref{bindingActualsToFormals},
 and the static type of $i$ is as specified there.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a function expression invocation
 
 \code{$e_f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
@@ -6541,7 +8232,7 @@
 and executing the body of $f$ with those bindings;
 the returned result is then the result of evaluating $i$.
 
-\LMHash{}
+\LMHash{}%
 Otherwise $o$ is not a function object.
 If $o$ has a method named \CALL{}
 the following ordinary method invocation is evaluated,
@@ -6549,7 +8240,7 @@
 
 \code{$f$.call<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
-\LMHash{}
+\LMHash{}%
 Otherwise $o$ has no method named \CALL{}.
 A new instance $im$ of the predefined class \code{Invocation} is created, such that:
 \begin{itemize}
@@ -6567,7 +8258,7 @@
 \code{<Type>[$A_1, \ldots,\ A_r$]}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Then the method invocation \code{f.noSuchMethod($im$)} is evaluated,
 and its result is then the result of evaluating $i$.
 
@@ -6583,50 +8274,63 @@
 \subsection{Function Closurization}
 \LMLabel{functionClosurization}
 
-\LMHash{}
+\LMHash{}%
 Let $f$ be an expression denoting
 a declaration of a local function, a static method, or a top-level function
 (\ref{identifierReference})
 or let $f$ be a function literal
 (\ref{functionExpressions}).
 Evaluation of $f$ yields a function object
-which is the outcome of a {\em function closurization}
+which is the outcome of a \Index{function closurization}
 applied to the declaration denoted by $f$
 respectively to the function literal $f$ considered as a function declaration.
 % Note that we do not promise that this will be a fresh function object,
 % such that constant expressions are covered as well, and others may be
 % identical even if not required, e.g., local functions with no free variables.
-{\em Closurization} denotes instance method closurization
+\IndexCustom{Closurization}{closurization}
+denotes instance method closurization
 (\ref{ordinaryMemberClosurization})
 as well as function closurization,
 and it is also used as a shorthand for either of them when there is no ambiguity.
 
-\LMHash{}
+\LMHash{}%
 Function closurization applied to a function declaration $f$
 amounts to the creation of a function object $o$
-which is an instance of a class whose interface is a subtype of the actual type
+which is an instance of a class $C$ whose interface is
+a subtype of the actual type $F$
 (\ref{actualTypeOfADeclaration})
 corresponding to the signature in the function declaration $f$,
 using the current bindings of type variables, if any.
+There does not exist a function type $F'$ which is a proper subtype of $F$
+such that $C$ is a subtype of $F'$.
 If $f$ denotes a static method or top-level function,
-the corresponding class does not override the \code{==} operator
+class $C$ does not override the \code{==} operator
 inherited from the \code{Object} class.
-%
+
+\commentary{
+In other words, $C$ has the freedom to be a proper subtype of
+the function type that we can read off of the declaration of $f$
+because it may need to be a specific internal platform defined class,
+but $C$ does not have the freedom to be a subtype of
+a different and more special function type, and it cannot be \code{Null}.
+}
+
+\LMHash{}%
 An invocation of $o$ with a given argument list will bind actuals to formals
 in the same way as an invocation of $f$
 (\ref{bindingActualsToFormals}),
 and then execute the body of $f$
 in the captured scope amended with the bound parameter scope,
 yielding the same completion
-(\ref{completion})
+(\ref{statementCompletion})
 as the invocation of $f$ would have yielded.
 
 
 \subsection{Lookup}
 \LMLabel{lookup}
 
-\LMHash{}
-A {\em lookup} is a procedure which selects
+\LMHash{}%
+A \Index{lookup} is a procedure which selects
 a concrete instance member declaration based on a traversal of
 a sequence of classes, starting with a given class $C$
 and proceeding with the superclass of the current class at each step.
@@ -6644,7 +8348,7 @@
 { % Scope for 'lookup' definition.
 
 \def\LookupDefinitionWithStart#1{
-\LMHash{}
+\LMHash{}%
 The result of a
 {\em {#1} lookup for $m$ in $o$ with respect to $L$ starting in class $C$}
 is the result of a {#1} lookup for $m$ in $C$ with respect to $L$.
@@ -6660,7 +8364,7 @@
 
 }
 
-\LMHash{}
+\LMHash{}%
 Let $m$ be an identifier, $o$ an object, $L$ a library,
 and $C$ a class which is the class of $o$ or a superclass thereof.
 
@@ -6676,7 +8380,7 @@
 starting with the class of $o$.
 }
 
-\LMHash{}
+\LMHash{}%
 Let $m$ be an identifier, $o$ an object, and $L$ a library.
 \LookupDefinition{method}
 \LookupDefinition{getter}
@@ -6704,10 +8408,10 @@
 \subsection{Top level Getter Invocation}
 \LMLabel{topLevelGetterInvocation}
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a top-level getter invocation $i$ of the form $m$, where $m$ is an identifier, proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The getter function $m$ is invoked.
 The value of $i$ is the result returned by the call to the getter function.
 \commentary{
@@ -6715,26 +8419,29 @@
 Per the rules for identifier references, an identifier will not be treated as a top-level getter invocation unless the getter $i$ is defined.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of $i$ is the declared return type of $m$.
 
 
 \subsection{Method Invocation}
 \LMLabel{methodInvocation}
 
-\LMHash{}
+\LMHash{}%
 Method invocation can take several forms as specified below.
 
 
 \subsubsection{Ordinary Invocation}
 \LMLabel{ordinaryInvocation}
 
-\LMHash{}
-An ordinary method invocation can be {\em conditional} or {\em unconditional}.
+\LMHash{}%
+An ordinary method invocation can be conditional or unconditional.
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e$?.$m$<$\cdots$>($\cdots$)}}
-Consider a {\em conditional ordinary method invocation} $i$ of the form
+Consider a
+\IndexCustom{conditional ordinary method invocation}{%
+  method invocation!conditional ordinary}
+$i$ of the form
 \code{$e$?.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \commentary{
@@ -6743,7 +8450,7 @@
 and similarly for formal type parameter lists (\ref{generics}).
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of $i$ is the same as the static type of
 
 \code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
@@ -6756,25 +8463,28 @@
 \noindent
 are also generated in the case of $i$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of $i$ proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 If $e$ is a type literal, $i$ is equivalent to
 
 \code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
-\LMHash{}
+\LMHash{}%
 Otherwise, evaluate $e$ to an object $o$.
 If $o$ is the null object, $i$ evaluates to the null object (\ref{null}).
 Otherwise let $v$ be a fresh variable bound to $o$ and evaluate
 \code{$v$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 to a value $r$.
 Then $e$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e$.$m$<$\cdots$>($\cdots$)}}
-An {\em unconditional ordinary method invocation} $i$ has the form
+An \IndexCustom{unconditional ordinary method invocation}{%
+  method invocation!unconditional ordinary}
+$i$ has the form
 \code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
 \commentary{
@@ -6782,15 +8492,12 @@
 where the number of type arguments is zero (\ref{generics}).
 }
 
-\LMHash{}
+\LMHash{}%
 Let $T$ be the static type of $e$.
-It is a compile-time error if $T$ does not have an accessible (\ref{privacy}) instance member named $m$, unless either:
+It is a compile-time error if $T$ does not have an accessible
+(\ref{privacy})
+instance member named $m$, unless either:
 \begin{itemize}
-\item
-%% TODO(eernst): This is metaclass stuff, should be deleted.
-$T$ is \code{Type}, $e$ is a constant type literal,
-and the class corresponding to $e$ has a static getter named $m$.
-Or
 \item $T$ is \DYNAMIC{}.
 Or
 \item $T$ is \FUNCTION{} and $m$ is \CALL.
@@ -6805,12 +8512,12 @@
 }
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 If $T$ did not have an accessible member named $m$ the static type of $i$ is \DYNAMIC{},
 and no further static checks are performed on $i$
 (\commentary{except that subexpressions of $i$ are subject to their own static analysis}).
 
-\LMHash{}
+\LMHash{}%
 Otherwise \code{$T$.$m$} denotes an instance member.
 Let $L$ be the library that contains $i$.
 Let $d$ be the result of method lookup for $m$ in $T$ with respect to $L$,
@@ -6819,11 +8526,11 @@
 and let $F$ be the return type of $d$.
 (\commentary{Since \code{$T$.$m$} exists we cannot have a failure in both lookups.})
 
-\LMHash{}
+\LMHash{}%
 The static analysis of $i$ is performed as specified in Section~\ref{bindingActualsToFormals},
 and the static type of $i$ is as specified there.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error to invoke any of the methods of class \code{Object} on a prefix object (\ref{imports})
 or on a constant type literal that is immediately followed by the token `.'\,.
 
@@ -6834,46 +8541,40 @@
 If needed, \code{(int).toString()} may be used instead.
 }
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an unconditional ordinary method invocation $i$ of the form
 \code{$e$.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First, the expression $e$ is evaluated to a value $o$.
-Let $f$ be the result of looking up (\ref{lookup}) method $m$ in $o$ with respect to the current library $L$.
+Let $f$ be the result of looking up
+(\ref{lookup})
+method $m$ in $o$ with respect to the current library $L$.
 
-\LMHash{}
-%% TODO(eernst): This is metaclass stuff, should be deleted.
-If method lookup succeeded,
-but $o$ is an instance of \code{Type} and $e$ is not a constant type literal,
-then if $m$ is a method that forwards (\ref{functionDeclarations}) to a static method,
-method lookup is considered to have failed.
-
-\LMHash{}
+\LMHash{}%
 If the method lookup succeeded,
-the binding of actual arguments to formal parameters is performed as specified in Section~\ref{bindingActualsToFormals}.
-The body of $f$ is then executed with respect to the bindings that resulted from the evaluation of the argument list,
+the binding of actual arguments to formal parameters is performed
+as specified in Section~\ref{bindingActualsToFormals}.
+The body of $f$ is then executed with respect to the bindings
+that resulted from the evaluation of the argument list,
 and with \THIS{} bound to $o$.
 The value of $i$ is the value returned by the execution of $f$'s body.
 
-\LMHash{}
+\LMHash{}%
 If the method lookup failed,
-then let $g$ be the result of looking up getter (\ref{lookup}) $m$ in $o$ with respect to $L$.
-%% TODO(eernst): This is metaclass stuff, should be deleted.
-If getter lookup succeeded,
-but $o$ is an instance of \code{Type} and $e$ is not a constant type literal,
-then if $g$ is a getter that forwards to a static getter,
-getter lookup is considered to have failed.
+then let $g$ be the result of looking up getter
+(\ref{lookup})
+$m$ in $o$ with respect to $L$.
 
-\LMHash{}
+\LMHash{}%
 If the getter lookup succeeded then invoke the getter $o.m$
 and let $v_g$ be the returned value.
 Then the value of $i$ is the value of
 
 \code{$v_g$<$A_1, \ldots,\ A_r$>($a_1,\ \ldots,\ a_n,\ x_{n+1}$: $a_{n+1},\ \ldots,\ x_{n+k}$: $a_{n+k}$)}.
 
-\LMHash{}
+\LMHash{}%
 If getter lookup has also failed,
 then a new instance $im$ of the predefined class \code{Invocation} is created, such that:
 \begin{itemize}
@@ -6891,7 +8592,7 @@
   \code{<Type>[$A_1, \ldots,\ A_r$]}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Then the method \code{noSuchMethod()} is looked up in $o$ and invoked with argument $im$,
 and the result of this invocation is the result of evaluating $i$.
 
@@ -6900,13 +8601,15 @@
 when the static type of $e$ is \DYNAMIC{}.
 Notice that the wording avoids re-evaluating the receiver $o$ and the arguments $a_i$.
 }
+\EndCase
 
 
 \subsubsection{Cascaded Invocations}
 \LMLabel{cascadedInvocations}
 
-\LMHash{}
-A {\em cascaded method invocation} has the form \code{$e$..\metavar{suffix}}
+\LMHash{}%
+A \IndexCustom{cascaded method invocation}{method invocation!cascaded}
+has the form \code{$e$..\metavar{suffix}}
 where $e$ is an expression and \metavar{suffix} is a sequence of operator, method, getter or setter invocations.
 
 \begin{grammar}
@@ -6921,7 +8624,7 @@
   <typeArguments>? <arguments>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a cascaded method invocation expression $c$ of the form \code{$e$..\metavar{suffix}} proceeds as follows:
 
 Evaluate $e$ to an object $o$.
@@ -6929,7 +8632,7 @@
 Evaluate \code{$t$.\metavar{suffix}} to an object.
 Then $c$ evaluates to $o$.
 
-\LMHash{}
+\LMHash{}%
 The static type of $c$ is the static type of $e$.
 
 \rationale{
@@ -6946,7 +8649,7 @@
 
 % Conditional super invocation is meaningless: \THIS{} is not null.
 
-\LMHash{}
+\LMHash{}%
 A super method invocation $i$ has the form
 
 \code{\SUPER{}.$m$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}.
@@ -6957,7 +8660,7 @@
 and similarly for formal type parameter lists (\ref{generics}).
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a super method invocation occurs in a top-level function or variable initializer,
 in an instance variable initializer or initializer list,
 in class \code{Object},
@@ -6968,7 +8671,7 @@
 
 \def\SuperClass{\ensuremath{S_{\mbox{\scriptsize{}super}}}}
 
-\LMHash{}
+\LMHash{}%
 Let \SuperClass{} be the superclass (\ref{superclasses})
 of the immediately enclosing class for $i$,
 and let $L$ be the library that contains $i$.
@@ -6983,7 +8686,7 @@
 and let $F$ be the return type of $d$.
 If both lookups failed, a compile-time error occurs.
 
-\LMHash{}
+\LMHash{}%
 Otherwise (\commentary{when one of the lookups succeeded}),
 the static analysis of $i$ is performed as specified in Section~\ref{bindingActualsToFormals},
 considering the function to have static type $F$,
@@ -6995,7 +8698,7 @@
 as well as when it does not exist at all.
 }
 
-\LMHash{}
+\LMHash{}%
 Evaluation of $i$ proceeds as follows:
 Let $o$ be the current binding of \THIS{},
 let $C$ be the enclosing class for $i$,
@@ -7019,7 +8722,7 @@
 at compile-time, and the program then has a compile-time error.
 }
 
-\LMHash{}
+\LMHash{}%
 Otherwise perform the binding of actual arguments to formal parameters for
 \code{$f$<$A_1, \ldots,\ A_r$>($a_1, \ldots,\ a_n,\ x_{n+1}$: $a_{n+1}, \ldots,\ x_{n+k}$: $a_{n+k}$)}
 as specified in Section~\ref{bindingActualsToFormals},
@@ -7033,7 +8736,7 @@
 \subsubsection{Sending Messages}
 \LMLabel{sendingMessages}
 
-\LMHash{}
+\LMHash{}%
 Messages are the sole means of communication among isolates.
 Messages are sent by invoking specific methods in the Dart libraries; there is no specific syntax for sending a message.
 
@@ -7045,76 +8748,160 @@
 \subsection{Property Extraction}
 \LMLabel{propertyExtraction}
 
-\LMHash{}
-{\em Property extraction} allows for a member to be accessed as a property rather than a function.
+\LMHash{}%
+\IndexCustom{Property extraction}{property extraction}
+allows for a member to be accessed as a property rather than a function.
 A property extraction can be either:
 \begin{enumerate}
 \item An instance method closurization,
-which converts a method into a function object
-(\ref{ordinaryMemberClosurization}).
-Or
-\item A getter invocation, which returns the result of invoking of a getter method
-(\ref{getterAccessAndMethodExtraction}).
+  which converts a method into a function object
+  (\ref{ordinaryMemberClosurization}).
+  Or
+\item A getter invocation, which returns
+  the result of invoking of a getter method
+  (\ref{getterAccessAndMethodExtraction}).
 \end{enumerate}
 
 \commentary{
-Function objects derived from members via closurization are colloquially known as tear-offs.
+Function objects derived from members via closurization
+are colloquially known as tear-offs.
 }
 
-Property extraction can be either {\em conditional} or {\em unconditional}.
+Property extraction can be either conditional or unconditional.
 
-\LMHash{}
-Evaluation of a {\em conditional property extraction expression} $e$
-of the form \code{$e_1$?.\id} proceeds as follows:
+\LMHash{}%
+\Case{Conditional}
+Consider a \IndexCustom{conditional property extraction expression}{%
+  property extraction!conditional}
+$i$ of the form \code{$e$?.\id}.
 
-\LMHash{}
-If $e_1$ is a type literal, $e$ is equivalent to \code{$e_1$.$m$}.
+\LMHash{}%
+If $e$ is a type literal, $i$ is equivalent to \code{$e$.\id}.
 
-\LMHash{}
-Otherwise evaluate $e_1$ to an object $o$.
-If $o$ is the null object, $e$ evaluates to the null object (\ref{null}).
+\LMHash{}%
+Otherwise, the static type of $i$ is the same as
+the static type of \code{$e$.\id}.
+Let $T$ be the static type of $e$,
+and let $y$ be a fresh variable of type $T$.
+Except for errors inside $e$ and references to the name $y$,
+exactly the same compile-time errors that would be caused by \code{$y$.\id}
+are also generated in the case of \code{$e$?.\id}.
+
+\LMHash{}%
+Evaluation of a conditional property extraction expression $i$
+of the form \code{$e$?.\id} proceeds as follows:
+
+\LMHash{}%
+If $e$ is a type literal,
+evaluation of $i$ amounts to evaluation of \code{$e$.\id}.
+
+\LMHash{}%
+Otherwise evaluate $e$ to an object $o$.
+If $o$ is the null object, $i$ evaluates to the null object (\ref{null}).
 Otherwise let $x$ be a fresh variable bound to $o$
 and evaluate \code{$x$.\id} to a value $r$.
-Then $e$ evaluates to $r$.
+Then $i$ evaluates to $r$.
+\EndCase
 
-The static type of $e$ is the same as the static type of \code{$e_1$.\id}.
-Let $T$ be the static type of $e_1$ and let $y$ be a fresh variable of type $T$.
-Exactly the same compile-time errors that would be caused by \code{$y$.\id} are also generated in the case of \code{$e_1$?.\id}.
-
-\LMHash{}
-Unconditional property extraction has one of two syntactic forms: $e.m$ (\ref{getterAccessAndMethodExtraction}) or $\SUPER.m$ (\ref{superGetterAccessAndMethodClosurization}), where $e$ is an expression and $m$ is an identifier.
+\LMHash{}%
+\Case{Unconditional}
+Let \id{} be an identifier;
+an \IndexCustom{unconditional property extraction}{%
+  property extraction!unconditional}
+may be of the form \code{$e$.\id} where $e$ is an expression
+(\ref{getterAccessAndMethodExtraction}),
+or of the form \code{\SUPER.\id}
+(\ref{superGetterAccessAndMethodClosurization}).
+\EndCase
 
 
 \subsubsection{Getter Access and Method Extraction}
 \LMLabel{getterAccessAndMethodExtraction}
 
-\LMHash{}
-Evaluation of a property extraction $i$ of the form $e.m$ proceeds as follows:
+\LMHash{}%
+Consider an unconditional property extraction $i$
+(\ref{propertyExtraction})
+of the form \code{$e$.\id}.
+It is a compile-time error if \id{} is a member of class \code{Object}
+and $e$ is either a prefix object (\ref{imports})
+or a type literal.
 
-\LMHash{}
+\commentary{
+It may seem obvious that it is an error to use prefix object,
+but more surprising that it also applies to a type literal.
+In particular, we cannot use \code{int.toString}
+to obtain a function object for the \code{toString} method of the
+\code{Type} object for \code{int}.
+But we can use \code{(int).toString}:
+$e$ is then not a type literal, but a parenthesized expression.
+}
+
+\rationale{
+This is a pragmatic trade-off.
+The ability to tear off instance methods on instances of \code{Type}
+was considered less useful,
+and it was considered more useful to insist on the simple rule that
+a method tear-off on a type literal is \emph{always} a tear-off
+of a static method on the denoted class.
+}
+
+\LMHash{}%
+Let $T$ be the static type of $e$.
+It is a compile-time error if $T$ does not have a method or getter named \id{}
+unless $T$ is \DYNAMIC{},
+or $T$ is \FUNCTION{} and \id{} is \CALL{}.
+The static type of $i$ is:
+
+\begin{itemize}
+\item The declared return type of \code{$T$.\id},
+  if $T$ has an accessible instance getter named \id{}.
+\item The function type of the method signature \code{$T$.\id},
+  if $T$ has an accessible instance method named \id{}.
+\item The type \DYNAMIC{} otherwise.
+  \commentary{This only occurs when $T$ is \DYNAMIC{} or \FUNCTION.}
+\end{itemize}
+
+\commentary{
+Note that the type of a method tear-off ignores
+whether any given parameter is covariant.
+However, the dynamic type of a function object
+thus obtained does take parameter covariance into account.
+}
+
+\LMHash{}%
+Evaluation of a property extraction $i$ of the form \code{$e$.\id} proceeds as follows:
+
+\LMHash{}%
 First, the expression $e$ is evaluated to an object $o$.
-Let $f$ be the result of looking up (\ref{lookup}) method (\ref{instanceMethods}) $m$ in $o$ with respect to the current library $L$.
-%% TODO(eernst): This is metaclass stuff, should be deleted.
-If $o$ is an instance of \code{Type} but $e$ is not a constant type literal, then if $f$ is a method that forwards (\ref{functionDeclarations}) to a static method, method lookup fails.
-If method lookup succeeds then $i$ evaluates to the closurization of method $f$ on object $o$ (\ref{ordinaryMemberClosurization}).
+Let $f$ be the result of looking up (\ref{lookup}) method
+(\ref{instanceMethods})
+\id{} in $o$ with respect to the current library $L$.
+If method lookup succeeds then $i$ evaluates to
+the closurization of method $f$ on object $o$
+(\ref{ordinaryMemberClosurization}).
 
 \commentary{
 Note that $f$ is never an abstract method, because method lookup skips abstract methods.
-Hence, if $m$ refers to an abstract method, we will continue to the next step.
-However, since methods and getters never override each other, getter lookup will necessarily fail as well, and \code{noSuchMethod()} will ultimately be invoked.
+If the method lookup failed, e.g.,
+because there is an abstract declaration of \id, but no concrete declaration,
+we will continue to the next step.
+However, since methods and getters never override each other,
+getter lookup will necessarily fail as well,
+and \code{noSuchMethod()} will ultimately be invoked.
 The regrettable implication is that the error will refer to a missing getter rather than an attempt to closurize an abstract method.
 }
 
-\LMHash{}
+\LMHash{}%
 Otherwise, $i$ is a getter invocation.
-Let $f$ be the result of looking up (\ref{lookup}) getter (\ref{getters}) $m$ in $o$ with respect to $L$.
-%% TODO(eernst): This is metaclass stuff, should be deleted.
-If $o$ is an instance of \code{Type} but $e$ is not a constant type literal, then if $f$ is a getter that forwards to a static getter, getter lookup fails.
+Let $f$ be the result of looking up (\ref{lookup}) getter
+(\ref{getters})
+\id{} in $o$ with respect to $L$.
 Otherwise, the body of $f$ is executed with \THIS{} bound to $o$.
 The value of $i$ is the result returned by the call to the getter function.
 
-\LMHash{}
-If the getter lookup has failed, then a new instance $im$ of the predefined class \code{Invocation} is created, such that:
+\LMHash{}%
+If the getter lookup has failed,
+then a new instance $im$ of the predefined class \code{Invocation} is created, such that:
 \begin{itemize}
 \item \code{$im$.isGetter} evaluates to \code{\TRUE{}}.
 \item \code{$im$.memberName} evaluates to the symbol \code{m}.
@@ -7128,7 +8915,7 @@
 \code{List<Type>}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Then the method \code{noSuchMethod()} is looked up in $o$ and invoked with argument $im$,
 and the result of this invocation is the result of evaluating $i$.
 
@@ -7137,92 +8924,86 @@
 when the static type of $e$ is \DYNAMIC{}.
 }
 
-\LMHash{}
-It is a compile-time error if $m$ is a member of class \code{Object} and $e$ is either a prefix object (\ref{imports}) or a constant type literal.
-
-\commentary{
-This precludes \code{int.toString} but not \code{(int).toString} because in the latter case, $e$ is a parenthesized expression.
-}
-
-\LMHash{}
-Let $T$ be the static type of $e$.
-It is a compile-time error if $T$ does not have a method or getter named $m$,
-%% TODO(eernst): This is metaclass stuff, should be deleted.
-unless $T$ is \code{Type},
-$e$ is a constant type literal,
-and the class corresponding to $e$ has a static method or getter named $m$.
-
-\LMHash{}
-The static type of $i$ is:
-\begin{itemize}
-\item The declared return type of \code{$T$.$m$}, if $T$ has an accessible instance getter named $m$.
-\item
-%% TODO(eernst): This is metaclass stuff, should be deleted.
-The declared return type of $m$, if $T$ is \code{Type},
-$e$ is a constant type literal
-and the class corresponding to $e$ declares an accessible static getter named $m$.
-\item The static type of function \code{$T$.$m$} if $T$ has an accessible instance method named $m$.
-\item
-%% TODO(eernst): This is metaclass stuff, should be deleted.
-The static type of function $m$, if $T$ is \code{Type},
-$e$ is a constant type literal
-and the class corresponding to $e$ declares an accessible static method named $m$.
-\item The type \DYNAMIC{} otherwise.
-\end{itemize}
-
 
 \subsubsection{Super Getter Access and Method Closurization}
 \LMLabel{superGetterAccessAndMethodClosurization}
 
-\LMHash{}
+\LMHash{}%
+Consider a property extraction $i$ of the form \code{\SUPER.\id}.
+
+\LMHash{}%
+Let $S$ be the superclass of the immediately enclosing class.
+It is a compile-time error if $S$ does not have
+an accessible instance method or getter named \id.
+The static type of $i$ is:
+
+\begin{itemize}
+\item The declared return type of \code{$S$.\id},
+  if $S$ has an accessible instance getter named \id.
+\item The function type of the method signature \code{$S$.\id},
+  if $S$ has an accessible instance method named \id.
+\item The type \DYNAMIC{} otherwise.
+  \commentary{This only occurs when $T$ is \DYNAMIC{} or \FUNCTION.}
+\end{itemize}
+
+\commentary{
+Note that the type of a method tear-off ignores
+whether any given parameter is covariant.
+However, the dynamic type of a function object
+thus obtained does take parameter covariance into account.
+}
+
+\LMHash{}%
 Evaluation of a property extraction $i$ of the form $\SUPER.m$ proceeds as follows:
 
-\LMHash{}
-Let $g$ be the method currently executing, and let $C$ be the class in which $g$ was looked up.
-Let $S_{dynamic}$ be the superclass of $C$.
-Let $f$ be the result of looking up method $m$ in $S_{dynamic}$ with respect to the current library $L$.
-If method lookup succeeds then $i$ evaluates to the closurization of method $f$ with respect to superclass $S_{dynamic}$ (\ref{superClosurization}).
+\LMHash{}%
+Let $g$ be the method implementation currently executing,
+and let $C$ be the class in which $g$ is declared.
+Let $S$ be the superclass of $C$.
+Let $f$ be the result of looking up method \id{} in $S$
+with respect to the current library $L$.
+If method lookup succeeds then $i$ evaluates to
+the closurization of method $f$
+with respect to superclass $S$
+(\ref{superClosurization}).
 
-\LMHash{}
+\LMHash{}%
 Otherwise, $i$ is a getter invocation.
-Let $f$ be the result of looking up getter $m$ in $S_{dynamic}$ with respect to $L$.
+Let $f$ be the result of looking up
+getter \id{} in $S$ with respect to $L$.
 The body of $f$ is executed with \THIS{} bound to the current value of \THIS{}.
 The value of $i$ is the result returned by the call to the getter function.
 
 \commentary{
 The getter lookup will not fail, because it is a compile-time error to have
-a super property extraction of a member $m$ when the superclass $S_{dynamic}$
-does not have a concrete member named $m$.
+a super property extraction of a member \id{} when the superclass $S$
+does not have a concrete member named \id.
 }
 
-\LMHash{}
-Let $S_{static}$ be the superclass of the immediately enclosing class.
-It is a compile-time error if $S_{static}$ does not have an accessible instance method or getter named $m$.
-
-The static type of $i$ is:
-\begin{itemize}
-\item The declared return type of $S_{static}.m$, if $S_{static}$ has an accessible instance getter named $m$.
-\item The static type of function $S_{static}.m$, if $S_{static}$ has an accessible instance method named $m$.
-\item The type \DYNAMIC{} otherwise.
-\end{itemize}
-
 
 \subsubsection{Ordinary Member Closurization}
 \LMLabel{ordinaryMemberClosurization}
 
+\LMHash{}%
+This section specifies the dynamic semantics of
+ordinary member closurizations.
+
 \commentary{
 Note that the non-generic case is covered implicitly using $s = 0$,
-in which case the type parameter declarations are omitted (\ref{generics}).
+in which case the type parameter declaration lists
+and the actual type argument lists passed in invocations
+are omitted (\ref{generics}).
 }
 
-\LMHash{}
-An {\em instance method closurization}
+\LMHash{}%
+An \Index{instance method closurization}
 is a closurization of some method on some object, defined below,
 or a super closurization (\ref{superClosurization}).
 
-\LMHash{}
+\LMHash{}%
 Let $o$ be an object, and let $u$ be a fresh final variable bound to $o$.
-The {\em closurization of method $f$ on object $o$} is defined to be equivalent
+The \Index{closurization of method} $f$ on object $o$
+is defined to be equivalent
 (\commentary{except for equality, as noted below}) to:
 \begin{itemize}
 %\item $(a) \{\RETURN{}$ $u$ $op$ $a;$\} if $f$ is named $op$ and $op$ is one of \code{<, >, <=, >=, ==, -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$} (this precludes closurization of unary -).
@@ -7230,29 +9011,33 @@
 %\item $(a) \{\RETURN{}$ $u[a];$\} if $f$ is named \code{[]}.
 %\item $(a, b) \{\RETURN{}$ $u[a] = b;$\} if $f$ is named \code{[]=}.
 \item
-\begin{dartCode}
-<$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
-($T_1\ r_1, \ldots,\ T_n\ r_n,\ $\{$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$\}) =>
-    $u.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1$: $p_1, \ldots,\ p_k$: $p_k$);
-\end{dartCode}
-if $f$ is named $m$ and has type parameter declarations
-$X_1\ \EXTENDS\ B_1$, \ldots,\ $X_s\ \EXTENDS\ B_s$,
-required parameters $r_1, \ldots, r_n$,
-and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+\begin{normativeDartCode}
+<\TypeParameters{X}{B'}{s}>
+($\PairList{T}{p}{1}{n},\ $\{$T_{n+1}\ p_{n+1} = d_1, \ldots,\ T_{n+k}\ p_{n+k} = d_k$\}) =>
+\quad$u$.$m$<\List{X}{1}{s}>($\List{p}{1}{n},\ p_{n+1}$: $p_{n+1}, \ldots,\ p_{n+k}$: $p_{n+k}$);
+\end{normativeDartCode}
+where $f$ is an instance method named $m$
+which has type parameter declarations
+\TypeParametersStd{},
+required parameters \List{p}{1}{n},
+and named parameters \List{p}{n+1}{n+k} with defaults \List{d}{1}{k},
+using \code{null} for parameters whose default value is not specified.
 \item
-\begin{dartCode}
-<$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
-($T_1\ r_1, \ldots,\ T_n\ r_n,\ $[$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$]) =>
-    $u.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1, \ldots,\ p_k$);
-\end{dartCode}
-if $f$ is named $m$ and has type parameter declarations
-$X_1\ \EXTENDS\ B_1$, \ldots,\ $X_s\ \EXTENDS\ B_s$,
-required parameters $r_1, \ldots, r_n$,
+\begin{normativeDartCode}
+<\TypeParameters{X}{B'}{s}>
+($\PairList{T}{p}{1}{n},\ $[$T_{n+1}\ p_{n+1} = d_1, \ldots,\ T_{n+k}\ p_{n+k} = d_k$]) =>
+\quad$u$.$m$<\List{X}{1}{s}>(\List{p}{1}{n+k});
+\end{normativeDartCode}
+where $f$ is an instance method named $m$
+which has type parameter declarations
+\TypeParametersStd{},
+required parameters \List{p}{1}{n},
 and optional positional parameters
-$p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+\List{p}{n+1}{n+k} with defaults \List{d}{1}{k},
+using \code{null} for parameters whose default value is not specified.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 $B'_j, j \in 1 .. s$, are determined as follows:
 If $o$ is an instance of a non-generic class, $B'_j = B_j, j \in 1 .. s$.
 Otherwise, let $X'_1, \ldots, X'_{s'}$ be the formal type parameters of the class of $o$,
@@ -7260,35 +9045,42 @@
 Then $B'_j = [t'_1/X'_1, \ldots, t'_{s'}/X'_{s'}]B_j, j \in 1 .. s$.
 
 \commentary{
-That is, we replace the formal type parameters of the enclosing class, if any, by the corresponding actual type arguments.
+That is, we replace the formal type parameters of the enclosing class, if any,
+by the corresponding actual type arguments.
 }
 
-%% TODO: We should specify tear-offs by means of their (static and dynamice)
-%% semantics, not via syntactic sugar, because the syntactic sugar causes
-%% weird phenomena like `a type annotation that denotes the same type as`
-%% etc.
-
-%% TODO[covariant-parameters]: When adding a specification of covariant
-%% parameters we will need to indicate that the dynamic parameter type is
-%% `Object` for such a parameter, and that the static type of the function
-%% as a whole will be taken from the statically known type of the receiver
-%% of the tear-off invocation.
-
-\LMHash{}
+\LMHash{}%
 The parameter types $T_j, j \in 1 .. n+k$, are determined as follows:
-Let the method declaration $D$ be the implementation of $m$ which is invoked by the expression in the body.
+Let the method declaration $D$ be the implementation of $m$
+which is invoked by the expression in the body.
 Let $T$ be the class that contains $D$.
 
 \commentary{
 Note that $T$ is the dynamic type of $o$, or a superclass thereof.
 }
 
-\LMHash{}
+\LMHash{}%
+For each parameter $p_j$, $j \in 1 .. n+k$, if $p_j$ is covariant
+(\ref{covariantParameters})
+then $T_j$ is the built-in class \code{Object}.
+
+\commentary{
+This is concerned with the dynamic type of the function object obtained by
+the member closurization.
+The static type of the expression that gives rise to the member closurization
+is specified elsewhere
+(\ref{propertyExtraction},
+\ref{getterAccessAndMethodExtraction}).
+Note that for the static type it is ignored whether a parameter is covariant.
+}
+
+\LMHash{}%
 If $T$ is a non-generic class then for $j \in 1 .. n+k$,
-$T_j$ is a type annotation that denotes the same type as that which is denoted by the type annotation on the corresponding parameter declaration in $D$.
+$T_j$ is a type annotation that denotes the same type as that
+which is denoted by the type annotation on the corresponding parameter declaration in $D$.
 If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
 
-\LMHash{}
+\LMHash{}%
 Otherwise $T$ is a generic instantiation of a generic class $G$.
 Let $X''_1, \ldots, X''_{s''}$ be the formal type parameters of $G$,
 and $t''_1, \ldots, t''_{s''}$ be the actual type arguments of $o$ at $T$.
@@ -7296,7 +9088,7 @@
 where $S_j$ is the type annotation of the corresponding parameter in $D$.
 If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
 
-\LMHash{}
+\LMHash{}%
 There is one way in which
 the function object yielded by the instance method closurization differs from
 the function object obtained by function closurization on the above mentioned function literal:
@@ -7305,11 +9097,6 @@
 obtained by closurization of $m$ on $o_1$ respectively $o_2$.
 Then \code{$c_1$ == $c_2$} evaluates to true if and only if $o_1$ and $o_2$ is the same object.
 
-%% TODO(eernst): This being a comment, it's presumably spelled out somewhere
-%% else. Find it and check that it does actually say that it is an error
-%% except when the type of $e$ is \DYNAMIC{}.
-%\item The static type of the property extraction is the static type of function \code{$T$.$m$}, where $T$ is the static type of $e$, if \code{$T$.$m$} is defined. Otherwise the static type of $e.m$ is \DYNAMIC{}.
-
 \commentary{
 % Spell out the consequences for `==` and for `identical`, for the receivers
 % and for the closurizations.
@@ -7331,12 +9118,16 @@
 \subsubsection{Super Closurization}
 \LMLabel{superClosurization}
 
+\LMHash{}%
+This section specifies the dynamic semantics of
+super closurizations.
+
 \commentary{
 Note that the non-generic case is covered implicitly using $s = 0$,
 in which case the type parameter declarations are omitted (\ref{generics}).
 }
 
-\LMHash{}
+\LMHash{}%
 Consider expressions in the body of a class $T$ which is a subclass of a given class $S$,
 where a method declaration that implements $f$ exists in $S$,
 and there is no class $U$ which is a subclass of $S$ and a superclass of $T$ which implements $f$.
@@ -7345,47 +9136,50 @@
 In short, consider a situation where a super invocation of $f$ will execute $f$ as declared in $S$.
 }
 
-\LMHash{}
-A {\em super closurization}
+\LMHash{}%
+A \Index{super closurization}
 is a closurization of a method with respect to a class, as defined next.
-The {\em closurization of the method $f$ with respect to the class $S$}
+The \Index{closurization of a method} $f$ with respect to the class $S$
 is defined to be equivalent
 (\commentary{except for equality, as noted below}) to:
 
-\LMHash{}
+\LMHash{}%
 \begin{itemize}
 %\item $(a) \{\RETURN{}$ \SUPER{} $op$ $a;$\} if $f$ is named $op$ and $op$ is one of \code{<, >, <=, >=, ==, -, +, /, \~{}/, *, \%, $|$, \^{}, \&, $<<$, $>>$}.
 %\item $() \{\RETURN{}$ \~{}\SUPER;\} if $f$ is named \~{}.
 %\item $(a) \{\RETURN{}$ $\SUPER[a];$\} if $f$ is named \code{[]}.
 %\item $(a, b) \{\RETURN{}$ $\SUPER[a] = b;$\} if $f$ is named \code{[]=}.
 \item
-\begin{dartCode}
-<$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
-($T_1\ r_1, \ldots,\ T_n\ r_n,\ $\{$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$\}) =>
-    \SUPER$.m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1$: $p_1, \ldots,\ p_k$: $p_k$);
-\end{dartCode}
-if $f$ is named $m$ and has type parameter declarations
-$X_1\ \EXTENDS\ B_1$, \ldots,\ $X_s\ \EXTENDS\ B_s$,
-required parameters $r_1, \ldots, r_n$,
-and named parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+\begin{normativeDartCode}
+<\TypeParameters{X}{B'}{s}>
+($\PairList{T}{p}{1}{n},\ $\{$T_{n+1}\ p_{n+1} = d_1, \ldots,\ T_{n+k}\ p_{n+k} = d_k$\}) =>
+\quad\SUPER$.m$<\List{X}{1}{s}>($\List{p}{1}{n},\ p_{n+1}$: $p_{n+1}, \ldots,\ p_{n+k}$: $p_{n+k}$);
+\end{normativeDartCode}
+where $f$ is an instance method named $m$
+which has type parameter declarations
+\TypeParametersStd{},
+required parameters \List{p}{1}{n},
+and named parameters \List{p}{n+1}{n+k} with defaults \List{d}{1}{k}.
 \item
-\begin{dartCode}
-<$X_1\ \EXTENDS\ B'_1, \ldots,\ X_s\ \EXTENDS\ B'_s$>
-($T_1\ r_1, \ldots,\ T_n\ r_n,\ $[$T_{n+1}\ p_1 = d_1, \ldots,\ T_{n+k}\ p_k = d_k$]) =>
-    \SUPER.$m$<$X_1, \ldots,\ X_s$>($r_1, \ldots,\ r_n,\ p_1, \ldots,\ p_k$);
-\end{dartCode}
-if $f$ is named $m$ and has type parameter declarations
-$X_1\ \EXTENDS\ B_1$, \ldots,\ $X_s\ \EXTENDS\ B_s$,
-required parameters $r_1, \ldots, r_n$,
-and optional positional parameters $p_1, \ldots, p_k$ with defaults $d_1, \ldots, d_k$.
+\begin{normativeDartCode}
+<\TypeParameters{X}{B'}{s}>
+($\PairList{T}{p}{1}{n},\ $[$T_{n+1}\ p_{n+1} = d_1, \ldots,\ T_{n+k}\ p_{n+k} = d_k$]) =>
+\quad\SUPER.$m$<\List{X}{1}{s}>(\List{p}{1}{n+k});
+\end{normativeDartCode}
+where $f$ is an instance method named $m$
+which has type parameter declarations
+\TypeParametersStd{},
+required parameters \List{p}{1}{n},
+and optional positional parameters
+\List{p}{n+1}{n+k} with defaults \List{d}{1}{k}.
 \end{itemize}
 
 \commentary{
-Note that a super closurization is an {\em instance method closurization},
+Note that a super closurization is an instance method closurization,
 as defined in (\ref{ordinaryMemberClosurization}).
 }
 
-\LMHash{}
+\LMHash{}%
 $B'_j, j \in 1 .. s$, are determined as follows:
 If $S$ is a non-generic class then $B'_j = B_j, j \in 1 .. s$.
 Otherwise, let $X'_1, \ldots, X'_{s'}$ be the formal type parameters of $S$,
@@ -7393,31 +9187,39 @@
 Then $B'_j = [t'_1/X'_1, \ldots, t'_{s'}/X'_{s'}]B_j, j \in 1 .. s$.
 
 \commentary{
-That is, we replace the formal type parameters of the enclosing class, if any, by the corresponding actual type arguments.
-We need to consider the type arguments with respect to a specific class because it is possible for a class to pass different type arguments to its superclass than the ones it receives itself.
+That is, we replace the formal type parameters of the enclosing class, if any,
+by the corresponding actual type arguments.
+We need to consider the type arguments with respect to a specific class because
+it is possible for a class to pass different type arguments to its superclass
+than the ones it receives itself.
 }
 
-%% TODO: We should specify tear-offs by means of their (static and dynamice)
-%% semantics, not via syntactic sugar, because the syntactic sugar causes
-%% weird phenomena like `a type annotation that denotes the same type as`
-%% etc.
-
-%% TODO[covariant-parameters]: When adding a specification of covariant
-%% parameters we will need to indicate that the dynamic parameter type is
-%% `Object` for such a parameter, and that the static type of the function
-%% as a whole will be taken from the statically known type of the receiver
-%% of the tear-off invocation.
-
-\LMHash{}
+\LMHash{}%
 The parameter types $T_j, j \in 1 .. n+k$, are determined as follows:
 Let the method declaration $D$ be the implementation of $m$ in $S$.
 
-\LMHash{}
+\LMHash{}%
+For each parameter $p_j$, $j \in 1 .. n+k$, if $p_j$ is covariant
+(\ref{covariantParameters})
+then $T_j$ is the built-in class \code{Object}.
+
+\commentary{
+This is concerned with the dynamic type of the function object obtained by
+the super closurization.
+The static type of the expression that gives rise to the super closurization
+is specified elsewhere
+(\ref{propertyExtraction},
+\ref{superGetterAccessAndMethodClosurization}).
+Note that for the static type it is ignored whether a parameter is covariant.
+}
+
+\LMHash{}%
 If $S$ is a non-generic class then for $j \in 1 .. n+k$,
-$T_j$ is a type annotation that denotes the same type as that which is denoted by the type annotation on the corresponding parameter declaration in $D$.
+$T_j$ is a type annotation that denotes the same type as that
+which is denoted by the type annotation on the corresponding parameter declaration in $D$.
 If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
 
-\LMHash{}
+\LMHash{}%
 Otherwise $S$ is a generic instantiation of a generic class $G$.
 Let $X''_1, \ldots, X''_{s''}$ be the formal type parameters of $G$,
 and $t''_1, \ldots, t''_{s''}$ be the actual type arguments of $o$ at $S$.
@@ -7425,7 +9227,7 @@
 where $S_j$ is the type annotation of the corresponding parameter in $D$.
 If that parameter declaration has no type annotation then $T_j$ is \DYNAMIC{}.
 
-\LMHash{}
+\LMHash{}%
 There is one way in which
 the function object yielded by the super closurization differs from
 the function object obtained by function closurization on the above mentioned function literal:
@@ -7438,7 +9240,7 @@
 \subsection{Assignment}
 \LMLabel{assignment}
 
-\LMHash{}
+\LMHash{}%
 An assignment changes the value associated with a mutable variable or property.
 
 \begin{grammar}
@@ -7446,7 +9248,7 @@
   \alt <compoundAssignmentOperator>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$v$ = $e$}}
 %% TODO(eernst): This _only_ works if we assume that `v = e` has already
 %% been expanded to `this.v = e` "when that's the right thing to do".
@@ -7462,13 +9264,13 @@
 It is a compile-time error if the static type of $e$ may not be assigned to $T$.
 The static type of $a$ is the static type of $e$.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if an assignment of the form \code{$v$ = $e$} occurs
 inside a top level or static function (be it function, method, getter, or setter) or variable initializer,
 and there is neither a mutable local variable declaration with name $v$
 nor a setter declaration with name \code{$v$=} in the lexical scope enclosing the assignment.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an assignment $a$ of the form \code{$v$ = $e$}
 proceeds as follows:
 %% TODO(eernst): $d$ is defined ambiguously: both getter & setter may exist.
@@ -7476,7 +9278,7 @@
 It is a compile-time error if $d$ denotes
 a prefix object, type declaration, or function declaration.
 
-\LMHash{}
+\LMHash{}%
 If $d$ is the declaration of a local variable, the expression $e$ is evaluated to an object $o$.
 Then, the variable $v$ is bound to $o$.
 If no error occurs, the value of the assignment expression is $o$.
@@ -7488,14 +9290,14 @@
 
 % add local functions per bug 23218
 
-\LMHash{}
+\LMHash{}%
 % TODO(eernst): $d$ defined ambiguously, re-check next sentence when fixing.
 If $d$ is the declaration of a library variable, top level getter or top level setter, the expression $e$ is evaluated to an object $o$.
 % TODO(eernst): $d$ defined ambiguously, re-check when fixing: Case $d$ is the getter and there is no setter.
 Then the setter \code{$v$=} is invoked with its formal parameter bound to $o$.
 The value of the assignment expression is $o$.
 
-\LMHash{}
+\LMHash{}%
 Otherwise, if $d$ is the declaration of a class variable, static getter or static setter in class $C$,
 then the assignment is equivalent to the assignment \code{$C$.$v$ = $e$}.
 
@@ -7505,26 +9307,27 @@
 a compile-time error has occurred.
 }
 
-\LMHash{}
+\LMHash{}%
 %% TODO(eernst): We don't want to transform code and than complain, see if this
 %% can be reworded to rely on static checks such that it only happens when it
 %% works, or maybe that's already true.
 Otherwise, the assignment is equivalent to the assignment \code{\THIS{}.$v$ = $e$}.
 
-\LMHash{}
+\LMHash{}%
 It is a dynamic type error if $o$ is not the null object (\ref{null})
 and the dynamic type of $o$ is not a subtype of the actual type
 (\ref{actualTypeOfADeclaration})
 of $v$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$?.$v$ = $e_2$}}
 Consider an assignment $a$ of the form \code{$e_1$?.$v$ = $e_2$}.
 Exactly the same compile-time errors that would be caused by
 \code{$e_1$.$v$ = $e_2$} are also generated in the case of $a$.
 The static type of $a$ is the static type of $e_2$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an assignment $a$ of the form \code{$e_1$?.$v$ = $e_2$}
 proceeds as follows:
 If $e_1$ is a type literal, $a$ is equivalent to \code{$e_1$.$v$ = $e_2$}.
@@ -7533,8 +9336,9 @@
 Otherwise let $x$ be a fresh variable bound to $o$
 and evaluate \code{$x$.$v$ = $e_2$} to an object $r$.
 Then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$.$v$ = $e_2$}}
 Consider an assignment $a$ of the form \code{$e_1$.$v$ = $e_2$}.
 Let $T$ be the static type of $e_1$.
@@ -7546,7 +9350,7 @@
 Whether or not $T$ is \DYNAMIC{},
 the static type of $a$ is the static type of $e_2$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an assignment of the form \code{$e_1$.$v$ = $e_2$}
 proceeds as follows:
 The expression $e_1$ is evaluated to an object $o_1$.
@@ -7557,7 +9361,7 @@
 (\ref{actualTypeOfADeclaration}).
 Otherwise, the body of the setter is executed with its formal parameter bound to $o_2$ and \THIS{} bound to $o_1$.
 
-\LMHash{}
+\LMHash{}%
 If the setter lookup has failed, then a new instance $im$ of the predefined class \code{Invocation} is created, such that:
 \begin{itemize}
 \item \code{$im$.isSetter} evaluates to \code{\TRUE{}}.
@@ -7572,7 +9376,7 @@
 \code{List<Type>}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Then the method \code{noSuchMethod()} is looked up in $o_1$ and invoked with argument $im$.
 
 \commentary{
@@ -7580,10 +9384,11 @@
 when the static type of $e_1$ is \DYNAMIC{}.
 }
 
-\LMHash{}
+\LMHash{}%
 The value of the assignment expression is $o_2$ irrespective of whether setter lookup has failed or succeeded.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{\SUPER.$v$ = $e$}}
 Consider an assignment $a$ of the form \code{\SUPER.$v$ = $e$}.
 Let $S_{static}$ be the superclass of the immediately enclosing class.
@@ -7592,7 +9397,7 @@
 may not be assigned to the static type of the formal parameter of said setter.
 The static type of $a$ is the static type of $e$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an assignment of the form \code{\SUPER.$v$ = $e$}
 proceeds as follows:
 Let $g$ be the currently executing method, and let $C$ be the class in which $g$ was looked up.
@@ -7607,16 +9412,17 @@
 when no concrete setter named \code{$v$=} exists in $S_{static}$.
 }
 
-\LMHash{}
+\LMHash{}%
 The value of the assignment expression is $o$.
 
-\LMHash{}
+\LMHash{}%
 It is a dynamic type error if $o$ is not the null object (\ref{null})
 and the dynamic type of $o$ is
 not a subtype of the actual type of the formal parameter of \code{$v$=}
 (\ref{actualTypeOfADeclaration}) in $S_{static}$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$[$e_2$] = $e_3$}}
 Consider an assignment $a$ of the form \code{$e_1$[$e_2$] = $e_3$}.
 Let $T$ be the static type of $e_1$.
@@ -7631,15 +9437,16 @@
 Whether or not $T$ is \DYNAMIC{},
 the static type of $a$ is the static type of $e_3$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an assignment $a$ of the form \code{$e_1$[$e_2$] = $e_3$}
 proceeds as follows:
 Evaluate $e_1$ to an object $a$, then evaluate $e_2$ to an object $i$, and finally evaluate $e_3$ to an object $v$.
 Call the method \code{[]=} on $a$ with $i$ as first argument and $v$ as second argument.
 Then $a$ evaluates to $v$.
 % Should we add: It is a dynamic error if $e_1$ evaluates to a constant list or map?
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{\SUPER[$e_1$] = $e_2$}}
 Consider an assignment $a$ of the form \code{\SUPER[$e_1$] = $e_2$}.
 Let $S_{static}$ be the superclass of the immediately enclosing class.
@@ -7651,15 +9458,16 @@
 may not be assigned to $S_1$ respectively $S_2$.
 The static type of $a$ is the static type of $e_2$.
 
-\LMHash{}
+\LMHash{}%
 For evaluation, an assignment of the form \code{\SUPER[$e_1$] = $e_2$}
 is equivalent to the expression \code{\SUPER.[$e_1$] = $e_2$}.
+\EndCase
 
 
 \subsubsection{Compound Assignment}
 \LMLabel{compoundAssignment}
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$v$ ??= $e$}}
 Consider a compound assignment $a$ of the form \code{$v$ ??= $e$}
 where $v$ is an identifier or an identifier qualified by an import prefix,
@@ -7668,15 +9476,16 @@
 %% TODO(eernst): We should mention other cases, e.g., `v=` denotes a setter, but there is no getter.
 The static type of $a$ is the least upper bound of the static type of $v$ and the static type of $e$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a compound assignment $a$ of the form \code{$v$ ??= $e$}
 proceeds as follows:
 Evaluate $v$ to an object $o$.
 If $o$ is not the null object (\ref{null}), $a$ evaluates to $o$.
 Otherwise evaluate \code{$v$ = $e$} to a value $r$,
 and then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$C$.$v$ ??= $e$}}
 Consider a compound assignment $a$ of the form \code{$C$.$v$ ??= $e$}
 where $C$ is a type literal
@@ -7686,15 +9495,16 @@
 %% TODO(eernst): We should mention other cases, e.g., `C.v=` denotes a setter, but there is no getter.
 The static type of $a$ is the least upper bound of the static type of \code{$C$.$v$} and the static type of $e$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a compound assignment $a$ of the form \code{$C$.$v$ ??= $e$}
 where $C$ is a type literal proceeds as follow:
 Evaluate \code{$C$.$v$} to an object $o$.
 If $o$ is not the null object (\ref{null}), $a$ evaluates to $o$.
 Otherwise evaluate \code{$C$.$v$ = $e$} to a value $r$,
 and then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$.$v$ ??= $e_2$}}
 Consider a compound assignment $a$ of the form \code{$e_1$.$v$ ??= $e_2$}.
 Let $T$ be the static type of $e_1$ and let $x$ be a fresh variable of type $T$.
@@ -7703,7 +9513,7 @@
 %% TODO(eernst): Also, we should mention other cases, e.g., there is no getter `z.v`.
 The static type of $a$ is the least upper bound of the static type of \code{$e_1$.$v$} and the static type of $e_2$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a compound assignment $a$ of the form \code{$e_1$.$v$ ??= $e_2$}
 proceeds as follows:
 Evaluate $e_1$ to an object $u$.
@@ -7712,15 +9522,16 @@
 If $o$ is not the null object (\ref{null}), $a$ evaluates to $o$.
 Otherwise evaluate \code{$x$.$v$ = $e_2$} to an object $r$,
 and then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$[$e_2$] ??= $e_3$}}
 Consider a compound assignment $a$ of the form \code{$e_1$[$e_2$] ??= $e_3$}.
 Exactly the same compile-time errors that would be caused by \code{$e_1$[$e_2$] = $e_3$} are also generated in the case of $a$.
 %% TODO(eernst): We should mention other cases, e.g., there is no `operator []`.
 The static type of $a$ is the least upper bound of the static type of \code{$e_1$[$e_2$]} and the static type of $e_3$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a compound assignment $a$ of the form \code{$e_1$[$e_2$] ??= $e_3$}
 proceeds as follows:
 Evaluate $e_1$ to an object $u$ and then evaluate $e_2$ to an object $i$.
@@ -7729,23 +9540,25 @@
 Otherwise evaluate $e_3$ to an object $v$
 and then call the \code{[]=} method on $u$ with $i$ as first argument and $v$ as second argument.
 Then $a$ evaluates to $v$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{\SUPER.$v$ ??= $e$}}
 Consider a compound assignment $a$ of the form \code{\SUPER.$v$ ??= $e$}.
 Exactly the same compile-time errors that would be caused by \code{\SUPER.$v$ = $e$} are also generated in the case of $a$.
 %% TODO(eernst): We should mention other cases, e.g., there is no getter `\SUPER.v`.
 The static type of $a$ is the least upper bound of the static type of \code{\SUPER.$v$} and the static type of $e$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a compound assignment $a$ of the form \code{\SUPER.$v$ ??= $e$}
 proceeds as follows:
 Evaluate \code{\SUPER.$v$} to an object $o$.
 If $o$ is not the null object (\ref{null}) then $a$ evaluates to $o$.
 Otherwise evaluate \code{\SUPER.$v$ = $e$} to an object $r$,
 and then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$?.$v$ ??= $e_2$}}
 Consider a compound assignment $a$ of the form \code{$e_1$?.$v$ ??= $e_2$}.
 Exactly the same compile-time errors that would be caused by \code{$e_1$.$v$ ??= $e_2$} are also generated in the case of $a$.
@@ -7754,7 +9567,7 @@
 % if NNBD is introduced, and because it reduces the amount of synthetic syntax.
 The static type of $a$ is the least upper bound of the static type of \code{$e_1$?.$v$} and the static type of $e_2$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a compound assignment $a$ of the form \code{$e_1$?.$v$ ??= $e_2$}
 proceeds as follows:
 Evaluate $e_1$ to an object $u$.
@@ -7764,28 +9577,32 @@
 If $o$ is not the null object (\ref{null}) then $a$ evaluates to $o$.
 Otherwise evaluate \code{$x$.$v$ = $e_2$} to an object $r$,
 and then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$C$?.$v$ ??= $e_2$}}
 A compound assignment of the form \code{$C$?.$v$ ??= $e_2$}
 where $C$ is a type literal
 that may or may not be be qualified by an import prefix
 is equivalent to the expression \code{$C$.$v$ ??= $e$}.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$v$ $op$= $e$}}
 For any other valid operator $op$, a compound assignment of the form \code{$v$ $op$= $e$}
 is equivalent to \code{$v$ = $v$ $op$ $e$},
 where $v$ is an identifier or an identifier qualified by an import prefix.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$C$.$v$ $op$= $e$}}
 A compound assignment of the form \code{$C$.$v$ $op$= $e$}
 where $C$ is a type literal
 that may or may not be qualified by an import prefix
 is equivalent to \code{$C$.$v$ = $C$.$v$ $op$ $e$}.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$.$v$ $op$= $e_2$}}
 Consider a compound assignment $a$ of the form \code{$e_1$.$v$ $op$= $e_2$}.
 Let $x$ be a fresh variable whose static type is the static type of $e_1$.
@@ -7793,14 +9610,15 @@
 exactly the same compile-time errors that would be caused by \code{$x$.$v$ = $x$.$v$ $op$ $e_2$} are also generated in the case of $a$.
 The static type of $a$ is the static type of \code{$e_1$.$v$ $op$ $e_2$}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a compound assignment $a$ of the form \code{$e_1$.$v$ $op$= $e_2$}
 proceeds as follows:
 Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
 Evaluate \code{$x$.$v$ = $x$.$v$ $op$ $e_2$} to an object $r$
 and then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$[$e_2$] $op$= $e_3$}}
 Consider a compound assignment $a$ of the form \code{$e_1$[$e_2$] $op$= $e_3$}.
 Let $x$ and $i$ be fresh variables
@@ -7810,21 +9628,22 @@
 exactly the same compile-time errors that would be caused by \code{$x$[$i$] = $x$[$i$] $op$ $e_3$} are also generated in the case of $a$.
 The static type of $a$ is the static type of \code{$x$[$i$] $op$ $e_3$}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of s compound assignment $a$ of the form \code{$e_1$[$e_2$] $op$= $e_3$}
 proceeds as follows:
 Evaluate $e_1$ to an object $u$ and evaluate $e_2$ to an object $v$.
 Let $x$ and $i$ be fresh variables bound to $u$ and $v$ respectively.
 Evaluate \code{$x$[$i$] = $x$[$i$] $op$ $e_3$} to an object $r$,
 and then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$e_1$?.$v$ $op$= $e_2$}}
 Consider a compound assignment $a$ of the form \code{$e_1$?.$v$ $op$= $e_2$}.
 Exactly the same compile-time errors that would be caused by \code{$e_1$.$v$ $op$= $e_2$} are also generated in the case of $a$.
 The static type of $a$ is the static type of \code{$e_1$.$v$ $op$= $e_2$}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a compound assignment $a$ of the form \code{$e_1$?.$v$ $op$= $e_2$}
 proceeds as follows:
 Evaluate $e_1$ to an object $u$.
@@ -7832,8 +9651,9 @@
 Otherwise let $x$ be a fresh variable bound to $u$.
 Evaluate \code{$x$.$v$ $op$= $e_2$} to an object $r$.
 Then $a$ evaluates to $r$.
+\EndCase
 
-\LMHash{}
+\LMHash{}%
 \Case{\code{$C$?.$v$ $op$ = $e_2$}}
 A compound assignment of the form \code{$C$?.$v$ $op$ = $e_2$}
 where $C$ is a type literal
@@ -7854,29 +9674,30 @@
   \alt `|='
   \alt `??='
 \end{grammar}
+\EndCase
 
 
 \subsection{Conditional}
 \LMLabel{conditional}
 
-\LMHash{}
-A {\em conditional expression} evaluates one of two expressions based on a boolean condition.
+\LMHash{}%
+A \Index{conditional expression} evaluates one of two expressions based on a boolean condition.
 
 \begin{grammar}
 <conditionalExpression> ::= <ifNullExpression>
   \gnewline{} (`?' <expressionWithoutCascade> `:' <expressionWithoutCascade>)?
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a conditional expression $c$ of the form $e_1 ? e_2 : e_3$ proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First, $e_1$ is evaluated to an object $o_1$.
 It is a run-time error if the run-time type of $o_1$ is not \code{bool}.
 If $r$ is \TRUE, then the value of $c$ is the result of evaluating the expression $e_2$.
 Otherwise the value of $c$ is the result of evaluating the expression $e_3$.
 
-\LMHash{}
+\LMHash{}%
 If $e_1$ shows that a local variable $v$ has type $T$,
 then the type of $v$ is known to be $T$ in $e_2$,
 unless any of the following are true:
@@ -7888,7 +9709,7 @@
 $v$ is potentially mutated anywhere in the scope of $v$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the static type of $e_1$ may not be assigned to \code{bool}.
 The static type of $c$ is the least upper bound (\ref{leastUpperBounds}) of the static type of $e_2$ and the static type of $e_3$.
 
@@ -7896,57 +9717,58 @@
 \subsection{If-null Expressions}
 \LMLabel{ifNull}
 
-\LMHash{}
-An {\em if-null expression} evaluates an expression and if the result is the null object (\ref{null}), evaluates another.
+\LMHash{}%
+An \Index{if-null expression} evaluates an expression and if the result is the null object (\ref{null}), evaluates another.
 
 \begin{grammar}
 <ifNullExpression> ::= <logicalOrExpression> (`??' <logicalOrExpression>)*
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an if-null expression $e$ of the form \code{$e_1$ ?? $e_2$}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate $e_1$ to an object $o$.
 If $o$ is not the null object (\ref{null}), then $e$ evaluates to $o$.
 Otherwise evaluate $e_2$ to an object $r$,
 and then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of $e$ is the least upper bound (\ref{leastUpperBounds}) of the static type of $e_1$ and the static type of $e_2$.
 
 
 \subsection{Logical Boolean Expressions}
 \LMLabel{logicalBooleanExpressions}
 
-\LMHash{}
+\LMHash{}%
 The logical boolean expressions combine boolean objects using the boolean conjunction and disjunction operators.
 
 \begin{grammar}
-<logicalOrExpression> ::= <logicalAndExpression> (`||' <logicalAndExpression>)*
+<logicalOrExpression> ::= \gnewline{}
+  <logicalAndExpression> (`||' <logicalAndExpression>)*
 
 <logicalAndExpression> ::= <equalityExpression> (`\&\&' <equalityExpression>)*
 \end{grammar}
 
-\LMHash{}
-A {\em logical boolean expression} is either an equality expression (\ref{equality}), or an invocation of a logical boolean operator on an expression $e_1$ with argument $e_2$.
+\LMHash{}%
+A \Index{logical boolean expression} is either an equality expression (\ref{equality}), or an invocation of a logical boolean operator on an expression $e_1$ with argument $e_2$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a logical boolean expression $b$ of the form $e_1 || e_2$ causes the evaluation of $e_1$ to a value $o_1$.
 It is a run-time error if the run-time type of $o_1$ is not \code{bool}.
 If $o_1$ is \TRUE, the result of evaluating $b$ is \TRUE, otherwise $e_2$ is evaluated to an object $o_2$.
 It is a run-time error if the run-time type of $o_2$ is not \code{bool}.
 Otherwise the result of evaluating $b$ is $o_2$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a logical boolean expression $b$ of the form $e_1 \&\& e_2$ causes the evaluation of $e_1$ producing an object $o_1$.
 It is a run-time error if the run-time type of $o_1$ is not \code{bool}.
 If $o_1$ is \FALSE, the result of evaluating $b$ is \FALSE, otherwise $e_2$ is evaluated to an object $o_2$.
 It is a run-time error if the run-time type of $o_2$ is not \code{bool}.
 Otherwise the result of evaluating $b$ is $o_2$.
 
-\LMHash{}
+\LMHash{}%
 A logical boolean expression $b$ of the form $e_1 \&\& e_2$
 shows that a local variable $v$ has type $T$
 if both of the following conditions hold:
@@ -7955,7 +9777,7 @@
 \item $v$ is not mutated in $e_2$ or within a function other than the one where $v$ is declared.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 If $e_1$ shows that a local variable $v$ has type $T$,
 then the type of $v$ is known to be $T$ in $e_2$,
 unless any of the following are true:
@@ -7977,7 +9799,7 @@
 $v$ is potentially mutated anywhere in the scope of $v$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the static type of $e_1$ may not be assigned to \code{bool} or if the static type of $e_2$ may not be assigned to \code{bool}.
 The static type of a logical boolean expression is \code{bool}.
 
@@ -7985,21 +9807,22 @@
 \subsection{Equality}
 \LMLabel{equality}
 
-\LMHash{}
+\LMHash{}%
 Equality expressions test objects for equality.
 
 \begin{grammar}
-<equalityExpression> ::= <relationalExpression> (<equalityOperator> <relationalExpression>)?
+<equalityExpression> ::= \gnewline{}
+  <relationalExpression> (<equalityOperator> <relationalExpression>)?
   \alt \SUPER{} <equalityOperator> <relationalExpression>
 
 <equalityOperator> ::= `=='
   \alt `!='
 \end{grammar}
 
-\LMHash{}
-An {\em equality expression} is either a relational expression (\ref{relationalExpressions}), or an invocation of an equality operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
+\LMHash{}%
+An \Index{equality expression} is either a relational expression (\ref{relationalExpressions}), or an invocation of an equality operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an equality expression $ee$ of the form \code{$e_1$ == $e_2$} proceeds as follows:
 \begin{itemize}
 \item The expression $e_1$ is evaluated to an object $o_1$.
@@ -8009,7 +9832,7 @@
 \item evaluation of $ee$ is equivalent to the method invocation \code{$o_1$.==($o_2$)}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an equality expression $ee$ of the form \code{\SUPER{} == $e$} proceeds as follows:
 \begin{itemize}
 \item The expression $e$ is evaluated to an object $o$.
@@ -8026,25 +9849,25 @@
 Another implication is that there is never a need to use \code{identical()} to test against \NULL{}, nor should anyone ever worry about whether to write \NULL{} == $e$ or $e$ == \NULL{}.
 }
 
-\LMHash{}
+\LMHash{}%
 An equality expression of the form \code{$e_1$ != $e_2$} is equivalent to the expression \code{!($e_1$ == $e_2$)}.
 An equality expression of the form \code{\SUPER{} != $e$} is equivalent to the expression \code{!(\SUPER{} == $e$)}.
 
 %The expression $e_1$ is evaluated to an object $o_1$; then the expression $e_2$ is evaluated to an object $o_2$.  Next, if $o_1$ and $o_2$ are the same object, then $ee$ evaluates to \TRUE{}, otherwise $ee$ evaluates to \FALSE{}.
 
-\LMHash{}
+\LMHash{}%
 The static type of an equality expression is \code{bool}.
 
 
 \subsection{Relational Expressions}
 \LMLabel{relationalExpressions}
 
-\LMHash{}
+\LMHash{}%
 Relational expressions invoke the relational operators on objects.
 
 \begin{grammar}
-<relationalExpression> ::= <bitwiseOrExpression> (<typeTest> | <typeCast> |
-  \gnewline{} <relationalOperator> <bitwiseOrExpression>)?
+<relationalExpression> ::= <bitwiseOrExpression> \gnewline{}
+  (<typeTest> | <typeCast> | <relationalOperator> <bitwiseOrExpression>)?
   \alt \SUPER{} <relationalOperator> <bitwiseOrExpression>
 
 <relationalOperator> ::= `>='
@@ -8053,10 +9876,10 @@
   \alt `<'
 \end{grammar}
 
-\LMHash{}
-A {\em relational expression} is either a bitwise expression (\ref{bitwiseExpressions}), or an invocation of a relational operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
+\LMHash{}%
+A \Index{relational expression} is either a bitwise expression (\ref{bitwiseExpressions}), or an invocation of a relational operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
 
-\LMHash{}
+\LMHash{}%
 A relational expression of the form $e_1$ $op$ $e_2$ is equivalent to the method invocation \code{$e_1$.$op$($e_2$)}.
 A relational expression of the form \SUPER{} $op$ $e_2$ is equivalent to the method invocation \code{\SUPER{}.$op$($e_2$)}.
 
@@ -8064,14 +9887,16 @@
 \subsection{Bitwise Expressions}
 \LMLabel{bitwiseExpressions}
 
-\LMHash{}
+\LMHash{}%
 Bitwise expressions invoke the bitwise operators on objects.
 
 \begin{grammar}
-<bitwiseOrExpression> ::= <bitwiseXorExpression> (`|' <bitwiseXorExpression>)*
+<bitwiseOrExpression> ::= \gnewline{}
+  <bitwiseXorExpression> (`|' <bitwiseXorExpression>)*
   \alt \SUPER{} (`|' <bitwiseXorExpression>)+
 
-<bitwiseXorExpression> ::= <bitwiseAndExpression> (`^' <bitwiseAndExpression>)*
+<bitwiseXorExpression> ::= \gnewline{}
+  <bitwiseAndExpression> (`^' <bitwiseAndExpression>)*
   \alt \SUPER{} (`^' <bitwiseAndExpression>)+
 
 <bitwiseAndExpression> ::= <shiftExpression> (`\&' <shiftExpression>)*
@@ -8082,10 +9907,10 @@
   \alt `|'
 \end{grammar}
 
-\LMHash{}
-A {\em bitwise expression} is either a shift expression (\ref{shift}), or an invocation of a bitwise operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
+\LMHash{}%
+A \Index{bitwise expression} is either a shift expression (\ref{shift}), or an invocation of a bitwise operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
 
-\LMHash{}
+\LMHash{}%
 A bitwise expression of the form \code{$e_1$ $op$ $e_2$} is equivalent to the method invocation $e_1.op(e_2)$.
 A bitwise expression of the form \code{\SUPER{} $op$ $e_2$} is equivalent to the method invocation \code{\SUPER{}.$op$($e_2$)}.
 
@@ -8098,11 +9923,12 @@
 \subsection{Shift}
 \LMLabel{shift}
 
-\LMHash{}
+\LMHash{}%
 Shift expressions invoke the shift operators on objects.
 
 \begin{grammar}
-<shiftExpression> ::= <additiveExpression> (<shiftOperator> <additiveExpression>)*
+<shiftExpression> ::= \gnewline{}
+  <additiveExpression> (<shiftOperator> <additiveExpression>)*
   \alt \SUPER{} (<shiftOperator> <additiveExpression>)+
 
 <shiftOperator> ::= `\ltlt'
@@ -8110,10 +9936,10 @@
   \alt `\gtgtgt'
 \end{grammar}
 
-\LMHash{}
-A {\em shift expression} is either an additive expression (\ref{additiveExpressions}), or an invocation of a shift operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
+\LMHash{}%
+A \Index{shift expression} is either an additive expression (\ref{additiveExpressions}), or an invocation of a shift operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
 
-\LMHash{}
+\LMHash{}%
 A shift expression of the form $e_1$ $op$ $e_2$ is equivalent to the method invocation \code{$e_1$.$op$($e_2$)}.
 A shift expression of the form \SUPER{} $op$ $e_2$ is equivalent to the method invocation \code{\SUPER{}.$op$($e_2$)}.
 
@@ -8130,7 +9956,7 @@
 \subsection{Additive Expressions}
 \LMLabel{additiveExpressions}
 
-\LMHash{}
+\LMHash{}%
 Additive expressions invoke the addition operators on objects.
 
 \begin{grammar}
@@ -8142,14 +9968,14 @@
   \alt `-'
 \end{grammar}
 
-\LMHash{}
-An {\em additive expression} is either a multiplicative expression (\ref{multiplicativeExpressions}), or an invocation of an additive operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
+\LMHash{}%
+An \Index{additive expression} is either a multiplicative expression (\ref{multiplicativeExpressions}), or an invocation of an additive operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
 
-\LMHash{}
+\LMHash{}%
 An additive expression of the form $e_1$ $op$ $e_2$ is equivalent to the method invocation \code{$e_1$.$op$($e_2$)}.
 An additive expression of the form \SUPER{} $op$ $e_2$ is equivalent to the method invocation \code{\SUPER{}.$op$($e_2$)}.
 
-\LMHash{}
+\LMHash{}%
 The static type of an additive expression is usually determined by the signature given in the declaration of the operator used.
 However, invocations of the operators \code{+} and \code{-} of class \code{int} are treated specially by the typechecker.
 The static type of an expression $e_1 + e_2$ where $e_1$ has static type \code{int} is \code{int} if the static type of $e_2$ is \code{int}, and \code{double} if the static type of $e_2$ is \code{double}.
@@ -8159,11 +9985,12 @@
 \subsection{Multiplicative Expressions}
 \LMLabel{multiplicativeExpressions}
 
-\LMHash{}
+\LMHash{}%
 Multiplicative expressions invoke the multiplication operators on objects.
 
 \begin{grammar}
-<multiplicativeExpression> ::= <unaryExpression> (<multiplicativeOperator> <unaryExpression>)*
+<multiplicativeExpression> ::= \gnewline{}
+  <unaryExpression> (<multiplicativeOperator> <unaryExpression>)*
   \alt \SUPER{} (<multiplicativeOperator> <unaryExpression>)+
 
 <multiplicativeOperator> ::= `*'
@@ -8172,14 +9999,14 @@
   \alt `~/'
 \end{grammar}
 
-\LMHash{}
- A {\em multiplicative expression} is either a unary expression (\ref{unaryExpressions}), or an invocation of a multiplicative operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
+\LMHash{}%
+ A \Index{multiplicative expression} is either a unary expression (\ref{unaryExpressions}), or an invocation of a multiplicative operator on either \SUPER{} or an expression $e_1$, with argument $e_2$.
 
-\LMHash{}
+\LMHash{}%
 A multiplicative expression of the form $e_1$ $op$ $e_2$ is equivalent to the method invocation \code{$e_1$.$op$($e_2$)}.
 A multiplicative expression of the form \SUPER{} $op$ $e_2$ is equivalent to the method invocation \code{\SUPER{}.$op$($e_2$)}.
 
-\LMHash{}
+\LMHash{}%
 The static type of an multiplicative expression is usually determined by the signature given in the declaration of the operator used.
 However, invocations of the operators \code{*} and \code{\%} of class \code{int} are treated specially by the typechecker.
 The static type of an expression $e_1 * e_2$ where $e_1$ has static type \code{int} is \code{int} if the static type of $e_2$ is \code{int}, and \code{double} if the static type of $e_2$ is \code{double}.
@@ -8188,7 +10015,7 @@
 \subsection{Unary Expressions}
 \LMLabel{unaryExpressions}
 
-\LMHash{}
+\LMHash{}%
 Unary expressions invoke unary operators on objects.
 
 \begin{grammar}
@@ -8209,17 +10036,17 @@
 <tildeOperator> ::= `~'
 \end{grammar}
 
-\LMHash{}
-A {\em unary expression} is either a postfix expression (\ref{postfixExpressions}), an await expression (\ref{awaitExpressions}) or an invocation of a prefix operator on an expression or an invocation of a unary operator on either \SUPER{} or an expression $e$.
+\LMHash{}%
+A \Index{unary expression} is either a postfix expression (\ref{postfixExpressions}), an await expression (\ref{awaitExpressions}) or an invocation of a prefix operator on an expression or an invocation of a unary operator on either \SUPER{} or an expression $e$.
 
-\LMHash{}
+\LMHash{}%
 The expression $!e$ is equivalent to the expression \code{$e$\,?\,\FALSE\,:\,\TRUE}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an expression of the form \code{++$e$} is equivalent to \code{$e$\,+=\,1}.
 Evaluation of an expression of the form \code{-{}-$e$} is equivalent to \code{$e$\,-=\,1}.
 
-\LMHash{}
+\LMHash{}%
 Let $e$ be an expression of the form \code{-$l$}
 where $l$ is an integer literal (\ref{numbers}) with numeric integer value $i$,
 and with static context type $T$.
@@ -8227,7 +10054,7 @@
 then the static type of $e$ is \code{double};
 otherwise the static type of $e$ is \code{int}.
 
-\LMHash{}
+\LMHash{}%
 If the static type of $e$ is \code{int} then $e$ evaluates to
 to an instance of the \code{int} class representing the numeric value $-i$.
 If $i$ is zero and the \code{int} class can represent a negative zero value,
@@ -8235,7 +10062,7 @@
 It is a compile-time error if the integer $-i$ cannot be represented
 exactly by an instance of \code{int}.
 
-\LMHash{}
+\LMHash{}%
 If the static type of $e$ is \code{double} then $e$ evaluates to
 to an instance of the \code{double} class representing the numeric value $-i$.
 If $i$ is zero, the resulting instance instead represents the
@@ -8249,7 +10076,7 @@
 or concern ourselves with its static type.
 }
 
-\LMHash{}
+\LMHash{}%
 Any other expression of the form \code{$op$ $e$} is equivalent to the method invocation \code{$e.op()$}.
 An expression of the form \code{$op$ \SUPER{}} is equivalent to the method invocation (\ref{superInvocation}) \code{\SUPER{}.$op()$}.
 
@@ -8257,24 +10084,24 @@
 \subsection{Await Expressions}
 \LMLabel{awaitExpressions}
 
-\LMHash{}
-An {\em await expression} allows code to yield control until an asynchronous operation (\ref{functions}) completes.
+\LMHash{}%
+An \Index{await expression} allows code to yield control until an asynchronous operation (\ref{functions}) completes.
 
 \begin{grammar}
 <awaitExpression> ::= \AWAIT{} <unaryExpression>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an await expression $a$ of the form \AWAIT{} $e$ proceeds as follows:
 First, the expression $e$ is evaluated to an object $o$.
 
-\LMHash{}
+\LMHash{}%
 % NOTICE: Removed the requirement that an error thrown by $e$ is caught in a
 % future. There is no reason $var x = e; await x;$ and $await e$ should behave
 % differently, and no implementation actually implemented it.
 Then, if $o$ is not an instance of \code{Future}, then let $f$ be the result of creating a new object using the constructor \code{Future.value()} with $o$ as its argument; otherwise let $f$ be $o$.
 
-\LMHash{}
+\LMHash{}%
 Next, the stream associated with the innermost enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused.
 The current invocation of the function body immediately enclosing $a$ is suspended until after $f$ completes.
 At some time after $f$ is completed, control returns to the current invocation.
@@ -8301,14 +10128,14 @@
 Tools may choose to give a hint in such cases.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of $a$ is \flatten{T} (\flatten{} is defined in section \ref{functionExpressions}) where $T$ is the static type of $e$.
 
 
 \subsection{Postfix Expressions}
 \LMLabel{postfixExpressions}
 
-\LMHash{}
+\LMHash{}%
 Postfix expressions invoke the postfix operators on objects.
 
 \begin{grammar}
@@ -8324,18 +10151,18 @@
   \alt `-\mbox-'
 \end{grammar}
 
-\LMHash{}
-A {\em postfix expression} is either a primary expression, a function, method or getter invocation, or an invocation of a postfix operator on an expression $e$.
+\LMHash{}%
+A \Index{postfix expression} is either a primary expression, a function, method or getter invocation, or an invocation of a postfix operator on an expression $e$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$v$++}, where $v$ is an identifier, proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate $v$ to an object $r$ and let $y$ be a fresh variable bound to $r$.
 Evaluate \code{$v$ = $y$ + 1}.
 Then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of $v$.
 
 \rationale{
@@ -8343,38 +10170,38 @@
 Likewise in the cases below.
 }
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$C$.$v$++}
 where $C$ is a type literal proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate \code{$C$.$v$} to a value $r$
 and let $y$ be a fresh variable bound to $r$.
 Evaluate \code{$C$.$v$ = $y$ + 1}.
 Then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of \code{$C$.$v$}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$e_1$.$v$++}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
 Evaluate \code{$x$.$v$} to a value $r$
 and let $y$ be a fresh variable bound to $r$.
 Evaluate \code{$x$.$v$ = $y$ + 1}.
 Then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of \code{$e_1$.$v$}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$e_1$[$e_2$]++}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate $e_1$ to an object $u$ and $e_2$ to an object $v$.
 Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively.
 Evaluate \code{$a$[$i$]} to an object $r$
@@ -8382,53 +10209,53 @@
 Evaluate \code{$a$[$i$] = $y$ + 1}.
 Then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of \code{$e_1$[$e_2$]}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$v$-{}-}, where $v$ is an identifier, proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate the expression $v$ to an object $r$
 and let $y$ be a fresh variable bound to $r$.
 Evaluate \code{$v$ = $y$ - 1}.
 Then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of $v$.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$C$.$v$-{}-}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate \code{$C$.$v$} to a value $r$
 and let $y$ be a fresh variable bound to $r$.
 Evaluate \code{$C$.$v$ = $y$ - 1}.
 Then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of \code{$C$.$v$}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression of the form \code{$e_1$.$v$-{}-}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate $e_1$ to an object $u$ and let $x$ be a fresh variable bound to $u$.
 Evaluate \code{$x$.$v$} to a value $r$
 and let $y$ be a fresh variable bound to $r$.
 Evaluate \code{$x$.$v$ = $y$ - 1}.
 Then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of \code{$e_1$.$v$}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$e_1$[$e_2$]-{}-}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Evaluate $e_1$ to an object $u$ and $e_2$ to an object $v$.
 Let $a$ and $i$ be fresh variables bound to $u$ and $v$ respectively.
 Evaluate \code{$a$[$i$]} to an object $r$
@@ -8436,28 +10263,28 @@
 Evaluate \code{$a$[$i$] = $y$ - 1}.
 Then $e$ evaluates to $r$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of \code{$e_1$[$e_2$]}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$e_1$?.$v$++}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 If $e_1$ is a type literal, evaluation of $e$ is equivalent to
 evaluation of \code{$e_1$.$v$++}.
 
-\LMHash{}
+\LMHash{}%
 Otherwise evaluate $e_1$ to an object $u$.
 if $u$ is the null object, $e$ evaluates to the null object (\ref{null}).
 Otherwise let $x$ be a fresh variable bound to $u$.
 Evaluate \code{$x$.$v$++} to an object $o$.
 Then $e$ evaluates to $o$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of \code{$e_1$.$v$}.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of a postfix expression $e$ of the form \code{$e_1$?.$v$-{}-}
 proceeds as follows:
 
@@ -8470,19 +10297,19 @@
 Evaluate \code{$x$.$v$-{}-} to an object $o$.
 Then $e$ evaluates to $o$.
 
-\LMHash{}
+\LMHash{}%
 The static type of such an expression is the static type of \code{$e_1$.$v$}.
 
 
 \subsection{Assignable Expressions}
 \LMLabel{assignableExpressions}
 
-\LMHash{}
+\LMHash{}%
 Assignable expressions are expressions that can appear on the left hand side of an assignment.
 This section describes how to evaluate these expressions when they do not constitute the complete left hand side of an assignment.
 
 \rationale{
-Of course, if assignable expressions always appeared {\em as} the left hand side, one would have no need for their value, and the rules for evaluating them would be unnecessary.
+Of course, if assignable expressions always appeared \emph{as} the left hand side, one would have no need for their value, and the rules for evaluating them would be unnecessary.
 However, assignable expressions can be subexpressions of other expressions and therefore must be evaluated.
 }
 
@@ -8498,37 +10325,37 @@
   \alt `?.' <identifier>
 \end{grammar}
 
-\LMHash{}
-An {\em assignable expression} is either:
+\LMHash{}%
+An \Index{assignable expression} is either:
 \begin{itemize}
 \item An identifier.
 \item An invocation (possibly conditional) of a getter (\ref{getters}) or list access operator on an expression $e$.
 \item An invocation of a getter or list access operator on \SUPER{}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 An assignable expression of the form \id{} is evaluated as an identifier expression (\ref{identifierReference}).
 
 %An assignable expression of the form \code{$e$.\id($a_1, \ldots,\ a_n$)} is evaluated as a method invocation (\ref{methodInvocation}).
 
-\LMHash{}
+\LMHash{}%
 An assignable expression of the form \code{$e$.\id} or \code{$e$?.\id} is evaluated as a property extraction (\ref{propertyExtraction}).
 
-\LMHash{}
+\LMHash{}%
 An assignable expression of the form \code{$e_1$[$e_2$]} is evaluated as a method invocation of the operator method \code{[]} on $e_1$ with argument $e_2$.
 
-\LMHash{}
+\LMHash{}%
 An assignable expression of the form \code{\SUPER{}.\id} is evaluated as a property extraction.
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an assignable expression of the form \code{\SUPER{}[$e_2$]} is equivalent to evaluation of the method invocation \code{\SUPER{}.[]($e_2$)}.
 
 
 \subsection{Identifier Reference}
 \LMLabel{identifierReference}
 
-\LMHash{}
-An {\em identifier expression} consists of a single identifier; it provides access to an object via an unqualified name.
+\LMHash{}%
+An \Index{identifier expression} consists of a single identifier; it provides access to an object via an unqualified name.
 
 \begin{grammar}
 <identifier> ::= <IDENTIFIER>
@@ -8537,7 +10364,7 @@
 <IDENTIFIER\_NO\_DOLLAR> ::= <IDENTIFIER\_START\_NO\_DOLLAR>
   \gnewline{} <IDENTIFIER\_PART\_NO\_DOLLAR>*
 
-<IDENTIFIER> ::= <IDENTIFIER\_START IDENTIFIER\_PART>*
+<IDENTIFIER> ::= <IDENTIFIER\_START> <IDENTIFIER\_PART>*
 
 <BUILT\_IN\_IDENTIFIER> ::= \ABSTRACT{}
   \alt \AS{}
@@ -8566,7 +10393,8 @@
 <IDENTIFIER\_START\_NO\_DOLLAR> ::= <LETTER>
   \alt `_'
 
-<IDENTIFIER\_PART\_NO\_DOLLAR> ::= <IDENTIFIER\_START\_NO\_DOLLAR>
+<IDENTIFIER\_PART\_NO\_DOLLAR> ::= \gnewline{}
+  <IDENTIFIER\_START\_NO\_DOLLAR>
   \alt <DIGIT>
 
 <IDENTIFIER\_PART> ::= <IDENTIFIER\_START>
@@ -8575,8 +10403,9 @@
 <qualified> ::= <identifier> (`.' <identifier>)?
 \end{grammar}
 
-\LMHash{}
-A built-in identifier is one of the identifiers produced by the production {\em BUILT\_IN\_IDENTIFIER}.
+\LMHash{}%
+A built-in identifier is one of the identifiers produced by the production
+\synt{BUILT\_IN\_IDENTIFIER}.
 It is a compile-time error if a built-in identifier is used as the declared name of a prefix, class, type parameter or type alias.
 It is a compile-time error to use a built-in identifier other than \DYNAMIC{} in a type annotation or type parameter.
 
@@ -8590,7 +10419,7 @@
 Furthermore, types should begin with an uppercase letter (see the appendix) and so no clash should occur in any Dart user program anyway.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if either of the identifiers \AWAIT{} or \YIELD{} is used as an identifier in a function body marked with either \ASYNC{}, \code{\ASYNC*} or \code{\SYNC*}.
 
 \rationale{
@@ -8599,16 +10428,16 @@
 Hence the restriction, which treats these names as reserved words in a limited context.
 }
 
-\LMHash{}
+\LMHash{}%
 Evaluation of an identifier expression $e$ of the form \id{} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Let $d$ be the innermost declaration in the enclosing lexical scope whose name is \id{} or \code{\id=}.
 If no such declaration exists in the lexical scope, let $d$ be the declaration of the inherited member named \id{} if it exists.
 
 \begin{itemize}
 \item if $d$ is a prefix $p$, a compile-time error occurs unless the token immediately following $d$ is \code{'.'}.
-\item If $d$ is a class or type alias $T$, the value of $e$ is an instance of class \code{Type} (or a subclass thereof) reifying $T$.
+\item If $d$ is a class or type alias $T$, the value of $e$ is an object implementing the class \code{Type} which reifies $T$.
 \item If $d$ is a type parameter $T$, then the value of $e$ is the value of the actual type argument corresponding to $T$ that was passed to the generative constructor that created the current binding of \THIS{}.
 If, however, $e$ occurs inside a static member, a compile-time error occurs.
 
@@ -8628,7 +10457,7 @@
 \item Otherwise, evaluation of $e$ is equivalent to evaluation of the property extraction (\ref{propertyExtraction}) \code{\THIS.\id}.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 The static type of $e$ is determined as follows:
 
 \begin{itemize}
@@ -8637,7 +10466,7 @@
   the static type of $e$ is the type of the variable \id,
   unless \id{} is known to have some type $T$,
   in which case the static type of $e$ is $T$,
-  provided that $T$ is more specific than any other type $S$ such that $v$ is known to have type $S$.
+  provided that $T$ is a subtype of any other type $S$ such that $v$ is known to have type $S$.
 \item If $d$ is a static method, top-level function or local function the static type of $e$ is the function type defined by $d$.
 \item If $d$ is the declaration of a class variable, static getter or static setter declared in class $C$,
   the static type of $e$ is the static type of the getter invocation (\ref{propertyExtraction}) \code{$C$.\id}.
@@ -8657,7 +10486,7 @@
 The intent is to prevent errors when a getter in a surrounding scope is used accidentally.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if an identifier expression \id{} occurs inside a top level or static function
 (be it function, method, getter, or setter)
 or in an instance variable initializer,
@@ -8668,19 +10497,19 @@
 \subsection{Type Test}
 \LMLabel{typeTest}
 
-\LMHash{}
-The {\em is-expression} tests if an object is a member of a type.
+\LMHash{}%
+The \Index{is-expression} tests if an object is a member of a type.
 
 \begin{grammar}
-<typeTest> ::= <isOperator> <type>
+<typeTest> ::= <isOperator> <typeNotVoid>
 
 <isOperator> ::= \IS{} `!'?
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Evaluation of the is-expression \code{$e$ \IS{} $T$} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression $e$ is evaluated to a value $v$.
 % TODO(eernst): https://github.com/dart-lang/sdk/issues/34521.
 Then, if $T$ is a malformed or deferred type (\ref{staticTypes}), a dynamic error occurs.
@@ -8696,14 +10525,22 @@
 Users should test for the null object (\ref{null}) directly rather than via type tests.
 }
 
-\LMHash{}
+\LMHash{}%
 The is-expression \code{$e$ \IS{}! $T$} is equivalent to \code{!($e$ \IS{} $T$)}.
 
-% Add flow dependent types
-
-\LMHash{}
+\LMHash{}%
 Let $v$ be a local variable (\commentary{which can be a formal parameter}).
-An is-expression of the form \code{$v$ \IS{} $T$} shows that $v$ has type $T$ if{}f $T$ is more specific than the type $S$ of the expression $v$ and both $T \ne \DYNAMIC{}$ and $S \ne \DYNAMIC{}$.
+An is-expression of the form \code{$v$ \IS{} $T$}
+shows that $v$ has type $T$
+if $T$ is a subtype of the type of the expression $v$.
+%
+Otherwise,
+if the declared type of $v$ is the type variable $X$,
+and $T$ is a subtype of the bound of $X$,
+and $X \& T$ is a subtype of the type of the expression $v$,
+then $e$ shows that $v$ has type $X \& T$.
+%
+Otherwise $e$ does not show that $v$ has type $T$ for any $T$.
 
 \rationale{
 The motivation for the ``shows that v has type T" relation is to reduce spurious errors thereby enabling a more natural coding style.
@@ -8714,32 +10551,34 @@
 
 It is pointless to deduce a weaker type than what is already known.
 Furthermore, this would lead to a situation where multiple types are associated with a variable at a given point, which complicates the specification.
-Hence the requirement that $T << S$ (we use $<<$ rather than subtyping because subtyping is not a partial order).
+Hence the requirement that the promoted type is a subtype of the current type.
 
-We do not want to refine the type of a variable of type \DYNAMIC{}, as this could lead to more errors rather than fewer.
-The opposite requirement, that $T \ne \DYNAMIC{}$ is a safeguard lest $S$ ever be $\bot$.
+In any case, it is not an error when a type test does not show
+that a given variable does not have a ``better'' type than previously known,
+but tools may choose to give a hint in such cases,
+if suitable heuristics indicate that a promotion is likely to be intended.
 }
 
-\LMHash{}
+\LMHash{}%
 The static type of an is-expression is \code{bool}.
 
 
 \subsection{Type Cast}
 \LMLabel{typeCast}
 
-\LMHash{}
-The {\em cast expression} ensures that an object is a member of a type.
+\LMHash{}%
+The \Index{cast expression} ensures that an object is a member of a type.
 
 \begin{grammar}
-<typeCast> ::= <asOperator> <type>
+<typeCast> ::= <asOperator> <typeNotVoid>
 
 <asOperator> ::= \AS{}
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
  Evaluation of the cast expression \code{$e$ \AS{} $T$} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression $e$ is evaluated to a value $v$.
 %% TODO(eernst): https://github.com/dart-lang/sdk/issues/34521
 Then, if $T$ is a malformed or deferred type (\ref{staticTypes}), a dynamic error occurs.
@@ -8747,44 +10586,17 @@
 and the dynamic type of $o$ is not a subtype of $T$.
 Otherwise $e$ evaluates to $v$.
 
-\LMHash{}
+\LMHash{}%
 The static type of a cast expression \code{$e$ \AS{} $T$} is $T$.
 
 
 \section{Statements}
 \LMLabel{statements}
 
-\LMHash{}
-A {\em statement} is a fragment of Dart code that can be executed at run time.
+\LMHash{}%
+A \Index{statement} is a fragment of Dart code that can be executed at run time.
 Statements, unlike expressions, do not evaluate to a value, but are instead executed for their effect on the program state and control flow.
 
-\label{completion}
-Execution of a statement {\em completes} in one of five ways: either it {\em completes normally}, it {\em breaks} or it {\em continues} (either to a label or without a label), it {\em returns} (with or without a value), or it {\em throws} an exception object and an associated stack trace.
-
-In the description of statement execution, the default is that the execution
-completes normally unless otherwise stated.
-
-If the execution of a statement, $s$, is defined in terms of executing
-another statement,
-and the execution of that other statement does not complete normally,
-then, unless otherwise stated, the execution of $s$ stops
-at that point and completes in the same way.
-\commentary{
-For example, if execution of the body of a \DO{} loop returns a value, so does execution of the \DO{} loop statement itself.
-}
-
-If the execution of a statement is defined in terms of evaluating an expression
-and the evaluation of that expression throws,
-then, unless otherwise stated, the execution of the statement stops
-at that point and throws the same exception object and stack trace.
-\commentary{
-For example, if evaluation of the condition expression of an \IF{} statement throws,
-then so does execution of the \IF{} statement.
-Likewise, if evaluation of the expression of a \RETURN{} statement throws, so does execution of the \RETURN{} statement.
-}
-
-\LMHash{}
-
 \begin{grammar}
 <statements> ::= <statement>*
 
@@ -8810,34 +10622,87 @@
 \end{grammar}
 
 
+\subsubsection{Statement Completion}
+\LMLabel{statementCompletion}
+
+\LMHash{}%
+Execution of a statement \IndexCustom{completes}{completion}
+in one of five ways:
+either it
+\IndexCustom{completes normally}{completion!normally},
+it \IndexCustom{breaks}{completion!breaks}
+or it \IndexCustom{continues}{completion!continues}
+(either to a label or without a label),
+it \IndexCustom{returns}{completion!returns} (with or without a value),
+or it \IndexCustom{throws}{completion!throws}
+an exception object and an associated stack trace.
+
+\LMHash{}%
+In descriptions of statement execution the default is that
+the execution completes normally unless otherwise stated.
+
+\LMHash{}%
+If the execution of a statement, $s$,
+is defined in terms of executing another statement,
+and the execution of that other statement does not complete normally,
+then, unless otherwise stated, the execution of $s$ stops
+at that point and completes in the same way.
+\commentary{%
+For example, if execution of the body of a \DO{} loop returns a value,
+so does execution of the \DO{} loop statement itself.%
+}
+
+\LMHash{}%
+If the execution of a statement is defined in terms of evaluating an expression
+and the evaluation of that expression throws,
+then, unless otherwise stated, the execution of the statement stops
+at that point and throws the same exception object and stack trace.
+\commentary{
+For example,
+if evaluation of the condition expression of an \IF{} statement throws,
+then so does execution of the \IF{} statement.
+Likewise, if evaluation of the expression of a \RETURN{} statement throws,
+so does execution of the \RETURN{} statement.
+}
+
+%% TODO(eernst): Use proposal from Lasse to define the concept of a statement
+%% for which it is 'statically known that it will not complete normally': Cf.
+%% https://github.com/dart-lang/language/issues/139.
+\Q{%
+Definition of
+`it is statically known that this statement will not complete normally'
+will be inserted here.%
+}
+
+
 \subsection{Blocks}
 \LMLabel{blocks}
 
-\LMHash{}
-A {\em block statement} supports sequencing of code.
+\LMHash{}%
+A \Index{block statement} supports sequencing of code.
 
-\LMHash{}
+\LMHash{}%
 Execution of a block statement $\{s_1, \ldots, s_n\}$ proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 For $i \in 1 .. n, s_i$ is executed.
 
-\LMHash{}
+\LMHash{}%
 A block statement introduces a new scope, which is nested in the lexically enclosing scope in which the block statement appears.
 
 
 \subsection{Expression Statements}
 \LMLabel{expressionStatements}
 
-\LMHash{}
-An {\em expression statement} consists of an expression that does not
+\LMHash{}%
+An \Index{expression statement} consists of an expression that does not
 begin with a \syntax{`{'} character.
 
 \begin{grammar}
 <expressionStatement> ::= <expression>? `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 The expression of an expression statement is not allowed to begin with a \syntax{`\{'}.
 \commentary{
 This means that if some source text could otherwise be parsed as an expression
@@ -8852,7 +10717,7 @@
 before deciding that it is parsing a block statement.
 }
 
-\LMHash{}
+\LMHash{}%
 Execution of an expression statement \code{$e$;} proceeds by evaluating $e$.
 If the expression evaluates to a value, then the value is ignored
 and the execution completes normally.
@@ -8861,18 +10726,19 @@
 \subsection{Local Variable Declaration}
 \LMLabel{localVariableDeclaration}
 
-\LMHash{}
-A {\em variable declaration statement},
-also known as a {\em local variable declaration},
+\LMHash{}%
+A \Index{variable declaration statement},
+also known as a \Index{local variable declaration},
 has the following form:
 
 \begin{grammar}
 <localVariableDeclaration> ::= <initializedVariableDeclaration> `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Each local variable declaration introduces
-a {\em local variable} into the innermost enclosing scope.
+a \IndexCustom{local variable}{variable!local}
+into the innermost enclosing scope.
 
 \commentary{
 Local variables do not induce getters and setters.
@@ -8881,17 +10747,21 @@
 (\ref{formalParameters}).
 }
 
-\LMHash{}
+\LMHash{}%
 The properties of being
-{\em initialized}, {\em constant}, {\em final}, and {\em mutable}
+\IndexCustom{initialized}{variable!initialized},
+\IndexCustom{constant}{variable!constant},
+\IndexCustom{final}{variable!final}, and
+\IndexCustom{mutable}{variable!mutable}
 apply to local variables with the same definitions as for other variables
 (\ref{variables}).
 
-\LMHash{}
-We say that a local variable $v$ is {\em potentially mutated} in some scope $s$
+\LMHash{}%
+We say that a local variable $v$ is \Index{potentially mutated}
+in some scope $s$
 if $v$ is mutable, and an assignment to $v$ occurs in $s$.
 
-\LMHash{}
+\LMHash{}%
 A local variable declaration of the form \code{\VAR{} $v$;} is equivalent to \code{\VAR{} $v$ = \NULL{};}.
 A local variable declaration of the form \code{$T$ $v$;} is equivalent to \code{$T$ $v$ = \NULL{};}.
 
@@ -8900,7 +10770,7 @@
 E.g., \code{int i;} is equivalent to \code{int i = null;}.
 }
 
-\LMHash{}
+\LMHash{}%
 The type of a local variable with a declaration of one of the forms
 \code{$T$ $v$ = $e$;}
 \code{\CONST{} $T$ $v$ = $e$;}
@@ -8912,7 +10782,7 @@
 \code{\FINAL{} $v$ = $e$;}
 is \DYNAMIC{}.
 
-\LMHash{}
+\LMHash{}%
 Let $v$ be a local variable declared by an initializing variable declaration,
 and let $e$ be the associated initializing expression.
 It is a compile-time error if the static type of $e$ is not assignable to the type of $v$.
@@ -8924,7 +10794,7 @@
 (\ref{assignment}).
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if
 a local variable is referenced at a source code location that is before
 the end of its initializing expression, if any,
@@ -9001,7 +10871,7 @@
 Similarly, for the declaration of `\code{aC}'.
 }
 
-\LMHash{}
+\LMHash{}%
 Execution of a variable declaration statement of one of the forms
 \code{\VAR{} $v$ = $e$;}
 \code{$T$ $v$ = $e$;}
@@ -9011,7 +10881,7 @@
 \code{\FINAL{} $T$ $v$ = $e$;}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression $e$ is evaluated to an object $o$.
 Then, the variable $v$ is set to $o$.
 A dynamic type error occurs
@@ -9026,14 +10896,14 @@
 \subsection{Local Function Declaration}
 \LMLabel{localFunctionDeclaration}
 
-\LMHash{}
+\LMHash{}%
 A function declaration statement declares a new local function (\ref{functionDeclarations}).
 
 \begin{grammar}
 <localFunctionDeclaration> ::= <functionSignature> <functionBody>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 A function declaration statement of one of the forms
 \code{\id{} \metavar{signature} \{ \metavar{statements} \}}
 or
@@ -9090,14 +10960,14 @@
 \subsection{If}
 \LMLabel{if}
 
-\LMHash{}
-The {\em if statement} allows for conditional execution of statements.
+\LMHash{}%
+The \Index{if statement} allows for conditional execution of statements.
 
 \begin{grammar}
 <ifStatement> ::= \IF{} `(' <expression> `)' <statement> (\ELSE{} <statement>)?
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 An if statement of the form \code{\IF{} ($e$) $s_1$ \ELSE{} $s_2$} where $s_1$ is not a block statement is equivalent to the statement \code{\IF{} ($e$) \{$s_1$\} \ELSE{} $s_2$}.
 An if statement of the form \code{\IF{} ($e$) $s_1$ \ELSE{} $s_2$} where $s_2$ is not a block statement is equivalent to the statement \code{\IF{} ($e$) $s_1$ \ELSE{} \{$s_2$\}}.
 
@@ -9124,18 +10994,18 @@
 We expect tools to highlight cases of shadowing to help avoid such situations.
 }
 
-\LMHash{}
+\LMHash{}%
 Execution of an if statement of the form \code{\IF{} ($b$) $s_1$ \ELSE{} $s_2$} where $s_1$ and $s_2$ are block statements, proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First, the expression $b$ is evaluated to an object $o$.
 It is a run-time error if the run-time type of $o$ is not \code{bool}.
 If $o$ is \TRUE{}, then the block statement $s_1$ is executed, otherwise the block statement $s_2$ is executed.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the type of the expression $b$ may not be assigned to \code{bool}.
 
-\LMHash{}
+\LMHash{}%
 If $b$ shows that a local variable $v$ has type $T$,
 then the type of $v$ is known to be $T$ in $s_2$,
 unless any of the following are true
@@ -9147,15 +11017,15 @@
 $v$ is potentially mutated anywhere in the scope of $v$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 An if statement of the form \code{\IF{} ($e$) $s$} is equivalent to the if statement \code{\IF{} ($e$) $s$ \ELSE{} \{\}}.
 
 
 \subsection{For}
 \LMLabel{for}
 
-\LMHash{}
-The {\em for statement} supports iteration.
+\LMHash{}%
+The \Index{for statement} supports iteration.
 
 \begin{grammar}
 <forStatement> ::= \AWAIT? \FOR{} `(' <forLoopParts> `)' <statement>
@@ -9168,20 +11038,20 @@
   \alt <expression>? `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
  The for statement has three forms - the traditional for loop and two forms of the for-in statement - synchronous and asynchronous.
 
 
 \subsubsection{For Loop}
 \LMLabel{forLoop}
 
-\LMHash{}
+\LMHash{}%
 Execution of a for statement of the form \code{\FOR{} (\VAR{} $v$ = $e_0$; $c$; $e$) $s$} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 If $c$ is empty then let $c'$ be \TRUE{} otherwise let $c'$ be $c$.
 
-\LMHash{}
+\LMHash{}%
 First the variable declaration statement \VAR{} $v = e_0$ is executed.
 Then:
 \begin{enumerate}
@@ -9199,7 +11069,7 @@
 The statement $[v'/v]\{s\}$ is executed.
 
 If this execution completes normally, continues without a label,
-or continues to a label (\ref{labels}) that prefixes this \FOR{} statement (\ref{completion}),
+or continues to a label (\ref{labels}) that prefixes this \FOR{} statement (\ref{statementCompletion}),
 then execution of the statement is treated as if it had completed normally.
 
 \label{allocateFreshVar}
@@ -9222,7 +11092,7 @@
 and then modifies $v''$ as required for the next iteration.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the static type of $c$ may not be assigned to \code{bool}.
 
 %A for statement of the form \code{\FOR{} ($d$ ; $c$; $e$) $s$} is equivalent to the following code:
@@ -9241,18 +11111,18 @@
 \subsubsection{For-in}
 \LMLabel{for-in}
 
-\LMHash{}
+\LMHash{}%
 Let $D$ be derived from \syntax{<finalConstVarOrType>?}
 and let $n0$ be an identifier that does not occur anywhere in the program.
 A for statement of the form \code{\FOR{} ($D$ \id{} \IN{} $e$) $s$} is equivalent to the following code:
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \VAR{} $n0$ = $e$.iterator;
 \WHILE{} ($n0$.moveNext()) \{
    $D$ \id{} = $n0$.current;
    $s$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 For purposes of static typechecking,
 this code is checked under the assumption that $n0$ is declared to be of type $T$,
@@ -9266,23 +11136,23 @@
 \subsubsection{Asynchronous For-in}
 \LMLabel{asynchronousFor-in}
 
-\LMHash{}
+\LMHash{}%
 A for-in statement may be asynchronous.
 The asynchronous form is designed to iterate over streams.
 An asynchronous for loop is distinguished by the keyword \AWAIT{} immediately preceding the keyword \FOR.
 
-\LMHash{}
+\LMHash{}%
 Let $D$ be derived from \syntax{<finalConstVarOrType>?}.
 Execution of a for-in statement, $f$, of the form
 \code{\AWAIT{} \FOR{} ($D$ \id{} \IN{} $e$) $s$}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression $e$ is evaluated to an object $o$.
 It is a dynamic type error if $o$ is not an instance of a class that implements \code{Stream}.
 It is a compile-time error if $D$ is empty and \id{} is a final variable.
 
-\LMHash{}
+\LMHash{}%
 The stream associated with the innermost enclosing asynchronous for loop, if any, is paused.
 The stream $o$ is listened to, producing a stream subscription $u$,
 and execution of the asynchronous for-in loop is suspended
@@ -9299,8 +11169,8 @@
 The \code{pause} call can throw, although that should never happen for a correctly implemented stream.
 }
 
-\LMHash{}
-For each {\em data event} from $u$,
+\LMHash{}%
+For each \Index{data event} from $u$,
 the statement $s$ is executed with \id{} bound to the value of the current data event.
 
 \commentary{
@@ -9311,8 +11181,8 @@
 If $o$ doesn't act as a valid stream, for example by not respecting pause requests, the behavior of the asynchronous loop may become unpredictable.
 }
 
-\LMHash{}
-If execution of $s$ continues without a label, or to a label (\ref{labels}) that prefixes the asynchronous for statement (\ref{completion}), then the execution of $s$ is treated as if it had completed normally.
+\LMHash{}%
+If execution of $s$ continues without a label, or to a label (\ref{labels}) that prefixes the asynchronous for statement (\ref{statementCompletion}), then the execution of $s$ is treated as if it had completed normally.
 
 If execution of $s$ otherwise does not complete normally, the subscription $u$ is canceled by evaluating \code{\AWAIT{} $v$.cancel()} where $v$ is a fresh variable referencing the stream subscription $u$.
 If that evaluation throws,
@@ -9328,8 +11198,8 @@
 That should never happen for a correctly implemented stream.
 }
 
-\LMHash{}
-On an {\em error event} from $u$,
+\LMHash{}%
+On an \Index{error event} from $u$,
 with error object $e$ and stack trace $st$,
 the subscription $u$ is canceled by evaluating \code{\AWAIT{} v.cancel()}
 where $v$ is a fresh variable referencing the stream subscription $u$.
@@ -9337,10 +11207,10 @@
 execution of $f$ throws the same exception object and stack trace.
 Otherwise execution of $f$ throws with $e$ as exception object and $st$ as stack trace.
 
-\LMHash{}
+\LMHash{}%
 When $u$ is done, execution of $f$ completes normally.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if an asynchronous for-in statement appears inside a synchronous function (\ref{functions}).
 It is a compile-time error if a traditional for loop (\ref{forLoop}) is prefixed by the \AWAIT{} keyword.
 
@@ -9352,98 +11222,99 @@
 \subsection{While}
 \LMLabel{while}
 
-\LMHash{}
+\LMHash{}%
 The while statement supports conditional iteration, where the condition is evaluated prior to the loop.
 
 \begin{grammar}
 <whileStatement> ::= \WHILE{} `(' <expression> `)' <statement>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Execution of a while statement of the form \code{\WHILE{} ($e$) $s$;} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression $e$ is evaluated to an object $o$.
 It is a run-time error if the run-time type of $o$ is not \code{bool}.
 
-\LMHash{}
-If $o$ is \FALSE{}, then execution of the while statement completes normally (\ref{completion}).
+\LMHash{}%
+If $o$ is \FALSE{}, then execution of the while statement completes normally (\ref{statementCompletion}).
 
-\LMHash{}
+\LMHash{}%
 Otherwise $o$ is \TRUE{} and then the statement $\{s\}$ is executed.
-If that execution completes normally or it continues with no label or to a label (\ref{labels}) that prefixes the \WHILE{} statement (\ref{completion}), then the while statement is re-executed.
+If that execution completes normally or it continues with no label or to a label (\ref{labels}) that prefixes the \WHILE{} statement (\ref{statementCompletion}), then the while statement is re-executed.
 If the execution breaks without a label, execution of the while statement completes normally.
 \commentary{
 If the execution breaks with a label that prefixes the \WHILE{} statement,
 it does end execution of the loop, but the break itself is handled by the surrounding labeled statement (\ref{labels}).
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the static type of $e$ may not be assigned to \code{bool}.
 
 
 \subsection{Do}
 \LMLabel{do}
 
-\LMHash{}
+\LMHash{}%
 The do statement supports conditional iteration, where the condition is evaluated after the loop.
 
 \begin{grammar}
 <doStatement> ::= \DO{} <statement> \WHILE{} `(' <expression> `)' `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Execution of a do statement of the form \code{\DO{} $s$ \WHILE{} ($e$);} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The statement $\{s\}$ is executed.
-If that execution continues with no label, or to a label (\ref{labels}) that prefixes the do statement (\ref{completion}), then the execution of $s$ is treated as if it had completed normally.
+If that execution continues with no label, or to a label (\ref{labels}) that prefixes the do statement (\ref{statementCompletion}), then the execution of $s$ is treated as if it had completed normally.
 
-\LMHash{}
+\LMHash{}%
 Then, the expression $e$ is evaluated to an object $o$.
 It is a run-time error if the run-time type of $o$ is not \code{bool}.
-If $o$ is \FALSE{}, execution of the do statement completes normally (\ref{completion}).
+If $o$ is \FALSE{}, execution of the do statement completes normally (\ref{statementCompletion}).
 If $o$ is \TRUE{}, then the do statement is re-executed.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the static type of $e$ may not be assigned to \code{bool}.
 
 
 \subsection{Switch}
 \LMLabel{switch}
 
-\LMHash{}
-The {\em switch statement} supports dispatching control among a large number of cases.
+\LMHash{}%
+The \Index{switch statement} supports dispatching control among a large number of cases.
 
 \begin{grammar}
-<switchStatement> ::= \SWITCH{} `(' <expression> `)' `{' <switchCase>* <defaultCase>? `}'
+<switchStatement> ::= \gnewline{}
+  \SWITCH{} `(' <expression> `)' `{' <switchCase>* <defaultCase>? `}'
 
 <switchCase> ::= <label>* \CASE{} <expression> `:' <statements>
 
 <defaultCase> ::= <label>* \DEFAULT{} `:' <statements>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
  Given a switch statement of the form
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \SWITCH{} ($e$) \{
    $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
    $\ldots$
    $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
    $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 or the form
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \SWITCH{} ($e$) \{
    $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
    $\ldots$
    $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 it is a compile-time error unless the expressions $e_k$ are constant expressions for all $k \in 1 .. n$.
 It is a compile-time error if the values of the expressions $e_k$ are not either:
@@ -9462,14 +11333,17 @@
 Note that the values of the expressions are known at compile time, and are independent of any type annotations.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the class $C$ has an implementation of
 the operator \code{==} other than the one inherited from \code{Object},
 unless the expression evaluates to a string or an integer,
-or the expression evaluates to an instance of the built-in
+the expression evaluates to an instance of the built-in
 class \code{Symbol} which was initially obtained by evaluation of a
 literal symbol or
-a constant invocation of a constructor of the \code{Symbol} class.
+a constant invocation of a constructor of the \code{Symbol} class,
+or to an object implementing the built-in class \code{Type}
+which was originally created by evaluating a constant type literal
+(\ref{dynamicTypeSystem}).
 
 \rationale{
 The prohibition on user defined equality allows us to implement the switch efficiently for user defined types.
@@ -9481,31 +11355,31 @@
 The \SWITCH{} statement should only be used in very limited situations (e.g., interpreters or scanners).
 }
 
-\LMHash{}
+\LMHash{}%
 Execution of a switch statement of the form
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \SWITCH{} ($e$) \{
    $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
    $\ldots$
    $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
    $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 or the form
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \SWITCH{} ($e$) \{
    $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
    $\ldots$
    $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The statement \code{\VAR{} \id{} = $e$;} is evaluated, where \id{} is a fresh variable.
 It is a run-time error if the value of $e$ is
 not an instance of the same class as the constants $e_1, \ldots, e_n$.
@@ -9514,25 +11388,25 @@
 Note that if there are no case clauses ($n = 0$), the type of $e$ does not matter.
 }
 
-\LMHash{}
+\LMHash{}%
 Next, the case clause \CASE{} $e_{1}$: $s_{1}$ is matched against \id, if $n > 0$.
 Otherwise if there is a \DEFAULT{} clause, the case statements $s_{n+1}$ are executed (\ref{case-execute}).
 
-\LMHash{}
+\LMHash{}%
 Matching of a \CASE{} clause \CASE{} $e_{k}: s_{k}$ of a switch statement
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \SWITCH{} ($e$) \{
    $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
    $\ldots$
    $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
    $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 against the value of a variable \id{} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression \code{$e_k$ == \id} is evaluated to an object $o$.
 It is a run-time error if the run-time type of $o$ is not \code{bool}.
 If $o$ is \FALSE{} the following case, \CASE{} $e_{k+1}: s_{k+1}$ is matched against \id{} if $k < n$, and if $k = n$, then the \DEFAULT{} clause's statements are executed (\ref{case-execute}).
@@ -9540,28 +11414,28 @@
 If no such $h$ exists, let $h = n + 1$.
 The case statements $s_h$ are then executed (\ref{case-execute}).
 
-\LMHash{}
+\LMHash{}%
 Matching of a \CASE{} clause \CASE{} $e_{k}: s_{k}$ of a switch statement
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \SWITCH{} ($e$) \{
    $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
    $\ldots$
    $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 against the value of a variable \id{} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression \code{$e_k$ == \id} is evaluated to an object $o$.
 It is a run-time error if the run-time type of $o$ is not \code{bool}.
 If $o$ is \FALSE{} the following case, \CASE{} $e_{k+1}: s_{k+1}$ is matched against \id{} if $k < n$.
 If $o$ is \TRUE{}, let $h$ be the smallest integer such that $h \ge k$ and $s_h$ is non-empty.
 If such a $h$ exists, the case statements $s_h$ are executed (\ref{case-execute}).
-Otherwise the switch statement completes normally (\ref{completion}).
+Otherwise the switch statement completes normally (\ref{statementCompletion}).
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the type of $e$ may not be assigned to the type of $e_k$.
 Let $s$ be the last statement of the statement sequence $s_k$.
 If $s$ is a non-empty block statement, let $s$ instead be the last statement of the block statement.
@@ -9594,8 +11468,8 @@
   Very elaborate code in a case clause is probably bad style in any case, and such code can always be refactored.
 }
 
-\LMHash{}
-It is a compile-time warning if all of the following conditions hold:
+\LMHash{}%
+It is a static warning if all of the following conditions hold:
 \begin{itemize}
 \item The switch statement does not have a default clause.
 \item The static type of $e$ is an enumerated type with elements $\id_1, \ldots, \id_n$.
@@ -9603,38 +11477,38 @@
 \end{itemize}
 
 \commentary{
-In other words, a warning will be emitted if a switch statement over an enum is not exhaustive.
+In other words, a static warning will be emitted if a switch statement over an enum is not exhaustive.
 }
 
 
 \subsubsection{Switch case statements}
 \LMLabel{case-execute}
 
-\LMHash{}
+\LMHash{}%
 Execution of the case statements $s_h$ of a switch statement
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \SWITCH{} ($e$) \{
    $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
    $\ldots$
    $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 or a switch statement
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \SWITCH{} ($e$) \{
    $label_{11} \ldots label_{1j_1}$ \CASE{} $e_1: s_1$
    $\ldots$
    $label_{n1} \ldots label_{nj_n}$ \CASE{} $e_n: s_n$
    $label_{(n+1)1} \ldots label_{(n+1)j_{n+1}}$ \DEFAULT{}: $s_{n+1}$
 \}
-\end{dartCode}
+\end{normativeDartCode}
 
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Execute $\{s_h\}$.
 If this execution completes normally,
 and if $s_h$ is not the statements of the last case of the switch
@@ -9649,9 +11523,9 @@
 The last case in a switch (default or otherwise) can `fall-through' to the end of the statement.
 }
 
-If execution of $\{s_h\}$ breaks with no label (\ref{completion}), then the execution of the switch statement completes normally.
+If execution of $\{s_h\}$ breaks with no label (\ref{statementCompletion}), then the execution of the switch statement completes normally.
 
-If execution of $\{s_h\}$ continues to a label (\ref{completion}), and the label is $label_{ij}$, where $1 \le i \le n+1$ if the \SWITCH{} statement has a \DEFAULT{}, or $1 \le i \le n$ if there is no \DEFAULT{}, and where $1 \le j \le j_{i}$, then
+If execution of $\{s_h\}$ continues to a label (\ref{statementCompletion}), and the label is $label_{ij}$, where $1 \le i \le n+1$ if the \SWITCH{} statement has a \DEFAULT{}, or $1 \le i \le n$ if there is no \DEFAULT{}, and where $1 \le j \le j_{i}$, then
 let $h$ be the smallest number such that $h \ge i$ and $s_h$ is non-empty.
 If no such $h$ exists, let $h = n + 1$ if the \SWITCH{} statement has a \DEFAULT{}, otherwise let $h = n$.
 The case statements $s_h$ are then executed (\ref{case-execute}).
@@ -9662,17 +11536,17 @@
 \subsection{Rethrow}
 \LMLabel{rethrow}
 
-\LMHash{}
-The {\em rethrow statement} is used to re-throw an exception and its associated stack trace.
+\LMHash{}%
+The \Index{rethrow statement} is used to re-throw an exception and its associated stack trace.
 
 \begin{grammar}
 <rethrowStatement> ::= \RETHROW{} `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Execution of a \code{\RETHROW{}} statement proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 Let $f$ be the immediately enclosing function, and let \code{\ON{} $T$ \CATCH{} ($p_1$, $p_2$)} be the immediately enclosing catch clause (\ref{try}).
 
 \rationale{
@@ -9680,31 +11554,31 @@
 So we can assume that the \RETHROW{} is enclosed in a \CATCH{} clause of that form.
 }
 
-\LMHash{}
-The \RETHROW{} statement {\em throws} (\ref{completion}) with $p_1$ as the exception object and $p_2$ as the stack trace.
+\LMHash{}%
+The \RETHROW{} statement throws (\ref{statementCompletion}) with $p_1$ as the exception object and $p_2$ as the stack trace.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a \code{\RETHROW{}} statement is not enclosed within an \ON-\CATCH{} clause.
 
 
 \subsection{Try}
 \LMLabel{try}
 
-\LMHash{}
+\LMHash{}%
 The try statement supports the definition of exception handling code in a structured way.
 
 \begin{grammar}
 <tryStatement> ::= \TRY{} <block> (<onPart>+ <finallyPart>? | <finallyPart>)
 
 <onPart> ::= <catchPart> <block>
-  \alt \ON{} <type> <catchPart>? <block>
+  \alt \ON{} <typeNotVoid> <catchPart>? <block>
 
 <catchPart> ::= \CATCH{} `(' <identifier> (`,' <identifier>)? `)'
 
 <finallyPart> ::= \FINALLY{} <block>
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 A try statement consists of a block statement, followed by at least one of:
 \begin{enumerate}
 \item
@@ -9718,49 +11592,49 @@
 The \ON{} clause can be omitted, leaving what looks like a Javascript catch clause.
 }
 
-\LMHash{}
+\LMHash{}%
 A try statement of the form \code{\TRY{} $s_1$ $on-catch_1 \ldots on-catch_n$;} is equivalent to the statement \code{\TRY{} $s_1$ $on-catch_1 \ldots on-catch_n$ \FINALLY{} $\{\}$}.
 
-\LMHash{}
+\LMHash{}%
 An \ON{}-\CATCH{} clause of the form \code{\ON{} $T$ \CATCH{} ($p_1$) $s$} is equivalent to an \ON{}-\CATCH{} clause \code{\ON{} $T$ \CATCH{} ($p_1$, $p_2$) $s$} where $p_2$ is a fresh identifier.
 
-\LMHash{}
+\LMHash{}%
 An \ON{}-\CATCH{} clause of the form \code{\ON{} $T$ $s$} is equivalent to an \ON{}-\CATCH{} clause \code{\ON{} $T$ \CATCH{} ($p_1$, $p_2$) $s$} where $p_1$ and $p_2$ are fresh identifiers.
 
-\LMHash{}
+\LMHash{}%
 An \ON{}-\CATCH{} clause of the form \code{\CATCH{} ($p$) $s$} is equivalent to an \ON{}-\CATCH{} clause \code{\ON{} \DYNAMIC{} \CATCH{} ($p$, $p_2$) $s$} where $p_2$ is a fresh identifier.
 
 An \ON{}-\CATCH{} clause of the form \code{\CATCH{} ($p_1$, $p_2$) $s$} is equivalent to an \ON{}-\CATCH{} clause \code{\ON{} \DYNAMIC{} \CATCH{} ($p_1$, $p_2$) $s$}.
 
-\LMHash{}
+\LMHash{}%
 An \ON{}-\CATCH{} clause of the form \code{\ON{} $T$ \CATCH{} ($p_1$, $p_2$) $s$} introduces a new scope $CS$ in which final local variables specified by $p_1$ and $p_2$ are defined.
 The statement $s$ is enclosed within $CS$.
 The static type of $p_1$ is $T$ and the static type of $p_2$ is \code{StackTrace}.
 
-\LMHash{}
+\LMHash{}%
 Execution of a \TRY{} statement $s$ of the form:
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \TRY{} $b$
 \ON{} $T_1$ \CATCH{} ($e_1$, $t_1$) $c_1$
 \ldots{}
 \ON{} $T_n$ \CATCH{} ($e_n$, $t_n$) $c_n$
 \FINALLY{} $f$
-\end{dartCode}
+\end{normativeDartCode}
 proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First $b$ is executed.
-If execution of $b$ throws (\ref{completion}) with exception object $e$ and stack trace $t$, then $e$ and $t$ are matched against the \ON{}-\CATCH{} clauses to yield a new completion (\ref{on-catch}).
+If execution of $b$ throws (\ref{statementCompletion}) with exception object $e$ and stack trace $t$, then $e$ and $t$ are matched against the \ON{}-\CATCH{} clauses to yield a new completion (\ref{on-catch}).
 
 Then, even if execution of $b$ did not complete normally or matching against the \ON{}-\CATCH{} clauses did not complete normally, the $f$ block is executed.
 
 If execution of $f$ does not complete normally,
 execution of the \TRY{} statement completes in the same way.
-Otherwise if execution of $b$ threw (\ref{completion}), the \TRY{} statement completes in the same way as the matching against the \ON{}-\CATCH{} clauses.
+Otherwise if execution of $b$ threw (\ref{statementCompletion}), the \TRY{} statement completes in the same way as the matching against the \ON{}-\CATCH{} clauses.
 Otherwise the \TRY{} statement completes in the same way as the execution of $b$.
 
-\LMHash{}
+\LMHash{}%
 If $T_1$ is a malformed or deferred type (\ref{staticTypes}), then performing a match causes a run-time error.
 It is a compile-time error if $T_i$, $1 \le i \le n$ is a deferred or malformed type.
 
@@ -9768,119 +11642,201 @@
 \subsubsection{\ON{}-\CATCH{} clauses}
 \LMLabel{on-catch}
 
-\LMHash{}
+\LMHash{}%
 Matching an exception object $e$ and stack trace $t$ against a (potentially empty) sequence of \ON{}-\CATCH{} clauses of the form
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \ON{} $T_1$ \CATCH{} ($e_1$, $st_1$) \{ $s_1$ \}
 \ldots
 \ON{} $T_n$ \CATCH{} ($e_n$, $st_n$) \{ $s_n$ \}
-\end{dartCode}
+\end{normativeDartCode}
 proceeds as follows:
 
-\LMHash{}
-If there are no \ON{}-\CATCH{} clauses ($n = 0$), matching throws the exception object $e$ and stack trace $t$ (\ref{completion}).
+\LMHash{}%
+If there are no \ON{}-\CATCH{} clauses ($n = 0$), matching throws the exception object $e$ and stack trace $t$ (\ref{statementCompletion}).
 
-\LMHash{}
+\LMHash{}%
 Otherwise the exception is matched against the first clause.
 
-\LMHash{}
+\LMHash{}%
 Otherwise, if the type of $e$ is a subtype of $T_1$, then the first clause matches, and then $e_1$ is bound to the exception object $e$ and $t_1$ is bound to the stack trace $t$, and $s_1$ is executed in this scope.
 The matching completes in the same way as this execution.
 
-\LMHash{}
+\LMHash{}%
 Otherwise, if the first clause did not match $e$, $e$ and $t$ are recursively matched against the remaining \ON{}-\CATCH{} clauses:
 
-\begin{dartCode}
+\begin{normativeDartCode}
 \ON{} $T_2$ \CATCH{} ($e_2$, $t_2$) \{ $s_2$ \}
 \ldots
 \ON{} $T_n$ \CATCH{} ($e_n$, $t_n$) \{ $s_n$ \}
-\end{dartCode}
+\end{normativeDartCode}
 
 
 \subsection{Return}
 \LMLabel{return}
 
-\LMHash{}
-The {\em return statement} returns a result to the caller of a synchronous function,
+\LMHash{}%
+The \Index{return statement}
+returns a result to the caller of a synchronous function,
 completes the future associated with an asynchronous function,
-or terminates the stream or iterable associated with a generator (\ref{functions}).
+or terminates the stream or iterable associated with a generator
+(\ref{functions}).
 
 \begin{grammar}
 <returnStatement> ::= \RETURN{} <expression>? `;'
 \end{grammar}
 
-\LMHash{}
-Consider a return statement of the form \code{\RETURN{} $e$;}.
-Let $T$ be the static type of $e$, let $f$ be the immediately enclosing function,
-and let $S$ be the declared return type of $f$.
+\LMHash{}%
+Consider a return statement $s$ of the form \code{\RETURN{} $e$?;}.
+Let $S$ be the static type of $e$, if $e$ is present,
+let $f$ be the immediately enclosing function,
+and let $T$ be the declared return type of $f$.
 
-\LMHash{}
-It is a compile-time error if the body of $f$ is marked \ASYNC{}
-and the type \code{Future<\flatten{T}>} (\ref{functionExpressions}) may not be assigned to $S$.
-Otherwise, it is a compile-time error if $T$ may not be assigned to $S$.
+\LMHash{}%
+\Case{Synchronous non-generator functions}
+Consider the case where $f$ is a synchronous non-generator function
+(\ref{functions}).
+%
+% Returning without a value is only ok for "voidy" return types.
+It is a compile-time error if $s$ is \code{\RETURN{};},
+unless $T$ is \VOID, \DYNAMIC, or \code{Null}.
+%
+% Returning with a value in a void function only ok when that value is "voidy".
+It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
+$T$ is \VOID,
+and $S$ is neither \VOID, \DYNAMIC, nor \code{Null}.
+%
+% Returning void in a "non-voidy" function is an error.
+It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
+$T$ is neither \VOID, \DYNAMIC, nor \code{Null},
+and $S$ is \VOID.
+%
+% Otherwise, returning an unassignable value is an error.
+It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
+$S$ is not \VOID,
+and $S$ is not assignable to $T$.
 
-\LMHash{}
-It is a compile-time error if a return statement of the form \code{\RETURN{} $e$;} appears in a generative constructor (\ref{generativeConstructors}).
-
-\rationale{
-It is quite easy to forget to add the factory prefix for a constructor, accidentally converting a factory into a generative constructor.
-The static checker may detect a type mismatch in some, but not all, of these cases.
-The rule above helps catch such errors, which can otherwise be very hard to recognize.
-There is no real downside to it, as returning a value from a generative constructor is meaningless.
+\commentary{%
+Note that $T$ cannot be \VOID, \DYNAMIC, or \code{Null} in the last case,
+because all types are assignable to those types.
+An error will not be raised if $f$ has no declared return type,
+since the return type would be \DYNAMIC, to which every type is assignable.
+However, a synchronous non-generator function
+that declares a return type which is not ``voidy''
+must return an expression explicitly.%
 }
-
-\LMHash{}
-It is a compile-time error if a return statement of the form \code{\RETURN{} $e$;} appears in a generator function.
-
-\rationale{
-In the case of a generator function, the value returned by the function is the iterable or stream associated with it, and individual elements are added to that iterable using yield statements, and so returning a value makes no sense.
+\rationale{%
+This helps catch situations where users forget
+to return a value in a return statement.%
 }
+\EndCase
 
-\LMHash{}
-Let $f$ be the function immediately enclosing a return statement of the form \code{\RETURN{};}.
-It is a compile-time warning if $f$ is neither a generator nor a generative constructor and either:
-\begin{itemize}
-%% TODO(eernst): Integrating generalized-void.md, "may not be assigned
-%% to void" is useless. Update, also considering invalid_returns.md.
-\item $f$ is synchronous and the return type of $f$ may not be assigned to \VOID{} (\ref{typeVoid}) or,
-%% TODO(eernst): Revisit when integrating invalid_returns.md.
-\item $f$ is asynchronous and the return type of $f$ may not be assigned to \code{Future<Null>}.
-\end{itemize}
-
-\commentary{
-Hence, a compile-time warning will not be raised if $f$ has no declared return type,
-%% TODO(eernst): Update when integrating generalized-void.md!
-since the return type would be \DYNAMIC{} and \DYNAMIC{} may be assigned to \VOID{} and to \code{Future<Null>}.
-However, any synchronous non-generator function that declares a return type must return an expression explicitly.
-}
-\rationale{
-This helps catch situations where users forget to return a value in a return statement.
-}
-
-\rationale{
+\LMHash{}%
+\Case{Asynchronous non-generator functions}
+Consider the case where $f$ is an asynchronous non-generator function
+(\ref{functions}).
+%
+% Returning without a value is only ok for async-"voidy" return types.
+It is a compile-time error if $s$ is \code{\RETURN{};},
+unless \flatten{T}
+(\ref{functionExpressions})
+is \VOID{}, \DYNAMIC{}, or \code{Null}.
+%
+\rationale{%
 An asynchronous non-generator always returns a future of some sort.
-If no expression is given, the future will be completed with the null object (\ref{null}) and this motivates the requirement above.
+If no expression is given, the future will be completed with the null object
+(\ref{null})
+which motivates this rule.%
 }
+% Returning with a value in an void async function only ok
+% when that value is async-"voidy".
+It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
+\flatten{T} is \VOID{},
+and \flatten{S} is neither \VOID{}, \DYNAMIC{}, nor \code{Null}.
+%
+% Returning async-void in a "non-async-voidy" function is an error.
+It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
+\flatten{T} is neither \VOID{}, \DYNAMIC{}, nor \code{Null},
+and \flatten{S} is \VOID{}.
+%
+% Otherwise, returning an un-deasync-assignable value is an error.
+It is a compile-time error if $s$ is \code{\RETURN{} $e$;},
+\flatten{S} is not \VOID,
+and \code{Future<\flatten{S}>} is not assignable to $T$.
 
-\commentary{
-Leaving the return type of a function marked \ASYNC{} blank will be interpreted as \DYNAMIC{} as always, and cause no type error.
+\commentary{%
+Note that \flatten{T} cannot be \VOID, \DYNAMIC, or \code{Null}
+in the last case,
+because then \code{Future<$U$>} is assignable to $T$ for \emph{all} $U$.
+In particular, when $T$ is \code{FutureOr<Null>}
+(which is equivalent to \code{Future<Null>}),
+\code{Future<\flatten{S}>} is assignable to $T$ for all $S$.
+This means that no compile-time error is raised,
+but \emph{only} the null object (\ref{null})
+or an instance of \code{Future<Null>} can successfully be returned at run time.
+This is not an anomaly,
+it corresponds to the treatment of a synchronous function
+with return type \code{Null};
+but tools may choose to give a hint that a downcast is unlikely to succeed.
+
+An error will not be raised if $f$ has no declared return type,
+since the return type would be \DYNAMIC,
+and \code{Future<\flatten{S}>} is assignable to \DYNAMIC{} for all $S$.
+However, an asynchronous non-generator function
+that declares a return type which is not ``voidy''
+must return an expression explicitly.%
 }
+\rationale{%
+This helps catch situations where users forget
+to return a value in a return statement of an asynchronous function.%
+}
+\EndCase
 
-\LMHash{}
+\LMHash{}%
+\Case{Generator functions}
+It is a compile-time error if a return statement of
+the form \code{\RETURN{} $e$;} appears in a generator function.
+
+\rationale{
+In the case of a generator function, the value returned by the function is
+the iterable or stream associated with it,
+and individual elements are added to that iterable using yield statements,
+and so returning a value makes no sense.
+}
+\EndCase
+
+\LMHash{}%
+\Case{Generative constructors}
+It is a compile-time error if a return statement of
+the form \code{\RETURN{} $e$;} appears in a generative constructor
+(\ref{generativeConstructors}).
+
+\rationale{
+It is quite easy to forget to add the \FACTORY{} modifier for a constructor,
+accidentally converting a factory into a generative constructor.
+The static checker may detect a type mismatch
+in some, but not all, of these cases.
+The rule above helps catch such errors,
+which can otherwise be very hard to recognize.
+There is no real downside to it,
+as returning a value from a generative constructor is meaningless.
+}
+\EndCase
+
+\LMHash{}%
 Executing a return statement \code{\RETURN{} $e$;} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First the expression $e$ is evaluated, producing an object $o$.
-Let $T$ be the run-time type of $o$ and
-let $S$ be the actual return type of $f$
+Let $S$ be the run-time type of $o$ and
+let $T$ be the actual return type of $f$
 (\ref{actualTypeOfADeclaration}).
 If the body of $f$ is marked \ASYNC{} (\ref{functions})
-and $T$ is a subtype of \code{Future<\flatten{S}>}
+and $S$ is a subtype of \code{Future<\flatten{T}>}
 then let $r$ be the result of evaluating \code{await $v$}
 where $v$ is a fresh variable bound to $o$.
 Otherwise let $r$ be $o$.
-Then the return statement returns the value $r$ (\ref{completion}).
+Then the return statement returns the value $r$ (\ref{statementCompletion}).
 
 %% TODO(eernst): We have some special cases with the dynamic semantics
 %% specified above that we may wish to consider:
@@ -9900,42 +11856,37 @@
 %%
 %% Object /* or dynamic, etc. */ foo() async {
 %%   Object o;
-%%   if (someCondition) o = 42; else o = new Future<T>.value(42);
+%%   if (someCondition) o = 42; else o = new Future<S>.value(42);
 %%   return o;
 %% }
 %%
 %% Here we will interject an `await` on the returned value whenever
-%% we return a future (for all `T`). This means that we will `await o`
+%% we return a future (for all `S`). This means that we will `await o`
 %% in some situations and not in others. It may surprise developers
 %% that we can have this dynamic variation at a location in the code
 %% where there is no static justification for expecting a future.
 
-\LMHash{}
+\LMHash{}%
 Let $U$ be the run-time type of $r$.
 \begin{itemize}
-\item If the body of $f$ is marked \ASYNC{} (\ref{functions})
-it is a dynamic type error if $o$ is not the null object (\ref{null}),
-% TODO(lrn): Remove the next line when void is a proper supertype of all types.
-$S$ is not \VOID,
-and \code{Future<$U$>} is not a subtype of $S$.
-\item Otherwise,
-it is a dynamic type error if $r$ is not the null object (\ref{null}),
-% TODO(lrn): Remove the next line when void is a proper supertype of all types.
-$S$ is not \VOID{},
-and $U$ is not a subtype of $S$.
+\item
+  If the body of $f$ is marked \ASYNC{} (\ref{functions})
+  it is a dynamic type error if \code{Future<$U$>} is not a subtype of $T$.
+\item
+  Otherwise, it is a dynamic type error if $U$ is not a subtype of $T$.
 \end{itemize}
 
-\LMHash{}
-Executing a return statement with no expression, \code{\RETURN;} returns with no value (\ref{completion}).
+\LMHash{}%
+Executing a return statement with no expression, \code{\RETURN;} returns with no value (\ref{statementCompletion}).
 
 
 \subsection{Labels}
 \LMLabel{labels}
 
-\LMHash{}
-A {\em label} is an identifier followed by a colon.
-A {\em labeled statement} is a statement prefixed by a label $L$.
-A {\em labeled case clause} is a case clause within a switch statement (\ref{switch}) prefixed by a label $L$.
+\LMHash{}%
+A \Index{label} is an identifier followed by a colon.
+A \Index{labeled statement} is a statement prefixed by a label $L$.
+A \Index{labeled case clause} is a case clause within a switch statement (\ref{switch}) prefixed by a label $L$.
 
 \rationale{
 The sole role of labels is to provide targets for the break (\ref{break}) and continue (\ref{continue}) statements.
@@ -9945,16 +11896,16 @@
 <label> ::= <identifier> `:'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Execution a labeled statement $s$, $label: s_l$, consists of executing $s_l$.
-If execution of $s_l$ breaks to the label $label$ (\ref{completion}),
+If execution of $s_l$ breaks to the label $label$ (\ref{statementCompletion}),
 then execution of $s$ completes normally,
 otherwise execution of $s$ completes in the same ways as the execution of $s_l$.
 
-\LMHash{}
+\LMHash{}%
 The namespace of labels is distinct from the one used for types, functions and variables.
 
-\LMHash{}
+\LMHash{}%
 The scope of a label that labels a statement $s$ is $s$.
 The scope of a label that labels a case clause of a switch statement $s$ is $s$.
 
@@ -9967,14 +11918,14 @@
 \subsection{Break}
 \LMLabel{break}
 
-\LMHash{}
-The {\em break statement} consists of the reserved word \BREAK{} and an optional label (\ref{labels}).
+\LMHash{}%
+The \Index{break statement} consists of the reserved word \BREAK{} and an optional label (\ref{labels}).
 
 \begin{grammar}
 <breakStatement> ::= \BREAK{} <identifier>? `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Let $s_b$ be a \BREAK{} statement.
 If $s_b$ is of the form \code{\BREAK{} $L$;},
 then it is a compile-time error if $s_b$ is not enclosed in a labeled statement
@@ -9985,22 +11936,22 @@
 \DO{} (\ref{do}), \FOR{} (\ref{for}), \SWITCH{} (\ref{switch})
 or \WHILE{} (\ref{while}) statement within the innermost function in which $s_b$ occurs.
 
-\LMHash{}
-Execution of a \BREAK{} statement \code{\BREAK{} $L$;} breaks to the label $L$ (\ref{completion}).
-Execution of a \BREAK{} statement \code{\BREAK{};} breaks without a label (\ref{completion}).
+\LMHash{}%
+Execution of a \BREAK{} statement \code{\BREAK{} $L$;} breaks to the label $L$ (\ref{statementCompletion}).
+Execution of a \BREAK{} statement \code{\BREAK{};} breaks without a label (\ref{statementCompletion}).
 
 
 \subsection{Continue}
 \LMLabel{continue}
 
-\LMHash{}
-The {\em continue statement} consists of the reserved word \CONTINUE{} and an optional label (\ref{labels}).
+\LMHash{}%
+The \Index{continue statement} consists of the reserved word \CONTINUE{} and an optional label (\ref{labels}).
 
 \begin{grammar}
 <continueStatement> ::= \CONTINUE{} <identifier>? `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Let $s_c$ be a \CONTINUE{} statement.
 If $s_c$ is of the form \code{\CONTINUE{} $L$;},
 then it is a compile-time error if $s_c$ is not enclosed in either an
@@ -10014,9 +11965,9 @@
 \DO{} (\ref{do}), \FOR{} (\ref{for}), or \WHILE{} (\ref{while}) statement
 within the innermost function in which $s_c$ occurs.
 
-\LMHash{}
-Execution of a \CONTINUE{} statement \code{\CONTINUE{} $L$;} continues to the label $L$ (\ref{completion}).
-Execution of a \CONTINUE{} statement \code{\CONTINUE{};} continues without a label (\ref{completion}).
+\LMHash{}%
+Execution of a \CONTINUE{} statement \code{\CONTINUE{} $L$;} continues to the label $L$ (\ref{statementCompletion}).
+Execution of a \CONTINUE{} statement \code{\CONTINUE{};} continues without a label (\ref{statementCompletion}).
 
 
 \subsection{Yield and Yield-Each}
@@ -10026,25 +11977,25 @@
 \subsubsection{Yield}
 \LMLabel{yield}
 
-\LMHash{}
-The {\em yield statement} adds an element to the result of a generator function (\ref{functions}).
+\LMHash{}%
+The \Index{yield statement} adds an element to the result of a generator function (\ref{functions}).
 
 \begin{grammar}
 <yieldStatement> ::= \YIELD{} <expression> `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Execution of a statement $s$ of the form \code{\YIELD{} $e$;} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First, the expression $e$ is evaluated to an object $o$.
 If the enclosing function $m$ is marked \code{\ASYNC*} (\ref{functions}) and the stream $u$ associated with $m$ has been paused, then the nearest enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused and execution of $m$ is suspended until $u$ is resumed or canceled.
 
-\LMHash{}
+\LMHash{}%
 Next, $o$ is added to the iterable or stream associated with the immediately enclosing function.
 
-\LMHash{}
-If the enclosing function $m$ is marked \code{\ASYNC*} and the stream $u$ associated with $m$ has been canceled, then the \YIELD{} statement returns without a value (\ref{completion}), otherwise it completes normally.
+\LMHash{}%
+If the enclosing function $m$ is marked \code{\ASYNC*} and the stream $u$ associated with $m$ has been canceled, then the \YIELD{} statement returns without a value (\ref{statementCompletion}), otherwise it completes normally.
 
 \rationale{
 The stream associated with an asynchronous generator could be canceled by any code with a reference to that stream at any point where the generator was passivated.
@@ -10052,7 +12003,7 @@
 At this point, the only plausible action for the generator is to clean up after itself via its \FINALLY{} clauses.
 }
 
-\LMHash{}
+\LMHash{}%
 Otherwise, if the enclosing function $m$ is marked \code{\ASYNC*} (\ref{functions}) then the enclosing function may suspend, in which case the nearest enclosing asynchronous for loop (\ref{asynchronousFor-in}), if any, is paused first.
 
 \rationale{
@@ -10065,7 +12016,7 @@
 The only requirement is that consumers are not blocked indefinitely.
 }
 
-\LMHash{}
+\LMHash{}%
 If the enclosing function $m$ is marked \code{\SYNC*} (\ref{functions}) then:
 \begin{itemize}
 \item
@@ -10074,10 +12025,10 @@
 The current call to \code{moveNext()} returns \TRUE.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a yield statement appears in a function that is not a generator function.
 
-\LMHash{}
+\LMHash{}%
 Let $T$ be the static type of $e$ and let $f$ be the immediately enclosing function.
 It is a compile-time error if either:
 \begin{itemize}
@@ -10091,20 +12042,20 @@
 \subsubsection{Yield-Each}
 \LMLabel{yieldEach}
 
-\LMHash{}
-The {\em yield-each statement} adds a series of values to the result of a generator function (\ref{functions}).
+\LMHash{}%
+The \Index{yield-each statement} adds a series of values to the result of a generator function (\ref{functions}).
 
 \begin{grammar}
 <yieldEachStatement> ::= \YIELD{} `*' <expression> `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Execution of a statement $s$ of the form \code{\YIELD* $e$;} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First, the expression $e$ is evaluated to an object $o$.
 
-\LMHash{}
+\LMHash{}%
 If the immediately enclosing function $m$ is marked \code{\SYNC*} (\ref{functions}), then:
 \begin{enumerate}
 \item It is a dynamic type error if the class of $o$ does not implement \code{Iterable}.
@@ -10114,14 +12065,14 @@
 If \code{moveNext} returns \FALSE{} execution of $s$ is complete.
 Otherwise
 \item The getter \code{current} is invoked on $i$.
-If the invocation throws (\ref{evaluation}), execution of $s$ throws the same exception object and stack trace (\ref{completion}).
+If the invocation throws (\ref{evaluation}), execution of $s$ throws the same exception object and stack trace (\ref{statementCompletion}).
 Otherwise, the result $x$ of the getter invocation is added to the iterable associated with $m$.
 Execution of the function $m$ immediately enclosing $s$ is suspended until the nullary method \code{moveNext()} is invoked upon the iterator used to initiate the current invocation of $m$, at which point execution of $s$ continues at \ref{moveNext}.
 \item
 The current call to \code{moveNext()} returns \TRUE.
 \end{enumerate}
 
-\LMHash{}
+\LMHash{}%
 If $m$ is marked \code{\ASYNC*} (\ref{functions}), then:
 \begin{itemize}
 \item It is a dynamic type error if the class of $o$ does not implement \code{Stream}.
@@ -10134,7 +12085,7 @@
 \item
 If the stream $u$ associated with $m$ has been canceled,
 then $s$ is canceled by evaluating \code{\AWAIT{} v.cancel()} where $v$ is a fresh variable referencing the stream subscription $s$.
-Then, if the cancel completed normally, the stream execution of $s$ returns without a value (\ref{completion}).
+Then, if the cancel completed normally, the stream execution of $s$ returns without a value (\ref{statementCompletion}).
 \item
 Otherwise, $x$, or $e$ with $t$, are added to the stream associated with $m$ in the order they appear in $o$.
 The function $m$ may suspend.
@@ -10142,10 +12093,10 @@
 \item If the stream $o$ is done, execution of $s$ completes normally.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a yield-each statement appears in a function that is not a generator function.
 
-\LMHash{}
+\LMHash{}%
 Let $T$ be the static type of $e$ and let $f$ be the immediately enclosing function.
 It is a compile-time error if $T$ may not be assigned to the declared return type of $f$.
 If $f$ is synchronous it is a compile-time error if $T$ may not be assigned to \code{Iterable}.
@@ -10155,8 +12106,8 @@
 \subsection{Assert}
 \LMLabel{assert}
 
-\LMHash{}
-An {\em assert statement} is used to disrupt normal execution if a given boolean condition does not hold.
+\LMHash{}%
+An \Index{assert statement} is used to disrupt normal execution if a given boolean condition does not hold.
 
 \begin{grammar}
 <assertStatement> ::= <assertion> `;'
@@ -10164,38 +12115,38 @@
 <assertion> ::= \ASSERT{} `(' <expression> (`,' <expression> )? `,'? `)'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 The grammar allows a trailing comma before the closing parenthesis,
 similarly to an argument list.
 That comma, if present, has no effect.
 An assertion with a trailing comma is equivalent to one with that comma removed.
 
-\LMHash{}
+\LMHash{}%
 An assertion of the form \code{\ASSERT($e$)} is equivalent to an assertion of the form \code{\ASSERT($e$, \NULL{})}.
 
-\LMHash{}
+\LMHash{}%
 Execution of an assert statement executes the assertion as described below
 and completes in the same way as the assertion.
 
-\LMHash{}
+\LMHash{}%
 When assertions are not enabled,
 execution of an assertion immediately completes normally
-(\ref{completion}).
+(\ref{statementCompletion}).
 \commentary{That is, no subexpressions of the assertion are evaluated.}
 When assertions are enabled,
 execution of an assertion \code{\ASSERT{}($c$, $e$)} proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 The expression $c$ is evaluated to an object $r$.
 It is a dynamic type error if $r$ is not of type \code{bool}.
 \commentary{
 Hence it is a compile-time error if that situation arises during evaluation of an assertion in a \CONST{} constructor invocation.
 }
-If $r$ is \TRUE{} then execution of the assert statement completes normally (\ref{completion}).
+If $r$ is \TRUE{} then execution of the assert statement completes normally (\ref{statementCompletion}).
 Otherwise, $e$ is evaluated to an object $m$
-and then the execution of the assert statement throws (\ref{completion}) an \code{AssertionError} containing $m$ and with a stack trace corresponding to the current execution state at the assertion.
+and then the execution of the assert statement throws (\ref{statementCompletion}) an \code{AssertionError} containing $m$ and with a stack trace corresponding to the current execution state at the assertion.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the type of $c$ may not be assigned to \code{bool}.
 
 \rationale{
@@ -10231,11 +12182,11 @@
 \section{Libraries and Scripts}
 \LMLabel{librariesAndScripts}
 
-\LMHash{}
-A Dart program consists of one or more libraries, and may be built out of one or more {\em compilation units}.
+\LMHash{}%
+A Dart program consists of one or more libraries, and may be built out of one or more \Index{compilation units}.
 A compilation unit may be a library or a part (\ref{parts}).
 
-\LMHash{}
+\LMHash{}%
 A library consists of (a possibly empty) set of imports, a set of exports, and a set of top-level declarations.
 A top-level declaration is either a class (\ref{classes}), a type alias declaration (\ref{typedef}), a function (\ref{functions}) or a variable declaration (\ref{variables}).
 The members of a library $L$ are those top level declarations given within $L$.
@@ -10248,15 +12199,16 @@
   \alt \EXTERNAL{}? <getterSignature> `;'
   \alt \EXTERNAL{}? <setterSignature> `;'
   \alt <functionSignature> <functionBody>
-  \alt <returnType>? \GET{} <identifier> <functionBody>
-  \alt <returnType>? \SET{} <identifier> <formalParameterList> <functionBody>
+  \alt <type>? \GET{} <identifier> <functionBody>
+  \alt <type>? \SET{} <identifier> <formalParameterList> <functionBody>
   \alt (\FINAL{} | \CONST{}) <type> <staticFinalDeclarationList> `;'
   \alt <variableDeclaration> `;'
 
 <getOrSet> ::= \GET{}
   \alt \SET{}
 
-<libraryDefinition> ::= <scriptTag>? <libraryName>? <importOrExport>* <partDirective>*
+<libraryDefinition> ::= \gnewline{}
+  <scriptTag>? <libraryName>? <importOrExport>* <partDirective>*
   \gnewline{} <topLevelDefinition>*
 
 <scriptTag> ::= `#!' (\~{}<NEWLINE>)* <NEWLINE>
@@ -10269,16 +12221,16 @@
 <dottedIdentifierList> ::= <identifier> (`.' <identifier>)*
 \end{grammar}
 
-\LMHash{}
-Libraries may be {\em explicitly named} or {\em implicitly named}.
-An explicitly named library begins with the word \LIBRARY{} (possibly prefaced with any applicable metadata annotations), followed by a qualified identifier that gives the name of the library.
+\LMHash{}%
+Libraries may be explicitly named or implicitly named.
+An \Index{explicitly named library} begins with the word \LIBRARY{} (possibly prefaced with any applicable metadata annotations), followed by a qualified identifier that gives the name of the library.
 
 \commentary{
 Technically, each dot and identifier is a separate token and so spaces between them are acceptable.
 However, the actual library name is the concatenation of the simple identifiers and dots and contains no spaces.
 }
 
-\LMHash{}
+\LMHash{}%
 An implicitly named library has the empty string as its name.
 
 \rationale{
@@ -10292,15 +12244,15 @@
 Each pub package is guaranteed a unique name, effectively enforcing a global namespace.
 }
 
-\LMHash{}
-A library may optionally begin with a {\em script tag}.
+\LMHash{}%
+A library may optionally begin with a \Index{script tag}.
 Script tags are intended for use with scripts (\ref{scripts}).
 A script tag can be used to identify the interpreter of the script to whatever computing environment the script is embedded in.
 The script tag must appear before any whitespace or comments.
 A script tag begins with \syntax{`#!'} and ends at the end of the line.
 Any characters that follow \syntax{`#!'} in the script tag are ignored by the Dart implementation.
 
-\LMHash{}
+\LMHash{}%
 Libraries are units of privacy.
 A private declaration declared within a library $L$ can only be accessed by code within $L$.
 Any attempt to access a private member declaration from outside $L$ will cause a method, getter or setter lookup failure.
@@ -10309,20 +12261,21 @@
 Since top level privates are not imported, using the top level privates of another library is never possible.
 }
 
-\LMHash{}
-The {\em public namespace} of library $L$ is the mapping that maps the simple name of each public top-level member $m$ of $L$ to $m$.
+\LMHash{}%
+The \Index{public namespace} of library $L$ is the mapping that maps the simple name of each public top-level member $m$ of $L$ to $m$.
 The scope of a library $L$ consists of the names introduced by all top-level declarations declared in $L$, and the names added by $L$'s imports (\ref{imports}).
 
 
 \subsection{Imports}
 \LMLabel{imports}
 
-\LMHash{}
-An {\em import} specifies a library to be used in the scope of another library.
+\LMHash{}%
+An \Index{import} specifies a library to be used in the scope of another library.
 \begin{grammar}
 <libraryImport> ::= <metadata> <importSpecification>
 
-<importSpecification> ::= \IMPORT{} <configurableUri> (\AS{} <identifier>)? <combinator>* `;'
+<importSpecification> ::= \gnewline{}
+  \IMPORT{} <configurableUri> (\AS{} <identifier>)? <combinator>* `;'
   \alt \IMPORT{} <uri> \DEFERRED{} \AS{} <identifier> <combinator>* `;'
 
 <combinator> ::= \SHOW{} <identifierList>
@@ -10331,19 +12284,21 @@
 <identifierList> ::= <identifier> (, <identifier>)*
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 An import specifies a URI $x$ where the declaration of an imported library is to be found.
 
-\LMHash{}
-Imports may be {\em deferred} or {\em immediate}.
+\LMHash{}%
+Imports may be
+\IndexCustom{deferred}{import!deferred} or
+\IndexCustom{immediate}{import!immediate}.
 A deferred import is distinguished by the appearance of the built-in identifier \DEFERRED{} after the URI.
 Any import that is not deferred is immediate.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the specified URI of an immediate import does not refer to a library declaration.
 The interpretation of URIs is described in section \ref{uris} below.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the specified URI of a deferred import does not refer to a library declaration.
 
 \rationale{
@@ -10351,26 +12306,28 @@
 However the development environment should detect the problem.
 }
 
-\LMHash{}
-The {\em current library} is the library currently being compiled.
+\LMHash{}%
+The \Index{current library} is the library currently being compiled.
 The import modifies the namespace of the current library in a manner that is determined by the imported library and by the optional elements of the import.
 
-\LMHash{}
+\LMHash{}%
 An immediate import directive $I$ may optionally include a prefix clause of the form \code{\AS{} \id} used to prefix names imported by $I$.
 A deferred import must include a prefix clause or a compile-time error occurs.
 It is a compile-time error if a prefix used in a deferred import is used in another import clause.
 
-\LMHash{}
+\LMHash{}%
 An import directive $I$ may optionally include a namespace combinator clauses used to restrict the set of names imported by $I$.
 Currently, two namespace combinators are supported: \HIDE{} and \SHOW{}.
 
-\LMHash{}
+\LMHash{}%
 Let $I$ be an import directive that refers to a URI via the string $s_1$.
 Evaluation of $I$ proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 If $I$ is a deferred import, no evaluation takes place.
-Instead, a mapping of the name of the prefix, $p$ to a {\em deferred prefix object} is added to the scope of the current library $L$.
+Instead, a mapping of the name of the prefix, $p$ to a
+\Index{deferred prefix object} is added to
+the scope of the current library $L$.
 The deferred prefix object has the following methods:
 
 \begin{itemize}
@@ -10397,13 +12354,13 @@
 
 The static type of the prefix object $p$ is a unique interface type that has those members whose names and signatures are listed above.
 
-\LMHash{}
+\LMHash{}%
 After a call succeeds, the name $p$ is mapped to a non-deferred prefix object as described below.
 In addition, the prefix object also supports the \code{loadLibrary} method, and so it is possible to call \code{loadLibrary} again.
 If a call fails, nothing happens, and one again has the option to call \code{loadLibrary} again.
 Whether a repeated call to \code{loadLibrary} succeeds will vary as described below.
 
-\LMHash{}
+\LMHash{}%
 The effect of a repeated call to \code{$p$.loadLibrary} is as follows:
 \begin{itemize}
 \item
@@ -10425,7 +12382,7 @@
 We do not specify what value the future returned resolves to.
 }
 
-\LMHash{}
+\LMHash{}%
 If $I$ is an immediate import then, first
 
 \begin{itemize}
@@ -10437,7 +12394,7 @@
 \item Otherwise, the contents of the URI denoted by $s_1$ have been compiled into a library $B$ within the current isolate.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Let $NS_0$ be the exported namespace (\ref{exports}) of $B$.
 Then, for each combinator clause $C_i, i \in 1 .. n$ in $I$:
 \begin{itemize}
@@ -10460,8 +12417,8 @@
 where $hide(l, n)$ takes a list of identifiers $l$ and a namespace $n$, and produces a namespace that is identical to $n$ except that for each name $k$ in $l$, $k$ and \code{$k$=} are undefined.
 \end{itemize}
 
-\LMHash{}
-Next, if $I$ includes a prefix clause of the form \AS{} $p$, let $NS = NS_n \cup \{p: prefixObject(NS_n)\}$ where $prefixObject(NS_n)$ is a {\em prefix object} for the namespace $NS_n$, which is an object that has the following members:
+\LMHash{}%
+Next, if $I$ includes a prefix clause of the form \AS{} $p$, let $NS = NS_n \cup \{p: prefixObject(NS_n)\}$ where $prefixObject(NS_n)$ is a \Index{prefix object} for the namespace $NS_n$, which is an object that has the following members:
 
 \begin{itemize}
 \item For every top level function $f$ named \id{} in $NS_n$, a corresponding method with the same name and signature as $f$ that forwards (\ref{functionDeclarations}) to $f$.
@@ -10470,7 +12427,7 @@
 \item For every type $T$ named \id{} in $NS_n$, a corresponding getter named \id{} with return type \code{Type}, that, when invoked, returns the type object for $T$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Otherwise, let $NS = NS_n$.
 It is a compile-time error if the current library declares a top-level member named $p$.
 
@@ -10480,7 +12437,7 @@
 % This is problematic, because it implies that p.T would be available even in a scope that declared p. We really need to think of p as a single object with properties p.T etc., except it isn't really that
 % either. After all, p isn't actually available as a stand alone name.
 
-\LMHash{}
+\LMHash{}%
 Then, for each entry mapping key $k$ to declaration $d$ in $NS$, $d$ is made available in the top level scope of $L$ under the name $k$ unless either:
 \begin{itemize}
 \item
@@ -10492,9 +12449,9 @@
 The greatly increases the chance that a member can be added to a library without breaking its importers.
 }
 
-\LMHash{}
-A {\em system library} is a library that is part of the Dart implementation.
-Any other library is a {\em non-system library}.
+\LMHash{}%
+A \Index{system library} is a library that is part of the Dart implementation.
+Any other library is a \Index{non-system library}.
 
 If a name $N$ is referenced by a library $L$
 and $N$ would be introduced into the top level scope of $L$
@@ -10513,13 +12470,14 @@
 It is recommended that tools that deploy Dart code produce output in which all imports use show clauses to ensure that additions to the namespace of a library never impact deployed code.
 }
 
-\LMHash{}
+\LMHash{}%
 If a name $N$ is referenced by a library $L$ and $N$ is introduced into the top level scope of $L$ by more than one import
 and not all the imports denote the same declaration,
 a compile-time error occurs.
 
-\LMHash{}
-We say that the namespace $NS$ {\em has been imported into} $L$.
+\LMHash{}%
+We say that the namespace $NS$
+\IndexCustom{has been imported into}{namespace!imported} $L$.
 
 \commentary{
 It is not an error if $N$ is introduced by two or more imports but never referred to.
@@ -10538,8 +12496,8 @@
 %On a related note, the provenance of the conflicting elements is not considered. An element that is imported via distinct paths may conflict with itself. This avoids variants of the well known "diamond" problem.
 }
 
-\LMHash{}
-It is a compile-time warning to import two different libraries with the same name unless their name is the empty string.
+\LMHash{}%
+It is a static warning to import two different libraries with the same name unless their name is the empty string.
 
 \commentary{
 A widely disseminated library should be given a name that will not conflict with other such libraries.
@@ -10553,7 +12511,7 @@
 This prevents situations where removing a name from a library would cause breakage of a client library.
 }
 
-\LMHash{}
+\LMHash{}%
 The dart core library \code{dart:core} is implicitly imported into every dart library other than itself via an import clause of the form
 
 \code{\IMPORT{} `dart:core';}
@@ -10576,31 +12534,38 @@
 \subsection{Exports}
 \LMLabel{exports}
 
-\LMHash{}
+\LMHash{}%
 A library $L$ exports a namespace (\ref{scoping}), meaning that the declarations in the namespace are made available to other libraries if they choose to import $L$ (\ref{imports}).
-The namespace that $L$ exports is known as its {\em exported namespace}.
+The namespace that $L$ exports is known as its
+\IndexCustom{exported namespace}{namespace!exported}.
 
 \begin{grammar}
 <libraryExport> ::= <metadata> \EXPORT{} <configurableUri> <combinator>* `;'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 An export specifies a URI $x$ where the declaration of an exported library is to be found.
 It is a compile-time error if the specified URI does not refer to a library declaration.
 
-\LMHash{}
-We say that a name {\em is exported by a library} (or equivalently, that a library {\em exports a name}) if the name is in the library's exported namespace.
-We say that a declaration {\em is exported by a library} (or equivalently, that a library {\em exports a declaration}) if the declaration is in the library's exported namespace.
+\LMHash{}%
+We say that a name is \Index{exported by a library}
+(or equivalently, that a library
+\IndexCustom{exports a name}{exports!name})
+if the name is in the library's exported namespace.
+We say that a declaration \Index{is exported by a library}
+(or equivalently, that a library
+\IndexCustom{exports a declaration}{exports!declaration})
+if the declaration is in the library's exported namespace.
 
-\LMHash{}
+\LMHash{}%
 A library always exports all names and all declarations in its public namespace.
-In addition, a library may choose to re-export additional libraries via {\em export directives}, often referred to simply as {\em exports}.
+In addition, a library may choose to re-export additional libraries via \Index{export directives}, often referred to simply as \Index{exports}.
 
-\LMHash{}
+\LMHash{}%
 Let $E$ be an export directive that refers to a URI via the string $s_1$.
 Evaluation of $E$ proceeds as follows:
 
-\LMHash{}
+\LMHash{}%
 First,
 
 \begin{itemize}
@@ -10609,7 +12574,7 @@
 \item Otherwise, the contents of the URI denoted by $s_1$ have been compiled into a library $B$ within the current isolate.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Let $NS_0$ be the exported namespace of $B$.
 Then, for each combinator clause $C_i, i \in 1 .. n$ in $E$:
 \begin{itemize}
@@ -10621,11 +12586,11 @@
 then let $NS_i = \HIDE{}([\id_1, \ldots,\ \id_k], NS_{i-1}$).
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 For each
 entry mapping key $k$ to declaration $d$ in $NS_n$ an entry mapping $k$ to $d$ is added to the exported namespace of $L$ unless a top-level declaration with the name $k$ exists in $L$.
 
-\LMHash{}
+\LMHash{}%
 If a name $N$ is not declared by a library $L$
 and $N$ would be introduced into the exported namespace of $L$
 by exports of two libraries, $L_1$ and $L_2$,
@@ -10638,11 +12603,14 @@
 See the discussion in section \ref{imports} for the reasoning behind this rule.
 }
 
-\LMHash{}
-We say that $L$ {\em re-exports library } $B$, and also that $L$ {\em re-exports namespace } $NS_n$.
-When no confusion can arise, we may simply state that $L$ {\em re-exports }$B$, or that $L$ {\em re-exports }$NS_n$.
+\LMHash{}%
+We say that $L$ \Index{re-exports library} $B$, and also
+that $L$ \Index{re-exports namespace} $NS_n$.
+When no confusion can arise, we may simply state
+that $L$ \NoIndex{re-exports} $B$, or
+that $L$ \NoIndex{re-exports} $NS_n$.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a name $N$ is re-exported by a library $L$ and $N$ is introduced into the export namespace of $L$ by more than one export, unless all exports refer to same declaration for the name $N$.
 It is a compile-time error to export two different libraries with the same name unless their name is the empty string.
 
@@ -10650,12 +12618,12 @@
 \subsection{Parts}
 \LMLabel{parts}
 
-\LMHash{}
-A library may be divided into {\em parts}, each of which can be stored in a separate location.
+\LMHash{}%
+A library may be divided into \Index{parts}, each of which can be stored in a separate location.
 A library identifies its parts by listing them via \PART{} directives.
 
-\LMHash{}
-A {\em part directive} specifies a URI where a Dart compilation unit that should be incorporated into the current library may be found.
+\LMHash{}%
+A \Index{part directive} specifies a URI where a Dart compilation unit that should be incorporated into the current library may be found.
 
 \begin{grammar}
 <partDirective> ::= <metadata> \PART{} <uri> `;'
@@ -10665,29 +12633,29 @@
 <partDeclaration> ::= <partHeader> <topLevelDefinition>* <EOF>
 \end{grammar}
 
-\LMHash{}
-A {\em part header} begins with \PART{} \OF{} followed by the name of the library the part belongs to.
+\LMHash{}%
+A \Index{part header} begins with \PART{} \OF{} followed by the name of the library the part belongs to.
 A part declaration consists of a part header followed by a sequence of top-level declarations.
 
-\LMHash{}
+\LMHash{}%
 Compiling a part directive of the form \code{\PART{} $s$;} causes the Dart system to attempt to compile the contents of the URI that is the value of $s$.
 The top-level declarations at that URI are then compiled by the Dart compiler in the scope of the current library.
 It is a compile-time error if the contents of the URI are not a valid part declaration.
 It is a compile-time error if the referenced part declaration $p$ names a library other than the current library as the library to which $p$ belongs.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a library contains
 two part directives with the same URI.
 
-\LMHash{}
-We say that a library $L_1$ is {\em reachable from} a library $L$ if
+\LMHash{}%
+We say that a library $L_1$ is \Index{reachable from} a library $L$ if
 any of the following is true (\ref{imports}, \ref{exports}):
 \begin{itemize}
 \item $L$ and $L_1$ is the same library.
 \item $L$ imports or exports a library $L_2$, and $L_1$ is reachable from $L_2$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Let $L$ be a library, let $u$ be a URI,
 and let $L_1$ and $L_2$ be distinct libraries which are reachable from $L$.
 It is a compile-time error if $L_1$ and $L_2$ both contain
@@ -10706,14 +12674,14 @@
 \subsection{Scripts}
 \LMLabel{scripts}
 
-\LMHash{}
-A {\em script} is a library whose exported namespace (\ref{exports}) includes
+\LMHash{}%
+A \Index{script} is a library whose exported namespace (\ref{exports}) includes
 a top-level function declaration named \code{main}
 that has either zero, one or two required arguments.
 
 A script $S$ is executed as follows:
 
-\LMHash{}
+\LMHash{}%
 First, $S$ is compiled as a library as specified above.
 Then, the top-level function defined by \code{main}
 in the exported namespace of $S$ is invoked (\ref{functionInvocation})
@@ -10742,7 +12710,7 @@
 A Dart program will typically be executed by executing a script.
 }
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if a library's export scope contains a declaration
 named \code{main}, and the library is not a script.
 \commentary{This restriction ensures that all top-level \code{main} declarations
@@ -10757,7 +12725,7 @@
 \subsection{URIs}
 \LMLabel{uris}
 
-\LMHash{}
+\LMHash{}%
 URIs are specified by means of string literals:
 
 \begin{grammar}
@@ -10770,13 +12738,16 @@
 <uriTest> ::= <dottedIdentifierList> (`==' <stringLiteral>)?
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if the string literal $x$ that describes a URI contains a string interpolation.
 
-\LMHash{}
-It is a compile-time error if the string literal $x$ that is used in a {\em uriTest} is not a constant expression, or if $x$ involves string interpolation.
+\LMHash{}%
+It is a compile-time error if the string literal $x$ that is used in a \synt{uriTest} is not a constant expression, or if $x$ involves string interpolation.
 
-\LMHash{} A {\em configurable URI} $c$ of the form \code{\metavar{uri} $\metavar{configurationUri}_1$ \ldots $\metavar{configurationUri}_n$} {\em specifies a URI} as follows:
+\LMHash{}%
+A \Index{configurable URI} $c$ of the form
+\code{\metavar{uri} $\metavar{configurationUri}_1$ \ldots $\metavar{configurationUri}_n$}
+\IndexCustom{specifies a URI}{specify a URI} as follows:
 \begin{itemize}
 \item{} Let $u$ be \metavar{uri}.
 \item{} For each of the following configuration URIs of the form \code{\IF{} ($\metavar{test}_i$) $\metavar{uri}_i$}, in source order, do the following.
@@ -10787,7 +12758,8 @@
   then create a string, \metavar{key}, from \metavar{ids}
   by concatenating the identfiers and dots,
   omitting any spaces between them that may occur in the source.
-  \item{} Look up \metavar{key} in the available compilation {\em environment}.
+  \item{} Look up \metavar{key} in the available
+  \Index{compilation environment}.
   \commentary{
   The compilation environment is provided by the platform.
   It maps some string keys to string values,
@@ -10805,7 +12777,7 @@
 \item{} The URI specified by $c$ is $u$.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 This specification does not discuss the interpretation of URIs, with the following exceptions.
 
 \rationale{
@@ -10814,17 +12786,17 @@
 While it might seem attractive to specify, say, that URIs are interpreted with respect to a standard such as IETF RFC 3986, in practice this will usually depend on the browser and cannot be relied upon.
 }
 
-\LMHash{}
+\LMHash{}%
 A URI of the form \code{dart:$s$} is interpreted as a reference to a system library (\ref{imports}) $s$.
 
-\LMHash{}
+\LMHash{}%
 A URI of the form \code{package:$s$} is interpreted in an implementation specific manner.
 
 \rationale{
 The intent is that, during development, Dart programmers can rely on a package manager to find elements of their program.
 }
 
-\LMHash{}
+\LMHash{}%
 Otherwise, any relative URI is interpreted as relative to the location of the current library.
 All further interpretation of URIs is implementation dependent.
 
@@ -10836,7 +12808,7 @@
 \section{Types}
 \LMLabel{types}
 
-\LMHash{}
+\LMHash{}%
 Dart supports optional typing based on interface types.
 
 \rationale{
@@ -10850,36 +12822,103 @@
 \subsection{Static Types}
 \LMLabel{staticTypes}
 
-\LMHash{}
-Type annotations are used in variable declarations (\ref{variables}) (including formal parameters (\ref{formalParameters})), in the return types of functions (\ref{functions}) and in the bounds of type variables.
+\LMHash{}%
+Type annotations can occur in variable declarations (\ref{variables}),
+including formal parameters (\ref{formalParameters}),
+in the return types of functions (\ref{functions}),
+and in the bounds of type variables (\ref{generics}).
 Type annotations are used during static checking and when running programs.
+Types are specified using the following grammar rules.
+
+%% TODO(eernst): The following non-terminal is currently undefined (it will
+%% be defined when more rules are transferred from Dart.g): <typeIdentifier>.
+%% The precise rules are slightly different than the following sentence, but
+%% we should be able to make do with that for now.
+\LMHash{}%
+In the grammar rules below, \synt{typeIdentifier} denotes an identifier which can be
+the name of a type, that is, it denotes an \synt{IDENTIFIER} which is not a
+\synt{BUILT\_IN\_IDENTIFIER}.
+
+%% TODO(eernst): The following non-terminals are currently unused (they will
+%% be used when we transfer more grammar rules from Dart.g): <typeNotVoid>
+%% and <typeNotVoidNotFunctionList>. They are used in the syntax for
+%% \EXTENDS{}, \WITH{}, \IMPLEMENTS{} syntax and for mixin applications
+%% in Dart.g, and it seems likely that we will use them here as well.
+
+\commentary{
+Non-terminals with names of the form \synt{\ldots{}NotFunction}
+derive terms which are types that are not function types.
+Note that it \emph{does} derive the type \FUNCTION{},
+which is not itself a function type,
+but it is the least upper bound of all function types.
+}
 
 \begin{grammar}
-<type> ::= <typeName> <typeArguments>?
+<type> ::= <functionTypeTails>
+  \alt <typeNotFunction> <functionTypeTails>
+  \alt <typeNotFunction>
 
-<typeName> ::= <qualified>
+<typeNotFunction> ::= <typeNotVoidNotFunction>
+  \alt \VOID{}
+
+<typeNotVoidNotFunction> ::= <typeName> <typeArguments>?
+  \alt \FUNCTION{}
+
+<typeName> ::= <typeIdentifier> (`.' <typeIdentifier>)?
 
 <typeArguments> ::= `<' <typeList> `>'
 
 <typeList> ::= <type> (`,' <type>)*
+
+<typeNotVoidNotFunctionList> ::=
+  <typeNotVoidNotFunction> (`,' <typeNotVoidNotFunction>)*
+
+<typeNotVoid> ::= <functionType>
+  \alt <typeNotVoidNotFunction>
+
+<functionType> ::= <functionTypeTails>
+  \alt <typeNotFunction> <functionTypeTails>
+
+<functionTypeTails> ::= <functionTypeTail> <functionTypeTails>
+  \alt <functionTypeTail>
+
+<functionTypeTail> ::= \FUNCTION{} <typeParameters>? <parameterTypeList>
+
+<parameterTypeList> ::= `(' `)'
+  \alt `(' <normalParameterTypes> `,' <optionalParameterTypes> `)'
+  \alt `(' <normalParameterTypes> `,'? `)'
+  \alt `(' <optionalParameterTypes> `)'
+
+<normalParameterTypes> ::= <normalParameterType> (`,' <normalParameterType>)*
+
+<normalParameterType> ::= <typedIdentifier>
+  \alt <type>
+
+<optionalParameterTypes> ::= <optionalPositionalParameterTypes>
+  \alt <namedParameterTypes>
+
+<optionalPositionalParameterTypes> ::= `[' <normalParameterTypes> `,'? `]'
+
+<namedParameterTypes> ::=
+  `\{' <typedIdentifier> (`,' <typedIdentifier>)* `,'? `\}'
+
+<typedIdentifier> ::= <type> <identifier>
 \end{grammar}
 
-\LMHash{}
-A Dart implementation must provide a static checker that detects and reports exactly those situations this specification identifies as compile-time errors,
+\LMHash{}%
+A Dart implementation must provide a static checker that detects and reports
+exactly those situations this specification identifies as compile-time errors,
 and only those situations.
-However:
-\begin{itemize}
-\item Running the static checker on a program $P$ is not required for compiling and running $P$.
-\item Running the static checker on a program $P$ must not prevent successful compilation of $P$ nor may it prevent the execution of $P$, regardless of whether any compile-time errors occur.
-\end{itemize}
+Similarly, the static checker must emit static warnings
+for at least the situations specified as such in this specification.
 
 \commentary{
 Nothing precludes additional tools that implement alternative static analyses (e.g., interpreting the existing type annotations in a sound manner such as either non-variant generics, or inferring declaration based variance from the actual declarations).
 However, using these tools must not preclude successful compilation and execution of Dart code.
 }
 
-\LMHash{}
-A type $T$ is {\em malformed} if{}f:
+\LMHash{}%
+A type $T$ is \Index{malformed} if{}f:
 \begin{itemize}
 \item
   $T$ has the form \id{} or the form \code{\metavar{prefix}.\id},
@@ -10918,7 +12957,7 @@
   $T$ denotes declarations that were imported from multiple imports clauses.
 \end{itemize}
 
-\LMHash{}
+\LMHash{}%
 Any use of a malformed type gives rise to a compile-time error.
 A malformed type is then interpreted as \DYNAMIC{} by the static type checker unless explicitly specified otherwise.
 
@@ -10926,8 +12965,9 @@
 This ensures that the developer is spared a series of cascading errors as the malformed type interacts with other types.
 }
 
-\LMHash{}
-A type $T$ is {\em deferred} if{}f it is of the form $p.T$ where $p$ is a deferred prefix.
+\LMHash{}%
+A type $T$ is \IndexCustom{deferred}{type!deferred}
+if{}f it is of the form $p.T$ where $p$ is a deferred prefix.
 It is a compile-time error to use a deferred type in a type annotation, type test, type cast or as a type parameter.
 However, all other compile-time errors must be issued under the assumption that all deferred libraries have successfully been loaded.
 
@@ -10937,16 +12977,16 @@
 \subsubsection{Type Promotion}
 \LMLabel{typePromotion}
 
-\LMHash{}
+\LMHash{}%
 The static type system ascribes a static type to every expression.
 In some cases, the type of a local variable (\commentary{which can be a formal parameter})
 may be promoted from the declared type, based on control flow.
 
-\LMHash{}
+\LMHash{}%
 We say that a variable $v$ is known to have type $T$ whenever we allow the type of $v$ to be promoted.
 The exact circumstances when type promotion is allowed are given in the relevant sections of the specification (\ref{logicalBooleanExpressions}, \ref{conditional} and \ref{if}).
 
-\LMHash{}
+\LMHash{}%
 Type promotion for a variable $v$ is allowed only when we can deduce that such promotion is valid based on an analysis of certain boolean expressions.
 In such cases, we say that the boolean expression $b$ shows that $v$ has type $T$.
 As a rule, for all variables $v$ and types $T$, a boolean expression does not show that $v$ has type $T$.
@@ -10961,9 +13001,9 @@
 % that the dynamic type of an instance is a non-generic class or
 % a generic instantiation of a generic class.
 
-\LMHash{}
+\LMHash{}%
 Let $o$ be an instance.
-The {\em dynamic type} of $o$ is the class which is specified
+The \Index{dynamic type} of $o$ is the class which is specified
 for the situation where $o$ was obtained as a fresh instance
 (\ref{redirectingFactoryConstructors},
 \ref{lists}, \ref{maps}, \ref{new}, \ref{functionInvocation}).
@@ -10976,7 +13016,7 @@
 except of course that said subtype requirement must be satisfied.
 }
 
-\LMHash{}
+\LMHash{}%
 The dynamic types of a running Dart program are equivalent to
 the static types with regard to subtyping.
 
@@ -11004,7 +13044,7 @@
 (\ref{actualTypeOfADeclaration}).
 }
 
-\LMHash{}
+\LMHash{}%
 When types are reified as instances of the built-in class \code{Type},
 those objects override the \code{==} operator
 inherited from the \code{Object} class, so that
@@ -11023,163 +13063,834 @@
 }
 
 \begin{dartCode}
-\TYPEDEF{} F = void Function<X>(X);
-\TYPEDEF{} G = void Function<Y>(Y);
+\TYPEDEF{} F = \VOID{} \FUNCTION{}<X>(X);
+\TYPEDEF{} G = \VOID{} \FUNCTION{}<Y>(Y);
 \\
 \VOID{} main() \{
   assert(F == G);
 \}
 \end{dartCode}
 
+\LMHash{}%
+\commentary{
+Instances of \code{Type} can be obtained in various ways,
+for example by using reflection,
+by reading the \code{runtimeType} of an object,
+or by evaluating a \emph{type literal} expression.
+}
 
-\subsection{Type Declarations}
-\LMLabel{typeDeclarations}
+\LMHash{}%
+An expression is a \emph{type literal} if it is an identifier,
+or a qualified identifier,
+which denotes a class, mixin or type alias declaration, or it is
+an identifier denoting a type parameter of a generic class or function.
+It is a \emph{constant type literal} if it does not denote a type parameter,
+and it is not qualified by a deferred prefix.
+\commentary{
+A constant type literal is a constant expression (\ref{constants}).
+}
 
-
-\subsubsection{Typedef}
+\subsection{Type Aliases}
 \LMLabel{typedef}
 
-\LMHash{}
-A {\em type alias} declares a name for a type expression.
+\LMHash{}%
+A \Index{type alias} declares a name for a type expression.
+
+\commentary{
+It is common to use the phrase ``a typedef'' for such a declaration,
+because of the prominent occurrence of the token \TYPEDEF.
+}
+
+% TODO(eernst): We include <metadata> in <typeAlias> even though it is not
+% there in Dart.g, because <libraryDefinition> in Dart.g allows metadata
+% before every <topLevelDefinition>, but that's not yet been transferred to
+% this document. So we'll need to remove the <metadata> below _when_ it is
+% made redundant by changing <libraryDefinition> to be like in Dart.g.
 
 \begin{grammar}
-<typeAlias> ::= <metadata> \TYPEDEF{} <typeAliasBody>
+<typeAlias> ::=
+  <metadata> \TYPEDEF{} <typeIdentifier> <typeParameters>? `=' <type> `;'
+  \alt <metadata> \TYPEDEF{} <functionTypeAlias>
 
-<typeAliasBody> ::= <functionTypeAlias>
+<functionTypeAlias> ::= <functionPrefix> <formalParameterPart> `;'
 
-<functionTypeAlias> ::= <functionPrefix> <typeParameters>? <formalParameterList> `;'
-
-<functionPrefix> ::= <returnType>? <identifier>
+<functionPrefix> ::= <type>? <identifier>
 \end{grammar}
 
-% TODO(eernst): Introduce new type aliases and new function type syntax, then
-% include support for generic functions here.
+\LMHash{}%
+The effect of a type alias of the form
+\code{\TYPEDEF{} \id{} = $T$;}
+declared in a library $L$ is to introduce the name \id{} into the scope of $L$,
+bound to the type $T$.
 
-\LMHash{}
+\LMHash{}%
 The effect of a type alias of the form
 
-\code{\TYPEDEF{} $T$ \id($T_1\ p_1, \ldots,\ T_n\ p_n,\ [T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}]$)}
+\noindent
+\code{\TYPEDEF{} $T$ \id($T_1\ p_1, \ldots,\ T_n\ p_n,\ [T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}]$);}
 
 \noindent
 declared in a library $L$ is to introduce the name \id{} into the scope of $L$, bound to the function type
-$(T_1, \ldots,\ T_n, [T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k} p_{n+k}]) \rightarrow T$.
+\FunctionTypeSimple{T}{\List{T}{1}{n},\ [\List{T}{n+1}{n+k}]}.
+
+\LMHash{}%
 The effect of a type alias of the form
 
-\code{\TYPEDEF{} $T$ \id($T_1\ p_1, \ldots,\ T_n\ p_n,\ \{T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}\}$)}
+\noindent
+\code{\TYPEDEF{} $T$ \id($T_1\ p_1, \ldots,\ T_n\ p_n,\ \{T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}\}$);}
 
 \noindent
 declared in a library $L$ is to introduce the name \id{} into the scope of $L$, bound to the function type
-$(T_1, \ldots,\ T_n, \{T_{n+1}\ p_{n+1}, \ldots,\ T_{n+k}\ p_{n+k}\}) \rightarrow T$.
+\FunctionTypeSimple{T}{\List{T}{1}{n},\ \{\PairList{T}{p}{n+1}{n+k}\}}.
+
+\LMHash{}%
 In either case, if{}f no return type is specified, it is taken to be \DYNAMIC{}.
 Likewise, if a type annotation is omitted on a formal parameter, it is taken to be \DYNAMIC{}.
 
-\LMHash{}
-It is a compile-time error if any default values are specified in the signature of a function type alias.
+\LMHash{}%
+It is a compile-time error if any default values are specified
+in the signature of a function type in a type alias.
 %A typedef may only refer to itself via the bounds of its generic parameters.
-Any self reference in a typedef, either directly, or recursively via another typedef, is a compile-time error.
-%via a chain of references that does not include a class declaration.
-
-
-\subsection{Interface Types}
-\LMLabel{interfaceTypes}
-
-\LMHash{}
-The implicit interface of class $I$ is a direct supertype of the implicit interface of class $J$ if{}f:
-\begin{itemize}
-\item $I$ is \code{Object}, and $J$ has no \EXTENDS{} clause.
-\item $I$ is listed in the \EXTENDS{} clause of $J$.
-\item $I$ is listed in the \IMPLEMENTS{} clause of $J$.
-\item $I$ is listed in the \WITH{} clause of $J$.
-\item $J$ is a mixin application (\ref{mixinApplication}) of the mixin of $I$.
-\end{itemize}
-
-\LMHash{}
-A type $T$ is more specific than a type $S$, written $T << S$, if one of the following conditions is met:
-\begin{itemize}
-\item $T$ is $S$.
-\item $T$ is $\bot$.
-\item $T$ is \code{Null} and $S$ is not $\bot$.
-\item $S$ is \DYNAMIC{}.
-\item $S$ is a direct supertype of $T$.
-\item $T$ is a type parameter and $S$ is the upper bound of $T$.
-\item $T$ is a type parameter and $S$ is \code{Object}.
-\item $T$ is of the form \code{$I$<$T_1, \ldots,\ T_n$>} and $S$ is of the form \code{$I$<$S_1, \ldots,\ S_n$>} and:
-$T_i << S_i, 1 \le i \le n$
-\item $T$ and $S$ are both function types, and $T << S$ under the rules of section \ref{functionTypes}.
-\item $T$ is a function type and $S$ is \FUNCTION{}.
-\item $T << U$ and $U << S$.
-\end{itemize}
-
-\LMHash{}
-$<<$ is a partial order on types.
-$T$ is a subtype of $S$, written $T <: S$, if{}f $[\bot/\DYNAMIC{}]T << S$.
-
-\rationale{
-Note that $<:$ is not a partial order on types, it is only binary relation on types.
-This is because $<:$ is not transitive.
-If it was, the subtype rule would have a cycle.
-For example:
-\code{List $<:$ List<String>} and
-\code{List<int> $<:$ List}, but
-\code{List<int>} is not a subtype of \code{List<String>}.
-Although $<:$ is not a partial order on types, it does contain a partial order, namely $<<$.
-This means that, barring raw types, intuition about classical subtype rules does apply.
-}
+Any self reference in a type alias,
+either directly or recursively via another type declaration,
+is a compile-time error.
 
 \commentary{
-The \code{Null} type is more specific than all non-$\bot$ types, even though
-it doesn't actually extend or implement those types.
-The other types are effectively treated as if they are {\em nullable},
+This kind of error may also arise when type arguments have been
+omitted in the program, but are added during static analysis
+via instantiation to bound
+(\ref{instantiationToBound})
+or via type inference
+(\commentary{which will be specified later (\ref{overview})}).
+}
+
+\commentary{%
+A type alias can be used as a type annotation,
+as a return type or parameter type in a function declaration,
+in a function type,
+as a type argument,
+in a type test,
+in a type cast,
+and in an \ON{} clause of a \TRY{} statement.
+
+Consider the case where the body of a given type alias $F$
+is a \synt{typeName} that denotes a non-generic class,
+or it is a parameterized type that starts with
+a \synt{typeName} that denotes a generic class,
+or one of these cases occur indirectly via another type alias.
+In this case $F$ or a parameterized type that starts with $F$,
+whichever is not an error,
+can also be used to name a constructor in an instance creation expression
+(\ref{instanceCreation}),
+and it can be used as a superclass, mixin, or superinterface
+(\ref{superclasses}, \ref{superinterfaces}, \ref{mixinApplication}).
+Moreover, $F$ or a parameterized type that starts with $F$,
+whichever is not an error,
+can be used to invoke static methods of the denoted class.
+}
+
+\rationale{%
+This indirectly allows an invocation of a static method to pass
+a list of actual type arguments to the class.
+This is currently an error when it occurs directly
+(e.g., \code{List<int>.castFrom(xs)}).
+But it may be part of a future language extension to allow
+static methods to use the type parameters declared by the enclosing class,
+in which case both the direct and indirect approach will be allowed.
+At that time,
+existing invocations where type arguments are passed indirectly will not break,
+because it is currently an error for a static method to depend on the value
+of a formal type parameter of the enclosing class.
+}
+
+%% TODO(eernst): Move specification of generic type aliases to this
+%% section, change the non-generic case to a special case.
+\commentary{
+The generic variants of type alias declarations are specified
+in the section about generics
+(\ref{generics}).
+}
+
+
+\subsection{Subtypes}
+\LMLabel{subtypes}
+
+\LMHash{}%
+This section defines when a type is a \Index{subtype} of another type.
+The core of this section is the set of rules defined in
+Figure~\ref{fig:subtypeRules},
+but we will need to introduce a few concepts first,
+in order to clarify what those rules mean.
+
+\commentary{%
+A reader who has read many research papers about object-oriented type systems
+may find the meaning of the given notation obvious,
+but we still need to clarify a few details about how to handle
+syntactically different denotations of the same type,
+and how to choose the right initial environment, $\Gamma$.
+%
+For a reader who is not familiar with the notation used in this section,
+the explanations given here should suffice to clarify what it means,
+with reference to the natural language explanations given at the end of
+the section for obtaining an intuition about the meaning.
+}
+
+\LMHash{}%
+This section is concerned with subtype relationships between types
+during static analysis
+as well as subtype relationships as queried in dynamic checks,
+type tests
+(\ref{typeTest}),
+and type casts
+(\ref{typeCast}).
+
+\commentary{%
+A variant of the rules described here is shown in an appendix
+(\ref{algorithmicSubtyping}),
+demonstrating that Dart subtyping can be decided efficiently.}
+
+\LMHash{}%
+%% TODO(eernst): Introduce these specialized intersection types
+%% in a suitable location where type promotion is specified.
+Types of the form $X \& S$ arise during static analysis due to type promotion
+(\ref{typePromotion}).
+They never occur during execution,
+they are never a type argument of another type,
+nor a return type or a formal parameter type,
+and it is always the case that $S$ is a subtype of the bound of $X$.
+\commentary{%
+The motivation for $X \& S$ is that it represents
+the type of a local variable $v$
+whose type is declared to be the type variable $X$,
+and which is known to have type $S$ due to promotion.
+Similarly, $X \& S$ may be seen as an intersection type,
+which is a subtype of $X$ and also a subtype of $S$.
+Intersection types are \emph{not} supported in general,
+only in this special case.%
+}
+Every other form of type may occur during static analysis
+as well as during execution,
+and the subtype relationship is always determined in the same way.
+
+% Subtype Rule Numbering
+\newcommand{\SrnReflexivity}{1}
+\newcommand{\SrnTop}{2}
+\newcommand{\SrnBottom}{3}
+\newcommand{\SrnNull}{4}
+\newcommand{\SrnLeftTypeAlias}{5}
+\newcommand{\SrnRightTypeAlias}{6}
+\newcommand{\SrnLeftFutureOr}{7}
+\newcommand{\SrnTypeVariableReflexivityA}{8}
+\newcommand{\SrnRightPromotedVariable}{9}
+\newcommand{\SrnRightFutureOrA}{10}
+\newcommand{\SrnRightFutureOrB}{11}
+\newcommand{\SrnLeftPromotedVariable}{12}
+\newcommand{\SrnLeftVariableBound}{13}
+\newcommand{\SrnRightFunction}{14}
+\newcommand{\SrnPositionalFunctionType}{15}
+\newcommand{\SrnNamedFunctionType}{16}
+\newcommand{\SrnCovariance}{17}
+\newcommand{\SrnSuperinterface}{18}
+
+\begin{figure}[p]
+  \def\VSP{\vspace{4mm}}
+  \def\ExtraVSP{\vspace{2mm}}
+  \def\Axiom#1#2#3#4{\centerline{\inference[#1]{}{\SubtypeStd{#3}{#4}}}\VSP}
+  \def\Rule#1#2#3#4#5#6{\centerline{\inference[#1]{\SubtypeStd{#3}{#4}}{\SubtypeStd{#5}{#6}}}\VSP}
+  \def\RuleTwo#1#2#3#4#5#6#7#8{%
+    \centerline{\inference[#1]{\SubtypeStd{#3}{#4} & \SubtypeStd{#5}{#6}}{\SubtypeStd{#7}{#8}}}\VSP}
+  \def\RuleRaw#1#2#3#4#5{%
+    \centerline{\inference[#1]{#3}{\SubtypeStd{#4}{#5}}}\VSP}
+  \def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
+  %
+  \begin{minipage}[c]{0.49\textwidth}
+    \Axiom{\SrnReflexivity}{Reflexivity}{S}{S}
+    \Axiom{\SrnBottom}{Left Bottom}{\bot}{T}
+  \end{minipage}
+  \begin{minipage}[c]{0.49\textwidth}
+    \RuleRaw{\SrnTop}{Right Top}{T \in \{\code{Object}, \DYNAMIC, \VOID\}}{S}{T}
+    \RuleRaw{\SrnNull}{Left Null}{T \not= \bot}{\code{Null}}{T}
+  \end{minipage}
+
+  \ExtraVSP
+  \RuleRaw{\SrnLeftTypeAlias}{Type Alias Left}{%
+    \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
+    \SubtypeStd{[S_1/X_1,\ldots,S_s/X_s]U}{T}}{\code{$F$<\List{S}{1}{s}>}}{T}
+  \RuleRaw{\SrnRightTypeAlias}{Type Alias Right}{%
+    \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
+    \SubtypeStd{S}{[T_1/X_1,\ldots,T_s/X_s]U}}{S}{\code{$F$<\List{T}{1}{s}>}}
+
+  \begin{minipage}[c]{0.49\textwidth}
+    \RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
+      \code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
+    \RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{
+      S}{X \& T}
+    \Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
+    \Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Gamma(X)}{T}{X}{T}
+  \end{minipage}
+  \begin{minipage}[c]{0.49\textwidth}
+    \Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
+    \Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
+      S}{\code{FutureOr<$T$>}}
+    \Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
+    \RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{
+      T}{\FUNCTION}
+  \end{minipage}
+  %
+  \ExtraVSP
+  \RuleRawRaw{\SrnPositionalFunctionType}{Positional Function Types}{%
+    \Gamma' = \Gamma\uplus\{X_i\mapsto{}B_i\,|\,1 \leq i \leq s\} &
+    \Subtype{\Gamma'}{S_0}{T_0} \\
+    n_1 \leq n_2 &
+    n_1 + k_1 \geq n_2 + k_2 &
+    \forall j \in 1 .. n_2 + k_2\!:\;\Subtype{\Gamma'}{T_j}{S_j}}{%
+    \begin{array}{c}
+      \Gamma\vdash\RawFunctionTypePositional{S_0}{X}{B}{s}{S}{n_1}{k_1}\;<:\;\\
+      \RawFunctionTypePositional{T_0}{X}{B}{s}{T}{n_2}{k_2}
+    \end{array}}
+  \ExtraVSP\ExtraVSP
+  \RuleRawRaw{\SrnNamedFunctionType}{Named Function Types}{
+    \Gamma' = \Gamma\uplus\{X_i\mapsto{}B_i\,|\,1 \leq i \leq s\} &
+    \Subtype{\Gamma'}{S_0}{T_0} &
+    \forall j \in 1 .. n\!:\;\Subtype{\Gamma'}{T_j}{S_j} \\
+    \{\,\List{y}{n+1}{n+k_2}\,\} \subseteq \{\,\List{x}{n+1}{n+k_1}\,\} \\
+    \forall p \in 1 .. k_2, q \in 1 .. k_1:\quad
+    y_{n+p} = x_{n+q}\quad\Rightarrow\quad\Subtype{\Gamma'}{T_{n+p}}{S_{n+q}}}{%
+    \begin{array}{c}
+      \Gamma\vdash\RawFunctionTypeNamed{S_0}{X}{B}{s}{S}{n}{x}{k_1}\;<:\;\\
+      \RawFunctionTypeNamed{T_0}{X}{B}{s}{T}{n}{y}{k_2}
+    \end{array}}
+  %
+  \ExtraVSP
+  \RuleRaw{\SrnCovariance}{Covariance}{%
+    \code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}} &
+    \forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
+    \code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
+  \ExtraVSP
+  \RuleRaw{\SrnSuperinterface}{Superinterface}{%
+    \code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
+    \Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
+    \SubtypeStd{[S_1/X_1,\ldots,S_s/X_s]\code{$D$<\List{T}{1}{m}>}}{T}}{%
+    \code{$C$<\List{S}{1}{s}>}\;}{\;T}
+  %
+  \caption{Subtype rules}
+  \label{fig:subtypeRules}
+\end{figure}
+
+
+\subsubsection{Meta-Variables}
+\LMLabel{metaVariables}
+
+\LMHash{}%
+A \Index{meta-variable} is a symbol which stands for a syntactic construct
+that satisfies some static semantic requirements.
+
+\commentary{
+For instance, $X$ is a meta-variable standing for
+an identifier \code{W},
+but only if \code{W} denotes a type variable declared in an enclosing scope.
+In the definitions below, we specify this by saying that
+`$X$ ranges over type variables'.
+Similarly, $C$ is a meta-variable standing for
+a \synt{typeName}, for instance, \code{p.D},
+but only if \code{p.D} denotes a class in the given scope.
+We specify this as `$C$ ranges over classes'.
+}
+
+\LMHash{}%
+In this section we use the following meta-variables:
+
+\begin{itemize}
+\item $X$ ranges over type variables.
+\item $C$ ranges over classes,
+\item $F$ ranges over type aliases.
+\item $T$ and $S$ range over types, possibly with an index like $T_1$ or $S_j$.
+\item $B$ ranges over types, again possibly with an index;
+  it is only used as a type variable bound.
+\end{itemize}
+
+
+\subsubsection{Subtype Rules}
+\LMLabel{subtypeRules}
+
+\LMHash{}%
+We define several rules about subtyping in this section.
+Whenever a rule contains one or more meta-variables,
+that rule can be used by
+\IndexCustom{instantiating}{instantiation!subtype rule}
+it, that is, by consistently replacing
+each occurrence of a given meta-variable by
+concrete syntax denoting the same type.
+
+\commentary{%
+In general, this means that two or more occurrences of
+a given meta-variable in a rule
+stands for identical pieces of syntax,
+and the instantiation of the rule proceeds as
+a simple search-and-replace operation.
+For instance,
+rule~\SrnReflexivity{} in Figure~\ref{fig:subtypeRules}
+can be used to conclude
+\Subtype{\emptyset}{\code{int}}{\code{int}},
+where $\emptyset$ denotes the empty environment
+(any environment would suffice because no type variables occur).
+
+However, the wording `denoting the same type' above covers
+additional situations as well:
+For instance, we may use rule~\SrnReflexivity{}
+to show that \code{p1.C} is a subtype of
+\code{p2.C} when \code{C} is a class declared in a
+library $L$ which is imported by libraries $L_1$ and $L_2$ and
+used in declarations there,
+when $L_1$ and $L_2$ are imported with prefixes
+\code{p1} respectively \code{p2} by the current library.
+The important point is that all occurrences of the same meta-variable
+in a given rule instantiation stands for the same type,
+even in the case where that type is not denoted by
+the same syntax in both cases.
+
+Conversely, we can \emph{not} use the same rule to conclude
+that \code{C} is a subtype of \code{C}
+in the case where the former denotes a class declared in library $L_1$
+and the latter denotes a class declared in $L_2$, with $L_1 \not= L_2$.
+This situation can arise without compile-time errors, e.g.,
+if $L_1$ and $L_2$ are imported indirectly into the current library
+and the two ``meanings'' of \code{C} are used
+as type annotations on variables or formal parameters of functions
+declared in intermediate libraries importing $L_1$ respectively $L_2$.
+The failure to prove
+``\Subtype{\emptyset}{\code{C}}{\code{C}}''
+will then occur, e.g., in a situation where we check whether
+such a variable can be passed as an actual argument to such a function,
+because the two occurrences of \code{C} do not denote the same type.
+}
+
+\LMHash{}%
+Every \synt{typeName} used in a type mentioned in this section is assumed to
+have no compile-time error and denote a type.
+
+\commentary{%
+That is, no subtyping relationship can be proven for
+a type that is or contains an undefined name
+or a name that denotes something other than a type.
+Note that it is not necessary in order to determine a subtyping relationship
+that every type satisfies the declared bounds,
+the subtyping relation does not depend on bounds.
+However, if an attempt is made to prove a subtype relationship
+and one or more \synt{typeName}s receives an actual type argument list
+whose length does not match the declaration
+(including the case where some type arguments are given to a non-generic class,
+and the case where a generic class occurs, but no type arguments are given)
+then the attempt to prove the relationship simply fails.
+}
+
+\LMHash{}%
+The rules in Figure~\ref{fig:subtypeRules} use
+the symbol \Index{$\Gamma$} to denote the given knowledge about the
+bounds of type variables.
+$\Gamma$ is a partial function that maps type variables to types.
+At a given location where the type variables in scope are
+\TypeParametersStd{}
+(\commentary{as declared by enclosing classes and/or functions}),
+we define the environment as follows:
+$\Gamma = \{\,X_1 \mapsto B_1,\ \ldots\ X_s \mapsto B_s\,\}$.
+\commentary{%
+That is, $\Gamma(X_1) = B_1$, and so on,
+and $\Gamma$ is undefined when applied to a type variable $Y$
+which is not in $\{\,\List{X}{1}{s}\,\}$.%
+}
+When the rules are used to show that a given subtype relationship exists,
+this is the initial value of $\Gamma$.
+
+\LMHash{}%
+If a generic function type is encountered, an extension of $\Gamma$ is used,
+as shown in the rules~\SrnPositionalFunctionType{}
+and~\SrnNamedFunctionType{}
+of Figure~\ref{fig:subtypeRules}.
+Extension of environments uses the operator \Index{$\uplus$},
+which is the operator that produces the union of disjoint sets,
+and gives priority to the right hand operand in case of conflicts.
+
+\commentary{
+So
+$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
+\{ \code{Z} \mapsto \code{Object} \} =
+\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, \code{Z} \mapsto \code{Object} \}$
+and
+$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{FutureOr<List<double>{}>} \} \uplus
+\{ \code{Y} \mapsto \code{int} \} =
+\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
+Note that operator $\uplus$ is concerned with scopes and shadowing,
+with no connection to, e.g., subtypes or instance method overriding.
+}
+
+\LMHash{}%
+In this specification we frequently refer to
+subtype relationships and assignability
+without mentioning the environment explicitly,
+as in \Index{\SubtypeNE{S}{T}}.
+This is only done when a specific location in code is in focus,
+and it means that the environment is that which is obtained
+by mapping each type variable in scope at that location
+to its declared bound.
+
+\LMHash{}%
+Each rule in Figure~\ref{fig:subtypeRules} has a horizontal line,
+to the left of which the \Index{rule number} is indicated;
+under the horizontal line there is a judgment which is the
+\IndexCustom{conclusion}{rule!conclusion}
+of the rule,
+and above the horizontal line there are zero or more
+\IndexCustom{premises}{rule!premise}
+of the rule,
+which are typically also subtype judgments.
+When that is not the case for a given premise,
+we specify the meaning explicitly.
+
+\commentary{
+Instantiation of a rule, mentioned above,
+denotes the consistent replacement of meta-variables
+by actual syntactic terms denoting types everywhere in the rule,
+that is, in the premises as well as in the conclusion, simultaneously.
+%% TODO(eernst): Consider showing a full proof tree here.
+}
+
+
+\subsubsection{Being a subtype}
+\LMLabel{beingASubtype}
+
+\LMHash{}%
+A type $S$ is shown to be a \Index{subtype} of another type $T$
+in an environment $\Gamma$ by providing
+an instantiation of a rule $R$ whose conclusion is
+\IndexCustom{\SubtypeStd{S}{T}}{$\Gamma$@\SubtypeStd{S}{T}},
+along with rule instantiations showing
+each of the premises of $R$,
+continuing until a rule with no premises is reached.
+
+\commentary{%
+For rule \SrnNull, note that the \code{Null} type
+is a subtype of all non-$\bot$ types,
+even though it doesn't actually extend or implement those types.
+The other types are effectively treated as if they were nullable,
 which makes the null object (\ref{null}) assignable to them.
 }
 
-\LMHash{}
-$S$ is a supertype of $T$, written $S :> T$, if{}f $T$ is a subtype of $S$.
+\LMHash{}%
+The first premise in the
+rules~\SrnLeftTypeAlias{} and~\SrnRightTypeAlias{}
+is a type alias declaration.
+This premise is satisfied in each of the following situations:
 
-\commentary{
-The supertypes of an interface are its direct supertypes and their supertypes.
+\begin{itemize}
+\item A non-generic type alias named $F$ is declared.
+  In this case $s$ is zero,
+  no assumptions are made about the existence
+  of any formal type parameters,
+  and actual type argument lists are omitted everywhere in the rule.
+\item We may choose $s$ and \List{X}{1}{s} such that the following holds:
+  A generic type alias named $F$ is declared,
+  with formal type parameters \List{X}{1}{s}.
+  \commentary{%
+  Each formal type parameter $X_j$ may have a bound,
+  but the bounds are never used in this context,
+  so we do not introduce metavariables for them.}
+\end{itemize}
+
+\LMHash{}%
+Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
+This means that $T$ is a type of one of the forms introduced in
+section~\ref{typeOfAFunction}.
+\commentary{%
+This is the same as the forms of type that occur at top level
+in the conclusions of
+rule~\SrnPositionalFunctionType{} and
+rule~\SrnNamedFunctionType{}.
 }
 
-\LMHash{}
-An interface type $T$ may be assigned to a type $S$, written $T \Longleftrightarrow S$, if{}f either $T <: S$, $S <: T$.
+\LMHash{}%
+In rules~\SrnCovariance{} and~\SrnSuperinterface{},
+the first premise is a class declaration.
+This premise is satisfied in each of the following situations:
+
+\begin{itemize}
+\item A non-generic class named $C$ is declared.
+  In this case $s$ is zero,
+  no assumptions are made about the existence
+  of any formal type parameters,
+  and actual type argument lists are omitted everywhere in the rule.
+\item We may choose $s$ and \List{X}{1}{s} such that the following holds:
+  A generic class named $C$ is declared,
+  with formal type parameters \List{X}{1}{s}.
+  \commentary{%
+  Each formal type parameter $X_j$ may have a bound,
+  but the bounds are never used in this context,
+  so we do not introduce metavariables for them.}
+\end{itemize}
+
+\LMHash{}%
+The second premise of rule~\SrnSuperinterface{} specifies that
+a parameterized type \code{$D$<\ldots{}>} belongs to
+\IndexCustom{\Superinterfaces{C}}{superinterfaces(C)@\Superinterfaces{C}}.
+The semantic function \Superinterfaces{\_} applied to a generic class $C$ yields
+the set of direct superinterfaces of $C$
+(\ref{superinterfaces}).
+
+\commentary{%
+Note that one of the direct superinterfaces of $C$ is
+the interface of the superclass of $C$,
+and that may be a mixin application
+(\ref{mixinApplication}),
+in which case $D$ in the rule is
+the synthetic class which specifies
+the semantics of that mixin application
+(\ref{mixinComposition}).
+}
+
+\commentary{%
+The last premise of rule~\SrnSuperinterface{}
+substitutes the actual type arguments \List{S}{1}{s} for the
+formal type parameters \List{X}{1}{s},
+because \List{T}{1}{m} may contain those formal type parameters.
+}
+
+\commentary{%
+The rules~\SrnCovariance{} and~\SrnSuperinterface{}
+are applicable to interfaces,
+but they can be used with classes as well,
+because a non-generic class $C$ which is used as a type
+denotes the interface of $C$,
+and similarly for a parameterized type
+\code{$C$<\List{T}{1}{k}>}
+where $C$ denotes a generic class.
+}
+
+
+\subsubsection{Informal Subtype Rule Descriptions}
+\LMLabel{informalSubtypeRuleDescriptions}
+
+\commentary{
+This section gives an informal and non-normative natural language description
+of each rule in Figure~\ref{fig:subtypeRules}.
+
+The descriptions use the rule numbers to make the connection explicit,
+and also adds names to the rules that may be helpful in order to understand
+the role played by each rule.
+
+In the following, many rules contain meta-variables
+(\ref{metaVariables})
+like $S$ and $T$,
+and it is always the case that they can stand for arbitrary types.
+For example, rule~\SrnRightFutureOrA{} says that
+``The type $S$ is a \ldots{} of \code{FutureOr<$T$>} \ldots'',
+and this is taken to mean that for any arbitrary types $S$ and $T$,
+showing that $S$ is a subtype of $T$ is sufficient to show that $S$ is
+a subtype of \code{FutureOr<$T$>}.
+
+Another example is the wording in rule~\SrnReflexivity{}:
+``\ldots{} in any environment $\Gamma$'',
+which indicates that the rule can be applied no matter which bindings
+of type variables to bounds there exist in the environment.
+It should be noted that the environment matters even with rules
+where it is simply stated as a plain $\Gamma$ in the conclusion
+and in one or more premises,
+because the proof of those premises could, directly or indirectly,
+include the application of a rule where the environment is used.
+
+\def\Item#1#2{\item[#1]{\textbf{#2:}}}
+\begin{itemize}
+\Item{\SrnReflexivity}{Reflexivity}
+  Every type is a subtype of itself, in any environment $\Gamma$.
+  In the following rules except for a few,
+  the rule is also valid in any environment
+  and the environment is never used explicitly,
+  so we will not repeat that.
+\Item{\SrnTop}{Top}
+  Every type is a subtype of \code{Object},
+  every type is a subtype of \DYNAMIC{},
+  and every type is a subtype of \VOID{}.
+  Note that this implies that these types are equivalent
+  according to the subtype relation.
+  We denote these types,
+  and others with the same property (such as \code{FutureOr<Object>}),
+  as top types
+  (\ref{superBoundedTypes}).
+\Item{\SrnBottom}{Bottom}
+  Every type is a supertype of $\bot$.
+\Item{\SrnNull}{Null}
+  Every type other than $\bot$ is a supertype of \code{Null}.
+\Item{\SrnLeftTypeAlias}{Type Alias Left}
+  An application of a type alias to some actual type arguments is
+  a subtype of another type $T$
+  if the expansion of the type alias to the type that it denotes
+  is a subtype of $T$.
+  Note that a non-generic type alias is handled by letting $s = 0$.
+\Item{\SrnRightTypeAlias}{Type Alias Right}
+  A type $S$ is a subtype of an application of a type alias
+  if $S$ is a subtype of
+  the expansion of the type alias to the type that it denotes.
+  Note that a non-generic type alias is handled by letting $s = 0$.
+\Item{\SrnLeftFutureOr}{Left FutureOr}
+  The type \code{FutureOr<$S$>} is a subtype of a given type $T$
+  if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
+  for every type $S$ and $T$.
+\Item{\SrnTypeVariableReflexivityA}{Left Promoted Variable}
+  The type $X \& S$ is a subtype of $X$.
+\Item{\SrnRightPromotedVariable}{Right Promoted Variable A}
+  The type $S$ is a subtype of $X \& T$ if
+  $S$ is a subtype of both $X$ and $T$.
+\Item{\SrnRightFutureOrA}{Right FutureOr A}
+  The type $S$ is a subtype of \code{FutureOr<$T$>} if
+  $S$ is a subtype of \code{Future<$T$>}.
+\Item{\SrnRightFutureOrB}{Right FutureOr B}
+  The type $S$ is a subtype of \code{FutureOr<$T$>} if
+  $S$ is a subtype of $T$.
+\Item{\SrnLeftPromotedVariable}{Left Promoted Variable B}
+  The type $X \& S$ is a subtype of $T$ if
+  $S$ is a subtype of $T$.
+\Item{\SrnLeftVariableBound}{Left Variable Bound}
+  The type variable $X$ is a subtype of a type $T$ if
+  the bound of $X$
+  (as specified in the current environment $\Gamma$)
+  is a subtype of $T$.
+\Item{\SrnRightFunction}{Right Function}
+  Every function type is a subtype of the type \FUNCTION{}.
+\Item{\SrnPositionalFunctionType}{Positional Function Type}
+  A function type $F_1$ with positional optional parameters
+  is a subtype of
+  another function type $F_2$ with positional optional parameters
+  if the former has at most the same number of required parameters as the latter,
+  and the latter has at least the same total number of parameters as the former;
+  the return type of $F_1$ is a subtype of that of $F_2$;
+  and each parameter type of $F_1$ is a \emph{supertype} of
+  the corresponding parameter type of $F_2$, if any.
+  Note that the relationship to function types with no optional parameters,
+  and the relationship between function types with no optional parameters,
+  is covered by letting $k_2 = 0$ respectively $k_1 = k_2 = 0$.
+  For every subtype relation considered in this rule,
+  the formal type parameters of $F_1$ and $F_2$ must be taken into account
+  (as reflected in the use of the extended environment $\Gamma'$).
+  We can assume without loss of generality
+  that the names of type variables are pairwise identical,
+  because we consider types of generic functions to be equivalent under
+  consistent renaming
+  (\ref{typeOfAFunction}).
+  In short, ``during the proof, we will rename them as needed''.
+  Finally, note that the relationship between non-generic function types
+  is covered by letting $s = 0$.
+\Item{\SrnNamedFunctionType}{Named Function Type}
+  A function type $F_1$ with named optional parameters is a subtype of
+  another function type $F_2$ with named optional parameters
+  if they have the same number of required parameters,
+  and the set of names of named parameters for the latter is a subset
+  of that for the former;
+  the return type of $F_1$ is a subtype of that of $F_2$;
+  and each parameter type of $F_1$ is a \emph{supertype} of
+  the corresponding parameter type of $F_2$, if any.
+  Note that the relationship to function types with no optional parameters,
+  and the relationship between function types with no optional parameters,
+  is covered by letting $k_2 = 0$ respectively $k_1 = k_2 = 0$,
+  and also that the latter case is identical to the rule obtained from
+  rule~\SrnPositionalFunctionType{}
+  concerning subtyping among function types with no optional parameters.
+  As in rule~\SrnPositionalFunctionType,
+  we can assume without loss of generality
+  that the names of type variables are pairwise identical.
+  Similarly, non-generic functions are covered by letting $s = 0$.
+\Item{\SrnCovariance}{Class Covariance}
+  A parameterized type based on a generic class $C$ is a subtype of
+  a parameterized type based on the same class $C$ if
+  each actual type argument of the former is a subtype of
+  the corresponding actual type argument of the latter.
+  This rule may have $s = 0$ and cover a non-generic class as well,
+  but that is redundant because this is already covered by
+  rule~\SrnReflexivity{}.
+\Item{\SrnSuperinterface}{Superinterface}
+  Considering the case where $s = 0$ and $m = 0$ first,
+  a parameterized type based on a non-generic class $C$ is a subtype of
+  a parameterized type based on a different non-generic class $D$ if
+  $D$ is a direct superinterface of $C$.
+  When $s > 0$ or $m > 0$, this rule describes a subtype relationship
+  which includes one or more generic classes,
+  in which case we need to give names to the formal type parameters of $C$,
+  and specify how they are used in the specification of the superinterface
+  based on $D$.
+  With those pieces in place, we can specify the subtype relationship
+  that exists between two parameterized types based on $C$ and $D$.
+  %
+  %% TODO(eernst): Note that the specification of how to pass type arguments in
+  %% \ref{mixinApplication} is incorrect, and also that it will need to be rewritten
+  %% completely for the integration of the new mixin construct.
+  The case where the superclass is a mixin application is covered via
+  the equivalence with a declaration of a regular (possibly generic) superclass
+  (\ref{mixinApplication}),
+  and this means that there may be multiple subtype steps from
+  a given class declaration to the class specified in an \EXTENDS{} clause.
+\end{itemize}
+}
+
+
+\subsubsection{Additional Subtyping Concepts}
+\LMLabel{additionalSubtypingConcepts}
+
+\LMHash{}%
+$S$ is a \Index{supertype} of $T$ in a given environment $\Gamma$,
+written \SupertypeStd{S}{T},
+if{}f \SubtypeStd{T}{S}.
+
+\LMHash{}%
+A type $T$
+\Index{may be assigned}
+to a type $S$ in an environment $\Gamma$,
+written \AssignableStd{S}{T},
+if{}f either \SubtypeStd{S}{T} or \SubtypeStd{T}{S}.
+In this case we say that the types $S$ and $T$ are
+\Index{assignable}.
 
 \rationale{
 This rule may surprise readers accustomed to conventional typechecking.
-The intent of the $\Longleftrightarrow$ relation is not to ensure that an assignment is correct.
-Instead, it aims to only flag assignments that are almost certain to be erroneous, without precluding assignments that may work.
+The intent of the \AssignableRelationSymbol{} relation
+is not to ensure that an assignment is guaranteed to succeed dynamically.
+Instead, it aims to only flag assignments
+that are almost certain to be erroneous,
+without precluding assignments that may work.
 
-For example, assigning a value of static type Object to a variable with static type String, while not guaranteed to be correct, might be fine if the run-time value happens to be a string.
+For example, assigning a value of static type \code{Object}
+to a variable with static type \code{String},
+while not guaranteed to be correct,
+might be fine if the run-time value happens to be a string.
+
+A static analyzer or compiler
+may support more strict static checks as an option.
 }
 
 
 \subsection{Function Types}
 \LMLabel{functionTypes}
 
-\LMHash{}
+\LMHash{}%
 Function types come in two variants:
 \begin{enumerate}
 \item
-The types of functions that only have positional parameters.
-These have the general form
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($T_1, \ldots,\ T_n,\ $[$T_{n+1}, \ldots,\ T_{n+k}$]) $ \rightarrow T$}.
+  The types of functions that only have positional parameters.
+  These have the general form
+  \FunctionTypePositionalStd{T}.
 \item
-The types of functions with named parameters.
-These have the general form
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($T_1, \ldots,\ T_n,\ $\{$T_{x_1}\ x_1, \ldots,\ T_{x_k}\ x_k$\}) $ \rightarrow T$}.
+  The types of functions with named parameters.
+  These have the general form
+  \FunctionTypeNamedStd{T}.
 \end{enumerate}
 
 \commentary{
-Note that the non-generic case is covered by using $s = 0$,
-in which case the type parameter declarations are omitted (\ref{generics}).
+Note that the non-generic case is covered by having $s = 0$,
+in which case the type parameter declarations are omitted
+(\ref{generics}).
+The case with no optional parameters is covered by having $k = 0$;
+note that all rules involving function types of the two kinds
+coincide in this case.
 }
 
-\LMHash{}
+\LMHash{}%
 Two function types are considered equal if consistent renaming of type
 parameters can make them identical.
 
@@ -11191,182 +13902,54 @@
 no subtype relationship exists.
 }
 
-\LMHash{}
-%A function type $(T_1, \ldots, T_n, [T_{n+1} , \ldots, T_{n+k}]) \rightarrow T$ is a subtype of the
-% the line below revises the rule to be more liberal
-The function type
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($T_1, \ldots,\ T_{k},\ $[$T_{k+1}, \ldots,\ T_{n+m}$]) $ \rightarrow T$}
-
-\noindent
-is a subtype of the function type
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($S_1, \ldots,\ S_{k+j},\ $[$S_{k+j+1}, \ldots,\ S_{n}$]) $ \rightarrow S$},
-
-\noindent
-if all of the following conditions are met,
-assuming that $X_j$ is a subtype of $B_j$, for all $j \in 1 .. s$:
-\begin{enumerate}
-\item Either
-\begin{itemize}
-\item $S$ is \VOID{}, Or
-\item $T \Longleftrightarrow S$.
-\end{itemize}
-\item $\forall i \in 1 .. n, T_i \Longleftrightarrow S_i$.
-\end{enumerate}
-
-\LMHash{}
-A function type
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($T_1, \ldots,\ T_n,\ $\{$T_{x_1}\ x_1, \ldots,\ T_{x_k}\ x_k$\}) $ \rightarrow T$}
-
-\noindent
-is a subtype of the function type
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($S_1, \ldots,\ S_n,\ $\{$S_{y_1}\ y_1, \ldots,\ S_{y_m}\ y_m$\}) $ \rightarrow S$},
-
-\noindent
-if all of the following conditions are met,
-assuming that $X_j$ is a subtype of $B_j$, for all $j \in 1 .. s$:
-\begin{enumerate}
-\item Either
-\begin{itemize}
-\item $S$ is \VOID{}, Or
-\item $T \Longleftrightarrow S$.
-\end{itemize}
-\item $\forall i \in 1 .. n, T_i \Longleftrightarrow S_i$.
-\item $k \ge m$ and $y_i \in \{x_1, \ldots, x_k\}, i \in 1 .. m$.
-%\{x_1, \ldots, x_k\}$ is a superset of $\{y_1, \ldots, y_m\}$.
-\item For all $y_i \in \{y_1, \ldots, y_m\}, y_i = x_j \Rightarrow T_{x_j} \Longleftrightarrow S_{y_i}$
-\end{enumerate}
-
-%In addition, a function type $(T_1, \ldots, Tn, [T_{n+1} x_{n+1}, \ldots, T_{n+k} x_{n+k}]) \rightarrow T$ is a subtype of the function type $(T_1, \ldots, T_n, T_{n+1} , [T_{n+2} x_{n+2}, \ldots, T_{n+k} x_{n+k}]) \rightarrow T$.
-
-%\rationale{This second rule is attractive to web developers, who are used to this sort of flexibility from Javascript. However, it may be costly to implement efficiently.}
-
-%We write $(T_1, \ldots, T_n) \rightarrow T$ as a shorthand for the type $(T_1, \ldots, T_n, []) \rightarrow T$.
-
-%The rules above need to be sanity checked, but the intent is that we view functions with rest parameters as having type $(T_1, ..., T_n, [\_{Tn+1}[] \_]) \rightarrow T$, where \_ is some magical identifier. Then the rules above may cover everything.
-% This is wrong - from the outside, the type takes an unbounded sequence of types, not a list. This can be modeled as $(T_1, \ldots, T_n, [T_{n+1}, \_, \ldots, T_{n+k} \_]) \rightarrow T$ for some finite $k$.
-
-\LMHash{}
-In addition, the following subtype rules apply:
-
-% NOTE(eernst): In Dart 1 we do not have transitivity of subtyping so we
-% cannot use a rule about the empty list/set of optional parameters ('[]'
-% or '{}') as an "intermediate step" in a subtype judgment. We keep them
-% for now because they will be useful in Dart 2.
-
-\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_n,\ $[]) $ \rightarrow T \quad<:$}
-
-\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_n$)\ $\rightarrow T$}.
-
-\vspace{2mm}
-\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_n,\ $\{\}) $ \rightarrow T \quad<:$}
-
-\code{<$X_1\ B_1, \ldots,\ X_s\ B_s$>($T_1, \ldots,\ T_n$)\ $\rightarrow T$}.
-
-\vspace{2mm}
-
-% NOTE(eernst): I think this rule is useless. We cannot use it (along with
-% other rules) to prove (T1) -> S <: (T1, []) -> S <: (T1, [T2]) -> S,
-% because it should not be provable (and it isn't) that we can accept two
-% arguments statically, but at runtime we only accept one argument; similarly,
-% we cannot prove (T1) -> S <: (T1, []) -> S <: ([T1]) -> S, because we
-% would then allow invocation with no arguments where the run-time
-% requirement is exactly one argument. So I believe that this rule is
-% simply useless (it's not dangerous, it just doesn't allow us to prove
-% anything). Hence, I'm commenting it out now.
-%
-% $(T_1, \ldots, T_n) \rightarrow T <: (T_1, \ldots, T_n, []) \rightarrow T$.
-%
-% Same for this rule:
-%
-% $(T_1, \ldots, T_n) \rightarrow T <: (T_1, \ldots, T_n, \{\}) \rightarrow T$.
-
-\rationale{
-The naive reader might conclude that, since it is not legal to declare a function with an empty optional parameter list, these rules are pointless.
-However, they induce useful relationships between function types that declare no optional parameters and those that do.
+\LMHash{}%
+A function object is always an instance of some class that implements the class \FUNCTION{} (\ref{functionType}).
+\commentary{%
+Consequently, all function types are subtypes of \FUNCTION{}
+(\ref{subtypes}).
 }
 
-\LMHash{}
-A function type $T$ may be assigned to a function type $S$, written $T \Longleftrightarrow S$, if{}f $T <: S$.
 
-\LMHash{}
-A function is always an instance of some class that implements the class \FUNCTION{}.
-All function types are subtypes of \FUNCTION{}.
+\subsection{Type \FUNCTION{}}
+\LMLabel{functionType}
 
-%\commentary{Need to specify how a function values dynamic type is derived from its static signature.}
+\LMHash{}%
+The built-in class \FUNCTION{} is a supertype of all function types
+(\ref{functionTypes}).
+It is impossible to extend, implement, or mix in the class \FUNCTION{}.
 
-\LMHash{}
-A function type
+\LMHash{}%
+If a class declaration or mixin application has \FUNCTION{} as superclass,
+it instead uses \code{Object} as superclass.
 
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
+\LMHash{}%
+If a class or mixin declaration implements \FUNCTION{}, it has no effect.
+It is as if the \FUNCTION was removed from the \code{implements} clause
+(and if it's the only implemented interface, the entire clause is removed).
+The resulting class or mixin interface
+does not have \FUNCTION{} as a superinterface.
 
-\code{($T_1, \ldots,\ T_{k},\ $[$T_{k+1}, \ldots,\ T_{n+m}$]) $ \rightarrow T$}
+\LMHash{}%
+If a mixin application mixes \FUNCTION{} onto a superclass, it follows the
+normal rules for mixin-application, but since the result of that mixin
+application is equivalent to a class with \code{implements Function}, and
+that clause has no effect, the resulting class also does not
+implement \FUNCTION{}. \commentary{The \FUNCTION{} class declares no
+concrete instance members, so the mixin application creates a sub-class
+of the superclass with no new members and no new interfaces.}
 
-\noindent
-is more specific than the function type
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($S_1, \ldots,\ S_{k+j},\ $[$S_{k+j+1}, \ldots,\ S_{n}$]) $ \rightarrow S$},
-
-\noindent
-if all of the following conditions are met:
-\begin{enumerate}
-\item Either
-\begin{itemize}
-\item $S$ is \VOID{}, Or
-\item $T << S$.
-\end{itemize}
-\item $\forall i \in 1 .. n, T_i << S_i$.
-\end{enumerate}
-
-\LMHash{}
-A function type
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($T_1, \ldots,\ T_n,\ $\{$T_{x_1}\ x_1, \ldots,\ T_{x_k}\ x_k$\}) $ \rightarrow T$}
-
-\noindent
-is more specific than the function type
-
-\code{<$X_1\ \EXTENDS\ B_1, \ldots,\ X_s\ \EXTENDS\ B_s$>}
-
-\code{($S_1, \ldots,\ S_n,\ $\{$S_{y_1}\ y_1, \ldots,\ S_{y_m}\ y_m$\}) $ \rightarrow S$},
-
-\noindent
-if all of the following conditions are met:
-\begin{enumerate}
-\item Either
-\begin{itemize}
-\item $S$ is \VOID{}, Or
-\item $T << S$.
-\end{itemize}
-\item $\forall i \in 1 .. n, T_i << S_i$.
-\item $k \ge m$ and $y_i \in \{x_1, \ldots, x_k\}, i \in 1 .. m$.
-%\{x_1, \ldots, x_k\}$ is a superset of $\{y_1, \ldots, y_m\}$.
-\item For all $y_i \in \{y_1, \ldots, y_m\}, y_i = x_j \Rightarrow T_j << S_i$
-\end{enumerate}
-
-\LMHash{}
-Furthermore, if $F$ is a function type, $F << \FUNCTION{}$.
+\rationale{Since using \FUNCTION{} in these ways has no effect, it would be
+reasonable to disallow it completely, like we do extending, implementing or
+mixing in types like \code{int} or \code{String}.
+For backwards compatibility with Dart 1 programs,
+the syntax is allowed to remain, even if it has no effect.
+Tools may choose to warn users that their code has no effect.}
 
 
 \subsection{Type \DYNAMIC{}}
 \LMLabel{typeDynamic}
 
-\LMHash{}
+\LMHash{}%
 The type \DYNAMIC{} is a static type which is a supertype of all other types,
 just like \code{Object},
 but it it differs from other types in that the static analysis
@@ -11383,10 +13966,10 @@
 of any type,
 without error.
 Note that the invocation will still cause a compile-time error
-if one or more arguments or other subterms has an error.
+if there is an error in one or more arguments or other subterms.
 }
 
-\LMHash{}
+\LMHash{}%
 % Inference is assumed to have taken place, so the type was not inferred.
 If no static type annotation has been provided,
 the type system considers declarations to have type \DYNAMIC{}.
@@ -11403,7 +13986,7 @@
 \code{$G$<$\DYNAMIC{}, \ldots,\ \DYNAMIC{}$>}.
 }
 
-\LMHash{}
+\LMHash{}%
 The built-in type declaration \code{dynamic},
 which is declared in the library \code{dart:core},
 denotes the \DYNAMIC{} type.
@@ -11413,22 +13996,139 @@
 
 \commentary{
 This \code{Type} object must compare equal to the corresponding \code{Type}
-objects for \code{Object} and \VOID{}
+objects for \code{Object} and \VOID{} according to operator `\code{==}'
 (\ref{dynamicTypeSystem}).
 }
 
+\LMHash{}%
+To improve the precision of static types,
+member accesses on a receiver of type \DYNAMIC{} that refer to
+declarations of the built-in class \code{Object}
+are given the static type corresponding to those declarations
+whenever doing so is sound.
+
+\begin{itemize}
+\item
+  Let $e$ be an expression of the form \code{$d$.\id}, which is not followed by an
+  argument part, where the static type of $d$ is \DYNAMIC, and \id{} is the name of a
+  getter declared in \code{Object}; if the return type of \code{Object.\id} is $T$
+  then the static type of $e$ is $T$.
+  \commentary{
+  For instance, \code{d.hashCode} has type \code{int}
+  and \code{d.runtimeType} has type \code{Type}.
+  }
+
+\item
+  Let $e$ be an expression of the form \code{$d$.\id}, which is not followed by an
+  argument part, where the static type of $d$ is \DYNAMIC, and \id{} is the name of a
+  method declared in \code{Object} whose method signature has type $F$
+  (\commentary{which is a function type}). The static type of $e$ is then $F$.
+  \commentary{
+  For instance, \code{$d$.toString} has type \code{String \FUNCTION()}.
+  }
+
+\item
+  Let $e$ be an expression of the form \code{$d$.\id(\metavar{arguments})} or
+  \code{$d$.\id<\metavar{typeArguments}>(\metavar{arguments})}
+  where the static type of $d$ is \DYNAMIC,
+  \id{} is the name of a getter declared in \code{Object} with return type $F$,
+  \metavar{arguments} are derived from \synt{arguments}, and
+  \metavar{typeArguments} are derived from \synt{typeArguments}, if present.
+  Static analysis will then process $e$ as a function expression invocation
+  where an object of static type $F$ is applied to the given argument part.
+  \commentary{
+  So this is always a compile-time error.
+  For instance, \code{$d$.runtimeType(42)} is a compile-time error,
+  because it is checked as a
+  function expression invocation where an entity of static type \code{Type} is
+  invoked. Note that it could actually succeed: An overriding implementation
+  of \code{runtimeType} could return an instance whose dynamic type is a subtype
+  of \code{Type} that has a \CALL{} method.
+  We decided to make it an error because it is likely to be a mistake,
+  especially in cases like \code{$d$.hashCode()}
+  where a developer might have forgotten that \code{hashCode} is a getter.
+  }
+
+\item
+  Let $e$ be an expression of the form \code{$d$.\id(\metavar{arguments})}
+  where the static type of $d$ is \DYNAMIC, \metavar{arguments} is
+  an actual argument list derived from \synt{arguments},
+  and \id{} is the name of a method declared in \code{Object}
+  whose method signature has type $F$.
+  If the number of positional actual arguments in \metavar{arguments} is less than the
+  number of required positional arguments of $F$ or greater than the number
+  of positional arguments in $F$, or if \metavar{arguments} includes any named
+  arguments with a name that is not declared in $F$, the type of $e$ is
+  \DYNAMIC. Otherwise, the type of $e$ is the return type in $F$.
+  \commentary{
+    So \code{$d$.toString(bazzle:\,42)} has type \DYNAMIC{} whereas
+    \code{$d$.toString()} has type \code{String}.
+    Note that invocations which "do not fit" the statically
+    known declaration are not errors, they just get return type \DYNAMIC.
+  }
+
+\item
+  Let $e$ be an expression of the form
+  \code{$d$.\id<\metavar{typeArguments}>(\metavar{arguments})} where
+  the static type of $d$ is \DYNAMIC, \metavar{typeArguments} is a list of actual
+  type arguments derived from \synt{typeArguments}, and
+  \metavar{arguments} is an actual argument list derived from \synt{arguments}.
+  It is a compile-time error if \id{} is the name of
+  a non-generic method declared in \code{Object}.
+  \commentary{
+  No generic methods are declared in \code{Object}.
+  Hence, we do not specify that there must be
+  the statically required number of actual type arguments, and
+  they must satisfy the bounds.
+  That would otherwise be the consistent approach,
+  because the invocation is guaranteed to fail when any of those
+  requirements are violated,
+  but generalizations of this mechanism would need to include such rules.
+  }
+
+\item
+  For an instance method invocation $e$ (including invocations of getters,
+  setters, and operators) where the receiver has static type \DYNAMIC{} and
+  $e$ does not match any of the above cases, the static type of $e$ is
+  \DYNAMIC.
+  When an expression derived from \synt{cascadeSection} performs
+  a getter or method invocation that corresponds to one of the cases above,
+  the corresponding static analysis and compile-time errors apply.
+  \commentary{
+  For instance, \code{$d$..foobar(16)..hashCode()} is an error.
+  }
+\end{itemize}
+
+\commentary{
+Note that only very few forms of instance method invocation with a
+receiver of type \DYNAMIC{} can be a compile-time error.
+Of course, some expressions like \code{x[1, 2]} are syntax errors
+even though they could also be considered "invocations",
+and subexpressions are checked separately so
+any given actual argument could be a compile-time error.
+But almost any given argument list shape could be handled via \code{noSuchMethod},
+and an argument of any type could be accepted because any
+formal parameter in an overriding declaration could have its type
+annotation contravariantly changed to \code{Object}.
+So it is a natural consequence of the principle of
+that
+a \DYNAMIC{} receiver admits almost all instance method invocations.
+The few cases where an instance method invocation with
+a receiver of type \DYNAMIC{} is an error
+are either guaranteed to fail at run time,
+or they are very, very likely to be developer mistakes.
+}
+
 
 \subsection{Type FutureOr}
 \LMLabel{typeFutureOr}
 
-%% TODO(eernst): We should make this a separate section, or change the title of this section.
-
-\LMHash{}
+\LMHash{}%
 The built-in type declaration \code{FutureOr},
 which is declared in the library \code{dart:async},
 defines a generic type with one type parameter (\ref{generics}).
 
-\LMHash{}
+\LMHash{}%
 The \code{FutureOr<$T$>} type is a non-class type with the following
 type relations:
 \begin{itemize}
@@ -11441,11 +14141,11 @@
 
 \commentary{
 The last point guarantees that generic type \code{FutureOr} is
-{\em covariant} in its type parameter, just like class types.
+\emph{covariant} in its type parameter, just like class types.
 That is, if $S$ <: $T$ then \code{FutureOr<$S$>} <: \code{FutureOr<$T$>}.
 }
 
-\LMHash{}
+\LMHash{}%
 If the type arguments passed to \code{FutureOr} would incur compile-time errors
 if applied to a normal generic class with one type parameter,
 the same compile-time errors are issued for \code{FutureOr}.
@@ -11461,7 +14161,7 @@
 to provide a more precise type analysis.
 }
 
-\LMHash{}
+\LMHash{}%
 The type \code{FutureOr<$T$>} has an interface that is identical to that
 of \code{Object}.
 
@@ -11479,50 +14179,331 @@
 only allow invocations of members inherited from \code{Object}.
 }
 
+\LMHash{}%
+We define the auxiliary function
+\IndexCustom{\basetype{T}}{basetype(t)@\emph{basetype}$(T)$}
+as follows:
+
+\begin{itemize}
+\item If $T$ is \code{FutureOr<$S$>} for some $S$ then $\basetype{T} = \basetype{S}$.
+\item Otherwise $\basetype{T} = T$.
+\end{itemize}
 
 \subsection{Type Void}
 \LMLabel{typeVoid}
 
-%% TODO(eernst): Adjust everything in this section when specifying generalized-void.
+\LMHash{}%
+The special type \VOID{} is used to indicate
+that the value of an expression is meaningless and intended to be discarded.
 
-\LMHash{}
-The special type \VOID{} may only be used as the return type of a function: it is a compile-time error to use \VOID{} in any other context.
+\commentary{%
+A typical case is that the type \VOID{} is used as the return type
+of a function that ``does not return anything''.
+Technically, there will always be \emph{some} object
+which is the return value
+(\ref{functions}).
+But it is perfectly meaningful to have a function
+whose sole purpose is to create side-effects,
+such that \emph{any} use of the returned object
+would be misguided.
+%
+This does not mean that there is anything wrong
+with the returned object as such.
+It could be any object whatsoever.
+But the developer who chose the return type \VOID{}
+did that to indicate that it is a misunderstanding to
+ascribe any meaning to that object,
+or to use it for any purpose.
+}
 
-\commentary{
-For example, as a type argument, or as the type of a variable or parameter
+\commentary{%
+The type \VOID{} is a top type
+(\ref{superBoundedTypes}),
+so \VOID{} and \code{Object} are subtypes of each other
+(\ref{subtypes}),
+which also implies that any object can be
+the value of an expression of type \VOID.
+%
+Consequently, any instance of type \code{Type} which reifies the type \VOID{}
+must compare equal (according to the \code{==} operator \ref{equality})
+to any instance of \code{Type} which reifies the type \code{Object}
+(\ref{dynamicTypeSystem}).
+It is not guaranteed that \code{identical(\VOID, Object)} evaluates to true.
+In fact, it is not recommended that implementations strive to achieve this,
+because it may be more important to ensure that diagnostic messages
+(including stack traces and dynamic error messages)
+preserve enough information to use the word `void' when referring to types
+which are specified as such in source code.
+}
 
-Void is not an interface type.
+\LMHash{}%
+In support of the notion
+that the value of an expression with static type \VOID{} should be discarded,
+such values can only be used in specific situations:
+The occurrence of an expression of type \VOID{} is a compile-time error
+unless it is permitted according to one of the following rules.
 
-The only subtype relations that pertain to void are therefore:
 \begin{itemize}
-\item[$\bullet$]
-$\VOID{} <: \VOID{}$ (by reflexivity)
-\item[$\bullet$]
-$\bot <: \VOID{}$ (as bottom is a subtype of all types).
-\item[$\bullet$]
-$\VOID{} <: \DYNAMIC{}$ (as \DYNAMIC{} is a supertype of all types)
+\item
+  In an \synt{expressionStatement} \code{$e$;}, $e$ may have type \VOID.
+  \rationale{The value of $e$ is discarded.}
+\item
+  In the initialization and increment expressions of a for-loop,
+  \code{\FOR{} ($e_1$; $e_2$; $e_3$) {\ldots}},
+  $e_1$ may have type \VOID,
+  and each of the expressions in the expression list $e_3$ may have type \VOID.
+  \rationale{The values of $e_1$ and $e_3$ are discarded.}
+\item
+  In a type cast \code{$e$ as $T$}, $e$ may have type \VOID.
+  \rationale{%
+  Developers thus obtain the ability to \emph{override} the constraints
+  on usages of values with static type \VOID.
+  This means that it is not enforced that such values are discarded,
+  but they can only be used when the wish to do so
+  has been indicated explicitly.%
+  }
+\item
+  In a parenthesized expression \code{($e$)}, $e$ may have type \VOID.
+  \rationale{%
+  Note that \code{($e$)} itself has type \VOID,
+  which implies that it must occur in some context
+  where it is not an error to have it.%
+  }
+\item
+  In a conditional expression \code{$e$\,?\,$e_1$\,:\,$e_2$},
+  $e_1$ and $e_2$ may have type \VOID.
+  \rationale{%
+  The static type of the conditional expression is then \VOID,
+  even if one of the branches has a different type,
+  which means that the conditional expression must again occur
+  in some context where it is not an error to have it.%
+  }
+\item
+  In a null coalescing expression \code{$e_1$\,??\,$e_2$},
+  $e_2$ may have type \VOID.
+  \rationale{%
+  The static type of the null coalescing expression is then \VOID,
+  which in turn restricts where it can occur.%
+  }
+\item
+  \commentary{%
+  In a return statement \code{\RETURN\,$e$;},
+  $e$ may have type \VOID{} in a number of situations
+  (\ref{return}).%
+  }
+\item
+  \commentary{%
+  In an arrow function body \code{=> $e$},
+  the returned expression $e$ may have type \VOID{}
+  in a number of situations
+  (\ref{functions}).%
+  }
+\item
+  An initializing expression for a variable of type \VOID{}
+  may have type \VOID.
+  \rationale{Usages of that variable are constrained.}
+\item
+  An actual parameter expression corresponding to a formal parameter
+  whose statically known type annotation is \VOID{}
+  may have type \VOID.
+  \rationale{%
+  Usages of that parameter in the body of the callee
+  are statically expected to be constrained by having type \VOID.
+  See the discussion about soundness below
+  (\ref{voidSoundness}).
+  }
+\item
+  In an expression of the form \code{$e_1$\,=\,$e_2$}
+  where $e_1$ is an \synt{assignableExpression}
+  denoting a variable or formal parameter of type \VOID{},
+  $e_2$ may have type \VOID.
+  \rationale{%
+  Usages of that variable or formal parameter
+  are statically expected to be constrained by having type \VOID.
+  See the discussion about soundness below
+  (\ref{voidSoundness}).
+  }
+\item
+  Let $e$ be an expression ending in a \synt{cascadeSection}
+  of the form \code{..\,$S$\,$s$\;=\;$e_1$},
+  where $S$ is of the form
+
+  \noindent
+  \syntax{(<cascadeSelector> <argumentPart>*)
+    (<assignableSelector> <argumentPart>*)*}
+
+  \noindent
+  and $e_1$ is of the form \synt{expressionWithoutCascade}.
+
+  If $s$ is an \synt{assignableSelector} of the
+  form \code{.\id} or \code{?.\id}
+  where the static type of the identifier \id{} is \VOID,
+  $e_1$ may have type \VOID.
+  Otherwise, if $s$ is an \synt{assignableSelector} of the form
+  \code{[$\,e_0\,$]} where the static type of
+  the first formal parameter in the statically known declaration
+  of operator \code{[]=} is \VOID,
+  $e_0$ may have type \VOID.
+  Also, if the static type of the second formal parameter is \VOID,
+  $e_1$ may have type \VOID.
 \end{itemize}
 
-The analogous rules also hold for the $<<$ relation for similar reasons.
+\LMHash{}%
+Finally, we need to address situations involving implicit usage of
+a value whose static type can be \VOID{}.
+%
+It is a compile-time error for a for-in statement to have an iterator
+expression of type $T$ such that \code{Iterator<\VOID{}>}
+is the most specific instantiation of \code{Iterator}
+that is a superinterface of $T$, unless the
+iteration variable has type \VOID.
+%
+It is a compile-time error for an asynchronous for-in statement
+to have a stream expression of type $T$
+such that \code{Stream<\VOID{}>} is the most specific
+instantiation of \code{Stream} that is a superinterface of $T$,
+unless the iteration variable has type \VOID.
 
-Hence, the static checker will issue errors if one attempts to access a member of the result of a void method invocation (even for members of the null object (\ref{null}), such as \code{==}).
-Likewise, passing the result of a void method as a parameter or assigning it to a variable will raise an error unless the variable/formal parameter has type dynamic.
-
-On the other hand, it is possible to return the result of a void method from within a void method.
-One can also return the null object (\ref{null}); or a value of type \DYNAMIC{}.
-Returning any other result will cause a compile-time error.
-%% TODO(eernst): Correct this when integrating generalized-void.md.
-A dynamic type error would arise if a non-null object was returned from a void method (since no object has run-time type \DYNAMIC{}).
+\commentary{%
+Here are some examples:
 }
 
-\commentary{
-The name \VOID{} does not denote a \code{Type} object.
+\begin{dartCode}
+\FOR{} (Object x in <\VOID>[]) \{\} // \comment{Error.}
+\AWAIT{} \FOR{} (int x \IN{} new Stream<\VOID{}>.empty()) \{\} // \comment{Error.}
+\FOR{} (\VOID{} x \IN{} <\VOID{}>[]) \{\ldots\} // \comment{OK.}
+\FOR (\VAR{} x \IN{} <\VOID{}>[]) \{\ldots\} // \comment{OK, type of x inferred.}
+\end{dartCode}
+
+\commentary{%
+However, in the examples that are not errors
+the usage of \code{x} in the loop body is constrained,
+because it has type \VOID.%
 }
 
-\rationale{
-It is syntacticly illegal to use \VOID{} as an expression, and it would make no sense to do so.
-Type objects reify the run-time types of instances.
-No instance ever has type \VOID{}.
+\paragraph{Void Soundness}
+\LMLabel{voidSoundness}
+
+\LMHash{}%
+The constraints on usage of a value obtained from the evaluation of
+an expression with static type \VOID{}
+are not strictly enforced.
+
+\commentary{%
+The usage of a ``void value'' is not a soundness issue, that is,
+no invariants needed for correct execution of a Dart program
+can be violated because of such a usage.
+}
+
+\rationale{%
+It could be said that the type \VOID{} is used
+to help developers maintain a certain self-imposed discipline
+about the fact that certain objects are not \emph{intended} to be used.
+%
+Because of the fact that enforcement is not necessary,
+and because of the treatment of \VOID{} in earlier versions of Dart,
+the language uses a \emph{best effort} approach to ensure
+that the value of an expression of type \VOID{}
+will not be used.%
+}
+
+\commentary{%
+In fact, there are numerous ways in addition to the type cast
+in which a developer can get access to such a value:%
+}
+
+\begin{dartCode}
+\ABSTRACT{} \CLASS A<X> \{
+  final X x;
+  A(this.x);
+  Object foo(X x);
+\}
+\\
+\CLASS{} B<X> \EXTENDS{} A<X> \{
+  B(X x): super(x);
+  Object foo(Object x) => x;
+\}
+\\
+Object f<X>(X x) => x;
+\\
+\VOID{} main() \{
+  \VOID x = 42;
+  print(f(x)); // \comment{(1)}
+  \\
+  A<\VOID{}> a = B<\VOID{}>(x);
+  A<Object> aObject = a;
+  print(aObject.x); // \comment{(2)}
+  print(a.foo(x)); // \comment{(3)}
+\}
+\end{dartCode}
+
+\commentary{%
+At (1), a variable \code{x} of type \VOID{} is passed to
+a generic function \code{f},
+which is allowed because the actual type argument \VOID{} is inferred,
+and it is allowed to pass an actual argument of type \VOID{} to
+a formal parameter with the same type.
+%
+However, no special treatment is given when an expression has a type
+which is or contains a type variable whose value could be \VOID{},
+so we are allowed to return \code{x} in the body of \code{f},
+even though this means that we indirectly get access to the value
+of an expression of type \VOID{}, under the static type \code{Object}.
+
+At (2), we indirectly obtain access to the value of
+the variable \code{x} with type \VOID{},
+because we use an assignment to get access to the instance of \code{B}
+which was created with type argument \VOID{} under the type
+\code{A<Object>}.
+Note that \code{A<Object>} and \code{A<\VOID{}>} are subtypes of each other,
+that is, they are equivalent according to the subtype rules,
+so neither static nor dynamic type checks will fail.
+
+At (3), we indirectly obtain access to the value of
+the variable \code{x} with type \VOID{}
+under the static type \code{Object},
+because the statically known method signature of \code{foo}
+has parameter type \VOID{},
+but the actual implementation of \code{foo} which is invoked
+is an override whose parameter type is \code{Object},
+which is allowed because \code{Object} and \VOID{} are both top types.%
+}
+
+\rationale{%
+Obviously, the support for preventing developers from using values
+obtained from expressions of type \VOID{} is far from sound,
+in the sense that there are many ways to circumvent the rule
+that such a value should be discarded.
+
+However, we have chosen to focus on the simple, first-order usage
+(where an expression has type \VOID, and the value is used),
+and we have left higher-order cases largely unchecked,
+relying on additional tools such as linters to perform an analysis
+which covers indirect data flows.
+
+It would certainly have been possible to define sound rules,
+such that the value of an expression of type \VOID{}
+would be guaranteed to be discarded after some number of transfers
+from one variable or parameter to the next one, all with type \VOID{},
+explicitly, or as the value of a type parameter.
+In particular, we could require that method overrides should
+never override return type \code{Object} by return type \VOID{},
+or parameter types in the opposite direction;
+parameterized types with type argument \VOID{} could not be assigned
+to variables where the corresponding type argument is anything other than
+\VOID, etc.\ etc.
+
+But this would be quite impractical.
+In particular, the need to either prevent a large number of type variables
+from ever having the value \VOID{},
+or preventing certain usages of values whose type is such a type variable,
+or whose type contains such a type variable,
+that would be severely constraining on a very large part of all Dart code.
+
+So we have chosen to help developers maintain this self-imposed discipline
+in simple and direct cases,
+and leave it to ad-hoc reasoning or separate tools to ensure
+that the indirect cases are covered as closely as needed in practice.%
 }
 
 
@@ -11537,7 +14518,7 @@
 % (\code{var f = foo<int>;}), or if we allow it to arise implicitly based
 % on inference. That new concept should probably be added to this section.
 
-\LMHash{}
+\LMHash{}%
 A \emph{parameterized type} is a syntactic construct where the name of a generic type declaration is applied to a list of actual type arguments.
 A \emph{generic instantiation} is the operation where a generic type is applied to actual type arguments.
 
@@ -11546,10 +14527,10 @@
 When using the former, we will often leave the latter implicit.
 }
 
-\LMHash{}
+\LMHash{}%
 Let $T$ be a parameterized type \code{$G$<$S_1, \ldots,\ S_n$>}.
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $G$ is not a generic type,
 or $G$ is a generic type, but the number of formal type parameters in the declaration of $G$ is not $n$.
 Otherwise, let
@@ -11558,20 +14539,20 @@
 $B_1, \ldots, B_n$
 be the corresponding upper bounds, using \DYNAMIC{} when no bound is declared.
 
-\LMHash{}
-$T$ is {\em malbounded} if{}f either
+\LMHash{}%
+$T$ is \Index{malbounded} if{}f either
 $S_i$ is malbounded for one or more $i \in 1 .. n$,
 or $T$ is not well-bounded (\ref{superBoundedTypes}).
 
-\LMHash{}
+\LMHash{}%
 It is a compile-time error if $T$ is malbounded.
 
-\LMHash{}
+\LMHash{}%
 $T$ is evaluated as follows.
 Let $t_i$ be the result of evaluating $S_i$, for $i \in 1 .. n$.
 $T$ then evaluates to the generic instantiation where $G$ is applied to $t_1, \ldots, t_n$.
 
-\LMHash{}
+\LMHash{}%
 Let $T$ be a parameterized type of the form
 \code{$G$<$A_1, \ldots,\ A_n$>}
 and assume that $T$ is not malformed and not malbounded.
@@ -11606,7 +14587,7 @@
 % even if it is a recursive invocation on the form \code{foo<C<X>>()} in the
 % body.
 
-\LMHash{}
+\LMHash{}%
 Let $T$ be the declared type of a declaration $d$,
 as it appears in the program source.
 Let $X_1, \ldots, X_n$ be the formal type parameters in scope at $d$.
@@ -11614,7 +14595,7 @@
 $X_1, \ldots, X_n$
 are
 $t_1, \ldots, t_n$,
-the {\em actual type} of $d$ is
+the \Index{actual type} of $d$ is
 $[t_1/X_1, \ldots, t_n/X_n]T$.
 
 \commentary{
@@ -11625,7 +14606,7 @@
 one or more enclosing generic functions and an enclosing generic class.
 }
 
-\LMHash{}
+\LMHash{}%
 Let \code{$X$ \EXTENDS{} $B$} be a formal type parameter declaration.
 Let
 $X_1, \ldots, X_n$
@@ -11634,7 +14615,7 @@
 $X_1, \ldots, X_n$
 are
 $t_1, \ldots, t_n$,
-the {\em actual bound} for $X$ is
+the \Index{actual bound} for $X$ is
 $[t_1/X_1, \ldots, t_n/X_n]B$.
 
 \commentary{
@@ -11650,7 +14631,7 @@
 % into account, but no other changes have been performed. Hence, we still
 % need to update this section to use Dart 2 rules for LUB.
 
-\LMHash{}
+\LMHash{}%
 % does this diverge in some cases?
 Given two interfaces $I$ and $J$,
 let $S_I$ be the set of superinterfaces of $I$,
@@ -11665,20 +14646,23 @@
 which must exist because $S_0$ is $\{\code{Object}\}$.
 The least upper bound of $I$ and $J$ is the sole element of $S_q$.
 
-\LMHash{}
+\LMHash{}%
 The least upper bound of \DYNAMIC{} and any type $T$ is \DYNAMIC{}.
 The least upper bound of \VOID{} and any type $T \ne \DYNAMIC{}$ is \VOID{}.
 The least upper bound of $\bot$ and any type $T$ is $T$.
 Let $U$ be a type variable with upper bound $B$.
 The least upper bound of $U$ and a type $T \ne \bot$ is the least upper bound of $B$ and $T$.
 
-\LMHash{}
+\LMHash{}%
 The least upper bound operation is commutative and idempotent,
 but it is not associative.
 
 % Function types
 
-\LMHash{}
+%% TODO(eernst): This section should use the new syntax for function types
+%% (\FunctionTypePositionalStd{} etc.); these updates are made by CL 84908.
+
+\LMHash{}%
 The least upper bound of a function type and an interface type $T$ is the least upper bound of \FUNCTION{} and $T$.
 Let $F$ and $G$ be function types.
 If $F$ and $G$ differ in their number of required parameters,
@@ -11741,7 +14725,7 @@
 \subsection{Lexical Rules}
 \LMLabel{lexicalRules}
 
-\LMHash{}
+\LMHash{}%
 Dart source text is represented as a sequence of Unicode code points.
 This sequence is first converted into a sequence of tokens according to the lexical rules given in this specification.
 At any point in the tokenization process, the longest possible token is recognized.
@@ -11750,8 +14734,8 @@
 \subsubsection{Reserved Words}
 \LMLabel{reservedWords}
 
-\LMHash{}
-A {\em reserved word} may not be used as an identifier; it is a compile-time error if a reserved word is used where an identifier is expected.
+\LMHash{}%
+A \Index{reserved word} may not be used as an identifier; it is a compile-time error if a reserved word is used where an identifier is expected.
 
 \ASSERT{}, \BREAK{}, \CASE{}, \CATCH{}, \CLASS{}, \CONST{}, \CONTINUE{}, \DEFAULT{}, \DO{}, \ELSE{}, \ENUM{}, \EXTENDS{}, \FALSE{}, \FINAL{}, \FINALLY{}, \FOR{}, \IF{}, \IN{}, \IS{}, \NEW{}, \NULL{}, \RETHROW, \RETURN{}, \SUPER{}, \SWITCH{}, \THIS{}, \THROW{}, \TRUE{}, \TRY{}, \VAR{}, \VOID{}, \WHILE{}, \WITH{}.
 
@@ -11768,40 +14752,43 @@
 \subsubsection{Comments}
 \LMLabel{comments}
 
-\LMHash{}
-{\em Comments} are sections of program text that are used for documentation.
+\LMHash{}%
+\IndexCustom{Comments}{comment}
+are sections of program text that are used for documentation.
 
 \begin{grammar}
 <SINGLE\_LINE\_COMMENT> ::= `//' \~{}(<NEWLINE>)* (<NEWLINE>)?
 
-<MULTI\_LINE\_COMMENT> ::= `/*' (<MULTI\_LINE\_COMMENT> | \~{} `*/')* `*/'
+<MULTI\_LINE\_COMMENT> ::= \gnewline{}
+  `/*' (<MULTI\_LINE\_COMMENT> | \~{} `*/')* `*/'
 \end{grammar}
 
-\LMHash{}
+\LMHash{}%
 Dart supports both single-line and multi-line comments.
-A {\em single line comment} begins with the token \code{//}.
+A \Index{single line comment} begins with the token \code{//}.
 Everything between \code{//} and the end of line must be ignored by the Dart compiler unless the comment is a documentation comment.
 
-\LMHash{}
-A {\em multi-line comment} begins with the token \code{/*} and ends with the token \code{*/}.
+\LMHash{}%
+A \Index{multi-line comment} begins with the token \code{/*} and ends with the token \code{*/}.
 Everything between \code{/}* and \code{*}/ must be ignored by the Dart compiler unless the comment is a documentation comment.
 Comments may nest.
 
-\LMHash{}
-{\em Documentation comments} are comments that begin with the tokens \code{///} or \code{/**}.
+\LMHash{}%
+\IndexCustom{Documentation comments}{documentation comments}
+are comments that begin with the tokens \code{///} or \code{/**}.
 Documentation comments are intended to be processed by a tool that produces human readable documentation.
 
-\LMHash{}
+\LMHash{}%
 The scope of a documentation comment immediately preceding the declaration of a class $C$ is the instance scope of $C$.
 
-\LMHash{}
+\LMHash{}%
 The scope of a documentation comment immediately preceding the declaration of a function $f$ is the scope in force at the very beginning of the body of $f$.
 
 
 \subsection{Operator Precedence}
 \LMLabel{operatorPrecedence}
 
-\LMHash{}
+\LMHash{}%
 Operator precedence is given implicitly by the grammar.
 
 \commentary{
@@ -11849,6 +14836,160 @@
 }
 
 
+\section*{Appendix: Algorithmic Subtyping}
+\LMLabel{algorithmicSubtyping}
+
+% Subtype Rule Numbering
+\newcommand{\AppSrnReflexivity}{\ensuremath{1_{\scriptsize\mbox{algo}}}}
+\newcommand{\AppSrnTypeVariableReflexivityB}{\SrnTypeVariableReflexivityA.1}
+\newcommand{\AppSrnTypeVariableReflexivityC}{\SrnTypeVariableReflexivityA.2}
+\newcommand{\AppSrnTypeVariableReflexivityD}{\SrnTypeVariableReflexivityA.3}
+\newcommand{\AppSrnRightFutureOrC}{\SrnRightFutureOrB.1}
+\newcommand{\AppSrnRightFutureOrD}{\SrnRightFutureOrB.2}
+
+\begin{figure}[h!]
+  \def\VSP{\vspace{3mm}}
+  \def\ExtraVSP{\vspace{1mm}}
+  \def\Axiom#1#2#3#4{\centerline{\inference[#1]{}{\SubtypeStd{#3}{#4}}}\VSP}
+  \def\Rule#1#2#3#4#5#6{\centerline{\inference[#1]{\SubtypeStd{#3}{#4}}{\SubtypeStd{#5}{#6}}}\VSP}
+  \def\RuleTwo#1#2#3#4#5#6#7#8{%
+    \centerline{\inference[#1]{\SubtypeStd{#3}{#4} & \SubtypeStd{#5}{#6}}{\SubtypeStd{#7}{#8}}}\VSP}
+  \def\RuleRaw#1#2#3#4#5{%
+    \centerline{\inference[#1]{#3}{\SubtypeStd{#4}{#5}}}\VSP}
+  \def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
+  %
+  \begin{minipage}[c]{0.49\textwidth}
+    \RuleRaw{\AppSrnReflexivity}{Reflexivity}{S\mbox{ not composite}}{S}{S}
+    \Rule{\AppSrnTypeVariableReflexivityC}{Type Variable Reflexivity B}{X}{T}{X}{X \& T}
+    \Rule{\AppSrnRightFutureOrC}{Right FutureOr C}{\Gamma(X)}{\code{FutureOr<$T$>}}{X}{\code{FutureOr<$T$>}}
+  \end{minipage}
+  \begin{minipage}[c]{0.49\textwidth}
+    \Axiom{\AppSrnTypeVariableReflexivityB}{Type Variable Reflexivity}{X}{X}
+    \Rule{\AppSrnTypeVariableReflexivityD}{Type Variable Reflexivity C}{X \& S}{T}{X \& S}{X \& T}
+    \Rule{\AppSrnRightFutureOrD}{Right FutureOr D}{S}{\code{FutureOr<$T$>}}{X \& S}{\code{FutureOr<$T$>}}
+  \end{minipage}
+  %
+  \caption{Algorithmic subtype rules.
+    Rules \SrnTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
+  \label{fig:algorithmicSubtypeRules}
+\end{figure}
+
+\LMHash{}%
+The text in this appendix is not part of the specification of the Dart language.
+However, we still use the notation where precise information
+uses the style associated with normative text in the specification (this style),
+\commentary{whereas examples and explanations use commentary style (like this)}.
+
+\LMHash{}%
+This appendix presents a variant of the subtype rules given
+in Figure~\ref{fig:subtypeRules} on page~\pageref{fig:subtypeRules}.
+
+\commentary{%
+The rules will prove the same set of subtype relationships,
+but the rules given here show that there is an efficient implementation
+that will determine whether \SubtypeStd{S}{T} holds,
+for any given types $S$ and $T$.
+It is easy to see that the algorithmic rules will prove at most
+the same subtype relationships,
+because all rules given here can be proven
+by means of rules in Figure~\ref{fig:subtypeRules}.
+It is also relatively straightforward to sketch out proofs
+that the algorithmic rules can prove at least the same subtype relationships,
+also when the following ordering and termination constraints are observed.
+}
+
+\LMHash{}%
+The only rule which is modified is number~\SrnReflexivity{},
+which is modified to \AppSrnReflexivity{}.
+This only changes the applicability of the rule:
+This rule is only used for types which are not atomic.
+An \IndexCustom{atomic type}{type!atomic}
+is a type which is not a type variable,
+not a promoted type variable,
+not a function type,
+and not a parameterized type.
+
+\commentary{%
+In other words, rule \AppSrnReflexivity{} is used for
+special types like \DYNAMIC{}, \VOID{}, and \FUNCTION{},
+and it is used for non-generic classes,
+but it is not used for any type where it is an operation
+that takes more than one comparison to detect whether
+it is the same as some other type.
+%
+The point is that the remaining rules will force
+a structural traversal anyway, as far as needed,
+and we may hence just as well omit the initial structural traversal
+which might take many steps only to report that two large type terms
+are not quite identical.
+}
+
+\LMHash{}%
+The rules are ordered by means of their rule numbers:
+A rule given here numbered $N.1$ is inserted immediately after rule $N$,
+followed by rule $N.2$, and so on,
+followed by the rule whose number is $N+1$.
+\commentary{%
+So the order is
+\AppSrnReflexivity, \SrnTop--\SrnTypeVariableReflexivityA,
+\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
+\AppSrnTypeVariableReflexivityD,
+\SrnRightPromotedVariable, and so on.%
+}
+
+\LMHash{}%
+We now specify the procedure which is used to determine whether
+\SubtypeStd{S}{T} holds,
+for some specific types $S$ and $T$:
+Select the first rule $R$ whose syntactic constraints are satisfied
+by the given types $S$ and $T$,
+and proceed to show that its premises hold.
+If so, we terminate and conclude that the subtype relationship holds.
+Otherwise we terminate and conclude
+that the subtype relationship does not hold,
+except if $R$ is
+\SrnRightFutureOrA, \SrnRightFutureOrB,
+\AppSrnRightFutureOrC, or \AppSrnRightFutureOrD.
+\commentary{%
+In particular, for the original query \SubtypeStd{S}{T},
+we do not backtrack into trying to use a rule that has
+a higher rule number than that of $R$,
+except that we may try all of
+the rules with \code{FutureOr<$T$>} to the right.
+}
+
+\commentary{%
+Apart from the fact that the full complexity of subtyping
+is potentially incurred each time it is checked whether a premise holds,
+the checks applied for each rule is associated with an amount of work
+which is constant for all rules except the following:
+First, the group of rules
+\SrnRightFutureOrA, \SrnRightFutureOrB,
+\AppSrnRightFutureOrC, and \AppSrnRightFutureOrD{}
+may cause backtracking to take place.
+Next, rules \SrnPositionalFunctionType--\SrnCovariance{}
+require work proportional to the size of $S$ and $T$,
+due to the number of premises that must be checked.
+Finally, rule~\SrnSuperinterface{} requires work proportional to the size of $S$,
+and it may also incur the cost of searching up to the entire set of
+direct and indirect superinterfaces of the candidate subtype $S$,
+until the corresponding premise for one of them is shown to hold,
+if any.
+
+Additional optimizations are applicable.
+For instance,
+we can immediately conclude that the subtype relationship does not hold
+when we are about to check rule~\SrnSuperinterface{}
+if $T$ is a type variable or a function type.
+For several other forms of type, e.g.,
+a promoted type variable,
+\code{Object}, \DYNAMIC{}, \VOID{},
+\code{FutureOr<$T$>} for any $T$, or \FUNCTION{},
+it is known that it will never occur as $T$ for rule~\SrnSuperinterface{},
+which means that this seemingly expensive step can be confined to some extent.
+}
+
+
 \section*{Appendix: Integer Implementations}
 \LMLabel{integerImplementations}
 
@@ -11864,7 +15005,7 @@
 \item[$\bullet$]
 Valid values of JavaScript \code{int} are any
 IEEE-754 64-bit floating point number with no fractional part.
-This includes positive and negative {\em infinity},
+This includes positive and negative \Index{infinity},
 which can be reached by overflowing
 (integer division by zero is still not allowed).
 Otherwise valid integer literals (including any leading minus sign)
@@ -11876,7 +15017,8 @@
 JavaScript \code{int} instances also implement \code{double},
 and integer-valued \code{double} instances also implement \code{int}.
 The \code{int} and \code{double} class are still separate subclasses of the
-class \code{num}, but {\em instances} of either class that represent an integer,
+class \code{num},
+but \emph{instances} of either class that represent an integer
 act as if they are actually instances of a common subclass implementing both
 \code{int} and \code{double}. Fractional numbers only implement \code{double}.
 \item[$\bullet$]
@@ -11884,12 +15026,14 @@
 all truncate the operands to 32-bit values.
 \item[$\bullet$]
 The \code{identical} method cannot distinguish the values $0.0$ and $-0.0$,
-and it cannot recognize any {\em NaN} value as identical to itself.
+and it cannot recognize any \Index{NaN} value as identical to itself.
 For efficiency, the \code{identical} operation uses the JavaScript \code{===}
 operator.
 \end{itemize}
 }
 
+\printindex
+
 \end{document}
 
 [Text after \end{document} is ignored, hence we do not need "%"]
diff --git a/docs/language/informal/covariant-from-class.md b/docs/language/informal/covariant-from-class.md
index 2cdb696..06d54bf 100644
--- a/docs/language/informal/covariant-from-class.md
+++ b/docs/language/informal/covariant-from-class.md
@@ -2,7 +2,8 @@
 
 **Owner**: eernst@
 
-**Status**: Implemented.
+**Status**: This document is now background material.
+For normative text, please consult the language specification.
 
 **Version**: 0.6 (2018-06-01)
 
diff --git a/docs/language/informal/covariant-overrides.md b/docs/language/informal/covariant-overrides.md
index f0f415e..dc0b83b 100644
--- a/docs/language/informal/covariant-overrides.md
+++ b/docs/language/informal/covariant-overrides.md
@@ -2,7 +2,8 @@
 
 **Owner**: rnystrom@, eernst@.
 
-**Status**: Implemented.
+**Status**: This document is now background material.
+For normative text, please consult the language specification.
 
 **Version**: 1.1 (Oct 10, 2017).
 
diff --git a/docs/language/informal/dynamic-members.md b/docs/language/informal/dynamic-members.md
index 07a8371..78c070d 100644
--- a/docs/language/informal/dynamic-members.md
+++ b/docs/language/informal/dynamic-members.md
@@ -4,7 +4,7 @@
 
 **Version**: 0.2 (2018-09-04)
 
-**Status**: Under implementation.
+**Status**: Background material. Normative text is now in dartLangSpec.tex.
 
 **This document** is a Dart 2 feature specification of the static typing
 of instance members of a receiver whose static type is `dynamic`.
diff --git a/docs/language/informal/generalized-void.md b/docs/language/informal/generalized-void.md
index e3ae956..4b3bea1 100644
--- a/docs/language/informal/generalized-void.md
+++ b/docs/language/informal/generalized-void.md
@@ -4,7 +4,8 @@
 
 **Version**: 0.10 (2018-07-10)
 
-**Status**: Implemented.
+**Status**: This document is now background material.
+For normative text, please consult the language specification.
 
 **This document** is a feature specification of the generalized support
 in Dart 2 for the type `void`.
diff --git a/docs/language/informal/generic-function-type-alias.md b/docs/language/informal/generic-function-type-alias.md
index f03c5cc..2318146 100644
--- a/docs/language/informal/generic-function-type-alias.md
+++ b/docs/language/informal/generic-function-type-alias.md
@@ -1,6 +1,6 @@
 # Feature: Generic Function Type Alias
 
-**Status**: Implemented.
+**Status**: Background material. Normative text is now in dartLangSpec.tex.
 
 **This document** is an informal specification of a feature supporting the
 definition of function type aliases using a more expressive syntax than the
diff --git a/docs/language/informal/instantiate-to-bound.md b/docs/language/informal/instantiate-to-bound.md
index dfe36bc..e54f47d 100644
--- a/docs/language/informal/instantiate-to-bound.md
+++ b/docs/language/informal/instantiate-to-bound.md
@@ -2,7 +2,7 @@
 
 **Author**: eernst@
 
-**Version**: 0.8 (2018-09-26)
+**Version**: 0.10 (2018-10-31)
 
 **Status**: Implemented.
 
@@ -133,7 +133,7 @@
 never because `X` is contained in the body of a type alias, it will always
 be as a syntactic subterm of _B_.*
 
-Let _G_ be a generic class or parameterized type alias with _k_ formal type
+Let _G_ be a generic class or generic type alias with _k_ formal type
 parameter declarations containing formal type parameters
 _X<sub>1</sub> .. X<sub>k</sub>_ and bounds
 _B<sub>1</sub> .. B<sub>k</sub>_. We say that the formal type parameter
@@ -145,17 +145,17 @@
 2. _B<sub>j</sub>_ is included, but does not contain any of _X<sub>1</sub>
    .. X<sub>k</sub>_. If _B<sub>j</sub>_ contains a type _T_ of the form
    `typeName` (*for instance, `C` or `p.D`*) which denotes a generic class
-   or parameterized type alias _G<sub>1</sub>_ (*that is, _T_ is a raw type*),
+   or generic type alias _G<sub>1</sub>_ (*that is, _T_ is a raw type*),
    every type argument of _G<sub>1</sub>_ has a simple bound.
 
 The notion of a simple bound must be interpreted inductively rather than
 coinductively, i.e., if a bound _B<sub>j</sub>_ of a generic class or
-parameterized type alias _G_ is reached during an investigation of whether
+generic type alias _G_ is reached during an investigation of whether
 _B<sub>j</sub>_ is a simple bound, the answer is no.
 
 *For example, with `class C<X extends C> {}` the type parameter `X` does
-not have a simple bound: A raw `C` is used as a bound for `X`, so `C` 
-must have simple bounds, but one of the bounds of `C` is the bound of `X`, 
+not have a simple bound: A raw `C` is used as a bound for `X`, so `C`
+must have simple bounds, but one of the bounds of `C` is the bound of `X`,
 and that bound is `C`, so `C` must have simple bounds: Cycle, hence error!*
 
 *We can now specify in which sense instantiate to bound requires the
@@ -174,7 +174,7 @@
 simple bound.*
 
 When a type annotation _T_ on the form `typeName` denotes a generic class
-or parameterized type alias (*so _T_ is raw*), instantiate to bound is used
+or generic type alias (*so _T_ is raw*), instantiate to bound is used
 to provide the missing type argument list. It is a compile-time error if
 the instantiate to bound process fails.
 
@@ -200,7 +200,7 @@
 the actual type arguments must be computed.*
 
 Let _T_ be a `typeName` term which denotes a generic class or
-parameterized type alias _G_ (*so _T_ is a raw type*), let
+generic type alias _G_ (*so _T_ is a raw type*), let
 _F<sub>1</sub> .. F<sub>k</sub>_ be the formal type
 parameter declarations in the declaration of _G_, with type parameters
 _X<sub>1</sub> .. X<sub>k</sub>_ and bounds _B<sub>1</sub>
@@ -228,7 +228,8 @@
 on, every type variable in its bound, possibly including itself*).
 Let _==><sub>m</sub>_ be the transitive closure of _--><sub>m</sub>_.
 For each _m_, let _U<sub>i,m+1</sub>_, for _i_ in _1 .. k_, be determined
-by the following iterative process:
+by the following iterative process, where _V<sub>m</sub>_ denotes
+_G&lt;U<sub>1,m</sub>, U<sub>k,m</sub>&gt;_:
 
 1. If there exists a _j_ in _1 .. k_ such that
    _X<sub>j</sub> ==><sub>m</sub> X<sub>j</sub>_
@@ -246,9 +247,11 @@
    _U<sub>i,m+1</sub> = U<sub>i,m</sub>_.
    Otherwise there exists a _q_ such that _X<sub>i</sub>_ belongs to
    _M<sub>q</sub>_; _U<sub>i,m+1</sub>_ is then obtained from _U<sub>i,m</sub>_
-   by replacing every covariant occurrence of a variable in _M<sub>q</sub>_ by
-   `dynamic`, and replacing every contravariant occurence of a variable in
-   _M<sub>q</sub>_ by `Null`.
+   by substituting `dynamic` for every occurrence of a variable
+   in _M<sub>q</sub>_ that is in a covariant or invariant position
+   in _V<sub>m</sub>_, and substituting `Null` for every occurrence of
+   a variable in _M<sub>q</sub>_ that is in a contravariant position
+   in _V<sub>m</sub>_.
 
 2. Otherwise, (*if no dependency cycle exists*) let _j_ be the lowest number
    such that _X<sub>j</sub>_ occurs in _U<sub>p,m</sub>_ for some _p_ and
@@ -257,9 +260,11 @@
    _X<sub>j</sub>_ does not contain any type variables; but _X<sub>j</sub>_ is
    being depended on by the bound of some other type variable*).
    Then, for all _i_ in _1 .. k_, _U<sub>i,m+1</sub>_ is obtained from
-   _U<sub>i,m</sub>_ by replacing every covariant occurrence of _X<sub>j</sub>_
-   by _U<sub>j,m</sub>_, and replacing every contravariant occurrence of
-   _X<sub>j</sub>_ by `Null`.
+   _U<sub>i,m</sub>_ by substituting _U<sub>j,m</sub>_ for every occurrence
+   of _X<sub>j</sub>_ which occurs in a covariant or invariant position in
+   _V<sub>m</sub>_, and substituting `Null` for every occurrence of
+   _X<sub>j</sub>_ which occurs in a contravariant position in
+   _V<sub>m</sub>_.
 
 3. Otherwise, (*when no dependencies exist*) terminate with the result
    _&lt;U<sub>1,m</sub> ..., U<sub>k,m</sub>&gt;_.
@@ -272,6 +277,57 @@
 *Note that this process may produce a
 [super-bounded type](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/super-bounded-types.md).*
 
+*It may seem somewhat arbitrary to treat unused and invariant parameters
+the same as covariant parameters. In particular, we could easily have made
+every attempt to use instantiate to bound an error, when applied to a type
+where invariance occurs anywhere during the run of the algorithm. However,
+there are a number of cases where this choice produces a usable type, and
+we decided that it is not helpful to outlaw such cases:*
+
+```dart
+typedef Inv<X> = X Function(X);
+class B<Y extends num, Z extends Inv<Y>> {}
+
+B b; // The raw `B` means `B<num, Inv<num>>`.
+```
+
+*It is then possible to store an instance of, say,
+`B<int, int Function(num)>` in `b`. It should be noted, however, that
+any occurrence of invariance during instantiate to bound is likely to
+cause the resulting type to not be a common supertype of all the types
+that may be expressed by passing explicit type arguments. This means that
+a raw type involving invariance cannot be considered to denote the type
+"that allows all values for the actual type arguments". For instance,
+`b` above cannot refer to an instance of `B<int, Inv<int>>`, because
+`Inv<int>` is not a subtype of `Inv<num>`.*
+
+It is a compile-time error if the above algorithm yields a type which is
+not well-bounded.
+
+*This kind of error can occur, as demonstrated by the following example:*
+
+```dart
+class C<X extends C<X>> {}
+typedef F<X extends C<X>> = X Function(X);
+F f; // Compile-time error.
+```
+
+*With these declarations, the raw `F` used as a type annotation is a
+compile-time error: The algorithm yields `F<C<dynamic>>`, and that is
+neither a regular-bounded nor a super-bounded type. It is conceptually
+meaningful to make this an error, even though the resulting type can be
+specified explicitly as `C<dynamic> Function(C<dynamic>)`. So that type
+exists, we just cannot obtain it by passing a type argument to `F`.
+The reason why it still makes sense to make the raw `F` an error is that
+there is no subtype relationship between `F<T1>` and `F<T2>`, even when
+`T1 <: T2` or vice versa. In particular there is no type `T` such that a
+function of type `F<T>` could be the value of a variable of type
+`C<dynamic> Function(C<dynamic>)`. So the raw `F`, if permitted, would
+not be "a supertype of `F<T>` for all possible `T`", it would be a type
+which is unrelated to `F<T>` for every single `T` that satisfies the
+bound of `F`. In that sense, it is just an extreme example of that kind
+of lack of usefulness that was mentioned for the raw `B` above.*
+
 When instantiate to bound is applied to a type it proceeds recursively: For
 a generic instantiation _G<T<sub>1</sub> .. T<sub>k</sub>>_ it is applied
 to _T<sub>1</sub> .. T<sub>k</sub>_; for a function type
@@ -297,9 +353,22 @@
 
 ## Updates
 
+*   Oct 31st 2018, version 0.10: When computing the variance of an
+    occurrence of a type variable in the instantiate-to-bound algorithm,
+    it was left implicit with respect to which type the variance was
+    computed. This update makes it explicit.
+
+*   Oct 16th 2018, version 0.9: Corrected initial value of type argument
+    to take variance into account. Corrected the value chosen at each step
+    such that the invariant case is also handled. Added requirement that
+    the parameterized type obtained from the algorithm must be checked for
+    well-boundedness. Corrected the terminology to use 'generic type alias'
+    rather than 'parameterized type alias', following the terminology used
+    in the language specification.
+
 *   Sep 26th 2018, version 0.8: Fixed unintended omission: the same rules
     that we specified for a generic class are now also specified to hold
-    for parameterized type aliases.
+    for generic type aliases.
 
 *   Feb 26th 2018, version 0.7: Revised cycle breaking algorithm for
     F-bounded type variables to avoid specifying orderings that do not matter.
diff --git a/docs/language/informal/int64.md b/docs/language/informal/int64.md
index 20d89ab..f0b4a6d 100644
--- a/docs/language/informal/int64.md
+++ b/docs/language/informal/int64.md
@@ -5,7 +5,7 @@
 
 **Version**: 2017-09-26.
 
-**Status**: Implemented.
+**Status**: Background material, the normative source is now the language specification.
 
 This document discusses Dart's plan to switch the `int` type so that it represents 64-bit integers instead of bigints. It is part of our continued effort of changing the integer type to fixed size ([issue]).
 
diff --git a/docs/language/informal/interface-conflicts.md b/docs/language/informal/interface-conflicts.md
index cd1d7f3..ebc21f2 100644
--- a/docs/language/informal/interface-conflicts.md
+++ b/docs/language/informal/interface-conflicts.md
@@ -2,7 +2,11 @@
 
 **Owner**: eernst@
 
-**Status**: Under discussion.
+**Status**: Background material, normative text is now in dartLangSpec.tex.
+Note that the rules have changed, which means that
+**this document cannot be used as a reference**, it can only be
+used to get an overview of the ideas; please refer to the language
+specification for all technical details.
 
 **Version**: 0.3 (2018-04-24)
 
diff --git a/docs/language/informal/invalid_returns.md b/docs/language/informal/invalid_returns.md
index 89215f6..6f10993 100644
--- a/docs/language/informal/invalid_returns.md
+++ b/docs/language/informal/invalid_returns.md
@@ -2,9 +2,8 @@
 
 **Owner**: leafp@google.com
 
-**Status**: Implemented.
-
-Status: Ready for implementation
+**Status**: This document is now background material.
+For normative text, please consult the language specification.
 
 **Note: Also see alternative presentation at the bottom for a dual presentation
 of these rules in terms of which things are errors, rather than which things are
diff --git a/docs/language/informal/mixin-declaration.md b/docs/language/informal/mixin-declaration.md
index 0521fc9..a4e5081 100644
--- a/docs/language/informal/mixin-declaration.md
+++ b/docs/language/informal/mixin-declaration.md
@@ -2,4 +2,4 @@
 
 **Status**: This is now background material.
 
-## The canonical version of this document now resides [here](https://github.com/dart-lang/language/blob/master/working/0006.%20Super-invocations%20in%20mixins/0007.%20Mixin%20declarations/lrhn-strawman.md).
+## The canonical version of this document now resides [here](https://github.com/dart-lang/language/blob/master/accepted/2.1/super-mixins/feature-specification.md).
diff --git a/docs/language/informal/subtyping.md b/docs/language/informal/subtyping.md
deleted file mode 100644
index 64c0f29..0000000
--- a/docs/language/informal/subtyping.md
+++ /dev/null
@@ -1,473 +0,0 @@
-# Dart 2.0 Static and Runtime Subtyping
-
-leafp@google.com
-
-**Status**: Implemented.
-
-This is intended to define the core of the Dart 2.0 static and runtime subtyping
-relation.
-
-
-## Types
-
-The syntactic set of types used in this draft are a slight simplification of
-full Dart types.
-
-The meta-variables `X`, `Y`, and `Z` range over type variables.
-
-The meta-variables `T`, `S`, `U`, and `V` range over types.
-
-The meta-variable `C` ranges over classes.
-
-The meta-variable `B` ranges over types used as bounds for type variables.
-
-As a general rule, indices up to `k` are used for type parameters and type
-arguments, `n` for required value parameters, and `m` for all value parameters.
-
-The set of types under consideration are as follows:
-
-- Type variables `X`
-- Promoted type variables `X & T` *Note: static only*
-- `Object`
-- `dynamic`
-- `void`
-- `Null`
-- `Function`
-- `Future<T>`
-- `FutureOr<T>`
-- Interface types `C`, `C<T0, ..., Tk>`
-- Function types
-  - `U Function<X0 extends B0, ...., Xk extends Bk>(T0 x0, ...., Tn xn, [Tn+1 xn+1, ..., Tm xm])`
-  - `U Function<X0 extends B0, ...., Xk extends Bk>(T0 x0, ...., Tn xn, {Tn+1 xn+1, ..., Tm xm})`
-
-We leave the set of interface types unspecified, but assume a class hierarchy
-which provides a mapping from interfaces types `T` to the set of direct
-super-interfaces of `T` induced by the superclass declaration, implemented
-interfaces, and mixins of the class of `T`.  Among other well-formedness
-constraints, the edges induced by this mapping must form a directed acyclic
-graph rooted at `Object`.
-
-The types `Object`, `dynamic` and `void` are all referred to as *top* types, and
-are considered equivalent as types (including when they appear as sub-components
-of other types).  They exist as distinct names only to support distinct errors
-and warnings (or absence thereof).
-
-The type `X & T` represents the result of a type promotion operation on a
-variable.  In certain circumstances (defined elsewhere) a variable `x` of type
-`X` that is tested against the type `T` (e.g. `x is T`) will have its type
-replaced with the more specific type `X & T`, indicating that while it is known
-to have type `X`, it is also known to have the more specific type `T`.  Promoted
-type variables only occur statically (never at runtime).
-
-Given the current promotion semantics the following properties are also true:
-   - If `X` has bound `B` then for any type `X & T`, `T <: B` will be true.
-   - Promoted type variable types will only appear as top level types: that is,
-     they can never appear as sub-components of other types, in bounds, or as
-     part of other promoted type variables.
-
-
-## Notation
-
-We use `S[T0/Y0, ..., Tk/Yk]` for the result of performing a simultaneous
-capture-avoiding substitution of types `T0, ..., Tk` for the type variables
-`Y0, ..., Yk` in the type `S`.
-
-
-## Type equality
-
-We say that a type `T0` is equal to another type `T1` (written `T0 === T1`) if
-the two types are structurally equal up to renaming of bound type variables,
-and equating all top types.
-
-TODO: make these rules explicit.
-
-
-## Algorithmic subtyping
-
-By convention the following rules are intended to be applied in top down order,
-with exactly one rule syntactically applying.  That is, rules are written in the
-form:
-
-```
-Syntactic criteria.
-  - Additional condition 1
-  - Additional or alternative condition 2
-```
-
-and it is the case that if a subtyping query matches the syntactic criteria for
-a rule (but not the syntactic criteria for any rule preceeding it), then the
-subtyping query holds iff the listed additional conditions hold.
-
-This makes the rules algorithmic, because they correspond in an obvious manner
-to an algorithm with an acceptable time complexity, and it makes them syntax
-directed because the overall structure of the algorithm corresponds to specific
-syntactic shapes. We will use the word _algorithmic_ to refer to this property.
-
-The runtime subtyping rules can be derived by eliminating all clauses dealing
-with promoted type variables.
-
-
-### Rules
-
-We say that a type `T0` is a subtype of a type `T1` (written `T0 <: T1`) when:
-
-- **Reflexivity**: `T0` and `T1` are the same type.
-  - *Note that this check is necessary as the base case for primitive types, and
-    type variables but not for composite types.  In particular, algorithmically
-    a structural equality check is admissible, but not required
-    here. Pragmatically, non-constant time identity checks here are
-    counter-productive*
-
-- **Right Top**: `T1` is a top type (i.e. `Object`, `dynamic`, or `void`).
-
-- **Left Bottom**: `T0` is `Null`
-
-- **Left FutureOr**: `T0` is `FutureOr<S0>`
-  - and `Future<S0> <: T1`
-  - and `S0 <: T1`
-
-- **Type Variable Reflexivity 1**: `T0` is a type variable `X0` or a
-promoted type variables `X0 & S0` and `T1` is `X0`.
-  - *Note that this rule is admissible, and can be safely elided if desired*
-
-- **Type Variable Reflexivity 2**: Promoted`T0` is a type variable `X0` or a
-promoted type variables `X0 & S0` and `T1` is `X0 & S1`
-  - and `T0 <: S1`.
-  - *Note that this rule is admissible, and can be safely elided if desired*
-
-- **Right Promoted Variable**: `T1` is a promoted type variable `X1 & S1`
-  - and `T0 <: X1`
-  - and `T0 <: S1`
-
-- **Right FutureOr**: `T1` is `FutureOr<S1>` and
-  - either `T0 <: Future<S1>`
-  - or `T0 <: S1`
-  - or `T0` is `X0` and `X0` has bound `S0` and `S0 <: T1`
-  - or `T0` is `X0 & S0` and `S0 <: T1`
-
-- **Left Promoted Variable**: `T0` is a promoted type variable `X0 & S0`
-  - and `S0 <: T1`
-
-- **Left Type Variable Bound**: `T0` is a type variable `X0` with bound `B0`
-  - and `B0 <: T1`
-
-- **Function Type/Function**: `T0` is a function type and `T1` is `Function`
-
-- **Interface Compositionality**: `T0` is an interface type `C0<S0, ..., Sk>`
-  and `T1` is `C0<U0, ..., Uk>`
-  - and each `Si <: Ui`
-
-- **Super-Interface**: `T0` is an interface type with super-interfaces `S0,...Sn`
-  - and `Si <: T1` for some `i`
-
-- **Positional Function Types**: `T0` is
-  `U0 Function<X0 extends B00, ..., Xk extends B0k>(V0 x0, ..., Vn xn, [Vn+1 xn+1, ..., Vm xm])`
-  - and `T1` is
-    `U1 Function<Y0 extends B10, ..., Yk extends B1k>(S0 y0, ..., Sp yp, [Sp+1 yp+1, ..., Sq yq])`
-  - and `p >= n`
-  - and `m >= q`
-  - and `Si[Z0/Y0, ..., Zk/Yk] <: Vi[Z0/X0, ..., Zk/Xk]` for `i` in `0...q`
-  - and `U0[Z0/X0, ..., Zk/Xk] <: U1[Z0/Y0, ..., Zk/Yk]`
-  - and `B0i[Z0/X0, ..., Zk/Xk] === B1i[Z0/Y0, ..., Zk/Yk]` for `i` in `0...k`
-  - where the `Zi` are fresh type variables with bounds `B0i[Z0/X0, ..., Zk/Xk]`
-
-- **Named Function Types**: `T0` is
-  `U0 Function<X0 extends B00, ..., Xk extends B0k>(V0 x0, ..., Vn xn, {Vn+1 xn+1, ..., Vm xm})`
-  - and `T1` is
-    `U1 Function<Y0 extends B10, ..., Yk extends B1k>(S0 y0, ..., Sn yn, {Sn+1 yn+1, ..., Sq yq})`
-  - and `{yn+1, ... , yq}` subsetof `{xn+1, ... , xm}`
-  - and `Si[Z0/Y0, ..., Zk/Yk] <: Vi[Z0/X0, ..., Zk/Xk]` for `i` in `0...n`
-  - and `Si[Z0/Y0, ..., Zk/Yk] <: Tj[Z0/X0, ..., Zk/Xk]` for `i` in `n+1...q`, `yj = xi`
-  - and `U0[Z0/X0, ..., Zk/Xk] <: U1[Z0/Y0, ..., Zk/Yk]`
-  - and `B0i[Z0/X0, ..., Zk/Xk] === B1i[Z0/Y0, ..., Zk/Yk]` for `i` in `0...k`
-  - where the `Zi` are fresh type variables with bounds `B0i[Z0/X0, ..., Zk/Xk]`
-
-*Note: the requirement that `Zi` are fresh is as usual strictly a requirement
-that the choice of common variable names avoid capture.  It is valid to choose
-the `Xi` or the `Yi` for `Zi` so long as capture is avoided*
-
-
-## Derivation of algorithmic rules
-
-This section sketches out the derivation of the algorithmic rules from the
-interpretation of `FutureOr` as a union type, and promoted type bounds as
-intersection types, based on standard rules for such types that do not satisfy
-the requirements for being algorithmic.
-
-
-### Non-algorithmic rules
-
-The non-algorithmic rules that we derive from first principles of union and
-intersection types are as follows:
-
-Left union introduction:
- - `FutureOr<S> <: T` if `Future<S> <: T` and `S <: T`
-
-Right union introduction:
- - `S <: FutureOr<T>` if `S <: Future<T>` or `S <: T`
-
-Left intersection introduction:
- - `X & S <: T` if `X <: T` or `S <: T`
-
-Right intersection introduction:
- - `S <: X & T` if `S <: X` and `S <: T`
-
-The only remaining non-algorithmic rule is the variable bounds rule:
-
-Variable bounds:
-  - `X <: T` if `X extends B` and `B <: T`
-
-All other rules are algorithmic.
-
-Note: We believe that bounds can be treated simply as uses of intersections,
-which could simplify this presentation.
-
-
-### Preliminaries
-
-**Lemma 1**: If there is any derivation of `FutureOr<S> <: T`, then there is a
-derivation ending in a use of left union introduction.
-
-Proof.  By induction on derivations.  Consider a derivation of `FutureOr<S> <:
-T`.
-
-If the last rule applied is:
-  - Top type rules are trivial.
-
-  - Null, Function and interface rules can't apply.
-
-  - Left union introduction rule is immediate.
-
-  - Right union introduction. Then `T` is of the form `FutureOr<T0>`, and either
-    - we have a sub-derivation of `FutureOr<S> <: Future<T0>`
-      - by induction we therefore have a derivation ending in left union
-       introduction, so by inversion we have:
-         - a derivation of `Future<S> <: Future<T0> `, and so by right union
-           introduction we have `Future<S> <: FutureOr<T0>`
-         - a derivation of `S <: Future<T0> `, and so by right union
-           introduction we have `S <: FutureOr<T0>`
-      - by left union introduction, we have `FutureOr<S> <: FutureOr<T0>`
-      - QED
-    - we have a sub-derivation of `FutureOr<S> <: T0`
-      - by induction we therefore have a derivation ending in left union
-       introduction, so by inversion we have:
-         - a derivation of `Future<S> <: T0 `, and so by right union
-           introduction we have `Future<S> <: FutureOr<T0>`
-         - a derivation of `S <: T0 `, and so by right union
-           introduction we have `S <: FutureOr<T0>`
-      - by left union introduction, we have `FutureOr<S> <: FutureOr<T0>`
-      - QED
-
-  - Right intersection introduction.  Then `T` is of the form `X & T0`, and
-     - we have sub-derivations `FutureOr<S> <: X` and `FutureOr<S> <: T0`
-     - By induction, we can get derivations of the above ending in left union
-       introduction, so by inversion we have derivations of:
-       - `Future<S> <: X`, `S <: X`, `Future<S> <: T0`, `S <: T0`
-         - so we have derivations of `S <: X`, `S <: T0`, so by right
-           intersection introduction we have
-           - `S <: X & T0`
-         - so we have derivations of `Future<S> <: X`, `Future<S> <: T0`, so by right
-           intersection introduction we have
-           - `Future<S> <: X & T0`
-     - so by left union introduction, we have a derivation of `FutureOr<S> <: X & T0`
-     - QED
-
-Note: The reverse is not true.  Counter-example:
-
-Given arbitrary `B <: A`, suppose we wish to show that `(X extends FutureOr<B>)
-<: FutureOr<A>`.  If we apply right union introduction first, we must show
-either:
-  - `X <: Future<A>`
-  - only variable bounds rule applies, so we must show
-    - `FutureOr<B> <: Future<A>`
-    - Only left union introduction applies, so we must show both of:
-      - `Future<B> <: Future<A>` (yes)
-      - `B <: Future<A>` (no)
-  - `X <: A`
-  - only variable bounds rule applies, so we must show that
-    - `FutureOr<B> <: A`
-    - Only left union introduction applies, so we must show both of:
-      - `Future<B> <: Future<A>` (no)
-      - `B <: Future<A>` (yes)
-
-On the other hand, the derivation via first applying the variable bounds rule is
-trivial.
-
-Note though that we can also not simply always apply the variable bounds rule
-first.  Counter-example:
-
-Given `X extends Object`, it is trivial to derive `X <: FutureOr<X>` via the
-right union introduction rule.  But applying the variable bounds rule doesn't
-work.
-
-**Lemma 2**: If there is any derivation of `S <: X & T`, then there is
-derivation ending in a use of right intersection introduction.
-
-Proof.  By induction on derivations.  Consider a derivation D of `S <: X & T`.
-
-If last rule applied in D is:
-  - Bottom types are trivial.
-
-  - Function and interface type rules can't apply.
-
-  - Right intersection introduction then we're done.
-
-  - Left intersection introduction. Then `S` is of the form `Y & S0`, and either
-    - we have a sub-derivation of `Y <: X & T`
-      - by induction we therefore have a derivation ending in right intersection
-       introduction, so by inversion we have:
-         - a derivation of `Y <: X `, and so by left intersection
-           introduction we have `Y & S0 <: X`
-         - a derivation of `Y <: T `, and so by left intersection
-           introduction we have `Y & S0 <: T`
-      - by right intersection introduction, we have `Y & S0 <: X & T`
-      - QED
-    - we have a sub-derivation of `S0 <: X & T`
-      - by induction we therefore have a derivation ending in right intersection
-       introduction, so by inversion we have:
-         - a derivation of `S0 <: X `, and so by left intersection
-           introduction we have `Y & S0 <: X`
-         - a derivation of `S0 <: T `, and so by left intersection
-           introduction we have `Y & S0 <: T`
-     - by right intersection introduction, we have `Y & S0 <: X & T`
-     - QED
-
-  - Left union introduction.  Then `S` is of the form `FutureOr<S0>`, and
-     - we have sub-derivations `Future<S0> <: X & T` and `S0 <: X & T`
-     - By induction, we can get derivations of the above ending in right intersection
-       introduction, so by inversion we have derivations of:
-       - `Future<S0> <: X`, `S0 <: X`, `Future<S0> <: T`, `S0 <: T`
-         - so we have derivations of `S0 <: X`, `Future<S0> <: X`, so by left
-           union introduction we have
-           - `FutureOr<S0> <: X`
-         - so we have derivations of `S0 <: T`, `Future<S0> <: T`, so by left
-           union introduction we have
-           - `FutureOr<S0> <: T`
-     - so by right intersection introduction, we have a derivation of `FutureOr<S0> <: X & T`
-     - QED
-
-**Conjecture 1**: `FutureOr<A> <: FutureOr<B>` is derivable iff `A <: B` is
-derivable.
-
-Showing that `A <: B => FutureOr<A> <: FutureOr<B>` is easy, but it is not
-immediately clear how to tackle the opposite direction.
-
-**Lemma 3**: Transitivity of subtyping is admissible.  Given derivations of `A <: B`
-and `B <: C`, there is a derivation of `A <: C`.
-
-Proof sketch: The proof should go through by induction on sizes of derivations,
-cases on pairs of rules used.  For any pair of rules used, we can construct a
-new derivation of the desired result using only smaller derivations.
-
-**Observation 1**: Given `X` with bound `S`, we have the property that for all
-instances of `X & T`, `T <: S` will be true, and hence `S <: M => T <: M`.
-
-
-### Algorithmic rules
-
-Consider `T0 <: T1`.
-
-
-#### Union on the left
-
-By lemma 1, if `T0` is of the form `FutureOr<S0>` and there is any derivation of
-`T0 <: T1`, then there is a derivation ending with a use of left union
-introduction so we have the rule:
-
-- `T0` is `FutureOr<S0>`
-  - and `Future<S0> <: T1`
-  - and `S0 <: T1`
-
-
-#### Identical type variables
-
-If `T0` and `T1` are both the same unpromoted type variable, then subtyping
-holds by reflexivity.  If `T0` is a promoted type variable `X0 & S0`, and `T0`
-is `X0` then it suffices to show that `X0 <: X0` or `S0 <: X0`, and the former
-holds immediately.  This justifies the rule:
-
-- `T0` is a type variable `X0` or a promoted type variables `X0 & S0` and `T1`
-is `X0`.
-
-If `T0` is `X0` or `X0 & S0` and `T1` is `X0 & S1`, then by lemma 1 it suffices
-to show that `X0 & S0 <: X0` and `X0 & S0 <: S1`.  The first holds immediately
-by reflexivity on the type variable, so it is sufficient to check `T0 <: S1`.
-
-- `T0` is a type variable `X0` or a promoted type variables `X0 & S0` and `T1`
-is `X0 & S1`
-  - and `T0 <: S1`.
-
-*Note that neither of the previous rules are required to make the rules
-algorithmic: they are merely useful special cases of the next rule.*
-
-
-#### Intersection on the right
-
-By lemma 2, if `T1` is of the `X1 & S1` and there is any derivation of `T0 <:
-T1`, then there is a derivation ending with a use of right intersection
-introduction, hence the rule:
-
-- `T1` is a promoted type variable `X1 & S1`
-  - and `T0 <: X1`
-  - and `T0 <: S1`
-
-
-#### Union on the right
-
-Suppose `T1` is `FutureOr<S1>`. The rules above have eliminated the possibility
-that `T0` is of the form `FutureOr<S0`.  The only rules that could possibly
-apply then are right union introduction, left intersection introduction, or the
-variable bounds rules.  Combining these yields the following preliminary
-disjunctive rule:
-
-- `T1` is `FutureOr<S1>` and
-  - either `T0 <: Future<S1>`
-  - or `T0 <: S1`
-  - or `T0` is `X0` and `X0` has bound `S0` and `S0 <: T1`
-  - or `T0` is `X0 & S0` and `X0 <: T1` and `S0 <: T1`
-
-The last disjunctive clause can be further simplified to
-  - or `T0` is `X0 & S0` and `S0 <: T1`
-
-since the premise `X0 <: FutureOr<S1>` can only derived either using the
-variable bounds rule or right union introduction.  For the variable bounds rule,
-the premise `B0 <: T1` is redundant with `S0 <: T1` by observation 1.  For right
-union introduction, `X0 <: S1` is redundant with `T0 <: S1`, since if `X0 <: S1`
-is derivable, then `T0 <: S1` is derivable by left union introduction; and `X0
-<: Future<S1>` is redundant with `T0 <: Future<S1>`, since if the former is
-derivable, then the latter is also derivable by left intersection introduction.
-So we have the final rule:
-
-- `T1` is `FutureOr<S1>` and
-  - either `T0 <: Future<S1>`
-  - or `T0 <: S1`
-  - or `T0` is `X0` and `X0` has bound `S0` and `S0 <: T1`
-  - or `T0` is `X0 & S0` and `S0 <: T1`
-
-
-#### Intersection on the left
-
-Suppose `T0` is `X0 & S0`. We've eliminated the possibility that `T1` is
-`FutureOr<S1>`, the possibility that `T1` is `X1 & S1`, and the possibility that
-`T1` is any variant of `X0`.  The only remaining rule that applies is left
-intersection introduction, and so it suffices to check that `X0 <: T1` and `S0
-<: T1`.  But given the remaining possible forms for `T1`, the only rule that can
-apply to `X0 <: T1` is the variable bounds rule, which by observation 1 is
-redundant with the second premise, and so we have the rule:
-
-`T0` is a promoted type variable `X0 & S0`
-  - and `S0 <: T1`
-
-
-#### Type variable on the left
-
-Suppose `T0` is `X0`.  We've eliminated the possibility that `T1` is
-`FutureOr<S1>`, the possibility that `T1` is `X1 & S1`, and the possibility that
-`T1` is any variant of `X0`.  The only rule that applies is the variable bounds
-rule:
-
-`T0` is a type variable `X0` with bound `B0`
-  - and `B0 <: T1`
-
-This eliminates all of the non-algorithmic rules: the remainder are strictly
-algorithmic.
diff --git a/docs/process/experimental-flags.md b/docs/process/experimental-flags.md
new file mode 100644
index 0000000..e0af8b2
--- /dev/null
+++ b/docs/process/experimental-flags.md
@@ -0,0 +1,97 @@
+# Dart SDK process for changes behind experimental flags
+
+## Problem statement
+
+The Dart SDK ships via a number of channels:
+
+- Via the [Dart SDK](https://www.dartlang.org/tools/sdk#install)
+- Via the [Flutter SDK](http://flutter.io)
+- Internally at Google via an internal channel
+
+Each of these channels use varying release calendars, and keeping these entirely
+aligned is not practical. Further, a number of developers interested in staying
+current with Dart changes, consume the Dart SDK via our [dev
+channel](https://github.com/dart-lang/sdk/wiki/Branches-and-releases). As a
+result, we should anticipate that any dev channel build has the potential to end
+up as a shipped SDK though some channel. And as a consequence of that, it is
+critical that we keep the quality of our dev channel high AND that we keep it
+consistent wrt. which features are complete and supported. At the same time, we
+need the ability to land incomplete features to facilitate a number of tasks:
+
+- Compose a feature that spans multiple components/areas
+- Automated testing prior to the full completion of the feature
+- Allow partner teams to get a preview of a future feature
+- Allow customers to get a preview of a future feature
+- Etc.
+
+## Solution
+
+To ensure completed & supported features can be differentiated from incomplete
+features in-progress, we will put all in-progress features behind a single set
+of flags. Changes to features behind these flags are not considered breaking
+(even if the feature behind the flag was in a stable SDK), and they are subject
+to removal at any time. For details about breaking changes, see the breaking
+change process.
+
+All new features that meet one of the following criteria must be developed
+behind a flag (when possible):
+
+- All breaking changes
+- All language changes
+
+Further, it is recommended to consider developing behind a flag when:
+
+- Landing larger, user-visible changes which will be in an intermediate state
+  over several weeks and perhaps even releases
+- Making changes with the potential to have significant negative performance
+  impact for several weeks and perhaps even across releases
+
+## Details
+
+### Flag format for CLI-based tools
+
+Flags consist of one or more words, combined using dashes, using all lower-case.
+The single source of truth of these flags shall be a single shared .dart file.
+The tools are expected to offer a framework for querying these flags so that the
+implementation of the tools can easily access new flags.
+
+The flags are passed to CLI-based tools using the `--enable-experiment` flag
+Multiple flags can be passed by using multiple flags, or by passing several
+comma-separated flags. Examples:
+
+```
+dart --enable-experiment super-mixins
+dart --enable-experiment super-mixins,no-slow-checks,preview-dart3
+dart --enable-experiment super-mixins --enable-experiment no-slow-checks --enable-experiment preview-dart3
+```
+
+If the user passes a flag that is not recognized (for example, when the flag is
+no longer supported), the tool is required to inform about this by printing to
+stderr, and not fail.
+
+```
+dart --enable-experiment better-mixins
+Unknown experiment flag 'better-mixins'.
+```
+
+### Flag format for UI-based tools (IDEs/editors/etc.)
+
+IDEs and editors which offer the ability to invoke Dart tools, must support
+passing these flags. The support should be generic and flexible so that no UI
+change is required when we add or remove a flag. This is expected to take one of
+two forms:
+
+- Experiments affecting analysis can be enabled in `analysis_options.yaml` under
+  a single `enable-experiment:` key, e.g. to enable the flags `super-mixins` &
+  `no-slow-checks`:
+
+  ```
+  analyzer:
+    enable-experiment:
+      - super-mixins
+      - no-slow-checks
+  ```
+
+- Experiments affecting launch/run behavior, can be enabled in the IDE specific
+  run Configuration, by passing the same `--enable-experiment` flag as listed in
+  the CLI section.
diff --git a/pkg/analysis_server/benchmark/benchmarks.dart b/pkg/analysis_server/benchmark/benchmarks.dart
index 713177c..1448599 100644
--- a/pkg/analysis_server/benchmark/benchmarks.dart
+++ b/pkg/analysis_server/benchmark/benchmarks.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/integration/driver.dart b/pkg/analysis_server/benchmark/integration/driver.dart
index da92839..f3b7032 100644
--- a/pkg/analysis_server/benchmark/integration/driver.dart
+++ b/pkg/analysis_server/benchmark/integration/driver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/integration/input_converter.dart b/pkg/analysis_server/benchmark/integration/input_converter.dart
index fdf4066..c28b9f9 100644
--- a/pkg/analysis_server/benchmark/integration/input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/input_converter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart b/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
index 0058fdf..85f6a7f 100644
--- a/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/instrumentation_input_converter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/integration/local_runner.dart b/pkg/analysis_server/benchmark/integration/local_runner.dart
index 28ef5bb..8986e1f 100644
--- a/pkg/analysis_server/benchmark/integration/local_runner.dart
+++ b/pkg/analysis_server/benchmark/integration/local_runner.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/integration/log_file_input_converter.dart b/pkg/analysis_server/benchmark/integration/log_file_input_converter.dart
index 2ef5e6a..cb4bd81 100644
--- a/pkg/analysis_server/benchmark/integration/log_file_input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/log_file_input_converter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/integration/main.dart b/pkg/analysis_server/benchmark/integration/main.dart
index 2182796..a1be95e 100644
--- a/pkg/analysis_server/benchmark/integration/main.dart
+++ b/pkg/analysis_server/benchmark/integration/main.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/integration/operation.dart b/pkg/analysis_server/benchmark/integration/operation.dart
index 75cf2a7..470756b 100644
--- a/pkg/analysis_server/benchmark/integration/operation.dart
+++ b/pkg/analysis_server/benchmark/integration/operation.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart b/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
index 0c460c2..56aca72 100644
--- a/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
+++ b/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart b/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
index 3d0957e..0634a11 100644
--- a/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
+++ b/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/benchmark/perf/memory_tests.dart b/pkg/analysis_server/benchmark/perf/memory_tests.dart
index ce762e8..6af8813 100644
--- a/pkg/analysis_server/benchmark/perf/memory_tests.dart
+++ b/pkg/analysis_server/benchmark/perf/memory_tests.dart
@@ -1,9 +1,8 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:math';
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/status/diagnostics.dart';
@@ -11,20 +10,6 @@
 
 import '../../test/integration/support/integration_tests.dart';
 
-void printMemoryResults(String id, String description, List<int> sizes) {
-  int minMemory = sizes.fold(sizes.first, min);
-  int maxMemory = sizes.fold(sizes.first, max);
-  String now = new DateTime.now().toUtc().toIso8601String();
-  print('$now ========== $id');
-  print('memory: $sizes');
-  print('min_memory: $minMemory');
-  print('max_memory: $maxMemory');
-  print(description.trim());
-  print('--------------------');
-  print('');
-  print('');
-}
-
 /**
  * Base class for analysis server memory usage tests.
  */
diff --git a/pkg/analysis_server/bin/server.dart b/pkg/analysis_server/bin/server.dart
index 8c669ff..9dedc84 100644
--- a/pkg/analysis_server/bin/server.dart
+++ b/pkg/analysis_server/bin/server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 5af3aa0..bf31832 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -109,7 +109,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  1.21.1
+  1.22.1
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -810,33 +810,16 @@
       </dd></dl></dd><dt class="request"><a name="request_analysis.reanalyze">analysis.reanalyze</a></dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "analysis.reanalyze"
-  "params": {
-    "<b>roots</b>": <span style="color:#999999">optional</span> List&lt;<a href="#type_FilePath">FilePath</a>&gt;
-  }
 }</pre><br><pre>response: {
   "id": String
   "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
 }</pre></div>
     <p>
-      Force the re-analysis of everything contained in the specified
-      analysis roots. This will cause all previously computed analysis
-      results to be discarded and recomputed, and will cause all subscribed
-      notifications to be re-sent.
+      Force re-reading of all potentially changed files, re-resolving of all
+      referenced URIs, and corresponding re-analysis of everything affected in
+      the current analysis roots.
     </p>
-    <p>
-      If no analysis roots are provided, then all current analysis roots
-      will be re-analyzed. If an empty list of analysis roots is provided,
-      then nothing will be re-analyzed. If the list contains one or more
-      paths that are not currently analysis roots, then an error of type
-      <tt>INVALID_ANALYSIS_ROOT</tt> will be generated.
-    </p>
-    
-  <h4>parameters:</h4><dl><dt class="field"><b>roots: List&lt;<a href="#type_FilePath">FilePath</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
-        
-        <p>
-          A list of the analysis roots that are to be re-analyzed.
-        </p>
-      </dd></dl></dd><dt class="request"><a name="request_analysis.setAnalysisRoots">analysis.setAnalysisRoots</a></dt><dd><div class="box"><pre>request: {
+  </dd><dt class="request"><a name="request_analysis.setAnalysisRoots">analysis.setAnalysisRoots</a></dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "analysis.setAnalysisRoots"
   "params": {
@@ -2935,6 +2918,12 @@
           is only defined if the displayed text should be different than the
           completion.  Otherwise it is omitted.
         </p>
+      </dd><dt class="field"><b>elementUri: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The URI of the element corresponding to this suggestion. It will be
+          set whenever analysis server is able to compute it.
+        </p>
       </dd><dt class="field"><b>selectionOffset: int</b></dt><dd>
         
         <p>
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index e1e4b90..8e0f2a2 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -6,9 +6,18 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
 
+// ignore_for_file: deprecated_member_use
+// ignore_for_file: unnecessary_brace_in_string_interps
+
 import 'dart:core' hide deprecated;
 import 'dart:core' as core show deprecated;
+import 'dart:convert' show JsonEncoder;
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/protocol/protocol_internal.dart'
+    show listEqual, mapEqual;
+import 'package:analyzer/src/generated/utilities_general.dart';
+
+const jsonEncoder = const JsonEncoder.withIndent('    ');
 
 class ApplyWorkspaceEditParams implements ToJsonable {
   ApplyWorkspaceEditParams(this.label, this.edit) {
@@ -16,10 +25,10 @@
       throw 'edit is required but was not provided';
     }
   }
-  factory ApplyWorkspaceEditParams.fromJson(Map<String, dynamic> json) {
+  static ApplyWorkspaceEditParams fromJson(Map<String, dynamic> json) {
     final label = json['label'];
     final edit =
-        json['edit'] != null ? new WorkspaceEdit.fromJson(json['edit']) : null;
+        json['edit'] != null ? WorkspaceEdit.fromJson(json['edit']) : null;
     return new ApplyWorkspaceEditParams(label, edit);
   }
 
@@ -44,6 +53,25 @@
         obj.containsKey('edit') &&
         WorkspaceEdit.canParse(obj['edit']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ApplyWorkspaceEditParams) {
+      return label == other.label && edit == other.edit && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, label.hashCode);
+    hash = JenkinsSmiHash.combine(hash, edit.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ApplyWorkspaceEditResponse implements ToJsonable {
@@ -52,7 +80,7 @@
       throw 'applied is required but was not provided';
     }
   }
-  factory ApplyWorkspaceEditResponse.fromJson(Map<String, dynamic> json) {
+  static ApplyWorkspaceEditResponse fromJson(Map<String, dynamic> json) {
     final applied = json['applied'];
     return new ApplyWorkspaceEditResponse(applied);
   }
@@ -72,6 +100,24 @@
         obj.containsKey('applied') &&
         obj['applied'] is bool;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ApplyWorkspaceEditResponse) {
+      return applied == other.applied && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, applied.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class CancelParams implements ToJsonable {
@@ -80,12 +126,12 @@
       throw 'id is required but was not provided';
     }
   }
-  factory CancelParams.fromJson(Map<String, dynamic> json) {
+  static CancelParams fromJson(Map<String, dynamic> json) {
     final id = json['id'] is num
         ? new Either2<num, String>.t1(json['id'])
         : (json['id'] is String
             ? new Either2<num, String>.t2(json['id'])
-            : (throw '''${json['id']} was not one of (number, string)'''));
+            : (throw '''${json['id']} was not one of (num, String)'''));
     return new CancelParams(id);
   }
 
@@ -103,16 +149,34 @@
         obj.containsKey('id') &&
         (obj['id'] is num || obj['id'] is String);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CancelParams) {
+      return id == other.id && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ClientCapabilities implements ToJsonable {
   ClientCapabilities(this.workspace, this.textDocument, this.experimental);
-  factory ClientCapabilities.fromJson(Map<String, dynamic> json) {
+  static ClientCapabilities fromJson(Map<String, dynamic> json) {
     final workspace = json['workspace'] != null
-        ? new WorkspaceClientCapabilities.fromJson(json['workspace'])
+        ? WorkspaceClientCapabilities.fromJson(json['workspace'])
         : null;
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentClientCapabilities.fromJson(json['textDocument'])
+        ? TextDocumentClientCapabilities.fromJson(json['textDocument'])
         : null;
     final experimental = json['experimental'];
     return new ClientCapabilities(workspace, textDocument, experimental);
@@ -144,6 +208,29 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ClientCapabilities) {
+      return workspace == other.workspace &&
+          textDocument == other.textDocument &&
+          experimental == other.experimental &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workspace.hashCode);
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, experimental.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// A code action represents a change that can be performed in code, e.g. to fix
@@ -157,17 +244,18 @@
       throw 'title is required but was not provided';
     }
   }
-  factory CodeAction.fromJson(Map<String, dynamic> json) {
+  static CodeAction fromJson(Map<String, dynamic> json) {
     final title = json['title'];
-    final kind = json['kind'];
+    final kind =
+        json['kind'] != null ? CodeActionKind.fromJson(json['kind']) : null;
     final diagnostics = json['diagnostics']
-        ?.map((item) => item != null ? new Diagnostic.fromJson(item) : null)
+        ?.map((item) => item != null ? Diagnostic.fromJson(item) : null)
         ?.cast<Diagnostic>()
         ?.toList();
     final edit =
-        json['edit'] != null ? new WorkspaceEdit.fromJson(json['edit']) : null;
+        json['edit'] != null ? WorkspaceEdit.fromJson(json['edit']) : null;
     final command =
-        json['command'] != null ? new Command.fromJson(json['command']) : null;
+        json['command'] != null ? Command.fromJson(json['command']) : null;
     return new CodeAction(title, kind, diagnostics, edit, command);
   }
 
@@ -184,7 +272,7 @@
   /// The kind of the code action.
   ///
   /// Used to filter code actions.
-  final String kind;
+  final CodeActionKind kind;
 
   /// A short, human-readable, title for this code action.
   final String title;
@@ -212,6 +300,34 @@
         obj.containsKey('title') &&
         obj['title'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeAction) {
+      return title == other.title &&
+          kind == other.kind &&
+          listEqual(diagnostics, other.diagnostics,
+              (Diagnostic a, Diagnostic b) => a == b) &&
+          edit == other.edit &&
+          command == other.command &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, title.hashCode);
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, diagnostics.hashCode);
+    hash = JenkinsSmiHash.combine(hash, edit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, command.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Contains additional diagnostic information about the context in which a code
@@ -222,12 +338,15 @@
       throw 'diagnostics is required but was not provided';
     }
   }
-  factory CodeActionContext.fromJson(Map<String, dynamic> json) {
+  static CodeActionContext fromJson(Map<String, dynamic> json) {
     final diagnostics = json['diagnostics']
-        ?.map((item) => item != null ? new Diagnostic.fromJson(item) : null)
+        ?.map((item) => item != null ? Diagnostic.fromJson(item) : null)
         ?.cast<Diagnostic>()
         ?.toList();
-    final only = json['only']?.map((item) => item)?.cast<String>()?.toList();
+    final only = json['only']
+        ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
+        ?.cast<CodeActionKind>()
+        ?.toList();
     return new CodeActionContext(diagnostics, only);
   }
 
@@ -238,7 +357,7 @@
   ///
   /// Actions not of this kind are filtered out by the client before being
   /// shown. So servers can omit computing them.
-  final List<String> only;
+  final List<CodeActionKind> only;
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
@@ -254,18 +373,49 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('diagnostics') &&
         (obj['diagnostics'] is List &&
-            (obj['diagnostics'].length == 0 ||
-                obj['diagnostics'].every((item) => Diagnostic.canParse(item))));
+            (obj['diagnostics'].every((item) => Diagnostic.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeActionContext) {
+      return listEqual(diagnostics, other.diagnostics,
+              (Diagnostic a, Diagnostic b) => a == b) &&
+          listEqual(only, other.only,
+              (CodeActionKind a, CodeActionKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, diagnostics.hashCode);
+    hash = JenkinsSmiHash.combine(hash, only.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// A set of predefined code action kinds
-abstract class CodeActionKind {
+class CodeActionKind {
+  const CodeActionKind(this._value);
+  const CodeActionKind.fromJson(this._value);
+
+  final String _value;
+
+  static bool canParse(Object obj) {
+    return obj is String;
+  }
+
   /// Base kind for quickfix actions: 'quickfix'
-  static const QuickFix = 'quickfix';
+  static const QuickFix = const CodeActionKind('quickfix');
 
   /// Base kind for refactoring actions: 'refactor'
-  static const Refactor = 'refactor';
+  static const Refactor = const CodeActionKind('refactor');
 
   /// Base kind for refactoring extraction actions: 'refactor.extract'
   ///
@@ -276,7 +426,7 @@
   /// - Extract variable
   /// - Extract interface from class
   /// - ...
-  static const RefactorExtract = 'refactor.extract';
+  static const RefactorExtract = const CodeActionKind('refactor.extract');
 
   /// Base kind for refactoring inline actions: 'refactor.inline'
   ///
@@ -286,7 +436,7 @@
   /// - Inline variable
   /// - Inline constant
   /// - ...
-  static const RefactorInline = 'refactor.inline';
+  static const RefactorInline = const CodeActionKind('refactor.inline');
 
   /// Base kind for refactoring rewrite actions: 'refactor.rewrite'
   ///
@@ -298,23 +448,39 @@
   /// - Make method static
   /// - Move method to base class
   /// - ...
-  static const RefactorRewrite = 'refactor.rewrite';
+  static const RefactorRewrite = const CodeActionKind('refactor.rewrite');
 
   /// Base kind for source actions: `source`
   ///
   /// Source code actions apply to the entire file.
-  static const Source = 'source';
+  static const Source = const CodeActionKind('source');
 
   /// Base kind for an organize imports source action: `source.organizeImports`
-  static const SourceOrganizeImports = 'source.organizeImports';
+  static const SourceOrganizeImports =
+      const CodeActionKind('source.organizeImports');
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  get hashCode => _value.hashCode;
+
+  bool operator ==(o) => o is CodeActionKind && o._value == _value;
 }
 
 /// Code Action options.
 class CodeActionOptions implements ToJsonable {
   CodeActionOptions(this.codeActionKinds);
-  factory CodeActionOptions.fromJson(Map<String, dynamic> json) {
-    final codeActionKinds =
-        json['codeActionKinds']?.map((item) => item)?.cast<String>()?.toList();
+  static CodeActionOptions fromJson(Map<String, dynamic> json) {
+    if (CodeActionRegistrationOptions.canParse(json)) {
+      return CodeActionRegistrationOptions.fromJson(json);
+    }
+    final codeActionKinds = json['codeActionKinds']
+        ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
+        ?.cast<CodeActionKind>()
+        ?.toList();
     return new CodeActionOptions(codeActionKinds);
   }
 
@@ -322,7 +488,7 @@
   ///
   /// The list of kinds may be generic, such as `CodeActionKind.Refactor`, or
   /// the server may list out every specific kind they provide.
-  final List<String> codeActionKinds;
+  final List<CodeActionKind> codeActionKinds;
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
@@ -335,6 +501,26 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeActionOptions) {
+      return listEqual(codeActionKinds, other.codeActionKinds,
+              (CodeActionKind a, CodeActionKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, codeActionKinds.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Params for the CodeActionRequest
@@ -350,14 +536,13 @@
       throw 'context is required but was not provided';
     }
   }
-  factory CodeActionParams.fromJson(Map<String, dynamic> json) {
+  static CodeActionParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final context = json['context'] != null
-        ? new CodeActionContext.fromJson(json['context'])
+        ? CodeActionContext.fromJson(json['context'])
         : null;
     return new CodeActionParams(textDocument, range, context);
   }
@@ -390,18 +575,43 @@
         obj.containsKey('context') &&
         CodeActionContext.canParse(obj['context']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeActionParams) {
+      return textDocument == other.textDocument &&
+          range == other.range &&
+          context == other.context &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, context.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class CodeActionRegistrationOptions
     implements TextDocumentRegistrationOptions, CodeActionOptions, ToJsonable {
   CodeActionRegistrationOptions(this.documentSelector, this.codeActionKinds);
-  factory CodeActionRegistrationOptions.fromJson(Map<String, dynamic> json) {
+  static CodeActionRegistrationOptions fromJson(Map<String, dynamic> json) {
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
-    final codeActionKinds =
-        json['codeActionKinds']?.map((item) => item)?.cast<String>()?.toList();
+    final codeActionKinds = json['codeActionKinds']
+        ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
+        ?.cast<CodeActionKind>()
+        ?.toList();
     return new CodeActionRegistrationOptions(documentSelector, codeActionKinds);
   }
 
@@ -409,7 +619,7 @@
   ///
   /// The list of kinds may be generic, such as `CodeActionKind.Refactor`, or
   /// the server may list out every specific kind they provide.
-  final List<String> codeActionKinds;
+  final List<CodeActionKind> codeActionKinds;
 
   /// A document selector to identify the scope of the registration. If set to
   /// null the document selector provided on the client side will be used.
@@ -428,10 +638,31 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeActionRegistrationOptions) {
+      return documentSelector == other.documentSelector &&
+          listEqual(codeActionKinds, other.codeActionKinds,
+              (CodeActionKind a, CodeActionKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeActionKinds.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// A code lens represents a command that should be shown along with source
@@ -446,11 +677,10 @@
       throw 'range is required but was not provided';
     }
   }
-  factory CodeLens.fromJson(Map<String, dynamic> json) {
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+  static CodeLens fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final command =
-        json['command'] != null ? new Command.fromJson(json['command']) : null;
+        json['command'] != null ? Command.fromJson(json['command']) : null;
     final data = json['data'];
     return new CodeLens(range, command, data);
   }
@@ -483,12 +713,35 @@
         obj.containsKey('range') &&
         Range.canParse(obj['range']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeLens) {
+      return range == other.range &&
+          command == other.command &&
+          data == other.data &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, command.hashCode);
+    hash = JenkinsSmiHash.combine(hash, data.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Code Lens options.
 class CodeLensOptions implements ToJsonable {
   CodeLensOptions(this.resolveProvider);
-  factory CodeLensOptions.fromJson(Map<String, dynamic> json) {
+  static CodeLensOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
     return new CodeLensOptions(resolveProvider);
   }
@@ -507,6 +760,24 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeLensOptions) {
+      return resolveProvider == other.resolveProvider && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class CodeLensParams implements ToJsonable {
@@ -515,9 +786,9 @@
       throw 'textDocument is required but was not provided';
     }
   }
-  factory CodeLensParams.fromJson(Map<String, dynamic> json) {
+  static CodeLensParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     return new CodeLensParams(textDocument);
   }
@@ -537,15 +808,33 @@
         obj.containsKey('textDocument') &&
         TextDocumentIdentifier.canParse(obj['textDocument']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeLensParams) {
+      return textDocument == other.textDocument && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class CodeLensRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
   CodeLensRegistrationOptions(this.resolveProvider, this.documentSelector);
-  factory CodeLensRegistrationOptions.fromJson(Map<String, dynamic> json) {
+  static CodeLensRegistrationOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new CodeLensRegistrationOptions(resolveProvider, documentSelector);
@@ -571,10 +860,30 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CodeLensRegistrationOptions) {
+      return resolveProvider == other.resolveProvider &&
+          documentSelector == other.documentSelector &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Represents a color in RGBA space.
@@ -593,7 +902,7 @@
       throw 'alpha is required but was not provided';
     }
   }
-  factory Color.fromJson(Map<String, dynamic> json) {
+  static Color fromJson(Map<String, dynamic> json) {
     final red = json['red'];
     final green = json['green'];
     final blue = json['blue'];
@@ -601,9 +910,16 @@
     return new Color(red, green, blue, alpha);
   }
 
+  /// The alpha component of this color in the range [0-1].
   final num alpha;
+
+  /// The blue component of this color in the range [0-1].
   final num blue;
+
+  /// The green component of this color in the range [0-1].
   final num green;
+
+  /// The red component of this color in the range [0-1].
   final num red;
 
   Map<String, dynamic> toJson() {
@@ -626,6 +942,31 @@
         obj.containsKey('alpha') &&
         obj['alpha'] is num;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Color) {
+      return red == other.red &&
+          green == other.green &&
+          blue == other.blue &&
+          alpha == other.alpha &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, red.hashCode);
+    hash = JenkinsSmiHash.combine(hash, green.hashCode);
+    hash = JenkinsSmiHash.combine(hash, blue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, alpha.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ColorInformation implements ToJsonable {
@@ -637,11 +978,9 @@
       throw 'color is required but was not provided';
     }
   }
-  factory ColorInformation.fromJson(Map<String, dynamic> json) {
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
-    final color =
-        json['color'] != null ? new Color.fromJson(json['color']) : null;
+  static ColorInformation fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+    final color = json['color'] != null ? Color.fromJson(json['color']) : null;
     return new ColorInformation(range, color);
   }
 
@@ -665,6 +1004,25 @@
         obj.containsKey('color') &&
         Color.canParse(obj['color']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ColorInformation) {
+      return range == other.range && color == other.color && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, color.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ColorPresentation implements ToJsonable {
@@ -673,13 +1031,12 @@
       throw 'label is required but was not provided';
     }
   }
-  factory ColorPresentation.fromJson(Map<String, dynamic> json) {
+  static ColorPresentation fromJson(Map<String, dynamic> json) {
     final label = json['label'];
-    final textEdit = json['textEdit'] != null
-        ? new TextEdit.fromJson(json['textEdit'])
-        : null;
+    final textEdit =
+        json['textEdit'] != null ? TextEdit.fromJson(json['textEdit']) : null;
     final additionalTextEdits = json['additionalTextEdits']
-        ?.map((item) => item != null ? new TextEdit.fromJson(item) : null)
+        ?.map((item) => item != null ? TextEdit.fromJson(item) : null)
         ?.cast<TextEdit>()
         ?.toList();
     return new ColorPresentation(label, textEdit, additionalTextEdits);
@@ -717,6 +1074,30 @@
         obj.containsKey('label') &&
         obj['label'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ColorPresentation) {
+      return label == other.label &&
+          textEdit == other.textEdit &&
+          listEqual(additionalTextEdits, other.additionalTextEdits,
+              (TextEdit a, TextEdit b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, label.hashCode);
+    hash = JenkinsSmiHash.combine(hash, textEdit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, additionalTextEdits.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ColorPresentationParams implements ToJsonable {
@@ -731,14 +1112,12 @@
       throw 'range is required but was not provided';
     }
   }
-  factory ColorPresentationParams.fromJson(Map<String, dynamic> json) {
+  static ColorPresentationParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    final color =
-        json['color'] != null ? new Color.fromJson(json['color']) : null;
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final color = json['color'] != null ? Color.fromJson(json['color']) : null;
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     return new ColorPresentationParams(textDocument, color, range);
   }
 
@@ -769,10 +1148,37 @@
         obj.containsKey('range') &&
         Range.canParse(obj['range']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ColorPresentationParams) {
+      return textDocument == other.textDocument &&
+          color == other.color &&
+          range == other.range &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, color.hashCode);
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Color provider options.
 class ColorProviderOptions implements ToJsonable {
+  static ColorProviderOptions fromJson(Map<String, dynamic> json) {
+    return new ColorProviderOptions();
+  }
+
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
     return __result;
@@ -781,6 +1187,23 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ColorProviderOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class Command implements ToJsonable {
@@ -792,7 +1215,7 @@
       throw 'command is required but was not provided';
     }
   }
-  factory Command.fromJson(Map<String, dynamic> json) {
+  static Command fromJson(Map<String, dynamic> json) {
     final title = json['title'];
     final command = json['command'];
     final arguments =
@@ -827,6 +1250,30 @@
         obj.containsKey('command') &&
         obj['command'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Command) {
+      return title == other.title &&
+          command == other.command &&
+          listEqual(
+              arguments, other.arguments, (dynamic a, dynamic b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, title.hashCode);
+    hash = JenkinsSmiHash.combine(hash, command.hashCode);
+    hash = JenkinsSmiHash.combine(hash, arguments.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Contains additional information about the context in which a completion
@@ -837,9 +1284,9 @@
       throw 'triggerKind is required but was not provided';
     }
   }
-  factory CompletionContext.fromJson(Map<String, dynamic> json) {
+  static CompletionContext fromJson(Map<String, dynamic> json) {
     final triggerKind = json['triggerKind'] != null
-        ? new CompletionTriggerKind.fromJson(json['triggerKind'])
+        ? CompletionTriggerKind.fromJson(json['triggerKind'])
         : null;
     final triggerCharacter = json['triggerCharacter'];
     return new CompletionContext(triggerKind, triggerCharacter);
@@ -865,8 +1312,29 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('triggerKind') &&
-        CompletionTriggerKind.canParse(obj['triggerKind']);
+        obj['triggerKind'] is num;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionContext) {
+      return triggerKind == other.triggerKind &&
+          triggerCharacter == other.triggerCharacter &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, triggerKind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, triggerCharacter.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class CompletionItem implements ToJsonable {
@@ -890,39 +1358,39 @@
       throw 'label is required but was not provided';
     }
   }
-  factory CompletionItem.fromJson(Map<String, dynamic> json) {
+  static CompletionItem fromJson(Map<String, dynamic> json) {
     final label = json['label'];
-    final kind = json['kind'] != null
-        ? new CompletionItemKind.fromJson(json['kind'])
-        : null;
+    final kind =
+        json['kind'] != null ? CompletionItemKind.fromJson(json['kind']) : null;
     final detail = json['detail'];
     final documentation = json['documentation'] is String
         ? new Either2<String, MarkupContent>.t1(json['documentation'])
         : (MarkupContent.canParse(json['documentation'])
             ? new Either2<String, MarkupContent>.t2(
                 json['documentation'] != null
-                    ? new MarkupContent.fromJson(json['documentation'])
+                    ? MarkupContent.fromJson(json['documentation'])
                     : null)
-            : (throw '''${json['documentation']} was not one of (string, MarkupContent)'''));
+            : (json['documentation'] == null
+                ? null
+                : (throw '''${json['documentation']} was not one of (String, MarkupContent)''')));
     final deprecated = json['deprecated'];
     final preselect = json['preselect'];
     final sortText = json['sortText'];
     final filterText = json['filterText'];
     final insertText = json['insertText'];
     final insertTextFormat = json['insertTextFormat'] != null
-        ? new InsertTextFormat.fromJson(json['insertTextFormat'])
+        ? InsertTextFormat.fromJson(json['insertTextFormat'])
         : null;
-    final textEdit = json['textEdit'] != null
-        ? new TextEdit.fromJson(json['textEdit'])
-        : null;
+    final textEdit =
+        json['textEdit'] != null ? TextEdit.fromJson(json['textEdit']) : null;
     final additionalTextEdits = json['additionalTextEdits']
-        ?.map((item) => item != null ? new TextEdit.fromJson(item) : null)
+        ?.map((item) => item != null ? TextEdit.fromJson(item) : null)
         ?.cast<TextEdit>()
         ?.toList();
     final commitCharacters =
         json['commitCharacters']?.map((item) => item)?.cast<String>()?.toList();
     final command =
-        json['command'] != null ? new Command.fromJson(json['command']) : null;
+        json['command'] != null ? Command.fromJson(json['command']) : null;
     final data = json['data'];
     return new CompletionItem(
         label,
@@ -1047,9 +1515,7 @@
     if (filterText != null) {
       __result['filterText'] = filterText;
     }
-    // ignore: deprecated_member_use
     if (insertText != null) {
-      // ignore: deprecated_member_use
       __result['insertText'] = insertText;
     }
     if (insertTextFormat != null) {
@@ -1078,6 +1544,55 @@
         obj.containsKey('label') &&
         obj['label'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionItem) {
+      return label == other.label &&
+          kind == other.kind &&
+          detail == other.detail &&
+          documentation == other.documentation &&
+          deprecated == other.deprecated &&
+          preselect == other.preselect &&
+          sortText == other.sortText &&
+          filterText == other.filterText &&
+          insertText == other.insertText &&
+          insertTextFormat == other.insertTextFormat &&
+          textEdit == other.textEdit &&
+          listEqual(additionalTextEdits, other.additionalTextEdits,
+              (TextEdit a, TextEdit b) => a == b) &&
+          listEqual(commitCharacters, other.commitCharacters,
+              (String a, String b) => a == b) &&
+          command == other.command &&
+          data == other.data &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, label.hashCode);
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, detail.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
+    hash = JenkinsSmiHash.combine(hash, deprecated.hashCode);
+    hash = JenkinsSmiHash.combine(hash, preselect.hashCode);
+    hash = JenkinsSmiHash.combine(hash, sortText.hashCode);
+    hash = JenkinsSmiHash.combine(hash, filterText.hashCode);
+    hash = JenkinsSmiHash.combine(hash, insertText.hashCode);
+    hash = JenkinsSmiHash.combine(hash, insertTextFormat.hashCode);
+    hash = JenkinsSmiHash.combine(hash, textEdit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, additionalTextEdits.hashCode);
+    hash = JenkinsSmiHash.combine(hash, commitCharacters.hashCode);
+    hash = JenkinsSmiHash.combine(hash, command.hashCode);
+    hash = JenkinsSmiHash.combine(hash, data.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// The kind of a completion entry.
@@ -1085,7 +1600,7 @@
   const CompletionItemKind._(this._value);
   const CompletionItemKind.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -1167,10 +1682,10 @@
       throw 'items is required but was not provided';
     }
   }
-  factory CompletionList.fromJson(Map<String, dynamic> json) {
+  static CompletionList fromJson(Map<String, dynamic> json) {
     final isIncomplete = json['isIncomplete'];
     final items = json['items']
-        ?.map((item) => item != null ? new CompletionItem.fromJson(item) : null)
+        ?.map((item) => item != null ? CompletionItem.fromJson(item) : null)
         ?.cast<CompletionItem>()
         ?.toList();
     return new CompletionList(isIncomplete, items);
@@ -1197,15 +1712,36 @@
         obj['isIncomplete'] is bool &&
         obj.containsKey('items') &&
         (obj['items'] is List &&
-            (obj['items'].length == 0 ||
-                obj['items'].every((item) => CompletionItem.canParse(item))));
+            (obj['items'].every((item) => CompletionItem.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionList) {
+      return isIncomplete == other.isIncomplete &&
+          listEqual(items, other.items,
+              (CompletionItem a, CompletionItem b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, isIncomplete.hashCode);
+    hash = JenkinsSmiHash.combine(hash, items.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Completion options.
 class CompletionOptions implements ToJsonable {
   CompletionOptions(this.resolveProvider, this.triggerCharacters);
-  factory CompletionOptions.fromJson(Map<String, dynamic> json) {
+  static CompletionOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
     final triggerCharacters = json['triggerCharacters']
         ?.map((item) => item)
@@ -1235,6 +1771,28 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionOptions) {
+      return resolveProvider == other.resolveProvider &&
+          listEqual(triggerCharacters, other.triggerCharacters,
+              (String a, String b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, triggerCharacters.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class CompletionParams implements TextDocumentPositionParams, ToJsonable {
@@ -1246,22 +1804,21 @@
       throw 'position is required but was not provided';
     }
   }
-  factory CompletionParams.fromJson(Map<String, dynamic> json) {
+  static CompletionParams fromJson(Map<String, dynamic> json) {
     final context = json['context'] != null
-        ? new CompletionContext.fromJson(json['context'])
+        ? CompletionContext.fromJson(json['context'])
         : null;
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    final position = json['position'] != null
-        ? new Position.fromJson(json['position'])
-        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
     return new CompletionParams(context, textDocument, position);
   }
 
-  /// The completion context. This is only available if the client specifies
-  /// to send this using
-  /// `ClientCapabilities.textDocument.completion.contextSupport === true`
+  /// The completion context. This is only available if the client specifies to
+  /// send this using `ClientCapabilities.textDocument.completion.contextSupport
+  /// === true`
   final CompletionContext context;
 
   /// The position inside the text document.
@@ -1289,20 +1846,43 @@
         obj.containsKey('position') &&
         Position.canParse(obj['position']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionParams) {
+      return context == other.context &&
+          textDocument == other.textDocument &&
+          position == other.position &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, context.hashCode);
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class CompletionRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
   CompletionRegistrationOptions(
       this.triggerCharacters, this.resolveProvider, this.documentSelector);
-  factory CompletionRegistrationOptions.fromJson(Map<String, dynamic> json) {
+  static CompletionRegistrationOptions fromJson(Map<String, dynamic> json) {
     final triggerCharacters = json['triggerCharacters']
         ?.map((item) => item)
         ?.cast<String>()
         ?.toList();
     final resolveProvider = json['resolveProvider'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new CompletionRegistrationOptions(
@@ -1318,11 +1898,11 @@
   final bool resolveProvider;
 
   /// Most tools trigger completion request automatically without explicitly
-  /// requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically
-  /// they do so when the user starts to type an identifier. For example if
-  /// the user types `c` in a JavaScript file code complete will automatically
-  /// pop up present `console` besides others as a completion item. Characters
-  /// that make up identifiers don't need to be listed here.
+  /// requesting it using a keyboard shortcut (e.g. Ctrl+Space). Typically they
+  /// do so when the user starts to type an identifier. For example if the user
+  /// types `c` in a JavaScript file code complete will automatically pop up
+  /// present `console` besides others as a completion item. Characters that
+  /// make up identifiers don't need to be listed here.
   ///
   /// If code complete should automatically be trigger on characters not being
   /// valid inside an identifier (for example `.` in JavaScript) list them in
@@ -1345,10 +1925,33 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CompletionRegistrationOptions) {
+      return listEqual(triggerCharacters, other.triggerCharacters,
+              (String a, String b) => a == b) &&
+          resolveProvider == other.resolveProvider &&
+          documentSelector == other.documentSelector &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, triggerCharacters.hashCode);
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// How a completion was triggered
@@ -1356,7 +1959,7 @@
   const CompletionTriggerKind._(this._value);
   const CompletionTriggerKind.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -1376,8 +1979,7 @@
   /// `triggerCharacters` properties of the `CompletionRegistrationOptions`.
   static const TriggerCharacter = const CompletionTriggerKind._(2);
 
-  /// Completion was re-triggered as the current completion list is
-  /// incomplete.
+  /// Completion was re-triggered as the current completion list is incomplete.
   static const TriggerForIncompleteCompletions =
       const CompletionTriggerKind._(3);
 
@@ -1394,7 +1996,7 @@
 
 class ConfigurationItem implements ToJsonable {
   ConfigurationItem(this.scopeUri, this.section);
-  factory ConfigurationItem.fromJson(Map<String, dynamic> json) {
+  static ConfigurationItem fromJson(Map<String, dynamic> json) {
     final scopeUri = json['scopeUri'];
     final section = json['section'];
     return new ConfigurationItem(scopeUri, section);
@@ -1420,6 +2022,25 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ConfigurationItem) {
+      return scopeUri == other.scopeUri && section == other.section && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, scopeUri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, section.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ConfigurationParams implements ToJsonable {
@@ -1428,10 +2049,9 @@
       throw 'items is required but was not provided';
     }
   }
-  factory ConfigurationParams.fromJson(Map<String, dynamic> json) {
+  static ConfigurationParams fromJson(Map<String, dynamic> json) {
     final items = json['items']
-        ?.map((item) =>
-            item != null ? new ConfigurationItem.fromJson(item) : null)
+        ?.map((item) => item != null ? ConfigurationItem.fromJson(item) : null)
         ?.cast<ConfigurationItem>()
         ?.toList();
     return new ConfigurationParams(items);
@@ -1449,27 +2069,52 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('items') &&
         (obj['items'] is List &&
-            (obj['items'].length == 0 ||
-                obj['items']
-                    .every((item) => ConfigurationItem.canParse(item))));
+            (obj['items'].every((item) => ConfigurationItem.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ConfigurationParams) {
+      return listEqual(items, other.items,
+              (ConfigurationItem a, ConfigurationItem b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, items.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Create file operation
-class CreateFile implements FileOperation, ToJsonable {
-  CreateFile(this.uri, this.options) {
+class CreateFile implements ToJsonable {
+  CreateFile(this.kind, this.uri, this.options) {
+    if (kind == null) {
+      throw 'kind is required but was not provided';
+    }
     if (uri == null) {
       throw 'uri is required but was not provided';
     }
   }
-  factory CreateFile.fromJson(Map<String, dynamic> json) {
+  static CreateFile fromJson(Map<String, dynamic> json) {
+    final kind = json['kind'];
     final uri = json['uri'];
     final options = json['options'] != null
-        ? new CreateFileOptions.fromJson(json['options'])
+        ? CreateFileOptions.fromJson(json['options'])
         : null;
-    return new CreateFile(uri, options);
+    return new CreateFile(kind, uri, options);
   }
 
+  /// A create
+  final String kind;
+
   /// Additional options
   final CreateFileOptions options;
 
@@ -1478,6 +2123,7 @@
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
+    __result['kind'] = kind ?? (throw 'kind is required but was not set');
     __result['uri'] = uri ?? (throw 'uri is required but was not set');
     if (options != null) {
       __result['options'] = options;
@@ -1487,15 +2133,40 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        obj.containsKey('kind') &&
+        obj['kind'] is String &&
         obj.containsKey('uri') &&
         obj['uri'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CreateFile) {
+      return kind == other.kind &&
+          uri == other.uri &&
+          options == other.options &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Options to create a file.
 class CreateFileOptions implements ToJsonable {
   CreateFileOptions(this.overwrite, this.ignoreIfExists);
-  factory CreateFileOptions.fromJson(Map<String, dynamic> json) {
+  static CreateFileOptions fromJson(Map<String, dynamic> json) {
     final overwrite = json['overwrite'];
     final ignoreIfExists = json['ignoreIfExists'];
     return new CreateFileOptions(overwrite, ignoreIfExists);
@@ -1521,23 +2192,51 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is CreateFileOptions) {
+      return overwrite == other.overwrite &&
+          ignoreIfExists == other.ignoreIfExists &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, overwrite.hashCode);
+    hash = JenkinsSmiHash.combine(hash, ignoreIfExists.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Delete file operation
-class DeleteFile implements FileOperation, ToJsonable {
-  DeleteFile(this.uri, this.options) {
+class DeleteFile implements ToJsonable {
+  DeleteFile(this.kind, this.uri, this.options) {
+    if (kind == null) {
+      throw 'kind is required but was not provided';
+    }
     if (uri == null) {
       throw 'uri is required but was not provided';
     }
   }
-  factory DeleteFile.fromJson(Map<String, dynamic> json) {
+  static DeleteFile fromJson(Map<String, dynamic> json) {
+    final kind = json['kind'];
     final uri = json['uri'];
     final options = json['options'] != null
-        ? new DeleteFileOptions.fromJson(json['options'])
+        ? DeleteFileOptions.fromJson(json['options'])
         : null;
-    return new DeleteFile(uri, options);
+    return new DeleteFile(kind, uri, options);
   }
 
+  /// A delete
+  final String kind;
+
   /// Delete options.
   final DeleteFileOptions options;
 
@@ -1546,6 +2245,7 @@
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
+    __result['kind'] = kind ?? (throw 'kind is required but was not set');
     __result['uri'] = uri ?? (throw 'uri is required but was not set');
     if (options != null) {
       __result['options'] = options;
@@ -1555,15 +2255,40 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        obj.containsKey('kind') &&
+        obj['kind'] is String &&
         obj.containsKey('uri') &&
         obj['uri'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DeleteFile) {
+      return kind == other.kind &&
+          uri == other.uri &&
+          options == other.options &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Delete file options
 class DeleteFileOptions implements ToJsonable {
   DeleteFileOptions(this.recursive, this.ignoreIfNotExists);
-  factory DeleteFileOptions.fromJson(Map<String, dynamic> json) {
+  static DeleteFileOptions fromJson(Map<String, dynamic> json) {
     final recursive = json['recursive'];
     final ignoreIfNotExists = json['ignoreIfNotExists'];
     return new DeleteFileOptions(recursive, ignoreIfNotExists);
@@ -1589,6 +2314,27 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DeleteFileOptions) {
+      return recursive == other.recursive &&
+          ignoreIfNotExists == other.ignoreIfNotExists &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, recursive.hashCode);
+    hash = JenkinsSmiHash.combine(hash, ignoreIfNotExists.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class Diagnostic implements ToJsonable {
@@ -1601,23 +2347,17 @@
       throw 'message is required but was not provided';
     }
   }
-  factory Diagnostic.fromJson(Map<String, dynamic> json) {
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+  static Diagnostic fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final severity = json['severity'] != null
-        ? new DiagnosticSeverity.fromJson(json['severity'])
+        ? DiagnosticSeverity.fromJson(json['severity'])
         : null;
-    final code = json['code'] is num
-        ? new Either2<num, String>.t1(json['code'])
-        : (json['code'] is String
-            ? new Either2<num, String>.t2(json['code'])
-            : (throw '''${json['code']} was not one of (number, string)'''));
+    final code = json['code'];
     final source = json['source'];
     final message = json['message'];
     final relatedInformation = json['relatedInformation']
-        ?.map((item) => item != null
-            ? new DiagnosticRelatedInformation.fromJson(item)
-            : null)
+        ?.map((item) =>
+            item != null ? DiagnosticRelatedInformation.fromJson(item) : null)
         ?.cast<DiagnosticRelatedInformation>()
         ?.toList();
     return new Diagnostic(
@@ -1625,7 +2365,7 @@
   }
 
   /// The diagnostic's code, which might appear in the user interface.
-  final Either2<num, String> code;
+  final String code;
 
   /// The diagnostic's message.
   final String message;
@@ -1633,9 +2373,8 @@
   /// The range at which the message applies.
   final Range range;
 
-  /// An array of related diagnostic information, e.g. when symbol-names
-  /// within a scope collide all definitions can be marked via this
-  /// property.
+  /// An array of related diagnostic information, e.g. when symbol-names within
+  /// a scope collide all definitions can be marked via this property.
   final List<DiagnosticRelatedInformation> relatedInformation;
 
   /// The diagnostic's severity. Can be omitted. If omitted it is up to the
@@ -1673,11 +2412,45 @@
         obj.containsKey('message') &&
         obj['message'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Diagnostic) {
+      return range == other.range &&
+          severity == other.severity &&
+          code == other.code &&
+          source == other.source &&
+          message == other.message &&
+          listEqual(
+              relatedInformation,
+              other.relatedInformation,
+              (DiagnosticRelatedInformation a,
+                      DiagnosticRelatedInformation b) =>
+                  a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, severity.hashCode);
+    hash = JenkinsSmiHash.combine(hash, code.hashCode);
+    hash = JenkinsSmiHash.combine(hash, source.hashCode);
+    hash = JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = JenkinsSmiHash.combine(hash, relatedInformation.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Represents a related message and source code location for a diagnostic.
-/// This should be used to point to code locations that cause or related to
-/// a diagnostics, e.g when duplicating a symbol in a scope.
+/// Represents a related message and source code location for a diagnostic. This
+/// should be used to point to code locations that cause or related to a
+/// diagnostics, e.g when duplicating a symbol in a scope.
 class DiagnosticRelatedInformation implements ToJsonable {
   DiagnosticRelatedInformation(this.location, this.message) {
     if (location == null) {
@@ -1687,10 +2460,9 @@
       throw 'message is required but was not provided';
     }
   }
-  factory DiagnosticRelatedInformation.fromJson(Map<String, dynamic> json) {
-    final location = json['location'] != null
-        ? new Location.fromJson(json['location'])
-        : null;
+  static DiagnosticRelatedInformation fromJson(Map<String, dynamic> json) {
+    final location =
+        json['location'] != null ? Location.fromJson(json['location']) : null;
     final message = json['message'];
     return new DiagnosticRelatedInformation(location, message);
   }
@@ -1717,13 +2489,32 @@
         obj.containsKey('message') &&
         obj['message'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DiagnosticRelatedInformation) {
+      return location == other.location && message == other.message && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, location.hashCode);
+    hash = JenkinsSmiHash.combine(hash, message.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DiagnosticSeverity {
   const DiagnosticSeverity._(this._value);
   const DiagnosticSeverity.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -1760,12 +2551,8 @@
 }
 
 class DidChangeConfigurationParams implements ToJsonable {
-  DidChangeConfigurationParams(this.settings) {
-    if (settings == null) {
-      throw 'settings is required but was not provided';
-    }
-  }
-  factory DidChangeConfigurationParams.fromJson(Map<String, dynamic> json) {
+  DidChangeConfigurationParams(this.settings);
+  static DidChangeConfigurationParams fromJson(Map<String, dynamic> json) {
     final settings = json['settings'];
     return new DidChangeConfigurationParams(settings);
   }
@@ -1775,14 +2562,31 @@
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
-    __result['settings'] =
-        settings ?? (throw 'settings is required but was not set');
+    __result['settings'] = settings;
     return __result;
   }
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> && obj.containsKey('settings') && true;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DidChangeConfigurationParams) {
+      return settings == other.settings && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, settings.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DidChangeTextDocumentParams implements ToJsonable {
@@ -1794,27 +2598,25 @@
       throw 'contentChanges is required but was not provided';
     }
   }
-  factory DidChangeTextDocumentParams.fromJson(Map<String, dynamic> json) {
+  static DidChangeTextDocumentParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new VersionedTextDocumentIdentifier.fromJson(json['textDocument'])
+        ? VersionedTextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final contentChanges = json['contentChanges']
-        ?.map((item) => item != null
-            ? new TextDocumentContentChangeEvent.fromJson(item)
-            : null)
+        ?.map((item) =>
+            item != null ? TextDocumentContentChangeEvent.fromJson(item) : null)
         ?.cast<TextDocumentContentChangeEvent>()
         ?.toList();
     return new DidChangeTextDocumentParams(textDocument, contentChanges);
   }
 
-  /// The actual content changes. The content changes describe single
-  /// state changes to the document. So if there are two content changes
-  /// c1 and c2 for a document in state S then c1 move the document to S'
-  /// and c2 to S''.
+  /// The actual content changes. The content changes describe single state
+  /// changes to the document. So if there are two content changes c1 and c2 for
+  /// a document in state S then c1 move the document to S' and c2 to S''.
   final List<TextDocumentContentChangeEvent> contentChanges;
 
-  /// The document that did change. The version number points to the
-  /// version after all provided content changes have been applied.
+  /// The document that did change. The version number points to the version
+  /// after all provided content changes have been applied.
   final VersionedTextDocumentIdentifier textDocument;
 
   Map<String, dynamic> toJson() {
@@ -1832,10 +2634,35 @@
         VersionedTextDocumentIdentifier.canParse(obj['textDocument']) &&
         obj.containsKey('contentChanges') &&
         (obj['contentChanges'] is List &&
-            (obj['contentChanges'].length == 0 ||
-                obj['contentChanges'].every(
-                    (item) => TextDocumentContentChangeEvent.canParse(item))));
+            (obj['contentChanges'].every(
+                (item) => TextDocumentContentChangeEvent.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DidChangeTextDocumentParams) {
+      return textDocument == other.textDocument &&
+          listEqual(
+              contentChanges,
+              other.contentChanges,
+              (TextDocumentContentChangeEvent a,
+                      TextDocumentContentChangeEvent b) =>
+                  a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, contentChanges.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DidChangeWatchedFilesParams implements ToJsonable {
@@ -1844,9 +2671,9 @@
       throw 'changes is required but was not provided';
     }
   }
-  factory DidChangeWatchedFilesParams.fromJson(Map<String, dynamic> json) {
+  static DidChangeWatchedFilesParams fromJson(Map<String, dynamic> json) {
     final changes = json['changes']
-        ?.map((item) => item != null ? new FileEvent.fromJson(item) : null)
+        ?.map((item) => item != null ? FileEvent.fromJson(item) : null)
         ?.cast<FileEvent>()
         ?.toList();
     return new DidChangeWatchedFilesParams(changes);
@@ -1866,9 +2693,28 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('changes') &&
         (obj['changes'] is List &&
-            (obj['changes'].length == 0 ||
-                obj['changes'].every((item) => FileEvent.canParse(item))));
+            (obj['changes'].every((item) => FileEvent.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DidChangeWatchedFilesParams) {
+      return listEqual(
+              changes, other.changes, (FileEvent a, FileEvent b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, changes.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Describe options to be used when registering for text document change
@@ -1879,11 +2725,10 @@
       throw 'watchers is required but was not provided';
     }
   }
-  factory DidChangeWatchedFilesRegistrationOptions.fromJson(
+  static DidChangeWatchedFilesRegistrationOptions fromJson(
       Map<String, dynamic> json) {
     final watchers = json['watchers']
-        ?.map((item) =>
-            item != null ? new FileSystemWatcher.fromJson(item) : null)
+        ?.map((item) => item != null ? FileSystemWatcher.fromJson(item) : null)
         ?.cast<FileSystemWatcher>()
         ?.toList();
     return new DidChangeWatchedFilesRegistrationOptions(watchers);
@@ -1903,10 +2748,29 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('watchers') &&
         (obj['watchers'] is List &&
-            (obj['watchers'].length == 0 ||
-                obj['watchers']
-                    .every((item) => FileSystemWatcher.canParse(item))));
+            (obj['watchers']
+                .every((item) => FileSystemWatcher.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DidChangeWatchedFilesRegistrationOptions) {
+      return listEqual(watchers, other.watchers,
+              (FileSystemWatcher a, FileSystemWatcher b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, watchers.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DidChangeWorkspaceFoldersParams implements ToJsonable {
@@ -1915,9 +2779,9 @@
       throw 'event is required but was not provided';
     }
   }
-  factory DidChangeWorkspaceFoldersParams.fromJson(Map<String, dynamic> json) {
+  static DidChangeWorkspaceFoldersParams fromJson(Map<String, dynamic> json) {
     final event = json['event'] != null
-        ? new WorkspaceFoldersChangeEvent.fromJson(json['event'])
+        ? WorkspaceFoldersChangeEvent.fromJson(json['event'])
         : null;
     return new DidChangeWorkspaceFoldersParams(event);
   }
@@ -1936,6 +2800,24 @@
         obj.containsKey('event') &&
         WorkspaceFoldersChangeEvent.canParse(obj['event']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DidChangeWorkspaceFoldersParams) {
+      return event == other.event && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, event.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DidCloseTextDocumentParams implements ToJsonable {
@@ -1944,9 +2826,9 @@
       throw 'textDocument is required but was not provided';
     }
   }
-  factory DidCloseTextDocumentParams.fromJson(Map<String, dynamic> json) {
+  static DidCloseTextDocumentParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     return new DidCloseTextDocumentParams(textDocument);
   }
@@ -1966,6 +2848,24 @@
         obj.containsKey('textDocument') &&
         TextDocumentIdentifier.canParse(obj['textDocument']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DidCloseTextDocumentParams) {
+      return textDocument == other.textDocument && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DidOpenTextDocumentParams implements ToJsonable {
@@ -1974,9 +2874,9 @@
       throw 'textDocument is required but was not provided';
     }
   }
-  factory DidOpenTextDocumentParams.fromJson(Map<String, dynamic> json) {
+  static DidOpenTextDocumentParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentItem.fromJson(json['textDocument'])
+        ? TextDocumentItem.fromJson(json['textDocument'])
         : null;
     return new DidOpenTextDocumentParams(textDocument);
   }
@@ -1996,6 +2896,24 @@
         obj.containsKey('textDocument') &&
         TextDocumentItem.canParse(obj['textDocument']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DidOpenTextDocumentParams) {
+      return textDocument == other.textDocument && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DidSaveTextDocumentParams implements ToJsonable {
@@ -2004,16 +2922,16 @@
       throw 'textDocument is required but was not provided';
     }
   }
-  factory DidSaveTextDocumentParams.fromJson(Map<String, dynamic> json) {
+  static DidSaveTextDocumentParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final text = json['text'];
     return new DidSaveTextDocumentParams(textDocument, text);
   }
 
-  /// Optional the content when saved. Depends on the includeText value
-  /// when the save notification was requested.
+  /// Optional the content when saved. Depends on the includeText value when the
+  /// save notification was requested.
   final String text;
 
   /// The document that was saved.
@@ -2034,11 +2952,30 @@
         obj.containsKey('textDocument') &&
         TextDocumentIdentifier.canParse(obj['textDocument']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DidSaveTextDocumentParams) {
+      return textDocument == other.textDocument && text == other.text && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, text.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DocumentFilter implements ToJsonable {
   DocumentFilter(this.language, this.scheme, this.pattern);
-  factory DocumentFilter.fromJson(Map<String, dynamic> json) {
+  static DocumentFilter fromJson(Map<String, dynamic> json) {
     final language = json['language'];
     final scheme = json['scheme'];
     final pattern = json['pattern'];
@@ -2049,6 +2986,18 @@
   final String language;
 
   /// A glob pattern, like `*.{ts,js}`.
+  ///
+  /// Glob patterns can have the following syntax:
+  /// - `*` to match one or more characters in a path segment
+  /// - `?` to match on one character in a path segment
+  /// - `**` to match any number of path segments, including none
+  /// - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript
+  /// and JavaScript files)
+  /// - `[]` to declare a range of characters to match in a path segment (e.g.,
+  /// `example.[0-9]` to match on `example.0`, `example.1`, …)
+  /// - `[!...]` to negate a range of characters to match in a path segment
+  /// (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not
+  /// `example.0`)
   final String pattern;
 
   /// A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
@@ -2071,6 +3020,29 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentFilter) {
+      return language == other.language &&
+          scheme == other.scheme &&
+          pattern == other.pattern &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, language.hashCode);
+    hash = JenkinsSmiHash.combine(hash, scheme.hashCode);
+    hash = JenkinsSmiHash.combine(hash, pattern.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DocumentFormattingParams implements ToJsonable {
@@ -2082,12 +3054,12 @@
       throw 'options is required but was not provided';
     }
   }
-  factory DocumentFormattingParams.fromJson(Map<String, dynamic> json) {
+  static DocumentFormattingParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final options = json['options'] != null
-        ? new FormattingOptions.fromJson(json['options'])
+        ? FormattingOptions.fromJson(json['options'])
         : null;
     return new DocumentFormattingParams(textDocument, options);
   }
@@ -2114,22 +3086,42 @@
         obj.containsKey('options') &&
         FormattingOptions.canParse(obj['options']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentFormattingParams) {
+      return textDocument == other.textDocument &&
+          options == other.options &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// A document highlight is a range inside a text document which deserves
-/// special attention. Usually a document highlight is visualized by
-/// changing the background color of its range.
+/// special attention. Usually a document highlight is visualized by changing
+/// the background color of its range.
 class DocumentHighlight implements ToJsonable {
   DocumentHighlight(this.range, this.kind) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
   }
-  factory DocumentHighlight.fromJson(Map<String, dynamic> json) {
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+  static DocumentHighlight fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final kind = json['kind'] != null
-        ? new DocumentHighlightKind.fromJson(json['kind'])
+        ? DocumentHighlightKind.fromJson(json['kind'])
         : null;
     return new DocumentHighlight(range, kind);
   }
@@ -2154,6 +3146,25 @@
         obj.containsKey('range') &&
         Range.canParse(obj['range']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentHighlight) {
+      return range == other.range && kind == other.kind && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// A document highlight kind.
@@ -2161,7 +3172,7 @@
   const DocumentHighlightKind._(this._value);
   const DocumentHighlightKind.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -2193,18 +3204,16 @@
   bool operator ==(o) => o is DocumentHighlightKind && o._value == _value;
 }
 
-/// A document link is a range in a text document that links to an
-/// internal or external resource, like another text document or a web
-/// site.
+/// A document link is a range in a text document that links to an internal or
+/// external resource, like another text document or a web site.
 class DocumentLink implements ToJsonable {
   DocumentLink(this.range, this.target, this.data) {
     if (range == null) {
       throw 'range is required but was not provided';
     }
   }
-  factory DocumentLink.fromJson(Map<String, dynamic> json) {
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+  static DocumentLink fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final target = json['target'];
     final data = json['data'];
     return new DocumentLink(range, target, data);
@@ -2217,8 +3226,7 @@
   /// The range this link applies to.
   final Range range;
 
-  /// The uri this link points to. If missing a resolve request is sent
-  /// later.
+  /// The uri this link points to. If missing a resolve request is sent later.
   final String target;
 
   Map<String, dynamic> toJson() {
@@ -2238,12 +3246,35 @@
         obj.containsKey('range') &&
         Range.canParse(obj['range']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentLink) {
+      return range == other.range &&
+          target == other.target &&
+          data == other.data &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, target.hashCode);
+    hash = JenkinsSmiHash.combine(hash, data.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Document link options.
 class DocumentLinkOptions implements ToJsonable {
   DocumentLinkOptions(this.resolveProvider);
-  factory DocumentLinkOptions.fromJson(Map<String, dynamic> json) {
+  static DocumentLinkOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
     return new DocumentLinkOptions(resolveProvider);
   }
@@ -2262,6 +3293,24 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentLinkOptions) {
+      return resolveProvider == other.resolveProvider && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DocumentLinkParams implements ToJsonable {
@@ -2270,9 +3319,9 @@
       throw 'textDocument is required but was not provided';
     }
   }
-  factory DocumentLinkParams.fromJson(Map<String, dynamic> json) {
+  static DocumentLinkParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     return new DocumentLinkParams(textDocument);
   }
@@ -2292,24 +3341,41 @@
         obj.containsKey('textDocument') &&
         TextDocumentIdentifier.canParse(obj['textDocument']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentLinkParams) {
+      return textDocument == other.textDocument && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DocumentLinkRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
   DocumentLinkRegistrationOptions(this.resolveProvider, this.documentSelector);
-  factory DocumentLinkRegistrationOptions.fromJson(Map<String, dynamic> json) {
+  static DocumentLinkRegistrationOptions fromJson(Map<String, dynamic> json) {
     final resolveProvider = json['resolveProvider'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new DocumentLinkRegistrationOptions(
         resolveProvider, documentSelector);
   }
 
-  /// A document selector to identify the scope of the registration. If
-  /// set to null the document selector provided on the client side will
-  /// be used.
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// Document links have a resolve provider as well.
@@ -2328,10 +3394,30 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentLinkRegistrationOptions) {
+      return resolveProvider == other.resolveProvider &&
+          documentSelector == other.documentSelector &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, resolveProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Format document on type options.
@@ -2342,7 +3428,7 @@
       throw 'firstTriggerCharacter is required but was not provided';
     }
   }
-  factory DocumentOnTypeFormattingOptions.fromJson(Map<String, dynamic> json) {
+  static DocumentOnTypeFormattingOptions fromJson(Map<String, dynamic> json) {
     final firstTriggerCharacter = json['firstTriggerCharacter'];
     final moreTriggerCharacter = json['moreTriggerCharacter']
         ?.map((item) => item)
@@ -2373,6 +3459,28 @@
         obj.containsKey('firstTriggerCharacter') &&
         obj['firstTriggerCharacter'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentOnTypeFormattingOptions) {
+      return firstTriggerCharacter == other.firstTriggerCharacter &&
+          listEqual(moreTriggerCharacter, other.moreTriggerCharacter,
+              (String a, String b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, firstTriggerCharacter.hashCode);
+    hash = JenkinsSmiHash.combine(hash, moreTriggerCharacter.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DocumentOnTypeFormattingParams implements ToJsonable {
@@ -2391,16 +3499,15 @@
       throw 'options is required but was not provided';
     }
   }
-  factory DocumentOnTypeFormattingParams.fromJson(Map<String, dynamic> json) {
+  static DocumentOnTypeFormattingParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    final position = json['position'] != null
-        ? new Position.fromJson(json['position'])
-        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
     final ch = json['ch'];
     final options = json['options'] != null
-        ? new FormattingOptions.fromJson(json['options'])
+        ? FormattingOptions.fromJson(json['options'])
         : null;
     return new DocumentOnTypeFormattingParams(
         textDocument, position, ch, options);
@@ -2441,6 +3548,31 @@
         obj.containsKey('options') &&
         FormattingOptions.canParse(obj['options']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentOnTypeFormattingParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          ch == other.ch &&
+          options == other.options &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, ch.hashCode);
+    hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DocumentOnTypeFormattingRegistrationOptions
@@ -2451,7 +3583,7 @@
       throw 'firstTriggerCharacter is required but was not provided';
     }
   }
-  factory DocumentOnTypeFormattingRegistrationOptions.fromJson(
+  static DocumentOnTypeFormattingRegistrationOptions fromJson(
       Map<String, dynamic> json) {
     final firstTriggerCharacter = json['firstTriggerCharacter'];
     final moreTriggerCharacter = json['moreTriggerCharacter']
@@ -2459,16 +3591,15 @@
         ?.cast<String>()
         ?.toList();
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new DocumentOnTypeFormattingRegistrationOptions(
         firstTriggerCharacter, moreTriggerCharacter, documentSelector);
   }
 
-  /// A document selector to identify the scope of the registration. If
-  /// set to null the document selector provided on the client side will
-  /// be used.
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   /// A character on which formatting should be triggered, like `}`.
@@ -2494,10 +3625,33 @@
         obj['firstTriggerCharacter'] is String &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentOnTypeFormattingRegistrationOptions) {
+      return firstTriggerCharacter == other.firstTriggerCharacter &&
+          listEqual(moreTriggerCharacter, other.moreTriggerCharacter,
+              (String a, String b) => a == b) &&
+          documentSelector == other.documentSelector &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, firstTriggerCharacter.hashCode);
+    hash = JenkinsSmiHash.combine(hash, moreTriggerCharacter.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DocumentRangeFormattingParams implements ToJsonable {
@@ -2512,14 +3666,13 @@
       throw 'options is required but was not provided';
     }
   }
-  factory DocumentRangeFormattingParams.fromJson(Map<String, dynamic> json) {
+  static DocumentRangeFormattingParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final options = json['options'] != null
-        ? new FormattingOptions.fromJson(json['options'])
+        ? FormattingOptions.fromJson(json['options'])
         : null;
     return new DocumentRangeFormattingParams(textDocument, range, options);
   }
@@ -2552,13 +3705,35 @@
         obj.containsKey('options') &&
         FormattingOptions.canParse(obj['options']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentRangeFormattingParams) {
+      return textDocument == other.textDocument &&
+          range == other.range &&
+          options == other.options &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Represents programming constructs like variables, classes,
-/// interfaces etc. that appear in a document. Document symbols can be
-/// hierarchical and they have two ranges: one that encloses its
-/// definition and one that points to its most interesting range, e.g.
-/// the range of an identifier.
+/// Represents programming constructs like variables, classes, interfaces etc.
+/// that appear in a document. Document symbols can be hierarchical and they
+/// have two ranges: one that encloses its definition and one that points to its
+/// most interesting range, e.g. the range of an identifier.
 class DocumentSymbol implements ToJsonable {
   DocumentSymbol(this.name, this.detail, this.kind, this.deprecated, this.range,
       this.selectionRange, this.children) {
@@ -2575,19 +3750,18 @@
       throw 'selectionRange is required but was not provided';
     }
   }
-  factory DocumentSymbol.fromJson(Map<String, dynamic> json) {
+  static DocumentSymbol fromJson(Map<String, dynamic> json) {
     final name = json['name'];
     final detail = json['detail'];
     final kind =
-        json['kind'] != null ? new SymbolKind.fromJson(json['kind']) : null;
+        json['kind'] != null ? SymbolKind.fromJson(json['kind']) : null;
     final deprecated = json['deprecated'];
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final selectionRange = json['selectionRange'] != null
-        ? new Range.fromJson(json['selectionRange'])
+        ? Range.fromJson(json['selectionRange'])
         : null;
     final children = json['children']
-        ?.map((item) => item != null ? new DocumentSymbol.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentSymbol.fromJson(item) : null)
         ?.cast<DocumentSymbol>()
         ?.toList();
     return new DocumentSymbol(
@@ -2606,18 +3780,19 @@
   /// The kind of this symbol.
   final SymbolKind kind;
 
-  /// The name of this symbol.
+  /// The name of this symbol. Will be displayed in the user interface and
+  /// therefore must not be an empty string or a string only consisting of white
+  /// spaces.
   final String name;
 
-  /// The range enclosing this symbol not including leading/trailing
-  /// whitespace but everything else like comments. This information is
-  /// typically used to determine if the clients cursor is inside the
-  /// symbol to reveal in the symbol in the UI.
+  /// The range enclosing this symbol not including leading/trailing whitespace
+  /// but everything else like comments. This information is typically used to
+  /// determine if the clients cursor is inside the symbol to reveal in the
+  /// symbol in the UI.
   final Range range;
 
-  /// The range that should be selected and revealed when this symbol is
-  /// being picked, e.g the name of a function. Must be contained by the
-  /// `range`.
+  /// The range that should be selected and revealed when this symbol is being
+  /// picked, e.g the name of a function. Must be contained by the `range`.
   final Range selectionRange;
 
   Map<String, dynamic> toJson() {
@@ -2650,6 +3825,38 @@
         obj.containsKey('selectionRange') &&
         Range.canParse(obj['selectionRange']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentSymbol) {
+      return name == other.name &&
+          detail == other.detail &&
+          kind == other.kind &&
+          deprecated == other.deprecated &&
+          range == other.range &&
+          selectionRange == other.selectionRange &&
+          listEqual(children, other.children,
+              (DocumentSymbol a, DocumentSymbol b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = JenkinsSmiHash.combine(hash, detail.hashCode);
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, deprecated.hashCode);
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, selectionRange.hashCode);
+    hash = JenkinsSmiHash.combine(hash, children.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class DocumentSymbolParams implements ToJsonable {
@@ -2658,9 +3865,9 @@
       throw 'textDocument is required but was not provided';
     }
   }
-  factory DocumentSymbolParams.fromJson(Map<String, dynamic> json) {
+  static DocumentSymbolParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     return new DocumentSymbolParams(textDocument);
   }
@@ -2680,19 +3887,60 @@
         obj.containsKey('textDocument') &&
         TextDocumentIdentifier.canParse(obj['textDocument']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is DocumentSymbolParams) {
+      return textDocument == other.textDocument && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-abstract class ErrorCodes {
-  static const InternalError = -32603;
-  static const InvalidParams = -32602;
-  static const InvalidRequest = -32600;
-  static const MethodNotFound = -32601;
-  static const ParseError = -32700;
-  static const RequestCancelled = -32800;
-  static const ServerNotInitialized = -32002;
-  static const UnknownErrorCode = -32001;
-  static const serverErrorEnd = -32000;
-  static const serverErrorStart = -32099;
+class ErrorCodes {
+  const ErrorCodes(this._value);
+  const ErrorCodes.fromJson(this._value);
+
+  final num _value;
+
+  static bool canParse(Object obj) {
+    return obj is num;
+  }
+
+  /// Defined by JSON RPC
+  static const ParseError = const ErrorCodes(-32700);
+  static const InvalidRequest = const ErrorCodes(-32600);
+  static const MethodNotFound = const ErrorCodes(-32601);
+  static const InvalidParams = const ErrorCodes(-32602);
+  static const InternalError = const ErrorCodes(-32603);
+  static const serverErrorStart = const ErrorCodes(-32099);
+  static const serverErrorEnd = const ErrorCodes(-32000);
+  static const ServerNotInitialized = const ErrorCodes(-32002);
+  static const UnknownErrorCode = const ErrorCodes(-32001);
+
+  /// Defined by the protocol.
+  static const RequestCancelled = const ErrorCodes(-32800);
+  static const ContentModified = const ErrorCodes(-32801);
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  get hashCode => _value.hashCode;
+
+  bool operator ==(o) => o is ErrorCodes && o._value == _value;
 }
 
 /// Execute command options.
@@ -2702,7 +3950,7 @@
       throw 'commands is required but was not provided';
     }
   }
-  factory ExecuteCommandOptions.fromJson(Map<String, dynamic> json) {
+  static ExecuteCommandOptions fromJson(Map<String, dynamic> json) {
     final commands =
         json['commands']?.map((item) => item)?.cast<String>()?.toList();
     return new ExecuteCommandOptions(commands);
@@ -2722,9 +3970,28 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('commands') &&
         (obj['commands'] is List &&
-            (obj['commands'].length == 0 ||
-                obj['commands'].every((item) => item is String)));
+            (obj['commands'].every((item) => item is String)));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ExecuteCommandOptions) {
+      return listEqual(
+              commands, other.commands, (String a, String b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, commands.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ExecuteCommandParams implements ToJsonable {
@@ -2733,7 +4000,7 @@
       throw 'command is required but was not provided';
     }
   }
-  factory ExecuteCommandParams.fromJson(Map<String, dynamic> json) {
+  static ExecuteCommandParams fromJson(Map<String, dynamic> json) {
     final command = json['command'];
     final arguments =
         json['arguments']?.map((item) => item)?.cast<dynamic>()?.toList();
@@ -2761,6 +4028,28 @@
         obj.containsKey('command') &&
         obj['command'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ExecuteCommandParams) {
+      return command == other.command &&
+          listEqual(
+              arguments, other.arguments, (dynamic a, dynamic b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, command.hashCode);
+    hash = JenkinsSmiHash.combine(hash, arguments.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Execute command registration options.
@@ -2770,8 +4059,7 @@
       throw 'commands is required but was not provided';
     }
   }
-  factory ExecuteCommandRegistrationOptions.fromJson(
-      Map<String, dynamic> json) {
+  static ExecuteCommandRegistrationOptions fromJson(Map<String, dynamic> json) {
     final commands =
         json['commands']?.map((item) => item)?.cast<String>()?.toList();
     return new ExecuteCommandRegistrationOptions(commands);
@@ -2791,16 +4079,35 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('commands') &&
         (obj['commands'] is List &&
-            (obj['commands'].length == 0 ||
-                obj['commands'].every((item) => item is String)));
+            (obj['commands'].every((item) => item is String)));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ExecuteCommandRegistrationOptions) {
+      return listEqual(
+              commands, other.commands, (String a, String b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, commands.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class FailureHandlingKind {
   const FailureHandlingKind._(this._value);
   const FailureHandlingKind.fromJson(this._value);
 
-  final Object _value;
+  final String _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -2813,25 +4120,23 @@
     return false;
   }
 
-  /// Applying the workspace change is simply aborted if one of the
-  /// changes provided fails. All operations executed before the
-  /// failing operation stay executed.
+  /// Applying the workspace change is simply aborted if one of the changes
+  /// provided fails. All operations executed before the failing operation stay
+  /// executed.
   static const Abort = const FailureHandlingKind._('abort');
 
-  /// All operations are executed transactional. That means they
-  /// either all succeed or no changes at all are applied to the
-  /// workspace.
+  /// All operations are executed transactional. That means they either all
+  /// succeed or no changes at all are applied to the workspace.
   static const Transactional = const FailureHandlingKind._('transactional');
 
-  /// If the workspace edit contains only textual file changes they
-  /// are executed transactional. If resource changes (create, rename
-  /// or delete file) are part of the change the failure handling
-  /// startegy is abort.
+  /// If the workspace edit contains only textual file changes they are executed
+  /// transactional. If resource changes (create, rename or delete file) are
+  /// part of the change the failure handling strategy is abort.
   static const TextOnlyTransactional =
       const FailureHandlingKind._('textOnlyTransactional');
 
-  /// The client tries to undo the operations already executed. But
-  /// there is no guaruntee that this is succeeding.
+  /// The client tries to undo the operations already executed. But there is no
+  /// guarantee that this is succeeding.
   static const Undo = const FailureHandlingKind._('undo');
 
   Object toJson() => _value;
@@ -2850,7 +4155,7 @@
   const FileChangeType._(this._value);
   const FileChangeType.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -2892,7 +4197,7 @@
       throw 'type is required but was not provided';
     }
   }
-  factory FileEvent.fromJson(Map<String, dynamic> json) {
+  static FileEvent fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
     final type = json['type'];
     return new FileEvent(uri, type);
@@ -2918,6 +4223,25 @@
         obj.containsKey('type') &&
         obj['type'] is num;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is FileEvent) {
+      return uri == other.uri && type == other.type && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, type.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class FileSystemWatcher implements ToJsonable {
@@ -2926,19 +4250,29 @@
       throw 'globPattern is required but was not provided';
     }
   }
-  factory FileSystemWatcher.fromJson(Map<String, dynamic> json) {
+  static FileSystemWatcher fromJson(Map<String, dynamic> json) {
     final globPattern = json['globPattern'];
-    final kind =
-        json['kind'] != null ? new WatchKind.fromJson(json['kind']) : null;
+    final kind = json['kind'] != null ? WatchKind.fromJson(json['kind']) : null;
     return new FileSystemWatcher(globPattern, kind);
   }
 
-  /// The  glob pattern to watch
+  /// The  glob pattern to watch.
+  ///
+  /// Glob patterns can have the following syntax:
+  /// - `*` to match one or more characters in a path segment
+  /// - `?` to match on one character in a path segment
+  /// - `**` to match any number of path segments, including none
+  /// - `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript
+  /// and JavaScript files)
+  /// - `[]` to declare a range of characters to match in a path segment (e.g.,
+  /// `example.[0-9]` to match on `example.0`, `example.1`, …)
+  /// - `[!...]` to negate a range of characters to match in a path segment
+  /// (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not
+  /// `example.0`)
   final String globPattern;
 
-  /// The kind of events of interest. If omitted it defaults to
-  /// WatchKind.Create | WatchKind.Change | WatchKind.Delete which
-  /// is 7.
+  /// The kind of events of interest. If omitted it defaults to WatchKind.Create
+  /// | WatchKind.Change | WatchKind.Delete which is 7.
   final WatchKind kind;
 
   Map<String, dynamic> toJson() {
@@ -2956,6 +4290,25 @@
         obj.containsKey('globPattern') &&
         obj['globPattern'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is FileSystemWatcher) {
+      return globPattern == other.globPattern && kind == other.kind && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, globPattern.hashCode);
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Represents a folding range.
@@ -2969,34 +4322,32 @@
       throw 'endLine is required but was not provided';
     }
   }
-  factory FoldingRange.fromJson(Map<String, dynamic> json) {
+  static FoldingRange fromJson(Map<String, dynamic> json) {
     final startLine = json['startLine'];
     final startCharacter = json['startCharacter'];
     final endLine = json['endLine'];
     final endCharacter = json['endCharacter'];
-    final kind = json['kind'] != null
-        ? new FoldingRangeKind.fromJson(json['kind'])
-        : null;
+    final kind =
+        json['kind'] != null ? FoldingRangeKind.fromJson(json['kind']) : null;
     return new FoldingRange(
         startLine, startCharacter, endLine, endCharacter, kind);
   }
 
-  /// The zero-based character offset before the folded range ends.
-  /// If not defined, defaults to the length of the end line.
+  /// The zero-based character offset before the folded range ends. If not
+  /// defined, defaults to the length of the end line.
   final num endCharacter;
 
   /// The zero-based line number where the folded range ends.
   final num endLine;
 
-  /// Describes the kind of the folding range such as `comment' or
-  /// 'region'. The kind is used to categorize folding ranges and
-  /// used by commands like 'Fold all comments'. See
-  /// [FoldingRangeKind] for an enumeration of standardized kinds.
+  /// Describes the kind of the folding range such as `comment' or 'region'. The
+  /// kind is used to categorize folding ranges and used by commands like 'Fold
+  /// all comments'. See [FoldingRangeKind] for an enumeration of standardized
+  /// kinds.
   final FoldingRangeKind kind;
 
-  /// The zero-based character offset from where the folded range
-  /// starts. If not defined, defaults to the length of the start
-  /// line.
+  /// The zero-based character offset from where the folded range starts. If not
+  /// defined, defaults to the length of the start line.
   final num startCharacter;
 
   /// The zero-based line number from where the folded range starts.
@@ -3027,6 +4378,33 @@
         obj.containsKey('endLine') &&
         obj['endLine'] is num;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is FoldingRange) {
+      return startLine == other.startLine &&
+          startCharacter == other.startCharacter &&
+          endLine == other.endLine &&
+          endCharacter == other.endCharacter &&
+          kind == other.kind &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, startLine.hashCode);
+    hash = JenkinsSmiHash.combine(hash, startCharacter.hashCode);
+    hash = JenkinsSmiHash.combine(hash, endLine.hashCode);
+    hash = JenkinsSmiHash.combine(hash, endCharacter.hashCode);
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Enum of known range kinds
@@ -3034,26 +4412,26 @@
   const FoldingRangeKind._(this._value);
   const FoldingRangeKind.fromJson(this._value);
 
-  final Object _value;
+  final String _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
-      case 'comment':
-      case 'imports':
-      case 'region':
+      case r'comment':
+      case r'imports':
+      case r'region':
         return true;
     }
     return false;
   }
 
   /// Folding range for a comment
-  static const Comment = const FoldingRangeKind._('comment');
+  static const Comment = const FoldingRangeKind._(r'comment');
 
   /// Folding range for a imports or includes
-  static const Imports = const FoldingRangeKind._('imports');
+  static const Imports = const FoldingRangeKind._(r'imports');
 
   /// Folding range for a region (e.g. `#region`)
-  static const Region = const FoldingRangeKind._('region');
+  static const Region = const FoldingRangeKind._(r'region');
 
   Object toJson() => _value;
 
@@ -3072,9 +4450,9 @@
       throw 'textDocument is required but was not provided';
     }
   }
-  factory FoldingRangeParams.fromJson(Map<String, dynamic> json) {
+  static FoldingRangeParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     return new FoldingRangeParams(textDocument);
   }
@@ -3094,10 +4472,32 @@
         obj.containsKey('textDocument') &&
         TextDocumentIdentifier.canParse(obj['textDocument']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is FoldingRangeParams) {
+      return textDocument == other.textDocument && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Folding range provider options.
 class FoldingRangeProviderOptions implements ToJsonable {
+  static FoldingRangeProviderOptions fromJson(Map<String, dynamic> json) {
+    return new FoldingRangeProviderOptions();
+  }
+
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
     return __result;
@@ -3106,6 +4506,23 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is FoldingRangeProviderOptions) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Value-object describing what options formatting should use.
@@ -3118,7 +4535,7 @@
       throw 'insertSpaces is required but was not provided';
     }
   }
-  factory FormattingOptions.fromJson(Map<String, dynamic> json) {
+  static FormattingOptions fromJson(Map<String, dynamic> json) {
     final tabSize = json['tabSize'];
     final insertSpaces = json['insertSpaces'];
     return new FormattingOptions(tabSize, insertSpaces);
@@ -3146,6 +4563,27 @@
         obj.containsKey('insertSpaces') &&
         obj['insertSpaces'] is bool;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is FormattingOptions) {
+      return tabSize == other.tabSize &&
+          insertSpaces == other.insertSpaces &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, tabSize.hashCode);
+    hash = JenkinsSmiHash.combine(hash, insertSpaces.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// The result of a hover request.
@@ -3155,38 +4593,23 @@
       throw 'contents is required but was not provided';
     }
   }
-  factory Hover.fromJson(Map<String, dynamic> json) {
-    final contents = MarkedString.canParse(json['contents'])
-        ? new Either3<MarkedString, List<MarkedString>, MarkupContent>.t1(
-            json['contents'] != null
-                ? new MarkedString.fromJson(json['contents'])
+  static Hover fromJson(Map<String, dynamic> json) {
+    final contents = json['contents'] is String
+        ? new Either2<String, MarkupContent>.t1(json['contents'])
+        : (MarkupContent.canParse(json['contents'])
+            ? new Either2<String, MarkupContent>.t2(json['contents'] != null
+                ? MarkupContent.fromJson(json['contents'])
                 : null)
-        : ((json['contents'] is List &&
-                (json['contents'].length == 0 ||
-                    json['contents']
-                        .every((item) => MarkedString.canParse(item))))
-            ? new Either3<MarkedString, List<MarkedString>, MarkupContent>.t2(json['contents']
-                ?.map((item) =>
-                    item != null ? new MarkedString.fromJson(item) : null)
-                ?.cast<MarkedString>()
-                ?.toList())
-            : (MarkupContent.canParse(json['contents'])
-                ? new Either3<MarkedString, List<MarkedString>, MarkupContent>.t3(
-                    json['contents'] != null
-                        ? new MarkupContent.fromJson(json['contents'])
-                        : null)
-                : (throw '''${json['contents']} was not one of (MarkedString, MarkedString[], MarkupContent)''')));
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+            : (throw '''${json['contents']} was not one of (String, MarkupContent)'''));
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     return new Hover(contents, range);
   }
 
   /// The hover's content
-  final Either3<MarkedString, List<MarkedString>, MarkupContent> contents;
+  final Either2<String, MarkupContent> contents;
 
-  /// An optional range is a range inside a text document that is
-  /// used to visualize a hover, e.g. by changing the background
-  /// color.
+  /// An optional range is a range inside a text document that is used to
+  /// visualize a hover, e.g. by changing the background color.
   final Range range;
 
   Map<String, dynamic> toJson() {
@@ -3202,37 +4625,57 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('contents') &&
-        (MarkedString.canParse(obj['contents']) ||
-            (obj['contents'] is List &&
-                (obj['contents'].length == 0 ||
-                    obj['contents']
-                        .every((item) => MarkedString.canParse(item)))) ||
-            MarkupContent.canParse(obj['contents']));
+        (obj['contents'] is String || MarkupContent.canParse(obj['contents']));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Hover) {
+      return contents == other.contents && range == other.range && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, contents.hashCode);
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class InitializeParams implements ToJsonable {
-  InitializeParams(this.processId, this.rootPath, this.rootUri,
-      this.initializationOptions, this.capabilities, this.workspaceFolders) {
+  InitializeParams(
+      this.processId,
+      this.rootPath,
+      this.rootUri,
+      this.initializationOptions,
+      this.capabilities,
+      this.trace,
+      this.workspaceFolders) {
     if (capabilities == null) {
       throw 'capabilities is required but was not provided';
     }
   }
-  factory InitializeParams.fromJson(Map<String, dynamic> json) {
+  static InitializeParams fromJson(Map<String, dynamic> json) {
     final processId = json['processId'];
     final rootPath = json['rootPath'];
     final rootUri = json['rootUri'];
     final initializationOptions = json['initializationOptions'];
     final capabilities = json['capabilities'] != null
-        ? new ClientCapabilities.fromJson(json['capabilities'])
+        ? ClientCapabilities.fromJson(json['capabilities'])
         : null;
+    final trace = json['trace'];
     final workspaceFolders = json['workspaceFolders']
-        ?.map(
-            (item) => item != null ? new WorkspaceFolder.fromJson(item) : null)
+        ?.map((item) => item != null ? WorkspaceFolder.fromJson(item) : null)
         ?.cast<WorkspaceFolder>()
         ?.toList();
     return new InitializeParams(processId, rootPath, rootUri,
-        initializationOptions, capabilities, workspaceFolders);
+        initializationOptions, capabilities, trace, workspaceFolders);
   }
 
   /// The capabilities provided by the client (editor or tool)
@@ -3241,10 +4684,10 @@
   /// User provided initialization options.
   final dynamic initializationOptions;
 
-  /// The process Id of the parent process that started the
-  /// server. Is null if the process has not been started by
-  /// another process. If the parent process is not alive then the
-  /// server should exit (see exit notification) its process.
+  /// The process Id of the parent process that started the server. Is null if
+  /// the process has not been started by another process. If the parent process
+  /// is not alive then the server should exit (see exit notification) its
+  /// process.
   final num processId;
 
   /// The rootPath of the workspace. Is null if no folder is open.
@@ -3252,14 +4695,17 @@
   @core.deprecated
   final String rootPath;
 
-  /// The rootUri of the workspace. Is null if no folder is open.
-  /// If both `rootPath` and `rootUri` are set `rootUri` wins.
+  /// The rootUri of the workspace. Is null if no folder is open. If both
+  /// `rootPath` and `rootUri` are set `rootUri` wins.
   final String rootUri;
 
-  /// The workspace folders configured in the client when the
-  /// server starts. This property is only available if the client
-  /// supports workspace folders. It can be `null` if the client
-  /// supports workspace folders but none are configured.
+  /// The initial trace setting. If omitted trace is disabled ('off').
+  final String trace;
+
+  /// The workspace folders configured in the client when the server starts.
+  /// This property is only available if the client supports workspace folders.
+  /// It can be `null` if the client supports workspace folders but none are
+  /// configured.
   ///
   /// Since 3.6.0
   final List<WorkspaceFolder> workspaceFolders;
@@ -3267,9 +4713,7 @@
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
     __result['processId'] = processId;
-    // ignore: deprecated_member_use
     if (rootPath != null) {
-      // ignore: deprecated_member_use
       __result['rootPath'] = rootPath;
     }
     __result['rootUri'] = rootUri;
@@ -3278,6 +4722,9 @@
     }
     __result['capabilities'] =
         capabilities ?? (throw 'capabilities is required but was not set');
+    if (trace != null) {
+      __result['trace'] = trace;
+    }
     if (workspaceFolders != null) {
       __result['workspaceFolders'] = workspaceFolders;
     }
@@ -3293,6 +4740,38 @@
         obj.containsKey('capabilities') &&
         ClientCapabilities.canParse(obj['capabilities']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is InitializeParams) {
+      return processId == other.processId &&
+          rootPath == other.rootPath &&
+          rootUri == other.rootUri &&
+          initializationOptions == other.initializationOptions &&
+          capabilities == other.capabilities &&
+          trace == other.trace &&
+          listEqual(workspaceFolders, other.workspaceFolders,
+              (WorkspaceFolder a, WorkspaceFolder b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, processId.hashCode);
+    hash = JenkinsSmiHash.combine(hash, rootPath.hashCode);
+    hash = JenkinsSmiHash.combine(hash, rootUri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, initializationOptions.hashCode);
+    hash = JenkinsSmiHash.combine(hash, capabilities.hashCode);
+    hash = JenkinsSmiHash.combine(hash, trace.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workspaceFolders.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class InitializeResult implements ToJsonable {
@@ -3301,9 +4780,9 @@
       throw 'capabilities is required but was not provided';
     }
   }
-  factory InitializeResult.fromJson(Map<String, dynamic> json) {
+  static InitializeResult fromJson(Map<String, dynamic> json) {
     final capabilities = json['capabilities'] != null
-        ? new ServerCapabilities.fromJson(json['capabilities'])
+        ? ServerCapabilities.fromJson(json['capabilities'])
         : null;
     return new InitializeResult(capabilities);
   }
@@ -3323,9 +4802,31 @@
         obj.containsKey('capabilities') &&
         ServerCapabilities.canParse(obj['capabilities']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is InitializeResult) {
+      return capabilities == other.capabilities && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, capabilities.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class InitializedParams implements ToJsonable {
+  static InitializedParams fromJson(Map<String, dynamic> json) {
+    return new InitializedParams();
+  }
+
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
     return __result;
@@ -3334,15 +4835,32 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is InitializedParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Defines whether the insert text in a completion item should be
-/// interpreted as plain text or a snippet.
+/// Defines whether the insert text in a completion item should be interpreted
+/// as plain text or a snippet.
 class InsertTextFormat {
   const InsertTextFormat._(this._value);
   const InsertTextFormat.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -3353,17 +4871,15 @@
     return false;
   }
 
-  /// The primary text to be inserted is treated as a plain
-  /// string.
+  /// The primary text to be inserted is treated as a plain string.
   static const PlainText = const InsertTextFormat._(1);
 
   /// The primary text to be inserted is treated as a snippet.
   ///
-  /// A snippet can define tab stops and placeholders with `$1`,
-  /// `$2` and `${3:foo}`. `$0` defines the final tab stop, it
-  /// defaults to the end of the snippet. Placeholders with
-  /// equal identifiers are linked, that is typing in one will
-  /// update others too.
+  /// A snippet can define tab stops and placeholders with `$1`, `$2` and
+  /// `${3:foo}`. `$0` defines the final tab stop, it defaults to the end of the
+  /// snippet. Placeholders with equal identifiers are linked, that is typing in
+  /// one will update others too.
   static const Snippet = const InsertTextFormat._(2);
 
   Object toJson() => _value;
@@ -3386,10 +4902,9 @@
       throw 'range is required but was not provided';
     }
   }
-  factory Location.fromJson(Map<String, dynamic> json) {
+  static Location fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     return new Location(uri, range);
   }
 
@@ -3410,6 +4925,117 @@
         obj.containsKey('range') &&
         Range.canParse(obj['range']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Location) {
+      return uri == other.uri && range == other.range && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class LocationLink implements ToJsonable {
+  LocationLink(this.originSelectionRange, this.targetUri, this.targetRange,
+      this.targetSelectionRange) {
+    if (targetUri == null) {
+      throw 'targetUri is required but was not provided';
+    }
+    if (targetRange == null) {
+      throw 'targetRange is required but was not provided';
+    }
+    if (targetSelectionRange == null) {
+      throw 'targetSelectionRange is required but was not provided';
+    }
+  }
+  static LocationLink fromJson(Map<String, dynamic> json) {
+    final originSelectionRange = json['originSelectionRange'] != null
+        ? Range.fromJson(json['originSelectionRange'])
+        : null;
+    final targetUri = json['targetUri'];
+    final targetRange = json['targetRange'] != null
+        ? Range.fromJson(json['targetRange'])
+        : null;
+    final targetSelectionRange = json['targetSelectionRange'] != null
+        ? Range.fromJson(json['targetSelectionRange'])
+        : null;
+    return new LocationLink(
+        originSelectionRange, targetUri, targetRange, targetSelectionRange);
+  }
+
+  /// Span of the origin of this link.
+  ///
+  /// Used as the underlined span for mouse interaction. Defaults to the word
+  /// range at the mouse position.
+  final Range originSelectionRange;
+
+  /// The full target range of this link.
+  final Range targetRange;
+
+  /// The span of this link.
+  final Range targetSelectionRange;
+
+  /// The target resource identifier of this link.
+  final String targetUri;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (originSelectionRange != null) {
+      __result['originSelectionRange'] = originSelectionRange;
+    }
+    __result['targetUri'] =
+        targetUri ?? (throw 'targetUri is required but was not set');
+    __result['targetRange'] =
+        targetRange ?? (throw 'targetRange is required but was not set');
+    if (targetSelectionRange != null) {
+      __result['targetSelectionRange'] = targetSelectionRange;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic> &&
+        obj.containsKey('targetUri') &&
+        obj['targetUri'] is String &&
+        obj.containsKey('targetRange') &&
+        Range.canParse(obj['targetRange']);
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is LocationLink) {
+      return originSelectionRange == other.originSelectionRange &&
+          targetUri == other.targetUri &&
+          targetRange == other.targetRange &&
+          targetSelectionRange == other.targetSelectionRange &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, originSelectionRange.hashCode);
+    hash = JenkinsSmiHash.combine(hash, targetUri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, targetRange.hashCode);
+    hash = JenkinsSmiHash.combine(hash, targetSelectionRange.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class LogMessageParams implements ToJsonable {
@@ -3421,9 +5047,9 @@
       throw 'message is required but was not provided';
     }
   }
-  factory LogMessageParams.fromJson(Map<String, dynamic> json) {
+  static LogMessageParams fromJson(Map<String, dynamic> json) {
     final type =
-        json['type'] != null ? new MessageType.fromJson(json['type']) : null;
+        json['type'] != null ? MessageType.fromJson(json['type']) : null;
     final message = json['message'];
     return new LogMessageParams(type, message);
   }
@@ -3449,55 +5075,37 @@
         obj.containsKey('message') &&
         obj['message'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is LogMessageParams) {
+      return type == other.type && message == other.message && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = JenkinsSmiHash.combine(hash, message.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-class MarkedString implements ToJsonable {
-  MarkedString(this.language, this.value) {
-    if (language == null) {
-      throw 'language is required but was not provided';
-    }
-    if (value == null) {
-      throw 'value is required but was not provided';
-    }
-  }
-  factory MarkedString.fromJson(Map<String, dynamic> json) {
-    final language = json['language'];
-    final value = json['value'];
-    return new MarkedString(language, value);
-  }
-
-  final String language;
-  final String value;
-
-  Map<String, dynamic> toJson() {
-    Map<String, dynamic> __result = {};
-    __result['language'] =
-        language ?? (throw 'language is required but was not set');
-    __result['value'] = value ?? (throw 'value is required but was not set');
-    return __result;
-  }
-
-  static bool canParse(Object obj) {
-    return obj is Map<String, dynamic> &&
-        obj.containsKey('language') &&
-        obj['language'] is String &&
-        obj.containsKey('value') &&
-        obj['value'] is String;
-  }
-}
-
-/// A `MarkupContent` literal represents a string value which
-/// content is interpreted base on its kind flag. Currently the
-/// protocol supports `plaintext` and `markdown` as markup
-/// kinds.
+/// A `MarkupContent` literal represents a string value which content is
+/// interpreted base on its kind flag. Currently the protocol supports
+/// `plaintext` and `markdown` as markup kinds.
 ///
-/// If the kind is `markdown` then the value can contain fenced
-/// code blocks like in GitHub issues. See
+/// If the kind is `markdown` then the value can contain fenced code blocks like
+/// in GitHub issues. See
 /// https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
 ///
-/// Here is an example how such a string can be constructed
-/// using JavaScript / TypeScript: ```ts let markdown:
-/// MarkdownContent = {
+/// Here is an example how such a string can be constructed using JavaScript /
+/// TypeScript: ```typescript let markdown: MarkdownContent = {
 ///
 /// kind: MarkupKind.Markdown,
 /// 	value: [
@@ -3508,9 +5116,8 @@
 /// 		'```'
 /// 	].join('\n') }; ```
 ///
-/// *Please Note* that clients might sanitize the return
-/// markdown. A client could decide to remove HTML from the
-/// markdown to avoid script execution.
+/// *Please Note* that clients might sanitize the return markdown. A client
+/// could decide to remove HTML from the markdown to avoid script execution.
 class MarkupContent implements ToJsonable {
   MarkupContent(this.kind, this.value) {
     if (kind == null) {
@@ -3520,9 +5127,9 @@
       throw 'value is required but was not provided';
     }
   }
-  factory MarkupContent.fromJson(Map<String, dynamic> json) {
+  static MarkupContent fromJson(Map<String, dynamic> json) {
     final kind =
-        json['kind'] != null ? new MarkupKind.fromJson(json['kind']) : null;
+        json['kind'] != null ? MarkupKind.fromJson(json['kind']) : null;
     final value = json['value'];
     return new MarkupContent(kind, value);
   }
@@ -3543,38 +5150,56 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('kind') &&
-        MarkupKind.canParse(obj['kind']) &&
+        obj['kind'] is String &&
         obj.containsKey('value') &&
         obj['value'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is MarkupContent) {
+      return kind == other.kind && value == other.value && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, value.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Describes the content type that a client supports in various
-/// result literals like `Hover`, `ParameterInfo` or
-/// `CompletionItem`.
+/// Describes the content type that a client supports in various result literals
+/// like `Hover`, `ParameterInfo` or `CompletionItem`.
 ///
-/// Please note that `MarkupKinds` must not start with a `$`.
-/// This kinds are reserved for internal usage.
+/// Please note that `MarkupKinds` must not start with a `$`. This kinds are
+/// reserved for internal usage.
 class MarkupKind {
   const MarkupKind._(this._value);
   const MarkupKind.fromJson(this._value);
 
-  final Object _value;
+  final String _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
-      case 'plaintext':
-      case 'markdown':
+      case r'plaintext':
+      case r'markdown':
         return true;
     }
     return false;
   }
 
   /// Plain text is supported as a content format
-  static const PlainText = const MarkupKind._('plaintext');
+  static const PlainText = const MarkupKind._(r'plaintext');
 
   /// Markdown is supported as a content format
-  static const Markdown = const MarkupKind._('markdown');
+  static const Markdown = const MarkupKind._(r'markdown');
 
   Object toJson() => _value;
 
@@ -3593,7 +5218,16 @@
       throw 'jsonrpc is required but was not provided';
     }
   }
-  factory Message.fromJson(Map<String, dynamic> json) {
+  static Message fromJson(Map<String, dynamic> json) {
+    if (RequestMessage.canParse(json)) {
+      return RequestMessage.fromJson(json);
+    }
+    if (ResponseMessage.canParse(json)) {
+      return ResponseMessage.fromJson(json);
+    }
+    if (NotificationMessage.canParse(json)) {
+      return NotificationMessage.fromJson(json);
+    }
     final jsonrpc = json['jsonrpc'];
     return new Message(jsonrpc);
   }
@@ -3612,6 +5246,24 @@
         obj.containsKey('jsonrpc') &&
         obj['jsonrpc'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Message) {
+      return jsonrpc == other.jsonrpc && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, jsonrpc.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class MessageActionItem implements ToJsonable {
@@ -3620,7 +5272,7 @@
       throw 'title is required but was not provided';
     }
   }
-  factory MessageActionItem.fromJson(Map<String, dynamic> json) {
+  static MessageActionItem fromJson(Map<String, dynamic> json) {
     final title = json['title'];
     return new MessageActionItem(title);
   }
@@ -3639,13 +5291,31 @@
         obj.containsKey('title') &&
         obj['title'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is MessageActionItem) {
+      return title == other.title && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, title.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class MessageType {
   const MessageType._(this._value);
   const MessageType.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -3681,7 +5351,249 @@
   bool operator ==(o) => o is MessageType && o._value == _value;
 }
 
-class NotificationMessage implements Message, ToJsonable {
+/// Valid LSP methods known at the time of code generation from the spec.
+class Method {
+  const Method._(this._value);
+  const Method.fromJson(this._value);
+
+  final String _value;
+
+  static bool canParse(Object obj) {
+    switch (obj) {
+      case r'$/cancelRequest':
+      case r'initialize':
+      case r'initialized':
+      case r'shutdown':
+      case r'exit':
+      case r'window/showMessage':
+      case r'window/showMessageRequest':
+      case r'window/logMessage':
+      case r'telemetry/event':
+      case r'client/registerCapability':
+      case r'client/unregisterCapability':
+      case r'workspace/workspaceFolders':
+      case r'workspace/didChangeWorkspaceFolders':
+      case r'workspace/configuration':
+      case r'workspace/didChangeWatchedFiles':
+      case r'workspace/symbol':
+      case r'workspace/executeCommand':
+      case r'workspace/applyEdit':
+      case r'textDocument/didOpen':
+      case r'textDocument/didChange':
+      case r'textDocument/willSave':
+      case r'textDocument/willSaveWaitUntil':
+      case r'textDocument/didClose':
+      case r'textDocument/publishDiagnostics':
+      case r'textDocument/completion':
+      case r'completionItem/resolve':
+      case r'textDocument/hover':
+      case r'textDocument/signatureHelp':
+      case r'textDocument/declaration':
+      case r'textDocument/definition':
+      case r'textDocument/typeDefinition':
+      case r'textDocument/implementation':
+      case r'textDocument/references':
+      case r'textDocument/documentHighlight':
+      case r'textDocument/documentSymbol':
+      case r'textDocument/codeAction':
+      case r'textDocument/codeLens':
+      case r'codeLens/resolve':
+      case r'textDocument/documentLink':
+      case r'documentLink/resolve':
+      case r'textDocument/documentColor':
+      case r'textDocument/colorPresentation':
+      case r'textDocument/formatting':
+      case r'textDocument/onTypeFormatting':
+      case r'textDocument/rename':
+      case r'textDocument/prepareRename':
+      case r'textDocument/foldingRange':
+        return true;
+    }
+    return false;
+  }
+
+  /// Constant for the '$/cancelRequest' method.
+  static const cancelRequest = const Method._(r'$/cancelRequest');
+
+  /// Constant for the 'initialize' method.
+  static const initialize = const Method._(r'initialize');
+
+  /// Constant for the 'initialized' method.
+  static const initialized = const Method._(r'initialized');
+
+  /// Constant for the 'shutdown' method.
+  static const shutdown = const Method._(r'shutdown');
+
+  /// Constant for the 'exit' method.
+  static const exit = const Method._(r'exit');
+
+  /// Constant for the 'window/showMessage' method.
+  static const window_showMessage = const Method._(r'window/showMessage');
+
+  /// Constant for the 'window/showMessageRequest' method.
+  static const window_showMessageRequest =
+      const Method._(r'window/showMessageRequest');
+
+  /// Constant for the 'window/logMessage' method.
+  static const window_logMessage = const Method._(r'window/logMessage');
+
+  /// Constant for the 'telemetry/event' method.
+  static const telemetry_event = const Method._(r'telemetry/event');
+
+  /// Constant for the 'client/registerCapability' method.
+  static const client_registerCapability =
+      const Method._(r'client/registerCapability');
+
+  /// Constant for the 'client/unregisterCapability' method.
+  static const client_unregisterCapability =
+      const Method._(r'client/unregisterCapability');
+
+  /// Constant for the 'workspace/workspaceFolders' method.
+  static const workspace_workspaceFolders =
+      const Method._(r'workspace/workspaceFolders');
+
+  /// Constant for the 'workspace/didChangeWorkspaceFolders' method.
+  static const workspace_didChangeWorkspaceFolders =
+      const Method._(r'workspace/didChangeWorkspaceFolders');
+
+  /// Constant for the 'workspace/configuration' method.
+  static const workspace_configuration =
+      const Method._(r'workspace/configuration');
+
+  /// Constant for the 'workspace/didChangeWatchedFiles' method.
+  static const workspace_didChangeWatchedFiles =
+      const Method._(r'workspace/didChangeWatchedFiles');
+
+  /// Constant for the 'workspace/symbol' method.
+  static const workspace_symbol = const Method._(r'workspace/symbol');
+
+  /// Constant for the 'workspace/executeCommand' method.
+  static const workspace_executeCommand =
+      const Method._(r'workspace/executeCommand');
+
+  /// Constant for the 'workspace/applyEdit' method.
+  static const workspace_applyEdit = const Method._(r'workspace/applyEdit');
+
+  /// Constant for the 'textDocument/didOpen' method.
+  static const textDocument_didOpen = const Method._(r'textDocument/didOpen');
+
+  /// Constant for the 'textDocument/didChange' method.
+  static const textDocument_didChange =
+      const Method._(r'textDocument/didChange');
+
+  /// Constant for the 'textDocument/willSave' method.
+  static const textDocument_willSave = const Method._(r'textDocument/willSave');
+
+  /// Constant for the 'textDocument/willSaveWaitUntil' method.
+  static const textDocument_willSaveWaitUntil =
+      const Method._(r'textDocument/willSaveWaitUntil');
+
+  /// Constant for the 'textDocument/didClose' method.
+  static const textDocument_didClose = const Method._(r'textDocument/didClose');
+
+  /// Constant for the 'textDocument/publishDiagnostics' method.
+  static const textDocument_publishDiagnostics =
+      const Method._(r'textDocument/publishDiagnostics');
+
+  /// Constant for the 'textDocument/completion' method.
+  static const textDocument_completion =
+      const Method._(r'textDocument/completion');
+
+  /// Constant for the 'completionItem/resolve' method.
+  static const completionItem_resolve =
+      const Method._(r'completionItem/resolve');
+
+  /// Constant for the 'textDocument/hover' method.
+  static const textDocument_hover = const Method._(r'textDocument/hover');
+
+  /// Constant for the 'textDocument/signatureHelp' method.
+  static const textDocument_signatureHelp =
+      const Method._(r'textDocument/signatureHelp');
+
+  /// Constant for the 'textDocument/declaration' method.
+  static const textDocument_declaration =
+      const Method._(r'textDocument/declaration');
+
+  /// Constant for the 'textDocument/definition' method.
+  static const textDocument_definition =
+      const Method._(r'textDocument/definition');
+
+  /// Constant for the 'textDocument/typeDefinition' method.
+  static const textDocument_typeDefinition =
+      const Method._(r'textDocument/typeDefinition');
+
+  /// Constant for the 'textDocument/implementation' method.
+  static const textDocument_implementation =
+      const Method._(r'textDocument/implementation');
+
+  /// Constant for the 'textDocument/references' method.
+  static const textDocument_references =
+      const Method._(r'textDocument/references');
+
+  /// Constant for the 'textDocument/documentHighlight' method.
+  static const textDocument_documentHighlight =
+      const Method._(r'textDocument/documentHighlight');
+
+  /// Constant for the 'textDocument/documentSymbol' method.
+  static const textDocument_documentSymbol =
+      const Method._(r'textDocument/documentSymbol');
+
+  /// Constant for the 'textDocument/codeAction' method.
+  static const textDocument_codeAction =
+      const Method._(r'textDocument/codeAction');
+
+  /// Constant for the 'textDocument/codeLens' method.
+  static const textDocument_codeLens = const Method._(r'textDocument/codeLens');
+
+  /// Constant for the 'codeLens/resolve' method.
+  static const codeLens_resolve = const Method._(r'codeLens/resolve');
+
+  /// Constant for the 'textDocument/documentLink' method.
+  static const textDocument_documentLink =
+      const Method._(r'textDocument/documentLink');
+
+  /// Constant for the 'documentLink/resolve' method.
+  static const documentLink_resolve = const Method._(r'documentLink/resolve');
+
+  /// Constant for the 'textDocument/documentColor' method.
+  static const textDocument_documentColor =
+      const Method._(r'textDocument/documentColor');
+
+  /// Constant for the 'textDocument/colorPresentation' method.
+  static const textDocument_colorPresentation =
+      const Method._(r'textDocument/colorPresentation');
+
+  /// Constant for the 'textDocument/formatting' method.
+  static const textDocument_formatting =
+      const Method._(r'textDocument/formatting');
+
+  /// Constant for the 'textDocument/onTypeFormatting' method.
+  static const textDocument_onTypeFormatting =
+      const Method._(r'textDocument/onTypeFormatting');
+
+  /// Constant for the 'textDocument/rename' method.
+  static const textDocument_rename = const Method._(r'textDocument/rename');
+
+  /// Constant for the 'textDocument/prepareRename' method.
+  static const textDocument_prepareRename =
+      const Method._(r'textDocument/prepareRename');
+
+  /// Constant for the 'textDocument/foldingRange' method.
+  static const textDocument_foldingRange =
+      const Method._(r'textDocument/foldingRange');
+
+  Object toJson() => _value;
+
+  @override
+  String toString() => _value.toString();
+
+  @override
+  get hashCode => _value.hashCode;
+
+  bool operator ==(o) => o is Method && o._value == _value;
+}
+
+class NotificationMessage implements Message, IncomingMessage, ToJsonable {
   NotificationMessage(this.method, this.params, this.jsonrpc) {
     if (method == null) {
       throw 'method is required but was not provided';
@@ -3690,14 +5602,10 @@
       throw 'jsonrpc is required but was not provided';
     }
   }
-  factory NotificationMessage.fromJson(Map<String, dynamic> json) {
-    final method = json['method'];
-    final params = (json['params'] is List &&
-            (json['params'].length == 0 ||
-                json['params'].every((item) => true)))
-        ? new Either2<List<dynamic>, dynamic>.t1(
-            json['params']?.map((item) => item)?.cast<dynamic>()?.toList())
-        : (new Either2<List<dynamic>, dynamic>.t2(json['params']));
+  static NotificationMessage fromJson(Map<String, dynamic> json) {
+    final method =
+        json['method'] != null ? Method.fromJson(json['method']) : null;
+    final params = json['params'];
     final jsonrpc = json['jsonrpc'];
     return new NotificationMessage(method, params, jsonrpc);
   }
@@ -3705,10 +5613,10 @@
   final String jsonrpc;
 
   /// The method to be invoked.
-  final String method;
+  final Method method;
 
   /// The notification's params.
-  final Either2<List<dynamic>, dynamic> params;
+  final dynamic params;
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
@@ -3724,38 +5632,72 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('method') &&
-        obj['method'] is String &&
+        Method.canParse(obj['method']) &&
         obj.containsKey('jsonrpc') &&
         obj['jsonrpc'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is NotificationMessage) {
+      return method == other.method &&
+          params == other.params &&
+          jsonrpc == other.jsonrpc &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, method.hashCode);
+    hash = JenkinsSmiHash.combine(hash, params.hashCode);
+    hash = JenkinsSmiHash.combine(hash, jsonrpc.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Represents a parameter of a callable-signature. A
-/// parameter can have a label and a doc-comment.
+/// Represents a parameter of a callable-signature. A parameter can have a label
+/// and a doc-comment.
 class ParameterInformation implements ToJsonable {
   ParameterInformation(this.label, this.documentation) {
     if (label == null) {
       throw 'label is required but was not provided';
     }
   }
-  factory ParameterInformation.fromJson(Map<String, dynamic> json) {
+  static ParameterInformation fromJson(Map<String, dynamic> json) {
     final label = json['label'];
     final documentation = json['documentation'] is String
         ? new Either2<String, MarkupContent>.t1(json['documentation'])
         : (MarkupContent.canParse(json['documentation'])
             ? new Either2<String, MarkupContent>.t2(
                 json['documentation'] != null
-                    ? new MarkupContent.fromJson(json['documentation'])
+                    ? MarkupContent.fromJson(json['documentation'])
                     : null)
-            : (throw '''${json['documentation']} was not one of (string, MarkupContent)'''));
+            : (json['documentation'] == null
+                ? null
+                : (throw '''${json['documentation']} was not one of (String, MarkupContent)''')));
     return new ParameterInformation(label, documentation);
   }
 
-  /// The human-readable doc-comment of this parameter. Will
-  /// be shown in the UI but can be omitted.
+  /// The human-readable doc-comment of this parameter. Will be shown in the UI
+  /// but can be omitted.
   final Either2<String, MarkupContent> documentation;
 
-  /// The label of this parameter. Will be shown in the UI.
+  /// The label of this parameter information.
+  ///
+  /// Either a string or an inclusive start and exclusive end offsets within its
+  /// containing signature label. (see SignatureInformation.label). The offsets
+  /// are based on a UTF-16 string representation as `Position` and `Range`
+  /// does.
+  ///
+  /// *Note*: a label of type string should be a substring of its containing
+  /// signature label. Its intended use case is to highlight the parameter label
+  /// part in the `SignatureInformation.label`.
   final String label;
 
   Map<String, dynamic> toJson() {
@@ -3772,6 +5714,27 @@
         obj.containsKey('label') &&
         obj['label'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ParameterInformation) {
+      return label == other.label &&
+          documentation == other.documentation &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, label.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class Position implements ToJsonable {
@@ -3783,19 +5746,18 @@
       throw 'character is required but was not provided';
     }
   }
-  factory Position.fromJson(Map<String, dynamic> json) {
+  static Position fromJson(Map<String, dynamic> json) {
     final line = json['line'];
     final character = json['character'];
     return new Position(line, character);
   }
 
-  /// Character offset on a line in a document (zero-based).
-  /// Assuming that the line is represented as a string, the
-  /// `character` value represents the gap between the
-  /// `character` and `character + 1`.
+  /// Character offset on a line in a document (zero-based). Assuming that the
+  /// line is represented as a string, the `character` value represents the gap
+  /// between the `character` and `character + 1`.
   ///
-  /// If the character value is greater than the line length
-  /// it defaults back to the line length.
+  /// If the character value is greater than the line length it defaults back to
+  /// the line length.
   final num character;
 
   /// Line position in a document (zero-based).
@@ -3816,6 +5778,25 @@
         obj.containsKey('character') &&
         obj['character'] is num;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Position) {
+      return line == other.line && character == other.character && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, line.hashCode);
+    hash = JenkinsSmiHash.combine(hash, character.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class PublishDiagnosticsParams implements ToJsonable {
@@ -3827,10 +5808,10 @@
       throw 'diagnostics is required but was not provided';
     }
   }
-  factory PublishDiagnosticsParams.fromJson(Map<String, dynamic> json) {
+  static PublishDiagnosticsParams fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
     final diagnostics = json['diagnostics']
-        ?.map((item) => item != null ? new Diagnostic.fromJson(item) : null)
+        ?.map((item) => item != null ? Diagnostic.fromJson(item) : null)
         ?.cast<Diagnostic>()
         ?.toList();
     return new PublishDiagnosticsParams(uri, diagnostics);
@@ -3856,9 +5837,30 @@
         obj['uri'] is String &&
         obj.containsKey('diagnostics') &&
         (obj['diagnostics'] is List &&
-            (obj['diagnostics'].length == 0 ||
-                obj['diagnostics'].every((item) => Diagnostic.canParse(item))));
+            (obj['diagnostics'].every((item) => Diagnostic.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is PublishDiagnosticsParams) {
+      return uri == other.uri &&
+          listEqual(diagnostics, other.diagnostics,
+              (Diagnostic a, Diagnostic b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, diagnostics.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class Range implements ToJsonable {
@@ -3870,10 +5872,10 @@
       throw 'end is required but was not provided';
     }
   }
-  factory Range.fromJson(Map<String, dynamic> json) {
+  static Range fromJson(Map<String, dynamic> json) {
     final start =
-        json['start'] != null ? new Position.fromJson(json['start']) : null;
-    final end = json['end'] != null ? new Position.fromJson(json['end']) : null;
+        json['start'] != null ? Position.fromJson(json['start']) : null;
+    final end = json['end'] != null ? Position.fromJson(json['end']) : null;
     return new Range(start, end);
   }
 
@@ -3897,6 +5899,79 @@
         obj.containsKey('end') &&
         Position.canParse(obj['end']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Range) {
+      return start == other.start && end == other.end && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, start.hashCode);
+    hash = JenkinsSmiHash.combine(hash, end.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class RangeAndPlaceholder implements ToJsonable {
+  RangeAndPlaceholder(this.range, this.placeholder) {
+    if (range == null) {
+      throw 'range is required but was not provided';
+    }
+    if (placeholder == null) {
+      throw 'placeholder is required but was not provided';
+    }
+  }
+  static RangeAndPlaceholder fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
+    final placeholder = json['placeholder'];
+    return new RangeAndPlaceholder(range, placeholder);
+  }
+
+  final String placeholder;
+  final Range range;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    __result['range'] = range ?? (throw 'range is required but was not set');
+    __result['placeholder'] =
+        placeholder ?? (throw 'placeholder is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic> &&
+        obj.containsKey('range') &&
+        Range.canParse(obj['range']) &&
+        obj.containsKey('placeholder') &&
+        obj['placeholder'] is String;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is RangeAndPlaceholder) {
+      return range == other.range && placeholder == other.placeholder && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, placeholder.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ReferenceContext implements ToJsonable {
@@ -3905,7 +5980,7 @@
       throw 'includeDeclaration is required but was not provided';
     }
   }
-  factory ReferenceContext.fromJson(Map<String, dynamic> json) {
+  static ReferenceContext fromJson(Map<String, dynamic> json) {
     final includeDeclaration = json['includeDeclaration'];
     return new ReferenceContext(includeDeclaration);
   }
@@ -3925,6 +6000,24 @@
         obj.containsKey('includeDeclaration') &&
         obj['includeDeclaration'] is bool;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ReferenceContext) {
+      return includeDeclaration == other.includeDeclaration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, includeDeclaration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ReferenceParams implements TextDocumentPositionParams, ToJsonable {
@@ -3939,16 +6032,15 @@
       throw 'position is required but was not provided';
     }
   }
-  factory ReferenceParams.fromJson(Map<String, dynamic> json) {
+  static ReferenceParams fromJson(Map<String, dynamic> json) {
     final context = json['context'] != null
-        ? new ReferenceContext.fromJson(json['context'])
+        ? ReferenceContext.fromJson(json['context'])
         : null;
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    final position = json['position'] != null
-        ? new Position.fromJson(json['position'])
-        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
     return new ReferenceParams(context, textDocument, position);
   }
 
@@ -3980,6 +6072,29 @@
         obj.containsKey('position') &&
         Position.canParse(obj['position']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ReferenceParams) {
+      return context == other.context &&
+          textDocument == other.textDocument &&
+          position == other.position &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, context.hashCode);
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// General parameters to register for a capability.
@@ -3992,15 +6107,15 @@
       throw 'method is required but was not provided';
     }
   }
-  factory Registration.fromJson(Map<String, dynamic> json) {
+  static Registration fromJson(Map<String, dynamic> json) {
     final id = json['id'];
     final method = json['method'];
     final registerOptions = json['registerOptions'];
     return new Registration(id, method, registerOptions);
   }
 
-  /// The id used to register the request. The id can be
-  /// used to deregister the request again.
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again.
   final String id;
 
   /// The method / capability to register for.
@@ -4026,6 +6141,29 @@
         obj.containsKey('method') &&
         obj['method'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Registration) {
+      return id == other.id &&
+          method == other.method &&
+          registerOptions == other.registerOptions &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, method.hashCode);
+    hash = JenkinsSmiHash.combine(hash, registerOptions.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class RegistrationParams implements ToJsonable {
@@ -4034,9 +6172,9 @@
       throw 'registrations is required but was not provided';
     }
   }
-  factory RegistrationParams.fromJson(Map<String, dynamic> json) {
+  static RegistrationParams fromJson(Map<String, dynamic> json) {
     final registrations = json['registrations']
-        ?.map((item) => item != null ? new Registration.fromJson(item) : null)
+        ?.map((item) => item != null ? Registration.fromJson(item) : null)
         ?.cast<Registration>()
         ?.toList();
     return new RegistrationParams(registrations);
@@ -4055,15 +6193,37 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('registrations') &&
         (obj['registrations'] is List &&
-            (obj['registrations'].length == 0 ||
-                obj['registrations']
-                    .every((item) => Registration.canParse(item))));
+            (obj['registrations']
+                .every((item) => Registration.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is RegistrationParams) {
+      return listEqual(registrations, other.registrations,
+              (Registration a, Registration b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, registrations.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Rename file operation
-class RenameFile implements FileOperation, ToJsonable {
-  RenameFile(this.oldUri, this.newUri, this.options) {
+class RenameFile implements ToJsonable {
+  RenameFile(this.kind, this.oldUri, this.newUri, this.options) {
+    if (kind == null) {
+      throw 'kind is required but was not provided';
+    }
     if (oldUri == null) {
       throw 'oldUri is required but was not provided';
     }
@@ -4071,15 +6231,19 @@
       throw 'newUri is required but was not provided';
     }
   }
-  factory RenameFile.fromJson(Map<String, dynamic> json) {
+  static RenameFile fromJson(Map<String, dynamic> json) {
+    final kind = json['kind'];
     final oldUri = json['oldUri'];
     final newUri = json['newUri'];
     final options = json['options'] != null
-        ? new RenameFileOptions.fromJson(json['options'])
+        ? RenameFileOptions.fromJson(json['options'])
         : null;
-    return new RenameFile(oldUri, newUri, options);
+    return new RenameFile(kind, oldUri, newUri, options);
   }
 
+  /// A rename
+  final String kind;
+
   /// The new location.
   final String newUri;
 
@@ -4091,6 +6255,7 @@
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
+    __result['kind'] = kind ?? (throw 'kind is required but was not set');
     __result['oldUri'] = oldUri ?? (throw 'oldUri is required but was not set');
     __result['newUri'] = newUri ?? (throw 'newUri is required but was not set');
     if (options != null) {
@@ -4101,17 +6266,44 @@
 
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
+        obj.containsKey('kind') &&
+        obj['kind'] is String &&
         obj.containsKey('oldUri') &&
         obj['oldUri'] is String &&
         obj.containsKey('newUri') &&
         obj['newUri'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is RenameFile) {
+      return kind == other.kind &&
+          oldUri == other.oldUri &&
+          newUri == other.newUri &&
+          options == other.options &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, oldUri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, newUri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, options.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Rename file options
 class RenameFileOptions implements ToJsonable {
   RenameFileOptions(this.overwrite, this.ignoreIfExists);
-  factory RenameFileOptions.fromJson(Map<String, dynamic> json) {
+  static RenameFileOptions fromJson(Map<String, dynamic> json) {
     final overwrite = json['overwrite'];
     final ignoreIfExists = json['ignoreIfExists'];
     return new RenameFileOptions(overwrite, ignoreIfExists);
@@ -4120,8 +6312,7 @@
   /// Ignores if target exists.
   final bool ignoreIfExists;
 
-  /// Overwrite target if existing. Overwrite wins over
-  /// `ignoreIfExists`
+  /// Overwrite target if existing. Overwrite wins over `ignoreIfExists`
   final bool overwrite;
 
   Map<String, dynamic> toJson() {
@@ -4138,18 +6329,38 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is RenameFileOptions) {
+      return overwrite == other.overwrite &&
+          ignoreIfExists == other.ignoreIfExists &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, overwrite.hashCode);
+    hash = JenkinsSmiHash.combine(hash, ignoreIfExists.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Rename options
 class RenameOptions implements ToJsonable {
   RenameOptions(this.prepareProvider);
-  factory RenameOptions.fromJson(Map<String, dynamic> json) {
+  static RenameOptions fromJson(Map<String, dynamic> json) {
     final prepareProvider = json['prepareProvider'];
     return new RenameOptions(prepareProvider);
   }
 
-  /// Renames should be checked and tested before being
-  /// executed.
+  /// Renames should be checked and tested before being executed.
   final bool prepareProvider;
 
   Map<String, dynamic> toJson() {
@@ -4163,6 +6374,24 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is RenameOptions) {
+      return prepareProvider == other.prepareProvider && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, prepareProvider.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class RenameParams implements ToJsonable {
@@ -4177,20 +6406,18 @@
       throw 'newName is required but was not provided';
     }
   }
-  factory RenameParams.fromJson(Map<String, dynamic> json) {
+  static RenameParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    final position = json['position'] != null
-        ? new Position.fromJson(json['position'])
-        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
     final newName = json['newName'];
     return new RenameParams(textDocument, position, newName);
   }
 
-  /// The new name of the symbol. If the given name is not
-  /// valid the request must return a [ResponseError] with
-  /// an appropriate message set.
+  /// The new name of the symbol. If the given name is not valid the request
+  /// must return a [ResponseError] with an appropriate message set.
   final String newName;
 
   /// The position at which this request was sent.
@@ -4219,27 +6446,48 @@
         obj.containsKey('newName') &&
         obj['newName'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is RenameParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          newName == other.newName &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    hash = JenkinsSmiHash.combine(hash, newName.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class RenameRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
   RenameRegistrationOptions(this.prepareProvider, this.documentSelector);
-  factory RenameRegistrationOptions.fromJson(Map<String, dynamic> json) {
+  static RenameRegistrationOptions fromJson(Map<String, dynamic> json) {
     final prepareProvider = json['prepareProvider'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new RenameRegistrationOptions(prepareProvider, documentSelector);
   }
 
-  /// A document selector to identify the scope of the
-  /// registration. If set to null the document selector
-  /// provided on the client side will be used.
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
-  /// Renames should be checked and tested for validity
-  /// before being executed.
+  /// Renames should be checked and tested for validity before being executed.
   final bool prepareProvider;
 
   Map<String, dynamic> toJson() {
@@ -4255,13 +6503,33 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is RenameRegistrationOptions) {
+      return prepareProvider == other.prepareProvider &&
+          documentSelector == other.documentSelector &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, prepareProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-class RequestMessage implements Message, ToJsonable {
+class RequestMessage implements Message, IncomingMessage, ToJsonable {
   RequestMessage(this.id, this.method, this.params, this.jsonrpc) {
     if (id == null) {
       throw 'id is required but was not provided';
@@ -4273,19 +6541,15 @@
       throw 'jsonrpc is required but was not provided';
     }
   }
-  factory RequestMessage.fromJson(Map<String, dynamic> json) {
+  static RequestMessage fromJson(Map<String, dynamic> json) {
     final id = json['id'] is num
         ? new Either2<num, String>.t1(json['id'])
         : (json['id'] is String
             ? new Either2<num, String>.t2(json['id'])
-            : (throw '''${json['id']} was not one of (number, string)'''));
-    final method = json['method'];
-    final params = (json['params'] is List &&
-            (json['params'].length == 0 ||
-                json['params'].every((item) => true)))
-        ? new Either2<List<dynamic>, dynamic>.t1(
-            json['params']?.map((item) => item)?.cast<dynamic>()?.toList())
-        : (new Either2<List<dynamic>, dynamic>.t2(json['params']));
+            : (throw '''${json['id']} was not one of (num, String)'''));
+    final method =
+        json['method'] != null ? Method.fromJson(json['method']) : null;
+    final params = json['params'];
     final jsonrpc = json['jsonrpc'];
     return new RequestMessage(id, method, params, jsonrpc);
   }
@@ -4295,10 +6559,10 @@
   final String jsonrpc;
 
   /// The method to be invoked.
-  final String method;
+  final Method method;
 
   /// The method's params.
-  final Either2<List<dynamic>, dynamic> params;
+  final dynamic params;
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
@@ -4317,17 +6581,42 @@
         obj.containsKey('id') &&
         (obj['id'] is num || obj['id'] is String) &&
         obj.containsKey('method') &&
-        obj['method'] is String &&
+        Method.canParse(obj['method']) &&
         obj.containsKey('jsonrpc') &&
         obj['jsonrpc'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is RequestMessage) {
+      return id == other.id &&
+          method == other.method &&
+          params == other.params &&
+          jsonrpc == other.jsonrpc &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, method.hashCode);
+    hash = JenkinsSmiHash.combine(hash, params.hashCode);
+    hash = JenkinsSmiHash.combine(hash, jsonrpc.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ResourceOperationKind {
   const ResourceOperationKind._(this._value);
   const ResourceOperationKind.fromJson(this._value);
 
-  final Object _value;
+  final String _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -4368,19 +6657,19 @@
       throw 'message is required but was not provided';
     }
   }
-  factory ResponseError.fromJson(Map<String, dynamic> json) {
-    final code = json['code'];
+  static ResponseError<D> fromJson<D>(Map<String, dynamic> json) {
+    final code =
+        json['code'] != null ? ErrorCodes.fromJson(json['code']) : null;
     final message = json['message'];
     final data = json['data'];
     return new ResponseError<D>(code, message, data);
   }
 
   /// A number indicating the error type that occurred.
-  final num code;
+  final ErrorCodes code;
 
-  /// A Primitive or Structured value that contains
-  /// additional information about the error. Can be
-  /// omitted.
+  /// A Primitive or Structured value that contains additional information about
+  /// the error. Can be omitted.
   final D data;
 
   /// A string providing a short description of the error.
@@ -4400,10 +6689,33 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic> &&
         obj.containsKey('code') &&
-        obj['code'] is num &&
+        ErrorCodes.canParse(obj['code']) &&
         obj.containsKey('message') &&
         obj['message'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ResponseError) {
+      return code == other.code &&
+          message == other.message &&
+          data == other.data &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, code.hashCode);
+    hash = JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = JenkinsSmiHash.combine(hash, data.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ResponseMessage implements Message, ToJsonable {
@@ -4412,14 +6724,18 @@
       throw 'jsonrpc is required but was not provided';
     }
   }
-  factory ResponseMessage.fromJson(Map<String, dynamic> json) {
+  static ResponseMessage fromJson(Map<String, dynamic> json) {
     final id = json['id'] is num
         ? new Either2<num, String>.t1(json['id'])
         : (json['id'] is String
             ? new Either2<num, String>.t2(json['id'])
-            : (throw '''${json['id']} was not one of (number, string)'''));
+            : (json['id'] == null
+                ? null
+                : (throw '''${json['id']} was not one of (num, String)''')));
     final result = json['result'];
-    final error = json['error'];
+    final error = json['error'] != null
+        ? ResponseError.fromJson<dynamic>(json['error'])
+        : null;
     final jsonrpc = json['jsonrpc'];
     return new ResponseMessage(id, result, error, jsonrpc);
   }
@@ -4431,21 +6747,21 @@
   final Either2<num, String> id;
   final String jsonrpc;
 
-  /// The result of a request. This can be omitted in the
-  /// case of an error.
+  /// The result of a request. This can be omitted in the case of an error.
   final dynamic result;
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
     __result['id'] = id;
-    if (result != null) {
-      __result['result'] = result;
-    }
-    if (error != null) {
-      __result['error'] = error;
-    }
     __result['jsonrpc'] =
         jsonrpc ?? (throw 'jsonrpc is required but was not set');
+    if (error != null && result != null) {
+      throw 'result and error cannot both be set';
+    } else if (error != null) {
+      __result['error'] = error;
+    } else {
+      __result['result'] = result;
+    }
     return __result;
   }
 
@@ -4456,18 +6772,42 @@
         obj.containsKey('jsonrpc') &&
         obj['jsonrpc'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ResponseMessage) {
+      return id == other.id &&
+          result == other.result &&
+          error == other.error &&
+          jsonrpc == other.jsonrpc &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, result.hashCode);
+    hash = JenkinsSmiHash.combine(hash, error.hashCode);
+    hash = JenkinsSmiHash.combine(hash, jsonrpc.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Save options.
 class SaveOptions implements ToJsonable {
   SaveOptions(this.includeText);
-  factory SaveOptions.fromJson(Map<String, dynamic> json) {
+  static SaveOptions fromJson(Map<String, dynamic> json) {
     final includeText = json['includeText'];
     return new SaveOptions(includeText);
   }
 
-  /// The client is supposed to include the content on
-  /// save.
+  /// The client is supposed to include the content on save.
   final bool includeText;
 
   Map<String, dynamic> toJson() {
@@ -4481,6 +6821,24 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is SaveOptions) {
+      return includeText == other.includeText && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, includeText.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ServerCapabilities implements ToJsonable {
@@ -4490,6 +6848,8 @@
       this.completionProvider,
       this.signatureHelpProvider,
       this.definitionProvider,
+      this.typeDefinitionProvider,
+      this.implementationProvider,
       this.referencesProvider,
       this.documentHighlightProvider,
       this.documentSymbolProvider,
@@ -4501,28 +6861,38 @@
       this.documentOnTypeFormattingProvider,
       this.renameProvider,
       this.documentLinkProvider,
+      this.colorProvider,
+      this.foldingRangeProvider,
       this.executeCommandProvider,
-      this.supported,
-      this.changeNotifications);
-  factory ServerCapabilities.fromJson(Map<String, dynamic> json) {
+      this.workspace,
+      this.experimental);
+  static ServerCapabilities fromJson(Map<String, dynamic> json) {
     final textDocumentSync = TextDocumentSyncOptions.canParse(
             json['textDocumentSync'])
         ? new Either2<TextDocumentSyncOptions, num>.t1(
             json['textDocumentSync'] != null
-                ? new TextDocumentSyncOptions.fromJson(json['textDocumentSync'])
+                ? TextDocumentSyncOptions.fromJson(json['textDocumentSync'])
                 : null)
         : (json['textDocumentSync'] is num
             ? new Either2<TextDocumentSyncOptions, num>.t2(
                 json['textDocumentSync'])
-            : (throw '''${json['textDocumentSync']} was not one of (TextDocumentSyncOptions, number)'''));
+            : (json['textDocumentSync'] == null
+                ? null
+                : (throw '''${json['textDocumentSync']} was not one of (TextDocumentSyncOptions, num)''')));
     final hoverProvider = json['hoverProvider'];
     final completionProvider = json['completionProvider'] != null
-        ? new CompletionOptions.fromJson(json['completionProvider'])
+        ? CompletionOptions.fromJson(json['completionProvider'])
         : null;
     final signatureHelpProvider = json['signatureHelpProvider'] != null
-        ? new SignatureHelpOptions.fromJson(json['signatureHelpProvider'])
+        ? SignatureHelpOptions.fromJson(json['signatureHelpProvider'])
         : null;
     final definitionProvider = json['definitionProvider'];
+    final typeDefinitionProvider = json['typeDefinitionProvider'] is bool
+        ? new Either2<bool, dynamic>.t1(json['typeDefinitionProvider'])
+        : (new Either2<bool, dynamic>.t2(json['typeDefinitionProvider']));
+    final implementationProvider = json['implementationProvider'] is bool
+        ? new Either2<bool, dynamic>.t1(json['implementationProvider'])
+        : (new Either2<bool, dynamic>.t2(json['implementationProvider']));
     final referencesProvider = json['referencesProvider'];
     final documentHighlightProvider = json['documentHighlightProvider'];
     final documentSymbolProvider = json['documentSymbolProvider'];
@@ -4532,45 +6902,70 @@
         : (CodeActionOptions.canParse(json['codeActionProvider'])
             ? new Either2<bool, CodeActionOptions>.t2(
                 json['codeActionProvider'] != null
-                    ? new CodeActionOptions.fromJson(json['codeActionProvider'])
+                    ? CodeActionOptions.fromJson(json['codeActionProvider'])
                     : null)
-            : (throw '''${json['codeActionProvider']} was not one of (boolean, CodeActionOptions)'''));
+            : (json['codeActionProvider'] == null
+                ? null
+                : (throw '''${json['codeActionProvider']} was not one of (bool, CodeActionOptions)''')));
     final codeLensProvider = json['codeLensProvider'] != null
-        ? new CodeLensOptions.fromJson(json['codeLensProvider'])
+        ? CodeLensOptions.fromJson(json['codeLensProvider'])
         : null;
     final documentFormattingProvider = json['documentFormattingProvider'];
     final documentRangeFormattingProvider =
         json['documentRangeFormattingProvider'];
     final documentOnTypeFormattingProvider =
         json['documentOnTypeFormattingProvider'] != null
-            ? new DocumentOnTypeFormattingOptions.fromJson(
+            ? DocumentOnTypeFormattingOptions.fromJson(
                 json['documentOnTypeFormattingProvider'])
             : null;
     final renameProvider = json['renameProvider'] is bool
         ? new Either2<bool, RenameOptions>.t1(json['renameProvider'])
         : (RenameOptions.canParse(json['renameProvider'])
             ? new Either2<bool, RenameOptions>.t2(json['renameProvider'] != null
-                ? new RenameOptions.fromJson(json['renameProvider'])
+                ? RenameOptions.fromJson(json['renameProvider'])
                 : null)
-            : (throw '''${json['renameProvider']} was not one of (boolean, RenameOptions)'''));
+            : (json['renameProvider'] == null
+                ? null
+                : (throw '''${json['renameProvider']} was not one of (bool, RenameOptions)''')));
     final documentLinkProvider = json['documentLinkProvider'] != null
-        ? new DocumentLinkOptions.fromJson(json['documentLinkProvider'])
+        ? DocumentLinkOptions.fromJson(json['documentLinkProvider'])
         : null;
+    final colorProvider = json['colorProvider'] is bool
+        ? new Either3<bool, ColorProviderOptions, dynamic>.t1(
+            json['colorProvider'])
+        : (ColorProviderOptions.canParse(json['colorProvider'])
+            ? new Either3<bool, ColorProviderOptions, dynamic>.t2(
+                json['colorProvider'] != null
+                    ? ColorProviderOptions.fromJson(json['colorProvider'])
+                    : null)
+            : (new Either3<bool, ColorProviderOptions, dynamic>.t3(
+                json['colorProvider'])));
+    final foldingRangeProvider = json['foldingRangeProvider'] is bool
+        ? new Either3<bool, FoldingRangeProviderOptions, dynamic>.t1(
+            json['foldingRangeProvider'])
+        : (FoldingRangeProviderOptions.canParse(json['foldingRangeProvider'])
+            ? new Either3<bool, FoldingRangeProviderOptions, dynamic>.t2(
+                json['foldingRangeProvider'] != null
+                    ? FoldingRangeProviderOptions.fromJson(
+                        json['foldingRangeProvider'])
+                    : null)
+            : (new Either3<bool, FoldingRangeProviderOptions, dynamic>.t3(
+                json['foldingRangeProvider'])));
     final executeCommandProvider = json['executeCommandProvider'] != null
-        ? new ExecuteCommandOptions.fromJson(json['executeCommandProvider'])
+        ? ExecuteCommandOptions.fromJson(json['executeCommandProvider'])
         : null;
-    final supported = json['supported'];
-    final changeNotifications = json['changeNotifications'] is String
-        ? new Either2<String, bool>.t1(json['changeNotifications'])
-        : (json['changeNotifications'] is bool
-            ? new Either2<String, bool>.t2(json['changeNotifications'])
-            : (throw '''${json['changeNotifications']} was not one of (string, boolean)'''));
+    final workspace = json['workspace'] != null
+        ? ServerCapabilitiesWorkspace.fromJson(json['workspace'])
+        : null;
+    final experimental = json['experimental'];
     return new ServerCapabilities(
         textDocumentSync,
         hoverProvider,
         completionProvider,
         signatureHelpProvider,
         definitionProvider,
+        typeDefinitionProvider,
+        implementationProvider,
         referencesProvider,
         documentHighlightProvider,
         documentSymbolProvider,
@@ -4582,31 +6977,26 @@
         documentOnTypeFormattingProvider,
         renameProvider,
         documentLinkProvider,
+        colorProvider,
+        foldingRangeProvider,
         executeCommandProvider,
-        supported,
-        changeNotifications);
+        workspace,
+        experimental);
   }
 
-  /// Whether the server wants to receive workspace folder
-  /// change notifications.
-  ///
-  /// If a strings is provided the string is treated as a
-  /// ID under which the notification is registered on the
-  /// client side. The ID can be used to unregister for
-  /// these events using the `client/unregisterCapability`
-  /// request.
-  final Either2<String, bool> changeNotifications;
-
-  /// The server provides code actions. The
-  /// `CodeActionOptions` return type is only valid if the
-  /// client signals code action literal support via the
-  /// property
-  /// `textDocument.codeAction.codeActionLiteralSupport`.
+  /// The server provides code actions. The `CodeActionOptions` return type is
+  /// only valid if the client signals code action literal support via the
+  /// property `textDocument.codeAction.codeActionLiteralSupport`.
   final Either2<bool, CodeActionOptions> codeActionProvider;
 
   /// The server provides code lens.
   final CodeLensOptions codeLensProvider;
 
+  /// The server provides color provider support.
+  ///
+  /// Since 3.6.0
+  final Either3<bool, ColorProviderOptions, dynamic> colorProvider;
+
   /// The server provides completion support.
   final CompletionOptions completionProvider;
 
@@ -4634,31 +7024,48 @@
   /// The server provides execute command support.
   final ExecuteCommandOptions executeCommandProvider;
 
+  /// Experimental server capabilities.
+  final dynamic experimental;
+
+  /// The server provides folding provider support.
+  ///
+  /// Since 3.10.0
+  final Either3<bool, FoldingRangeProviderOptions, dynamic>
+      foldingRangeProvider;
+
   /// The server provides hover support.
   final bool hoverProvider;
 
+  /// The server provides Goto Implementation support.
+  ///
+  /// Since 3.6.0
+  final Either2<bool, dynamic> implementationProvider;
+
   /// The server provides find references support.
   final bool referencesProvider;
 
-  /// The server provides rename support. RenameOptions
-  /// may only be specified if the client states that it
-  /// supports `prepareSupport` in its initial
+  /// The server provides rename support. RenameOptions may only be specified if
+  /// the client states that it supports `prepareSupport` in its initial
   /// `initialize` request.
   final Either2<bool, RenameOptions> renameProvider;
 
   /// The server provides signature help support.
   final SignatureHelpOptions signatureHelpProvider;
 
-  /// The server has support for workspace folders
-  final bool supported;
-
-  /// Defines how text documents are synced. Is either a
-  /// detailed structure defining each notification or for
-  /// backwards compatibility the TextDocumentSyncKind
-  /// number. If omitted it defaults to
+  /// Defines how text documents are synced. Is either a detailed structure
+  /// defining each notification or for backwards compatibility the
+  /// TextDocumentSyncKind number. If omitted it defaults to
   /// `TextDocumentSyncKind.None`.
   final Either2<TextDocumentSyncOptions, num> textDocumentSync;
 
+  /// The server provides Goto Type Definition support.
+  ///
+  /// Since 3.6.0
+  final Either2<bool, dynamic> typeDefinitionProvider;
+
+  /// Workspace specific server capabilities
+  final ServerCapabilitiesWorkspace workspace;
+
   /// The server provides workspace symbol support.
   final bool workspaceSymbolProvider;
 
@@ -4679,6 +7086,12 @@
     if (definitionProvider != null) {
       __result['definitionProvider'] = definitionProvider;
     }
+    if (typeDefinitionProvider != null) {
+      __result['typeDefinitionProvider'] = typeDefinitionProvider;
+    }
+    if (implementationProvider != null) {
+      __result['implementationProvider'] = implementationProvider;
+    }
     if (referencesProvider != null) {
       __result['referencesProvider'] = referencesProvider;
     }
@@ -4714,9 +7127,164 @@
     if (documentLinkProvider != null) {
       __result['documentLinkProvider'] = documentLinkProvider;
     }
+    if (colorProvider != null) {
+      __result['colorProvider'] = colorProvider;
+    }
+    if (foldingRangeProvider != null) {
+      __result['foldingRangeProvider'] = foldingRangeProvider;
+    }
     if (executeCommandProvider != null) {
       __result['executeCommandProvider'] = executeCommandProvider;
     }
+    if (workspace != null) {
+      __result['workspace'] = workspace;
+    }
+    if (experimental != null) {
+      __result['experimental'] = experimental;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is ServerCapabilities) {
+      return textDocumentSync == other.textDocumentSync &&
+          hoverProvider == other.hoverProvider &&
+          completionProvider == other.completionProvider &&
+          signatureHelpProvider == other.signatureHelpProvider &&
+          definitionProvider == other.definitionProvider &&
+          typeDefinitionProvider == other.typeDefinitionProvider &&
+          implementationProvider == other.implementationProvider &&
+          referencesProvider == other.referencesProvider &&
+          documentHighlightProvider == other.documentHighlightProvider &&
+          documentSymbolProvider == other.documentSymbolProvider &&
+          workspaceSymbolProvider == other.workspaceSymbolProvider &&
+          codeActionProvider == other.codeActionProvider &&
+          codeLensProvider == other.codeLensProvider &&
+          documentFormattingProvider == other.documentFormattingProvider &&
+          documentRangeFormattingProvider ==
+              other.documentRangeFormattingProvider &&
+          documentOnTypeFormattingProvider ==
+              other.documentOnTypeFormattingProvider &&
+          renameProvider == other.renameProvider &&
+          documentLinkProvider == other.documentLinkProvider &&
+          colorProvider == other.colorProvider &&
+          foldingRangeProvider == other.foldingRangeProvider &&
+          executeCommandProvider == other.executeCommandProvider &&
+          workspace == other.workspace &&
+          experimental == other.experimental &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocumentSync.hashCode);
+    hash = JenkinsSmiHash.combine(hash, hoverProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, completionProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, signatureHelpProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, definitionProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, typeDefinitionProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, implementationProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, referencesProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentHighlightProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSymbolProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workspaceSymbolProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeActionProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeLensProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentFormattingProvider.hashCode);
+    hash =
+        JenkinsSmiHash.combine(hash, documentRangeFormattingProvider.hashCode);
+    hash =
+        JenkinsSmiHash.combine(hash, documentOnTypeFormattingProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, renameProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentLinkProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, colorProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, foldingRangeProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, executeCommandProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workspace.hashCode);
+    hash = JenkinsSmiHash.combine(hash, experimental.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ServerCapabilitiesWorkspace implements ToJsonable {
+  ServerCapabilitiesWorkspace(this.workspaceFolders);
+  static ServerCapabilitiesWorkspace fromJson(Map<String, dynamic> json) {
+    final workspaceFolders = json['workspaceFolders'] != null
+        ? ServerCapabilitiesWorkspaceFolders.fromJson(json['workspaceFolders'])
+        : null;
+    return new ServerCapabilitiesWorkspace(workspaceFolders);
+  }
+
+  /// The server supports workspace folder.
+  ///
+  /// Since 3.6.0
+  final ServerCapabilitiesWorkspaceFolders workspaceFolders;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (workspaceFolders != null) {
+      __result['workspaceFolders'] = workspaceFolders;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is ServerCapabilitiesWorkspace) {
+      return workspaceFolders == other.workspaceFolders && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, workspaceFolders.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class ServerCapabilitiesWorkspaceFolders implements ToJsonable {
+  ServerCapabilitiesWorkspaceFolders(this.supported, this.changeNotifications);
+  static ServerCapabilitiesWorkspaceFolders fromJson(
+      Map<String, dynamic> json) {
+    final supported = json['supported'];
+    final changeNotifications = json['changeNotifications'];
+    return new ServerCapabilitiesWorkspaceFolders(
+        supported, changeNotifications);
+  }
+
+  /// Whether the server wants to receive workspace folder change notifications.
+  ///
+  /// If a strings is provided the string is treated as a ID under which the
+  /// notification is registered on the client side. The ID can be used to
+  /// unregister for these events using the `client/unregisterCapability`
+  /// request.
+  final bool changeNotifications;
+
+  /// The server has support for workspace folders
+  final bool supported;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
     if (supported != null) {
       __result['supported'] = supported;
     }
@@ -4729,6 +7297,27 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ServerCapabilitiesWorkspaceFolders) {
+      return supported == other.supported &&
+          changeNotifications == other.changeNotifications &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, supported.hashCode);
+    hash = JenkinsSmiHash.combine(hash, changeNotifications.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ShowMessageParams implements ToJsonable {
@@ -4740,9 +7329,9 @@
       throw 'message is required but was not provided';
     }
   }
-  factory ShowMessageParams.fromJson(Map<String, dynamic> json) {
+  static ShowMessageParams fromJson(Map<String, dynamic> json) {
     final type =
-        json['type'] != null ? new MessageType.fromJson(json['type']) : null;
+        json['type'] != null ? MessageType.fromJson(json['type']) : null;
     final message = json['message'];
     return new ShowMessageParams(type, message);
   }
@@ -4768,6 +7357,25 @@
         obj.containsKey('message') &&
         obj['message'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ShowMessageParams) {
+      return type == other.type && message == other.message && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = JenkinsSmiHash.combine(hash, message.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class ShowMessageRequestParams implements ToJsonable {
@@ -4779,13 +7387,12 @@
       throw 'message is required but was not provided';
     }
   }
-  factory ShowMessageRequestParams.fromJson(Map<String, dynamic> json) {
+  static ShowMessageRequestParams fromJson(Map<String, dynamic> json) {
     final type =
-        json['type'] != null ? new MessageType.fromJson(json['type']) : null;
+        json['type'] != null ? MessageType.fromJson(json['type']) : null;
     final message = json['message'];
     final actions = json['actions']
-        ?.map((item) =>
-            item != null ? new MessageActionItem.fromJson(item) : null)
+        ?.map((item) => item != null ? MessageActionItem.fromJson(item) : null)
         ?.cast<MessageActionItem>()
         ?.toList();
     return new ShowMessageRequestParams(type, message, actions);
@@ -4818,21 +7425,44 @@
         obj.containsKey('message') &&
         obj['message'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is ShowMessageRequestParams) {
+      return type == other.type &&
+          message == other.message &&
+          listEqual(actions, other.actions,
+              (MessageActionItem a, MessageActionItem b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, type.hashCode);
+    hash = JenkinsSmiHash.combine(hash, message.hashCode);
+    hash = JenkinsSmiHash.combine(hash, actions.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Signature help represents the signature of something
-/// callable. There can be multiple signature but only one
-/// active and only one active parameter.
+/// Signature help represents the signature of something callable. There can be
+/// multiple signature but only one active and only one active parameter.
 class SignatureHelp implements ToJsonable {
   SignatureHelp(this.signatures, this.activeSignature, this.activeParameter) {
     if (signatures == null) {
       throw 'signatures is required but was not provided';
     }
   }
-  factory SignatureHelp.fromJson(Map<String, dynamic> json) {
+  static SignatureHelp fromJson(Map<String, dynamic> json) {
     final signatures = json['signatures']
-        ?.map((item) =>
-            item != null ? new SignatureInformation.fromJson(item) : null)
+        ?.map(
+            (item) => item != null ? SignatureInformation.fromJson(item) : null)
         ?.cast<SignatureInformation>()
         ?.toList();
     final activeSignature = json['activeSignature'];
@@ -4840,24 +7470,20 @@
     return new SignatureHelp(signatures, activeSignature, activeParameter);
   }
 
-  /// The active parameter of the active signature. If
-  /// omitted or the value lies outside the range of
-  /// `signatures[activeSignature].parameters` defaults to
-  /// 0 if the active signature has parameters. If the
-  /// active signature has no parameters it is ignored. In
-  /// future version of the protocol this property might
-  /// become mandatory to better express the active
-  /// parameter if the active signature does have any.
+  /// The active parameter of the active signature. If omitted or the value lies
+  /// outside the range of `signatures[activeSignature].parameters` defaults to
+  /// 0 if the active signature has parameters. If the active signature has no
+  /// parameters it is ignored. In future version of the protocol this property
+  /// might become mandatory to better express the active parameter if the
+  /// active signature does have any.
   final num activeParameter;
 
-  /// The active signature. If omitted or the value lies
-  /// outside the range of `signatures` the value defaults
-  /// to zero or is ignored if `signatures.length === 0`.
-  /// Whenever possible implementors should make an active
-  /// decision about the active signature and shouldn't
-  /// rely on a default value. In future version of the
-  /// protocol this property might become mandatory to
-  /// better express this.
+  /// The active signature. If omitted or the value lies outside the range of
+  /// `signatures` the value defaults to zero or is ignored if
+  /// `signatures.length === 0`. Whenever possible implementors should make an
+  /// active decision about the active signature and shouldn't rely on a default
+  /// value. In future version of the protocol this property might become
+  /// mandatory to better express this.
   final num activeSignature;
 
   /// One or more signatures.
@@ -4880,16 +7506,39 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('signatures') &&
         (obj['signatures'] is List &&
-            (obj['signatures'].length == 0 ||
-                obj['signatures']
-                    .every((item) => SignatureInformation.canParse(item))));
+            (obj['signatures']
+                .every((item) => SignatureInformation.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is SignatureHelp) {
+      return listEqual(signatures, other.signatures,
+              (SignatureInformation a, SignatureInformation b) => a == b) &&
+          activeSignature == other.activeSignature &&
+          activeParameter == other.activeParameter &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, signatures.hashCode);
+    hash = JenkinsSmiHash.combine(hash, activeSignature.hashCode);
+    hash = JenkinsSmiHash.combine(hash, activeParameter.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Signature help options.
 class SignatureHelpOptions implements ToJsonable {
   SignatureHelpOptions(this.triggerCharacters);
-  factory SignatureHelpOptions.fromJson(Map<String, dynamic> json) {
+  static SignatureHelpOptions fromJson(Map<String, dynamic> json) {
     final triggerCharacters = json['triggerCharacters']
         ?.map((item) => item)
         ?.cast<String>()
@@ -4897,8 +7546,7 @@
     return new SignatureHelpOptions(triggerCharacters);
   }
 
-  /// The characters that trigger signature help
-  /// automatically.
+  /// The characters that trigger signature help automatically.
   final List<String> triggerCharacters;
 
   Map<String, dynamic> toJson() {
@@ -4912,32 +7560,50 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is SignatureHelpOptions) {
+      return listEqual(triggerCharacters, other.triggerCharacters,
+              (String a, String b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, triggerCharacters.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class SignatureHelpRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
   SignatureHelpRegistrationOptions(
       this.triggerCharacters, this.documentSelector);
-  factory SignatureHelpRegistrationOptions.fromJson(Map<String, dynamic> json) {
+  static SignatureHelpRegistrationOptions fromJson(Map<String, dynamic> json) {
     final triggerCharacters = json['triggerCharacters']
         ?.map((item) => item)
         ?.cast<String>()
         ?.toList();
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new SignatureHelpRegistrationOptions(
         triggerCharacters, documentSelector);
   }
 
-  /// A document selector to identify the scope of the
-  /// registration. If set to null the document selector
-  /// provided on the client side will be used.
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
-  /// The characters that trigger signature help
-  /// automatically.
+  /// The characters that trigger signature help automatically.
   final List<String> triggerCharacters;
 
   Map<String, dynamic> toJson() {
@@ -4953,45 +7619,66 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is SignatureHelpRegistrationOptions) {
+      return listEqual(triggerCharacters, other.triggerCharacters,
+              (String a, String b) => a == b) &&
+          documentSelector == other.documentSelector &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, triggerCharacters.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Represents the signature of something callable. A
-/// signature can have a label, like a function-name, a
-/// doc-comment, and a set of parameters.
+/// Represents the signature of something callable. A signature can have a
+/// label, like a function-name, a doc-comment, and a set of parameters.
 class SignatureInformation implements ToJsonable {
   SignatureInformation(this.label, this.documentation, this.parameters) {
     if (label == null) {
       throw 'label is required but was not provided';
     }
   }
-  factory SignatureInformation.fromJson(Map<String, dynamic> json) {
+  static SignatureInformation fromJson(Map<String, dynamic> json) {
     final label = json['label'];
     final documentation = json['documentation'] is String
         ? new Either2<String, MarkupContent>.t1(json['documentation'])
         : (MarkupContent.canParse(json['documentation'])
             ? new Either2<String, MarkupContent>.t2(
                 json['documentation'] != null
-                    ? new MarkupContent.fromJson(json['documentation'])
+                    ? MarkupContent.fromJson(json['documentation'])
                     : null)
-            : (throw '''${json['documentation']} was not one of (string, MarkupContent)'''));
+            : (json['documentation'] == null
+                ? null
+                : (throw '''${json['documentation']} was not one of (String, MarkupContent)''')));
     final parameters = json['parameters']
-        ?.map((item) =>
-            item != null ? new ParameterInformation.fromJson(item) : null)
+        ?.map(
+            (item) => item != null ? ParameterInformation.fromJson(item) : null)
         ?.cast<ParameterInformation>()
         ?.toList();
     return new SignatureInformation(label, documentation, parameters);
   }
 
-  /// The human-readable doc-comment of this signature.
-  /// Will be shown in the UI but can be omitted.
+  /// The human-readable doc-comment of this signature. Will be shown in the UI
+  /// but can be omitted.
   final Either2<String, MarkupContent> documentation;
 
-  /// The label of this signature. Will be shown in the
-  /// UI.
+  /// The label of this signature. Will be shown in the UI.
   final String label;
 
   /// The parameters of this signature.
@@ -5014,20 +7701,42 @@
         obj.containsKey('label') &&
         obj['label'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is SignatureInformation) {
+      return label == other.label &&
+          documentation == other.documentation &&
+          listEqual(parameters, other.parameters,
+              (ParameterInformation a, ParameterInformation b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, label.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
+    hash = JenkinsSmiHash.combine(hash, parameters.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Static registration options to be returned in the
-/// initialize request.
+/// Static registration options to be returned in the initialize request.
 class StaticRegistrationOptions implements ToJsonable {
   StaticRegistrationOptions(this.id);
-  factory StaticRegistrationOptions.fromJson(Map<String, dynamic> json) {
+  static StaticRegistrationOptions fromJson(Map<String, dynamic> json) {
     final id = json['id'];
     return new StaticRegistrationOptions(id);
   }
 
-  /// The id used to register the request. The id can be
-  /// used to deregister the request again. See also
-  /// Registration#id.
+  /// The id used to register the request. The id can be used to deregister the
+  /// request again. See also Registration#id.
   final String id;
 
   Map<String, dynamic> toJson() {
@@ -5041,10 +7750,28 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is StaticRegistrationOptions) {
+      return id == other.id && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Represents information about programming constructs
-/// like variables, classes, interfaces etc.
+/// Represents information about programming constructs like variables, classes,
+/// interfaces etc.
 class SymbolInformation implements ToJsonable {
   SymbolInformation(this.name, this.kind, this.deprecated, this.location,
       this.containerName) {
@@ -5058,43 +7785,39 @@
       throw 'location is required but was not provided';
     }
   }
-  factory SymbolInformation.fromJson(Map<String, dynamic> json) {
+  static SymbolInformation fromJson(Map<String, dynamic> json) {
     final name = json['name'];
-    final kind = json['kind'];
+    final kind =
+        json['kind'] != null ? SymbolKind.fromJson(json['kind']) : null;
     final deprecated = json['deprecated'];
-    final location = json['location'] != null
-        ? new Location.fromJson(json['location'])
-        : null;
+    final location =
+        json['location'] != null ? Location.fromJson(json['location']) : null;
     final containerName = json['containerName'];
     return new SymbolInformation(
         name, kind, deprecated, location, containerName);
   }
 
-  /// The name of the symbol containing this symbol. This
-  /// information is for user interface purposes (e.g. to
-  /// render a qualifier in the user interface if
-  /// necessary). It can't be used to re-infer a hierarchy
-  /// for the document symbols.
+  /// The name of the symbol containing this symbol. This information is for
+  /// user interface purposes (e.g. to render a qualifier in the user interface
+  /// if necessary). It can't be used to re-infer a hierarchy for the document
+  /// symbols.
   final String containerName;
 
   /// Indicates if this symbol is deprecated.
   final bool deprecated;
 
   /// The kind of this symbol.
-  final num kind;
+  final SymbolKind kind;
 
-  /// The location of this symbol. The location's range is
-  /// used by a tool to reveal the location in the editor.
-  /// If the symbol is selected in the tool the range's
-  /// start information is used to position the cursor. So
-  /// the range usually spans more then the actual
-  /// symbol's name and does normally include things like
-  /// visibility modifiers.
+  /// The location of this symbol. The location's range is used by a tool to
+  /// reveal the location in the editor. If the symbol is selected in the tool
+  /// the range's start information is used to position the cursor. So the range
+  /// usually spans more then the actual symbol's name and does normally include
+  /// things like visibility modifiers.
   ///
-  /// The range doesn't have to denote a node range in the
-  /// sense of a abstract syntax tree. It can therefore
-  /// not be used to re-construct a hierarchy of the
-  /// symbols.
+  /// The range doesn't have to denote a node range in the sense of a abstract
+  /// syntax tree. It can therefore not be used to re-construct a hierarchy of
+  /// the symbols.
   final Location location;
 
   /// The name of this symbol.
@@ -5120,10 +7843,37 @@
         obj.containsKey('name') &&
         obj['name'] is String &&
         obj.containsKey('kind') &&
-        obj['kind'] is num &&
+        SymbolKind.canParse(obj['kind']) &&
         obj.containsKey('location') &&
         Location.canParse(obj['location']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is SymbolInformation) {
+      return name == other.name &&
+          kind == other.kind &&
+          deprecated == other.deprecated &&
+          location == other.location &&
+          containerName == other.containerName &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, deprecated.hashCode);
+    hash = JenkinsSmiHash.combine(hash, location.hashCode);
+    hash = JenkinsSmiHash.combine(hash, containerName.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// A symbol kind.
@@ -5131,7 +7881,7 @@
   const SymbolKind._(this._value);
   const SymbolKind.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -5204,8 +7954,8 @@
   bool operator ==(o) => o is SymbolKind && o._value == _value;
 }
 
-/// Describe options to be used when registering for
-/// text document change events.
+/// Describe options to be used when registering for text document change
+/// events.
 class TextDocumentChangeRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
   TextDocumentChangeRegistrationOptions(this.syncKind, this.documentSelector) {
@@ -5213,24 +7963,22 @@
       throw 'syncKind is required but was not provided';
     }
   }
-  factory TextDocumentChangeRegistrationOptions.fromJson(
+  static TextDocumentChangeRegistrationOptions fromJson(
       Map<String, dynamic> json) {
     final syncKind = json['syncKind'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new TextDocumentChangeRegistrationOptions(
         syncKind, documentSelector);
   }
 
-  /// A document selector to identify the scope of the
-  /// registration. If set to null the document selector
-  /// provided on the client side will be used.
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
-  /// How documents are synced to the server. See
-  /// TextDocumentSyncKind.Full and
+  /// How documents are synced to the server. See TextDocumentSyncKind.Full and
   /// TextDocumentSyncKind.Incremental.
   final num syncKind;
 
@@ -5248,39 +7996,1812 @@
         obj['syncKind'] is num &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentChangeRegistrationOptions) {
+      return syncKind == other.syncKind &&
+          documentSelector == other.documentSelector &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, syncKind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Text document specific client capabilities.
 class TextDocumentClientCapabilities implements ToJsonable {
-  TextDocumentClientCapabilities(this.dynamicRegistration, this.willSave,
-      this.willSaveWaitUntil, this.didSave);
-  factory TextDocumentClientCapabilities.fromJson(Map<String, dynamic> json) {
+  TextDocumentClientCapabilities(
+      this.synchronization,
+      this.completion,
+      this.hover,
+      this.signatureHelp,
+      this.references,
+      this.documentHighlight,
+      this.documentSymbol,
+      this.formatting,
+      this.rangeFormatting,
+      this.onTypeFormatting,
+      this.declaration,
+      this.definition,
+      this.typeDefinition,
+      this.implementation,
+      this.codeAction,
+      this.codeLens,
+      this.documentLink,
+      this.colorProvider,
+      this.rename,
+      this.publishDiagnostics,
+      this.foldingRange);
+  static TextDocumentClientCapabilities fromJson(Map<String, dynamic> json) {
+    final synchronization = json['synchronization'] != null
+        ? TextDocumentClientCapabilitiesSynchronization.fromJson(
+            json['synchronization'])
+        : null;
+    final completion = json['completion'] != null
+        ? TextDocumentClientCapabilitiesCompletion.fromJson(json['completion'])
+        : null;
+    final hover = json['hover'] != null
+        ? TextDocumentClientCapabilitiesHover.fromJson(json['hover'])
+        : null;
+    final signatureHelp = json['signatureHelp'] != null
+        ? TextDocumentClientCapabilitiesSignatureHelp.fromJson(
+            json['signatureHelp'])
+        : null;
+    final references = json['references'] != null
+        ? TextDocumentClientCapabilitiesReferences.fromJson(json['references'])
+        : null;
+    final documentHighlight = json['documentHighlight'] != null
+        ? TextDocumentClientCapabilitiesDocumentHighlight.fromJson(
+            json['documentHighlight'])
+        : null;
+    final documentSymbol = json['documentSymbol'] != null
+        ? TextDocumentClientCapabilitiesDocumentSymbol.fromJson(
+            json['documentSymbol'])
+        : null;
+    final formatting = json['formatting'] != null
+        ? TextDocumentClientCapabilitiesFormatting.fromJson(json['formatting'])
+        : null;
+    final rangeFormatting = json['rangeFormatting'] != null
+        ? TextDocumentClientCapabilitiesRangeFormatting.fromJson(
+            json['rangeFormatting'])
+        : null;
+    final onTypeFormatting = json['onTypeFormatting'] != null
+        ? TextDocumentClientCapabilitiesOnTypeFormatting.fromJson(
+            json['onTypeFormatting'])
+        : null;
+    final declaration = json['declaration'] != null
+        ? TextDocumentClientCapabilitiesDeclaration.fromJson(
+            json['declaration'])
+        : null;
+    final definition = json['definition'] != null
+        ? TextDocumentClientCapabilitiesDefinition.fromJson(json['definition'])
+        : null;
+    final typeDefinition = json['typeDefinition'] != null
+        ? TextDocumentClientCapabilitiesTypeDefinition.fromJson(
+            json['typeDefinition'])
+        : null;
+    final implementation = json['implementation'] != null
+        ? TextDocumentClientCapabilitiesImplementation.fromJson(
+            json['implementation'])
+        : null;
+    final codeAction = json['codeAction'] != null
+        ? TextDocumentClientCapabilitiesCodeAction.fromJson(json['codeAction'])
+        : null;
+    final codeLens = json['codeLens'] != null
+        ? TextDocumentClientCapabilitiesCodeLens.fromJson(json['codeLens'])
+        : null;
+    final documentLink = json['documentLink'] != null
+        ? TextDocumentClientCapabilitiesDocumentLink.fromJson(
+            json['documentLink'])
+        : null;
+    final colorProvider = json['colorProvider'] != null
+        ? TextDocumentClientCapabilitiesColorProvider.fromJson(
+            json['colorProvider'])
+        : null;
+    final rename = json['rename'] != null
+        ? TextDocumentClientCapabilitiesRename.fromJson(json['rename'])
+        : null;
+    final publishDiagnostics = json['publishDiagnostics'] != null
+        ? TextDocumentClientCapabilitiesPublishDiagnostics.fromJson(
+            json['publishDiagnostics'])
+        : null;
+    final foldingRange = json['foldingRange'] != null
+        ? TextDocumentClientCapabilitiesFoldingRange.fromJson(
+            json['foldingRange'])
+        : null;
+    return new TextDocumentClientCapabilities(
+        synchronization,
+        completion,
+        hover,
+        signatureHelp,
+        references,
+        documentHighlight,
+        documentSymbol,
+        formatting,
+        rangeFormatting,
+        onTypeFormatting,
+        declaration,
+        definition,
+        typeDefinition,
+        implementation,
+        codeAction,
+        codeLens,
+        documentLink,
+        colorProvider,
+        rename,
+        publishDiagnostics,
+        foldingRange);
+  }
+
+  /// Capabilities specific to the `textDocument/codeAction`
+  final TextDocumentClientCapabilitiesCodeAction codeAction;
+
+  /// Capabilities specific to the `textDocument/codeLens`
+  final TextDocumentClientCapabilitiesCodeLens codeLens;
+
+  /// Capabilities specific to the `textDocument/documentColor` and the
+  /// `textDocument/colorPresentation` request.
+  ///
+  /// Since 3.6.0
+  final TextDocumentClientCapabilitiesColorProvider colorProvider;
+
+  /// Capabilities specific to the `textDocument/completion`
+  final TextDocumentClientCapabilitiesCompletion completion;
+
+  /// Capabilities specific to the `textDocument/declaration`
+  final TextDocumentClientCapabilitiesDeclaration declaration;
+
+  /// Capabilities specific to the `textDocument/definition`.
+  ///
+  /// Since 3.14.0
+  final TextDocumentClientCapabilitiesDefinition definition;
+
+  /// Capabilities specific to the `textDocument/documentHighlight`
+  final TextDocumentClientCapabilitiesDocumentHighlight documentHighlight;
+
+  /// Capabilities specific to the `textDocument/documentLink`
+  final TextDocumentClientCapabilitiesDocumentLink documentLink;
+
+  /// Capabilities specific to the `textDocument/documentSymbol`
+  final TextDocumentClientCapabilitiesDocumentSymbol documentSymbol;
+
+  /// Capabilities specific to `textDocument/foldingRange` requests.
+  ///
+  /// Since 3.10.0
+  final TextDocumentClientCapabilitiesFoldingRange foldingRange;
+
+  /// Capabilities specific to the `textDocument/formatting`
+  final TextDocumentClientCapabilitiesFormatting formatting;
+
+  /// Capabilities specific to the `textDocument/hover`
+  final TextDocumentClientCapabilitiesHover hover;
+
+  /// Capabilities specific to the `textDocument/implementation`.
+  ///
+  /// Since 3.6.0
+  final TextDocumentClientCapabilitiesImplementation implementation;
+
+  /// Capabilities specific to the `textDocument/onTypeFormatting`
+  final TextDocumentClientCapabilitiesOnTypeFormatting onTypeFormatting;
+
+  /// Capabilities specific to `textDocument/publishDiagnostics`.
+  final TextDocumentClientCapabilitiesPublishDiagnostics publishDiagnostics;
+
+  /// Capabilities specific to the `textDocument/rangeFormatting`
+  final TextDocumentClientCapabilitiesRangeFormatting rangeFormatting;
+
+  /// Capabilities specific to the `textDocument/references`
+  final TextDocumentClientCapabilitiesReferences references;
+
+  /// Capabilities specific to the `textDocument/rename`
+  final TextDocumentClientCapabilitiesRename rename;
+
+  /// Capabilities specific to the `textDocument/signatureHelp`
+  final TextDocumentClientCapabilitiesSignatureHelp signatureHelp;
+  final TextDocumentClientCapabilitiesSynchronization synchronization;
+
+  /// Capabilities specific to the `textDocument/typeDefinition`
+  ///
+  /// Since 3.6.0
+  final TextDocumentClientCapabilitiesTypeDefinition typeDefinition;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (synchronization != null) {
+      __result['synchronization'] = synchronization;
+    }
+    if (completion != null) {
+      __result['completion'] = completion;
+    }
+    if (hover != null) {
+      __result['hover'] = hover;
+    }
+    if (signatureHelp != null) {
+      __result['signatureHelp'] = signatureHelp;
+    }
+    if (references != null) {
+      __result['references'] = references;
+    }
+    if (documentHighlight != null) {
+      __result['documentHighlight'] = documentHighlight;
+    }
+    if (documentSymbol != null) {
+      __result['documentSymbol'] = documentSymbol;
+    }
+    if (formatting != null) {
+      __result['formatting'] = formatting;
+    }
+    if (rangeFormatting != null) {
+      __result['rangeFormatting'] = rangeFormatting;
+    }
+    if (onTypeFormatting != null) {
+      __result['onTypeFormatting'] = onTypeFormatting;
+    }
+    if (declaration != null) {
+      __result['declaration'] = declaration;
+    }
+    if (definition != null) {
+      __result['definition'] = definition;
+    }
+    if (typeDefinition != null) {
+      __result['typeDefinition'] = typeDefinition;
+    }
+    if (implementation != null) {
+      __result['implementation'] = implementation;
+    }
+    if (codeAction != null) {
+      __result['codeAction'] = codeAction;
+    }
+    if (codeLens != null) {
+      __result['codeLens'] = codeLens;
+    }
+    if (documentLink != null) {
+      __result['documentLink'] = documentLink;
+    }
+    if (colorProvider != null) {
+      __result['colorProvider'] = colorProvider;
+    }
+    if (rename != null) {
+      __result['rename'] = rename;
+    }
+    if (publishDiagnostics != null) {
+      __result['publishDiagnostics'] = publishDiagnostics;
+    }
+    if (foldingRange != null) {
+      __result['foldingRange'] = foldingRange;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilities) {
+      return synchronization == other.synchronization &&
+          completion == other.completion &&
+          hover == other.hover &&
+          signatureHelp == other.signatureHelp &&
+          references == other.references &&
+          documentHighlight == other.documentHighlight &&
+          documentSymbol == other.documentSymbol &&
+          formatting == other.formatting &&
+          rangeFormatting == other.rangeFormatting &&
+          onTypeFormatting == other.onTypeFormatting &&
+          declaration == other.declaration &&
+          definition == other.definition &&
+          typeDefinition == other.typeDefinition &&
+          implementation == other.implementation &&
+          codeAction == other.codeAction &&
+          codeLens == other.codeLens &&
+          documentLink == other.documentLink &&
+          colorProvider == other.colorProvider &&
+          rename == other.rename &&
+          publishDiagnostics == other.publishDiagnostics &&
+          foldingRange == other.foldingRange &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, synchronization.hashCode);
+    hash = JenkinsSmiHash.combine(hash, completion.hashCode);
+    hash = JenkinsSmiHash.combine(hash, hover.hashCode);
+    hash = JenkinsSmiHash.combine(hash, signatureHelp.hashCode);
+    hash = JenkinsSmiHash.combine(hash, references.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentHighlight.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSymbol.hashCode);
+    hash = JenkinsSmiHash.combine(hash, formatting.hashCode);
+    hash = JenkinsSmiHash.combine(hash, rangeFormatting.hashCode);
+    hash = JenkinsSmiHash.combine(hash, onTypeFormatting.hashCode);
+    hash = JenkinsSmiHash.combine(hash, declaration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, definition.hashCode);
+    hash = JenkinsSmiHash.combine(hash, typeDefinition.hashCode);
+    hash = JenkinsSmiHash.combine(hash, implementation.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeAction.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeLens.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentLink.hashCode);
+    hash = JenkinsSmiHash.combine(hash, colorProvider.hashCode);
+    hash = JenkinsSmiHash.combine(hash, rename.hashCode);
+    hash = JenkinsSmiHash.combine(hash, publishDiagnostics.hashCode);
+    hash = JenkinsSmiHash.combine(hash, foldingRange.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesCodeAction implements ToJsonable {
+  TextDocumentClientCapabilitiesCodeAction(
+      this.dynamicRegistration, this.codeActionLiteralSupport);
+  static TextDocumentClientCapabilitiesCodeAction fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final codeActionLiteralSupport = json['codeActionLiteralSupport'] != null
+        ? TextDocumentClientCapabilitiesCodeActionLiteralSupport.fromJson(
+            json['codeActionLiteralSupport'])
+        : null;
+    return new TextDocumentClientCapabilitiesCodeAction(
+        dynamicRegistration, codeActionLiteralSupport);
+  }
+
+  /// The client support code action literals as a valid response of the
+  /// `textDocument/codeAction` request.
+  ///
+  /// Since 3.8.0
+  final TextDocumentClientCapabilitiesCodeActionLiteralSupport
+      codeActionLiteralSupport;
+
+  /// Whether code action supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (codeActionLiteralSupport != null) {
+      __result['codeActionLiteralSupport'] = codeActionLiteralSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesCodeAction) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          codeActionLiteralSupport == other.codeActionLiteralSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, codeActionLiteralSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesCodeActionKind implements ToJsonable {
+  TextDocumentClientCapabilitiesCodeActionKind(this.valueSet) {
+    if (valueSet == null) {
+      throw 'valueSet is required but was not provided';
+    }
+  }
+  static TextDocumentClientCapabilitiesCodeActionKind fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? CodeActionKind.fromJson(item) : null)
+        ?.cast<CodeActionKind>()
+        ?.toList();
+    return new TextDocumentClientCapabilitiesCodeActionKind(valueSet);
+  }
+
+  /// The code action kind values the client supports. When this property exists
+  /// the client also guarantees that it will handle values outside its set
+  /// gracefully and falls back to a default value when unknown.
+  final List<CodeActionKind> valueSet;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    __result['valueSet'] =
+        valueSet ?? (throw 'valueSet is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic> &&
+        obj.containsKey('valueSet') &&
+        (obj['valueSet'] is List &&
+            (obj['valueSet'].every((item) => item is String)));
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesCodeActionKind) {
+      return listEqual(valueSet, other.valueSet,
+              (CodeActionKind a, CodeActionKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, valueSet.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesCodeActionLiteralSupport
+    implements ToJsonable {
+  TextDocumentClientCapabilitiesCodeActionLiteralSupport(this.codeActionKind) {
+    if (codeActionKind == null) {
+      throw 'codeActionKind is required but was not provided';
+    }
+  }
+  static TextDocumentClientCapabilitiesCodeActionLiteralSupport fromJson(
+      Map<String, dynamic> json) {
+    final codeActionKind = json['codeActionKind'] != null
+        ? TextDocumentClientCapabilitiesCodeActionKind.fromJson(
+            json['codeActionKind'])
+        : null;
+    return new TextDocumentClientCapabilitiesCodeActionLiteralSupport(
+        codeActionKind);
+  }
+
+  /// The code action kind is support with the following value set.
+  final TextDocumentClientCapabilitiesCodeActionKind codeActionKind;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    __result['codeActionKind'] =
+        codeActionKind ?? (throw 'codeActionKind is required but was not set');
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic> &&
+        obj.containsKey('codeActionKind') &&
+        TextDocumentClientCapabilitiesCodeActionKind.canParse(
+            obj['codeActionKind']);
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesCodeActionLiteralSupport) {
+      return codeActionKind == other.codeActionKind && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, codeActionKind.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesCodeLens implements ToJsonable {
+  TextDocumentClientCapabilitiesCodeLens(this.dynamicRegistration);
+  static TextDocumentClientCapabilitiesCodeLens fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new TextDocumentClientCapabilitiesCodeLens(dynamicRegistration);
+  }
+
+  /// Whether code lens supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesCodeLens) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesColorProvider implements ToJsonable {
+  TextDocumentClientCapabilitiesColorProvider(this.dynamicRegistration);
+  static TextDocumentClientCapabilitiesColorProvider fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new TextDocumentClientCapabilitiesColorProvider(dynamicRegistration);
+  }
+
+  /// Whether colorProvider supports dynamic registration. If this is set to
+  /// `true` the client supports the new `(ColorProviderOptions &
+  /// TextDocumentRegistrationOptions & StaticRegistrationOptions)` return value
+  /// for the corresponding server capability as well.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesColorProvider) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesCompletion implements ToJsonable {
+  TextDocumentClientCapabilitiesCompletion(this.dynamicRegistration,
+      this.completionItem, this.completionItemKind, this.contextSupport);
+  static TextDocumentClientCapabilitiesCompletion fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final completionItem = json['completionItem'] != null
+        ? TextDocumentClientCapabilitiesCompletionItem.fromJson(
+            json['completionItem'])
+        : null;
+    final completionItemKind = json['completionItemKind'] != null
+        ? TextDocumentClientCapabilitiesCompletionItemKind.fromJson(
+            json['completionItemKind'])
+        : null;
+    final contextSupport = json['contextSupport'];
+    return new TextDocumentClientCapabilitiesCompletion(dynamicRegistration,
+        completionItem, completionItemKind, contextSupport);
+  }
+
+  /// The client supports the following `CompletionItem` specific capabilities.
+  final TextDocumentClientCapabilitiesCompletionItem completionItem;
+  final TextDocumentClientCapabilitiesCompletionItemKind completionItemKind;
+
+  /// The client supports to send additional context information for a
+  /// `textDocument/completion` request.
+  final bool contextSupport;
+
+  /// Whether completion supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (completionItem != null) {
+      __result['completionItem'] = completionItem;
+    }
+    if (completionItemKind != null) {
+      __result['completionItemKind'] = completionItemKind;
+    }
+    if (contextSupport != null) {
+      __result['contextSupport'] = contextSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesCompletion) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          completionItem == other.completionItem &&
+          completionItemKind == other.completionItemKind &&
+          contextSupport == other.contextSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, completionItem.hashCode);
+    hash = JenkinsSmiHash.combine(hash, completionItemKind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, contextSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesCompletionItem implements ToJsonable {
+  TextDocumentClientCapabilitiesCompletionItem(
+      this.snippetSupport,
+      this.commitCharactersSupport,
+      this.documentationFormat,
+      this.deprecatedSupport,
+      this.preselectSupport);
+  static TextDocumentClientCapabilitiesCompletionItem fromJson(
+      Map<String, dynamic> json) {
+    final snippetSupport = json['snippetSupport'];
+    final commitCharactersSupport = json['commitCharactersSupport'];
+    final documentationFormat = json['documentationFormat']
+        ?.map((item) => item != null ? MarkupKind.fromJson(item) : null)
+        ?.cast<MarkupKind>()
+        ?.toList();
+    final deprecatedSupport = json['deprecatedSupport'];
+    final preselectSupport = json['preselectSupport'];
+    return new TextDocumentClientCapabilitiesCompletionItem(
+        snippetSupport,
+        commitCharactersSupport,
+        documentationFormat,
+        deprecatedSupport,
+        preselectSupport);
+  }
+
+  /// The client supports commit characters on a completion item.
+  final bool commitCharactersSupport;
+
+  /// The client supports the deprecated property on a completion item.
+  final bool deprecatedSupport;
+
+  /// The client supports the following content formats for the documentation
+  /// property. The order describes the preferred format of the client.
+  final List<MarkupKind> documentationFormat;
+
+  /// The client supports the preselect property on a completion item.
+  final bool preselectSupport;
+
+  /// The client supports snippets as insert text.
+  ///
+  /// A snippet can define tab stops and placeholders with `$1`, `$2` and
+  /// `${3:foo}`. `$0` defines the final tab stop, it defaults to the end of the
+  /// snippet. Placeholders with equal identifiers are linked, that is typing in
+  /// one will update others too.
+  final bool snippetSupport;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (snippetSupport != null) {
+      __result['snippetSupport'] = snippetSupport;
+    }
+    if (commitCharactersSupport != null) {
+      __result['commitCharactersSupport'] = commitCharactersSupport;
+    }
+    if (documentationFormat != null) {
+      __result['documentationFormat'] = documentationFormat;
+    }
+    if (deprecatedSupport != null) {
+      __result['deprecatedSupport'] = deprecatedSupport;
+    }
+    if (preselectSupport != null) {
+      __result['preselectSupport'] = preselectSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesCompletionItem) {
+      return snippetSupport == other.snippetSupport &&
+          commitCharactersSupport == other.commitCharactersSupport &&
+          listEqual(documentationFormat, other.documentationFormat,
+              (MarkupKind a, MarkupKind b) => a == b) &&
+          deprecatedSupport == other.deprecatedSupport &&
+          preselectSupport == other.preselectSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, snippetSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, commitCharactersSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentationFormat.hashCode);
+    hash = JenkinsSmiHash.combine(hash, deprecatedSupport.hashCode);
+    hash = JenkinsSmiHash.combine(hash, preselectSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesCompletionItemKind implements ToJsonable {
+  TextDocumentClientCapabilitiesCompletionItemKind(this.valueSet);
+  static TextDocumentClientCapabilitiesCompletionItemKind fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? CompletionItemKind.fromJson(item) : null)
+        ?.cast<CompletionItemKind>()
+        ?.toList();
+    return new TextDocumentClientCapabilitiesCompletionItemKind(valueSet);
+  }
+
+  /// The completion item kind values the client supports. When this property
+  /// exists the client also guarantees that it will handle values outside its
+  /// set gracefully and falls back to a default value when unknown.
+  ///
+  /// If this property is not present the client only supports the completion
+  /// items kinds from `Text` to `Reference` as defined in the initial version
+  /// of the protocol.
+  final List<CompletionItemKind> valueSet;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (valueSet != null) {
+      __result['valueSet'] = valueSet;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesCompletionItemKind) {
+      return listEqual(valueSet, other.valueSet,
+              (CompletionItemKind a, CompletionItemKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, valueSet.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesDeclaration implements ToJsonable {
+  TextDocumentClientCapabilitiesDeclaration(
+      this.dynamicRegistration, this.linkSupport);
+  static TextDocumentClientCapabilitiesDeclaration fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final linkSupport = json['linkSupport'];
+    return new TextDocumentClientCapabilitiesDeclaration(
+        dynamicRegistration, linkSupport);
+  }
+
+  /// Whether declaration supports dynamic registration. If this is set to
+  /// `true` the client supports the new `(TextDocumentRegistrationOptions &
+  /// StaticRegistrationOptions)` return value for the corresponding server
+  /// capability as well.
+  final bool dynamicRegistration;
+
+  /// The client supports additional metadata in the form of declaration links.
+  ///
+  /// Since 3.14.0
+  final bool linkSupport;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (linkSupport != null) {
+      __result['linkSupport'] = linkSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesDeclaration) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          linkSupport == other.linkSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesDefinition implements ToJsonable {
+  TextDocumentClientCapabilitiesDefinition(
+      this.dynamicRegistration, this.linkSupport);
+  static TextDocumentClientCapabilitiesDefinition fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final linkSupport = json['linkSupport'];
+    return new TextDocumentClientCapabilitiesDefinition(
+        dynamicRegistration, linkSupport);
+  }
+
+  /// Whether definition supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// The client supports additional metadata in the form of definition links.
+  final bool linkSupport;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (linkSupport != null) {
+      __result['linkSupport'] = linkSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesDefinition) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          linkSupport == other.linkSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesDocumentHighlight implements ToJsonable {
+  TextDocumentClientCapabilitiesDocumentHighlight(this.dynamicRegistration);
+  static TextDocumentClientCapabilitiesDocumentHighlight fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new TextDocumentClientCapabilitiesDocumentHighlight(
+        dynamicRegistration);
+  }
+
+  /// Whether document highlight supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesDocumentHighlight) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesDocumentLink implements ToJsonable {
+  TextDocumentClientCapabilitiesDocumentLink(this.dynamicRegistration);
+  static TextDocumentClientCapabilitiesDocumentLink fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new TextDocumentClientCapabilitiesDocumentLink(dynamicRegistration);
+  }
+
+  /// Whether document link supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesDocumentLink) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesDocumentSymbol implements ToJsonable {
+  TextDocumentClientCapabilitiesDocumentSymbol(this.dynamicRegistration,
+      this.symbolKind, this.hierarchicalDocumentSymbolSupport);
+  static TextDocumentClientCapabilitiesDocumentSymbol fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final symbolKind = json['symbolKind'] != null
+        ? TextDocumentClientCapabilitiesSymbolKind.fromJson(json['symbolKind'])
+        : null;
+    final hierarchicalDocumentSymbolSupport =
+        json['hierarchicalDocumentSymbolSupport'];
+    return new TextDocumentClientCapabilitiesDocumentSymbol(
+        dynamicRegistration, symbolKind, hierarchicalDocumentSymbolSupport);
+  }
+
+  /// Whether document symbol supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// The client supports hierarchical document symbols.
+  final bool hierarchicalDocumentSymbolSupport;
+
+  /// Specific capabilities for the `SymbolKind`.
+  final TextDocumentClientCapabilitiesSymbolKind symbolKind;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (symbolKind != null) {
+      __result['symbolKind'] = symbolKind;
+    }
+    if (hierarchicalDocumentSymbolSupport != null) {
+      __result['hierarchicalDocumentSymbolSupport'] =
+          hierarchicalDocumentSymbolSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesDocumentSymbol) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          symbolKind == other.symbolKind &&
+          hierarchicalDocumentSymbolSupport ==
+              other.hierarchicalDocumentSymbolSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, symbolKind.hashCode);
+    hash = JenkinsSmiHash.combine(
+        hash, hierarchicalDocumentSymbolSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesFoldingRange implements ToJsonable {
+  TextDocumentClientCapabilitiesFoldingRange(
+      this.dynamicRegistration, this.rangeLimit, this.lineFoldingOnly);
+  static TextDocumentClientCapabilitiesFoldingRange fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final rangeLimit = json['rangeLimit'];
+    final lineFoldingOnly = json['lineFoldingOnly'];
+    return new TextDocumentClientCapabilitiesFoldingRange(
+        dynamicRegistration, rangeLimit, lineFoldingOnly);
+  }
+
+  /// Whether implementation supports dynamic registration for folding range
+  /// providers. If this is set to `true` the client supports the new
+  /// `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions &
+  /// StaticRegistrationOptions)` return value for the corresponding server
+  /// capability as well.
+  final bool dynamicRegistration;
+
+  /// If set, the client signals that it only supports folding complete lines.
+  /// If set, client will ignore specified `startCharacter` and `endCharacter`
+  /// properties in a FoldingRange.
+  final bool lineFoldingOnly;
+
+  /// The maximum number of folding ranges that the client prefers to receive
+  /// per document. The value serves as a hint, servers are free to follow the
+  /// limit.
+  final num rangeLimit;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (rangeLimit != null) {
+      __result['rangeLimit'] = rangeLimit;
+    }
+    if (lineFoldingOnly != null) {
+      __result['lineFoldingOnly'] = lineFoldingOnly;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesFoldingRange) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          rangeLimit == other.rangeLimit &&
+          lineFoldingOnly == other.lineFoldingOnly &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, rangeLimit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, lineFoldingOnly.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesFormatting implements ToJsonable {
+  TextDocumentClientCapabilitiesFormatting(this.dynamicRegistration);
+  static TextDocumentClientCapabilitiesFormatting fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new TextDocumentClientCapabilitiesFormatting(dynamicRegistration);
+  }
+
+  /// Whether formatting supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesFormatting) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesHover implements ToJsonable {
+  TextDocumentClientCapabilitiesHover(
+      this.dynamicRegistration, this.contentFormat);
+  static TextDocumentClientCapabilitiesHover fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final contentFormat = json['contentFormat']
+        ?.map((item) => item != null ? MarkupKind.fromJson(item) : null)
+        ?.cast<MarkupKind>()
+        ?.toList();
+    return new TextDocumentClientCapabilitiesHover(
+        dynamicRegistration, contentFormat);
+  }
+
+  /// The client supports the follow content formats for the content property.
+  /// The order describes the preferred format of the client.
+  final List<MarkupKind> contentFormat;
+
+  /// Whether hover supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (contentFormat != null) {
+      __result['contentFormat'] = contentFormat;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesHover) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          listEqual(contentFormat, other.contentFormat,
+              (MarkupKind a, MarkupKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, contentFormat.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesImplementation implements ToJsonable {
+  TextDocumentClientCapabilitiesImplementation(
+      this.dynamicRegistration, this.linkSupport);
+  static TextDocumentClientCapabilitiesImplementation fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final linkSupport = json['linkSupport'];
+    return new TextDocumentClientCapabilitiesImplementation(
+        dynamicRegistration, linkSupport);
+  }
+
+  /// Whether implementation supports dynamic registration. If this is set to
+  /// `true` the client supports the new `(TextDocumentRegistrationOptions &
+  /// StaticRegistrationOptions)` return value for the corresponding server
+  /// capability as well.
+  final bool dynamicRegistration;
+
+  /// The client supports additional metadata in the form of definition links.
+  ///
+  /// Since 3.14.0
+  final bool linkSupport;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (linkSupport != null) {
+      __result['linkSupport'] = linkSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesImplementation) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          linkSupport == other.linkSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesOnTypeFormatting implements ToJsonable {
+  TextDocumentClientCapabilitiesOnTypeFormatting(this.dynamicRegistration);
+  static TextDocumentClientCapabilitiesOnTypeFormatting fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new TextDocumentClientCapabilitiesOnTypeFormatting(
+        dynamicRegistration);
+  }
+
+  /// Whether on type formatting supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesOnTypeFormatting) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesParameterInformation implements ToJsonable {
+  TextDocumentClientCapabilitiesParameterInformation(this.labelOffsetSupport);
+  static TextDocumentClientCapabilitiesParameterInformation fromJson(
+      Map<String, dynamic> json) {
+    final labelOffsetSupport = json['labelOffsetSupport'];
+    return new TextDocumentClientCapabilitiesParameterInformation(
+        labelOffsetSupport);
+  }
+
+  /// The client supports processing label offsets instead of a simple label
+  /// string.
+  ///
+  /// Since 3.14.0
+  final bool labelOffsetSupport;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (labelOffsetSupport != null) {
+      __result['labelOffsetSupport'] = labelOffsetSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesParameterInformation) {
+      return labelOffsetSupport == other.labelOffsetSupport && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, labelOffsetSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesPublishDiagnostics implements ToJsonable {
+  TextDocumentClientCapabilitiesPublishDiagnostics(this.relatedInformation);
+  static TextDocumentClientCapabilitiesPublishDiagnostics fromJson(
+      Map<String, dynamic> json) {
+    final relatedInformation = json['relatedInformation'];
+    return new TextDocumentClientCapabilitiesPublishDiagnostics(
+        relatedInformation);
+  }
+
+  /// Whether the clients accepts diagnostics with related information.
+  final bool relatedInformation;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (relatedInformation != null) {
+      __result['relatedInformation'] = relatedInformation;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesPublishDiagnostics) {
+      return relatedInformation == other.relatedInformation && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, relatedInformation.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesRangeFormatting implements ToJsonable {
+  TextDocumentClientCapabilitiesRangeFormatting(this.dynamicRegistration);
+  static TextDocumentClientCapabilitiesRangeFormatting fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new TextDocumentClientCapabilitiesRangeFormatting(
+        dynamicRegistration);
+  }
+
+  /// Whether range formatting supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesRangeFormatting) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesReferences implements ToJsonable {
+  TextDocumentClientCapabilitiesReferences(this.dynamicRegistration);
+  static TextDocumentClientCapabilitiesReferences fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new TextDocumentClientCapabilitiesReferences(dynamicRegistration);
+  }
+
+  /// Whether references supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesReferences) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesRename implements ToJsonable {
+  TextDocumentClientCapabilitiesRename(
+      this.dynamicRegistration, this.prepareSupport);
+  static TextDocumentClientCapabilitiesRename fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final prepareSupport = json['prepareSupport'];
+    return new TextDocumentClientCapabilitiesRename(
+        dynamicRegistration, prepareSupport);
+  }
+
+  /// Whether rename supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// The client supports testing for validity of rename operations before
+  /// execution.
+  final bool prepareSupport;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (prepareSupport != null) {
+      __result['prepareSupport'] = prepareSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesRename) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          prepareSupport == other.prepareSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, prepareSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesSignatureHelp implements ToJsonable {
+  TextDocumentClientCapabilitiesSignatureHelp(
+      this.dynamicRegistration, this.signatureInformation);
+  static TextDocumentClientCapabilitiesSignatureHelp fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final signatureInformation = json['signatureInformation'] != null
+        ? TextDocumentClientCapabilitiesSignatureInformation.fromJson(
+            json['signatureInformation'])
+        : null;
+    return new TextDocumentClientCapabilitiesSignatureHelp(
+        dynamicRegistration, signatureInformation);
+  }
+
+  /// Whether signature help supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// The client supports the following `SignatureInformation` specific
+  /// properties.
+  final TextDocumentClientCapabilitiesSignatureInformation signatureInformation;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (signatureInformation != null) {
+      __result['signatureInformation'] = signatureInformation;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesSignatureHelp) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          signatureInformation == other.signatureInformation &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, signatureInformation.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesSignatureInformation implements ToJsonable {
+  TextDocumentClientCapabilitiesSignatureInformation(
+      this.documentationFormat, this.parameterInformation);
+  static TextDocumentClientCapabilitiesSignatureInformation fromJson(
+      Map<String, dynamic> json) {
+    final documentationFormat = json['documentationFormat']
+        ?.map((item) => item != null ? MarkupKind.fromJson(item) : null)
+        ?.cast<MarkupKind>()
+        ?.toList();
+    final parameterInformation = json['parameterInformation'] != null
+        ? TextDocumentClientCapabilitiesParameterInformation.fromJson(
+            json['parameterInformation'])
+        : null;
+    return new TextDocumentClientCapabilitiesSignatureInformation(
+        documentationFormat, parameterInformation);
+  }
+
+  /// The client supports the follow content formats for the documentation
+  /// property. The order describes the preferred format of the client.
+  final List<MarkupKind> documentationFormat;
+
+  /// Client capabilities specific to parameter information.
+  final TextDocumentClientCapabilitiesParameterInformation parameterInformation;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (documentationFormat != null) {
+      __result['documentationFormat'] = documentationFormat;
+    }
+    if (parameterInformation != null) {
+      __result['parameterInformation'] = parameterInformation;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesSignatureInformation) {
+      return listEqual(documentationFormat, other.documentationFormat,
+              (MarkupKind a, MarkupKind b) => a == b) &&
+          parameterInformation == other.parameterInformation &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, documentationFormat.hashCode);
+    hash = JenkinsSmiHash.combine(hash, parameterInformation.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesSymbolKind implements ToJsonable {
+  TextDocumentClientCapabilitiesSymbolKind(this.valueSet);
+  static TextDocumentClientCapabilitiesSymbolKind fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? SymbolKind.fromJson(item) : null)
+        ?.cast<SymbolKind>()
+        ?.toList();
+    return new TextDocumentClientCapabilitiesSymbolKind(valueSet);
+  }
+
+  /// The symbol kind values the client supports. When this property exists the
+  /// client also guarantees that it will handle values outside its set
+  /// gracefully and falls back to a default value when unknown.
+  ///
+  /// If this property is not present the client only supports the symbol kinds
+  /// from `File` to `Array` as defined in the initial version of the protocol.
+  final List<SymbolKind> valueSet;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (valueSet != null) {
+      __result['valueSet'] = valueSet;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesSymbolKind) {
+      return listEqual(valueSet, other.valueSet,
+              (SymbolKind a, SymbolKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, valueSet.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class TextDocumentClientCapabilitiesSynchronization implements ToJsonable {
+  TextDocumentClientCapabilitiesSynchronization(this.dynamicRegistration,
+      this.willSave, this.willSaveWaitUntil, this.didSave);
+  static TextDocumentClientCapabilitiesSynchronization fromJson(
+      Map<String, dynamic> json) {
     final dynamicRegistration = json['dynamicRegistration'];
     final willSave = json['willSave'];
     final willSaveWaitUntil = json['willSaveWaitUntil'];
     final didSave = json['didSave'];
-    return new TextDocumentClientCapabilities(
+    return new TextDocumentClientCapabilitiesSynchronization(
         dynamicRegistration, willSave, willSaveWaitUntil, didSave);
   }
 
   /// The client supports did save notifications.
   final bool didSave;
 
-  /// Whether text document synchronization supports
-  /// dynamic registration.
+  /// Whether text document synchronization supports dynamic registration.
   final bool dynamicRegistration;
 
-  /// The client supports sending will save
-  /// notifications.
+  /// The client supports sending will save notifications.
   final bool willSave;
 
-  /// The client supports sending a will save request
-  /// and waits for a response providing text edits
-  /// which will be applied to the document before it is
+  /// The client supports sending a will save request and waits for a response
+  /// providing text edits which will be applied to the document before it is
   /// saved.
   final bool willSaveWaitUntil;
 
@@ -5304,20 +9825,103 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesSynchronization) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          willSave == other.willSave &&
+          willSaveWaitUntil == other.willSaveWaitUntil &&
+          didSave == other.didSave &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, willSave.hashCode);
+    hash = JenkinsSmiHash.combine(hash, willSaveWaitUntil.hashCode);
+    hash = JenkinsSmiHash.combine(hash, didSave.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// An event describing a change to a text document. If
-/// range and rangeLength are omitted the new text is
-/// considered to be the full content of the document.
+class TextDocumentClientCapabilitiesTypeDefinition implements ToJsonable {
+  TextDocumentClientCapabilitiesTypeDefinition(
+      this.dynamicRegistration, this.linkSupport);
+  static TextDocumentClientCapabilitiesTypeDefinition fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final linkSupport = json['linkSupport'];
+    return new TextDocumentClientCapabilitiesTypeDefinition(
+        dynamicRegistration, linkSupport);
+  }
+
+  /// Whether typeDefinition supports dynamic registration. If this is set to
+  /// `true` the client supports the new `(TextDocumentRegistrationOptions &
+  /// StaticRegistrationOptions)` return value for the corresponding server
+  /// capability as well.
+  final bool dynamicRegistration;
+
+  /// The client supports additional metadata in the form of definition links.
+  ///
+  /// Since 3.14.0
+  final bool linkSupport;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (linkSupport != null) {
+      __result['linkSupport'] = linkSupport;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentClientCapabilitiesTypeDefinition) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          linkSupport == other.linkSupport &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, linkSupport.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+/// An event describing a change to a text document. If range and rangeLength
+/// are omitted the new text is considered to be the full content of the
+/// document.
 class TextDocumentContentChangeEvent implements ToJsonable {
   TextDocumentContentChangeEvent(this.range, this.rangeLength, this.text) {
     if (text == null) {
       throw 'text is required but was not provided';
     }
   }
-  factory TextDocumentContentChangeEvent.fromJson(Map<String, dynamic> json) {
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+  static TextDocumentContentChangeEvent fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final rangeLength = json['rangeLength'];
     final text = json['text'];
     return new TextDocumentContentChangeEvent(range, rangeLength, text);
@@ -5349,9 +9953,32 @@
         obj.containsKey('text') &&
         obj['text'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentContentChangeEvent) {
+      return range == other.range &&
+          rangeLength == other.rangeLength &&
+          text == other.text &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, rangeLength.hashCode);
+    hash = JenkinsSmiHash.combine(hash, text.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-class TextDocumentEdit implements FileOperation, ToJsonable {
+class TextDocumentEdit implements ToJsonable {
   TextDocumentEdit(this.textDocument, this.edits) {
     if (textDocument == null) {
       throw 'textDocument is required but was not provided';
@@ -5360,12 +9987,12 @@
       throw 'edits is required but was not provided';
     }
   }
-  factory TextDocumentEdit.fromJson(Map<String, dynamic> json) {
+  static TextDocumentEdit fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new VersionedTextDocumentIdentifier.fromJson(json['textDocument'])
+        ? VersionedTextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final edits = json['edits']
-        ?.map((item) => item != null ? new TextEdit.fromJson(item) : null)
+        ?.map((item) => item != null ? TextEdit.fromJson(item) : null)
         ?.cast<TextEdit>()
         ?.toList();
     return new TextDocumentEdit(textDocument, edits);
@@ -5391,9 +10018,29 @@
         VersionedTextDocumentIdentifier.canParse(obj['textDocument']) &&
         obj.containsKey('edits') &&
         (obj['edits'] is List &&
-            (obj['edits'].length == 0 ||
-                obj['edits'].every((item) => TextEdit.canParse(item))));
+            (obj['edits'].every((item) => TextEdit.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentEdit) {
+      return textDocument == other.textDocument &&
+          listEqual(edits, other.edits, (TextEdit a, TextEdit b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, edits.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class TextDocumentIdentifier implements ToJsonable {
@@ -5402,7 +10049,10 @@
       throw 'uri is required but was not provided';
     }
   }
-  factory TextDocumentIdentifier.fromJson(Map<String, dynamic> json) {
+  static TextDocumentIdentifier fromJson(Map<String, dynamic> json) {
+    if (VersionedTextDocumentIdentifier.canParse(json)) {
+      return VersionedTextDocumentIdentifier.fromJson(json);
+    }
     final uri = json['uri'];
     return new TextDocumentIdentifier(uri);
   }
@@ -5421,6 +10071,24 @@
         obj.containsKey('uri') &&
         obj['uri'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentIdentifier) {
+      return uri == other.uri && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class TextDocumentItem implements ToJsonable {
@@ -5438,7 +10106,7 @@
       throw 'text is required but was not provided';
     }
   }
-  factory TextDocumentItem.fromJson(Map<String, dynamic> json) {
+  static TextDocumentItem fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
     final languageId = json['languageId'];
     final version = json['version'];
@@ -5455,8 +10123,8 @@
   /// The text document's URI.
   final String uri;
 
-  /// The version number of this document (it will
-  /// increase after each change, including undo/redo).
+  /// The version number of this document (it will increase after each change,
+  /// including undo/redo).
   final num version;
 
   Map<String, dynamic> toJson() {
@@ -5481,6 +10149,31 @@
         obj.containsKey('text') &&
         obj['text'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentItem) {
+      return uri == other.uri &&
+          languageId == other.languageId &&
+          version == other.version &&
+          text == other.text &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, languageId.hashCode);
+    hash = JenkinsSmiHash.combine(hash, version.hashCode);
+    hash = JenkinsSmiHash.combine(hash, text.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class TextDocumentPositionParams implements ToJsonable {
@@ -5492,13 +10185,18 @@
       throw 'position is required but was not provided';
     }
   }
-  factory TextDocumentPositionParams.fromJson(Map<String, dynamic> json) {
+  static TextDocumentPositionParams fromJson(Map<String, dynamic> json) {
+    if (CompletionParams.canParse(json)) {
+      return CompletionParams.fromJson(json);
+    }
+    if (ReferenceParams.canParse(json)) {
+      return ReferenceParams.fromJson(json);
+    }
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
-    final position = json['position'] != null
-        ? new Position.fromJson(json['position'])
-        : null;
+    final position =
+        json['position'] != null ? Position.fromJson(json['position']) : null;
     return new TextDocumentPositionParams(textDocument, position);
   }
 
@@ -5524,21 +10222,68 @@
         obj.containsKey('position') &&
         Position.canParse(obj['position']);
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentPositionParams) {
+      return textDocument == other.textDocument &&
+          position == other.position &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, position.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class TextDocumentRegistrationOptions implements ToJsonable {
   TextDocumentRegistrationOptions(this.documentSelector);
-  factory TextDocumentRegistrationOptions.fromJson(Map<String, dynamic> json) {
+  static TextDocumentRegistrationOptions fromJson(Map<String, dynamic> json) {
+    if (TextDocumentChangeRegistrationOptions.canParse(json)) {
+      return TextDocumentChangeRegistrationOptions.fromJson(json);
+    }
+    if (TextDocumentSaveRegistrationOptions.canParse(json)) {
+      return TextDocumentSaveRegistrationOptions.fromJson(json);
+    }
+    if (CompletionRegistrationOptions.canParse(json)) {
+      return CompletionRegistrationOptions.fromJson(json);
+    }
+    if (SignatureHelpRegistrationOptions.canParse(json)) {
+      return SignatureHelpRegistrationOptions.fromJson(json);
+    }
+    if (CodeActionRegistrationOptions.canParse(json)) {
+      return CodeActionRegistrationOptions.fromJson(json);
+    }
+    if (CodeLensRegistrationOptions.canParse(json)) {
+      return CodeLensRegistrationOptions.fromJson(json);
+    }
+    if (DocumentLinkRegistrationOptions.canParse(json)) {
+      return DocumentLinkRegistrationOptions.fromJson(json);
+    }
+    if (DocumentOnTypeFormattingRegistrationOptions.canParse(json)) {
+      return DocumentOnTypeFormattingRegistrationOptions.fromJson(json);
+    }
+    if (RenameRegistrationOptions.canParse(json)) {
+      return RenameRegistrationOptions.fromJson(json);
+    }
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new TextDocumentRegistrationOptions(documentSelector);
   }
 
-  /// A document selector to identify the scope of the
-  /// registration. If set to null the document selector
-  /// provided on the client side will be used.
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
   Map<String, dynamic> toJson() {
@@ -5551,10 +10296,27 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentRegistrationOptions) {
+      return documentSelector == other.documentSelector && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Represents reasons why a text document is saved.
@@ -5562,7 +10324,7 @@
   const TextDocumentSaveReason._(this._value);
   const TextDocumentSaveReason.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -5574,8 +10336,8 @@
     return false;
   }
 
-  /// Manually triggered, e.g. by the user pressing
-  /// save, by starting debugging, or by an API call.
+  /// Manually triggered, e.g. by the user pressing save, by starting debugging,
+  /// or by an API call.
   static const Manual = const TextDocumentSaveReason._(1);
 
   /// Automatic after a delay.
@@ -5598,25 +10360,22 @@
 class TextDocumentSaveRegistrationOptions
     implements TextDocumentRegistrationOptions, ToJsonable {
   TextDocumentSaveRegistrationOptions(this.includeText, this.documentSelector);
-  factory TextDocumentSaveRegistrationOptions.fromJson(
+  static TextDocumentSaveRegistrationOptions fromJson(
       Map<String, dynamic> json) {
     final includeText = json['includeText'];
     final documentSelector = json['documentSelector']
-        ?.map((item) => item != null ? new DocumentFilter.fromJson(item) : null)
+        ?.map((item) => item != null ? DocumentFilter.fromJson(item) : null)
         ?.cast<DocumentFilter>()
         ?.toList();
     return new TextDocumentSaveRegistrationOptions(
         includeText, documentSelector);
   }
 
-  /// A document selector to identify the scope of the
-  /// registration. If set to null the document
-  /// selector provided on the client side will be
-  /// used.
+  /// A document selector to identify the scope of the registration. If set to
+  /// null the document selector provided on the client side will be used.
   final List<DocumentFilter> documentSelector;
 
-  /// The client is supposed to include the content on
-  /// save.
+  /// The client is supposed to include the content on save.
   final bool includeText;
 
   Map<String, dynamic> toJson() {
@@ -5632,19 +10391,39 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('documentSelector') &&
         (obj['documentSelector'] is List &&
-            (obj['documentSelector'].length == 0 ||
-                obj['documentSelector']
-                    .every((item) => DocumentFilter.canParse(item))));
+            (obj['documentSelector']
+                .every((item) => DocumentFilter.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentSaveRegistrationOptions) {
+      return includeText == other.includeText &&
+          documentSelector == other.documentSelector &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, includeText.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentSelector.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
-/// Defines how the host (editor) should sync document
-/// changes to the language server.
+/// Defines how the host (editor) should sync document changes to the language
+/// server.
 class TextDocumentSyncKind {
   const TextDocumentSyncKind._(this._value);
   const TextDocumentSyncKind.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -5659,13 +10438,11 @@
   /// Documents should not be synced at all.
   static const None = const TextDocumentSyncKind._(0);
 
-  /// Documents are synced by always sending the
-  /// full content of the document.
+  /// Documents are synced by always sending the full content of the document.
   static const Full = const TextDocumentSyncKind._(1);
 
-  /// Documents are synced by sending the full
-  /// content on open. After that only incremental
-  /// updates to the document are send.
+  /// Documents are synced by sending the full content on open. After that only
+  /// incremental updates to the document are send.
   static const Incremental = const TextDocumentSyncKind._(2);
 
   Object toJson() => _value;
@@ -5682,39 +10459,35 @@
 class TextDocumentSyncOptions implements ToJsonable {
   TextDocumentSyncOptions(this.openClose, this.change, this.willSave,
       this.willSaveWaitUntil, this.save);
-  factory TextDocumentSyncOptions.fromJson(Map<String, dynamic> json) {
+  static TextDocumentSyncOptions fromJson(Map<String, dynamic> json) {
     final openClose = json['openClose'];
     final change = json['change'] != null
-        ? new TextDocumentSyncKind.fromJson(json['change'])
+        ? TextDocumentSyncKind.fromJson(json['change'])
         : null;
     final willSave = json['willSave'];
     final willSaveWaitUntil = json['willSaveWaitUntil'];
     final save =
-        json['save'] != null ? new SaveOptions.fromJson(json['save']) : null;
+        json['save'] != null ? SaveOptions.fromJson(json['save']) : null;
     return new TextDocumentSyncOptions(
         openClose, change, willSave, willSaveWaitUntil, save);
   }
 
-  /// Change notifications are sent to the server.
-  /// See TextDocumentSyncKind.None,
-  /// TextDocumentSyncKind.Full and
-  /// TextDocumentSyncKind.Incremental. If omitted
-  /// it defaults to TextDocumentSyncKind.None.
+  /// Change notifications are sent to the server. See
+  /// TextDocumentSyncKind.None, TextDocumentSyncKind.Full and
+  /// TextDocumentSyncKind.Incremental. If omitted it defaults to
+  /// TextDocumentSyncKind.None.
   final TextDocumentSyncKind change;
 
-  /// Open and close notifications are sent to the
-  /// server.
+  /// Open and close notifications are sent to the server.
   final bool openClose;
 
   /// Save notifications are sent to the server.
   final SaveOptions save;
 
-  /// Will save notifications are sent to the
-  /// server.
+  /// Will save notifications are sent to the server.
   final bool willSave;
 
-  /// Will save wait until requests are sent to the
-  /// server.
+  /// Will save wait until requests are sent to the server.
   final bool willSaveWaitUntil;
 
   Map<String, dynamic> toJson() {
@@ -5740,6 +10513,33 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextDocumentSyncOptions) {
+      return openClose == other.openClose &&
+          change == other.change &&
+          willSave == other.willSave &&
+          willSaveWaitUntil == other.willSaveWaitUntil &&
+          save == other.save &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, openClose.hashCode);
+    hash = JenkinsSmiHash.combine(hash, change.hashCode);
+    hash = JenkinsSmiHash.combine(hash, willSave.hashCode);
+    hash = JenkinsSmiHash.combine(hash, willSaveWaitUntil.hashCode);
+    hash = JenkinsSmiHash.combine(hash, save.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class TextEdit implements ToJsonable {
@@ -5751,20 +10551,17 @@
       throw 'newText is required but was not provided';
     }
   }
-  factory TextEdit.fromJson(Map<String, dynamic> json) {
-    final range =
-        json['range'] != null ? new Range.fromJson(json['range']) : null;
+  static TextEdit fromJson(Map<String, dynamic> json) {
+    final range = json['range'] != null ? Range.fromJson(json['range']) : null;
     final newText = json['newText'];
     return new TextEdit(range, newText);
   }
 
-  /// The string to be inserted. For delete
-  /// operations use an empty string.
+  /// The string to be inserted. For delete operations use an empty string.
   final String newText;
 
-  /// The range of the text document to be
-  /// manipulated. To insert text into a document
-  /// create a range where start === end.
+  /// The range of the text document to be manipulated. To insert text into a
+  /// document create a range where start === end.
   final Range range;
 
   Map<String, dynamic> toJson() {
@@ -5782,6 +10579,25 @@
         obj.containsKey('newText') &&
         obj['newText'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is TextEdit) {
+      return range == other.range && newText == other.newText && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, range.hashCode);
+    hash = JenkinsSmiHash.combine(hash, newText.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// General parameters to unregister a capability.
@@ -5794,15 +10610,14 @@
       throw 'method is required but was not provided';
     }
   }
-  factory Unregistration.fromJson(Map<String, dynamic> json) {
+  static Unregistration fromJson(Map<String, dynamic> json) {
     final id = json['id'];
     final method = json['method'];
     return new Unregistration(id, method);
   }
 
-  /// The id used to unregister the request or
-  /// notification. Usually an id provided during
-  /// the register request.
+  /// The id used to unregister the request or notification. Usually an id
+  /// provided during the register request.
   final String id;
 
   /// The method / capability to unregister for.
@@ -5822,6 +10637,25 @@
         obj.containsKey('method') &&
         obj['method'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is Unregistration) {
+      return id == other.id && method == other.method && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, method.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class UnregistrationParams implements ToJsonable {
@@ -5830,9 +10664,9 @@
       throw 'unregisterations is required but was not provided';
     }
   }
-  factory UnregistrationParams.fromJson(Map<String, dynamic> json) {
+  static UnregistrationParams fromJson(Map<String, dynamic> json) {
     final unregisterations = json['unregisterations']
-        ?.map((item) => item != null ? new Unregistration.fromJson(item) : null)
+        ?.map((item) => item != null ? Unregistration.fromJson(item) : null)
         ?.cast<Unregistration>()
         ?.toList();
     return new UnregistrationParams(unregisterations);
@@ -5851,10 +10685,29 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('unregisterations') &&
         (obj['unregisterations'] is List &&
-            (obj['unregisterations'].length == 0 ||
-                obj['unregisterations']
-                    .every((item) => Unregistration.canParse(item))));
+            (obj['unregisterations']
+                .every((item) => Unregistration.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is UnregistrationParams) {
+      return listEqual(unregisterations, other.unregisterations,
+              (Unregistration a, Unregistration b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, unregisterations.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class VersionedTextDocumentIdentifier
@@ -5864,7 +10717,7 @@
       throw 'uri is required but was not provided';
     }
   }
-  factory VersionedTextDocumentIdentifier.fromJson(Map<String, dynamic> json) {
+  static VersionedTextDocumentIdentifier fromJson(Map<String, dynamic> json) {
     final version = json['version'];
     final uri = json['uri'];
     return new VersionedTextDocumentIdentifier(version, uri);
@@ -5873,19 +10726,14 @@
   /// The text document's URI.
   final String uri;
 
-  /// The version number of this document. If a
-  /// versioned text document identifier is sent
-  /// from the server to the client and the file is
-  /// not open in the editor (the server has not
-  /// received an open notification before) the
-  /// server can send `null` to indicate that the
-  /// version is known and the content on disk is
-  /// the truth (as speced with document content
-  /// ownership).
+  /// The version number of this document. If a versioned text document
+  /// identifier is sent from the server to the client and the file is not open
+  /// in the editor (the server has not received an open notification before)
+  /// the server can send `null` to indicate that the version is known and the
+  /// content on disk is the truth (as speced with document content ownership).
   ///
-  /// The version number of a document will increase
-  /// after each change, including undo/redo. The
-  /// number doesn't need to be consecutive.
+  /// The version number of a document will increase after each change,
+  /// including undo/redo. The number doesn't need to be consecutive.
   final num version;
 
   Map<String, dynamic> toJson() {
@@ -5902,13 +10750,32 @@
         obj.containsKey('uri') &&
         obj['uri'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is VersionedTextDocumentIdentifier) {
+      return version == other.version && uri == other.uri && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, version.hashCode);
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class WatchKind {
   const WatchKind._(this._value);
   const WatchKind.fromJson(this._value);
 
-  final Object _value;
+  final num _value;
 
   static bool canParse(Object obj) {
     switch (obj) {
@@ -5940,8 +10807,7 @@
   bool operator ==(o) => o is WatchKind && o._value == _value;
 }
 
-/// The parameters send in a will save text
-/// document notification.
+/// The parameters send in a will save text document notification.
 class WillSaveTextDocumentParams implements ToJsonable {
   WillSaveTextDocumentParams(this.textDocument, this.reason) {
     if (textDocument == null) {
@@ -5951,9 +10817,9 @@
       throw 'reason is required but was not provided';
     }
   }
-  factory WillSaveTextDocumentParams.fromJson(Map<String, dynamic> json) {
+  static WillSaveTextDocumentParams fromJson(Map<String, dynamic> json) {
     final textDocument = json['textDocument'] != null
-        ? new TextDocumentIdentifier.fromJson(json['textDocument'])
+        ? TextDocumentIdentifier.fromJson(json['textDocument'])
         : null;
     final reason = json['reason'];
     return new WillSaveTextDocumentParams(textDocument, reason);
@@ -5980,50 +10846,441 @@
         obj.containsKey('reason') &&
         obj['reason'] is num;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is WillSaveTextDocumentParams) {
+      return textDocument == other.textDocument &&
+          reason == other.reason &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, textDocument.hashCode);
+    hash = JenkinsSmiHash.combine(hash, reason.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// Workspace specific client capabilities.
 class WorkspaceClientCapabilities implements ToJsonable {
-  WorkspaceClientCapabilities(this.applyEdit, this.documentChanges,
-      this.resourceOperations, this.failureHandling);
-  factory WorkspaceClientCapabilities.fromJson(Map<String, dynamic> json) {
+  WorkspaceClientCapabilities(
+      this.applyEdit,
+      this.workspaceEdit,
+      this.didChangeConfiguration,
+      this.didChangeWatchedFiles,
+      this.symbol,
+      this.executeCommand,
+      this.workspaceFolders,
+      this.configuration);
+  static WorkspaceClientCapabilities fromJson(Map<String, dynamic> json) {
     final applyEdit = json['applyEdit'];
-    final documentChanges = json['documentChanges'];
-    final resourceOperations = json['resourceOperations']
-        ?.map((item) =>
-            item != null ? new ResourceOperationKind.fromJson(item) : null)
-        ?.cast<ResourceOperationKind>()
-        ?.toList();
-    final failureHandling = json['failureHandling'] != null
-        ? new FailureHandlingKind.fromJson(json['failureHandling'])
+    final workspaceEdit = json['workspaceEdit'] != null
+        ? WorkspaceClientCapabilitiesWorkspaceEdit.fromJson(
+            json['workspaceEdit'])
         : null;
+    final didChangeConfiguration = json['didChangeConfiguration'] != null
+        ? WorkspaceClientCapabilitiesDidChangeConfiguration.fromJson(
+            json['didChangeConfiguration'])
+        : null;
+    final didChangeWatchedFiles = json['didChangeWatchedFiles'] != null
+        ? WorkspaceClientCapabilitiesDidChangeWatchedFiles.fromJson(
+            json['didChangeWatchedFiles'])
+        : null;
+    final symbol = json['symbol'] != null
+        ? WorkspaceClientCapabilitiesSymbol.fromJson(json['symbol'])
+        : null;
+    final executeCommand = json['executeCommand'] != null
+        ? WorkspaceClientCapabilitiesExecuteCommand.fromJson(
+            json['executeCommand'])
+        : null;
+    final workspaceFolders = json['workspaceFolders'];
+    final configuration = json['configuration'];
     return new WorkspaceClientCapabilities(
-        applyEdit, documentChanges, resourceOperations, failureHandling);
+        applyEdit,
+        workspaceEdit,
+        didChangeConfiguration,
+        didChangeWatchedFiles,
+        symbol,
+        executeCommand,
+        workspaceFolders,
+        configuration);
   }
 
-  /// The client supports applying batch edits to
-  /// the workspace by supporting the request
-  /// 'workspace/applyEdit'
+  /// The client supports applying batch edits to the workspace by supporting
+  /// the request 'workspace/applyEdit'
   final bool applyEdit;
 
-  /// The client supports versioned document
-  /// changes in `WorkspaceEdit`s
-  final bool documentChanges;
+  /// The client supports `workspace/configuration` requests.
+  ///
+  /// Since 3.6.0
+  final bool configuration;
 
-  /// The failure handling strategy of a client if
-  /// applying the workspace edit failes.
-  final FailureHandlingKind failureHandling;
+  /// Capabilities specific to the `workspace/didChangeConfiguration`
+  /// notification.
+  final WorkspaceClientCapabilitiesDidChangeConfiguration
+      didChangeConfiguration;
 
-  /// The resource operations the client supports.
-  /// Clients should at least support 'create',
-  /// 'rename' and 'delete' files and folders.
-  final List<ResourceOperationKind> resourceOperations;
+  /// Capabilities specific to the `workspace/didChangeWatchedFiles`
+  /// notification.
+  final WorkspaceClientCapabilitiesDidChangeWatchedFiles didChangeWatchedFiles;
+
+  /// Capabilities specific to the `workspace/executeCommand` request.
+  final WorkspaceClientCapabilitiesExecuteCommand executeCommand;
+
+  /// Capabilities specific to the `workspace/symbol` request.
+  final WorkspaceClientCapabilitiesSymbol symbol;
+
+  /// Capabilities specific to `WorkspaceEdit`s
+  final WorkspaceClientCapabilitiesWorkspaceEdit workspaceEdit;
+
+  /// The client has support for workspace folders.
+  ///
+  /// Since 3.6.0
+  final bool workspaceFolders;
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
     if (applyEdit != null) {
       __result['applyEdit'] = applyEdit;
     }
+    if (workspaceEdit != null) {
+      __result['workspaceEdit'] = workspaceEdit;
+    }
+    if (didChangeConfiguration != null) {
+      __result['didChangeConfiguration'] = didChangeConfiguration;
+    }
+    if (didChangeWatchedFiles != null) {
+      __result['didChangeWatchedFiles'] = didChangeWatchedFiles;
+    }
+    if (symbol != null) {
+      __result['symbol'] = symbol;
+    }
+    if (executeCommand != null) {
+      __result['executeCommand'] = executeCommand;
+    }
+    if (workspaceFolders != null) {
+      __result['workspaceFolders'] = workspaceFolders;
+    }
+    if (configuration != null) {
+      __result['configuration'] = configuration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceClientCapabilities) {
+      return applyEdit == other.applyEdit &&
+          workspaceEdit == other.workspaceEdit &&
+          didChangeConfiguration == other.didChangeConfiguration &&
+          didChangeWatchedFiles == other.didChangeWatchedFiles &&
+          symbol == other.symbol &&
+          executeCommand == other.executeCommand &&
+          workspaceFolders == other.workspaceFolders &&
+          configuration == other.configuration &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, applyEdit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workspaceEdit.hashCode);
+    hash = JenkinsSmiHash.combine(hash, didChangeConfiguration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, didChangeWatchedFiles.hashCode);
+    hash = JenkinsSmiHash.combine(hash, symbol.hashCode);
+    hash = JenkinsSmiHash.combine(hash, executeCommand.hashCode);
+    hash = JenkinsSmiHash.combine(hash, workspaceFolders.hashCode);
+    hash = JenkinsSmiHash.combine(hash, configuration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class WorkspaceClientCapabilitiesDidChangeConfiguration implements ToJsonable {
+  WorkspaceClientCapabilitiesDidChangeConfiguration(this.dynamicRegistration);
+  static WorkspaceClientCapabilitiesDidChangeConfiguration fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new WorkspaceClientCapabilitiesDidChangeConfiguration(
+        dynamicRegistration);
+  }
+
+  /// Did change configuration notification supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceClientCapabilitiesDidChangeConfiguration) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class WorkspaceClientCapabilitiesDidChangeWatchedFiles implements ToJsonable {
+  WorkspaceClientCapabilitiesDidChangeWatchedFiles(this.dynamicRegistration);
+  static WorkspaceClientCapabilitiesDidChangeWatchedFiles fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new WorkspaceClientCapabilitiesDidChangeWatchedFiles(
+        dynamicRegistration);
+  }
+
+  /// Did change watched files notification supports dynamic registration.
+  /// Please note that the current protocol doesn't support static configuration
+  /// for file changes from the server side.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceClientCapabilitiesDidChangeWatchedFiles) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class WorkspaceClientCapabilitiesExecuteCommand implements ToJsonable {
+  WorkspaceClientCapabilitiesExecuteCommand(this.dynamicRegistration);
+  static WorkspaceClientCapabilitiesExecuteCommand fromJson(
+      Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    return new WorkspaceClientCapabilitiesExecuteCommand(dynamicRegistration);
+  }
+
+  /// Execute command supports dynamic registration.
+  final bool dynamicRegistration;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceClientCapabilitiesExecuteCommand) {
+      return dynamicRegistration == other.dynamicRegistration && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class WorkspaceClientCapabilitiesSymbol implements ToJsonable {
+  WorkspaceClientCapabilitiesSymbol(this.dynamicRegistration, this.symbolKind);
+  static WorkspaceClientCapabilitiesSymbol fromJson(Map<String, dynamic> json) {
+    final dynamicRegistration = json['dynamicRegistration'];
+    final symbolKind = json['symbolKind'] != null
+        ? WorkspaceClientCapabilitiesSymbolKind.fromJson(json['symbolKind'])
+        : null;
+    return new WorkspaceClientCapabilitiesSymbol(
+        dynamicRegistration, symbolKind);
+  }
+
+  /// Symbol request supports dynamic registration.
+  final bool dynamicRegistration;
+
+  /// Specific capabilities for the `SymbolKind` in the `workspace/symbol`
+  /// request.
+  final WorkspaceClientCapabilitiesSymbolKind symbolKind;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (dynamicRegistration != null) {
+      __result['dynamicRegistration'] = dynamicRegistration;
+    }
+    if (symbolKind != null) {
+      __result['symbolKind'] = symbolKind;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceClientCapabilitiesSymbol) {
+      return dynamicRegistration == other.dynamicRegistration &&
+          symbolKind == other.symbolKind &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, dynamicRegistration.hashCode);
+    hash = JenkinsSmiHash.combine(hash, symbolKind.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class WorkspaceClientCapabilitiesSymbolKind implements ToJsonable {
+  WorkspaceClientCapabilitiesSymbolKind(this.valueSet);
+  static WorkspaceClientCapabilitiesSymbolKind fromJson(
+      Map<String, dynamic> json) {
+    final valueSet = json['valueSet']
+        ?.map((item) => item != null ? SymbolKind.fromJson(item) : null)
+        ?.cast<SymbolKind>()
+        ?.toList();
+    return new WorkspaceClientCapabilitiesSymbolKind(valueSet);
+  }
+
+  /// The symbol kind values the client supports. When this property exists the
+  /// client also guarantees that it will handle values outside its set
+  /// gracefully and falls back to a default value when unknown.
+  ///
+  /// If this property is not present the client only supports the symbol kinds
+  /// from `File` to `Array` as defined in the initial version of the protocol.
+  final List<SymbolKind> valueSet;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
+    if (valueSet != null) {
+      __result['valueSet'] = valueSet;
+    }
+    return __result;
+  }
+
+  static bool canParse(Object obj) {
+    return obj is Map<String, dynamic>;
+  }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceClientCapabilitiesSymbolKind) {
+      return listEqual(valueSet, other.valueSet,
+              (SymbolKind a, SymbolKind b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, valueSet.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
+}
+
+class WorkspaceClientCapabilitiesWorkspaceEdit implements ToJsonable {
+  WorkspaceClientCapabilitiesWorkspaceEdit(
+      this.documentChanges, this.resourceOperations, this.failureHandling);
+  static WorkspaceClientCapabilitiesWorkspaceEdit fromJson(
+      Map<String, dynamic> json) {
+    final documentChanges = json['documentChanges'];
+    final resourceOperations = json['resourceOperations']
+        ?.map((item) =>
+            item != null ? ResourceOperationKind.fromJson(item) : null)
+        ?.cast<ResourceOperationKind>()
+        ?.toList();
+    final failureHandling = json['failureHandling'] != null
+        ? FailureHandlingKind.fromJson(json['failureHandling'])
+        : null;
+    return new WorkspaceClientCapabilitiesWorkspaceEdit(
+        documentChanges, resourceOperations, failureHandling);
+  }
+
+  /// The client supports versioned document changes in `WorkspaceEdit`s
+  final bool documentChanges;
+
+  /// The failure handling strategy of a client if applying the workspace edit
+  /// fails.
+  final FailureHandlingKind failureHandling;
+
+  /// The resource operations the client supports. Clients should at least
+  /// support 'create', 'rename' and 'delete' files and folders.
+  final List<ResourceOperationKind> resourceOperations;
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> __result = {};
     if (documentChanges != null) {
       __result['documentChanges'] = documentChanges;
     }
@@ -6039,16 +11296,61 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceClientCapabilitiesWorkspaceEdit) {
+      return documentChanges == other.documentChanges &&
+          listEqual(resourceOperations, other.resourceOperations,
+              (ResourceOperationKind a, ResourceOperationKind b) => a == b) &&
+          failureHandling == other.failureHandling &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, documentChanges.hashCode);
+    hash = JenkinsSmiHash.combine(hash, resourceOperations.hashCode);
+    hash = JenkinsSmiHash.combine(hash, failureHandling.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class WorkspaceEdit implements ToJsonable {
   WorkspaceEdit(this.changes, this.documentChanges);
-  factory WorkspaceEdit.fromJson(Map<String, dynamic> json) {
-    final changes = json['changes'];
-    final documentChanges = json['documentChanges']
-        ?.map((item) => item)
-        ?.cast<FileOperation>()
-        ?.toList();
+  static WorkspaceEdit fromJson(Map<String, dynamic> json) {
+    final changes = json['changes']
+        ?.map((key, value) => new MapEntry(
+            key,
+            value
+                ?.map((item) => item != null ? TextEdit.fromJson(item) : null)
+                ?.cast<TextEdit>()
+                ?.toList()))
+        ?.cast<String, List<TextEdit>>();
+    final documentChanges = (json['documentChanges'] is List && (json['documentChanges'].every((item) => TextDocumentEdit.canParse(item))))
+        ? new Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t1(
+            json['documentChanges']
+                ?.map((item) =>
+                    item != null ? TextDocumentEdit.fromJson(item) : null)
+                ?.cast<TextDocumentEdit>()
+                ?.toList())
+        : ((json['documentChanges'] is List && (json['documentChanges'].every((item) => (TextDocumentEdit.canParse(item) || CreateFile.canParse(item) || RenameFile.canParse(item) || DeleteFile.canParse(item)))))
+            ? new Either2<List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>.t2(json['documentChanges']
+                ?.map((item) => TextDocumentEdit.canParse(item)
+                    ? new Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t1(
+                        item != null ? TextDocumentEdit.fromJson(item) : null)
+                    : (CreateFile.canParse(item)
+                        ? new Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t2(item != null ? CreateFile.fromJson(item) : null)
+                        : (RenameFile.canParse(item) ? new Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t3(item != null ? RenameFile.fromJson(item) : null) : (DeleteFile.canParse(item) ? new Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>.t4(item != null ? DeleteFile.fromJson(item) : null) : (item == null ? null : (throw '''${item} was not one of (TextDocumentEdit, CreateFile, RenameFile, DeleteFile)'''))))))
+                ?.cast<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>()
+                ?.toList())
+            : (json['documentChanges'] == null ? null : (throw '''${json['documentChanges']} was not one of (List<TextDocumentEdit>, List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>)''')));
     return new WorkspaceEdit(changes, documentChanges);
   }
 
@@ -6056,26 +11358,21 @@
   final Map<String, List<TextEdit>> changes;
 
   /// Depending on the client capability
-  /// `workspace.workspaceEdit.resourceOperations`
-  /// document changes are either an array of
-  /// `TextDocumentEdit`s to express changes to n
-  /// different text documents where each text
-  /// document edit addresses a specific version
-  /// of a text document. Or it can contain above
-  /// `TextDocumentEdit`s mixed with create,
-  /// rename and delete file / folder operations.
+  /// `workspace.workspaceEdit.resourceOperations` document changes are either
+  /// an array of `TextDocumentEdit`s to express changes to n different text
+  /// documents where each text document edit addresses a specific version of a
+  /// text document. Or it can contain above `TextDocumentEdit`s mixed with
+  /// create, rename and delete file / folder operations.
   ///
-  /// Whether a client supports versioned document
-  /// edits is expressed via
-  /// `workspace.workspaceEdit.documentChanges`
-  /// client capability.
+  /// Whether a client supports versioned document edits is expressed via
+  /// `workspace.workspaceEdit.documentChanges` client capability.
   ///
-  /// If a client neither supports
-  /// `documentChanges` nor
-  /// `workspace.workspaceEdit.resourceOperations`
-  /// then only plain `TextEdit`s using the
-  /// `changes` property are supported.
-  final List<FileOperation> documentChanges;
+  /// If a client neither supports `documentChanges` nor
+  /// `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s
+  /// using the `changes` property are supported.
+  final Either2<List<TextDocumentEdit>,
+          List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>>>
+      documentChanges;
 
   Map<String, dynamic> toJson() {
     Map<String, dynamic> __result = {};
@@ -6091,6 +11388,28 @@
   static bool canParse(Object obj) {
     return obj is Map<String, dynamic>;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceEdit) {
+      return mapEqual(changes, other.changes,
+              (List<TextEdit> a, List<TextEdit> b) => a == b) &&
+          documentChanges == other.documentChanges &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, changes.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentChanges.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 class WorkspaceFolder implements ToJsonable {
@@ -6102,18 +11421,16 @@
       throw 'name is required but was not provided';
     }
   }
-  factory WorkspaceFolder.fromJson(Map<String, dynamic> json) {
+  static WorkspaceFolder fromJson(Map<String, dynamic> json) {
     final uri = json['uri'];
     final name = json['name'];
     return new WorkspaceFolder(uri, name);
   }
 
-  /// The name of the workspace folder. Defaults
-  /// to the uri's basename.
+  /// The name of the workspace folder. Defaults to the uri's basename.
   final String name;
 
-  /// The associated URI for this workspace
-  /// folder.
+  /// The associated URI for this workspace folder.
   final String uri;
 
   Map<String, dynamic> toJson() {
@@ -6130,6 +11447,25 @@
         obj.containsKey('name') &&
         obj['name'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceFolder) {
+      return uri == other.uri && name == other.name && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, uri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// The workspace folder change event.
@@ -6142,15 +11478,13 @@
       throw 'removed is required but was not provided';
     }
   }
-  factory WorkspaceFoldersChangeEvent.fromJson(Map<String, dynamic> json) {
+  static WorkspaceFoldersChangeEvent fromJson(Map<String, dynamic> json) {
     final added = json['added']
-        ?.map(
-            (item) => item != null ? new WorkspaceFolder.fromJson(item) : null)
+        ?.map((item) => item != null ? WorkspaceFolder.fromJson(item) : null)
         ?.cast<WorkspaceFolder>()
         ?.toList();
     final removed = json['removed']
-        ?.map(
-            (item) => item != null ? new WorkspaceFolder.fromJson(item) : null)
+        ?.map((item) => item != null ? WorkspaceFolder.fromJson(item) : null)
         ?.cast<WorkspaceFolder>()
         ?.toList();
     return new WorkspaceFoldersChangeEvent(added, removed);
@@ -6174,15 +11508,34 @@
     return obj is Map<String, dynamic> &&
         obj.containsKey('added') &&
         (obj['added'] is List &&
-            (obj['added'].length == 0 ||
-                obj['added']
-                    .every((item) => WorkspaceFolder.canParse(item)))) &&
+            (obj['added'].every((item) => WorkspaceFolder.canParse(item)))) &&
         obj.containsKey('removed') &&
         (obj['removed'] is List &&
-            (obj['removed'].length == 0 ||
-                obj['removed']
-                    .every((item) => WorkspaceFolder.canParse(item))));
+            (obj['removed'].every((item) => WorkspaceFolder.canParse(item))));
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceFoldersChangeEvent) {
+      return listEqual(added, other.added,
+              (WorkspaceFolder a, WorkspaceFolder b) => a == b) &&
+          listEqual(removed, other.removed,
+              (WorkspaceFolder a, WorkspaceFolder b) => a == b) &&
+          true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, added.hashCode);
+    hash = JenkinsSmiHash.combine(hash, removed.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
 
 /// The parameters of a Workspace Symbol Request.
@@ -6192,7 +11545,7 @@
       throw 'query is required but was not provided';
     }
   }
-  factory WorkspaceSymbolParams.fromJson(Map<String, dynamic> json) {
+  static WorkspaceSymbolParams fromJson(Map<String, dynamic> json) {
     final query = json['query'];
     return new WorkspaceSymbolParams(query);
   }
@@ -6211,4 +11564,22 @@
         obj.containsKey('query') &&
         obj['query'] is String;
   }
+
+  @override
+  bool operator ==(other) {
+    if (other is WorkspaceSymbolParams) {
+      return query == other.query && true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, query.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+
+  @override
+  String toString() => jsonEncoder.convert(toJson());
 }
diff --git a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
index 35ae774..7a4edc4 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_special.dart
@@ -2,7 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-Object id(Object obj) => obj;
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+
+const jsonRpcVersion = '2.0';
 
 Object specToJson(Object obj) {
   if (obj is ToJsonable) {
@@ -145,7 +149,45 @@
       map((t) => t == o, (t) => t == o, (t) => t == o, (t) => t == o);
 }
 
-class FileOperation {}
+class ErrorOr<T> extends Either2<ResponseError, T> {
+  ErrorOr.error(ResponseError error) : super.t1(error);
+  ErrorOr.success([T result]) : super.t2(result);
+
+  /// Returns the error or throws if object is not an error. Check [isError]
+  /// before accessing [error].
+  ResponseError get error {
+    return _which == 1 ? _t1 : (throw 'Value is not an error');
+  }
+
+  /// Returns true if this object is an error, false if it is a result. Prefer
+  /// [mapResult] instead of checking this flag if [errors] will simply be
+  /// propagated as-is.
+  bool get isError => _which == 1;
+
+  /// Returns the result or throws if this object is an error. Check [isError]
+  /// before accessing [result]. It is valid for this to return null is the
+  /// object does not represent an error but the resulting value was null.
+  T get result {
+    return _which == 2 ? _t2 : (throw 'Value is not a result');
+  }
+
+  /// If this object is a result, maps [result] through [f], otherwise returns
+  /// a new error object representing [error].
+  FutureOr<ErrorOr<N>> mapResult<N>(FutureOr<ErrorOr<N>> Function(T) f) {
+    return isError
+        // Re-wrap the error using our new type arg
+        ? new ErrorOr<N>.error(error)
+        // Otherwise call the map function
+        : f(result);
+  }
+}
+
+/// A base class containing the fields common to RequestMessage and
+/// NotificationMessage to simplify handling.
+abstract class IncomingMessage {
+  Method get method;
+  dynamic get params;
+}
 
 abstract class ToJsonable {
   Object toJson();
diff --git a/pkg/analysis_server/lib/plugin/analysis/occurrences/occurrences_core.dart b/pkg/analysis_server/lib/plugin/analysis/occurrences/occurrences_core.dart
index 22a85fd..9267bc4 100644
--- a/pkg/analysis_server/lib/plugin/analysis/occurrences/occurrences_core.dart
+++ b/pkg/analysis_server/lib/plugin/analysis/occurrences/occurrences_core.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
index 06bbf6b..adc7fd9 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_core.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart b/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
index 6e7020e..fe2c234 100644
--- a/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/assist/assist_dart.dart
@@ -1,10 +1,9 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
 /**
  * An object used to provide context information for Dart assist contributors.
@@ -13,9 +12,9 @@
  */
 abstract class DartAssistContext {
   /**
-   * The analysis driver used to access analysis results.
+   * The resolution result in which assist operates.
    */
-  AnalysisDriver get analysisDriver;
+  ResolvedUnitResult get resolveResult;
 
   /**
    * The length of the selection.
@@ -28,12 +27,7 @@
   int get selectionOffset;
 
   /**
-   * The source to get assists in.
+   * The workspace in which the fix contributor operates.
    */
-  Source get source;
-
-  /**
-   * The [CompilationUnit] to compute assists in.
-   */
-  CompilationUnit get unit;
+  ChangeWorkspace get workspace;
 }
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
index af303ec..32834a2 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_core.dart
@@ -1,12 +1,10 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show SourceChange;
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -64,25 +62,9 @@
  */
 abstract class FixContext {
   /**
-   * The analysis driver used to access analysis results.
-   */
-  AnalysisDriver get analysisDriver;
-
-  /**
-   * The error to fix, should be reported by the given [analysisDriver].
+   * The error to fix.
    */
   AnalysisError get error;
-
-  /**
-   * All of the errors in the file. This is used to compute additional fixes
-   * such "Fix all instances in file."
-   */
-  List<AnalysisError> get errors;
-
-  /**
-   * The [ResourceProvider] to access files and folders.
-   */
-  ResourceProvider get resourceProvider;
 }
 
 /**
@@ -96,5 +78,5 @@
   /**
    * Return a list of fixes for the given [context].
    */
-  Future<List<Fix>> computeFixes(FixContext context);
+  Future<List<Fix>> computeFixes(covariant FixContext context);
 }
diff --git a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
index c4d54d1..fb3c5ec 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
@@ -1,25 +1,10 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
-import 'package:analysis_server/src/services/correction/fix_internal.dart'
-    show DartFixContextImpl;
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-/**
- * Complete with top-level declarations with the given [name].
- */
-typedef Future<List<TopLevelDeclarationInSource>> GetTopLevelDeclarations(
-    String name);
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
 /**
  * An object used to provide context information for [DartFixContributor]s.
@@ -28,48 +13,12 @@
  */
 abstract class DartFixContext implements FixContext {
   /**
-   * The provider for parsed or resolved ASTs.
+   * The resolution result in which fix operates.
    */
-  AstProvider get astProvider;
+  ResolvedUnitResult get resolveResult;
 
   /**
-   * The function to get top-level declarations from.
+   * The workspace in which the fix contributor operates.
    */
-  GetTopLevelDeclarations get getTopLevelDeclarations;
-
-  /**
-   * The [CompilationUnit] to compute fixes in.
-   */
-  CompilationUnit get unit;
-}
-
-/**
- * A [FixContributor] that can be used to contribute fixes for errors in Dart
- * files.
- *
- * Clients may extend this class when implementing plugins.
- */
-abstract class DartFixContributor implements FixContributor {
-  @override
-  Future<List<Fix>> computeFixes(FixContext context) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    AnalysisDriver driver = context.analysisDriver;
-    Source source = context.error.source;
-    if (!AnalysisEngine.isDartFileName(source.fullName)) {
-      return const <Fix>[];
-    }
-    CompilationUnit unit = (await driver.getResult(source.fullName)).unit;
-    if (unit == null) {
-      return const <Fix>[];
-    }
-    DartFixContext dartContext =
-        new DartFixContextImpl(context, new AstProviderForDriver(driver), unit);
-    return internalComputeFixes(dartContext);
-  }
-
-  /**
-   * Return a list of fixes for the given [context].
-   */
-  Future<List<Fix>> internalComputeFixes(DartFixContext context);
+  ChangeWorkspace get workspace;
 }
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
index e4ab6d5..aaecbef 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -64,6 +64,9 @@
   if (kind == engine.ElementKind.FUNCTION_TYPE_ALIAS) {
     return ElementKind.FUNCTION_TYPE_ALIAS;
   }
+  if (kind == engine.ElementKind.GENERIC_FUNCTION_TYPE) {
+    return ElementKind.FUNCTION_TYPE_ALIAS;
+  }
   if (kind == engine.ElementKind.GETTER) {
     return ElementKind.GETTER;
   }
diff --git a/pkg/analysis_server/lib/protocol/protocol.dart b/pkg/analysis_server/lib/protocol/protocol.dart
index f3253cf..b769bd4 100644
--- a/pkg/analysis_server/lib/protocol/protocol.dart
+++ b/pkg/analysis_server/lib/protocol/protocol.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 1280460..fd21adb 100644
--- a/pkg/analysis_server/lib/protocol/protocol_constants.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_constants.dart
@@ -6,6 +6,8 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+const String PROTOCOL_VERSION = '1.22.1';
+
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
 const String ANALYSIS_NOTIFICATION_CLOSING_LABELS = 'analysis.closingLabels';
@@ -70,7 +72,6 @@
 const String ANALYSIS_REQUEST_GET_SIGNATURE_FILE = 'file';
 const String ANALYSIS_REQUEST_GET_SIGNATURE_OFFSET = 'offset';
 const String ANALYSIS_REQUEST_REANALYZE = 'analysis.reanalyze';
-const String ANALYSIS_REQUEST_REANALYZE_ROOTS = 'roots';
 const String ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
 const String ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS_EXCLUDED = 'excluded';
 const String ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS_INCLUDED = 'included';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 3a0a480..5130033 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -3495,83 +3495,28 @@
 /**
  * analysis.reanalyze params
  *
- * {
- *   "roots": optional List<FilePath>
- * }
- *
  * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisReanalyzeParams implements RequestParams {
-  List<String> _roots;
-
-  /**
-   * A list of the analysis roots that are to be re-analyzed.
-   */
-  List<String> get roots => _roots;
-
-  /**
-   * A list of the analysis roots that are to be re-analyzed.
-   */
-  void set roots(List<String> value) {
-    this._roots = value;
-  }
-
-  AnalysisReanalyzeParams({List<String> roots}) {
-    this.roots = roots;
-  }
-
-  factory AnalysisReanalyzeParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
-    if (json == null) {
-      json = {};
-    }
-    if (json is Map) {
-      List<String> roots;
-      if (json.containsKey("roots")) {
-        roots = jsonDecoder.decodeList(
-            jsonPath + ".roots", json["roots"], jsonDecoder.decodeString);
-      }
-      return new AnalysisReanalyzeParams(roots: roots);
-    } else {
-      throw jsonDecoder.mismatch(jsonPath, "analysis.reanalyze params", json);
-    }
-  }
-
-  factory AnalysisReanalyzeParams.fromRequest(Request request) {
-    return new AnalysisReanalyzeParams.fromJson(
-        new RequestDecoder(request), "params", request.params);
-  }
-
   @override
-  Map<String, dynamic> toJson() {
-    Map<String, dynamic> result = {};
-    if (roots != null) {
-      result["roots"] = roots;
-    }
-    return result;
-  }
+  Map<String, dynamic> toJson() => <String, dynamic>{};
 
   @override
   Request toRequest(String id) {
-    return new Request(id, "analysis.reanalyze", toJson());
+    return new Request(id, "analysis.reanalyze", null);
   }
 
   @override
-  String toString() => json.encode(toJson());
-
-  @override
   bool operator ==(other) {
     if (other is AnalysisReanalyzeParams) {
-      return listEqual(roots, other.roots, (String a, String b) => a == b);
+      return true;
     }
     return false;
   }
 
   @override
   int get hashCode {
-    int hash = 0;
-    hash = JenkinsSmiHash.combine(hash, roots.hashCode);
-    return JenkinsSmiHash.finish(hash);
+    return 613039876;
   }
 }
 
diff --git a/pkg/analysis_server/lib/src/analysis_logger.dart b/pkg/analysis_server/lib/src/analysis_logger.dart
index 3391196..768ab01 100644
--- a/pkg/analysis_server/lib/src/analysis_logger.dart
+++ b/pkg/analysis_server/lib/src/analysis_logger.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 0ef82e1..a917fb1 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -9,11 +9,13 @@
 import 'dart:math' show max;
 
 import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_constants.dart'
+    show PROTOCOL_VERSION;
 import 'package:analysis_server/protocol/protocol_generated.dart'
     hide AnalysisOptions;
 import 'package:analysis_server/src/analysis_logger.dart';
+import 'package:analysis_server/src/analysis_server_abstract.dart';
 import 'package:analysis_server/src/channel/channel.dart';
-import 'package:analysis_server/src/collections.dart';
 import 'package:analysis_server/src/computer/computer_highlights.dart';
 import 'package:analysis_server/src/computer/computer_highlights2.dart';
 import 'package:analysis_server/src/computer/computer_outline.dart';
@@ -40,36 +42,29 @@
 import 'package:analysis_server/src/search/search_domain.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
-import 'package:analysis_server/src/services/correction/namespace.dart';
-import 'package:analysis_server/src/services/search/element_visitors.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_server/src/utilities/null_string_sink.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context_root.dart';
-import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
-import 'package:analyzer/src/dart/analysis/file_byte_store.dart'
-    show EvictingFileByteStore;
 import 'package:analyzer/src/dart/analysis/file_state.dart' as nd;
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/status.dart' as nd;
-import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/plugin/resolver_provider.dart';
-import 'package:analyzer/src/util/glob.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 import 'package:telemetry/crash_reporting.dart';
@@ -78,185 +73,77 @@
 
 typedef void OptionUpdater(AnalysisOptionsImpl options);
 
-/**
- * Instances of the class [AnalysisServer] implement a server that listens on a
- * [CommunicationChannel] for analysis requests and process them.
- */
-class AnalysisServer {
-  /**
-   * The version of the analysis server. The value should be replaced
-   * automatically during the build.
-   */
-  static final String VERSION = '1.21.1';
-
-  /**
-   * The options of this server instance.
-   */
-  AnalysisServerOptions options;
-
-  /**
-   * The channel from which requests are received and to which responses should
-   * be sent.
-   */
+/// Instances of the class [AnalysisServer] implement a server that listens on a
+/// [CommunicationChannel] for analysis requests and process them.
+class AnalysisServer extends AbstractAnalysisServer {
+  /// The channel from which requests are received and to which responses should
+  /// be sent.
   final ServerCommunicationChannel channel;
 
-  /**
-   * The object used to manage sending a subset of notifications to the client.
-   * The subset of notifications are those to which plugins may contribute.
-   * This field is `null` when the new plugin support is disabled.
-   */
-  final NotificationManager notificationManager;
+  /// The object used to manage sending a subset of notifications to the client.
+  /// The subset of notifications are those to which plugins may contribute.
+  /// This field is `null` when the new plugin support is disabled.
+  NotificationManager notificationManager;
 
-  /**
-   * The object used to manage the execution of plugins.
-   */
+  /// The object used to manage the execution of plugins.
   PluginManager pluginManager;
 
-  /**
-   * The [ResourceProvider] using which paths are converted into [Resource]s.
-   */
-  final ResourceProvider resourceProvider;
-
-  /**
-   * The [SearchEngine] for this server, may be `null` if indexing is disabled.
-   */
+  /// The [SearchEngine] for this server, may be `null` if indexing is disabled.
   SearchEngine searchEngine;
 
-  /**
-   * A list of the globs used to determine which files should be analyzed. The
-   * list is lazily created and should be accessed using [analyzedFilesGlobs].
-   */
-  List<Glob> _analyzedFilesGlobs = null;
-
-  /**
-   * The [ContextManager] that handles the mapping from analysis roots to
-   * context directories.
-   */
-  ContextManager contextManager;
-
-  /**
-   * A flag indicating whether the server is running.  When false, contexts
-   * will no longer be added to [contextWorkQueue], and [performOperation] will
-   * discard any tasks it finds on [contextWorkQueue].
-   */
-  bool running;
-
-  /**
-   * A flag indicating the value of the 'analyzing' parameter sent in the last
-   * status message to the client.
-   */
+  /// A flag indicating the value of the 'analyzing' parameter sent in the last
+  /// status message to the client.
   bool statusAnalyzing = false;
 
-  /**
-   * A list of the request handlers used to handle the requests sent to this
-   * server.
-   */
+  /// A list of the request handlers used to handle the requests sent to this
+  /// server.
   List<RequestHandler> handlers;
 
-  /**
-   * The object used to manage the SDK's known to this server.
-   */
+  /// The object used to manage the SDK's known to this server.
   final DartSdkManager sdkManager;
 
-  /**
-   * The instrumentation service that is to be used by this analysis server.
-   */
+  /// The instrumentation service that is to be used by this analysis server.
   final InstrumentationService instrumentationService;
 
-  /**
-   * A set of the [ServerService]s to send notifications for.
-   */
+  /// A set of the [ServerService]s to send notifications for.
   Set<ServerService> serverServices = new HashSet<ServerService>();
 
-  /**
-   * A set of the [GeneralAnalysisService]s to send notifications for.
-   */
+  /// A set of the [GeneralAnalysisService]s to send notifications for.
   Set<GeneralAnalysisService> generalAnalysisServices =
       new HashSet<GeneralAnalysisService>();
 
-  /**
-   * A table mapping [AnalysisService]s to the file paths for which these
-   * notifications should be sent.
-   */
+  /// A table mapping [AnalysisService]s to the file paths for which these
+  /// notifications should be sent.
   Map<AnalysisService, Set<String>> analysisServices =
       new HashMap<AnalysisService, Set<String>>();
 
-  /**
-   * A table mapping [FlutterService]s to the file paths for which these
-   * notifications should be sent.
-   */
+  /// A table mapping [FlutterService]s to the file paths for which these
+  /// notifications should be sent.
   Map<FlutterService, Set<String>> flutterServices = {};
 
-  /**
-   * Performance information before initial analysis is complete.
-   */
-  final ServerPerformance performanceDuringStartup = new ServerPerformance();
-
-  /**
-   * Performance information after initial analysis is complete
-   * or `null` if the initial analysis is not yet complete
-   */
-  ServerPerformance performanceAfterStartup;
-
-  /**
-   * A [RecentBuffer] of the most recent exceptions encountered by the analysis
-   * server.
-   */
-  final RecentBuffer<ServerException> exceptions = new RecentBuffer(10);
-
-  /**
-   * The class into which performance information is currently being recorded.
-   * During startup, this will be the same as [performanceDuringStartup]
-   * and after startup is complete, this switches to [performanceAfterStartup].
-   */
-  ServerPerformance _performance;
-
-  /**
-   * The [Completer] that completes when analysis is complete.
-   */
+  /// The [Completer] that completes when analysis is complete.
   Completer _onAnalysisCompleteCompleter;
 
-  /**
-   * The controller that is notified when analysis is started.
-   */
+  /// The controller that is notified when analysis is started.
   StreamController<bool> _onAnalysisStartedController;
 
-  /**
-   * The content overlay for all analysis drivers.
-   */
-  final nd.FileContentOverlay fileContentOverlay = new nd.FileContentOverlay();
-
-  /**
-   * The current state of overlays from the client.  This is used as the
-   * content cache for all contexts.
-   */
-  final ContentCache overlayState = new ContentCache();
-
-  /**
-   * If the "analysis.analyzedFiles" notification is currently being subscribed
-   * to (see [generalAnalysisServices]), and at least one such notification has
-   * been sent since the subscription was enabled, the set of analyzed files
-   * that was delivered in the most recently sent notification.  Otherwise
-   * `null`.
-   */
+  /// If the "analysis.analyzedFiles" notification is currently being subscribed
+  /// to (see [generalAnalysisServices]), and at least one such notification has
+  /// been sent since the subscription was enabled, the set of analyzed files
+  /// that was delivered in the most recently sent notification.  Otherwise
+  /// `null`.
   Set<String> prevAnalyzedFiles;
 
-  /**
-   * The default options used to create new analysis contexts. This object is
-   * also referenced by the ContextManager.
-   */
+  /// The default options used to create new analysis contexts. This object is
+  /// also referenced by the ContextManager.
   final AnalysisOptionsImpl defaultContextOptions = new AnalysisOptionsImpl();
 
-  /**
-   * The file resolver provider used to override the way file URI's are
-   * resolved in some contexts.
-   */
+  /// The file resolver provider used to override the way file URI's are
+  /// resolved in some contexts.
   ResolverProvider fileResolverProvider;
 
-  /**
-   * The package resolver provider used to override the way package URI's are
-   * resolved in some contexts.
-   */
+  /// The package resolver provider used to override the way package URI's are
+  /// resolved in some contexts.
   ResolverProvider packageResolverProvider;
 
   PerformanceLog _analysisPerformanceLogger;
@@ -264,48 +151,36 @@
   ByteStore byteStore;
   nd.AnalysisDriverScheduler analysisDriverScheduler;
 
-  /**
-   * The controller for [onAnalysisSetChanged].
-   */
+  /// The controller for [onAnalysisSetChanged].
   final StreamController _onAnalysisSetChangedController =
       new StreamController.broadcast(sync: true);
 
-  /**
-   * The set of the files that are currently priority.
-   */
-  final Set<String> priorityFiles = new Set<String>();
-
-  /**
-   * The DiagnosticServer for this AnalysisServer. If available, it can be used
-   * to start an http diagnostics server or return the port for an existing
-   * server.
-   */
+  /// The DiagnosticServer for this AnalysisServer. If available, it can be used
+  /// to start an http diagnostics server or return the port for an existing
+  /// server.
   final DiagnosticServer diagnosticServer;
 
   final DetachableFileSystemManager detachableFileSystemManager;
 
-  /**
-   * Initialize a newly created server to receive requests from and send
-   * responses to the given [channel].
-   *
-   * If [rethrowExceptions] is true, then any exceptions thrown by analysis are
-   * propagated up the call stack.  The default is true to allow analysis
-   * exceptions to show up in unit tests, but it should be set to false when
-   * running a full analysis server.
-   */
+  /// Initialize a newly created server to receive requests from and send
+  /// responses to the given [channel].
+  ///
+  /// If [rethrowExceptions] is true, then any exceptions thrown by analysis are
+  /// propagated up the call stack.  The default is true to allow analysis
+  /// exceptions to show up in unit tests, but it should be set to false when
+  /// running a full analysis server.
   AnalysisServer(
     this.channel,
-    this.resourceProvider,
-    this.options,
+    ResourceProvider baseResourceProvider,
+    AnalysisServerOptions options,
     this.sdkManager,
     this.instrumentationService, {
     this.diagnosticServer,
     ResolverProvider fileResolverProvider: null,
     ResolverProvider packageResolverProvider: null,
     this.detachableFileSystemManager: null,
-  }) : notificationManager =
-            new NotificationManager(channel, resourceProvider) {
-    _performance = performanceDuringStartup;
+  }) : super(options, baseResourceProvider) {
+    notificationManager = new NotificationManager(channel, resourceProvider);
 
     pluginManager = new PluginManager(
         resourceProvider,
@@ -332,7 +207,7 @@
       }
       _analysisPerformanceLogger = new PerformanceLog(sink);
     }
-    byteStore = _createByteStore();
+    byteStore = createByteStore(resourceProvider);
     analysisDriverScheduler = new nd.AnalysisDriverScheduler(
         _analysisPerformanceLogger,
         driverWatcher: pluginWatcher);
@@ -341,7 +216,6 @@
 
     contextManager = new ContextManagerImpl(
         resourceProvider,
-        fileContentOverlay,
         sdkManager,
         packageResolverProvider,
         analyzedFilesGlobs,
@@ -354,15 +228,15 @@
     contextManager.callbacks = contextManagerCallbacks;
     AnalysisEngine.instance.logger = new AnalysisLogger(this);
     _onAnalysisStartedController = new StreamController.broadcast();
-    running = true;
     onAnalysisStarted.first.then((_) {
       onAnalysisComplete.then((_) {
         performanceAfterStartup = new ServerPerformance();
-        _performance = performanceAfterStartup;
+        performance = performanceAfterStartup;
       });
     });
     searchEngine = new SearchEngineImpl(driverMap.values);
-    Notification notification = new ServerConnectedParams(VERSION, io.pid,
+    Notification notification = new ServerConnectedParams(
+            PROTOCOL_VERSION, io.pid,
             sessionId: instrumentationService.sessionId)
         .toNotification();
     channel.sendNotification(notification);
@@ -381,47 +255,10 @@
     ];
   }
 
-  /**
-   * The analytics instance; note, this object can be `null`.
-   */
+  /// The analytics instance; note, this object can be `null`.
   telemetry.Analytics get analytics => options.analytics;
 
-  /**
-   * Return a list of the globs used to determine which files should be analyzed.
-   */
-  List<Glob> get analyzedFilesGlobs {
-    if (_analyzedFilesGlobs == null) {
-      _analyzedFilesGlobs = <Glob>[];
-      List<String> patterns = <String>[
-        '**/*.${AnalysisEngine.SUFFIX_DART}',
-        '**/*.${AnalysisEngine.SUFFIX_HTML}',
-        '**/*.${AnalysisEngine.SUFFIX_HTM}',
-        '**/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}',
-        '**/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}',
-        '**/${AnalysisEngine.PUBSPEC_YAML_FILE}'
-      ];
-      for (String pattern in patterns) {
-        try {
-          _analyzedFilesGlobs
-              .add(new Glob(resourceProvider.pathContext.separator, pattern));
-        } catch (exception, stackTrace) {
-          AnalysisEngine.instance.logger.logError(
-              'Invalid glob pattern: "$pattern"',
-              new CaughtException(exception, stackTrace));
-        }
-      }
-    }
-    return _analyzedFilesGlobs;
-  }
-
-  /**
-   * A table mapping [Folder]s to the [AnalysisDriver]s associated with them.
-   */
-  Map<Folder, nd.AnalysisDriver> get driverMap => contextManager.driverMap;
-
-  /**
-   * The [Future] that completes when analysis is complete.
-   */
+  /// The [Future] that completes when analysis is complete.
   Future get onAnalysisComplete {
     if (isAnalysisComplete()) {
       return new Future.value();
@@ -432,50 +269,27 @@
     return _onAnalysisCompleteCompleter.future;
   }
 
-  /**
-   * The stream that is notified when the analysis set is changed - this might
-   * be a change to a file, external via a watch event, or internal via
-   * overlay. This means that the resolved world might have changed.
-   *
-   * The type of produced elements is not specified and should not be used.
-   */
+  /// The stream that is notified when the analysis set is changed - this might
+  /// be a change to a file, external via a watch event, or internal via
+  /// overlay. This means that the resolved world might have changed.
+  ///
+  /// The type of produced elements is not specified and should not be used.
   Stream get onAnalysisSetChanged => _onAnalysisSetChangedController.stream;
 
-  /**
-   * The stream that is notified with `true` when analysis is started.
-   */
+  /// The stream that is notified with `true` when analysis is started.
   Stream<bool> get onAnalysisStarted {
     return _onAnalysisStartedController.stream;
   }
 
-  /**
-   * Return the total time the server's been alive.
-   */
-  Duration get uptime {
-    DateTime start = new DateTime.fromMillisecondsSinceEpoch(
-        performanceDuringStartup.startTime);
-    return new DateTime.now().difference(start);
-  }
+  /// The socket from which requests are being read has been closed.
+  void done() {}
 
-  /**
-   * The socket from which requests are being read has been closed.
-   */
-  void done() {
-    running = false;
-  }
+  /// There was an error related to the socket from which requests are being
+  /// read.
+  void error(argument) {}
 
-  /**
-   * There was an error related to the socket from which requests are being
-   * read.
-   */
-  void error(argument) {
-    running = false;
-  }
-
-  /**
-   * Return one of the SDKs that has been created, or `null` if no SDKs have
-   * been created yet.
-   */
+  /// Return one of the SDKs that has been created, or `null` if no SDKs have
+  /// been created yet.
   DartSdk findSdk() {
     DartSdk sdk = sdkManager.anySdk;
     if (sdk != null) {
@@ -485,64 +299,9 @@
     return null;
   }
 
-  /**
-   * Return an analysis driver to which the file with the given [path] is
-   * added if one exists, otherwise a driver in which the file was analyzed if
-   * one exists, otherwise the first driver, otherwise `null`.
-   */
-  nd.AnalysisDriver getAnalysisDriver(String path) {
-    List<nd.AnalysisDriver> drivers = driverMap.values.toList();
-    if (drivers.isNotEmpty) {
-      // Sort the drivers so that more deeply nested contexts will be checked
-      // before enclosing contexts.
-      drivers.sort((first, second) =>
-          second.contextRoot.root.length - first.contextRoot.root.length);
-      nd.AnalysisDriver driver = drivers.firstWhere(
-          (driver) => driver.contextRoot.containsFile(path),
-          orElse: () => null);
-      driver ??= drivers.firstWhere(
-          (driver) => driver.knownFiles.contains(path),
-          orElse: () => null);
-      driver ??= drivers.first;
-      return driver;
-    }
-    return null;
-  }
-
-  /**
-   * Return the analysis result for the file with the given [path]. The file is
-   * analyzed in one of the analysis drivers to which the file was added,
-   * otherwise in the first driver, otherwise `null` is returned.
-   */
-  Future<nd.AnalysisResult> getAnalysisResult(String path,
-      {bool sendCachedToStream: false}) {
-    if (!AnalysisEngine.isDartFileName(path)) {
-      return null;
-    }
-
-    nd.AnalysisDriver driver = getAnalysisDriver(path);
-    if (driver == null) {
-      return new Future.value();
-    }
-
-    return driver
-        .getResult(path, sendCachedToStream: sendCachedToStream)
-        .catchError((_) => null);
-  }
-
-  /**
-   * Return the [AstProvider] for the given [path].
-   */
-  AstProvider getAstProvider(String path) {
-    nd.AnalysisDriver analysisDriver = getAnalysisDriver(path);
-    return new AstProviderForDriver(analysisDriver);
-  }
-
-  /**
-   * Return the cached analysis result for the file with the given [path].
-   * If there is no cached result, return `null`.
-   */
-  nd.AnalysisResult getCachedAnalysisResult(String path) {
+  /// Return the cached analysis result for the file with the given [path].
+  /// If there is no cached result, return `null`.
+  ResolvedUnitResult getCachedResolvedUnit(String path) {
     if (!AnalysisEngine.isDartFileName(path)) {
       return null;
     }
@@ -551,92 +310,9 @@
     return driver?.getCachedResult(path);
   }
 
-  /**
-   * Return a [Future] that completes with the [Element] at the given
-   * [offset] of the given [file], or with `null` if there is no node at the
-   * [offset] or the node does not have an element.
-   */
-  Future<Element> getElementAtOffset(String file, int offset) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    if (!priorityFiles.contains(file)) {
-      var driver = getAnalysisDriver(file);
-      if (driver == null) {
-        return null;
-      }
-
-      var unitElementResult = await driver.getUnitElement(file);
-      if (unitElementResult == null) {
-        return null;
-      }
-
-      var element = findElementByNameOffset(unitElementResult.element, offset);
-      if (element != null) {
-        return element;
-      }
-    }
-
-    AstNode node = await getNodeAtOffset(file, offset);
-    return getElementOfNode(node);
-  }
-
-  /**
-   * Return the [Element] of the given [node], or `null` if [node] is `null` or
-   * does not have an element.
-   */
-  Element getElementOfNode(AstNode node) {
-    if (node == null) {
-      return null;
-    }
-    if (node is SimpleIdentifier && node.parent is LibraryIdentifier) {
-      node = node.parent;
-    }
-    if (node is LibraryIdentifier) {
-      node = node.parent;
-    }
-    if (node is StringLiteral && node.parent is UriBasedDirective) {
-      return null;
-    }
-    Element element = ElementLocator.locate(node);
-    if (node is SimpleIdentifier && element is PrefixElement) {
-      element = getImportElement(node);
-    }
-    return element;
-  }
-
-  /**
-   * Return a [Future] that completes with the resolved [AstNode] at the
-   * given [offset] of the given [file], or with `null` if there is no node as
-   * the [offset].
-   */
-  Future<AstNode> getNodeAtOffset(String file, int offset) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    nd.AnalysisResult result = await getAnalysisResult(file);
-    CompilationUnit unit = result?.unit;
-    if (unit != null) {
-      return new NodeLocator(offset).searchWithin(unit);
-    }
-    return null;
-  }
-
-  /**
-   * Return a [Future] that completes with the resolved [CompilationUnit] for
-   * the Dart file with the given [path], or with `null` if the file is not a
-   * Dart file or cannot be resolved.
-   */
-  Future<CompilationUnit> getResolvedCompilationUnit(String path) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    nd.AnalysisResult result = await getAnalysisResult(path);
-    return result?.unit;
-  }
-
-  /**
-   * Handle a [request] that was read from the communication channel.
-   */
+  /// Handle a [request] that was read from the communication channel.
   void handleRequest(Request request) {
-    _performance.logRequest(request);
+    performance.logRequestTiming(request.clientRequestTime);
     runZoned(() {
       ServerPerformanceStatistics.serverRequests.makeCurrentWhile(() {
         int count = handlers.length;
@@ -675,50 +351,38 @@
     });
   }
 
-  /**
-   * Return `true` if analysis is complete.
-   */
+  /// Return `true` if analysis is complete.
   bool isAnalysisComplete() {
     return !analysisDriverScheduler.isAnalyzing;
   }
 
-  /**
-   * Return `true` if the given path is a valid `FilePath`.
-   *
-   * This means that it is absolute and normalized.
-   */
+  /// Return `true` if the given path is a valid `FilePath`.
+  ///
+  /// This means that it is absolute and normalized.
   bool isValidFilePath(String path) {
     return resourceProvider.pathContext.isAbsolute(path) &&
         resourceProvider.pathContext.normalize(path) == path;
   }
 
-  /**
-   * Trigger reanalysis of all files in the given list of analysis [roots], or
-   * everything if the analysis roots is `null`.
-   */
-  void reanalyze(List<Resource> roots) {
-    // Instruct the contextDirectoryManager to rebuild all contexts from
-    // scratch.
-    contextManager.refresh(roots);
+  /// Read all files, resolve all URIs, and perform required analysis in
+  /// all current analysis drivers.
+  void reanalyze() {
+    for (var driver in driverMap.values) {
+      driver.resetUriResolution();
+    }
   }
 
-  /**
-   * Send the given [notification] to the client.
-   */
+  /// Send the given [notification] to the client.
   void sendNotification(Notification notification) {
     channel.sendNotification(notification);
   }
 
-  /**
-   * Send the given [response] to the client.
-   */
+  /// Send the given [response] to the client.
   void sendResponse(Response response) {
     channel.sendResponse(response);
   }
 
-  /**
-   * Sends a `server.error` notification.
-   */
+  /// Sends a `server.error` notification.
   void sendServerErrorNotification(
     String message,
     dynamic exception,
@@ -764,10 +428,8 @@
     ));
   }
 
-  /**
-   * Send status notification to the client. The state of analysis is given by
-   * the [status] information.
-   */
+  /// Send status notification to the client. The state of analysis is given by
+  /// the [status] information.
   void sendStatusNotificationNew(nd.AnalysisStatus status) {
     if (status.isAnalyzing) {
       _onAnalysisStartedController.add(true);
@@ -798,18 +460,16 @@
         new ServerStatusParams(analysis: analysis).toNotification());
   }
 
-  /**
-   * Implementation for `analysis.setAnalysisRoots`.
-   *
-   * TODO(scheglov) implement complete projects/contexts semantics.
-   *
-   * The current implementation is intentionally simplified and expected
-   * that only folders are given each given folder corresponds to the exactly
-   * one context.
-   *
-   * So, we can start working in parallel on adding services and improving
-   * projects/contexts support.
-   */
+  /// Implementation for `analysis.setAnalysisRoots`.
+  ///
+  /// TODO(scheglov) implement complete projects/contexts semantics.
+  ///
+  /// The current implementation is intentionally simplified and expected
+  /// that only folders are given each given folder corresponds to the exactly
+  /// one context.
+  ///
+  /// So, we can start working in parallel on adding services and improving
+  /// projects/contexts support.
   void setAnalysisRoots(String requestId, List<String> includedPaths,
       List<String> excludedPaths, Map<String, String> packageRoots) {
     if (notificationManager != null) {
@@ -823,9 +483,7 @@
     }
   }
 
-  /**
-   * Implementation for `analysis.setSubscriptions`.
-   */
+  /// Implementation for `analysis.setSubscriptions`.
   void setAnalysisSubscriptions(
       Map<AnalysisService, Set<String>> subscriptions) {
     if (notificationManager != null) {
@@ -839,14 +497,12 @@
       // the fully resolved unit, and processed with sending analysis
       // notifications as it happens after content changes.
       if (AnalysisEngine.isDartFileName(file)) {
-        getAnalysisResult(file, sendCachedToStream: true);
+        getResolvedUnit(file, sendCachedToStream: true);
       }
     }
   }
 
-  /**
-   * Implementation for `flutter.setSubscriptions`.
-   */
+  /// Implementation for `flutter.setSubscriptions`.
   void setFlutterSubscriptions(Map<FlutterService, Set<String>> subscriptions) {
     this.flutterServices = subscriptions;
     Set<String> allNewFiles =
@@ -856,14 +512,12 @@
       // the fully resolved unit, and processed with sending analysis
       // notifications as it happens after content changes.
       if (AnalysisEngine.isDartFileName(file)) {
-        getAnalysisResult(file, sendCachedToStream: true);
+        getResolvedUnit(file, sendCachedToStream: true);
       }
     }
   }
 
-  /**
-   * Implementation for `analysis.setGeneralSubscriptions`.
-   */
+  /// Implementation for `analysis.setGeneralSubscriptions`.
   void setGeneralAnalysisSubscriptions(
       List<GeneralAnalysisService> subscriptions) {
     Set<GeneralAnalysisService> newServices = subscriptions.toSet();
@@ -880,9 +534,7 @@
     generalAnalysisServices = newServices;
   }
 
-  /**
-   * Set the priority files to the given [files].
-   */
+  /// Set the priority files to the given [files].
   void setPriorityFiles(String requestId, List<String> files) {
     priorityFiles.clear();
     priorityFiles.addAll(files);
@@ -892,17 +544,13 @@
     });
   }
 
-  /**
-   * Returns `true` if errors should be reported for [file] with the given
-   * absolute path.
-   */
+  /// Returns `true` if errors should be reported for [file] with the given
+  /// absolute path.
   bool shouldSendErrorsNotificationFor(String file) {
     return contextManager.isInAnalysisRoot(file);
   }
 
   Future<void> shutdown() {
-    running = false;
-
     if (options.analytics != null) {
       options.analytics
           .waitForLastPing(timeout: new Duration(milliseconds: 200))
@@ -925,14 +573,19 @@
     return new Future.value();
   }
 
-  /**
-   * Implementation for `analysis.updateContent`.
-   */
+  /// Implementation for `analysis.updateContent`.
   void updateContent(String id, Map<String, dynamic> changes) {
     _onAnalysisSetChangedController.add(null);
     changes.forEach((file, change) {
+      // Prepare the old overlay contents.
+      String oldContents;
+      try {
+        if (resourceProvider.hasOverlay(file)) {
+          oldContents = resourceProvider.getFile(file).readAsStringSync();
+        }
+      } catch (_) {}
+
       // Prepare the new contents.
-      String oldContents = fileContentOverlay[file];
       String newContents;
       if (change is AddContentOverlay) {
         newContents = change.content;
@@ -958,7 +611,12 @@
         throw new AnalysisException('Illegal change type');
       }
 
-      fileContentOverlay[file] = newContents;
+      if (newContents != null) {
+        resourceProvider.setOverlay(file,
+            content: newContents, modificationStamp: 0);
+      } else {
+        resourceProvider.removeOverlay(file);
+      }
 
       driverMap.values.forEach((driver) {
         driver.changeFile(file);
@@ -972,10 +630,8 @@
     });
   }
 
-  /**
-   * Use the given updaters to update the values of the options in every
-   * existing analysis context.
-   */
+  /// Use the given updaters to update the values of the options in every
+  /// existing analysis context.
   void updateOptions(List<OptionUpdater> optionUpdaters) {
     // TODO(scheglov) implement for the new analysis driver
 //    //
@@ -999,36 +655,15 @@
 //    });
   }
 
-  /**
-   * If the state location can be accessed, return the file byte store,
-   * otherwise return the memory byte store.
-   */
-  ByteStore _createByteStore() {
-    const int M = 1024 * 1024 /*1 MiB*/;
-    const int G = 1024 * 1024 * 1024 /*1 GiB*/;
-
-    const int memoryCacheSize = 128 * M;
-
-    if (resourceProvider is PhysicalResourceProvider) {
-      Folder stateLocation =
-          resourceProvider.getStateLocation('.analysis-driver');
-      if (stateLocation != null) {
-        return new MemoryCachingByteStore(
-            new EvictingFileByteStore(stateLocation.path, G), memoryCacheSize);
-      }
-    }
-
-    return new MemoryCachingByteStore(new NullByteStore(), memoryCacheSize);
-  }
-
-  /**
-   * Return the path to the location of the byte store on disk, or `null` if
-   * there is no on-disk byte store.
-   */
+  /// Return the path to the location of the byte store on disk, or `null` if
+  /// there is no on-disk byte store.
   String _getByteStorePath() {
-    if (resourceProvider is PhysicalResourceProvider) {
-      Folder stateLocation =
-          resourceProvider.getStateLocation('.analysis-driver');
+    ResourceProvider provider = resourceProvider;
+    if (provider is OverlayResourceProvider) {
+      provider = (provider as OverlayResourceProvider).baseProvider;
+    }
+    if (provider is PhysicalResourceProvider) {
+      Folder stateLocation = provider.getStateLocation('.analysis-driver');
       if (stateLocation != null) {
         return stateLocation.path;
       }
@@ -1036,10 +671,8 @@
     return null;
   }
 
-  /**
-   * Returns `true` if there is a subscription for the given [service] and
-   * [file].
-   */
+  /// Returns `true` if there is a subscription for the given [service] and
+  /// [file].
   bool _hasAnalysisServiceSubscription(AnalysisService service, String file) {
     return analysisServices[service]?.contains(file) ?? false;
   }
@@ -1058,9 +691,7 @@
   }
 }
 
-/**
- * Various IDE options.
- */
+/// Various IDE options.
 class AnalysisServerOptions {
   bool useAnalysisHighlight2 = false;
 
@@ -1070,48 +701,37 @@
   String clientId;
   String clientVersion;
 
-  /**
-   * Base path where to cache data.
-   */
+  /// Base path where to cache data.
   String cacheFolder;
 
-  /**
-   * The analytics instance; note, this object can be `null`, and should be
-   * accessed via a null-aware operator.
-   */
+  /// The analytics instance; note, this object can be `null`, and should be
+  /// accessed via a null-aware operator.
   telemetry.Analytics analytics;
 
-  /**
-   * The crash report sender instance; note, this object can be `null`, and
-   * should be accessed via a null-aware operator.
-   */
+  /// The crash report sender instance; note, this object can be `null`, and
+  /// should be accessed via a null-aware operator.
   CrashReportSender crashReportSender;
 
-  /**
-   * Whether to enable parsing via the Fasta parser.
-   */
+  /// Whether to use the Language Server Protocol.
+  bool useLanguageServerProtocol = false;
+
+  /// Whether to enable parsing via the Fasta parser.
   bool useFastaParser = true;
 
-  /**
-   * User Experience, Experiment #1. This experiment changes the notion of
-   * what analysis roots are and priority files: the analysis root is set to be
-   * the priority files' containing directory.
-   */
+  /// User Experience, Experiment #1. This experiment changes the notion of
+  /// what analysis roots are and priority files: the analysis root is set to be
+  /// the priority files' containing directory.
   bool enableUXExperiment1 = false;
 
-  /**
-   * User Experience, Experiment #2. This experiment introduces the notion of an
-   * intermittent file system.
-   */
+  /// User Experience, Experiment #2. This experiment introduces the notion of
+  /// an intermittent file system.
   bool enableUXExperiment2 = false;
 }
 
 class ServerContextManagerCallbacks extends ContextManagerCallbacks {
   final AnalysisServer analysisServer;
 
-  /**
-   * The [ResourceProvider] by which paths are converted into [Resource]s.
-   */
+  /// The [ResourceProvider] by which paths are converted into [Resource]s.
   final ResourceProvider resourceProvider;
 
   ServerContextManagerCallbacks(this.analysisServer, this.resourceProvider);
@@ -1135,7 +755,7 @@
               NotificationManager.serverId,
               path,
               server.doAnalysisError_listFromEngine(
-                  result.driver.analysisOptions,
+                  result.session.analysisContext.analysisOptions,
                   result.lineInfo,
                   result.errors));
         } else {
@@ -1235,8 +855,8 @@
         if (analysisServer._hasFlutterServiceSubscription(
             FlutterService.OUTLINE, path)) {
           _runDelayed(() {
-            sendFlutterNotificationOutline(
-                analysisServer, path, result.content, result.lineInfo, unit);
+            sendFlutterNotificationOutline(analysisServer, path, result.content,
+                result.lineInfo, unit, result.typeProvider);
           });
         }
         // TODO(scheglov) Implement notifications for AnalysisService.IMPLEMENTED.
@@ -1306,15 +926,15 @@
     builderOptions.defaultOptions = options;
     builderOptions.defaultPackageFilePath = defaultPackageFilePath;
     builderOptions.defaultPackagesDirectoryPath = defaultPackagesDirectoryPath;
-    ContextBuilder builder = new ContextBuilder(resourceProvider,
-        analysisServer.sdkManager, analysisServer.overlayState,
+    ContextBuilder builder = new ContextBuilder(
+        resourceProvider, analysisServer.sdkManager, null,
         options: builderOptions);
     builder.fileResolverProvider = analysisServer.fileResolverProvider;
     builder.packageResolverProvider = analysisServer.packageResolverProvider;
     builder.analysisDriverScheduler = analysisServer.analysisDriverScheduler;
     builder.performanceLog = analysisServer._analysisPerformanceLogger;
     builder.byteStore = analysisServer.byteStore;
-    builder.fileContentOverlay = analysisServer.fileContentOverlay;
+    builder.enableIndex = true;
     return builder;
   }
 
@@ -1350,7 +970,7 @@
   server.AnalysisNavigationParams _computeNavigationParams(
       String path, CompilationUnit unit) {
     NavigationCollectorImpl collector = new NavigationCollectorImpl();
-    computeDartNavigation(collector, unit, null, null);
+    computeDartNavigation(resourceProvider, collector, unit, null, null);
     collector.createRegions();
     return new server.AnalysisNavigationParams(
         path, collector.regions, collector.targets, collector.files);
@@ -1385,29 +1005,25 @@
         libraryName: libraryName);
   }
 
-  /**
-   * Run [f] in a new [Future].
-   *
-   * This method is used to delay sending notifications. If there is a more
-   * important consumer of an analysis results, specifically a code completion
-   * computer, we want it to run before spending time of sending notifications.
-   *
-   * TODO(scheglov) Consider replacing this with full priority based scheduler.
-   *
-   * TODO(scheglov) Alternatively, if code completion work in a way that does
-   * not produce (at first) fully resolved unit, but only part of it - a single
-   * method, or a top-level declaration, we would not have this problem - the
-   * completion computer would be the only consumer of the partial analysis
-   * result.
-   */
+  /// Run [f] in a new [Future].
+  ///
+  /// This method is used to delay sending notifications. If there is a more
+  /// important consumer of an analysis results, specifically a code completion
+  /// computer, we want it to run before spending time of sending notifications.
+  ///
+  /// TODO(scheglov) Consider replacing this with full priority based scheduler.
+  ///
+  /// TODO(scheglov) Alternatively, if code completion work in a way that does
+  /// not produce (at first) fully resolved unit, but only part of it - a single
+  /// method, or a top-level declaration, we would not have this problem - the
+  /// completion computer would be the only consumer of the partial analysis
+  /// result.
   void _runDelayed(f()) {
     new Future(f);
   }
 }
 
-/**
- * Used to record server exceptions.
- */
+/// Used to record server exceptions.
 class ServerException {
   final String message;
   final dynamic exception;
@@ -1420,45 +1036,35 @@
   String toString() => message;
 }
 
-/**
- * A class used by [AnalysisServer] to record performance information
- * such as request latency.
- */
+/// A class used by [AnalysisServer] to record performance information
+/// such as request latency.
 class ServerPerformance {
-  /**
-   * The creation time and the time when performance information
-   * started to be recorded here.
-   */
+  /// The creation time and the time when performance information
+  /// started to be recorded here.
   final int startTime = new DateTime.now().millisecondsSinceEpoch;
 
-  /**
-   * The number of requests.
-   */
+  /// The number of requests.
   int requestCount = 0;
 
-  /**
-   * The total latency (milliseconds) for all recorded requests.
-   */
+  /// The number of requests that recorded latency information.
+  int latencyCount = 0;
+
+  /// The total latency (milliseconds) for all recorded requests.
   int requestLatency = 0;
 
-  /**
-   * The maximum latency (milliseconds) for all recorded requests.
-   */
+  /// The maximum latency (milliseconds) for all recorded requests.
   int maxLatency = 0;
 
-  /**
-   * The number of requests with latency > 150 milliseconds.
-   */
+  /// The number of requests with latency > 150 milliseconds.
   int slowRequestCount = 0;
 
-  /**
-   * Log performance information about the given request.
-   */
-  void logRequest(Request request) {
+  /// Log timing information for a request.
+  void logRequestTiming(int clientRequestTime) {
     ++requestCount;
-    if (request.clientRequestTime != null) {
+    if (clientRequestTime != null) {
       int latency =
-          new DateTime.now().millisecondsSinceEpoch - request.clientRequestTime;
+          new DateTime.now().millisecondsSinceEpoch - clientRequestTime;
+      ++latencyCount;
       requestLatency += latency;
       maxLatency = max(maxLatency, latency);
       if (latency > 150) {
@@ -1468,34 +1074,22 @@
   }
 }
 
-/**
- * Container with global [AnalysisServer] performance statistics.
- */
+/// Container with global [AnalysisServer] performance statistics.
 class ServerPerformanceStatistics {
-  /**
-   * The [PerformanceTag] for `package:analysis_server`.
-   */
+  /// The [PerformanceTag] for `package:analysis_server`.
   static final PerformanceTag server = new PerformanceTag('server');
 
-  /**
-   * The [PerformanceTag] for time spent between calls to
-   * AnalysisServer.performOperation when the server is idle.
-   */
+  /// The [PerformanceTag] for time spent between calls to
+  /// AnalysisServer.performOperation when the server is idle.
   static final PerformanceTag idle = new PerformanceTag('idle');
 
-  /**
-   * The [PerformanceTag] for time spent in
-   * PerformAnalysisOperation._sendNotices.
-   */
+  /// The [PerformanceTag] for time spent in
+  /// PerformAnalysisOperation._sendNotices.
   static final PerformanceTag notices = server.createChild('notices');
 
-  /**
-   * The [PerformanceTag] for time spent in server communication channels.
-   */
+  /// The [PerformanceTag] for time spent in server communication channels.
   static final PerformanceTag serverChannel = server.createChild('channel');
 
-  /**
-   * The [PerformanceTag] for time spent in server request handlers.
-   */
+  /// The [PerformanceTag] for time spent in server request handlers.
   static final PerformanceTag serverRequests = server.createChild('requests');
 }
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
new file mode 100644
index 0000000..f784b71
--- /dev/null
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -0,0 +1,242 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:core';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/collections.dart';
+import 'package:analysis_server/src/context_manager.dart';
+import 'package:analysis_server/src/services/correction/namespace.dart';
+import 'package:analysis_server/src/services/search/element_visitors.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/overlay_file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
+import 'package:analyzer/src/dart/analysis/file_byte_store.dart'
+    show EvictingFileByteStore;
+import 'package:analyzer/src/dart/analysis/file_state.dart' as nd;
+import 'package:analyzer/src/dart/analysis/status.dart' as nd;
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/util/glob.dart';
+
+/// Implementations of [AbstractAnalysisServer] implement a server that listens
+/// on a [CommunicationChannel] for analysis messages and process them.
+abstract class AbstractAnalysisServer {
+  /// The options of this server instance.
+  AnalysisServerOptions options;
+
+  /// The [ContextManager] that handles the mapping from analysis roots to
+  /// context directories.
+  ContextManager contextManager;
+
+  /// A [RecentBuffer] of the most recent exceptions encountered by the analysis
+  /// server.
+  final RecentBuffer<ServerException> exceptions = new RecentBuffer(10);
+
+  /// Performance information after initial analysis is complete
+  /// or `null` if the initial analysis is not yet complete
+  ServerPerformance performanceAfterStartup;
+
+  /// The class into which performance information is currently being recorded.
+  /// During startup, this will be the same as [performanceDuringStartup]
+  /// and after startup is complete, this switches to [performanceAfterStartup].
+  ServerPerformance performance;
+
+  /// Performance information before initial analysis is complete.
+  final ServerPerformance performanceDuringStartup = new ServerPerformance();
+
+  /// The set of the files that are currently priority.
+  final Set<String> priorityFiles = new Set<String>();
+
+  final List<String> analyzableFilePatterns = <String>[
+    '**/*.${AnalysisEngine.SUFFIX_DART}',
+    '**/*.${AnalysisEngine.SUFFIX_HTML}',
+    '**/*.${AnalysisEngine.SUFFIX_HTM}',
+    '**/${AnalysisEngine.ANALYSIS_OPTIONS_FILE}',
+    '**/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}',
+    '**/${AnalysisEngine.PUBSPEC_YAML_FILE}'
+  ];
+
+  /// The [ResourceProvider] using which paths are converted into [Resource]s.
+  final OverlayResourceProvider resourceProvider;
+
+  /// A list of the globs used to determine which files should be analyzed. The
+  /// list is lazily created and should be accessed using [analyzedFilesGlobs].
+  List<Glob> _analyzedFilesGlobs = null;
+
+  AbstractAnalysisServer(this.options, ResourceProvider baseResourceProvider)
+      : resourceProvider = OverlayResourceProvider(baseResourceProvider) {
+    performance = performanceDuringStartup;
+  }
+
+  /// Return a list of the globs used to determine which files should be
+  /// analyzed.
+  List<Glob> get analyzedFilesGlobs {
+    if (_analyzedFilesGlobs == null) {
+      _analyzedFilesGlobs = <Glob>[];
+      for (String pattern in analyzableFilePatterns) {
+        try {
+          _analyzedFilesGlobs
+              .add(new Glob(resourceProvider.pathContext.separator, pattern));
+        } catch (exception, stackTrace) {
+          AnalysisEngine.instance.logger.logError(
+              'Invalid glob pattern: "$pattern"',
+              new CaughtException(exception, stackTrace));
+        }
+      }
+    }
+    return _analyzedFilesGlobs;
+  }
+
+  /// The list of current analysis sessions in all contexts.
+  List<AnalysisSession> get currentSessions {
+    return driverMap.values.map((driver) => driver.currentSession).toList();
+  }
+
+  /// A table mapping [Folder]s to the [AnalysisDriver]s associated with them.
+  Map<Folder, nd.AnalysisDriver> get driverMap => contextManager.driverMap;
+
+  /// Return the total time the server's been alive.
+  Duration get uptime {
+    DateTime start = new DateTime.fromMillisecondsSinceEpoch(
+        performanceDuringStartup.startTime);
+    return new DateTime.now().difference(start);
+  }
+
+  /// If the state location can be accessed, return the file byte store,
+  /// otherwise return the memory byte store.
+  ByteStore createByteStore(ResourceProvider resourceProvider) {
+    const int M = 1024 * 1024 /*1 MiB*/;
+    const int G = 1024 * 1024 * 1024 /*1 GiB*/;
+
+    const int memoryCacheSize = 128 * M;
+
+    if (resourceProvider is OverlayResourceProvider) {
+      OverlayResourceProvider overlay = resourceProvider;
+      resourceProvider = overlay.baseProvider;
+    }
+    if (resourceProvider is PhysicalResourceProvider) {
+      Folder stateLocation =
+          resourceProvider.getStateLocation('.analysis-driver');
+      if (stateLocation != null) {
+        return new MemoryCachingByteStore(
+            new EvictingFileByteStore(stateLocation.path, G), memoryCacheSize);
+      }
+    }
+
+    return new MemoryCachingByteStore(new NullByteStore(), memoryCacheSize);
+  }
+
+  /// Return an analysis driver to which the file with the given [path] is
+  /// added if one exists, otherwise a driver in which the file was analyzed if
+  /// one exists, otherwise the first driver, otherwise `null`.
+  nd.AnalysisDriver getAnalysisDriver(String path) {
+    List<nd.AnalysisDriver> drivers = driverMap.values.toList();
+    if (drivers.isNotEmpty) {
+      // Sort the drivers so that more deeply nested contexts will be checked
+      // before enclosing contexts.
+      drivers.sort((first, second) =>
+          second.contextRoot.root.length - first.contextRoot.root.length);
+      nd.AnalysisDriver driver = drivers.firstWhere(
+          (driver) => driver.contextRoot.containsFile(path),
+          orElse: () => null);
+      driver ??= drivers.firstWhere(
+          (driver) => driver.knownFiles.contains(path),
+          orElse: () => null);
+      driver ??= drivers.first;
+      return driver;
+    }
+    return null;
+  }
+
+  /// Return a [Future] that completes with the [Element] at the given
+  /// [offset] of the given [file], or with `null` if there is no node at the
+  /// [offset] or the node does not have an element.
+  Future<Element> getElementAtOffset(String file, int offset) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    if (!priorityFiles.contains(file)) {
+      var driver = getAnalysisDriver(file);
+      if (driver == null) {
+        return null;
+      }
+
+      var unitElementResult = await driver.getUnitElement(file);
+      if (unitElementResult == null) {
+        return null;
+      }
+
+      var element = findElementByNameOffset(unitElementResult.element, offset);
+      if (element != null) {
+        return element;
+      }
+    }
+
+    AstNode node = await getNodeAtOffset(file, offset);
+    return getElementOfNode(node);
+  }
+
+  /// Return the [Element] of the given [node], or `null` if [node] is `null` or
+  /// does not have an element.
+  Element getElementOfNode(AstNode node) {
+    if (node == null) {
+      return null;
+    }
+    if (node is SimpleIdentifier && node.parent is LibraryIdentifier) {
+      node = node.parent;
+    }
+    if (node is LibraryIdentifier) {
+      node = node.parent;
+    }
+    if (node is StringLiteral && node.parent is UriBasedDirective) {
+      return null;
+    }
+    Element element = ElementLocator.locate(node);
+    if (node is SimpleIdentifier && element is PrefixElement) {
+      element = getImportElement(node);
+    }
+    return element;
+  }
+
+  /// Return a [Future] that completes with the resolved [AstNode] at the
+  /// given [offset] of the given [file], or with `null` if there is no node as
+  /// the [offset].
+  Future<AstNode> getNodeAtOffset(String file, int offset) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    ResolvedUnitResult result = await getResolvedUnit(file);
+    CompilationUnit unit = result?.unit;
+    if (unit != null) {
+      return new NodeLocator(offset).searchWithin(unit);
+    }
+    return null;
+  }
+
+  /// Return the resolved unit for the file with the given [path]. The file is
+  /// analyzed in one of the analysis drivers to which the file was added,
+  /// otherwise in the first driver, otherwise `null` is returned.
+  Future<ResolvedUnitResult> getResolvedUnit(String path,
+      {bool sendCachedToStream: false}) {
+    if (!AnalysisEngine.isDartFileName(path)) {
+      return null;
+    }
+
+    nd.AnalysisDriver driver = getAnalysisDriver(path);
+    if (driver == null) {
+      return new Future.value();
+    }
+
+    return driver
+        .getResult(path, sendCachedToStream: sendCachedToStream)
+        .catchError((_) => null);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
index 8bdb5d5..7fa2439 100644
--- a/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
+++ b/pkg/analysis_server/lib/src/channel/byte_stream_channel.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/channel/channel.dart b/pkg/analysis_server/lib/src/channel/channel.dart
index 0f580f1..152c820 100644
--- a/pkg/analysis_server/lib/src/channel/channel.dart
+++ b/pkg/analysis_server/lib/src/channel/channel.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/collections.dart b/pkg/analysis_server/lib/src/collections.dart
index afde613..a20dd6b 100644
--- a/pkg/analysis_server/lib/src/collections.dart
+++ b/pkg/analysis_server/lib/src/collections.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart b/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
index d1fe2d4..19ff554 100644
--- a/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_closingLabels.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -45,8 +45,7 @@
 /**
  * An AST visitor for [DartUnitClosingLabelsComputer].
  */
-class _DartUnitClosingLabelsComputerVisitor
-    extends RecursiveAstVisitor<Object> {
+class _DartUnitClosingLabelsComputerVisitor extends RecursiveAstVisitor<void> {
   final DartUnitClosingLabelsComputer computer;
 
   int interpolatedStringsEntered = 0;
@@ -57,7 +56,7 @@
   ClosingLabel get _currentLabel => labelStack.isEmpty ? null : labelStack.last;
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ClosingLabel label;
 
     if (node.argumentList != null) {
@@ -75,14 +74,14 @@
     if (label != null) _pushLabel(label);
 
     try {
-      return super.visitInstanceCreationExpression(node);
+      super.visitInstanceCreationExpression(node);
     } finally {
       if (label != null) _popLabel();
     }
   }
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     final NodeList<TypeAnnotation> args = node.typeArguments?.arguments;
     final String typeName = args != null ? args[0]?.toString() : null;
 
@@ -95,17 +94,17 @@
     if (label != null) _pushLabel(label);
 
     try {
-      return super.visitListLiteral(node);
+      super.visitListLiteral(node);
     } finally {
       if (label != null) _popLabel();
     }
   }
 
   @override
-  Object visitStringInterpolation(StringInterpolation node) {
+  void visitStringInterpolation(StringInterpolation node) {
     interpolatedStringsEntered++;
     try {
-      return super.visitStringInterpolation(node);
+      super.visitStringInterpolation(node);
     } finally {
       interpolatedStringsEntered--;
     }
diff --git a/pkg/analysis_server/lib/src/computer/computer_folding.dart b/pkg/analysis_server/lib/src/computer/computer_folding.dart
index 9488775..4edf2fc 100644
--- a/pkg/analysis_server/lib/src/computer/computer_folding.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_folding.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -105,129 +105,129 @@
 /**
  * An AST visitor for [DartUnitFoldingComputer].
  */
-class _DartUnitFoldingComputerVisitor extends RecursiveAstVisitor<Object> {
+class _DartUnitFoldingComputerVisitor extends RecursiveAstVisitor<void> {
   final DartUnitFoldingComputer _computer;
   _DartUnitFoldingComputerVisitor(this._computer);
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     _computer._addRegion(node.block.leftBracket.end,
         node.block.rightBracket.offset, FoldingKind.FUNCTION_BODY);
-    return super.visitBlockFunctionBody(node);
+    super.visitBlockFunctionBody(node);
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     _computer._addRegionForAnnotations(node.metadata);
     _computer._addRegion(
         node.leftBracket.end, node.rightBracket.offset, FoldingKind.CLASS_BODY);
-    return super.visitClassDeclaration(node);
+    super.visitClassDeclaration(node);
   }
 
   @override
-  Object visitComment(Comment node) {
+  void visitComment(Comment node) {
     if (node.isDocumentation) {
       _computer._addRegion(
           node.offset, node.end, FoldingKind.DOCUMENTATION_COMMENT);
     }
-    return super.visitComment(node);
+    super.visitComment(node);
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     _computer._addRegionForAnnotations(node.metadata);
-    return super.visitConstructorDeclaration(node);
+    super.visitConstructorDeclaration(node);
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     _computer._recordDirective(node);
-    return super.visitExportDirective(node);
+    super.visitExportDirective(node);
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     _computer._addRegionForAnnotations(node.metadata);
-    return super.visitFieldDeclaration(node);
+    super.visitFieldDeclaration(node);
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     _computer._addRegionForAnnotations(node.metadata);
-    return super.visitFunctionDeclaration(node);
+    super.visitFunctionDeclaration(node);
   }
 
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     _computer._addRegion(node.argumentList.leftParenthesis.end,
         node.argumentList.rightParenthesis.offset, FoldingKind.INVOCATION);
-    return super.visitFunctionExpressionInvocation(node);
+    super.visitFunctionExpressionInvocation(node);
   }
 
   @override
-  visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     _computer._recordDirective(node);
-    return super.visitImportDirective(node);
+    super.visitImportDirective(node);
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     _computer._addRegion(node.argumentList.leftParenthesis.end,
         node.argumentList.rightParenthesis.offset, FoldingKind.INVOCATION);
-    return super.visitInstanceCreationExpression(node);
+    super.visitInstanceCreationExpression(node);
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     _computer._recordDirective(node);
-    return super.visitLibraryDirective(node);
+    super.visitLibraryDirective(node);
   }
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     _computer._addRegion(
         node.leftBracket.end, node.rightBracket.offset, FoldingKind.LITERAL);
-    return super.visitListLiteral(node);
+    super.visitListLiteral(node);
   }
 
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     _computer._addRegion(
         node.leftBracket.end, node.rightBracket.offset, FoldingKind.LITERAL);
-    return super.visitMapLiteral(node);
+    super.visitMapLiteral(node);
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     _computer._addRegionForAnnotations(node.metadata);
-    return super.visitMethodDeclaration(node);
+    super.visitMethodDeclaration(node);
   }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
+  void visitMethodInvocation(MethodInvocation node) {
     _computer._addRegion(node.argumentList.leftParenthesis.end,
         node.argumentList.rightParenthesis.offset, FoldingKind.INVOCATION);
-    return super.visitMethodInvocation(node);
+    super.visitMethodInvocation(node);
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     _computer._addRegionForAnnotations(node.metadata);
     // TODO(brianwilkerson) Define `FoldingKind.MIXIN_BODY`?
     _computer._addRegion(
         node.leftBracket.end, node.rightBracket.offset, FoldingKind.CLASS_BODY);
-    return super.visitMixinDeclaration(node);
+    super.visitMixinDeclaration(node);
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     _computer._recordDirective(node);
-    return super.visitPartDirective(node);
+    super.visitPartDirective(node);
   }
 
   @override
-  Object visitPartOfDirective(PartOfDirective node) {
+  void visitPartOfDirective(PartOfDirective node) {
     _computer._recordDirective(node);
-    return super.visitPartOfDirective(node);
+    super.visitPartOfDirective(node);
   }
 }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index b0b5d40..39c1e8e 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -344,251 +344,251 @@
 /**
  * An AST visitor for [DartUnitHighlightsComputer].
  */
-class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<Object> {
+class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
   final DartUnitHighlightsComputer computer;
 
   _DartUnitHighlightsComputerVisitor(this.computer);
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     computer._addIdentifierRegion_annotation(node);
-    return super.visitAnnotation(node);
+    super.visitAnnotation(node);
   }
 
   @override
-  Object visitAsExpression(AsExpression node) {
+  void visitAsExpression(AsExpression node) {
     computer._addRegion_token(node.asOperator, HighlightRegionType.BUILT_IN);
-    return super.visitAsExpression(node);
+    super.visitAsExpression(node);
   }
 
   @override
-  Object visitAssertStatement(AssertStatement node) {
+  void visitAssertStatement(AssertStatement node) {
     computer._addRegion_token(node.assertKeyword, HighlightRegionType.KEYWORD);
-    return super.visitAssertStatement(node);
+    super.visitAssertStatement(node);
   }
 
   @override
-  Object visitAwaitExpression(AwaitExpression node) {
+  void visitAwaitExpression(AwaitExpression node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitAwaitExpression(node);
+    super.visitAwaitExpression(node);
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     _addRegions_functionBody(node);
-    return super.visitBlockFunctionBody(node);
+    super.visitBlockFunctionBody(node);
   }
 
   @override
-  Object visitBooleanLiteral(BooleanLiteral node) {
+  void visitBooleanLiteral(BooleanLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.KEYWORD);
     computer._addRegion_node(node, HighlightRegionType.LITERAL_BOOLEAN);
-    return super.visitBooleanLiteral(node);
+    super.visitBooleanLiteral(node);
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     computer._addRegion_token(node.breakKeyword, HighlightRegionType.KEYWORD);
-    return super.visitBreakStatement(node);
+    super.visitBreakStatement(node);
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     computer._addRegion_token(node.catchKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitCatchClause(node);
+    super.visitCatchClause(node);
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     computer._addRegion_token(node.classKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(
         node.abstractKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitClassDeclaration(node);
+    super.visitClassDeclaration(node);
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     computer._addRegion_token(
         node.abstractKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitClassTypeAlias(node);
+    super.visitClassTypeAlias(node);
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     computer._addRegion_token(
         node.externalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
         node.factoryKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitConstructorDeclaration(node);
+    super.visitConstructorDeclaration(node);
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     computer._addRegion_token(
         node.continueKeyword, HighlightRegionType.KEYWORD);
-    return super.visitContinueStatement(node);
+    super.visitContinueStatement(node);
   }
 
   @override
-  Object visitDoStatement(DoStatement node) {
+  void visitDoStatement(DoStatement node) {
     computer._addRegion_token(node.doKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.whileKeyword, HighlightRegionType.KEYWORD);
-    return super.visitDoStatement(node);
+    super.visitDoStatement(node);
   }
 
   @override
-  Object visitDoubleLiteral(DoubleLiteral node) {
+  void visitDoubleLiteral(DoubleLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_DOUBLE);
-    return super.visitDoubleLiteral(node);
+    super.visitDoubleLiteral(node);
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     computer._addRegion_token(node.enumKeyword, HighlightRegionType.KEYWORD);
-    return super.visitEnumDeclaration(node);
+    super.visitEnumDeclaration(node);
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitExportDirective(node);
+    super.visitExportDirective(node);
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _addRegions_functionBody(node);
-    return super.visitExpressionFunctionBody(node);
+    super.visitExpressionFunctionBody(node);
   }
 
   @override
-  Object visitExtendsClause(ExtendsClause node) {
+  void visitExtendsClause(ExtendsClause node) {
     computer._addRegion_token(node.extendsKeyword, HighlightRegionType.KEYWORD);
-    return super.visitExtendsClause(node);
+    super.visitExtendsClause(node);
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitFieldDeclaration(node);
+    super.visitFieldDeclaration(node);
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
+  void visitForEachStatement(ForEachStatement node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.inKeyword, HighlightRegionType.KEYWORD);
-    return super.visitForEachStatement(node);
+    super.visitForEachStatement(node);
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    return super.visitForStatement(node);
+    super.visitForStatement(node);
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     computer._addRegion_token(
         node.externalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
         node.propertyKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitFunctionDeclaration(node);
+    super.visitFunctionDeclaration(node);
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     computer._addRegion_token(
         node.typedefKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitFunctionTypeAlias(node);
+    super.visitFunctionTypeAlias(node);
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) {
+  void visitGenericFunctionType(GenericFunctionType node) {
     computer._addRegion_token(
         node.functionKeyword, HighlightRegionType.KEYWORD);
-    return super.visitGenericFunctionType(node);
+    super.visitGenericFunctionType(node);
   }
 
   @override
-  Object visitGenericTypeAlias(GenericTypeAlias node) {
+  void visitGenericTypeAlias(GenericTypeAlias node) {
     computer._addRegion_token(node.typedefKeyword, HighlightRegionType.KEYWORD);
-    return super.visitGenericTypeAlias(node);
+    super.visitGenericTypeAlias(node);
   }
 
   @override
-  Object visitHideCombinator(HideCombinator node) {
+  void visitHideCombinator(HideCombinator node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitHideCombinator(node);
+    super.visitHideCombinator(node);
   }
 
   @override
-  Object visitIfStatement(IfStatement node) {
+  void visitIfStatement(IfStatement node) {
     computer._addRegion_token(node.ifKeyword, HighlightRegionType.KEYWORD);
-    return super.visitIfStatement(node);
+    super.visitIfStatement(node);
   }
 
   @override
-  Object visitImplementsClause(ImplementsClause node) {
+  void visitImplementsClause(ImplementsClause node) {
     computer._addRegion_token(
         node.implementsKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitImplementsClause(node);
+    super.visitImplementsClause(node);
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
         node.deferredKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.asKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitImportDirective(node);
+    super.visitImportDirective(node);
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.keyword != null) {
       computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     }
-    return super.visitInstanceCreationExpression(node);
+    super.visitInstanceCreationExpression(node);
   }
 
   @override
-  Object visitIntegerLiteral(IntegerLiteral node) {
+  void visitIntegerLiteral(IntegerLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_INTEGER);
-    return super.visitIntegerLiteral(node);
+    super.visitIntegerLiteral(node);
   }
 
   @override
-  Object visitIsExpression(IsExpression node) {
+  void visitIsExpression(IsExpression node) {
     computer._addRegion_token(node.isOperator, HighlightRegionType.KEYWORD);
-    return super.visitIsExpression(node);
+    super.visitIsExpression(node);
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitLibraryDirective(node);
+    super.visitLibraryDirective(node);
   }
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_LIST);
     computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    return super.visitListLiteral(node);
+    super.visitListLiteral(node);
   }
 
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
     computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    return super.visitMapLiteral(node);
+    super.visitMapLiteral(node);
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     computer._addRegion_token(
         node.externalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
@@ -597,117 +597,117 @@
         node.operatorKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
         node.propertyKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitMethodDeclaration(node);
+    super.visitMethodDeclaration(node);
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     computer._addRegion_token(node.mixinKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitMixinDeclaration(node);
+    super.visitMixinDeclaration(node);
   }
 
   @override
-  Object visitNativeClause(NativeClause node) {
+  void visitNativeClause(NativeClause node) {
     computer._addRegion_token(node.nativeKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitNativeClause(node);
+    super.visitNativeClause(node);
   }
 
   @override
-  Object visitNativeFunctionBody(NativeFunctionBody node) {
+  void visitNativeFunctionBody(NativeFunctionBody node) {
     computer._addRegion_token(node.nativeKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitNativeFunctionBody(node);
+    super.visitNativeFunctionBody(node);
   }
 
   @override
-  Object visitOnClause(OnClause node) {
+  void visitOnClause(OnClause node) {
     computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitOnClause(node);
+    super.visitOnClause(node);
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitPartDirective(node);
+    super.visitPartDirective(node);
   }
 
   @override
-  Object visitPartOfDirective(PartOfDirective node) {
+  void visitPartOfDirective(PartOfDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_tokenStart_tokenEnd(
         node.partKeyword, node.ofKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitPartOfDirective(node);
+    super.visitPartOfDirective(node);
   }
 
   @override
-  Object visitRethrowExpression(RethrowExpression node) {
+  void visitRethrowExpression(RethrowExpression node) {
     computer._addRegion_token(node.rethrowKeyword, HighlightRegionType.KEYWORD);
-    return super.visitRethrowExpression(node);
+    super.visitRethrowExpression(node);
   }
 
   @override
-  Object visitReturnStatement(ReturnStatement node) {
+  void visitReturnStatement(ReturnStatement node) {
     computer._addRegion_token(node.returnKeyword, HighlightRegionType.KEYWORD);
-    return super.visitReturnStatement(node);
+    super.visitReturnStatement(node);
   }
 
   @override
-  Object visitShowCombinator(ShowCombinator node) {
+  void visitShowCombinator(ShowCombinator node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitShowCombinator(node);
+    super.visitShowCombinator(node);
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     computer._addIdentifierRegion(node);
-    return super.visitSimpleIdentifier(node);
+    super.visitSimpleIdentifier(node);
   }
 
   @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+  void visitSimpleStringLiteral(SimpleStringLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_STRING);
-    return super.visitSimpleStringLiteral(node);
+    super.visitSimpleStringLiteral(node);
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     computer._addRegion_token(node.superKeyword, HighlightRegionType.KEYWORD);
-    return super.visitSuperConstructorInvocation(node);
+    super.visitSuperConstructorInvocation(node);
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    return super.visitSwitchCase(node);
+    super.visitSwitchCase(node);
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    return super.visitSwitchDefault(node);
+    super.visitSwitchDefault(node);
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSwitchStatement(SwitchStatement node) {
     computer._addRegion_token(node.switchKeyword, HighlightRegionType.KEYWORD);
-    return super.visitSwitchStatement(node);
+    super.visitSwitchStatement(node);
   }
 
   @override
-  Object visitThisExpression(ThisExpression node) {
+  void visitThisExpression(ThisExpression node) {
     computer._addRegion_token(node.thisKeyword, HighlightRegionType.KEYWORD);
-    return super.visitThisExpression(node);
+    super.visitThisExpression(node);
   }
 
   @override
-  Object visitTryStatement(TryStatement node) {
+  void visitTryStatement(TryStatement node) {
     computer._addRegion_token(node.tryKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.finallyKeyword, HighlightRegionType.KEYWORD);
-    return super.visitTryStatement(node);
+    super.visitTryStatement(node);
   }
 
   @override
-  Object visitTypeName(TypeName node) {
+  void visitTypeName(TypeName node) {
     DartType type = node.type;
     if (type != null) {
       if (type.isDynamic && node.name.name == "dynamic") {
@@ -715,35 +715,35 @@
         return null;
       }
     }
-    return super.visitTypeName(node);
+    super.visitTypeName(node);
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    return super.visitVariableDeclarationList(node);
+    super.visitVariableDeclarationList(node);
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     computer._addRegion_token(node.whileKeyword, HighlightRegionType.KEYWORD);
-    return super.visitWhileStatement(node);
+    super.visitWhileStatement(node);
   }
 
   @override
-  Object visitWithClause(WithClause node) {
+  void visitWithClause(WithClause node) {
     computer._addRegion_token(node.withKeyword, HighlightRegionType.KEYWORD);
-    return super.visitWithClause(node);
+    super.visitWithClause(node);
   }
 
   @override
-  Object visitYieldStatement(YieldStatement node) {
+  void visitYieldStatement(YieldStatement node) {
     Token keyword = node.yieldKeyword;
     Token star = node.star;
     int offset = keyword.offset;
     int end = star != null ? star.end : keyword.end;
     computer._addRegion(offset, end - offset, HighlightRegionType.BUILT_IN);
-    return super.visitYieldStatement(node);
+    super.visitYieldStatement(node);
   }
 
   void _addRegions_functionBody(FunctionBody node) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index dad226c..6ae85e2 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -435,257 +435,257 @@
 /**
  * An AST visitor for [DartUnitHighlightsComputer2].
  */
-class _DartUnitHighlightsComputerVisitor2 extends RecursiveAstVisitor<Object> {
+class _DartUnitHighlightsComputerVisitor2 extends RecursiveAstVisitor<void> {
   final DartUnitHighlightsComputer2 computer;
 
   _DartUnitHighlightsComputerVisitor2(this.computer);
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     computer._addIdentifierRegion_annotation(node);
-    return super.visitAnnotation(node);
+    super.visitAnnotation(node);
   }
 
   @override
-  Object visitAsExpression(AsExpression node) {
+  void visitAsExpression(AsExpression node) {
     computer._addRegion_token(node.asOperator, HighlightRegionType.BUILT_IN);
-    return super.visitAsExpression(node);
+    super.visitAsExpression(node);
   }
 
   @override
-  Object visitAssertStatement(AssertStatement node) {
+  void visitAssertStatement(AssertStatement node) {
     computer._addRegion_token(node.assertKeyword, HighlightRegionType.KEYWORD);
-    return super.visitAssertStatement(node);
+    super.visitAssertStatement(node);
   }
 
   @override
-  Object visitAwaitExpression(AwaitExpression node) {
+  void visitAwaitExpression(AwaitExpression node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitAwaitExpression(node);
+    super.visitAwaitExpression(node);
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     _addRegions_functionBody(node);
-    return super.visitBlockFunctionBody(node);
+    super.visitBlockFunctionBody(node);
   }
 
   @override
-  Object visitBooleanLiteral(BooleanLiteral node) {
+  void visitBooleanLiteral(BooleanLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.KEYWORD);
     computer._addRegion_node(node, HighlightRegionType.LITERAL_BOOLEAN);
-    return super.visitBooleanLiteral(node);
+    super.visitBooleanLiteral(node);
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     computer._addRegion_token(node.breakKeyword, HighlightRegionType.KEYWORD);
-    return super.visitBreakStatement(node);
+    super.visitBreakStatement(node);
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     computer._addRegion_token(node.catchKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitCatchClause(node);
+    super.visitCatchClause(node);
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     computer._addRegion_token(node.classKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(
         node.abstractKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitClassDeclaration(node);
+    super.visitClassDeclaration(node);
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     computer._addRegion_token(
         node.abstractKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitClassTypeAlias(node);
+    super.visitClassTypeAlias(node);
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     computer._addRegion_token(
         node.externalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
         node.factoryKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitConstructorDeclaration(node);
+    super.visitConstructorDeclaration(node);
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     computer._addRegion_token(
         node.continueKeyword, HighlightRegionType.KEYWORD);
-    return super.visitContinueStatement(node);
+    super.visitContinueStatement(node);
   }
 
   @override
-  Object visitDoStatement(DoStatement node) {
+  void visitDoStatement(DoStatement node) {
     computer._addRegion_token(node.doKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.whileKeyword, HighlightRegionType.KEYWORD);
-    return super.visitDoStatement(node);
+    super.visitDoStatement(node);
   }
 
   @override
-  Object visitDoubleLiteral(DoubleLiteral node) {
+  void visitDoubleLiteral(DoubleLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_DOUBLE);
-    return super.visitDoubleLiteral(node);
+    super.visitDoubleLiteral(node);
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     computer._addRegion_token(node.enumKeyword, HighlightRegionType.KEYWORD);
-    return super.visitEnumDeclaration(node);
+    super.visitEnumDeclaration(node);
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitExportDirective(node);
+    super.visitExportDirective(node);
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _addRegions_functionBody(node);
-    return super.visitExpressionFunctionBody(node);
+    super.visitExpressionFunctionBody(node);
   }
 
   @override
-  Object visitExtendsClause(ExtendsClause node) {
+  void visitExtendsClause(ExtendsClause node) {
     computer._addRegion_token(node.extendsKeyword, HighlightRegionType.KEYWORD);
-    return super.visitExtendsClause(node);
+    super.visitExtendsClause(node);
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitFieldDeclaration(node);
+    super.visitFieldDeclaration(node);
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
+  void visitForEachStatement(ForEachStatement node) {
     computer._addRegion_token(node.awaitKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.inKeyword, HighlightRegionType.KEYWORD);
-    return super.visitForEachStatement(node);
+    super.visitForEachStatement(node);
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     computer._addRegion_token(node.forKeyword, HighlightRegionType.KEYWORD);
-    return super.visitForStatement(node);
+    super.visitForStatement(node);
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     computer._addRegion_token(
         node.externalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
         node.propertyKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitFunctionDeclaration(node);
+    super.visitFunctionDeclaration(node);
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     computer._addRegion_token(
         node.typedefKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitFunctionTypeAlias(node);
+    super.visitFunctionTypeAlias(node);
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) {
+  void visitGenericFunctionType(GenericFunctionType node) {
     computer._addRegion_token(
         node.functionKeyword, HighlightRegionType.KEYWORD);
-    return super.visitGenericFunctionType(node);
+    super.visitGenericFunctionType(node);
   }
 
   @override
-  Object visitGenericTypeAlias(GenericTypeAlias node) {
+  void visitGenericTypeAlias(GenericTypeAlias node) {
     computer._addRegion_token(node.typedefKeyword, HighlightRegionType.KEYWORD);
-    return super.visitGenericTypeAlias(node);
+    super.visitGenericTypeAlias(node);
   }
 
   @override
-  Object visitHideCombinator(HideCombinator node) {
+  void visitHideCombinator(HideCombinator node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitHideCombinator(node);
+    super.visitHideCombinator(node);
   }
 
   @override
-  Object visitIfStatement(IfStatement node) {
+  void visitIfStatement(IfStatement node) {
     computer._addRegion_token(node.ifKeyword, HighlightRegionType.KEYWORD);
-    return super.visitIfStatement(node);
+    super.visitIfStatement(node);
   }
 
   @override
-  Object visitImplementsClause(ImplementsClause node) {
+  void visitImplementsClause(ImplementsClause node) {
     computer._addRegion_token(
         node.implementsKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitImplementsClause(node);
+    super.visitImplementsClause(node);
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
         node.deferredKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(node.asKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitImportDirective(node);
+    super.visitImportDirective(node);
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.keyword != null) {
       computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
     }
-    return super.visitInstanceCreationExpression(node);
+    super.visitInstanceCreationExpression(node);
   }
 
   @override
-  Object visitIntegerLiteral(IntegerLiteral node) {
+  void visitIntegerLiteral(IntegerLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_INTEGER);
-    return super.visitIntegerLiteral(node);
+    super.visitIntegerLiteral(node);
   }
 
   @override
-  Object visitIsExpression(IsExpression node) {
+  void visitIsExpression(IsExpression node) {
     computer._addRegion_token(node.isOperator, HighlightRegionType.KEYWORD);
-    return super.visitIsExpression(node);
+    super.visitIsExpression(node);
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitLibraryDirective(node);
+    super.visitLibraryDirective(node);
   }
 
   @override
-  Object visitLibraryIdentifier(LibraryIdentifier node) {
+  void visitLibraryIdentifier(LibraryIdentifier node) {
     computer._addRegion_node(node, HighlightRegionType.LIBRARY_NAME);
-    return null;
+    null;
   }
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_LIST);
     computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    return super.visitListLiteral(node);
+    super.visitListLiteral(node);
   }
 
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_MAP);
     computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
-    return super.visitMapLiteral(node);
+    super.visitMapLiteral(node);
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     computer._addRegion_token(
         node.externalKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
@@ -694,117 +694,117 @@
         node.operatorKeyword, HighlightRegionType.BUILT_IN);
     computer._addRegion_token(
         node.propertyKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitMethodDeclaration(node);
+    super.visitMethodDeclaration(node);
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     computer._addRegion_token(node.mixinKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitMixinDeclaration(node);
+    super.visitMixinDeclaration(node);
   }
 
   @override
-  Object visitNativeClause(NativeClause node) {
+  void visitNativeClause(NativeClause node) {
     computer._addRegion_token(node.nativeKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitNativeClause(node);
+    super.visitNativeClause(node);
   }
 
   @override
-  Object visitNativeFunctionBody(NativeFunctionBody node) {
+  void visitNativeFunctionBody(NativeFunctionBody node) {
     computer._addRegion_token(node.nativeKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitNativeFunctionBody(node);
+    super.visitNativeFunctionBody(node);
   }
 
   @override
-  Object visitOnClause(OnClause node) {
+  void visitOnClause(OnClause node) {
     computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitOnClause(node);
+    super.visitOnClause(node);
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitPartDirective(node);
+    super.visitPartDirective(node);
   }
 
   @override
-  Object visitPartOfDirective(PartOfDirective node) {
+  void visitPartOfDirective(PartOfDirective node) {
     computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
     computer._addRegion_tokenStart_tokenEnd(
         node.partKeyword, node.ofKeyword, HighlightRegionType.BUILT_IN);
-    return super.visitPartOfDirective(node);
+    super.visitPartOfDirective(node);
   }
 
   @override
-  Object visitRethrowExpression(RethrowExpression node) {
+  void visitRethrowExpression(RethrowExpression node) {
     computer._addRegion_token(node.rethrowKeyword, HighlightRegionType.KEYWORD);
-    return super.visitRethrowExpression(node);
+    super.visitRethrowExpression(node);
   }
 
   @override
-  Object visitReturnStatement(ReturnStatement node) {
+  void visitReturnStatement(ReturnStatement node) {
     computer._addRegion_token(node.returnKeyword, HighlightRegionType.KEYWORD);
-    return super.visitReturnStatement(node);
+    super.visitReturnStatement(node);
   }
 
   @override
-  Object visitShowCombinator(ShowCombinator node) {
+  void visitShowCombinator(ShowCombinator node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.BUILT_IN);
-    return super.visitShowCombinator(node);
+    super.visitShowCombinator(node);
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     computer._addIdentifierRegion(node);
-    return super.visitSimpleIdentifier(node);
+    super.visitSimpleIdentifier(node);
   }
 
   @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+  void visitSimpleStringLiteral(SimpleStringLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_STRING);
-    return super.visitSimpleStringLiteral(node);
+    super.visitSimpleStringLiteral(node);
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     computer._addRegion_token(node.superKeyword, HighlightRegionType.KEYWORD);
-    return super.visitSuperConstructorInvocation(node);
+    super.visitSuperConstructorInvocation(node);
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    return super.visitSwitchCase(node);
+    super.visitSwitchCase(node);
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    return super.visitSwitchDefault(node);
+    super.visitSwitchDefault(node);
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSwitchStatement(SwitchStatement node) {
     computer._addRegion_token(node.switchKeyword, HighlightRegionType.KEYWORD);
-    return super.visitSwitchStatement(node);
+    super.visitSwitchStatement(node);
   }
 
   @override
-  Object visitThisExpression(ThisExpression node) {
+  void visitThisExpression(ThisExpression node) {
     computer._addRegion_token(node.thisKeyword, HighlightRegionType.KEYWORD);
-    return super.visitThisExpression(node);
+    super.visitThisExpression(node);
   }
 
   @override
-  Object visitTryStatement(TryStatement node) {
+  void visitTryStatement(TryStatement node) {
     computer._addRegion_token(node.tryKeyword, HighlightRegionType.KEYWORD);
     computer._addRegion_token(node.finallyKeyword, HighlightRegionType.KEYWORD);
-    return super.visitTryStatement(node);
+    super.visitTryStatement(node);
   }
 
   @override
-  Object visitTypeName(TypeName node) {
+  void visitTypeName(TypeName node) {
     DartType type = node.type;
     if (type != null) {
       if (type.isDynamic && node.name.name == "dynamic") {
@@ -812,35 +812,35 @@
         return null;
       }
     }
-    return super.visitTypeName(node);
+    super.visitTypeName(node);
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     computer._addRegion_token(node.keyword, HighlightRegionType.KEYWORD);
-    return super.visitVariableDeclarationList(node);
+    super.visitVariableDeclarationList(node);
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     computer._addRegion_token(node.whileKeyword, HighlightRegionType.KEYWORD);
-    return super.visitWhileStatement(node);
+    super.visitWhileStatement(node);
   }
 
   @override
-  Object visitWithClause(WithClause node) {
+  void visitWithClause(WithClause node) {
     computer._addRegion_token(node.withKeyword, HighlightRegionType.KEYWORD);
-    return super.visitWithClause(node);
+    super.visitWithClause(node);
   }
 
   @override
-  Object visitYieldStatement(YieldStatement node) {
+  void visitYieldStatement(YieldStatement node) {
     Token keyword = node.yieldKeyword;
     Token star = node.star;
     int offset = keyword.offset;
     int end = star != null ? star.end : keyword.end;
     computer._addRegion(offset, end - offset, HighlightRegionType.BUILT_IN);
-    return super.visitYieldStatement(node);
+    super.visitYieldStatement(node);
   }
 
   void _addRegions_functionBody(FunctionBody node) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 0905fe7..eb20b24 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 490f5b5..c11bac0 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -63,6 +63,9 @@
       } else if (unitMember is FunctionTypeAlias) {
         FunctionTypeAlias alias = unitMember;
         unitContents.add(_newFunctionTypeAliasOutline(alias));
+      } else if (unitMember is GenericTypeAlias) {
+        GenericTypeAlias alias = unitMember;
+        unitContents.add(_newGenericTypeAliasOutline(alias));
       }
     }
     Outline unitOutline = _newUnitOutline(unitContents);
@@ -224,6 +227,27 @@
     return _nodeOutline(node, element);
   }
 
+  Outline _newGenericTypeAliasOutline(GenericTypeAlias node) {
+    var functionType = node.functionType;
+    TypeAnnotation returnType = functionType.returnType;
+    SimpleIdentifier nameNode = node.name;
+    String name = nameNode.name;
+    FormalParameterList parameters = functionType.parameters;
+    String parametersStr = _safeToSource(parameters);
+    String returnTypeStr = _safeToSource(returnType);
+    Element element = new Element(
+        ElementKind.FUNCTION_TYPE_ALIAS,
+        name,
+        Element.makeFlags(
+            isPrivate: Identifier.isPrivateName(name),
+            isDeprecated: _isDeprecated(node)),
+        location: _getLocationNode(nameNode),
+        parameters: parametersStr,
+        returnType: returnTypeStr,
+        typeParameters: _getTypeParametersStr(node.typeParameters));
+    return _nodeOutline(node, element);
+  }
+
   Outline _newMethodOutline(MethodDeclaration method) {
     TypeAnnotation returnType = method.returnType;
     SimpleIdentifier nameNode = method.name;
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index 92be0a4..cd1ff67 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_signature.dart b/pkg/analysis_server/lib/src/computer/computer_signature.dart
index b213ef1..518a488 100644
--- a/pkg/analysis_server/lib/src/computer/computer_signature.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_signature.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
index 292b748..00f2cfc 100644
--- a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -38,7 +38,7 @@
    * The resolution result associated with the defining compilation unit of the
    * library to which imports might be added.
    */
-  final ResolveResult libraryResult;
+  final ResolvedUnitResult libraryResult;
 
   /**
    * Initialize a newly created builder.
diff --git a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
index 6150a2c..a587098 100644
--- a/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/imported_elements_computer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -50,7 +50,7 @@
  * The visitor used by an [ImportedElementsComputer] to record the names of all
  * imported elements.
  */
-class _Visitor extends UnifyingAstVisitor<Object> {
+class _Visitor extends UnifyingAstVisitor<void> {
   /**
    * The element representing the library containing the code being visited.
    */
@@ -79,15 +79,14 @@
   _Visitor(this.containingLibrary, this.startOffset, this.endOffset);
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     if (node.offset <= endOffset && node.end >= startOffset) {
       node.visitChildren(this);
     }
-    return null;
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     if (!node.inDeclarationContext() &&
         node.offset <= endOffset &&
         node.end >= startOffset &&
@@ -119,7 +118,6 @@
         }
       }
     }
-    return null;
   }
 
   static bool _isConstructorDeclarationReturnType(SimpleIdentifier node) {
diff --git a/pkg/analysis_server/lib/src/computer/new_notifications.dart b/pkg/analysis_server/lib/src/computer/new_notifications.dart
index 0e11991..a7c00bf 100644
--- a/pkg/analysis_server/lib/src/computer/new_notifications.dart
+++ b/pkg/analysis_server/lib/src/computer/new_notifications.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,15 +8,16 @@
 import 'package:analysis_server/src/domains/analysis/occurrences.dart';
 import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 
 void new_sendDartNotificationNavigation(
-    AnalysisServer analysisServer, AnalysisResult result) {
+    AnalysisServer analysisServer, ResolvedUnitResult result) {
   var unit = result.unit;
   if (unit != null) {
     NavigationCollectorImpl collector = new NavigationCollectorImpl();
-    computeDartNavigation(collector, unit, null, null);
+    computeDartNavigation(
+        analysisServer.resourceProvider, collector, unit, null, null);
     collector.createRegions();
     var params = new protocol.AnalysisNavigationParams(
         result.path, collector.regions, collector.targets, collector.files);
@@ -25,7 +26,7 @@
 }
 
 void new_sendDartNotificationOccurrences(
-    AnalysisServer analysisServer, AnalysisResult result) {
+    AnalysisServer analysisServer, ResolvedUnitResult result) {
   var unit = result.unit;
   if (unit != null) {
     OccurrencesCollectorImpl collector = new OccurrencesCollectorImpl();
@@ -37,9 +38,12 @@
 }
 
 void new_sendErrorNotification(
-    AnalysisServer analysisServer, AnalysisResult result) {
+    AnalysisServer analysisServer, ResolvedUnitResult result) {
   var serverErrors = protocol.doAnalysisError_listFromEngine(
-      result.driver.analysisOptions, result.lineInfo, result.errors);
+    result.session.analysisContext.analysisOptions,
+    result.lineInfo,
+    result.errors,
+  );
   var params = new protocol.AnalysisErrorsParams(result.path, serverErrors);
   analysisServer.sendNotification(params.toNotification());
 }
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 32c9e00..b7312d6 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -15,7 +15,6 @@
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -417,11 +416,6 @@
   final ResourceProvider resourceProvider;
 
   /**
-   * The file content overlay.
-   */
-  final FileContentOverlay fileContentOverlay;
-
-  /**
    * The manager used to access the SDK that should be associated with a
    * particular context.
    */
@@ -499,7 +493,6 @@
 
   ContextManagerImpl(
       this.resourceProvider,
-      this.fileContentOverlay,
       this.sdkManager,
       this.packageResolverProvider,
       this.analyzedFilesGlobs,
@@ -899,8 +892,7 @@
         convertedErrors ?? <protocol.AnalysisError>[]);
   }
 
-  void _checkForAnalysisOptionsUpdate(
-      String path, ContextInfo info, ChangeType changeType) {
+  void _checkForAnalysisOptionsUpdate(String path, ContextInfo info) {
     if (AnalysisEngine.isAnalysisOptionsFileName(path, pathContext)) {
       AnalysisDriver driver = info.analysisDriver;
       if (driver == null) {
@@ -909,39 +901,29 @@
         // yet created a driver for that context.
         return;
       }
-      String contextRoot = info.folder.path;
-      ContextBuilder builder =
-          callbacks.createContextBuilder(info.folder, defaultContextOptions);
-      AnalysisOptions options = builder.getAnalysisOptions(contextRoot,
-          contextRoot: driver.contextRoot);
-      SourceFactory factory = builder.createSourceFactory(contextRoot, options);
-      driver.configure(analysisOptions: options, sourceFactory: factory);
       // TODO(brianwilkerson) Set exclusion patterns.
       _analyzeAnalysisOptionsFile(driver, path);
+      _updateAnalysisOptions(info);
     }
   }
 
-  void _checkForPackagespecUpdate(
-      String path, ContextInfo info, Folder folder) {
+  void _checkForPackagespecUpdate(String path, ContextInfo info) {
     // Check to see if this is the .packages file for this context and if so,
     // update the context's source factory.
     if (pathContext.basename(path) == PACKAGE_SPEC_NAME) {
-      String contextRoot = info.folder.path;
-      ContextBuilder builder =
-          callbacks.createContextBuilder(info.folder, defaultContextOptions);
       AnalysisDriver driver = info.analysisDriver;
-      if (driver != null) {
-        AnalysisOptions options = builder.getAnalysisOptions(contextRoot,
-            contextRoot: driver.contextRoot);
-        SourceFactory factory =
-            builder.createSourceFactory(contextRoot, options);
-        driver.configure(analysisOptions: options, sourceFactory: factory);
+      if (driver == null) {
+        // I suspect that this happens as a result of a race condition: server
+        // has determined that the file (at [path]) is in a context, but hasn't
+        // yet created a driver for that context.
+        return;
       }
+
+      _updateAnalysisOptions(info);
     }
   }
 
-  void _checkForPubspecUpdate(
-      String path, ContextInfo info, ChangeType changeType) {
+  void _checkForPubspecUpdate(String path, ContextInfo info) {
     if (_isPubspec(path)) {
       AnalysisDriver driver = info.analysisDriver;
       if (driver == null) {
@@ -951,6 +933,7 @@
         return;
       }
       _analyzePubspecFile(driver, path);
+      _updateAnalysisOptions(info);
     }
   }
 
@@ -1424,9 +1407,9 @@
           }
         }
     }
-    _checkForPackagespecUpdate(path, info, info.folder);
-    _checkForAnalysisOptionsUpdate(path, info, type);
-    _checkForPubspecUpdate(path, info, type);
+    _checkForPackagespecUpdate(path, info);
+    _checkForAnalysisOptionsUpdate(path, info);
+    _checkForPubspecUpdate(path, info);
   }
 
   /**
@@ -1507,8 +1490,7 @@
    * the contents cannot be read.
    */
   String _readFile(String path) {
-    return fileContentOverlay[path] ??
-        resourceProvider.getFile(path).readAsStringSync();
+    return resourceProvider.getFile(path).readAsStringSync();
   }
 
   Packages _readPackagespec(File specFile) {
@@ -1555,6 +1537,17 @@
     return false;
   }
 
+  void _updateAnalysisOptions(ContextInfo info) {
+    AnalysisDriver driver = info.analysisDriver;
+    String contextRoot = info.folder.path;
+    ContextBuilder builder =
+        callbacks.createContextBuilder(info.folder, defaultContextOptions);
+    AnalysisOptions options = builder.getAnalysisOptions(contextRoot,
+        contextRoot: driver.contextRoot);
+    SourceFactory factory = builder.createSourceFactory(contextRoot, options);
+    driver.configure(analysisOptions: options, sourceFactory: factory);
+  }
+
   void _updateContextPackageUriResolver(Folder contextFolder) {
     ContextInfo info = getContextInfoFor(contextFolder);
     AnalysisDriver driver = info.analysisDriver;
diff --git a/pkg/analysis_server/lib/src/domain_abstract.dart b/pkg/analysis_server/lib/src/domain_abstract.dart
index 3c01cbf..6a50a2d 100644
--- a/pkg/analysis_server/lib/src/domain_abstract.dart
+++ b/pkg/analysis_server/lib/src/domain_abstract.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index a3e3257..9d2cbe9 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -17,12 +17,11 @@
 import 'package:analysis_server/src/plugin/result_merger.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart' as engine;
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/engine.dart' as engine;
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
@@ -47,24 +46,21 @@
    * Implement the `analysis.getErrors` request.
    */
   Future<void> getErrors(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     String file = new AnalysisGetErrorsParams.fromRequest(request).file;
+    ResolvedUnitResult result = await server.getResolvedUnit(file);
 
-    void send(engine.AnalysisOptions analysisOptions, LineInfo lineInfo,
-        List<engine.AnalysisError> errors) {
-      if (lineInfo == null) {
-        server.sendResponse(new Response.getErrorsInvalidFile(request));
-      } else {
-        List<AnalysisError> protocolErrors =
-            doAnalysisError_listFromEngine(analysisOptions, lineInfo, errors);
-        server.sendResponse(
-            new AnalysisGetErrorsResult(protocolErrors).toResponse(request.id));
-      }
+    if (result?.state != ResultState.VALID) {
+      server.sendResponse(new Response.getErrorsInvalidFile(request));
+      return;
     }
 
-    AnalysisResult result = await server.getAnalysisResult(file);
-    send(result?.driver?.analysisOptions, result?.lineInfo, result?.errors);
+    List<AnalysisError> protocolErrors = doAnalysisError_listFromEngine(
+      result.session.analysisContext.analysisOptions,
+      result.lineInfo,
+      result.errors,
+    );
+    server.sendResponse(
+        new AnalysisGetErrorsResult(protocolErrors).toResponse(request.id));
   }
 
   /**
@@ -76,7 +72,7 @@
     var params = new AnalysisGetHoverParams.fromRequest(request);
 
     // Prepare the resolved units.
-    AnalysisResult result = await server.getAnalysisResult(params.file);
+    ResolvedUnitResult result = await server.getResolvedUnit(params.file);
     CompilationUnit unit = result?.unit;
 
     // Prepare the hovers.
@@ -105,9 +101,10 @@
     //
     // Prepare the resolved unit.
     //
-    AnalysisResult result = await server.getAnalysisResult(params.file);
-    if (result == null) {
+    ResolvedUnitResult result = await server.getResolvedUnit(params.file);
+    if (result?.state != ResultState.VALID) {
       server.sendResponse(new Response.getImportedElementsInvalidFile(request));
+      return;
     }
 
     List<ImportedElements> elements;
@@ -179,11 +176,12 @@
       // Compute navigation data generated by server.
       //
       List<AnalysisNavigationParams> allResults = <AnalysisNavigationParams>[];
-      AnalysisResult result = await server.getAnalysisResult(file);
-      CompilationUnit unit = result?.unit;
-      if (unit != null && result.exists) {
+      ResolvedUnitResult result = await server.getResolvedUnit(file);
+      if (result?.state == ResultState.VALID) {
+        CompilationUnit unit = result?.unit;
         NavigationCollectorImpl collector = new NavigationCollectorImpl();
-        computeDartNavigation(collector, unit, offset, length);
+        computeDartNavigation(
+            server.resourceProvider, collector, unit, offset, length);
         collector.createRegions();
         allResults.add(new AnalysisNavigationParams(
             file, collector.regions, collector.targets, collector.files));
@@ -246,14 +244,15 @@
     var params = new AnalysisGetSignatureParams.fromRequest(request);
 
     // Prepare the resolved units.
-    AnalysisResult result = await server.getAnalysisResult(params.file);
-    CompilationUnit unit = result?.unit;
-    if (unit == null) {
+    ResolvedUnitResult result = await server.getResolvedUnit(params.file);
+
+    if (result?.state != ResultState.VALID) {
       server.sendResponse(new Response.getSignatureInvalidFile(request));
       return;
     }
 
     // Ensure the offset provided is a valid location in the file.
+    final unit = result.unit;
     final computer = new DartUnitSignatureComputer(unit, params.offset);
     if (!computer.offsetIsValid) {
       server.sendResponse(new Response.getSignatureInvalidOffset(request));
@@ -320,23 +319,8 @@
   Response reanalyze(Request request) {
     server.options.analytics?.sendEvent('analysis', 'reanalyze');
 
-    AnalysisReanalyzeParams params =
-        new AnalysisReanalyzeParams.fromRequest(request);
-    List<String> roots = params.roots;
-    if (roots == null || roots.isNotEmpty) {
-      List<String> includedPaths = server.contextManager.includedPaths;
-      List<Resource> rootResources = null;
-      if (roots != null) {
-        rootResources = <Resource>[];
-        for (String rootPath in roots) {
-          if (!includedPaths.contains(rootPath)) {
-            return new Response.invalidAnalysisRoot(request, rootPath);
-          }
-          rootResources.add(server.resourceProvider.getResource(rootPath));
-        }
-      }
-      server.reanalyze(rootResources);
-    }
+    server.reanalyze();
+
     //
     // Restart all of the plugins. This is an async operation that will happen
     // in the background.
diff --git a/pkg/analysis_server/lib/src/domain_analytics.dart b/pkg/analysis_server/lib/src/domain_analytics.dart
index 220fe27..e006ab8 100644
--- a/pkg/analysis_server/lib/src/domain_analytics.dart
+++ b/pkg/analysis_server/lib/src/domain_analytics.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 10597e3..2b61900 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -15,6 +15,7 @@
 import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -172,9 +173,9 @@
     String filePath = params.file;
     int offset = params.offset;
 
-    AnalysisResult result = await server.getAnalysisResult(filePath);
+    ResolvedUnitResult result = await server.getResolvedUnit(filePath);
 
-    if (result != null && result.exists) {
+    if (result?.state == ResultState.VALID) {
       if (offset < 0 || offset > result.content.length) {
         server.sendResponse(new Response.invalidParameter(
             request,
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index 6c03067..dcd24ed 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/domain_execution.dart b/pkg/analysis_server/lib/src/domain_execution.dart
index 52bf9d6..8930def 100644
--- a/pkg/analysis_server/lib/src/domain_execution.dart
+++ b/pkg/analysis_server/lib/src/domain_execution.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/domain_kythe.dart b/pkg/analysis_server/lib/src/domain_kythe.dart
index c4fceb6..ecfcc43 100644
--- a/pkg/analysis_server/lib/src/domain_kythe.dart
+++ b/pkg/analysis_server/lib/src/domain_kythe.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -13,7 +13,7 @@
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/plugin/result_merger.dart';
 import 'package:analysis_server/src/services/kythe/kythe_visitors.dart';
-import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/generated/type_system.dart';
@@ -56,10 +56,9 @@
       //
       List<KytheGetKytheEntriesResult> allResults =
           <KytheGetKytheEntriesResult>[];
-      AnalysisResult result = await server.getAnalysisResult(file);
-      CompilationUnit unit = result?.unit;
-      TypeSystem typeSystem = result.libraryElement.context.typeSystem;
-      if (unit != null && result.exists) {
+      ResolvedUnitResult result = await server.getResolvedUnit(file);
+      if (result?.state == ResultState.VALID) {
+        TypeSystem typeSystem = await result.libraryElement.session.typeSystem;
         List<KytheEntry> entries = <KytheEntry>[];
         // TODO(brianwilkerson) Figure out how to get the list of files.
         List<String> files = <String>[];
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 39497ac..c7d5f28 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -28,8 +28,7 @@
    * Return the version number of the analysis server.
    */
   Response getVersion(Request request) {
-    return new ServerGetVersionResult(AnalysisServer.VERSION)
-        .toResponse(request.id);
+    return new ServerGetVersionResult(PROTOCOL_VERSION).toResponse(request.id);
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
index cff08c1..2885948 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
index 46a455e..d8fbb56 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,17 +8,22 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
 
-NavigationCollector computeDartNavigation(NavigationCollector collector,
-    CompilationUnit unit, int offset, int length) {
+NavigationCollector computeDartNavigation(
+    ResourceProvider resourceProvider,
+    NavigationCollector collector,
+    CompilationUnit unit,
+    int offset,
+    int length) {
   _DartNavigationCollector dartCollector =
       new _DartNavigationCollector(collector);
   _DartNavigationComputerVisitor visitor =
-      new _DartNavigationComputerVisitor(dartCollector);
+      new _DartNavigationComputerVisitor(resourceProvider, dartCollector);
   if (offset == null || length == null) {
     unit.accept(visitor);
   } else {
@@ -87,9 +92,10 @@
 }
 
 class _DartNavigationComputerVisitor extends RecursiveAstVisitor {
+  final ResourceProvider resourceProvider;
   final _DartNavigationCollector computer;
 
-  _DartNavigationComputerVisitor(this.computer);
+  _DartNavigationComputerVisitor(this.resourceProvider, this.computer);
 
   @override
   visitAnnotation(Annotation node) {
@@ -352,7 +358,7 @@
   void _addUriDirectiveRegion(UriBasedDirective node, Element element) {
     if (element != null) {
       Source source = element.source;
-      if (element.context.exists(source)) {
+      if (resourceProvider.getResource(source.fullName).exists) {
         computer._addRegionForNode(node.uri, element);
       }
     }
diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
index eedb605..2c44ad4 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
index 6b9cde3..ee06820 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/occurrences_dart.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index c3a218e..dbba4ea 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,6 +14,7 @@
 import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
@@ -81,7 +82,7 @@
 
     // Update the context file content to include the code being completed.
     // Then resolve it, and restore the file to its initial state.
-    AnalysisResult targetResult;
+    ResolvedUnitResult targetResult;
     String contentFileOverlay = fileContentOverlay[contextFile];
     try {
       fileContentOverlay[contextFile] = targetCode;
diff --git a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
index 6673fb4..c9b2ff1 100644
--- a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
@@ -1,22 +1,26 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/plugin/edit/assist/assist_dart.dart';
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/edit/fix/non_nullable_fix.dart';
 import 'package:analysis_server/src/edit/fix/prefer_int_literals_fix.dart';
 import 'package:analysis_server/src/edit/fix/prefer_mixin_fix.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/linter_visitor.dart';
@@ -40,7 +44,8 @@
 
   EditDartFix(this.server, this.request);
 
-  void addFix(String description, Location location, SourceChange change) {
+  void addSourceChange(
+      String description, Location location, SourceChange change) {
     suggestions.add(new DartFixSuggestion(description, location: location));
     for (SourceFileEdit fileEdit in change.edits) {
       for (SourceEdit sourceEdit in fileEdit.edits) {
@@ -49,6 +54,14 @@
     }
   }
 
+  void addSourceFileEdit(
+      String description, Location location, SourceFileEdit fileEdit) {
+    suggestions.add(new DartFixSuggestion(description, location: location));
+    for (SourceEdit sourceEdit in fileEdit.edits) {
+      sourceChange.addEdit(fileEdit.file, fileEdit.fileStamp, sourceEdit);
+    }
+  }
+
   void addRecommendation(String description, [Location location]) {
     otherSuggestions
         .add(new DartFixSuggestion(description, location: location));
@@ -86,6 +99,7 @@
 
     final preferIntLiterals = lintRules['prefer_int_literals'];
     final preferIntLiteralsFix = new PreferIntLiteralsFix(this);
+    final nonNullableFix = new NonNullableFix(this);
     preferIntLiterals?.reporter = preferIntLiteralsFix;
 
     // Setup
@@ -97,25 +111,7 @@
       preferMixinFix,
       preferIntLiteralsFix,
     ];
-    final visitors = <AstVisitor>[];
-    final registry = new NodeLintRegistry(false);
-    for (Linter linter in linters) {
-      if (linter != null) {
-        final visitor = linter.getVisitor();
-        if (visitor != null) {
-          visitors.add(visitor);
-        }
-        if (linter is NodeLintRule) {
-          (linter as NodeLintRule).registerNodeProcessors(registry);
-        }
-      }
-    }
-    final AstVisitor astVisitor = visitors.isNotEmpty
-        ? new ExceptionHandlingDelegatingAstVisitor(
-            visitors, ExceptionHandlingDelegatingAstVisitor.logException)
-        : null;
-    final AstVisitor linterVisitor = new LinterVisitor(
-        registry, ExceptionHandlingDelegatingAstVisitor.logException);
+    final lintVisitorsBySession = <AnalysisSession, _LintVisitors>{};
 
     // TODO(danrubel): Determine if a lint is configured to run as part of
     // standard analysis and use those results if available instead of
@@ -135,36 +131,62 @@
       if (res is Folder) {
         for (Resource child in res.getChildren()) {
           if (!child.shortName.startsWith('.') &&
-              contextManager.isInAnalysisRoot(child.path)) {
+              contextManager.isInAnalysisRoot(child.path) &&
+              !contextManager.isIgnored(child.path)) {
             resources.add(child);
           }
         }
         continue;
       }
-      AnalysisResult result = await server.getAnalysisResult(res.path);
-      CompilationUnit unit = result?.unit;
-      if (unit != null) {
-        if (!hasErrors) {
-          for (AnalysisError error in result.errors) {
-            if (!(await fixError(result, error))) {
-              if (error.errorCode.type == ErrorType.SYNTACTIC_ERROR) {
-                hasErrors = true;
+
+      const maxAttempts = 3;
+      int attempt = 0;
+      while (attempt < maxAttempts) {
+        ResolvedUnitResult result = await server.getResolvedUnit(res.path);
+
+        // TODO(danrubel): Investigate why InconsistentAnalysisException occurs
+        // and whether this is an appropriate way to handle the situation
+        ++attempt;
+        try {
+          CompilationUnit unit = result?.unit;
+          if (unit != null) {
+            if (!hasErrors) {
+              for (AnalysisError error in result.errors) {
+                if (!(await fixError(result, error))) {
+                  if (error.errorCode.type == ErrorType.SYNTACTIC_ERROR) {
+                    hasErrors = true;
+                  }
+                }
               }
             }
+            Source source = result.unit.declaredElement.source;
+            for (Linter linter in linters) {
+              if (linter != null) {
+                linter.reporter.source = source;
+              }
+            }
+            var lintVisitors = lintVisitorsBySession[result.session] ??=
+                await _setupLintVisitors(result, linters);
+            if (lintVisitors.astVisitor != null) {
+              unit.accept(lintVisitors.astVisitor);
+            }
+            unit.accept(lintVisitors.linterVisitor);
+            for (LinterFix fix in fixes) {
+              await fix.applyLocalFixes(result);
+            }
+            if (isIncluded(source.fullName)) {
+              nonNullableFix.applyLocalFixes(result);
+            }
           }
-        }
-        Source source = result.sourceFactory.forUri2(result.uri);
-        for (Linter linter in linters) {
-          if (linter != null) {
-            linter.reporter.source = source;
+          break;
+        } on InconsistentAnalysisException catch (_) {
+          if (attempt == maxAttempts) {
+            // TODO(danrubel): Consider improving the edit.dartfix protocol
+            // to gracefully report inconsistent results for a particular
+            // file rather than aborting the entire operation.
+            rethrow;
           }
-        }
-        if (astVisitor != null) {
-          unit.accept(astVisitor);
-        }
-        unit.accept(linterVisitor);
-        for (LinterFix fix in fixes) {
-          await fix.applyLocalFixes(result);
+          // try again
         }
       }
     }
@@ -192,7 +214,7 @@
         .toResponse(request.id);
   }
 
-  Future<bool> fixError(AnalysisResult result, AnalysisError error) async {
+  Future<bool> fixError(ResolvedUnitResult result, AnalysisError error) async {
     if (error.errorCode ==
         StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR) {
       // TODO(danrubel): Rather than comparing the error codes individually,
@@ -205,16 +227,13 @@
       return false;
     }
 
-    final dartContext = new DartFixContextImpl(
-        new FixContextImpl(
-            server.resourceProvider, result.driver, error, result.errors),
-        new AstProviderForDriver(result.driver),
-        result.unit);
+    final workspace = DartChangeWorkspace(server.currentSessions);
+    final dartContext = new DartFixContextImpl(workspace, result, error);
     final processor = new FixProcessor(dartContext);
     Fix fix = await processor.computeFix();
     final location = locationFor(result, error.offset, error.length);
     if (fix != null) {
-      addFix(fix.change.message, location, fix.change);
+      addSourceChange(fix.change.message, location, fix.change);
     } else {
       // TODO(danrubel): Determine why the fix could not be applied
       // and report that in the description.
@@ -241,35 +260,54 @@
     return false;
   }
 
-  Location locationFor(AnalysisResult result, int offset, int length) {
+  Location locationFor(ResolvedUnitResult result, int offset, int length) {
     final locInfo = result.unit.lineInfo.getLocation(offset);
     final location = new Location(
         result.path, offset, length, locInfo.lineNumber, locInfo.columnNumber);
     return location;
   }
-}
 
-class EditDartFixAssistContext implements DartAssistContext {
-  @override
-  final AnalysisDriver analysisDriver;
-
-  @override
-  final int selectionLength;
-
-  @override
-  final int selectionOffset;
-
-  @override
-  final Source source;
-
-  @override
-  final CompilationUnit unit;
-
-  EditDartFixAssistContext(
-      EditDartFix dartFix, this.source, this.unit, AstNode node)
-      : analysisDriver = dartFix.server.getAnalysisDriver(source.fullName),
-        selectionOffset = node.offset,
-        selectionLength = 0;
+  Future<_LintVisitors> _setupLintVisitors(
+      ResolvedUnitResult result, List<Linter> linters) async {
+    final visitors = <AstVisitor>[];
+    final registry = new NodeLintRegistry(false);
+    // TODO(paulberry): use an API that provides this information more readily
+    var unitElement = result.unit.declaredElement;
+    var session = result.session;
+    var currentUnit = LinterContextUnit(result.content, result.unit);
+    var allUnits = <LinterContextUnit>[];
+    for (var cu in unitElement.library.units) {
+      if (identical(cu, unitElement)) {
+        allUnits.add(currentUnit);
+      } else {
+        Source source = cu.source;
+        if (source != null) {
+          var result = await session.getResolvedUnit(source.fullName);
+          allUnits.add(LinterContextUnit(result.content, result.unit));
+        }
+      }
+    }
+    var context = LinterContextImpl(allUnits, currentUnit,
+        session.declaredVariables, result.typeProvider, result.typeSystem);
+    for (Linter linter in linters) {
+      if (linter != null) {
+        final visitor = linter.getVisitor();
+        if (visitor != null) {
+          visitors.add(visitor);
+        }
+        if (linter is NodeLintRule) {
+          (linter as NodeLintRule).registerNodeProcessors(registry, context);
+        }
+      }
+    }
+    final AstVisitor astVisitor = visitors.isNotEmpty
+        ? new ExceptionHandlingDelegatingAstVisitor(
+            visitors, ExceptionHandlingDelegatingAstVisitor.logException)
+        : null;
+    final AstVisitor linterVisitor = new LinterVisitor(
+        registry, ExceptionHandlingDelegatingAstVisitor.logException);
+    return _LintVisitors(astVisitor, linterVisitor);
+  }
 }
 
 abstract class LinterFix implements ErrorReporter {
@@ -281,7 +319,7 @@
   LinterFix(this.dartFix);
 
   /// Apply fixes for the current compilation unit.
-  Future<void> applyLocalFixes(AnalysisResult result);
+  Future<void> applyLocalFixes(ResolvedUnitResult result);
 
   /// Apply any fixes remaining after analysis is complete.
   Future<void> applyRemainingFixes();
@@ -333,3 +371,11 @@
     // ignored
   }
 }
+
+class _LintVisitors {
+  final AstVisitor astVisitor;
+
+  final AstVisitor linterVisitor;
+
+  _LintVisitors(this.astVisitor, this.linterVisitor);
+}
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index f7a28e7..2e1f6e2 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -1,13 +1,11 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
 import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
-import 'package:analysis_server/plugin/edit/assist/assist_dart.dart';
 import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
-import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/collections.dart';
@@ -19,22 +17,22 @@
 import 'package:analysis_server/src/protocol_server.dart' hide Element;
 import 'package:analysis_server/src/services/completion/postfix/postfix_completion.dart';
 import 'package:analysis_server/src/services/completion/statement/statement_completion.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
 import 'package:analysis_server/src/services/correction/organize_directives.dart';
 import 'package:analysis_server/src/services/correction/sort_members.dart';
 import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart' as engine;
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart' as engine;
 import 'package:analyzer/src/error/codes.dart' as engine;
 import 'package:analyzer/src/generated/engine.dart' as engine;
@@ -103,11 +101,10 @@
     EditFormatParams params = new EditFormatParams.fromRequest(request);
     String file = params.file;
 
-    String unformattedSource;
+    String unformattedCode;
     try {
-      Source source = server.resourceProvider.getFile(file).createSource();
-      unformattedSource =
-          server.fileContentOverlay[file] ?? source.contents.data;
+      var resource = server.resourceProvider.getFile(file);
+      unformattedCode = resource.readAsStringSync();
     } catch (e) {
       return new Response.formatInvalidFile(request);
     }
@@ -121,7 +118,7 @@
       length = null;
     }
 
-    SourceCode code = new SourceCode(unformattedSource,
+    SourceCode code = new SourceCode(unformattedCode,
         uri: null,
         isCompilationUnit: true,
         selectionStart: start,
@@ -137,10 +134,10 @@
 
     List<SourceEdit> edits = <SourceEdit>[];
 
-    if (formattedSource != unformattedSource) {
+    if (formattedSource != unformattedCode) {
       //TODO: replace full replacements with smaller, more targeted edits
       SourceEdit edit =
-          new SourceEdit(0, unformattedSource.length, formattedSource);
+          new SourceEdit(0, unformattedCode.length, formattedSource);
       edits.add(edit);
     }
 
@@ -175,7 +172,7 @@
     Map<PluginInfo, Future<plugin.Response>> pluginFutures;
     plugin.EditGetAssistsParams requestParams =
         new plugin.EditGetAssistsParams(file, offset, length);
-    AnalysisDriver driver = server.getAnalysisDriver(file);
+    var driver = server.getAnalysisDriver(file);
     if (driver == null) {
       pluginFutures = <PluginInfo, Future<plugin.Response>>{};
     } else {
@@ -185,15 +182,16 @@
     //
     // Compute fixes associated with server-generated errors.
     //
-    AnalysisResult result = await server.getAnalysisResult(file);
+    ResolvedUnitResult result = await server.getResolvedUnit(file);
     if (result != null) {
-      CompilationUnit unit = result.unit;
-      CompilationUnitElement compilationUnitElement =
-          resolutionMap.elementDeclaredByCompilationUnit(unit);
-      DartAssistContext dartAssistContext = new _DartAssistContextForValues(
-          compilationUnitElement.source, offset, length, driver, unit);
+      var context = new DartAssistContextImpl(
+        DartChangeWorkspace(server.currentSessions),
+        result,
+        offset,
+        length,
+      );
       try {
-        AssistProcessor processor = new AssistProcessor(dartAssistContext);
+        AssistProcessor processor = new AssistProcessor(context);
         List<Assist> assists = await processor.compute();
         assists.sort(Assist.SORT_BY_RELEVANCE);
         for (Assist assist in assists) {
@@ -236,7 +234,7 @@
     Map<PluginInfo, Future<plugin.Response>> pluginFutures;
     plugin.EditGetFixesParams requestParams =
         new plugin.EditGetFixesParams(file, offset);
-    AnalysisDriver driver = server.getAnalysisDriver(file);
+    var driver = server.getAnalysisDriver(file);
     if (driver == null) {
       pluginFutures = <PluginInfo, Future<plugin.Response>>{};
     } else {
@@ -249,7 +247,7 @@
     List<AnalysisErrorFixes> errorFixesList = null;
     while (errorFixesList == null) {
       try {
-        errorFixesList = await _computeServerErrorFixes(driver, file, offset);
+        errorFixesList = await _computeServerErrorFixes(file, offset);
       } on InconsistentAnalysisException {
         // Loop around to try again to compute the fixes.
       }
@@ -281,26 +279,17 @@
     var params = new EditGetPostfixCompletionParams.fromRequest(request);
     SourceChange change;
 
-    AnalysisResult result = await server.getAnalysisResult(params.file);
+    ResolvedUnitResult result = await server.getResolvedUnit(params.file);
     if (result != null) {
-      CompilationUnit unit = result.unit;
-      CompilationUnitElement unitElement =
-          resolutionMap.elementDeclaredByCompilationUnit(unit);
-      if (unitElement.context != null) {
-        PostfixCompletionContext context = new PostfixCompletionContext(
-            params.file,
-            result.lineInfo,
-            params.offset,
-            params.key,
-            result.driver,
-            unit,
-            unitElement,
-            result.errors);
-        PostfixCompletionProcessor processor =
-            new PostfixCompletionProcessor(context);
-        PostfixCompletion completion = await processor.compute();
-        change = completion?.change;
-      }
+      PostfixCompletionContext context = new PostfixCompletionContext(
+        result,
+        params.offset,
+        params.key,
+      );
+      PostfixCompletionProcessor processor =
+          new PostfixCompletionProcessor(context);
+      PostfixCompletion completion = await processor.compute();
+      change = completion?.change;
     }
     if (change == null) {
       change = new SourceChange("", edits: []);
@@ -317,24 +306,13 @@
     var params = new EditGetStatementCompletionParams.fromRequest(request);
     SourceChange change;
 
-    AnalysisResult result = await server.getAnalysisResult(params.file);
+    ResolvedUnitResult result = await server.getResolvedUnit(params.file);
     if (result != null) {
-      CompilationUnit unit = result.unit;
-      CompilationUnitElement unitElement =
-          resolutionMap.elementDeclaredByCompilationUnit(unit);
-      if (unitElement.context != null) {
-        StatementCompletionContext context = new StatementCompletionContext(
-            params.file,
-            result.lineInfo,
-            params.offset,
-            unit,
-            unitElement,
-            result.errors);
-        StatementCompletionProcessor processor =
-            new StatementCompletionProcessor(context);
-        StatementCompletion completion = await processor.compute();
-        change = completion.change;
-      }
+      var context = new StatementCompletionContext(result, params.offset);
+      StatementCompletionProcessor processor =
+          new StatementCompletionProcessor(context);
+      StatementCompletion completion = await processor.compute();
+      change = completion.change;
     }
     if (change == null) {
       change = new SourceChange("", edits: []);
@@ -404,7 +382,7 @@
     //
     // Prepare the resolved unit.
     //
-    AnalysisResult result = await server.getAnalysisResult(params.file);
+    ResolvedUnitResult result = await server.getResolvedUnit(params.file);
     if (result == null) {
       server.sendResponse(new Response.importElementsInvalidFile(request));
     }
@@ -413,7 +391,7 @@
     if (libraryUnit != result.unit.declaredElement) {
       // The file in the request is a part of a library. We need to pass the
       // defining compilation unit to the computer, not the part.
-      result = await server.getAnalysisResult(libraryUnit.source.fullName);
+      result = await server.getResolvedUnit(libraryUnit.source.fullName);
       if (result == null) {
         server.sendResponse(new Response.importElementsInvalidFile(request));
       }
@@ -439,25 +417,15 @@
     var params = new EditGetPostfixCompletionParams.fromRequest(request);
     bool value = false;
 
-    AnalysisResult result = await server.getAnalysisResult(params.file);
+    ResolvedUnitResult result = await server.getResolvedUnit(params.file);
     if (result != null) {
-      CompilationUnit unit = result.unit;
-      CompilationUnitElement unitElement =
-          resolutionMap.elementDeclaredByCompilationUnit(unit);
-      if (unitElement.context != null) {
-        PostfixCompletionContext context = new PostfixCompletionContext(
-            params.file,
-            result.lineInfo,
-            params.offset,
-            params.key,
-            result.driver,
-            unit,
-            unitElement,
-            result.errors);
-        PostfixCompletionProcessor processor =
-            new PostfixCompletionProcessor(context);
-        value = await processor.isApplicable();
-      }
+      var context = new PostfixCompletionContext(
+        result,
+        params.offset,
+        params.key,
+      );
+      var processor = new PostfixCompletionProcessor(context);
+      value = await processor.isApplicable();
     }
 
     Response response = new EditIsPostfixCompletionApplicableResult(value)
@@ -491,7 +459,7 @@
       return;
     }
     // Prepare the file information.
-    AnalysisResult result = await server.getAnalysisResult(file);
+    ResolvedUnitResult result = await server.getResolvedUnit(file);
     if (result == null) {
       server.sendResponse(new Response.fileNotAnalyzed(request, file));
       return;
@@ -526,8 +494,8 @@
       return;
     }
     // Prepare the file information.
-    AnalysisDriver driver = server.getAnalysisDriver(file);
-    ParseResult result = await driver?.parseFile(file);
+    var driver = server.getAnalysisDriver(file);
+    ParsedUnitResult result = await driver?.parseFile(file);
     if (result == null) {
       server.sendResponse(new Response.fileNotAnalyzed(request, file));
       return;
@@ -555,29 +523,21 @@
    * Compute and return the fixes associated with server-generated errors.
    */
   Future<List<AnalysisErrorFixes>> _computeServerErrorFixes(
-      AnalysisDriver driver, String file, int offset) async {
+      String file, int offset) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     List<AnalysisErrorFixes> errorFixesList = <AnalysisErrorFixes>[];
-    AnalysisResult result = await server.getAnalysisResult(file);
+    var result = await server.getResolvedUnit(file);
     if (result != null) {
-      CompilationUnit unit = result.unit;
       LineInfo lineInfo = result.lineInfo;
       int requestLine = lineInfo.getLocation(offset).lineNumber;
-      List<engine.AnalysisError> errorsCopy = new List.from(result.errors);
       for (engine.AnalysisError error in result.errors) {
         int errorLine = lineInfo.getLocation(error.offset).lineNumber;
         if (errorLine == requestLine) {
-          AstProvider astProvider = new AstProviderForDriver(driver);
-          DartFixContext context = new _DartFixContextImpl(
-              server.resourceProvider,
-              result.driver,
-              astProvider,
-              unit,
-              error,
-              errorsCopy);
+          var workspace = DartChangeWorkspace(server.currentSessions);
+          var context = new DartFixContextImpl(workspace, result, error);
           List<Fix> fixes =
-              await new DefaultFixContributor().internalComputeFixes(context);
+              await new DartFixContributor().computeFixes(context);
           if (fixes.isNotEmpty) {
             fixes.sort(Fix.SORT_BY_RELEVANCE);
             AnalysisError serverError =
@@ -611,22 +571,22 @@
     List<RefactoringKind> kinds = <RefactoringKind>[];
     // Check nodes.
     {
-      var analysisResult = await server.getAnalysisResult(file);
-      if (analysisResult != null) {
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
         // Try EXTRACT_LOCAL_VARIABLE.
-        if (new ExtractLocalRefactoring(analysisResult, offset, length)
+        if (new ExtractLocalRefactoring(resolvedUnit, offset, length)
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_LOCAL_VARIABLE);
         }
         // Try EXTRACT_METHOD.
-        if (new ExtractMethodRefactoring(searchEngine,
-                server.getAstProvider(file), analysisResult, offset, length)
+        if (new ExtractMethodRefactoring(
+                searchEngine, resolvedUnit, offset, length)
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_METHOD);
         }
         // Try EXTRACT_WIDGETS.
         if (new ExtractWidgetRefactoring(
-                searchEngine, analysisResult, offset, length)
+                searchEngine, resolvedUnit, offset, length)
             .isAvailable()) {
           kinds.add(RefactoringKind.EXTRACT_WIDGET);
         }
@@ -634,23 +594,28 @@
     }
     // check elements
     {
-      Element element = await server.getElementAtOffset(file, offset);
-      if (element != null) {
-        // try CONVERT_METHOD_TO_GETTER
-        if (element is ExecutableElement) {
-          Refactoring refactoring = new ConvertMethodToGetterRefactoring(
-              searchEngine, server.getAstProvider(file), element);
-          RefactoringStatus status = await refactoring.checkInitialConditions();
-          if (!status.hasFatalError) {
-            kinds.add(RefactoringKind.CONVERT_METHOD_TO_GETTER);
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
+        var node = new NodeLocator(offset).searchWithin(resolvedUnit.unit);
+        var element = server.getElementOfNode(node);
+        if (element != null) {
+          // try CONVERT_METHOD_TO_GETTER
+          if (element is ExecutableElement) {
+            Refactoring refactoring = new ConvertMethodToGetterRefactoring(
+                searchEngine, resolvedUnit.session, element);
+            RefactoringStatus status =
+                await refactoring.checkInitialConditions();
+            if (!status.hasFatalError) {
+              kinds.add(RefactoringKind.CONVERT_METHOD_TO_GETTER);
+            }
           }
-        }
-        // try RENAME
-        {
-          RenameRefactoring renameRefactoring = new RenameRefactoring(
-              refactoringWorkspace, server.getAstProvider(file), element);
-          if (renameRefactoring != null) {
-            kinds.add(RefactoringKind.RENAME);
+          // try RENAME
+          {
+            RenameRefactoring renameRefactoring = new RenameRefactoring(
+                refactoringWorkspace, resolvedUnit.session, element);
+            if (renameRefactoring != null) {
+              kinds.add(RefactoringKind.RENAME);
+            }
           }
         }
       }
@@ -689,60 +654,6 @@
 }
 
 /**
- * Implementation of [DartAssistContext] that is based on the values passed
- * in the constructor, as opposite to be partially based on [AssistContext].
- */
-class _DartAssistContextForValues implements DartAssistContext {
-  @override
-  final Source source;
-
-  @override
-  final int selectionOffset;
-
-  @override
-  final int selectionLength;
-
-  @override
-  final AnalysisDriver analysisDriver;
-
-  @override
-  final CompilationUnit unit;
-
-  _DartAssistContextForValues(this.source, this.selectionOffset,
-      this.selectionLength, this.analysisDriver, this.unit);
-}
-
-/**
- * And implementation of [DartFixContext].
- */
-class _DartFixContextImpl implements DartFixContext {
-  @override
-  final ResourceProvider resourceProvider;
-
-  @override
-  final AnalysisDriver analysisDriver;
-
-  @override
-  final AstProvider astProvider;
-
-  @override
-  final CompilationUnit unit;
-
-  @override
-  final engine.AnalysisError error;
-
-  @override
-  final List<engine.AnalysisError> errors;
-
-  _DartFixContextImpl(this.resourceProvider, this.analysisDriver,
-      this.astProvider, this.unit, this.error, this.errors);
-
-  @override
-  GetTopLevelDeclarations get getTopLevelDeclarations =>
-      analysisDriver.getTopLevelNameDeclarations;
-}
-
-/**
  * An object managing a single [Refactoring] instance.
  *
  * The instance is identified by its kind, file, offset and length.
@@ -871,8 +782,8 @@
       }
       // create change
       result.change = await refactoring.createChange();
-      result.potentialEdits = nullIfEmpty(refactoring.potentialEditIds);
       _checkForReset_afterCreateChange();
+      result.potentialEdits = nullIfEmpty(refactoring.potentialEditIds);
       _sendResultResponse();
     }, onError: (exception, stackTrace) {
       if (exception is _ResetError) {
@@ -940,28 +851,35 @@
     }
     // create a new Refactoring instance
     if (kind == RefactoringKind.CONVERT_GETTER_TO_METHOD) {
-      Element element = await server.getElementAtOffset(file, offset);
-      if (element != null) {
-        if (element is ExecutableElement) {
-          refactoring = new ConvertGetterToMethodRefactoring(
-              searchEngine, server.getAstProvider(file), element);
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
+        var node = new NodeLocator(offset).searchWithin(resolvedUnit.unit);
+        var element = server.getElementOfNode(node);
+        if (element != null) {
+          if (element is ExecutableElement) {
+            refactoring = new ConvertGetterToMethodRefactoring(
+                searchEngine, resolvedUnit.session, element);
+          }
         }
       }
     }
     if (kind == RefactoringKind.CONVERT_METHOD_TO_GETTER) {
-      Element element = await server.getElementAtOffset(file, offset);
-      if (element != null) {
-        if (element is ExecutableElement) {
-          refactoring = new ConvertMethodToGetterRefactoring(
-              searchEngine, server.getAstProvider(file), element);
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
+        var node = new NodeLocator(offset).searchWithin(resolvedUnit.unit);
+        var element = server.getElementOfNode(node);
+        if (element != null) {
+          if (element is ExecutableElement) {
+            refactoring = new ConvertMethodToGetterRefactoring(
+                searchEngine, resolvedUnit.session, element);
+          }
         }
       }
     }
     if (kind == RefactoringKind.EXTRACT_LOCAL_VARIABLE) {
-      var analysisResult = await server.getAnalysisResult(file);
-      if (analysisResult != null) {
-        refactoring =
-            new ExtractLocalRefactoring(analysisResult, offset, length);
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
+        refactoring = new ExtractLocalRefactoring(resolvedUnit, offset, length);
         feedback = new ExtractLocalVariableFeedback(
             <String>[], <int>[], <int>[],
             coveringExpressionOffsets: <int>[],
@@ -969,34 +887,40 @@
       }
     }
     if (kind == RefactoringKind.EXTRACT_METHOD) {
-      var analysisResult = await server.getAnalysisResult(file);
-      if (analysisResult != null) {
-        refactoring = new ExtractMethodRefactoring(searchEngine,
-            server.getAstProvider(file), analysisResult, offset, length);
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
+        refactoring = new ExtractMethodRefactoring(
+            searchEngine, resolvedUnit, offset, length);
         feedback = new ExtractMethodFeedback(offset, length, '', <String>[],
             false, <RefactoringMethodParameter>[], <int>[], <int>[]);
       }
     }
     if (kind == RefactoringKind.EXTRACT_WIDGET) {
-      var analysisResult = await server.getAnalysisResult(file);
-      if (analysisResult != null) {
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
         refactoring = new ExtractWidgetRefactoring(
-            searchEngine, analysisResult, offset, length);
+            searchEngine, resolvedUnit, offset, length);
         feedback = new ExtractWidgetFeedback();
       }
     }
     if (kind == RefactoringKind.INLINE_LOCAL_VARIABLE) {
-      var analysisResult = await server.getAnalysisResult(file);
-      if (analysisResult != null) {
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
         refactoring = new InlineLocalRefactoring(
-            searchEngine, server.getAstProvider(file), analysisResult, offset);
+          searchEngine,
+          resolvedUnit,
+          offset,
+        );
       }
     }
     if (kind == RefactoringKind.INLINE_METHOD) {
-      var analysisResult = await server.getAnalysisResult(file);
-      if (analysisResult != null) {
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
         refactoring = new InlineMethodRefactoring(
-            searchEngine, server.getAstProvider(file), analysisResult, offset);
+          searchEngine,
+          resolvedUnit,
+          offset,
+        );
       }
     }
     if (kind == RefactoringKind.MOVE_FILE) {
@@ -1009,41 +933,20 @@
 //          server.resourceProvider, searchEngine, context, source, file);
     }
     if (kind == RefactoringKind.RENAME) {
-      AstNode node = await server.getNodeAtOffset(file, offset);
-      Element element = server.getElementOfNode(node);
-      if (node != null && element != null) {
-        int feedbackOffset = node.offset;
-        int feedbackLength = node.length;
+      var resolvedUnit = await server.getResolvedUnit(file);
+      if (resolvedUnit != null) {
+        var node = new NodeLocator(offset).searchWithin(resolvedUnit.unit);
+        var element = server.getElementOfNode(node);
+        if (node != null && element != null) {
+          final renameElement =
+              RenameRefactoring.getElementToRename(node, element);
 
-        if (element is FieldFormalParameterElement) {
-          element = (element as FieldFormalParameterElement).field;
+          // do create the refactoring
+          refactoring = new RenameRefactoring(refactoringWorkspace,
+              resolvedUnit.session, renameElement.element);
+          feedback = new RenameFeedback(
+              renameElement.offset, renameElement.length, 'kind', 'oldName');
         }
-
-        // Use the prefix offset/length when renaming an import directive.
-        if (node is ImportDirective && element is ImportElement) {
-          if (node.prefix != null) {
-            feedbackOffset = node.prefix.offset;
-            feedbackLength = node.prefix.length;
-          } else {
-            feedbackOffset = -1;
-            feedbackLength = 0;
-          }
-        }
-
-        // Rename the class when on `new` in an instance creation.
-        if (node is InstanceCreationExpression) {
-          InstanceCreationExpression creation = node;
-          var typeIdentifier = creation.constructorName.type.name;
-          element = typeIdentifier.staticElement;
-          feedbackOffset = typeIdentifier.offset;
-          feedbackLength = typeIdentifier.length;
-        }
-
-        // do create the refactoring
-        refactoring = new RenameRefactoring(
-            refactoringWorkspace, server.getAstProvider(file), element);
-        feedback = new RenameFeedback(
-            feedbackOffset, feedbackLength, 'kind', 'oldName');
       }
     }
     if (refactoring == null) {
diff --git a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
new file mode 100644
index 0000000..14bad20
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
@@ -0,0 +1,82 @@
+import 'package:analysis_server/src/edit/edit_dartfix.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+
+class NonNullableFix {
+  final EditDartFix dartFix;
+
+  /// The current source being "fixed"
+  Source source;
+
+  /// The source file change or `null` if none
+  SourceFileEdit fileEdit;
+
+  int firstOffset;
+  int firstLength;
+
+  NonNullableFix(this.dartFix);
+
+  void addEdit(int offset, int length, String replacementText) {
+    fileEdit ??= new SourceFileEdit(source.fullName, 0);
+    fileEdit.edits.add(new SourceEdit(offset, length, replacementText));
+  }
+
+  /// Update the source to be non-nullable by
+  /// 1) adding trailing '?' to type references of nullable variables, and
+  /// 2) removing trailing '?' from type references of non-nullable variables.
+  void applyLocalFixes(ResolvedUnitResult result) {
+    final context = result.session.analysisContext;
+    AnalysisOptionsImpl options = context.analysisOptions;
+    if (!options.experimentStatus.non_nullable) {
+      return;
+    }
+
+    final unit = result.unit;
+    source = unit.declaredElement.source;
+
+    // find and fix types
+    unit.accept(new _NonNullableTypeVisitor(this));
+
+    // add source changes to the collection of fixes
+    source = null;
+    if (fileEdit != null) {
+      dartFix.addSourceFileEdit('Update non-nullable type references',
+          dartFix.locationFor(result, firstOffset, firstLength), fileEdit);
+    }
+  }
+}
+
+class _NonNullableTypeVisitor extends RecursiveAstVisitor<void> {
+  final NonNullableFix fix;
+
+  _NonNullableTypeVisitor(this.fix);
+
+  @override
+  void visitConstructorName(ConstructorName node) {
+    // skip the type name associated with the constructor
+    node.type?.typeArguments?.accept(this);
+  }
+
+  @override
+  void visitTypeName(TypeName node) {
+    // TODO(danrubel): Replace this braindead implementation
+    // with something that determines whether or not the type should be nullable
+    // and adds or removes the trailing `?` to match.
+    if (node.question == null) {
+      final identifier = node.name;
+      if (identifier is SimpleIdentifier) {
+        if (identifier.name == 'void') {
+          return;
+        }
+      }
+      fix.addEdit(node.end, 0, '?');
+      fix.firstOffset ??= node.offset;
+      fix.firstLength ??= node.length;
+    }
+    super.visitTypeName(node);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart
index 52dda1f..871eb2b 100644
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,9 +6,10 @@
 import 'package:analysis_server/src/edit/edit_dartfix.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
-import 'package:analyzer/analyzer.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/error/error.dart';
 
 class PreferIntLiteralsFix extends LinterFix {
   final literalsToConvert = <DoubleLiteral>[];
@@ -16,19 +17,27 @@
   PreferIntLiteralsFix(EditDartFix dartFix) : super(dartFix);
 
   @override
-  Future<void> applyLocalFixes(AnalysisResult result) async {
+  Future<void> applyLocalFixes(ResolvedUnitResult result) async {
     while (literalsToConvert.isNotEmpty) {
       DoubleLiteral literal = literalsToConvert.removeLast();
       AssistProcessor processor = new AssistProcessor(
-          new EditDartFixAssistContext(dartFix, source, result.unit, literal));
+        new DartAssistContextImpl(
+          DartChangeWorkspace(dartFix.server.currentSessions),
+          result,
+          literal.offset,
+          0,
+        ),
+      );
       List<Assist> assists =
           await processor.computeAssist(DartAssistKind.CONVERT_TO_INT_LITERAL);
       final location =
           dartFix.locationFor(result, literal.offset, literal.length);
       if (assists.isNotEmpty) {
         for (Assist assist in assists) {
-          dartFix.addFix('Replace a double literal with an int literal',
-              location, assist.change);
+          dartFix.addSourceChange(
+              'Replace a double literal with an int literal',
+              location,
+              assist.change);
         }
       } else {
         // TODO(danrubel): If assists is empty, then determine why
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
index 52f924a..2972f49 100644
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,10 +6,11 @@
 import 'package:analysis_server/src/edit/edit_dartfix.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
-import 'package:analyzer/analyzer.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/error/error.dart';
 
 class PreferMixinFix extends LinterFix {
   final classesToConvert = new Set<Element>();
@@ -17,7 +18,7 @@
   PreferMixinFix(EditDartFix dartFix) : super(dartFix);
 
   @override
-  Future<void> applyLocalFixes(AnalysisResult result) {
+  Future<void> applyLocalFixes(ResolvedUnitResult result) {
     // All fixes applied in [applyRemainingFixes]
     return null;
   }
@@ -30,23 +31,27 @@
   }
 
   Future<void> convertClassToMixin(Element elem) async {
-    AnalysisResult result =
-        await dartFix.server.getAnalysisResult(elem.source?.fullName);
+    ResolvedUnitResult result =
+        await dartFix.server.getResolvedUnit(elem.source?.fullName);
 
     for (CompilationUnitMember declaration in result.unit.declarations) {
       if (declaration is ClassOrMixinDeclaration &&
           declaration.name.name == elem.name) {
         AssistProcessor processor = new AssistProcessor(
-            new EditDartFixAssistContext(
-                dartFix, elem.source, result.unit, declaration.name));
+          new DartAssistContextImpl(
+              DartChangeWorkspace(dartFix.server.currentSessions),
+              result,
+              declaration.name.offset,
+              0),
+        );
         List<Assist> assists = await processor
             .computeAssist(DartAssistKind.CONVERT_CLASS_TO_MIXIN);
         final location =
             dartFix.locationFor(result, elem.nameOffset, elem.nameLength);
         if (assists.isNotEmpty) {
           for (Assist assist in assists) {
-            dartFix.addFix('Convert ${elem.displayName} to a mixin', location,
-                assist.change);
+            dartFix.addSourceChange('Convert ${elem.displayName} to a mixin',
+                location, assist.change);
           }
         } else {
           // TODO(danrubel): If assists is empty, then determine why
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_correction.dart b/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
index 459baf7..3f92193 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
@@ -1,50 +1,38 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
 import 'package:analysis_server/src/services/correction/util.dart';
-import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:meta/meta.dart';
 
 class FlutterCorrections {
-  final String file;
-  final String fileContent;
-
+  final ResolvedUnitResult resolveResult;
   final int selectionOffset;
   final int selectionLength;
   final int selectionEnd;
-  final SourceRange selectionRange;
 
-  final AnalysisSession session;
-  final CompilationUnit unit;
+  final CorrectionUtils utils;
 
   AstNode node;
-  CorrectionUtils utils;
 
   FlutterCorrections(
-      {@required this.file,
-      @required this.fileContent,
+      {@required this.resolveResult,
       @required this.selectionOffset,
-      @required this.selectionLength,
-      @required this.session,
-      @required this.unit})
-      : assert(file != null),
-        assert(fileContent != null),
+      @required this.selectionLength})
+      : assert(resolveResult != null),
         assert(selectionOffset != null),
         assert(selectionLength != null),
-        assert(session != null),
-        assert(unit != null),
         selectionEnd = selectionOffset + selectionLength,
-        selectionRange = new SourceRange(selectionOffset, selectionLength) {
-    node = new NodeLocator(selectionOffset, selectionEnd).searchWithin(unit);
-    utils = new CorrectionUtils(unit, buffer: fileContent);
+        utils = new CorrectionUtils(resolveResult) {
+    node = new NodeLocator(selectionOffset, selectionEnd)
+        .searchWithin(resolveResult.unit);
   }
 
   /**
@@ -59,8 +47,8 @@
     if (node is ClassDeclaration) {
       var className = node.name.name;
       var location = utils.prepareNewConstructorLocation(node);
-      var changeBuilder = new DartChangeBuilder(session);
-      await changeBuilder.addFileEdit(file, (builder) {
+      var changeBuilder = new DartChangeBuilder(resolveResult.session);
+      await changeBuilder.addFileEdit(resolveResult.path, (builder) {
         builder.addInsertion(location.offset, (builder) {
           builder.write(location.prefix);
 
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
index 45698c4..27d5268 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -33,15 +33,13 @@
     String file = params.file;
     int offset = params.offset;
 
-    ResolveResult result = await server.getAnalysisResult(file);
+    ResolvedUnitResult result = await server.getResolvedUnit(file);
     if (result != null) {
       var corrections = new FlutterCorrections(
-          file: file,
-          fileContent: result.content,
-          selectionOffset: offset,
-          selectionLength: 0,
-          session: result.session,
-          unit: result.unit);
+        resolveResult: result,
+        selectionOffset: offset,
+        selectionLength: 0,
+      );
       SourceChange change = await corrections.addForDesignTimeConstructor();
       if (change != null) {
         server.sendResponse(
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
index a468fd4..054a199 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,13 +6,19 @@
 import 'package:analysis_server/src/flutter/flutter_outline_computer.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 
-void sendFlutterNotificationOutline(AnalysisServer server, String file,
-    String content, LineInfo lineInfo, CompilationUnit dartUnit) {
+void sendFlutterNotificationOutline(
+    AnalysisServer server,
+    String file,
+    String content,
+    LineInfo lineInfo,
+    CompilationUnit dartUnit,
+    TypeProvider typeProvider) {
   _sendNotification(server, () {
-    var computer =
-        new FlutterOutlineComputer(file, content, lineInfo, dartUnit);
+    var computer = new FlutterOutlineComputer(
+        file, content, lineInfo, dartUnit, typeProvider);
     protocol.FlutterOutline outline = computer.compute();
     // send notification
     var params = new protocol.FlutterOutlineParams(file, outline,
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index f1d5470..d6fae03 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -45,8 +45,8 @@
   final List<protocol.SourceEdit> instrumentationEdits = [];
   String instrumentedCode;
 
-  FlutterOutlineComputer(this.file, this.content, this.lineInfo, this.unit)
-      : typeProvider = unit.declaredElement.context.typeProvider;
+  FlutterOutlineComputer(
+      this.file, this.content, this.lineInfo, this.unit, this.typeProvider);
 
   protocol.FlutterOutline compute() {
     protocol.Outline dartOutline = new DartUnitOutlineComputer(
diff --git a/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart b/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
new file mode 100644
index 0000000..b81c125
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/channel/lsp_byte_stream_channel.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
+import 'package:analysis_server/src/lsp/lsp_packet_transformer.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+
+/**
+ * Instances of the class [LspByteStreamServerChannel] implement an
+ * [LspServerCommunicationChannel] that uses a stream and a sink (typically,
+ * standard input and standard output) to communicate with clients.
+ */
+class LspByteStreamServerChannel implements LspServerCommunicationChannel {
+  final Stream _input;
+
+  final IOSink _output;
+
+  final InstrumentationService _instrumentationService;
+
+  /**
+   * Completer that will be signalled when the input stream is closed.
+   */
+  final Completer _closed = new Completer();
+
+  /**
+   * True if [close] has been called.
+   */
+  bool _closeRequested = false;
+
+  LspByteStreamServerChannel(
+      this._input, this._output, this._instrumentationService);
+
+  /**
+   * Future that will be completed when the input stream is closed.
+   */
+  Future get closed {
+    return _closed.future;
+  }
+
+  @override
+  void close() {
+    if (!_closeRequested) {
+      _closeRequested = true;
+      assert(!_closed.isCompleted);
+      _closed.complete();
+    }
+  }
+
+  @override
+  void listen(void onMessage(Message message),
+      {Function onError, void onDone()}) {
+    _input.transform(new LspPacketTransformer()).listen(
+      (String data) => _readMessage(data, onMessage),
+      onError: onError,
+      onDone: () {
+        close();
+        onDone();
+      },
+    );
+  }
+
+  @override
+  void sendNotification(NotificationMessage notification) =>
+      _sendLsp(notification.toJson());
+
+  @override
+  void sendRequest(RequestMessage request) => _sendLsp(request.toJson());
+
+  @override
+  void sendResponse(ResponseMessage response) => _sendLsp(response.toJson());
+
+  /**
+   * Read a request from the given [data] and use the given function to handle
+   * the message.
+   */
+  void _readMessage(String data, void onMessage(Message request)) {
+    // Ignore any further requests after the communication channel is closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    ServerPerformanceStatistics.serverChannel.makeCurrentWhile(() {
+      _instrumentationService.logRequest(data);
+      final Map<String, Object> json = jsonDecode(data);
+      if (RequestMessage.canParse(json)) {
+        onMessage(RequestMessage.fromJson(json));
+      } else if (NotificationMessage.canParse(json)) {
+        onMessage(NotificationMessage.fromJson(json));
+      } else if (ResponseMessage.canParse(json)) {
+        onMessage(ResponseMessage.fromJson(json));
+      } else {
+        _sendParseError();
+      }
+    });
+  }
+
+  /// Sends a message prefixed with the required LSP headers.
+  void _sendLsp(Map<String, Object> json) {
+    // Don't send any further responses after the communication channel is
+    // closed.
+    if (_closeRequested) {
+      return;
+    }
+    ServerPerformanceStatistics.serverChannel.makeCurrentWhile(() {
+      final jsonEncodedBody = jsonEncode(json);
+      final utf8EncodedBody = utf8.encode(jsonEncodedBody);
+      final header = 'Content-Length: ${utf8EncodedBody.length}\r\n'
+          'Content-Type: application/vscode-jsonrpc; charset=utf-8\r\n\r\n';
+      final asciiEncodedHeader = ascii.encode(header);
+
+      // Header is always ascii, body is always utf8!
+      _write(asciiEncodedHeader);
+      _write(utf8EncodedBody);
+
+      _instrumentationService.logResponse(jsonEncodedBody);
+    });
+  }
+
+  void _sendParseError() {
+    final error = new ResponseMessage(
+        null,
+        null,
+        new ResponseError(
+            ErrorCodes.ParseError, 'Unable to parse message', null),
+        jsonRpcVersion);
+    sendResponse(error);
+  }
+
+  /**
+   * Send [bytes] to [_output].
+   */
+  void _write(List<int> bytes) {
+    runZoned(
+      () => _output.add(bytes),
+      onError: (e) => close(),
+    );
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/channel/lsp_channel.dart b/pkg/analysis_server/lib/src/lsp/channel/lsp_channel.dart
new file mode 100644
index 0000000..5471e01
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/channel/lsp_channel.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+/**
+ * The abstract class [LspServerCommunicationChannel] defines the behavior of
+ * objects that allow an [LspAnalysisServer] to receive [RequestMessage]s and
+ * [NotificationMessage]s and to return both [ResponseMessage]s and
+ * [NotificationMessage]s.
+ */
+abstract class LspServerCommunicationChannel {
+  Future get closed;
+
+  /**
+   * Close the communication channel.
+   */
+  void close();
+
+  /**
+   * Listen to the channel for messages. If a message is received, invoke the
+   * [onMessage] function. If an error is encountered while trying to read from
+   * the socket, invoke the [onError] function. If the socket is closed by the
+   * client, invoke the [onDone] function.
+   * Only one listener is allowed per channel.
+   */
+  void listen(void onMessage(Message message),
+      {Function onError, void onDone()});
+
+  /**
+   * Send the given [notification] to the client.
+   */
+  void sendNotification(NotificationMessage notification);
+
+  /**
+   * Send the given [request] to the client.
+   */
+  void sendRequest(RequestMessage request);
+
+  /**
+   * Send the given [response] to the client.
+   */
+  void sendResponse(ResponseMessage response);
+}
diff --git a/pkg/analysis_server/lib/src/lsp/constants.dart b/pkg/analysis_server/lib/src/lsp/constants.dart
new file mode 100644
index 0000000..464ab95
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/constants.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+
+/// Constants for command IDs that are exchanged between LSP client/server.
+abstract class Commands {
+  /// A list of all commands IDs that can be sent to the client to inform which
+  /// commands should be sent to the server for execution (as opposed to being
+  /// executed in the local plugin).
+  static const serverSupportedCommands = [sortMembers, organizeImports];
+  static const sortMembers = 'edit.sortMembers';
+  static const organizeImports = 'edit.organizeImports';
+}
+
+/// CodeActionKinds supported by the server that are not declared in the LSP spec.
+abstract class DartCodeActionKind {
+  /// A list of all supported CodeAction kinds, supplied to the client during
+  /// initialization to allow enabling features based upon them.
+  static const serverSupportedKinds = [
+    CodeActionKind.Source,
+    // We have to explicitly list this for the client to enable built-in command.
+    CodeActionKind.SourceOrganizeImports,
+    SortMembers,
+    CodeActionKind.QuickFix,
+  ];
+  static const SortMembers = const CodeActionKind('source.sortMembers');
+}
+
+abstract class ServerErrorCodes {
+  // JSON-RPC reserves -32000 to -32099 for implementation-defined server-errors.
+  static const ServerAlreadyStarted = const ErrorCodes(-32000);
+  static const UnhandledError = const ErrorCodes(-32001);
+  static const ServerAlreadyInitialized = const ErrorCodes(-32002);
+  static const InvalidFilePath = const ErrorCodes(-32003);
+  static const InvalidFileLineCol = const ErrorCodes(-32004);
+  static const UnknownCommand = const ErrorCodes(-32005);
+  static const InvalidCommandArguments = const ErrorCodes(-32006);
+  static const FileNotAnalyzed = const ErrorCodes(-32007);
+  static const FileHasErrors = const ErrorCodes(-32008);
+  static const ClientFailedToApplyEdit = const ErrorCodes(-32009);
+  static const RenameNotValid = const ErrorCodes(-32010);
+
+  /// An error raised when the server detects that the server and client are out
+  /// of sync and cannot recover. For example if a textDocument/didChange notification
+  /// has invalid offsets, suggesting the client and server have become out of sync
+  /// and risk invalid modifications to a file.
+  ///
+  /// The server should detect this error being returned, log it, then exit.
+  /// The client is expected to behave as suggested in the spec:
+  ///
+  ///  "If a client notices that a server exists unexpectedly it should try to
+  ///   restart the server. However clients should be careful to not restart a
+  ///   crashing server endlessly. VS Code for example doesn't restart a server
+  ///   if it crashes 5 times in the last 180 seconds."
+  static const ClientServerInconsistentState = const ErrorCodes(-32010);
+}
diff --git a/pkg/analysis_server/lib/src/lsp/dartdoc.dart b/pkg/analysis_server/lib/src/lsp/dartdoc.dart
new file mode 100644
index 0000000..dd2de9e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/dartdoc.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+final _dartdocCodeBlockSections = new RegExp(r'(```\w+) +\w+');
+final _dartdocDirectives =
+    new RegExp(r'(\n *{@.*?}$)|(^{@.*?}\n)', multiLine: true);
+
+String cleanDartdoc(String doc) {
+  if (doc == null) {
+    return null;
+  }
+  // Remove any dartdoc directives like {@template xxx}
+  doc = doc.replaceAll(_dartdocDirectives, '');
+
+  // Remove any code block section names like ```dart preamble that Flutter
+  // docs contain.
+  doc = doc.replaceAllMapped(
+    _dartdocCodeBlockSections,
+    (match) => match.group(1),
+  );
+
+  return doc;
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
new file mode 100644
index 0000000..4161f20
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/organize_imports.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/services/correction/organize_directives.dart';
+
+class OrganizeImportsCommandHandler extends SimpleEditCommandHandler {
+  OrganizeImportsCommandHandler(LspAnalysisServer server) : super(server);
+
+  @override
+  String get commandName => 'Organize Imports';
+
+  @override
+  Future<ErrorOr<void>> handle(List<dynamic> arguments) async {
+    if (arguments == null || arguments.length != 1 || arguments[0] is! String) {
+      return ErrorOr.error(new ResponseError(
+        ServerErrorCodes.InvalidCommandArguments,
+        '$commandName requires a single String parameter containing the path of a Dart file',
+        null,
+      ));
+    }
+
+    // Get the version of the doc before we calculate edits so we can send it back
+    // to the client so that they can discard this edit if the document has been
+    // modified since.
+    final path = arguments.single;
+    final docIdentifier = server.getVersionedDocumentIdentifier(path);
+
+    final result = await requireUnit(path);
+    return result.mapResult((result) {
+      final code = result.content;
+      final unit = result.unit;
+
+      if (hasScanParseErrors(result.errors)) {
+        return ErrorOr.error(new ResponseError(
+          ServerErrorCodes.FileHasErrors,
+          'Unable to $commandName because the file contains parse errors',
+          path,
+        ));
+      }
+
+      final organizer = new DirectiveOrganizer(code, unit, result.errors);
+      final edits = organizer.organize();
+
+      return sendEditsToClient(docIdentifier, unit, edits);
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
new file mode 100644
index 0000000..24c7b7d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/lsp/source_edits.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/error/error.dart' as engine;
+import 'package:analyzer/src/dart/scanner/scanner.dart' as engine;
+import 'package:analyzer/src/error/codes.dart' as engine;
+import 'package:analyzer/src/generated/engine.dart' as engine;
+import 'package:analyzer/src/generated/parser.dart' as engine;
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+
+abstract class SimpleEditCommandHandler
+    extends CommandHandler<ExecuteCommandParams, Object> {
+  SimpleEditCommandHandler(LspAnalysisServer server) : super(server);
+
+  String get commandName;
+
+  Future<ErrorOr<void>> sendEditsToClient(
+      VersionedTextDocumentIdentifier docIdentifier,
+      CompilationUnit unit,
+      List<SourceEdit> edits) async {
+    // If there are no edits to apply, just complete the command without going
+    // back to the client.
+    if (edits.length == 0) {
+      return success();
+    }
+
+    final workspaceEdit = toWorkspaceEdit(
+      server.clientCapabilities?.workspace,
+      [new FileEditInformation(docIdentifier, unit.lineInfo, edits)],
+    );
+
+    // Send the edit to the client via a applyEdit request (this is a request
+    // from server -> client and the client will provide a response).
+    final editResponse = await server.sendRequest(Method.workspace_applyEdit,
+        new ApplyWorkspaceEditParams(commandName, workspaceEdit));
+
+    if (editResponse.error != null) {
+      return error(
+        ServerErrorCodes.ClientFailedToApplyEdit,
+        'Client failed to apply workspace edit for $commandName',
+        editResponse.error,
+      );
+    }
+
+    // Now respond to this command request telling the client whether it was
+    // successful (since the client doesn't know that the workspace edit it was
+    // sent - and may have failed to apply - was related to this command
+    // execution).
+    // We need to fromJson to convert the JSON map to the real types.
+    final editResponseResult =
+        ApplyWorkspaceEditResponse.fromJson(editResponse.result);
+    if (editResponseResult.applied) {
+      return success();
+    } else {
+      return error(
+        ServerErrorCodes.ClientFailedToApplyEdit,
+        'Client failed to apply workspace edit for $commandName',
+        workspaceEdit,
+      );
+    }
+  }
+
+  bool hasScanParseErrors(List<engine.AnalysisError> errors) {
+    return errors.any((error) =>
+        error.errorCode is engine.ScannerErrorCode ||
+        error.errorCode is engine.ParserErrorCode);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
new file mode 100644
index 0000000..680d466
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/sort_members.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/commands/simple_edit_handler.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/services/correction/sort_members.dart';
+
+class SortMembersCommandHandler extends SimpleEditCommandHandler {
+  SortMembersCommandHandler(LspAnalysisServer server) : super(server);
+
+  @override
+  String get commandName => 'Sort Members';
+
+  @override
+  Future<ErrorOr<void>> handle(List<dynamic> arguments) async {
+    if (arguments == null || arguments.length != 1 || arguments[0] is! String) {
+      return ErrorOr.error(new ResponseError(
+        ServerErrorCodes.InvalidCommandArguments,
+        '$commandName requires a single String parameter containing the path of a Dart file',
+        null,
+      ));
+    }
+
+    // Get the version of the doc before we calculate edits so we can send it back
+    // to the client so that they can discard this edit if the document has been
+    // modified since.
+    final path = arguments.single;
+    final docIdentifier = server.getVersionedDocumentIdentifier(path);
+
+    var driver = server.getAnalysisDriver(path);
+    final result = await driver?.parseFile(path);
+    if (result == null) {
+      return ErrorOr.error(new ResponseError(
+        ServerErrorCodes.FileNotAnalyzed,
+        '$commandName is only available for analyzed files',
+        null,
+      ));
+    }
+    final code = result.content;
+    final unit = result.unit;
+
+    if (hasScanParseErrors(result.errors)) {
+      return ErrorOr.error(new ResponseError(
+        ServerErrorCodes.FileHasErrors,
+        'Unable to $commandName because the file contains parse errors',
+        path,
+      ));
+    }
+
+    final sorter = new MemberSorter(code, unit);
+    final edits = sorter.sort();
+    return await sendEditsToClient(docIdentifier, unit, edits);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
new file mode 100644
index 0000000..6823eb8
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_change_workspace_folders.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+class WorkspaceFoldersHandler
+    extends MessageHandler<DidChangeWorkspaceFoldersParams, void> {
+  WorkspaceFoldersHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.workspace_didChangeWorkspaceFolders;
+
+  @override
+  DidChangeWorkspaceFoldersParams convertParams(Map<String, dynamic> json) =>
+      DidChangeWorkspaceFoldersParams.fromJson(json);
+
+  ErrorOr<void> handle(DidChangeWorkspaceFoldersParams params) {
+    final added = params?.event?.added
+        ?.map((wf) => Uri.parse(wf.uri).toFilePath())
+        ?.toList();
+
+    final removed = params?.event?.removed
+        ?.map((wf) => Uri.parse(wf.uri).toFilePath())
+        ?.toList();
+
+    server.updateAnalysisRoots(added, removed);
+
+    return success();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
new file mode 100644
index 0000000..41d3014
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_code_actions.dart
@@ -0,0 +1,268 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
+import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart'
+    show InconsistentAnalysisException;
+import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
+
+class CodeActionHandler extends MessageHandler<CodeActionParams,
+    List<Either2<Command, CodeAction>>> {
+  CodeActionHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_codeAction;
+
+  @override
+  CodeActionParams convertParams(Map<String, dynamic> json) =>
+      CodeActionParams.fromJson(json);
+
+  Future<ErrorOr<List<Either2<Command, CodeAction>>>> handle(
+      CodeActionParams params) async {
+    final capabilities = server?.clientCapabilities?.textDocument?.codeAction;
+
+    final clientSupportsLiteralCodeActions =
+        capabilities?.codeActionLiteralSupport != null;
+
+    final clientSupportedCodeActionKinds = new HashSet<CodeActionKind>.of(
+        capabilities?.codeActionLiteralSupport?.codeActionKind?.valueSet ?? []);
+
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+
+    return unit.mapResult((unit) {
+      final startOffset = toOffset(unit.lineInfo, params.range.start);
+      final endOffset = toOffset(unit.lineInfo, params.range.end);
+      return startOffset.mapResult((startOffset) {
+        return endOffset.mapResult((endOffset) {
+          final offset = startOffset;
+          final length = endOffset - startOffset;
+          return _getCodeActions(
+              clientSupportedCodeActionKinds,
+              clientSupportsLiteralCodeActions,
+              path.result,
+              params.range,
+              offset,
+              length,
+              unit);
+        });
+      });
+    });
+  }
+
+  /// Wraps a command in a CodeAction if the client supports it so that a
+  /// CodeActionKind can be supplied.
+  Either2<Command, CodeAction> _commandOrCodeAction(
+    bool clientSupportsLiteralCodeActions,
+    CodeActionKind kind,
+    Command command,
+  ) {
+    return clientSupportsLiteralCodeActions
+        ? Either2<Command, CodeAction>.t2(
+            new CodeAction(command.title, kind, null, null, command),
+          )
+        : Either2<Command, CodeAction>.t1(command);
+  }
+
+  /// Creates a CodeAction to apply this assist. Note: This code will fetch the
+  /// version of each document being modified so it's important to call this
+  /// immediately after computing edits to ensure the document is not modified
+  /// before the version number is read.
+  Either2<Command, CodeAction> _createAssistAction(Assist assist) {
+    return new Either2<Command, CodeAction>.t2(new CodeAction(
+      assist.change.message,
+      CodeActionKind.Refactor,
+      const [],
+      createWorkspaceEdit(server, assist.change),
+      null,
+    ));
+  }
+
+  /// Creates a CodeAction to apply this fix. Note: This code will fetch the
+  /// version of each document being modified so it's important to call this
+  /// immediately after computing edits to ensure the document is not modified
+  /// before the version number is read.
+  Either2<Command, CodeAction> _createFixAction(
+      Fix fix, Diagnostic diagnostic) {
+    return new Either2<Command, CodeAction>.t2(new CodeAction(
+      fix.change.message,
+      CodeActionKind.QuickFix,
+      [diagnostic],
+      createWorkspaceEdit(server, fix.change),
+      null,
+    ));
+  }
+
+  Future<List<Either2<Command, CodeAction>>> _getAssistActions(
+    HashSet<CodeActionKind> clientSupportedCodeActionKinds,
+    bool clientSupportsLiteralCodeActions,
+    int offset,
+    int length,
+    ResolvedUnitResult unit,
+  ) async {
+    // TODO(dantup): Is it acceptable not to support these for clients that can't
+    // handle Code Action literals? (Doing so requires we encode this into a
+    // command/arguments set and allow the client to call us back later).
+    if (!clientSupportsLiteralCodeActions ||
+        !clientSupportedCodeActionKinds.contains(CodeActionKind.Refactor)) {
+      return const [];
+    }
+
+    try {
+      var context = new DartAssistContextImpl(
+        DartChangeWorkspace(server.currentSessions),
+        unit,
+        offset,
+        length,
+      );
+      final processor = new AssistProcessor(context);
+      final assists = await processor.compute();
+      assists.sort(Assist.SORT_BY_RELEVANCE);
+
+      return assists.map(_createAssistAction).toList();
+    } on InconsistentAnalysisException {
+      // If an InconsistentAnalysisException occurs, it's likely the user modified
+      // the source and therefore is no longer interested in the results, so
+      // just return an empty set.
+      return [];
+    }
+  }
+
+  Future<ErrorOr<List<Either2<Command, CodeAction>>>> _getCodeActions(
+    HashSet<CodeActionKind> kinds,
+    bool supportsLiterals,
+    String path,
+    Range range,
+    int offset,
+    int length,
+    ResolvedUnitResult unit,
+  ) async {
+    final results = await Future.wait([
+      _getSourceActions(kinds, supportsLiterals, path),
+      _getAssistActions(kinds, supportsLiterals, offset, length, unit),
+      _getRefactorActions(kinds, supportsLiterals, path, range, unit),
+      _getFixActions(kinds, supportsLiterals, range, unit),
+    ]);
+    final flatResults = results.expand((x) => x).toList();
+    return success(flatResults);
+  }
+
+  Future<List<Either2<Command, CodeAction>>> _getFixActions(
+    HashSet<CodeActionKind> clientSupportedCodeActionKinds,
+    bool clientSupportsLiteralCodeActions,
+    Range range,
+    ResolvedUnitResult unit,
+  ) async {
+    // TODO(dantup): Is it acceptable not to support these for clients that can't
+    // handle Code Action literals? (Doing so requires we encode this into a
+    // command/arguments set and allow the client to call us back later).
+    if (!clientSupportsLiteralCodeActions ||
+        !clientSupportedCodeActionKinds.contains(CodeActionKind.QuickFix)) {
+      return const [];
+    }
+
+    final lineInfo = unit.lineInfo;
+    final codeActions = <Either2<Command, CodeAction>>[];
+    final fixContributor = new DartFixContributor();
+
+    try {
+      for (final error in unit.errors) {
+        // Server lineNumber is one-based so subtract one.
+        int errorLine = lineInfo.getLocation(error.offset).lineNumber - 1;
+        if (errorLine >= range.start.line && errorLine <= range.end.line) {
+          var workspace = DartChangeWorkspace(server.currentSessions);
+          var context = new DartFixContextImpl(workspace, unit, error);
+          final fixes = await fixContributor.computeFixes(context);
+          if (fixes.isNotEmpty) {
+            fixes.sort(Fix.SORT_BY_RELEVANCE);
+
+            final diagnostic = toDiagnostic(lineInfo, error);
+            codeActions.addAll(
+              fixes.map((fix) => _createFixAction(fix, diagnostic)),
+            );
+          }
+        }
+      }
+      return codeActions;
+    } on InconsistentAnalysisException {
+      // If an InconsistentAnalysisException occurs, it's likely the user modified
+      // the source and therefore is no longer interested in the results, so
+      // just return an empty set.
+      return [];
+    }
+  }
+
+  Future<List<Either2<Command, CodeAction>>> _getRefactorActions(
+    HashSet<CodeActionKind> clientSupportedCodeActionKinds,
+    bool clientSupportsLiteralCodeActions,
+    String path,
+    Range range,
+    ResolvedUnitResult unit,
+  ) async {
+    // TODO(dantup): Is it acceptable not to support these for clients that can't
+    // handle Code Action literals? (Doing so requires we encode this into a
+    // command/arguments set and allow the client to call us back later).
+    if (!clientSupportsLiteralCodeActions ||
+        !clientSupportedCodeActionKinds.contains(CodeActionKind.Refactor)) {
+      return const [];
+    }
+
+    try {
+      // TODO(dantup): Implement refactors.
+      return [];
+    } on InconsistentAnalysisException {
+      // If an InconsistentAnalysisException occurs, it's likely the user modified
+      // the source and therefore is no longer interested in the results, so
+      // just return an empty set.
+      return [];
+    }
+  }
+
+  /// Gets "Source" CodeActions, which are actions that apply to whole files of
+  /// source such as Sort Members and Organise Imports.
+  Future<List<Either2<Command, CodeAction>>> _getSourceActions(
+    HashSet<CodeActionKind> clientSupportedCodeActionKinds,
+    bool clientSupportsLiteralCodeActions,
+    String path,
+  ) async {
+    // The source actions supported are only valid for Dart files.
+    if (!AnalysisEngine.isDartFileName(path)) {
+      return [];
+    }
+
+    // If the client told us what kinds they support but it does not include
+    // Source then don't return any.
+    if (clientSupportsLiteralCodeActions &&
+        !clientSupportedCodeActionKinds.contains(CodeActionKind.Source)) {
+      return [];
+    }
+
+    return [
+      _commandOrCodeAction(
+        clientSupportsLiteralCodeActions,
+        DartCodeActionKind.SortMembers,
+        new Command('Sort Members', Commands.sortMembers, [path]),
+      ),
+      _commandOrCodeAction(
+        clientSupportsLiteralCodeActions,
+        CodeActionKind.SourceOrganizeImports,
+        new Command('Organize Imports', Commands.organizeImports, [path]),
+      ),
+    ];
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
new file mode 100644
index 0000000..bc81078
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/provisional/completion/completion_core.dart';
+import 'package:analysis_server/src/services/completion/completion_core.dart';
+import 'package:analysis_server/src/services/completion/completion_performance.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+
+// If the client does not provide capabilities.completion.completionItemKind.valueSet
+// then we must never send a kind that's not in this list.
+final defaultSupportedCompletionKinds = new HashSet<CompletionItemKind>.of([
+  CompletionItemKind.Text,
+  CompletionItemKind.Method,
+  CompletionItemKind.Function,
+  CompletionItemKind.Constructor,
+  CompletionItemKind.Field,
+  CompletionItemKind.Variable,
+  CompletionItemKind.Class,
+  CompletionItemKind.Interface,
+  CompletionItemKind.Module,
+  CompletionItemKind.Property,
+  CompletionItemKind.Unit,
+  CompletionItemKind.Value,
+  CompletionItemKind.Enum,
+  CompletionItemKind.Keyword,
+  CompletionItemKind.Snippet,
+  CompletionItemKind.Color,
+  CompletionItemKind.File,
+  CompletionItemKind.Reference,
+]);
+
+class CompletionHandler
+    extends MessageHandler<CompletionParams, List<CompletionItem>> {
+  CompletionHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_completion;
+
+  @override
+  CompletionParams convertParams(Map<String, dynamic> json) =>
+      CompletionParams.fromJson(json);
+
+  Future<ErrorOr<List<CompletionItem>>> handle(CompletionParams params) async {
+    final completionCapabilities =
+        server?.clientCapabilities?.textDocument?.completion;
+
+    final clientSupportedCompletionKinds =
+        completionCapabilities?.completionItemKind?.valueSet != null
+            ? new HashSet<CompletionItemKind>.of(
+                completionCapabilities.completionItemKind.valueSet)
+            : defaultSupportedCompletionKinds;
+
+    final pos = params.position;
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
+    return offset.mapResult((offset) => _getItems(
+          completionCapabilities,
+          clientSupportedCompletionKinds,
+          unit.result,
+          offset,
+        ));
+  }
+
+  Future<ErrorOr<List<CompletionItem>>> _getItems(
+    TextDocumentClientCapabilitiesCompletion completionCapabilities,
+    HashSet<CompletionItemKind> clientSupportedCompletionKinds,
+    ResolvedUnitResult unit,
+    int offset,
+  ) async {
+    final performance = new CompletionPerformance();
+    performance.path = unit.path;
+    performance.setContentsAndOffset(unit.content, offset);
+    server.performanceStats.completion.add(performance);
+
+    final completionRequest =
+        new CompletionRequestImpl(unit, offset, performance);
+
+    try {
+      CompletionContributor contributor = new DartCompletionManager();
+      final items = await contributor.computeSuggestions(completionRequest);
+
+      performance.notificationCount = 1;
+      performance.suggestionCountFirst = items.length;
+      performance.suggestionCountLast = items.length;
+      performance.complete();
+
+      return success(items
+          .map((item) => toCompletionItem(
+                completionCapabilities,
+                clientSupportedCompletionKinds,
+                unit.lineInfo,
+                item,
+                completionRequest.replacementOffset,
+                completionRequest.replacementLength,
+              ))
+          .toList());
+    } on AbortCompletion {
+      return success([]);
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
new file mode 100644
index 0000000..c3e9246
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_definition.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/protocol_server.dart' show NavigationTarget;
+import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+
+class DefinitionHandler
+    extends MessageHandler<TextDocumentPositionParams, List<Location>> {
+  DefinitionHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_definition;
+
+  @override
+  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
+      TextDocumentPositionParams.fromJson(json);
+
+  Future<ErrorOr<List<Location>>> handle(
+      TextDocumentPositionParams params) async {
+    final pos = params.position;
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
+
+    return offset.mapResult((offset) {
+      NavigationCollectorImpl collector = new NavigationCollectorImpl();
+      computeDartNavigation(
+          server.resourceProvider, collector, unit.result.unit, offset, 0);
+
+      Location toLocation(NavigationTarget target) {
+        final targetFilePath = collector.files[target.fileIndex];
+        final lineInfo = server.getLineInfo(targetFilePath);
+        return navigationTargetToLocation(targetFilePath, target, lineInfo);
+      }
+
+      return success(convert(collector.targets, toLocation).toList());
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
new file mode 100644
index 0000000..9f6822e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_highlights.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/domains/analysis/occurrences.dart';
+import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+
+class DocumentHighlightsHandler extends MessageHandler<
+    TextDocumentPositionParams, List<DocumentHighlight>> {
+  DocumentHighlightsHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_documentHighlight;
+
+  @override
+  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
+      TextDocumentPositionParams.fromJson(json);
+
+  Future<ErrorOr<List<DocumentHighlight>>> handle(
+      TextDocumentPositionParams params) async {
+    final pos = params.position;
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
+
+    return offset.mapResult((requestedOffset) {
+      final collector = new OccurrencesCollectorImpl();
+      addDartOccurrences(collector, unit.result.unit);
+
+      // Find an occurrence that has an instance that spans the position.
+      for (final occurrence in collector.allOccurrences) {
+        bool spansRequestedPosition(int offset) {
+          return offset <= requestedOffset &&
+              offset + occurrence.length >= requestedOffset;
+        }
+
+        if (occurrence.offsets.any(spansRequestedPosition)) {
+          return success(toHighlights(unit.result.lineInfo, occurrence));
+        }
+      }
+
+      // No matches.
+      return success(null);
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
new file mode 100644
index 0000000..e1fda79
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_document_symbols.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/computer/computer_outline.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/protocol_server.dart' show Outline;
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/source/line_info.dart';
+
+// If the client does not provide capabilities.documentSymbol.symbolKind.valueSet
+// then we must never send a kind that's not in this list.
+final defaultSupportedSymbolKinds = new HashSet<SymbolKind>.of([
+  SymbolKind.File,
+  SymbolKind.Module,
+  SymbolKind.Namespace,
+  SymbolKind.Package,
+  SymbolKind.Class,
+  SymbolKind.Method,
+  SymbolKind.Property,
+  SymbolKind.Field,
+  SymbolKind.Constructor,
+  SymbolKind.Enum,
+  SymbolKind.Interface,
+  SymbolKind.Function,
+  SymbolKind.Variable,
+  SymbolKind.Constant,
+  SymbolKind.Str,
+  SymbolKind.Number,
+  SymbolKind.Boolean,
+  SymbolKind.Array,
+]);
+
+class DocumentSymbolHandler extends MessageHandler<DocumentSymbolParams,
+    Either2<List<DocumentSymbol>, List<SymbolInformation>>> {
+  DocumentSymbolHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_documentSymbol;
+
+  @override
+  DocumentSymbolParams convertParams(Map<String, dynamic> json) =>
+      DocumentSymbolParams.fromJson(json);
+
+  Future<ErrorOr<Either2<List<DocumentSymbol>, List<SymbolInformation>>>>
+      handle(DocumentSymbolParams params) async {
+    final symbolCapabilities =
+        server?.clientCapabilities?.textDocument?.documentSymbol;
+
+    final clientSupportedSymbolKinds =
+        symbolCapabilities?.symbolKind?.valueSet != null
+            ? new HashSet<SymbolKind>.of(symbolCapabilities.symbolKind.valueSet)
+            : defaultSupportedSymbolKinds;
+
+    final clientSupportsDocumentSymbol =
+        symbolCapabilities?.hierarchicalDocumentSymbolSupport ?? false;
+
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    return unit.mapResult((unit) => _getSymbols(clientSupportedSymbolKinds,
+        clientSupportsDocumentSymbol, path.result, unit));
+  }
+
+  DocumentSymbol _asDocumentSymbol(
+    HashSet<SymbolKind> clientSupportedSymbolKinds,
+    LineInfo lineInfo,
+    Outline outline,
+  ) {
+    return new DocumentSymbol(
+      outline.element.name,
+      outline.element.parameters,
+      elementKindToSymbolKind(clientSupportedSymbolKinds, outline.element.kind),
+      outline.element.isDeprecated,
+      toRange(lineInfo, outline.codeOffset, outline.codeLength),
+      toRange(lineInfo, outline.element.location.offset,
+          outline.element.location.length),
+      outline.children
+          ?.map((child) =>
+              _asDocumentSymbol(clientSupportedSymbolKinds, lineInfo, child))
+          ?.toList(),
+    );
+  }
+
+  SymbolInformation _asSymbolInformation(
+    String containerName,
+    HashSet<SymbolKind> clientSupportedSymbolKinds,
+    String documentUri,
+    LineInfo lineInfo,
+    Outline outline,
+  ) {
+    return new SymbolInformation(
+      outline.element.name,
+      elementKindToSymbolKind(clientSupportedSymbolKinds, outline.element.kind),
+      outline.element.isDeprecated,
+      new Location(
+        documentUri,
+        toRange(lineInfo, outline.element.location.offset,
+            outline.element.location.length),
+      ),
+      containerName,
+    );
+  }
+
+  ErrorOr<Either2<List<DocumentSymbol>, List<SymbolInformation>>> _getSymbols(
+    HashSet<SymbolKind> clientSupportedSymbolKinds,
+    bool clientSupportsDocumentSymbol,
+    String path,
+    ResolvedUnitResult unit,
+  ) {
+    final computer =
+        new DartUnitOutlineComputer(path, unit.lineInfo, unit.unit);
+    final outline = computer.compute();
+
+    if (clientSupportsDocumentSymbol) {
+      // Return a tree of DocumentSymbol only if the client shows explicit support
+      // for it.
+      return success(
+        Either2<List<DocumentSymbol>, List<SymbolInformation>>.t1(
+          outline?.children
+              ?.map((child) => _asDocumentSymbol(
+                  clientSupportedSymbolKinds, unit.lineInfo, child))
+              ?.toList(),
+        ),
+      );
+    } else {
+      // Otherwise, we need to use the original flat SymbolInformation.
+      final allSymbols = <SymbolInformation>[];
+      final documentUri = new Uri.file(path).toString();
+
+      // Adds a symbol and it's children recursively, supplying the parent
+      // name as required by SymbolInformation.
+      addSymbol(Outline outline, {String parentName}) {
+        allSymbols.add(_asSymbolInformation(
+          parentName,
+          clientSupportedSymbolKinds,
+          documentUri,
+          unit.lineInfo,
+          outline,
+        ));
+        outline.children?.forEach(
+          (c) => addSymbol(c, parentName: outline.element.name),
+        );
+      }
+
+      outline?.children?.forEach(addSymbol);
+
+      return success(
+        Either2<List<DocumentSymbol>, List<SymbolInformation>>.t2(allSymbols),
+      );
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
new file mode 100644
index 0000000..a1bb950
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_execute_command.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/commands/organize_imports.dart';
+import 'package:analysis_server/src/lsp/handlers/commands/sort_members.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+/// Handles workspace/executeCommand messages by delegating to a specific handler
+/// based on the command.
+class ExecuteCommandHandler
+    extends MessageHandler<ExecuteCommandParams, Object> {
+  final Map<String, CommandHandler> commandHandlers;
+  ExecuteCommandHandler(LspAnalysisServer server)
+      : commandHandlers = {
+          Commands.sortMembers: new SortMembersCommandHandler(server),
+          Commands.organizeImports: new OrganizeImportsCommandHandler(server),
+        },
+        super(server);
+
+  Method get handlesMessage => Method.workspace_executeCommand;
+
+  @override
+  ExecuteCommandParams convertParams(Map<String, dynamic> json) =>
+      ExecuteCommandParams.fromJson(json);
+
+  Future<ErrorOr<Object>> handle(ExecuteCommandParams params) async {
+    final handler = commandHandlers[params.command];
+    if (handler == null) {
+      return error(ServerErrorCodes.UnknownCommand,
+          '${params.command} is not a valid command identifier', null);
+    }
+    return handler.handle(params.arguments);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
new file mode 100644
index 0000000..f2b3579
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_exit.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+class ExitMessageHandler extends MessageHandler<void, void> {
+  ExitMessageHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.exit;
+
+  @override
+  void convertParams(Map<String, dynamic> json) => null;
+
+  @override
+  Future<ErrorOr<void>> handle(void _) async {
+    await server.shutdown();
+    return success();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
new file mode 100644
index 0000000..6fb1c2f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_format_on_type.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/lsp/source_edits.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+
+class FormatOnTypeHandler
+    extends MessageHandler<DocumentOnTypeFormattingParams, List<TextEdit>> {
+  FormatOnTypeHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_onTypeFormatting;
+
+  @override
+  DocumentOnTypeFormattingParams convertParams(Map<String, dynamic> json) =>
+      DocumentOnTypeFormattingParams.fromJson(json);
+
+  ErrorOr<List<TextEdit>> formatFile(String path, ResolvedUnitResult unit) {
+    final unformattedSource =
+        server.resourceProvider.getFile(path).readAsStringSync();
+
+    return success(generateEditsForFormatting(unformattedSource));
+  }
+
+  Future<ErrorOr<List<TextEdit>>> handle(
+      DocumentOnTypeFormattingParams params) async {
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    return unit.mapResult((unit) => formatFile(path.result, unit));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
new file mode 100644
index 0000000..e226bc4
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_formatting.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/lsp/source_edits.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+
+class FormattingHandler
+    extends MessageHandler<DocumentFormattingParams, List<TextEdit>> {
+  FormattingHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_formatting;
+
+  @override
+  DocumentFormattingParams convertParams(Map<String, dynamic> json) =>
+      DocumentFormattingParams.fromJson(json);
+
+  ErrorOr<List<TextEdit>> formatFile(String path, ResolvedUnitResult unit) {
+    final unformattedSource =
+        server.resourceProvider.getFile(path).readAsStringSync();
+
+    return success(generateEditsForFormatting(unformattedSource));
+  }
+
+  Future<ErrorOr<List<TextEdit>>> handle(
+      DocumentFormattingParams params) async {
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    return unit.mapResult((unit) => formatFile(path.result, unit));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
new file mode 100644
index 0000000..a5396e5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_hover.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/computer/computer_hover.dart';
+import 'package:analysis_server/src/lsp/dartdoc.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/source/line_info.dart';
+
+class HoverHandler extends MessageHandler<TextDocumentPositionParams, Hover> {
+  HoverHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_hover;
+
+  @override
+  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
+      TextDocumentPositionParams.fromJson(json);
+
+  Future<ErrorOr<Hover>> handle(TextDocumentPositionParams params) async {
+    final pos = params.position;
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
+    return offset.mapResult((offset) => _getHover(unit.result, offset));
+  }
+
+  Hover toHover(LineInfo lineInfo, HoverInformation hover) {
+    if (hover == null) {
+      return null;
+    }
+
+    // Import prefix tooltips are not useful currently.
+    // https://github.com/dart-lang/sdk/issues/32735
+    if (hover.elementKind == 'import prefix') {
+      return null;
+    }
+
+    final content = new StringBuffer();
+    const divider = '---';
+
+    // Description.
+    if (hover.elementDescription != null) {
+      content.writeln('```dart');
+      if (hover.isDeprecated) {
+        content.write('(deprecated) ');
+      }
+      content..writeln(hover.elementDescription)..writeln('```');
+    }
+
+    // Source library.
+    if (hover.containingLibraryName != null &&
+        hover.containingLibraryName.isNotEmpty) {
+      content..writeln('*${hover.containingLibraryName}*')..writeln();
+    } else if (hover.containingLibraryPath != null) {
+      // TODO(dantup): Support displaying the package name (probably by adding
+      // containingPackageName to the main hover?) once the analyzer work to
+      // support this (inc Bazel/Gn) is done.
+      // content..writeln('*${hover.containingPackageName}*')..writeln();
+    }
+
+    // Doc comments.
+    if (hover.dartdoc != null) {
+      if (content.length != 0) {
+        content.writeln(divider);
+      }
+      content.writeln(cleanDartdoc(hover.dartdoc));
+    }
+
+    final formats =
+        server?.clientCapabilities?.textDocument?.hover?.contentFormat;
+    return new Hover(
+      asStringOrMarkupContent(formats, content.toString().trimRight()),
+      toRange(lineInfo, hover.offset, hover.length),
+    );
+  }
+
+  ErrorOr<Hover> _getHover(ResolvedUnitResult unit, int offset) {
+    final hover = new DartUnitHoverComputer(unit.unit, offset).compute();
+    return success(toHover(unit.lineInfo, hover));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
new file mode 100644
index 0000000..e1a72f6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+class InitializeMessageHandler
+    extends MessageHandler<InitializeParams, InitializeResult> {
+  InitializeMessageHandler(LspAnalysisServer server) : super(server);
+
+  Method get handlesMessage => Method.initialize;
+
+  @override
+  InitializeParams convertParams(Map<String, dynamic> json) =>
+      InitializeParams.fromJson(json);
+
+  ErrorOr<InitializeResult> handle(InitializeParams params) {
+    final openWorkspacePaths = <String>[];
+
+    if (params.workspaceFolders != null) {
+      params.workspaceFolders.forEach((wf) {
+        openWorkspacePaths.add(Uri.parse(wf.uri).toFilePath());
+      });
+    }
+    if (params.rootUri != null) {
+      openWorkspacePaths.add(Uri.parse(params.rootUri).toFilePath());
+      // ignore: deprecated_member_use
+    } else if (params.rootPath != null) {
+      // This is deprecated according to LSP spec, but we still want to support
+      // it in case older clients send us it.
+      // ignore: deprecated_member_use
+      openWorkspacePaths.add(params.rootPath);
+    }
+
+    server.handleClientConnection(params.capabilities);
+    server.messageHandler =
+        new InitializingStateMessageHandler(server, openWorkspacePaths);
+
+    final codeActionLiteralSupport =
+        params.capabilities.textDocument?.codeAction?.codeActionLiteralSupport;
+
+    final renameOptionsSupport =
+        params.capabilities.textDocument?.rename?.prepareSupport ?? false;
+
+    server.capabilities = new ServerCapabilities(
+        Either2<TextDocumentSyncOptions, num>.t1(new TextDocumentSyncOptions(
+          true,
+          TextDocumentSyncKind.Incremental,
+          false,
+          false,
+          null,
+        )),
+        true, // hoverProvider
+        new CompletionOptions(
+          false,
+          // Set the characters that will cause the editor to automatically
+          // trigger completion.
+          // TODO(dantup): This is quite eager and may need filtering in the
+          // completion handler.
+          // See https://github.com/Dart-Code/Dart-Code/blob/c616c93c87972713454eb0518f97c0278201a99a/src/providers/dart_completion_item_provider.ts#L36
+          r'''.: =(${'"/\'''.split(''),
+        ),
+        new SignatureHelpOptions(
+          // TODO(dantup): Signature help triggering is even more sensitive to
+          // bad chars, so we'll need to implement the logic described here:
+          // https://github.com/dart-lang/sdk/issues/34241
+          [],
+        ),
+        true, // definitionProvider
+        null,
+        null,
+        true, // referencesProvider
+        true, // documentHighlightProvider
+        true, // documentSymbolProvider
+        null,
+        // "The `CodeActionOptions` return type is only valid if the client
+        // signals code action literal support via the property
+        // `textDocument.codeAction.codeActionLiteralSupport`."
+        codeActionLiteralSupport != null
+            ? Either2<bool, CodeActionOptions>.t2(
+                new CodeActionOptions(DartCodeActionKind.serverSupportedKinds))
+            : Either2<bool, CodeActionOptions>.t1(true),
+        null,
+        true, // documentFormattingProvider
+        false, // documentRangeFormattingProvider
+        new DocumentOnTypeFormattingOptions('}', [';']),
+        renameOptionsSupport
+            ? Either2<bool, RenameOptions>.t2(new RenameOptions(true))
+            : Either2<bool, RenameOptions>.t1(true),
+        null,
+        null,
+        null,
+        new ExecuteCommandOptions(Commands.serverSupportedCommands),
+        new ServerCapabilitiesWorkspace(
+            new ServerCapabilitiesWorkspaceFolders(true, true)),
+        null);
+
+    return success(new InitializeResult(server.capabilities));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
new file mode 100644
index 0000000..3462d78
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialized.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+class IntializedMessageHandler extends MessageHandler<InitializedParams, void> {
+  final List<String> openWorkspacePaths;
+  IntializedMessageHandler(LspAnalysisServer server, this.openWorkspacePaths)
+      : super(server);
+  Method get handlesMessage => Method.initialized;
+
+  @override
+  InitializedParams convertParams(Map<String, dynamic> json) =>
+      InitializedParams.fromJson(json);
+
+  ErrorOr<void> handle(InitializedParams params) {
+    server.messageHandler = new InitializedStateMessageHandler(server);
+
+    server.setAnalysisRoots(openWorkspacePaths);
+
+    return success();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
new file mode 100644
index 0000000..f6f803f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_references.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/protocol_server.dart' show SearchResult;
+import 'package:analysis_server/src/protocol_server.dart' show NavigationTarget;
+import 'package:analysis_server/src/search/element_references.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
+
+class ReferencesHandler
+    extends MessageHandler<ReferenceParams, List<Location>> {
+  ReferencesHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_references;
+
+  @override
+  ReferenceParams convertParams(Map<String, dynamic> json) =>
+      ReferenceParams.fromJson(json);
+
+  @override
+  Future<ErrorOr<List<Location>>> handle(ReferenceParams params) async {
+    final pos = params.position;
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
+    return offset.mapResult(
+        (offset) => _getRefererences(path.result, offset, params, unit.result));
+  }
+
+  List<Location> _getDeclarations(CompilationUnit unit, int offset) {
+    final collector = new NavigationCollectorImpl();
+    computeDartNavigation(server.resourceProvider, collector, unit, offset, 0);
+
+    return convert(collector.targets, (NavigationTarget target) {
+      final targetFilePath = collector.files[target.fileIndex];
+      final lineInfo = server.getLineInfo(targetFilePath);
+      return navigationTargetToLocation(targetFilePath, target, lineInfo);
+    }).toList();
+  }
+
+  Future<ErrorOr<List<Location>>> _getRefererences(String path, int offset,
+      ReferenceParams params, ResolvedUnitResult unit) async {
+    Element element = await server.getElementAtOffset(path, offset);
+    if (element is ImportElement) {
+      element = (element as ImportElement).prefix;
+    }
+    if (element is FieldFormalParameterElement) {
+      element = (element as FieldFormalParameterElement).field;
+    }
+    if (element is PropertyAccessorElement) {
+      element = (element as PropertyAccessorElement).variable;
+    }
+    if (element == null) {
+      return success();
+    }
+
+    final computer = new ElementReferencesComputer(server.searchEngine);
+    final results = await computer.compute(element, false);
+
+    Location toLocation(SearchResult result) {
+      final lineInfo = server.getLineInfo(result.location.file);
+      return searchResultToLocation(result, lineInfo);
+    }
+
+    final referenceResults = convert(results, toLocation).toList();
+
+    if (params.context?.includeDeclaration == true) {
+      // Also include the definition for the symbol at this location.
+      referenceResults.addAll(_getDeclarations(unit.unit, offset));
+    }
+
+    return success(referenceResults);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
new file mode 100644
index 0000000..8cd06e5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_reject.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+/// A [MessageHandler] that rejects specific tpyes of messages with a given
+/// error code/message.
+class RejectMessageHandler extends MessageHandler<Object, void> {
+  final Method handlesMessage;
+  final ErrorCodes errorCode;
+  final String errorMessage;
+  RejectMessageHandler(LspAnalysisServer server, this.handlesMessage,
+      this.errorCode, this.errorMessage)
+      : super(server);
+
+  @override
+  void convertParams(Map<String, dynamic> json) => null;
+
+  @override
+  ErrorOr<void> handle(void _) {
+    return error(errorCode, errorMessage, null);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
new file mode 100644
index 0000000..3a9075e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+
+class PrepareRenameHandler
+    extends MessageHandler<TextDocumentPositionParams, RangeAndPlaceholder> {
+  PrepareRenameHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_prepareRename;
+
+  @override
+  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
+      TextDocumentPositionParams.fromJson(json);
+
+  @override
+  Future<ErrorOr<RangeAndPlaceholder>> handle(
+      TextDocumentPositionParams params) async {
+    final pos = params.position;
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
+
+    return offset.mapResult((offset) async {
+      final node = await server.getNodeAtOffset(path.result, offset);
+      final element = server.getElementOfNode(node);
+      if (node == null || element == null) {
+        return success(null);
+      }
+
+      final refactorDetails =
+          RenameRefactoring.getElementToRename(node, element);
+      final refactoring = new RenameRefactoring(server.refactoringWorkspace,
+          unit.result.session, refactorDetails.element);
+
+      // Check the rename is valid here.
+      final initStatus = await refactoring.checkInitialConditions();
+      if (initStatus.hasFatalError) {
+        return error(
+            ServerErrorCodes.RenameNotValid, initStatus.problem.message, null);
+      }
+
+      return success(new RangeAndPlaceholder(
+        toRange(
+          unit.result.lineInfo,
+          // If the offset is set to -1 it means there is no location for the
+          // old name. However since we must provide a range for LSP, we'll use
+          // a 0-character span at the originally requested location to ensure
+          // it's valid.
+          refactorDetails.offset == -1 ? offset : refactorDetails.offset,
+          refactorDetails.length,
+        ),
+        refactoring.oldName,
+      ));
+    });
+  }
+}
+
+class RenameHandler extends MessageHandler<RenameParams, WorkspaceEdit> {
+  RenameHandler(LspAnalysisServer server) : super(server);
+
+  Method get handlesMessage => Method.textDocument_rename;
+
+  @override
+  RenameParams convertParams(Map<String, dynamic> json) =>
+      RenameParams.fromJson(json);
+
+  @override
+  Future<ErrorOr<WorkspaceEdit>> handle(RenameParams params) async {
+    final pos = params.position;
+    final path = pathOfDoc(params.textDocument);
+    // If the client provided us a version doc identifier, we'll use it to ensure
+    // we're not computing a rename for an old document. If not, we'll just assume
+    // the version the server had at the time of recieving the request is valid
+    // and then use it to verify the document hadn't changed again before we
+    // send the edits.
+    final docIdentifier = await path.mapResult((path) => success(
+        params.textDocument is VersionedTextDocumentIdentifier
+            ? params.textDocument
+            : server.getVersionedDocumentIdentifier(path)));
+    final unit = await path.mapResult(requireUnit);
+    final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
+
+    return offset.mapResult((offset) async {
+      final node = await server.getNodeAtOffset(path.result, offset);
+      final element = server.getElementOfNode(node);
+      if (node == null || element == null) {
+        return success(null);
+      }
+
+      final refactorDetails =
+          RenameRefactoring.getElementToRename(node, element);
+      final refactoring = new RenameRefactoring(server.refactoringWorkspace,
+          unit.result.session, refactorDetails.element);
+
+      // TODO(dantup): Consider using window/showMessageRequest to prompt
+      // the user to see if they'd like to proceed with a rename if there
+      // are non-fatal errors or warnings. For now we will reject all errors
+      // (fatal and not) as this seems like the most logical behaviour when
+      // without a prompt.
+
+      // Check the rename is valid here.
+      final initStatus = await refactoring.checkInitialConditions();
+      if (initStatus.hasError) {
+        return error(
+            ServerErrorCodes.RenameNotValid, initStatus.problem.message, null);
+      }
+
+      // Check the name is valid.
+      refactoring.newName = params.newName;
+      final optionsStatus = refactoring.checkNewName();
+      if (optionsStatus.hasError) {
+        return error(ServerErrorCodes.RenameNotValid,
+            optionsStatus.problem.message, null);
+      }
+
+      // Final validation.
+      final finalStatus = await refactoring.checkFinalConditions();
+      if (finalStatus.hasError) {
+        return error(
+            ServerErrorCodes.RenameNotValid, finalStatus.problem.message, null);
+      }
+
+      // Compute the actual change.
+      final change = await refactoring.createChange();
+
+      // Before we send anything back, ensure the original file didn't change
+      // while we were computing changes.
+      if (server.getVersionedDocumentIdentifier(path.result) !=
+          docIdentifier.result) {
+        return error(ErrorCodes.ContentModified,
+            'Document was modified while rename was being computed', null);
+      }
+
+      final workspaceEdit = createWorkspaceEdit(server, change);
+      return success(workspaceEdit);
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
new file mode 100644
index 0000000..82e50f6
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_shutdown.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+class ShutdownMessageHandler extends MessageHandler<void, void> {
+  ShutdownMessageHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.shutdown;
+
+  @override
+  void convertParams(Map<String, dynamic> json) => null;
+
+  @override
+  ErrorOr<void> handle(void _) {
+    // We can clean up and shut down here, but we cannot terminate the server
+    // because that must be done after the exit notification.
+    return success();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
new file mode 100644
index 0000000..2fe40ef
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_signature_help.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/computer/computer_signature.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+
+class SignatureHelpHandler
+    extends MessageHandler<TextDocumentPositionParams, SignatureHelp> {
+  SignatureHelpHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_signatureHelp;
+
+  @override
+  TextDocumentPositionParams convertParams(Map<String, dynamic> json) =>
+      TextDocumentPositionParams.fromJson(json);
+
+  Future<ErrorOr<SignatureHelp>> handle(
+      TextDocumentPositionParams params) async {
+    final pos = params.position;
+    final path = pathOfDoc(params.textDocument);
+    final unit = await path.mapResult(requireUnit);
+    final offset = await unit.mapResult((unit) => toOffset(unit.lineInfo, pos));
+
+    return offset.mapResult((offset) {
+      final computer = new DartUnitSignatureComputer(unit.result.unit, offset);
+      if (!computer.offsetIsValid) {
+        return success(); // No error, just no valid hover.
+      }
+      final signature = computer.compute();
+      if (signature == null) {
+        return success(); // No error, just no valid hover.
+      }
+      final formats = server?.clientCapabilities?.textDocument?.signatureHelp
+          ?.signatureInformation?.documentationFormat;
+      return success(toSignatureHelp(formats, signature));
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
new file mode 100644
index 0000000..9375b8b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_states.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_code_actions.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_completion.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_definition.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_document_highlights.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_document_symbols.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_execute_command.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_format_on_type.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_formatting.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_hover.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_initialize.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_initialized.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_references.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_rename.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_signature_help.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_text_document_changes.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_change_workspace_folders.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+
+/// The server moves to this state when a critical unrecoverrable error (for
+/// example, inconsistent document state between server/client) occurs and will
+/// reject all messages.
+class FailureStateMessageHandler extends ServerStateMessageHandler {
+  FailureStateMessageHandler(LspAnalysisServer server) : super(server);
+
+  @override
+  FutureOr<ErrorOr<Object>> handleUnknownMessage(IncomingMessage message) {
+    return failure(
+        ErrorCodes.InternalError,
+        'An unrecoverable error occurred and the server cannot process messages',
+        null);
+  }
+}
+
+class InitializedStateMessageHandler extends ServerStateMessageHandler {
+  InitializedStateMessageHandler(LspAnalysisServer server) : super(server) {
+    reject(Method.initialize, ServerErrorCodes.ServerAlreadyInitialized,
+        'Server already initialized');
+    reject(Method.initialized, ServerErrorCodes.ServerAlreadyInitialized,
+        'Server already initialized');
+    registerHandler(new TextDocumentOpenHandler(server));
+    registerHandler(new TextDocumentChangeHandler(server));
+    registerHandler(new TextDocumentCloseHandler(server));
+    registerHandler(new HoverHandler(server));
+    registerHandler(new CompletionHandler(server));
+    registerHandler(new SignatureHelpHandler(server));
+    registerHandler(new DefinitionHandler(server));
+    registerHandler(new ReferencesHandler(server));
+    registerHandler(new FormattingHandler(server));
+    registerHandler(new FormatOnTypeHandler(server));
+    registerHandler(new DocumentHighlightsHandler(server));
+    registerHandler(new DocumentSymbolHandler(server));
+    registerHandler(new CodeActionHandler(server));
+    registerHandler(new ExecuteCommandHandler(server));
+    registerHandler(new WorkspaceFoldersHandler(server));
+    registerHandler(new PrepareRenameHandler(server));
+    registerHandler(new RenameHandler(server));
+  }
+}
+
+class InitializingStateMessageHandler extends ServerStateMessageHandler {
+  InitializingStateMessageHandler(
+      LspAnalysisServer server, List<String> openWorkspacePaths)
+      : super(server) {
+    reject(Method.initialize, ServerErrorCodes.ServerAlreadyInitialized,
+        'Server already initialized');
+    registerHandler(new IntializedMessageHandler(server, openWorkspacePaths));
+  }
+
+  @override
+  ErrorOr<void> handleUnknownMessage(IncomingMessage message) {
+    // Silently drop non-requests.
+    if (message is! RequestMessage) {
+      return success();
+    }
+    return failure(
+        ErrorCodes.ServerNotInitialized,
+        'Unable to handle ${message.method} before the server is initialized '
+        'and the client has sent the initialized notification');
+  }
+}
+
+class UninitializedStateMessageHandler extends ServerStateMessageHandler {
+  UninitializedStateMessageHandler(LspAnalysisServer server) : super(server) {
+    registerHandler(new InitializeMessageHandler(server));
+  }
+
+  @override
+  FutureOr<ErrorOr<Object>> handleUnknownMessage(IncomingMessage message) {
+    // Silently drop non-requests.
+    if (message is! RequestMessage) {
+      return success();
+    }
+    return failure(ErrorCodes.ServerNotInitialized,
+        'Unable to handle ${message.method} before client has sent initialize request');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
new file mode 100644
index 0000000..ea42bec
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_text_document_changes.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/lsp/source_edits.dart';
+
+class TextDocumentChangeHandler
+    extends MessageHandler<DidChangeTextDocumentParams, void> {
+  TextDocumentChangeHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_didChange;
+
+  @override
+  DidChangeTextDocumentParams convertParams(Map<String, dynamic> json) =>
+      DidChangeTextDocumentParams.fromJson(json);
+
+  ErrorOr<void> handle(DidChangeTextDocumentParams params) {
+    final path = pathOfDoc(params.textDocument);
+    return path.mapResult((path) => _changeFile(path, params));
+  }
+
+  ErrorOr<void> _changeFile(String path, DidChangeTextDocumentParams params) {
+    String oldContents;
+    if (server.resourceProvider.hasOverlay(path)) {
+      oldContents = server.resourceProvider.getFile(path).readAsStringSync();
+    }
+    // If we didn't have the file contents, the server and client are out of sync
+    // and this is a serious failure.
+    if (oldContents == null) {
+      return error(
+        ServerErrorCodes.ClientServerInconsistentState,
+        'Unable to edit document because the file was not previously opened: $path',
+        null,
+      );
+    }
+    final newContents =
+        applyEdits(oldContents, params.contentChanges, failureIsCritical: true);
+    return newContents.mapResult((newcontents) {
+      server.documentVersions[path] = params.textDocument;
+      server.updateOverlay(path, newContents.result);
+      return success();
+    });
+  }
+}
+
+class TextDocumentCloseHandler
+    extends MessageHandler<DidCloseTextDocumentParams, void> {
+  TextDocumentCloseHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_didClose;
+
+  @override
+  DidCloseTextDocumentParams convertParams(Map<String, dynamic> json) =>
+      DidCloseTextDocumentParams.fromJson(json);
+
+  ErrorOr<void> handle(DidCloseTextDocumentParams params) {
+    final path = pathOfDoc(params.textDocument);
+    return path.mapResult((path) {
+      server.removePriorityFile(path);
+      server.documentVersions[path] = null;
+      server.updateOverlay(path, null);
+      return success();
+    });
+  }
+}
+
+class TextDocumentOpenHandler
+    extends MessageHandler<DidOpenTextDocumentParams, void> {
+  TextDocumentOpenHandler(LspAnalysisServer server) : super(server);
+  Method get handlesMessage => Method.textDocument_didOpen;
+
+  @override
+  DidOpenTextDocumentParams convertParams(Map<String, dynamic> json) =>
+      DidOpenTextDocumentParams.fromJson(json);
+
+  ErrorOr<void> handle(DidOpenTextDocumentParams params) {
+    final doc = params.textDocument;
+    final path = pathOfDocItem(doc);
+    return path.mapResult((path) {
+      server.addPriorityFile(path);
+      // We don't get a VersionedTextDocumentIdentifier with a didOpen but we
+      // do get the necessary info to create one.
+      server.documentVersions[path] = new VersionedTextDocumentIdentifier(
+        params.textDocument.version,
+        params.textDocument.uri,
+      );
+      server.updateOverlay(path, doc.text);
+
+      // If the file did not exist, and is "overlay only", it still should be
+      // analyzed. Add it to driver to which it should have been added.
+      server.contextManager.getDriverFor(path)?.addFile(path);
+
+      return success();
+    });
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
new file mode 100644
index 0000000..9fd98d8
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handlers.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_exit.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_reject.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_shutdown.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+
+/// Converts an iterable using the provided function and skipping over any
+/// null values.
+Iterable<T> convert<T, E>(Iterable<E> items, T Function(E) converter) {
+  // TODO(dantup): Now this is used outside of handlers, is there somewhere
+  // better to put it, and/or a better name for it?
+  return items.map(converter).where((item) => item != null);
+}
+
+abstract class CommandHandler<P, R> with Handler<P, R> {
+  CommandHandler(LspAnalysisServer server) {
+    this.server = server;
+  }
+
+  Future<ErrorOr<void>> handle(List<dynamic> arguments);
+}
+
+mixin Handler<P, R> {
+  LspAnalysisServer server;
+
+  ErrorOr<R> error<R>(ErrorCodes code, String message, Object data) =>
+      new ErrorOr<R>.error(new ResponseError(code, message, data));
+
+  ErrorOr<R> failure<R>(ErrorOr<dynamic> error) =>
+      new ErrorOr<R>.error(error.error);
+
+  Future<ErrorOr<ResolvedUnitResult>> requireUnit(String path) async {
+    final result = await server.getResolvedUnit(path);
+    if (result?.state != ResultState.VALID) {
+      return error(ServerErrorCodes.InvalidFilePath, 'Invalid file path', path);
+    }
+    return success(result);
+  }
+
+  ErrorOr<R> success<R>([R t]) => new ErrorOr<R>.success(t);
+}
+
+/// An object that can handle messages and produce responses for requests.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class MessageHandler<P, R> with Handler<P, R> {
+  MessageHandler(LspAnalysisServer server) {
+    this.server = server;
+  }
+
+  /// The method that this handler can handle.
+  Method get handlesMessage;
+
+  P convertParams(Map<String, dynamic> json);
+
+  FutureOr<ErrorOr<R>> handle(P params);
+
+  /// Handle the given [message]. If the [message] is a [RequestMessage], then the
+  /// return value will be sent back in a [ResponseMessage].
+  /// [NotificationMessage]s are not expected to return results.
+  FutureOr<ErrorOr<R>> handleMessage(IncomingMessage message) {
+    final params = convertParams(message.params);
+    return handle(params);
+  }
+}
+
+/// A message handler that handles all messages for a given server state.
+abstract class ServerStateMessageHandler {
+  final LspAnalysisServer server;
+  final Map<Method, MessageHandler> _messageHandlers = {};
+
+  ServerStateMessageHandler(this.server) {
+    // All server states support shutdown and exit.
+    registerHandler(new ShutdownMessageHandler(server));
+    registerHandler(new ExitMessageHandler(server));
+  }
+
+  ErrorOr<Object> failure<Object>(ErrorCodes code, String message,
+          [Object data]) =>
+      new ErrorOr<Object>.error(new ResponseError(code, message, data));
+
+  /// Handle the given [message]. If the [message] is a [RequestMessage], then the
+  /// return value will be sent back in a [ResponseMessage].
+  /// [NotificationMessage]s are not expected to return results.
+  FutureOr<ErrorOr<Object>> handleMessage(IncomingMessage message) async {
+    final handler = _messageHandlers[message.method];
+    return handler != null
+        ? handler.handleMessage(message)
+        : handleUnknownMessage(message);
+  }
+
+  FutureOr<ErrorOr<Object>> handleUnknownMessage(IncomingMessage message) {
+    // If it's an optional *Notification* we can ignore it (return success).
+    // Otherwise respond with failure. Optional Requests must still be responded
+    // to so they don't leave open requests on the client.
+    return _isOptionalNotification(message)
+        ? success()
+        : failure(
+            ErrorCodes.MethodNotFound, 'Unknown method ${message.method}');
+  }
+
+  registerHandler(MessageHandler handler) {
+    assert(
+        handler.handlesMessage != null,
+        'Unable to register handler ${handler.runtimeType} because it does '
+        'not declare which messages it can handle');
+
+    _messageHandlers[handler.handlesMessage] = handler;
+  }
+
+  reject(Method method, ErrorCodes code, String message) {
+    registerHandler(new RejectMessageHandler(server, method, code, message));
+  }
+
+  ErrorOr<Object> success<Object>([Object t]) => new ErrorOr<Object>.success(t);
+
+  bool _isOptionalNotification(IncomingMessage message) {
+    // Not a notification.
+    if (message is! NotificationMessage) {
+      return false;
+    }
+
+    // Messages that start with $/ are optional.
+    final stringValue = message.method.toJson();
+    return stringValue is String && stringValue.startsWith(r'$/');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
new file mode 100644
index 0000000..925e5a7
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -0,0 +1,616 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:io' as io;
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/analysis_server_abstract.dart';
+import 'package:analysis_server/src/collections.dart';
+import 'package:analysis_server/src/context_manager.dart';
+import 'package:analysis_server/src/domain_completion.dart'
+    show CompletionDomainHandler;
+import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/handlers/handler_states.dart';
+import 'package:analysis_server/src/lsp/handlers/handlers.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/plugin/notification_manager.dart';
+import 'package:analysis_server/src/protocol_server.dart' as protocol;
+import 'package:analysis_server/src/services/completion/completion_performance.dart'
+    show CompletionPerformance;
+import 'package:analysis_server/src/services/refactoring/refactoring.dart';
+import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analysis_server/src/services/search/search_engine_internal.dart';
+import 'package:analysis_server/src/utilities/null_string_sink.dart';
+import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/context/context_root.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
+import 'package:analyzer/src/dart/analysis/file_state.dart' as nd;
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/status.dart' as nd;
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/plugin/resolver_provider.dart';
+import 'package:watcher/watcher.dart';
+
+/**
+ * Instances of the class [LspAnalysisServer] implement an LSP-based server that
+ * listens on a [CommunicationChannel] for LSP messages and processes them.
+ */
+class LspAnalysisServer extends AbstractAnalysisServer {
+  /// The capabilities of the LSP client. Will be null prior to initialization.
+  ClientCapabilities _clientCapabilities;
+
+  /**
+   * The channel from which messages are received and to which responses should
+   * be sent.
+   */
+  final LspServerCommunicationChannel channel;
+
+  /// The [SearchEngine] for this server, may be `null` if indexing is disabled.
+  SearchEngine searchEngine;
+
+  final NotificationManager notificationManager = new NullNotificationManager();
+
+  /**
+   * The object used to manage the SDK's known to this server.
+   */
+  final DartSdkManager sdkManager;
+
+  /**
+   * The instrumentation service that is to be used by this analysis server.
+   */
+  final InstrumentationService instrumentationService;
+
+  /**
+   * The default options used to create new analysis contexts. This object is
+   * also referenced by the ContextManager.
+   */
+  final AnalysisOptionsImpl defaultContextOptions = new AnalysisOptionsImpl();
+
+  /**
+   * The workspace for rename refactorings. Should be accessed through the
+   * refactoringWorkspace getter to be automatically created (lazily).
+   */
+  RefactoringWorkspace _refactoringWorkspace;
+
+  RefactoringWorkspace get refactoringWorkspace => _refactoringWorkspace ??=
+      new RefactoringWorkspace(driverMap.values, searchEngine);
+
+  /**
+   * The versions of each document known to the server (keyed by path), used to
+   * send back to the client for server-initiated edits so that the client can
+   * ensure they have a matching version of the document before applying them.
+   *
+   * Handlers should prefer to use the `getVersionedDocumentIdentifier` method
+   * which will return a null-versioned identifier if the document version is
+   * not known.
+   */
+  final Map<String, VersionedTextDocumentIdentifier> documentVersions = {};
+
+  /**
+   * The file resolver provider used to override the way file URI's are
+   * resolved in some contexts.
+   */
+  ResolverProvider fileResolverProvider;
+
+  /**
+   * The package resolver provider used to override the way package URI's are
+   * resolved in some contexts.
+   */
+  ResolverProvider packageResolverProvider;
+
+  PerformanceLog _analysisPerformanceLogger;
+
+  ByteStore byteStore;
+
+  nd.AnalysisDriverScheduler analysisDriverScheduler;
+
+  ServerStateMessageHandler messageHandler;
+
+  int nextRequestId = 1;
+
+  final Map<int, Completer<ResponseMessage>> completers = {};
+
+  /**
+   * Capabilities of the server. Will be null prior to initialization as
+   * the server capabilities depend on the client capabilities.
+   */
+  ServerCapabilities capabilities;
+
+  LspPerformance performanceStats = new LspPerformance();
+
+  /**
+   * Initialize a newly created server to send and receive messages to the given
+   * [channel].
+   */
+  LspAnalysisServer(
+    this.channel,
+    ResourceProvider baseResourceProvider,
+    AnalysisServerOptions options,
+    this.sdkManager,
+    this.instrumentationService, {
+    ResolverProvider packageResolverProvider: null,
+  }) : super(options, baseResourceProvider) {
+    messageHandler = new UninitializedStateMessageHandler(this);
+    defaultContextOptions.generateImplicitErrors = false;
+    defaultContextOptions.useFastaParser = options.useFastaParser;
+
+    {
+      String name = options.newAnalysisDriverLog;
+      StringSink sink = new NullStringSink();
+      if (name != null) {
+        if (name == 'stdout') {
+          sink = io.stdout;
+        } else if (name.startsWith('file:')) {
+          String path = name.substring('file:'.length);
+          sink = new io.File(path).openWrite(mode: io.FileMode.append);
+        }
+      }
+      _analysisPerformanceLogger = new PerformanceLog(sink);
+    }
+    byteStore = createByteStore(resourceProvider);
+    analysisDriverScheduler =
+        new nd.AnalysisDriverScheduler(_analysisPerformanceLogger);
+    analysisDriverScheduler.start();
+
+    contextManager = new ContextManagerImpl(
+        resourceProvider,
+        sdkManager,
+        packageResolverProvider,
+        analyzedFilesGlobs,
+        instrumentationService,
+        defaultContextOptions);
+    final contextManagerCallbacks =
+        new LspServerContextManagerCallbacks(this, resourceProvider);
+    contextManager.callbacks = contextManagerCallbacks;
+    searchEngine = new SearchEngineImpl(driverMap.values);
+
+    channel.listen(handleMessage, onDone: done, onError: error);
+  }
+
+  /// The capabilities of the LSP client. Will be null prior to initialization.
+  ClientCapabilities get clientCapabilities => _clientCapabilities;
+
+  Future<void> get exited => channel.closed;
+
+  addPriorityFile(String path) {
+    final didAdd = priorityFiles.add(path);
+    assert(didAdd);
+    if (didAdd) {
+      _updateDriversPriorityFiles();
+    }
+  }
+
+  /**
+   * The socket from which messages are being read has been closed.
+   */
+  void done() {}
+
+  /**
+   * There was an error related to the socket from which messages are being
+   * read.
+   */
+  void error(error, stack) {
+    sendServerErrorNotification('Server error', error, stack);
+  }
+
+  /// Return the LineInfo for the file with the given [path]. The file is
+  /// analyzed in one of the analysis drivers to which the file was added,
+  /// otherwise in the first driver, otherwise `null` is returned.
+  LineInfo getLineInfo(String path) {
+    if (!AnalysisEngine.isDartFileName(path)) {
+      return null;
+    }
+
+    return getAnalysisDriver(path)?.getFileSync(path)?.lineInfo;
+  }
+
+  /// Gets the version of a document known to the server, returning a
+  /// [VersionedTextDocumentIdentifier] with a version of `null` if the document
+  /// version is not known.
+  VersionedTextDocumentIdentifier getVersionedDocumentIdentifier(String path) {
+    return documentVersions[path] ??
+        new VersionedTextDocumentIdentifier(
+            null, new Uri.file(path).toString());
+  }
+
+  void handleClientConnection(ClientCapabilities capabilities) {
+    _clientCapabilities = capabilities;
+
+    performanceAfterStartup = new ServerPerformance();
+    performance = performanceAfterStartup;
+  }
+
+  /// Handles a response from the client by invoking the completer that the
+  /// outbound request created.
+  void handleClientResponse(ResponseMessage message) {
+    // The ID from the client is an Either2<num, String>, though it's not valid
+    // for it to be a string because it should match a request we sent to the
+    // client (and we always use numeric IDs for outgoing requests).
+    message.id.map(
+      (id) {
+        // It's possible that even if we got a numeric ID that it's not valid.
+        // If it's not in our completers list (which is a list of the outstanding
+        // requests we've sent) then show an error.
+        final completer = completers[id];
+        if (completer == null) {
+          showError('Response with ID $id was unexpected');
+        } else {
+          completers.remove(id);
+          completer.complete(message);
+        }
+      },
+      (stringID) {
+        showError('Unexpected String ID for response $stringID');
+      },
+    );
+  }
+
+  /**
+   * Handle a [message] that was read from the communication channel.
+   */
+  void handleMessage(Message message) {
+    performance.logRequestTiming(null);
+    runZoned(() {
+      ServerPerformanceStatistics.serverRequests.makeCurrentWhile(() async {
+        try {
+          if (message is ResponseMessage) {
+            handleClientResponse(message);
+          } else if (message is RequestMessage) {
+            final result = await messageHandler.handleMessage(message);
+            if (result.isError) {
+              sendErrorResponse(message, result.error);
+            } else {
+              channel.sendResponse(new ResponseMessage(
+                  message.id, result.result, null, jsonRpcVersion));
+            }
+          } else if (message is NotificationMessage) {
+            final result = await messageHandler.handleMessage(message);
+            if (result.isError) {
+              sendErrorResponse(message, result.error);
+            }
+          } else {
+            showError('Unknown message type');
+          }
+        } catch (error, stackTrace) {
+          final errorMessage = message is ResponseMessage
+              ? 'An error occurred while handling the response to request ${message.id}'
+              : message is RequestMessage
+                  ? 'An error occurred while handling ${message.method} request'
+                  : message is NotificationMessage
+                      ? 'An error occurred while handling ${message.method} notification'
+                      : 'Unknown message type';
+          sendErrorResponse(
+              message,
+              new ResponseError(
+                ServerErrorCodes.UnhandledError,
+                errorMessage,
+                null,
+              ));
+          logError(error.toString());
+          if (stackTrace != null) {
+            logError(stackTrace.toString());
+          }
+        }
+      });
+    }, onError: error);
+  }
+
+  void logError(String message) {
+    channel.sendNotification(new NotificationMessage(
+      Method.window_logMessage,
+      new LogMessageParams(MessageType.Error, message),
+      jsonRpcVersion,
+    ));
+  }
+
+  void publishDiagnostics(String path, List<Diagnostic> errors) {
+    final params =
+        new PublishDiagnosticsParams(Uri.file(path).toString(), errors);
+    final message = new NotificationMessage(
+      Method.textDocument_publishDiagnostics,
+      params,
+      jsonRpcVersion,
+    );
+    sendNotification(message);
+  }
+
+  removePriorityFile(String path) {
+    final didRemove = priorityFiles.remove(path);
+    assert(didRemove);
+    if (didRemove) {
+      _updateDriversPriorityFiles();
+    }
+  }
+
+  void sendErrorResponse(Message message, ResponseError error) {
+    if (message is RequestMessage) {
+      channel.sendResponse(
+          new ResponseMessage(message.id, null, error, jsonRpcVersion));
+      // Since the LSP client might not show the failed requests to the user,
+      // also ensure the error is logged to the client.
+      logError(error.message);
+    } else if (message is ResponseMessage) {
+      // For bad response messages where we can't respond with an error, send it as
+      // show instead of log.
+      showError(error.message);
+    } else {
+      // For notifications where we couldn't respond with an error, send it as
+      // show instead of log.
+      showError(error.message);
+    }
+
+    // Handle fatal errors where the client/server state is out of sync and we
+    // should not continue.
+    if (error.code == ServerErrorCodes.ClientServerInconsistentState) {
+      // Do not process any further messages.
+      messageHandler = new FailureStateMessageHandler(this);
+
+      final message = 'An unrecoverable error occurred.';
+      logError(
+          '$message\n\n${error.message}\n\n${error.code}\n\n${error.data}');
+
+      shutdown();
+    }
+  }
+
+  /**
+   * Send the given [notification] to the client.
+   */
+  void sendNotification(NotificationMessage notification) {
+    channel.sendNotification(notification);
+  }
+
+  /**
+   * Send the given [request] to the client and wait for a response.
+   */
+  Future<ResponseMessage> sendRequest(Method method, Object params) {
+    final requestId = nextRequestId++;
+    final completer = new Completer<ResponseMessage>();
+    completers[requestId] = completer;
+
+    channel.sendRequest(new RequestMessage(
+      Either2<num, String>.t1(requestId),
+      method,
+      params,
+      jsonRpcVersion,
+    ));
+
+    return completer.future;
+  }
+
+  /**
+   * Send the given [response] to the client.
+   */
+  void sendResponse(ResponseMessage response) {
+    channel.sendResponse(response);
+  }
+
+  void sendServerErrorNotification(String message, exception, stackTrace) {
+    final fullError = new StringBuffer();
+
+    fullError.writeln(exception == null ? message : '$message: $exception');
+
+    // Show message (without stack) to the user.
+    showError(fullError.toString());
+
+    if (stackTrace != null) {
+      fullError.writeln(stackTrace.toString());
+    }
+    // Log the full message since showMessage above may be truncated or formatted
+    // badly (eg. VS Code takes the newlines out).
+    logError(fullError.toString());
+
+    // remember the last few exceptions
+    if (exception is CaughtException) {
+      stackTrace ??= exception.stackTrace;
+    }
+    exceptions.add(new ServerException(
+      message,
+      exception,
+      stackTrace is StackTrace ? stackTrace : null,
+      false,
+    ));
+  }
+
+  void setAnalysisRoots(List<String> includedPaths) {
+    final uniquePaths = HashSet<String>.of(includedPaths ?? const []);
+    contextManager.setRoots(uniquePaths.toList(), [], {});
+  }
+
+  /**
+   * Returns `true` if errors should be reported for [file] with the given
+   * absolute path.
+   */
+  bool shouldSendErrorsNotificationFor(String file) {
+    return contextManager.isInAnalysisRoot(file);
+  }
+
+  void showError(String message) {
+    channel.sendNotification(new NotificationMessage(
+      Method.window_showMessage,
+      new ShowMessageParams(MessageType.Error, message),
+      jsonRpcVersion,
+    ));
+  }
+
+  Future<void> shutdown() {
+    // Defer closing the channel so that the shutdown response can be sent and
+    // logged.
+    new Future(() {
+      channel.close();
+    });
+
+    return new Future.value();
+  }
+
+  void updateAnalysisRoots(List<String> addedPaths, List<String> removedPaths) {
+    // TODO(dantup): This is currently case-sensitive!
+    final newPaths =
+        HashSet<String>.of(contextManager.includedPaths ?? const [])
+          ..addAll(addedPaths ?? const [])
+          ..removeAll(removedPaths ?? const []);
+
+    contextManager.setRoots(newPaths.toList(), [], {});
+  }
+
+  void updateOverlay(String path, String contents) {
+    if (contents != null) {
+      resourceProvider.setOverlay(path,
+          content: contents, modificationStamp: 0);
+    } else {
+      resourceProvider.removeOverlay(path);
+    }
+    driverMap.values.forEach((driver) => driver.changeFile(path));
+  }
+
+  _updateDriversPriorityFiles() {
+    driverMap.values.forEach((driver) {
+      driver.priorityFiles = priorityFiles.toList();
+    });
+  }
+}
+
+class LspPerformance {
+  /// A list of code completion performance measurements for the latest
+  /// completion operation up to [performanceListMaxLength] measurements.
+  final RecentBuffer<CompletionPerformance> completion =
+      new RecentBuffer<CompletionPerformance>(
+          CompletionDomainHandler.performanceListMaxLength);
+}
+
+class LspServerContextManagerCallbacks extends ContextManagerCallbacks {
+  // TODO(dantup): Lots of copy/paste from the Analysis Server one here.
+
+  final LspAnalysisServer analysisServer;
+
+  /**
+   * The [ResourceProvider] by which paths are converted into [Resource]s.
+   */
+  final ResourceProvider resourceProvider;
+
+  LspServerContextManagerCallbacks(this.analysisServer, this.resourceProvider);
+
+  @override
+  NotificationManager get notificationManager =>
+      analysisServer.notificationManager;
+
+  @override
+  nd.AnalysisDriver addAnalysisDriver(
+      Folder folder, ContextRoot contextRoot, AnalysisOptions options) {
+    ContextBuilder builder = createContextBuilder(folder, options);
+    nd.AnalysisDriver analysisDriver = builder.buildDriver(contextRoot);
+    analysisDriver.results.listen((result) {
+      String path = result.path;
+      if (analysisServer.shouldSendErrorsNotificationFor(path)) {
+        final serverErrors = protocol.mapEngineErrors(
+            result.session.analysisContext.analysisOptions,
+            result.lineInfo,
+            result.errors,
+            toDiagnostic);
+
+        analysisServer.publishDiagnostics(result.path, serverErrors);
+      }
+    });
+    analysisDriver.exceptions.listen((nd.ExceptionResult result) {
+      String message = 'Analysis failed: ${result.path}';
+      if (result.contextKey != null) {
+        message += ' context: ${result.contextKey}';
+      }
+      AnalysisEngine.instance.logger.logError(message, result.exception);
+    });
+    analysisServer.driverMap[folder] = analysisDriver;
+    return analysisDriver;
+  }
+
+  @override
+  void afterWatchEvent(WatchEvent event) {
+    // TODO: implement afterWatchEvent
+  }
+
+  @override
+  void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
+    nd.AnalysisDriver analysisDriver = analysisServer.driverMap[contextFolder];
+    if (analysisDriver != null) {
+      changeSet.addedSources.forEach((source) {
+        analysisDriver.addFile(source.fullName);
+      });
+      changeSet.changedSources.forEach((source) {
+        analysisDriver.changeFile(source.fullName);
+      });
+      changeSet.removedSources.forEach((source) {
+        analysisDriver.removeFile(source.fullName);
+      });
+    }
+  }
+
+  @override
+  void applyFileRemoved(nd.AnalysisDriver driver, String file) {
+    driver.removeFile(file);
+    analysisServer.publishDiagnostics(file, []);
+  }
+
+  @override
+  void broadcastWatchEvent(WatchEvent event) {
+    // TODO: implement broadcastWatchEvent
+  }
+
+  @override
+  ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options) {
+    String defaultPackageFilePath = null;
+    String defaultPackagesDirectoryPath = null;
+    String path = (analysisServer.contextManager as ContextManagerImpl)
+        .normalizedPackageRoots[folder.path];
+    if (path != null) {
+      Resource resource = resourceProvider.getResource(path);
+      if (resource.exists) {
+        if (resource is File) {
+          defaultPackageFilePath = path;
+        } else {
+          defaultPackagesDirectoryPath = path;
+        }
+      }
+    }
+
+    ContextBuilderOptions builderOptions = new ContextBuilderOptions();
+    builderOptions.defaultOptions = options;
+    builderOptions.defaultPackageFilePath = defaultPackageFilePath;
+    builderOptions.defaultPackagesDirectoryPath = defaultPackagesDirectoryPath;
+    ContextBuilder builder = new ContextBuilder(
+        resourceProvider, analysisServer.sdkManager, null,
+        options: builderOptions);
+    builder.fileResolverProvider = analysisServer.fileResolverProvider;
+    builder.packageResolverProvider = analysisServer.packageResolverProvider;
+    builder.analysisDriverScheduler = analysisServer.analysisDriverScheduler;
+    builder.performanceLog = analysisServer._analysisPerformanceLogger;
+    builder.byteStore = analysisServer.byteStore;
+    builder.enableIndex = true;
+    return builder;
+  }
+
+  @override
+  void removeContext(Folder folder, List<String> flushedFiles) {
+    nd.AnalysisDriver driver = analysisServer.driverMap.remove(folder);
+    // Flush any errors for these files that the client may be displaying.
+    flushedFiles
+        ?.forEach((path) => analysisServer.publishDiagnostics(path, const []));
+    driver.dispose();
+  }
+}
+
+class NullNotificationManager implements NotificationManager {
+  @override
+  noSuchMethod(Invocation invocation) {}
+}
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_packet_transformer.dart b/pkg/analysis_server/lib/src/lsp/lsp_packet_transformer.dart
new file mode 100644
index 0000000..24a2d98
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/lsp_packet_transformer.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:convert';
+
+/// Transforms a stream of LSP data in the form:
+///
+///     Content-Length: xxx\r\n
+///     Content-Type: application/vscode-jsonrpc; charset=utf-8\r\n
+///     \r\n
+///     { JSON payload }
+///
+/// into just the JSON payload, decoded with the specified encoding. Line endings
+/// for headers must be \r\n on all platforms as defined in the LSP spec.
+class LspPacketTransformer extends StreamTransformerBase<List<int>, String> {
+  @override
+  Stream<String> bind(Stream<List<int>> stream) {
+    StreamSubscription<int> input;
+    StreamController<String> _output;
+    final buffer = <int>[];
+    bool isParsingHeaders = true;
+    LspHeaders headers;
+    _output = StreamController<String>(
+      onListen: () {
+        input = stream.expand((b) => b).listen(
+          (codeUnit) {
+            buffer.add(codeUnit);
+            if (isParsingHeaders && _endsWithCrLfCrLf(buffer)) {
+              headers = _parseHeaders(buffer);
+              buffer.clear();
+              isParsingHeaders = false;
+            } else if (!isParsingHeaders &&
+                buffer.length >= headers.contentLength) {
+              // UTF-8 is the default - and only supported - encoding for LSP.
+              // The string 'utf8' is valid since it was published in the original spec.
+              // Any other encodings should be rejected with an error.
+              if ([null, 'utf-8', 'utf8']
+                  .contains(headers.encoding?.toLowerCase())) {
+                _output.add(utf8.decode(buffer));
+              } else {
+                _output.addError(new InvalidEncodingError(headers.rawHeaders));
+              }
+              buffer.clear();
+              isParsingHeaders = true;
+            }
+          },
+          onError: _output.addError,
+          onDone: _output.close,
+        );
+      },
+      onPause: () => input.pause(),
+      onResume: () => input.resume(),
+      onCancel: () => input.cancel(),
+    );
+    return _output.stream;
+  }
+
+  /// Whether [buffer] ends in '\r\n\r\n'.
+  static bool _endsWithCrLfCrLf(List<int> buffer) {
+    var l = buffer.length;
+    return l > 4 &&
+        buffer[l - 1] == 10 &&
+        buffer[l - 2] == 13 &&
+        buffer[l - 3] == 10 &&
+        buffer[l - 4] == 13;
+  }
+
+  /// Decodes [buffer] into a String and returns the 'Content-Length' header value.
+  static LspHeaders _parseHeaders(List<int> buffer) {
+    // Headers are specified as always ASCII in LSP.
+    final asString = ascii.decode(buffer);
+    final headers = asString.split('\r\n');
+    final lengthHeader =
+        headers.firstWhere((h) => h.startsWith('Content-Length'));
+    final length = lengthHeader.split(':').last.trim();
+    final contentTypeHeader = headers
+        .firstWhere((h) => h.startsWith('Content-Type'), orElse: () => null);
+    final encoding = _extractEncoding(contentTypeHeader);
+    return new LspHeaders(asString, int.parse(length), encoding);
+  }
+
+  static String _extractEncoding(String header) {
+    final charset = header
+        ?.split(';')
+        ?.map((s) => s.trim().toLowerCase())
+        ?.firstWhere((s) => s.startsWith('charset='), orElse: () => null);
+
+    return charset == null ? null : charset.split('=')[1];
+  }
+}
+
+class LspHeaders {
+  final String rawHeaders;
+  final int contentLength;
+  final String encoding;
+  LspHeaders(this.rawHeaders, this.contentLength, this.encoding);
+}
+
+class InvalidEncodingError {
+  final String headers;
+  InvalidEncodingError(this.headers);
+
+  @override
+  String toString() =>
+      'Encoding in supplied headers is not supported.\n\nHeaders:\n$headers';
+}
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart
new file mode 100644
index 0000000..25a15e1
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/lsp_socket_server.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/socket_server.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+
+/**
+ * Instances of the class [SocketServer] implement the common parts of
+ * http-based and stdio-based analysis servers.  The primary responsibility of
+ * the SocketServer is to manage the lifetime of the AnalysisServer and to
+ * encode and decode the JSON messages exchanged with the client.
+ */
+class LspSocketServer implements AbstractSocketServer {
+  final AnalysisServerOptions analysisServerOptions;
+  /**
+   * The analysis server that was created when a client established a
+   * connection, or `null` if no such connection has yet been established.
+   */
+  LspAnalysisServer analysisServer;
+
+  /**
+   * The function used to create a new SDK using the default SDK.
+   */
+  final DartSdkManager sdkManager;
+
+  final InstrumentationService instrumentationService;
+
+  LspSocketServer(
+    this.analysisServerOptions,
+    this.sdkManager,
+    this.instrumentationService,
+  );
+
+  /**
+   * Create an analysis server which will communicate with the client using the
+   * given serverChannel.
+   */
+  void createAnalysisServer(LspServerCommunicationChannel serverChannel) {
+    if (analysisServer != null) {
+      ResponseError error = new ResponseError<void>(
+          ServerErrorCodes.ServerAlreadyStarted,
+          'Server already started',
+          null);
+      serverChannel.sendNotification(new NotificationMessage(
+        Method.window_showMessage,
+        new ShowMessageParams(MessageType.Error, error.message),
+        jsonRpcVersion,
+      ));
+      serverChannel.listen((Message message) {
+        if (message is RequestMessage) {
+          serverChannel.sendResponse(
+              new ResponseMessage(message.id, null, error, jsonRpcVersion));
+        }
+      });
+      return;
+    }
+
+    PhysicalResourceProvider resourceProvider;
+    if (analysisServerOptions.fileReadMode == 'as-is') {
+      resourceProvider = new PhysicalResourceProvider(null,
+          stateLocation: analysisServerOptions.cacheFolder);
+    } else if (analysisServerOptions.fileReadMode == 'normalize-eol-always') {
+      resourceProvider = new PhysicalResourceProvider(
+          PhysicalResourceProvider.NORMALIZE_EOL_ALWAYS,
+          stateLocation: analysisServerOptions.cacheFolder);
+    } else {
+      throw new Exception(
+          'File read mode was set to the unknown mode: $analysisServerOptions.fileReadMode');
+    }
+
+    analysisServer = new LspAnalysisServer(serverChannel, resourceProvider,
+        analysisServerOptions, sdkManager, instrumentationService);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
new file mode 100644
index 0000000..d69d15d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -0,0 +1,602 @@
+import 'dart:collection';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart'
+    show ResponseError;
+import 'package:analysis_server/lsp_protocol/protocol_special.dart' as lsp;
+import 'package:analysis_server/lsp_protocol/protocol_special.dart'
+    show ErrorOr, Either2, Either4;
+import 'package:analysis_server/src/lsp/constants.dart' as lsp;
+import 'package:analysis_server/src/lsp/dartdoc.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart' as lsp;
+import 'package:analysis_server/src/lsp/source_edits.dart';
+import 'package:analysis_server/src/protocol_server.dart' as server
+    hide AnalysisError;
+import 'package:analyzer/dart/analysis/results.dart' as server;
+import 'package:analyzer/error/error.dart' as server;
+import 'package:analyzer/source/line_info.dart' as server;
+import 'package:analyzer/src/generated/source.dart' as server;
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart' as server;
+
+const languageSourceName = 'dart';
+
+lsp.Either2<String, lsp.MarkupContent> asStringOrMarkupContent(
+    List<lsp.MarkupKind> preferredFormats, String content) {
+  if (content == null) {
+    return null;
+  }
+
+  return preferredFormats == null
+      ? new lsp.Either2<String, lsp.MarkupContent>.t1(content)
+      : new lsp.Either2<String, lsp.MarkupContent>.t2(
+          _asMarkup(preferredFormats, content));
+}
+
+/// Note: This code will fetch the version of each document being modified so
+/// it's important to call this immediately after computing edits to ensure
+/// the document is not modified before the version number is read.
+lsp.WorkspaceEdit createWorkspaceEdit(
+    lsp.LspAnalysisServer server, server.SourceChange change) {
+  return toWorkspaceEdit(
+      server.clientCapabilities?.workspace,
+      change.edits
+          .map((e) => new FileEditInformation(
+              server.getVersionedDocumentIdentifier(e.file),
+              server.getLineInfo(e.file),
+              e.edits))
+          .toList());
+}
+
+lsp.CompletionItemKind elementKindToCompletionItemKind(
+  HashSet<lsp.CompletionItemKind> clientSupportedCompletionKinds,
+  server.ElementKind kind,
+) {
+  bool isSupported(lsp.CompletionItemKind kind) =>
+      clientSupportedCompletionKinds.contains(kind);
+
+  List<lsp.CompletionItemKind> getKindPreferences() {
+    switch (kind) {
+      case server.ElementKind.CLASS:
+      case server.ElementKind.CLASS_TYPE_ALIAS:
+        return const [lsp.CompletionItemKind.Class];
+      case server.ElementKind.COMPILATION_UNIT:
+        return const [lsp.CompletionItemKind.Module];
+      case server.ElementKind.CONSTRUCTOR:
+      case server.ElementKind.CONSTRUCTOR_INVOCATION:
+        return const [lsp.CompletionItemKind.Constructor];
+      case server.ElementKind.ENUM:
+      case server.ElementKind.ENUM_CONSTANT:
+        return const [lsp.CompletionItemKind.Enum];
+      case server.ElementKind.FIELD:
+        return const [lsp.CompletionItemKind.Field];
+      case server.ElementKind.FILE:
+        return const [lsp.CompletionItemKind.File];
+      case server.ElementKind.FUNCTION:
+        return const [lsp.CompletionItemKind.Function];
+      case server.ElementKind.FUNCTION_TYPE_ALIAS:
+        return const [lsp.CompletionItemKind.Class];
+      case server.ElementKind.GETTER:
+        return const [lsp.CompletionItemKind.Property];
+      case server.ElementKind.LABEL:
+        // There isn't really a good CompletionItemKind for labels so we'll
+        // just use the Text option.
+        return const [lsp.CompletionItemKind.Text];
+      case server.ElementKind.LIBRARY:
+        return const [lsp.CompletionItemKind.Module];
+      case server.ElementKind.LOCAL_VARIABLE:
+        return const [lsp.CompletionItemKind.Variable];
+      case server.ElementKind.METHOD:
+        return const [lsp.CompletionItemKind.Method];
+      case server.ElementKind.PARAMETER:
+      case server.ElementKind.PREFIX:
+        return const [lsp.CompletionItemKind.Variable];
+      case server.ElementKind.SETTER:
+        return const [lsp.CompletionItemKind.Property];
+      case server.ElementKind.TOP_LEVEL_VARIABLE:
+        return const [lsp.CompletionItemKind.Variable];
+      case server.ElementKind.TYPE_PARAMETER:
+        return const [
+          lsp.CompletionItemKind.TypeParameter,
+          lsp.CompletionItemKind.Variable,
+        ];
+      case server.ElementKind.UNIT_TEST_GROUP:
+      case server.ElementKind.UNIT_TEST_TEST:
+        return const [lsp.CompletionItemKind.Method];
+      default:
+        return null;
+    }
+  }
+
+  return getKindPreferences().firstWhere(isSupported, orElse: () => null);
+}
+
+lsp.SymbolKind elementKindToSymbolKind(
+  HashSet<lsp.SymbolKind> clientSupportedSymbolKinds,
+  server.ElementKind kind,
+) {
+  bool isSupported(lsp.SymbolKind kind) =>
+      clientSupportedSymbolKinds.contains(kind);
+
+  List<lsp.SymbolKind> getKindPreferences() {
+    switch (kind) {
+      case server.ElementKind.CLASS:
+      case server.ElementKind.CLASS_TYPE_ALIAS:
+        return const [lsp.SymbolKind.Class];
+      case server.ElementKind.COMPILATION_UNIT:
+        return const [lsp.SymbolKind.Module];
+      case server.ElementKind.CONSTRUCTOR:
+      case server.ElementKind.CONSTRUCTOR_INVOCATION:
+        return const [lsp.SymbolKind.Constructor];
+      case server.ElementKind.ENUM:
+      case server.ElementKind.ENUM_CONSTANT:
+        return const [lsp.SymbolKind.Enum];
+      case server.ElementKind.FIELD:
+        return const [lsp.SymbolKind.Field];
+      case server.ElementKind.FILE:
+        return const [lsp.SymbolKind.File];
+      case server.ElementKind.FUNCTION:
+      case server.ElementKind.FUNCTION_INVOCATION:
+        return const [lsp.SymbolKind.Function];
+      case server.ElementKind.FUNCTION_TYPE_ALIAS:
+        return const [lsp.SymbolKind.Class];
+      case server.ElementKind.GETTER:
+        return const [lsp.SymbolKind.Property];
+      case server.ElementKind.LABEL:
+        // There isn't really a good SymbolKind for labels so we'll
+        // just use the Null option.
+        return const [lsp.SymbolKind.Null];
+      case server.ElementKind.LIBRARY:
+        return const [lsp.SymbolKind.Namespace];
+      case server.ElementKind.LOCAL_VARIABLE:
+        return const [lsp.SymbolKind.Variable];
+      case server.ElementKind.METHOD:
+        return const [lsp.SymbolKind.Method];
+      case server.ElementKind.MIXIN:
+        return const [lsp.SymbolKind.Class];
+      case server.ElementKind.PARAMETER:
+      case server.ElementKind.PREFIX:
+        return const [lsp.SymbolKind.Variable];
+      case server.ElementKind.SETTER:
+        return const [lsp.SymbolKind.Property];
+      case server.ElementKind.TOP_LEVEL_VARIABLE:
+        return const [lsp.SymbolKind.Variable];
+      case server.ElementKind.TYPE_PARAMETER:
+        return const [
+          lsp.SymbolKind.TypeParameter,
+          lsp.SymbolKind.Variable,
+        ];
+      case server.ElementKind.UNIT_TEST_GROUP:
+      case server.ElementKind.UNIT_TEST_TEST:
+        return const [lsp.SymbolKind.Method];
+      default:
+        assert(false, 'Unexpected element kind $kind');
+        return null;
+    }
+  }
+
+  return getKindPreferences().firstWhere(isSupported, orElse: () => null);
+}
+
+String getCompletionDetail(
+  server.CompletionSuggestion suggestion,
+  lsp.CompletionItemKind completionKind,
+  bool clientSupportsDeprecated,
+) {
+  final hasElement = suggestion.element != null;
+  final hasParameters = hasElement &&
+      suggestion.element.parameters != null &&
+      suggestion.element.parameters.isNotEmpty;
+  final hasReturnType = hasElement &&
+      suggestion.element.returnType != null &&
+      suggestion.element.returnType.isNotEmpty;
+  final hasParameterType =
+      suggestion.parameterType != null && suggestion.parameterType.isNotEmpty;
+
+  final prefix = clientSupportsDeprecated || !suggestion.isDeprecated
+      ? ''
+      : '(Deprecated) ';
+
+  if (completionKind == lsp.CompletionItemKind.Property) {
+    // Setters appear as methods with one arg but they also cause getters to not
+    // appear in the completion list, so displaying them as setters is misleading.
+    // To avoid this, always show only the return type, whether it's a getter
+    // or a setter.
+    return prefix +
+        (suggestion.element.kind == server.ElementKind.GETTER
+            ? suggestion.element.returnType
+            // Don't assume setters always have parameters
+            // See https://github.com/dart-lang/sdk/issues/27747
+            : suggestion.element.parameters != null &&
+                    suggestion.element.parameters.isNotEmpty
+                // Extract the type part from '(MyType value)`
+                ? suggestion.element.parameters.substring(
+                    1, suggestion.element.parameters.lastIndexOf(" "))
+                : '');
+  } else if (hasParameters && hasReturnType) {
+    return '$prefix${suggestion.element.parameters} → ${suggestion.element.returnType}';
+  } else if (hasReturnType) {
+    return '$prefix${suggestion.element.returnType}';
+  } else if (hasParameterType) {
+    return '$prefix${suggestion.parameterType}';
+  } else {
+    return prefix;
+  }
+}
+
+lsp.Location navigationTargetToLocation(String targetFilePath,
+    server.NavigationTarget target, server.LineInfo lineInfo) {
+  if (lineInfo == null) {
+    return null;
+  }
+
+  return new lsp.Location(
+    Uri.file(targetFilePath).toString(),
+    toRange(lineInfo, target.offset, target.length),
+  );
+}
+
+/// Returns the file system path for a TextDocumentIdentifier.
+ErrorOr<String> pathOfDoc(lsp.TextDocumentIdentifier doc) =>
+    pathOfUri(Uri.tryParse(doc?.uri));
+
+/// Returns the file system path for a TextDocumentItem.
+ErrorOr<String> pathOfDocItem(lsp.TextDocumentItem doc) =>
+    pathOfUri(Uri.tryParse(doc?.uri));
+
+/// Returns the file system path for a file URI.
+ErrorOr<String> pathOfUri(Uri uri) {
+  if (uri == null) {
+    return new ErrorOr<String>.error(new ResponseError(
+        lsp.ServerErrorCodes.InvalidFilePath,
+        'Document URI was not supplied',
+        null));
+  }
+  final isValidFileUri = (uri?.isScheme('file') ?? false);
+  if (!isValidFileUri) {
+    return new ErrorOr<String>.error(new ResponseError(
+        lsp.ServerErrorCodes.InvalidFilePath,
+        'URI was not a valid file:// URI',
+        uri));
+  }
+  try {
+    return new ErrorOr<String>.success(uri.toFilePath());
+  } catch (e) {
+    // Even if tryParse() works and file == scheme, toFilePath() can throw on
+    // Windows if there are invalid characters.
+    return new ErrorOr<String>.error(new ResponseError(
+        lsp.ServerErrorCodes.InvalidFilePath,
+        'File URI did not contain a valid file path',
+        uri));
+  }
+}
+
+lsp.Location searchResultToLocation(
+    server.SearchResult result, server.LineInfo lineInfo) {
+  final location = result.location;
+
+  if (lineInfo == null) {
+    return null;
+  }
+
+  return new lsp.Location(
+    Uri.file(result.location.file).toString(),
+    toRange(lineInfo, location.offset, location.length),
+  );
+}
+
+lsp.CompletionItemKind suggestionKindToCompletionItemKind(
+  HashSet<lsp.CompletionItemKind> clientSupportedCompletionKinds,
+  server.CompletionSuggestionKind kind,
+  String label,
+) {
+  bool isSupported(lsp.CompletionItemKind kind) =>
+      clientSupportedCompletionKinds.contains(kind);
+
+  List<lsp.CompletionItemKind> getKindPreferences() {
+    switch (kind) {
+      case server.CompletionSuggestionKind.ARGUMENT_LIST:
+        return const [lsp.CompletionItemKind.Variable];
+      case server.CompletionSuggestionKind.IMPORT:
+        // For package/relative URIs, we can send File/Folder kinds for better icons.
+        if (!label.startsWith('dart:')) {
+          return label.endsWith('.dart')
+              ? const [
+                  lsp.CompletionItemKind.File,
+                  lsp.CompletionItemKind.Module,
+                ]
+              : const [
+                  lsp.CompletionItemKind.Folder,
+                  lsp.CompletionItemKind.Module,
+                ];
+        }
+        return const [lsp.CompletionItemKind.Module];
+      case server.CompletionSuggestionKind.IDENTIFIER:
+        return const [lsp.CompletionItemKind.Variable];
+      case server.CompletionSuggestionKind.INVOCATION:
+        return const [lsp.CompletionItemKind.Method];
+      case server.CompletionSuggestionKind.KEYWORD:
+        return const [lsp.CompletionItemKind.Keyword];
+      case server.CompletionSuggestionKind.NAMED_ARGUMENT:
+        return const [lsp.CompletionItemKind.Variable];
+      case server.CompletionSuggestionKind.OPTIONAL_ARGUMENT:
+        return const [lsp.CompletionItemKind.Variable];
+      case server.CompletionSuggestionKind.PARAMETER:
+        return const [lsp.CompletionItemKind.Value];
+      default:
+        return null;
+    }
+  }
+
+  return getKindPreferences().firstWhere(isSupported, orElse: () => null);
+}
+
+lsp.CompletionItem toCompletionItem(
+  lsp.TextDocumentClientCapabilitiesCompletion completionCapabilities,
+  HashSet<lsp.CompletionItemKind> supportedCompletionItemKinds,
+  server.LineInfo lineInfo,
+  server.CompletionSuggestion suggestion,
+  int replacementOffset,
+  int replacementLength,
+) {
+  final label = suggestion.displayText != null
+      ? suggestion.displayText
+      : suggestion.completion;
+
+  final useDeprecated =
+      completionCapabilities?.completionItem?.deprecatedSupport == true;
+  final formats = completionCapabilities?.completionItem?.documentationFormat;
+
+  final completionKind = suggestion.element != null
+      ? elementKindToCompletionItemKind(
+          supportedCompletionItemKinds, suggestion.element.kind)
+      : suggestionKindToCompletionItemKind(
+          supportedCompletionItemKinds, suggestion.kind, label);
+
+  return new lsp.CompletionItem(
+    label,
+    completionKind,
+    getCompletionDetail(suggestion, completionKind, useDeprecated),
+    asStringOrMarkupContent(formats, cleanDartdoc(suggestion.docComplete)),
+    useDeprecated ? suggestion.isDeprecated : null,
+    false, // preselect
+    // Relevance is a number, highest being best. LSP does text sort so subtract
+    // from a large number so that a text sort will result in the correct order.
+    // 555 -> 999455
+    //  10 -> 999990
+    //   1 -> 999999
+    (1000000 - suggestion.relevance).toString(),
+    null, // filterText uses label if not set
+    null, // insertText is deprecated, but also uses label if not set
+    // We don't have completions that use snippets, so we always return PlainText.
+    lsp.InsertTextFormat.PlainText,
+    new lsp.TextEdit(
+      // TODO(dantup): If `clientSupportsSnippets == true` then we should map
+      // `selection` in to a snippet (see how Dart Code does this).
+      toRange(lineInfo, replacementOffset, replacementLength),
+      suggestion.completion,
+    ),
+    [], // additionalTextEdits, used for adding imports, etc.
+    [], // commitCharacters
+    null, // command
+    null, // data, useful for if using lazy resolve, this comes back to us
+  );
+}
+
+lsp.Diagnostic toDiagnostic(
+    server.LineInfo lineInfo, server.AnalysisError error,
+    [server.ErrorSeverity errorSeverity]) {
+  server.ErrorCode errorCode = error.errorCode;
+
+  // Default to the error's severity if none is specified.
+  errorSeverity ??= errorCode.errorSeverity;
+
+  return new lsp.Diagnostic(
+    toRange(lineInfo, error.offset, error.length),
+    toDiagnosticSeverity(errorSeverity),
+    errorCode.name.toLowerCase(),
+    languageSourceName,
+    error.message,
+    null,
+  );
+}
+
+lsp.DiagnosticSeverity toDiagnosticSeverity(server.ErrorSeverity severity) {
+  switch (severity) {
+    case server.ErrorSeverity.ERROR:
+      return lsp.DiagnosticSeverity.Error;
+    case server.ErrorSeverity.WARNING:
+      return lsp.DiagnosticSeverity.Warning;
+    case server.ErrorSeverity.INFO:
+      return lsp.DiagnosticSeverity.Information;
+    // Note: LSP also supports "Hint", but they won't render in things like the
+    // VS Code errors list as they're apparently intended to communicate
+    // non-visible diagnostics back (for example, if you wanted to grey out
+    // unreachable code without producing an item in the error list).
+    default:
+      throw 'Unknown AnalysisErrorSeverity: $severity';
+  }
+}
+
+List<lsp.DocumentHighlight> toHighlights(
+    server.LineInfo lineInfo, server.Occurrences occurrences) {
+  return occurrences.offsets
+      .map((offset) => new lsp.DocumentHighlight(
+          toRange(lineInfo, offset, occurrences.length), null))
+      .toList();
+}
+
+ErrorOr<int> toOffset(
+  server.LineInfo lineInfo,
+  lsp.Position pos, {
+  failureIsCritial: false,
+}) {
+  if (pos.line > lineInfo.lineCount) {
+    return new ErrorOr<int>.error(new lsp.ResponseError(
+        failureIsCritial
+            ? lsp.ServerErrorCodes.ClientServerInconsistentState
+            : lsp.ServerErrorCodes.InvalidFileLineCol,
+        'Invalid line number',
+        pos.line));
+  }
+  // TODO(dantup): Is there any way to validate the character? We could ensure
+  // it's less than the offset of the next line, but that would only work for
+  // all lines except the last one.
+  return new ErrorOr<int>.success(
+      lineInfo.getOffsetOfLine(pos.line) + pos.character);
+}
+
+lsp.Position toPosition(server.CharacterLocation location) {
+  // LSP is zero-based, but analysis server is 1-based.
+  return new lsp.Position(location.lineNumber - 1, location.columnNumber - 1);
+}
+
+lsp.Range toRange(server.LineInfo lineInfo, int offset, int length) {
+  server.CharacterLocation start = lineInfo.getLocation(offset);
+  server.CharacterLocation end = lineInfo.getLocation(offset + length);
+
+  return new lsp.Range(
+    toPosition(start),
+    toPosition(end),
+  );
+}
+
+lsp.SignatureHelp toSignatureHelp(List<lsp.MarkupKind> preferredFormats,
+    server.AnalysisGetSignatureResult signature) {
+  // For now, we only support returning one (though we may wish to use named
+  // args. etc. to provide one for each possible "next" option when the cursor
+  // is at the end ready to provide another argument).
+
+  /// Gets the label for an individual parameter in the form
+  ///     String s = 'foo'
+  String getParamLabel(server.ParameterInfo p) {
+    final def = p.defaultValue != null ? ' = ${p.defaultValue}' : '';
+    return '${p.type} ${p.name}$def';
+  }
+
+  /// Gets the full signature label in the form
+  ///     foo(String s, int i, bool a = true)
+  String getSignatureLabel(server.AnalysisGetSignatureResult resp) {
+    final req = signature.parameters
+        .where((p) => p.kind == server.ParameterKind.REQUIRED)
+        .toList();
+    final opt = signature.parameters
+        .where((p) => p.kind == server.ParameterKind.OPTIONAL)
+        .toList();
+    final named = signature.parameters
+        .where((p) => p.kind == server.ParameterKind.NAMED)
+        .toList();
+    final params = [];
+    if (req.isNotEmpty) {
+      params.add(req.map(getParamLabel).join(", "));
+    }
+    if (opt.isNotEmpty) {
+      params.add("[" + opt.map(getParamLabel).join(", ") + "]");
+    }
+    if (named.isNotEmpty) {
+      params.add("{" + named.map(getParamLabel).join(", ") + "}");
+    }
+    return '${resp.name}(${params.join(", ")})';
+  }
+
+  lsp.ParameterInformation toParameterInfo(server.ParameterInfo param) {
+    // LSP 3.14.0 supports providing label offsets (to avoid clients having
+    // to guess based on substrings). We should check the
+    // signatureHelp.signatureInformation.parameterInformation.labelOffsetSupport
+    // capability when deciding to send that.
+    return new lsp.ParameterInformation(getParamLabel(param), null);
+  }
+
+  final cleanDoc = cleanDartdoc(signature.dartdoc);
+
+  return new lsp.SignatureHelp(
+    [
+      new lsp.SignatureInformation(
+        getSignatureLabel(signature),
+        asStringOrMarkupContent(preferredFormats, cleanDoc),
+        signature.parameters.map(toParameterInfo).toList(),
+      ),
+    ],
+    0, // activeSignature
+    // TODO(dantup): The LSP spec says this value will default to 0 if it's
+    // not supplied or outside of the value range. However, setting -1 results
+    // in no parameters being selected in VS Code, whereas null/0 will select the first.
+    // We'd like for none to be selected (since we don't support this yet) so
+    // we send -1. I've made a request for LSP to support not selecting a parameter
+    // (because you could also be on param 5 of an invalid call to a function
+    // taking only 3 arguments) here:
+    // https://github.com/Microsoft/language-server-protocol/issues/456#issuecomment-452318297
+    -1, // activeParameter
+  );
+}
+
+lsp.TextDocumentEdit toTextDocumentEdit(FileEditInformation edit) {
+  return new lsp.TextDocumentEdit(
+    edit.doc,
+    edit.edits.map((e) => toTextEdit(edit.lineInfo, e)).toList(),
+  );
+}
+
+lsp.TextEdit toTextEdit(server.LineInfo lineInfo, server.SourceEdit edit) {
+  return new lsp.TextEdit(
+    toRange(lineInfo, edit.offset, edit.length),
+    edit.replacement,
+  );
+}
+
+lsp.WorkspaceEdit toWorkspaceEdit(
+  lsp.WorkspaceClientCapabilities capabilities,
+  List<FileEditInformation> edits,
+) {
+  final clientSupportsTextDocumentEdits =
+      capabilities?.workspaceEdit?.documentChanges == true;
+  if (clientSupportsTextDocumentEdits) {
+    return new lsp.WorkspaceEdit(
+        null,
+        Either2<
+            List<lsp.TextDocumentEdit>,
+            List<
+                Either4<lsp.TextDocumentEdit, lsp.CreateFile, lsp.RenameFile,
+                    lsp.DeleteFile>>>.t1(
+          edits.map(toTextDocumentEdit).toList(),
+        ));
+  } else {
+    return new lsp.WorkspaceEdit(toWorkspaceEditChanges(edits), null);
+  }
+}
+
+Map<String, List<lsp.TextEdit>> toWorkspaceEditChanges(
+    List<FileEditInformation> edits) {
+  createEdit(FileEditInformation file) {
+    final edits =
+        file.edits.map((edit) => toTextEdit(file.lineInfo, edit)).toList();
+    return new MapEntry(file.doc.uri, edits);
+  }
+
+  return Map<String, List<lsp.TextEdit>>.fromEntries(edits.map(createEdit));
+}
+
+lsp.MarkupContent _asMarkup(
+    List<lsp.MarkupKind> preferredFormats, String content) {
+  // It's not valid to call this function with a null format, as null formats
+  // do not support MarkupContent. [asStringOrMarkupContent] is probably the
+  // better choice.
+  assert(preferredFormats != null);
+
+  if (content == null) {
+    return null;
+  }
+
+  if (preferredFormats.isEmpty) {
+    preferredFormats.add(lsp.MarkupKind.Markdown);
+  }
+
+  final supportsMarkdown = preferredFormats.contains(lsp.MarkupKind.Markdown);
+  final supportsPlain = preferredFormats.contains(lsp.MarkupKind.PlainText);
+  // Since our PlainText version is actually just Markdown, only advertise it
+  // as PlainText if the client explicitly supports PlainText and not Markdown.
+  final format = supportsPlain && !supportsMarkdown
+      ? lsp.MarkupKind.PlainText
+      : lsp.MarkupKind.Markdown;
+
+  return new lsp.MarkupContent(format, content);
+}
diff --git a/pkg/analysis_server/lib/src/lsp/source_edits.dart b/pkg/analysis_server/lib/src/lsp/source_edits.dart
new file mode 100644
index 0000000..a3361d9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/lsp/source_edits.dart
@@ -0,0 +1,78 @@
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analysis_server/src/protocol_server.dart' as server
+    show SourceEdit;
+import 'package:analyzer/source/line_info.dart';
+import 'package:dart_style/dart_style.dart';
+
+final DartFormatter formatter = new DartFormatter();
+
+ErrorOr<String> applyEdits(
+  String oldContent,
+  List<TextDocumentContentChangeEvent> changes, {
+  failureIsCritical: false,
+}) {
+  String newContent = oldContent;
+  for (var change in changes) {
+    if (change.range == null && change.rangeLength == null) {
+      newContent = change.text;
+    } else {
+      final lines = LineInfo.fromContent(newContent);
+      final offsetStart = toOffset(lines, change.range.start,
+          failureIsCritial: failureIsCritical);
+      final offsetEnd = toOffset(lines, change.range.end,
+          failureIsCritial: failureIsCritical);
+      if (offsetStart.isError) {
+        return new ErrorOr<String>.error(offsetStart.error);
+      }
+      if (offsetEnd.isError) {
+        return new ErrorOr<String>.error(offsetEnd.error);
+      }
+      newContent = newContent.replaceRange(
+          offsetStart.result, offsetEnd.result, change.text);
+    }
+  }
+  return new ErrorOr<String>.success(newContent);
+}
+
+List<TextEdit> generateEditsForFormatting(String unformattedSource) {
+  final lineInfo = new LineInfo.fromContent(unformattedSource);
+  final code =
+      new SourceCode(unformattedSource, uri: null, isCompilationUnit: true);
+  SourceCode formattedResult;
+  try {
+    formattedResult = formatter.formatSource(code);
+  } on FormatterException {
+    // If the document fails to parse, just return no edits to avoid the the
+    // use seeing edits on every save with invalid code (if LSP gains the
+    // ability to pass a context to know if the format was manually invoked
+    // we may wish to change this to return an error for that case).
+    return null;
+  }
+  final formattedSource = formattedResult.text;
+
+  if (formattedSource == unformattedSource) {
+    return null;
+  }
+
+  // We don't currently support returning "minimal" edits, we just replace
+  // entire document.
+  final end = lineInfo.getLocation(unformattedSource.length);
+  return [
+    new TextEdit(
+      new Range(new Position(0, 0), toPosition(end)),
+      formattedSource,
+    )
+  ];
+}
+
+/// Helper class that bundles up all information required when converting server
+/// SourceEdits into LSP-compatible WorkspaceEdits.
+class FileEditInformation {
+  final VersionedTextDocumentIdentifier doc;
+  final LineInfo lineInfo;
+  final List<server.SourceEdit> edits;
+
+  FileEditInformation(this.doc, this.lineInfo, this.edits);
+}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index 32b9153..87aa99d 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -27,7 +27,7 @@
     return;
   }
   for (String file in files) {
-    CompilationUnit unit = server.getCachedAnalysisResult(file)?.unit;
+    CompilationUnit unit = server.getCachedResolvedUnit(file)?.unit;
     CompilationUnitElement unitElement = unit?.declaredElement;
     if (unitElement != null) {
       try {
diff --git a/pkg/analysis_server/lib/src/plugin/notification_manager.dart b/pkg/analysis_server/lib/src/plugin/notification_manager.dart
index 344697c..120afe9 100644
--- a/pkg/analysis_server/lib/src/plugin/notification_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/notification_manager.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_locator.dart b/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
index ba53ab3..14c7069 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_locator.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index 6f95fd4a..de2cccf 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -12,11 +12,11 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/context/context_root.dart' as analyzer;
-import 'package:analyzer/src/generated/bazel.dart';
-import 'package:analyzer/src/generated/gn.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/workspace.dart';
 import 'package:analyzer/src/util/glob.dart';
+import 'package:analyzer/src/workspace/bazel.dart';
+import 'package:analyzer/src/workspace/gn.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:analyzer_plugin/channel/channel.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
index e937e26..ecfe285 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_watcher.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/plugin/request_converter.dart b/pkg/analysis_server/lib/src/plugin/request_converter.dart
index 5caa071..9f0a071 100644
--- a/pkg/analysis_server/lib/src/plugin/request_converter.dart
+++ b/pkg/analysis_server/lib/src/plugin/request_converter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/plugin/result_collector.dart b/pkg/analysis_server/lib/src/plugin/result_collector.dart
index c2e3274..dbee3d3 100644
--- a/pkg/analysis_server/lib/src/plugin/result_collector.dart
+++ b/pkg/analysis_server/lib/src/plugin/result_collector.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -30,7 +30,7 @@
    * the plugin that provided the partial results. The value is the partial
    * results contributed by the plugin for the file.
    */
-  Map<String, Map<String, E>> resultMap = <String, Map<String, E>>{};
+  final Map<String, Map<String, E>> resultMap = <String, Map<String, E>>{};
 
   /**
    * Initialize a newly created result manager.
diff --git a/pkg/analysis_server/lib/src/plugin/result_converter.dart b/pkg/analysis_server/lib/src/plugin/result_converter.dart
index 40a5d2b..b73a280 100644
--- a/pkg/analysis_server/lib/src/plugin/result_converter.dart
+++ b/pkg/analysis_server/lib/src/plugin/result_converter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/plugin/result_merger.dart b/pkg/analysis_server/lib/src/plugin/result_merger.dart
index 43d0a56..1db0891 100644
--- a/pkg/analysis_server/lib/src/plugin/result_merger.dart
+++ b/pkg/analysis_server/lib/src/plugin/result_merger.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/protocol/protocol_internal.dart b/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
index a36fc49..1d6ed2d 100644
--- a/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analysis_server/lib/src/protocol/protocol_internal.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 9ff7232..fc2d22a 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -35,7 +35,21 @@
     engine.AnalysisOptions analysisOptions,
     engine.LineInfo lineInfo,
     List<engine.AnalysisError> errors) {
-  List<AnalysisError> serverErrors = <AnalysisError>[];
+  return mapEngineErrors(
+      analysisOptions, lineInfo, errors, newAnalysisError_fromEngine);
+}
+
+/**
+ * Translates engine errors through the ErrorProcessor.
+ */
+List<T> mapEngineErrors<T>(
+    engine.AnalysisOptions analysisOptions,
+    engine.LineInfo lineInfo,
+    List<engine.AnalysisError> errors,
+    T Function(engine.LineInfo lineInfo, engine.AnalysisError error,
+            [engine.ErrorSeverity errorSeverity])
+        constructor) {
+  List<T> serverErrors = <T>[];
   for (engine.AnalysisError error in errors) {
     ErrorProcessor processor =
         ErrorProcessor.getProcessor(analysisOptions, error);
@@ -44,11 +58,10 @@
       // Errors with null severity are filtered out.
       if (severity != null) {
         // Specified severities override.
-        serverErrors
-            .add(newAnalysisError_fromEngine(lineInfo, error, severity));
+        serverErrors.add(constructor(lineInfo, error, severity));
       }
     } else {
-      serverErrors.add(newAnalysisError_fromEngine(lineInfo, error));
+      serverErrors.add(constructor(lineInfo, error));
     }
   }
   return serverErrors;
@@ -163,7 +176,7 @@
  */
 Location newLocation_fromNode(engine.AstNode node) {
   engine.CompilationUnit unit =
-      node.getAncestor((node) => node is engine.CompilationUnit);
+      node.thisOrAncestorOfType<engine.CompilationUnit>();
   engine.CompilationUnitElement unitElement = unit.declaredElement;
   engine.SourceRange range = new engine.SourceRange(node.offset, node.length);
   return _locationForArgs(unitElement, range);
diff --git a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
index f100d1e..a73691d 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
@@ -1,11 +1,11 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 
@@ -53,7 +53,7 @@
    * The analysis result for the file in which the completion is being
    * requested.
    */
-  AnalysisResult get result;
+  ResolvedUnitResult get result;
 
   /**
    * Return the source in which the completion is being requested.
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
index f96c93e..c5ee92f 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/search/element_references.dart b/pkg/analysis_server/lib/src/search/element_references.dart
index 79f3714f..37a6872 100644
--- a/pkg/analysis_server/lib/src/search/element_references.dart
+++ b/pkg/analysis_server/lib/src/search/element_references.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index 65be43a..ae98245 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index 65eee55..e4bcfe5 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/server/detachable_filesystem_manager.dart b/pkg/analysis_server/lib/src/server/detachable_filesystem_manager.dart
index dc2cead..1f45e5d 100644
--- a/pkg/analysis_server/lib/src/server/detachable_filesystem_manager.dart
+++ b/pkg/analysis_server/lib/src/server/detachable_filesystem_manager.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/server/dev_server.dart b/pkg/analysis_server/lib/src/server/dev_server.dart
index 44bb21c..c8f52ea 100644
--- a/pkg/analysis_server/lib/src/server/dev_server.dart
+++ b/pkg/analysis_server/lib/src/server/dev_server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/server/diagnostic_server.dart b/pkg/analysis_server/lib/src/server/diagnostic_server.dart
index b147a43..011c926 100644
--- a/pkg/analysis_server/lib/src/server/diagnostic_server.dart
+++ b/pkg/analysis_server/lib/src/server/diagnostic_server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index b676b41..29d59bb 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,11 +6,16 @@
 import 'dart:io';
 import 'dart:math';
 
+import 'package:analysis_server/protocol/protocol_constants.dart'
+    show PROTOCOL_VERSION;
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/lsp_socket_server.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/dev_server.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/server/http_server.dart';
+import 'package:analysis_server/src/server/lsp_stdio_server.dart';
 import 'package:analysis_server/src/server/stdio_server.dart';
 import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart'
     show UriContributor;
@@ -261,6 +266,11 @@
   static const String USE_FASTA_PARSER = "use-fasta-parser";
 
   /**
+   * The name of the flag to use the Language Server Protocol (LSP).
+   */
+  static const String USE_LSP = "lsp";
+
+  /**
    * A directory to analyze in order to train an analysis server snapshot.
    */
   static const String TRAIN_USING = "train-using";
@@ -301,20 +311,14 @@
    */
   DetachableFileSystemManager detachableFileSystemManager;
 
-  SocketServer socketServer;
-
   HttpAnalysisServer httpServer;
 
   Driver();
 
   /**
    * Use the given command-line [arguments] to start this server.
-   *
-   * At least temporarily returns AnalysisServer so that consumers of the
-   * starter API can then use the server, this is done as a stopgap for the
-   * angular plugin until the official plugin API is finished.
    */
-  AnalysisServer start(List<String> arguments) {
+  void start(List<String> arguments) {
     CommandLineParser parser = _createArgParser();
     ArgResults results = parser.parse(arguments, <String, String>{});
 
@@ -328,6 +332,7 @@
     analysisServerOptions.clientVersion = results[CLIENT_VERSION];
     analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
     analysisServerOptions.useFastaParser = results[USE_FASTA_PARSER];
+    analysisServerOptions.useLanguageServerProtocol = results[USE_LSP];
     analysisServerOptions.enableUXExperiment1 = results[UX_EXPERIMENT_1];
     analysisServerOptions.enableUXExperiment2 = results[UX_EXPERIMENT_2];
 
@@ -370,47 +375,9 @@
       return null;
     }
 
-    String trainDirectory = results[TRAIN_USING];
-    if (trainDirectory != null) {
-      if (!FileSystemEntity.isDirectorySync(trainDirectory)) {
-        print("Training directory '$trainDirectory' not found.\n");
-        exitCode = 1;
-        return null;
-      }
-    }
+    final defaultSdkPath = _getSdkPath(results);
+    final dartSdkManager = new DartSdkManager(defaultSdkPath, true);
 
-    int port;
-    bool serve_http = false;
-    if (results[PORT_OPTION] != null) {
-      try {
-        port = int.parse(results[PORT_OPTION]);
-        serve_http = true;
-      } on FormatException {
-        print('Invalid port number: ${results[PORT_OPTION]}');
-        print('');
-        _printUsage(parser.parser, analytics);
-        exitCode = 1;
-        return null;
-      }
-    }
-
-    //
-    // Process all of the plugins so that extensions are registered.
-    //
-    ExtensionManager manager = new ExtensionManager();
-    manager.processPlugins(AnalysisEngine.instance.requiredPlugins);
-    linter.registerLintRules();
-
-    String defaultSdkPath;
-    if (results[SDK_OPTION] != null) {
-      defaultSdkPath = results[SDK_OPTION];
-    } else {
-      // No path to the SDK was provided.
-      // Use FolderBasedDartSdk.defaultSdkDirectory, which will make a guess.
-      defaultSdkPath = FolderBasedDartSdk.defaultSdkDirectory(
-              PhysicalResourceProvider.INSTANCE)
-          .path;
-    }
     // TODO(brianwilkerson) It would be nice to avoid creating an SDK that
     // cannot be re-used, but the SDK is needed to create a package map provider
     // in the case where we need to run `pub` in order to get the package map.
@@ -431,15 +398,69 @@
     InstrumentationService instrumentationService =
         new InstrumentationService(instrumentationServer);
     instrumentationService.logVersion(
-        trainDirectory != null
+        results[TRAIN_USING] != null
             ? 'training-0'
             : _readUuid(instrumentationService),
         analysisServerOptions.clientId,
         analysisServerOptions.clientVersion,
-        AnalysisServer.VERSION,
+        PROTOCOL_VERSION,
         defaultSdk.sdkVersion);
     AnalysisEngine.instance.instrumentationService = instrumentationService;
 
+    int diagnosticServerPort;
+    if (results[PORT_OPTION] != null) {
+      try {
+        diagnosticServerPort = int.parse(results[PORT_OPTION]);
+      } on FormatException {
+        print('Invalid port number: ${results[PORT_OPTION]}');
+        print('');
+        _printUsage(parser.parser, analytics);
+        exitCode = 1;
+        return null;
+      }
+    }
+
+    if (analysisServerOptions.useLanguageServerProtocol) {
+      startLspServer(results, analysisServerOptions, dartSdkManager,
+          instrumentationService, diagnosticServerPort);
+    } else {
+      startAnalysisServer(
+          results,
+          analysisServerOptions,
+          parser,
+          dartSdkManager,
+          instrumentationService,
+          analytics,
+          diagnosticServerPort);
+    }
+  }
+
+  void startAnalysisServer(
+    ArgResults results,
+    AnalysisServerOptions analysisServerOptions,
+    CommandLineParser parser,
+    DartSdkManager dartSdkManager,
+    InstrumentationService instrumentationService,
+    telemetry.Analytics analytics,
+    int diagnosticServerPort,
+  ) {
+    String trainDirectory = results[TRAIN_USING];
+    if (trainDirectory != null) {
+      if (!FileSystemEntity.isDirectorySync(trainDirectory)) {
+        print("Training directory '$trainDirectory' not found.\n");
+        exitCode = 1;
+        return null;
+      }
+    }
+    final serve_http = diagnosticServerPort != null;
+
+    //
+    // Process all of the plugins so that extensions are registered.
+    //
+    ExtensionManager manager = new ExtensionManager();
+    manager.processPlugins(AnalysisEngine.instance.requiredPlugins);
+    linter.registerLintRules();
+
     _DiagnosticServerImpl diagnosticServer = new _DiagnosticServerImpl();
 
     // Ping analytics with our initial call.
@@ -448,9 +469,9 @@
     //
     // Create the sockets and start listening for requests.
     //
-    socketServer = new SocketServer(
+    final socketServer = new SocketServer(
         analysisServerOptions,
-        new DartSdkManager(defaultSdkPath, true),
+        dartSdkManager,
         instrumentationService,
         diagnosticServer,
         fileResolverProvider,
@@ -460,7 +481,7 @@
 
     diagnosticServer.httpServer = httpServer;
     if (serve_http) {
-      diagnosticServer.startOnPort(port);
+      diagnosticServer.startOnPort(diagnosticServerPort);
     }
 
     if (trainDirectory != null) {
@@ -500,7 +521,7 @@
         exit(exitCode);
       }();
     } else {
-      _captureExceptions(instrumentationService, () {
+      _captureExceptions(socketServer, instrumentationService, () {
         StdioAnalysisServer stdioServer = new StdioAnalysisServer(socketServer);
         stdioServer.serveStdio().then((_) async {
           // TODO(brianwilkerson) Determine whether this await is necessary.
@@ -518,8 +539,40 @@
               ? null
               : httpServer.recordPrint);
     }
+  }
 
-    return socketServer.analysisServer;
+  void startLspServer(
+    ArgResults args,
+    AnalysisServerOptions analysisServerOptions,
+    DartSdkManager dartSdkManager,
+    InstrumentationService instrumentationService,
+    int diagnosticServerPort,
+  ) {
+    final serve_http = diagnosticServerPort != null;
+
+    _DiagnosticServerImpl diagnosticServer = new _DiagnosticServerImpl();
+
+    final socketServer = new LspSocketServer(
+      analysisServerOptions,
+      dartSdkManager,
+      instrumentationService,
+    );
+
+    httpServer = new HttpAnalysisServer(socketServer);
+
+    diagnosticServer.httpServer = httpServer;
+    if (serve_http) {
+      diagnosticServer.startOnPort(diagnosticServerPort);
+    }
+
+    _captureLspExceptions(socketServer, instrumentationService, () {
+      LspStdioAnalysisServer stdioServer =
+          new LspStdioAnalysisServer(socketServer);
+      stdioServer.serveStdio().then((_) async {
+        socketServer.analysisServer.shutdown();
+        exit(0);
+      });
+    });
   }
 
   /**
@@ -528,13 +581,13 @@
    * instrumentation [service]. If a [print] function is provided, then also
    * capture any data printed by the callback and redirect it to the function.
    */
-  dynamic _captureExceptions(InstrumentationService service, dynamic callback(),
+  dynamic _captureExceptions(SocketServer socketServer,
+      InstrumentationService service, dynamic callback(),
       {void print(String line)}) {
     void errorFunction(Zone self, ZoneDelegate parent, Zone zone,
         dynamic exception, StackTrace stackTrace) {
       service.logPriorityException(exception, stackTrace);
-      AnalysisServer analysisServer = socketServer.analysisServer;
-      analysisServer.sendServerErrorNotification(
+      socketServer.analysisServer.sendServerErrorNotification(
           'Captured exception', exception, stackTrace);
       throw exception;
     }
@@ -552,6 +605,33 @@
   }
 
   /**
+   * Execute the given [callback] within a zone that will capture any unhandled
+   * exceptions and both report them to the client and send them to the given
+   * instrumentation [service]. If a [print] function is provided, then also
+   * capture any data printed by the callback and redirect it to the function.
+   */
+  dynamic _captureLspExceptions(
+      // TODO(dantup): This is a copy/paste of the above with some minor changes.
+      // We should either factor these out, or if we end up with an LspDriver, put
+      // this there.
+      LspSocketServer socketServer,
+      InstrumentationService service,
+      dynamic callback()) {
+    void errorFunction(Zone self, ZoneDelegate parent, Zone zone,
+        dynamic exception, StackTrace stackTrace) {
+      service.logPriorityException(exception, stackTrace);
+      LspAnalysisServer analysisServer = socketServer.analysisServer;
+      analysisServer.sendServerErrorNotification(
+          'Captured exception', exception, stackTrace);
+      throw exception;
+    }
+
+    ZoneSpecification zoneSpecification =
+        new ZoneSpecification(handleUncaughtError: errorFunction);
+    return runZoned(callback, zoneSpecification: zoneSpecification);
+  }
+
+  /**
    * Create and return the parser used to parse the command-line arguments.
    */
   CommandLineParser _createArgParser() {
@@ -613,6 +693,8 @@
     parser.addFlag(USE_FASTA_PARSER,
         defaultsTo: true,
         help: "Whether to enable parsing via the Fasta parser");
+    parser.addFlag(USE_LSP,
+        defaultsTo: false, help: "Whether to use the Language Server Protocol");
     parser.addOption(TRAIN_USING,
         help: "Pass in a directory to analyze for purposes of training an "
             "analysis server snapshot.");
@@ -639,6 +721,18 @@
     return sdk;
   }
 
+  String _getSdkPath(ArgResults args) {
+    if (args[SDK_OPTION] != null) {
+      return args[SDK_OPTION];
+    } else {
+      // No path to the SDK was provided.
+      // Use FolderBasedDartSdk.defaultSdkDirectory, which will make a guess.
+      return FolderBasedDartSdk.defaultSdkDirectory(
+        PhysicalResourceProvider.INSTANCE,
+      ).path;
+    }
+  }
+
   /**
    * Print information about how to use the server.
    */
@@ -665,10 +759,12 @@
    * Read the UUID from disk, generating and storing a new one if necessary.
    */
   String _readUuid(InstrumentationService service) {
-    File uuidFile = new File(PhysicalResourceProvider.INSTANCE
-        .getStateLocation('.instrumentation')
-        .getChild('uuid.txt')
-        .path);
+    final instrumentationLocation =
+        PhysicalResourceProvider.INSTANCE.getStateLocation('.instrumentation');
+    if (instrumentationLocation == null) {
+      return _generateUuidString();
+    }
+    File uuidFile = new File(instrumentationLocation.getChild('uuid.txt').path);
     try {
       if (uuidFile.existsSync()) {
         String uuid = uuidFile.readAsStringSync();
@@ -679,9 +775,7 @@
     } catch (exception, stackTrace) {
       service.logPriorityException(exception, stackTrace);
     }
-    int millisecondsSinceEpoch = new DateTime.now().millisecondsSinceEpoch;
-    int random = new Random().nextInt(0x3fffffff);
-    String uuid = '$millisecondsSinceEpoch$random';
+    String uuid = _generateUuidString();
     try {
       uuidFile.parent.createSync(recursive: true);
       uuidFile.writeAsStringSync(uuid);
@@ -694,6 +788,15 @@
   }
 
   /**
+   * Constructs a uuid combining the current date and a random integer.
+   */
+  String _generateUuidString() {
+    int millisecondsSinceEpoch = new DateTime.now().millisecondsSinceEpoch;
+    int random = new Random().nextInt(0x3fffffff);
+    return '$millisecondsSinceEpoch$random';
+  }
+
+  /**
    * Perform log files rolling.
    *
    * Rename existing files with names `[path].(x)` to `[path].(x+1)`.
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index 5b51304..95e4d34 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -35,7 +35,7 @@
    * An object that can handle either a WebSocket connection or a connection
    * to the client over stdio.
    */
-  SocketServer socketServer;
+  AbstractSocketServer socketServer;
 
   /**
    * An object that can handle GET requests.
diff --git a/pkg/analysis_server/lib/src/server/lsp_stdio_server.dart b/pkg/analysis_server/lib/src/server/lsp_stdio_server.dart
new file mode 100644
index 0000000..1b5cde5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/server/lsp_stdio_server.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_server/src/lsp/channel/lsp_byte_stream_channel.dart';
+import 'package:analysis_server/src/lsp/lsp_socket_server.dart';
+
+/**
+ * Instances of the class [StdioServer] implement a simple server operating
+ * over standard input and output. The primary responsibility of this server
+ * is to split incoming messages on newlines and pass them along to the
+ * analysis server.
+ */
+class LspStdioAnalysisServer {
+  /**
+   * An object that can handle either a WebSocket connection or a connection
+   * to the client over stdio.
+   */
+  LspSocketServer socketServer;
+
+  /**
+   * Initialize a newly created stdio server.
+   */
+  LspStdioAnalysisServer(this.socketServer);
+
+  /**
+   * Begin serving requests over stdio.
+   *
+   * Return a future that will be completed when stdin closes.
+   */
+  Future serveStdio() {
+    LspByteStreamServerChannel serverChannel = new LspByteStreamServerChannel(
+        stdin, stdout, socketServer.instrumentationService);
+    socketServer.createAnalysisServer(serverChannel);
+    return serverChannel.closed;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/server/stdio_server.dart b/pkg/analysis_server/lib/src/server/stdio_server.dart
index 1895444..f7e9305 100644
--- a/pkg/analysis_server/lib/src/server/stdio_server.dart
+++ b/pkg/analysis_server/lib/src/server/stdio_server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_core.dart b/pkg/analysis_server/lib/src/services/completion/completion_core.dart
index 1403f86..8b5b0a2 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_core.dart
@@ -1,11 +1,11 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /**
@@ -13,7 +13,7 @@
  */
 class CompletionRequestImpl implements CompletionRequest {
   @override
-  final AnalysisResult result;
+  final ResolvedUnitResult result;
 
   @override
   final int offset;
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_performance.dart b/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
index 24b952f..61df502 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -25,11 +25,6 @@
   int get elapsedInMilliseconds =>
       operations.length > 0 ? operations.last.elapsed.inMilliseconds : 0;
 
-  int get firstNotificationInMilliseconds =>
-      _firstNotification != null ? _firstNotification.inMilliseconds : 0;
-
-  String get startTimeAndMs => '${start.millisecondsSinceEpoch} - $start';
-
   String get suggestionCount {
     if (notificationCount < 1) return '';
     if (notificationCount == 1) return '$suggestionCountFirst';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index a2857e1..f7ddb32 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index 18ba66b..fc4e494 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -27,7 +27,7 @@
     }
 
     // Build list of suggestions
-    var directive = node.getAncestor((parent) => parent is NamespaceDirective);
+    var directive = node.thisOrAncestorOfType<NamespaceDirective>();
     if (directive is NamespaceDirective) {
       LibraryElement library = directive.uriElement;
       if (library != null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart b/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
index 6b74935..7da0e3e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.g.dart b/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.g.dart
index f065701..91975c7 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.g.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/common_usage_sorter.g.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 306c6b3..0989365 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -1,11 +1,11 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
 import 'package:analysis_server/src/provisional/completion/completion_core.dart'
-    show CompletionContributor, CompletionRequest;
+    show AbortCompletion, CompletionContributor, CompletionRequest;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
@@ -29,11 +29,13 @@
 import 'package:analysis_server/src/services/completion/dart/type_member_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/variable_name_contributor.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/api/model.dart';
@@ -102,37 +104,43 @@
       new UriContributor(),
       new VariableNameContributor()
     ];
-    for (DartCompletionContributor contributor in contributors) {
-      String contributorTag =
-          'DartCompletionManager - ${contributor.runtimeType}';
-      performance.logStartTime(contributorTag);
-      List<CompletionSuggestion> contributorSuggestions =
-          await contributor.computeSuggestions(dartRequest);
-      performance.logElapseTime(contributorTag);
-      request.checkAborted();
+    try {
+      for (DartCompletionContributor contributor in contributors) {
+        String contributorTag =
+            'DartCompletionManager - ${contributor.runtimeType}';
+        performance.logStartTime(contributorTag);
+        List<CompletionSuggestion> contributorSuggestions =
+            await contributor.computeSuggestions(dartRequest);
+        performance.logElapseTime(contributorTag);
+        request.checkAborted();
 
-      for (CompletionSuggestion newSuggestion in contributorSuggestions) {
-        String key = newSuggestion.completion;
+        for (CompletionSuggestion newSuggestion in contributorSuggestions) {
+          String key = newSuggestion.completion;
 
-        // Append parenthesis for constructors to disambiguate from classes.
-        if (_isConstructor(newSuggestion)) {
-          key += '()';
-          String className = _getConstructorClassName(newSuggestion);
-          _ensureList(constructorMap, className).add(key);
-        }
+          // Append parenthesis for constructors to disambiguate from classes.
+          if (_isConstructor(newSuggestion)) {
+            key += '()';
+            String className = _getConstructorClassName(newSuggestion);
+            _ensureList(constructorMap, className).add(key);
+          }
 
-        // Local declarations hide both the class and its constructors.
-        if (!_isClass(newSuggestion)) {
-          List<String> constructorKeys = constructorMap[key];
-          constructorKeys?.forEach(suggestionMap.remove);
-        }
+          // Local declarations hide both the class and its constructors.
+          if (!_isClass(newSuggestion)) {
+            List<String> constructorKeys = constructorMap[key];
+            constructorKeys?.forEach(suggestionMap.remove);
+          }
 
-        CompletionSuggestion oldSuggestion = suggestionMap[key];
-        if (oldSuggestion == null ||
-            oldSuggestion.relevance < newSuggestion.relevance) {
-          suggestionMap[key] = newSuggestion;
+          CompletionSuggestion oldSuggestion = suggestionMap[key];
+          if (oldSuggestion == null ||
+              oldSuggestion.relevance < newSuggestion.relevance) {
+            suggestionMap[key] = newSuggestion;
+          }
         }
       }
+    } on InconsistentAnalysisException {
+      // The state of the code being analyzed has changed, so results are likely
+      // to be inconsistent. Just abort the operation.
+      throw new AbortCompletion();
     }
 
     // Adjust suggestion relevance before returning
@@ -178,7 +186,7 @@
  */
 class DartCompletionRequestImpl implements DartCompletionRequest {
   @override
-  final AnalysisResult result;
+  final ResolvedUnitResult result;
 
   @override
   final ResourceProvider resourceProvider;
@@ -249,7 +257,10 @@
   String get sourceContents => result.content;
 
   @override
-  SourceFactory get sourceFactory => result.sourceFactory;
+  SourceFactory get sourceFactory {
+    DriverBasedAnalysisContext context = result.session.analysisContext;
+    return context.driver.sourceFactory;
+  }
 
   /**
    * Throw [AbortCompletion] if the completion request has been aborted.
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/contribution_sorter.dart b/pkg/analysis_server/lib/src/services/completion/dart/contribution_sorter.dart
index 6dfbf6f..eedd4d9 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/contribution_sorter.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/contribution_sorter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
index 2a45ee0..64ed46a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -28,7 +28,7 @@
     // If this is a constructor declaration
     // then compute fields already referenced
     ConstructorDeclaration constructorDecl =
-        node.getAncestor((p) => p is ConstructorDeclaration);
+        node.thisOrAncestorOfType<ConstructorDeclaration>();
     if (constructorDecl == null) {
       return const <CompletionSuggestion>[];
     }
@@ -53,7 +53,7 @@
 
     // Add suggestions for fields that are not already referenced
     ClassDeclaration classDecl =
-        constructorDecl.getAncestor((p) => p is ClassDeclaration);
+        constructorDecl.thisOrAncestorOfType<ClassDeclaration>();
     List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
     for (ClassMember member in classDecl.members) {
       if (member is FieldDeclaration && !member.isStatic) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
index 6f9d9b3..0f4025b 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
index 0f6f992..ef19706 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 1db3c05..64bac8e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -329,7 +329,7 @@
   @override
   visitFormalParameterList(FormalParameterList node) {
     AstNode constructorDeclaration =
-        node.getAncestor((p) => p is ConstructorDeclaration);
+        node.thisOrAncestorOfType<ConstructorDeclaration>();
     if (constructorDeclaration != null) {
       _addSuggestions([Keyword.THIS]);
     }
@@ -746,21 +746,21 @@
   }
 
   bool _inAsyncMethodOrFunction(AstNode node) {
-    FunctionBody body = node.getAncestor((n) => n is FunctionBody);
+    FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
     return body != null && body.isAsynchronous && body.star == null;
   }
 
   bool _inAsyncStarOrSyncStarMethodOrFunction(AstNode node) {
-    FunctionBody body = node.getAncestor((n) => n is FunctionBody);
+    FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
     return body != null && body.keyword != null && body.star != null;
   }
 
   bool _inCatchClause(Block node) =>
-      node.getAncestor((p) => p is CatchClause) != null;
+      node.thisOrAncestorOfType<CatchClause>() != null;
 
   bool _inClassMemberBody(AstNode node) {
     while (true) {
-      AstNode body = node.getAncestor((n) => n is FunctionBody);
+      AstNode body = node.thisOrAncestorOfType<FunctionBody>();
       if (body == null) {
         return false;
       }
@@ -773,23 +773,24 @@
   }
 
   bool _inDoLoop(AstNode node) =>
-      node.getAncestor((p) => p is DoStatement) != null;
+      node.thisOrAncestorOfType<DoStatement>() != null;
 
   bool _inForLoop(AstNode node) =>
-      node.getAncestor((p) => p is ForStatement || p is ForEachStatement) !=
+      node.thisOrAncestorMatching(
+          (p) => p is ForStatement || p is ForEachStatement) !=
       null;
 
   bool _inLoop(AstNode node) =>
       _inDoLoop(node) || _inForLoop(node) || _inWhileLoop(node);
 
   bool _inSwitch(AstNode node) =>
-      node.getAncestor((p) => p is SwitchStatement) != null;
+      node.thisOrAncestorOfType<SwitchStatement>() != null;
 
   bool _inWhileLoop(AstNode node) =>
-      node.getAncestor((p) => p is WhileStatement) != null;
+      node.thisOrAncestorOfType<WhileStatement>() != null;
 
   bool _isEntityAfterIfWithoutElse(AstNode node) {
-    Block block = node?.getAncestor((n) => n is Block);
+    Block block = node?.thisOrAncestorOfType<Block>();
     if (block == null) {
       return false;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
index 4dead0e..77b4ebf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -91,6 +91,11 @@
   }
 
   @override
+  void declaredGenericTypeAlias(GenericTypeAlias declaration) {
+    // ignored
+  }
+
+  @override
   void declaredLabel(Label label, bool isCaseLabel) {
     if (isCaseLabel ? includeCaseLabels : includeStatementLabels) {
       CompletionSuggestion suggestion = _addSuggestion(label.label);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index 7a21679..35826f0 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
index 6b46436..e9d2506 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
index aeda775..3318bb5 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -84,6 +84,9 @@
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {}
 
   @override
+  void declaredGenericTypeAlias(GenericTypeAlias declaration) {}
+
+  @override
   void declaredLabel(Label label, bool isCaseLabel) {}
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index 007465e..f881357 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index cee82af..a883a59 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -226,6 +226,20 @@
   }
 
   @override
+  void declaredGenericTypeAlias(GenericTypeAlias declaration) {
+    if (optype.includeTypeNameSuggestions) {
+      // TODO (danrubel) determine parameters and return type
+      _addLocalSuggestion_includeTypeNameSuggestions(
+          declaration.documentationComment,
+          declaration.name,
+          declaration.functionType.returnType,
+          protocol.ElementKind.FUNCTION_TYPE_ALIAS,
+          isAbstract: true,
+          isDeprecated: isDeprecated(declaration));
+    }
+  }
+
+  @override
   void declaredLabel(Label label, bool isCaseLabel) {
     // ignored
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index 57a2f27..cc21160 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index 34d1ffb..aa25fba 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -9,10 +9,10 @@
 import 'package:analysis_server/src/protocol_server.dart' as protocol
     hide CompletionSuggestion, CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
@@ -34,13 +34,15 @@
       return const <CompletionSuggestion>[];
     }
     ClassDeclaration classDecl =
-        targetId.getAncestor((p) => p is ClassDeclaration);
+        targetId.thisOrAncestorOfType<ClassDeclaration>();
     if (classDecl == null) {
       return const <CompletionSuggestion>[];
     }
 
+    // TODO(brianwilkerson) Consider making the type system visible from the
+    // request.result.
     var inheritance = new InheritanceManager2(
-        request.result.libraryElement.context.typeSystem);
+        await request.result.libraryElement.session.typeSystem);
 
     // Generate a collection of inherited members
     ClassElement classElem = classDecl.declaredElement;
@@ -68,14 +70,13 @@
    * the template will replace [targetId].
    */
   Future<DartChangeBuilder> _buildReplacementText(
-      AnalysisResult result,
+      ResolvedUnitResult result,
       SimpleIdentifier targetId,
       FunctionType signature,
       StringBuffer displayTextBuffer) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    DartChangeBuilder builder =
-        new DartChangeBuilder(result.driver.currentSession);
+    DartChangeBuilder builder = new DartChangeBuilder(result.session);
     await builder.addFileEdit(result.path, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(targetId), (DartEditBuilder builder) {
         ExecutableElement element = signature.element;
@@ -205,12 +206,15 @@
    */
   List<Name> _namesToOverride(
       ClassElement classElement, Iterable<Name> interfaceNames) {
-    var notDefinedNames = <Name>[];
+    var libraryUri = classElement.library.source.uri;
+    var namesToOverride = <Name>[];
     for (var name in interfaceNames) {
-      if (!_hasMember(classElement, name.name)) {
-        notDefinedNames.add(name);
+      if (name.isAccessibleFor(libraryUri)) {
+        if (!_hasMember(classElement, name.name)) {
+          namesToOverride.add(name);
+        }
       }
     }
-    return notDefinedNames;
+    return namesToOverride;
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index 087b39e..3f98f7e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index ef91fd7..7c65f43 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -110,9 +110,9 @@
 }
 
 /**
- * Common mixin for sharing behavior
+ * Common mixin for sharing behavior.
  */
-abstract class ElementSuggestionBuilder {
+mixin ElementSuggestionBuilder {
   /**
    * A collection of completion suggestions.
    */
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index d0b3d04..f3974ce 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -83,7 +83,7 @@
       // Determine the name of the containing method because
       // the most likely completion is a super expression with same name
       MethodDeclaration containingMethod =
-          expression.getAncestor((p) => p is MethodDeclaration);
+          expression.thisOrAncestorOfType<MethodDeclaration>();
       if (containingMethod != null) {
         SimpleIdentifier id = containingMethod.name;
         if (id != null) {
@@ -174,6 +174,17 @@
   }
 
   @override
+  void declaredGenericTypeAlias(GenericTypeAlias declaration) {
+    if (declaration.name.name == targetName) {
+      TypeAnnotation typeName = declaration.functionType.returnType;
+      if (typeName != null) {
+        typeFound = typeName.type;
+      }
+      finished();
+    }
+  }
+
+  @override
   void declaredLabel(Label label, bool isCaseLabel) {
     if (label.label.name == targetName) {
       // no type
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
index 6226346..46910af 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 0f2b10b..409b979 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
index af2d9e3..82555b4 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index 1a690a8..86231ae 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,12 +6,11 @@
 
 import 'package:analysis_server/src/protocol_server.dart' hide Element;
 import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/error/error.dart' as engine;
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -256,21 +255,11 @@
  * The context for computing a postfix completion.
  */
 class PostfixCompletionContext {
-  final String file;
-  final LineInfo lineInfo;
+  final ResolvedUnitResult resolveResult;
   final int selectionOffset;
   final String key;
-  final AnalysisDriver driver;
-  final CompilationUnit unit;
-  final CompilationUnitElement unitElement;
-  final List<engine.AnalysisError> errors;
 
-  PostfixCompletionContext(this.file, this.lineInfo, this.selectionOffset,
-      this.key, this.driver, this.unit, this.unitElement, this.errors) {
-    if (unitElement.context == null) {
-      throw new Error(); // not reached
-    }
-  }
+  PostfixCompletionContext(this.resolveResult, this.selectionOffset, this.key);
 }
 
 /**
@@ -309,40 +298,25 @@
   AstNode node;
   PostfixCompletion completion;
   SourceChange change = new SourceChange('postfix-completion');
-  final Map<String, LinkedEditGroup> linkedPositionGroups =
-      <String, LinkedEditGroup>{};
+  final Map<String, LinkedEditGroup> linkedPositionGroups = {};
   Position exitPosition = null;
-  TypeProvider _typeProvider;
 
   PostfixCompletionProcessor(this.completionContext)
-      : utils = new CorrectionUtils(completionContext.unit);
-
-  AnalysisDriver get driver => completionContext.driver;
+      : utils = new CorrectionUtils(completionContext.resolveResult);
 
   String get eol => utils.endOfLine;
 
-  String get file => completionContext.file;
+  String get file => completionContext.resolveResult.path;
 
   String get key => completionContext.key;
 
-  LineInfo get lineInfo => completionContext.lineInfo;
+  LineInfo get lineInfo => completionContext.resolveResult.lineInfo;
 
   int get selectionOffset => completionContext.selectionOffset;
 
-  /**
-   * Return the analysis session to be used to create the change builder.
-   */
-  AnalysisSession get session => driver.currentSession;
+  AnalysisSession get session => completionContext.resolveResult.session;
 
-  Source get source => completionContext.unitElement.source;
-
-  TypeProvider get typeProvider {
-    return _typeProvider ??= unitElement.context.typeProvider;
-  }
-
-  CompilationUnit get unit => completionContext.unit;
-
-  CompilationUnitElement get unitElement => completionContext.unitElement;
+  TypeProvider get typeProvider => completionContext.resolveResult.typeProvider;
 
   Future<PostfixCompletion> compute() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
@@ -591,7 +565,8 @@
   }
 
   AstNode _selectedNode({int at: null}) =>
-      new NodeLocator(at == null ? selectionOffset : at).searchWithin(unit);
+      new NodeLocator(at == null ? selectionOffset : at)
+          .searchWithin(completionContext.resolveResult.unit);
 
   void _setCompletionFromBuilder(
       DartChangeBuilder builder, PostfixCompletionKind kind,
diff --git a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
index 929f1fe..303ddd5 100644
--- a/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/statement/statement_completion.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/protocol_server.dart' hide Element;
 import 'package:analysis_server/src/services/correction/source_buffer.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -81,19 +82,10 @@
  * The context for computing a statement completion.
  */
 class StatementCompletionContext {
-  final String file;
-  final LineInfo lineInfo;
+  final ResolvedUnitResult resolveResult;
   final int selectionOffset;
-  final CompilationUnit unit;
-  final CompilationUnitElement unitElement;
-  final List<engine.AnalysisError> errors;
 
-  StatementCompletionContext(this.file, this.lineInfo, this.selectionOffset,
-      this.unit, this.unitElement, this.errors) {
-    if (unitElement.context == null) {
-      throw new Error(); // not reached; see getStatementCompletion()
-    }
-  }
+  StatementCompletionContext(this.resolveResult, this.selectionOffset);
 }
 
 /**
@@ -143,21 +135,22 @@
   Position exitPosition = null;
 
   StatementCompletionProcessor(this.statementContext)
-      : utils = new CorrectionUtils(statementContext.unit);
+      : utils = new CorrectionUtils(statementContext.resolveResult);
 
   String get eol => utils.endOfLine;
 
-  String get file => statementContext.file;
+  String get file => statementContext.resolveResult.path;
 
-  LineInfo get lineInfo => statementContext.lineInfo;
+  LineInfo get lineInfo => statementContext.resolveResult.lineInfo;
 
   int get selectionOffset => statementContext.selectionOffset;
 
-  Source get source => statementContext.unitElement.source;
+  Source get source => unitElement.source;
 
-  CompilationUnit get unit => statementContext.unit;
+  CompilationUnit get unit => statementContext.resolveResult.unit;
 
-  CompilationUnitElement get unitElement => statementContext.unitElement;
+  CompilationUnitElement get unitElement =>
+      statementContext.resolveResult.unit.declaredElement;
 
   Future<StatementCompletion> compute() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
@@ -166,8 +159,8 @@
     if (node == null) {
       return NO_COMPLETION;
     }
-    node = node
-        .getAncestor((n) => n is Statement || _isNonStatementDeclaration(n));
+    node = node.thisOrAncestorMatching(
+        (n) => n is Statement || _isNonStatementDeclaration(n));
     if (node == null) {
       return _complete_simpleEnter() ? completion : NO_COMPLETION;
     }
@@ -180,7 +173,7 @@
     if (_isEmptyStatementOrEmptyBlock(node)) {
       node = node.parent;
     }
-    for (engine.AnalysisError error in statementContext.errors) {
+    for (engine.AnalysisError error in statementContext.resolveResult.errors) {
       if (error.offset >= node.offset && error.offset <= node.end) {
         if (error.errorCode is! HintCode) {
           errors.add(error);
@@ -282,7 +275,7 @@
         return null;
       }
       AstNode expr = _selectedNode();
-      return (expr.getAncestor((n) => n is StringInterpolation) == null)
+      return (expr.thisOrAncestorOfType<StringInterpolation>() == null)
           ? expr
           : null;
     }
@@ -319,7 +312,7 @@
     expr = errorMatching(ParserErrorCode.EXPECTED_TOKEN, partialMatch: "']'") ??
         errorMatching(ScannerErrorCode.EXPECTED_TOKEN, partialMatch: "']'");
     if (expr != null) {
-      expr = expr.getAncestor((n) => n is ListLiteral);
+      expr = expr.thisOrAncestorOfType<ListLiteral>();
       if (expr != null) {
         ListLiteral lit = expr;
         if (lit.rightBracket.isSynthetic) {
@@ -861,13 +854,13 @@
     if (parenError == null) {
       return false;
     }
-    AstNode argList = _selectedNode(at: selectionOffset)
-        .getAncestor((n) => n is ArgumentList);
+    AstNode argList =
+        _selectedNode(at: selectionOffset).thisOrAncestorOfType<ArgumentList>();
     if (argList == null) {
       argList = _selectedNode(at: parenError.offset)
-          .getAncestor((n) => n is ArgumentList);
+          .thisOrAncestorOfType<ArgumentList>();
     }
-    if (argList?.getAncestor((n) => n == node) == null) {
+    if (argList?.thisOrAncestorMatching((n) => n == node) == null) {
       return false;
     }
     int previousInsertions = _lengthOfInsertions();
@@ -1107,31 +1100,12 @@
         orElse: () => null);
   }
 
-  LinkedEditGroup _getLinkedPosition(String groupId) {
-    LinkedEditGroup group = linkedPositionGroups[groupId];
-    if (group == null) {
-      group = new LinkedEditGroup.empty();
-      linkedPositionGroups[groupId] = group;
-    }
-    return group;
-  }
-
   void _insertBuilder(SourceBuilder builder, [int length = 0]) {
     {
       SourceRange range = new SourceRange(builder.offset, length);
       String text = builder.toString();
       _addReplaceEdit(range, text);
     }
-    // add linked positions
-    builder.linkedPositionGroups.forEach((String id, LinkedEditGroup group) {
-      LinkedEditGroup fixGroup = _getLinkedPosition(id);
-      group.positions.forEach((Position position) {
-        fixGroup.addPosition(position, group.length);
-      });
-      group.suggestions.forEach((LinkedEditSuggestion suggestion) {
-        fixGroup.addSuggestion(suggestion);
-      });
-    });
     // add exit position
     {
       int exitOffset = builder.exitOffset;
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 772299c..8601163 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -1,8 +1,31 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analysis_server/plugin/edit/assist/assist_dart.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
+
+/**
+ * The implementation of [DartAssistContext].
+ */
+class DartAssistContextImpl implements DartAssistContext {
+  @override
+  final ChangeWorkspace workspace;
+
+  @override
+  final ResolvedUnitResult resolveResult;
+
+  @override
+  final int selectionOffset;
+
+  @override
+  final int selectionLength;
+
+  DartAssistContextImpl(this.workspace, this.resolveResult,
+      this.selectionOffset, this.selectionLength);
+}
 
 /**
  * An enumeration of possible assist kinds.
@@ -28,10 +51,10 @@
       'dart.assist.convert.bodyToBlock', 30, "Convert to block body");
   static const CONVERT_INTO_EXPRESSION_BODY = const AssistKind(
       'dart.assist.convert.bodyToExpression', 30, "Convert to expression body");
-  static const CONVERT_INTO_FOR_INDEX = const AssistKind(
-      'dart.assist.convert.forEachToForIndex', 30, "Convert to for-index loop");
   static const CONVERT_INTO_FINAL_FIELD = const AssistKind(
       'dart.assist.convert.getterToFinalField', 30, "Convert to final field");
+  static const CONVERT_INTO_FOR_INDEX = const AssistKind(
+      'dart.assist.convert.forEachToForIndex', 30, "Convert to for-index loop");
   static const CONVERT_INTO_GENERIC_FUNCTION_SYNTAX = const AssistKind(
       'dart.assist.convert.toGenericFunctionSyntax',
       30,
@@ -96,6 +119,8 @@
       const AssistKind('dart.assist.flutter.wrap.padding', 30, "Add padding");
   static const FLUTTER_WRAP_ROW =
       const AssistKind('dart.assist.flutter.wrap.row', 30, "Wrap with Row");
+  static const FLUTTER_WRAP_STREAM_BUILDER = const AssistKind(
+      'dart.assist.flutter.wrap.streamBuilder', 30, "Wrap with StreamBuilder");
   static const IMPORT_ADD_SHOW = const AssistKind(
       'dart.assist.addShowCombinator', 30, "Add explicit 'show' combinator");
   static const INTRODUCE_LOCAL_CAST_TYPE = const AssistKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index dffd207..135f6dc 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -16,12 +16,10 @@
 import 'package:analysis_server/src/utilities/flutter.dart' as flutter;
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
@@ -29,6 +27,7 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
+import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart'
     hide AssistContributor;
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
@@ -42,73 +41,36 @@
  * The computer for Dart assists.
  */
 class AssistProcessor {
-  /**
-   * The analysis driver being used to perform analysis.
-   */
-  AnalysisDriver driver;
+  final DartAssistContext context;
+  final int selectionOffset;
+  final int selectionLength;
+  final int selectionEnd;
 
-  /**
-   * The analysis session to be used to create the change builder.
-   */
-  AnalysisSession session;
-
-  /**
-   * The helper wrapper around the [session].
-   */
-  AnalysisSessionHelper sessionHelper;
-
-  Source source;
-  String file;
-
-  CompilationUnit unit;
-  CompilationUnitElement unitElement;
-
-  LibraryElement unitLibraryElement;
-
-  int selectionOffset;
-  int selectionLength;
-  int selectionEnd;
+  final AnalysisSession session;
+  final AnalysisSessionHelper sessionHelper;
+  final TypeProvider typeProvider;
+  final String file;
+  final CorrectionUtils utils;
 
   final List<Assist> assists = <Assist>[];
 
-  CorrectionUtils utils;
-
   AstNode node;
 
-  TypeProvider _typeProvider;
-
-  AssistProcessor(DartAssistContext dartContext) {
-    driver = dartContext.analysisDriver;
-    session = driver.currentSession;
-    sessionHelper = new AnalysisSessionHelper(session);
-    // source
-    source = dartContext.source;
-    file = dartContext.source.fullName;
-    // unit
-    unit = dartContext.unit;
-    unitElement = dartContext.unit.declaredElement;
-    // library
-    unitLibraryElement = resolutionMap
-        .elementDeclaredByCompilationUnit(dartContext.unit)
-        .library;
-    // selection
-    selectionOffset = dartContext.selectionOffset;
-    selectionLength = dartContext.selectionLength;
-    selectionEnd = selectionOffset + selectionLength;
-  }
+  AssistProcessor(this.context)
+      : selectionOffset = context.selectionOffset,
+        selectionLength = context.selectionLength,
+        selectionEnd = context.selectionOffset + context.selectionLength,
+        session = context.resolveResult.session,
+        sessionHelper = AnalysisSessionHelper(context.resolveResult.session),
+        typeProvider = context.resolveResult.typeProvider,
+        file = context.resolveResult.path,
+        utils = new CorrectionUtils(context.resolveResult);
 
   /**
    * Returns the EOL to use for this [CompilationUnit].
    */
   String get eol => utils.endOfLine;
 
-  TypeProvider get typeProvider {
-    if (_typeProvider == null) {
-      _typeProvider = unitElement.context.typeProvider;
-    }
-    return _typeProvider;
-  }
-
   Future<List<Assist>> compute() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -149,6 +111,7 @@
     await _addProposal_flutterRemoveWidget_multipleChildren();
     await _addProposal_flutterSwapWithChild();
     await _addProposal_flutterSwapWithParent();
+    await _addProposal_flutterWrapStreamBuilder();
     await _addProposal_flutterWrapWidget();
     await _addProposal_flutterWrapWidgets();
     await _addProposal_importAddShow();
@@ -188,28 +151,27 @@
     // isn't just "return node.getAncestor((node) => node is FunctionBody);"
     {
       FunctionExpression function =
-          node.getAncestor((node) => node is FunctionExpression);
+          node.thisOrAncestorOfType<FunctionExpression>();
       if (function != null) {
         return function.body;
       }
     }
     {
       FunctionDeclaration function =
-          node.getAncestor((node) => node is FunctionDeclaration);
+          node.thisOrAncestorOfType<FunctionDeclaration>();
       if (function != null) {
         return function.functionExpression.body;
       }
     }
     {
       ConstructorDeclaration constructor =
-          node.getAncestor((node) => node is ConstructorDeclaration);
+          node.thisOrAncestorOfType<ConstructorDeclaration>();
       if (constructor != null) {
         return constructor.body;
       }
     }
     {
-      MethodDeclaration method =
-          node.getAncestor((node) => node is MethodDeclaration);
+      MethodDeclaration method = node.thisOrAncestorOfType<MethodDeclaration>();
       if (method != null) {
         return method.body;
       }
@@ -233,9 +195,9 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     DeclaredIdentifier declaredIdentifier =
-        node.getAncestor((n) => n is DeclaredIdentifier);
+        node.thisOrAncestorOfType<DeclaredIdentifier>();
     if (declaredIdentifier == null) {
-      ForEachStatement forEach = node.getAncestor((n) => n is ForEachStatement);
+      ForEachStatement forEach = node.thisOrAncestorOfType<ForEachStatement>();
       int offset = node.offset;
       if (forEach != null &&
           forEach.iterable != null &&
@@ -259,7 +221,7 @@
     }
     _configureTargetLocation(node);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     bool validChange = true;
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       Token keyword = declaredIdentifier.keyword;
@@ -309,7 +271,7 @@
     // prepare type source
     _configureTargetLocation(node);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     bool validChange = true;
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addInsertion(name.offset, (DartEditBuilder builder) {
@@ -328,7 +290,7 @@
     AstNode node = this.node;
     // prepare VariableDeclarationList
     VariableDeclarationList declarationList =
-        node.getAncestor((node) => node is VariableDeclarationList);
+        node.thisOrAncestorOfType<VariableDeclarationList>();
     if (declarationList == null) {
       _coverageMarker();
       return;
@@ -365,7 +327,7 @@
     }
     _configureTargetLocation(node);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     bool validChange = true;
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       Token keyword = declarationList.keyword;
@@ -385,33 +347,6 @@
     }
   }
 
-  Future<void> _addProposal_convertToIntLiteral() async {
-    if (node is! DoubleLiteral) {
-      _coverageMarker();
-      return;
-    }
-    DoubleLiteral literal = node;
-    int intValue;
-    try {
-      intValue = literal.value?.truncate();
-    } catch (e) {
-      // Double cannot be converted to int
-    }
-    if (intValue == null || intValue != literal.value) {
-      _coverageMarker();
-      return;
-    }
-
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      builder.addReplacement(new SourceRange(literal.offset, literal.length),
-          (DartEditBuilder builder) {
-        builder.write('${intValue}');
-      });
-    });
-    _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_INT_LITERAL);
-  }
-
   Future<void> _addProposal_assignToLocalVariable() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -452,7 +387,7 @@
         getVariableNameSuggestionsForExpression(type, expression, excluded);
 
     if (suggestions.isNotEmpty) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addInsertion(offset, (DartEditBuilder builder) {
           builder.write('var ');
@@ -469,7 +404,7 @@
 
   Future<void> _addProposal_convertClassToMixin() async {
     ClassDeclaration classDeclaration =
-        node.getAncestor((n) => n is ClassDeclaration);
+        node.thisOrAncestorOfType<ClassDeclaration>();
     if (classDeclaration == null) {
       return;
     }
@@ -505,7 +440,7 @@
     }
     interfaces.addAll(classElement.interfaces);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(
           range.startStart(
@@ -513,6 +448,8 @@
               classDeclaration.leftBracket), (DartEditBuilder builder) {
         builder.write('mixin ');
         builder.write(classDeclaration.name.name);
+        builder.writeTypeParameters(
+            classDeclaration.declaredElement.typeParameters);
         builder.writeTypes(superclassConstraints, prefix: ' on ');
         builder.writeTypes(interfaces, prefix: ' implements ');
         builder.write(' ');
@@ -524,7 +461,7 @@
   Future<void> _addProposal_convertDocumentationIntoBlock() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    Comment comment = node.getAncestor((n) => n is Comment);
+    Comment comment = node.thisOrAncestorOfType<Comment>();
     if (comment == null || !comment.isDocumentation) {
       return;
     }
@@ -537,7 +474,7 @@
     }
     String prefix = utils.getNodePrefix(comment);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(comment), (DartEditBuilder builder) {
         builder.writeln('/**');
@@ -557,7 +494,7 @@
   Future<void> _addProposal_convertDocumentationIntoLine() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    Comment comment = node.getAncestor((n) => n is Comment);
+    Comment comment = node.thisOrAncestorOfType<Comment>();
     if (comment == null ||
         !comment.isDocumentation ||
         comment.tokens.length != 1) {
@@ -592,18 +529,22 @@
         if (line.startsWith(prefix + ' */')) {
           break;
         }
-        String expectedPrefix = prefix + ' * ';
+        String expectedPrefix = prefix + ' *';
         if (!line.startsWith(expectedPrefix)) {
           _coverageMarker();
           return;
         }
         line = line.substring(expectedPrefix.length).trim();
-        newLines.add('$linePrefix/// $line');
+        if (line.isEmpty) {
+          newLines.add('$linePrefix///');
+        } else {
+          newLines.add('$linePrefix/// $line');
+        }
         linePrefix = eol + prefix;
       }
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(comment), (DartEditBuilder builder) {
         for (String newLine in newLines) {
@@ -677,7 +618,7 @@
       code += ';';
       SourceRange replacementRange =
           range.startEnd(getter.returnType ?? getter.propertyKeyword, getter);
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleReplacement(replacementRange, code);
       });
@@ -730,7 +671,7 @@
     code += ';';
     SourceRange replacementRange =
         range.startEnd(fieldList.keyword, fieldDeclaration);
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(replacementRange, code);
     });
@@ -740,17 +681,16 @@
   Future<void> _addProposal_convertPartOfToUri() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    PartOfDirective directive =
-        node.getAncestor((node) => node is PartOfDirective);
+    PartOfDirective directive = node.thisOrAncestorOfType<PartOfDirective>();
     if (directive == null || directive.libraryName == null) {
       return;
     }
-    String libraryPath = unitLibraryElement.source.fullName;
-    String partPath = unit.declaredElement.source.fullName;
+    String libraryPath = context.resolveResult.libraryElement.source.fullName;
+    String partPath = context.resolveResult.path;
     String relativePath = relative(libraryPath, from: dirname(partPath));
     String uri = new Uri.file(relativePath).toString();
     SourceRange replacementRange = range.node(directive.libraryName);
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(replacementRange, "'$uri'");
     });
@@ -782,7 +722,7 @@
       return;
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.convertFunctionFromSyncToAsync(body, typeProvider);
     });
@@ -815,7 +755,7 @@
     String prefix = utils.getNodePrefix(body.parent);
     String indent = utils.getIndent(1);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(body), (DartEditBuilder builder) {
         if (body.isAsynchronous) {
@@ -876,7 +816,7 @@
       return;
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(body), (DartEditBuilder builder) {
         if (body.isAsynchronous) {
@@ -902,7 +842,7 @@
     }
     // prepare ConstructorDeclaration
     ConstructorDeclaration constructor =
-        node.getAncestor((node) => node is ConstructorDeclaration);
+        node.thisOrAncestorOfType<ConstructorDeclaration>();
     if (constructor == null) {
       return;
     }
@@ -964,7 +904,7 @@
       }
       String fieldName = parameterInitializer.fieldName.name;
 
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         // replace parameter
         builder.addSimpleReplacement(range.node(parameter), 'this.$fieldName');
@@ -993,7 +933,7 @@
     await null;
     // find enclosing ForEachStatement
     ForEachStatement forEachStatement =
-        node.getAncestor((n) => n is ForEachStatement);
+        node.thisOrAncestorOfType<ForEachStatement>();
     if (forEachStatement == null) {
       _coverageMarker();
       return;
@@ -1056,7 +996,7 @@
     String indent = utils.getIndent(1);
     int firstBlockLine = utils.getLineContentEnd(body.leftBracket.end);
     // add change
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       // TODO(brianwilkerson) Create linked positions for the loop variable.
       builder.addSimpleReplacement(
@@ -1088,6 +1028,33 @@
     }
   }
 
+  Future<void> _addProposal_convertToIntLiteral() async {
+    if (node is! DoubleLiteral) {
+      _coverageMarker();
+      return;
+    }
+    DoubleLiteral literal = node;
+    int intValue;
+    try {
+      intValue = literal.value?.truncate();
+    } catch (e) {
+      // Double cannot be converted to int
+    }
+    if (intValue == null || intValue != literal.value) {
+      _coverageMarker();
+      return;
+    }
+
+    var changeBuilder = _newDartChangeBuilder();
+    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+      builder.addReplacement(new SourceRange(literal.offset, literal.length),
+          (DartEditBuilder builder) {
+        builder.write('$intValue');
+      });
+    });
+    _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_TO_INT_LITERAL);
+  }
+
   Future<void> _addProposal_convertToIsNot_onIs() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -1125,7 +1092,7 @@
       return;
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       if (getExpressionParentPrecedence(prefExpression) >=
           TokenClass.RELATIONAL_OPERATOR.precedence) {
@@ -1179,7 +1146,7 @@
       return;
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       if (getExpressionParentPrecedence(prefExpression) >=
           TokenClass.RELATIONAL_OPERATOR.precedence) {
@@ -1248,7 +1215,7 @@
       return;
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(
           range.startStart(prefixExpression, prefixExpression.operand));
@@ -1273,7 +1240,7 @@
       // prepare type
       DartType type = parameterElement.type;
 
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         // replace parameter
         if (type.isDynamic) {
@@ -1310,7 +1277,7 @@
     await null;
     // find FieldDeclaration
     FieldDeclaration fieldDeclaration =
-        node.getAncestor((x) => x is FieldDeclaration);
+        node.thisOrAncestorOfType<FieldDeclaration>();
     if (fieldDeclaration == null) {
       _coverageMarker();
       return;
@@ -1351,7 +1318,7 @@
       _coverageMarker();
       return;
     }
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       // rename field
       builder.addSimpleReplacement(range.node(nameNode), '_$name');
@@ -1451,7 +1418,7 @@
     } else if (operatorType == TokenType.GT_EQ) {
       newOperator = '<=';
     }
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(leftRange, _getRangeText(rightRange));
       builder.addSimpleReplacement(rightRange, _getRangeText(leftRange));
@@ -1485,7 +1452,7 @@
       }
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       _convertFlutterChildToChildren(namedExp, eol, utils.getNodeText,
           utils.getLinePrefix, utils.getIndent, utils.getText, builder);
@@ -1496,7 +1463,7 @@
 
   Future<void> _addProposal_flutterConvertToStatefulWidget() async {
     ClassDeclaration widgetClass =
-        node.getAncestor((n) => n is ClassDeclaration);
+        node.thisOrAncestorOfType<ClassDeclaration>();
     TypeName superclass = widgetClass?.extendsClause?.superclass;
     if (widgetClass == null || superclass == null) {
       _coverageMarker();
@@ -1633,7 +1600,7 @@
     }
     var stateType = stateClass.type.instantiate([widgetClassElement.type]);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(superclass), (builder) {
         builder.writeType(statefulWidgetClass.type);
@@ -1743,7 +1710,7 @@
       List<Expression> parentElements = parentList.elements;
       int index = parentElements.indexOf(widget);
       if (index != parentElements.length - 1) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           Expression nextWidget = parentElements[index + 1];
           var nextRange = range.node(nextWidget);
@@ -1777,7 +1744,7 @@
       List<Expression> parentElements = parentList.elements;
       int index = parentElements.indexOf(widget);
       if (index > 0) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           Expression previousWidget = parentElements[index - 1];
           var previousRange = range.node(previousWidget);
@@ -1824,7 +1791,7 @@
       return;
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       var firstChild = childrenExpressions.first;
       var lastChild = childrenExpressions.last;
@@ -1852,7 +1819,7 @@
 
     // child: new ThisWidget(child: ourChild)
     // children: [foo, new ThisWidget(child: ourChild), bar]
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       var childExpression = childArgument.expression;
       var childText = utils.getNodeText(childExpression);
@@ -1906,6 +1873,61 @@
         parent, child, DartAssistKind.FLUTTER_SWAP_WITH_PARENT);
   }
 
+  Future<void> _addProposal_flutterWrapStreamBuilder() async {
+    Expression widgetExpr = flutter.identifyWidgetExpression(node);
+    if (widgetExpr == null) {
+      return;
+    }
+    if (flutter.isExactWidgetTypeStreamBuilder(widgetExpr.staticType)) {
+      return;
+    }
+    String widgetSrc = utils.getNodeText(widgetExpr);
+
+    var streamBuilderElement = await sessionHelper.getClass(
+      flutter.WIDGETS_LIBRARY_URI,
+      'StreamBuilder',
+    );
+    if (streamBuilderElement == null) {
+      return;
+    }
+
+    var changeBuilder = _newDartChangeBuilder();
+    await changeBuilder.addFileEdit(file, (builder) {
+      builder.addReplacement(range.node(widgetExpr), (builder) {
+        builder.writeType(streamBuilderElement.type);
+        builder.writeln('<Object>(');
+
+        String indentOld = utils.getLinePrefix(widgetExpr.offset);
+        String indentNew1 = indentOld + utils.getIndent(1);
+        String indentNew2 = indentOld + utils.getIndent(2);
+
+        builder.write(indentNew1);
+        builder.writeln('stream: null,');
+
+        builder.write(indentNew1);
+        builder.writeln('builder: (context, snapshot) {');
+
+        widgetSrc = widgetSrc.replaceAll(
+          new RegExp("^$indentOld", multiLine: true),
+          indentNew2,
+        );
+        builder.write(indentNew2);
+        builder.write('return $widgetSrc');
+        builder.writeln(';');
+
+        builder.write(indentNew1);
+        builder.writeln('}');
+
+        builder.write(indentOld);
+        builder.write(')');
+      });
+    });
+    _addAssistFromBuilder(
+      changeBuilder,
+      DartAssistKind.FLUTTER_WRAP_STREAM_BUILDER,
+    );
+  }
+
   Future<void> _addProposal_flutterWrapWidget() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -1963,7 +1985,7 @@
       }
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(widgetExpr), (DartEditBuilder builder) {
         if (parentClassElement == null) {
@@ -2006,7 +2028,7 @@
     await null;
     var selectionRange = new SourceRange(selectionOffset, selectionLength);
     var analyzer = new SelectionAnalyzer(selectionRange);
-    unit.accept(analyzer);
+    context.resolveResult.unit.accept(analyzer);
 
     List<Expression> widgetExpressions = [];
     if (analyzer.hasSelectedNodes) {
@@ -2045,7 +2067,7 @@
         return;
       }
 
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(selectedRange, (DartEditBuilder builder) {
           builder.writeType(parentClassElement.type);
@@ -2095,7 +2117,7 @@
     await null;
     // prepare ImportDirective
     ImportDirective importDirective =
-        node.getAncestor((node) => node is ImportDirective);
+        node.thisOrAncestorOfType<ImportDirective>();
     if (importDirective == null) {
       _coverageMarker();
       return;
@@ -2121,13 +2143,13 @@
         referencedNames.add(element.displayName);
       }
     });
-    unit.accept(visitor);
+    context.resolveResult.unit.accept(visitor);
     // ignore if unused
     if (referencedNames.isEmpty) {
       _coverageMarker();
       return;
     }
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       String showCombinator = ' show ${referencedNames.join(', ')}';
       builder.addSimpleInsertion(importDirective.end - 1, showCombinator);
@@ -2157,7 +2179,7 @@
     String prefix;
     Block targetBlock;
     {
-      Statement statement = node.getAncestor((n) => n is Statement);
+      Statement statement = node.thisOrAncestorOfType<Statement>();
       if (statement is IfStatement && statement.thenStatement is Block) {
         targetBlock = statement.thenStatement;
       } else if (statement is WhileStatement && statement.body is Block) {
@@ -2188,7 +2210,7 @@
         getVariableNameSuggestionsForExpression(castType, null, excluded);
 
     if (suggestions.isNotEmpty) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addInsertion(offset, (DartEditBuilder builder) {
           builder.write(eol + prefix + statementPrefix);
@@ -2227,7 +2249,7 @@
     String thenSource = _getNodeText(thenStatement);
     String elseSource = _getNodeText(elseStatement);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.node(condition), invertedCondition);
       builder.addSimpleReplacement(range.node(thenStatement), elseSource);
@@ -2290,7 +2312,7 @@
     String oldSource = utils.getRangeText(lineRanges);
     String newSource = utils.indentSourceLeftRight(oldSource);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.node(targetIfStatement),
           'if ($condition) {$eol$newSource$prefix}');
@@ -2356,7 +2378,7 @@
     String oldSource = utils.getRangeText(lineRanges);
     String newSource = utils.indentSourceLeftRight(oldSource);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.node(outerIfStatement),
           'if ($condition) {$eol$newSource$prefix}');
@@ -2389,6 +2411,7 @@
       return;
     }
     int declOffset = element.nameOffset;
+    var unit = context.resolveResult.unit;
     AstNode declNode = new NodeLocator(declOffset).searchWithin(unit);
     if (declNode != null &&
         declNode.parent is VariableDeclaration &&
@@ -2432,7 +2455,7 @@
       return;
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(
           range.endStart(declNode, assignExpression.operator), ' ');
@@ -2446,7 +2469,7 @@
     await null;
     // prepare enclosing VariableDeclarationList
     VariableDeclarationList declList =
-        node.getAncestor((node) => node is VariableDeclarationList);
+        node.thisOrAncestorOfType<VariableDeclarationList>();
     if (declList != null && declList.variables.length == 1) {
     } else {
       _coverageMarker();
@@ -2502,7 +2525,7 @@
       return;
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(
           range.endStart(decl.name, assignExpression.operator), ' ');
@@ -2515,7 +2538,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     VariableDeclarationList declarationList =
-        node.getAncestor((n) => n is VariableDeclarationList);
+        node.thisOrAncestorOfType<VariableDeclarationList>();
     if (declarationList == null) {
       _coverageMarker();
       return;
@@ -2545,7 +2568,7 @@
       return;
     }
     Token keyword = declarationList.keyword;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       SourceRange typeRange = range.startStart(typeNode, firstVariable);
       if (keyword != null && keyword.lexeme != 'var') {
@@ -2579,7 +2602,7 @@
     String indentArg = '$indentOld${utils.getIndent(1)}';
     String indentList = '$indentOld${utils.getIndent(2)}';
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(node), (DartEditBuilder builder) {
         builder.write('[');
@@ -2611,7 +2634,7 @@
     await null;
     ConditionalExpression conditional = null;
     // may be on Statement with Conditional
-    Statement statement = node.getAncestor((node) => node is Statement);
+    Statement statement = node.thisOrAncestorOfType<Statement>();
     if (statement == null) {
       _coverageMarker();
       return;
@@ -2657,7 +2680,7 @@
     String prefix = utils.getNodePrefix(statement);
 
     if (inVariable || inAssignment || inReturn) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         // Type v = Conditional;
         if (inVariable) {
@@ -2748,7 +2771,7 @@
     }
 
     if (hasReturnStatements || hasExpressionStatements) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         // returns
         if (hasReturnStatements) {
@@ -2801,7 +2824,7 @@
       return;
     }
     // prepare "if"
-    Statement statement = node.getAncestor((node) => node is Statement);
+    Statement statement = node.thisOrAncestorOfType<Statement>();
     if (statement is! IfStatement) {
       _coverageMarker();
       return;
@@ -2834,7 +2857,7 @@
       rightConditionSource = _getRangeText(rightConditionRange);
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       // remove "&& rightCondition"
       builder
@@ -2874,40 +2897,48 @@
   }
 
   Future<void> _addProposal_splitVariableDeclaration() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    // prepare DartVariableStatement, should be part of Block
-    VariableDeclarationStatement statement =
-        node.getAncestor((node) => node is VariableDeclarationStatement);
-    if (statement != null && statement.parent is Block) {
-    } else {
-      _coverageMarker();
+    var variableList = node?.thisOrAncestorOfType<VariableDeclarationList>();
+
+    // Must be a local variable declaration.
+    if (variableList?.parent is! VariableDeclarationStatement) {
       return;
     }
-    // check that statement declares single variable
-    List<VariableDeclaration> variables = statement.variables.variables;
+    VariableDeclarationStatement statement = variableList.parent;
+
+    // Cannot be `const` or `final`.
+    var keywordKind = variableList.keyword?.keyword;
+    if (keywordKind == Keyword.CONST || keywordKind == Keyword.FINAL) {
+      return;
+    }
+
+    var variables = variableList.variables;
     if (variables.length != 1) {
-      _coverageMarker();
       return;
     }
-    VariableDeclaration variable = variables[0];
-    // prepare initializer
-    Expression initializer = variable.initializer;
-    if (initializer == null) {
-      _coverageMarker();
+
+    // The caret must be between the type and the variable name.
+    var variable = variables[0];
+    if (!range.startEnd(statement, variable.name).contains(selectionOffset)) {
       return;
     }
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-      // remove initializer value
-      builder.addDeletion(range.endStart(variable.name, statement.semicolon));
-      // add assignment statement
-      String indent = utils.getNodePrefix(statement);
-      String name = variable.name.name;
-      String initSrc = _getNodeText(initializer);
-      SourceRange assignRange = range.endLength(statement, 0);
-      builder.addSimpleReplacement(
-          assignRange, eol + indent + name + ' = ' + initSrc + ';');
+
+    // The variable must have an initializer.
+    if (variable.initializer == null) {
+      return;
+    }
+
+    var changeBuilder = _newDartChangeBuilder();
+    await changeBuilder.addFileEdit(file, (builder) {
+      if (variableList.type == null) {
+        builder.addReplacement(range.token(variableList.keyword), (builder) {
+          var type = variable.declaredElement.type;
+          builder.writeType(type);
+        });
+      }
+
+      var indent = utils.getNodePrefix(statement);
+      var name = variable.name.name;
+      builder.addSimpleInsertion(variable.name.end, ';' + eol + indent + name);
     });
     _addAssistFromBuilder(
         changeBuilder, DartAssistKind.SPLIT_VARIABLE_DECLARATION);
@@ -2920,8 +2951,9 @@
     List<Statement> selectedStatements;
     {
       StatementAnalyzer selectionAnalyzer = new StatementAnalyzer(
-          unit, new SourceRange(selectionOffset, selectionLength));
-      unit.accept(selectionAnalyzer);
+          context.resolveResult,
+          new SourceRange(selectionOffset, selectionLength));
+      selectionAnalyzer.analyze();
       List<AstNode> selectedNodes = selectionAnalyzer.selectedNodes;
       // convert nodes to statements
       selectedStatements = [];
@@ -2947,7 +2979,7 @@
         utils.replaceSourceRangeIndent(statementsRange, indentOld, indentNew);
     // "block"
     {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleInsertion(statementsRange.offset, '$indentOld{$eol');
         builder.addSimpleReplacement(
@@ -2960,7 +2992,7 @@
     }
     // "if"
     {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(statementsRange, (DartEditBuilder builder) {
           builder.write(indentOld);
@@ -2979,7 +3011,7 @@
     }
     // "while"
     {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(statementsRange, (DartEditBuilder builder) {
           builder.write(indentOld);
@@ -2998,7 +3030,7 @@
     }
     // "for-in"
     {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(statementsRange, (DartEditBuilder builder) {
           builder.write(indentOld);
@@ -3019,7 +3051,7 @@
     }
     // "for"
     {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(statementsRange, (DartEditBuilder builder) {
           builder.write(indentOld);
@@ -3044,7 +3076,7 @@
     }
     // "do-while"
     {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(statementsRange, (DartEditBuilder builder) {
           builder.write(indentOld);
@@ -3064,7 +3096,7 @@
     }
     // "try-catch"
     {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(statementsRange, (DartEditBuilder builder) {
           builder.write(indentOld);
@@ -3094,7 +3126,7 @@
     }
     // "try-finally"
     {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(statementsRange, (DartEditBuilder builder) {
           builder.write(indentOld);
@@ -3149,7 +3181,7 @@
     utils.targetClassElement = null;
     if (target is AstNode) {
       ClassDeclaration targetClassDeclaration =
-          target.getAncestor((node) => node is ClassDeclaration);
+          target.thisOrAncestorOfType<ClassDeclaration>();
       if (targetClassDeclaration != null) {
         utils.targetClassElement = targetClassDeclaration.declaredElement;
       }
@@ -3220,7 +3252,7 @@
       replacement = '$functionName = $returnType Function$parameters';
     }
     // add change
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(
           range.startStart(node.typedefKeyword.next, node.semicolon),
@@ -3251,7 +3283,7 @@
       replacement = '$returnType Function$parameters $functionName';
     }
     // add change
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.node(node), replacement);
     });
@@ -3271,7 +3303,7 @@
         int quoteLength = literal.isMultiline ? 3 : 1;
         String lexeme = literal.literal.lexeme;
         if (lexeme.indexOf(newQuote) < 0) {
-          DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+          var changeBuilder = _newDartChangeBuilder();
           await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
             builder.addSimpleReplacement(
                 new SourceRange(
@@ -3301,7 +3333,7 @@
             }
           }
         }
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addSimpleReplacement(
               new SourceRange(
@@ -3329,14 +3361,13 @@
     return utils.getRangeText(range);
   }
 
-  bool _setupCompute() {
-    try {
-      utils = new CorrectionUtils(unit);
-    } catch (e) {
-      throw new CancelCorrectionException(exception: e);
-    }
+  DartChangeBuilder _newDartChangeBuilder() {
+    return new DartChangeBuilderImpl.forWorkspace(context.workspace);
+  }
 
-    node = new NodeLocator(selectionOffset, selectionEnd).searchWithin(unit);
+  bool _setupCompute() {
+    var locator = new NodeLocator(selectionOffset, selectionEnd);
+    node = locator.searchWithin(context.resolveResult.unit);
     return node != null;
   }
 
@@ -3350,7 +3381,7 @@
       return;
     }
 
-    var changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (builder) {
       builder.addReplacement(range.node(parent), (builder) {
         var childArgs = child.argumentList;
diff --git a/pkg/analysis_server/lib/src/services/correction/change_workspace.dart b/pkg/analysis_server/lib/src/services/correction/change_workspace.dart
new file mode 100644
index 0000000..c206924
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/change_workspace.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
+
+/// [ChangeWorkspace] based on sessions.
+class DartChangeWorkspace implements ChangeWorkspace {
+  final List<AnalysisSession> sessions;
+
+  DartChangeWorkspace(this.sessions);
+
+  @override
+  bool containsFile(String path) {
+    for (var session in sessions) {
+      if (session.analysisContext.contextRoot.isAnalyzed(path)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
+  AnalysisSession getSession(String path) {
+    for (var session in sessions) {
+      if (session.analysisContext.contextRoot.isAnalyzed(path)) {
+        return session;
+      }
+    }
+    throw StateError('Not in a context root: $path');
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 21765cf..e9bf18d 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -1,14 +1,14 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
 import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 /**
@@ -56,13 +56,10 @@
     errorCode == HintCode.DIVISION_OPTIMIZATION ||
     errorCode == HintCode.TYPE_CHECK_IS_NOT_NULL ||
     errorCode == HintCode.TYPE_CHECK_IS_NULL ||
-    errorCode == HintCode.UNDEFINED_GETTER ||
-    errorCode == HintCode.UNDEFINED_SETTER ||
     errorCode == HintCode.UNNECESSARY_CAST ||
     errorCode == HintCode.UNUSED_CATCH_CLAUSE ||
     errorCode == HintCode.UNUSED_CATCH_STACK ||
     errorCode == HintCode.UNUSED_IMPORT ||
-    errorCode == HintCode.UNDEFINED_METHOD ||
     errorCode == ParserErrorCode.EXPECTED_TOKEN ||
     errorCode == ParserErrorCode.GETTER_WITH_PARAMETERS ||
     errorCode == ParserErrorCode.VAR_AS_TYPE_NAME ||
@@ -86,6 +83,22 @@
             errorCode.name == LintNames.unnecessary_this));
 
 /**
+ * The implementation of [DartFixContext].
+ */
+class DartFixContextImpl implements DartFixContext {
+  @override
+  final ChangeWorkspace workspace;
+
+  @override
+  final ResolvedUnitResult resolveResult;
+
+  @override
+  final AnalysisError error;
+
+  DartFixContextImpl(this.workspace, this.resolveResult, this.error);
+}
+
+/**
  * An enumeration of possible quick fix kinds.
  */
 class DartFixKind {
@@ -96,20 +109,22 @@
       appliedTogetherMessage: "Add all casts in file");
   static const ADD_FIELD_FORMAL_PARAMETERS = const FixKind(
       'ADD_FIELD_FORMAL_PARAMETERS', 70, "Add final field formal parameters");
+  static const ADD_MISSING_PARAMETER_NAMED = const FixKind(
+      'ADD_MISSING_PARAMETER_NAMED', 70, "Add named parameter '{0}'");
   static const ADD_MISSING_PARAMETER_POSITIONAL = const FixKind(
       'ADD_MISSING_PARAMETER_POSITIONAL',
       69,
       "Add optional positional parameter");
-  static const ADD_MISSING_PARAMETER_NAMED = const FixKind(
-      'ADD_MISSING_PARAMETER_NAMED', 70, "Add named parameter '{0}'");
   static const ADD_MISSING_PARAMETER_REQUIRED = const FixKind(
       'ADD_MISSING_PARAMETER_REQUIRED', 70, "Add required parameter");
   static const ADD_MISSING_REQUIRED_ARGUMENT = const FixKind(
       'ADD_MISSING_REQUIRED_ARGUMENT', 70, "Add required argument '{0}'");
   static const ADD_NE_NULL = const FixKind('ADD_NE_NULL', 50, "Add != null",
       appliedTogetherMessage: "Add != null everywhere in file");
-  static const ADD_PACKAGE_DEPENDENCY = const FixKind(
-      'ADD_PACKAGE_DEPENDENCY', 50, "Add dependency on package '{0}'");
+  static const ADD_OVERRIDE =
+      const FixKind('ADD_OVERRIDE', 50, "Add '@override' annotation");
+  static const ADD_REQUIRED =
+      const FixKind('ADD_REQUIRED', 50, "Add '@required' annotation");
   static const ADD_STATIC =
       const FixKind('ADD_STATIC', 50, "Add 'static' modifier");
   static const ADD_SUPER_CONSTRUCTOR_INVOCATION = const FixKind(
@@ -129,6 +144,8 @@
       const FixKind('CONVERT_FLUTTER_CHILD', 50, "Convert to children:");
   static const CONVERT_FLUTTER_CHILDREN =
       const FixKind('CONVERT_FLUTTER_CHILDREN', 50, "Convert to child:");
+  static const CONVERT_TO_NAMED_ARGUMENTS = const FixKind(
+      'CONVERT_TO_NAMED_ARGUMENTS', 50, "Convert to named arguments");
   static const CREATE_CLASS =
       const FixKind('CREATE_CLASS', 50, "Create class '{0}'");
   static const CREATE_CONSTRUCTOR =
@@ -157,8 +174,10 @@
       const FixKind('CREATE_MIXIN', 50, "Create mixin '{0}'");
   static const CREATE_NO_SUCH_METHOD = const FixKind(
       'CREATE_NO_SUCH_METHOD', 49, "Create 'noSuchMethod' method");
-  static const CONVERT_TO_NAMED_ARGUMENTS = const FixKind(
-      'CONVERT_TO_NAMED_ARGUMENTS', 50, "Convert to named arguments");
+  static const EXTEND_CLASS_FOR_MIXIN =
+      const FixKind('EXTEND_CLASS_FOR_MIXIN', 50, "Extend the class '{0}'");
+  static const IMPORT_ASYNC =
+      const FixKind('IMPORT_ASYNC', 49, "Import 'dart:async'");
   static const IMPORT_LIBRARY_PREFIX = const FixKind('IMPORT_LIBRARY_PREFIX',
       49, "Use imported library '{0}' with prefix '{1}'");
   static const IMPORT_LIBRARY_PROJECT1 =
@@ -173,28 +192,18 @@
       const FixKind('IMPORT_LIBRARY_SHOW', 55, "Update library '{0}' import");
   static const INSERT_SEMICOLON =
       const FixKind('INSERT_SEMICOLON', 50, "Insert ';'");
-  static const INVOKE_CONSTRUCTOR_USING_NEW = const FixKind(
-      'INVOKE_CONSTRUCTOR_USING_NEW', 50, "Invoke constructor using 'new'");
-  static const LINT_ADD_OVERRIDE =
-      const FixKind('LINT_ADD_OVERRIDE', 50, "Add '@override' annotation");
-  static const LINT_ADD_REQUIRED =
-      const FixKind('LINT_ADD_REQUIRED', 50, "Add '@required' annotation");
-  static const LINT_REMOVE_INTERPOLATION_BRACES = const FixKind(
-      'LINT_REMOVE_INTERPOLATION_BRACES',
-      50,
-      "Remove unnecessary interpolation braces");
   static const MAKE_CLASS_ABSTRACT =
       const FixKind('MAKE_CLASS_ABSTRACT', 50, "Make class '{0}' abstract");
+  static const MAKE_FIELD_NOT_FINAL =
+      const FixKind('MAKE_FIELD_NOT_FINAL', 50, "Make field '{0}' not final");
+  static const MAKE_FINAL = const FixKind('MAKE_FINAL', 50, "Make final");
   static const MOVE_TYPE_ARGUMENTS_TO_CLASS = const FixKind(
       'MOVE_TYPE_ARGUMENTS_TO_CLASS',
       50,
       "Move type arguments to after class name");
+  static const REMOVE_AWAIT = const FixKind('REMOVE_AWAIT', 50, "Remove await");
   static const REMOVE_DEAD_CODE =
       const FixKind('REMOVE_DEAD_CODE', 50, "Remove dead code");
-  static const MAKE_FIELD_NOT_FINAL =
-      const FixKind('MAKE_FIELD_NOT_FINAL', 50, "Make field '{0}' not final");
-  static const MAKE_FINAL = const FixKind('MAKE_FINAL', 50, "Make final");
-  static const REMOVE_AWAIT = const FixKind('REMOVE_AWAIT', 50, "Remove await");
   static const REMOVE_EMPTY_CATCH =
       const FixKind('REMOVE_EMPTY_CATCH', 50, "Remove empty catch clause");
   static const REMOVE_EMPTY_CONSTRUCTOR_BODY = const FixKind(
@@ -205,6 +214,10 @@
       const FixKind('REMOVE_EMPTY_STATEMENT', 50, "Remove empty statement");
   static const REMOVE_INITIALIZER =
       const FixKind('REMOVE_INITIALIZER', 50, "Remove initializer");
+  static const REMOVE_INTERPOLATION_BRACES = const FixKind(
+      'REMOVE_INTERPOLATION_BRACES',
+      50,
+      "Remove unnecessary interpolation braces");
   static const REMOVE_METHOD_DECLARATION = const FixKind(
       'REMOVE_METHOD_DECLARATION', 50, "Remove method declaration");
   static const REMOVE_PARAMETERS_IN_GETTER_DECLARATION = const FixKind(
@@ -217,10 +230,10 @@
       "Remove parentheses in getter invocation");
   static const REMOVE_THIS_EXPRESSION =
       const FixKind('REMOVE_THIS_EXPRESSION', 50, "Remove this expression");
+  static const REMOVE_TYPE_ANNOTATION =
+      const FixKind('REMOVE_TYPE_ANNOTATION', 50, "Remove type annotation");
   static const REMOVE_TYPE_ARGUMENTS =
       const FixKind('REMOVE_TYPE_ARGUMENTS', 49, "Remove type arguments");
-  static const REMOVE_TYPE_NAME =
-      const FixKind('REMOVE_TYPE_NAME', 50, "Remove type name");
   static const REMOVE_UNNECESSARY_CAST = const FixKind(
       'REMOVE_UNNECESSARY_CAST', 50, "Remove unnecessary cast",
       appliedTogetherMessage: "Remove all unnecessary casts in file");
@@ -238,12 +251,12 @@
       appliedTogetherMessage: "Replace all 'boolean' with 'bool' in file");
   static const REPLACE_FINAL_WITH_CONST = const FixKind(
       'REPLACE_FINAL_WITH_CONST', 50, "Replace 'final' with 'const'");
-  static const REPLACE_VAR_WITH_DYNAMIC = const FixKind(
-      'REPLACE_VAR_WITH_DYNAMIC', 50, "Replace 'var' with 'dynamic'");
   static const REPLACE_RETURN_TYPE_FUTURE = const FixKind(
       'REPLACE_RETURN_TYPE_FUTURE',
       50,
       "Return 'Future' from 'async' function");
+  static const REPLACE_VAR_WITH_DYNAMIC = const FixKind(
+      'REPLACE_VAR_WITH_DYNAMIC', 50, "Replace 'var' with 'dynamic'");
   static const REPLACE_WITH_BRACKETS =
       const FixKind('REPLACE_WITH_BRACKETS', 50, "Replace with { }");
   static const REPLACE_WITH_CONDITIONAL_ASSIGNMENT = const FixKind(
@@ -258,6 +271,8 @@
       "Replace the '.' with a '?.' in the invocation");
   static const REPLACE_WITH_TEAR_OFF = const FixKind(
       'REPLACE_WITH_TEAR_OFF', 50, "Replace function literal with tear-off");
+  static const UPDATE_SDK_CONSTRAINTS =
+      const FixKind('UPDATE_SDK_CONSTRAINTS', 50, "Update the SDK constraints");
   static const USE_CONST = const FixKind('USE_CONST', 50, "Change to constant");
   static const USE_EFFECTIVE_INTEGER_DIVISION = const FixKind(
       'USE_EFFECTIVE_INTEGER_DIVISION',
@@ -274,29 +289,3 @@
       appliedTogetherMessage:
           "Use != null instead of 'is! Null' everywhere in file");
 }
-
-/**
- * The implementation of [FixContext].
- */
-class FixContextImpl implements FixContext {
-  @override
-  final ResourceProvider resourceProvider;
-
-  @override
-  final AnalysisDriver analysisDriver;
-
-  @override
-  final AnalysisError error;
-
-  @override
-  final List<AnalysisError> errors;
-
-  FixContextImpl(
-      this.resourceProvider, this.analysisDriver, this.error, this.errors);
-
-  FixContextImpl.from(FixContext other)
-      : resourceProvider = other.resourceProvider,
-        analysisDriver = other.analysisDriver,
-        error = other.error,
-        errors = other.errors;
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index db40113..0db0fb2 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -23,16 +23,12 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/context_root.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -44,9 +40,12 @@
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/hint/sdk_constraint_extractor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError, Element, ElementKind;
+import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart' hide FixContributor;
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -58,30 +57,11 @@
 typedef bool ElementPredicate(Element argument);
 
 /**
- * The implementation of [DartFixContext].
- *
- * Clients may not extend, implement or mix-in this class.
+ * A fix contributor that provides the default set of fixes for Dart files.
  */
-class DartFixContextImpl extends FixContextImpl implements DartFixContext {
+class DartFixContributor implements FixContributor {
   @override
-  final AstProvider astProvider;
-
-  @override
-  final CompilationUnit unit;
-
-  DartFixContextImpl(FixContext fixContext, this.astProvider, this.unit)
-      : super.from(fixContext);
-
-  GetTopLevelDeclarations get getTopLevelDeclarations =>
-      analysisDriver.getTopLevelNameDeclarations;
-}
-
-/**
- * A [FixContributor] that provides the default set of fixes.
- */
-class DefaultFixContributor extends DartFixContributor {
-  @override
-  Future<List<Fix>> internalComputeFixes(DartFixContext context) async {
+  Future<List<Fix>> computeFixes(DartFixContext context) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     try {
@@ -98,8 +78,8 @@
       DartFixContext context, List<Fix> fixes) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    final AnalysisError analysisError = context.error;
-    final List<AnalysisError> allAnalysisErrors = context.errors;
+    final analysisError = context.error;
+    final allAnalysisErrors = context.resolveResult.errors.toList();
 
     // Validate inputs:
     // - return if no fixes
@@ -123,14 +103,9 @@
     // one.
     // For each fix, put the fix into the HashMap.
     for (int i = 0; i < allAnalysisErrors.length; i++) {
-      final FixContext fixContextI = new FixContextImpl(
-          context.resourceProvider,
-          context.analysisDriver,
-          allAnalysisErrors[i],
-          allAnalysisErrors);
-      final DartFixContextImpl dartFixContextI = new DartFixContextImpl(
-          fixContextI, context.astProvider, context.unit);
-      final FixProcessor processorI = new FixProcessor(dartFixContextI);
+      final FixContext fixContextI = new DartFixContextImpl(
+          context.workspace, context.resolveResult, allAnalysisErrors[i]);
+      final FixProcessor processorI = new FixProcessor(fixContextI);
       final List<Fix> fixesListI = await processorI.compute();
       for (Fix f in fixesListI) {
         if (!map.containsKey(f.kind)) {
@@ -188,70 +163,40 @@
 class FixProcessor {
   static const int MAX_LEVENSHTEIN_DISTANCE = 3;
 
-  ResourceProvider resourceProvider;
-  AstProvider astProvider;
-  GetTopLevelDeclarations getTopLevelDeclarations;
-  CompilationUnit unit;
-  AnalysisError error;
+  final DartFixContext context;
+  final ResourceProvider resourceProvider;
+  final AnalysisSession session;
+  final AnalysisSessionHelper sessionHelper;
+  final TypeProvider typeProvider;
+  final TypeSystem typeSystem;
 
-  /**
-   * The analysis driver being used to perform analysis.
-   */
-  AnalysisDriver driver;
+  final String file;
+  final LibraryElement unitLibraryElement;
+  final CompilationUnit unit;
+  final CorrectionUtils utils;
 
-  /**
-   * The analysis session to be used to create the change builder.
-   */
-  AnalysisSession session;
-
-  /**
-   * The helper wrapper around the [session].
-   */
-  AnalysisSessionHelper sessionHelper;
-
-  String file;
-  CompilationUnitElement unitElement;
-  Source unitSource;
-  LibraryElement unitLibraryElement;
-  File unitLibraryFile;
-  Folder unitLibraryFolder;
+  final AnalysisError error;
+  final int errorOffset;
+  final int errorLength;
 
   final List<Fix> fixes = <Fix>[];
 
-  CorrectionUtils utils;
-  int errorOffset;
-  int errorLength;
-  int errorEnd;
-  SourceRange errorRange;
   AstNode node;
   AstNode coveredNode;
 
-  TypeProvider _typeProvider;
-  TypeSystem _typeSystem;
-
-  FixProcessor(DartFixContext dartContext) {
-    resourceProvider = dartContext.resourceProvider;
-    astProvider = dartContext.astProvider;
-    getTopLevelDeclarations = dartContext.getTopLevelDeclarations;
-
-    driver = dartContext.analysisDriver;
-    session = driver.currentSession;
-    sessionHelper = new AnalysisSessionHelper(session);
-
-    // unit
-    unit = dartContext.unit;
-    unitElement = unit.declaredElement;
-    unitSource = unitElement.source;
-    // file
-    file = unitSource.fullName;
-    // library
-    unitLibraryElement = unitElement.library;
-    String unitLibraryPath = unitLibraryElement.source.fullName;
-    unitLibraryFile = resourceProvider.getFile(unitLibraryPath);
-    unitLibraryFolder = unitLibraryFile.parent;
-    // error
-    error = dartContext.error;
-  }
+  FixProcessor(this.context)
+      : resourceProvider = context.resolveResult.session.resourceProvider,
+        session = context.resolveResult.session,
+        sessionHelper = AnalysisSessionHelper(context.resolveResult.session),
+        typeProvider = context.resolveResult.typeProvider,
+        typeSystem = context.resolveResult.typeSystem,
+        file = context.resolveResult.path,
+        unitLibraryElement = context.resolveResult.libraryElement,
+        unit = context.resolveResult.unit,
+        utils = CorrectionUtils(context.resolveResult),
+        error = context.error,
+        errorOffset = context.error.offset,
+        errorLength = context.error.length;
 
   DartType get coreTypeBool => _getCoreType('bool');
 
@@ -260,36 +205,13 @@
    */
   String get eol => utils.endOfLine;
 
-  TypeProvider get typeProvider {
-    if (_typeProvider == null) {
-      _typeProvider = unitElement.context.typeProvider;
-    }
-    return _typeProvider;
-  }
-
-  TypeSystem get typeSystem {
-    if (_typeSystem == null) {
-      _typeSystem = new StrongTypeSystemImpl(typeProvider);
-    }
-    return _typeSystem;
-  }
-
   Future<List<Fix>> compute() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    try {
-      utils = new CorrectionUtils(unit);
-    } catch (e) {
-      throw new CancelCorrectionException(exception: e);
-    }
 
-    errorOffset = error.offset;
-    errorLength = error.length;
-    errorEnd = errorOffset + errorLength;
-    errorRange = new SourceRange(errorOffset, errorLength);
     node = new NodeLocator2(errorOffset).searchWithin(unit);
-    coveredNode =
-        new NodeLocator2(errorOffset, errorEnd - 1).searchWithin(unit);
+    coveredNode = new NodeLocator2(errorOffset, errorOffset + errorLength - 1)
+        .searchWithin(unit);
     if (coveredNode == null) {
       // TODO(brianwilkerson) Figure out why the coveredNode is sometimes null.
       return fixes;
@@ -369,15 +291,6 @@
     if (errorCode == HintCode.TYPE_CHECK_IS_NULL) {
       await _addFix_isNull();
     }
-    if (errorCode == HintCode.UNDEFINED_GETTER) {
-      await _addFix_undefinedClassAccessor_useSimilar();
-      await _addFix_createField();
-      await _addFix_createGetter();
-    }
-    if (errorCode == HintCode.UNDEFINED_SETTER) {
-      await _addFix_undefinedClassAccessor_useSimilar();
-      await _addFix_createField();
-    }
     if (errorCode == HintCode.UNNECESSARY_CAST) {
       await _addFix_removeUnnecessaryCast();
     }
@@ -481,9 +394,6 @@
         errorCode == StaticWarningCode.UNDEFINED_NAMED_PARAMETER) {
       await _addFix_addMissingNamedArgument();
     }
-    if (errorCode == StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR) {
-      await _addFix_undefinedMethodWithContructor();
-    }
     if (errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE) {
       await _addFix_illegalAsyncReturnType();
     }
@@ -526,8 +436,7 @@
       await _addFix_importLibrary_withTopLevelVariable();
       await _addFix_importLibrary_withType();
     }
-    if (errorCode == HintCode.UNDEFINED_METHOD ||
-        errorCode == StaticTypeWarningCode.UNDEFINED_METHOD) {
+    if (errorCode == StaticTypeWarningCode.UNDEFINED_METHOD) {
       await _addFix_createClass();
       await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withType();
@@ -556,6 +465,14 @@
       await _addFix_moveTypeArgumentsToClass();
       await _addFix_removeTypeArguments();
     }
+    if (errorCode ==
+        CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE) {
+      await _addFix_extendClassForMixin();
+    }
+    if (errorCode == HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE) {
+      await _addFix_importAsync();
+      await _addFix_updateSdkConstraints();
+    }
     // lints
     if (errorCode is LintCode) {
       String name = errorCode.name;
@@ -642,10 +559,10 @@
   Future<void> _addFix_addAsync() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    FunctionBody body = node.getAncestor((n) => n is FunctionBody);
+    FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
     if (body != null && body.keyword == null) {
       TypeProvider typeProvider = this.typeProvider;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.convertFunctionFromSyncToAsync(body, typeProvider);
       });
@@ -698,7 +615,7 @@
         // `cast` invocation.
         return;
       }
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         if (needsParentheses) {
           builder.addSimpleInsertion(target.offset, '(');
@@ -719,7 +636,7 @@
         // `cast` invocation.
         return;
       }
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         if (needsParentheses) {
           builder.addSimpleInsertion(target.offset, '(');
@@ -737,7 +654,7 @@
       });
       _addFixFromBuilder(changeBuilder, DartFixKind.ADD_EXPLICIT_CAST);
     } else {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         if (needsParentheses) {
           builder.addSimpleInsertion(target.offset, '(');
@@ -777,7 +694,7 @@
     AstNode argumentList = namedExpression.parent;
 
     // Prepare the invoked element.
-    var context = new _ExecutableParameters(astProvider, argumentList.parent);
+    var context = new _ExecutableParameters(sessionHelper, argumentList.parent);
     if (context == null) {
       return;
     }
@@ -791,7 +708,7 @@
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
       if (offset != null) {
-        var changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(context.file, (builder) {
           builder.addInsertion(offset, (builder) {
             builder.write(prefix);
@@ -829,7 +746,7 @@
     List<Expression> arguments = argumentList.arguments;
 
     // Prepare the invoked element.
-    var context = new _ExecutableParameters(astProvider, node.parent);
+    var context = new _ExecutableParameters(sessionHelper, node.parent);
     if (context == null) {
       return;
     }
@@ -846,7 +763,7 @@
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
       if (offset != null) {
-        var changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(context.file, (builder) {
           builder.addInsertion(offset, (builder) {
             builder.write(prefix);
@@ -902,7 +819,7 @@
         argumentList = invocation.argumentList;
       } else {
         creation =
-            invocation.getAncestor((p) => p is InstanceCreationExpression);
+            invocation.thisOrAncestorOfType<InstanceCreationExpression>();
         if (creation != null) {
           targetElement = creation.staticElement;
           argumentList = creation.argumentList;
@@ -936,7 +853,7 @@
         hasTrailingComma = lastArgument.endToken.next.type == TokenType.COMMA;
       }
 
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addInsertion(offset, (DartEditBuilder builder) {
           if (arguments.isNotEmpty) {
@@ -960,7 +877,7 @@
   Future<void> _addFix_addOverrideAnnotation() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    ClassMember member = node.getAncestor((n) => n is ClassMember);
+    ClassMember member = node.thisOrAncestorOfType<ClassMember>();
     if (member == null) {
       return;
     }
@@ -975,31 +892,31 @@
 
     Position exitPosition = new Position(file, token.offset - 1);
     String indent = utils.getIndent(1);
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(
           range.startLength(token, 0), '@override$eol$indent');
     });
     changeBuilder.setSelection(exitPosition);
-    _addFixFromBuilder(changeBuilder, DartFixKind.LINT_ADD_OVERRIDE);
+    _addFixFromBuilder(changeBuilder, DartFixKind.ADD_OVERRIDE);
   }
 
   Future<void> _addFix_addRequiredAnnotation() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleInsertion(node.parent.offset, '@required ');
     });
-    _addFixFromBuilder(changeBuilder, DartFixKind.LINT_ADD_REQUIRED);
+    _addFixFromBuilder(changeBuilder, DartFixKind.ADD_REQUIRED);
   }
 
   Future<void> _addFix_addStatic() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     FieldDeclaration declaration =
-        node.getAncestor((n) => n is FieldDeclaration);
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        node.thisOrAncestorOfType<FieldDeclaration>();
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleInsertion(declaration.offset, 'static ');
     });
@@ -1009,7 +926,7 @@
   Future<void> _addFix_boolInsteadOfBoolean() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.error(error), 'bool');
     });
@@ -1021,7 +938,7 @@
     await null;
     AstNode node = coveredNode;
     if (node is Expression) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         AstNode parent = node.parent;
         while (parent != null) {
@@ -1047,7 +964,7 @@
     String correction = lexeme.toLowerCase().contains('x')
         ? '0x${precise.toRadixString(16).toUpperCase()}'
         : precise.toString();
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.node(integer), correction);
     });
@@ -1070,7 +987,7 @@
           Expression initializer = coveredNode;
           DartType newType = initializer.staticType;
           if (newType is InterfaceType || newType is FunctionType) {
-            DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+            var changeBuilder = _newDartChangeBuilder();
             await changeBuilder.addFileEdit(file,
                 (DartFileEditBuilder builder) {
               builder.addReplacement(range.node(typeNode),
@@ -1100,7 +1017,7 @@
     // child: widget
     Expression expression = named.expression;
     if (flutter.isWidgetExpression(expression)) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         flutter.convertChildToChildren2(
             builder,
@@ -1120,7 +1037,7 @@
     // child: [widget1, widget2]
     if (expression is ListLiteral &&
         expression.elements.every(flutter.isWidgetExpression)) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleReplacement(range.node(named.name), 'children:');
         if (expression.typeArguments == null) {
@@ -1148,7 +1065,7 @@
           String indentNew = utils.getLinePrefix(named.offset);
           widgetText = _replaceSourceIndent(widgetText, indentOld, indentNew);
 
-          var builder = new DartChangeBuilder(session);
+          var builder = _newDartChangeBuilder();
           await builder.addFileEdit(file, (builder) {
             builder.addReplacement(range.node(named), (builder) {
               builder.write('child: ');
@@ -1220,7 +1137,7 @@
         return;
       }
 
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         for (var argument in argumentToParameter.keys) {
           var parameter = argumentToParameter[argument];
@@ -1265,9 +1182,10 @@
     int offset = -1;
     String filePath;
     if (prefixElement == null) {
-      targetUnit = unitElement;
-      CompilationUnitMember enclosingMember = node.getAncestor((node) =>
-          node is CompilationUnitMember && node.parent is CompilationUnit);
+      targetUnit = unit.declaredElement;
+      CompilationUnitMember enclosingMember = node.thisOrAncestorMatching(
+          (node) =>
+              node is CompilationUnitMember && node.parent is CompilationUnit);
       if (enclosingMember == null) {
         return;
       }
@@ -1298,7 +1216,7 @@
     if (offset < 0) {
       return;
     }
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(filePath, (DartFileEditBuilder builder) {
       builder.addInsertion(offset, (DartEditBuilder builder) {
         builder.write(prefix);
@@ -1324,7 +1242,7 @@
     }
 
     ClassDeclaration classDeclaration =
-        node.getAncestor((node) => node is ClassDeclaration);
+        node.thisOrAncestorOfType<ClassDeclaration>();
     if (classDeclaration == null) {
       return;
     }
@@ -1347,7 +1265,7 @@
     ClassMemberLocation targetLocation =
         utils.prepareNewConstructorLocation(classDeclaration);
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     if (flutter.isExactlyStatelessWidgetType(superType) ||
         flutter.isExactlyStatefulWidgetType(superType)) {
       // Specialize for Flutter widgets.
@@ -1416,17 +1334,22 @@
     if (constructorElement.enclosingElement is! ClassElement) {
       return;
     }
-    ClassElement targetElement = constructorElement.enclosingElement;
-    // prepare location for a new constructor
-    AstNode targetTypeNode = getParsedClassElementNode(targetElement);
-    if (targetTypeNode is! ClassDeclaration) {
+
+    // prepare target ClassDeclaration
+    var targetElement = constructorElement.enclosingElement;
+    var targetResult = await sessionHelper.getElementDeclaration(targetElement);
+    if (targetResult.node is! ClassOrMixinDeclaration) {
       return;
     }
-    ClassMemberLocation targetLocation =
-        utils.prepareNewConstructorLocation(targetTypeNode);
+    ClassOrMixinDeclaration targetNode = targetResult.node;
+
+    // prepare location
+    var targetLocation = CorrectionUtils(targetResult.resolvedUnit)
+        .prepareNewConstructorLocation(targetNode);
+
     Source targetSource = targetElement.source;
     String targetFile = targetSource.fullName;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
       builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
         builder.write(targetLocation.prefix);
@@ -1472,17 +1395,22 @@
     if (targetType is! InterfaceType) {
       return;
     }
-    // prepare location for a new constructor
-    ClassElement targetElement = targetType.element as ClassElement;
-    AstNode targetTypeNode = getParsedClassElementNode(targetElement);
-    if (targetTypeNode is! ClassDeclaration) {
+
+    // prepare target ClassDeclaration
+    ClassElement targetElement = targetType.element;
+    var targetResult = await sessionHelper.getElementDeclaration(targetElement);
+    if (targetResult.node is! ClassOrMixinDeclaration) {
       return;
     }
-    ClassMemberLocation targetLocation =
-        utils.prepareNewConstructorLocation(targetTypeNode);
+    ClassOrMixinDeclaration targetNode = targetResult.node;
+
+    // prepare location
+    var targetLocation = CorrectionUtils(targetResult.resolvedUnit)
+        .prepareNewConstructorLocation(targetNode);
+
     String targetFile = targetElement.source.fullName;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
-    await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+    var changeBuilder = _newDartChangeBuilder();
+    await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
       builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
         builder.write(targetLocation.prefix);
         builder.writeConstructorDeclaration(targetElement.name,
@@ -1533,7 +1461,7 @@
         prefix = ', ';
       }
       String proposalName = _getConstructorProposalName(superConstructor);
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addInsertion(insertOffset, (DartEditBuilder builder) {
           builder.write(prefix);
@@ -1574,7 +1502,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     ClassDeclaration targetClassNode =
-        node.getAncestor((parent) => parent is ClassDeclaration);
+        node.thisOrAncestorOfType<ClassDeclaration>();
     ClassElement targetClassElement = targetClassNode.declaredElement;
     InterfaceType superType = targetClassElement.supertype;
     String targetClassName = targetClassElement.name;
@@ -1594,7 +1522,7 @@
       ClassMemberLocation targetLocation =
           utils.prepareNewConstructorLocation(targetClassNode);
       String proposalName = _getConstructorProposalName(superConstructor);
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
           void writeParameters(bool includeType) {
@@ -1689,18 +1617,20 @@
     }
     utils.targetClassElement = targetClassElement;
     // prepare target ClassDeclaration
-    AstNode targetTypeNode = getParsedClassElementNode(targetClassElement);
-    if (targetTypeNode is! ClassDeclaration) {
+    var targetDeclarationResult =
+        await sessionHelper.getElementDeclaration(targetClassElement);
+    if (targetDeclarationResult.node is! ClassOrMixinDeclaration) {
       return;
     }
-    ClassDeclaration targetClassNode = targetTypeNode;
+    ClassOrMixinDeclaration targetNode = targetDeclarationResult.node;
     // prepare location
     ClassMemberLocation targetLocation =
-        _getUtilsFor(targetClassNode).prepareNewFieldLocation(targetClassNode);
+        CorrectionUtils(targetDeclarationResult.resolvedUnit)
+            .prepareNewFieldLocation(targetNode);
     // build field source
     Source targetSource = targetClassElement.source;
     String targetFile = targetSource.fullName;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
       Expression fieldTypeNode = climbPropertyAccess(nameNode);
       DartType fieldType = _inferUndefinedExpressionType(fieldTypeNode);
@@ -1724,12 +1654,12 @@
     // Ensure that we are in an initializing formal parameter.
     //
     FieldFormalParameter parameter =
-        node.getAncestor((node) => node is FieldFormalParameter);
+        node.thisOrAncestorOfType<FieldFormalParameter>();
     if (parameter == null) {
       return;
     }
     ClassDeclaration targetClassNode =
-        parameter.getAncestor((node) => node is ClassDeclaration);
+        parameter.thisOrAncestorOfType<ClassDeclaration>();
     if (targetClassNode == null) {
       return;
     }
@@ -1740,7 +1670,7 @@
     //
     // Add proposal.
     //
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       DartType fieldType = parameter.type?.type;
       builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
@@ -1772,8 +1702,8 @@
             return;
           }
         } else {
-          ClassDeclaration enclosingClass =
-              node.getAncestor((node) => node is ClassDeclaration);
+          ClassOrMixinDeclaration enclosingClass =
+              node.thisOrAncestorOfType<ClassOrMixinDeclaration>();
           targetElement = enclosingClass?.declaredElement;
           argument = nameNode;
         }
@@ -1851,19 +1781,21 @@
       return;
     }
     utils.targetClassElement = targetClassElement;
-    // prepare target ClassDeclaration
-    AstNode targetTypeNode = getParsedClassElementNode(targetClassElement);
-    if (targetTypeNode is! ClassDeclaration) {
+    // prepare target ClassOrMixinDeclaration
+    var targetDeclarationResult =
+        await sessionHelper.getElementDeclaration(targetClassElement);
+    if (targetDeclarationResult.node is! ClassOrMixinDeclaration) {
       return;
     }
-    ClassDeclaration targetClassNode = targetTypeNode;
+    ClassOrMixinDeclaration targetNode = targetDeclarationResult.node;
     // prepare location
     ClassMemberLocation targetLocation =
-        _getUtilsFor(targetClassNode).prepareNewGetterLocation(targetClassNode);
+        CorrectionUtils(targetDeclarationResult.resolvedUnit)
+            .prepareNewGetterLocation(targetNode);
     // build method source
     Source targetSource = targetClassElement.source;
     String targetFile = targetSource.fullName;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
       builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
         Expression fieldTypeNode = climbPropertyAccess(nameNode);
@@ -1891,18 +1823,15 @@
       if (source != null) {
         String file = source.fullName;
         if (isAbsolute(file) && AnalysisEngine.isDartFileName(file)) {
-          String libName = _computeLibraryName(file);
-          try {
-            DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
-            await changeBuilder.addFileEdit(source.fullName,
-                (DartFileEditBuilder builder) {
-              builder.addSimpleInsertion(0, 'library $libName;$eol$eol');
-            });
-            _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FILE,
-                args: [source.shortName]);
-          } on AnalysisException {
-            // Ignore the exception and just don't create a fix.
-          }
+          var changeBuilder = _newDartChangeBuilder();
+          await changeBuilder.addFileEdit(source.fullName, (builder) {
+            builder.addSimpleInsertion(0, '// TODO Implement this library.');
+          });
+          _addFixFromBuilder(
+            changeBuilder,
+            DartFixKind.CREATE_FILE,
+            args: [source.shortName],
+          );
         }
       }
     }
@@ -1922,7 +1851,7 @@
       if (assignment.leftHandSide == node &&
           assignment.operator.type == TokenType.EQ &&
           assignment.parent is ExpressionStatement) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addSimpleInsertion(node.offset, 'var ');
         });
@@ -1932,7 +1861,7 @@
       }
     }
     // prepare target Statement
-    Statement target = node.getAncestor((x) => x is Statement);
+    Statement target = node.thisOrAncestorOfType<Statement>();
     if (target == null) {
       return;
     }
@@ -1947,7 +1876,7 @@
       return;
     }
     // build variable declaration source
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addInsertion(target.offset, (DartEditBuilder builder) {
         builder.writeLocalVariableDeclaration(name,
@@ -1989,7 +1918,7 @@
         utils.prepareNewClassMemberLocation(targetClass, (_) => true);
 
     String prefix = utils.getIndent(1);
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addInsertion(location.offset, (DartEditBuilder builder) {
         // Separator management.
@@ -2083,9 +2012,10 @@
     int offset = -1;
     String filePath;
     if (prefixElement == null) {
-      targetUnit = unitElement;
-      CompilationUnitMember enclosingMember = node.getAncestor((node) =>
-          node is CompilationUnitMember && node.parent is CompilationUnit);
+      targetUnit = unit.declaredElement;
+      CompilationUnitMember enclosingMember = node.thisOrAncestorMatching(
+          (node) =>
+              node is CompilationUnitMember && node.parent is CompilationUnit);
       if (enclosingMember == null) {
         return;
       }
@@ -2116,7 +2046,7 @@
     if (offset < 0) {
       return;
     }
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(filePath, (DartFileEditBuilder builder) {
       builder.addInsertion(offset, (DartEditBuilder builder) {
         builder.write(prefix);
@@ -2140,7 +2070,7 @@
     // prepare environment
     String prefix = utils.getIndent(1);
     int insertOffset = targetClass.end - 1;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addInsertion(insertOffset, (DartEditBuilder builder) {
         builder.selectHere();
@@ -2167,7 +2097,7 @@
       Source source = partDirective.uriSource;
       if (source != null) {
         String libName = unitLibraryElement.name;
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(source.fullName,
             (DartFileEditBuilder builder) {
           // TODO(brianwilkerson) Consider using the URI rather than name
@@ -2179,32 +2109,58 @@
     }
   }
 
+  Future<void> _addFix_extendClassForMixin() async {
+    ClassDeclaration declaration =
+        node.thisOrAncestorOfType<ClassDeclaration>();
+    if (declaration != null && declaration.extendsClause == null) {
+      String message = error.message;
+      int startIndex = message.indexOf("'", message.indexOf("'") + 1) + 1;
+      int endIndex = message.indexOf("'", startIndex);
+      String typeName = message.substring(startIndex, endIndex);
+      var changeBuilder = _newDartChangeBuilder();
+      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+        builder.addSimpleInsertion(
+            declaration.typeParameters?.end ?? declaration.name.end,
+            ' extends $typeName');
+      });
+      _addFixFromBuilder(changeBuilder, DartFixKind.EXTEND_CLASS_FOR_MIXIN,
+          args: [typeName]);
+    }
+  }
+
   Future<void> _addFix_illegalAsyncReturnType() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // prepare the existing type
-    TypeAnnotation typeName = node.getAncestor((n) => n is TypeAnnotation);
+    TypeAnnotation typeName = node.thisOrAncestorOfType<TypeAnnotation>();
     TypeProvider typeProvider = this.typeProvider;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.replaceTypeWithFuture(typeName, typeProvider);
     });
     _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_RETURN_TYPE_FUTURE);
   }
 
+  Future<void> _addFix_importAsync() async {
+    await _addFix_importLibrary(
+        DartFixKind.IMPORT_ASYNC, Uri.parse('dart:async'));
+  }
+
   Future<void> _addFix_importLibrary(FixKind kind, Uri library) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     String uriText;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       uriText = builder.importLibrary(library);
     });
     _addFixFromBuilder(changeBuilder, kind, args: [uriText]);
   }
 
-  Future<void> _addFix_importLibrary_withElement(String name,
-      List<ElementKind> elementKinds, TopLevelDeclarationKind kind2) async {
+  Future<void> _addFix_importLibrary_withElement(
+      String name,
+      List<ElementKind> elementKinds,
+      List<TopLevelDeclarationKind> kinds2) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // ignore if private
@@ -2230,7 +2186,7 @@
       // may be apply prefix
       PrefixElement prefix = imp.prefix;
       if (prefix != null) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addSimpleReplacement(
               range.startLength(node, 0), '${prefix.displayName}.');
@@ -2260,8 +2216,9 @@
         String newShowCode = 'show ${showNames.join(', ')}';
         int offset = showCombinator.offset;
         int length = showCombinator.end - offset;
-        String libraryFile = unitLibraryElement.source.fullName;
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        String libraryFile =
+            context.resolveResult.libraryElement.source.fullName;
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(libraryFile,
             (DartFileEditBuilder builder) {
           builder.addSimpleReplacement(
@@ -2273,11 +2230,10 @@
     }
     // Find new top-level declarations.
     {
-      List<TopLevelDeclarationInSource> declarations =
-          await getTopLevelDeclarations(name);
+      var declarations = await session.getTopLevelDeclarations(name);
       for (TopLevelDeclarationInSource declaration in declarations) {
         // Check the kind.
-        if (declaration.declaration.kind != kind2) {
+        if (!kinds2.contains(declaration.declaration.kind)) {
           continue;
         }
         // Check the source.
@@ -2315,8 +2271,13 @@
       MethodInvocation invocation = node.parent as MethodInvocation;
       if (invocation.realTarget == null && invocation.methodName == node) {
         String name = (node as SimpleIdentifier).name;
-        await _addFix_importLibrary_withElement(name,
-            const [ElementKind.FUNCTION], TopLevelDeclarationKind.function);
+        await _addFix_importLibrary_withElement(name, const [
+          ElementKind.FUNCTION,
+          ElementKind.TOP_LEVEL_VARIABLE
+        ], const [
+          TopLevelDeclarationKind.function,
+          TopLevelDeclarationKind.variable
+        ]);
       }
     }
   }
@@ -2329,7 +2290,7 @@
       await _addFix_importLibrary_withElement(
           name,
           const [ElementKind.TOP_LEVEL_VARIABLE],
-          TopLevelDeclarationKind.variable);
+          const [TopLevelDeclarationKind.variable]);
     }
   }
 
@@ -2341,11 +2302,11 @@
       await _addFix_importLibrary_withElement(
           typeName,
           const [ElementKind.CLASS, ElementKind.FUNCTION_TYPE_ALIAS],
-          TopLevelDeclarationKind.type);
+          const [TopLevelDeclarationKind.type]);
     } else if (_mayBeImplicitConstructor(node)) {
       String typeName = (node as SimpleIdentifier).name;
-      await _addFix_importLibrary_withElement(
-          typeName, const [ElementKind.CLASS], TopLevelDeclarationKind.type);
+      await _addFix_importLibrary_withElement(typeName,
+          const [ElementKind.CLASS], const [TopLevelDeclarationKind.type]);
     }
   }
 
@@ -2357,7 +2318,7 @@
         return;
       }
       int insertOffset = error.offset + error.length;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleInsertion(insertOffset, ';');
       });
@@ -2385,7 +2346,7 @@
     } else {
       return;
     }
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(range.token(negation));
       builder.addSimpleReplacement(range.node(identifier), 'isNotEmpty');
@@ -2398,7 +2359,7 @@
     await null;
     if (coveredNode is IsExpression) {
       IsExpression isExpression = coveredNode as IsExpression;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder
             .addReplacement(range.endEnd(isExpression.expression, isExpression),
@@ -2415,7 +2376,7 @@
     await null;
     if (coveredNode is IsExpression) {
       IsExpression isExpression = coveredNode as IsExpression;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder
             .addReplacement(range.endEnd(isExpression.expression, isExpression),
@@ -2431,12 +2392,12 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     ClassDeclaration enclosingClass =
-        node.getAncestor((node) => node is ClassDeclaration);
+        node.thisOrAncestorOfType<ClassDeclaration>();
     if (enclosingClass == null) {
       return;
     }
     String className = enclosingClass.name.name;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleInsertion(
           enclosingClass.classKeyword.offset, 'abstract ');
@@ -2457,9 +2418,9 @@
           !getter.variable.isSynthetic &&
           getter.variable.setter == null &&
           getter.enclosingElement is ClassElement) {
-        AstNode name =
-            await astProvider.getParsedNameForElement(getter.variable);
-        AstNode variable = name?.parent;
+        var declarationResult =
+            await sessionHelper.getElementDeclaration(getter.variable);
+        AstNode variable = declarationResult.node;
         if (variable is VariableDeclaration &&
             variable.parent is VariableDeclarationList &&
             variable.parent.parent is FieldDeclaration) {
@@ -2467,7 +2428,7 @@
           Token keywordToken = declarationList.keyword;
           if (declarationList.variables.length == 1 &&
               keywordToken.keyword == Keyword.FINAL) {
-            DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+            var changeBuilder = _newDartChangeBuilder();
             await changeBuilder.addFileEdit(file,
                 (DartFileEditBuilder builder) {
               if (declarationList.type != null) {
@@ -2498,7 +2459,7 @@
       VariableDeclaration declaration = node.parent;
       VariableDeclarationList list = declaration.parent;
       if (list.variables.length == 1) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           if (list.keyword == null) {
             builder.addSimpleInsertion(list.offset, 'final ');
@@ -2526,7 +2487,7 @@
       if (element is ClassElement &&
           element.typeParameters != null &&
           element.typeParameters.length == typeArguments.arguments.length) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           String argumentText = utils.getNodeText(typeArguments);
           builder.addSimpleInsertion(typeName.end, argumentText);
@@ -2541,7 +2502,7 @@
   Future<void> _addFix_nonBoolCondition_addNotNull() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleInsertion(error.offset + error.length, ' != null');
     });
@@ -2554,7 +2515,7 @@
     final awaitExpression = node;
     if (awaitExpression is AwaitExpression) {
       final awaitToken = awaitExpression.awaitKeyword;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(range.startStart(awaitToken, awaitToken.next));
       });
@@ -2570,7 +2531,7 @@
       AstNode parent = coveredNode.parent;
       if (parent is BinaryExpression) {
         if (parent.rightOperand == coveredNode) {
-          DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+          var changeBuilder = _newDartChangeBuilder();
           await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
             builder.addDeletion(range.endEnd(parent.leftOperand, coveredNode));
           });
@@ -2580,6 +2541,7 @@
     } else if (coveringNode is Block) {
       Block block = coveringNode;
       List<Statement> statementsToRemove = <Statement>[];
+      var errorRange = SourceRange(errorOffset, errorLength);
       for (Statement statement in block.statements) {
         if (range.node(statement).intersects(errorRange)) {
           statementsToRemove.add(statement);
@@ -2588,7 +2550,7 @@
       if (statementsToRemove.isNotEmpty) {
         SourceRange rangeToRemove =
             utils.getLinesRangeStatements(statementsToRemove);
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addDeletion(rangeToRemove);
         });
@@ -2597,7 +2559,7 @@
     } else if (coveringNode is Statement) {
       SourceRange rangeToRemove =
           utils.getLinesRangeStatements(<Statement>[coveringNode]);
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(rangeToRemove);
       });
@@ -2608,7 +2570,7 @@
   Future<void> _addFix_removeEmptyCatch() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(utils.getLinesRange(range.node(node.parent)));
     });
@@ -2618,7 +2580,7 @@
   Future<void> _addFix_removeEmptyConstructorBody() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(
           utils.getLinesRange(range.node(node.parent)), ';');
@@ -2631,7 +2593,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     IfStatement ifStatement = node.parent;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(utils.getLinesRange(
           range.startEnd(ifStatement.elseKeyword, ifStatement.elseStatement)));
@@ -2644,13 +2606,13 @@
     await null;
     EmptyStatement emptyStatement = node;
     if (emptyStatement.parent is Block) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(utils.getLinesRange(range.node(emptyStatement)));
       });
       _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_EMPTY_STATEMENT);
     } else {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         Token previous = emptyStatement.findPrevious(emptyStatement.beginToken);
         if (previous != null) {
@@ -2667,11 +2629,11 @@
     await null;
     // Retrieve the linted node.
     VariableDeclaration ancestor =
-        node.getAncestor((a) => a is VariableDeclaration);
+        node.thisOrAncestorOfType<VariableDeclaration>();
     if (ancestor == null) {
       return;
     }
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(range.endEnd(ancestor.name, ancestor.initializer));
     });
@@ -2685,14 +2647,14 @@
     if (node is InterpolationExpression) {
       Token right = node.rightBracket;
       if (node.expression != null && right != null) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addSimpleReplacement(
               range.startStart(node, node.expression), r'$');
           builder.addDeletion(range.token(right));
         });
         _addFixFromBuilder(
-            changeBuilder, DartFixKind.LINT_REMOVE_INTERPOLATION_BRACES);
+            changeBuilder, DartFixKind.REMOVE_INTERPOLATION_BRACES);
       } else {}
     }
   }
@@ -2701,9 +2663,9 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     MethodDeclaration declaration =
-        node.getAncestor((node) => node is MethodDeclaration);
+        node.thisOrAncestorOfType<MethodDeclaration>();
     if (declaration != null) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(utils.getLinesRange(range.node(declaration)));
       });
@@ -2720,7 +2682,7 @@
       SimpleIdentifier name = method.name;
       FunctionBody body = method.body;
       if (name != null && body != null) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addSimpleReplacement(range.endStart(name, body), ' ');
         });
@@ -2729,7 +2691,7 @@
       }
     } else if (node is FormalParameterList) {
       // Support for the fasta error.
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(range.node(node));
       });
@@ -2744,7 +2706,7 @@
     if (node is SimpleIdentifier && node.parent is MethodInvocation) {
       MethodInvocation invocation = node.parent as MethodInvocation;
       if (invocation.methodName == node && invocation.target != null) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addDeletion(range.endEnd(node, invocation));
         });
@@ -2759,16 +2721,16 @@
     await null;
     final thisExpression = node is ThisExpression
         ? node
-        : node.getAncestor((node) => node is ThisExpression);
+        : node.thisOrAncestorOfType<ThisExpression>();
     final parent = thisExpression?.parent;
     if (parent is PropertyAccess) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(range.startEnd(parent, parent.operator));
       });
       _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_THIS_EXPRESSION);
     } else if (parent is MethodInvocation) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(range.startEnd(parent, parent.operator));
       });
@@ -2779,21 +2741,20 @@
   Future<void> _addFix_removeTypeAnnotation() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    final TypeAnnotation type =
-        node.getAncestor((node) => node is TypeAnnotation);
+    final TypeAnnotation type = node.thisOrAncestorOfType<TypeAnnotation>();
     if (type != null) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(range.startStart(type, type.endToken.next));
       });
-      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_TYPE_NAME);
+      _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_TYPE_ANNOTATION);
     }
   }
 
   Future<void> _addFix_removeTypeArguments() async {
     if (coveredNode is TypeArgumentList) {
       TypeArgumentList typeArguments = coveredNode;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addDeletion(range.node(typeArguments));
       });
@@ -2811,7 +2772,7 @@
     Expression expression = asExpression.expression;
     int expressionPrecedence = getExpressionPrecedence(expression);
     // remove 'as T' from 'e as T'
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(range.endEnd(expression, asExpression));
       _removeEnclosingParentheses(builder, asExpression, expressionPrecedence);
@@ -2826,7 +2787,7 @@
       AstNode catchClause = node.parent;
       if (catchClause is CatchClause &&
           catchClause.exceptionParameter == node) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addDeletion(
               range.startStart(catchClause.catchKeyword, catchClause.body));
@@ -2845,7 +2806,7 @@
       if (catchClause is CatchClause &&
           catchClause.stackTraceParameter == node &&
           catchClause.exceptionParameter != null) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder
               .addDeletion(range.endEnd(catchClause.exceptionParameter, node));
@@ -2861,12 +2822,12 @@
     await null;
     // prepare ImportDirective
     ImportDirective importDirective =
-        node.getAncestor((node) => node is ImportDirective);
+        node.thisOrAncestorOfType<ImportDirective>();
     if (importDirective == null) {
       return;
     }
     // remove the whole line with import
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addDeletion(utils.getLinesRange(range.node(importDirective)));
     });
@@ -2892,11 +2853,11 @@
     List<SimpleIdentifier> references;
     Element element = identifier.staticElement;
     if (element is LocalVariableElement) {
-      AstNode root = node.getAncestor((node) => node is Block);
+      AstNode root = node.thisOrAncestorOfType<Block>();
       references = findLocalElementReferences(root, element);
     } else if (element is ParameterElement) {
       if (!element.isNamed) {
-        AstNode root = node.getAncestor((node) =>
+        AstNode root = node.thisOrAncestorMatching((node) =>
             node.parent is ClassOrMixinDeclaration ||
             node.parent is CompilationUnit);
         references = findLocalElementReferences(root, element);
@@ -2907,7 +2868,7 @@
     }
 
     // Compute the change.
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       for (var reference in references) {
         builder.addSimpleReplacement(range.node(reference), newName);
@@ -2921,7 +2882,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     if (node is VariableDeclarationList) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleReplacement(
             range.token((node as VariableDeclarationList).keyword), 'const');
@@ -2933,7 +2894,7 @@
   Future<void> _addFix_replaceVarWithDynamic() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addSimpleReplacement(range.error(error), 'dynamic');
     });
@@ -2943,9 +2904,8 @@
   Future<void> _addFix_replaceWithConditionalAssignment() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    IfStatement ifStatement = node is IfStatement
-        ? node
-        : node.getAncestor((node) => node is IfStatement);
+    IfStatement ifStatement =
+        node is IfStatement ? node : node.thisOrAncestorOfType<IfStatement>();
     if (ifStatement == null) {
       return;
     }
@@ -2961,7 +2921,7 @@
     if (thenStatement is ExpressionStatement) {
       final expression = thenStatement.expression.unParenthesized;
       if (expression is AssignmentExpression) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addReplacement(range.node(ifStatement),
               (DartEditBuilder builder) {
@@ -2982,7 +2942,7 @@
     await null;
     if (coveredNode is InstanceCreationExpression) {
       var instanceCreation = coveredNode as InstanceCreationExpression;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         if (instanceCreation.keyword == null) {
           builder.addSimpleInsertion(
@@ -3000,9 +2960,9 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     final FunctionTypedFormalParameter functionTyped =
-        node.getAncestor((node) => node is FunctionTypedFormalParameter);
+        node.thisOrAncestorOfType<FunctionTypedFormalParameter>();
     if (functionTyped != null) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addSimpleReplacement(range.node(functionTyped),
             utils.getNodeText(functionTyped.identifier));
@@ -3017,10 +2977,10 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     final InstanceCreationExpression instanceCreation =
-        node.getAncestor((node) => node is InstanceCreationExpression);
+        node.thisOrAncestorOfType<InstanceCreationExpression>();
     final InterfaceType type = instanceCreation.staticType;
     final generics = instanceCreation.constructorName.type.typeArguments;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addReplacement(range.node(instanceCreation),
           (DartEditBuilder builder) {
@@ -3041,14 +3001,14 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     FunctionExpression ancestor =
-        node.getAncestor((a) => a is FunctionExpression);
+        node.thisOrAncestorOfType<FunctionExpression>();
     if (ancestor == null) {
       return;
     }
     Future<void> addFixOfExpression(InvocationExpression expression) async {
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         builder.addReplacement(range.node(ancestor), (DartEditBuilder builder) {
           if (expression is MethodInvocation && expression.target != null) {
@@ -3117,7 +3077,7 @@
       if (finder._element != null) {
         String closestName = finder._element.name;
         if (closestName != null) {
-          DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+          var changeBuilder = _newDartChangeBuilder();
           await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
             builder.addSimpleReplacement(range.node(node), closestName);
           });
@@ -3168,8 +3128,7 @@
           new _ClosestElementFinder(name, predicate, MAX_LEVENSHTEIN_DISTANCE);
       // unqualified invocation
       if (target == null) {
-        ClassDeclaration clazz =
-            node.getAncestor((node) => node is ClassDeclaration);
+        ClassDeclaration clazz = node.thisOrAncestorOfType<ClassDeclaration>();
         if (clazz != null) {
           ClassElement classElement = clazz.declaredElement;
           _updateFinderWithClassMembers(finder, classElement);
@@ -3184,7 +3143,7 @@
       // if we have close enough element, suggest to use it
       if (finder._element != null) {
         String closestName = finder._element.name;
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addSimpleReplacement(range.node(node), closestName);
         });
@@ -3213,12 +3172,12 @@
     int insertOffset;
     String sourcePrefix;
     AstNode enclosingMember =
-        node.getAncestor((node) => node is CompilationUnitMember);
+        node.thisOrAncestorOfType<CompilationUnitMember>();
     insertOffset = enclosingMember.end;
     sourcePrefix = '$eol$eol';
     utils.targetClassElement = null;
     // build method source
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       builder.addInsertion(insertOffset, (DartEditBuilder builder) {
         builder.write(sourcePrefix);
@@ -3281,7 +3240,7 @@
       // If we have a close enough element, suggest to use it.
       if (finder._element != null) {
         String closestName = finder._element.name;
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addSimpleReplacement(range.node(node), closestName);
         });
@@ -3301,12 +3260,12 @@
       Element targetElement;
       bool staticModifier = false;
 
-      ClassDeclaration targetClassNode;
+      ClassOrMixinDeclaration targetClassNode;
       Expression target = invocation.realTarget;
+      CorrectionUtils utils = this.utils;
       if (target == null) {
-        targetElement = unitElement;
-        ClassMember enclosingMember =
-            node.getAncestor((node) => node is ClassMember);
+        targetElement = unit.declaredElement;
+        ClassMember enclosingMember = node.thisOrAncestorOfType<ClassMember>();
         if (enclosingMember == null) {
           // If the undefined identifier isn't inside a class member, then it
           // doesn't make sense to create a method.
@@ -3327,11 +3286,10 @@
         }
         targetElement = targetClassElement;
         // prepare target ClassDeclaration
-        AstNode targetTypeNode = getParsedClassElementNode(targetClassElement);
-        if (targetTypeNode is! ClassDeclaration) {
+        targetClassNode = await _getClassDeclaration(targetClassElement);
+        if (targetClassNode == null) {
           return;
         }
-        targetClassNode = targetTypeNode;
         // maybe static
         if (target is Identifier) {
           staticModifier =
@@ -3339,16 +3297,15 @@
                   ElementKind.CLASS;
         }
         // use different utils
-        CompilationUnitElement targetUnitElement =
-            getCompilationUnitElement(targetClassElement);
-        CompilationUnit targetUnit = getParsedUnit(targetUnitElement);
-        utils = new CorrectionUtils(targetUnit);
+        var targetPath = targetClassElement.source.fullName;
+        var targetResolveResult = await session.getResolvedUnit(targetPath);
+        utils = CorrectionUtils(targetResolveResult);
       }
       ClassMemberLocation targetLocation =
           utils.prepareNewMethodLocation(targetClassNode);
       String targetFile = targetElement.source.fullName;
       // build method source
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(targetFile,
           (DartFileEditBuilder builder) {
         builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) {
@@ -3392,22 +3349,6 @@
     }
   }
 
-  Future<void> _addFix_undefinedMethodWithContructor() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    if (node is SimpleIdentifier && node.parent is MethodInvocation) {
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
-      await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
-        builder.addSimpleInsertion(node.parent.offset, 'new ');
-      });
-      _addFixFromBuilder(
-          changeBuilder, DartFixKind.INVOKE_CONSTRUCTOR_USING_NEW);
-      // TODO(brianwilkerson) Figure out whether the constructor is a `const`
-      // constructor and all of the parameters are constant expressions, and
-      // suggest inserting 'const ' if so.
-    }
-  }
-
   /**
    * Here we handle cases when a constructors does not initialize all of the
    * final fields.
@@ -3438,7 +3379,7 @@
     if (flutter.isExactlyStatelessWidgetType(superType) ||
         flutter.isExactlyStatefulWidgetType(superType)) {
       if (parameters.isNotEmpty && parameters.last.isNamed) {
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           builder.addSimpleInsertion(
               parameters.last.end, ', $fieldParametersCode');
@@ -3457,7 +3398,7 @@
       }
     }
 
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
       // append new field formal initializers
       if (lastRequiredParameter != null) {
@@ -3474,6 +3415,52 @@
     _addFixFromBuilder(changeBuilder, DartFixKind.ADD_FIELD_FORMAL_PARAMETERS);
   }
 
+  Future<void> _addFix_updateSdkConstraints() async {
+    Context context = resourceProvider.pathContext;
+    File pubspecFile = null;
+    Folder folder = resourceProvider.getFolder(context.dirname(file));
+    while (folder != null) {
+      pubspecFile = folder.getChildAssumingFile('pubspec.yaml');
+      if (pubspecFile.exists) {
+        break;
+      }
+      pubspecFile = null;
+      folder = folder.parent;
+    }
+    if (pubspecFile == null) {
+      return;
+    }
+    SdkConstraintExtractor extractor = new SdkConstraintExtractor(pubspecFile);
+    String text = extractor.constraintText();
+    int offset = extractor.constraintOffset();
+    int length = text.length;
+    if (text == null || offset < 0) {
+      return;
+    }
+    String newText;
+    int spaceOffset = text.indexOf(' ');
+    if (spaceOffset >= 0) {
+      length = spaceOffset;
+    }
+    if (text == 'any') {
+      newText = '^2.1.0';
+    } else if (text.startsWith('^')) {
+      newText = '^2.1.0';
+    } else if (text.startsWith('>=')) {
+      newText = '>=2.1.0';
+    } else if (text.startsWith('>')) {
+      newText = '>=2.1.0';
+    }
+    if (newText == null) {
+      return;
+    }
+    var changeBuilder = new ChangeBuilder();
+    await changeBuilder.addFileEdit(pubspecFile.path, (builder) {
+      builder.addSimpleReplacement(new SourceRange(offset, length), newText);
+    });
+    _addFixFromBuilder(changeBuilder, DartFixKind.UPDATE_SDK_CONSTRAINTS);
+  }
+
   Future<void> _addFix_useEffectiveIntegerDivision() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -3482,7 +3469,7 @@
           n.offset == errorOffset &&
           n.length == errorLength) {
         Expression target = (n as MethodInvocation).target.unParenthesized;
-        DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+        var changeBuilder = _newDartChangeBuilder();
         await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
           // replace "/" with "~/"
           BinaryExpression binary = target as BinaryExpression;
@@ -3509,7 +3496,7 @@
     Element declaringElement = element.enclosingElement;
     if (declaringElement is ClassElement) {
       DartType declaringType = declaringElement.type;
-      DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+      var changeBuilder = _newDartChangeBuilder();
       await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
         // replace "target" with class name
         builder.addReplacement(range.node(target), (DartEditBuilder builder) {
@@ -3547,7 +3534,7 @@
     }
   }
 
-  void _addFixFromBuilder(DartChangeBuilder builder, FixKind kind,
+  void _addFixFromBuilder(ChangeBuilder builder, FixKind kind,
       {List args: null, bool importsOnly: false}) {
     SourceChange change = builder.sourceChange;
     if (change.edits.isEmpty && !importsOnly) {
@@ -3564,7 +3551,7 @@
   Future<DartChangeBuilder> _addProposal_createFunction(
       FunctionType functionType,
       String name,
-      Source targetSource,
+      String targetFile,
       int insertOffset,
       bool isStatic,
       String prefix,
@@ -3574,8 +3561,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // build method source
-    String targetFile = targetSource.fullName;
-    DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
+    var changeBuilder = _newDartChangeBuilder();
     await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) {
       builder.addInsertion(insertOffset, (DartEditBuilder builder) {
         builder.write(sourcePrefix);
@@ -3622,7 +3608,7 @@
         builder.write(' {$eol$prefix}');
         builder.write(sourceSuffix);
       });
-      if (targetSource == unitSource) {
+      if (targetFile == file) {
         builder.addLinkedPosition(range.node(node), 'NAME');
       }
     });
@@ -3647,13 +3633,13 @@
     DartChangeBuilder changeBuilder = await _addProposal_createFunction(
         functionType,
         name,
-        unitSource,
+        file,
         insertOffset,
         false,
         prefix,
         sourcePrefix,
         sourceSuffix,
-        unitElement);
+        unit.declaredElement);
     _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FUNCTION,
         args: [name]);
   }
@@ -3670,13 +3656,15 @@
     // prepare environment
     Source targetSource = targetClassElement.source;
     // prepare insert offset
-    ClassDeclaration targetClassNode =
-        getParsedClassElementNode(targetClassElement);
-    int insertOffset = targetClassNode.end - 1;
+    var targetNode = await _getClassDeclaration(targetClassElement);
+    if (targetNode == null) {
+      return;
+    }
+    int insertOffset = targetNode.end - 1;
     // prepare prefix
     String prefix = '  ';
     String sourcePrefix;
-    if (targetClassNode.members.isEmpty) {
+    if (targetNode.members.isEmpty) {
       sourcePrefix = '';
     } else {
       sourcePrefix = eol;
@@ -3685,7 +3673,7 @@
     DartChangeBuilder changeBuilder = await _addProposal_createFunction(
         functionType,
         name,
-        targetSource,
+        targetSource.fullName,
         insertOffset,
         _inStaticContext(),
         prefix,
@@ -3696,48 +3684,15 @@
   }
 
   /**
-   * Computes the name of the library at the given [path].
-   * See https://www.dartlang.org/articles/style-guide/#names for conventions.
+   * Returns the [ClassOrMixinDeclaration] for the given [element].
    */
-  String _computeLibraryName(String path) {
-    Context pathContext = resourceProvider.pathContext;
-    String packageFolder = _computePackageFolder(path);
-    if (packageFolder == null) {
-      return pathContext.basenameWithoutExtension(path);
+  Future<ClassOrMixinDeclaration> _getClassDeclaration(
+      ClassElement element) async {
+    var result = await sessionHelper.getElementDeclaration(element);
+    if (result.node is ClassOrMixinDeclaration) {
+      return result.node;
     }
-    String packageName = pathContext.basename(packageFolder);
-    String relPath = pathContext.relative(path, from: packageFolder);
-    List<String> relPathParts = pathContext.split(relPath);
-    if (relPathParts.isNotEmpty) {
-      if (relPathParts[0].toLowerCase() == 'lib') {
-        relPathParts.removeAt(0);
-      }
-      if (relPathParts.isNotEmpty) {
-        String nameWithoutExt = pathContext.withoutExtension(relPathParts.last);
-        relPathParts[relPathParts.length - 1] = nameWithoutExt;
-      }
-    }
-    return packageName + '.' + relPathParts.join('.');
-  }
-
-  /**
-   * Returns the path of the folder which contains the given [path].
-   */
-  String _computePackageFolder(String path) {
-    Context pathContext = resourceProvider.pathContext;
-    String pubspecFolder = dirname(path);
-    while (true) {
-      if (resourceProvider
-          .getResource(pathContext.join(pubspecFolder, 'pubspec.yaml'))
-          .exists) {
-        return pubspecFolder;
-      }
-      String pubspecFolderNew = pathContext.dirname(pubspecFolder);
-      if (pubspecFolderNew == pubspecFolder) {
-        return null;
-      }
-      pubspecFolder = pubspecFolderNew;
-    }
+    return null;
   }
 
   /**
@@ -3774,26 +3729,6 @@
   }
 
   /**
-   * Return the correction utilities that should be used when creating an edit
-   * in the compilation unit containing the given [node].
-   */
-  CorrectionUtils _getUtilsFor(AstNode node) {
-    CompilationUnit targetUnit =
-        node.getAncestor((node) => node is CompilationUnit);
-    CompilationUnitElement targetUnitElement = targetUnit?.declaredElement;
-    CorrectionUtils realUtils = utils;
-    if (targetUnitElement != utils.unit.declaredElement) {
-      realUtils = new CorrectionUtils(targetUnit);
-      ClassDeclaration targetClass =
-          node.getAncestor((node) => node is ClassDeclaration);
-      if (targetClass != null) {
-        realUtils.targetClassElement = targetClass.declaredElement;
-      }
-    }
-    return realUtils;
-  }
-
-  /**
    * Returns an expected [DartType] of [expression], may be `null` if cannot be
    * inferred.
    */
@@ -3924,17 +3859,15 @@
    */
   bool _inStaticContext() {
     // constructor initializer cannot reference "this"
-    if (node.getAncestor((node) => node is ConstructorInitializer) != null) {
+    if (node.thisOrAncestorOfType<ConstructorInitializer>() != null) {
       return true;
     }
     // field initializer cannot reference "this"
-    if (node.getAncestor((node) => node is FieldDeclaration) != null) {
+    if (node.thisOrAncestorOfType<FieldDeclaration>() != null) {
       return true;
     }
     // static method
-    MethodDeclaration method = node.getAncestor((node) {
-      return node is MethodDeclaration;
-    });
+    MethodDeclaration method = node.thisOrAncestorOfType<MethodDeclaration>();
     return method != null && method.isStatic;
   }
 
@@ -3999,24 +3932,24 @@
   }
 
   /**
-   * Return `true` if the [source] can be imported into [unitLibraryFile].
+   * Return `true` if the [source] can be imported into current library.
    */
   bool _isSourceVisibleToLibrary(Source source) {
     String path = source.fullName;
 
-    ContextRoot contextRoot = driver.contextRoot;
+    var contextRoot = context.resolveResult.session.analysisContext.contextRoot;
     if (contextRoot == null) {
       return true;
     }
 
     // We don't want to use private libraries of other packages.
     if (source.uri.isScheme('package') && _isLibSrcPath(path)) {
-      return resourceProvider.pathContext.isWithin(contextRoot.root, path);
+      return contextRoot.root.contains(path);
     }
 
     // We cannot use relative URIs to reference files outside of our package.
     if (source.uri.isScheme('file')) {
-      return resourceProvider.pathContext.isWithin(contextRoot.root, path);
+      return contextRoot.root.contains(path);
     }
 
     return true;
@@ -4039,6 +3972,10 @@
     return false;
   }
 
+  DartChangeBuilder _newDartChangeBuilder() {
+    return new DartChangeBuilderImpl.forWorkspace(context.workspace);
+  }
+
   /**
    * Removes any [ParenthesizedExpression] enclosing [expr].
    *
@@ -4181,14 +4118,15 @@
  * [ExecutableElement], its parameters, and operations on them.
  */
 class _ExecutableParameters {
-  final AstProvider astProvider;
+  final AnalysisSessionHelper sessionHelper;
   final ExecutableElement executable;
 
   final List<ParameterElement> required = [];
   final List<ParameterElement> optionalPositional = [];
   final List<ParameterElement> named = [];
 
-  factory _ExecutableParameters(AstProvider astProvider, AstNode invocation) {
+  factory _ExecutableParameters(
+      AnalysisSessionHelper sessionHelper, AstNode invocation) {
     Element element;
     if (invocation is InstanceCreationExpression) {
       element = invocation.staticElement;
@@ -4196,14 +4134,14 @@
     if (invocation is MethodInvocation) {
       element = invocation.methodName.staticElement;
     }
-    if (element is ExecutableElement) {
-      return new _ExecutableParameters._(astProvider, element);
+    if (element is ExecutableElement && !element.isSynthetic) {
+      return new _ExecutableParameters._(sessionHelper, element);
     } else {
       return null;
     }
   }
 
-  _ExecutableParameters._(this.astProvider, this.executable) {
+  _ExecutableParameters._(this.sessionHelper, this.executable) {
     for (var parameter in executable.parameters) {
       if (parameter.isNotOptional) {
         required.add(parameter);
@@ -4222,10 +4160,8 @@
    * be found.
    */
   Future<FormalParameterList> getParameterList() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    var name = await astProvider.getParsedNameForElement(executable);
-    AstNode targetDeclaration = name?.parent;
+    var result = await sessionHelper.getElementDeclaration(executable);
+    var targetDeclaration = result.node;
     if (targetDeclaration is ConstructorDeclaration) {
       return targetDeclaration.parameters;
     } else if (targetDeclaration is FunctionDeclaration) {
@@ -4242,10 +4178,9 @@
    * or `null` is cannot be found.
    */
   Future<FormalParameter> getParameterNode(ParameterElement element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    var name = await astProvider.getParsedNameForElement(element);
-    for (AstNode node = name; node != null; node = node.parent) {
+    var result = await sessionHelper.getElementDeclaration(element);
+    var declaration = result.node;
+    for (AstNode node = declaration; node != null; node = node.parent) {
       if (node is FormalParameter && node.parent is FormalParameterList) {
         return node;
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/levenshtein.dart b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
index 61cb493..13e16c2 100644
--- a/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
+++ b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
index 46fa120..e8da43f 100644
--- a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,7 +8,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
 
-List<String> _KNOWN_METHOD_NAME_PREFIXES = ['get', 'is', 'to'];
+final List<String> _KNOWN_METHOD_NAME_PREFIXES = ['get', 'is', 'to'];
 
 /**
  * Returns all variants of names by removing leading words one by one.
@@ -37,7 +37,7 @@
   if (isMethod) {
     // If we're in a build() method, use 'build' as the name prefix.
     MethodDeclaration method =
-        assignedExpression.getAncestor((n) => n is MethodDeclaration);
+        assignedExpression.thisOrAncestorOfType<MethodDeclaration>();
     if (method != null) {
       String enclosingName = method.name?.name;
       if (enclosingName != null && enclosingName.startsWith('build')) {
diff --git a/pkg/analysis_server/lib/src/services/correction/namespace.dart b/pkg/analysis_server/lib/src/services/correction/namespace.dart
index 1419922..a3bdd84 100644
--- a/pkg/analysis_server/lib/src/services/correction/namespace.dart
+++ b/pkg/analysis_server/lib/src/services/correction/namespace.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -18,15 +18,6 @@
 }
 
 /**
- * Returns the namespace of the given [ExportElement].
- */
-Map<String, Element> getExportNamespaceForDirective(ExportElement exp) {
-  Namespace namespace =
-      new NamespaceBuilder().createExportNamespaceForDirective(exp);
-  return namespace.definedNames;
-}
-
-/**
  * Returns the export namespace of the given [LibraryElement].
  */
 Map<String, Element> getExportNamespaceForLibrary(LibraryElement library) {
@@ -45,8 +36,7 @@
   if (parent is ImportDirective) {
     return parent.element;
   }
-  ImportElementInfo info = internal_getImportElementInfo(prefixNode);
-  return info?.element;
+  return internal_getImportElementInfo(prefixNode);
 }
 
 /**
@@ -130,15 +120,13 @@
 }
 
 /**
- * Returns the [ImportElementInfo] with the [ImportElement] that is referenced
- * by [prefixNode] with a [PrefixElement], maybe `null`.
+ * Returns the [ImportElement] that is referenced by [prefixNode] with a
+ * [PrefixElement], maybe `null`.
  */
-ImportElementInfo internal_getImportElementInfo(SimpleIdentifier prefixNode) {
-  ImportElementInfo info = new ImportElementInfo();
+ImportElement internal_getImportElementInfo(SimpleIdentifier prefixNode) {
   // prepare environment
   AstNode parent = prefixNode.parent;
-  CompilationUnit unit =
-      prefixNode.getAncestor((node) => node is CompilationUnit);
+  CompilationUnit unit = prefixNode.thisOrAncestorOfType<CompilationUnit>();
   LibraryElement libraryElement =
       resolutionMap.elementDeclaredByCompilationUnit(unit).library;
   // prepare used element
@@ -147,14 +135,12 @@
     PrefixedIdentifier prefixed = parent;
     if (prefixed.prefix == prefixNode) {
       usedElement = prefixed.staticElement;
-      info.periodEnd = prefixed.period.end;
     }
   }
   if (parent is MethodInvocation) {
     MethodInvocation invocation = parent;
     if (invocation.target == prefixNode) {
       usedElement = invocation.methodName.staticElement;
-      info.periodEnd = invocation.operator.end;
     }
   }
   // we need used Element
@@ -164,12 +150,8 @@
   // find ImportElement
   String prefix = prefixNode.name;
   Map<ImportElement, Set<Element>> importElementsMap = {};
-  info.element = internal_getImportElement(
+  return internal_getImportElement(
       libraryElement, prefix, usedElement, importElementsMap);
-  if (info.element == null) {
-    return null;
-  }
-  return info;
 }
 
 /**
@@ -178,5 +160,4 @@
  */
 class ImportElementInfo {
   ImportElement element;
-  int periodEnd;
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
index 79e14d0..14e218e 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
index 9b026bd..3b9b505 100644
--- a/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,7 +10,7 @@
 /**
  * A visitor for visiting [AstNode]s covered by a selection [SourceRange].
  */
-class SelectionAnalyzer extends GeneralizingAstVisitor<Object> {
+class SelectionAnalyzer extends GeneralizingAstVisitor<void> {
   final SourceRange selection;
 
   AstNode _coveringNode;
@@ -57,19 +57,6 @@
   }
 
   /**
-   * Returns the [SourceRange] which covers selected [AstNode]s, may be `null`
-   * if there are no [AstNode]s under the selection.
-   */
-  SourceRange get selectedNodeRange {
-    if (_selectedNodes == null || _selectedNodes.isEmpty) {
-      return null;
-    }
-    AstNode firstNode = _selectedNodes[0];
-    AstNode lastNode = _selectedNodes[_selectedNodes.length - 1];
-    return range.startEnd(firstNode, lastNode);
-  }
-
-  /**
    * Return the [AstNode]s fully covered by the selection [SourceRange].
    */
   List<AstNode> get selectedNodes {
@@ -114,7 +101,7 @@
   }
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     SourceRange nodeRange = range.node(node);
     if (selection.covers(nodeRange)) {
       if (isFirstNode) {
@@ -122,21 +109,20 @@
       } else {
         handleNextSelectedNode(node);
       }
-      return null;
+      return;
     } else if (selection.coveredBy(nodeRange)) {
       _coveringNode = node;
       node.visitChildren(this);
-      return null;
+      return;
     } else if (selection.startsIn(nodeRange)) {
       handleSelectionStartsIn(node);
       node.visitChildren(this);
-      return null;
+      return;
     } else if (selection.endsIn(nodeRange)) {
       handleSelectionEndsIn(node);
       node.visitChildren(this);
-      return null;
+      return;
     }
     // no intersection
-    return null;
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/sort_members.dart b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
index 1bd8aef8..a4bc4a8 100644
--- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart
+++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -20,6 +20,8 @@
     new _PriorityItem(false, _MemberKind.UNIT_ACCESSOR, true),
     new _PriorityItem(false, _MemberKind.UNIT_FUNCTION, false),
     new _PriorityItem(false, _MemberKind.UNIT_FUNCTION, true),
+    new _PriorityItem(false, _MemberKind.UNIT_GENERIC_TYPE_ALIAS, false),
+    new _PriorityItem(false, _MemberKind.UNIT_GENERIC_TYPE_ALIAS, true),
     new _PriorityItem(false, _MemberKind.UNIT_FUNCTION_TYPE, false),
     new _PriorityItem(false, _MemberKind.UNIT_FUNCTION_TYPE, true),
     new _PriorityItem(false, _MemberKind.UNIT_CLASS, false),
@@ -83,21 +85,20 @@
   }
 
   /**
-   * Sorts all members of all [ClassDeclaration]s.
+   * Sorts all members of all [ClassOrMixinDeclaration]s.
    */
   void _sortClassesMembers() {
     for (CompilationUnitMember unitMember in unit.declarations) {
-      if (unitMember is ClassDeclaration) {
-        ClassDeclaration classDeclaration = unitMember;
-        _sortClassMembers(classDeclaration);
+      if (unitMember is ClassOrMixinDeclaration) {
+        _sortClassMembers(unitMember);
       }
     }
   }
 
   /**
-   * Sorts all members of the given [ClassDeclaration].
+   * Sorts all members of the given [classDeclaration].
    */
-  void _sortClassMembers(ClassDeclaration classDeclaration) {
+  void _sortClassMembers(ClassOrMixinDeclaration classDeclaration) {
     List<_MemberInfo> members = <_MemberInfo>[];
     for (ClassMember member in classDeclaration.members) {
       _MemberKind kind = null;
@@ -272,7 +273,7 @@
     for (CompilationUnitMember member in unit.declarations) {
       _MemberKind kind = null;
       String name = null;
-      if (member is ClassDeclaration) {
+      if (member is ClassOrMixinDeclaration) {
         kind = _MemberKind.UNIT_CLASS;
         name = member.name.name;
       }
@@ -305,6 +306,10 @@
         kind = _MemberKind.UNIT_FUNCTION_TYPE;
         name = member.name.name;
       }
+      if (member is GenericTypeAlias) {
+        kind = _MemberKind.UNIT_GENERIC_TYPE_ALIAS;
+        name = member.name.name;
+      }
       if (member is TopLevelVariableDeclaration) {
         TopLevelVariableDeclaration variableDeclaration = member;
         List<VariableDeclaration> variables =
@@ -458,14 +463,16 @@
   static const UNIT_FUNCTION_MAIN = const _MemberKind('UNIT_FUNCTION_MAIN', 0);
   static const UNIT_ACCESSOR = const _MemberKind('UNIT_ACCESSOR', 1);
   static const UNIT_FUNCTION = const _MemberKind('UNIT_FUNCTION', 2);
-  static const UNIT_FUNCTION_TYPE = const _MemberKind('UNIT_FUNCTION_TYPE', 3);
-  static const UNIT_CLASS = const _MemberKind('UNIT_CLASS', 4);
-  static const UNIT_VARIABLE_CONST = const _MemberKind('UNIT_VARIABLE', 5);
-  static const UNIT_VARIABLE = const _MemberKind('UNIT_VARIABLE', 6);
-  static const CLASS_ACCESSOR = const _MemberKind('CLASS_ACCESSOR', 7);
-  static const CLASS_CONSTRUCTOR = const _MemberKind('CLASS_CONSTRUCTOR', 8);
-  static const CLASS_FIELD = const _MemberKind('CLASS_FIELD', 9);
-  static const CLASS_METHOD = const _MemberKind('CLASS_METHOD', 10);
+  static const UNIT_GENERIC_TYPE_ALIAS =
+      const _MemberKind('UNIT_GENERIC_TYPE_ALIAS', 3);
+  static const UNIT_FUNCTION_TYPE = const _MemberKind('UNIT_FUNCTION_TYPE', 4);
+  static const UNIT_CLASS = const _MemberKind('UNIT_CLASS', 5);
+  static const UNIT_VARIABLE_CONST = const _MemberKind('UNIT_VARIABLE', 6);
+  static const UNIT_VARIABLE = const _MemberKind('UNIT_VARIABLE', 7);
+  static const CLASS_ACCESSOR = const _MemberKind('CLASS_ACCESSOR', 8);
+  static const CLASS_CONSTRUCTOR = const _MemberKind('CLASS_CONSTRUCTOR', 9);
+  static const CLASS_FIELD = const _MemberKind('CLASS_FIELD', 10);
+  static const CLASS_METHOD = const _MemberKind('CLASS_METHOD', 11);
 
   final String name;
   final int ordinal;
diff --git a/pkg/analysis_server/lib/src/services/correction/source_buffer.dart b/pkg/analysis_server/lib/src/services/correction/source_buffer.dart
index 24d6848..382bd1a 100644
--- a/pkg/analysis_server/lib/src/services/correction/source_buffer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/source_buffer.dart
@@ -1,10 +1,7 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
-
 /**
  * Helper for building Dart source with linked positions.
  */
@@ -13,18 +10,10 @@
   final int offset;
   final StringBuffer _buffer = new StringBuffer();
 
-  final Map<String, LinkedEditGroup> linkedPositionGroups =
-      <String, LinkedEditGroup>{};
-  LinkedEditGroup _currentLinkedPositionGroup;
-  int _currentPositionStart;
   int _exitOffset;
 
   SourceBuilder(this.file, this.offset);
 
-  SourceBuilder.buffer()
-      : file = null,
-        offset = 0;
-
   /**
    * Returns the exit offset, maybe `null` if not set.
    */
@@ -37,15 +26,6 @@
 
   int get length => _buffer.length;
 
-  void addSuggestion(LinkedEditSuggestionKind kind, String value) {
-    var suggestion = new LinkedEditSuggestion(value, kind);
-    _currentLinkedPositionGroup.addSuggestion(suggestion);
-  }
-
-  void addSuggestions(LinkedEditSuggestionKind kind, List<String> values) {
-    values.forEach((value) => addSuggestion(kind, value));
-  }
-
   /**
    * Appends [s] to the buffer.
    */
@@ -55,45 +35,12 @@
   }
 
   /**
-   * Ends position started using [startPosition].
-   */
-  void endPosition() {
-    assert(_currentLinkedPositionGroup != null);
-    _addPosition();
-    _currentLinkedPositionGroup = null;
-  }
-
-  /**
    * Marks the current offset as an "exit" one.
    */
   void setExitOffset() {
     _exitOffset = _buffer.length;
   }
 
-  /**
-   * Marks start of a new linked position for the group with the given ID.
-   */
-  void startPosition(String id) {
-    assert(_currentLinkedPositionGroup == null);
-    _currentLinkedPositionGroup = linkedPositionGroups[id];
-    if (_currentLinkedPositionGroup == null) {
-      _currentLinkedPositionGroup = new LinkedEditGroup.empty();
-      linkedPositionGroups[id] = _currentLinkedPositionGroup;
-    }
-    _currentPositionStart = _buffer.length;
-  }
-
   @override
   String toString() => _buffer.toString();
-
-  /**
-   * Adds position location [SourceRange] using current fields.
-   */
-  void _addPosition() {
-    int start = offset + _currentPositionStart;
-    int end = offset + _buffer.length;
-    int length = end - start;
-    Position position = new Position(file, start);
-    _currentLinkedPositionGroup.addPosition(position, length);
-  }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
index 3a5b1af..184c81b 100644
--- a/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/statement_analyzer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,9 +6,9 @@
 import 'package:analysis_server/src/services/correction/selection_analyzer.dart';
 import 'package:analysis_server/src/services/correction/status.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -37,11 +37,12 @@
  * Analyzer to check if a selection covers a valid set of statements of AST.
  */
 class StatementAnalyzer extends SelectionAnalyzer {
-  final CompilationUnit unit;
+  final ResolvedUnitResult resolveResult;
 
   final RefactoringStatus _status = new RefactoringStatus();
 
-  StatementAnalyzer(this.unit, SourceRange selection) : super(selection);
+  StatementAnalyzer(this.resolveResult, SourceRange selection)
+      : super(selection);
 
   /**
    * Returns the [RefactoringStatus] result of selection checking.
@@ -49,6 +50,13 @@
   RefactoringStatus get status => _status;
 
   /**
+   * Analyze the selection, compute [status] and nodes.
+   */
+  void analyze() {
+    resolveResult.unit.accept(this);
+  }
+
+  /**
    * Records fatal error with given message and [Location].
    */
   void invalidSelection(String message, [Location context]) {
@@ -68,7 +76,7 @@
     {
       int selectionStart = selection.offset;
       int selectionEnd = selection.end;
-      List<SourceRange> commentRanges = getCommentRanges(unit);
+      List<SourceRange> commentRanges = getCommentRanges(resolveResult.unit);
       for (SourceRange commentRange in commentRanges) {
         if (commentRange.contains(selectionStart)) {
           invalidSelection("Selection begins inside a comment.");
@@ -204,8 +212,7 @@
    * Returns `true` if there are [Token]s in the given [SourceRange].
    */
   bool _hasTokens(SourceRange range) {
-    CompilationUnitElement unitElement = unit.declaredElement;
-    String fullText = unitElement.context.getContents(unitElement.source).data;
+    String fullText = resolveResult.content;
     String rangeText = fullText.substring(range.offset, range.end);
     return _getTokens(rangeText).isNotEmpty;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/status.dart b/pkg/analysis_server/lib/src/services/correction/status.dart
index 5cc4cc3..67ec9f8 100644
--- a/pkg/analysis_server/lib/src/services/correction/status.dart
+++ b/pkg/analysis_server/lib/src/services/correction/status.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/correction/strings.dart b/pkg/analysis_server/lib/src/services/correction/strings.dart
index 33a4c6a..87b6fe3 100644
--- a/pkg/analysis_server/lib/src/services/correction/strings.dart
+++ b/pkg/analysis_server/lib/src/services/correction/strings.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -12,11 +12,6 @@
 const int CHAR_DOLLAR = 0x24;
 
 /**
- * "."
- */
-const int CHAR_DOT = 0x2E;
-
-/**
  * "_"
  */
 const int CHAR_UNDERSCORE = 0x5F;
@@ -98,39 +93,6 @@
 }
 
 /**
- * Returns the number of characters common to the end of [a] and the start
- * of [b].
- */
-int findCommonOverlap(String a, String b) {
-  int a_length = a.length;
-  int b_length = b.length;
-  // all empty
-  if (a_length == 0 || b_length == 0) {
-    return 0;
-  }
-  // truncate
-  if (a_length > b_length) {
-    a = a.substring(a_length - b_length);
-  } else if (a_length < b_length) {
-    b = b.substring(0, a_length);
-  }
-  int text_length = min(a_length, b_length);
-  // the worst case
-  if (a == b) {
-    return text_length;
-  }
-  // increase common length one by one
-  int length = 0;
-  while (length < text_length) {
-    if (a.codeUnitAt(text_length - 1 - length) != b.codeUnitAt(length)) {
-      break;
-    }
-    length++;
-  }
-  return length;
-}
-
-/**
  * Return the number of characters common to the start of [a] and [b].
  */
 int findCommonPrefix(String a, String b) {
@@ -193,13 +155,6 @@
   return isSpace(c) || isEOL(c);
 }
 
-String remove(String str, String remove) {
-  if (isEmpty(str) || isEmpty(remove)) {
-    return str;
-  }
-  return str.replaceAll(remove, '');
-}
-
 String removeEnd(String str, String remove) {
   if (isEmpty(str) || isEmpty(remove)) {
     return str;
@@ -233,24 +188,6 @@
 }
 
 /**
- * Gets the substring after the last occurrence of a separator.
- * The separator is not returned.
- */
-String substringAfterLast(String str, String separator) {
-  if (isEmpty(str)) {
-    return str;
-  }
-  if (isEmpty(separator)) {
-    return '';
-  }
-  int pos = str.lastIndexOf(separator);
-  if (pos == -1) {
-    return str;
-  }
-  return str.substring(pos + separator.length);
-}
-
-/**
  * Information about a single replacement that should be made to convert the
  * "old" string to the "new" one.
  */
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index f517e04..9ea11e0 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,6 +7,8 @@
 import 'package:analysis_server/src/protocol_server.dart'
     show doSourceChange_addElementEdit;
 import 'package:analysis_server/src/services/correction/strings.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -15,7 +17,6 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show SourceChange, SourceEdit;
@@ -27,16 +28,11 @@
  * Adds edits to the given [change] that ensure that all the [libraries] are
  * imported into the given [targetLibrary].
  */
-void addLibraryImports(pathos.Context pathContext, SourceChange change,
-    LibraryElement targetLibrary, Set<Source> libraries) {
-  CorrectionUtils libUtils;
-  try {
-    CompilationUnitElement unitElement = targetLibrary.definingCompilationUnit;
-    CompilationUnit unitAst = getParsedUnit(unitElement);
-    libUtils = new CorrectionUtils(unitAst);
-  } catch (e) {
-    throw new CancelCorrectionException(exception: e);
-  }
+Future<void> addLibraryImports(AnalysisSession session, SourceChange change,
+    LibraryElement targetLibrary, Set<Source> libraries) async {
+  var libraryPath = targetLibrary.source.fullName;
+  var resolveResult = await session.getResolvedUnit(libraryPath);
+  var libUtils = new CorrectionUtils(resolveResult);
   String eol = libUtils.endOfLine;
   // Prepare information about existing imports.
   LibraryDirective libraryDirective;
@@ -46,14 +42,14 @@
       libraryDirective = directive;
     } else if (directive is ImportDirective) {
       importDirectives.add(new _ImportDirectiveInfo(
-          directive.uriContent, directive.offset, directive.end));
+          directive.uri.stringValue, directive.offset, directive.end));
     }
   }
 
   // Prepare all URIs to import.
   List<String> uriList = libraries
-      .map((library) =>
-          getLibrarySourceUri(pathContext, targetLibrary, library.uri))
+      .map((library) => getLibrarySourceUri(
+          session.resourceProvider.pathContext, targetLibrary, library.uri))
       .toList();
   uriList.sort((a, b) => a.compareTo(b));
 
@@ -235,12 +231,12 @@
 }
 
 /**
- * If the given [AstNode] is in a [ClassDeclaration], returns the
+ * If the given [AstNode] is in a [ClassOrMixinDeclaration], returns the
  * [ClassElement]. Otherwise returns `null`.
  */
 ClassElement getEnclosingClassElement(AstNode node) {
-  ClassDeclaration enclosingClassNode =
-      node.getAncestor((node) => node is ClassDeclaration);
+  ClassOrMixinDeclaration enclosingClassNode =
+      node.thisOrAncestorOfType<ClassOrMixinDeclaration>();
   if (enclosingClassNode != null) {
     return enclosingClassNode.declaredElement;
   }
@@ -470,40 +466,6 @@
 }
 
 /**
- * Returns a parsed [AstNode] for the given [classElement].
- *
- * The resulting AST structure may or may not be resolved.
- */
-AstNode getParsedClassElementNode(ClassElement classElement) {
-  CompilationUnitElement unitElement = getCompilationUnitElement(classElement);
-  CompilationUnit unit = getParsedUnit(unitElement);
-  int offset = classElement.nameOffset;
-  AstNode classNameNode = new NodeLocator(offset).searchWithin(unit);
-  if (classElement.isEnum) {
-    return classNameNode.getAncestor((node) => node is EnumDeclaration);
-  } else {
-    return classNameNode.getAncestor(
-        (node) => node is ClassDeclaration || node is ClassTypeAlias);
-  }
-}
-
-/**
- * Returns a parsed [CompilationUnit] for the given [unitElement].
- *
- * The resulting AST structure may or may not be resolved.
- * If it is not resolved, then at least the given [unitElement] will be set.
- */
-CompilationUnit getParsedUnit(CompilationUnitElement unitElement) {
-  AnalysisContext context = unitElement.context;
-  Source source = unitElement.source;
-  CompilationUnit unit = context.parseCompilationUnit(source);
-  if (unit.declaredElement == null) {
-    unit.element = unitElement;
-  }
-  return unit;
-}
-
-/**
  * If given [node] is name of qualified property extraction, returns target from
  * which this property is extracted, otherwise `null`.
  */
@@ -641,6 +603,8 @@
 
 class CorrectionUtils {
   final CompilationUnit unit;
+  final LibraryElement _library;
+  final String _buffer;
 
   /**
    * The [ClassElement] the generated code is inserted to, so we can decide if
@@ -650,19 +614,12 @@
 
   ExecutableElement targetExecutableElement;
 
-  LibraryElement _library;
-  String _buffer;
   String _endOfLine;
 
-  CorrectionUtils(this.unit, {String buffer}) {
-    CompilationUnitElement unitElement = unit.declaredElement;
-    AnalysisContext context = unitElement.context;
-    if (context == null) {
-      throw new CancelCorrectionException();
-    }
-    this._library = unitElement.library;
-    this._buffer = buffer ?? context.getContents(unitElement.source).data;
-  }
+  CorrectionUtils(ResolvedUnitResult result)
+      : unit = result.unit,
+        _library = result.libraryElement,
+        _buffer = result.content;
 
   /**
    * Returns the EOL to use for this [CompilationUnit].
@@ -690,7 +647,7 @@
   Set<String> findPossibleLocalVariableConflicts(int offset) {
     Set<String> conflicts = new Set<String>();
     AstNode enclosingNode = findNode(offset);
-    Block enclosingBlock = enclosingNode.getAncestor((node) => node is Block);
+    Block enclosingBlock = enclosingNode.thisOrAncestorOfType<Block>();
     if (enclosingBlock != null) {
       _CollectReferencedUnprefixedNames visitor =
           new _CollectReferencedUnprefixedNames();
@@ -1091,7 +1048,7 @@
    * Return `true` if the given [classDeclaration] has open '{' and close '}'
    * at the same line, e.g. `class X {}`.
    */
-  bool isClassWithEmptyBody(ClassDeclaration classDeclaration) {
+  bool isClassWithEmptyBody(ClassOrMixinDeclaration classDeclaration) {
     return getLineThis(classDeclaration.leftBracket.offset) ==
         getLineThis(classDeclaration.rightBracket.offset);
   }
@@ -1110,7 +1067,7 @@
   }
 
   ClassMemberLocation prepareNewClassMemberLocation(
-      ClassDeclaration classDeclaration,
+      ClassOrMixinDeclaration classDeclaration,
       bool shouldSkip(ClassMember existingMember)) {
     String indent = getIndent(1);
     // Find the last target member.
@@ -1145,13 +1102,13 @@
   }
 
   ClassMemberLocation prepareNewFieldLocation(
-      ClassDeclaration classDeclaration) {
+      ClassOrMixinDeclaration classDeclaration) {
     return prepareNewClassMemberLocation(
         classDeclaration, (member) => member is FieldDeclaration);
   }
 
   ClassMemberLocation prepareNewGetterLocation(
-      ClassDeclaration classDeclaration) {
+      ClassOrMixinDeclaration classDeclaration) {
     return prepareNewClassMemberLocation(
         classDeclaration,
         (member) =>
@@ -1161,7 +1118,7 @@
   }
 
   ClassMemberLocation prepareNewMethodLocation(
-      ClassDeclaration classDeclaration) {
+      ClassOrMixinDeclaration classDeclaration) {
     return prepareNewClassMemberLocation(
         classDeclaration,
         (member) =>
diff --git a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
index 23c804b..24d7722 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,8 +14,8 @@
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
-import 'package:analyzer/src/generated/bazel.dart';
-import 'package:analyzer/src/generated/gn.dart';
+import 'package:analyzer/src/workspace/bazel.dart';
+import 'package:analyzer/src/workspace/gn.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show KytheEntry, KytheVName;
 
@@ -803,7 +803,7 @@
     // Most simple identifiers are "ref" edges.  In cases some cases, there may
     // be other ref/* edges.
 
-    if (node.getAncestor((node) => node is CommentReference) != null) {
+    if (node.thisOrAncestorOfType<CommentReference>() != null) {
       // The identifier is in a comment, add just the "ref" edge.
       _handleRefEdge(
         node.staticElement,
@@ -1106,7 +1106,7 @@
 /// This class is meant to be a mixin to concrete visitor methods to walk the
 /// [Element] or [AstNode]s produced by the Dart Analyzer to output Kythe
 /// [KytheEntry] protos.
-abstract class OutputUtils {
+mixin OutputUtils {
   /// A set of [String]s which have already had a name [KytheVName] created.
   final Set<String> nameNodes = new Set<String>();
 
diff --git a/pkg/analysis_server/lib/src/services/kythe/schema.dart b/pkg/analysis_server/lib/src/services/kythe/schema.dart
index c354abb..339564a 100644
--- a/pkg/analysis_server/lib/src/services/kythe/schema.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/schema.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
index 61dd338..34908db 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_getter_to_method.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,10 +10,11 @@
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
@@ -23,13 +24,13 @@
 class ConvertGetterToMethodRefactoringImpl extends RefactoringImpl
     implements ConvertGetterToMethodRefactoring {
   final SearchEngine searchEngine;
-  final AstProvider astProvider;
+  final AnalysisSession session;
   final PropertyAccessorElement element;
 
   SourceChange change;
 
   ConvertGetterToMethodRefactoringImpl(
-      this.searchEngine, this.astProvider, this.element);
+      this.searchEngine, this.session, this.element);
 
   @override
   String get refactoringName => 'Convert Getter To Method';
@@ -92,8 +93,9 @@
     // prepare "get" keyword
     Token getKeyword = null;
     {
-      AstNode name = await astProvider.getParsedNameForElement(element);
-      AstNode declaration = name?.parent;
+      var sessionHelper = AnalysisSessionHelper(session);
+      var result = await sessionHelper.getElementDeclaration(element);
+      var declaration = result.node;
       if (declaration is MethodDeclaration) {
         getKeyword = declaration.propertyKeyword;
       } else if (declaration is FunctionDeclaration) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
index 4f38b26..e7bc247 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/convert_method_to_getter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -12,8 +12,8 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
@@ -23,13 +23,13 @@
 class ConvertMethodToGetterRefactoringImpl extends RefactoringImpl
     implements ConvertMethodToGetterRefactoring {
   final SearchEngine searchEngine;
-  final AstProvider astProvider;
+  final AnalysisSessionHelper sessionHelper;
   final ExecutableElement element;
 
   SourceChange change;
 
-  ConvertMethodToGetterRefactoringImpl(
-      this.searchEngine, this.astProvider, this.element);
+  ConvertMethodToGetterRefactoringImpl(this.searchEngine, this.element)
+      : sessionHelper = AnalysisSessionHelper(element.session);
 
   @override
   String get refactoringName => 'Convert Method To Getter';
@@ -100,8 +100,8 @@
     // prepare parameters
     FormalParameterList parameters;
     {
-      AstNode name = await astProvider.getParsedNameForElement(element);
-      AstNode declaration = name?.parent;
+      var result = await sessionHelper.getElementDeclaration(element);
+      var declaration = result.node;
       if (declaration is MethodDeclaration) {
         parameters = declaration.parameters;
       } else if (declaration is FunctionDeclaration) {
@@ -133,11 +133,11 @@
       // prepare invocation
       MethodInvocation invocation;
       {
-        CompilationUnit refUnit =
-            await astProvider.getParsedUnitForElement(refElement);
-        AstNode refNode =
-            new NodeLocator(refRange.offset).searchWithin(refUnit);
-        invocation = refNode.getAncestor((node) => node is MethodInvocation);
+        var resolvedUnit =
+            await sessionHelper.getResolvedUnitByElement(refElement);
+        var refUnit = resolvedUnit.unit;
+        var refNode = new NodeLocator(refRange.offset).searchWithin(refUnit);
+        invocation = refNode.thisOrAncestorOfType<MethodInvocation>();
       }
       // we need invocation
       if (invocation != null) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index cf9cd10..d8e0c05 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -31,7 +31,7 @@
  */
 class ExtractLocalRefactoringImpl extends RefactoringImpl
     implements ExtractLocalRefactoring {
-  final ResolveResult resolveResult;
+  final ResolvedUnitResult resolveResult;
   final int selectionOffset;
   final int selectionLength;
   SourceRange selectionRange;
@@ -56,7 +56,7 @@
   ExtractLocalRefactoringImpl(
       this.resolveResult, this.selectionOffset, this.selectionLength) {
     selectionRange = new SourceRange(selectionOffset, selectionLength);
-    utils = new CorrectionUtils(unit, buffer: resolveResult.content);
+    utils = new CorrectionUtils(resolveResult);
   }
 
   String get file => resolveResult.path;
@@ -319,7 +319,7 @@
     // into this block.  If it has an expression body, we can convert it into
     // the block body first.
     if (coveringNode == null ||
-        coveringNode.getAncestor((node) => node is FunctionBody) == null) {
+        coveringNode.thisOrAncestorOfType<FunctionBody>() == null) {
       return new RefactoringStatus.fatal(
           'An expression inside a function must be selected '
           'to activate this refactoring.');
@@ -414,7 +414,7 @@
       return expressionBody;
     }
     // single Statement
-    AstNode target = commonParent.getAncestor((node) => node is Statement);
+    AstNode target = commonParent.thisOrAncestorOfType<Statement>();
     while (target.parent is! Block) {
       target = target.parent;
     }
@@ -601,7 +601,7 @@
   }
 }
 
-class _OccurrencesVisitor extends GeneralizingAstVisitor<Object> {
+class _OccurrencesVisitor extends GeneralizingAstVisitor<void> {
   final ExtractLocalRefactoringImpl ref;
   final List<SourceRange> occurrences;
   final String selectionSource;
@@ -609,24 +609,24 @@
   _OccurrencesVisitor(this.ref, this.occurrences, this.selectionSource);
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     if (!_hasStatements(node)) {
       _tryToFindOccurrenceFragments(node);
-      return null;
+      return;
     }
-    return super.visitBinaryExpression(node);
+    super.visitBinaryExpression(node);
   }
 
   @override
-  Object visitExpression(Expression node) {
+  void visitExpression(Expression node) {
     if (ref._isExtractable(range.node(node))) {
       _tryToFindOccurrence(node);
     }
-    return super.visitExpression(node);
+    super.visitExpression(node);
   }
 
   @override
-  Object visitStringLiteral(StringLiteral node) {
+  void visitStringLiteral(StringLiteral node) {
     if (ref.stringLiteralPart != null) {
       int length = ref.stringLiteralPart.length;
       String value = ref.utils.getNodeText(node);
@@ -641,9 +641,9 @@
         SourceRange range = new SourceRange(start, length);
         occurrences.add(range);
       }
-      return null;
+      return;
     }
-    return visitExpression(node);
+    visitExpression(node);
   }
 
   void _addOccurrence(SourceRange range) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index 6969c41..bce5382 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -23,8 +23,8 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/resolver.dart' show ExitDetector;
 import 'package:analyzer/src/generated/resolver.dart';
@@ -74,8 +74,7 @@
       'execution flows exit. Semantics may not be preserved.';
 
   final SearchEngine searchEngine;
-  final AstProvider astProvider;
-  final ResolveResult resolveResult;
+  final ResolvedUnitResult resolveResult;
   final int selectionOffset;
   final int selectionLength;
   SourceRange selectionRange;
@@ -119,11 +118,10 @@
   List<_Occurrence> _occurrences = [];
   bool _staticContext = false;
 
-  ExtractMethodRefactoringImpl(this.searchEngine, this.astProvider,
-      this.resolveResult, this.selectionOffset, this.selectionLength) {
+  ExtractMethodRefactoringImpl(this.searchEngine, this.resolveResult,
+      this.selectionOffset, this.selectionLength) {
     selectionRange = new SourceRange(selectionOffset, selectionLength);
-    utils =
-        new CorrectionUtils(resolveResult.unit, buffer: resolveResult.content);
+    utils = new CorrectionUtils(resolveResult);
   }
 
   @override
@@ -138,8 +136,7 @@
   String get refactoringName {
     AstNode node =
         new NodeLocator(selectionOffset).searchWithin(resolveResult.unit);
-    if (node != null &&
-        node.getAncestor((node) => node is ClassDeclaration) != null) {
+    if (node != null && node.thisOrAncestorOfType<ClassDeclaration>() != null) {
       return 'Extract Method';
     }
     return 'Extract Function';
@@ -394,8 +391,8 @@
       }
     }
     // done
-    addLibraryImports(resolveResult.session.resourceProvider.pathContext,
-        change, resolveResult.libraryElement, librariesToImport);
+    await addLibraryImports(resolveResult.session, change,
+        resolveResult.libraryElement, librariesToImport);
     return change;
   }
 
@@ -454,8 +451,8 @@
     // method of class
     if (parent is ClassDeclaration) {
       ClassElement classElement = parent.declaredElement;
-      return validateCreateMethod(
-          searchEngine, astProvider, classElement, name);
+      return validateCreateMethod(searchEngine,
+          AnalysisSessionHelper(resolveResult.session), classElement, name);
     }
     // OK
     return new Future<RefactoringStatus>.value(result);
@@ -477,23 +474,20 @@
       }
     }
 
-    _ExtractMethodAnalyzer selectionAnalyzer =
-        new _ExtractMethodAnalyzer(resolveResult.unit, selectionRange);
-    resolveResult.unit.accept(selectionAnalyzer);
+    var analyzer = new _ExtractMethodAnalyzer(resolveResult, selectionRange);
+    analyzer.analyze();
     // May be a fatal error.
     {
-      if (selectionAnalyzer.status.hasFatalError) {
-        return selectionAnalyzer.status;
+      if (analyzer.status.hasFatalError) {
+        return analyzer.status;
       }
     }
 
-    List<AstNode> selectedNodes = selectionAnalyzer.selectedNodes;
+    List<AstNode> selectedNodes = analyzer.selectedNodes;
 
     // If no selected nodes, extract the smallest covering expression.
     if (selectedNodes.isEmpty) {
-      for (var node = selectionAnalyzer.coveringNode;
-          node != null;
-          node = node.parent) {
+      for (var node = analyzer.coveringNode; node != null; node = node.parent) {
         if (node is Statement) {
           break;
         }
@@ -586,7 +580,7 @@
     // Check for the parameter list of a FunctionExpression.
     {
       FunctionExpression function =
-          node?.getAncestor((n) => n is FunctionExpression);
+          node?.thisOrAncestorOfType<FunctionExpression>();
       if (function != null &&
           function.parameters != null &&
           range.node(function.parameters).contains(offset)) {
@@ -655,7 +649,7 @@
     // change indentation
     if (_selectionFunctionExpression != null) {
       AstNode baseNode =
-          _selectionFunctionExpression.getAncestor((node) => node is Statement);
+          _selectionFunctionExpression.thisOrAncestorOfType<Statement>();
       if (baseNode != null) {
         String baseIndent = utils.getNodePrefix(baseNode);
         String targetIndent = utils.getNodePrefix(_parentMember);
@@ -826,9 +820,8 @@
    * Checks if it is OK to extract the node with the given [SourceRange].
    */
   bool _isExtractable(SourceRange range) {
-    _ExtractMethodAnalyzer analyzer =
-        new _ExtractMethodAnalyzer(resolveResult.unit, range);
-    utils.unit.accept(analyzer);
+    var analyzer = new _ExtractMethodAnalyzer(resolveResult, range);
+    analyzer.analyze();
     return analyzer.status.isOK;
   }
 
@@ -929,8 +922,9 @@
  * [SelectionAnalyzer] for [ExtractMethodRefactoringImpl].
  */
 class _ExtractMethodAnalyzer extends StatementAnalyzer {
-  _ExtractMethodAnalyzer(CompilationUnit unit, SourceRange selection)
-      : super(unit, selection);
+  _ExtractMethodAnalyzer(
+      ResolvedUnitResult resolveResult, SourceRange selection)
+      : super(resolveResult, selection);
 
   @override
   void handleNextSelectedNode(AstNode node) {
@@ -1120,7 +1114,7 @@
   }
 }
 
-class _InitializeOccurrencesVisitor extends GeneralizingAstVisitor<Object> {
+class _InitializeOccurrencesVisitor extends GeneralizingAstVisitor<void> {
   final ExtractMethodRefactoringImpl ref;
   final _SourcePattern selectionPattern;
   final Map<String, String> patternToSelectionName;
@@ -1131,50 +1125,50 @@
       this.ref, this.selectionPattern, this.patternToSelectionName);
 
   @override
-  Object visitBlock(Block node) {
+  void visitBlock(Block node) {
     if (ref._selectionStatements != null) {
       _visitStatements(node.statements);
     }
-    return super.visitBlock(node);
+    super.visitBlock(node);
   }
 
   @override
-  Object visitConstructorInitializer(ConstructorInitializer node) {
+  void visitConstructorInitializer(ConstructorInitializer node) {
     forceStatic = true;
     try {
-      return super.visitConstructorInitializer(node);
+      super.visitConstructorInitializer(node);
     } finally {
       forceStatic = false;
     }
   }
 
   @override
-  Object visitExpression(Expression node) {
+  void visitExpression(Expression node) {
     if (ref._selectionFunctionExpression != null ||
         ref._selectionExpression != null &&
             node.runtimeType == ref._selectionExpression.runtimeType) {
       SourceRange nodeRange = range.node(node);
       _tryToFindOccurrence(nodeRange);
     }
-    return super.visitExpression(node);
+    super.visitExpression(node);
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     forceStatic = node.isStatic;
     try {
-      return super.visitMethodDeclaration(node);
+      super.visitMethodDeclaration(node);
     } finally {
       forceStatic = false;
     }
   }
 
   @override
-  Object visitSwitchMember(SwitchMember node) {
+  void visitSwitchMember(SwitchMember node) {
     if (ref._selectionStatements != null) {
       _visitStatements(node.statements);
     }
-    return super.visitSwitchMember(node);
+    super.visitSwitchMember(node);
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 8218754..b182f37 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -13,12 +13,13 @@
 import 'package:analysis_server/src/services/search/element_visitors.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart' show SourceRange;
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
@@ -28,7 +29,7 @@
 class ExtractWidgetRefactoringImpl extends RefactoringImpl
     implements ExtractWidgetRefactoring {
   final SearchEngine searchEngine;
-  final ResolveResult resolveResult;
+  final ResolvedUnitResult resolveResult;
   final AnalysisSessionHelper sessionHelper;
   final int offset;
   final int length;
@@ -73,8 +74,7 @@
   ExtractWidgetRefactoringImpl(
       this.searchEngine, this.resolveResult, this.offset, this.length)
       : sessionHelper = new AnalysisSessionHelper(resolveResult.session) {
-    utils =
-        new CorrectionUtils(resolveResult.unit, buffer: resolveResult.content);
+    utils = new CorrectionUtils(resolveResult);
   }
 
   @override
@@ -103,7 +103,7 @@
     }
 
     AstNode astNode = _expression ?? _method ?? _statements.first;
-    _enclosingUnitMember = astNode.getAncestor((n) {
+    _enclosingUnitMember = astNode.thisOrAncestorMatching((n) {
       return n is CompilationUnitMember && n.parent is CompilationUnit;
     });
 
@@ -178,7 +178,7 @@
     }
 
     // Find the enclosing class.
-    _enclosingClassNode = node?.getAncestor((n) => n is ClassDeclaration);
+    _enclosingClassNode = node?.thisOrAncestorOfType<ClassDeclaration>();
     _enclosingClassElement = _enclosingClassNode?.declaredElement;
 
     // new MyWidget(...)
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
index eafbcaf..00b8883 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_local.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,8 +14,8 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -26,8 +26,7 @@
 class InlineLocalRefactoringImpl extends RefactoringImpl
     implements InlineLocalRefactoring {
   final SearchEngine searchEngine;
-  final AstProvider astProvider;
-  final ResolveResult resolveResult;
+  final ResolvedUnitResult resolveResult;
   final int offset;
   CorrectionUtils utils;
 
@@ -36,9 +35,8 @@
   List<SearchMatch> _references;
 
   InlineLocalRefactoringImpl(
-      this.searchEngine, this.astProvider, this.resolveResult, this.offset) {
-    utils =
-        new CorrectionUtils(resolveResult.unit, buffer: resolveResult.content);
+      this.searchEngine, this.resolveResult, this.offset) {
+    utils = new CorrectionUtils(resolveResult);
   }
 
   @override
@@ -79,8 +77,10 @@
         Element element = offsetNode.staticElement;
         if (element is LocalVariableElement) {
           _variableElement = element;
-          AstNode name = await astProvider.getResolvedNameForElement(element);
-          _variableNode = name.parent as VariableDeclaration;
+          var declarationResult =
+              await AnalysisSessionHelper(resolveResult.session)
+                  .getElementDeclaration(element);
+          _variableNode = declarationResult.node;
         }
       }
     }
@@ -121,8 +121,8 @@
     SourceChange change = new SourceChange(refactoringName);
     // remove declaration
     {
-      Statement declarationStatement = _variableNode
-          .getAncestor((node) => node is VariableDeclarationStatement);
+      Statement declarationStatement =
+          _variableNode.thisOrAncestorOfType<VariableDeclarationStatement>();
       SourceRange range = utils.getLinesRangeStatements([declarationStatement]);
       doSourceChange_addElementEdit(change, resolveResult.unit.declaredElement,
           newSourceEdit_range(range, ''));
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 05e5c1b..4d7b4e2 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -16,8 +16,8 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
@@ -26,7 +26,7 @@
  */
 SourceRange _getLocalsConflictingRange(AstNode node) {
   // maybe Block
-  Block block = node.getAncestor((node) => node is Block);
+  Block block = node.thisOrAncestorOfType<Block>();
   if (block != null) {
     return range.startEnd(node, block);
   }
@@ -188,10 +188,9 @@
 class InlineMethodRefactoringImpl extends RefactoringImpl
     implements InlineMethodRefactoring {
   final SearchEngine searchEngine;
-  final AstProvider astProvider;
-  final ResolveResult resolveResult;
+  final ResolvedUnitResult resolveResult;
   final int offset;
-  ResolvedUnitCache _unitCache;
+  final AnalysisSessionHelper sessionHelper;
   CorrectionUtils utils;
   SourceChange change;
 
@@ -200,7 +199,6 @@
   bool inlineAll = true;
 
   ExecutableElement _methodElement;
-  bool _isAccessor;
   CompilationUnit _methodUnit;
   CorrectionUtils _methodUtils;
   AstNode _methodNode;
@@ -210,13 +208,12 @@
   _SourcePart _methodExpressionPart;
   _SourcePart _methodStatementsPart;
   final List<_ReferenceProcessor> _referenceProcessors = [];
-  final Set<FunctionBody> _alreadyMadeAsync = new Set<FunctionBody>();
+  final Set<Element> _alreadyMadeAsync = new Set<Element>();
 
   InlineMethodRefactoringImpl(
-      this.searchEngine, this.astProvider, this.resolveResult, this.offset) {
-    _unitCache = new ResolvedUnitCache(astProvider, resolveResult.unit);
-    utils =
-        new CorrectionUtils(resolveResult.unit, buffer: resolveResult.content);
+      this.searchEngine, this.resolveResult, this.offset)
+      : sessionHelper = AnalysisSessionHelper(resolveResult.session) {
+    utils = new CorrectionUtils(resolveResult);
   }
 
   @override
@@ -311,24 +308,6 @@
     return new Future.value(change);
   }
 
-  Future<FunctionDeclaration> _computeFunctionDeclaration() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    CompilationUnit unit = await _unitCache.getUnit(_methodElement);
-    return new NodeLocator(_methodElement.nameOffset)
-        .searchWithin(unit)
-        .getAncestor((n) => n is FunctionDeclaration) as FunctionDeclaration;
-  }
-
-  Future<MethodDeclaration> _computeMethodDeclaration() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    CompilationUnit unit = await _unitCache.getUnit(_methodElement);
-    return new NodeLocator(_methodElement.nameOffset)
-        .searchWithin(unit)
-        .getAncestor((n) => n is MethodDeclaration) as MethodDeclaration;
-  }
-
   _SourcePart _createSourcePart(SourceRange range) {
     String source = _methodUtils.getRangeText(range);
     String prefix = getLinePrefix(source);
@@ -368,38 +347,30 @@
       return fatalStatus;
     }
     _methodElement = element as ExecutableElement;
-    _isAccessor = element is PropertyAccessorElement;
-    _methodUnit = await _unitCache.getUnit(element);
-    _methodUtils = new CorrectionUtils(_methodUnit);
-    // class member
-    bool isClassMember = element.enclosingElement is ClassElement;
-    if (element is MethodElement || _isAccessor && isClassMember) {
-      MethodDeclaration methodDeclaration = await _computeMethodDeclaration();
-      _methodNode = methodDeclaration;
-      _methodParameters = methodDeclaration.parameters;
-      _methodBody = methodDeclaration.body;
-      // prepare mode
-      isDeclaration = node == methodDeclaration.name;
-      deleteSource = isDeclaration;
-      inlineAll = deleteSource;
-      return new RefactoringStatus();
+
+    var declaration = await sessionHelper.getElementDeclaration(_methodElement);
+    var methodNode = declaration.node;
+    _methodNode = methodNode;
+
+    var resolvedUnit = declaration.resolvedUnit;
+    _methodUnit = resolvedUnit.unit;
+    _methodUtils = new CorrectionUtils(resolvedUnit);
+
+    if (methodNode is MethodDeclaration) {
+      _methodParameters = methodNode.parameters;
+      _methodBody = methodNode.body;
+    } else if (methodNode is FunctionDeclaration) {
+      _methodParameters = methodNode.functionExpression.parameters;
+      _methodBody = methodNode.functionExpression.body;
+    } else {
+      return fatalStatus;
     }
-    // unit member
-    bool isUnitMember = element.enclosingElement is CompilationUnitElement;
-    if (element is FunctionElement || _isAccessor && isUnitMember) {
-      FunctionDeclaration functionDeclaration =
-          await _computeFunctionDeclaration();
-      _methodNode = functionDeclaration;
-      _methodParameters = functionDeclaration.functionExpression.parameters;
-      _methodBody = functionDeclaration.functionExpression.body;
-      // prepare mode
-      isDeclaration = node == functionDeclaration.name;
-      deleteSource = isDeclaration;
-      inlineAll = deleteSource;
-      return new RefactoringStatus();
-    }
-    // OK
-    return fatalStatus;
+
+    isDeclaration = resolveResult.uri == element.source.uri &&
+        node.offset == element.nameOffset;
+    deleteSource = isDeclaration;
+    inlineAll = deleteSource;
+    return new RefactoringStatus();
   }
 
   /**
@@ -467,12 +438,14 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     refElement = reference.element;
+
     // prepare CorrectionUtils
-    CompilationUnit refUnit = await ref._unitCache.getUnit(refElement);
-    _refUtils = new CorrectionUtils(refUnit);
+    var result = await ref.sessionHelper.getResolvedUnitByElement(refElement);
+    _refUtils = new CorrectionUtils(result);
+
     // prepare node and environment
     _node = _refUtils.findNode(reference.sourceRange.offset);
-    Statement refStatement = _node.getAncestor((node) => node is Statement);
+    Statement refStatement = _node.thisOrAncestorOfType<Statement>();
     if (refStatement != null) {
       _refLineRange = _refUtils.getLinesRangeStatements([refStatement]);
       _refPrefix = _refUtils.getNodePrefix(refStatement);
@@ -591,7 +564,7 @@
     // If the element being inlined is async, ensure that the function
     // body that encloses the method is also async.
     if (ref._methodElement.isAsynchronous) {
-      FunctionBody body = _node.getAncestor((n) => n is FunctionBody);
+      FunctionBody body = _node.thisOrAncestorOfType<FunctionBody>();
       if (body != null) {
         if (body.isSynchronous) {
           if (body.isGenerator) {
@@ -608,7 +581,7 @@
               return;
             }
           }
-          if (ref._alreadyMadeAsync.add(body)) {
+          if (ref._alreadyMadeAsync.add(refElement)) {
             SourceRange bodyStart = range.startLength(body, 0);
             _addRefEdit(newSourceEdit_range(bodyStart, 'async '));
           }
@@ -650,7 +623,7 @@
         List<Expression> arguments = [];
         if (_node.inSetterContext()) {
           AssignmentExpression assignment =
-              _node.getAncestor((node) => node is AssignmentExpression);
+              _node.thisOrAncestorOfType<AssignmentExpression>();
           arguments.add(assignment.rightHandSide);
         }
         // inline body
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index d2e3c69..0963233 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -32,6 +32,8 @@
   String oldFile;
   String newFile;
 
+  final packagePrefixedStringPattern = new RegExp(r'''^r?['"]+package:''');
+
   MoveFileRefactoringImpl(ResourceProvider resourceProvider, this.workspace,
       this.source, this.oldFile)
       : resourceProvider = resourceProvider,
@@ -90,7 +92,8 @@
       });
     } else {
       // Otherwise, we need to update any relative part-of references.
-      Iterable<PartOfDirective> partOfs = element.unit.directives
+      final result = await driver.currentSession.getResolvedUnit(oldFile);
+      Iterable<PartOfDirective> partOfs = result.unit.directives
           .whereType<PartOfDirective>()
           .where((po) => po.uri != null && _isRelativeUri(po.uri.stringValue));
 
@@ -139,7 +142,12 @@
     return _getRelativeUri(newFile, refDir);
   }
 
-  final packagePrefixedStringPattern = new RegExp(r'''^r?['"]+package:''');
+  String _getRelativeUri(String path, String from) {
+    String uri = pathContext.relative(path, from: from);
+    List<String> parts = pathContext.split(uri);
+    return pathos.posix.joinAll(parts);
+  }
+
   bool _isPackageReference(SourceReference reference) {
     final Source source = reference.element.source;
     final String quotedImportUri = source.contents.data.substring(
@@ -148,12 +156,6 @@
     return packagePrefixedStringPattern.hasMatch(quotedImportUri);
   }
 
-  String _getRelativeUri(String path, String from) {
-    String uri = pathContext.relative(path, from: from);
-    List<String> parts = pathContext.split(uri);
-    return pathos.posix.joinAll(parts);
-  }
-
   /**
    * Checks if the given [path] represents a relative URI.
    *
diff --git a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
index 94bfd73..e830d48 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index 50e2344..7bcbb7b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -22,11 +22,11 @@
 import 'package:analysis_server/src/services/refactoring/rename_unit_member.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show RefactoringMethodParameter, SourceChange;
@@ -40,9 +40,9 @@
    * [element] and all the corresponding hierarchy elements.
    */
   factory ConvertGetterToMethodRefactoring(SearchEngine searchEngine,
-      AstProvider astProvider, PropertyAccessorElement element) {
+      AnalysisSession session, PropertyAccessorElement element) {
     return new ConvertGetterToMethodRefactoringImpl(
-        searchEngine, astProvider, element);
+        searchEngine, session, element);
   }
 }
 
@@ -55,9 +55,8 @@
    * [element] and all the corresponding hierarchy elements.
    */
   factory ConvertMethodToGetterRefactoring(SearchEngine searchEngine,
-      AstProvider astProvider, ExecutableElement element) {
-    return new ConvertMethodToGetterRefactoringImpl(
-        searchEngine, astProvider, element);
+      AnalysisSession session, ExecutableElement element) {
+    return new ConvertMethodToGetterRefactoringImpl(searchEngine, element);
   }
 }
 
@@ -68,7 +67,7 @@
   /**
    * Returns a new [ExtractLocalRefactoring] instance.
    */
-  factory ExtractLocalRefactoring(ResolveResult resolveResult,
+  factory ExtractLocalRefactoring(ResolvedUnitResult resolveResult,
       int selectionOffset, int selectionLength) = ExtractLocalRefactoringImpl;
 
   /**
@@ -144,12 +143,11 @@
    */
   factory ExtractMethodRefactoring(
       SearchEngine searchEngine,
-      AstProvider astProvider,
-      ResolveResult resolveResult,
+      ResolvedUnitResult resolveResult,
       int selectionOffset,
       int selectionLength) {
-    return new ExtractMethodRefactoringImpl(searchEngine, astProvider,
-        resolveResult, selectionOffset, selectionLength);
+    return new ExtractMethodRefactoringImpl(
+        searchEngine, resolveResult, selectionOffset, selectionLength);
   }
 
   /**
@@ -243,7 +241,7 @@
    * Returns a new [ExtractWidgetRefactoring] instance.
    */
   factory ExtractWidgetRefactoring(SearchEngine searchEngine,
-      ResolveResult resolveResult, int offset, int length) {
+      ResolvedUnitResult resolveResult, int offset, int length) {
     return new ExtractWidgetRefactoringImpl(
         searchEngine, resolveResult, offset, length);
   }
@@ -278,10 +276,9 @@
   /**
    * Returns a new [InlineLocalRefactoring] instance.
    */
-  factory InlineLocalRefactoring(SearchEngine searchEngine,
-      AstProvider astProvider, ResolveResult resolveResult, int offset) {
-    return new InlineLocalRefactoringImpl(
-        searchEngine, astProvider, resolveResult, offset);
+  factory InlineLocalRefactoring(
+      SearchEngine searchEngine, ResolvedUnitResult resolveResult, int offset) {
+    return new InlineLocalRefactoringImpl(searchEngine, resolveResult, offset);
   }
 
   /**
@@ -302,10 +299,9 @@
   /**
    * Returns a new [InlineMethodRefactoring] instance.
    */
-  factory InlineMethodRefactoring(SearchEngine searchEngine,
-      AstProvider astProvider, ResolveResult resolveResult, int offset) {
-    return new InlineMethodRefactoringImpl(
-        searchEngine, astProvider, resolveResult, offset);
+  factory InlineMethodRefactoring(
+      SearchEngine searchEngine, ResolvedUnitResult resolveResult, int offset) {
+    return new InlineMethodRefactoringImpl(searchEngine, resolveResult, offset);
   }
 
   /**
@@ -413,6 +409,13 @@
   RefactoringWorkspace(this.drivers, this.searchEngine);
 
   /**
+   * Whether the [element] is defined in a file that is in a context root.
+   */
+  bool containsElement(Element element) {
+    return containsFile(element.source.fullName);
+  }
+
+  /**
    * Whether the file with the given [path] is in a context root.
    */
   bool containsFile(String path) {
@@ -431,6 +434,14 @@
   }
 }
 
+class RenameRefactoringElement {
+  final Element element;
+  final int offset;
+  final int length;
+
+  RenameRefactoringElement(this.element, this.offset, this.length);
+}
+
 /**
  * Abstract [Refactoring] for renaming some [Element].
  */
@@ -441,7 +452,7 @@
    * type.
    */
   factory RenameRefactoring(RefactoringWorkspace workspace,
-      AstProvider astProvider, Element element) {
+      AnalysisSession session, Element element) {
     if (element == null) {
       return null;
     }
@@ -452,11 +463,10 @@
       return new RenameUnitMemberRefactoringImpl(workspace, element);
     }
     if (element is ConstructorElement) {
-      return new RenameConstructorRefactoringImpl(
-          workspace, astProvider, element);
+      return new RenameConstructorRefactoringImpl(workspace, session, element);
     }
     if (element is ImportElement) {
-      return new RenameImportRefactoringImpl(workspace, astProvider, element);
+      return new RenameImportRefactoringImpl(workspace, session, element);
     }
     if (element is LabelElement) {
       return new RenameLabelRefactoringImpl(workspace, element);
@@ -465,15 +475,49 @@
       return new RenameLibraryRefactoringImpl(workspace, element);
     }
     if (element is LocalElement) {
-      return new RenameLocalRefactoringImpl(workspace, astProvider, element);
+      return new RenameLocalRefactoringImpl(workspace, element);
     }
     if (element.enclosingElement is ClassElement) {
-      return new RenameClassMemberRefactoringImpl(
-          workspace, astProvider, element);
+      return new RenameClassMemberRefactoringImpl(workspace, session, element);
     }
     return null;
   }
 
+  /// Given a node/element, finds the best element to rename (for example
+  /// the class when on the `new` keyword).
+  static RenameRefactoringElement getElementToRename(
+      AstNode node, Element element) {
+    int offset = node.offset;
+    int length = node.length;
+
+    if (element is FieldFormalParameterElement) {
+      element = (element as FieldFormalParameterElement).field;
+    }
+
+    // Use the prefix offset/length when renaming an import directive.
+    if (node is ImportDirective && element is ImportElement) {
+      if (node.prefix != null) {
+        offset = node.prefix.offset;
+        length = node.prefix.length;
+      } else {
+        // -1 means the name does not exist yet.
+        offset = -1;
+        length = 0;
+      }
+    }
+
+    // Rename the class when on `new` in an instance creation.
+    if (node is InstanceCreationExpression) {
+      InstanceCreationExpression creation = node;
+      var typeIdentifier = creation.constructorName.type.name;
+      element = typeIdentifier.staticElement;
+      offset = typeIdentifier.offset;
+      length = typeIdentifier.length;
+    }
+
+    return new RenameRefactoringElement(element, offset, length);
+  }
+
   /**
    * Returns the human-readable description of the kind of element being renamed
    * (such as “class” or “function type alias”).
@@ -501,38 +545,3 @@
    */
   RefactoringStatus checkNewName();
 }
-
-/**
- * Cache for accessing resolved [CompilationUnit]s by [Element]s.
- *
- * Must by short-lived.
- *
- * TODO(scheglov) consider moving to request-bound object.
- */
-class ResolvedUnitCache {
-  final AstProvider _astProvider;
-  final Map<CompilationUnitElement, CompilationUnit> _map = {};
-
-  ResolvedUnitCache(this._astProvider, [CompilationUnit unit]) {
-    if (unit != null) {
-      _map[unit.declaredElement] = unit;
-    }
-  }
-
-  Future<CompilationUnit> getUnit(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    CompilationUnitElement unitElement = getUnitElement(element);
-    CompilationUnit unit = _map[unitElement];
-    if (unit == null) {
-      unit = await _astProvider.getResolvedUnitForElement(element);
-      _map[unitElement] = unit;
-    }
-    return unit;
-  }
-
-  CompilationUnitElement getUnitElement(Element element) {
-    return element.getAncestor((e) => e is CompilationUnitElement)
-        as CompilationUnitElement;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
index 2a81869..9fc3d94 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring_internal.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index d7f193c..e33f397 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -18,17 +18,17 @@
  * Helper for renaming one or more [Element]s.
  */
 class RenameProcessor {
-  final SearchEngine searchEngine;
+  final RefactoringWorkspace workspace;
   final SourceChange change;
   final String newName;
 
-  RenameProcessor(this.searchEngine, this.change, this.newName);
+  RenameProcessor(this.workspace, this.change, this.newName);
 
   /**
    * Add the edit that updates the [element] declaration.
    */
   void addDeclarationEdit(Element element) {
-    if (element != null) {
+    if (element != null && workspace.containsElement(element)) {
       SourceEdit edit =
           newSourceEdit_range(range.elementName(element), newName);
       doSourceChange_addElementEdit(change, element, edit);
@@ -41,6 +41,9 @@
   void addReferenceEdits(List<SearchMatch> matches) {
     List<SourceReference> references = getSourceReferences(matches);
     for (SourceReference reference in references) {
+      if (!workspace.containsElement(reference.element)) {
+        continue;
+      }
       reference.addEdit(change, newName);
     }
   }
@@ -50,7 +53,9 @@
    */
   Future<void> renameElement(Element element) {
     addDeclarationEdit(element);
-    return searchEngine.searchReferences(element).then(addReferenceEdits);
+    return workspace.searchEngine
+        .searchReferences(element)
+        .then(addReferenceEdits);
   }
 }
 
@@ -86,7 +91,7 @@
           getElementQualifiedName(element));
       result.addFatalError(message);
     }
-    if (!workspace.containsFile(element.source.fullName)) {
+    if (!workspace.containsElement(element)) {
       String message = format(
           "The {0} '{1}' is defined outside of the project, so cannot be renamed.",
           getElementKindName(element),
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index d085e78..4f8afd4 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,10 +14,11 @@
 import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -25,10 +26,13 @@
  * Checks if creating a method with the given [name] in [classElement] will
  * cause any conflicts.
  */
-Future<RefactoringStatus> validateCreateMethod(SearchEngine searchEngine,
-    AstProvider astProvider, ClassElement classElement, String name) {
+Future<RefactoringStatus> validateCreateMethod(
+    SearchEngine searchEngine,
+    AnalysisSessionHelper sessionHelper,
+    ClassElement classElement,
+    String name) {
   return new _ClassMemberValidator.forCreate(
-          searchEngine, astProvider, classElement, name)
+          searchEngine, sessionHelper, classElement, name)
       .validate();
 }
 
@@ -36,13 +40,14 @@
  * A [Refactoring] for renaming class member [Element]s.
  */
 class RenameClassMemberRefactoringImpl extends RenameRefactoringImpl {
-  final AstProvider astProvider;
+  final AnalysisSessionHelper sessionHelper;
 
   _ClassMemberValidator _validator;
 
   RenameClassMemberRefactoringImpl(
-      RefactoringWorkspace workspace, this.astProvider, Element element)
-      : super(workspace, element);
+      RefactoringWorkspace workspace, AnalysisSession session, Element element)
+      : sessionHelper = AnalysisSessionHelper(session),
+        super(workspace, element);
 
   @override
   String get refactoringName {
@@ -58,7 +63,7 @@
   @override
   Future<RefactoringStatus> checkFinalConditions() {
     _validator = new _ClassMemberValidator.forRename(
-        searchEngine, astProvider, element, newName);
+        searchEngine, sessionHelper, element, newName);
     return _validator.validate();
   }
 
@@ -87,7 +92,7 @@
 
   @override
   Future<void> fillChange() async {
-    var processor = new RenameProcessor(searchEngine, change, newName);
+    var processor = new RenameProcessor(workspace, change, newName);
     // update declarations
     for (Element renameElement in _validator.elements) {
       if (renameElement.isSynthetic && renameElement is FieldElement) {
@@ -105,7 +110,7 @@
     List<SourceReference> nameRefs = getSourceReferences(nameMatches);
     for (SourceReference reference in nameRefs) {
       // ignore references from SDK and pub cache
-      if (!workspace.containsFile(reference.element.source.fullName)) {
+      if (!workspace.containsElement(reference.element)) {
         continue;
       }
       // check the element being renamed is accessible
@@ -132,7 +137,7 @@
  */
 class _ClassMemberValidator {
   final SearchEngine searchEngine;
-  final ResolvedUnitCache unitCache;
+  final AnalysisSessionHelper sessionHelper;
   final LibraryElement library;
   final Element element;
   final ClassElement elementClass;
@@ -145,17 +150,15 @@
   List<SearchMatch> references = <SearchMatch>[];
 
   _ClassMemberValidator.forCreate(
-      this.searchEngine, AstProvider astProvider, this.elementClass, this.name)
-      : unitCache = new ResolvedUnitCache(astProvider),
-        isRename = false,
+      this.searchEngine, this.sessionHelper, this.elementClass, this.name)
+      : isRename = false,
         library = null,
         element = null,
         elementKind = ElementKind.METHOD;
 
   _ClassMemberValidator.forRename(
-      this.searchEngine, AstProvider astProvider, Element element, this.name)
-      : unitCache = new ResolvedUnitCache(astProvider),
-        isRename = true,
+      this.searchEngine, this.sessionHelper, Element element, this.name)
+      : isRename = true,
         library = element.library,
         element = element,
         elementClass = element.enclosingElement,
@@ -260,12 +263,13 @@
     Future<List<LocalElement>> getLocalElements(Element element) async {
       // TODO(brianwilkerson) Determine whether this await is necessary.
       await null;
-      var unitElement = unitCache.getUnitElement(element);
+
+      var resolvedUnit = await sessionHelper.getResolvedUnitByElement(element);
+      var unitElement = resolvedUnit.unit.declaredElement;
       var localElements = localElementMap[unitElement];
       if (localElements == null) {
-        var unit = await unitCache.getUnit(unitElement);
         var collector = new _LocalElementsCollector(name);
-        unit.accept(collector);
+        resolvedUnit.unit.accept(collector);
         localElements = collector.elements;
         localElementMap[unitElement] = localElements;
       }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index 755ebff..e8d7555 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,9 +14,10 @@
 import 'package:analysis_server/src/services/search/hierarchy.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -25,10 +26,10 @@
  * A [Refactoring] for renaming [ConstructorElement]s.
  */
 class RenameConstructorRefactoringImpl extends RenameRefactoringImpl {
-  final AstProvider astProvider;
+  final AnalysisSession session;
 
-  RenameConstructorRefactoringImpl(RefactoringWorkspace workspace,
-      this.astProvider, ConstructorElement element)
+  RenameConstructorRefactoringImpl(
+      RefactoringWorkspace workspace, this.session, ConstructorElement element)
       : super(workspace, element);
 
   @override
@@ -117,11 +118,12 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     ClassElement classElement = element.enclosingElement;
-    AstNode name = await astProvider.getResolvedNameForElement(classElement);
-    ClassDeclaration classNode = name.parent as ClassDeclaration;
-    CorrectionUtils utils = new CorrectionUtils(classNode.parent);
-    ClassMemberLocation location =
-        utils.prepareNewConstructorLocation(classNode);
+
+    var result = await AnalysisSessionHelper(session)
+        .getElementDeclaration(classElement);
+    ClassDeclaration classNode = result.node;
+    var utils = new CorrectionUtils(result.resolvedUnit);
+    var location = utils.prepareNewConstructorLocation(classNode);
     doSourceChange_addElementEdit(
         change,
         classElement,
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 53e382b..aebeba1 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -11,12 +11,10 @@
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analysis_server/src/services/refactoring/rename.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
-import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 
@@ -24,10 +22,10 @@
  * A [Refactoring] for renaming [ImportElement]s.
  */
 class RenameImportRefactoringImpl extends RenameRefactoringImpl {
-  final AstProvider astProvider;
+  final AnalysisSession session;
 
   RenameImportRefactoringImpl(
-      RefactoringWorkspace workspace, this.astProvider, ImportElement element)
+      RefactoringWorkspace workspace, this.session, ImportElement element)
       : super(workspace, element);
 
   @override
@@ -60,14 +58,14 @@
       PrefixElement prefix = element.prefix;
       SourceEdit edit = null;
       if (newName.isEmpty) {
-        ImportDirective node = await _findNode();
+        ImportDirective node = _findNode();
         int uriEnd = node.uri.end;
         int prefixEnd = element.prefixOffset + prefix.nameLength;
         edit = newSourceEdit_range(
             range.startOffsetEndOffset(uriEnd, prefixEnd), "");
       } else {
         if (prefix == null) {
-          ImportDirective node = await _findNode();
+          ImportDirective node = _findNode();
           int uriEnd = node.uri.end;
           edit =
               newSourceEdit_range(new SourceRange(uriEnd, 0), " as $newName");
@@ -89,7 +87,7 @@
         reference.addEdit(change, '');
       } else {
         SimpleIdentifier interpolationIdentifier =
-            await _getInterpolationIdentifier(reference);
+            _getInterpolationIdentifier(reference);
         if (interpolationIdentifier != null) {
           doSourceChange_addElementEdit(
               change,
@@ -108,11 +106,10 @@
   /**
    * Return the [ImportDirective] node that corresponds to the [element].
    */
-  Future<ImportDirective> _findNode() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+  ImportDirective _findNode() {
     LibraryElement library = element.library;
-    CompilationUnit unit = await astProvider.getParsedUnitForElement(library);
+    String path = library.source.fullName;
+    CompilationUnit unit = session.getParsedUnit(path).unit;
     int index = library.imports.indexOf(element);
     return unit.directives.where((d) => d is ImportDirective).toList()[index];
   }
@@ -122,14 +119,9 @@
    * an [InterpolationExpression] without surrounding curly brackets, return it.
    * Otherwise return `null`.
    */
-  Future<SimpleIdentifier> _getInterpolationIdentifier(
-      SourceReference reference) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+  SimpleIdentifier _getInterpolationIdentifier(SourceReference reference) {
     Source source = reference.element.source;
-    AnalysisSession currentSession = astProvider.driver.currentSession;
-    ParseResult result = await currentSession.getParsedAst(source.fullName);
-    CompilationUnit unit = result.unit;
+    CompilationUnit unit = session.getParsedUnit(source.fullName).unit;
     NodeLocator nodeLocator = new NodeLocator(reference.range.offset);
     AstNode node = nodeLocator.searchWithin(unit);
     if (node is SimpleIdentifier) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
index 643be1f..7dbe5bb 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -39,7 +39,7 @@
 
   @override
   Future<void> fillChange() {
-    var processor = new RenameProcessor(searchEngine, change, newName);
+    var processor = new RenameProcessor(workspace, change, newName);
     return processor.renameElement(element);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
index e270f82..cb88700 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -41,7 +41,7 @@
 
   @override
   Future<void> fillChange() async {
-    var processor = new RenameProcessor(searchEngine, change, newName);
+    var processor = new RenameProcessor(workspace, change, newName);
     await processor.renameElement(element);
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index 369b832..7fac53a 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -15,21 +15,20 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 /**
  * A [Refactoring] for renaming [LocalElement]s.
  */
 class RenameLocalRefactoringImpl extends RenameRefactoringImpl {
-  final AstProvider astProvider;
-  final ResolvedUnitCache unitCache;
+  final AnalysisSessionHelper sessionHelper;
 
   List<LocalElement> elements = [];
 
   RenameLocalRefactoringImpl(
-      RefactoringWorkspace workspace, this.astProvider, LocalElement element)
-      : unitCache = new ResolvedUnitCache(astProvider),
+      RefactoringWorkspace workspace, LocalElement element)
+      : sessionHelper = AnalysisSessionHelper(element.session),
         super(workspace, element);
 
   @override
@@ -53,10 +52,9 @@
     RefactoringStatus result = new RefactoringStatus();
     await _prepareElements();
     for (LocalElement element in elements) {
-      CompilationUnit unit = await unitCache.getUnit(element);
-      if (unit != null) {
-        unit.accept(new _ConflictValidatorVisitor(result, newName, element));
-      }
+      var resolvedUnit = await sessionHelper.getResolvedUnitByElement(element);
+      var unit = resolvedUnit.unit;
+      unit.accept(new _ConflictValidatorVisitor(result, newName, element));
     }
     return result;
   }
@@ -76,7 +74,7 @@
 
   @override
   Future<void> fillChange() async {
-    var processor = new RenameProcessor(searchEngine, change, newName);
+    var processor = new RenameProcessor(workspace, change, newName);
     for (Element element in elements) {
       processor.addDeclarationEdit(element);
       var references = await searchEngine.searchReferences(element);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index 88cac3a..cb8683f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -127,7 +127,7 @@
     }
 
     // Rename each element and references to it.
-    var processor = new RenameProcessor(searchEngine, change, newName);
+    var processor = new RenameProcessor(workspace, change, newName);
     for (var element in elements) {
       await processor.renameElement(element);
     }
@@ -136,7 +136,7 @@
     if (_flutterWidgetState != null) {
       _updateFlutterWidgetStateName();
       await new RenameProcessor(
-        searchEngine,
+        workspace,
         change,
         _flutterWidgetStateNewName,
       ).renameElement(_flutterWidgetState);
diff --git a/pkg/analysis_server/lib/src/services/search/element_visitors.dart b/pkg/analysis_server/lib/src/services/search/element_visitors.dart
index 560edbb7..8dc34d9 100644
--- a/pkg/analysis_server/lib/src/services/search/element_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/search/element_visitors.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 8862eda..5689c32 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine.dart b/pkg/analysis_server/lib/src/services/search/search_engine.dart
index df6e31c..aa5aec9 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -140,7 +140,7 @@
   MatchKind get kind;
 
   /**
-   * Return the [LibraryElement] for the [libraryUri] in the [context].
+   * Return the [LibraryElement] for the [file].
    */
   LibraryElement get libraryElement;
 
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index f16268b..2868b74 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 9e22d01..b9cdaf0 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -1,10 +1,11 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/analysis_server_abstract.dart';
 import 'package:analysis_server/src/channel/channel.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
@@ -13,13 +14,18 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/plugin/resolver_provider.dart';
 
+abstract class AbstractSocketServer {
+  AnalysisServerOptions get analysisServerOptions;
+  AbstractAnalysisServer get analysisServer;
+}
+
 /**
  * Instances of the class [SocketServer] implement the common parts of
  * http-based and stdio-based analysis servers.  The primary responsibility of
  * the SocketServer is to manage the lifetime of the AnalysisServer and to
  * encode and decode the JSON messages exchanged with the client.
  */
-class SocketServer {
+class SocketServer implements AbstractSocketServer {
   final AnalysisServerOptions analysisServerOptions;
 
   /**
diff --git a/pkg/analysis_server/lib/src/status/ast_writer.dart b/pkg/analysis_server/lib/src/status/ast_writer.dart
index 5458b27..060cf6f 100644
--- a/pkg/analysis_server/lib/src/status/ast_writer.dart
+++ b/pkg/analysis_server/lib/src/status/ast_writer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 56423be..793b9c3 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,10 +7,14 @@
 import 'dart:developer' as developer;
 import 'dart:io';
 
+import 'package:analysis_server/protocol/protocol_constants.dart'
+    show PROTOCOL_VERSION;
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/analysis_server_abstract.dart';
 import 'package:analysis_server/src/domain_completion.dart';
-import 'package:analysis_server/src/domain_diagnostic.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart'
+    show LspAnalysisServer;
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/server/http_server.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
@@ -19,12 +23,12 @@
 import 'package:analysis_server/src/status/element_writer.dart';
 import 'package:analysis_server/src/status/pages.dart';
 import 'package:analysis_server/src/utilities/profiling.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
 import 'package:analyzer/src/generated/sdk.dart';
@@ -144,6 +148,8 @@
 }
 ''';
 
+/// TODO(devoncarew): We're not currently tracking the time spent in specific
+/// lints by default (analysisOptions / driverOptions enableTiming)
 final bool _showLints = false;
 
 String get _sdkVersion {
@@ -158,164 +164,20 @@
   return '$name: <code>$value</code><br> ';
 }
 
-class AstPage extends DiagnosticPageWithNav {
-  String _description;
-
-  AstPage(DiagnosticsSite site)
-      : super(site, 'ast', 'AST', description: 'The AST for a file.');
-
-  @override
-  String get description => _description ?? super.description;
-
-  @override
-  bool get showInNav => false;
-
-  @override
-  Future<void> generateContent(Map<String, String> params) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    String path = params['file'];
-    if (path == null) {
-      p('No file path provided.');
-      return;
-    }
-    AnalysisDriver driver = server.getAnalysisDriver(path);
-    if (driver == null) {
-      p('The file <code>${escape(path)}</code> is not being analyzed.',
-          raw: true);
-      return;
-    }
-    AnalysisResult result = await driver.getResult(path);
-    if (result == null) {
-      p(
-          'An AST could not be produced for the file '
-          '<code>${escape(path)}</code>.',
-          raw: true);
-      return;
-    }
-
-    AstWriter writer = new AstWriter(buf);
-    result.unit.accept(writer);
-  }
-
-  @override
-  Future<void> generatePage(Map<String, String> params) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    try {
-      _description = params['file'];
-      await super.generatePage(params);
-    } finally {
-      _description = null;
-    }
-  }
-}
-
-class CommunicationsPage extends DiagnosticPageWithNav {
-  CommunicationsPage(DiagnosticsSite site)
-      : super(site, 'communications', 'Communications',
-            description:
-                'Latency statistics for analysis server communications.');
-
-  @override
-  Future generateContent(Map<String, String> params) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    void writeRow(List<String> data, {List<String> classes}) {
-      buf.write("<tr>");
-      for (int i = 0; i < data.length; i++) {
-        String c = classes == null ? null : classes[i];
-        if (c != null) {
-          buf.write('<td class="$c">${escape(data[i])}</td>');
-        } else {
-          buf.write('<td>${escape(data[i])}</td>');
-        }
-      }
-      buf.writeln("</tr>");
-    }
-
-    buf.writeln('<div class="columns">');
-
-    ServerPerformance perf = server.performanceAfterStartup;
-    if (perf != null) {
-      buf.writeln('<div class="column one-half">');
-      h3('Current');
-
-      int requestCount = perf.requestCount;
-      int averageLatency =
-          requestCount > 0 ? (perf.requestLatency ~/ requestCount) : 0;
-      int maximumLatency = perf.maxLatency;
-      double slowRequestPercent =
-          requestCount > 0 ? (perf.slowRequestCount / requestCount) : 0.0;
-
-      buf.write('<table>');
-      writeRow([printInteger(requestCount), 'requests'],
-          classes: ["right", null]);
-      writeRow([printMilliseconds(averageLatency), 'average latency'],
-          classes: ["right", null]);
-      writeRow([printMilliseconds(maximumLatency), 'maximum latency'],
-          classes: ["right", null]);
-      writeRow([printPercentage(slowRequestPercent), '> 150 ms latency'],
-          classes: ["right", null]);
-      buf.write('</table>');
-
-      String time = server.uptime.toString();
-      if (time.contains('.')) {
-        time = time.substring(0, time.indexOf('.'));
-      }
-      buf.writeln(writeOption('Uptime', time));
-
-      buf.write('</div>');
-    }
-
-    buf.writeln('<div class="column one-half">');
-    h3('Startup');
-    perf = server.performanceDuringStartup;
-
-    int requestCount = perf.requestCount;
-    int averageLatency =
-        requestCount > 0 ? (perf.requestLatency ~/ requestCount) : 0;
-    int maximumLatency = perf.maxLatency;
-    double slowRequestPercent =
-        requestCount > 0 ? (perf.slowRequestCount / requestCount) : 0.0;
-
-    buf.write('<table>');
-    writeRow([printInteger(requestCount), 'requests'],
-        classes: ["right", null]);
-    writeRow([printMilliseconds(averageLatency), 'average latency'],
-        classes: ["right", null]);
-    writeRow([printMilliseconds(maximumLatency), 'maximum latency'],
-        classes: ["right", null]);
-    writeRow([printPercentage(slowRequestPercent), '> 150 ms latency'],
-        classes: ["right", null]);
-    buf.write('</table>');
-
-    if (server.performanceAfterStartup != null) {
-      int startupTime =
-          server.performanceAfterStartup.startTime - perf.startTime;
-      buf.writeln(
-          writeOption('Initial analysis time', printMilliseconds(startupTime)));
-    }
-    buf.write('</div>');
-
-    buf.write('</div>');
-  }
-}
-
-class CompletionPage extends DiagnosticPageWithNav {
-  CompletionPage(DiagnosticsSite site)
+abstract class AbstractCompletionPage extends DiagnosticPageWithNav {
+  AbstractCompletionPage(DiagnosticsSite site)
       : super(site, 'completion', 'Code Completion',
             description: 'Latency statistics for code completion.');
 
+  pathPackage.Context get pathContext;
+  List<CompletionPerformance> get performanceItems;
+
   @override
   Future generateContent(Map<String, String> params) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    CompletionDomainHandler completionDomain = server.handlers
-        .firstWhere((handler) => handler is CompletionDomainHandler);
 
-    List<CompletionPerformance> completions =
-        completionDomain.performanceList.items.toList();
+    List<CompletionPerformance> completions = performanceItems;
 
     if (completions.isEmpty) {
       blankslate('No completions recorded.');
@@ -357,7 +219,6 @@
     buf.writeln('<table>');
     buf.writeln(
         '<tr><th>Time</th><th>Results</th><th>Source</th><th>Snippet</th></tr>');
-    var pathContext = completionDomain.server.resourceProvider.pathContext;
     for (CompletionPerformance completion in completions) {
       String shortName = pathContext.basename(completion.path);
       buf.writeln('<tr>'
@@ -371,6 +232,161 @@
   }
 }
 
+class AstPage extends DiagnosticPageWithNav {
+  String _description;
+
+  AstPage(DiagnosticsSite site)
+      : super(site, 'ast', 'AST', description: 'The AST for a file.');
+
+  @override
+  String get description => _description ?? super.description;
+
+  @override
+  bool get showInNav => false;
+
+  @override
+  Future<void> generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    String path = params['file'];
+    if (path == null) {
+      p('No file path provided.');
+      return;
+    }
+    AnalysisDriver driver = server.getAnalysisDriver(path);
+    if (driver == null) {
+      p('The file <code>${escape(path)}</code> is not being analyzed.',
+          raw: true);
+      return;
+    }
+    ResolvedUnitResult result = await driver.getResult(path);
+    if (result == null) {
+      p(
+          'An AST could not be produced for the file '
+          '<code>${escape(path)}</code>.',
+          raw: true);
+      return;
+    }
+
+    AstWriter writer = new AstWriter(buf);
+    result.unit.accept(writer);
+  }
+
+  @override
+  Future<void> generatePage(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+    try {
+      _description = params['file'];
+      await super.generatePage(params);
+    } finally {
+      _description = null;
+    }
+  }
+}
+
+class CommunicationsPage extends DiagnosticPageWithNav {
+  CommunicationsPage(DiagnosticsSite site)
+      : super(site, 'communications', 'Communications',
+            description:
+                'Latency statistics for analysis server communications.');
+
+  @override
+  Future generateContent(Map<String, String> params) async {
+    // TODO(brianwilkerson) Determine whether this await is necessary.
+    await null;
+
+    void writeRow(List<String> data, {List<String> classes}) {
+      buf.write("<tr>");
+      for (int i = 0; i < data.length; i++) {
+        String c = classes == null ? null : classes[i];
+        if (c != null) {
+          buf.write('<td class="$c">${escape(data[i])}</td>');
+        } else {
+          buf.write('<td>${escape(data[i])}</td>');
+        }
+      }
+      buf.writeln("</tr>");
+    }
+
+    buf.writeln('<div class="columns">');
+
+    if (server.performanceAfterStartup != null) {
+      buf.writeln('<div class="column one-half">');
+
+      h3('Current');
+      _writePerformanceTable(server.performanceAfterStartup, writeRow);
+
+      String time = server.uptime.toString();
+      if (time.contains('.')) {
+        time = time.substring(0, time.indexOf('.'));
+      }
+      buf.writeln(writeOption('Uptime', time));
+
+      buf.write('</div>');
+    }
+
+    buf.writeln('<div class="column one-half">');
+
+    h3('Startup');
+    _writePerformanceTable(server.performanceDuringStartup, writeRow);
+
+    if (server.performanceAfterStartup != null) {
+      int startupTime = server.performanceAfterStartup.startTime -
+          server.performanceDuringStartup.startTime;
+      buf.writeln(
+          writeOption('Initial analysis time', printMilliseconds(startupTime)));
+    }
+
+    buf.write('</div>');
+
+    buf.write('</div>');
+  }
+
+  void _writePerformanceTable(ServerPerformance perf,
+      void writeRow(List<String> data, {List<String> classes})) {
+    int requestCount = perf.requestCount;
+    int latencyCount = perf.latencyCount;
+    int averageLatency =
+        latencyCount > 0 ? (perf.requestLatency ~/ latencyCount) : 0;
+    int maximumLatency = perf.maxLatency;
+    double slowRequestPercent =
+        latencyCount > 0 ? (perf.slowRequestCount / latencyCount) : 0.0;
+
+    buf.write('<table>');
+    writeRow([printInteger(requestCount), 'requests'],
+        classes: ["right", null]);
+    writeRow([printInteger(latencyCount), 'requests with latency information'],
+        classes: ["right", null]);
+    if (latencyCount > 0) {
+      writeRow([printMilliseconds(averageLatency), 'average latency'],
+          classes: ["right", null]);
+      writeRow([printMilliseconds(maximumLatency), 'maximum latency'],
+          classes: ["right", null]);
+      writeRow([printPercentage(slowRequestPercent), '> 150 ms latency'],
+          classes: ["right", null]);
+    }
+    buf.write('</table>');
+  }
+}
+
+class CompletionPage extends AbstractCompletionPage {
+  @override
+  AnalysisServer server;
+  CompletionPage(DiagnosticsSite site, this.server) : super(site);
+
+  CompletionDomainHandler get completionDomain => server.handlers
+      .firstWhere((handler) => handler is CompletionDomainHandler);
+
+  @override
+  pathPackage.Context get pathContext =>
+      completionDomain.server.resourceProvider.pathContext;
+
+  @override
+  List<CompletionPerformance> get performanceItems =>
+      completionDomain.performanceList.items.toList();
+}
+
 class ContextsPage extends DiagnosticPageWithNav {
   ContextsPage(DiagnosticsSite site)
       : super(site, 'contexts', 'Contexts',
@@ -385,7 +401,6 @@
     b.write(writeOption('Strong mode', options.strongMode));
     b.write(writeOption('Implicit dynamic', options.implicitDynamic));
     b.write(writeOption('Implicit casts', options.implicitCasts));
-    b.write(writeOption('Declaration casts', options.declarationCasts));
 
     b.write(
         writeOption('Analyze function bodies', options.analyzeFunctionBodies));
@@ -398,6 +413,8 @@
     b.write(writeOption('Preserve comments', options.preserveComments));
     b.write(writeOption('Strong mode hints', options.strongModeHints));
 
+    b.write(writeOption('Enabled experiments', options.enabledExperiments));
+
     return b.toString();
   }
 
@@ -573,15 +590,14 @@
 
 /// A page with a proscriptive notion of layout.
 abstract class DiagnosticPage extends Page {
-  final Site site;
+  final DiagnosticsSite site;
 
   DiagnosticPage(this.site, String id, String title, {String description})
       : super(id, title, description: description);
 
   bool get isNavPage => false;
 
-  AnalysisServer get server =>
-      (site as DiagnosticsSite).socketServer.analysisServer;
+  AbstractAnalysisServer get server => site.socketServer.analysisServer;
 
   Future<void> generateContainer(Map<String, String> params) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
@@ -659,7 +675,7 @@
 }
 
 abstract class DiagnosticPageWithNav extends DiagnosticPage {
-  DiagnosticPageWithNav(Site site, String id, String title,
+  DiagnosticPageWithNav(DiagnosticsSite site, String id, String title,
       {String description})
       : super(site, id, title, description: description);
 
@@ -709,23 +725,31 @@
 class DiagnosticsSite extends Site implements AbstractGetHandler {
   /// An object that can handle either a WebSocket connection or a connection
   /// to the client over stdio.
-  SocketServer socketServer;
+  AbstractSocketServer socketServer;
 
   /// The last few lines printed.
-  List<String> lastPrintedLines = <String>[];
+  final List<String> lastPrintedLines;
 
   DiagnosticsSite(this.socketServer, this.lastPrintedLines)
       : super('Analysis Server') {
-    pages.add(new CompletionPage(this));
     pages.add(new CommunicationsPage(this));
     pages.add(new ContextsPage(this));
     pages.add(new EnvironmentVariablesPage(this));
     pages.add(new ExceptionsPage(this));
     pages.add(new InstrumentationPage(this));
-    pages.add(new OverlaysPage(this));
-    pages.add(new PluginsPage(this));
     pages.add(new ProfilePage(this));
-    pages.add(new SubscriptionsPage(this));
+
+    // Add server-specific pages. Ordering doesn't matter as the items are
+    // sorted later.
+    final server = this.socketServer.analysisServer;
+    if (server is AnalysisServer) {
+      pages.add(new CompletionPage(this, server));
+      pages.add(new PluginsPage(this, server));
+      pages.add(new SubscriptionsPage(this, server));
+    } else if (server is LspAnalysisServer) {
+      pages.add(new LspCompletionPage(this, server));
+      pages.add(new LspCapabilitiesPage(this, server));
+    }
 
     ProcessProfiler profiler = ProcessProfiler.getProfilerForPlatform();
     if (profiler != null) {
@@ -781,7 +805,7 @@
           raw: true);
       return;
     }
-    AnalysisResult result = await driver.getResult(path);
+    ResolvedUnitResult result = await driver.getResult(path);
     if (result == null) {
       p(
           'An element model could not be produced for the file '
@@ -830,7 +854,7 @@
 class ExceptionPage extends DiagnosticPage {
   final StackTrace trace;
 
-  ExceptionPage(Site site, String message, this.trace)
+  ExceptionPage(DiagnosticsSite site, String message, this.trace)
       : super(site, '', '500 Oops', description: message);
 
   Future generateContent(Map<String, String> params) async {
@@ -947,6 +971,51 @@
   }
 }
 
+class LspCapabilitiesPage extends DiagnosticPageWithNav {
+  @override
+  LspAnalysisServer server;
+
+  LspCapabilitiesPage(DiagnosticsSite site, this.server)
+      : super(site, 'lsp_capabilities', 'LSP Capabilities',
+            description: 'Client and Server LSP Capabilities.');
+
+  @override
+  Future generateContent(Map<String, String> params) async {
+    buf.writeln('<div class="columns">');
+
+    buf.writeln('<div class="column one-half">');
+    h3('Client Capabilities');
+    if (server.clientCapabilities == null) {
+      p('Client capabilities have not yet been received.');
+    } else {
+      prettyJson(server.clientCapabilities.toJson());
+    }
+    buf.writeln('</div>');
+
+    buf.writeln('<div class="column one-half">');
+    h3('Server Capabilities');
+    if (server.capabilities == null) {
+      p('Server capabilities have not yet been computed.');
+    } else {
+      prettyJson(server.capabilities.toJson());
+    }
+    buf.writeln('</div>');
+  }
+}
+
+class LspCompletionPage extends AbstractCompletionPage {
+  @override
+  LspAnalysisServer server;
+  LspCompletionPage(DiagnosticsSite site, this.server) : super(site);
+
+  @override
+  pathPackage.Context get pathContext => server.resourceProvider.pathContext;
+
+  @override
+  List<CompletionPerformance> get performanceItems =>
+      server.performanceStats.completion.items.toList();
+}
+
 class MemoryAndCpuPage extends DiagnosticPageWithNav {
   final ProcessProfiler profiler;
 
@@ -954,11 +1023,6 @@
       : super(site, 'memory', 'Memory and CPU Usage',
             description: 'Memory and CPU usage for the analysis server.');
 
-  DiagnosticDomainHandler get diagnosticDomain {
-    return server.handlers
-        .firstWhere((handler) => handler is DiagnosticDomainHandler);
-  }
-
   @override
   Future generateContent(Map<String, String> params) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
@@ -1022,7 +1086,7 @@
 class NotFoundPage extends DiagnosticPage {
   final String path;
 
-  NotFoundPage(Site site, this.path)
+  NotFoundPage(DiagnosticsSite site, this.path)
       : super(site, '', '404 Not found', description: "'$path' not found.");
 
   Future generateContent(Map<String, String> params) async {
@@ -1031,59 +1095,18 @@
   }
 }
 
-class OverlaysPage extends DiagnosticPageWithNav {
-  OverlaysPage(DiagnosticsSite site)
-      : super(site, 'overlays', 'Overlays',
-            description: 'Editing overlays - unsaved file changes.');
-
-  @override
-  Future generateContent(Map<String, String> params) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    FileContentOverlay overlays = server.fileContentOverlay;
-    List<String> paths = overlays.paths.toList()..sort();
-
-    String overlayPath = params['overlay'];
-    if (overlayPath != null) {
-      p(overlayPath);
-
-      if (overlays[overlayPath] != null) {
-        buf.write('<pre><code>');
-        buf.write(escape(overlays[overlayPath]));
-        buf.writeln('</code></pre>');
-      } else {
-        p('<code>${escape(overlayPath)}</code> not found.', raw: true);
-      }
-
-      return;
-    }
-
-    if (paths.isEmpty) {
-      blankslate('No overlays.');
-    } else {
-      String lenCounter(List list) {
-        return '<span class="counter" style="float: right;">${list.length}</span>';
-      }
-
-      h3('Overlays ${lenCounter(paths)}', raw: true);
-      ul(paths, (String overlayPath) {
-        String uri = '$path?overlay=${Uri.encodeQueryComponent(overlayPath)}';
-        buf.writeln('<a href="$uri">${escape(overlayPath)}</a>');
-      });
-    }
-  }
-}
-
-// TODO(devoncarew): We're not currently tracking the time spent in specific
-// lints by default (analysisOptions / driverOptions enableTiming)
 class PluginsPage extends DiagnosticPageWithNav {
-  PluginsPage(DiagnosticsSite site)
+  @override
+  AnalysisServer server;
+
+  PluginsPage(DiagnosticsSite site, this.server)
       : super(site, 'plugins', 'Plugins', description: 'Plugins in use.');
 
   @override
   Future generateContent(Map<String, String> params) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
+
     h3('Analysis plugins');
     List<PluginInfo> analysisPlugins = server.pluginManager.plugins;
 
@@ -1244,7 +1267,7 @@
   final WebSocket socket;
 
   int _id = 0;
-  Map<String, Completer<Map>> _completers = {};
+  final Map<String, Completer<Map>> _completers = {};
 
   ServiceProtocol._(this.socket) {
     socket.listen(_handleMessage);
@@ -1302,8 +1325,7 @@
 
     buf.writeln('<div class="column one-half">');
     h3('Status');
-    buf.writeln(writeOption('Use fasta parser',
-        diagnosticsSite.socketServer.analysisServerOptions.useFastaParser));
+    buf.writeln(writeOption('Server type', server.runtimeType));
     buf.writeln(writeOption('Instrumentation enabled',
         AnalysisEngine.instance.instrumentationService.isActive));
     bool uxExp1 =
@@ -1319,13 +1341,13 @@
 
     buf.writeln('<div class="column one-half">');
     h3('Versions');
-    buf.writeln(writeOption('Analysis server version', AnalysisServer.VERSION));
+    buf.writeln(writeOption('Analysis server version', PROTOCOL_VERSION));
     buf.writeln(writeOption('Dart SDK', Platform.version));
     buf.writeln('</div>');
 
     buf.writeln('</div>');
 
-    List<String> lines = (site as DiagnosticsSite).lastPrintedLines;
+    List<String> lines = site.lastPrintedLines;
     if (lines.isNotEmpty) {
       h3('Debug output');
       p(lines.join('\n'), style: 'white-space: pre');
@@ -1334,7 +1356,10 @@
 }
 
 class SubscriptionsPage extends DiagnosticPageWithNav {
-  SubscriptionsPage(DiagnosticsSite site)
+  @override
+  AnalysisServer server;
+
+  SubscriptionsPage(DiagnosticsSite site, this.server)
       : super(site, 'subscriptions', 'Subscriptions',
             description: 'Registered subscriptions to analysis server events.');
 
@@ -1342,6 +1367,7 @@
   Future generateContent(Map<String, String> params) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
+
     // server domain
     h3('Server domain subscriptions');
     ul(ServerService.VALUES, (item) {
diff --git a/pkg/analysis_server/lib/src/status/element_writer.dart b/pkg/analysis_server/lib/src/status/element_writer.dart
index 3b6ac79..4e8d3ec 100644
--- a/pkg/analysis_server/lib/src/status/element_writer.dart
+++ b/pkg/analysis_server/lib/src/status/element_writer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/status/pages.dart b/pkg/analysis_server/lib/src/status/pages.dart
index b270a3c..ff199b9 100644
--- a/pkg/analysis_server/lib/src/status/pages.dart
+++ b/pkg/analysis_server/lib/src/status/pages.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -122,6 +122,13 @@
     buf.writeln('</pre>');
   }
 
+  void prettyJson(Map<String, dynamic> data) {
+    const jsonEncoder = const JsonEncoder.withIndent('  ');
+    pre(() {
+      buf.write(jsonEncoder.convert(data));
+    });
+  }
+
   void ul<T>(Iterable<T> items, void gen(T item), {String classes}) {
     buf.writeln('<ul${classes == null ? '' : ' class=$classes'}>');
     for (T item in items) {
@@ -136,7 +143,7 @@
 /// Contains a collection of Pages.
 abstract class Site {
   final String title;
-  List<Page> pages = [];
+  final List<Page> pages = [];
 
   Site(this.title);
 
diff --git a/pkg/analysis_server/lib/src/status/tree_writer.dart b/pkg/analysis_server/lib/src/status/tree_writer.dart
index 9feb8af..130c4ad 100644
--- a/pkg/analysis_server/lib/src/status/tree_writer.dart
+++ b/pkg/analysis_server/lib/src/status/tree_writer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -13,7 +13,7 @@
  * Utility methods that can be mixed in to classes that produce an HTML
  * representation of a tree structure.
  */
-abstract class TreeWriter {
+mixin TreeWriter {
   /**
    * The buffer on which the HTML is to be written.
    */
diff --git a/pkg/analysis_server/lib/src/utilities/documentation.dart b/pkg/analysis_server/lib/src/utilities/documentation.dart
index 2cc837e..b47bb2f 100644
--- a/pkg/analysis_server/lib/src/utilities/documentation.dart
+++ b/pkg/analysis_server/lib/src/utilities/documentation.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index f116530..3c63b01 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -19,6 +19,8 @@
 const _STATE_NAME = "State";
 const _STATEFUL_WIDGET_NAME = "StatefulWidget";
 const _STATELESS_WIDGET_NAME = "StatelessWidget";
+const _STREAM_BUILDER_NAME = "StreamBuilder";
+const _STREAM_BUILDER_URI = "package:flutter/src/widgets/async.dart";
 const _WIDGET_NAME = "Widget";
 const _WIDGET_URI = "package:flutter/src/widgets/framework.dart";
 final _frameworkUri = Uri.parse('package:flutter/src/widgets/framework.dart');
@@ -307,6 +309,14 @@
 }
 
 /**
+ * Return `true` if the given [type] is the Flutter class `StreamBuilder`.
+ */
+bool isExactWidgetTypeStreamBuilder(DartType type) {
+  return type is InterfaceType &&
+      _isExactWidget(type.element, _STREAM_BUILDER_NAME, _STREAM_BUILDER_URI);
+}
+
+/**
  * Return `true` if the given [type] is the Flutter class `Widget`, or its
  * subtype.
  */
diff --git a/pkg/analysis_server/lib/src/utilities/null_string_sink.dart b/pkg/analysis_server/lib/src/utilities/null_string_sink.dart
index 27fef3a..d43c821 100644
--- a/pkg/analysis_server/lib/src/utilities/null_string_sink.dart
+++ b/pkg/analysis_server/lib/src/utilities/null_string_sink.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/src/utilities/profiling.dart b/pkg/analysis_server/lib/src/utilities/profiling.dart
index 7e2e49b..d283e10 100644
--- a/pkg/analysis_server/lib/src/utilities/profiling.dart
+++ b/pkg/analysis_server/lib/src/utilities/profiling.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -12,8 +12,6 @@
 
   Future<UsageInfo> getProcessUsage(int processId);
 
-  UsageInfo getProcessUsageSync(int processId);
-
   /// Return a [ProcessProfiler] instance suitable for the current host
   /// platform. This can return `null` if we're not able to gather memory and
   /// cpu information for the current platform.
@@ -65,17 +63,6 @@
     }
   }
 
-  UsageInfo getProcessUsageSync(int processId) {
-    try {
-      // Execution time is typically 2-4ms.
-      ProcessResult result =
-          Process.runSync('ps', ['-o', '%cpu=,rss=', processId.toString()]);
-      return result.exitCode == 0 ? _parse(result.stdout) : null;
-    } catch (e) {
-      return null;
-    }
-  }
-
   UsageInfo _parse(String psResults) {
     try {
       // "  0.0 378940"
diff --git a/pkg/analysis_server/lib/src/watch_manager.dart b/pkg/analysis_server/lib/src/watch_manager.dart
index 8a3fc97..f7bd8c9 100644
--- a/pkg/analysis_server/lib/src/watch_manager.dart
+++ b/pkg/analysis_server/lib/src/watch_manager.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/lib/starter.dart b/pkg/analysis_server/lib/starter.dart
index aa4a30e..170c4b8 100644
--- a/pkg/analysis_server/lib/starter.dart
+++ b/pkg/analysis_server/lib/starter.dart
@@ -1,8 +1,7 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
 import 'package:analysis_server/src/server/driver.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -47,10 +46,6 @@
 
   /**
    * Use the given command-line [arguments] to start this server.
-   *
-   * At least temporarily returns AnalysisServer so that consumers of the
-   * starter API can then use the server, this is done as a stopgap for the
-   * angular plugin until the official plugin API is finished.
    */
-  AnalysisServer start(List<String> arguments);
+  void start(List<String> arguments);
 }
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
deleted file mode 100644
index f635e39..0000000
--- a/pkg/analysis_server/pubspec.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-name: analysis_server
-publish_to: none
-description: A server that performs analysis of Dart code over character streams using JSON-RPC encoded information.
-dependencies:
-  analyzer: ^0.33.0
-  args: '>=0.13.0 <2.0.0'
-  dart_style: '^1.0.6'
-  intl: ^0.15.0
-  linter: ^0.1.16
-  logging: any
-  package_config: '>=0.1.5 <2.0.0'
-  path: any
-  plugin: ^0.2.0
-  telemetry: ^0.0.1
-  usage: ^3.2.0+1
-  watcher: any
-  yaml: any
-dev_dependencies:
-  html: any
-  test_reflective_loader: ^0.1.8
-  test: ^1.0.0
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index ecbbbb32..2d94d63 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -1,29 +1,25 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
-import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/context_root.dart';
+import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/engine.dart' as engine;
-import 'package:analyzer/src/generated/parser.dart' as analyzer;
-import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 
-import 'mock_sdk.dart';
 import 'src/utilities/flutter_util.dart';
 
 /**
@@ -48,25 +44,27 @@
  */
 typedef void _ElementVisitorFunction(Element element);
 
-class AbstractContextTest extends Object with ResourceProviderMixin {
-  DartSdk sdk;
-  Map<String, List<Folder>> packageMap;
-  UriResolver resourceResolver;
-
-  StringBuffer _logBuffer = new StringBuffer();
+class AbstractContextTest with ResourceProviderMixin {
   FileContentOverlay fileContentOverlay = new FileContentOverlay();
+
+  AnalysisContextCollection _analysisContextCollection;
   AnalysisDriver _driver;
 
   AnalysisDriver get driver => _driver;
 
+  AnalysisSession get session => driver.currentSession;
+
+  /// The file system specific `/home/test/pubspec.yaml` path.
+  String get testPubspecPath => convertPath('/home/test/pubspec.yaml');
+
   void addFlutterPackage() {
-    addMetaPackageSource();
+    addMetaPackage();
     Folder libFolder = configureFlutterPackage(resourceProvider);
-    packageMap['flutter'] = [libFolder];
-    configureDriver();
+    addTestPackageDependency('flutter', libFolder.parent.path);
   }
 
-  Source addMetaPackageSource() => addPackageSource('meta', 'meta.dart', r'''
+  void addMetaPackage() {
+    addPackageFile('meta', 'meta.dart', r'''
 library meta;
 
 const _IsTest isTest = const _IsTest();
@@ -88,13 +86,15 @@
   const _IsTestGroup();
 }
 ''');
+  }
 
-  Source addPackageSource(String packageName, String filePath, String content) {
-    packageMap[packageName] = [newFolder('/pubcache/$packageName/lib')];
-    File file =
-        newFile('/pubcache/$packageName/lib/$filePath', content: content);
-    configureDriver();
-    return file.createSource();
+  /// Add a new file with the given [pathInLib] to the package with the
+  /// given [packageName].  Then ensure that the test package depends on the
+  /// [packageName].
+  File addPackageFile(String packageName, String pathInLib, String content) {
+    var packagePath = '/.pub-cache/$packageName';
+    addTestPackageDependency(packageName, packagePath);
+    return newFile('$packagePath/lib/$pathInLib', content: content);
   }
 
   Source addSource(String path, String content, [Uri uri]) {
@@ -102,56 +102,72 @@
     Source source = file.createSource(uri);
     driver.addFile(file.path);
     driver.changeFile(file.path);
-    fileContentOverlay[file.path] = content;
     return source;
   }
 
-  /**
-   * Re-configure the driver. This is necessary, for example, after defining a
-   * new package that test code will reference.
-   */
-  void configureDriver() {
-    driver.configure();
+  void addTestPackageDependency(String name, String rootPath) {
+    var packagesFile = getFile('/home/test/.packages');
+    var packagesContent = packagesFile.readAsStringSync();
+
+    // Ignore if there is already the same package dependency.
+    if (packagesContent.contains('$name:file://')) {
+      return;
+    }
+
+    rootPath = convertPath(rootPath);
+    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
+
+    packagesFile.writeAsStringSync(packagesContent);
+
+    createAnalysisContexts();
   }
 
-  void configurePreviewDart2() {
-    driver.configure(
-        analysisOptions: new AnalysisOptionsImpl.from(driver.analysisOptions)
-          ..previewDart2 = true);
+  /// Create all analysis contexts in `/home`.
+  void createAnalysisContexts() {
+    _analysisContextCollection = AnalysisContextCollectionImpl(
+      includedPaths: [convertPath('/home')],
+      enableIndex: true,
+      fileContentOverlay: fileContentOverlay,
+      resourceProvider: resourceProvider,
+      sdkPath: convertPath('/sdk'),
+    );
+
+    var testPath = convertPath('/home/test');
+    _driver = getDriver(testPath);
   }
 
-  void processRequiredPlugins() {
-    AnalysisEngine.instance.processRequiredPlugins();
+  /// Return the existing analysis context that should be used to analyze the
+  /// given [path], or throw [StateError] if the [path] is not analyzed in any
+  /// of the created analysis contexts.
+  AnalysisContext getContext(String path) {
+    path = convertPath(path);
+    return _analysisContextCollection.contextFor(path);
+  }
+
+  /// Return the existing analysis driver that should be used to analyze the
+  /// given [path], or throw [StateError] if the [path] is not analyzed in any
+  /// of the created analysis contexts.
+  AnalysisDriver getDriver(String path) {
+    DriverBasedAnalysisContext context = getContext(path);
+    return context.driver;
   }
 
   Future<CompilationUnit> resolveLibraryUnit(Source source) async {
-    return (await driver.getResult(source.fullName))?.unit;
+    var resolveResult = await session.getResolvedUnit(source.fullName);
+    return resolveResult.unit;
   }
 
   void setUp() {
-    processRequiredPlugins();
     setupResourceProvider();
-    sdk = new MockSdk(resourceProvider: resourceProvider);
-    resourceResolver = new ResourceUriResolver(resourceProvider);
-    packageMap = new Map<String, List<Folder>>();
-    PackageMapUriResolver packageResolver =
-        new PackageMapUriResolver(resourceProvider, packageMap);
-    SourceFactory sourceFactory = new SourceFactory(
-        [new DartUriResolver(sdk), packageResolver, resourceResolver]);
-    PerformanceLog log = new PerformanceLog(_logBuffer);
-    AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log);
-    _driver = new AnalysisDriver(
-        scheduler,
-        log,
-        resourceProvider,
-        new MemoryByteStore(),
-        fileContentOverlay,
-        new ContextRoot(resourceProvider.convertPath('/project'), [],
-            pathContext: resourceProvider.pathContext),
-        sourceFactory,
-        new AnalysisOptionsImpl()..useFastaParser = analyzer.Parser.useFasta);
-    scheduler.start();
-    AnalysisEngine.instance.logger = PrintLogger.instance;
+
+    new MockSdk(resourceProvider: resourceProvider);
+
+    newFolder('/home/test');
+    newFile('/home/test/.packages', content: r'''
+test:file:///home/test/lib
+''');
+
+    createAnalysisContexts();
   }
 
   void setupResourceProvider() {}
@@ -160,28 +176,11 @@
     AnalysisEngine.instance.clearCaches();
     AnalysisEngine.instance.logger = null;
   }
-}
 
-/**
- * Instances of the class [PrintLogger] print all of the errors.
- */
-class PrintLogger implements Logger {
-  static final Logger instance = new PrintLogger();
-
-  @override
-  void logError(String message, [CaughtException exception]) {
-    print(message);
-    if (exception != null) {
-      print(exception);
-    }
-  }
-
-  @override
-  void logInformation(String message, [CaughtException exception]) {
-    print(message);
-    if (exception != null) {
-      print(exception);
-    }
+  /// Update `/home/test/pubspec.yaml` and create the driver.
+  void updateTestPubspecFile(String content) {
+    newFile(testPubspecPath, content: content);
+    createAnalysisContexts();
   }
 }
 
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 78e2280..b0901725 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -1,14 +1,14 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -23,7 +23,7 @@
   String testCode;
   String testFile;
   Source testSource;
-  AnalysisResult testAnalysisResult;
+  ResolvedUnitResult testAnalysisResult;
   CompilationUnit testUnit;
   CompilationUnitElement testUnitElement;
   LibraryElement testLibraryElement;
@@ -64,7 +64,7 @@
   AstNode findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) {
     AstNode result = new NodeLocator(offset).searchWithin(testUnit);
     if (result != null && predicate != null) {
-      result = result.getAncestor(predicate);
+      result = result.thisOrAncestorMatching(predicate);
     }
     return result;
   }
@@ -112,7 +112,7 @@
 
   Future<void> resolveTestUnit(String code) async {
     addTestSource(code);
-    testAnalysisResult = await driver.getResult(convertPath(testFile));
+    testAnalysisResult = await session.getResolvedUnit(testFile);
     testUnit = testAnalysisResult.unit;
     if (verifyNoTestUnitErrors) {
       expect(testAnalysisResult.errors.where((AnalysisError error) {
@@ -132,7 +132,7 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = resourceProvider.convertPath('/project/test.dart');
+    testFile = convertPath('/home/test/lib/test.dart');
   }
 }
 
diff --git a/pkg/analysis_server/test/analysis/get_errors_test.dart b/pkg/analysis_server/test/analysis/get_errors_test.dart
index 8649fcc..db150ad 100644
--- a/pkg/analysis_server/test/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/get_errors_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -67,13 +67,6 @@
   }
 
   @failingTest
-  test_fileDoesNotExist() {
-    // Broken under the new driver.
-    String file = convertPath('$projectPath/doesNotExist.dart');
-    return _checkInvalid(file);
-  }
-
-  @failingTest
   test_fileWithoutContext() {
     // Broken under the new driver.
     String file = convertPath('/outside.dart');
@@ -112,25 +105,6 @@
     expect(errors, isEmpty);
   }
 
-  @failingTest
-  test_removeContextAfterRequest() async {
-    // Broken under the new driver.
-    addTestFile('''
-main() {
-  print(42)
-}
-''');
-    // handle the request synchronously
-    Request request = _createGetErrorsRequest(testFile);
-    server.handleRequest(request);
-    // remove context, causes sending an "invalid file" error
-    deleteFolder(projectPath);
-    // wait for an error response
-    Response response = await serverChannel.waitForResponse(request);
-    expect(response.error, isNotNull);
-    expect(response.error.code, RequestErrorCode.GET_ERRORS_INVALID_FILE);
-  }
-
   Future _checkInvalid(String file) async {
     Request request = _createGetErrorsRequest(file);
     Response response = await serverChannel.sendRequest(request);
diff --git a/pkg/analysis_server/test/analysis/get_hover_test.dart b/pkg/analysis_server/test/analysis/get_hover_test.dart
index ac43af1..faadc26 100644
--- a/pkg/analysis_server/test/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index 20f6b0f..cc31c34 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -75,7 +75,7 @@
   }
 
   test_fileOutsideOfRoot() async {
-    testFile = resourceProvider.convertPath('/outside.dart');
+    testFile = convertPath('/outside.dart');
     addTestFile('''
 main() {
   var test = 0;
diff --git a/pkg/analysis_server/test/analysis/get_signature_test.dart b/pkg/analysis_server/test/analysis/get_signature_test.dart
index fdf651e..e91c889 100644
--- a/pkg/analysis_server/test/analysis/get_signature_test.dart
+++ b/pkg/analysis_server/test/analysis/get_signature_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -116,6 +116,21 @@
         equals(new ParameterInfo(ParameterKind.NAMED, "length", "int")));
   }
 
+  test_does_not_walk_up_over_closure() async {
+    addTestFile('''
+one(String name, int length) {}
+main() {
+  one("Danny", () {
+    /*^*/
+  });
+}
+''');
+    var result = await prepareRawSignature('/*^*/');
+    expect(result.error, isNotNull);
+    expect(result.error.code,
+        equals(RequestErrorCode.GET_SIGNATURE_UNKNOWN_FUNCTION));
+  }
+
   test_error_file_invalid_path() async {
     var result = await prepareRawSignatureAt(0, file: ':\\/?*');
     expect(result.error, isNotNull);
@@ -125,10 +140,10 @@
 
   test_error_file_not_analyzed() async {
     var result = await prepareRawSignatureAt(0,
-        file: resourceProvider.convertPath('/not/in/project.dart'));
+        file: convertPath('/not/in/project.dart'));
     expect(result.error, isNotNull);
-    expect(result.error.code,
-        equals(RequestErrorCode.GET_SIGNATURE_UNKNOWN_FUNCTION));
+    expect(
+        result.error.code, equals(RequestErrorCode.GET_SIGNATURE_INVALID_FILE));
   }
 
   test_error_function_unknown() async {
@@ -438,19 +453,4 @@
     expect(result.parameters[1],
         equals(new ParameterInfo(ParameterKind.NAMED, "length", "int")));
   }
-
-  test_does_not_walk_up_over_closure() async {
-    addTestFile('''
-one(String name, int length) {}
-main() {
-  one("Danny", () {
-    /*^*/
-  });
-}
-''');
-    var result = await prepareRawSignature('/*^*/');
-    expect(result.error, isNotNull);
-    expect(result.error.code,
-        equals(RequestErrorCode.GET_SIGNATURE_UNKNOWN_FUNCTION));
-  }
 }
diff --git a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
index 90b04f2..4f5ed10 100644
--- a/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_analysis_options_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart b/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
index 305acd3..bd83a7d 100644
--- a/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_analyzedFiles_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_closingLabels_test.dart b/pkg/analysis_server/test/analysis/notification_closingLabels_test.dart
index d09ef04..a8a2d10 100644
--- a/pkg/analysis_server/test/analysis/notification_closingLabels_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_closingLabels_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_errors_test.dart b/pkg/analysis_server/test/analysis/notification_errors_test.dart
index e281b04..a270f6c 100644
--- a/pkg/analysis_server/test/analysis/notification_errors_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_errors_test.dart
@@ -1,13 +1,11 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
-import 'package:analysis_server/src/context_manager.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -102,15 +100,15 @@
     handleSuccessfulRequest(request);
 
     await waitForTasksFinished();
-    List<Linter> lints;
-    AnalysisDriver testDriver = (server.contextManager as ContextManagerImpl)
-        .getContextInfoFor(getFolder(projectPath))
-        .analysisDriver;
-    lints = testDriver.analysisOptions.lintRules;
+
+    var testDriver = server.getAnalysisDriver(testFile);
+    List<Linter> lints = testDriver.analysisOptions.lintRules;
+
     // Registry should only contain single lint rule.
     expect(lints, hasLength(1));
     LintRule lint = lints.first as LintRule;
     expect(lint.name, camelCaseTypesLintName);
+
     // Verify lint error result.
     List<AnalysisError> errors = filesErrors[testFile];
     expect(errors, hasLength(1));
diff --git a/pkg/analysis_server/test/analysis/notification_folding_test.dart b/pkg/analysis_server/test/analysis/notification_folding_test.dart
index 3adbf5b..492718f 100644
--- a/pkg/analysis_server/test/analysis/notification_folding_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_folding_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
index 54793b6..1046cbe 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights2_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test.dart b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
index f36e5d8..030addf 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_implemented_test.dart b/pkg/analysis_server/test/analysis/notification_implemented_test.dart
index ebcd3a7..4401087 100644
--- a/pkg/analysis_server/test/analysis/notification_implemented_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_implemented_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 8035395..7a7aa0f 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_occurrences_test.dart b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
index df66d76..be5f9ff 100644
--- a/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_occurrences_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_outline_test.dart b/pkg/analysis_server/test/analysis/notification_outline_test.dart
index a358bba..c9b26aa 100644
--- a/pkg/analysis_server/test/analysis/notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_outline_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/notification_overrides_test.dart b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
index aa9a69d..dfaec37 100644
--- a/pkg/analysis_server/test/analysis/notification_overrides_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_overrides_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/reanalyze_test.dart b/pkg/analysis_server/test/analysis/reanalyze_test.dart
index 886b200..3d745d7 100644
--- a/pkg/analysis_server/test/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/analysis/reanalyze_test.dart
@@ -1,9 +1,7 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
@@ -23,53 +21,39 @@
 class ReanalyzeTest extends AbstractAnalysisTest {
   Map<String, List<AnalysisError>> filesErrors = {};
 
-  Completer _resultsAvailable = new Completer();
-
   @override
   void processNotification(Notification notification) {
     if (notification.event == ANALYSIS_NOTIFICATION_ERRORS) {
       var decoded = new AnalysisErrorsParams.fromNotification(notification);
       filesErrors[decoded.file] = decoded.errors;
-      _resultsAvailable.complete(null);
     }
   }
 
-  test_reanalyze() {
-    createProject();
-    Map drivers = server.driverMap;
-    expect(drivers, hasLength(1));
-    Request request = new Request("0", ANALYSIS_REQUEST_REANALYZE);
-    handleSuccessfulRequest(request);
-    drivers = server.driverMap;
-    expect(drivers, hasLength(1));
-  }
+  test_reanalyze() async {
+    var b = convertPath('/other/b.dart');
 
-  test_reanalyze_with_overlay() async {
+    newFile(testFile, content: r'''
+import '../../other/b.dart';
+
+B b;
+''');
     createProject();
-    newFolder(testFolder);
-    newFile(testFile, content: 'main() {}');
-    // Update the content with an overlay that contains a syntax error.
-    server.updateContent('1', {testFile: new AddContentOverlay('main() {')});
-    await _resultsAvailable.future;
-    // Verify that the syntax error was detected.
-    {
-      List<AnalysisError> errors = filesErrors[testFile];
-      expect(errors, hasLength(1));
-    }
-    // Remove testFile from filesErrors so that we'll notice when the file is
-    // re-analyzed.
-    filesErrors.remove(testFile);
+
+    // b.dart does not exist, and `B` is unresolved.
+    await waitForTasksFinished();
+    expect(filesErrors[testFile], hasLength(2));
+
+    // Clear errors, so that we'll notice new results.
+    filesErrors.clear();
+
+    // Create b.dart, reanalyzing should fix the error.
+    newFile(b, content: 'class B {}');
+
     // Reanalyze.
-    _resultsAvailable = new Completer();
-    server.reanalyze(null);
-    await _resultsAvailable.future;
-    // The file should have been reanalyzed.
-    expect(filesErrors, contains(testFile));
-    // Verify that the syntax error is present (this indicates that the
-    // content introduced by the call to updateContent is still in effect).
-    {
-      List<AnalysisError> errors = filesErrors[testFile];
-      expect(errors, hasLength(1));
-    }
+    server.reanalyze();
+    await waitForTasksFinished();
+
+    // No errors.
+    expect(filesErrors[testFile], isEmpty);
   }
 }
diff --git a/pkg/analysis_server/test/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/analysis/set_priority_files_test.dart
index 993fb07..bb6530d 100644
--- a/pkg/analysis_server/test/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/analysis/set_priority_files_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/test_all.dart b/pkg/analysis_server/test/analysis/test_all.dart
index 9628319..5b8b7e9 100644
--- a/pkg/analysis_server/test/analysis/test_all.dart
+++ b/pkg/analysis_server/test/analysis/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/analysis/update_content_test.dart b/pkg/analysis_server/test/analysis/update_content_test.dart
index 44161349..5ab9a4e 100644
--- a/pkg/analysis_server/test/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/analysis/update_content_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -128,30 +128,33 @@
   }
 
   test_overlayOnly() async {
-    String filePath = convertPath('/User/project1/test.dart');
-    Folder folder1 = newFolder('/User/project1');
-    Folder folder2 = newFolder('/User/project2');
-    Request request =
-        new AnalysisSetAnalysisRootsParams([folder1.path, folder2.path], [])
-            .toRequest('0');
-    handleSuccessfulRequest(request);
+    var filePath1 = convertPath('/User/project1/test.dart');
+    var filePath2 = convertPath('/User/project2/test.dart');
+    var folderPath1 = newFolder('/User/project1').path;
+    var folderPath2 = newFolder('/User/project2').path;
+
+    handleSuccessfulRequest(new AnalysisSetAnalysisRootsParams(
+      [folderPath1, folderPath2],
+      [],
+    ).toRequest('0'));
+
     // exactly 2 contexts
     expect(server.driverMap, hasLength(2));
-    AnalysisDriver driver1 = server.driverMap[folder1];
-    AnalysisDriver driver2 = server.driverMap[folder2];
+    AnalysisDriver driver1 = server.getAnalysisDriver(filePath1);
+    AnalysisDriver driver2 = server.getAnalysisDriver(filePath2);
+
     // no sources
     expect(_getUserSources(driver1), isEmpty);
     expect(_getUserSources(driver2), isEmpty);
+
     // add an overlay - new Source in context1
-    server.updateContent('1', {filePath: new AddContentOverlay('')});
-    {
-      List<String> paths = _getUserSources(driver1);
-      expect(paths, hasLength(1));
-      expect(paths[0], filePath);
-    }
+    server.updateContent('1', {filePath1: new AddContentOverlay('')});
+    expect(_getUserSources(driver1), [filePath1]);
     expect(_getUserSources(driver2), isEmpty);
+
     // remove the overlay - no sources
-    server.updateContent('2', {filePath: new RemoveContentOverlay()});
+    server.updateContent('2', {filePath1: new RemoveContentOverlay()});
+
     // The file isn't removed from the list of added sources.
 //    expect(_getUserSources(driver1), isEmpty);
     expect(_getUserSources(driver2), isEmpty);
@@ -198,7 +201,7 @@
   }
 
   test_sentToPlugins() {
-    String filePath = '/project/target.dart';
+    String filePath = convertPath('/project/target.dart');
     String fileContent = 'import "none.dart";';
     //
     // Add
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 3610b68..8415bc9 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -18,6 +18,7 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -26,7 +27,6 @@
 import 'package:test/test.dart';
 import 'package:watcher/watcher.dart';
 
-import 'mock_sdk.dart';
 import 'mocks.dart';
 
 int findIdentifierLength(String search) {
@@ -47,7 +47,7 @@
 /**
  * An abstract base for all 'analysis' domain tests.
  */
-class AbstractAnalysisTest extends Object with ResourceProviderMixin {
+class AbstractAnalysisTest with ResourceProviderMixin {
   bool generateSummaryFiles = false;
   MockServerChannel serverChannel;
   TestPluginManager pluginManager;
@@ -120,7 +120,7 @@
         serverChannel,
         resourceProvider,
         options,
-        new DartSdkManager(resourceProvider.convertPath('/'), true),
+        new DartSdkManager(resourceProvider.convertPath('/sdk'), true),
         InstrumentationService.NULL_SERVICE);
   }
 
@@ -194,9 +194,9 @@
 
   void setUp() {
     serverChannel = new MockServerChannel();
-    projectPath = resourceProvider.convertPath('/project');
-    testFolder = resourceProvider.convertPath('/project/bin');
-    testFile = resourceProvider.convertPath('/project/bin/test.dart');
+    projectPath = convertPath('/project');
+    testFolder = convertPath('/project/bin');
+    testFile = convertPath('/project/bin/test.dart');
     pluginManager = new TestPluginManager();
     server = createAnalysisServer();
     server.pluginManager = pluginManager;
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index 789f634..8a9ea74 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -11,15 +11,13 @@
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:plugin/manager.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'mock_sdk.dart';
 import 'mocks.dart';
 
 main() {
@@ -29,7 +27,7 @@
 }
 
 @reflectiveTest
-class AnalysisServerTest extends Object with ResourceProviderMixin {
+class AnalysisServerTest with ResourceProviderMixin {
   MockServerChannel channel;
   AnalysisServer server;
 
@@ -82,13 +80,7 @@
     }
   }
 
-  void processRequiredPlugins() {
-    ExtensionManager manager = new ExtensionManager();
-    manager.processPlugins(AnalysisEngine.instance.requiredPlugins);
-  }
-
   void setUp() {
-    processRequiredPlugins();
     channel = new MockServerChannel();
     // Create an SDK in the mock file system.
     new MockSdk(resourceProvider: resourceProvider);
@@ -96,7 +88,7 @@
         channel,
         resourceProvider,
         new AnalysisServerOptions(),
-        new DartSdkManager(convertPath('/'), false),
+        new DartSdkManager(convertPath('/sdk'), false),
         InstrumentationService.NULL_SERVICE);
   }
 
@@ -114,8 +106,7 @@
     var pkgFolder = convertPath('/pkg');
     newFolder(pkgFolder);
     newFolder(join(pkgFolder, 'lib'));
-    newFile(join(pkgFolder, 'lib', 'test.dart'),
-        content: 'class C {}');
+    newFile(join(pkgFolder, 'lib', 'test.dart'), content: 'class C {}');
     server.setAnalysisRoots('0', [pkgFolder], [], {});
     // Pump the event queue to make sure the server has finished any
     // analysis.
diff --git a/pkg/analysis_server/test/benchmarks_test.dart b/pkg/analysis_server/test/benchmarks_test.dart
index 96c4c0f..21e70e5 100644
--- a/pkg/analysis_server/test/benchmarks_test.dart
+++ b/pkg/analysis_server/test/benchmarks_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.=> defineTests();
 
diff --git a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
index f6a0692..a11b461 100644
--- a/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
+++ b/pkg/analysis_server/test/channel/byte_stream_channel_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/channel/test_all.dart b/pkg/analysis_server/test/channel/test_all.dart
index ce5e85a..3edd228 100644
--- a/pkg/analysis_server/test/channel/test_all.dart
+++ b/pkg/analysis_server/test/channel/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index 5bed630..d0cd508 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -1709,8 +1709,7 @@
     buildTests(
         'testLibrary002',
         '''t2() {var q=[0],z=q.!1length;q.!2clear();}''',
-        <String>["1+length", "1+isEmpty", "2+clear"],
-        failingTests: '1');
+        <String>["1+length", "1+isEmpty", "2+clear"]);
 
     // TODO Include corelib analysis
     buildTests('testLibrary003', '''class X{var q; f() {q.!1a!2}}''',
diff --git a/pkg/analysis_server/test/completion_test_support.dart b/pkg/analysis_server/test/completion_test_support.dart
index 06829ed..0af04a9 100644
--- a/pkg/analysis_server/test/completion_test_support.dart
+++ b/pkg/analysis_server/test/completion_test_support.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/constants.dart b/pkg/analysis_server/test/constants.dart
index ab9accf..8b0282c 100644
--- a/pkg/analysis_server/test/constants.dart
+++ b/pkg/analysis_server/test/constants.dart
@@ -1,100 +1,23 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-const String ADD = 'add';
-const String ADDED = 'added';
-const String ASSISTS = 'assists';
-const String CHANGE = 'change';
-const String CHILDREN = 'children';
-const String CLASS_ELEMENT = 'classElement';
-const String CLASS_NAME = 'className';
 const String CODE = 'code';
-const String COMPLETION = 'completion';
 const String COMPLETION_RESULTS = 'completion.results';
-const String CONTAINING_LIBRARY_NAME = 'containingLibraryName';
-const String CONTAINING_LIBRARY_PATH = 'containingLibraryPath';
-const String CONTENT = 'content';
 const String CORRECTION = 'correction';
-const String DART_DOC = 'dartdoc';
-const String DEFAULT = 'default';
-const String DISPLAY_NAME = 'displayName';
 const String EDITS = 'edits';
-const String ELEMENT = 'element'; // boolean
-const String ELEMENT_DESCRIPTION = 'elementDescription'; // boolean
-const String ELEMENT_KIND = 'elementKind'; // boolean
-const String ENABLE_ASYNC = 'enableAsync'; // boolean
-const String ENABLE_DEFERRED_LOADING = 'enableDeferredLoading'; // boolean
-const String ENABLE_ENUMS = 'enableEnums';
-const String ERROR = 'error';
-const String ERRORS = 'errors';
-const String EXCLUDED = 'excluded';
-const String FATAL = 'fatal';
 const String FILE = 'file';
 const String FILE_STAMP = 'fileStamp';
-const String FILES = 'files';
-const String FIXES = 'fixes';
-const String FLAGS = 'flags';
-const String GENERATE_DART2JS_HINTS = 'generateDart2jsHints';
-const String GENERATE_HINTS = 'generateHints';
 const String HAS_FIX = 'hasFix';
-const String HIERARCHY_ITEMS = 'hierarchyItems';
-const String HOVERS = 'hovers';
-const String ID = 'id';
-const String INCLUDE_POTENTIAL = 'includePotential';
-const String INCLUDED = 'included';
-const String INTERFACE_MEMBERS = 'interfaceMembers';
-const String INTERFACES = 'interfaces';
-const String IS_ABSTRACT = 'isAbstract';
-const String IS_DEPRECATED = 'isDeprecated';
-const String IS_POTENTIAL = 'isPotential';
-const String IS_STATIC = 'isStatic';
-const String KIND = 'kind';
-const String KINDS = 'kinds';
-const String LAST = 'last';
 const String LENGTH = 'length';
-const String LINKED_EDIT_GROUPS = 'linkedEditGroups';
 const String LOCATION = 'location';
-const String MEMBER_ELEMENT = 'memberElement';
 const String MESSAGE = 'message';
-const String MIXINS = 'mixins';
-const String NAME = 'name';
-const String OCCURRENCES = 'occurrences';
 const String OFFSET = 'offset';
-const String OFFSETS = 'offsets';
-const String OPTIONS = 'options';
-const String OUTLINE = 'outline';
-const String OVERRIDES = 'overrides';
-const String PARAMETER = 'parameter';
-const String PARAMETERS = 'parameters';
-const String PATH = 'path';
-const String PATTERN = 'pattern';
-const String POSITIONS = 'positions';
-const String PROPAGATED_TYPE = 'propagatedType';
-const String REFACTORINGS = 'refactorings';
-const String REGIONS = 'regions';
-const String RELEVANCE = 'relevance';
-const String REMOVE = 'remove';
-const String REMOVED = 'removed';
 const String REPLACEMENT = 'replacement';
-const String REPLACEMENT_LENGTH = 'replacementLength';
-const String REPLACEMENT_OFFSET = 'replacementOffset';
-const String RESULTS = 'results';
-const String RETURN_TYPE = 'returnType';
-const String SELECTION = 'selection';
-const String SELECTION_LENGTH = 'selectionLength';
-const String SELECTION_OFFSET = 'selectionOffset';
 const String SEVERITY = 'severity';
 const String STACK_TRACE = 'stackTrace';
 const String START_COLUMN = 'startColumn';
 const String START_LINE = 'startLine';
-const String STATIC_TYPE = 'staticType';
-const String SUBCLASSES = 'subclasses';
 const String SUBSCRIPTIONS = 'subscriptions';
-const String SUGGESTIONS = 'suggestions';
-const String SUPER_CLASS_MEMBER = 'superclassMember';
-const String SUPERCLASS = 'superclass';
-const String TARGETS = 'targets';
 const String TYPE = 'type';
-const String VALUE = 'value';
 const String VERSION = 'version';
diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart
index e04d0de..4a7e95d 100644
--- a/pkg/analysis_server/test/context_manager_test.dart
+++ b/pkg/analysis_server/test/context_manager_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -24,6 +24,7 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/summary/summary_file_builder.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer/src/util/glob.dart';
 import 'package:linter/src/rules.dart';
@@ -34,7 +35,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:watcher/watcher.dart';
 
-import 'mock_sdk.dart';
 import 'src/plugin/plugin_manager_test.dart';
 
 main() {
@@ -500,7 +500,7 @@
     var testLibUri = resourceProvider.pathContext.toUri(testLib);
     resourceProvider.newFile(packagespecPath, 'unittest:$testLibUri');
     String libPath = '$projPath/${ContextManagerTest.LIB_NAME}';
-    File mainFile = newFile('$libPath/main.dart', content: '');
+    File mainFile = newFile('$libPath/main.dart');
     Source source = mainFile.createSource();
 
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
@@ -586,8 +586,8 @@
     // create files
     newFile('$subProjectA/pubspec.yaml', content: 'pubspec');
     newFile('$subProjectB/pubspec.yaml', content: 'pubspec');
-    newFile('$subProjectA/.packages', content: '');
-    newFile('$subProjectB/.packages', content: '');
+    newFile('$subProjectA/.packages');
+    newFile('$subProjectB/.packages');
 
     newFile(rootFile, content: 'library root;');
     newFile(subProjectA_file, content: 'library a;');
@@ -1641,7 +1641,7 @@
   }
 }
 
-abstract class ContextManagerTest extends Object with ResourceProviderMixin {
+abstract class ContextManagerTest with ResourceProviderMixin {
   /**
    * The name of the 'bin' directory.
    */
@@ -1675,24 +1675,19 @@
 
   String projPath = null;
 
-  AnalysisError missing_required_param = new AnalysisError(
-      new TestSource(), 0, 1, HintCode.MISSING_REQUIRED_PARAM, [
-    ['x']
-  ]);
-
   AnalysisError missing_return =
-      new AnalysisError(new TestSource(), 0, 1, HintCode.MISSING_RETURN, [
+      new AnalysisError(null, 0, 1, HintCode.MISSING_RETURN, [
     ['x']
   ]);
 
   AnalysisError invalid_assignment_error =
-      new AnalysisError(new TestSource(), 0, 1, HintCode.INVALID_ASSIGNMENT, [
+      new AnalysisError(null, 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
     ['x'],
     ['y']
   ]);
 
-  AnalysisError unused_local_variable = new AnalysisError(
-      new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [
+  AnalysisError unused_local_variable =
+      new AnalysisError(null, 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [
     ['x']
   ]);
 
@@ -1741,10 +1736,9 @@
     resourceProvider.newFolder(projPath);
     // Create an SDK in the mock file system.
     new MockSdk(generateSummaryFiles: true, resourceProvider: resourceProvider);
-    DartSdkManager sdkManager = new DartSdkManager(convertPath('/'), true);
+    DartSdkManager sdkManager = new DartSdkManager(convertPath('/sdk'), true);
     manager = new ContextManagerImpl(
         resourceProvider,
-        new FileContentOverlay(),
         sdkManager,
         providePackageResolver,
         analysisFilesGlobs,
@@ -2167,7 +2161,7 @@
     manager.setRoots(<String>[projPath], <String>[], <String, String>{});
     await pumpEventQueue();
 
-    AnalysisResult result = await callbacks.currentDriver.getResult(file.path);
+    var result = await callbacks.currentDriver.getResult(file.path);
 
     // Not strong mode - both in the context and the SDK context.
 //    AnalysisContext sdkContext = sourceFactory.dartSdk.context;
@@ -2569,7 +2563,7 @@
     ContextBuilderOptions builderOptions = new ContextBuilderOptions();
     builderOptions.defaultOptions = options;
     ContextBuilder builder = new ContextBuilder(
-        resourceProvider, sdkManager, new ContentCache(),
+        resourceProvider, sdkManager, null,
         options: builderOptions);
     return builder;
   }
@@ -2611,24 +2605,3 @@
     lastFlushedFiles = flushedFiles;
   }
 }
-
-/**
- * A [Source] that knows it's [fullName].
- */
-class TestSource implements Source {
-  TestSource();
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-class TestUriResolver extends UriResolver {
-  Map<Uri, Source> uriMap;
-
-  TestUriResolver(this.uriMap);
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    return uriMap[uri];
-  }
-}
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 6bb6343..e50b52f 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,17 +10,15 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
-import 'package:plugin/manager.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'analysis_abstract.dart';
-import 'mock_sdk.dart';
 import 'mocks.dart';
 
 main() {
@@ -64,8 +62,8 @@
     expect(response, isResponseSuccess('0'));
     // verify that unit is resolved eventually
     await server.onAnalysisComplete;
-    var unit = await serverRef.getResolvedCompilationUnit(file);
-    expect(unit, isNotNull);
+    var resolvedUnit = await serverRef.getResolvedUnit(file);
+    expect(resolvedUnit, isNotNull);
   }
 
   test_setAnalysisRoots_included_nonexistentFolder() async {
@@ -78,8 +76,8 @@
     // Non-existence of /project_a should not prevent files in /project_b
     // from being analyzed.
     await server.onAnalysisComplete;
-    var unit = await serverRef.getResolvedCompilationUnit(fileB);
-    expect(unit, isNotNull);
+    var resolvedUnit = await serverRef.getResolvedUnit(fileB);
+    expect(resolvedUnit, isNotNull);
   }
 
   test_setAnalysisRoots_included_notAbsolute() async {
@@ -338,7 +336,7 @@
 /**
  * A helper to test 'analysis.*' requests.
  */
-class AnalysisTestHelper extends Object with ResourceProviderMixin {
+class AnalysisTestHelper with ResourceProviderMixin {
   MockServerChannel serverChannel;
   AnalysisServer server;
   AnalysisDomainHandler handler;
@@ -356,7 +354,6 @@
   AnalysisTestHelper() {
     projectPath = convertPath('/project');
     testFile = convertPath('/project/bin/test.dart');
-    processRequiredPlugins();
     serverChannel = new MockServerChannel();
     // Create an SDK in the mock file system.
     new MockSdk(resourceProvider: resourceProvider);
@@ -364,7 +361,7 @@
         serverChannel,
         resourceProvider,
         new AnalysisServerOptions(),
-        new DartSdkManager(convertPath('/'), false),
+        new DartSdkManager(convertPath('/sdk'), false),
         InstrumentationService.NULL_SERVICE);
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
@@ -518,11 +515,6 @@
     expect(response, isResponseSuccess('0'));
   }
 
-  void processRequiredPlugins() {
-    ExtensionManager manager = new ExtensionManager();
-    manager.processPlugins(AnalysisEngine.instance.requiredPlugins);
-  }
-
   /**
    * Send an `updateContent` request for [testFile].
    */
@@ -661,7 +653,7 @@
   }
 
   test_afterAnalysis_sdkFile() async {
-    String file = convertPath('/lib/core/core.dart');
+    String file = convertPath('/sdk/lib/core/core.dart');
     addTestFile('// no matter');
     createProject();
     // wait for analysis, no results initially
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 0566e1f..f22f2f2 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -238,7 +238,7 @@
     //
     // We no longer support the analysis of non-dart files.
     //
-    testFile = resourceProvider.convertPath('/project/web/test.html');
+    testFile = convertPath('/project/web/test.html');
     addTestFile('''
       <html>^</html>
     ''');
@@ -647,9 +647,9 @@
   }
 
   test_local_override() {
-    newFile('/libA.dart', content: 'class A {m() {}}');
+    newFile('/project/bin/a.dart', content: 'class A {m() {}}');
     addTestFile('''
-import '../../libA.dart';
+import 'a.dart';
 class B extends A {
   m() {}
   x() {^}
@@ -718,9 +718,9 @@
   }
 
   test_overrides() {
-    newFile('/libA.dart', content: 'class A {m() {}}');
+    newFile('/project/bin/a.dart', content: 'class A {m() {}}');
     addTestFile('''
-import '../../libA.dart';
+import 'a.dart';
 class B extends A {m() {^}}
 ''');
     return getSuggestions().then((_) {
@@ -732,10 +732,10 @@
   }
 
   test_partFile() {
-    newFile('/project/bin/testA.dart', content: '''
+    newFile('/project/bin/a.dart', content: '''
       library libA;
-      part "${convertAbsolutePathToUri(testFile)}";
       import 'dart:html';
+      part 'test.dart';
       class A { }
     ''');
     addTestFile('''
@@ -755,12 +755,12 @@
   }
 
   test_partFile2() {
-    newFile('/testA.dart', content: '''
+    newFile('/project/bin/a.dart', content: '''
       part of libA;
       class A { }''');
     addTestFile('''
       library libA;
-      part "${convertAbsolutePathToUri("/testA.dart")}";
+      part "a.dart";
       import 'dart:html';
       main() {^}
     ''');
diff --git a/pkg/analysis_server/test/domain_completion_util.dart b/pkg/analysis_server/test/domain_completion_util.dart
index 7d0721b..190c397 100644
--- a/pkg/analysis_server/test/domain_completion_util.dart
+++ b/pkg/analysis_server/test/domain_completion_util.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/domain_diagnostic_test.dart b/pkg/analysis_server/test/domain_diagnostic_test.dart
index 7a84c54..987506c 100644
--- a/pkg/analysis_server/test/domain_diagnostic_test.dart
+++ b/pkg/analysis_server/test/domain_diagnostic_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/domain_edit_dartfix_test.dart b/pkg/analysis_server/test/domain_edit_dartfix_test.dart
new file mode 100644
index 0000000..edd543c
--- /dev/null
+++ b/pkg/analysis_server/test/domain_edit_dartfix_test.dart
@@ -0,0 +1,219 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/protocol/protocol.dart';
+import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/edit/edit_dartfix.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:linter/src/rules.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'analysis_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(EditDartfixDomainHandlerTest);
+  });
+}
+
+@reflectiveTest
+class EditDartfixDomainHandlerTest extends AbstractAnalysisTest {
+  int requestId = 30;
+  String libPath;
+
+  String get nextRequestId => (++requestId).toString();
+
+  void expectEdits(List<SourceFileEdit> fileEdits, String expectedSource) {
+    expect(fileEdits, hasLength(1));
+    expect(fileEdits[0].file, testFile);
+    List<SourceEdit> edits = fileEdits[0].edits;
+    String source = testCode;
+    for (SourceEdit edit in edits) {
+      source = edit.apply(source);
+    }
+    expect(source, expectedSource);
+  }
+
+  void expectSuggestion(DartFixSuggestion suggestion, String partialText,
+      int offset, int length) {
+    expect(suggestion.description, contains(partialText));
+    expect(suggestion.location.offset, offset);
+    expect(suggestion.location.length, length);
+  }
+
+  Future<EditDartfixResult> performFix() async {
+    final id = nextRequestId;
+    final params = new EditDartfixParams([projectPath]);
+    final request = new Request(id, 'edit.dartfix', params.toJson());
+
+    final response = await new EditDartFix(server, request).compute();
+    expect(response.id, id);
+
+    return EditDartfixResult.fromResponse(response);
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    registerLintRules();
+    libPath = resourceProvider.convertPath('/project/lib');
+    testFile = resourceProvider.convertPath('/project/lib/fileToBeFixed.dart');
+  }
+
+  test_dartfix_convertClassToMixin() async {
+    createProject();
+    addTestFile('''
+class A {}
+class B extends A {}
+class C with B {}
+    ''');
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], 'mixin', 17, 1);
+    expectEdits(result.edits, '''
+class A {}
+mixin B implements A {}
+class C with B {}
+    ''');
+  }
+
+  test_dartfix_convertToIntLiteral() async {
+    createProject();
+    addTestFile('''
+const double myDouble = 42.0;
+    ''');
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], 'int literal', 24, 4);
+    expectEdits(result.edits, '''
+const double myDouble = 42;
+    ''');
+  }
+
+  test_dartfix_moveTypeArgumentToClass() async {
+    createProject();
+    addTestFile('''
+class A<T> { A.from(Object obj) { } }
+main() {
+  print(new A.from<String>([]));
+}
+    ''');
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], 'type arguments', 65, 8);
+    expectEdits(result.edits, '''
+class A<T> { A.from(Object obj) { } }
+main() {
+  print(new A<String>.from([]));
+}
+    ''');
+  }
+
+  test_dartfix_non_nullable() async {
+    // Add analysis options to enable non-nullable analysis
+    newFile('/project/analysis_options.yaml', content: '''
+analyzer:
+  enable-experiment:
+    - non-nullable
+''');
+
+    createProject();
+    addTestFile('''
+main() {
+  functionWithNullableParam(new List<Object>(1));
+  functionWithNullableParam(null);
+}
+
+void functionWithNullableParam(Object object) {
+  if (object == null) {
+    print('object is null');
+  } else {
+    print('object is not-null');
+  }
+  List<Object> list = null;
+  list = <Object>[];
+  list.add(object);
+}
+''');
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expect(result.hasErrors, isFalse);
+    expectSuggestion(result.suggestions[0], 'non-nullable', 46, 6);
+    expectEdits(result.edits, '''
+main() {
+  functionWithNullableParam(new List<Object?>(1));
+  functionWithNullableParam(null);
+}
+
+void functionWithNullableParam(Object? object) {
+  if (object == null) {
+    print('object is null');
+  } else {
+    print('object is not-null');
+  }
+  List<Object?>? list = null;
+  list = <Object?>[];
+  list.add(object);
+}
+''');
+  }
+
+  test_dartfix_excludedSource() async {
+    // Add analysis options to exclude the lib directory then reanalyze
+    newFile('/project/analysis_options.yaml', content: '''
+analyzer:
+  exclude:
+    - lib/**
+''');
+
+    createProject();
+    addTestFile('''
+const double myDouble = 42.0;
+    ''');
+
+    // Assert no suggestions now that source has been excluded
+    final result = await performFix();
+    expect(result.suggestions, hasLength(0));
+    expect(result.edits, hasLength(0));
+  }
+
+  test_dartfix_partFile() async {
+    createProject();
+    newFile('/project/lib/lib.dart', content: '''
+library lib2;
+part 'fileToBeFixed.dart';
+    ''');
+    addTestFile('''
+part of lib2;
+const double myDouble = 42.0;
+    ''');
+
+    // Assert dartfix suggestions
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], 'int literal', 38, 4);
+    expectEdits(result.edits, '''
+part of lib2;
+const double myDouble = 42;
+    ''');
+  }
+
+  test_dartfix_partFile_loose() async {
+    createProject();
+    addTestFile('''
+part of lib2;
+const double myDouble = 42.0;
+    ''');
+
+    // Assert dartfix suggestions
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], 'int literal', 38, 4);
+    expectEdits(result.edits, '''
+part of lib2;
+const double myDouble = 42;
+    ''');
+  }
+}
diff --git a/pkg/analysis_server/test/domain_execution_test.dart b/pkg/analysis_server/test/domain_execution_test.dart
index 9805a59..d3d2908 100644
--- a/pkg/analysis_server/test/domain_execution_test.dart
+++ b/pkg/analysis_server/test/domain_execution_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,8 +10,6 @@
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -263,15 +261,3 @@
     return new ExecutionMapUriResult.fromResponse(response);
   }
 }
-
-/**
- * A [Source] that knows it's [fullName].
- */
-class TestSource implements Source {
-  String fullName;
-
-  TestSource(this.fullName);
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 149a7d3..120b2de 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -40,7 +40,7 @@
           response.toJson(),
           equals({
             Response.ID: '0',
-            Response.RESULT: {VERSION: AnalysisServer.VERSION}
+            Response.RESULT: {VERSION: PROTOCOL_VERSION}
           }));
     });
 
@@ -67,14 +67,9 @@
     });
 
     test('shutdown', () async {
-      expect(server.running, isTrue);
-      // send request
       var request = new ServerShutdownParams().toRequest('0');
       var response = await serverChannel.sendRequest(request);
       expect(response, isResponseSuccess('0'));
-
-      // server is down
-      expect(server.running, isFalse);
     });
   });
 }
diff --git a/pkg/analysis_server/test/edit/assists_test.dart b/pkg/analysis_server/test/edit/assists_test.dart
index 399706d..d8a77f0 100644
--- a/pkg/analysis_server/test/edit/assists_test.dart
+++ b/pkg/analysis_server/test/edit/assists_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index 4d07618..c9c5eaa 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -35,11 +35,12 @@
     createProject();
     addTestFile('''
 main() {
-  Future<String> x = null;
+  Completer<String> x = null;
 }
 ''');
     await waitForTasksFinished();
-    List<AnalysisErrorFixes> errorFixes = await _getFixesAt('Future<String>');
+    List<AnalysisErrorFixes> errorFixes =
+        await _getFixesAt('Completer<String>');
     expect(errorFixes, hasLength(1));
     AnalysisError error = errorFixes[0].error;
     expect(error.severity, AnalysisErrorSeverity.WARNING);
@@ -130,7 +131,7 @@
         handler: analysisHandler);
 
     // Configure the test file.
-    testFile = resourceProvider.convertPath('/aaa/main.dart');
+    testFile = convertPath('/aaa/main.dart');
     testCode = 'main() { new Foo(); }';
     _addOverlay(testFile, testCode);
 
diff --git a/pkg/analysis_server/test/edit/format_test.dart b/pkg/analysis_server/test/edit/format_test.dart
index ced5eab..1c18cbf 100644
--- a/pkg/analysis_server/test/edit/format_test.dart
+++ b/pkg/analysis_server/test/edit/format_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/edit/organize_directives_test.dart b/pkg/analysis_server/test/edit/organize_directives_test.dart
index 9ca4c06..e8424aa 100644
--- a/pkg/analysis_server/test/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/edit/organize_directives_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/edit/postfix_completion_test.dart b/pkg/analysis_server/test/edit/postfix_completion_test.dart
index 7a64a92..00139e5 100644
--- a/pkg/analysis_server/test/edit/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/edit/postfix_completion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index b696ea8..da70280 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/edit/sort_members_test.dart b/pkg/analysis_server/test/edit/sort_members_test.dart
index 2da9a0a..04828b6 100644
--- a/pkg/analysis_server/test/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/edit/sort_members_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/edit/statement_completion_test.dart b/pkg/analysis_server/test/edit/statement_completion_test.dart
index 7df82ba..50f834b 100644
--- a/pkg/analysis_server/test/edit/statement_completion_test.dart
+++ b/pkg/analysis_server/test/edit/statement_completion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/edit/test_all.dart b/pkg/analysis_server/test/edit/test_all.dart
index 1376ea6..79cc139 100644
--- a/pkg/analysis_server/test/edit/test_all.dart
+++ b/pkg/analysis_server/test/edit/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
index f7114c5..6088003 100644
--- a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -15,24 +15,15 @@
   });
 }
 
-/// Wrapper around the test package's `fail` function.
-///
-/// Unlike the test package's `fail` function, this function is not annotated
-/// with @alwaysThrows, so we can call it at the top of a test method without
-/// causing the rest of the method to be flagged as dead code.
-void _fail(String message) {
-  fail(message);
-}
-
 @reflectiveTest
 class OptionsIntegrationTest extends AbstractAnalysisServerIntegrationTest {
-  @failingTest
+  void optionsAnalysisSetup() {
+    // Add an empty Dart file; required to trigger analysis (#35383).
+    writeFile(sourcePath('test.dart'), '');
+    standardAnalysisSetup();
+  }
+
   test_option_warning_newOptionFile() async {
-    // TimeoutException after 0:00:30.000000: Test timed out after 30 seconds
-    // (#28868).
-
-    _fail('test timeout expected - #28868');
-
     String options = sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
     writeFile(options, '''
 linter:
@@ -40,7 +31,7 @@
     - camel_case_typo # :)
 ''');
 
-    standardAnalysisSetup();
+    optionsAnalysisSetup();
 
     await analysisFinished;
 
@@ -57,21 +48,15 @@
     expect(error.location.startColumn, 7);
   }
 
-  @failingTest
   test_option_warning_oldOptionFile() async {
-    // TimeoutException after 0:00:30.000000: Test timed out after 30 seconds
-    // (#28868).
-
-    _fail('test timeout expected - #28868');
-
     String options = sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_FILE);
     writeFile(options, '''
 linter:
   rules:
-    - camel_case_typo # :)
+    - camel_case_types
 ''');
 
-    standardAnalysisSetup();
+    optionsAnalysisSetup();
 
     await analysisFinished;
 
@@ -80,11 +65,13 @@
     expect(errors, hasLength(1));
     AnalysisError error = errors[0];
     expect(error.location.file, options);
-    expect(error.severity, AnalysisErrorSeverity.WARNING);
-    expect(error.type, AnalysisErrorType.STATIC_WARNING);
-    expect(error.location.offset, 23);
-    expect(error.location.length, 'camel_case_typo'.length);
-    expect(error.location.startLine, 3);
-    expect(error.location.startColumn, 7);
+    expect(error.severity, AnalysisErrorSeverity.INFO);
+    expect(error.type, AnalysisErrorType.HINT);
+    expect(error.location.offset, 0);
+    expect(error.location.length, 1);
+    expect(error.location.startLine, 1);
+    expect(error.location.startColumn, 1);
+    expect(error.message,
+        "The name of the analysis options file .analysis_options is deprecated; consider renaming it to analysis_options.yaml.");
   }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index 1c32caa..4da91dc 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk_test.dart
index be6e77a..c9be4cd 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_nonStandard_sdk_test.dart
@@ -1,17 +1,15 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../mock_sdk.dart';
 import '../support/integration_tests.dart';
 
 main() {
@@ -28,42 +26,56 @@
 class AnalysisDomainGetErrorsTest
     extends AbstractAnalysisServerIntegrationTest {
   String createNonStandardSdk() {
-    MockSdkLibrary fakeLibrary =
-        new MockSdkLibrary('dart:fake', '/lib/fake/fake.dart', '');
-    String sdkPath = path.join(sourceDirectory.path, 'sdk');
-    StringBuffer librariesContent = new StringBuffer();
-    librariesContent.writeln(
-        'final Map<String, LibraryInfo> LIBRARIES = const <String, LibraryInfo> {');
-    MockSdk.LIBRARIES.toList()
-      ..add(fakeLibrary)
-      ..forEach((SdkLibrary library) {
-        List<String> components = path.posix.split(library.path);
-        components[0] = sdkPath;
-        String libraryPath = path.joinAll(components);
-        new Directory(path.dirname(libraryPath)).createSync(recursive: true);
-        new File(libraryPath)
-            .writeAsStringSync((library as MockSdkLibrary).content);
+    var sdkPath = path.join(sourceDirectory.path, 'sdk');
 
-        String relativePath = path.joinAll(components.sublist(2));
-        librariesContent.write('"');
-        librariesContent
-            .write(library.shortName.substring(5)); // Remove the 'dart:' prefix
-        librariesContent.write('": const LibraryInfo("');
-        librariesContent.write(relativePath);
-        librariesContent.writeln('"),');
-      });
-    librariesContent.writeln('};');
+    new Directory(path.join(sdkPath, 'lib', 'core'))
+        .createSync(recursive: true);
+    new Directory(path.join(sdkPath, 'lib', 'async'))
+        .createSync(recursive: true);
+    new Directory(path.join(sdkPath, 'lib', 'fake'))
+        .createSync(recursive: true);
 
-    String librariesPath = path.joinAll([
+    new File(path.join(sdkPath, 'lib', 'core', 'core.dart'))
+        .writeAsStringSync(r'''
+library dart.core;
+import 'dart:async';
+class bool {}
+class double {}
+class int {}
+class num {}
+class Object {}
+class Map<K, V> {}
+class Null {}
+class String {}
+class Type {}
+''');
+
+    new File(path.join(sdkPath, 'lib', 'async', 'async.dart'))
+        .writeAsStringSync(r'''
+library dart.async;
+class Future<T> {}
+''');
+
+    new File(path.join(sdkPath, 'lib', 'fake', 'fake.dart'))
+        .writeAsStringSync(r'''
+class Fake {} 
+''');
+
+    var libsDir = path.join(
       sdkPath,
       'lib',
       '_internal',
       'sdk_library_metadata',
       'lib',
-      'libraries.dart'
-    ]);
-    new Directory(path.dirname(librariesPath)).createSync(recursive: true);
-    new File(librariesPath).writeAsStringSync(librariesContent.toString());
+    );
+    new Directory(libsDir).createSync(recursive: true);
+    new File(path.join(libsDir, 'libraries.dart')).writeAsStringSync(r'''
+final LIBRARIES = const <String, LibraryInfo> {
+  "core":  const LibraryInfo("core/core.dart"),
+  "async": const LibraryInfo("async/async.dart"),
+  "fake":  const LibraryInfo("fake/fake.dart"),
+};
+''');
 
     return sdkPath;
   }
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
index d549e9e..f9e0c95 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index 8c179cc..e2f25af 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
index 65deb3b..29e8ec6 100644
--- a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart b/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
index 51a7659..7f30150 100644
--- a/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_library_dependencies_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
index 9725e58..b3943bc 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
index eb2ea8b..286a24e 100644
--- a/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_reachable_sources_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
index d9f1ebc..d837ff2 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/highlights_test.dart b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
index 613a45d..95dfea5 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/hint_sdk_version_async_exported_from_core_test.dart b/pkg/analysis_server/test/integration/analysis/hint_sdk_version_async_exported_from_core_test.dart
new file mode 100644
index 0000000..585120f
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/hint_sdk_version_async_exported_from_core_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../support/integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SdkVersionAsyncExportedFromCoreIntegrationTest);
+  });
+}
+
+@reflectiveTest
+class SdkVersionAsyncExportedFromCoreIntegrationTest
+    extends AbstractAnalysisServerIntegrationTest {
+  test_update_pubspec() async {
+    var pubspecPath = sourcePath('pubspec.yaml');
+    writeFile(pubspecPath, r'''
+name: test
+environment:
+  sdk: ^2.0.0
+''');
+
+    var testPath = sourcePath('lib/test.dart');
+    writeFile(testPath, '''
+Future<int> zero() async => 0;
+''');
+    standardAnalysisSetup();
+
+    // There is a hint with this SDK version constraint.
+    await analysisFinished;
+    expect(currentAnalysisErrors[testPath], hasLength(1));
+
+    // 2.0.0 -> 2.1.0
+    {
+      writeFile(pubspecPath, r'''
+name: test
+environment:
+  sdk: ^2.1.0
+''');
+
+      // The pubspec.yaml file change has been noticed and processed.
+      // No more hints.
+      await analysisFinished;
+      expect(currentAnalysisErrors[testPath], isEmpty);
+    }
+
+    // 2.1.0 -> 2.0.0
+    {
+      writeFile(pubspecPath, r'''
+name: test
+environment:
+  sdk: ^2.0.0
+''');
+
+      // The pubspec.yaml file change has been noticed and processed.
+      // There is a hint again.
+      await analysisFinished;
+      expect(currentAnalysisErrors[testPath], hasLength(1));
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index 699b43b..ebe8986 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 1302b67..61c3f86 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index 35a9416..787aa63 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index eafefe8..41ec2b9 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index 32c238c..a045fb6 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index 0491f9b..09c94a4 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index cb707e2..e79a1e1 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 8740ef0..60fe554 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
index f6c1d61..c0aa33e 100644
--- a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
index ce90165..eeef19e 100644
--- a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
index 10cb1a0..e1ef4cf 100644
--- a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
index 9524b4d..b5d60d4 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/test_all.dart b/pkg/analysis_server/test/integration/analysis/test_all.dart
index 99021da..a0cdc52 100644
--- a/pkg/analysis_server/test/integration/analysis/test_all.dart
+++ b/pkg/analysis_server/test/integration/analysis/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -15,6 +15,8 @@
 import 'get_reachable_sources_test.dart' as get_reachable_sources_test;
 import 'highlights2_test.dart' as highlights2_test;
 import 'highlights_test.dart' as highlights_test;
+import 'hint_sdk_version_async_exported_from_core_test.dart'
+    as hint_sdk_version_async_exported_from_core_test;
 import 'lint_test.dart' as lint_test;
 import 'navigation_test.dart' as navigation_test;
 import 'occurrences_test.dart' as occurrences_test;
@@ -47,6 +49,7 @@
     get_reachable_sources_test.main();
     highlights2_test.main();
     highlights_test.main();
+    hint_sdk_version_async_exported_from_core_test.main();
     lint_test.main();
     navigation_test.main();
     occurrences_test.main();
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
index d44cce7..6c28e46 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index cc4ceae..c25b133 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analysis/update_options_test.dart b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
index 1172d78..b61db22 100644
--- a/pkg/analysis_server/test/integration/analysis/update_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analytics/enable_test.dart b/pkg/analysis_server/test/integration/analytics/enable_test.dart
index 72e261d..19296ee 100644
--- a/pkg/analysis_server/test/integration/analytics/enable_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/enable_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart b/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
index 8e2ffd5..15b5cf8 100644
--- a/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/is_enabled_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analytics/send_event_test.dart b/pkg/analysis_server/test/integration/analytics/send_event_test.dart
index fbeb48a..5a0b09e 100644
--- a/pkg/analysis_server/test/integration/analytics/send_event_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/send_event_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analytics/send_timing_test.dart b/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
index fb65d8a..141e3b7 100644
--- a/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
+++ b/pkg/analysis_server/test/integration/analytics/send_timing_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/analytics/test_all.dart b/pkg/analysis_server/test/integration/analytics/test_all.dart
index d4352b7..f9e7963 100644
--- a/pkg/analysis_server/test/integration/analytics/test_all.dart
+++ b/pkg/analysis_server/test/integration/analytics/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index cf031cf..888a1d2 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/completion/test_all.dart b/pkg/analysis_server/test/integration/completion/test_all.dart
index f07053b..1b5962b 100644
--- a/pkg/analysis_server/test/integration/completion/test_all.dart
+++ b/pkg/analysis_server/test/integration/completion/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/coverage_test.dart b/pkg/analysis_server/test/integration/coverage_test.dart
index b8b3c14..a1e5284 100644
--- a/pkg/analysis_server/test/integration/coverage_test.dart
+++ b/pkg/analysis_server/test/integration/coverage_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart b/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
index e8bf76e..1eb2a17 100644
--- a/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
+++ b/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart b/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
index 37efe2c..6005964 100644
--- a/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
+++ b/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/diagnostic/test_all.dart b/pkg/analysis_server/test/integration/diagnostic/test_all.dart
index 4e45dea..5265193 100644
--- a/pkg/analysis_server/test/integration/diagnostic/test_all.dart
+++ b/pkg/analysis_server/test/integration/diagnostic/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/format_test.dart b/pkg/analysis_server/test/integration/edit/format_test.dart
index 8906109..8380c5b 100644
--- a/pkg/analysis_server/test/integration/edit/format_test.dart
+++ b/pkg/analysis_server/test/integration/edit/format_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/get_assists_test.dart b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
index 69e10f0..f2b57dc 100644
--- a/pkg/analysis_server/test/integration/edit/get_assists_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_assists_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
index 820b586..ddbcfe6 100644
--- a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
index cfe923e..81af6dea 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
index 598b4c0..4e0257e 100644
--- a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart b/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
index c3e5553..93c34fe 100644
--- a/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_refactoring_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
index 610ece0..b3caa20 100644
--- a/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_statement_completion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/import_elements_test.dart b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
index 9beed5a..842f470 100644
--- a/pkg/analysis_server/test/integration/edit/import_elements_test.dart
+++ b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
index be1ff11..7c65699 100644
--- a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
+++ b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
index f248e06..63f13e4 100644
--- a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
+++ b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
index 0e372f4..e5b0a46 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/sort_members_test.dart b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
index 3ff78a7..1896537 100644
--- a/pkg/analysis_server/test/integration/edit/sort_members_test.dart
+++ b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/edit/test_all.dart b/pkg/analysis_server/test/integration/edit/test_all.dart
index 81aa121..6706806 100644
--- a/pkg/analysis_server/test/integration/edit/test_all.dart
+++ b/pkg/analysis_server/test/integration/edit/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/execution/create_context_test.dart b/pkg/analysis_server/test/integration/execution/create_context_test.dart
index 6564810..f73fe9a 100644
--- a/pkg/analysis_server/test/integration/execution/create_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/create_context_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/execution/delete_context_test.dart b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
index c807fa5..a22a9e8 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/execution/map_uri_test.dart b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
index f5abbc0..8038545 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
index 441093b..a95fc27 100644
--- a/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/execution/test_all.dart b/pkg/analysis_server/test/integration/execution/test_all.dart
index 6da630d..4f6af5d 100644
--- a/pkg/analysis_server/test/integration/execution/test_all.dart
+++ b/pkg/analysis_server/test/integration/execution/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
index ccd3c49..0d823a9 100644
--- a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
+++ b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/kythe/test_all.dart b/pkg/analysis_server/test/integration/kythe/test_all.dart
index d65cff4..0573a6c 100644
--- a/pkg/analysis_server/test/integration/kythe/test_all.dart
+++ b/pkg/analysis_server/test/integration/kythe/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/search/find_element_references_test.dart b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
index 6ea7f6e..eac13f5 100644
--- a/pkg/analysis_server/test/integration/search/find_element_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
index 81148c0..f91ba02 100644
--- a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/search/find_member_references_test.dart b/pkg/analysis_server/test/integration/search/find_member_references_test.dart
index 36fccbc..9ffc95f 100644
--- a/pkg/analysis_server/test/integration/search/find_member_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_references_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
index 66352f8..4d37e1e 100644
--- a/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_top_level_declarations_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart b/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
index da44055..2758ed1 100644
--- a/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/integration/search/get_type_hierarchy_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/search/test_all.dart b/pkg/analysis_server/test/integration/search/test_all.dart
index bf7e7a4..c7cc8b8 100644
--- a/pkg/analysis_server/test/integration/search/test_all.dart
+++ b/pkg/analysis_server/test/integration/search/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/server/get_version_test.dart b/pkg/analysis_server/test/integration/server/get_version_test.dart
index c3dc407..7fca35a 100644
--- a/pkg/analysis_server/test/integration/server/get_version_test.dart
+++ b/pkg/analysis_server/test/integration/server/get_version_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart b/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
index c95e046..6bfde08 100644
--- a/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
+++ b/pkg/analysis_server/test/integration/server/set_subscriptions_invalid_service_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
index d6de65b..6e9e672 100644
--- a/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/server/set_subscriptions_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/server/shutdown_test.dart b/pkg/analysis_server/test/integration/server/shutdown_test.dart
index 8478d48..ce7e5d4 100644
--- a/pkg/analysis_server/test/integration/server/shutdown_test.dart
+++ b/pkg/analysis_server/test/integration/server/shutdown_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index 72163c3..411d1bc 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/server/test_all.dart b/pkg/analysis_server/test/integration/server/test_all.dart
index 6ab8ac9..2ef3625 100644
--- a/pkg/analysis_server/test/integration/server/test_all.dart
+++ b/pkg/analysis_server/test/integration/server/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/integration/support/integration_test_methods.dart b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
index 401723d..65b4cec 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -460,26 +460,12 @@
   }
 
   /**
-   * Force the re-analysis of everything contained in the specified analysis
-   * roots. This will cause all previously computed analysis results to be
-   * discarded and recomputed, and will cause all subscribed notifications to
-   * be re-sent.
-   *
-   * If no analysis roots are provided, then all current analysis roots will be
-   * re-analyzed. If an empty list of analysis roots is provided, then nothing
-   * will be re-analyzed. If the list contains one or more paths that are not
-   * currently analysis roots, then an error of type INVALID_ANALYSIS_ROOT will
-   * be generated.
-   *
-   * Parameters
-   *
-   * roots: List<FilePath> (optional)
-   *
-   *   A list of the analysis roots that are to be re-analyzed.
+   * Force re-reading of all potentially changed files, re-resolving of all
+   * referenced URIs, and corresponding re-analysis of everything affected in
+   * the current analysis roots.
    */
-  Future sendAnalysisReanalyze({List<String> roots}) async {
-    var params = new AnalysisReanalyzeParams(roots: roots).toJson();
-    var result = await server.send("analysis.reanalyze", params);
+  Future sendAnalysisReanalyze() async {
+    var result = await server.send("analysis.reanalyze", null);
     outOfTestExpect(result, isNull);
     return null;
   }
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index d38cc56..16f7d4b 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -24,8 +24,6 @@
     'notification', const {'event': isString},
     optionalFields: const {'params': isMap});
 
-const Matcher isObject = isMap;
-
 const Matcher isString = const TypeMatcher<String>();
 
 final Matcher isResponse = new MatchesJsonObject('response', {'id': isString},
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 13ba921..6630dbe 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -202,6 +202,7 @@
  *   "relevance": int
  *   "completion": String
  *   "displayText": optional String
+ *   "elementUri": optional String
  *   "selectionOffset": int
  *   "selectionLength": int
  *   "isDeprecated": bool
@@ -233,6 +234,7 @@
           "isPotential": isBool
         }, optionalFields: {
           "displayText": isString,
+          "elementUri": isString,
           "docSummary": isString,
           "docComplete": isString,
           "declaringType": isString,
@@ -1849,14 +1851,8 @@
 
 /**
  * analysis.reanalyze params
- *
- * {
- *   "roots": optional List<FilePath>
- * }
  */
-final Matcher isAnalysisReanalyzeParams = new LazyMatcher(() =>
-    new MatchesJsonObject("analysis.reanalyze params", null,
-        optionalFields: {"roots": isListOf(isFilePath)}));
+final Matcher isAnalysisReanalyzeParams = isNull;
 
 /**
  * analysis.reanalyze result
diff --git a/pkg/analysis_server/test/integration/test_all.dart b/pkg/analysis_server/test/integration/test_all.dart
index c69d15b..ce11216 100644
--- a/pkg/analysis_server/test/integration/test_all.dart
+++ b/pkg/analysis_server/test/integration/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/lsp/change_workspace_folders_test.dart b/pkg/analysis_server/test/lsp/change_workspace_folders_test.dart
new file mode 100644
index 0000000..fd0e3c0
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/change_workspace_folders_test.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ChangeWorkspaceFoldersTest);
+  });
+}
+
+@reflectiveTest
+class ChangeWorkspaceFoldersTest extends AbstractLspAnalysisServerTest {
+  String workspaceFolder1Path, workspaceFolder2Path, workspaceFolder3Path;
+  Uri workspaceFolder1Uri, workspaceFolder2Uri, workspaceFolder3Uri;
+
+  @override
+  void setUp() {
+    super.setUp();
+    workspaceFolder1Path = convertPath('/workspace1');
+    workspaceFolder2Path = convertPath('/workspace2');
+    workspaceFolder3Path = convertPath('/workspace3');
+    workspaceFolder1Uri = Uri.file(workspaceFolder1Path);
+    workspaceFolder2Uri = Uri.file(workspaceFolder2Path);
+    workspaceFolder3Uri = Uri.file(workspaceFolder3Path);
+  }
+
+  test_changeWorkspaceFolders_add() async {
+    await initialize(rootUri: workspaceFolder1Uri);
+    await changeWorkspaceFolders(
+        add: [workspaceFolder2Uri, workspaceFolder3Uri]);
+
+    expect(
+      server.contextManager.includedPaths,
+      unorderedEquals([
+        workspaceFolder1Path,
+        workspaceFolder2Path,
+        workspaceFolder3Path,
+      ]),
+    );
+  }
+
+  test_changeWorkspaceFolders_addAndRemove() async {
+    await initialize(
+      workspaceFolders: [workspaceFolder1Uri, workspaceFolder2Uri],
+    );
+
+    await changeWorkspaceFolders(
+      add: [workspaceFolder3Uri],
+      remove: [workspaceFolder2Uri],
+    );
+    expect(
+      server.contextManager.includedPaths,
+      unorderedEquals([workspaceFolder1Path, workspaceFolder3Path]),
+    );
+  }
+
+  test_changeWorkspaceFolders_remove() async {
+    await initialize(
+      workspaceFolders: [workspaceFolder1Uri, workspaceFolder2Uri],
+    );
+
+    await changeWorkspaceFolders(
+      remove: [workspaceFolder2Uri],
+    );
+    expect(
+      server.contextManager.includedPaths,
+      unorderedEquals([workspaceFolder1Path]),
+    );
+  }
+
+  test_changeWorkspaceFolders_removeFlushesDiagnostics() async {
+    // Add our standard test project as well as a dummy project.
+    await initialize(workspaceFolders: [projectFolderUri, workspaceFolder1Uri]);
+
+    // Generate an error in the test project.
+    final firstDiagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await openFile(mainFileUri, 'String a = 1;');
+    final initialDiagnostics = await firstDiagnosticsUpdate;
+    expect(initialDiagnostics, hasLength(1));
+
+    // Ensure the error is removed if we removed the workspace folder.
+    final secondDiagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await changeWorkspaceFolders(remove: [projectFolderUri]);
+    final updatedDiagnostics = await secondDiagnosticsUpdate;
+    expect(updatedDiagnostics, hasLength(0));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/code_actions_abstract.dart b/pkg/analysis_server/test/lsp/code_actions_abstract.dart
new file mode 100644
index 0000000..64aea35
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/code_actions_abstract.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:test/test.dart';
+
+import 'server_abstract.dart';
+
+abstract class AbstractCodeActionsTest extends AbstractLspAnalysisServerTest {
+  Future<void> checkCodeActionAvailable(
+    Uri uri,
+    String command,
+    String title, {
+    bool asCodeActionLiteral = false,
+    bool asCommand = false,
+  }) async {
+    final codeActions = await getCodeActions(uri.toString());
+    final codeAction = findCommand(codeActions, command);
+    expect(codeAction, isNotNull);
+
+    codeAction.map(
+      (command) {
+        if (!asCommand) {
+          throw 'Got Command but expected CodeAction literal';
+        }
+        expect(command.title, equals(title));
+        expect(command.arguments, equals([uri.toFilePath()]));
+      },
+      (codeAction) {
+        if (!asCodeActionLiteral) {
+          throw 'Got CodeAction literal but expected Command';
+        }
+        expect(codeAction, isNotNull);
+        expect(codeAction.title, equals(title));
+        expect(codeAction.command.title, equals(title));
+        expect(codeAction.command.arguments, equals([uri.toFilePath()]));
+      },
+    );
+  }
+
+  Either2<Command, CodeAction> findCommand(
+      List<Either2<Command, CodeAction>> actions, String commandID) {
+    for (var codeAction in actions) {
+      final id = codeAction.map(
+          (cmd) => cmd.command, (action) => action.command.command);
+      if (id == commandID) {
+        return codeAction;
+      }
+    }
+    return null;
+  }
+
+  CodeAction findEditAction(List<Either2<Command, CodeAction>> actions,
+      CodeActionKind actionKind, String title) {
+    for (var codeAction in actions) {
+      final codeActionLiteral =
+          codeAction.map((cmd) => null, (action) => action);
+      if (codeActionLiteral?.kind == actionKind &&
+          codeActionLiteral?.title == title) {
+        // We're specifically looking for an action that contains an edit.
+        assert(codeActionLiteral.command == null);
+        assert(codeActionLiteral.edit != null);
+        return codeActionLiteral;
+      }
+    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/code_actions_assists_test.dart b/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
new file mode 100644
index 0000000..a42d083
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/code_actions_assists_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'code_actions_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssistsCodeActionsTest);
+  });
+}
+
+@reflectiveTest
+class AssistsCodeActionsTest extends AbstractCodeActionsTest {
+  test_appliesCorrectEdits_withDocumentChangesSupport() async {
+    // This code should get an assist to add a show combinator.
+    const content = '''
+    import '[[dart:async]]';
+
+    Future f;
+    ''';
+
+    const expectedContent = '''
+    import 'dart:async' show Future;
+
+    Future f;
+    ''';
+    await newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.Refactor]),
+      workspaceCapabilities:
+          withDocumentChangesSupport(emptyWorkspaceClientCapabilities),
+    );
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final assist = findEditAction(
+        codeActions, CodeActionKind.Refactor, "Add explicit 'show' combinator");
+
+    // Ensure the edit came back, and using documentChanges.
+    expect(assist, isNotNull);
+    expect(assist.edit.documentChanges, isNotNull);
+    expect(assist.edit.changes, isNull);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyDocumentChanges(contents, assist.edit.documentChanges);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  test_appliesCorrectEdits_withoutDocumentChangesSupport() async {
+    // This code should get an assist to add a show combinator.
+    const content = '''
+    import '[[dart:async]]';
+
+    Future f;
+    ''';
+
+    const expectedContent = '''
+    import 'dart:async' show Future;
+
+    Future f;
+    ''';
+    await newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.Refactor]),
+    );
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final assistAction = findEditAction(
+        codeActions, CodeActionKind.Refactor, "Add explicit 'show' combinator");
+
+    // Ensure the edit came back, and using changes.
+    expect(assistAction, isNotNull);
+    expect(assistAction.edit.changes, isNotNull);
+    expect(assistAction.edit.documentChanges, isNull);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyChanges(contents, assistAction.edit.changes);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart b/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart
new file mode 100644
index 0000000..4d692a1
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/code_actions_fixes_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'code_actions_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FixesCodeActionsTest);
+  });
+}
+
+@reflectiveTest
+class FixesCodeActionsTest extends AbstractCodeActionsTest {
+  test_appliesCorrectEdits_withDocumentChangesSupport() async {
+    // This code should get a fix to remove the unused import.
+    const content = '''
+    import 'dart:async';
+    [[import]] 'dart:convert';
+
+    Future foo;
+    ''';
+
+    const expectedContent = '''
+    import 'dart:async';
+
+    Future foo;
+    ''';
+    await newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.QuickFix]),
+      workspaceCapabilities:
+          withDocumentChangesSupport(emptyWorkspaceClientCapabilities),
+    );
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final fixAction = findEditAction(
+        codeActions, CodeActionKind.QuickFix, 'Remove unused import');
+
+    // Ensure the edit came back, and using documentChanges.
+    expect(fixAction, isNotNull);
+    expect(fixAction.edit.documentChanges, isNotNull);
+    expect(fixAction.edit.changes, isNull);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyDocumentChanges(contents, fixAction.edit.documentChanges);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  test_appliesCorrectEdits_withoutDocumentChangesSupport() async {
+    // This code should get a fix to remove the unused import.
+    const content = '''
+    import 'dart:async';
+    [[import]] 'dart:convert';
+
+    Future foo;
+    ''';
+
+    const expectedContent = '''
+    import 'dart:async';
+
+    Future foo;
+    ''';
+    await newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.QuickFix]),
+    );
+
+    final codeActions = await getCodeActions(mainFileUri.toString(),
+        range: rangeFromMarkers(content));
+    final fixAction = findEditAction(
+        codeActions, CodeActionKind.QuickFix, 'Remove unused import');
+
+    // Ensure the edit came back, and using changes.
+    expect(fixAction, isNotNull);
+    expect(fixAction.edit.changes, isNotNull);
+    expect(fixAction.edit.documentChanges, isNull);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyChanges(contents, fixAction.edit.changes);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/code_actions_source_test.dart b/pkg/analysis_server/test/lsp/code_actions_source_test.dart
new file mode 100644
index 0000000..3ea0d20
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/code_actions_source_test.dart
@@ -0,0 +1,420 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../tool/lsp_spec/matchers.dart';
+import 'code_actions_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SortMembersSourceCodeActionsTest);
+    defineReflectiveTests(OrganizeImportsSourceCodeActionsTest);
+  });
+}
+
+@reflectiveTest
+class OrganizeImportsSourceCodeActionsTest extends AbstractCodeActionsTest {
+  test_appliesCorrectEdits_withDocumentChangesSupport() async {
+    const content = '''
+import 'dart:math';
+import 'dart:async';
+import 'dart:convert';
+
+Future foo;
+int minified(int x, int y) => min(x, y);
+    ''';
+    const expectedContent = '''
+import 'dart:async';
+import 'dart:math';
+
+Future foo;
+int minified(int x, int y) => min(x, y);
+    ''';
+    await newFile(mainFilePath, content: content);
+    await initialize(
+        workspaceCapabilities:
+            withDocumentChangesSupport(emptyWorkspaceClientCapabilities));
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.organizeImports);
+    expect(codeAction, isNotNull);
+
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+
+    ApplyWorkspaceEditParams editParams;
+
+    final commandResponse = await handleExpectedRequest<Object,
+        ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
+      Method.workspace_applyEdit,
+      () => executeCommand(command),
+      handler: (edit) {
+        // When the server sends the edit back, just keep a copy and say we
+        // applied successfully (it'll be verified below).
+        editParams = edit;
+        return new ApplyWorkspaceEditResponse(true);
+      },
+    );
+    // Successful edits return an empty success() response.
+    expect(commandResponse, isNull);
+
+    // Ensure the edit came back, and using the documentChanges.
+    expect(editParams, isNotNull);
+    expect(editParams.edit.documentChanges, isNotNull);
+    expect(editParams.edit.changes, isNull);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyDocumentChanges(contents, editParams.edit.documentChanges);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  test_appliesCorrectEdits_withoutDocumentChangesSupport() async {
+    const content = '''
+import 'dart:math';
+import 'dart:async';
+import 'dart:convert';
+
+Future foo;
+int minified(int x, int y) => min(x, y);
+    ''';
+    const expectedContent = '''
+import 'dart:async';
+import 'dart:math';
+
+Future foo;
+int minified(int x, int y) => min(x, y);
+    ''';
+    await newFile(mainFilePath, content: content);
+    await initialize();
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.organizeImports);
+    expect(codeAction, isNotNull);
+
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+
+    ApplyWorkspaceEditParams editParams;
+
+    final commandResponse = await handleExpectedRequest<Object,
+        ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
+      Method.workspace_applyEdit,
+      () => executeCommand(command),
+      handler: (edit) {
+        // When the server sends the edit back, just keep a copy and say we
+        // applied successfully (it'll be verified below).
+        editParams = edit;
+        return new ApplyWorkspaceEditResponse(true);
+      },
+    );
+    // Successful edits return an empty success() response.
+    expect(commandResponse, isNull);
+
+    // Ensure the edit came back, and using changes.
+    expect(editParams, isNotNull);
+    expect(editParams.edit.changes, isNotNull);
+    expect(editParams.edit.documentChanges, isNull);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyChanges(contents, editParams.edit.changes);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  test_availableAsCodeActionLiteral() async {
+    await newFile(mainFilePath);
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.Source]),
+    );
+
+    await checkCodeActionAvailable(
+      mainFileUri,
+      Commands.organizeImports,
+      'Organize Imports',
+      asCodeActionLiteral: true,
+    );
+  }
+
+  test_availableAsCommand() async {
+    await newFile(mainFilePath);
+    await initialize();
+
+    await checkCodeActionAvailable(
+      mainFileUri,
+      Commands.organizeImports,
+      'Organize Imports',
+      asCommand: true,
+    );
+  }
+
+  test_failsIfFileHasErrors() async {
+    final content = 'invalid dart code';
+    await newFile(mainFilePath, content: content);
+    await initialize();
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.organizeImports);
+    expect(codeAction, isNotNull);
+
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+
+    // Ensure the request returned an error (error repsonses are thrown by
+    // the test helper to make consuming success results simpler).
+    await expectLater(executeCommand(command),
+        throwsA(isResponseError(ServerErrorCodes.FileHasErrors)));
+  }
+
+  test_noEdits() async {
+    const content = '''
+import 'dart:async';
+import 'dart:math';
+
+Future foo;
+int minified(int x, int y) => min(x, y);
+    ''';
+    await newFile(mainFilePath, content: content);
+    await initialize();
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.organizeImports);
+    expect(codeAction, isNotNull);
+
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+
+    // Execute the command and it should return without needing us to process
+    // a workspace/applyEdit command because there were no edits.
+    final commandResponse = await executeCommand(command);
+    // Successful edits return an empty success() response.
+    expect(commandResponse, isNull);
+  }
+
+  test_unavailableWhenNotRequested() async {
+    await newFile(mainFilePath);
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.Refactor]),
+    );
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.organizeImports);
+    expect(codeAction, isNull);
+  }
+}
+
+@reflectiveTest
+class SortMembersSourceCodeActionsTest extends AbstractCodeActionsTest {
+  test_appliesCorrectEdits_withDocumentChangesSupport() async {
+    const content = '''
+    String b;
+    String a;
+    ''';
+    const expectedContent = '''
+    String a;
+    String b;
+    ''';
+    await newFile(mainFilePath, content: content);
+    await initialize(
+        workspaceCapabilities:
+            withDocumentChangesSupport(emptyWorkspaceClientCapabilities));
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.sortMembers);
+    expect(codeAction, isNotNull);
+
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+
+    ApplyWorkspaceEditParams editParams;
+
+    final commandResponse = await handleExpectedRequest<Object,
+        ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
+      Method.workspace_applyEdit,
+      () => executeCommand(command),
+      handler: (edit) {
+        // When the server sends the edit back, just keep a copy and say we
+        // applied successfully (it'll be verified below).
+        editParams = edit;
+        return new ApplyWorkspaceEditResponse(true);
+      },
+    );
+    // Successful edits return an empty success() response.
+    expect(commandResponse, isNull);
+
+    // Ensure the edit came back, and using the documentChanges.
+    expect(editParams, isNotNull);
+    expect(editParams.edit.documentChanges, isNotNull);
+    expect(editParams.edit.changes, isNull);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyDocumentChanges(contents, editParams.edit.documentChanges);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  test_appliesCorrectEdits_withoutDocumentChangesSupport() async {
+    const content = '''
+    String b;
+    String a;
+    ''';
+    const expectedContent = '''
+    String a;
+    String b;
+    ''';
+    await newFile(mainFilePath, content: content);
+    await initialize();
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.sortMembers);
+    expect(codeAction, isNotNull);
+
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+
+    ApplyWorkspaceEditParams editParams;
+
+    final commandResponse = await handleExpectedRequest<Object,
+        ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
+      Method.workspace_applyEdit,
+      () => executeCommand(command),
+      handler: (edit) {
+        // When the server sends the edit back, just keep a copy and say we
+        // applied successfully (it'll be verified below).
+        editParams = edit;
+        return new ApplyWorkspaceEditResponse(true);
+      },
+    );
+    // Successful edits return an empty success() response.
+    expect(commandResponse, isNull);
+
+    // Ensure the edit came back, and using changes.
+    expect(editParams, isNotNull);
+    expect(editParams.edit.changes, isNotNull);
+    expect(editParams.edit.documentChanges, isNull);
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyChanges(contents, editParams.edit.changes);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  test_availableAsCodeActionLiteral() async {
+    await newFile(mainFilePath);
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.Source]),
+    );
+
+    await checkCodeActionAvailable(
+      mainFileUri,
+      Commands.sortMembers,
+      'Sort Members',
+      asCodeActionLiteral: true,
+    );
+  }
+
+  test_availableAsCommand() async {
+    await newFile(mainFilePath);
+    await initialize();
+
+    await checkCodeActionAvailable(
+      mainFileUri,
+      Commands.sortMembers,
+      'Sort Members',
+      asCommand: true,
+    );
+  }
+
+  test_failsIfClientDoesntApplyEdits() async {
+    const content = '''
+    String b;
+    String a;
+    ''';
+    await newFile(mainFilePath, content: content);
+    await initialize();
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.sortMembers);
+    expect(codeAction, isNotNull);
+
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+
+    final commandResponse = handleExpectedRequest<Object,
+        ApplyWorkspaceEditParams, ApplyWorkspaceEditResponse>(
+      Method.workspace_applyEdit,
+      () => executeCommand(command),
+      // Claim that we failed tpo apply the edits. This is what the client
+      // would do if the edits provided were for an old version of the
+      // document.
+      handler: (edit) => new ApplyWorkspaceEditResponse(false),
+    );
+
+    // Ensure the request returned an error (error repsonses are thrown by
+    // the test helper to make consuming success results simpler).
+    await expectLater(commandResponse,
+        throwsA(isResponseError(ServerErrorCodes.ClientFailedToApplyEdit)));
+  }
+
+  test_failsIfFileHasErrors() async {
+    final content = 'invalid dart code';
+    await newFile(mainFilePath, content: content);
+    await initialize();
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.sortMembers);
+    expect(codeAction, isNotNull);
+
+    final command = codeAction.map(
+      (command) => command,
+      (codeAction) => codeAction.command,
+    );
+
+    // Ensure the request returned an error (error repsonses are thrown by
+    // the test helper to make consuming success results simpler).
+    await expectLater(executeCommand(command),
+        throwsA(isResponseError(ServerErrorCodes.FileHasErrors)));
+  }
+
+  test_unavailableWhenNotRequested() async {
+    await newFile(mainFilePath);
+    await initialize(
+      textDocumentCapabilities: withCodeActionKinds(
+          emptyTextDocumentClientCapabilities, [CodeActionKind.Refactor]),
+    );
+
+    final codeActions = await getCodeActions(mainFileUri.toString());
+    final codeAction = findCommand(codeActions, Commands.sortMembers);
+    expect(codeAction, isNull);
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/completion_test.dart b/pkg/analysis_server/test/lsp/completion_test.dart
new file mode 100644
index 0000000..23f9b39
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/completion_test.dart
@@ -0,0 +1,227 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CompletionTest);
+  });
+}
+
+@reflectiveTest
+class CompletionTest extends AbstractLspAnalysisServerTest {
+  test_completionKinds_default() async {
+    newFile(join(projectFolderPath, 'file.dart'));
+    newFolder(join(projectFolderPath, 'folder'));
+
+    final content = "import '^';";
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+
+    final file = res.singleWhere((c) => c.label == 'file.dart');
+    final folder = res.singleWhere((c) => c.label == 'folder/');
+    final builtin = res.singleWhere((c) => c.label == 'dart:core');
+    // Default capabilities include File + Module but not Folder.
+    expect(file.kind, equals(CompletionItemKind.File));
+    // We fall back to Module if Folder isn't supported.
+    expect(folder.kind, equals(CompletionItemKind.Module));
+    expect(builtin.kind, equals(CompletionItemKind.Module));
+  }
+
+  test_completionKinds_imports() async {
+    final content = "import '^';";
+
+    // Tell the server we support some specific CompletionItemKinds.
+    await initialize(
+      textDocumentCapabilities: withCompletionItemKinds(
+        emptyTextDocumentClientCapabilities,
+        [
+          CompletionItemKind.File,
+          CompletionItemKind.Folder,
+          CompletionItemKind.Module,
+        ],
+      ),
+    );
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+
+    final file = res.singleWhere((c) => c.label == 'file.dart');
+    final folder = res.singleWhere((c) => c.label == 'folder/');
+    final builtin = res.singleWhere((c) => c.label == 'dart:core');
+    expect(file.kind, equals(CompletionItemKind.File));
+    expect(folder.kind, equals(CompletionItemKind.Folder));
+    expect(builtin.kind, equals(CompletionItemKind.Module));
+  }
+
+  test_completionKinds_supportedSubset() async {
+    final content = '''
+    class MyClass {
+      String abcdefghij;
+    }
+
+    main() {
+      MyClass a;
+      a.abc^
+    }
+    ''';
+
+    // Tell the server we only support the Field CompletionItemKind.
+    await initialize(
+      textDocumentCapabilities: withCompletionItemKinds(
+          emptyTextDocumentClientCapabilities, [CompletionItemKind.Field]),
+    );
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+    final kinds = res.map((item) => item.kind).toList();
+
+    // Ensure we only get nulls or Fields (the sample code contains Classes).
+    expect(
+      kinds,
+      everyElement(anyOf(isNull, equals(CompletionItemKind.Field))),
+    );
+  }
+
+  test_gettersAndSetters() async {
+    final content = '''
+    class MyClass {
+      String get justGetter => '';
+      String set justSetter(String value) {}
+      String get getterAndSetter => '';
+      String set getterAndSetter(String value) {}
+    }
+
+    main() {
+      MyClass a;
+      a.^
+    }
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+    final getter = res.singleWhere((c) => c.label == 'justGetter');
+    final setter = res.singleWhere((c) => c.label == 'justSetter');
+    final both = res.singleWhere((c) => c.label == 'getterAndSetter');
+    expect(getter.detail, equals('String'));
+    expect(setter.detail, equals('String'));
+    expect(both.detail, equals('String'));
+    [getter, setter, both].forEach((item) {
+      expect(item.kind, equals(CompletionItemKind.Property));
+    });
+  }
+
+  test_insideString() async {
+    final content = '''
+    var a = "This is ^a test"
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+    expect(res, isEmpty);
+  }
+
+  test_isDeprecated_notSupported() async {
+    final content = '''
+    class MyClass {
+      @deprecated
+      String abcdefghij;
+    }
+
+    main() {
+      MyClass a;
+      a.abc^
+    }
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+    final item = res.singleWhere((c) => c.label == 'abcdefghij');
+    expect(item.deprecated, isNull);
+    // If the does not say it supports the deprecated flag, we should show
+    // '(deprecated)' in the details.
+    expect(item.detail.toLowerCase(), contains('deprecated'));
+  }
+
+  test_isDeprecated_supported() async {
+    final content = '''
+    class MyClass {
+      @deprecated
+      String abcdefghij;
+    }
+
+    main() {
+      MyClass a;
+      a.abc^
+    }
+    ''';
+
+    await initialize(
+        textDocumentCapabilities: withCompletionItemDeprecatedSupport(
+            emptyTextDocumentClientCapabilities));
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+    final item = res.singleWhere((c) => c.label == 'abcdefghij');
+    expect(item.deprecated, isTrue);
+    // If the client says it supports the deprecated flag, we should not show
+    // deprecated in the details.
+    expect(item.detail, isNot(contains('deprecated')));
+  }
+
+  test_plainText() async {
+    final content = '''
+    class MyClass {
+      String abcdefghij;
+    }
+
+    main() {
+      MyClass a;
+      a.abc^
+    }
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+    expect(res.any((c) => c.label == 'abcdefghij'), isTrue);
+    final item = res.singleWhere((c) => c.label == 'abcdefghij');
+    expect(item.insertTextFormat, equals(InsertTextFormat.PlainText));
+    // ignore: deprecated_member_use
+    expect(item.insertText, anyOf(equals('abcdefghij'), isNull));
+    final updated = applyTextEdits(withoutMarkers(content), [item.textEdit]);
+    expect(updated, contains('a.abcdefghij'));
+  }
+
+  test_unopenFile() async {
+    final content = '''
+    class MyClass {
+      String abcdefghij;
+    }
+
+    main() {
+      MyClass a;
+      a.abc^
+    }
+    ''';
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+    expect(res.any((c) => c.label == 'abcdefghij'), isTrue);
+    final item = res.singleWhere((c) => c.label == 'abcdefghij');
+    expect(item.insertTextFormat, equals(InsertTextFormat.PlainText));
+    // ignore: deprecated_member_use
+    expect(item.insertText, anyOf(equals('abcdefghij'), isNull));
+    final updated = applyTextEdits(withoutMarkers(content), [item.textEdit]);
+    expect(updated, contains('a.abcdefghij'));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/definition_test.dart b/pkg/analysis_server/test/lsp/definition_test.dart
new file mode 100644
index 0000000..4e99a7f
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/definition_test.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DefinitionTest);
+  });
+}
+
+@reflectiveTest
+class DefinitionTest extends AbstractLspAnalysisServerTest {
+  test_acrossFiles() async {
+    final mainContents = '''
+    import 'referenced.dart';
+
+    main() {
+      fo^o();
+    }
+    ''';
+
+    final referencedContents = '''
+    /// Ensure the function is on a line that
+    /// does not exist in the mainContents file
+    /// to ensure we're translating offsets to line/col
+    /// using the correct file's LineInfo
+    /// ...
+    /// ...
+    /// ...
+    /// ...
+    /// ...
+    [[foo]]() {}
+    ''';
+
+    final referencedFileUri =
+        Uri.file(join(projectFolderPath, 'lib', 'referenced.dart'));
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(mainContents));
+    await openFile(referencedFileUri, withoutMarkers(referencedContents));
+    final res =
+        await getDefinition(mainFileUri, positionFromMarker(mainContents));
+
+    expect(res, hasLength(1));
+    Location loc = res.single;
+    expect(loc.range, equals(rangeFromMarkers(referencedContents)));
+    expect(loc.uri, equals(referencedFileUri.toString()));
+  }
+
+  test_singleFile() async {
+    final contents = '''
+    [[foo]]() {
+      fo^o();
+    }
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(contents));
+    final res = await getDefinition(mainFileUri, positionFromMarker(contents));
+
+    expect(res, hasLength(1));
+    Location loc = res.single;
+    expect(loc.range, equals(rangeFromMarkers(contents)));
+    expect(loc.uri, equals(mainFileUri.toString()));
+  }
+
+  test_unopenFile() async {
+    final contents = '''
+    [[foo]]() {
+      fo^o();
+    }
+    ''';
+
+    newFile(mainFilePath, content: withoutMarkers(contents));
+    await initialize();
+    final res = await getDefinition(mainFileUri, positionFromMarker(contents));
+
+    expect(res, hasLength(1));
+    Location loc = res.single;
+    expect(loc.range, equals(rangeFromMarkers(contents)));
+    expect(loc.uri, equals(mainFileUri.toString()));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
new file mode 100644
index 0000000..802d3be
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DiagnosticTest);
+  });
+}
+
+@reflectiveTest
+class DiagnosticTest extends AbstractLspAnalysisServerTest {
+  test_afterDocumentEdits() async {
+    const initialContents = 'int a = 1;';
+    newFile(mainFilePath, content: initialContents);
+
+    final firstDiagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await initialize();
+    final initialDiagnostics = await firstDiagnosticsUpdate;
+    expect(initialDiagnostics, hasLength(0));
+
+    await openFile(mainFileUri, initialContents);
+
+    final secondDiagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await replaceFile(222, mainFileUri, 'String a = 1;');
+    final updatedDiagnostics = await secondDiagnosticsUpdate;
+    expect(updatedDiagnostics, hasLength(1));
+  }
+
+  test_deletedFile() async {
+    newFile(mainFilePath, content: 'String a = 1;');
+
+    final firstDiagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await initialize();
+    final originalDiagnostics = await firstDiagnosticsUpdate;
+    expect(originalDiagnostics, hasLength(1));
+
+    // Deleting the file should result in an update to remove the diagnostics.
+    final secondDiagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await deleteFile(mainFilePath);
+    final updatedDiagnostics = await secondDiagnosticsUpdate;
+    expect(updatedDiagnostics, hasLength(0));
+  }
+
+  test_initialAnalysis() async {
+    newFile(mainFilePath, content: 'String a = 1;');
+
+    final diagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await initialize();
+    final diagnostics = await diagnosticsUpdate;
+    expect(diagnostics, hasLength(1));
+    final diagnostic = diagnostics.first;
+    expect(diagnostic.code, equals('invalid_assignment'));
+    expect(diagnostic.range.start.line, equals(0));
+    expect(diagnostic.range.start.character, equals(11));
+    expect(diagnostic.range.end.line, equals(0));
+    expect(diagnostic.range.end.character, equals(12));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/document_highlights_test.dart b/pkg/analysis_server/test/lsp/document_highlights_test.dart
new file mode 100644
index 0000000..7f002b4
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/document_highlights_test.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DocumentHighlightsTest);
+  });
+}
+
+@reflectiveTest
+class DocumentHighlightsTest extends AbstractLspAnalysisServerTest {
+  test_functions() => _testMarkedContent('''
+    [[main]]() {
+      [[mai^n]]();
+    }
+    ''');
+
+  test_localVariable() => _testMarkedContent('''
+    main() {
+      var [[f^oo]] = 1;
+      print([[foo]]);
+      [[foo]] = 2;
+    }
+    ''');
+
+  test_noResult() => _testMarkedContent('''
+    main() {
+      // This one is in a ^ comment!
+    }
+    ''');
+
+  test_onlySelf() => _testMarkedContent('''
+    main() {
+      [[prin^t]]();
+    }
+    ''');
+
+  test_shadow_inner() => _testMarkedContent('''
+    main() {
+      var foo = 1;
+      func() {
+        var [[fo^o]] = 2;
+        print([[foo]]);
+      }
+    }
+    ''');
+
+  test_shadow_outer() => _testMarkedContent('''
+    main() {
+      var [[foo]] = 1;
+      func() {
+        var foo = 2;
+        print(foo);
+      }
+      print([[fo^o]]);
+    }
+    ''');
+
+  test_topLevelVariable() => _testMarkedContent('''
+    String [[foo]] = 'bar';
+    main() {
+      print([[foo]]);
+      [[fo^o]] = 2;
+    }
+    ''');
+
+  /// Tests highlights in a Dart file using the provided content.
+  /// The content should be marked with a ^ where the highlights request should
+  /// be invoked and with `[[double brackets]]` around each range expected to
+  /// be highlighted (eg. all references to the symbol under ^).
+  /// If the content does not include any `[[double brackets]]` then the response
+  /// is expected to be `null`.
+  _testMarkedContent(String content) async {
+    final expectedRanges = rangesFromMarkers(content);
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+
+    final pos = positionFromMarker(content);
+    final highlights = await getDocumentHighlights(mainFileUri, pos);
+
+    if (expectedRanges.isEmpty) {
+      expect(highlights, isNull);
+    } else {
+      final highlightRanges = highlights.map((h) => h.range).toList();
+      expect(highlightRanges, equals(expectedRanges));
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/document_symbols_test.dart b/pkg/analysis_server/test/lsp/document_symbols_test.dart
new file mode 100644
index 0000000..b29ec7e
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/document_symbols_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DocumentSymbolsTest);
+  });
+}
+
+@reflectiveTest
+class DocumentSymbolsTest extends AbstractLspAnalysisServerTest {
+  test_hierarchical() async {
+    const content = '''
+    String topLevel = '';
+    class MyClass {
+      int myField;
+      MyClass(this.myField);
+      myMethod() {}
+    }
+    ''';
+    newFile(mainFilePath, content: content);
+    await initialize(
+        textDocumentCapabilities: withHierarchicalDocumentSymbolSupport(
+            emptyTextDocumentClientCapabilities));
+
+    final result = await getDocumentSymbols(mainFileUri.toString());
+    final symbols = result.map(
+      (docsymbols) => docsymbols,
+      (symbolInfos) => throw 'Expected DocumentSymbols, got SymbolInformations',
+    );
+
+    expect(symbols, hasLength(2));
+
+    final topLevel = symbols[0];
+    expect(topLevel.name, equals('topLevel'));
+    expect(topLevel.kind, equals(SymbolKind.Variable));
+
+    final myClass = symbols[1];
+    expect(myClass.name, equals('MyClass'));
+    expect(myClass.kind, equals(SymbolKind.Class));
+    expect(myClass.children, hasLength(3));
+
+    final field = myClass.children[0];
+    expect(field.name, equals('myField'));
+    expect(field.kind, equals(SymbolKind.Field));
+
+    final constructor = myClass.children[1];
+    expect(constructor.name, equals('MyClass'));
+    expect(constructor.kind, equals(SymbolKind.Constructor));
+
+    final method = myClass.children[2];
+    expect(method.name, equals('myMethod'));
+    expect(method.kind, equals(SymbolKind.Method));
+  }
+
+  test_flat() async {
+    const content = '''
+    String topLevel = '';
+    class MyClass {
+      int myField;
+      MyClass(this.myField);
+      myMethod() {}
+    }
+    ''';
+    newFile(mainFilePath, content: content);
+    await initialize();
+
+    final result = await getDocumentSymbols(mainFileUri.toString());
+    final symbols = result.map(
+      (docsymbols) => throw 'Expected SymbolInformations, got DocumentSymbols',
+      (symbolInfos) => symbolInfos,
+    );
+    expect(symbols, hasLength(5));
+
+    final topLevel = symbols[0];
+    expect(topLevel.name, equals('topLevel'));
+    expect(topLevel.kind, equals(SymbolKind.Variable));
+    expect(topLevel.containerName, isNull);
+
+    final myClass = symbols[1];
+    expect(myClass.name, equals('MyClass'));
+    expect(myClass.kind, equals(SymbolKind.Class));
+    expect(myClass.containerName, isNull);
+
+    final field = symbols[2];
+    expect(field.name, equals('myField'));
+    expect(field.kind, equals(SymbolKind.Field));
+    expect(field.containerName, equals(myClass.name));
+
+    final constructor = symbols[3];
+    expect(constructor.name, equals('MyClass'));
+    expect(constructor.kind, equals(SymbolKind.Constructor));
+    expect(constructor.containerName, equals(myClass.name));
+
+    final method = symbols[4];
+    expect(method.name, equals('myMethod'));
+    expect(method.kind, equals(SymbolKind.Method));
+    expect(method.containerName, equals(myClass.name));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/file_modification_test.dart b/pkg/analysis_server/test/lsp/file_modification_test.dart
new file mode 100644
index 0000000..5c5d8aa
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/file_modification_test.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FileModificationTest);
+  });
+}
+
+@reflectiveTest
+class FileModificationTest extends AbstractLspAnalysisServerTest {
+  test_change_badPosition() async {
+    final contents = '';
+    await initialize();
+    await openFile(mainFileUri, contents);
+
+    // Since this is a notification and not a request, the server cannot
+    // respond with an error, but instead sends a ShowMessage notification
+    // to alert the user to something failing.
+    final error = await expectErrorNotification<ShowMessageParams>(() async {
+      await changeFile(222, mainFileUri, [
+        new TextDocumentContentChangeEvent(
+          new Range(new Position(999, 999), new Position(999, 999)),
+          null,
+          '   ',
+        )
+      ]);
+    });
+
+    expect(error.message, contains('Invalid line'));
+  }
+
+  test_change_fullContents() async {
+    final initialContent = 'int a = 1;';
+    final updatedContent = 'int a = 2;';
+
+    await initialize();
+    await openFile(mainFileUri, initialContent);
+    await replaceFile(222, mainFileUri, updatedContent);
+    expect(_getOverlay(mainFilePath), equals(updatedContent));
+
+    final documentVersion = server.getVersionedDocumentIdentifier(mainFilePath);
+    expect(documentVersion.version, equals(222));
+  }
+
+  test_change_incremental() async {
+    final initialContent = '0123456789\n0123456789';
+    final expectedUpdatedContent = '0123456789\n01234   89';
+
+    await initialize();
+    await openFile(mainFileUri, initialContent);
+    await changeFile(222, mainFileUri, [
+      // Replace line1:5-1:8 with spaces.
+      new TextDocumentContentChangeEvent(
+        new Range(new Position(1, 5), new Position(1, 8)),
+        null,
+        '   ',
+      )
+    ]);
+    expect(_getOverlay(mainFilePath), equals(expectedUpdatedContent));
+
+    final documentVersion = server.getVersionedDocumentIdentifier(mainFilePath);
+    expect(documentVersion.version, equals(222));
+  }
+
+  test_change_unopenedFile() async {
+    // It's not valid for a client to send a request to modify a file that it
+    // has not opened, but Visual Studio has done it in the past so we should
+    // ensure it generates an obvious error that the user can understand.
+    final simpleEdit = new TextDocumentContentChangeEvent(
+      new Range(new Position(1, 1), new Position(1, 1)),
+      null,
+      'test',
+    );
+    await initialize();
+    final notificationParams = await expectErrorNotification<ShowMessageParams>(
+      () => changeFile(222, mainFileUri, [simpleEdit]),
+    );
+    expect(notificationParams, isNotNull);
+    expect(
+      notificationParams.message,
+      allOf(
+        contains('because the file was not previously opened'),
+        contains(mainFilePath),
+      ),
+    );
+  }
+
+  test_close() async {
+    final initialContent = 'int a = 1;';
+    final updatedContent = 'int a = 2;';
+
+    await initialize();
+    await openFile(mainFileUri, initialContent);
+    await replaceFile(222, mainFileUri, updatedContent);
+    await closeFile(mainFileUri);
+    expect(_getOverlay(mainFilePath), isNull);
+
+    // When we close a file, we expect the version in the versioned identifier to
+    // return to `null`.
+    final documentVersion = server.getVersionedDocumentIdentifier(mainFilePath);
+    expect(documentVersion.version, isNull);
+  }
+
+  test_open() async {
+    const testContent = 'CONTENT';
+
+    await initialize();
+    expect(_getOverlay(mainFilePath), isNull);
+    await openFile(mainFileUri, testContent, version: 2);
+    expect(_getOverlay(mainFilePath), equals(testContent));
+
+    // The version for a file that's just been opened (and never modified) is
+    // `null` (this means the contents match what's on disk).
+    final documentVersion = server.getVersionedDocumentIdentifier(mainFilePath);
+    expect(documentVersion.version, 2);
+  }
+
+  test_open_invalidPath() async {
+    await initialize();
+
+    final notificationParams = await expectErrorNotification<ShowMessageParams>(
+      () => openFile(new Uri.http('localhost', 'not-a-file'), ''),
+    );
+    expect(notificationParams, isNotNull);
+    expect(
+      notificationParams.message,
+      contains('URI was not a valid file:// URI'),
+    );
+  }
+
+  String _getOverlay(String path) {
+    if (server.resourceProvider.hasOverlay(path)) {
+      return server.resourceProvider.getFile(path).readAsStringSync();
+    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/format_test.dart b/pkg/analysis_server/test/lsp/format_test.dart
new file mode 100644
index 0000000..17a34b0
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/format_test.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../tool/lsp_spec/matchers.dart';
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FormatTest);
+  });
+}
+
+@reflectiveTest
+class FormatTest extends AbstractLspAnalysisServerTest {
+  test_alreadyFormatted() async {
+    const contents = '''main() {
+  print('test');
+}
+''';
+    await initialize();
+    await openFile(mainFileUri, contents);
+
+    final formatEdits = await formatDocument(mainFileUri.toString());
+    expect(formatEdits, isNull);
+  }
+
+  test_formatOnType_simple() async {
+    const contents = '''
+    main  ()
+    {
+
+        print('test');
+    ^}
+    ''';
+    final expected = '''main() {
+  print('test');
+}
+''';
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(contents));
+
+    final formatEdits = await formatOnType(
+        mainFileUri.toString(), positionFromMarker(contents), '}');
+    expect(formatEdits, isNotNull);
+    final formattedContents = applyTextEdits(contents, formatEdits);
+    expect(formattedContents, equals(expected));
+  }
+
+  test_invalidSyntax() async {
+    const contents = '''main(((( {
+  print('test');
+}
+''';
+    await initialize();
+    await openFile(mainFileUri, contents);
+
+    final formatEdits = await formatDocument(mainFileUri.toString());
+    expect(formatEdits, isNull);
+  }
+
+  test_path_doesNotExist() async {
+    await initialize();
+
+    await expectLater(
+      formatDocument(
+          new Uri.file(join(projectFolderPath, 'missing.dart')).toString()),
+      throwsA(isResponseError(ServerErrorCodes.InvalidFilePath)),
+    );
+  }
+
+  test_path_invalidFormat() async {
+    await initialize();
+
+    await expectLater(
+      // Add some invalid path characters to the end of a valid file:// URI.
+      formatDocument(mainFileUri.toString() + '***'),
+      throwsA(isResponseError(ServerErrorCodes.InvalidFilePath)),
+    );
+  }
+
+  test_path_notFileScheme() async {
+    await initialize();
+
+    await expectLater(
+      formatDocument('a:/a.a'),
+      throwsA(isResponseError(ServerErrorCodes.InvalidFilePath)),
+    );
+  }
+
+  test_simple() async {
+    const contents = '''
+    main  ()
+    {
+
+        print('test');
+    }
+    ''';
+    final expected = '''main() {
+  print('test');
+}
+''';
+    await initialize();
+    await openFile(mainFileUri, contents);
+
+    final formatEdits = await formatDocument(mainFileUri.toString());
+    expect(formatEdits, isNotNull);
+    final formattedContents = applyTextEdits(contents, formatEdits);
+    expect(formattedContents, equals(expected));
+  }
+
+  test_unopenFile() async {
+    const contents = '''
+    main  ()
+    {
+
+        print('test');
+    }
+    ''';
+    final expected = '''main() {
+  print('test');
+}
+''';
+    newFile(mainFilePath, content: contents);
+    await initialize();
+
+    final formatEdits = await formatDocument(mainFileUri.toString());
+    expect(formatEdits, isNotNull);
+    final formattedContents = applyTextEdits(contents, formatEdits);
+    expect(formattedContents, equals(expected));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/hover_test.dart b/pkg/analysis_server/test/lsp/hover_test.dart
new file mode 100644
index 0000000..f1312e2
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/hover_test.dart
@@ -0,0 +1,219 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../tool/lsp_spec/matchers.dart';
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(HoverTest);
+  });
+}
+
+@reflectiveTest
+class HoverTest extends AbstractLspAnalysisServerTest {
+  test_hover_bad_position() async {
+    await initialize();
+    await openFile(mainFileUri, '');
+    await expectLater(
+      () => getHover(mainFileUri, new Position(999, 999)),
+      throwsA(isResponseError(ServerErrorCodes.InvalidFileLineCol)),
+    );
+  }
+
+  test_markdown_isFormattedForDisplay() async {
+    final content = '''
+    /// This is a string.
+    ///
+    /// {@template foo}
+    /// With some [refs] and some
+    /// [links](https://www.dartlang.org/)
+    /// {@endTemplate foo}
+    ///
+    /// ```dart sample
+    /// print();
+    /// ```
+    String [[a^bc]];
+    ''';
+
+    final expectedHoverContent = '''
+```dart
+String abc
+```
+---
+This is a string.
+
+With some [refs] and some
+[links](https://www.dartlang.org/)
+
+```dart
+print();
+```
+    '''
+        .trim();
+
+    await initialize(
+        textDocumentCapabilities: withHoverContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    final hover = await getHover(mainFileUri, positionFromMarker(content));
+    expect(hover, isNotNull);
+    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover.contents, isNotNull);
+    final markup = _getMarkupContents(hover);
+    expect(markup.kind, equals(MarkupKind.Markdown));
+    expect(markup.value, equals(expectedHoverContent));
+  }
+
+  test_markdown_simple() async {
+    final content = '''
+    /// This is a string.
+    String [[a^bc]];
+    ''';
+
+    await initialize(
+        textDocumentCapabilities: withHoverContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    final hover = await getHover(mainFileUri, positionFromMarker(content));
+    expect(hover, isNotNull);
+    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover.contents, isNotNull);
+    final markup = _getMarkupContents(hover);
+    expect(markup.kind, equals(MarkupKind.Markdown));
+    expect(markup.value, contains('This is a string.'));
+  }
+
+  test_noElement() async {
+    final content = '''
+    String abc;
+
+    ^
+
+    int a;
+    ''';
+
+    await initialize(
+        textDocumentCapabilities: withHoverContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    var hover = await getHover(mainFileUri, positionFromMarker(content));
+    expect(hover, isNull);
+  }
+
+  test_plainText_simple() async {
+    final content = '''
+    /// This is a string.
+    String [[a^bc]];
+    ''';
+
+    await initialize(
+        textDocumentCapabilities: withHoverContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.PlainText]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    final hover = await getHover(mainFileUri, positionFromMarker(content));
+    expect(hover, isNotNull);
+    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover.contents, isNotNull);
+    // Ensure we got PlainText back as the type, even though we're sending the
+    // same markdown content.
+    final markup = _getMarkupContents(hover);
+    expect(markup.kind, equals(MarkupKind.PlainText));
+    expect(markup.value, contains('This is a string.'));
+  }
+
+  test_string_noDocComment() async {
+    final content = '''
+    String [[a^bc]];
+    ''';
+
+    final expectedHoverContent = '''
+```dart
+String abc
+```
+    '''
+        .trim();
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    final hover = await getHover(mainFileUri, positionFromMarker(content));
+    expect(hover, isNotNull);
+    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover.contents, isNotNull);
+    expect(_getStringContents(hover), equals(expectedHoverContent));
+  }
+
+  test_string_reflectsLatestEdits() async {
+    final original = '''
+    /// Original string.
+    String [[a^bc]];
+    ''';
+    final updated = '''
+    /// Updated string.
+    String [[a^bc]];
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(original));
+    var hover = await getHover(mainFileUri, positionFromMarker(original));
+    var contents = _getStringContents(hover);
+    expect(contents, contains('Original'));
+
+    await replaceFile(222, mainFileUri, withoutMarkers(updated));
+    hover = await getHover(mainFileUri, positionFromMarker(updated));
+    contents = _getStringContents(hover);
+    expect(contents, contains('Updated'));
+  }
+
+  test_string_simple() async {
+    final content = '''
+    /// This is a string.
+    String [[a^bc]];
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    final hover = await getHover(mainFileUri, positionFromMarker(content));
+    expect(hover, isNotNull);
+    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover.contents, isNotNull);
+    final contents = _getStringContents(hover);
+    expect(contents, contains('This is a string.'));
+  }
+
+  test_unopenFile() async {
+    final content = '''
+    /// This is a string.
+    String [[a^bc]];
+    ''';
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+    final hover = await getHover(mainFileUri, positionFromMarker(content));
+    expect(hover, isNotNull);
+    expect(hover.range, equals(rangeFromMarkers(content)));
+    expect(hover.contents, isNotNull);
+    final markup = _getStringContents(hover);
+    expect(markup, contains('This is a string.'));
+  }
+
+  MarkupContent _getMarkupContents(Hover hover) {
+    return hover.contents.map(
+      (t1) => throw 'Hover contents were String, not MarkupContent',
+      (t2) => t2,
+    );
+  }
+
+  String _getStringContents(Hover hover) {
+    return hover.contents.map(
+      (t1) => t1,
+      (t2) => throw 'Hover contents were MarkupContent, not String',
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
new file mode 100644
index 0000000..7afb2a5
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InitializationTest);
+  });
+}
+
+@reflectiveTest
+class InitializationTest extends AbstractLspAnalysisServerTest {
+  test_initialize() async {
+    final response = await initialize();
+    expect(response, isNotNull);
+    expect(response.error, isNull);
+    expect(response.result, isNotNull);
+    expect(response.result, TypeMatcher<InitializeResult>());
+    InitializeResult result = response.result;
+    expect(result.capabilities, isNotNull);
+    // Check some basic capabilities that are unlikely to change.
+    expect(result.capabilities.textDocumentSync, isNotNull);
+    result.capabilities.textDocumentSync.map(
+      (options) {
+        // We'll always request open/closed notifications and incremental updates.
+        expect(options.openClose, isTrue);
+        expect(options.change, equals(TextDocumentSyncKind.Incremental));
+      },
+      (_) =>
+          throw 'Expected textDocumentSync capabilities to be a $TextDocumentSyncOptions',
+    );
+  }
+
+  test_initialize_onlyAllowedOnce() async {
+    await initialize();
+    final response = await initialize();
+    expect(response, isNotNull);
+    expect(response.result, isNull);
+    expect(response.error, isNotNull);
+    expect(
+        response.error.code, equals(ServerErrorCodes.ServerAlreadyInitialized));
+  }
+
+  test_initialize_rootPath() async {
+    await initialize(rootPath: projectFolderPath);
+    expect(server.contextManager.includedPaths, equals([projectFolderPath]));
+  }
+
+  test_initialize_rootUri() async {
+    await initialize(rootUri: projectFolderUri);
+    expect(server.contextManager.includedPaths, equals([projectFolderPath]));
+  }
+
+  test_initialize_workspaceFolders() async {
+    await initialize(workspaceFolders: [projectFolderUri]);
+    expect(server.contextManager.includedPaths, equals([projectFolderPath]));
+  }
+
+  test_uninitialized_dropsNotifications() async {
+    final notification =
+        makeNotification(new Method.fromJson('randomNotification'), null);
+    final nextNotification = channel.errorNotificationsFromServer.first;
+    channel.sendNotificationToServer(notification);
+
+    // Wait up to 1sec to ensure no error/log notifications were sent back.
+    var didTimeout = false;
+    final notificationFromServer = await nextNotification.timeout(
+      const Duration(seconds: 1),
+      onTimeout: () {
+        didTimeout = true;
+      },
+    );
+
+    expect(notificationFromServer, isNull);
+    expect(didTimeout, isTrue);
+  }
+
+  test_uninitialized_rejectsRequests() async {
+    final request = makeRequest(new Method.fromJson('randomRequest'), null);
+    final logParams = await expectErrorNotification<LogMessageParams>(() async {
+      final response = await channel.sendRequestToServer(request);
+      expect(response.id, equals(request.id));
+      expect(response.result, isNull);
+      expect(response.error, isNotNull);
+      expect(response.error.code, ErrorCodes.ServerNotInitialized);
+    });
+    expect(logParams.type, equals(MessageType.Error));
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/priority_files_test.dart b/pkg/analysis_server/test/lsp/priority_files_test.dart
new file mode 100644
index 0000000..7a7b330
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/priority_files_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PriorityFilesTest);
+  });
+}
+
+@reflectiveTest
+class PriorityFilesTest extends AbstractLspAnalysisServerTest {
+  test_close() async {
+    await initialize();
+    await openFile(mainFileUri, '');
+    await closeFile(mainFileUri);
+
+    expect(server.priorityFiles, isNot(contains(mainFilePath)));
+    server.driverMap.values.forEach((driver) {
+      expect(driver.priorityFiles, isNot(contains(mainFilePath)));
+    });
+  }
+
+  test_open() async {
+    await initialize();
+    await openFile(mainFileUri, '');
+
+    expect(server.priorityFiles, contains(mainFilePath));
+    server.driverMap.values.forEach((driver) {
+      expect(driver.priorityFiles, contains(mainFilePath));
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/references_test.dart b/pkg/analysis_server/test/lsp/references_test.dart
new file mode 100644
index 0000000..bd36c11
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/references_test.dart
@@ -0,0 +1,141 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReferencesTest);
+  });
+}
+
+@reflectiveTest
+class ReferencesTest extends AbstractLspAnalysisServerTest {
+  test_acrossFiles_includeDeclaration() async {
+    final mainContents = '''
+    import 'referenced.dart';
+
+    main() {
+      [[foo]]();
+    }
+    ''';
+
+    final referencedContents = '''
+    /// Ensure the function is on a line that
+    /// does not exist in the mainContents file
+    /// to ensure we're translating offsets to line/col
+    /// using the correct file's LineInfo
+    /// ...
+    /// ...
+    /// ...
+    /// ...
+    /// ...
+    [[^foo]]() {}
+    ''';
+
+    final referencedFileUri =
+        Uri.file(join(projectFolderPath, 'lib', 'referenced.dart'));
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(mainContents));
+    await openFile(referencedFileUri, withoutMarkers(referencedContents));
+    final res = await getReferences(
+      referencedFileUri,
+      positionFromMarker(referencedContents),
+      includeDeclarations: true,
+    );
+
+    // Ensure both the reference and the declaration are included.
+    expect(res, hasLength(2));
+    expect(
+        res,
+        contains(new Location(
+            mainFileUri.toString(), rangeFromMarkers(mainContents))));
+    expect(
+        res,
+        contains(new Location(referencedFileUri.toString(),
+            rangeFromMarkers(referencedContents))));
+  }
+
+  test_acrossFiles_withoutDeclaration() async {
+    final mainContents = '''
+    import 'referenced.dart';
+
+    main() {
+      [[foo]]();
+    }
+    ''';
+
+    final referencedContents = '''
+    /// Ensure the function is on a line that
+    /// does not exist in the mainContents file
+    /// to ensure we're translating offsets to line/col
+    /// using the correct file's LineInfo
+    /// ...
+    /// ...
+    /// ...
+    /// ...
+    /// ...
+    ^foo() {}
+    ''';
+
+    final referencedFileUri =
+        Uri.file(join(projectFolderPath, 'lib', 'referenced.dart'));
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(mainContents));
+    await openFile(referencedFileUri, withoutMarkers(referencedContents));
+    final res = await getReferences(
+        referencedFileUri, positionFromMarker(referencedContents));
+
+    expect(res, hasLength(1));
+    Location loc = res.single;
+    expect(loc.range, equals(rangeFromMarkers(mainContents)));
+    expect(loc.uri, equals(mainFileUri.toString()));
+  }
+
+  test_singleFile_withoutDeclaration() async {
+    final contents = '''
+    f^oo() {
+      [[foo]]();
+    }
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(contents));
+    final res = await getReferences(mainFileUri, positionFromMarker(contents));
+
+    expect(res, hasLength(1));
+    expect(
+      res,
+      contains(
+        new Location(mainFileUri.toString(), rangeFromMarkers(contents)),
+      ),
+    );
+  }
+
+  test_unopenFile() async {
+    final contents = '''
+    f^oo() {
+      [[foo]]();
+    }
+    ''';
+
+    newFile(mainFilePath, content: withoutMarkers(contents));
+    await initialize();
+    final res = await getReferences(mainFileUri, positionFromMarker(contents));
+
+    expect(res, hasLength(1));
+    expect(
+      res,
+      contains(
+        new Location(mainFileUri.toString(), rangeFromMarkers(contents)),
+      ),
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/rename_test.dart b/pkg/analysis_server/test/lsp/rename_test.dart
new file mode 100644
index 0000000..6226b60
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/rename_test.dart
@@ -0,0 +1,348 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/lsp/constants.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RenameTest);
+  });
+}
+
+@reflectiveTest
+class RenameTest extends AbstractLspAnalysisServerTest {
+  // TODO(dantup): send a rename without a version
+  // TODO(dantup): send an old version of the doc?
+  // TODO(dantup): check the version returned matches?
+  // TODO(dantup): renames across multiple files
+
+  test_prepare_class() {
+    const content = '''
+    class MyClass {}
+    final a = new [[My^Class]]();
+    ''';
+
+    return _test_prepare(content, 'MyClass');
+  }
+
+  test_prepare_classNewKeyword() async {
+    const content = '''
+    class MyClass {}
+    final a = n^ew [[MyClass]]();
+    ''';
+
+    return _test_prepare(content, 'MyClass');
+  }
+
+  test_prepare_importPrefix() async {
+    const content = '''
+    import 'dart:async' as [[myPr^efix]];
+    ''';
+
+    return _test_prepare(content, 'myPrefix');
+  }
+
+  test_prepare_importWithoutPrefix() async {
+    const content = '''
+    imp[[^]]ort 'dart:async';
+    ''';
+
+    return _test_prepare(content, '');
+  }
+
+  test_prepare_importWithPrefix() async {
+    const content = '''
+    imp^ort 'dart:async' as [[myPrefix]];
+    ''';
+
+    return _test_prepare(content, 'myPrefix');
+  }
+
+  test_prepare_invalidRenameLocation() async {
+    const content = '''
+    main() {
+      // comm^ent
+    }
+    ''';
+
+    return _test_prepare(content, null);
+  }
+
+  test_prepare_sdkClass() async {
+    const content = '''
+    final a = new [[Ob^ject]]();
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+
+    final request = makeRequest(
+      Method.textDocument_prepareRename,
+      new TextDocumentPositionParams(
+        new TextDocumentIdentifier(mainFileUri.toString()),
+        positionFromMarker(content),
+      ),
+    );
+    final response = await channel.sendRequestToServer(request);
+
+    expect(response.id, equals(request.id));
+    expect(response.result, isNull);
+    expect(response.error, isNotNull);
+    expect(response.error.code, ServerErrorCodes.RenameNotValid);
+    expect(response.error.message, contains('is defined in the SDK'));
+  }
+
+  test_prepare_variable() async {
+    const content = '''
+    main() {
+      var variable = 0;
+      print([[vari^able]]);
+    }
+    ''';
+
+    return _test_prepare(content, 'variable');
+  }
+
+  test_rename_class() {
+    const content = '''
+    class MyClass {}
+    final a = new [[My^Class]]();
+    ''';
+    const expectedContent = '''
+    class MyNewClass {}
+    final a = new MyNewClass();
+    ''';
+    return _test_rename_withDocumentChanges(
+        content, 'MyNewClass', expectedContent);
+  }
+
+  test_rename_classNewKeyword() async {
+    const content = '''
+    class MyClass {}
+    final a = n^ew MyClass();
+    ''';
+    const expectedContent = '''
+    class MyNewClass {}
+    final a = new MyNewClass();
+    ''';
+    return _test_rename_withDocumentChanges(
+        content, 'MyNewClass', expectedContent);
+  }
+
+  test_rename_importPrefix() {
+    const content = '''
+    import 'dart:async' as myPr^efix;
+    ''';
+    const expectedContent = '''
+    import 'dart:async' as myNewPrefix;
+    ''';
+    return _test_rename_withDocumentChanges(
+        content, 'myNewPrefix', expectedContent);
+  }
+
+  test_rename_importWithoutPrefix() {
+    const content = '''
+    imp^ort 'dart:async';
+    ''';
+    const expectedContent = '''
+    import 'dart:async' as myAddedPrefix;
+    ''';
+    return _test_rename_withDocumentChanges(
+        content, 'myAddedPrefix', expectedContent);
+  }
+
+  test_rename_importWithPrefix() {
+    const content = '''
+    imp^ort 'dart:async' as myPrefix;
+    ''';
+    const expectedContent = '''
+    import 'dart:async' as myNewPrefix;
+    ''';
+    return _test_rename_withDocumentChanges(
+        content, 'myNewPrefix', expectedContent);
+  }
+
+  test_rename_invalidRenameLocation() {
+    const content = '''
+    main() {
+      // comm^ent
+    }
+    ''';
+    return _test_rename_withDocumentChanges(content, 'MyNewClass', null);
+  }
+
+  test_rename_rejectedForBadName() async {
+    const content = '''
+    class MyClass {}
+    final a = n^ew MyClass();
+    ''';
+    final error = await _test_rename_failure(content, 'not a valid class name');
+    expect(error.code, equals(ServerErrorCodes.RenameNotValid));
+    expect(error.message, contains('name must not contain'));
+  }
+
+  test_rename_rejectedForDuplicateName() async {
+    const content = '''
+    class MyOtherClass {}
+    class MyClass {}
+    final a = n^ew MyClass();
+    ''';
+    final error = await _test_rename_failure(content, 'MyOtherClass');
+    expect(error.code, equals(ServerErrorCodes.RenameNotValid));
+    expect(error.message, contains('already declares class with name'));
+  }
+
+  test_rename_rejectedForStaleDocument() async {
+    const content = '''
+    class MyClass {}
+    final a = n^ew MyClass();
+    ''';
+    final error =
+        await _test_rename_failure(content, 'MyNewClass', openFileVersion: 111);
+    expect(error.code, equals(ErrorCodes.ContentModified));
+    expect(error.message, contains('Document was modified'));
+  }
+
+  test_rename_sdkClass() async {
+    const content = '''
+    final a = new [[Ob^ject]]();
+    ''';
+
+    await newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize();
+
+    final request = makeRequest(
+      Method.textDocument_rename,
+      new RenameParams(
+        new TextDocumentIdentifier(mainFileUri.toString()),
+        positionFromMarker(content),
+        'Object2',
+      ),
+    );
+    final response = await channel.sendRequestToServer(request);
+
+    expect(response.id, equals(request.id));
+    expect(response.result, isNull);
+    expect(response.error, isNotNull);
+    expect(response.error.code, ServerErrorCodes.RenameNotValid);
+    expect(response.error.message, contains('is defined in the SDK'));
+  }
+
+  test_rename_usingLegacyChangeInterface() async {
+    // This test initializes without support for DocumentChanges (versioning)
+    // whereas the other tests all use DocumentChanges support (preferred).
+    const content = '''
+    class MyClass {}
+    final a = new My^Class();
+    ''';
+    const expectedContent = '''
+    class MyNewClass {}
+    final a = new MyNewClass();
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content), version: 222);
+
+    final result = await rename(
+      mainFileUri,
+      222,
+      positionFromMarker(content),
+      'MyNewClass',
+    );
+
+    // Ensure applying the changes will give us the expected content.
+    final contents = {
+      mainFilePath: withoutMarkers(content),
+    };
+    applyChanges(contents, result.changes);
+    expect(contents[mainFilePath], equals(expectedContent));
+  }
+
+  test_rename_variable() {
+    const content = '''
+    main() {
+      var variable = 0;
+      print([[vari^able]]);
+    }
+    ''';
+    const expectedContent = '''
+    main() {
+      var foo = 0;
+      print(foo);
+    }
+    ''';
+    return _test_rename_withDocumentChanges(content, 'foo', expectedContent);
+  }
+
+  _test_prepare(String content, String expectedPlaceholder) async {
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+
+    final result =
+        await prepareRename(mainFileUri, positionFromMarker(content));
+
+    if (expectedPlaceholder == null) {
+      expect(result, isNull);
+    } else {
+      expect(result.range, equals(rangeFromMarkers(content)));
+      expect(result.placeholder, equals(expectedPlaceholder));
+    }
+  }
+
+  Future<ResponseError> _test_rename_failure(
+    String content,
+    String newName, {
+    int openFileVersion = 222,
+    int renameRequestFileVersion = 222,
+  }) async {
+    await initialize(
+      workspaceCapabilities:
+          withDocumentChangesSupport(emptyWorkspaceClientCapabilities),
+    );
+    await openFile(mainFileUri, withoutMarkers(content),
+        version: openFileVersion);
+
+    final result = await renameRaw(
+      mainFileUri,
+      renameRequestFileVersion,
+      positionFromMarker(content),
+      newName,
+    );
+
+    expect(result.result, isNull);
+    expect(result.error, isNotNull);
+    return result.error;
+  }
+
+  _test_rename_withDocumentChanges(
+      String content, String newName, String expectedContent) async {
+    await initialize(
+      workspaceCapabilities:
+          withDocumentChangesSupport(emptyWorkspaceClientCapabilities),
+    );
+    await openFile(mainFileUri, withoutMarkers(content), version: 222);
+
+    final result = await rename(
+      mainFileUri,
+      222,
+      positionFromMarker(content),
+      newName,
+    );
+    if (expectedContent == null) {
+      expect(result, isNull);
+    } else {
+      // Ensure applying the changes will give us the expected content.
+      final contents = {
+        mainFilePath: withoutMarkers(content),
+      };
+      applyDocumentChanges(contents, result.documentChanges);
+      expect(contents[mainFilePath], equals(expectedContent));
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
new file mode 100644
index 0000000..fad7baf
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -0,0 +1,773 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
+import 'package:analysis_server/src/lsp/mapping.dart';
+import 'package:analyzer/instrumentation/instrumentation.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:meta/meta.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+import '../mocks.dart';
+
+const dartLanguageId = 'dart';
+
+/// Useful for debugging locally, setting this to true will cause all JSON
+/// communication to be printed to stdout.
+const debugPrintCommunication = false;
+
+final beginningOfDocument = new Range(new Position(0, 0), new Position(0, 0));
+
+abstract class AbstractLspAnalysisServerTest
+    with ResourceProviderMixin, ClientCapabilitiesHelperMixin {
+  static const positionMarker = '^';
+  static const rangeMarkerStart = '[[';
+  static const rangeMarkerEnd = ']]';
+  static const allMarkers = [positionMarker, rangeMarkerStart, rangeMarkerEnd];
+  static final allMarkersPattern =
+      new RegExp(allMarkers.map(RegExp.escape).join('|'));
+
+  MockLspServerChannel channel;
+  LspAnalysisServer server;
+
+  int _id = 0;
+  String projectFolderPath, mainFilePath;
+  Uri projectFolderUri, mainFileUri;
+
+  void applyChanges(
+    Map<String, String> fileContents,
+    Map<String, List<TextEdit>> changes,
+  ) {
+    changes.forEach((fileUri, edits) {
+      final path = Uri.parse(fileUri).toFilePath();
+      fileContents[path] = applyTextEdits(fileContents[path], edits);
+    });
+  }
+
+  void applyDocumentChanges(
+      Map<String, String> fileContents,
+      Either2<
+              List<TextDocumentEdit>,
+              List<
+                  Either4<TextDocumentEdit, CreateFile, RenameFile,
+                      DeleteFile>>>
+          documentChanges) {
+    documentChanges.map(
+      (edits) => applyTextDocumentEdits(fileContents, edits),
+      (changes) => applyResourceChanges(fileContents, changes),
+    );
+  }
+
+  void applyResourceChanges(
+    Map<String, String> oldFileContent,
+    List<Either4<TextDocumentEdit, CreateFile, RenameFile, DeleteFile>> changes,
+  ) {
+    // TODO(dantup): Implement handling of resource changes (not currently used).
+    throw 'Test helper applyResourceChanges not currently supported';
+  }
+
+  String applyTextDocumentEdit(String content, TextDocumentEdit edit) {
+    return edit.edits.fold(content, applyTextEdit);
+  }
+
+  void applyTextDocumentEdits(
+      Map<String, String> oldFileContent, List<TextDocumentEdit> edits) {
+    edits.forEach((edit) {
+      final path = Uri.parse(edit.textDocument.uri).toFilePath();
+      if (!oldFileContent.containsKey(path)) {
+        throw 'Recieved edits for $path which was not provided as a file to be edited';
+      }
+      oldFileContent[path] = applyTextDocumentEdit(oldFileContent[path], edit);
+    });
+  }
+
+  String applyTextEdit(String content, TextEdit change) {
+    final startPos = change.range.start;
+    final endPos = change.range.end;
+    final lineInfo = LineInfo.fromContent(content);
+    final start = lineInfo.getOffsetOfLine(startPos.line) + startPos.character;
+    final end = lineInfo.getOffsetOfLine(endPos.line) + endPos.character;
+    return content.replaceRange(start, end, change.newText);
+  }
+
+  String applyTextEdits(String oldContent, List<TextEdit> changes) {
+    String newContent = oldContent;
+    // Complex text manipulations are described with an array of TextEdit's,
+    // representing a single change to the document.
+    //
+    //  All text edits ranges refer to positions in the original document. Text
+    // edits ranges must never overlap, that means no part of the original
+    // document must be manipulated by more than one edit. However, it is possible
+    // that multiple edits have the same start position: multiple inserts, or any
+    // number of inserts followed by a single remove or replace edit. If multiple
+    // inserts have the same position, the order in the array defines the order in
+    // which the inserted strings appear in the resulting text.
+
+    /// Ensures changes are simple enough to apply easily without any complicated
+    /// logic.
+    void validateChangesCanBeApplied() {
+      bool intersectsWithOrComesAfter(Position pos, Position other) =>
+          pos.line > other.line ||
+          (pos.line == other.line || pos.character >= other.character);
+
+      Position earliestPositionChanged;
+      for (final change in changes) {
+        if (earliestPositionChanged != null &&
+            intersectsWithOrComesAfter(
+                change.range.end, earliestPositionChanged)) {
+          throw 'Test helper applyTextEdits does not support applying multiple edits '
+              'where the edits are not in reverse order.';
+        }
+        earliestPositionChanged = change.range.start;
+      }
+    }
+
+    validateChangesCanBeApplied();
+    for (final change in changes) {
+      newContent = applyTextEdit(newContent, change);
+    }
+
+    return newContent;
+  }
+
+  Future changeFile(
+    int newVersion,
+    Uri uri,
+    List<TextDocumentContentChangeEvent> changes,
+  ) async {
+    var notification = makeNotification(
+      Method.textDocument_didChange,
+      new DidChangeTextDocumentParams(
+        new VersionedTextDocumentIdentifier(newVersion, uri.toString()),
+        changes,
+      ),
+    );
+    channel.sendNotificationToServer(notification);
+    await pumpEventQueue();
+  }
+
+  Future changeWorkspaceFolders({List<Uri> add, List<Uri> remove}) async {
+    var notification = makeNotification(
+      Method.workspace_didChangeWorkspaceFolders,
+      new DidChangeWorkspaceFoldersParams(
+        new WorkspaceFoldersChangeEvent(
+          add?.map(toWorkspaceFolder)?.toList() ?? const [],
+          remove?.map(toWorkspaceFolder)?.toList() ?? const [],
+        ),
+      ),
+    );
+    channel.sendNotificationToServer(notification);
+    await pumpEventQueue();
+  }
+
+  Future closeFile(Uri uri) async {
+    var notification = makeNotification(
+      Method.textDocument_didClose,
+      new DidCloseTextDocumentParams(
+          new TextDocumentIdentifier(uri.toString())),
+    );
+    channel.sendNotificationToServer(notification);
+    await pumpEventQueue();
+  }
+
+  Future<Object> executeCommand(Command command) async {
+    final request = makeRequest(
+      Method.workspace_executeCommand,
+      new ExecuteCommandParams(
+        command.command,
+        command.arguments,
+      ),
+    );
+    return expectSuccessfulResponseTo(request);
+  }
+
+  Future<T> expectErrorNotification<T>(
+    FutureOr<void> f(), {
+    Duration timeout = const Duration(seconds: 5),
+  }) async {
+    final firstError = channel.errorNotificationsFromServer.first;
+    await f();
+
+    final notificationFromServer = await firstError.timeout(timeout);
+
+    expect(notificationFromServer, isNotNull);
+    return notificationFromServer.params as T;
+  }
+
+  /// Expects a [method] request from the server after executing [f].
+  Future<RequestMessage> expectRequest(
+    Method method,
+    FutureOr<void> f(), {
+    Duration timeout = const Duration(seconds: 5),
+  }) async {
+    final firstRequest =
+        channel.requestsFromServer.firstWhere((n) => n.method == method);
+    await f();
+
+    final requestFromServer = await firstRequest.timeout(timeout);
+
+    expect(requestFromServer, isNotNull);
+    return requestFromServer;
+  }
+
+  /// Sends a request to the server and unwraps the result. Throws if the
+  /// response was not successful or returned an error.
+  Future<T> expectSuccessfulResponseTo<T>(RequestMessage request) async {
+    final resp = await channel.sendRequestToServer(request);
+    if (resp.error != null) {
+      throw resp.error;
+    } else {
+      return resp.result as T;
+    }
+  }
+
+  Future<List<TextEdit>> formatDocument(String fileUri) {
+    final request = makeRequest(
+      Method.textDocument_formatting,
+      new DocumentFormattingParams(
+        new TextDocumentIdentifier(fileUri),
+        new FormattingOptions(2, true), // These currently don't do anything
+      ),
+    );
+    return expectSuccessfulResponseTo(request);
+  }
+
+  Future<List<TextEdit>> formatOnType(
+      String fileUri, Position pos, String character) {
+    final request = makeRequest(
+      Method.textDocument_onTypeFormatting,
+      new DocumentOnTypeFormattingParams(
+        new TextDocumentIdentifier(fileUri),
+        pos,
+        character,
+        new FormattingOptions(2, true), // These currently don't do anything
+      ),
+    );
+    return expectSuccessfulResponseTo(request);
+  }
+
+  Future<List<Either2<Command, CodeAction>>> getCodeActions(
+    String fileUri, {
+    Range range,
+    List<CodeActionKind> kinds,
+  }) {
+    final request = makeRequest(
+      Method.textDocument_codeAction,
+      new CodeActionParams(
+          new TextDocumentIdentifier(fileUri),
+          range ?? beginningOfDocument,
+          // TODO(dantup): We may need to revise the tests/implementation when
+          // it's clear how we're supposed to handle diagnostics:
+          // https://github.com/Microsoft/language-server-protocol/issues/583
+          new CodeActionContext([], kinds)),
+    );
+    return expectSuccessfulResponseTo(request);
+  }
+
+  Future<List<CompletionItem>> getCompletion(Uri uri, Position pos,
+      {CompletionContext context}) {
+    final request = makeRequest(
+      Method.textDocument_completion,
+      new CompletionParams(
+        context,
+        new TextDocumentIdentifier(uri.toString()),
+        pos,
+      ),
+    );
+    return expectSuccessfulResponseTo<List<CompletionItem>>(request);
+  }
+
+  Future<List<Location>> getDefinition(Uri uri, Position pos) {
+    final request = makeRequest(
+      Method.textDocument_definition,
+      new TextDocumentPositionParams(
+        new TextDocumentIdentifier(uri.toString()),
+        pos,
+      ),
+    );
+    return expectSuccessfulResponseTo<List<Location>>(request);
+  }
+
+  Future<List<DocumentHighlight>> getDocumentHighlights(Uri uri, Position pos) {
+    final request = makeRequest(
+      Method.textDocument_documentHighlight,
+      new TextDocumentPositionParams(
+        new TextDocumentIdentifier(uri.toString()),
+        pos,
+      ),
+    );
+    return expectSuccessfulResponseTo<List<DocumentHighlight>>(request);
+  }
+
+  Future<Either2<List<DocumentSymbol>, List<SymbolInformation>>>
+      getDocumentSymbols(String fileUri) {
+    final request = makeRequest(
+      Method.textDocument_documentSymbol,
+      new DocumentSymbolParams(
+        new TextDocumentIdentifier(fileUri),
+      ),
+    );
+    return expectSuccessfulResponseTo(request);
+  }
+
+  Future<Hover> getHover(Uri uri, Position pos) {
+    final request = makeRequest(
+      Method.textDocument_hover,
+      new TextDocumentPositionParams(
+          new TextDocumentIdentifier(uri.toString()), pos),
+    );
+    return expectSuccessfulResponseTo<Hover>(request);
+  }
+
+  Future<List<Location>> getReferences(
+    Uri uri,
+    Position pos, {
+    includeDeclarations = false,
+  }) {
+    final request = makeRequest(
+      Method.textDocument_references,
+      new ReferenceParams(
+        new ReferenceContext(includeDeclarations),
+        new TextDocumentIdentifier(uri.toString()),
+        pos,
+      ),
+    );
+    return expectSuccessfulResponseTo<List<Location>>(request);
+  }
+
+  Future<SignatureHelp> getSignatureHelp(Uri uri, Position pos) {
+    final request = makeRequest(
+      Method.textDocument_signatureHelp,
+      new TextDocumentPositionParams(
+        new TextDocumentIdentifier(uri.toString()),
+        pos,
+      ),
+    );
+    return expectSuccessfulResponseTo<SignatureHelp>(request);
+  }
+
+  /// Executes [f] then waits for a request of type [method] from the server which
+  /// is passed to [handler] to process, then waits for (and returns) the
+  /// response to the original request.
+  ///
+  /// This is used for testing things like code actions, where the client initiates
+  /// a request but the server does not respond to it until it's sent its own
+  /// request to the client and it recieved a response.
+  ///
+  ///     Client                                 Server
+  ///     1. |- Req: textDocument/codeAction      ->
+  ///     1. <- Resp: textDocument/codeAction     -|
+  ///
+  ///     2. |- Req: workspace/executeCommand  ->
+  ///           3. <- Req: textDocument/applyEdits  -|
+  ///           3. |- Resp: textDocument/applyEdits ->
+  ///     2. <- Resp: workspace/executeCommand -|
+  ///
+  /// Request 2 from the client is not responded to until the server has its own
+  /// response to the request it sends (3).
+  Future<T> handleExpectedRequest<T, R, RR>(
+    Method method,
+    Future<T> f(), {
+    @required FutureOr<RR> handler(R params),
+    Duration timeout = const Duration(seconds: 5),
+  }) async {
+    FutureOr<T> outboundRequest;
+
+    // Run [f] and wait for the incoming request from the server.
+    final incomingRequest = await expectRequest(method, () {
+      // Don't return/await the response yet, as this may not complete until
+      // after we have handled the request that comes from the server.
+      outboundRequest = f();
+    });
+
+    // Handle the request from the server and send the response back.
+    final clientsResponse = await handler(incomingRequest.params as R);
+    respondTo(incomingRequest, clientsResponse);
+
+    // Return a future that completes when the response to the original request
+    // (from [f]) returns.
+    return outboundRequest;
+  }
+
+  /// A helper that initializes the server with common values, since the server
+  /// will reject any other requests until it is initialized.
+  /// Capabilities are overridden by providing JSON to avoid having to construct
+  /// full objects just to change one value (the types are immutable) so must
+  /// match the spec exactly and are not verified.
+  Future<ResponseMessage> initialize({
+    String rootPath,
+    Uri rootUri,
+    List<Uri> workspaceFolders,
+    TextDocumentClientCapabilities textDocumentCapabilities,
+    WorkspaceClientCapabilities workspaceCapabilities,
+  }) async {
+    // Assume if none of the project options were set, that we want to default to
+    // opening the test project folder.
+    if (rootPath == null && rootUri == null && workspaceFolders == null) {
+      rootUri = Uri.file(projectFolderPath);
+    }
+    final request = makeRequest(
+        Method.initialize,
+        new InitializeParams(
+            null,
+            rootPath,
+            rootUri?.toString(),
+            null,
+            new ClientCapabilities(
+              workspaceCapabilities,
+              textDocumentCapabilities,
+              null,
+            ),
+            null,
+            workspaceFolders?.map(toWorkspaceFolder)?.toList()));
+    final response = await channel.sendRequestToServer(request);
+    expect(response.id, equals(request.id));
+
+    if (response.error == null) {
+      final notification = makeNotification(Method.initialized, null);
+      channel.sendNotificationToServer(notification);
+      await pumpEventQueue();
+    }
+
+    return response;
+  }
+
+  NotificationMessage makeNotification(Method method, ToJsonable params) {
+    return new NotificationMessage(method, params, jsonRpcVersion);
+  }
+
+  RequestMessage makeRenameRequest(
+      int version, Uri uri, Position pos, String newName) {
+    final docIdentifier = version != null
+        ? new VersionedTextDocumentIdentifier(version, uri.toString())
+        : new TextDocumentIdentifier(uri.toString());
+    final request = makeRequest(
+      Method.textDocument_rename,
+      new RenameParams(docIdentifier, pos, newName),
+    );
+    return request;
+  }
+
+  RequestMessage makeRequest(Method method, ToJsonable params) {
+    final id = Either2<num, String>.t1(_id++);
+    return new RequestMessage(id, method, params, jsonRpcVersion);
+  }
+
+  Future openFile(Uri uri, String content, {num version = 1}) async {
+    var notification = makeNotification(
+      Method.textDocument_didOpen,
+      new DidOpenTextDocumentParams(new TextDocumentItem(
+          uri.toString(), dartLanguageId, version, content)),
+    );
+    channel.sendNotificationToServer(notification);
+    await pumpEventQueue();
+  }
+
+  Position positionFromMarker(String contents) =>
+      positionFromOffset(withoutRangeMarkers(contents).indexOf('^'), contents);
+
+  Position positionFromOffset(int offset, String contents) {
+    final lineInfo = LineInfo.fromContent(withoutMarkers(contents));
+    return toPosition(lineInfo.getLocation(offset));
+  }
+
+  Future<RangeAndPlaceholder> prepareRename(Uri uri, Position pos) {
+    final request = makeRequest(
+      Method.textDocument_prepareRename,
+      new TextDocumentPositionParams(
+        new TextDocumentIdentifier(uri.toString()),
+        pos,
+      ),
+    );
+    return expectSuccessfulResponseTo<RangeAndPlaceholder>(request);
+  }
+
+  /// Returns the range surrounded by `[[markers]]` in the provided string,
+  /// excluding the markers themselves (as well as position markers `^` from
+  /// the offsets).
+  Range rangeFromMarkers(String contents) {
+    final ranges = rangesFromMarkers(contents);
+    if (ranges.length == 1) {
+      return ranges.first;
+    } else if (ranges.isEmpty) {
+      throw 'Contents did not include a marked range';
+    } else {
+      throw 'Contents contained multiple ranges but only one was expected';
+    }
+  }
+
+  /// Returns all ranges surrounded by `[[markers]]` in the provided string,
+  /// excluding the markers themselves (as well as position markers `^` from
+  /// the offsets).
+  List<Range> rangesFromMarkers(String content) {
+    Iterable<Range> rangesFromMarkersImpl(String content) sync* {
+      content = content.replaceAll(positionMarker, '');
+      final contentsWithoutMarkers = withoutMarkers(content);
+      var searchStartIndex = 0;
+      var offsetForEarlierMarkers = 0;
+      while (true) {
+        final startMarker = content.indexOf(rangeMarkerStart, searchStartIndex);
+        if (startMarker == -1) {
+          return; // Exit if we didn't find any more.
+        }
+        final endMarker = content.indexOf(rangeMarkerEnd, startMarker);
+        if (endMarker == -1) {
+          throw 'Found unclosed range starting at offset $startMarker';
+        }
+        yield new Range(
+          positionFromOffset(
+              startMarker + offsetForEarlierMarkers, contentsWithoutMarkers),
+          positionFromOffset(
+              endMarker + offsetForEarlierMarkers - rangeMarkerStart.length,
+              contentsWithoutMarkers),
+        );
+        // Start the next search after this one, but remember to offset the future
+        // results by the lengths of these markers since they shouldn't affect the
+        // offsets.
+        searchStartIndex = endMarker;
+        offsetForEarlierMarkers -=
+            rangeMarkerStart.length + rangeMarkerEnd.length;
+      }
+    }
+
+    return rangesFromMarkersImpl(content).toList();
+  }
+
+  Future<WorkspaceEdit> rename(
+    Uri uri,
+    int version,
+    Position pos,
+    String newName,
+  ) {
+    final request = makeRenameRequest(version, uri, pos, newName);
+    return expectSuccessfulResponseTo<WorkspaceEdit>(request);
+  }
+
+  Future<ResponseMessage> renameRaw(
+    Uri uri,
+    int version,
+    Position pos,
+    String newName,
+  ) {
+    final request = makeRenameRequest(version, uri, pos, newName);
+    return channel.sendRequestToServer(request);
+  }
+
+  Future replaceFile(int newVersion, Uri uri, String content) {
+    return changeFile(
+      newVersion,
+      uri,
+      [new TextDocumentContentChangeEvent(null, null, content)],
+    );
+  }
+
+  /// Sends [responseParams] to the server as a successful response to
+  /// a server-initiated [request].
+  void respondTo<T>(RequestMessage request, T responseParams) {
+    channel.sendResponseToServer(
+        new ResponseMessage(request.id, responseParams, null, jsonRpcVersion));
+  }
+
+  void setUp() {
+    channel = new MockLspServerChannel(debugPrintCommunication);
+    // Create an SDK in the mock file system.
+    new MockSdk(resourceProvider: resourceProvider);
+    server = new LspAnalysisServer(
+        channel,
+        resourceProvider,
+        new AnalysisServerOptions(),
+        new DartSdkManager(convertPath('/sdk'), false),
+        InstrumentationService.NULL_SERVICE);
+
+    projectFolderPath = convertPath('/project');
+    projectFolderUri = Uri.file(projectFolderPath);
+    newFolder(projectFolderPath);
+    newFolder(join(projectFolderPath, 'lib'));
+    // Create a folder and file to aid testing that includes imports/completion.
+    newFolder(join(projectFolderPath, 'lib', 'folder'));
+    newFile(join(projectFolderPath, 'lib', 'file.dart'));
+    mainFilePath = join(projectFolderPath, 'lib', 'main.dart');
+    mainFileUri = Uri.file(mainFilePath);
+  }
+
+  Future tearDown() async {
+    channel.close();
+    await server.shutdown();
+  }
+
+  WorkspaceFolder toWorkspaceFolder(Uri uri) {
+    return WorkspaceFolder(uri.toString(), path.basename(uri.toFilePath()));
+  }
+
+  Future<List<Diagnostic>> waitForDiagnostics(Uri uri) async {
+    PublishDiagnosticsParams diagnosticParams;
+    await channel.serverToClient.firstWhere((message) {
+      if (message is NotificationMessage &&
+          message.method == Method.textDocument_publishDiagnostics) {
+        diagnosticParams = message.params;
+
+        return diagnosticParams.uri == uri.toString();
+      }
+      return false;
+    });
+    return diagnosticParams.diagnostics;
+  }
+
+  /// Removes markers like `[[` and `]]` and `^` that are used for marking
+  /// positions/ranges in strings to avoid hard-coding positions in tests.
+  String withoutMarkers(String contents) =>
+      contents.replaceAll(allMarkersPattern, '');
+
+  /// Removes range markers from strings to give accurate position offsets.
+  String withoutRangeMarkers(String contents) =>
+      contents.replaceAll(rangeMarkerStart, '').replaceAll(rangeMarkerEnd, '');
+}
+
+mixin ClientCapabilitiesHelperMixin {
+  final emptyTextDocumentClientCapabilities =
+      new TextDocumentClientCapabilities(
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null,
+          null);
+
+  final emptyWorkspaceClientCapabilities = new WorkspaceClientCapabilities(
+      null, null, null, null, null, null, null, null);
+
+  TextDocumentClientCapabilities extendTextDocumentCapabilities(
+    TextDocumentClientCapabilities source,
+    Map<String, dynamic> textDocumentCapabilities,
+  ) {
+    final json = source.toJson();
+    if (textDocumentCapabilities != null) {
+      textDocumentCapabilities.keys.forEach((key) {
+        json[key] = textDocumentCapabilities[key];
+      });
+    }
+    return TextDocumentClientCapabilities.fromJson(json);
+  }
+
+  WorkspaceClientCapabilities extendWorkspaceCapabilities(
+    WorkspaceClientCapabilities source,
+    Map<String, dynamic> workspaceCapabilities,
+  ) {
+    final json = source.toJson();
+    if (workspaceCapabilities != null) {
+      workspaceCapabilities.keys.forEach((key) {
+        json[key] = workspaceCapabilities[key];
+      });
+    }
+    return WorkspaceClientCapabilities.fromJson(json);
+  }
+
+  TextDocumentClientCapabilities withCodeActionKinds(
+    TextDocumentClientCapabilities source,
+    List<CodeActionKind> kinds,
+  ) {
+    return extendTextDocumentCapabilities(source, {
+      'codeAction': {
+        'codeActionLiteralSupport': {
+          'codeActionKind': {'valueSet': kinds.map((k) => k.toJson()).toList()}
+        }
+      }
+    });
+  }
+
+  TextDocumentClientCapabilities withCompletionItemDeprecatedSupport(
+    TextDocumentClientCapabilities source,
+  ) {
+    return extendTextDocumentCapabilities(source, {
+      'completion': {
+        'completionItem': {'deprecatedSupport': true}
+      }
+    });
+  }
+
+  TextDocumentClientCapabilities withCompletionItemSnippetSupport(
+    TextDocumentClientCapabilities source,
+  ) {
+    return extendTextDocumentCapabilities(source, {
+      'completion': {
+        'completionItem': {'snippetSupport': true}
+      }
+    });
+  }
+
+  TextDocumentClientCapabilities withCompletionItemKinds(
+    TextDocumentClientCapabilities source,
+    List<CompletionItemKind> kinds,
+  ) {
+    return extendTextDocumentCapabilities(source, {
+      'completion': {
+        'completionItemKind': {
+          'valueSet': kinds.map((k) => k.toJson()).toList()
+        }
+      }
+    });
+  }
+
+  TextDocumentClientCapabilities withHoverContentFormat(
+    TextDocumentClientCapabilities source,
+    List<MarkupKind> formats,
+  ) {
+    return extendTextDocumentCapabilities(source, {
+      'hover': {'contentFormat': formats.map((k) => k.toJson()).toList()}
+    });
+  }
+
+  TextDocumentClientCapabilities withSignatureHelpContentFormat(
+    TextDocumentClientCapabilities source,
+    List<MarkupKind> formats,
+  ) {
+    return extendTextDocumentCapabilities(source, {
+      'signatureHelp': {
+        'signatureInformation': {
+          'documentationFormat': formats.map((k) => k.toJson()).toList()
+        }
+      }
+    });
+  }
+
+  TextDocumentClientCapabilities withHierarchicalDocumentSymbolSupport(
+    TextDocumentClientCapabilities source,
+  ) {
+    return extendTextDocumentCapabilities(source, {
+      'documentSymbol': {'hierarchicalDocumentSymbolSupport': true}
+    });
+  }
+
+  WorkspaceClientCapabilities withDocumentChangesSupport(
+    WorkspaceClientCapabilities source,
+  ) {
+    return extendWorkspaceCapabilities(source, {
+      'workspaceEdit': {'documentChanges': true}
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/server_test.dart b/pkg/analysis_server/test/lsp/server_test.dart
new file mode 100644
index 0000000..233b57a
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/server_test.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ServerTest);
+  });
+}
+
+@reflectiveTest
+class ServerTest extends AbstractLspAnalysisServerTest {
+  test_inconsistentStateError() async {
+    await initialize();
+    await openFile(mainFileUri, '');
+    // Attempt to make an illegal modification to the file. This indicates the
+    // client and server are out of sync and we expect the server to shut down.
+    final error = await expectErrorNotification<ShowMessageParams>(() async {
+      await changeFile(222, mainFileUri, [
+        new TextDocumentContentChangeEvent(
+            new Range(new Position(99, 99), new Position(99, 99)), null, ' '),
+      ]);
+    });
+
+    expect(error, isNotNull);
+    expect(error.message, contains('Invalid line'));
+
+    // Wait for up to 10 seconds for the server to shutdown.
+    await server.exited.timeout(const Duration(seconds: 10));
+  }
+
+  test_shutdown_initialized() async {
+    await initialize();
+    final request = makeRequest(Method.shutdown, null);
+    final response = await channel.sendRequestToServer(request);
+    expect(response.id, equals(request.id));
+    expect(response.error, isNull);
+    expect(response.result, isNull);
+  }
+
+  test_shutdown_uninitialized() async {
+    final request = makeRequest(Method.shutdown, null);
+    final response = await channel.sendRequestToServer(request);
+    expect(response.id, equals(request.id));
+    expect(response.error, isNull);
+    expect(response.result, isNull);
+  }
+
+  test_unknownNotifications_logError() async {
+    await initialize();
+
+    final notification =
+        makeNotification(new Method.fromJson(r'some/randomNotification'), null);
+
+    final notificationParams = await expectErrorNotification<ShowMessageParams>(
+      () => channel.sendNotificationToServer(notification),
+    );
+    expect(notificationParams, isNotNull);
+    expect(
+      notificationParams.message,
+      contains('Unknown method some/randomNotification'),
+    );
+  }
+
+  test_unknownOptionalNotifications_silentlyDropped() async {
+    await initialize();
+    final notification =
+        makeNotification(new Method.fromJson(r'$/randomNotification'), null);
+    final firstError = channel.errorNotificationsFromServer.first;
+    channel.sendNotificationToServer(notification);
+
+    // Wait up to 1sec to ensure no error/log notifications were sent back.
+    var didTimeout = false;
+    final notificationFromServer = await firstError.timeout(
+      const Duration(seconds: 1),
+      onTimeout: () {
+        didTimeout = true;
+      },
+    );
+
+    expect(notificationFromServer, isNull);
+    expect(didTimeout, isTrue);
+  }
+
+  test_unknownRequest_rejected() async {
+    await initialize();
+    final request = makeRequest(new Method.fromJson('randomRequest'), null);
+    final response = await channel.sendRequestToServer(request);
+    expect(response.id, equals(request.id));
+    expect(response.error, isNotNull);
+    expect(response.error.code, equals(ErrorCodes.MethodNotFound));
+    expect(response.result, isNull);
+  }
+
+  test_unknownOptionalRequest_rejected() async {
+    await initialize();
+    final request = makeRequest(new Method.fromJson(r'$/randomRequest'), null);
+    final response = await channel.sendRequestToServer(request);
+    expect(response.id, equals(request.id));
+    expect(response.error, isNotNull);
+    expect(response.error.code, equals(ErrorCodes.MethodNotFound));
+    expect(response.result, isNull);
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/signature_help_test.dart b/pkg/analysis_server/test/lsp/signature_help_test.dart
new file mode 100644
index 0000000..e22eec0
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/signature_help_test.dart
@@ -0,0 +1,312 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'server_abstract.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SignatureHelpTest);
+  });
+}
+
+@reflectiveTest
+class SignatureHelpTest extends AbstractLspAnalysisServerTest {
+  test_formats_markdown() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, int i) {
+      foo(^);
+    }
+    ''';
+    final expectedLabel = 'foo(String s, int i)';
+    final expectedDoc = 'Does foo.';
+
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('int i', null),
+      ],
+      expectedFormat: MarkupKind.Markdown,
+    );
+  }
+
+  test_formats_notSupported() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, int i) {
+      foo(^);
+    }
+    ''';
+    final expectedLabel = 'foo(String s, int i)';
+    final expectedDoc = 'Does foo.';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('int i', null),
+      ],
+      expectedFormat: null,
+    );
+  }
+
+  test_formats_plainTextOnly() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, int i) {
+      foo(^);
+    }
+    ''';
+    final expectedLabel = 'foo(String s, int i)';
+    final expectedDoc = 'Does foo.';
+
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.PlainText]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('int i', null),
+      ],
+      expectedFormat: MarkupKind.PlainText,
+    );
+  }
+
+  test_formats_plainTextPreferred() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, int i) {
+      foo(^);
+    }
+    ''';
+    final expectedLabel = 'foo(String s, int i)';
+    final expectedDoc = 'Does foo.';
+
+    // We say we prefer PlainText as a client, but since we only really
+    // support Markdown and the client supports it, we expect the server
+    // to provide Markdown.
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities,
+            [MarkupKind.PlainText, MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('int i', null),
+      ],
+      expectedFormat: MarkupKind.Markdown,
+    );
+  }
+
+  test_params_multipleNamed() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, {bool b = true, bool a}) {
+      foo(^);
+    }
+    ''';
+
+    final expectedLabel = 'foo(String s, {bool b = true, bool a})';
+    final expectedDoc = 'Does foo.';
+
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('bool b = true', null),
+        new ParameterInformation('bool a', null),
+      ],
+    );
+  }
+
+  test_params_multipleOptional() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, [bool b = true, bool a]) {
+      foo(^);
+    }
+    ''';
+
+    final expectedLabel = 'foo(String s, [bool b = true, bool a])';
+    final expectedDoc = 'Does foo.';
+
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('bool b = true', null),
+        new ParameterInformation('bool a', null),
+      ],
+    );
+  }
+
+  test_params_named() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, {bool b = true}) {
+      foo(^);
+    }
+    ''';
+
+    final expectedLabel = 'foo(String s, {bool b = true})';
+    final expectedDoc = 'Does foo.';
+
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('bool b = true', null),
+      ],
+    );
+  }
+
+  test_params_optional() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, [bool b = true]) {
+      foo(^);
+    }
+    ''';
+
+    final expectedLabel = 'foo(String s, [bool b = true])';
+    final expectedDoc = 'Does foo.';
+
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('bool b = true', null),
+      ],
+    );
+  }
+
+  test_simple() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, int i) {
+      foo(^);
+    }
+    ''';
+    final expectedLabel = 'foo(String s, int i)';
+    final expectedDoc = 'Does foo.';
+
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('int i', null),
+      ],
+    );
+  }
+
+  test_unopenFile() async {
+    final content = '''
+    /// Does foo.
+    foo(String s, int i) {
+      foo(^);
+    }
+    ''';
+    final expectedLabel = 'foo(String s, int i)';
+    final expectedDoc = 'Does foo.';
+
+    newFile(mainFilePath, content: withoutMarkers(content));
+    await initialize(
+        textDocumentCapabilities: withSignatureHelpContentFormat(
+            emptyTextDocumentClientCapabilities, [MarkupKind.Markdown]));
+    await testSignature(
+      content,
+      expectedLabel,
+      expectedDoc,
+      [
+        new ParameterInformation('String s', null),
+        new ParameterInformation('int i', null),
+      ],
+    );
+  }
+
+  Future<void> testSignature(
+    String fileContent,
+    String expectedLabel,
+    String expectedDoc,
+    List<ParameterInformation> expectedParams, {
+    MarkupKind expectedFormat = MarkupKind.Markdown,
+  }) async {
+    final res =
+        await getSignatureHelp(mainFileUri, positionFromMarker(fileContent));
+
+    // TODO(dantup): Update this when there is clarification on how to handle
+    // no valid selected parameter.
+    expect(res.activeParameter, -1);
+    expect(res.activeSignature, equals(0));
+    expect(res.signatures, hasLength(1));
+    final sig = res.signatures.first;
+    expect(sig.label, equals(expectedLabel));
+    expect(sig.parameters, equals(expectedParams));
+
+    // Test the format matches the tests expectation.
+    // For clients that don't support MarkupContent it'll be a plain string,
+    // but otherwise it'll be a MarkupContent of type PlainText or Markdown.
+    final doc = sig.documentation;
+    if (expectedFormat == null) {
+      // Plain string.
+      expect(doc.valueEquals(expectedDoc), isTrue);
+    } else {
+      final expected = new MarkupContent(expectedFormat, expectedDoc);
+      expect(doc.valueEquals(expected), isTrue);
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/lsp/test_all.dart b/pkg/analysis_server/test/lsp/test_all.dart
new file mode 100644
index 0000000..d1e29ad
--- /dev/null
+++ b/pkg/analysis_server/test/lsp/test_all.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../src/lsp/lsp_packet_transformer_test.dart'
+    as packet_transformer_tests;
+import 'code_actions_assists_test.dart' as assists_code_action_tests;
+import 'code_actions_fixes_test.dart' as fixes_code_action_tests;
+import 'code_actions_source_test.dart' as source_code_action_tests;
+import 'completion_test.dart' as completion_test;
+import 'definition_test.dart' as definition_test;
+import 'diagnostic_test.dart' as diagnostic_test;
+import 'document_highlights_test.dart' as document_highlights_test;
+import 'document_symbols_test.dart' as document_symbols_test;
+import 'file_modification_test.dart' as file_modification_test;
+import 'format_test.dart' as format_test;
+import 'hover_test.dart' as hover_test;
+import 'initialization_test.dart' as initialization_test;
+import 'priority_files_test.dart' as priority_files_test;
+import 'references_test.dart' as references_test;
+import 'rename_test.dart' as rename_test;
+import 'server_test.dart' as server_test;
+import 'signature_help_test.dart' as signature_help_test;
+
+main() {
+  defineReflectiveSuite(() {
+    completion_test.main();
+    definition_test.main();
+    diagnostic_test.main();
+    document_symbols_test.main();
+    document_highlights_test.main();
+    file_modification_test.main();
+    priority_files_test.main();
+    format_test.main();
+    hover_test.main();
+    initialization_test.main();
+    references_test.main();
+    server_test.main();
+    signature_help_test.main();
+    source_code_action_tests.main();
+    fixes_code_action_tests.main();
+    assists_code_action_tests.main();
+    packet_transformer_tests.main();
+    rename_test.main();
+  }, name: 'lsp');
+}
diff --git a/pkg/analysis_server/test/mock_sdk.dart b/pkg/analysis_server/test/mock_sdk.dart
deleted file mode 100644
index 07f8f15..0000000
--- a/pkg/analysis_server/test/mock_sdk.dart
+++ /dev/null
@@ -1,452 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/file_system/file_system.dart' as resource;
-import 'package:analyzer/file_system/memory_file_system.dart' as resource;
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
-import 'package:analyzer/src/summary/summary_file_builder.dart';
-
-class MockSdk implements DartSdk {
-  static const MockSdkLibrary LIB_CORE =
-      const MockSdkLibrary('dart:core', '/lib/core/core.dart', '''
-library dart.core;
-
-import 'dart:async';
-import 'dart:_internal';
-
-class Object {
-  const Object();
-  bool operator ==(other) => identical(this, other);
-  String toString() => 'a string';
-  int get hashCode => 0;
-  Type get runtimeType => null;
-  dynamic noSuchMethod(Invocation invocation) => null;
-}
-
-class Function {}
-class StackTrace {}
-class Symbol {}
-class Type {}
-
-abstract class Comparable<T> {
-  int compareTo(T other);
-}
-
-abstract class String implements Comparable<String> {
-  external factory String.fromCharCodes(Iterable<int> charCodes,
-                                        [int start = 0, int end]);
-  bool get isEmpty => false;
-  bool get isNotEmpty => false;
-  int get length => 0;
-  String toUpperCase();
-  List<int> get codeUnits;
-}
-
-class bool extends Object {}
-
-abstract class num implements Comparable<num> {
-  bool operator <(num other);
-  bool operator <=(num other);
-  bool operator >(num other);
-  bool operator >=(num other);
-  num operator +(num other);
-  num operator -(num other);
-  num operator *(num other);
-  num operator /(num other);
-  int operator ^(int other);
-  int operator &(int other);
-  int operator |(int other);
-  int operator <<(int other);
-  int operator >>(int other);
-  int operator ~/(num other);
-  num operator %(num other);
-  int operator ~();
-  int toInt();
-  double toDouble();
-  num abs();
-  int round();
-}
-
-abstract class int extends num {
-  bool get isEven => false;
-  int operator -();
-  external static int parse(String source,
-                            { int radix,
-                              int onError(String source) });
-}
-
-abstract class double extends num {
-  static const double NAN = 0.0 / 0.0;
-  static const double INFINITY = 1.0 / 0.0;
-  static const double NEGATIVE_INFINITY = -INFINITY;
-  static const double MIN_POSITIVE = 5e-324;
-  static const double MAX_FINITE = 1.7976931348623157e+308;
-
-  double remainder(num other);
-  double operator +(num other);
-  double operator -(num other);
-  double operator *(num other);
-  double operator %(num other);
-  double operator /(num other);
-  int operator ~/(num other);
-  double operator -();
-  double abs();
-  double get sign;
-  int round();
-  int floor();
-  int ceil();
-  int truncate();
-  double roundToDouble();
-  double floorToDouble();
-  double ceilToDouble();
-  double truncateToDouble();
-  external static double parse(String source,
-                               [double onError(String source)]);
-}
-
-class DateTime extends Object {}
-class Null extends Object {}
-
-class Deprecated extends Object {
-  final String expires;
-  const Deprecated(this.expires);
-}
-const Object deprecated = const Deprecated("next release");
-
-class Exception {
-  factory Exception([var message]);
-}
-
-class Iterator<E> {
-  bool moveNext();
-  E get current;
-}
-
-abstract class Iterable<E> {
-  Iterator<E> get iterator;
-  bool get isEmpty;
-  void forEach(void f(E element));
-  Iterable<T> map<T>(T f(E e)) => null;
-  T fold<T>(T initialValue, T combine(T previousValue, E element));
-  List<E> toList({bool growable: true});
-}
-
-class List<E> implements Iterable<E> {
-  List();
-  void add(E value) {}
-  void addAll(Iterable<E> iterable) {}
-  List<R> cast<R>();
-  E operator [](int index) => null;
-  void operator []=(int index, E value) {}
-  Iterator<E> get iterator => null;
-  void clear() {}
-  Iterable<E> where(bool test(E element)) {}
-
-  bool get isEmpty => false;
-  E get first => null;
-  E get last => null;
-}
-
-abstract class Map<K, V> extends Object {
-  Iterable<K> get keys;
-  int get length;
-  Iterable<V> get values;
-  V operator [](K key) => null;
-  void operator []=(K key, V value) {}
-  Map<RK, RV> cast<RK, RV>();
-  bool containsKey(Object key);
-}
-
-external bool identical(Object a, Object b);
-
-void print(Object object) {}
-
-class Set<E> implements Iterable<E> {
-  Set<R> cast<R>();
-}
-
-class Uri {
-  static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
-    int parseHex(int start, int end) {
-      return 0;
-    }
-    return null;
-  }
-}
-
-class _Override { const _Override(); }
-const Object override = const _Override();
-''');
-  static const MockSdkLibrary LIB_ASYNC =
-      const MockSdkLibrary('dart:async', '/lib/async/async.dart', '''
-library dart.async;
-
-import 'dart:math';
-
-class Future<T> {
-  factory Future(computation()) => null;
-  factory Future.delayed(Duration duration, [T computation()]) => null;
-  factory Future.value([value]) => null;
-  static Future wait(List<Future> futures) => null;
-}
-
-class FutureOr<T> {}
-
-class Stream<T> {}
-abstract class StreamTransformer<S, T> {}
-''');
-
-  static const MockSdkLibrary LIB_COLLECTION = const MockSdkLibrary(
-      'dart:collection', '/lib/collection/collection.dart', '''
-library dart.collection;
-
-abstract class HashMap<K, V> implements Map<K, V> {}
-abstract class LinkedHashMap<K, V> implements Map<K, V> {}
-''');
-
-  static const MockSdkLibrary LIB_CONVERT =
-      const MockSdkLibrary('dart:convert', '/lib/convert/convert.dart', '''
-library dart.convert;
-
-import 'dart:async';
-
-abstract class Converter<S, T> implements StreamTransformer {}
-class JsonDecoder extends Converter<String, Object> {}
-''');
-
-  static const MockSdkLibrary LIB_MATH =
-      const MockSdkLibrary('dart:math', '/lib/math/math.dart', '''
-library dart.math;
-const double E = 2.718281828459045;
-const double PI = 3.1415926535897932;
-const double LN10 =  2.302585092994046;
-T min<T extends num>(T a, T b) => null;
-T max<T extends num>(T a, T b) => null;
-external double cos(num radians);
-external num pow(num x, num exponent);
-external double sin(num radians);
-external double sqrt(num x);
-class Random {
-  bool nextBool() => true;
-  double nextDouble() => 2.0;
-  int nextInt() => 1;
-}
-''');
-
-  static const MockSdkLibrary LIB_HTML = const MockSdkLibrary(
-      'dart:html', '/lib/html/dartium/html_dartium.dart', '''
-library dart.html;
-class HtmlElement {}
-''');
-
-  static const MockSdkLibrary LIB_INTERNAL =
-      const MockSdkLibrary('dart:_internal', '/lib/internal/internal.dart', '''
-library dart._internal;
-external void printToConsole(String line);
-''');
-
-  static const List<SdkLibrary> LIBRARIES = const [
-    LIB_CORE,
-    LIB_ASYNC,
-    LIB_COLLECTION,
-    LIB_CONVERT,
-    LIB_MATH,
-    LIB_HTML,
-    LIB_INTERNAL,
-  ];
-
-  static const String librariesContent = r'''
-const Map<String, LibraryInfo> libraries = const {
-  "async": const LibraryInfo("async/async.dart"),
-  "collection": const LibraryInfo("collection/collection.dart"),
-  "convert": const LibraryInfo("convert/convert.dart"),
-  "core": const LibraryInfo("core/core.dart"),
-  "html": const LibraryInfo("html/dartium/html_dartium.dart"),
-  "math": const LibraryInfo("math/math.dart"),
-  "_internal": const LibraryInfo("internal/internal.dart"),
-};
-''';
-
-  final resource.MemoryResourceProvider provider;
-
-  /**
-   * The [AnalysisContext] which is used for all of the sources.
-   */
-  InternalAnalysisContext _analysisContext;
-
-  /**
-   * The cached linked bundle of the SDK.
-   */
-  PackageBundle _bundle;
-
-  MockSdk(
-      {bool generateSummaryFiles: false,
-      resource.ResourceProvider resourceProvider})
-      : provider = resourceProvider ?? new resource.MemoryResourceProvider() {
-    LIBRARIES.forEach((SdkLibrary library) {
-      provider.newFile(provider.convertPath(library.path),
-          (library as MockSdkLibrary).content);
-    });
-    provider.newFile(
-        provider.convertPath(
-            '/lib/_internal/sdk_library_metadata/lib/libraries.dart'),
-        librariesContent);
-    if (generateSummaryFiles) {
-      List<int> bytes = _computeLinkedBundleBytes();
-      provider.newFileWithBytes(
-          provider.convertPath('/lib/_internal/strong.sum'), bytes);
-    }
-  }
-
-  @override
-  AnalysisContext get context {
-    if (_analysisContext == null) {
-      _analysisContext = new SdkAnalysisContext(null);
-      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
-      _analysisContext.sourceFactory = factory;
-    }
-    return _analysisContext;
-  }
-
-  @override
-  List<SdkLibrary> get sdkLibraries => LIBRARIES;
-
-  @override
-  String get sdkVersion => throw unimplemented;
-
-  UnimplementedError get unimplemented => new UnimplementedError();
-
-  @override
-  List<String> get uris {
-    List<String> uris = <String>[];
-    for (SdkLibrary library in LIBRARIES) {
-      uris.add(library.shortName);
-    }
-    return uris;
-  }
-
-  @override
-  Source fromFileUri(Uri uri) {
-    String filePath = provider.pathContext.fromUri(uri);
-    for (SdkLibrary library in sdkLibraries) {
-      String libraryPath = provider.convertPath(library.path);
-      if (filePath == libraryPath) {
-        try {
-          resource.File file = provider.getResource(filePath);
-          Uri dartUri = Uri.parse(library.shortName);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-      String libraryRootPath = provider.pathContext.dirname(libraryPath) +
-          provider.pathContext.separator;
-      if (filePath.startsWith(libraryRootPath)) {
-        String pathInLibrary = filePath.substring(libraryRootPath.length);
-        String uriStr = '${library.shortName}/$pathInLibrary';
-        try {
-          resource.File file = provider.getResource(filePath);
-          Uri dartUri = Uri.parse(uriStr);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  PackageBundle getLinkedBundle() {
-    if (_bundle == null) {
-      resource.File summaryFile =
-          provider.getFile(provider.convertPath('/lib/_internal/strong.sum'));
-      List<int> bytes;
-      if (summaryFile.exists) {
-        bytes = summaryFile.readAsBytesSync();
-      } else {
-        bytes = _computeLinkedBundleBytes();
-      }
-      _bundle = new PackageBundle.fromBuffer(bytes);
-    }
-    return _bundle;
-  }
-
-  @override
-  SdkLibrary getSdkLibrary(String dartUri) {
-    // getSdkLibrary() is only used to determine whether a library is internal
-    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
-    // return null.
-    return null;
-  }
-
-  @override
-  Source mapDartUri(String dartUri) {
-    const Map<String, String> uriToPath = const {
-      "dart:core": "/lib/core/core.dart",
-      "dart:html": "/lib/html/dartium/html_dartium.dart",
-      "dart:async": "/lib/async/async.dart",
-      "dart:collection": "/lib/collection/collection.dart",
-      "dart:convert": "/lib/convert/convert.dart",
-      "dart:math": "/lib/math/math.dart",
-      "dart:_internal": "/lib/internal/internal.dart",
-    };
-
-    String path = uriToPath[dartUri];
-    if (path != null) {
-      resource.File file = provider.getResource(provider.convertPath(path));
-      Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
-      return file.createSource(uri);
-    }
-
-    // If we reach here then we tried to use a dartUri that's not in the
-    // table above.
-    return null;
-  }
-
-  /**
-   * Compute the bytes of the linked bundle associated with this SDK.
-   */
-  List<int> _computeLinkedBundleBytes() {
-    List<Source> librarySources = sdkLibraries
-        .map((SdkLibrary library) => mapDartUri(library.shortName))
-        .toList();
-    return new SummaryBuilder(librarySources, context).build();
-  }
-}
-
-class MockSdkLibrary implements SdkLibrary {
-  final String shortName;
-  final String path;
-  final String content;
-
-  const MockSdkLibrary(this.shortName, this.path, this.content);
-
-  @override
-  String get category => throw unimplemented;
-
-  @override
-  bool get isDart2JsLibrary => throw unimplemented;
-
-  @override
-  bool get isDocumented => throw unimplemented;
-
-  @override
-  bool get isImplementation => false;
-
-  @override
-  bool get isInternal => shortName.startsWith('dart:_');
-
-  @override
-  bool get isShared => throw unimplemented;
-
-  @override
-  bool get isVmLibrary => throw unimplemented;
-
-  UnimplementedError get unimplemented => new UnimplementedError();
-}
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 6c4b927..286da86 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -1,33 +1,23 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
+import 'dart:convert';
 
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart' as lsp;
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_special.dart' as lsp;
 import 'package:analysis_server/protocol/protocol.dart';
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel/channel.dart';
+import 'package:analysis_server/src/lsp/channel/lsp_channel.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/timestamped_data.dart';
 import 'package:test/test.dart';
 
-/**
- * Answer the absolute path the SDK relative to the currently running
- * script or throw an exception if it cannot be found.
- */
-String get sdkPath {
-  Uri sdkUri = Platform.script.resolve('../../../sdk/');
-
-  // Verify the directory exists
-  Directory sdkDir = new Directory.fromUri(sdkUri);
-  if (!sdkDir.existsSync()) {
-    throw 'Specified Dart SDK does not exist: $sdkDir';
-  }
-
-  return sdkDir.path;
-}
+const _jsonEncoder = const JsonEncoder.withIndent('    ');
 
 /**
  * A [Matcher] that check that the given [Response] has an expected identifier
@@ -43,6 +33,186 @@
 Matcher isResponseSuccess(String id) => new _IsResponseSuccess(id);
 
 /**
+ * A mock [LspServerCommunicationChannel] for testing [LspAnalysisServer].
+ */
+class MockLspServerChannel implements LspServerCommunicationChannel {
+  final StreamController<lsp.Message> _clientToServer =
+      new StreamController<lsp.Message>.broadcast();
+  final StreamController<lsp.Message> _serverToClient =
+      new StreamController<lsp.Message>.broadcast();
+
+  String name;
+
+  /**
+   * Completer that will be signalled when the input stream is closed.
+   */
+  final Completer _closed = new Completer();
+
+  MockLspServerChannel(bool _printMessages) {
+    if (_printMessages) {
+      _serverToClient.stream
+          .listen((message) => print('<== ' + jsonEncode(message)));
+      _clientToServer.stream
+          .listen((message) => print('==> ' + jsonEncode(message)));
+    }
+  }
+
+  /**
+   * Future that will be completed when the input stream is closed.
+   */
+  Future get closed {
+    return _closed.future;
+  }
+
+  /**
+   * A stream of [NotificationMessage]s from the server that may be errors.
+   */
+  Stream<lsp.NotificationMessage> get errorNotificationsFromServer {
+    return notificationsFromServer.where(_isErrorNotification);
+  }
+
+  /**
+   * A stream of [NotificationMessage]s from the server.
+   */
+  Stream<lsp.NotificationMessage> get notificationsFromServer {
+    return _serverToClient.stream
+        .where((m) => m is lsp.NotificationMessage)
+        .cast<lsp.NotificationMessage>();
+  }
+
+  /**
+   * A stream of [RequestMessage]s from the server.
+   */
+  Stream<lsp.RequestMessage> get requestsFromServer {
+    return _serverToClient.stream
+        .where((m) => m is lsp.RequestMessage)
+        .cast<lsp.RequestMessage>();
+  }
+
+  Stream<lsp.Message> get serverToClient => _serverToClient.stream;
+
+  @override
+  void close() {
+    if (!_closed.isCompleted) {
+      _closed.complete();
+    }
+  }
+
+  @override
+  void listen(void Function(lsp.Message message) onMessage,
+      {Function onError, void Function() onDone}) {
+    _clientToServer.stream.listen(onMessage, onError: onError, onDone: onDone);
+  }
+
+  @override
+  void sendNotification(lsp.NotificationMessage notification) {
+    // Don't deliver notifications after the connection is closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    _serverToClient.add(notification);
+  }
+
+  void sendNotificationToServer(lsp.NotificationMessage notification) {
+    // Don't deliver notifications after the connection is closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    notification = _convertJson(notification, lsp.NotificationMessage.fromJson);
+    _clientToServer.add(notification);
+  }
+
+  @override
+  void sendRequest(lsp.RequestMessage request) {
+    // Don't deliver notifications after the connection is closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    _serverToClient.add(request);
+  }
+
+  /**
+   * Send the given [request] to the server and return a future that will
+   * complete when a response associated with the [request] has been received.
+   * The value of the future will be the received response.
+   */
+  Future<lsp.ResponseMessage> sendRequestToServer(lsp.RequestMessage request) {
+    // No further requests should be sent after the connection is closed.
+    if (_closed.isCompleted) {
+      throw new Exception('sendLspRequest after connection closed');
+    }
+    request = _convertJson(request, lsp.RequestMessage.fromJson);
+    // Wrap send request in future to simulate WebSocket.
+    new Future(() => _clientToServer.add(request));
+    return waitForResponse(request);
+  }
+
+  @override
+  void sendResponse(lsp.ResponseMessage response) {
+    // Don't deliver responses after the connection is closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    // Wrap send response in future to simulate WebSocket.
+    new Future(() => _serverToClient.add(response));
+  }
+
+  void sendResponseToServer(lsp.ResponseMessage response) {
+    // Don't deliver notifications after the connection is closed.
+    if (_closed.isCompleted) {
+      return;
+    }
+    response = _convertJson(response, lsp.ResponseMessage.fromJson);
+    _clientToServer.add(response);
+  }
+
+  /**
+   * Return a future that will complete when a response associated with the
+   * given [request] has been received. The value of the future will be the
+   * received response. The returned future will throw an exception if a server
+   * error is reported before the response has been received.
+   *
+   * Unlike [sendLspRequest], this method assumes that the [request] has already
+   * been sent to the server.
+   */
+  Future<lsp.ResponseMessage> waitForResponse(
+    lsp.RequestMessage request, {
+    bool throwOnError = true,
+  }) async {
+    final response = await _serverToClient.stream.firstWhere((message) =>
+        (message is lsp.ResponseMessage && message.id == request.id) ||
+        (throwOnError &&
+            message is lsp.NotificationMessage &&
+            message.method == Method.window_showMessage));
+
+    if (response is lsp.ResponseMessage) {
+      return response;
+    } else {
+      throw 'An error occurred while waiting for a response to ${request.method}: '
+          '${_jsonEncoder.convert(response.toJson())}';
+    }
+  }
+
+  /// Round trips the object to JSON and back to ensure it behaves the same as
+  /// when running over the real STDIO server. Without this, the object passed
+  /// to the handlers will have concrete types as constructed in tests rather
+  /// than the maps as they would be (the server expects to do the conversion).
+  T _convertJson<T>(
+      lsp.ToJsonable message, T Function(Map<String, dynamic>) constructor) {
+    return constructor(jsonDecode(jsonEncode(message.toJson())));
+  }
+
+  /// Checks whether a notification is likely an error from the server (for
+  /// example a window/showMessage). This is useful for tests that want to
+  /// ensure no errors come from the server in response to notifications (which
+  /// don't have their own responses).
+  bool _isErrorNotification(lsp.NotificationMessage notification) {
+    return notification.method == Method.window_logMessage ||
+        notification.method == Method.window_showMessage;
+  }
+}
+
+/**
  * A mock [ServerCommunicationChannel] for testing [AnalysisServer].
  */
 class MockServerChannel implements ServerCommunicationChannel {
@@ -55,6 +225,7 @@
 
   List<Response> responsesReceived = [];
   List<Notification> notificationsReceived = [];
+
   bool _closed = false;
 
   String name;
@@ -134,7 +305,7 @@
    * received response. If [throwOnError] is `true` (the default) then the
    * returned future will throw an exception if a server error is reported
    * before the response has been received.
-   * 
+   *
    * Unlike [sendRequest], this method assumes that the [request] has already
    * been sent to the server.
    */
@@ -157,45 +328,6 @@
   }
 }
 
-/**
- * A mock [WebSocket] for testing.
- */
-class MockSocket<T> implements WebSocket {
-  StreamController<T> controller = new StreamController<T>();
-  MockSocket<T> twin;
-  Stream<T> stream;
-
-  MockSocket();
-
-  factory MockSocket.pair() {
-    MockSocket<T> socket1 = new MockSocket<T>();
-    MockSocket<T> socket2 = new MockSocket<T>();
-    socket1.twin = socket2;
-    socket2.twin = socket1;
-    socket1.stream = socket2.controller.stream;
-    socket2.stream = socket1.controller.stream;
-    return socket1;
-  }
-
-  void add(dynamic text) => controller.add(text as T);
-
-  void allowMultipleListeners() {
-    stream = stream.asBroadcastStream();
-  }
-
-  Future close([int code, String reason]) =>
-      controller.close().then((_) => twin.controller.close());
-
-  StreamSubscription<T> listen(void onData(dynamic event),
-          {Function onError, void onDone(), bool cancelOnError}) =>
-      stream.listen((T data) => onData(data),
-          onError: onError, onDone: onDone, cancelOnError: cancelOnError);
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  Stream<T> where(bool test(dynamic t)) => stream.where((T data) => test(data));
-}
-
 class MockSource extends StringTypedMock implements Source {
   @override
   TimestampedData<String> contents = null;
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index 67f5ca5..1568d90 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -39,6 +39,8 @@
         convertElementKind(engine.ElementKind.FUNCTION), ElementKind.FUNCTION);
     expect(convertElementKind(engine.ElementKind.FUNCTION_TYPE_ALIAS),
         ElementKind.FUNCTION_TYPE_ALIAS);
+    expect(convertElementKind(engine.ElementKind.GENERIC_FUNCTION_TYPE),
+        ElementKind.FUNCTION_TYPE_ALIAS);
     expect(convertElementKind(engine.ElementKind.GETTER), ElementKind.GETTER);
     expect(convertElementKind(engine.ElementKind.LABEL), ElementKind.LABEL);
     expect(convertElementKind(engine.ElementKind.LIBRARY), ElementKind.LIBRARY);
@@ -169,7 +171,7 @@
   }
 
   test_fromElement_CONSTRUCTOR_required_parameters_1() async {
-    addMetaPackageSource();
+    addMetaPackage();
     engine.Source source = addSource('/test.dart', '''
 import 'package:meta/meta.dart';    
 class A {
@@ -186,7 +188,7 @@
 
   /// Verify parameter re-ordering for required params
   test_fromElement_CONSTRUCTOR_required_parameters_2() async {
-    addMetaPackageSource();
+    addMetaPackage();
     engine.Source source = addSource('/test.dart', '''
 import 'package:meta/meta.dart';    
 class A {
@@ -204,7 +206,7 @@
 
   /// Verify parameter re-ordering for required params
   test_fromElement_CONSTRUCTOR_required_parameters_3() async {
-    addMetaPackageSource();
+    addMetaPackage();
     engine.Source source = addSource('/test.dart', '''
 import 'package:meta/meta.dart';    
 class A {
@@ -408,6 +410,30 @@
     expect(element.flags, 0);
   }
 
+  test_fromElement_FUNCTION_TYPE_ALIAS_genericTypeAlias() async {
+    engine.Source source = addSource('/test.dart', '''
+typedef F<T> = int Function(String x);
+''');
+    engine.CompilationUnit unit = await resolveLibraryUnit(source);
+    engine.GenericTypeAliasElement engineElement = findElementInUnit(unit, 'F');
+    // create notification Element
+    Element element = convertElement(engineElement);
+    expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+    expect(element.name, 'F');
+    expect(element.typeParameters, '<T>');
+    {
+      Location location = element.location;
+      expect(location.file, convertPath('/test.dart'));
+      expect(location.offset, 8);
+      expect(location.length, 'F'.length);
+      expect(location.startLine, 1);
+      expect(location.startColumn, 9);
+    }
+    expect(element.parameters, '(String x)');
+    expect(element.returnType, 'int');
+    expect(element.flags, 0);
+  }
+
   test_fromElement_GETTER() async {
     engine.Source source = addSource('/test.dart', '''
 class A {
diff --git a/pkg/analysis_server/test/plugin/test_all.dart b/pkg/analysis_server/test/plugin/test_all.dart
index 8390a16..284a4a3 100644
--- a/pkg/analysis_server/test/plugin/test_all.dart
+++ b/pkg/analysis_server/test/plugin/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index 7ac554b..553f0a8 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -128,7 +128,7 @@
       engine.ElementKind.DYNAMIC: ElementKind.UNKNOWN,
       engine.ElementKind.ERROR: ElementKind.UNKNOWN,
       engine.ElementKind.EXPORT: ElementKind.UNKNOWN,
-      engine.ElementKind.GENERIC_FUNCTION_TYPE: ElementKind.UNKNOWN,
+      engine.ElementKind.GENERIC_FUNCTION_TYPE: ElementKind.FUNCTION_TYPE_ALIAS,
       engine.ElementKind.IMPORT: ElementKind.UNKNOWN,
       engine.ElementKind.NAME: ElementKind.UNKNOWN,
       engine.ElementKind.UNIVERSE: ElementKind.UNKNOWN
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index d6d427d..3717573 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -22,34 +22,6 @@
 }
 
 @reflectiveTest
-class InvalidParameterResponseMatcher extends Matcher {
-  static const String ERROR_CODE = 'INVALID_PARAMETER';
-
-  @override
-  Description describe(Description description) =>
-      description.add("an 'invalid parameter' response (code $ERROR_CODE)");
-
-  @override
-  bool matches(item, Map matchState) {
-    if (item is! RequestFailure) {
-      return false;
-    }
-    var response = item.response;
-    if (response is! Response) {
-      return false;
-    }
-    if (response.error is! RequestError) {
-      return false;
-    }
-    RequestError requestError = response.error;
-    if (requestError.code != ERROR_CODE) {
-      return false;
-    }
-    return true;
-  }
-}
-
-@reflectiveTest
 class NotificationTest {
   void test_fromJson() {
     Notification original = new Notification('foo');
diff --git a/pkg/analysis_server/test/search/abstract_search_domain.dart b/pkg/analysis_server/test/search/abstract_search_domain.dart
index d4d1465..e16bc24 100644
--- a/pkg/analysis_server/test/search/abstract_search_domain.dart
+++ b/pkg/analysis_server/test/search/abstract_search_domain.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/search/declarations_test.dart b/pkg/analysis_server/test/search/declarations_test.dart
index 8af7bf4..000ba70 100644
--- a/pkg/analysis_server/test/search/declarations_test.dart
+++ b/pkg/analysis_server/test/search/declarations_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index fb3aa88..ff75b70 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -693,6 +693,18 @@
     assertHasResult(SearchResultKind.REFERENCE, 'F f');
   }
 
+  Future<void> test_typeReference_genericTypeAlias_function() async {
+    addTestFile('''
+typedef F = Function();
+main(F f) {
+}
+''');
+    await findElementReferences('F =', false);
+    expect(searchElement.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+    expect(results, hasLength(1));
+    assertHasResult(SearchResultKind.REFERENCE, 'F f');
+  }
+
   Future<void> test_typeReference_typeVariable() async {
     addTestFile('''
 class A<T> {
diff --git a/pkg/analysis_server/test/search/member_declarations_test.dart b/pkg/analysis_server/test/search/member_declarations_test.dart
index 644912e..71509db 100644
--- a/pkg/analysis_server/test/search/member_declarations_test.dart
+++ b/pkg/analysis_server/test/search/member_declarations_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/search/member_references_test.dart b/pkg/analysis_server/test/search/member_references_test.dart
index 3f29142..56bebb9 100644
--- a/pkg/analysis_server/test/search/member_references_test.dart
+++ b/pkg/analysis_server/test/search/member_references_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/search/search_result_test.dart b/pkg/analysis_server/test/search/search_result_test.dart
index 47a8560..2f2ff83 100644
--- a/pkg/analysis_server/test/search/search_result_test.dart
+++ b/pkg/analysis_server/test/search/search_result_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/search/test_all.dart b/pkg/analysis_server/test/search/test_all.dart
index 56465f1..2e85dae 100644
--- a/pkg/analysis_server/test/search/test_all.dart
+++ b/pkg/analysis_server/test/search/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/search/top_level_declarations_test.dart b/pkg/analysis_server/test/search/top_level_declarations_test.dart
index 5e46628..913f821 100644
--- a/pkg/analysis_server/test/search/top_level_declarations_test.dart
+++ b/pkg/analysis_server/test/search/top_level_declarations_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -67,16 +67,18 @@
 class A {} // A
 class B = Object with A;
 typedef C();
-D() {}
-var E = null;
+typedef D();
+E() {}
+var F = null;
 class ABC {}
 ''');
-    await findTopLevelDeclarations('^[A-E]\$');
+    await findTopLevelDeclarations('^[A-F]\$');
     assertHasDeclaration(ElementKind.CLASS, 'A');
     assertHasDeclaration(ElementKind.CLASS, 'B');
     assertHasDeclaration(ElementKind.FUNCTION_TYPE_ALIAS, 'C');
-    assertHasDeclaration(ElementKind.FUNCTION, 'D');
-    assertHasDeclaration(ElementKind.TOP_LEVEL_VARIABLE, 'E');
+    assertHasDeclaration(ElementKind.FUNCTION_TYPE_ALIAS, 'D');
+    assertHasDeclaration(ElementKind.FUNCTION, 'E');
+    assertHasDeclaration(ElementKind.TOP_LEVEL_VARIABLE, 'F');
     assertNoDeclaration(ElementKind.CLASS, 'ABC');
   }
 }
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
index dfeea6a..3461a4f 100644
--- a/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index a75c2e4..cedde60 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -142,23 +142,22 @@
   }
 
   test_Annotation_imported_constructor_named_param() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
-    addTestSource(
-        'import "${convertAbsolutePathToUri("/libA.dart")}"; @A(^) main() { }');
+    addTestSource('import "a.dart"; @A(^) main() { }');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(
         namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
   }
 
   test_Annotation_importedConstructor_prefixed() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {
   const A({int value});
 }
 ''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/libA.dart")}" as p;
+import "a.dart" as p;
 @p.A(^)
 main() {}
 ''');
@@ -463,28 +462,26 @@
 
   test_ArgumentList_imported_constructor_named_param() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/libA.dart', 'library libA; class A{A({int one}); }');
-    addTestSource(
-        'import "${convertAbsolutePathToUri("/libA.dart")}"; main() { new A(^);}');
+    addSource('/home/test/lib/a.dart', 'library libA; class A{A({int one}); }');
+    addTestSource('import "a.dart"; main() { new A(^);}');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
   }
 
   test_ArgumentList_imported_constructor_named_param2() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/libA.dart', 'library libA; class A{A.foo({int one}); }');
-    addTestSource(
-        'import "${convertAbsolutePathToUri("/libA.dart")}"; main() { new A.foo(^);}');
+    addSource(
+        '/home/test/lib/a.dart', 'library libA; class A{A.foo({int one}); }');
+    addTestSource('import "a.dart"; main() { new A.foo(^);}');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
   }
 
   test_ArgumentList_imported_constructor_named_typed_param() async {
     // ArgumentList  InstanceCreationExpression  VariableDeclaration
-    addSource(
-        '/libA.dart', 'library libA; class A { A({int i, String s, d}) {} }}');
-    addTestSource(
-        'import "${convertAbsolutePathToUri("/libA.dart")}"; main() { var a = new A(^);}');
+    addSource('/home/test/lib/a.dart',
+        'library libA; class A { A({int i, String s, d}) {} }}');
+    addTestSource('import "a.dart"; main() { var a = new A(^);}');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(
         namedArgumentsWithTypes: {'i': 'int', 's': 'String', 'd': 'dynamic'});
@@ -492,30 +489,27 @@
 
   test_ArgumentList_imported_factory_named_param() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource(
-        '/libA.dart', 'library libA; class A{factory A({int one}) => null;}');
-    addTestSource(
-        'import "${convertAbsolutePathToUri("/libA.dart")}"; main() { new A(^);}');
+    addSource('/home/test/lib/a.dart',
+        'library libA; class A{factory A({int one}) => null;}');
+    addTestSource('import "a.dart"; main() { new A(^);}');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
   }
 
   test_ArgumentList_imported_factory_named_param2() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement
-    addSource('/libA.dart',
+    addSource('/home/test/lib/a.dart',
         'library libA; abstract class A{factory A.foo({int one});}');
-    addTestSource(
-        'import "${convertAbsolutePathToUri("/libA.dart")}"; main() { new A.foo(^);}');
+    addTestSource('import "a.dart"; main() { new A.foo(^);}');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
   }
 
   test_ArgumentList_imported_factory_named_typed_param() async {
     // ArgumentList  InstanceCreationExpression  VariableDeclaration
-    addSource('/libA.dart',
+    addSource('/home/test/lib/a.dart',
         'library libA; class A {factory A({int i, String s, d}) {} }}');
-    addTestSource(
-        'import "${convertAbsolutePathToUri("/libA.dart")}"; main() { var a = new A(^);}');
+    addTestSource('import "a.dart"; main() { var a = new A(^);}');
     await computeSuggestions();
     assertSuggestArgumentsAndTypes(
         namedArgumentsWithTypes: {'i': 'int', 's': 'String', 'd': 'dynamic'});
@@ -523,13 +517,13 @@
 
   test_ArgumentList_imported_function_0() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect() { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B { }
       String bar() => true;
       void main() {expect(a^)}''');
@@ -539,13 +533,13 @@
 
   test_ArgumentList_imported_function_1() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B { }
       String bar() => true;
       void main() {expect(^)}''');
@@ -555,13 +549,13 @@
 
   test_ArgumentList_imported_function_2() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B { }
       String bar() => true;
       void main() {expect(^)}''');
@@ -571,13 +565,13 @@
 
   test_ArgumentList_imported_function_3() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B { }
       String bar() => true;
       void main() {expect(^)}''');
@@ -587,13 +581,13 @@
 
   test_ArgumentList_imported_function_3a() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B { }
       String bar() => true;
       void main() {expect('hello', ^)}''');
@@ -603,13 +597,13 @@
 
   test_ArgumentList_imported_function_3b() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B { }
       String bar() => true;
       void main() {expect('hello', ^x)}''');
@@ -619,13 +613,13 @@
 
   test_ArgumentList_imported_function_3c() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B { }
       String bar() => true;
       void main() {expect('hello', x^)}''');
@@ -635,13 +629,13 @@
 
   test_ArgumentList_imported_function_3d() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       expect(String arg1, int arg2, {bool arg3}) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B { }
       String bar() => true;
       void main() {expect('hello', x ^)}''');
@@ -896,7 +890,7 @@
   }
 
   test_ArgumentList_local_constructor_required_param_0() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 class A { A({int one, @required String two: 'defaultValue'}) { } }
@@ -1025,12 +1019,12 @@
 
   test_ArgumentList_local_method_0() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B {
         expect() { }
         void foo() {expect(^)}}
@@ -1041,12 +1035,12 @@
 
   test_ArgumentList_local_method_2() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
       library A;
       bool hasLength(int expected) { }
       void baz() { }''');
     addTestSource('''
-      import '${convertAbsolutePathToUri('/libA.dart')}'
+      import 'a.dart'
       class B {
         expect(arg, int blat) { }
         void foo() {expect(^)}}
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index 66d2115..8afed8b 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -36,22 +36,22 @@
 
   test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
       library libAB;
-      part "${convertAbsolutePathToUri('/partAB.dart')}";
+      part "ab_part.dart";
       class A { }
       class B { }''');
-    addSource('/partAB.dart', '''
+    addSource('/home/test/lib/ab_part.dart', '''
       part of libAB;
       var T1;
       PB F1() => new PB();
       class PB { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
       class C { }
       class D { }''');
     addTestSource('''
-      import "${convertAbsolutePathToUri("/testAB.dart")}" hide ^;
-      import "${convertAbsolutePathToUri("/testCD.dart")}";
+      import "ab.dart" hide ^;
+      import "cd.dart";
       class X {}''');
 
     await computeSuggestions();
@@ -76,25 +76,25 @@
 
   test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
       library libAB;
-      part "${convertAbsolutePathToUri('/partAB.dart')}";
+      part "ab_part.dart";
       class A { }
       class B { }
       class _AB''');
-    addSource('/partAB.dart', '''
+    addSource('/home/test/lib/ab_part.dart', '''
       part of libAB;
       var T1;
       PB F1() => new PB();
       typedef PB2 F2(int blat);
       class Clz = Object with Object;
       class PB { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
       class C { }
       class D { }''');
     addTestSource('''
-      import "${convertAbsolutePathToUri("/testAB.dart")}" show ^;
-      import "${convertAbsolutePathToUri("/testCD.dart")}";
+      import "ab.dart" show ^;
+      import "cd.dart";
       class X {}''');
 
     await computeSuggestions();
@@ -124,11 +124,11 @@
   }
 
   test_Combinator_show_export_withShow() async {
-    addSource('/a.dart', r'''
+    addSource('/home/test/lib/a.dart', r'''
 class A {}
 class B {}
 ''');
-    addSource('/b.dart', r'''
+    addSource('/home/test/lib/b.dart', r'''
 export 'a.dart' show A;
 ''');
     addTestSource(r'''
@@ -149,16 +149,16 @@
   }
 
   test_Combinator_show_recursive() async {
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {}
 ''');
-    addSource('/testB.dart', '''
-export 'testA.dart';
-export 'testB.dart';
+    addSource('/home/test/lib/b.dart', '''
+export 'a.dart';
+export 'b.dart';
 class B {}
 ''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}" show ^;
+import "b.dart" show ^;
 ''');
     await computeSuggestions();
     assertSuggestClass('A',
diff --git a/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart b/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
index c6f9a95..a1ba82c 100644
--- a/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/common_usage_sorter_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index fc67b56..9bb1010 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -9,7 +9,6 @@
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'
     show DartCompletionRequestImpl;
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
@@ -460,19 +459,10 @@
     return cs;
   }
 
-  /**
-   * Return a [Future] that completes with the containing library information
-   * after it is accessible via [context.getLibrariesContaining].
-   */
-  Future<void> computeLibrariesContaining([int times = 200]) {
-    return driver.getResult(testFile).then((result) => null);
-  }
-
   Future computeSuggestions({int times = 200}) async {
-    AnalysisResult analysisResult =
-        await driver.getResult(convertPath(testFile));
+    var resolveResult = await session.getResolvedUnit(testFile);
     CompletionRequestImpl baseRequest = new CompletionRequestImpl(
-        analysisResult, completionOffset, new CompletionPerformance());
+        resolveResult, completionOffset, new CompletionPerformance());
 
     // Build the request
     var request = await DartCompletionRequestImpl.from(baseRequest);
@@ -553,7 +543,7 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = resourceProvider.convertPath('/completionTest.dart');
+    testFile = convertPath('/home/test/lib/test.dart');
     contributor = createContributor();
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index 263f905..6e09724 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -30,7 +30,7 @@
   }
 
   test_resolveDirectives() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library libA;
 /// My class.
 /// Short description.
@@ -38,16 +38,16 @@
 /// Longer description.
 class A {}
 ''');
-    addSource('/libB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 library libB;
-import "/libA.dart" as foo;
-part '${convertAbsolutePathToUri(testFile)}';
+import "a.dart" as foo;
+part 'test.dart';
 ''');
     addTestSource('part of libB; main() {^}');
 
     // Build the request
     CompletionRequestImpl baseRequest = new CompletionRequestImpl(
-        await driver.getResult(testFile),
+        await session.getResolvedUnit(testFile),
         completionOffset,
         new CompletionPerformance());
     Completer<DartCompletionRequest> requestCompleter =
@@ -83,6 +83,6 @@
 
     // Assert that the new imports each have an export namespace
     assertImportedLib('dart:core');
-    assertImportedLib('libA.dart');
+    assertImportedLib('a.dart');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
index 28fcdbe..2bdff61 100644
--- a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index 26100ebf..0a1300f 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -1,12 +1,10 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -30,9 +28,9 @@
 
   /// Sanity check.  Permutations tested in local_ref_contributor.
   test_ArgDefaults_function_with_required_named() async {
-    addMetaPackageSource();
+    addMetaPackage();
 
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib B;
 import 'package:meta/meta.dart';
 
@@ -40,7 +38,7 @@
 ''');
 
     addTestSource('''
-import "${convertAbsolutePathToUri('/testB.dart')}";
+import 'b.dart';
 
 void main() {f^}''');
     await computeSuggestions();
@@ -51,12 +49,12 @@
 
   test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import '${convertAbsolutePathToUri('/libA.dart')}';
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {expect(^)}''');
@@ -77,13 +75,13 @@
 
   test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         expect(arg) { }
         void baz() { }''');
     addTestSource('''
-        import '${convertAbsolutePathToUri('/libA.dart')}'
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {expect(^)}''');
@@ -104,14 +102,14 @@
 
   test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import '${convertAbsolutePathToUri('/libA.dart')}';
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {new A(^)}''');
@@ -135,7 +133,7 @@
 
   test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         typedef Funct();
         class A { A(Funct f) { } }
@@ -143,7 +141,7 @@
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import '${convertAbsolutePathToUri('/libA.dart')}';
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {new A(^)}''');
@@ -167,12 +165,12 @@
 
   test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import '${convertAbsolutePathToUri('/libA.dart')}'
+        import 'a.dart';
         expect(arg) { }
         class B { }
         String bar() => true;
@@ -194,12 +192,12 @@
 
   test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import '${convertAbsolutePathToUri('/libA.dart')}'
+        import 'a.dart';
         class B {
           expect(arg) { }
           void foo() {expect(^)}}
@@ -221,14 +219,14 @@
 
   test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import '${convertAbsolutePathToUri('/libA.dart')}';
+        import 'a.dart';
         class B { }
         String bar(f()) => true;
         void main() {bar(^);}''');
@@ -252,14 +250,14 @@
 
   test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import '${convertAbsolutePathToUri('/libA.dart')}';
+        import 'a.dart';
         class B { String bar(f()) => true; }
         void main() {new B().bar(^);}''');
 
@@ -282,11 +280,11 @@
   test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }''');
     addTestSource('''
-        import '${convertAbsolutePathToUri('/libA.dart')}'
+        import 'a.dart';
         String bar() => true;
         void main() {expect(foo: ^)}''');
 
@@ -320,12 +318,12 @@
 
   test_AsExpression_type_subtype_extends_filter() async {
     // SimpleIdentifier  TypeName  AsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
           foo() { }
           class A {} class B extends A {} class C extends B {}
           class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-          import "${convertAbsolutePathToUri('/testB.dart')}";
+          import 'b.dart';
          main(){A a; if (a as ^)}''');
 
     await computeSuggestions();
@@ -342,12 +340,12 @@
 
   test_AsExpression_type_subtype_implements_filter() async {
     // SimpleIdentifier  TypeName  AsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
           foo() { }
           class A {} class B implements A {} class C implements B {}
           class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-          import "${convertAbsolutePathToUri('/testB.dart')}";
+          import 'b.dart';
           main(){A a; if (a as ^)}''');
 
     await computeSuggestions();
@@ -491,11 +489,11 @@
   }
 
   test_AwaitExpression_function() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 Future y() async {return 0;}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   int x;
   foo() async {await ^}
@@ -504,20 +502,20 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestFunction('y', 'dynamic');
+    assertSuggestFunction('y', 'Future<dynamic>');
     assertNotSuggested('A');
     assertSuggestClass('Object');
   }
 
   test_AwaitExpression_inherited() async {
     // SimpleIdentifier  AwaitExpression  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib libB;
 class A {
   Future y() async { return 0; }
 }''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/testB.dart')}";
+import 'b.dart';
 class B extends A {
   foo() async {await ^}
 }
@@ -565,29 +563,29 @@
 
   test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testAB.dart')}";
-        import "${convertAbsolutePathToUri('/testCD.dart')}" hide D;
-        import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE;
-        import "${convertAbsolutePathToUri('/testG.dart')}" as g;
+        import "ab.dart";
+        import "cd.dart" hide D;
+        import "eef.dart" show EE;
+        import "g.dart" as g;
         int T5;
         var _T6;
         String get T7 => 'hello';
@@ -620,7 +618,7 @@
     assertNotSuggested('x');
     assertNotSuggested('partT8');
 
-    assertSuggestClass('A', elemFile: '/testAB.dart');
+    assertSuggestClass('A', elemFile: '/home/test/lib/ab.dart');
     if (suggestConstructorsWithoutNew) {
       assertSuggestConstructor('A');
     }
@@ -668,29 +666,29 @@
 
   test_Block_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testAB.dart')}";
-        import "${convertAbsolutePathToUri('/testCD.dart')}" hide D;
-        import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE;
-        import "${convertAbsolutePathToUri('/testG.dart')}" as g;
+        import "ab.dart";
+        import "cd.dart" hide D;
+        import "eef.dart" show EE;
+        import "g.dart" as g;
         int T5;
         var _T6;
         String get T7 => 'hello';
@@ -781,29 +779,29 @@
 
   test_Block_final_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testAB.dart')}";
-        import "${convertAbsolutePathToUri('/testCD.dart')}" hide D;
-        import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE;
-        import "${convertAbsolutePathToUri('/testG.dart')}" as g hide G;
+        import "ab.dart";
+        import "cd.dart" hide D;
+        import "eef.dart" show EE;
+        import "g.dart" as g hide G;
         int T5;
         var _T6;
         String get T7 => 'hello';
@@ -882,29 +880,29 @@
 
   test_Block_final_var() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testAB.dart')}";
-        import "${convertAbsolutePathToUri('/testCD.dart')}" hide D;
-        import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE;
-        import "${convertAbsolutePathToUri('/testG.dart')}" as g;
+        import "ab.dart";
+        import "cd.dart" hide D;
+        import "eef.dart" show EE;
+        import "g.dart" as g;
         int T5;
         var _T6;
         String get T7 => 'hello';
@@ -980,30 +978,30 @@
   }
 
   test_Block_identifier_partial() async {
-    resolveSource('/testAB.dart', '''
+    resolveSource('/home/test/lib/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
         class EE { }
         class DF { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
         class H { }
         class D3 { }
         int T3;
         var _T4;'''); // not imported
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testAB.dart')}";
-        import "${convertAbsolutePathToUri('/testCD.dart')}" hide D;
-        import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE;
-        import "${convertAbsolutePathToUri('/testG.dart')}" as g;
+        import "ab.dart";
+        import "cd.dart" hide D;
+        import "eef.dart" show EE;
+        import "g.dart" as g;
         int T5;
         var _T6;
         Z D2() {int x;}
@@ -1058,14 +1056,14 @@
 
   test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
         class E extends F { var e1; e2() { } }
         class I { int i1; i2() { } }
         class M { var m1; int m2() { } }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         class A extends E implements I with M {a() {^}}''');
 
     await computeSuggestions();
@@ -1112,29 +1110,29 @@
   }
 
   test_Block_local_function() async {
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testAB.dart')}";
-        import "${convertAbsolutePathToUri('/testCD.dart')}" hide D;
-        import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE;
-        import "${convertAbsolutePathToUri('/testG.dart')}" as g;
+        import "ab.dart";
+        import "cd.dart" hide D;
+        import "eef.dart" show EE;
+        import "g.dart" as g;
         int T5;
         var _T6;
         String get T7 => 'hello';
@@ -1164,29 +1162,29 @@
 
   test_Block_partial_results() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
         export "dart:math" hide max;
         class A {int x;}
         @deprecated D1() {int x;}
         class _B { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         String T1;
         var _T2;
         class C { }
         class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
         class EE { }
         class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
         class H { }
         int T3;
         var _T4;'''); // not imported
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
-        import "${convertAbsolutePathToUri('/testCD.dart')}" hide D;
-        import "${convertAbsolutePathToUri('/testEEF.dart')}" show EE;
-        import "${convertAbsolutePathToUri('/testG.dart')}" as g;
+        import 'b.dart';
+        import "cd.dart" hide D;
+        import "eef.dart" show EE;
+        import "g.dart" as g;
         int T5;
         var _T6;
         Z D2() {int x;}
@@ -1201,27 +1199,24 @@
   }
 
   test_Block_unimported() async {
-    addPackageSource('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
-    addSource(
-        '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
-    testFile = '/proj/completionTest.dart';
-    addTestSource('class C {foo(){F^}}');
+    addPackageFile('aaa', 'a.dart', 'class A {}');
+    addTestSource('main() { ^ }');
 
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
-    expect(replacementLength, 1);
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+
     // Not imported, so not suggested
-    assertNotSuggested('Foo');
-    assertNotSuggested('Foo2');
-    assertNotSuggested('Future');
+    assertNotSuggested('A');
+    assertNotSuggested('Completer');
   }
 
   test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         class A {var b; X _c;}
         class X{}
         // looks like a cascade to the parser
@@ -1243,10 +1238,10 @@
 
   test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         class A {var b; X _c;}
         class X{}
         main() {A a; a..^z}''');
@@ -1266,10 +1261,10 @@
 
   test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         class A {var b; X _c;}
         class X{}
         main() {A a; a..^ return}''');
@@ -1361,10 +1356,10 @@
 
   test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('testB.dart')}" as x;
+        import "b.dart" as x;
         @deprecated class A {^}
         class _B {}
         A T;''');
@@ -1386,10 +1381,10 @@
 
   test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('testB.dart')}" as x;
+        import "b.dart" as x;
         class A {final ^}
         class _B {}
         A T;''');
@@ -1407,10 +1402,10 @@
 
   test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('testB.dart')}" as x;
+        import "b.dart" as x;
         class A {final ^ A(){}}
         class _B {}
         A T;''');
@@ -1428,10 +1423,10 @@
 
   test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('testB.dart')}" as Soo;
+        import "b.dart" as Soo;
         class A {final S^ A();}
         class _B {}
         A Sew;''');
@@ -1449,10 +1444,10 @@
 
   test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('testB.dart')}" as x;
+        import "b.dart" as x;
         class A {final ^ final foo;}
         class _B {}
         A T;''');
@@ -1470,10 +1465,10 @@
 
   test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('testB.dart')}" as x;
+        import "b.dart" as x;
         class A {final ^ var foo;}
         class _B {}
         A T;''');
@@ -1491,7 +1486,7 @@
 
   test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
         library libAB;
         part 'partAB.dart';
         class A { }
@@ -1501,12 +1496,12 @@
         var T1;
         PB F1() => new PB();
         class PB { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         class C { }
         class D { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}" hide ^;
-        import "${convertAbsolutePathToUri('/testCD.dart')}";
+        import "b.dart" hide ^;
+        import "cd.dart";
         class X {}''');
 
     await computeSuggestions();
@@ -1515,7 +1510,7 @@
 
   test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
         library libAB;
         part 'partAB.dart';
         class A { }
@@ -1527,12 +1522,12 @@
         typedef PB2 F2(int blat);
         class Clz = Object with Object;
         class PB { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
         class C { }
         class D { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}" show ^;
-        import "${convertAbsolutePathToUri('/testCD.dart')}";
+        import "b.dart" show ^;
+        import "cd.dart";
         class X {}''');
 
     await computeSuggestions();
@@ -1541,12 +1536,12 @@
 
   test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         class B {int x;}
@@ -1561,12 +1556,12 @@
 
   test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         class B {int x;}
@@ -1590,12 +1585,12 @@
 
   test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         class B {int x;}
@@ -1610,12 +1605,12 @@
 
   test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         class B {int x;}
@@ -1639,12 +1634,12 @@
 
   test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         class B {int x;}
@@ -1660,13 +1655,13 @@
   test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         var m;
         main() {new X.^}''');
 
@@ -1685,13 +1680,13 @@
   test_ConstructorName_importedFactory() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         var m;
         main() {new X.^}''');
 
@@ -1786,7 +1781,7 @@
   }
 
   test_doc_class() async {
-    addSource('/libA.dart', r'''
+    addSource('/home/test/lib/a.dart', r'''
 library A;
 /// My class.
 /// Short description.
@@ -1794,8 +1789,7 @@
 /// Longer description.
 class A {}
 ''');
-    addTestSource(
-        'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}');
+    addTestSource('import "a.dart"; main() {^}');
 
     await computeSuggestions();
 
@@ -1809,7 +1803,7 @@
   }
 
   test_doc_function() async {
-    resolveSource('/libA.dart', r'''
+    resolveSource('/home/test/lib/a.dart', r'''
 library A;
 /// My function.
 /// Short description.
@@ -1817,8 +1811,7 @@
 /// Longer description.
 int myFunc() {}
 ''');
-    addTestSource(
-        'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}');
+    addTestSource('import "a.dart"; main() {^}');
 
     await computeSuggestions();
 
@@ -1829,7 +1822,7 @@
   }
 
   test_doc_function_c_style() async {
-    resolveSource('/libA.dart', r'''
+    resolveSource('/home/test/lib/a.dart', r'''
 library A;
 /**
  * My function.
@@ -1839,8 +1832,7 @@
  */
 int myFunc() {}
 ''');
-    addTestSource(
-        'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}');
+    addTestSource('import "a.dart"; main() {^}');
 
     await computeSuggestions();
 
@@ -1851,9 +1843,8 @@
   }
 
   test_enum() async {
-    addSource('/libA.dart', 'library A; enum E { one, two }');
-    addTestSource(
-        'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}');
+    addSource('/home/test/lib/a.dart', 'library A; enum E { one, two }');
+    addTestSource('import "a.dart"; main() {^}');
     await computeSuggestions();
     assertSuggestEnum('E');
     assertNotSuggested('one');
@@ -1861,9 +1852,9 @@
   }
 
   test_enum_deprecated() async {
-    addSource('/libA.dart', 'library A; @deprecated enum E { one, two }');
-    addTestSource(
-        'import "${convertAbsolutePathToUri('/libA.dart')}"; main() {^}');
+    addSource(
+        '/home/test/lib/a.dart', 'library A; @deprecated enum E { one, two }');
+    addTestSource('import "a.dart"; main() {^}');
     await computeSuggestions();
     // TODO(danrube) investigate why suggestion/element is not deprecated
     // when AST node has correct @deprecated annotation
@@ -1873,7 +1864,7 @@
   }
 
   test_enum_filter() async {
-    addSource('/a.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 enum E { one, two }
 enum F { three, four }
 ''');
@@ -1899,12 +1890,12 @@
 
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         _B F1() { }
         class A {int x;}
         class _B { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         typedef int F2(int blat);
         class Clz = Object with Object;
         class C {foo(){^} void bar() {}}''');
@@ -1929,11 +1920,11 @@
 
   test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         class C {a() {C ^}}''');
 
     await computeSuggestions();
@@ -1943,9 +1934,9 @@
   test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         class C {A ^}''');
 
     await computeSuggestions();
@@ -1955,9 +1946,9 @@
   test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         class C {var ^}''');
 
     await computeSuggestions();
@@ -2137,11 +2128,11 @@
   }
 
   test_function_parameters_mixed_required_and_named() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 int m(x, {int y}) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -2158,11 +2149,11 @@
   }
 
   test_function_parameters_mixed_required_and_positional() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m(x, [int y]) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -2179,11 +2170,11 @@
   }
 
   test_function_parameters_named() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m({x, int y}) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -2200,11 +2191,11 @@
   }
 
   test_function_parameters_none() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m() {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -2219,11 +2210,11 @@
   }
 
   test_function_parameters_positional() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m([x, int y]) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -2240,11 +2231,11 @@
   }
 
   test_function_parameters_required() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m(x, int y) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -2262,13 +2253,13 @@
 
   test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -2292,13 +2283,13 @@
 
   test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -2322,13 +2313,13 @@
 
   test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -2367,6 +2358,36 @@
     assertSuggestClass('Object');
   }
 
+  test_functionTypeAlias_genericTypeAlias() async {
+    addSource('/home/test/lib/a.dart', r'''
+typedef F = void Function();
+''');
+    addTestSource(r'''
+import 'a.dart';
+
+main() {
+  ^
+}
+''');
+    await computeSuggestions();
+    assertSuggestFunctionTypeAlias('F', 'void');
+  }
+
+  test_functionTypeAlias_old() async {
+    addSource('/home/test/lib/a.dart', r'''
+typedef void F();
+''');
+    addTestSource(r'''
+import 'a.dart';
+
+main() {
+  ^
+}
+''');
+    await computeSuggestions();
+    assertSuggestFunctionTypeAlias('F', 'void');
+  }
+
   test_IfStatement() async {
     // SimpleIdentifier  IfStatement
     addTestSource('''
@@ -2433,8 +2454,7 @@
   }
 
   test_implicitCreation() async {
-    configurePreviewDart2();
-    addSource('/a.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {
   A.a1();
   A.a2();
@@ -2474,12 +2494,12 @@
 
   test_IndexExpression() async {
     // ExpressionStatement  Block
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         class B {int x;}
@@ -2503,12 +2523,12 @@
 
   test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         class B {int x;}
@@ -2522,12 +2542,12 @@
   }
 
   test_InstanceCreationExpression() async {
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {foo(){var f; {var x;}}}
 class B {B(this.x, [String boo]) { } int x;}
 class C {C.bar({boo: 'hoo', int z: 0}) { } }''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/testA.dart')}";
+import 'a.dart';
 import "dart:math" as math;
 main() {new ^ String x = "hello";}''');
 
@@ -2571,7 +2591,7 @@
   }
 
   test_InstanceCreationExpression_abstractClass() async {
-    addSource('/a.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 abstract class A {
   A();
   A.generative();
@@ -2593,7 +2613,7 @@
   }
 
   test_InstanceCreationExpression_abstractClass_implicitConstructor() async {
-    addSource('/a.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 abstract class A {}
 ''');
     addTestSource('''
@@ -2609,8 +2629,7 @@
   }
 
   test_InstanceCreationExpression_filter() async {
-    configurePreviewDart2();
-    addSource('/a.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {}
 class B extends A {}
 class C implements A {}
@@ -2637,14 +2656,19 @@
     assertSuggestConstructor('D', elemOffset: -1);
   }
 
+  @failingTest
   test_InstanceCreationExpression_imported() async {
+    // This is failing because the constructor for Future is added twice. I
+    // suspect that we're adding it from both dart:core and dart:async and are
+    // not noticing that it's the same element.
+
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {A(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         import "dart:async";
         int T2;
         F2() { }
@@ -2676,15 +2700,15 @@
 
   test_InstanceCreationExpression_unimported() async {
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/testAB.dart', 'class Foo { }');
-    addTestSource('class C {foo(){new F^}}');
+    addSource('/home/test/lib/ab.dart', 'class Clip { }');
+    addTestSource('class A {foo(){new C^}}');
 
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
     expect(replacementLength, 1);
     // Not imported, so not suggested
-    assertNotSuggested('Future');
-    assertNotSuggested('Foo');
+    assertNotSuggested('Completer');
+    assertNotSuggested('Clip');
   }
 
   test_internal_sdk_libs() async {
@@ -2700,13 +2724,13 @@
 
   test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -2735,13 +2759,13 @@
 
   test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -2809,12 +2833,12 @@
 
   test_IsExpression() async {
     // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         class Y {Y.c(); Y._d(); z() {}}
         main() {var x; if (x is ^) { }}''');
 
@@ -2879,12 +2903,12 @@
 
   test_IsExpression_type_subtype_extends_filter() async {
     // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         foo() { }
         class A {} class B extends A {} class C extends B {}
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         main(){A a; if (a is ^)}''');
 
     await computeSuggestions();
@@ -2901,12 +2925,12 @@
 
   test_IsExpression_type_subtype_implements_filter() async {
     // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         foo() { }
         class A {} class B implements A {} class C implements B {}
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         main(){A a; if (a is ^)}''');
 
     await computeSuggestions();
@@ -2922,14 +2946,14 @@
   }
 
   test_keyword() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
         lib B;
         int newT1;
         int T1;
         nowIsIt() { }
         class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         String newer() {}
         var m;
         main() {new^ X.c();}''');
@@ -2983,13 +3007,13 @@
 
   test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -3020,13 +3044,13 @@
 
   test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -3047,13 +3071,13 @@
 
   test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -3068,11 +3092,11 @@
   }
 
   test_method_parameters_mixed_required_and_named() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m(x, {int y}) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -3089,11 +3113,11 @@
   }
 
   test_method_parameters_mixed_required_and_positional() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m(x, [int y]) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -3110,11 +3134,11 @@
   }
 
   test_method_parameters_named() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m({x, int y}) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -3131,11 +3155,11 @@
   }
 
   test_method_parameters_none() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m() {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -3150,11 +3174,11 @@
   }
 
   test_method_parameters_positional() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m([x, int y]) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -3171,11 +3195,11 @@
   }
 
   test_method_parameters_required() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 void m(x, int y) {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B {
   main() {^}
 }
@@ -3205,14 +3229,14 @@
 
   test_MethodDeclaration_body_static() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testC.dart', '''
+    addSource('/home/test/lib/c.dart', '''
         class C {
           c1() {}
           var c2;
           static c3() {}
           static var c4;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testC.dart')}";
+        import "c.dart";
         class B extends C {
           b1() {}
           var b2;
@@ -3252,9 +3276,7 @@
     assertNotSuggested('_g');
     assertSuggestClass('bool');
     if (suggestConstructorsWithoutNew) {
-      // TODO(brianwilkerson) Should not suggest constructors for classes that
-      // cannot be instantiated.
-      assertSuggestConstructor('bool');
+      assertSuggestConstructor('List');
     }
   }
 
@@ -3293,13 +3315,13 @@
 
   test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -3322,13 +3344,13 @@
 
   test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -3351,13 +3373,13 @@
 
   test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -3380,13 +3402,13 @@
 
   test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         int T2;
         F2() { }
         typedef D2();
@@ -3443,7 +3465,7 @@
   }
 
   test_mixin_ordering() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class B {}
 class M1 {
   void m() {}
@@ -3453,7 +3475,7 @@
 }
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class C extends B with M1, M2 {
   void f() {
     ^
@@ -3464,48 +3486,6 @@
     assertNotSuggested('m');
   }
 
-  /**
-   * Ensure that completions in one context don't appear in another
-   */
-  test_multiple_contexts() async {
-    // Create a 2nd context with source
-    var context2 = AnalysisEngine.instance.createAnalysisContext();
-    context2.sourceFactory =
-        new SourceFactory([new DartUriResolver(sdk), resourceResolver]);
-    String content2 = 'class ClassFromAnotherContext { }';
-    Source source2 =
-        newFile('/context2/foo.dart', content: content2).createSource();
-    ChangeSet changeSet = new ChangeSet();
-    changeSet.addedSource(source2);
-    context2.applyChanges(changeSet);
-    context2.setContents(source2, content2);
-
-    // Resolve the source in the 2nd context and update the index
-    var result = context2.performAnalysisTask();
-    while (result.hasMoreWork) {
-      result = context2.performAnalysisTask();
-    }
-
-    // Check that source in 2nd context does not appear in completion in 1st
-    addSource('/context1/libA.dart', '''
-      library libA;
-      class ClassInLocalContext {int x;}''');
-    testFile = '/context1/completionTest.dart';
-    addTestSource('''
-      import "${convertAbsolutePathToUri("/context1/libA.dart")}";
-      import "${convertAbsolutePathToUri("/foo.dart")}";
-      main() {C^}
-      ''');
-
-    await computeSuggestions();
-    assertSuggestClass('ClassInLocalContext');
-    if (suggestConstructorsWithoutNew) {
-      assertSuggestConstructor('ClassInLocalContext');
-    }
-    // Assert contributor does not include results from 2nd context.
-    assertNotSuggested('ClassFromAnotherContext');
-  }
-
   test_new_instance() async {
     addTestSource('import "dart:math"; class A {x() {new Random().^}}');
 
@@ -3519,11 +3499,11 @@
   }
 
   test_no_parameters_field() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int x;
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -3534,11 +3514,11 @@
   }
 
   test_no_parameters_getter() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 int get x => null;
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -3549,11 +3529,11 @@
   }
 
   test_no_parameters_setter() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 set x(int value) {};
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/libA.dart')}';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -3572,15 +3552,15 @@
 
   test_partFile_TypeName() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library libA;
-        import "${convertAbsolutePathToUri('/testB.dart')}";
-        part "${convertAbsolutePathToUri(testFile)}";
+        import 'b.dart';
+        part "test.dart";
         class A { }
         var m;''');
     addTestSource('''
@@ -3588,7 +3568,6 @@
         class B { factory B.bar(int x) => null; }
         main() {new ^}''');
 
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -3608,23 +3587,22 @@
 
   test_partFile_TypeName2() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib libB;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         part of libA;
         class B { }''');
     addTestSource('''
         library libA;
-        import "${convertAbsolutePathToUri('/testB.dart')}";
-        part "testA.dart";
+        import 'b.dart';
+        part "a.dart";
         class A { A({String boo: 'hoo'}) { } }
         main() {new ^}
         var m;''');
 
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -3644,7 +3622,7 @@
 
   test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -3658,7 +3636,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         class A extends B {
           static const String scA = 'foo';
           w() { }}
@@ -3691,7 +3669,7 @@
 
   test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class I {X get f => new A();get _g => new A();}
         class A implements I {
@@ -3702,7 +3680,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         main() {A a; a.^}''');
 
     await computeSuggestions();
@@ -3770,13 +3748,13 @@
 
   test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         main() {b.^}''');
@@ -3797,13 +3775,13 @@
 
   test_PrefixedIdentifier_library_typesOnly() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         foo(b.^ f) {}''');
@@ -3824,13 +3802,13 @@
 
   test_PrefixedIdentifier_library_typesOnly2() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         foo(b.^) {}''');
@@ -3851,13 +3829,13 @@
 
   test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
         class M{}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         foo(X x) {x.^}''');
 
     await computeSuggestions();
@@ -3870,11 +3848,11 @@
 
   test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";
+        import 'a.dart';
         class X {foo(){A^.bar}}''');
 
     await computeSuggestions();
@@ -4016,7 +3994,7 @@
 
   test_PropertyAccess_noTarget() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/testAB.dart', 'class Foo { }');
+    addSource('/home/test/lib/ab.dart', 'class Foo { }');
     addTestSource('class C {foo(){.^}}');
 
     await computeSuggestions();
@@ -4025,7 +4003,7 @@
 
   test_PropertyAccess_noTarget2() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/testAB.dart', 'class Foo { }');
+    addSource('/home/test/lib/ab.dart', 'class Foo { }');
     addTestSource('main() {.^}');
 
     await computeSuggestions();
@@ -4314,12 +4292,12 @@
 
   test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";'
+        import 'a.dart';
         class C2 {int x;}
         F2() => 0;
         typedef int T2(int blat);
@@ -4340,12 +4318,12 @@
 
   test_TypeArgumentList2() async {
     // TypeName  TypeArgumentList  TypeName
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testA.dart')}";'
+        import 'a.dart';
         class C2 {int x;}
         F2() => 0;
         typedef int T2(int blat);
@@ -4360,16 +4338,16 @@
   }
 
   test_TypeArgumentList_recursive() async {
-    resolveSource('/testA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {}
 ''');
-    resolveSource('/testB.dart', '''
-export 'testA.dart';
-export 'testB.dart';
+    resolveSource('/home/test/lib/b.dart', '''
+export 'a.dart';
+export 'b.dart';
 class B {}
 ''');
     addTestSource('''
-import '${convertAbsolutePathToUri('/testB.dart')}';
+import 'b.dart';
 List<^> x;
 ''');
     await computeSuggestions();
@@ -4382,13 +4360,13 @@
   test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         class Y {Y.c(); Y._d(); z() {}}
         main() {var ^}''');
 
@@ -4409,13 +4387,13 @@
   test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         class Y {Y.c(); Y._d(); z() {}}
         class C {bar(){var f; {var x;} var e = ^}}''');
 
@@ -4434,14 +4412,14 @@
   test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
         lib B;
         foo1() { }
         void bar1() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri('/testB.dart')}";
+        import 'b.dart';
         foo2() { }
         void bar2() { }
         class Y {Y.c(); Y._d(); z() {}}
diff --git a/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
index d4689fe..d08e091 100644
--- a/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
@@ -1,6 +1,7 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
+
 import 'dart:async';
 
 import 'package:analysis_server/src/protocol_server.dart';
@@ -29,8 +30,8 @@
 
   /// Sanity check.  Permutations tested in local_ref_contributor.
   test_ArgDefaults_inherited_method_with_required_named() async {
-    addMetaPackageSource();
-    resolveSource('/testB.dart', '''
+    addMetaPackage();
+    resolveSource('/home/test/lib/b.dart', '''
 import 'package:meta/meta.dart';
 
 lib libB;
@@ -38,7 +39,7 @@
    bool foo(int bar, {bool boo, @required int baz}) => false;
 }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class B extends A {
   b() => f^
 }
@@ -51,13 +52,13 @@
 
   test_AwaitExpression_inherited() async {
     // SimpleIdentifier  AwaitExpression  ExpressionStatement
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A {
   Future y() async {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class B extends A {
   Future a() async {return 0;}
   foo() async {await ^}
@@ -72,19 +73,19 @@
     assertNotSuggested('B');
     assertNotSuggested('A');
     assertNotSuggested('Object');
-    assertSuggestMethod('y', 'A', 'dynamic');
+    assertSuggestMethod('y', 'A', 'Future<dynamic>');
   }
 
   test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
       lib B;
       class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
       class E extends F { var e1; e2() { } }
       class I { int i1; i2() { } }
       class M { var m1; int m2() { } }''');
     addTestSource('''
-      import "testB.dart";
+      import "b.dart";
       class A extends E implements I with M {a() {^}}''');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -163,7 +164,7 @@
   }
 
   test_inherited() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -172,7 +173,7 @@
   int y2() {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A1 {
   int x;
   int y() {return 0;}
@@ -239,13 +240,13 @@
   }
 
   test_method_parameters_mixed_required_and_named() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m(x, {int y}) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -282,13 +283,13 @@
   }
 
   test_method_parameters_mixed_required_and_positional() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m(x, [int y]) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -325,13 +326,13 @@
   }
 
   test_method_parameters_named() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m({x, int y}) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -368,13 +369,13 @@
   }
 
   test_method_parameters_none() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m() {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -405,13 +406,13 @@
   }
 
   test_method_parameters_positional() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m([x, int y]) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -448,13 +449,13 @@
   }
 
   test_method_parameters_required() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m(x, int y) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -471,7 +472,7 @@
   }
 
   test_mixin_ordering() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class B {}
 class M1 {
   void m() {}
@@ -481,7 +482,7 @@
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class C extends B with M1, M2 {
   void f() {
     ^
@@ -493,13 +494,13 @@
   }
 
   test_no_parameters_field() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   int x;
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -510,13 +511,13 @@
   }
 
   test_no_parameters_getter() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   int get x => null;
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -527,13 +528,13 @@
   }
 
   test_no_parameters_setter() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   set x(int value) {};
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -544,7 +545,7 @@
   }
 
   test_outside_class() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -553,7 +554,7 @@
   int y2() {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A1 {
   int x;
   int y() {return 0;}
@@ -585,7 +586,7 @@
   }
 
   test_static_field() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -594,7 +595,7 @@
   int y2() {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A1 {
   int x;
   int y() {return 0;}
@@ -626,7 +627,7 @@
   }
 
   test_static_method() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -635,7 +636,7 @@
   int y2() {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A1 {
   int x;
   int y() {return 0;}
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index f2e2ba2..73f5b37 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
index 0cd2068..01dd324 100644
--- a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index 0bf6a76..e13ad70 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -87,14 +87,12 @@
 
   test_libraryPrefix_deferred_inPart() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    var libFile = '${testFile.substring(0, testFile.length - 5)}A.dart';
-    addSource(libFile, '''
+    addSource('/home/test/lib/a.dart', '''
         library testA;
         import "dart:async" deferred as bar;
-        part "${convertAbsolutePathToUri(testFile)}";''');
+        part "test.dart";''');
     addTestSource('part of testA; foo() {bar.^}');
     // Assume that libraries containing has been computed for part files
-    await computeLibrariesContaining();
     await computeSuggestions();
     assertSuggestClass('Future');
     assertSuggestFunction('loadLibrary', 'Future<dynamic>');
@@ -102,14 +100,13 @@
   }
 
   test_libraryPrefix_with_exports() async {
-    addSource('/libA.dart', 'library libA; class A { }');
-    addSource('/libB.dart', '''
+    addSource('/home/test/lib/a.dart', 'library libA; class A { }');
+    addSource('/home/test/lib/b.dart', '''
         library libB;
-        export "${convertAbsolutePathToUri("/libA.dart")}";
+        export "a.dart";
         class B { }
         @deprecated class B1 { }''');
-    addTestSource(
-        'import "${convertAbsolutePathToUri("/libB.dart")}" as foo; main() {foo.^} class C { }');
+    addTestSource('import "b.dart" as foo; main() {foo.^} class C { }');
     await computeSuggestions();
     assertSuggestClass('B');
     assertSuggestClass('B1', relevance: DART_RELEVANCE_LOW, isDeprecated: true);
@@ -119,13 +116,13 @@
 
   test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testB.dart")}" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         main() {b.^}''');
@@ -143,11 +140,11 @@
   }
 
   test_PrefixedIdentifier_library_export_withShow() async {
-    addSource('/a.dart', r'''
+    addSource('/home/test/lib/a.dart', r'''
 class A {}
 class B {}
 ''');
-    addSource('/b.dart', r'''
+    addSource('/home/test/lib/b.dart', r'''
 export 'a.dart' show A;
 ''');
     addTestSource(r'''
@@ -162,7 +159,7 @@
   }
 
   test_PrefixedIdentifier_library_import_withShow() async {
-    addSource('/a.dart', r'''
+    addSource('/home/test/lib/a.dart', r'''
 class A {}
 class B {}
 ''');
@@ -179,23 +176,21 @@
 
   test_PrefixedIdentifier_library_inPart() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    var libFile = '${testFile.substring(0, testFile.length - 5)}A.dart';
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
-    addSource(libFile, '''
+    addSource('/home/test/lib/a.dart', '''
         library testA;
-        import "${convertAbsolutePathToUri("/testB.dart")}" as b;
-        part "${convertAbsolutePathToUri(testFile)}";
+        import "b.dart" as b;
+        part "test.dart";
         var T2;
         class A { }''');
     addTestSource('''
         part of testA;
         main() {b.^}''');
     // Assume that libraries containing has been computed for part files
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -211,13 +206,13 @@
 
   test_PrefixedIdentifier_library_typesOnly() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testB.dart")}" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         foo(b.^ f) {}''');
@@ -236,13 +231,13 @@
 
   test_PrefixedIdentifier_library_typesOnly2() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testB.dart")}" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         foo(b.^) {}''');
@@ -261,13 +256,13 @@
 
   test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
         class M{}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testB.dart")}";
+        import "b.dart";
         foo(X x) {x.^}''');
     await computeSuggestions();
     assertNoSuggestions();
@@ -275,11 +270,11 @@
 
   test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testA.dart")}";
+        import "a.dart";
         class X {foo(){A^.bar}}''');
     await computeSuggestions();
     assertNoSuggestions();
diff --git a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
index 052103e..7309c20 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -42,29 +42,29 @@
 
   test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
     addTestSource('''
-import "testAB.dart";
-import "testCD.dart" hide D;
-import "testEEF.dart" show EE;
-import "testG.dart" as g;
+import "ab.dart";
+import "cd.dart" hide D;
+import "eef.dart" show EE;
+import "g.dart" as g;
 int T5;
 var _T6;
 String get T7 => 'hello';
@@ -183,10 +183,10 @@
 
   test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 @deprecated class A {^}
 class _B {}
 A T;''');
@@ -198,10 +198,10 @@
 
   test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^}
 class _B {}
 A T;''');
@@ -213,10 +213,10 @@
 
   test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ A(){}}
 class _B {}
 A T;''');
@@ -228,10 +228,10 @@
 
   test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as Soo;
+import "b.dart" as Soo;
 class A {final S^ A();}
 class _B {}
 A Sew;''');
@@ -243,10 +243,10 @@
 
   test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ final foo;}
 class _B {}
 A T;''');
@@ -258,10 +258,10 @@
 
   test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ var foo;}
 class _B {}
 A T;''');
@@ -272,12 +272,12 @@
   }
 
   test_InstanceCreationExpression() async {
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {foo(){var f; {var x;}}}
 class B {B(this.x, [String boo]) { } int x;}
 class C {C.bar({boo: 'hoo', int z: 0}) { } }''');
     addTestSource('''
-import "testA.dart" as t;
+import "a.dart" as t;
 import "dart:math" as math;
 main() {new ^ String x = "hello";}''');
     await computeSuggestions();
@@ -291,32 +291,31 @@
   }
 
   test_InstanceCreationExpression_inPart() async {
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {foo(){var f; {var x;}}}
 class B {B(this.x, [String boo]) { } int x;}
 class C {C.bar({boo: 'hoo', int z: 0}) { } }''');
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 library testB;
-import "${convertAbsolutePathToUri("/testA.dart")}" as t;
+import "a.dart" as t;
 import "dart:math" as math;
-part "${convertAbsolutePathToUri(testFile)}"
+part "test.dart";
 main() {new ^ String x = "hello";}''');
     addTestSource('''
 part of testB;
 main() {new ^ String x = "hello";}''');
-    await computeLibrariesContaining();
     await computeSuggestions();
     assertSuggestLibraryPrefixes(['math', 't']);
   }
 
   test_InstanceCreationExpression_inPart_detached() async {
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {foo(){var f; {var x;}}}
 class B {B(this.x, [String boo]) { } int x;}
 class C {C.bar({boo: 'hoo', int z: 0}) { } }''');
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 library testB;
-import "testA.dart" as t;
+import "a.dart" as t;
 import "dart:math" as math;
 //part "$testFile"
 main() {new ^ String x = "hello";}''');
diff --git a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
index d361dc9..36a37e9 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -57,7 +57,7 @@
 
   /// Sanity check.  Permutations tested in local_ref_contributor.
   test_ArgDefaults_cons_with_required_named() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -74,12 +74,12 @@
 
   test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B { }
 String bar() => true;
 void main() {expect(^)}''');
@@ -104,13 +104,13 @@
 
   test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 expect(arg) { }
 void baz() { }''');
     addTestSource('''
-import 'libA.dart'
+import 'a.dart';
 class B { }
 String bar() => true;
 void main() {expect(^)}''');
@@ -135,14 +135,14 @@
 
   test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import 'libA.dart';
+import 'a.dart';
 class B { }
 String bar() => true;
 void main() {new A(^)}''');
@@ -168,7 +168,7 @@
 
   test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 typedef Funct();
 class A { A(Funct f) { } }
@@ -176,7 +176,7 @@
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import 'libA.dart';
+import 'a.dart';
 class B { }
 String bar() => true;
 void main() {new A(^)}''');
@@ -202,12 +202,12 @@
 
   test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
-import 'libA.dart'
+import 'a.dart';
 expect(arg) { }
 class B { }
 String bar() => true;
@@ -233,12 +233,12 @@
 
   test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
-import 'libA.dart'
+import 'a.dart';
 class B {
   expect(arg) { }
   void foo() {expect(^)}}
@@ -264,14 +264,14 @@
 
   test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import 'libA.dart';
+import 'a.dart';
 class B { }
 String bar(f()) => true;
 void main() {bar(^);}''');
@@ -297,14 +297,14 @@
 
   test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import 'libA.dart';
+import 'a.dart';
 class B { String bar(f()) => true; }
 void main() {new B().bar(^);}''');
     await computeSuggestions();
@@ -329,11 +329,11 @@
   test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }''');
     addTestSource('''
-import 'libA.dart'
+import 'a.dart';
 String bar() => true;
 void main() {expect(foo: ^)}''');
     await computeSuggestions();
@@ -1037,14 +1037,14 @@
 
   test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
 class E extends F { var e1; e2() { } }
 class I { int i1; i2() { } }
 class M { var m1; int m2() { } }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A extends E implements I with M {a() {^}}''');
     await computeSuggestions();
 
@@ -1142,27 +1142,24 @@
   }
 
   test_Block_unimported() async {
-    addPackageSource('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
-    addSource(
-        '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
-    testFile = '/proj/completionTest.dart';
-    addTestSource('class C {foo(){F^}}');
-    await computeSuggestions();
+    addPackageFile('aaa', 'a.dart', 'class A {}');
+    addTestSource('main() { ^ }');
 
-    expect(replacementOffset, completionOffset - 1);
-    expect(replacementLength, 1);
-    assertNotSuggested('Foo');
-    // TODO(danrubel) implement
-    assertNotSuggested('Foo2');
+    await computeSuggestions();
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+
+    // Not imported, so not suggested
+    assertNotSuggested('A');
     assertNotSuggested('Future');
   }
 
   test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A {var b; X _c;}
 class X{}
 // looks like a cascade to the parser
@@ -1184,10 +1181,10 @@
 
   test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A {var b; X _c;}
 class X{}
 main() {A a; a..^z}''');
@@ -1207,10 +1204,10 @@
 
   test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A {var b; X _c;}
 class X{}
 main() {A a; a..^ return}''');
@@ -1307,10 +1304,10 @@
 
   test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 @deprecated class A {^}
 class _B {}
 A T;''');
@@ -1328,10 +1325,10 @@
 
   test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^}
 class _B {}
 A T;''');
@@ -1349,10 +1346,10 @@
 
   test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ A(){}}
 class _B {}
 A T;''');
@@ -1370,10 +1367,10 @@
 
   test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as Soo;
+import "b.dart" as Soo;
 class A {final S^ A();}
 class _B {}
 A Sew;''');
@@ -1391,10 +1388,10 @@
 
   test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ final foo;}
 class _B {}
 A T;''');
@@ -1412,10 +1409,10 @@
 
   test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ var foo;}
 class _B {}
 A T;''');
@@ -1483,12 +1480,12 @@
 
   test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1503,12 +1500,12 @@
 
   test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1533,12 +1530,12 @@
 
   test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1553,12 +1550,12 @@
 
   test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1583,12 +1580,12 @@
 
   test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1639,13 +1636,13 @@
   test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int T1;
 F1() { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 var m;
 main() {new X.^}''');
     await computeSuggestions();
@@ -1664,13 +1661,13 @@
   test_ConstructorName_importedFactory() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int T1;
 F1() { }
 class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 var m;
 main() {new X.^}''');
     await computeSuggestions();
@@ -1786,12 +1783,12 @@
 
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 _B F1() { }
 class A {int x;}
 class _B { }''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 typedef int F2(int blat);
 class Clz = Object with Object;
 class C {foo(){^} void bar() {}}''');
@@ -1816,11 +1813,11 @@
 
   test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {a() {C ^}}''');
     await computeSuggestions();
 
@@ -1830,9 +1827,9 @@
   test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {A ^}''');
     await computeSuggestions();
 
@@ -1842,9 +1839,9 @@
   test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {var ^}''');
     await computeSuggestions();
 
@@ -2074,13 +2071,13 @@
 
   test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2104,13 +2101,13 @@
 
   test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2134,13 +2131,13 @@
 
   test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2301,12 +2298,12 @@
 
   test_IndexExpression() async {
     // ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -2331,12 +2328,12 @@
 
   test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -2465,12 +2462,12 @@
 
   test_InstanceCreationExpression_imported() async {
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {A(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 import "dart:async";
 int T2;
 F2() { }
@@ -2584,13 +2581,13 @@
 
   test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2618,13 +2615,13 @@
 
   test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2694,12 +2691,12 @@
 
   test_IsExpression() async {
     // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 foo() { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class Y {Y.c(); Y._d(); z() {}}
 main() {var x; if (x is ^) { }}''');
     await computeSuggestions();
@@ -2767,14 +2764,14 @@
   }
 
   test_keyword() async {
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int newT1;
 int T1;
 nowIsIt() { }
 class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 String newer() {}
 var m;
 main() {new^ X.c();}''');
@@ -2829,13 +2826,13 @@
 
   test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2862,13 +2859,13 @@
 
   test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2884,13 +2881,13 @@
 
   test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3080,13 +3077,13 @@
 
   test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3109,13 +3106,13 @@
 
   test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3138,13 +3135,13 @@
 
   test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3167,13 +3164,13 @@
 
   test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3275,14 +3272,14 @@
 
   test_partFile_TypeName() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int T1;
 F1() { }
 class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library libA;
-import "testB.dart";
+import "b.dart";
 part "${resourceProvider.pathContext.basename(testFile)}";
 class A { }
 var m;''');
@@ -3290,7 +3287,6 @@
 part of libA;
 class B { factory B.bar(int x) => null; }
 main() {new ^}''');
-    await computeLibrariesContaining();
     await computeSuggestions();
 
     expect(replacementOffset, completionOffset);
@@ -3309,18 +3305,18 @@
 
   test_partFile_TypeName2() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int T1;
 F1() { }
 class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 part of libA;
 class B { }''');
     addTestSource('''
 library libA;
-import "testB.dart";
-part "testA.dart";
+import "b.dart";
+part "a.dart";
 class A { A({String boo: 'hoo'}) { } }
 main() {new ^}
 var m;''');
@@ -3342,7 +3338,7 @@
 
   test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 class I {
   static const scI = 'boo';
@@ -3356,7 +3352,7 @@
   m(X x) {} I _n(X x) {}}
 class X{}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class A extends B {
   static const String scA = 'foo';
   w() { }}
@@ -3389,7 +3385,7 @@
 
   test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 class I {X get f => new A();get _g => new A();}
 class A implements I {
@@ -3400,7 +3396,7 @@
   m(X x) {} I _n(X x) {}}
 class X{}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 main() {A a; a.^}''');
     await computeSuggestions();
 
@@ -3468,13 +3464,13 @@
 
   test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 var T1;
 class X { }
 class Y { }''');
     addTestSource('''
-import "testB.dart" as b;
+import "b.dart" as b;
 var T2;
 class A { }
 main() {b.^}''');
@@ -3495,13 +3491,13 @@
 
   test_PrefixedIdentifier_library_typesOnly() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 var T1;
 class X { }
 class Y { }''');
     addTestSource('''
-import "testB.dart" as b;
+import "b.dart" as b;
 var T2;
 class A { }
 foo(b.^ f) {}''');
@@ -3522,13 +3518,13 @@
 
   test_PrefixedIdentifier_library_typesOnly2() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 var T1;
 class X { }
 class Y { }''');
     addTestSource('''
-import "testB.dart" as b;
+import "b.dart" as b;
 var T2;
 class A { }
 foo(b.^) {}''');
@@ -3549,13 +3545,13 @@
 
   test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 class _W {M y; var _z;}
 class X extends _W {}
 class M{}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 foo(X x) {x.^}''');
     await computeSuggestions();
 
@@ -3568,11 +3564,11 @@
 
   test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {static int bar = 10;}
 _B() {}''');
     addTestSource('''
-import "testA.dart";
+import "a.dart";
 class X {foo(){A^.bar}}''');
     await computeSuggestions();
 
@@ -4044,12 +4040,12 @@
 
   test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class C1 {int x;}
 F1() => 0;
 typedef String T1(int blat);''');
     addTestSource('''
-import "testA.dart";'
+import "a.dart";'
 class C2 {int x;}
 F2() => 0;
 typedef int T2(int blat);
@@ -4070,12 +4066,12 @@
 
   test_TypeArgumentList2() async {
     // TypeName  TypeArgumentList  TypeName
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class C1 {int x;}
 F1() => 0;
 typedef String T1(int blat);''');
     addTestSource('''
-import "testA.dart";'
+import "a.dart";'
 class C2 {int x;}
 F2() => 0;
 typedef int T2(int blat);
@@ -4092,13 +4088,13 @@
   test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 foo() { }
 class _B { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class Y {Y.c(); Y._d(); z() {}}
 main() {var ^}''');
     await computeSuggestions();
@@ -4119,13 +4115,13 @@
   test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 foo() { }
 class _B { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 class Y {Y.c(); Y._d(); z() {}}
 class C {bar(){var f; {var x;} var e = ^}}''');
     await computeSuggestions();
@@ -4148,14 +4144,14 @@
   test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 foo1() { }
 void bar1() { }
 class _B { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "testB.dart";
+import "b.dart";
 foo2() { }
 void bar2() { }
 class Y {Y.c(); Y._d(); z() {}}
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index 07d9364..8e5f942 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -24,22 +24,21 @@
 
   test_partFile_Constructor() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library libA;
-        import "${convertAbsolutePathToUri("/testB.dart")}";
-        part "${convertAbsolutePathToUri(testFile)}";
+        import "b.dart";
+        part "test.dart";
         class A { }
         var m;''');
     addTestSource('''
         part of libA;
         class B { factory B.bar(int x) => null; }
         main() {new ^}''');
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -59,22 +58,21 @@
 
   test_partFile_Constructor2() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         part of libA;
         class B { }''');
     addTestSource('''
         library libA;
-        import "${convertAbsolutePathToUri("/testB.dart")}";
-        part "${convertAbsolutePathToUri("/testA.dart")}";
+        import "b.dart";
+        part "a.dart";
         class A { A({String boo: 'hoo'}) { } }
         main() {new ^}
         var m;''');
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -94,19 +92,19 @@
 
   test_partFile_InstanceCreationExpression_assignment_filter() async {
     // ConstructorName  InstanceCreationExpression  VariableDeclarationList
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         part of libA;
         class A {} class B extends A {} class C implements A {} class D {}
         ''');
     addTestSource('''
         library libA;
-        import "${convertAbsolutePathToUri("/testB.dart")}";
-        part "${convertAbsolutePathToUri("/testA.dart")}";
+        import "b.dart";
+        part "a.dart";
         class Local { }
         main() {
           A a;
@@ -114,7 +112,6 @@
           a = new ^
         }
         var m;''');
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -147,25 +144,24 @@
 
   test_partFile_InstanceCreationExpression_variable_declaration_filter() async {
     // ConstructorName  InstanceCreationExpression  VariableDeclarationList
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         part of libA;
         class A {} class B extends A {} class C implements A {} class D {}
         ''');
     addTestSource('''
         library libA;
-        import "${convertAbsolutePathToUri("/testB.dart")}";
-        part "${convertAbsolutePathToUri("/testA.dart")}";
+        import "b.dart";
+        part "a.dart";
         class Local { }
         main() {
           A a = new ^
         }
         var m;''');
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -197,15 +193,15 @@
   }
 
   test_partFile_TypeName() async {
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library libA;
-        import "${convertAbsolutePathToUri("/testB.dart")}";
-        part "${convertAbsolutePathToUri(testFile)}";
+        import "b.dart";
+        part "test.dart";
         class A { var a1; a2(){}}
         var m;
         typedef t1(int blue);
@@ -214,7 +210,6 @@
         part of libA;
         class B { factory B.bar(int x) => null; }
         main() {^}''');
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
@@ -243,12 +238,12 @@
   }
 
   test_partFile_TypeName2() async {
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         part of libA;
         class B { var b1; b2(){}}
         int bf() => 0;
@@ -256,12 +251,11 @@
         var n;''');
     addTestSource('''
         library libA;
-        import "${convertAbsolutePathToUri("/testB.dart")}";
-        part "${convertAbsolutePathToUri("/testA.dart")}";
+        import "b.dart";
+        part "a.dart";
         class A { A({String boo: 'hoo'}) { } }
         main() {^}
         var m;''');
-    await computeLibrariesContaining();
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index e96883c..ffa3f3a 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -87,7 +87,7 @@
   }
 
   test_ArgDefaults_function_with_optional_positional() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -102,7 +102,7 @@
   }
 
   test_ArgDefaults_function_with_required_named() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -117,7 +117,7 @@
   }
 
   test_ArgDefaults_method_with_required_named() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -137,12 +137,12 @@
 
   test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 class B { }
 String bar() => true;
 void main() {expect(^)}''');
@@ -164,13 +164,13 @@
 
   test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 expect(arg) { }
 void baz() { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}"
+import 'a.dart';
 class B { }
 String bar() => true;
 void main() {expect(^)}''');
@@ -192,14 +192,14 @@
 
   test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 class B { }
 String bar() => true;
 void main() {new A(^)}''');
@@ -223,7 +223,7 @@
 
   test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 typedef Funct();
 class A { A(Funct f) { } }
@@ -231,7 +231,7 @@
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 class B { }
 String bar() => true;
 void main() {new A(^)}''');
@@ -255,12 +255,12 @@
 
   test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}"
+import 'a.dart';
 expect(arg) { }
 class B { }
 String bar() => true;
@@ -283,12 +283,12 @@
 
   test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}"
+import 'a.dart';
 class B {
   expect(arg) { }
   void foo() {expect(^)}}
@@ -311,14 +311,14 @@
 
   test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 class B { }
 String bar(f()) => true;
 void main() {boo(){} bar(^);}''');
@@ -345,14 +345,14 @@
 
   test_ArgumentList_MethodInvocation_functionalArg2() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 class B { }
 String bar({inc()}) => true;
 void main() {boo(){} bar(inc: ^);}''');
@@ -381,14 +381,14 @@
 
   test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 class A { A(f()) { } }
 bool hasLength(int expected) { }
 void baz() { }''');
     addTestSource('''
 import 'dart:async';
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 class B { String bar(f()) => true; }
 void main() {new B().bar(^);}''');
     await computeSuggestions();
@@ -407,7 +407,7 @@
   }
 
   test_ArgumentList_namedFieldParam_tear_off() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 typedef void VoidCallback();
         
 class Button {
@@ -416,7 +416,7 @@
 }
 ''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 
 class PageState {
   void _incrementCounter() { }
@@ -438,11 +438,11 @@
   test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library A;
 bool hasLength(int expected) { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}"
+import 'a.dart';
 String bar() => true;
 void main() {expect(foo: ^)}''');
     await computeSuggestions();
@@ -493,7 +493,7 @@
   }
 
   test_ArgumentList_namedParam_tear_off() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 typedef void VoidCallback();
         
 class Button {
@@ -501,7 +501,7 @@
 }
 ''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 
 class PageState {
   void _incrementCounter() { }
@@ -521,7 +521,7 @@
   }
 
   test_ArgumentList_namedParam_tear_off_1() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 typedef void VoidCallback();
         
 class Button {
@@ -529,7 +529,7 @@
 }
 ''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 
 class PageState {
   void _incrementCounter() { }
@@ -549,7 +549,7 @@
   }
 
   test_ArgumentList_namedParam_tear_off_2() async {
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 typedef void VoidCallback();
         
 class Button {
@@ -557,7 +557,7 @@
 }
 ''');
     addTestSource('''
-import "${convertAbsolutePathToUri('/libA.dart')}";
+import 'a.dart';;
 
 class PageState {
   void _incrementCounter() { }
@@ -783,7 +783,7 @@
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
     expect(replacementLength, 0);
-    assertSuggestMethod('y', 'A', 'Future',
+    assertSuggestMethod('y', 'A', 'Future<dynamic>',
         relevance: DART_RELEVANCE_LOCAL_METHOD);
     assertSuggestClass('A');
     assertNotSuggested('Object');
@@ -822,29 +822,29 @@
 
   test_Block() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
     addTestSource('''
-import "${convertAbsolutePathToUri("/testAB.dart")}";
-import "${convertAbsolutePathToUri("/testCD.dart")}" hide D;
-import "${convertAbsolutePathToUri("/testEEF.dart")}" show EE;
-import "${convertAbsolutePathToUri("/testG.dart")}" as g;
+import "ab.dart";
+import "cd.dart" hide D;
+import "eef.dart" show EE;
+import "g.dart" as g;
 int T5;
 var _T6;
 String get T7 => 'hello';
@@ -920,29 +920,29 @@
 
   test_Block_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
     addTestSource('''
-import "${convertAbsolutePathToUri("/testAB.dart")}";
-import "${convertAbsolutePathToUri("/testCD.dart")}" hide D;
-import "${convertAbsolutePathToUri("/testEEF.dart")}" show EE;
-import "${convertAbsolutePathToUri("/testG.dart")}" as g;
+import "ab.dart";
+import "cd.dart" hide D;
+import "eef.dart" show EE;
+import "g.dart" as g;
 int T5;
 var _T6;
 String get T7 => 'hello';
@@ -1033,29 +1033,29 @@
 
   test_Block_final_final() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
     addTestSource('''
-import "${convertAbsolutePathToUri("/testAB.dart")}";
-import "${convertAbsolutePathToUri("/testCD.dart")}" hide D;
-import "${convertAbsolutePathToUri("/testEEF.dart")}" show EE;
-import "${convertAbsolutePathToUri("/testG.dart")}" as g;
+import "ab.dart";
+import "cd.dart" hide D;
+import "eef.dart" show EE;
+import "g.dart" as g;
 int T5;
 var _T6;
 String get T7 => 'hello';
@@ -1132,29 +1132,29 @@
 
   test_Block_final_var() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
     addTestSource('''
-import "${convertAbsolutePathToUri("/testAB.dart")}";
-import "${convertAbsolutePathToUri("/testCD.dart")}" hide D;
-import "${convertAbsolutePathToUri("/testEEF.dart")}" show EE;
-import "${convertAbsolutePathToUri("/testG.dart")}" as g;
+import "ab.dart";
+import "cd.dart" hide D;
+import "eef.dart" show EE;
+import "g.dart" as g;
 int T5;
 var _T6;
 String get T7 => 'hello';
@@ -1230,30 +1230,30 @@
   }
 
   test_Block_identifier_partial() async {
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
 class H { }
 class D3 { }
 int T3;
 var _T4;'''); // not imported
     addTestSource('''
-import "${convertAbsolutePathToUri("/testAB.dart")}";
-import "${convertAbsolutePathToUri("/testCD.dart")}" hide D;
-import "${convertAbsolutePathToUri("/testEEF.dart")}" show EE;
-import "${convertAbsolutePathToUri("/testG.dart")}" as g;
+import "ab.dart";
+import "cd.dart" hide D;
+import "eef.dart" show EE;
+import "g.dart" as g;
 int T5;
 var _T6;
 Z D2() {int x;}
@@ -1310,14 +1310,14 @@
 
   test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib B;
 class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
 class E extends F { var e1; e2() { } }
 class I { int i1; i2() { } }
 class M { var m1; int m2() { } }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 class A extends E implements I with M {a() {^}}''');
     await computeSuggestions();
 
@@ -1364,29 +1364,29 @@
   }
 
   test_Block_local_function() async {
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 export "dart:math" hide max;
 class A {int x;}
 @deprecated D1() {int x;}
 class _B {boo() { partBoo() {}} }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 String T1;
 var _T2;
 class C { }
 class D { }''');
-    addSource('/testEEF.dart', '''
+    addSource('/home/test/lib/eef.dart', '''
 class EE { }
 class F { }''');
-    addSource('/testG.dart', 'class G { }');
-    addSource('/testH.dart', '''
+    addSource('/home/test/lib/g.dart', 'class G { }');
+    addSource('/home/test/lib/h.dart', '''
 class H { }
 int T3;
 var _T4;'''); // not imported
     addTestSource('''
-import "${convertAbsolutePathToUri("/testAB.dart")}";
-import "${convertAbsolutePathToUri("/testCD.dart")}" hide D;
-import "${convertAbsolutePathToUri("/testEEF.dart")}" show EE;
-import "${convertAbsolutePathToUri("/testG.dart")}" as g;
+import "ab.dart";
+import "cd.dart" hide D;
+import "eef.dart" show EE;
+import "g.dart" as g;
 int T5;
 var _T6;
 String get T7 => 'hello';
@@ -1415,27 +1415,24 @@
   }
 
   test_Block_unimported() async {
-    addPackageSource('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
-    addSource(
-        '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
-    testFile = '/proj/completionTest.dart';
-    addTestSource('class C {foo(){F^}}');
-    await computeSuggestions();
+    addPackageFile('aaa', 'a.dart', 'class A {}');
+    addTestSource('main() { ^ }');
 
-    expect(replacementOffset, completionOffset - 1);
-    expect(replacementLength, 1);
-    assertNotSuggested('Foo');
-    // TODO(danrubel) implement
-    assertNotSuggested('Foo2');
+    await computeSuggestions();
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+
+    // Not imported, so not suggested
+    assertNotSuggested('A');
     assertNotSuggested('Future');
   }
 
   test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 class A {var b; X _c;}
 class X{}
 // looks like a cascade to the parser
@@ -1457,10 +1454,10 @@
 
   test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 class A {var b; X _c;}
 class X{}
 main() {A a; a..^z}''');
@@ -1480,10 +1477,10 @@
 
   test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 class A {var b; X _c;}
 class X{}
 main() {A a; a..^ return}''');
@@ -1575,10 +1572,10 @@
 
   test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 @deprecated class A {^}
 class _B {}
 A T;''');
@@ -1605,10 +1602,10 @@
 
   test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^}
 class _B {}
 A T;''');
@@ -1626,10 +1623,10 @@
 
   test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ A(){}}
 class _B {}
 A T;''');
@@ -1647,10 +1644,10 @@
 
   test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as Soo;
+import "b.dart" as Soo;
 class A {final S^ A();}
 class _B {}
 A Sew;''');
@@ -1668,10 +1665,10 @@
 
   test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ final foo;}
 class _B {}
 A T;''');
@@ -1689,10 +1686,10 @@
 
   test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 class B { }''');
     addTestSource('''
-import "testB.dart" as x;
+import "b.dart" as x;
 class A {final ^ var foo;}
 class _B {}
 A T;''');
@@ -1710,7 +1707,7 @@
 
   test_Combinator_hide() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 library libAB;
 part 'partAB.dart';
 class A { }
@@ -1720,12 +1717,12 @@
 var T1;
 PB F1() => new PB();
 class PB { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 class C { }
 class D { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testAB.dart")}" hide ^;
-import "${convertAbsolutePathToUri("/testCD.dart")}";
+import "ab.dart" hide ^;
+import "cd.dart";
 class X {}''');
     await computeSuggestions();
 
@@ -1734,7 +1731,7 @@
 
   test_Combinator_show() async {
     // SimpleIdentifier  HideCombinator  ImportDirective
-    addSource('/testAB.dart', '''
+    addSource('/home/test/lib/ab.dart', '''
 library libAB;
 part 'partAB.dart';
 class A { }
@@ -1746,12 +1743,12 @@
 typedef PB2 F2(int blat);
 class Clz = Object with Object;
 class PB { }''');
-    addSource('/testCD.dart', '''
+    addSource('/home/test/lib/cd.dart', '''
 class C { }
 class D { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testAB.dart")}" show ^;
-import "${convertAbsolutePathToUri("/testCD.dart")}";
+import "ab.dart" show ^;
+import "cd.dart";
 class X {}''');
     await computeSuggestions();
 
@@ -1760,12 +1757,12 @@
 
   test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1781,12 +1778,12 @@
 
   test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1809,12 +1806,12 @@
 
   test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1830,12 +1827,12 @@
 
   test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1858,12 +1855,12 @@
 
   test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -1912,16 +1909,50 @@
     assertSuggestParameter('y', 'int');
   }
 
+  test_ConstructorFieldInitializer_name() async {
+    addTestSource('''
+class A {
+  final int foo;
+  A() : ^
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestField('foo', 'int', relevance: DART_RELEVANCE_LOCAL_FIELD);
+  }
+
+  test_ConstructorFieldInitializer_value() async {
+    addTestSource('''
+var foo = 0;
+
+class A {
+  final int bar;
+  A() : bar = ^
+}
+''');
+    await computeSuggestions();
+
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+    assertSuggestTopLevelVar(
+      'foo',
+      'int',
+      relevance: DART_RELEVANCE_LOCAL_TOP_LEVEL_VARIABLE,
+    );
+  }
+
   test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int T1;
 F1() { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 var m;
 main() {new X.^}''');
     await computeSuggestions();
@@ -1940,13 +1971,13 @@
   test_ConstructorName_importedFactory() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int T1;
 F1() { }
 class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 var m;
 main() {new X.^}''');
     await computeSuggestions();
@@ -2271,12 +2302,12 @@
 
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 _B F1() { }
 class A {int x;}
 class _B { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 typedef int F2(int blat);
 class Clz = Object with Object;
 class C {foo(){^} void bar() {}}''');
@@ -2300,11 +2331,11 @@
 
   test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testA.dart")}";
+        import "a.dart";
         class C {a() {C ^}}''');
     await computeSuggestions();
 
@@ -2314,9 +2345,9 @@
   test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testA.dart")}";
+        import "a.dart";
         class C {A ^}''');
     await computeSuggestions();
 
@@ -2326,9 +2357,9 @@
   test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testA.dart")}";
+        import "a.dart";
         class C {var ^}''');
     await computeSuggestions();
 
@@ -2637,13 +2668,13 @@
 
   test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2667,13 +2698,13 @@
 
   test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2697,13 +2728,13 @@
 
   test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -2747,6 +2778,28 @@
     assertNotSuggested('Object');
   }
 
+  test_functionTypeAlias_genericTypeAlias() async {
+    addTestSource(r'''
+typedef F = void Function();
+main() {
+  ^
+}
+''');
+    await computeSuggestions();
+    assertSuggestFunctionTypeAlias('F', 'void');
+  }
+
+  test_functionTypeAlias_old() async {
+    addTestSource(r'''
+typedef void F();
+main() {
+  ^
+}
+''');
+    await computeSuggestions();
+    assertSuggestFunctionTypeAlias('F', 'void');
+  }
+
   test_IfStatement() async {
     // SimpleIdentifier  IfStatement
     addTestSource('''
@@ -2861,12 +2914,12 @@
 
   test_IndexExpression() async {
     // ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -2889,12 +2942,12 @@
 
   test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 class B {int x;}
@@ -2927,12 +2980,12 @@
 
   test_InstanceCreationExpression_imported() async {
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 class A {A(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 import "dart:async";
 int T2;
 F2() { }
@@ -2959,7 +3012,7 @@
 
   test_InstanceCreationExpression_unimported() async {
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/testAB.dart', 'class Foo { }');
+    addSource('/home/test/lib/ab.dart', 'class Foo { }');
     addTestSource('class C {foo(){new F^}}');
     await computeSuggestions();
 
@@ -2971,13 +3024,13 @@
 
   test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3002,13 +3055,13 @@
 
   test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3075,12 +3128,12 @@
 
   test_IsExpression() async {
     // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 foo() { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 class Y {Y.c(); Y._d(); z() {}}
 main() {var x; if (x is ^) { }}''');
     await computeSuggestions();
@@ -3190,14 +3243,14 @@
   }
 
   test_keyword() async {
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int newT1;
 int T1;
 nowIsIt() { }
 class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 String newer() {}
 var m;
 main() {new^ X.c();}''');
@@ -3254,13 +3307,13 @@
 
   test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3284,13 +3337,13 @@
 
   test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3307,13 +3360,13 @@
 
   test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3435,14 +3488,14 @@
 
   test_MethodDeclaration_body_static() async {
     // Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testC.dart', '''
+    addSource('/home/test/lib/c.dart', '''
 class C {
   c1() {}
   var c2;
   static c3() {}
   static var c4;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testC.dart")}";
+import "c.dart";
 class B extends C {
   b1() {}
   var b2;
@@ -3576,13 +3629,13 @@
 
   test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3605,13 +3658,13 @@
 
   test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3634,13 +3687,13 @@
 
   test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3663,13 +3716,13 @@
 
   test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 int T1;
 F1() { }
 typedef D1();
 class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 int T2;
 F2() { }
 typedef D2();
@@ -3771,14 +3824,14 @@
 
   test_partFile_TypeName() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int T1;
 F1() { }
 class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 library libA;
-import "testB.dart";
+import "b.dart";
 part "${resourceProvider.pathContext.basename(testFile)}";
 class A { }
 var m;''');
@@ -3805,22 +3858,21 @@
 
   test_partFile_TypeName2() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 int T1;
 F1() { }
 class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 part of libA;
 class B { }''');
     addTestSource('''
 library libA;
-import "testB.dart";
-part "testA.dart";
+import "b.dart";
+part "a.dart";
 class A { A({String boo: 'hoo'}) { } }
 main() {new ^}
 var m;''');
-    await computeLibrariesContaining();
     await computeSuggestions();
 
     expect(replacementOffset, completionOffset);
@@ -3840,7 +3892,7 @@
 
   test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 class I {
   static const scI = 'boo';
@@ -3854,7 +3906,7 @@
   m(X x) {} I _n(X x) {}}
 class X{}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 class A extends B {
   static const String scA = 'foo';
   w() { }}
@@ -3887,7 +3939,7 @@
 
   test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 class I {X get f => new A();get _g => new A();}
 class A implements I {
@@ -3898,7 +3950,7 @@
   m(X x) {} I _n(X x) {}}
 class X{}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 main() {A a; a.^}''');
     await computeSuggestions();
 
@@ -3966,13 +4018,13 @@
 
   test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 var T1;
 class X { }
 class Y { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}" as b;
+import "b.dart" as b;
 var T2;
 class A { }
 main() {b.^}''');
@@ -3993,13 +4045,13 @@
 
   test_PrefixedIdentifier_library_typesOnly() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 var T1;
 class X { }
 class Y { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}" as b;
+import "b.dart" as b;
 var T2;
 class A { }
 foo(b.^ f) {}''');
@@ -4020,13 +4072,13 @@
 
   test_PrefixedIdentifier_library_typesOnly2() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 var T1;
 class X { }
 class Y { }''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}" as b;
+import "b.dart" as b;
 var T2;
 class A { }
 foo(b.^) {}''');
@@ -4047,13 +4099,13 @@
 
   test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 class _W {M y; var _z;}
 class X extends _W {}
 class M{}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 foo(X x) {x.^}''');
     await computeSuggestions();
 
@@ -4066,11 +4118,11 @@
 
   test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {static int bar = 10;}
 _B() {}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";
+import "a.dart";
 class X {foo(){A^.bar}}''');
     await computeSuggestions();
 
@@ -4231,7 +4283,7 @@
 
   test_PropertyAccess_noTarget() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/testAB.dart', 'class Foo { }');
+    addSource('/home/test/lib/ab.dart', 'class Foo { }');
     addTestSource('class C {foo(){.^}}');
     await computeSuggestions();
 
@@ -4240,7 +4292,7 @@
 
   test_PropertyAccess_noTarget2() async {
     // SimpleIdentifier  PropertyAccess  ExpressionStatement
-    addSource('/testAB.dart', 'class Foo { }');
+    addSource('/home/test/lib/ab.dart', 'class Foo { }');
     addTestSource('main() {.^}');
     await computeSuggestions();
 
@@ -4549,12 +4601,12 @@
 
   test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class C1 {int x;}
 F1() => 0;
 typedef String T1(int blat);''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";'
+import "a.dart";'
 class C2 {int x;}
 F2() => 0;
 typedef int T2(int blat);
@@ -4575,12 +4627,12 @@
 
   test_TypeArgumentList2() async {
     // TypeName  TypeArgumentList  TypeName
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class C1 {int x;}
 F1() => 0;
 typedef String T1(int blat);''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testA.dart")}";'
+import "a.dart";'
 class C2 {int x;}
 F2() => 0;
 typedef int T2(int blat);
@@ -4597,13 +4649,13 @@
   test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 foo() { }
 class _B { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 class Y {Y.c(); Y._d(); z() {}}
 main() {var ^}''');
     await computeSuggestions();
@@ -4624,13 +4676,13 @@
   test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 foo() { }
 class _B { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 class Y {Y.c(); Y._d(); z() {}}
 class C {bar(){var f; {var x;} var e = ^}}''');
     await computeSuggestions();
@@ -4649,14 +4701,14 @@
   test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
 lib B;
 foo1() { }
 void bar1() { }
 class _B { }
 class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-import "${convertAbsolutePathToUri("/testB.dart")}";
+import "b.dart";
 foo2() { }
 void bar2() { }
 class Y {Y.c(); Y._d(); z() {}}
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index ea0d067..579a063 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -45,13 +45,13 @@
   test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testB.dart")}";
+        import 'b.dart';
         var m;
         main() {new X.^}''');
 
@@ -69,13 +69,13 @@
   test_ConstructorName_importedClass_unresolved() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testB.dart")}";
+        import 'b.dart';
         var m;
         main() {new X.^}''');
     // Assume that imported libraries are NOT resolved
@@ -94,13 +94,13 @@
   test_ConstructorName_importedFactory() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-        import "${convertAbsolutePathToUri("/testB.dart")}";
+        import 'b.dart';
         var m;
         main() {new X.^}''');
 
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index 8d5a329..49a5e34 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -93,16 +93,16 @@
   }
 
   test_fromPart() async {
-    addSource('/myLib.dart', '''
+    addSource('/home/test/lib/myLib.dart', '''
 library myLib;
-part '${convertAbsolutePathToUri(testFile)}'
-part '${convertAbsolutePathToUri('/otherPart.dart')}'
+part 'test.dart';
+part 'otherPart.dart';
 class A {
   A suggested1(int x) => null;
   B suggested2(String y) => null;
 }
 ''');
-    addSource('/otherPart.dart', '''
+    addSource('/home/test/lib/otherPart.dart', '''
 part of myLib;
 class B extends A {
   B suggested2(String y) => null;
@@ -116,7 +116,6 @@
 }
 ''');
     // assume information for context.getLibrariesContaining has been cached
-    await computeLibrariesContaining();
     await computeSuggestions();
     _assertOverride('''
 @override
@@ -176,6 +175,62 @@
         selectionLength: 22);
   }
 
+  test_private_otherLibrary() async {
+    addSource('/home/test/lib/a.dart', '''
+class A {
+  void foo() {}
+  void _bar() {}
+}
+''');
+    addTestSource(r'''
+import 'a.dart';
+
+class B extends A {
+  f^
+}
+''');
+    await computeSuggestions();
+
+    _assertOverride('''
+@override
+  void foo() {
+    // TODO: implement foo
+    super.foo();
+  }''', displayText: 'foo() { … }', selectionOffset: 56, selectionLength: 12);
+
+    expect(suggestions, _notSuggestedPredicate((suggestion) {
+      return suggestion.completion.contains('void _bar()');
+    }));
+  }
+
+  test_private_thisLibrary() async {
+    addTestSource(r'''
+class A {
+  void foo() {}
+  void _bar() {}
+}
+
+class B extends A {
+  f^
+}
+''');
+    await computeSuggestions();
+
+    _assertOverride('''
+@override
+  void foo() {
+    // TODO: implement foo
+    super.foo();
+  }''', displayText: 'foo() { … }', selectionOffset: 56, selectionLength: 12);
+
+    _assertOverride('''
+@override
+  void _bar() {
+    // TODO: implement _bar
+    super._bar();
+  }''', displayText: '_bar() { … }', selectionOffset: 58, selectionLength: 13);
+  }
+
   test_withExistingOverride() async {
     addTestSource('''
 class A {
@@ -245,4 +300,8 @@
     expect(cs.displayText, displayText);
     return cs;
   }
+
+  static Matcher _notSuggestedPredicate(bool Function(CompletionSuggestion) f) {
+    return isNot(contains(predicate(f)));
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 2987710..1d3e804 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -98,8 +98,7 @@
   }
 
   test_implicitCreation() async {
-    configurePreviewDart2();
-    addSource('/a.dart', '''
+    addSource('/home/test/lib/a.dart', '''
 class A {
   A.foo();
   A.bar();
@@ -257,12 +256,12 @@
 import "dart:async" as async;
 void main() {async.Future.^.w()}''');
     await computeSuggestions();
-    assertSuggestMethod('wait', 'Future', 'Future<dynamic>');
+    assertSuggestMethod('wait', 'Future', 'Future<List<T>>');
   }
 
   test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -276,7 +275,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     addTestSource('''
-        import "/testB.dart";
+        import "b.dart";
         class A extends B {
           static const String scA = 'foo';
           w() { }}
diff --git a/pkg/analysis_server/test/services/completion/dart/test_all.dart b/pkg/analysis_server/test/services/completion/dart/test_all.dart
index 72c87931..1298dca 100644
--- a/pkg/analysis_server/test/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index a39270d..5fd129a 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -81,7 +81,7 @@
   }
 
   test_ArgDefaults_method_with_optional_positional() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -96,7 +96,7 @@
   }
 
   test_ArgDefaults_method_with_required_named() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -113,12 +113,12 @@
 
   test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import 'libA.dart';
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {expect(^)}''');
@@ -138,13 +138,13 @@
 
   test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         expect(arg) { }
         void baz() { }''');
     addTestSource('''
-        import 'libA.dart'
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {expect(^)}''');
@@ -164,14 +164,14 @@
 
   test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import 'libA.dart';
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {new A(^)}''');
@@ -192,7 +192,7 @@
 
   test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         typedef Funct();
         class A { A(Funct f) { } }
@@ -200,7 +200,7 @@
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import 'libA.dart';
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {new A(^)}''');
@@ -221,12 +221,12 @@
 
   test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import 'libA.dart'
+        import 'a.dart';
         expect(arg) { }
         class B { }
         String bar() => true;
@@ -247,12 +247,12 @@
 
   test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import 'libA.dart'
+        import 'a.dart';
         class B {
           expect(arg) { }
           void foo() {expect(^)}}
@@ -273,14 +273,14 @@
 
   test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import 'libA.dart';
+        import 'a.dart';
         class B { }
         String bar(f()) => true;
         void main() {bar(^);}''');
@@ -301,14 +301,14 @@
 
   test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import 'libA.dart';
+        import 'a.dart';
         class B { String bar(f()) => true; }
         void main() {new B().bar(^);}''');
     await computeSuggestions();
@@ -328,11 +328,11 @@
   test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }''');
     addTestSource('''
-        import 'libA.dart'
+        import 'a.dart';
         String bar() => true;
         void main() {expect(foo: ^)}''');
     await computeSuggestions();
@@ -983,14 +983,14 @@
 
   test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
         class E extends F { var e1; e2() { } }
         class I { int i1; i2() { } }
         class M { var m1; int m2() { } }''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class A extends E implements I with M {a() {^}}''');
     await computeSuggestions();
 
@@ -1085,26 +1085,24 @@
   }
 
   test_Block_unimported() async {
-    addPackageSource('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
-    addSource(
-        '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
-    testFile = resourceProvider.convertPath('/proj/completionTest.dart');
-    addTestSource('class C {foo(){F^}}');
+    addPackageFile('aaa', 'a.dart', 'class A {}');
+    addTestSource('main() { ^ }');
+
     await computeSuggestions();
-    expect(replacementOffset, completionOffset - 1);
-    expect(replacementLength, 1);
-    assertNotSuggested('Foo');
-    // TODO(danrubel) implement
-    assertNotSuggested('Foo2');
+    expect(replacementOffset, completionOffset);
+    expect(replacementLength, 0);
+
+    // Not imported, so not suggested
+    assertNotSuggested('A');
     assertNotSuggested('Future');
   }
 
   test_CascadeExpression_method1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class A {var b; X _c;}
         class X{}
         // looks like a cascade to the parser
@@ -1125,10 +1123,10 @@
 
   test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class A {var b; X _c;}
         class X{}
         // looks like a cascade to the parser
@@ -1149,10 +1147,10 @@
 
   test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class A {var b; X _c;}
         class X{}
         main() {A a; a..^z}''');
@@ -1171,10 +1169,10 @@
 
   test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class A {var b; X _c;}
         class X{}
         main() {A a; a..^ return}''');
@@ -1260,10 +1258,10 @@
 
   test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import "b.dart" as x;
         @deprecated class A {^}
         class _B {}
         A T;''');
@@ -1279,10 +1277,10 @@
 
   test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import "b.dart" as x;
         class A {final ^}
         class _B {}
         A T;''');
@@ -1298,10 +1296,10 @@
 
   test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import "b.dart" as x;
         class A {final ^ A(){}}
         class _B {}
         A T;''');
@@ -1317,10 +1315,10 @@
 
   test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as Soo;
+        import "b.dart" as Soo;
         class A {final S^ A();}
         class _B {}
         A Sew;''');
@@ -1336,10 +1334,10 @@
 
   test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import "b.dart" as x;
         class A {final ^ final foo;}
         class _B {}
         A T;''');
@@ -1355,10 +1353,10 @@
 
   test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import "b.dart" as x;
         class A {final ^ var foo;}
         class _B {}
         A T;''');
@@ -1422,12 +1420,12 @@
 
   test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1441,12 +1439,12 @@
 
   test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1466,12 +1464,12 @@
 
   test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1485,12 +1483,12 @@
 
   test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1510,12 +1508,12 @@
 
   test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1530,13 +1528,13 @@
   test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         var m;
         main() {new X.^}''');
     await computeSuggestions();
@@ -1554,13 +1552,13 @@
   test_ConstructorName_importedFactory() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         var m;
         main() {new X.^}''');
     await computeSuggestions();
@@ -1714,12 +1712,12 @@
 
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         _B F1() { }
         class A {int x;}
         class _B { }''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         typedef int F2(int blat);
         class Clz = Object with Object;
         class C {foo(){^} void bar() {}}''');
@@ -1740,11 +1738,11 @@
 
   test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {a() {C ^}}''');
     await computeSuggestions();
     assertNoSuggestions();
@@ -1753,9 +1751,9 @@
   test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {A ^}''');
     await computeSuggestions();
     assertNoSuggestions();
@@ -1764,9 +1762,9 @@
   test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {var ^}''');
     await computeSuggestions();
     assertNoSuggestions();
@@ -1916,13 +1914,13 @@
 
   test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -1945,13 +1943,13 @@
 
   test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -1974,13 +1972,13 @@
 
   test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2143,12 +2141,12 @@
 
   test_IndexExpression() async {
     // ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -2168,12 +2166,12 @@
 
   test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -2187,12 +2185,12 @@
 
   test_InstanceCreationExpression_imported() async {
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {A(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         import "dart:async";
         int T2;
         F2() { }
@@ -2228,13 +2226,13 @@
 
   test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2257,13 +2255,13 @@
 
   test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2323,12 +2321,12 @@
 
   test_IsExpression() async {
     // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class Y {Y.c(); Y._d(); z() {}}
         main() {var x; if (x is ^) { }}''');
     await computeSuggestions();
@@ -2395,14 +2393,14 @@
   }
 
   test_keyword2() async {
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int newT1;
         int T1;
         nowIsIt() { }
         class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         String newer() {}
         var m;
         main() {new^ X.c();}''');
@@ -2455,9 +2453,9 @@
   }
 
   test_libraryPrefix_with_exports() async {
-    addSource('/libA.dart', 'library libA; class A { }');
-    addSource('/libB.dart', 'library libB; export "libA.dart"; class B { }');
-    addTestSource('import "libB.dart" as foo; main() {foo.^} class C { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('/home/test/lib/b.dart', 'export "a.dart"; class B { }');
+    addTestSource('import "b.dart" as foo; main() {foo.^} class C { }');
     await computeSuggestions();
     // Suggested by LibraryMemberContributor
     assertNotSuggested('B');
@@ -2514,13 +2512,13 @@
 
   test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2541,13 +2539,13 @@
 
   test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2561,13 +2559,13 @@
 
   test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2770,13 +2768,13 @@
 
   test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2798,13 +2796,13 @@
 
   test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2826,13 +2824,13 @@
 
   test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2854,13 +2852,13 @@
 
   test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -3051,14 +3049,14 @@
 
   test_partFile_TypeName() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library libA;
-        import "testB.dart";
+        import "b.dart";
         part "${resourceProvider.pathContext.basename(testFile)}";
         class A { }
         var m;''');
@@ -3083,18 +3081,18 @@
 
   test_partFile_TypeName2() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         part of libA;
         class B { }''');
     addTestSource('''
         library libA;
-        import "testB.dart";
-        part "${convertAbsolutePathToUri('/testA.dart')}";
+        import "b.dart";
+        part "a.dart";
         class A { A({String boo: 'hoo'}) { } }
         main() {new ^}
         var m;''');
@@ -3115,7 +3113,7 @@
 
   test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -3129,7 +3127,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class A extends B {
           static const String scA = 'foo';
           w() { }}
@@ -3161,7 +3159,7 @@
 
   test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class I {X get f => new A();get _g => new A();}
         class A implements I {
@@ -3172,7 +3170,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         main() {A a; a.^}''');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -3237,13 +3235,13 @@
 
   test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "testB.dart" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         main() {b.^}''');
@@ -3263,13 +3261,13 @@
 
   test_PrefixedIdentifier_library_typesOnly() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "testB.dart" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         foo(b.^ f) {}''');
@@ -3289,13 +3287,13 @@
 
   test_PrefixedIdentifier_library_typesOnly2() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "testB.dart" as b;
+        import "b.dart" as b;
         var T2;
         class A { }
         foo(b.^) {}''');
@@ -3315,13 +3313,13 @@
 
   test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
         class M{}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         foo(X x) {x.^}''');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -3333,11 +3331,11 @@
 
   test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class X {foo(){A^.bar}}''');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -3919,12 +3917,12 @@
 
   test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
     addTestSource('''
-        import "testA.dart";'
+        import "a.dart";'
         class C2 {int x;}
         F2() => 0;
         typedef int T2(int blat);
@@ -3944,12 +3942,12 @@
 
   test_TypeArgumentList2() async {
     // TypeName  TypeArgumentList  TypeName
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
     addTestSource('''
-        import "testA.dart";'
+        import "a.dart";'
         class C2 {int x;}
         F2() => 0;
         typedef int T2(int blat);
@@ -3965,13 +3963,13 @@
   test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class Y {Y.c(); Y._d(); z() {}}
         main() {var ^}''');
     await computeSuggestions();
@@ -3990,13 +3988,13 @@
   test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         class Y {Y.c(); Y._d(); z() {}}
         class C {bar(){var f; {var x;} var e = ^}}''');
     await computeSuggestions();
@@ -4014,14 +4012,14 @@
   test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo1() { }
         void bar1() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import "b.dart";
         foo2() { }
         void bar2() { }
         class Y {Y.c(); Y._d(); z() {}}
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index 7d66b12..49f69ca 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -67,9 +67,9 @@
   }
 
   test_export_package2() async {
-    addPackageSource('foo', 'foo.dart', 'library foo;');
-    addPackageSource('foo', 'baz/too.dart', 'library too;');
-    addPackageSource('bar', 'bar.dart', 'library bar;');
+    addPackageFile('foo', 'foo.dart', 'library foo;');
+    addPackageFile('foo', 'baz/too.dart', 'library too;');
+    addPackageFile('bar', 'bar.dart', 'library bar;');
     addTestSource('export "package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -79,9 +79,9 @@
   test_export_package2_off() async {
     try {
       UriContributor.suggestFilePaths = false;
-      addPackageSource('foo', 'foo.dart', 'library foo;');
-      addPackageSource('foo', 'baz/too.dart', 'library too;');
-      addPackageSource('bar', 'bar.dart', 'library bar;');
+      addPackageFile('foo', 'foo.dart', 'library foo;');
+      addPackageFile('foo', 'baz/too.dart', 'library too;');
+      addPackageFile('bar', 'bar.dart', 'library bar;');
       addTestSource('export "package:foo/baz/^" import');
       await computeSuggestions();
       assertNotSuggested('package:foo/baz/too.dart');
@@ -144,7 +144,7 @@
   }
 
   test_import_file() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -161,7 +161,7 @@
   }
 
   test_import_file2() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -180,7 +180,7 @@
   test_import_file2_off() async {
     try {
       UriContributor.suggestFilePaths = false;
-      testFile = '/proj/completion.dart';
+      testFile = convertPath('/proj/completion.dart');
       addSource('/proj/other.dart', 'library other;');
       addSource('/proj/foo/bar.dart', 'library bar;');
       addSource('/blat.dart', 'library blat;');
@@ -200,7 +200,7 @@
   }
 
   test_import_file_child() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -217,7 +217,7 @@
   }
 
   test_import_file_outside_lib() async {
-    testFile = '/proj/lib/completion.dart';
+    testFile = convertPath('/proj/lib/completion.dart');
     addSource('/proj/lib/other.dart', 'library other;');
     addSource('/proj/lib/foo/bar.dart', 'library bar;');
     addSource('/proj/blat.dart', 'library blat;');
@@ -237,7 +237,7 @@
   }
 
   test_import_file_parent() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -256,7 +256,7 @@
   }
 
   test_import_file_parent2() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -273,7 +273,7 @@
   }
 
   test_import_no_dot_folders() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     newFolder('/proj/.fooFolder');
     addTestSource('import "package:^";');
@@ -282,7 +282,7 @@
   }
 
   test_import_only_dart_files() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     newFile('/proj/analysis_options.yaml', content: '# analysis options');
     addTestSource('import "package:^";');
@@ -291,9 +291,9 @@
   }
 
   test_import_package() async {
-    addPackageSource('foo', 'foo.dart', 'library foo;');
-    addPackageSource('foo', 'baz/too.dart', 'library too;');
-    addPackageSource('bar', 'bar.dart', 'library bar;');
+    addPackageFile('foo', 'foo.dart', 'library foo;');
+    addPackageFile('foo', 'baz/too.dart', 'library too;');
+    addPackageFile('bar', 'bar.dart', 'library bar;');
     addTestSource('import "p^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -310,9 +310,9 @@
   }
 
   test_import_package2() async {
-    addPackageSource('foo', 'foo.dart', 'library foo;');
-    addPackageSource('foo', 'baz/too.dart', 'library too;');
-    addPackageSource('bar', 'bar.dart', 'library bar;');
+    addPackageFile('foo', 'foo.dart', 'library foo;');
+    addPackageFile('foo', 'baz/too.dart', 'library too;');
+    addPackageFile('bar', 'bar.dart', 'library bar;');
     addTestSource('import "package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -322,9 +322,9 @@
   test_import_package2_off() async {
     try {
       UriContributor.suggestFilePaths = false;
-      addPackageSource('foo', 'foo.dart', 'library foo;');
-      addPackageSource('foo', 'baz/too.dart', 'library too;');
-      addPackageSource('bar', 'bar.dart', 'library bar;');
+      addPackageFile('foo', 'foo.dart', 'library foo;');
+      addPackageFile('foo', 'baz/too.dart', 'library too;');
+      addPackageFile('bar', 'bar.dart', 'library bar;');
       addTestSource('import "package:foo/baz/^" import');
       await computeSuggestions();
       assertNotSuggested('package:foo/baz/too.dart');
@@ -334,9 +334,9 @@
   }
 
   test_import_package2_raw() async {
-    addPackageSource('foo', 'foo.dart', 'library foo;');
-    addPackageSource('foo', 'baz/too.dart', 'library too;');
-    addPackageSource('bar', 'bar.dart', 'library bar;');
+    addPackageFile('foo', 'foo.dart', 'library foo;');
+    addPackageFile('foo', 'baz/too.dart', 'library too;');
+    addPackageFile('bar', 'bar.dart', 'library bar;');
     addTestSource('import r"package:foo/baz/^" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -344,9 +344,9 @@
   }
 
   test_import_package2_with_trailing() async {
-    addPackageSource('foo', 'foo.dart', 'library foo;');
-    addPackageSource('foo', 'baz/too.dart', 'library too;');
-    addPackageSource('bar', 'bar.dart', 'library bar;');
+    addPackageFile('foo', 'foo.dart', 'library foo;');
+    addPackageFile('foo', 'baz/too.dart', 'library too;');
+    addPackageFile('bar', 'bar.dart', 'library bar;');
     addTestSource('import "package:foo/baz/^.dart" import');
     await computeSuggestions();
     assertSuggest('package:foo/baz/too.dart',
@@ -356,8 +356,8 @@
   }
 
   test_import_package_missing_lib() async {
-    var pkgSrc = addPackageSource('bar', 'bar.dart', 'library bar;');
-    deleteFolder(dirname(pkgSrc.fullName));
+    var pkgFile = addPackageFile('bar', 'bar.dart', 'library bar;');
+    deleteFolder(pkgFile.parent.path);
     addTestSource('import "p^" class');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -368,9 +368,9 @@
   }
 
   test_import_package_raw() async {
-    addPackageSource('foo', 'foo.dart', 'library foo;');
-    addPackageSource('foo', 'baz/too.dart', 'library too;');
-    addPackageSource('bar', 'bar.dart', 'library bar;');
+    addPackageFile('foo', 'foo.dart', 'library foo;');
+    addPackageFile('foo', 'baz/too.dart', 'library too;');
+    addPackageFile('bar', 'bar.dart', 'library bar;');
     addTestSource('import r"p^" import');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -460,7 +460,7 @@
   }
 
   test_part_file() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -477,7 +477,7 @@
   }
 
   test_part_file2() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -494,7 +494,7 @@
   }
 
   test_part_file_child() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -511,7 +511,7 @@
   }
 
   test_part_file_parent() async {
-    testFile = '/proj/completion.dart';
+    testFile = convertPath('/proj/completion.dart');
     addSource('/proj/other.dart', 'library other;');
     addSource('/proj/foo/bar.dart', 'library bar;');
     addSource('/blat.dart', 'library blat;');
@@ -541,7 +541,7 @@
   }
 
   test_import_file() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
@@ -558,7 +558,7 @@
   }
 
   test_import_file2() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
@@ -575,7 +575,7 @@
   }
 
   test_import_file_child() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
@@ -592,7 +592,7 @@
   }
 
   test_import_file_parent() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
@@ -609,7 +609,7 @@
   }
 
   test_import_file_parent2() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
@@ -626,7 +626,7 @@
   }
 
   test_part_file() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
@@ -643,7 +643,7 @@
   }
 
   test_part_file2() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
@@ -660,7 +660,7 @@
   }
 
   test_part_file_child() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
@@ -677,7 +677,7 @@
   }
 
   test_part_file_parent() async {
-    testFile = '\\proj\\completion.dart';
+    testFile = convertPath('\\proj\\completion.dart');
     addSource('\\proj\\other.dart', 'library other;');
     addSource('\\proj\\foo\\bar.dart', 'library bar;');
     addSource('\\blat.dart', 'library blat;');
diff --git a/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
index 36c4d2d..2d776e06 100644
--- a/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
index e72c2e8..bf67079 100644
--- a/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/postfix_completion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -79,15 +79,7 @@
     verifyNoTestUnitErrors = false;
     await resolveTestUnit(code);
 
-    PostfixCompletionContext context = new PostfixCompletionContext(
-        testFile,
-        testAnalysisResult.lineInfo,
-        offset,
-        key,
-        testAnalysisResult.driver,
-        testUnit,
-        testUnitElement,
-        testAnalysisResult.errors);
+    var context = new PostfixCompletionContext(testAnalysisResult, offset, key);
     processor = new PostfixCompletionProcessor(context);
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/postfix/test_all.dart b/pkg/analysis_server/test/services/completion/postfix/test_all.dart
index a2a43c5..4f4c9cb 100644
--- a/pkg/analysis_server/test/services/completion/postfix/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/postfix/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
index 9ef3195..6d789ad 100644
--- a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
@@ -1,10 +1,10 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/completion/statement/statement_completion.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -63,14 +63,8 @@
 
   _computeCompletion(int offset) async {
     driver.changeFile(testFile);
-    AnalysisResult result = await driver.getResult(testFile);
-    StatementCompletionContext context = new StatementCompletionContext(
-        testFile,
-        result.lineInfo,
-        offset,
-        testUnit,
-        testUnitElement,
-        result.errors);
+    ResolvedUnitResult result = await session.getResolvedUnit(testFile);
+    var context = new StatementCompletionContext(result, offset);
     StatementCompletionProcessor processor =
         new StatementCompletionProcessor(context);
     StatementCompletion completion = await processor.compute();
diff --git a/pkg/analysis_server/test/services/completion/statement/test_all.dart b/pkg/analysis_server/test/services/completion/statement/test_all.dart
index f88ea5a..fb89619 100644
--- a/pkg/analysis_server/test/services/completion/statement/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/statement/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/completion/test_all.dart b/pkg/analysis_server/test/services/completion/test_all.dart
index e89a4e8..11542d1 100644
--- a/pkg/analysis_server/test/services/completion/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
deleted file mode 100644
index b9e542f..0000000
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ /dev/null
@@ -1,6875 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
-import 'package:analysis_server/plugin/edit/assist/assist_dart.dart';
-import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analysis_server/src/services/correction/assist_internal.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:analyzer_plugin/utilities/assist/assist.dart';
-import 'package:plugin/manager.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../abstract_single_unit.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(AssistProcessorTest);
-  });
-}
-
-@reflectiveTest
-class AssistProcessorTest extends AbstractSingleUnitTest {
-  int offset;
-  int length;
-
-  Assist assist;
-  SourceChange change;
-  String resultCode;
-  LinkedEditGroup linkedPositionGroup;
-
-  bool get omitNew => true;
-
-  /**
-   * Asserts that there is an [Assist] of the given [kind] at [offset] which
-   * produces the [expected] code when applied to [testCode].
-   */
-  assertHasAssist(AssistKind kind, String expected) async {
-    assist = await _assertHasAssist(kind);
-    change = assist.change;
-    expect(change.id, kind.id);
-    // apply to "file"
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
-    // verify
-    expect(resultCode, expected);
-  }
-
-  /**
-   * Calls [assertHasAssist] at the offset of [offsetSearch] in [testCode].
-   */
-  assertHasAssistAt(
-      String offsetSearch, AssistKind kind, String expected) async {
-    offset = findOffset(offsetSearch);
-    await assertHasAssist(kind, expected);
-  }
-
-  /**
-   * Asserts that there is no [Assist] of the given [kind] at [offset].
-   */
-  assertNoAssist(AssistKind kind) async {
-    List<Assist> assists = await _computeAssists();
-    for (Assist assist in assists) {
-      if (assist.kind == kind) {
-        fail('Unexpected assist $kind in\n${assists.join('\n')}');
-      }
-    }
-  }
-
-  /**
-   * Calls [assertNoAssist] at the offset of [offsetSearch] in [testCode].
-   */
-  assertNoAssistAt(String offsetSearch, AssistKind kind) async {
-    offset = findOffset(offsetSearch);
-    await assertNoAssist(kind);
-  }
-
-  List<LinkedEditSuggestion> expectedSuggestions(
-      LinkedEditSuggestionKind kind, List<String> values) {
-    return values.map((value) {
-      return new LinkedEditSuggestion(value, kind);
-    }).toList();
-  }
-
-  void processRequiredPlugins() {
-    ExtensionManager manager = new ExtensionManager();
-    manager.processPlugins(AnalysisEngine.instance.requiredPlugins);
-  }
-
-  void setUp() {
-    super.setUp();
-    offset = 0;
-    length = 0;
-  }
-
-  test_addTypeAnnotation_BAD_privateType_closureParameter() async {
-    addSource('/project/my_lib.dart', '''
-library my_lib;
-class A {}
-class _B extends A {}
-foo(f(_B p)) {}
-''');
-    await resolveTestUnit('''
-import 'my_lib.dart';
-main() {
-  foo((test) {});
-}
- ''');
-    await assertNoAssistAt('test)', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_BAD_privateType_declaredIdentifier() async {
-    addSource('/project/my_lib.dart', '''
-library my_lib;
-class A {}
-class _B extends A {}
-List<_B> getValues() => [];
-''');
-    await resolveTestUnit('''
-import 'my_lib.dart';
-class A<T> {
-  main() {
-    for (var item in getValues()) {
-    }
-  }
-}
-''');
-    await assertNoAssistAt('var item', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_BAD_privateType_list() async {
-    // This is now failing because we're suggesting "List" rather than nothing.
-    // Is it really better to produce nothing?
-    addSource('/project/my_lib.dart', '''
-library my_lib;
-class A {}
-class _B extends A {}
-List<_B> getValues() => [];
-''');
-    await resolveTestUnit('''
-import 'my_lib.dart';
-main() {
-  var v = getValues();
-}
-''');
-    await assertHasAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-import 'my_lib.dart';
-main() {
-  List v = getValues();
-}
-''');
-  }
-
-  test_addTypeAnnotation_BAD_privateType_variable() async {
-    addSource('/project/my_lib.dart', '''
-library my_lib;
-class A {}
-class _B extends A {}
-_B getValue() => new _B();
-''');
-    await resolveTestUnit('''
-import 'my_lib.dart';
-main() {
-  var v = getValue();
-}
-''');
-    await assertNoAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_classField_OK_final() async {
-    await resolveTestUnit('''
-class A {
-  final f = 0;
-}
-''');
-    await assertHasAssistAt('final ', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-class A {
-  final int f = 0;
-}
-''');
-  }
-
-  test_addTypeAnnotation_classField_OK_int() async {
-    await resolveTestUnit('''
-class A {
-  var f = 0;
-}
-''');
-    await await assertHasAssistAt(
-        'var ', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-class A {
-  int f = 0;
-}
-''');
-  }
-
-  test_addTypeAnnotation_declaredIdentifier_BAD_hasTypeAnnotation() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (String item in items) {
-  }
-}
-''');
-    await assertNoAssistAt('item in', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_declaredIdentifier_BAD_inForEachBody() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (var item in items) {
-    42;
-  }
-}
-''');
-    await assertNoAssistAt('42;', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_declaredIdentifier_BAD_unknownType() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-main() {
-  for (var item in unknownList) {
-  }
-}
-''');
-    await assertNoAssistAt('item in', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_declaredIdentifier_generic_OK() async {
-    await resolveTestUnit('''
-class A<T> {
-  main(List<List<T>> items) {
-    for (var item in items) {
-    }
-  }
-}
-''');
-    await assertHasAssistAt('item in', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-class A<T> {
-  main(List<List<T>> items) {
-    for (List<T> item in items) {
-    }
-  }
-}
-''');
-  }
-
-  test_addTypeAnnotation_declaredIdentifier_OK() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (var item in items) {
-  }
-}
-''');
-    // on identifier
-    await assertHasAssistAt('item in', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-main(List<String> items) {
-  for (String item in items) {
-  }
-}
-''');
-    // on "for"
-    await assertHasAssistAt('for (', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-main(List<String> items) {
-  for (String item in items) {
-  }
-}
-''');
-  }
-
-  test_addTypeAnnotation_declaredIdentifier_OK_addImport_dartUri() async {
-    addSource('/project/my_lib.dart', r'''
-import 'dart:async';
-List<Future<int>> getFutures() => null;
-''');
-    await resolveTestUnit('''
-import 'my_lib.dart';
-main() {
-  for (var future in getFutures()) {
-  }
-}
-''');
-    await assertHasAssistAt('future in', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-import 'dart:async';
-
-import 'my_lib.dart';
-main() {
-  for (Future<int> future in getFutures()) {
-  }
-}
-''');
-  }
-
-  test_addTypeAnnotation_declaredIdentifier_OK_final() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (final item in items) {
-  }
-}
-''');
-    await assertHasAssistAt('item in', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-main(List<String> items) {
-  for (final String item in items) {
-  }
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_BAD_bottom() async {
-    await resolveTestUnit('''
-main() {
-  var v = throw 42;
-}
-''');
-    await assertNoAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_local_BAD_hasTypeAnnotation() async {
-    await resolveTestUnit('''
-main() {
-  int v = 42;
-}
-''');
-    await assertNoAssistAt(' = 42', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_local_BAD_multiple() async {
-    await resolveTestUnit('''
-main() {
-  var a = 1, b = '';
-}
-''');
-    await assertNoAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_local_BAD_noValue() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-main() {
-  var v;
-}
-''');
-    await assertNoAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_local_BAD_null() async {
-    await resolveTestUnit('''
-main() {
-  var v = null;
-}
-''');
-    await assertNoAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_local_BAD_onInitializer() async {
-    await resolveTestUnit('''
-main() {
-  var abc = 0;
-}
-''');
-    await assertNoAssistAt('0;', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_local_BAD_unknown() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-main() {
-  var v = unknownVar;
-}
-''');
-    await assertNoAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_local_generic_OK_literal() async {
-    await resolveTestUnit('''
-class A {
-  main(List<int> items) {
-    var v = items;
-  }
-}
-''');
-    await assertHasAssistAt('v =', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-class A {
-  main(List<int> items) {
-    List<int> v = items;
-  }
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_generic_OK_local() async {
-    await resolveTestUnit('''
-class A<T> {
-  main(List<T> items) {
-    var v = items;
-  }
-}
-''');
-    await assertHasAssistAt('v =', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-class A<T> {
-  main(List<T> items) {
-    List<T> v = items;
-  }
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_OK_addImport_dartUri() async {
-    addSource('/project/my_lib.dart', r'''
-import 'dart:async';
-Future<int> getFutureInt() => null;
-''');
-    await resolveTestUnit('''
-import 'my_lib.dart';
-main() {
-  var v = getFutureInt();
-}
-''');
-    await assertHasAssistAt('v =', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-import 'dart:async';
-
-import 'my_lib.dart';
-main() {
-  Future<int> v = getFutureInt();
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_OK_addImport_notLibraryUnit() async {
-    // prepare library
-    addSource('/project/my_lib.dart', r'''
-import 'dart:async';
-Future<int> getFutureInt() => null;
-''');
-    // prepare code
-    String appCode = r'''
-library my_app;
-import 'my_lib.dart';
-part 'test.dart';
-''';
-    testCode = r'''
-part of my_app;
-main() {
-  var v = getFutureInt();
-}
-''';
-    // add sources
-    addSource('/project/app.dart', appCode);
-    testSource = addSource('/project/test.dart', testCode);
-    // resolve
-    await resolveTestUnit(testCode);
-    // prepare the assist
-    offset = findOffset('v = ');
-    assist = await _assertHasAssist(DartAssistKind.ADD_TYPE_ANNOTATION);
-    change = assist.change;
-    // verify
-    {
-      var testFileEdit = change.getFileEdit(convertPath('/project/app.dart'));
-      var resultCode = SourceEdit.applySequence(appCode, testFileEdit.edits);
-      expect(resultCode, '''
-library my_app;
-import 'dart:async';
-
-import 'my_lib.dart';
-part 'test.dart';
-''');
-    }
-    {
-      var testFileEdit = change.getFileEdit(convertPath('/project/test.dart'));
-      var resultCode = SourceEdit.applySequence(testCode, testFileEdit.edits);
-      expect(resultCode, '''
-part of my_app;
-main() {
-  Future<int> v = getFutureInt();
-}
-''');
-    }
-  }
-
-  test_addTypeAnnotation_local_OK_addImport_relUri() async {
-    addSource('/project/aa/bbb/lib_a.dart', r'''
-class MyClass {}
-''');
-    addSource('/project/ccc/lib_b.dart', r'''
-import '../aa/bbb/lib_a.dart';
-MyClass newMyClass() => null;
-''');
-    await resolveTestUnit('''
-import 'ccc/lib_b.dart';
-main() {
-  var v = newMyClass();
-}
-''');
-    await assertHasAssistAt('v =', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-import 'aa/bbb/lib_a.dart';
-import 'ccc/lib_b.dart';
-main() {
-  MyClass v = newMyClass();
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_OK_Function() async {
-    await resolveTestUnit('''
-main() {
-  var v = () => 1;
-}
-''');
-    await assertHasAssistAt('v =', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-main() {
-  int Function() v = () => 1;
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_OK_int() async {
-    await resolveTestUnit('''
-main() {
-  var v = 0;
-}
-''');
-    await assertHasAssistAt('v =', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-main() {
-  int v = 0;
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_OK_List() async {
-    await resolveTestUnit('''
-main() {
-  var v = <String>[];
-}
-''');
-    await assertHasAssistAt('v =', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-main() {
-  List<String> v = <String>[];
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_OK_localType() async {
-    await resolveTestUnit('''
-class C {}
-C f() => null;
-main() {
-  var x = f();
-}
-''');
-    await assertHasAssistAt('x =', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-class C {}
-C f() => null;
-main() {
-  C x = f();
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_OK_onName() async {
-    await resolveTestUnit('''
-main() {
-  var abc = 0;
-}
-''');
-    await assertHasAssistAt('bc', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-main() {
-  int abc = 0;
-}
-''');
-  }
-
-  test_addTypeAnnotation_local_OK_onVar() async {
-    await resolveTestUnit('''
-main() {
-  var v = 0;
-}
-''');
-    await assertHasAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-main() {
-  int v = 0;
-}
-''');
-  }
-
-  test_addTypeAnnotation_OK_privateType_sameLibrary() async {
-    await resolveTestUnit('''
-class _A {}
-_A getValue() => new _A();
-main() {
-  var v = getValue();
-}
-''');
-    await assertHasAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-class _A {}
-_A getValue() => new _A();
-main() {
-  _A v = getValue();
-}
-''');
-  }
-
-  test_addTypeAnnotation_parameter_BAD_hasExplicitType() async {
-    await resolveTestUnit('''
-foo(f(int p)) {}
-main() {
-  foo((num test) {});
-}
-''');
-    await assertNoAssistAt('test', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_parameter_BAD_noPropagatedType() async {
-    await resolveTestUnit('''
-foo(f(p)) {}
-main() {
-  foo((test) {});
-}
-''');
-    await assertNoAssistAt('test', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_parameter_OK() async {
-    await resolveTestUnit('''
-foo(f(int p)) {}
-main() {
-  foo((test) {});
-}
-''');
-    await assertHasAssistAt('test', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-foo(f(int p)) {}
-main() {
-  foo((int test) {});
-}
-''');
-  }
-
-  test_addTypeAnnotation_topLevelField_BAD_multiple() async {
-    await resolveTestUnit('''
-var A = 1, V = '';
-''');
-    await assertNoAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_topLevelField_BAD_noValue() async {
-    await resolveTestUnit('''
-var V;
-''');
-    await assertNoAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION);
-  }
-
-  test_addTypeAnnotation_topLevelField_OK_int() async {
-    await resolveTestUnit('''
-var V = 0;
-''');
-    await assertHasAssistAt('var ', DartAssistKind.ADD_TYPE_ANNOTATION, '''
-int V = 0;
-''');
-  }
-
-  test_assignToLocalVariable() async {
-    await resolveTestUnit('''
-main() {
-  List<int> bytes;
-  readBytes();
-}
-List<int> readBytes() => <int>[];
-''');
-    await assertHasAssistAt(
-        'readBytes();', DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE, '''
-main() {
-  List<int> bytes;
-  var readBytes = readBytes();
-}
-List<int> readBytes() => <int>[];
-''');
-    _assertLinkedGroup(
-        change.linkedEditGroups[0],
-        ['readBytes = '],
-        expectedSuggestions(LinkedEditSuggestionKind.VARIABLE,
-            ['list', 'bytes2', 'readBytes']));
-  }
-
-  test_assignToLocalVariable_alreadyAssignment() async {
-    await resolveTestUnit('''
-main() {
-  var vvv;
-  vvv = 42;
-}
-''');
-    await assertNoAssistAt('vvv =', DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE);
-  }
-
-  test_assignToLocalVariable_inClosure() async {
-    await resolveTestUnit(r'''
-main() {
-  print(() {
-    12345;
-  });
-}
-''');
-    await assertHasAssistAt('345', DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE, '''
-main() {
-  print(() {
-    var i = 12345;
-  });
-}
-''');
-  }
-
-  test_assignToLocalVariable_invocationArgument() async {
-    await resolveTestUnit(r'''
-main() {
-  f(12345);
-}
-void f(p) {}
-''');
-    await assertNoAssistAt('345', DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE);
-  }
-
-  test_assignToLocalVariable_throw() async {
-    await resolveTestUnit('''
-main() {
-  throw 42;
-}
-''');
-    await assertNoAssistAt('throw ', DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE);
-  }
-
-  test_assignToLocalVariable_void() async {
-    await resolveTestUnit('''
-main() {
-  f();
-}
-void f() {}
-''');
-    await assertNoAssistAt('f();', DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE);
-  }
-
-  test_convertClassToMixin_abstract() async {
-    await resolveTestUnit('''
-abstract class A {}
-''');
-    await assertHasAssistAt('A', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-mixin A {}
-''');
-  }
-
-  test_convertClassToMixin_extends_noSuper() async {
-    await resolveTestUnit('''
-class A {}
-class B extends A {}
-''');
-    await assertHasAssistAt('B', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {}
-mixin B implements A {}
-''');
-  }
-
-  test_convertClassToMixin_extends_super() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B extends A {
-  b() {
-    super.a();
-  }
-}
-''');
-    await assertHasAssistAt('B', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-mixin B on A {
-  b() {
-    super.a();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_extends_superSuper() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B extends A {}
-class C extends B {
-  c() {
-    super.a();
-  }
-}
-''');
-    await assertHasAssistAt('C', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-class B extends A {}
-mixin C on B {
-  c() {
-    super.a();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_extendsImplements_noSuper() async {
-    await resolveTestUnit('''
-class A {}
-class B {}
-class C extends A implements B {}
-''');
-    await assertHasAssistAt('C', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {}
-class B {}
-mixin C implements A, B {}
-''');
-  }
-
-  test_convertClassToMixin_extendsImplements_super_extends() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B {}
-class C extends A implements B {
-  c() {
-    super.a();
-  }
-}
-''');
-    await assertHasAssistAt('C', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-class B {}
-mixin C on A implements B {
-  c() {
-    super.a();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_extendsWith_noSuper() async {
-    await resolveTestUnit('''
-class A {}
-class B {}
-class C extends A with B {}
-''');
-    await assertHasAssistAt('C', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {}
-class B {}
-mixin C implements A, B {}
-''');
-  }
-
-  test_convertClassToMixin_extendsWith_super_both() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C extends A with B {
-  c() {
-    super.a();
-    super.b();
-  }
-}
-''');
-    await assertHasAssistAt('C', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-mixin C on A, B {
-  c() {
-    super.a();
-    super.b();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_extendsWith_super_extends() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C extends A with B {
-  c() {
-    super.a();
-  }
-}
-''');
-    await assertHasAssistAt('C', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-mixin C on A implements B {
-  c() {
-    super.a();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_extendsWith_super_with() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C extends A with B {
-  c() {
-    super.b();
-  }
-}
-''');
-    await assertHasAssistAt('C', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-mixin C on B implements A {
-  c() {
-    super.b();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_extendsWithImplements_noSuper() async {
-    await resolveTestUnit('''
-class A {}
-class B {}
-class C {}
-class D extends A with B implements C {}
-''');
-    await assertHasAssistAt('D', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {}
-class B {}
-class C {}
-mixin D implements A, B, C {}
-''');
-  }
-
-  test_convertClassToMixin_extendsWithImplements_super_both() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C {}
-class D extends A with B implements C {
-  d() {
-    super.a();
-    super.b();
-  }
-}
-''');
-    await assertHasAssistAt('D', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C {}
-mixin D on A, B implements C {
-  d() {
-    super.a();
-    super.b();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_extendsWithImplements_super_extends() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C {}
-class D extends A with B implements C {
-  d() {
-    super.a();
-  }
-}
-''');
-    await assertHasAssistAt('D', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C {}
-mixin D on A implements B, C {
-  d() {
-    super.a();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_extendsWithImplements_super_with() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C {}
-class D extends A with B implements C {
-  d() {
-    super.b();
-  }
-}
-''');
-    await assertHasAssistAt('D', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-class B {
-  b() {}
-}
-class C {}
-mixin D on B implements A, C {
-  d() {
-    super.b();
-  }
-}
-''');
-  }
-
-  test_convertClassToMixin_implements() async {
-    await resolveTestUnit('''
-class A {}
-class B implements A {}
-''');
-    await assertHasAssistAt('B', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {}
-mixin B implements A {}
-''');
-  }
-
-  test_convertClassToMixin_noClauses_invalidSelection() async {
-    await resolveTestUnit('''
-class A {}
-''');
-    await assertNoAssistAt(
-      '{}',
-      DartAssistKind.CONVERT_CLASS_TO_MIXIN,
-    );
-  }
-
-  test_convertClassToMixin_noClauses_selectKeyword() async {
-    await resolveTestUnit('''
-class A {}
-''');
-    await assertHasAssistAt('class', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-mixin A {}
-''');
-  }
-
-  test_convertClassToMixin_noClauses_selectName() async {
-    await resolveTestUnit('''
-class A {}
-''');
-    await assertHasAssistAt('A', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-mixin A {}
-''');
-  }
-
-  test_convertClassToMixin_with_noSuper() async {
-    await resolveTestUnit('''
-class A {}
-class B with A {}
-''');
-    await assertHasAssistAt('B', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {}
-mixin B implements A {}
-''');
-  }
-
-  test_convertClassToMixin_with_super() async {
-    await resolveTestUnit('''
-class A {
-  a() {}
-}
-class B with A {
-  b() {
-    super.a();
-  }
-}
-''');
-    await assertHasAssistAt('B', DartAssistKind.CONVERT_CLASS_TO_MIXIN, '''
-class A {
-  a() {}
-}
-mixin B on A {
-  b() {
-    super.a();
-  }
-}
-''');
-  }
-
-  test_convertDocumentationIntoBlock_BAD_alreadyBlock() async {
-    await resolveTestUnit('''
-/**
- * AAAAAAA
- */
-class A {}
-''');
-    await assertNoAssistAt(
-        'AAA', DartAssistKind.CONVERT_DOCUMENTATION_INTO_BLOCK);
-  }
-
-  test_convertDocumentationIntoBlock_BAD_notDocumentation() async {
-    await resolveTestUnit('''
-// AAAA
-class A {}
-''');
-    await assertNoAssistAt(
-        'AAA', DartAssistKind.CONVERT_DOCUMENTATION_INTO_BLOCK);
-  }
-
-  test_convertDocumentationIntoBlock_OK_noSpaceBeforeText() async {
-    await resolveTestUnit('''
-class A {
-  /// AAAAA
-  ///BBBBB
-  ///
-  /// CCCCC
-  mmm() {}
-}
-''');
-    await assertHasAssistAt(
-        'AAAAA', DartAssistKind.CONVERT_DOCUMENTATION_INTO_BLOCK, '''
-class A {
-  /**
-   * AAAAA
-   *BBBBB
-   *
-   * CCCCC
-   */
-  mmm() {}
-}
-''');
-  }
-
-  test_convertDocumentationIntoBlock_OK_onReference() async {
-    await resolveTestUnit('''
-/// AAAAAAA [int] AAAAAAA
-class A {}
-''');
-    await assertHasAssistAt(
-        'nt]', DartAssistKind.CONVERT_DOCUMENTATION_INTO_BLOCK, '''
-/**
- * AAAAAAA [int] AAAAAAA
- */
-class A {}
-''');
-  }
-
-  test_convertDocumentationIntoBlock_OK_onText() async {
-    await resolveTestUnit('''
-class A {
-  /// AAAAAAA [int] AAAAAAA
-  /// BBBBBBBB BBBB BBBB
-  /// CCC [A] CCCCCCCCCCC
-  mmm() {}
-}
-''');
-    await assertHasAssistAt(
-        'AAA [', DartAssistKind.CONVERT_DOCUMENTATION_INTO_BLOCK, '''
-class A {
-  /**
-   * AAAAAAA [int] AAAAAAA
-   * BBBBBBBB BBBB BBBB
-   * CCC [A] CCCCCCCCCCC
-   */
-  mmm() {}
-}
-''');
-  }
-
-  test_convertDocumentationIntoLine_BAD_alreadyLine() async {
-    await resolveTestUnit('''
-/// AAAAAAA
-class A {}
-''');
-    await assertNoAssistAt(
-        'AAA', DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE);
-  }
-
-  test_convertDocumentationIntoLine_BAD_notDocumentation() async {
-    await resolveTestUnit('''
-/* AAAA */
-class A {}
-''');
-    await assertNoAssistAt(
-        'AAA', DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE);
-  }
-
-  test_convertDocumentationIntoLine_OK_onReference() async {
-    await resolveTestUnit('''
-/**
- * AAAAAAA [int] AAAAAAA
- */
-class A {}
-''');
-    await assertHasAssistAt(
-        'nt]', DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE, '''
-/// AAAAAAA [int] AAAAAAA
-class A {}
-''');
-  }
-
-  test_convertDocumentationIntoLine_OK_onText() async {
-    await resolveTestUnit('''
-class A {
-  /**
-   * AAAAAAA [int] AAAAAAA
-   * BBBBBBBB BBBB BBBB
-   * CCC [A] CCCCCCCCCCC
-   */
-  mmm() {}
-}
-''');
-    await assertHasAssistAt(
-        'AAA [', DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE, '''
-class A {
-  /// AAAAAAA [int] AAAAAAA
-  /// BBBBBBBB BBBB BBBB
-  /// CCC [A] CCCCCCCCCCC
-  mmm() {}
-}
-''');
-  }
-
-  test_convertDocumentationIntoLine_OK_onText_hasFirstLine() async {
-    await resolveTestUnit('''
-class A {
-  /** AAAAAAA [int] AAAAAAA
-   * BBBBBBBB BBBB BBBB
-   * CCC [A] CCCCCCCCCCC
-   */
-  mmm() {}
-}
-''');
-    await assertHasAssistAt(
-        'AAA [', DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE, '''
-class A {
-  /// AAAAAAA [int] AAAAAAA
-  /// BBBBBBBB BBBB BBBB
-  /// CCC [A] CCCCCCCCCCC
-  mmm() {}
-}
-''');
-  }
-
-  test_convertPartOfToUri_file_nonSibling() async {
-    addSource('/pkg/lib/foo.dart', '''
-library foo;
-part 'src/bar.dart';
-''');
-    testFile = resourceProvider.convertPath('/pkg/lib/src/bar.dart');
-    await resolveTestUnit('''
-part of foo;
-''');
-    await assertHasAssistAt('foo', DartAssistKind.CONVERT_PART_OF_TO_URI, '''
-part of '../foo.dart';
-''');
-  }
-
-  test_convertPartOfToUri_file_sibling() async {
-    addSource('/pkg/foo.dart', '''
-library foo;
-part 'bar.dart';
-''');
-    testFile = resourceProvider.convertPath('/pkg/bar.dart');
-    await resolveTestUnit('''
-part of foo;
-''');
-    await assertHasAssistAt('foo', DartAssistKind.CONVERT_PART_OF_TO_URI, '''
-part of 'foo.dart';
-''');
-  }
-
-  test_convertToAsyncBody_BAD_async() async {
-    await resolveTestUnit('''
-import 'dart:async';
-Future<String> f() async => '';
-''');
-    await assertNoAssistAt('=>', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
-  }
-
-  test_convertToAsyncBody_BAD_asyncStar() async {
-    await resolveTestUnit('''
-import 'dart:async';
-Stream<String> f() async* {}
-''');
-    await assertNoAssistAt('{}', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
-  }
-
-  test_convertToAsyncBody_BAD_constructor() async {
-    await resolveTestUnit('''
-class C {
-  C() {}
-}
-''');
-    await assertNoAssistAt('{}', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
-  }
-
-  test_convertToAsyncBody_BAD_inBody_block() async {
-    await resolveTestUnit('''
-class C {
-  void foo() {
-    print(42);
-  }
-}
-''');
-    await assertNoAssistAt('print', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
-  }
-
-  test_convertToAsyncBody_BAD_inBody_expression() async {
-    await resolveTestUnit('''
-class C {
-  void foo() => print(42);
-}
-''');
-    await assertNoAssistAt('print', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
-  }
-
-  test_convertToAsyncBody_BAD_syncStar() async {
-    await resolveTestUnit('''
-Iterable<String> f() sync* {}
-''');
-    await assertNoAssistAt('{}', DartAssistKind.CONVERT_INTO_ASYNC_BODY);
-  }
-
-  test_convertToAsyncBody_OK_closure() async {
-    await resolveTestUnit('''
-main() {
-  f(() => 123);
-}
-f(g) {}
-''');
-    await assertHasAssistAt('=>', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
-main() {
-  f(() async => 123);
-}
-f(g) {}
-''');
-  }
-
-  test_convertToAsyncBody_OK_function() async {
-    // TODO(brianwilkerson) Remove the "class C {}" when the bug in the builder
-    // is fixed that causes the import to be incorrectly inserted when the first
-    // character in the file is also being modified.
-    await resolveTestUnit('''
-class C {}
-String f() => '';
-''');
-    await assertHasAssistAt('=>', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
-import 'dart:async';
-
-class C {}
-Future<String> f() async => '';
-''');
-  }
-
-  test_convertToAsyncBody_OK_getter_expression_noSpace() async {
-    await resolveTestUnit('''
-class C {
-  int get g=>0;
-}
-''');
-    await assertHasAssistAt('get g', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
-import 'dart:async';
-
-class C {
-  Future<int> get g async =>0;
-}
-''');
-  }
-
-  test_convertToAsyncBody_OK_method() async {
-    await resolveTestUnit('''
-class C {
-  int m() { return 0; }
-}
-''');
-    await assertHasAssistAt(
-        '{ return', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
-import 'dart:async';
-
-class C {
-  Future<int> m() async { return 0; }
-}
-''');
-  }
-
-  test_convertToAsyncBody_OK_method_abstract() async {
-    await resolveTestUnit('''
-abstract class C {
-  int m();
-}
-''');
-    await assertHasAssistAt('m()', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
-import 'dart:async';
-
-abstract class C {
-  Future<int> m();
-}
-''');
-  }
-
-  test_convertToAsyncBody_OK_method_noReturnType() async {
-    await resolveTestUnit('''
-class C {
-  m() { return 0; }
-}
-''');
-    await assertHasAssistAt(
-        '{ return', DartAssistKind.CONVERT_INTO_ASYNC_BODY, '''
-class C {
-  m() async { return 0; }
-}
-''');
-  }
-
-  test_convertToBlockBody_BAD_inExpression() async {
-    await resolveTestUnit('''
-main() => 123;
-''');
-    await assertNoAssistAt('123;', DartAssistKind.CONVERT_INTO_BLOCK_BODY);
-  }
-
-  test_convertToBlockBody_BAD_noEnclosingFunction() async {
-    await resolveTestUnit('''
-var v = 123;
-''');
-    await assertNoAssistAt('v =', DartAssistKind.CONVERT_INTO_BLOCK_BODY);
-  }
-
-  test_convertToBlockBody_BAD_notExpressionBlock() async {
-    await resolveTestUnit('''
-fff() {
-  return 123;
-}
-''');
-    await assertNoAssistAt('fff() {', DartAssistKind.CONVERT_INTO_BLOCK_BODY);
-  }
-
-  test_convertToBlockBody_OK_async() async {
-    await resolveTestUnit('''
-class A {
-  mmm() async => 123;
-}
-''');
-    await assertHasAssistAt('mmm()', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
-class A {
-  mmm() async {
-    return 123;
-  }
-}
-''');
-  }
-
-  test_convertToBlockBody_OK_closure() async {
-    await resolveTestUnit('''
-setup(x) {}
-main() {
-  setup(() => 42);
-}
-''');
-    await assertHasAssistAt(
-        '() => 42', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
-setup(x) {}
-main() {
-  setup(() {
-    return 42;
-  });
-}
-''');
-    {
-      Position exitPos = change.selection;
-      expect(exitPos, isNotNull);
-      expect(exitPos.file, testFile);
-      expect(exitPos.offset - 3, resultCode.indexOf('42;'));
-    }
-  }
-
-  test_convertToBlockBody_OK_closure_voidExpression() async {
-    await resolveTestUnit('''
-setup(x) {}
-main() {
-  setup(() => print('done'));
-}
-''');
-    await assertHasAssistAt(
-        '() => print', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
-setup(x) {}
-main() {
-  setup(() {
-    print('done');
-  });
-}
-''');
-    {
-      Position exitPos = change.selection;
-      expect(exitPos, isNotNull);
-      expect(exitPos.file, testFile);
-      expect(exitPos.offset - 3, resultCode.indexOf("');"));
-    }
-  }
-
-  test_convertToBlockBody_OK_constructor() async {
-    await resolveTestUnit('''
-class A {
-  factory A() => null;
-}
-''');
-    await assertHasAssistAt('A()', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
-class A {
-  factory A() {
-    return null;
-  }
-}
-''');
-  }
-
-  test_convertToBlockBody_OK_method() async {
-    await resolveTestUnit('''
-class A {
-  mmm() => 123;
-}
-''');
-    await assertHasAssistAt('mmm()', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
-class A {
-  mmm() {
-    return 123;
-  }
-}
-''');
-  }
-
-  test_convertToBlockBody_OK_onArrow() async {
-    await resolveTestUnit('''
-fff() => 123;
-''');
-    await assertHasAssistAt('=>', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
-fff() {
-  return 123;
-}
-''');
-  }
-
-  test_convertToBlockBody_OK_onName() async {
-    await resolveTestUnit('''
-fff() => 123;
-''');
-    await assertHasAssistAt('fff()', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
-fff() {
-  return 123;
-}
-''');
-  }
-
-  test_convertToBlockBody_OK_throw() async {
-    await resolveTestUnit('''
-class A {
-  mmm() => throw 'error';
-}
-''');
-    await assertHasAssistAt('mmm()', DartAssistKind.CONVERT_INTO_BLOCK_BODY, '''
-class A {
-  mmm() {
-    throw 'error';
-  }
-}
-''');
-  }
-
-  test_convertToDoubleQuotedString_BAD_one_embeddedTarget() async {
-    await resolveTestUnit('''
-main() {
-  print('a"b"c');
-}
-''');
-    await assertNoAssistAt(
-        "'a", DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING);
-  }
-
-  test_convertToDoubleQuotedString_BAD_one_enclosingTarget() async {
-    await resolveTestUnit('''
-main() {
-  print("abc");
-}
-''');
-    await assertNoAssistAt(
-        '"ab', DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING);
-  }
-
-  test_convertToDoubleQuotedString_BAD_three_embeddedTarget() async {
-    await resolveTestUnit("""
-main() {
-  print('''a""\"c''');
-}
-""");
-    await assertNoAssistAt(
-        "'a", DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING);
-  }
-
-  test_convertToDoubleQuotedString_BAD_three_enclosingTarget() async {
-    await resolveTestUnit('''
-main() {
-  print("""abc""");
-}
-''');
-    await assertNoAssistAt(
-        '"ab', DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING);
-  }
-
-  test_convertToDoubleQuotedString_OK_one_interpolation() async {
-    await resolveTestUnit(r'''
-main() {
-  var b = 'b';
-  var c = 'c';
-  print('a $b-${c} d');
-}
-''');
-    await assertHasAssistAt(
-        r"'a $b", DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING, r'''
-main() {
-  var b = 'b';
-  var c = 'c';
-  print("a $b-${c} d");
-}
-''');
-  }
-
-  test_convertToDoubleQuotedString_OK_one_raw() async {
-    await resolveTestUnit('''
-main() {
-  print(r'abc');
-}
-''');
-    await assertHasAssistAt(
-        "'ab", DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING, '''
-main() {
-  print(r"abc");
-}
-''');
-  }
-
-  test_convertToDoubleQuotedString_OK_one_simple() async {
-    await resolveTestUnit('''
-main() {
-  print('abc');
-}
-''');
-    await assertHasAssistAt(
-        "'ab", DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING, '''
-main() {
-  print("abc");
-}
-''');
-  }
-
-  test_convertToDoubleQuotedString_OK_three_interpolation() async {
-    await resolveTestUnit(r"""
-main() {
-  var b = 'b';
-  var c = 'c';
-  print('''a $b-${c} d''');
-}
-""");
-    await assertHasAssistAt(
-        r"'a $b", DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING, r'''
-main() {
-  var b = 'b';
-  var c = 'c';
-  print("""a $b-${c} d""");
-}
-''');
-  }
-
-  test_convertToDoubleQuotedString_OK_three_raw() async {
-    await resolveTestUnit("""
-main() {
-  print(r'''abc''');
-}
-""");
-    await assertHasAssistAt(
-        "'ab", DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING, '''
-main() {
-  print(r"""abc""");
-}
-''');
-  }
-
-  test_convertToDoubleQuotedString_OK_three_simple() async {
-    await resolveTestUnit("""
-main() {
-  print('''abc''');
-}
-""");
-    await assertHasAssistAt(
-        "'ab", DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING, '''
-main() {
-  print("""abc""");
-}
-''');
-  }
-
-  test_convertToExpressionBody_BAD_already() async {
-    await resolveTestUnit('''
-fff() => 42;
-''');
-    await assertNoAssistAt(
-        'fff()', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY);
-  }
-
-  test_convertToExpressionBody_BAD_inExpression() async {
-    await resolveTestUnit('''
-main() {
-  return 42;
-}
-''');
-    await assertNoAssistAt('42;', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY);
-  }
-
-  test_convertToExpressionBody_BAD_moreThanOneStatement() async {
-    await resolveTestUnit('''
-fff() {
-  var v = 42;
-  return v;
-}
-''');
-    await assertNoAssistAt(
-        'fff()', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY);
-  }
-
-  test_convertToExpressionBody_BAD_noEnclosingFunction() async {
-    await resolveTestUnit('''
-var V = 42;
-''');
-    await assertNoAssistAt('V = ', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY);
-  }
-
-  test_convertToExpressionBody_BAD_noReturn() async {
-    await resolveTestUnit('''
-fff() {
-  var v = 42;
-}
-''');
-    await assertNoAssistAt(
-        'fff()', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY);
-  }
-
-  test_convertToExpressionBody_BAD_noReturnValue() async {
-    await resolveTestUnit('''
-fff() {
-  return;
-}
-''');
-    await assertNoAssistAt(
-        'fff()', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY);
-  }
-
-  test_convertToExpressionBody_OK_async() async {
-    await resolveTestUnit('''
-class A {
-  mmm() async {
-    return 42;
-  }
-}
-''');
-    await assertHasAssistAt(
-        'mmm', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
-class A {
-  mmm() async => 42;
-}
-''');
-  }
-
-  test_convertToExpressionBody_OK_closure() async {
-    await resolveTestUnit('''
-setup(x) {}
-main() {
-  setup(() {
-    return 42;
-  });
-}
-''');
-    await assertHasAssistAt(
-        'return', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
-setup(x) {}
-main() {
-  setup(() => 42);
-}
-''');
-  }
-
-  test_convertToExpressionBody_OK_closure_voidExpression() async {
-    await resolveTestUnit('''
-setup(x) {}
-main() {
-  setup((_) {
-    print('test');
-  });
-}
-''');
-    await assertHasAssistAt(
-        '(_) {', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
-setup(x) {}
-main() {
-  setup((_) => print('test'));
-}
-''');
-  }
-
-  test_convertToExpressionBody_OK_constructor() async {
-    await resolveTestUnit('''
-class A {
-  factory A() {
-    return null;
-  }
-}
-''');
-    await assertHasAssistAt(
-        'A()', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
-class A {
-  factory A() => null;
-}
-''');
-  }
-
-  test_convertToExpressionBody_OK_function_onBlock() async {
-    await resolveTestUnit('''
-fff() {
-  return 42;
-}
-''');
-    await assertHasAssistAt(
-        '{', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
-fff() => 42;
-''');
-  }
-
-  test_convertToExpressionBody_OK_function_onName() async {
-    await resolveTestUnit('''
-fff() {
-  return 42;
-}
-''');
-    await assertHasAssistAt(
-        'ff()', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
-fff() => 42;
-''');
-  }
-
-  test_convertToExpressionBody_OK_method_onBlock() async {
-    await resolveTestUnit('''
-class A {
-  m() { // marker
-    return 42;
-  }
-}
-''');
-    await assertHasAssistAt(
-        '{ // marker', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
-class A {
-  m() => 42;
-}
-''');
-  }
-
-  test_convertToExpressionBody_OK_topFunction_onReturnStatement() async {
-    await resolveTestUnit('''
-fff() {
-  return 42;
-}
-''');
-    await assertHasAssistAt(
-        'return', DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, '''
-fff() => 42;
-''');
-  }
-
-  test_convertToFieldParameter_BAD_additionalUse() async {
-    await resolveTestUnit('''
-class A {
-  int aaa2;
-  int bbb2;
-  A(int aaa) : aaa2 = aaa, bbb2 = aaa;
-}
-''');
-    await assertNoAssistAt('aaa)', DartAssistKind.CONVERT_TO_FIELD_PARAMETER);
-  }
-
-  test_convertToFieldParameter_BAD_notPureAssignment() async {
-    await resolveTestUnit('''
-class A {
-  int aaa2;
-  A(int aaa) : aaa2 = aaa * 2;
-}
-''');
-    await assertNoAssistAt('aaa)', DartAssistKind.CONVERT_TO_FIELD_PARAMETER);
-  }
-
-  test_convertToFieldParameter_OK_firstInitializer() async {
-    await resolveTestUnit('''
-class A {
-  int aaa2;
-  int bbb2;
-  A(int aaa, int bbb) : aaa2 = aaa, bbb2 = bbb;
-}
-''');
-    await assertHasAssistAt(
-        'aaa, ', DartAssistKind.CONVERT_TO_FIELD_PARAMETER, '''
-class A {
-  int aaa2;
-  int bbb2;
-  A(this.aaa2, int bbb) : bbb2 = bbb;
-}
-''');
-  }
-
-  test_convertToFieldParameter_OK_onParameterName_inInitializer() async {
-    await resolveTestUnit('''
-class A {
-  int test2;
-  A(int test) : test2 = test {
-  }
-}
-''');
-    await assertHasAssistAt(
-        'test {', DartAssistKind.CONVERT_TO_FIELD_PARAMETER, '''
-class A {
-  int test2;
-  A(this.test2) {
-  }
-}
-''');
-  }
-
-  test_convertToFieldParameter_OK_onParameterName_inParameters() async {
-    await resolveTestUnit('''
-class A {
-  int test;
-  A(int test) : test = test {
-  }
-}
-''');
-    await assertHasAssistAt(
-        'test)', DartAssistKind.CONVERT_TO_FIELD_PARAMETER, '''
-class A {
-  int test;
-  A(this.test) {
-  }
-}
-''');
-  }
-
-  test_convertToFieldParameter_OK_secondInitializer() async {
-    await resolveTestUnit('''
-class A {
-  int aaa2;
-  int bbb2;
-  A(int aaa, int bbb) : aaa2 = aaa, bbb2 = bbb;
-}
-''');
-    await assertHasAssistAt(
-        'bbb)', DartAssistKind.CONVERT_TO_FIELD_PARAMETER, '''
-class A {
-  int aaa2;
-  int bbb2;
-  A(int aaa, this.bbb2) : aaa2 = aaa;
-}
-''');
-  }
-
-  test_convertToFinalField_BAD_hasSetter_inThisClass() async {
-    await resolveTestUnit('''
-class A {
-  int get foo => null;
-  void set foo(_) {}
-}
-''');
-    await assertNoAssistAt('get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD);
-  }
-
-  test_convertToFinalField_BAD_notExpressionBody() async {
-    await resolveTestUnit('''
-class A {
-  int get foo {
-    int v = 1 + 2;
-    return v + 3;
-  }
-}
-''');
-    await assertNoAssistAt('get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD);
-  }
-
-  test_convertToFinalField_BAD_notGetter() async {
-    await resolveTestUnit('''
-class A {
-  int foo() => 42;
-}
-''');
-    await assertNoAssistAt('foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD);
-  }
-
-  test_convertToFinalField_OK_blockBody_onlyReturnStatement() async {
-    await resolveTestUnit('''
-class A {
-  int get foo {
-    return 1 + 2;
-  }
-}
-''');
-    await assertHasAssistAt(
-        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  final int foo = 1 + 2;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_hasOverride() async {
-    await resolveTestUnit('''
-const myAnnotation = const Object();
-class A {
-  @myAnnotation
-  int get foo => 42;
-}
-''');
-    await assertHasAssistAt(
-        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-const myAnnotation = const Object();
-class A {
-  @myAnnotation
-  final int foo = 42;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_hasSetter_inSuper() async {
-    await resolveTestUnit('''
-class A {
-  void set foo(_) {}
-}
-class B extends A {
-  int get foo => null;
-}
-''');
-    await assertHasAssistAt(
-        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  void set foo(_) {}
-}
-class B extends A {
-  final int foo;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_noReturnType() async {
-    await resolveTestUnit('''
-class A {
-  get foo => 42;
-}
-''');
-    await assertHasAssistAt(
-        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  final foo = 42;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_noReturnType_static() async {
-    await resolveTestUnit('''
-class A {
-  static get foo => 42;
-}
-''');
-    await assertHasAssistAt(
-        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  static final foo = 42;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_notNull() async {
-    await resolveTestUnit('''
-class A {
-  int get foo => 1 + 2;
-}
-''');
-    await assertHasAssistAt(
-        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  final int foo = 1 + 2;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_null() async {
-    await resolveTestUnit('''
-class A {
-  int get foo => null;
-}
-''');
-    await assertHasAssistAt(
-        'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  final int foo;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_onName() async {
-    await resolveTestUnit('''
-class A {
-  int get foo => 42;
-}
-''');
-    await assertHasAssistAt('foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  final int foo = 42;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_onReturnType_parameterized() async {
-    await resolveTestUnit('''
-class A {
-  List<int> get foo => null;
-}
-''');
-    await assertHasAssistAt(
-        'nt> get', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  final List<int> foo;
-}
-''');
-  }
-
-  test_convertToFinalField_OK_onReturnType_simple() async {
-    await resolveTestUnit('''
-class A {
-  int get foo => 42;
-}
-''');
-    await assertHasAssistAt(
-        'int get', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
-class A {
-  final int foo = 42;
-}
-''');
-  }
-
-  test_convertToForIndex_BAD_bodyNotBlock() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (String item in items) print(item);
-}
-''');
-    await assertNoAssistAt(
-        'for (String', DartAssistKind.CONVERT_INTO_FOR_INDEX);
-  }
-
-  test_convertToForIndex_BAD_doesNotDeclareVariable() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  String item;
-  for (item in items) {
-    print(item);
-  }
-}
-''');
-    await assertNoAssistAt('for (item', DartAssistKind.CONVERT_INTO_FOR_INDEX);
-  }
-
-  test_convertToForIndex_BAD_iterableIsNotVariable() async {
-    await resolveTestUnit('''
-main() {
-  for (String item in ['a', 'b', 'c']) {
-    print(item);
-  }
-}
-''');
-    await assertNoAssistAt(
-        'for (String', DartAssistKind.CONVERT_INTO_FOR_INDEX);
-  }
-
-  test_convertToForIndex_BAD_iterableNotList() async {
-    await resolveTestUnit('''
-main(Iterable<String> items) {
-  for (String item in items) {
-    print(item);
-  }
-}
-''');
-    await assertNoAssistAt(
-        'for (String', DartAssistKind.CONVERT_INTO_FOR_INDEX);
-  }
-
-  test_convertToForIndex_BAD_usesIJK() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (String item in items) {
-    print(item);
-    int i, j, k;
-  }
-}
-''');
-    await assertNoAssistAt(
-        'for (String', DartAssistKind.CONVERT_INTO_FOR_INDEX);
-  }
-
-  test_convertToForIndex_OK_onDeclaredIdentifier_name() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (String item in items) {
-    print(item);
-  }
-}
-''');
-    await assertHasAssistAt(
-        'item in', DartAssistKind.CONVERT_INTO_FOR_INDEX, '''
-main(List<String> items) {
-  for (int i = 0; i < items.length; i++) {
-    String item = items[i];
-    print(item);
-  }
-}
-''');
-  }
-
-  test_convertToForIndex_OK_onDeclaredIdentifier_type() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (String item in items) {
-    print(item);
-  }
-}
-''');
-    await assertHasAssistAt(
-        'tring item', DartAssistKind.CONVERT_INTO_FOR_INDEX, '''
-main(List<String> items) {
-  for (int i = 0; i < items.length; i++) {
-    String item = items[i];
-    print(item);
-  }
-}
-''');
-  }
-
-  test_convertToForIndex_OK_onFor() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (String item in items) {
-    print(item);
-  }
-}
-''');
-    await assertHasAssistAt(
-        'for (String', DartAssistKind.CONVERT_INTO_FOR_INDEX, '''
-main(List<String> items) {
-  for (int i = 0; i < items.length; i++) {
-    String item = items[i];
-    print(item);
-  }
-}
-''');
-  }
-
-  test_convertToForIndex_OK_usesI() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (String item in items) {
-    int i = 0;
-  }
-}
-''');
-    await assertHasAssistAt(
-        'for (String', DartAssistKind.CONVERT_INTO_FOR_INDEX, '''
-main(List<String> items) {
-  for (int j = 0; j < items.length; j++) {
-    String item = items[j];
-    int i = 0;
-  }
-}
-''');
-  }
-
-  test_convertToForIndex_OK_usesIJ() async {
-    await resolveTestUnit('''
-main(List<String> items) {
-  for (String item in items) {
-    print(item);
-    int i = 0, j = 1;
-  }
-}
-''');
-    await assertHasAssistAt(
-        'for (String', DartAssistKind.CONVERT_INTO_FOR_INDEX, '''
-main(List<String> items) {
-  for (int k = 0; k < items.length; k++) {
-    String item = items[k];
-    print(item);
-    int i = 0, j = 1;
-  }
-}
-''');
-  }
-
-  test_convertToFunctionSyntax_BAD_functionTypeAlias_insideParameterList() async {
-    await resolveTestUnit('''
-typedef String F(int x, int y);
-''');
-    await assertNoAssistAt(
-        'x,', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX);
-  }
-
-  test_convertToFunctionSyntax_BAD_functionTypeAlias_noParameterTypes() async {
-    await resolveTestUnit('''
-typedef String F(x);
-''');
-    await assertNoAssistAt(
-        'def', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX);
-  }
-
-  test_convertToFunctionSyntax_BAD_functionTypedParameter_insideParameterList() async {
-    await resolveTestUnit('''
-g(String f(int x, int y)) {}
-''');
-    await assertNoAssistAt(
-        'x,', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX);
-  }
-
-  test_convertToFunctionSyntax_BAD_functionTypedParameter_noParameterTypes() async {
-    await resolveTestUnit('''
-g(String f(x)) {}
-''');
-    await assertNoAssistAt(
-        'f(', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX);
-  }
-
-  test_convertToFunctionSyntax_OK_functionTypeAlias_noReturnType_noTypeParameters() async {
-    await resolveTestUnit('''
-typedef String F(int x);
-''');
-    await assertHasAssistAt(
-        'def', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX, '''
-typedef F = String Function(int x);
-''');
-  }
-
-  test_convertToFunctionSyntax_OK_functionTypeAlias_noReturnType_typeParameters() async {
-    await resolveTestUnit('''
-typedef F<P, R>(P x);
-''');
-    await assertHasAssistAt(
-        'def', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX, '''
-typedef F<P, R> = Function(P x);
-''');
-  }
-
-  test_convertToFunctionSyntax_OK_functionTypeAlias_returnType_noTypeParameters() async {
-    await resolveTestUnit('''
-typedef String F(int x);
-''');
-    await assertHasAssistAt(
-        'def', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX, '''
-typedef F = String Function(int x);
-''');
-  }
-
-  test_convertToFunctionSyntax_OK_functionTypeAlias_returnType_typeParameters() async {
-    await resolveTestUnit('''
-typedef R F<P, R>(P x);
-''');
-    await assertHasAssistAt(
-        'def', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX, '''
-typedef F<P, R> = R Function(P x);
-''');
-  }
-
-  test_convertToFunctionSyntax_OK_functionTypedParameter_noReturnType_noTypeParameters() async {
-    await resolveTestUnit('''
-g(f(int x)) {}
-''');
-    await assertHasAssistAt(
-        'f(', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX, '''
-g(Function(int x) f) {}
-''');
-  }
-
-  test_convertToFunctionSyntax_OK_functionTypedParameter_returnType() async {
-    await resolveTestUnit('''
-g(String f(int x)) {}
-''');
-    await assertHasAssistAt(
-        'f(', DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX, '''
-g(String Function(int x) f) {}
-''');
-  }
-
-  test_convertToGetter_BAD_noInitializer() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-class A {
-  final int foo;
-}
-''');
-    await assertNoAssistAt('foo', DartAssistKind.CONVERT_INTO_GETTER);
-  }
-
-  test_convertToGetter_BAD_notFinal() async {
-    await resolveTestUnit('''
-class A {
-  int foo = 1;
-}
-''');
-    await assertNoAssistAt('foo', DartAssistKind.CONVERT_INTO_GETTER);
-  }
-
-  test_convertToGetter_BAD_notSingleField() async {
-    await resolveTestUnit('''
-class A {
-  final int foo = 1, bar = 2;
-}
-''');
-    await assertNoAssistAt('foo', DartAssistKind.CONVERT_INTO_GETTER);
-  }
-
-  test_convertToGetter_OK() async {
-    await resolveTestUnit('''
-const myAnnotation = const Object();
-class A {
-  @myAnnotation
-  final int foo = 1 + 2;
-}
-''');
-    await assertHasAssistAt('foo =', DartAssistKind.CONVERT_INTO_GETTER, '''
-const myAnnotation = const Object();
-class A {
-  @myAnnotation
-  int get foo => 1 + 2;
-}
-''');
-  }
-
-  test_convertToGetter_OK_noType() async {
-    await resolveTestUnit('''
-class A {
-  final foo = 42;
-}
-''');
-    await assertHasAssistAt('foo =', DartAssistKind.CONVERT_INTO_GETTER, '''
-class A {
-  get foo => 42;
-}
-''');
-  }
-
-  test_convertToIntLiteral() async {
-    await resolveTestUnit('''
-const double myDouble = 42.0;
-''');
-    await assertHasAssistAt('42.0', DartAssistKind.CONVERT_TO_INT_LITERAL, '''
-const double myDouble = 42;
-''');
-  }
-
-  test_convertToIntLiteral_e() async {
-    await resolveTestUnit('''
-const double myDouble = 4.2e1;
-''');
-    await assertHasAssistAt('4.2e1', DartAssistKind.CONVERT_TO_INT_LITERAL, '''
-const double myDouble = 42;
-''');
-  }
-
-  test_convertToIntLiteral_eBig() async {
-    await resolveTestUnit('''
-const double myDouble = 4.2e99999;
-''');
-    await assertNoAssistAt('4.2e99999', DartAssistKind.CONVERT_TO_INT_LITERAL);
-  }
-
-  test_convertToIntLiteral_notDouble() async {
-    await resolveTestUnit('''
-const double myDouble = 42;
-''');
-    await assertNoAssistAt('42', DartAssistKind.CONVERT_TO_INT_LITERAL);
-  }
-
-  test_convertToIsNot_BAD_is_alreadyIsNot() async {
-    await resolveTestUnit('''
-main(p) {
-  p is! String;
-}
-''');
-    await assertNoAssistAt('is!', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_BAD_is_noEnclosingParenthesis() async {
-    await resolveTestUnit('''
-main(p) {
-  p is String;
-}
-''');
-    await assertNoAssistAt('is String', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_BAD_is_noPrefix() async {
-    await resolveTestUnit('''
-main(p) {
-  (p is String);
-}
-''');
-    await assertNoAssistAt('is String', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_BAD_is_notIsExpression() async {
-    await resolveTestUnit('''
-main(p) {
-  123 + 456;
-}
-''');
-    await assertNoAssistAt('123 +', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_BAD_is_notTheNotOperator() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-main(p) {
-  ++(p is String);
-}
-''');
-    await assertNoAssistAt('is String', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_BAD_not_alreadyIsNot() async {
-    await resolveTestUnit('''
-main(p) {
-  !(p is! String);
-}
-''');
-    await assertNoAssistAt('!(p', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_BAD_not_noEnclosingParenthesis() async {
-    await resolveTestUnit('''
-main(p) {
-  !p;
-}
-''');
-    await assertNoAssistAt('!p', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_BAD_not_notIsExpression() async {
-    await resolveTestUnit('''
-main(p) {
-  !(p == null);
-}
-''');
-    await assertNoAssistAt('!(p', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_BAD_not_notTheNotOperator() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-main(p) {
-  ++(p is String);
-}
-''');
-    await assertNoAssistAt('++(', DartAssistKind.CONVERT_INTO_IS_NOT);
-  }
-
-  test_convertToIsNot_OK_childOfIs_left() async {
-    await resolveTestUnit('''
-main(p) {
-  !(p is String);
-}
-''');
-    await assertHasAssistAt('p is', DartAssistKind.CONVERT_INTO_IS_NOT, '''
-main(p) {
-  p is! String;
-}
-''');
-  }
-
-  test_convertToIsNot_OK_childOfIs_right() async {
-    await resolveTestUnit('''
-main(p) {
-  !(p is String);
-}
-''');
-    await assertHasAssistAt('String)', DartAssistKind.CONVERT_INTO_IS_NOT, '''
-main(p) {
-  p is! String;
-}
-''');
-  }
-
-  test_convertToIsNot_OK_is() async {
-    await resolveTestUnit('''
-main(p) {
-  !(p is String);
-}
-''');
-    await assertHasAssistAt('is String', DartAssistKind.CONVERT_INTO_IS_NOT, '''
-main(p) {
-  p is! String;
-}
-''');
-  }
-
-  test_convertToIsNot_OK_is_higherPrecedencePrefix() async {
-    await resolveTestUnit('''
-main(p) {
-  !!(p is String);
-}
-''');
-    await assertHasAssistAt('is String', DartAssistKind.CONVERT_INTO_IS_NOT, '''
-main(p) {
-  !(p is! String);
-}
-''');
-  }
-
-  test_convertToIsNot_OK_is_not_higherPrecedencePrefix() async {
-    await resolveTestUnit('''
-main(p) {
-  !!(p is String);
-}
-''');
-    await assertHasAssistAt('!(p', DartAssistKind.CONVERT_INTO_IS_NOT, '''
-main(p) {
-  !(p is! String);
-}
-''');
-  }
-
-  test_convertToIsNot_OK_not() async {
-    await resolveTestUnit('''
-main(p) {
-  !(p is String);
-}
-''');
-    await assertHasAssistAt('!(p', DartAssistKind.CONVERT_INTO_IS_NOT, '''
-main(p) {
-  p is! String;
-}
-''');
-  }
-
-  test_convertToIsNot_OK_parentheses() async {
-    await resolveTestUnit('''
-main(p) {
-  !(p is String);
-}
-''');
-    await assertHasAssistAt('(p is', DartAssistKind.CONVERT_INTO_IS_NOT, '''
-main(p) {
-  p is! String;
-}
-''');
-  }
-
-  test_convertToIsNotEmpty_BAD_noBang() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-main(String str) {
-  ~str.isEmpty;
-}
-''');
-    await assertNoAssistAt(
-        'isEmpty;', DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY);
-  }
-
-  test_convertToIsNotEmpty_BAD_noIsNotEmpty() async {
-    await resolveTestUnit('''
-class A {
-  bool get isEmpty => false;
-}
-main(A a) {
-  !a.isEmpty;
-}
-''');
-    await assertNoAssistAt(
-        'isEmpty;', DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY);
-  }
-
-  test_convertToIsNotEmpty_BAD_notInPrefixExpression() async {
-    await resolveTestUnit('''
-main(String str) {
-  str.isEmpty;
-}
-''');
-    await assertNoAssistAt(
-        'isEmpty;', DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY);
-  }
-
-  test_convertToIsNotEmpty_BAD_notIsEmpty() async {
-    await resolveTestUnit('''
-main(int p) {
-  !p.isEven;
-}
-''');
-    await assertNoAssistAt('isEven;', DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY);
-  }
-
-  test_convertToIsNotEmpty_OK_on_isEmpty() async {
-    await resolveTestUnit('''
-main(String str) {
-  !str.isEmpty;
-}
-''');
-    await assertHasAssistAt(
-        'isEmpty', DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY, '''
-main(String str) {
-  str.isNotEmpty;
-}
-''');
-  }
-
-  test_convertToIsNotEmpty_OK_on_str() async {
-    await resolveTestUnit('''
-main(String str) {
-  !str.isEmpty;
-}
-''');
-    await assertHasAssistAt(
-        'str.', DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY, '''
-main(String str) {
-  str.isNotEmpty;
-}
-''');
-  }
-
-  test_convertToIsNotEmpty_OK_propertyAccess() async {
-    await resolveTestUnit('''
-main(String str) {
-  !'text'.isEmpty;
-}
-''');
-    await assertHasAssistAt(
-        'isEmpty', DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY, '''
-main(String str) {
-  'text'.isNotEmpty;
-}
-''');
-  }
-
-  test_convertToNormalParameter_OK_dynamic() async {
-    await resolveTestUnit('''
-class A {
-  var test;
-  A(this.test) {
-  }
-}
-''');
-    await assertHasAssistAt(
-        'test)', DartAssistKind.CONVERT_TO_NORMAL_PARAMETER, '''
-class A {
-  var test;
-  A(test) : test = test {
-  }
-}
-''');
-  }
-
-  test_convertToNormalParameter_OK_firstInitializer() async {
-    await resolveTestUnit('''
-class A {
-  int test;
-  A(this.test) {
-  }
-}
-''');
-    await assertHasAssistAt(
-        'test)', DartAssistKind.CONVERT_TO_NORMAL_PARAMETER, '''
-class A {
-  int test;
-  A(int test) : test = test {
-  }
-}
-''');
-  }
-
-  test_convertToNormalParameter_OK_secondInitializer() async {
-    await resolveTestUnit('''
-class A {
-  double aaa;
-  int bbb;
-  A(this.bbb) : aaa = 1.0;
-}
-''');
-    await assertHasAssistAt(
-        'bbb)', DartAssistKind.CONVERT_TO_NORMAL_PARAMETER, '''
-class A {
-  double aaa;
-  int bbb;
-  A(int bbb) : aaa = 1.0, bbb = bbb;
-}
-''');
-  }
-
-  test_convertToSingleQuotedString_BAD_one_embeddedTarget() async {
-    await resolveTestUnit('''
-main() {
-  print("a'b'c");
-}
-''');
-    await assertNoAssistAt(
-        '"a', DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING);
-  }
-
-  test_convertToSingleQuotedString_BAD_one_enclosingTarget() async {
-    await resolveTestUnit('''
-main() {
-  print('abc');
-}
-''');
-    await assertNoAssistAt(
-        "'ab", DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING);
-  }
-
-  test_convertToSingleQuotedString_BAD_three_embeddedTarget() async {
-    await resolveTestUnit('''
-main() {
-  print("""a''\'bc""");
-}
-''');
-    await assertNoAssistAt(
-        '"a', DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING);
-  }
-
-  test_convertToSingleQuotedString_BAD_three_enclosingTarget() async {
-    await resolveTestUnit("""
-main() {
-  print('''abc''');
-}
-""");
-    await assertNoAssistAt(
-        "'ab", DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING);
-  }
-
-  test_convertToSingleQuotedString_OK_one_interpolation() async {
-    await resolveTestUnit(r'''
-main() {
-  var b = 'b';
-  var c = 'c';
-  print("a $b-${c} d");
-}
-''');
-    await assertHasAssistAt(
-        r'"a $b', DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING, r'''
-main() {
-  var b = 'b';
-  var c = 'c';
-  print('a $b-${c} d');
-}
-''');
-  }
-
-  test_convertToSingleQuotedString_OK_one_raw() async {
-    await resolveTestUnit('''
-main() {
-  print(r"abc");
-}
-''');
-    await assertHasAssistAt(
-        '"ab', DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING, '''
-main() {
-  print(r'abc');
-}
-''');
-  }
-
-  test_convertToSingleQuotedString_OK_one_simple() async {
-    await resolveTestUnit('''
-main() {
-  print("abc");
-}
-''');
-    await assertHasAssistAt(
-        '"ab', DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING, '''
-main() {
-  print('abc');
-}
-''');
-  }
-
-  test_convertToSingleQuotedString_OK_three_interpolation() async {
-    await resolveTestUnit(r'''
-main() {
-  var b = 'b';
-  var c = 'c';
-  print("""a $b-${c} d""");
-}
-''');
-    await assertHasAssistAt(
-        r'"a $b', DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING, r"""
-main() {
-  var b = 'b';
-  var c = 'c';
-  print('''a $b-${c} d''');
-}
-""");
-  }
-
-  test_convertToSingleQuotedString_OK_three_raw() async {
-    await resolveTestUnit('''
-main() {
-  print(r"""abc""");
-}
-''');
-    await assertHasAssistAt(
-        '"ab', DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING, """
-main() {
-  print(r'''abc''');
-}
-""");
-  }
-
-  test_convertToSingleQuotedString_OK_three_simple() async {
-    await resolveTestUnit('''
-main() {
-  print("""abc""");
-}
-''');
-    await assertHasAssistAt(
-        '"ab', DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING, """
-main() {
-  print('''abc''');
-}
-""");
-  }
-
-  test_encapsulateField_BAD_alreadyPrivate() async {
-    await resolveTestUnit('''
-class A {
-  int _test = 42;
-}
-main(A a) {
-  print(a._test);
-}
-''');
-    await assertNoAssistAt('_test =', DartAssistKind.ENCAPSULATE_FIELD);
-  }
-
-  test_encapsulateField_BAD_final() async {
-    await resolveTestUnit('''
-class A {
-  final int test = 42;
-}
-''');
-    await assertNoAssistAt('test =', DartAssistKind.ENCAPSULATE_FIELD);
-  }
-
-  test_encapsulateField_BAD_multipleFields() async {
-    await resolveTestUnit('''
-class A {
-  int aaa, bbb, ccc;
-}
-main(A a) {
-  print(a.bbb);
-}
-''');
-    await assertNoAssistAt('bbb, ', DartAssistKind.ENCAPSULATE_FIELD);
-  }
-
-  test_encapsulateField_BAD_notOnName() async {
-    await resolveTestUnit('''
-class A {
-  int test = 1 + 2 + 3;
-}
-''');
-    await assertNoAssistAt('+ 2', DartAssistKind.ENCAPSULATE_FIELD);
-  }
-
-  test_encapsulateField_BAD_parseError() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-class A {
-  int; // marker
-}
-main(A a) {
-  print(a.test);
-}
-''');
-    await assertNoAssistAt('; // marker', DartAssistKind.ENCAPSULATE_FIELD);
-  }
-
-  test_encapsulateField_BAD_static() async {
-    await resolveTestUnit('''
-class A {
-  static int test = 42;
-}
-''');
-    await assertNoAssistAt('test =', DartAssistKind.ENCAPSULATE_FIELD);
-  }
-
-  test_encapsulateField_OK_documentation() async {
-    await resolveTestUnit('''
-class A {
-  /// AAA
-  /// BBB
-  int test;
-}
-''');
-    await assertHasAssistAt('test;', DartAssistKind.ENCAPSULATE_FIELD, '''
-class A {
-  /// AAA
-  /// BBB
-  int _test;
-
-  /// AAA
-  /// BBB
-  int get test => _test;
-
-  /// AAA
-  /// BBB
-  set test(int test) {
-    _test = test;
-  }
-}
-''');
-  }
-
-  test_encapsulateField_OK_hasType() async {
-    await resolveTestUnit('''
-class A {
-  int test = 42;
-  A(this.test);
-}
-main(A a) {
-  print(a.test);
-}
-''');
-    await assertHasAssistAt('test = 42', DartAssistKind.ENCAPSULATE_FIELD, '''
-class A {
-  int _test = 42;
-
-  int get test => _test;
-
-  set test(int test) {
-    _test = test;
-  }
-  A(this._test);
-}
-main(A a) {
-  print(a.test);
-}
-''');
-  }
-
-  test_encapsulateField_OK_noType() async {
-    await resolveTestUnit('''
-class A {
-  var test = 42;
-}
-main(A a) {
-  print(a.test);
-}
-''');
-    await assertHasAssistAt('test = 42', DartAssistKind.ENCAPSULATE_FIELD, '''
-class A {
-  var _test = 42;
-
-  get test => _test;
-
-  set test(test) {
-    _test = test;
-  }
-}
-main(A a) {
-  print(a.test);
-}
-''');
-  }
-
-  test_exchangeBinaryExpressionArguments_BAD_extraLength() async {
-    await resolveTestUnit('''
-main() {
-  111 + 222;
-}
-''');
-    length = 3;
-    await assertNoAssistAt('+ 222', DartAssistKind.EXCHANGE_OPERANDS);
-  }
-
-  test_exchangeBinaryExpressionArguments_BAD_onOperand() async {
-    await resolveTestUnit('''
-main() {
-  111 + 222;
-}
-''');
-    length = 3;
-    await assertNoAssistAt('11 +', DartAssistKind.EXCHANGE_OPERANDS);
-  }
-
-  test_exchangeBinaryExpressionArguments_BAD_selectionWithBinary() async {
-    await resolveTestUnit('''
-main() {
-  1 + 2 + 3;
-}
-''');
-    length = '1 + 2 + 3'.length;
-    await assertNoAssistAt('1 + 2 + 3', DartAssistKind.EXCHANGE_OPERANDS);
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_compare() async {
-    const initialOperators = const ['<', '<=', '>', '>='];
-    const resultOperators = const ['>', '>=', '<', '<='];
-    for (int i = 0; i <= 0; i++) {
-      String initialOperator = initialOperators[i];
-      String resultOperator = resultOperators[i];
-      await resolveTestUnit('''
-bool main(int a, int b) {
-  return a $initialOperator b;
-}
-''');
-      await assertHasAssistAt(
-          initialOperator, DartAssistKind.EXCHANGE_OPERANDS, '''
-bool main(int a, int b) {
-  return b $resultOperator a;
-}
-''');
-    }
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_extended_mixOperator_1() async {
-    await resolveTestUnit('''
-main() {
-  1 * 2 * 3 + 4;
-}
-''');
-    await assertHasAssistAt('* 2', DartAssistKind.EXCHANGE_OPERANDS, '''
-main() {
-  2 * 3 * 1 + 4;
-}
-''');
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_extended_mixOperator_2() async {
-    await resolveTestUnit('''
-main() {
-  1 + 2 - 3 + 4;
-}
-''');
-    await assertHasAssistAt('+ 2', DartAssistKind.EXCHANGE_OPERANDS, '''
-main() {
-  2 + 1 - 3 + 4;
-}
-''');
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_extended_sameOperator_afterFirst() async {
-    await resolveTestUnit('''
-main() {
-  1 + 2 + 3;
-}
-''');
-    await assertHasAssistAt('+ 2', DartAssistKind.EXCHANGE_OPERANDS, '''
-main() {
-  2 + 3 + 1;
-}
-''');
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_extended_sameOperator_afterSecond() async {
-    await resolveTestUnit('''
-main() {
-  1 + 2 + 3;
-}
-''');
-    await assertHasAssistAt('+ 3', DartAssistKind.EXCHANGE_OPERANDS, '''
-main() {
-  3 + 1 + 2;
-}
-''');
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_simple_afterOperator() async {
-    await resolveTestUnit('''
-main() {
-  1 + 2;
-}
-''');
-    await assertHasAssistAt(' 2', DartAssistKind.EXCHANGE_OPERANDS, '''
-main() {
-  2 + 1;
-}
-''');
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_simple_beforeOperator() async {
-    await resolveTestUnit('''
-main() {
-  1 + 2;
-}
-''');
-    await assertHasAssistAt('+ 2', DartAssistKind.EXCHANGE_OPERANDS, '''
-main() {
-  2 + 1;
-}
-''');
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_simple_fullSelection() async {
-    await resolveTestUnit('''
-main() {
-  1 + 2;
-}
-''');
-    length = '1 + 2'.length;
-    await assertHasAssistAt('1 + 2', DartAssistKind.EXCHANGE_OPERANDS, '''
-main() {
-  2 + 1;
-}
-''');
-  }
-
-  test_exchangeBinaryExpressionArguments_OK_simple_withLength() async {
-    await resolveTestUnit('''
-main() {
-  1 + 2;
-}
-''');
-    length = 2;
-    await assertHasAssistAt('+ 2', DartAssistKind.EXCHANGE_OPERANDS, '''
-main() {
-  2 + 1;
-}
-''');
-  }
-
-  test_flutterConvertToChildren_BAD_childUnresolved() async {
-    addFlutterPackage();
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  return new Row(
-    /*caret*/child: new Container()
-  );
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_CONVERT_TO_CHILDREN);
-  }
-
-  test_flutterConvertToChildren_BAD_notOnChild() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-    body: /*caret*/new Center(
-      child: new Container(),
-    ),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_CONVERT_TO_CHILDREN);
-  }
-
-  test_flutterConvertToChildren_OK_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new Center(
-      /*caret*/child: new Container(
-        width: 200.0,
-        height: 300.0,
-      ),
-      key: null,
-    ),
-// end
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_CONVERT_TO_CHILDREN, '''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new Center(
-      /*caret*/children: <Widget>[
-        new Container(
-          width: 200.0,
-          height: 300.0,
-        ),
-      ],
-      key: null,
-    ),
-// end
-  );
-}
-''');
-  }
-
-  test_flutterConvertToChildren_OK_newlineChild() async {
-    // This case could occur with deeply nested constructors, common in Flutter.
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new Center(
-      /*caret*/child:
-          new Container(
-        width: 200.0,
-        height: 300.0,
-      ),
-      key: null,
-    ),
-// end
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_CONVERT_TO_CHILDREN, '''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new Center(
-      /*caret*/children: <Widget>[
-        new Container(
-          width: 200.0,
-          height: 300.0,
-        ),
-      ],
-      key: null,
-    ),
-// end
-  );
-}
-''');
-  }
-
-  test_flutterConvertToChildren_OK_singleLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new Center(
-      /*caret*/child: new GestureDetector(),
-      key: null,
-    ),
-// end
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_CONVERT_TO_CHILDREN, '''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new Center(
-      /*caret*/children: <Widget>[new GestureDetector()],
-      key: null,
-    ),
-// end
-  );
-}
-''');
-  }
-
-  test_flutterConvertToStatefulWidget_BAD_notClass() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-/*caret*/main() {}
-''');
-    _setCaretLocation();
-    assertNoAssist(DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET);
-  }
-
-  test_flutterConvertToStatefulWidget_BAD_notStatelessWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-class /*caret*/MyWidget extends Text {
-  MyWidget() : super('');
-}
-''');
-    _setCaretLocation();
-    assertNoAssist(DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET);
-  }
-
-  test_flutterConvertToStatefulWidget_BAD_notWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-class /*caret*/MyWidget {}
-''');
-    _setCaretLocation();
-    assertNoAssist(DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET);
-  }
-
-  test_flutterConvertToStatefulWidget_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatelessWidget {
-  final String aaa;
-  final String bbb;
-
-  const MyWidget(this.aaa, this.bbb);
-
-  @override
-  Widget build(BuildContext context) {
-    return new Row(
-      children: [
-        new Text(aaa),
-        new Text(bbb),
-        new Text('$aaa'),
-        new Text('${bbb}'),
-      ],
-    );
-  }
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(
-        DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET, r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatefulWidget {
-  final String aaa;
-  final String bbb;
-
-  const MyWidget(this.aaa, this.bbb);
-
-  @override
-  MyWidgetState createState() {
-    return new MyWidgetState();
-  }
-}
-
-class MyWidgetState extends State<MyWidget> {
-  @override
-  Widget build(BuildContext context) {
-    return new Row(
-      children: [
-        new Text(widget.aaa),
-        new Text(widget.bbb),
-        new Text('${widget.aaa}'),
-        new Text('${widget.bbb}'),
-      ],
-    );
-  }
-}
-''');
-  }
-
-  test_flutterConvertToStatefulWidget_OK_empty() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatelessWidget {
-  @override
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(
-        DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET, r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatefulWidget {
-  @override
-  MyWidgetState createState() {
-    return new MyWidgetState();
-  }
-}
-
-class MyWidgetState extends State<MyWidget> {
-  @override
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-  }
-
-  test_flutterConvertToStatefulWidget_OK_fields() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatelessWidget {
-  static String staticField1;
-  final String instanceField1;
-  final String instanceField2;
-  String instanceField3;
-  static String staticField2;
-  String instanceField4;
-  String instanceField5;
-  static String staticField3;
-
-  MyWidget(this.instanceField1) : instanceField2 = '' {
-    instanceField3 = '';
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    instanceField4 = instanceField1;
-    return new Row(
-      children: [
-        new Text(instanceField1),
-        new Text(instanceField2),
-        new Text(instanceField3),
-        new Text(instanceField4),
-        new Text(instanceField5),
-        new Text(staticField1),
-        new Text(staticField2),
-        new Text(staticField3),
-      ],
-    );
-  }
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(
-        DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET, r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatefulWidget {
-  static String staticField1;
-  final String instanceField1;
-  final String instanceField2;
-  String instanceField3;
-  static String staticField2;
-  static String staticField3;
-
-  MyWidget(this.instanceField1) : instanceField2 = '' {
-    instanceField3 = '';
-  }
-
-  @override
-  MyWidgetState createState() {
-    return new MyWidgetState();
-  }
-}
-
-class MyWidgetState extends State<MyWidget> {
-  String instanceField4;
-
-  String instanceField5;
-
-  @override
-  Widget build(BuildContext context) {
-    instanceField4 = widget.instanceField1;
-    return new Row(
-      children: [
-        new Text(widget.instanceField1),
-        new Text(widget.instanceField2),
-        new Text(widget.instanceField3),
-        new Text(instanceField4),
-        new Text(instanceField5),
-        new Text(MyWidget.staticField1),
-        new Text(MyWidget.staticField2),
-        new Text(MyWidget.staticField3),
-      ],
-    );
-  }
-}
-''');
-  }
-
-  test_flutterConvertToStatefulWidget_OK_getters() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatelessWidget {
-  @override
-  Widget build(BuildContext context) {
-    return new Row(
-      children: [
-        new Text(staticGetter1),
-        new Text(staticGetter2),
-        new Text(instanceGetter1),
-        new Text(instanceGetter2),
-      ],
-    );
-  }
-
-  static String get staticGetter1 => '';
-
-  String get instanceGetter1 => '';
-
-  static String get staticGetter2 => '';
-
-  String get instanceGetter2 => '';
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(
-        DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET, r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatefulWidget {
-  @override
-  MyWidgetState createState() {
-    return new MyWidgetState();
-  }
-
-  static String get staticGetter1 => '';
-
-  static String get staticGetter2 => '';
-}
-
-class MyWidgetState extends State<MyWidget> {
-  @override
-  Widget build(BuildContext context) {
-    return new Row(
-      children: [
-        new Text(MyWidget.staticGetter1),
-        new Text(MyWidget.staticGetter2),
-        new Text(instanceGetter1),
-        new Text(instanceGetter2),
-      ],
-    );
-  }
-
-  String get instanceGetter1 => '';
-
-  String get instanceGetter2 => '';
-}
-''');
-  }
-
-  test_flutterConvertToStatefulWidget_OK_methods() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatelessWidget {
-  static String staticField;
-  final String instanceField1;
-  String instanceField2;
-
-  MyWidget(this.instanceField1);
-
-  @override
-  Widget build(BuildContext context) {
-    return new Row(
-      children: [
-        new Text(instanceField1),
-        new Text(instanceField2),
-        new Text(staticField),
-      ],
-    );
-  }
-
-  void instanceMethod1() {
-    instanceMethod1();
-    instanceMethod2();
-    staticMethod1();
-  }
-
-  static void staticMethod1() {
-    print('static 1');
-  }
-
-  void instanceMethod2() {
-    print('instance 2');
-  }
-
-  static void staticMethod2() {
-    print('static 2');
-  }
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(
-        DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET, r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatefulWidget {
-  static String staticField;
-  final String instanceField1;
-
-  MyWidget(this.instanceField1);
-
-  @override
-  MyWidgetState createState() {
-    return new MyWidgetState();
-  }
-
-  static void staticMethod1() {
-    print('static 1');
-  }
-
-  static void staticMethod2() {
-    print('static 2');
-  }
-}
-
-class MyWidgetState extends State<MyWidget> {
-  String instanceField2;
-
-  @override
-  Widget build(BuildContext context) {
-    return new Row(
-      children: [
-        new Text(widget.instanceField1),
-        new Text(instanceField2),
-        new Text(MyWidget.staticField),
-      ],
-    );
-  }
-
-  void instanceMethod1() {
-    instanceMethod1();
-    instanceMethod2();
-    MyWidget.staticMethod1();
-  }
-
-  void instanceMethod2() {
-    print('instance 2');
-  }
-}
-''');
-  }
-
-  test_flutterConvertToStatefulWidget_OK_tail() async {
-    addFlutterPackage();
-    await resolveTestUnit(r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatelessWidget {
-  @override
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(
-        DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET, r'''
-import 'package:flutter/material.dart';
-
-class /*caret*/MyWidget extends StatefulWidget {
-  @override
-  MyWidgetState createState() {
-    return new MyWidgetState();
-  }
-}
-
-class MyWidgetState extends State<MyWidget> {
-  @override
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-  }
-
-  test_flutterMoveWidgetDown_BAD_last() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('aaa'),
-      new Text('bbb'),
-      /*caret*/new Text('ccc'),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_MOVE_DOWN);
-  }
-
-  test_flutterMoveWidgetDown_BAD_notInList() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Center(
-    child: /*caret*/new Text('aaa'),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_MOVE_DOWN);
-  }
-
-  test_flutterMoveWidgetDown_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('aaa'),
-      /*caret*/new Text('bbbbbb'),
-      new Text('ccccccccc'),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_MOVE_DOWN, '''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('aaa'),
-      /*caret*/new Text('ccccccccc'),
-      new Text('bbbbbb'),
-    ],
-  );
-}
-''');
-    _assertExitPosition(before: "new Text('bbbbbb')");
-  }
-
-  test_flutterMoveWidgetUp_BAD_first() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      /*caret*/new Text('aaa'),
-      new Text('bbb'),
-      new Text('ccc'),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_MOVE_UP);
-  }
-
-  test_flutterMoveWidgetUp_BAD_notInList() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Center(
-    child: /*caret*/new Text('aaa'),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_MOVE_UP);
-  }
-
-  test_flutterMoveWidgetUp_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('aaa'),
-      /*caret*/new Text('bbbbbb'),
-      new Text('ccccccccc'),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_MOVE_UP, '''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('bbbbbb'),
-      /*caret*/new Text('aaa'),
-      new Text('ccccccccc'),
-    ],
-  );
-}
-''');
-    _assertExitPosition(before: "new Text('bbbbbb')");
-  }
-
-  test_flutterRemoveWidget_BAD_childrenMultipleIntoChild() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Center(
-    child: new /*caret*/Row(
-      children: [
-        new Text('aaa'),
-        new Text('bbb'),
-      ],
-    ),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_REMOVE_WIDGET);
-  }
-
-  test_flutterRemoveWidget_OK_childIntoChild_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Center(
-        child: new /*caret*/Padding(
-          padding: const EdgeInsets.all(8.0),
-          child: new Center(
-            heightFactor: 0.5,
-            child: new Text('foo'),
-          ),
-        ),
-      ),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_REMOVE_WIDGET, '''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Center(
-        child: new Center(
-          heightFactor: 0.5,
-          child: new Text('foo'),
-        ),
-      ),
-    ],
-  );
-}
-''');
-  }
-
-  test_flutterRemoveWidget_OK_childIntoChild_singleLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Padding(
-    padding: const EdgeInsets.all(8.0),
-    child: new /*caret*/Center(
-      heightFactor: 0.5,
-      child: new Text('foo'),
-    ),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_REMOVE_WIDGET, '''
-import 'package:flutter/material.dart';
-main() {
-  new Padding(
-    padding: const EdgeInsets.all(8.0),
-    child: new Text('foo'),
-  );
-}
-''');
-  }
-
-  test_flutterRemoveWidget_OK_childIntoChildren() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('foo'),
-      new /*caret*/Center(
-        heightFactor: 0.5,
-        child: new Padding(
-          padding: const EdgeInsets.all(8.0),
-          child: new Text('bar'),
-        ),
-      ),
-      new Text('baz'),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_REMOVE_WIDGET, '''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('foo'),
-      new Padding(
-        padding: const EdgeInsets.all(8.0),
-        child: new Text('bar'),
-      ),
-      new Text('baz'),
-    ],
-  );
-}
-''');
-  }
-
-  test_flutterRemoveWidget_OK_childrenOneIntoChild() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Center(
-    child: /*caret*/new Column(
-      children: [
-        new Text('foo'),
-      ],
-    ),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_REMOVE_WIDGET, '''
-import 'package:flutter/material.dart';
-main() {
-  new Center(
-    child: /*caret*/new Text('foo'),
-  );
-}
-''');
-  }
-
-  test_flutterRemoveWidget_OK_childrenOneIntoReturn() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  return /*caret*/new Column(
-    children: [
-      new Text('foo'),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_REMOVE_WIDGET, '''
-import 'package:flutter/material.dart';
-main() {
-  return /*caret*/new Text('foo');
-}
-''');
-  }
-
-  test_flutterRemoveWidget_OK_intoChildren() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('aaa'),
-      new /*caret*/Column(
-        children: [
-          new Row(
-            children: [
-              new Text('bbb'),
-              new Text('ccc'),
-            ],
-          ),
-          new Row(
-            children: [
-              new Text('ddd'),
-              new Text('eee'),
-            ],
-          ),
-        ],
-      ),
-      new Text('fff'),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_REMOVE_WIDGET, '''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: <Widget>[
-      new Text('aaa'),
-      new Row(
-        children: [
-          new Text('bbb'),
-          new Text('ccc'),
-        ],
-      ),
-      new Row(
-        children: [
-          new Text('ddd'),
-          new Text('eee'),
-        ],
-      ),
-      new Text('fff'),
-    ],
-  );
-}
-''');
-  }
-
-  test_flutterSwapWithChild_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new /*caret*/GestureDetector(
-      onTap: () => startResize(),
-      child: new Center(
-        child: new Container(
-          width: 200.0,
-          height: 300.0,
-        ),
-        key: null,
-      ),
-    ),
-// end
-  );
-}
-startResize() {}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_SWAP_WITH_CHILD, '''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new Center(
-      key: null,
-      child: new /*caret*/GestureDetector(
-        onTap: () => startResize(),
-        child: new Container(
-          width: 200.0,
-          height: 300.0,
-        ),
-      ),
-    ),
-// end
-  );
-}
-startResize() {}
-''');
-  }
-
-  test_flutterSwapWithChild_OK_notFormatted() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-
-class Foo extends StatefulWidget {
-  @override
-  _State createState() => new _State();
-}
-
-class _State extends State<Foo> {
-  @override
-  Widget build(BuildContext context) {
-    return new /*caret*/Expanded(
-      flex: 2,
-      child: new GestureDetector(
-        child: new Text(
-          'foo',
-        ), onTap: () {
-          print(42);
-      },
-      ),
-    );
-  }
-}''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_SWAP_WITH_CHILD, '''
-import 'package:flutter/material.dart';
-
-class Foo extends StatefulWidget {
-  @override
-  _State createState() => new _State();
-}
-
-class _State extends State<Foo> {
-  @override
-  Widget build(BuildContext context) {
-    return new GestureDetector(
-      onTap: () {
-        print(42);
-    },
-      child: new /*caret*/Expanded(
-        flex: 2,
-        child: new Text(
-          'foo',
-        ),
-      ),
-    );
-  }
-}''');
-  }
-
-  test_flutterSwapWithParent_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new Center(
-      child: new /*caret*/GestureDetector(
-        onTap: () => startResize(),
-        child: new Container(
-          width: 200.0,
-          height: 300.0,
-        ),
-      ),
-      key: null,
-    ),
-// end
-  );
-}
-startResize() {}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_SWAP_WITH_PARENT, '''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-// start
-    body: new /*caret*/GestureDetector(
-      onTap: () => startResize(),
-      child: new Center(
-        key: null,
-        child: new Container(
-          width: 200.0,
-          height: 300.0,
-        ),
-      ),
-    ),
-// end
-  );
-}
-startResize() {}
-''');
-  }
-
-  test_flutterSwapWithParent_OK_notFormatted() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-
-class Foo extends StatefulWidget {
-  @override
-  _State createState() => new _State();
-}
-
-class _State extends State<Foo> {
-  @override
-  Widget build(BuildContext context) {
-    return new GestureDetector(
-      child: new /*caret*/Expanded(
-        child: new Text(
-          'foo',
-        ),
-        flex: 2,
-      ), onTap: () {
-        print(42);
-    },
-    );
-  }
-}''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_SWAP_WITH_PARENT, '''
-import 'package:flutter/material.dart';
-
-class Foo extends StatefulWidget {
-  @override
-  _State createState() => new _State();
-}
-
-class _State extends State<Foo> {
-  @override
-  Widget build(BuildContext context) {
-    return new /*caret*/Expanded(
-      flex: 2,
-      child: new GestureDetector(
-        onTap: () {
-          print(42);
-      },
-        child: new Text(
-          'foo',
-        ),
-      ),
-    );
-  }
-}''');
-  }
-
-  test_flutterSwapWithParent_OK_outerIsInChildren() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: [
-      new Column(
-        children: [
-          new Padding(
-            padding: new EdgeInsets.all(16.0),
-            child: new /*caret*/Center(
-              child: new Column(
-                crossAxisAlignment: CrossAxisAlignment.start,
-                children: <Widget>[],
-              ),
-            ),
-          ),
-        ],
-      ),
-    ],
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_SWAP_WITH_PARENT, '''
-import 'package:flutter/material.dart';
-main() {
-  new Column(
-    children: [
-      new Column(
-        children: [
-          new /*caret*/Center(
-            child: new Padding(
-              padding: new EdgeInsets.all(16.0),
-              child: new Column(
-                crossAxisAlignment: CrossAxisAlignment.start,
-                children: <Widget>[],
-              ),
-            ),
-          ),
-        ],
-      ),
-    ],
-  );
-}
-''');
-  }
-
-  test_flutterWrapCenter_BAD_onCenter() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/new Center();
-  }
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_WRAP_CENTER);
-  }
-
-  test_flutterWrapCenter_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/new Container();
-  }
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_CENTER, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/Center(child: new Container());
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_CENTER, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/new Center(child: new Container());
-  }
-}
-''');
-    }
-  }
-
-  test_flutterWrapCenter_OK_implicitNew() async {
-    configurePreviewDart2();
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/Container();
-  }
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_WRAP_CENTER, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/Center(child: Container());
-  }
-}
-''');
-  }
-
-  test_flutterWrapCenter_OK_namedConstructor() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.named();
-
-  Widget build(BuildContext context) => null;
-}
-
-main() {
-  return MyWidget./*caret*/named();
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_CENTER, '''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.named();
-
-  Widget build(BuildContext context) => null;
-}
-
-main() {
-  return Center(child: MyWidget./*caret*/named());
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_CENTER, '''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.named();
-
-  Widget build(BuildContext context) => null;
-}
-
-main() {
-  return new Center(child: MyWidget./*caret*/named());
-}
-''');
-    }
-  }
-
-  test_flutterWrapColumn_OK_coveredByWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Container(
-      child: new /*caret*/Text('aaa'),
-    );
-  }
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_COLUMN, '''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Container(
-      child: Column(
-        children: <Widget>[
-          new /*caret*/Text('aaa'),
-        ],
-      ),
-    );
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_COLUMN, '''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Container(
-      child: new Column(
-        children: <Widget>[
-          new /*caret*/Text('aaa'),
-        ],
-      ),
-    );
-  }
-}
-''');
-    }
-  }
-
-  test_flutterWrapColumn_OK_coversWidgets() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Row(children: [
-      new Text('aaa'),
-// start
-      new Text('bbb'),
-      new Text('ccc'),
-// end
-      new Text('ddd'),
-    ]);
-  }
-}
-''');
-    _setStartEndSelection();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_COLUMN, '''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Row(children: [
-      new Text('aaa'),
-// start
-      Column(
-        children: <Widget>[
-          new Text('bbb'),
-          new Text('ccc'),
-        ],
-      ),
-// end
-      new Text('ddd'),
-    ]);
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_COLUMN, '''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Row(children: [
-      new Text('aaa'),
-// start
-      new Column(
-        children: <Widget>[
-          new Text('bbb'),
-          new Text('ccc'),
-        ],
-      ),
-// end
-      new Text('ddd'),
-    ]);
-  }
-}
-''');
-    }
-  }
-
-  test_flutterWrapColumn_OK_implicitNew() async {
-    configurePreviewDart2();
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-main() {
-  return Container(
-    child: /*caret*/Text('aaa'),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_WRAP_COLUMN, '''
-import 'package:flutter/widgets.dart';
-
-main() {
-  return Container(
-    child: /*caret*/Column(
-      children: <Widget>[
-        Text('aaa'),
-      ],
-    ),
-  );
-}
-''');
-  }
-
-  test_flutterWrapContainer_BAD_onContainer() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-main() {
-  return /*caret*/new Container();
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_WRAP_CONTAINER);
-  }
-
-  test_flutterWrapContainer_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-main() {
-  /*caret*/new Text('a');
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_CONTAINER, '''
-import 'package:flutter/widgets.dart';
-main() {
-  /*caret*/Container(child: new Text('a'));
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_CONTAINER, '''
-import 'package:flutter/widgets.dart';
-main() {
-  /*caret*/new Center(child: new Text('a'));
-}
-''');
-    }
-  }
-
-  test_flutterWrapPadding_BAD_onPadding() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/new Padding();
-  }
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_WRAP_PADDING);
-  }
-
-  test_flutterWrapPadding_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/new Container();
-  }
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_PADDING, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/Padding(
-      padding: const EdgeInsets.all(8.0),
-      child: new Container(),
-    );
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_PADDING, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return /*caret*/new Padding(
-      padding: const EdgeInsets.all(8.0),
-      child: new Container(),
-    );
-  }
-}
-''');
-    }
-  }
-
-  test_flutterWrapRow_OK() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Column(children: [
-      new Text('aaa'),
-// start
-      new Text('bbb'),
-      new Text('ccc'),
-// end
-      new Text('ddd'),
-    ]);
-  }
-}
-''');
-    _setStartEndSelection();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_ROW, '''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Column(children: [
-      new Text('aaa'),
-// start
-      Row(
-        children: <Widget>[
-          new Text('bbb'),
-          new Text('ccc'),
-        ],
-      ),
-// end
-      new Text('ddd'),
-    ]);
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_ROW, '''
-import 'package:flutter/widgets.dart';
-
-class FakeFlutter {
-  main() {
-    return new Column(children: [
-      new Text('aaa'),
-// start
-      new Row(
-        children: <Widget>[
-          new Text('bbb'),
-          new Text('ccc'),
-        ],
-      ),
-// end
-      new Text('ddd'),
-    ]);
-  }
-}
-''');
-    }
-  }
-
-  test_flutterWrapWidget_BAD_minimal() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-/*caret*/x(){}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_WRAP_GENERIC);
-  }
-
-  test_flutterWrapWidget_BAD_multiLine() async {
-    verifyNoTestUnitErrors = false;
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Container(
-    child: new Row(
-      children: [/*caret*/
-// start
-        new Transform(),
-        new Object(),
-        new AspectRatio(),
-// end
-      ],
-    ),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_WRAP_GENERIC);
-  }
-
-  test_flutterWrapWidget_BAD_singleLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-  var obj;
-// start
-    return new Row(children: [/*caret*/ new Container()]);
-// end
-  }
-}
-''');
-    _setCaretLocation();
-    await assertNoAssist(DartAssistKind.FLUTTER_WRAP_GENERIC);
-  }
-
-  test_flutterWrapWidget_OK_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Container(
-    child: new Row(
-// start
-      children: [/*caret*/
-        new Text('111'),
-        new Text('222'),
-        new Container(),
-      ],
-// end
-    ),
-  );
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Container(
-    child: new Row(
-// start
-      children: [
-        new widget(
-          children: [/*caret*/
-            new Text('111'),
-            new Text('222'),
-            new Container(),
-          ],
-        ),
-      ],
-// end
-    ),
-  );
-}
-''');
-  }
-
-  test_flutterWrapWidget_OK_multiLines() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return new Container(
-// start
-      child: new /*caret*/DefaultTextStyle(
-        child: new Row(
-          children: <Widget>[
-            new Container(
-            ),
-          ],
-        ),
-      ),
-// end
-    );
-  }
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return new Container(
-// start
-      child: widget(
-        child: new /*caret*/DefaultTextStyle(
-          child: new Row(
-            children: <Widget>[
-              new Container(
-              ),
-            ],
-          ),
-        ),
-      ),
-// end
-    );
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return new Container(
-// start
-      child: new widget(
-        child: new /*caret*/DefaultTextStyle(
-          child: new Row(
-            children: <Widget>[
-              new Container(
-              ),
-            ],
-          ),
-        ),
-      ),
-// end
-    );
-  }
-}
-''');
-    }
-  }
-
-  test_flutterWrapWidget_OK_multiLines_eol2() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {\r
-  main() {\r
-    return new Container(\r
-// start\r
-      child: new /*caret*/DefaultTextStyle(\r
-        child: new Row(\r
-          children: <Widget>[\r
-            new Container(\r
-            ),\r
-          ],\r
-        ),\r
-      ),\r
-// end\r
-    );\r
-  }\r
-}\r
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {\r
-  main() {\r
-    return new Container(\r
-// start\r
-      child: widget(\r
-        child: new /*caret*/DefaultTextStyle(\r
-          child: new Row(\r
-            children: <Widget>[\r
-              new Container(\r
-              ),\r
-            ],\r
-          ),\r
-        ),\r
-      ),\r
-// end\r
-    );\r
-  }\r
-}\r
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {\r
-  main() {\r
-    return new Container(\r
-// start\r
-      child: new widget(\r
-        child: new /*caret*/DefaultTextStyle(\r
-          child: new Row(\r
-            children: <Widget>[\r
-              new Container(\r
-              ),\r
-            ],\r
-          ),\r
-        ),\r
-      ),\r
-// end\r
-    );\r
-  }\r
-}\r
-''');
-    }
-  }
-
-  test_flutterWrapWidget_OK_prefixedIdentifier_identifier() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-abstract class Foo extends Widget {
-  Widget bar;
-}
-
-main(Foo foo) {
-  return foo./*caret*/bar;
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-
-abstract class Foo extends Widget {
-  Widget bar;
-}
-
-main(Foo foo) {
-  return widget(child: foo./*caret*/bar);
-}
-''');
-  }
-
-  test_flutterWrapWidget_OK_prefixedIdentifier_prefix() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-abstract class Foo extends Widget {
-  Widget bar;
-}
-
-main(Foo foo) {
-  return /*caret*/foo.bar;
-}
-''');
-    _setCaretLocation();
-    await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-
-abstract class Foo extends Widget {
-  Widget bar;
-}
-
-main(Foo foo) {
-  return /*caret*/widget(child: foo.bar);
-}
-''');
-  }
-
-  test_flutterWrapWidget_OK_singleLine1() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-// start
-    return /*caret*/new Container();
-// end
-  }
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-// start
-    return /*caret*/widget(child: new Container());
-// end
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-// start
-    return /*caret*/new widget(child: new Container());
-// end
-  }
-}
-''');
-    }
-  }
-
-  test_flutterWrapWidget_OK_singleLine2() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return new ClipRect./*caret*/rect();
-  }
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return widget(child: new ClipRect./*caret*/rect());
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    return new widget(child: new ClipRect./*caret*/rect());
-  }
-}
-''');
-    }
-  }
-
-  test_flutterWrapWidget_OK_variable() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    var container = new Container();
-    return /*caret*/container;
-  }
-}
-''');
-    _setCaretLocation();
-    if (omitNew) {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    var container = new Container();
-    return /*caret*/widget(child: container);
-  }
-}
-''');
-    } else {
-      await assertHasAssist(DartAssistKind.FLUTTER_WRAP_GENERIC, '''
-import 'package:flutter/widgets.dart';
-class FakeFlutter {
-  main() {
-    var container = new Container();
-    return /*caret*/new widget(child: container);
-  }
-}
-''');
-    }
-  }
-
-  test_importAddShow_BAD_hasShow() async {
-    await resolveTestUnit('''
-import 'dart:math' show PI;
-main() {
-  PI;
-}
-''');
-    await assertNoAssistAt('import ', DartAssistKind.IMPORT_ADD_SHOW);
-  }
-
-  test_importAddShow_BAD_unresolvedUri() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-import '/no/such/lib.dart';
-''');
-    await assertNoAssistAt('import ', DartAssistKind.IMPORT_ADD_SHOW);
-  }
-
-  test_importAddShow_BAD_unused() async {
-    await resolveTestUnit('''
-import 'dart:math';
-''');
-    await assertNoAssistAt('import ', DartAssistKind.IMPORT_ADD_SHOW);
-  }
-
-  test_importAddShow_OK_hasUnresolvedIdentifier() async {
-    await resolveTestUnit('''
-import 'dart:math';
-main(x) {
-  PI;
-  return x.foo();
-}
-''');
-    await assertHasAssistAt('import ', DartAssistKind.IMPORT_ADD_SHOW, '''
-import 'dart:math' show PI;
-main(x) {
-  PI;
-  return x.foo();
-}
-''');
-  }
-
-  test_importAddShow_OK_onDirective() async {
-    await resolveTestUnit('''
-import 'dart:math';
-main() {
-  PI;
-  E;
-  max(1, 2);
-}
-''');
-    await assertHasAssistAt('import ', DartAssistKind.IMPORT_ADD_SHOW, '''
-import 'dart:math' show E, PI, max;
-main() {
-  PI;
-  E;
-  max(1, 2);
-}
-''');
-  }
-
-  test_importAddShow_OK_onUri() async {
-    await resolveTestUnit('''
-import 'dart:math';
-main() {
-  PI;
-  E;
-  max(1, 2);
-}
-''');
-    await assertHasAssistAt('art:math', DartAssistKind.IMPORT_ADD_SHOW, '''
-import 'dart:math' show E, PI, max;
-main() {
-  PI;
-  E;
-  max(1, 2);
-}
-''');
-  }
-
-  test_introduceLocalTestedType_BAD_notBlock() async {
-    await resolveTestUnit('''
-main(p) {
-  if (p is String)
-    print('not a block');
-}
-''');
-    await assertNoAssistAt('if (p', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE);
-  }
-
-  test_introduceLocalTestedType_BAD_notIsExpression() async {
-    await resolveTestUnit('''
-main(p) {
-  if (p == null) {
-  }
-}
-''');
-    await assertNoAssistAt('if (p', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE);
-  }
-
-  test_introduceLocalTestedType_BAD_notStatement() async {
-    await resolveTestUnit('''
-class C {
-  bool b;
-  C(v) : b = v is int;
-}''');
-    await assertNoAssistAt('is int', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE);
-  }
-
-  test_introduceLocalTestedType_OK_if_is() async {
-    await resolveTestUnit('''
-class MyTypeName {}
-main(p) {
-  if (p is MyTypeName) {
-  }
-  p = null;
-}
-''');
-    String expected = '''
-class MyTypeName {}
-main(p) {
-  if (p is MyTypeName) {
-    MyTypeName myTypeName = p;
-  }
-  p = null;
-}
-''';
-    await assertHasAssistAt(
-        'is MyType', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE, expected);
-    _assertLinkedGroup(
-        change.linkedEditGroups[0],
-        ['myTypeName = '],
-        expectedSuggestions(LinkedEditSuggestionKind.VARIABLE,
-            ['myTypeName', 'typeName', 'name']));
-    // another good location
-    await assertHasAssistAt(
-        'if (p', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE, expected);
-  }
-
-  test_introduceLocalTestedType_OK_if_isNot() async {
-    await resolveTestUnit('''
-class MyTypeName {}
-main(p) {
-  if (p is! MyTypeName) {
-    return;
-  }
-}
-''');
-    String expected = '''
-class MyTypeName {}
-main(p) {
-  if (p is! MyTypeName) {
-    return;
-  }
-  MyTypeName myTypeName = p;
-}
-''';
-    await assertHasAssistAt(
-        'is! MyType', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE, expected);
-    _assertLinkedGroup(
-        change.linkedEditGroups[0],
-        ['myTypeName = '],
-        expectedSuggestions(LinkedEditSuggestionKind.VARIABLE,
-            ['myTypeName', 'typeName', 'name']));
-    // another good location
-    await assertHasAssistAt(
-        'if (p', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE, expected);
-  }
-
-  test_introduceLocalTestedType_OK_while() async {
-    await resolveTestUnit('''
-main(p) {
-  while (p is String) {
-  }
-  p = null;
-}
-''');
-    String expected = '''
-main(p) {
-  while (p is String) {
-    String s = p;
-  }
-  p = null;
-}
-''';
-    await assertHasAssistAt(
-        'is String', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE, expected);
-    await assertHasAssistAt(
-        'while (p', DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE, expected);
-  }
-
-  test_invalidSelection() async {
-    await resolveTestUnit('');
-    offset = -1;
-    length = 0;
-    List<Assist> assists = await _computeAssists();
-    expect(assists, isEmpty);
-  }
-
-  test_invertIfStatement_blocks() async {
-    await resolveTestUnit('''
-main() {
-  if (true) {
-    0;
-  } else {
-    1;
-  }
-}
-''');
-    await assertHasAssistAt('if (', DartAssistKind.INVERT_IF_STATEMENT, '''
-main() {
-  if (false) {
-    1;
-  } else {
-    0;
-  }
-}
-''');
-  }
-
-  test_invertIfStatement_statements() async {
-    await resolveTestUnit('''
-main() {
-  if (true)
-    0;
-  else
-    1;
-}
-''');
-    await assertHasAssistAt('if (', DartAssistKind.INVERT_IF_STATEMENT, '''
-main() {
-  if (false)
-    1;
-  else
-    0;
-}
-''');
-  }
-
-  test_joinIfStatementInner_BAD_innerNotIf() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    print(0);
-  }
-}
-''');
-    await assertNoAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER);
-  }
-
-  test_joinIfStatementInner_BAD_innerWithElse() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(0);
-    } else {
-      print(1);
-    }
-  }
-}
-''');
-    await assertNoAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER);
-  }
-
-  test_joinIfStatementInner_BAD_statementAfterInner() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(2);
-    }
-    print(1);
-  }
-}
-''');
-    await assertNoAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER);
-  }
-
-  test_joinIfStatementInner_BAD_statementBeforeInner() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    print(1);
-    if (2 == 2) {
-      print(2);
-    }
-  }
-}
-''');
-    await assertNoAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER);
-  }
-
-  test_joinIfStatementInner_BAD_targetNotIf() async {
-    await resolveTestUnit('''
-main() {
-  print(0);
-}
-''');
-    await assertNoAssistAt('print', DartAssistKind.JOIN_IF_WITH_INNER);
-  }
-
-  test_joinIfStatementInner_BAD_targetWithElse() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(0);
-    }
-  } else {
-    print(1);
-  }
-}
-''');
-    await assertNoAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER);
-  }
-
-  test_joinIfStatementInner_OK_conditionAndOr() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2 || 3 == 3) {
-      print(0);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER, '''
-main() {
-  if (1 == 1 && (2 == 2 || 3 == 3)) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementInner_OK_conditionInvocation() async {
-    await resolveTestUnit('''
-main() {
-  if (isCheck()) {
-    if (2 == 2) {
-      print(0);
-    }
-  }
-}
-bool isCheck() => false;
-''');
-    await assertHasAssistAt(
-        'if (isCheck', DartAssistKind.JOIN_IF_WITH_INNER, '''
-main() {
-  if (isCheck() && 2 == 2) {
-    print(0);
-  }
-}
-bool isCheck() => false;
-''');
-  }
-
-  test_joinIfStatementInner_OK_conditionOrAnd() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1 || 2 == 2) {
-    if (3 == 3) {
-      print(0);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER, '''
-main() {
-  if ((1 == 1 || 2 == 2) && 3 == 3) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementInner_OK_onCondition() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(0);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('1 ==', DartAssistKind.JOIN_IF_WITH_INNER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementInner_OK_simpleConditions_block_block() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(0);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementInner_OK_simpleConditions_block_single() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2)
-      print(0);
-  }
-}
-''');
-    await assertHasAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementInner_OK_simpleConditions_single_blockMulti() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(1);
-      print(2);
-      print(3);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(1);
-    print(2);
-    print(3);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementInner_OK_simpleConditions_single_blockOne() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1)
-    if (2 == 2) {
-      print(0);
-    }
-}
-''');
-    await assertHasAssistAt('if (1 ==', DartAssistKind.JOIN_IF_WITH_INNER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementOuter_BAD_outerNotIf() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    print(0);
-  }
-}
-''');
-    await assertNoAssistAt('if (1 == 1', DartAssistKind.JOIN_IF_WITH_OUTER);
-  }
-
-  test_joinIfStatementOuter_BAD_outerWithElse() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(0);
-    }
-  } else {
-    print(1);
-  }
-}
-''');
-    await assertNoAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER);
-  }
-
-  test_joinIfStatementOuter_BAD_statementAfterInner() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(2);
-    }
-    print(1);
-  }
-}
-''');
-    await assertNoAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER);
-  }
-
-  test_joinIfStatementOuter_BAD_statementBeforeInner() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    print(1);
-    if (2 == 2) {
-      print(2);
-    }
-  }
-}
-''');
-    await assertNoAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER);
-  }
-
-  test_joinIfStatementOuter_BAD_targetNotIf() async {
-    await resolveTestUnit('''
-main() {
-  print(0);
-}
-''');
-    await assertNoAssistAt('print', DartAssistKind.JOIN_IF_WITH_OUTER);
-  }
-
-  test_joinIfStatementOuter_BAD_targetWithElse() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(0);
-    } else {
-      print(1);
-    }
-  }
-}
-''');
-    await assertNoAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER);
-  }
-
-  test_joinIfStatementOuter_OK_conditionAndOr() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2 || 3 == 3) {
-      print(0);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (2 ==', DartAssistKind.JOIN_IF_WITH_OUTER, '''
-main() {
-  if (1 == 1 && (2 == 2 || 3 == 3)) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementOuter_OK_conditionInvocation() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (isCheck()) {
-      print(0);
-    }
-  }
-}
-bool isCheck() => false;
-''');
-    await assertHasAssistAt(
-        'if (isCheck', DartAssistKind.JOIN_IF_WITH_OUTER, '''
-main() {
-  if (1 == 1 && isCheck()) {
-    print(0);
-  }
-}
-bool isCheck() => false;
-''');
-  }
-
-  test_joinIfStatementOuter_OK_conditionOrAnd() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1 || 2 == 2) {
-    if (3 == 3) {
-      print(0);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (3 == 3', DartAssistKind.JOIN_IF_WITH_OUTER, '''
-main() {
-  if ((1 == 1 || 2 == 2) && 3 == 3) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementOuter_OK_onCondition() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(0);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementOuter_OK_simpleConditions_block_block() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(0);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementOuter_OK_simpleConditions_block_single() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2)
-      print(0);
-  }
-}
-''');
-    await assertHasAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementOuter_OK_simpleConditions_single_blockMulti() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1) {
-    if (2 == 2) {
-      print(1);
-      print(2);
-      print(3);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(1);
-    print(2);
-    print(3);
-  }
-}
-''');
-  }
-
-  test_joinIfStatementOuter_OK_simpleConditions_single_blockOne() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1)
-    if (2 == 2) {
-      print(0);
-    }
-}
-''');
-    await assertHasAssistAt('if (2 == 2', DartAssistKind.JOIN_IF_WITH_OUTER, '''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-}
-''');
-  }
-
-  test_joinVariableDeclaration_onAssignment_BAD_hasInitializer() async {
-    await resolveTestUnit('''
-main() {
-  var v = 1;
-  v = 2;
-}
-''');
-    await assertNoAssistAt('v = 2', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onAssignment_BAD_notAdjacent() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  var bar;
-  v = 1;
-}
-''');
-    await assertNoAssistAt('v = 1', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onAssignment_BAD_notAssignment() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  v += 1;
-}
-''');
-    await assertNoAssistAt('v += 1', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onAssignment_BAD_notDeclaration() async {
-    await resolveTestUnit('''
-main(var v) {
-  v = 1;
-}
-''');
-    await assertNoAssistAt('v = 1', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onAssignment_BAD_notLeftArgument() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  1 + v; // marker
-}
-''');
-    await assertNoAssistAt(
-        'v; // marker', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onAssignment_BAD_notOneVariable() async {
-    await resolveTestUnit('''
-main() {
-  var v, v2;
-  v = 1;
-}
-''');
-    await assertNoAssistAt('v = 1', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onAssignment_BAD_notResolved() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-main() {
-  var v;
-  x = 1;
-}
-''');
-    await assertNoAssistAt('x = 1', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onAssignment_BAD_notSameBlock() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  {
-    v = 1;
-  }
-}
-''');
-    await assertNoAssistAt('v = 1', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onAssignment_OK() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  v = 1;
-}
-''');
-    await assertHasAssistAt('v =', DartAssistKind.JOIN_VARIABLE_DECLARATION, '''
-main() {
-  var v = 1;
-}
-''');
-  }
-
-  test_joinVariableDeclaration_onDeclaration_BAD_hasInitializer() async {
-    await resolveTestUnit('''
-main() {
-  var v = 1;
-  v = 2;
-}
-''');
-    await assertNoAssistAt('v = 1', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onDeclaration_BAD_lastStatement() async {
-    await resolveTestUnit('''
-main() {
-  if (true)
-    var v;
-}
-''');
-    await assertNoAssistAt('v;', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onDeclaration_BAD_nextNotAssignmentExpression() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  42;
-}
-''');
-    await assertNoAssistAt('v;', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onDeclaration_BAD_nextNotExpressionStatement() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  if (true) return;
-}
-''');
-    await assertNoAssistAt('v;', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onDeclaration_BAD_nextNotPureAssignment() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  v += 1;
-}
-''');
-    await assertNoAssistAt('v;', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onDeclaration_BAD_notOneVariable() async {
-    await resolveTestUnit('''
-main() {
-  var v, v2;
-  v = 1;
-}
-''');
-    await assertNoAssistAt('v, ', DartAssistKind.JOIN_VARIABLE_DECLARATION);
-  }
-
-  test_joinVariableDeclaration_onDeclaration_OK_onName() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  v = 1;
-}
-''');
-    await assertHasAssistAt('v;', DartAssistKind.JOIN_VARIABLE_DECLARATION, '''
-main() {
-  var v = 1;
-}
-''');
-  }
-
-  test_joinVariableDeclaration_onDeclaration_OK_onType() async {
-    await resolveTestUnit('''
-main() {
-  int v;
-  v = 1;
-}
-''');
-    await assertHasAssistAt(
-        'int v', DartAssistKind.JOIN_VARIABLE_DECLARATION, '''
-main() {
-  int v = 1;
-}
-''');
-  }
-
-  test_joinVariableDeclaration_onDeclaration_OK_onVar() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  v = 1;
-}
-''');
-    await assertHasAssistAt(
-        'var v', DartAssistKind.JOIN_VARIABLE_DECLARATION, '''
-main() {
-  var v = 1;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_classField_OK() async {
-    await resolveTestUnit('''
-class A {
-  int v = 1;
-}
-''');
-    await assertHasAssistAt('v = ', DartAssistKind.REMOVE_TYPE_ANNOTATION, '''
-class A {
-  var v = 1;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_classField_OK_final() async {
-    await resolveTestUnit('''
-class A {
-  final int v = 1;
-}
-''');
-    await assertHasAssistAt('v = ', DartAssistKind.REMOVE_TYPE_ANNOTATION, '''
-class A {
-  final v = 1;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_field_BAD_noInitializer() async {
-    await resolveTestUnit('''
-class A {
-  int v;
-}
-''');
-    await assertNoAssistAt('v;', DartAssistKind.REMOVE_TYPE_ANNOTATION);
-  }
-
-  test_removeTypeAnnotation_localVariable_BAD_noInitializer() async {
-    await resolveTestUnit('''
-main() {
-  int v;
-}
-''');
-    await assertNoAssistAt('v;', DartAssistKind.REMOVE_TYPE_ANNOTATION);
-  }
-
-  test_removeTypeAnnotation_localVariable_BAD_onInitializer() async {
-    await resolveTestUnit('''
-main() {
-  final int v = 1;
-}
-''');
-    await assertNoAssistAt('1;', DartAssistKind.REMOVE_TYPE_ANNOTATION);
-  }
-
-  test_removeTypeAnnotation_localVariable_OK() async {
-    await resolveTestUnit('''
-main() {
-  int a = 1, b = 2;
-}
-''');
-    await assertHasAssistAt('int ', DartAssistKind.REMOVE_TYPE_ANNOTATION, '''
-main() {
-  var a = 1, b = 2;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_localVariable_OK_const() async {
-    await resolveTestUnit('''
-main() {
-  const int v = 1;
-}
-''');
-    await assertHasAssistAt('int ', DartAssistKind.REMOVE_TYPE_ANNOTATION, '''
-main() {
-  const v = 1;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_localVariable_OK_final() async {
-    await resolveTestUnit('''
-main() {
-  final int v = 1;
-}
-''');
-    await assertHasAssistAt('int ', DartAssistKind.REMOVE_TYPE_ANNOTATION, '''
-main() {
-  final v = 1;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_topLevelVariable_BAD_noInitializer() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-int v;
-''');
-    await assertNoAssistAt('v;', DartAssistKind.REMOVE_TYPE_ANNOTATION);
-  }
-
-  test_removeTypeAnnotation_topLevelVariable_BAD_syntheticName() async {
-    verifyNoTestUnitErrors = false;
-    await resolveTestUnit('''
-MyType
-''');
-    await assertNoAssistAt('MyType', DartAssistKind.REMOVE_TYPE_ANNOTATION);
-  }
-
-  test_removeTypeAnnotation_topLevelVariable_OK() async {
-    await resolveTestUnit('''
-int V = 1;
-''');
-    await assertHasAssistAt('int ', DartAssistKind.REMOVE_TYPE_ANNOTATION, '''
-var V = 1;
-''');
-  }
-
-  test_removeTypeAnnotation_topLevelVariable_OK_final() async {
-    await resolveTestUnit('''
-final int V = 1;
-''');
-    await assertHasAssistAt('int ', DartAssistKind.REMOVE_TYPE_ANNOTATION, '''
-final V = 1;
-''');
-  }
-
-  test_replaceConditionalWithIfElse_BAD_noEnclosingStatement() async {
-    await resolveTestUnit('''
-var v = true ? 111 : 222;
-''');
-    await assertNoAssistAt(
-        '? 111', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE);
-  }
-
-  test_replaceConditionalWithIfElse_BAD_notConditional() async {
-    await resolveTestUnit('''
-main() {
-  var v = 42;
-}
-''');
-    await assertNoAssistAt(
-        'v = 42', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE);
-  }
-
-  test_replaceConditionalWithIfElse_OK_assignment() async {
-    await resolveTestUnit('''
-main() {
-  var v;
-  v = true ? 111 : 222;
-}
-''');
-    // on conditional
-    await assertHasAssistAt(
-        '11 :', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, '''
-main() {
-  var v;
-  if (true) {
-    v = 111;
-  } else {
-    v = 222;
-  }
-}
-''');
-    // on variable
-    await assertHasAssistAt(
-        'v =', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, '''
-main() {
-  var v;
-  if (true) {
-    v = 111;
-  } else {
-    v = 222;
-  }
-}
-''');
-  }
-
-  test_replaceConditionalWithIfElse_OK_return() async {
-    await resolveTestUnit('''
-main() {
-  return true ? 111 : 222;
-}
-''');
-    await assertHasAssistAt(
-        'return ', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, '''
-main() {
-  if (true) {
-    return 111;
-  } else {
-    return 222;
-  }
-}
-''');
-  }
-
-  test_replaceConditionalWithIfElse_OK_variableDeclaration() async {
-    await resolveTestUnit('''
-main() {
-  int a = 1, vvv = true ? 111 : 222, b = 2;
-}
-''');
-    await assertHasAssistAt(
-        '11 :', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE, '''
-main() {
-  int a = 1, vvv, b = 2;
-  if (true) {
-    vvv = 111;
-  } else {
-    vvv = 222;
-  }
-}
-''');
-  }
-
-  test_replaceIfElseWithConditional_BAD_expressionVsReturn() async {
-    await resolveTestUnit('''
-main() {
-  if (true) {
-    print(42);
-  } else {
-    return;
-  }
-}
-''');
-    await assertNoAssistAt(
-        'else', DartAssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL);
-  }
-
-  test_replaceIfElseWithConditional_BAD_notIfStatement() async {
-    await resolveTestUnit('''
-main() {
-  print(0);
-}
-''');
-    await assertNoAssistAt(
-        'print', DartAssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL);
-  }
-
-  test_replaceIfElseWithConditional_BAD_notSingleStatement() async {
-    await resolveTestUnit('''
-main() {
-  int vvv;
-  if (true) {
-    print(0);
-    vvv = 111;
-  } else {
-    print(0);
-    vvv = 222;
-  }
-}
-''');
-    await assertNoAssistAt(
-        'if (true)', DartAssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL);
-  }
-
-  test_replaceIfElseWithConditional_OK_assignment() async {
-    await resolveTestUnit('''
-main() {
-  int vvv;
-  if (true) {
-    vvv = 111;
-  } else {
-    vvv = 222;
-  }
-}
-''');
-    await assertHasAssistAt(
-        'if (true)', DartAssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL, '''
-main() {
-  int vvv;
-  vvv = true ? 111 : 222;
-}
-''');
-  }
-
-  test_replaceIfElseWithConditional_OK_return() async {
-    await resolveTestUnit('''
-main() {
-  if (true) {
-    return 111;
-  } else {
-    return 222;
-  }
-}
-''');
-    await assertHasAssistAt(
-        'if (true)', DartAssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL, '''
-main() {
-  return true ? 111 : 222;
-}
-''');
-  }
-
-  test_splitAndCondition_BAD_hasElse() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(1);
-  } else {
-    print(2);
-  }
-}
-''');
-    await assertNoAssistAt('&& 2', DartAssistKind.SPLIT_AND_CONDITION);
-  }
-
-  test_splitAndCondition_BAD_notAnd() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1 || 2 == 2) {
-    print(0);
-  }
-}
-''');
-    await assertNoAssistAt('|| 2', DartAssistKind.SPLIT_AND_CONDITION);
-  }
-
-  test_splitAndCondition_BAD_notPartOfIf() async {
-    await resolveTestUnit('''
-main() {
-  print(1 == 1 && 2 == 2);
-}
-''');
-    await assertNoAssistAt('&& 2', DartAssistKind.SPLIT_AND_CONDITION);
-  }
-
-  test_splitAndCondition_BAD_notTopLevelAnd() async {
-    await resolveTestUnit('''
-main() {
-  if (true || (1 == 1 && 2 == 2)) {
-    print(0);
-  }
-  if (true && (3 == 3 && 4 == 4)) {
-    print(0);
-  }
-}
-''');
-    await assertNoAssistAt('&& 2', DartAssistKind.SPLIT_AND_CONDITION);
-    await assertNoAssistAt('&& 4', DartAssistKind.SPLIT_AND_CONDITION);
-  }
-
-  test_splitAndCondition_OK_innerAndExpression() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1 && 2 == 2 && 3 == 3) {
-    print(0);
-  }
-}
-''');
-    await assertHasAssistAt('&& 2 == 2', DartAssistKind.SPLIT_AND_CONDITION, '''
-main() {
-  if (1 == 1) {
-    if (2 == 2 && 3 == 3) {
-      print(0);
-    }
-  }
-}
-''');
-  }
-
-  test_splitAndCondition_OK_thenBlock() async {
-    await resolveTestUnit('''
-main() {
-  if (true && false) {
-    print(0);
-    if (3 == 3) {
-      print(1);
-    }
-  }
-}
-''');
-    await assertHasAssistAt('&& false', DartAssistKind.SPLIT_AND_CONDITION, '''
-main() {
-  if (true) {
-    if (false) {
-      print(0);
-      if (3 == 3) {
-        print(1);
-      }
-    }
-  }
-}
-''');
-  }
-
-  test_splitAndCondition_OK_thenStatement() async {
-    await resolveTestUnit('''
-main() {
-  if (true && false)
-    print(0);
-}
-''');
-    await assertHasAssistAt('&& false', DartAssistKind.SPLIT_AND_CONDITION, '''
-main() {
-  if (true)
-    if (false)
-      print(0);
-}
-''');
-  }
-
-  test_splitAndCondition_wrong() async {
-    await resolveTestUnit('''
-main() {
-  if (1 == 1 && 2 == 2) {
-    print(0);
-  }
-  print(3 == 3 && 4 == 4);
-}
-''');
-    // not binary expression
-    await assertNoAssistAt('main() {', DartAssistKind.SPLIT_AND_CONDITION);
-    // selection is not empty and includes more than just operator
-    {
-      length = 5;
-      await assertNoAssistAt('&& 2 == 2', DartAssistKind.SPLIT_AND_CONDITION);
-    }
-  }
-
-  test_splitVariableDeclaration_BAD_notOneVariable() async {
-    await resolveTestUnit('''
-main() {
-  var v = 1, v2;
-}
-''');
-    await assertNoAssistAt('v = 1', DartAssistKind.SPLIT_VARIABLE_DECLARATION);
-  }
-
-  test_splitVariableDeclaration_OK_onName() async {
-    await resolveTestUnit('''
-main() {
-  var v = 1;
-}
-''');
-    await assertHasAssistAt(
-        'v =', DartAssistKind.SPLIT_VARIABLE_DECLARATION, '''
-main() {
-  var v;
-  v = 1;
-}
-''');
-  }
-
-  test_splitVariableDeclaration_OK_onType() async {
-    await resolveTestUnit('''
-main() {
-  int v = 1;
-}
-''');
-    await assertHasAssistAt(
-        'int ', DartAssistKind.SPLIT_VARIABLE_DECLARATION, '''
-main() {
-  int v;
-  v = 1;
-}
-''');
-  }
-
-  test_splitVariableDeclaration_OK_onVar() async {
-    await resolveTestUnit('''
-main() {
-  var v = 1;
-}
-''');
-    await assertHasAssistAt(
-        'var ', DartAssistKind.SPLIT_VARIABLE_DECLARATION, '''
-main() {
-  var v;
-  v = 1;
-}
-''');
-  }
-
-  test_surroundWith_block() async {
-    await resolveTestUnit('''
-main() {
-// start
-  print(0);
-  print(1);
-// end
-}
-''');
-    _setStartEndSelection();
-    await assertHasAssist(DartAssistKind.SURROUND_WITH_BLOCK, '''
-main() {
-// start
-  {
-    print(0);
-    print(1);
-  }
-// end
-}
-''');
-  }
-
-  test_surroundWith_doWhile() async {
-    await resolveTestUnit('''
-main() {
-// start
-  print(0);
-  print(1);
-// end
-}
-''');
-    _setStartEndSelection();
-    await assertHasAssist(DartAssistKind.SURROUND_WITH_DO_WHILE, '''
-main() {
-// start
-  do {
-    print(0);
-    print(1);
-  } while (condition);
-// end
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['condition);']);
-    _assertExitPosition(after: 'condition);');
-  }
-
-  test_surroundWith_for() async {
-    await resolveTestUnit('''
-main() {
-// start
-  print(0);
-  print(1);
-// end
-}
-''');
-    _setStartEndSelection();
-    await assertHasAssist(DartAssistKind.SURROUND_WITH_FOR, '''
-main() {
-// start
-  for (var v = init; condition; increment) {
-    print(0);
-    print(1);
-  }
-// end
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['v =']);
-    _assertLinkedGroup(change.linkedEditGroups[1], ['init;']);
-    _assertLinkedGroup(change.linkedEditGroups[2], ['condition;']);
-    _assertLinkedGroup(change.linkedEditGroups[3], ['increment']);
-    _assertExitPosition(after: '  }');
-  }
-
-  test_surroundWith_forIn() async {
-    await resolveTestUnit('''
-main() {
-// start
-  print(0);
-  print(1);
-// end
-}
-''');
-    _setStartEndSelection();
-    await assertHasAssist(DartAssistKind.SURROUND_WITH_FOR_IN, '''
-main() {
-// start
-  for (var item in iterable) {
-    print(0);
-    print(1);
-  }
-// end
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['item']);
-    _assertLinkedGroup(change.linkedEditGroups[1], ['iterable']);
-    _assertExitPosition(after: '  }');
-  }
-
-  test_surroundWith_if() async {
-    await resolveTestUnit('''
-main() {
-// start
-  print(0);
-  print(1);
-// end
-}
-''');
-    _setStartEndSelection();
-    await assertHasAssist(DartAssistKind.SURROUND_WITH_IF, '''
-main() {
-// start
-  if (condition) {
-    print(0);
-    print(1);
-  }
-// end
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['condition']);
-    _assertExitPosition(after: '  }');
-  }
-
-  test_surroundWith_tryCatch() async {
-    await resolveTestUnit('''
-main() {
-// start
-  print(0);
-  print(1);
-// end
-}
-''');
-    _setStartEndSelection();
-    await assertHasAssist(DartAssistKind.SURROUND_WITH_TRY_CATCH, '''
-main() {
-// start
-  try {
-    print(0);
-    print(1);
-  } on Exception catch (e) {
-    // TODO
-  }
-// end
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Exception']);
-    _assertLinkedGroup(change.linkedEditGroups[1], ['e) {']);
-    _assertLinkedGroup(change.linkedEditGroups[2], ['// TODO']);
-    _assertExitPosition(after: '// TODO');
-  }
-
-  test_surroundWith_tryFinally() async {
-    await resolveTestUnit('''
-main() {
-// start
-  print(0);
-  print(1);
-// end
-}
-''');
-    _setStartEndSelection();
-    await assertHasAssist(DartAssistKind.SURROUND_WITH_TRY_FINALLY, '''
-main() {
-// start
-  try {
-    print(0);
-    print(1);
-  } finally {
-    // TODO
-  }
-// end
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['// TODO']);
-    _assertExitPosition(after: '// TODO');
-  }
-
-  test_surroundWith_while() async {
-    await resolveTestUnit('''
-main() {
-// start
-  print(0);
-  print(1);
-// end
-}
-''');
-    _setStartEndSelection();
-    await assertHasAssist(DartAssistKind.SURROUND_WITH_WHILE, '''
-main() {
-// start
-  while (condition) {
-    print(0);
-    print(1);
-  }
-// end
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['condition']);
-    _assertExitPosition(after: '  }');
-  }
-
-  void _assertExitPosition({String before, String after}) {
-    Position exitPosition = change.selection;
-    expect(exitPosition, isNotNull);
-    expect(exitPosition.file, testFile);
-    if (before != null) {
-      expect(exitPosition.offset, resultCode.indexOf(before));
-    } else if (after != null) {
-      expect(exitPosition.offset, resultCode.indexOf(after) + after.length);
-    } else {
-      fail("One of 'before' or 'after' expected.");
-    }
-  }
-
-  /**
-   * Computes assists and verifies that there is an assist of the given kind.
-   */
-  Future<Assist> _assertHasAssist(AssistKind kind) async {
-    List<Assist> assists = await _computeAssists();
-    for (Assist assist in assists) {
-      if (assist.kind == kind) {
-        return assist;
-      }
-    }
-    fail('Expected to find assist $kind in\n${assists.join('\n')}');
-  }
-
-  void _assertLinkedGroup(LinkedEditGroup group, List<String> expectedStrings,
-      [List<LinkedEditSuggestion> expectedSuggestions]) {
-    List<Position> expectedPositions = _findResultPositions(expectedStrings);
-    expect(group.positions, unorderedEquals(expectedPositions));
-    if (expectedSuggestions != null) {
-      expect(group.suggestions, unorderedEquals(expectedSuggestions));
-    }
-  }
-
-  Future<List<Assist>> _computeAssists() async {
-    CompilationUnitElement testUnitElement =
-        resolutionMap.elementDeclaredByCompilationUnit(testUnit);
-    DartAssistContext assistContext;
-    assistContext = new _DartAssistContextForValues(
-        testUnitElement.source, offset, length, driver, testUnit);
-    AssistProcessor processor = new AssistProcessor(assistContext);
-    return await processor.compute();
-  }
-
-  List<Position> _findResultPositions(List<String> searchStrings) {
-    List<Position> positions = <Position>[];
-    for (String search in searchStrings) {
-      int offset = resultCode.indexOf(search);
-      positions.add(new Position(testFile, offset));
-    }
-    return positions;
-  }
-
-  void _setCaretLocation() {
-    offset = findOffset('/*caret*/') + '/*caret*/'.length;
-    length = 0;
-  }
-
-  void _setStartEndSelection() {
-    offset = findOffset('// start\n') + '// start\n'.length;
-    length = findOffset('// end') - offset;
-  }
-}
-
-class _DartAssistContextForValues implements DartAssistContext {
-  @override
-  final Source source;
-
-  @override
-  final int selectionOffset;
-
-  @override
-  final int selectionLength;
-
-  @override
-  final AnalysisDriver analysisDriver;
-
-  @override
-  final CompilationUnit unit;
-
-  _DartAssistContextForValues(this.source, this.selectionOffset,
-      this.selectionLength, this.analysisDriver, this.unit);
-}
diff --git a/pkg/analysis_server/test/services/correction/change_test.dart b/pkg/analysis_server/test/services/correction/change_test.dart
index d11aabd..1a74aa1 100644
--- a/pkg/analysis_server/test/services/correction/change_test.dart
+++ b/pkg/analysis_server/test/services/correction/change_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
deleted file mode 100644
index db6d6b7..0000000
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ /dev/null
@@ -1,8840 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
-import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
-import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/services/correction/fix_internal.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart'
-    hide AnalysisError;
-import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../abstract_single_unit.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(FixProcessorTest);
-    defineReflectiveTests(LintFixTest);
-  });
-}
-
-typedef bool AnalysisErrorFilter(AnalysisError error);
-
-/**
- * Base class for fix processor tests.
- */
-class BaseFixProcessorTest extends AbstractSingleUnitTest {
-  AnalysisErrorFilter errorFilter = (AnalysisError error) {
-    return error.errorCode != HintCode.UNUSED_CATCH_CLAUSE &&
-        error.errorCode != HintCode.UNUSED_CATCH_STACK &&
-        error.errorCode != HintCode.UNUSED_ELEMENT &&
-        error.errorCode != HintCode.UNUSED_FIELD &&
-        error.errorCode != HintCode.UNUSED_LOCAL_VARIABLE;
-  };
-
-  String myPkgLibPath = '/packages/my_pkg/lib';
-
-  String flutterPkgLibPath = '/packages/flutter/lib';
-
-  Fix fix;
-
-  SourceChange change;
-  String resultCode;
-
-  assert_undefinedFunction_create_returnType_bool(String lineWithTest) async {
-    await resolveTestUnit('''
-main() {
-  bool b = true;
-  $lineWithTest
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  bool b = true;
-  $lineWithTest
-}
-
-bool test() {
-}
-''');
-  }
-
-  assertHasFix(FixKind kind, String expected, {String target}) async {
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(kind, error);
-    change = fix.change;
-
-    // apply to "file"
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-
-    String fileContent = testCode;
-    if (target != null) {
-      expect(fileEdits.first.file, convertPath(target));
-      fileContent = getFile(target).readAsStringSync();
-    }
-
-    resultCode = SourceEdit.applySequence(fileContent, change.edits[0].edits);
-    // verify
-    expect(resultCode, expected);
-  }
-
-  assertHasFixAllFix(ErrorCode errorCode, FixKind kind, String expected,
-      {String target}) async {
-    AnalysisError error = await _findErrorToFixOfType(errorCode);
-    fix = await _assertHasFix(kind, error, hasFixAllFix: true);
-    change = fix.change;
-
-    // apply to "file"
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-
-    String fileContent = testCode;
-    if (target != null) {
-      expect(fileEdits.first.file, convertPath(target));
-      fileContent = getFile(target).readAsStringSync();
-    }
-
-    resultCode = SourceEdit.applySequence(fileContent, change.edits[0].edits);
-    // verify
-    expect(resultCode, expected);
-  }
-
-  assertNoFix(FixKind kind) async {
-    AnalysisError error = await _findErrorToFix();
-    await _assertNoFix(kind, error);
-  }
-
-  List<LinkedEditSuggestion> expectedSuggestions(
-      LinkedEditSuggestionKind kind, List<String> values) {
-    return values.map((value) {
-      return new LinkedEditSuggestion(value, kind);
-    }).toList();
-  }
-
-  void setUp() {
-    super.setUp();
-    verifyNoTestUnitErrors = false;
-  }
-
-  /**
-   * Computes fixes and verifies that there is a fix of the given kind.
-   */
-  Future<Fix> _assertHasFix(FixKind kind, AnalysisError error,
-      {bool hasFixAllFix: false}) async {
-    if (hasFixAllFix && !kind.canBeAppliedTogether()) {
-      fail('Expected to find and return fix-all FixKind for $kind, '
-          'but kind.canBeAppliedTogether is ${kind.canBeAppliedTogether}');
-    }
-
-    // Compute the fixes for this AnalysisError
-    final List<Fix> fixes = await _computeFixes(error);
-
-    // If hasFixAllFix is false, assert that none of the fixes are a fix-all fix
-    if (!hasFixAllFix) {
-      for (Fix fix in fixes) {
-        if (fix.isFixAllFix()) {
-          fail('The boolean hasFixAllFix is false, but such a fix was found '
-              'in the computed set of fixes: $fixes, error: $error.');
-        }
-      }
-    }
-    // If hasFixAllFix is true, assert that there exists such a fix in the list
-    else {
-      bool foundFixAllFix = false;
-      for (Fix fix in fixes) {
-        if (fix.isFixAllFix()) {
-          foundFixAllFix = true;
-          break;
-        }
-      }
-      if (!foundFixAllFix) {
-        fail('The boolean hasFixAllFix is true, but no fix-all fix was found '
-            'in the computed set of fixes: $fixes, error: $error.');
-      }
-    }
-
-    Fix foundFix = null;
-    if (!hasFixAllFix) {
-      foundFix = fixes.firstWhere(
-        (fix) => fix.kind == kind && !fix.isFixAllFix(),
-        orElse: () => null,
-      );
-    } else {
-      foundFix = fixes.lastWhere(
-        (fix) => fix.kind == kind && fix.isFixAllFix(),
-        orElse: () => null,
-      );
-    }
-    if (foundFix == null) {
-      fail('Expected to find fix $kind in\n${fixes.join('\n')}, hasFixAllFix = '
-          '$hasFixAllFix');
-    }
-    return foundFix;
-  }
-
-  void _assertLinkedGroup(LinkedEditGroup group, List<String> expectedStrings,
-      [List<LinkedEditSuggestion> expectedSuggestions]) {
-    List<Position> expectedPositions = _findResultPositions(expectedStrings);
-    expect(group.positions, unorderedEquals(expectedPositions));
-    if (expectedSuggestions != null) {
-      expect(group.suggestions, unorderedEquals(expectedSuggestions));
-    }
-  }
-
-  Future _assertNoFix(FixKind kind, AnalysisError error) async {
-    List<Fix> fixes = await _computeFixes(error);
-    for (Fix fix in fixes) {
-      if (fix.kind == kind) {
-        fail('Unexpected fix $kind in\n${fixes.join('\n')}');
-      }
-    }
-  }
-
-  Future<List<AnalysisError>> _computeErrors() async {
-    return (await driver.getResult(convertPath(testFile))).errors;
-  }
-
-  /**
-   * Computes fixes for the given [error] in [testUnit].
-   */
-  Future<List<Fix>> _computeFixes(AnalysisError error) async {
-    DartFixContext fixContext = new _DartFixContextImpl(
-        resourceProvider,
-        driver,
-        new AstProviderForDriver(driver),
-        testUnit,
-        error,
-        await _computeErrors());
-    return await new DefaultFixContributor().internalComputeFixes(fixContext);
-  }
-
-  /**
-   * Configures the [SourceFactory] to have the `my_pkg` package in
-   * `/packages/my_pkg/lib` folder.
-   */
-  void _configureMyPkg(Map<String, String> pathToCode) {
-    pathToCode.forEach((path, code) {
-      newFile('$myPkgLibPath/$path', content: code);
-    });
-    // configure SourceFactory
-    Folder myPkgFolder = getFolder(myPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
-      'my_pkg': [myPkgFolder]
-    });
-    SourceFactory sourceFactory = new SourceFactory(
-        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
-    driver.configure(sourceFactory: sourceFactory);
-    // force 'my_pkg' resolution
-    addSource(
-        '/tmp/other.dart',
-        pathToCode.keys
-            .map((path) => "import 'package:my_pkg/$path';")
-            .join('\n'));
-  }
-
-  Future<AnalysisError> _findErrorToFix() async {
-    List<AnalysisError> errors = await _computeErrors();
-    List<AnalysisError> filteredErrors = errors;
-    if (errorFilter != null) {
-      filteredErrors = filteredErrors.where(errorFilter).toList();
-    }
-    if (filteredErrors.length != 1) {
-      StringBuffer buffer = new StringBuffer();
-      buffer.writeln('Expected one error, found:');
-      for (AnalysisError error in errors) {
-        buffer.writeln('  $error [${error.errorCode}]');
-      }
-      fail(buffer.toString());
-    }
-    return filteredErrors[0];
-  }
-
-  Future<AnalysisError> _findErrorToFixOfType(ErrorCode errorCode) async {
-    List<AnalysisError> errors = await _computeErrors();
-    if (errorFilter != null) {
-      errors = errors.where(errorFilter).toList();
-    }
-    return errors.firstWhere((error) => errorCode == error.errorCode);
-  }
-
-  List<Position> _findResultPositions(List<String> searchStrings) {
-    List<Position> positions = <Position>[];
-    for (String search in searchStrings) {
-      int offset = resultCode.indexOf(search);
-      positions.add(new Position(testFile, offset));
-    }
-    return positions;
-  }
-}
-
-@reflectiveTest
-class FixProcessorTest extends BaseFixProcessorTest {
-  test_addAsync_asyncFor() async {
-    await resolveTestUnit('''
-import 'dart:async';
-void main(Stream<String> names) {
-  await for (String name in names) {
-    print(name);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-import 'dart:async';
-Future main(Stream<String> names) async {
-  await for (String name in names) {
-    print(name);
-  }
-}
-''');
-  }
-
-  test_addAsync_BAD_nullFunctionBody() async {
-    await resolveTestUnit('''
-var F = await;
-''');
-    await assertNoFix(DartFixKind.ADD_ASYNC);
-  }
-
-  test_addAsync_blockFunctionBody() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    };
-    await resolveTestUnit('''
-foo() {}
-main() {
-  await foo();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-foo() {}
-main() async {
-  await foo();
-}
-''');
-  }
-
-  test_addAsync_blockFunctionBody_getter() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    };
-    await resolveTestUnit('''
-int get foo => null;
-int f() {
-  await foo;
-  return 1;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-import \'dart:async\';
-
-int get foo => null;
-Future<int> f() async {
-  await foo;
-  return 1;
-}
-''');
-  }
-
-  test_addAsync_closure() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
-    };
-    await resolveTestUnit('''
-import 'dart:async';
-
-void takeFutureCallback(Future callback()) {}
-
-void doStuff() => takeFutureCallback(() => await 1);
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-import 'dart:async';
-
-void takeFutureCallback(Future callback()) {}
-
-void doStuff() => takeFutureCallback(() async => await 1);
-''');
-  }
-
-  test_addAsync_expressionFunctionBody() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == ParserErrorCode.UNEXPECTED_TOKEN;
-    };
-    await resolveTestUnit('''
-foo() {}
-main() => await foo();
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-foo() {}
-main() async => await foo();
-''');
-  }
-
-  test_addAsync_returnFuture() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    };
-    await resolveTestUnit('''
-foo() {}
-int main() {
-  await foo();
-  return 42;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-import 'dart:async';
-
-foo() {}
-Future<int> main() async {
-  await foo();
-  return 42;
-}
-''');
-  }
-
-  test_addAsync_returnFuture_alreadyFuture() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    };
-    await resolveTestUnit('''
-import 'dart:async';
-foo() {}
-Future<int> main() {
-  await foo();
-  return 42;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-import 'dart:async';
-foo() {}
-Future<int> main() async {
-  await foo();
-  return 42;
-}
-''');
-  }
-
-  test_addAsync_returnFuture_dynamic() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    };
-    await resolveTestUnit('''
-foo() {}
-dynamic main() {
-  await foo();
-  return 42;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-foo() {}
-dynamic main() async {
-  await foo();
-  return 42;
-}
-''');
-  }
-
-  test_addAsync_returnFuture_noType() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode ==
-          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
-    };
-    await resolveTestUnit('''
-foo() {}
-main() {
-  await foo();
-  return 42;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_ASYNC, '''
-foo() {}
-main() async {
-  await foo();
-  return 42;
-}
-''');
-  }
-
-  test_addExplicitCast_assignment_general() async {
-    await resolveTestUnit('''
-f(A a) {
-  B b;
-  b = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(A a) {
-  B b;
-  b = a as B;
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_general_all() async {
-    await resolveTestUnit('''
-f(A a) {
-  B b, b2;
-  b = a;
-  b2 = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(A a) {
-  B b, b2;
-  b = a as B;
-  b2 = a as B;
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_list() async {
-    await resolveTestUnit('''
-f(List<A> a) {
-  List<B> b;
-  b = a.where((e) => e is B).toList();
-}
-class A {}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(List<A> a) {
-  List<B> b;
-  b = a.where((e) => e is B).cast<B>().toList();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_list_all() async {
-    await resolveTestUnit('''
-f(List<A> a) {
-  List<B> b, b2;
-  b = a.where((e) => e is B).toList();
-  b2 = a.where((e) => e is B).toList();
-}
-class A {}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(List<A> a) {
-  List<B> b, b2;
-  b = a.where((e) => e is B).cast<B>().toList();
-  b2 = a.where((e) => e is B).cast<B>().toList();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_map() async {
-    await resolveTestUnit('''
-f(Map<A, B> a) {
-  Map<B, A> b;
-  b = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(Map<A, B> a) {
-  Map<B, A> b;
-  b = a.cast<B, A>();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_map_all() async {
-    await resolveTestUnit('''
-f(Map<A, B> a) {
-  Map<B, A> b, b2;
-  b = a;
-  b2 = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(Map<A, B> a) {
-  Map<B, A> b, b2;
-  b = a.cast<B, A>();
-  b2 = a.cast<B, A>();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_needsParens() async {
-    await resolveTestUnit('''
-f(A a) {
-  B b;
-  b = a..m();
-}
-class A {
-  int m() => 0;
-}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(A a) {
-  B b;
-  b = (a..m()) as B;
-}
-class A {
-  int m() => 0;
-}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_needsParens_all() async {
-    await resolveTestUnit('''
-f(A a) {
-  B b, b2;
-  b = a..m();
-  b2 = a..m();
-}
-class A {
-  int m() => 0;
-}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(A a) {
-  B b, b2;
-  b = (a..m()) as B;
-  b2 = (a..m()) as B;
-}
-class A {
-  int m() => 0;
-}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_set() async {
-    await resolveTestUnit('''
-f(Set<A> a) {
-  Set<B> b;
-  b = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(Set<A> a) {
-  Set<B> b;
-  b = a.cast<B>();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_assignment_set_all() async {
-    await resolveTestUnit('''
-f(Set<A> a) {
-  Set<B> b, b2;
-  b = a;
-  b2 = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(Set<A> a) {
-  Set<B> b, b2;
-  b = a.cast<B>();
-  b2 = a.cast<B>();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_BAD_as() async {
-    await resolveTestUnit('''
-f(A a) {
-  C c = a as B;
-}
-class A {}
-class B {}
-class C {}
-''');
-    await assertNoFix(DartFixKind.ADD_EXPLICIT_CAST);
-  }
-
-  test_addExplicitCast_BAD_cast() async {
-    await resolveTestUnit('''
-f(List<A> a) {
-  List<B> b = a.cast<A>();
-}
-class A {}
-class B {}
-''');
-    await assertNoFix(DartFixKind.ADD_EXPLICIT_CAST);
-  }
-
-  test_addExplicitCast_declaration_general() async {
-    await resolveTestUnit('''
-f(A a) {
-  B b = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(A a) {
-  B b = a as B;
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_general_all() async {
-    await resolveTestUnit('''
-f(A a) {
-  B b = a;
-  B b2 = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(A a) {
-  B b = a as B;
-  B b2 = a as B;
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_list() async {
-    await resolveTestUnit('''
-f(List<A> a) {
-  List<B> b = a.where((e) => e is B).toList();
-}
-class A {}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(List<A> a) {
-  List<B> b = a.where((e) => e is B).cast<B>().toList();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_list_all() async {
-    await resolveTestUnit('''
-f(List<A> a) {
-  List<B> b = a.where((e) => e is B).toList();
-  List<B> b2 = a.where((e) => e is B).toList();
-}
-class A {}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(List<A> a) {
-  List<B> b = a.where((e) => e is B).cast<B>().toList();
-  List<B> b2 = a.where((e) => e is B).cast<B>().toList();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_map() async {
-    await resolveTestUnit('''
-f(Map<A, B> a) {
-  Map<B, A> b = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(Map<A, B> a) {
-  Map<B, A> b = a.cast<B, A>();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_map_all() async {
-    await resolveTestUnit('''
-f(Map<A, B> a) {
-  Map<B, A> b = a;
-  Map<B, A> b2 = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(Map<A, B> a) {
-  Map<B, A> b = a.cast<B, A>();
-  Map<B, A> b2 = a.cast<B, A>();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_needsParens() async {
-    await resolveTestUnit('''
-f(A a) {
-  B b = a..m();
-}
-class A {
-  int m() => 0;
-}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(A a) {
-  B b = (a..m()) as B;
-}
-class A {
-  int m() => 0;
-}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_needsParens_all() async {
-    await resolveTestUnit('''
-f(A a) {
-  B b = a..m();
-  B b2 = a..m();
-}
-class A {
-  int m() => 0;
-}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(A a) {
-  B b = (a..m()) as B;
-  B b2 = (a..m()) as B;
-}
-class A {
-  int m() => 0;
-}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_set() async {
-    await resolveTestUnit('''
-f(Set<A> a) {
-  Set<B> b = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFix(DartFixKind.ADD_EXPLICIT_CAST, '''
-f(Set<A> a) {
-  Set<B> b = a.cast<B>();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addExplicitCast_declaration_set_all() async {
-    await resolveTestUnit('''
-f(Set<A> a) {
-  Set<B> b = a;
-  Set<B> b2 = a;
-}
-class A {}
-class B {}
-''');
-    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        DartFixKind.ADD_EXPLICIT_CAST, '''
-f(Set<A> a) {
-  Set<B> b = a.cast<B>();
-  Set<B> b2 = a.cast<B>();
-}
-class A {}
-class B {}
-''');
-  }
-
-  test_addFieldFormalParameters_flutter() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  final int a;
-  final int b;
-  final int c;
-
-  MyWidget({Key key, this.a}) : super(key: key);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  final int a;
-  final int b;
-  final int c;
-
-  MyWidget({Key key, this.a, this.b, this.c}) : super(key: key);
-}
-''');
-  }
-
-  test_addFieldFormalParameters_hasRequiredParameter() async {
-    await resolveTestUnit('''
-class Test {
-  final int a;
-  final int b;
-  final int c;
-  Test(this.a);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
-class Test {
-  final int a;
-  final int b;
-  final int c;
-  Test(this.a, this.b, this.c);
-}
-''');
-  }
-
-  test_addFieldFormalParameters_noParameters() async {
-    await resolveTestUnit('''
-class Test {
-  final int a;
-  final int b;
-  final int c;
-  Test();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
-class Test {
-  final int a;
-  final int b;
-  final int c;
-  Test(this.a, this.b, this.c);
-}
-''');
-  }
-
-  test_addFieldFormalParameters_noRequiredParameter() async {
-    await resolveTestUnit('''
-class Test {
-  final int a;
-  final int b;
-  final int c;
-  Test([this.c]);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
-class Test {
-  final int a;
-  final int b;
-  final int c;
-  Test(this.a, this.b, [this.c]);
-}
-''');
-  }
-
-  test_addFieldFormalParameters_notAllFinal() async {
-    await resolveTestUnit('''
-class Test {
-  final int a;
-  int b;
-  final int c;
-  Test();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_FIELD_FORMAL_PARAMETERS, '''
-class Test {
-  final int a;
-  int b;
-  final int c;
-  Test(this.a, this.c);
-}
-''');
-  }
-
-  test_addMissingParameter_constructor_named_required_hasOne() async {
-    await resolveTestUnit('''
-class A {
-  A.named(int a) {}
-}
-main() {
-  new A.named(1, 2.0);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
-class A {
-  A.named(int a, double d) {}
-}
-main() {
-  new A.named(1, 2.0);
-}
-''');
-  }
-
-  test_addMissingParameter_constructor_unnamed_required_hasOne() async {
-    await resolveTestUnit('''
-class A {
-  A(int a) {}
-}
-main() {
-  new A(1, 2.0);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
-class A {
-  A(int a, double d) {}
-}
-main() {
-  new A(1, 2.0);
-}
-''');
-  }
-
-  test_addMissingParameter_function_positional_hasNamed() async {
-    await resolveTestUnit('''
-test({int a}) {}
-main() {
-  test(1);
-}
-''');
-    await assertNoFix(DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL);
-  }
-
-  test_addMissingParameter_function_positional_hasZero() async {
-    await resolveTestUnit('''
-test() {}
-main() {
-  test(1);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL, '''
-test([int i]) {}
-main() {
-  test(1);
-}
-''');
-  }
-
-  test_addMissingParameter_function_required_hasNamed() async {
-    await resolveTestUnit('''
-test({int a}) {}
-main() {
-  test(1);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
-test(int i, {int a}) {}
-main() {
-  test(1);
-}
-''');
-  }
-
-  test_addMissingParameter_function_required_hasOne() async {
-    await resolveTestUnit('''
-test(int a) {}
-main() {
-  test(1, 2.0);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
-test(int a, double d) {}
-main() {
-  test(1, 2.0);
-}
-''');
-  }
-
-  test_addMissingParameter_function_required_hasZero() async {
-    await resolveTestUnit('''
-test() {}
-main() {
-  test(1);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
-test(int i) {}
-main() {
-  test(1);
-}
-''');
-  }
-
-  test_addMissingParameter_method_positional_hasOne() async {
-    await resolveTestUnit('''
-class A {
-  test(int a) {}
-  main() {
-    test(1, 2.0);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL, '''
-class A {
-  test(int a, [double d]) {}
-  main() {
-    test(1, 2.0);
-  }
-}
-''');
-  }
-
-  test_addMissingParameter_method_required_hasOne() async {
-    await resolveTestUnit('''
-class A {
-  test(int a) {}
-  main() {
-    test(1, 2.0);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
-class A {
-  test(int a, double d) {}
-  main() {
-    test(1, 2.0);
-  }
-}
-''');
-  }
-
-  test_addMissingParameter_method_required_hasZero() async {
-    await resolveTestUnit('''
-class A {
-  test() {}
-  main() {
-    test(1);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, '''
-class A {
-  test(int i) {}
-  main() {
-    test(1);
-  }
-}
-''');
-  }
-
-  test_addMissingParameterNamed_constructor_hasNamed() async {
-    await resolveTestUnit('''
-class A {
-  A(int a, {int b}) {}
-}
-
-main() {
-  new A(1, b: 2, named: 3.0);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-class A {
-  A(int a, {int b, double named}) {}
-}
-
-main() {
-  new A(1, b: 2, named: 3.0);
-}
-''');
-  }
-
-  test_addMissingParameterNamed_constructor_hasRequired() async {
-    await resolveTestUnit('''
-class A {
-  A(int a) {}
-}
-
-main() {
-  new A(1, named: 2.0);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-class A {
-  A(int a, {double named}) {}
-}
-
-main() {
-  new A(1, named: 2.0);
-}
-''');
-  }
-
-  test_addMissingParameterNamed_constructor_noParameters() async {
-    await resolveTestUnit('''
-class A {
-  A() {}
-}
-
-main() {
-  new A(named: 42);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-class A {
-  A({int named}) {}
-}
-
-main() {
-  new A(named: 42);
-}
-''');
-  }
-
-  test_addMissingParameterNamed_constructor_noParameters_named() async {
-    await resolveTestUnit('''
-class A {
-  A.aaa() {}
-}
-
-main() {
-  new A.aaa(named: 42);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-class A {
-  A.aaa({int named}) {}
-}
-
-main() {
-  new A.aaa(named: 42);
-}
-''');
-  }
-
-  test_addMissingParameterNamed_function_hasNamed() async {
-    await resolveTestUnit('''
-test(int a, {int b: 0}) {}
-
-main() {
-  test(1, b: 2, named: 3.0);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-test(int a, {int b: 0, double named}) {}
-
-main() {
-  test(1, b: 2, named: 3.0);
-}
-''');
-  }
-
-  test_addMissingParameterNamed_function_hasRequired() async {
-    await resolveTestUnit('''
-test(int a) {}
-
-main() {
-  test(1, named: 2.0);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-test(int a, {double named}) {}
-
-main() {
-  test(1, named: 2.0);
-}
-''');
-  }
-
-  test_addMissingParameterNamed_function_noParameters() async {
-    await resolveTestUnit('''
-test() {}
-
-main() {
-  test(named: 42);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-test({int named}) {}
-
-main() {
-  test(named: 42);
-}
-''');
-  }
-
-  test_addMissingParameterNamed_method_hasNamed() async {
-    await resolveTestUnit('''
-class A {
-  test(int a, {int b: 0}) {}
-
-  main() {
-    test(1, b: 2, named: 3.0);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-class A {
-  test(int a, {int b: 0, double named}) {}
-
-  main() {
-    test(1, b: 2, named: 3.0);
-  }
-}
-''');
-  }
-
-  test_addMissingParameterNamed_method_hasOptionalPositional() async {
-    await resolveTestUnit('''
-class A {
-  test(int a, [int b]) {}
-
-  main() {
-    test(1, 2, named: 3.0);
-  }
-}
-''');
-    await assertNoFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED);
-  }
-
-  test_addMissingParameterNamed_method_hasRequired() async {
-    await resolveTestUnit('''
-class A {
-  test(int a) {}
-
-  main() {
-    test(1, named: 2.0);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-class A {
-  test(int a, {double named}) {}
-
-  main() {
-    test(1, named: 2.0);
-  }
-}
-''');
-  }
-
-  test_addMissingParameterNamed_method_noParameters() async {
-    await resolveTestUnit('''
-class A {
-  test() {}
-
-  main() {
-    test(named: 42);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_PARAMETER_NAMED, '''
-class A {
-  test({int named}) {}
-
-  main() {
-    test(named: 42);
-  }
-}
-''');
-  }
-
-  test_addMissingRequiredArg_cons_flutter_children() async {
-    addFlutterPackage();
-    _addMetaPackageSource();
-
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-import 'package:meta/meta.dart';
-
-class MyWidget extends Widget {
-  MyWidget({@required List<Widget> children});
-}
-
-build() {
-  return new MyWidget();
-}
-''');
-
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'package:flutter/widgets.dart';
-import 'package:meta/meta.dart';
-
-class MyWidget extends Widget {
-  MyWidget({@required List<Widget> children});
-}
-
-build() {
-  return new MyWidget(children: <Widget>[],);
-}
-''');
-  }
-
-  test_addMissingRequiredArg_cons_flutter_hasTrailingComma() async {
-    addFlutterPackage();
-    _addMetaPackageSource();
-
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-import 'package:meta/meta.dart';
-
-class MyWidget extends Widget {
-  MyWidget({@required int a, @required int b});
-}
-
-build() {
-  return new MyWidget(a: 1,);
-}
-''');
-
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'package:flutter/widgets.dart';
-import 'package:meta/meta.dart';
-
-class MyWidget extends Widget {
-  MyWidget({@required int a, @required int b});
-}
-
-build() {
-  return new MyWidget(a: 1, b: null,);
-}
-''');
-  }
-
-  test_addMissingRequiredArg_cons_single() async {
-    _addMetaPackageSource();
-    addSource('/project/libA.dart', r'''
-library libA;
-import 'package:meta/meta.dart';
-
-class A {
-  A({@required int a}) {}
-}
-''');
-
-    await resolveTestUnit('''
-import 'libA.dart';
-
-main() {
-  A a = new A();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'libA.dart';
-
-main() {
-  A a = new A(a: null);
-}
-''');
-  }
-
-  test_addMissingRequiredArg_cons_single_closure() async {
-    _addMetaPackageSource();
-
-    addSource('/project/libA.dart', r'''
-library libA;
-import 'package:meta/meta.dart';
-
-typedef void VoidCallback();
-
-class A {
-  A({@required VoidCallback onPressed}) {}
-}
-''');
-
-    await resolveTestUnit('''
-import 'libA.dart';
-
-main() {
-  A a = new A();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'libA.dart';
-
-main() {
-  A a = new A(onPressed: () {});
-}
-''');
-  }
-
-  test_addMissingRequiredArg_cons_single_closure_2() async {
-    _addMetaPackageSource();
-
-    addSource('/project/libA.dart', r'''
-library libA;
-import 'package:meta/meta.dart';
-
-typedef void Callback(e);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-
-    await resolveTestUnit('''
-import 'libA.dart';
-
-main() {
-  A a = new A();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'libA.dart';
-
-main() {
-  A a = new A(callback: (e) {});
-}
-''');
-  }
-
-  test_addMissingRequiredArg_cons_single_closure_3() async {
-    _addMetaPackageSource();
-
-    addSource('/project/libA.dart', r'''
-library libA;
-import 'package:meta/meta.dart';
-
-typedef void Callback(a,b,c);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-
-    await resolveTestUnit('''
-import 'libA.dart';
-
-main() {
-  A a = new A();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'libA.dart';
-
-main() {
-  A a = new A(callback: (a, b, c) {});
-}
-''');
-  }
-
-  test_addMissingRequiredArg_cons_single_closure_4() async {
-    _addMetaPackageSource();
-
-    addSource('/project/libA.dart', r'''
-library libA;
-import 'package:meta/meta.dart';
-
-typedef int Callback(int a, String b,c);
-
-class A {
-  A({@required Callback callback}) {}
-}
-''');
-
-    await resolveTestUnit('''
-import 'libA.dart';
-
-main() {
-  A a = new A();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'libA.dart';
-
-main() {
-  A a = new A(callback: (int a, String b, c) {});
-}
-''');
-  }
-
-  test_addMissingRequiredArg_cons_single_list() async {
-    _addMetaPackageSource();
-
-    addSource('/project/libA.dart', r'''
-library libA;
-import 'package:meta/meta.dart';
-
-class A {
-  A({@required List<String> names}) {}
-}
-''');
-
-    await resolveTestUnit('''
-import 'libA.dart';
-
-main() {
-  A a = new A();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'libA.dart';
-
-main() {
-  A a = new A(names: <String>[]);
-}
-''');
-  }
-
-  test_addMissingRequiredArg_multiple() async {
-    _addMetaPackageSource();
-
-    await resolveTestUnit('''
-import 'package:meta/meta.dart';
-
-test({@required int a, @required int bcd}) {}
-main() {
-  test(a: 3);
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'package:meta/meta.dart';
-
-test({@required int a, @required int bcd}) {}
-main() {
-  test(a: 3, bcd: null);
-}
-''');
-  }
-
-  test_addMissingRequiredArg_multiple_2() async {
-    _addMetaPackageSource();
-
-    await resolveTestUnit('''
-import 'package:meta/meta.dart';
-
-test({@required int a, @required int bcd}) {}
-main() {
-  test();
-}
-''');
-
-    // For now we expect one error per missing arg (dartbug.com/28830).
-    List<AnalysisError> errors = await _computeErrors();
-    expect(errors, hasLength(2));
-
-    List<AnalysisError> filteredErrors = errors
-        .where((e) => e.message == "The parameter 'a' is required.")
-        .toList();
-    expect(filteredErrors, hasLength(1));
-
-    List<Fix> fixes = await _computeFixes(filteredErrors.first);
-
-    List<Fix> filteredFixes = fixes
-        .where((fix) => fix.change.message == "Add required argument 'a'")
-        .toList();
-    expect(filteredFixes, hasLength(1));
-    change = filteredFixes.first.change;
-    resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
-    // verify
-    expect(resultCode, '''
-import 'package:meta/meta.dart';
-
-test({@required int a, @required int bcd}) {}
-main() {
-  test(a: null);
-}
-''');
-  }
-
-  test_addMissingRequiredArg_single() async {
-    _addMetaPackageSource();
-
-    await resolveTestUnit('''
-import 'package:meta/meta.dart';
-
-test({@required int abc}) {}
-main() {
-  test();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'package:meta/meta.dart';
-
-test({@required int abc}) {}
-main() {
-  test(abc: null);
-}
-''');
-  }
-
-  test_addMissingRequiredArg_single_normal() async {
-    _addMetaPackageSource();
-
-    await resolveTestUnit('''
-import 'package:meta/meta.dart';
-
-test(String x, {@required int abc}) {}
-main() {
-  test("foo");
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'package:meta/meta.dart';
-
-test(String x, {@required int abc}) {}
-main() {
-  test("foo", abc: null);
-}
-''');
-  }
-
-  test_addMissingRequiredArg_single_with_details() async {
-    _addMetaPackageSource();
-
-    await resolveTestUnit('''
-import 'package:meta/meta.dart';
-
-test({@Required("Really who doesn't need an abc?") int abc}) {}
-main() {
-  test();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, '''
-import 'package:meta/meta.dart';
-
-test({@Required("Really who doesn't need an abc?") int abc}) {}
-main() {
-  test(abc: null);
-}
-''');
-  }
-
-  test_addStatic_multipleFields() async {
-    await resolveTestUnit('''
-class C {
-  const int x = 0, y = 0;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_STATIC, '''
-class C {
-  static const int x = 0, y = 0;
-}
-''');
-  }
-
-  test_addStatic_oneField() async {
-    await resolveTestUnit('''
-class C {
-  const int x = 0;
-}
-''');
-    await assertHasFix(DartFixKind.ADD_STATIC, '''
-class C {
-  static const int x = 0;
-}
-''');
-  }
-
-  test_boolean() async {
-    await resolveTestUnit('''
-main() {
-  boolean v;
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_BOOLEAN_WITH_BOOL, '''
-main() {
-  bool v;
-}
-''');
-  }
-
-  test_boolean_all() async {
-    await resolveTestUnit('''
-main() {
-  boolean v;
-  boolean w;
-}
-''');
-    await assertHasFixAllFix(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN,
-        DartFixKind.REPLACE_BOOLEAN_WITH_BOOL, '''
-main() {
-  bool v;
-  bool w;
-}
-''');
-  }
-
-  test_canBeNullAfterNullAware_chain() async {
-    await resolveTestUnit('''
-main(x) {
-  x?.a.b.c;
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_WITH_NULL_AWARE, '''
-main(x) {
-  x?.a?.b?.c;
-}
-''');
-  }
-
-  test_canBeNullAfterNullAware_methodInvocation() async {
-    await resolveTestUnit('''
-main(x) {
-  x?.a.b();
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_WITH_NULL_AWARE, '''
-main(x) {
-  x?.a?.b();
-}
-''');
-  }
-
-  test_canBeNullAfterNullAware_propertyAccess() async {
-    await resolveTestUnit('''
-main(x) {
-  x?.a().b;
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_WITH_NULL_AWARE, '''
-main(x) {
-  x?.a()?.b;
-}
-''');
-  }
-
-  test_changeToStaticAccess_method() async {
-    await resolveTestUnit('''
-class A {
-  static foo() {}
-}
-main(A a) {
-  a.foo();
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
-class A {
-  static foo() {}
-}
-main(A a) {
-  A.foo();
-}
-''');
-  }
-
-  test_changeToStaticAccess_method_importType() async {
-    addSource('/project/libA.dart', r'''
-library libA;
-class A {
-  static foo() {}
-}
-''');
-    addSource('/project/libB.dart', r'''
-library libB;
-import 'libA.dart';
-class B extends A {}
-''');
-    await resolveTestUnit('''
-import 'libB.dart';
-main(B b) {
-  b.foo();
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
-import 'libA.dart';
-import 'libB.dart';
-main(B b) {
-  A.foo();
-}
-''');
-  }
-
-  test_changeToStaticAccess_method_prefixLibrary() async {
-    await resolveTestUnit('''
-import 'dart:async' as pref;
-main(pref.Future f) {
-  f.wait([]);
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
-import 'dart:async' as pref;
-main(pref.Future f) {
-  pref.Future.wait([]);
-}
-''');
-  }
-
-  test_changeToStaticAccess_property() async {
-    await resolveTestUnit('''
-class A {
-  static get foo => 42;
-}
-main(A a) {
-  a.foo;
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
-class A {
-  static get foo => 42;
-}
-main(A a) {
-  A.foo;
-}
-''');
-  }
-
-  test_changeToStaticAccess_property_importType() async {
-    addSource('/project/libA.dart', r'''
-library libA;
-class A {
-  static get foo => null;
-}
-''');
-    addSource('/project/libB.dart', r'''
-library libB;
-import 'libA.dart';
-class B extends A {}
-''');
-    await resolveTestUnit('''
-import 'libB.dart';
-main(B b) {
-  b.foo;
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_STATIC_ACCESS, '''
-import 'libA.dart';
-import 'libB.dart';
-main(B b) {
-  A.foo;
-}
-''');
-  }
-
-  test_changeTypeAnnotation_BAD_multipleVariables() async {
-    await resolveTestUnit('''
-main() {
-  String a, b = 42;
-}
-''');
-    await assertNoFix(DartFixKind.CHANGE_TYPE_ANNOTATION);
-  }
-
-  test_changeTypeAnnotation_BAD_notVariableDeclaration() async {
-    await resolveTestUnit('''
-main() {
-  String v;
-  v = 42;
-}
-''');
-    await assertNoFix(DartFixKind.CHANGE_TYPE_ANNOTATION);
-  }
-
-  test_changeTypeAnnotation_OK_generic() async {
-    await resolveTestUnit('''
-main() {
-  String v = <int>[];
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TYPE_ANNOTATION, '''
-main() {
-  List<int> v = <int>[];
-}
-''');
-  }
-
-  test_changeTypeAnnotation_OK_simple() async {
-    await resolveTestUnit('''
-main() {
-  String v = 'abc'.length;
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TYPE_ANNOTATION, '''
-main() {
-  int v = 'abc'.length;
-}
-''');
-  }
-
-  test_convertToNamedArguments_BAD_ambiguous() async {
-    await resolveTestUnit('''
-class A {
-  A({int a, int b});
-}
-
-main() {
-  new A(1, 2);
-}
-''');
-    await assertNoFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS);
-  }
-
-  test_convertToNamedArguments_BAD_noCompatibleParameter() async {
-    await resolveTestUnit('''
-class A {
-  A({String a});
-}
-
-main() {
-  new A(1);
-}
-''');
-    await assertNoFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS);
-  }
-
-  test_convertToNamedArguments_OK_instanceCreation() async {
-    await resolveTestUnit('''
-class A {
-  A({int a, double b});
-}
-
-main() {
-  new A(1.2, 3);
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS, '''
-class A {
-  A({int a, double b});
-}
-
-main() {
-  new A(b: 1.2, a: 3);
-}
-''');
-  }
-
-  test_convertToNamedArguments_OK_instanceCreation_hasPositional() async {
-    await resolveTestUnit('''
-class A {
-  A(int a, {int b});
-}
-
-main() {
-  new A(1, 2);
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS, '''
-class A {
-  A(int a, {int b});
-}
-
-main() {
-  new A(1, b: 2);
-}
-''');
-  }
-
-  test_convertToNamedArguments_OK_methodInvocation() async {
-    await resolveTestUnit('''
-class C {
-  void foo({int a}) {}
-}
-
-main(C c) {
-  c.foo(1);
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_TO_NAMED_ARGUMENTS, '''
-class C {
-  void foo({int a}) {}
-}
-
-main(C c) {
-  c.foo(a: 1);
-}
-''');
-  }
-
-  test_createClass() async {
-    await resolveTestUnit('''
-main() {
-  Test v = null;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CLASS, '''
-main() {
-  Test v = null;
-}
-
-class Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
-  }
-
-  test_createClass_BAD_hasUnresolvedPrefix() async {
-    await resolveTestUnit('''
-main() {
-  prefix.Test v = null;
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_CLASS);
-  }
-
-  test_createClass_inLibraryOfPrefix() async {
-    String libCode = r'''
-library my.lib;
-
-class A {}
-''';
-    addSource('/project/lib.dart', libCode);
-    await resolveTestUnit('''
-import 'lib.dart' as lib;
-
-main() {
-  lib.A a = null;
-  lib.Test t = null;
-}
-''');
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_CLASS, error);
-    change = fix.change;
-    // apply to "lib.dart"
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/project/lib.dart'));
-    expect(SourceEdit.applySequence(libCode, fileEdit.edits), r'''
-library my.lib;
-
-class A {}
-
-class Test {
-}
-''');
-    expect(change.linkedEditGroups, hasLength(1));
-  }
-
-  test_createClass_innerLocalFunction() async {
-    await resolveTestUnit('''
-f() {
-  g() {
-    Test v = null;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CLASS, '''
-f() {
-  g() {
-    Test v = null;
-  }
-}
-
-class Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
-  }
-
-  test_createClass_instanceCreation_withoutNew_fromFunction() async {
-    await resolveTestUnit('''
-main() {
-  Test ();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CLASS, '''
-main() {
-  Test ();
-}
-
-class Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
-  }
-
-  test_createClass_instanceCreation_withoutNew_fromMethod() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    Test ();
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CLASS, '''
-class A {
-  main() {
-    Test ();
-  }
-}
-
-class Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
-  }
-
-  test_createClass_itemOfList() async {
-    await resolveTestUnit('''
-main() {
-  var a = [Test];
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CLASS, '''
-main() {
-  var a = [Test];
-}
-
-class Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test];', 'Test {']);
-  }
-
-  test_createClass_itemOfList_inAnnotation() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER;
-    };
-    await resolveTestUnit('''
-class MyAnnotation {
-  const MyAnnotation(a, b);
-}
-@MyAnnotation(int, const [Test])
-main() {}
-''');
-    await assertHasFix(DartFixKind.CREATE_CLASS, '''
-class MyAnnotation {
-  const MyAnnotation(a, b);
-}
-@MyAnnotation(int, const [Test])
-main() {}
-
-class Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test])', 'Test {']);
-  }
-
-  test_createConstructor_forFinalFields() async {
-    errorFilter = (AnalysisError error) {
-      return error.message.contains("'a'");
-    };
-    await resolveTestUnit('''
-class Test {
-  final int a;
-  final int b = 2;
-  final int c;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, '''
-class Test {
-  final int a;
-  final int b = 2;
-  final int c;
-
-  Test(this.a, this.c);
-}
-''');
-  }
-
-  test_createConstructor_forFinalFields_flutter() async {
-    addFlutterPackage();
-    errorFilter = (AnalysisError error) {
-      return error.message.contains("'a'");
-    };
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  final int a;
-  final int b = 2;
-  final int c;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, '''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  final int a;
-  final int b = 2;
-  final int c;
-
-  const MyWidget({Key key, this.a, this.c}) : super(key: key);
-}
-''');
-  }
-
-  test_createConstructor_forFinalFields_flutter_childLast() async {
-    addFlutterPackage();
-    errorFilter = (AnalysisError error) {
-      return error.message.contains("'a'");
-    };
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  final int a;
-  final Widget child;
-  final int b;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, '''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  final int a;
-  final Widget child;
-  final int b;
-
-  const MyWidget({Key key, this.a, this.b, this.child}) : super(key: key);
-}
-''');
-  }
-
-  test_createConstructor_forFinalFields_flutter_childrenLast() async {
-    addFlutterPackage();
-    errorFilter = (AnalysisError error) {
-      return error.message.contains("'a'");
-    };
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  final int a;
-  final List<Widget> children;
-  final int b;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS, '''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  final int a;
-  final List<Widget> children;
-  final int b;
-
-  const MyWidget({Key key, this.a, this.b, this.children}) : super(key: key);
-}
-''');
-  }
-
-  test_createConstructor_insteadOfSyntheticDefault() async {
-    await resolveTestUnit('''
-class A {
-  int field;
-
-  method() {}
-}
-main() {
-  new A(1, 2.0);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR, '''
-class A {
-  int field;
-
-  A(int i, double d);
-
-  method() {}
-}
-main() {
-  new A(1, 2.0);
-}
-''');
-  }
-
-  test_createConstructor_named() async {
-    await resolveTestUnit('''
-class A {
-  method() {}
-}
-main() {
-  new A.named(1, 2.0);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR, '''
-class A {
-  A.named(int i, double d);
-
-  method() {}
-}
-main() {
-  new A.named(1, 2.0);
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['named(int ', 'named(1']);
-  }
-
-  test_createConstructor_named_emptyClassBody() async {
-    await resolveTestUnit('''
-class A {}
-main() {
-  new A.named(1);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR, '''
-class A {
-  A.named(int i);
-}
-main() {
-  new A.named(1);
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['named(int ', 'named(1']);
-  }
-
-  test_createConstructorForFinalFields_inTopLevelMethod() async {
-    await resolveTestUnit('''
-main() {
-  final int v;
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS);
-  }
-
-  test_createConstructorForFinalFields_topLevelField() async {
-    await resolveTestUnit('''
-final int v;
-''');
-    await assertNoFix(DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS);
-  }
-
-  test_createConstructorSuperExplicit() async {
-    await resolveTestUnit('''
-class A {
-  A(bool p1, int p2, double p3, String p4, {p5});
-}
-class B extends A {
-  B() {}
-}
-''');
-    await assertHasFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
-class A {
-  A(bool p1, int p2, double p3, String p4, {p5});
-}
-class B extends A {
-  B() : super(false, 0, 0.0, '') {}
-}
-''');
-  }
-
-  test_createConstructorSuperExplicit_hasInitializers() async {
-    await resolveTestUnit('''
-class A {
-  A(int p);
-}
-class B extends A {
-  int field;
-  B() : field = 42 {}
-}
-''');
-    await assertHasFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
-class A {
-  A(int p);
-}
-class B extends A {
-  int field;
-  B() : field = 42, super(0) {}
-}
-''');
-  }
-
-  test_createConstructorSuperExplicit_named() async {
-    await resolveTestUnit('''
-class A {
-  A.named(int p);
-}
-class B extends A {
-  B() {}
-}
-''');
-    await assertHasFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
-class A {
-  A.named(int p);
-}
-class B extends A {
-  B() : super.named(0) {}
-}
-''');
-  }
-
-  test_createConstructorSuperExplicit_named_private() async {
-    await resolveTestUnit('''
-class A {
-  A._named(int p);
-}
-class B extends A {
-  B() {}
-}
-''');
-    await assertNoFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION);
-  }
-
-  test_createConstructorSuperExplicit_typeArgument() async {
-    await resolveTestUnit('''
-class A<T> {
-  A(T p);
-}
-class B extends A<int> {
-  B();
-}
-''');
-    await assertHasFix(DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
-class A<T> {
-  A(T p);
-}
-class B extends A<int> {
-  B() : super(0);
-}
-''');
-  }
-
-  test_createConstructorSuperImplicit() async {
-    await resolveTestUnit('''
-class A {
-  A(p1, int p2, List<String> p3, [int p4]);
-}
-class B extends A {
-  int existingField;
-
-  void existingMethod() {}
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
-class A {
-  A(p1, int p2, List<String> p3, [int p4]);
-}
-class B extends A {
-  int existingField;
-
-  B(p1, int p2, List<String> p3) : super(p1, p2, p3);
-
-  void existingMethod() {}
-}
-''');
-  }
-
-  test_createConstructorSuperImplicit_fieldInitializer() async {
-    await resolveTestUnit('''
-class A {
-  int _field;
-  A(this._field);
-}
-class B extends A {
-  int existingField;
-
-  void existingMethod() {}
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
-class A {
-  int _field;
-  A(this._field);
-}
-class B extends A {
-  int existingField;
-
-  B(int field) : super(field);
-
-  void existingMethod() {}
-}
-''');
-  }
-
-  test_createConstructorSuperImplicit_importType() async {
-    addSource('/project/libA.dart', r'''
-library libA;
-class A {}
-''');
-    addSource('/project/libB.dart', r'''
-library libB;
-import 'libA.dart';
-class B {
-  B(A a);
-}
-''');
-    await resolveTestUnit('''
-import 'libB.dart';
-class C extends B {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
-import 'libA.dart';
-import 'libB.dart';
-class C extends B {
-  C(A a) : super(a);
-}
-''');
-  }
-
-  test_createConstructorSuperImplicit_named() async {
-    await resolveTestUnit('''
-class A {
-  A.named(p1, int p2);
-}
-class B extends A {
-  int existingField;
-
-  void existingMethod() {}
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
-class A {
-  A.named(p1, int p2);
-}
-class B extends A {
-  int existingField;
-
-  B.named(p1, int p2) : super.named(p1, p2);
-
-  void existingMethod() {}
-}
-''');
-  }
-
-  test_createConstructorSuperImplicit_private() async {
-    await resolveTestUnit('''
-class A {
-  A._named(p);
-}
-class B extends A {
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER);
-  }
-
-  test_createConstructorSuperImplicit_typeArgument() async {
-    await resolveTestUnit('''
-class C<T> {
-  final T x;
-  C(this.x);
-}
-class D extends C<int> {
-}''');
-    await assertHasFix(DartFixKind.CREATE_CONSTRUCTOR_SUPER, '''
-class C<T> {
-  final T x;
-  C(this.x);
-}
-class D extends C<int> {
-  D(int x) : super(x);
-}''');
-  }
-
-  test_createField_BAD_inEnum() async {
-    await resolveTestUnit('''
-enum MyEnum {
-  AAA, BBB
-}
-main() {
-  MyEnum.foo;
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_FIELD);
-  }
-
-  test_createField_BAD_inSDK() async {
-    await resolveTestUnit('''
-main(List p) {
-  p.foo = 1;
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_FIELD);
-  }
-
-  test_createField_getter_multiLevel() async {
-    await resolveTestUnit('''
-class A {
-}
-class B {
-  A a;
-}
-class C {
-  B b;
-}
-main(C c) {
-  int v = c.b.a.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int test;
-}
-class B {
-  A a;
-}
-class C {
-  B b;
-}
-main(C c) {
-  int v = c.b.a.test;
-}
-''');
-  }
-
-  test_createField_getter_qualified_instance() async {
-    await resolveTestUnit('''
-class A {
-}
-main(A a) {
-  int v = a.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int test;
-}
-main(A a) {
-  int v = a.test;
-}
-''');
-  }
-
-  test_createField_getter_qualified_instance_differentLibrary() async {
-    addSource('/project/other.dart', '''
-/**
- * A comment to push the offset of the braces for the following class
- * declaration past the end of the content of the test file. Used to catch an
- * index out of bounds exception that occurs when using the test source instead
- * of the target source to compute the location at which to insert the field.
- */
-class A {
-}
-''');
-    await resolveTestUnit('''
-import 'other.dart';
-main(A a) {
-  int v = a.test;
-}
-''');
-    await assertHasFix(
-        DartFixKind.CREATE_FIELD,
-        '''
-/**
- * A comment to push the offset of the braces for the following class
- * declaration past the end of the content of the test file. Used to catch an
- * index out of bounds exception that occurs when using the test source instead
- * of the target source to compute the location at which to insert the field.
- */
-class A {
-  int test;
-}
-''',
-        target: '/project/other.dart');
-  }
-
-  test_createField_getter_qualified_instance_dynamicType() async {
-    await resolveTestUnit('''
-class A {
-  B b;
-  void f(Object p) {
-    p == b.test;
-  }
-}
-class B {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  B b;
-  void f(Object p) {
-    p == b.test;
-  }
-}
-class B {
-  var test;
-}
-''');
-  }
-
-  test_createField_getter_qualified_propagatedType() async {
-    await resolveTestUnit('''
-class A {
-  A get self => this;
-}
-main() {
-  var a = new A();
-  int v = a.self.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int test;
-
-  A get self => this;
-}
-main() {
-  var a = new A();
-  int v = a.self.test;
-}
-''');
-  }
-
-  test_createField_getter_unqualified_instance_asInvocationArgument() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    f(test);
-  }
-}
-f(String s) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  String test;
-
-  main() {
-    f(test);
-  }
-}
-f(String s) {}
-''');
-  }
-
-  test_createField_getter_unqualified_instance_assignmentRhs() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    int v = test;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int test;
-
-  main() {
-    int v = test;
-  }
-}
-''');
-  }
-
-  test_createField_getter_unqualified_instance_asStatement() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    test;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  var test;
-
-  main() {
-    test;
-  }
-}
-''');
-  }
-
-  test_createField_hint() async {
-    await resolveTestUnit('''
-class A {
-}
-main(A a) {
-  var x = a;
-  int v = x.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int test;
-}
-main(A a) {
-  var x = a;
-  int v = x.test;
-}
-''');
-  }
-
-  test_createField_hint_setter() async {
-    await resolveTestUnit('''
-class A {
-}
-main(A a) {
-  var x = a;
-  x.test = 0;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int test;
-}
-main(A a) {
-  var x = a;
-  x.test = 0;
-}
-''');
-  }
-
-  test_createField_importType() async {
-    addSource('/project/libA.dart', r'''
-library libA;
-class A {}
-''');
-    addSource('/project/libB.dart', r'''
-library libB;
-import 'libA.dart';
-A getA() => null;
-''');
-    await resolveTestUnit('''
-import 'libB.dart';
-class C {
-}
-main(C c) {
-  c.test = getA();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-import 'libA.dart';
-import 'libB.dart';
-class C {
-  A test;
-}
-main(C c) {
-  c.test = getA();
-}
-''');
-  }
-
-  test_createField_invalidInitializer_withoutType() async {
-    await resolveTestUnit('''
-class C {
-  C(this.text);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class C {
-  var text;
-
-  C(this.text);
-}
-''');
-  }
-
-  test_createField_invalidInitializer_withType() async {
-    await resolveTestUnit('''
-class C {
-  C(String this.text);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class C {
-  String text;
-
-  C(String this.text);
-}
-''');
-  }
-
-  test_createField_setter_generic_BAD() async {
-    await resolveTestUnit('''
-class A {
-}
-class B<T> {
-  List<T> items;
-  main(A a) {
-    a.test = items;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  List test;
-}
-class B<T> {
-  List<T> items;
-  main(A a) {
-    a.test = items;
-  }
-}
-''');
-  }
-
-  test_createField_setter_generic_OK_local() async {
-    await resolveTestUnit('''
-class A<T> {
-  List<T> items;
-
-  main(A a) {
-    test = items;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A<T> {
-  List<T> items;
-
-  List<T> test;
-
-  main(A a) {
-    test = items;
-  }
-}
-''');
-  }
-
-  test_createField_setter_qualified_instance_hasField() async {
-    await resolveTestUnit('''
-class A {
-  int aaa;
-  int zzz;
-
-  existingMethod() {}
-}
-main(A a) {
-  a.test = 5;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int aaa;
-  int zzz;
-
-  int test;
-
-  existingMethod() {}
-}
-main(A a) {
-  a.test = 5;
-}
-''');
-  }
-
-  test_createField_setter_qualified_instance_hasMethod() async {
-    await resolveTestUnit('''
-class A {
-  existingMethod() {}
-}
-main(A a) {
-  a.test = 5;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int test;
-
-  existingMethod() {}
-}
-main(A a) {
-  a.test = 5;
-}
-''');
-  }
-
-  test_createField_setter_qualified_static() async {
-    await resolveTestUnit('''
-class A {
-}
-main() {
-  A.test = 5;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  static int test;
-}
-main() {
-  A.test = 5;
-}
-''');
-  }
-
-  test_createField_setter_unqualified_instance() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    test = 5;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  int test;
-
-  main() {
-    test = 5;
-  }
-}
-''');
-  }
-
-  test_createField_setter_unqualified_static() async {
-    await resolveTestUnit('''
-class A {
-  static main() {
-    test = 5;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FIELD, '''
-class A {
-  static int test;
-
-  static main() {
-    test = 5;
-  }
-}
-''');
-  }
-
-  test_createFile_forImport() async {
-    testFile = '/my/project/bin/test.dart';
-    await resolveTestUnit('''
-import 'my_file.dart';
-''');
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
-    change = fix.change;
-    // validate change
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/my/project/bin/my_file.dart'));
-    expect(fileEdit.fileStamp, -1);
-    expect(fileEdit.edits, hasLength(1));
-    expect(fileEdit.edits[0].replacement, contains('library my_file;'));
-  }
-
-  test_createFile_forImport_BAD_inPackage_lib_justLib() async {
-    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
-    testFile = '/projects/my_package/test.dart';
-    await resolveTestUnit('''
-import 'lib';
-''');
-    await assertNoFix(DartFixKind.CREATE_FILE);
-  }
-
-  test_createFile_forImport_BAD_notDart() async {
-    testFile = '/my/project/bin/test.dart';
-    await resolveTestUnit('''
-import 'my_file.txt';
-''');
-    await assertNoFix(DartFixKind.CREATE_FILE);
-  }
-
-  test_createFile_forImport_inPackage_lib() async {
-    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
-    testFile = '/projects/my_package/lib/test.dart';
-    newFolder('/projects/my_package/lib');
-    await resolveTestUnit('''
-import 'a/bb/c_cc/my_lib.dart';
-''');
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
-    change = fix.change;
-    // validate change
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file,
-        convertPath('/projects/my_package/lib/a/bb/c_cc/my_lib.dart'));
-    expect(fileEdit.fileStamp, -1);
-    expect(fileEdit.edits, hasLength(1));
-    expect(fileEdit.edits[0].replacement,
-        contains('library my_package.a.bb.c_cc.my_lib;'));
-  }
-
-  test_createFile_forImport_inPackage_test() async {
-    newFile('/projects/my_package/pubspec.yaml', content: 'name: my_package');
-    testFile = '/projects/my_package/test/misc/test_all.dart';
-    await resolveTestUnit('''
-import 'a/bb/my_lib.dart';
-''');
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
-    change = fix.change;
-    // validate change
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file,
-        convertPath('/projects/my_package/test/misc/a/bb/my_lib.dart'));
-    expect(fileEdit.fileStamp, -1);
-    expect(fileEdit.edits, hasLength(1));
-    expect(fileEdit.edits[0].replacement,
-        contains('library my_package.test.misc.a.bb.my_lib;'));
-  }
-
-  test_createFile_forPart() async {
-    testFile = convertPath('/my/project/bin/test.dart');
-    await resolveTestUnit('''
-library my.lib;
-part 'my_part.dart';
-''');
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
-    change = fix.change;
-    // validate change
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/my/project/bin/my_part.dart'));
-    expect(fileEdit.fileStamp, -1);
-    expect(fileEdit.edits, hasLength(1));
-    expect(fileEdit.edits[0].replacement, contains('part of my.lib;'));
-  }
-
-  test_createFile_forPart_inPackageLib() async {
-    newFile('/my/pubspec.yaml', content: r'''
-name: my_test
-''');
-    testFile = '/my/lib/test.dart';
-    addTestSource('''
-library my.lib;
-part 'my_part.dart';
-''', Uri.parse('package:my/test.dart'));
-    // configure SourceFactory
-    UriResolver pkgResolver = new PackageMapUriResolver(resourceProvider, {
-      'my': <Folder>[getFolder('/my/lib')],
-    });
-    SourceFactory sourceFactory = new SourceFactory(
-        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
-    driver.configure(sourceFactory: sourceFactory);
-    testUnit = (await driver.getResult(convertPath(testFile))).unit;
-    // prepare fix
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_FILE, error);
-    change = fix.change;
-    // validate change
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/my/lib/my_part.dart'));
-    expect(fileEdit.fileStamp, -1);
-    expect(fileEdit.edits, hasLength(1));
-    expect(fileEdit.edits[0].replacement, contains('part of my.lib;'));
-  }
-
-  test_createGetter_BAD_inSDK() async {
-    await resolveTestUnit('''
-main(List p) {
-  int v = p.foo;
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_GETTER);
-  }
-
-  test_createGetter_hint_getter() async {
-    await resolveTestUnit('''
-class A {
-}
-main(A a) {
-  var x = a;
-  int v = x.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  int get test => null;
-}
-main(A a) {
-  var x = a;
-  int v = x.test;
-}
-''');
-  }
-
-  test_createGetter_location_afterLastGetter() async {
-    await resolveTestUnit('''
-class A {
-  int existingField;
-
-  int get existingGetter => null;
-
-  existingMethod() {}
-}
-main(A a) {
-  int v = a.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  int existingField;
-
-  int get existingGetter => null;
-
-  int get test => null;
-
-  existingMethod() {}
-}
-main(A a) {
-  int v = a.test;
-}
-''');
-  }
-
-  test_createGetter_multiLevel() async {
-    await resolveTestUnit('''
-class A {
-}
-class B {
-  A a;
-}
-class C {
-  B b;
-}
-main(C c) {
-  int v = c.b.a.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  int get test => null;
-}
-class B {
-  A a;
-}
-class C {
-  B b;
-}
-main(C c) {
-  int v = c.b.a.test;
-}
-''');
-  }
-
-  test_createGetter_qualified_instance() async {
-    await resolveTestUnit('''
-class A {
-}
-main(A a) {
-  int v = a.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  int get test => null;
-}
-main(A a) {
-  int v = a.test;
-}
-''');
-  }
-
-  test_createGetter_qualified_instance_differentLibrary() async {
-    addSource('/project/other.dart', '''
-/**
- * A comment to push the offset of the braces for the following class
- * declaration past the end of the content of the test file. Used to catch an
- * index out of bounds exception that occurs when using the test source instead
- * of the target source to compute the location at which to insert the field.
- */
-class A {
-}
-''');
-    await resolveTestUnit('''
-import 'other.dart';
-main(A a) {
-  int v = a.test;
-}
-''');
-    await assertHasFix(
-        DartFixKind.CREATE_GETTER,
-        '''
-/**
- * A comment to push the offset of the braces for the following class
- * declaration past the end of the content of the test file. Used to catch an
- * index out of bounds exception that occurs when using the test source instead
- * of the target source to compute the location at which to insert the field.
- */
-class A {
-  int get test => null;
-}
-''',
-        target: '/project/other.dart');
-  }
-
-  test_createGetter_qualified_instance_dynamicType() async {
-    await resolveTestUnit('''
-class A {
-  B b;
-  void f(Object p) {
-    p == b.test;
-  }
-}
-class B {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  B b;
-  void f(Object p) {
-    p == b.test;
-  }
-}
-class B {
-  get test => null;
-}
-''');
-  }
-
-  test_createGetter_qualified_propagatedType() async {
-    await resolveTestUnit('''
-class A {
-  A get self => this;
-}
-main() {
-  var a = new A();
-  int v = a.self.test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  A get self => this;
-
-  int get test => null;
-}
-main() {
-  var a = new A();
-  int v = a.self.test;
-}
-''');
-  }
-
-  test_createGetter_setterContext() async {
-    await resolveTestUnit('''
-class A {
-}
-main(A a) {
-  a.test = 42;
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_GETTER);
-  }
-
-  test_createGetter_unqualified_instance_asInvocationArgument() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    f(test);
-  }
-}
-f(String s) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  String get test => null;
-
-  main() {
-    f(test);
-  }
-}
-f(String s) {}
-''');
-  }
-
-  test_createGetter_unqualified_instance_assignmentLhs() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    test = 42;
-  }
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_GETTER);
-  }
-
-  test_createGetter_unqualified_instance_assignmentRhs() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    int v = test;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  int get test => null;
-
-  main() {
-    int v = test;
-  }
-}
-''');
-  }
-
-  test_createGetter_unqualified_instance_asStatement() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    test;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_GETTER, '''
-class A {
-  get test => null;
-
-  main() {
-    test;
-  }
-}
-''');
-  }
-
-  test_createLocalVariable_functionType_named() async {
-    await resolveTestUnit('''
-typedef MY_FUNCTION(int p);
-foo(MY_FUNCTION f) {}
-main() {
-  foo(bar);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-typedef MY_FUNCTION(int p);
-foo(MY_FUNCTION f) {}
-main() {
-  MY_FUNCTION bar;
-  foo(bar);
-}
-''');
-  }
-
-  test_createLocalVariable_functionType_named_generic() async {
-    await resolveTestUnit('''
-typedef MY_FUNCTION<T>(T p);
-foo(MY_FUNCTION<int> f) {}
-main() {
-  foo(bar);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-typedef MY_FUNCTION<T>(T p);
-foo(MY_FUNCTION<int> f) {}
-main() {
-  MY_FUNCTION<int> bar;
-  foo(bar);
-}
-''');
-  }
-
-  test_createLocalVariable_functionType_synthetic() async {
-    await resolveTestUnit('''
-foo(f(int p)) {}
-main() {
-  foo(bar);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-foo(f(int p)) {}
-main() {
-  Function(int p) bar;
-  foo(bar);
-}
-''');
-  }
-
-  test_createLocalVariable_read_typeAssignment() async {
-    await resolveTestUnit('''
-main() {
-  int a = test;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-main() {
-  int test;
-  int a = test;
-}
-''');
-  }
-
-  test_createLocalVariable_read_typeCondition() async {
-    await resolveTestUnit('''
-main() {
-  if (!test) {
-    print(42);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-main() {
-  bool test;
-  if (!test) {
-    print(42);
-  }
-}
-''');
-  }
-
-  test_createLocalVariable_read_typeInvocationArgument() async {
-    await resolveTestUnit('''
-main() {
-  f(test);
-}
-f(String p) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-main() {
-  String test;
-  f(test);
-}
-f(String p) {}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['String test;']);
-    _assertLinkedGroup(change.linkedEditGroups[1], ['test;', 'test);']);
-  }
-
-  test_createLocalVariable_read_typeInvocationTarget() async {
-    await resolveTestUnit('''
-main() {
-  test.add('hello');
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-main() {
-  var test;
-  test.add('hello');
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['test;', 'test.add(']);
-  }
-
-  test_createLocalVariable_withImport() async {
-    addPackageSource('pkg', 'a/a.dart', '''
-class A {}
-''');
-    addPackageSource('pkg', 'b/b.dart', '''
-class B {}
-''');
-    addPackageSource('pkg', 'c/c.dart', '''
-import 'package:pkg/a/a.dart';
-import 'package:pkg/b/b.dart';
-
-class C {
-  C(A a, B b);
-}
-''');
-
-    await resolveTestUnit('''
-import 'package:pkg/a/a.dart';
-import 'package:pkg/c/c.dart';
-
-main() {
-  A a;
-  new C(a, b);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-import 'package:pkg/a/a.dart';
-import 'package:pkg/b/b.dart';
-import 'package:pkg/c/c.dart';
-
-main() {
-  A a;
-  B b;
-  new C(a, b);
-}
-''');
-
-    List<LinkedEditGroup> groups = change.linkedEditGroups;
-    expect(groups, hasLength(2));
-    LinkedEditGroup typeGroup = groups[0];
-    List<Position> typePositions = typeGroup.positions;
-    expect(typePositions, hasLength(1));
-    expect(typePositions[0].offset, 112);
-    LinkedEditGroup nameGroup = groups[1];
-    List<Position> groupPositions = nameGroup.positions;
-    expect(groupPositions, hasLength(2));
-    expect(groupPositions[0].offset, 114);
-    expect(groupPositions[1].offset, 128);
-  }
-
-  test_createLocalVariable_write_assignment() async {
-    await resolveTestUnit('''
-main() {
-  test = 42;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-main() {
-  var test = 42;
-}
-''');
-  }
-
-  test_createLocalVariable_write_assignment_compound() async {
-    await resolveTestUnit('''
-main() {
-  test += 42;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_LOCAL_VARIABLE, '''
-main() {
-  int test;
-  test += 42;
-}
-''');
-  }
-
-  test_createMissingOverrides_field_untyped() async {
-    await resolveTestUnit('''
-class A {
-  var f;
-}
-
-class B implements A {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-class A {
-  var f;
-}
-
-class B implements A {
-  @override
-  var f;
-}
-''');
-  }
-
-  test_createMissingOverrides_functionTypeAlias() async {
-    await resolveTestUnit('''
-typedef int Binary(int left, int right);
-
-abstract class Emulator {
-  void performBinary(Binary binary);
-}
-
-class MyEmulator extends Emulator {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-typedef int Binary(int left, int right);
-
-abstract class Emulator {
-  void performBinary(Binary binary);
-}
-
-class MyEmulator extends Emulator {
-  @override
-  void performBinary(Binary binary) {
-    // TODO: implement performBinary
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_functionTypedParameter() async {
-    await resolveTestUnit('''
-abstract class A {
-  void forEach(int f(double p1, String p2));
-}
-
-class B extends A {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-abstract class A {
-  void forEach(int f(double p1, String p2));
-}
-
-class B extends A {
-  @override
-  void forEach(int Function(double p1, String p2) f) {
-    // TODO: implement forEach
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_generics_typeArguments() async {
-    await resolveTestUnit('''
-class Iterator<T> {
-}
-
-abstract class IterableMixin<T> {
-  Iterator<T> get iterator;
-}
-
-class Test extends IterableMixin<int> {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-class Iterator<T> {
-}
-
-abstract class IterableMixin<T> {
-  Iterator<T> get iterator;
-}
-
-class Test extends IterableMixin<int> {
-  @override
-  // TODO: implement iterator
-  Iterator<int> get iterator => null;
-}
-''');
-  }
-
-  test_createMissingOverrides_generics_typeParameters() async {
-    await resolveTestUnit('''
-abstract class ItemProvider<T> {
-  List<T> getItems();
-}
-
-class Test<V> extends ItemProvider<V> {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-abstract class ItemProvider<T> {
-  List<T> getItems();
-}
-
-class Test<V> extends ItemProvider<V> {
-  @override
-  List<V> getItems() {
-    // TODO: implement getItems
-    return null;
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_getter() async {
-    await resolveTestUnit('''
-abstract class A {
-  get g1;
-  int get g2;
-}
-
-class B extends A {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-abstract class A {
-  get g1;
-  int get g2;
-}
-
-class B extends A {
-  @override
-  // TODO: implement g1
-  get g1 => null;
-
-  @override
-  // TODO: implement g2
-  int get g2 => null;
-}
-''');
-  }
-
-  test_createMissingOverrides_importPrefix() async {
-    await resolveTestUnit('''
-import 'dart:async' as aaa;
-abstract class A {
-  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
-}
-
-class B extends A {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-import 'dart:async' as aaa;
-abstract class A {
-  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
-}
-
-class B extends A {
-  @override
-  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p) {
-    // TODO: implement g
-    return null;
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_mergeToField_getterSetter() async {
-    await resolveTestUnit('''
-class A {
-  int ma;
-  void mb() {}
-  double mc;
-}
-
-class B implements A {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-class A {
-  int ma;
-  void mb() {}
-  double mc;
-}
-
-class B implements A {
-  @override
-  int ma;
-
-  @override
-  double mc;
-
-  @override
-  void mb() {
-    // TODO: implement mb
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_method() async {
-    await resolveTestUnit('''
-abstract class A {
-  void m1();
-  int m2();
-  String m3(int p1, double p2, Map<int, List<String>> p3);
-  String m4(p1, p2);
-  String m5(p1, [int p2 = 2, int p3, p4 = 4]);
-  String m6(p1, {int p2 = 2, int p3, p4: 4});
-}
-
-class B extends A {
-}
-''');
-    String expectedCode = '''
-abstract class A {
-  void m1();
-  int m2();
-  String m3(int p1, double p2, Map<int, List<String>> p3);
-  String m4(p1, p2);
-  String m5(p1, [int p2 = 2, int p3, p4 = 4]);
-  String m6(p1, {int p2 = 2, int p3, p4: 4});
-}
-
-class B extends A {
-  @override
-  void m1() {
-    // TODO: implement m1
-  }
-
-  @override
-  int m2() {
-    // TODO: implement m2
-    return null;
-  }
-
-  @override
-  String m3(int p1, double p2, Map<int, List<String>> p3) {
-    // TODO: implement m3
-    return null;
-  }
-
-  @override
-  String m4(p1, p2) {
-    // TODO: implement m4
-    return null;
-  }
-
-  @override
-  String m5(p1, [int p2 = 2, int p3, p4 = 4]) {
-    // TODO: implement m5
-    return null;
-  }
-
-  @override
-  String m6(p1, {int p2 = 2, int p3, p4 = 4}) {
-    // TODO: implement m6
-    return null;
-  }
-}
-''';
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, expectedCode);
-    // end position should be on "m1", not on "m2", "m3", etc
-    {
-      Position endPosition = change.selection;
-      expect(endPosition, isNotNull);
-      expect(endPosition.file, testFile);
-      int endOffset = endPosition.offset;
-      String endString = expectedCode.substring(endOffset, endOffset + 25);
-      expect(endString, contains('m1'));
-      expect(endString, isNot(contains('m2')));
-      expect(endString, isNot(contains('m3')));
-      expect(endString, isNot(contains('m4')));
-      expect(endString, isNot(contains('m5')));
-      expect(endString, isNot(contains('m6')));
-    }
-  }
-
-  test_createMissingOverrides_method_emptyClassBody() async {
-    await resolveTestUnit('''
-abstract class A {
-  void foo();
-}
-
-class B extends A {}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-abstract class A {
-  void foo();
-}
-
-class B extends A {
-  @override
-  void foo() {
-    // TODO: implement foo
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_method_generic() async {
-    await resolveTestUnit('''
-class C<T> {}
-class V<E> {}
-
-abstract class A {
-  E1 foo<E1, E2 extends C<int>>(V<E2> v);
-}
-
-class B implements A {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-class C<T> {}
-class V<E> {}
-
-abstract class A {
-  E1 foo<E1, E2 extends C<int>>(V<E2> v);
-}
-
-class B implements A {
-  @override
-  E1 foo<E1, E2 extends C<int>>(V<E2> v) {
-    // TODO: implement foo
-    return null;
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_method_genericClass2() async {
-    await resolveTestUnit('''
-class A<R> {
-  R foo(int a) => null;
-}
-
-class B<R> extends A<R> {
-  R bar(double b) => null;
-}
-
-class X implements B<bool> {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-class A<R> {
-  R foo(int a) => null;
-}
-
-class B<R> extends A<R> {
-  R bar(double b) => null;
-}
-
-class X implements B<bool> {
-  @override
-  bool bar(double b) {
-    // TODO: implement bar
-    return null;
-  }
-
-  @override
-  bool foo(int a) {
-    // TODO: implement foo
-    return null;
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_method_generic_withBounds() async {
-    // https://github.com/dart-lang/sdk/issues/31199
-    await resolveTestUnit('''
-abstract class A<K, V> {
-  List<T> foo<T extends V>(K key);
-}
-
-class B<K, V> implements A<K, V> {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-abstract class A<K, V> {
-  List<T> foo<T extends V>(K key);
-}
-
-class B<K, V> implements A<K, V> {
-  @override
-  List<T> foo<T extends V>(K key) {
-    // TODO: implement foo
-    return null;
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_method_notEmptyClassBody() async {
-    await resolveTestUnit('''
-abstract class A {
-  void foo();
-}
-
-class B extends A {
-  void bar() {}
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-abstract class A {
-  void foo();
-}
-
-class B extends A {
-  void bar() {}
-
-  @override
-  void foo() {
-    // TODO: implement foo
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_operator() async {
-    await resolveTestUnit('''
-abstract class A {
-  int operator [](int index);
-  void operator []=(int index, String value);
-}
-
-class B extends A {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-abstract class A {
-  int operator [](int index);
-  void operator []=(int index, String value);
-}
-
-class B extends A {
-  @override
-  int operator [](int index) {
-    // TODO: implement []
-    return null;
-  }
-
-  @override
-  void operator []=(int index, String value) {
-    // TODO: implement []=
-  }
-}
-''');
-  }
-
-  test_createMissingOverrides_setter() async {
-    await resolveTestUnit('''
-abstract class A {
-  set s1(x);
-  set s2(int x);
-  void set s3(String x);
-}
-
-class B extends A {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MISSING_OVERRIDES, '''
-abstract class A {
-  set s1(x);
-  set s2(int x);
-  void set s3(String x);
-}
-
-class B extends A {
-  @override
-  void set s1(x) {
-    // TODO: implement s1
-  }
-
-  @override
-  void set s2(int x) {
-    // TODO: implement s2
-  }
-
-  @override
-  void set s3(String x) {
-    // TODO: implement s3
-  }
-}
-''');
-  }
-
-  test_createMixin() async {
-    await resolveTestUnit('''
-main() {
-  Test v = null;
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MIXIN, '''
-main() {
-  Test v = null;
-}
-
-mixin Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
-  }
-
-  test_createMixin_BAD_hasUnresolvedPrefix() async {
-    await resolveTestUnit('''
-main() {
-  prefix.Test v = null;
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_MIXIN);
-  }
-
-  test_createMixin_BAD_instanceCreation_withNew() async {
-    await resolveTestUnit('''
-main() {
-  new Test();
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_MIXIN);
-  }
-
-  test_createMixin_BAD_instanceCreation_withoutNew() async {
-    await resolveTestUnit('''
-main() {
-  Test();
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_MIXIN);
-  }
-
-  test_createMixin_inLibraryOfPrefix() async {
-    String libCode = r'''
-library my.lib;
-
-class A {}
-''';
-    addSource('/project/lib.dart', libCode);
-    await resolveTestUnit('''
-import 'lib.dart' as lib;
-
-main() {
-  lib.A a = null;
-  lib.Test t = null;
-}
-''');
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_MIXIN, error);
-    change = fix.change;
-    // apply to "lib.dart"
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/project/lib.dart'));
-    expect(SourceEdit.applySequence(libCode, fileEdit.edits), r'''
-library my.lib;
-
-class A {}
-
-mixin Test {
-}
-''');
-    expect(change.linkedEditGroups, hasLength(1));
-  }
-
-  test_createMixin_innerLocalFunction() async {
-    await resolveTestUnit('''
-f() {
-  g() {
-    Test v = null;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MIXIN, '''
-f() {
-  g() {
-    Test v = null;
-  }
-}
-
-mixin Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
-  }
-
-  test_createMixin_itemOfList() async {
-    await resolveTestUnit('''
-main() {
-  var a = [Test];
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_MIXIN, '''
-main() {
-  var a = [Test];
-}
-
-mixin Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test];', 'Test {']);
-  }
-
-  test_createMixin_itemOfList_inAnnotation() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER;
-    };
-    await resolveTestUnit('''
-class MyAnnotation {
-  const MyAnnotation(a, b);
-}
-@MyAnnotation(int, const [Test])
-main() {}
-''');
-    await assertHasFix(DartFixKind.CREATE_MIXIN, '''
-class MyAnnotation {
-  const MyAnnotation(a, b);
-}
-@MyAnnotation(int, const [Test])
-main() {}
-
-mixin Test {
-}
-''');
-    _assertLinkedGroup(change.linkedEditGroups[0], ['Test])', 'Test {']);
-  }
-
-  test_createNoSuchMethod_BAD_classTypeAlias() async {
-    await resolveTestUnit('''
-abstract class A {
-  m();
-}
-
-class B = Object with A;
-''');
-    await assertNoFix(
-      DartFixKind.CREATE_NO_SUCH_METHOD,
-    );
-  }
-
-  test_createNoSuchMethod_OK() async {
-    await resolveTestUnit('''
-abstract class A {
-  m1();
-  int m2();
-}
-
-class B extends A {
-  existing() {}
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_NO_SUCH_METHOD, '''
-abstract class A {
-  m1();
-  int m2();
-}
-
-class B extends A {
-  existing() {}
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-''');
-  }
-
-  test_creationFunction_forFunctionType_cascadeSecond() async {
-    await resolveTestUnit('''
-class A {
-  B ma() => null;
-}
-class B {
-  useFunction(int g(double a, String b)) {}
-}
-
-main() {
-  A a = new A();
-  a..ma().useFunction(test);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-class A {
-  B ma() => null;
-}
-class B {
-  useFunction(int g(double a, String b)) {}
-}
-
-main() {
-  A a = new A();
-  a..ma().useFunction(test);
-}
-
-int test(double a, String b) {
-}
-''');
-  }
-
-  test_creationFunction_forFunctionType_coreFunction() async {
-    await resolveTestUnit('''
-main() {
-  useFunction(g: test);
-}
-useFunction({Function g}) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  useFunction(g: test);
-}
-useFunction({Function g}) {}
-
-test() {
-}
-''');
-  }
-
-  test_creationFunction_forFunctionType_dynamicArgument() async {
-    await resolveTestUnit('''
-main() {
-  useFunction(test);
-}
-useFunction(int g(a, b)) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  useFunction(test);
-}
-useFunction(int g(a, b)) {}
-
-int test(a, b) {
-}
-''');
-  }
-
-  test_creationFunction_forFunctionType_function() async {
-    await resolveTestUnit('''
-main() {
-  useFunction(test);
-}
-useFunction(int g(double a, String b)) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  useFunction(test);
-}
-useFunction(int g(double a, String b)) {}
-
-int test(double a, String b) {
-}
-''');
-  }
-
-  test_creationFunction_forFunctionType_function_namedArgument() async {
-    await resolveTestUnit('''
-main() {
-  useFunction(g: test);
-}
-useFunction({int g(double a, String b)}) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  useFunction(g: test);
-}
-useFunction({int g(double a, String b)}) {}
-
-int test(double a, String b) {
-}
-''');
-  }
-
-  test_creationFunction_forFunctionType_importType() async {
-    addSource('/project/libA.dart', r'''
-library libA;
-class A {}
-''');
-    addSource('/project/libB.dart', r'''
-library libB;
-import 'libA.dart';
-useFunction(int g(A a)) {}
-''');
-    await resolveTestUnit('''
-import 'libB.dart';
-main() {
-  useFunction(test);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-import 'libA.dart';
-import 'libB.dart';
-main() {
-  useFunction(test);
-}
-
-int test(A a) {
-}
-''');
-  }
-
-  test_creationFunction_forFunctionType_method_enclosingClass_static() async {
-    await resolveTestUnit('''
-class A {
-  static foo() {
-    useFunction(test);
-  }
-}
-useFunction(int g(double a, String b)) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  static foo() {
-    useFunction(test);
-  }
-
-  static int test(double a, String b) {
-  }
-}
-useFunction(int g(double a, String b)) {}
-''');
-  }
-
-  test_creationFunction_forFunctionType_method_enclosingClass_static2() async {
-    await resolveTestUnit('''
-class A {
-  var f;
-  A() : f = useFunction(test);
-}
-useFunction(int g(double a, String b)) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  var f;
-  A() : f = useFunction(test);
-
-  static int test(double a, String b) {
-  }
-}
-useFunction(int g(double a, String b)) {}
-''');
-  }
-
-  test_creationFunction_forFunctionType_method_targetClass() async {
-    await resolveTestUnit('''
-main(A a) {
-  useFunction(a.test);
-}
-class A {
-}
-useFunction(int g(double a, String b)) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-main(A a) {
-  useFunction(a.test);
-}
-class A {
-  int test(double a, String b) {
-  }
-}
-useFunction(int g(double a, String b)) {}
-''');
-  }
-
-  test_creationFunction_forFunctionType_method_targetClass_hasOtherMember() async {
-    await resolveTestUnit('''
-main(A a) {
-  useFunction(a.test);
-}
-class A {
-  m() {}
-}
-useFunction(int g(double a, String b)) {}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-main(A a) {
-  useFunction(a.test);
-}
-class A {
-  m() {}
-
-  int test(double a, String b) {
-  }
-}
-useFunction(int g(double a, String b)) {}
-''');
-  }
-
-  test_creationFunction_forFunctionType_notFunctionType() async {
-    await resolveTestUnit('''
-main(A a) {
-  useFunction(a.test);
-}
-typedef A();
-useFunction(g) {}
-''');
-    await assertNoFix(DartFixKind.CREATE_METHOD);
-    await assertNoFix(DartFixKind.CREATE_FUNCTION);
-  }
-
-  test_creationFunction_forFunctionType_unknownTarget() async {
-    await resolveTestUnit('''
-main(A a) {
-  useFunction(a.test);
-}
-class A {
-}
-useFunction(g) {}
-''');
-    await assertNoFix(DartFixKind.CREATE_METHOD);
-  }
-
-  test_expectedToken_semicolon() async {
-    await resolveTestUnit('''
-main() {
-  print(0)
-}
-''');
-    await assertHasFix(DartFixKind.INSERT_SEMICOLON, '''
-main() {
-  print(0);
-}
-''');
-  }
-
-  test_illegalAsyncReturnType_adjacentNodes() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
-    };
-    await resolveTestUnit('''
-import 'dart:async';
-var v;int main() async => 0;
-''');
-    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
-import 'dart:async';
-var v;Future<int> main() async => 0;
-''');
-  }
-
-  test_illegalAsyncReturnType_asyncLibrary_import() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
-    };
-    await resolveTestUnit('''
-library main;
-int main() async {
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
-library main;
-
-import 'dart:async';
-
-Future<int> main() async {
-}
-''');
-  }
-
-  test_illegalAsyncReturnType_asyncLibrary_usePrefix() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
-    };
-    await resolveTestUnit('''
-import 'dart:async' as al;
-int main() async {
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
-import 'dart:async' as al;
-al.Future<int> main() async {
-}
-''');
-  }
-
-  test_illegalAsyncReturnType_complexTypeName() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
-    };
-    await resolveTestUnit('''
-import 'dart:async';
-List<int> main() async {
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_RETURN_TYPE_FUTURE, '''
-import 'dart:async';
-Future<List<int>> main() async {
-}
-''');
-  }
-
-  test_importLibraryPackage_preferDirectOverExport() async {
-    _configureMyPkg({'b.dart': 'class Test {}', 'a.dart': "export 'b.dart';"});
-    await resolveTestUnit('''
-main() {
-  Test test = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'package:my_pkg/b.dart';
-
-main() {
-  Test test = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT2, '''
-import 'package:my_pkg/a.dart';
-
-main() {
-  Test test = null;
-}
-''');
-  }
-
-  test_importLibraryPackage_preferDirectOverExport_src() async {
-    myPkgLibPath = '/my/src/packages/my_pkg/lib';
-    _configureMyPkg({'b.dart': 'class Test {}', 'a.dart': "export 'b.dart';"});
-    await resolveTestUnit('''
-main() {
-  Test test = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'package:my_pkg/b.dart';
-
-main() {
-  Test test = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT2, '''
-import 'package:my_pkg/a.dart';
-
-main() {
-  Test test = null;
-}
-''');
-  }
-
-  test_importLibraryProject_BAD_inLibSrc_differentContextRoot() async {
-    addPackageSource('bbb', 'b1.dart', r'''
-import 'src/b2.dart';
-''');
-    addPackageSource('bbb', 'src/b2.dart', 'class Test {}');
-    await resolveTestUnit('''
-import 'package:bbb/b1.dart';
-main() {
-  Test t;
-}
-''');
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_CLASS;
-    };
-    await assertNoFix(DartFixKind.IMPORT_LIBRARY_PROJECT3);
-  }
-
-  test_importLibraryProject_BAD_notInLib_BUILD() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/other/test/lib.dart', 'class Test {}');
-    await resolveTestUnit('''
-main() {
-  Test t;
-}
-''');
-    await assertNoFix(DartFixKind.IMPORT_LIBRARY_PROJECT1);
-  }
-
-  test_importLibraryProject_BAD_notInLib_pubspec() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/other/test/lib.dart', 'class Test {}');
-    await resolveTestUnit('''
-main() {
-  Test t;
-}
-''');
-    await assertNoFix(DartFixKind.IMPORT_LIBRARY_PROJECT1);
-  }
-
-  test_importLibraryProject_OK_inLibSrc_thisContextRoot() async {
-    testFile = '/project/lib/test.dart';
-    packageMap['project'] = [newFolder('/project/lib')];
-    addSource('/project/lib/src/lib.dart', 'class Test {}');
-    configureDriver();
-    await resolveTestUnit('''
-main() {
-  Test t;
-}
-''');
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_CLASS;
-    };
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT3, '''
-import 'package:project/src/lib.dart';
-
-main() {
-  Test t;
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_annotation() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-library lib;
-class Test {
-  const Test(int p);
-}
-''');
-    await resolveTestUnit('''
-@Test(0)
-main() {
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-@Test(0)
-main() {
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_hasOtherLibraryWithPrefix() async {
-    testFile = '/project/bin/test.dart';
-    addSource('/project/bin/a.dart', '''
-library a;
-class One {}
-''');
-    addSource('/project/bin/b.dart', '''
-library b;
-class One {}
-class Two {}
-''');
-    await resolveTestUnit('''
-import 'b.dart' show Two;
-main () {
-  new Two();
-  new One();
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'a.dart';
-import 'b.dart' show Two;
-main () {
-  new Two();
-  new One();
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_inParentFolder() async {
-    testFile = '/project/bin/test.dart';
-    addSource('/project/lib.dart', '''
-library lib;
-class Test {}
-''');
-    await resolveTestUnit('''
-main() {
-  Test t = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import '../lib.dart';
-
-main() {
-  Test t = null;
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_inRelativeFolder() async {
-    testFile = '/project/bin/test.dart';
-    addSource('/project/lib/sub/folder/lib.dart', '''
-library lib;
-class Test {}
-''');
-    await resolveTestUnit('''
-main() {
-  Test t = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import '../lib/sub/folder/lib.dart';
-
-main() {
-  Test t = null;
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_inSameFolder() async {
-    testFile = '/project/bin/test.dart';
-    addSource('/project/bin/lib.dart', '''
-library lib;
-class Test {}
-''');
-    await resolveTestUnit('''
-main() {
-  Test t = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  Test t = null;
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_instanceCreation_const() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-class Test {
-  const Test();
-}
-''');
-    await resolveTestUnit('''
-main() {
-  return const Test();
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  return const Test();
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_instanceCreation_const_namedConstructor() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-class Test {
-  const Test.named();
-}
-''');
-    await resolveTestUnit('''
-main() {
-  const Test.named();
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  const Test.named();
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_instanceCreation_implicit() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-class Test {
-  const Test();
-}
-''');
-    await resolveTestUnit('''
-main() {
-  return Test();
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  return Test();
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_instanceCreation_new() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-class Test {
-  const Test();
-}
-''');
-    await resolveTestUnit('''
-main() {
-  return new Test();
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  return new Test();
-}
-''');
-  }
-
-  test_importLibraryProject_withClass_instanceCreation_new_namedConstructor() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-class Test {
-  Test.named();
-}
-''');
-    await resolveTestUnit('''
-main() {
-  new Test.named();
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  new Test.named();
-}
-''');
-  }
-
-  test_importLibraryProject_withFunction() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-library lib;
-myFunction() {}
-''');
-    await resolveTestUnit('''
-main() {
-  myFunction();
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  myFunction();
-}
-''');
-  }
-
-  test_importLibraryProject_withFunction_unresolvedMethod() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-library lib;
-myFunction() {}
-''');
-    await resolveTestUnit('''
-class A {
-  main() {
-    myFunction();
-  }
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-class A {
-  main() {
-    myFunction();
-  }
-}
-''');
-  }
-
-  test_importLibraryProject_withFunctionTypeAlias() async {
-    testFile = '/project/bin/test.dart';
-    addSource('/project/bin/lib.dart', '''
-library lib;
-typedef MyFunction();
-''');
-    await resolveTestUnit('''
-main() {
-  MyFunction t = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  MyFunction t = null;
-}
-''');
-  }
-
-  test_importLibraryProject_withTopLevelVariable() async {
-    testFile = '/project/lib/test.dart';
-    addSource('/project/lib/lib.dart', '''
-library lib;
-int MY_VAR = 42;
-''');
-    await resolveTestUnit('''
-main() {
-  print(MY_VAR);
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PROJECT1, '''
-import 'lib.dart';
-
-main() {
-  print(MY_VAR);
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_AsExpression() async {
-    await resolveTestUnit('''
-main(p) {
-  p as Future;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-main(p) {
-  p as Future;
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_instanceCreation_explicitNew() async {
-    await resolveTestUnit('''
-class C {
-  foo() {
-    new Future();
-  }
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-class C {
-  foo() {
-    new Future();
-  }
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_instanceCreation_explicitNew_namedConstructor() async {
-    await resolveTestUnit('''
-class C {
-  foo() {
-    new Future.value(0);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-class C {
-  foo() {
-    new Future.value(0);
-  }
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_instanceCreation_implicitNew() async {
-    configurePreviewDart2();
-    await resolveTestUnit('''
-class C {
-  foo() {
-    Future();
-  }
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-class C {
-  foo() {
-    Future();
-  }
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_instanceCreation_implicitNew_namedConstructor() async {
-    configurePreviewDart2();
-    await resolveTestUnit('''
-class C {
-  foo() {
-    Future.value(0);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-class C {
-  foo() {
-    Future.value(0);
-  }
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_invocationTarget() async {
-    await resolveTestUnit('''
-main() {
-  Future.wait(null);
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-main() {
-  Future.wait(null);
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_IsExpression() async {
-    await resolveTestUnit('''
-main(p) {
-  p is Future;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-main(p) {
-  p is Future;
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_itemOfList() async {
-    await resolveTestUnit('''
-main() {
-  var a = [Future];
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-main() {
-  var a = [Future];
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_itemOfList_inAnnotation() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER;
-    };
-    await resolveTestUnit('''
-class MyAnnotation {
-  const MyAnnotation(a, b);
-}
-@MyAnnotation(int, const [Future])
-main() {}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-class MyAnnotation {
-  const MyAnnotation(a, b);
-}
-@MyAnnotation(int, const [Future])
-main() {}
-''');
-  }
-
-  test_importLibrarySdk_withClass_typeAnnotation() async {
-    await resolveTestUnit('''
-main() {
-  Future f = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-main() {
-  Future f = null;
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_typeAnnotation_PrefixedIdentifier() async {
-    await resolveTestUnit('''
-main() {
-  Future.wait;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-main() {
-  Future.wait;
-}
-''');
-  }
-
-  test_importLibrarySdk_withClass_typeArgument() async {
-    await resolveTestUnit('''
-main() {
-  List<Future> futures = [];
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:async';
-
-main() {
-  List<Future> futures = [];
-}
-''');
-  }
-
-  test_importLibrarySdk_withTopLevelVariable() async {
-    await resolveTestUnit('''
-main() {
-  print(PI);
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:math';
-
-main() {
-  print(PI);
-}
-''');
-  }
-
-  test_importLibrarySdk_withTopLevelVariable_annotation() async {
-    await resolveTestUnit('''
-@PI
-main() {
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SDK, '''
-import 'dart:math';
-
-@PI
-main() {
-}
-''');
-  }
-
-  test_importLibraryShow_project() async {
-    testFile = '/project/bin/test.dart';
-    addSource('/project/bin/lib.dart', '''
-class A {}
-class B {}
-''');
-    await resolveTestUnit('''
-import 'lib.dart' show A;
-main() {
-  A a;
-  B b;
-}
-''');
-    await assertNoFix(DartFixKind.IMPORT_LIBRARY_PROJECT1);
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SHOW, '''
-import 'lib.dart' show A, B;
-main() {
-  A a;
-  B b;
-}
-''');
-  }
-
-  test_importLibraryShow_sdk() async {
-    await resolveTestUnit('''
-import 'dart:async' show Stream;
-main() {
-  Stream s = null;
-  Future f = null;
-}
-''');
-    await assertNoFix(DartFixKind.IMPORT_LIBRARY_SDK);
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_SHOW, '''
-import 'dart:async' show Future, Stream;
-main() {
-  Stream s = null;
-  Future f = null;
-}
-''');
-  }
-
-  test_impreciseIntAsDouble() async {
-    await resolveTestUnit('''
-double x = 1000000000000000000000000;
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_NEAREST_PRECISE_VALUE, '''
-double x = 999999999999999983222784;
-''');
-  }
-
-  test_impreciseIntAsDouble_asCapitalHex() async {
-    await resolveTestUnit('''
-double x = 0X1000000000000000000000001;
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_NEAREST_PRECISE_VALUE, '''
-double x = 0x1000000000000000000000000;
-''');
-  }
-
-  test_impreciseIntAsDouble_asHex() async {
-    await resolveTestUnit('''
-double x = 0x1000000000000000000000001;
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_NEAREST_PRECISE_VALUE, '''
-double x = 0x1000000000000000000000000;
-''');
-  }
-
-  test_impreciseIntAsDouble_maxValue() async {
-    await resolveTestUnit('''
-double x = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_NEAREST_PRECISE_VALUE, '''
-double x = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368;
-''');
-  }
-
-  test_impreciseIntAsDouble_maxValue_asHex() async {
-    await resolveTestUnit('''
-double x = 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO_NEAREST_PRECISE_VALUE, '''
-double x = 0xFFFFFFFFFFFFF800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
-''');
-  }
-
-  test_isNotNull() async {
-    await resolveTestUnit('''
-main(p) {
-  p is! Null;
-}
-''');
-    await assertHasFix(DartFixKind.USE_NOT_EQ_NULL, '''
-main(p) {
-  p != null;
-}
-''');
-  }
-
-  test_isNotNull_all() async {
-    await resolveTestUnit('''
-main(p, q) {
-  p is! Null;
-  q is! Null;
-}
-''');
-    await assertHasFixAllFix(
-        HintCode.TYPE_CHECK_IS_NOT_NULL, DartFixKind.USE_NOT_EQ_NULL, '''
-main(p, q) {
-  p != null;
-  q != null;
-}
-''');
-  }
-
-  test_isNull() async {
-    await resolveTestUnit('''
-main(p) {
-  p is Null;
-}
-''');
-    await assertHasFix(DartFixKind.USE_EQ_EQ_NULL, '''
-main(p) {
-  p == null;
-}
-''');
-  }
-
-  test_isNull_all() async {
-    await resolveTestUnit('''
-main(p, q) {
-  p is Null;
-  q is Null;
-}
-''');
-    await assertHasFixAllFix(
-        HintCode.TYPE_CHECK_IS_NULL, DartFixKind.USE_EQ_EQ_NULL, '''
-main(p, q) {
-  p == null;
-  q == null;
-}
-''');
-  }
-
-  test_makeEnclosingClassAbstract_declaresAbstractMethod() async {
-    await resolveTestUnit('''
-class A {
-  m();
-}
-''');
-    await assertHasFix(DartFixKind.MAKE_CLASS_ABSTRACT, '''
-abstract class A {
-  m();
-}
-''');
-  }
-
-  test_makeEnclosingClassAbstract_inheritsAbstractMethod() async {
-    await resolveTestUnit('''
-abstract class A {
-  m();
-}
-class B extends A {
-}
-''');
-    await assertHasFix(DartFixKind.MAKE_CLASS_ABSTRACT, '''
-abstract class A {
-  m();
-}
-abstract class B extends A {
-}
-''');
-  }
-
-  test_makeFieldNotFinal_hasType() async {
-    await resolveTestUnit('''
-class A {
-  final int fff = 1;
-  main() {
-    fff = 2;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.MAKE_FIELD_NOT_FINAL, '''
-class A {
-  int fff = 1;
-  main() {
-    fff = 2;
-  }
-}
-''');
-  }
-
-  test_makeFieldNotFinal_noType() async {
-    await resolveTestUnit('''
-class A {
-  final fff = 1;
-  main() {
-    fff = 2;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.MAKE_FIELD_NOT_FINAL, '''
-class A {
-  var fff = 1;
-  main() {
-    fff = 2;
-  }
-}
-''');
-  }
-
-  test_moveTypeArgumentsToClass_explicitConst() async {
-    await resolveTestUnit('''
-main() {
-  const C.named<int>();
-}
-class C<E> {
-  const C.named();
-}
-''');
-    await assertHasFix(DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS, '''
-main() {
-  const C<int>.named();
-}
-class C<E> {
-  const C.named();
-}
-''');
-  }
-
-  test_moveTypeArgumentsToClass_explicitNew() async {
-    await resolveTestUnit('''
-main() {
-  new C.named<int>();
-}
-class C<E> {
-  C.named();
-}
-''');
-    await assertHasFix(DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS, '''
-main() {
-  new C<int>.named();
-}
-class C<E> {
-  C.named();
-}
-''');
-  }
-
-  test_moveTypeArgumentsToClass_explicitNew_BAD_alreadyThere() async {
-    await resolveTestUnit('''
-main() {
-  new C<String>.named<int>();
-}
-class C<E> {
-  C.named();
-}
-''');
-    await assertNoFix(DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS);
-  }
-
-  test_moveTypeArgumentsToClass_explicitNew_BAD_wrongNumber() async {
-    await resolveTestUnit('''
-main() {
-  new C.named<int, String>();
-}
-class C<E> {
-  C.named();
-}
-''');
-    await assertNoFix(DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS);
-  }
-
-  test_moveTypeArgumentsToClass_implicitConst() async {
-    await resolveTestUnit('''
-main() {
-  const C c = C.named<int>();
-}
-class C<E> {
-  const C.named();
-}
-''');
-    await assertHasFix(DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS, '''
-main() {
-  const C c = C<int>.named();
-}
-class C<E> {
-  const C.named();
-}
-''');
-  }
-
-  test_moveTypeArgumentsToClass_implicitNew() async {
-    await resolveTestUnit('''
-main() {
-  C.named<int>();
-}
-class C<E> {
-  C.named();
-}
-''');
-    await assertHasFix(DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS, '''
-main() {
-  C<int>.named();
-}
-class C<E> {
-  C.named();
-}
-''');
-  }
-
-  test_noException_1() async {
-    await resolveTestUnit('''
-main(p) {
-  p i s Null;
-}''');
-    List<AnalysisError> errors = await _computeErrors();
-    for (var error in errors) {
-      await _computeFixes(error);
-    }
-  }
-
-  test_nonBoolCondition_addNotNull() async {
-    await resolveTestUnit('''
-main(String p) {
-  if (p) {
-    print(p);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.ADD_NE_NULL, '''
-main(String p) {
-  if (p != null) {
-    print(p);
-  }
-}
-''');
-  }
-
-  test_nonBoolCondition_addNotNull_all() async {
-    await resolveTestUnit('''
-main(String p, String q) {
-  if (p) {
-    print(p);
-  }
-  if (q) {
-    print(q);
-  }
-}
-''');
-    await assertHasFixAllFix(
-        StaticTypeWarningCode.NON_BOOL_CONDITION, DartFixKind.ADD_NE_NULL, '''
-main(String p, String q) {
-  if (p != null) {
-    print(p);
-  }
-  if (q != null) {
-    print(q);
-  }
-}
-''');
-  }
-
-  test_removeDeadCode_condition() async {
-    await resolveTestUnit('''
-main(int p) {
-  if (true || p > 5) {
-    print(1);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_DEAD_CODE, '''
-main(int p) {
-  if (true) {
-    print(1);
-  }
-}
-''');
-  }
-
-  test_removeDeadCode_statements_one() async {
-    await resolveTestUnit('''
-int main() {
-  print(0);
-  return 42;
-  print(1);
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_DEAD_CODE, '''
-int main() {
-  print(0);
-  return 42;
-}
-''');
-  }
-
-  test_removeDeadCode_statements_two() async {
-    await resolveTestUnit('''
-int main() {
-  print(0);
-  return 42;
-  print(1);
-  print(2);
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_DEAD_CODE, '''
-int main() {
-  print(0);
-  return 42;
-}
-''');
-  }
-
-  test_removeParentheses_inGetterDeclaration() async {
-    await resolveTestUnit('''
-class A {
-  int get foo() => 0;
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION, '''
-class A {
-  int get foo => 0;
-}
-''');
-  }
-
-  test_removeParentheses_inGetterInvocation() async {
-    await resolveTestUnit('''
-class A {
-  int get foo => 0;
-}
-main(A a) {
-  a.foo();
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION, '''
-class A {
-  int get foo => 0;
-}
-main(A a) {
-  a.foo;
-}
-''');
-  }
-
-  test_removeTypeArguments_explicitConst() async {
-    await resolveTestUnit('''
-main() {
-  const C.named<int>();
-}
-class C<E> {
-  const C.named();
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_TYPE_ARGUMENTS, '''
-main() {
-  const C.named();
-}
-class C<E> {
-  const C.named();
-}
-''');
-  }
-
-  test_removeTypeArguments_explicitNew() async {
-    await resolveTestUnit('''
-main() {
-  new C.named<int>();
-}
-class C<E> {
-  C.named();
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_TYPE_ARGUMENTS, '''
-main() {
-  new C.named();
-}
-class C<E> {
-  C.named();
-}
-''');
-  }
-
-  test_removeTypeArguments_implicitConst() async {
-    await resolveTestUnit('''
-main() {
-  const C c = C.named<int>();
-}
-class C<E> {
-  const C.named();
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_TYPE_ARGUMENTS, '''
-main() {
-  const C c = C.named();
-}
-class C<E> {
-  const C.named();
-}
-''');
-  }
-
-  test_removeTypeArguments_implicitNew() async {
-    await resolveTestUnit('''
-main() {
-  C.named<int>();
-}
-class C<E> {
-  C.named();
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_TYPE_ARGUMENTS, '''
-main() {
-  C.named();
-}
-class C<E> {
-  C.named();
-}
-''');
-  }
-
-  test_removeUnnecessaryCast_assignment() async {
-    await resolveTestUnit('''
-main(Object p) {
-  if (p is String) {
-    String v = ((p as String));
-  }
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNNECESSARY_CAST, '''
-main(Object p) {
-  if (p is String) {
-    String v = p;
-  }
-}
-''');
-  }
-
-  test_removeUnnecessaryCast_assignment_all() async {
-    await resolveTestUnit('''
-main(Object p, Object q) {
-  if (p is String) {
-    String v = ((p as String));
-  }
-  if (q is int) {
-    int v = ((q as int));
-  }
-}
-''');
-    await assertHasFixAllFix(
-        HintCode.UNNECESSARY_CAST, DartFixKind.REMOVE_UNNECESSARY_CAST, '''
-main(Object p, Object q) {
-  if (p is String) {
-    String v = p;
-  }
-  if (q is int) {
-    int v = q;
-  }
-}
-''');
-  }
-
-  test_removeUnusedCatchClause() async {
-    errorFilter = (AnalysisError error) => true;
-    await resolveTestUnit('''
-main() {
-  try {
-    throw 42;
-  } on int catch (e) {
-  }
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE, '''
-main() {
-  try {
-    throw 42;
-  } on int {
-  }
-}
-''');
-  }
-
-  test_removeUnusedCatchStack() async {
-    errorFilter = (AnalysisError error) => true;
-    await resolveTestUnit('''
-main() {
-  try {
-    throw 42;
-  } catch (e, stack) {
-  }
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_CATCH_STACK, '''
-main() {
-  try {
-    throw 42;
-  } catch (e) {
-  }
-}
-''');
-  }
-
-  test_removeUnusedImport() async {
-    await resolveTestUnit('''
-import 'dart:math';
-main() {
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
-main() {
-}
-''');
-  }
-
-  test_removeUnusedImport_all() async {
-    await resolveTestUnit('''
-import 'dart:math';
-import 'dart:math';
-import 'dart:math';
-main() {
-}
-''');
-    await assertHasFixAllFix(
-        HintCode.UNUSED_IMPORT, DartFixKind.REMOVE_UNUSED_IMPORT, '''
-main() {
-}
-''');
-  }
-
-  test_removeUnusedImport_all_diverseImports() async {
-    await resolveTestUnit('''
-import 'dart:math';
-import 'dart:math';
-import 'dart:async';
-main() {
-}
-''');
-    await assertHasFixAllFix(
-        HintCode.UNUSED_IMPORT, DartFixKind.REMOVE_UNUSED_IMPORT, '''
-main() {
-}
-''');
-  }
-
-  test_removeUnusedImport_all_diverseImports2() async {
-    await resolveTestUnit('''
-import 'dart:async';
-import 'dart:math' as math;
-import 'dart:async';
-
-var tau = math.pi * 2;
-
-main() {
-}
-''');
-    await assertHasFixAllFix(
-        HintCode.UNUSED_IMPORT, DartFixKind.REMOVE_UNUSED_IMPORT, '''
-import 'dart:math' as math;
-
-var tau = math.pi * 2;
-
-main() {
-}
-''');
-  }
-
-  test_removeUnusedImport_all_singleLine() async {
-    await resolveTestUnit('''
-import 'dart:math'; import 'dart:math'; import 'dart:math';
-main() {
-}
-''');
-    await assertHasFixAllFix(
-        HintCode.UNUSED_IMPORT, DartFixKind.REMOVE_UNUSED_IMPORT, '''
-main() {
-}
-''');
-  }
-
-  test_removeUnusedImport_anotherImportOnLine() async {
-    await resolveTestUnit('''
-import 'dart:math'; import 'dart:async';
-
-main() {
-  Future f;
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
-import 'dart:async';
-
-main() {
-  Future f;
-}
-''');
-  }
-
-  test_removeUnusedImport_severalLines() async {
-    await resolveTestUnit('''
-import
-  'dart:math';
-main() {
-}
-''');
-    await assertHasFix(DartFixKind.REMOVE_UNUSED_IMPORT, '''
-main() {
-}
-''');
-  }
-
-  test_replaceVarWithDynamic() async {
-    errorFilter = (AnalysisError error) {
-      return error.errorCode == ParserErrorCode.VAR_AS_TYPE_NAME;
-    };
-    await resolveTestUnit('''
-class A {
-  Map<String, var> m;
-}
-''');
-    await assertHasFix(DartFixKind.REPLACE_VAR_WITH_DYNAMIC, '''
-class A {
-  Map<String, dynamic> m;
-}
-''');
-  }
-
-  test_replaceWithConstInstanceCreation_explicitNew() async {
-    await resolveTestUnit('''
-class A {
-  const A();
-}
-const a = new A();
-''');
-    await assertHasFix(DartFixKind.USE_CONST, '''
-class A {
-  const A();
-}
-const a = const A();
-''');
-  }
-
-  test_undefinedClass_useSimilar_BAD_prefixed() async {
-    await resolveTestUnit('''
-import 'dart:async' as c;
-main() {
-  c.Fture v = null;
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-import 'dart:async' as c;
-main() {
-  c.Future v = null;
-}
-''');
-  }
-
-  test_undefinedClass_useSimilar_fromImport() async {
-    await resolveTestUnit('''
-main() {
-  Stirng s = 'abc';
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-main() {
-  String s = 'abc';
-}
-''');
-  }
-
-  test_undefinedClass_useSimilar_fromThisLibrary() async {
-    await resolveTestUnit('''
-class MyClass {}
-main() {
-  MyCalss v = null;
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class MyClass {}
-main() {
-  MyClass v = null;
-}
-''');
-  }
-
-  test_undefinedFunction_create_bottomArgument() async {
-    await resolveTestUnit('''
-main() {
-  test(throw 42);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  test(throw 42);
-}
-
-void test(param0) {
-}
-''');
-  }
-
-  test_undefinedFunction_create_duplicateArgumentNames() async {
-    await resolveTestUnit('''
-class C {
-  int x;
-}
-
-foo(C c1, C c2) {
-  bar(c1.x, c2.x);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-class C {
-  int x;
-}
-
-foo(C c1, C c2) {
-  bar(c1.x, c2.x);
-}
-
-void bar(int x, int x2) {
-}
-''');
-  }
-
-  test_undefinedFunction_create_dynamicArgument() async {
-    await resolveTestUnit('''
-main() {
-  dynamic v;
-  test(v);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  dynamic v;
-  test(v);
-}
-
-void test(v) {
-}
-''');
-  }
-
-  test_undefinedFunction_create_dynamicReturnType() async {
-    await resolveTestUnit('''
-main() {
-  dynamic v = test();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  dynamic v = test();
-}
-
-test() {
-}
-''');
-  }
-
-  test_undefinedFunction_create_fromFunction() async {
-    await resolveTestUnit('''
-main() {
-  int v = myUndefinedFunction(1, 2.0, '3');
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  int v = myUndefinedFunction(1, 2.0, '3');
-}
-
-int myUndefinedFunction(int i, double d, String s) {
-}
-''');
-  }
-
-  test_undefinedFunction_create_fromMethod() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    int v = myUndefinedFunction(1, 2.0, '3');
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-class A {
-  main() {
-    int v = myUndefinedFunction(1, 2.0, '3');
-  }
-}
-
-int myUndefinedFunction(int i, double d, String s) {
-}
-''');
-  }
-
-  test_undefinedFunction_create_generic_BAD() async {
-    await resolveTestUnit('''
-class A<T> {
-  Map<int, T> items;
-  main() {
-    process(items);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-class A<T> {
-  Map<int, T> items;
-  main() {
-    process(items);
-  }
-}
-
-void process(Map items) {
-}
-''');
-  }
-
-  test_undefinedFunction_create_generic_OK() async {
-    await resolveTestUnit('''
-class A {
-  List<int> items;
-  main() {
-    process(items);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-class A {
-  List<int> items;
-  main() {
-    process(items);
-  }
-}
-
-void process(List<int> items) {
-}
-''');
-    _assertLinkedGroup(
-        change.linkedEditGroups[2],
-        ['List<int> items) {'],
-        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
-            ['List<int>', 'Iterable<int>', 'Object']));
-  }
-
-  test_undefinedFunction_create_importType() async {
-    addSource('/project/lib.dart', r'''
-library lib;
-import 'dart:async';
-Future getFuture() => null;
-''');
-    await resolveTestUnit('''
-import 'lib.dart';
-main() {
-  test(getFuture());
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-import 'dart:async';
-
-import 'lib.dart';
-main() {
-  test(getFuture());
-}
-
-void test(Future future) {
-}
-''');
-  }
-
-  test_undefinedFunction_create_nullArgument() async {
-    await resolveTestUnit('''
-main() {
-  test(null);
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  test(null);
-}
-
-void test(param0) {
-}
-''');
-  }
-
-  test_undefinedFunction_create_returnType_bool_expressions() async {
-    await assert_undefinedFunction_create_returnType_bool("!test();");
-    await assert_undefinedFunction_create_returnType_bool("b && test();");
-    await assert_undefinedFunction_create_returnType_bool("test() && b;");
-    await assert_undefinedFunction_create_returnType_bool("b || test();");
-    await assert_undefinedFunction_create_returnType_bool("test() || b;");
-  }
-
-  test_undefinedFunction_create_returnType_bool_statements() async {
-    await assert_undefinedFunction_create_returnType_bool("assert ( test() );");
-    await assert_undefinedFunction_create_returnType_bool("if ( test() ) {}");
-    await assert_undefinedFunction_create_returnType_bool(
-        "while ( test() ) {}");
-    await assert_undefinedFunction_create_returnType_bool(
-        "do {} while ( test() );");
-  }
-
-  test_undefinedFunction_create_returnType_fromAssignment_eq() async {
-    await resolveTestUnit('''
-main() {
-  int v;
-  v = myUndefinedFunction();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  int v;
-  v = myUndefinedFunction();
-}
-
-int myUndefinedFunction() {
-}
-''');
-  }
-
-  test_undefinedFunction_create_returnType_fromAssignment_plusEq() async {
-    await resolveTestUnit('''
-main() {
-  int v;
-  v += myUndefinedFunction();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  int v;
-  v += myUndefinedFunction();
-}
-
-num myUndefinedFunction() {
-}
-''');
-  }
-
-  test_undefinedFunction_create_returnType_fromBinary_right() async {
-    await resolveTestUnit('''
-main() {
-  0 + myUndefinedFunction();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  0 + myUndefinedFunction();
-}
-
-num myUndefinedFunction() {
-}
-''');
-  }
-
-  test_undefinedFunction_create_returnType_fromInitializer() async {
-    await resolveTestUnit('''
-main() {
-  int v = myUndefinedFunction();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  int v = myUndefinedFunction();
-}
-
-int myUndefinedFunction() {
-}
-''');
-  }
-
-  test_undefinedFunction_create_returnType_fromInvocationArgument() async {
-    await resolveTestUnit('''
-foo(int p) {}
-main() {
-  foo( myUndefinedFunction() );
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-foo(int p) {}
-main() {
-  foo( myUndefinedFunction() );
-}
-
-int myUndefinedFunction() {
-}
-''');
-  }
-
-  test_undefinedFunction_create_returnType_fromReturn() async {
-    await resolveTestUnit('''
-int main() {
-  return myUndefinedFunction();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-int main() {
-  return myUndefinedFunction();
-}
-
-int myUndefinedFunction() {
-}
-''');
-  }
-
-  test_undefinedFunction_create_returnType_void() async {
-    await resolveTestUnit('''
-main() {
-  myUndefinedFunction();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_FUNCTION, '''
-main() {
-  myUndefinedFunction();
-}
-
-void myUndefinedFunction() {
-}
-''');
-  }
-
-  test_undefinedFunction_useSimilar_fromImport() async {
-    await resolveTestUnit('''
-main() {
-  pritn(0);
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-main() {
-  print(0);
-}
-''');
-  }
-
-  test_undefinedFunction_useSimilar_prefixed_fromImport() async {
-    await resolveTestUnit('''
-import 'dart:core' as c;
-main() {
-  c.prnt(42);
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-import 'dart:core' as c;
-main() {
-  c.print(42);
-}
-''');
-  }
-
-  test_undefinedFunction_useSimilar_prefixed_ignoreLocal() async {
-    await resolveTestUnit('''
-import 'dart:async' as c;
-main() {
-  c.main();
-}
-''');
-    await assertNoFix(DartFixKind.CHANGE_TO);
-  }
-
-  test_undefinedFunction_useSimilar_thisLibrary() async {
-    await resolveTestUnit('''
-myFunction() {}
-main() {
-  myFuntcion();
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-myFunction() {}
-main() {
-  myFunction();
-}
-''');
-  }
-
-  test_undefinedGetter_useSimilar_hint() async {
-    await resolveTestUnit('''
-class A {
-  int myField;
-}
-main(A a) {
-  var x = a;
-  print(x.myFild);
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  int myField;
-}
-main(A a) {
-  var x = a;
-  print(x.myField);
-}
-''');
-  }
-
-  test_undefinedGetter_useSimilar_qualified() async {
-    await resolveTestUnit('''
-class A {
-  int myField;
-}
-main(A a) {
-  print(a.myFild);
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  int myField;
-}
-main(A a) {
-  print(a.myField);
-}
-''');
-  }
-
-  test_undefinedGetter_useSimilar_qualified_static() async {
-    await resolveTestUnit('''
-class A {
-  static int MY_NAME = 1;
-}
-main() {
-  A.MY_NAM;
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  static int MY_NAME = 1;
-}
-main() {
-  A.MY_NAME;
-}
-''');
-  }
-
-  test_undefinedGetter_useSimilar_unqualified() async {
-    await resolveTestUnit('''
-class A {
-  int myField;
-  main() {
-    print(myFild);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  int myField;
-  main() {
-    print(myField);
-  }
-}
-''');
-  }
-
-  test_undefinedMethod_create_BAD_inSDK() async {
-    await resolveTestUnit('''
-main() {
-  List.foo();
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_METHOD);
-  }
-
-  test_undefinedMethod_create_BAD_targetIsEnum() async {
-    await resolveTestUnit('''
-enum MyEnum {A, B}
-main() {
-  MyEnum.foo();
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_METHOD);
-  }
-
-  test_undefinedMethod_create_generic_BAD_argumentType() async {
-    await resolveTestUnit('''
-class A<T> {
-  B b;
-  Map<int, T> items;
-  main() {
-    b.process(items);
-  }
-}
-
-class B {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A<T> {
-  B b;
-  Map<int, T> items;
-  main() {
-    b.process(items);
-  }
-}
-
-class B {
-  void process(Map items) {}
-}
-''');
-  }
-
-  test_undefinedMethod_create_generic_BAD_returnType() async {
-    await resolveTestUnit('''
-class A<T> {
-  main() {
-    T t = new B().compute();
-  }
-}
-
-class B {
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A<T> {
-  main() {
-    T t = new B().compute();
-  }
-}
-
-class B {
-  compute() {}
-}
-''');
-  }
-
-  test_undefinedMethod_create_generic_OK_literal() async {
-    await resolveTestUnit('''
-class A {
-  B b;
-  List<int> items;
-  main() {
-    b.process(items);
-  }
-}
-
-class B {}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  B b;
-  List<int> items;
-  main() {
-    b.process(items);
-  }
-}
-
-class B {
-  void process(List<int> items) {}
-}
-''');
-  }
-
-  test_undefinedMethod_create_generic_OK_local() async {
-    await resolveTestUnit('''
-class A<T> {
-  List<T> items;
-  main() {
-    process(items);
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A<T> {
-  List<T> items;
-  main() {
-    process(items);
-  }
-
-  void process(List<T> items) {}
-}
-''');
-  }
-
-  test_undefinedMethod_createQualified_emptyClassBody() async {
-    await resolveTestUnit('''
-class A {}
-main() {
-  A.myUndefinedMethod();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  static void myUndefinedMethod() {}
-}
-main() {
-  A.myUndefinedMethod();
-}
-''');
-  }
-
-  test_undefinedMethod_createQualified_fromClass() async {
-    await resolveTestUnit('''
-class A {
-}
-main() {
-  A.myUndefinedMethod();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  static void myUndefinedMethod() {}
-}
-main() {
-  A.myUndefinedMethod();
-}
-''');
-  }
-
-  test_undefinedMethod_createQualified_fromClass_hasOtherMember() async {
-    await resolveTestUnit('''
-class A {
-  foo() {}
-}
-main() {
-  A.myUndefinedMethod();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  foo() {}
-
-  static void myUndefinedMethod() {}
-}
-main() {
-  A.myUndefinedMethod();
-}
-''');
-  }
-
-  test_undefinedMethod_createQualified_fromInstance() async {
-    await resolveTestUnit('''
-class A {
-}
-main(A a) {
-  a.myUndefinedMethod();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  void myUndefinedMethod() {}
-}
-main(A a) {
-  a.myUndefinedMethod();
-}
-''');
-  }
-
-  test_undefinedMethod_createQualified_targetIsFunctionType() async {
-    await resolveTestUnit('''
-typedef A();
-main() {
-  A.myUndefinedMethod();
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_METHOD);
-  }
-
-  test_undefinedMethod_createQualified_targetIsUnresolved() async {
-    await resolveTestUnit('''
-main() {
-  NoSuchClass.myUndefinedMethod();
-}
-''');
-    await assertNoFix(DartFixKind.CREATE_METHOD);
-  }
-
-  test_undefinedMethod_createUnqualified_duplicateArgumentNames() async {
-    await resolveTestUnit('''
-class C {
-  int x;
-}
-
-class D {
-  foo(C c1, C c2) {
-    bar(c1.x, c2.x);
-  }
-}''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class C {
-  int x;
-}
-
-class D {
-  foo(C c1, C c2) {
-    bar(c1.x, c2.x);
-  }
-
-  void bar(int x, int x2) {}
-}''');
-  }
-
-  test_undefinedMethod_createUnqualified_parameters() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    myUndefinedMethod(0, 1.0, '3');
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  main() {
-    myUndefinedMethod(0, 1.0, '3');
-  }
-
-  void myUndefinedMethod(int i, double d, String s) {}
-}
-''');
-    // linked positions
-    int index = 0;
-    _assertLinkedGroup(
-        change.linkedEditGroups[index++], ['void myUndefinedMethod(']);
-    _assertLinkedGroup(change.linkedEditGroups[index++],
-        ['myUndefinedMethod(0', 'myUndefinedMethod(int']);
-    _assertLinkedGroup(
-        change.linkedEditGroups[index++],
-        ['int i'],
-        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
-            ['int', 'num', 'Object', 'Comparable<num>']));
-    _assertLinkedGroup(change.linkedEditGroups[index++], ['i,']);
-    _assertLinkedGroup(
-        change.linkedEditGroups[index++],
-        ['double d'],
-        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
-            ['double', 'num', 'Object', 'Comparable<num>']));
-    _assertLinkedGroup(change.linkedEditGroups[index++], ['d,']);
-    _assertLinkedGroup(
-        change.linkedEditGroups[index++],
-        ['String s'],
-        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
-            ['String', 'Object', 'Comparable<String>']));
-    _assertLinkedGroup(change.linkedEditGroups[index++], ['s)']);
-  }
-
-  test_undefinedMethod_createUnqualified_parameters_named() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    myUndefinedMethod(0, bbb: 1.0, ccc: '2');
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  main() {
-    myUndefinedMethod(0, bbb: 1.0, ccc: '2');
-  }
-
-  void myUndefinedMethod(int i, {double bbb, String ccc}) {}
-}
-''');
-    // linked positions
-    int index = 0;
-    _assertLinkedGroup(
-        change.linkedEditGroups[index++], ['void myUndefinedMethod(']);
-    _assertLinkedGroup(change.linkedEditGroups[index++],
-        ['myUndefinedMethod(0', 'myUndefinedMethod(int']);
-    _assertLinkedGroup(
-        change.linkedEditGroups[index++],
-        ['int i'],
-        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
-            ['int', 'num', 'Object', 'Comparable<num>']));
-    _assertLinkedGroup(change.linkedEditGroups[index++], ['i,']);
-    _assertLinkedGroup(
-        change.linkedEditGroups[index++],
-        ['double bbb'],
-        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
-            ['double', 'num', 'Object', 'Comparable<num>']));
-    _assertLinkedGroup(
-        change.linkedEditGroups[index++],
-        ['String ccc'],
-        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
-            ['String', 'Object', 'Comparable<String>']));
-  }
-
-  test_undefinedMethod_createUnqualified_returnType() async {
-    await resolveTestUnit('''
-class A {
-  main() {
-    int v = myUndefinedMethod();
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  main() {
-    int v = myUndefinedMethod();
-  }
-
-  int myUndefinedMethod() {}
-}
-''');
-    // linked positions
-    _assertLinkedGroup(change.linkedEditGroups[0], ['int myUndefinedMethod(']);
-    _assertLinkedGroup(change.linkedEditGroups[1],
-        ['myUndefinedMethod();', 'myUndefinedMethod() {']);
-  }
-
-  test_undefinedMethod_createUnqualified_staticFromField() async {
-    await resolveTestUnit('''
-class A {
-  static var f = myUndefinedMethod();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  static var f = myUndefinedMethod();
-
-  static myUndefinedMethod() {}
-}
-''');
-  }
-
-  test_undefinedMethod_createUnqualified_staticFromMethod() async {
-    await resolveTestUnit('''
-class A {
-  static main() {
-    myUndefinedMethod();
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  static main() {
-    myUndefinedMethod();
-  }
-
-  static void myUndefinedMethod() {}
-}
-''');
-  }
-
-  test_undefinedMethod_hint_createQualified_fromInstance() async {
-    await resolveTestUnit('''
-class A {
-}
-main() {
-  var a = new A();
-  a.myUndefinedMethod();
-}
-''');
-    await assertHasFix(DartFixKind.CREATE_METHOD, '''
-class A {
-  void myUndefinedMethod() {}
-}
-main() {
-  var a = new A();
-  a.myUndefinedMethod();
-}
-''');
-  }
-
-  test_undefinedMethod_parameterType_differentPrefixInTargetUnit() async {
-    String code2 = r'''
-library test2;
-import 'test3.dart' as bbb;
-export 'test3.dart';
-class D {
-}
-''';
-    addSource('/project/test2.dart', code2);
-    addSource('/project/test3.dart', r'''
-library test3;
-class E {}
-''');
-    await resolveTestUnit('''
-library test;
-import 'test2.dart' as aaa;
-main(aaa.D d, aaa.E e) {
-  d.foo(e);
-}
-''');
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_METHOD, error);
-    change = fix.change;
-    // apply to "test2.dart"
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/project/test2.dart'));
-    expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
-library test2;
-import 'test3.dart' as bbb;
-export 'test3.dart';
-class D {
-  void foo(bbb.E e) {}
-}
-''');
-  }
-
-  test_undefinedMethod_parameterType_inTargetUnit() async {
-    String code2 = r'''
-library test2;
-class D {
-}
-class E {}
-''';
-    addSource('/project/test2.dart', code2);
-    await resolveTestUnit('''
-library test;
-import 'test2.dart' as test2;
-main(test2.D d, test2.E e) {
-  d.foo(e);
-}
-''');
-    AnalysisError error = await _findErrorToFix();
-    fix = await _assertHasFix(DartFixKind.CREATE_METHOD, error);
-    change = fix.change;
-    // apply to "test2.dart"
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    SourceFileEdit fileEdit = change.edits[0];
-    expect(fileEdit.file, convertPath('/project/test2.dart'));
-    expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
-library test2;
-class D {
-  void foo(E e) {}
-}
-class E {}
-''');
-  }
-
-  test_undefinedMethod_useSimilar_ignoreOperators() async {
-    await resolveTestUnit('''
-main(Object object) {
-  object.then();
-}
-''');
-    await assertNoFix(DartFixKind.CHANGE_TO);
-  }
-
-  test_undefinedMethod_useSimilar_qualified() async {
-    await resolveTestUnit('''
-class A {
-  myMethod() {}
-}
-main() {
-  A a = new A();
-  a.myMehtod();
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  myMethod() {}
-}
-main() {
-  A a = new A();
-  a.myMethod();
-}
-''');
-  }
-
-  test_undefinedMethod_useSimilar_unqualified_superClass() async {
-    await resolveTestUnit('''
-class A {
-  myMethod() {}
-}
-class B extends A {
-  main() {
-    myMehtod();
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  myMethod() {}
-}
-class B extends A {
-  main() {
-    myMethod();
-  }
-}
-''');
-  }
-
-  test_undefinedMethod_useSimilar_unqualified_thisClass() async {
-    await resolveTestUnit('''
-class A {
-  myMethod() {}
-  main() {
-    myMehtod();
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  myMethod() {}
-  main() {
-    myMethod();
-  }
-}
-''');
-  }
-
-  test_undefinedParameter_convertFlutterChild_BAD_listNotWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Container(
-    child: new Row(
-      child: <Widget>[
-        new Container(),
-        null,
-      ],
-    ),
-  );
-}
-''');
-    await assertNoFix(DartFixKind.CONVERT_FLUTTER_CHILD);
-  }
-
-  test_undefinedParameter_convertFlutterChild_OK_hasList() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Container(
-    child: new Row(
-      child: [
-        new Text('111'),
-        new Text('222'),
-      ],
-    ),
-  );
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Container(
-    child: new Row(
-      children: <Widget>[
-        new Text('111'),
-        new Text('222'),
-      ],
-    ),
-  );
-}
-''');
-  }
-
-  test_undefinedParameter_convertFlutterChild_OK_hasTypedList() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Container(
-    child: new Row(
-      child: <Widget>[
-        new Text('111'),
-        new Text('222'),
-      ],
-    ),
-  );
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Container(
-    child: new Row(
-      children: <Widget>[
-        new Text('111'),
-        new Text('222'),
-      ],
-    ),
-  );
-}
-''');
-  }
-
-  test_undefinedParameter_convertFlutterChild_OK_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-    body: new Row(
-      child: new Container(
-        width: 200.0,
-        height: 300.0,
-      ),
-    ),
-  );
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/material.dart';
-build() {
-  return new Scaffold(
-    body: new Row(
-      children: <Widget>[
-        new Container(
-          width: 200.0,
-          height: 300.0,
-        ),
-      ],
-    ),
-  );
-}
-''');
-  }
-
-  test_undefinedParameter_convertFlutterChild_OK_widgetVariable() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/material.dart';
-build() {
-  var text = new Text('foo');
-  new Row(
-    child: text,
-  );
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILD, '''
-import 'package:flutter/material.dart';
-build() {
-  var text = new Text('foo');
-  new Row(
-    children: <Widget>[text],
-  );
-}
-''');
-  }
-
-  test_undefinedParameter_convertFlutterChildren_BAD_notWidget() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Center(
-    children: [
-      new Object(),
-    ],
-  );
-}
-''');
-    await assertNoFix(DartFixKind.CONVERT_FLUTTER_CHILDREN);
-  }
-
-  test_undefinedParameter_convertFlutterChildren_OK_multiLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Center(
-    children: [
-      new Container(
-        width: 200.0,
-        height: 300.0,
-      ),
-    ],
-  );
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILDREN, '''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Center(
-    child: new Container(
-      width: 200.0,
-      height: 300.0,
-    ),
-  );
-}
-''');
-  }
-
-  test_undefinedParameter_convertFlutterChildren_OK_singleLine() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Center(
-    children: [
-      new Text('foo'),
-    ],
-  );
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILDREN, '''
-import 'package:flutter/widgets.dart';
-build() {
-  return new Center(
-    child: new Text('foo'),
-  );
-}
-''');
-  }
-
-  test_undefinedParameter_convertFlutterChildren_OK_singleLine2() async {
-    addFlutterPackage();
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-build() {
-  var text = new Text('foo');
-  new Center(
-    children: [text],
-  );
-}
-''');
-    await assertHasFix(DartFixKind.CONVERT_FLUTTER_CHILDREN, '''
-import 'package:flutter/widgets.dart';
-build() {
-  var text = new Text('foo');
-  new Center(
-    child: text,
-  );
-}
-''');
-  }
-
-  test_undefinedSetter_useSimilar_hint() async {
-    await resolveTestUnit('''
-class A {
-  int myField;
-}
-main(A a) {
-  var x = a;
-  x.myFild = 42;
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  int myField;
-}
-main(A a) {
-  var x = a;
-  x.myField = 42;
-}
-''');
-  }
-
-  test_undefinedSetter_useSimilar_qualified() async {
-    await resolveTestUnit('''
-class A {
-  int myField;
-}
-main(A a) {
-  a.myFild = 42;
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  int myField;
-}
-main(A a) {
-  a.myField = 42;
-}
-''');
-  }
-
-  test_undefinedSetter_useSimilar_unqualified() async {
-    await resolveTestUnit('''
-class A {
-  int myField;
-  main() {
-    myFild = 42;
-  }
-}
-''');
-    await assertHasFix(DartFixKind.CHANGE_TO, '''
-class A {
-  int myField;
-  main() {
-    myField = 42;
-  }
-}
-''');
-  }
-
-  test_useEffectiveIntegerDivision() async {
-    await resolveTestUnit('''
-main() {
-  var a = 5;
-  var b = 2;
-  print((a / b).toInt());
-}
-''');
-    await assertHasFix(DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION, '''
-main() {
-  var a = 5;
-  var b = 2;
-  print(a ~/ b);
-}
-''');
-  }
-
-  test_useImportPrefix_withClass() async {
-    await resolveTestUnit('''
-import 'dart:async' as pref;
-main() {
-  pref.Stream s = null;
-  Future f = null;
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PREFIX, '''
-import 'dart:async' as pref;
-main() {
-  pref.Stream s = null;
-  pref.Future f = null;
-}
-''');
-  }
-
-  test_useImportPrefix_withTopLevelVariable() async {
-    await resolveTestUnit('''
-import 'dart:math' as pref;
-main() {
-  print(pref.E);
-  print(PI);
-}
-''');
-    await assertHasFix(DartFixKind.IMPORT_LIBRARY_PREFIX, '''
-import 'dart:math' as pref;
-main() {
-  print(pref.E);
-  print(pref.PI);
-}
-''');
-  }
-
-  void _addMetaPackageSource() {
-    addPackageSource('meta', 'meta.dart', r'''
-library meta;
-
-const Required required = const Required();
-
-class Required {
-  final String reason;
-  const Required([this.reason]);
-}
-''');
-  }
-}
-
-@reflectiveTest
-class LintFixTest extends BaseFixProcessorTest {
-  AnalysisError error;
-
-  Future applyFix(FixKind kind) async {
-    fix = await _assertHasFix(kind, error);
-    change = fix.change;
-    // apply to "file"
-    List<SourceFileEdit> fileEdits = change.edits;
-    expect(fileEdits, hasLength(1));
-    resultCode = SourceEdit.applySequence(testCode, change.edits[0].edits);
-  }
-
-  @override
-  assertNoFix(FixKind kind) async {
-    await _assertNoFix(kind, error);
-  }
-
-  Future<void> findLint(String src, String lintCode, {int length: 1}) async {
-    int errorOffset = src.indexOf('/*LINT*/');
-    await resolveTestUnit(src.replaceAll('/*LINT*/', ''));
-    error = new AnalysisError(
-        resolutionMap.elementDeclaredByCompilationUnit(testUnit).source,
-        errorOffset,
-        length,
-        new LintCode(lintCode, '<ignored>'));
-  }
-
-  test_addRequiredAnnotation() async {
-    String src = '''
-void function({String /*LINT*/param}) {
-  assert(param != null);
-}
-''';
-    await findLint(src, LintNames.always_require_non_null_named_parameters);
-    await applyFix(DartFixKind.LINT_ADD_REQUIRED);
-    verifyResult('''
-void function({@required String param}) {
-  assert(param != null);
-}
-''');
-  }
-
-  test_isNotEmpty() async {
-    String src = '''
-f(c) {
-  if (/*LINT*/!c.isEmpty) {}
-}
-''';
-    await findLint(src, LintNames.prefer_is_not_empty);
-
-    await applyFix(DartFixKind.USE_IS_NOT_EMPTY);
-
-    verifyResult('''
-f(c) {
-  if (c.isNotEmpty) {}
-}
-''');
-  }
-
-  test_lint_addMissingOverride_field() async {
-    String src = '''
-class abstract Test {
-  int get t;
-}
-class Sub extends Test {
-  int /*LINT*/t = 42;
-}
-''';
-    await findLint(src, LintNames.annotate_overrides);
-
-    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);
-
-    verifyResult('''
-class abstract Test {
-  int get t;
-}
-class Sub extends Test {
-  @override
-  int t = 42;
-}
-''');
-  }
-
-  test_lint_addMissingOverride_getter() async {
-    String src = '''
-class Test {
-  int get t => null;
-}
-class Sub extends Test {
-  int get /*LINT*/t => null;
-}
-''';
-    await findLint(src, LintNames.annotate_overrides);
-
-    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);
-
-    verifyResult('''
-class Test {
-  int get t => null;
-}
-class Sub extends Test {
-  @override
-  int get t => null;
-}
-''');
-  }
-
-  test_lint_addMissingOverride_method() async {
-    String src = '''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  void /*LINT*/t() { }
-}
-''';
-    await findLint(src, LintNames.annotate_overrides);
-
-    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);
-
-    verifyResult('''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  @override
-  void t() { }
-}
-''');
-  }
-
-  test_lint_addMissingOverride_method_with_doc_comment() async {
-    String src = '''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  /// Doc comment.
-  void /*LINT*/t() { }
-}
-''';
-    await findLint(src, LintNames.annotate_overrides);
-
-    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);
-
-    verifyResult('''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  /// Doc comment.
-  @override
-  void t() { }
-}
-''');
-  }
-
-  test_lint_addMissingOverride_method_with_doc_comment_2() async {
-    String src = '''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  /**
-   * Doc comment.
-   */
-  void /*LINT*/t() { }
-}
-''';
-    await findLint(src, LintNames.annotate_overrides);
-
-    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);
-
-    verifyResult('''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  /**
-   * Doc comment.
-   */
-  @override
-  void t() { }
-}
-''');
-  }
-
-  test_lint_addMissingOverride_method_with_doc_comment_and_metadata() async {
-    String src = '''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  /// Doc comment.
-  @foo
-  void /*LINT*/t() { }
-}
-''';
-    await findLint(src, LintNames.annotate_overrides);
-
-    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);
-
-    verifyResult('''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  /// Doc comment.
-  @override
-  @foo
-  void t() { }
-}
-''');
-  }
-
-  test_lint_addMissingOverride_method_with_non_doc_comment() async {
-    String src = '''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  // Non-doc comment.
-  void /*LINT*/t() { }
-}
-''';
-    await findLint(src, LintNames.annotate_overrides);
-
-    await applyFix(DartFixKind.LINT_ADD_OVERRIDE);
-
-    verifyResult('''
-class Test {
-  void t() { }
-}
-class Sub extends Test {
-  // Non-doc comment.
-  @override
-  void t() { }
-}
-''');
-  }
-
-  test_lint_removeInterpolationBraces() async {
-    String src = r'''
-main() {
-  var v = 42;
-  print('v: /*LINT*/${ v}');
-}
-''';
-    await findLint(src, LintNames.unnecessary_brace_in_string_interp,
-        length: 4);
-    await applyFix(DartFixKind.LINT_REMOVE_INTERPOLATION_BRACES);
-    verifyResult(r'''
-main() {
-  var v = 42;
-  print('v: $v');
-}
-''');
-  }
-
-  test_makeFieldFinal_noKeyword() async {
-    String src = '''
-class C {
-  /*LINT*/f = 2;
-}
-''';
-    await findLint(src, LintNames.prefer_final_fields);
-
-    await applyFix(DartFixKind.MAKE_FINAL);
-
-    verifyResult('''
-class C {
-  final f = 2;
-}
-''');
-  }
-
-  test_makeFieldFinal_type() async {
-    String src = '''
-class C {
-  int /*LINT*/f = 2;
-}
-''';
-    await findLint(src, LintNames.prefer_final_fields);
-
-    await applyFix(DartFixKind.MAKE_FINAL);
-
-    verifyResult('''
-class C {
-  final int f = 2;
-}
-''');
-  }
-
-  test_makeFieldFinal_var() async {
-    String src = '''
-class C {
-  var /*LINT*/f = 2;
-}
-''';
-    await findLint(src, LintNames.prefer_final_fields);
-
-    await applyFix(DartFixKind.MAKE_FINAL);
-
-    verifyResult('''
-class C {
-  final f = 2;
-}
-''');
-  }
-
-  test_makeLocalFinal_type() async {
-    String src = '''
-bad() {
-  int /*LINT*/x = 2;
-}
-''';
-    await findLint(src, LintNames.prefer_final_locals);
-
-    await applyFix(DartFixKind.MAKE_FINAL);
-
-    verifyResult('''
-bad() {
-  final int x = 2;
-}
-''');
-  }
-
-  test_makeLocalFinal_var() async {
-    String src = '''
-bad() {
-  var /*LINT*/x = 2;
-}
-''';
-    await findLint(src, LintNames.prefer_final_locals);
-
-    await applyFix(DartFixKind.MAKE_FINAL);
-
-    verifyResult('''
-bad() {
-  final x = 2;
-}
-''');
-  }
-
-  test_removeAwait_intLiteral() async {
-    String src = '''
-bad() async {
-  print(/*LINT*/await 23);
-}
-''';
-    await findLint(src, LintNames.await_only_futures);
-
-    await applyFix(DartFixKind.REMOVE_AWAIT);
-
-    verifyResult('''
-bad() async {
-  print(23);
-}
-''');
-  }
-
-  test_removeAwait_StringLiteral() async {
-    String src = '''
-bad() async {
-  print(/*LINT*/await 'hola');
-}
-''';
-    await findLint(src, LintNames.await_only_futures);
-
-    await applyFix(DartFixKind.REMOVE_AWAIT);
-
-    verifyResult('''
-bad() async {
-  print('hola');
-}
-''');
-  }
-
-  test_removeEmptyCatch_newLine() async {
-    String src = '''
-void foo() {
-  try {}
-  catch (e) {/*LINT*/}
-  finally {}
-}
-''';
-    await findLint(src, LintNames.empty_catches);
-
-    await applyFix(DartFixKind.REMOVE_EMPTY_CATCH);
-
-    verifyResult('''
-void foo() {
-  try {}
-  finally {}
-}
-''');
-  }
-
-  test_removeEmptyCatch_sameLine() async {
-    String src = '''
-void foo() {
-  try {} catch (e) {/*LINT*/} finally {}
-}
-''';
-    await findLint(src, LintNames.empty_catches);
-
-    await applyFix(DartFixKind.REMOVE_EMPTY_CATCH);
-
-    verifyResult('''
-void foo() {
-  try {} finally {}
-}
-''');
-  }
-
-  test_removeEmptyConstructorBody() async {
-    String src = '''
-class C {
-  C() {/*LINT*/}
-}
-''';
-    await findLint(src, LintNames.empty_constructor_bodies);
-
-    await applyFix(DartFixKind.REMOVE_EMPTY_CONSTRUCTOR_BODY);
-
-    verifyResult('''
-class C {
-  C();
-}
-''');
-  }
-
-  test_removeEmptyElse_newLine() async {
-    String src = '''
-void foo(bool cond) {
-  if (cond) {
-    //
-  }
-  else /*LINT*/;
-}
-''';
-    await findLint(src, LintNames.avoid_empty_else);
-
-    await applyFix(DartFixKind.REMOVE_EMPTY_ELSE);
-
-    verifyResult('''
-void foo(bool cond) {
-  if (cond) {
-    //
-  }
-}
-''');
-  }
-
-  test_removeEmptyElse_sameLine() async {
-    String src = '''
-void foo(bool cond) {
-  if (cond) {
-    //
-  } else /*LINT*/;
-}
-''';
-    await findLint(src, LintNames.avoid_empty_else);
-
-    await applyFix(DartFixKind.REMOVE_EMPTY_ELSE);
-
-    verifyResult('''
-void foo(bool cond) {
-  if (cond) {
-    //
-  }
-}
-''');
-  }
-
-  test_removeEmptyStatement_insideBlock() async {
-    String src = '''
-void foo() {
-  while(true) {
-    /*LINT*/;
-  }
-}
-''';
-    await findLint(src, LintNames.empty_statements);
-
-    await applyFix(DartFixKind.REMOVE_EMPTY_STATEMENT);
-
-    verifyResult('''
-void foo() {
-  while(true) {
-  }
-}
-''');
-  }
-
-  test_removeEmptyStatement_outOfBlock_otherLine() async {
-    String src = '''
-void foo() {
-  while(true)
-  /*LINT*/;
-  print('hi');
-}
-''';
-    await findLint(src, LintNames.empty_statements);
-
-    await applyFix(DartFixKind.REPLACE_WITH_BRACKETS);
-
-    verifyResult('''
-void foo() {
-  while(true) {}
-  print('hi');
-}
-''');
-  }
-
-  test_removeEmptyStatement_outOfBlock_sameLine() async {
-    String src = '''
-void foo() {
-  while(true)/*LINT*/;
-  print('hi');
-}
-''';
-    await findLint(src, LintNames.empty_statements);
-
-    await applyFix(DartFixKind.REPLACE_WITH_BRACKETS);
-
-    verifyResult('''
-void foo() {
-  while(true) {}
-  print('hi');
-}
-''');
-  }
-
-  test_removeInitializer_field() async {
-    String src = '''
-class Test {
-  int /*LINT*/x = null;
-}
-''';
-    await findLint(src, LintNames.avoid_init_to_null);
-
-    await applyFix(DartFixKind.REMOVE_INITIALIZER);
-
-    verifyResult('''
-class Test {
-  int x;
-}
-''');
-  }
-
-  test_removeInitializer_listOfVariableDeclarations() async {
-    String src = '''
-String a = 'a', /*LINT*/b = null, c = 'c';
-''';
-    await findLint(src, LintNames.avoid_init_to_null);
-
-    await applyFix(DartFixKind.REMOVE_INITIALIZER);
-
-    verifyResult('''
-String a = 'a', b, c = 'c';
-''');
-  }
-
-  test_removeInitializer_topLevel() async {
-    String src = '''
-var /*LINT*/x = null;
-''';
-    await findLint(src, LintNames.avoid_init_to_null);
-
-    await applyFix(DartFixKind.REMOVE_INITIALIZER);
-
-    verifyResult('''
-var x;
-''');
-  }
-
-  test_removeMethodDeclaration_getter() async {
-    String src = '''
-class A {
-  int x;
-}
-class B extends A {
-  @override
-  int get /*LINT*/x => super.x;
-}
-''';
-    await findLint(src, LintNames.unnecessary_override);
-
-    await applyFix(DartFixKind.REMOVE_METHOD_DECLARATION);
-
-    verifyResult('''
-class A {
-  int x;
-}
-class B extends A {
-}
-''');
-  }
-
-  test_removeMethodDeclaration_method() async {
-    String src = '''
-class A {
-  @override
-  String /*LINT*/toString() => super.toString();
-}
-''';
-    await findLint(src, LintNames.unnecessary_override);
-
-    await applyFix(DartFixKind.REMOVE_METHOD_DECLARATION);
-
-    verifyResult('''
-class A {
-}
-''');
-  }
-
-  test_removeMethodDeclaration_setter() async {
-    String src = '''
-class A {
-  int x;
-}
-class B extends A {
-  @override
-  set /*LINT*/x(int other) {
-    this.x = other;
-  }
-}
-''';
-    await findLint(src, LintNames.unnecessary_override);
-
-    await applyFix(DartFixKind.REMOVE_METHOD_DECLARATION);
-
-    verifyResult('''
-class A {
-  int x;
-}
-class B extends A {
-}
-''');
-  }
-
-  test_removeThisExpression_methodInvocation_oneCharacterOperator() async {
-    String src = '''
-class A {
-  void foo() {
-    /*LINT*/this.foo();
-  }
-}
-''';
-    await findLint(src, LintNames.unnecessary_this);
-
-    await applyFix(DartFixKind.REMOVE_THIS_EXPRESSION);
-
-    verifyResult('''
-class A {
-  void foo() {
-    foo();
-  }
-}
-''');
-  }
-
-  test_removeThisExpression_methodInvocation_twoCharactersOperator() async {
-    String src = '''
-class A {
-  void foo() {
-    /*LINT*/this?.foo();
-  }
-}
-''';
-    await findLint(src, LintNames.unnecessary_this);
-
-    await applyFix(DartFixKind.REMOVE_THIS_EXPRESSION);
-
-    verifyResult('''
-class A {
-  void foo() {
-    foo();
-  }
-}
-''');
-  }
-
-  test_removeThisExpression_notAThisExpression() async {
-    String src = '''
-void foo() {
-  final /*LINT*/this.id;
-}
-''';
-    await findLint(src, LintNames.unnecessary_this);
-
-    await assertNoFix(DartFixKind.REMOVE_THIS_EXPRESSION);
-  }
-
-  test_removeThisExpression_propertyAccess_oneCharacterOperator() async {
-    String src = '''
-class A {
-  int x;
-  void foo() {
-    /*LINT*/this.x = 2;
-  }
-}
-''';
-    await findLint(src, LintNames.unnecessary_this);
-
-    await applyFix(DartFixKind.REMOVE_THIS_EXPRESSION);
-
-    verifyResult('''
-class A {
-  int x;
-  void foo() {
-    x = 2;
-  }
-}
-''');
-  }
-
-  test_removeThisExpression_propertyAccess_twoCharactersOperator() async {
-    String src = '''
-class A {
-  int x;
-  void foo() {
-    /*LINT*/this?.x = 2;
-  }
-}
-''';
-    await findLint(src, LintNames.unnecessary_this);
-
-    await applyFix(DartFixKind.REMOVE_THIS_EXPRESSION);
-
-    verifyResult('''
-class A {
-  int x;
-  void foo() {
-    x = 2;
-  }
-}
-''');
-  }
-
-  test_removeTypeAnnotation_avoidAnnotatingWithDynamic_InsideFunctionTypedFormalParameter() async {
-    String src = '''
-bad(void foo(/*LINT*/dynamic x)) {
-  return null;
-}
-''';
-    await findLint(src, LintNames.avoid_annotating_with_dynamic);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-bad(void foo(x)) {
-  return null;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_avoidAnnotatingWithDynamic_NamedParameter() async {
-    String src = '''
-bad({/*LINT*/dynamic defaultValue}) {
-  return null;
-}
-''';
-    await findLint(src, LintNames.avoid_annotating_with_dynamic);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-bad({defaultValue}) {
-  return null;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_avoidAnnotatingWithDynamic_NormalParameter() async {
-    String src = '''
-bad(/*LINT*/dynamic defaultValue) {
-  return null;
-}
-''';
-    await findLint(src, LintNames.avoid_annotating_with_dynamic);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-bad(defaultValue) {
-  return null;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_avoidAnnotatingWithDynamic_OptionalParameter() async {
-    String src = '''
-bad([/*LINT*/dynamic defaultValue]) {
-  return null;
-}
-''';
-    await findLint(src, LintNames.avoid_annotating_with_dynamic);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-bad([defaultValue]) {
-  return null;
-}
-''');
-  }
-
-  test_removeTypeAnnotation_avoidReturnTypesOnSetters_void() async {
-    String src = '''
-/*LINT*/void set speed2(int ms) {}
-''';
-    await findLint(src, LintNames.avoid_return_types_on_setters);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-set speed2(int ms) {}
-''');
-  }
-
-  test_removeTypeAnnotation_avoidTypesOnClosureParameters_FunctionTypedFormalParameter() async {
-    String src = '''
-var functionWithFunction = (/*LINT*/int f(int x)) => f(0);
-''';
-    await findLint(src, LintNames.avoid_types_on_closure_parameters);
-
-    await applyFix(DartFixKind.REPLACE_WITH_IDENTIFIER);
-
-    verifyResult('''
-var functionWithFunction = (f) => f(0);
-''');
-  }
-
-  test_removeTypeAnnotation_avoidTypesOnClosureParameters_NamedParameter() async {
-    String src = '''
-var x = ({/*LINT*/Future<int> defaultValue}) {
-  return null;
-};
-''';
-    await findLint(src, LintNames.avoid_types_on_closure_parameters);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-var x = ({defaultValue}) {
-  return null;
-};
-''');
-  }
-
-  test_removeTypeAnnotation_avoidTypesOnClosureParameters_NormalParameter() async {
-    String src = '''
-var x = (/*LINT*/Future<int> defaultValue) {
-  return null;
-};
-''';
-    await findLint(src, LintNames.avoid_types_on_closure_parameters);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-var x = (defaultValue) {
-  return null;
-};
-''');
-  }
-
-  test_removeTypeAnnotation_avoidTypesOnClosureParameters_OptionalParameter() async {
-    String src = '''
-var x = ([/*LINT*/Future<int> defaultValue]) {
-  return null;
-};
-''';
-    await findLint(src, LintNames.avoid_types_on_closure_parameters);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-var x = ([defaultValue]) {
-  return null;
-};
-''');
-  }
-
-  test_removeTypeAnnotation_typeInitFormals_void() async {
-    String src = '''
-class C {
-  int f;
-  C(/*LINT*/int this.f);
-}
-''';
-    await findLint(src, LintNames.type_init_formals);
-
-    await applyFix(DartFixKind.REMOVE_TYPE_NAME);
-
-    verifyResult('''
-class C {
-  int f;
-  C(this.f);
-}
-''');
-  }
-
-  test_renameToCamelCase_BAD_parameter_optionalNamed() async {
-    String src = '''
-foo({int /*LINT*/my_integer_variable}) {
-  print(my_integer_variable);
-}
-''';
-    await findLint(src, LintNames.non_constant_identifier_names);
-    await assertNoFix(DartFixKind.RENAME_TO_CAMEL_CASE);
-  }
-
-  test_renameToCamelCase_OK_localVariable() async {
-    String src = '''
-main() {
-  int /*LINT*/my_integer_variable = 42;
-  int foo;
-  print(my_integer_variable);
-  print(foo);
-}
-''';
-    await findLint(src, LintNames.non_constant_identifier_names);
-
-    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
-
-    verifyResult('''
-main() {
-  int myIntegerVariable = 42;
-  int foo;
-  print(myIntegerVariable);
-  print(foo);
-}
-''');
-  }
-
-  test_renameToCamelCase_OK_parameter_closure() async {
-    String src = '''
-main() {
-  [0, 1, 2].forEach((/*LINT*/my_integer_variable) {
-    print(my_integer_variable);
-  });
-}
-''';
-    await findLint(src, LintNames.non_constant_identifier_names);
-
-    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
-
-    verifyResult('''
-main() {
-  [0, 1, 2].forEach((myIntegerVariable) {
-    print(myIntegerVariable);
-  });
-}
-''');
-  }
-
-  test_renameToCamelCase_OK_parameter_function() async {
-    String src = '''
-main(int /*LINT*/my_integer_variable) {
-  print(my_integer_variable);
-}
-''';
-    await findLint(src, LintNames.non_constant_identifier_names);
-
-    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
-
-    verifyResult('''
-main(int myIntegerVariable) {
-  print(myIntegerVariable);
-}
-''');
-  }
-
-  test_renameToCamelCase_OK_parameter_method() async {
-    String src = '''
-class A {
-  main(int /*LINT*/my_integer_variable) {
-    print(my_integer_variable);
-  }
-}
-''';
-    await findLint(src, LintNames.non_constant_identifier_names);
-
-    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
-
-    verifyResult('''
-class A {
-  main(int myIntegerVariable) {
-    print(myIntegerVariable);
-  }
-}
-''');
-  }
-
-  test_renameToCamelCase_OK_parameter_optionalPositional() async {
-    String src = '''
-main([int /*LINT*/my_integer_variable]) {
-  print(my_integer_variable);
-}
-''';
-    await findLint(src, LintNames.non_constant_identifier_names);
-
-    await applyFix(DartFixKind.RENAME_TO_CAMEL_CASE);
-
-    verifyResult('''
-main([int myIntegerVariable]) {
-  print(myIntegerVariable);
-}
-''');
-  }
-
-  test_replaceFinalWithConst_method() async {
-    String src = '''
-/*LINT*/final int a = 1;
-''';
-    await findLint(src, LintNames.prefer_const_declarations);
-
-    await applyFix(DartFixKind.REPLACE_FINAL_WITH_CONST);
-
-    verifyResult('''
-const int a = 1;
-''');
-  }
-
-  test_replaceWithConditionalAssignment_withCodeBeforeAndAfter() async {
-    String src = '''
-class Person {
-  String _fullName;
-  void foo() {
-    print('hi');
-    /*LINT*/if (_fullName == null) {
-      _fullName = getFullUserName(this);
-    }
-    print('hi');
-  }
-}
-''';
-    await findLint(src, LintNames.prefer_conditional_assignment);
-
-    await applyFix(DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT);
-
-    verifyResult('''
-class Person {
-  String _fullName;
-  void foo() {
-    print('hi');
-    _fullName ??= getFullUserName(this);
-    print('hi');
-  }
-}
-''');
-  }
-
-  test_replaceWithConditionalAssignment_withOneBlock() async {
-    String src = '''
-class Person {
-  String _fullName;
-  void foo() {
-    /*LINT*/if (_fullName == null) {
-      _fullName = getFullUserName(this);
-    }
-  }
-}
-''';
-    await findLint(src, LintNames.prefer_conditional_assignment);
-
-    await applyFix(DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT);
-
-    verifyResult('''
-class Person {
-  String _fullName;
-  void foo() {
-    _fullName ??= getFullUserName(this);
-  }
-}
-''');
-  }
-
-  test_replaceWithConditionalAssignment_withoutBlock() async {
-    String src = '''
-class Person {
-  String _fullName;
-  void foo() {
-    /*LINT*/if (_fullName == null)
-      _fullName = getFullUserName(this);
-  }
-}
-''';
-    await findLint(src, LintNames.prefer_conditional_assignment);
-
-    await applyFix(DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT);
-
-    verifyResult('''
-class Person {
-  String _fullName;
-  void foo() {
-    _fullName ??= getFullUserName(this);
-  }
-}
-''');
-  }
-
-  test_replaceWithConditionalAssignment_withTwoBlock() async {
-    String src = '''
-class Person {
-  String _fullName;
-  void foo() {
-    /*LINT*/if (_fullName == null) {{
-      _fullName = getFullUserName(this);
-    }}
-  }
-}
-''';
-    await findLint(src, LintNames.prefer_conditional_assignment);
-
-    await applyFix(DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT);
-
-    verifyResult('''
-class Person {
-  String _fullName;
-  void foo() {
-    _fullName ??= getFullUserName(this);
-  }
-}
-''');
-  }
-
-  test_replaceWithLiteral_linkedHashMap_withCommentsInGeneric() async {
-    String src = '''
-import 'dart:collection';
-
-final a = /*LINT*/new LinkedHashMap<int,/*comment*/int>();
-''';
-    await findLint(src, LintNames.prefer_collection_literals);
-
-    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);
-
-    verifyResult('''
-import 'dart:collection';
-
-final a = <int,/*comment*/int>{};
-''');
-  }
-
-  test_replaceWithLiteral_linkedHashMap_withDynamicGenerics() async {
-    String src = '''
-import 'dart:collection';
-
-final a = /*LINT*/new LinkedHashMap<dynamic,dynamic>();
-''';
-    await findLint(src, LintNames.prefer_collection_literals);
-
-    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);
-
-    verifyResult('''
-import 'dart:collection';
-
-final a = <dynamic,dynamic>{};
-''');
-  }
-
-  test_replaceWithLiteral_linkedHashMap_withGeneric() async {
-    String src = '''
-import 'dart:collection';
-
-final a = /*LINT*/new LinkedHashMap<int,int>();
-''';
-    await findLint(src, LintNames.prefer_collection_literals);
-
-    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);
-
-    verifyResult('''
-import 'dart:collection';
-
-final a = <int,int>{};
-''');
-  }
-
-  test_replaceWithLiteral_linkedHashMap_withoutGeneric() async {
-    String src = '''
-import 'dart:collection';
-
-final a = /*LINT*/new LinkedHashMap();
-''';
-    await findLint(src, LintNames.prefer_collection_literals);
-
-    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);
-
-    verifyResult('''
-import 'dart:collection';
-
-final a = {};
-''');
-  }
-
-  test_replaceWithLiteral_list_withGeneric() async {
-    String src = '''
-final a = /*LINT*/new List<int>();
-''';
-    await findLint(src, LintNames.prefer_collection_literals);
-
-    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);
-
-    verifyResult('''
-final a = <int>[];
-''');
-  }
-
-  test_replaceWithLiteral_list_withoutGeneric() async {
-    String src = '''
-final a = /*LINT*/new List();
-''';
-    await findLint(src, LintNames.prefer_collection_literals);
-
-    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);
-
-    verifyResult('''
-final a = [];
-''');
-  }
-
-  test_replaceWithLiteral_map_withGeneric() async {
-    String src = '''
-final a = /*LINT*/new Map<int,int>();
-''';
-    await findLint(src, LintNames.prefer_collection_literals);
-
-    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);
-
-    verifyResult('''
-final a = <int,int>{};
-''');
-  }
-
-  test_replaceWithLiteral_map_withoutGeneric() async {
-    String src = '''
-final a = /*LINT*/new Map();
-''';
-    await findLint(src, LintNames.prefer_collection_literals);
-
-    await applyFix(DartFixKind.REPLACE_WITH_LITERAL);
-
-    verifyResult('''
-final a = {};
-''');
-  }
-
-  test_replaceWithTearOff_function_oneParameter() async {
-    String src = '''
-final x = /*LINT*/(name) {
-  print(name);
-};
-''';
-    await findLint(src, LintNames.unnecessary_lambdas);
-
-    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);
-
-    verifyResult('''
-final x = print;
-''');
-  }
-
-  test_replaceWithTearOff_function_zeroParameters() async {
-    String src = '''
-void foo(){}
-Function finalVar() {
-  return /*LINT*/() {
-    foo();
-  };
-}
-''';
-    await findLint(src, LintNames.unnecessary_lambdas);
-
-    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);
-
-    verifyResult('''
-void foo(){}
-Function finalVar() {
-  return foo;
-}
-''');
-  }
-
-  test_replaceWithTearOff_lambda_asArgument() async {
-    String src = '''
-void foo() {
-  bool isPair(int a) => a % 2 == 0;
-  final finalList = <int>[];
-  finalList.where(/*LINT*/(number) =>
-    isPair(number));
-}
-''';
-    await findLint(src, LintNames.unnecessary_lambdas);
-
-    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);
-
-    verifyResult('''
-void foo() {
-  bool isPair(int a) => a % 2 == 0;
-  final finalList = <int>[];
-  finalList.where(isPair);
-}
-''');
-  }
-
-  test_replaceWithTearOff_method_oneParameter() async {
-    String src = '''
-var a = /*LINT*/(x) => finalList.remove(x);
-''';
-    await findLint(src, LintNames.unnecessary_lambdas);
-
-    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);
-
-    verifyResult('''
-var a = finalList.remove;
-''');
-  }
-
-  test_replaceWithTearOff_method_zeroParameter() async {
-    String src = '''
-final Object a;
-Function finalVar() {
-  return /*LINT*/() {
-    return a.toString();
-  };
-}
-''';
-    await findLint(src, LintNames.unnecessary_lambdas);
-
-    await applyFix(DartFixKind.REPLACE_WITH_TEAR_OFF);
-
-    verifyResult('''
-final Object a;
-Function finalVar() {
-  return a.toString;
-}
-''');
-  }
-
-  void verifyResult(String expectedResult) {
-    expect(resultCode, expectedResult);
-  }
-}
-
-class _DartFixContextImpl implements DartFixContext {
-  @override
-  final ResourceProvider resourceProvider;
-
-  @override
-  final AnalysisDriver analysisDriver;
-
-  @override
-  final AstProvider astProvider;
-
-  @override
-  final CompilationUnit unit;
-
-  @override
-  final AnalysisError error;
-
-  @override
-  final List<AnalysisError> errors;
-
-  _DartFixContextImpl(this.resourceProvider, this.analysisDriver,
-      this.astProvider, this.unit, this.error, this.errors);
-
-  @override
-  GetTopLevelDeclarations get getTopLevelDeclarations =>
-      analysisDriver.getTopLevelNameDeclarations;
-}
diff --git a/pkg/analysis_server/test/services/correction/levenshtein_test.dart b/pkg/analysis_server/test/services/correction/levenshtein_test.dart
index c344a4c..d8a77e6 100644
--- a/pkg/analysis_server/test/services/correction/levenshtein_test.dart
+++ b/pkg/analysis_server/test/services/correction/levenshtein_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
index d0ac381..f0703ad 100644
--- a/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
+++ b/pkg/analysis_server/test/services/correction/name_suggestion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index d2b6796..8c53f7a 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -1,12 +1,12 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
 import 'package:analysis_server/src/services/correction/organize_directives.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError;
 import 'package:test/test.dart';
@@ -96,8 +96,8 @@
   }
 
   test_remove_unresolvedDirectives() async {
-    addSource('/project/existing_part1.dart', 'part of lib;');
-    addSource('/project/existing_part2.dart', 'part of lib;');
+    addSource('/home/test/lib/existing_part1.dart', 'part of lib;');
+    addSource('/home/test/lib/existing_part2.dart', 'part of lib;');
     await _computeUnitAndErrors(r'''
 library lib;
 
@@ -335,7 +335,8 @@
 
   Future<void> _computeUnitAndErrors(String code) async {
     addTestSource(code);
-    AnalysisResult result = await driver.getResult(testSource.fullName);
+    ResolvedUnitResult result =
+        await session.getResolvedUnit(testSource.fullName);
     testUnit = result.unit;
     testErrors = result.errors;
   }
diff --git a/pkg/analysis_server/test/services/correction/sort_members_test.dart b/pkg/analysis_server/test/services/correction/sort_members_test.dart
index d89bb36..faaac42 100644
--- a/pkg/analysis_server/test/services/correction/sort_members_test.dart
+++ b/pkg/analysis_server/test/services/correction/sort_members_test.dart
@@ -1,11 +1,11 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
 import 'package:analysis_server/src/services/correction/sort_members.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -512,6 +512,24 @@
 ''');
   }
 
+  test_mixinMembers_method() async {
+    await _parseTestUnit(r'''
+mixin A {
+  c() {}
+  a() {}
+  b() {}
+}
+''');
+    // validate change
+    _assertSort(r'''
+mixin A {
+  a() {}
+  b() {}
+  c() {}
+}
+''');
+  }
+
   test_unitMembers_class() async {
     await _parseTestUnit(r'''
 class C {}
@@ -664,6 +682,20 @@
 ''');
   }
 
+  test_unitMembers_genericTypeAlias() async {
+    await _parseTestUnit(r'''
+typedef FC = void Function();
+typedef FA = void Function();
+typedef FB = void Function();
+''');
+    // validate change
+    _assertSort(r'''
+typedef FA = void Function();
+typedef FB = void Function();
+typedef FC = void Function();
+''');
+  }
+
   test_unitMembers_importsAndDeclarations() async {
     await _parseTestUnit(r'''
 import 'dart:a';
@@ -711,6 +743,8 @@
     await _parseTestUnit(r'''
 _mmm() {}
 typedef nnn();
+typedef GTAF3 = void Function();
+typedef _GTAF2 = void Function();
 _nnn() {}
 typedef mmm();
 typedef _nnn();
@@ -724,6 +758,7 @@
 var nnn;
 var _mmm;
 var _nnn;
+typedef GTAF1 = void Function();
 set nnn(x) {}
 get mmm => null;
 set mmm(x) {}
@@ -752,6 +787,9 @@
 nnn() {}
 _mmm() {}
 _nnn() {}
+typedef GTAF1 = void Function();
+typedef GTAF3 = void Function();
+typedef _GTAF2 = void Function();
 typedef mmm();
 typedef nnn();
 typedef _mmm();
@@ -763,6 +801,19 @@
 ''');
   }
 
+  test_unitMembers_mixin() async {
+    await _parseTestUnit(r'''
+mixin C {}
+mixin A {}
+mixin B {}
+''');
+    _assertSort(r'''
+mixin A {}
+mixin B {}
+mixin C {}
+''');
+  }
+
   test_unitMembers_topLevelVariable() async {
     await _parseTestUnit(r'''
 int c;
@@ -804,7 +855,7 @@
 
   Future<void> _parseTestUnit(String code) async {
     addTestSource(code);
-    ParseResult result = await driver.parseFile(testSource.fullName);
+    ParsedUnitResult result = session.getParsedUnit(testSource.fullName);
     testUnit = result.unit;
   }
 }
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
index cce27cd..74b85d5 100644
--- a/pkg/analysis_server/test/services/correction/status_test.dart
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -29,7 +29,7 @@
     Element element = findElement('MyClass');
     // check
     Location location = newLocation_fromElement(element);
-    expect(location.file, convertPath('/project/test.dart'));
+    expect(location.file, testFile);
     expect(location.offset, 6);
     expect(location.length, 7);
     expect(location.startLine, 1);
@@ -52,7 +52,7 @@
         sourceRange);
     // check
     Location location = newLocation_fromMatch(match);
-    expect(location.file, convertPath('/project/test.dart'));
+    expect(location.file, testFile);
     expect(location.offset, sourceRange.offset);
     expect(location.length, sourceRange.length);
   }
@@ -65,7 +65,7 @@
     AstNode node = findNodeAtString('main');
     // check
     Location location = newLocation_fromNode(node);
-    expect(location.file, convertPath('/project/test.dart'));
+    expect(location.file, testFile);
     expect(location.offset, node.offset);
     expect(location.length, node.length);
   }
@@ -75,7 +75,7 @@
     SourceRange sourceRange = new SourceRange(10, 20);
     // check
     Location location = newLocation_fromUnit(testUnit, sourceRange);
-    expect(location.file, convertPath('/project/test.dart'));
+    expect(location.file, testFile);
     expect(location.offset, sourceRange.offset);
     expect(location.length, sourceRange.length);
   }
diff --git a/pkg/analysis_server/test/services/correction/strings_test.dart b/pkg/analysis_server/test/services/correction/strings_test.dart
index abd4493..c55cb7b 100644
--- a/pkg/analysis_server/test/services/correction/strings_test.dart
+++ b/pkg/analysis_server/test/services/correction/strings_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -133,13 +133,6 @@
     expect(isWhitespace('A'.codeUnitAt(0)), isFalse);
   }
 
-  void test_remove() {
-    expect(remove(null, 'x'), null);
-    expect(remove('abc', null), 'abc');
-    expect(remove('abc abbc abbbc', 'b'), 'ac ac ac');
-    expect(remove('abc abbc abbbc', 'bc'), 'a ab abb');
-  }
-
   void test_removeEnd() {
     expect(removeEnd(null, 'x'), null);
     expect(removeEnd('abc', null), 'abc');
@@ -165,11 +158,4 @@
     expect(shorten('0123456789abcdef', 11), '0123...cdef');
     expect(shorten('0123456789abcdef', 12), '01234...cdef');
   }
-
-  void test_substringAfterLast() {
-    expect(substringAfterLast('', '/'), '');
-    expect(substringAfterLast('abc', ''), '');
-    expect(substringAfterLast('abc', 'd'), 'abc');
-    expect(substringAfterLast('abcbde', 'b'), 'de');
-  }
 }
diff --git a/pkg/analysis_server/test/services/correction/test_all.dart b/pkg/analysis_server/test/services/correction/test_all.dart
index 4183ef1..e098648 100644
--- a/pkg/analysis_server/test/services/correction/test_all.dart
+++ b/pkg/analysis_server/test/services/correction/test_all.dart
@@ -1,12 +1,10 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'assist_test.dart' as assist_test;
 import 'change_test.dart' as change_test;
-import 'fix_test.dart' as fix_test;
 import 'levenshtein_test.dart' as levenshtein_test;
 import 'name_suggestion_test.dart' as name_suggestion_test;
 import 'organize_directives_test.dart' as organize_directives_test;
@@ -18,9 +16,7 @@
 /// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
-    assist_test.main();
     change_test.main();
-    fix_test.main();
     levenshtein_test.main();
     name_suggestion_test.main();
     organize_directives_test.main();
diff --git a/pkg/analysis_server/test/services/correction/util_test.dart b/pkg/analysis_server/test/services/correction/util_test.dart
index 3e1981c..b21db87 100644
--- a/pkg/analysis_server/test/services/correction/util_test.dart
+++ b/pkg/analysis_server/test/services/correction/util_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 import 'dart:async';
@@ -35,7 +35,8 @@
 ''');
     IfStatement ifStatement = findNodeAtString('if (');
     Expression condition = ifStatement.condition;
-    String result = new CorrectionUtils(testUnit).invertCondition(condition);
+    String result =
+        new CorrectionUtils(testAnalysisResult).invertCondition(condition);
     expect(result, expected);
   }
 
@@ -45,7 +46,7 @@
 import 'dart:math';
 ''');
     Source newLibrary = _getDartSource('dart:collection');
-    _assertAddLibraryImport(<Source>[newLibrary], '''
+    await _assertAddLibraryImport(<Source>[newLibrary], '''
 import 'dart:async';
 import 'dart:collection';
 import 'dart:math';
@@ -58,7 +59,7 @@
 import 'dart:math';
 ''');
     Source newLibrary = _getDartSource('dart:async');
-    _assertAddLibraryImport(<Source>[newLibrary], '''
+    await _assertAddLibraryImport(<Source>[newLibrary], '''
 import 'dart:async';
 import 'dart:collection';
 import 'dart:math';
@@ -71,7 +72,7 @@
 import 'dart:collection';
 ''');
     Source newLibrary = _getDartSource('dart:math');
-    _assertAddLibraryImport(<Source>[newLibrary], '''
+    await _assertAddLibraryImport(<Source>[newLibrary], '''
 import 'dart:async';
 import 'dart:collection';
 import 'dart:math';
@@ -85,7 +86,7 @@
 ''');
     Source newLibrary1 = _getDartSource('dart:async');
     Source newLibrary2 = _getDartSource('dart:html');
-    _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
+    await _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
 import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
@@ -100,7 +101,7 @@
 ''');
     Source newLibrary1 = _getDartSource('dart:async');
     Source newLibrary2 = _getDartSource('dart:collection');
-    _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
+    await _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
 import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
@@ -115,7 +116,7 @@
 ''');
     Source newLibrary1 = _getDartSource('dart:html');
     Source newLibrary2 = _getDartSource('dart:math');
-    _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
+    await _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
 import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
@@ -131,7 +132,7 @@
 ''');
     Source newLibrary1 = _getDartSource('dart:math');
     Source newLibrary2 = _getDartSource('dart:async');
-    _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
+    await _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
 library test;
 
 import 'dart:async';
@@ -149,7 +150,7 @@
 ''');
     Source newLibrary1 = _getDartSource('dart:math');
     Source newLibrary2 = _getDartSource('dart:async');
-    _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
+    await _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
 /// Comment.
 
 import 'dart:async';
@@ -167,7 +168,7 @@
 ''');
     Source newLibrary1 = _getDartSource('dart:math');
     Source newLibrary2 = _getDartSource('dart:async');
-    _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
+    await _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
 #!/bin/dart
 
 import 'dart:async';
@@ -183,7 +184,7 @@
 ''');
     Source newLibrary1 = _getDartSource('dart:math');
     Source newLibrary2 = _getDartSource('dart:async');
-    _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
+    await _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
 import 'dart:async';
 import 'dart:math';
 
@@ -192,14 +193,14 @@
   }
 
   test_addLibraryImports_package_hasDart_hasPackages_insertAfter() async {
-    addPackageSource('aaa', 'aaa.dart', '');
+    addPackageFile('aaa', 'aaa.dart', '');
     await resolveTestUnit('''
 import 'dart:async';
 
 import 'package:aaa/aaa.dart';
 ''');
     Source newLibrary = _getSource('/lib/bbb.dart', 'package:bbb/bbb.dart');
-    _assertAddLibraryImport(<Source>[newLibrary], '''
+    await _assertAddLibraryImport(<Source>[newLibrary], '''
 import 'dart:async';
 
 import 'package:aaa/aaa.dart';
@@ -208,14 +209,14 @@
   }
 
   test_addLibraryImports_package_hasDart_hasPackages_insertBefore() async {
-    addPackageSource('bbb', 'bbb.dart', '');
+    addPackageFile('bbb', 'bbb.dart', '');
     await resolveTestUnit('''
 import 'dart:async';
 
 import 'package:bbb/bbb.dart';
 ''');
     Source newLibrary = _getSource('/lib/aaa.dart', 'package:aaa/aaa.dart');
-    _assertAddLibraryImport(<Source>[newLibrary], '''
+    await _assertAddLibraryImport(<Source>[newLibrary], '''
 import 'dart:async';
 
 import 'package:aaa/aaa.dart';
@@ -224,15 +225,15 @@
   }
 
   test_addLibraryImports_package_hasImports_between() async {
-    addPackageSource('aaa', 'aaa.dart', '');
-    addPackageSource('ddd', 'ddd.dart', '');
+    addPackageFile('aaa', 'aaa.dart', '');
+    addPackageFile('ddd', 'ddd.dart', '');
     await resolveTestUnit('''
 import 'package:aaa/aaa.dart';
 import 'package:ddd/ddd.dart';
 ''');
     Source newLibrary1 = _getSource('/lib/bbb.dart', 'package:bbb/bbb.dart');
     Source newLibrary2 = _getSource('/lib/ccc.dart', 'package:ccc/ccc.dart');
-    _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
+    await _assertAddLibraryImport(<Source>[newLibrary1, newLibrary2], '''
 import 'package:aaa/aaa.dart';
 import 'package:bbb/bbb.dart';
 import 'package:ccc/ccc.dart';
@@ -285,10 +286,11 @@
     await assert_invertCondition('(((b1)))', '!b1');
   }
 
-  void _assertAddLibraryImport(List<Source> newLibraries, String expectedCode) {
+  Future<void> _assertAddLibraryImport(
+      List<Source> newLibraries, String expectedCode) async {
     SourceChange change = new SourceChange('');
-    addLibraryImports(resourceProvider.pathContext, change, testLibraryElement,
-        newLibraries.toSet());
+    await addLibraryImports(testAnalysisResult.session, change,
+        testLibraryElement, newLibraries.toSet());
     SourceFileEdit testEdit = change.getFileEdit(testFile);
     expect(testEdit, isNotNull);
     String resultCode = SourceEdit.applySequence(testCode, testEdit.edits);
diff --git a/pkg/analysis_server/test/services/linter/linter_test.dart b/pkg/analysis_server/test/services/linter/linter_test.dart
index 19272d8..3965bba 100644
--- a/pkg/analysis_server/test/services/linter/linter_test.dart
+++ b/pkg/analysis_server/test/services/linter/linter_test.dart
@@ -1,8 +1,9 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analysis_server/test/services/linter/test_all.dart b/pkg/analysis_server/test/services/linter/test_all.dart
index 270b1a4..feb89d6 100644
--- a/pkg/analysis_server/test/services/linter/test_all.dart
+++ b/pkg/analysis_server/test/services/linter/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
index 7acb0ce..bf429de 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_refactoring.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,11 +8,7 @@
 import 'package:analysis_server/src/services/refactoring/refactoring.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart' show Element;
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/ast_provider_driver.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     show
@@ -44,7 +40,6 @@
  */
 abstract class RefactoringTest extends AbstractSingleUnitTest {
   SearchEngine searchEngine;
-  AstProvider astProvider;
 
   SourceChange refactoringChange;
 
@@ -151,14 +146,6 @@
     expect(actualCode, expectedCode);
   }
 
-  /**
-   * Completes with a fully resolved unit that contains the [element].
-   */
-  Future<CompilationUnit> getResolvedUnitWithElement(Element element) async {
-    return element.context
-        .resolveCompilationUnit(element.source, element.library);
-  }
-
   Future<void> indexTestUnit(String code) async {
     await resolveTestUnit(code);
   }
@@ -170,6 +157,5 @@
   void setUp() {
     super.setUp();
     searchEngine = new SearchEngineImpl([driver]);
-    astProvider = new AstProviderForDriver(driver);
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 400bb3d..80308ef 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -56,7 +56,8 @@
    */
   void createRenameRefactoringForElement(Element element) {
     var workspace = new RefactoringWorkspace([driver], searchEngine);
-    refactoring = new RenameRefactoring(workspace, astProvider, element);
+    var session = testAnalysisResult.session;
+    refactoring = new RenameRefactoring(workspace, session, element);
     expect(refactoring, isNotNull, reason: "No refactoring for '$element'.");
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
index 6702055..b06f849 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -87,7 +87,7 @@
   }
 
   test_change_multipleFiles() async {
-    await indexUnit('/project/other.dart', r'''
+    await indexUnit('/home/test/lib/other.dart', r'''
 class A {
   int get test => 1;
 }
@@ -153,7 +153,7 @@
 
   void _createRefactoringForElement(ExecutableElement element) {
     refactoring = new ConvertGetterToMethodRefactoring(
-        searchEngine, astProvider, element);
+        searchEngine, testAnalysisResult.session, element);
   }
 
   void _createRefactoringForString(String search) {
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
index 60f38f8..d8fe817 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -89,7 +89,7 @@
   }
 
   test_change_multipleFiles() async {
-    await indexUnit('/project/other.dart', r'''
+    await indexUnit('/home/test/lib/other.dart', r'''
 class A {
   int test() => 1;
 }
@@ -205,7 +205,7 @@
 
   void _createRefactoringForElement(ExecutableElement element) {
     refactoring = new ConvertMethodToGetterRefactoring(
-        searchEngine, astProvider, element);
+        searchEngine, testAnalysisResult.session, element);
   }
 
   void _createRefactoringForString(String search) {
diff --git a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
index fd048d2..157d574 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_local_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index 35a31ee..420f69a 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -1516,10 +1516,10 @@
     await indexTestUnit('''
 import 'asyncLib.dart';
 main() {
-  var a = newFuture();
+  var a = newCompleter();
 }
 ''');
-    _createRefactoringForString('newFuture()');
+    _createRefactoringForString('newCompleter()');
     // apply refactoring
     return _assertSuccessfulRefactoring('''
 import 'asyncLib.dart';
@@ -1528,7 +1528,7 @@
   var a = res();
 }
 
-Future<int> res() => newFuture();
+Completer<int> res() => newCompleter();
 ''');
   }
 
@@ -2527,7 +2527,7 @@
     await indexTestUnit('''
 import 'asyncLib.dart';
 main() {
-  var v = newFuture();
+  var v = newCompleter();
 // start
   print(v);
 // end
@@ -2539,20 +2539,19 @@
 import 'asyncLib.dart';
 import 'dart:async';
 main() {
-  var v = newFuture();
+  var v = newCompleter();
 // start
   res(v);
 // end
 }
 
-void res(Future<int> v) {
+void res(Completer<int> v) {
   print(v);
 }
 ''');
   }
 
   test_statements_parameters_localFunction() async {
-    _addLibraryReturningAsync();
     await indexTestUnit('''
 class C {
   int f(int a) {
@@ -2837,10 +2836,10 @@
   }
 
   void _addLibraryReturningAsync() {
-    addSource('/project/asyncLib.dart', r'''
-library asyncLib;
+    addSource('/home/test/lib/asyncLib.dart', r'''
 import 'dart:async';
-Future<int> newFuture() => null;
+
+Completer<int> newCompleter() => null;
 ''');
   }
 
@@ -2880,7 +2879,7 @@
 
   void _createRefactoring(int offset, int length) {
     refactoring = new ExtractMethodRefactoring(
-        searchEngine, astProvider, testAnalysisResult, offset, length);
+        searchEngine, testAnalysisResult, offset, length);
     refactoring.name = 'res';
   }
 
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index c4d46de..580a076 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
index 0c4ac76..0ca2a60 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_local_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -634,6 +634,9 @@
   void _createRefactoring(String search) {
     int offset = findOffset(search);
     refactoring = new InlineLocalRefactoring(
-        searchEngine, astProvider, testAnalysisResult, offset);
+      searchEngine,
+      testAnalysisResult,
+      offset,
+    );
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
index a508984..061ba99 100644
--- a/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/inline_method_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -1756,6 +1756,9 @@
   void _createRefactoring(String search) {
     int offset = findOffset(search);
     refactoring = new InlineMethodRefactoring(
-        searchEngine, astProvider, testAnalysisResult, offset);
+      searchEngine,
+      testAnalysisResult,
+      offset,
+    );
   }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/move_file_test.dart b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
index 2616261..fa60f61 100644
--- a/pkg/analysis_server/test/services/refactoring/move_file_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/move_file_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -23,10 +23,10 @@
   MoveFileRefactoring refactoring;
 
   test_file_containing_imports_exports_parts() async {
-    String pathA = '/project/000/1111/a.dart';
-    String pathB = '/project/000/1111/b.dart';
-    String pathC = '/project/000/1111/22/c.dart';
-    testFile = '/project/000/1111/test.dart';
+    String pathA = '/home/test/000/1111/a.dart';
+    String pathB = '/home/test/000/1111/b.dart';
+    String pathC = '/home/test/000/1111/22/c.dart';
+    testFile = '/home/test/000/1111/test.dart';
     addSource('/absolute/uri.dart', '');
     addSource(pathA, 'part of lib;');
     addSource(pathB, "import 'test.dart';");
@@ -40,7 +40,7 @@
 part '${convertAbsolutePathToUri('/absolute/uri.dart')}';
 ''');
     // perform refactoring
-    _createRefactoring('/project/000/1111/22/new_name.dart');
+    _createRefactoring('/home/test/000/1111/22/new_name.dart');
     await _assertSuccessfulRefactoring();
     assertNoFileChange(pathA);
     assertFileChangeResult(pathB, "import '22/new_name.dart';");
@@ -55,15 +55,30 @@
 ''');
   }
 
+  test_file_imported_with_package_uri() async {
+    newFile('/home/test/lib/old_name.dart', content: '');
+    addTestSource(r'''
+import 'package:test/old_name.dart';
+''');
+
+    _createRefactoring('/home/test/lib/222/new_name.dart',
+        oldName: '/home/test/lib/old_name.dart');
+    await _assertSuccessfulRefactoring();
+
+    assertFileChangeResult(testFile, '''
+import 'package:test/222/new_name.dart';
+''');
+  }
+
   test_file_importedLibrary_down() async {
-    String pathA = '/project/000/1111/a.dart';
-    testFile = '/project/000/1111/test.dart';
+    String pathA = '/home/test/000/1111/a.dart';
+    testFile = '/home/test/000/1111/test.dart';
     addSource(pathA, '''
 import 'test.dart';
 ''');
     addTestSource('');
     // perform refactoring
-    _createRefactoring('/project/000/1111/22/new_name.dart');
+    _createRefactoring('/home/test/000/1111/22/new_name.dart');
     await _assertSuccessfulRefactoring();
     assertFileChangeResult(pathA, '''
 import '22/new_name.dart';
@@ -72,14 +87,14 @@
   }
 
   test_file_importedLibrary_sideways() async {
-    String pathA = '/project/000/1111/a.dart';
-    testFile = '/project/000/1111/sub/folder/test.dart';
+    String pathA = '/home/test/000/1111/a.dart';
+    testFile = '/home/test/000/1111/sub/folder/test.dart';
     addSource(pathA, '''
 import 'sub/folder/test.dart';
 ''');
     addTestSource('');
     // perform refactoring
-    _createRefactoring('/project/000/new/folder/name/new_name.dart');
+    _createRefactoring('/home/test/000/new/folder/name/new_name.dart');
     await _assertSuccessfulRefactoring();
     assertFileChangeResult(pathA, '''
 import '../new/folder/name/new_name.dart';
@@ -88,14 +103,14 @@
   }
 
   test_file_importedLibrary_up() async {
-    String pathA = '/project/000/1111/a.dart';
-    testFile = '/project/000/1111/22/test.dart';
+    String pathA = '/home/test/000/1111/a.dart';
+    testFile = '/home/test/000/1111/22/test.dart';
     addSource(pathA, '''
 import '22/test.dart';
 ''');
     addTestSource('');
     // perform refactoring
-    _createRefactoring('/project/000/1111/new_name.dart');
+    _createRefactoring('/home/test/000/1111/new_name.dart');
     await _assertSuccessfulRefactoring();
     assertFileChangeResult(pathA, '''
 import 'new_name.dart';
@@ -103,33 +118,13 @@
     assertNoFileChange(testFile);
   }
 
-  test_file_imported_with_package_uri() async {
-    // Set up package uri resolution for local package.
-    packageMap['my_package'] = [getFolder('/project/lib')];
-    configureDriver();
-
-    String pathA = '/project/000/1111/a.dart';
-    testFile = '/project/lib/test.dart';
-    addSource(pathA, '''
-  import 'package:my_package/test.dart';
-  ''');
-    addTestSource('');
-    // perform refactoring
-    _createRefactoring('/project/lib/222/new_name.dart');
-    await _assertSuccessfulRefactoring();
-    assertFileChangeResult(pathA, '''
-  import 'package:my_package/222/new_name.dart';
-  ''');
-    assertNoFileChange(testFile);
-  }
-
   @failingTest
   test_file_referenced_by_multiple_libraries() async {
     // This test fails because the search index doesn't support multiple uris for
     // a library, so only one of them is updated.
-    String pathA = '/project/000/1111/a.dart';
-    String pathB = '/project/000/b.dart';
-    testFile = '/project/000/1111/22/test.dart';
+    String pathA = '/home/test/000/1111/a.dart';
+    String pathB = '/home/test/000/b.dart';
+    testFile = '/home/test/000/1111/22/test.dart';
     addSource(pathA, '''
 library lib;
 part '22/test.dart';
@@ -142,7 +137,7 @@
 part of lib;
 ''');
     // perform refactoring
-    _createRefactoring('/project/000/1111/22/new_name.dart');
+    _createRefactoring('/home/test/000/1111/22/new_name.dart');
     await _assertSuccessfulRefactoring();
     assertFileChangeResult(pathA, '''
 library lib;
@@ -156,8 +151,8 @@
   }
 
   test_file_referenced_by_part() async {
-    String pathA = '/project/000/1111/a.dart';
-    testFile = '/project/000/1111/22/test.dart';
+    String pathA = '/home/test/000/1111/a.dart';
+    testFile = '/home/test/000/1111/22/test.dart';
     addSource(pathA, '''
 library lib;
 part '22/test.dart';
@@ -166,7 +161,7 @@
 part of lib;
 ''');
     // perform refactoring
-    _createRefactoring('/project/000/1111/22/new_name.dart');
+    _createRefactoring('/home/test/000/1111/22/new_name.dart');
     await _assertSuccessfulRefactoring();
     assertFileChangeResult(pathA, '''
 library lib;
@@ -190,11 +185,11 @@
   }
 
   test_nonexistent_file_returns_failure() async {
-    _createRefactoring(convertPath('/project/test_missing_new.dart'),
-        oldName: convertPath('/project/test_missing.dart'));
+    _createRefactoring(convertPath('/home/test/test_missing_new.dart'),
+        oldName: convertPath('/home/test/test_missing.dart'));
     await _assertFailedRefactoring(RefactoringProblemSeverity.FATAL,
         expectedMessage:
-            '${convertPath('/project/test_missing.dart')} does not exist.');
+            '${convertPath('/home/test/test_missing.dart')} does not exist.');
   }
 
   @failingTest
@@ -205,18 +200,18 @@
   }
 
   test_projectFolder() async {
-    _createRefactoring('/project2', oldName: '/project');
+    _createRefactoring('/home/test2', oldName: '/home/test');
     await _assertFailedRefactoring(RefactoringProblemSeverity.FATAL,
-        expectedMessage:
-            'Renaming an analysis root is not supported (${convertPath('/project')})');
+        expectedMessage: 'Renaming an analysis root is not supported '
+            '(${convertPath('/home/test')})');
   }
 
   test_renaming_part_that_uses_uri_in_part_of() async {
     // If the file is a part in a library, and the part-of directive uses a URI
     // rather than a library name, that will need updating too (if the relative
     // path to the parent changes).
-    String pathA = '/project/000/1111/a.dart';
-    testFile = '/project/000/1111/22/test.dart';
+    String pathA = '/home/test/000/1111/a.dart';
+    testFile = '/home/test/000/1111/22/test.dart';
     addSource(pathA, '''
 library lib;
 part '22/test.dart';
@@ -225,7 +220,7 @@
 part of '../a.dart';
 ''');
     // perform refactoring
-    _createRefactoring('/project/000/1111/22/33/test.dart');
+    _createRefactoring('/home/test/000/1111/22/33/test.dart');
     await _assertSuccessfulRefactoring();
     assertFileChangeResult(pathA, '''
 library lib;
@@ -236,6 +231,13 @@
 ''');
   }
 
+  Future _assertFailedRefactoring(RefactoringProblemSeverity expectedSeverity,
+      {String expectedMessage}) async {
+    RefactoringStatus status = await refactoring.checkAllConditions();
+    assertRefactoringStatus(status, expectedSeverity,
+        expectedMessage: expectedMessage);
+  }
+
   /**
    * Checks that all conditions are OK.
    */
@@ -257,11 +259,4 @@
     }
     refactoring.newFile = convertPath(newName);
   }
-
-  Future _assertFailedRefactoring(RefactoringProblemSeverity expectedSeverity,
-      {String expectedMessage}) async {
-    RefactoringStatus status = await refactoring.checkAllConditions();
-    assertRefactoringStatus(status, expectedSeverity,
-        expectedMessage: expectedMessage);
-  }
 }
diff --git a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
index 6973932..d714f0d 100644
--- a/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/naming_conventions_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index a7e9148..bd297d4 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -157,7 +157,7 @@
   test() {}
 }
 ''');
-    await indexUnit('/project/lib.dart', '''
+    await indexUnit('/home/test/lib/lib.dart', '''
 library my.lib;
 import 'test.dart';
 
@@ -356,7 +356,7 @@
   newName() {} // marker
 }
 ''';
-    await indexUnit('/project/lib.dart', libCode);
+    await indexUnit('/home/test/lib/lib.dart', libCode);
     await indexTestUnit('''
 import 'lib.dart';
 class B extends A {
@@ -715,17 +715,18 @@
   }
 
   test_createChange_MethodElement_potential_inPubCache() async {
-    String pkgLib = '/.pub-cache/lib.dart';
-    await indexUnit(pkgLib, r'''
+    var externalPath = addPackageFile('aaa', 'lib.dart', r'''
 processObj(p) {
   p.test();
 }
-''');
+''').path;
     await indexTestUnit('''
-import '${convertAbsolutePathToUri(pkgLib)}';
+import 'package:aaa/lib.dart';
+
 class A {
   test() {}
 }
+
 main(var a) {
   a.test();
 }
@@ -737,15 +738,17 @@
     refactoring.newName = 'newName';
     // validate change
     await assertSuccessfulRefactoring('''
-import '${convertAbsolutePathToUri('/.pub-cache/lib.dart')}';
+import 'package:aaa/lib.dart';
+
 class A {
   newName() {}
 }
+
 main(var a) {
   a.newName();
 }
 ''');
-    SourceFileEdit fileEdit = refactoringChange.getFileEdit(pkgLib);
+    SourceFileEdit fileEdit = refactoringChange.getFileEdit(externalPath);
     expect(fileEdit, isNull);
   }
 
@@ -783,6 +786,94 @@
     assertNoFileChange('/lib.dart');
   }
 
+  test_createChange_outsideOfProject_declarationInPackage() async {
+    addPackageFile('aaa', 'aaa.dart', r'''
+class A {
+  void test() {}
+}
+
+void foo(A a) {
+  a.test();
+}
+''');
+    await indexTestUnit('''
+import 'package:aaa/aaa.dart';
+
+class B extends A {
+  void test() {}
+}
+
+main(A a, B b) {
+  a.test();
+  b.test();
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    refactoring.newName = 'newName';
+
+    await assertSuccessfulRefactoring('''
+import 'package:aaa/aaa.dart';
+
+class B extends A {
+  void newName() {}
+}
+
+main(A a, B b) {
+  a.newName();
+  b.newName();
+}
+''');
+
+    expect(refactoringChange.edits, hasLength(1));
+    expect(refactoringChange.edits[0].file, testFile);
+  }
+
+  test_createChange_outsideOfProject_referenceInPart() async {
+    newFile('/home/part.dart', content: r'''
+part of test;
+
+void foo(A a) {
+  a.test();
+}
+''');
+
+    // To use file:// URI.
+    testFile = convertPath('/home/test/bin/test.dart');
+
+    await indexTestUnit('''
+library test;
+
+part '../../part.dart';
+
+class A {
+  void test() {}
+}
+
+main(A a) {
+  a.test();
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    refactoring.newName = 'newName';
+
+    await assertSuccessfulRefactoring('''
+library test;
+
+part '../../part.dart';
+
+class A {
+  void newName() {}
+}
+
+main(A a) {
+  a.newName();
+}
+''');
+
+    expect(refactoringChange.edits, hasLength(1));
+    expect(refactoringChange.edits[0].file, testFile);
+  }
+
   test_createChange_PropertyAccessorElement_getter() async {
     await indexTestUnit('''
 class A {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index 2f0f4a3..884c04a 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_import_test.dart b/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
index ed29086..ef76288 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_import_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_label_test.dart b/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
index 076ec77..b8d8564 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_label_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
index 19d2a4d..b8f8ac2 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -40,7 +40,7 @@
   }
 
   test_createChange() async {
-    addSource('/project/part.dart', '''
+    addSource('/home/test/lib/part.dart', '''
 part of my.app;
 ''');
     await indexTestUnit('''
@@ -57,13 +57,13 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/project/part.dart', '''
+    assertFileChangeResult('/home/test/lib/part.dart', '''
 part of the.new.name;
 ''');
   }
 
   test_createChange_hasWhitespaces() async {
-    addSource('/project/part.dart', '''
+    addSource('/home/test/lib/part.dart', '''
 part of my .  app;
 ''');
     await indexTestUnit('''
@@ -80,7 +80,7 @@
 library the.new.name;
 part 'part.dart';
 ''');
-    assertFileChangeResult('/project/part.dart', '''
+    assertFileChangeResult('/home/test/lib/part.dart', '''
 part of the.new.name;
 ''');
   }
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 6b8c273..042fdcc 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -442,29 +442,42 @@
   }
 
   test_createChange_parameter_named_inOtherFile() async {
-    await indexTestUnit('''
+    var a = convertPath('/home/test/lib/a.dart');
+    var b = convertPath('/home/test/lib/b.dart');
+
+    newFile(a, content: r'''
 class A {
   A({test});
 }
 ''');
-    await indexUnit('/project/test2.dart', '''
-import 'test.dart';
+    newFile(b, content: r'''
+import 'a.dart';
+
 main() {
   new A(test: 2);
 }
 ''');
-    // configure refactoring
+    driver.addFile(a);
+    driver.addFile(b);
+
+    var session = driver.currentSession;
+    testAnalysisResult = await session.getResolvedUnit(a);
+    testFile = testAnalysisResult.path;
+    testCode = testAnalysisResult.content;
+    testUnit = testAnalysisResult.unit;
+
     createRenameRefactoringAtString('test});');
     expect(refactoring.refactoringName, 'Rename Parameter');
     refactoring.newName = 'newName';
-    // validate change
+
     await assertSuccessfulRefactoring('''
 class A {
   A({newName});
 }
 ''');
-    assertFileChangeResult('/project/test2.dart', '''
-import 'test.dart';
+    assertFileChangeResult(b, '''
+import 'a.dart';
+
 main() {
   new A(newName: 2);
 }
@@ -472,7 +485,7 @@
   }
 
   test_createChange_parameter_named_updateHierarchy() async {
-    await indexUnit('/project/test2.dart', '''
+    await indexUnit('/home/test/lib/test2.dart', '''
 library test2;
 class A {
   void foo({int test: 1}) {
@@ -516,7 +529,7 @@
   }
 }
 ''');
-    assertFileChangeResult('/project/test2.dart', '''
+    assertFileChangeResult('/home/test/lib/test2.dart', '''
 library test2;
 class A {
   void foo({int newName: 1}) {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 7ace7de..baa28a5 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -69,7 +69,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit(convertPath('/project/lib.dart'), '''
+    await indexUnit('/home/test/lib/lib.dart', '''
 library my.lib;
 import 'test.dart';
 
@@ -109,7 +109,7 @@
     await indexTestUnit('''
 class Test {}
 ''');
-    await indexUnit(convertPath('/project/lib.dart'), '''
+    await indexUnit('/home/test/lib/lib.dart', '''
 library my.lib;
 import 'test.dart';
 class A {
@@ -230,11 +230,11 @@
   }
 
   test_checkInitialConditions_outsideOfProject() async {
-    addSource('/other/lib.dart', r'''
+    addPackageFile('aaa', 'lib.dart', r'''
 class A {}
 ''');
     await indexTestUnit('''
-import "${convertAbsolutePathToUri('/other/lib.dart')}";
+import "package:aaa/lib.dart";
 main() {
   A a;
 }
@@ -587,7 +587,7 @@
   }
 
   test_createChange_FunctionElement_imported() async {
-    await indexUnit('/project/foo.dart', r'''
+    await indexUnit('/home/test/lib/foo.dart', r'''
 test() {}
 foo() {}
 ''');
@@ -614,7 +614,7 @@
   foo();
 }
 ''');
-    assertFileChangeResult('/project/foo.dart', '''
+    assertFileChangeResult('/home/test/lib/foo.dart', '''
 newName() {}
 foo() {}
 ''');
@@ -644,6 +644,42 @@
 ''');
   }
 
+  test_createChange_outsideOfProject_referenceInPart() async {
+    newFile('/home/part.dart', content: r'''
+part of test;
+
+Test test2;
+''');
+
+    // To use file:// URI.
+    testFile = convertPath('/home/test/bin/test.dart');
+
+    await indexTestUnit('''
+library test;
+
+part '../../part.dart';
+
+class Test {}
+
+Test test;
+''');
+    createRenameRefactoringAtString('Test {}');
+    refactoring.newName = 'NewName';
+
+    await assertSuccessfulRefactoring('''
+library test;
+
+part '../../part.dart';
+
+class NewName {}
+
+NewName test;
+''');
+
+    expect(refactoringChange.edits, hasLength(1));
+    expect(refactoringChange.edits[0].file, testFile);
+  }
+
   test_createChange_PropertyAccessorElement_getter_declaration() async {
     await _test_createChange_PropertyAccessorElement("test {}");
   }
diff --git a/pkg/analysis_server/test/services/refactoring/test_all.dart b/pkg/analysis_server/test/services/refactoring/test_all.dart
index 5dc96b6..a63865d 100644
--- a/pkg/analysis_server/test/services/refactoring/test_all.dart
+++ b/pkg/analysis_server/test/services/refactoring/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/search/element_visitors_test.dart b/pkg/analysis_server/test/services/search/element_visitors_test.dart
index ef2c208..5739ea8 100644
--- a/pkg/analysis_server/test/services/search/element_visitors_test.dart
+++ b/pkg/analysis_server/test/services/search/element_visitors_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
index cec129e4..785345a 100644
--- a/pkg/analysis_server/test/services/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 009e5fc..16488d7 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,21 +7,20 @@
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../mock_sdk.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(SearchEngineImplTest);
@@ -29,7 +28,7 @@
 }
 
 @reflectiveTest
-class SearchEngineImplTest extends Object with ResourceProviderMixin {
+class SearchEngineImplTest with ResourceProviderMixin {
   DartSdk sdk;
   final ByteStore byteStore = new MemoryByteStore();
   final FileContentOverlay contentOverlay = new FileContentOverlay();
@@ -496,7 +495,8 @@
         contentOverlay,
         null,
         new SourceFactory(resolvers, null, resourceProvider),
-        new AnalysisOptionsImpl());
+        new AnalysisOptionsImpl(),
+        enableIndex: true);
   }
 
   static void _assertContainsClass(Set<ClassElement> subtypes, String name) {
diff --git a/pkg/analysis_server/test/services/search/test_all.dart b/pkg/analysis_server/test/services/search/test_all.dart
index eed01b8..63d9465 100644
--- a/pkg/analysis_server/test/services/search/test_all.dart
+++ b/pkg/analysis_server/test/services/search/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/services/test_all.dart b/pkg/analysis_server/test/services/test_all.dart
index 2d77c25..76edf82 100644
--- a/pkg/analysis_server/test/services/test_all.dart
+++ b/pkg/analysis_server/test/services/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 5a8dfcb..7242529 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart b/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
index 1c5ec8d..9e6b5d2 100644
--- a/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/closingLabels_computer_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -24,7 +24,7 @@
 
   setUp() {
     super.setUp();
-    sourcePath = resourceProvider.convertPath('/p/lib/source.dart');
+    sourcePath = convertPath('/home/test/lib/test.dart');
   }
 
   test_adjacentLinesExcluded() async {
@@ -400,7 +400,7 @@
 
   Future<List<ClosingLabel>> _computeElements(String sourceContent) async {
     newFile(sourcePath, content: sourceContent);
-    ResolveResult result = await driver.getResult(sourcePath);
+    ResolvedUnitResult result = await session.getResolvedUnit(sourcePath);
     DartUnitClosingLabelsComputer computer =
         new DartUnitClosingLabelsComputer(result.lineInfo, result.unit);
     return computer.compute();
diff --git a/pkg/analysis_server/test/src/computer/folding_computer_test.dart b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
index dee139a..3f2d2ae 100644
--- a/pkg/analysis_server/test/src/computer/folding_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/folding_computer_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -24,7 +24,7 @@
 
   setUp() {
     super.setUp();
-    sourcePath = resourceProvider.convertPath('/p/lib/source.dart');
+    sourcePath = convertPath('/home/test/lib/test.dart');
   }
 
   test_annotations() async {
@@ -449,7 +449,7 @@
 
   Future<List<FoldingRegion>> _computeRegions(String sourceContent) async {
     newFile(sourcePath, content: sourceContent);
-    ResolveResult result = await driver.getResult(sourcePath);
+    ResolvedUnitResult result = await session.getResolvedUnit(sourcePath);
     DartUnitFoldingComputer computer =
         new DartUnitFoldingComputer(result.lineInfo, result.unit);
     return computer.compute();
diff --git a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
index 3d5f23b..fde32c7 100644
--- a/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/import_elements_computer_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,9 +6,8 @@
 
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/computer/import_elements_computer.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -52,13 +51,13 @@
   Future<void> createBuilder(String content) async {
     originalContent = content;
     newFile(path, content: content);
-    AnalysisResult result = await driver.getResult(path);
+    ResolvedUnitResult result = await session.getResolvedUnit(path);
     computer = new ImportElementsComputer(resourceProvider, result);
   }
 
   void setUp() {
     super.setUp();
-    path = resourceProvider.convertPath('/test.dart');
+    path = convertPath('/home/test/lib/test.dart');
   }
 
   test_createEdits_addImport_noDirectives() async {
@@ -69,7 +68,7 @@
 ''');
     await computeChanges(<ImportedElements>[
       new ImportedElements(
-          convertPath('/lib/math/math.dart'), '', <String>['Random'])
+          convertPath('/sdk/lib/math/math.dart'), '', <String>['Random'])
     ]);
     assertChanges('''
 import 'dart:math';
@@ -81,12 +80,12 @@
   }
 
   test_createEdits_addImport_noPrefix() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' as foo;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A'])
+      new ImportedElements(fooFile.path, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' as foo;
@@ -95,12 +94,12 @@
   }
 
   test_createEdits_addImport_prefix() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart';
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, 'foo', <String>['A'])
+      new ImportedElements(fooFile.path, 'foo', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart';
@@ -109,13 +108,13 @@
   }
 
   test_createEdits_addShow_multipleNames() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' show B;
 import 'package:pkg/foo.dart' as foo;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A', 'C'])
+      new ImportedElements(fooFile.path, '', <String>['A', 'C'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' show B, A, C;
@@ -124,12 +123,12 @@
   }
 
   test_createEdits_addShow_removeHide() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' show A, B hide C, D;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['C'])
+      new ImportedElements(fooFile.path, '', <String>['C'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' show A, B, C hide D;
@@ -137,12 +136,12 @@
   }
 
   test_createEdits_addShow_singleName_noPrefix() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' show B;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A'])
+      new ImportedElements(fooFile.path, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' show B, A;
@@ -150,13 +149,13 @@
   }
 
   test_createEdits_addShow_singleName_prefix() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' show C;
 import 'package:pkg/foo.dart' as foo show B;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, 'foo', <String>['A'])
+      new ImportedElements(fooFile.path, 'foo', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' show C;
@@ -165,34 +164,34 @@
   }
 
   test_createEdits_alreadyImported_noCombinators() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart';
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A', 'B'])
+      new ImportedElements(fooFile.path, '', <String>['A', 'B'])
     ]);
     assertNoChanges();
   }
 
   test_createEdits_alreadyImported_withPrefix() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' as foo;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, 'foo', <String>['A', 'B'])
+      new ImportedElements(fooFile.path, 'foo', <String>['A', 'B'])
     ]);
     assertNoChanges();
   }
 
   test_createEdits_alreadyImported_withShow() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' show A;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A'])
+      new ImportedElements(fooFile.path, '', <String>['A'])
     ]);
     assertNoChanges();
   }
@@ -210,12 +209,12 @@
   }
 
   test_createEdits_invalidUri() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'pakage:pkg/foo.dart';
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A'])
+      new ImportedElements(fooFile.path, '', <String>['A'])
     ]);
     assertChanges('''
 import 'pakage:pkg/foo.dart';
@@ -230,12 +229,12 @@
   }
 
   test_createEdits_removeHide_firstInCombinator() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A'])
+      new ImportedElements(fooFile.path, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide B, C;
@@ -243,12 +242,12 @@
   }
 
   test_createEdits_removeHide_lastInCombinator() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['C'])
+      new ImportedElements(fooFile.path, '', <String>['C'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A, B;
@@ -256,12 +255,12 @@
   }
 
   test_createEdits_removeHide_middleInCombinator() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['B'])
+      new ImportedElements(fooFile.path, '', <String>['B'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A, C;
@@ -269,12 +268,12 @@
   }
 
   test_createEdits_removeHide_multipleCombinators() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C hide A, B, C;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['B'])
+      new ImportedElements(fooFile.path, '', <String>['B'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A, C hide A, C;
@@ -282,12 +281,12 @@
   }
 
   test_createEdits_removeHide_multipleNames() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B, C hide D, E, F hide G, H, I;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A', 'E', 'I'])
+      new ImportedElements(fooFile.path, '', <String>['A', 'E', 'I'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide B, C hide D, F hide G, H;
@@ -295,12 +294,12 @@
   }
 
   test_createEdits_removeHideCombinator_first() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A'])
+      new ImportedElements(fooFile.path, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide B hide C;
@@ -308,12 +307,12 @@
   }
 
   test_createEdits_removeHideCombinator_last() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['C'])
+      new ImportedElements(fooFile.path, '', <String>['C'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A hide B;
@@ -321,12 +320,12 @@
   }
 
   test_createEdits_removeHideCombinator_middle() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A hide B hide C;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['B'])
+      new ImportedElements(fooFile.path, '', <String>['B'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart' hide A hide C;
@@ -334,12 +333,12 @@
   }
 
   test_createEdits_removeHideCombinator_only() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A'])
+      new ImportedElements(fooFile.path, '', <String>['A'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart';
@@ -347,12 +346,12 @@
   }
 
   test_createEdits_removeHideCombinator_only_multiple() async {
-    Source fooSource = addPackageSource('pkg', 'foo.dart', '');
+    var fooFile = addPackageFile('pkg', 'foo.dart', '');
     await createBuilder('''
 import 'package:pkg/foo.dart' hide A, B;
 ''');
     await computeChanges(<ImportedElements>[
-      new ImportedElements(fooSource.fullName, '', <String>['A', 'B'])
+      new ImportedElements(fooFile.path, '', <String>['A', 'B'])
     ]);
     assertChanges('''
 import 'package:pkg/foo.dart';
diff --git a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
index 55c106b..8e123ae 100644
--- a/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/imported_elements_computer_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -24,7 +24,7 @@
 
   setUp() {
     super.setUp();
-    sourcePath = resourceProvider.convertPath('/p/lib/source.dart');
+    sourcePath = convertPath('/home/test/lib/test.dart');
   }
 
   test_dartAsync_noPrefix() async {
@@ -43,7 +43,7 @@
     ImportedElements elements2 = elementsList[1];
     ImportedElements asyncElements;
     ImportedElements coreElements;
-    if (elements1.path == convertPath('/lib/core/core.dart')) {
+    if (elements1.path == convertPath('/sdk/lib/core/core.dart')) {
       coreElements = elements1;
       asyncElements = elements2;
     } else {
@@ -51,12 +51,12 @@
       asyncElements = elements1;
     }
     expect(coreElements, isNotNull);
-    expect(coreElements.path, convertPath('/lib/core/core.dart'));
+    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
     expect(coreElements.prefix, '');
     expect(coreElements.elements, unorderedEquals(['String']));
 
     expect(asyncElements, isNotNull);
-    expect(asyncElements.path, convertPath('/lib/async/async.dart'));
+    expect(asyncElements.path, convertPath('/sdk/lib/async/async.dart'));
     expect(asyncElements.prefix, '');
     expect(asyncElements.elements, unorderedEquals(['Future']));
   }
@@ -77,7 +77,7 @@
     ImportedElements elements2 = elementsList[1];
     ImportedElements asyncElements;
     ImportedElements coreElements;
-    if (elements1.path == convertPath('/lib/core/core.dart')) {
+    if (elements1.path == convertPath('/sdk/lib/core/core.dart')) {
       coreElements = elements1;
       asyncElements = elements2;
     } else {
@@ -85,12 +85,12 @@
       asyncElements = elements1;
     }
     expect(coreElements, isNotNull);
-    expect(coreElements.path, convertPath('/lib/core/core.dart'));
+    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
     expect(coreElements.prefix, '');
     expect(coreElements.elements, unorderedEquals(['String']));
 
     expect(asyncElements, isNotNull);
-    expect(asyncElements.path, convertPath('/lib/async/async.dart'));
+    expect(asyncElements.path, convertPath('/sdk/lib/async/async.dart'));
     expect(asyncElements.prefix, 'a');
     expect(asyncElements.elements, unorderedEquals(['Future']));
   }
@@ -108,7 +108,7 @@
     expect(elementsList, hasLength(1));
     ImportedElements elements = elementsList[0];
     expect(elements, isNotNull);
-    expect(elements.path, convertPath('/lib/core/core.dart'));
+    expect(elements.path, convertPath('/sdk/lib/core/core.dart'));
     expect(elements.prefix, '');
     expect(elements.elements, unorderedEquals(['String']));
   }
@@ -127,7 +127,7 @@
     expect(elementsList, hasLength(1));
     ImportedElements elements = elementsList[0];
     expect(elements, isNotNull);
-    expect(elements.path, convertPath('/lib/core/core.dart'));
+    expect(elements.path, convertPath('/sdk/lib/core/core.dart'));
     expect(elements.prefix, 'core');
     expect(elements.elements, unorderedEquals(['String']));
   }
@@ -146,7 +146,7 @@
     expect(elementsList, hasLength(1));
     ImportedElements elements = elementsList[0];
     expect(elements, isNotNull);
-    expect(elements.path, convertPath('/lib/math/math.dart'));
+    expect(elements.path, convertPath('/sdk/lib/math/math.dart'));
     expect(elements.prefix, '');
     expect(elements.elements, unorderedEquals(['Random']));
   }
@@ -170,13 +170,13 @@
 
     ImportedElements mathElements = elementsList[0];
     expect(mathElements, isNotNull);
-    expect(mathElements.path, convertPath('/lib/math/math.dart'));
+    expect(mathElements.path, convertPath('/sdk/lib/math/math.dart'));
     expect(mathElements.prefix, '');
     expect(mathElements.elements, unorderedEquals(['Random']));
 
     ImportedElements coreElements = elementsList[1];
     expect(coreElements, isNotNull);
-    expect(coreElements.path, convertPath('/lib/core/core.dart'));
+    expect(coreElements.path, convertPath('/sdk/lib/core/core.dart'));
     expect(coreElements.prefix, '');
     expect(coreElements.elements, unorderedEquals(['String', 'print']));
   }
@@ -236,7 +236,7 @@
   }
 
   test_package_multipleInSame() async {
-    addPackageSource('foo', 'foo.dart', '''
+    addPackageFile('foo', 'foo.dart', '''
 class A {
   static String a = '';
 }
@@ -256,13 +256,13 @@
     expect(elementsList, hasLength(1));
     ImportedElements elements = elementsList[0];
     expect(elements, isNotNull);
-    expect(elements.path, convertPath('/pubcache/foo/lib/foo.dart'));
+    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
     expect(elements.prefix, '');
     expect(elements.elements, unorderedEquals(['A', 'B']));
   }
 
   test_package_noPrefix() async {
-    addPackageSource('foo', 'foo.dart', '''
+    addPackageFile('foo', 'foo.dart', '''
 class Foo {
   static String first = '';
 }
@@ -279,13 +279,13 @@
     expect(elementsList, hasLength(1));
     ImportedElements elements = elementsList[0];
     expect(elements, isNotNull);
-    expect(elements.path, convertPath('/pubcache/foo/lib/foo.dart'));
+    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
     expect(elements.prefix, '');
     expect(elements.elements, unorderedEquals(['Foo']));
   }
 
   test_package_prefix_selected() async {
-    addPackageSource('foo', 'foo.dart', '''
+    addPackageFile('foo', 'foo.dart', '''
 class Foo {
   static String first = '';
 }
@@ -302,13 +302,13 @@
     expect(elementsList, hasLength(1));
     ImportedElements elements = elementsList[0];
     expect(elements, isNotNull);
-    expect(elements.path, convertPath('/pubcache/foo/lib/foo.dart'));
+    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
     expect(elements.prefix, 'f');
     expect(elements.elements, unorderedEquals(['Foo']));
   }
 
   test_package_prefix_unselected() async {
-    addPackageSource('foo', 'foo.dart', '''
+    addPackageFile('foo', 'foo.dart', '''
 class Foo {
   static String first = '';
 }
@@ -325,13 +325,13 @@
     expect(elementsList, hasLength(1));
     ImportedElements elements = elementsList[0];
     expect(elements, isNotNull);
-    expect(elements.path, convertPath('/pubcache/foo/lib/foo.dart'));
+    expect(elements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
     expect(elements.prefix, '');
     expect(elements.elements, unorderedEquals(['Foo']));
   }
 
   test_package_prefixedAndNot() async {
-    addPackageSource('foo', 'foo.dart', '''
+    addPackageFile('foo', 'foo.dart', '''
 class Foo {
   static String first = '';
   static String second = '';
@@ -362,12 +362,13 @@
     }
 
     expect(notPrefixedElements, isNotNull);
-    expect(notPrefixedElements.path, convertPath('/pubcache/foo/lib/foo.dart'));
+    expect(
+        notPrefixedElements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
     expect(notPrefixedElements.prefix, '');
     expect(notPrefixedElements.elements, unorderedEquals(['Foo']));
 
     expect(prefixedElements, isNotNull);
-    expect(prefixedElements.path, convertPath('/pubcache/foo/lib/foo.dart'));
+    expect(prefixedElements.path, convertPath('/.pub-cache/foo/lib/foo.dart'));
     expect(prefixedElements.prefix, 'f');
     expect(prefixedElements.elements, unorderedEquals(['Foo']));
   }
@@ -392,7 +393,7 @@
   Future<List<ImportedElements>> _computeElements(
       String sourceContent, int offset, int length) async {
     newFile(sourcePath, content: sourceContent);
-    ResolveResult result = await driver.getResult(sourcePath);
+    ResolvedUnitResult result = await session.getResolvedUnit(sourcePath);
     ImportedElementsComputer computer =
         new ImportedElementsComputer(result.unit, offset, length);
     return computer.compute();
diff --git a/pkg/analysis_server/test/src/computer/outline_computer_test.dart b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
index 340045a..643d144c 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -1,11 +1,10 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
 import 'package:analysis_server/src/computer/computer_outline.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
@@ -27,15 +26,15 @@
   @override
   void setUp() {
     super.setUp();
-    testPath = resourceProvider.convertPath('/test.dart');
+    testPath = convertPath('/home/test/lib/test.dart');
   }
 
   Future<Outline> _computeOutline(String code) async {
     testCode = code;
     newFile(testPath, content: code);
-    AnalysisResult analysisResult = await driver.getResult(testPath);
+    var resolveResult = await session.getResolvedUnit(testPath);
     return new DartUnitOutlineComputer(
-            testPath, analysisResult.lineInfo, analysisResult.unit,
+            testPath, resolveResult.lineInfo, resolveResult.unit,
             withBasicFlutter: true)
         .compute();
   }
@@ -558,7 +557,7 @@
   }
 
   test_isTest_isTestGroup() async {
-    addMetaPackageSource();
+    addMetaPackage();
     Outline outline = await _computeOutline('''
 import 'package:meta/meta.dart';
 
@@ -1057,6 +1056,7 @@
     Outline unitOutline = await _computeOutline('''
 typedef String FTA<K, V>(int i, String s);
 typedef FTB(int p);
+typedef GTAF<T> = void Function<S>(T t, S s);
 class A<T> {}
 class B {}
 class CTA<T> = A<T> with B;
@@ -1067,7 +1067,7 @@
 set propB(int v) {}
 ''');
     List<Outline> topOutlines = unitOutline.children;
-    expect(topOutlines, hasLength(10));
+    expect(topOutlines, hasLength(11));
     // FTA
     {
       Outline outline = topOutlines[0];
@@ -1098,9 +1098,24 @@
       expect(element.parameters, "(int p)");
       expect(element.returnType, "");
     }
+    // GenericTypeAlias - function
+    {
+      Outline outline = topOutlines[2];
+      Element element = outline.element;
+      expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+      expect(element.name, "GTAF");
+      expect(element.typeParameters, '<T>');
+      {
+        Location location = element.location;
+        expect(location.offset, testCode.indexOf("GTAF<T> ="));
+        expect(location.length, "GTAF".length);
+      }
+      expect(element.parameters, "(T t, S s)");
+      expect(element.returnType, "void");
+    }
     // CTA
     {
-      Outline outline = topOutlines[4];
+      Outline outline = topOutlines[5];
       Element element = outline.element;
       expect(element.kind, ElementKind.CLASS_TYPE_ALIAS);
       expect(element.name, "CTA");
@@ -1115,7 +1130,7 @@
     }
     // CTB
     {
-      Outline outline = topOutlines[5];
+      Outline outline = topOutlines[6];
       Element element = outline.element;
       expect(element.kind, ElementKind.CLASS_TYPE_ALIAS);
       expect(element.name, 'CTB');
@@ -1124,7 +1139,7 @@
     }
     // fA
     {
-      Outline outline = topOutlines[6];
+      Outline outline = topOutlines[7];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION);
       expect(element.name, "fA");
@@ -1138,7 +1153,7 @@
     }
     // fB
     {
-      Outline outline = topOutlines[7];
+      Outline outline = topOutlines[8];
       Element element = outline.element;
       expect(element.kind, ElementKind.FUNCTION);
       expect(element.name, "fB");
@@ -1152,7 +1167,7 @@
     }
     // propA
     {
-      Outline outline = topOutlines[8];
+      Outline outline = topOutlines[9];
       Element element = outline.element;
       expect(element.kind, ElementKind.GETTER);
       expect(element.name, "propA");
@@ -1166,7 +1181,7 @@
     }
     // propB
     {
-      Outline outline = topOutlines[9];
+      Outline outline = topOutlines[10];
       Element element = outline.element;
       expect(element.kind, ElementKind.SETTER);
       expect(element.name, "propB");
diff --git a/pkg/analysis_server/test/src/computer/test_all.dart b/pkg/analysis_server/test/src/computer/test_all.dart
index 8159db8..c99b3c5 100644
--- a/pkg/analysis_server/test/src/computer/test_all.dart
+++ b/pkg/analysis_server/test/src/computer/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/domain_abstract_test.dart b/pkg/analysis_server/test/src/domain_abstract_test.dart
index dde70ce..41ba49d 100644
--- a/pkg/analysis_server/test/src/domain_abstract_test.dart
+++ b/pkg/analysis_server/test/src/domain_abstract_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/domains/execution/completion_test.dart b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
index 4ba0ecd..37ff7fa 100644
--- a/pkg/analysis_server/test/src/domains/execution/completion_test.dart
+++ b/pkg/analysis_server/test/src/domains/execution/completion_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -25,7 +25,7 @@
   RuntimeCompletionResult result;
 
   void addContextFile(String content) {
-    contextFile = convertPath('/test/lib/context.dart');
+    contextFile = convertPath('/home/test/lib/context.dart');
     addSource(contextFile, content);
 
     contextOffset = content.indexOf('// context line');
@@ -131,13 +131,13 @@
   }
 
   test_inPart() async {
-    addSource('/test/lib/a.dart', r'''
+    addSource('/home/test/lib/a.dart', r'''
 part 'b.dart';
 part 'context.dart';
 
 int a;
 ''');
-    addSource('/test/lib/b.dart', r'''
+    addSource('/home/test/lib/b.dart', r'''
 part of 'a.dart';
 
 double b;
diff --git a/pkg/analysis_server/test/src/domains/execution/test_all.dart b/pkg/analysis_server/test/src/domains/execution/test_all.dart
new file mode 100644
index 0000000..cde2384
--- /dev/null
+++ b/pkg/analysis_server/test/src/domains/execution/test_all.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'completion_test.dart' as completion_test;
+
+main() {
+  defineReflectiveSuite(() {
+    completion_test.main();
+  });
+}
diff --git a/pkg/analysis_server/test/src/domains/test_all.dart b/pkg/analysis_server/test/src/domains/test_all.dart
new file mode 100644
index 0000000..ea67387
--- /dev/null
+++ b/pkg/analysis_server/test/src/domains/test_all.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'execution/test_all.dart' as execution_test;
+
+main() {
+  defineReflectiveSuite(() {
+    execution_test.main();
+  });
+}
diff --git a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
index 4501d68..1039fe9 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -125,11 +125,9 @@
 
   void _createCorrections() {
     corrections = new FlutterCorrections(
-        file: testFile,
-        fileContent: testCode,
-        selectionOffset: offset,
-        selectionLength: length,
-        session: testAnalysisResult.session,
-        unit: testUnit);
+      resolveResult: testAnalysisResult,
+      selectionOffset: offset,
+      selectionLength: length,
+    );
   }
 }
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
index e4b62c4..18df136 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_computer_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,7 +6,7 @@
 
 import 'package:analysis_server/src/flutter/flutter_outline_computer.dart';
 import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -22,13 +22,13 @@
 class FlutterOutlineComputerTest extends AbstractContextTest {
   String testPath;
   String testCode;
-  AnalysisResult analysisResult;
+  ResolvedUnitResult resolveResult;
   FlutterOutlineComputer computer;
 
   @override
   void setUp() {
     super.setUp();
-    testPath = resourceProvider.convertPath('/test.dart');
+    testPath = convertPath('/home/test/lib/test.dart');
     addFlutterPackage();
   }
 
@@ -288,7 +288,7 @@
   }
 
   test_parentAssociationLabel() async {
-    newFile('/a.dart', content: r'''
+    newFile('/home/test/lib/a.dart', content: r'''
 import 'package:flutter/widgets.dart';
 
 class WidgetA extends StatelessWidget {
@@ -359,7 +359,7 @@
   test_render_BAD_part() async {
     // Use test.dart as a part of a library.
     // Add the library to the driver so that it is analyzed before the part.
-    var libPath = newFile('/test_lib.dart', content: r'''
+    var libPath = newFile('/home/test/lib/test_lib.dart', content: r'''
 part 'test.dart';
 import 'package:flutter/widgets.dart';
 ''').path;
@@ -379,7 +379,7 @@
 ''');
 
     // Analysis is successful, no errors.
-    expect(analysisResult.errors, isEmpty);
+    expect(resolveResult.errors, isEmpty);
 
     // No instrumentation, because not a library.
     expect(computer.instrumentedCode, isNull);
@@ -431,8 +431,7 @@
   }
 
   test_render_instrumentedCode_rewriteUri_file() async {
-    testPath = resourceProvider.convertPath('/home/user/test/test.dart');
-    var libFile = newFile('/home/user/test/my_lib.dart', content: '');
+    newFile('/home/test/lib/my_lib.dart');
 
     await _computeOutline('''
 import 'package:flutter/widgets.dart';
@@ -451,7 +450,7 @@
         computer.instrumentedCode,
         '''
 import 'package:flutter/widgets.dart';
-import '${libFile.toUri()}';
+import 'package:test/my_lib.dart';
 
 class MyWidget extends StatelessWidget {
   MyWidget.forDesignTime();
@@ -466,11 +465,7 @@
   }
 
   test_render_instrumentedCode_rewriteUri_package() async {
-    packageMap['test'] = [newFolder('/home/user/test/lib')];
-
-    testPath = resourceProvider.convertPath('/home/user/test/lib/test.dart');
-    newFile('/home/user/test/lib/my_lib.dart', content: '');
-    configureDriver();
+    newFile('/home/test/lib/my_lib.dart');
 
     await _computeOutline('''
 import 'package:flutter/widgets.dart';
@@ -630,9 +625,9 @@
   Future<FlutterOutline> _computeOutline(String code) async {
     testCode = code;
     newFile(testPath, content: code);
-    analysisResult = await driver.getResult(testPath);
-    computer = new FlutterOutlineComputer(
-        testPath, testCode, analysisResult.lineInfo, analysisResult.unit);
+    resolveResult = await session.getResolvedUnit(testPath);
+    computer = new FlutterOutlineComputer(testPath, testCode,
+        resolveResult.lineInfo, resolveResult.unit, resolveResult.typeProvider);
     return computer.compute();
   }
 
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
index 84f8f04..0636227 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/flutter/test_all.dart b/pkg/analysis_server/test/src/flutter/test_all.dart
index d209fd5..09ef471 100644
--- a/pkg/analysis_server/test/src/flutter/test_all.dart
+++ b/pkg/analysis_server/test/src/flutter/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/lsp/lsp_packet_transformer_test.dart b/pkg/analysis_server/test/src/lsp/lsp_packet_transformer_test.dart
new file mode 100644
index 0000000..3a557bb
--- /dev/null
+++ b/pkg/analysis_server/test/src/lsp/lsp_packet_transformer_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:analysis_server/src/lsp/lsp_packet_transformer.dart';
+import 'package:test/test.dart';
+
+main() {
+  group('lsp_packet_transformer', () {
+    test('transforms data received as individual bytes', () async {
+      final payload = '{ json payload }';
+      final lspPacket = makeLspPacket(payload);
+      final output = await new Stream.fromIterable([lspPacket])
+          .transform(new LspPacketTransformer())
+          .toList();
+      expect(output, equals([payload]));
+    });
+
+    test('transforms data received in chunks', () async {
+      final payload = '{ json\n payload\n  }';
+      final lspPacket = makeLspPacket(payload);
+      // Separate each byte into it's own "packet" to simulate chunked data
+      // where all the bytes for a single LSP packet don't arrive in one
+      // item to the stream.
+      final dataPackets = lspPacket.map((b) => [b]);
+      final output = await new Stream.fromIterable(dataPackets)
+          .transform(new LspPacketTransformer())
+          .toList();
+      expect(output, equals([payload]));
+    });
+
+    test('handles unicode characters', () async {
+      // This file is saved as UTF8.
+      final payload = '{ json payload 🎉 }';
+      final lspPacket = makeLspPacket(payload);
+      final output = await new Stream.fromIterable([lspPacket])
+          .transform(new LspPacketTransformer())
+          .toList();
+      expect(output, equals([payload]));
+    });
+
+    test('accepts "utf-8" as an encoding', () async {
+      final payload = '{ json payload 🎉 }';
+      final lspPacket =
+          makeLspPacket(payload, 'application/vscode-jsonrpc; charset=utf-8');
+      final output = await new Stream.fromIterable([lspPacket])
+          .transform(new LspPacketTransformer())
+          .toList();
+      expect(output, equals([payload]));
+    });
+
+    test('accepts "utf8" as an encoding', () async {
+      final payload = '{ json payload 🎉 }';
+      final lspPacket =
+          makeLspPacket(payload, 'application/vscode-jsonrpc; charset=utf8');
+      final output = await new Stream.fromIterable([lspPacket])
+          .transform(new LspPacketTransformer())
+          .toList();
+      expect(output, equals([payload]));
+    });
+
+    test('accepts no encoding', () async {
+      final payload = '{ json payload 🎉 }';
+      final lspPacket = makeLspPacket(payload, 'application/vscode-jsonrpc;');
+      final output = await new Stream.fromIterable([lspPacket])
+          .transform(new LspPacketTransformer())
+          .toList();
+      expect(output, equals([payload]));
+    });
+
+    test('rejects invalid encoding', () async {
+      final payload = '{ json payload }';
+      final lspPacket =
+          makeLspPacket(payload, 'application/vscode-jsonrpc; charset=ascii');
+      final outputStream = await new Stream.fromIterable([lspPacket])
+          .transform(new LspPacketTransformer());
+
+      expectLater(outputStream.toList(),
+          throwsA(const TypeMatcher<InvalidEncodingError>()));
+    });
+  });
+}
+
+List<int> makeLspPacket(String json, [String contentType]) {
+  final utf8EncodedBody = utf8.encode(json);
+  final header = 'Content-Length: ${utf8EncodedBody.length}' +
+      (contentType != null ? '\r\nContent-Type: $contentType' : '') +
+      '\r\n\r\n';
+  final asciiEncodedHeader = ascii.encode(header);
+
+  return asciiEncodedHeader.followedBy(utf8EncodedBody).toList();
+}
diff --git a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
index ae42433..124dfd5 100644
--- a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/plugin/plugin_locator_test.dart b/pkg/analysis_server/test/src/plugin/plugin_locator_test.dart
index db3d3f9..a01ca1f 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_locator_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_locator_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,7 +14,7 @@
 }
 
 @reflectiveTest
-class PluginLocatorTest extends Object with ResourceProviderMixin {
+class PluginLocatorTest with ResourceProviderMixin {
   String packageRoot;
   String pubspecPath;
   String defaultDirPath;
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index 6837470..186e284 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -405,7 +405,7 @@
 }
 
 @reflectiveTest
-class PluginManagerTest extends Object with ResourceProviderMixin {
+class PluginManagerTest with ResourceProviderMixin {
   String byteStorePath;
   String sdkPath;
   TestNotificationManager notificationManager;
@@ -535,7 +535,7 @@
 }
 
 @reflectiveTest
-class PluginSessionTest extends Object with ResourceProviderMixin {
+class PluginSessionTest with ResourceProviderMixin {
   TestNotificationManager notificationManager;
   String pluginPath;
   String executionPath;
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index 058ee15..d81f23b 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,24 +8,24 @@
 import 'package:analysis_server/src/plugin/plugin_locator.dart';
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/plugin/plugin_watcher.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/context/context_root.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../mock_sdk.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(PluginWatcherTest);
@@ -33,7 +33,7 @@
 }
 
 @reflectiveTest
-class PluginWatcherTest extends Object with ResourceProviderMixin {
+class PluginWatcherTest with ResourceProviderMixin {
   TestPluginManager manager;
   PluginWatcher watcher;
 
@@ -119,7 +119,7 @@
   AnalysisSession currentSession;
   AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
 
-  final _resultController = new StreamController<AnalysisResult>();
+  final _resultController = new StreamController<ResolvedUnitResult>();
 
   TestDriver(this.resourceProvider, ContextRoot contextRoot) {
     path.Context pathContext = resourceProvider.pathContext;
@@ -147,15 +147,7 @@
     currentSession = new AnalysisSessionImpl(this);
   }
 
-  Stream<AnalysisResult> get results => _resultController.stream;
-
-  Future<void> computeResult(String uri) {
-    FileState file = fsState.getFileForUri(Uri.parse(uri));
-    AnalysisResult result = new AnalysisResult(this, null, file.path, null,
-        true, null, null, false, null, null, null, null);
-    _resultController.add(result);
-    return new Future.delayed(new Duration(milliseconds: 1));
-  }
+  Stream<ResolvedUnitResult> get results => _resultController.stream;
 
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
diff --git a/pkg/analysis_server/test/src/plugin/protocol_test_utilities.dart b/pkg/analysis_server/test/src/plugin/protocol_test_utilities.dart
index 6bfaf1d..c21b06d 100644
--- a/pkg/analysis_server/test/src/plugin/protocol_test_utilities.dart
+++ b/pkg/analysis_server/test/src/plugin/protocol_test_utilities.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/plugin/request_converter_test.dart b/pkg/analysis_server/test/src/plugin/request_converter_test.dart
index 527623b..c0a3d1c 100644
--- a/pkg/analysis_server/test/src/plugin/request_converter_test.dart
+++ b/pkg/analysis_server/test/src/plugin/request_converter_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/plugin/result_collector_test.dart b/pkg/analysis_server/test/src/plugin/result_collector_test.dart
index e6372c6..d628c63 100644
--- a/pkg/analysis_server/test/src/plugin/result_collector_test.dart
+++ b/pkg/analysis_server/test/src/plugin/result_collector_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/plugin/result_converter_test.dart b/pkg/analysis_server/test/src/plugin/result_converter_test.dart
index ffe30cd..5c947aa 100644
--- a/pkg/analysis_server/test/src/plugin/result_converter_test.dart
+++ b/pkg/analysis_server/test/src/plugin/result_converter_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/plugin/result_merger_test.dart b/pkg/analysis_server/test/src/plugin/result_merger_test.dart
index 75f11fa..0b051e6 100644
--- a/pkg/analysis_server/test/src/plugin/result_merger_test.dart
+++ b/pkg/analysis_server/test/src/plugin/result_merger_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/plugin/test_all.dart b/pkg/analysis_server/test/src/plugin/test_all.dart
index a1f7564..48883d7 100644
--- a/pkg/analysis_server/test/src/plugin/test_all.dart
+++ b/pkg/analysis_server/test/src/plugin/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
new file mode 100644
index 0000000..9d1e8fb
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/add_type_annotation_test.dart
@@ -0,0 +1,576 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddTypeAnnotationTest);
+  });
+}
+
+@reflectiveTest
+class AddTypeAnnotationTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.ADD_TYPE_ANNOTATION;
+
+  test_classField_final() async {
+    await resolveTestUnit('''
+class A {
+  final f = 0;
+}
+''');
+    await assertHasAssistAt('final ', '''
+class A {
+  final int f = 0;
+}
+''');
+  }
+
+  test_classField_int() async {
+    await resolveTestUnit('''
+class A {
+  var f = 0;
+}
+''');
+    await await assertHasAssistAt('var ', '''
+class A {
+  int f = 0;
+}
+''');
+  }
+
+  test_declaredIdentifier() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (var item in items) {
+  }
+}
+''');
+    // on identifier
+    await assertHasAssistAt('item in', '''
+main(List<String> items) {
+  for (String item in items) {
+  }
+}
+''');
+    // on "for"
+    await assertHasAssistAt('for (', '''
+main(List<String> items) {
+  for (String item in items) {
+  }
+}
+''');
+  }
+
+  test_declaredIdentifier_addImport_dartUri() async {
+    addSource('/home/test/lib/my_lib.dart', r'''
+import 'dart:collection';
+List<HashMap<String, int>> getMap() => null;
+''');
+    await resolveTestUnit('''
+import 'my_lib.dart';
+main() {
+  for (var map in getMap()) {
+  }
+}
+''');
+    await assertHasAssistAt('map in', '''
+import 'dart:collection';
+
+import 'my_lib.dart';
+main() {
+  for (HashMap<String, int> map in getMap()) {
+  }
+}
+''');
+  }
+
+  test_declaredIdentifier_final() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (final item in items) {
+  }
+}
+''');
+    await assertHasAssistAt('item in', '''
+main(List<String> items) {
+  for (final String item in items) {
+  }
+}
+''');
+  }
+
+  test_declaredIdentifier_generic() async {
+    await resolveTestUnit('''
+class A<T> {
+  main(List<List<T>> items) {
+    for (var item in items) {
+    }
+  }
+}
+''');
+    await assertHasAssistAt('item in', '''
+class A<T> {
+  main(List<List<T>> items) {
+    for (List<T> item in items) {
+    }
+  }
+}
+''');
+  }
+
+  test_declaredIdentifier_hasTypeAnnotation() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (String item in items) {
+  }
+}
+''');
+    await assertNoAssistAt('item in');
+  }
+
+  test_declaredIdentifier_inForEachBody() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (var item in items) {
+    42;
+  }
+}
+''');
+    await assertNoAssistAt('42;');
+  }
+
+  test_declaredIdentifier_unknownType() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+main() {
+  for (var item in unknownList) {
+  }
+}
+''');
+    await assertNoAssistAt('item in');
+  }
+
+  test_local_addImport_dartUri() async {
+    addSource('/home/test/lib/my_lib.dart', r'''
+import 'dart:collection';
+HashMap<String, int> getMap() => null;
+''');
+    await resolveTestUnit('''
+import 'my_lib.dart';
+main() {
+  var v = getMap();
+}
+''');
+    await assertHasAssistAt('v =', '''
+import 'dart:collection';
+
+import 'my_lib.dart';
+main() {
+  HashMap<String, int> v = getMap();
+}
+''');
+  }
+
+  test_local_addImport_notLibraryUnit() async {
+    addSource('/home/test/lib/my_lib.dart', r'''
+import 'dart:collection';
+HashMap<String, int> getMap() => null;
+''');
+
+    var appCode = r'''
+library my_app;
+import 'my_lib.dart';
+part 'test.dart';
+''';
+    var partCode = r'''
+part of my_app;
+main() {
+  var /*caret*/v = getMap();
+}
+''';
+
+    var appPath = convertPath('/home/test/lib/app.dart');
+    addSource(appPath, appCode);
+    addSource(testFile, partCode);
+    await resolveTestUnit(partCode);
+
+    await assertHasAssist('''
+part of my_app;
+main() {
+  HashMap<String, int> /*caret*/v = getMap();
+}
+''', additionallyChangedFiles: {
+      appPath: [
+        appCode,
+        '''
+library my_app;
+import 'dart:collection';
+
+import 'my_lib.dart';
+part 'test.dart';
+'''
+      ]
+    });
+  }
+
+  test_local_addImport_relUri() async {
+    testFile = convertPath('/home/test/bin/test.dart');
+    addSource('/home/test/bin/aa/bbb/lib_a.dart', r'''
+class MyClass {}
+''');
+    addSource('/home/test/bin/ccc/lib_b.dart', r'''
+import '../aa/bbb/lib_a.dart';
+MyClass newMyClass() => null;
+''');
+    await resolveTestUnit('''
+import 'ccc/lib_b.dart';
+main() {
+  var v = newMyClass();
+}
+''');
+    await assertHasAssistAt('v =', '''
+import 'aa/bbb/lib_a.dart';
+import 'ccc/lib_b.dart';
+main() {
+  MyClass v = newMyClass();
+}
+''');
+  }
+
+  test_local_bottom() async {
+    await resolveTestUnit('''
+main() {
+  var v = throw 42;
+}
+''');
+    await assertNoAssistAt('var ');
+  }
+
+  test_local_Function() async {
+    await resolveTestUnit('''
+main() {
+  var v = () => 1;
+}
+''');
+    await assertHasAssistAt('v =', '''
+main() {
+  int Function() v = () => 1;
+}
+''');
+  }
+
+  test_local_generic_literal() async {
+    await resolveTestUnit('''
+class A {
+  main(List<int> items) {
+    var v = items;
+  }
+}
+''');
+    await assertHasAssistAt('v =', '''
+class A {
+  main(List<int> items) {
+    List<int> v = items;
+  }
+}
+''');
+  }
+
+  test_local_generic_local() async {
+    await resolveTestUnit('''
+class A<T> {
+  main(List<T> items) {
+    var v = items;
+  }
+}
+''');
+    await assertHasAssistAt('v =', '''
+class A<T> {
+  main(List<T> items) {
+    List<T> v = items;
+  }
+}
+''');
+  }
+
+  test_local_hasTypeAnnotation() async {
+    await resolveTestUnit('''
+main() {
+  int v = 42;
+}
+''');
+    await assertNoAssistAt(' = 42');
+  }
+
+  test_local_int() async {
+    await resolveTestUnit('''
+main() {
+  var v = 0;
+}
+''');
+    await assertHasAssistAt('v =', '''
+main() {
+  int v = 0;
+}
+''');
+  }
+
+  test_local_List() async {
+    await resolveTestUnit('''
+main() {
+  var v = <String>[];
+}
+''');
+    await assertHasAssistAt('v =', '''
+main() {
+  List<String> v = <String>[];
+}
+''');
+  }
+
+  test_local_localType() async {
+    await resolveTestUnit('''
+class C {}
+C f() => null;
+main() {
+  var x = f();
+}
+''');
+    await assertHasAssistAt('x =', '''
+class C {}
+C f() => null;
+main() {
+  C x = f();
+}
+''');
+  }
+
+  test_local_multiple() async {
+    await resolveTestUnit('''
+main() {
+  var a = 1, b = '';
+}
+''');
+    await assertNoAssistAt('var ');
+  }
+
+  test_local_noValue() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+main() {
+  var v;
+}
+''');
+    await assertNoAssistAt('var ');
+  }
+
+  test_local_null() async {
+    await resolveTestUnit('''
+main() {
+  var v = null;
+}
+''');
+    await assertNoAssistAt('var ');
+  }
+
+  test_local_onInitializer() async {
+    await resolveTestUnit('''
+main() {
+  var abc = 0;
+}
+''');
+    await assertNoAssistAt('0;');
+  }
+
+  test_local_onName() async {
+    await resolveTestUnit('''
+main() {
+  var abc = 0;
+}
+''');
+    await assertHasAssistAt('bc', '''
+main() {
+  int abc = 0;
+}
+''');
+  }
+
+  test_local_onVar() async {
+    await resolveTestUnit('''
+main() {
+  var v = 0;
+}
+''');
+    await assertHasAssistAt('var ', '''
+main() {
+  int v = 0;
+}
+''');
+  }
+
+  test_local_unknown() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+main() {
+  var v = unknownVar;
+}
+''');
+    await assertNoAssistAt('var ');
+  }
+
+  test_parameter() async {
+    await resolveTestUnit('''
+foo(f(int p)) {}
+main() {
+  foo((test) {});
+}
+''');
+    await assertHasAssistAt('test', '''
+foo(f(int p)) {}
+main() {
+  foo((int test) {});
+}
+''');
+  }
+
+  test_parameter_hasExplicitType() async {
+    await resolveTestUnit('''
+foo(f(int p)) {}
+main() {
+  foo((num test) {});
+}
+''');
+    await assertNoAssistAt('test');
+  }
+
+  test_parameter_noPropagatedType() async {
+    await resolveTestUnit('''
+foo(f(p)) {}
+main() {
+  foo((test) {});
+}
+''');
+    await assertNoAssistAt('test');
+  }
+
+  test_privateType_closureParameter() async {
+    addSource('/home/test/lib/my_lib.dart', '''
+library my_lib;
+class A {}
+class _B extends A {}
+foo(f(_B p)) {}
+''');
+    await resolveTestUnit('''
+import 'my_lib.dart';
+main() {
+  foo((test) {});
+}
+ ''');
+    await assertNoAssistAt('test)');
+  }
+
+  test_privateType_declaredIdentifier() async {
+    addSource('/home/test/lib/my_lib.dart', '''
+library my_lib;
+class A {}
+class _B extends A {}
+List<_B> getValues() => [];
+''');
+    await resolveTestUnit('''
+import 'my_lib.dart';
+class A<T> {
+  main() {
+    for (var item in getValues()) {
+    }
+  }
+}
+''');
+    await assertNoAssistAt('var item');
+  }
+
+  test_privateType_list() async {
+    // This is now failing because we're suggesting "List" rather than nothing.
+    // Is it really better to produce nothing?
+    addSource('/home/test/lib/my_lib.dart', '''
+library my_lib;
+class A {}
+class _B extends A {}
+List<_B> getValues() => [];
+''');
+    await resolveTestUnit('''
+import 'my_lib.dart';
+main() {
+  var v = getValues();
+}
+''');
+    await assertHasAssistAt('var ', '''
+import 'my_lib.dart';
+main() {
+  List v = getValues();
+}
+''');
+  }
+
+  test_privateType_sameLibrary() async {
+    await resolveTestUnit('''
+class _A {}
+_A getValue() => new _A();
+main() {
+  var v = getValue();
+}
+''');
+    await assertHasAssistAt('var ', '''
+class _A {}
+_A getValue() => new _A();
+main() {
+  _A v = getValue();
+}
+''');
+  }
+
+  test_privateType_variable() async {
+    addSource('/home/test/lib/my_lib.dart', '''
+library my_lib;
+class A {}
+class _B extends A {}
+_B getValue() => new _B();
+''');
+    await resolveTestUnit('''
+import 'my_lib.dart';
+main() {
+  var v = getValue();
+}
+''');
+    await assertNoAssistAt('var ');
+  }
+
+  test_topLevelField_int() async {
+    await resolveTestUnit('''
+var V = 0;
+''');
+    await assertHasAssistAt('var ', '''
+int V = 0;
+''');
+  }
+
+  test_topLevelField_multiple() async {
+    await resolveTestUnit('''
+var A = 1, V = '';
+''');
+    await assertNoAssistAt('var ');
+  }
+
+  test_topLevelField_noValue() async {
+    await resolveTestUnit('''
+var V;
+''');
+    await assertNoAssistAt('var ');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
new file mode 100644
index 0000000..1668ea4
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/assign_to_local_variable_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssignToLocalVariableTest);
+  });
+}
+
+@reflectiveTest
+class AssignToLocalVariableTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE;
+
+  test_alreadyAssignment() async {
+    await resolveTestUnit('''
+main() {
+  var vvv;
+  vvv = 42;
+}
+''');
+    await assertNoAssistAt('vvv =');
+  }
+
+  test_inClosure() async {
+    await resolveTestUnit(r'''
+main() {
+  print(() {
+    12345;
+  });
+}
+''');
+    await assertHasAssistAt('345', '''
+main() {
+  print(() {
+    var i = 12345;
+  });
+}
+''');
+  }
+
+  test_invocation() async {
+    await resolveTestUnit('''
+main() {
+  List<int> bytes;
+  readBytes();
+}
+List<int> readBytes() => <int>[];
+''');
+    await assertHasAssistAt('readBytes();', '''
+main() {
+  List<int> bytes;
+  var readBytes = readBytes();
+}
+List<int> readBytes() => <int>[];
+''');
+    assertLinkedGroup(
+        0,
+        ['readBytes = '],
+        expectedSuggestions(LinkedEditSuggestionKind.VARIABLE,
+            ['list', 'bytes2', 'readBytes']));
+  }
+
+  test_invocationArgument() async {
+    await resolveTestUnit(r'''
+main() {
+  f(12345);
+}
+void f(p) {}
+''');
+    await assertNoAssistAt('345');
+  }
+
+  test_throw() async {
+    await resolveTestUnit('''
+main() {
+  throw 42;
+}
+''');
+    await assertNoAssistAt('throw ');
+  }
+
+  test_void() async {
+    await resolveTestUnit('''
+main() {
+  f();
+}
+void f() {}
+''');
+    await assertNoAssistAt('f();');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
new file mode 100644
index 0000000..1ff780c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/assist_processor.dart
@@ -0,0 +1,186 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart'
+    hide AnalysisError;
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
+import 'package:test/test.dart';
+
+import '../../../../abstract_single_unit.dart';
+
+/// A base class defining support for writing assist processor tests.
+abstract class AssistProcessorTest extends AbstractSingleUnitTest {
+  int _offset;
+  int _length;
+
+  SourceChange _change;
+  String _resultCode;
+
+  /// Return the kind of assist expected by this class.
+  AssistKind get kind;
+
+  /// The workspace in which fixes contributor operates.
+  ChangeWorkspace get workspace {
+    return DartChangeWorkspace([session]);
+  }
+
+  void assertExitPosition({String before, String after}) {
+    Position exitPosition = _change.selection;
+    expect(exitPosition, isNotNull);
+    expect(exitPosition.file, testFile);
+    if (before != null) {
+      expect(exitPosition.offset, _resultCode.indexOf(before));
+    } else if (after != null) {
+      expect(exitPosition.offset, _resultCode.indexOf(after) + after.length);
+    } else {
+      fail("One of 'before' or 'after' expected.");
+    }
+  }
+
+  /// Asserts that there is an assist of the given [kind] at [_offset] which
+  /// produces the [expected] code when applied to [testCode]. The map of
+  /// [additionallyChangedFiles] can be used to test assists that can modify
+  /// more than the test file. The keys are expected to be the paths to the
+  /// files that are modified (other than the test file) and the values are
+  /// pairs of source code: the states of the code before and after the edits
+  /// have been applied.
+  Future<void> assertHasAssist(String expected,
+      {Map<String, List<String>> additionallyChangedFiles}) async {
+    _setSelection();
+    Assist assist = await _assertHasAssist();
+    _change = assist.change;
+    expect(_change.id, kind.id);
+    // apply to "file"
+    List<SourceFileEdit> fileEdits = _change.edits;
+    if (additionallyChangedFiles == null) {
+      expect(fileEdits, hasLength(1));
+      _resultCode = SourceEdit.applySequence(testCode, _change.edits[0].edits);
+      expect(_resultCode, expected);
+    } else {
+      expect(fileEdits, hasLength(additionallyChangedFiles.length + 1));
+      _resultCode = SourceEdit.applySequence(
+          testCode, _change.getFileEdit(testFile).edits);
+      expect(_resultCode, expected);
+      for (String filePath in additionallyChangedFiles.keys) {
+        List<String> pair = additionallyChangedFiles[filePath];
+        String resultCode = SourceEdit.applySequence(
+            pair[0], _change.getFileEdit(filePath).edits);
+        expect(resultCode, pair[1]);
+      }
+    }
+  }
+
+  /// Asserts that there is an [Assist] of the given [kind] at the offset of the
+  /// given [snippet] which produces the [expected] code when applied to [testCode].
+  Future<void> assertHasAssistAt(String snippet, String expected,
+      {int length = 0}) async {
+    _offset = findOffset(snippet);
+    _length = length;
+    Assist assist = await _assertHasAssist();
+    _change = assist.change;
+    expect(_change.id, kind.id);
+    // apply to "file"
+    List<SourceFileEdit> fileEdits = _change.edits;
+    expect(fileEdits, hasLength(1));
+    _resultCode = SourceEdit.applySequence(testCode, _change.edits[0].edits);
+    expect(_resultCode, expected);
+  }
+
+  void assertLinkedGroup(int groupIndex, List<String> expectedStrings,
+      [List<LinkedEditSuggestion> expectedSuggestions]) {
+    LinkedEditGroup group = _change.linkedEditGroups[groupIndex];
+    List<Position> expectedPositions = _findResultPositions(expectedStrings);
+    expect(group.positions, unorderedEquals(expectedPositions));
+    if (expectedSuggestions != null) {
+      expect(group.suggestions, unorderedEquals(expectedSuggestions));
+    }
+  }
+
+  /// Asserts that there is no [Assist] of the given [kind] at [_offset].
+  Future<void> assertNoAssist() async {
+    _setSelection();
+    List<Assist> assists = await _computeAssists();
+    for (Assist assist in assists) {
+      if (assist.kind == kind) {
+        fail('Unexpected assist $kind in\n${assists.join('\n')}');
+      }
+    }
+  }
+
+  /// Asserts that there is no [Assist] of the given [kind] at the offset of the
+  /// given [snippet].
+  Future<void> assertNoAssistAt(String snippet, {int length = 0}) async {
+    _offset = findOffset(snippet);
+    _length = length;
+    List<Assist> assists = await _computeAssists();
+    for (Assist assist in assists) {
+      if (assist.kind == kind) {
+        fail('Unexpected assist $kind in\n${assists.join('\n')}');
+      }
+    }
+  }
+
+  List<LinkedEditSuggestion> expectedSuggestions(
+      LinkedEditSuggestionKind kind, List<String> values) {
+    return values.map((value) {
+      return new LinkedEditSuggestion(value, kind);
+    }).toList();
+  }
+
+  /// Computes assists and verifies that there is an assist of the given kind.
+  Future<Assist> _assertHasAssist() async {
+    List<Assist> assists = await _computeAssists();
+    for (Assist assist in assists) {
+      if (assist.kind == kind) {
+        return assist;
+      }
+    }
+    fail('Expected to find assist $kind in\n${assists.join('\n')}');
+  }
+
+  Future<List<Assist>> _computeAssists() async {
+    var context = new DartAssistContextImpl(
+      workspace,
+      testAnalysisResult,
+      _offset,
+      _length,
+    );
+    var processor = new AssistProcessor(context);
+    return await processor.compute();
+  }
+
+  List<Position> _findResultPositions(List<String> searchStrings) {
+    List<Position> positions = <Position>[];
+    for (String search in searchStrings) {
+      int offset = _resultCode.indexOf(search);
+      positions.add(new Position(testFile, offset));
+    }
+    return positions;
+  }
+
+  void _setSelection() {
+    _offset = testCode.indexOf('/*caret*/');
+    if (_offset >= 0) {
+      _offset += '/*caret*/'.length;
+      _length = 0;
+    } else {
+      _offset = testCode.indexOf('// start\n');
+      if (_offset >= 0) {
+        _offset += '// start\n'.length;
+        _length = testCode.indexOf('// end') - _offset;
+      } else {
+        _offset = 0;
+        _length = 0;
+      }
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart
new file mode 100644
index 0000000..d2dd242
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_class_to_mixin_test.dart
@@ -0,0 +1,418 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertClassToMixinTest);
+  });
+}
+
+@reflectiveTest
+class ConvertClassToMixinTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_CLASS_TO_MIXIN;
+
+  test_abstract() async {
+    await resolveTestUnit('''
+abstract class A {}
+''');
+    await assertHasAssistAt('A', '''
+mixin A {}
+''');
+  }
+
+  test_extends_noSuper() async {
+    await resolveTestUnit('''
+class A {}
+class B extends A {}
+''');
+    await assertHasAssistAt('B', '''
+class A {}
+mixin B implements A {}
+''');
+  }
+
+  test_extends_super() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B extends A {
+  b() {
+    super.a();
+  }
+}
+''');
+    await assertHasAssistAt('B', '''
+class A {
+  a() {}
+}
+mixin B on A {
+  b() {
+    super.a();
+  }
+}
+''');
+  }
+
+  test_extends_superSuper() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B extends A {}
+class C extends B {
+  c() {
+    super.a();
+  }
+}
+''');
+    await assertHasAssistAt('C', '''
+class A {
+  a() {}
+}
+class B extends A {}
+mixin C on B {
+  c() {
+    super.a();
+  }
+}
+''');
+  }
+
+  test_extendsImplements_noSuper() async {
+    await resolveTestUnit('''
+class A {}
+class B {}
+class C extends A implements B {}
+''');
+    await assertHasAssistAt('C', '''
+class A {}
+class B {}
+mixin C implements A, B {}
+''');
+  }
+
+  test_extendsImplements_super_extends() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B {}
+class C extends A implements B {
+  c() {
+    super.a();
+  }
+}
+''');
+    await assertHasAssistAt('C', '''
+class A {
+  a() {}
+}
+class B {}
+mixin C on A implements B {
+  c() {
+    super.a();
+  }
+}
+''');
+  }
+
+  test_extendsWith_noSuper() async {
+    await resolveTestUnit('''
+class A {}
+class B {}
+class C extends A with B {}
+''');
+    await assertHasAssistAt('C', '''
+class A {}
+class B {}
+mixin C implements A, B {}
+''');
+  }
+
+  test_extendsWith_super_both() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C extends A with B {
+  c() {
+    super.a();
+    super.b();
+  }
+}
+''');
+    await assertHasAssistAt('C', '''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+mixin C on A, B {
+  c() {
+    super.a();
+    super.b();
+  }
+}
+''');
+  }
+
+  test_extendsWith_super_extends() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C extends A with B {
+  c() {
+    super.a();
+  }
+}
+''');
+    await assertHasAssistAt('C', '''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+mixin C on A implements B {
+  c() {
+    super.a();
+  }
+}
+''');
+  }
+
+  test_extendsWith_super_with() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C extends A with B {
+  c() {
+    super.b();
+  }
+}
+''');
+    await assertHasAssistAt('C', '''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+mixin C on B implements A {
+  c() {
+    super.b();
+  }
+}
+''');
+  }
+
+  test_extendsWithImplements_noSuper() async {
+    await resolveTestUnit('''
+class A {}
+class B {}
+class C {}
+class D extends A with B implements C {}
+''');
+    await assertHasAssistAt('D', '''
+class A {}
+class B {}
+class C {}
+mixin D implements A, B, C {}
+''');
+  }
+
+  test_extendsWithImplements_super_both() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C {}
+class D extends A with B implements C {
+  d() {
+    super.a();
+    super.b();
+  }
+}
+''');
+    await assertHasAssistAt('D', '''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C {}
+mixin D on A, B implements C {
+  d() {
+    super.a();
+    super.b();
+  }
+}
+''');
+  }
+
+  test_extendsWithImplements_super_extends() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C {}
+class D extends A with B implements C {
+  d() {
+    super.a();
+  }
+}
+''');
+    await assertHasAssistAt('D', '''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C {}
+mixin D on A implements B, C {
+  d() {
+    super.a();
+  }
+}
+''');
+  }
+
+  test_extendsWithImplements_super_with() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C {}
+class D extends A with B implements C {
+  d() {
+    super.b();
+  }
+}
+''');
+    await assertHasAssistAt('D', '''
+class A {
+  a() {}
+}
+class B {
+  b() {}
+}
+class C {}
+mixin D on B implements A, C {
+  d() {
+    super.b();
+  }
+}
+''');
+  }
+
+  test_implements() async {
+    await resolveTestUnit('''
+class A {}
+class B implements A {}
+''');
+    await assertHasAssistAt('B', '''
+class A {}
+mixin B implements A {}
+''');
+  }
+
+  test_noClauses_invalidSelection() async {
+    await resolveTestUnit('''
+class A {}
+''');
+    await assertNoAssistAt('{}');
+  }
+
+  test_noClauses_selectKeyword() async {
+    await resolveTestUnit('''
+class A {}
+''');
+    await assertHasAssistAt('class', '''
+mixin A {}
+''');
+  }
+
+  test_noClauses_selectName() async {
+    await resolveTestUnit('''
+class A {}
+''');
+    await assertHasAssistAt('A', '''
+mixin A {}
+''');
+  }
+
+  test_typeParameters() async {
+    await resolveTestUnit('''
+class A<T> {}
+''');
+    await assertHasAssistAt('A', '''
+mixin A<T> {}
+''');
+  }
+
+  test_with_noSuper() async {
+    await resolveTestUnit('''
+class A {}
+class B with A {}
+''');
+    await assertHasAssistAt('B', '''
+class A {}
+mixin B implements A {}
+''');
+  }
+
+  test_with_super() async {
+    await resolveTestUnit('''
+class A {
+  a() {}
+}
+class B with A {
+  b() {
+    super.a();
+  }
+}
+''');
+    await assertHasAssistAt('B', '''
+class A {
+  a() {}
+}
+mixin B on A {
+  b() {
+    super.a();
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart
new file mode 100644
index 0000000..895f645
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_block_test.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertDocumentationIntoBlockTest);
+  });
+}
+
+@reflectiveTest
+class ConvertDocumentationIntoBlockTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_DOCUMENTATION_INTO_BLOCK;
+
+  test_alreadyBlock() async {
+    await resolveTestUnit('''
+/**
+ * AAAAAAA
+ */
+class A {}
+''');
+    await assertNoAssistAt('AAA');
+  }
+
+  test_noSpaceBeforeText() async {
+    await resolveTestUnit('''
+class A {
+  /// AAAAA
+  ///BBBBB
+  ///
+  /// CCCCC
+  mmm() {}
+}
+''');
+    await assertHasAssistAt('AAAAA', '''
+class A {
+  /**
+   * AAAAA
+   *BBBBB
+   *
+   * CCCCC
+   */
+  mmm() {}
+}
+''');
+  }
+
+  test_notDocumentation() async {
+    await resolveTestUnit('''
+// AAAA
+class A {}
+''');
+    await assertNoAssistAt('AAA');
+  }
+
+  test_onReference() async {
+    await resolveTestUnit('''
+/// AAAAAAA [int] AAAAAAA
+class A {}
+''');
+    await assertHasAssistAt('nt]', '''
+/**
+ * AAAAAAA [int] AAAAAAA
+ */
+class A {}
+''');
+  }
+
+  test_onText() async {
+    await resolveTestUnit('''
+class A {
+  /// AAAAAAA [int] AAAAAAA
+  /// BBBBBBBB BBBB BBBB
+  /// CCC [A] CCCCCCCCCCC
+  mmm() {}
+}
+''');
+    await assertHasAssistAt('AAA [', '''
+class A {
+  /**
+   * AAAAAAA [int] AAAAAAA
+   * BBBBBBBB BBBB BBBB
+   * CCC [A] CCCCCCCCCCC
+   */
+  mmm() {}
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart
new file mode 100644
index 0000000..535bf55
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_documentation_into_line_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertDocumentationIntoLineTest);
+  });
+}
+
+@reflectiveTest
+class ConvertDocumentationIntoLineTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE;
+
+  test_alreadyLine() async {
+    await resolveTestUnit('''
+/// AAAAAAA
+class A {}
+''');
+    await assertNoAssistAt('AAA');
+  }
+
+  test_hasEmptyLine() async {
+    await resolveTestUnit('''
+class A {
+  /**
+   * AAAAAAA [int] AAAAAAA
+   *
+   * BBBBBBBB BBBB BBBB
+   */
+  mmm() {}
+}
+''');
+    await assertHasAssistAt('AAA [', '''
+class A {
+  /// AAAAAAA [int] AAAAAAA
+  ///
+  /// BBBBBBBB BBBB BBBB
+  mmm() {}
+}
+''');
+  }
+
+  test_notDocumentation() async {
+    await resolveTestUnit('''
+/* AAAA */
+class A {}
+''');
+    await assertNoAssistAt('AAA');
+  }
+
+  test_onReference() async {
+    await resolveTestUnit('''
+/**
+ * AAAAAAA [int] AAAAAAA
+ */
+class A {}
+''');
+    await assertHasAssistAt('nt]', '''
+/// AAAAAAA [int] AAAAAAA
+class A {}
+''');
+  }
+
+  test_onText() async {
+    await resolveTestUnit('''
+class A {
+  /**
+   * AAAAAAA [int] AAAAAAA
+   * BBBBBBBB BBBB BBBB
+   * CCC [A] CCCCCCCCCCC
+   */
+  mmm() {}
+}
+''');
+    await assertHasAssistAt('AAA [', '''
+class A {
+  /// AAAAAAA [int] AAAAAAA
+  /// BBBBBBBB BBBB BBBB
+  /// CCC [A] CCCCCCCCCCC
+  mmm() {}
+}
+''');
+  }
+
+  test_onText_hasFirstLine() async {
+    await resolveTestUnit('''
+class A {
+  /** AAAAAAA [int] AAAAAAA
+   * BBBBBBBB BBBB BBBB
+   * CCC [A] CCCCCCCCCCC
+   */
+  mmm() {}
+}
+''');
+    await assertHasAssistAt('AAA [', '''
+class A {
+  /// AAAAAAA [int] AAAAAAA
+  /// BBBBBBBB BBBB BBBB
+  /// CCC [A] CCCCCCCCCCC
+  mmm() {}
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
new file mode 100644
index 0000000..170a3c4
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_async_body_test.dart
@@ -0,0 +1,149 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoAsyncBodyTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoAsyncBodyTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_ASYNC_BODY;
+
+  test_async() async {
+    await resolveTestUnit('''
+import 'dart:async';
+Future<String> f() async => '';
+''');
+    await assertNoAssistAt('=>');
+  }
+
+  test_asyncStar() async {
+    await resolveTestUnit('''
+import 'dart:async';
+Stream<String> f() async* {}
+''');
+    await assertNoAssistAt('{}');
+  }
+
+  test_closure() async {
+    await resolveTestUnit('''
+main() {
+  f(() => 123);
+}
+f(g) {}
+''');
+    await assertHasAssistAt('=>', '''
+main() {
+  f(() async => 123);
+}
+f(g) {}
+''');
+  }
+
+  test_constructor() async {
+    await resolveTestUnit('''
+class C {
+  C() {}
+}
+''');
+    await assertNoAssistAt('{}');
+  }
+
+  test_function() async {
+    await resolveTestUnit('''
+String f() => '';
+''');
+    await assertHasAssistAt('=>', '''
+Future<String> f() async => '';
+''');
+  }
+
+  test_getter_expression_noSpace() async {
+    await resolveTestUnit('''
+class C {
+  int get g=>0;
+}
+''');
+    await assertHasAssistAt('get g', '''
+class C {
+  Future<int> get g async =>0;
+}
+''');
+  }
+
+  test_inBody_block() async {
+    await resolveTestUnit('''
+class C {
+  void foo() {
+    print(42);
+  }
+}
+''');
+    await assertNoAssistAt('print');
+  }
+
+  test_inBody_expression() async {
+    await resolveTestUnit('''
+class C {
+  void foo() => print(42);
+}
+''');
+    await assertNoAssistAt('print');
+  }
+
+  test_method() async {
+    await resolveTestUnit('''
+class C {
+  int m() { return 0; }
+}
+''');
+    await assertHasAssistAt('{ return', '''
+class C {
+  Future<int> m() async { return 0; }
+}
+''');
+  }
+
+  test_method_abstract() async {
+    await resolveTestUnit('''
+abstract class C {
+  int m();
+}
+''');
+    await assertHasAssistAt('m()', '''
+abstract class C {
+  Future<int> m();
+}
+''');
+  }
+
+  test_method_noReturnType() async {
+    await resolveTestUnit('''
+class C {
+  m() { return 0; }
+}
+''');
+    await assertHasAssistAt('{ return', '''
+class C {
+  m() async { return 0; }
+}
+''');
+  }
+
+  test_syncStar() async {
+    await resolveTestUnit('''
+Iterable<String> f() sync* {}
+''');
+    await assertNoAssistAt('{}');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
new file mode 100644
index 0000000..4d3fa9c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_block_body_test.dart
@@ -0,0 +1,162 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoBlockBodyTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoBlockBodyTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_BLOCK_BODY;
+
+  test_async() async {
+    await resolveTestUnit('''
+class A {
+  mmm() async => 123;
+}
+''');
+    await assertHasAssistAt('mmm()', '''
+class A {
+  mmm() async {
+    return 123;
+  }
+}
+''');
+  }
+
+  test_closure() async {
+    await resolveTestUnit('''
+setup(x) {}
+main() {
+  setup(() => 42);
+}
+''');
+    await assertHasAssistAt('() => 42', '''
+setup(x) {}
+main() {
+  setup(() {
+    return 42;
+  });
+}
+''');
+    assertExitPosition(after: '42;');
+  }
+
+  test_closure_voidExpression() async {
+    await resolveTestUnit('''
+setup(x) {}
+main() {
+  setup(() => print('done'));
+}
+''');
+    await assertHasAssistAt('() => print', '''
+setup(x) {}
+main() {
+  setup(() {
+    print('done');
+  });
+}
+''');
+    assertExitPosition(after: "');");
+  }
+
+  test_constructor() async {
+    await resolveTestUnit('''
+class A {
+  factory A() => null;
+}
+''');
+    await assertHasAssistAt('A()', '''
+class A {
+  factory A() {
+    return null;
+  }
+}
+''');
+  }
+
+  test_inExpression() async {
+    await resolveTestUnit('''
+main() => 123;
+''');
+    await assertNoAssistAt('123;');
+  }
+
+  test_method() async {
+    await resolveTestUnit('''
+class A {
+  mmm() => 123;
+}
+''');
+    await assertHasAssistAt('mmm()', '''
+class A {
+  mmm() {
+    return 123;
+  }
+}
+''');
+  }
+
+  test_noEnclosingFunction() async {
+    await resolveTestUnit('''
+var v = 123;
+''');
+    await assertNoAssistAt('v =');
+  }
+
+  test_notExpressionBlock() async {
+    await resolveTestUnit('''
+fff() {
+  return 123;
+}
+''');
+    await assertNoAssistAt('fff() {');
+  }
+
+  test_onArrow() async {
+    await resolveTestUnit('''
+fff() => 123;
+''');
+    await assertHasAssistAt('=>', '''
+fff() {
+  return 123;
+}
+''');
+  }
+
+  test_onName() async {
+    await resolveTestUnit('''
+fff() => 123;
+''');
+    await assertHasAssistAt('fff()', '''
+fff() {
+  return 123;
+}
+''');
+  }
+
+  test_throw() async {
+    await resolveTestUnit('''
+class A {
+  mmm() => throw 'error';
+}
+''');
+    await assertHasAssistAt('mmm()', '''
+class A {
+  mmm() {
+    throw 'error';
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
new file mode 100644
index 0000000..cb7e2e2
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_expression_body_test.dart
@@ -0,0 +1,184 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoExpressionBodyTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoExpressionBodyTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_EXPRESSION_BODY;
+
+  test_already() async {
+    await resolveTestUnit('''
+fff() => 42;
+''');
+    await assertNoAssistAt('fff()');
+  }
+
+  test_async() async {
+    await resolveTestUnit('''
+class A {
+  mmm() async {
+    return 42;
+  }
+}
+''');
+    await assertHasAssistAt('mmm', '''
+class A {
+  mmm() async => 42;
+}
+''');
+  }
+
+  test_closure() async {
+    await resolveTestUnit('''
+setup(x) {}
+main() {
+  setup(() {
+    return 42;
+  });
+}
+''');
+    await assertHasAssistAt('return', '''
+setup(x) {}
+main() {
+  setup(() => 42);
+}
+''');
+  }
+
+  test_closure_voidExpression() async {
+    await resolveTestUnit('''
+setup(x) {}
+main() {
+  setup((_) {
+    print('test');
+  });
+}
+''');
+    await assertHasAssistAt('(_) {', '''
+setup(x) {}
+main() {
+  setup((_) => print('test'));
+}
+''');
+  }
+
+  test_constructor() async {
+    await resolveTestUnit('''
+class A {
+  factory A() {
+    return null;
+  }
+}
+''');
+    await assertHasAssistAt('A()', '''
+class A {
+  factory A() => null;
+}
+''');
+  }
+
+  test_function_onBlock() async {
+    await resolveTestUnit('''
+fff() {
+  return 42;
+}
+''');
+    await assertHasAssistAt('{', '''
+fff() => 42;
+''');
+  }
+
+  test_function_onName() async {
+    await resolveTestUnit('''
+fff() {
+  return 42;
+}
+''');
+    await assertHasAssistAt('ff()', '''
+fff() => 42;
+''');
+  }
+
+  test_inExpression() async {
+    await resolveTestUnit('''
+main() {
+  return 42;
+}
+''');
+    await assertNoAssistAt('42;');
+  }
+
+  test_method_onBlock() async {
+    await resolveTestUnit('''
+class A {
+  m() { // marker
+    return 42;
+  }
+}
+''');
+    await assertHasAssistAt('{ // marker', '''
+class A {
+  m() => 42;
+}
+''');
+  }
+
+  test_moreThanOneStatement() async {
+    await resolveTestUnit('''
+fff() {
+  var v = 42;
+  return v;
+}
+''');
+    await assertNoAssistAt('fff()');
+  }
+
+  test_noEnclosingFunction() async {
+    await resolveTestUnit('''
+var V = 42;
+''');
+    await assertNoAssistAt('V = ');
+  }
+
+  test_noReturn() async {
+    await resolveTestUnit('''
+fff() {
+  var v = 42;
+}
+''');
+    await assertNoAssistAt('fff()');
+  }
+
+  test_noReturnValue() async {
+    await resolveTestUnit('''
+fff() {
+  return;
+}
+''');
+    await assertNoAssistAt('fff()');
+  }
+
+  test_topFunction_onReturnStatement() async {
+    await resolveTestUnit('''
+fff() {
+  return 42;
+}
+''');
+    await assertHasAssistAt('return', '''
+fff() => 42;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
new file mode 100644
index 0000000..4fa51fa
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_final_field_test.dart
@@ -0,0 +1,194 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoFinalFieldTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoFinalFieldTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_FINAL_FIELD;
+
+  test_blockBody_onlyReturnStatement() async {
+    await resolveTestUnit('''
+class A {
+  int get foo {
+    return 1 + 2;
+  }
+}
+''');
+    await assertHasAssistAt('get foo', '''
+class A {
+  final int foo = 1 + 2;
+}
+''');
+  }
+
+  test_hasOverride() async {
+    await resolveTestUnit('''
+const myAnnotation = const Object();
+class A {
+  @myAnnotation
+  int get foo => 42;
+}
+''');
+    await assertHasAssistAt('get foo', '''
+const myAnnotation = const Object();
+class A {
+  @myAnnotation
+  final int foo = 42;
+}
+''');
+  }
+
+  test_hasSetter_inSuper() async {
+    await resolveTestUnit('''
+class A {
+  void set foo(_) {}
+}
+class B extends A {
+  int get foo => null;
+}
+''');
+    await assertHasAssistAt('get foo', '''
+class A {
+  void set foo(_) {}
+}
+class B extends A {
+  final int foo;
+}
+''');
+  }
+
+  test_hasSetter_inThisClass() async {
+    await resolveTestUnit('''
+class A {
+  int get foo => null;
+  void set foo(_) {}
+}
+''');
+    await assertNoAssistAt('get foo');
+  }
+
+  test_noReturnType() async {
+    await resolveTestUnit('''
+class A {
+  get foo => 42;
+}
+''');
+    await assertHasAssistAt('get foo', '''
+class A {
+  final foo = 42;
+}
+''');
+  }
+
+  test_noReturnType_static() async {
+    await resolveTestUnit('''
+class A {
+  static get foo => 42;
+}
+''');
+    await assertHasAssistAt('get foo', '''
+class A {
+  static final foo = 42;
+}
+''');
+  }
+
+  test_notExpressionBody() async {
+    await resolveTestUnit('''
+class A {
+  int get foo {
+    int v = 1 + 2;
+    return v + 3;
+  }
+}
+''');
+    await assertNoAssistAt('get foo');
+  }
+
+  test_notGetter() async {
+    await resolveTestUnit('''
+class A {
+  int foo() => 42;
+}
+''');
+    await assertNoAssistAt('foo');
+  }
+
+  test_notNull() async {
+    await resolveTestUnit('''
+class A {
+  int get foo => 1 + 2;
+}
+''');
+    await assertHasAssistAt('get foo', '''
+class A {
+  final int foo = 1 + 2;
+}
+''');
+  }
+
+  test_null() async {
+    await resolveTestUnit('''
+class A {
+  int get foo => null;
+}
+''');
+    await assertHasAssistAt('get foo', '''
+class A {
+  final int foo;
+}
+''');
+  }
+
+  test_onName() async {
+    await resolveTestUnit('''
+class A {
+  int get foo => 42;
+}
+''');
+    await assertHasAssistAt('foo', '''
+class A {
+  final int foo = 42;
+}
+''');
+  }
+
+  test_onReturnType_parameterized() async {
+    await resolveTestUnit('''
+class A {
+  List<int> get foo => null;
+}
+''');
+    await assertHasAssistAt('nt> get', '''
+class A {
+  final List<int> foo;
+}
+''');
+  }
+
+  test_onReturnType_simple() async {
+    await resolveTestUnit('''
+class A {
+  int get foo => 42;
+}
+''');
+    await assertHasAssistAt('int get', '''
+class A {
+  final int foo = 42;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart
new file mode 100644
index 0000000..5816d3a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_for_index_test.dart
@@ -0,0 +1,168 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoForIndexTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoForIndexTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_FOR_INDEX;
+
+  test_bodyNotBlock() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (String item in items) print(item);
+}
+''');
+    await assertNoAssistAt('for (String');
+  }
+
+  test_doesNotDeclareVariable() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  String item;
+  for (item in items) {
+    print(item);
+  }
+}
+''');
+    await assertNoAssistAt('for (item');
+  }
+
+  test_iterableIsNotVariable() async {
+    await resolveTestUnit('''
+main() {
+  for (String item in ['a', 'b', 'c']) {
+    print(item);
+  }
+}
+''');
+    await assertNoAssistAt('for (String');
+  }
+
+  test_iterableNotList() async {
+    await resolveTestUnit('''
+main(Iterable<String> items) {
+  for (String item in items) {
+    print(item);
+  }
+}
+''');
+    await assertNoAssistAt('for (String');
+  }
+
+  test_onDeclaredIdentifier_name() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (String item in items) {
+    print(item);
+  }
+}
+''');
+    await assertHasAssistAt('item in', '''
+main(List<String> items) {
+  for (int i = 0; i < items.length; i++) {
+    String item = items[i];
+    print(item);
+  }
+}
+''');
+  }
+
+  test_onDeclaredIdentifier_type() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (String item in items) {
+    print(item);
+  }
+}
+''');
+    await assertHasAssistAt('tring item', '''
+main(List<String> items) {
+  for (int i = 0; i < items.length; i++) {
+    String item = items[i];
+    print(item);
+  }
+}
+''');
+  }
+
+  test_onFor() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (String item in items) {
+    print(item);
+  }
+}
+''');
+    await assertHasAssistAt('for (String', '''
+main(List<String> items) {
+  for (int i = 0; i < items.length; i++) {
+    String item = items[i];
+    print(item);
+  }
+}
+''');
+  }
+
+  test_usesI() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (String item in items) {
+    int i = 0;
+  }
+}
+''');
+    await assertHasAssistAt('for (String', '''
+main(List<String> items) {
+  for (int j = 0; j < items.length; j++) {
+    String item = items[j];
+    int i = 0;
+  }
+}
+''');
+  }
+
+  test_usesIJ() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (String item in items) {
+    print(item);
+    int i = 0, j = 1;
+  }
+}
+''');
+    await assertHasAssistAt('for (String', '''
+main(List<String> items) {
+  for (int k = 0; k < items.length; k++) {
+    String item = items[k];
+    print(item);
+    int i = 0, j = 1;
+  }
+}
+''');
+  }
+
+  test_usesIJK() async {
+    await resolveTestUnit('''
+main(List<String> items) {
+  for (String item in items) {
+    print(item);
+    int i, j, k;
+  }
+}
+''');
+    await assertNoAssistAt('for (String');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart
new file mode 100644
index 0000000..e9b034e
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_generic_function_syntax_test.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoGenericFunctionSyntaxTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoGenericFunctionSyntaxTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_GENERIC_FUNCTION_SYNTAX;
+
+  test_functionTypeAlias_insideParameterList() async {
+    await resolveTestUnit('''
+typedef String F(int x, int y);
+''');
+    await assertNoAssistAt('x,');
+  }
+
+  test_functionTypeAlias_noParameterTypes() async {
+    await resolveTestUnit('''
+typedef String F(x);
+''');
+    await assertNoAssistAt('def');
+  }
+
+  test_functionTypeAlias_noReturnType_noTypeParameters() async {
+    await resolveTestUnit('''
+typedef String F(int x);
+''');
+    await assertHasAssistAt('def', '''
+typedef F = String Function(int x);
+''');
+  }
+
+  test_functionTypeAlias_noReturnType_typeParameters() async {
+    await resolveTestUnit('''
+typedef F<P, R>(P x);
+''');
+    await assertHasAssistAt('def', '''
+typedef F<P, R> = Function(P x);
+''');
+  }
+
+  test_functionTypeAlias_returnType_noTypeParameters() async {
+    await resolveTestUnit('''
+typedef String F(int x);
+''');
+    await assertHasAssistAt('def', '''
+typedef F = String Function(int x);
+''');
+  }
+
+  test_functionTypeAlias_returnType_typeParameters() async {
+    await resolveTestUnit('''
+typedef R F<P, R>(P x);
+''');
+    await assertHasAssistAt('def', '''
+typedef F<P, R> = R Function(P x);
+''');
+  }
+
+  test_functionTypedParameter_insideParameterList() async {
+    await resolveTestUnit('''
+g(String f(int x, int y)) {}
+''');
+    await assertNoAssistAt('x,');
+  }
+
+  test_functionTypedParameter_noParameterTypes() async {
+    await resolveTestUnit('''
+g(String f(x)) {}
+''');
+    await assertNoAssistAt('f(');
+  }
+
+  test_functionTypedParameter_noReturnType_noTypeParameters() async {
+    await resolveTestUnit('''
+g(f(int x)) {}
+''');
+    await assertHasAssistAt('f(', '''
+g(Function(int x) f) {}
+''');
+  }
+
+  test_functionTypedParameter_returnType() async {
+    await resolveTestUnit('''
+g(String f(int x)) {}
+''');
+    await assertHasAssistAt('f(', '''
+g(String Function(int x) f) {}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart
new file mode 100644
index 0000000..f3348c2
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_getter_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoGetterTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoGetterTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_GETTER;
+
+  test_noInitializer() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+class A {
+  final int foo;
+}
+''');
+    await assertNoAssistAt('foo');
+  }
+
+  test_notFinal() async {
+    await resolveTestUnit('''
+class A {
+  int foo = 1;
+}
+''');
+    await assertNoAssistAt('foo');
+  }
+
+  test_notSingleField() async {
+    await resolveTestUnit('''
+class A {
+  final int foo = 1, bar = 2;
+}
+''');
+    await assertNoAssistAt('foo');
+  }
+
+  test_noType() async {
+    await resolveTestUnit('''
+class A {
+  final foo = 42;
+}
+''');
+    await assertHasAssistAt('foo =', '''
+class A {
+  get foo => 42;
+}
+''');
+  }
+
+  test_type() async {
+    await resolveTestUnit('''
+const myAnnotation = const Object();
+class A {
+  @myAnnotation
+  final int foo = 1 + 2;
+}
+''');
+    await assertHasAssistAt('foo =', '''
+const myAnnotation = const Object();
+class A {
+  @myAnnotation
+  int get foo => 1 + 2;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart
new file mode 100644
index 0000000..cd522a7
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_empty_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoIsNotEmptyTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoIsNotEmptyTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY;
+
+  test_noBang() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+main(String str) {
+  ~str.isEmpty;
+}
+''');
+    await assertNoAssistAt('isEmpty;');
+  }
+
+  test_noIsNotEmpty() async {
+    await resolveTestUnit('''
+class A {
+  bool get isEmpty => false;
+}
+main(A a) {
+  !a.isEmpty;
+}
+''');
+    await assertNoAssistAt('isEmpty;');
+  }
+
+  test_notInPrefixExpression() async {
+    await resolveTestUnit('''
+main(String str) {
+  str.isEmpty;
+}
+''');
+    await assertNoAssistAt('isEmpty;');
+  }
+
+  test_notIsEmpty() async {
+    await resolveTestUnit('''
+main(int p) {
+  !p.isEven;
+}
+''');
+    await assertNoAssistAt('isEven;');
+  }
+
+  test_on_isEmpty() async {
+    await resolveTestUnit('''
+main(String str) {
+  !str.isEmpty;
+}
+''');
+    await assertHasAssistAt('isEmpty', '''
+main(String str) {
+  str.isNotEmpty;
+}
+''');
+  }
+
+  test_on_str() async {
+    await resolveTestUnit('''
+main(String str) {
+  !str.isEmpty;
+}
+''');
+    await assertHasAssistAt('str.', '''
+main(String str) {
+  str.isNotEmpty;
+}
+''');
+  }
+
+  test_propertyAccess() async {
+    await resolveTestUnit('''
+main(String str) {
+  !'text'.isEmpty;
+}
+''');
+    await assertHasAssistAt('isEmpty', '''
+main(String str) {
+  'text'.isNotEmpty;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart
new file mode 100644
index 0000000..f7e1ae1
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_into_is_not_test.dart
@@ -0,0 +1,195 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertIntoIsNotTest);
+  });
+}
+
+@reflectiveTest
+class ConvertIntoIsNotTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_INTO_IS_NOT;
+
+  test_childOfIs_left() async {
+    await resolveTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    await assertHasAssistAt('p is', '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  test_childOfIs_right() async {
+    await resolveTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    await assertHasAssistAt('String)', '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  test_is() async {
+    await resolveTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    await assertHasAssistAt('is String', '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  test_is_alreadyIsNot() async {
+    await resolveTestUnit('''
+main(p) {
+  p is! String;
+}
+''');
+    await assertNoAssistAt('is!');
+  }
+
+  test_is_higherPrecedencePrefix() async {
+    await resolveTestUnit('''
+main(p) {
+  !!(p is String);
+}
+''');
+    await assertHasAssistAt('is String', '''
+main(p) {
+  !(p is! String);
+}
+''');
+  }
+
+  test_is_noEnclosingParenthesis() async {
+    await resolveTestUnit('''
+main(p) {
+  p is String;
+}
+''');
+    await assertNoAssistAt('is String');
+  }
+
+  test_is_noPrefix() async {
+    await resolveTestUnit('''
+main(p) {
+  (p is String);
+}
+''');
+    await assertNoAssistAt('is String');
+  }
+
+  test_is_not_higherPrecedencePrefix() async {
+    await resolveTestUnit('''
+main(p) {
+  !!(p is String);
+}
+''');
+    await assertHasAssistAt('!(p', '''
+main(p) {
+  !(p is! String);
+}
+''');
+  }
+
+  test_is_notIsExpression() async {
+    await resolveTestUnit('''
+main(p) {
+  123 + 456;
+}
+''');
+    await assertNoAssistAt('123 +');
+  }
+
+  test_is_notTheNotOperator() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+main(p) {
+  ++(p is String);
+}
+''');
+    await assertNoAssistAt('is String');
+  }
+
+  test_not() async {
+    await resolveTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    await assertHasAssistAt('!(p', '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+
+  test_not_alreadyIsNot() async {
+    await resolveTestUnit('''
+main(p) {
+  !(p is! String);
+}
+''');
+    await assertNoAssistAt('!(p');
+  }
+
+  test_not_noEnclosingParenthesis() async {
+    await resolveTestUnit('''
+main(p) {
+  !p;
+}
+''');
+    await assertNoAssistAt('!p');
+  }
+
+  test_not_notIsExpression() async {
+    await resolveTestUnit('''
+main(p) {
+  !(p == null);
+}
+''');
+    await assertNoAssistAt('!(p');
+  }
+
+  test_not_notTheNotOperator() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+main(p) {
+  ++(p is String);
+}
+''');
+    await assertNoAssistAt('++(');
+  }
+
+  test_parentheses() async {
+    await resolveTestUnit('''
+main(p) {
+  !(p is String);
+}
+''');
+    await assertHasAssistAt('(p is', '''
+main(p) {
+  p is! String;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
new file mode 100644
index 0000000..0dc747a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_part_of_to_uri_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertPartOfToUriTest);
+  });
+}
+
+@reflectiveTest
+class ConvertPartOfToUriTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_PART_OF_TO_URI;
+
+  test_nonSibling() async {
+    addSource('/home/test/lib/foo.dart', '''
+library foo;
+part 'src/bar.dart';
+''');
+    testFile = convertPath('/home/test/lib/src/bar.dart');
+    await resolveTestUnit('''
+part of foo;
+''');
+    await assertHasAssistAt('foo', '''
+part of '../foo.dart';
+''');
+  }
+
+  test_sibling() async {
+    addSource('/home/test/lib/foo.dart', '''
+library foo;
+part 'bar.dart';
+''');
+    testFile = convertPath('/home/test/lib/bar.dart');
+    await resolveTestUnit('''
+part of foo;
+''');
+    await assertHasAssistAt('foo', '''
+part of 'foo.dart';
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
new file mode 100644
index 0000000..5711b07
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_double_quoted_string_test.dart
@@ -0,0 +1,143 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToDoubleQuotedStringTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToDoubleQuotedStringTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_TO_DOUBLE_QUOTED_STRING;
+
+  test_one_embeddedTarget() async {
+    await resolveTestUnit('''
+main() {
+  print('a"b"c');
+}
+''');
+    await assertNoAssistAt("'a");
+  }
+
+  test_one_enclosingTarget() async {
+    await resolveTestUnit('''
+main() {
+  print("abc");
+}
+''');
+    await assertNoAssistAt('"ab');
+  }
+
+  test_one_interpolation() async {
+    await resolveTestUnit(r'''
+main() {
+  var b = 'b';
+  var c = 'c';
+  print('a $b-${c} d');
+}
+''');
+    await assertHasAssistAt(r"'a $b", r'''
+main() {
+  var b = 'b';
+  var c = 'c';
+  print("a $b-${c} d");
+}
+''');
+  }
+
+  test_one_raw() async {
+    await resolveTestUnit('''
+main() {
+  print(r'abc');
+}
+''');
+    await assertHasAssistAt("'ab", '''
+main() {
+  print(r"abc");
+}
+''');
+  }
+
+  test_one_simple() async {
+    await resolveTestUnit('''
+main() {
+  print('abc');
+}
+''');
+    await assertHasAssistAt("'ab", '''
+main() {
+  print("abc");
+}
+''');
+  }
+
+  test_three_embeddedTarget() async {
+    await resolveTestUnit("""
+main() {
+  print('''a""\"c''');
+}
+""");
+    await assertNoAssistAt("'a");
+  }
+
+  test_three_enclosingTarget() async {
+    await resolveTestUnit('''
+main() {
+  print("""abc""");
+}
+''');
+    await assertNoAssistAt('"ab');
+  }
+
+  test_three_interpolation() async {
+    await resolveTestUnit(r"""
+main() {
+  var b = 'b';
+  var c = 'c';
+  print('''a $b-${c} d''');
+}
+""");
+    await assertHasAssistAt(r"'a $b", r'''
+main() {
+  var b = 'b';
+  var c = 'c';
+  print("""a $b-${c} d""");
+}
+''');
+  }
+
+  test_three_raw() async {
+    await resolveTestUnit("""
+main() {
+  print(r'''abc''');
+}
+""");
+    await assertHasAssistAt("'ab", '''
+main() {
+  print(r"""abc""");
+}
+''');
+  }
+
+  test_three_simple() async {
+    await resolveTestUnit("""
+main() {
+  print('''abc''');
+}
+""");
+    await assertHasAssistAt("'ab", '''
+main() {
+  print("""abc""");
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart
new file mode 100644
index 0000000..2cf9958
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_field_parameter_test.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToFieldParameterTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToFieldParameterTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_TO_FIELD_PARAMETER;
+
+  test_additionalUse() async {
+    await resolveTestUnit('''
+class A {
+  int aaa2;
+  int bbb2;
+  A(int aaa) : aaa2 = aaa, bbb2 = aaa;
+}
+''');
+    await assertNoAssistAt('aaa)');
+  }
+
+  test_firstInitializer() async {
+    await resolveTestUnit('''
+class A {
+  int aaa2;
+  int bbb2;
+  A(int aaa, int bbb) : aaa2 = aaa, bbb2 = bbb;
+}
+''');
+    await assertHasAssistAt('aaa, ', '''
+class A {
+  int aaa2;
+  int bbb2;
+  A(this.aaa2, int bbb) : bbb2 = bbb;
+}
+''');
+  }
+
+  test_notPureAssignment() async {
+    await resolveTestUnit('''
+class A {
+  int aaa2;
+  A(int aaa) : aaa2 = aaa * 2;
+}
+''');
+    await assertNoAssistAt('aaa)');
+  }
+
+  test_onParameterName_inInitializer() async {
+    await resolveTestUnit('''
+class A {
+  int test2;
+  A(int test) : test2 = test {
+  }
+}
+''');
+    await assertHasAssistAt('test {', '''
+class A {
+  int test2;
+  A(this.test2) {
+  }
+}
+''');
+  }
+
+  test_onParameterName_inParameters() async {
+    await resolveTestUnit('''
+class A {
+  int test;
+  A(int test) : test = test {
+  }
+}
+''');
+    await assertHasAssistAt('test)', '''
+class A {
+  int test;
+  A(this.test) {
+  }
+}
+''');
+  }
+
+  test_secondInitializer() async {
+    await resolveTestUnit('''
+class A {
+  int aaa2;
+  int bbb2;
+  A(int aaa, int bbb) : aaa2 = aaa, bbb2 = bbb;
+}
+''');
+    await assertHasAssistAt('bbb)', '''
+class A {
+  int aaa2;
+  int bbb2;
+  A(int aaa, this.bbb2) : aaa2 = aaa;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart
new file mode 100644
index 0000000..d76730c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_int_literal_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToIntLiteralTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToIntLiteralTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_TO_INT_LITERAL;
+
+  test_decimal() async {
+    await resolveTestUnit('''
+const double myDouble = /*caret*/42.0;
+''');
+    await assertHasAssist('''
+const double myDouble = /*caret*/42;
+''');
+  }
+
+  test_notDouble() async {
+    await resolveTestUnit('''
+const double myDouble = /*caret*/42;
+''');
+    await assertNoAssist();
+  }
+
+  test_scientific() async {
+    await resolveTestUnit('''
+const double myDouble = /*caret*/4.2e1;
+''');
+    await assertHasAssist('''
+const double myDouble = /*caret*/42;
+''');
+  }
+
+  test_tooBig() async {
+    await resolveTestUnit('''
+const double myDouble = /*caret*/4.2e99999;
+''');
+    await assertNoAssist();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart
new file mode 100644
index 0000000..f5ddc23
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_normal_parameter_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToNormalParameterTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToNormalParameterTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_TO_NORMAL_PARAMETER;
+
+  test_dynamic() async {
+    await resolveTestUnit('''
+class A {
+  var test;
+  A(this.test) {
+  }
+}
+''');
+    await assertHasAssistAt('test)', '''
+class A {
+  var test;
+  A(test) : test = test {
+  }
+}
+''');
+  }
+
+  test_firstInitializer() async {
+    await resolveTestUnit('''
+class A {
+  int test;
+  A(this.test) {
+  }
+}
+''');
+    await assertHasAssistAt('test)', '''
+class A {
+  int test;
+  A(int test) : test = test {
+  }
+}
+''');
+  }
+
+  test_secondInitializer() async {
+    await resolveTestUnit('''
+class A {
+  double aaa;
+  int bbb;
+  A(this.bbb) : aaa = 1.0;
+}
+''');
+    await assertHasAssistAt('bbb)', '''
+class A {
+  double aaa;
+  int bbb;
+  A(int bbb) : aaa = 1.0, bbb = bbb;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
new file mode 100644
index 0000000..161f62c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_single_quoted_string_test.dart
@@ -0,0 +1,143 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToSingleQuotedStringTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToSingleQuotedStringTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.CONVERT_TO_SINGLE_QUOTED_STRING;
+
+  test_one_embeddedTarget() async {
+    await resolveTestUnit('''
+main() {
+  print("a'b'c");
+}
+''');
+    await assertNoAssistAt('"a');
+  }
+
+  test_one_enclosingTarget() async {
+    await resolveTestUnit('''
+main() {
+  print('abc');
+}
+''');
+    await assertNoAssistAt("'ab");
+  }
+
+  test_one_interpolation() async {
+    await resolveTestUnit(r'''
+main() {
+  var b = 'b';
+  var c = 'c';
+  print("a $b-${c} d");
+}
+''');
+    await assertHasAssistAt(r'"a $b', r'''
+main() {
+  var b = 'b';
+  var c = 'c';
+  print('a $b-${c} d');
+}
+''');
+  }
+
+  test_one_raw() async {
+    await resolveTestUnit('''
+main() {
+  print(r"abc");
+}
+''');
+    await assertHasAssistAt('"ab', '''
+main() {
+  print(r'abc');
+}
+''');
+  }
+
+  test_one_simple() async {
+    await resolveTestUnit('''
+main() {
+  print("abc");
+}
+''');
+    await assertHasAssistAt('"ab', '''
+main() {
+  print('abc');
+}
+''');
+  }
+
+  test_three_embeddedTarget() async {
+    await resolveTestUnit('''
+main() {
+  print("""a''\'bc""");
+}
+''');
+    await assertNoAssistAt('"a');
+  }
+
+  test_three_enclosingTarget() async {
+    await resolveTestUnit("""
+main() {
+  print('''abc''');
+}
+""");
+    await assertNoAssistAt("'ab");
+  }
+
+  test_three_interpolation() async {
+    await resolveTestUnit(r'''
+main() {
+  var b = 'b';
+  var c = 'c';
+  print("""a $b-${c} d""");
+}
+''');
+    await assertHasAssistAt(r'"a $b', r"""
+main() {
+  var b = 'b';
+  var c = 'c';
+  print('''a $b-${c} d''');
+}
+""");
+  }
+
+  test_three_raw() async {
+    await resolveTestUnit('''
+main() {
+  print(r"""abc""");
+}
+''');
+    await assertHasAssistAt('"ab', """
+main() {
+  print(r'''abc''');
+}
+""");
+  }
+
+  test_three_simple() async {
+    await resolveTestUnit('''
+main() {
+  print("""abc""");
+}
+''');
+    await assertHasAssistAt('"ab', """
+main() {
+  print('''abc''');
+}
+""");
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart b/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
new file mode 100644
index 0000000..98e3baf
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/encapsulate_field_test.dart
@@ -0,0 +1,164 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(EncapsulateFieldTest);
+  });
+}
+
+@reflectiveTest
+class EncapsulateFieldTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.ENCAPSULATE_FIELD;
+
+  test_alreadyPrivate() async {
+    await resolveTestUnit('''
+class A {
+  int _test = 42;
+}
+main(A a) {
+  print(a._test);
+}
+''');
+    await assertNoAssistAt('_test =');
+  }
+
+  test_documentation() async {
+    await resolveTestUnit('''
+class A {
+  /// AAA
+  /// BBB
+  int test;
+}
+''');
+    await assertHasAssistAt('test;', '''
+class A {
+  /// AAA
+  /// BBB
+  int _test;
+
+  /// AAA
+  /// BBB
+  int get test => _test;
+
+  /// AAA
+  /// BBB
+  set test(int test) {
+    _test = test;
+  }
+}
+''');
+  }
+
+  test_final() async {
+    await resolveTestUnit('''
+class A {
+  final int test = 42;
+}
+''');
+    await assertNoAssistAt('test =');
+  }
+
+  test_hasType() async {
+    await resolveTestUnit('''
+class A {
+  int test = 42;
+  A(this.test);
+}
+main(A a) {
+  print(a.test);
+}
+''');
+    await assertHasAssistAt('test = 42', '''
+class A {
+  int _test = 42;
+
+  int get test => _test;
+
+  set test(int test) {
+    _test = test;
+  }
+  A(this._test);
+}
+main(A a) {
+  print(a.test);
+}
+''');
+  }
+
+  test_multipleFields() async {
+    await resolveTestUnit('''
+class A {
+  int aaa, bbb, ccc;
+}
+main(A a) {
+  print(a.bbb);
+}
+''');
+    await assertNoAssistAt('bbb, ');
+  }
+
+  test_notOnName() async {
+    await resolveTestUnit('''
+class A {
+  int test = 1 + 2 + 3;
+}
+''');
+    await assertNoAssistAt('+ 2');
+  }
+
+  test_noType() async {
+    await resolveTestUnit('''
+class A {
+  var test = 42;
+}
+main(A a) {
+  print(a.test);
+}
+''');
+    await assertHasAssistAt('test = 42', '''
+class A {
+  var _test = 42;
+
+  get test => _test;
+
+  set test(test) {
+    _test = test;
+  }
+}
+main(A a) {
+  print(a.test);
+}
+''');
+  }
+
+  test_parseError() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+class A {
+  int; // marker
+}
+main(A a) {
+  print(a.test);
+}
+''');
+    await assertNoAssistAt('; // marker');
+  }
+
+  test_static() async {
+    await resolveTestUnit('''
+class A {
+  static int test = 42;
+}
+''');
+    await assertNoAssistAt('test =');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart b/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart
new file mode 100644
index 0000000..8bbcd52
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/exchange_operands_test.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExchangeOperandsTest);
+  });
+}
+
+@reflectiveTest
+class ExchangeOperandsTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.EXCHANGE_OPERANDS;
+
+  test_compare() async {
+    const initialOperators = const ['<', '<=', '>', '>='];
+    const resultOperators = const ['>', '>=', '<', '<='];
+    for (int i = 0; i <= 0; i++) {
+      String initialOperator = initialOperators[i];
+      String resultOperator = resultOperators[i];
+      await resolveTestUnit('''
+bool main(int a, int b) {
+  return a $initialOperator b;
+}
+''');
+      await assertHasAssistAt(initialOperator, '''
+bool main(int a, int b) {
+  return b $resultOperator a;
+}
+''');
+    }
+  }
+
+  test_extended_mixOperator_1() async {
+    await resolveTestUnit('''
+main() {
+  1 * 2 * 3 + 4;
+}
+''');
+    await assertHasAssistAt('* 2', '''
+main() {
+  2 * 3 * 1 + 4;
+}
+''');
+  }
+
+  test_extended_mixOperator_2() async {
+    await resolveTestUnit('''
+main() {
+  1 + 2 - 3 + 4;
+}
+''');
+    await assertHasAssistAt('+ 2', '''
+main() {
+  2 + 1 - 3 + 4;
+}
+''');
+  }
+
+  test_extended_sameOperator_afterFirst() async {
+    await resolveTestUnit('''
+main() {
+  1 + 2 + 3;
+}
+''');
+    await assertHasAssistAt('+ 2', '''
+main() {
+  2 + 3 + 1;
+}
+''');
+  }
+
+  test_extended_sameOperator_afterSecond() async {
+    await resolveTestUnit('''
+main() {
+  1 + 2 + 3;
+}
+''');
+    await assertHasAssistAt('+ 3', '''
+main() {
+  3 + 1 + 2;
+}
+''');
+  }
+
+  test_extraLength() async {
+    await resolveTestUnit('''
+main() {
+  111 + 222;
+}
+''');
+    await assertNoAssistAt('+ 222', length: 3);
+  }
+
+  test_onOperand() async {
+    await resolveTestUnit('''
+main() {
+  111 + 222;
+}
+''');
+    await assertNoAssistAt('11 +', length: 3);
+  }
+
+  test_selectionWithBinary() async {
+    await resolveTestUnit('''
+main() {
+  1 + 2 + 3;
+}
+''');
+    await assertNoAssistAt('1 + 2 + 3', length: '1 + 2 + 3'.length);
+  }
+
+  test_simple_afterOperator() async {
+    await resolveTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    await assertHasAssistAt(' 2', '''
+main() {
+  2 + 1;
+}
+''');
+  }
+
+  test_simple_beforeOperator() async {
+    await resolveTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    await assertHasAssistAt('+ 2', '''
+main() {
+  2 + 1;
+}
+''');
+  }
+
+  test_simple_fullSelection() async {
+    await resolveTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    await assertHasAssistAt(
+        '1 + 2',
+        '''
+main() {
+  2 + 1;
+}
+''',
+        length: '1 + 2'.length);
+  }
+
+  test_simple_withLength() async {
+    await resolveTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    await assertHasAssistAt(
+        '+ 2',
+        '''
+main() {
+  2 + 1;
+}
+''',
+        length: 2);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
new file mode 100644
index 0000000..8d34099
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_children_test.dart
@@ -0,0 +1,158 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterConvertToChildrenTest);
+  });
+}
+
+@reflectiveTest
+class FlutterConvertToChildrenTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_CONVERT_TO_CHILDREN;
+
+  test_childUnresolved() async {
+    addFlutterPackage();
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  return new Row(
+    /*caret*/child: new Container()
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_multiLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+// start
+    body: new Center(
+      /*caret*/child: new Container(
+        width: 200.0,
+        height: 300.0,
+      ),
+      key: null,
+    ),
+// end
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+// start
+    body: new Center(
+      /*caret*/children: <Widget>[
+        new Container(
+          width: 200.0,
+          height: 300.0,
+        ),
+      ],
+      key: null,
+    ),
+// end
+  );
+}
+''');
+  }
+
+  test_newlineChild() async {
+    // This case could occur with deeply nested constructors, common in Flutter.
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+// start
+    body: new Center(
+      /*caret*/child:
+          new Container(
+        width: 200.0,
+        height: 300.0,
+      ),
+      key: null,
+    ),
+// end
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+// start
+    body: new Center(
+      /*caret*/children: <Widget>[
+        new Container(
+          width: 200.0,
+          height: 300.0,
+        ),
+      ],
+      key: null,
+    ),
+// end
+  );
+}
+''');
+  }
+
+  test_notOnChild() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+    body: /*caret*/new Center(
+      child: new Container(),
+    ),
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_singleLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+// start
+    body: new Center(
+      /*caret*/child: new GestureDetector(),
+      key: null,
+    ),
+// end
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+// start
+    body: new Center(
+      /*caret*/children: <Widget>[new GestureDetector()],
+      key: null,
+    ),
+// end
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
new file mode 100644
index 0000000..977ea72
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_convert_to_stateful_widget_test.dart
@@ -0,0 +1,403 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterConvertToStatefulWidgetTest);
+  });
+}
+
+@reflectiveTest
+class FlutterConvertToStatefulWidgetTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_CONVERT_TO_STATEFUL_WIDGET;
+
+  test_empty() async {
+    addFlutterPackage();
+    await resolveTestUnit(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return new Container();
+  }
+}
+''');
+    await assertHasAssist(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatefulWidget {
+  @override
+  MyWidgetState createState() {
+    return new MyWidgetState();
+  }
+}
+
+class MyWidgetState extends State<MyWidget> {
+  @override
+  Widget build(BuildContext context) {
+    return new Container();
+  }
+}
+''');
+  }
+
+  test_fields() async {
+    addFlutterPackage();
+    await resolveTestUnit(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatelessWidget {
+  static String staticField1;
+  final String instanceField1;
+  final String instanceField2;
+  String instanceField3;
+  static String staticField2;
+  String instanceField4;
+  String instanceField5;
+  static String staticField3;
+
+  MyWidget(this.instanceField1) : instanceField2 = '' {
+    instanceField3 = '';
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    instanceField4 = instanceField1;
+    return new Row(
+      children: [
+        new Text(instanceField1),
+        new Text(instanceField2),
+        new Text(instanceField3),
+        new Text(instanceField4),
+        new Text(instanceField5),
+        new Text(staticField1),
+        new Text(staticField2),
+        new Text(staticField3),
+      ],
+    );
+  }
+}
+''');
+    await assertHasAssist(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatefulWidget {
+  static String staticField1;
+  final String instanceField1;
+  final String instanceField2;
+  String instanceField3;
+  static String staticField2;
+  static String staticField3;
+
+  MyWidget(this.instanceField1) : instanceField2 = '' {
+    instanceField3 = '';
+  }
+
+  @override
+  MyWidgetState createState() {
+    return new MyWidgetState();
+  }
+}
+
+class MyWidgetState extends State<MyWidget> {
+  String instanceField4;
+
+  String instanceField5;
+
+  @override
+  Widget build(BuildContext context) {
+    instanceField4 = widget.instanceField1;
+    return new Row(
+      children: [
+        new Text(widget.instanceField1),
+        new Text(widget.instanceField2),
+        new Text(widget.instanceField3),
+        new Text(instanceField4),
+        new Text(instanceField5),
+        new Text(MyWidget.staticField1),
+        new Text(MyWidget.staticField2),
+        new Text(MyWidget.staticField3),
+      ],
+    );
+  }
+}
+''');
+  }
+
+  test_getters() async {
+    addFlutterPackage();
+    await resolveTestUnit(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return new Row(
+      children: [
+        new Text(staticGetter1),
+        new Text(staticGetter2),
+        new Text(instanceGetter1),
+        new Text(instanceGetter2),
+      ],
+    );
+  }
+
+  static String get staticGetter1 => '';
+
+  String get instanceGetter1 => '';
+
+  static String get staticGetter2 => '';
+
+  String get instanceGetter2 => '';
+}
+''');
+    await assertHasAssist(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatefulWidget {
+  @override
+  MyWidgetState createState() {
+    return new MyWidgetState();
+  }
+
+  static String get staticGetter1 => '';
+
+  static String get staticGetter2 => '';
+}
+
+class MyWidgetState extends State<MyWidget> {
+  @override
+  Widget build(BuildContext context) {
+    return new Row(
+      children: [
+        new Text(MyWidget.staticGetter1),
+        new Text(MyWidget.staticGetter2),
+        new Text(instanceGetter1),
+        new Text(instanceGetter2),
+      ],
+    );
+  }
+
+  String get instanceGetter1 => '';
+
+  String get instanceGetter2 => '';
+}
+''');
+  }
+
+  test_methods() async {
+    addFlutterPackage();
+    await resolveTestUnit(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatelessWidget {
+  static String staticField;
+  final String instanceField1;
+  String instanceField2;
+
+  MyWidget(this.instanceField1);
+
+  @override
+  Widget build(BuildContext context) {
+    return new Row(
+      children: [
+        new Text(instanceField1),
+        new Text(instanceField2),
+        new Text(staticField),
+      ],
+    );
+  }
+
+  void instanceMethod1() {
+    instanceMethod1();
+    instanceMethod2();
+    staticMethod1();
+  }
+
+  static void staticMethod1() {
+    print('static 1');
+  }
+
+  void instanceMethod2() {
+    print('instance 2');
+  }
+
+  static void staticMethod2() {
+    print('static 2');
+  }
+}
+''');
+    await assertHasAssist(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatefulWidget {
+  static String staticField;
+  final String instanceField1;
+
+  MyWidget(this.instanceField1);
+
+  @override
+  MyWidgetState createState() {
+    return new MyWidgetState();
+  }
+
+  static void staticMethod1() {
+    print('static 1');
+  }
+
+  static void staticMethod2() {
+    print('static 2');
+  }
+}
+
+class MyWidgetState extends State<MyWidget> {
+  String instanceField2;
+
+  @override
+  Widget build(BuildContext context) {
+    return new Row(
+      children: [
+        new Text(widget.instanceField1),
+        new Text(instanceField2),
+        new Text(MyWidget.staticField),
+      ],
+    );
+  }
+
+  void instanceMethod1() {
+    instanceMethod1();
+    instanceMethod2();
+    MyWidget.staticMethod1();
+  }
+
+  void instanceMethod2() {
+    print('instance 2');
+  }
+}
+''');
+  }
+
+  test_notClass() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+/*caret*/main() {}
+''');
+    assertNoAssist();
+  }
+
+  test_notStatelessWidget() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+class /*caret*/MyWidget extends Text {
+  MyWidget() : super('');
+}
+''');
+    assertNoAssist();
+  }
+
+  test_notWidget() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+class /*caret*/MyWidget {}
+''');
+    assertNoAssist();
+  }
+
+  test_simple() async {
+    addFlutterPackage();
+    await resolveTestUnit(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatelessWidget {
+  final String aaa;
+  final String bbb;
+
+  const MyWidget(this.aaa, this.bbb);
+
+  @override
+  Widget build(BuildContext context) {
+    return new Row(
+      children: [
+        new Text(aaa),
+        new Text(bbb),
+        new Text('$aaa'),
+        new Text('${bbb}'),
+      ],
+    );
+  }
+}
+''');
+    await assertHasAssist(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatefulWidget {
+  final String aaa;
+  final String bbb;
+
+  const MyWidget(this.aaa, this.bbb);
+
+  @override
+  MyWidgetState createState() {
+    return new MyWidgetState();
+  }
+}
+
+class MyWidgetState extends State<MyWidget> {
+  @override
+  Widget build(BuildContext context) {
+    return new Row(
+      children: [
+        new Text(widget.aaa),
+        new Text(widget.bbb),
+        new Text('${widget.aaa}'),
+        new Text('${widget.bbb}'),
+      ],
+    );
+  }
+}
+''');
+  }
+
+  test_tail() async {
+    addFlutterPackage();
+    await resolveTestUnit(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return new Container();
+  }
+}
+''');
+    await assertHasAssist(r'''
+import 'package:flutter/material.dart';
+
+class /*caret*/MyWidget extends StatefulWidget {
+  @override
+  MyWidgetState createState() {
+    return new MyWidgetState();
+  }
+}
+
+class MyWidgetState extends State<MyWidget> {
+  @override
+  Widget build(BuildContext context) {
+    return new Container();
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
new file mode 100644
index 0000000..5885e70
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_down_test.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterMoveDownTest);
+  });
+}
+
+@reflectiveTest
+class FlutterMoveDownTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_MOVE_DOWN;
+
+  test_first() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('aaa'),
+      /*caret*/new Text('bbbbbb'),
+      new Text('ccccccccc'),
+    ],
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('aaa'),
+      /*caret*/new Text('ccccccccc'),
+      new Text('bbbbbb'),
+    ],
+  );
+}
+''');
+    assertExitPosition(before: "new Text('bbbbbb')");
+  }
+
+  test_last() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('aaa'),
+      new Text('bbb'),
+      /*caret*/new Text('ccc'),
+    ],
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_notInList() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Center(
+    child: /*caret*/new Text('aaa'),
+  );
+}
+''');
+    await assertNoAssist();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
new file mode 100644
index 0000000..771bb73
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_move_up_test.dart
@@ -0,0 +1,80 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterMoveUpTest);
+  });
+}
+
+@reflectiveTest
+class FlutterMoveUpTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_MOVE_UP;
+
+  test_first() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      /*caret*/new Text('aaa'),
+      new Text('bbb'),
+      new Text('ccc'),
+    ],
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_last() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('aaa'),
+      /*caret*/new Text('bbbbbb'),
+      new Text('ccccccccc'),
+    ],
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('bbbbbb'),
+      /*caret*/new Text('aaa'),
+      new Text('ccccccccc'),
+    ],
+  );
+}
+''');
+    assertExitPosition(before: "new Text('bbbbbb')");
+  }
+
+  test_notInList() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Center(
+    child: /*caret*/new Text('aaa'),
+  );
+}
+''');
+    await assertNoAssist();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
new file mode 100644
index 0000000..842b191
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_remove_widget_test.dart
@@ -0,0 +1,236 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterRemoveWidgetTest);
+  });
+}
+
+@reflectiveTest
+class FlutterRemoveWidgetTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_REMOVE_WIDGET;
+
+  test_childIntoChild_multiLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Center(
+        child: new /*caret*/Padding(
+          padding: const EdgeInsets.all(8.0),
+          child: new Center(
+            heightFactor: 0.5,
+            child: new Text('foo'),
+          ),
+        ),
+      ),
+    ],
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Center(
+        child: new Center(
+          heightFactor: 0.5,
+          child: new Text('foo'),
+        ),
+      ),
+    ],
+  );
+}
+''');
+  }
+
+  test_childIntoChild_singleLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Padding(
+    padding: const EdgeInsets.all(8.0),
+    child: new /*caret*/Center(
+      heightFactor: 0.5,
+      child: new Text('foo'),
+    ),
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  new Padding(
+    padding: const EdgeInsets.all(8.0),
+    child: new Text('foo'),
+  );
+}
+''');
+  }
+
+  test_childIntoChildren() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('foo'),
+      new /*caret*/Center(
+        heightFactor: 0.5,
+        child: new Padding(
+          padding: const EdgeInsets.all(8.0),
+          child: new Text('bar'),
+        ),
+      ),
+      new Text('baz'),
+    ],
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('foo'),
+      new Padding(
+        padding: const EdgeInsets.all(8.0),
+        child: new Text('bar'),
+      ),
+      new Text('baz'),
+    ],
+  );
+}
+''');
+  }
+
+  test_childrenMultipleIntoChild() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Center(
+    child: new /*caret*/Row(
+      children: [
+        new Text('aaa'),
+        new Text('bbb'),
+      ],
+    ),
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_childrenOneIntoChild() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Center(
+    child: /*caret*/new Column(
+      children: [
+        new Text('foo'),
+      ],
+    ),
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  new Center(
+    child: /*caret*/new Text('foo'),
+  );
+}
+''');
+  }
+
+  test_childrenOneIntoReturn() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  return /*caret*/new Column(
+    children: [
+      new Text('foo'),
+    ],
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  return /*caret*/new Text('foo');
+}
+''');
+  }
+
+  test_intoChildren() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('aaa'),
+      new /*caret*/Column(
+        children: [
+          new Row(
+            children: [
+              new Text('bbb'),
+              new Text('ccc'),
+            ],
+          ),
+          new Row(
+            children: [
+              new Text('ddd'),
+              new Text('eee'),
+            ],
+          ),
+        ],
+      ),
+      new Text('fff'),
+    ],
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: <Widget>[
+      new Text('aaa'),
+      new Row(
+        children: [
+          new Text('bbb'),
+          new Text('ccc'),
+        ],
+      ),
+      new Row(
+        children: [
+          new Text('ddd'),
+          new Text('eee'),
+        ],
+      ),
+      new Text('fff'),
+    ],
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
new file mode 100644
index 0000000..03b6f84
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_child_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterSwapWithChildTest);
+  });
+}
+
+@reflectiveTest
+class FlutterSwapWithChildTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_SWAP_WITH_CHILD;
+
+  test_aroundCenter() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+    body: new /*caret*/GestureDetector(
+      onTap: () => startResize(),
+      child: new Center(
+        child: new Container(
+          width: 200.0,
+          height: 300.0,
+        ),
+        key: null,
+      ),
+    ),
+  );
+}
+startResize() {}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+    body: new Center(
+      key: null,
+      child: new /*caret*/GestureDetector(
+        onTap: () => startResize(),
+        child: new Container(
+          width: 200.0,
+          height: 300.0,
+        ),
+      ),
+    ),
+  );
+}
+startResize() {}
+''');
+  }
+
+  test_notFormatted() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+class Foo extends StatefulWidget {
+  @override
+  _State createState() => new _State();
+}
+
+class _State extends State<Foo> {
+  @override
+  Widget build(BuildContext context) {
+    return new /*caret*/Expanded(
+      flex: 2,
+      child: new GestureDetector(
+        child: new Text(
+          'foo',
+        ), onTap: () {
+          print(42);
+      },
+      ),
+    );
+  }
+}''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+
+class Foo extends StatefulWidget {
+  @override
+  _State createState() => new _State();
+}
+
+class _State extends State<Foo> {
+  @override
+  Widget build(BuildContext context) {
+    return new GestureDetector(
+      onTap: () {
+        print(42);
+    },
+      child: new /*caret*/Expanded(
+        flex: 2,
+        child: new Text(
+          'foo',
+        ),
+      ),
+    );
+  }
+}''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
new file mode 100644
index 0000000..d5ad1d3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_swap_with_parent_test.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterSwapWithParentTest);
+  });
+}
+
+@reflectiveTest
+class FlutterSwapWithParentTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_SWAP_WITH_PARENT;
+
+  test_inCenter() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+    body: new Center(
+      child: new /*caret*/GestureDetector(
+        onTap: () => startResize(),
+        child: new Container(
+          width: 200.0,
+          height: 300.0,
+        ),
+      ),
+      key: null,
+    ),
+  );
+}
+startResize() {}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+    body: new /*caret*/GestureDetector(
+      onTap: () => startResize(),
+      child: new Center(
+        key: null,
+        child: new Container(
+          width: 200.0,
+          height: 300.0,
+        ),
+      ),
+    ),
+  );
+}
+startResize() {}
+''');
+  }
+
+  test_notFormatted() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+class Foo extends StatefulWidget {
+  @override
+  _State createState() => new _State();
+}
+
+class _State extends State<Foo> {
+  @override
+  Widget build(BuildContext context) {
+    return new GestureDetector(
+      child: new /*caret*/Expanded(
+        child: new Text(
+          'foo',
+        ),
+        flex: 2,
+      ), onTap: () {
+        print(42);
+    },
+    );
+  }
+}''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+
+class Foo extends StatefulWidget {
+  @override
+  _State createState() => new _State();
+}
+
+class _State extends State<Foo> {
+  @override
+  Widget build(BuildContext context) {
+    return new /*caret*/Expanded(
+      flex: 2,
+      child: new GestureDetector(
+        onTap: () {
+          print(42);
+      },
+        child: new Text(
+          'foo',
+        ),
+      ),
+    );
+  }
+}''');
+  }
+
+  test_outerIsInChildren() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: [
+      new Column(
+        children: [
+          new Padding(
+            padding: new EdgeInsets.all(16.0),
+            child: new /*caret*/Center(
+              child: new Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: <Widget>[],
+              ),
+            ),
+          ),
+        ],
+      ),
+    ],
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/material.dart';
+main() {
+  new Column(
+    children: [
+      new Column(
+        children: [
+          new /*caret*/Center(
+            child: new Padding(
+              padding: new EdgeInsets.all(16.0),
+              child: new Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: <Widget>[],
+              ),
+            ),
+          ),
+        ],
+      ),
+    ],
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
new file mode 100644
index 0000000..4e300e2
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_center_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapCenterTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapCenterTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_CENTER;
+
+  test_aroundCenter() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/new Center();
+  }
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_aroundContainer() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/new Container();
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/Center(child: new Container());
+  }
+}
+''');
+  }
+
+  test_aroundNamedConstructor() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.named();
+
+  Widget build(BuildContext context) => null;
+}
+
+main() {
+  return MyWidget./*caret*/named();
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  MyWidget.named();
+
+  Widget build(BuildContext context) => null;
+}
+
+main() {
+  return Center(child: MyWidget./*caret*/named());
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
new file mode 100644
index 0000000..cad4036
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_column_test.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapColumnTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapColumnTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_COLUMN;
+
+  test_coveredByWidget() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class FakeFlutter {
+  main() {
+    return new Container(
+      child: new /*caret*/Text('aaa'),
+    );
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+class FakeFlutter {
+  main() {
+    return new Container(
+      child: Column(
+        children: <Widget>[
+          new /*caret*/Text('aaa'),
+        ],
+      ),
+    );
+  }
+}
+''');
+  }
+
+  test_coversWidgets() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class FakeFlutter {
+  main() {
+    return new Row(children: [
+      new Text('aaa'),
+// start
+      new Text('bbb'),
+      new Text('ccc'),
+// end
+      new Text('ddd'),
+    ]);
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+class FakeFlutter {
+  main() {
+    return new Row(children: [
+      new Text('aaa'),
+// start
+      Column(
+        children: <Widget>[
+          new Text('bbb'),
+          new Text('ccc'),
+        ],
+      ),
+// end
+      new Text('ddd'),
+    ]);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
new file mode 100644
index 0000000..15f8433
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_container_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapContainerTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapContainerTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_CONTAINER;
+
+  test_aroundContainer() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+main() {
+  return /*caret*/new Container();
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_aroundText() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+main() {
+  /*caret*/new Text('a');
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+main() {
+  /*caret*/Container(child: new Text('a'));
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
new file mode 100644
index 0000000..30b416b
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_generic_test.dart
@@ -0,0 +1,313 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapGenericTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapGenericTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_GENERIC;
+
+  test_minimal() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+/*caret*/x(){}
+''');
+    await assertNoAssist();
+  }
+
+  test_multiLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Container(
+    child: new Row(
+// start
+      children: [/*caret*/
+        new Text('111'),
+        new Text('222'),
+        new Container(),
+      ],
+// end
+    ),
+  );
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Container(
+    child: new Row(
+// start
+      children: [
+        new widget(
+          children: [/*caret*/
+            new Text('111'),
+            new Text('222'),
+            new Container(),
+          ],
+        ),
+      ],
+// end
+    ),
+  );
+}
+''');
+  }
+
+  test_multiLine_inListLiteral() async {
+    verifyNoTestUnitErrors = false;
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Container(
+    child: new Row(
+      children: [/*caret*/
+// start
+        new Transform(),
+        new Object(),
+        new AspectRatio(),
+// end
+      ],
+    ),
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_multiLines() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return new Container(
+// start
+      child: new /*caret*/DefaultTextStyle(
+        child: new Row(
+          children: <Widget>[
+            new Container(
+            ),
+          ],
+        ),
+      ),
+// end
+    );
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return new Container(
+// start
+      child: widget(
+        child: new /*caret*/DefaultTextStyle(
+          child: new Row(
+            children: <Widget>[
+              new Container(
+              ),
+            ],
+          ),
+        ),
+      ),
+// end
+    );
+  }
+}
+''');
+  }
+
+  test_multiLines_eol2() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {\r
+  main() {\r
+    return new Container(\r
+// start\r
+      child: new /*caret*/DefaultTextStyle(\r
+        child: new Row(\r
+          children: <Widget>[\r
+            new Container(\r
+            ),\r
+          ],\r
+        ),\r
+      ),\r
+// end\r
+    );\r
+  }\r
+}\r
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {\r
+  main() {\r
+    return new Container(\r
+// start\r
+      child: widget(\r
+        child: new /*caret*/DefaultTextStyle(\r
+          child: new Row(\r
+            children: <Widget>[\r
+              new Container(\r
+              ),\r
+            ],\r
+          ),\r
+        ),\r
+      ),\r
+// end\r
+    );\r
+  }\r
+}\r
+''');
+  }
+
+  test_prefixedIdentifier_identifier() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+abstract class Foo extends Widget {
+  Widget bar;
+}
+
+main(Foo foo) {
+  return foo./*caret*/bar;
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+abstract class Foo extends Widget {
+  Widget bar;
+}
+
+main(Foo foo) {
+  return widget(child: foo./*caret*/bar);
+}
+''');
+  }
+
+  test_prefixedIdentifier_prefix() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+abstract class Foo extends Widget {
+  Widget bar;
+}
+
+main(Foo foo) {
+  return /*caret*/foo.bar;
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+abstract class Foo extends Widget {
+  Widget bar;
+}
+
+main(Foo foo) {
+  return /*caret*/widget(child: foo.bar);
+}
+''');
+  }
+
+  test_singleLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+  var obj;
+// start
+    return new Row(children: [/*caret*/ new Container()]);
+// end
+  }
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_singleLine1() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+// start
+    return /*caret*/new Container();
+// end
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+// start
+    return /*caret*/widget(child: new Container());
+// end
+  }
+}
+''');
+  }
+
+  test_singleLine2() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return new ClipRect./*caret*/rect();
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return widget(child: new ClipRect./*caret*/rect());
+  }
+}
+''');
+  }
+
+  test_variable() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    var container = new Container();
+    return /*caret*/container;
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    var container = new Container();
+    return /*caret*/widget(child: container);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
new file mode 100644
index 0000000..50b927b
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapPaddingTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapPaddingTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_PADDING;
+
+  test_aroundContainer() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/new Container();
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/Padding(
+      padding: const EdgeInsets.all(8.0),
+      child: new Container(),
+    );
+  }
+}
+''');
+  }
+
+  test_aroundPadding() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+class FakeFlutter {
+  main() {
+    return /*caret*/new Padding();
+  }
+}
+''');
+    await assertNoAssist();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
new file mode 100644
index 0000000..c18ac34
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_row_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapRowTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapRowTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_ROW;
+
+  test_twoWidgets() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class FakeFlutter {
+  main() {
+    return new Column(children: [
+      new Text('aaa'),
+// start
+      new Text('bbb'),
+      new Text('ccc'),
+// end
+      new Text('ddd'),
+    ]);
+  }
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+class FakeFlutter {
+  main() {
+    return new Column(children: [
+      new Text('aaa'),
+// start
+      Row(
+        children: <Widget>[
+          new Text('bbb'),
+          new Text('ccc'),
+        ],
+      ),
+// end
+      new Text('ddd'),
+    ]);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
new file mode 100644
index 0000000..be7d5c2
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_stream_builder_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FlutterWrapStreamBuilderTest);
+  });
+}
+
+@reflectiveTest
+class FlutterWrapStreamBuilderTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.FLUTTER_WRAP_STREAM_BUILDER;
+
+  test_aroundStreamBuilder() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  /*caret*/StreamBuilder(
+    stream: null,
+    builder: (context, snapshot) => null,
+  );
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_aroundText() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  /*caret*/new Text('a');
+}
+''');
+    await assertHasAssist('''
+import 'package:flutter/widgets.dart';
+
+main() {
+  /*caret*/StreamBuilder<Object>(
+    stream: null,
+    builder: (context, snapshot) {
+      return new Text('a');
+    }
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
new file mode 100644
index 0000000..4c62dde
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/import_add_show_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImportAddShowTest);
+  });
+}
+
+@reflectiveTest
+class ImportAddShowTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.IMPORT_ADD_SHOW;
+
+  test_hasShow() async {
+    await resolveTestUnit('''
+import 'dart:math' show PI;
+main() {
+  PI;
+}
+''');
+    await assertNoAssistAt('import ');
+  }
+
+  test_hasUnresolvedIdentifier() async {
+    await resolveTestUnit('''
+import 'dart:math';
+main(x) {
+  PI;
+  return x.foo();
+}
+''');
+    await assertHasAssistAt('import ', '''
+import 'dart:math' show PI;
+main(x) {
+  PI;
+  return x.foo();
+}
+''');
+  }
+
+  test_onDirective() async {
+    await resolveTestUnit('''
+import 'dart:math';
+main() {
+  PI;
+  E;
+  max(1, 2);
+}
+''');
+    await assertHasAssistAt('import ', '''
+import 'dart:math' show E, PI, max;
+main() {
+  PI;
+  E;
+  max(1, 2);
+}
+''');
+  }
+
+  test_onUri() async {
+    await resolveTestUnit('''
+import 'dart:math';
+main() {
+  PI;
+  E;
+  max(1, 2);
+}
+''');
+    await assertHasAssistAt('art:math', '''
+import 'dart:math' show E, PI, max;
+main() {
+  PI;
+  E;
+  max(1, 2);
+}
+''');
+  }
+
+  test_unresolvedUri() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+import '/no/such/lib.dart';
+''');
+    await assertNoAssistAt('import ');
+  }
+
+  test_unused() async {
+    await resolveTestUnit('''
+import 'dart:math';
+''');
+    await assertNoAssistAt('import ');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart b/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart
new file mode 100644
index 0000000..2201266
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/introduce_local_cast_type_test.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IntroduceLocalCastTypeTest);
+  });
+}
+
+@reflectiveTest
+class IntroduceLocalCastTypeTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.INTRODUCE_LOCAL_CAST_TYPE;
+
+  test_introduceLocalTestedType_notBlock() async {
+    await resolveTestUnit('''
+main(p) {
+  if (p is String)
+    print('not a block');
+}
+''');
+    await assertNoAssistAt('if (p');
+  }
+
+  test_introduceLocalTestedType_notIsExpression() async {
+    await resolveTestUnit('''
+main(p) {
+  if (p == null) {
+  }
+}
+''');
+    await assertNoAssistAt('if (p');
+  }
+
+  test_introduceLocalTestedType_notStatement() async {
+    await resolveTestUnit('''
+class C {
+  bool b;
+  C(v) : b = v is int;
+}''');
+    await assertNoAssistAt('is int');
+  }
+
+  test_introduceLocalTestedType_if_is() async {
+    await resolveTestUnit('''
+class MyTypeName {}
+main(p) {
+  if (p is MyTypeName) {
+  }
+  p = null;
+}
+''');
+    String expected = '''
+class MyTypeName {}
+main(p) {
+  if (p is MyTypeName) {
+    MyTypeName myTypeName = p;
+  }
+  p = null;
+}
+''';
+    await assertHasAssistAt('is MyType', expected);
+    assertLinkedGroup(
+        0,
+        ['myTypeName = '],
+        expectedSuggestions(LinkedEditSuggestionKind.VARIABLE,
+            ['myTypeName', 'typeName', 'name']));
+    // another good location
+    await assertHasAssistAt('if (p', expected);
+  }
+
+  test_introduceLocalTestedType_if_isNot() async {
+    await resolveTestUnit('''
+class MyTypeName {}
+main(p) {
+  if (p is! MyTypeName) {
+    return;
+  }
+}
+''');
+    String expected = '''
+class MyTypeName {}
+main(p) {
+  if (p is! MyTypeName) {
+    return;
+  }
+  MyTypeName myTypeName = p;
+}
+''';
+    await assertHasAssistAt('is! MyType', expected);
+    assertLinkedGroup(
+        0,
+        ['myTypeName = '],
+        expectedSuggestions(LinkedEditSuggestionKind.VARIABLE,
+            ['myTypeName', 'typeName', 'name']));
+    // another good location
+    await assertHasAssistAt('if (p', expected);
+  }
+
+  test_introduceLocalTestedType_while() async {
+    await resolveTestUnit('''
+main(p) {
+  while (p is String) {
+  }
+  p = null;
+}
+''');
+    String expected = '''
+main(p) {
+  while (p is String) {
+    String s = p;
+  }
+  p = null;
+}
+''';
+    await assertHasAssistAt('is String', expected);
+    await assertHasAssistAt('while (p', expected);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
new file mode 100644
index 0000000..54ba0aa
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/invert_if_statement_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvertIfStatementTest);
+  });
+}
+
+@reflectiveTest
+class InvertIfStatementTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.INVERT_IF_STATEMENT;
+
+  test_blocks() async {
+    await resolveTestUnit('''
+main() {
+  if (true) {
+    0;
+  } else {
+    1;
+  }
+}
+''');
+    await assertHasAssistAt('if (', '''
+main() {
+  if (false) {
+    1;
+  } else {
+    0;
+  }
+}
+''');
+  }
+
+  test_statements() async {
+    await resolveTestUnit('''
+main() {
+  if (true)
+    0;
+  else
+    1;
+}
+''');
+    await assertHasAssistAt('if (', '''
+main() {
+  if (false)
+    1;
+  else
+    0;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
new file mode 100644
index 0000000..a57c603
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_inner_test.dart
@@ -0,0 +1,255 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(JoinInWithInnerTest);
+  });
+}
+
+@reflectiveTest
+class JoinInWithInnerTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.JOIN_IF_WITH_INNER;
+
+  test_conditionAndOr() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2 || 3 == 3) {
+      print(0);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (1 ==', '''
+main() {
+  if (1 == 1 && (2 == 2 || 3 == 3)) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_conditionInvocation() async {
+    await resolveTestUnit('''
+main() {
+  if (isCheck()) {
+    if (2 == 2) {
+      print(0);
+    }
+  }
+}
+bool isCheck() => false;
+''');
+    await assertHasAssistAt('if (isCheck', '''
+main() {
+  if (isCheck() && 2 == 2) {
+    print(0);
+  }
+}
+bool isCheck() => false;
+''');
+  }
+
+  test_conditionOrAnd() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1 || 2 == 2) {
+    if (3 == 3) {
+      print(0);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (1 ==', '''
+main() {
+  if ((1 == 1 || 2 == 2) && 3 == 3) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_innerNotIf() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    print(0);
+  }
+}
+''');
+    await assertNoAssistAt('if (1 ==');
+  }
+
+  test_innerWithElse() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(0);
+    } else {
+      print(1);
+    }
+  }
+}
+''');
+    await assertNoAssistAt('if (1 ==');
+  }
+
+  test_onCondition() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(0);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('1 ==', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_simpleConditions_block_block() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(0);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (1 ==', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_simpleConditions_block_single() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2)
+      print(0);
+  }
+}
+''');
+    await assertHasAssistAt('if (1 ==', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_simpleConditions_single_blockMulti() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(1);
+      print(2);
+      print(3);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (1 ==', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(1);
+    print(2);
+    print(3);
+  }
+}
+''');
+  }
+
+  test_simpleConditions_single_blockOne() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1)
+    if (2 == 2) {
+      print(0);
+    }
+}
+''');
+    await assertHasAssistAt('if (1 ==', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_statementAfterInner() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(2);
+    }
+    print(1);
+  }
+}
+''');
+    await assertNoAssistAt('if (1 ==');
+  }
+
+  test_statementBeforeInner() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    print(1);
+    if (2 == 2) {
+      print(2);
+    }
+  }
+}
+''');
+    await assertNoAssistAt('if (1 ==');
+  }
+
+  test_targetNotIf() async {
+    await resolveTestUnit('''
+main() {
+  print(0);
+}
+''');
+    await assertNoAssistAt('print');
+  }
+
+  test_targetWithElse() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(0);
+    }
+  } else {
+    print(1);
+  }
+}
+''');
+    await assertNoAssistAt('if (1 ==');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
new file mode 100644
index 0000000..ffbd3ab
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_if_with_outer_test.dart
@@ -0,0 +1,255 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(JoinIfWithOuterTest);
+  });
+}
+
+@reflectiveTest
+class JoinIfWithOuterTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.JOIN_IF_WITH_OUTER;
+
+  test_conditionAndOr() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2 || 3 == 3) {
+      print(0);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (2 ==', '''
+main() {
+  if (1 == 1 && (2 == 2 || 3 == 3)) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_conditionInvocation() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (isCheck()) {
+      print(0);
+    }
+  }
+}
+bool isCheck() => false;
+''');
+    await assertHasAssistAt('if (isCheck', '''
+main() {
+  if (1 == 1 && isCheck()) {
+    print(0);
+  }
+}
+bool isCheck() => false;
+''');
+  }
+
+  test_conditionOrAnd() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1 || 2 == 2) {
+    if (3 == 3) {
+      print(0);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (3 == 3', '''
+main() {
+  if ((1 == 1 || 2 == 2) && 3 == 3) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_onCondition() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(0);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (2 == 2', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_outerNotIf() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    print(0);
+  }
+}
+''');
+    await assertNoAssistAt('if (1 == 1');
+  }
+
+  test_outerWithElse() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(0);
+    }
+  } else {
+    print(1);
+  }
+}
+''');
+    await assertNoAssistAt('if (2 == 2');
+  }
+
+  test_simpleConditions_block_block() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(0);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (2 == 2', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_simpleConditions_block_single() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2)
+      print(0);
+  }
+}
+''');
+    await assertHasAssistAt('if (2 == 2', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_simpleConditions_single_blockMulti() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(1);
+      print(2);
+      print(3);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('if (2 == 2', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(1);
+    print(2);
+    print(3);
+  }
+}
+''');
+  }
+
+  test_simpleConditions_single_blockOne() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1)
+    if (2 == 2) {
+      print(0);
+    }
+}
+''');
+    await assertHasAssistAt('if (2 == 2', '''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+}
+''');
+  }
+
+  test_statementAfterInner() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(2);
+    }
+    print(1);
+  }
+}
+''');
+    await assertNoAssistAt('if (2 == 2');
+  }
+
+  test_statementBeforeInner() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    print(1);
+    if (2 == 2) {
+      print(2);
+    }
+  }
+}
+''');
+    await assertNoAssistAt('if (2 == 2');
+  }
+
+  test_targetNotIf() async {
+    await resolveTestUnit('''
+main() {
+  print(0);
+}
+''');
+    await assertNoAssistAt('print');
+  }
+
+  test_targetWithElse() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1) {
+    if (2 == 2) {
+      print(0);
+    } else {
+      print(1);
+    }
+  }
+}
+''');
+    await assertNoAssistAt('if (2 == 2');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart
new file mode 100644
index 0000000..3216240
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/join_variable_declaration_test.dart
@@ -0,0 +1,220 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(JoinVariableDeclarationTest);
+  });
+}
+
+@reflectiveTest
+class JoinVariableDeclarationTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.JOIN_VARIABLE_DECLARATION;
+
+  test_onAssignment() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  v = 1;
+}
+''');
+    await assertHasAssistAt('v =', '''
+main() {
+  var v = 1;
+}
+''');
+  }
+
+  test_onAssignment_hasInitializer() async {
+    await resolveTestUnit('''
+main() {
+  var v = 1;
+  v = 2;
+}
+''');
+    await assertNoAssistAt('v = 2');
+  }
+
+  test_onAssignment_notAdjacent() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  var bar;
+  v = 1;
+}
+''');
+    await assertNoAssistAt('v = 1');
+  }
+
+  test_onAssignment_notAssignment() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  v += 1;
+}
+''');
+    await assertNoAssistAt('v += 1');
+  }
+
+  test_onAssignment_notDeclaration() async {
+    await resolveTestUnit('''
+main(var v) {
+  v = 1;
+}
+''');
+    await assertNoAssistAt('v = 1');
+  }
+
+  test_onAssignment_notLeftArgument() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  1 + v; // marker
+}
+''');
+    await assertNoAssistAt('v; // marker');
+  }
+
+  test_onAssignment_notOneVariable() async {
+    await resolveTestUnit('''
+main() {
+  var v, v2;
+  v = 1;
+}
+''');
+    await assertNoAssistAt('v = 1');
+  }
+
+  test_onAssignment_notResolved() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+main() {
+  var v;
+  x = 1;
+}
+''');
+    await assertNoAssistAt('x = 1');
+  }
+
+  test_onAssignment_notSameBlock() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  {
+    v = 1;
+  }
+}
+''');
+    await assertNoAssistAt('v = 1');
+  }
+
+  test_onDeclaration_hasInitializer() async {
+    await resolveTestUnit('''
+main() {
+  var v = 1;
+  v = 2;
+}
+''');
+    await assertNoAssistAt('v = 1');
+  }
+
+  test_onDeclaration_lastStatement() async {
+    await resolveTestUnit('''
+main() {
+  if (true)
+    var v;
+}
+''');
+    await assertNoAssistAt('v;');
+  }
+
+  test_onDeclaration_nextNotAssignmentExpression() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  42;
+}
+''');
+    await assertNoAssistAt('v;');
+  }
+
+  test_onDeclaration_nextNotExpressionStatement() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  if (true) return;
+}
+''');
+    await assertNoAssistAt('v;');
+  }
+
+  test_onDeclaration_nextNotPureAssignment() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  v += 1;
+}
+''');
+    await assertNoAssistAt('v;');
+  }
+
+  test_onDeclaration_notOneVariable() async {
+    await resolveTestUnit('''
+main() {
+  var v, v2;
+  v = 1;
+}
+''');
+    await assertNoAssistAt('v, ');
+  }
+
+  test_onDeclaration_onName() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  v = 1;
+}
+''');
+    await assertHasAssistAt('v;', '''
+main() {
+  var v = 1;
+}
+''');
+  }
+
+  test_onDeclaration_onType() async {
+    await resolveTestUnit('''
+main() {
+  int v;
+  v = 1;
+}
+''');
+    await assertHasAssistAt('int v', '''
+main() {
+  int v = 1;
+}
+''');
+  }
+
+  test_onDeclaration_onVar() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  v = 1;
+}
+''');
+    await assertHasAssistAt('var v', '''
+main() {
+  var v = 1;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
new file mode 100644
index 0000000..f57eee3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/remove_type_annotation_test.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveTypeAnnotationTest);
+  });
+}
+
+@reflectiveTest
+class RemoveTypeAnnotationTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.REMOVE_TYPE_ANNOTATION;
+
+  test_classField() async {
+    await resolveTestUnit('''
+class A {
+  int v = 1;
+}
+''');
+    await assertHasAssistAt('v = ', '''
+class A {
+  var v = 1;
+}
+''');
+  }
+
+  test_classField_final() async {
+    await resolveTestUnit('''
+class A {
+  final int v = 1;
+}
+''');
+    await assertHasAssistAt('v = ', '''
+class A {
+  final v = 1;
+}
+''');
+  }
+
+  test_field_noInitializer() async {
+    await resolveTestUnit('''
+class A {
+  int v;
+}
+''');
+    await assertNoAssistAt('v;');
+  }
+
+  test_localVariable_noInitializer() async {
+    await resolveTestUnit('''
+main() {
+  int v;
+}
+''');
+    await assertNoAssistAt('v;');
+  }
+
+  test_localVariable_onInitializer() async {
+    await resolveTestUnit('''
+main() {
+  final int v = 1;
+}
+''');
+    await assertNoAssistAt('1;');
+  }
+
+  test_localVariable() async {
+    await resolveTestUnit('''
+main() {
+  int a = 1, b = 2;
+}
+''');
+    await assertHasAssistAt('int ', '''
+main() {
+  var a = 1, b = 2;
+}
+''');
+  }
+
+  test_localVariable_const() async {
+    await resolveTestUnit('''
+main() {
+  const int v = 1;
+}
+''');
+    await assertHasAssistAt('int ', '''
+main() {
+  const v = 1;
+}
+''');
+  }
+
+  test_localVariable_final() async {
+    await resolveTestUnit('''
+main() {
+  final int v = 1;
+}
+''');
+    await assertHasAssistAt('int ', '''
+main() {
+  final v = 1;
+}
+''');
+  }
+
+  test_topLevelVariable_noInitializer() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+int v;
+''');
+    await assertNoAssistAt('v;');
+  }
+
+  test_topLevelVariable_syntheticName() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+MyType
+''');
+    await assertNoAssistAt('MyType');
+  }
+
+  test_topLevelVariable() async {
+    await resolveTestUnit('''
+int V = 1;
+''');
+    await assertHasAssistAt('int ', '''
+var V = 1;
+''');
+  }
+
+  test_topLevelVariable_final() async {
+    await resolveTestUnit('''
+final int V = 1;
+''');
+    await assertHasAssistAt('int ', '''
+final V = 1;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart
new file mode 100644
index 0000000..4ef97dd
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_conditional_with_if_else_test.dart
@@ -0,0 +1,103 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceConditionalWithIfElseTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceConditionalWithIfElseTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE;
+
+  test_assignment() async {
+    await resolveTestUnit('''
+main() {
+  var v;
+  v = true ? 111 : 222;
+}
+''');
+    // on conditional
+    await assertHasAssistAt('11 :', '''
+main() {
+  var v;
+  if (true) {
+    v = 111;
+  } else {
+    v = 222;
+  }
+}
+''');
+    // on variable
+    await assertHasAssistAt('v =', '''
+main() {
+  var v;
+  if (true) {
+    v = 111;
+  } else {
+    v = 222;
+  }
+}
+''');
+  }
+
+  test_noEnclosingStatement() async {
+    await resolveTestUnit('''
+var v = true ? 111 : 222;
+''');
+    await assertNoAssistAt('? 111');
+  }
+
+  test_notConditional() async {
+    await resolveTestUnit('''
+main() {
+  var v = 42;
+}
+''');
+    await assertNoAssistAt('v = 42');
+  }
+
+  test_return() async {
+    await resolveTestUnit('''
+main() {
+  return true ? 111 : 222;
+}
+''');
+    await assertHasAssistAt('return ', '''
+main() {
+  if (true) {
+    return 111;
+  } else {
+    return 222;
+  }
+}
+''');
+  }
+
+  test_variableDeclaration() async {
+    await resolveTestUnit('''
+main() {
+  int a = 1, vvv = true ? 111 : 222, b = 2;
+}
+''');
+    await assertHasAssistAt('11 :', '''
+main() {
+  int a = 1, vvv, b = 2;
+  if (true) {
+    vvv = 111;
+  } else {
+    vvv = 222;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
new file mode 100644
index 0000000..a21af08
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/replace_if_else_with_conditional_test.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceIfElseWithConditionalTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceIfElseWithConditionalTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.REPLACE_IF_ELSE_WITH_CONDITIONAL;
+
+  test_assignment() async {
+    await resolveTestUnit('''
+main() {
+  int vvv;
+  if (true) {
+    vvv = 111;
+  } else {
+    vvv = 222;
+  }
+}
+''');
+    await assertHasAssistAt('if (true)', '''
+main() {
+  int vvv;
+  vvv = true ? 111 : 222;
+}
+''');
+  }
+
+  test_expressionVsReturn() async {
+    await resolveTestUnit('''
+main() {
+  if (true) {
+    print(42);
+  } else {
+    return;
+  }
+}
+''');
+    await assertNoAssistAt('else');
+  }
+
+  test_notIfStatement() async {
+    await resolveTestUnit('''
+main() {
+  print(0);
+}
+''');
+    await assertNoAssistAt('print');
+  }
+
+  test_notSingleStatement() async {
+    await resolveTestUnit('''
+main() {
+  int vvv;
+  if (true) {
+    print(0);
+    vvv = 111;
+  } else {
+    print(0);
+    vvv = 222;
+  }
+}
+''');
+    await assertNoAssistAt('if (true)');
+  }
+
+  test_return() async {
+    await resolveTestUnit('''
+main() {
+  if (true) {
+    return 111;
+  } else {
+    return 222;
+  }
+}
+''');
+    await assertHasAssistAt('if (true)', '''
+main() {
+  return true ? 111 : 222;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
new file mode 100644
index 0000000..31127f0
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_and_condition_test.dart
@@ -0,0 +1,158 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SplitAndConditionTest);
+  });
+}
+
+@reflectiveTest
+class SplitAndConditionTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SPLIT_AND_CONDITION;
+
+  test_hasElse() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(1);
+  } else {
+    print(2);
+  }
+}
+''');
+    await assertNoAssistAt('&& 2');
+  }
+
+  test_innerAndExpression() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1 && 2 == 2 && 3 == 3) {
+    print(0);
+  }
+}
+''');
+    await assertHasAssistAt('&& 2 == 2', '''
+main() {
+  if (1 == 1) {
+    if (2 == 2 && 3 == 3) {
+      print(0);
+    }
+  }
+}
+''');
+  }
+
+  test_notAnd() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1 || 2 == 2) {
+    print(0);
+  }
+}
+''');
+    await assertNoAssistAt('|| 2');
+  }
+
+  test_notOnOperator() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1 && 2 == 2) {
+    print(0);
+  }
+  print(3 == 3 && 4 == 4);
+}
+''');
+    await assertNoAssistAt('main() {');
+  }
+
+  test_notPartOfIf() async {
+    await resolveTestUnit('''
+main() {
+  print(1 == 1 && 2 == 2);
+}
+''');
+    await assertNoAssistAt('&& 2');
+  }
+
+  test_notTopLevelAnd() async {
+    await resolveTestUnit('''
+main() {
+  if (true || (1 == 1 && 2 == 2)) {
+    print(0);
+  }
+  if (true && (3 == 3 && 4 == 4)) {
+    print(0);
+  }
+}
+''');
+    await assertNoAssistAt('&& 2');
+    await assertNoAssistAt('&& 4');
+  }
+
+  test_selectionTooLarge() async {
+    await resolveTestUnit('''
+main() {
+  if (1 == 1
+// start
+&& 2 
+// end
+== 2
+) {
+    print(0);
+  }
+  print(3 == 3 && 4 == 4);
+}
+''');
+    await assertNoAssist();
+  }
+
+  test_thenBlock() async {
+    await resolveTestUnit('''
+main() {
+  if (true && false) {
+    print(0);
+    if (3 == 3) {
+      print(1);
+    }
+  }
+}
+''');
+    await assertHasAssistAt('&& false', '''
+main() {
+  if (true) {
+    if (false) {
+      print(0);
+      if (3 == 3) {
+        print(1);
+      }
+    }
+  }
+}
+''');
+  }
+
+  test_thenStatement() async {
+    await resolveTestUnit('''
+main() {
+  if (true && false)
+    print(0);
+}
+''');
+    await assertHasAssistAt('&& false', '''
+main() {
+  if (true)
+    if (false)
+      print(0);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
new file mode 100644
index 0000000..aed39c3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/split_variable_declaration_test.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SplitVariableDeclarationTest);
+  });
+}
+
+@reflectiveTest
+class SplitVariableDeclarationTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SPLIT_VARIABLE_DECLARATION;
+
+  test_const() async {
+    await resolveTestUnit('''
+main() {
+  const v = 1;
+}
+''');
+    await assertNoAssistAt('v = 1');
+  }
+
+  test_final() async {
+    await resolveTestUnit('''
+main() {
+  final v = 1;
+}
+''');
+    await assertNoAssistAt('v = 1');
+  }
+
+  test_notOneVariable() async {
+    await resolveTestUnit('''
+main() {
+  var v = 1, v2;
+}
+''');
+    await assertNoAssistAt('v = 1');
+  }
+
+  test_onName() async {
+    await resolveTestUnit('''
+main() {
+  var v = 1;
+}
+''');
+    await assertHasAssistAt('v =', '''
+main() {
+  int v;
+  v = 1;
+}
+''');
+  }
+
+  test_onType() async {
+    await resolveTestUnit('''
+main() {
+  int v = 1;
+}
+''');
+    await assertHasAssistAt('int ', '''
+main() {
+  int v;
+  v = 1;
+}
+''');
+  }
+
+  @failingTest
+  test_onType_prefixedByComment() async {
+    await resolveTestUnit('''
+main() {
+  /*comment*/int v = 1;
+}
+''');
+    await assertHasAssistAt('int ', '''
+main() {
+  /*comment*/int v;
+  v = 1;
+}
+''');
+  }
+
+  test_onVar() async {
+    await resolveTestUnit('''
+main() {
+  var v = 1;
+}
+''');
+    await assertHasAssistAt('var ', '''
+main() {
+  int v;
+  v = 1;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
new file mode 100644
index 0000000..f4647be
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_block_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SurroundWithBlockTest);
+  });
+}
+
+@reflectiveTest
+class SurroundWithBlockTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SURROUND_WITH_BLOCK;
+
+  test_twoStatements() async {
+    await resolveTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    await assertHasAssist('''
+main() {
+// start
+  {
+    print(0);
+    print(1);
+  }
+// end
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
new file mode 100644
index 0000000..96fbd14
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_do_while_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SurroundWithDoWhileTest);
+  });
+}
+
+@reflectiveTest
+class SurroundWithDoWhileTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SURROUND_WITH_DO_WHILE;
+
+  test_twoStatements() async {
+    await resolveTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    await assertHasAssist('''
+main() {
+// start
+  do {
+    print(0);
+    print(1);
+  } while (condition);
+// end
+}
+''');
+    assertLinkedGroup(0, ['condition);']);
+    assertExitPosition(after: 'condition);');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
new file mode 100644
index 0000000..c775e1c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_in_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SurroundWithForInTest);
+  });
+}
+
+@reflectiveTest
+class SurroundWithForInTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SURROUND_WITH_FOR_IN;
+
+  test_twoStatements() async {
+    await resolveTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    await assertHasAssist('''
+main() {
+// start
+  for (var item in iterable) {
+    print(0);
+    print(1);
+  }
+// end
+}
+''');
+    assertLinkedGroup(0, ['item']);
+    assertLinkedGroup(1, ['iterable']);
+    assertExitPosition(after: '  }');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
new file mode 100644
index 0000000..770684c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_for_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SurroundWithForTest);
+  });
+}
+
+@reflectiveTest
+class SurroundWithForTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SURROUND_WITH_FOR;
+
+  test_twoStatements() async {
+    await resolveTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    await assertHasAssist('''
+main() {
+// start
+  for (var v = init; condition; increment) {
+    print(0);
+    print(1);
+  }
+// end
+}
+''');
+    assertLinkedGroup(0, ['v =']);
+    assertLinkedGroup(1, ['init;']);
+    assertLinkedGroup(2, ['condition;']);
+    assertLinkedGroup(3, ['increment']);
+    assertExitPosition(after: '  }');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
new file mode 100644
index 0000000..de8df15
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_if_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SurroundWithIfTest);
+  });
+}
+
+@reflectiveTest
+class SurroundWithIfTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SURROUND_WITH_IF;
+
+  test_twoStatements() async {
+    await resolveTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    await assertHasAssist('''
+main() {
+// start
+  if (condition) {
+    print(0);
+    print(1);
+  }
+// end
+}
+''');
+    assertLinkedGroup(0, ['condition']);
+    assertExitPosition(after: '  }');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
new file mode 100644
index 0000000..f39a5e0
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_catch_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SurroundWithTryCatchTest);
+  });
+}
+
+@reflectiveTest
+class SurroundWithTryCatchTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SURROUND_WITH_TRY_CATCH;
+
+  test_twoStatements() async {
+    await resolveTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    await assertHasAssist('''
+main() {
+// start
+  try {
+    print(0);
+    print(1);
+  } on Exception catch (e) {
+    // TODO
+  }
+// end
+}
+''');
+    assertLinkedGroup(0, ['Exception']);
+    assertLinkedGroup(1, ['e) {']);
+    assertLinkedGroup(2, ['// TODO']);
+    assertExitPosition(after: '// TODO');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
new file mode 100644
index 0000000..7e9267c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_try_finally_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SurroundWithTryFinallyTest);
+  });
+}
+
+@reflectiveTest
+class SurroundWithTryFinallyTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SURROUND_WITH_TRY_FINALLY;
+
+  test_twoStatements() async {
+    await resolveTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    await assertHasAssist('''
+main() {
+// start
+  try {
+    print(0);
+    print(1);
+  } finally {
+    // TODO
+  }
+// end
+}
+''');
+    assertLinkedGroup(0, ['// TODO']);
+    assertExitPosition(after: '// TODO');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
new file mode 100644
index 0000000..939e211
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/surround_with_while_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SurroundWithWhileTest);
+  });
+}
+
+@reflectiveTest
+class SurroundWithWhileTest extends AssistProcessorTest {
+  @override
+  AssistKind get kind => DartAssistKind.SURROUND_WITH_WHILE;
+
+  test_twoStatements() async {
+    await resolveTestUnit('''
+main() {
+// start
+  print(0);
+  print(1);
+// end
+}
+''');
+    await assertHasAssist('''
+main() {
+// start
+  while (condition) {
+    print(0);
+    print(1);
+  }
+// end
+}
+''');
+    assertLinkedGroup(0, ['condition']);
+    assertExitPosition(after: '  }');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/assist/test_all.dart b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
new file mode 100644
index 0000000..be58fce
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/assist/test_all.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'add_type_annotation_test.dart' as add_type_annotation;
+import 'assign_to_local_variable_test.dart' as assign_to_local_variable;
+import 'convert_class_to_mixin_test.dart' as convert_class_to_mixin;
+import 'convert_documentation_into_block_test.dart'
+    as convert_documentation_into_block;
+import 'convert_documentation_into_line_test.dart'
+    as convert_documentation_into_line;
+import 'convert_into_async_body_test.dart' as convert_into_async_body;
+import 'convert_into_block_body_test.dart' as convert_into_block_body;
+import 'convert_into_expression_body_test.dart' as convert_into_expression_body;
+import 'convert_into_final_field_test.dart' as convert_into_final_field;
+import 'convert_into_for_index_test.dart' as convert_into_for_index;
+import 'convert_into_generic_function_syntax_test.dart'
+    as convert_into_generic_function_syntax;
+import 'convert_into_getter_test.dart' as convert_into_getter;
+import 'convert_into_is_not_empty_test.dart' as convert_into_is_not_empty;
+import 'convert_into_is_not_test.dart' as convert_into_is_not;
+import 'convert_part_of_to_uri_test.dart' as convert_part_of_to_uri;
+import 'convert_to_double_quoted_string_test.dart'
+    as convert_to_double_quoted_string;
+import 'convert_to_field_parameter_test.dart' as convert_to_field_parameter;
+import 'convert_to_int_literal_test.dart' as convert_to_int_literal;
+import 'convert_to_normal_parameter_test.dart' as convert_to_normal_parameter;
+import 'convert_to_single_quoted_string_test.dart'
+    as convert_to_single_quoted_string;
+import 'encapsulate_field_test.dart' as encapsulate_field;
+import 'exchange_operands_test.dart' as exchange_operands;
+import 'flutter_convert_to_children_test.dart' as flutter_convert_to_children;
+import 'flutter_convert_to_stateful_widget_test.dart'
+    as flutter_convert_to_stateful_widget;
+import 'flutter_move_down_test.dart' as flutter_move_down;
+import 'flutter_move_up_test.dart' as flutter_move_up;
+import 'flutter_remove_widget_test.dart' as flutter_remove_widget;
+import 'flutter_swap_with_child_test.dart' as flutter_swap_with_child;
+import 'flutter_swap_with_parent_test.dart' as flutter_swap_with_parent;
+import 'flutter_wrap_center_test.dart' as flutter_wrap_center;
+import 'flutter_wrap_column_test.dart' as flutter_wrap_column;
+import 'flutter_wrap_container_test.dart' as flutter_wrap_container;
+import 'flutter_wrap_generic_test.dart' as flutter_wrap_generic;
+import 'flutter_wrap_padding_test.dart' as flutter_wrap_padding;
+import 'flutter_wrap_row_test.dart' as flutter_wrap_row;
+import 'flutter_wrap_stream_builder_test.dart' as flutter_wrap_stream_builder;
+import 'import_add_show_test.dart' as import_add_show;
+import 'introduce_local_cast_type_test.dart' as introduce_local_cast_type;
+import 'invert_if_statement_test.dart' as invert_if_statement;
+import 'join_if_with_inner_test.dart' as join_if_with_inner;
+import 'join_if_with_outer_test.dart' as join_if_with_outer;
+import 'join_variable_declaration_test.dart' as join_variable_declaration;
+import 'remove_type_annotation_test.dart' as remove_type_annotation;
+import 'replace_conditional_with_if_else_test.dart'
+    as replace_conditional_with_if_else;
+import 'replace_if_else_with_conditional_test.dart'
+    as replace_if_else_with_conditional;
+import 'split_and_condition_test.dart' as split_and_condition;
+import 'split_variable_declaration_test.dart' as split_variable_declaration;
+import 'surround_with_block_test.dart' as surround_with_block;
+import 'surround_with_do_while_test.dart' as surround_with_do_while;
+import 'surround_with_for_in_test.dart' as surround_with_for_in;
+import 'surround_with_for_test.dart' as surround_with_for;
+import 'surround_with_if_test.dart' as surround_with_if;
+import 'surround_with_try_catch_test.dart' as surround_with_try_catch;
+import 'surround_with_try_finally_test.dart' as surround_with_try_finally;
+import 'surround_with_while_test.dart' as surround_with_while;
+
+main() {
+  defineReflectiveSuite(() {
+    add_type_annotation.main();
+    assign_to_local_variable.main();
+    convert_class_to_mixin.main();
+    convert_documentation_into_block.main();
+    convert_documentation_into_line.main();
+    convert_into_async_body.main();
+    convert_into_block_body.main();
+    convert_into_expression_body.main();
+    convert_into_final_field.main();
+    convert_into_for_index.main();
+    convert_into_generic_function_syntax.main();
+    convert_into_getter.main();
+    convert_into_is_not.main();
+    convert_into_is_not_empty.main();
+    convert_part_of_to_uri.main();
+    convert_to_double_quoted_string.main();
+    convert_to_field_parameter.main();
+    convert_to_int_literal.main();
+    convert_to_normal_parameter.main();
+    convert_to_single_quoted_string.main();
+    encapsulate_field.main();
+    exchange_operands.main();
+    flutter_convert_to_children.main();
+    flutter_convert_to_stateful_widget.main();
+    flutter_move_down.main();
+    flutter_move_up.main();
+    flutter_remove_widget.main();
+    flutter_swap_with_child.main();
+    flutter_swap_with_parent.main();
+    flutter_wrap_center.main();
+    flutter_wrap_column.main();
+    flutter_wrap_container.main();
+    flutter_wrap_generic.main();
+    flutter_wrap_padding.main();
+    flutter_wrap_row.main();
+    flutter_wrap_stream_builder.main();
+    import_add_show.main();
+    introduce_local_cast_type.main();
+    invert_if_statement.main();
+    join_if_with_inner.main();
+    join_if_with_outer.main();
+    join_variable_declaration.main();
+    remove_type_annotation.main();
+    replace_conditional_with_if_else.main();
+    replace_if_else_with_conditional.main();
+    split_and_condition.main();
+    split_variable_declaration.main();
+    surround_with_block.main();
+    surround_with_do_while.main();
+    surround_with_for.main();
+    surround_with_for_in.main();
+    surround_with_if.main();
+    surround_with_try_catch.main();
+    surround_with_try_finally.main();
+    surround_with_while.main();
+  }, name: 'assist');
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
new file mode 100644
index 0000000..49938b4
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_async_test.dart
@@ -0,0 +1,199 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddAsyncTest);
+  });
+}
+
+@reflectiveTest
+class AddAsyncTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_ASYNC;
+
+  test_asyncFor() async {
+    await resolveTestUnit('''
+import 'dart:async';
+void main(Stream<String> names) {
+  await for (String name in names) {
+    print(name);
+  }
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+Future main(Stream<String> names) async {
+  await for (String name in names) {
+    print(name);
+  }
+}
+''');
+  }
+
+  test_blockFunctionBody_function() async {
+    await resolveTestUnit('''
+foo() {}
+main() {
+  await foo();
+}
+''');
+    await assertHasFix('''
+foo() {}
+main() async {
+  await foo();
+}
+''', errorFilter: (AnalysisError error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+    });
+  }
+
+  test_blockFunctionBody_getter() async {
+    await resolveTestUnit('''
+int get foo => null;
+int f() {
+  await foo;
+  return 1;
+}
+''');
+    await assertHasFix('''
+int get foo => null;
+Future<int> f() async {
+  await foo;
+  return 1;
+}
+''', errorFilter: (AnalysisError error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+    });
+  }
+
+  test_closure() async {
+    await resolveTestUnit('''
+import 'dart:async';
+
+void takeFutureCallback(Future callback()) {}
+
+void doStuff() => takeFutureCallback(() => await 1);
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+void takeFutureCallback(Future callback()) {}
+
+void doStuff() => takeFutureCallback(() async => await 1);
+''', errorFilter: (AnalysisError error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT;
+    });
+  }
+
+  test_expressionFunctionBody() async {
+    await resolveTestUnit('''
+foo() {}
+main() => await foo();
+''');
+    await assertHasFix('''
+foo() {}
+main() async => await foo();
+''');
+  }
+
+  test_nullFunctionBody() async {
+    await resolveTestUnit('''
+var F = await;
+''');
+    await assertNoFix();
+  }
+
+  test_returnFuture_alreadyFuture() async {
+    await resolveTestUnit('''
+import 'dart:async';
+foo() {}
+Future<int> main() {
+  await foo();
+  return 42;
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+foo() {}
+Future<int> main() async {
+  await foo();
+  return 42;
+}
+''', errorFilter: (AnalysisError error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+    });
+  }
+
+  test_returnFuture_dynamic() async {
+    await resolveTestUnit('''
+foo() {}
+dynamic main() {
+  await foo();
+  return 42;
+}
+''');
+    await assertHasFix('''
+foo() {}
+dynamic main() async {
+  await foo();
+  return 42;
+}
+''', errorFilter: (AnalysisError error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+    });
+  }
+
+  test_returnFuture_nonFuture() async {
+    await resolveTestUnit('''
+foo() {}
+int main() {
+  await foo();
+  return 42;
+}
+''');
+    await assertHasFix('''
+foo() {}
+Future<int> main() async {
+  await foo();
+  return 42;
+}
+''', errorFilter: (AnalysisError error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+    });
+  }
+
+  test_returnFuture_noType() async {
+    await resolveTestUnit('''
+foo() {}
+main() {
+  await foo();
+  return 42;
+}
+''');
+    await assertHasFix('''
+foo() {}
+main() async {
+  await foo();
+  return 42;
+}
+''', errorFilter: (AnalysisError error) {
+      return error.errorCode ==
+          CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE;
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
new file mode 100644
index 0000000..e0ff288
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_explicit_cast_test.dart
@@ -0,0 +1,463 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddExplicitCastTest);
+  });
+}
+
+@reflectiveTest
+class AddExplicitCastTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_EXPLICIT_CAST;
+
+  test_as() async {
+    await resolveTestUnit('''
+f(A a) {
+  C c = a as B;
+  print(c);
+}
+class A {}
+class B {}
+class C {}
+''');
+    await assertNoFix();
+  }
+
+  test_assignment_general() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b;
+  b = a;
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertHasFix('''
+f(A a) {
+  B b;
+  b = a as B;
+  print(b);
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_assignment_general_all() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b, b2;
+  b = a;
+  b2 = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(A a) {
+  B b, b2;
+  b = a as B;
+  b2 = a as B;
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_assignment_list() async {
+    await resolveTestUnit('''
+f(List<A> a) {
+  List<B> b;
+  b = a.where((e) => e is B).toList();
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertHasFix('''
+f(List<A> a) {
+  List<B> b;
+  b = a.where((e) => e is B).cast<B>().toList();
+  print(b);
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_assignment_list_all() async {
+    await resolveTestUnit('''
+f(List<A> a) {
+  List<B> b, b2;
+  b = a.where((e) => e is B).toList();
+  b2 = a.where((e) => e is B).toList();
+}
+class A {}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(List<A> a) {
+  List<B> b, b2;
+  b = a.where((e) => e is B).cast<B>().toList();
+  b2 = a.where((e) => e is B).cast<B>().toList();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_assignment_map() async {
+    await resolveTestUnit('''
+f(Map<A, B> a) {
+  Map<B, A> b;
+  b = a;
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertHasFix('''
+f(Map<A, B> a) {
+  Map<B, A> b;
+  b = a.cast<B, A>();
+  print(b);
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_assignment_map_all() async {
+    await resolveTestUnit('''
+f(Map<A, B> a) {
+  Map<B, A> b, b2;
+  b = a;
+  b2 = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(Map<A, B> a) {
+  Map<B, A> b, b2;
+  b = a.cast<B, A>();
+  b2 = a.cast<B, A>();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_assignment_needsParens() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b;
+  b = a..m();
+  print(b);
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+    await assertHasFix('''
+f(A a) {
+  B b;
+  b = (a..m()) as B;
+  print(b);
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+  }
+
+  test_assignment_needsParens_all() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b, b2;
+  b = a..m();
+  b2 = a..m();
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(A a) {
+  B b, b2;
+  b = (a..m()) as B;
+  b2 = (a..m()) as B;
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+  }
+
+  test_assignment_set() async {
+    await resolveTestUnit('''
+f(Set<A> a) {
+  Set<B> b;
+  b = a;
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertHasFix('''
+f(Set<A> a) {
+  Set<B> b;
+  b = a.cast<B>();
+  print(b);
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_assignment_set_all() async {
+    await resolveTestUnit('''
+f(Set<A> a) {
+  Set<B> b, b2;
+  b = a;
+  b2 = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(Set<A> a) {
+  Set<B> b, b2;
+  b = a.cast<B>();
+  b2 = a.cast<B>();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_cast() async {
+    await resolveTestUnit('''
+f(List<A> a) {
+  List<B> b = a.cast<A>();
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertNoFix();
+  }
+
+  test_declaration_general() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b = a;
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertHasFix('''
+f(A a) {
+  B b = a as B;
+  print(b);
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_declaration_general_all() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b = a;
+  B b2 = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(A a) {
+  B b = a as B;
+  B b2 = a as B;
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_declaration_list() async {
+    await resolveTestUnit('''
+f(List<A> a) {
+  List<B> b = a.where((e) => e is B).toList();
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertHasFix('''
+f(List<A> a) {
+  List<B> b = a.where((e) => e is B).cast<B>().toList();
+  print(b);
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_declaration_list_all() async {
+    await resolveTestUnit('''
+f(List<A> a) {
+  List<B> b = a.where((e) => e is B).toList();
+  List<B> b2 = a.where((e) => e is B).toList();
+}
+class A {}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(List<A> a) {
+  List<B> b = a.where((e) => e is B).cast<B>().toList();
+  List<B> b2 = a.where((e) => e is B).cast<B>().toList();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_declaration_map() async {
+    await resolveTestUnit('''
+f(Map<A, B> a) {
+  Map<B, A> b = a;
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertHasFix('''
+f(Map<A, B> a) {
+  Map<B, A> b = a.cast<B, A>();
+  print(b);
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_declaration_map_all() async {
+    await resolveTestUnit('''
+f(Map<A, B> a) {
+  Map<B, A> b = a;
+  Map<B, A> b2 = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(Map<A, B> a) {
+  Map<B, A> b = a.cast<B, A>();
+  Map<B, A> b2 = a.cast<B, A>();
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_declaration_needsParens() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b = a..m();
+  print(b);
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+    await assertHasFix('''
+f(A a) {
+  B b = (a..m()) as B;
+  print(b);
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+  }
+
+  test_declaration_needsParens_all() async {
+    await resolveTestUnit('''
+f(A a) {
+  B b = a..m();
+  B b2 = a..m();
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(A a) {
+  B b = (a..m()) as B;
+  B b2 = (a..m()) as B;
+}
+class A {
+  int m() => 0;
+}
+class B {}
+''');
+  }
+
+  test_declaration_set() async {
+    await resolveTestUnit('''
+f(Set<A> a) {
+  Set<B> b = a;
+  print(b);
+}
+class A {}
+class B {}
+''');
+    await assertHasFix('''
+f(Set<A> a) {
+  Set<B> b = a.cast<B>();
+  print(b);
+}
+class A {}
+class B {}
+''');
+  }
+
+  test_declaration_set_all() async {
+    await resolveTestUnit('''
+f(Set<A> a) {
+  Set<B> b = a;
+  Set<B> b2 = a;
+}
+class A {}
+class B {}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.INVALID_ASSIGNMENT, '''
+f(Set<A> a) {
+  Set<B> b = a.cast<B>();
+  Set<B> b2 = a.cast<B>();
+}
+class A {}
+class B {}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
new file mode 100644
index 0000000..172aee9
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_field_formal_parameters_test.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddFieldFormalParametersTest);
+  });
+}
+
+@reflectiveTest
+class AddFieldFormalParametersTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_FIELD_FORMAL_PARAMETERS;
+
+  test_flutter() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  final int a;
+  final int b;
+  final int c;
+
+  MyWidget({Key key, this.a}) : super(key: key);
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  final int a;
+  final int b;
+  final int c;
+
+  MyWidget({Key key, this.a, this.b, this.c}) : super(key: key);
+}
+''');
+  }
+
+  test_hasRequiredParameter() async {
+    await resolveTestUnit('''
+class Test {
+  final int a;
+  final int b;
+  final int c;
+  Test(this.a);
+}
+''');
+    await assertHasFix('''
+class Test {
+  final int a;
+  final int b;
+  final int c;
+  Test(this.a, this.b, this.c);
+}
+''');
+  }
+
+  test_noParameters() async {
+    await resolveTestUnit('''
+class Test {
+  final int a;
+  final int b;
+  final int c;
+  Test();
+}
+''');
+    await assertHasFix('''
+class Test {
+  final int a;
+  final int b;
+  final int c;
+  Test(this.a, this.b, this.c);
+}
+''');
+  }
+
+  test_noRequiredParameter() async {
+    await resolveTestUnit('''
+class Test {
+  final int a;
+  final int b;
+  final int c;
+  Test([this.c]);
+}
+''');
+    await assertHasFix('''
+class Test {
+  final int a;
+  final int b;
+  final int c;
+  Test(this.a, this.b, [this.c]);
+}
+''');
+  }
+
+  test_notAllFinal() async {
+    await resolveTestUnit('''
+class Test {
+  final int a;
+  int b;
+  final int c;
+  Test();
+}
+''');
+    await assertHasFix('''
+class Test {
+  final int a;
+  int b;
+  final int c;
+  Test(this.a, this.c);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_named_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_named_test.dart
new file mode 100644
index 0000000..0378f7e
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_named_test.dart
@@ -0,0 +1,232 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddMissingParameterNamedTest);
+  });
+}
+
+@reflectiveTest
+class AddMissingParameterNamedTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_MISSING_PARAMETER_NAMED;
+
+  test_constructor_hasNamed() async {
+    await resolveTestUnit('''
+class A {
+  A(int a, {int b}) {}
+}
+
+main() {
+  new A(1, b: 2, named: 3.0);
+}
+''');
+    await assertHasFix('''
+class A {
+  A(int a, {int b, double named}) {}
+}
+
+main() {
+  new A(1, b: 2, named: 3.0);
+}
+''');
+  }
+
+  test_constructor_hasRequired() async {
+    await resolveTestUnit('''
+class A {
+  A(int a) {}
+}
+
+main() {
+  new A(1, named: 2.0);
+}
+''');
+    await assertHasFix('''
+class A {
+  A(int a, {double named}) {}
+}
+
+main() {
+  new A(1, named: 2.0);
+}
+''');
+  }
+
+  test_constructor_noParameters() async {
+    await resolveTestUnit('''
+class A {
+  A() {}
+}
+
+main() {
+  new A(named: 42);
+}
+''');
+    await assertHasFix('''
+class A {
+  A({int named}) {}
+}
+
+main() {
+  new A(named: 42);
+}
+''');
+  }
+
+  test_constructor_noParameters_named() async {
+    await resolveTestUnit('''
+class A {
+  A.aaa() {}
+}
+
+main() {
+  new A.aaa(named: 42);
+}
+''');
+    await assertHasFix('''
+class A {
+  A.aaa({int named}) {}
+}
+
+main() {
+  new A.aaa(named: 42);
+}
+''');
+  }
+
+  test_function_hasNamed() async {
+    await resolveTestUnit('''
+test(int a, {int b: 0}) {}
+
+main() {
+  test(1, b: 2, named: 3.0);
+}
+''');
+    await assertHasFix('''
+test(int a, {int b: 0, double named}) {}
+
+main() {
+  test(1, b: 2, named: 3.0);
+}
+''');
+  }
+
+  test_function_hasRequired() async {
+    await resolveTestUnit('''
+test(int a) {}
+
+main() {
+  test(1, named: 2.0);
+}
+''');
+    await assertHasFix('''
+test(int a, {double named}) {}
+
+main() {
+  test(1, named: 2.0);
+}
+''');
+  }
+
+  test_function_noParameters() async {
+    await resolveTestUnit('''
+test() {}
+
+main() {
+  test(named: 42);
+}
+''');
+    await assertHasFix('''
+test({int named}) {}
+
+main() {
+  test(named: 42);
+}
+''');
+  }
+
+  test_method_hasNamed() async {
+    await resolveTestUnit('''
+class A {
+  test(int a, {int b: 0}) {}
+
+  main() {
+    test(1, b: 2, named: 3.0);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  test(int a, {int b: 0, double named}) {}
+
+  main() {
+    test(1, b: 2, named: 3.0);
+  }
+}
+''');
+  }
+
+  test_method_hasOptionalPositional() async {
+    await resolveTestUnit('''
+class A {
+  test(int a, [int b]) {}
+
+  main() {
+    test(1, 2, named: 3.0);
+  }
+}
+''');
+    await assertNoFix();
+  }
+
+  test_method_hasRequired() async {
+    await resolveTestUnit('''
+class A {
+  test(int a) {}
+
+  main() {
+    test(1, named: 2.0);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  test(int a, {double named}) {}
+
+  main() {
+    test(1, named: 2.0);
+  }
+}
+''');
+  }
+
+  test_method_noParameters() async {
+    await resolveTestUnit('''
+class A {
+  test() {}
+
+  main() {
+    test(named: 42);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  test({int named}) {}
+
+  main() {
+    test(named: 42);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_positional_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_positional_test.dart
new file mode 100644
index 0000000..ba8e53d
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_positional_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddMissingParameterPositionalTest);
+  });
+}
+
+@reflectiveTest
+class AddMissingParameterPositionalTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL;
+
+  test_function_hasNamed() async {
+    await resolveTestUnit('''
+test({int a}) {}
+main() {
+  test(1);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_function_hasZero() async {
+    await resolveTestUnit('''
+test() {}
+main() {
+  test(1);
+}
+''');
+    await assertHasFix('''
+test([int i]) {}
+main() {
+  test(1);
+}
+''');
+  }
+
+  test_method_hasOne() async {
+    await resolveTestUnit('''
+class A {
+  test(int a) {}
+  main() {
+    test(1, 2.0);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  test(int a, [double d]) {}
+  main() {
+    test(1, 2.0);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
new file mode 100644
index 0000000..b66930d
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_parameter_required_test.dart
@@ -0,0 +1,201 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddMissingParameterRequiredTest);
+    defineReflectiveTests(AddMissingParameterRequiredTest_Workspace);
+  });
+}
+
+@reflectiveTest
+class AddMissingParameterRequiredTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_MISSING_PARAMETER_REQUIRED;
+
+  test_constructor_named_hasOne() async {
+    await resolveTestUnit('''
+class A {
+  A.named(int a) {}
+}
+main() {
+  new A.named(1, 2.0);
+}
+''');
+    await assertHasFix('''
+class A {
+  A.named(int a, double d) {}
+}
+main() {
+  new A.named(1, 2.0);
+}
+''');
+  }
+
+  test_constructor_unnamed_hasOne() async {
+    await resolveTestUnit('''
+class A {
+  A(int a) {}
+}
+main() {
+  new A(1, 2.0);
+}
+''');
+    await assertHasFix('''
+class A {
+  A(int a, double d) {}
+}
+main() {
+  new A(1, 2.0);
+}
+''');
+  }
+
+  test_function_hasNamed() async {
+    await resolveTestUnit('''
+test({int a}) {}
+main() {
+  test(1);
+}
+''');
+    await assertHasFix('''
+test(int i, {int a}) {}
+main() {
+  test(1);
+}
+''');
+  }
+
+  test_function_hasOne() async {
+    await resolveTestUnit('''
+test(int a) {}
+main() {
+  test(1, 2.0);
+}
+''');
+    await assertHasFix('''
+test(int a, double d) {}
+main() {
+  test(1, 2.0);
+}
+''');
+  }
+
+  test_function_hasZero() async {
+    await resolveTestUnit('''
+test() {}
+main() {
+  test(1);
+}
+''');
+    await assertHasFix('''
+test(int i) {}
+main() {
+  test(1);
+}
+''');
+  }
+
+  test_method_hasOne() async {
+    await resolveTestUnit('''
+class A {
+  test(int a) {}
+  main() {
+    test(1, 2.0);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  test(int a, double d) {}
+  main() {
+    test(1, 2.0);
+  }
+}
+''');
+  }
+
+  test_method_hasZero() async {
+    await resolveTestUnit('''
+class A {
+  test() {}
+  main() {
+    test(1);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  test(int i) {}
+  main() {
+    test(1);
+  }
+}
+''');
+  }
+}
+
+@reflectiveTest
+class AddMissingParameterRequiredTest_Workspace
+    extends AddMissingParameterRequiredTest {
+  ChangeWorkspace _workspace;
+
+  @override
+  ChangeWorkspace get workspace {
+    return _workspace ?? super.workspace;
+  }
+
+  test_function_inPackage_inWorkspace() async {
+    newFile('/home/aaa/lib/a.dart', content: 'void test() {}');
+    addTestPackageDependency('aaa', '/home/aaa');
+
+    _workspace = DartChangeWorkspace([
+      session,
+      getContext('/home/aaa').currentSession,
+    ]);
+
+    await resolveTestUnit('''
+import 'package:aaa/a.dart';
+
+main() {
+  test(42);
+}
+''');
+
+    await assertHasFix(
+      'void test(int i) {}',
+      target: '/home/aaa/lib/a.dart',
+    );
+  }
+
+  test_function_inPackage_outsideWorkspace() async {
+    addPackageFile('bbb', 'b.dart', 'void test() {}');
+
+    await resolveTestUnit('''
+import 'package:bbb/b.dart';
+
+main() {
+  test(42);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_method_inSdk() async {
+    await resolveTestUnit('''
+main() {
+  42.abs(true);
+}
+''');
+    await assertNoFix();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
new file mode 100644
index 0000000..20df52c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_missing_required_argument_test.dart
@@ -0,0 +1,369 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddMissingRequiredArgumentTest);
+  });
+}
+
+@reflectiveTest
+class AddMissingRequiredArgumentTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT;
+
+  test_cons_flutter_children() async {
+    addFlutterPackage();
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+import 'package:meta/meta.dart';
+
+class MyWidget extends Widget {
+  MyWidget({@required List<Widget> children});
+}
+
+build() {
+  return new MyWidget();
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+import 'package:meta/meta.dart';
+
+class MyWidget extends Widget {
+  MyWidget({@required List<Widget> children});
+}
+
+build() {
+  return new MyWidget(children: <Widget>[],);
+}
+''');
+  }
+
+  test_cons_flutter_hasTrailingComma() async {
+    addFlutterPackage();
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+import 'package:meta/meta.dart';
+
+class MyWidget extends Widget {
+  MyWidget({@required int a, @required int b});
+}
+
+build() {
+  return new MyWidget(a: 1,);
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+import 'package:meta/meta.dart';
+
+class MyWidget extends Widget {
+  MyWidget({@required int a, @required int b});
+}
+
+build() {
+  return new MyWidget(a: 1, b: null,);
+}
+''');
+  }
+
+  test_cons_single() async {
+    addMetaPackage();
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+class A {
+  A({@required int a}) {}
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(a: null);
+  print(a);
+}
+''');
+  }
+
+  test_cons_single_closure() async {
+    addMetaPackage();
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+typedef void VoidCallback();
+
+class A {
+  A({@required VoidCallback onPressed}) {}
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(onPressed: () {});
+  print(a);
+}
+''');
+  }
+
+  test_cons_single_closure_2() async {
+    addMetaPackage();
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+typedef void Callback(e);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (e) {});
+  print(a);
+}
+''');
+  }
+
+  test_cons_single_closure_3() async {
+    addMetaPackage();
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+typedef void Callback(a,b,c);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (a, b, c) {});
+  print(a);
+}
+''');
+  }
+
+  test_cons_single_closure_4() async {
+    addMetaPackage();
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+typedef int Callback(int a, String b,c);
+
+class A {
+  A({@required Callback callback}) {}
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(callback: (int a, String b, c) {});
+  print(a);
+}
+''');
+  }
+
+  test_cons_single_list() async {
+    addMetaPackage();
+    addSource('/home/test/lib/a.dart', r'''
+import 'package:meta/meta.dart';
+
+class A {
+  A({@required List<String> names}) {}
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A();
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+
+main() {
+  A a = new A(names: <String>[]);
+  print(a);
+}
+''');
+  }
+
+  test_multiple() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test({@required int a, @required int bcd}) {}
+main() {
+  test(a: 3);
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+test({@required int a, @required int bcd}) {}
+main() {
+  test(a: 3, bcd: null);
+}
+''');
+  }
+
+  test_multiple_1of2() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test({@required int a, @required int bcd}) {}
+main() {
+  test();
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+test({@required int a, @required int bcd}) {}
+main() {
+  test(a: null);
+}
+''', errorFilter: (error) => error.message.contains("'a'"));
+  }
+
+  test_multiple_2of2() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test({@required int a, @required int bcd}) {}
+main() {
+  test();
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+test({@required int a, @required int bcd}) {}
+main() {
+  test(bcd: null);
+}
+''', errorFilter: (error) => error.message.contains("'bcd'"));
+  }
+
+  test_single() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test({@required int abc}) {}
+main() {
+  test();
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+test({@required int abc}) {}
+main() {
+  test(abc: null);
+}
+''');
+  }
+
+  test_single_normal() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test(String x, {@required int abc}) {}
+main() {
+  test("foo");
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+test(String x, {@required int abc}) {}
+main() {
+  test("foo", abc: null);
+}
+''');
+  }
+
+  test_single_with_details() async {
+    addMetaPackage();
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test({@Required("Really who doesn't need an abc?") int abc}) {}
+main() {
+  test();
+}
+''');
+    await assertHasFix('''
+import 'package:meta/meta.dart';
+
+test({@Required("Really who doesn't need an abc?") int abc}) {}
+main() {
+  test(abc: null);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
new file mode 100644
index 0000000..c8b6d00
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_ne_null_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddNeNullTest);
+  });
+}
+
+@reflectiveTest
+class AddNeNullTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_NE_NULL;
+
+  test_nonBoolCondition() async {
+    await resolveTestUnit('''
+main(String p) {
+  if (p) {
+    print(p);
+  }
+}
+''');
+    await assertHasFix('''
+main(String p) {
+  if (p != null) {
+    print(p);
+  }
+}
+''');
+  }
+
+  test_nonBoolCondition_all() async {
+    await resolveTestUnit('''
+main(String p, String q) {
+  if (p) {
+    print(p);
+  }
+  if (q) {
+    print(q);
+  }
+}
+''');
+    await assertHasFixAllFix(StaticTypeWarningCode.NON_BOOL_CONDITION, '''
+main(String p, String q) {
+  if (p != null) {
+    print(p);
+  }
+  if (q != null) {
+    print(q);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_override_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_override_test.dart
new file mode 100644
index 0000000..8a1cf11
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_override_test.dart
@@ -0,0 +1,179 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddOverrideTest);
+  });
+}
+
+@reflectiveTest
+class AddOverrideTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_OVERRIDE;
+
+  @override
+  String get lintCode => LintNames.annotate_overrides;
+
+  test_field() async {
+    await resolveTestUnit('''
+class abstract Test {
+  int get t;
+}
+class Sub extends Test {
+  int /*LINT*/t = 42;
+}
+''');
+    await assertHasFix('''
+class abstract Test {
+  int get t;
+}
+class Sub extends Test {
+  @override
+  int /*LINT*/t = 42;
+}
+''');
+  }
+
+  test_getter() async {
+    await resolveTestUnit('''
+class Test {
+  int get t => null;
+}
+class Sub extends Test {
+  int get /*LINT*/t => null;
+}
+''');
+    await assertHasFix('''
+class Test {
+  int get t => null;
+}
+class Sub extends Test {
+  @override
+  int get /*LINT*/t => null;
+}
+''');
+  }
+
+  test_method() async {
+    await resolveTestUnit('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  void /*LINT*/t() { }
+}
+''');
+    await assertHasFix('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  @override
+  void /*LINT*/t() { }
+}
+''');
+  }
+
+  test_method_with_doc_comment() async {
+    await resolveTestUnit('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  /// Doc comment.
+  void /*LINT*/t() { }
+}
+''');
+    await assertHasFix('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  /// Doc comment.
+  @override
+  void /*LINT*/t() { }
+}
+''');
+  }
+
+  test_method_with_doc_comment_2() async {
+    await resolveTestUnit('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  /**
+   * Doc comment.
+   */
+  void /*LINT*/t() { }
+}
+''');
+    await assertHasFix('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  /**
+   * Doc comment.
+   */
+  @override
+  void /*LINT*/t() { }
+}
+''');
+  }
+
+  test_method_with_doc_comment_and_metadata() async {
+    await resolveTestUnit('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  /// Doc comment.
+  @foo
+  void /*LINT*/t() { }
+}
+''');
+    await assertHasFix('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  /// Doc comment.
+  @override
+  @foo
+  void /*LINT*/t() { }
+}
+''');
+  }
+
+  test_method_with_non_doc_comment() async {
+    await resolveTestUnit('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  // Non-doc comment.
+  void /*LINT*/t() { }
+}
+''');
+    await assertHasFix('''
+class Test {
+  void t() { }
+}
+class Sub extends Test {
+  // Non-doc comment.
+  @override
+  void /*LINT*/t() { }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
new file mode 100644
index 0000000..eae5d92
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_required_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddRequiredTest);
+  });
+}
+
+@reflectiveTest
+class AddRequiredTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_REQUIRED;
+
+  @override
+  String get lintCode => LintNames.always_require_non_null_named_parameters;
+
+  test_withAssert() async {
+    await resolveTestUnit('''
+void function({String /*LINT*/param}) {
+  assert(param != null);
+}
+''');
+    await assertHasFix('''
+void function({@required String /*LINT*/param}) {
+  assert(param != null);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_static_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_static_test.dart
new file mode 100644
index 0000000..bf136bd
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_static_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddStaticTest);
+  });
+}
+
+@reflectiveTest
+class AddStaticTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_STATIC;
+
+  test_multipleFields() async {
+    await resolveTestUnit('''
+class C {
+  const int x = 0, y = 0;
+}
+''');
+    await assertHasFix('''
+class C {
+  static const int x = 0, y = 0;
+}
+''');
+  }
+
+  test_oneField() async {
+    await resolveTestUnit('''
+class C {
+  const int x = 0;
+}
+''');
+    await assertHasFix('''
+class C {
+  static const int x = 0;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_super_constructor_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_super_constructor_invocation_test.dart
new file mode 100644
index 0000000..f6282cc
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_super_constructor_invocation_test.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddSuperConstructorInvocationTest);
+  });
+}
+
+@reflectiveTest
+class AddSuperConstructorInvocationTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION;
+
+  test_hasInitializers() async {
+    await resolveTestUnit('''
+class A {
+  A(int p);
+}
+class B extends A {
+  int field;
+  B() : field = 42 {}
+}
+''');
+    await assertHasFix('''
+class A {
+  A(int p);
+}
+class B extends A {
+  int field;
+  B() : field = 42, super(0) {}
+}
+''');
+  }
+
+  test_named() async {
+    await resolveTestUnit('''
+class A {
+  A.named(int p);
+}
+class B extends A {
+  B() {}
+}
+''');
+    await assertHasFix('''
+class A {
+  A.named(int p);
+}
+class B extends A {
+  B() : super.named(0) {}
+}
+''');
+  }
+
+  test_named_private() async {
+    await resolveTestUnit('''
+class A {
+  A._named(int p);
+}
+class B extends A {
+  B() {}
+}
+''');
+    await assertNoFix();
+  }
+
+  test_requiredAndNamed() async {
+    await resolveTestUnit('''
+class A {
+  A(bool p1, int p2, double p3, String p4, {p5});
+}
+class B extends A {
+  B() {}
+}
+''');
+    await assertHasFix('''
+class A {
+  A(bool p1, int p2, double p3, String p4, {p5});
+}
+class B extends A {
+  B() : super(false, 0, 0.0, '') {}
+}
+''');
+  }
+
+  test_typeArgument() async {
+    await resolveTestUnit('''
+class A<T> {
+  A(T p);
+}
+class B extends A<int> {
+  B();
+}
+''');
+    await assertHasFix('''
+class A<T> {
+  A(T p);
+}
+class B extends A<int> {
+  B() : super(0);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_to_nearest_precise_value_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_to_nearest_precise_value_test.dart
new file mode 100644
index 0000000..01c6749
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_to_nearest_precise_value_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ChangeToNearestPreciseValueTest);
+  });
+}
+
+@reflectiveTest
+class ChangeToNearestPreciseValueTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CHANGE_TO_NEAREST_PRECISE_VALUE;
+
+  test_impreciseIntAsDouble() async {
+    await resolveTestUnit('''
+double x = 1000000000000000000000000;
+''');
+    await assertHasFix('''
+double x = 999999999999999983222784;
+''');
+  }
+
+  test_impreciseIntAsDouble_asCapitalHex() async {
+    await resolveTestUnit('''
+double x = 0X1000000000000000000000001;
+''');
+    await assertHasFix('''
+double x = 0x1000000000000000000000000;
+''');
+  }
+
+  test_impreciseIntAsDouble_asHex() async {
+    await resolveTestUnit('''
+double x = 0x1000000000000000000000001;
+''');
+    await assertHasFix('''
+double x = 0x1000000000000000000000000;
+''');
+  }
+
+  test_impreciseIntAsDouble_maxValue() async {
+    await resolveTestUnit('''
+double x = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
+''');
+    await assertHasFix('''
+double x = 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368;
+''');
+  }
+
+  test_impreciseIntAsDouble_maxValue_asHex() async {
+    await resolveTestUnit('''
+double x = 0x100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
+''');
+    await assertHasFix('''
+double x = 0xFFFFFFFFFFFFF800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
new file mode 100644
index 0000000..507b291
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_to_static_access_test.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ChangeToStaticAccessTest);
+  });
+}
+
+@reflectiveTest
+class ChangeToStaticAccessTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CHANGE_TO_STATIC_ACCESS;
+
+  test_method() async {
+    await resolveTestUnit('''
+class A {
+  static foo() {}
+}
+main(A a) {
+  a.foo();
+}
+''');
+    await assertHasFix('''
+class A {
+  static foo() {}
+}
+main(A a) {
+  A.foo();
+}
+''');
+  }
+
+  test_method_importType() async {
+    addSource('/home/test/lib/a.dart', r'''
+class A {
+  static foo() {}
+}
+''');
+    addSource('/home/test/lib/b.dart', r'''
+import 'package:test/a.dart';
+
+class B extends A {}
+''');
+    await resolveTestUnit('''
+import 'package:test/b.dart';
+
+main(B b) {
+  b.foo();
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+import 'package:test/b.dart';
+
+main(B b) {
+  A.foo();
+}
+''');
+  }
+
+  test_method_prefixLibrary() async {
+    await resolveTestUnit('''
+import 'dart:async' as pref;
+main(pref.Future f) {
+  f.wait([]);
+}
+''');
+    await assertHasFix('''
+import 'dart:async' as pref;
+main(pref.Future f) {
+  pref.Future.wait([]);
+}
+''');
+  }
+
+  test_property() async {
+    await resolveTestUnit('''
+class A {
+  static get foo => 42;
+}
+main(A a) {
+  a.foo;
+}
+''');
+    await assertHasFix('''
+class A {
+  static get foo => 42;
+}
+main(A a) {
+  A.foo;
+}
+''');
+  }
+
+  test_property_importType() async {
+    addSource('/home/test/lib/a.dart', r'''
+class A {
+  static get foo => null;
+}
+''');
+    addSource('/home/test/lib/b.dart', r'''
+import 'package:test/a.dart';
+
+class B extends A {}
+''');
+    await resolveTestUnit('''
+import 'package:test/b.dart';
+
+main(B b) {
+  b.foo;
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+import 'package:test/b.dart';
+
+main(B b) {
+  A.foo;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_to_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_to_test.dart
new file mode 100644
index 0000000..553d1e5
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_to_test.dart
@@ -0,0 +1,332 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ChangeToTest);
+  });
+}
+
+@reflectiveTest
+class ChangeToTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CHANGE_TO;
+
+  test_undefinedClass_fromImport() async {
+    await resolveTestUnit('''
+main() {
+  Stirng s = 'abc';
+  print(s);
+}
+''');
+    await assertHasFix('''
+main() {
+  String s = 'abc';
+  print(s);
+}
+''');
+  }
+
+  test_undefinedClass_fromThisLibrary() async {
+    await resolveTestUnit('''
+class MyClass {}
+main() {
+  MyCalss v = null;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class MyClass {}
+main() {
+  MyClass v = null;
+  print(v);
+}
+''');
+  }
+
+  test_undefinedClass_prefixed() async {
+    await resolveTestUnit('''
+import 'dart:async' as c;
+main() {
+  c.Fture v = null;
+  print(v);
+}
+''');
+    await assertHasFix('''
+import 'dart:async' as c;
+main() {
+  c.Future v = null;
+  print(v);
+}
+''');
+  }
+
+  test_undefinedFunction_fromImport() async {
+    await resolveTestUnit('''
+main() {
+  pritn(0);
+}
+''');
+    await assertHasFix('''
+main() {
+  print(0);
+}
+''');
+  }
+
+  test_undefinedFunction_prefixed_fromImport() async {
+    await resolveTestUnit('''
+import 'dart:core' as c;
+main() {
+  c.prnt(42);
+}
+''');
+    await assertHasFix('''
+import 'dart:core' as c;
+main() {
+  c.print(42);
+}
+''');
+  }
+
+  test_undefinedFunction_prefixed_ignoreLocal() async {
+    await resolveTestUnit('''
+import 'dart:async' as c;
+main() {
+  c.main();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_undefinedFunction_thisLibrary() async {
+    await resolveTestUnit('''
+myFunction() {}
+main() {
+  myFuntcion();
+}
+''');
+    await assertHasFix('''
+myFunction() {}
+main() {
+  myFunction();
+}
+''');
+  }
+
+  test_undefinedGetter_hint() async {
+    await resolveTestUnit('''
+class A {
+  int myField;
+}
+main(A a) {
+  var x = a;
+  print(x.myFild);
+}
+''');
+    await assertHasFix('''
+class A {
+  int myField;
+}
+main(A a) {
+  var x = a;
+  print(x.myField);
+}
+''');
+  }
+
+  test_undefinedGetter_qualified() async {
+    await resolveTestUnit('''
+class A {
+  int myField;
+}
+main(A a) {
+  print(a.myFild);
+}
+''');
+    await assertHasFix('''
+class A {
+  int myField;
+}
+main(A a) {
+  print(a.myField);
+}
+''');
+  }
+
+  test_undefinedGetter_qualified_static() async {
+    await resolveTestUnit('''
+class A {
+  static int MY_NAME = 1;
+}
+main() {
+  A.MY_NAM;
+}
+''');
+    await assertHasFix('''
+class A {
+  static int MY_NAME = 1;
+}
+main() {
+  A.MY_NAME;
+}
+''');
+  }
+
+  test_undefinedGetter_unqualified() async {
+    await resolveTestUnit('''
+class A {
+  int myField;
+  main() {
+    print(myFild);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int myField;
+  main() {
+    print(myField);
+  }
+}
+''');
+  }
+
+  test_undefinedMethod_ignoreOperators() async {
+    await resolveTestUnit('''
+main(Object object) {
+  object.then();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_undefinedMethod_qualified() async {
+    await resolveTestUnit('''
+class A {
+  myMethod() {}
+}
+main() {
+  A a = new A();
+  a.myMehtod();
+}
+''');
+    await assertHasFix('''
+class A {
+  myMethod() {}
+}
+main() {
+  A a = new A();
+  a.myMethod();
+}
+''');
+  }
+
+  test_undefinedMethod_unqualified_superClass() async {
+    await resolveTestUnit('''
+class A {
+  myMethod() {}
+}
+class B extends A {
+  main() {
+    myMehtod();
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  myMethod() {}
+}
+class B extends A {
+  main() {
+    myMethod();
+  }
+}
+''');
+  }
+
+  test_undefinedMethod_unqualified_thisClass() async {
+    await resolveTestUnit('''
+class A {
+  myMethod() {}
+  main() {
+    myMehtod();
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  myMethod() {}
+  main() {
+    myMethod();
+  }
+}
+''');
+  }
+
+  test_undefinedSetter_hint() async {
+    await resolveTestUnit('''
+class A {
+  int myField;
+}
+main(A a) {
+  var x = a;
+  x.myFild = 42;
+}
+''');
+    await assertHasFix('''
+class A {
+  int myField;
+}
+main(A a) {
+  var x = a;
+  x.myField = 42;
+}
+''');
+  }
+
+  test_undefinedSetter_qualified() async {
+    await resolveTestUnit('''
+class A {
+  int myField;
+}
+main(A a) {
+  a.myFild = 42;
+}
+''');
+    await assertHasFix('''
+class A {
+  int myField;
+}
+main(A a) {
+  a.myField = 42;
+}
+''');
+  }
+
+  test_undefinedSetter_unqualified() async {
+    await resolveTestUnit('''
+class A {
+  int myField;
+  main() {
+    myFild = 42;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int myField;
+  main() {
+    myField = 42;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
new file mode 100644
index 0000000..8fbb66a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/change_type_annotation_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ChangeTypeAnnotationTest);
+  });
+}
+
+@reflectiveTest
+class ChangeTypeAnnotationTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CHANGE_TYPE_ANNOTATION;
+
+  test_generic() async {
+    await resolveTestUnit('''
+main() {
+  String v = <int>[];
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  List<int> v = <int>[];
+  print(v);
+}
+''');
+  }
+
+  test_multipleVariables() async {
+    await resolveTestUnit('''
+main() {
+  String a, b = 42;
+  print('\$a \$b');
+}
+''');
+    await assertNoFix();
+  }
+
+  test_notVariableDeclaration() async {
+    await resolveTestUnit('''
+main() {
+  String v;
+  v = 42;
+  print(v);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_simple() async {
+    await resolveTestUnit('''
+main() {
+  String v = 'abc'.length;
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  int v = 'abc'.length;
+  print(v);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart
new file mode 100644
index 0000000..e75321d
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_child_test.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertFlutterChildTest);
+  });
+}
+
+@reflectiveTest
+class ConvertFlutterChildTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CONVERT_FLUTTER_CHILD;
+
+  test_hasList() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Container(
+    child: new Row(
+      child: [
+        new Text('111'),
+        new Text('222'),
+      ],
+    ),
+  );
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Container(
+    child: new Row(
+      children: <Widget>[
+        new Text('111'),
+        new Text('222'),
+      ],
+    ),
+  );
+}
+''');
+  }
+
+  test_hasTypedList() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Container(
+    child: new Row(
+      child: <Widget>[
+        new Text('111'),
+        new Text('222'),
+      ],
+    ),
+  );
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Container(
+    child: new Row(
+      children: <Widget>[
+        new Text('111'),
+        new Text('222'),
+      ],
+    ),
+  );
+}
+''');
+  }
+
+  test_listNotWidget() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Container(
+    child: new Row(
+      child: <Widget>[
+        new Container(),
+        null,
+      ],
+    ),
+  );
+}
+''');
+    await assertNoFix();
+  }
+
+  test_multiLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+    body: new Row(
+      child: new Container(
+        width: 200.0,
+        height: 300.0,
+      ),
+    ),
+  );
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+build() {
+  return new Scaffold(
+    body: new Row(
+      children: <Widget>[
+        new Container(
+          width: 200.0,
+          height: 300.0,
+        ),
+      ],
+    ),
+  );
+}
+''');
+  }
+
+  test_widgetVariable() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+build() {
+  var text = new Text('foo');
+  new Row(
+    child: text,
+  );
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/material.dart';
+build() {
+  var text = new Text('foo');
+  new Row(
+    children: <Widget>[text],
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart
new file mode 100644
index 0000000..f975f0a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_flutter_children_test.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertFlutterChildrenTest);
+  });
+}
+
+@reflectiveTest
+class ConvertFlutterChildrenTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CONVERT_FLUTTER_CHILDREN;
+
+  test_undefinedParameter_multiLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Center(
+    children: [
+      new Container(
+        width: 200.0,
+        height: 300.0,
+      ),
+    ],
+  );
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Center(
+    child: new Container(
+      width: 200.0,
+      height: 300.0,
+    ),
+  );
+}
+''');
+  }
+
+  test_undefinedParameter_notWidget() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Center(
+    children: [
+      new Object(),
+    ],
+  );
+}
+''');
+    await assertNoFix();
+  }
+
+  test_undefinedParameter_singleLine() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Center(
+    children: [
+      new Text('foo'),
+    ],
+  );
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+build() {
+  return new Center(
+    child: new Text('foo'),
+  );
+}
+''');
+  }
+
+  test_undefinedParameter_singleLine2() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+build() {
+  var text = new Text('foo');
+  new Center(
+    children: [text],
+  );
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+build() {
+  var text = new Text('foo');
+  new Center(
+    child: text,
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/convert_to_named_arguments_test.dart b/pkg/analysis_server/test/src/services/correction/fix/convert_to_named_arguments_test.dart
new file mode 100644
index 0000000..de9c388
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/convert_to_named_arguments_test.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToNamedArgumentsTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToNamedArgumentsTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CONVERT_TO_NAMED_ARGUMENTS;
+
+  test_ambiguous() async {
+    await resolveTestUnit('''
+class A {
+  A({int a, int b});
+}
+
+main() {
+  new A(1, 2);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_instanceCreation() async {
+    await resolveTestUnit('''
+class A {
+  A({int a, double b});
+}
+
+main() {
+  new A(1.2, 3);
+}
+''');
+    await assertHasFix('''
+class A {
+  A({int a, double b});
+}
+
+main() {
+  new A(b: 1.2, a: 3);
+}
+''');
+  }
+
+  test_instanceCreation_hasPositional() async {
+    await resolveTestUnit('''
+class A {
+  A(int a, {int b});
+}
+
+main() {
+  new A(1, 2);
+}
+''');
+    await assertHasFix('''
+class A {
+  A(int a, {int b});
+}
+
+main() {
+  new A(1, b: 2);
+}
+''');
+  }
+
+  test_methodInvocation() async {
+    await resolveTestUnit('''
+class C {
+  void foo({int a}) {}
+}
+
+main(C c) {
+  c.foo(1);
+}
+''');
+    await assertHasFix('''
+class C {
+  void foo({int a}) {}
+}
+
+main(C c) {
+  c.foo(a: 1);
+}
+''');
+  }
+
+  test_noCompatibleParameter() async {
+    await resolveTestUnit('''
+class A {
+  A({String a});
+}
+
+main() {
+  new A(1);
+}
+''');
+    await assertNoFix();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
new file mode 100644
index 0000000..610c742
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_class_test.dart
@@ -0,0 +1,181 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateClassTest);
+  });
+}
+
+@reflectiveTest
+class CreateClassTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_CLASS;
+
+  test_hasUnresolvedPrefix() async {
+    await resolveTestUnit('''
+main() {
+  prefix.Test v = null;
+  print(v);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_inLibraryOfPrefix() async {
+    addSource('/home/test/lib/lib.dart', r'''
+class A {}
+''');
+
+    await resolveTestUnit('''
+import 'lib.dart' as lib;
+
+main() {
+  lib.A a = null;
+  lib.Test t = null;
+  print('\$a \$t');
+}
+''');
+
+    await assertHasFix('''
+class A {}
+
+class Test {
+}
+''', target: '/home/test/lib/lib.dart');
+    expect(change.linkedEditGroups, hasLength(1));
+  }
+
+  test_innerLocalFunction() async {
+    await resolveTestUnit('''
+f() {
+  g() {
+    Test v = null;
+    print(v);
+  }
+  g();
+}
+''');
+    await assertHasFix('''
+f() {
+  g() {
+    Test v = null;
+    print(v);
+  }
+  g();
+}
+
+class Test {
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
+  }
+
+  test_instanceCreation_withoutNew_fromFunction() async {
+    await resolveTestUnit('''
+main() {
+  Test ();
+}
+''');
+    await assertHasFix('''
+main() {
+  Test ();
+}
+
+class Test {
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
+  }
+
+  test_instanceCreation_withoutNew_fromMethod() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    Test ();
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  main() {
+    Test ();
+  }
+}
+
+class Test {
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test ()', 'Test {']);
+  }
+
+  test_itemOfList() async {
+    await resolveTestUnit('''
+main() {
+  var a = [Test];
+  print(a);
+}
+''');
+    await assertHasFix('''
+main() {
+  var a = [Test];
+  print(a);
+}
+
+class Test {
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test];', 'Test {']);
+  }
+
+  test_itemOfList_inAnnotation() async {
+    await resolveTestUnit('''
+class MyAnnotation {
+  const MyAnnotation(a, b);
+}
+@MyAnnotation(int, const [Test])
+main() {}
+''');
+    await assertHasFix('''
+class MyAnnotation {
+  const MyAnnotation(a, b);
+}
+@MyAnnotation(int, const [Test])
+main() {}
+
+class Test {
+}
+''', errorFilter: (error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER;
+    });
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test])', 'Test {']);
+  }
+
+  test_simple() async {
+    await resolveTestUnit('''
+main() {
+  Test v = null;
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  Test v = null;
+  print(v);
+}
+
+class Test {
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart
new file mode 100644
index 0000000..fa355b6
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_for_final_fields_test.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateConstructorForFinalFieldsTest);
+  });
+}
+
+@reflectiveTest
+class CreateConstructorForFinalFieldsTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS;
+
+  test_flutter() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  final int a;
+  final int b = 2;
+  final int c;
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  final int a;
+  final int b = 2;
+  final int c;
+
+  const MyWidget({Key key, this.a, this.c}) : super(key: key);
+}
+''', errorFilter: (error) {
+      return error.message.contains("'a'");
+    });
+  }
+
+  test_flutter_childLast() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  final int a;
+  final Widget child;
+  final int b;
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  final int a;
+  final Widget child;
+  final int b;
+
+  const MyWidget({Key key, this.a, this.b, this.child}) : super(key: key);
+}
+''', errorFilter: (error) {
+      return error.message.contains("'a'");
+    });
+  }
+
+  test_flutter_childrenLast() async {
+    addFlutterPackage();
+    await resolveTestUnit('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  final int a;
+  final List<Widget> children;
+  final int b;
+}
+''');
+    await assertHasFix('''
+import 'package:flutter/widgets.dart';
+
+class MyWidget extends StatelessWidget {
+  final int a;
+  final List<Widget> children;
+  final int b;
+
+  const MyWidget({Key key, this.a, this.b, this.children}) : super(key: key);
+}
+''', errorFilter: (error) {
+      return error.message.contains("'a'");
+    });
+  }
+
+  test_inTopLevelMethod() async {
+    await resolveTestUnit('''
+main() {
+  final int v;
+  print(v);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_simple() async {
+    await resolveTestUnit('''
+class Test {
+  final int a;
+  final int b = 2;
+  final int c;
+}
+''');
+    await assertHasFix('''
+class Test {
+  final int a;
+  final int b = 2;
+  final int c;
+
+  Test(this.a, this.c);
+}
+''', errorFilter: (error) {
+      return error.message.contains("'a'");
+    });
+  }
+
+  test_topLevelField() async {
+    await resolveTestUnit('''
+final int v;
+''');
+    await assertNoFix();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart
new file mode 100644
index 0000000..fe59b94
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_super_test.dart
@@ -0,0 +1,156 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateConstructorSuperTest);
+  });
+}
+
+@reflectiveTest
+class CreateConstructorSuperTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR_SUPER;
+
+  test_fieldInitializer() async {
+    await resolveTestUnit('''
+class A {
+  int _field;
+  A(this._field);
+  int get field => _field;
+}
+class B extends A {
+  int existingField;
+
+  void existingMethod() {}
+}
+''');
+    await assertHasFix('''
+class A {
+  int _field;
+  A(this._field);
+  int get field => _field;
+}
+class B extends A {
+  int existingField;
+
+  B(int field) : super(field);
+
+  void existingMethod() {}
+}
+''');
+  }
+
+  test_importType() async {
+    addSource('/home/test/lib/a.dart', r'''
+class A {}
+''');
+    addSource('/home/test/lib/b.dart', r'''
+import 'package:test/a.dart';
+
+class B {
+  B(A a);
+}
+''');
+    await resolveTestUnit('''
+import 'package:test/b.dart';
+
+class C extends B {
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+import 'package:test/b.dart';
+
+class C extends B {
+  C(A a) : super(a);
+}
+''');
+  }
+
+  test_named() async {
+    await resolveTestUnit('''
+class A {
+  A.named(p1, int p2);
+}
+class B extends A {
+  int existingField;
+
+  void existingMethod() {}
+}
+''');
+    await assertHasFix('''
+class A {
+  A.named(p1, int p2);
+}
+class B extends A {
+  int existingField;
+
+  B.named(p1, int p2) : super.named(p1, p2);
+
+  void existingMethod() {}
+}
+''');
+  }
+
+  test_optional() async {
+    await resolveTestUnit('''
+class A {
+  A(p1, int p2, List<String> p3, [int p4]);
+}
+class B extends A {
+  int existingField;
+
+  void existingMethod() {}
+}
+''');
+    await assertHasFix('''
+class A {
+  A(p1, int p2, List<String> p3, [int p4]);
+}
+class B extends A {
+  int existingField;
+
+  B(p1, int p2, List<String> p3) : super(p1, p2, p3);
+
+  void existingMethod() {}
+}
+''');
+  }
+
+  test_private() async {
+    await resolveTestUnit('''
+class A {
+  A._named(p);
+}
+class B extends A {
+}
+''');
+    await assertNoFix();
+  }
+
+  test_typeArgument() async {
+    await resolveTestUnit('''
+class C<T> {
+  final T x;
+  C(this.x);
+}
+class D extends C<int> {
+}''');
+    await assertHasFix('''
+class C<T> {
+  final T x;
+  C(this.x);
+}
+class D extends C<int> {
+  D(int x) : super(x);
+}''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
new file mode 100644
index 0000000..c847a3d
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_constructor_test.dart
@@ -0,0 +1,146 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateConstructorTest);
+    defineReflectiveTests(CreateConstructorMixinTest);
+  });
+}
+
+@reflectiveTest
+class CreateConstructorMixinTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR;
+
+  test_named() async {
+    await resolveTestUnit('''
+mixin M {}
+
+main() {
+  new M.named();
+}
+''');
+    await assertNoFix();
+  }
+}
+
+@reflectiveTest
+class CreateConstructorTest extends FixProcessorTest {
+  static final _text200 = 'x' * 200;
+
+  @override
+  FixKind get kind => DartFixKind.CREATE_CONSTRUCTOR;
+
+  test_inLibrary_insteadOfSyntheticDefault() async {
+    var a = newFile('/home/test/lib/a.dart', content: '''
+/// $_text200
+class A {}
+''').path;
+    await resolveTestUnit('''
+import 'a.dart';
+
+main() {
+  new A.named(1, 2.0);
+}
+''');
+    await assertHasFix('''
+/// $_text200
+class A {
+  A.named(int i, double d);
+}
+''', target: a);
+  }
+
+  test_inLibrary_named() async {
+    var a = newFile('/home/test/lib/a.dart', content: '''
+/// $_text200
+class A {}
+''').path;
+    await resolveTestUnit('''
+import 'a.dart';
+
+main() {
+  new A(1, 2.0);
+}
+''');
+    await assertHasFix('''
+/// $_text200
+class A {
+  A(int i, double d);
+}
+''', target: a);
+  }
+
+  test_insteadOfSyntheticDefault() async {
+    await resolveTestUnit('''
+class A {
+  int field;
+
+  method() {}
+}
+main() {
+  new A(1, 2.0);
+}
+''');
+    await assertHasFix('''
+class A {
+  int field;
+
+  A(int i, double d);
+
+  method() {}
+}
+main() {
+  new A(1, 2.0);
+}
+''');
+  }
+
+  test_named() async {
+    await resolveTestUnit('''
+class A {
+  method() {}
+}
+main() {
+  new A.named(1, 2.0);
+}
+''');
+    await assertHasFix('''
+class A {
+  A.named(int i, double d);
+
+  method() {}
+}
+main() {
+  new A.named(1, 2.0);
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['named(int ', 'named(1']);
+  }
+
+  test_named_emptyClassBody() async {
+    await resolveTestUnit('''
+class A {}
+main() {
+  new A.named(1);
+}
+''');
+    await assertHasFix('''
+class A {
+  A.named(int i);
+}
+main() {
+  new A.named(1);
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['named(int ', 'named(1']);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
new file mode 100644
index 0000000..ed3eee0
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_field_test.dart
@@ -0,0 +1,555 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateFieldTest);
+    defineReflectiveTests(CreateFieldMixinTest);
+  });
+}
+
+@reflectiveTest
+class CreateFieldMixinTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_FIELD;
+
+  test_getter_qualified_instance() async {
+    await resolveTestUnit('''
+mixin M {
+}
+
+main(M m) {
+  int v = m.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+mixin M {
+  int test;
+}
+
+main(M m) {
+  int v = m.test;
+  print(v);
+}
+''');
+  }
+
+  test_setter_qualified_instance_hasField() async {
+    await resolveTestUnit('''
+mixin M {
+  int aaa;
+  int zzz;
+
+  existingMethod() {}
+}
+
+main(M m) {
+  m.test = 5;
+}
+''');
+    await assertHasFix('''
+mixin M {
+  int aaa;
+  int zzz;
+
+  int test;
+
+  existingMethod() {}
+}
+
+main(M m) {
+  m.test = 5;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class CreateFieldTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_FIELD;
+
+  test_getter_multiLevel() async {
+    await resolveTestUnit('''
+class A {
+}
+class B {
+  A a;
+}
+class C {
+  B b;
+}
+main(C c) {
+  int v = c.b.a.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  int test;
+}
+class B {
+  A a;
+}
+class C {
+  B b;
+}
+main(C c) {
+  int v = c.b.a.test;
+  print(v);
+}
+''');
+  }
+
+  test_getter_qualified_instance() async {
+    await resolveTestUnit('''
+class A {
+}
+main(A a) {
+  int v = a.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  int test;
+}
+main(A a) {
+  int v = a.test;
+  print(v);
+}
+''');
+  }
+
+  test_getter_qualified_instance_differentLibrary() async {
+    addSource('/home/test/lib/other.dart', '''
+/**
+ * A comment to push the offset of the braces for the following class
+ * declaration past the end of the content of the test file. Used to catch an
+ * index out of bounds exception that occurs when using the test source instead
+ * of the target source to compute the location at which to insert the field.
+ */
+class A {
+}
+''');
+
+    await resolveTestUnit('''
+import 'package:test/other.dart';
+
+main(A a) {
+  int v = a.test;
+  print(v);
+}
+''');
+
+    await assertHasFix('''
+/**
+ * A comment to push the offset of the braces for the following class
+ * declaration past the end of the content of the test file. Used to catch an
+ * index out of bounds exception that occurs when using the test source instead
+ * of the target source to compute the location at which to insert the field.
+ */
+class A {
+  int test;
+}
+''', target: '/home/test/lib/other.dart');
+  }
+
+  test_getter_qualified_instance_dynamicType() async {
+    await resolveTestUnit('''
+class A {
+  B b;
+  void f(Object p) {
+    p == b.test;
+  }
+}
+class B {
+}
+''');
+    await assertHasFix('''
+class A {
+  B b;
+  void f(Object p) {
+    p == b.test;
+  }
+}
+class B {
+  var test;
+}
+''');
+  }
+
+  test_getter_qualified_propagatedType() async {
+    await resolveTestUnit('''
+class A {
+  A get self => this;
+}
+main() {
+  var a = new A();
+  int v = a.self.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  int test;
+
+  A get self => this;
+}
+main() {
+  var a = new A();
+  int v = a.self.test;
+  print(v);
+}
+''');
+  }
+
+  test_getter_unqualified_instance_asInvocationArgument() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    f(test);
+  }
+}
+f(String s) {}
+''');
+    await assertHasFix('''
+class A {
+  String test;
+
+  main() {
+    f(test);
+  }
+}
+f(String s) {}
+''');
+  }
+
+  test_getter_unqualified_instance_assignmentRhs() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    int v = test;
+    print(v);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int test;
+
+  main() {
+    int v = test;
+    print(v);
+  }
+}
+''');
+  }
+
+  test_getter_unqualified_instance_asStatement() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    test;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  var test;
+
+  main() {
+    test;
+  }
+}
+''');
+  }
+
+  test_hint() async {
+    await resolveTestUnit('''
+class A {
+}
+main(A a) {
+  var x = a;
+  int v = x.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  int test;
+}
+main(A a) {
+  var x = a;
+  int v = x.test;
+  print(v);
+}
+''');
+  }
+
+  test_hint_setter() async {
+    await resolveTestUnit('''
+class A {
+}
+main(A a) {
+  var x = a;
+  x.test = 0;
+}
+''');
+    await assertHasFix('''
+class A {
+  int test;
+}
+main(A a) {
+  var x = a;
+  x.test = 0;
+}
+''');
+  }
+
+  test_importType() async {
+    addSource('/home/test/lib/a.dart', r'''
+class A {}
+''');
+
+    addSource('/home/test/lib/b.dart', r'''
+import 'package:test/a.dart';
+
+A getA() => null;
+''');
+
+    await resolveTestUnit('''
+import 'package:test/b.dart';
+
+class C {
+}
+
+main(C c) {
+  c.test = getA();
+}
+''');
+
+    await assertHasFix('''
+import 'package:test/a.dart';
+import 'package:test/b.dart';
+
+class C {
+  A test;
+}
+
+main(C c) {
+  c.test = getA();
+}
+''');
+  }
+
+  test_inEnum() async {
+    await resolveTestUnit('''
+enum MyEnum {
+  AAA, BBB
+}
+main() {
+  MyEnum.foo;
+}
+''');
+    await assertNoFix();
+  }
+
+  test_inSDK() async {
+    await resolveTestUnit('''
+main(List p) {
+  p.foo = 1;
+}
+''');
+    await assertNoFix();
+  }
+
+  test_invalidInitializer_withoutType() async {
+    await resolveTestUnit('''
+class C {
+  C(this.text);
+}
+''');
+    await assertHasFix('''
+class C {
+  var text;
+
+  C(this.text);
+}
+''');
+  }
+
+  test_invalidInitializer_withType() async {
+    await resolveTestUnit('''
+class C {
+  C(String this.text);
+}
+''');
+    await assertHasFix('''
+class C {
+  String text;
+
+  C(String this.text);
+}
+''');
+  }
+
+  test_setter_generic_BAD() async {
+    await resolveTestUnit('''
+class A {
+}
+class B<T> {
+  List<T> items;
+  main(A a) {
+    a.test = items;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  List test;
+}
+class B<T> {
+  List<T> items;
+  main(A a) {
+    a.test = items;
+  }
+}
+''');
+  }
+
+  test_setter_generic_OK_local() async {
+    await resolveTestUnit('''
+class A<T> {
+  List<T> items;
+
+  main(A a) {
+    test = items;
+  }
+}
+''');
+    await assertHasFix('''
+class A<T> {
+  List<T> items;
+
+  List<T> test;
+
+  main(A a) {
+    test = items;
+  }
+}
+''');
+  }
+
+  test_setter_qualified_instance_hasField() async {
+    await resolveTestUnit('''
+class A {
+  int aaa;
+  int zzz;
+
+  existingMethod() {}
+}
+main(A a) {
+  a.test = 5;
+}
+''');
+    await assertHasFix('''
+class A {
+  int aaa;
+  int zzz;
+
+  int test;
+
+  existingMethod() {}
+}
+main(A a) {
+  a.test = 5;
+}
+''');
+  }
+
+  test_setter_qualified_instance_hasMethod() async {
+    await resolveTestUnit('''
+class A {
+  existingMethod() {}
+}
+main(A a) {
+  a.test = 5;
+}
+''');
+    await assertHasFix('''
+class A {
+  int test;
+
+  existingMethod() {}
+}
+main(A a) {
+  a.test = 5;
+}
+''');
+  }
+
+  test_setter_qualified_static() async {
+    await resolveTestUnit('''
+class A {
+}
+main() {
+  A.test = 5;
+}
+''');
+    await assertHasFix('''
+class A {
+  static int test;
+}
+main() {
+  A.test = 5;
+}
+''');
+  }
+
+  test_setter_unqualified_instance() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    test = 5;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int test;
+
+  main() {
+    test = 5;
+  }
+}
+''');
+  }
+
+  test_setter_unqualified_static() async {
+    await resolveTestUnit('''
+class A {
+  static main() {
+    test = 5;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  static int test;
+
+  static main() {
+    test = 5;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart
new file mode 100644
index 0000000..3bb2fd8
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_file_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateFileTest);
+  });
+}
+
+@reflectiveTest
+class CreateFileTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_FILE;
+
+  test_forImport() async {
+    await resolveTestUnit('''
+import 'my_file.dart';
+''');
+    await assertHasFixWithoutApplying();
+    // validate change
+    List<SourceFileEdit> fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+    SourceFileEdit fileEdit = change.edits[0];
+    expect(fileEdit.file, convertPath('/home/test/lib/my_file.dart'));
+    expect(fileEdit.fileStamp, -1);
+    expect(fileEdit.edits, hasLength(1));
+    expect(
+      fileEdit.edits[0].replacement,
+      contains('// TODO Implement this library.'),
+    );
+  }
+
+  test_forImport_BAD_notDart() async {
+    await resolveTestUnit('''
+import 'my_file.txt';
+''');
+    await assertNoFix();
+  }
+
+  test_forImport_inPackage_lib() async {
+    await resolveTestUnit('''
+import 'a/bb/my_lib.dart';
+''');
+    await assertHasFixWithoutApplying();
+    // validate change
+    List<SourceFileEdit> fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+    SourceFileEdit fileEdit = change.edits[0];
+    expect(fileEdit.file, convertPath('/home/test/lib/a/bb/my_lib.dart'));
+    expect(fileEdit.fileStamp, -1);
+    expect(fileEdit.edits, hasLength(1));
+    expect(
+      fileEdit.edits[0].replacement,
+      contains('// TODO Implement this library.'),
+    );
+  }
+
+  test_forImport_inPackage_test() async {
+    testFile = convertPath('/home/test/test/test.dart');
+    await resolveTestUnit('''
+import 'a/bb/my_lib.dart';
+''');
+    await assertHasFixWithoutApplying();
+    // validate change
+    List<SourceFileEdit> fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+    SourceFileEdit fileEdit = change.edits[0];
+    expect(fileEdit.file, convertPath('/home/test/test/a/bb/my_lib.dart'));
+    expect(fileEdit.fileStamp, -1);
+    expect(fileEdit.edits, hasLength(1));
+    expect(
+      fileEdit.edits[0].replacement,
+      contains('// TODO Implement this library.'),
+    );
+  }
+
+  test_forPart() async {
+    await resolveTestUnit('''
+library my.lib;
+part 'my_part.dart';
+''');
+    await assertHasFixWithoutApplying();
+    // validate change
+    List<SourceFileEdit> fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+    SourceFileEdit fileEdit = change.edits[0];
+    expect(fileEdit.file, convertPath('/home/test/lib/my_part.dart'));
+    expect(fileEdit.fileStamp, -1);
+    expect(fileEdit.edits, hasLength(1));
+    expect(fileEdit.edits[0].replacement, contains('part of my.lib;'));
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
new file mode 100644
index 0000000..6fc4504
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_function_test.dart
@@ -0,0 +1,550 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateFunctionTest);
+  });
+}
+
+@reflectiveTest
+class CreateFunctionTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_FUNCTION;
+
+  assert_returnType_bool(String lineWithTest) async {
+    await resolveTestUnit('''
+main() {
+  bool b = true;
+  $lineWithTest
+  print(b);
+}
+''');
+    await assertHasFix('''
+main() {
+  bool b = true;
+  $lineWithTest
+  print(b);
+}
+
+bool test() {
+}
+''');
+  }
+
+  test_bottomArgument() async {
+    await resolveTestUnit('''
+main() {
+  test(throw 42);
+}
+''');
+    await assertHasFix('''
+main() {
+  test(throw 42);
+}
+
+void test(param0) {
+}
+''');
+  }
+
+  test_duplicateArgumentNames() async {
+    await resolveTestUnit('''
+class C {
+  int x;
+}
+
+foo(C c1, C c2) {
+  bar(c1.x, c2.x);
+}
+''');
+    await assertHasFix('''
+class C {
+  int x;
+}
+
+foo(C c1, C c2) {
+  bar(c1.x, c2.x);
+}
+
+void bar(int x, int x2) {
+}
+''');
+  }
+
+  test_dynamicArgument() async {
+    await resolveTestUnit('''
+main() {
+  dynamic v;
+  test(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  dynamic v;
+  test(v);
+}
+
+void test(v) {
+}
+''');
+  }
+
+  test_dynamicReturnType() async {
+    await resolveTestUnit('''
+main() {
+  dynamic v = test();
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  dynamic v = test();
+  print(v);
+}
+
+test() {
+}
+''');
+  }
+
+  test_fromFunction() async {
+    await resolveTestUnit('''
+main() {
+  int v = myUndefinedFunction(1, 2.0, '3');
+    print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  int v = myUndefinedFunction(1, 2.0, '3');
+    print(v);
+}
+
+int myUndefinedFunction(int i, double d, String s) {
+}
+''');
+  }
+
+  test_fromMethod() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    int v = myUndefinedFunction(1, 2.0, '3');
+    print(v);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  main() {
+    int v = myUndefinedFunction(1, 2.0, '3');
+    print(v);
+  }
+}
+
+int myUndefinedFunction(int i, double d, String s) {
+}
+''');
+  }
+
+  test_functionType_cascadeSecond() async {
+    await resolveTestUnit('''
+class A {
+  B ma() => null;
+}
+class B {
+  useFunction(int g(double a, String b)) {}
+}
+
+main() {
+  A a = new A();
+  a..ma().useFunction(test);
+}
+''');
+    await assertHasFix('''
+class A {
+  B ma() => null;
+}
+class B {
+  useFunction(int g(double a, String b)) {}
+}
+
+main() {
+  A a = new A();
+  a..ma().useFunction(test);
+}
+
+int test(double a, String b) {
+}
+''');
+  }
+
+  test_functionType_coreFunction() async {
+    await resolveTestUnit('''
+main() {
+  useFunction(g: test);
+}
+useFunction({Function g}) {}
+''');
+    await assertHasFix('''
+main() {
+  useFunction(g: test);
+}
+useFunction({Function g}) {}
+
+test() {
+}
+''');
+  }
+
+  test_functionType_dynamicArgument() async {
+    await resolveTestUnit('''
+main() {
+  useFunction(test);
+}
+useFunction(int g(a, b)) {}
+''');
+    await assertHasFix('''
+main() {
+  useFunction(test);
+}
+useFunction(int g(a, b)) {}
+
+int test(a, b) {
+}
+''');
+  }
+
+  test_functionType_function() async {
+    await resolveTestUnit('''
+main() {
+  useFunction(test);
+}
+useFunction(int g(double a, String b)) {}
+''');
+    await assertHasFix('''
+main() {
+  useFunction(test);
+}
+useFunction(int g(double a, String b)) {}
+
+int test(double a, String b) {
+}
+''');
+  }
+
+  test_functionType_function_namedArgument() async {
+    await resolveTestUnit('''
+main() {
+  useFunction(g: test);
+}
+useFunction({int g(double a, String b)}) {}
+''');
+    await assertHasFix('''
+main() {
+  useFunction(g: test);
+}
+useFunction({int g(double a, String b)}) {}
+
+int test(double a, String b) {
+}
+''');
+  }
+
+  test_functionType_importType() async {
+    addSource('/home/test/lib/a.dart', r'''
+class A {}
+''');
+    addSource('/home/test/lib/b.dart', r'''
+import 'package:test/a.dart';
+
+useFunction(int g(A a)) {}
+''');
+    await resolveTestUnit('''
+import 'package:test/b.dart';
+
+main() {
+  useFunction(test);
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+import 'package:test/b.dart';
+
+main() {
+  useFunction(test);
+}
+
+int test(A a) {
+}
+''');
+  }
+
+  test_functionType_notFunctionType() async {
+    await resolveTestUnit('''
+main(A a) {
+  useFunction(a.test);
+}
+typedef A();
+useFunction(g) {}
+''');
+    await assertNoFix();
+  }
+
+  test_generic_type() async {
+    await resolveTestUnit('''
+class A {
+  List<int> items;
+  main() {
+    process(items);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  List<int> items;
+  main() {
+    process(items);
+  }
+}
+
+void process(List<int> items) {
+}
+''');
+    assertLinkedGroup(
+        change.linkedEditGroups[2],
+        ['List<int> items) {'],
+        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
+            ['List<int>', 'Iterable<int>', 'Object']));
+  }
+
+  test_generic_typeParameter() async {
+    await resolveTestUnit('''
+class A<T> {
+  Map<int, T> items;
+  main() {
+    process(items);
+  }
+}
+''');
+    await assertHasFix('''
+class A<T> {
+  Map<int, T> items;
+  main() {
+    process(items);
+  }
+}
+
+void process(Map items) {
+}
+''');
+  }
+
+  test_importType() async {
+    addSource('/home/test/lib/lib.dart', r'''
+library lib;
+import 'dart:async';
+Future getFuture() => null;
+''');
+    await resolveTestUnit('''
+import 'lib.dart';
+main() {
+  test(getFuture());
+}
+''');
+    await assertHasFix('''
+import 'lib.dart';
+main() {
+  test(getFuture());
+}
+
+void test(Future future) {
+}
+''');
+  }
+
+  test_nullArgument() async {
+    await resolveTestUnit('''
+main() {
+  test(null);
+}
+''');
+    await assertHasFix('''
+main() {
+  test(null);
+}
+
+void test(param0) {
+}
+''');
+  }
+
+  test_returnType_bool_and_left() async {
+    await assert_returnType_bool("test() && b;");
+  }
+
+  test_returnType_bool_and_right() async {
+    await assert_returnType_bool("b && test();");
+  }
+
+  test_returnType_bool_assert() async {
+    await assert_returnType_bool("assert ( test() );");
+  }
+
+  test_returnType_bool_do() async {
+    await assert_returnType_bool("do {} while ( test() );");
+  }
+
+  test_returnType_bool_if() async {
+    await assert_returnType_bool("if ( test() ) {}");
+  }
+
+  test_returnType_bool_or_left() async {
+    await assert_returnType_bool("test() || b;");
+  }
+
+  test_returnType_bool_or_right() async {
+    await assert_returnType_bool("b || test();");
+  }
+
+  test_returnType_bool_unaryNegation() async {
+    await assert_returnType_bool("!test();");
+  }
+
+  test_returnType_bool_while() async {
+    await assert_returnType_bool("while ( test() ) {}");
+  }
+
+  test_returnType_fromAssignment_eq() async {
+    await resolveTestUnit('''
+main() {
+  int v;
+  v = myUndefinedFunction();
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  int v;
+  v = myUndefinedFunction();
+  print(v);
+}
+
+int myUndefinedFunction() {
+}
+''');
+  }
+
+  test_returnType_fromAssignment_plusEq() async {
+    await resolveTestUnit('''
+main() {
+  int v;
+  v += myUndefinedFunction();
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  int v;
+  v += myUndefinedFunction();
+  print(v);
+}
+
+num myUndefinedFunction() {
+}
+''');
+  }
+
+  test_returnType_fromBinary_right() async {
+    await resolveTestUnit('''
+main() {
+  0 + myUndefinedFunction();
+}
+''');
+    await assertHasFix('''
+main() {
+  0 + myUndefinedFunction();
+}
+
+num myUndefinedFunction() {
+}
+''');
+  }
+
+  test_returnType_fromInitializer() async {
+    await resolveTestUnit('''
+main() {
+  int v = myUndefinedFunction();
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  int v = myUndefinedFunction();
+  print(v);
+}
+
+int myUndefinedFunction() {
+}
+''');
+  }
+
+  test_returnType_fromInvocationArgument() async {
+    await resolveTestUnit('''
+foo(int p) {}
+main() {
+  foo( myUndefinedFunction() );
+}
+''');
+    await assertHasFix('''
+foo(int p) {}
+main() {
+  foo( myUndefinedFunction() );
+}
+
+int myUndefinedFunction() {
+}
+''');
+  }
+
+  test_returnType_fromReturn() async {
+    await resolveTestUnit('''
+int main() {
+  return myUndefinedFunction();
+}
+''');
+    await assertHasFix('''
+int main() {
+  return myUndefinedFunction();
+}
+
+int myUndefinedFunction() {
+}
+''');
+  }
+
+  test_returnType_void() async {
+    await resolveTestUnit('''
+main() {
+  myUndefinedFunction();
+}
+''');
+    await assertHasFix('''
+main() {
+  myUndefinedFunction();
+}
+
+void myUndefinedFunction() {
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
new file mode 100644
index 0000000..85941b0
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_getter_test.dart
@@ -0,0 +1,363 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateGetterTest);
+    defineReflectiveTests(CreateGetterMixinTest);
+  });
+}
+
+@reflectiveTest
+class CreateGetterMixinTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_GETTER;
+
+  test_qualified_instance() async {
+    await resolveTestUnit('''
+mixin M {
+}
+
+main(M m) {
+  int v = m.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+mixin M {
+  int get test => null;
+}
+
+main(M m) {
+  int v = m.test;
+  print(v);
+}
+''');
+  }
+
+  test_unqualified_instance_assignmentLhs() async {
+    await resolveTestUnit('''
+mixin M {
+  main() {
+    test = 42;
+  }
+}
+''');
+    await assertNoFix();
+  }
+
+  test_unqualified_instance_assignmentRhs() async {
+    await resolveTestUnit('''
+mixin M {
+  main() {
+    int v = test;
+    print(v);
+  }
+}
+''');
+    await assertHasFix('''
+mixin M {
+  int get test => null;
+
+  main() {
+    int v = test;
+    print(v);
+  }
+}
+''');
+  }
+}
+
+@reflectiveTest
+class CreateGetterTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_GETTER;
+
+  test_hint_getter() async {
+    await resolveTestUnit('''
+class A {
+}
+main(A a) {
+  var x = a;
+  int v = x.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  int get test => null;
+}
+main(A a) {
+  var x = a;
+  int v = x.test;
+  print(v);
+}
+''');
+  }
+
+  test_inSDK() async {
+    await resolveTestUnit('''
+main(List p) {
+  int v = p.foo;
+  print(v);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_location_afterLastGetter() async {
+    await resolveTestUnit('''
+class A {
+  int existingField;
+
+  int get existingGetter => null;
+
+  existingMethod() {}
+}
+main(A a) {
+  int v = a.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  int existingField;
+
+  int get existingGetter => null;
+
+  int get test => null;
+
+  existingMethod() {}
+}
+main(A a) {
+  int v = a.test;
+  print(v);
+}
+''');
+  }
+
+  test_multiLevel() async {
+    await resolveTestUnit('''
+class A {
+}
+class B {
+  A a;
+}
+class C {
+  B b;
+}
+main(C c) {
+  int v = c.b.a.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  int get test => null;
+}
+class B {
+  A a;
+}
+class C {
+  B b;
+}
+main(C c) {
+  int v = c.b.a.test;
+  print(v);
+}
+''');
+  }
+
+  test_qualified_instance() async {
+    await resolveTestUnit('''
+class A {
+}
+main(A a) {
+  int v = a.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  int get test => null;
+}
+main(A a) {
+  int v = a.test;
+  print(v);
+}
+''');
+  }
+
+  test_qualified_instance_differentLibrary() async {
+    addSource('/home/test/lib/other.dart', '''
+/**
+ * A comment to push the offset of the braces for the following class
+ * declaration past the end of the content of the test file. Used to catch an
+ * index out of bounds exception that occurs when using the test source instead
+ * of the target source to compute the location at which to insert the field.
+ */
+class A {
+}
+''');
+
+    await resolveTestUnit('''
+import 'package:test/other.dart';
+
+main(A a) {
+  int v = a.test;
+  print(v);
+}
+''');
+
+    await assertHasFix('''
+/**
+ * A comment to push the offset of the braces for the following class
+ * declaration past the end of the content of the test file. Used to catch an
+ * index out of bounds exception that occurs when using the test source instead
+ * of the target source to compute the location at which to insert the field.
+ */
+class A {
+  int get test => null;
+}
+''', target: '/home/test/lib/other.dart');
+  }
+
+  test_qualified_instance_dynamicType() async {
+    await resolveTestUnit('''
+class A {
+  B b;
+  void f(Object p) {
+    p == b.test;
+  }
+}
+class B {
+}
+''');
+    await assertHasFix('''
+class A {
+  B b;
+  void f(Object p) {
+    p == b.test;
+  }
+}
+class B {
+  get test => null;
+}
+''');
+  }
+
+  test_qualified_propagatedType() async {
+    await resolveTestUnit('''
+class A {
+  A get self => this;
+}
+main() {
+  var a = new A();
+  int v = a.self.test;
+  print(v);
+}
+''');
+    await assertHasFix('''
+class A {
+  A get self => this;
+
+  int get test => null;
+}
+main() {
+  var a = new A();
+  int v = a.self.test;
+  print(v);
+}
+''');
+  }
+
+  test_setterContext() async {
+    await resolveTestUnit('''
+class A {
+}
+main(A a) {
+  a.test = 42;
+}
+''');
+    await assertNoFix();
+  }
+
+  test_unqualified_instance_asInvocationArgument() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    f(test);
+  }
+}
+f(String s) {}
+''');
+    await assertHasFix('''
+class A {
+  String get test => null;
+
+  main() {
+    f(test);
+  }
+}
+f(String s) {}
+''');
+  }
+
+  test_unqualified_instance_assignmentLhs() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    test = 42;
+  }
+}
+''');
+    await assertNoFix();
+  }
+
+  test_unqualified_instance_assignmentRhs() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    int v = test;
+    print(v);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int get test => null;
+
+  main() {
+    int v = test;
+    print(v);
+  }
+}
+''');
+  }
+
+  test_unqualified_instance_asStatement() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    test;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  get test => null;
+
+  main() {
+    test;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart
new file mode 100644
index 0000000..933eec9
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_local_variable_test.dart
@@ -0,0 +1,218 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateLocalVariableTest);
+  });
+}
+
+@reflectiveTest
+class CreateLocalVariableTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_LOCAL_VARIABLE;
+
+  test_functionType_named() async {
+    await resolveTestUnit('''
+typedef MY_FUNCTION(int p);
+foo(MY_FUNCTION f) {}
+main() {
+  foo(bar);
+}
+''');
+    await assertHasFix('''
+typedef MY_FUNCTION(int p);
+foo(MY_FUNCTION f) {}
+main() {
+  MY_FUNCTION bar;
+  foo(bar);
+}
+''');
+  }
+
+  test_functionType_named_generic() async {
+    await resolveTestUnit('''
+typedef MY_FUNCTION<T>(T p);
+foo(MY_FUNCTION<int> f) {}
+main() {
+  foo(bar);
+}
+''');
+    await assertHasFix('''
+typedef MY_FUNCTION<T>(T p);
+foo(MY_FUNCTION<int> f) {}
+main() {
+  MY_FUNCTION<int> bar;
+  foo(bar);
+}
+''');
+  }
+
+  test_functionType_synthetic() async {
+    await resolveTestUnit('''
+foo(f(int p)) {}
+main() {
+  foo(bar);
+}
+''');
+    await assertHasFix('''
+foo(f(int p)) {}
+main() {
+  Function(int p) bar;
+  foo(bar);
+}
+''');
+  }
+
+  test_read_typeAssignment() async {
+    await resolveTestUnit('''
+main() {
+  int a = test;
+  print(a);
+}
+''');
+    await assertHasFix('''
+main() {
+  int test;
+  int a = test;
+  print(a);
+}
+''');
+  }
+
+  test_read_typeCondition() async {
+    await resolveTestUnit('''
+main() {
+  if (!test) {
+    print(42);
+  }
+}
+''');
+    await assertHasFix('''
+main() {
+  bool test;
+  if (!test) {
+    print(42);
+  }
+}
+''');
+  }
+
+  test_read_typeInvocationArgument() async {
+    await resolveTestUnit('''
+main() {
+  f(test);
+}
+f(String p) {}
+''');
+    await assertHasFix('''
+main() {
+  String test;
+  f(test);
+}
+f(String p) {}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['String test;']);
+    assertLinkedGroup(change.linkedEditGroups[1], ['test;', 'test);']);
+  }
+
+  test_read_typeInvocationTarget() async {
+    await resolveTestUnit('''
+main() {
+  test.add('hello');
+}
+''');
+    await assertHasFix('''
+main() {
+  var test;
+  test.add('hello');
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['test;', 'test.add(']);
+  }
+
+  test_withImport() async {
+    addPackageFile('pkg', 'a/a.dart', '''
+class A {}
+''');
+    addPackageFile('pkg', 'b/b.dart', '''
+class B {}
+''');
+    addPackageFile('pkg', 'c/c.dart', '''
+import 'package:pkg/a/a.dart';
+import 'package:pkg/b/b.dart';
+
+class C {
+  C(A a, B b);
+}
+''');
+
+    await resolveTestUnit('''
+import 'package:pkg/a/a.dart';
+import 'package:pkg/c/c.dart';
+
+main() {
+  A a;
+  new C(a, b);
+}
+''');
+    await assertHasFix('''
+import 'package:pkg/a/a.dart';
+import 'package:pkg/b/b.dart';
+import 'package:pkg/c/c.dart';
+
+main() {
+  A a;
+  B b;
+  new C(a, b);
+}
+''');
+    List<LinkedEditGroup> groups = change.linkedEditGroups;
+    expect(groups, hasLength(2));
+    LinkedEditGroup typeGroup = groups[0];
+    List<Position> typePositions = typeGroup.positions;
+    expect(typePositions, hasLength(1));
+    expect(typePositions[0].offset, 112);
+    LinkedEditGroup nameGroup = groups[1];
+    List<Position> groupPositions = nameGroup.positions;
+    expect(groupPositions, hasLength(2));
+    expect(groupPositions[0].offset, 114);
+    expect(groupPositions[1].offset, 128);
+  }
+
+  test_write_assignment() async {
+    await resolveTestUnit('''
+main() {
+  test = 42;
+}
+''');
+    await assertHasFix('''
+main() {
+  var test = 42;
+}
+''');
+  }
+
+  test_write_assignment_compound() async {
+    await resolveTestUnit('''
+main() {
+  test += 42;
+}
+''');
+    await assertHasFix('''
+main() {
+  int test;
+  test += 42;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart
new file mode 100644
index 0000000..bf502f1
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_method_test.dart
@@ -0,0 +1,705 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateMethodTest);
+    defineReflectiveTests(CreateMethodMixinTest);
+  });
+}
+
+@reflectiveTest
+class CreateMethodMixinTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_METHOD;
+
+  test_createQualified_instance() async {
+    await resolveTestUnit('''
+mixin M {}
+
+main(M m) {
+  m.myUndefinedMethod();
+}
+''');
+    await assertHasFix('''
+mixin M {
+  void myUndefinedMethod() {}
+}
+
+main(M m) {
+  m.myUndefinedMethod();
+}
+''');
+  }
+
+  test_createQualified_static() async {
+    await resolveTestUnit('''
+mixin M {}
+
+main() {
+  M.myUndefinedMethod();
+}
+''');
+    await assertHasFix('''
+mixin M {
+  static void myUndefinedMethod() {}
+}
+
+main() {
+  M.myUndefinedMethod();
+}
+''');
+  }
+
+  test_createUnqualified() async {
+    await resolveTestUnit('''
+mixin M {
+  main() {
+    myUndefinedMethod();
+  }
+}
+''');
+    await assertHasFix('''
+mixin M {
+  main() {
+    myUndefinedMethod();
+  }
+
+  void myUndefinedMethod() {}
+}
+''');
+  }
+
+  test_functionType_method_enclosingMixin_static() async {
+    await resolveTestUnit('''
+mixin M {
+  static foo() {
+    useFunction(test);
+  }
+}
+
+useFunction(int g(double a, String b)) {}
+''');
+    await assertHasFix('''
+mixin M {
+  static foo() {
+    useFunction(test);
+  }
+
+  static int test(double a, String b) {
+  }
+}
+
+useFunction(int g(double a, String b)) {}
+''');
+  }
+
+  test_functionType_method_targetMixin() async {
+    await resolveTestUnit('''
+main(M m) {
+  useFunction(m.test);
+}
+
+mixin M {
+}
+
+useFunction(int g(double a, String b)) {}
+''');
+    await assertHasFix('''
+main(M m) {
+  useFunction(m.test);
+}
+
+mixin M {
+  int test(double a, String b) {
+  }
+}
+
+useFunction(int g(double a, String b)) {}
+''');
+  }
+}
+
+@reflectiveTest
+class CreateMethodTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_METHOD;
+
+  test_createQualified_emptyClassBody() async {
+    await resolveTestUnit('''
+class A {}
+main() {
+  A.myUndefinedMethod();
+}
+''');
+    await assertHasFix('''
+class A {
+  static void myUndefinedMethod() {}
+}
+main() {
+  A.myUndefinedMethod();
+}
+''');
+  }
+
+  test_createQualified_fromClass() async {
+    await resolveTestUnit('''
+class A {
+}
+main() {
+  A.myUndefinedMethod();
+}
+''');
+    await assertHasFix('''
+class A {
+  static void myUndefinedMethod() {}
+}
+main() {
+  A.myUndefinedMethod();
+}
+''');
+  }
+
+  test_createQualified_fromClass_hasOtherMember() async {
+    await resolveTestUnit('''
+class A {
+  foo() {}
+}
+main() {
+  A.myUndefinedMethod();
+}
+''');
+    await assertHasFix('''
+class A {
+  foo() {}
+
+  static void myUndefinedMethod() {}
+}
+main() {
+  A.myUndefinedMethod();
+}
+''');
+  }
+
+  test_createQualified_fromInstance() async {
+    await resolveTestUnit('''
+class A {
+}
+main(A a) {
+  a.myUndefinedMethod();
+}
+''');
+    await assertHasFix('''
+class A {
+  void myUndefinedMethod() {}
+}
+main(A a) {
+  a.myUndefinedMethod();
+}
+''');
+  }
+
+  test_createQualified_targetIsFunctionType() async {
+    await resolveTestUnit('''
+typedef A();
+main() {
+  A.myUndefinedMethod();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_createQualified_targetIsUnresolved() async {
+    await resolveTestUnit('''
+main() {
+  NoSuchClass.myUndefinedMethod();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_createUnqualified_duplicateArgumentNames() async {
+    await resolveTestUnit('''
+class C {
+  int x;
+}
+
+class D {
+  foo(C c1, C c2) {
+    bar(c1.x, c2.x);
+  }
+}''');
+    await assertHasFix('''
+class C {
+  int x;
+}
+
+class D {
+  foo(C c1, C c2) {
+    bar(c1.x, c2.x);
+  }
+
+  void bar(int x, int x2) {}
+}''');
+  }
+
+  test_createUnqualified_parameters() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    myUndefinedMethod(0, 1.0, '3');
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  main() {
+    myUndefinedMethod(0, 1.0, '3');
+  }
+
+  void myUndefinedMethod(int i, double d, String s) {}
+}
+''');
+    // linked positions
+    int index = 0;
+    assertLinkedGroup(
+        change.linkedEditGroups[index++], ['void myUndefinedMethod(']);
+    assertLinkedGroup(change.linkedEditGroups[index++],
+        ['myUndefinedMethod(0', 'myUndefinedMethod(int']);
+    assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['int i'],
+        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
+            ['int', 'num', 'Object', 'Comparable<num>']));
+    assertLinkedGroup(change.linkedEditGroups[index++], ['i,']);
+    assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['double d'],
+        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
+            ['double', 'num', 'Object', 'Comparable<num>']));
+    assertLinkedGroup(change.linkedEditGroups[index++], ['d,']);
+    assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['String s'],
+        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
+            ['String', 'Object', 'Comparable<String>', 'Pattern']));
+    assertLinkedGroup(change.linkedEditGroups[index++], ['s)']);
+  }
+
+  test_createUnqualified_parameters_named() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    myUndefinedMethod(0, bbb: 1.0, ccc: '2');
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  main() {
+    myUndefinedMethod(0, bbb: 1.0, ccc: '2');
+  }
+
+  void myUndefinedMethod(int i, {double bbb, String ccc}) {}
+}
+''');
+    // linked positions
+    int index = 0;
+    assertLinkedGroup(
+        change.linkedEditGroups[index++], ['void myUndefinedMethod(']);
+    assertLinkedGroup(change.linkedEditGroups[index++],
+        ['myUndefinedMethod(0', 'myUndefinedMethod(int']);
+    assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['int i'],
+        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
+            ['int', 'num', 'Object', 'Comparable<num>']));
+    assertLinkedGroup(change.linkedEditGroups[index++], ['i,']);
+    assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['double bbb'],
+        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
+            ['double', 'num', 'Object', 'Comparable<num>']));
+    assertLinkedGroup(
+        change.linkedEditGroups[index++],
+        ['String ccc'],
+        expectedSuggestions(LinkedEditSuggestionKind.TYPE,
+            ['String', 'Object', 'Comparable<String>', 'Pattern']));
+  }
+
+  test_createUnqualified_returnType() async {
+    await resolveTestUnit('''
+class A {
+  main() {
+    int v = myUndefinedMethod();
+    print(v);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  main() {
+    int v = myUndefinedMethod();
+    print(v);
+  }
+
+  int myUndefinedMethod() {}
+}
+''');
+    // linked positions
+    assertLinkedGroup(change.linkedEditGroups[0], ['int myUndefinedMethod(']);
+    assertLinkedGroup(change.linkedEditGroups[1],
+        ['myUndefinedMethod();', 'myUndefinedMethod() {']);
+  }
+
+  test_createUnqualified_staticFromField() async {
+    await resolveTestUnit('''
+class A {
+  static var f = myUndefinedMethod();
+}
+''');
+    await assertHasFix('''
+class A {
+  static var f = myUndefinedMethod();
+
+  static myUndefinedMethod() {}
+}
+''');
+  }
+
+  test_createUnqualified_staticFromMethod() async {
+    await resolveTestUnit('''
+class A {
+  static main() {
+    myUndefinedMethod();
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  static main() {
+    myUndefinedMethod();
+  }
+
+  static void myUndefinedMethod() {}
+}
+''');
+  }
+
+  test_functionType_method_enclosingClass_static() async {
+    await resolveTestUnit('''
+class A {
+  static foo() {
+    useFunction(test);
+  }
+}
+useFunction(int g(double a, String b)) {}
+''');
+    await assertHasFix('''
+class A {
+  static foo() {
+    useFunction(test);
+  }
+
+  static int test(double a, String b) {
+  }
+}
+useFunction(int g(double a, String b)) {}
+''');
+  }
+
+  test_functionType_method_enclosingClass_static2() async {
+    await resolveTestUnit('''
+class A {
+  var f;
+  A() : f = useFunction(test);
+}
+useFunction(int g(double a, String b)) {}
+''');
+    await assertHasFix('''
+class A {
+  var f;
+  A() : f = useFunction(test);
+
+  static int test(double a, String b) {
+  }
+}
+useFunction(int g(double a, String b)) {}
+''');
+  }
+
+  test_functionType_method_targetClass() async {
+    await resolveTestUnit('''
+main(A a) {
+  useFunction(a.test);
+}
+class A {
+}
+useFunction(int g(double a, String b)) {}
+''');
+    await assertHasFix('''
+main(A a) {
+  useFunction(a.test);
+}
+class A {
+  int test(double a, String b) {
+  }
+}
+useFunction(int g(double a, String b)) {}
+''');
+  }
+
+  test_functionType_method_targetClass_hasOtherMember() async {
+    await resolveTestUnit('''
+main(A a) {
+  useFunction(a.test);
+}
+class A {
+  m() {}
+}
+useFunction(int g(double a, String b)) {}
+''');
+    await assertHasFix('''
+main(A a) {
+  useFunction(a.test);
+}
+class A {
+  m() {}
+
+  int test(double a, String b) {
+  }
+}
+useFunction(int g(double a, String b)) {}
+''');
+  }
+
+  test_functionType_notFunctionType() async {
+    await resolveTestUnit('''
+main(A a) {
+  useFunction(a.test);
+}
+typedef A();
+useFunction(g) {}
+''');
+    await assertNoFix();
+  }
+
+  test_functionType_unknownTarget() async {
+    await resolveTestUnit('''
+main(A a) {
+  useFunction(a.test);
+}
+class A {
+}
+useFunction(g) {}
+''');
+    await assertNoFix();
+  }
+
+  test_generic_argumentType() async {
+    await resolveTestUnit('''
+class A<T> {
+  B b;
+  Map<int, T> items;
+  main() {
+    b.process(items);
+  }
+}
+
+class B {
+}
+''');
+    await assertHasFix('''
+class A<T> {
+  B b;
+  Map<int, T> items;
+  main() {
+    b.process(items);
+  }
+}
+
+class B {
+  void process(Map items) {}
+}
+''');
+  }
+
+  test_generic_literal() async {
+    await resolveTestUnit('''
+class A {
+  B b;
+  List<int> items;
+  main() {
+    b.process(items);
+  }
+}
+
+class B {}
+''');
+    await assertHasFix('''
+class A {
+  B b;
+  List<int> items;
+  main() {
+    b.process(items);
+  }
+}
+
+class B {
+  void process(List<int> items) {}
+}
+''');
+  }
+
+  test_generic_local() async {
+    await resolveTestUnit('''
+class A<T> {
+  List<T> items;
+  main() {
+    process(items);
+  }
+}
+''');
+    await assertHasFix('''
+class A<T> {
+  List<T> items;
+  main() {
+    process(items);
+  }
+
+  void process(List<T> items) {}
+}
+''');
+  }
+
+  test_generic_returnType() async {
+    await resolveTestUnit('''
+class A<T> {
+  main() {
+    T t = new B().compute();
+    print(t);
+  }
+}
+
+class B {
+}
+''');
+    await assertHasFix('''
+class A<T> {
+  main() {
+    T t = new B().compute();
+    print(t);
+  }
+}
+
+class B {
+  compute() {}
+}
+''');
+  }
+
+  test_hint_createQualified_fromInstance() async {
+    await resolveTestUnit('''
+class A {
+}
+main() {
+  var a = new A();
+  a.myUndefinedMethod();
+}
+''');
+    await assertHasFix('''
+class A {
+  void myUndefinedMethod() {}
+}
+main() {
+  var a = new A();
+  a.myUndefinedMethod();
+}
+''');
+  }
+
+  test_inSDK() async {
+    await resolveTestUnit('''
+main() {
+  List.foo();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_parameterType_differentPrefixInTargetUnit() async {
+    String code2 = r'''
+import 'test3.dart' as bbb;
+export 'test3.dart';
+
+class D {
+}
+''';
+
+    addSource('/home/test/lib/test2.dart', code2);
+    addSource('/home/test/lib/test3.dart', r'''
+library test3;
+class E {}
+''');
+
+    await resolveTestUnit('''
+import 'test2.dart' as aaa;
+
+main(aaa.D d, aaa.E e) {
+  d.foo(e);
+}
+''');
+
+    await assertHasFix('''
+import 'test3.dart' as bbb;
+export 'test3.dart';
+
+class D {
+  void foo(bbb.E e) {}
+}
+''', target: '/home/test/lib/test2.dart');
+  }
+
+  test_parameterType_inTargetUnit() async {
+    addSource('/home/test/lib/test2.dart', r'''
+class D {
+}
+
+class E {}
+''');
+
+    await resolveTestUnit('''
+import 'test2.dart' as test2;
+
+main(test2.D d, test2.E e) {
+  d.foo(e);
+}
+''');
+
+    await assertHasFix('''
+class D {
+  void foo(E e) {}
+}
+
+class E {}
+''', target: '/home/test/lib/test2.dart');
+  }
+
+  test_targetIsEnum() async {
+    await resolveTestUnit('''
+enum MyEnum {A, B}
+main() {
+  MyEnum.foo();
+}
+''');
+    await assertNoFix();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
new file mode 100644
index 0000000..7656709
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
@@ -0,0 +1,520 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateMissingOverridesTest);
+  });
+}
+
+@reflectiveTest
+class CreateMissingOverridesTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_MISSING_OVERRIDES;
+
+  test_field_untyped() async {
+    await resolveTestUnit('''
+class A {
+  var f;
+}
+
+class B implements A {
+}
+''');
+    await assertHasFix('''
+class A {
+  var f;
+}
+
+class B implements A {
+  @override
+  var f;
+}
+''');
+  }
+
+  test_functionTypeAlias() async {
+    await resolveTestUnit('''
+typedef int Binary(int left, int right);
+
+abstract class Emulator {
+  void performBinary(Binary binary);
+}
+
+class MyEmulator extends Emulator {
+}
+''');
+    await assertHasFix('''
+typedef int Binary(int left, int right);
+
+abstract class Emulator {
+  void performBinary(Binary binary);
+}
+
+class MyEmulator extends Emulator {
+  @override
+  void performBinary(Binary binary) {
+    // TODO: implement performBinary
+  }
+}
+''');
+  }
+
+  test_functionTypedParameter() async {
+    await resolveTestUnit('''
+abstract class A {
+  void forEach(int f(double p1, String p2));
+}
+
+class B extends A {
+}
+''');
+    await assertHasFix('''
+abstract class A {
+  void forEach(int f(double p1, String p2));
+}
+
+class B extends A {
+  @override
+  void forEach(int Function(double p1, String p2) f) {
+    // TODO: implement forEach
+  }
+}
+''');
+  }
+
+  test_generics_typeArguments() async {
+    await resolveTestUnit('''
+class Iterator<T> {
+}
+
+abstract class IterableMixin<T> {
+  Iterator<T> get iterator;
+}
+
+class Test extends IterableMixin<int> {
+}
+''');
+    await assertHasFix('''
+class Iterator<T> {
+}
+
+abstract class IterableMixin<T> {
+  Iterator<T> get iterator;
+}
+
+class Test extends IterableMixin<int> {
+  @override
+  // TODO: implement iterator
+  Iterator<int> get iterator => null;
+}
+''');
+  }
+
+  test_generics_typeParameters() async {
+    await resolveTestUnit('''
+abstract class ItemProvider<T> {
+  List<T> getItems();
+}
+
+class Test<V> extends ItemProvider<V> {
+}
+''');
+    await assertHasFix('''
+abstract class ItemProvider<T> {
+  List<T> getItems();
+}
+
+class Test<V> extends ItemProvider<V> {
+  @override
+  List<V> getItems() {
+    // TODO: implement getItems
+    return null;
+  }
+}
+''');
+  }
+
+  test_getter() async {
+    await resolveTestUnit('''
+abstract class A {
+  get g1;
+  int get g2;
+}
+
+class B extends A {
+}
+''');
+    await assertHasFix('''
+abstract class A {
+  get g1;
+  int get g2;
+}
+
+class B extends A {
+  @override
+  // TODO: implement g1
+  get g1 => null;
+
+  @override
+  // TODO: implement g2
+  int get g2 => null;
+}
+''');
+  }
+
+  test_importPrefix() async {
+    await resolveTestUnit('''
+import 'dart:async' as aaa;
+abstract class A {
+  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
+}
+
+class B extends A {
+}
+''');
+    await assertHasFix('''
+import 'dart:async' as aaa;
+abstract class A {
+  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
+}
+
+class B extends A {
+  @override
+  Map<aaa.Future, List<aaa.Future>> g(aaa.Future p) {
+    // TODO: implement g
+    return null;
+  }
+}
+''');
+  }
+
+  test_mergeToField_getterSetter() async {
+    await resolveTestUnit('''
+class A {
+  int ma;
+  void mb() {}
+  double mc;
+}
+
+class B implements A {
+}
+''');
+    await assertHasFix('''
+class A {
+  int ma;
+  void mb() {}
+  double mc;
+}
+
+class B implements A {
+  @override
+  int ma;
+
+  @override
+  double mc;
+
+  @override
+  void mb() {
+    // TODO: implement mb
+  }
+}
+''');
+  }
+
+  test_method() async {
+    await resolveTestUnit('''
+abstract class A {
+  void m1();
+  int m2();
+  String m3(int p1, double p2, Map<int, List<String>> p3);
+  String m4(p1, p2);
+  String m5(p1, [int p2 = 2, int p3, p4 = 4]);
+  String m6(p1, {int p2 = 2, int p3, p4: 4});
+}
+
+class B extends A {
+}
+''');
+    String expectedCode = '''
+abstract class A {
+  void m1();
+  int m2();
+  String m3(int p1, double p2, Map<int, List<String>> p3);
+  String m4(p1, p2);
+  String m5(p1, [int p2 = 2, int p3, p4 = 4]);
+  String m6(p1, {int p2 = 2, int p3, p4: 4});
+}
+
+class B extends A {
+  @override
+  void m1() {
+    // TODO: implement m1
+  }
+
+  @override
+  int m2() {
+    // TODO: implement m2
+    return null;
+  }
+
+  @override
+  String m3(int p1, double p2, Map<int, List<String>> p3) {
+    // TODO: implement m3
+    return null;
+  }
+
+  @override
+  String m4(p1, p2) {
+    // TODO: implement m4
+    return null;
+  }
+
+  @override
+  String m5(p1, [int p2 = 2, int p3, p4 = 4]) {
+    // TODO: implement m5
+    return null;
+  }
+
+  @override
+  String m6(p1, {int p2 = 2, int p3, p4 = 4}) {
+    // TODO: implement m6
+    return null;
+  }
+}
+''';
+    await assertHasFix(expectedCode);
+    {
+      // end position should be on "m1", not on "m2", "m3", etc.
+      Position endPosition = change.selection;
+      expect(endPosition, isNotNull);
+      expect(endPosition.file, testFile);
+      int endOffset = endPosition.offset;
+      String endString = expectedCode.substring(endOffset, endOffset + 25);
+      expect(endString, contains('m1'));
+      expect(endString, isNot(contains('m2')));
+      expect(endString, isNot(contains('m3')));
+      expect(endString, isNot(contains('m4')));
+      expect(endString, isNot(contains('m5')));
+      expect(endString, isNot(contains('m6')));
+    }
+  }
+
+  test_method_emptyClassBody() async {
+    await resolveTestUnit('''
+abstract class A {
+  void foo();
+}
+
+class B extends A {}
+''');
+    await assertHasFix('''
+abstract class A {
+  void foo();
+}
+
+class B extends A {
+  @override
+  void foo() {
+    // TODO: implement foo
+  }
+}
+''');
+  }
+
+  test_method_generic() async {
+    await resolveTestUnit('''
+class C<T> {}
+class V<E> {}
+
+abstract class A {
+  E1 foo<E1, E2 extends C<int>>(V<E2> v);
+}
+
+class B implements A {
+}
+''');
+    await assertHasFix('''
+class C<T> {}
+class V<E> {}
+
+abstract class A {
+  E1 foo<E1, E2 extends C<int>>(V<E2> v);
+}
+
+class B implements A {
+  @override
+  E1 foo<E1, E2 extends C<int>>(V<E2> v) {
+    // TODO: implement foo
+    return null;
+  }
+}
+''');
+  }
+
+  test_method_generic_withBounds() async {
+    // https://github.com/dart-lang/sdk/issues/31199
+    await resolveTestUnit('''
+abstract class A<K, V> {
+  List<T> foo<T extends V>(K key);
+}
+
+class B<K, V> implements A<K, V> {
+}
+''');
+    await assertHasFix('''
+abstract class A<K, V> {
+  List<T> foo<T extends V>(K key);
+}
+
+class B<K, V> implements A<K, V> {
+  @override
+  List<T> foo<T extends V>(K key) {
+    // TODO: implement foo
+    return null;
+  }
+}
+''');
+  }
+
+  test_method_genericClass2() async {
+    await resolveTestUnit('''
+class A<R> {
+  R foo(int a) => null;
+}
+
+class B<R> extends A<R> {
+  R bar(double b) => null;
+}
+
+class X implements B<bool> {
+}
+''');
+    await assertHasFix('''
+class A<R> {
+  R foo(int a) => null;
+}
+
+class B<R> extends A<R> {
+  R bar(double b) => null;
+}
+
+class X implements B<bool> {
+  @override
+  bool bar(double b) {
+    // TODO: implement bar
+    return null;
+  }
+
+  @override
+  bool foo(int a) {
+    // TODO: implement foo
+    return null;
+  }
+}
+''');
+  }
+
+  test_method_notEmptyClassBody() async {
+    await resolveTestUnit('''
+abstract class A {
+  void foo();
+}
+
+class B extends A {
+  void bar() {}
+}
+''');
+    await assertHasFix('''
+abstract class A {
+  void foo();
+}
+
+class B extends A {
+  void bar() {}
+
+  @override
+  void foo() {
+    // TODO: implement foo
+  }
+}
+''');
+  }
+
+  test_operator() async {
+    await resolveTestUnit('''
+abstract class A {
+  int operator [](int index);
+  void operator []=(int index, String value);
+}
+
+class B extends A {
+}
+''');
+    await assertHasFix('''
+abstract class A {
+  int operator [](int index);
+  void operator []=(int index, String value);
+}
+
+class B extends A {
+  @override
+  int operator [](int index) {
+    // TODO: implement []
+    return null;
+  }
+
+  @override
+  void operator []=(int index, String value) {
+    // TODO: implement []=
+  }
+}
+''');
+  }
+
+  test_setter() async {
+    await resolveTestUnit('''
+abstract class A {
+  set s1(x);
+  set s2(int x);
+  void set s3(String x);
+}
+
+class B extends A {
+}
+''');
+    await assertHasFix('''
+abstract class A {
+  set s1(x);
+  set s2(int x);
+  void set s3(String x);
+}
+
+class B extends A {
+  @override
+  void set s1(x) {
+    // TODO: implement s1
+  }
+
+  @override
+  void set s2(int x) {
+    // TODO: implement s2
+  }
+
+  @override
+  void set s3(String x) {
+    // TODO: implement s3
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart
new file mode 100644
index 0000000..463f417
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_mixin_test.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateMixinTest);
+  });
+}
+
+@reflectiveTest
+class CreateMixinTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_MIXIN;
+
+  test_hasUnresolvedPrefix() async {
+    await resolveTestUnit('''
+main() {
+  prefix.Test v = null;
+  print(v);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_inLibraryOfPrefix() async {
+    String libCode = r'''
+class A {}
+''';
+    addSource('/home/test/lib/lib.dart', libCode);
+    await resolveTestUnit('''
+import 'lib.dart' as lib;
+
+main() {
+  lib.A a = null;
+  lib.Test t = null;
+  print('\$a \$t');
+}
+''');
+    await assertHasFix('''
+class A {}
+
+mixin Test {
+}
+''', target: '/home/test/lib/lib.dart');
+    expect(change.linkedEditGroups, hasLength(1));
+  }
+
+  test_innerLocalFunction() async {
+    await resolveTestUnit('''
+f() {
+  g() {
+    Test v = null;
+    print(v);
+  }
+  g();
+}
+''');
+    await assertHasFix('''
+f() {
+  g() {
+    Test v = null;
+    print(v);
+  }
+  g();
+}
+
+mixin Test {
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
+  }
+
+  test_instanceCreation_withNew() async {
+    await resolveTestUnit('''
+main() {
+  new Test();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_instanceCreation_withoutNew() async {
+    await resolveTestUnit('''
+main() {
+  Test();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_itemOfList() async {
+    await resolveTestUnit('''
+main() {
+  var a = [Test];
+  print(a);
+}
+''');
+    await assertHasFix('''
+main() {
+  var a = [Test];
+  print(a);
+}
+
+mixin Test {
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test];', 'Test {']);
+  }
+
+  test_itemOfList_inAnnotation() async {
+    await resolveTestUnit('''
+class MyAnnotation {
+  const MyAnnotation(a, b);
+}
+@MyAnnotation(int, const [Test])
+main() {}
+''');
+    await assertHasFix('''
+class MyAnnotation {
+  const MyAnnotation(a, b);
+}
+@MyAnnotation(int, const [Test])
+main() {}
+
+mixin Test {
+}
+''', errorFilter: (error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER;
+    });
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test])', 'Test {']);
+  }
+
+  test_simple() async {
+    await resolveTestUnit('''
+main() {
+  Test v = null;
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  Test v = null;
+  print(v);
+}
+
+mixin Test {
+}
+''');
+    assertLinkedGroup(change.linkedEditGroups[0], ['Test v =', 'Test {']);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_no_such_method_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_no_such_method_test.dart
new file mode 100644
index 0000000..5799c31
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_no_such_method_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CreateNoSuchMethodTest);
+  });
+}
+
+@reflectiveTest
+class CreateNoSuchMethodTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.CREATE_NO_SUCH_METHOD;
+
+  test_class() async {
+    await resolveTestUnit('''
+abstract class A {
+  m1();
+  int m2();
+}
+
+class B extends A {
+  existing() {}
+}
+''');
+    await assertHasFix('''
+abstract class A {
+  m1();
+  int m2();
+}
+
+class B extends A {
+  existing() {}
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+''');
+  }
+
+  test_classTypeAlias() async {
+    await resolveTestUnit('''
+abstract class A {
+  m();
+}
+
+class B = Object with A;
+''');
+    await assertNoFix();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/extend_class_for_mixin_test.dart b/pkg/analysis_server/test/src/services/correction/fix/extend_class_for_mixin_test.dart
new file mode 100644
index 0000000..d65e90a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/extend_class_for_mixin_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtendClassForMixinTest);
+  });
+}
+
+@reflectiveTest
+class ExtendClassForMixinTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.EXTEND_CLASS_FOR_MIXIN;
+
+  test_missingClass_withExtends() async {
+    await resolveTestUnit('''
+class A {}
+class B {}
+mixin M on B {}
+class C extends A with M {}
+''');
+    await assertNoFix();
+  }
+
+  test_missingClass_withoutExtends_withImplements() async {
+    await resolveTestUnit('''
+class A {}
+class B {}
+mixin M on B {}
+class C with M implements A {}
+''');
+    await assertHasFix('''
+class A {}
+class B {}
+mixin M on B {}
+class C extends B with M implements A {}
+''');
+  }
+
+  test_missingClass_withoutExtends_withoutImplements() async {
+    await resolveTestUnit('''
+class A {}
+mixin M on A {}
+class C with M {}
+''');
+    await assertHasFix('''
+class A {}
+mixin M on A {}
+class C extends A with M {}
+''');
+  }
+
+  test_missingMixin_withExtends() async {
+    await resolveTestUnit('''
+class A {}
+mixin M {}
+mixin N on M {}
+class C extends A with N {}
+''');
+    await assertNoFix();
+  }
+
+  @failingTest
+  test_missingMixin_withoutExtends() async {
+    await resolveTestUnit('''
+mixin M {}
+mixin N on M {}
+class C with N {}
+''');
+    await assertNoFix();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
new file mode 100644
index 0000000..e9b5fa2
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -0,0 +1,272 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server/plugin/edit/fix/fix_core.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/error/lint_codes.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart'
+    hide AnalysisError;
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/test.dart';
+
+import '../../../../abstract_single_unit.dart';
+
+/// A base class defining support for writing fix processor tests that are
+/// specific to fixes associated with lints that use the FixKind.
+abstract class FixProcessorLintTest extends FixProcessorTest {
+  /// Return the lint code being tested.
+  String get lintCode;
+
+  /// Find the error that is to be fixed by computing the errors in the file,
+  /// using the [errorFilter] to filter out errors that should be ignored, and
+  /// expecting that there is a single remaining error. The error filter should
+  /// return `true` if the error should not be ignored.
+  Future<AnalysisError> _findErrorToFix(
+      bool Function(AnalysisError) errorFilter,
+      {int length}) async {
+    int index = testCode.indexOf('/*LINT*/');
+    if (index < 0) {
+      fail('Missing "/*LINT*/" marker');
+    }
+    return new AnalysisError(testSource, index + '/*LINT*/'.length, length ?? 0,
+        new LintCode(lintCode, '<ignored>'));
+  }
+}
+
+/// A base class defining support for writing fix processor tests.
+abstract class FixProcessorTest extends AbstractSingleUnitTest {
+  /// The errors in the file for which fixes are being computed.
+  List<AnalysisError> _errors;
+
+  /// The source change associated with the fix that was found, or `null` if
+  /// neither [assertHasFix] nor [assertHasFixAllFix] has been invoked.
+  SourceChange change;
+
+  /// The result of applying the [change] to the file content, or `null` if
+  /// neither [assertHasFix] nor [assertHasFixAllFix] has been invoked.
+  String resultCode;
+
+  /// Return the kind of fixes being tested by this test class.
+  FixKind get kind;
+
+  /// The workspace in which fixes contributor operates.
+  ChangeWorkspace get workspace {
+    return DartChangeWorkspace([session]);
+  }
+
+  Future<void> assertHasFix(String expected,
+      {bool Function(AnalysisError) errorFilter,
+      int length,
+      String target}) async {
+    AnalysisError error = await _findErrorToFix(errorFilter, length: length);
+    Fix fix = await _assertHasFix(error);
+    change = fix.change;
+
+    // apply to "file"
+    List<SourceFileEdit> fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+
+    String fileContent = testCode;
+    if (target != null) {
+      expect(fileEdits.first.file, convertPath(target));
+      fileContent = getFile(target).readAsStringSync();
+    }
+
+    resultCode = SourceEdit.applySequence(fileContent, change.edits[0].edits);
+    expect(resultCode, expected);
+  }
+
+  assertHasFixAllFix(ErrorCode errorCode, String expected,
+      {String target}) async {
+    AnalysisError error = await _findErrorToFixOfType(errorCode);
+    Fix fix = await _assertHasFixAllFix(error);
+    change = fix.change;
+
+    // apply to "file"
+    List<SourceFileEdit> fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+
+    String fileContent = testCode;
+    if (target != null) {
+      expect(fileEdits.first.file, convertPath(target));
+      fileContent = getFile(target).readAsStringSync();
+    }
+
+    resultCode = SourceEdit.applySequence(fileContent, change.edits[0].edits);
+    expect(resultCode, expected);
+  }
+
+  Future<void> assertHasFixWithoutApplying(
+      {bool Function(AnalysisError) errorFilter}) async {
+    AnalysisError error = await _findErrorToFix(errorFilter);
+    Fix fix = await _assertHasFix(error);
+    change = fix.change;
+  }
+
+  void assertLinkedGroup(LinkedEditGroup group, List<String> expectedStrings,
+      [List<LinkedEditSuggestion> expectedSuggestions]) {
+    List<Position> expectedPositions = _findResultPositions(expectedStrings);
+    expect(group.positions, unorderedEquals(expectedPositions));
+    if (expectedSuggestions != null) {
+      expect(group.suggestions, unorderedEquals(expectedSuggestions));
+    }
+  }
+
+  /// Compute fixes for all of the errors in the test file to effectively assert
+  /// that no exceptions will be thrown by doing so.
+  Future<void> assertNoExceptions() async {
+    List<AnalysisError> errors = await _computeErrors();
+    for (var error in errors) {
+      await _computeFixes(error);
+    }
+  }
+
+  /// Compute fixes and ensure that there is no fix of the [kind] being tested by
+  /// this class.
+  Future<void> assertNoFix({bool Function(AnalysisError) errorFilter}) async {
+    AnalysisError error = await _findErrorToFix(errorFilter);
+    await _assertNoFix(error);
+  }
+
+  List<LinkedEditSuggestion> expectedSuggestions(
+      LinkedEditSuggestionKind kind, List<String> values) {
+    return values.map((value) {
+      return new LinkedEditSuggestion(value, kind);
+    }).toList();
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    verifyNoTestUnitErrors = false;
+  }
+
+  /// Computes fixes and verifies that there is a fix for the given [error] of
+  /// the appropriate kind.
+  Future<Fix> _assertHasFix(AnalysisError error) async {
+    // Compute the fixes for this AnalysisError
+    final List<Fix> fixes = await _computeFixes(error);
+
+    // Assert that none of the fixes are a fix-all fix.
+    Fix foundFix = null;
+    for (Fix fix in fixes) {
+      if (fix.isFixAllFix()) {
+        fail('A fix-all fix was found for the error: $error '
+            'in the computed set of fixes:\n${fixes.join('\n')}');
+      } else if (fix.kind == kind) {
+        foundFix ??= fix;
+      }
+    }
+    if (foundFix == null) {
+      fail('Expected to find fix $kind in\n${fixes.join('\n')}');
+    }
+    return foundFix;
+  }
+
+  /// Computes fixes and verifies that there is a fix for the given [error] of
+  /// the appropriate kind.
+  Future<Fix> _assertHasFixAllFix(AnalysisError error) async {
+    if (!kind.canBeAppliedTogether()) {
+      fail('Expected to find and return fix-all FixKind for $kind, '
+          'but kind.canBeAppliedTogether is ${kind.canBeAppliedTogether}');
+    }
+
+    // Compute the fixes for the error.
+    List<Fix> fixes = await _computeFixes(error);
+
+    // Assert that there exists such a fix in the list.
+    Fix foundFix = null;
+    for (Fix fix in fixes) {
+      if (fix.kind == kind && fix.isFixAllFix()) {
+        foundFix = fix;
+        break;
+      }
+    }
+    if (foundFix == null) {
+      fail('No fix-all fix was found for the error: $error '
+          'in the computed set of fixes:\n${fixes.join('\n')}');
+    }
+    return foundFix;
+  }
+
+  Future<void> _assertNoFix(AnalysisError error) async {
+    List<Fix> fixes = await _computeFixes(error);
+    for (Fix fix in fixes) {
+      if (fix.kind == kind) {
+        fail('Unexpected fix $kind in\n${fixes.join('\n')}');
+      }
+    }
+  }
+
+  Future<List<AnalysisError>> _computeErrors() async {
+    if (_errors == null) {
+      if (testAnalysisResult != null) {
+        _errors = testAnalysisResult.errors;
+      }
+      if (_errors == null) {
+        var result = await session.getResolvedUnit(testFile);
+        _errors = result.errors;
+      }
+    }
+    return _errors;
+  }
+
+  /// Computes fixes for the given [error] in [testUnit].
+  Future<List<Fix>> _computeFixes(AnalysisError error) async {
+    var context = new DartFixContextImpl(workspace, testAnalysisResult, error);
+    return await new DartFixContributor().computeFixes(context);
+  }
+
+  /// Find the error that is to be fixed by computing the errors in the file,
+  /// using the [errorFilter] to filter out errors that should be ignored, and
+  /// expecting that there is a single remaining error. The error filter should
+  /// return `true` if the error should not be ignored.
+  Future<AnalysisError> _findErrorToFix(
+      bool Function(AnalysisError) errorFilter,
+      {int length}) async {
+    List<AnalysisError> errors = await _computeErrors();
+    if (errorFilter != null) {
+      if (errors.length == 1) {
+        fail('Unnecessary error filter');
+      }
+      errors = errors.where(errorFilter).toList();
+    }
+    if (errors.length == 0) {
+      fail('Expected one error, found: none');
+    } else if (errors.length > 1) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.writeln('Expected one error, found:');
+      for (AnalysisError error in errors) {
+        buffer.writeln('  $error [${error.errorCode}]');
+      }
+      fail(buffer.toString());
+    }
+    return errors[0];
+  }
+
+  Future<AnalysisError> _findErrorToFixOfType(ErrorCode errorCode) async {
+    List<AnalysisError> errors = await _computeErrors();
+    for (AnalysisError error in errors) {
+      if (error.errorCode == errorCode) {
+        return error;
+      }
+    }
+    return null;
+  }
+
+  List<Position> _findResultPositions(List<String> searchStrings) {
+    List<Position> positions = <Position>[];
+    for (String search in searchStrings) {
+      int offset = resultCode.indexOf(search);
+      positions.add(new Position(testFile, offset));
+    }
+    return positions;
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_test.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_test.dart
new file mode 100644
index 0000000..655614c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FixTest);
+  });
+}
+
+@reflectiveTest
+class FixTest extends FixProcessorTest {
+  @override
+  FixKind get kind => fail('kind should not be requested');
+
+  test_malformedTypeTest() async {
+    await resolveTestUnit('''
+main(p) {
+  p i s Null;
+}''');
+    await assertNoExceptions();
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_async_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_async_test.dart
new file mode 100644
index 0000000..7bd9141
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_async_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImportAsyncTest);
+  });
+}
+
+@reflectiveTest
+class ImportAsyncTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_ASYNC;
+
+  test_future() async {
+    updateTestPubspecFile('''
+environment:
+  sdk: ^2.0.0
+''');
+    await resolveTestUnit('''
+Future<int> zero() async => 0;
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+Future<int> zero() async => 0;
+''');
+  }
+
+  test_stream() async {
+    updateTestPubspecFile('''
+environment:
+  sdk: ^2.0.0
+''');
+    await resolveTestUnit('''
+Stream<int> zero() => null;
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+Stream<int> zero() => null;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart
new file mode 100644
index 0000000..af0bbbe
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_prefix_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImportLibraryPrefixTest);
+  });
+}
+
+@reflectiveTest
+class ImportLibraryPrefixTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PREFIX;
+
+  test_withClass() async {
+    await resolveTestUnit('''
+import 'dart:collection' as pref;
+main() {
+  pref.HashMap s = null;
+  LinkedHashMap f = null;
+  print('\$s \$f');
+}
+''');
+    await assertHasFix('''
+import 'dart:collection' as pref;
+main() {
+  pref.HashMap s = null;
+  pref.LinkedHashMap f = null;
+  print('\$s \$f');
+}
+''');
+  }
+
+  test_withTopLevelVariable() async {
+    await resolveTestUnit('''
+import 'dart:math' as pref;
+main() {
+  print(pref.E);
+  print(PI);
+}
+''');
+    await assertHasFix('''
+import 'dart:math' as pref;
+main() {
+  print(pref.E);
+  print(pref.PI);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
new file mode 100644
index 0000000..78de092
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_project_test.dart
@@ -0,0 +1,532 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImportLibraryProject1Test);
+    defineReflectiveTests(ImportLibraryProject2Test);
+    defineReflectiveTests(ImportLibraryProject3Test);
+  });
+}
+
+@reflectiveTest
+class ImportLibraryProject1Test extends FixProcessorTest
+    with ImportLibraryTestMixin {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT1;
+
+  test_alreadyImported_package() async {
+    addSource('/home/test/lib/lib.dart', '''
+class A {}
+class B {}
+''');
+    await resolveTestUnit('''
+import 'lib.dart' show A;
+main() {
+  A a;
+  B b;
+  print('\$a \$b');
+}
+''');
+    await assertNoFix();
+  }
+
+  test_notInLib() async {
+    addSource('/home/other/test/lib.dart', 'class Test {}');
+    await resolveTestUnit('''
+main() {
+  Test t;
+  print(t);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_preferDirectOverExport() async {
+    _configureMyPkg({'b.dart': 'class Test {}', 'a.dart': "export 'b.dart';"});
+    await resolveTestUnit('''
+main() {
+  Test test = null;
+  print(test);
+}
+''');
+    await assertHasFix('''
+import 'package:my_pkg/b.dart';
+
+main() {
+  Test test = null;
+  print(test);
+}
+''');
+  }
+
+  test_preferDirectOverExport_src() async {
+    _configureMyPkg({'b.dart': 'class Test {}', 'a.dart': "export 'b.dart';"});
+    await resolveTestUnit('''
+main() {
+  Test test = null;
+  print(test);
+}
+''');
+    await assertHasFix('''
+import 'package:my_pkg/b.dart';
+
+main() {
+  Test test = null;
+  print(test);
+}
+''');
+  }
+
+  test_withClass_annotation() async {
+    addSource('/home/test/lib/lib.dart', '''
+library lib;
+class Test {
+  const Test(int p);
+}
+''');
+    await resolveTestUnit('''
+@Test(0)
+main() {
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+@Test(0)
+main() {
+}
+''');
+  }
+
+  test_withClass_hasOtherLibraryWithPrefix() async {
+    addSource('/home/test/lib/a.dart', '''
+library a;
+class One {}
+''');
+    addSource('/home/test/lib/b.dart', '''
+library b;
+class One {}
+class Two {}
+''');
+    await resolveTestUnit('''
+import 'package:test/b.dart' show Two;
+main () {
+  new Two();
+  new One();
+}
+''');
+    await assertHasFix('''
+import 'package:test/a.dart';
+import 'package:test/b.dart' show Two;
+main () {
+  new Two();
+  new One();
+}
+''');
+  }
+
+  test_withClass_inParentFolder() async {
+    testFile = convertPath('/home/test/bin/aaa/test.dart');
+    addSource('/home/test/bin/lib.dart', '''
+library lib;
+class Test {}
+''');
+    await resolveTestUnit('''
+main() {
+  Test t = null;
+  print(t);
+}
+''');
+    await assertHasFix('''
+import '../lib.dart';
+
+main() {
+  Test t = null;
+  print(t);
+}
+''');
+  }
+
+  test_withClass_inRelativeFolder() async {
+    testFile = convertPath('/home/test/bin/test.dart');
+    addSource('/home/test/tool/sub/folder/lib.dart', '''
+library lib;
+class Test {}
+''');
+    await resolveTestUnit('''
+main() {
+  Test t = null;
+  print(t);
+}
+''');
+    await assertHasFix('''
+import '../tool/sub/folder/lib.dart';
+
+main() {
+  Test t = null;
+  print(t);
+}
+''');
+  }
+
+  test_withClass_inSameFolder() async {
+    testFile = convertPath('/home/test/bin/test.dart');
+    addSource('/home/test/bin/lib.dart', '''
+library lib;
+class Test {}
+''');
+    await resolveTestUnit('''
+main() {
+  Test t = null;
+  print(t);
+}
+''');
+    await assertHasFix('''
+import 'lib.dart';
+
+main() {
+  Test t = null;
+  print(t);
+}
+''');
+  }
+
+  test_withClass_instanceCreation_const() async {
+    addSource('/home/test/lib/lib.dart', '''
+class Test {
+  const Test();
+}
+''');
+    await resolveTestUnit('''
+main() {
+  return const Test();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  return const Test();
+}
+''');
+  }
+
+  test_withClass_instanceCreation_const_namedConstructor() async {
+    addSource('/home/test/lib/lib.dart', '''
+class Test {
+  const Test.named();
+}
+''');
+    await resolveTestUnit('''
+main() {
+  const Test.named();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  const Test.named();
+}
+''');
+  }
+
+  test_withClass_instanceCreation_implicit() async {
+    addSource('/home/test/lib/lib.dart', '''
+class Test {
+  const Test();
+}
+''');
+    await resolveTestUnit('''
+main() {
+  return Test();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  return Test();
+}
+''');
+  }
+
+  test_withClass_instanceCreation_new() async {
+    addSource('/home/test/lib/lib.dart', '''
+class Test {
+  const Test();
+}
+''');
+    await resolveTestUnit('''
+main() {
+  return new Test();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  return new Test();
+}
+''');
+  }
+
+  test_withClass_instanceCreation_new_namedConstructor() async {
+    addSource('/home/test/lib/lib.dart', '''
+class Test {
+  Test.named();
+}
+''');
+    await resolveTestUnit('''
+main() {
+  new Test.named();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  new Test.named();
+}
+''');
+  }
+
+  test_withFunction() async {
+    addSource('/home/test/lib/lib.dart', '''
+library lib;
+myFunction() {}
+''');
+    await resolveTestUnit('''
+main() {
+  myFunction();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  myFunction();
+}
+''');
+  }
+
+  test_withFunction_unresolvedMethod() async {
+    addSource('/home/test/lib/lib.dart', '''
+library lib;
+myFunction() {}
+''');
+    await resolveTestUnit('''
+class A {
+  main() {
+    myFunction();
+  }
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+class A {
+  main() {
+    myFunction();
+  }
+}
+''');
+  }
+
+  test_withFunctionTypeAlias() async {
+    addSource('/home/test/lib/lib.dart', '''
+library lib;
+typedef MyFunction();
+''');
+    await resolveTestUnit('''
+main() {
+  MyFunction t = null;
+  print(t);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  MyFunction t = null;
+  print(t);
+}
+''');
+  }
+
+  test_withFunction_functionTopLevelVariable() async {
+    addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
+    await resolveTestUnit('''
+main() {
+  myFunction();
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  myFunction();
+}
+''');
+  }
+
+  test_withFunction_preferFunctionOverTopLevelVariable() async {
+    _configureMyPkg({
+      'b.dart': 'var myFunction = () {};',
+      'a.dart': 'myFunction() {}',
+    });
+    await resolveTestUnit('''
+main() {
+  myFunction();
+}
+''');
+    await assertHasFix('''
+import 'package:my_pkg/a.dart';
+
+main() {
+  myFunction();
+}
+''');
+  }
+
+  @failingTest
+  test_withFunction_nonFunctionType() async {
+    // TODO Remove preferFunctionOverTopLevelVariable test once this is passing
+    addSource('/home/test/lib/lib.dart', 'int zero = 0;');
+    await resolveTestUnit('''
+main() {
+  zero();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_withTopLevelVariable() async {
+    addSource('/home/test/lib/lib.dart', '''
+library lib;
+int MY_VAR = 42;
+''');
+    await resolveTestUnit('''
+main() {
+  print(MY_VAR);
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  print(MY_VAR);
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ImportLibraryProject2Test extends FixProcessorTest
+    with ImportLibraryTestMixin {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2;
+
+  test_preferDirectOverExport() async {
+    _configureMyPkg({
+      'b.dart': 'class Test {}',
+      'a.dart': "export 'b.dart';",
+    });
+    await resolveTestUnit('''
+main() {
+  Test test = null;
+  print(test);
+}
+''');
+    await assertHasFix('''
+import 'package:my_pkg/a.dart';
+
+main() {
+  Test test = null;
+  print(test);
+}
+''');
+  }
+
+  test_preferDirectOverExport_src() async {
+    _configureMyPkg({
+      'b.dart': 'class Test {}',
+      'a.dart': "export 'b.dart';",
+    });
+    await resolveTestUnit('''
+main() {
+  Test test = null;
+  print(test);
+}
+''');
+    await assertHasFix('''
+import 'package:my_pkg/a.dart';
+
+main() {
+  Test test = null;
+  print(test);
+}
+''');
+  }
+}
+
+@reflectiveTest
+class ImportLibraryProject3Test extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3;
+
+  test_inLibSrc_differentContextRoot() async {
+    addPackageFile('bbb', 'b1.dart', r'''
+import 'src/b2.dart';
+class A {}
+''');
+    addPackageFile('bbb', 'src/b2.dart', 'class Test {}');
+    await resolveTestUnit('''
+import 'package:bbb/b1.dart';
+main() {
+  Test t;
+  A a;
+  print('\$t \$a');
+}
+''');
+    await assertNoFix();
+  }
+
+  test_inLibSrc_thisContextRoot() async {
+    addSource('/home/test/lib/src/lib.dart', 'class Test {}');
+    await resolveTestUnit('''
+main() {
+  Test t;
+  print(t);
+}
+''');
+    await assertHasFix('''
+import 'package:test/src/lib.dart';
+
+main() {
+  Test t;
+  print(t);
+}
+''');
+  }
+}
+
+mixin ImportLibraryTestMixin on FixProcessorTest {
+  /// Configures the source factory to have a package named 'my_pkg' and for
+  /// the package to contain all of the files described by the [pathToCode] map.
+  /// The keys in the map are paths relative to the root of the package, and the
+  /// values are the contents of the files at those paths.
+  void _configureMyPkg(Map<String, String> pathToCode) {
+    pathToCode.forEach((path, code) {
+      addPackageFile('my_pkg', path, code);
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart
new file mode 100644
index 0000000..ce3dcc4
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_sdk_test.dart
@@ -0,0 +1,272 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImportLibrarySdkTest);
+  });
+}
+
+@reflectiveTest
+class ImportLibrarySdkTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_SDK;
+
+  test_alreadyImported_sdk() async {
+    await resolveTestUnit('''
+import 'dart:collection' show HashMap;
+main() {
+  HashMap s = null;
+  LinkedHashMap f = null;
+  print('\$s \$f');
+}
+''');
+    await assertNoFix();
+  }
+
+  test_withClass_asExpression() async {
+    await resolveTestUnit('''
+main(p) {
+  p as HashMap;
+}
+''');
+    await assertHasFix('''
+import 'dart:collection';
+
+main(p) {
+  p as HashMap;
+}
+''');
+  }
+
+  test_withClass_instanceCreation_explicitNew() async {
+    await resolveTestUnit('''
+class C {
+  foo() {
+    new HashMap();
+  }
+}
+''');
+    await assertHasFix('''
+import 'dart:collection';
+
+class C {
+  foo() {
+    new HashMap();
+  }
+}
+''');
+  }
+
+  test_withClass_instanceCreation_explicitNew_namedConstructor() async {
+    await resolveTestUnit('''
+class C {
+  foo() {
+    new Completer.sync(0);
+  }
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+class C {
+  foo() {
+    new Completer.sync(0);
+  }
+}
+''');
+  }
+
+  test_withClass_instanceCreation_implicitNew() async {
+    await resolveTestUnit('''
+class C {
+  foo() {
+    HashMap();
+  }
+}
+''');
+    await assertHasFix('''
+import 'dart:collection';
+
+class C {
+  foo() {
+    HashMap();
+  }
+}
+''');
+  }
+
+  test_withClass_instanceCreation_implicitNew_namedConstructor() async {
+    await resolveTestUnit('''
+class C {
+  foo() {
+    Completer.sync(0);
+  }
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+class C {
+  foo() {
+    Completer.sync(0);
+  }
+}
+''');
+  }
+
+  test_withClass_invocationTarget() async {
+    await resolveTestUnit('''
+main() {
+  Timer.run(null);
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+main() {
+  Timer.run(null);
+}
+''');
+  }
+
+  test_withClass_IsExpression() async {
+    await resolveTestUnit('''
+main(p) {
+  p is Completer;
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+main(p) {
+  p is Completer;
+}
+''');
+  }
+
+  test_withClass_itemOfList() async {
+    await resolveTestUnit('''
+main() {
+  var a = [Completer];
+  print(a);
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+main() {
+  var a = [Completer];
+  print(a);
+}
+''');
+  }
+
+  test_withClass_itemOfList_inAnnotation() async {
+    await resolveTestUnit('''
+class MyAnnotation {
+  const MyAnnotation(a, b);
+}
+@MyAnnotation(int, const [Completer])
+main() {}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+class MyAnnotation {
+  const MyAnnotation(a, b);
+}
+@MyAnnotation(int, const [Completer])
+main() {}
+''', errorFilter: (error) {
+      return error.errorCode == StaticWarningCode.UNDEFINED_IDENTIFIER;
+    });
+  }
+
+  test_withClass_typeAnnotation() async {
+    await resolveTestUnit('''
+main() {
+  Completer f = null;
+  print(f);
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+main() {
+  Completer f = null;
+  print(f);
+}
+''');
+  }
+
+  test_withClass_typeAnnotation_PrefixedIdentifier() async {
+    await resolveTestUnit('''
+main() {
+  Timer.run;
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+main() {
+  Timer.run;
+}
+''');
+  }
+
+  test_withClass_typeArgument() async {
+    await resolveTestUnit('''
+main() {
+  List<Completer> completers = [];
+  print(completers);
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+main() {
+  List<Completer> completers = [];
+  print(completers);
+}
+''');
+  }
+
+  test_withTopLevelVariable() async {
+    await resolveTestUnit('''
+main() {
+  print(PI);
+}
+''');
+    await assertHasFix('''
+import 'dart:math';
+
+main() {
+  print(PI);
+}
+''');
+  }
+
+  test_withTopLevelVariable_annotation() async {
+    await resolveTestUnit('''
+@PI
+main() {
+}
+''');
+    await assertHasFix('''
+import 'dart:math';
+
+@PI
+main() {
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart b/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart
new file mode 100644
index 0000000..4f3885f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/import_library_show_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImportLibraryShowTest);
+  });
+}
+
+@reflectiveTest
+class ImportLibraryShowTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.IMPORT_LIBRARY_SHOW;
+
+  test_package() async {
+    addSource('/home/test/lib/lib.dart', '''
+class A {}
+class B {}
+''');
+    await resolveTestUnit('''
+import 'lib.dart' show A;
+main() {
+  A a;
+  B b;
+  print('\$a \$b');
+}
+''');
+    await assertHasFix('''
+import 'lib.dart' show A, B;
+main() {
+  A a;
+  B b;
+  print('\$a \$b');
+}
+''');
+  }
+
+  test_sdk() async {
+    await resolveTestUnit('''
+import 'dart:collection' show HashMap;
+main() {
+  HashMap s = null;
+  LinkedHashMap f = null;
+  print('\$s \$f');
+}
+''');
+    await assertHasFix('''
+import 'dart:collection' show HashMap, LinkedHashMap;
+main() {
+  HashMap s = null;
+  LinkedHashMap f = null;
+  print('\$s \$f');
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/insert_semicolon_test.dart b/pkg/analysis_server/test/src/services/correction/fix/insert_semicolon_test.dart
new file mode 100644
index 0000000..77123f3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/insert_semicolon_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InsertSemicolonTest);
+  });
+}
+
+@reflectiveTest
+class InsertSemicolonTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.INSERT_SEMICOLON;
+
+  test_expectedToken_semicolon() async {
+    await resolveTestUnit('''
+main() {
+  print(0)
+}
+''');
+    await assertHasFix('''
+main() {
+  print(0);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_class_abstract_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_class_abstract_test.dart
new file mode 100644
index 0000000..7dbf4e9
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_class_abstract_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MakeClassAbstractTest);
+  });
+}
+
+@reflectiveTest
+class MakeClassAbstractTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.MAKE_CLASS_ABSTRACT;
+
+  test_declaresAbstractMethod() async {
+    await resolveTestUnit('''
+class A {
+  m();
+}
+''');
+    await assertHasFix('''
+abstract class A {
+  m();
+}
+''');
+  }
+
+  test_inheritsAbstractMethod() async {
+    await resolveTestUnit('''
+abstract class A {
+  m();
+}
+class B extends A {
+}
+''');
+    await assertHasFix('''
+abstract class A {
+  m();
+}
+abstract class B extends A {
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_field_not_final_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_field_not_final_test.dart
new file mode 100644
index 0000000..6027ac6
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_field_not_final_test.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MakeFieldNotFinalTest);
+  });
+}
+
+@reflectiveTest
+class MakeFieldNotFinalTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.MAKE_FIELD_NOT_FINAL;
+
+  test_hasType() async {
+    await resolveTestUnit('''
+class A {
+  final int fff = 1;
+  main() {
+    fff = 2;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int fff = 1;
+  main() {
+    fff = 2;
+  }
+}
+''');
+  }
+
+  test_noType() async {
+    await resolveTestUnit('''
+class A {
+  final fff = 1;
+  main() {
+    fff = 2;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  var fff = 1;
+  main() {
+    fff = 2;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart b/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
new file mode 100644
index 0000000..31bc18d
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/make_final_test.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MakeFinalTest);
+  });
+}
+
+@reflectiveTest
+class MakeFinalTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.MAKE_FINAL;
+
+  @override
+  String get lintCode => LintNames.prefer_final_fields;
+
+  test_field_type() async {
+    await resolveTestUnit('''
+class C {
+  int /*LINT*/f = 2;
+}
+''');
+    await assertHasFix('''
+class C {
+  final int /*LINT*/f = 2;
+}
+''');
+  }
+
+  test_field_var() async {
+    await resolveTestUnit('''
+class C {
+  var /*LINT*/f = 2;
+}
+''');
+    await assertHasFix('''
+class C {
+  final /*LINT*/f = 2;
+}
+''');
+  }
+
+  test_local_type() async {
+    await resolveTestUnit('''
+bad() {
+  int /*LINT*/x = 2;
+}
+''');
+    await assertHasFix('''
+bad() {
+  final int /*LINT*/x = 2;
+}
+''');
+  }
+
+  test_local_var() async {
+    await resolveTestUnit('''
+bad() {
+  var /*LINT*/x = 2;
+}
+''');
+    await assertHasFix('''
+bad() {
+  final /*LINT*/x = 2;
+}
+''');
+  }
+
+  test_noKeyword() async {
+    await resolveTestUnit('''
+class C {
+  /*LINT*/f = 2;
+}
+''');
+    await assertHasFix('''
+class C {
+  /*LINT*/final f = 2;
+}
+''');
+  }
+
+  test_topLevel_type() async {
+    await resolveTestUnit('''
+int /*LINT*/x = 2;
+''');
+    await assertHasFix('''
+final int /*LINT*/x = 2;
+''');
+  }
+
+  test_topLevel_var() async {
+    await resolveTestUnit('''
+var /*LINT*/x = 2;
+''');
+    await assertHasFix('''
+final /*LINT*/x = 2;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/move_type_arguments_to_class_test.dart b/pkg/analysis_server/test/src/services/correction/fix/move_type_arguments_to_class_test.dart
new file mode 100644
index 0000000..b7622e9
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/move_type_arguments_to_class_test.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MoveTypeArgumentsToClassTest);
+  });
+}
+
+@reflectiveTest
+class MoveTypeArgumentsToClassTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.MOVE_TYPE_ARGUMENTS_TO_CLASS;
+
+  test_explicitConst() async {
+    await resolveTestUnit('''
+main() {
+  const C.named<int>();
+}
+class C<E> {
+  const C.named();
+}
+''');
+    await assertHasFix('''
+main() {
+  const C<int>.named();
+}
+class C<E> {
+  const C.named();
+}
+''');
+  }
+
+  test_explicitNew() async {
+    await resolveTestUnit('''
+main() {
+  new C.named<int>();
+}
+class C<E> {
+  C.named();
+}
+''');
+    await assertHasFix('''
+main() {
+  new C<int>.named();
+}
+class C<E> {
+  C.named();
+}
+''');
+  }
+
+  test_explicitNew_alreadyThere() async {
+    await resolveTestUnit('''
+main() {
+  new C<String>.named<int>();
+}
+class C<E> {
+  C.named();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_explicitNew_wrongNumber() async {
+    await resolveTestUnit('''
+main() {
+  new C.named<int, String>();
+}
+class C<E> {
+  C.named();
+}
+''');
+    await assertNoFix();
+  }
+
+  test_implicitConst() async {
+    await resolveTestUnit('''
+main() {
+  const C c = C.named<int>();
+  print(c);
+}
+class C<E> {
+  const C.named();
+}
+''');
+    await assertHasFix('''
+main() {
+  const C c = C<int>.named();
+  print(c);
+}
+class C<E> {
+  const C.named();
+}
+''');
+  }
+
+  test_implicitNew() async {
+    await resolveTestUnit('''
+main() {
+  C.named<int>();
+}
+class C<E> {
+  C.named();
+}
+''');
+    await assertHasFix('''
+main() {
+  C<int>.named();
+}
+class C<E> {
+  C.named();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_await_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_await_test.dart
new file mode 100644
index 0000000..6121171
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_await_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveAwaitTest);
+  });
+}
+
+@reflectiveTest
+class RemoveAwaitTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_AWAIT;
+
+  @override
+  String get lintCode => LintNames.await_only_futures;
+
+  test_intLiteral() async {
+    await resolveTestUnit('''
+bad() async {
+  print(/*LINT*/await 23);
+}
+''');
+    await assertHasFix('''
+bad() async {
+  print(/*LINT*/23);
+}
+''');
+  }
+
+  test_stringLiteral() async {
+    await resolveTestUnit('''
+bad() async {
+  print(/*LINT*/await 'hola');
+}
+''');
+    await assertHasFix('''
+bad() async {
+  print(/*LINT*/'hola');
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart
new file mode 100644
index 0000000..eec8f7c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart
@@ -0,0 +1,71 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveDeadCodeTest);
+  });
+}
+
+@reflectiveTest
+class RemoveDeadCodeTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_DEAD_CODE;
+
+  test_condition() async {
+    await resolveTestUnit('''
+main(int p) {
+  if (true || p > 5) {
+    print(1);
+  }
+}
+''');
+    await assertHasFix('''
+main(int p) {
+  if (true) {
+    print(1);
+  }
+}
+''');
+  }
+
+  test_statements_one() async {
+    await resolveTestUnit('''
+int main() {
+  print(0);
+  return 42;
+  print(1);
+}
+''');
+    await assertHasFix('''
+int main() {
+  print(0);
+  return 42;
+}
+''');
+  }
+
+  test_statements_two() async {
+    await resolveTestUnit('''
+int main() {
+  print(0);
+  return 42;
+  print(1);
+  print(2);
+}
+''');
+    await assertHasFix('''
+int main() {
+  print(0);
+  return 42;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_catch_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_catch_test.dart
new file mode 100644
index 0000000..b5784b8
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_catch_test.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveEmptyCatchTest);
+  });
+}
+
+@reflectiveTest
+class RemoveEmptyCatchTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_EMPTY_CATCH;
+
+  @override
+  String get lintCode => LintNames.empty_catches;
+
+  test_newLine() async {
+    await resolveTestUnit('''
+void foo() {
+  try {}
+  catch (e) {/*LINT*/}
+  finally {}
+}
+''');
+    await assertHasFix('''
+void foo() {
+  try {}
+  finally {}
+}
+''');
+  }
+
+  test_sameLine() async {
+    await resolveTestUnit('''
+void foo() {
+  try {} catch (e) {/*LINT*/} finally {}
+}
+''');
+    await assertHasFix('''
+void foo() {
+  try {} finally {}
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
new file mode 100644
index 0000000..3030ea2
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_constructor_body_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveEmptyConstructorBodyTest);
+  });
+}
+
+@reflectiveTest
+class RemoveEmptyConstructorBodyTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_EMPTY_CONSTRUCTOR_BODY;
+
+  @override
+  String get lintCode => LintNames.empty_constructor_bodies;
+
+  test_empty() async {
+    await resolveTestUnit('''
+class C {
+  C() {/*LINT*/}
+}
+''');
+    await assertHasFix('''
+class C {
+  C();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_else_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_else_test.dart
new file mode 100644
index 0000000..1019af5
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_else_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveEmptyElseTest);
+  });
+}
+
+@reflectiveTest
+class RemoveEmptyElseTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_EMPTY_ELSE;
+
+  @override
+  String get lintCode => LintNames.avoid_empty_else;
+
+  test_newLine() async {
+    await resolveTestUnit('''
+void foo(bool cond) {
+  if (cond) {
+    //
+  }
+  else /*LINT*/;
+}
+''');
+    await assertHasFix('''
+void foo(bool cond) {
+  if (cond) {
+    //
+  }
+}
+''');
+  }
+
+  test_sameLine() async {
+    await resolveTestUnit('''
+void foo(bool cond) {
+  if (cond) {
+    //
+  } else /*LINT*/;
+}
+''');
+    await assertHasFix('''
+void foo(bool cond) {
+  if (cond) {
+    //
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_empty_statement_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_statement_test.dart
new file mode 100644
index 0000000..18a278c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_empty_statement_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveEmptyStatementTest);
+  });
+}
+
+@reflectiveTest
+class RemoveEmptyStatementTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_EMPTY_STATEMENT;
+
+  @override
+  String get lintCode => LintNames.empty_statements;
+
+  test_insideBlock() async {
+    await resolveTestUnit('''
+void foo() {
+  while(true) {
+    /*LINT*/;
+  }
+}
+''');
+    await assertHasFix('''
+void foo() {
+  while(true) {
+    /*LINT*/
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart
new file mode 100644
index 0000000..b686d62
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_initializer_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveInitializerTest);
+  });
+}
+
+@reflectiveTest
+class RemoveInitializerTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_INITIALIZER;
+
+  @override
+  String get lintCode => LintNames.avoid_init_to_null;
+
+  test_field() async {
+    await resolveTestUnit('''
+class Test {
+  int /*LINT*/x = null;
+}
+''');
+    await assertHasFix('''
+class Test {
+  int /*LINT*/x;
+}
+''');
+  }
+
+  test_listOfVariableDeclarations() async {
+    await resolveTestUnit('''
+String a = 'a', /*LINT*/b = null, c = 'c';
+''');
+    await assertHasFix('''
+String a = 'a', /*LINT*/b, c = 'c';
+''');
+  }
+
+  test_topLevel() async {
+    await resolveTestUnit('''
+var /*LINT*/x = null;
+''');
+    await assertHasFix('''
+var /*LINT*/x;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart
new file mode 100644
index 0000000..2fdfad9a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_interpolation_braces_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveInterpolationBracesTest);
+  });
+}
+
+@reflectiveTest
+class RemoveInterpolationBracesTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_INTERPOLATION_BRACES;
+
+  @override
+  String get lintCode => LintNames.unnecessary_brace_in_string_interp;
+
+  test_withSpace() async {
+    await resolveTestUnit(r'''
+main() {
+  var v = 42;
+  print('v: /*LINT*/${ v}');
+}
+''');
+    await assertHasFix(r'''
+main() {
+  var v = 42;
+  print('v: /*LINT*/$v');
+}
+''', length: 4);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
new file mode 100644
index 0000000..443d382
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_method_declaration_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveMethodDeclarationTest);
+  });
+}
+
+@reflectiveTest
+class RemoveMethodDeclarationTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_METHOD_DECLARATION;
+
+  @override
+  String get lintCode => LintNames.unnecessary_override;
+
+  test_getter() async {
+    await resolveTestUnit('''
+class A {
+  int x;
+}
+class B extends A {
+  @override
+  int get /*LINT*/x => super.x;
+}
+''');
+    await assertHasFix('''
+class A {
+  int x;
+}
+class B extends A {
+}
+''');
+  }
+
+  test_method() async {
+    await resolveTestUnit('''
+class A {
+  @override
+  String /*LINT*/toString() => super.toString();
+}
+''');
+    await assertHasFix('''
+class A {
+}
+''');
+  }
+
+  test_setter() async {
+    await resolveTestUnit('''
+class A {
+  int x;
+}
+class B extends A {
+  @override
+  set /*LINT*/x(int other) {
+    this.x = other;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int x;
+}
+class B extends A {
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_parameters_in_getter_declaration_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_parameters_in_getter_declaration_test.dart
new file mode 100644
index 0000000..20606f5
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_parameters_in_getter_declaration_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveParametersInGetterDeclarationTest);
+  });
+}
+
+@reflectiveTest
+class RemoveParametersInGetterDeclarationTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION;
+
+  test_emptyList() async {
+    await resolveTestUnit('''
+class A {
+  int get foo() => 0;
+}
+''');
+    await assertHasFix('''
+class A {
+  int get foo => 0;
+}
+''');
+  }
+
+  test_nonEmptyList() async {
+    await resolveTestUnit('''
+class A {
+  int get foo(int a) => 0;
+}
+''');
+    await assertHasFix('''
+class A {
+  int get foo => 0;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_parentheses_in_getter_invocation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_parentheses_in_getter_invocation_test.dart
new file mode 100644
index 0000000..65e1c39
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_parentheses_in_getter_invocation_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveParenthesesInGetterInvocationTest);
+  });
+}
+
+@reflectiveTest
+class RemoveParenthesesInGetterInvocationTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION;
+
+  test_noArguments() async {
+    await resolveTestUnit('''
+class A {
+  int get foo => 0;
+}
+main(A a) {
+  a.foo();
+}
+''');
+    await assertHasFix('''
+class A {
+  int get foo => 0;
+}
+main(A a) {
+  a.foo;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart
new file mode 100644
index 0000000..5ea13d4
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_this_expression_test.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveThisExpressionTest);
+  });
+}
+
+@reflectiveTest
+class RemoveThisExpressionTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_THIS_EXPRESSION;
+
+  @override
+  String get lintCode => LintNames.unnecessary_this;
+
+  test_methodInvocation_oneCharacterOperator() async {
+    await resolveTestUnit('''
+class A {
+  void foo() {
+    /*LINT*/this.foo();
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  void foo() {
+    /*LINT*/foo();
+  }
+}
+''');
+  }
+
+  test_methodInvocation_twoCharactersOperator() async {
+    await resolveTestUnit('''
+class A {
+  void foo() {
+    /*LINT*/this?.foo();
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  void foo() {
+    /*LINT*/foo();
+  }
+}
+''');
+  }
+
+  test_notAThisExpression() async {
+    await resolveTestUnit('''
+void foo() {
+  final /*LINT*/this.id;
+}
+''');
+    await assertNoFix();
+  }
+
+  test_propertyAccess_oneCharacterOperator() async {
+    await resolveTestUnit('''
+class A {
+  int x;
+  void foo() {
+    /*LINT*/this.x = 2;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int x;
+  void foo() {
+    /*LINT*/x = 2;
+  }
+}
+''');
+  }
+
+  test_propertyAccess_twoCharactersOperator() async {
+    await resolveTestUnit('''
+class A {
+  int x;
+  void foo() {
+    /*LINT*/this?.x = 2;
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  int x;
+  void foo() {
+    /*LINT*/x = 2;
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart
new file mode 100644
index 0000000..54deb8b
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_type_annotation_test.dart
@@ -0,0 +1,164 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AvoidAnnotatingWithDynamicTest);
+    defineReflectiveTests(AvoidReturnTypesOnSettersTest);
+    defineReflectiveTests(AvoidTypesOnClosureParametersTest);
+    defineReflectiveTests(TypeInitFormalsTest);
+  });
+}
+
+@reflectiveTest
+class AvoidAnnotatingWithDynamicTest extends RemoveTypeAnnotationTest {
+  @override
+  String get lintCode => LintNames.avoid_annotating_with_dynamic;
+
+  test_insideFunctionTypedFormalParameter() async {
+    await resolveTestUnit('''
+bad(void foo(/*LINT*/dynamic x)) {
+  return null;
+}
+''');
+    await assertHasFix('''
+bad(void foo(/*LINT*/x)) {
+  return null;
+}
+''');
+  }
+
+  test_namedParameter() async {
+    await resolveTestUnit('''
+bad({/*LINT*/dynamic defaultValue}) {
+  return null;
+}
+''');
+    await assertHasFix('''
+bad({/*LINT*/defaultValue}) {
+  return null;
+}
+''');
+  }
+
+  test_normalParameter() async {
+    await resolveTestUnit('''
+bad(/*LINT*/dynamic defaultValue) {
+  return null;
+}
+''');
+    await assertHasFix('''
+bad(/*LINT*/defaultValue) {
+  return null;
+}
+''');
+  }
+
+  test_optionalParameter() async {
+    await resolveTestUnit('''
+bad([/*LINT*/dynamic defaultValue]) {
+  return null;
+}
+''');
+    await assertHasFix('''
+bad([/*LINT*/defaultValue]) {
+  return null;
+}
+''');
+  }
+}
+
+@reflectiveTest
+class AvoidReturnTypesOnSettersTest extends RemoveTypeAnnotationTest {
+  @override
+  String get lintCode => LintNames.avoid_return_types_on_setters;
+
+  test_void() async {
+    await resolveTestUnit('''
+/*LINT*/void set speed2(int ms) {}
+''');
+    await assertHasFix('''
+/*LINT*/set speed2(int ms) {}
+''');
+  }
+}
+
+@reflectiveTest
+class AvoidTypesOnClosureParametersTest extends RemoveTypeAnnotationTest {
+  @override
+  String get lintCode => LintNames.avoid_types_on_closure_parameters;
+
+  test_namedParameter() async {
+    await resolveTestUnit('''
+var x = ({/*LINT*/Future<int> defaultValue}) {
+  return null;
+};
+''');
+    await assertHasFix('''
+var x = ({/*LINT*/defaultValue}) {
+  return null;
+};
+''');
+  }
+
+  test_normalParameter() async {
+    await resolveTestUnit('''
+var x = (/*LINT*/Future<int> defaultValue) {
+  return null;
+};
+''');
+    await assertHasFix('''
+var x = (/*LINT*/defaultValue) {
+  return null;
+};
+''');
+  }
+
+  test_optionalParameter() async {
+    await resolveTestUnit('''
+var x = ([/*LINT*/Future<int> defaultValue]) {
+  return null;
+};
+''');
+    await assertHasFix('''
+var x = ([/*LINT*/defaultValue]) {
+  return null;
+};
+''');
+  }
+}
+
+@reflectiveTest
+class TypeInitFormalsTest extends RemoveTypeAnnotationTest {
+  @override
+  String get lintCode => LintNames.type_init_formals;
+
+  test_void() async {
+    await resolveTestUnit('''
+class C {
+  int f;
+  C(/*LINT*/int this.f);
+}
+''');
+    await assertHasFix('''
+class C {
+  int f;
+  C(/*LINT*/this.f);
+}
+''');
+  }
+}
+
+@reflectiveTest
+abstract class RemoveTypeAnnotationTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_TYPE_ANNOTATION;
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_type_arguments_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_type_arguments_test.dart
new file mode 100644
index 0000000..b27594f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_type_arguments_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveTypeArgumentsTest);
+  });
+}
+
+@reflectiveTest
+class RemoveTypeArgumentsTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_TYPE_ARGUMENTS;
+
+  test_explicitConst() async {
+    await resolveTestUnit('''
+main() {
+  const C.named<int>();
+}
+class C<E> {
+  const C.named();
+}
+''');
+    await assertHasFix('''
+main() {
+  const C.named();
+}
+class C<E> {
+  const C.named();
+}
+''');
+  }
+
+  test_explicitNew() async {
+    await resolveTestUnit('''
+main() {
+  new C.named<int>();
+}
+class C<E> {
+  C.named();
+}
+''');
+    await assertHasFix('''
+main() {
+  new C.named();
+}
+class C<E> {
+  C.named();
+}
+''');
+  }
+
+  test_implicitConst() async {
+    await resolveTestUnit('''
+main() {
+  const C c = C.named<int>();
+  print(c);
+}
+class C<E> {
+  const C.named();
+}
+''');
+    await assertHasFix('''
+main() {
+  const C c = C.named();
+  print(c);
+}
+class C<E> {
+  const C.named();
+}
+''');
+  }
+
+  test_implicitNew() async {
+    await resolveTestUnit('''
+main() {
+  C.named<int>();
+}
+class C<E> {
+  C.named();
+}
+''');
+    await assertHasFix('''
+main() {
+  C.named();
+}
+class C<E> {
+  C.named();
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_cast_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_cast_test.dart
new file mode 100644
index 0000000..9218c3b
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unnecessary_cast_test.dart
@@ -0,0 +1,68 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveUnnecessaryCastTest);
+  });
+}
+
+@reflectiveTest
+class RemoveUnnecessaryCastTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_UNNECESSARY_CAST;
+
+  test_assignment() async {
+    await resolveTestUnit('''
+main(Object p) {
+  if (p is String) {
+    String v = ((p as String));
+    print(v);
+  }
+}
+''');
+    await assertHasFix('''
+main(Object p) {
+  if (p is String) {
+    String v = p;
+    print(v);
+  }
+}
+''');
+  }
+
+  test_assignment_all() async {
+    await resolveTestUnit('''
+main(Object p, Object q) {
+  if (p is String) {
+    String v = ((p as String));
+    print(v);
+  }
+  if (q is int) {
+    int v = ((q as int));
+    print(v);
+  }
+}
+''');
+    await assertHasFixAllFix(HintCode.UNNECESSARY_CAST, '''
+main(Object p, Object q) {
+  if (p is String) {
+    String v = p;
+    print(v);
+  }
+  if (q is int) {
+    int v = q;
+    print(v);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_clause_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_clause_test.dart
new file mode 100644
index 0000000..8bd4f51
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_clause_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveUnusedCatchClauseTest);
+  });
+}
+
+@reflectiveTest
+class RemoveUnusedCatchClauseTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE;
+
+  test_removeUnusedCatchClause() async {
+    await resolveTestUnit('''
+main() {
+  try {
+    throw 42;
+  } on int catch (e) {
+  }
+}
+''');
+    await assertHasFix('''
+main() {
+  try {
+    throw 42;
+  } on int {
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_stack_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_stack_test.dart
new file mode 100644
index 0000000..da067cd
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_catch_stack_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveUnusedCatchStackTest);
+  });
+}
+
+@reflectiveTest
+class RemoveUnusedCatchStackTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_UNUSED_CATCH_STACK;
+
+  test_removeUnusedCatchStack() async {
+    await resolveTestUnit('''
+main() {
+  try {
+    throw 42;
+  } catch (e, stack) {
+  }
+}
+''');
+    await assertHasFix('''
+main() {
+  try {
+    throw 42;
+  } catch (e) {
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart
new file mode 100644
index 0000000..96ee02f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_import_test.dart
@@ -0,0 +1,127 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RemoveUnusedImportTest);
+  });
+}
+
+@reflectiveTest
+class RemoveUnusedImportTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REMOVE_UNUSED_IMPORT;
+
+  test_all_diverseImports() async {
+    await resolveTestUnit('''
+import 'dart:math';
+import 'dart:math';
+import 'dart:async';
+main() {
+}
+''');
+    await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
+main() {
+}
+''');
+  }
+
+  test_all_diverseImports2() async {
+    await resolveTestUnit('''
+import 'dart:async';
+import 'dart:math' as math;
+import 'dart:async';
+
+var tau = math.pi * 2;
+
+main() {
+}
+''');
+    await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
+import 'dart:math' as math;
+
+var tau = math.pi * 2;
+
+main() {
+}
+''');
+  }
+
+  test_all_singleLine() async {
+    await resolveTestUnit('''
+import 'dart:math'; import 'dart:math'; import 'dart:math';
+main() {
+}
+''');
+    await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
+main() {
+}
+''');
+  }
+
+  test_anotherImportOnLine() async {
+    await resolveTestUnit('''
+import 'dart:math'; import 'dart:async';
+
+main() {
+  Future f;
+  print(f);
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+main() {
+  Future f;
+  print(f);
+}
+''');
+  }
+
+  test_multipleOfSame_all() async {
+    await resolveTestUnit('''
+import 'dart:math';
+import 'dart:math';
+import 'dart:math';
+main() {
+}
+''');
+    await assertHasFixAllFix(HintCode.UNUSED_IMPORT, '''
+main() {
+}
+''');
+  }
+
+  test_severalLines() async {
+    await resolveTestUnit('''
+import
+  'dart:math';
+main() {
+}
+''');
+    await assertHasFix('''
+main() {
+}
+''');
+  }
+
+  test_single() async {
+    await resolveTestUnit('''
+import 'dart:math';
+main() {
+}
+''');
+    await assertHasFix('''
+main() {
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/rename_to_camel_case_test.dart b/pkg/analysis_server/test/src/services/correction/fix/rename_to_camel_case_test.dart
new file mode 100644
index 0000000..45f6677
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/rename_to_camel_case_test.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RenameToCamelCaseTest);
+  });
+}
+
+@reflectiveTest
+class RenameToCamelCaseTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.RENAME_TO_CAMEL_CASE;
+
+  @override
+  String get lintCode => LintNames.non_constant_identifier_names;
+
+  test_localVariable() async {
+    await resolveTestUnit('''
+main() {
+  int /*LINT*/my_integer_variable = 42;
+  int foo;
+  print(my_integer_variable);
+  print(foo);
+}
+''');
+    await assertHasFix('''
+main() {
+  int /*LINT*/myIntegerVariable = 42;
+  int foo;
+  print(myIntegerVariable);
+  print(foo);
+}
+''');
+  }
+
+  test_parameter_closure() async {
+    await resolveTestUnit('''
+main() {
+  [0, 1, 2].forEach((/*LINT*/my_integer_variable) {
+    print(my_integer_variable);
+  });
+}
+''');
+    await assertHasFix('''
+main() {
+  [0, 1, 2].forEach((/*LINT*/myIntegerVariable) {
+    print(myIntegerVariable);
+  });
+}
+''');
+  }
+
+  test_parameter_function() async {
+    await resolveTestUnit('''
+main(int /*LINT*/my_integer_variable) {
+  print(my_integer_variable);
+}
+''');
+    await assertHasFix('''
+main(int /*LINT*/myIntegerVariable) {
+  print(myIntegerVariable);
+}
+''');
+  }
+
+  test_parameter_method() async {
+    await resolveTestUnit('''
+class A {
+  main(int /*LINT*/my_integer_variable) {
+    print(my_integer_variable);
+  }
+}
+''');
+    await assertHasFix('''
+class A {
+  main(int /*LINT*/myIntegerVariable) {
+    print(myIntegerVariable);
+  }
+}
+''');
+  }
+
+  test_parameter_optionalNamed() async {
+    await resolveTestUnit('''
+foo({int /*LINT*/my_integer_variable}) {
+  print(my_integer_variable);
+}
+''');
+    await assertNoFix();
+  }
+
+  test_parameter_optionalPositional() async {
+    await resolveTestUnit('''
+main([int /*LINT*/my_integer_variable]) {
+  print(my_integer_variable);
+}
+''');
+    await assertHasFix('''
+main([int /*LINT*/myIntegerVariable]) {
+  print(myIntegerVariable);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_boolean_with_bool_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_boolean_with_bool_test.dart
new file mode 100644
index 0000000..29fe96e
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_boolean_with_bool_test.dart
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceBooleanWithBoolTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceBooleanWithBoolTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_BOOLEAN_WITH_BOOL;
+
+  test_all() async {
+    await resolveTestUnit('''
+main() {
+  boolean v;
+  boolean w;
+}
+''');
+    await assertHasFixAllFix(StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, '''
+main() {
+  bool v;
+  bool w;
+}
+''');
+  }
+
+  test_single() async {
+    await resolveTestUnit('''
+main() {
+  boolean v;
+  print(v);
+}
+''');
+    await assertHasFix('''
+main() {
+  bool v;
+  print(v);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_final_with_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_final_with_const_test.dart
new file mode 100644
index 0000000..77fa5a7
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_final_with_const_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceFinalWithConstTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceFinalWithConstTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_FINAL_WITH_CONST;
+
+  @override
+  String get lintCode => LintNames.prefer_const_declarations;
+
+  test_method() async {
+    await resolveTestUnit('''
+/*LINT*/final int a = 1;
+''');
+    await assertHasFix('''
+/*LINT*/const int a = 1;
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
new file mode 100644
index 0000000..244178e
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_return_type_future_test.dart
@@ -0,0 +1,151 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceReturnTypeFutureTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceReturnTypeFutureTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_RETURN_TYPE_FUTURE;
+
+  test_adjacentNodes_withImport() async {
+    await resolveTestUnit('''
+import 'dart:async';
+var v;int main() async => 0;
+''');
+    await assertHasFix('''
+import 'dart:async';
+var v;Future<int> main() async => 0;
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+
+  test_adjacentNodes_withoutImport() async {
+    await resolveTestUnit('''
+var v;int main() async => 0;
+''');
+    await assertHasFix('''
+var v;Future<int> main() async => 0;
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+
+  test_complexTypeName_withImport() async {
+    await resolveTestUnit('''
+import 'dart:async';
+List<int> main() async {
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+Future<List<int>> main() async {
+}
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+
+  @failingTest
+  test_complexTypeName_withoutImport() async {
+    await resolveTestUnit('''
+List<int> main() async {
+}
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+Future<List<int>> main() async {
+}
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+
+  test_importedWithPrefix() async {
+    await resolveTestUnit('''
+import 'dart:async' as al;
+int main() async {
+}
+''');
+    await assertHasFix('''
+import 'dart:async' as al;
+al.Future<int> main() async {
+}
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+
+  test_simpleTypeName_withImport() async {
+    await resolveTestUnit('''
+import 'dart:async';
+int main() async => 0;
+''');
+    await assertHasFix('''
+import 'dart:async';
+Future<int> main() async => 0;
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+
+  @failingTest
+  test_simpleTypeName_withoutImport() async {
+    await resolveTestUnit('''
+int main() async => 0;
+''');
+    await assertHasFix('''
+import 'dart:async';
+
+Future<int> main() async => 0;
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+
+  test_withLibraryDirective_withImport() async {
+    await resolveTestUnit('''
+library main;
+import 'dart:async';
+int main() async {
+}
+''');
+    await assertHasFix('''
+library main;
+import 'dart:async';
+Future<int> main() async {
+}
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+
+  test_withLibraryDirective_withoutImport() async {
+    await resolveTestUnit('''
+library main;
+int main() async {
+}
+''');
+    await assertHasFix('''
+library main;
+Future<int> main() async {
+}
+''', errorFilter: (error) {
+      return error.errorCode == StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE;
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_var_with_dynamic_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_var_with_dynamic_test.dart
new file mode 100644
index 0000000..f0463c8
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_var_with_dynamic_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceVarWithDynamicTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceVarWithDynamicTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_VAR_WITH_DYNAMIC;
+
+  test_simple() async {
+    await resolveTestUnit('''
+class A {
+  Map<String, var> m;
+}
+''');
+    await assertHasFix('''
+class A {
+  Map<String, dynamic> m;
+}
+''', errorFilter: (error) {
+      return error.errorCode == ParserErrorCode.VAR_AS_TYPE_NAME;
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_brackets_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_brackets_test.dart
new file mode 100644
index 0000000..93cae94
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_brackets_test.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithBracketsTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceWithBracketsTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_WITH_BRACKETS;
+
+  @override
+  String get lintCode => LintNames.empty_statements;
+
+  test_outOfBlock_otherLine() async {
+    await resolveTestUnit('''
+void foo() {
+  while(true)
+  /*LINT*/;
+  print('hi');
+}
+''');
+    await assertHasFix('''
+void foo() {
+  while(true) {}
+  print('hi');
+}
+''');
+  }
+
+  test_outOfBlock_sameLine() async {
+    await resolveTestUnit('''
+void foo() {
+  while(true)/*LINT*/;
+  print('hi');
+}
+''');
+    await assertHasFix('''
+void foo() {
+  while(true) {}
+  print('hi');
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_conditional_assignment_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_conditional_assignment_test.dart
new file mode 100644
index 0000000..e5baaec
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_conditional_assignment_test.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithConditionalAssignmentTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceWithConditionalAssignmentTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT;
+
+  @override
+  String get lintCode => LintNames.prefer_conditional_assignment;
+
+  test_withCodeBeforeAndAfter() async {
+    await resolveTestUnit('''
+class Person {
+  String _fullName;
+  void foo() {
+    print('hi');
+    /*LINT*/if (_fullName == null) {
+      _fullName = getFullUserName(this);
+    }
+    print('hi');
+  }
+}
+''');
+    await assertHasFix('''
+class Person {
+  String _fullName;
+  void foo() {
+    print('hi');
+    /*LINT*/_fullName ??= getFullUserName(this);
+    print('hi');
+  }
+}
+''');
+  }
+
+  test_withOneBlock() async {
+    await resolveTestUnit('''
+class Person {
+  String _fullName;
+  void foo() {
+    /*LINT*/if (_fullName == null) {
+      _fullName = getFullUserName(this);
+    }
+  }
+}
+''');
+    await assertHasFix('''
+class Person {
+  String _fullName;
+  void foo() {
+    /*LINT*/_fullName ??= getFullUserName(this);
+  }
+}
+''');
+  }
+
+  test_withoutBlock() async {
+    await resolveTestUnit('''
+class Person {
+  String _fullName;
+  void foo() {
+    /*LINT*/if (_fullName == null)
+      _fullName = getFullUserName(this);
+  }
+}
+''');
+    await assertHasFix('''
+class Person {
+  String _fullName;
+  void foo() {
+    /*LINT*/_fullName ??= getFullUserName(this);
+  }
+}
+''');
+  }
+
+  test_withTwoBlock() async {
+    await resolveTestUnit('''
+class Person {
+  String _fullName;
+  void foo() {
+    /*LINT*/if (_fullName == null) {{
+      _fullName = getFullUserName(this);
+    }}
+  }
+}
+''');
+    await assertHasFix('''
+class Person {
+  String _fullName;
+  void foo() {
+    /*LINT*/_fullName ??= getFullUserName(this);
+  }
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_identifier_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_identifier_test.dart
new file mode 100644
index 0000000..6dfc38c
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_identifier_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithIdentifierTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceWithIdentifierTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_WITH_IDENTIFIER;
+
+  @override
+  String get lintCode => LintNames.avoid_types_on_closure_parameters;
+
+  test_functionTypedFormalParameter() async {
+    await resolveTestUnit('''
+var functionWithFunction = (/*LINT*/int f(int x)) => f(0);
+''');
+    await assertHasFix('''
+var functionWithFunction = (/*LINT*/f) => f(0);
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_literal_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_literal_test.dart
new file mode 100644
index 0000000..7ec1088
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_literal_test.dart
@@ -0,0 +1,113 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithLiteralTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceWithLiteralTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_WITH_LITERAL;
+
+  @override
+  String get lintCode => LintNames.prefer_collection_literals;
+
+  test_linkedHashMap_withCommentsInGeneric() async {
+    await resolveTestUnit('''
+import 'dart:collection';
+
+final a = /*LINT*/new LinkedHashMap<int,/*comment*/int>();
+''');
+    await assertHasFix('''
+import 'dart:collection';
+
+final a = /*LINT*/<int,/*comment*/int>{};
+''');
+  }
+
+  test_linkedHashMap_withDynamicGenerics() async {
+    await resolveTestUnit('''
+import 'dart:collection';
+
+final a = /*LINT*/new LinkedHashMap<dynamic,dynamic>();
+''');
+    await assertHasFix('''
+import 'dart:collection';
+
+final a = /*LINT*/<dynamic,dynamic>{};
+''');
+  }
+
+  test_linkedHashMap_withGeneric() async {
+    await resolveTestUnit('''
+import 'dart:collection';
+
+final a = /*LINT*/new LinkedHashMap<int,int>();
+''');
+    await assertHasFix('''
+import 'dart:collection';
+
+final a = /*LINT*/<int,int>{};
+''');
+  }
+
+  test_linkedHashMap_withoutGeneric() async {
+    await resolveTestUnit('''
+import 'dart:collection';
+
+final a = /*LINT*/new LinkedHashMap();
+''');
+    await assertHasFix('''
+import 'dart:collection';
+
+final a = /*LINT*/{};
+''');
+  }
+
+  test_list_withGeneric() async {
+    await resolveTestUnit('''
+final a = /*LINT*/new List<int>();
+''');
+    await assertHasFix('''
+final a = /*LINT*/<int>[];
+''');
+  }
+
+  test_list_withoutGeneric() async {
+    await resolveTestUnit('''
+final a = /*LINT*/new List();
+''');
+    await assertHasFix('''
+final a = /*LINT*/[];
+''');
+  }
+
+  test_map_withGeneric() async {
+    await resolveTestUnit('''
+final a = /*LINT*/new Map<int,int>();
+''');
+    await assertHasFix('''
+final a = /*LINT*/<int,int>{};
+''');
+  }
+
+  test_map_withoutGeneric() async {
+    await resolveTestUnit('''
+final a = /*LINT*/new Map();
+''');
+    await assertHasFix('''
+final a = /*LINT*/{};
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_null_aware_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_null_aware_test.dart
new file mode 100644
index 0000000..f758081
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_null_aware_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithNullAwareTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceWithNullAwareTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_WITH_NULL_AWARE;
+
+  test_chain() async {
+    await resolveTestUnit('''
+main(x) {
+  x?.a.b.c;
+}
+''');
+    await assertHasFix('''
+main(x) {
+  x?.a?.b?.c;
+}
+''');
+  }
+
+  test_methodInvocation() async {
+    await resolveTestUnit('''
+main(x) {
+  x?.a.b();
+}
+''');
+    await assertHasFix('''
+main(x) {
+  x?.a?.b();
+}
+''');
+  }
+
+  test_propertyAccess() async {
+    await resolveTestUnit('''
+main(x) {
+  x?.a().b;
+}
+''');
+    await assertHasFix('''
+main(x) {
+  x?.a()?.b;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart b/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
new file mode 100644
index 0000000..ccc757a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/replace_with_tear_off_test.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReplaceWithTearOffTest);
+  });
+}
+
+@reflectiveTest
+class ReplaceWithTearOffTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.REPLACE_WITH_TEAR_OFF;
+
+  @override
+  String get lintCode => LintNames.unnecessary_lambdas;
+
+  test_function_oneParameter() async {
+    await resolveTestUnit('''
+final x = /*LINT*/(name) {
+  print(name);
+};
+''');
+    await assertHasFix('''
+final x = /*LINT*/print;
+''');
+  }
+
+  test_function_zeroParameters() async {
+    await resolveTestUnit('''
+void foo(){}
+Function finalVar() {
+  return /*LINT*/() {
+    foo();
+  };
+}
+''');
+    await assertHasFix('''
+void foo(){}
+Function finalVar() {
+  return /*LINT*/foo;
+}
+''');
+  }
+
+  test_lambda_asArgument() async {
+    await resolveTestUnit('''
+void foo() {
+  bool isPair(int a) => a % 2 == 0;
+  final finalList = <int>[];
+  finalList.where(/*LINT*/(number) =>
+    isPair(number));
+}
+''');
+    await assertHasFix('''
+void foo() {
+  bool isPair(int a) => a % 2 == 0;
+  final finalList = <int>[];
+  finalList.where(/*LINT*/isPair);
+}
+''');
+  }
+
+  test_method_oneParameter() async {
+    await resolveTestUnit('''
+var a = /*LINT*/(x) => finalList.remove(x);
+''');
+    await assertHasFix('''
+var a = /*LINT*/finalList.remove;
+''');
+  }
+
+  test_method_zeroParameter() async {
+    await resolveTestUnit('''
+final Object a;
+Function finalVar() {
+  return /*LINT*/() {
+    return a.toString();
+  };
+}
+''');
+    await assertHasFix('''
+final Object a;
+Function finalVar() {
+  return /*LINT*/a.toString;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
new file mode 100644
index 0000000..de6f043
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -0,0 +1,180 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'add_async_test.dart' as add_async;
+import 'add_explicit_cast_test.dart' as add_explicit_cast;
+import 'add_field_formal_parameters_test.dart' as add_field_formal_parameters;
+import 'add_missing_parameter_named_test.dart' as add_missing_parameter_named;
+import 'add_missing_parameter_positional_test.dart'
+    as add_missing_parameter_positional;
+import 'add_missing_parameter_required_test.dart'
+    as add_missing_parameter_required;
+import 'add_missing_required_argument_test.dart'
+    as add_missing_required_argument;
+import 'add_ne_null_test.dart' as add_ne_null;
+import 'add_override_test.dart' as add_override;
+import 'add_required_test.dart' as add_required;
+import 'add_static_test.dart' as add_static;
+import 'add_super_constructor_invocation_test.dart'
+    as add_super_constructor_invocation;
+import 'change_to_nearest_precise_value_test.dart'
+    as change_to_nearest_precise_value;
+import 'change_to_static_access_test.dart' as change_to_static_access;
+import 'change_to_test.dart' as change_to;
+import 'change_type_annotation_test.dart' as change_type_annotation;
+import 'convert_flutter_child_test.dart' as convert_flutter_child;
+import 'convert_flutter_children_test.dart' as convert_flutter_children;
+import 'convert_to_named_arguments_test.dart' as convert_to_named_arguments;
+import 'create_class_test.dart' as create_class;
+import 'create_constructor_for_final_fields_test.dart'
+    as create_constructor_for_final_field;
+import 'create_constructor_super_test.dart' as create_constructor_super;
+import 'create_constructor_test.dart' as create_constructor;
+import 'create_field_test.dart' as create_field;
+import 'create_file_test.dart' as create_file;
+import 'create_function_test.dart' as create_function;
+import 'create_getter_test.dart' as create_getter;
+import 'create_local_variable_test.dart' as create_local_variable;
+import 'create_method_test.dart' as create_method;
+import 'create_missing_overrides_test.dart' as create_missing_overrides;
+import 'create_mixin_test.dart' as create_mixin;
+import 'create_no_such_method_test.dart' as create_no_such_method;
+import 'extend_class_for_mixin_test.dart' as extend_class_for_mixin;
+import 'fix_test.dart' as fix;
+import 'import_async_test.dart' as import_async;
+import 'import_library_prefix_test.dart' as import_library_prefix;
+import 'import_library_project_test.dart' as import_library_project;
+import 'import_library_sdk_test.dart' as import_library_sdk;
+import 'import_library_show_test.dart' as import_library_show;
+import 'insert_semicolon_test.dart' as insert_semicolon;
+import 'make_class_abstract_test.dart' as make_class_abstract;
+import 'make_field_not_final_test.dart' as make_field_not_final;
+import 'make_final_test.dart' as make_final;
+import 'move_type_arguments_to_class_test.dart' as move_type_arguments_to_class;
+import 'remove_await_test.dart' as remove_await;
+import 'remove_dead_code_test.dart' as remove_dead_code;
+import 'remove_empty_catch_test.dart' as remove_empty_catch;
+import 'remove_empty_constructor_body_test.dart'
+    as remove_empty_constructor_body;
+import 'remove_empty_else_test.dart' as remove_empty_else;
+import 'remove_empty_statement_test.dart' as remove_empty_statement;
+import 'remove_initializer_test.dart' as remove_initializer;
+import 'remove_interpolation_braces_test.dart' as remove_interpolation_braces;
+import 'remove_method_declaration_test.dart' as remove_method_declaration;
+import 'remove_parameters_in_getter_declaration_test.dart'
+    as remove_parameters_in_getter_declaration;
+import 'remove_parentheses_in_getter_invocation_test.dart'
+    as remove_parentheses_in_getter_invocation;
+import 'remove_this_expression_test.dart' as remove_this_expression;
+import 'remove_type_annotation_test.dart' as remove_type_annotation;
+import 'remove_type_arguments_test.dart' as remove_type_arguments;
+import 'remove_unnecessary_cast_test.dart' as remove_unnecessary_cast;
+import 'remove_unused_catch_clause_test.dart' as remove_unused_catch_clause;
+import 'remove_unused_catch_stack_test.dart' as remove_unused_catch_stack;
+import 'remove_unused_import_test.dart' as remove_unused_import;
+import 'rename_to_camel_case_test.dart' as rename_to_camel_case;
+import 'replace_boolean_with_bool_test.dart' as replace_boolean_with_bool;
+import 'replace_final_with_const_test.dart' as replace_final_with_const;
+import 'replace_return_type_future_test.dart' as replace_return_type_future;
+import 'replace_var_with_dynamic_test.dart' as replace_var_with_dynamic;
+import 'replace_with_brackets_test.dart' as replace_with_brackets;
+import 'replace_with_conditional_assignment_test.dart'
+    as replace_with_conditional_assignment;
+import 'replace_with_identifier_test.dart' as replace_with_identifier;
+import 'replace_with_literal_test.dart' as replace_with_literal;
+import 'replace_with_null_aware_test.dart' as replace_with_null_aware;
+import 'replace_with_tear_off_test.dart' as replace_with_tear_off;
+import 'update_sdk_constraints_test.dart' as update_sdk_constraints;
+import 'use_const_test.dart' as use_const;
+import 'use_effective_integer_division_test.dart'
+    as use_effective_integer_division;
+import 'use_eq_eq_null_test.dart' as use_eq_eq_null;
+import 'use_is_not_empty_test.dart' as use_is_not_empty;
+import 'use_not_eq_null_test.dart' as use_not_eq_null;
+
+main() {
+  defineReflectiveSuite(() {
+    add_async.main();
+    add_explicit_cast.main();
+    add_field_formal_parameters.main();
+    add_missing_parameter_named.main();
+    add_missing_parameter_positional.main();
+    add_missing_parameter_required.main();
+    add_missing_required_argument.main();
+    add_ne_null.main();
+    add_override.main();
+    add_required.main();
+    add_static.main();
+    add_super_constructor_invocation.main();
+    change_to.main();
+    change_to_nearest_precise_value.main();
+    change_to_static_access.main();
+    change_type_annotation.main();
+    convert_flutter_child.main();
+    convert_flutter_children.main();
+    convert_to_named_arguments.main();
+    create_class.main();
+    create_constructor_for_final_field.main();
+    create_constructor_super.main();
+    create_constructor.main();
+    create_field.main();
+    create_file.main();
+    create_function.main();
+    create_getter.main();
+    create_local_variable.main();
+    create_method.main();
+    create_missing_overrides.main();
+    create_mixin.main();
+    create_no_such_method.main();
+    extend_class_for_mixin.main();
+    fix.main();
+    import_async.main();
+    import_library_prefix.main();
+    import_library_project.main();
+    import_library_sdk.main();
+    import_library_show.main();
+    insert_semicolon.main();
+    make_class_abstract.main();
+    make_field_not_final.main();
+    make_final.main();
+    move_type_arguments_to_class.main();
+    remove_await.main();
+    remove_dead_code.main();
+    remove_empty_catch.main();
+    remove_empty_constructor_body.main();
+    remove_empty_else.main();
+    remove_empty_statement.main();
+    remove_initializer.main();
+    remove_interpolation_braces.main();
+    remove_method_declaration.main();
+    remove_parameters_in_getter_declaration.main();
+    remove_parentheses_in_getter_invocation.main();
+    remove_this_expression.main();
+    remove_type_annotation.main();
+    remove_type_arguments.main();
+    remove_unnecessary_cast.main();
+    remove_unused_catch_clause.main();
+    remove_unused_catch_stack.main();
+    remove_unused_import.main();
+    rename_to_camel_case.main();
+    replace_boolean_with_bool.main();
+    replace_final_with_const.main();
+    replace_return_type_future.main();
+    replace_var_with_dynamic.main();
+    replace_with_brackets.main();
+    replace_with_conditional_assignment.main();
+    replace_with_literal.main();
+    replace_with_identifier.main();
+    replace_with_null_aware.main();
+    replace_with_tear_off.main();
+    update_sdk_constraints.main();
+    use_const.main();
+    use_effective_integer_division.main();
+    use_eq_eq_null.main();
+    use_is_not_empty.main();
+    use_not_eq_null.main();
+  }, name: 'fix');
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
new file mode 100644
index 0000000..4b957b3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UpdateSdkConstraintsTest);
+  });
+}
+
+@reflectiveTest
+class UpdateSdkConstraintsTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.UPDATE_SDK_CONSTRAINTS;
+
+  test_any() async {
+    await testUpdate(from: 'any', to: '^2.1.0');
+  }
+
+  test_caret() async {
+    await testUpdate(from: '^2.0.0', to: '^2.1.0');
+  }
+
+  test_compound() async {
+    await testUpdate(from: "'>=2.0.0 <3.0.0'", to: "'>=2.1.0 <3.0.0'");
+  }
+
+  test_gt() async {
+    await testUpdate(from: "'>2.0.0'", to: "'>=2.1.0'");
+  }
+
+  test_gte() async {
+    await testUpdate(from: "'>=2.0.0'", to: "'>=2.1.0'");
+  }
+
+  testUpdate({String from, String to}) async {
+    updateTestPubspecFile('''
+environment:
+  sdk: $from
+''');
+    await resolveTestUnit('''
+Future<int> zero() async => 0;
+''');
+    await assertHasFix('''
+environment:
+  sdk: $to
+''', target: testPubspecPath);
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_const_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_const_test.dart
new file mode 100644
index 0000000..9ac1952
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_const_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseConstTest);
+  });
+}
+
+@reflectiveTest
+class UseConstTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.USE_CONST;
+
+  test_explicitNew() async {
+    await resolveTestUnit('''
+class A {
+  const A();
+}
+const a = new A();
+''');
+    await assertHasFix('''
+class A {
+  const A();
+}
+const a = const A();
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart
new file mode 100644
index 0000000..770f505
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_effective_integer_division_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseEffectiveIntegerDivisionTest);
+  });
+}
+
+@reflectiveTest
+class UseEffectiveIntegerDivisionTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION;
+
+  test_normalDivision() async {
+    await resolveTestUnit('''
+main() {
+  var a = 5;
+  var b = 2;
+  print((a / b).toInt());
+}
+''');
+    await assertHasFix('''
+main() {
+  var a = 5;
+  var b = 2;
+  print(a ~/ b);
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_eq_eq_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_eq_eq_null_test.dart
new file mode 100644
index 0000000..de6b873
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_eq_eq_null_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseEqEqNullTest);
+  });
+}
+
+@reflectiveTest
+class UseEqEqNullTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.USE_EQ_EQ_NULL;
+
+  test_isNull() async {
+    await resolveTestUnit('''
+main(p) {
+  p is Null;
+}
+''');
+    await assertHasFix('''
+main(p) {
+  p == null;
+}
+''');
+  }
+
+  test_isNull_all() async {
+    await resolveTestUnit('''
+main(p, q) {
+  p is Null;
+  q is Null;
+}
+''');
+    await assertHasFixAllFix(HintCode.TYPE_CHECK_IS_NULL, '''
+main(p, q) {
+  p == null;
+  q == null;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_is_not_empty_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_is_not_empty_test.dart
new file mode 100644
index 0000000..ab2da21
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_is_not_empty_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/correction/fix_internal.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseIsNotEmptyTest);
+  });
+}
+
+@reflectiveTest
+class UseIsNotEmptyTest extends FixProcessorLintTest {
+  @override
+  FixKind get kind => DartFixKind.USE_IS_NOT_EMPTY;
+
+  @override
+  String get lintCode => LintNames.prefer_is_not_empty;
+
+  test_notIsEmpty() async {
+    await resolveTestUnit('''
+f(c) {
+  if (/*LINT*/!c.isEmpty) {}
+}
+''');
+    await assertHasFix('''
+f(c) {
+  if (/*LINT*/c.isNotEmpty) {}
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/use_not_eq_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/use_not_eq_null_test.dart
new file mode 100644
index 0000000..3fdd82a
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/use_not_eq_null_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseNotEqNullTest);
+  });
+}
+
+@reflectiveTest
+class UseNotEqNullTest extends FixProcessorTest {
+  @override
+  FixKind get kind => DartFixKind.USE_NOT_EQ_NULL;
+
+  test_isNotNull() async {
+    await resolveTestUnit('''
+main(p) {
+  p is! Null;
+}
+''');
+    await assertHasFix('''
+main(p) {
+  p != null;
+}
+''');
+  }
+
+  test_isNotNull_all() async {
+    await resolveTestUnit('''
+main(p, q) {
+  p is! Null;
+  q is! Null;
+}
+''');
+    await assertHasFixAllFix(HintCode.TYPE_CHECK_IS_NOT_NULL, '''
+main(p, q) {
+  p != null;
+  q != null;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/test_all.dart b/pkg/analysis_server/test/src/services/correction/test_all.dart
new file mode 100644
index 0000000..7c6c49d
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/test_all.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'assist/test_all.dart' as assist_all;
+import 'fix/test_all.dart' as fix_all;
+
+main() {
+  defineReflectiveSuite(() {
+    assist_all.main();
+    fix_all.main();
+  }, name: 'correction');
+}
diff --git a/pkg/analysis_server/test/src/services/test_all.dart b/pkg/analysis_server/test/src/services/test_all.dart
new file mode 100644
index 0000000..46f575f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/test_all.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'correction/test_all.dart' as correction_all;
+
+main() {
+  defineReflectiveSuite(() {
+    correction_all.main();
+  }, name: 'services');
+}
diff --git a/pkg/analysis_server/test/src/test_all.dart b/pkg/analysis_server/test/src/test_all.dart
index c25b65a..6a07ced 100644
--- a/pkg/analysis_server/test/src/test_all.dart
+++ b/pkg/analysis_server/test/src/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,8 +6,10 @@
 
 import 'computer/test_all.dart' as computer_all;
 import 'domain_abstract_test.dart' as domain_abstract_test;
+import 'domains/test_all.dart' as domains_all;
 import 'flutter/test_all.dart' as flutter_all;
 import 'plugin/test_all.dart' as plugin_all;
+import 'services/test_all.dart' as services_all;
 import 'utilities/test_all.dart' as utilities_all;
 import 'watch_manager_test.dart' as watch_manager_test;
 
@@ -18,8 +20,10 @@
   defineReflectiveSuite(() {
     computer_all.main();
     domain_abstract_test.main();
+    domains_all.main();
     flutter_all.main();
     plugin_all.main();
+    services_all.main();
     utilities_all.main();
     watch_manager_test.main();
   }, name: 'src');
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index c148ef0..20193cb 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/utilities/flutter_util.dart b/pkg/analysis_server/test/src/utilities/flutter_util.dart
index 6e689e5..5eb623f 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_util.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_util.dart
@@ -1,11 +1,11 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 
-String flutterPkgLibPath = '/packages/flutter/lib';
+const String flutterPkgLibPath = '/packages/flutter/lib';
 
 /**
  * Add some Flutter libraries and types to the given [provider] and return
@@ -27,6 +27,7 @@
 ''');
 
   newFile('$flutterPkgLibPath/widgets.dart', r'''
+export 'src/widgets/async.dart';
 export 'src/widgets/basic.dart';
 export 'src/widgets/container.dart';
 export 'src/widgets/framework.dart';
@@ -159,6 +160,25 @@
   }
 
   void createSrcWidgets() {
+    newFile('$flutterPkgLibPath/src/widgets/async.dart', r'''
+import 'framework.dart';
+
+class AsyncSnapshot<T> {}
+
+typedef AsyncWidgetBuilder<T> = Widget Function(BuildContext context, AsyncSnapshot<T> snapshot);
+
+class StreamBuilder<T> {
+  const StreamBuilder({
+    Key key,
+    this.initialData,
+    Stream<T> stream,
+    @required this.builder
+  });
+  final T initialData;
+  final AsyncWidgetBuilder<T> builder;
+}
+''');
+
     newFile('$flutterPkgLibPath/src/widgets/basic.dart', r'''
 import 'package:flutter/rendering.dart';
 
diff --git a/pkg/analysis_server/test/src/utilities/profiling_test.dart b/pkg/analysis_server/test/src/utilities/profiling_test.dart
index 4906c4b..ccc4c22 100644
--- a/pkg/analysis_server/test/src/utilities/profiling_test.dart
+++ b/pkg/analysis_server/test/src/utilities/profiling_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/utilities/test_all.dart b/pkg/analysis_server/test/src/utilities/test_all.dart
index cf5d6fc..580e29b 100644
--- a/pkg/analysis_server/test/src/utilities/test_all.dart
+++ b/pkg/analysis_server/test/src/utilities/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/src/watch_manager_test.dart b/pkg/analysis_server/test/src/watch_manager_test.dart
index 248c5b0..a5a4a93 100644
--- a/pkg/analysis_server/test/src/watch_manager_test.dart
+++ b/pkg/analysis_server/test/src/watch_manager_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -70,7 +70,7 @@
 }
 
 @reflectiveTest
-class WatchManagerTest extends Object with ResourceProviderMixin {
+class WatchManagerTest with ResourceProviderMixin {
   WatchListener listener;
   WatchManager<Token> manager;
 
@@ -194,7 +194,7 @@
 }
 
 @reflectiveTest
-class WatchNodeTest extends Object with ResourceProviderMixin {
+class WatchNodeTest with ResourceProviderMixin {
   void test_creation_folder() {
     Folder folder = getFolder('/a/b');
     WatchNode node = new WatchNode(folder);
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 3605038..41a69b8 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.dart
@@ -103,8 +103,8 @@
         }
         fileCount++;
         output.write('.');
-        ResolveResult result =
-            await context.currentSession.getResolvedAst(path);
+        ResolvedUnitResult result =
+            await context.currentSession.getResolvedUnit(path);
         String content = result.content;
         LineInfo lineInfo = result.lineInfo;
         List<SimpleIdentifier> identifiers = _identifiersIn(result.unit);
@@ -117,7 +117,7 @@
                 content.substring(identifier.end);
             resourceProvider.setOverlay(path,
                 content: modifiedContent, modificationStamp: stamp++);
-            result = await context.currentSession.getResolvedAst(path);
+            result = await context.currentSession.getResolvedUnit(path);
           }
 
           timer.start();
diff --git a/pkg/analysis_server/test/stress/replay/operation.dart b/pkg/analysis_server/test/stress/replay/operation.dart
index dbacce9..fc6334e 100644
--- a/pkg/analysis_server/test/stress/replay/operation.dart
+++ b/pkg/analysis_server/test/stress/replay/operation.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/stress/replay/replay.dart b/pkg/analysis_server/test/stress/replay/replay.dart
index d713f0a..60397de 100644
--- a/pkg/analysis_server/test/stress/replay/replay.dart
+++ b/pkg/analysis_server/test/stress/replay/replay.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/stress/utilities/git.dart b/pkg/analysis_server/test/stress/utilities/git.dart
index 1be2307..0b16361 100644
--- a/pkg/analysis_server/test/stress/utilities/git.dart
+++ b/pkg/analysis_server/test/stress/utilities/git.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/stress/utilities/logger.dart b/pkg/analysis_server/test/stress/utilities/logger.dart
index acf7a74..bbdd406 100644
--- a/pkg/analysis_server/test/stress/utilities/logger.dart
+++ b/pkg/analysis_server/test/stress/utilities/logger.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/stress/utilities/server.dart b/pkg/analysis_server/test/stress/utilities/server.dart
index ccd2ac5..c845787 100644
--- a/pkg/analysis_server/test/stress/utilities/server.dart
+++ b/pkg/analysis_server/test/stress/utilities/server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -50,20 +50,6 @@
   void operator []=(String filePath, List<AnalysisError> errors) {
     pathMap[filePath] = errors;
   }
-
-  /**
-   * Compare the this error map with the state captured in the given [errorMap].
-   * Throw an exception if the two maps do not agree.
-   */
-  String expectErrorMap(ErrorMap errorMap) {
-    StringBuffer buffer = new StringBuffer();
-    _ErrorComparator comparator = new _ErrorComparator(buffer);
-    comparator.compare(pathMap, errorMap.pathMap);
-    if (buffer.length > 0) {
-      return buffer.toString();
-    }
-    return null;
-  }
 }
 
 /**
@@ -436,8 +422,8 @@
     return _send("analysis.getReachableSources", params);
   }
 
-  void sendAnalysisReanalyze({List<String> roots}) {
-    var params = new AnalysisReanalyzeParams(roots: roots).toJson();
+  void sendAnalysisReanalyze() {
+    var params = new AnalysisReanalyzeParams().toJson();
     _send("analysis.reanalyze", params);
   }
 
@@ -938,141 +924,3 @@
     return requestData;
   }
 }
-
-/**
- * A utility class used to compare two sets of errors.
- */
-class _ErrorComparator {
-  /**
-   * An empty list of analysis errors.
-   */
-  static final List<AnalysisError> NO_ERRORS = <AnalysisError>[];
-
-  /**
-   * The buffer to which an error description will be written if any of the
-   * files have different errors than are expected.
-   */
-  final StringBuffer buffer;
-
-  /**
-   * Initialize a newly created comparator to write to the given [buffer].
-   */
-  _ErrorComparator(this.buffer);
-
-  /**
-   * Compare the [actualErrorMap] and the [expectedErrorMap], writing a
-   * description to the [buffer] if they are not the same. The error maps are
-   * expected to be maps from absolute file paths to the list of actual or
-   * expected errors.
-   */
-  void compare(Map<String, List<AnalysisError>> actualErrorMap,
-      Map<String, List<AnalysisError>> expectedErrorMap) {
-    Set<String> allFiles = new HashSet();
-    allFiles.addAll(actualErrorMap.keys);
-    allFiles.addAll(expectedErrorMap.keys);
-    List<String> sortedFiles = allFiles.toList()..sort();
-    for (String filePath in sortedFiles) {
-      List<AnalysisError> actualErrors = actualErrorMap[filePath];
-      List<AnalysisError> expectedErrors = expectedErrorMap[filePath];
-      _compareLists(
-          filePath, actualErrors ?? NO_ERRORS, expectedErrors ?? NO_ERRORS);
-    }
-  }
-
-  /**
-   * Compare the [actualErrors] and [expectedErrors], writing a description to
-   * the [buffer] if they are not the same.
-   */
-  void _compareLists(String filePath, List<AnalysisError> actualErrors,
-      List<AnalysisError> expectedErrors) {
-    List<AnalysisError> remainingExpected =
-        new List<AnalysisError>.from(expectedErrors);
-    for (AnalysisError actualError in actualErrors) {
-      AnalysisError expectedError = _findError(remainingExpected, actualError);
-      if (expectedError == null) {
-        _writeReport(filePath, actualErrors, expectedErrors);
-        return;
-      }
-      remainingExpected.remove(expectedError);
-    }
-    if (remainingExpected.isNotEmpty) {
-      _writeReport(filePath, actualErrors, expectedErrors);
-    }
-  }
-
-  /**
-   * Return `true` if the [firstError] and the [secondError] are equivalent.
-   */
-  bool _equalErrors(AnalysisError firstError, AnalysisError secondError) =>
-      firstError.severity == secondError.severity &&
-      firstError.type == secondError.type &&
-      _equalLocations(firstError.location, secondError.location) &&
-      firstError.message == secondError.message;
-
-  /**
-   * Return `true` if the [firstLocation] and the [secondLocation] are
-   * equivalent.
-   */
-  bool _equalLocations(Location firstLocation, Location secondLocation) =>
-      firstLocation.file == secondLocation.file &&
-      firstLocation.offset == secondLocation.offset &&
-      firstLocation.length == secondLocation.length;
-
-  /**
-   * Search through the given list of [errors] for an error that is equal to the
-   * [targetError]. If one is found, return it, otherwise return `null`.
-   */
-  AnalysisError _findError(
-      List<AnalysisError> errors, AnalysisError targetError) {
-    for (AnalysisError error in errors) {
-      if (_equalErrors(error, targetError)) {
-        return error;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Write the given list of [errors], preceded by a header beginning with the
-   * given [prefix].
-   */
-  void _writeErrors(String prefix, List<AnalysisError> errors) {
-    buffer.write(prefix);
-    buffer.write(errors.length);
-    buffer.write(' errors:');
-    for (AnalysisError error in errors) {
-      buffer.writeln();
-      Location location = error.location;
-      int offset = location.offset;
-      buffer.write('    ');
-      buffer.write(location.file);
-      buffer.write(' (');
-      buffer.write(offset);
-      buffer.write('..');
-      buffer.write(offset + location.length);
-      buffer.write(') ');
-      buffer.write(error.severity);
-      buffer.write(', ');
-      buffer.write(error.type);
-      buffer.write(' : ');
-      buffer.write(error.message);
-    }
-  }
-
-  /**
-   * Write a report of the differences between the [actualErrors] and the
-   * [expectedErrors]. The errors are reported as being from the file at the
-   * given [filePath].
-   */
-  void _writeReport(String filePath, List<AnalysisError> actualErrors,
-      List<AnalysisError> expectedErrors) {
-    if (buffer.length > 0) {
-      buffer.writeln();
-      buffer.writeln();
-    }
-    buffer.writeln(filePath);
-    _writeErrors('  Expected ', expectedErrors);
-    buffer.writeln();
-    _writeErrors('  Found ', actualErrors);
-  }
-}
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index a736732..e26c43d 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -13,6 +13,7 @@
 import 'domain_analysis_test.dart' as domain_analysis_test;
 import 'domain_completion_test.dart' as domain_completion_test;
 import 'domain_diagnostic_test.dart' as domain_experimental_test;
+import 'domain_edit_dartfix_test.dart' as domain_edit_dartfix_test;
 import 'domain_execution_test.dart' as domain_execution_test;
 import 'domain_server_test.dart' as domain_server_test;
 import 'edit/test_all.dart' as edit_all;
@@ -36,6 +37,7 @@
     context_manager_test.main();
     domain_analysis_test.main();
     domain_completion_test.main();
+    domain_edit_dartfix_test.main();
     domain_execution_test.main();
     domain_experimental_test.main();
     domain_server_test.main();
diff --git a/pkg/analysis_server/test/test_utilities/utillities.dart b/pkg/analysis_server/test/test_utilities/utillities.dart
deleted file mode 100644
index 4b4dddd..0000000
--- a/pkg/analysis_server/test/test_utilities/utillities.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-/**
- * Call a test that we think will fail.
- *
- * Ensure that we return any thrown exception correctly (avoiding the
- * package:test zone error handler).
- */
-Future callFailingTest(Future Function() expectedFailingTestFn) {
-  final Completer completer = new Completer();
-
-  try {
-    runZoned(
-      () async => await expectedFailingTestFn(),
-      onError: (error) {
-        completer.completeError(error);
-      },
-    ).then((result) {
-      completer.complete(result);
-    }).catchError((error) {
-      completer.completeError(error);
-    });
-  } catch (error) {
-    completer.completeError(error);
-  }
-
-  return completer.future;
-}
diff --git a/pkg/analysis_server/test/timing/completion/completion_simple.dart b/pkg/analysis_server/test/timing/completion/completion_simple.dart
index 50cbaa2..2e8164a 100644
--- a/pkg/analysis_server/test/timing/completion/completion_simple.dart
+++ b/pkg/analysis_server/test/timing/completion/completion_simple.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/timing/timing_framework.dart b/pkg/analysis_server/test/timing/timing_framework.dart
index 9c4be1f..d02e6f0 100644
--- a/pkg/analysis_server/test/timing/timing_framework.dart
+++ b/pkg/analysis_server/test/timing/timing_framework.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/test/tool/lsp_spec/dart_test.dart b/pkg/analysis_server/test/tool/lsp_spec/dart_test.dart
index 068063c..fbf2615 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/dart_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/dart_test.dart
@@ -1,48 +1,37 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:test/test.dart';
 
-import '../../../tool/lsp_spec/codegen_dart.dart';
+import '../../../tool/lsp_spec/typescript_parser.dart' as ast;
 
 main() {
-  group('mapType', () {
+  group('dartType mapping', () {
     test('handles basic types', () {
-      expect(mapType(['string']), equals('String'));
-      expect(mapType(['boolean']), equals('bool'));
-      expect(mapType(['any']), equals('dynamic'));
-      expect(mapType(['object']), equals('dynamic'));
-      expect(mapType(['int']), equals('int'));
-      expect(mapType(['num']), equals('num'));
+      expect(_simple('string').dartType, equals('String'));
+      expect(_simple('boolean').dartType, equals('bool'));
+      expect(_simple('any').dartType, equals('dynamic'));
+      expect(_simple('object').dartType, equals('dynamic'));
+      expect(_simple('int').dartType, equals('int'));
+      expect(_simple('num').dartType, equals('num'));
     });
 
     test('handles union types', () {
-      expect(mapType(['string', 'int']), equals('Either2<String, int>'));
-      expect(mapType(['string | int']), equals('Either2<String, int>'));
+      expect(_union(['string', 'int']).dartTypeWithTypeArgs,
+          equals('Either2<String, int>'));
     });
 
     test('handles arrays', () {
-      expect(mapType(['string[]']), equals('List<String>'));
-      expect(mapType(['Array<string>']), equals('List<String>'));
-    });
-
-    test('handles types with args', () {
-      expect(mapType(['Class<string[]>']), equals('Class<List<String>>'));
-      expect(mapType(['Array<string | num>']),
-          equals('List<Either2<String, num>>'));
-    });
-
-    test('handles complex nested types', () {
-      expect(
-          mapType([
-            'Array<string>',
-            'any[]',
-            'Response<A>',
-            'Request<Array<string | num>>'
-          ]),
-          equals(
-              'Either4<List<String>, List<dynamic>, Response<A>, Request<List<Either2<String, num>>>>'));
+      expect(_array('string').dartTypeWithTypeArgs, equals('List<String>'));
     });
   });
 }
+
+ast.Type _simple(String name) =>
+    new ast.Type(new ast.Token(ast.TokenType.IDENTIFIER, name), []);
+
+ast.ArrayType _array(String name) => new ast.ArrayType(_simple(name));
+
+ast.UnionType _union(List<String> names) =>
+    new ast.UnionType(names.map(_simple).toList());
diff --git a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
index e12b850..df7a3c8 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/json_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -18,23 +18,21 @@
     });
 
     test('returns correct output for union types', () {
-      final message =
-          new RequestMessage(new Either2.t1(1), "test", null, "test");
+      final message = new RequestMessage(
+          new Either2<num, String>.t1(1), Method.shutdown, null, "test");
       String output = json.encode(message.toJson());
-      expect(output, equals('{"id":1,"method":"test","jsonrpc":"test"}'));
+      expect(output, equals('{"id":1,"method":"shutdown","jsonrpc":"test"}'));
     });
 
     test('returns correct output for union types containing interface types',
         () {
-      final params = new Either2<String, WorkspaceClientCapabilities>.t2(
-          new WorkspaceClientCapabilities(
-        true,
-        null,
-        null,
-        null,
-      ));
+      final params = new Either2<String, TextDocumentItem>.t2(
+          new TextDocumentItem('!uri', '!language', 1, '!text'));
       String output = json.encode(params);
-      expect(output, equals('{"applyEdit":true}'));
+      expect(
+          output,
+          equals(
+              '{"uri":"!uri","languageId":"!language","version":1,"text":"!text"}'));
     });
 
     test('returns correct output for types with lists', () {
@@ -45,7 +43,7 @@
       final codeAction = new Diagnostic(
         range,
         DiagnosticSeverity.Error,
-        new Either2.t2('test_err'),
+        'test_err',
         '/tmp/source.dart',
         'err!!',
         [new DiagnosticRelatedInformation(location, 'message')],
@@ -91,55 +89,133 @@
           .replaceAll(new RegExp('[ \n]'), '');
       expect(output, equals(expected));
     });
+
+    test('ResponseMessage does not include an error with a result', () {
+      final id = new Either2<num, String>.t1(1);
+      final result = 'my result';
+      final resp = new ResponseMessage(id, result, null, jsonRpcVersion);
+      final jsonMap = resp.toJson();
+      expect(jsonMap, contains('result'));
+      expect(jsonMap, isNot(contains('error')));
+    });
+
+    test('ResponseMessage can include a null result', () {
+      final id = new Either2<num, String>.t1(1);
+      final resp = new ResponseMessage(id, null, null, jsonRpcVersion);
+      final jsonMap = resp.toJson();
+      expect(jsonMap, contains('result'));
+      expect(jsonMap, isNot(contains('error')));
+    });
+
+    test('ResponseMessage does not include a result for an error', () {
+      final id = new Either2<num, String>.t1(1);
+      final error =
+          new ResponseError<String>(ErrorCodes.ParseError, 'Error', null);
+      final resp = new ResponseMessage(id, null, error, jsonRpcVersion);
+      final jsonMap = resp.toJson();
+      expect(jsonMap, contains('error'));
+      expect(jsonMap, isNot(contains('result')));
+    });
+
+    test('ResponseMessage throws if both result and error are non-null', () {
+      final id = new Either2<num, String>.t1(1);
+      final result = 'my result';
+      final error =
+          new ResponseError<String>(ErrorCodes.ParseError, 'Error', null);
+      final resp = new ResponseMessage(id, result, error, jsonRpcVersion);
+      expect(resp.toJson, throwsA(new TypeMatcher<String>()));
+    });
   });
 
   group('fromJson', () {
     test('parses JSON for types with unions (left side)', () {
-      final input = '{"id":1,"method":"test","jsonrpc":"test"}';
-      final message = new RequestMessage.fromJson(jsonDecode(input));
+      final input = '{"id":1,"method":"shutdown","jsonrpc":"test"}';
+      final message = RequestMessage.fromJson(jsonDecode(input));
       expect(message.id, equals(new Either2<num, String>.t1(1)));
       expect(message.id.valueEquals(1), isTrue);
       expect(message.jsonrpc, "test");
-      expect(message.method, "test");
+      expect(message.method, Method.shutdown);
     });
 
     test('parses JSON for types with unions (right side)', () {
-      final input = '{"id":"one","method":"test","jsonrpc":"test"}';
-      final message = new RequestMessage.fromJson(jsonDecode(input));
+      final input = '{"id":"one","method":"shutdown","jsonrpc":"test"}';
+      final message = RequestMessage.fromJson(jsonDecode(input));
       expect(message.id, equals(new Either2<num, String>.t2("one")));
       expect(message.id.valueEquals("one"), isTrue);
       expect(message.jsonrpc, "test");
-      expect(message.method, "test");
+      expect(message.method, Method.shutdown);
+    });
+
+    test('parses JSON with nulls for unions that allow null', () {
+      final input = '{"id":null,"jsonrpc":"test"}';
+      final message = ResponseMessage.fromJson(jsonDecode(input));
+      expect(message.id, isNull);
+    });
+
+    test('parses JSON with nulls for unions that allow null', () {
+      final input = '{"method":"test","jsonrpc":"test"}';
+      final message = NotificationMessage.fromJson(jsonDecode(input));
+      expect(message.params, isNull);
+    });
+
+    test('deserialises subtypes into the correct class', () {
+      // Create some JSON that includes a VersionedTextDocumentIdenfitier but
+      // where the class definition only references a TextDocumentIdemntifier.
+      final input = jsonEncode(new TextDocumentPositionParams(
+        new VersionedTextDocumentIdentifier(111, 'file:///foo/bar.dart'),
+        new Position(1, 1),
+      ).toJson());
+      final params = TextDocumentPositionParams.fromJson(jsonDecode(input));
+      expect(params.textDocument,
+          const TypeMatcher<VersionedTextDocumentIdentifier>());
     });
   });
 
-  test('objects with lists and enums can round-trip through to json and back',
-      () {
-    final obj = new ClientCapabilities(
-        new WorkspaceClientCapabilities(
-            true,
-            false,
-            [ResourceOperationKind.Create, ResourceOperationKind.Delete],
-            FailureHandlingKind.Undo),
-        new TextDocumentClientCapabilities(true, false, true, false),
-        null);
+  test('objects with lists can round-trip through to json and back', () {
+    final obj = new InitializeParams(1, '!root', null, null,
+        new ClientCapabilities(null, null, null), '!trace', [
+      new WorkspaceFolder('!uri1', '!name1'),
+      new WorkspaceFolder('!uri2', '!name2'),
+    ]);
     final String json = jsonEncode(obj);
-    final restoredObj = new ClientCapabilities.fromJson(jsonDecode(json));
+    final restoredObj = InitializeParams.fromJson(jsonDecode(json));
 
-    expect(restoredObj.workspace.applyEdit, equals(obj.workspace.applyEdit));
-    expect(restoredObj.workspace.documentChanges,
-        equals(obj.workspace.documentChanges));
-    expect(restoredObj.workspace.resourceOperations,
-        equals(obj.workspace.resourceOperations));
-    expect(restoredObj.workspace.failureHandling,
-        equals(obj.workspace.failureHandling));
-    expect(restoredObj.textDocument.didSave, equals(obj.textDocument.didSave));
-    expect(restoredObj.textDocument.dynamicRegistration,
-        equals(obj.textDocument.dynamicRegistration));
     expect(
-        restoredObj.textDocument.willSave, equals(obj.textDocument.willSave));
-    expect(restoredObj.textDocument.willSaveWaitUntil,
-        equals(obj.textDocument.willSaveWaitUntil));
-    expect(restoredObj.experimental, equals(obj.experimental));
+        restoredObj.workspaceFolders, hasLength(obj.workspaceFolders.length));
+    for (var i = 0; i < obj.workspaceFolders.length; i++) {
+      expect(restoredObj.workspaceFolders[i].name,
+          equals(obj.workspaceFolders[i].name));
+      expect(restoredObj.workspaceFolders[i].uri,
+          equals(obj.workspaceFolders[i].uri));
+    }
+  });
+
+  test('objects with enums can round-trip through to json and back', () {
+    final obj = new FoldingRange(1, 2, 3, 4, FoldingRangeKind.Comment);
+    final String json = jsonEncode(obj);
+    final restoredObj = FoldingRange.fromJson(jsonDecode(json));
+
+    expect(restoredObj.startLine, equals(obj.startLine));
+    expect(restoredObj.startCharacter, equals(obj.startCharacter));
+    expect(restoredObj.endLine, equals(obj.endLine));
+    expect(restoredObj.endCharacter, equals(obj.endCharacter));
+    expect(restoredObj.kind, equals(obj.kind));
+  });
+
+  test('objects with maps can round-trip through to json and back', () {
+    final start = new Position(1, 1);
+    final end = new Position(2, 2);
+    final range = new Range(start, end);
+    final obj = new WorkspaceEdit(<String, List<TextEdit>>{
+      'fileA': [new TextEdit(range, 'text A')],
+      'fileB': [new TextEdit(range, 'text B')]
+    }, null);
+    final String json = jsonEncode(obj);
+    final restoredObj = WorkspaceEdit.fromJson(jsonDecode(json));
+
+    expect(restoredObj.documentChanges, equals(obj.documentChanges));
+    expect(restoredObj.changes, equals(obj.changes));
+    expect(restoredObj.changes.keys, equals(obj.changes.keys));
+    expect(restoredObj.changes.values, equals(obj.changes.values));
   });
 }
diff --git a/pkg/analysis_server/test/tool/lsp_spec/matchers.dart b/pkg/analysis_server/test/tool/lsp_spec/matchers.dart
new file mode 100644
index 0000000..72ee321
--- /dev/null
+++ b/pkg/analysis_server/test/tool/lsp_spec/matchers.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:matcher/matcher.dart';
+
+import '../../../tool/lsp_spec/typescript_parser.dart';
+
+Matcher isSimpleType(String name) => new SimpleTypeMatcher(name);
+
+class SimpleTypeMatcher extends Matcher {
+  final String _expectedName;
+  const SimpleTypeMatcher(this._expectedName);
+
+  bool matches(item, Map matchState) {
+    return item is Type && item.name == _expectedName;
+  }
+
+  Description describe(Description description) =>
+      description.add('a type with the name $_expectedName');
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is Type) {
+      return mismatchDescription
+          .add('has the name ')
+          .addDescriptionOf(item.name);
+    } else {
+      return mismatchDescription.add('is not a Type');
+    }
+  }
+}
+
+Matcher isArrayOf(Matcher matcher) =>
+    new ArrayTypeMatcher(wrapMatcher(matcher));
+
+class ArrayTypeMatcher extends Matcher {
+  final Matcher _elementTypeMatcher;
+  const ArrayTypeMatcher(this._elementTypeMatcher);
+
+  bool matches(item, Map matchState) {
+    return item is ArrayType &&
+        _elementTypeMatcher.matches(item.elementType, matchState);
+  }
+
+  Description describe(Description description) =>
+      description.add('an array of ').addDescriptionOf(_elementTypeMatcher);
+
+  Description describeMismatch(
+      item, Description mismatchDescription, Map matchState, bool verbose) {
+    if (item is ArrayType) {
+      return _elementTypeMatcher.describeMismatch(
+          item, mismatchDescription, matchState, verbose);
+    } else {
+      return mismatchDescription.add('is not an ArrayType');
+    }
+  }
+}
+
+Matcher isMapOf(Matcher indexMatcher, Matcher valueMatcher) =>
+    new MapTypeMatcher(wrapMatcher(indexMatcher), wrapMatcher(valueMatcher));
+
+class MapTypeMatcher extends Matcher {
+  final Matcher _indexMatcher, _valueMatcher;
+  const MapTypeMatcher(this._indexMatcher, this._valueMatcher);
+
+  bool matches(item, Map matchState) {
+    return item is MapType &&
+        _indexMatcher.matches(item.indexType, matchState) &&
+        _valueMatcher.matches(item.valueType, matchState);
+  }
+
+  Description describe(Description description) => description
+      .add('a MapType where index is ')
+      .addDescriptionOf(_indexMatcher)
+      .add(' and value is ')
+      .addDescriptionOf(_valueMatcher);
+}
+
+Matcher isResponseError(ErrorCodes code) => const TypeMatcher<ResponseError>()
+    .having((e) => e.code, 'code', equals(code));
diff --git a/pkg/analysis_server/test/tool/lsp_spec/test_all.dart b/pkg/analysis_server/test/tool/lsp_spec/test_all.dart
new file mode 100644
index 0000000..1edfb80
--- /dev/null
+++ b/pkg/analysis_server/test/tool/lsp_spec/test_all.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'dart_test.dart' as dart_test;
+import 'json_test.dart' as json_test;
+import 'markdown_test.dart' as markdown_test;
+import 'typescript_test.dart' as typescript_test;
+
+main() {
+  defineReflectiveSuite(() {
+    dart_test.main();
+    json_test.main();
+    markdown_test.main();
+    typescript_test.main();
+  }, name: 'lsp-tool');
+}
diff --git a/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart b/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
index 1fad598..abf1791 100644
--- a/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
+++ b/pkg/analysis_server/test/tool/lsp_spec/typescript_test.dart
@@ -4,7 +4,8 @@
 
 import 'package:test/test.dart';
 
-import '../../../tool/lsp_spec/typescript.dart';
+import '../../../tool/lsp_spec/typescript_parser.dart';
+import 'matchers.dart';
 
 main() {
   group('typescript parser', () {
@@ -20,22 +21,57 @@
 	options?: OptionKind[];
 }
     ''';
-      final List<ApiItem> output = extractTypes(input);
+      final List<AstNode> output = parseString(input);
       expect(output, hasLength(1));
       expect(output[0], const TypeMatcher<Interface>());
       final Interface interface = output[0];
       expect(interface.name, equals('SomeOptions'));
-      expect(interface.comment, equals('Some options.'));
+      expect(interface.commentText, equals('Some options.'));
       expect(interface.baseTypes, hasLength(0));
       expect(interface.members, hasLength(1));
       expect(interface.members[0], const TypeMatcher<Field>());
       final Field field = interface.members[0];
       expect(field.name, equals('options'));
-      expect(field.comment, equals('''Options used by something.'''));
+      expect(field.commentText, equals('''Options used by something.'''));
       expect(field.allowsNull, isFalse);
       expect(field.allowsUndefined, isTrue);
-      expect(field.types, hasLength(1));
-      expect(field.types[0], equals('OptionKind[]'));
+      expect(field.type, isArrayOf(isSimpleType('OptionKind')));
+    });
+
+    test('parses an interface with a field with an inline/unnamed type', () {
+      final String input = '''
+export interface Capabilities {
+	textDoc?: {
+    deprecated?: bool;
+  };
+}
+    ''';
+      final List<AstNode> output = parseString(input);
+      // Length is two because we'll fabricate the type of textDoc.
+      expect(output, hasLength(2));
+
+      // Check there was a full fabricarted interface for this type.
+      expect(output[0], const TypeMatcher<Interface>());
+      Interface interface = output[0];
+      expect(interface.name, equals('CapabilitiesTextDoc'));
+      expect(interface.members, hasLength(1));
+      expect(interface.members[0], const TypeMatcher<Field>());
+      Field field = interface.members[0];
+      expect(field.name, equals('deprecated'));
+      expect(field.allowsNull, isFalse);
+      expect(field.allowsUndefined, isTrue);
+      expect(field.type, isSimpleType('bool'));
+      expect(field.allowsUndefined, isTrue);
+
+      expect(output[1], const TypeMatcher<Interface>());
+      interface = output[1];
+      expect(interface.name, equals('Capabilities'));
+      expect(interface.members, hasLength(1));
+      expect(interface.members[0], const TypeMatcher<Field>());
+      field = interface.members[0];
+      expect(field.name, equals('textDoc'));
+      expect(field.allowsNull, isFalse);
+      expect(field.type, isSimpleType('CapabilitiesTextDoc'));
     });
 
     test('parses an interface with multiple fields', () {
@@ -51,7 +87,7 @@
 	options1: any;
 }
     ''';
-      final List<ApiItem> output = extractTypes(input);
+      final List<AstNode> output = parseString(input);
       expect(output, hasLength(1));
       expect(output[0], const TypeMatcher<Interface>());
       final Interface interface = output[0];
@@ -60,7 +96,7 @@
         expect(interface.members[i], const TypeMatcher<Field>());
         final Field field = interface.members[i];
         expect(field.name, equals('options$i'));
-        expect(field.comment, equals('''Options$i used by something.'''));
+        expect(field.commentText, equals('''Options$i used by something.'''));
       });
     });
 
@@ -70,7 +106,7 @@
 	data?: D;
 }
     ''';
-      final List<ApiItem> output = extractTypes(input);
+      final List<AstNode> output = parseString(input);
       expect(output, hasLength(1));
       expect(output[0], const TypeMatcher<Interface>());
       final Interface interface = output[0];
@@ -78,21 +114,21 @@
       final Field field = interface.members.first;
       expect(field, const TypeMatcher<Field>());
       expect(field.name, equals('data'));
-      expect(field.allowsUndefined, true);
-      expect(field.allowsNull, false);
-      expect(field.types, equals(['D']));
+      expect(field.allowsUndefined, isTrue);
+      expect(field.allowsNull, isFalse);
+      expect(field.type, isSimpleType('D'));
     });
 
     test('parses an interface with Arrays in Array<T> format', () {
       final String input = '''
-export interface RequestMessage {
+export interface MyMessage {
 	/**
 	 * The method's params.
 	 */
 	params?: Array<any> | object;
 }
     ''';
-      final List<ApiItem> output = extractTypes(input);
+      final List<AstNode> output = parseString(input);
       expect(output, hasLength(1));
       expect(output[0], const TypeMatcher<Interface>());
       final Interface interface = output[0];
@@ -100,10 +136,32 @@
       final Field field = interface.members.first;
       expect(field, const TypeMatcher<Field>());
       expect(field.name, equals('params'));
-      expect(field.comment, equals('''The method's params.'''));
-      expect(field.allowsUndefined, true);
-      expect(field.allowsNull, false);
-      expect(field.types, equals(['Array<any>', 'object']));
+      expect(field.commentText, equals('''The method's params.'''));
+      expect(field.allowsUndefined, isTrue);
+      expect(field.allowsNull, isFalse);
+      expect(field.type, const TypeMatcher<UnionType>());
+      UnionType union = field.type;
+      expect(union.types, hasLength(2));
+      expect(union.types[0], isArrayOf(isSimpleType('any')));
+      expect(union.types[1], isSimpleType('object'));
+    });
+
+    test('parses an interface with a map into a MapType', () {
+      final String input = '''
+export interface WorkspaceEdit {
+	changes: { [uri: string]: TextEdit[]; };
+}
+    ''';
+      final List<AstNode> output = parseString(input);
+      expect(output, hasLength(1));
+      expect(output[0], const TypeMatcher<Interface>());
+      final Interface interface = output[0];
+      expect(interface.members, hasLength(1));
+      final Field field = interface.members.first;
+      expect(field, const TypeMatcher<Field>());
+      expect(field.name, equals('changes'));
+      expect(field.type,
+          isMapOf(isSimpleType('string'), isArrayOf(isSimpleType('TextEdit'))));
     });
 
     test('flags nullable undefined values', () {
@@ -115,7 +173,7 @@
   canBeUndefined?: string;
 }
     ''';
-      final List<ApiItem> output = extractTypes(input);
+      final List<AstNode> output = parseString(input);
       final Interface interface = output[0];
       expect(interface.members, hasLength(4));
       interface.members.forEach((m) => expect(m, const TypeMatcher<Field>()));
@@ -143,21 +201,21 @@
  * Blank lines should remain in-tact, as should:
  *   - Indented
  *   - Things
- * 
+ *
  * Some docs have:
  * - List items that are not indented
- * 
+ *
  * Sometimes after a blank line we'll have a note.
- * 
+ *
  * *Note* that something.
  */
 export interface A {
   a: a;
 }
     ''';
-      final List<ApiItem> output = extractTypes(input);
+      final List<AstNode> output = parseString(input);
       final Interface interface = output[0];
-      expect(interface.comment, equals('''
+      expect(interface.commentText, equals('''
 Describes the what this class in lots of words that wrap onto multiple lines that will need re-wrapping to format nicely when converted into Dart.
 
 Blank lines should remain in-tact, as should:
@@ -176,12 +234,12 @@
       final String input = '''
 export type DocumentSelector = DocumentFilter[];
     ''';
-      final List<ApiItem> output = extractTypes(input);
+      final List<AstNode> output = parseString(input);
       expect(output, hasLength(1));
       expect(output[0], const TypeMatcher<TypeAlias>());
       final TypeAlias typeAlias = output[0];
       expect(typeAlias.name, equals('DocumentSelector'));
-      expect(typeAlias.baseType, equals('DocumentFilter[]'));
+      expect(typeAlias.baseType, isArrayOf(isSimpleType('DocumentFilter')));
     });
 
     test('parses a namespace of constants', () {
@@ -203,7 +261,7 @@
 	export const Rename: ResourceOperationKind = 'rename';
 }
     ''';
-      final List<ApiItem> output = extractTypes(input);
+      final List<AstNode> output = parseString(input);
       expect(output, hasLength(1));
       expect(output[0], const TypeMatcher<Namespace>());
       final Namespace namespace = output[0];
@@ -213,17 +271,38 @@
           delete = namespace.members[1],
           rename = namespace.members[2];
       expect(create.name, equals('Create'));
-      expect(create.type, equals('ResourceOperationKind'));
-      expect(
-          create.comment, equals('Supports creating new files and folders.'));
+      expect(create.type, isSimpleType('ResourceOperationKind'));
+      expect(create.commentText,
+          equals('Supports creating new files and folders.'));
       expect(rename.name, equals('Rename'));
-      expect(rename.type, equals('ResourceOperationKind'));
-      expect(rename.comment,
+      expect(rename.type, isSimpleType('ResourceOperationKind'));
+      expect(rename.commentText,
           equals('Supports renaming existing files and folders.'));
       expect(delete.name, equals('Delete'));
-      expect(delete.type, equals('ResourceOperationKind'));
-      expect(delete.comment,
+      expect(delete.type, isSimpleType('ResourceOperationKind'));
+      expect(delete.commentText,
           equals('Supports deleting existing files and folders.'));
     });
+
+    test('parses a tuple in an array', () {
+      final String input = '''
+interface SomeInformation {
+	label: string | [number, number];
+}
+    ''';
+      final List<AstNode> output = parseString(input);
+      expect(output, hasLength(1));
+      expect(output[0], const TypeMatcher<Interface>());
+      final Interface interface = output[0];
+      expect(interface.members, hasLength(1));
+      final Field field = interface.members.first;
+      expect(field, const TypeMatcher<Field>());
+      expect(field.name, equals('label'));
+      expect(field.type, const TypeMatcher<UnionType>());
+      UnionType union = field.type;
+      expect(union.types, hasLength(2));
+      expect(union.types[0], isSimpleType('string'));
+      expect(union.types[1], isArrayOf(isSimpleType('number')));
+    });
   });
 }
diff --git a/pkg/analysis_server/tool/instrumentation/log/log.dart b/pkg/analysis_server/tool/instrumentation/log/log.dart
index 011581a..f575765 100644
--- a/pkg/analysis_server/tool/instrumentation/log/log.dart
+++ b/pkg/analysis_server/tool/instrumentation/log/log.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -870,7 +870,7 @@
 /**
  * A log entry representing a communication between the server and a plugin.
  */
-abstract class PluginEntryMixin {
+mixin PluginEntryMixin {
   /**
    * The components describing the plugin associated with this entry.
    */
diff --git a/pkg/analysis_server/tool/instrumentation/log_viewer.dart b/pkg/analysis_server/tool/instrumentation/log_viewer.dart
index 62d5722..6edb34b 100644
--- a/pkg/analysis_server/tool/instrumentation/log_viewer.dart
+++ b/pkg/analysis_server/tool/instrumentation/log_viewer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/instrumentation/page/log_page.dart b/pkg/analysis_server/tool/instrumentation/page/log_page.dart
index b537580..bb9b9c9 100644
--- a/pkg/analysis_server/tool/instrumentation/page/log_page.dart
+++ b/pkg/analysis_server/tool/instrumentation/page/log_page.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/instrumentation/page/page_writer.dart b/pkg/analysis_server/tool/instrumentation/page/page_writer.dart
index dca5673..3d1d68a 100644
--- a/pkg/analysis_server/tool/instrumentation/page/page_writer.dart
+++ b/pkg/analysis_server/tool/instrumentation/page/page_writer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/instrumentation/page/stats_page.dart b/pkg/analysis_server/tool/instrumentation/page/stats_page.dart
index a8932a1..907f16c 100644
--- a/pkg/analysis_server/tool/instrumentation/page/stats_page.dart
+++ b/pkg/analysis_server/tool/instrumentation/page/stats_page.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/instrumentation/page/task_page.dart b/pkg/analysis_server/tool/instrumentation/page/task_page.dart
index f5cd312..e553eab 100644
--- a/pkg/analysis_server/tool/instrumentation/page/task_page.dart
+++ b/pkg/analysis_server/tool/instrumentation/page/task_page.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/instrumentation/server.dart b/pkg/analysis_server/tool/instrumentation/server.dart
index bfeb7cc..4fd50e1 100644
--- a/pkg/analysis_server/tool/instrumentation/server.dart
+++ b/pkg/analysis_server/tool/instrumentation/server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/lsp_spec/README.md b/pkg/analysis_server/tool/lsp_spec/README.md
new file mode 100644
index 0000000..fe5bf80
--- /dev/null
+++ b/pkg/analysis_server/tool/lsp_spec/README.md
@@ -0,0 +1,76 @@
+# Language Server Protocol
+
+## LSP Support Status
+
+Support for [the Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) is **not production ready** but available as a preview to allow testing/integration work.
+
+## Running the Server
+
+Run the server from source to ensure you're running code that matches the status shown below. If you don't have a locally built SDK then a recent nightly should do. Pass the `--lsp` flag to start the server in LSP mode:
+
+```
+dart pkg/analysis_server/bin/server.dart --lsp
+```
+
+Note: In LSP the client makes the first request so there is no obvious confirmation that the server is working correctly until the client sends an `initialize` request. Unlike standard JSON RPC, [LSP requires that headers are sent](https://microsoft.github.io/language-server-protocol/specification).
+
+## Message Status
+
+Below is a list of LSP methods and their implementation status.
+
+- Method: The LSP method name
+- Basic Impl: This method has an implementation but may assume some client capabilities
+- Capabilities: Only types from the original spec or as advertised in client capabilities are returned
+- Tests: Has automated tests
+- Tested Client: Has been manually tested in at least one LSP client editor
+
+| Method | Basic Impl | Capabilities | Tests | Tested Client | Notes |
+| - | - | - | - | - | - |
+| initialize | ✅ | ✅ | ✅ | ✅ | trace and other options NYI
+| initialized | ✅ | ✅ | ✅ | ✅ |
+| shutdown | ✅ | ✅ | ✅ | ✅ | supported but does nothing |
+| exit | | | | | |
+| $/cancelRequest | | | | | ignored (unsupported) |
+| window/showMessage | ✅ | | | |
+| window/showMessageRequest | | | | |
+| window/logMessage | ✅ | | | |
+| telemetry/event | | | | |
+| client/registerCapability | | | | | unused, but should be used for DocumentSelector at least
+| client/unregisterCapability | | | | |
+| workspace/didChangeWatchedFiles | | | | | unused, server does own watching |
+| workspace/didChangeWorkspaceFolders | ✅ | ✅ | ✅ | ✅ |
+| workspace/symbol | | | | |
+| workspace/executeCommand | ✅ | ✅ | ✅ | ✅ |
+| workspace/applyEdit | ✅ | ✅ | ✅ | ✅ |
+| textDocument/didOpen | ✅ | ✅ | ✅ | ✅ |
+| textDocument/didChange | ✅ | ✅ | ✅ | ✅ |
+| textDocument/willSave | | | | |
+| textDocument/willSaveWaitUntil | | | | |
+| textDocument/didClose | ✅ | ✅ | ✅ | ✅ |
+| textDocument/publishDiagnostics | ✅ | ✅ | ✅ | ✅ |
+| textDocument/completion | ✅ | ✅ | ✅ | ✅ |
+| completionItem/resolve | | | | | not required |
+| textDocument/hover | ✅ | ✅ | ✅ | ✅ |
+| textDocument/signatureHelp | ✅ | ✅ | ✅ | ✅ | trigger character handling outstanding
+| textDocument/definition | ✅ | ✅ | ✅ | ✅ |
+| textDocument/typeDefinition | | | | |
+| textDocument/implementation | | | | |
+| textDocument/references | ✅ | ✅ | ✅ | ✅ |
+| textDocument/documentHighlight | ✅ | ✅ | ✅ | ✅ |
+| textDocument/documentSymbol | ✅ | ✅ | ✅ | ✅ |
+| textDocument/codeAction (sortMembers) | ✅ | ✅ | ✅ | ✅ |
+| textDocument/codeAction (organiseImports) | ✅ | ✅ | ✅ | ✅ |
+| textDocument/codeAction (refactors) | | | | |
+| textDocument/codeAction (assists) | ✅ | ✅ | ✅ | ✅ |
+| textDocument/codeAction (fixes) | ✅ | ✅ | ✅ | ✅ |
+| textDocument/codeLens | | | | |
+| codeLens/resolve | | | | |
+| textDocument/documentLink | | | | |
+| documentLink/resolve | | | | |
+| textDocument/formatting | ✅ | ✅ | ✅ | ✅ |
+| textDocument/rangeFormatting | | | | | requires support from dart_style?
+| textDocument/onTypeFormatting | ✅ | ✅ | ✅ | ✅ |
+| textDocument/rename | ✅ | ✅ | Incomplete! | |
+| textDocument/prepareRename | | | | |
+| textDocument/foldingRange | | | | |
+
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index 79b2b63..6c87b90 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -3,23 +3,44 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:dart_style/dart_style.dart';
-import 'package:meta/meta.dart';
 
 import 'typescript.dart';
+import 'typescript_parser.dart';
 
 final formatter = new DartFormatter();
 Map<String, Interface> _interfaces = {};
+Map<String, List<String>> _subtypes = {};
+// TODO(dantup): Rename namespaces -> enums since they're always that now.
 Map<String, Namespace> _namespaces = {};
 Map<String, TypeAlias> _typeAliases = {};
 
-String generateDartForTypes(List<ApiItem> types) {
+/// Whether our enum class allows any value (eg. should always return true
+/// from canParse() for the correct type). This is to allow us to have some
+/// type safety for these values but without restricting which values are allowed.
+/// This is to support things like custom error codes and also future changes
+/// in the spec (it's important the server doesn't crash on deserialising
+/// newer values).
+bool enumClassAllowsAnyValue(String name) {
+  // TODO(dantup): This should return true by default, and allow opt-out for
+  // those things we know are not supported. This behaviour matches the old
+  // code in order to simplify diffs while migrating.
+  return name == 'ErrorCodes' || name == 'CodeActionKind';
+}
+
+String generateDartForTypes(List<AstNode> types) {
   // Keep maps of items we may need to look up quickly later.
   types
       .whereType<TypeAlias>()
       .forEach((alias) => _typeAliases[alias.name] = alias);
-  types
-      .whereType<Interface>()
-      .forEach((interface) => _interfaces[interface.name] = interface);
+  types.whereType<Interface>().forEach((interface) {
+    _interfaces[interface.name] = interface;
+    // Keep track of our base classes so they can look up their super classes
+    // later in their fromJson() to deserialise into the most specific type.
+    interface.baseTypes.forEach((base) {
+      final subTypes = _subtypes[base.dartType] ??= new List<String>();
+      subTypes.add(interface.name);
+    });
+  });
   types
       .whereType<Namespace>()
       .forEach((namespace) => _namespaces[namespace.name] = namespace);
@@ -29,8 +50,15 @@
   return formattedCode.trim() + '\n'; // Ensure a single trailing newline.
 }
 
-List<String> _extractTypesFromUnion(String type) {
-  return type.split('|').map((t) => t.trim()).toList();
+TypeBase resolveTypeAlias(TypeBase type, {resolveEnumClasses: false}) {
+  if (type is Type && _typeAliases.containsKey(type.name)) {
+    final alias = _typeAliases[type.name];
+    // Only follow the type if we're not an enum, or we wanted to follow enums.
+    if (!_namespaces.containsKey(alias.name) || resolveEnumClasses) {
+      return alias.baseType;
+    }
+  }
+  return type;
 }
 
 String _formatCode(String code) {
@@ -52,45 +80,28 @@
   return interface.members
       .whereType<Field>()
       .followedBy(interface.baseTypes
-          .map((name) => _getAllFields(_interfaces[name]))
+          // This cast is safe because base types are always real types.
+          .map((type) => _getAllFields(_interfaces[(type as Type).name]))
           .expand((ts) => ts))
       .toList();
 }
 
-String _getListType(String type) {
-  return type.substring('List<'.length, type.length - 1);
-}
-
 /// Returns a copy of the list sorted by name.
-List<ApiItem> _getSorted(List<ApiItem> items) {
+List<AstNode> _getSorted(List<AstNode> items) {
   final sortedList = items.toList();
   sortedList.sort((item1, item2) => item1.name.compareTo(item2.name));
   return sortedList;
 }
 
-List<String> _getUnionTypes(String type) {
-  return type
-      .substring('EitherX<'.length, type.length - 1)
-      .split(',')
-      .map((s) => s.trim())
-      .toList();
-}
-
-bool _isList(String type) {
-  return type.startsWith('List<') && type.endsWith('>');
-}
-
-bool _isLiteral(String type) {
+bool _isSimpleType(TypeBase type) {
   const literals = ['num', 'String', 'bool'];
-  return literals.contains(type);
+  return type is Type && literals.contains(type.dartType);
 }
 
-bool _isSpecType(String type) {
-  return _interfaces.containsKey(type) || _namespaces.containsKey(type);
-}
-
-bool _isUnion(String type) {
-  return type.startsWith('Either') && type.endsWith('>');
+bool _isSpecType(TypeBase type) {
+  return type is Type &&
+      (_interfaces.containsKey(type.name) ||
+          (_namespaces.containsKey(type.name)));
 }
 
 /// Maps reserved words and identifiers that cause issues in field names.
@@ -104,57 +115,6 @@
   return map[identifier] ?? identifier;
 }
 
-/// Maps a TypeScript type on to a Dart type, including following TypeAliases.
-@visibleForTesting
-String mapType(List<String> types) {
-  const mapping = <String, String>{
-    'boolean': 'bool',
-    'string': 'String',
-    'number': 'num',
-    'any': 'dynamic',
-    'object': 'dynamic',
-    // Special cases that are hard to parse or anonymous types.
-    '{ [uri: string]: TextEdit[]; }': 'Map<String, List<TextEdit>>',
-    '{ language: string; value: string }': 'MarkedStringWithLanguage'
-  };
-  if (types.length > 4) {
-    throw 'Unions of more than 4 types are not supported.';
-  }
-  if (types.length >= 2) {
-    final typeArgs = types.map((t) => mapType([t])).join(', ');
-    return 'Either${types.length}<$typeArgs>';
-  }
-
-  final type = types.first;
-  if (type.endsWith('[]')) {
-    return 'List<${mapType([type.substring(0, type.length - 2)])}>';
-  } else if (type.startsWith('Array<') && type.endsWith('>')) {
-    return 'List<${mapType([type.substring(6, type.length - 1)])}>';
-  } else if (type.contains('<')) {
-    // For types with type args, we need to map the type and each type arg.
-    final declaredType = _stripTypeArgs(type);
-    final typeArgs = type
-        .substring(declaredType.length + 1, type.length - 1)
-        .split(',')
-        .map((t) => t.trim());
-    return '${mapType([
-      declaredType
-    ])}<${typeArgs.map((t) => mapType([t])).join(', ')}>';
-  } else if (type.contains('|')) {
-    // It's possible we ended up with nested unions that the parsing.
-    // TODO(dantup): This is now partly done during parsing and partly done
-    // here. Maybe consider removing from typescript.dart and just carrying a
-    // String through so the logic is all in one place in this function?
-    return mapType(_extractTypesFromUnion(type));
-  } else if (_typeAliases.containsKey(type)) {
-    return mapType([_typeAliases[type].baseType]);
-  } else if (mapping.containsKey(type)) {
-    return mapType([mapping[type]]);
-  } else {
-    return type;
-  }
-}
-
 String _rewriteCommentReference(String comment) {
   final commentReferencePattern = new RegExp(r'\[([\w ]+)\]\(#(\w+)\)');
   return comment.replaceAllMapped(commentReferencePattern, (m) {
@@ -168,10 +128,6 @@
   });
 }
 
-String _stripTypeArgs(String typeName) => typeName.contains('<')
-    ? typeName.substring(0, typeName.indexOf('<'))
-    : typeName;
-
 Iterable<String> _wrapLines(List<String> lines, int maxLength) sync* {
   lines = lines.map((l) => l.trimRight()).toList();
   for (var line in lines) {
@@ -205,8 +161,7 @@
       _getAllFields(interface).where((f) => !f.allowsUndefined);
   for (var field in requiredFields) {
     buffer.write(" && obj.containsKey('${field.name}') && ");
-    _writeTypeCheckCondition(
-        buffer, "obj['${field.name}']", mapType(field.types));
+    _writeTypeCheckCondition(buffer, "obj['${field.name}']", field.type);
   }
   buffer
     ..writeln(';')
@@ -216,7 +171,7 @@
 
 void _writeConst(IndentableStringBuffer buffer, Const cons) {
   _writeDocCommentsAndAnnotations(buffer, cons);
-  buffer.writeIndentedln('static const ${cons.name} = ${cons.value};');
+  buffer.writeIndentedln('static const ${cons.name} = ${cons.valueAsLiteral};');
 }
 
 void _writeConstructor(IndentableStringBuffer buffer, Interface interface) {
@@ -225,7 +180,7 @@
     return;
   }
   buffer
-    ..writeIndented('${_stripTypeArgs(interface.name)}(')
+    ..writeIndented('${interface.name}(')
     ..write(allFields.map((field) => 'this.${field.name}').join(', '))
     ..write(')');
   final fieldsWithValidation =
@@ -252,51 +207,65 @@
 }
 
 void _writeDocCommentsAndAnnotations(
-    IndentableStringBuffer buffer, ApiItem item) {
-  var comment = item.comment?.trim();
-  if (comment == null || comment.length == 0) {
-    return;
+    IndentableStringBuffer buffer, AstNode node) {
+  var comment = node.commentText?.trim();
+  if (comment != null && comment.isNotEmpty) {
+    comment = _rewriteCommentReference(comment);
+    Iterable<String> lines = comment.split('\n');
+    // Wrap at 80 - 4 ('/// ') - indent characters.
+    lines = _wrapLines(lines, (80 - 4 - buffer.totalIndent).clamp(0, 80));
+    lines.forEach((l) => buffer.writeIndentedln('/// $l'.trim()));
   }
-  comment = _rewriteCommentReference(comment);
-  Iterable<String> lines = comment.split('\n');
-  // Wrap at 80 - 4 ('/// ') - indent characters.
-  lines = _wrapLines(lines, (80 - 4 - buffer.totalIndent).clamp(0, 80));
-  lines.forEach((l) => buffer.writeIndentedln('/// $l'.trim()));
-  if (item.isDeprecated) {
+  if (node.isDeprecated) {
     buffer.writeIndentedln('@core.deprecated');
   }
 }
 
 void _writeEnumClass(IndentableStringBuffer buffer, Namespace namespace) {
   _writeDocCommentsAndAnnotations(buffer, namespace);
+  final consts = namespace.members.cast<Const>().toList();
+  final allowsAnyValue = enumClassAllowsAnyValue(namespace.name);
+  final constructorName = allowsAnyValue ? '' : '._';
+  final typeOfValues =
+      resolveTypeAlias(consts.first.type, resolveEnumClasses: true);
+
   buffer
     ..writeln('class ${namespace.name} {')
     ..indent()
-    ..writeIndentedln('const ${namespace.name}._(this._value);')
+    ..writeIndentedln('const ${namespace.name}$constructorName(this._value);')
     ..writeIndentedln('const ${namespace.name}.fromJson(this._value);')
     ..writeln()
-    ..writeIndentedln('final Object _value;')
+    ..writeIndentedln('final ${typeOfValues.dartTypeWithTypeArgs} _value;')
     ..writeln()
     ..writeIndentedln('static bool canParse(Object obj) {')
-    ..indent()
-    ..writeIndentedln('switch (obj) {')
     ..indent();
-  namespace.members.whereType<Const>().forEach((cons) {
-    buffer..writeIndentedln('case ${cons.value}:');
-  });
+  if (allowsAnyValue) {
+    buffer.writeIndentedln('return ');
+    _writeTypeCheckCondition(buffer, 'obj', consts.first.type);
+    buffer.writeln(';');
+  } else {
+    buffer
+      ..writeIndentedln('switch (obj) {')
+      ..indent();
+    consts.forEach((cons) {
+      buffer..writeIndentedln('case ${cons.valueAsLiteral}:');
+    });
+    buffer
+      ..indent()
+      ..writeIndentedln('return true;')
+      ..outdent()
+      ..outdent()
+      ..writeIndentedln('}')
+      ..writeIndentedln('return false;');
+  }
   buffer
-    ..indent()
-    ..writeIndentedln('return true;')
-    ..outdent()
-    ..writeIndentedln('}')
-    ..writeIndentedln('return false;')
     ..outdent()
     ..writeIndentedln('}');
   namespace.members.whereType<Const>().forEach((cons) {
     _writeDocCommentsAndAnnotations(buffer, cons);
     buffer
       ..writeIndentedln(
-          'static const ${_makeValidIdentifier(cons.name)} = const ${namespace.name}._(${cons.value});');
+          'static const ${_makeValidIdentifier(cons.name)} = const ${namespace.name}$constructorName(${cons.valueAsLiteral});');
   });
   buffer
     ..writeln()
@@ -313,58 +282,107 @@
     ..writeln();
 }
 
+void _writeEquals(IndentableStringBuffer buffer, Interface interface) {
+  buffer
+    ..writeIndentedln('@override')
+    ..writeIndentedln('bool operator ==(other) {')
+    ..indent()
+    ..writeIndentedln('if (other is ${interface.name}) {')
+    ..indent()
+    ..writeIndented('return ');
+  for (var field in _getAllFields(interface)) {
+    final type = field.type;
+    if (type is ArrayType) {
+      final elementType = type.elementType;
+      final elementDartType = elementType.dartTypeWithTypeArgs;
+      buffer.write(
+          'listEqual(${field.name}, other.${field.name}, ($elementDartType a, $elementDartType b) => a == b) && ');
+    } else if (type is MapType) {
+      final valueType = type.valueType;
+      final valueDartType = valueType.dartTypeWithTypeArgs;
+      buffer.write(
+          'mapEqual(${field.name}, other.${field.name}, ($valueDartType a, $valueDartType b) => a == b) && ');
+    } else {
+      buffer.write('${field.name} == other.${field.name} && ');
+    }
+  }
+  buffer
+    ..writeln('true;')
+    ..outdent()
+    ..writeIndentedln('}')
+    ..writeIndentedln('return false;')
+    ..outdent()
+    ..writeIndentedln('}');
+}
+
 void _writeField(IndentableStringBuffer buffer, Field field) {
   _writeDocCommentsAndAnnotations(buffer, field);
   buffer
     ..writeIndented('final ')
-    ..write(mapType(field.types))
+    ..write(field.type.dartTypeWithTypeArgs)
     ..writeln(' ${field.name};');
 }
 
 void _writeFromJsonCode(
-    IndentableStringBuffer buffer, List<String> types, String valueCode) {
-  final type = mapType(types);
-  if (_isLiteral(type)) {
+    IndentableStringBuffer buffer, TypeBase type, String valueCode,
+    {bool allowsNull}) {
+  type = resolveTypeAlias(type);
+
+  if (_isSimpleType(type)) {
     buffer.write("$valueCode");
   } else if (_isSpecType(type)) {
     // Our own types have fromJson() constructors we can call.
-    buffer.write("$valueCode != null ? new $type.fromJson($valueCode) : null");
-  } else if (_isList(type)) {
-    // Lists need to be mapped so we can recursively call (they may need fromJson).
+    buffer.write(
+        "$valueCode != null ? ${type.dartType}.fromJson${type.typeArgsString}($valueCode) : null");
+  } else if (type is ArrayType) {
+    // Lists need to be map()'d so we can recursively call writeFromJsonCode
+    // as they may need fromJson on each element.
     buffer.write("$valueCode?.map((item) => ");
-    final listType = _getListType(type);
-    _writeFromJsonCode(buffer, [listType], 'item');
-    buffer.write(')?.cast<$listType>()?.toList()');
-  } else if (_isUnion(type)) {
-    _writeFromJsonCodeForUnion(buffer, types, valueCode);
+    _writeFromJsonCode(buffer, type.elementType, 'item',
+        allowsNull: allowsNull);
+    buffer
+        .write(')?.cast<${type.elementType.dartTypeWithTypeArgs}>()?.toList()');
+  } else if (type is MapType) {
+    // Maps need to be map()'d so we can recursively call writeFromJsonCode as
+    // they may need fromJson on each key or value.
+    buffer.write('$valueCode?.map((key, value) => new MapEntry(');
+    _writeFromJsonCode(buffer, type.indexType, 'key', allowsNull: allowsNull);
+    buffer.write(', ');
+    _writeFromJsonCode(buffer, type.valueType, 'value', allowsNull: allowsNull);
+    buffer.write(
+        '))?.cast<${type.indexType.dartTypeWithTypeArgs}, ${type.valueType.dartTypeWithTypeArgs}>()');
+  } else if (type is UnionType) {
+    _writeFromJsonCodeForUnion(buffer, type, valueCode, allowsNull: allowsNull);
   } else {
     buffer.write("$valueCode");
   }
 }
 
 void _writeFromJsonCodeForUnion(
-    IndentableStringBuffer buffer, List<String> types, String valueCode) {
-  final unionTypeName = mapType(types);
+    IndentableStringBuffer buffer, UnionType union, String valueCode,
+    {bool allowsNull}) {
   // Write a check against each type, eg.:
   // x is y ? new Either.tx(x) : (...)
   var hasIncompleteCondition = false;
   var unclosedParens = 0;
-  for (var i = 0; i < types.length; i++) {
-    final dartType = mapType([types[i]]);
+  for (var i = 0; i < union.types.length; i++) {
+    final type = union.types[i];
+    final isDynamic = type.dartType == 'dynamic';
 
     // Dynamic matches all type checks, so only emit it if required.
-    if (dartType != 'dynamic') {
-      _writeTypeCheckCondition(buffer, valueCode, dartType);
+    if (!isDynamic) {
+      _writeTypeCheckCondition(buffer, valueCode, type);
       buffer.write(' ? ');
     }
 
     // The code to construct a value with this "side" of the union.
-    buffer.write('new $unionTypeName.t${i + 1}(');
-    _writeFromJsonCode(buffer, [dartType], valueCode); // Call recursively!
+    buffer.write('new ${union.dartTypeWithTypeArgs}.t${i + 1}(');
+    _writeFromJsonCode(buffer, type, valueCode,
+        allowsNull: allowsNull); // Call recursively!
     buffer.write(')');
 
     // If we output the type condition at the top, prepare for the next condition.
-    if (dartType != 'dynamic') {
+    if (!isDynamic) {
       buffer.write(' : (');
       hasIncompleteCondition = true;
       unclosedParens++;
@@ -375,8 +393,12 @@
   // Fill the final parens with a throw because if we fell through all of the
   // cases then the value we had didn't match any of the types in the union.
   if (hasIncompleteCondition) {
+    if (allowsNull) {
+      buffer.write('$valueCode == null ? null : (');
+      unclosedParens++;
+    }
     buffer.write(
-        "throw '''\${$valueCode} was not one of (${types.join(', ')})'''");
+        "throw '''\${$valueCode} was not one of (${union.types.map((t) => t.dartTypeWithTypeArgs).join(', ')})'''");
   }
   buffer.write(')' * unclosedParens);
 }
@@ -384,31 +406,58 @@
 void _writeFromJsonConstructor(
     IndentableStringBuffer buffer, Interface interface) {
   final allFields = _getAllFields(interface);
-  if (allFields.isEmpty) {
-    return;
-  }
   buffer
-    ..writeIndentedln(
-        'factory ${_stripTypeArgs(interface.name)}.fromJson(Map<String, dynamic> json) {')
+    ..writeIndentedln('static ${interface.nameWithTypeArgs} '
+        'fromJson${interface.typeArgsString}(Map<String, dynamic> json) {')
     ..indent();
+  // First check whether any of our subclasses can deserialise this.
+  for (final subclassName in _subtypes[interface.name] ?? const <String>[]) {
+    final subclass = _interfaces[subclassName];
+    buffer
+      ..writeIndentedln('if (${subclass.nameWithTypeArgs}.canParse(json)) {')
+      ..indent()
+      ..writeln('return ${subclass.nameWithTypeArgs}.fromJson(json);')
+      ..outdent()
+      ..writeIndentedln('}');
+  }
   for (final field in allFields) {
     buffer.writeIndented('final ${field.name} = ');
-    _writeFromJsonCode(buffer, field.types, "json['${field.name}']");
+    _writeFromJsonCode(buffer, field.type, "json['${field.name}']",
+        allowsNull: field.allowsNull || field.allowsUndefined);
     buffer.writeln(';');
   }
   buffer
-    ..writeIndented('return new ${interface.name}(')
+    ..writeIndented('return new ${interface.nameWithTypeArgs}(')
     ..write(allFields.map((field) => '${field.name}').join(', '))
     ..writeln(');')
     ..outdent()
     ..writeIndented('}');
 }
 
+void _writeHashCode(IndentableStringBuffer buffer, Interface interface) {
+  buffer
+    ..writeIndentedln('@override')
+    ..writeIndentedln('int get hashCode {')
+    ..indent()
+    ..writeIndented('int hash = 0;');
+  for (var field in _getAllFields(interface)) {
+    buffer
+        .write('hash = JenkinsSmiHash.combine(hash, ${field.name}.hashCode);');
+  }
+  buffer
+    ..writeln('return JenkinsSmiHash.finish(hash);')
+    ..outdent()
+    ..writeIndentedln('}');
+}
+
 void _writeInterface(IndentableStringBuffer buffer, Interface interface) {
   _writeDocCommentsAndAnnotations(buffer, interface);
 
-  buffer.writeIndented('class ${interface.name} ');
-  var allBaseTypes = interface.baseTypes.followedBy(['ToJsonable']);
+  buffer.writeIndented('class ${interface.nameWithTypeArgs} ');
+  final allBaseTypes =
+      interface.baseTypes.map((t) => t.dartTypeWithTypeArgs).toList();
+  allBaseTypes.addAll(getSpecialBaseTypes(interface));
+  allBaseTypes.add('ToJsonable');
   if (allBaseTypes.isNotEmpty) {
     buffer.writeIndented('implements ${allBaseTypes.join(', ')} ');
   }
@@ -428,6 +477,9 @@
   buffer.writeln();
   _writeToJsonMethod(buffer, interface);
   _writeCanParseMethod(buffer, interface);
+  _writeEquals(buffer, interface);
+  _writeHashCode(buffer, interface);
+  _writeToString(buffer, interface);
   buffer
     ..outdent()
     ..writeIndentedln('}')
@@ -436,23 +488,19 @@
 
 void _writeJsonMapAssignment(
     IndentableStringBuffer buffer, Field field, String mapName) {
-  // If we are allowed to be undefined (which essentially means required to be
-  // undefined and never explicitly null), we'll only add the value if set.
-  if (field.allowsUndefined) {
+  // If we are allowed to be undefined, we'll only add the value if set.
+  final shouldBeOmittedIfNoValue = field.allowsUndefined;
+  if (shouldBeOmittedIfNoValue) {
     buffer
-      ..writeIndentedlnIf(
-          field.isDeprecated, '// ignore: deprecated_member_use')
       ..writeIndentedln('if (${field.name} != null) {')
       ..indent();
   }
-  buffer
-    ..writeIndentedlnIf(field.isDeprecated, '// ignore: deprecated_member_use')
-    ..writeIndented('''$mapName['${field.name}'] = ${field.name}''');
+  buffer..writeIndented('''$mapName['${field.name}'] = ${field.name}''');
   if (!field.allowsUndefined && !field.allowsNull) {
     buffer.write(''' ?? (throw '${field.name} is required but was not set')''');
   }
   buffer.writeln(';');
-  if (field.allowsUndefined) {
+  if (shouldBeOmittedIfNoValue) {
     buffer
       ..outdent()
       ..writeIndentedln('}');
@@ -473,29 +521,6 @@
   _getSorted(members).forEach((m) => _writeMember(buffer, m));
 }
 
-void _writeNamespace(IndentableStringBuffer buffer, Namespace namespace) {
-  // Namespaces are just groups of constants. For some uses we can write these
-  // as enum classes for extra type safety, but not for all - for example
-  // CodeActionKind can be an arbitrary String even though it also defines
-  // constants for common values. We can tell which can have their own values
-  // because they're marked with type aliases, with the exception of ErrorCodes!
-  if (!_typeAliases.containsKey(namespace.name) &&
-      namespace.name != 'ErrorCodes') {
-    _writeEnumClass(buffer, namespace);
-    return;
-  }
-
-  _writeDocCommentsAndAnnotations(buffer, namespace);
-  buffer
-    ..writeln('abstract class ${namespace.name} {')
-    ..indent();
-  _writeMembers(buffer, namespace.members);
-  buffer
-    ..outdent()
-    ..writeln('}')
-    ..writeln();
-}
-
 void _writeToJsonMethod(IndentableStringBuffer buffer, Interface interface) {
   // It's important the name we use for the map here isn't in use in the object
   // already. 'result' was, so we prefix it with some underscores.
@@ -503,8 +528,15 @@
     ..writeIndentedln('Map<String, dynamic> toJson() {')
     ..indent()
     ..writeIndentedln('Map<String, dynamic> __result = {};');
-  for (var field in _getAllFields(interface)) {
-    _writeJsonMapAssignment(buffer, field, '__result');
+  // ResponseMessage must confirm to JSON-RPC which says only one of
+  // result/error can be included. Since this isn't encoded in the types we
+  // need to special-case it's toJson generation.
+  if (interface.name == "ResponseMessage") {
+    _writeToJsonFieldsForResponseMessage(buffer, interface);
+  } else {
+    for (var field in _getAllFields(interface)) {
+      _writeJsonMapAssignment(buffer, field, '__result');
+    }
   }
   buffer
     ..writeIndentedln('return __result;')
@@ -512,11 +544,46 @@
     ..writeIndentedln('}');
 }
 
-void _writeType(IndentableStringBuffer buffer, ApiItem type) {
+void _writeToJsonFieldsForResponseMessage(
+    IndentableStringBuffer buffer, Interface interface) {
+  const mapName = '__result';
+
+  final allFields = _getAllFields(interface);
+  final standardFields =
+      allFields.where((f) => f.name != 'error' && f.name != 'result');
+
+  for (var field in standardFields) {
+    _writeJsonMapAssignment(buffer, field, mapName);
+  }
+
+  // Write special code for result/error so that only one is populated.
+  buffer
+    ..writeIndentedln('if (error != null && result != null) {')
+    ..indent()
+    ..writeIndentedln('''throw 'result and error cannot both be set';''')
+    ..outdent()
+    ..writeIndentedln('} else if (error != null) {')
+    ..indent()
+    ..writeIndentedln('''$mapName['error'] = error;''')
+    ..outdent()
+    ..writeIndentedln('} else {')
+    ..indent()
+    ..writeIndentedln('''$mapName['result'] = result;''')
+    ..outdent()
+    ..writeIndentedln('}');
+}
+
+void _writeToString(IndentableStringBuffer buffer, Interface interface) {
+  buffer
+    ..writeIndentedln('@override')
+    ..writeIndentedln('String toString() => jsonEncoder.convert(toJson());');
+}
+
+void _writeType(IndentableStringBuffer buffer, AstNode type) {
   if (type is Interface) {
     _writeInterface(buffer, type);
   } else if (type is Namespace) {
-    _writeNamespace(buffer, type);
+    _writeEnumClass(buffer, type);
   } else if (type is TypeAlias) {
     // For now type aliases are not supported, so are collected at the start
     // of the process in a map, and just replaced with the aliased type during
@@ -528,38 +595,48 @@
 }
 
 void _writeTypeCheckCondition(
-    IndentableStringBuffer buffer, String valueCode, String dartType) {
-  if (dartType == 'dynamic') {
+    IndentableStringBuffer buffer, String valueCode, TypeBase type) {
+  type = resolveTypeAlias(type, resolveEnumClasses: true);
+
+  final resolvedDartType = type.dartTypeWithTypeArgs;
+  if (resolvedDartType == 'dynamic') {
     buffer.write('true');
-  } else if (_isLiteral(dartType)) {
-    buffer.write('$valueCode is $dartType');
-  } else if (_isSpecType(dartType)) {
-    buffer.write('$dartType.canParse($valueCode)');
-  } else if (_isList(dartType)) {
-    final listType = _getListType(dartType);
+  } else if (_isSimpleType(type)) {
+    buffer.write('$valueCode is $resolvedDartType');
+  } else if (_isSpecType(type)) {
+    buffer.write('$resolvedDartType.canParse($valueCode)');
+  } else if (type is ArrayType) {
     buffer.write('($valueCode is List');
-    if (dartType != 'dynamic') {
+    if (resolvedDartType != 'dynamic') {
       // TODO(dantup): If we're happy to assume we never have two lists in a union
       // we could skip this bit.
-      buffer
-          .write(' && ($valueCode.length == 0 || $valueCode.every((item) => ');
-      _writeTypeCheckCondition(buffer, 'item', listType);
+      buffer.write(' && ($valueCode.every((item) => ');
+      _writeTypeCheckCondition(buffer, 'item', type.elementType);
       buffer.write('))');
     }
     buffer.write(')');
-  } else if (_isUnion(dartType)) {
+  } else if (type is MapType) {
+    buffer.write('($valueCode is Map');
+    if (resolvedDartType != 'dynamic') {
+      buffer..write(' && ((')..write('$valueCode.keys.every((item) => ');
+      _writeTypeCheckCondition(buffer, 'item', type.indexType);
+      buffer..write('&& $valueCode.values.every((item) => ');
+      _writeTypeCheckCondition(buffer, 'item', type.valueType);
+      buffer.write(')))');
+    }
+    buffer.write(')');
+  } else if (type is UnionType) {
     // To type check a union, we just recursively check against each of its types.
-    final unionTypes = _getUnionTypes(dartType);
     buffer.write('(');
-    for (var i = 0; i < unionTypes.length; i++) {
+    for (var i = 0; i < type.types.length; i++) {
       if (i != 0) {
         buffer.write(' || ');
       }
-      _writeTypeCheckCondition(buffer, valueCode, mapType([unionTypes[i]]));
+      _writeTypeCheckCondition(buffer, valueCode, type.types[i]);
     }
     buffer.write(')');
   } else {
-    throw 'Unable to type check $valueCode against $dartType';
+    throw 'Unable to type check $valueCode against $resolvedDartType';
   }
 }
 
@@ -582,10 +659,4 @@
     write(_indentString);
     writeln(obj);
   }
-
-  void writeIndentedlnIf(bool condition, Object obj) {
-    if (condition) {
-      writeIndentedln(obj);
-    }
-  }
 }
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index caa6aea..909a06b 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -5,12 +5,14 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:analysis_server/src/services/correction/strings.dart';
 import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as path;
 
 import 'codegen_dart.dart';
 import 'markdown.dart';
 import 'typescript.dart';
+import 'typescript_parser.dart';
 
 main() async {
   final String script = Platform.script.toFilePath();
@@ -20,14 +22,52 @@
   new Directory(outFolder).createSync();
 
   final String spec = await fetchSpec();
-  final List<ApiItem> types = extractAllTypes(extractTypeScriptBlocks(spec));
-  types.addAll(_getSpecialCaseTypes());
+  final List<AstNode> types = extractTypeScriptBlocks(spec)
+      .where(shouldIncludeScriptBlock)
+      .map(parseString)
+      .expand((f) => f)
+      .where(includeTypeDefinitionInOutput)
+      .toList();
+
+  // Generate an enum for all of the request methods to avoid strings.
+  types.add(extractMethodsEnum(spec));
+
+  // Extract additional inline types that are specificed online in the `results`
+  // section of the doc.
+  types.addAll(extractResultsInlineTypes(spec));
+
   final String output = generateDartForTypes(types);
 
   new File(path.join(outFolder, 'protocol_generated.dart'))
       .writeAsStringSync(_generatedFileHeader + output);
 }
 
+Namespace extractMethodsEnum(String spec) {
+  Const toConstant(String value) {
+    final comment = new Comment(
+        new Token(TokenType.COMMENT, '''Constant for the '$value' method.'''));
+
+    // Generate a safe name for the member from the string. Those that start with
+    // $/ will have the prefix removed and all slashes should be replaced with
+    // underscores.
+    final safeMemberName = value.replaceAll(r'$/', '').replaceAll('/', '_');
+
+    return new Const(
+      comment,
+      new Token.identifier(safeMemberName),
+      new Type.identifier('string'),
+      new Token(TokenType.STRING, "'$value'"),
+    );
+  }
+
+  final comment = new Comment(new Token(TokenType.COMMENT,
+      'Valid LSP methods known at the time of code generation from the spec.'));
+  final methodConstants = extractMethodNames(spec).map(toConstant).toList();
+
+  return new Namespace(
+      comment, new Token.identifier('Method'), methodConstants);
+}
+
 const _generatedFileHeader = '''
 // Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
@@ -37,30 +77,76 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/lsp_spec/generate_all.dart".
 
+// ignore_for_file: deprecated_member_use
+// ignore_for_file: unnecessary_brace_in_string_interps
+
 import 'dart:core' hide deprecated;
 import 'dart:core' as core show deprecated;
+import 'dart:convert' show JsonEncoder;
 import 'package:analysis_server/lsp_protocol/protocol_special.dart';
+import 'package:analysis_server/src/protocol/protocol_internal.dart' show listEqual, mapEqual;
+import 'package:analyzer/src/generated/utilities_general.dart';
+
+const jsonEncoder = const JsonEncoder.withIndent('    ');
 
 ''';
 
 final Uri specUri = Uri.parse(
     'https://raw.githubusercontent.com/Microsoft/language-server-protocol/gh-pages/specification.md');
 
+/// Pattern to extract inline types from the `result: {xx, yy }` notes in the spec.
+/// Doesn't parse past full stops as some of these have english sentences tagged on
+/// the end that we don't want to parse.
+final _resultsInlineTypesPattern = new RegExp(r'''\* result:[^\.]*({.*})''');
+
+/// Extract inline types found directly in the `results:` sections of the spec
+/// that are not declared with their own names elsewhere.
+List<AstNode> extractResultsInlineTypes(String spec) {
+  InlineInterface toInterface(String typeDef) {
+    // The definition passed here will be a bare inline type, such as:
+    //
+    //     { range: Range, placeholder: string }
+    //
+    // In order to parse this, we'll just format it as a type alias and then
+    // run it through the standard parsing code.
+    final typeAlias = 'type temp = ${typeDef.replaceAll(',', ';')};';
+
+    final parsed = parseString(typeAlias);
+
+    // Extract the InlineInterface that was created.
+    InlineInterface interface = parsed.firstWhere((t) => t is InlineInterface);
+
+    // Create a new name based on the fields.
+    var newName = interface.members.map((m) => capitalize(m.name)).join('And');
+
+    return new InlineInterface(newName, interface.members);
+  }
+
+  return _resultsInlineTypesPattern
+      .allMatches(spec)
+      .map((m) => m.group(1).trim())
+      .toList()
+      .map(toInterface)
+      .toList();
+}
+
 Future<String> fetchSpec() async {
   final resp = await http.get(specUri);
   return resp.body;
 }
 
-/// Fabricates types for things that don't parse well from the TS spec,
-/// such as anonymous types:
-///     type MarkedString = string | { language: string; value: string };
-List<ApiItem> _getSpecialCaseTypes() {
-  return [
-    // For MarkedString, we drop the string-only version since we can always
-    // supply a language and it makes the type a little simpler.
-    new Interface('MarkedString', null, [], [
-      new Field('language', null, ['string'], false, false),
-      new Field('value', null, ['string'], false, false)
-    ])
-  ];
+/// Returns whether a script block should be parsed or not.
+bool shouldIncludeScriptBlock(String input) {
+  // We can't parse literal arrays, but this script block is just an example
+  // and not actually referenced anywhere.
+  if (input.trim() == r"export const EOL: string[] = ['\n', '\r\n', '\r'];") {
+    return false;
+  }
+
+  // There are some code blocks that just have example JSON in them.
+  if (input.startsWith('{') && input.endsWith('}')) {
+    return false;
+  }
+
+  return true;
 }
diff --git a/pkg/analysis_server/tool/lsp_spec/markdown.dart b/pkg/analysis_server/tool/lsp_spec/markdown.dart
index ae99df1..7a8e316 100644
--- a/pkg/analysis_server/tool/lsp_spec/markdown.dart
+++ b/pkg/analysis_server/tool/lsp_spec/markdown.dart
@@ -4,6 +4,9 @@
 
 final _typeScriptBlockPattern =
     new RegExp(r'\B```typescript([\S\s]*?)\n```', multiLine: true);
+final _methodNamesPattern = new RegExp(
+    r'''_(?:Notification|Request):?_:?(?:\r?\n)+\* method: '(.*?)'\r?\n''',
+    multiLine: true);
 
 /// Extracts fenced code blocks that are explicitly marked as TypeScript from a
 /// markdown document.
@@ -13,3 +16,10 @@
       .map((m) => m.group(1).trim())
       .toList();
 }
+
+List<String> extractMethodNames(String spec) {
+  return _methodNamesPattern
+      .allMatches(spec)
+      .map((m) => m.group(1).trim())
+      .toList();
+}
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript.dart b/pkg/analysis_server/tool/lsp_spec/typescript.dart
index 017c666..6ff12a9 100644
--- a/pkg/analysis_server/tool/lsp_spec/typescript.dart
+++ b/pkg/analysis_server/tool/lsp_spec/typescript.dart
@@ -2,26 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// TODO(dantup): Regex seemed like a good choice when parsing the first few...
-// maybe it's not so great now. We should parse this properly if it turns out
-// there are issues with what we have here.
-const String _blockBody = r'\{([\s\S]*?)\s*\n\s*\}';
-const String _comment = r'(?:\/\*\*((?:[\S\s](?!\*\/))+?)\s\*\/)?\s*';
+import 'typescript_parser.dart';
 
-List<ApiItem> extractAllTypes(List<String> code) {
-  return extractTypes(code.join('\n'));
-}
-
-List<ApiItem> extractTypes(String code) {
-  final types = ApiItem.extractFrom(code);
-  _removeUnwantedTypes(types);
-  return types;
-}
-
-String _cleanComment(String comment) {
+String cleanComment(String comment) {
   if (comment == null) {
     return null;
   }
+
+  // Remove the start/end comment markers.
+  if (comment.startsWith('/**') && comment.endsWith('*/')) {
+    comment = comment.substring(3, comment.length - 2);
+  } else if (comment.startsWith('//')) {
+    comment = comment.substring(2);
+  }
+
   final _commentLinePrefixes = new RegExp(r'\n\s*\* ?');
   final _nonConcurrentNewlines = new RegExp(r'\n(?![\n\s\-*])');
   final _newLinesThatRequireReinserting = new RegExp(r'\n (\w)');
@@ -38,13 +32,20 @@
   return comment.trim();
 }
 
-/// Fixes up some enum types that are not as specific as they could be in the
-/// spec. For example, Diagnostic.severity is typed "number" but can be mapped
-/// to the DiagnosticSeverity enum class.
-String _getImprovedType(String interfaceName, String fieldName) {
+/// Improves types in generated code, including:
+///
+/// - Fixes up some enum types that are not as specific as they could be in the
+///   spec. For example, Diagnostic.severity is typed "number" but can be mapped
+///   to the DiagnosticSeverity enum class.
+///
+/// - Narrows unions to single types where they're only generated on the server
+///   and we know we always use a specific type. This avoids wrapping a lot
+///   of code in `EitherX<Y,Z>.tX()` and simplifies the testing of them.
+String getImprovedType(String interfaceName, String fieldName) {
   const Map<String, Map<String, String>> _improvedTypeMappings = {
     "Diagnostic": {
       "severity": "DiagnosticSeverity",
+      "code": "String",
     },
     "TextDocumentSyncOptions": {
       "change": "TextDocumentSyncKind",
@@ -61,6 +62,26 @@
     "FoldingRange": {
       "kind": "FoldingRangeKind",
     },
+    "ResponseError": {
+      "code": "ErrorCodes",
+    },
+    "NotificationMessage": {
+      "method": "Method",
+      "params": "object",
+    },
+    "RequestMessage": {
+      "method": "Method",
+      "params": "object",
+    },
+    "SymbolInformation": {
+      "kind": "SymbolKind",
+    },
+    "ParameterInformation": {
+      "label": "String",
+    },
+    "ServerCapabilities": {
+      "changeNotifications": "bool",
+    }
   };
 
   final interface = _improvedTypeMappings[interfaceName];
@@ -68,246 +89,38 @@
   return interface != null ? interface[fieldName] : null;
 }
 
-List<String> _getSpecialBaseClasses(String name) {
-  const fileOperationTypes = [
-    'TextDocumentEdit',
-    'CreateFile',
-    'RenameFile',
-    'DeleteFile'
-  ];
-  if (fileOperationTypes.contains(name)) {
-    return ['FileOperation'];
+List<String> getSpecialBaseTypes(Interface interface) {
+  if (interface.name == 'RequestMessage' ||
+      interface.name == 'NotificationMessage') {
+    return ['IncomingMessage'];
   } else {
     return [];
   }
 }
 
-List<String> _parseTypes(String baseTypes, String sep) {
-  // Special case for a single complicated type we can't parse easily...
-  if (baseTypes ==
-      '(TextDocumentEdit[] | (TextDocumentEdit | CreateFile | RenameFile | DeleteFile)[])') {
-    return ['FileOperation[]'];
-  }
-  return baseTypes?.split(sep)?.map((t) => t.trim())?.toList() ?? [];
-}
-
-/// Removes types that are in the spec that we don't want.
-void _removeUnwantedTypes(List<ApiItem> types) {
+/// Removes types that are in the spec that we don't want to emit.
+bool includeTypeDefinitionInOutput(AstNode node) {
   // These types are not used for v3.0 (Feb 2017) and by dropping them we don't
   // have to handle any cases where both a namespace and interfaces are declared
   // with the same name.
-  types.removeWhere((item) => item.name == 'InitializeError');
+  return node.name != 'InitializeError' &&
+      // We don't emit MarkedString because it gets mapped to a simple String
+      // when getting the .dartType for it.
+      // .startsWith() because there are inline types that will be generated.
+      !node.name.startsWith('MarkedString');
 }
 
-/// Base class for Interface, Field, Constant, etc. parsed from the LSP spec.
-abstract class ApiItem {
-  String name, comment;
-  bool isDeprecated;
-  ApiItem(this.name, String comment)
-      : comment = _cleanComment(comment),
-        isDeprecated = comment?.contains('@deprecated') ?? false;
-
-  static List<ApiItem> extractFrom(String code) {
-    List<ApiItem> types = [];
-    types.addAll(Interface.extractFrom(code));
-    types.addAll(Namespace.extractFrom(code));
-    types.addAll(TypeAlias.extractFrom(code));
-    return types;
+/// Removes types that are in the spec that we don't want in other signatures.
+bool allowTypeInSignatures(TypeBase type) {
+  // Don't allow arrays of MarkedStrings, but do allow simple MarkedStrings.
+  // The only place that uses these are Hovers and we only send one value
+  // (to match the MarkupString equiv) so the array just makes the types
+  // unnecessarily complicated.
+  if (type is ArrayType) {
+    final elementType = type.elementType;
+    if (elementType is Type && elementType.name == 'MarkedString') {
+      return false;
+    }
   }
-}
-
-/// A Constant parsed from the LSP spec.
-class Const extends Member {
-  final String type, value;
-  Const(String name, String comment, this.type, this.value)
-      : super(name, comment);
-
-  static List<Const> extractFrom(String code) {
-    final RegExp _constPattern = new RegExp(_comment +
-        r'''(?:export\s+)?const\s+(\w+)(?::\s+([\w\[\]'".-]+?))?\s*=\s*([\w\[\]'".-]+)\s*(?:;|$)''');
-
-    final consts = _constPattern.allMatches(code).map((m) {
-      final String comment = m.group(1);
-      final String name = m.group(2);
-      final String type = m.group(3);
-      final String value = m.group(4);
-      return new Const(name, comment, type, value);
-    }).toList();
-    return consts;
-  }
-
-  static List<Const> extractFromEnumValue(String code) {
-    final RegExp _constPattern =
-        new RegExp(_comment + r'''(\w+)\s*=\s*([\w\[\]'".-]+)\s*(?:,|$)''');
-
-    final consts = _constPattern.allMatches(code).map((m) {
-      final String comment = m.group(1);
-      final String name = m.group(2);
-      final String value = m.group(3);
-      return new Const(name, comment, null, value);
-    }).toList();
-    return consts;
-  }
-}
-
-/// A Field for an Interface parsed from the LSP spec.
-class Field extends Member {
-  final List<String> types;
-  final bool allowsNull, allowsUndefined;
-  Field(String name, String comment, this.types, this.allowsNull,
-      this.allowsUndefined)
-      : super(name, comment);
-
-  static List<Field> extractFrom(String interfaceName, String code) {
-    final RegExp _fieldPattern = new RegExp(_comment +
-        r'([\w\[\]]+\??)\s*:\s*([\w\[\] \|\{\}\(\)<>:;]+)\s*(?:;|$)');
-
-    final fields = _fieldPattern.allMatches(code).where((m) {
-      // Skip over the indexer in FormattingOptions since we don't need this
-      // (for now) and it's complicated to represent.
-      if (m.group(0).contains('[key: string]: boolean | number | string;')) {
-        return false;
-      }
-      return true;
-    }).map((m) {
-      String comment = m.group(1);
-      String name = m.group(2);
-      String typesString = m.group(3).trim();
-      // Our regex may result in semicolons on the end...
-      // TODO(dantup): Fix this, or make a simple parser.
-      if (typesString.endsWith(';')) {
-        typesString = typesString.substring(0, typesString.length - 1);
-      }
-      // Some fields have weird comments like this in the spec:
-      //     {@link MessageType}
-      // These seem to be the correct type of the field, while the field is
-      // marked with number.
-      if (comment != null) {
-        final RegExp _linkTypePattern = new RegExp(r'See \{@link (\w+)\}\.?');
-        final linkTypeMatch = _linkTypePattern.firstMatch(comment);
-        if (linkTypeMatch != null) {
-          typesString = linkTypeMatch.group(1);
-          comment = comment.replaceAll(_linkTypePattern, '');
-        }
-      }
-      List<String> types = _parseTypes(typesString, '|');
-      final bool allowsNull = types.contains('null');
-      if (allowsNull) {
-        types.remove('null');
-      }
-      final bool allowsUndefined = name.endsWith('?');
-      if (allowsUndefined) {
-        name = name.substring(0, name.length - 1);
-      }
-      // Perform simple type improvements for enums values that are typed as
-      // num/string in the spec but are enums.
-      // the spec.
-      if (types.length == 1) {
-        types[0] = _getImprovedType(interfaceName, name) ?? types[0];
-      }
-      return new Field(name, comment, types, allowsNull, allowsUndefined);
-    }).toList();
-    return fields;
-  }
-}
-
-/// An Interface parsed from the LSP spec.
-class Interface extends ApiItem {
-  final List<String> baseTypes;
-  final List<Member> members;
-  Interface(String name, String comment, this.baseTypes, this.members)
-      : super(name, comment);
-
-  static List<Interface> extractFrom(String code) {
-    final RegExp _interfacePattern = new RegExp(_comment +
-        r'(?:export\s+)?(?:interface|class)\s+([\w<>]+)(?:\s+extends\s+([\w, ]+?))?\s*' +
-        _blockBody);
-
-    final interfaces = _interfacePattern.allMatches(code).map((match) {
-      final String comment = match.group(1);
-      final String name = match.group(2);
-      final List<String> baseTypes = _parseTypes(match.group(3), ',');
-      final String body = match.group(4);
-      final List<Member> members = Member.extractFrom(name, body);
-
-      // Add any special base classes we've added to simplify types.
-      baseTypes.addAll(_getSpecialBaseClasses(name));
-
-      return new Interface(name, comment, baseTypes, members);
-    }).toList();
-    return interfaces;
-  }
-}
-
-/// A Field or Constant parsed from the LSP type.
-abstract class Member extends ApiItem {
-  Member(String name, String comment) : super(name, comment);
-
-  static List<Member> extractFrom(String interfaceName, String code) {
-    List<Member> members = [];
-    members.addAll(Field.extractFrom(interfaceName, code));
-    members.addAll(Const.extractFrom(code));
-    return members;
-  }
-}
-
-/// An Enum or Namsepace containing constants parsed from the LSP spec.
-class Namespace extends ApiItem {
-  final List<Member> members;
-  Namespace(String name, String comment, this.members) : super(name, comment);
-
-  static List<Namespace> extractFrom(String code) {
-    final enums = <Namespace>[];
-    enums.addAll(_extractNamespacesFrom(code));
-    enums.addAll(_extractEnumsFrom(code));
-    return enums;
-  }
-
-  static List<Namespace> _extractEnumsFrom(String code) {
-    final RegExp _namespacePattern =
-        new RegExp(_comment + r'(?:export\s+)?enum\s+(\w+)\s*' + _blockBody);
-
-    final namespaces = _namespacePattern.allMatches(code).map((match) {
-      final String comment = match.group(1);
-      final String name = match.group(2);
-      final String body = match.group(3);
-
-      final List<Member> members = Const.extractFromEnumValue(body);
-      return new Namespace(name, comment, members);
-    }).toList();
-    return namespaces;
-  }
-
-  static List<Namespace> _extractNamespacesFrom(String code) {
-    final RegExp _namespacePattern = new RegExp(
-        _comment + r'(?:export\s+)?namespace\s+(\w+)\s*' + _blockBody);
-
-    final namespaces = _namespacePattern.allMatches(code).map((match) {
-      final String comment = match.group(1);
-      final String name = match.group(2);
-      final String body = match.group(3);
-      final List<Member> members = Member.extractFrom(name, body);
-      return new Namespace(name, comment, members);
-    }).toList();
-    return namespaces;
-  }
-}
-
-/// A type alias parsed from the LSP spec.
-class TypeAlias extends ApiItem {
-  final String baseType;
-  TypeAlias(name, comment, this.baseType) : super(name, comment);
-
-  static List<TypeAlias> extractFrom(String code) {
-    final RegExp _typeAliasPattern =
-        new RegExp(_comment + r'type\s+([\w]+)\s+=\s+([\w\[\]]+)\s*;');
-
-    final typeAliases = _typeAliasPattern.allMatches(code).map((match) {
-      final String comment = match.group(1);
-      final String name = match.group(2);
-      final String baseType = match.group(3);
-      return new TypeAlias(name, comment, baseType);
-    }).toList();
-    return typeAliases;
-  }
+  return true;
 }
diff --git a/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
new file mode 100644
index 0000000..bd303e1
--- /dev/null
+++ b/pkg/analysis_server/tool/lsp_spec/typescript_parser.dart
@@ -0,0 +1,929 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:math';
+
+import 'package:analysis_server/src/services/correction/strings.dart'
+    show capitalize;
+
+import 'codegen_dart.dart';
+import 'typescript.dart';
+
+final _validIdentifierCharacters = RegExp('[a-zA-Z0-9_]');
+
+bool isAnyType(TypeBase t) => t is Type && t.name == 'any';
+
+bool isNullType(TypeBase t) => t is Type && t.name == 'null';
+
+bool isUndefinedType(TypeBase t) => t is Type && t.name == 'undefined';
+
+/// A fabricated field name for indexers in case they result in generation
+/// of type names for inline types.
+const fieldNameForIndexer = 'indexer';
+
+List<AstNode> parseString(String input) {
+  final scanner = new Scanner(input);
+  final tokens = scanner.scan();
+  final parser = new Parser(tokens);
+  return parser.parse();
+}
+
+TypeBase typeOfLiteral(TokenType tokenType) {
+  final typeName = tokenType == TokenType.STRING
+      ? 'string'
+      : tokenType == TokenType.NUMBER
+          ? 'number'
+          : throw 'Unknown literal type $tokenType';
+  return new Type.identifier(typeName);
+}
+
+class ArrayType extends TypeBase {
+  final TypeBase elementType;
+
+  ArrayType(this.elementType);
+
+  @override
+  String get dartType => 'List';
+  @override
+  String get typeArgsString => '<${elementType.dartTypeWithTypeArgs}>';
+}
+
+class MapType extends TypeBase {
+  final TypeBase indexType;
+  final TypeBase valueType;
+
+  MapType(this.indexType, this.valueType);
+
+  @override
+  String get dartType => 'Map';
+  @override
+  String get typeArgsString =>
+      '<${indexType.dartTypeWithTypeArgs}, ${valueType.dartTypeWithTypeArgs}>';
+}
+
+class AstNode {
+  final Comment commentNode;
+  final bool isDeprecated;
+  AstNode(this.commentNode)
+      : isDeprecated = commentNode?.text?.contains('@deprecated') ?? false;
+  String get commentText => commentNode?.text;
+
+  String get name => null;
+}
+
+class Comment extends AstNode {
+  final Token token;
+  final String text;
+
+  Comment(this.token)
+      : text = cleanComment(token.lexeme),
+        super(null);
+}
+
+class Const extends Member {
+  Token nameToken;
+  TypeBase type;
+  Token valueToken;
+  Const(Comment comment, this.nameToken, this.type, this.valueToken)
+      : super(comment);
+  String get name => nameToken.lexeme;
+
+  String get valueAsLiteral {
+    if (type.dartType == 'String') {
+      // Write strings as raw strings, since some have dollars in them (eg. for
+      // LSP method names). valueToken.lexeme already includes the quotes as
+      // read from the spec.
+      return 'r${valueToken.lexeme}';
+    } else {
+      return valueToken.lexeme;
+    }
+  }
+}
+
+class Field extends Member {
+  final Token nameToken;
+  final TypeBase type;
+  final bool allowsNull;
+  final bool allowsUndefined;
+  Field(
+    Comment comment,
+    this.nameToken,
+    this.type,
+    this.allowsNull,
+    this.allowsUndefined,
+  ) : super(comment);
+
+  String get name => nameToken.lexeme;
+}
+
+class FixedValueField extends Field {
+  final Token valueToken;
+  FixedValueField(
+    Comment comment,
+    Token nameToken,
+    this.valueToken,
+    TypeBase type,
+    bool allowsNull,
+    bool allowsUndefined,
+  ) : super(comment, nameToken, type, allowsNull, allowsUndefined);
+}
+
+class InlineInterface extends Interface {
+  InlineInterface(
+    String name,
+    List<Member> members,
+  ) : super(null, new Token.identifier(name), [], [], members);
+}
+
+class Indexer extends Member {
+  final TypeBase indexType;
+  final TypeBase valueType;
+  Indexer(
+    Comment comment,
+    this.indexType,
+    this.valueType,
+  ) : super(comment);
+
+  String get name => fieldNameForIndexer;
+}
+
+class Interface extends AstNode {
+  final Token nameToken;
+  final List<Token> typeArgs;
+  final List<TypeBase> baseTypes;
+  final List<Member> members;
+
+  Interface(
+    Comment comment,
+    this.nameToken,
+    this.typeArgs,
+    this.baseTypes,
+    this.members,
+  ) : super(comment);
+  String get name => nameToken.lexeme;
+  String get nameWithTypeArgs => '$name$typeArgsString';
+
+  String get typeArgsString => typeArgs.isNotEmpty
+      ? '<${typeArgs.map((t) => t.lexeme).join(', ')}>'
+      : '';
+}
+
+class Member extends AstNode {
+  Member(Comment comment) : super(comment);
+}
+
+class Namespace extends AstNode {
+  final Token nameToken;
+  final List<Member> members;
+  Namespace(
+    Comment comment,
+    this.nameToken,
+    this.members,
+  ) : super(comment);
+
+  String get name => nameToken.lexeme;
+}
+
+class Parser {
+  final List<Token> _tokens;
+  int _current = 0;
+  List<AstNode> _nodes;
+  Parser(this._tokens);
+
+  bool get _isAtEnd => _peek().type == TokenType.EOF;
+
+  List<AstNode> parse() {
+    if (_nodes == null) {
+      _nodes = <AstNode>[];
+      while (!_isAtEnd) {
+        _nodes.add(_topLevel());
+      }
+    }
+    return _nodes;
+  }
+
+  /// Returns the current token and moves to the next.
+  Token _advance() => _tokenAt(_current++);
+
+  /// Checks if the next token is [type] without advancing.
+  bool _check(TokenType type) => !_isAtEnd && _peek().type == type;
+
+  Comment _comment() {
+    if (_peek().type != TokenType.COMMENT) {
+      return null;
+    }
+    return Comment(_advance());
+  }
+
+  Const _const(String containerName, Comment leadingComment) {
+    _eatUnwantedKeywords();
+    final name = _consume(TokenType.IDENTIFIER, 'Expected identifier');
+    TypeBase type;
+    if (_match([TokenType.COLON])) {
+      type = _type(containerName, name.lexeme);
+    }
+    final value = _match([TokenType.EQUAL]) ? _advance() : null;
+
+    if (type == null && value != null) {
+      type = typeOfLiteral(value.type);
+    }
+
+    _consume(TokenType.SEMI_COLON, 'Expected ;');
+    return Const(leadingComment, name, type, value);
+  }
+
+  Indexer _indexer(String containerName, Comment leadingComment) {
+    final indexer = _field(containerName, leadingComment);
+    _consume(TokenType.RIGHT_BRACKET, 'Expected ]');
+    _consume(TokenType.COLON, 'Expected :');
+
+    TypeBase type;
+    type = _type(containerName, fieldNameForIndexer, improveTypes: true);
+
+    //_consume(TokenType.RIGHT_BRACE, 'Expected }');
+    _match([TokenType.SEMI_COLON]);
+
+    return new Indexer(leadingComment, indexer.type, type);
+  }
+
+  /// Ensures the next token is [type] and moves to the next, throwing [message]
+  /// if not.
+  Token _consume(TokenType type, String message) {
+    if (_check(type)) {
+      return _advance();
+    }
+
+    throw '$message\n\n${_peek()}';
+  }
+
+  void _eatUnwantedKeywords() {
+    _match([TokenType.EXPORT_KEYWORD]);
+    _match([TokenType.READONLY_KEYWORD]);
+  }
+
+  Namespace _enum(Comment leadingComment) {
+    final name = _consume(TokenType.IDENTIFIER, 'Expected identifier');
+    _consume(TokenType.LEFT_BRACE, 'Expected {');
+    final consts = <Const>[];
+    while (!_check(TokenType.RIGHT_BRACE)) {
+      consts.add(_enumValue(name.lexeme));
+      // Commas might not be present (eg. for last one).
+      _match([TokenType.COMMA]);
+    }
+    _consume(TokenType.RIGHT_BRACE, 'Expected }');
+
+    return new Namespace(leadingComment, name, consts);
+  }
+
+  Const _enumValue(String enumName) {
+    final leadingComment = _comment();
+    _eatUnwantedKeywords();
+    final name = _consume(TokenType.IDENTIFIER, 'Expected identifier');
+    TypeBase type;
+    if (_match([TokenType.COLON])) {
+      type = _type(enumName, name.lexeme);
+    }
+    final value = _match([TokenType.EQUAL]) ? _advance() : null;
+
+    if (type == null && value != null) {
+      type = typeOfLiteral(value.type);
+    }
+    return Const(leadingComment, name, type, value);
+  }
+
+  String _joinNames(String parent, String child) {
+    return '$parent${capitalize(child)}';
+  }
+
+  Field _field(String containerName, Comment leadingComment) {
+    _eatUnwantedKeywords();
+    final name = _consume(TokenType.IDENTIFIER, 'Expected identifier');
+    var canBeUndefined = _match([TokenType.QUESTION]);
+    _consume(TokenType.COLON, 'Expected :');
+    TypeBase type;
+    Token value;
+    type = _type(containerName, name.lexeme,
+        includeUndefined: canBeUndefined, improveTypes: true);
+
+    // Some fields have weird comments like this in the spec:
+    //     {@link MessageType}
+    // These seem to be the correct type of the field, while the field is
+    // marked with number.
+    final commentText = leadingComment?.text;
+    if (commentText != null) {
+      final RegExp _linkTypePattern = new RegExp(r'See \{@link (\w+)\}\.?');
+      final linkTypeMatch = _linkTypePattern.firstMatch(commentText);
+      if (linkTypeMatch != null) {
+        type = new Type.identifier(linkTypeMatch.group(1));
+        leadingComment = new Comment(new Token(TokenType.COMMENT,
+            '// ' + commentText.replaceAll(_linkTypePattern, '')));
+      }
+    }
+
+    // Ideally this would be _consume(), but there are no semi-colons after the
+    // "inline types" since they're blocks.
+    _match([TokenType.SEMI_COLON]);
+
+    // Special handling for fields that have fixed values.
+    if (value != null) {
+      return new FixedValueField(
+          leadingComment, name, value, type, false, canBeUndefined);
+    }
+
+    var canBeNull = false;
+    if (type is UnionType) {
+      UnionType union = type;
+      // Since undefined and null can appear in the union type list but we want to
+      // handle it specially in the code generation, we promote them to fields on
+      // the Field.
+      canBeUndefined |= union.types.any(isUndefinedType);
+      canBeNull = union.types.any((t) => isNullType(t) || isAnyType(t));
+      // Finally, we need to remove them from the union.
+      final remainingTypes = union.types
+          .where((t) => !isNullType(t) && !isUndefinedType(t))
+          .toList();
+
+      // We also remove any types that are deprecated and/or we won't use to
+      // simplify the unions.
+      remainingTypes.removeWhere((t) => !allowTypeInSignatures(t));
+
+      type = remainingTypes.length > 1
+          ? new UnionType(remainingTypes)
+          : remainingTypes.single;
+    } else if (isAnyType(type)) {
+      // There are values in the spec marked as `any` that allow nulls (for
+      // example, the result field on ResponseMessage can be null for a
+      // successful response that has no return value, eg. shutdown).
+      canBeNull = true;
+    }
+    return Field(leadingComment, name, type, canBeNull, canBeUndefined);
+  }
+
+  Interface _interface(Comment leadingComment) {
+    final name = _consume(TokenType.IDENTIFIER, 'Expected identifier');
+    final typeArgs = <Token>[];
+    if (_match([TokenType.LESS])) {
+      while (true) {
+        typeArgs.add(_consume(TokenType.IDENTIFIER, 'Expected identifier'));
+        if (_check(TokenType.GREATER)) {
+          break;
+        }
+        _consume(TokenType.COMMA, 'Expected , or >');
+      }
+      _consume(TokenType.GREATER, 'Expected >');
+    }
+    final baseTypes = <TypeBase>[];
+    if (_match([TokenType.EXTENDS_KEYWORD])) {
+      while (true) {
+        baseTypes.add(_type(name.lexeme, null));
+        if (_check(TokenType.LEFT_BRACE)) {
+          break;
+        }
+        _consume(TokenType.COMMA, 'Expected , or {');
+      }
+    }
+    _consume(TokenType.LEFT_BRACE, 'Expected {');
+    final members = <Member>[];
+    while (!_check(TokenType.RIGHT_BRACE)) {
+      members.add(_member(name.lexeme));
+    }
+
+    _consume(TokenType.RIGHT_BRACE, 'Expected }');
+
+    return new Interface(leadingComment, name, typeArgs, baseTypes, members);
+  }
+
+  /// Returns [true] an advances if the next token is one of [types], otherwise
+  /// returns [false].
+  bool _match(List<TokenType> types) {
+    for (final type in types) {
+      if (_check(type)) {
+        _advance();
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  Member _member(String containerName) {
+    final leadingComment = _comment();
+    _eatUnwantedKeywords();
+
+    if (_match([TokenType.CONST_KEYWORD])) {
+      return _const(containerName, leadingComment);
+    } else if (_match([TokenType.LEFT_BRACKET])) {
+      return _indexer(containerName, leadingComment);
+    } else {
+      return _field(containerName, leadingComment);
+    }
+  }
+
+  Namespace _namespace(Comment leadingComment) {
+    final name = _consume(TokenType.IDENTIFIER, 'Expected identifier');
+    _consume(TokenType.LEFT_BRACE, 'Expected {');
+    final members = <Member>[];
+    while (!_check(TokenType.RIGHT_BRACE)) {
+      members.add(_member(name.lexeme));
+    }
+    _consume(TokenType.RIGHT_BRACE, 'Expected }');
+
+    return new Namespace(leadingComment, name, members);
+  }
+
+  /// Returns the next token without advancing.
+  Token _peek() => _tokenAt(_current);
+
+  Token _tokenAt(int index) =>
+      index < _tokens.length ? _tokens[index] : Token.EOF;
+
+  AstNode _topLevel() {
+    final leadingComment = _comment();
+    _match([TokenType.EXPORT_KEYWORD]);
+
+    final token = _peek();
+    if (_match([TokenType.NAMESPACE_KEYWORD])) {
+      return _namespace(leadingComment);
+    } else if (_match([TokenType.INTERFACE_KEYWORD])) {
+      return _interface(leadingComment);
+    } else if (_match([TokenType.CLASS_KEYWORD])) {
+      // Classes are the same as interfaces in this spec.
+      return _interface(leadingComment);
+    } else if (_match([TokenType.ENUM_KEYWORD])) {
+      return _enum(leadingComment);
+    } else if (token.type == TokenType.IDENTIFIER && token.lexeme == 'type') {
+      // TODO(dantup): This is a hack... We don't have a TYPE_KEYWORD because
+      // the spec has `type` as an identifier.
+      _advance(); // Eat the 'type' keyword.
+      return _typeAlias(leadingComment);
+    } else {
+      throw 'Unexpected token ${_peek()}';
+    }
+  }
+
+  TypeBase _type(
+    String containerName,
+    String fieldName, {
+    bool includeUndefined = false,
+    bool improveTypes = false,
+  }) {
+    var types = <TypeBase>[];
+    if (includeUndefined) {
+      types.add(Type.Undefined);
+    }
+    while (true) {
+      TypeBase type;
+      if (_match([TokenType.LEFT_BRACE])) {
+        // Inline interfaces.
+        final members = <Member>[];
+        while (!_check(TokenType.RIGHT_BRACE)) {
+          members.add(_member(containerName));
+        }
+
+        _consume(TokenType.RIGHT_BRACE, 'Expected }');
+        // Some of the inline interfaces have trailing commas (and some do not!)
+        _match([TokenType.COMMA]);
+
+        // If we have a single member that is an indexer type, we can use a Map.
+        if (members.length == 1 && members.single is Indexer) {
+          Indexer indexer = members.single;
+          type = new MapType(indexer.indexType, indexer.valueType);
+        } else {
+          // Add a synthetic interface to the parsers list of nodes to represent this type.
+          final generatedName = _joinNames(containerName, fieldName);
+          _nodes.add(new InlineInterface(generatedName, members));
+          // Record the type as a simple type that references this interface.
+          type = new Type.identifier(generatedName);
+        }
+      } else if (_match([TokenType.LEFT_PAREN])) {
+        // Some types are in (parens), so we just parse the contents as a nested type.
+        type = _type(containerName, fieldName);
+        _consume(TokenType.RIGHT_PAREN, 'Expected )');
+      } else if (_match([TokenType.STRING])) {
+        // In TS and the spec, literal strings can be types:
+        // export const PlainText: 'plaintext' = 'plaintext';
+        // trace?: 'off' | 'messages' | 'verbose';
+        // the best we can do is use their base type (string).
+        type = Type.identifier('string');
+      } else if (_match([TokenType.NUMBER])) {
+        // In TS and the spec, literal numbers can be types:
+        // export const Invoked: 1 = 1;
+        // the best we can do is use their base type (number).
+        type = Type.identifier('number');
+      } else if (_match([TokenType.LEFT_BRACKET])) {
+        // Tuples will just be converted to List/Array.
+        final tupleElementTypes = <TypeBase>[];
+        while (!_check(TokenType.RIGHT_BRACKET)) {
+          tupleElementTypes.add(_type(containerName, fieldName));
+          // Remove commas in between.
+          _match([TokenType.COMMA]);
+        }
+        _consume(TokenType.RIGHT_BRACKET, 'Expected ]');
+
+        final uniqueTypes = _getUniqueTypes(tupleElementTypes);
+        var tupleType = uniqueTypes.length == 1
+            ? uniqueTypes.single
+            : new UnionType(uniqueTypes);
+        type = new ArrayType(tupleType);
+      } else {
+        var typeName = _consume(TokenType.IDENTIFIER, 'Expected identifier');
+        final typeArgs = <Type>[];
+        if (_match([TokenType.LESS])) {
+          while (true) {
+            typeArgs.add(_type(containerName, fieldName));
+            if (_peek() != TokenType.COMMA) {
+              _consume(TokenType.GREATER, 'Expected >');
+              break;
+            }
+          }
+        }
+
+        type = typeName.lexeme == 'Array'
+            ? new ArrayType(typeArgs.single)
+            : new Type(typeName, typeArgs);
+      }
+      if (_match([TokenType.LEFT_BRACKET])) {
+        _consume(TokenType.RIGHT_BRACKET, 'Expected ]');
+        type = new ArrayType(type);
+      }
+      // TODO(dantup): Handle types like This & That.
+      // For now, map to any.
+      if (_match([TokenType.AMPERSAND])) {
+        while (true) {
+          // Eat as many types/ampersands as we have.
+          _type(containerName, fieldName);
+          if (!_check(TokenType.AMPERSAND)) {
+            break;
+          }
+        }
+        type = Type.Any;
+      }
+
+      types.add(type);
+
+      if (!_match([TokenType.PIPE])) {
+        break;
+      }
+    }
+
+    final uniqueTypes = _getUniqueTypes(types);
+
+    var type = uniqueTypes.length == 1
+        ? uniqueTypes.single
+        : new UnionType(uniqueTypes);
+
+    // Handle improved type mappings for things that aren't very tight in the spec.
+    if (improveTypes) {
+      final improvedTypeName = getImprovedType(containerName, fieldName);
+      if (improvedTypeName != null) {
+        type = new Type.identifier(improvedTypeName);
+      }
+    }
+    return type;
+  }
+
+  /// Remove any duplicate types (for ex. if we map multiple types into dynamic)
+  /// we don't want to end up with `dynamic | dynamic`. Key on dartType to
+  /// ensure we different types that will map down to the same type.
+  List<TypeBase> _getUniqueTypes(List<TypeBase> types) {
+    final uniqueTypes = new Map.fromEntries(
+      types.map((t) => new MapEntry(t.dartTypeWithTypeArgs, t)),
+    ).values.toList();
+    return uniqueTypes;
+  }
+
+  TypeAlias _typeAlias(Comment leadingComment) {
+    final name = _consume(TokenType.IDENTIFIER, 'Expected identifier');
+    _consume(TokenType.EQUAL, 'Expected =');
+    final type = _type(name.lexeme, null);
+    _consume(TokenType.SEMI_COLON, 'Expected ;');
+
+    return new TypeAlias(leadingComment, name, type);
+  }
+}
+
+class Scanner {
+  final String _source;
+  int _startOfToken = 0;
+  int _currentPos = 0;
+  final _tokens = <Token>[];
+  Scanner(this._source);
+
+  bool get _isAtEnd => _currentPos >= _source.length;
+  bool get _isNextAtEnd => _currentPos + 1 >= _source.length;
+
+  List<Token> scan() {
+    while (!_isAtEnd) {
+      _startOfToken = _currentPos;
+      _scanToken();
+    }
+    return _tokens;
+  }
+
+  void _addToken(TokenType type) {
+    final text = _source.substring(_startOfToken, _currentPos);
+    _tokens.add(Token(type, text));
+  }
+
+  String _advance() => _currentPos < _source.length
+      ? _source[_currentPos++]
+      : throw 'Cannot advance past end of source';
+
+  void _identifier() {
+    const keywords = <String, TokenType>{
+      'class': TokenType.CLASS_KEYWORD,
+      'const': TokenType.CONST_KEYWORD,
+      'enum': TokenType.ENUM_KEYWORD,
+      'export': TokenType.EXPORT_KEYWORD,
+      'extends': TokenType.EXTENDS_KEYWORD,
+      'interface': TokenType.INTERFACE_KEYWORD,
+      'namespace': TokenType.NAMESPACE_KEYWORD,
+      'readonly': TokenType.READONLY_KEYWORD,
+    };
+    while (_isAlpha(_peek())) {
+      _advance();
+    }
+
+    final string = _source.substring(_startOfToken, _currentPos);
+    if (keywords.containsKey(string)) {
+      _addToken(keywords[string]);
+    } else {
+      _addToken(TokenType.IDENTIFIER);
+    }
+  }
+
+  bool _isAlpha(String s) => _validIdentifierCharacters.hasMatch(s);
+
+  bool _isDigit(String s) => s != null && (s.codeUnitAt(0) ^ 0x30) <= 9;
+
+  bool _match(String expected) {
+    if (_isAtEnd || _source[_currentPos] != expected) {
+      return false;
+    }
+    _currentPos++;
+    return true;
+  }
+
+  void _number() {
+    // Optionally process a negative.
+    _match('-');
+    while (_isDigit(_peek())) {
+      _advance();
+    }
+
+    // Handle fractional parts.
+    if (_peek() == '.' && _isDigit(_peekNext())) {
+      // Consume the decimal point.
+      _advance();
+
+      while (_isDigit(_peek())) {
+        _advance();
+      }
+    }
+
+    _addToken(TokenType.NUMBER);
+  }
+
+  String _peek() => _isAtEnd ? null : _source[_currentPos];
+
+  String _peekNext() => _isNextAtEnd ? null : _source[_currentPos + 1];
+
+  void _scanToken() {
+    const singleCharTokens = <String, TokenType>{
+      ',': TokenType.COMMA,
+      ';': TokenType.SEMI_COLON,
+      ':': TokenType.COLON,
+      '?': TokenType.QUESTION,
+      '.': TokenType.DOT,
+      '(': TokenType.LEFT_PAREN,
+      ')': TokenType.RIGHT_PAREN,
+      '[': TokenType.LEFT_BRACKET,
+      ']': TokenType.RIGHT_BRACKET,
+      '{': TokenType.LEFT_BRACE,
+      '}': TokenType.RIGHT_BRACE,
+      '*': TokenType.STAR,
+      '&': TokenType.AMPERSAND,
+      '=': TokenType.EQUAL,
+      '|': TokenType.PIPE,
+    };
+
+    final c = _advance();
+    if (singleCharTokens.containsKey(c)) {
+      _addToken(singleCharTokens[c]);
+      return;
+    }
+    switch (c) {
+      case '/':
+        if (_match('*')) {
+          // Block comment.
+          while (!_isAtEnd && (_peek() != '*' || _peekNext() != '/')) {
+            _advance();
+          }
+          // Eat the closing comment markers detected above.
+          if (!_isAtEnd) {
+            _advance();
+            _advance();
+          }
+          _addToken(TokenType.COMMENT);
+        } else if (_match('/')) {
+          // Single line comment.
+          while (_peek() != '\n' && !_isAtEnd) {
+            _advance();
+          }
+          _addToken(TokenType.COMMENT);
+        } else {
+          _addToken(TokenType.SLASH);
+        }
+        break;
+      case '<':
+        _addToken(_match('=') ? TokenType.LESS_EQUAL : TokenType.LESS);
+        break;
+      case '>':
+        _addToken(_match('=') ? TokenType.GREATER_EQUAL : TokenType.GREATER);
+        break;
+      case ' ':
+      case '\r':
+      case '\n':
+      case '\t':
+        // Whitespace.
+        break;
+      case '"':
+      case "'":
+        _string(c);
+        break;
+      default:
+        if (_isDigit(c) || c == '-' && _isDigit(_peek())) {
+          _number();
+        } else if (_isAlpha(c)) {
+          _identifier();
+        } else {
+          final start = max(0, _currentPos - 20);
+          final end = min(_currentPos + 20, _source.length);
+          final snippet = _source.substring(start, end);
+          throw "Unexpected character '$c'.\n\n$snippet";
+        }
+        break;
+    }
+  }
+
+  void _string(String terminator) {
+    // TODO(dantup): Handle escape sequences, inc. quotes.
+    while (!_isAtEnd && _peek() != terminator) {
+      _advance();
+
+      if (_isAtEnd) {
+        throw 'Unterminated string.';
+      }
+    }
+
+    // Skip over the closing terminator.
+    _advance();
+
+    _addToken(TokenType.STRING);
+  }
+}
+
+class Token {
+  static final Token EOF = new Token(TokenType.EOF, '');
+
+  final TokenType type;
+  final String lexeme;
+
+  Token(this.type, this.lexeme);
+
+  Token.identifier(String identifier) : this(TokenType.IDENTIFIER, identifier);
+
+  @override
+  String toString() => '${type.toString().padRight(25)} '
+      '${lexeme.padRight(10)}\n';
+}
+
+enum TokenType {
+  AMPERSAND,
+  CLASS_KEYWORD,
+  COLON,
+  COMMA,
+  COMMENT,
+  CONST_KEYWORD,
+  DOT,
+  ENUM_KEYWORD,
+  EOF,
+  EQUAL,
+  EXPORT_KEYWORD,
+  EXTENDS_KEYWORD,
+  GREATER_EQUAL,
+  GREATER,
+  IDENTIFIER,
+  INTERFACE_KEYWORD,
+  LEFT_BRACE,
+  LEFT_BRACKET,
+  LEFT_PAREN,
+  LESS_EQUAL,
+  LESS,
+  NAMESPACE_KEYWORD,
+  NUMBER,
+  PIPE,
+  QUESTION,
+  READONLY_KEYWORD,
+  RIGHT_BRACE,
+  RIGHT_BRACKET,
+  RIGHT_PAREN,
+  SEMI_COLON,
+  SLASH,
+  STAR,
+  STRING,
+}
+
+class Type extends TypeBase {
+  static final TypeBase Undefined = new Type.identifier('undefined');
+  static final TypeBase Any = new Type.identifier('any');
+  final Token nameToken;
+  final List<TypeBase> typeArgs;
+
+  Type(this.nameToken, this.typeArgs) {
+    if (this.name == 'Array' || this.name.endsWith('[]')) {
+      throw 'Type should not be used for arrays, use ArrayType instead';
+    }
+  }
+
+  Type.identifier(String identifier)
+      : this(new Token.identifier(identifier), []);
+
+  @override
+  String get dartType {
+    // Always resolve type aliases when asked for our Dart type.
+    final resolvedType = resolveTypeAlias(this);
+    if (resolvedType != this) {
+      return resolvedType.dartType;
+    }
+
+    const mapping = <String, String>{
+      'boolean': 'bool',
+      'string': 'String',
+      'number': 'num',
+      'any': 'dynamic',
+      'object': 'dynamic',
+      // Simplify MarkedString from
+      //     string | { language: string; value: string }
+      // to just String
+      'MarkedString': 'String'
+    };
+
+    final typeName = mapping[name] ?? name;
+    return typeName;
+  }
+
+  String get name => nameToken.lexeme;
+
+  @override
+  String get typeArgsString {
+    // Always resolve type aliases when asked for our Dart type.
+    final resolvedType = resolveTypeAlias(this);
+    if (resolvedType != this) {
+      return resolvedType.typeArgsString;
+    }
+
+    return typeArgs.isNotEmpty
+        ? '<${typeArgs.map((t) => t.dartTypeWithTypeArgs).join(', ')}>'
+        : '';
+  }
+}
+
+class TypeAlias extends AstNode {
+  final Token nameToken;
+  final TypeBase baseType;
+  TypeAlias(
+    Comment comment,
+    this.nameToken,
+    this.baseType,
+  ) : super(comment);
+
+  String get name => nameToken.lexeme;
+}
+
+abstract class TypeBase {
+  String get dartType;
+  String get dartTypeWithTypeArgs => '$dartType$typeArgsString';
+  String get typeArgsString;
+}
+
+class UnionType extends TypeBase {
+  final List<TypeBase> types;
+
+  UnionType(this.types);
+
+  @override
+  String get dartType {
+    if (types.length > 4) {
+      throw 'Unions of more than 4 types are not supported.';
+    }
+    return 'Either${types.length}';
+  }
+
+  @override
+  String get typeArgsString {
+    final typeArgs = types.map((t) => t.dartTypeWithTypeArgs).join(', ');
+    return '<$typeArgs>';
+  }
+}
diff --git a/pkg/analysis_server/tool/spec/api.dart b/pkg/analysis_server/tool/spec/api.dart
index 1fd0c67..6e98267 100644
--- a/pkg/analysis_server/tool/spec/api.dart
+++ b/pkg/analysis_server/tool/spec/api.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/check_all_test.dart b/pkg/analysis_server/tool/spec/check_all_test.dart
index cd313ee..3aefa25 100644
--- a/pkg/analysis_server/tool/spec/check_all_test.dart
+++ b/pkg/analysis_server/tool/spec/check_all_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
index 2e6969e..75fc69c 100644
--- a/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
+++ b/pkg/analysis_server/tool/spec/codegen_analysis_server.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -71,6 +71,59 @@
       });
 
       //
+      // addRequestListener(..)
+      //
+      publicMethod('addRequestListener', () {
+        writeln('''/**
+ * Add the given listener to the list of listeners that will receive notification when
+   * requests are made by an analysis server client.
+ * 
+ * @param listener the listener to be added
+ */''');
+        writeln('public void addRequestListener(RequestListener listener);');
+      });
+
+      //
+      // removeRequestListener(..)
+      //
+      publicMethod('removeRequestListener', () {
+        writeln('''/**
+ * Remove the given listener from the list of listeners that will receive notification when
+   * requests are made by an analysis server client.
+ * 
+ * @param listener the listener to be removed
+ */''');
+        writeln('public void removeRequestListener(RequestListener listener);');
+      });
+
+      //
+      // addResponseListener(..)
+      //
+      publicMethod('addResponseListener', () {
+        writeln('''/**
+ * Add the given listener to the list of listeners that will receive notification when
+ * responses are received by an analysis server client.
+ * 
+ * @param listener the listener to be added
+ */''');
+        writeln('public void addResponseListener(ResponseListener listener);');
+      });
+
+      //
+      // removeResponseListener(..)
+      //
+      publicMethod('removeResponseListener', () {
+        writeln('''/**
+ * Remove the given listener from the list of listeners that will receive notification when
+   * responses are received by an analysis server client.
+ * 
+ * @param listener the listener to be removed
+ */''');
+        writeln(
+            'public void removeResponseListener(ResponseListener listener);');
+      });
+
+      //
       // addStatusListener(..)
       //
       publicMethod('addStatusListener', () {
diff --git a/pkg/analysis_server/tool/spec/codegen_dart.dart b/pkg/analysis_server/tool/spec/codegen_dart.dart
index 8b736bb..f6d1533 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_notification_handler.dart b/pkg/analysis_server/tool/spec/codegen_dart_notification_handler.dart
new file mode 100644
index 0000000..45c8f2e
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/codegen_dart_notification_handler.dart
@@ -0,0 +1,143 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/codegen/tools.dart';
+import 'package:html/dom.dart';
+
+import 'api.dart';
+import 'codegen_dart.dart';
+import 'codegen_protocol_constants.dart' show generateConstName;
+import 'from_html.dart';
+
+GeneratedFile clientTarget() {
+  return new GeneratedFile(
+      '../analysis_server_client/lib/handler/notification_handler.dart',
+      (String pkgPath) async {
+    CodegenNotificationHandlerVisitor visitor =
+        new CodegenNotificationHandlerVisitor(readApi(pkgPath));
+    return visitor.collectCode(visitor.visitApi);
+  });
+}
+
+/**
+ * Visitor which produces Dart code representing the API.
+ */
+class CodegenNotificationHandlerVisitor extends DartCodegenVisitor
+    with CodeGenerator {
+  CodegenNotificationHandlerVisitor(Api api) : super(api) {
+    codeGeneratorSettings.commentLineLength = 79;
+    codeGeneratorSettings.languageName = 'dart';
+  }
+
+  void emitImports() {
+    writeln("import 'package:analysis_server_client/protocol.dart';");
+  }
+
+  void emitNotificationHandler() {
+    _NotificationVisitor visitor = new _NotificationVisitor(api)..visitApi();
+    final notifications = visitor.notificationConstants;
+    notifications.sort((n1, n2) => n1.constName.compareTo(n2.constName));
+
+    writeln('''
+/// [NotificationHandler] processes analysis server notifications
+/// and dispatches those notifications to different methods based upon
+/// the type of notification. Clients may override
+/// any of the "on<EventName>" methods that are of interest.
+///
+/// Clients may mix-in this class, but may not implement it.
+mixin NotificationHandler {
+  void handleEvent(Notification notification) {
+    Map<String, Object> params = notification.params;
+    ResponseDecoder decoder = new ResponseDecoder(null);
+    switch (notification.event) {
+''');
+    for (_Notification notification in notifications) {
+      writeln('      case ${notification.constName}:');
+      writeln('        ${notification.methodName}(');
+      writeln('          new ${notification.paramsTypeName}');
+      writeln("            .fromJson(decoder, 'params', params));");
+      writeln('        break;');
+    }
+    writeln('      default:');
+    writeln('        onUnknownNotification(notification.event, params);');
+    writeln('        break;');
+    writeln('    }');
+    writeln('  }');
+    for (_Notification notification in notifications) {
+      writeln();
+      emitDartdoc(notification.dartdoc);
+      writeln('  void ${notification.methodName}(');
+      writeln('    ${notification.paramsTypeName} params) {');
+      writeln('  }');
+    }
+    writeln();
+    writeln('  /// Reports a notification that is not processed');
+    writeln('  /// by any other notification handlers.');
+    writeln('  void onUnknownNotification(String event, params) {}');
+    writeln('}');
+  }
+
+  void emitDartdoc(List<String> dartdoc) {
+    bool first = true;
+    for (String paragraph in dartdoc) {
+      if (first) {
+        first = false;
+      } else {
+        writeln('  ///');
+      }
+      for (String line in paragraph.split(new RegExp('\r?\n'))) {
+        writeln('  /// ${line.trim()}');
+      }
+    }
+  }
+
+  @override
+  visitApi() {
+    outputHeader(year: '2018');
+    writeln();
+    emitImports();
+    emitNotificationHandler();
+  }
+}
+
+class _Notification {
+  final String constName;
+  final String methodName;
+  final String paramsTypeName;
+  final List<String> dartdoc;
+
+  _Notification(
+      this.constName, this.methodName, this.paramsTypeName, this.dartdoc);
+}
+
+class _NotificationVisitor extends HierarchicalApiVisitor {
+  final notificationConstants = <_Notification>[];
+
+  _NotificationVisitor(Api api) : super(api);
+
+  @override
+  void visitNotification(Notification notification) {
+    notificationConstants.add(new _Notification(
+        generateConstName(
+            notification.domainName, 'notification', notification.event),
+        _generateNotificationMethodName(
+            notification.domainName, notification.event),
+        _generateParamTypeName(notification.domainName, notification.event),
+        _generateDartDoc(notification.html)));
+  }
+}
+
+List<String> _generateDartDoc(Element html) => html.children
+    .where((Element elem) => elem.localName == 'p')
+    .map<String>((Element elem) => elem.text.trim())
+    .toList();
+
+String _generateNotificationMethodName(String domainName, String event) =>
+    'on${_capitalize(domainName)}${_capitalize(event)}';
+
+String _generateParamTypeName(String domainName, String event) =>
+    '${_capitalize(domainName)}${_capitalize(event)}Params';
+
+_capitalize(String name) =>
+    '${name.substring(0, 1).toUpperCase()}${name.substring(1)}';
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index f34ea9c..adb57f7 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart b/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
index 88870a7a..8fec4fa 100644
--- a/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
+++ b/pkg/analysis_server/tool/spec/codegen_inttest_methods.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/codegen_java.dart b/pkg/analysis_server/tool/spec/codegen_java.dart
index d1e02b4..9956fe1 100644
--- a/pkg/analysis_server/tool/spec/codegen_java.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index dd963d0..2006405 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/codegen_matchers.dart b/pkg/analysis_server/tool/spec/codegen_matchers.dart
index 480e46f..226c707 100644
--- a/pkg/analysis_server/tool/spec/codegen_matchers.dart
+++ b/pkg/analysis_server/tool/spec/codegen_matchers.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart b/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
index 8ddfb5e..7530d39 100644
--- a/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
+++ b/pkg/analysis_server/tool/spec/codegen_protocol_constants.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -22,6 +22,17 @@
 });
 
 /**
+   * Generate a name from the [domainName], [kind] and [name] components.
+   */
+String generateConstName(String domainName, String kind, String name) {
+  List<String> components = <String>[];
+  components.addAll(_split(domainName));
+  components.add(kind);
+  components.addAll(_split(name));
+  return _fromComponents(components);
+}
+
+/**
  * A visitor that produces Dart code defining constants associated with the API.
  */
 class CodegenVisitor extends DartCodegenVisitor with CodeGenerator {
@@ -34,6 +45,8 @@
    * Generate all of the constants associates with the [api].
    */
   void generateConstants() {
+    writeln("const String PROTOCOL_VERSION = '${api.version}';");
+    writeln();
     _ConstantVisitor visitor = new _ConstantVisitor(api);
     visitor.visitApi();
     List<_Constant> constants = visitor.constants;
@@ -101,7 +114,7 @@
     String domainName = notification.domainName;
     String event = notification.event;
 
-    String constantName = _generateName(domainName, 'notification', event);
+    String constantName = generateConstName(domainName, 'notification', event);
     constants.add(new _Constant(constantName, "'$domainName.$event'"));
     _addFieldConstants(constantName, notification.params);
   }
@@ -111,11 +124,13 @@
     String domainName = request.domainName;
     String method = request.method;
 
-    String requestConstantName = _generateName(domainName, 'request', method);
+    String requestConstantName =
+        generateConstName(domainName, 'request', method);
     constants.add(new _Constant(requestConstantName, "'$domainName.$method'"));
     _addFieldConstants(requestConstantName, request.params);
 
-    String responseConstantName = _generateName(domainName, 'response', method);
+    String responseConstantName =
+        generateConstName(domainName, 'response', method);
     _addFieldConstants(responseConstantName, request.result);
   }
 
@@ -137,40 +152,29 @@
       constants.add(new _Constant(fieldConstantName, "'$name'"));
     });
   }
+}
 
-  /**
+/**
    * Return a name generated by converting each of the given [components] to an
    * uppercase equivalent, then joining them with underscores.
    */
-  String _fromComponents(List<String> components) =>
-      components.map((String component) => component.toUpperCase()).join('_');
+String _fromComponents(List<String> components) =>
+    components.map((String component) => component.toUpperCase()).join('_');
 
-  /**
-   * Generate a name from the [domainName], [kind] and [name] components.
-   */
-  String _generateName(String domainName, String kind, String name) {
-    List<String> components = <String>[];
-    components.addAll(_split(domainName));
-    components.add(kind);
-    components.addAll(_split(name));
-    return _fromComponents(components);
-  }
-
-  /**
+/**
    * Return the components of the given [string] that are indicated by an upper
    * case letter.
    */
-  Iterable<String> _split(String first) {
-    RegExp regExp = new RegExp('[A-Z]');
-    List<String> components = <String>[];
-    int start = 1;
-    int index = first.indexOf(regExp, start);
-    while (index >= 0) {
-      components.add(first.substring(start - 1, index));
-      start = index + 1;
-      index = first.indexOf(regExp, start);
-    }
-    components.add(first.substring(start - 1));
-    return components;
+Iterable<String> _split(String first) {
+  RegExp regExp = new RegExp('[A-Z]');
+  List<String> components = <String>[];
+  int start = 1;
+  int index = first.indexOf(regExp, start);
+  while (index >= 0) {
+    components.add(first.substring(start - 1, index));
+    start = index + 1;
+    index = first.indexOf(regExp, start);
   }
+  components.add(first.substring(start - 1));
+  return components;
 }
diff --git a/pkg/analysis_server/tool/spec/from_html.dart b/pkg/analysis_server/tool/spec/from_html.dart
index 79f5882..be77a02 100644
--- a/pkg/analysis_server/tool/spec/from_html.dart
+++ b/pkg/analysis_server/tool/spec/from_html.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/generate_all.dart b/pkg/analysis_server/tool/spec/generate_all.dart
index 39cd887..c5afd22 100644
--- a/pkg/analysis_server/tool/spec/generate_all.dart
+++ b/pkg/analysis_server/tool/spec/generate_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,6 +8,8 @@
 import 'package:path/path.dart';
 
 import 'codegen_analysis_server.dart' as codegen_analysis_server;
+import 'codegen_dart_notification_handler.dart'
+    as codegen_dart_notification_handler;
 import 'codegen_dart_protocol.dart' as codegen_dart_protocol;
 import 'codegen_inttest_methods.dart' as codegen_inttest_methods;
 import 'codegen_java_types.dart' as codegen_java_types;
@@ -30,6 +32,7 @@
 List<GeneratedContent> get allTargets {
   List<GeneratedContent> targets = <GeneratedContent>[];
   targets.add(codegen_analysis_server.target);
+  targets.add(codegen_dart_notification_handler.clientTarget());
   targets.add(codegen_dart_protocol.clientTarget(false));
   targets.add(codegen_dart_protocol.serverTarget(false));
   targets.add(codegen_java_types.targetDir);
diff --git a/pkg/analysis_server/tool/spec/generate_files b/pkg/analysis_server/tool/spec/generate_files
index 0651cb2..01ea5593 100755
--- a/pkg/analysis_server/tool/spec/generate_files
+++ b/pkg/analysis_server/tool/spec/generate_files
@@ -32,13 +32,7 @@
 
 ROOT_DIR="$(cd "${SCRIPT_DIR}/../../../.." ; pwd -P)"
 
-if [[ $1 == '--arch' && $2 == 'x64' ]];
-then
-  DART_CONFIGURATION="ReleaseX64"
-elif [ -z "$DART_CONFIGURATION" ];
-then
-  DART_CONFIGURATION="ReleaseIA32"
-fi
+DART_CONFIGURATION="ReleaseX64"
 
 if [[ `uname` == 'Darwin' ]];
 then
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index ae85d07..45f18a6 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -31,6 +31,22 @@
   public void addAnalysisServerListener(AnalysisServerListener listener);
 
   /**
+   * Add the given listener to the list of listeners that will receive notification when
+     * requests are made by an analysis server client.
+   *
+   * @param listener the listener to be added
+   */
+  public void addRequestListener(RequestListener listener);
+
+  /**
+   * Add the given listener to the list of listeners that will receive notification when
+   * responses are received by an analysis server client.
+   *
+   * @param listener the listener to be added
+   */
+  public void addResponseListener(ResponseListener listener);
+
+  /**
    * Add the given listener to the list of listeners that will receive notification when the server
    * is not active
    *
@@ -167,18 +183,10 @@
   /**
    * {@code analysis.reanalyze}
    *
-   * Force the re-analysis of everything contained in the specified analysis roots. This will cause
-   * all previously computed analysis results to be discarded and recomputed, and will cause all
-   * subscribed notifications to be re-sent.
-   *
-   * If no analysis roots are provided, then all current analysis roots will be re-analyzed. If an
-   * empty list of analysis roots is provided, then nothing will be re-analyzed. If the list contains
-   * one or more paths that are not currently analysis roots, then an error of type
-   * INVALID_ANALYSIS_ROOT will be generated.
-   *
-   * @param roots A list of the analysis roots that are to be re-analyzed.
+   * Force re-reading of all potentially changed files, re-resolving of all referenced URIs, and
+   * corresponding re-analysis of everything affected in the current analysis roots.
    */
-  public void analysis_reanalyze(List<String> roots);
+  public void analysis_reanalyze();
 
   /**
    * {@code analysis.setAnalysisRoots}
@@ -757,6 +765,22 @@
   public void removeAnalysisServerListener(AnalysisServerListener listener);
 
   /**
+   * Remove the given listener from the list of listeners that will receive notification when
+     * requests are made by an analysis server client.
+   *
+   * @param listener the listener to be removed
+   */
+  public void removeRequestListener(RequestListener listener);
+
+  /**
+   * Remove the given listener from the list of listeners that will receive notification when
+     * responses are received by an analysis server client.
+   *
+   * @param listener the listener to be removed
+   */
+  public void removeResponseListener(ResponseListener listener);
+
+  /**
    * {@code search.findElementReferences}
    *
    * Perform a search for references to the element defined or referenced at the given offset in the
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
index 073d802..83f2643 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
@@ -60,6 +60,12 @@
   private final String displayText;
 
   /**
+   * The URI of the element corresponding to this suggestion. It will be set whenever analysis server
+   * is able to compute it.
+   */
+  private final String elementUri;
+
+  /**
    * The offset, relative to the beginning of the completion, of where the selection should be placed
    * after insertion.
    */
@@ -169,11 +175,12 @@
   /**
    * Constructor for {@link CompletionSuggestion}.
    */
-  public CompletionSuggestion(String kind, int relevance, String completion, String displayText, int selectionOffset, int selectionLength, boolean isDeprecated, boolean isPotential, String docSummary, String docComplete, String declaringType, String defaultArgumentListString, int[] defaultArgumentListTextRanges, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, Integer requiredParameterCount, Boolean hasNamedParameters, String parameterName, String parameterType, String importUri) {
+  public CompletionSuggestion(String kind, int relevance, String completion, String displayText, String elementUri, int selectionOffset, int selectionLength, boolean isDeprecated, boolean isPotential, String docSummary, String docComplete, String declaringType, String defaultArgumentListString, int[] defaultArgumentListTextRanges, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, Integer requiredParameterCount, Boolean hasNamedParameters, String parameterName, String parameterType, String importUri) {
     this.kind = kind;
     this.relevance = relevance;
     this.completion = completion;
     this.displayText = displayText;
+    this.elementUri = elementUri;
     this.selectionOffset = selectionOffset;
     this.selectionLength = selectionLength;
     this.isDeprecated = isDeprecated;
@@ -203,6 +210,7 @@
         other.relevance == relevance &&
         ObjectUtilities.equals(other.completion, completion) &&
         ObjectUtilities.equals(other.displayText, displayText) &&
+        ObjectUtilities.equals(other.elementUri, elementUri) &&
         other.selectionOffset == selectionOffset &&
         other.selectionLength == selectionLength &&
         other.isDeprecated == isDeprecated &&
@@ -230,6 +238,7 @@
     int relevance = jsonObject.get("relevance").getAsInt();
     String completion = jsonObject.get("completion").getAsString();
     String displayText = jsonObject.get("displayText") == null ? null : jsonObject.get("displayText").getAsString();
+    String elementUri = jsonObject.get("elementUri") == null ? null : jsonObject.get("elementUri").getAsString();
     int selectionOffset = jsonObject.get("selectionOffset").getAsInt();
     int selectionLength = jsonObject.get("selectionLength").getAsInt();
     boolean isDeprecated = jsonObject.get("isDeprecated").getAsBoolean();
@@ -248,7 +257,7 @@
     String parameterName = jsonObject.get("parameterName") == null ? null : jsonObject.get("parameterName").getAsString();
     String parameterType = jsonObject.get("parameterType") == null ? null : jsonObject.get("parameterType").getAsString();
     String importUri = jsonObject.get("importUri") == null ? null : jsonObject.get("importUri").getAsString();
-    return new CompletionSuggestion(kind, relevance, completion, displayText, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary, docComplete, declaringType, defaultArgumentListString, defaultArgumentListTextRanges, element, returnType, parameterNames, parameterTypes, requiredParameterCount, hasNamedParameters, parameterName, parameterType, importUri);
+    return new CompletionSuggestion(kind, relevance, completion, displayText, elementUri, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary, docComplete, declaringType, defaultArgumentListString, defaultArgumentListTextRanges, element, returnType, parameterNames, parameterTypes, requiredParameterCount, hasNamedParameters, parameterName, parameterType, importUri);
   }
 
   public static List<CompletionSuggestion> fromJsonArray(JsonArray jsonArray) {
@@ -330,6 +339,14 @@
   }
 
   /**
+   * The URI of the element corresponding to this suggestion. It will be set whenever analysis server
+   * is able to compute it.
+   */
+  public String getElementUri() {
+    return elementUri;
+  }
+
+  /**
    * True if the function or method being suggested has at least one named parameter. This field is
    * omitted if the parameterNames field is omitted.
    */
@@ -444,6 +461,7 @@
     builder.append(relevance);
     builder.append(completion);
     builder.append(displayText);
+    builder.append(elementUri);
     builder.append(selectionOffset);
     builder.append(selectionLength);
     builder.append(isDeprecated);
@@ -473,6 +491,9 @@
     if (displayText != null) {
       jsonObject.addProperty("displayText", displayText);
     }
+    if (elementUri != null) {
+      jsonObject.addProperty("elementUri", elementUri);
+    }
     jsonObject.addProperty("selectionOffset", selectionOffset);
     jsonObject.addProperty("selectionLength", selectionLength);
     jsonObject.addProperty("isDeprecated", isDeprecated);
@@ -546,6 +567,8 @@
     builder.append(completion + ", ");
     builder.append("displayText=");
     builder.append(displayText + ", ");
+    builder.append("elementUri=");
+    builder.append(elementUri + ", ");
     builder.append("selectionOffset=");
     builder.append(selectionOffset + ", ");
     builder.append("selectionLength=");
diff --git a/pkg/analysis_server/tool/spec/implied_types.dart b/pkg/analysis_server/tool/spec/implied_types.dart
index 49531b7..856b2a4 100644
--- a/pkg/analysis_server/tool/spec/implied_types.dart
+++ b/pkg/analysis_server/tool/spec/implied_types.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 2f66a93..2418991 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -7,7 +7,7 @@
 <body>
 <h1>Analysis Server API Specification</h1>
 <h1 style="color:#999999">Version
-  <version>1.21.1</version>
+  <version>1.22.1</version>
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -715,28 +715,10 @@
   </request>
   <request method="reanalyze">
     <p>
-      Force the re-analysis of everything contained in the specified
-      analysis roots. This will cause all previously computed analysis
-      results to be discarded and recomputed, and will cause all subscribed
-      notifications to be re-sent.
+      Force re-reading of all potentially changed files, re-resolving of all
+      referenced URIs, and corresponding re-analysis of everything affected in
+      the current analysis roots.
     </p>
-    <p>
-      If no analysis roots are provided, then all current analysis roots
-      will be re-analyzed. If an empty list of analysis roots is provided,
-      then nothing will be re-analyzed. If the list contains one or more
-      paths that are not currently analysis roots, then an error of type
-      <tt>INVALID_ANALYSIS_ROOT</tt> will be generated.
-    </p>
-    <params>
-      <field name="roots" optional="true">
-        <list>
-          <ref>FilePath</ref>
-        </list>
-        <p>
-          A list of the analysis roots that are to be re-analyzed.
-        </p>
-      </field>
-    </params>
   </request>
   <request method="setAnalysisRoots">
     <p>
diff --git a/pkg/analysis_server/tool/spec/to_html.dart b/pkg/analysis_server/tool/spec/to_html.dart
index a6b897b..1683331 100644
--- a/pkg/analysis_server/tool/spec/to_html.dart
+++ b/pkg/analysis_server/tool/spec/to_html.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -161,7 +161,7 @@
 /**
  * Helper methods for creating HTML elements.
  */
-abstract class HtmlMixin {
+mixin HtmlMixin {
   void anchor(String id, void callback()) {
     element('a', {'name': id}, callback);
   }
diff --git a/pkg/analysis_server_client/CHANGELOG.md b/pkg/analysis_server_client/CHANGELOG.md
index 14d2f07..2e19ab6 100644
--- a/pkg/analysis_server_client/CHANGELOG.md
+++ b/pkg/analysis_server_client/CHANGELOG.md
@@ -1,5 +1,14 @@
-#1.0.1
-* Update path on homepage
+# 1.1.1
+ * Update ConnectionHandler to call checkServerProtocolVersion
 
-#1.0.0
-* Initial version
\ No newline at end of file
+# 1.1.0
+ * Add analysis server protocol consts and classes
+ * Overhaul the Server class
+ * Add an example showing analysis of *.dart files in a directory
+ * Update the required SDK
+
+# 1.0.1
+ * Update path on homepage
+
+# 1.0.0
+ * Initial version
diff --git a/pkg/analysis_server_client/README.md b/pkg/analysis_server_client/README.md
index 3351705..c4cc469 100644
--- a/pkg/analysis_server_client/README.md
+++ b/pkg/analysis_server_client/README.md
@@ -1,13 +1,22 @@
-# Analysis Server Client
+# analysis_server_client
 
-A client wrapper over Analysis Server. Instances of this client manages
-connection to Analysis Server and process and faciliates JSON protocol
-communication to and from the server. 
+analysis_server_client is a client wrapper over Analysis Server.
 
-Current implementation has no knowledge of the Analysis Server library yet.
-Future updates will allow for full class-access of Analysis Server protocol
-objects. 
+## Overview
 
-Analysis Server process must be instantiated separately and loaded into
-Analysis Server Client. To learn how to generate an Analysis Server Process,
-refer to the [Analysis Server page.](https://github.com/dart-lang/sdk/tree/master/pkg/analysis_server)
+ * Instances of [__Server__](lib/server.dart) manage a connection to an analysis server process,
+   and facilitate communication to and from the server.
+
+ * The [__Protocol__](lib/protocol.dart) library provides constants and classes
+   to build requests for the server and decode responses and notifications from the server.
+
+## Example
+
+The [example](example/example.dart) uses the [__Server__](lib/server.dart) to
+launch the analysis server, analyze all *.dart files in the specified directory,
+display the results, and shutdown the analysis server.
+
+## References
+
+For more about the analysis server, see the
+[Analysis Server page](https://github.com/dart-lang/sdk/tree/master/pkg/analysis_server).
diff --git a/pkg/analysis_server_client/example/example.dart b/pkg/analysis_server_client/example/example.dart
new file mode 100644
index 0000000..21573b4
--- /dev/null
+++ b/pkg/analysis_server_client/example/example.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:io' show Directory, Platform, ProcessSignal, exit;
+
+import 'package:analysis_server_client/handler/notification_handler.dart';
+import 'package:analysis_server_client/handler/connection_handler.dart';
+import 'package:analysis_server_client/protocol.dart';
+import 'package:analysis_server_client/server.dart';
+import 'package:path/path.dart' as path;
+import 'package:pub_semver/pub_semver.dart';
+
+/// A simple application that uses the analysis server to analyze a package.
+main(List<String> args) async {
+  String target = await parseArgs(args);
+  print('Analyzing $target');
+
+  // Launch the server
+  Server server = new Server();
+  await server.start();
+
+  // Connect to the server
+  _Handler handler = new _Handler(server);
+  server.listenToOutput(notificationProcessor: handler.handleEvent);
+  if (!await handler.serverConnected(timeLimit: const Duration(seconds: 15))) {
+    exit(1);
+  }
+
+  // Request analysis
+  await server.send(SERVER_REQUEST_SET_SUBSCRIPTIONS,
+      new ServerSetSubscriptionsParams([ServerService.STATUS]).toJson());
+  await server.send(ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS,
+      new AnalysisSetAnalysisRootsParams([target], const []).toJson());
+
+  // Continue to watch for analysis until the user presses Ctrl-C
+  StreamSubscription<ProcessSignal> subscription;
+  subscription = ProcessSignal.sigint.watch().listen((_) async {
+    print('Exiting...');
+    subscription.cancel();
+    await server.stop();
+  });
+}
+
+class _Handler with NotificationHandler, ConnectionHandler {
+  final Server server;
+  int errorCount = 0;
+
+  _Handler(this.server);
+
+  @override
+  void onAnalysisErrors(AnalysisErrorsParams params) {
+    List<AnalysisError> errors = params.errors;
+    bool first = true;
+    for (AnalysisError error in errors) {
+      if (error.type.name == 'TODO') {
+        // Ignore these types of "errors"
+        continue;
+      }
+      if (first) {
+        first = false;
+        print('${params.file}:');
+      }
+      Location loc = error.location;
+      print('  ${error.message} • ${loc.startLine}:${loc.startColumn}');
+      ++errorCount;
+    }
+  }
+
+  @override
+  void onFailedToConnect() {
+    print('Failed to connect to server');
+  }
+
+  @override
+  void onProtocolNotSupported(Version version) {
+    print('Expected protocol version $PROTOCOL_VERSION, but found $version');
+  }
+
+  @override
+  void onServerError(ServerErrorParams params) {
+    if (params.isFatal) {
+      print('Fatal Server Error: ${params.message}');
+    } else {
+      print('Server Error: ${params.message}');
+    }
+    if (params.stackTrace != null) {
+      print(params.stackTrace);
+    }
+    super.onServerError(params);
+  }
+
+  @override
+  void onServerStatus(ServerStatusParams params) {
+    if (!params.analysis.isAnalyzing) {
+      // Whenever the server stops analyzing,
+      // print a brief summary of what issues have been found.
+      if (errorCount == 0) {
+        print('No issues found.');
+      } else {
+        print('Found ${errorCount} errors/warnings/hints');
+      }
+      errorCount = 0;
+      print('--------- ctrl-c to exit ---------');
+    }
+  }
+}
+
+Future<String> parseArgs(List<String> args) async {
+  if (args.length != 1) {
+    printUsageAndExit('Expected exactly one directory');
+  }
+  final dir = new Directory(path.normalize(path.absolute(args[0])));
+  if (!(await dir.exists())) {
+    printUsageAndExit('Could not find directory ${dir.path}');
+  }
+  return dir.path;
+}
+
+void printUsageAndExit(String errorMessage) {
+  print(errorMessage);
+  print('');
+  var appName = path.basename(Platform.script.toFilePath());
+  print('Usage: $appName <directory path>');
+  print('  Analyze the *.dart source files in <directory path>');
+  exit(1);
+}
diff --git a/pkg/analysis_server_client/lib/analysis_server_client.dart b/pkg/analysis_server_client/lib/analysis_server_client.dart
deleted file mode 100644
index 484397b..0000000
--- a/pkg/analysis_server_client/lib/analysis_server_client.dart
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-/// Type of callbacks used to process notification.
-typedef void NotificationProcessor(String event, Map<String, Object> params);
-
-/// Instances of the class [AnalysisServerClient] manage a connection to an
-/// [AnalysisServer] process, and facilitate communication to and from the
-/// client/user.
-class AnalysisServerClient {
-  /// AnalysisServer process object, or null if the server has been shut down.
-  final Process _process;
-
-  /// Commands that have been sent to the server but not yet acknowledged,
-  /// and the [Completer] objects which should be completed when
-  /// acknowledgement is received.
-  final Map<String, Completer> _pendingCommands = <String, Completer>{};
-
-  /// Number which should be used to compute the 'id' to send to the next
-  /// command sent to the server.
-  int _nextId = 0;
-
-  AnalysisServerClient(this._process);
-
-  /// Return a future that will complete when all commands that have been
-  /// sent to the server so far have been flushed to the OS buffer.
-  Future<Null> flushCommands() {
-    return _process.stdin.flush();
-  }
-
-  /// Force kill the server. Returns exit code future.
-  Future<int> kill() {
-    _process.kill();
-    return _process.exitCode;
-  }
-
-  void listenToOutput({NotificationProcessor notificationProcessor}) {
-    _process.stdout
-        .transform((new Utf8Codec()).decoder)
-        .transform(new LineSplitter())
-        .listen((String line) {
-      String trimmedLine = line.trim();
-      if (trimmedLine.startsWith('Observatory listening on ')) {
-        return;
-      }
-      final result = json.decoder.convert(trimmedLine) as Map;
-      if (result.containsKey('id')) {
-        final id = result['id'] as String;
-        final completer = _pendingCommands.remove(id);
-
-        if (result.containsKey('error')) {
-          completer.completeError(new ServerErrorMessage(result['error']));
-        } else {
-          completer.complete(result['result']);
-        }
-      } else if (notificationProcessor != null && result.containsKey('event')) {
-        // Message is a notification. It should have an event and possibly
-        // params.
-        notificationProcessor(result['event'], result['params']);
-      }
-    });
-  }
-
-  /// Sends a command to the server. An 'id' will be automatically assigned.
-  /// The returned [Future] will be completed when the server acknowledges
-  /// the command with a response. If the server acknowledges the command
-  /// with a normal (non-error) response, the future will be completed
-  /// with the 'result' field from the response. If the server acknowledges
-  /// the command with an error response, the future will be completed with an
-  /// error.
-  Future send(String method, Map<String, dynamic> params) {
-    String id = '${_nextId++}';
-    Map<String, dynamic> command = <String, dynamic>{
-      'id': id,
-      'method': method
-    };
-    if (params != null) {
-      command['params'] = params;
-    }
-    Completer completer = new Completer();
-    _pendingCommands[id] = completer;
-    String commandAsJson = json.encode(command);
-    _process.stdin.add(utf8.encoder.convert('$commandAsJson\n'));
-    return completer.future;
-  }
-}
-
-class ServerErrorMessage {
-  final Map errorJson;
-
-  ServerErrorMessage(this.errorJson);
-
-  String get code => errorJson['code'].toString();
-  String get message => errorJson['message'];
-  String get stackTrace => errorJson['stackTrace'];
-}
diff --git a/pkg/analysis_server_client/lib/handler/connection_handler.dart b/pkg/analysis_server_client/lib/handler/connection_handler.dart
new file mode 100644
index 0000000..c66b14d
--- /dev/null
+++ b/pkg/analysis_server_client/lib/handler/connection_handler.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// This file has been automatically generated. Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analysis_server/tool/spec/generate_files".
+
+import 'dart:async';
+
+import 'package:analysis_server_client/protocol.dart';
+import 'package:analysis_server_client/handler/notification_handler.dart';
+import 'package:analysis_server_client/server.dart';
+import 'package:pub_semver/pub_semver.dart';
+
+/// [ConnectionHandler] listens to analysis server notifications
+/// and detects when a connection has been established with the server.
+///
+/// Clients may override [onFailedToConnect], [onProtocolNotSupported],
+/// and [onServerError] to display connection failure information.
+///
+/// Clients may mix-in this class, but may not extend or implement it.
+mixin ConnectionHandler implements NotificationHandler {
+  Completer<bool> _connected = new Completer();
+
+  /// Clients should implement this method to return the server being managed.
+  /// This mixin will stop the server process if a connection cannot be
+  /// established or if a server error occurs after connecting.
+  Server get server;
+
+  /// Return `true` if the server's protocol is compatible.
+  bool checkServerProtocolVersion(Version version) {
+    final minVersion = new Version.parse(PROTOCOL_VERSION);
+    final maxVersion = minVersion.nextBreaking;
+    return minVersion <= version && version < maxVersion;
+  }
+
+  void onFailedToConnect() {}
+
+  void onProtocolNotSupported(Version version) {}
+
+  @override
+  void onServerConnected(ServerConnectedParams params) {
+    Version version = new Version.parse(params.version);
+    if (checkServerProtocolVersion(version)) {
+      _connected.complete(true);
+    } else {
+      onProtocolNotSupported(version);
+      _connected.complete(false);
+      server.stop();
+    }
+  }
+
+  @override
+  void onServerError(ServerErrorParams params) {
+    server.stop();
+  }
+
+  /// Return a future that completes with a `bool` indicating whether
+  /// a connection was successfully established with the server.
+  Future<bool> serverConnected({Duration timeLimit}) {
+    Future<bool> future = _connected.future;
+    if (timeLimit != null) {
+      future = future.timeout(timeLimit, onTimeout: () {
+        onFailedToConnect();
+        server.stop();
+        return false;
+      });
+    }
+    return future;
+  }
+}
diff --git a/pkg/analysis_server_client/lib/handler/notification_handler.dart b/pkg/analysis_server_client/lib/handler/notification_handler.dart
new file mode 100644
index 0000000..8bdbf14
--- /dev/null
+++ b/pkg/analysis_server_client/lib/handler/notification_handler.dart
@@ -0,0 +1,270 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// This file has been automatically generated. Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analysis_server/tool/spec/generate_files".
+
+import 'package:analysis_server_client/protocol.dart';
+
+/// [NotificationHandler] processes analysis server notifications
+/// and dispatches those notifications to different methods based upon
+/// the type of notification. Clients may override
+/// any of the "on<EventName>" methods that are of interest.
+///
+/// Clients may mix-in this class, but may not implement it.
+mixin NotificationHandler {
+  void handleEvent(Notification notification) {
+    Map<String, Object> params = notification.params;
+    ResponseDecoder decoder = new ResponseDecoder(null);
+    switch (notification.event) {
+      case ANALYSIS_NOTIFICATION_ANALYZED_FILES:
+        onAnalysisAnalyzedFiles(new AnalysisAnalyzedFilesParams.fromJson(
+            decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_CLOSING_LABELS:
+        onAnalysisClosingLabels(new AnalysisClosingLabelsParams.fromJson(
+            decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_ERRORS:
+        onAnalysisErrors(
+            new AnalysisErrorsParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_FLUSH_RESULTS:
+        onAnalysisFlushResults(
+            new AnalysisFlushResultsParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_FOLDING:
+        onAnalysisFolding(
+            new AnalysisFoldingParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_HIGHLIGHTS:
+        onAnalysisHighlights(
+            new AnalysisHighlightsParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_IMPLEMENTED:
+        onAnalysisImplemented(
+            new AnalysisImplementedParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_INVALIDATE:
+        onAnalysisInvalidate(
+            new AnalysisInvalidateParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_NAVIGATION:
+        onAnalysisNavigation(
+            new AnalysisNavigationParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_OCCURRENCES:
+        onAnalysisOccurrences(
+            new AnalysisOccurrencesParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_OUTLINE:
+        onAnalysisOutline(
+            new AnalysisOutlineParams.fromJson(decoder, 'params', params));
+        break;
+      case ANALYSIS_NOTIFICATION_OVERRIDES:
+        onAnalysisOverrides(
+            new AnalysisOverridesParams.fromJson(decoder, 'params', params));
+        break;
+      case COMPLETION_NOTIFICATION_RESULTS:
+        onCompletionResults(
+            new CompletionResultsParams.fromJson(decoder, 'params', params));
+        break;
+      case EXECUTION_NOTIFICATION_LAUNCH_DATA:
+        onExecutionLaunchData(
+            new ExecutionLaunchDataParams.fromJson(decoder, 'params', params));
+        break;
+      case FLUTTER_NOTIFICATION_OUTLINE:
+        onFlutterOutline(
+            new FlutterOutlineParams.fromJson(decoder, 'params', params));
+        break;
+      case SEARCH_NOTIFICATION_RESULTS:
+        onSearchResults(
+            new SearchResultsParams.fromJson(decoder, 'params', params));
+        break;
+      case SERVER_NOTIFICATION_CONNECTED:
+        onServerConnected(
+            new ServerConnectedParams.fromJson(decoder, 'params', params));
+        break;
+      case SERVER_NOTIFICATION_ERROR:
+        onServerError(
+            new ServerErrorParams.fromJson(decoder, 'params', params));
+        break;
+      case SERVER_NOTIFICATION_STATUS:
+        onServerStatus(
+            new ServerStatusParams.fromJson(decoder, 'params', params));
+        break;
+      default:
+        onUnknownNotification(notification.event, params);
+        break;
+    }
+  }
+
+  /// Reports the paths of the files that are being analyzed.
+  ///
+  /// This notification is not subscribed to by default. Clients can
+  /// subscribe by including the value "ANALYZED_FILES" in the list
+  /// of services passed in an analysis.setGeneralSubscriptions request.
+  void onAnalysisAnalyzedFiles(AnalysisAnalyzedFilesParams params) {}
+
+  /// Reports closing labels relevant to a given file.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "CLOSING_LABELS"
+  /// in the list of services passed in an
+  /// analysis.setSubscriptions request.
+  void onAnalysisClosingLabels(AnalysisClosingLabelsParams params) {}
+
+  /// Reports the errors associated with a given file. The set of
+  /// errors included in the notification is always a complete
+  /// list that supersedes any previously reported errors.
+  void onAnalysisErrors(AnalysisErrorsParams params) {}
+
+  /// Reports that any analysis results that were previously
+  /// associated with the given files should be considered to be
+  /// invalid because those files are no longer being analyzed,
+  /// either because the analysis root that contained it is no
+  /// longer being analyzed or because the file no longer exists.
+  ///
+  /// If a file is included in this notification and at some later
+  /// time a notification with results for the file is received,
+  /// clients should assume that the file is once again being
+  /// analyzed and the information should be processed.
+  ///
+  /// It is not possible to subscribe to or unsubscribe from this
+  /// notification.
+  void onAnalysisFlushResults(AnalysisFlushResultsParams params) {}
+
+  /// Reports the folding regions associated with a given
+  /// file. Folding regions can be nested, but will not be
+  /// overlapping. Nesting occurs when a foldable element, such as
+  /// a method, is nested inside another foldable element such as
+  /// a class.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "FOLDING" in
+  /// the list of services passed in an analysis.setSubscriptions
+  /// request.
+  void onAnalysisFolding(AnalysisFoldingParams params) {}
+
+  /// Reports the highlight regions associated with a given file.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "HIGHLIGHTS"
+  /// in the list of services passed in an
+  /// analysis.setSubscriptions request.
+  void onAnalysisHighlights(AnalysisHighlightsParams params) {}
+
+  /// Reports the classes that are implemented or extended and
+  /// class members that are implemented or overridden in a file.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "IMPLEMENTED" in
+  /// the list of services passed in an analysis.setSubscriptions
+  /// request.
+  void onAnalysisImplemented(AnalysisImplementedParams params) {}
+
+  /// Reports that the navigation information associated with a region of a
+  /// single file has become invalid and should be re-requested.
+  ///
+  /// This notification is not subscribed to by default. Clients can
+  /// subscribe by including the value "INVALIDATE" in the list of
+  /// services passed in an analysis.setSubscriptions request.
+  void onAnalysisInvalidate(AnalysisInvalidateParams params) {}
+
+  /// Reports the navigation targets associated with a given file.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "NAVIGATION"
+  /// in the list of services passed in an
+  /// analysis.setSubscriptions request.
+  void onAnalysisNavigation(AnalysisNavigationParams params) {}
+
+  /// Reports the occurrences of references to elements within a
+  /// single file.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "OCCURRENCES"
+  /// in the list of services passed in an
+  /// analysis.setSubscriptions request.
+  void onAnalysisOccurrences(AnalysisOccurrencesParams params) {}
+
+  /// Reports the outline associated with a single file.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "OUTLINE" in
+  /// the list of services passed in an analysis.setSubscriptions
+  /// request.
+  void onAnalysisOutline(AnalysisOutlineParams params) {}
+
+  /// Reports the overriding members in a file.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "OVERRIDES" in
+  /// the list of services passed in an analysis.setSubscriptions
+  /// request.
+  void onAnalysisOverrides(AnalysisOverridesParams params) {}
+
+  /// Reports the completion suggestions that should be presented
+  /// to the user. The set of suggestions included in the
+  /// notification is always a complete list that supersedes any
+  /// previously reported suggestions.
+  void onCompletionResults(CompletionResultsParams params) {}
+
+  /// Reports information needed to allow a single file to be launched.
+  ///
+  /// This notification is not subscribed to by default. Clients can
+  /// subscribe by including the value "LAUNCH_DATA" in the list of services
+  /// passed in an execution.setSubscriptions request.
+  void onExecutionLaunchData(ExecutionLaunchDataParams params) {}
+
+  /// Reports the Flutter outline associated with a single file.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "OUTLINE" in
+  /// the list of services passed in an flutter.setSubscriptions
+  /// request.
+  void onFlutterOutline(FlutterOutlineParams params) {}
+
+  /// Reports some or all of the results of performing a requested
+  /// search. Unlike other notifications, this notification
+  /// contains search results that should be added to any
+  /// previously received search results associated with the same
+  /// search id.
+  void onSearchResults(SearchResultsParams params) {}
+
+  /// Reports that the server is running. This notification is
+  /// issued once after the server has started running but before
+  /// any requests are processed to let the client know that it
+  /// started correctly.
+  ///
+  /// It is not possible to subscribe to or unsubscribe from this
+  /// notification.
+  void onServerConnected(ServerConnectedParams params) {}
+
+  /// Reports that an unexpected error has occurred while
+  /// executing the server. This notification is not used for
+  /// problems with specific requests (which are returned as part
+  /// of the response) but is used for exceptions that occur while
+  /// performing other tasks, such as analysis or preparing
+  /// notifications.
+  ///
+  /// It is not possible to subscribe to or unsubscribe from this
+  /// notification.
+  void onServerError(ServerErrorParams params) {}
+
+  /// Reports the current status of the server. Parameters are
+  /// omitted if there has been no change in the status
+  /// represented by that parameter.
+  ///
+  /// This notification is not subscribed to by default. Clients
+  /// can subscribe by including the value "STATUS" in
+  /// the list of services passed in a server.setSubscriptions
+  /// request.
+  void onServerStatus(ServerStatusParams params) {}
+
+  /// Reports a notification that is not processed
+  /// by any other notification handlers.
+  void onUnknownNotification(String event, params) {}
+}
diff --git a/pkg/analysis_server_client/lib/listener/server_listener.dart b/pkg/analysis_server_client/lib/listener/server_listener.dart
new file mode 100644
index 0000000..3f1b074
--- /dev/null
+++ b/pkg/analysis_server_client/lib/listener/server_listener.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Instances of the class [ServerListener] receive information from [Server]
+/// about interactions with the server.
+///
+/// Clients may mix-in this class, but may not implement it.
+mixin ServerListener {
+  /// Called when the [Server] could not decode a message.
+  void badMessage(String trimmedLine, exception) {
+    log('JSON decode failure', '$exception');
+  }
+
+  /// Called when the [Server] receives a line on stderr.
+  void errorMessage(String line) {
+    log('ERR:', line);
+  }
+
+  /// Called when the [Server] is terminating the server process
+  /// rather than requesting that the server stop itself.
+  void killingServerProcess(String reason) {
+    log('FORCIBLY TERMINATING SERVER: ', reason);
+  }
+
+  /// Log a message about interaction with the server.
+  void log(String prefix, String details);
+
+  /// Called when the [Server] received a response or notification.
+  void messageReceived(String json) {
+    log('<== ', json);
+  }
+
+  /// Called when the [Server] sends a request.
+  void requestSent(String json) {
+    log('==> ', json);
+  }
+
+  /// Called when the [Server] starts the server process.
+  void startingServer(String dartBinary, List<String> arguments) {
+    log('Starting analysis server:', '$dartBinary ${arguments.join(' ')}');
+  }
+
+  /// Called when the [Server] receives an unexpected message
+  /// which is not a notification or response.
+  void unexpectedMessage(Map<String, dynamic> message) {
+    log('Unexpected message from server:', '$message');
+  }
+
+  /// Called when the [Server] recieved an unexpected response
+  /// where the [id] does not match the [id] of an outstanding request.
+  void unexpectedResponse(Map<String, dynamic> message, id) {
+    log('Unexpected response from server', 'id=$id');
+  }
+
+  /// Called when the server process unexpectedly exits
+  /// with a non-zero exit code.
+  void unexpectedStop(int exitCode) {
+    log('Server terminated with exit code', '$exitCode');
+  }
+}
diff --git a/pkg/analysis_server_client/lib/server.dart b/pkg/analysis_server_client/lib/server.dart
new file mode 100644
index 0000000..32b0c04
--- /dev/null
+++ b/pkg/analysis_server_client/lib/server.dart
@@ -0,0 +1,278 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:analysis_server_client/listener/server_listener.dart';
+import 'package:analysis_server_client/protocol.dart';
+import 'package:path/path.dart';
+
+/// Type of callbacks used to process notifications.
+typedef void NotificationProcessor(Notification notification);
+
+/// Instances of the class [Server] manage a server process,
+/// and facilitate communication to and from the server.
+///
+/// Clients may not extend, implement or mix-in this class.
+class Server {
+  /// If not `null`, [_listener] will be sent information
+  /// about interactions with the server.
+  ServerListener _listener;
+
+  /// Server process object, or `null` if server hasn't been started yet
+  /// or if the server has already been stopped.
+  Process _process;
+
+  /// Commands that have been sent to the server but not yet acknowledged,
+  /// and the [Completer] objects which should be completed
+  /// when acknowledgement is received.
+  final _pendingCommands = <String, Completer<Map<String, dynamic>>>{};
+
+  /// Number which should be used to compute the 'id'
+  /// to send in the next command sent to the server.
+  int _nextId = 0;
+
+  /// The stderr subscription or `null` if either
+  /// [listenToOutput] has not been called or [stop] has been called.
+  StreamSubscription<String> _stderrSubscription;
+
+  /// The stdout subscription or `null` if either
+  /// [listenToOutput] has not been called or [stop] has been called.
+  StreamSubscription<String> _stdoutSubscription;
+
+  Server({ServerListener listener, Process process})
+      : this._listener = listener,
+        this._process = process;
+
+  /// Force kill the server. Returns exit code future.
+  Future<int> kill({String reason = 'none'}) {
+    _listener?.killingServerProcess(reason);
+    final process = _process;
+    _process = null;
+    process.kill();
+    return process.exitCode;
+  }
+
+  /// Start listening to output from the server,
+  /// and deliver notifications to [notificationProcessor].
+  void listenToOutput({NotificationProcessor notificationProcessor}) {
+    _stdoutSubscription = _process.stdout
+        .transform(utf8.decoder)
+        .transform(new LineSplitter())
+        .listen((String line) {
+      String trimmedLine = line.trim();
+
+      // Guard against lines like:
+      //   {"event":"server.connected","params":{...}}Observatory listening on ...
+      const observatoryMessage = 'Observatory listening on ';
+      if (trimmedLine.contains(observatoryMessage)) {
+        trimmedLine = trimmedLine
+            .substring(0, trimmedLine.indexOf(observatoryMessage))
+            .trim();
+      }
+      if (trimmedLine.isEmpty) {
+        return;
+      }
+
+      _listener?.messageReceived(trimmedLine);
+      Map<String, dynamic> message;
+      try {
+        message = json.decoder.convert(trimmedLine);
+      } catch (exception) {
+        _listener?.badMessage(trimmedLine, exception);
+        return;
+      }
+
+      final id = message[Response.ID];
+      if (id != null) {
+        // Handle response
+        final completer = _pendingCommands.remove(id);
+        if (completer == null) {
+          _listener?.unexpectedResponse(message, id);
+        }
+        if (message.containsKey(Response.ERROR)) {
+          completer.completeError(new RequestError.fromJson(
+              new ResponseDecoder(null), '.error', message[Response.ERROR]));
+        } else {
+          completer.complete(message[Response.RESULT]);
+        }
+      } else {
+        // Handle notification
+        final String event = message[Notification.EVENT];
+        if (event != null) {
+          if (notificationProcessor != null) {
+            notificationProcessor(
+                new Notification(event, message[Notification.PARAMS]));
+          }
+        } else {
+          _listener?.unexpectedMessage(message);
+        }
+      }
+    });
+    _stderrSubscription = _process.stderr
+        .transform(utf8.decoder)
+        .transform(new LineSplitter())
+        .listen((String line) {
+      String trimmedLine = line.trim();
+      _listener?.errorMessage(trimmedLine);
+    });
+  }
+
+  /// Send a command to the server. An 'id' will be automatically assigned.
+  /// The returned [Future] will be completed when the server acknowledges
+  /// the command with a response.
+  /// If the server acknowledges the command with a normal (non-error) response,
+  /// the future will be completed with the 'result' field from the response.
+  /// If the server acknowledges the command with an error response,
+  /// the future will be completed with an error.
+  Future<Map<String, dynamic>> send(
+      String method, Map<String, dynamic> params) {
+    String id = '${_nextId++}';
+    Map<String, dynamic> command = <String, dynamic>{
+      Request.ID: id,
+      Request.METHOD: method
+    };
+    if (params != null) {
+      command[Request.PARAMS] = params;
+    }
+    final completer = new Completer<Map<String, dynamic>>();
+    _pendingCommands[id] = completer;
+    String line = json.encode(command);
+    _listener?.requestSent(line);
+    _process.stdin.add(utf8.encoder.convert("$line\n"));
+    return completer.future;
+  }
+
+  /// Start the server.
+  ///
+  /// If [profileServer] is `true`, the server will be started
+  /// with "--observe" and "--pause-isolates-on-exit", allowing the observatory
+  /// to be used.
+  ///
+  /// If [serverPath] is specified, then that analysis server will be launched,
+  /// otherwise the analysis server snapshot in the SDK will be launched.
+  Future start({
+    String clientId,
+    String clientVersion,
+    int diagnosticPort,
+    String instrumentationLogFile,
+    bool profileServer: false,
+    String sdkPath,
+    String serverPath,
+    int servicesPort,
+    bool suppressAnalytics: true,
+    bool useAnalysisHighlight2: false,
+  }) async {
+    if (_process != null) {
+      throw new Exception('Process already started');
+    }
+    String dartBinary = Platform.executable;
+
+    // The integration tests run 3x faster when run from snapshots
+    // (you need to run test.py with --use-sdk).
+    if (serverPath == null) {
+      // Look for snapshots/analysis_server.dart.snapshot.
+      serverPath = normalize(join(dirname(Platform.resolvedExecutable),
+          'snapshots', 'analysis_server.dart.snapshot'));
+
+      if (!FileSystemEntity.isFileSync(serverPath)) {
+        // Look for dart-sdk/bin/snapshots/analysis_server.dart.snapshot.
+        serverPath = normalize(join(dirname(Platform.resolvedExecutable),
+            'dart-sdk', 'bin', 'snapshots', 'analysis_server.dart.snapshot'));
+      }
+    }
+
+    List<String> arguments = [];
+    //
+    // Add VM arguments.
+    //
+    if (profileServer) {
+      if (servicesPort == null) {
+        arguments.add('--observe');
+      } else {
+        arguments.add('--observe=$servicesPort');
+      }
+      arguments.add('--pause-isolates-on-exit');
+    } else if (servicesPort != null) {
+      arguments.add('--enable-vm-service=$servicesPort');
+    }
+    if (Platform.packageConfig != null) {
+      arguments.add('--packages=${Platform.packageConfig}');
+    }
+    //
+    // Add the server executable.
+    //
+    arguments.add(serverPath);
+    //
+    // Add server arguments.
+    //
+    // TODO(danrubel): Consider moving all cmdline argument consts
+    // out of analysis_server and into analysis_server_client
+    if (clientId != null) {
+      arguments.add('--client-id');
+      arguments.add(clientId);
+    }
+    if (clientVersion != null) {
+      arguments.add('--client-version');
+      arguments.add(clientVersion);
+    }
+    if (suppressAnalytics) {
+      arguments.add('--suppress-analytics');
+    }
+    if (diagnosticPort != null) {
+      arguments.add('--port');
+      arguments.add(diagnosticPort.toString());
+    }
+    if (instrumentationLogFile != null) {
+      arguments.add('--instrumentation-log-file=$instrumentationLogFile');
+    }
+    if (sdkPath != null) {
+      arguments.add('--sdk=$sdkPath');
+    }
+    if (useAnalysisHighlight2) {
+      arguments.add('--useAnalysisHighlight2');
+    }
+    _listener?.startingServer(dartBinary, arguments);
+    _process = await Process.start(dartBinary, arguments);
+    _process.exitCode.then((int code) {
+      if (code != 0 && _process != null) {
+        // Report an error if server abruptly terminated
+        _listener?.unexpectedStop(code);
+      }
+    });
+  }
+
+  /// Attempt to gracefully shutdown the server.
+  /// If that fails, then kill the process.
+  Future<int> stop({Duration timeLimit}) async {
+    timeLimit ??= const Duration(seconds: 5);
+    if (_process == null) {
+      // Process already exited
+      return -1;
+    }
+    final future = send(SERVER_REQUEST_SHUTDOWN, null);
+    final process = _process;
+    _process = null;
+    await future
+        // fall through to wait for exit
+        .timeout(timeLimit, onTimeout: () {
+      return null;
+    }).whenComplete(() async {
+      await _stderrSubscription?.cancel();
+      _stderrSubscription = null;
+      await _stdoutSubscription?.cancel();
+      _stdoutSubscription = null;
+    });
+    return process.exitCode.timeout(
+      timeLimit,
+      onTimeout: () {
+        _listener?.killingServerProcess('server failed to exit');
+        process.kill();
+        return process.exitCode;
+      },
+    );
+  }
+}
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_base.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_base.dart
index 040972f..320bc4d 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_base.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_base.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
index 1280460..fd21adb 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_constants.dart
@@ -6,6 +6,8 @@
 // To regenerate the file, use the script
 // "pkg/analysis_server/tool/spec/generate_files".
 
+const String PROTOCOL_VERSION = '1.22.1';
+
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
 const String ANALYSIS_NOTIFICATION_CLOSING_LABELS = 'analysis.closingLabels';
@@ -70,7 +72,6 @@
 const String ANALYSIS_REQUEST_GET_SIGNATURE_FILE = 'file';
 const String ANALYSIS_REQUEST_GET_SIGNATURE_OFFSET = 'offset';
 const String ANALYSIS_REQUEST_REANALYZE = 'analysis.reanalyze';
-const String ANALYSIS_REQUEST_REANALYZE_ROOTS = 'roots';
 const String ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
 const String ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS_EXCLUDED = 'excluded';
 const String ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS_INCLUDED = 'included';
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
index 9fabb4c..bea5464 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -3495,83 +3495,28 @@
 /**
  * analysis.reanalyze params
  *
- * {
- *   "roots": optional List<FilePath>
- * }
- *
  * Clients may not extend, implement or mix-in this class.
  */
 class AnalysisReanalyzeParams implements RequestParams {
-  List<String> _roots;
-
-  /**
-   * A list of the analysis roots that are to be re-analyzed.
-   */
-  List<String> get roots => _roots;
-
-  /**
-   * A list of the analysis roots that are to be re-analyzed.
-   */
-  void set roots(List<String> value) {
-    this._roots = value;
-  }
-
-  AnalysisReanalyzeParams({List<String> roots}) {
-    this.roots = roots;
-  }
-
-  factory AnalysisReanalyzeParams.fromJson(
-      JsonDecoder jsonDecoder, String jsonPath, Object json) {
-    if (json == null) {
-      json = {};
-    }
-    if (json is Map) {
-      List<String> roots;
-      if (json.containsKey("roots")) {
-        roots = jsonDecoder.decodeList(
-            jsonPath + ".roots", json["roots"], jsonDecoder.decodeString);
-      }
-      return new AnalysisReanalyzeParams(roots: roots);
-    } else {
-      throw jsonDecoder.mismatch(jsonPath, "analysis.reanalyze params", json);
-    }
-  }
-
-  factory AnalysisReanalyzeParams.fromRequest(Request request) {
-    return new AnalysisReanalyzeParams.fromJson(
-        new RequestDecoder(request), "params", request.params);
-  }
-
   @override
-  Map<String, dynamic> toJson() {
-    Map<String, dynamic> result = {};
-    if (roots != null) {
-      result["roots"] = roots;
-    }
-    return result;
-  }
+  Map<String, dynamic> toJson() => <String, dynamic>{};
 
   @override
   Request toRequest(String id) {
-    return new Request(id, "analysis.reanalyze", toJson());
+    return new Request(id, "analysis.reanalyze", null);
   }
 
   @override
-  String toString() => json.encode(toJson());
-
-  @override
   bool operator ==(other) {
     if (other is AnalysisReanalyzeParams) {
-      return listEqual(roots, other.roots, (String a, String b) => a == b);
+      return true;
     }
     return false;
   }
 
   @override
   int get hashCode {
-    int hash = 0;
-    hash = JenkinsSmiHash.combine(hash, roots.hashCode);
-    return JenkinsSmiHash.finish(hash);
+    return 613039876;
   }
 }
 
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_internal.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_internal.dart
index 95d5663..c95e384 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_internal.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_util.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_util.dart
index dab28db..bdce37f 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_util.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_util.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analysis_server_client/pubspec.yaml b/pkg/analysis_server_client/pubspec.yaml
index 51661db..9632e84 100644
--- a/pkg/analysis_server_client/pubspec.yaml
+++ b/pkg/analysis_server_client/pubspec.yaml
@@ -1,12 +1,15 @@
 name: analysis_server_client
-version: 1.0.1
+version: 1.1.1
 author: Dart Team <misc@dartlang.org>
 description:
-  A client wrapper over analysis_server. Instances of this client
-  manage a connection to the analysis_server process and
-  facilitates communication to and from the server.
-homepage: http://github.com/dart-lang/sdk/pkg/analysis_server_client
+  A client wrapper over analysis_server.
+  Instances of the class [Server] manage a connection to a server process,
+  and facilitate communication to and from the server.
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analysis_server_client
+environment:
+  sdk: '>=2.1.0-dev.9.0 <3.0.0'
+dependencies:
+  path: ^1.6.2
+  pub_semver: ^1.4.2
 dev_dependencies:
   test: ^1.3.4
-environment:
-  sdk: ">=1.0.0 < 2.0.0-dev.infinity"
diff --git a/pkg/analysis_server_client/test/all.dart b/pkg/analysis_server_client/test/all.dart
new file mode 100644
index 0000000..ceede33
--- /dev/null
+++ b/pkg/analysis_server_client/test/all.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'live_test.dart' as live_test;
+import 'server_test.dart' as server_test;
+
+main() {
+  server_test.main();
+  live_test.main();
+}
diff --git a/pkg/analysis_server_client/test/analysis_server_client_test.dart b/pkg/analysis_server_client/test/analysis_server_client_test.dart
deleted file mode 100644
index c07ea61..0000000
--- a/pkg/analysis_server_client/test/analysis_server_client_test.dart
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:analysis_server_client/analysis_server_client.dart';
-import 'package:test/test.dart';
-
-void main() {
-  MockProcess process;
-  AnalysisServerClient serverWrapper;
-
-  setUp(() async {
-    process = new MockProcess();
-    serverWrapper = new AnalysisServerClient(process);
-  });
-
-  test('test_listenToOutput_good', () async {
-    process.stdout = _goodMessage();
-
-    final future = serverWrapper.send('blahMethod', null);
-    serverWrapper.listenToOutput();
-
-    final response = await future;
-    expect(response, const TypeMatcher<Map>());
-    final responseAsMap = response as Map;
-    expect(responseAsMap['foo'], 'bar');
-  });
-
-  test('test_listenToOutput_error', () async {
-    process.stdout = _badMessage();
-    final future = serverWrapper.send('blahMethod', null);
-    future.catchError((e) {
-      expect(e, const TypeMatcher<ServerErrorMessage>());
-      final e2 = e as ServerErrorMessage;
-      expect(e2.code, 'someErrorCode');
-      expect(e2.message, 'something went wrong');
-      expect(e2.stackTrace, 'some long stack trace');
-    });
-    serverWrapper.listenToOutput();
-  });
-
-  test('test_listenToOutput_event', () async {
-    process.stdout = _eventMessage();
-
-    void eventHandler(String event, Map<String, Object> params) {
-      expect(event, 'fooEvent');
-      expect(params.length, 2);
-      expect(params['foo'] as String, 'bar');
-      expect(params['baz'] as String, 'bang');
-    }
-
-    serverWrapper.send('blahMethod', null);
-    serverWrapper.listenToOutput(notificationProcessor: eventHandler);
-  });
-}
-
-final _badErrorMessage = {
-  'code': 'someErrorCode',
-  'message': 'something went wrong',
-  'stackTrace': 'some long stack trace'
-};
-
-Stream<List<int>> _badMessage() async* {
-  yield utf8.encoder.convert('Observatory listening on foo bar\n');
-  final sampleJson = {'id': '0', 'error': _badErrorMessage};
-  yield utf8.encoder.convert(json.encode(sampleJson));
-}
-
-Stream<List<int>> _eventMessage() async* {
-  yield utf8.encoder.convert('Observatory listening on foo bar\n');
-  final sampleJson = {
-    'event': 'fooEvent',
-    'params': {'foo': 'bar', 'baz': 'bang'}
-  };
-  yield utf8.encoder.convert(json.encode(sampleJson));
-}
-
-Stream<List<int>> _goodMessage() async* {
-  yield utf8.encoder.convert('Observatory listening on foo bar\n');
-  final sampleJson = {
-    'id': '0',
-    'result': {'foo': 'bar'}
-  };
-  yield utf8.encoder.convert(json.encode(sampleJson));
-}
-
-class MockProcess implements Process {
-  @override
-  Stream<List<int>> stderr;
-
-  @override
-  IOSink stdin = new MockStdin();
-
-  @override
-  Stream<List<int>> stdout;
-
-  @override
-  Future<int> get exitCode => null;
-
-  @override
-  int get pid => null;
-
-  @override
-  bool kill([ProcessSignal signal = ProcessSignal.sigterm]) => null;
-}
-
-class MockStdin implements IOSink {
-  @override
-  Encoding encoding;
-
-  @override
-  Future get done => null;
-
-  @override
-  void add(List<int> data) {}
-
-  @override
-  void addError(Object error, [StackTrace stackTrace]) {}
-
-  @override
-  Future addStream(Stream<List<int>> stream) => null;
-
-  @override
-  Future close() => null;
-
-  @override
-  Future flush() => null;
-
-  @override
-  void write(Object obj) {}
-
-  @override
-  void writeAll(Iterable objects, [String separator = ""]) {}
-
-  @override
-  void writeCharCode(int charCode) {}
-
-  @override
-  void writeln([Object obj = ""]) {}
-}
diff --git a/pkg/analysis_server_client/test/live_test.dart b/pkg/analysis_server_client/test/live_test.dart
new file mode 100644
index 0000000..5d73c8d
--- /dev/null
+++ b/pkg/analysis_server_client/test/live_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server_client/listener/server_listener.dart';
+import 'package:analysis_server_client/handler/notification_handler.dart';
+import 'package:analysis_server_client/handler/connection_handler.dart';
+import 'package:analysis_server_client/protocol.dart';
+import 'package:analysis_server_client/server.dart';
+import 'package:test/test.dart';
+
+const _debug = false;
+
+void main() {
+  test('live', () async {
+    final server = new Server(listener: _debug ? new TestListener() : null);
+    await server.start(clientId: 'test', suppressAnalytics: true);
+
+    TestHandler handler = new TestHandler(server);
+    server.listenToOutput(notificationProcessor: handler.handleEvent);
+    if (!await handler.serverConnected(
+        timeLimit: const Duration(seconds: 15))) {
+      fail('failed to connect to server');
+    }
+
+    Map<String, dynamic> json = await server.send(
+        SERVER_REQUEST_GET_VERSION, new ServerGetVersionParams().toJson());
+    final result = ServerGetVersionResult.fromJson(
+        new ResponseDecoder(null), 'result', json);
+    await server.stop();
+
+    expect(result.version, isNotEmpty);
+  });
+}
+
+class TestHandler with NotificationHandler, ConnectionHandler {
+  final Server server;
+
+  TestHandler(this.server);
+}
+
+class TestListener with ServerListener {
+  @override
+  void log(String prefix, String details) {
+    print('$prefix $details');
+  }
+}
diff --git a/pkg/analysis_server_client/test/server_test.dart b/pkg/analysis_server_client/test/server_test.dart
new file mode 100644
index 0000000..9f3d643
--- /dev/null
+++ b/pkg/analysis_server_client/test/server_test.dart
@@ -0,0 +1,208 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:analysis_server_client/server.dart';
+import 'package:analysis_server_client/protocol.dart';
+import 'package:test/test.dart';
+
+void main() {
+  MockProcess process;
+  Server server;
+
+  setUp(() async {
+    process = new MockProcess();
+    server = new Server(process: process);
+  });
+
+  group('listenToOutput', () {
+    test('good', () async {
+      process.stdout = _goodMessage();
+      process.stderr = _noMessage();
+
+      final future = server.send('blahMethod', null);
+      server.listenToOutput();
+
+      final response = await future;
+      expect(response['foo'], 'bar');
+    });
+
+    test('error', () async {
+      process.stdout = _badMessage();
+      process.stderr = _noMessage();
+
+      final future = server.send('blahMethod', null);
+      future.catchError((e) {
+        expect(e, const TypeMatcher<RequestError>());
+        final error = e as RequestError;
+        expect(error.code, RequestErrorCode.UNKNOWN_REQUEST);
+        expect(error.message, 'something went wrong');
+        expect(error.stackTrace, 'some long stack trace');
+      });
+      server.listenToOutput();
+    });
+
+    test('event', () async {
+      process.stdout = _eventMessage();
+      process.stderr = _noMessage();
+
+      final completer = new Completer();
+      void eventHandler(Notification notification) {
+        expect(notification.event, 'fooEvent');
+        expect(notification.params.length, 2);
+        expect(notification.params['foo'] as String, 'bar');
+        expect(notification.params['baz'] as String, 'bang');
+        completer.complete();
+      }
+
+      server.send('blahMethod', null);
+      server.listenToOutput(notificationProcessor: eventHandler);
+      await completer.future;
+    });
+  });
+
+  group('stop', () {
+    test('ok', () async {
+      final mockout = new StreamController<List<int>>();
+      process.stdout = mockout.stream;
+      process.stderr = _noMessage();
+      process.mockin.controller.stream.first.then((_) {
+        String encoded = json.encode({'id': '0'});
+        mockout.add(utf8.encoder.convert('$encoded\n'));
+      });
+      process.exitCode = new Future.value(0);
+
+      server.listenToOutput();
+      await server.stop(timeLimit: const Duration(milliseconds: 1));
+      expect(process.killed, isFalse);
+    });
+    test('stopped', () async {
+      final mockout = new StreamController<List<int>>();
+      process.stdout = mockout.stream;
+      process.stderr = _noMessage();
+      process.exitCode = new Future.value(0);
+
+      server.listenToOutput();
+      await server.stop(timeLimit: const Duration(milliseconds: 1));
+      expect(process.killed, isFalse);
+    });
+    test('kill', () async {
+      final mockout = new StreamController<List<int>>();
+      process.stdout = mockout.stream;
+      process.stderr = _noMessage();
+      process.exitCode = new Future.delayed(const Duration(seconds: 1));
+
+      server.listenToOutput();
+      await server.stop(timeLimit: const Duration(milliseconds: 10));
+      expect(process.killed, isTrue);
+    });
+  });
+}
+
+final _badErrorMessage = {
+  'code': 'UNKNOWN_REQUEST',
+  'message': 'something went wrong',
+  'stackTrace': 'some long stack trace'
+};
+
+Stream<List<int>> _badMessage() async* {
+  yield utf8.encoder.convert('Observatory listening on foo bar\n');
+  final sampleJson = {
+    'id': '0',
+    'error': _badErrorMessage,
+  };
+  yield utf8.encoder.convert(json.encode(sampleJson));
+}
+
+Stream<List<int>> _eventMessage() async* {
+  yield utf8.encoder.convert('Observatory listening on foo bar\n');
+  final sampleJson = {
+    'event': 'fooEvent',
+    'params': {'foo': 'bar', 'baz': 'bang'}
+  };
+  yield utf8.encoder.convert(json.encode(sampleJson));
+}
+
+Stream<List<int>> _goodMessage() async* {
+  yield utf8.encoder.convert('Observatory listening on foo bar\n');
+  final sampleJson = {
+    'id': '0',
+    'result': {'foo': 'bar'}
+  };
+  yield utf8.encoder.convert(json.encode(sampleJson));
+}
+
+Stream<List<int>> _noMessage() async* {
+  yield utf8.encoder.convert('');
+}
+
+class MockProcess implements Process {
+  MockStdin mockin = new MockStdin();
+
+  bool killed = false;
+
+  @override
+  Stream<List<int>> stderr;
+
+  @override
+  IOSink get stdin => mockin;
+
+  @override
+  Stream<List<int>> stdout;
+
+  @override
+  Future<int> exitCode;
+
+  @override
+  int get pid => null;
+
+  @override
+  bool kill([ProcessSignal signal = ProcessSignal.sigterm]) {
+    bool wasKilled = killed;
+    killed = true;
+    return !wasKilled;
+  }
+}
+
+class MockStdin implements IOSink {
+  final controller = new StreamController<String>();
+
+  @override
+  Encoding encoding;
+
+  @override
+  Future get done => null;
+
+  @override
+  void add(List<int> data) {
+    controller.add(utf8.decode(data));
+  }
+
+  @override
+  void addError(Object error, [StackTrace stackTrace]) {}
+
+  @override
+  Future addStream(Stream<List<int>> stream) => null;
+
+  @override
+  Future close() => null;
+
+  @override
+  Future flush() => null;
+
+  @override
+  void write(Object obj) {}
+
+  @override
+  void writeAll(Iterable objects, [String separator = ""]) {}
+
+  @override
+  void writeCharCode(int charCode) {}
+
+  @override
+  void writeln([Object obj = ""]) {}
+}
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index f93cc02..5a574ca 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,79 @@
+## 0.34.2
+* Removed support for the `@checked` annotation.  Please use the `covariant`
+  keyword instead.
+
+## 0.34.1
+* Added logic to report a hint if a deprecated lint is specified in the user's
+  analysis_options.yaml file, or if a lint is specified twice.
+* Added a note to the `UriResolver` documentation alerting clients of an
+  upcoming breaking change.
+* Improved parser recovery.
+* Speculative work on fine-grained dependency tracking (not yet enabled).
+* Initial support for new language features set_literals and
+  constant_update_2018.
+* Early speculative work on non-nullable types.
+* Added AnalysisDriver.resetUriResolution().
+* Deprecated TypeSystem.isStrong.
+* Added WorkspacePackage classes, for determining whether two files are in the
+  "same package."
+* Added a public API for the TypeSystem class.
+* Bug fixes: #33946, #35151, #35223, #35241, #35438.
+
+## 0.34.0
+* Support for `declarations-casts` has been removed and the `implicit-casts`
+  option now has the combined semantics of both options. This means that users
+  that disable `implicit-casts` might now see errors that were not previously
+  being reported.
+* Minor changes to the AnalysisSession and AnalysisDriver APIs to make it easier
+  for clients to transition away from using the task model.
+* Minor changes to the linter API to make it easier for lint rules to define
+  their own lint codes.
+* Add a version of getAncestor that matches by type without a closure.
+* Add an AST structure for set literals.
+* Bug fixes: #35162, #35230, #34733, #34741, #33553, #35090, #32815, #34387,
+  #34495, #35043, #33553, #34906, #34489.
+
+## 0.33.6+1
+* Added a note to the `UriResolver` documentation alerting clients of an
+  upcoming breaking change.
+
+## 0.33.6
+* Deprecated `AstNode.getAncestor` and introduced
+  `AstNode.thisOrAncestorMatching` as its replacement.
+
+## 0.33.5
+* Add AnalysisSession.getResolvedLibrary()/ByElement() APIs.
+
+## 0.33.4
+* Add a hint when either Future or Stream are imported from dart:core in a package that is expected to work with an SDK before 2.1 where they were required to be imported from dart:async.
+* Add a new "deprecated" maturity for lints
+* Don't report DEPRECATED_MEMBER_USE for deprecated mixins, top-level variables, and class fields.
+* Various bug fixes.
+
+## 0.33.3+2
+* Update SDK requirement to 2.1.0-dev.5.0.  From now on, the analyzer may import
+  Future from dart:core. (#35158)
+
+## 0.33.3+1
+* Fix missing import of dart:async. (#35158)
+
+## 0.33.3
+* Backport Parsed/ResolvedLibraryResultImpl and ElementDeclarationResult.
+
+## 0.33.2
+* Protect against self-referencing classes in InheritanceManager2. (#34333)
+* Introduce API so that the linter can be migrated away from Element.context.
+
+## 0.33.1
+* Fix circular typedef stack overflow. (#33599)
+* Check that the implemented member is a valid override of the member from
+  the super constraint. (#34693)
+* Begin replacing InheritanceManager with InheritanceManager2 and
+  deprecate older members.
+* Performance fixups with Analysis Driver.
+* Verify the superconstraint signature invoked by a mixin. (#34896)
+* In_matchInterfaceSubtypeOf, account for mixins having null. (#34907)
+
 ## 0.33.0
 * Support handling 'class C with M', with extends missing.
 * Report ABSTRACT_SUPER_MEMBER_REFERENCE as an error.
diff --git a/pkg/analyzer/README.md b/pkg/analyzer/README.md
index 0b2f682..d633684 100644
--- a/pkg/analyzer/README.md
+++ b/pkg/analyzer/README.md
@@ -4,7 +4,7 @@
 of Dart code. It is useful for tool
 integration and embedding.
 
-End-users should use the [dartanalyzer][analyzercli] command-line tool
+End-users should use the [dartanalyzer][] command-line tool
 to analyze their Dart code.
 
 Integrators that want to add Dart support to their editor
@@ -96,9 +96,9 @@
 See the [LICENSE] file.
 
 [serverapi]: https://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/doc/api.html
-[analyzercli]: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_cli
+[dartanalyzer]: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_cli#dartanalyzer
 [list]: https://groups.google.com/a/dartlang.org/forum/#!forum/analyzer-discuss
-[lintrules]: http://dart-lang.github.io/linter/lints/
+[lintrules]: https://dart-lang.github.io/linter/lints/
 [glob]: https://pub.dartlang.org/packages/glob
 [LICENSE]: https://github.com/dart-lang/sdk/blob/master/pkg/analyzer/LICENSE
 [dartfmt]: https://github.com/dart-lang/dart_style
diff --git a/pkg/analyzer/benchmark/errors_in_all_libraries.dart b/pkg/analyzer/benchmark/errors_in_all_libraries.dart
deleted file mode 100644
index e2540fb..0000000
--- a/pkg/analyzer/benchmark/errors_in_all_libraries.dart
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// Resolves this library and everything it transitively imports and generates
-/// errors in all of those libraries. Does this in an infinite loop, starting
-/// from scratch each time, to show how VM warm-up affects things and to make
-/// it easier to connect to this with observatory.
-import 'dart:io';
-
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/context/builder.dart';
-import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/source/source_resource.dart';
-import 'package:path/path.dart' as p;
-
-void main(List<String> args) {
-  // Assumes you have run "pub get" in the analyzer directory itself and uses
-  // that "packages" directory as its package root.
-  var packageRoot =
-      p.normalize(p.join(p.dirname(p.fromUri(Platform.script)), "packages"));
-
-  var best = new Duration(days: 1);
-  while (true) {
-    var start = new DateTime.now();
-    AnalysisEngine.instance.clearCaches();
-
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongModeHints = true;
-
-    PhysicalResourceProvider resourceProvider =
-        PhysicalResourceProvider.INSTANCE;
-    FolderBasedDartSdk sdk = new FolderBasedDartSdk(
-        resourceProvider, resourceProvider.getFolder(args[0]));
-    sdk.analysisOptions = options;
-
-    ContextBuilder builder = new ContextBuilder(resourceProvider, null, null);
-    AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
-    context.sourceFactory = new SourceFactory([
-      new DartUriResolver(sdk),
-      new ResourceUriResolver(resourceProvider),
-      new PackageMapUriResolver(resourceProvider,
-          builder.convertPackagesToMap(builder.createPackageMap(packageRoot)))
-    ]);
-    context.analysisOptions = options;
-
-    var mainSource =
-        new FileSource(resourceProvider.getFile(p.fromUri(Platform.script)));
-    context.applyChanges(new ChangeSet()..addedSource(mainSource));
-
-    var initialLibrary =
-        context.resolveCompilationUnit2(mainSource, mainSource);
-
-    // Walk all of the transitively referenced libraries and compute errors.
-    var errorCount = 0;
-    var allLibraries = _reachableLibraries(
-        resolutionMap.elementDeclaredByCompilationUnit(initialLibrary).library);
-    for (var lib in allLibraries) {
-      for (var unit in lib.units) {
-        var source = unit.source;
-
-        // Skip core libraries.
-        if (source.uri.scheme == 'dart') continue;
-
-        var librarySource = context.getLibrariesContaining(source).single;
-        context.resolveCompilationUnit2(source, librarySource);
-        errorCount += context.computeErrors(source).length;
-      }
-    }
-
-    var elapsed = new DateTime.now().difference(start);
-    print("$elapsed : $errorCount errors ${elapsed < best ? "(best)" : ""}");
-    if (elapsed < best) best = elapsed;
-  }
-}
-
-/// Returns all libraries transitively imported or exported from [start].
-List<LibraryElement> _reachableLibraries(LibraryElement start) {
-  var results = <LibraryElement>[];
-  var seen = new Set();
-  void find(LibraryElement lib) {
-    if (seen.contains(lib)) return;
-    seen.add(lib);
-    results.add(lib);
-    lib.importedLibraries.forEach(find);
-    lib.exportedLibraries.forEach(find);
-  }
-
-  find(start);
-  return results;
-}
diff --git a/pkg/analyzer/example/parser_driver.dart b/pkg/analyzer/example/parser_driver.dart
deleted file mode 100644
index 6515b34..0000000
--- a/pkg/analyzer/example/parser_driver.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/dart/scanner/reader.dart';
-import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/generated/parser.dart';
-
-main(List<String> args) {
-  print('working dir ${new File('.').resolveSymbolicLinksSync()}');
-
-  if (args.length == 0) {
-    print('Usage: parser_driver [files_to_parse]');
-    exit(0);
-  }
-
-  for (var arg in args) {
-    _parse(new File(arg));
-  }
-}
-
-_parse(File file) {
-  var src = file.readAsStringSync();
-  PhysicalResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
-  var source = resourceProvider.getFile(file.path).createSource();
-  var errorListener = new _ErrorCollector();
-  var reader = new CharSequenceReader(src);
-  var scanner = new Scanner(source, reader, errorListener);
-  var token = scanner.tokenize();
-  var parser = new Parser(source, errorListener);
-  var unit = parser.parseCompilationUnit(token);
-
-  var visitor = new _ASTVisitor();
-  unit.accept(visitor);
-
-  for (var error in errorListener.errors) {
-    print(error);
-  }
-}
-
-class _ASTVisitor extends GeneralizingAstVisitor {
-  @override
-  visitNode(AstNode node) {
-    print('${node.runtimeType} : <"$node">');
-    return super.visitNode(node);
-  }
-}
-
-class _ErrorCollector extends AnalysisErrorListener {
-  List<AnalysisError> errors;
-  _ErrorCollector() : errors = new List<AnalysisError>();
-  @override
-  onError(error) => errors.add(error);
-}
diff --git a/pkg/analyzer/example/resolver_driver.dart b/pkg/analyzer/example/resolver_driver.dart
deleted file mode 100755
index 6c972a8..0000000
--- a/pkg/analyzer/example/resolver_driver.dart
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/context/builder.dart';
-import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/source/source_resource.dart';
-
-void main(List<String> args) {
-  print('working dir ${new File('.').resolveSymbolicLinksSync()}');
-
-  if (args.length < 2 || args.length > 3) {
-    print(_usage);
-    exit(0);
-  }
-
-  String packageRoot;
-  if (args.length == 3) {
-    packageRoot = args[2];
-  }
-
-  PhysicalResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
-  DartSdk sdk = new FolderBasedDartSdk(
-      resourceProvider, resourceProvider.getFolder(args[0]));
-
-  var resolvers = [
-    new DartUriResolver(sdk),
-    new ResourceUriResolver(resourceProvider)
-  ];
-
-  if (packageRoot != null) {
-    ContextBuilder builder = new ContextBuilder(resourceProvider, null, null);
-    resolvers.add(new PackageMapUriResolver(resourceProvider,
-        builder.convertPackagesToMap(builder.createPackageMap(packageRoot))));
-  }
-
-  AnalysisContext context = AnalysisEngine.instance.createAnalysisContext()
-    ..sourceFactory = new SourceFactory(resolvers);
-
-  Source source = new FileSource(resourceProvider.getFile(args[1]));
-  ChangeSet changeSet = new ChangeSet()..addedSource(source);
-  context.applyChanges(changeSet);
-  LibraryElement libElement = context.computeLibraryElement(source);
-  print("libElement: $libElement");
-
-  CompilationUnit resolvedUnit =
-      context.resolveCompilationUnit(source, libElement);
-  var visitor = new _ASTVisitor();
-  resolvedUnit.accept(visitor);
-}
-
-const _usage =
-    'Usage: resolve_driver <path_to_sdk> <file_to_resolve> [<packages_root>]';
-
-class _ASTVisitor extends GeneralizingAstVisitor {
-  @override
-  visitNode(AstNode node) {
-    var lines = <String>['${node.runtimeType} : <"$node">'];
-    if (node is SimpleIdentifier) {
-      Element element = node.staticElement;
-      if (element != null) {
-        lines.add('  element: ${element.runtimeType}');
-        LibraryElement library = element.library;
-        if (library != null) {
-          var fullName =
-              element.library.definingCompilationUnit.source.fullName;
-          lines.add("  from $fullName");
-        }
-      }
-    }
-    print(lines.join('\n'));
-    return super.visitNode(node);
-  }
-}
diff --git a/pkg/analyzer/example/scanner_driver.dart b/pkg/analyzer/example/scanner_driver.dart
deleted file mode 100644
index 22a4e0f..0000000
--- a/pkg/analyzer/example/scanner_driver.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/dart/scanner/reader.dart';
-import 'package:analyzer/src/dart/scanner/scanner.dart';
-
-main(List<String> args) {
-  print('working dir ${new File('.').resolveSymbolicLinksSync()}');
-
-  if (args.length == 0) {
-    print('Usage: scanner_driver [files_to_scan]');
-    exit(0);
-  }
-
-  for (var arg in args) {
-    _scan(new File(arg));
-  }
-}
-
-_scan(File file) {
-  var src = file.readAsStringSync();
-  PhysicalResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
-  var source = resourceProvider.getFile(file.path).createSource();
-  var reader = new CharSequenceReader(src);
-  var listener = new BooleanErrorListener();
-  var scanner = new Scanner(source, reader, listener);
-  var token = scanner.tokenize();
-  while (token.type != TokenType.EOF) {
-    print(token);
-    token = token.next;
-  }
-  if (listener.errorReported) {
-    print('Errors found.');
-    exit(1);
-  }
-}
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index ab46a8d..3516414 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -2,6 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+@deprecated
+library analyzer;
+
 import 'dart:io';
 
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analyzer/lib/dart/analysis/context_builder.dart b/pkg/analyzer/lib/dart/analysis/context_builder.dart
index 69ef376..f99dce5 100644
--- a/pkg/analyzer/lib/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/dart/analysis/context_builder.dart
@@ -30,13 +30,22 @@
    * the the variable names found in `fromEnvironment` invocations to the
    * constant value that will be returned. If none is given, then no variables
    * will be defined.
+   * 
+   * If a list of [librarySummaryPaths] is provided, then the summary files at
+   * those paths will be used, when possible, when analyzing the libraries
+   * contained in the summary files.
    *
    * If an [sdkPath] is provided, and if it is a valid path to a directory
    * containing a valid SDK, then the SDK in the referenced directory will be
    * used when analyzing the code in the context.
+   * 
+   * If an [sdkSummaryPath] is provided, then that file will be used as the
+   * summary file for the SDK.
    */
   AnalysisContext createContext(
       {@required ContextRoot contextRoot,
       DeclaredVariables declaredVariables,
-      String sdkPath});
+      List<String> librarySummaryPaths,
+      String sdkPath,
+      String sdkSummaryPath});
 }
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 635fe97..55defb7 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -9,162 +9,180 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 
-/**
- * The result of performing some kind of analysis on a single file. Every result
- * that implements this interface will also implement a sub-interface.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The result of performing some kind of analysis on a single file. Every
+/// result that implements this interface will also implement a sub-interface.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class AnalysisResult {
-  /**
-   * The absolute and normalized path of the file that was analyzed.
-   */
+  /// The absolute and normalized path of the file that was analyzed.
   String get path;
 
-  /**
-   * Return the session used to compute this result.
-   */
+  /// Return the session used to compute this result.
   AnalysisSession get session;
 
-  /**
-   * The state of the results.
-   */
+  /// The state of the results.
   ResultState get state;
 
-  /**
-   * The absolute URI of the file that was analyzed.
-   */
+  /// The absolute URI of the file that was analyzed.
   Uri get uri;
 }
 
-/**
- * An analysis result that includes the errors computed during analysis.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An analysis result that includes the errors computed during analysis.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class AnalysisResultWithErrors implements FileResult {
-  /**
-   * The analysis errors that were computed during analysis.
-   */
+  /// The analysis errors that were computed during analysis.
   List<AnalysisError> get errors;
 }
 
-/**
- * The result of computing all of the errors contained in a single file, both
- * syntactic and semantic.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The declaration of an [Element].
+abstract class ElementDeclarationResult {
+  /// The [Element] that this object describes.
+  Element get element;
+
+  /// The node that declares the [element]. Depending on whether it is returned
+  /// from [ResolvedLibraryResult] or [ParsedLibraryResult] it might be resolved
+  /// or just parsed.
+  AstNode get node;
+
+  /// If this declaration is returned from [ParsedLibraryResult], the parsed
+  /// unit that contains the [node]. Otherwise `null`.
+  ParsedUnitResult get parsedUnit;
+
+  /// If this declaration is returned from [ResolvedLibraryResult], the
+  /// resolved unit that contains the [node]. Otherwise `null`.
+  ResolvedUnitResult get resolvedUnit;
+}
+
+/// The result of computing all of the errors contained in a single file, both
+/// syntactic and semantic.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class ErrorsResult implements AnalysisResultWithErrors {}
 
-/**
- * The result of computing some cheap information for a single file, when full
- * parsed file is not required, so [ParseResult] is not necessary.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The result of computing some cheap information for a single file, when full
+/// parsed file is not required, so [ParsedUnitResult] is not necessary.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class FileResult implements AnalysisResult {
-  /**
-   * Whether the file is a part.
-   */
+  /// Whether the file is a part.
   bool get isPart;
 
-  /**
-   * Information about lines in the content.
-   */
+  /// Information about lines in the content.
   LineInfo get lineInfo;
 }
 
-/**
- * The result of parsing of a single file. The errors returned include only
- * those discovered during scanning and parsing.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The result of building parsed AST(s) for the whole library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ParsedLibraryResult implements AnalysisResult {
+  /// The parsed units of the library.
+  List<ParsedUnitResult> get units;
+
+  /// Return the declaration of the [element], or `null` if the [element]
+  /// is synthetic. Throw [ArgumentError] if the [element] is not defined in
+  /// this library.
+  ElementDeclarationResult getElementDeclaration(Element element);
+}
+
+/// The result of parsing of a single file. The errors returned include only
+/// those discovered during scanning and parsing.
+///
+/// Clients may not extend, implement or mix-in this class.
+// ignore: deprecated_member_use
+abstract class ParsedUnitResult implements ParseResult {}
+
+/// The result of parsing of a single file. The errors returned include only
+/// those discovered during scanning and parsing.
+///
+/// Clients may not extend, implement or mix-in this class.
+@deprecated
 abstract class ParseResult implements AnalysisResultWithErrors {
-  /**
-   * The content of the file that was scanned and parsed.
-   */
+  /// The content of the file that was scanned and parsed.
   String get content;
 
-  /**
-   * The parsed, unresolved compilation unit for the [content].
-   */
+  /// The parsed, unresolved compilation unit for the [content].
   CompilationUnit get unit;
 }
 
-/**
- * The result of building a resolved AST for a single file. The errors returned
- * include both syntactic and semantic errors.
- *
- * Clients may not extend, implement or mix-in this class.
- */
-abstract class ResolveResult implements AnalysisResultWithErrors {
-  /**
-   * The content of the file that was scanned, parsed and resolved.
-   */
-  String get content;
+/// The result of building resolved AST(s) for the whole library.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class ResolvedLibraryResult implements AnalysisResult {
+  /// The element representing this library.
+  LibraryElement get element;
 
-  /**
-   * The element representing the library containing the compilation [unit].
-   */
-  LibraryElement get libraryElement;
-
-  /**
-   * The type provider used when resolving the compilation [unit].
-   */
+  /// The type provider used when resolving the library.
   TypeProvider get typeProvider;
 
-  /**
-   * The fully resolved compilation unit for the [content].
-   */
+  /// The resolved units of the library.
+  List<ResolvedUnitResult> get units;
+
+  /// Return the declaration of the [element], or `null` if the [element]
+  /// is synthetic. Throw [ArgumentError] if the [element] is not defined in
+  /// this library.
+  ElementDeclarationResult getElementDeclaration(Element element);
+}
+
+/// The result of building a resolved AST for a single file. The errors returned
+/// include both syntactic and semantic errors.
+///
+/// Clients may not extend, implement or mix-in this class.
+// ignore: deprecated_member_use
+abstract class ResolvedUnitResult implements ResolveResult {}
+
+/// The result of building a resolved AST for a single file. The errors returned
+/// include both syntactic and semantic errors.
+///
+/// Clients may not extend, implement or mix-in this class.
+@deprecated
+abstract class ResolveResult implements AnalysisResultWithErrors {
+  /// The content of the file that was scanned, parsed and resolved.
+  String get content;
+
+  /// The element representing the library containing the compilation [unit].
+  LibraryElement get libraryElement;
+
+  /// The type provider used when resolving the compilation [unit].
+  TypeProvider get typeProvider;
+
+  /// The type system used when resolving the compilation [unit].
+  TypeSystem get typeSystem;
+
+  /// The fully resolved compilation unit for the [content].
   CompilationUnit get unit;
 }
 
-/**
- * An indication of whether an analysis result is valid, and if not why.
- */
+/// An indication of whether an analysis result is valid, and if not why.
 enum ResultState {
-  /**
-   * An indication that analysis could not be performed because the path
-   * represents a file of a type that cannot be analyzed.
-   */
+  /// An indication that analysis could not be performed because the path
+  /// represents a file of a type that cannot be analyzed.
   INVALID_FILE_TYPE,
 
-  /**
-   * An indication that analysis could not be performed because the path does
-   * not represent a file. It might represent something else, such as a
-   * directory, or it might not represent anything.
-   */
+  /// An indication that analysis could not be performed because the path does
+  /// not represent a file. It might represent something else, such as a
+  /// directory, or it might not represent anything.
   NOT_A_FILE,
 
-  /**
-   * An indication that analysis completed normally and the results are valid.
-   */
+  /// An indication that analysis completed normally and the results are valid.
   VALID
 }
 
-/**
- * The result of building the element model for a single file.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// The result of building the element model for a single file.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class UnitElementResult implements AnalysisResult {
-  /**
-   * The element of the file.
-   */
+  /// The element of the file.
   CompilationUnitElement get element;
 
-  /**
-   * The signature of the library containing the [element]. This is the same
-   * signature returned by the method [AnalysisSession.getUnitElementSignature]
-   * when given the path to the compilation unit represented by the [element].
-   *
-   * The signature is based on the APIs of the files of the library (including
-   * the file itself), and the transitive closure of files imported and exported
-   * by the library. If the signature of a file has not changed, then there have
-   * been no changes that would cause any files that depend on it to need to be
-   * re-analyzed.
-   */
+  /// The signature of the library containing the [element]. This is the same
+  /// signature returned by the method [AnalysisSession.getUnitElementSignature]
+  /// when given the path to the compilation unit represented by the [element].
+  ///
+  /// The signature is based on the APIs of the files of the library (including
+  /// the file itself), and the transitive closure of files imported and
+  /// exported by the library. If the signature of a file has not changed, then
+  /// there have been no changes that would cause any files that depend on it
+  /// to need to be re-analyzed.
   String get signature;
 }
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index 3c4d9cf..6f31a7b 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -4,6 +4,8 @@
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/uri_converter.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -13,118 +15,138 @@
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 
-/**
- * A consistent view of the results of analyzing one or more files.
- *
- * The methods in this class that return analysis results will throw an
- * [InconsistentAnalysisException] if the result to be returned might be
- * inconsistent with any previously returned results.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// A consistent view of the results of analyzing one or more files.
+///
+/// The methods in this class that return analysis results will throw an
+/// [InconsistentAnalysisException] if the result to be returned might be
+/// inconsistent with any previously returned results.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class AnalysisSession {
-  /**
-   * Return the [ResourceProvider] that is used to access the file system.
-   */
+  /// The analysis context that created this session.
+  AnalysisContext get analysisContext;
+
+  /// The declared environment variables.
+  DeclaredVariables get declaredVariables;
+
+  /// Return the [ResourceProvider] that is used to access the file system.
   ResourceProvider get resourceProvider;
 
-  /**
-   * Return the source factory used to resolve URIs.
-   *
-   * Deprecated: Use the methods on [uriConverter] instead.
-   */
+  /// Return the source factory used to resolve URIs.
+  ///
+  /// Deprecated: Use the methods on [uriConverter] instead.
   @deprecated
   SourceFactory get sourceFactory;
 
-  /**
-   * Return a type provider that is consistent with the results returned by this
-   * session.
-   */
+  /// Return a type provider that is consistent with the results returned by
+  /// this session.
   Future<TypeProvider> get typeProvider;
 
-  /**
-   * Return the type system being used by this session.
-   */
+  /// Return the type system being used by this session.
   Future<TypeSystem> get typeSystem;
 
-  /**
-   * Return the URI converter used to convert between URI's and file paths.
-   */
+  /// Return the URI converter used to convert between URI's and file paths.
   UriConverter get uriConverter;
 
-  /**
-   * Return a future that will complete with information about the errors
-   * contained in the file with the given absolute, normalized [path].
-   *
-   * If the file cannot be analyzed by this session, then the result will have
-   * a result state indicating the nature of the problem.
-   */
+  /// Return a future that will complete with information about the errors
+  /// contained in the file with the given absolute, normalized [path].
+  ///
+  /// If the file cannot be analyzed by this session, then the result will have
+  /// a result state indicating the nature of the problem.
   Future<ErrorsResult> getErrors(String path);
 
-  /**
-   * Return a future that will complete with the library element representing
-   * the library with the given [uri].
-   */
+  /// Return a future that will complete with the library element representing
+  /// the library with the given [uri].
   Future<LibraryElement> getLibraryByUri(String uri);
 
-  /**
-   * Return a future that will complete with information about the results of
-   * parsing the file with the given absolute, normalized [path].
-   */
+  /// Return a future that will complete with information about the results of
+  /// parsing the file with the given absolute, normalized [path].
+  ///
+  /// Deprecated: Use [getParsedUnit] instead.
+  @deprecated
   Future<ParseResult> getParsedAst(String path);
 
-  /**
-   * Return information about the results of parsing the file with the given
-   * absolute, normalized [path].
-   */
+  /// Return information about the results of parsing the file with the given
+  /// absolute, normalized [path].
+  ///
+  /// Deprecated: Use [getParsedUnit] instead.
+  @deprecated
   ParseResult getParsedAstSync(String path);
 
-  /**
-   * Return a future that will complete with information about the results of
-   * resolving the file with the given absolute, normalized [path].
-   */
+  /// Return information about the results of parsing units of the library file
+  /// with the given absolute, normalized [path].
+  ///
+  /// Throw [ArgumentError] if the given [path] is not the defining compilation
+  /// unit for a library (that is, is a part of a library).
+  ParsedLibraryResult getParsedLibrary(String path);
+
+  /// Return information about the results of parsing units of the library file
+  /// with the given library [element].
+  ///
+  /// Throw [ArgumentError] if the [element] was not produced by this session.
+  ParsedLibraryResult getParsedLibraryByElement(LibraryElement element);
+
+  /// Return information about the results of parsing the file with the given
+  /// absolute, normalized [path].
+  ParsedUnitResult getParsedUnit(String path);
+
+  /// Return a future that will complete with information about the results of
+  /// resolving the file with the given absolute, normalized [path].
+  ///
+  /// Deprecated: Use [getResolvedUnit] instead.
+  @deprecated
   Future<ResolveResult> getResolvedAst(String path);
 
-  /**
-   * Return a future that will complete with the source kind of the file with
-   * the given absolute, normalized [path]. If the path does not represent a
-   * file or if the kind of the file cannot be determined, then the future will
-   * complete with [SourceKind.UNKNOWN].
-   */
+  /// Return a future that will complete with information about the results of
+  /// resolving all of the files in the library with the given absolute,
+  /// normalized [path].
+  ///
+  /// Throw [ArgumentError] if the given [path] is not the defining compilation
+  /// unit for a library (that is, is a part of a library).
+  Future<ResolvedLibraryResult> getResolvedLibrary(String path);
+
+  /// Return a future that will complete with information about the results of
+  /// resolving all of the files in the library with the library [element].
+  ///
+  /// Throw [ArgumentError] if the [element] was not produced by this session.
+  Future<ResolvedLibraryResult> getResolvedLibraryByElement(
+      LibraryElement element);
+
+  /// Return a future that will complete with information about the results of
+  /// resolving the file with the given absolute, normalized [path].
+  Future<ResolvedUnitResult> getResolvedUnit(String path);
+
+  /// Return a future that will complete with the source kind of the file with
+  /// the given absolute, normalized [path]. If the path does not represent a
+  /// file or if the kind of the file cannot be determined, then the future will
+  /// complete with [SourceKind.UNKNOWN].
   Future<SourceKind> getSourceKind(String path);
 
-  /**
-   * Return a future that will complete with a list of the top-level
-   * declarations with the given [name] in all known libraries.
-   */
+  /// Return a future that will complete with a list of the top-level
+  /// declarations with the given [name] in all known libraries.
   Future<List<TopLevelDeclarationInSource>> getTopLevelDeclarations(
       String name);
 
-  /**
-   * Return a future that will complete with information about the results of
-   * building the element model for the file with the given absolute, normalized
-   * [path].
-   */
+  /// Return a future that will complete with information about the results of
+  /// building the element model for the file with the given absolute,
+  /// normalized[path].
   Future<UnitElementResult> getUnitElement(String path);
 
-  /**
-   * Return a future that will complete with the signature for the file with the
-   * given absolute, normalized [path], or `null` if the file cannot be analyzed.
-   * This is the same signature returned in the result from [getUnitElement].
-   *
-   * The signature is based on the APIs of the files of the library (including
-   * the file itself), and the transitive closure of files imported and exported
-   * by the library. If the signature of a file has not changed, then there have
-   * been no changes that would cause any files that depend on it to need to be
-   * re-analyzed.
-   */
+  /// Return a future that will complete with the signature for the file with
+  /// the given absolute, normalized [path], or `null` if the file cannot be
+  /// analyzed. This is the same signature returned in the result from
+  /// [getUnitElement].
+  ///
+  /// The signature is based on the APIs of the files of the library (including
+  /// the file itself), and the transitive closure of files imported and
+  /// exported by the library. If the signature of a file has not changed, then
+  /// there have been no changes that would cause any files that depend on it to
+  /// need to be re-analyzed.
   Future<String> getUnitElementSignature(String path);
 }
 
-/**
- * The exception thrown by an [AnalysisSession] if a result is requested that
- * might be inconsistent with any previously returned results.
- */
+/// The exception thrown by an [AnalysisSession] if a result is requested that
+/// might be inconsistent with any previously returned results.
 class InconsistentAnalysisException extends AnalysisException {
   InconsistentAnalysisException()
       : super('Requested result might be inconsistent with previously '
diff --git a/pkg/analyzer/lib/dart/analysis/utilities.dart b/pkg/analyzer/lib/dart/analysis/utilities.dart
new file mode 100644
index 0000000..75ef87b
--- /dev/null
+++ b/pkg/analyzer/lib/dart/analysis/utilities.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:meta/meta.dart';
+
+/// Return the result of parsing the file at the given [path].
+///
+/// If a [resourceProvider] is given, it will be used to access the file system.
+///
+/// Note that if more than one file is going to be parsed then this function is
+/// inefficient. Clients should instead use [AnalysisContextCollection] to
+/// create one or more contexts and use those contexts to parse the files.
+ParsedUnitResult parseFile(
+    {@required String path, ResourceProvider resourceProvider}) {
+  AnalysisContext context =
+      _createAnalysisContext(path: path, resourceProvider: resourceProvider);
+  return context.currentSession.getParsedUnit(path);
+}
+
+/// Return the result of resolving the file at the given [path].
+///
+/// If a [resourceProvider] is given, it will be used to access the file system.
+///
+/// Note that if more than one file is going to be resolved then this function
+/// is inefficient. Clients should instead use [AnalysisContextCollection] to
+/// create one or more contexts and use those contexts to resolve the files.
+Future<ResolvedUnitResult> resolveFile(
+    {@required String path, ResourceProvider resourceProvider}) async {
+  AnalysisContext context =
+      _createAnalysisContext(path: path, resourceProvider: resourceProvider);
+  return await context.currentSession.getResolvedUnit(path);
+}
+
+/// Return a newly create analysis context in which the file at the given [path]
+/// can be analyzed.
+///
+/// If a [resourceProvider] is given, it will be used to access the file system.
+AnalysisContext _createAnalysisContext(
+    {@required String path, ResourceProvider resourceProvider}) {
+  AnalysisContextCollection collection = new AnalysisContextCollection(
+    includedPaths: <String>[path],
+    resourceProvider: resourceProvider ?? PhysicalResourceProvider.INSTANCE,
+  );
+  List<AnalysisContext> contexts = collection.contexts;
+  if (contexts.length != 1) {
+    throw new ArgumentError('path must be an absolute path to a single file');
+  }
+  return contexts[0];
+}
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index e58d973..2378850 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -532,6 +532,7 @@
    * returns `true`, or `null` if there is no such ancestor. Note that this node
    * will never be returned.
    */
+  @deprecated
   E getAncestor<E extends AstNode>(Predicate<AstNode> predicate);
 
   /**
@@ -547,6 +548,18 @@
   void setProperty(String name, Object value);
 
   /**
+   * Return either this node or the most immediate ancestor of this node for
+   * which the [predicate] returns `true`, or `null` if there is no such node.
+   */
+  E thisOrAncestorMatching<E extends AstNode>(Predicate<AstNode> predicate);
+
+  /**
+   * Return either this node or the most immediate ancestor of this node that
+   * has the given type, or `null` if there is no such node.
+   */
+  T thisOrAncestorOfType<T extends AstNode>();
+
+  /**
    * Return a textual description of this node in a form approximating valid
    * source. The returned string will not be valid source primarily in the case
    * where the node itself is not well-formed.
@@ -750,6 +763,8 @@
 
   R visitScriptTag(ScriptTag node);
 
+  R visitSetLiteral(SetLiteral node);
+
   R visitShowCombinator(ShowCombinator node);
 
   R visitSimpleFormalParameter(SimpleFormalParameter node);
@@ -3764,7 +3779,8 @@
  * An anonymous function type.
  *
  *    functionType ::=
- *        [TypeAnnotation]? 'Function' [TypeParameterList]? [FormalParameterList]
+ *        [TypeAnnotation]? 'Function' [TypeParameterList]?
+ *        [FormalParameterList] '?'?
  *
  * where the FormalParameterList is being used to represent the following
  * grammar, despite the fact that FormalParameterList can represent a much
@@ -3814,6 +3830,18 @@
   void set parameters(FormalParameterList parameters);
 
   /**
+   * The question mark indicating that the type is nullable, or `null` if there
+   * is no question mark.
+   */
+  Token get question;
+
+  /**
+   * Set the question mark indicating that the type is nullable to the given
+   * [token].
+   */
+  void set question(Token token);
+
+  /**
    * Return the return type of the function type being defined, or `null` if
    * no return type was given.
    */
@@ -4340,8 +4368,6 @@
  *        ('new' | 'const')? [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
  *
  * Clients may not extend, implement or mix-in this class.
- *
- * 'new' | 'const' are only optional if the previewDart2 option is enabled.
  */
 abstract class InstanceCreationExpression extends Expression
     implements ConstructorReferenceNode {
@@ -5283,6 +5309,18 @@
   void set name(Identifier identifier);
 
   /**
+   * The question mark indicating that the type is nullable, or `null` if there
+   * is no question mark.
+   */
+  Token get question;
+
+  /**
+   * Set the question mark indicating that the type is nullable to the given
+   * [token].
+   */
+  void set question(Token token);
+
+  /**
    * Set the type being named to the given [type].
    */
   void set type(DartType type);
@@ -6022,6 +6060,43 @@
 }
 
 /**
+ * A literal set.
+ *
+ *    setLiteral ::=
+ *        'const'? ('<' [TypeAnnotation] '>')?
+ *        '{' [Expression] (',' [Expression])* ','? '}'
+ *      | 'const'? ('<' [TypeAnnotation] '>')? '{' '}'
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+abstract class SetLiteral extends TypedLiteral {
+  /**
+   * Return the expressions used to compute the elements of the set.
+   */
+  NodeList<Expression> get elements;
+
+  /**
+   * Return the left curly bracket.
+   */
+  Token get leftBracket;
+
+  /**
+   * Set the left curly bracket to the given [token].
+   */
+  void set leftBracket(Token token);
+
+  /**
+   * Return the right curly bracket.
+   */
+  Token get rightBracket;
+
+  /**
+   * Set the right curly bracket to the given [token].
+   */
+  void set rightBracket(Token token);
+}
+
+/**
  * A combinator that restricts the names being imported to those in a given list.
  *
  *    showCombinator ::=
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 5d46028..1a49333 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -624,7 +624,8 @@
       TypeAnnotation returnType,
       Token functionKeyword,
       TypeParameterList typeParameters,
-      FormalParameterList parameters);
+      FormalParameterList parameters,
+      {Token question});
 
   /**
    * Returns a newly created generic type alias. Either or both of the
@@ -939,6 +940,15 @@
   ScriptTag scriptTag(Token scriptTag);
 
   /**
+   * Returns a newly created set literal. The [constKeyword] can be `null`
+   * if the literal is not a constant. The [typeArguments] can be `null` if no
+   * type arguments were declared. The list of [elements] can be `null` if the
+   * set is empty.
+   */
+  SetLiteral setLiteral(Token constKeyword, TypeArgumentList typeArguments,
+      Token leftBracket, List<Expression> elements, Token rightBracket);
+
+  /**
    * Returns a newly created import show combinator.
    */
   ShowCombinator showCombinator(
@@ -1075,9 +1085,11 @@
 
   /**
    * Returns a newly created type name. The [typeArguments] can be `null` if
-   * there are no type arguments.
+   * there are no type arguments. The [question] can be `null` if there is no
+   * question mark.
    */
-  TypeName typeName(Identifier name, TypeArgumentList typeArguments);
+  TypeName typeName(Identifier name, TypeArgumentList typeArguments,
+      {Token question});
 
   /**
    * Returns a newly created type parameter. Either or both of the [comment]
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 6394b8b..53ff333 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -480,6 +480,9 @@
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
   @override
+  R visitSetLiteral(SetLiteral node) => visitTypedLiteral(node);
+
+  @override
   R visitShowCombinator(ShowCombinator node) => visitCombinator(node);
 
   @override
@@ -1123,6 +1126,12 @@
   }
 
   @override
+  R visitSetLiteral(SetLiteral node) {
+    node.visitChildren(this);
+    return null;
+  }
+
+  @override
   R visitShowCombinator(ShowCombinator node) {
     node.visitChildren(this);
     return null;
@@ -1552,6 +1561,9 @@
   R visitScriptTag(ScriptTag node) => null;
 
   @override
+  R visitSetLiteral(SetLiteral node) => null;
+
+  @override
   R visitShowCombinator(ShowCombinator node) => null;
 
   @override
@@ -1910,6 +1922,9 @@
   R visitScriptTag(ScriptTag node) => _throw(node);
 
   @override
+  R visitSetLiteral(SetLiteral node) => _throw(node);
+
+  @override
   R visitShowCombinator(ShowCombinator node) => _throw(node);
 
   @override
@@ -2720,6 +2735,14 @@
   }
 
   @override
+  T visitSetLiteral(SetLiteral node) {
+    stopwatch.start();
+    T result = _baseVisitor.visitSetLiteral(node);
+    stopwatch.stop();
+    return result;
+  }
+
+  @override
   T visitShowCombinator(ShowCombinator node) {
     stopwatch.start();
     T result = _baseVisitor.visitShowCombinator(node);
@@ -3213,6 +3236,9 @@
   R visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
   @override
+  R visitSetLiteral(SetLiteral node) => visitNode(node);
+
+  @override
   R visitShowCombinator(ShowCombinator node) => visitNode(node);
 
   @override
@@ -3296,7 +3322,7 @@
  * A helper class used to implement the correct order of visits for a
  * [BreadthFirstVisitor].
  */
-class _BreadthFirstChildVisitor extends UnifyingAstVisitor<Object> {
+class _BreadthFirstChildVisitor extends UnifyingAstVisitor<void> {
   /**
    * The [BreadthFirstVisitor] being helped by this visitor.
    */
@@ -3308,8 +3334,7 @@
   _BreadthFirstChildVisitor(this.outerVisitor);
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     outerVisitor._queue.add(node);
-    return null;
   }
 }
diff --git a/pkg/analyzer/lib/dart/constant/value.dart b/pkg/analyzer/lib/dart/constant/value.dart
index 2d7ddda..64a29c6 100644
--- a/pkg/analyzer/lib/dart/constant/value.dart
+++ b/pkg/analyzer/lib/dart/constant/value.dart
@@ -130,6 +130,14 @@
   Map<DartObject, DartObject> toMapValue();
 
   /**
+   * Return a set corresponding to the value of the object being represented,
+   * or `null` if
+   * * this object is not of type 'Set', or
+   * * the value of the object being represented is `null`.
+   */
+  Set<DartObject> toSetValue();
+
+  /**
    * Return a string corresponding to the value of the object being represented,
    * or `null` if
    * * this object is not of type 'String',
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index a282eb8..0260c07 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -34,9 +34,11 @@
 /// representation of the statements in a method body, but if one of those
 /// statements declares a local variable then the local variable will be
 /// represented by an element.
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -182,6 +184,7 @@
   /// the class.
   ConstructorElement get unnamedConstructor;
 
+  @deprecated
   @override
   NamedCompilationUnitMember computeNode();
 
@@ -405,6 +408,7 @@
   /// unit.
   List<ClassElement> get types;
 
+  @deprecated
   @override
   CompilationUnit computeNode();
 
@@ -453,6 +457,7 @@
   /// library containing this constructor has not yet been resolved.
   ConstructorElement get redirectedConstructor;
 
+  @deprecated
   @override
   ConstructorDeclaration computeNode();
 }
@@ -529,6 +534,9 @@
   /// Return `true` if this element has an annotation of the form `@JS(..)`.
   bool get hasJS;
 
+  /// Return `true` if this element has an annotation of the form '@literal'.
+  bool get hasLiteral;
+
   /// Return `true` if this element has an annotation of the form `@override`.
   bool get hasOverride;
 
@@ -632,6 +640,9 @@
   /// does not have a name, or otherwise does not have an offset.
   int get nameOffset;
 
+  /// Return the analysis session in which this element is defined.
+  AnalysisSession get session;
+
   @override
   Source get source;
 
@@ -640,6 +651,7 @@
   ///
   /// This method is expensive, because resolved AST might have been already
   /// evicted from cache, so parsing and resolving will be performed.
+  @deprecated
   CompilationUnit get unit;
 
   /// Use the given [visitor] to visit this element. Return the value returned
@@ -667,6 +679,7 @@
   /// cache, so parsing and resolving will be performed.
   ///
   /// <b>Note:</b> This method cannot be used in an async environment.
+  @deprecated
   AstNode computeNode();
 
   /// Return the most immediate ancestor of this element for which the
@@ -703,10 +716,14 @@
   @deprecated
   static const List<ElementAnnotation> EMPTY_LIST = const <ElementAnnotation>[];
 
-  /// Return a representation of the value of this annotation.
-  ///
-  /// Return `null` if the value of this annotation could not be computed
-  /// because of errors.
+  /// Return the errors that were produced while computing a value for this
+  /// annotation, or `null` if no value has been computed. If a value has been
+  /// produced but no errors were generated, then the list will be empty.
+  List<AnalysisError> get constantEvaluationErrors;
+
+  /// Return a representation of the value of this annotation, or `null` if the
+  /// value of this annotation has not been computed or if the value could not
+  /// be computed because of errors.
   DartObject get constantValue;
 
   /// Return the element representing the field, variable, or const constructor
@@ -728,6 +745,10 @@
   /// subclasses as being immutable.
   bool get isImmutable;
 
+  /// Return `true` if this annotation marks the associated constructor as
+  /// being literal.
+  bool get isLiteral;
+
   /// Return `true` if this annotation marks the associated member as running
   /// a single test.
   bool get isIsTest;
@@ -1055,6 +1076,7 @@
   @deprecated
   bool get isVirtual;
 
+  @deprecated
   @override
   AstNode computeNode();
 }
@@ -1097,6 +1119,7 @@
   /// and has the name `main`.
   bool get isEntryPoint;
 
+  @deprecated
   @override
   FunctionDeclaration computeNode();
 }
@@ -1118,6 +1141,7 @@
   /// type on the right side of the equals.
   GenericFunctionTypeElement get function;
 
+  @deprecated
   @override
   TypeAlias computeNode();
 
@@ -1301,6 +1325,11 @@
   /// computed yet.
   Namespace get publicNamespace;
 
+  /// Return the top-level elements defined in each of the compilation units
+  /// that are included in this library. This includes both public and private
+  /// elements, but does not include imports, exports, or synthetic elements.
+  Iterable<Element> get topLevelElements;
+
   /// Return a list containing all of the compilation units this library
   /// consists of. This includes the defining compilation unit and units
   /// included using the `part` directive.
@@ -1353,6 +1382,7 @@
   @deprecated
   static const List<MethodElement> EMPTY_LIST = const <MethodElement>[];
 
+  @deprecated
   @override
   MethodDeclaration computeNode();
 
@@ -1463,6 +1493,7 @@
   /// the given [buffer].
   void appendToWithoutDelimiters(StringBuffer buffer);
 
+  @deprecated
   @override
   FormalParameter computeNode();
 }
@@ -1597,6 +1628,7 @@
   static const List<TopLevelVariableElement> EMPTY_LIST =
       const <TopLevelVariableElement>[];
 
+  @deprecated
   @override
   VariableDeclaration computeNode();
 }
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index dc89edf..f2ddef8 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -75,6 +75,12 @@
   bool get isDartCoreFunction;
 
   /**
+   * Return `true` if this type represents the type 'int' defined in the
+   * dart:core library.
+   */
+  bool get isDartCoreInt;
+
+  /**
    * Return `true` if this type represents the type 'Null' defined in the
    * dart:core library.
    */
diff --git a/pkg/analyzer/lib/dart/element/type_system.dart b/pkg/analyzer/lib/dart/element/type_system.dart
new file mode 100644
index 0000000..769a5d9
--- /dev/null
+++ b/pkg/analyzer/lib/dart/element/type_system.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/element/type.dart';
+
+/// A representation of the operations defined for the type system.
+///
+/// Clients may not extend, implement or mix-in this class.
+abstract class TypeSystem {
+  /// Return the result of applying the function "flatten" to the given [type].
+  ///
+  /// For the Dart 2.0 type system, the function is defined in the Dart Language
+  /// Specification, section 16.11 Function Expressions:
+  ///
+  /// > We define the auxiliary function _flatten(T)_, which is used below and
+  /// > in other sections, as follows:
+  /// >
+  /// > * If _T_ is `FutureOr<`_S_`>` for some _S_ then _flatten(T)_ = _S_.
+  /// >
+  /// > * Otherwise if _T_ <: `Future` then let _S_ be a type such that _T_ <:
+  /// >   `Future<`_S_`>` and for all _R_, if _T_ <: `Future<`_R_`>` then _S_ <:
+  /// >   _R_. This ensures that `Future<`_S_`>` is the most specific generic
+  /// >   instantiation of `Future` that is a supertype of _T_. Note that _S_ is
+  /// >   well-defined because of the requirements on superinterfaces. Then
+  /// >   _flatten(T)_ = _S_.
+  /// >
+  /// > * In any other circumstance, _flatten(T)_ = _T_.
+  ///
+  /// The subtype relationship (<:) can be tested using [isSubtypeOf].
+  ///
+  /// Other type systems may define this operation differently.
+  DartType flatten(DartType type);
+
+  /// Return `true` if the [rightType] is assignable to the [leftType].
+  ///
+  /// For the Dart 2.0 type system, the definition of this relationship is given
+  /// in the Dart Language Specification, section 19.4 Subtypes:
+  ///
+  /// > A type _T_ may be assigned to a type _S_ in an environment &Gamma;,
+  /// > written &Gamma; &#8866; _T_ &hArr; _S_, iff either &Gamma; &#8866; _S_
+  /// > <: _T_ or &Gamma; &#8866; _T_ <: _S_. In this case we say that the types
+  /// > _S_ and _T_ are assignable.
+  ///
+  /// The subtype relationship (<:) can be tested using [isSubtypeOf].
+  ///
+  /// Other type systems may define this operation differently. In particular,
+  /// while the operation is commutative in the Dart 2.0 type system, that is
+  /// not a requirement of a type system, so the order of the arguments is
+  /// important.
+  bool isAssignableTo(DartType leftType, DartType rightType);
+
+  /// Return `true` if the [leftType] is a subtype of the [rightType].
+  ///
+  /// For the Dart 2.0 type system, the rules governing the subtype relationship
+  /// are given in the Dart Language Specification, section 19.4 Subtypes.
+  ///
+  /// Other type systems may define this operation differently.
+  bool isSubtypeOf(DartType leftType, DartType rightType);
+
+  /// Compute the least upper bound of two types. This operation if commutative,
+  /// meaning that `leastUpperBound(t, s) == leastUpperBound(s, t)` for all `t`
+  /// and `s`.
+  ///
+  /// For the Dart 2.0 type system, the definition of the least upper bound is
+  /// given in the Dart Language Specification, section 19.9.2 Least Upper
+  /// Bounds.
+  ///
+  /// Other type systems may define this operation differently.
+  DartType leastUpperBound(DartType leftType, DartType rightType);
+
+  /// Return the result of resolving the bounds of the given [type].
+  ///
+  /// For the Dart 2.0 type system, the definition of resolving to bounds is
+  /// defined by the following. If the given [type] is a [TypeParameterType] and
+  /// it has a bound, return the result of resolving its bound (as per this
+  /// method). If the [type] is a [TypeParameterType] and it does not have a
+  /// bound, return the type `Object`. For any other type, return the given
+  /// type.
+  ///
+  /// Other type systems may define this operation differently.
+  DartType resolveToBound(DartType type);
+}
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index 763bd2f..fdaed1b 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -44,6 +44,7 @@
   AnalysisOptionsWarningCode.ANALYSIS_OPTION_DEPRECATED,
   AnalysisOptionsWarningCode.INCLUDE_FILE_NOT_FOUND,
   AnalysisOptionsWarningCode.INCLUDED_FILE_WARNING,
+  AnalysisOptionsWarningCode.INVALID_OPTION,
   AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT,
   AnalysisOptionsWarningCode.UNRECOGNIZED_ERROR_CODE,
   AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUE,
@@ -57,11 +58,11 @@
   AnalysisOptionsHintCode.SUPER_MIXINS_SETTING_DEPRECATED,
   CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH,
   CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-  CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
   CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE,
   CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,
   CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE,
   CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE,
+  CheckedModeCompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE,
   CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
   CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
   CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD,
@@ -96,9 +97,11 @@
   CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
   CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE,
   CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL,
+  CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT,
   CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING,
   CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
   CompileTimeErrorCode.CONST_EVAL_TYPE_NUM,
+  CompileTimeErrorCode.CONST_EVAL_TYPE_TYPE,
   CompileTimeErrorCode.CONST_FORMAL_PARAMETER,
   CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
   CompileTimeErrorCode
@@ -106,6 +109,7 @@
   CompileTimeErrorCode.CONST_INSTANCE_FIELD,
   CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
   CompileTimeErrorCode.CONST_NOT_INITIALIZED,
+  CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS,
   CompileTimeErrorCode.CONST_WITH_INVALID_TYPE_PARAMETERS,
   CompileTimeErrorCode.CONST_WITH_NON_CONST,
   CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT,
@@ -137,7 +141,7 @@
   CompileTimeErrorCode.FOR_IN_WITH_CONST_VARIABLE,
   CompileTimeErrorCode.GENERIC_FUNCTION_TYPED_PARAM_UNSUPPORTED,
   CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND,
-  CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
+  CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
   CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
   CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
   CompileTimeErrorCode.IMPLEMENTS_NON_CLASS,
@@ -172,6 +176,7 @@
   CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST,
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP,
+  CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET,
   CompileTimeErrorCode.INVALID_URI,
   CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
   CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE,
@@ -179,6 +184,7 @@
   CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME,
   CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL,
   CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL,
+  CompileTimeErrorCode.MISSING_CONST_IN_SET_LITERAL,
   CompileTimeErrorCode.MISSING_DART_LIBRARY,
   CompileTimeErrorCode.MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
   CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
@@ -211,6 +217,8 @@
   CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE,
   CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY,
+  CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT,
+  CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER,
   CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY,
   CompileTimeErrorCode.NON_CONST_MAP_AS_EXPRESSION_STATEMENT,
@@ -265,14 +273,14 @@
   CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
   CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR,
   CompileTimeErrorCode.YIELD_IN_NON_GENERATOR,
-  HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
   HintCode.CAN_BE_NULL_AFTER_NULL_AWARE,
   HintCode.DEAD_CODE,
   HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH,
   HintCode.DEAD_CODE_ON_CATCH_SUBTYPE,
-  HintCode.DEPRECATED_MEMBER_USE,
-  HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION,
   HintCode.DEPRECATED_EXTENDS_FUNCTION,
+  HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION,
+  HintCode.DEPRECATED_MEMBER_USE,
+  HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE,
   HintCode.DEPRECATED_MIXIN_FUNCTION,
   HintCode.DIVISION_OPTIMIZATION,
   HintCode.DUPLICATE_IMPORT,
@@ -280,15 +288,12 @@
   HintCode.DUPLICATE_SHOWN_NAME,
   HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
   HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
-  HintCode.GENERIC_METHOD_COMMENT,
   HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
-  HintCode.INVALID_ASSIGNMENT,
   HintCode.INVALID_FACTORY_ANNOTATION,
   HintCode.INVALID_FACTORY_METHOD_DECL,
   HintCode.INVALID_FACTORY_METHOD_IMPL,
   HintCode.INVALID_IMMUTABLE_ANNOTATION,
-  HintCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS,
-  HintCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND,
+  HintCode.INVALID_LITERAL_ANNOTATION,
   HintCode.INVALID_REQUIRED_PARAM,
   HintCode.INVALID_SEALED_ANNOTATION,
   HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
@@ -302,8 +307,11 @@
   HintCode.MISSING_REQUIRED_PARAM,
   HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS,
   HintCode.MISSING_RETURN,
+  HintCode.MIXIN_ON_SEALED_CLASS,
   HintCode.MUST_BE_IMMUTABLE,
   HintCode.MUST_CALL_SUPER,
+  HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR,
+  HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW,
   HintCode.NULL_AWARE_BEFORE_OPERATOR,
   HintCode.NULL_AWARE_IN_CONDITION,
   HintCode.NULL_AWARE_IN_LOGICAL_OPERATOR,
@@ -313,13 +321,11 @@
   HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD,
   HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER,
   HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT,
+  HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE,
+  HintCode.SUBTYPE_OF_SEALED_CLASS,
   HintCode.TYPE_CHECK_IS_NOT_NULL,
   HintCode.TYPE_CHECK_IS_NULL,
-  HintCode.UNDEFINED_GETTER,
   HintCode.UNDEFINED_HIDDEN_NAME,
-  HintCode.UNDEFINED_METHOD,
-  HintCode.UNDEFINED_OPERATOR,
-  HintCode.UNDEFINED_SETTER,
   HintCode.UNDEFINED_SHOWN_NAME,
   HintCode.UNNECESSARY_CAST,
   HintCode.UNNECESSARY_NO_SUCH_METHOD,
@@ -333,7 +339,6 @@
   HintCode.UNUSED_LABEL,
   HintCode.UNUSED_LOCAL_VARIABLE,
   HintCode.UNUSED_SHOWN_NAME,
-  HintCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
   HtmlErrorCode.PARSE_ERROR,
   HtmlWarningCode.INVALID_URI,
   HtmlWarningCode.URI_DOES_NOT_EXIST,
@@ -346,6 +351,7 @@
   ParserErrorCode.ASYNC_KEYWORD_USED_AS_IDENTIFIER,
   ParserErrorCode.BREAK_OUTSIDE_OF_LOOP,
   ParserErrorCode.CATCH_SYNTAX,
+  ParserErrorCode.CATCH_SYNTAX_EXTRA_PARAMETERS,
   ParserErrorCode.CLASS_IN_CLASS,
   ParserErrorCode.COLON_IN_PLACE_OF_IN,
   ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE,
@@ -392,6 +398,8 @@
   ParserErrorCode.EXTERNAL_CLASS,
   ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY,
   ParserErrorCode.EXTERNAL_ENUM,
+  ParserErrorCode.EXTERNAL_FACTORY_REDIRECTION,
+  ParserErrorCode.EXTERNAL_FACTORY_WITH_BODY,
   ParserErrorCode.EXTERNAL_FIELD,
   ParserErrorCode.EXTERNAL_GETTER_WITH_BODY,
   ParserErrorCode.EXTERNAL_METHOD_WITH_BODY,
@@ -403,6 +411,7 @@
   ParserErrorCode.FACTORY_WITHOUT_BODY,
   ParserErrorCode.FACTORY_WITH_INITIALIZERS,
   ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
+  ParserErrorCode.FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS,
   ParserErrorCode.FINAL_AND_COVARIANT,
   ParserErrorCode.FINAL_AND_VAR,
   ParserErrorCode.FINAL_CLASS,
@@ -428,6 +437,7 @@
   ParserErrorCode.INVALID_LITERAL_IN_CONFIGURATION,
   ParserErrorCode.INVALID_OPERATOR,
   ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
+  ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER,
   ParserErrorCode.INVALID_STAR_AFTER_ASYNC,
   ParserErrorCode.INVALID_SYNC,
   ParserErrorCode.INVALID_UNICODE_ESCAPE,
@@ -528,6 +538,7 @@
   ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT,
   ScannerErrorCode.UNTERMINATED_STRING_LITERAL,
   StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
+  StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS,
   StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
   StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
   StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
@@ -551,7 +562,6 @@
   StaticTypeWarningCode.UNDEFINED_FUNCTION,
   StaticTypeWarningCode.UNDEFINED_GETTER,
   StaticTypeWarningCode.UNDEFINED_METHOD,
-  StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR,
   StaticTypeWarningCode.UNDEFINED_OPERATOR,
   StaticTypeWarningCode.UNDEFINED_SETTER,
   StaticTypeWarningCode.UNDEFINED_SUPER_GETTER,
@@ -577,6 +587,7 @@
   StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
   StaticWarningCode.CONST_WITH_ABSTRACT_CLASS,
   StaticWarningCode.EQUAL_KEYS_IN_MAP,
+  StaticWarningCode.EQUAL_VALUES_IN_CONST_SET,
   StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED,
   StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS,
   StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED,
@@ -624,6 +635,7 @@
   StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR,
   StaticWarningCode.REDIRECT_TO_NON_CLASS,
   StaticWarningCode.RETURN_WITHOUT_VALUE,
+  StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE,
   StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
   StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
   StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
@@ -660,6 +672,7 @@
   StrongModeCode.INVALID_CAST_LITERAL,
   StrongModeCode.INVALID_CAST_LITERAL_LIST,
   StrongModeCode.INVALID_CAST_LITERAL_MAP,
+  StrongModeCode.INVALID_CAST_LITERAL_SET,
   StrongModeCode.INVALID_CAST_FUNCTION_EXPR,
   StrongModeCode.INVALID_CAST_NEW_EXPR,
   StrongModeCode.INVALID_CAST_METHOD,
diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart
index eeef617..5f7e149 100644
--- a/pkg/analyzer/lib/error/listener.dart
+++ b/pkg/analyzer/lib/error/listener.dart
@@ -196,10 +196,10 @@
    * clarify the message.
    */
   void _convertTypeNames(List<Object> arguments) {
-    String displayName(DartType type) {
+    String computeDisplayName(DartType type) {
       if (type is FunctionType) {
         String name = type.name;
-        if (name != null && name.length > 0) {
+        if (name != null && name.isNotEmpty) {
           StringBuffer buffer = new StringBuffer();
           buffer.write(name);
           (type as TypeImpl).appendTo(buffer, new Set.identity());
@@ -209,46 +209,54 @@
       return type.displayName;
     }
 
-    if (_hasEqualTypeNames(arguments)) {
-      int count = arguments.length;
-      for (int i = 0; i < count; i++) {
-        Object argument = arguments[i];
-        if (argument is DartType) {
-          Element element = argument.element;
+    Map<String, List<_TypeToConvert>> typeGroups = {};
+    for (int i = 0; i < arguments.length; i++) {
+      Object argument = arguments[i];
+      if (argument is DartType) {
+        String displayName = computeDisplayName(argument);
+        List<_TypeToConvert> types =
+            typeGroups.putIfAbsent(displayName, () => <_TypeToConvert>[]);
+        types.add(new _TypeToConvert(i, argument, displayName));
+      }
+    }
+    for (List<_TypeToConvert> typeGroup in typeGroups.values) {
+      if (typeGroup.length == 1) {
+        _TypeToConvert typeToConvert = typeGroup[0];
+        if (typeToConvert.type is DartType) {
+          arguments[typeToConvert.index] = typeToConvert.displayName;
+        }
+      } else {
+        Map<String, Set<Element>> nameToElementMap = {};
+        for (_TypeToConvert typeToConvert in typeGroup) {
+          for (Element element in typeToConvert.allElements()) {
+            Set<Element> elements = nameToElementMap.putIfAbsent(
+                element.name, () => new Set<Element>());
+            elements.add(element);
+          }
+        }
+        for (_TypeToConvert typeToConvert in typeGroup) {
+          Element element = typeToConvert.type.element;
           if (element == null) {
-            arguments[i] = displayName(argument);
+            arguments[typeToConvert.index] = typeToConvert.displayName;
           } else {
-            arguments[i] =
-                element.getExtendedDisplayName(displayName(argument));
+            // TODO(brianwilkerson) When analyzer supports info or context
+            //  messages, expose the additional information that way (rather
+            //  than being poorly inserted into the problem message).
+            StringBuffer buffer = new StringBuffer();
+            for (Element element in typeToConvert.allElements()) {
+              String name = element.name;
+              if (nameToElementMap[name].length > 1) {
+                buffer.write(buffer.isEmpty ? 'where ' : ', ');
+                buffer.write('$name is defined in ${element.source.fullName}');
+              }
+            }
+            arguments[typeToConvert.index] =
+                '${typeToConvert.displayName} ($buffer)';
           }
         }
       }
-    } else {
-      int count = arguments.length;
-      for (int i = 0; i < count; i++) {
-        Object argument = arguments[i];
-        if (argument is DartType) {
-          arguments[i] = displayName(argument);
-        }
-      }
     }
   }
-
-  /**
-   * Return `true` if the given array of [arguments] contains two or more types
-   * with the same display name.
-   */
-  bool _hasEqualTypeNames(List<Object> arguments) {
-    int count = arguments.length;
-    HashSet<String> typeNames = new HashSet<String>();
-    for (int i = 0; i < count; i++) {
-      Object argument = arguments[i];
-      if (argument is DartType && !typeNames.add(argument.displayName)) {
-        return true;
-      }
-    }
-    return false;
-  }
 }
 
 /**
@@ -256,58 +264,32 @@
  * way that is appropriate for caching those errors within an analysis context.
  */
 class RecordingErrorListener implements AnalysisErrorListener {
-  /**
-   * A map of sets containing the errors that were collected, keyed by each
-   * source.
-   */
-  Map<Source, HashSet<AnalysisError>> _errors =
-      new HashMap<Source, HashSet<AnalysisError>>();
+  Set<AnalysisError> _errors;
 
   /**
    * Return the errors collected by the listener.
    */
   List<AnalysisError> get errors {
-    int numEntries = _errors.length;
-    if (numEntries == 0) {
-      return AnalysisError.NO_ERRORS;
+    if (_errors == null) {
+      return const <AnalysisError>[];
     }
-    List<AnalysisError> resultList = new List<AnalysisError>();
-    for (HashSet<AnalysisError> errors in _errors.values) {
-      resultList.addAll(errors);
-    }
-    return resultList;
-  }
-
-  /**
-   * Add all of the errors recorded by the given [listener] to this listener.
-   */
-  void addAll(RecordingErrorListener listener) {
-    for (AnalysisError error in listener.errors) {
-      onError(error);
-    }
+    return _errors.toList();
   }
 
   /**
    * Return the errors collected by the listener for the given [source].
    */
   List<AnalysisError> getErrorsForSource(Source source) {
-    HashSet<AnalysisError> errorsForSource = _errors[source];
-    if (errorsForSource == null) {
-      return AnalysisError.NO_ERRORS;
-    } else {
-      return new List.from(errorsForSource);
+    if (_errors == null) {
+      return const <AnalysisError>[];
     }
+    return _errors.where((error) => error.source == source).toList();
   }
 
   @override
   void onError(AnalysisError error) {
-    Source source = error.source;
-    HashSet<AnalysisError> errorsForSource = _errors[source];
-    if (_errors[source] == null) {
-      errorsForSource = new HashSet<AnalysisError>();
-      _errors[source] = errorsForSource;
-    }
-    errorsForSource.add(error);
+    _errors ??= new HashSet<AnalysisError>();
+    _errors.add(error);
   }
 }
 
@@ -320,3 +302,48 @@
     // Ignore errors
   }
 }
+
+/**
+ * Used by `ErrorReporter._convertTypeNames` to keep track of a type that is
+ * being converted.
+ */
+class _TypeToConvert {
+  final int index;
+  final DartType type;
+  final String displayName;
+
+  List<Element> _allElements;
+
+  _TypeToConvert(this.index, this.type, this.displayName);
+
+  List<Element> allElements() {
+    if (_allElements == null) {
+      Set<Element> elements = new Set<Element>();
+
+      void addElementsFrom(DartType type) {
+        Element element = type?.element;
+        if (element != null) {
+          if (type is InterfaceType && elements.add(element)) {
+            for (DartType typeArgument in type.typeArguments) {
+              addElementsFrom(typeArgument);
+            }
+          } else if (type is FunctionType && elements.add(element)) {
+            addElementsFrom(type.returnType);
+            for (DartType typeArgument in type.typeArguments) {
+              addElementsFrom(typeArgument);
+            }
+            for (ParameterElement parameter in type.parameters) {
+              addElementsFrom(parameter.type);
+            }
+          }
+        }
+      }
+
+      addElementsFrom(type);
+      _allElements = elements
+          .where((element) => element.name != null && element.name.isNotEmpty)
+          .toList();
+    }
+    return _allElements;
+  }
+}
diff --git a/pkg/analyzer/lib/file_system/file_system.dart b/pkg/analyzer/lib/file_system/file_system.dart
index 7a714b6..61770a1 100644
--- a/pkg/analyzer/lib/file_system/file_system.dart
+++ b/pkg/analyzer/lib/file_system/file_system.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/lib/file_system/memory_file_system.dart b/pkg/analyzer/lib/file_system/memory_file_system.dart
index 5059dcd..e179115 100644
--- a/pkg/analyzer/lib/file_system/memory_file_system.dart
+++ b/pkg/analyzer/lib/file_system/memory_file_system.dart
@@ -5,7 +5,6 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:convert';
-import 'dart:core';
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source_io.dart';
@@ -213,6 +212,8 @@
   }
 
   void _checkFileAtPath(String path) {
+    // TODO(brianwilkerson) Consider throwing a FileSystemException rather than
+    // an ArgumentError.
     _MemoryResource resource = _pathToResource[path];
     if (resource is! _MemoryFile) {
       if (resource == null) {
@@ -224,6 +225,8 @@
   }
 
   void _checkFolderAtPath(String path) {
+    // TODO(brianwilkerson) Consider throwing a FileSystemException rather than
+    // an ArgumentError.
     _MemoryResource resource = _pathToResource[path];
     if (resource is! _MemoryFolder) {
       throw new ArgumentError(
diff --git a/pkg/analyzer/lib/file_system/overlay_file_system.dart b/pkg/analyzer/lib/file_system/overlay_file_system.dart
index 666e5722..76879be 100644
--- a/pkg/analyzer/lib/file_system/overlay_file_system.dart
+++ b/pkg/analyzer/lib/file_system/overlay_file_system.dart
@@ -78,6 +78,12 @@
       new _OverlayFolder(this, baseProvider.getStateLocation(pluginId));
 
   /**
+   * Return `true` if there is an overlay associated with the file at the given
+   * [path].
+   */
+  bool hasOverlay(String path) => _overlayContent.containsKey(path);
+
+  /**
    * Remove any overlay of the file at the given [path]. The state of the file
    * in the base resource provider will not be affected.
    */
@@ -111,7 +117,7 @@
    * file with the [newPath].
    */
   void _copyOverlay(String oldPath, String newPath) {
-    if (_hasOverlay(oldPath)) {
+    if (hasOverlay(oldPath)) {
       _overlayContent[newPath] = _overlayContent[oldPath];
       _overlayModificationStamps[newPath] = _overlayModificationStamps[oldPath];
     }
@@ -134,12 +140,6 @@
   }
 
   /**
-   * Return `true` if there is an overlay associated with the file at the given
-   * [path].
-   */
-  bool _hasOverlay(String path) => _overlayContent.containsKey(path);
-
-  /**
    * Return the paths of all of the overlaid files that are immediate children
    * of the given [folder].
    */
@@ -165,7 +165,7 @@
   Stream<WatchEvent> get changes => _file.changes;
 
   @override
-  bool get exists => _provider._hasOverlay(path) || _resource.exists;
+  bool get exists => _provider.hasOverlay(path) || _resource.exists;
 
   @override
   int get lengthSync {
@@ -241,7 +241,7 @@
   @override
   File renameSync(String newPath) {
     File newFile = _file.renameSync(newPath);
-    if (_provider._hasOverlay(path)) {
+    if (_provider.hasOverlay(path)) {
       _provider.setOverlay(newPath,
           content: _provider._getOverlayContent(path),
           modificationStamp: _provider._getOverlayModificationStamp(path));
@@ -257,7 +257,7 @@
 
   @override
   void writeAsStringSync(String content) {
-    if (_provider._hasOverlay(path)) {
+    if (_provider.hasOverlay(path)) {
       throw new FileSystemException(
           path, 'Cannot write a file with an overlay');
     }
diff --git a/pkg/analyzer/lib/file_system/physical_file_system.dart b/pkg/analyzer/lib/file_system/physical_file_system.dart
index 966a100..eb28314 100644
--- a/pkg/analyzer/lib/file_system/physical_file_system.dart
+++ b/pkg/analyzer/lib/file_system/physical_file_system.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:core';
 import 'dart:io' as io;
 
 import 'package:analyzer/file_system/file_system.dart';
diff --git a/pkg/analyzer/lib/source/embedder.dart b/pkg/analyzer/lib/source/embedder.dart
index fe2a5f4..dfd679f 100644
--- a/pkg/analyzer/lib/source/embedder.dart
+++ b/pkg/analyzer/lib/source/embedder.dart
@@ -171,6 +171,9 @@
   int get length => _embedderSdk?.urlMappings?.length ?? 0;
 
   @override
+  void clearCache() {}
+
+  @override
   Source resolveAbsolute(Uri uri, [Uri actualUri]) =>
       _dartUriResolver.resolveAbsolute(uri, actualUri);
 
diff --git a/pkg/analyzer/lib/src/analysis_options/error/option_codes.dart b/pkg/analyzer/lib/src/analysis_options/error/option_codes.dart
index 53f4a4e..a82fb5e 100644
--- a/pkg/analyzer/lib/src/analysis_options/error/option_codes.dart
+++ b/pkg/analyzer/lib/src/analysis_options/error/option_codes.dart
@@ -141,6 +141,14 @@
           "Warning in the included options file {0}({1}..{2}): {3}");
 
   /**
+   * An error code indicating that a plugin is being configured with an invalid
+   * value for an option and a detail message is provided.
+   */
+  static const AnalysisOptionsWarningCode INVALID_OPTION =
+      const AnalysisOptionsWarningCode(
+          'INVALID_OPTION', "Invalid option specified for '{0}': {1}");
+
+  /**
    * An error code indicating an invalid format for an options file section.
    *
    * Parameters:
diff --git a/pkg/analyzer/lib/src/codegen/html.dart b/pkg/analyzer/lib/src/codegen/html.dart
index f6405af..1cbce5f 100644
--- a/pkg/analyzer/lib/src/codegen/html.dart
+++ b/pkg/analyzer/lib/src/codegen/html.dart
@@ -75,7 +75,7 @@
 /**
  * Mixin class for generating HTML.
  */
-class HtmlGenerator {
+mixin HtmlGenerator {
   List<dom.Node> _html;
 
   /**
diff --git a/pkg/analyzer/lib/src/codegen/tools.dart b/pkg/analyzer/lib/src/codegen/tools.dart
index 8cd9293..8b4e96d 100644
--- a/pkg/analyzer/lib/src/codegen/tools.dart
+++ b/pkg/analyzer/lib/src/codegen/tools.dart
@@ -40,6 +40,19 @@
 }
 
 /**
+ * Type of functions used to compute the contents of a set of generated files.
+ * [pkgPath] is the path to the current package.
+ */
+typedef Map<String, FileContentsComputer> DirectoryContentsComputer(
+    String pkgPath);
+
+/**
+ * Type of functions used to compute the contents of a generated file.
+ * [pkgPath] is the path to the current package.
+ */
+typedef Future<String> FileContentsComputer(String pkgPath);
+
+/**
  * Mixin class for generating code.
  */
 class CodeGenerator {
@@ -244,6 +257,255 @@
 }
 
 /**
+ * A utility class for invoking dartfmt.
+ */
+class DartFormat {
+  static String get _dartfmtPath {
+    String binName = Platform.isWindows ? 'dartfmt.bat' : 'dartfmt';
+    for (var loc in [binName, join('dart-sdk', 'bin', binName)]) {
+      var candidatePath = join(dirname(Platform.resolvedExecutable), loc);
+      if (new File(candidatePath).existsSync()) {
+        return candidatePath;
+      }
+    }
+    throw new StateError('Could not find dartfmt executable');
+  }
+
+  static void formatFile(File file) {
+    ProcessResult result = Process.runSync(_dartfmtPath, ['-w', file.path]);
+    if (result.exitCode != 0) throw result.stderr;
+  }
+
+  static String formatText(String text) {
+    File file = new File(join(Directory.systemTemp.path, 'gen.dart'));
+    file.writeAsStringSync(text);
+    ProcessResult result = Process.runSync(_dartfmtPath, ['-w', file.path]);
+    if (result.exitCode != 0) throw result.stderr;
+    return file.readAsStringSync();
+  }
+}
+
+/**
+ * Abstract base class representing behaviors common to generated files and
+ * generated directories.
+ */
+abstract class GeneratedContent {
+  /**
+   * Check whether the [output] has the correct contents, and return true if it
+   * does.  [pkgPath] is the path to the current package.
+   */
+  Future<bool> check(String pkgPath);
+
+  /**
+   * Replace the [output] with the correct contents.  [pkgPath] is the path to
+   * the current package.
+   */
+  Future<void> generate(String pkgPath);
+
+  /**
+   * Get a [FileSystemEntity] representing the output file or directory.
+   * [pkgPath] is the path to the current package.
+   */
+  FileSystemEntity output(String pkgPath);
+
+  /**
+   * Check that all of the [targets] are up to date.  If they are not, print
+   * out a message instructing the user to regenerate them, and exit with a
+   * nonzero error code.
+   *
+   * [pkgPath] is the path to the current package.  [generatorRelPath] is the
+   * path to a .dart script the user may use to regenerate the targets.
+   *
+   * To avoid mistakes when run on Windows, [generatorRelPath] always uses
+   * POSIX directory separators.
+   */
+  static Future<void> checkAll(String pkgPath, String generatorRelPath,
+      Iterable<GeneratedContent> targets) async {
+    bool generateNeeded = false;
+    for (GeneratedContent target in targets) {
+      bool ok = await target.check(pkgPath);
+      if (!ok) {
+        print("${target.output(pkgPath).absolute}"
+            " doesn't have expected contents.");
+        generateNeeded = true;
+      }
+    }
+    if (generateNeeded) {
+      print('Please regenerate using:');
+      String executable = Platform.executable;
+      String packageRoot = '';
+      // ignore: deprecated_member_use
+      if (Platform.packageRoot != null) {
+        // ignore: deprecated_member_use
+        packageRoot = ' --package-root=${Platform.packageRoot}';
+      }
+      String generateScript =
+          join(pkgPath, joinAll(posix.split(generatorRelPath)));
+      print('  $executable$packageRoot $generateScript');
+      exit(1);
+    } else {
+      print('All generated files up to date.');
+    }
+  }
+
+  /**
+   * Regenerate all of the [targets].  [pkgPath] is the path to the current
+   * package.
+   */
+  static Future<void> generateAll(
+      String pkgPath, Iterable<GeneratedContent> targets) async {
+    print("Generating...");
+    for (GeneratedContent target in targets) {
+      await target.generate(pkgPath);
+    }
+  }
+}
+
+/**
+ * Class representing a single output directory (either generated code or
+ * generated HTML). No other content should exist in the directory.
+ */
+class GeneratedDirectory extends GeneratedContent {
+  /**
+   * The path to the directory that will have the generated content.
+   */
+  final String outputDirPath;
+
+  /**
+   * Callback function that computes the directory contents.
+   */
+  final DirectoryContentsComputer directoryContentsComputer;
+
+  GeneratedDirectory(this.outputDirPath, this.directoryContentsComputer);
+
+  @override
+  Future<bool> check(String pkgPath) async {
+    Directory outputDirectory = output(pkgPath);
+    Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
+    try {
+      for (String file in map.keys) {
+        FileContentsComputer fileContentsComputer = map[file];
+        String expectedContents = await fileContentsComputer(pkgPath);
+        File outputFile = new File(posix.join(outputDirectory.path, file));
+        String actualContents = outputFile.readAsStringSync();
+        // Normalize Windows line endings to Unix line endings so that the
+        // comparison doesn't fail on Windows.
+        actualContents = actualContents.replaceAll('\r\n', '\n');
+        if (expectedContents != actualContents) {
+          return false;
+        }
+      }
+      int nonHiddenFileCount = 0;
+      outputDirectory
+          .listSync(recursive: false, followLinks: false)
+          .forEach((FileSystemEntity fileSystemEntity) {
+        if (fileSystemEntity is File &&
+            !basename(fileSystemEntity.path).startsWith('.')) {
+          nonHiddenFileCount++;
+        }
+      });
+      if (nonHiddenFileCount != map.length) {
+        // The number of files generated doesn't match the number we expected to
+        // generate.
+        return false;
+      }
+    } catch (e) {
+      // There was a problem reading the file (most likely because it didn't
+      // exist).  Treat that the same as if the file doesn't have the expected
+      // contents.
+      return false;
+    }
+    return true;
+  }
+
+  @override
+  Future<void> generate(String pkgPath) async {
+    Directory outputDirectory = output(pkgPath);
+    try {
+      // delete the contents of the directory (and the directory itself)
+      outputDirectory.deleteSync(recursive: true);
+    } catch (e) {
+      // Error caught while trying to delete the directory, this can happen if
+      // it didn't yet exist.
+    }
+    // re-create the empty directory
+    outputDirectory.createSync(recursive: true);
+
+    // generate all of the files in the directory
+    Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
+    for (String file in map.keys) {
+      FileContentsComputer fileContentsComputer = map[file];
+      File outputFile = new File(posix.join(outputDirectory.path, file));
+      print('  ${outputFile.path}');
+      String contents = await fileContentsComputer(pkgPath);
+      outputFile.writeAsStringSync(contents);
+    }
+  }
+
+  @override
+  Directory output(String pkgPath) =>
+      new Directory(join(pkgPath, joinAll(posix.split(outputDirPath))));
+}
+
+/**
+ * Class representing a single output file (either generated code or generated
+ * HTML).
+ */
+class GeneratedFile extends GeneratedContent {
+  /**
+   * The output file to which generated output should be written, relative to
+   * the "tool/spec" directory.  This filename uses the posix path separator
+   * ('/') regardless of the OS.
+   */
+  final String outputPath;
+
+  /**
+   * Callback function which computes the file.
+   */
+  final FileContentsComputer computeContents;
+
+  GeneratedFile(this.outputPath, this.computeContents);
+
+  bool get isDartFile => outputPath.endsWith('.dart');
+
+  @override
+  Future<bool> check(String pkgPath) async {
+    File outputFile = output(pkgPath);
+    String expectedContents = await computeContents(pkgPath);
+    if (isDartFile) {
+      expectedContents = DartFormat.formatText(expectedContents);
+    }
+    try {
+      String actualContents = outputFile.readAsStringSync();
+      // Normalize Windows line endings to Unix line endings so that the
+      // comparison doesn't fail on Windows.
+      actualContents = actualContents.replaceAll('\r\n', '\n');
+      return expectedContents == actualContents;
+    } catch (e) {
+      // There was a problem reading the file (most likely because it didn't
+      // exist).  Treat that the same as if the file doesn't have the expected
+      // contents.
+      return false;
+    }
+  }
+
+  @override
+  Future<void> generate(String pkgPath) async {
+    File outputFile = output(pkgPath);
+    print('  ${outputFile.path}');
+    String contents = await computeContents(pkgPath);
+    outputFile.writeAsStringSync(contents);
+    if (isDartFile) {
+      DartFormat.formatFile(outputFile);
+    }
+  }
+
+  @override
+  File output(String pkgPath) =>
+      new File(join(pkgPath, joinAll(posix.split(outputPath))));
+}
+
+/**
  * Mixin class for generating HTML representations of code that are suitable
  * for enclosing inside a <pre> element.
  */
@@ -384,265 +646,3 @@
     }
   }
 }
-
-/**
- * Type of functions used to compute the contents of a set of generated files.
- * [pkgPath] is the path to the current package.
- */
-typedef Map<String, FileContentsComputer> DirectoryContentsComputer(
-    String pkgPath);
-
-/**
- * Type of functions used to compute the contents of a generated file.
- * [pkgPath] is the path to the current package.
- */
-typedef Future<String> FileContentsComputer(String pkgPath);
-
-/**
- * Abstract base class representing behaviors common to generated files and
- * generated directories.
- */
-abstract class GeneratedContent {
-  /**
-   * Check whether the [output] has the correct contents, and return true if it
-   * does.  [pkgPath] is the path to the current package.
-   */
-  Future<bool> check(String pkgPath);
-
-  /**
-   * Replace the [output] with the correct contents.  [pkgPath] is the path to
-   * the current package.
-   */
-  Future<Null> generate(String pkgPath);
-
-  /**
-   * Get a [FileSystemEntity] representing the output file or directory.
-   * [pkgPath] is the path to the current package.
-   */
-  FileSystemEntity output(String pkgPath);
-
-  /**
-   * Check that all of the [targets] are up to date.  If they are not, print
-   * out a message instructing the user to regenerate them, and exit with a
-   * nonzero error code.
-   *
-   * [pkgPath] is the path to the current package.  [generatorRelPath] is the
-   * path to a .dart script the user may use to regenerate the targets.
-   *
-   * To avoid mistakes when run on Windows, [generatorRelPath] always uses
-   * POSIX directory separators.
-   */
-  static Future<Null> checkAll(String pkgPath, String generatorRelPath,
-      Iterable<GeneratedContent> targets) async {
-    bool generateNeeded = false;
-    for (GeneratedContent target in targets) {
-      bool ok = await target.check(pkgPath);
-      if (!ok) {
-        print("${target.output(pkgPath).absolute}"
-            " doesn't have expected contents.");
-        generateNeeded = true;
-      }
-    }
-    if (generateNeeded) {
-      print('Please regenerate using:');
-      String executable = Platform.executable;
-      String packageRoot = '';
-      // ignore: deprecated_member_use
-      if (Platform.packageRoot != null) {
-        // ignore: deprecated_member_use
-        packageRoot = ' --package-root=${Platform.packageRoot}';
-      }
-      String generateScript =
-          join(pkgPath, joinAll(posix.split(generatorRelPath)));
-      print('  $executable$packageRoot $generateScript');
-      exit(1);
-    } else {
-      print('All generated files up to date.');
-    }
-  }
-
-  /**
-   * Regenerate all of the [targets].  [pkgPath] is the path to the current
-   * package.
-   */
-  static Future<Null> generateAll(
-      String pkgPath, Iterable<GeneratedContent> targets) async {
-    print("Generating...");
-    for (GeneratedContent target in targets) {
-      await target.generate(pkgPath);
-    }
-  }
-}
-
-/**
- * Class representing a single output directory (either generated code or
- * generated HTML). No other content should exist in the directory.
- */
-class GeneratedDirectory extends GeneratedContent {
-  /**
-   * The path to the directory that will have the generated content.
-   */
-  final String outputDirPath;
-
-  /**
-   * Callback function that computes the directory contents.
-   */
-  final DirectoryContentsComputer directoryContentsComputer;
-
-  GeneratedDirectory(this.outputDirPath, this.directoryContentsComputer);
-
-  @override
-  Future<bool> check(String pkgPath) async {
-    Directory outputDirectory = output(pkgPath);
-    Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
-    try {
-      for (String file in map.keys) {
-        FileContentsComputer fileContentsComputer = map[file];
-        String expectedContents = await fileContentsComputer(pkgPath);
-        File outputFile = new File(posix.join(outputDirectory.path, file));
-        String actualContents = outputFile.readAsStringSync();
-        // Normalize Windows line endings to Unix line endings so that the
-        // comparison doesn't fail on Windows.
-        actualContents = actualContents.replaceAll('\r\n', '\n');
-        if (expectedContents != actualContents) {
-          return false;
-        }
-      }
-      int nonHiddenFileCount = 0;
-      outputDirectory
-          .listSync(recursive: false, followLinks: false)
-          .forEach((FileSystemEntity fileSystemEntity) {
-        if (fileSystemEntity is File &&
-            !basename(fileSystemEntity.path).startsWith('.')) {
-          nonHiddenFileCount++;
-        }
-      });
-      if (nonHiddenFileCount != map.length) {
-        // The number of files generated doesn't match the number we expected to
-        // generate.
-        return false;
-      }
-    } catch (e) {
-      // There was a problem reading the file (most likely because it didn't
-      // exist).  Treat that the same as if the file doesn't have the expected
-      // contents.
-      return false;
-    }
-    return true;
-  }
-
-  @override
-  Future<Null> generate(String pkgPath) async {
-    Directory outputDirectory = output(pkgPath);
-    try {
-      // delete the contents of the directory (and the directory itself)
-      outputDirectory.deleteSync(recursive: true);
-    } catch (e) {
-      // Error caught while trying to delete the directory, this can happen if
-      // it didn't yet exist.
-    }
-    // re-create the empty directory
-    outputDirectory.createSync(recursive: true);
-
-    // generate all of the files in the directory
-    Map<String, FileContentsComputer> map = directoryContentsComputer(pkgPath);
-    for (String file in map.keys) {
-      FileContentsComputer fileContentsComputer = map[file];
-      File outputFile = new File(posix.join(outputDirectory.path, file));
-      print('  ${outputFile.path}');
-      String contents = await fileContentsComputer(pkgPath);
-      outputFile.writeAsStringSync(contents);
-    }
-  }
-
-  @override
-  Directory output(String pkgPath) =>
-      new Directory(join(pkgPath, joinAll(posix.split(outputDirPath))));
-}
-
-/**
- * Class representing a single output file (either generated code or generated
- * HTML).
- */
-class GeneratedFile extends GeneratedContent {
-  /**
-   * The output file to which generated output should be written, relative to
-   * the "tool/spec" directory.  This filename uses the posix path separator
-   * ('/') regardless of the OS.
-   */
-  final String outputPath;
-
-  /**
-   * Callback function which computes the file.
-   */
-  final FileContentsComputer computeContents;
-
-  GeneratedFile(this.outputPath, this.computeContents);
-
-  bool get isDartFile => outputPath.endsWith('.dart');
-
-  @override
-  Future<bool> check(String pkgPath) async {
-    File outputFile = output(pkgPath);
-    String expectedContents = await computeContents(pkgPath);
-    if (isDartFile) {
-      expectedContents = DartFormat.formatText(expectedContents);
-    }
-    try {
-      String actualContents = outputFile.readAsStringSync();
-      // Normalize Windows line endings to Unix line endings so that the
-      // comparison doesn't fail on Windows.
-      actualContents = actualContents.replaceAll('\r\n', '\n');
-      return expectedContents == actualContents;
-    } catch (e) {
-      // There was a problem reading the file (most likely because it didn't
-      // exist).  Treat that the same as if the file doesn't have the expected
-      // contents.
-      return false;
-    }
-  }
-
-  @override
-  Future<Null> generate(String pkgPath) async {
-    File outputFile = output(pkgPath);
-    print('  ${outputFile.path}');
-    String contents = await computeContents(pkgPath);
-    outputFile.writeAsStringSync(contents);
-    if (isDartFile) {
-      DartFormat.formatFile(outputFile);
-    }
-  }
-
-  @override
-  File output(String pkgPath) =>
-      new File(join(pkgPath, joinAll(posix.split(outputPath))));
-}
-
-/**
- * A utility class for invoking dartfmt.
- */
-class DartFormat {
-  static String get _dartfmtPath {
-    String binName = Platform.isWindows ? 'dartfmt.bat' : 'dartfmt';
-    for (var loc in [binName, join('dart-sdk', 'bin', binName)]) {
-      var candidatePath = join(dirname(Platform.resolvedExecutable), loc);
-      if (new File(candidatePath).existsSync()) {
-        return candidatePath;
-      }
-    }
-    throw new StateError('Could not find dartfmt executable');
-  }
-
-  static void formatFile(File file) {
-    ProcessResult result = Process.runSync(_dartfmtPath, ['-w', file.path]);
-    if (result.exitCode != 0) throw result.stderr;
-  }
-
-  static String formatText(String text) {
-    File file = new File(join(Directory.systemTemp.path, 'gen.dart'));
-    file.writeAsStringSync(text);
-    ProcessResult result = Process.runSync(_dartfmtPath, ['-w', file.path]);
-    if (result.exitCode != 0) throw result.stderr;
-    return file.readAsStringSync();
-  }
-}
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 904684c..c39ec25 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -15,7 +15,6 @@
 const String analysisOptionsFileOption = 'options';
 const String bazelAnalysisOptionsPath =
     'package:dart.analysis_options/default.yaml';
-const String declarationCastsFlag = 'declaration-casts';
 const String defineVariableOption = 'D';
 const String enableInitializingFormalAccessFlag = 'initializing-formal-access';
 @deprecated
@@ -47,13 +46,6 @@
     options.implicitCasts = args[implicitCastsFlag];
     verbose('$implicitCastsFlag = ${options.implicitCasts}');
   }
-  if (args.wasParsed(declarationCastsFlag)) {
-    options.declarationCasts = args[declarationCastsFlag];
-    verbose('$declarationCastsFlag = ${options.declarationCasts}');
-  } else if (args.wasParsed(implicitCastsFlag)) {
-    options.declarationCasts = args[implicitCastsFlag];
-    verbose('$declarationCastsFlag = ${options.declarationCasts}');
-  }
   if (args.wasParsed(noImplicitDynamicFlag)) {
     options.implicitDynamic = !args[noImplicitDynamicFlag];
     verbose('$noImplicitDynamicFlag = ${options.implicitDynamic}');
@@ -162,10 +154,10 @@
       defaultsTo: true,
       hide: true,
       negatable: true);
-  parser.addFlag(declarationCastsFlag,
+  parser.addFlag('declaration-casts',
       negatable: true,
       help: 'Disable declaration casts in strong mode (https://goo.gl/cTLz40)\n'
-          'This option is deprecated and will be removed in a future release.',
+          'This option is now ignored and will be removed in a future release.',
       hide: ddc && hide);
   parser.addFlag(implicitCastsFlag,
       negatable: true,
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 8c7104e..960c862 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -1,10 +1,12 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:collection';
 import 'dart:core';
 
+import 'package:analyzer/dart/analysis/analysis_context.dart' as api;
+import 'package:analyzer/dart/analysis/context_locator.dart' as api;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
@@ -15,27 +17,32 @@
         flutterAnalysisOptionsPath;
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/context/context_root.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/context_root.dart' as api;
 import 'package:analyzer/src/dart/analysis/driver.dart'
     show AnalysisDriver, AnalysisDriverScheduler;
+import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart'
+    as api;
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/bazel.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/gn.dart';
-import 'package:analyzer/src/generated/package_build.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/workspace.dart';
+import 'package:analyzer/src/hint/sdk_constraint_extractor.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/plugin/resolver_provider.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/util/uri.dart';
+import 'package:analyzer/src/workspace/basic.dart';
+import 'package:analyzer/src/workspace/bazel.dart';
+import 'package:analyzer/src/workspace/gn.dart';
+import 'package:analyzer/src/workspace/package_build.dart';
+import 'package:analyzer/src/workspace/pub.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:args/args.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/packages_file.dart';
 import 'package:package_config/src/packages_impl.dart';
@@ -131,9 +138,10 @@
   FileContentOverlay fileContentOverlay;
 
   /**
-   * Whether to enable the Dart 2.0 preview.
+   * Whether any analysis driver created through this interface should support
+   * indexing and search.
    */
-  bool get previewDart2 => true;
+  bool enableIndex = false;
 
   /**
    * Initialize a newly created builder to be ready to build a context rooted in
@@ -155,7 +163,6 @@
     AnalysisOptionsImpl options = getAnalysisOptions(path);
     context.contentCache = contentCache;
     context.sourceFactory = createSourceFactory(path, options);
-    options.previewDart2 = previewDart2;
     context.analysisOptions = options;
     context.name = path;
     //_processAnalysisOptions(context, optionMap);
@@ -172,7 +179,11 @@
     AnalysisOptions options =
         getAnalysisOptions(path, contextRoot: contextRoot);
     //_processAnalysisOptions(context, optionMap);
-    final sf = createSourceFactory(path, options);
+    SummaryDataStore summaryData;
+    if (builderOptions.librarySummaryPaths != null) {
+      summaryData = SummaryDataStore(builderOptions.librarySummaryPaths);
+    }
+    final sf = createSourceFactory(path, options, summaryData: summaryData);
 
     AnalysisDriver driver = new AnalysisDriver(
         analysisDriverScheduler,
@@ -182,7 +193,23 @@
         fileContentOverlay,
         contextRoot,
         sf,
-        options);
+        options,
+        enableIndex: enableIndex,
+        externalSummaries: summaryData);
+
+    // Set API AnalysisContext for the driver.
+    var apiContextRoots = api.ContextLocator(
+      resourceProvider: resourceProvider,
+    ).locateRoots(
+      includedPaths: [contextRoot.root],
+      excludedPaths: contextRoot.exclude,
+    );
+    driver.analysisContext = api.DriverBasedAnalysisContext(
+      resourceProvider,
+      apiContextRoots.first,
+      driver,
+    );
+
     // temporary plugin support:
     if (onCreateAnalysisDriver != null) {
       onCreateAnalysisDriver(driver, analysisDriverScheduler, performanceLog,
@@ -255,23 +282,15 @@
     return findPackagesFromFile(rootDirectoryPath);
   }
 
-  SourceFactory createSourceFactory(String rootPath, AnalysisOptions options) {
-    Workspace workspace = createWorkspace(rootPath);
+  SourceFactory createSourceFactory(String rootPath, AnalysisOptions options,
+      {SummaryDataStore summaryData}) {
+    Workspace workspace =
+        ContextBuilder.createWorkspace(resourceProvider, rootPath, this);
     DartSdk sdk = findSdk(workspace.packageMap, options);
-    return workspace.createSourceFactory(sdk);
-  }
-
-  Workspace createWorkspace(String rootPath) {
-    if (_hasPackageFileInPath(rootPath)) {
-      // Bazel workspaces that include package files are treated like normal
-      // (non-Bazel) directories. But may still use package:build.
-      return PackageBuildWorkspace.find(resourceProvider, rootPath, this) ??
-          _BasicWorkspace.find(resourceProvider, rootPath, this);
+    if (summaryData != null && sdk is SummaryBasedDartSdk) {
+      summaryData.addBundle(null, sdk.bundle);
     }
-    Workspace workspace = BazelWorkspace.find(resourceProvider, rootPath);
-    workspace ??= GnWorkspace.find(resourceProvider, rootPath);
-    workspace ??= PackageBuildWorkspace.find(resourceProvider, rootPath, this);
-    return workspace ?? _BasicWorkspace.find(resourceProvider, rootPath, this);
+    return workspace.createSourceFactory(sdk, summaryData);
   }
 
   /**
@@ -413,8 +432,9 @@
 
     // TODO(danrubel) restructure so that we don't create a workspace
     // both here and in createSourceFactory
-    Workspace workspace = createWorkspace(path);
-    SourceFactory sourceFactory = workspace.createSourceFactory(null);
+    Workspace workspace =
+        ContextBuilder.createWorkspace(resourceProvider, path, this);
+    SourceFactory sourceFactory = workspace.createSourceFactory(null, null);
     AnalysisOptionsProvider optionsProvider =
         new AnalysisOptionsProvider(sourceFactory);
 
@@ -472,6 +492,16 @@
     } else {
       verbose('Using default analysis options');
     }
+
+    var pubspecFile = _findPubspecFile(path);
+    if (pubspecFile != null) {
+      var extractor = new SdkConstraintExtractor(pubspecFile);
+      var sdkVersionConstraint = extractor.constraint();
+      if (sdkVersionConstraint != null) {
+        options.sdkVersionConstraint = sdkVersionConstraint;
+      }
+    }
+
     return options;
   }
 
@@ -606,10 +636,29 @@
   }
 
   /**
+   * Return the `pubspec.yaml` file that should be used when analyzing code in
+   * the directory with the given [path], possibly `null`.
+   */
+  File _findPubspecFile(String path) {
+    var resource = resourceProvider.getResource(path);
+    while (resource != null) {
+      if (resource is Folder) {
+        File pubspecFile = resource.getChildAssumingFile('pubspec.yaml');
+        if (pubspecFile.exists) {
+          return pubspecFile;
+        }
+      }
+      resource = resource.parent;
+    }
+    return null;
+  }
+
+  /**
    * Return `true` if either the directory at [rootPath] or a parent of that
    * directory contains a `.packages` file.
    */
-  bool _hasPackageFileInPath(String rootPath) {
+  static bool _hasPackageFileInPath(
+      ResourceProvider resourceProvider, String rootPath) {
     Folder folder = resourceProvider.getFolder(rootPath);
     while (folder != null) {
       File file = folder.getChildAssumingFile('.packages');
@@ -620,6 +669,26 @@
     }
     return false;
   }
+
+  static Workspace createWorkspace(ResourceProvider resourceProvider,
+      String rootPath, ContextBuilder contextBuilder) {
+    if (_hasPackageFileInPath(resourceProvider, rootPath)) {
+      // A Bazel or Gn workspace that includes a '.packages' file is treated
+      // like a normal (non-Bazel/Gn) directory. But may still use
+      // package:build or Pub.
+      return PackageBuildWorkspace.find(
+              resourceProvider, rootPath, contextBuilder) ??
+          PubWorkspace.find(resourceProvider, rootPath, contextBuilder) ??
+          BasicWorkspace.find(resourceProvider, rootPath, contextBuilder);
+    }
+    Workspace workspace = BazelWorkspace.find(resourceProvider, rootPath);
+    workspace ??= GnWorkspace.find(resourceProvider, rootPath);
+    workspace ??=
+        PackageBuildWorkspace.find(resourceProvider, rootPath, contextBuilder);
+    workspace ??= PubWorkspace.find(resourceProvider, rootPath, contextBuilder);
+    return workspace ??
+        BasicWorkspace.find(resourceProvider, rootPath, contextBuilder);
+  }
 }
 
 /**
@@ -674,6 +743,12 @@
   String defaultPackagesDirectoryPath;
 
   /**
+   * A list of the paths of summary files that are to be used, or `null` if no
+   * summary information is available.
+   */
+  List<String> librarySummaryPaths;
+
+  /**
    * Initialize a newly created set of options
    */
   ContextBuilderOptions();
@@ -773,71 +848,3 @@
     }
   }
 }
-
-/**
- * Information about a default Dart workspace.
- */
-class _BasicWorkspace extends Workspace {
-  /**
-   * The [ResourceProvider] by which paths are converted into [Resource]s.
-   */
-  final ResourceProvider provider;
-
-  /**
-   * The absolute workspace root path.
-   */
-  final String root;
-
-  final ContextBuilder _builder;
-
-  Map<String, List<Folder>> _packageMap;
-
-  Packages _packages;
-
-  _BasicWorkspace._(this.provider, this.root, this._builder);
-
-  @override
-  Map<String, List<Folder>> get packageMap {
-    _packageMap ??= _builder.convertPackagesToMap(packages);
-    return _packageMap;
-  }
-
-  Packages get packages {
-    _packages ??= _builder.createPackageMap(root);
-    return _packages;
-  }
-
-  @override
-  UriResolver get packageUriResolver =>
-      new PackageMapUriResolver(provider, packageMap);
-
-  @override
-  SourceFactory createSourceFactory(DartSdk sdk) {
-    List<UriResolver> resolvers = <UriResolver>[];
-    if (sdk != null) {
-      resolvers.add(new DartUriResolver(sdk));
-    }
-    resolvers.add(packageUriResolver);
-    resolvers.add(new ResourceUriResolver(provider));
-    return new SourceFactory(resolvers, packages, provider);
-  }
-
-  /**
-   * Find the basic workspace that contains the given [path].
-   */
-  static _BasicWorkspace find(
-      ResourceProvider provider, String path, ContextBuilder builder) {
-    Context context = provider.pathContext;
-
-    // Ensure that the path is absolute and normalized.
-    if (!context.isAbsolute(path)) {
-      throw new ArgumentError('not absolute: $path');
-    }
-    path = context.normalize(path);
-    Resource resource = provider.getResource(path);
-    if (resource is File) {
-      path = resource.parent.path;
-    }
-    return new _BasicWorkspace._(provider, path, builder);
-  }
-}
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index 2dc5cfd..eebc966 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -262,66 +262,9 @@
 
   @override
   void set analysisOptions(AnalysisOptions options) {
-    bool needsRecompute = this._options.analyzeFunctionBodiesPredicate !=
-            options.analyzeFunctionBodiesPredicate ||
-        this._options.generateImplicitErrors !=
-            options.generateImplicitErrors ||
-        this._options.generateSdkErrors != options.generateSdkErrors ||
-        this._options.dart2jsHint != options.dart2jsHint ||
-        _notEqual(
-            this._options.enabledPluginNames, options.enabledPluginNames) ||
-        _notEqual(this._options.errorProcessors, options.errorProcessors) ||
-        _notEqual(this._options.excludePatterns, options.excludePatterns) ||
-        (this._options.hint && !options.hint) ||
-        (this._options.lint && !options.lint) ||
-        _notEqual(this._options.lintRules, options.lintRules) ||
-        this._options.preserveComments != options.preserveComments ||
-        this._options.useFastaParser != options.useFastaParser ||
-        this._options.enableLazyAssignmentOperators !=
-            options.enableLazyAssignmentOperators ||
-        ((options is AnalysisOptionsImpl)
-            ? this._options.strongModeHints != options.strongModeHints
-            : false) ||
-        ((options is AnalysisOptionsImpl)
-            ? this._options.declarationCasts != options.declarationCasts
-            : false) ||
-        ((options is AnalysisOptionsImpl)
-            ? this._options.implicitCasts != options.implicitCasts
-            : false) ||
-        ((options is AnalysisOptionsImpl)
-            ? this._options.implicitDynamic != options.implicitDynamic
-            : false) ||
-        !_samePatchPaths(this._options.patchPaths, options.patchPaths);
-    this._options.analyzeFunctionBodiesPredicate =
-        options.analyzeFunctionBodiesPredicate;
-    this._options.generateImplicitErrors = options.generateImplicitErrors;
-    this._options.generateSdkErrors = options.generateSdkErrors;
-    this._options.dart2jsHint = options.dart2jsHint;
-    this._options.enableLazyAssignmentOperators =
-        options.enableLazyAssignmentOperators;
-    this._options.enableTiming = options.enableTiming;
-    this._options.enabledPluginNames = options.enabledPluginNames;
-    this._options.errorProcessors = options.errorProcessors;
-    this._options.excludePatterns = options.excludePatterns;
-    this._options.hint = options.hint;
-    this._options.lint = options.lint;
-    this._options.lintRules = options.lintRules;
-    this._options.preserveComments = options.preserveComments;
-    this._options.useFastaParser = options.useFastaParser;
-    this._options.trackCacheDependencies = options.trackCacheDependencies;
-    this._options.disableCacheFlushing = options.disableCacheFlushing;
-    this._options.patchPaths = options.patchPaths;
-    if (options is AnalysisOptionsImpl) {
-      this._options.strongModeHints = options.strongModeHints;
-      this._options.declarationCasts = options.declarationCasts;
-      this._options.implicitCasts = options.implicitCasts;
-      this._options.implicitDynamic = options.implicitDynamic;
-      this._options.isMixinSupportEnabled = options.isMixinSupportEnabled;
-    }
-    if (needsRecompute) {
-      for (WorkManager workManager in workManagers) {
-        workManager.onAnalysisOptionsChanged();
-      }
+    this._options = options;
+    for (WorkManager workManager in workManagers) {
+      workManager.onAnalysisOptionsChanged();
     }
   }
 
@@ -1655,19 +1598,6 @@
     AnalysisEngine.instance.logger.logInformation(message);
   }
 
-  bool _notEqual<T>(List<T> first, List<T> second) {
-    int length = first.length;
-    if (length != second.length) {
-      return true;
-    }
-    for (int i = 0; i < length; i++) {
-      if (first[i] != second[i]) {
-        return true;
-      }
-    }
-    return false;
-  }
-
   /**
    * Notify all of the analysis listeners that the errors associated with the
    * given [source] has been updated to the given [errors].
@@ -1808,21 +1738,6 @@
     _removeFromCache(source);
     _removeFromPriorityOrder(source);
   }
-
-  static bool _samePatchPaths(
-      Map<String, List<String>> a, Map<String, List<String>> b) {
-    if (a.length != b.length) return false;
-    for (var key in a.keys) {
-      if (!b.containsKey(key)) return false;
-      var aValue = a[key];
-      var bValue = b[key];
-      if (aValue.length != bValue.length) return false;
-      for (var i = 0; i < aValue.length; i++) {
-        if (aValue[i] != bValue[i]) return false;
-      }
-    }
-    return true;
-  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 6c3b58e..70abd3dc 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -101,6 +101,14 @@
   }
 
   @override
+  void clearCache() {
+    _absoluteUriToSourceCache.clear();
+    for (var resolver in resolvers) {
+      resolver.clearCache();
+    }
+  }
+
+  @override
   SourceFactory clone() {
     SourceFactory factory =
         new SourceFactory(resolvers, _packages, _resourceProvider);
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index a474878..f844029 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -4,10 +4,11 @@
 
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
-import 'package:analyzer/dart/analysis/context_builder.dart';
 import 'package:analyzer/dart/analysis/context_locator.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/dart/analysis/context_builder.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:meta/meta.dart';
 
 /// An implementation of [AnalysisContextCollection].
@@ -20,7 +21,9 @@
 
   /// Initialize a newly created analysis context manager.
   AnalysisContextCollectionImpl(
-      {@required List<String> includedPaths,
+      {bool enableIndex: false,
+      @deprecated FileContentOverlay fileContentOverlay,
+      @required List<String> includedPaths,
       ResourceProvider resourceProvider,
       String sdkPath})
       : resourceProvider =
@@ -35,11 +38,15 @@
     );
     var roots = contextLocator.locateRoots(includedPaths: includedPaths);
     for (var root in roots) {
-      var contextBuilder = new ContextBuilder(
+      var contextBuilder = new ContextBuilderImpl(
         resourceProvider: this.resourceProvider,
       );
-      var context =
-          contextBuilder.createContext(contextRoot: root, sdkPath: sdkPath);
+      var context = contextBuilder.createContext(
+        contextRoot: root,
+        enableIndex: enableIndex,
+        fileContentOverlay: fileContentOverlay,
+        sdkPath: sdkPath,
+      );
       contexts.add(context);
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/ast_provider_driver.dart b/pkg/analyzer/lib/src/dart/analysis/ast_provider_driver.dart
deleted file mode 100644
index 21c2297..0000000
--- a/pkg/analyzer/lib/src/dart/analysis/ast_provider_driver.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/ast_provider.dart';
-
-/**
- * [AstProvider] implementation for [AnalysisDriver].
- */
-class AstProviderForDriver implements AstProvider {
-  final AnalysisDriver driver;
-
-  AstProviderForDriver(this.driver);
-
-  @override
-  Future<SimpleIdentifier> getParsedNameForElement(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    CompilationUnit unit = await getParsedUnitForElement(element);
-    return _getNameNode(unit, element);
-  }
-
-  @override
-  Future<CompilationUnit> getParsedUnitForElement(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    String path = element.source.fullName;
-    ParseResult parseResult = await driver.parseFile(path);
-    return parseResult.unit;
-  }
-
-  @override
-  Future<SimpleIdentifier> getResolvedNameForElement(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    CompilationUnit unit = await getResolvedUnitForElement(element);
-    return _getNameNode(unit, element);
-  }
-
-  @override
-  Future<CompilationUnit> getResolvedUnitForElement(Element element) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    String path = element.source.fullName;
-    AnalysisResult analysisResult = await driver.getResult(path);
-    return analysisResult?.unit;
-  }
-
-  SimpleIdentifier _getNameNode(CompilationUnit unit, Element element) {
-    int nameOffset = element.nameOffset;
-    if (nameOffset == -1) {
-      return null;
-    }
-    AstNode nameNode = new NodeLocator(nameOffset).searchWithin(unit);
-    if (nameNode is SimpleIdentifier) {
-      return nameNode;
-    }
-    return null;
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index f835eb6..074d46d 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -11,18 +11,18 @@
 import 'package:analyzer/src/context/builder.dart' as old
     show ContextBuilder, ContextBuilderOptions;
 import 'package:analyzer/src/context/context_root.dart' as old;
+import 'package:analyzer/src/dart/analysis/byte_store.dart'
+    show ByteStore, MemoryByteStore;
 import 'package:analyzer/src/dart/analysis/driver.dart'
     show AnalysisDriver, AnalysisDriverScheduler;
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart'
     show FileContentOverlay;
+import 'package:analyzer/src/dart/analysis/performance_logger.dart'
+    show PerformanceLog;
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
 import 'package:analyzer/src/generated/source.dart' show ContentCache;
-import 'package:analyzer/src/dart/analysis/performance_logger.dart'
-    show PerformanceLog;
-import 'package:analyzer/src/dart/analysis/byte_store.dart'
-    show ByteStore, MemoryByteStore;
 import 'package:meta/meta.dart';
 
 /**
@@ -55,10 +55,15 @@
       {@deprecated ByteStore byteStore,
       @required ContextRoot contextRoot,
       DeclaredVariables declaredVariables,
+      bool enableIndex: false,
+      @deprecated FileContentOverlay fileContentOverlay,
+      List<String> librarySummaryPaths,
       @deprecated PerformanceLog performanceLog,
       @deprecated AnalysisDriverScheduler scheduler,
-      String sdkPath}) {
+      String sdkPath,
+      String sdkSummaryPath}) {
     byteStore ??= new MemoryByteStore();
+    fileContentOverlay ??= new FileContentOverlay();
     performanceLog ??= new PerformanceLog(new StringBuffer());
 
     sdkPath ??= _defaultSdkPath;
@@ -78,6 +83,12 @@
     if (declaredVariables != null) {
       options.declaredVariables = _toMap(declaredVariables);
     }
+    if (sdkSummaryPath != null) {
+      options.dartSdkSummaryPath = sdkSummaryPath;
+    }
+    if (librarySummaryPaths != null) {
+      options.librarySummaryPaths = librarySummaryPaths;
+    }
     options.defaultPackageFilePath = contextRoot.packagesFile?.path;
 
     old.ContextBuilder builder = new old.ContextBuilder(
@@ -85,7 +96,8 @@
         options: options);
     builder.analysisDriverScheduler = scheduler;
     builder.byteStore = byteStore;
-    builder.fileContentOverlay = new FileContentOverlay();
+    builder.fileContentOverlay = fileContentOverlay;
+    builder.enableIndex = enableIndex;
     builder.performanceLog = performanceLog;
 
     old.ContextRoot oldContextRoot = new old.ContextRoot(
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index 4422823..220e865 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -13,20 +13,24 @@
 import 'package:analyzer/src/context/builder.dart'
     show ContextBuilder, ContextBuilderOptions;
 import 'package:analyzer/src/context/context_root.dart' as old;
+import 'package:analyzer/src/dart/analysis/byte_store.dart'
+    show MemoryByteStore;
 import 'package:analyzer/src/dart/analysis/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart'
     show AnalysisDriver, AnalysisDriverScheduler;
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart'
     show FileContentOverlay;
-import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk;
-import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
-import 'package:analyzer/src/generated/source.dart' show ContentCache;
 import 'package:analyzer/src/dart/analysis/performance_logger.dart'
     show PerformanceLog;
-import 'package:analyzer/src/dart/analysis/byte_store.dart'
-    show MemoryByteStore;
+import 'package:analyzer/src/dart/sdk/sdk.dart' show FolderBasedDartSdk;
+import 'package:analyzer/src/generated/sdk.dart' show DartSdkManager;
+import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/util/yaml.dart';
+import 'package:glob/glob.dart';
 import 'package:meta/meta.dart';
+import 'package:path/path.dart';
+import 'package:yaml/yaml.dart';
 
 /**
  * An implementation of a context locator.
@@ -91,7 +95,7 @@
     scheduler.start();
     ContextBuilderOptions options = new ContextBuilderOptions();
     ContextBuilder builder = new ContextBuilder(
-        resourceProvider, sdkManager, new ContentCache(),
+        resourceProvider, sdkManager, null,
         options: options);
     if (packagesFile != null) {
       options.defaultPackageFilePath = packagesFile;
@@ -175,7 +179,7 @@
       root.included.add(folder);
       roots.add(root);
       _createContextRootsIn(roots, folder, excludedFolders, root,
-          defaultOptionsFile, defaultPackagesFile);
+          _getExcludedFiles(root), defaultOptionsFile, defaultPackagesFile);
     }
     Map<Folder, ContextRoot> rootMap = <Folder, ContextRoot>{};
     for (File file in includedFiles) {
@@ -208,14 +212,16 @@
    * If either the [optionsFile] or [packagesFile] is non-`null` then the given
    * file will be used even if there is a local version of the file.
    *
-   * For each directory within the given [folder] that is not in the list of
-   * [excludedFolders], recursively search for nested context roots.
+   * For each directory within the given [folder] that is neither in the list of
+   * [excludedFolders] nor excluded by the [excludedFilePatterns], recursively
+   * search for nested context roots.
    */
   void _createContextRoots(
       List<ContextRoot> roots,
       Folder folder,
       List<Folder> excludedFolders,
       ContextRoot containingRoot,
+      List<Glob> excludedFilePatterns,
       File optionsFile,
       File packagesFile) {
     //
@@ -248,14 +254,16 @@
       containingRoot.excluded.add(folder);
       roots.add(root);
       containingRoot = root;
+      excludedFilePatterns = _getExcludedFiles(root);
     }
     _createContextRootsIn(roots, folder, excludedFolders, containingRoot,
-        optionsFile, packagesFile);
+        excludedFilePatterns, optionsFile, packagesFile);
   }
 
   /**
-   * For each directory within the given [folder] that is not in the list of
-   * [excludedFolders], recursively search for nested context roots.
+   * For each directory within the given [folder] that is neither in the list of
+   * [excludedFolders] nor excluded by the [excludedFilePatterns], recursively
+   * search for nested context roots and add them to the list of [roots].
    *
    * If either the [optionsFile] or [packagesFile] is non-`null` then the given
    * file will be used even if there is a local version of the file.
@@ -265,8 +273,22 @@
       Folder folder,
       List<Folder> excludedFolders,
       ContextRoot containingRoot,
+      List<Glob> excludedFilePatterns,
       File optionsFile,
       File packagesFile) {
+    bool isExcluded(Folder folder) {
+      if (excludedFolders.contains(folder) ||
+          folder.shortName.startsWith('.')) {
+        return true;
+      }
+      for (Glob pattern in excludedFilePatterns) {
+        if (pattern.matches(folder.path)) {
+          return true;
+        }
+      }
+      return false;
+    }
+
     //
     // Check each of the subdirectories to see whether a context root needs to
     // be added for it.
@@ -274,12 +296,11 @@
     try {
       for (Resource child in folder.getChildren()) {
         if (child is Folder) {
-          if (excludedFolders.contains(folder) ||
-              folder.shortName.startsWith('.')) {
-            containingRoot.excluded.add(folder);
+          if (isExcluded(child)) {
+            containingRoot.excluded.add(child);
           } else {
             _createContextRoots(roots, child, excludedFolders, containingRoot,
-                optionsFile, packagesFile);
+                excludedFilePatterns, optionsFile, packagesFile);
           }
         }
       }
@@ -321,6 +342,46 @@
     return null;
   }
 
+  /// Return a list containing the glob patterns used to exclude files from the
+  /// given context [root]. The patterns are extracted from the analysis options
+  /// file associated with the context root. The list will be empty if there are
+  /// no exclusion patterns in the options file, or if there is no options file
+  /// associated with the context root.
+  List<Glob> _getExcludedFiles(ContextRootImpl root) {
+    List<Glob> patterns = [];
+    File optionsFile = root.optionsFile;
+    if (optionsFile != null) {
+      try {
+        String content = optionsFile.readAsStringSync();
+        YamlNode doc = loadYamlNode(content);
+        if (doc is YamlMap) {
+          YamlNode analyzerOptions = getValue(doc, AnalyzerOptions.analyzer);
+          if (analyzerOptions is YamlMap) {
+            YamlNode excludeOptions =
+                getValue(analyzerOptions, AnalyzerOptions.exclude);
+            if (excludeOptions is YamlList) {
+              List<String> excludeList = toStringList(excludeOptions);
+              if (excludeList != null) {
+                for (String excludedPath in excludeList) {
+                  Context context = resourceProvider.pathContext;
+                  if (context.isRelative(excludedPath)) {
+                    excludedPath =
+                        context.join(optionsFile.parent.path, excludedPath);
+                  }
+                  patterns.add(new Glob(excludedPath, context: context));
+                }
+              }
+            }
+          }
+        }
+      } catch (exception) {
+        // If we can't read and parse the analysis options file, then there
+        // aren't any excluded files that need to be read.
+      }
+    }
+    return patterns;
+  }
+
   /**
    * If the given [directory] contains a file with the given [name], then return
    * the file. Otherwise, return `null`.
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
new file mode 100644
index 0000000..4740d58
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
@@ -0,0 +1,767 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/src/dart/analysis/dependency/node.dart';
+import 'package:analyzer/src/dart/analysis/dependency/reference_collector.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/summary/api_signature.dart';
+
+/// Build [Library] that describes nodes and dependencies of the library
+/// with the given [uri] and [units].
+///
+/// If the [units] are just parsed, then only token signatures and referenced
+/// names of nodes can be computed. If the [units] are fully resolved, then
+/// also class member references can be recorded.
+Library buildLibrary(Uri uri, List<CompilationUnit> units) {
+  return _LibraryBuilder(uri, units).build();
+}
+
+/// The `show` or `hide` namespace combinator.
+class Combinator {
+  final bool isShow;
+  final List<String> names;
+
+  Combinator(this.isShow, this.names);
+
+  @override
+  String toString() {
+    if (isShow) {
+      return 'show ' + names.join(', ');
+    } else {
+      return 'hide ' + names.join(', ');
+    }
+  }
+}
+
+/// The `export` directive.
+class Export {
+  /// The absolute URI of the exported library.
+  final Uri uri;
+
+  /// The list of namespace combinators to apply, not `null`.
+  final List<Combinator> combinators;
+
+  Export(this.uri, this.combinators);
+
+  @override
+  String toString() {
+    return 'Export(uri: $uri, combinators: $combinators)';
+  }
+}
+
+/// The `import` directive.
+class Import {
+  /// The absolute URI of the imported library.
+  final Uri uri;
+
+  /// The import prefix, or `null` if not specified.
+  final String prefix;
+
+  /// The list of namespace combinators to apply, not `null`.
+  final List<Combinator> combinators;
+
+  Import(this.uri, this.prefix, this.combinators);
+
+  @override
+  String toString() {
+    return 'Import(uri: $uri, prefix: $prefix, combinators: $combinators)';
+  }
+}
+
+/// The collection of imports, exports, and top-level nodes.
+class Library {
+  /// The absolute URI of the library.
+  final Uri uri;
+
+  /// The list of imports in this library.
+  final List<Import> imports;
+
+  /// The list of exports in this library.
+  final List<Export> exports;
+
+  /// The list of libraries that correspond to the [imports].
+  List<Library> importedLibraries;
+
+  /// The list of top-level nodes defined in the library.
+  ///
+  /// This list is sorted.
+  final List<Node> declaredNodes;
+
+  /// The map of [declaredNodes], used for fast search.
+  /// TODO(scheglov) consider using binary search instead.
+  final Map<LibraryQualifiedName, Node> declaredNodeMap = {};
+
+  /// The list of nodes exported from this library, either using `export`
+  /// directives, or declared in this library.
+  ///
+  /// This list is sorted.
+  List<Node> exportedNodes;
+
+  /// The map of nodes that are visible in the library, either imported,
+  /// or declared in this library.
+  ///
+  /// TODO(scheglov) support for imports with prefixes
+  Map<String, Node> libraryScope;
+
+  Library(this.uri, this.imports, this.exports, this.declaredNodes) {
+    for (var node in declaredNodes) {
+      declaredNodeMap[node.name] = node;
+    }
+  }
+
+  @override
+  String toString() => '$uri';
+}
+
+class _LibraryBuilder {
+  /// The URI of the library.
+  final Uri uri;
+
+  /// The units of the library, parsed or fully resolved.
+  final List<CompilationUnit> units;
+
+  /// The instance of the referenced names, class members collector.
+  final ReferenceCollector referenceCollector = ReferenceCollector();
+
+  /// The list of imports in the library.
+  final List<Import> imports = [];
+
+  /// The list of exports in the library.
+  final List<Export> exports = [];
+
+  /// The top-level nodes declared in the library.
+  final List<Node> declaredNodes = [];
+
+  /// The precomputed signature of the [uri].
+  ///
+  /// It is mixed into every API token signature, because for example even
+  /// though types of two functions might be the same, their locations
+  /// are different.
+  List<int> uriSignature;
+
+  /// The name of the enclosing class name, or `null` if outside a class.
+  String enclosingClassName;
+
+  /// The super class of the enclosing class, or `null` if outside a class.
+  TypeName enclosingSuperClass;
+
+  /// The precomputed signature of the enclosing class name, or `null` if
+  /// outside a class.
+  ///
+  /// It is mixed into every API token signature of every class member, because
+  /// for example even though types of two methods might be the same, their
+  /// locations are different.
+  List<int> enclosingClassNameSignature;
+
+  /// The node of the enclosing class.
+  Node enclosingClass;
+
+  _LibraryBuilder(this.uri, this.units);
+
+  Library build() {
+    uriSignature = (ApiSignature()..addString(uri.toString())).toByteList();
+
+    _addImports();
+    _addExports();
+
+    for (var unit in units) {
+      _addUnit(unit);
+    }
+    declaredNodes.sort(Node.compare);
+
+    return Library(uri, imports, exports, declaredNodes);
+  }
+
+  void _addClassOrMixin(ClassOrMixinDeclaration node) {
+    enclosingClassName = node.name.name;
+    if (node is ClassDeclaration) {
+      enclosingSuperClass = node.extendsClause?.superclass;
+    }
+
+    enclosingClassNameSignature =
+        (ApiSignature()..addString(enclosingClassName)).toByteList();
+
+    var apiTokenSignature = _computeTokenSignature(
+      node.beginToken,
+      node.leftBracket,
+    );
+
+    Dependencies api;
+    if (node is ClassDeclaration) {
+      api = referenceCollector.collect(
+        apiTokenSignature,
+        thisNodeName: enclosingClassName,
+        typeParameters: node.typeParameters,
+        extendsClause: node.extendsClause,
+        withClause: node.withClause,
+        implementsClause: node.implementsClause,
+      );
+    } else if (node is MixinDeclaration) {
+      api = referenceCollector.collect(
+        apiTokenSignature,
+        thisNodeName: enclosingClassName,
+        typeParameters: node.typeParameters,
+        onClause: node.onClause,
+        implementsClause: node.implementsClause,
+      );
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+
+    enclosingClass = Node(
+      LibraryQualifiedName(uri, enclosingClassName),
+      node is MixinDeclaration ? NodeKind.MIXIN : NodeKind.CLASS,
+      api,
+      Dependencies.none,
+    );
+
+    var hasConstConstructor = node.members.any(
+      (m) => m is ConstructorDeclaration && m.constKeyword != null,
+    );
+
+    // TODO(scheglov) do we need type parameters at all?
+    List<Node> classTypeParameters;
+    if (node.typeParameters != null) {
+      classTypeParameters = <Node>[];
+      for (var typeParameter in node.typeParameters.typeParameters) {
+        var api = referenceCollector.collect(
+          _computeNodeTokenSignature(typeParameter),
+          enclosingClassName: enclosingClassName,
+          thisNodeName: typeParameter.name.name,
+          type: typeParameter.bound,
+        );
+        classTypeParameters.add(Node(
+          LibraryQualifiedName(uri, typeParameter.name.name),
+          NodeKind.TYPE_PARAMETER,
+          api,
+          Dependencies.none,
+          enclosingClass: enclosingClass,
+        ));
+      }
+      classTypeParameters.sort(Node.compare);
+      enclosingClass.setTypeParameters(classTypeParameters);
+    }
+
+    var classMembers = <Node>[];
+    var hasConstructor = false;
+    for (var member in node.members) {
+      if (member is ConstructorDeclaration) {
+        hasConstructor = true;
+        _addConstructor(classMembers, member);
+      } else if (member is FieldDeclaration) {
+        _addVariables(
+          classMembers,
+          member.metadata,
+          member.fields,
+          hasConstConstructor,
+        );
+      } else if (member is MethodDeclaration) {
+        _addMethod(classMembers, member);
+      } else {
+        throw UnimplementedError('(${member.runtimeType}) $member');
+      }
+    }
+
+    if (node is ClassDeclaration && !hasConstructor) {
+      classMembers.add(Node(
+        LibraryQualifiedName(uri, ''),
+        NodeKind.CONSTRUCTOR,
+        Dependencies.none,
+        Dependencies.none,
+        enclosingClass: enclosingClass,
+      ));
+    }
+
+    classMembers.sort(Node.compare);
+    enclosingClass.setClassMembers(classMembers);
+
+    declaredNodes.add(enclosingClass);
+    enclosingClassName = null;
+    enclosingClassNameSignature = null;
+    enclosingSuperClass = null;
+    enclosingClass = null;
+  }
+
+  void _addClassTypeAlias(ClassTypeAlias node) {
+    var apiTokenSignature = _computeNodeTokenSignature(node);
+    var api = referenceCollector.collect(
+      apiTokenSignature,
+      typeParameters: node.typeParameters,
+      superClass: node.superclass,
+      withClause: node.withClause,
+      implementsClause: node.implementsClause,
+    );
+
+    declaredNodes.add(Node(
+      LibraryQualifiedName(uri, node.name.name),
+      NodeKind.CLASS_TYPE_ALIAS,
+      api,
+      Dependencies.none,
+    ));
+  }
+
+  void _addConstructor(List<Node> classMembers, ConstructorDeclaration node) {
+    var builder = _newApiSignatureBuilder();
+    _appendMetadataTokens(builder, node.metadata);
+    _appendFormalParametersTokens(builder, node.parameters);
+    var apiTokenSignature = builder.toByteList();
+
+    var api = referenceCollector.collect(
+      apiTokenSignature,
+      enclosingClassName: enclosingClassName,
+      formalParameters: node.parameters,
+    );
+
+    var implTokenSignature = _computeNodeTokenSignature(node.body);
+    var impl = referenceCollector.collect(
+      implTokenSignature,
+      enclosingClassName: enclosingClassName,
+      enclosingSuperClass: enclosingSuperClass,
+      formalParametersForImpl: node.parameters,
+      constructorInitializers: node.initializers,
+      redirectedConstructor: node.redirectedConstructor,
+      functionBody: node.body,
+    );
+
+    classMembers.add(Node(
+      LibraryQualifiedName(uri, node.name?.name ?? ''),
+      NodeKind.CONSTRUCTOR,
+      api,
+      impl,
+      enclosingClass: enclosingClass,
+    ));
+  }
+
+  void _addEnum(EnumDeclaration node) {
+    var enumTokenSignature = _newApiSignatureBuilder().toByteList();
+
+    var enumNode = Node(
+      LibraryQualifiedName(uri, node.name.name),
+      NodeKind.ENUM,
+      Dependencies(enumTokenSignature, [], [], [], [], []),
+      Dependencies.none,
+    );
+
+    Dependencies fieldDependencies;
+    {
+      var builder = _newApiSignatureBuilder();
+      builder.addString(node.name.name);
+      _appendTokens(builder, node.leftBracket, node.rightBracket);
+      var tokenSignature = builder.toByteList();
+      fieldDependencies = Dependencies(tokenSignature, [], [], [], [], []);
+    }
+
+    var members = <Node>[];
+    for (var constant in node.constants) {
+      members.add(Node(
+        LibraryQualifiedName(uri, constant.name.name),
+        NodeKind.GETTER,
+        fieldDependencies,
+        Dependencies.none,
+        enclosingClass: enumNode,
+      ));
+    }
+
+    members.add(Node(
+      LibraryQualifiedName(uri, 'index'),
+      NodeKind.GETTER,
+      fieldDependencies,
+      Dependencies.none,
+      enclosingClass: enumNode,
+    ));
+
+    members.add(Node(
+      LibraryQualifiedName(uri, 'values'),
+      NodeKind.GETTER,
+      fieldDependencies,
+      Dependencies.none,
+      enclosingClass: enumNode,
+    ));
+
+    members.sort(Node.compare);
+    enumNode.setClassMembers(members);
+
+    declaredNodes.add(enumNode);
+  }
+
+  /// Fill [exports] with information about exports.
+  void _addExports() {
+    for (var directive in units.first.directives) {
+      if (directive is ExportDirective) {
+        var refUri = directive.uri.stringValue;
+        var importUri = uri.resolve(refUri);
+        var combinators = _getCombinators(directive);
+        exports.add(Export(importUri, combinators));
+      }
+    }
+  }
+
+  void _addFunction(FunctionDeclaration node) {
+    var functionExpression = node.functionExpression;
+
+    var builder = _newApiSignatureBuilder();
+    _appendMetadataTokens(builder, node.metadata);
+    _appendNodeTokens(builder, node.returnType);
+    _appendNodeTokens(builder, functionExpression.typeParameters);
+    _appendFormalParametersTokens(builder, functionExpression.parameters);
+    var apiTokenSignature = builder.toByteList();
+
+    var rawName = node.name.name;
+    var name = LibraryQualifiedName(uri, node.isSetter ? '$rawName=' : rawName);
+
+    NodeKind kind;
+    if (node.isGetter) {
+      kind = NodeKind.GETTER;
+    } else if (node.isSetter) {
+      kind = NodeKind.SETTER;
+    } else {
+      kind = NodeKind.FUNCTION;
+    }
+
+    var api = referenceCollector.collect(
+      apiTokenSignature,
+      thisNodeName: node.name.name,
+      typeParameters: functionExpression.typeParameters,
+      formalParameters: functionExpression.parameters,
+      returnType: node.returnType,
+    );
+
+    var body = functionExpression.body;
+    var implTokenSignature = _computeNodeTokenSignature(body);
+    var impl = referenceCollector.collect(
+      implTokenSignature,
+      thisNodeName: node.name.name,
+      formalParametersForImpl: functionExpression.parameters,
+      functionBody: body,
+    );
+
+    declaredNodes.add(Node(name, kind, api, impl));
+  }
+
+  void _addFunctionTypeAlias(FunctionTypeAlias node) {
+    var builder = _newApiSignatureBuilder();
+    _appendMetadataTokens(builder, node.metadata);
+    _appendNodeTokens(builder, node.typeParameters);
+    _appendNodeTokens(builder, node.returnType);
+    _appendFormalParametersTokens(builder, node.parameters);
+    var apiTokenSignature = builder.toByteList();
+
+    var api = referenceCollector.collect(
+      apiTokenSignature,
+      thisNodeName: node.name.name,
+      typeParameters: node.typeParameters,
+      formalParameters: node.parameters,
+      returnType: node.returnType,
+    );
+
+    declaredNodes.add(Node(
+      LibraryQualifiedName(uri, node.name.name),
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      api,
+      Dependencies.none,
+    ));
+  }
+
+  void _addGenericTypeAlias(GenericTypeAlias node) {
+    var functionType = node.functionType;
+
+    var builder = _newApiSignatureBuilder();
+    _appendMetadataTokens(builder, node.metadata);
+    _appendNodeTokens(builder, node.typeParameters);
+    _appendNodeTokens(builder, functionType.returnType);
+    _appendNodeTokens(builder, functionType.typeParameters);
+    _appendFormalParametersTokens(builder, functionType.parameters);
+    var apiTokenSignature = builder.toByteList();
+
+    var api = referenceCollector.collect(
+      apiTokenSignature,
+      typeParameters: node.typeParameters,
+      typeParameters2: functionType.typeParameters,
+      formalParameters: functionType.parameters,
+      returnType: functionType.returnType,
+    );
+
+    declaredNodes.add(Node(
+      LibraryQualifiedName(uri, node.name.name),
+      NodeKind.GENERIC_TYPE_ALIAS,
+      api,
+      Dependencies.none,
+    ));
+  }
+
+  /// Fill [imports] with information about imports.
+  void _addImports() {
+    var hasDartCoreImport = false;
+    for (var directive in units.first.directives) {
+      if (directive is ImportDirective) {
+        var refUri = directive.uri.stringValue;
+        var importUri = uri.resolve(refUri);
+
+        if (importUri.toString() == 'dart:core') {
+          hasDartCoreImport = true;
+        }
+
+        var combinators = _getCombinators(directive);
+
+        imports.add(Import(importUri, directive.prefix?.name, combinators));
+
+        if (directive.prefix != null) {
+          referenceCollector.addImportPrefix(directive.prefix.name);
+        }
+      }
+    }
+
+    if (!hasDartCoreImport) {
+      imports.add(Import(Uri.parse('dart:core'), null, []));
+    }
+  }
+
+  void _addMethod(List<Node> classMembers, MethodDeclaration node) {
+    var builder = _newApiSignatureBuilder();
+    _appendMetadataTokens(builder, node.metadata);
+    _appendNodeTokens(builder, node.returnType);
+    _appendNodeTokens(builder, node.typeParameters);
+    _appendFormalParametersTokens(builder, node.parameters);
+    var apiTokenSignature = builder.toByteList();
+
+    NodeKind kind;
+    if (node.isGetter) {
+      kind = NodeKind.GETTER;
+    } else if (node.isSetter) {
+      kind = NodeKind.SETTER;
+    } else {
+      kind = NodeKind.METHOD;
+    }
+
+    // TODO(scheglov) metadata, here and everywhere
+    var api = referenceCollector.collect(
+      apiTokenSignature,
+      enclosingClassName: enclosingClassName,
+      thisNodeName: node.name.name,
+      typeParameters: node.typeParameters,
+      formalParameters: node.parameters,
+      returnType: node.returnType,
+    );
+
+    var implTokenSignature = _computeNodeTokenSignature(node.body);
+    var impl = referenceCollector.collect(
+      implTokenSignature,
+      enclosingClassName: enclosingClassName,
+      thisNodeName: node.name.name,
+      formalParametersForImpl: node.parameters,
+      functionBody: node.body,
+    );
+
+    var name = LibraryQualifiedName(uri, node.name.name);
+    classMembers.add(
+      Node(name, kind, api, impl, enclosingClass: enclosingClass),
+    );
+  }
+
+  void _addUnit(CompilationUnit unit) {
+    for (var declaration in unit.declarations) {
+      if (declaration is ClassOrMixinDeclaration) {
+        _addClassOrMixin(declaration);
+      } else if (declaration is ClassTypeAlias) {
+        _addClassTypeAlias(declaration);
+      } else if (declaration is EnumDeclaration) {
+        _addEnum(declaration);
+      } else if (declaration is FunctionDeclaration) {
+        _addFunction(declaration);
+      } else if (declaration is FunctionTypeAlias) {
+        _addFunctionTypeAlias(declaration);
+      } else if (declaration is GenericTypeAlias) {
+        _addGenericTypeAlias(declaration);
+      } else if (declaration is TopLevelVariableDeclaration) {
+        _addVariables(
+          declaredNodes,
+          declaration.metadata,
+          declaration.variables,
+          false,
+        );
+      } else {
+        throw UnimplementedError('(${declaration.runtimeType}) $declaration');
+      }
+    }
+  }
+
+  void _addVariables(List<Node> variableNodes, List<Annotation> metadata,
+      VariableDeclarationList variables, bool appendInitializerToApi) {
+    if (variables.isConst || variables.type == null) {
+      appendInitializerToApi = true;
+    }
+
+    for (var variable in variables.variables) {
+      var initializer = variable.initializer;
+
+      var builder = _newApiSignatureBuilder();
+      builder.addInt(variables.isConst ? 1 : 0); // const flag
+      _appendMetadataTokens(builder, metadata);
+      _appendNodeTokens(builder, variables.type);
+      if (appendInitializerToApi) {
+        _appendNodeTokens(builder, initializer);
+      }
+
+      var apiTokenSignature = builder.toByteList();
+      var api = referenceCollector.collect(
+        apiTokenSignature,
+        enclosingClassName: enclosingClassName,
+        thisNodeName: variable.name.name,
+        type: variables.type,
+        expression: appendInitializerToApi ? initializer : null,
+      );
+
+      var implTokenSignature = _computeNodeTokenSignature(initializer);
+      var impl = referenceCollector.collect(
+        implTokenSignature,
+        enclosingClassName: enclosingClassName,
+        thisNodeName: variable.name.name,
+        expression: initializer,
+      );
+
+      var rawName = variable.name.name;
+      variableNodes.add(Node(
+        LibraryQualifiedName(uri, rawName),
+        NodeKind.GETTER,
+        api,
+        impl,
+        enclosingClass: enclosingClass,
+      ));
+
+      if (!variables.isConst && !variables.isFinal) {
+        // Note that one set of dependencies is enough for body.
+        // So, the setter has empty "impl" dependencies.
+        variableNodes.add(
+          Node(
+            LibraryQualifiedName(uri, '$rawName='),
+            NodeKind.SETTER,
+            api,
+            Dependencies.none,
+            enclosingClass: enclosingClass,
+          ),
+        );
+      }
+    }
+  }
+
+  /// Return the signature for all tokens of the [node].
+  List<int> _computeNodeTokenSignature(AstNode node) {
+    if (node == null) {
+      return const <int>[];
+    }
+    return _computeTokenSignature(node.beginToken, node.endToken);
+  }
+
+  /// Return the signature for tokens from [begin] to [end] (both including).
+  List<int> _computeTokenSignature(Token begin, Token end) {
+    var signature = _newApiSignatureBuilder();
+    _appendTokens(signature, begin, end);
+    return signature.toByteList();
+  }
+
+  /// Return a new signature builder, primed with the current context salts.
+  ApiSignature _newApiSignatureBuilder() {
+    var builder = ApiSignature();
+    builder.addBytes(uriSignature);
+    if (enclosingClassNameSignature != null) {
+      builder.addBytes(enclosingClassNameSignature);
+    }
+    return builder;
+  }
+
+  /// Append tokens of the given [parameters] to the [signature].
+  static void _appendFormalParametersTokens(
+      ApiSignature signature, FormalParameterList parameters) {
+    if (parameters == null) return;
+
+    for (var parameter in parameters.parameters) {
+      if (parameter.isRequired) {
+        signature.addInt(1);
+      } else if (parameter.isOptionalPositional) {
+        signature.addInt(2);
+      } else {
+        signature.addInt(3);
+      }
+
+      // If a simple not named parameter, we don't need its name.
+      // We should be careful to include also annotations.
+      if (parameter is SimpleFormalParameter && parameter.type != null) {
+        _appendTokens(
+          signature,
+          parameter.beginToken,
+          parameter.type.endToken,
+        );
+        continue;
+      }
+
+      // We don't know anything better than adding the whole parameter.
+      _appendNodeTokens(signature, parameter);
+    }
+  }
+
+  static void _appendMetadataTokens(
+      ApiSignature signature, List<Annotation> metadata) {
+    if (metadata != null) {
+      for (var annotation in metadata) {
+        _appendNodeTokens(signature, annotation);
+      }
+    }
+  }
+
+  /// Append tokens of the given [node] to the [signature].
+  static void _appendNodeTokens(ApiSignature signature, AstNode node) {
+    if (node != null) {
+      _appendTokens(signature, node.beginToken, node.endToken);
+    }
+  }
+
+  /// Append tokens from [begin] to [end] (both including) to the [signature].
+  static void _appendTokens(ApiSignature signature, Token begin, Token end) {
+    if (begin is CommentToken) {
+      begin = (begin as CommentToken).parent;
+    }
+
+    Token token = begin;
+    while (token != null) {
+      signature.addString(token.lexeme);
+
+      if (token == end) {
+        break;
+      }
+
+      var nextToken = token.next;
+      if (nextToken == token) {
+        break;
+      }
+
+      token = nextToken;
+    }
+  }
+
+  /// Return [Combinator]s for the given import or export [directive].
+  static List<Combinator> _getCombinators(NamespaceDirective directive) {
+    var combinators = <Combinator>[];
+    for (var combinator in directive.combinators) {
+      if (combinator is ShowCombinator) {
+        combinators.add(
+          Combinator(
+            true,
+            combinator.shownNames.map((id) => id.name).toList(),
+          ),
+        );
+      }
+      if (combinator is HideCombinator) {
+        combinators.add(
+          Combinator(
+            false,
+            combinator.hiddenNames.map((id) => id.name).toList(),
+          ),
+        );
+      }
+    }
+    return combinators;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
new file mode 100644
index 0000000..ef5022d
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/node.dart
@@ -0,0 +1,246 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:typed_data';
+
+import 'package:analyzer/src/generated/utilities_general.dart';
+import 'package:convert/convert.dart';
+
+/// The reference to a class member.
+class ClassMemberReference {
+  /// The target class name.
+  ///
+  /// This is different from the class that actually turned out to define
+  /// the referenced member at the time of recording this reference. So, we
+  /// will notice added overrides in the target class, or anywhere in between.
+  final LibraryQualifiedName target;
+
+  /// The name referenced in the [target].
+  final String name;
+
+  @override
+  final int hashCode;
+
+  ClassMemberReference(this.target, this.name)
+      : hashCode = JenkinsSmiHash.hash2(target.hashCode, name.hashCode);
+
+  @override
+  bool operator ==(other) {
+    return other is ClassMemberReference &&
+        other.target == target &&
+        other.name == name;
+  }
+
+  @override
+  String toString() {
+    return '($target, $name)';
+  }
+
+  static int compare(ClassMemberReference first, ClassMemberReference second) {
+    var result = LibraryQualifiedName.compare(first.target, second.target);
+    if (result != 0) return result;
+
+    return first.name.compareTo(second.name);
+  }
+}
+
+/// The dependencies of the API or implementation portion of a node.
+class Dependencies {
+  static final none = Dependencies([], [], [], [], [], []);
+
+  /// The token signature of this portion of the node. It depends on all
+  /// tokens that might affect the node API or implementation resolution.
+  final List<int> tokenSignature;
+
+  /// The names that appear unprefixed in this portion of the node, and are
+  /// not defined locally in the node. Locally defined names themselves
+  /// depend on some non-local nodes, which will also recorded here.
+  ///
+  /// This list is sorted.
+  final List<String> unprefixedReferencedNames;
+
+  /// The names of import prefixes used to reference names in this node.
+  ///
+  /// This list is sorted.
+  final List<String> importPrefixes;
+
+  /// The names referenced by this node with the import prefix at the
+  /// corresponding index in [importPrefixes].
+  ///
+  /// This list is sorted.
+  final List<List<String>> importPrefixedReferencedNames;
+
+  /// The names that appear prefixed with `super` in this portion of the node.
+  ///
+  /// This list is sorted.
+  final List<String> superReferencedNames;
+
+  /// The class members referenced in this portion of the node.
+  ///
+  /// This list is sorted.
+  final List<ClassMemberReference> classMemberReferences;
+
+  /// All referenced nodes, computed from [unprefixedReferencedNames],
+  /// [importPrefixedReferencedNames], and [classMemberReferences].
+  List<Node> referencedNodes;
+
+  /// The transitive signature of this portion of the node, computed using
+  /// the [tokenSignature] of this node, and API signatures of the
+  /// [referencedNodes].
+  List<int> transitiveSignature;
+
+  Dependencies(
+      this.tokenSignature,
+      this.unprefixedReferencedNames,
+      this.importPrefixes,
+      this.importPrefixedReferencedNames,
+      this.superReferencedNames,
+      this.classMemberReferences);
+
+  String get tokenSignatureHex => hex.encode(tokenSignature);
+}
+
+/// A name qualified by a library URI.
+class LibraryQualifiedName {
+  /// The URI of the defining library.
+  /// Not `null`.
+  final Uri libraryUri;
+
+  /// The name of this name object.
+  /// If the name starts with `_`, then the name is private.
+  /// Names of setters end with `=`.
+  final String name;
+
+  /// Whether this name is private, and its [name] starts with `_`.
+  final bool isPrivate;
+
+  /// The cached, pre-computed hash code.
+  @override
+  final int hashCode;
+
+  factory LibraryQualifiedName(Uri libraryUri, String name) {
+    var isPrivate = name.startsWith('_');
+    var hashCode = JenkinsSmiHash.hash2(libraryUri.hashCode, name.hashCode);
+    return LibraryQualifiedName._internal(
+        libraryUri, name, isPrivate, hashCode);
+  }
+
+  LibraryQualifiedName._internal(
+      this.libraryUri, this.name, this.isPrivate, this.hashCode);
+
+  @override
+  bool operator ==(Object other) {
+    return other is LibraryQualifiedName &&
+        other.hashCode == hashCode &&
+        name == other.name &&
+        libraryUri == other.libraryUri;
+  }
+
+  /// Whether this name us accessible for the library with the given
+  /// [libraryUri], i.e. when the name is public, or is defined in a library
+  /// with the same URI.
+  bool isAccessibleFor(Uri libraryUri) {
+    return !isPrivate || this.libraryUri == libraryUri;
+  }
+
+  @override
+  String toString() => '$libraryUri::$name';
+
+  /// Compare given names by their raw names.
+  ///
+  /// This method should be used only for sorting, it does not follow the
+  /// complete semantics of [==] and [hashCode].
+  static int compare(LibraryQualifiedName first, LibraryQualifiedName second) {
+    return first.name.compareTo(second.name);
+  }
+}
+
+/// A dependency node - anything that has a name, and can be referenced.
+class Node {
+  /// The API or implementation signature used in [Dependencies]
+  /// as a marker that this node is changed, explicitly because its token
+  /// signature changed, or implicitly - because it references a changed node.
+  static final changedSignature = Uint8List.fromList([0xDE, 0xAD, 0xBE, 0xEF]);
+
+  final LibraryQualifiedName name;
+  final NodeKind kind;
+
+  /// Dependencies that affect the API of the node, so affect API or
+  /// implementation dependencies of the nodes that use this node.
+  final Dependencies api;
+
+  /// Additional (to the [api]) dependencies that affect only the
+  /// "implementation" of the node, e.g. the body of a method, but are not
+  /// visible outside of the node, and so don't affect any other nodes.
+  final Dependencies impl;
+
+  /// If the node is a class member, the node of the enclosing class.
+  /// Otherwise `null`.
+  final Node enclosingClass;
+
+  /// If the node is a class, the nodes of its type parameters.
+  /// Otherwise `null`.
+  List<Node> classTypeParameters;
+
+  /// If the node is a class, the sorted list of members in this class.
+  /// Otherwise `null`.
+  List<Node> classMembers;
+
+  Node(this.name, this.kind, this.api, this.impl,
+      {this.enclosingClass, this.classTypeParameters});
+
+  /// Return the node that can be referenced by the given [name] from the
+  /// library with the given [libraryUri].
+  Node getClassMember(Uri libraryUri, String name) {
+    // TODO(scheglov) The list is sorted, use this fact to search faster.
+    // TODO(scheglov) Collect superclass members here or outside.
+    for (var i = 0; i < classMembers.length; ++i) {
+      var member = classMembers[i];
+      var memberName = member.name;
+      if (memberName.name == name && memberName.isAccessibleFor(libraryUri)) {
+        return member;
+      }
+    }
+    return null;
+  }
+
+  /// Set new class members for this class.
+  void setClassMembers(List<Node> newClassMembers) {
+    classMembers = newClassMembers;
+  }
+
+  /// Set new class type parameters for this class.
+  void setTypeParameters(List<Node> newTypeParameters) {
+    classTypeParameters = newTypeParameters;
+  }
+
+  @override
+  String toString() {
+    if (enclosingClass != null) {
+      return '$enclosingClass::${name.name}';
+    }
+    return name.toString();
+  }
+
+  /// Compare given nodes by their names.
+  static int compare(Node first, Node second) {
+    return LibraryQualifiedName.compare(first.name, second.name);
+  }
+}
+
+/// Kinds of nodes.
+enum NodeKind {
+  CLASS,
+  CLASS_TYPE_ALIAS,
+  CONSTRUCTOR,
+  ENUM,
+  FUNCTION,
+  FUNCTION_TYPE_ALIAS,
+  GENERIC_TYPE_ALIAS,
+  GETTER,
+  METHOD,
+  MIXIN,
+  SETTER,
+  TYPE_PARAMETER,
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
new file mode 100644
index 0000000..09b4dae
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -0,0 +1,928 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/dependency/node.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:meta/meta.dart';
+
+/// Collector of information about external nodes referenced by a node.
+///
+/// The workflow for using it is that the library builder creates a new
+/// instance, fills it with names of import prefixes using [addImportPrefix].
+/// Then for each node defined in the library, [collect] is called with
+/// corresponding AST nodes to record references to external names, and
+/// construct the API or implementation [Dependencies].
+class ReferenceCollector {
+  /// Local scope inside the node, containing local names such as parameters,
+  /// local variables, local functions, local type parameters, etc.
+  final _LocalScopes _localScopes = _LocalScopes();
+
+  /// The list of names that are referenced without any prefix, neither an
+  /// import prefix, nor a target expression.
+  _NameSet _unprefixedReferences = _NameSet();
+
+  /// The list of names that are referenced using an import prefix.
+  ///
+  /// It is filled by [addImportPrefix] and shared across all nodes.
+  List<_ReferencedImportPrefixedNames> _importPrefixedReferences = [];
+
+  /// The list of names that are referenced with `super`.
+  _NameSet _superReferences = _NameSet();
+
+  /// The set of referenced class members.
+  _ClassMemberReferenceSet _memberReferences = _ClassMemberReferenceSet();
+
+  /// Record that the [name] is a name of an import prefix.
+  ///
+  /// So, when we see code like `prefix.foo` we know that `foo` should be
+  /// resolved in the import scope that corresponds to `prefix` (unless the
+  /// name `prefix` is shadowed by a local declaration).
+  void addImportPrefix(String name) {
+    assert(_localScopes.isEmpty);
+    for (var import in _importPrefixedReferences) {
+      if (import.prefix == name) {
+        return;
+      }
+    }
+    _importPrefixedReferences.add(_ReferencedImportPrefixedNames(name));
+  }
+
+  /// Construct and return a new [Dependencies] with the given [tokenSignature]
+  /// and all recorded references to external nodes in the given AST nodes.
+  Dependencies collect(List<int> tokenSignature,
+      {String enclosingClassName,
+      String thisNodeName,
+      List<ConstructorInitializer> constructorInitializers,
+      TypeName enclosingSuperClass,
+      Expression expression,
+      ExtendsClause extendsClause,
+      FormalParameterList formalParameters,
+      FormalParameterList formalParametersForImpl,
+      FunctionBody functionBody,
+      ImplementsClause implementsClause,
+      OnClause onClause,
+      ConstructorName redirectedConstructor,
+      TypeAnnotation returnType,
+      TypeName superClass,
+      TypeAnnotation type,
+      TypeParameterList typeParameters,
+      TypeParameterList typeParameters2,
+      WithClause withClause}) {
+    _localScopes.enter();
+
+    // The name of the node shadows any external names.
+    if (enclosingClassName != null) {
+      _localScopes.add(enclosingClassName);
+    }
+    if (thisNodeName != null) {
+      _localScopes.add(thisNodeName);
+    }
+
+    // Add type parameters first, they might be referenced later.
+    _visitTypeParameterList(typeParameters);
+    _visitTypeParameterList(typeParameters2);
+
+    // Parts of classes.
+    _visitTypeAnnotation(extendsClause?.superclass);
+    _visitTypeAnnotation(superClass);
+    _visitTypeAnnotations(withClause?.mixinTypes);
+    _visitTypeAnnotations(onClause?.superclassConstraints);
+    _visitTypeAnnotations(implementsClause?.interfaces);
+
+    // Parts of executables.
+    _visitFormalParameterList(formalParameters);
+    _visitFormalParameterListImpl(formalParametersForImpl);
+    _visitTypeAnnotation(returnType);
+    _visitFunctionBody(functionBody);
+
+    // Parts of constructors.
+    _visitConstructorInitializers(enclosingSuperClass, constructorInitializers);
+    _visitConstructorName(redirectedConstructor);
+
+    // Parts of variables.
+    _visitTypeAnnotation(type);
+    _visitExpression(expression);
+
+    _localScopes.exit();
+
+    var unprefixedReferencedNames = _unprefixedReferences.toList();
+    _unprefixedReferences = _NameSet();
+
+    var importPrefixCount = 0;
+    for (var i = 0; i < _importPrefixedReferences.length; i++) {
+      var import = _importPrefixedReferences[i];
+      if (import.names.isNotEmpty) {
+        importPrefixCount++;
+      }
+    }
+
+    var importPrefixes = List<String>(importPrefixCount);
+    var importPrefixedReferencedNames = List<List<String>>(importPrefixCount);
+    var importIndex = 0;
+    for (var i = 0; i < _importPrefixedReferences.length; i++) {
+      var import = _importPrefixedReferences[i];
+
+      if (import.names.isNotEmpty) {
+        importPrefixes[importIndex] = import.prefix;
+        importPrefixedReferencedNames[importIndex] = import.names.toList();
+        importIndex++;
+      }
+
+      import.clear();
+    }
+
+    var superReferencedNames = _superReferences.toList();
+    _superReferences = _NameSet();
+
+    var classMemberReferences = _memberReferences.toList();
+    _memberReferences = _ClassMemberReferenceSet();
+
+    return Dependencies(
+      tokenSignature,
+      unprefixedReferencedNames,
+      importPrefixes,
+      importPrefixedReferencedNames,
+      superReferencedNames,
+      classMemberReferences,
+    );
+  }
+
+  /// Return the collector for the import prefix with the given [name].
+  _ReferencedImportPrefixedNames _importPrefix(String name) {
+    assert(!_localScopes.contains(name));
+    for (var i = 0; i < _importPrefixedReferences.length; i++) {
+      var references = _importPrefixedReferences[i];
+      if (references.prefix == name) {
+        return references;
+      }
+    }
+    return null;
+  }
+
+  void _recordClassMemberReference(DartType targetType, String name) {
+    if (targetType is InterfaceType) {
+      _memberReferences.add(targetType.element, name);
+    }
+  }
+
+  /// Record a new unprefixed name reference.
+  void _recordUnprefixedReference(String name) {
+    assert(!_localScopes.contains(name));
+    _unprefixedReferences.add(name);
+  }
+
+  void _visitAdjacentStrings(AdjacentStrings node) {
+    var strings = node.strings;
+    for (var i = 0; i < strings.length; i++) {
+      var string = strings[i];
+      _visitExpression(string);
+    }
+  }
+
+  void _visitArgumentList(ArgumentList node) {
+    var arguments = node.arguments;
+    for (var i = 0; i < arguments.length; i++) {
+      var argument = arguments[i];
+      _visitExpression(argument);
+    }
+  }
+
+  void _visitAssignmentExpression(AssignmentExpression node) {
+    var assignmentType = node.operator.type;
+
+    _visitExpression(node.leftHandSide,
+        get: assignmentType != TokenType.EQ, set: true);
+    _visitExpression(node.rightHandSide);
+
+    if (assignmentType != TokenType.EQ &&
+        assignmentType != TokenType.QUESTION_QUESTION_EQ) {
+      var operatorType = operatorFromCompoundAssignment(assignmentType);
+      _recordClassMemberReference(
+        node.leftHandSide.staticType,
+        operatorType.lexeme,
+      );
+    }
+  }
+
+  void _visitBinaryExpression(BinaryExpression node) {
+    var operatorName = node.operator.lexeme;
+    var leftOperand = node.leftOperand;
+    if (leftOperand is SuperExpression) {
+      _superReferences.add(operatorName);
+    } else {
+      _visitExpression(leftOperand);
+      _recordClassMemberReference(leftOperand.staticType, operatorName);
+    }
+    _visitExpression(node.rightOperand);
+  }
+
+  void _visitBlock(Block node) {
+    if (node == null) return;
+
+    _visitStatements(node.statements);
+  }
+
+  void _visitCascadeExpression(CascadeExpression node) {
+    _visitExpression(node.target);
+    var sections = node.cascadeSections;
+    for (var i = 0; i < sections.length; i++) {
+      var section = sections[i];
+      _visitExpression(section);
+    }
+  }
+
+  /// Record reference to the constructor of the [type] with the given [name].
+  void _visitConstructor(TypeName type, SimpleIdentifier name) {
+    _visitTypeAnnotation(type);
+
+    if (name != null) {
+      _recordClassMemberReference(type.type, name.name);
+    } else {
+      _recordClassMemberReference(type.type, '');
+    }
+  }
+
+  void _visitConstructorInitializers(
+      TypeName superClass, List<ConstructorInitializer> initializers) {
+    if (initializers == null) return;
+
+    for (var i = 0; i < initializers.length; i++) {
+      var initializer = initializers[i];
+      if (initializer is AssertInitializer) {
+        _visitExpression(initializer.condition);
+        _visitExpression(initializer.message);
+      } else if (initializer is ConstructorFieldInitializer) {
+        _visitExpression(initializer.expression);
+      } else if (initializer is SuperConstructorInvocation) {
+        _visitConstructor(superClass, initializer.constructorName);
+        _visitArgumentList(initializer.argumentList);
+      } else if (initializer is RedirectingConstructorInvocation) {
+        _visitArgumentList(initializer.argumentList);
+        // Strongly speaking, we reference a field of the enclosing class.
+        //
+        // However the current plan is to resolve the whole library on a change.
+        // So, we will resolve the enclosing constructor anyway.
+      } else {
+        throw UnimplementedError('(${initializer.runtimeType}) $initializer');
+      }
+    }
+  }
+
+  void _visitConstructorName(ConstructorName node) {
+    if (node == null) return;
+
+    _visitConstructor(node.type, node.name);
+  }
+
+  void _visitExpression(Expression node, {bool get: true, bool set: false}) {
+    if (node == null) return;
+
+    if (node is AdjacentStrings) {
+      _visitAdjacentStrings(node);
+    } else if (node is AsExpression) {
+      _visitExpression(node.expression);
+      _visitTypeAnnotation(node.type);
+    } else if (node is AssignmentExpression) {
+      _visitAssignmentExpression(node);
+    } else if (node is AwaitExpression) {
+      _visitExpression(node.expression);
+    } else if (node is BinaryExpression) {
+      _visitBinaryExpression(node);
+    } else if (node is BooleanLiteral) {
+      // no dependencies
+    } else if (node is CascadeExpression) {
+      _visitCascadeExpression(node);
+    } else if (node is ConditionalExpression) {
+      _visitExpression(node.condition);
+      _visitExpression(node.thenExpression);
+      _visitExpression(node.elseExpression);
+    } else if (node is DoubleLiteral) {
+      // no dependencies
+    } else if (node is FunctionExpression) {
+      _visitFunctionExpression(node);
+    } else if (node is FunctionExpressionInvocation) {
+      _visitExpression(node.function);
+      _visitTypeArguments(node.typeArguments);
+      _visitArgumentList(node.argumentList);
+    } else if (node is IndexExpression) {
+      _visitIndexExpression(node, get: get, set: set);
+    } else if (node is InstanceCreationExpression) {
+      _visitInstanceCreationExpression(node);
+    } else if (node is IntegerLiteral) {
+      // no dependencies
+    } else if (node is IsExpression) {
+      _visitExpression(node.expression);
+      _visitTypeAnnotation(node.type);
+    } else if (node is ListLiteral) {
+      _visitListLiteral(node);
+    } else if (node is MapLiteral) {
+      _visitMapLiteral(node);
+    } else if (node is MethodInvocation) {
+      _visitMethodInvocation(node);
+    } else if (node is NamedExpression) {
+      _visitExpression(node.expression);
+    } else if (node is NullLiteral) {
+      // no dependencies
+    } else if (node is ParenthesizedExpression) {
+      _visitExpression(node.expression);
+    } else if (node is PostfixExpression) {
+      _visitPostfixExpression(node);
+    } else if (node is PrefixExpression) {
+      _visitPrefixExpression(node);
+    } else if (node is PrefixedIdentifier) {
+      _visitPrefixedIdentifier(node);
+    } else if (node is PropertyAccess) {
+      _visitPropertyAccess(node, get: get, set: set);
+    } else if (node is RethrowExpression) {
+      // no dependencies
+    } else if (node is SetLiteral) {
+      _visitSetLiteral(node);
+    } else if (node is SimpleIdentifier) {
+      _visitSimpleIdentifier(node, get: get, set: set);
+    } else if (node is SimpleStringLiteral) {
+      // no dependencies
+    } else if (node is StringInterpolation) {
+      _visitStringInterpolation(node);
+    } else if (node is SymbolLiteral) {
+      // no dependencies
+    } else if (node is ThisExpression) {
+      // Strongly speaking, "this" should add dependencies.
+      // Just like any class reference, it depends on the class hierarchy.
+      // For example adding a new type to the `implements` clause might make
+      // it OK to pass `this` as an argument of an invocation.
+      //
+      // However the current plan is to resolve the whole library on a change.
+      // So, we will resolve all implementations that reference `this`.
+    } else if (node is ThrowExpression) {
+      _visitExpression(node.expression);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+  }
+
+  void _visitForEachStatement(ForEachStatement node) {
+    var loopVariable = node.loopVariable;
+    if (loopVariable != null) {
+      _visitTypeAnnotation(loopVariable.type);
+    }
+
+    var loopIdentifier = node.identifier;
+    if (loopIdentifier != null) {
+      _visitExpression(loopIdentifier);
+    }
+
+    _visitExpression(node.iterable);
+
+    _localScopes.enter();
+    if (loopVariable != null) {
+      _localScopes.add(loopVariable.identifier.name);
+    }
+
+    _visitStatement(node.body);
+
+    _localScopes.exit();
+  }
+
+  void _visitFormalParameterList(FormalParameterList node) {
+    if (node == null) return;
+
+    var parameters = node.parameters;
+    for (var i = 0; i < parameters.length; i++) {
+      FormalParameter parameter = parameters[i];
+      if (parameter is DefaultFormalParameter) {
+        DefaultFormalParameter defaultParameter = parameter;
+        parameter = defaultParameter.parameter;
+      }
+      if (parameter.identifier != null) {
+        _localScopes.add(parameter.identifier.name);
+      }
+      if (parameter is FieldFormalParameter) {
+        _visitTypeAnnotation(parameter.type);
+        // Strongly speaking, we reference a field of the enclosing class.
+        //
+        // However the current plan is to resolve the whole library on a change.
+        // So, we will resolve the enclosing constructor anyway.
+      } else if (parameter is FunctionTypedFormalParameter) {
+        _visitTypeAnnotation(parameter.returnType);
+        _visitFormalParameterList(parameter.parameters);
+      } else if (parameter is SimpleFormalParameter) {
+        _visitTypeAnnotation(parameter.type);
+      } else {
+        throw StateError('Unexpected: (${parameter.runtimeType}) $parameter');
+      }
+    }
+  }
+
+  void _visitFormalParameterListImpl(FormalParameterList node) {
+    if (node == null) return;
+
+    var parameters = node.parameters;
+    for (var i = 0; i < parameters.length; i++) {
+      FormalParameter parameter = parameters[i];
+
+      if (parameter is DefaultFormalParameter) {
+        DefaultFormalParameter defaultParameter = parameter;
+        _visitExpression(defaultParameter.defaultValue);
+        parameter = defaultParameter.parameter;
+      }
+
+      if (parameter.identifier != null) {
+        _localScopes.add(parameter.identifier.name);
+      }
+    }
+  }
+
+  void _visitForStatement(ForStatement node) {
+    _localScopes.enter();
+
+    _visitVariableList(node.variables);
+    _visitExpression(node.initialization);
+    _visitExpression(node.condition);
+
+    var updaters = node.updaters;
+    for (var i = 0; i < updaters.length; i++) {
+      _visitExpression(updaters[i]);
+    }
+
+    _visitStatement(node.body);
+
+    _localScopes.exit();
+  }
+
+  void _visitFunctionBody(FunctionBody node) {
+    if (node == null) return;
+
+    if (node is BlockFunctionBody) {
+      _visitStatement(node.block);
+    } else if (node is EmptyFunctionBody) {
+      return;
+    } else if (node is ExpressionFunctionBody) {
+      _visitExpression(node.expression);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+  }
+
+  void _visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    var function = node.functionDeclaration;
+    _visitTypeAnnotation(function.returnType);
+    _visitFunctionExpression(function.functionExpression);
+  }
+
+  void _visitFunctionExpression(FunctionExpression node) {
+    _localScopes.enter();
+    _visitTypeParameterList(node.typeParameters);
+    _visitFormalParameterList(node.parameters);
+    _visitFormalParameterListImpl(node.parameters);
+    _visitFunctionBody(node.body);
+    _localScopes.exit();
+  }
+
+  void _visitIndexExpression(IndexExpression node,
+      {@required bool get, @required bool set}) {
+    var target = node.target;
+    if (target == null) {
+      // no dependencies
+    } else if (target is SuperExpression) {
+      if (get) {
+        _superReferences.add('[]');
+      }
+      if (set) {
+        _superReferences.add('[]=');
+      }
+    } else {
+      _visitExpression(target);
+      var targetType = target.staticType;
+      if (get) {
+        _recordClassMemberReference(targetType, '[]');
+      }
+      if (set) {
+        _recordClassMemberReference(targetType, '[]=');
+      }
+    }
+
+    _visitExpression(node.index);
+  }
+
+  void _visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _visitConstructorName(node.constructorName);
+    _visitArgumentList(node.argumentList);
+  }
+
+  void _visitListLiteral(ListLiteral node) {
+    _visitTypeArguments(node.typeArguments);
+    var elements = node.elements;
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      _visitExpression(element);
+    }
+  }
+
+  void _visitMapLiteral(MapLiteral node) {
+    _visitTypeArguments(node.typeArguments);
+    var entries = node.entries;
+    for (var i = 0; i < entries.length; i++) {
+      var entry = entries[i];
+      _visitExpression(entry.key);
+      _visitExpression(entry.value);
+    }
+  }
+
+  void _visitMethodInvocation(MethodInvocation node) {
+    var realTarget = node.realTarget;
+    if (realTarget == null) {
+      _visitExpression(node.methodName);
+    } else if (realTarget is SuperExpression) {
+      _superReferences.add(node.methodName.name);
+    } else {
+      _visitExpression(node.target);
+      _recordClassMemberReference(
+        realTarget.staticType,
+        node.methodName.name,
+      );
+    }
+    _visitTypeArguments(node.typeArguments);
+    _visitArgumentList(node.argumentList);
+  }
+
+  void _visitPostfixExpression(PostfixExpression node) {
+    _visitExpression(node.operand);
+
+    var operator = node.operator.type;
+    if (operator == TokenType.MINUS_MINUS) {
+      _recordClassMemberReference(node.operand.staticType, '-');
+    } else if (operator == TokenType.PLUS_PLUS) {
+      _recordClassMemberReference(node.operand.staticType, '+');
+    } else {
+      throw UnimplementedError('$operator');
+    }
+  }
+
+  void _visitPrefixedIdentifier(PrefixedIdentifier node) {
+    var prefix = node.prefix;
+    var prefixElement = prefix.staticElement;
+    if (prefixElement is PrefixElement) {
+      var prefixName = prefix.name;
+      var importPrefix = _importPrefix(prefixName);
+      importPrefix.add(node.identifier.name);
+    } else {
+      _visitExpression(prefix);
+      _recordClassMemberReference(prefix.staticType, node.identifier.name);
+    }
+  }
+
+  void _visitPrefixExpression(PrefixExpression node) {
+    _visitExpression(node.operand);
+
+    var operatorName = node.operator.lexeme;
+    if (operatorName == '-') operatorName = 'unary-';
+
+    _recordClassMemberReference(node.operand.staticType, operatorName);
+  }
+
+  void _visitPropertyAccess(PropertyAccess node,
+      {@required bool get, @required bool set}) {
+    var realTarget = node.realTarget;
+    var name = node.propertyName.name;
+
+    if (realTarget is SuperExpression) {
+      if (get) {
+        _superReferences.add(name);
+      }
+      if (set) {
+        _superReferences.add('$name=');
+      }
+    } else {
+      _visitExpression(node.target);
+      if (get) {
+        _recordClassMemberReference(realTarget.staticType, name);
+      }
+      if (set) {
+        _recordClassMemberReference(realTarget.staticType, '$name=');
+      }
+    }
+  }
+
+  void _visitSetLiteral(SetLiteral node) {
+    _visitTypeArguments(node.typeArguments);
+    var elements = node.elements;
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      _visitExpression(element);
+    }
+  }
+
+  void _visitSimpleIdentifier(SimpleIdentifier node,
+      {@required bool get, @required bool set}) {
+    if (node.isSynthetic) return;
+
+    var name = node.name;
+    if (_localScopes.contains(name) || name == 'void' || name == 'dynamic') {
+      return;
+    }
+
+    if (get) {
+      _recordUnprefixedReference(name);
+    }
+    if (set) {
+      _recordUnprefixedReference('$name=');
+    }
+  }
+
+  void _visitStatement(Statement node) {
+    if (node == null) return;
+
+    if (node is AssertStatement) {
+      _visitExpression(node.condition);
+      _visitExpression(node.message);
+    } else if (node is Block) {
+      _visitBlock(node);
+    } else if (node is BreakStatement) {
+      // nothing
+    } else if (node is ContinueStatement) {
+      // nothing
+    } else if (node is DoStatement) {
+      _visitStatement(node.body);
+      _visitExpression(node.condition);
+    } else if (node is EmptyStatement) {
+      // nothing
+    } else if (node is ExpressionStatement) {
+      _visitExpression(node.expression);
+    } else if (node is ForEachStatement) {
+      _visitForEachStatement(node);
+    } else if (node is ForStatement) {
+      _visitForStatement(node);
+    } else if (node is FunctionDeclarationStatement) {
+      _visitFunctionDeclarationStatement(node);
+    } else if (node is IfStatement) {
+      _visitExpression(node.condition);
+      _visitStatement(node.thenStatement);
+      _visitStatement(node.elseStatement);
+    } else if (node is LabeledStatement) {
+      _visitStatement(node.statement);
+    } else if (node is ReturnStatement) {
+      _visitExpression(node.expression);
+    } else if (node is SwitchStatement) {
+      _visitSwitchStatement(node);
+    } else if (node is TryStatement) {
+      _visitTryStatement(node);
+    } else if (node is VariableDeclarationStatement) {
+      _visitVariableList(node.variables);
+    } else if (node is WhileStatement) {
+      _visitExpression(node.condition);
+      _visitStatement(node.body);
+    } else if (node is YieldStatement) {
+      _visitExpression(node.expression);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+  }
+
+  void _visitStatements(List<Statement> statements) {
+    _localScopes.enter();
+
+    for (var i = 0; i < statements.length; i++) {
+      var statement = statements[i];
+      if (statement is FunctionDeclarationStatement) {
+        _localScopes.add(statement.functionDeclaration.name.name);
+      } else if (statement is VariableDeclarationStatement) {
+        var variables = statement.variables.variables;
+        for (int i = 0; i < variables.length; i++) {
+          _localScopes.add(variables[i].name.name);
+        }
+      }
+    }
+
+    for (var i = 0; i < statements.length; i++) {
+      var statement = statements[i];
+      _visitStatement(statement);
+    }
+
+    _localScopes.exit();
+  }
+
+  void _visitStringInterpolation(StringInterpolation node) {
+    var elements = node.elements;
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      if (element is InterpolationExpression) {
+        _visitExpression(element.expression);
+      }
+    }
+  }
+
+  void _visitSwitchStatement(SwitchStatement node) {
+    _visitExpression(node.expression);
+    var members = node.members;
+    for (var i = 0; i < members.length; i++) {
+      var member = members[i];
+      if (member is SwitchCase) {
+        _visitExpression(member.expression);
+      }
+      _visitStatements(member.statements);
+    }
+  }
+
+  void _visitTryStatement(TryStatement node) {
+    _visitBlock(node.body);
+
+    var catchClauses = node.catchClauses;
+    for (var i = 0; i < catchClauses.length; i++) {
+      var catchClause = catchClauses[i];
+      _visitTypeAnnotation(catchClause.exceptionType);
+
+      _localScopes.enter();
+
+      var exceptionParameter = catchClause.exceptionParameter;
+      if (exceptionParameter != null) {
+        _localScopes.add(exceptionParameter.name);
+      }
+
+      var stackTraceParameter = catchClause.stackTraceParameter;
+      if (stackTraceParameter != null) {
+        _localScopes.add(stackTraceParameter.name);
+      }
+
+      _visitBlock(catchClause.body);
+
+      _localScopes.exit();
+    }
+
+    _visitBlock(node.finallyBlock);
+  }
+
+  void _visitTypeAnnotation(TypeAnnotation node) {
+    if (node == null) return;
+
+    if (node is GenericFunctionType) {
+      _localScopes.enter();
+
+      if (node.typeParameters != null) {
+        var typeParameters = node.typeParameters.typeParameters;
+        for (var i = 0; i < typeParameters.length; i++) {
+          var typeParameter = typeParameters[i];
+          _localScopes.add(typeParameter.name.name);
+        }
+        for (var i = 0; i < typeParameters.length; i++) {
+          var typeParameter = typeParameters[i];
+          _visitTypeAnnotation(typeParameter.bound);
+        }
+      }
+
+      _visitTypeAnnotation(node.returnType);
+      _visitFormalParameterList(node.parameters);
+
+      _localScopes.exit();
+    } else if (node is TypeName) {
+      var identifier = node.name;
+      _visitExpression(identifier);
+      _visitTypeArguments(node.typeArguments);
+    } else {
+      throw UnimplementedError('(${node.runtimeType}) $node');
+    }
+  }
+
+  void _visitTypeAnnotations(List<TypeAnnotation> typeAnnotations) {
+    if (typeAnnotations == null) return;
+
+    for (var i = 0; i < typeAnnotations.length; i++) {
+      var typeAnnotation = typeAnnotations[i];
+      _visitTypeAnnotation(typeAnnotation);
+    }
+  }
+
+  void _visitTypeArguments(TypeArgumentList node) {
+    if (node == null) return;
+
+    _visitTypeAnnotations(node.arguments);
+  }
+
+  void _visitTypeParameterList(TypeParameterList node) {
+    if (node == null) return;
+
+    var typeParameters = node.typeParameters;
+
+    // Define all type parameters in the local scope.
+    for (var i = 0; i < typeParameters.length; i++) {
+      var typeParameter = typeParameters[i];
+      _localScopes.add(typeParameter.name.name);
+    }
+
+    // Record bounds.
+    for (var i = 0; i < typeParameters.length; i++) {
+      var typeParameter = typeParameters[i];
+      _visitTypeAnnotation(typeParameter.bound);
+    }
+  }
+
+  void _visitVariableList(VariableDeclarationList node) {
+    if (node == null) return;
+
+    _visitTypeAnnotation(node.type);
+
+    var variables = node.variables;
+    for (int i = 0; i < variables.length; i++) {
+      var variable = variables[i];
+      _localScopes.add(variable.name.name);
+      _visitExpression(variable.initializer);
+    }
+  }
+}
+
+/// The sorted set of [ClassMemberReference]s.
+class _ClassMemberReferenceSet {
+  final List<ClassMemberReference> references = [];
+
+  void add(ClassElement class_, String name) {
+    var target = LibraryQualifiedName(class_.library.source.uri, class_.name);
+    var reference = ClassMemberReference(target, name);
+    if (!references.contains(reference)) {
+      references.add(reference);
+    }
+  }
+
+  /// Return the sorted list of unique class member references.
+  List<ClassMemberReference> toList() {
+    references.sort(ClassMemberReference.compare);
+    return references;
+  }
+}
+
+/// The stack of names that are defined in a local scope inside the node,
+/// such as parameters, local variables, local functions, local type
+/// parameters, etc.
+class _LocalScopes {
+  /// The stack of name sets.
+  final List<_NameSet> scopes = [];
+
+  bool get isEmpty => scopes.isEmpty;
+
+  /// Add the given [name] to the current local scope.
+  void add(String name) {
+    scopes.last.add(name);
+  }
+
+  /// Return whether the given [name] is defined in one of the local scopes.
+  bool contains(String name) {
+    for (var i = 0; i < scopes.length; i++) {
+      if (scopes[i].contains(name)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /// Enter a new local scope, e.g. a block, or a type parameter scope.
+  void enter() {
+    scopes.add(_NameSet());
+  }
+
+  /// Exit the current local scope.
+  void exit() {
+    scopes.removeLast();
+  }
+}
+
+class _NameSet {
+  final List<String> names = [];
+
+  bool get isNotEmpty => names.isNotEmpty;
+
+  void add(String name) {
+    // TODO(scheglov) consider just adding, but toList() sort and unique
+    if (!contains(name)) {
+      names.add(name);
+    }
+  }
+
+  bool contains(String name) => names.contains(name);
+
+  List<String> toList() {
+    names.sort(_compareStrings);
+    return names;
+  }
+
+  static int _compareStrings(String first, String second) {
+    return first.compareTo(second);
+  }
+}
+
+class _ReferencedImportPrefixedNames {
+  final String prefix;
+  _NameSet names = _NameSet();
+
+  _ReferencedImportPrefixedNames(this.prefix);
+
+  void add(String name) {
+    names.add(name);
+  }
+
+  void clear() {
+    names = _NameSet();
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index dd10465..e8c9902 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,12 +6,12 @@
 import 'dart:collection';
 import 'dart:typed_data';
 
+import 'package:analyzer/dart/analysis/analysis_context.dart' as api;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/dart/analysis/results.dart' as results;
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart'
-    show CompilationUnitElement, LibraryElement;
+import 'package:analyzer/dart/element/element.dart' show LibraryElement;
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/exception/exception.dart';
@@ -24,6 +24,7 @@
 import 'package:analyzer/src/dart/analysis/library_analyzer.dart';
 import 'package:analyzer/src/dart/analysis/library_context.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
@@ -93,7 +94,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 73;
+  static const int DATA_VERSION = 76;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
@@ -143,11 +144,6 @@
   AnalysisOptionsImpl _analysisOptions;
 
   /**
-   * The optional SDK bundle, used when the client cannot read SDK files.
-   */
-  final PackageBundle _sdkBundle;
-
-  /**
    * The [SourceFactory] is used to resolve URIs to paths and restore URIs
    * from file paths.
    */
@@ -164,16 +160,21 @@
   final ContextRoot contextRoot;
 
   /**
+   * The analysis context that created this driver / session.
+   */
+  api.AnalysisContext analysisContext;
+
+  /**
    * The salt to mix into all hashes used as keys for unlinked data.
    */
   final Uint32List _unlinkedSalt =
-      new Uint32List(1 + AnalysisOptionsImpl.unlinkedSignatureLength);
+      new Uint32List(2 + AnalysisOptionsImpl.unlinkedSignatureLength);
 
   /**
    * The salt to mix into all hashes used as keys for linked data.
    */
   final Uint32List _linkedSalt =
-      new Uint32List(1 + AnalysisOptions.signatureLength);
+      new Uint32List(2 + AnalysisOptions.signatureLength);
 
   /**
    * The set of priority files, that should be analyzed sooner.
@@ -184,7 +185,14 @@
    * The mapping from the files for which analysis was requested using
    * [getResult] to the [Completer]s to report the result.
    */
-  final _requestedFiles = <String, List<Completer<AnalysisResult>>>{};
+  final _requestedFiles = <String, List<Completer<ResolvedUnitResult>>>{};
+
+  /**
+   * The mapping from the files for which analysis was requested using
+   * [getResolvedLibrary] to the [Completer]s to report the result.
+   */
+  final _requestedLibraries =
+      <String, List<Completer<ResolvedLibraryResult>>>{};
 
   /**
    * The task that discovers available files.  If this field is not `null`,
@@ -248,7 +256,7 @@
    * [getResult], and which were found to be parts without known libraries,
    * to the [Completer]s to report the result.
    */
-  final _requestedParts = <String, List<Completer<AnalysisResult>>>{};
+  final _requestedParts = <String, List<Completer<ResolvedUnitResult>>>{};
 
   /**
    * The set of part files that are currently scheduled for analysis.
@@ -258,12 +266,12 @@
   /**
    * The controller for the [results] stream.
    */
-  final _resultController = new StreamController<AnalysisResult>();
+  final _resultController = new StreamController<ResolvedUnitResult>();
 
   /**
    * The stream that will be written to when analysis results are produced.
    */
-  Stream<AnalysisResult> _onResults;
+  Stream<ResolvedUnitResult> _onResults;
 
   /**
    * Resolution signatures of the most recently produced results for files.
@@ -273,7 +281,7 @@
   /**
    * Cached results for [_priorityFiles].
    */
-  final Map<String, AnalysisResult> _priorityResults = {};
+  final Map<String, ResolvedUnitResult> _priorityResults = {};
 
   /**
    * The controller for the [exceptions] stream.
@@ -314,6 +322,11 @@
   final bool disableChangesAndCacheAllResults;
 
   /**
+   * Whether resolved units should be indexed.
+   */
+  final bool enableIndex;
+
+  /**
    * The cache to use with [disableChangesAndCacheAllResults].
    */
   final Map<String, AnalysisResult> _allCachedResults = {};
@@ -324,6 +337,13 @@
   AnalysisSessionImpl _currentSession;
 
   /**
+   * The current library context, consistent with the [_currentSession].
+   *
+   * TODO(scheglov) We probably should tie it into the session.
+   */
+  LibraryContext _libraryContext;
+
+  /**
    * Create a new instance of [AnalysisDriver].
    *
    * The given [SourceFactory] is cloned to ensure that it does not contain a
@@ -338,12 +358,11 @@
       this.contextRoot,
       SourceFactory sourceFactory,
       this._analysisOptions,
-      {PackageBundle sdkBundle,
-      this.disableChangesAndCacheAllResults: false,
+      {this.disableChangesAndCacheAllResults: false,
+      this.enableIndex: false,
       SummaryDataStore externalSummaries})
       : _logger = logger,
         _sourceFactory = sourceFactory.clone(),
-        _sdkBundle = sdkBundle,
         _externalSummaries = externalSummaries {
     _createNewSession();
     _onResults = _resultController.stream.asBroadcastStream();
@@ -447,7 +466,7 @@
    * Results might be produced even for files that have never been added
    * using [addFile], for example when [getResult] was called for a file.
    */
-  Stream<AnalysisResult> get results => _onResults;
+  Stream<ResolvedUnitResult> get results => _onResults;
 
   /**
    * Return the search support for the driver.
@@ -468,6 +487,9 @@
     if (_requestedFiles.isNotEmpty) {
       return AnalysisDriverPriority.interactive;
     }
+    if (_requestedLibraries.isNotEmpty) {
+      return AnalysisDriverPriority.interactive;
+    }
     if (_discoverAvailableFilesTask != null &&
         !_discoverAvailableFilesTask.isCompleted) {
       return AnalysisDriverPriority.interactive;
@@ -516,6 +538,7 @@
         _unitElementRequestedParts.isNotEmpty) {
       return AnalysisDriverPriority.general;
     }
+    _libraryContext = null;
     return AnalysisDriverPriority.nothing;
   }
 
@@ -601,17 +624,17 @@
   }
 
   /**
-   * Return the cached [AnalysisResult] for the Dart file with the given [path].
-   * If there is no cached result, return `null`. Usually only results of
-   * priority files are cached.
+   * Return the cached [ResolvedUnitResult] for the Dart file with the given
+   * [path]. If there is no cached result, return `null`. Usually only results
+   * of priority files are cached.
    *
    * The [path] must be absolute and normalized.
    *
    * The [path] can be any file - explicitly or implicitly analyzed, or neither.
    */
-  AnalysisResult getCachedResult(String path) {
+  ResolvedUnitResult getCachedResult(String path) {
     _throwIfNotAbsolutePath(path);
-    AnalysisResult result = _priorityResults[path];
+    ResolvedUnitResult result = _priorityResults[path];
     if (disableChangesAndCacheAllResults) {
       result ??= _allCachedResults[path];
     }
@@ -635,13 +658,7 @@
 
     // Ask the analysis result without unit, so return cached errors.
     // If no cached analysis result, it will be computed.
-    AnalysisResult analysisResult = await _computeAnalysisResult(path);
-
-    // Check for asynchronous changes during computing the result.
-    await _runTestAsyncWorkDuringAnalysis(path);
-    if (_fileTracker.hasChangedFiles) {
-      analysisResult = null;
-    }
+    ResolvedUnitResult analysisResult = _computeAnalysisResult(path);
 
     // If not computed yet, because a part file without a known library,
     // we have to compute the full analysis result, with the unit.
@@ -650,7 +667,7 @@
       return null;
     }
 
-    return new ErrorsResult(currentSession, path, analysisResult.uri,
+    return new ErrorsResultImpl(currentSession, path, analysisResult.uri,
         analysisResult.lineInfo, analysisResult.isPart, analysisResult.errors);
   }
 
@@ -686,7 +703,7 @@
   FileResult getFileSync(String path) {
     _throwIfNotAbsolutePath(path);
     FileState file = _fileTracker.verifyApiSignature(path);
-    return new FileResult(
+    return new FileResultImpl(
         _currentSession, path, file.uri, file.lineInfo, file.isPart);
   }
 
@@ -697,6 +714,9 @@
    */
   Future<AnalysisDriverUnitIndex> getIndex(String path) {
     _throwIfNotAbsolutePath(path);
+    if (!enableIndex) {
+      throw new ArgumentError('Indexing is not enabled.');
+    }
     if (!_fsState.hasUri(path)) {
       return new Future.value();
     }
@@ -712,19 +732,154 @@
    * Return a [Future] that completes with the [LibraryElement] for the given
    * [uri], which is either resynthesized from the provided external summary
    * store, or built for a file to which the given [uri] is resolved.
+   *
+   * Throw [ArgumentError] if the [uri] corresponds to a part.
    */
   Future<LibraryElement> getLibraryByUri(String uri) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    if (_externalSummaries != null && _externalSummaries.hasUnlinkedUnit(uri)) {
-      return LibraryContext.resynthesizeLibraryElement(analysisOptions,
-          declaredVariables, sourceFactory, _externalSummaries, uri);
+    var uriObj = Uri.parse(uri);
+    var file = _fsState.getFileForUri(uriObj);
+
+    if (file.isExternalLibrary) {
+      return _createLibraryContext(file).getLibraryElement(file);
     }
-    Source source = sourceFactory.resolveUri(null, uri);
-    UnitElementResult unitResult = await getUnitElement(source.fullName);
+
+    if (file.isPart) {
+      throw ArgumentError('$uri is not a library.');
+    }
+
+    UnitElementResult unitResult = await getUnitElement(file.path);
     return unitResult.element.library;
   }
 
+  /**
+   * Return a [ParsedLibraryResult] for the library with the given [path].
+   *
+   * Throw [ArgumentError] if the given [path] is not the defining compilation
+   * unit for a library (that is, is a part of a library).
+   *
+   * The [path] must be absolute and normalized.
+   */
+  ParsedLibraryResult getParsedLibrary(String path) {
+    FileState file = _fsState.getFileForPath(path);
+
+    if (file.isExternalLibrary) {
+      return ParsedLibraryResultImpl.external(currentSession, file.uri);
+    }
+
+    if (file.isPart) {
+      throw ArgumentError('Is a part: $path');
+    }
+
+    var units = <ParsedUnitResult>[];
+    for (var unitFile in file.libraryFiles) {
+      var unitPath = unitFile.path;
+      if (unitPath != null) {
+        var unitResult = parseFileSync(unitPath);
+        units.add(unitResult);
+      }
+    }
+
+    return ParsedLibraryResultImpl(currentSession, path, file.uri, units);
+  }
+
+  /**
+   * Return a [ParsedLibraryResult] for the library with the given [uri].
+   *
+   * Throw [ArgumentError] if the given [uri] is not the defining compilation
+   * unit for a library (that is, is a part of a library).
+   */
+  ParsedLibraryResult getParsedLibraryByUri(Uri uri) {
+    FileState file = _fsState.getFileForUri(uri);
+
+    if (file.isExternalLibrary) {
+      return ParsedLibraryResultImpl.external(currentSession, file.uri);
+    }
+
+    if (file.isPart) {
+      throw ArgumentError('Is a part: $uri');
+    }
+
+    // The file is a local file, we can get the result.
+    return getParsedLibrary(file.path);
+  }
+
+  /**
+   * Return a [Future] that completes with a [ResolvedLibraryResult] for the
+   * Dart library file with the given [path].  If the file is not a Dart file
+   * or cannot be analyzed, the [Future] completes with `null`.
+   *
+   * Throw [ArgumentError] if the given [path] is not the defining compilation
+   * unit for a library (that is, is a part of a library).
+   *
+   * The [path] must be absolute and normalized.
+   *
+   * The [path] can be any file - explicitly or implicitly analyzed, or neither.
+   *
+   * Invocation of this method causes the analysis state to transition to
+   * "analyzing" (if it is not in that state already), the driver will produce
+   * the resolution result for it, which is consistent with the current file
+   * state (including new states of the files previously reported using
+   * [changeFile]), prior to the next time the analysis state transitions
+   * to "idle".
+   */
+  Future<ResolvedLibraryResult> getResolvedLibrary(String path) {
+    _throwIfNotAbsolutePath(path);
+    if (!_fsState.hasUri(path)) {
+      return new Future.value();
+    }
+
+    FileState file = _fsState.getFileForPath(path);
+
+    if (file.isExternalLibrary) {
+      return Future.value(
+        ResolvedLibraryResultImpl.external(currentSession, file.uri),
+      );
+    }
+
+    if (file.isPart) {
+      throw ArgumentError('Is a part: $path');
+    }
+
+    // Schedule analysis.
+    var completer = new Completer<ResolvedLibraryResult>();
+    _requestedLibraries
+        .putIfAbsent(path, () => <Completer<ResolvedLibraryResult>>[])
+        .add(completer);
+    _scheduler.notify(this);
+    return completer.future;
+  }
+
+  /**
+   * Return a [Future] that completes with a [ResolvedLibraryResult] for the
+   * Dart library file with the given [uri].
+   *
+   * Throw [ArgumentError] if the given [uri] is not the defining compilation
+   * unit for a library (that is, is a part of a library).
+   *
+   * Invocation of this method causes the analysis state to transition to
+   * "analyzing" (if it is not in that state already), the driver will produce
+   * the resolution result for it, which is consistent with the current file
+   * state (including new states of the files previously reported using
+   * [changeFile]), prior to the next time the analysis state transitions
+   * to "idle".
+   */
+  Future<ResolvedLibraryResult> getResolvedLibraryByUri(Uri uri) {
+    FileState file = _fsState.getFileForUri(uri);
+
+    if (file.isExternalLibrary) {
+      return Future.value(
+        ResolvedLibraryResultImpl.external(currentSession, file.uri),
+      );
+    }
+
+    if (file.isPart) {
+      throw ArgumentError('Is a part: $uri');
+    }
+
+    // The file is a local file, we can get the result.
+    return getResolvedLibrary(file.path);
+  }
+
   ApiSignature getResolvedUnitKeyByPath(String path) {
     _throwIfNotAbsolutePath(path);
     ApiSignature signature = getUnitKeyByPath(path);
@@ -734,7 +889,7 @@
   }
 
   /**
-   * Return a [Future] that completes with a [AnalysisResult] for the Dart
+   * Return a [Future] that completes with a [ResolvedUnitResult] for the Dart
    * file with the given [path]. If the file is not a Dart file or cannot
    * be analyzed, the [Future] completes with `null`.
    *
@@ -752,7 +907,7 @@
    * of the files previously reported using [changeFile]), prior to the next
    * time the analysis state transitions to "idle".
    */
-  Future<AnalysisResult> getResult(String path,
+  Future<ResolvedUnitResult> getResult(String path,
       {bool sendCachedToStream: false}) {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
@@ -761,7 +916,7 @@
 
     // Return the cached result.
     {
-      AnalysisResult result = getCachedResult(path);
+      ResolvedUnitResult result = getCachedResult(path);
       if (result != null) {
         if (sendCachedToStream) {
           _resultController.add(result);
@@ -771,9 +926,9 @@
     }
 
     // Schedule analysis.
-    var completer = new Completer<AnalysisResult>();
+    var completer = new Completer<ResolvedUnitResult>();
     _requestedFiles
-        .putIfAbsent(path, () => <Completer<AnalysisResult>>[])
+        .putIfAbsent(path, () => <Completer<ResolvedUnitResult>>[])
         .add(completer);
     _scheduler.notify(this);
     return completer.future;
@@ -859,7 +1014,22 @@
   }
 
   /**
-   * Return a [Future] that completes with a [ParseResult] for the file
+   * Return `true` is the file with the given absolute [uri] is a library,
+   * or `false` if it is a part. More specifically, return `true` if the file
+   * is not known to be a part.
+   *
+   * Correspondingly, return `true` if the [uri] does not correspond to a file,
+   * for any reason, e.g. the file does not exist, or the [uri] cannot be
+   * resolved to a file path, or the [uri] is invalid, e.g. a `package:` URI
+   * without a package name. In these cases we cannot prove that the file is
+   * not a part, so it must be a library.
+   */
+  bool isLibraryByUri(Uri uri) {
+    return !_fsState.getFileForUri(uri).isPart;
+  }
+
+  /**
+   * Return a [Future] that completes with a [ParsedUnitResult] for the file
    * with the given [path].
    *
    * The [path] must be absolute and normalized.
@@ -870,14 +1040,14 @@
    * produced through the [results] stream (just because it is not a fully
    * resolved unit).
    */
-  Future<ParseResult> parseFile(String path) async {
+  Future<ParsedUnitResult> parseFile(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return parseFileSync(path);
   }
 
   /**
-   * Return a [ParseResult] for the file with the given [path].
+   * Return a [ParsedUnitResult] for the file with the given [path].
    *
    * The [path] must be absolute and normalized.
    *
@@ -887,17 +1057,17 @@
    * produced through the [results] stream (just because it is not a fully
    * resolved unit).
    */
-  ParseResult parseFileSync(String path) {
+  ParsedUnitResult parseFileSync(String path) {
     _throwIfNotAbsolutePath(path);
     FileState file = _fileTracker.verifyApiSignature(path);
     RecordingErrorListener listener = new RecordingErrorListener();
     CompilationUnit unit = file.parse(listener);
-    return new ParseResult(currentSession, file.path, file.uri, file.content,
-        file.lineInfo, file.isPart, unit, listener.errors);
+    return new ParsedUnitResultImpl(currentSession, file.path, file.uri,
+        file.content, file.lineInfo, file.isPart, unit, listener.errors);
   }
 
   @override
-  Future<Null> performWork() async {
+  Future<void> performWork() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     if (_fileTracker.verifyChangedFilesIfNeeded()) {
@@ -908,13 +1078,7 @@
     if (_requestedFiles.isNotEmpty) {
       String path = _requestedFiles.keys.first;
       try {
-        AnalysisResult result =
-            await _computeAnalysisResult(path, withUnit: true);
-        // Check for asynchronous changes during computing the result.
-        await _runTestAsyncWorkDuringAnalysis(path);
-        if (_fileTracker.hasChangedFiles) {
-          return;
-        }
+        AnalysisResult result = _computeAnalysisResult(path, withUnit: true);
         // If a part without a library, delay its analysis.
         if (result == null) {
           _requestedParts
@@ -938,10 +1102,26 @@
       return;
     }
 
+    // Analyze a requested library.
+    if (_requestedLibraries.isNotEmpty) {
+      String path = _requestedLibraries.keys.first;
+      try {
+        var result = _computeResolvedLibrary(path);
+        _requestedLibraries.remove(path).forEach((completer) {
+          completer.complete(result);
+        });
+      } catch (exception, stackTrace) {
+        _requestedLibraries.remove(path).forEach((completer) {
+          completer.completeError(exception, stackTrace);
+        });
+      }
+      return;
+    }
+
     // Process an index request.
     if (_indexRequestedFiles.isNotEmpty) {
       String path = _indexRequestedFiles.keys.first;
-      AnalysisDriverUnitIndex index = await _computeIndex(path);
+      AnalysisDriverUnitIndex index = _computeIndex(path);
       _indexRequestedFiles.remove(path).forEach((completer) {
         completer.complete(index);
       });
@@ -968,7 +1148,7 @@
     // Process a unit element request.
     if (_unitElementRequestedFiles.isNotEmpty) {
       String path = _unitElementRequestedFiles.keys.first;
-      UnitElementResult result = await _computeUnitElement(path);
+      UnitElementResult result = _computeUnitElement(path);
       var completers = _unitElementRequestedFiles.remove(path);
       if (result != null) {
         completers.forEach((completer) {
@@ -1026,8 +1206,7 @@
         if (_fileTracker.isFilePending(path)) {
           try {
             AnalysisResult result =
-                await _computeAnalysisResult(path, withUnit: true);
-            await _runTestAsyncWorkDuringAnalysis(path);
+                _computeAnalysisResult(path, withUnit: true);
             if (result == null) {
               _partsToAnalyze.add(path);
             } else {
@@ -1047,9 +1226,8 @@
     if (_fileTracker.hasPendingFiles) {
       String path = _fileTracker.anyPendingFile;
       try {
-        AnalysisResult result = await _computeAnalysisResult(path,
+        AnalysisResult result = _computeAnalysisResult(path,
             withUnit: false, skipIfSameSignature: true);
-        await _runTestAsyncWorkDuringAnalysis(path);
         if (result == null) {
           _partsToAnalyze.add(path);
         } else if (result == AnalysisResult._UNCHANGED) {
@@ -1071,12 +1249,8 @@
     if (_requestedParts.isNotEmpty) {
       String path = _requestedParts.keys.first;
       try {
-        AnalysisResult result = await _computeAnalysisResult(path,
+        AnalysisResult result = _computeAnalysisResult(path,
             withUnit: true, asIsIfPartWithoutLibrary: true);
-        // Check for asynchronous changes during computing the result.
-        if (_fileTracker.hasChangedFiles) {
-          return;
-        }
         // Notify the completers.
         _requestedParts.remove(path).forEach((completer) {
           completer.complete(result);
@@ -1098,7 +1272,7 @@
       String path = _partsToAnalyze.first;
       _partsToAnalyze.remove(path);
       try {
-        AnalysisResult result = await _computeAnalysisResult(path,
+        AnalysisResult result = _computeAnalysisResult(path,
             withUnit: _priorityFiles.contains(path),
             asIsIfPartWithoutLibrary: true);
         _resultController.add(result);
@@ -1111,7 +1285,7 @@
     // Process a unit element signature request for a part.
     if (_unitElementSignatureParts.isNotEmpty) {
       String path = _unitElementSignatureParts.keys.first;
-      var signature =
+      String signature =
           _computeUnitElementSignature(path, asIsIfPartWithoutLibrary: true);
       _unitElementSignatureParts.remove(path).forEach((completer) {
         completer.complete(signature);
@@ -1123,7 +1297,7 @@
     if (_unitElementRequestedParts.isNotEmpty) {
       String path = _unitElementRequestedParts.keys.first;
       UnitElementResult result =
-          await _computeUnitElement(path, asIsIfPartWithoutLibrary: true);
+          _computeUnitElement(path, asIsIfPartWithoutLibrary: true);
       _unitElementRequestedParts.remove(path).forEach((completer) {
         completer.complete(result);
       });
@@ -1144,14 +1318,26 @@
     _throwIfNotAbsolutePath(path);
     _throwIfChangesAreNotAllowed();
     _fileTracker.removeFile(path);
+    _libraryContext = null;
     _priorityResults.clear();
   }
 
   /**
+   * Reset URI resolution, read again all files, build files graph, and ensure
+   * that for all added files new results are reported.
+   */
+  void resetUriResolution() {
+    _fsState.resetUriResolution();
+    _fileTracker.scheduleAllAddedFiles();
+    _changeHook();
+  }
+
+  /**
    * Implementation for [changeFile].
    */
   void _changeFile(String path) {
     _fileTracker.changeFile(path);
+    _libraryContext = null;
     _priorityResults.clear();
   }
 
@@ -1161,6 +1347,7 @@
    */
   void _changeHook() {
     _createNewSession();
+    _libraryContext = null;
     _priorityResults.clear();
     _scheduler.notify(this);
   }
@@ -1180,12 +1367,10 @@
    * the resolved signature of the file in its library is the same as the one
    * that was the most recently produced to the client.
    */
-  Future<AnalysisResult> _computeAnalysisResult(String path,
+  AnalysisResult _computeAnalysisResult(String path,
       {bool withUnit: false,
       bool asIsIfPartWithoutLibrary: false,
-      bool skipIfSameSignature: false}) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+      bool skipIfSameSignature: false}) {
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
@@ -1221,66 +1406,61 @@
     }
 
     // We need the fully resolved unit, or the result is not cached.
-    return _logger.runAsync('Compute analysis result for $path', () async {
-      // TODO(brianwilkerson) Determine whether this await is necessary.
-      await null;
+    return _logger.run('Compute analysis result for $path', () {
       try {
-        LibraryContext libraryContext;
-        try {
-          _testView.numOfAnalyzedLibraries++;
+        _testView.numOfAnalyzedLibraries++;
 
-          if (!_fsState.getFileForUri(Uri.parse('dart:core')).exists) {
-            return _newMissingDartLibraryResult(file, 'dart:core');
-          }
-          if (!_fsState.getFileForUri(Uri.parse('dart:async')).exists) {
-            return _newMissingDartLibraryResult(file, 'dart:async');
-          }
-          libraryContext = await _createLibraryContext(library);
-
-          LibraryAnalyzer analyzer = new LibraryAnalyzer(
-              analysisOptions,
-              declaredVariables,
-              sourceFactory,
-              libraryContext.isLibraryUri,
-              libraryContext.analysisContext,
-              libraryContext.resynthesizer,
-              library);
-          Map<FileState, UnitAnalysisResult> results = await analyzer.analyze();
-
-          List<int> bytes;
-          CompilationUnit resolvedUnit;
-          for (FileState unitFile in results.keys) {
-            UnitAnalysisResult unitResult = results[unitFile];
-            List<int> unitBytes =
-                _serializeResolvedUnit(unitResult.unit, unitResult.errors);
-            String unitSignature = _getResolvedUnitSignature(library, unitFile);
-            String unitKey = _getResolvedUnitKey(unitSignature);
-            _byteStore.put(unitKey, unitBytes);
-            if (unitFile == file) {
-              bytes = unitBytes;
-              resolvedUnit = unitResult.unit;
-            }
-            if (disableChangesAndCacheAllResults) {
-              AnalysisResult result = _getAnalysisResultFromBytes(
-                  unitFile, unitSignature, unitBytes,
-                  content: unitFile.content, resolvedUnit: unitResult.unit);
-              _allCachedResults[unitFile.path] = result;
-            }
-          }
-
-          // Return the result, full or partial.
-          _logger.writeln('Computed new analysis result.');
-          AnalysisResult result = _getAnalysisResultFromBytes(
-              file, signature, bytes,
-              content: withUnit ? file.content : null,
-              resolvedUnit: withUnit ? resolvedUnit : null);
-          if (withUnit && _priorityFiles.contains(path)) {
-            _priorityResults[path] = result;
-          }
-          return result;
-        } finally {
-          libraryContext?.dispose();
+        if (!_fsState.getFileForUri(Uri.parse('dart:core')).exists) {
+          return _newMissingDartLibraryResult(file, 'dart:core');
         }
+        if (!_fsState.getFileForUri(Uri.parse('dart:async')).exists) {
+          return _newMissingDartLibraryResult(file, 'dart:async');
+        }
+        var libraryContext = _createLibraryContext(library);
+
+        LibraryAnalyzer analyzer = new LibraryAnalyzer(
+            analysisOptions,
+            declaredVariables,
+            sourceFactory,
+            libraryContext.isLibraryUri,
+            libraryContext.analysisContext,
+            libraryContext.resynthesizer,
+            libraryContext.inheritanceManager,
+            library,
+            _resourceProvider);
+        Map<FileState, UnitAnalysisResult> results = analyzer.analyze();
+
+        List<int> bytes;
+        CompilationUnit resolvedUnit;
+        for (FileState unitFile in results.keys) {
+          UnitAnalysisResult unitResult = results[unitFile];
+          List<int> unitBytes =
+              _serializeResolvedUnit(unitResult.unit, unitResult.errors);
+          String unitSignature = _getResolvedUnitSignature(library, unitFile);
+          String unitKey = _getResolvedUnitKey(unitSignature);
+          _byteStore.put(unitKey, unitBytes);
+          if (unitFile == file) {
+            bytes = unitBytes;
+            resolvedUnit = unitResult.unit;
+          }
+          if (disableChangesAndCacheAllResults) {
+            AnalysisResult result = _getAnalysisResultFromBytes(
+                unitFile, unitSignature, unitBytes,
+                content: unitFile.content, resolvedUnit: unitResult.unit);
+            _allCachedResults[unitFile.path] = result;
+          }
+        }
+
+        // Return the result, full or partial.
+        _logger.writeln('Computed new analysis result.');
+        AnalysisResult result = _getAnalysisResultFromBytes(
+            file, signature, bytes,
+            content: withUnit ? file.content : null,
+            resolvedUnit: withUnit ? resolvedUnit : null);
+        if (withUnit && _priorityFiles.contains(path)) {
+          _priorityResults[path] = result;
+        }
+        return result;
       } catch (exception, stackTrace) {
         String contextKey =
             _storeExceptionContext(path, library, exception, stackTrace);
@@ -1289,18 +1469,71 @@
     });
   }
 
-  Future<AnalysisDriverUnitIndex> _computeIndex(String path) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    AnalysisResult analysisResult = await _computeAnalysisResult(path,
+  AnalysisDriverUnitIndex _computeIndex(String path) {
+    AnalysisResult analysisResult = _computeAnalysisResult(path,
         withUnit: false, asIsIfPartWithoutLibrary: true);
     return analysisResult._index;
   }
 
-  Future<UnitElementResult> _computeUnitElement(String path,
-      {bool asIsIfPartWithoutLibrary: false}) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+  /**
+   * Return the newly computed resolution result of the library with the
+   * given [path].
+   */
+  ResolvedLibraryResultImpl _computeResolvedLibrary(String path) {
+    FileState library = _fsState.getFileForPath(path);
+
+    return _logger.run('Compute resolved library $path', () {
+      _testView.numOfAnalyzedLibraries++;
+      var libraryContext = _createLibraryContext(library);
+
+      LibraryAnalyzer analyzer = new LibraryAnalyzer(
+          analysisOptions,
+          declaredVariables,
+          sourceFactory,
+          libraryContext.isLibraryUri,
+          libraryContext.analysisContext,
+          libraryContext.resynthesizer,
+          libraryContext.inheritanceManager,
+          library,
+          _resourceProvider);
+      Map<FileState, UnitAnalysisResult> unitResults = analyzer.analyze();
+      var resolvedUnits = <ResolvedUnitResult>[];
+
+      for (var unitFile in unitResults.keys) {
+        if (unitFile.path != null) {
+          var unitResult = unitResults[unitFile];
+          resolvedUnits.add(
+            new AnalysisResult(
+              currentSession,
+              _sourceFactory,
+              unitFile.path,
+              unitFile.uri,
+              unitFile.exists,
+              unitFile.content,
+              unitFile.lineInfo,
+              unitFile.isPart,
+              null,
+              unitResult.unit,
+              unitResult.errors,
+              null,
+            ),
+          );
+        }
+      }
+
+      return new ResolvedLibraryResultImpl(
+        currentSession,
+        library.path,
+        library.uri,
+        resolvedUnits.first.libraryElement,
+        libraryContext.typeProvider,
+        resolvedUnits,
+      );
+    });
+  }
+
+  UnitElementResult _computeUnitElement(String path,
+      {bool asIsIfPartWithoutLibrary: false}) {
     FileState file = _fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
@@ -1313,16 +1546,10 @@
       }
     }
 
-    LibraryContext libraryContext = await _createLibraryContext(library);
-    try {
-      CompilationUnitElement element =
-          libraryContext.computeUnitElement(library.source, file.source);
-      String signature = library.transitiveSignature;
-      return new UnitElementResult(
-          currentSession, path, file.uri, signature, element);
-    } finally {
-      libraryContext.dispose();
-    }
+    var libraryContext = _createLibraryContext(library);
+    var element = libraryContext.computeUnitElement(library, file);
+    return new UnitElementResultImpl(
+        currentSession, path, file.uri, library.transitiveSignature, element);
   }
 
   String _computeUnitElementSignature(String path,
@@ -1367,20 +1594,29 @@
   /**
    * Return the context in which the [library] should be analyzed.
    */
-  Future<LibraryContext> _createLibraryContext(FileState library) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    _testView.numOfCreatedLibraryContexts++;
-    return new LibraryContext.forSingleLibrary(
-        library,
-        _logger,
-        _sdkBundle,
-        _byteStore,
-        _analysisOptions,
-        declaredVariables,
-        _sourceFactory,
-        _externalSummaries,
-        fsState);
+  LibraryContext _createLibraryContext(FileState library) {
+    if (_libraryContext != null) {
+      if (_libraryContext.pack()) {
+        _libraryContext = null;
+      }
+    }
+
+    if (_libraryContext == null) {
+      _libraryContext = new LibraryContext(
+        session: currentSession,
+        logger: _logger,
+        fsState: fsState,
+        byteStore: _byteStore,
+        analysisOptions: _analysisOptions,
+        declaredVariables: declaredVariables,
+        sourceFactory: _sourceFactory,
+        externalSummaries: _externalSummaries,
+        targetLibrary: library,
+      );
+    } else {
+      _libraryContext.load(library);
+    }
+    return _libraryContext;
   }
 
   /**
@@ -1403,10 +1639,12 @@
    */
   void _fillSalt() {
     _unlinkedSalt[0] = DATA_VERSION;
-    _unlinkedSalt.setAll(1, _analysisOptions.unlinkedSignature);
+    _unlinkedSalt[1] = enableIndex ? 1 : 0;
+    _unlinkedSalt.setAll(2, _analysisOptions.unlinkedSignature);
 
     _linkedSalt[0] = DATA_VERSION;
-    _linkedSalt.setAll(1, _analysisOptions.signature);
+    _linkedSalt[1] = enableIndex ? 1 : 0;
+    _linkedSalt.setAll(2, _analysisOptions.signature);
   }
 
   /**
@@ -1420,7 +1658,7 @@
     List<AnalysisError> errors = _getErrorsFromSerialized(file, unit.errors);
     _updateHasErrorOrWarningFlag(file, errors);
     return new AnalysisResult(
-        this,
+        currentSession,
         _sourceFactory,
         file.path,
         file.uri,
@@ -1510,7 +1748,7 @@
       FileState file, String missingUri) {
     // TODO(scheglov) Find a better way to report this.
     return new AnalysisResult(
-        this,
+        currentSession,
         _sourceFactory,
         file.path,
         file.uri,
@@ -1540,26 +1778,13 @@
   }
 
   /**
-   * Runs any asynchronous work that was injected as part of a test using
-   * [AnalysisDriverTestView.workToWaitAfterComputingResult].
-   *
-   * If the test view indicates that there is work to do, performs the work
-   * and returns a [Future] that will be signaled when the work completes.
-   *
-   * This gives tests a reliable way to simulate file changes during analysis.
-   */
-  Future _runTestAsyncWorkDuringAnalysis(String path) {
-    var work = _testView.workToWaitAfterComputingResult;
-    _testView.workToWaitAfterComputingResult = null;
-    return work != null ? work(path) : new Future.value();
-  }
-
-  /**
    * Serialize the given [resolvedUnit] errors and index into bytes.
    */
   List<int> _serializeResolvedUnit(
       CompilationUnit resolvedUnit, List<AnalysisError> errors) {
-    AnalysisDriverUnitIndexBuilder index = indexUnit(resolvedUnit);
+    AnalysisDriverUnitIndexBuilder index = enableIndex
+        ? indexUnit(resolvedUnit)
+        : new AnalysisDriverUnitIndexBuilder();
     return new AnalysisDriverResolvedUnitBuilder(
             errors: errors
                 .map((error) => new AnalysisDriverUnitErrorBuilder(
@@ -1706,7 +1931,7 @@
   /**
    * Perform a single chunk of work and produce [results].
    */
-  Future<Null> performWork();
+  Future<void> performWork();
 }
 
 /**
@@ -1838,13 +2063,13 @@
    * If the status is currently idle, the returned future will be signaled
    * immediately.
    */
-  Future<Null> waitForIdle() => _statusSupport.waitForIdle();
+  Future<void> waitForIdle() => _statusSupport.waitForIdle();
 
   /**
    * Run infinitely analysis cycle, selecting the drivers with the highest
    * priority first.
    */
-  Future<Null> _run() async {
+  Future<void> _run() async {
     // Give other microtasks the time to run before doing the analysis cycle.
     await null;
     Stopwatch timer = new Stopwatch()..start();
@@ -1911,34 +2136,20 @@
 class AnalysisDriverTestView {
   final AnalysisDriver driver;
 
-  int numOfCreatedLibraryContexts = 0;
-
   int numOfAnalyzedLibraries = 0;
 
-  /**
-   * If non-null, a function that should be executed asynchronously after
-   * the next result is computed.
-   *
-   * This can be used by a test to simulate file changes during analysis.
-   */
-  WorkToWaitAfterComputingResult workToWaitAfterComputingResult;
-
   AnalysisDriverTestView(this.driver);
 
   FileTracker get fileTracker => driver._fileTracker;
 
-  Map<String, AnalysisResult> get priorityResults => driver._priorityResults;
+  Map<String, ResolvedUnitResult> get priorityResults {
+    return driver._priorityResults;
+  }
 
-  Future<SummaryDataStore> getSummaryStore(String libraryPath) async {
+  SummaryDataStore getSummaryStore(String libraryPath) {
     FileState library = driver.fsState.getFileForPath(libraryPath);
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    LibraryContext libraryContext = await driver._createLibraryContext(library);
-    try {
-      return libraryContext.store;
-    } finally {
-      libraryContext.dispose();
-    }
+    LibraryContext libraryContext = driver._createLibraryContext(library);
+    return libraryContext.store;
   }
 }
 
@@ -1953,83 +2164,50 @@
  * Every result is independent, and is not guaranteed to be consistent with
  * any previously returned result, even inside of the same library.
  */
-class AnalysisResult extends FileResult implements results.ResolveResult {
+class AnalysisResult extends ResolvedUnitResultImpl {
   static final _UNCHANGED = new AnalysisResult(
       null, null, null, null, null, null, null, null, null, null, null, null);
-
-  /**
-   * The [AnalysisDriver] that produced this result.
-   */
-  final AnalysisDriver driver;
-
   /**
    * The [SourceFactory] with which the file was analyzed.
    */
   final SourceFactory sourceFactory;
 
   /**
-   * Return `true` if the file exists.
-   */
-  final bool exists;
-
-  @override
-  final String content;
-
-  /**
    * The signature of the result based on the content of the file, and the
    * transitive closure of files imported and exported by the library of
    * the requested file.
    */
   final String _signature;
 
-  @override
-  final CompilationUnit unit;
-
-  @override
-  final List<AnalysisError> errors;
-
   /**
    * The index of the unit.
    */
   final AnalysisDriverUnitIndex _index;
 
   AnalysisResult(
-      this.driver,
+      AnalysisSession session,
       this.sourceFactory,
       String path,
       Uri uri,
-      this.exists,
-      this.content,
+      bool exists,
+      String content,
       LineInfo lineInfo,
       bool isPart,
       this._signature,
-      this.unit,
-      this.errors,
+      CompilationUnit unit,
+      List<AnalysisError> errors,
       this._index)
-      : super(driver?.currentSession, path, uri, lineInfo, isPart);
+      : super(session, path, uri, exists, content, lineInfo, isPart, unit,
+            errors);
 
   @override
   LibraryElement get libraryElement => unit.declaredElement.library;
 
   @override
-  results.ResultState get state =>
-      exists ? results.ResultState.VALID : results.ResultState.NOT_A_FILE;
-
-  @override
   TypeProvider get typeProvider => unit.declaredElement.context.typeProvider;
-}
-
-abstract class BaseAnalysisResult implements results.AnalysisResult {
-  @override
-  final AnalysisSession session;
 
   @override
-  final String path;
-
-  @override
-  final Uri uri;
-
-  BaseAnalysisResult(this.session, this.path, this.uri);
+  TypeSystem get typeSystem => unit.declaredElement.context.typeSystem;
 }
 
 class DriverPerformance {
@@ -2058,25 +2236,6 @@
 }
 
 /**
- * The errors in a single file.
- *
- * These results are self-consistent, i.e. [errors] and [lineInfo] correspond
- * to each other. But none of the results is guaranteed to be consistent with
- * the state of the files.
- */
-class ErrorsResult extends FileResult implements results.ErrorsResult {
-  @override
-  final List<AnalysisError> errors;
-
-  ErrorsResult(AnalysisSession session, String path, Uri uri, LineInfo lineInfo,
-      bool isPart, this.errors)
-      : super(session, path, uri, lineInfo, isPart);
-
-  @override
-  results.ResultState get state => results.ResultState.VALID;
-}
-
-/**
  * Exception that happened during analysis.
  */
 class ExceptionResult {
@@ -2104,83 +2263,6 @@
 }
 
 /**
- * The result of computing some cheap information for a single file, when full
- * parsed file is not required, so [ParseResult] is not necessary.
- */
-class FileResult extends BaseAnalysisResult implements results.FileResult {
-  @override
-  final LineInfo lineInfo;
-
-  @override
-  final bool isPart;
-
-  FileResult(
-      AnalysisSession session, String path, Uri uri, this.lineInfo, this.isPart)
-      : super(session, path, uri);
-
-  @override
-  results.ResultState get state => results.ResultState.VALID;
-}
-
-/**
- * The result of parsing of a single file.
- *
- * These results are self-consistent, i.e. [content], [lineInfo], the
- * parsed [unit] correspond to each other. But none of the results is
- * guaranteed to be consistent with the state of the files.
- */
-class ParseResult extends FileResult implements results.ParseResult {
-  @override
-  final String content;
-
-  @override
-  final CompilationUnit unit;
-
-  @override
-  final List<AnalysisError> errors;
-
-  ParseResult(AnalysisSession session, String path, Uri uri, this.content,
-      LineInfo lineInfo, bool isPart, this.unit, this.errors)
-      : super(session, path, uri, lineInfo, isPart);
-
-  @override
-  results.ResultState get state => results.ResultState.VALID;
-}
-
-/**
- * The result with the [CompilationUnitElement] of a single file.
- *
- * These results are self-consistent, i.e. all elements and types accessible
- * through [element], including defined in other files, correspond to each
- * other. But none of the results is guaranteed to be consistent with the state
- * of the files.
- *
- * Every result is independent, and is not guaranteed to be consistent with
- * any previously returned result, even inside of the same library.
- */
-class UnitElementResult extends BaseAnalysisResult
-    implements results.UnitElementResult {
-  /**
-   * The signature of the [element] is based the APIs of the files of the
-   * library (including the file itself) of the requested file and the
-   * transitive closure of files imported and exported by the library.
-   */
-  final String signature;
-
-  /**
-   * The element of the file.
-   */
-  final CompilationUnitElement element;
-
-  UnitElementResult(AnalysisSession session, String path, Uri uri,
-      this.signature, this.element)
-      : super(session, path, uri);
-
-  @override
-  results.ResultState get state => results.ResultState.VALID;
-}
-
-/**
  * Task that discovers all files that are available to the driver, and makes
  * them known.
  */
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart b/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
index f96d909..6d35e0e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
@@ -6,7 +6,7 @@
 import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart' hide AnalysisResult;
+import 'package:analyzer/src/dart/analysis/driver.dart' show AnalysisDriver;
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptions;
 
 /**
@@ -31,7 +31,9 @@
    * to access the file system and that is based on the given analysis [driver].
    */
   DriverBasedAnalysisContext(
-      this.resourceProvider, this.contextRoot, this.driver);
+      this.resourceProvider, this.contextRoot, this.driver) {
+    driver.analysisContext = this;
+  }
 
   @override
   AnalysisOptions get analysisOptions => driver.analysisOptions;
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
new file mode 100644
index 0000000..4a016fa
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.dart
@@ -0,0 +1,207 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Note: the plan is to generate this file from a YAML representation somewhere
+// in the SDK repo.  Please do not add any code to this file that can't be
+// easily code generated based on a knowledge of the current set of experimental
+// flags and their status.
+// TODO(paulberry,kmillikin): once code generation is implemented, replace this
+// notice with a notice that this file is generated and a pointer to the source
+// YAML file and the regeneration tool.
+
+// Note: to demonstrate how code is supposed to be generated for expired flags,
+// this file contains bogus expired flags called "bogus-enabled" and
+// "bogus-disabled".  They are not used and can be removed at the time that code
+// generation is implemented.
+
+import 'package:analyzer/src/dart/analysis/experiments_impl.dart';
+import 'package:meta/meta.dart';
+
+export 'package:analyzer/src/dart/analysis/experiments_impl.dart'
+    show
+        ConflictingFlags,
+        ExperimentalFeature,
+        IllegalUseOfExpiredFlag,
+        UnnecessaryUseOfExpiredFlag,
+        UnrecognizedFlag,
+        validateFlags,
+        ValidationResult;
+
+/// Gets access to the private list of boolean flags in an [Experiments] object.
+/// For testing use only.
+@visibleForTesting
+List<bool> getExperimentalFlags_forTesting(ExperimentStatus status) =>
+    status._enableFlags;
+
+/// Constant strings for enabling each of the currently known experimental
+/// flags.
+class EnableString {
+  /// String to enable the experiment "constant-update"
+  static const String constant_update_2018 = 'constant-update-2018';
+
+  /// String to enable the experiment "control-flow-collections"
+  static const String control_flow_collections = 'control-flow-collections';
+
+  /// String to enable the experiment "non-nullable"
+  static const String non_nullable = 'non-nullable';
+
+  /// String to enable the experiment "set-literals"
+  static const String set_literals = 'set-literals';
+
+  /// String to enable the experiment "spread-collections"
+  static const String spread_collections = 'spread-collections';
+
+  /// String to enable the experiment "bogus-disabled"
+  static const String bogus_disabled = 'bogus-disabled';
+
+  /// String to enable the experiment "bogus-enabled"
+  static const String bogus_enabled = 'bogus-enabled';
+}
+
+/// A representation of the set of experiments that are active and whether they
+/// are enabled.
+class ExperimentStatus {
+  /// A map containing information about all known experimental flags.
+  static const knownFeatures = <String, ExperimentalFeature>{
+    EnableString.constant_update_2018: const ExperimentalFeature(
+        0,
+        EnableString.constant_update_2018,
+        IsEnabledByDefault.constant_update_2018,
+        IsExpired.constant_update_2018,
+        'Q4 2018 Constant Update'),
+    EnableString.set_literals: const ExperimentalFeature(
+        1,
+        EnableString.set_literals,
+        IsEnabledByDefault.set_literals,
+        IsExpired.set_literals,
+        'Set Literals'),
+    EnableString.non_nullable: const ExperimentalFeature(
+        2,
+        EnableString.non_nullable,
+        IsEnabledByDefault.non_nullable,
+        IsExpired.non_nullable,
+        'Non Nullable'),
+    EnableString.control_flow_collections: const ExperimentalFeature(
+        3,
+        EnableString.control_flow_collections,
+        IsEnabledByDefault.control_flow_collections,
+        IsExpired.control_flow_collections,
+        'Control Flow Collections'),
+    EnableString.spread_collections: const ExperimentalFeature(
+        4,
+        EnableString.spread_collections,
+        IsEnabledByDefault.spread_collections,
+        IsExpired.spread_collections,
+        'Spread Collections'),
+    EnableString.bogus_disabled: const ExperimentalFeature(
+        null,
+        EnableString.bogus_disabled,
+        IsEnabledByDefault.bogus_disabled,
+        IsExpired.bogus_disabled,
+        null),
+    EnableString.bogus_enabled: const ExperimentalFeature(
+        null,
+        EnableString.bogus_enabled,
+        IsEnabledByDefault.bogus_enabled,
+        IsExpired.bogus_enabled,
+        null),
+  };
+
+  final List<bool> _enableFlags;
+
+  /// Initializes a newly created set of experiments based on optional
+  /// arguments.
+  ExperimentStatus(
+      {bool constant_update_2018, bool set_literals, bool non_nullable})
+      : _enableFlags = <bool>[
+          constant_update_2018 ?? IsEnabledByDefault.constant_update_2018,
+          set_literals ?? IsEnabledByDefault.set_literals,
+          non_nullable ?? IsEnabledByDefault.non_nullable,
+        ];
+
+  /// Decodes the strings given in [flags] into a representation of the set of
+  /// experiments that should be enabled.
+  ///
+  /// Always succeeds, even if the input flags are invalid.  Expired and
+  /// unrecognized flags are ignored, conflicting flags are resolved in favor of
+  /// the flag appearing last.
+  ExperimentStatus.fromStrings(List<String> flags) : this._(decodeFlags(flags));
+
+  ExperimentStatus._(this._enableFlags);
+
+  /// Hardcoded state for the expired flag "bogus_disabled"
+  bool get bogus_disabled => false;
+
+  /// Hardcoded state for the expired flag "bogus_enabled"
+  bool get bogus_enabled => true;
+
+  /// Current state for the flag "constant-update-2018"
+  bool get constant_update_2018 => _enableFlags[0];
+
+  /// Current state for the flag "non-nullable"
+  bool get non_nullable => _enableFlags[2];
+
+  /// Current state for the flag "set-literals"
+  bool get set_literals => _enableFlags[1];
+
+  /// Queries whether the given [feature] is enabled or disabled.
+  bool isEnabled(ExperimentalFeature feature) => feature.isExpired
+      ? feature.isEnabledByDefault
+      : _enableFlags[feature.index];
+
+  /// Returns a list of strings suitable for passing to
+  /// [ExperimentStatus.fromStrings].
+  List<String> toStringList() => experimentStatusToStringList(this);
+}
+
+/// Constant bools indicating whether each experimental flag is currently
+/// enabled by default.
+class IsEnabledByDefault {
+  /// Default state of the experiment "constant-update"
+  static const bool constant_update_2018 = false;
+
+  /// Default state of the experiment "control-flow-collections"
+  static const bool control_flow_collections = false;
+
+  /// Default state of the experiment "non-nullable"
+  static const bool non_nullable = false;
+
+  /// Default state of the experiment "set-literals"
+  static const bool set_literals = false;
+
+  /// Default state of the experiment "spread-collections"
+  static const bool spread_collections = false;
+
+  /// Default state of the experiment "bogus-disabled"
+  static const bool bogus_disabled = false;
+
+  /// Default state of the experiment "bogus-enabled"
+  static const bool bogus_enabled = true;
+}
+
+/// Constant bools indicating whether each experimental flag is currently
+/// expired (meaning its enable/disable status can no longer be altered from the
+/// value in [IsEnabledByDefault]).
+class IsExpired {
+  /// Expiration status of the experiment "constant-update"
+  static const bool constant_update_2018 = false;
+
+  /// Expiration status of the experiment "control-flow-collections"
+  static const bool control_flow_collections = false;
+
+  /// Expiration status of the experiment "non-nullable"
+  static const bool non_nullable = false;
+
+  /// Expiration status of the experiment "set-literals"
+  static const bool set_literals = false;
+
+  /// Expiration status of the experiment "spread-collections"
+  static const bool spread_collections = false;
+
+  /// Expiration status of the experiment "bogus-disabled"
+  static const bool bogus_disabled = true;
+
+  /// Expiration status of the experiment "bogus-enabled"
+  static const bool bogus_enabled = true;
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart b/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
new file mode 100644
index 0000000..64d4b7e
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments_impl.dart
@@ -0,0 +1,327 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:meta/meta.dart';
+
+/// The same as [ExperimentStatus.knownFeatures], except when a call to
+/// [overrideKnownFeatures] is in progress.
+Map<String, ExperimentalFeature> _knownFeatures =
+    ExperimentStatus.knownFeatures;
+
+/// Decodes the strings given in [flags] into a list of booleans representing
+/// experiments that should be enabled.
+///
+/// Always succeeds, even if the input flags are invalid.  Expired and
+/// unrecognized flags are ignored, conflicting flags are resolved in favor of
+/// the flag appearing last.
+List<bool> decodeFlags(List<String> flags) {
+  var decodedFlags = <bool>[];
+  for (var feature in _knownFeatures.values) {
+    if (feature.isExpired) continue;
+    var index = feature.index;
+    while (decodedFlags.length <= index) {
+      decodedFlags.add(false);
+    }
+    decodedFlags[index] = feature.isEnabledByDefault;
+  }
+  for (var entry in _flagStringsToMap(flags).entries) {
+    decodedFlags[entry.key] = entry.value;
+  }
+  return decodedFlags;
+}
+
+/// Converts the flags in [status] to a list of strings suitable for
+/// passing to [_decodeFlags].
+List<String> experimentStatusToStringList(ExperimentStatus status) {
+  var result = <String>[];
+  for (var feature in _knownFeatures.values) {
+    if (feature.isExpired) continue;
+    var isEnabled = status.isEnabled(feature);
+    if (isEnabled != feature.isEnabledByDefault) {
+      result.add(feature.stringForValue(isEnabled));
+    }
+  }
+  return result;
+}
+
+/// Execute the callback, pretending that the given [knownFeatures] take the
+/// place of [ExperimentStatus.knownFeatures].
+///
+/// It isn't safe to call this method with an asynchronous callback, because it
+/// only changes the set of known features during the time that [callback] is
+/// (synchronously) executing.
+@visibleForTesting
+T overrideKnownFeatures<T>(
+    Map<String, ExperimentalFeature> knownFeatures, T callback()) {
+  var oldKnownFeatures = _knownFeatures;
+  try {
+    _knownFeatures = knownFeatures;
+    return callback();
+  } finally {
+    _knownFeatures = oldKnownFeatures;
+  }
+}
+
+/// Validates whether there are any disagreements between the strings given in
+/// [flags1] and the strings given in [flags2].
+///
+/// The returned iterable yields any problems that were found.  Only reports
+/// problems related to combining the flags; problems that would be found by
+/// applying [validateFlags] to [flags1] or [flags2] individually are not
+/// reported.
+///
+/// If no problems are found, it is safe to concatenate the flag lists.  If
+/// problems are found, the only negative side effect is that some flags in
+/// one list may be overridden by some flags in the other list.
+///
+/// TODO(paulberry): if this method ever needs to be exposed via the analyzer
+/// public API, consider making a version that reports validation results using
+/// the AnalysisError type.
+Iterable<ConflictingFlagLists> validateFlagCombination(
+    List<String> flags1, List<String> flags2) sync* {
+  var flag1Map = _flagStringsToMap(flags1);
+  var flag2Map = _flagStringsToMap(flags2);
+  for (var entry in flag2Map.entries) {
+    if (flag1Map[entry.key] != null && flag1Map[entry.key] != entry.value) {
+      yield new ConflictingFlagLists(
+          _featureIndexToFeature(entry.key), !entry.value);
+    }
+  }
+}
+
+/// Validates whether the strings given in [flags] constitute a valid set of
+/// experimental feature enable/disable flags.
+///
+/// The returned iterable yields any problems that were found.
+///
+/// TODO(paulberry): if this method ever needs to be exposed via the analyzer
+/// public API, consider making a version that reports validation results using
+/// the AnalysisError type.
+Iterable<ValidationResult> validateFlags(List<String> flags) sync* {
+  var previousFlagIndex = <int, int>{};
+  var previousFlagValue = <int, bool>{};
+  for (int flagIndex = 0; flagIndex < flags.length; flagIndex++) {
+    var flag = flags[flagIndex];
+    ExperimentalFeature feature;
+    bool requestedValue;
+    if (flag.startsWith('no-')) {
+      feature = _knownFeatures[flag.substring(3)];
+      requestedValue = false;
+    } else {
+      feature = _knownFeatures[flag];
+      requestedValue = true;
+    }
+    if (feature == null) {
+      yield UnrecognizedFlag(flagIndex, flag);
+    } else if (feature.isExpired) {
+      yield requestedValue == feature.isEnabledByDefault
+          ? UnnecessaryUseOfExpiredFlag(flagIndex, feature)
+          : IllegalUseOfExpiredFlag(flagIndex, feature);
+    } else if (previousFlagIndex.containsKey(feature.index) &&
+        previousFlagValue[feature.index] != requestedValue) {
+      yield ConflictingFlags(
+          flagIndex, previousFlagIndex[feature.index], feature, requestedValue);
+    } else {
+      previousFlagIndex[feature.index] = flagIndex;
+      previousFlagValue[feature.index] = requestedValue;
+    }
+  }
+}
+
+ExperimentalFeature _featureIndexToFeature(int index) {
+  for (var feature in _knownFeatures.values) {
+    if (feature.index == index) return feature;
+  }
+  throw new ArgumentError('Unrecognized feature index');
+}
+
+Map<int, bool> _flagStringsToMap(List<String> flags) {
+  var result = <int, bool>{};
+  for (int flagIndex = 0; flagIndex < flags.length; flagIndex++) {
+    var flag = flags[flagIndex];
+    ExperimentalFeature feature;
+    bool requestedValue;
+    if (flag.startsWith('no-')) {
+      feature = _knownFeatures[flag.substring(3)];
+      requestedValue = false;
+    } else {
+      feature = _knownFeatures[flag];
+      requestedValue = true;
+    }
+    if (feature != null && !feature.isExpired) {
+      result[feature.index] = requestedValue;
+    }
+  }
+  return result;
+}
+
+/// Indication of a conflict between two lists of flags.
+class ConflictingFlagLists {
+  /// Info about which feature the user requested conflicting values for
+  final ExperimentalFeature feature;
+
+  /// True if the first list of flags requested to enable the experimental
+  /// feature.
+  final bool firstValue;
+
+  ConflictingFlagLists(this.feature, this.firstValue);
+}
+
+/// Validation result indicating that the user requested conflicting values for
+/// an experimental flag (e.g. both "foo" and "no-foo").
+class ConflictingFlags extends ValidationResult {
+  /// Info about which feature the user requested conflicting values for
+  final ExperimentalFeature feature;
+
+  /// The index of the first of the two conflicting strings.
+  ///
+  /// [stringIndex] is the index of the second of the two conflicting strings.
+  final int previousStringIndex;
+
+  /// True if the string at [stringIndex] requested to enable the experimental
+  /// feature.
+  ///
+  /// The string at [previousStringIndex] requested the opposite.
+  final bool requestedValue;
+
+  ConflictingFlags(int stringIndex, this.previousStringIndex, this.feature,
+      this.requestedValue)
+      : super._(stringIndex);
+
+  @override
+  String get flag => feature.stringForValue(requestedValue);
+
+  @override
+  bool get isError => true;
+
+  @override
+  String get message {
+    var previousFlag = feature.stringForValue(!requestedValue);
+    return 'Flag "$flag" conflicts with previous flag "$previousFlag"';
+  }
+}
+
+/// Information about a single experimental flag that the user might use to
+/// request that a feature be enabled (or disabled).
+class ExperimentalFeature {
+  /// Index of the flag in the private data structure maintained by
+  /// [ExperimentStatus].
+  ///
+  /// For expired features, the index should be null, since no enable/disable
+  /// state needs to be stored.
+  ///
+  /// This index should not be relied upon to be stable over time.  For instance
+  /// it should not be used to serialize the state of experiments to long term
+  /// storage if there is any expectation of compatibility between analyzer
+  /// versions.
+  final int index;
+
+  /// The string to enable the feature.
+  final String enableString;
+
+  /// Whether the feature is currently enabled by default.
+  final bool isEnabledByDefault;
+
+  /// Whether the flag is currently expired (meaning the enable/disable status
+  /// can no longer be altered from the value in [isEnabledByDefault]).
+  final bool isExpired;
+
+  /// Documentation for the feature, if known.  `null` for expired flags.
+  final String documentation;
+
+  const ExperimentalFeature(this.index, this.enableString,
+      this.isEnabledByDefault, this.isExpired, this.documentation)
+      : assert(isExpired ? index == null : index != null);
+
+  /// The string to disable the feature.
+  String get disableString => 'no-$enableString';
+
+  /// Retrieves the string to enable or disable the feature, depending on
+  /// [value].
+  String stringForValue(bool value) => value ? enableString : disableString;
+
+  @override
+  String toString() => enableString;
+}
+
+/// Validation result indicating that the user requested enabling or disabling
+/// of a feature associated with an expired flag, and the requested behavior
+/// conflicts with the behavior that is now hardcoded into the toolchain.
+class IllegalUseOfExpiredFlag extends ValidationResult {
+  /// Information about the feature associated with the error.
+  final ExperimentalFeature feature;
+
+  IllegalUseOfExpiredFlag(int flagIndex, this.feature) : super._(flagIndex);
+
+  @override
+  String get flag => feature.stringForValue(!feature.isEnabledByDefault);
+
+  @override
+  bool get isError => true;
+
+  @override
+  String get message {
+    var state = feature.isEnabledByDefault ? 'enabled' : 'disabled';
+    return 'Flag "$flag" was supplied, but the feature is already '
+        'unconditionally $state.';
+  }
+}
+
+/// Validation result indicating that the user requested enabling or disabling
+/// of a feature associated with an expired flag, and the requested behavior
+/// is consistent with the behavior that is now hardcoded into the toolchain.
+/// (This is merely a warning, not an error).
+class UnnecessaryUseOfExpiredFlag extends ValidationResult {
+  /// Information about the feature associated with the warning.
+  final ExperimentalFeature feature;
+
+  UnnecessaryUseOfExpiredFlag(int flagIndex, this.feature) : super._(flagIndex);
+
+  @override
+  String get flag => feature.stringForValue(feature.isEnabledByDefault);
+
+  @override
+  bool get isError => false;
+
+  @override
+  String get message => 'Flag "$flag" is no longer required.';
+}
+
+/// Validation result indicating that the user requested enabling or disabling
+/// an unrecognized feature.
+class UnrecognizedFlag extends ValidationResult {
+  @override
+  final String flag;
+
+  UnrecognizedFlag(int flagIndex, this.flag) : super._(flagIndex);
+
+  @override
+  bool get isError => true;
+
+  @override
+  String get message => 'Flag "$flag" not recognized.';
+}
+
+/// Representation of a single error or warning reported by
+/// [ExperimentStatus.fromStrings].
+abstract class ValidationResult {
+  /// Indicates which of the supplied strings is associated with the error or
+  /// warning.
+  final int stringIndex;
+
+  ValidationResult._(this.stringIndex);
+
+  /// The supplied string associated with the error or warning.
+  String get flag;
+
+  /// Indicates whether the validation result is an error or a warning.
+  bool get isError;
+
+  /// Message describing the problem.
+  String get message;
+
+  @override
+  String toString() => message;
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
index 7c1a7fe..eecc2ca 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -62,7 +62,7 @@
   /**
    * If the cache clean up process has not been requested yet, request it.
    */
-  Future<Null> _requestCacheCleanUp() async {
+  Future<void> _requestCacheCleanUp() async {
     if (_cleanUpSendPortShouldBePrepared) {
       _cleanUpSendPortShouldBePrepared = false;
       ReceivePort response = new ReceivePort();
@@ -110,7 +110,8 @@
     List<File> files = <File>[];
     Map<File, FileStat> fileStatMap = {};
     int currentSizeBytes = 0;
-    List<FileSystemEntity> resources = new Directory(cachePath).listSync();
+    List<FileSystemEntity> resources =
+        new Directory(cachePath).listSync(recursive: true);
     for (FileSystemEntity resource in resources) {
       if (resource is File) {
         try {
@@ -148,6 +149,7 @@
  */
 class FileByteStore implements ByteStore {
   static final FileByteStoreValidator _validator = new FileByteStoreValidator();
+  static final _dotCodeUnit = '.'.codeUnitAt(0);
 
   final String _cachePath;
   final String _tempSuffix;
@@ -164,17 +166,18 @@
 
   @override
   List<int> get(String key) {
+    if (!_canShard(key)) return null;
+
     List<int> bytes = _writeInProgress[key];
     if (bytes != null) {
       return bytes;
     }
 
     try {
-      final File file = _getFileForKey(key);
-      if (!file.existsSync()) {
-        return null;
-      }
-      return _validator.getData(file.readAsBytesSync());
+      var shardPath = _getShardPath(key);
+      var path = join(shardPath, key);
+      var bytes = new File(path).readAsBytesSync();
+      return _validator.getData(bytes);
     } catch (_) {
       // ignore exceptions
       return null;
@@ -183,15 +186,22 @@
 
   @override
   void put(String key, List<int> bytes) {
+    if (!_canShard(key)) return;
+
     _writeInProgress[key] = bytes;
 
     final List<int> wrappedBytes = _validator.wrapData(bytes);
 
     // We don't wait for the write and rename to complete.
     _pool.execute(() {
-      final File tempFile = _getFileForKey('$key$_tempSuffix');
+      var tempPath = join(_cachePath, '$key$_tempSuffix');
+      var tempFile = new File(tempPath);
       return tempFile.writeAsBytes(wrappedBytes).then((_) {
-        return tempFile.rename(join(_cachePath, key));
+        var shardPath = _getShardPath(key);
+        return Directory(shardPath).create(recursive: true).then((_) {
+          var path = join(shardPath, key);
+          return tempFile.rename(path);
+        });
       }).catchError((_) {
         // ignore exceptions
       }).whenComplete(() {
@@ -202,7 +212,16 @@
     });
   }
 
-  File _getFileForKey(String key) => new File(join(_cachePath, key));
+  String _getShardPath(String key) {
+    var shardName = key.substring(0, 2);
+    return join(_cachePath, shardName);
+  }
+
+  static bool _canShard(String key) {
+    return key.length > 2 &&
+        key.codeUnitAt(0) != _dotCodeUnit &&
+        key.codeUnitAt(1) != _dotCodeUnit;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index c1aad81..e9526b0 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -12,6 +12,8 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/defined_names.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/analysis/library_graph.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/referenced_names.dart';
 import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
@@ -125,8 +127,11 @@
   List<NameFilter> _exportFilters;
 
   Set<FileState> _directReferencedFiles;
-  Set<FileState> _transitiveFiles;
+  Set<FileState> _directReferencedLibraries;
+
+  LibraryCycle _libraryCycle;
   String _transitiveSignature;
+  String _transitiveSignatureLinked;
 
   Map<String, TopLevelDeclaration> _topLevelDeclarations;
   Map<String, TopLevelDeclaration> _exportedTopLevelDeclarations;
@@ -147,6 +152,7 @@
         source = null,
         _exists = true {
     _apiSignature = new Uint8List(16);
+    _libraryCycle = new LibraryCycle.external();
   }
 
   /**
@@ -187,6 +193,11 @@
   Set<FileState> get directReferencedFiles => _directReferencedFiles;
 
   /**
+   * Return the set of all directly referenced libraries - imported or exported.
+   */
+  Set<FileState> get directReferencedLibraries => _directReferencedLibraries;
+
+  /**
    * Return `true` if the file exists.
    */
   bool get exists => _exists;
@@ -213,11 +224,34 @@
    */
   List<FileState> get importedFiles => _importedFiles;
 
+  LibraryCycle get internal_libraryCycle => _libraryCycle;
+
+  /**
+   * Return `true` if the file is a stub created for a library in the provided
+   * external summary store.
+   */
+  bool get isExternalLibrary {
+    return _fsState.externalSummaries != null &&
+        _fsState.externalSummaries.linkedMap.containsKey(uriStr);
+  }
+
   /**
    * Return `true` if the file does not have a `library` directive, and has a
    * `part of` directive, so is probably a part.
    */
-  bool get isPart => _unlinked.libraryNameOffset == 0 && _unlinked.isPartOf;
+  bool get isPart {
+    if (_fsState.externalSummaries != null &&
+        _fsState.externalSummaries.unlinkedMap.containsKey(uriStr)) {
+      return !_fsState.externalSummaries.linkedMap.containsKey(uriStr);
+    }
+    return _unlinked.libraryNameOffset == 0 && _unlinked.isPartOf;
+  }
+
+  /**
+   * Return `true` if the file is the "unresolved" file, which does not have
+   * neither a valid URI, nor a path.
+   */
+  bool get isUnresolved => uri == null;
 
   /**
    * If the file [isPart], return a currently know library the file is a part
@@ -233,6 +267,23 @@
     }
   }
 
+  /// Return the [LibraryCycle] this file belongs to, even if it consists of
+  /// just this file.  If the library cycle is not known yet, compute it.
+  LibraryCycle get libraryCycle {
+    if (isPart) {
+      var library = this.library;
+      if (library != null) {
+        return library.libraryCycle;
+      }
+    }
+
+    if (_libraryCycle == null) {
+      computeLibraryCycle(_fsState._linkedSalt, this);
+    }
+
+    return _libraryCycle;
+  }
+
   /**
    * The list of files files that this library consists of, i.e. this library
    * file itself and its [partedFiles].
@@ -314,38 +365,42 @@
    * directly or indirectly referenced files.
    */
   Set<FileState> get transitiveFiles {
-    if (_transitiveFiles == null) {
-      _transitiveFiles = new Set<FileState>();
+    var transitiveFiles = new Set<FileState>();
 
-      void appendReferenced(FileState file) {
-        if (_transitiveFiles.add(file)) {
-          file._directReferencedFiles?.forEach(appendReferenced);
-        }
+    void appendReferenced(FileState file) {
+      if (transitiveFiles.add(file)) {
+        file._directReferencedFiles?.forEach(appendReferenced);
       }
-
-      appendReferenced(this);
     }
-    return _transitiveFiles;
+
+    appendReferenced(this);
+    return transitiveFiles;
   }
 
   /**
-   * Return the signature of the file, based on the [transitiveFiles].
+   * Return the signature of the file, based on API signatures of the
+   * transitive closure of imported / exported files.
    */
   String get transitiveSignature {
-    if (_transitiveSignature == null) {
-      ApiSignature signature = new ApiSignature();
-      signature.addUint32List(_fsState._linkedSalt);
-      signature.addInt(transitiveFiles.length);
-      transitiveFiles
-          .map((file) => file.apiSignature)
-          .forEach(signature.addBytes);
-      signature.addString(uri.toString());
-      _transitiveSignature = signature.toHex();
+    if (isPart) {
+      var library = this.library;
+      if (library != null) {
+        return library.transitiveSignature;
+      }
     }
+
+    this.libraryCycle; // sets _transitiveSignature
     return _transitiveSignature;
   }
 
   /**
+   * The value `transitiveSignature.linked` is used often, so we cache it.
+   */
+  String get transitiveSignatureLinked {
+    return _transitiveSignatureLinked ??= '$transitiveSignature.linked';
+  }
+
+  /**
    * The [UnlinkedUnit] of the file.
    */
   UnlinkedUnit get unlinked => _unlinked;
@@ -360,6 +415,17 @@
     return other is FileState && other.uri == uri;
   }
 
+  void internal_setLibraryCycle(LibraryCycle cycle, String signature) {
+    if (cycle == null) {
+      _libraryCycle = null;
+      _transitiveSignature = null;
+      _transitiveSignatureLinked = null;
+    } else {
+      _libraryCycle = cycle;
+      _transitiveSignature = signature;
+    }
+  }
+
   /**
    * Return a new parsed unresolved [CompilationUnit].
    *
@@ -440,14 +506,20 @@
     _apiSignature = newApiSignature;
 
     // The API signature changed.
-    //   Flush transitive signatures of affected files.
+    //   Flush affected library cycles.
     //   Flush exported top-level declarations of all files.
     if (apiSignatureChanged) {
-      for (FileState file in _fsState._uriToFile.values) {
-        if (file._transitiveFiles != null &&
-            file._transitiveFiles.contains(this)) {
-          file._transitiveSignature = null;
+      _libraryCycle?.invalidate();
+
+      // If this is a part, invalidate the libraries.
+      var libraries = _fsState._partToLibraries[this];
+      if (libraries != null) {
+        for (var library in libraries) {
+          library.libraryCycle?.invalidate();
         }
+      }
+
+      for (FileState file in _fsState._uriToFile.values) {
         file._exportedTopLevelDeclarations = null;
       }
     }
@@ -487,26 +559,13 @@
     _libraryFiles = [this]..addAll(_partedFiles);
 
     // Compute referenced files.
-    Set<FileState> oldDirectReferencedFiles = _directReferencedFiles;
     _directReferencedFiles = new Set<FileState>()
       ..addAll(_importedFiles)
       ..addAll(_exportedFiles)
       ..addAll(_partedFiles);
-
-    // If the set of directly referenced files of this file is changed,
-    // then the transitive sets of files that include this file are also
-    // changed. Reset these transitive sets.
-    if (oldDirectReferencedFiles != null) {
-      if (_directReferencedFiles.length != oldDirectReferencedFiles.length ||
-          !_directReferencedFiles.containsAll(oldDirectReferencedFiles)) {
-        for (FileState file in _fsState._uriToFile.values) {
-          if (file._transitiveFiles != null &&
-              file._transitiveFiles.contains(this)) {
-            file._transitiveFiles = null;
-          }
-        }
-      }
-    }
+    _directReferencedLibraries = Set<FileState>()
+      ..addAll(_importedFiles)
+      ..addAll(_exportedFiles);
 
     // Update mapping from subtyped names to files.
     for (var name in _driverUnlinkedUnit.subtypedNames) {
@@ -637,9 +696,11 @@
       return _createEmptyCompilationUnit();
     }
 
-    AnalysisOptions analysisOptions = _fsState._analysisOptions;
+    AnalysisOptionsImpl analysisOptions = _fsState._analysisOptions;
+    ExperimentStatus experimentStatus = analysisOptions.experimentStatus;
     CharSequenceReader reader = new CharSequenceReader(content);
     Scanner scanner = new Scanner(source, reader, errorListener);
+    scanner.enableGtGtGt = experimentStatus.constant_update_2018;
     Token token = PerformanceStatistics.scan.makeCurrentWhile(() {
       return scanner.tokenize();
     });
@@ -648,6 +709,8 @@
     bool useFasta = analysisOptions.useFastaParser;
     Parser parser = new Parser(source, errorListener, useFasta: useFasta);
     parser.enableOptionalNewAndConst = true;
+    parser.enableSetLiterals = experimentStatus.set_literals;
+    parser.enableNonNullable = experimentStatus.non_nullable;
     CompilationUnit unit = parser.parseCompilationUnit(token);
     unit.lineInfo = lineInfo;
 
@@ -834,9 +897,10 @@
   }
 
   /**
-   * Return the [FileState] for the given absolute [uri]. May return `null` if
-   * the [uri] is invalid, e.g. a `package:` URI without a package name. The
-   * returned file has the last known state since if was last refreshed.
+   * Return the [FileState] for the given absolute [uri]. May return the
+   * "unresolved" file if the [uri] is invalid, e.g. a `package:` URI without
+   * a package name. The returned file has the last known state since if was
+   * last refreshed.
    */
   FileState getFileForUri(Uri uri) {
     FileState file = _uriToFile[uri];
@@ -928,13 +992,18 @@
    */
   void removeFile(String path) {
     markFileForReading(path);
-    _uriToFile.clear();
-    knownFilePaths.clear();
-    knownFiles.clear();
-    _pathToFiles.clear();
-    _pathToCanonicalFile.clear();
-    _partToLibraries.clear();
-    _subtypedNameToFiles.clear();
+    _clearFiles();
+  }
+
+  /**
+   * Reset URI resolution, and forget all files. So, the next time any file is
+   * requested, it will be read, and its whole (potentially different) graph
+   * will be built.
+   */
+  void resetUriResolution() {
+    _sourceFactory.clearCache();
+    _fileContentCache.clear();
+    _clearFiles();
   }
 
   void _addFileWithPath(String path, FileState file) {
@@ -948,6 +1017,17 @@
     }
     files.add(file);
   }
+
+  /// Clear all [FileState] data - all maps from path or URI, etc.
+  void _clearFiles() {
+    _uriToFile.clear();
+    knownFilePaths.clear();
+    knownFiles.clear();
+    _pathToFiles.clear();
+    _pathToCanonicalFile.clear();
+    _partToLibraries.clear();
+    _subtypedNameToFiles.clear();
+  }
 }
 
 @visibleForTesting
@@ -956,15 +1036,9 @@
 
   FileSystemStateTestView(this.state);
 
-  Set<FileState> get filesWithoutTransitiveFiles {
+  Set<FileState> get filesWithoutLibraryCycle {
     return state._uriToFile.values
-        .where((f) => f._transitiveFiles == null)
-        .toSet();
-  }
-
-  Set<FileState> get filesWithoutTransitiveSignature {
-    return state._uriToFile.values
-        .where((f) => f._transitiveSignature == null)
+        .where((f) => f._libraryCycle == null)
         .toSet();
   }
 
@@ -1010,12 +1084,23 @@
    */
   static final _instances = new Expando<Expando<_FileContentCache>>();
 
+  /**
+   * Weak map of cache instances.
+   *
+   * Key is a [ResourceProvider].
+   */
+  static final _instances2 = new Expando<_FileContentCache>();
+
   final ResourceProvider _resourceProvider;
   final FileContentOverlay _contentOverlay;
   final Map<String, _FileContent> _pathToFile = {};
 
   _FileContentCache(this._resourceProvider, this._contentOverlay);
 
+  void clear() {
+    _pathToFile.clear();
+  }
+
   /**
    * Return the content of the file with the given [path].
    *
@@ -1028,7 +1113,9 @@
       String content;
       bool exists;
       try {
-        content = _contentOverlay[path];
+        if (_contentOverlay != null) {
+          content = _contentOverlay[path];
+        }
         content ??= _resourceProvider.getFile(path).readAsStringSync();
         exists = true;
       } catch (_) {
@@ -1056,11 +1143,17 @@
 
   static _FileContentCache getInstance(
       ResourceProvider resourceProvider, FileContentOverlay contentOverlay) {
-    var providerToInstance = _instances[contentOverlay];
-    if (providerToInstance == null) {
-      providerToInstance = new Expando<_FileContentCache>();
-      _instances[contentOverlay] = providerToInstance;
+    Expando<_FileContentCache> providerToInstance;
+    if (contentOverlay != null) {
+      providerToInstance = _instances[contentOverlay];
+      if (providerToInstance == null) {
+        providerToInstance = new Expando<_FileContentCache>();
+        _instances[contentOverlay] = providerToInstance;
+      }
+    } else {
+      providerToInstance = _instances2;
     }
+
     var instance = providerToInstance[resourceProvider];
     if (instance == null) {
       instance = new _FileContentCache(resourceProvider, contentOverlay);
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
index c49cf71..f355cc9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_tracker.dart
@@ -211,6 +211,13 @@
   }
 
   /**
+   * Schedule all added files for analysis.
+   */
+  void scheduleAllAddedFiles() {
+    _pendingFiles.addAll(addedFiles);
+  }
+
+  /**
    * Verify the API signature for the file with the given [path], and decide
    * which linked libraries should be invalidated, and files reanalyzed.
    */
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 4e620344..ac79c40 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -79,6 +79,13 @@
               : IndexSyntheticElementKind.setter;
           element = accessor.variable;
         }
+      } else if (elementKind == ElementKind.METHOD) {
+        Element enclosing = element.enclosingElement;
+        bool isEnumMethod = enclosing is ClassElement && enclosing.isEnum;
+        if (isEnumMethod && element.name == 'toString') {
+          kind = IndexSyntheticElementKind.enumToString;
+          element = enclosing;
+        }
       } else if (elementKind == ElementKind.TOP_LEVEL_VARIABLE) {
         TopLevelVariableElement property = element;
         kind = IndexSyntheticElementKind.topLevelVariable;
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 2a05e11..8624f12 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -2,20 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/constant/compute.dart';
 import 'package:analyzer/src/dart/constant/constant_verifier.dart';
-import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/constant/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
@@ -28,39 +26,48 @@
 import 'package:analyzer/src/generated/error_verifier.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/hint/sdk_constraint_verifier.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/linter_visitor.dart';
 import 'package:analyzer/src/services/lint.dart';
-import 'package:analyzer/src/summary/link.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
+import 'package:pub_semver/pub_semver.dart';
 
 /**
  * Analyzer of a single library.
  */
 class LibraryAnalyzer {
+  /// A marker object used to prevent the initialization of
+  /// [_versionConstraintFromPubspec] when the previous initialization attempt
+  /// failed.
+  static final VersionRange noSpecifiedRange = new VersionRange();
   final AnalysisOptionsImpl _analysisOptions;
   final DeclaredVariables _declaredVariables;
   final SourceFactory _sourceFactory;
   final FileState _library;
-  final InheritanceManager2 _inheritance;
+  final ResourceProvider _resourceProvider;
 
+  final InheritanceManager2 _inheritance;
   final bool Function(Uri) _isLibraryUri;
-  final AnalysisContextImpl _context;
+  final AnalysisContext _context;
   final ElementResynthesizer _resynthesizer;
   final TypeProvider _typeProvider;
 
+  final TypeSystem _typeSystem;
+  bool isNonNullableMigrated = false;
   LibraryElement _libraryElement;
+
   LibraryScope _libraryScope;
-
   final Map<FileState, LineInfo> _fileToLineInfo = {};
-  final Map<FileState, IgnoreInfo> _fileToIgnoreInfo = {};
 
+  final Map<FileState, IgnoreInfo> _fileToIgnoreInfo = {};
   final Map<FileState, RecordingErrorListener> _errorListeners = {};
   final Map<FileState, ErrorReporter> _errorReporters = {};
   final List<UsedImportedElements> _usedImportedElementsList = [];
   final List<UsedLocalElements> _usedLocalElementsList = [];
   final Map<FileState, List<PendingError>> _fileToPendingErrors = {};
+
   final Set<ConstantEvaluationTarget> _constants = new Set();
 
   LibraryAnalyzer(
@@ -70,17 +77,17 @@
       this._isLibraryUri,
       this._context,
       this._resynthesizer,
-      this._library)
-      : _inheritance = new InheritanceManager2(_context.typeSystem),
-        _typeProvider = _context.typeProvider;
+      this._inheritance,
+      this._library,
+      this._resourceProvider)
+      : _typeProvider = _context.typeProvider,
+        _typeSystem = _context.typeSystem;
 
   /**
    * Compute analysis results for all units of the library.
    */
-  Future<Map<FileState, UnitAnalysisResult>> analyze() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    return PerformanceStatistics.analysis.makeCurrentWhileAsync(() async {
+  Map<FileState, UnitAnalysisResult> analyze() {
+    return PerformanceStatistics.analysis.makeCurrentWhile(() {
       return analyzeSync();
     });
   }
@@ -95,63 +102,64 @@
     for (FileState file in _library.libraryFiles) {
       units[file] = _parse(file);
     }
+    isNonNullableMigrated = (units.values.first as CompilationUnitImpl)
+        .hasPragmaAnalyzerNonNullable;
 
     // Resolve URIs in directives to corresponding sources.
     units.forEach((file, unit) {
       _resolveUriBasedDirectives(file, unit);
     });
 
-    try {
-      _libraryElement = _resynthesizer
-          .getElement(new ElementLocationImpl.con3([_library.uriStr]));
-      _libraryScope = new LibraryScope(_libraryElement);
+    _libraryElement = _resynthesizer
+        .getElement(new ElementLocationImpl.con3([_library.uriStr]));
+    _libraryScope = new LibraryScope(_libraryElement);
 
-      _resolveDirectives(units);
+    _resolveDirectives(units);
 
+    units.forEach((file, unit) {
+      _resolveFile(file, unit);
+      _computePendingMissingRequiredParameters(file, unit);
+    });
+
+    units.values.forEach(_findConstants);
+    _computeConstants();
+
+    PerformanceStatistics.errors.makeCurrentWhile(() {
       units.forEach((file, unit) {
-        _resolveFile(file, unit);
-        _computePendingMissingRequiredParameters(file, unit);
+        _computeVerifyErrors(file, unit);
       });
+    });
 
-      units.values.forEach(_findConstants);
-      _computeConstants();
-
-      PerformanceStatistics.errors.makeCurrentWhile(() {
+    if (_analysisOptions.hint) {
+      PerformanceStatistics.hints.makeCurrentWhile(() {
         units.forEach((file, unit) {
-          _computeVerifyErrors(file, unit);
+          {
+            var visitor = new GatherUsedLocalElementsVisitor(_libraryElement);
+            unit.accept(visitor);
+            _usedLocalElementsList.add(visitor.usedElements);
+          }
+          {
+            var visitor =
+                new GatherUsedImportedElementsVisitor(_libraryElement);
+            unit.accept(visitor);
+            _usedImportedElementsList.add(visitor.usedElements);
+          }
+        });
+        units.forEach((file, unit) {
+          _computeHints(file, unit);
         });
       });
+    }
 
-      if (_analysisOptions.hint) {
-        PerformanceStatistics.hints.makeCurrentWhile(() {
-          units.forEach((file, unit) {
-            {
-              var visitor = new GatherUsedLocalElementsVisitor(_libraryElement);
-              unit.accept(visitor);
-              _usedLocalElementsList.add(visitor.usedElements);
-            }
-            {
-              var visitor =
-                  new GatherUsedImportedElementsVisitor(_libraryElement);
-              unit.accept(visitor);
-              _usedImportedElementsList.add(visitor.usedElements);
-            }
-          });
-          units.forEach((file, unit) {
-            _computeHints(file, unit);
-          });
-        });
-      }
-
-      if (_analysisOptions.lint) {
-        PerformanceStatistics.lints.makeCurrentWhile(() {
-          units.forEach((file, unit) {
-            _computeLints(file, unit);
-          });
-        });
-      }
-    } finally {
-      _context.dispose();
+    if (_analysisOptions.lint) {
+      PerformanceStatistics.lints.makeCurrentWhile(() {
+        var allUnits = _library.libraryFiles
+            .map((file) => LinterContextUnit(file.content, units[file]))
+            .toList();
+        for (int i = 0; i < allUnits.length; i++) {
+          _computeLints(_library.libraryFiles[i], allUnits[i], allUnits);
+        }
+      });
     }
 
     // Return full results.
@@ -176,23 +184,8 @@
    * Compute [_constants] in all units.
    */
   void _computeConstants() {
-    ConstantEvaluationEngine evaluationEngine = new ConstantEvaluationEngine(
-        _typeProvider, _declaredVariables,
-        forAnalysisDriver: true, typeSystem: _context.typeSystem);
-
-    List<_ConstantNode> nodes = [];
-    Map<ConstantEvaluationTarget, _ConstantNode> nodeMap = {};
-    for (ConstantEvaluationTarget constant in _constants) {
-      var node = new _ConstantNode(evaluationEngine, nodeMap, constant);
-      nodes.add(node);
-      nodeMap[constant] = node;
-    }
-
-    for (_ConstantNode node in nodes) {
-      if (!node.isEvaluated) {
-        new _ConstantWalker(evaluationEngine).walk(node);
-      }
-    }
+    computeConstants(_typeProvider, _context.typeSystem, _declaredVariables,
+        _constants.toList(), _analysisOptions.experimentStatus);
   }
 
   void _computeHints(FileState file, CompilationUnit unit) {
@@ -220,7 +213,7 @@
 
     unit.accept(new BestPracticesVerifier(
         errorReporter, _typeProvider, _libraryElement,
-        typeSystem: _context.typeSystem));
+        typeSystem: _context.typeSystem, resourceProvider: _resourceProvider));
 
     unit.accept(new OverrideVerifier(
       _inheritance,
@@ -249,9 +242,22 @@
           new UnusedLocalElementsVerifier(errorListener, usedElements);
       unit.accept(visitor);
     }
+
+    //
+    // Find code that uses features from an SDK version that does not satisfy
+    // the SDK constraints specified in analysis options.
+    //
+    var sdkVersionConstraint = _analysisOptions.sdkVersionConstraint;
+    if (sdkVersionConstraint != null) {
+      SdkConstraintVerifier verifier = new SdkConstraintVerifier(
+          errorReporter, _libraryElement, _typeProvider, sdkVersionConstraint);
+      unit.accept(verifier);
+    }
   }
 
-  void _computeLints(FileState file, CompilationUnit unit) {
+  void _computeLints(FileState file, LinterContextUnit currentUnit,
+      List<LinterContextUnit> allUnits) {
+    var unit = currentUnit.unit;
     if (file.source == null) {
       return;
     }
@@ -260,10 +266,12 @@
 
     var nodeRegistry = new NodeLintRegistry(_analysisOptions.enableTiming);
     var visitors = <AstVisitor>[];
+    var context = LinterContextImpl(
+        allUnits, currentUnit, _declaredVariables, _typeProvider, _typeSystem);
     for (Linter linter in _analysisOptions.lintRules) {
       linter.reporter = errorReporter;
       if (linter is NodeLintRule) {
-        (linter as NodeLintRule).registerNodeProcessors(nodeRegistry);
+        (linter as NodeLintRule).registerNodeProcessors(nodeRegistry, context);
       } else {
         AstVisitor visitor = linter.getVisitor();
         if (visitor != null) {
@@ -411,6 +419,15 @@
     return null;
   }
 
+  bool _isExistingSource(Source source) {
+    for (var file in _library.directReferencedFiles) {
+      if (file.uri == source.uri) {
+        return file.exists;
+      }
+    }
+    return false;
+  }
+
   /**
    * Return `true` if the given [source] is a library.
    */
@@ -506,7 +523,7 @@
         // Validate that the part contains a part-of directive with the same
         // name or uri as the library.
         //
-        if (_context.exists(partSource)) {
+        if (_isExistingSource(partSource)) {
           _NameOrSource nameOrSource = _getPartLibraryNameOrUri(
               partSource, partUnit, directivesToResolve);
           if (nameOrSource == null) {
@@ -583,11 +600,13 @@
     // TODO(scheglov) remove EnumMemberBuilder class
 
     new TypeParameterBoundsResolver(
-            _context.typeSystem, _libraryElement, source, errorListener)
+            _context.typeSystem, _libraryElement, source, errorListener,
+            isNonNullableMigrated: isNonNullableMigrated)
         .resolveTypeBounds(unit);
 
     unit.accept(new TypeResolverVisitor(
-        _libraryElement, source, _typeProvider, errorListener));
+        _libraryElement, source, _typeProvider, errorListener,
+        isNonNullableMigrated: isNonNullableMigrated));
 
     unit.accept(new VariableResolverVisitor(
         _libraryElement, source, _typeProvider, errorListener,
@@ -654,7 +673,7 @@
       FileState file, UriBasedDirectiveImpl directive) {
     Source source = directive.uriSource;
     if (source != null) {
-      if (_context.exists(source)) {
+      if (_isExistingSource(source)) {
         return;
       }
     } else {
@@ -724,58 +743,6 @@
 }
 
 /**
- * [Node] that is used to compute constants in dependency order.
- */
-class _ConstantNode extends Node<_ConstantNode> {
-  final ConstantEvaluationEngine evaluationEngine;
-  final Map<ConstantEvaluationTarget, _ConstantNode> nodeMap;
-  final ConstantEvaluationTarget constant;
-
-  bool isEvaluated = false;
-
-  _ConstantNode(this.evaluationEngine, this.nodeMap, this.constant);
-
-  @override
-  List<_ConstantNode> computeDependencies() {
-    List<ConstantEvaluationTarget> targets = [];
-    evaluationEngine.computeDependencies(constant, targets.add);
-    return targets.map(_getNode).toList();
-  }
-
-  _ConstantNode _getNode(ConstantEvaluationTarget constant) {
-    return nodeMap.putIfAbsent(
-        constant, () => new _ConstantNode(evaluationEngine, nodeMap, constant));
-  }
-}
-
-/**
- * [DependencyWalker] for computing constants and detecting cycles.
- */
-class _ConstantWalker extends DependencyWalker<_ConstantNode> {
-  final ConstantEvaluationEngine evaluationEngine;
-
-  _ConstantWalker(this.evaluationEngine);
-
-  @override
-  void evaluate(_ConstantNode node) {
-    evaluationEngine.computeConstantValue(node.constant);
-    node.isEvaluated = true;
-  }
-
-  @override
-  void evaluateScc(List<_ConstantNode> scc) {
-    var constantsInCycle = scc.map((node) => node.constant);
-    for (_ConstantNode node in scc) {
-      if (node.constant is ConstructorElementImpl) {
-        (node.constant as ConstructorElementImpl).isCycleFree = false;
-      }
-      evaluationEngine.generateCycleError(constantsInCycle, node.constant);
-      node.isEvaluated = true;
-    }
-  }
-}
-
-/**
  * Either the name or the source associated with a part-of directive.
  */
 class _NameOrSource {
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 3a36e2b..44f61a4 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/element/element.dart'
     show CompilationUnitElement, LibraryElement;
 import 'package:analyzer/src/context/context.dart';
@@ -10,161 +11,94 @@
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/restricted_analysis_context.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/handle.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisContext, AnalysisEngine, AnalysisOptions;
+    show AnalysisContext, AnalysisOptions;
+import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/link.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/summary/resynthesize.dart';
+import 'package:meta/meta.dart';
 
 /**
  * Context information necessary to analyze one or more libraries within an
  * [AnalysisDriver].
  *
  * Currently this is implemented as a wrapper around [AnalysisContext].
- * TODO(paulberry): make a front end API that this can make use of instead.
  */
 class LibraryContext {
-  final SummaryDataStore store;
+  static const _maxLinkedDataInBytes = 64 * 1024 * 1024;
 
-  /**
-   * The [AnalysisContext] which is used to do the analysis.
-   */
-  final AnalysisContext analysisContext;
+  final PerformanceLog logger;
+  final ByteStore byteStore;
+  final SummaryDataStore store = new SummaryDataStore([]);
 
-  /**
-   * The resynthesizer that resynthesizes elements in [analysisContext].
-   */
-  final ElementResynthesizer resynthesizer;
+  /// The size of the linked data that is loaded by this context.
+  /// When it reaches [_maxLinkedDataInBytes] the whole context is thrown away.
+  /// We use it as an approximation for the heap size of elements.
+  int _linkedDataInBytes = 0;
 
-  /**
-   * Create a [LibraryContext] which is prepared to analyze [targetLibrary].
-   */
-  factory LibraryContext.forSingleLibrary(
-      FileState targetLibrary,
-      PerformanceLog logger,
-      PackageBundle sdkBundle,
-      ByteStore byteStore,
-      AnalysisOptions options,
-      DeclaredVariables declaredVariables,
-      SourceFactory sourceFactory,
-      SummaryDataStore externalSummaries,
-      FileSystemState fsState) {
-    return logger.run('Create library context', () {
-      Map<String, FileState> libraries = <String, FileState>{};
-      SummaryDataStore store = new SummaryDataStore(const <String>[]);
+  AnalysisContextImpl analysisContext;
+  SummaryResynthesizer resynthesizer;
+  InheritanceManager2 inheritanceManager;
 
-      if (externalSummaries != null) {
-        store.addStore(externalSummaries);
-      }
+  LibraryContext({
+    @required AnalysisSession session,
+    @required PerformanceLog logger,
+    @required ByteStore byteStore,
+    @required FileSystemState fsState,
+    @required AnalysisOptions analysisOptions,
+    @required DeclaredVariables declaredVariables,
+    @required SourceFactory sourceFactory,
+    @required SummaryDataStore externalSummaries,
+    @required FileState targetLibrary,
+  })  : this.logger = logger,
+        this.byteStore = byteStore {
+    if (externalSummaries != null) {
+      store.addStore(externalSummaries);
+    }
 
-      if (sdkBundle != null) {
-        store.addBundle(null, sdkBundle);
-      }
+    // Fill the store with summaries required for the initial library.
+    load(targetLibrary);
 
-      void appendLibraryFiles(FileState library) {
-        if (!libraries.containsKey(library.uriStr)) {
-          // Serve 'dart:' URIs from the SDK bundle.
-          if (sdkBundle != null && library.uri.scheme == 'dart') {
-            return;
-          }
+    analysisContext = new RestrictedAnalysisContext(
+      analysisOptions,
+      declaredVariables,
+      sourceFactory,
+    );
 
-          if (library.isInExternalSummaries) {
-            return;
-          }
+    var provider = new InputPackagesResultProvider(analysisContext, store,
+        session: session);
+    resynthesizer = provider.resynthesizer;
 
-          libraries[library.uriStr] = library;
-
-          // Append library units.
-          for (FileState part in library.libraryFiles) {
-            store.addUnlinkedUnit(part.uriStr, part.unlinked);
-          }
-
-          // Append referenced libraries.
-          library.importedFiles.forEach(appendLibraryFiles);
-          library.exportedFiles.forEach(appendLibraryFiles);
-        }
-      }
-
-      logger.run('Append library files', () {
-        appendLibraryFiles(targetLibrary);
-      });
-
-      var libraryUrisToLink = new Set<String>();
-      var libraryFilesToLink = new Set<FileState>();
-      logger.run('Load linked bundles', () {
-        for (FileState library in libraries.values) {
-          if (library.exists || library == targetLibrary) {
-            String key = '${library.transitiveSignature}.linked';
-            List<int> bytes = byteStore.get(key);
-            if (bytes != null) {
-              LinkedLibrary linked = new LinkedLibrary.fromBuffer(bytes);
-              store.addLinkedLibrary(library.uriStr, linked);
-            } else {
-              libraryUrisToLink.add(library.uriStr);
-              libraryFilesToLink.add(library);
-            }
-          }
-        }
-        int numOfLoaded = libraries.length - libraryUrisToLink.length;
-        logger.writeln('Loaded $numOfLoaded linked bundles.');
-      });
-
-      Map<String, LinkedLibraryBuilder> linkedLibraries = {};
-      logger.run('Link libraries', () {
-        linkedLibraries = link(libraryUrisToLink, (String uri) {
-          LinkedLibrary linkedLibrary = store.linkedMap[uri];
-          return linkedLibrary;
-        }, (String uri) {
-          UnlinkedUnit unlinkedUnit = store.unlinkedMap[uri];
-          return unlinkedUnit;
-        }, (_) => null);
-        logger.writeln('Linked ${linkedLibraries.length} libraries.');
-      });
-
-      for (String uri in linkedLibraries.keys) {
-        LinkedLibraryBuilder linkedBuilder = linkedLibraries[uri];
-        FileState library = libraries[uri];
-        String key = '${library.transitiveSignature}.linked';
-        List<int> bytes = linkedBuilder.toBuffer();
-        LinkedLibrary linked = new LinkedLibrary.fromBuffer(bytes);
-        store.addLinkedLibrary(uri, linked);
-        byteStore.put(key, bytes);
-      }
-
-      var resynthesizingContext = _createResynthesizingContext(
-          options, declaredVariables, sourceFactory, store);
-      resynthesizingContext.context.contentCache =
-          new _ContentCacheWrapper(fsState);
-
-      return new LibraryContext._(store, resynthesizingContext.context,
-          resynthesizingContext.resynthesizer);
-    });
+    inheritanceManager = new InheritanceManager2(analysisContext.typeSystem);
   }
 
-  LibraryContext._(this.store, this.analysisContext, this.resynthesizer);
+  /**
+   * The type provider used in this context.
+   */
+  TypeProvider get typeProvider => analysisContext.typeProvider;
 
   /**
    * Computes a [CompilationUnitElement] for the given library/unit pair.
    */
-  CompilationUnitElement computeUnitElement(
-      Source librarySource, Source unitSource) {
-    String libraryUri = librarySource.uri.toString();
-    String unitUri = unitSource.uri.toString();
-    return resynthesizer.getElement(
-        new ElementLocationImpl.con3(<String>[libraryUri, unitUri]));
+  CompilationUnitElement computeUnitElement(FileState library, FileState unit) {
+    return resynthesizer.getElement(new ElementLocationImpl.con3(<String>[
+      library.uriStr,
+      unit.uriStr,
+    ]));
   }
 
   /**
-   * Cleans up any persistent resources used by this [LibraryContext].
-   *
-   * Should be called once the [LibraryContext] is no longer needed.
+   * Get the [LibraryElement] for the given library.
    */
-  void dispose() {
-    analysisContext.dispose();
+  LibraryElement getLibraryElement(FileState library) {
+    return resynthesizer.getLibraryElement(library.uriStr);
   }
 
   /**
@@ -175,99 +109,96 @@
     return store.unlinkedMap[uriStr]?.isPartOf == false;
   }
 
-  /**
-   * Resynthesize the [LibraryElement] from the given [store].
-   */
-  static LibraryElement resynthesizeLibraryElement(
-      AnalysisOptions analysisOptions,
-      DeclaredVariables declaredVariables,
-      SourceFactory sourceFactory,
-      SummaryDataStore store,
-      String uri) {
-    var resynthesizingContext = _createResynthesizingContext(
-        analysisOptions, declaredVariables, sourceFactory, store);
-    try {
-      return resynthesizingContext.resynthesizer
-          .getElement(new ElementLocationImpl.con3([uri]));
-    } finally {
-      resynthesizingContext.context.dispose();
+  /// Load data required to access elements of the given [targetLibrary].
+  void load(FileState targetLibrary) {
+    // The library is already a part of the context, nothing to do.
+    if (store.linkedMap.containsKey(targetLibrary.uriStr)) {
+      return;
+    }
+
+    var libraries = <String, FileState>{};
+    void appendLibraryFiles(FileState library) {
+      // Stop if this library is already a part of the context.
+      // Libraries from external summaries are also covered by this.
+      if (store.linkedMap.containsKey(library.uriStr)) {
+        return;
+      }
+
+      // Stop if we have already scheduled loading of this library.
+      if (libraries.containsKey(library.uriStr)) {
+        return;
+      }
+
+      // Schedule the library for loading or linking.
+      libraries[library.uriStr] = library;
+
+      // Append library units.
+      for (FileState part in library.libraryFiles) {
+        store.addUnlinkedUnit(part.uriStr, part.unlinked);
+      }
+
+      // Append referenced libraries.
+      library.importedFiles.forEach(appendLibraryFiles);
+      library.exportedFiles.forEach(appendLibraryFiles);
+    }
+
+    logger.run('Append library files', () {
+      appendLibraryFiles(targetLibrary);
+    });
+
+    var libraryUrisToLink = new Set<String>();
+    logger.run('Load linked bundles', () {
+      for (FileState library in libraries.values) {
+        if (library.exists || library == targetLibrary) {
+          String key = library.transitiveSignatureLinked;
+          List<int> bytes = byteStore.get(key);
+          if (bytes != null) {
+            LinkedLibrary linked = new LinkedLibrary.fromBuffer(bytes);
+            store.addLinkedLibrary(library.uriStr, linked);
+            _linkedDataInBytes += bytes.length;
+          } else {
+            libraryUrisToLink.add(library.uriStr);
+          }
+        }
+      }
+      int numOfLoaded = libraries.length - libraryUrisToLink.length;
+      logger.writeln('Loaded $numOfLoaded linked bundles.');
+    });
+
+    var linkedLibraries = <String, LinkedLibraryBuilder>{};
+    logger.run('Link libraries', () {
+      linkedLibraries = link(libraryUrisToLink, (String uri) {
+        LinkedLibrary linkedLibrary = store.linkedMap[uri];
+        return linkedLibrary;
+      }, (String uri) {
+        UnlinkedUnit unlinkedUnit = store.unlinkedMap[uri];
+        return unlinkedUnit;
+      }, (_) => null);
+      logger.writeln('Linked ${linkedLibraries.length} libraries.');
+    });
+
+    // Store freshly linked libraries into the byte store.
+    // Append them to the context.
+    for (String uri in linkedLibraries.keys) {
+      FileState library = libraries[uri];
+      String key = library.transitiveSignatureLinked;
+
+      LinkedLibraryBuilder linkedBuilder = linkedLibraries[uri];
+      List<int> bytes = linkedBuilder.toBuffer();
+      byteStore.put(key, bytes);
+
+      LinkedLibrary linked = new LinkedLibrary.fromBuffer(bytes);
+      store.addLinkedLibrary(uri, linked);
+      _linkedDataInBytes += bytes.length;
     }
   }
 
-  static _ResynthesizingAnalysisContext _createResynthesizingContext(
-      AnalysisOptions analysisOptions,
-      DeclaredVariables declaredVariables,
-      SourceFactory sourceFactory,
-      SummaryDataStore store) {
-    AnalysisContextImpl analysisContext =
-        AnalysisEngine.instance.createAnalysisContext();
-    analysisContext.useSdkCachePartition = false;
-    analysisContext.analysisOptions = analysisOptions;
-    analysisContext.declaredVariables = declaredVariables;
-    analysisContext.sourceFactory = sourceFactory.clone();
-    var provider = new InputPackagesResultProvider(analysisContext, store);
-    analysisContext.resultProvider = provider;
-    return new _ResynthesizingAnalysisContext(
-        analysisContext, provider.resynthesizer);
+  /// Return `true` if this context grew too large, and should be recreated.
+  ///
+  /// It might have been used to analyze libraries that we don't need anymore,
+  /// and because loading libraries is not very expensive (but not free), the
+  /// simplest way to get rid of the garbage is to throw away everything.
+  bool pack() {
+    return _linkedDataInBytes > _maxLinkedDataInBytes;
   }
 }
-
-/**
- * [ContentCache] wrapper around [FileContentOverlay].
- */
-class _ContentCacheWrapper implements ContentCache {
-  final FileSystemState fsState;
-
-  _ContentCacheWrapper(this.fsState);
-
-  @override
-  void accept(ContentCacheVisitor visitor) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  String getContents(Source source) {
-    return _getFileForSource(source).content;
-  }
-
-  @override
-  bool getExists(Source source) {
-    if (source.isInSystemLibrary) {
-      return true;
-    }
-    String uriStr = source.uri.toString();
-    if (fsState.externalSummaries != null &&
-        fsState.externalSummaries.hasUnlinkedUnit(uriStr)) {
-      return true;
-    }
-    return _getFileForSource(source).exists;
-  }
-
-  @override
-  int getModificationStamp(Source source) {
-    if (source.isInSystemLibrary) {
-      return 0;
-    }
-    return _getFileForSource(source).exists ? 0 : -1;
-  }
-
-  @override
-  String setContents(Source source, String contents) {
-    throw new UnimplementedError();
-  }
-
-  FileState _getFileForSource(Source source) {
-    String path = source.fullName;
-    return fsState.getFileForPath(path);
-  }
-}
-
-/**
- * Container with analysis context and the corresponding resynthesizer.
- */
-class _ResynthesizingAnalysisContext {
-  final AnalysisContextImpl context;
-  final ElementResynthesizer resynthesizer;
-
-  _ResynthesizingAnalysisContext(this.context, this.resynthesizer);
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
new file mode 100644
index 0000000..74cb08c
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
@@ -0,0 +1,173 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:typed_data';
+
+import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/summary/api_signature.dart';
+import 'package:analyzer/src/summary/link.dart' as graph
+    show DependencyWalker, Node;
+import 'package:meta/meta.dart';
+
+/// Ensure that the [FileState.libraryCycle] for the [file] and anything it
+/// depends on is computed.
+void computeLibraryCycle(Uint32List linkedSalt, FileState file) {
+  var libraryWalker = new _LibraryWalker(linkedSalt);
+  libraryWalker.walk(libraryWalker.getNode(file));
+}
+
+/// Information about libraries that reference each other, so form a cycle.
+class LibraryCycle {
+  /// The libraries that belong to this cycle.
+  final List<FileState> libraries = [];
+
+  /// The library cycles that this cycle references directly.
+  @visibleForTesting
+  final Set<LibraryCycle> directDependencies = new Set<LibraryCycle>();
+
+  /// The cycles that use this cycle, used to [invalidate] transitively.
+  final List<LibraryCycle> _directUsers = [];
+
+  /// The transitive signature of this cycle.
+  ///
+  /// It is based on the API signatures of all files of the [libraries], and
+  /// transitive signatures of the cycles that the [libraries] reference
+  /// directly.  So, indirectly it is based on the transitive closure of all
+  /// files that [libraries] reference (but we don't compute these files).
+  String _transitiveSignature;
+
+  /// The map from a library in [libraries] to its transitive signature.
+  ///
+  /// It is almost the same as [_transitiveSignature], but is also based on
+  /// the URI of this specific library.  Currently we store each linked library
+  /// with its own key, so we need unique keys.  However practically we never
+  /// can use just *one* library of a cycle, we always use the whole cycle.
+  ///
+  /// TODO(scheglov) Switch to loading the whole cycle maybe?
+  final Map<FileState, String> transitiveSignatures = {};
+
+  LibraryCycle();
+
+  LibraryCycle.external() : _transitiveSignature = '<external>';
+
+  /// Invalidate this cycle and any cycles that directly or indirectly use it.
+  ///
+  /// Practically invalidation means that we clear the library cycle in all the
+  /// [libraries] that share this [LibraryCycle] instance.
+  void invalidate() {
+    for (var library in libraries) {
+      library.internal_setLibraryCycle(null, null);
+    }
+    for (var user in _directUsers) {
+      user.invalidate();
+    }
+    _directUsers.clear();
+  }
+
+  @override
+  String toString() {
+    return '[' + libraries.join(', ') + ']';
+  }
+}
+
+/// Node in [_LibraryWalker].
+class _LibraryNode extends graph.Node<_LibraryNode> {
+  final _LibraryWalker walker;
+  final FileState file;
+
+  _LibraryNode(this.walker, this.file);
+
+  @override
+  bool get isEvaluated => file.internal_libraryCycle != null;
+
+  @override
+  List<_LibraryNode> computeDependencies() {
+    return file.directReferencedLibraries.map(walker.getNode).toList();
+  }
+}
+
+/// Helper that organizes dependencies of a library into topologically
+/// sorted [LibraryCycle]s.
+class _LibraryWalker extends graph.DependencyWalker<_LibraryNode> {
+  final Uint32List _linkedSalt;
+  final Map<FileState, _LibraryNode> nodesOfFiles = {};
+
+  _LibraryWalker(this._linkedSalt);
+
+  @override
+  void evaluate(_LibraryNode v) {
+    evaluateScc([v]);
+  }
+
+  @override
+  void evaluateScc(List<_LibraryNode> scc) {
+    var cycle = new LibraryCycle();
+
+    var signature = new ApiSignature();
+    signature.addUint32List(_linkedSalt);
+
+    // Sort libraries to produce stable signatures.
+    scc.sort((first, second) {
+      var firstPath = first.file.path;
+      var secondPath = second.file.path;
+      return firstPath.compareTo(secondPath);
+    });
+
+    // Append direct referenced cycles.
+    for (var node in scc) {
+      var file = node.file;
+      _appendDirectlyReferenced(cycle, signature, file.importedFiles);
+      _appendDirectlyReferenced(cycle, signature, file.exportedFiles);
+    }
+
+    // Fill the cycle with libraries.
+    for (var node in scc) {
+      cycle.libraries.add(node.file);
+
+      signature.addInt(node.file.libraryFiles.length);
+      for (var file in node.file.libraryFiles) {
+        signature.addBytes(file.apiSignature);
+      }
+    }
+
+    // Compute the general library cycle signature.
+    cycle._transitiveSignature = signature.toHex();
+
+    // Compute library specific signatures.
+    for (var node in scc) {
+      var librarySignatureBuilder = new ApiSignature()
+        ..addString(node.file.uriStr)
+        ..addString(cycle._transitiveSignature);
+      var librarySignature = librarySignatureBuilder.toHex();
+
+      node.file.internal_setLibraryCycle(
+        cycle,
+        librarySignature,
+      );
+    }
+  }
+
+  _LibraryNode getNode(FileState file) {
+    return nodesOfFiles.putIfAbsent(file, () => new _LibraryNode(this, file));
+  }
+
+  void _appendDirectlyReferenced(
+    LibraryCycle cycle,
+    ApiSignature signature,
+    List<FileState> directlyReferenced,
+  ) {
+    signature.addInt(directlyReferenced.length);
+    for (var referencedLibrary in directlyReferenced) {
+      var referencedCycle = referencedLibrary.internal_libraryCycle;
+
+      // We get null when the library is a part of the cycle being build.
+      if (referencedCycle == null) continue;
+
+      if (cycle.directDependencies.add(referencedCycle)) {
+        referencedCycle._directUsers.add(cycle);
+        signature.addString(referencedCycle._transitiveSignature);
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/mutex.dart b/pkg/analyzer/lib/src/dart/analysis/mutex.dart
index 864e616..bf7532a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/mutex.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/mutex.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -18,18 +18,18 @@
 ///       m.release();
 ///     }
 class Mutex {
-  Completer<Null> _lock;
+  Completer<void> _lock;
 
   /// Acquire a lock.
   ///
   /// Returns a [Future] that will be completed when the lock has been acquired.
-  Future<Null> acquire() async {
+  Future<void> acquire() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     while (_lock != null) {
       await _lock.future;
     }
-    _lock = new Completer<Null>();
+    _lock = new Completer<void>();
   }
 
   /// Run the given [criticalSection] with acquired mutex.
diff --git a/pkg/analyzer/lib/src/dart/analysis/protected_file_byte_store.dart b/pkg/analyzer/lib/src/dart/analysis/protected_file_byte_store.dart
deleted file mode 100644
index b5ec4e1..0000000
--- a/pkg/analyzer/lib/src/dart/analysis/protected_file_byte_store.dart
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:meta/meta.dart';
-import 'package:path/path.dart';
-
-import 'byte_store.dart';
-import 'cache.dart';
-import 'file_byte_store.dart';
-
-/// The function that returns current time in milliseconds.
-typedef int GetCurrentTime();
-
-/// [ByteStore] that stores values as files, allows to mark some of keys as
-/// temporary protected, and supports periodical [flush] of unprotected keys.
-///
-/// The set of protected keys is stored in a file, which is locked during
-/// updating to prevent races across multiple processes.
-class ProtectedFileByteStore implements ByteStore {
-  @visibleForTesting
-  static const PROTECTED_FILE_NAME = '.temporary_protected_keys';
-
-  final String _cachePath;
-  final Duration _protectionDuration;
-  final GetCurrentTime _getCurrentTimeFunction;
-
-  final FileByteStore _fileByteStore;
-  final Cache<String, List<int>> _cache;
-
-  /// Create a new instance of the [ProtectedFileByteStore].
-  ///
-  /// The [protectionDuration] specifies how long temporary protected keys
-  /// stay protected.
-  ProtectedFileByteStore(this._cachePath,
-      {Duration protectionDuration,
-      GetCurrentTime getCurrentTime,
-      int cacheSizeBytes: 128 * 1024 * 1024})
-      : _protectionDuration = protectionDuration,
-        _getCurrentTimeFunction = getCurrentTime ?? _getCurrentTimeDefault,
-        _fileByteStore = new FileByteStore(_cachePath),
-        _cache = new Cache(cacheSizeBytes, (bytes) => bytes.length);
-
-  /// Remove all not protected keys.
-  void flush() {
-    var protectedKeysText = _keysReadTextLocked();
-    var protectedKeys = new ProtectedKeys.decode(protectedKeysText);
-    List<FileSystemEntity> files = new Directory(_cachePath).listSync();
-    for (var file in files) {
-      if (file is File) {
-        String key = basename(file.path);
-        if (key == PROTECTED_FILE_NAME) {
-          continue;
-        }
-        if (protectedKeys.containsKey(key)) {
-          continue;
-        }
-        try {
-          file.deleteSync();
-        } catch (e) {}
-      }
-    }
-  }
-
-  @override
-  List<int> get(String key) {
-    return _cache.get(key, () => _fileByteStore.get(key));
-  }
-
-  @override
-  void put(String key, List<int> bytes) {
-    if (key == PROTECTED_FILE_NAME) {
-      throw new ArgumentError('The key $key is reserved.');
-    }
-    _fileByteStore.put(key, bytes);
-    _cache.put(key, bytes);
-  }
-
-  /// The [add] keys are added to the set of temporary protected keys, and
-  /// their age is reset to zero.
-  ///
-  /// The [remove] keys are removed from the set of temporary protected keys,
-  /// and become subjects of LRU cached eviction.
-  void updateProtectedKeys(
-      {List<String> add: const <String>[],
-      List<String> remove: const <String>[]}) {
-    _withProtectedKeysLockSync(_cachePath, (ProtectedKeys protectedKeys) {
-      var now = _getCurrentTimeFunction();
-
-      if (_protectionDuration != null) {
-        var maxAge = _protectionDuration.inMilliseconds;
-        protectedKeys.removeOlderThan(maxAge, now);
-      }
-
-      for (var addedKey in add) {
-        protectedKeys.add(addedKey, now);
-      }
-
-      for (var removedKey in remove) {
-        protectedKeys.remove(removedKey);
-      }
-    });
-  }
-
-  /// Read the protected keys, but don't keep the lock.
-  ///
-  /// We do this before performing any long running operation that
-  /// just read, and where it is important to keep system unlocked.
-  String _keysReadTextLocked() {
-    File keysFile = new File(join(_cachePath, PROTECTED_FILE_NAME));
-    RandomAccessFile keysLock = keysFile.openSync(mode: FileMode.append);
-    keysLock.lockSync(FileLock.blockingExclusive);
-    try {
-      return _keysReadText(keysLock);
-    } finally {
-      keysLock.unlockSync();
-      keysLock.closeSync();
-    }
-  }
-
-  /// The default implementation of [GetCurrentTime].
-  static int _getCurrentTimeDefault() {
-    return new DateTime.now().millisecondsSinceEpoch;
-  }
-
-  static ProtectedKeys _keysRead(RandomAccessFile file) {
-    String text = _keysReadText(file);
-    return new ProtectedKeys.decode(text);
-  }
-
-  static String _keysReadText(RandomAccessFile file) {
-    file.setPositionSync(0);
-    List<int> bytes = file.readSync(file.lengthSync());
-    return utf8.decode(bytes);
-  }
-
-  static void _keysWrite(RandomAccessFile file, ProtectedKeys keys) {
-    String text = keys.encode();
-    file.setPositionSync(0);
-    file.writeStringSync(text);
-    file.truncateSync(file.positionSync());
-  }
-
-  /// Perform [f] over the locked keys file, decoded into [ProtectedKeys].
-  static void _withProtectedKeysLockSync(
-      String cachePath, void f(ProtectedKeys keys)) {
-    String path = join(cachePath, PROTECTED_FILE_NAME);
-    RandomAccessFile file = new File(path).openSync(mode: FileMode.append);
-    file.lockSync(FileLock.blockingExclusive);
-    try {
-      ProtectedKeys keys = _keysRead(file);
-      f(keys);
-      _keysWrite(file, keys);
-    } finally {
-      file.unlockSync();
-      file.closeSync();
-    }
-  }
-}
-
-/// Container with protected keys.
-@visibleForTesting
-class ProtectedKeys {
-  /// The map from a key in [ByteStore] to the time in milliseconds when the
-  /// key was marked as temporary protected.
-  final Map<String, int> map;
-
-  ProtectedKeys(this.map);
-
-  factory ProtectedKeys.decode(String text) {
-    var map = <String, int>{};
-    try {
-      List<String> lines = text.split('\n').toList();
-      if (lines.length % 2 == 0) {
-        for (int i = 0; i < lines.length; i += 2) {
-          String key = lines[i];
-          String startMillisecondsStr = lines[i + 1];
-          int startMilliseconds = int.parse(startMillisecondsStr);
-          map[key] = startMilliseconds;
-        }
-      }
-    } catch (e) {}
-    return new ProtectedKeys(map);
-  }
-
-  /// Add the given [key] with the current time.
-  void add(String key, int time) {
-    map[key] = time;
-  }
-
-  bool containsKey(String key) => map.containsKey(key);
-
-  String encode() {
-    var buffer = new StringBuffer();
-    map.forEach((key, start) {
-      buffer.writeln(key);
-      buffer.writeln(start);
-    });
-    return buffer.toString().trim();
-  }
-
-  void remove(String key) {
-    map.remove(key);
-  }
-
-  /// If the time is [now] milliseconds, remove all keys that are older than
-  /// the given [maxAge] is milliseconds.
-  void removeOlderThan(int maxAge, int now) {
-    var keysToRemove = <String>[];
-    for (var key in map.keys) {
-      if (now - map[key] > maxAge) {
-        keysToRemove.add(key);
-      }
-    }
-    keysToRemove.forEach(map.remove);
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/restricted_analysis_context.dart b/pkg/analyzer/lib/src/dart/analysis/restricted_analysis_context.dart
new file mode 100644
index 0000000..a68cdcd
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/restricted_analysis_context.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/type_system.dart';
+
+/// This class is a temporary step toward migrating Analyzer clients to the
+/// new API.  It guards against attempts to use any [AnalysisContext]
+/// functionality (which is task based), except what we intend to expose
+/// through the new API.
+class RestrictedAnalysisContext implements AnalysisContextImpl {
+  @override
+  final AnalysisOptionsImpl analysisOptions;
+
+  @override
+  final DeclaredVariables declaredVariables;
+
+  @override
+  final SourceFactory sourceFactory;
+
+  TypeProvider _typeProvider;
+
+  TypeSystem _typeSystem;
+
+  RestrictedAnalysisContext(
+      this.analysisOptions, this.declaredVariables, this.sourceFactory);
+
+  @override
+  TypeProvider get typeProvider => _typeProvider;
+
+  @override
+  set typeProvider(TypeProvider typeProvider) {
+    if (_typeProvider != null) {
+      throw StateError('TypeProvider can be set only once.');
+    }
+    _typeProvider = typeProvider;
+  }
+
+  @override
+  TypeSystem get typeSystem {
+    return _typeSystem ??= Dart2TypeSystem(
+      typeProvider,
+      implicitCasts: analysisOptions.implicitCasts,
+    );
+  }
+
+  noSuchMethod(Invocation invocation) {
+    return super.noSuchMethod(invocation);
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
new file mode 100644
index 0000000..fd50c1c
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -0,0 +1,296 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+abstract class AnalysisResultImpl implements AnalysisResult {
+  @override
+  final AnalysisSession session;
+
+  @override
+  final String path;
+
+  @override
+  final Uri uri;
+
+  AnalysisResultImpl(this.session, this.path, this.uri);
+}
+
+class ElementDeclarationResultImpl implements ElementDeclarationResult {
+  @override
+  final Element element;
+
+  @override
+  final AstNode node;
+
+  @override
+  final ParsedUnitResult parsedUnit;
+
+  @override
+  final ResolvedUnitResult resolvedUnit;
+
+  ElementDeclarationResultImpl(
+      this.element, this.node, this.parsedUnit, this.resolvedUnit);
+}
+
+class ErrorsResultImpl extends FileResultImpl implements ErrorsResult {
+  @override
+  final List<AnalysisError> errors;
+
+  ErrorsResultImpl(AnalysisSession session, String path, Uri uri,
+      LineInfo lineInfo, bool isPart, this.errors)
+      : super(session, path, uri, lineInfo, isPart);
+}
+
+class FileResultImpl extends AnalysisResultImpl implements FileResult {
+  @override
+  final LineInfo lineInfo;
+
+  @override
+  final bool isPart;
+
+  FileResultImpl(
+      AnalysisSession session, String path, Uri uri, this.lineInfo, this.isPart)
+      : super(session, path, uri);
+
+  @override
+  ResultState get state => ResultState.VALID;
+}
+
+class ParsedLibraryResultImpl extends AnalysisResultImpl
+    implements ParsedLibraryResult {
+  @override
+  final List<ParsedUnitResult> units;
+
+  ParsedLibraryResultImpl(
+      AnalysisSession session, String path, Uri uri, this.units)
+      : super(session, path, uri);
+
+  ParsedLibraryResultImpl.external(AnalysisSession session, Uri uri)
+      : this(session, null, uri, null);
+
+  @Deprecated('This factory exists temporary until AnalysisSession migration.')
+  factory ParsedLibraryResultImpl.tmp(LibraryElement library) {
+    var session = library.session;
+    if (session != null) {
+      return session.getParsedLibraryByElement(library);
+    } else {
+      var analysisContext = library.context;
+      var units = <ParsedUnitResult>[];
+      for (var unitElement in library.units) {
+        var unitSource = unitElement.source;
+
+        if (!analysisContext.exists(unitSource)) {
+          continue;
+        }
+
+        var content = analysisContext.getContents(unitSource).data;
+        var lineInfo = analysisContext.getLineInfo(unitSource);
+        var unit = analysisContext.parseCompilationUnit(unitSource);
+        units.add(ParsedUnitResultImpl(
+            null,
+            unitSource.fullName,
+            unitSource.uri,
+            content,
+            lineInfo,
+            unitSource != library.source,
+            unit, const []));
+      }
+      var libraryPath = library.source.fullName;
+      return ParsedLibraryResultImpl(
+          null, libraryPath, library.source.uri, units);
+    }
+  }
+
+  @override
+  ResultState get state {
+    if (path == null) {
+      return ResultState.NOT_A_FILE;
+    }
+    return ResultState.VALID;
+  }
+
+  @override
+  ElementDeclarationResult getElementDeclaration(Element element) {
+    if (state != ResultState.VALID) {
+      throw StateError('The result is not valid: $state');
+    }
+
+    var elementPath = element.source.fullName;
+    var unitResult = units.firstWhere(
+      (r) => r.path == elementPath,
+      orElse: () {
+        throw ArgumentError('Element (${element.runtimeType}) $element is not '
+            'defined in this library.');
+      },
+    );
+
+    if (element.isSynthetic || element.nameOffset == -1) {
+      return null;
+    }
+
+    var locator = NodeLocator2(element.nameOffset);
+    var node = locator.searchWithin(unitResult.unit)?.parent;
+    return ElementDeclarationResultImpl(element, node, unitResult, null);
+  }
+}
+
+class ParsedUnitResultImpl extends FileResultImpl implements ParsedUnitResult {
+  @override
+  final String content;
+
+  @override
+  final CompilationUnit unit;
+
+  @override
+  final List<AnalysisError> errors;
+
+  ParsedUnitResultImpl(AnalysisSession session, String path, Uri uri,
+      this.content, LineInfo lineInfo, bool isPart, this.unit, this.errors)
+      : super(session, path, uri, lineInfo, isPart);
+
+  @override
+  ResultState get state => ResultState.VALID;
+}
+
+class ResolvedLibraryResultImpl extends AnalysisResultImpl
+    implements ResolvedLibraryResult {
+  @override
+  final LibraryElement element;
+
+  @override
+  final TypeProvider typeProvider;
+
+  @override
+  final List<ResolvedUnitResult> units;
+
+  ResolvedLibraryResultImpl(AnalysisSession session, String path, Uri uri,
+      this.element, this.typeProvider, this.units)
+      : super(session, path, uri);
+
+  ResolvedLibraryResultImpl.external(AnalysisSession session, Uri uri)
+      : this(session, null, uri, null, null, null);
+
+  @override
+  ResultState get state {
+    if (path == null) {
+      return ResultState.NOT_A_FILE;
+    }
+    return ResultState.VALID;
+  }
+
+  @override
+  ElementDeclarationResult getElementDeclaration(Element element) {
+    if (state != ResultState.VALID) {
+      throw StateError('The result is not valid: $state');
+    }
+
+    var elementPath = element.source.fullName;
+    var unitResult = units.firstWhere(
+      (r) => r.path == elementPath,
+      orElse: () {
+        throw ArgumentError('Element (${element.runtimeType}) $element is not '
+            'defined in this library.');
+      },
+    );
+
+    if (element.isSynthetic || element.nameOffset == -1) {
+      return null;
+    }
+
+    var locator = NodeLocator2(element.nameOffset);
+    var node = locator.searchWithin(unitResult.unit)?.parent;
+    return ElementDeclarationResultImpl(element, node, null, unitResult);
+  }
+
+  @Deprecated('This method exists temporary until AnalysisSession migration.')
+  static Future<ResolvedLibraryResult> tmp(LibraryElement library) async {
+    var session = library.session;
+    if (session != null) {
+      return session.getResolvedLibraryByElement(library);
+    } else {
+      var units = <ResolvedUnitResult>[];
+      var analysisContext = library.context;
+      for (var unitElement in library.units) {
+        var unitSource = unitElement.source;
+
+        if (!analysisContext.exists(unitSource)) {
+          continue;
+        }
+
+        var path = unitSource.fullName;
+        var content = analysisContext.getContents(unitSource).data;
+        var lineInfo = analysisContext.getLineInfo(unitSource);
+        var unit = analysisContext.resolveCompilationUnit(unitSource, library);
+        units.add(ResolvedUnitResultImpl(null, path, unitSource.uri, true,
+            content, lineInfo, unitSource != library.source, unit, const []));
+      }
+      var libraryPath = library.source.fullName;
+      return ResolvedLibraryResultImpl(null, libraryPath, library.source.uri,
+          library, library.context.typeProvider, units);
+    }
+  }
+}
+
+class ResolvedUnitResultImpl extends FileResultImpl
+    implements ResolvedUnitResult {
+  /// Return `true` if the file exists.
+  final bool exists;
+
+  @override
+  final String content;
+
+  @override
+  final CompilationUnit unit;
+
+  @override
+  final List<AnalysisError> errors;
+
+  ResolvedUnitResultImpl(
+      AnalysisSession session,
+      String path,
+      Uri uri,
+      this.exists,
+      this.content,
+      LineInfo lineInfo,
+      bool isPart,
+      this.unit,
+      this.errors)
+      : super(session, path, uri, lineInfo, isPart);
+
+  @override
+  LibraryElement get libraryElement => unit.declaredElement.library;
+
+  @override
+  ResultState get state => exists ? ResultState.VALID : ResultState.NOT_A_FILE;
+
+  @override
+  TypeProvider get typeProvider => unit.declaredElement.context.typeProvider;
+
+  @override
+  TypeSystem get typeSystem => unit.declaredElement.context.typeSystem;
+}
+
+class UnitElementResultImpl extends AnalysisResultImpl
+    implements UnitElementResult {
+  @override
+  final String signature;
+
+  @override
+  final CompilationUnitElement element;
+
+  UnitElementResultImpl(AnalysisSession session, String path, Uri uri,
+      this.signature, this.element)
+      : super(session, path, uri);
+
+  @override
+  ResultState get state => ResultState.VALID;
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 9d1ff41..caa227a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -1,10 +1,11 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 import 'dart:collection';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -478,7 +479,7 @@
     return results;
   }
 
-  Future<Null> _addResults(
+  Future<void> _addResults(
       List<SearchResult> results,
       Element element,
       SearchedFiles searchedFiles,
@@ -522,7 +523,7 @@
   /**
    * Add results for [element] usage in the given [file].
    */
-  Future<Null> _addResultsInFile(
+  Future<void> _addResultsInFile(
       List<SearchResult> results,
       Element element,
       Map<IndexRelationKind, SearchResultKind> relationToResultKind,
@@ -654,10 +655,10 @@
     LibraryElement libraryElement = element.library;
     for (CompilationUnitElement unitElement in libraryElement.units) {
       String unitPath = unitElement.source.fullName;
-      AnalysisResult unitAnalysisResult = await _driver.getResult(unitPath);
+      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
       _ImportElementReferencesVisitor visitor =
           new _ImportElementReferencesVisitor(element, unitElement);
-      unitAnalysisResult.unit.accept(visitor);
+      unitResult.unit.accept(visitor);
       results.addAll(visitor.results);
     }
     return results;
@@ -675,8 +676,8 @@
     List<SearchResult> results = <SearchResult>[];
     for (CompilationUnitElement unitElement in element.units) {
       String unitPath = unitElement.source.fullName;
-      AnalysisResult unitAnalysisResult = await _driver.getResult(unitPath);
-      CompilationUnit unit = unitAnalysisResult.unit;
+      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
+      CompilationUnit unit = unitResult.unit;
       for (Directive directive in unit.directives) {
         if (directive is PartOfDirective && directive.element == element) {
           results.add(new SearchResult._(
@@ -702,8 +703,8 @@
     }
 
     // Prepare the unit.
-    AnalysisResult analysisResult = await _driver.getResult(path);
-    CompilationUnit unit = analysisResult.unit;
+    ResolvedUnitResult unitResult = await _driver.getResult(path);
+    CompilationUnit unit = unitResult.unit;
     if (unit == null) {
       return const <SearchResult>[];
     }
@@ -715,7 +716,7 @@
     }
 
     // Prepare the enclosing node.
-    AstNode enclosingNode = node.getAncestor(isRootNode);
+    AstNode enclosingNode = node.thisOrAncestorMatching(isRootNode);
     if (enclosingNode == null) {
       return const <SearchResult>[];
     }
@@ -759,10 +760,10 @@
     LibraryElement libraryElement = element.library;
     for (CompilationUnitElement unitElement in libraryElement.units) {
       String unitPath = unitElement.source.fullName;
-      AnalysisResult unitAnalysisResult = await _driver.getResult(unitPath);
+      ResolvedUnitResult unitResult = await _driver.getResult(unitPath);
       _LocalReferencesVisitor visitor =
           new _LocalReferencesVisitor(element, unitElement);
-      unitAnalysisResult.unit.accept(visitor);
+      unitResult.unit.accept(visitor);
       results.addAll(visitor.results);
     }
     return results;
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index ebbbf1d..6ff7f8f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -4,6 +4,8 @@
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/analysis/uri_converter.dart';
@@ -50,6 +52,12 @@
   AnalysisSessionImpl(this._driver);
 
   @override
+  AnalysisContext get analysisContext => _driver.analysisContext;
+
+  @override
+  DeclaredVariables get declaredVariables => _driver.declaredVariables;
+
+  @override
   ResourceProvider get resourceProvider => _driver.resourceProvider;
 
   @override
@@ -74,7 +82,7 @@
     await null;
     _checkConsistency();
     if (_typeSystem == null) {
-      _typeSystem = new StrongTypeSystemImpl(await typeProvider);
+      _typeSystem = new Dart2TypeSystem(await typeProvider);
     }
     return _typeSystem;
   }
@@ -106,21 +114,53 @@
     return libraryElement;
   }
 
+  @deprecated
   @override
-  Future<ParseResult> getParsedAst(String path) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    return getParsedAstSync(path);
+  Future<ParseResult> getParsedAst(String path) async => getParsedUnit(path);
+
+  @deprecated
+  @override
+  ParseResult getParsedAstSync(String path) => getParsedUnit(path);
+
+  @override
+  ParsedLibraryResult getParsedLibrary(String path) {
+    _checkConsistency();
+    return _driver.getParsedLibrary(path);
   }
 
   @override
-  ParseResult getParsedAstSync(String path) {
+  ParsedLibraryResult getParsedLibraryByElement(LibraryElement element) {
+    _checkConsistency();
+    _checkElementOfThisSession(element);
+    return _driver.getParsedLibraryByUri(element.source.uri);
+  }
+
+  @override
+  ParsedUnitResult getParsedUnit(String path) {
     _checkConsistency();
     return _driver.parseFileSync(path);
   }
 
+  @deprecated
   @override
-  Future<ResolveResult> getResolvedAst(String path) {
+  Future<ResolveResult> getResolvedAst(String path) => getResolvedUnit(path);
+
+  @override
+  Future<ResolvedLibraryResult> getResolvedLibrary(String path) {
+    _checkConsistency();
+    return _driver.getResolvedLibrary(path);
+  }
+
+  @override
+  Future<ResolvedLibraryResult> getResolvedLibraryByElement(
+      LibraryElement element) {
+    _checkConsistency();
+    _checkElementOfThisSession(element);
+    return _driver.getResolvedLibraryByUri(element.source.uri);
+  }
+
+  @override
+  Future<ResolvedUnitResult> getResolvedUnit(String path) {
     _checkConsistency();
     return _driver.getResult(path);
   }
@@ -159,4 +199,12 @@
       throw new InconsistentAnalysisException();
     }
   }
+
+  void _checkElementOfThisSession(Element element) {
+    if (element.session != this) {
+      throw new ArgumentError(
+          '(${element.runtimeType}) $element was not produced by '
+          'this session.');
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
index e35ec6a..9692a26 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session_helper.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/element/element.dart';
 
@@ -15,14 +16,14 @@
 class AnalysisSessionHelper {
   final AnalysisSession session;
 
+  final Map<String, ResolvedLibraryResult> _resolvedLibraries = {};
+
   AnalysisSessionHelper(this.session);
 
   /// Return the [ClassElement] with the given [className] that is exported
   /// from the library with the given [libraryUri], or `null` if the library
   /// does not export a class with such name.
   Future<ClassElement> getClass(String libraryUri, String className) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var libraryElement = await session.getLibraryByUri(libraryUri);
     var element = libraryElement.exportNamespace.get(className);
     if (element is ClassElement) {
@@ -32,13 +33,31 @@
     }
   }
 
+  /// Return the declaration of the [element], or `null` is the [element]
+  /// is synthetic.
+  Future<ElementDeclarationResult> getElementDeclaration(
+      Element element) async {
+    var libraryPath = element.library.source.fullName;
+    var resolvedLibrary = await _getResolvedLibrary(libraryPath);
+    return resolvedLibrary.getElementDeclaration(element);
+  }
+
+  /// Return the resolved unit that declares the given [element].
+  Future<ResolvedUnitResult> getResolvedUnitByElement(Element element) async {
+    var libraryPath = element.library.source.fullName;
+    var resolvedLibrary = await _getResolvedLibrary(libraryPath);
+
+    var unitPath = element.source.fullName;
+    return resolvedLibrary.units.singleWhere((resolvedUnit) {
+      return resolvedUnit.path == unitPath;
+    });
+  }
+
   /// Return the [PropertyAccessorElement] with the given [name] that is
   /// exported from the library with the given [uri], or `null` if the
   /// library does not export a top-level accessor with such name.
   Future<PropertyAccessorElement> getTopLevelPropertyAccessor(
       String uri, String name) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
     var libraryElement = await session.getLibraryByUri(uri);
     var element = libraryElement.exportNamespace.get(name);
     if (element is PropertyAccessorElement) {
@@ -47,4 +66,14 @@
       return null;
     }
   }
+
+  /// Return a newly resolved, or cached library with the given [path].
+  Future<ResolvedLibraryResult> _getResolvedLibrary(String path) async {
+    var result = _resolvedLibraries[path];
+    if (result == null) {
+      result = await session.getResolvedLibrary(path);
+      _resolvedLibraries[path] = result;
+    }
+    return result;
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/status.dart b/pkg/analyzer/lib/src/dart/analysis/status.dart
index cc2ad45..383de26 100644
--- a/pkg/analyzer/lib/src/dart/analysis/status.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/status.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -37,16 +37,16 @@
  * after completion and will not complete until [notify] is called next time.
  */
 class Monitor {
-  Completer<Null> _completer = new Completer<Null>();
+  Completer<void> _completer = new Completer<void>();
 
   /**
    * Return a [Future] that completes when [notify] is called at least once.
    */
-  Future<Null> get signal async {
+  Future<void> get signal async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     await _completer.future;
-    _completer = new Completer<Null>();
+    _completer = new Completer<void>();
   }
 
   /**
@@ -78,7 +78,7 @@
    * If non-null, a completer which should be completed on the next transition
    * to idle.
    */
-  Completer<Null> _idleCompleter;
+  Completer<void> _idleCompleter;
 
   /**
    * Return the last status sent to the [stream].
@@ -98,7 +98,7 @@
    * as a call to [transitionToAnalyzing], but it has no effect on the [stream].
    */
   void preTransitionToAnalyzing() {
-    _idleCompleter ??= new Completer<Null>();
+    _idleCompleter ??= new Completer<void>();
   }
 
   /**
@@ -130,7 +130,7 @@
    * If the status is currently idle, the returned future will be signaled
    * immediately.
    */
-  Future<Null> waitForIdle() {
-    return _idleCompleter?.future ?? new Future.value();
+  Future<void> waitForIdle() {
+    return _idleCompleter?.future ?? new Future<void>.value();
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
index df11c02..da33b5a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/uri_converter.dart
@@ -18,8 +18,8 @@
   final AnalysisDriver driver;
 
   /**
-   * Initialize a newly created URI converter to use the given [context] and
-   * [driver] to perform the conversions.
+   * Initialize a newly created URI converter to use the given [driver] to =
+   * perform the conversions.
    */
   DriverBasedUriConverter(this.driver);
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 9a0dcb9..749f864 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -899,14 +899,9 @@
       util.findPrevious(beginToken, target) ?? parent?.findPrevious(target);
 
   @override
-  E getAncestor<E extends AstNode>(Predicate<AstNode> predicate) {
-    // TODO(brianwilkerson) It is a bug that this method can return `this`.
-    AstNode node = this;
-    while (node != null && !predicate(node)) {
-      node = node.parent;
-    }
-    return node as E;
-  }
+  @deprecated
+  E getAncestor<E extends AstNode>(Predicate<AstNode> predicate) =>
+      thisOrAncestorMatching(predicate);
 
   @override
   E getProperty<E>(String name) {
@@ -934,6 +929,25 @@
   }
 
   @override
+  E thisOrAncestorMatching<E extends AstNode>(Predicate<AstNode> predicate) {
+    // TODO(brianwilkerson) It is a bug that this method can return `this`.
+    AstNode node = this;
+    while (node != null && !predicate(node)) {
+      node = node.parent;
+    }
+    return node as E;
+  }
+
+  @override
+  T thisOrAncestorOfType<T extends AstNode>() {
+    AstNode node = this;
+    while (node != null && node is! T) {
+      node = node.parent;
+    }
+    return node as T;
+  }
+
+  @override
   String toSource() {
     StringBuffer buffer = new StringBuffer();
     accept(new ToSourceVisitor2(buffer));
@@ -1591,7 +1605,7 @@
 /**
  * Helper class to allow iteration of child entities of an AST node.
  */
-class ChildEntities extends Object
+class ChildEntities
     with IterableMixin<SyntacticEntity>
     implements Iterable<SyntacticEntity> {
   /**
@@ -2328,6 +2342,12 @@
   Map<int, AstNode> localDeclarations;
 
   /**
+   * Is `true` if the non-nullable feature is enabled, and this library
+   * unit is annotated with `@pragma('analyzer:non-nullable')`.
+   */
+  bool hasPragmaAnalyzerNonNullable = false;
+
+  /**
    * Initialize a newly created compilation unit to have the given directives
    * and declarations. The [scriptTag] can be `null` if there is no script tag
    * in the compilation unit. The list of [directives] can be `null` if there
@@ -2682,17 +2702,21 @@
     if (errorCode is CompileTimeErrorCode) {
       switch (errorCode) {
         case CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL:
+        case CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT:
         case CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING:
         case CompileTimeErrorCode.CONST_EVAL_TYPE_INT:
         case CompileTimeErrorCode.CONST_EVAL_TYPE_NUM:
         case CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION:
         case CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE:
+        case CompileTimeErrorCode.CONST_WITH_NON_CONST:
         case CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT:
         case CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER:
         case CompileTimeErrorCode
             .CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZED_BY_NON_CONST:
         case CompileTimeErrorCode.INVALID_CONSTANT:
         case CompileTimeErrorCode.MISSING_CONST_IN_LIST_LITERAL:
+        case CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL:
+        case CompileTimeErrorCode.MISSING_CONST_IN_SET_LITERAL:
           hasConstError = true;
       }
     }
@@ -5703,34 +5727,35 @@
   FormalParameterListImpl _parameters;
 
   @override
+  Token question;
+
+  @override
   DartType type;
 
   /**
    * Initialize a newly created generic function type.
    */
-  GenericFunctionTypeImpl(
-      TypeAnnotationImpl returnType,
-      this.functionKeyword,
-      TypeParameterListImpl typeParameters,
-      FormalParameterListImpl parameters) {
+  GenericFunctionTypeImpl(TypeAnnotationImpl returnType, this.functionKeyword,
+      TypeParameterListImpl typeParameters, FormalParameterListImpl parameters,
+      {this.question}) {
     _returnType = _becomeParentOf(returnType);
     _typeParameters = _becomeParentOf(typeParameters);
     _parameters = _becomeParentOf(parameters);
   }
 
   @override
-  Token get beginToken =>
-      _returnType == null ? functionKeyword : _returnType.beginToken;
+  Token get beginToken => _returnType?.beginToken ?? functionKeyword;
 
   @override
   Iterable<SyntacticEntity> get childEntities => new ChildEntities()
     ..add(_returnType)
     ..add(functionKeyword)
     ..add(_typeParameters)
-    ..add(_parameters);
+    ..add(_parameters)
+    ..add(question);
 
   @override
-  Token get endToken => _parameters.endToken;
+  Token get endToken => question ?? _parameters.endToken;
 
   @override
   FormalParameterList get parameters => _parameters;
@@ -6389,8 +6414,6 @@
  *
  *    newExpression ::=
  *        ('new' | 'const')? [TypeName] ('.' [SimpleIdentifier])? [ArgumentList]
- *
- * 'new' | 'const' are only optional if the previewDart2 option is enabled.
  */
 class InstanceCreationExpressionImpl extends ExpressionImpl
     implements InstanceCreationExpression {
@@ -6482,8 +6505,6 @@
 
   /**
    * Return `true` if this is an implicit constructor invocations.
-   *
-   * This can only be `true` when the previewDart2 option is enabled.
    */
   bool get isImplicit => keyword == null;
 
@@ -6526,7 +6547,10 @@
    *
    * Also note that this method can cause constant evaluation to occur, which
    * can be computationally expensive.
+   * 
+   * Deprecated: Use `LinterContext.canBeConst` instead.
    */
+  @deprecated
   bool canBeConst() {
     //
     // Verify that the invoked constructor is a const constructor.
@@ -7748,6 +7772,12 @@
   SimpleIdentifierImpl _methodName;
 
   /**
+   * The invoke type of the [methodName] if the target element is a getter,
+   * or `null` otherwise.
+   */
+  DartType _methodNameType;
+
+  /**
    * Initialize a newly created method invocation. The [target] and [operator]
    * can be `null` if there is no target.
    */
@@ -7797,6 +7827,26 @@
     _methodName = _becomeParentOf(identifier as SimpleIdentifierImpl);
   }
 
+  /**
+   * The invoke type of the [methodName].
+   *
+   * If the target element is a [MethodElement], this is the same as the
+   * [staticInvokeType]. If the target element is a getter, presumably
+   * returning an [ExecutableElement] so that it can be invoked in this
+   * [MethodInvocation], then this type is the type of the getter, and the
+   * [staticInvokeType] is the invoked type of the returned element.
+   */
+  DartType get methodNameType => _methodNameType ?? staticInvokeType;
+
+  /**
+   * Set the [methodName] invoke type, only if the target element is a getter.
+   * Otherwise, the target element itself is invoked, [_methodNameType] is
+   * `null`, and the getter will return [staticInvokeType].
+   */
+  set methodNameType(DartType methodNameType) {
+    _methodNameType = methodNameType;
+  }
+
   @override
   int get precedence => 15;
 
@@ -8247,9 +8297,7 @@
 /**
  * A list of AST nodes that have a common parent.
  */
-class NodeListImpl<E extends AstNode> extends Object
-    with ListMixin<E>
-    implements NodeList<E> {
+class NodeListImpl<E extends AstNode> with ListMixin<E> implements NodeList<E> {
   /**
    * The node that is the parent of each of the elements in the list.
    */
@@ -9455,6 +9503,78 @@
 }
 
 /**
+ * A literal set.
+ *
+ *    setLiteral ::=
+ *        'const'? ('<' [TypeAnnotation] '>')?
+ *        '{' [Expression] (',' [Expression])* ','? '}'
+ *      | 'const'? ('<' [TypeAnnotation] '>')? '{' '}'
+ */
+class SetLiteralImpl extends TypedLiteralImpl implements SetLiteral {
+  /**
+   * The left curly bracket.
+   */
+  @override
+  Token leftBracket;
+
+  /**
+   * The elements in the set.
+   */
+  NodeList<Expression> _elements;
+
+  /**
+   * The right curly bracket.
+   */
+  @override
+  Token rightBracket;
+
+  /**
+   * Initialize a newly created set literal. The [constKeyword] can be `null` if
+   * the literal is not a constant. The [typeArguments] can be `null` if no type
+   * arguments were declared. The [elements] can be `null` if the set is empty.
+   */
+  SetLiteralImpl(Token constKeyword, TypeArgumentListImpl typeArguments,
+      this.leftBracket, List<Expression> elements, this.rightBracket)
+      : super(constKeyword, typeArguments) {
+    _elements = new NodeListImpl<Expression>(this, elements);
+  }
+
+  @override
+  Token get beginToken {
+    if (constKeyword != null) {
+      return constKeyword;
+    }
+    TypeArgumentList typeArguments = this.typeArguments;
+    if (typeArguments != null) {
+      return typeArguments.beginToken;
+    }
+    return leftBracket;
+  }
+
+  @override
+  // TODO(paulberry): add commas.
+  Iterable<SyntacticEntity> get childEntities => super._childEntities
+    ..add(leftBracket)
+    ..addAll(elements)
+    ..add(rightBracket);
+
+  @override
+  NodeList<Expression> get elements => _elements;
+
+  @override
+  Token get endToken => rightBracket;
+
+  @override
+  E accept<E>(AstVisitor<E> visitor) => visitor.visitSetLiteral(this);
+
+  @override
+  void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
+    _elements.accept(visitor);
+  }
+}
+
+/**
  * A combinator that restricts the names being imported to those in a given list.
  *
  *    showCombinator ::=
@@ -10944,7 +11064,7 @@
  * The name of a type, which can optionally include type arguments.
  *
  *    typeName ::=
- *        [Identifier] typeArguments?
+ *        [Identifier] typeArguments? '?'?
  */
 class TypeNameImpl extends TypeAnnotationImpl implements TypeName {
   /**
@@ -10958,6 +11078,9 @@
    */
   TypeArgumentListImpl _typeArguments;
 
+  @override
+  Token question;
+
   /**
    * The type being named, or `null` if the AST structure has not been resolved.
    */
@@ -10967,7 +11090,8 @@
    * Initialize a newly created type name. The [typeArguments] can be `null` if
    * there are no type arguments.
    */
-  TypeNameImpl(IdentifierImpl name, TypeArgumentListImpl typeArguments) {
+  TypeNameImpl(IdentifierImpl name, TypeArgumentListImpl typeArguments,
+      {this.question}) {
     _name = _becomeParentOf(name);
     _typeArguments = _becomeParentOf(typeArguments);
   }
@@ -10977,15 +11101,10 @@
 
   @override
   Iterable<SyntacticEntity> get childEntities =>
-      new ChildEntities()..add(_name)..add(_typeArguments);
+      new ChildEntities()..add(_name)..add(_typeArguments)..add(question);
 
   @override
-  Token get endToken {
-    if (_typeArguments != null) {
-      return _typeArguments.endToken;
-    }
-    return _name.endToken;
-  }
+  Token get endToken => question ?? _typeArguments?.endToken ?? _name.endToken;
 
   @override
   bool get isDeferred {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 6a3c3b5..cc7023a 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -546,9 +546,11 @@
           TypeAnnotation returnType,
           Token functionKeyword,
           TypeParameterList typeParameters,
-          FormalParameterList parameters) =>
+          FormalParameterList parameters,
+          {Token question}) =>
       new GenericFunctionTypeImpl(
-          returnType, functionKeyword, typeParameters, parameters);
+          returnType, functionKeyword, typeParameters, parameters,
+          question: question);
 
   @override
   GenericTypeAlias genericTypeAlias(
@@ -832,6 +834,12 @@
   ScriptTag scriptTag(Token scriptTag) => new ScriptTagImpl(scriptTag);
 
   @override
+  SetLiteral setLiteral(Token constKeyword, TypeArgumentList typeArguments,
+          Token leftBracket, List<Expression> elements, Token rightBracket) =>
+      new SetLiteralImpl(
+          constKeyword, typeArguments, leftBracket, elements, rightBracket);
+
+  @override
   ShowCombinator showCombinator(
           Token keyword, List<SimpleIdentifier> shownNames) =>
       new ShowCombinatorImpl(keyword, shownNames);
@@ -946,8 +954,9 @@
       new TypeArgumentListImpl(leftBracket, arguments, rightBracket);
 
   @override
-  TypeName typeName(Identifier name, TypeArgumentList typeArguments) =>
-      new TypeNameImpl(name, typeArguments);
+  TypeName typeName(Identifier name, TypeArgumentList typeArguments,
+          {Token question}) =>
+      new TypeNameImpl(name, typeArguments, question: question);
 
   @override
   TypeParameter typeParameter(Comment comment, List<Annotation> metadata,
diff --git a/pkg/analyzer/lib/src/dart/ast/token.dart b/pkg/analyzer/lib/src/dart/ast/token.dart
index 0556cfc..eea8be3 100644
--- a/pkg/analyzer/lib/src/dart/ast/token.dart
+++ b/pkg/analyzer/lib/src/dart/ast/token.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/ast/token.dart';
+
 export 'package:front_end/src/scanner/token.dart'
     show
         BeginToken,
@@ -15,3 +17,36 @@
         SyntheticStringToken,
         SyntheticToken,
         TokenClass;
+
+/**
+ * Return the binary operator that is invoked by the given compound assignment
+ * [operator]. Throw [StateError] if the assignment [operator] does not
+ * correspond to a binary operator.
+ */
+TokenType operatorFromCompoundAssignment(TokenType operator) {
+  if (operator == TokenType.AMPERSAND_EQ) {
+    return TokenType.AMPERSAND;
+  } else if (operator == TokenType.BAR_EQ) {
+    return TokenType.BAR;
+  } else if (operator == TokenType.CARET_EQ) {
+    return TokenType.CARET;
+  } else if (operator == TokenType.GT_GT_EQ) {
+    return TokenType.GT_GT;
+  } else if (operator == TokenType.LT_LT_EQ) {
+    return TokenType.LT_LT;
+  } else if (operator == TokenType.MINUS_EQ) {
+    return TokenType.MINUS;
+  } else if (operator == TokenType.PERCENT_EQ) {
+    return TokenType.PERCENT;
+  } else if (operator == TokenType.PLUS_EQ) {
+    return TokenType.PLUS;
+  } else if (operator == TokenType.SLASH_EQ) {
+    return TokenType.SLASH;
+  } else if (operator == TokenType.STAR_EQ) {
+    return TokenType.STAR;
+  } else if (operator == TokenType.TILDE_SLASH_EQ) {
+    return TokenType.TILDE_SLASH;
+  } else {
+    throw StateError('Unknown assignment operator: $operator');
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index f7e6832..051fa2b 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -574,7 +574,8 @@
           cloneNode(node.returnType),
           cloneToken(node.functionKeyword),
           cloneNode(node.typeParameters),
-          cloneNode(node.parameters));
+          cloneNode(node.parameters),
+          question: cloneToken(node.question));
 
   @override
   AstNode visitGenericTypeAlias(GenericTypeAlias node) =>
@@ -845,6 +846,14 @@
       astFactory.scriptTag(cloneToken(node.scriptTag));
 
   @override
+  SetLiteral visitSetLiteral(SetLiteral node) => astFactory.setLiteral(
+      cloneToken(node.constKeyword),
+      cloneNode(node.typeArguments),
+      cloneToken(node.leftBracket),
+      cloneNodeList(node.elements),
+      cloneToken(node.rightBracket));
+
+  @override
   ShowCombinator visitShowCombinator(ShowCombinator node) => astFactory
       .showCombinator(cloneToken(node.keyword), cloneNodeList(node.shownNames));
 
@@ -950,7 +959,8 @@
 
   @override
   TypeName visitTypeName(TypeName node) =>
-      astFactory.typeName(cloneNode(node.name), cloneNode(node.typeArguments));
+      astFactory.typeName(cloneNode(node.name), cloneNode(node.typeArguments),
+          question: cloneToken(node.question));
 
   @override
   TypeParameter visitTypeParameter(TypeParameter node) =>
@@ -1653,7 +1663,8 @@
     return isEqualNodes(node.returnType, other.returnType) &&
         isEqualTokens(node.functionKeyword, other.functionKeyword) &&
         isEqualNodes(node.typeParameters, other.typeParameters) &&
-        isEqualNodes(node.parameters, other.parameters);
+        isEqualNodes(node.parameters, other.parameters) &&
+        isEqualTokens(node.question, other.question);
   }
 
   @override
@@ -1988,6 +1999,16 @@
   }
 
   @override
+  bool visitSetLiteral(SetLiteral node) {
+    SetLiteral other = _other as SetLiteral;
+    return isEqualTokens(node.constKeyword, other.constKeyword) &&
+        isEqualNodes(node.typeArguments, other.typeArguments) &&
+        isEqualTokens(node.leftBracket, other.leftBracket) &&
+        _isEqualNodeLists(node.elements, other.elements) &&
+        isEqualTokens(node.rightBracket, other.rightBracket);
+  }
+
+  @override
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator other = _other as ShowCombinator;
     return isEqualTokens(node.keyword, other.keyword) &&
@@ -2122,7 +2143,8 @@
   bool visitTypeName(TypeName node) {
     TypeName other = _other as TypeName;
     return isEqualNodes(node.name, other.name) &&
-        isEqualNodes(node.typeArguments, other.typeArguments);
+        isEqualNodes(node.typeArguments, other.typeArguments) &&
+        isEqualTokens(node.question, other.question);
   }
 
   @override
@@ -2633,7 +2655,7 @@
  *
  * See [PrefixedIdentifier.isDeferred].
  */
-class DeferredLibraryReferenceDetector extends RecursiveAstVisitor<Object> {
+class DeferredLibraryReferenceDetector extends RecursiveAstVisitor<void> {
   /**
    * A flag indicating whether an identifier from a deferred library has been
    * found.
@@ -2647,13 +2669,12 @@
   bool get result => _result;
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (!_result) {
       if (node.isDeferred) {
         _result = true;
       }
     }
-    return null;
   }
 }
 
@@ -3054,14 +3075,14 @@
 
   @override
   CompilationUnit visitCompilationUnit(CompilationUnit node) {
-    CompilationUnit copy = astFactory.compilationUnit(
+    CompilationUnitImpl copy = astFactory.compilationUnit(
         _mapToken(node.beginToken),
         _cloneNode(node.scriptTag),
         _cloneNodeList(node.directives),
         _cloneNodeList(node.declarations),
         _mapToken(node.endToken));
     copy.lineInfo = node.lineInfo;
-    copy.element = node.element;
+    copy.declaredElement = node.declaredElement;
     return copy;
   }
 
@@ -3091,7 +3112,7 @@
   @override
   ConstructorDeclaration visitConstructorDeclaration(
       ConstructorDeclaration node) {
-    ConstructorDeclaration copy = astFactory.constructorDeclaration(
+    ConstructorDeclarationImpl copy = astFactory.constructorDeclaration(
         _cloneNode(node.documentationComment),
         _cloneNodeList(node.metadata),
         _mapToken(node.externalKeyword),
@@ -3105,7 +3126,7 @@
         _cloneNodeList(node.initializers),
         _cloneNode(node.redirectedConstructor),
         _cloneNode(node.body));
-    copy.element = node.element;
+    copy.declaredElement = node.declaredElement;
     return copy;
   }
 
@@ -3316,11 +3337,11 @@
 
   @override
   FunctionExpression visitFunctionExpression(FunctionExpression node) {
-    FunctionExpression copy = astFactory.functionExpression(
+    FunctionExpressionImpl copy = astFactory.functionExpression(
         _cloneNode(node.typeParameters),
         _cloneNode(node.parameters),
         _cloneNode(node.body));
-    copy.element = node.element;
+    copy.declaredElement = node.declaredElement;
     copy.staticType = node.staticType;
     return copy;
   }
@@ -3367,7 +3388,8 @@
           _cloneNode(node.returnType),
           _mapToken(node.functionKeyword),
           _cloneNode(node.typeParameters),
-          _cloneNode(node.parameters));
+          _cloneNode(node.parameters),
+          question: _mapToken(node.question));
 
   @override
   AstNode visitGenericTypeAlias(GenericTypeAlias node) =>
@@ -3713,6 +3735,18 @@
       astFactory.scriptTag(_mapToken(node.scriptTag));
 
   @override
+  SetLiteral visitSetLiteral(SetLiteral node) {
+    SetLiteral copy = astFactory.setLiteral(
+        _mapToken(node.constKeyword),
+        _cloneNode(node.typeArguments),
+        _mapToken(node.leftBracket),
+        _cloneNodeList(node.elements),
+        _mapToken(node.rightBracket));
+    copy.staticType = node.staticType;
+    return copy;
+  }
+
+  @override
   ShowCombinator visitShowCombinator(ShowCombinator node) => astFactory
       .showCombinator(_mapToken(node.keyword), _cloneNodeList(node.shownNames));
 
@@ -3858,7 +3892,8 @@
   @override
   TypeName visitTypeName(TypeName node) {
     TypeName copy = astFactory.typeName(
-        _cloneNode(node.name), _cloneNode(node.typeArguments));
+        _cloneNode(node.name), _cloneNode(node.typeArguments),
+        question: _mapToken(node.question));
     copy.type = node.type;
     return copy;
   }
@@ -3959,7 +3994,7 @@
  * the [AstNode] with the shortest length whose source range completely
  * encompasses the specified range.
  */
-class NodeLocator extends UnifyingAstVisitor<Object> {
+class NodeLocator extends UnifyingAstVisitor<void> {
   /**
    * The start offset of the range used to identify the node.
    */
@@ -4012,10 +4047,10 @@
   }
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     // Don't visit a new tree if the result has been already found.
     if (_foundNode != null) {
-      return null;
+      return;
     }
     // Check whether the current node covers the selection.
     Token beginToken = node.beginToken;
@@ -4032,11 +4067,8 @@
     }
     int end = endToken.end;
     int start = node.offset;
-    if (end < _startOffset) {
-      return null;
-    }
-    if (start > _endOffset) {
-      return null;
+    if (end < _startOffset || start > _endOffset) {
+      return;
     }
     // Check children.
     try {
@@ -4050,13 +4082,12 @@
     }
     // Found a child.
     if (_foundNode != null) {
-      return null;
+      return;
     }
     // Check this node.
     if (start <= _startOffset && _endOffset <= end) {
       _foundNode = node;
     }
-    return null;
   }
 }
 
@@ -4065,7 +4096,7 @@
  * More specifically, they will return the deepest [AstNode] which completely
  * encompasses the specified range.
  */
-class NodeLocator2 extends UnifyingAstVisitor<Object> {
+class NodeLocator2 extends UnifyingAstVisitor<void> {
   /**
    * The inclusive start offset of the range used to identify the node.
    */
@@ -4112,10 +4143,10 @@
   }
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     // Don't visit a new tree if the result has been already found.
     if (_foundNode != null) {
-      return null;
+      return;
     }
     // Check whether the current node covers the selection.
     Token beginToken = node.beginToken;
@@ -4132,11 +4163,8 @@
     }
     int end = endToken.end;
     int start = node.offset;
-    if (end <= _startOffset) {
-      return null;
-    }
-    if (start > _endOffset) {
-      return null;
+    if (end <= _startOffset || start > _endOffset) {
+      return;
     }
     // Check children.
     try {
@@ -4150,13 +4178,12 @@
     }
     // Found a child.
     if (_foundNode != null) {
-      return null;
+      return;
     }
     // Check this node.
     if (start <= _startOffset && _endOffset < end) {
       _foundNode = node;
     }
-    return null;
   }
 }
 
@@ -5164,6 +5191,14 @@
   bool visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
 
   @override
+  bool visitSetLiteral(SetLiteral node) {
+    if (_replaceInList(node.elements)) {
+      return true;
+    }
+    return visitTypedLiteral(node);
+  }
+
+  @override
   bool visitShowCombinator(ShowCombinator node) {
     if (_replaceInList(node.shownNames)) {
       return true;
@@ -5714,7 +5749,7 @@
 
   @override
   bool visitConstructorDeclaration(ConstructorDeclaration node) {
-    ConstructorDeclaration toNode = this._toNode as ConstructorDeclaration;
+    ConstructorDeclarationImpl toNode = this._toNode as ConstructorDeclaration;
     if (_and(
         _isEqualNodes(node.documentationComment, toNode.documentationComment),
         _isEqualNodeLists(node.metadata, toNode.metadata),
@@ -5729,7 +5764,7 @@
         _isEqualNodeLists(node.initializers, toNode.initializers),
         _isEqualNodes(node.redirectedConstructor, toNode.redirectedConstructor),
         _isEqualNodes(node.body, toNode.body))) {
-      toNode.element = node.declaredElement;
+      toNode.declaredElement = node.declaredElement;
       return true;
     }
     return false;
@@ -5985,10 +6020,10 @@
 
   @override
   bool visitFunctionExpression(FunctionExpression node) {
-    FunctionExpression toNode = this._toNode as FunctionExpression;
+    FunctionExpressionImpl toNode = this._toNode as FunctionExpression;
     if (_and(_isEqualNodes(node.parameters, toNode.parameters),
         _isEqualNodes(node.body, toNode.body))) {
-      toNode.element = node.declaredElement;
+      toNode.declaredElement = node.declaredElement;
       toNode.staticType = node.staticType;
       return true;
     }
@@ -6044,7 +6079,8 @@
         _isEqualNodes(node.returnType, toNode.returnType),
         _isEqualTokens(node.functionKeyword, toNode.functionKeyword),
         _isEqualNodes(node.typeParameters, toNode.typeParameters),
-        _isEqualNodes(node.parameters, toNode.parameters))) {
+        _isEqualNodes(node.parameters, toNode.parameters),
+        _isEqualTokens(node.question, toNode.question))) {
       toNode.type = node.type;
       return true;
     }
@@ -6494,6 +6530,21 @@
   }
 
   @override
+  bool visitSetLiteral(SetLiteral node) {
+    SetLiteral toNode = this._toNode as SetLiteral;
+    if (_and(
+        _isEqualTokens(node.constKeyword, toNode.constKeyword),
+        _isEqualNodes(node.typeArguments, toNode.typeArguments),
+        _isEqualTokens(node.leftBracket, toNode.leftBracket),
+        _isEqualNodeLists(node.elements, toNode.elements),
+        _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
+      toNode.staticType = node.staticType;
+      return true;
+    }
+    return false;
+  }
+
+  @override
   bool visitShowCombinator(ShowCombinator node) {
     ShowCombinator toNode = this._toNode as ShowCombinator;
     return _and(_isEqualTokens(node.keyword, toNode.keyword),
@@ -6674,8 +6725,10 @@
   @override
   bool visitTypeName(TypeName node) {
     TypeName toNode = this._toNode as TypeName;
-    if (_and(_isEqualNodes(node.name, toNode.name),
-        _isEqualNodes(node.typeArguments, toNode.typeArguments))) {
+    if (_and(
+        _isEqualNodes(node.name, toNode.name),
+        _isEqualNodes(node.typeArguments, toNode.typeArguments),
+        _isEqualTokens(node.question, toNode.question))) {
       toNode.type = node.type;
       return true;
     }
@@ -6893,7 +6946,7 @@
  * Completion test code coverage is 95%. The two basic blocks that are not
  * executed cannot be executed. They are included for future reference.
  */
-class ScopedNameFinder extends GeneralizingAstVisitor<Object> {
+class ScopedNameFinder extends GeneralizingAstVisitor<void> {
   Declaration _declarationNode;
 
   AstNode _immediateChild;
@@ -6912,112 +6965,104 @@
   Map<String, SimpleIdentifier> get locals => _locals;
 
   @override
-  Object visitBlock(Block node) {
+  void visitBlock(Block node) {
     _checkStatements(node.statements);
-    return super.visitBlock(node);
+    super.visitBlock(node);
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     _addToScope(node.exceptionParameter);
     _addToScope(node.stackTraceParameter);
-    return super.visitCatchClause(node);
+    super.visitCatchClause(node);
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     if (!identical(_immediateChild, node.parameters)) {
       _addParameters(node.parameters.parameters);
     }
     _declarationNode = node;
-    return null;
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     _declarationNode = node;
-    return null;
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
+  void visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (loopVariable != null) {
       _addToScope(loopVariable.identifier);
     }
-    return super.visitForEachStatement(node);
+    super.visitForEachStatement(node);
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     if (!identical(_immediateChild, node.variables) && node.variables != null) {
       _addVariables(node.variables.variables);
     }
-    return super.visitForStatement(node);
+    super.visitForStatement(node);
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     if (node.parent is! FunctionDeclarationStatement) {
       _declarationNode = node;
-      return null;
+    } else {
+      super.visitFunctionDeclaration(node);
     }
-    return super.visitFunctionDeclaration(node);
   }
 
   @override
-  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+  void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     _referenceIsWithinLocalFunction = true;
-    return super.visitFunctionDeclarationStatement(node);
+    super.visitFunctionDeclarationStatement(node);
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     if (node.parameters != null &&
         !identical(_immediateChild, node.parameters)) {
       _addParameters(node.parameters.parameters);
     }
-    return super.visitFunctionExpression(node);
+    super.visitFunctionExpression(node);
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     _declarationNode = node;
-    if (node.parameters == null) {
-      return null;
-    }
-    if (!identical(_immediateChild, node.parameters)) {
+    if (node.parameters != null &&
+        !identical(_immediateChild, node.parameters)) {
       _addParameters(node.parameters.parameters);
     }
-    return null;
   }
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     _immediateChild = node;
     AstNode parent = node.parent;
     if (parent != null) {
       parent.accept(this);
     }
-    return null;
   }
 
   @override
-  Object visitSwitchMember(SwitchMember node) {
+  void visitSwitchMember(SwitchMember node) {
     _checkStatements(node.statements);
-    return super.visitSwitchMember(node);
+    super.visitSwitchMember(node);
   }
 
   @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _declarationNode = node;
-    return null;
   }
 
   @override
-  Object visitTypeAlias(TypeAlias node) {
+  void visitTypeAlias(TypeAlias node) {
     _declarationNode = node;
-    return null;
   }
 
   void _addParameters(NodeList<FormalParameter> vars) {
@@ -7076,7 +7121,7 @@
  * This class has been deprecated. Use the class ToSourceVisitor2 instead.
  */
 @deprecated
-class ToSourceVisitor implements AstVisitor<Object> {
+class ToSourceVisitor implements AstVisitor<void> {
   /**
    * The writer to which the source is to be written.
    */
@@ -7089,38 +7134,34 @@
   ToSourceVisitor(this._writer);
 
   @override
-  Object visitAdjacentStrings(AdjacentStrings node) {
+  void visitAdjacentStrings(AdjacentStrings node) {
     _visitNodeListWithSeparator(node.strings, " ");
-    return null;
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     _writer.print('@');
     _visitNode(node.name);
     _visitNodeWithPrefix(".", node.constructorName);
     _visitNode(node.arguments);
-    return null;
   }
 
   @override
-  Object visitArgumentList(ArgumentList node) {
+  void visitArgumentList(ArgumentList node) {
     _writer.print('(');
     _visitNodeListWithSeparator(node.arguments, ", ");
     _writer.print(')');
-    return null;
   }
 
   @override
-  Object visitAsExpression(AsExpression node) {
+  void visitAsExpression(AsExpression node) {
     _visitNode(node.expression);
     _writer.print(" as ");
     _visitNode(node.type);
-    return null;
   }
 
   @override
-  bool visitAssertInitializer(AssertInitializer node) {
+  void visitAssertInitializer(AssertInitializer node) {
     _writer.print("assert (");
     _visitNode(node.condition);
     if (node.message != null) {
@@ -7128,11 +7169,10 @@
       _visitNode(node.message);
     }
     _writer.print(")");
-    return null;
   }
 
   @override
-  Object visitAssertStatement(AssertStatement node) {
+  void visitAssertStatement(AssertStatement node) {
     _writer.print("assert (");
     _visitNode(node.condition);
     if (node.message != null) {
@@ -7140,46 +7180,41 @@
       _visitNode(node.message);
     }
     _writer.print(");");
-    return null;
   }
 
   @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
+  void visitAssignmentExpression(AssignmentExpression node) {
     _visitNode(node.leftHandSide);
     _writer.print(' ');
     _writer.print(node.operator.lexeme);
     _writer.print(' ');
     _visitNode(node.rightHandSide);
-    return null;
   }
 
   @override
-  Object visitAwaitExpression(AwaitExpression node) {
+  void visitAwaitExpression(AwaitExpression node) {
     _writer.print("await ");
     _visitNode(node.expression);
-    return null;
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     _visitNode(node.leftOperand);
     _writer.print(' ');
     _writer.print(node.operator.lexeme);
     _writer.print(' ');
     _visitNode(node.rightOperand);
-    return null;
   }
 
   @override
-  Object visitBlock(Block node) {
+  void visitBlock(Block node) {
     _writer.print('{');
     _visitNodeListWithSeparator(node.statements, " ");
     _writer.print('}');
-    return null;
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     Token keyword = node.keyword;
     if (keyword != null) {
       _writer.print(keyword.lexeme);
@@ -7189,32 +7224,28 @@
       _writer.print(' ');
     }
     _visitNode(node.block);
-    return null;
   }
 
   @override
-  Object visitBooleanLiteral(BooleanLiteral node) {
+  void visitBooleanLiteral(BooleanLiteral node) {
     _writer.print(node.literal.lexeme);
-    return null;
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     _writer.print("break");
     _visitNodeWithPrefix(" ", node.label);
     _writer.print(";");
-    return null;
   }
 
   @override
-  Object visitCascadeExpression(CascadeExpression node) {
+  void visitCascadeExpression(CascadeExpression node) {
     _visitNode(node.target);
     _visitNodeList(node.cascadeSections);
-    return null;
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     _visitNodeWithPrefix("on ", node.exceptionType);
     if (node.catchKeyword != null) {
       if (node.exceptionType != null) {
@@ -7228,11 +7259,10 @@
       _writer.print(" ");
     }
     _visitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitTokenWithSuffix(node.abstractKeyword, " ");
     _writer.print("class ");
@@ -7244,11 +7274,10 @@
     _writer.print(" {");
     _visitNodeListWithSeparator(node.members, " ");
     _writer.print("}");
-    return null;
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     if (node.abstractKeyword != null) {
       _writer.print("abstract ");
@@ -7261,17 +7290,16 @@
     _visitNodeWithPrefix(" ", node.withClause);
     _visitNodeWithPrefix(" ", node.implementsClause);
     _writer.print(";");
-    return null;
   }
 
   @override
-  Object visitComment(Comment node) => null;
+  void visitComment(Comment node) {}
 
   @override
-  Object visitCommentReference(CommentReference node) => null;
+  void visitCommentReference(CommentReference node) {}
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     ScriptTag scriptTag = node.scriptTag;
     NodeList<Directive> directives = node.directives;
     _visitNode(scriptTag);
@@ -7279,31 +7307,28 @@
     _visitNodeListWithSeparatorAndPrefix(prefix, directives, " ");
     prefix = scriptTag == null && directives.isEmpty ? "" : " ";
     _visitNodeListWithSeparatorAndPrefix(prefix, node.declarations, " ");
-    return null;
   }
 
   @override
-  Object visitConditionalExpression(ConditionalExpression node) {
+  void visitConditionalExpression(ConditionalExpression node) {
     _visitNode(node.condition);
     _writer.print(" ? ");
     _visitNode(node.thenExpression);
     _writer.print(" : ");
     _visitNode(node.elseExpression);
-    return null;
   }
 
   @override
-  Object visitConfiguration(Configuration node) {
+  void visitConfiguration(Configuration node) {
     _writer.print('if (');
     _visitNode(node.name);
     _visitNodeWithPrefix(" == ", node.value);
     _writer.print(') ');
     _visitNode(node.uri);
-    return null;
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitTokenWithSuffix(node.externalKeyword, " ");
     _visitTokenWithSuffix(node.constKeyword, " ");
@@ -7314,44 +7339,39 @@
     _visitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
     _visitNodeWithPrefix(" = ", node.redirectedConstructor);
     _visitFunctionWithPrefix(" ", node.body);
-    return null;
   }
 
   @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     _visitTokenWithSuffix(node.thisKeyword, ".");
     _visitNode(node.fieldName);
     _writer.print(" = ");
     _visitNode(node.expression);
-    return null;
   }
 
   @override
-  Object visitConstructorName(ConstructorName node) {
+  void visitConstructorName(ConstructorName node) {
     _visitNode(node.type);
     _visitNodeWithPrefix(".", node.name);
-    return null;
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     _writer.print("continue");
     _visitNodeWithPrefix(" ", node.label);
     _writer.print(";");
-    return null;
   }
 
   @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitTokenWithSuffix(node.keyword, " ");
     _visitNodeWithSuffix(node.type, " ");
     _visitNode(node.identifier);
-    return null;
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     _visitNode(node.parameter);
     if (node.separator != null) {
       if (node.separator.lexeme != ":") {
@@ -7360,73 +7380,64 @@
       _writer.print(node.separator.lexeme);
       _visitNodeWithPrefix(" ", node.defaultValue);
     }
-    return null;
   }
 
   @override
-  Object visitDoStatement(DoStatement node) {
+  void visitDoStatement(DoStatement node) {
     _writer.print("do ");
     _visitNode(node.body);
     _writer.print(" while (");
     _visitNode(node.condition);
     _writer.print(");");
-    return null;
   }
 
   @override
-  Object visitDottedName(DottedName node) {
+  void visitDottedName(DottedName node) {
     _visitNodeListWithSeparator(node.components, ".");
-    return null;
   }
 
   @override
-  Object visitDoubleLiteral(DoubleLiteral node) {
+  void visitDoubleLiteral(DoubleLiteral node) {
     _writer.print(node.literal.lexeme);
-    return null;
   }
 
   @override
-  Object visitEmptyFunctionBody(EmptyFunctionBody node) {
+  void visitEmptyFunctionBody(EmptyFunctionBody node) {
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitEmptyStatement(EmptyStatement node) {
+  void visitEmptyStatement(EmptyStatement node) {
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitNode(node.name);
-    return null;
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("enum ");
     _visitNode(node.name);
     _writer.print(" {");
     _visitNodeListWithSeparator(node.constants, ", ");
     _writer.print("}");
-    return null;
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("export ");
     _visitNode(node.uri);
     _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     Token keyword = node.keyword;
     if (keyword != null) {
       _writer.print(keyword.lexeme);
@@ -7437,34 +7448,30 @@
     if (node.semicolon != null) {
       _writer.print(';');
     }
-    return null;
   }
 
   @override
-  Object visitExpressionStatement(ExpressionStatement node) {
+  void visitExpressionStatement(ExpressionStatement node) {
     _visitNode(node.expression);
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitExtendsClause(ExtendsClause node) {
+  void visitExtendsClause(ExtendsClause node) {
     _writer.print("extends ");
     _visitNode(node.superclass);
-    return null;
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitTokenWithSuffix(node.staticKeyword, " ");
     _visitNode(node.fields);
     _writer.print(";");
-    return null;
   }
 
   @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
+  void visitFieldFormalParameter(FieldFormalParameter node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     _visitTokenWithSuffix(node.covariantKeyword, ' ');
     _visitTokenWithSuffix(node.keyword, " ");
@@ -7473,11 +7480,10 @@
     _visitNode(node.identifier);
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
-    return null;
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
+  void visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (node.awaitKeyword != null) {
       _writer.print("await ");
@@ -7492,11 +7498,10 @@
     _visitNode(node.iterable);
     _writer.print(") ");
     _visitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitFormalParameterList(FormalParameterList node) {
+  void visitFormalParameterList(FormalParameterList node) {
     String groupEnd = null;
     _writer.print('(');
     NodeList<FormalParameter> parameters = node.parameters;
@@ -7521,11 +7526,10 @@
       _writer.print(groupEnd);
     }
     _writer.print(')');
-    return null;
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     Expression initialization = node.initialization;
     _writer.print("for (");
     if (initialization != null) {
@@ -7539,47 +7543,42 @@
     _visitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
     _writer.print(") ");
     _visitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitTokenWithSuffix(node.externalKeyword, " ");
     _visitNodeWithSuffix(node.returnType, " ");
     _visitTokenWithSuffix(node.propertyKeyword, " ");
     _visitNode(node.name);
     _visitNode(node.functionExpression);
-    return null;
   }
 
   @override
-  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+  void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     _visitNode(node.functionDeclaration);
-    return null;
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
     if (node.body is! EmptyFunctionBody) {
       _writer.print(' ');
     }
     _visitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     _visitNode(node.function);
     _visitNode(node.typeArguments);
     _visitNode(node.argumentList);
-    return null;
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("typedef ");
     _visitNodeWithSuffix(node.returnType, " ");
@@ -7587,66 +7586,62 @@
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
     _writer.print(";");
-    return null;
   }
 
   @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     _visitTokenWithSuffix(node.covariantKeyword, ' ');
     _visitNodeWithSuffix(node.returnType, " ");
     _visitNode(node.identifier);
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
-    return null;
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) {
+  void visitGenericFunctionType(GenericFunctionType node) {
     _visitNode(node.returnType);
     _writer.print(' Function');
     _visitNode(node.typeParameters);
     _visitNode(node.parameters);
-    return null;
+    if (node.question != null) {
+      _writer.print('?');
+    }
   }
 
   @override
-  Object visitGenericTypeAlias(GenericTypeAlias node) {
+  void visitGenericTypeAlias(GenericTypeAlias node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("typedef ");
     _visitNode(node.name);
     _visitNode(node.typeParameters);
     _writer.print(" = ");
     _visitNode(node.functionType);
-    return null;
   }
 
   @override
-  Object visitHideCombinator(HideCombinator node) {
+  void visitHideCombinator(HideCombinator node) {
     _writer.print("hide ");
     _visitNodeListWithSeparator(node.hiddenNames, ", ");
-    return null;
   }
 
   @override
-  Object visitIfStatement(IfStatement node) {
+  void visitIfStatement(IfStatement node) {
     _writer.print("if (");
     _visitNode(node.condition);
     _writer.print(") ");
     _visitNode(node.thenStatement);
     _visitNodeWithPrefix(" else ", node.elseStatement);
-    return null;
   }
 
   @override
-  Object visitImplementsClause(ImplementsClause node) {
+  void visitImplementsClause(ImplementsClause node) {
     _writer.print("implements ");
     _visitNodeListWithSeparator(node.interfaces, ", ");
-    return null;
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("import ");
     _visitNode(node.uri);
@@ -7656,11 +7651,10 @@
     _visitNodeWithPrefix(" as ", node.prefix);
     _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     if (node.isCascaded) {
       _writer.print("..");
     } else {
@@ -7669,25 +7663,22 @@
     _writer.print('[');
     _visitNode(node.index);
     _writer.print(']');
-    return null;
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     _visitTokenWithSuffix(node.keyword, " ");
     _visitNode(node.constructorName);
     _visitNode(node.argumentList);
-    return null;
   }
 
   @override
-  Object visitIntegerLiteral(IntegerLiteral node) {
+  void visitIntegerLiteral(IntegerLiteral node) {
     _writer.print(node.literal.lexeme);
-    return null;
   }
 
   @override
-  Object visitInterpolationExpression(InterpolationExpression node) {
+  void visitInterpolationExpression(InterpolationExpression node) {
     if (node.rightBracket != null) {
       _writer.print("\${");
       _visitNode(node.expression);
@@ -7696,17 +7687,15 @@
       _writer.print("\$");
       _visitNode(node.expression);
     }
-    return null;
   }
 
   @override
-  Object visitInterpolationString(InterpolationString node) {
+  void visitInterpolationString(InterpolationString node) {
     _writer.print(node.contents.lexeme);
-    return null;
   }
 
   @override
-  Object visitIsExpression(IsExpression node) {
+  void visitIsExpression(IsExpression node) {
     _visitNode(node.expression);
     if (node.notOperator == null) {
       _writer.print(" is ");
@@ -7714,40 +7703,35 @@
       _writer.print(" is! ");
     }
     _visitNode(node.type);
-    return null;
   }
 
   @override
-  Object visitLabel(Label node) {
+  void visitLabel(Label node) {
     _visitNode(node.label);
     _writer.print(":");
-    return null;
   }
 
   @override
-  Object visitLabeledStatement(LabeledStatement node) {
+  void visitLabeledStatement(LabeledStatement node) {
     _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
     _visitNode(node.statement);
-    return null;
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("library ");
     _visitNode(node.name);
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitLibraryIdentifier(LibraryIdentifier node) {
+  void visitLibraryIdentifier(LibraryIdentifier node) {
     _writer.print(node.name);
-    return null;
   }
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
@@ -7756,11 +7740,10 @@
     _writer.print("[");
     _visitNodeListWithSeparator(node.elements, ", ");
     _writer.print("]");
-    return null;
   }
 
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     if (node.constKeyword != null) {
       _writer.print(node.constKeyword.lexeme);
       _writer.print(' ');
@@ -7769,19 +7752,17 @@
     _writer.print("{");
     _visitNodeListWithSeparator(node.entries, ", ");
     _writer.print("}");
-    return null;
   }
 
   @override
-  Object visitMapLiteralEntry(MapLiteralEntry node) {
+  void visitMapLiteralEntry(MapLiteralEntry node) {
     _visitNode(node.key);
     _writer.print(" : ");
     _visitNode(node.value);
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitTokenWithSuffix(node.externalKeyword, " ");
     _visitTokenWithSuffix(node.modifierKeyword, " ");
@@ -7794,11 +7775,10 @@
       _visitNode(node.parameters);
     }
     _visitFunctionWithPrefix(" ", node.body);
-    return null;
   }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
+  void visitMethodInvocation(MethodInvocation node) {
     if (node.isCascaded) {
       _writer.print("..");
     } else {
@@ -7810,11 +7790,10 @@
     _visitNode(node.methodName);
     _visitNode(node.typeArguments);
     _visitNode(node.argumentList);
-    return null;
   }
 
   @override
-  bool visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("mixin ");
     _visitNode(node.name);
@@ -7824,94 +7803,82 @@
     _writer.print(" {");
     _visitNodeListWithSeparator(node.members, " ");
     _writer.print("}");
-    return null;
   }
 
   @override
-  Object visitNamedExpression(NamedExpression node) {
+  void visitNamedExpression(NamedExpression node) {
     _visitNode(node.name);
     _visitNodeWithPrefix(" ", node.expression);
-    return null;
   }
 
   @override
-  Object visitNativeClause(NativeClause node) {
+  void visitNativeClause(NativeClause node) {
     _writer.print("native ");
     _visitNode(node.name);
-    return null;
   }
 
   @override
-  Object visitNativeFunctionBody(NativeFunctionBody node) {
+  void visitNativeFunctionBody(NativeFunctionBody node) {
     _writer.print("native ");
     _visitNode(node.stringLiteral);
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitNullLiteral(NullLiteral node) {
+  void visitNullLiteral(NullLiteral node) {
     _writer.print("null");
-    return null;
   }
 
   @override
-  bool visitOnClause(OnClause node) {
+  void visitOnClause(OnClause node) {
     _writer.print('on ');
     _visitNodeListWithSeparator(node.superclassConstraints, ", ");
-    return null;
   }
 
   @override
-  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+  void visitParenthesizedExpression(ParenthesizedExpression node) {
     _writer.print('(');
     _visitNode(node.expression);
     _writer.print(')');
-    return null;
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("part ");
     _visitNode(node.uri);
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitPartOfDirective(PartOfDirective node) {
+  void visitPartOfDirective(PartOfDirective node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _writer.print("part of ");
     _visitNode(node.libraryName);
     _writer.print(';');
-    return null;
   }
 
   @override
-  Object visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(PostfixExpression node) {
     _visitNode(node.operand);
     _writer.print(node.operator.lexeme);
-    return null;
   }
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     _visitNode(node.prefix);
     _writer.print('.');
     _visitNode(node.identifier);
-    return null;
   }
 
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
+  void visitPrefixExpression(PrefixExpression node) {
     _writer.print(node.operator.lexeme);
     _visitNode(node.operand);
-    return null;
   }
 
   @override
-  Object visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(PropertyAccess node) {
     if (node.isCascaded) {
       _writer.print("..");
     } else {
@@ -7919,26 +7886,23 @@
       _writer.print(node.operator.lexeme);
     }
     _visitNode(node.propertyName);
-    return null;
   }
 
   @override
-  Object visitRedirectingConstructorInvocation(
+  void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     _writer.print("this");
     _visitNodeWithPrefix(".", node.constructorName);
     _visitNode(node.argumentList);
-    return null;
   }
 
   @override
-  Object visitRethrowExpression(RethrowExpression node) {
+  void visitRethrowExpression(RethrowExpression node) {
     _writer.print("rethrow");
-    return null;
   }
 
   @override
-  Object visitReturnStatement(ReturnStatement node) {
+  void visitReturnStatement(ReturnStatement node) {
     Expression expression = node.expression;
     if (expression == null) {
       _writer.print("return;");
@@ -7947,24 +7911,33 @@
       expression.accept(this);
       _writer.print(";");
     }
-    return null;
   }
 
   @override
-  Object visitScriptTag(ScriptTag node) {
+  void visitScriptTag(ScriptTag node) {
     _writer.print(node.scriptTag.lexeme);
-    return null;
   }
 
   @override
-  Object visitShowCombinator(ShowCombinator node) {
+  void visitSetLiteral(SetLiteral node) {
+    if (node.constKeyword != null) {
+      _writer.print(node.constKeyword.lexeme);
+      _writer.print(' ');
+    }
+    _visitNodeWithSuffix(node.typeArguments, " ");
+    _writer.print("{");
+    _visitNodeListWithSeparator(node.elements, ", ");
+    _writer.print("}");
+  }
+
+  @override
+  void visitShowCombinator(ShowCombinator node) {
     _writer.print("show ");
     _visitNodeListWithSeparator(node.shownNames, ", ");
-    return null;
   }
 
   @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     _visitTokenWithSuffix(node.covariantKeyword, ' ');
     _visitTokenWithSuffix(node.keyword, " ");
@@ -7973,71 +7946,62 @@
       _writer.print(' ');
     }
     _visitNode(node.identifier);
-    return null;
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     _writer.print(node.token.lexeme);
-    return null;
   }
 
   @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+  void visitSimpleStringLiteral(SimpleStringLiteral node) {
     _writer.print(node.literal.lexeme);
-    return null;
   }
 
   @override
-  Object visitStringInterpolation(StringInterpolation node) {
+  void visitStringInterpolation(StringInterpolation node) {
     _visitNodeList(node.elements);
-    return null;
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _writer.print("super");
     _visitNodeWithPrefix(".", node.constructorName);
     _visitNode(node.argumentList);
-    return null;
   }
 
   @override
-  Object visitSuperExpression(SuperExpression node) {
+  void visitSuperExpression(SuperExpression node) {
     _writer.print("super");
-    return null;
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
     _writer.print("case ");
     _visitNode(node.expression);
     _writer.print(": ");
     _visitNodeListWithSeparator(node.statements, " ");
-    return null;
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
     _writer.print("default: ");
     _visitNodeListWithSeparator(node.statements, " ");
-    return null;
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSwitchStatement(SwitchStatement node) {
     _writer.print("switch (");
     _visitNode(node.expression);
     _writer.print(") {");
     _visitNodeListWithSeparator(node.members, " ");
     _writer.print("}");
-    return null;
   }
 
   @override
-  Object visitSymbolLiteral(SymbolLiteral node) {
+  void visitSymbolLiteral(SymbolLiteral node) {
     _writer.print("#");
     List<Token> components = node.components;
     for (int i = 0; i < components.length; i++) {
@@ -8046,110 +8010,99 @@
       }
       _writer.print(components[i].lexeme);
     }
-    return null;
   }
 
   @override
-  Object visitThisExpression(ThisExpression node) {
+  void visitThisExpression(ThisExpression node) {
     _writer.print("this");
-    return null;
   }
 
   @override
-  Object visitThrowExpression(ThrowExpression node) {
+  void visitThrowExpression(ThrowExpression node) {
     _writer.print("throw ");
     _visitNode(node.expression);
-    return null;
   }
 
   @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _visitNodeWithSuffix(node.variables, ";");
-    return null;
   }
 
   @override
-  Object visitTryStatement(TryStatement node) {
+  void visitTryStatement(TryStatement node) {
     _writer.print("try ");
     _visitNode(node.body);
     _visitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
     _visitNodeWithPrefix(" finally ", node.finallyBlock);
-    return null;
   }
 
   @override
-  Object visitTypeArgumentList(TypeArgumentList node) {
+  void visitTypeArgumentList(TypeArgumentList node) {
     _writer.print('<');
     _visitNodeListWithSeparator(node.arguments, ", ");
     _writer.print('>');
-    return null;
   }
 
   @override
-  Object visitTypeName(TypeName node) {
+  void visitTypeName(TypeName node) {
     _visitNode(node.name);
     _visitNode(node.typeArguments);
-    return null;
+    if (node.question != null) {
+      _writer.print('?');
+    }
   }
 
   @override
-  Object visitTypeParameter(TypeParameter node) {
+  void visitTypeParameter(TypeParameter node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitNode(node.name);
     _visitNodeWithPrefix(" extends ", node.bound);
-    return null;
   }
 
   @override
-  Object visitTypeParameterList(TypeParameterList node) {
+  void visitTypeParameterList(TypeParameterList node) {
     _writer.print('<');
     _visitNodeListWithSeparator(node.typeParameters, ", ");
     _writer.print('>');
-    return null;
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitNode(node.name);
     _visitNodeWithPrefix(" = ", node.initializer);
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     _visitTokenWithSuffix(node.keyword, " ");
     _visitNodeWithSuffix(node.type, " ");
     _visitNodeListWithSeparator(node.variables, ", ");
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+  void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     _visitNode(node.variables);
     _writer.print(";");
-    return null;
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     _writer.print("while (");
     _visitNode(node.condition);
     _writer.print(") ");
     _visitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitWithClause(WithClause node) {
+  void visitWithClause(WithClause node) {
     _writer.print("with ");
     _visitNodeListWithSeparator(node.mixinTypes, ", ");
-    return null;
   }
 
   @override
-  Object visitYieldStatement(YieldStatement node) {
+  void visitYieldStatement(YieldStatement node) {
     if (node.star != null) {
       _writer.print("yield* ");
     } else {
@@ -8157,7 +8110,6 @@
     }
     _visitNode(node.expression);
     _writer.print(";");
-    return null;
   }
 
   /**
@@ -8280,7 +8232,7 @@
  * A visitor used to write a source representation of a visited AST node (and
  * all of it's children) to a sink.
  */
-class ToSourceVisitor2 implements AstVisitor<Object> {
+class ToSourceVisitor2 implements AstVisitor<void> {
   /**
    * The sink to which the source is to be written.
    */
@@ -8419,38 +8371,34 @@
   }
 
   @override
-  Object visitAdjacentStrings(AdjacentStrings node) {
+  void visitAdjacentStrings(AdjacentStrings node) {
     safelyVisitNodeListWithSeparator(node.strings, " ");
-    return null;
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     sink.write('@');
     safelyVisitNode(node.name);
     safelyVisitNodeWithPrefix(".", node.constructorName);
     safelyVisitNode(node.arguments);
-    return null;
   }
 
   @override
-  Object visitArgumentList(ArgumentList node) {
+  void visitArgumentList(ArgumentList node) {
     sink.write('(');
     safelyVisitNodeListWithSeparator(node.arguments, ", ");
     sink.write(')');
-    return null;
   }
 
   @override
-  Object visitAsExpression(AsExpression node) {
+  void visitAsExpression(AsExpression node) {
     safelyVisitNode(node.expression);
     sink.write(" as ");
     safelyVisitNode(node.type);
-    return null;
   }
 
   @override
-  bool visitAssertInitializer(AssertInitializer node) {
+  void visitAssertInitializer(AssertInitializer node) {
     sink.write("assert (");
     safelyVisitNode(node.condition);
     if (node.message != null) {
@@ -8458,11 +8406,10 @@
       safelyVisitNode(node.message);
     }
     sink.write(");");
-    return null;
   }
 
   @override
-  Object visitAssertStatement(AssertStatement node) {
+  void visitAssertStatement(AssertStatement node) {
     sink.write("assert (");
     safelyVisitNode(node.condition);
     if (node.message != null) {
@@ -8470,46 +8417,41 @@
       safelyVisitNode(node.message);
     }
     sink.write(");");
-    return null;
   }
 
   @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
+  void visitAssignmentExpression(AssignmentExpression node) {
     safelyVisitNode(node.leftHandSide);
     sink.write(' ');
     sink.write(node.operator.lexeme);
     sink.write(' ');
     safelyVisitNode(node.rightHandSide);
-    return null;
   }
 
   @override
-  Object visitAwaitExpression(AwaitExpression node) {
+  void visitAwaitExpression(AwaitExpression node) {
     sink.write("await ");
     safelyVisitNode(node.expression);
-    return null;
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     _writeOperand(node, node.leftOperand);
     sink.write(' ');
     sink.write(node.operator.lexeme);
     sink.write(' ');
     _writeOperand(node, node.rightOperand);
-    return null;
   }
 
   @override
-  Object visitBlock(Block node) {
+  void visitBlock(Block node) {
     sink.write('{');
     safelyVisitNodeListWithSeparator(node.statements, " ");
     sink.write('}');
-    return null;
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     Token keyword = node.keyword;
     if (keyword != null) {
       sink.write(keyword.lexeme);
@@ -8519,32 +8461,28 @@
       sink.write(' ');
     }
     safelyVisitNode(node.block);
-    return null;
   }
 
   @override
-  Object visitBooleanLiteral(BooleanLiteral node) {
+  void visitBooleanLiteral(BooleanLiteral node) {
     sink.write(node.literal.lexeme);
-    return null;
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     sink.write("break");
     safelyVisitNodeWithPrefix(" ", node.label);
     sink.write(";");
-    return null;
   }
 
   @override
-  Object visitCascadeExpression(CascadeExpression node) {
+  void visitCascadeExpression(CascadeExpression node) {
     safelyVisitNode(node.target);
     safelyVisitNodeList(node.cascadeSections);
-    return null;
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     safelyVisitNodeWithPrefix("on ", node.exceptionType);
     if (node.catchKeyword != null) {
       if (node.exceptionType != null) {
@@ -8558,11 +8496,10 @@
       sink.write(" ");
     }
     safelyVisitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitTokenWithSuffix(node.abstractKeyword, " ");
     sink.write("class ");
@@ -8574,11 +8511,10 @@
     sink.write(" {");
     safelyVisitNodeListWithSeparator(node.members, " ");
     sink.write("}");
-    return null;
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     if (node.abstractKeyword != null) {
       sink.write("abstract ");
@@ -8591,17 +8527,16 @@
     safelyVisitNodeWithPrefix(" ", node.withClause);
     safelyVisitNodeWithPrefix(" ", node.implementsClause);
     sink.write(";");
-    return null;
   }
 
   @override
-  Object visitComment(Comment node) => null;
+  void visitComment(Comment node) {}
 
   @override
-  Object visitCommentReference(CommentReference node) => null;
+  void visitCommentReference(CommentReference node) {}
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     ScriptTag scriptTag = node.scriptTag;
     NodeList<Directive> directives = node.directives;
     safelyVisitNode(scriptTag);
@@ -8609,31 +8544,28 @@
     safelyVisitNodeListWithSeparatorAndPrefix(prefix, directives, " ");
     prefix = scriptTag == null && directives.isEmpty ? "" : " ";
     safelyVisitNodeListWithSeparatorAndPrefix(prefix, node.declarations, " ");
-    return null;
   }
 
   @override
-  Object visitConditionalExpression(ConditionalExpression node) {
+  void visitConditionalExpression(ConditionalExpression node) {
     safelyVisitNode(node.condition);
     sink.write(" ? ");
     safelyVisitNode(node.thenExpression);
     sink.write(" : ");
     safelyVisitNode(node.elseExpression);
-    return null;
   }
 
   @override
-  Object visitConfiguration(Configuration node) {
+  void visitConfiguration(Configuration node) {
     sink.write('if (');
     safelyVisitNode(node.name);
     safelyVisitNodeWithPrefix(" == ", node.value);
     sink.write(') ');
     safelyVisitNode(node.uri);
-    return null;
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitTokenWithSuffix(node.externalKeyword, " ");
     safelyVisitTokenWithSuffix(node.constKeyword, " ");
@@ -8644,44 +8576,39 @@
     safelyVisitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
     safelyVisitNodeWithPrefix(" = ", node.redirectedConstructor);
     safelyVisitFunctionWithPrefix(" ", node.body);
-    return null;
   }
 
   @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     safelyVisitTokenWithSuffix(node.thisKeyword, ".");
     safelyVisitNode(node.fieldName);
     sink.write(" = ");
     safelyVisitNode(node.expression);
-    return null;
   }
 
   @override
-  Object visitConstructorName(ConstructorName node) {
+  void visitConstructorName(ConstructorName node) {
     safelyVisitNode(node.type);
     safelyVisitNodeWithPrefix(".", node.name);
-    return null;
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     sink.write("continue");
     safelyVisitNodeWithPrefix(" ", node.label);
     sink.write(";");
-    return null;
   }
 
   @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitTokenWithSuffix(node.keyword, " ");
     safelyVisitNodeWithSuffix(node.type, " ");
     safelyVisitNode(node.identifier);
-    return null;
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     safelyVisitNode(node.parameter);
     if (node.separator != null) {
       if (node.separator.lexeme != ":") {
@@ -8690,73 +8617,64 @@
       sink.write(node.separator.lexeme);
       safelyVisitNodeWithPrefix(" ", node.defaultValue);
     }
-    return null;
   }
 
   @override
-  Object visitDoStatement(DoStatement node) {
+  void visitDoStatement(DoStatement node) {
     sink.write("do ");
     safelyVisitNode(node.body);
     sink.write(" while (");
     safelyVisitNode(node.condition);
     sink.write(");");
-    return null;
   }
 
   @override
-  Object visitDottedName(DottedName node) {
+  void visitDottedName(DottedName node) {
     safelyVisitNodeListWithSeparator(node.components, ".");
-    return null;
   }
 
   @override
-  Object visitDoubleLiteral(DoubleLiteral node) {
+  void visitDoubleLiteral(DoubleLiteral node) {
     sink.write(node.literal.lexeme);
-    return null;
   }
 
   @override
-  Object visitEmptyFunctionBody(EmptyFunctionBody node) {
+  void visitEmptyFunctionBody(EmptyFunctionBody node) {
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitEmptyStatement(EmptyStatement node) {
+  void visitEmptyStatement(EmptyStatement node) {
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitNode(node.name);
-    return null;
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("enum ");
     safelyVisitNode(node.name);
     sink.write(" {");
     safelyVisitNodeListWithSeparator(node.constants, ", ");
     sink.write("}");
-    return null;
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("export ");
     safelyVisitNode(node.uri);
     safelyVisitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     Token keyword = node.keyword;
     if (keyword != null) {
       sink.write(keyword.lexeme);
@@ -8767,34 +8685,30 @@
     if (node.semicolon != null) {
       sink.write(';');
     }
-    return null;
   }
 
   @override
-  Object visitExpressionStatement(ExpressionStatement node) {
+  void visitExpressionStatement(ExpressionStatement node) {
     safelyVisitNode(node.expression);
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitExtendsClause(ExtendsClause node) {
+  void visitExtendsClause(ExtendsClause node) {
     sink.write("extends ");
     safelyVisitNode(node.superclass);
-    return null;
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitTokenWithSuffix(node.staticKeyword, " ");
     safelyVisitNode(node.fields);
     sink.write(";");
-    return null;
   }
 
   @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
+  void visitFieldFormalParameter(FieldFormalParameter node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     safelyVisitTokenWithSuffix(node.covariantKeyword, ' ');
     safelyVisitTokenWithSuffix(node.keyword, " ");
@@ -8803,11 +8717,10 @@
     safelyVisitNode(node.identifier);
     safelyVisitNode(node.typeParameters);
     safelyVisitNode(node.parameters);
-    return null;
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
+  void visitForEachStatement(ForEachStatement node) {
     DeclaredIdentifier loopVariable = node.loopVariable;
     if (node.awaitKeyword != null) {
       sink.write("await ");
@@ -8822,11 +8735,10 @@
     safelyVisitNode(node.iterable);
     sink.write(") ");
     safelyVisitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitFormalParameterList(FormalParameterList node) {
+  void visitFormalParameterList(FormalParameterList node) {
     String groupEnd = null;
     sink.write('(');
     NodeList<FormalParameter> parameters = node.parameters;
@@ -8851,11 +8763,10 @@
       sink.write(groupEnd);
     }
     sink.write(')');
-    return null;
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     Expression initialization = node.initialization;
     sink.write("for (");
     if (initialization != null) {
@@ -8869,47 +8780,42 @@
     safelyVisitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
     sink.write(") ");
     safelyVisitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitTokenWithSuffix(node.externalKeyword, " ");
     safelyVisitNodeWithSuffix(node.returnType, " ");
     safelyVisitTokenWithSuffix(node.propertyKeyword, " ");
     safelyVisitNode(node.name);
     safelyVisitNode(node.functionExpression);
-    return null;
   }
 
   @override
-  Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+  void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
     safelyVisitNode(node.functionDeclaration);
-    return null;
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     safelyVisitNode(node.typeParameters);
     safelyVisitNode(node.parameters);
     if (node.body is! EmptyFunctionBody) {
       sink.write(' ');
     }
     safelyVisitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     safelyVisitNode(node.function);
     safelyVisitNode(node.typeArguments);
     safelyVisitNode(node.argumentList);
-    return null;
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("typedef ");
     safelyVisitNodeWithSuffix(node.returnType, " ");
@@ -8917,66 +8823,62 @@
     safelyVisitNode(node.typeParameters);
     safelyVisitNode(node.parameters);
     sink.write(";");
-    return null;
   }
 
   @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     safelyVisitTokenWithSuffix(node.covariantKeyword, ' ');
     safelyVisitNodeWithSuffix(node.returnType, " ");
     safelyVisitNode(node.identifier);
     safelyVisitNode(node.typeParameters);
     safelyVisitNode(node.parameters);
-    return null;
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) {
+  void visitGenericFunctionType(GenericFunctionType node) {
     safelyVisitNode(node.returnType);
     sink.write(' Function');
     safelyVisitNode(node.typeParameters);
     safelyVisitNode(node.parameters);
-    return null;
+    if (node.question != null) {
+      sink.write('?');
+    }
   }
 
   @override
-  Object visitGenericTypeAlias(GenericTypeAlias node) {
+  void visitGenericTypeAlias(GenericTypeAlias node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("typedef ");
     safelyVisitNode(node.name);
     safelyVisitNode(node.typeParameters);
     sink.write(" = ");
     safelyVisitNode(node.functionType);
-    return null;
   }
 
   @override
-  Object visitHideCombinator(HideCombinator node) {
+  void visitHideCombinator(HideCombinator node) {
     sink.write("hide ");
     safelyVisitNodeListWithSeparator(node.hiddenNames, ", ");
-    return null;
   }
 
   @override
-  Object visitIfStatement(IfStatement node) {
+  void visitIfStatement(IfStatement node) {
     sink.write("if (");
     safelyVisitNode(node.condition);
     sink.write(") ");
     safelyVisitNode(node.thenStatement);
     safelyVisitNodeWithPrefix(" else ", node.elseStatement);
-    return null;
   }
 
   @override
-  Object visitImplementsClause(ImplementsClause node) {
+  void visitImplementsClause(ImplementsClause node) {
     sink.write("implements ");
     safelyVisitNodeListWithSeparator(node.interfaces, ", ");
-    return null;
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("import ");
     safelyVisitNode(node.uri);
@@ -8986,11 +8888,10 @@
     safelyVisitNodeWithPrefix(" as ", node.prefix);
     safelyVisitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     if (node.isCascaded) {
       sink.write("..");
     } else {
@@ -8999,25 +8900,22 @@
     sink.write('[');
     safelyVisitNode(node.index);
     sink.write(']');
-    return null;
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     safelyVisitTokenWithSuffix(node.keyword, " ");
     safelyVisitNode(node.constructorName);
     safelyVisitNode(node.argumentList);
-    return null;
   }
 
   @override
-  Object visitIntegerLiteral(IntegerLiteral node) {
+  void visitIntegerLiteral(IntegerLiteral node) {
     sink.write(node.literal.lexeme);
-    return null;
   }
 
   @override
-  Object visitInterpolationExpression(InterpolationExpression node) {
+  void visitInterpolationExpression(InterpolationExpression node) {
     if (node.rightBracket != null) {
       sink.write("\${");
       safelyVisitNode(node.expression);
@@ -9026,17 +8924,15 @@
       sink.write("\$");
       safelyVisitNode(node.expression);
     }
-    return null;
   }
 
   @override
-  Object visitInterpolationString(InterpolationString node) {
+  void visitInterpolationString(InterpolationString node) {
     sink.write(node.contents.lexeme);
-    return null;
   }
 
   @override
-  Object visitIsExpression(IsExpression node) {
+  void visitIsExpression(IsExpression node) {
     safelyVisitNode(node.expression);
     if (node.notOperator == null) {
       sink.write(" is ");
@@ -9044,40 +8940,35 @@
       sink.write(" is! ");
     }
     safelyVisitNode(node.type);
-    return null;
   }
 
   @override
-  Object visitLabel(Label node) {
+  void visitLabel(Label node) {
     safelyVisitNode(node.label);
     sink.write(":");
-    return null;
   }
 
   @override
-  Object visitLabeledStatement(LabeledStatement node) {
+  void visitLabeledStatement(LabeledStatement node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
     safelyVisitNode(node.statement);
-    return null;
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("library ");
     safelyVisitNode(node.name);
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitLibraryIdentifier(LibraryIdentifier node) {
+  void visitLibraryIdentifier(LibraryIdentifier node) {
     sink.write(node.name);
-    return null;
   }
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     if (node.constKeyword != null) {
       sink.write(node.constKeyword.lexeme);
       sink.write(' ');
@@ -9086,11 +8977,10 @@
     sink.write("[");
     safelyVisitNodeListWithSeparator(node.elements, ", ");
     sink.write("]");
-    return null;
   }
 
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     if (node.constKeyword != null) {
       sink.write(node.constKeyword.lexeme);
       sink.write(' ');
@@ -9099,19 +8989,17 @@
     sink.write("{");
     safelyVisitNodeListWithSeparator(node.entries, ", ");
     sink.write("}");
-    return null;
   }
 
   @override
-  Object visitMapLiteralEntry(MapLiteralEntry node) {
+  void visitMapLiteralEntry(MapLiteralEntry node) {
     safelyVisitNode(node.key);
     sink.write(" : ");
     safelyVisitNode(node.value);
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitTokenWithSuffix(node.externalKeyword, " ");
     safelyVisitTokenWithSuffix(node.modifierKeyword, " ");
@@ -9124,11 +9012,10 @@
       safelyVisitNode(node.parameters);
     }
     safelyVisitFunctionWithPrefix(" ", node.body);
-    return null;
   }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
+  void visitMethodInvocation(MethodInvocation node) {
     if (node.isCascaded) {
       sink.write("..");
     } else {
@@ -9140,11 +9027,10 @@
     safelyVisitNode(node.methodName);
     safelyVisitNode(node.typeArguments);
     safelyVisitNode(node.argumentList);
-    return null;
   }
 
   @override
-  bool visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("mixin ");
     safelyVisitNode(node.name);
@@ -9154,94 +9040,82 @@
     sink.write(" {");
     safelyVisitNodeListWithSeparator(node.members, " ");
     sink.write("}");
-    return null;
   }
 
   @override
-  Object visitNamedExpression(NamedExpression node) {
+  void visitNamedExpression(NamedExpression node) {
     safelyVisitNode(node.name);
     safelyVisitNodeWithPrefix(" ", node.expression);
-    return null;
   }
 
   @override
-  Object visitNativeClause(NativeClause node) {
+  void visitNativeClause(NativeClause node) {
     sink.write("native ");
     safelyVisitNode(node.name);
-    return null;
   }
 
   @override
-  Object visitNativeFunctionBody(NativeFunctionBody node) {
+  void visitNativeFunctionBody(NativeFunctionBody node) {
     sink.write("native ");
     safelyVisitNode(node.stringLiteral);
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitNullLiteral(NullLiteral node) {
+  void visitNullLiteral(NullLiteral node) {
     sink.write("null");
-    return null;
   }
 
   @override
-  bool visitOnClause(OnClause node) {
+  void visitOnClause(OnClause node) {
     sink.write('on ');
     safelyVisitNodeListWithSeparator(node.superclassConstraints, ", ");
-    return null;
   }
 
   @override
-  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+  void visitParenthesizedExpression(ParenthesizedExpression node) {
     sink.write('(');
     safelyVisitNode(node.expression);
     sink.write(')');
-    return null;
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("part ");
     safelyVisitNode(node.uri);
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitPartOfDirective(PartOfDirective node) {
+  void visitPartOfDirective(PartOfDirective node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     sink.write("part of ");
     safelyVisitNode(node.libraryName);
     sink.write(';');
-    return null;
   }
 
   @override
-  Object visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(PostfixExpression node) {
     _writeOperand(node, node.operand);
     sink.write(node.operator.lexeme);
-    return null;
   }
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     safelyVisitNode(node.prefix);
     sink.write('.');
     safelyVisitNode(node.identifier);
-    return null;
   }
 
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
+  void visitPrefixExpression(PrefixExpression node) {
     sink.write(node.operator.lexeme);
     _writeOperand(node, node.operand);
-    return null;
   }
 
   @override
-  Object visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(PropertyAccess node) {
     if (node.isCascaded) {
       sink.write("..");
     } else {
@@ -9249,26 +9123,23 @@
       sink.write(node.operator.lexeme);
     }
     safelyVisitNode(node.propertyName);
-    return null;
   }
 
   @override
-  Object visitRedirectingConstructorInvocation(
+  void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     sink.write("this");
     safelyVisitNodeWithPrefix(".", node.constructorName);
     safelyVisitNode(node.argumentList);
-    return null;
   }
 
   @override
-  Object visitRethrowExpression(RethrowExpression node) {
+  void visitRethrowExpression(RethrowExpression node) {
     sink.write("rethrow");
-    return null;
   }
 
   @override
-  Object visitReturnStatement(ReturnStatement node) {
+  void visitReturnStatement(ReturnStatement node) {
     Expression expression = node.expression;
     if (expression == null) {
       sink.write("return;");
@@ -9277,24 +9148,33 @@
       expression.accept(this);
       sink.write(";");
     }
-    return null;
   }
 
   @override
-  Object visitScriptTag(ScriptTag node) {
+  void visitScriptTag(ScriptTag node) {
     sink.write(node.scriptTag.lexeme);
-    return null;
   }
 
   @override
-  Object visitShowCombinator(ShowCombinator node) {
+  void visitSetLiteral(SetLiteral node) {
+    if (node.constKeyword != null) {
+      sink.write(node.constKeyword.lexeme);
+      sink.write(' ');
+    }
+    safelyVisitNodeWithSuffix(node.typeArguments, " ");
+    sink.write("{");
+    safelyVisitNodeListWithSeparator(node.elements, ", ");
+    sink.write("}");
+  }
+
+  @override
+  void visitShowCombinator(ShowCombinator node) {
     sink.write("show ");
     safelyVisitNodeListWithSeparator(node.shownNames, ", ");
-    return null;
   }
 
   @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
     safelyVisitTokenWithSuffix(node.covariantKeyword, ' ');
     safelyVisitTokenWithSuffix(node.keyword, " ");
@@ -9303,71 +9183,62 @@
       sink.write(' ');
     }
     safelyVisitNode(node.identifier);
-    return null;
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     sink.write(node.token.lexeme);
-    return null;
   }
 
   @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+  void visitSimpleStringLiteral(SimpleStringLiteral node) {
     sink.write(node.literal.lexeme);
-    return null;
   }
 
   @override
-  Object visitStringInterpolation(StringInterpolation node) {
+  void visitStringInterpolation(StringInterpolation node) {
     safelyVisitNodeList(node.elements);
-    return null;
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     sink.write("super");
     safelyVisitNodeWithPrefix(".", node.constructorName);
     safelyVisitNode(node.argumentList);
-    return null;
   }
 
   @override
-  Object visitSuperExpression(SuperExpression node) {
+  void visitSuperExpression(SuperExpression node) {
     sink.write("super");
-    return null;
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
     sink.write("case ");
     safelyVisitNode(node.expression);
     sink.write(": ");
     safelyVisitNodeListWithSeparator(node.statements, " ");
-    return null;
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
     sink.write("default: ");
     safelyVisitNodeListWithSeparator(node.statements, " ");
-    return null;
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSwitchStatement(SwitchStatement node) {
     sink.write("switch (");
     safelyVisitNode(node.expression);
     sink.write(") {");
     safelyVisitNodeListWithSeparator(node.members, " ");
     sink.write("}");
-    return null;
   }
 
   @override
-  Object visitSymbolLiteral(SymbolLiteral node) {
+  void visitSymbolLiteral(SymbolLiteral node) {
     sink.write("#");
     List<Token> components = node.components;
     for (int i = 0; i < components.length; i++) {
@@ -9376,110 +9247,99 @@
       }
       sink.write(components[i].lexeme);
     }
-    return null;
   }
 
   @override
-  Object visitThisExpression(ThisExpression node) {
+  void visitThisExpression(ThisExpression node) {
     sink.write("this");
-    return null;
   }
 
   @override
-  Object visitThrowExpression(ThrowExpression node) {
+  void visitThrowExpression(ThrowExpression node) {
     sink.write("throw ");
     safelyVisitNode(node.expression);
-    return null;
   }
 
   @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     safelyVisitNodeWithSuffix(node.variables, ";");
-    return null;
   }
 
   @override
-  Object visitTryStatement(TryStatement node) {
+  void visitTryStatement(TryStatement node) {
     sink.write("try ");
     safelyVisitNode(node.body);
     safelyVisitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
     safelyVisitNodeWithPrefix(" finally ", node.finallyBlock);
-    return null;
   }
 
   @override
-  Object visitTypeArgumentList(TypeArgumentList node) {
+  void visitTypeArgumentList(TypeArgumentList node) {
     sink.write('<');
     safelyVisitNodeListWithSeparator(node.arguments, ", ");
     sink.write('>');
-    return null;
   }
 
   @override
-  Object visitTypeName(TypeName node) {
+  void visitTypeName(TypeName node) {
     safelyVisitNode(node.name);
     safelyVisitNode(node.typeArguments);
-    return null;
+    if (node.question != null) {
+      sink.write('?');
+    }
   }
 
   @override
-  Object visitTypeParameter(TypeParameter node) {
+  void visitTypeParameter(TypeParameter node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitNode(node.name);
     safelyVisitNodeWithPrefix(" extends ", node.bound);
-    return null;
   }
 
   @override
-  Object visitTypeParameterList(TypeParameterList node) {
+  void visitTypeParameterList(TypeParameterList node) {
     sink.write('<');
     safelyVisitNodeListWithSeparator(node.typeParameters, ", ");
     sink.write('>');
-    return null;
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitNode(node.name);
     safelyVisitNodeWithPrefix(" = ", node.initializer);
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     safelyVisitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
     safelyVisitTokenWithSuffix(node.keyword, " ");
     safelyVisitNodeWithSuffix(node.type, " ");
     safelyVisitNodeListWithSeparator(node.variables, ", ");
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+  void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     safelyVisitNode(node.variables);
     sink.write(";");
-    return null;
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     sink.write("while (");
     safelyVisitNode(node.condition);
     sink.write(") ");
     safelyVisitNode(node.body);
-    return null;
   }
 
   @override
-  Object visitWithClause(WithClause node) {
+  void visitWithClause(WithClause node) {
     sink.write("with ");
     safelyVisitNodeListWithSeparator(node.mixinTypes, ", ");
-    return null;
   }
 
   @override
-  Object visitYieldStatement(YieldStatement node) {
+  void visitYieldStatement(YieldStatement node) {
     if (node.star != null) {
       sink.write("yield* ");
     } else {
@@ -9487,7 +9347,6 @@
     }
     safelyVisitNode(node.expression);
     sink.write(";");
-    return null;
   }
 
   void _writeOperand(Expression node, Expression operand) {
diff --git a/pkg/analyzer/lib/src/dart/constant/compute.dart b/pkg/analyzer/lib/src/dart/constant/compute.dart
new file mode 100644
index 0000000..4031e2f
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/constant/compute.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/constant/evaluation.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/generated/resolver.dart'
+    show TypeProvider, TypeSystem;
+import 'package:analyzer/src/summary/link.dart' as graph
+    show DependencyWalker, Node;
+import 'package:analyzer/src/task/dart.dart';
+
+/// Compute values of the given [constants] with correct ordering.
+void computeConstants(
+    TypeProvider typeProvider,
+    TypeSystem typeSystem,
+    DeclaredVariables declaredVariables,
+    List<ConstantEvaluationTarget> constants,
+    ExperimentStatus experimentStatus) {
+  var evaluationEngine = ConstantEvaluationEngine(
+      typeProvider, declaredVariables,
+      forAnalysisDriver: true,
+      typeSystem: typeSystem,
+      experimentStatus: experimentStatus);
+
+  var nodes = <_ConstantNode>[];
+  var nodeMap = <ConstantEvaluationTarget, _ConstantNode>{};
+  for (var constant in constants) {
+    var node = _ConstantNode(evaluationEngine, nodeMap, constant);
+    nodes.add(node);
+    nodeMap[constant] = node;
+  }
+
+  for (var node in nodes) {
+    if (!node.isEvaluated) {
+      _ConstantWalker(evaluationEngine).walk(node);
+    }
+  }
+}
+
+/**
+ * [graph.Node] that is used to compute constants in dependency order.
+ */
+class _ConstantNode extends graph.Node<_ConstantNode> {
+  final ConstantEvaluationEngine evaluationEngine;
+  final Map<ConstantEvaluationTarget, _ConstantNode> nodeMap;
+  final ConstantEvaluationTarget constant;
+
+  _ConstantNode(this.evaluationEngine, this.nodeMap, this.constant);
+
+  @override
+  bool get isEvaluated => constant.isConstantEvaluated;
+
+  @override
+  List<_ConstantNode> computeDependencies() {
+    var targets = <ConstantEvaluationTarget>[];
+    evaluationEngine.computeDependencies(constant, targets.add);
+    return targets.map(_getNode).toList();
+  }
+
+  _ConstantNode _getNode(ConstantEvaluationTarget constant) {
+    return nodeMap.putIfAbsent(
+      constant,
+      () => _ConstantNode(evaluationEngine, nodeMap, constant),
+    );
+  }
+}
+
+/**
+ * [graph.DependencyWalker] for computing constants and detecting cycles.
+ */
+class _ConstantWalker extends graph.DependencyWalker<_ConstantNode> {
+  final ConstantEvaluationEngine evaluationEngine;
+
+  _ConstantWalker(this.evaluationEngine);
+
+  @override
+  void evaluate(_ConstantNode node) {
+    evaluationEngine.computeConstantValue(node.constant);
+  }
+
+  @override
+  void evaluateScc(List<_ConstantNode> scc) {
+    var constantsInCycle = scc.map((node) => node.constant);
+    for (var node in scc) {
+      var constant = node.constant;
+      if (constant is ConstructorElementImpl) {
+        constant.isCycleFree = false;
+      }
+      evaluationEngine.generateCycleError(constantsInCycle, constant);
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index d333f97..453c439 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -17,13 +17,14 @@
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 
 /// Instances of the class `ConstantVerifier` traverse an AST structure looking
 /// for additional errors and warnings not covered by the parser and resolver.
 /// In particular, it looks for errors and warnings related to constant
 /// expressions.
-class ConstantVerifier extends RecursiveAstVisitor<Object> {
+class ConstantVerifier extends RecursiveAstVisitor<void> {
   /// The error reporter by which errors will be reported.
   final ErrorReporter _errorReporter;
 
@@ -67,11 +68,15 @@
     this._stringType = _typeProvider.stringType;
     this._evaluationEngine = new ConstantEvaluationEngine(
         _typeProvider, declaredVariables,
-        forAnalysisDriver: forAnalysisDriver, typeSystem: _typeSystem);
+        forAnalysisDriver: forAnalysisDriver,
+        typeSystem: _typeSystem,
+        experimentStatus:
+            (currentLibrary.context.analysisOptions as AnalysisOptionsImpl)
+                .experimentStatus);
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     super.visitAnnotation(node);
     // check annotation creation
     Element element = node.element;
@@ -80,47 +85,38 @@
       if (!element.isConst) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node);
-        return null;
+        return;
       }
       // should have arguments
       ArgumentList argumentList = node.arguments;
       if (argumentList == null) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node);
-        return null;
+        return;
       }
       // arguments should be constants
       _validateConstantArguments(argumentList);
     }
-    if (node.elementAnnotation?.isSealed == true &&
-        !(node.parent is ClassDeclaration ||
-            node.parent is ClassTypeAlias ||
-            node.parent is MixinDeclaration)) {
-      _errorReporter.reportErrorForNode(
-          HintCode.INVALID_SEALED_ANNOTATION, node.parent, [node.element.name]);
-    }
-    return null;
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     if (node.constKeyword != null) {
       _validateConstructorInitializers(node);
       _validateFieldInitializers(node.parent as ClassDeclaration, node);
     }
     _validateDefaultValues(node.parameters);
-    return super.visitConstructorDeclaration(node);
+    super.visitConstructorDeclaration(node);
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     super.visitFunctionExpression(node);
     _validateDefaultValues(node.parameters);
-    return null;
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.isConst) {
       TypeName typeName = node.constructorName.type;
       _checkForConstWithTypeParameters(typeName);
@@ -138,14 +134,13 @@
             constantVisitor,
             _errorReporter);
       }
-      return null;
     } else {
-      return super.visitInstanceCreationExpression(node);
+      super.visitInstanceCreationExpression(node);
     }
   }
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     super.visitListLiteral(node);
     if (node.isConst) {
       DartObjectImpl result;
@@ -160,11 +155,10 @@
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     super.visitMapLiteral(node);
     bool isConst = node.isConst;
     bool reportEqualKeys = true;
@@ -187,10 +181,8 @@
         if (keyResult != null) {
           _reportErrorIfFromDeferredLibrary(key,
               CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY);
-          if (keys.contains(keyResult)) {
+          if (!keys.add(keyResult)) {
             invalidKeys.add(key);
-          } else {
-            keys.add(keyResult);
           }
           DartType type = keyResult.type;
           if (_implementsEqualsWhenNotAllowed(type)) {
@@ -210,10 +202,8 @@
         DartObjectImpl result = key
             .accept(new ConstantVisitor(_evaluationEngine, subErrorReporter));
         if (result != null) {
-          if (keys.contains(result)) {
+          if (!keys.add(result)) {
             invalidKeys.add(key);
-          } else {
-            keys.add(result);
           }
         } else {
           reportEqualKeys = false;
@@ -221,24 +211,54 @@
       }
     }
     if (reportEqualKeys) {
-      int length = invalidKeys.length;
-      for (int i = 0; i < length; i++) {
+      for (int i = 0; i < invalidKeys.length; i++) {
         _errorReporter.reportErrorForNode(
             StaticWarningCode.EQUAL_KEYS_IN_MAP, invalidKeys[i]);
       }
     }
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
     _validateDefaultValues(node.parameters);
-    return null;
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSetLiteral(SetLiteral node) {
+    super.visitSetLiteral(node);
+    HashSet<DartObject> elements = new HashSet<DartObject>();
+    List<Expression> invalidElements = new List<Expression>();
+    if (node.isConst) {
+      for (Expression element in node.elements) {
+        DartObjectImpl result =
+            _validate(element, CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT);
+        if (result != null) {
+          _reportErrorIfFromDeferredLibrary(
+              element,
+              CompileTimeErrorCode
+                  .NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY);
+          if (!elements.add(result)) {
+            invalidElements.add(element);
+          }
+          DartType type = result.type;
+          if (_implementsEqualsWhenNotAllowed(type)) {
+            _errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS,
+                element,
+                [type.displayName]);
+          }
+        }
+      }
+      for (var invalidElement in invalidElements) {
+        _errorReporter.reportErrorForNode(
+            StaticWarningCode.EQUAL_VALUES_IN_CONST_SET, invalidElement);
+      }
+    }
+  }
+
+  @override
+  void visitSwitchStatement(SwitchStatement node) {
     // TODO(paulberry): to minimize error messages, it would be nice to
     // compare all types with the most popular type rather than the first
     // type.
@@ -274,11 +294,11 @@
     if (!foundError) {
       _checkForCaseExpressionTypeImplementsEquals(node, firstType);
     }
-    return super.visitSwitchStatement(node);
+    super.visitSwitchStatement(node);
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Expression initializer = node.initializer;
     if (initializer != null && (node.isConst || node.isFinal)) {
@@ -290,7 +310,7 @@
         // values computed if the value was needed (e.g. final variables in a
         // class containing const constructors).
         assert(!node.isConst);
-        return null;
+        return;
       }
       _reportErrors(result.errors,
           CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE);
@@ -299,7 +319,6 @@
           CompileTimeErrorCode
               .CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY);
     }
-    return null;
   }
 
   /// This verifies that the passed switch statement does not have a case
@@ -409,12 +428,12 @@
           identical(dataErrorCode,
               CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) ||
           identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) ||
+          identical(
+              dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT) ||
           identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) ||
           identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM) ||
           identical(dataErrorCode,
               CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT) ||
-          identical(dataErrorCode,
-              CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) ||
           identical(
               dataErrorCode,
               CheckedModeCompileTimeErrorCode
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index c016009..545cd6c 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,6 +14,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/constant/utilities.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -24,7 +25,7 @@
     show AnalysisEngine, RecordingErrorListener;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/type_system.dart'
-    show StrongTypeSystemImpl, TypeSystem;
+    show Dart2TypeSystem, TypeSystem;
 import 'package:analyzer/src/task/dart.dart';
 
 /**
@@ -36,6 +37,7 @@
    * Parameter to "fromEnvironment" methods that denotes the default value.
    */
   static String _DEFAULT_VALUE_PARAM = "defaultValue";
+
   /**
    * Source of RegExp matching declarable operator names.
    * From sdk/lib/internal/symbol.dart.
@@ -84,6 +86,11 @@
   final DeclaredVariables _declaredVariables;
 
   /**
+   * Return the object representing the state of active experiments.
+   */
+  final ExperimentStatus experimentStatus;
+
+  /**
    * Validator used to verify correct dependency analysis when running unit
    * tests.
    */
@@ -103,12 +110,14 @@
    */
   ConstantEvaluationEngine(TypeProvider typeProvider, this._declaredVariables,
       {ConstantEvaluationValidator validator,
+      ExperimentStatus experimentStatus,
       TypeSystem typeSystem,
       this.forAnalysisDriver: false})
       : typeProvider = typeProvider,
         validator =
             validator ?? new ConstantEvaluationValidator_ForProduction(),
-        typeSystem = typeSystem ?? new StrongTypeSystemImpl(typeProvider);
+        typeSystem = typeSystem ?? new Dart2TypeSystem(typeProvider),
+        experimentStatus = experimentStatus ?? new ExperimentStatus();
 
   /**
    * Check that the arguments to a call to fromEnvironment() are correct. The
@@ -183,15 +192,20 @@
   void computeConstantValue(ConstantEvaluationTarget constant) {
     validator.beforeComputeValue(constant);
     if (constant is ParameterElementImpl) {
-      Expression defaultValue = constant.constantInitializer;
-      if (defaultValue != null) {
-        RecordingErrorListener errorListener = new RecordingErrorListener();
-        ErrorReporter errorReporter =
-            new ErrorReporter(errorListener, constant.source);
-        DartObjectImpl dartObject =
-            defaultValue.accept(new ConstantVisitor(this, errorReporter));
-        constant.evaluationResult =
-            new EvaluationResultImpl(dartObject, errorListener.errors);
+      if (constant.isOptional) {
+        Expression defaultValue = constant.constantInitializer;
+        if (defaultValue != null) {
+          RecordingErrorListener errorListener = new RecordingErrorListener();
+          ErrorReporter errorReporter =
+              new ErrorReporter(errorListener, constant.source);
+          DartObjectImpl dartObject =
+              defaultValue.accept(new ConstantVisitor(this, errorReporter));
+          constant.evaluationResult =
+              new EvaluationResultImpl(dartObject, errorListener.errors);
+        } else {
+          constant.evaluationResult =
+              EvaluationResultImpl(typeProvider.nullObject);
+        }
       }
     } else if (constant is VariableElementImpl) {
       Expression constantInitializer = constant.constantInitializer;
@@ -216,12 +230,13 @@
         constant.evaluationResult =
             new EvaluationResultImpl(dartObject, errorListener.errors);
       }
-    } else if (constant is ConstructorElement) {
+    } else if (constant is ConstructorElementImpl) {
       if (constant.isConst) {
         // No evaluation needs to be done; constructor declarations are only in
         // the dependency graph to ensure that any constants referred to in
         // initializer lists and parameter defaults are evaluated before
         // invocations of the constructor.
+        constant.isConstantEvaluated = true;
       }
     } else if (constant is ElementAnnotationImpl) {
       Annotation constNode = constant.annotationAst;
@@ -240,7 +255,7 @@
           // ignore it here.
           constant.evaluationResult = new EvaluationResultImpl(null);
         }
-      } else if (element is ConstructorElementImpl &&
+      } else if (element is ConstructorElement &&
           element.isConst &&
           constNode.arguments != null) {
         RecordingErrorListener errorListener = new RecordingErrorListener();
@@ -439,6 +454,7 @@
           CompileTimeErrorCode.CONST_WITH_NON_CONST, node);
       return null;
     }
+
     if (!getConstructorImpl(constructor).isCycleFree) {
       // It's not safe to evaluate this constructor, so bail out.
       // TODO(paulberry): ensure that a reasonable error message is produced
@@ -447,34 +463,35 @@
       // itself")
       return new DartObjectImpl.validWithUnknownValue(constructor.returnType);
     }
+
     int argumentCount = arguments.length;
-    List<DartObjectImpl> argumentValues =
-        new List<DartObjectImpl>(argumentCount);
-    List<DartObjectImpl> positionalArguments = <DartObjectImpl>[];
-    List<Expression> argumentNodes = new List<Expression>(argumentCount);
-    Map<String, DartObjectImpl> namedArgumentValues =
-        new HashMap<String, DartObjectImpl>();
-    Map<String, NamedExpression> namedArgumentNodes =
-        new HashMap<String, NamedExpression>();
+    var argumentValues = new List<DartObjectImpl>(argumentCount);
+    Map<String, NamedExpression> namedNodes;
+    Map<String, DartObjectImpl> namedValues;
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
+        namedNodes ??= new HashMap<String, NamedExpression>();
+        namedValues ??= new HashMap<String, DartObjectImpl>();
         String name = argument.name.label.name;
-        namedArgumentValues[name] =
-            constantVisitor._valueOf(argument.expression);
-        namedArgumentNodes[name] = argument;
-        argumentValues[i] = typeProvider.nullObject;
+        namedNodes[name] = argument;
+        namedValues[name] = constantVisitor._valueOf(argument.expression);
       } else {
         var argumentValue = constantVisitor._valueOf(argument);
         argumentValues[i] = argumentValue;
-        positionalArguments.add(argumentValue);
-        argumentNodes[i] = argument;
       }
     }
+    namedNodes ??= const {};
+    namedValues ??= const {};
+
     if (invocation == null) {
       invocation = new ConstructorInvocation(
-          constructor, positionalArguments, namedArgumentValues);
+        constructor,
+        argumentValues,
+        namedValues,
+      );
     }
+
     constructor = followConstantRedirectionChain(constructor);
     InterfaceType definingClass = constructor.returnType as InterfaceType;
     if (constructor.isFactory) {
@@ -483,7 +500,7 @@
       // that we can emulate.
       if (constructor.name == "fromEnvironment") {
         if (!checkFromEnvironmentArguments(
-            arguments, argumentValues, namedArgumentValues, definingClass)) {
+            arguments, argumentValues, namedValues, definingClass)) {
           errorReporter.reportErrorForNode(
               CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
           return null;
@@ -497,7 +514,7 @@
           return computeValueFromEnvironment(
               valueFromEnvironment,
               new DartObjectImpl(typeProvider.boolType, BoolState.FALSE_STATE),
-              namedArgumentValues);
+              namedValues);
         } else if (definingClass == typeProvider.intType) {
           DartObject valueFromEnvironment;
           valueFromEnvironment =
@@ -505,7 +522,7 @@
           return computeValueFromEnvironment(
               valueFromEnvironment,
               new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE),
-              namedArgumentValues);
+              namedValues);
         } else if (definingClass == typeProvider.stringType) {
           DartObject valueFromEnvironment;
           valueFromEnvironment =
@@ -513,13 +530,12 @@
           return computeValueFromEnvironment(
               valueFromEnvironment,
               new DartObjectImpl(typeProvider.nullType, NullState.NULL_STATE),
-              namedArgumentValues);
+              namedValues);
         }
       } else if (constructor.name == "" &&
           definingClass == typeProvider.symbolType &&
           argumentCount == 1) {
-        if (!checkSymbolArguments(
-            arguments, argumentValues, namedArgumentValues)) {
+        if (!checkSymbolArguments(arguments, argumentValues, namedValues)) {
           errorReporter.reportErrorForNode(
               CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
           return null;
@@ -556,28 +572,10 @@
     // into the current ErrorReporter, because they usually happen in a
     // different source. But they still should cause a constant evaluation
     // error for the current node.
-    var externalErrorListener = new RecordingErrorListener();
+    var externalErrorListener = new BooleanErrorListener();
     var externalErrorReporter =
         new ErrorReporter(externalErrorListener, constructor.source);
 
-    void reportLocalErrorForRecordedExternalErrors() {
-      ErrorCode errorCode;
-      for (AnalysisError error in externalErrorListener.errors) {
-        if (error.errorCode is CompileTimeErrorCode) {
-          errorCode = CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION;
-          break;
-        }
-        if (error.errorCode is CheckedModeCompileTimeErrorCode) {
-          errorCode =
-              CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION;
-          break;
-        }
-      }
-      if (errorCode != null) {
-        errorReporter.reportErrorForNode(errorCode, node);
-      }
-    }
-
     // Start with final fields that are initialized at their declaration site.
     List<FieldElement> fields = constructor.enclosingElement.fields;
     for (int i = 0; i < fields.length; i++) {
@@ -623,11 +621,11 @@
       DartObjectImpl argumentValue = null;
       AstNode errorTarget = null;
       if (baseParameter.isNamed) {
-        argumentValue = namedArgumentValues[baseParameter.name];
-        errorTarget = namedArgumentNodes[baseParameter.name];
+        argumentValue = namedValues[baseParameter.name];
+        errorTarget = namedNodes[baseParameter.name];
       } else if (i < argumentCount) {
         argumentValue = argumentValues[i];
-        errorTarget = argumentNodes[i];
+        errorTarget = arguments[i];
       }
       if (errorTarget == null) {
         // No argument node that we can direct error messages to, because we
@@ -689,7 +687,8 @@
         lexicalEnvironment: parameterMap);
     String superName = null;
     NodeList<Expression> superArguments = null;
-    for (ConstructorInitializer initializer in initializers) {
+    for (var i = 0; i < initializers.length; i++) {
+      var initializer = initializers[i];
       if (initializer is ConstructorFieldInitializer) {
         Expression initializerExpression = initializer.expression;
         DartObjectImpl evaluationResult =
@@ -737,23 +736,24 @@
               initializerVisitor,
               externalErrorReporter,
               invocation: invocation);
-          reportLocalErrorForRecordedExternalErrors();
+          if (externalErrorListener.errorReported) {
+            errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
+          }
           return result;
         }
       } else if (initializer is AssertInitializer) {
         Expression condition = initializer.condition;
         if (condition == null) {
           errorReporter.reportErrorForNode(
-              CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
-              node);
+              CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
         }
         DartObjectImpl evaluationResult = condition.accept(initializerVisitor);
         if (evaluationResult == null ||
             !evaluationResult.isBool ||
             evaluationResult.toBoolValue() != true) {
           errorReporter.reportErrorForNode(
-              CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION,
-              node);
+              CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
           return null;
         }
       }
@@ -772,7 +772,10 @@
             superArguments, initializerVisitor, externalErrorReporter);
       }
     }
-    reportLocalErrorForRecordedExternalErrors();
+    if (externalErrorListener.errorReported) {
+      errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, node);
+    }
     return new DartObjectImpl(
         definingClass, new GenericState(fieldMap, invocation: invocation));
   }
@@ -901,11 +904,6 @@
     if (type.isUndefined) {
       return false;
     }
-    // TODO(mfairhurst): Remove this once #33441 is solved and we can use
-    // inference properly. This is a hack.
-    if (obj.type == typeProvider.intType && type == typeProvider.doubleType) {
-      return true;
-    }
     return obj.type.isSubtypeOf(type);
   }
 
@@ -1065,14 +1063,13 @@
       {Map<String, DartObjectImpl> lexicalEnvironment})
       : _lexicalEnvironment = lexicalEnvironment {
     this._dartObjectComputer =
-        new DartObjectComputer(_errorReporter, evaluationEngine.typeProvider);
+        new DartObjectComputer(_errorReporter, evaluationEngine);
   }
 
   /**
-   * Convenience getter to gain access to the [evalationEngine]'s type
-   * provider.
+   * Return the object representing the state of active experiments.
    */
-  TypeProvider get _typeProvider => evaluationEngine.typeProvider;
+  ExperimentStatus get experimentStatus => evaluationEngine.experimentStatus;
 
   /**
    * Convenience getter to gain access to the [evaluationEngine]'s type system.
@@ -1080,6 +1077,12 @@
   TypeSystem get typeSystem => evaluationEngine.typeSystem;
 
   /**
+   * Convenience getter to gain access to the [evaluationEngine]'s type
+   * provider.
+   */
+  TypeProvider get _typeProvider => evaluationEngine.typeProvider;
+
+  /**
    * Given a [type] that may contain free type variables, evaluate them against
    * the current lexical environment and return the substituted type.
    */
@@ -1127,27 +1130,50 @@
   }
 
   @override
+  DartObjectImpl visitAsExpression(AsExpression node) {
+    if (experimentStatus.constant_update_2018) {
+      DartObjectImpl expressionResult = node.expression.accept(this);
+      DartObjectImpl typeResult = node.type.accept(this);
+      return _dartObjectComputer.castToType(node, expressionResult, typeResult);
+    }
+    // TODO(brianwilkerson) Figure out which error to report.
+    _error(node, null);
+    return null;
+  }
+
+  @override
   DartObjectImpl visitBinaryExpression(BinaryExpression node) {
     TokenType operatorType = node.operator.type;
     DartObjectImpl leftResult = node.leftOperand.accept(this);
     // evaluate lazy operators
     if (operatorType == TokenType.AMPERSAND_AMPERSAND) {
-      return _dartObjectComputer.logicalAnd(
+      return _dartObjectComputer.lazyAnd(
           node, leftResult, () => node.rightOperand.accept(this));
     } else if (operatorType == TokenType.BAR_BAR) {
-      return _dartObjectComputer.logicalOr(
+      return _dartObjectComputer.lazyOr(
           node, leftResult, () => node.rightOperand.accept(this));
+    } else if (operatorType == TokenType.QUESTION_QUESTION) {
+      if (experimentStatus.constant_update_2018) {
+        return _dartObjectComputer.lazyQuestionQuestion(
+            node, leftResult, () => node.rightOperand.accept(this));
+      } else {
+        return _dartObjectComputer.eagerQuestionQuestion(
+            node, leftResult, node.rightOperand.accept(this));
+      }
     }
     // evaluate eager operators
     DartObjectImpl rightResult = node.rightOperand.accept(this);
     if (operatorType == TokenType.AMPERSAND) {
-      return _dartObjectComputer.bitAnd(node, leftResult, rightResult);
+      return _dartObjectComputer.eagerAnd(
+          node, leftResult, rightResult, experimentStatus.constant_update_2018);
     } else if (operatorType == TokenType.BANG_EQ) {
       return _dartObjectComputer.notEqual(node, leftResult, rightResult);
     } else if (operatorType == TokenType.BAR) {
-      return _dartObjectComputer.bitOr(node, leftResult, rightResult);
+      return _dartObjectComputer.eagerOr(
+          node, leftResult, rightResult, experimentStatus.constant_update_2018);
     } else if (operatorType == TokenType.CARET) {
-      return _dartObjectComputer.bitXor(node, leftResult, rightResult);
+      return _dartObjectComputer.eagerXor(
+          node, leftResult, rightResult, experimentStatus.constant_update_2018);
     } else if (operatorType == TokenType.EQ_EQ) {
       return _dartObjectComputer.equalEqual(node, leftResult, rightResult);
     } else if (operatorType == TokenType.GT) {
@@ -1157,6 +1183,9 @@
           node, leftResult, rightResult);
     } else if (operatorType == TokenType.GT_GT) {
       return _dartObjectComputer.shiftRight(node, leftResult, rightResult);
+    } else if (operatorType == TokenType.GT_GT_GT) {
+      return _dartObjectComputer.logicalShiftRight(
+          node, leftResult, rightResult);
     } else if (operatorType == TokenType.LT) {
       return _dartObjectComputer.lessThan(node, leftResult, rightResult);
     } else if (operatorType == TokenType.LT_EQ) {
@@ -1175,9 +1204,6 @@
       return _dartObjectComputer.divide(node, leftResult, rightResult);
     } else if (operatorType == TokenType.TILDE_SLASH) {
       return _dartObjectComputer.integerDivide(node, leftResult, rightResult);
-    } else if (operatorType == TokenType.QUESTION_QUESTION) {
-      return _dartObjectComputer.questionQuestion(
-          node, leftResult, rightResult);
     } else {
       // TODO(brianwilkerson) Figure out which error to report.
       _error(node, null);
@@ -1193,6 +1219,30 @@
   DartObjectImpl visitConditionalExpression(ConditionalExpression node) {
     Expression condition = node.condition;
     DartObjectImpl conditionResult = condition.accept(this);
+    if (experimentStatus.constant_update_2018) {
+      if (conditionResult == null) {
+        return conditionResult;
+      } else if (!conditionResult.isBool) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL, condition);
+        return null;
+      }
+      conditionResult = _dartObjectComputer.applyBooleanConversion(
+          condition, conditionResult);
+      if (conditionResult == null) {
+        return conditionResult;
+      }
+      if (conditionResult.toBoolValue() == true) {
+        return node.thenExpression.accept(this);
+      } else if (conditionResult.toBoolValue() == false) {
+        return node.elseExpression.accept(this);
+      }
+      // We used to return an object with a known type and an unknown value, but
+      // we can't do that without evaluating both the 'then' and 'else'
+      // expressions, and we're not suppose to do that under lazy semantics. I'm
+      // not sure which failure mode is worse.
+      return null;
+    }
     DartObjectImpl thenResult = node.thenExpression.accept(this);
     DartObjectImpl elseResult = node.elseExpression.accept(this);
     if (conditionResult == null) {
@@ -1246,8 +1296,13 @@
   }
 
   @override
-  DartObjectImpl visitIntegerLiteral(IntegerLiteral node) =>
-      new DartObjectImpl(_typeProvider.intType, new IntState(node.value));
+  DartObjectImpl visitIntegerLiteral(IntegerLiteral node) {
+    if (node.staticType == _typeProvider.doubleType) {
+      return new DartObjectImpl(
+          _typeProvider.doubleType, new DoubleState(node.value?.toDouble()));
+    }
+    return new DartObjectImpl(_typeProvider.intType, new IntState(node.value));
+  }
 
   @override
   DartObjectImpl visitInterpolationExpression(InterpolationExpression node) {
@@ -1264,6 +1319,18 @@
       new DartObjectImpl(_typeProvider.stringType, new StringState(node.value));
 
   @override
+  DartObjectImpl visitIsExpression(IsExpression node) {
+    if (experimentStatus.constant_update_2018) {
+      DartObjectImpl expressionResult = node.expression.accept(this);
+      DartObjectImpl typeResult = node.type.accept(this);
+      return _dartObjectComputer.typeTest(node, expressionResult, typeResult);
+    }
+    // TODO(brianwilkerson) Figure out which error to report.
+    _error(node, null);
+    return null;
+  }
+
+  @override
   DartObjectImpl visitListLiteral(ListLiteral node) {
     if (!node.isConst) {
       _errorReporter.reportErrorForNode(
@@ -1427,6 +1494,35 @@
   }
 
   @override
+  DartObjectImpl visitSetLiteral(SetLiteral node) {
+    if (!node.isConst) {
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.MISSING_CONST_IN_SET_LITERAL, node);
+      return null;
+    }
+    bool errorOccurred = false;
+    Set<DartObjectImpl> elements = new Set<DartObjectImpl>();
+    for (Expression element in node.elements) {
+      DartObjectImpl elementResult = element.accept(this);
+      if (elementResult == null) {
+        errorOccurred = true;
+      } else {
+        elements.add(elementResult);
+      }
+    }
+    if (errorOccurred) {
+      return null;
+    }
+    DartType nodeType = node.staticType;
+    DartType elementType =
+        nodeType is InterfaceType && nodeType.typeArguments.isNotEmpty
+            ? nodeType.typeArguments[0]
+            : _typeProvider.dynamicType;
+    InterfaceType setType = _typeProvider.setType.instantiate([elementType]);
+    return new DartObjectImpl(setType, new SetState(elements));
+  }
+
+  @override
   DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) {
     if (_lexicalEnvironment != null &&
         _lexicalEnvironment.containsKey(node.name)) {
@@ -1515,8 +1611,9 @@
       // Driver, we compute values of all dependencies first (or detect  cycle).
       // So, the value has already been computed. Just return it.
       if (evaluationEngine.forAnalysisDriver) {
-        if (variableElement.isConst) {
-          return variableElement.evaluationResult.value;
+        EvaluationResultImpl value = variableElement.evaluationResult;
+        if (variableElement.isConst && value != null) {
+          return value.value;
         }
       } else {
         // TODO(scheglov) Once we remove task model, we can remove this code.
@@ -1584,12 +1681,22 @@
   final ErrorReporter _errorReporter;
 
   /**
-   * The type provider used to create objects of the appropriate types, and to
-   * identify when an object is of a built-in type.
+   * The type provider used to access the known types.
    */
-  final TypeProvider _typeProvider;
+  final ConstantEvaluationEngine _evaluationEngine;
 
-  DartObjectComputer(this._errorReporter, this._typeProvider);
+  DartObjectComputer(this._errorReporter, this._evaluationEngine);
+
+  /**
+   * Convenience getter to gain access to the [evaluationEngine]'s type
+   * provider.
+   */
+  TypeProvider get _typeProvider => _evaluationEngine.typeProvider;
+
+  /**
+   * Convenience getter to gain access to the [evaluationEngine]'s type system.
+   */
+  TypeSystem get _typeSystem => _evaluationEngine.typeSystem;
 
   DartObjectImpl add(BinaryExpression node, DartObjectImpl leftOperand,
       DartObjectImpl rightOperand) {
@@ -1620,18 +1727,6 @@
     return null;
   }
 
-  DartObjectImpl bitAnd(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
-    if (leftOperand != null && rightOperand != null) {
-      try {
-        return leftOperand.bitAnd(_typeProvider, rightOperand);
-      } on EvaluationException catch (exception) {
-        _errorReporter.reportErrorForNode(exception.errorCode, node);
-      }
-    }
-    return null;
-  }
-
   DartObjectImpl bitNot(Expression node, DartObjectImpl evaluationResult) {
     if (evaluationResult != null) {
       try {
@@ -1643,23 +1738,11 @@
     return null;
   }
 
-  DartObjectImpl bitOr(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
-    if (leftOperand != null && rightOperand != null) {
+  DartObjectImpl castToType(
+      AsExpression node, DartObjectImpl expression, DartObjectImpl type) {
+    if (expression != null && type != null) {
       try {
-        return leftOperand.bitOr(_typeProvider, rightOperand);
-      } on EvaluationException catch (exception) {
-        _errorReporter.reportErrorForNode(exception.errorCode, node);
-      }
-    }
-    return null;
-  }
-
-  DartObjectImpl bitXor(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
-    if (leftOperand != null && rightOperand != null) {
-      try {
-        return leftOperand.bitXor(_typeProvider, rightOperand);
+        return expression.castToType(_typeProvider, _typeSystem, type);
       } on EvaluationException catch (exception) {
         _errorReporter.reportErrorForNode(exception.errorCode, node);
       }
@@ -1691,6 +1774,53 @@
     return null;
   }
 
+  DartObjectImpl eagerAnd(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand, bool allowBool) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.eagerAnd(_typeProvider, rightOperand, allowBool);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl eagerOr(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand, bool allowBool) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.eagerOr(_typeProvider, rightOperand, allowBool);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl eagerQuestionQuestion(Expression node,
+      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
+      if (leftOperand.isNull) {
+        return rightOperand;
+      }
+      return leftOperand;
+    }
+    return null;
+  }
+
+  DartObjectImpl eagerXor(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperand, bool allowBool) {
+    if (leftOperand != null && rightOperand != null) {
+      try {
+        return leftOperand.eagerXor(_typeProvider, rightOperand, allowBool);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
   DartObjectImpl equalEqual(Expression node, DartObjectImpl leftOperand,
       DartObjectImpl rightOperand) {
     if (leftOperand != null && rightOperand != null) {
@@ -1751,6 +1881,41 @@
     return null;
   }
 
+  DartObjectImpl lazyAnd(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperandComputer()) {
+    if (leftOperand != null) {
+      try {
+        return leftOperand.lazyAnd(_typeProvider, rightOperandComputer);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl lazyOr(BinaryExpression node, DartObjectImpl leftOperand,
+      DartObjectImpl rightOperandComputer()) {
+    if (leftOperand != null) {
+      try {
+        return leftOperand.lazyOr(_typeProvider, rightOperandComputer);
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
+
+  DartObjectImpl lazyQuestionQuestion(Expression node,
+      DartObjectImpl leftOperand, DartObjectImpl rightOperandComputer()) {
+    if (leftOperand != null) {
+      if (leftOperand.isNull) {
+        return rightOperandComputer();
+      }
+      return leftOperand;
+    }
+    return null;
+  }
+
   DartObjectImpl lessThan(BinaryExpression node, DartObjectImpl leftOperand,
       DartObjectImpl rightOperand) {
     if (leftOperand != null && rightOperand != null) {
@@ -1775,18 +1940,6 @@
     return null;
   }
 
-  DartObjectImpl logicalAnd(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperandComputer()) {
-    if (leftOperand != null) {
-      try {
-        return leftOperand.logicalAnd(_typeProvider, rightOperandComputer);
-      } on EvaluationException catch (exception) {
-        _errorReporter.reportErrorForNode(exception.errorCode, node);
-      }
-    }
-    return null;
-  }
-
   DartObjectImpl logicalNot(Expression node, DartObjectImpl evaluationResult) {
     if (evaluationResult != null) {
       try {
@@ -1798,11 +1951,11 @@
     return null;
   }
 
-  DartObjectImpl logicalOr(BinaryExpression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperandComputer()) {
-    if (leftOperand != null) {
+  DartObjectImpl logicalShiftRight(BinaryExpression node,
+      DartObjectImpl leftOperand, DartObjectImpl rightOperand) {
+    if (leftOperand != null && rightOperand != null) {
       try {
-        return leftOperand.logicalOr(_typeProvider, rightOperandComputer);
+        return leftOperand.logicalShiftRight(_typeProvider, rightOperand);
       } on EvaluationException catch (exception) {
         _errorReporter.reportErrorForNode(exception.errorCode, node);
       }
@@ -1857,17 +2010,6 @@
     return null;
   }
 
-  DartObjectImpl questionQuestion(Expression node, DartObjectImpl leftOperand,
-      DartObjectImpl rightOperand) {
-    if (leftOperand != null && rightOperand != null) {
-      if (leftOperand.isNull) {
-        return rightOperand;
-      }
-      return leftOperand;
-    }
-    return null;
-  }
-
   DartObjectImpl remainder(BinaryExpression node, DartObjectImpl leftOperand,
       DartObjectImpl rightOperand) {
     if (leftOperand != null && rightOperand != null) {
@@ -1933,6 +2075,23 @@
     }
     return null;
   }
+
+  DartObjectImpl typeTest(
+      IsExpression node, DartObjectImpl expression, DartObjectImpl type) {
+    if (expression != null && type != null) {
+      try {
+        DartObjectImpl result =
+            expression.hasType(_typeProvider, _typeSystem, type);
+        if (node.notOperator != null) {
+          return result.logicalNot(_typeProvider);
+        }
+        return result;
+      } on EvaluationException catch (exception) {
+        _errorReporter.reportErrorForNode(exception.errorCode, node);
+      }
+    }
+    return null;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/dart/constant/utilities.dart b/pkg/analyzer/lib/src/dart/constant/utilities.dart
index 50480ad..6a806c3 100644
--- a/pkg/analyzer/lib/src/dart/constant/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/constant/utilities.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -55,8 +56,8 @@
 
   @override
   FunctionExpression visitFunctionExpression(FunctionExpression node) {
-    FunctionExpression expression = super.visitFunctionExpression(node);
-    expression.element = node.declaredElement;
+    FunctionExpressionImpl expression = super.visitFunctionExpression(node);
+    expression.declaredElement = node.declaredElement;
     return expression;
   }
 
@@ -77,6 +78,13 @@
   }
 
   @override
+  IntegerLiteral visitIntegerLiteral(IntegerLiteral node) {
+    IntegerLiteral integer = super.visitIntegerLiteral(node);
+    integer.staticType = node.staticType;
+    return integer;
+  }
+
+  @override
   ListLiteral visitListLiteral(ListLiteral node) {
     ListLiteral literal = super.visitListLiteral(node);
     literal.staticType = node.staticType;
@@ -106,6 +114,16 @@
   }
 
   @override
+  SetLiteral visitSetLiteral(SetLiteral node) {
+    SetLiteral literal = super.visitSetLiteral(node);
+    literal.staticType = node.staticType;
+    if (node.constKeyword == null && node.isConst) {
+      literal.constKeyword = new KeywordToken(Keyword.CONST, node.offset);
+    }
+    return literal;
+  }
+
+  @override
   SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
     SimpleIdentifier identifier = super.visitSimpleIdentifier(node);
     identifier.staticElement = node.staticElement;
@@ -173,6 +191,15 @@
   }
 
   @override
+  void visitSetLiteral(SetLiteral node) {
+    if (node.isConst) {
+      _find(node);
+    } else {
+      super.visitSetLiteral(node);
+    }
+  }
+
+  @override
   void visitSwitchCase(SwitchCase node) {
     _find(node.expression);
     node.statements.accept(this);
@@ -192,7 +219,7 @@
  * constructors, constant constructor invocations, and annotations found in
  * those compilation units.
  */
-class ConstantFinder extends RecursiveAstVisitor<Object> {
+class ConstantFinder extends RecursiveAstVisitor<void> {
   /**
    * The elements and AST nodes whose constant values need to be computed.
    */
@@ -206,7 +233,7 @@
   bool treatFinalInstanceVarAsConst = false;
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     super.visitAnnotation(node);
     ElementAnnotation elementAnnotation = node.elementAnnotation;
     if (elementAnnotation == null) {
@@ -217,11 +244,10 @@
     } else {
       constantsToCompute.add(elementAnnotation);
     }
-    return null;
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     bool prevTreatFinalInstanceVarAsConst = treatFinalInstanceVarAsConst;
     if (resolutionMap
         .elementDeclaredByClassDeclaration(node)
@@ -233,14 +259,14 @@
       treatFinalInstanceVarAsConst = true;
     }
     try {
-      return super.visitClassDeclaration(node);
+      super.visitClassDeclaration(node);
     } finally {
       treatFinalInstanceVarAsConst = prevTreatFinalInstanceVarAsConst;
     }
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     if (node.constKeyword != null) {
       ConstructorElement element = node.declaredElement;
@@ -249,22 +275,20 @@
         constantsToCompute.addAll(element.parameters);
       }
     }
-    return null;
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     super.visitDefaultFormalParameter(node);
     Expression defaultValue = node.defaultValue;
     if (defaultValue != null && node.declaredElement != null) {
       constantsToCompute
           .add(resolutionMap.elementDeclaredByFormalParameter(node));
     }
-    return null;
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     Expression initializer = node.initializer;
     VariableElement element = node.declaredElement;
@@ -278,7 +302,6 @@
         constantsToCompute.add(element);
       }
     }
-    return null;
   }
 }
 
@@ -286,7 +309,7 @@
  * An object used to add reference information for a given variable to the
  * bi-directional mapping used to order the evaluation of constants.
  */
-class ReferenceFinder extends RecursiveAstVisitor<Object> {
+class ReferenceFinder extends RecursiveAstVisitor<void> {
   /**
    * The callback which should be used to report any dependencies that were
    * found.
@@ -301,39 +324,37 @@
   ReferenceFinder(this._callback);
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.isConst) {
       ConstructorElement constructor = getConstructorImpl(node.staticElement);
       if (constructor != null) {
         _callback(constructor);
       }
     }
-    return super.visitInstanceCreationExpression(node);
+    super.visitInstanceCreationExpression(node);
   }
 
   @override
-  Object visitLabel(Label node) {
+  void visitLabel(Label node) {
     // We are visiting the "label" part of a named expression in a function
     // call (presumably a constructor call), e.g. "const C(label: ...)".  We
     // don't want to visit the SimpleIdentifier for the label because that's a
     // reference to a function parameter that needs to be filled in; it's not a
     // constant whose value we depend on.
-    return null;
   }
 
   @override
-  Object visitRedirectingConstructorInvocation(
+  void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     super.visitRedirectingConstructorInvocation(node);
     ConstructorElement target = getConstructorImpl(node.staticElement);
     if (target != null) {
       _callback(target);
     }
-    return null;
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     Element staticElement = node.staticElement;
     Element element = staticElement is PropertyAccessorElement
         ? staticElement.variable
@@ -341,16 +362,14 @@
     if (element is VariableElement && element.isConst) {
       _callback(element);
     }
-    return null;
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     super.visitSuperConstructorInvocation(node);
     ConstructorElement constructor = getConstructorImpl(node.staticElement);
     if (constructor != null) {
       _callback(constructor);
     }
-    return null;
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index cca4d22..4666351 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
+import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 
 /**
@@ -98,7 +99,7 @@
   }
 
   @override
-  BoolState logicalAnd(InstanceState rightOperandComputer()) {
+  BoolState lazyAnd(InstanceState rightOperandComputer()) {
     if (value == false) {
       return FALSE_STATE;
     }
@@ -108,6 +109,16 @@
   }
 
   @override
+  BoolState lazyOr(InstanceState rightOperandComputer()) {
+    if (value == true) {
+      return TRUE_STATE;
+    }
+    InstanceState rightOperand = rightOperandComputer();
+    assertBool(rightOperand);
+    return value == null ? UNKNOWN_VALUE : rightOperand.convertToBool();
+  }
+
+  @override
   BoolState logicalNot() {
     if (value == null) {
       return UNKNOWN_VALUE;
@@ -116,16 +127,6 @@
   }
 
   @override
-  BoolState logicalOr(InstanceState rightOperandComputer()) {
-    if (value == true) {
-      return TRUE_STATE;
-    }
-    InstanceState rightOperand = rightOperandComputer();
-    assertBool(rightOperand);
-    return value == null ? UNKNOWN_VALUE : rightOperand.convertToBool();
-  }
-
-  @override
   String toString() => value == null ? "-unknown-" : (value ? "true" : "false");
 
   /**
@@ -145,9 +146,10 @@
   final ConstructorElement constructor;
 
   /**
-   * The positional arguments passed to the constructor.
+   * Values of specified arguments, actual values for positional, and `null`
+   * for named (which are provided as [namedArguments]).
    */
-  final List<DartObjectImpl> positionalArguments;
+  final List<DartObjectImpl> _argumentValues;
 
   /**
    * The named arguments passed to the constructor.
@@ -155,7 +157,14 @@
   final Map<String, DartObjectImpl> namedArguments;
 
   ConstructorInvocation(
-      this.constructor, this.positionalArguments, this.namedArguments);
+      this.constructor, this._argumentValues, this.namedArguments);
+
+  /**
+   * The positional arguments passed to the constructor.
+   */
+  List<DartObjectImpl> get positionalArguments {
+    return _argumentValues.takeWhile((v) => v != null).toList();
+  }
 }
 
 /**
@@ -219,6 +228,11 @@
    */
   bool get isBoolNumStringOrNull => _state.isBoolNumStringOrNull;
 
+  /**
+   * Return `true` if this object represents an object whose type is 'int'.
+   */
+  bool get isInt => _state.isInt;
+
   @override
   bool get isNull => _state is NullState;
 
@@ -265,19 +279,6 @@
   }
 
   /**
-   * Return the result of invoking the '&' operator on this object with the
-   * [rightOperand]. The [typeProvider] is the type provider used to find known
-   * types.
-   *
-   * Throws an [EvaluationException] if the operator is not appropriate for an
-   * object of this kind.
-   */
-  DartObjectImpl bitAnd(
-          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
-      new DartObjectImpl(
-          typeProvider.intType, _state.bitAnd(rightOperand._state));
-
-  /**
    * Return the result of invoking the '~' operator on this object. The
    * [typeProvider] is the type provider used to find known types.
    *
@@ -288,30 +289,20 @@
       new DartObjectImpl(typeProvider.intType, _state.bitNot());
 
   /**
-   * Return the result of invoking the '|' operator on this object with the
-   * [rightOperand]. The [typeProvider] is the type provider used to find known
-   * types.
-   *
-   * Throws an [EvaluationException] if the operator is not appropriate for an
-   * object of this kind.
+   * Return the result of casting this object to the given [castType].
    */
-  DartObjectImpl bitOr(
-          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
-      new DartObjectImpl(
-          typeProvider.intType, _state.bitOr(rightOperand._state));
-
-  /**
-   * Return the result of invoking the '^' operator on this object with the
-   * [rightOperand]. The [typeProvider] is the type provider used to find known
-   * types.
-   *
-   * Throws an [EvaluationException] if the operator is not appropriate for an
-   * object of this kind.
-   */
-  DartObjectImpl bitXor(
-          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
-      new DartObjectImpl(
-          typeProvider.intType, _state.bitXor(rightOperand._state));
+  DartObjectImpl castToType(TypeProvider typeProvider, TypeSystem typeSystem,
+      DartObjectImpl castType) {
+    _assertType(castType);
+    if (isNull) {
+      return this;
+    }
+    if (!typeSystem.isSubtypeOf(type, (castType._state as TypeState)._type)) {
+      throw new EvaluationException(
+          CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+    }
+    return this;
+  }
 
   /**
    * Return the result of invoking the ' ' operator on this object with the
@@ -364,6 +355,69 @@
   }
 
   /**
+   * Return the result of invoking the '&' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl eagerAnd(
+      TypeProvider typeProvider, DartObjectImpl rightOperand, bool allowBool) {
+    if (allowBool && isBool && rightOperand.isBool) {
+      return new DartObjectImpl(
+          typeProvider.boolType, _state.logicalAnd(rightOperand._state));
+    } else if (isInt && rightOperand.isInt) {
+      return new DartObjectImpl(
+          typeProvider.intType, _state.bitAnd(rightOperand._state));
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT);
+  }
+
+  /**
+   * Return the result of invoking the '|' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl eagerOr(
+      TypeProvider typeProvider, DartObjectImpl rightOperand, bool allowBool) {
+    if (allowBool && isBool && rightOperand.isBool) {
+      return new DartObjectImpl(
+          typeProvider.boolType, _state.logicalOr(rightOperand._state));
+    } else if (isInt && rightOperand.isInt) {
+      return new DartObjectImpl(
+          typeProvider.intType, _state.bitOr(rightOperand._state));
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT);
+  }
+
+  /**
+   * Return the result of invoking the '^' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl eagerXor(
+      TypeProvider typeProvider, DartObjectImpl rightOperand, bool allowBool) {
+    if (allowBool && isBool && rightOperand.isBool) {
+      return new DartObjectImpl(
+          typeProvider.boolType, _state.logicalXor(rightOperand._state));
+    } else if (isInt && rightOperand.isInt) {
+      return new DartObjectImpl(
+          typeProvider.intType, _state.bitXor(rightOperand._state));
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT);
+  }
+
+  /**
    * Return the result of invoking the '==' operator on this object with the
    * [rightOperand]. The [typeProvider] is the type provider used to find known
    * types.
@@ -434,6 +488,28 @@
           _state.greaterThanOrEqual(rightOperand._state));
 
   /**
+   * Return the result of testing whether this object has the given [testedType].
+   */
+  DartObjectImpl hasType(TypeProvider typeProvider, TypeSystem typeSystem,
+      DartObjectImpl testedType) {
+    _assertType(testedType);
+    DartType typeType = (testedType._state as TypeState)._type;
+    BoolState state;
+    if (isNull) {
+      if (typeType == typeProvider.objectType ||
+          typeType == typeProvider.dynamicType ||
+          typeType == typeProvider.nullType) {
+        state = BoolState.TRUE_STATE;
+      } else {
+        state = BoolState.FALSE_STATE;
+      }
+    } else {
+      state = BoolState.from(typeSystem.isSubtypeOf(type, typeType));
+    }
+    return new DartObjectImpl(typeProvider.boolType, state);
+  }
+
+  /**
    * Return the result of invoking the '~/' operator on this object with the
    * [rightOperand]. The [typeProvider] is the type provider used to find known
    * types.
@@ -458,6 +534,32 @@
   }
 
   /**
+   * Return the result of invoking the '&&' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl lazyAnd(
+          TypeProvider typeProvider, DartObjectImpl rightOperandComputer()) =>
+      new DartObjectImpl(typeProvider.boolType,
+          _state.lazyAnd(() => rightOperandComputer()?._state));
+
+  /**
+   * Return the result of invoking the '||' operator on this object with the
+   * [rightOperand]. The [typeProvider] is the type provider used to find known
+   * types.
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  DartObjectImpl lazyOr(
+          TypeProvider typeProvider, DartObjectImpl rightOperandComputer()) =>
+      new DartObjectImpl(typeProvider.boolType,
+          _state.lazyOr(() => rightOperandComputer()?._state));
+
+  /**
    * Return the result of invoking the '&lt;' operator on this object with the
    * [rightOperand]. The [typeProvider] is the type provider used to find known
    * types.
@@ -484,19 +586,6 @@
           typeProvider.boolType, _state.lessThanOrEqual(rightOperand._state));
 
   /**
-   * Return the result of invoking the '&&' operator on this object with the
-   * [rightOperand]. The [typeProvider] is the type provider used to find known
-   * types.
-   *
-   * Throws an [EvaluationException] if the operator is not appropriate for an
-   * object of this kind.
-   */
-  DartObjectImpl logicalAnd(
-          TypeProvider typeProvider, DartObjectImpl rightOperandComputer()) =>
-      new DartObjectImpl(typeProvider.boolType,
-          _state.logicalAnd(() => rightOperandComputer()?._state));
-
-  /**
    * Return the result of invoking the '!' operator on this object. The
    * [typeProvider] is the type provider used to find known types.
    *
@@ -507,17 +596,17 @@
       new DartObjectImpl(typeProvider.boolType, _state.logicalNot());
 
   /**
-   * Return the result of invoking the '||' operator on this object with the
-   * [rightOperand]. The [typeProvider] is the type provider used to find known
-   * types.
+   * Return the result of invoking the '&gt;&gt;&gt;' operator on this object
+   * with the [rightOperand]. The [typeProvider] is the type provider used to
+   * find known types.
    *
    * Throws an [EvaluationException] if the operator is not appropriate for an
    * object of this kind.
    */
-  DartObjectImpl logicalOr(
-          TypeProvider typeProvider, DartObjectImpl rightOperandComputer()) =>
-      new DartObjectImpl(typeProvider.boolType,
-          _state.logicalOr(() => rightOperandComputer()?._state));
+  DartObjectImpl logicalShiftRight(
+          TypeProvider typeProvider, DartObjectImpl rightOperand) =>
+      new DartObjectImpl(
+          typeProvider.intType, _state.logicalShiftRight(rightOperand._state));
 
   /**
    * Return the result of invoking the '-' operator on this object with the
@@ -722,6 +811,15 @@
   }
 
   @override
+  Set<DartObject> toSetValue() {
+    InstanceState state = _state;
+    if (state is SetState) {
+      return state._elements;
+    }
+    return null;
+  }
+
+  @override
   String toString() => "${type.displayName} ($_state)";
 
   @override
@@ -750,6 +848,16 @@
     }
     return null;
   }
+
+  /**
+   * Throw an exception if the given [object]'s state does not represent a Type
+   * value.
+   */
+  void _assertType(DartObjectImpl object) {
+    if (object._state is! TypeState) {
+      throw new EvaluationException(CompileTimeErrorCode.CONST_EVAL_TYPE_TYPE);
+    }
+  }
 }
 
 /**
@@ -1183,6 +1291,19 @@
   }
 
   @override
+  BoolState lazyAnd(InstanceState rightOperandComputer()) {
+    assertBool(rightOperandComputer());
+    return BoolState.UNKNOWN_VALUE;
+  }
+
+  @override
+  BoolState lazyOr(InstanceState rightOperandComputer()) {
+    InstanceState rightOperand = rightOperandComputer();
+    assertBool(rightOperand);
+    return rightOperand.convertToBool();
+  }
+
+  @override
   BoolState lessThan(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return BoolState.UNKNOWN_VALUE;
@@ -1195,22 +1316,9 @@
   }
 
   @override
-  BoolState logicalAnd(InstanceState rightOperandComputer()) {
-    assertBool(rightOperandComputer());
-    return BoolState.UNKNOWN_VALUE;
-  }
-
-  @override
   BoolState logicalNot() => BoolState.UNKNOWN_VALUE;
 
   @override
-  BoolState logicalOr(InstanceState rightOperandComputer()) {
-    InstanceState rightOperand = rightOperandComputer();
-    assertBool(rightOperand);
-    return rightOperand.convertToBool();
-  }
-
-  @override
   NumState minus(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     return _unknownNum(rightOperand);
@@ -1461,6 +1569,16 @@
   bool get isBoolNumStringOrNull => false;
 
   /**
+   * Return `true` if this object represents an object whose type is 'int'.
+   */
+  bool get isInt => false;
+
+  /**
+   * Return `true` if this object represents the value 'null'.
+   */
+  bool get isNull => false;
+
+  /**
    * Return `true` if this object represents an unknown value.
    */
   bool get isUnknown => false;
@@ -1704,6 +1822,40 @@
   BoolState isIdentical(InstanceState rightOperand);
 
   /**
+   * Return the result of invoking the '&&' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState lazyAnd(InstanceState rightOperandComputer()) {
+    assertBool(this);
+    if (convertToBool() == BoolState.FALSE_STATE) {
+      return this;
+    }
+    InstanceState rightOperand = rightOperandComputer();
+    assertBool(rightOperand);
+    return rightOperand.convertToBool();
+  }
+
+  /**
+   * Return the result of invoking the '||' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState lazyOr(InstanceState rightOperandComputer()) {
+    assertBool(this);
+    if (convertToBool() == BoolState.TRUE_STATE) {
+      return this;
+    }
+    InstanceState rightOperand = rightOperandComputer();
+    assertBool(rightOperand);
+    return rightOperand.convertToBool();
+  }
+
+  /**
    * Return the result of invoking the '&lt;' operator on this object with the
    * [rightOperand].
    *
@@ -1732,20 +1884,21 @@
   }
 
   /**
-   * Return the result of invoking the '&&' operator on this object with the
+   * Return the result of invoking the '&' operator on this object with the
    * [rightOperand].
    *
    * Throws an [EvaluationException] if the operator is not appropriate for an
    * object of this kind.
    */
-  BoolState logicalAnd(InstanceState rightOperandComputer()) {
+  BoolState logicalAnd(InstanceState rightOperand) {
     assertBool(this);
-    if (convertToBool() == BoolState.FALSE_STATE) {
-      return this;
-    }
-    InstanceState rightOperand = rightOperandComputer();
     assertBool(rightOperand);
-    return rightOperand.convertToBool();
+    bool leftValue = convertToBool().value;
+    bool rightValue = rightOperand.convertToBool().value;
+    if (leftValue == null || rightValue == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(leftValue & rightValue);
   }
 
   /**
@@ -1760,20 +1913,53 @@
   }
 
   /**
-   * Return the result of invoking the '||' operator on this object with the
+   * Return the result of invoking the '|' operator on this object with the
    * [rightOperand].
    *
    * Throws an [EvaluationException] if the operator is not appropriate for an
    * object of this kind.
    */
-  BoolState logicalOr(InstanceState rightOperandComputer()) {
+  BoolState logicalOr(InstanceState rightOperand) {
     assertBool(this);
-    if (convertToBool() == BoolState.TRUE_STATE) {
-      return this;
-    }
-    InstanceState rightOperand = rightOperandComputer();
     assertBool(rightOperand);
-    return rightOperand.convertToBool();
+    bool leftValue = convertToBool().value;
+    bool rightValue = rightOperand.convertToBool().value;
+    if (leftValue == null || rightValue == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(leftValue | rightValue);
+  }
+
+  /**
+   * Return the result of invoking the '&gt;&gt;' operator on this object with
+   * the [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  IntState logicalShiftRight(InstanceState rightOperand) {
+    assertIntOrNull(this);
+    assertIntOrNull(rightOperand);
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  /**
+   * Return the result of invoking the '^' operator on this object with the
+   * [rightOperand].
+   *
+   * Throws an [EvaluationException] if the operator is not appropriate for an
+   * object of this kind.
+   */
+  BoolState logicalXor(InstanceState rightOperand) {
+    assertBool(this);
+    assertBool(rightOperand);
+    bool leftValue = convertToBool().value;
+    bool rightValue = rightOperand.convertToBool().value;
+    if (leftValue == null || rightValue == null) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(leftValue ^ rightValue);
   }
 
   /**
@@ -1898,6 +2084,9 @@
   bool get isBoolNumStringOrNull => true;
 
   @override
+  bool get isInt => true;
+
+  @override
   bool get isUnknown => value == null;
 
   @override
@@ -2193,6 +2382,33 @@
   }
 
   @override
+  IntState logicalShiftRight(InstanceState rightOperand) {
+    assertIntOrNull(rightOperand);
+    if (value == null) {
+      return UNKNOWN_VALUE;
+    }
+    if (rightOperand is IntState) {
+      int rightValue = rightOperand.value;
+      if (rightValue == null) {
+        return UNKNOWN_VALUE;
+      } else if (rightValue.bitLength > 31) {
+        return UNKNOWN_VALUE;
+      }
+      if (rightValue >= 0) {
+        // TODO(brianwilkerson) After the analyzer package has a minimum SDK
+        // constraint that includes support for the real operator, consider
+        // changing this to the following line:
+        //   return new IntState(value >>> rightValue);
+        return new IntState(value ~/ (1 << rightValue));
+      }
+    } else if (rightOperand is DynamicState || rightOperand is NumState) {
+      return UNKNOWN_VALUE;
+    }
+    throw new EvaluationException(
+        CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION);
+  }
+
+  @override
   NumState minus(InstanceState rightOperand) {
     assertNumOrNull(rightOperand);
     if (value == null) {
@@ -2521,6 +2737,9 @@
   bool get isBoolNumStringOrNull => true;
 
   @override
+  bool get isNull => true;
+
+  @override
   String get typeName => "Null";
 
   @override
@@ -2676,6 +2895,89 @@
 }
 
 /**
+ * The state of an object representing a set.
+ */
+class SetState extends InstanceState {
+  /**
+   * The elements of the set.
+   */
+  final Set<DartObjectImpl> _elements;
+
+  /**
+   * Initialize a newly created state to represent a set with the given
+   * [elements].
+   */
+  SetState(this._elements);
+
+  @override
+  int get hashCode {
+    int value = 0;
+    for (DartObjectImpl element in _elements) {
+      value = (value << 3) ^ element.hashCode;
+    }
+    return value;
+  }
+
+  @override
+  String get typeName => "Set";
+
+  @override
+  bool operator ==(Object object) {
+    if (object is SetState) {
+      List<DartObjectImpl> elements = _elements.toList();
+      List<DartObjectImpl> otherElements = object._elements.toList();
+      int count = elements.length;
+      if (otherElements.length != count) {
+        return false;
+      } else if (count == 0) {
+        return true;
+      }
+      for (int i = 0; i < count; i++) {
+        if (elements[i] != otherElements[i]) {
+          return false;
+        }
+      }
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  StringState convertToString() => StringState.UNKNOWN_VALUE;
+
+  @override
+  BoolState equalEqual(InstanceState rightOperand) {
+    assertBoolNumStringOrNull(rightOperand);
+    return isIdentical(rightOperand);
+  }
+
+  @override
+  BoolState isIdentical(InstanceState rightOperand) {
+    if (rightOperand is DynamicState) {
+      return BoolState.UNKNOWN_VALUE;
+    }
+    return BoolState.from(this == rightOperand);
+  }
+
+  @override
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write('{');
+    bool first = true;
+    _elements.forEach((DartObjectImpl element) {
+      if (first) {
+        first = false;
+      } else {
+        buffer.write(', ');
+      }
+      buffer.write(element);
+    });
+    buffer.write('}');
+    return buffer.toString();
+  }
+}
+
+/**
  * The state of an object representing a string.
  */
 class StringState extends InstanceState {
diff --git a/pkg/analyzer/lib/src/dart/element/ast_provider.dart b/pkg/analyzer/lib/src/dart/element/ast_provider.dart
deleted file mode 100644
index ba94d53..0000000
--- a/pkg/analyzer/lib/src/dart/element/ast_provider.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
-
-/**
- * Provider for resolved and unresolved [CompilationUnit]s that contain, or
- * [AstNode]s that declare [Element]s.
- */
-abstract class AstProvider {
-  /**
-   * Return the driver that is used to provide ASTs.
-   */
-  AnalysisDriver get driver;
-
-  /**
-   * Completes with the [SimpleIdentifier] that declares the [element]. The
-   * enclosing unit is only parsed, but not resolved. Completes with `null` if
-   * the [element] is synthetic, or the file where it is declared cannot be
-   * parsed, etc.
-   */
-  Future<SimpleIdentifier> getParsedNameForElement(Element element);
-
-  /**
-   * Completes with the parsed [CompilationUnit] that contains the [element].
-   */
-  Future<CompilationUnit> getParsedUnitForElement(Element element);
-
-  /**
-   * Completes with the [SimpleIdentifier] that declares the [element]. The
-   * enclosing unit is fully resolved. Completes with `null` if the [element]
-   * is synthetic, or the file where it is declared cannot be parsed and
-   * resolved, etc.
-   */
-  Future<SimpleIdentifier> getResolvedNameForElement(Element element);
-
-  /**
-   * Completes with the resolved [CompilationUnit] that contains the [element].
-   */
-  Future<CompilationUnit> getResolvedUnitForElement(Element element);
-}
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index 2e518e3..5d439ae 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -48,7 +48,7 @@
       : super(initialHolder, compilationUnitElement);
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     // Although it isn't valid to do so because closures are not constant
     // expressions, it's possible for one of the arguments to the constructor to
     // contain a closure. Wrapping the processing of the annotation this way
@@ -62,16 +62,13 @@
     } finally {
       _currentHolder = previousHolder;
     }
-    return null;
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
-    return null;
-  }
+  void visitBlockFunctionBody(BlockFunctionBody node) {}
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     _enclosingClassHasConstConstructor = false;
     for (var constructor in node.members) {
       if (constructor is ConstructorDeclaration &&
@@ -90,12 +87,10 @@
     _fillClassElement(node, element, holder);
 
     _currentHolder.addType(element);
-
-    return null;
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     ElementHolder holder = new ElementHolder();
     _visitChildren(holder, node);
     SimpleIdentifier className = node.name;
@@ -109,19 +104,18 @@
     _currentHolder.addType(element);
     className.staticElement = element;
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     if (_unitElement is ElementImpl) {
       _setCodeRange(_unitElement, node);
     }
-    return super.visitCompilationUnit(node);
+    super.visitCompilationUnit(node);
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     ElementHolder holder = new ElementHolder();
     _visitChildren(holder, node);
     FunctionBody body = node.body;
@@ -150,7 +144,7 @@
       element.generator = true;
     }
     _currentHolder.addConstructor(element);
-    node.element = element;
+    (node as ConstructorDeclarationImpl).declaredElement = element;
     if (constructorName == null) {
       Identifier returnType = node.returnType;
       if (returnType != null) {
@@ -163,11 +157,10 @@
       element.nameEnd = constructorName.end;
     }
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     SimpleIdentifier enumName = node.name;
     EnumElementImpl enumElement = new EnumElementImpl.forNode(enumName);
     _setCodeRange(enumElement, node);
@@ -199,25 +192,23 @@
 
     _currentHolder.addEnum(enumElement);
     enumName.staticElement = enumElement;
-    return super.visitEnumDeclaration(node);
+    super.visitEnumDeclaration(node);
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     List<ElementAnnotation> annotations =
         _createElementAnnotations(node.metadata);
     _unitElement.setAnnotations(node.offset, annotations);
-    return super.visitExportDirective(node);
+    super.visitExportDirective(node);
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    return null;
-  }
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {}
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    FunctionExpression expression = node.functionExpression;
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionExpressionImpl expression = node.functionExpression;
     if (expression != null) {
       ElementHolder holder = new ElementHolder();
       _visitChildren(holder, node);
@@ -248,13 +239,13 @@
           element.hasImplicitReturnType = true;
         }
         _currentHolder.addFunction(element);
-        expression.element = element;
+        expression.declaredElement = element;
         functionName.staticElement = element;
       } else {
         SimpleIdentifier propertyNameNode = node.name;
         if (propertyNameNode == null) {
           // TODO(brianwilkerson) Report this internal error.
-          return null;
+          return;
         }
         String propertyName = propertyNameNode.name;
         TopLevelVariableElementImpl variable = _currentHolder
@@ -291,7 +282,7 @@
             getter.hasImplicitReturnType = true;
           }
           _currentHolder.addAccessor(getter);
-          expression.element = getter;
+          expression.declaredElement = getter;
           propertyNameNode.staticElement = getter;
         } else {
           PropertyAccessorElementImpl setter =
@@ -321,21 +312,21 @@
           variable.setter = setter;
           variable.isFinal = false;
           _currentHolder.addAccessor(setter);
-          expression.element = setter;
+          expression.declaredElement = setter;
           propertyNameNode.staticElement = setter;
         }
       }
       holder.validate();
     }
-    return null;
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is FunctionDeclaration) {
       // visitFunctionDeclaration has already created the element for the
       // declaration.  We just need to visit children.
-      return super.visitFunctionExpression(node);
+      super.visitFunctionExpression(node);
+      return;
     }
     ElementHolder holder = new ElementHolder();
     _visitChildren(holder, node);
@@ -357,13 +348,12 @@
     element.type = new FunctionTypeImpl(element);
     element.hasImplicitReturnType = true;
     _currentHolder.addFunction(element);
-    node.element = element;
+    (node as FunctionExpressionImpl).declaredElement = element;
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     ElementHolder holder = new ElementHolder();
     _visitChildren(holder, node);
     SimpleIdentifier aliasName = node.name;
@@ -382,11 +372,10 @@
     _currentHolder.addTypeAlias(element);
     aliasName.staticElement = element;
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitGenericTypeAlias(GenericTypeAlias node) {
+  void visitGenericTypeAlias(GenericTypeAlias node) {
     ElementHolder holder = new ElementHolder();
     _visitChildren(holder, node);
     SimpleIdentifier aliasName = node.name;
@@ -403,27 +392,26 @@
     _currentHolder.addTypeAlias(element);
     aliasName.staticElement = element;
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     List<ElementAnnotation> annotations =
         _createElementAnnotations(node.metadata);
     _unitElement.setAnnotations(node.offset, annotations);
-    return super.visitImportDirective(node);
+    super.visitImportDirective(node);
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     List<ElementAnnotation> annotations =
         _createElementAnnotations(node.metadata);
     _unitElement.setAnnotations(node.offset, annotations);
-    return super.visitLibraryDirective(node);
+    super.visitLibraryDirective(node);
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     try {
       ElementHolder holder = new ElementHolder();
       _visitChildren(holder, node);
@@ -539,7 +527,7 @@
     } catch (exception, stackTrace) {
       if (node.name.staticElement == null) {
         ClassDeclaration classNode =
-            node.getAncestor((node) => node is ClassDeclaration);
+            node.thisOrAncestorOfType<ClassDeclaration>();
         StringBuffer buffer = new StringBuffer();
         buffer.write("The element for the method ");
         buffer.write(node.name);
@@ -557,7 +545,7 @@
     } finally {
       if (node.name.staticElement == null) {
         ClassDeclaration classNode =
-            node.getAncestor((node) => node is ClassDeclaration);
+            node.thisOrAncestorOfType<ClassDeclaration>();
         StringBuffer buffer = new StringBuffer();
         buffer.write("The element for the method ");
         buffer.write(node.name);
@@ -570,11 +558,10 @@
                 new AnalysisException(buffer.toString()), null));
       }
     }
-    return null;
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     ElementHolder holder = _buildClassMembers(node);
 
     SimpleIdentifier nameNode = node.name;
@@ -583,20 +570,18 @@
     _fillClassElement(node, element, holder);
 
     _currentHolder.addMixin(element);
-
-    return null;
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     List<ElementAnnotation> annotations =
         _createElementAnnotations(node.metadata);
     _unitElement.setAnnotations(node.offset, annotations);
-    return super.visitPartDirective(node);
+    super.visitPartDirective(node);
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     bool isConst = node.isConst;
     bool isFinal = node.isFinal;
     Expression initializerNode = node.initializer;
@@ -658,11 +643,10 @@
         _currentHolder.addAccessor(setter);
       }
     }
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     super.visitVariableDeclarationList(node);
     AstNode parent = node.parent;
     List<ElementAnnotation> elementAnnotations;
@@ -676,7 +660,6 @@
     }
     _setVariableDeclarationListAnnotations(node, elementAnnotations);
     _setVariableDeclarationListCodeRanges(node);
-    return null;
   }
 
   ElementHolder _buildClassMembers(AstNode classNode) {
@@ -827,7 +810,7 @@
  * Instances of the class `DirectiveElementBuilder` build elements for top
  * level library directives.
  */
-class DirectiveElementBuilder extends SimpleAstVisitor<Object> {
+class DirectiveElementBuilder extends SimpleAstVisitor<void> {
   /**
    * The analysis context within which directive elements are being built.
    */
@@ -903,7 +886,7 @@
       this.exportSourceKindMap);
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     //
     // Resolve directives.
     //
@@ -926,11 +909,10 @@
     //
     libraryElement.imports = imports;
     libraryElement.exports = exports;
-    return null;
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     // Remove previous element. (It will remain null if the target is missing.)
     node.element = null;
     Source exportedSource = node.selectedSource;
@@ -962,11 +944,10 @@
       errors.add(new AnalysisError(libraryElement.source, offset, length,
           CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [uriLiteral.toSource()]));
     }
-    return null;
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     // Remove previous element. (It will remain null if the target is missing.)
     node.element = null;
     Source importedSource = node.selectedSource;
@@ -1017,21 +998,18 @@
       errors.add(new AnalysisError(libraryElement.source, offset, length,
           errorCode, [uriLiteral.toSource()]));
     }
-    return null;
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     (node.element as LibraryElementImpl)?.metadata =
         _getElementAnnotations(node.metadata);
-    return null;
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     (node.element as CompilationUnitElementImpl)?.metadata =
         _getElementAnnotations(node.metadata);
-    return null;
   }
 
   /**
@@ -1080,30 +1058,27 @@
       : super(initialHolder, compilationUnitElement);
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     _buildLocal(node);
-    return null;
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     super.visitDefaultFormalParameter(node);
     buildParameterInitializer(
         node.declaredElement as ParameterElementImpl, node.defaultValue);
-    return null;
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     _buildLocal(node);
-    return null;
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     _mixinSuperInvokedNames = new Set<String>();
     try {
-      return super.visitMixinDeclaration(node);
+      super.visitMixinDeclaration(node);
     } finally {
       MixinElementImpl element = node.declaredElement;
       element.superInvokedNames = _mixinSuperInvokedNames.toList();
@@ -1112,11 +1087,10 @@
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     VariableElementImpl element = node.declaredElement as VariableElementImpl;
     buildVariableInitializer(element, node.initializer);
-    return null;
   }
 
   void _buildLocal(FunctionBody body) {
@@ -1142,6 +1116,13 @@
       : super(initialHolder, compilationUnitElement);
 
   /**
+   * Initialize a newly created element builder as a first step to analyzing a
+   * dangling dart expression.
+   */
+  LocalElementBuilder.forDanglingExpression()
+      : super(new ElementHolder(), null);
+
+  /**
    * Builds the variable elements associated with [node] and stores them in
    * the element holder.
    */
@@ -1186,13 +1167,13 @@
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     buildCatchVariableElements(node);
-    return super.visitCatchClause(node);
+    super.visitCatchClause(node);
   }
 
   @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
     SimpleIdentifier variableName = node.identifier;
     LocalVariableElementImpl element =
         new LocalVariableElementImpl.forNode(variableName);
@@ -1211,22 +1192,20 @@
     }
     _currentHolder.addLocalVariable(element);
     variableName.staticElement = element;
-    return null;
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     super.visitDefaultFormalParameter(node);
     buildParameterInitializer(
         node.declaredElement as ParameterElementImpl, node.defaultValue);
-    return null;
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    FunctionExpression expression = node.functionExpression;
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    FunctionExpressionImpl expression = node.functionExpression;
     if (expression == null) {
-      return null;
+      return;
     }
 
     ElementHolder holder = new ElementHolder();
@@ -1255,7 +1234,7 @@
     }
 
     {
-      Block enclosingBlock = node.getAncestor((node) => node is Block);
+      Block enclosingBlock = node.thisOrAncestorOfType<Block>();
       if (enclosingBlock != null) {
         element.setVisibleRange(enclosingBlock.offset, enclosingBlock.length);
       }
@@ -1266,18 +1245,18 @@
     }
 
     _currentHolder.addFunction(element);
-    expression.element = element;
+    expression.declaredElement = element;
     node.name.staticElement = element;
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is FunctionDeclaration) {
       // visitFunctionDeclaration has already created the element for the
       // declaration.  We just need to visit children.
-      return super.visitFunctionExpression(node);
+      super.visitFunctionExpression(node);
+      return;
     }
 
     ElementHolder holder = new ElementHolder();
@@ -1298,43 +1277,38 @@
     if (body.isGenerator) {
       element.generator = true;
     }
-
-    {
-      Block enclosingBlock = node.getAncestor((node) => node is Block);
-      if (enclosingBlock != null) {
-        element.setVisibleRange(enclosingBlock.offset, enclosingBlock.length);
-      }
+    Block enclosingBlock = node.thisOrAncestorOfType<Block>();
+    if (enclosingBlock != null) {
+      element.setVisibleRange(enclosingBlock.offset, enclosingBlock.length);
     }
-
     element.type = new FunctionTypeImpl(element);
     element.hasImplicitReturnType = true;
     _currentHolder.addFunction(element);
-    node.element = element;
+    (node as FunctionExpressionImpl).declaredElement = element;
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitLabeledStatement(LabeledStatement node) {
+  void visitLabeledStatement(LabeledStatement node) {
     bool onSwitchStatement = node.statement is SwitchStatement;
     buildLabelElements(node.labels, onSwitchStatement, false);
-    return super.visitLabeledStatement(node);
+    super.visitLabeledStatement(node);
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     buildLabelElements(node.labels, false, true);
-    return super.visitSwitchCase(node);
+    super.visitSwitchCase(node);
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     buildLabelElements(node.labels, false, true);
-    return super.visitSwitchDefault(node);
+    super.visitSwitchDefault(node);
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     bool isConst = node.isConst;
     bool isFinal = node.isFinal;
     Expression initializerNode = node.initializer;
@@ -1354,17 +1328,15 @@
     element.isConst = isConst;
     element.isFinal = isFinal;
     buildVariableInitializer(element, initializerNode);
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     super.visitVariableDeclarationList(node);
     List<ElementAnnotation> elementAnnotations =
         _createElementAnnotations(node.metadata);
     _setVariableDeclarationListAnnotations(node, elementAnnotations);
     _setVariableDeclarationListCodeRanges(node);
-    return null;
   }
 
   void _setVariableVisibleRange(
@@ -1374,7 +1346,7 @@
     if (parent2 is ForStatement) {
       scopeNode = parent2;
     } else {
-      scopeNode = node.getAncestor((node) => node is Block);
+      scopeNode = node.thisOrAncestorOfType<Block>();
     }
     element.setVisibleRange(scopeNode.offset, scopeNode.length);
   }
@@ -1383,7 +1355,7 @@
 /**
  * Base class for API and local element builders.
  */
-abstract class _BaseElementBuilder extends RecursiveAstVisitor<Object> {
+abstract class _BaseElementBuilder extends RecursiveAstVisitor<void> {
   /**
    * The compilation unit element into which the elements being built will be
    * stored.
@@ -1444,7 +1416,7 @@
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     NormalFormalParameter normalParameter = node.parameter;
     SimpleIdentifier parameterName = normalParameter.identifier;
     ParameterElementImpl parameter;
@@ -1474,11 +1446,10 @@
     }
     parameterName?.staticElement = parameter;
     normalParameter.accept(this);
-    return null;
   }
 
   @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
+  void visitFieldFormalParameter(FieldFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
       FieldFormalParameterElementImpl parameter =
@@ -1505,11 +1476,10 @@
       _createGenericFunctionType(element, holder);
     }
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
       ParameterElementImpl parameter =
@@ -1534,11 +1504,10 @@
     element.metadata = _createElementAnnotations(node.metadata);
     _createGenericFunctionType(element, holder);
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) {
+  void visitGenericFunctionType(GenericFunctionType node) {
     ElementHolder holder = new ElementHolder();
     _visitChildren(holder, node);
     GenericFunctionTypeElementImpl element =
@@ -1550,11 +1519,10 @@
     element.type = type;
     (node as GenericFunctionTypeImpl).type = type;
     holder.validate();
-    return null;
   }
 
   @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
     ParameterElementImpl parameter;
     if (node.parent is! DefaultFormalParameter) {
       SimpleIdentifier parameterName = node.identifier;
@@ -1576,11 +1544,10 @@
     super.visitSimpleFormalParameter(node);
     parameter ??= node.declaredElement;
     parameter?.metadata = _createElementAnnotations(node.metadata);
-    return null;
   }
 
   @override
-  Object visitTypeParameter(TypeParameter node) {
+  void visitTypeParameter(TypeParameter node) {
     SimpleIdentifier parameterName = node.name;
     TypeParameterElementImpl typeParameter =
         new TypeParameterElementImpl.forNode(parameterName);
@@ -1591,7 +1558,7 @@
     typeParameter.type = typeParameterType;
     _currentHolder.addTypeParameter(typeParameter);
     parameterName.staticElement = typeParameter;
-    return super.visitTypeParameter(node);
+    super.visitTypeParameter(node);
   }
 
   /**
@@ -1720,54 +1687,50 @@
 /**
  * Builds elements for all node that are not constructors or methods.
  */
-class _ClassNotExecutableElementsBuilder extends UnifyingAstVisitor<Object> {
+class _ClassNotExecutableElementsBuilder extends UnifyingAstVisitor<void> {
   final ApiElementBuilder builder;
   final List<ClassMember> nonFields;
 
   _ClassNotExecutableElementsBuilder(this.builder, this.nonFields);
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     nonFields.add(node);
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     nonFields.add(node);
-    return null;
   }
 
   @override
-  Object visitNode(AstNode node) => node.accept(builder);
+  void visitNode(AstNode node) => node.accept(builder);
 }
 
 /**
  * Instances of the class [_NamespaceCombinatorBuilder] can be used to visit
  * [Combinator] AST nodes and generate [NamespaceCombinator] elements.
  */
-class _NamespaceCombinatorBuilder extends SimpleAstVisitor<Object> {
+class _NamespaceCombinatorBuilder extends SimpleAstVisitor<void> {
   /**
    * Elements generated so far.
    */
   final List<NamespaceCombinator> combinators = <NamespaceCombinator>[];
 
   @override
-  Object visitHideCombinator(HideCombinator node) {
+  void visitHideCombinator(HideCombinator node) {
     HideElementCombinatorImpl hide = new HideElementCombinatorImpl();
     hide.hiddenNames = _getIdentifiers(node.hiddenNames);
     combinators.add(hide);
-    return null;
   }
 
   @override
-  Object visitShowCombinator(ShowCombinator node) {
+  void visitShowCombinator(ShowCombinator node) {
     ShowElementCombinatorImpl show = new ShowElementCombinatorImpl();
     show.offset = node.offset;
     show.end = node.end;
     show.shownNames = _getIdentifiers(node.shownNames);
     combinators.add(show);
-    return null;
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 62f46eb..f764d36 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1,22 +1,25 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:collection';
 import 'dart:math' show min;
 
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/constant/compute.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/constant.dart' show EvaluationResultImpl;
 import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisContext, AnalysisEngine;
+    show AnalysisContext, AnalysisEngine, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
@@ -105,6 +108,7 @@
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitClassElement(this);
 
+  @deprecated
   @override
   NamedCompilationUnitMember computeNode() {
     if (isEnum) {
@@ -506,22 +510,49 @@
 
   @override
   List<ConstructorElement> get constructors {
+    if (_constructors != null) {
+      return _constructors;
+    }
+
     if (isMixinApplication) {
-      return _computeMixinAppConstructors();
+      return _constructors = _computeMixinAppConstructors();
     }
-    if (_unlinkedClass != null && _constructors == null) {
-      _constructors = _unlinkedClass.executables
-          .where((e) => e.kind == UnlinkedExecutableKind.constructor)
-          .map((e) => new ConstructorElementImpl.forSerialized(e, this))
-          .toList(growable: false);
-      // Ensure at least implicit default constructor.
-      if (_constructors.isEmpty) {
-        ConstructorElementImpl constructor = new ConstructorElementImpl('', -1);
-        constructor.isSynthetic = true;
-        constructor.enclosingElement = this;
-        _constructors = <ConstructorElement>[constructor];
+
+    if (_unlinkedClass != null) {
+      var unlinkedExecutables = _unlinkedClass.executables;
+
+      var length = unlinkedExecutables.length;
+      if (length != 0) {
+        var count = 0;
+        for (var i = 0; i < length; i++) {
+          var e = unlinkedExecutables[i];
+          if (e.kind == UnlinkedExecutableKind.constructor) {
+            count++;
+          }
+        }
+
+        if (count != 0) {
+          var constructors = new List<ConstructorElement>(count);
+          var index = 0;
+          for (var i = 0; i < length; i++) {
+            var e = unlinkedExecutables[i];
+            if (e.kind == UnlinkedExecutableKind.constructor) {
+              constructors[index++] =
+                  new ConstructorElementImpl.forSerialized(e, this);
+            }
+          }
+          return _constructors = constructors;
+        }
       }
+
+      // There are no explicit constructors.
+      // Create the implicit default constructor.
+      var constructor = new ConstructorElementImpl('', -1);
+      constructor.isSynthetic = true;
+      constructor.enclosingElement = this;
+      _constructors = <ConstructorElement>[constructor];
     }
+
     assert(_constructors != null);
     return _constructors ?? const <ConstructorElement>[];
   }
@@ -645,17 +676,39 @@
 
   @override
   List<InterfaceType> get interfaces {
-    if (_interfaces == null) {
-      if (_unlinkedClass != null) {
-        ResynthesizerContext context = enclosingUnit.resynthesizerContext;
-        _interfaces = _unlinkedClass.interfaces
-            .map((EntityRef t) => context.resolveTypeRef(this, t))
-            .where(_isInterfaceTypeInterface)
-            .cast<InterfaceType>()
-            .toList(growable: false);
-      }
+    if (_interfaces != null) {
+      return _interfaces;
     }
-    return _interfaces ?? const <InterfaceType>[];
+
+    if (_unlinkedClass != null) {
+      var unlinkedInterfaces = _unlinkedClass.interfaces;
+      var length = unlinkedInterfaces.length;
+      if (length == 0) {
+        return _interfaces = const <InterfaceType>[];
+      }
+
+      ResynthesizerContext context = enclosingUnit.resynthesizerContext;
+      var interfaces = new List<InterfaceType>(length);
+      var index = 0;
+      var hasNonInterfaceType = false;
+      for (var i = 0; i < length; i++) {
+        var t = unlinkedInterfaces[i];
+        var type = context.resolveTypeRef(this, t);
+        if (_isInterfaceTypeInterface(type)) {
+          interfaces[index++] = type;
+        } else {
+          hasNonInterfaceType = true;
+        }
+      }
+
+      if (hasNonInterfaceType) {
+        interfaces = interfaces.sublist(0, index);
+      }
+
+      return _interfaces = interfaces;
+    }
+
+    return _interfaces = const <InterfaceType>[];
   }
 
   void set interfaces(List<InterfaceType> interfaces) {
@@ -720,13 +773,40 @@
 
   @override
   List<MethodElement> get methods {
-    if (_unlinkedClass != null) {
-      _methods ??= _unlinkedClass.executables
-          .where((e) => e.kind == UnlinkedExecutableKind.functionOrMethod)
-          .map((e) => new MethodElementImpl.forSerialized(e, this))
-          .toList(growable: false);
+    if (_methods != null) {
+      return _methods;
     }
-    return _methods ?? const <MethodElement>[];
+
+    if (_unlinkedClass != null) {
+      var unlinkedExecutables = _unlinkedClass.executables;
+
+      var length = unlinkedExecutables.length;
+      if (length == 0) {
+        return _methods = const <MethodElement>[];
+      }
+
+      var count = 0;
+      for (var i = 0; i < length; i++) {
+        var e = unlinkedExecutables[i];
+        if (e.kind == UnlinkedExecutableKind.functionOrMethod) {
+          count++;
+        }
+      }
+      if (count == 0) {
+        return _methods = const <MethodElement>[];
+      }
+
+      var methods = new List<MethodElement>(count);
+      var index = 0;
+      for (var i = 0; i < length; i++) {
+        var e = unlinkedExecutables[i];
+        if (e.kind == UnlinkedExecutableKind.functionOrMethod) {
+          methods[index++] = new MethodElementImpl.forSerialized(e, this);
+        }
+      }
+      return _methods = methods;
+    }
+    return _methods = const <MethodElement>[];
   }
 
   /// Set the methods contained in this class to the given [methods].
@@ -746,17 +826,39 @@
 
   @override
   List<InterfaceType> get mixins {
-    if (_mixins == null) {
-      if (_unlinkedClass != null) {
-        ResynthesizerContext context = enclosingUnit.resynthesizerContext;
-        _mixins = _unlinkedClass.mixins
-            .map((EntityRef t) => context.resolveTypeRef(this, t))
-            .where(_isInterfaceTypeInterface)
-            .cast<InterfaceType>()
-            .toList(growable: false);
-      }
+    if (_mixins != null) {
+      return _mixins;
     }
-    return _mixins ?? const <InterfaceType>[];
+
+    if (_unlinkedClass != null) {
+      var unlinkedMixins = _unlinkedClass.mixins;
+      var length = unlinkedMixins.length;
+      if (length == 0) {
+        return _mixins = const <InterfaceType>[];
+      }
+
+      ResynthesizerContext context = enclosingUnit.resynthesizerContext;
+      var mixins = new List<InterfaceType>(length);
+      var index = 0;
+      var hasNonInterfaceType = false;
+      for (var i = 0; i < length; i++) {
+        var t = unlinkedMixins[i];
+        var type = context.resolveTypeRef(this, t);
+        if (_isInterfaceTypeInterface(type)) {
+          mixins[index++] = type;
+        } else {
+          hasNonInterfaceType = true;
+        }
+      }
+
+      if (hasNonInterfaceType) {
+        mixins = mixins.sublist(0, index);
+      }
+
+      return _mixins = mixins;
+    }
+
+    return _mixins = const <InterfaceType>[];
   }
 
   void set mixins(List<InterfaceType> mixins) {
@@ -1066,60 +1168,105 @@
   void _resynthesizeFieldsAndPropertyAccessors() {
     assert(_fields == null);
     assert(_accessors == null);
-    var explicitFields = <FieldElement>[];
-    var implicitAccessors = <PropertyAccessorElement>[];
-    var explicitAccessors = <PropertyAccessorElement>[];
-    var implicitFields = <String, FieldElementImpl>{};
+
+    var unlinkedFields = _unlinkedClass.fields;
+    var unlinkedExecutables = _unlinkedClass.executables;
 
     // Build explicit fields and implicit property accessors.
-    for (UnlinkedVariable v in _unlinkedClass.fields) {
-      FieldElementImpl field =
-          new FieldElementImpl.forSerializedFactory(v, this);
-      explicitFields.add(field);
-      implicitAccessors.add(
-          new PropertyAccessorElementImpl_ImplicitGetter(field)
-            ..enclosingElement = this);
-      if (!field.isConst && !field.isFinal) {
+    List<FieldElement> explicitFields;
+    List<PropertyAccessorElement> implicitAccessors;
+    var unlinkedFieldsLength = unlinkedFields.length;
+    if (unlinkedFieldsLength != 0) {
+      explicitFields = new List<FieldElement>(unlinkedFieldsLength);
+      implicitAccessors = <PropertyAccessorElement>[];
+      for (var i = 0; i < unlinkedFieldsLength; i++) {
+        var v = unlinkedFields[i];
+        FieldElementImpl field =
+            new FieldElementImpl.forSerializedFactory(v, this);
+        explicitFields[i] = field;
         implicitAccessors.add(
-            new PropertyAccessorElementImpl_ImplicitSetter(field)
+            new PropertyAccessorElementImpl_ImplicitGetter(field)
               ..enclosingElement = this);
+        if (!field.isConst && !field.isFinal) {
+          implicitAccessors.add(
+              new PropertyAccessorElementImpl_ImplicitSetter(field)
+                ..enclosingElement = this);
+        }
       }
+    } else {
+      explicitFields = const <FieldElement>[];
+      implicitAccessors = const <PropertyAccessorElement>[];
     }
-    // Build explicit property accessors and implicit fields.
-    for (UnlinkedExecutable e in _unlinkedClass.executables) {
+
+    var unlinkedExecutablesLength = unlinkedExecutables.length;
+    var getterSetterCount = 0;
+    for (var i = 0; i < unlinkedExecutablesLength; i++) {
+      var e = unlinkedExecutables[i];
       if (e.kind == UnlinkedExecutableKind.getter ||
           e.kind == UnlinkedExecutableKind.setter) {
-        PropertyAccessorElementImpl accessor =
-            new PropertyAccessorElementImpl.forSerialized(e, this);
-        explicitAccessors.add(accessor);
-        // Create or update the implicit field.
-        String fieldName = accessor.displayName;
-        FieldElementImpl field = implicitFields[fieldName];
-        if (field == null) {
-          field = new FieldElementImpl(fieldName, -1);
-          implicitFields[fieldName] = field;
-          field.enclosingElement = this;
-          field.isSynthetic = true;
-          field.isFinal = e.kind == UnlinkedExecutableKind.getter;
-          field.isStatic = e.isStatic;
-        } else {
-          field.isFinal = false;
-        }
-        accessor.variable = field;
-        if (e.kind == UnlinkedExecutableKind.getter) {
-          field.getter = accessor;
-        } else {
-          field.setter = accessor;
-        }
+        getterSetterCount++;
       }
     }
+
+    // Build explicit property accessors and implicit fields.
+    List<PropertyAccessorElement> explicitAccessors;
+    Map<String, FieldElementImpl> implicitFields;
+    if (getterSetterCount != 0) {
+      explicitAccessors = new List<PropertyAccessorElement>(getterSetterCount);
+      implicitFields = <String, FieldElementImpl>{};
+      var index = 0;
+      for (var i = 0; i < unlinkedExecutablesLength; i++) {
+        var e = unlinkedExecutables[i];
+        if (e.kind == UnlinkedExecutableKind.getter ||
+            e.kind == UnlinkedExecutableKind.setter) {
+          PropertyAccessorElementImpl accessor =
+              new PropertyAccessorElementImpl.forSerialized(e, this);
+          explicitAccessors[index++] = accessor;
+          // Create or update the implicit field.
+          String fieldName = accessor.displayName;
+          FieldElementImpl field = implicitFields[fieldName];
+          if (field == null) {
+            field = new FieldElementImpl(fieldName, -1);
+            implicitFields[fieldName] = field;
+            field.enclosingElement = this;
+            field.isSynthetic = true;
+            field.isFinal = e.kind == UnlinkedExecutableKind.getter;
+            field.isStatic = e.isStatic;
+          } else {
+            field.isFinal = false;
+          }
+          accessor.variable = field;
+          if (e.kind == UnlinkedExecutableKind.getter) {
+            field.getter = accessor;
+          } else {
+            field.setter = accessor;
+          }
+        }
+      }
+    } else {
+      explicitAccessors = const <PropertyAccessorElement>[];
+      implicitFields = const <String, FieldElementImpl>{};
+    }
+
     // Combine explicit and implicit fields and property accessors.
-    _fields = <FieldElement>[]
-      ..addAll(explicitFields)
-      ..addAll(implicitFields.values);
-    _accessors = <PropertyAccessorElement>[]
-      ..addAll(explicitAccessors)
-      ..addAll(implicitAccessors);
+    if (implicitFields.isEmpty) {
+      _fields = explicitFields;
+    } else if (explicitFields.isEmpty) {
+      _fields = implicitFields.values.toList(growable: false);
+    } else {
+      _fields = <FieldElement>[]
+        ..addAll(explicitFields)
+        ..addAll(implicitFields.values);
+    }
+    if (explicitAccessors.isEmpty) {
+      _accessors = implicitAccessors;
+    } else if (implicitAccessors.isEmpty) {
+      _accessors = explicitAccessors;
+    } else {
+      _accessors = <PropertyAccessorElement>[]
+        ..addAll(explicitAccessors)
+        ..addAll(implicitAccessors);
+    }
   }
 
   bool _safeIsOrInheritsProxy(
@@ -1523,6 +1670,7 @@
     }
   }
 
+  @deprecated
   @override
   CompilationUnit computeNode() => unit;
 
@@ -1783,6 +1931,9 @@
   }
 
   @override
+  bool get isConstantEvaluated => true;
+
+  @override
   void set isFinal(bool isFinal) {
     assert(false);
   }
@@ -1835,6 +1986,9 @@
   /// is a part of a cycle.
   bool _isCycleFree = true;
 
+  @override
+  bool isConstantEvaluated = false;
+
   /// Initialize a newly created constructor element to have the given [name
   /// ] and[offset].
   ConstructorElementImpl(String name, int offset) : super(name, offset);
@@ -2042,6 +2196,7 @@
     super.appendTo(buffer);
   }
 
+  @deprecated
   @override
   ConstructorDeclaration computeNode() =>
       getNodeMatching((node) => node is ConstructorDeclaration);
@@ -2134,8 +2289,7 @@
 /// This interface is only used for constant variables that have initializers.
 ///
 /// This class is not intended to be part of the public API for analyzer.
-abstract class ConstVariableElement
-    implements ElementImpl, ConstantEvaluationTarget {
+mixin ConstVariableElement implements ElementImpl, ConstantEvaluationTarget {
   /// If this element represents a constant variable, and it has an initializer,
   /// a copy of the initializer for the constant.  Otherwise `null`.
   ///
@@ -2168,6 +2322,9 @@
     _evaluationResult = evaluationResult;
   }
 
+  @override
+  bool get isConstantEvaluated => _evaluationResult != null;
+
   /// If this element is resynthesized from the summary, return the unlinked
   /// initializer, otherwise return `null`.
   UnlinkedExpr get _unlinkedConst;
@@ -2178,7 +2335,9 @@
   /// of this variable could not be computed because of errors.
   DartObject computeConstantValue() {
     if (evaluationResult == null) {
-      context?.computeResult(this, CONSTANT_VALUE);
+      AnalysisOptionsImpl analysisOptions = context.analysisOptions;
+      computeConstants(context.typeProvider, context.typeSystem,
+          context.declaredVariables, [this], analysisOptions.experimentStatus);
     }
     return evaluationResult?.value;
   }
@@ -2218,6 +2377,7 @@
       UnlinkedParam unlinkedParam, ElementImpl enclosingElement)
       : super.forSerialized(unlinkedParam, enclosingElement);
 
+  @deprecated
   @override
   DefaultFormalParameter computeNode() =>
       getNodeMatching((node) => node is DefaultFormalParameter);
@@ -2253,10 +2413,6 @@
   /// throws, for dead code purposes.
   static String _ALWAYS_THROWS_VARIABLE_NAME = "alwaysThrows";
 
-  /// The name of the top-level variable used to mark a method parameter as
-  /// covariant.
-  static String _COVARIANT_VARIABLE_NAME = "checked";
-
   /// The name of the class used to mark an element as being deprecated.
   static String _DEPRECATED_CLASS_NAME = "Deprecated";
 
@@ -2272,6 +2428,10 @@
   /// as being immutable.
   static String _IMMUTABLE_VARIABLE_NAME = "immutable";
 
+  /// The name of the top-level variable used to mark a constructor as being
+  /// literal.
+  static String _LITERAL_VARIABLE_NAME = "literal";
+
   /// The name of the top-level variable used to mark a function as running
   /// a single test.
   static String _IS_TEST_VARIABLE_NAME = "isTest";
@@ -2348,6 +2508,10 @@
   ElementAnnotationImpl(this.compilationUnit);
 
   @override
+  List<AnalysisError> get constantEvaluationErrors =>
+      evaluationResult?.errors ?? const <AnalysisError>[];
+
+  @override
   DartObject get constantValue => evaluationResult?.value;
 
   @override
@@ -2359,12 +2523,8 @@
       element.name == _ALWAYS_THROWS_VARIABLE_NAME &&
       element.library?.name == _META_LIB_NAME;
 
-  /// Return `true` if this annotation marks the associated parameter as being
-  /// covariant, meaning it is allowed to have a narrower type in an override.
-  bool get isCovariant =>
-      element is PropertyAccessorElement &&
-      element.name == _COVARIANT_VARIABLE_NAME &&
-      element.library?.name == _META_LIB_NAME;
+  @override
+  bool get isConstantEvaluated => evaluationResult != null;
 
   @override
   bool get isDeprecated {
@@ -2409,6 +2569,12 @@
       element.library?.name == _JS_LIB_NAME;
 
   @override
+  bool get isLiteral =>
+      element is PropertyAccessorElement &&
+      element.name == _LITERAL_VARIABLE_NAME &&
+      element.library?.name == _META_LIB_NAME;
+
+  @override
   bool get isMustCallSuper =>
       element is PropertyAccessorElement &&
       element.name == _MUST_CALL_SUPER_VARIABLE_NAME &&
@@ -2468,7 +2634,9 @@
   @override
   DartObject computeConstantValue() {
     if (evaluationResult == null) {
-      context?.computeResult(this, CONSTANT_VALUE);
+      AnalysisOptionsImpl analysisOptions = context.analysisOptions;
+      computeConstants(context.typeProvider, context.typeSystem,
+          context.declaredVariables, [this], analysisOptions.experimentStatus);
     }
     return constantValue;
   }
@@ -2659,6 +2827,18 @@
   }
 
   @override
+  bool get hasLiteral {
+    var metadata = this.metadata;
+    for (var i = 0; i < metadata.length; i++) {
+      var annotation = metadata[i];
+      if (annotation.isLiteral) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @override
   bool get hasOverride {
     var metadata = this.metadata;
     for (var i = 0; i < metadata.length; i++) {
@@ -2829,6 +3009,11 @@
   }
 
   @override
+  AnalysisSession get session {
+    return _enclosingElement?.session;
+  }
+
+  @override
   Source get source {
     if (_enclosingElement == null) {
       return null;
@@ -2843,6 +3028,7 @@
     return _enclosingElement?.typeParameterContext;
   }
 
+  @deprecated
   @override
   CompilationUnit get unit => context.resolveCompilationUnit(source, library);
 
@@ -2889,6 +3075,7 @@
   @override
   String computeDocumentationComment() => documentationComment;
 
+  @deprecated
   @override
   AstNode computeNode() => getNodeMatching((node) => node is AstNode);
 
@@ -2926,6 +3113,7 @@
   }
 
   /// Return the resolved [AstNode] of the given type enclosing [getNameOffset].
+  @deprecated
   AstNode getNodeMatching(Predicate<AstNode> predicate) {
     CompilationUnit unit = this.unit;
     if (unit == null) {
@@ -2936,7 +3124,7 @@
     if (node == null) {
       return null;
     }
-    return node.getAncestor(predicate);
+    return node.thisOrAncestorMatching(predicate);
   }
 
   /// Return `true` if this element has the given [modifier] associated with it.
@@ -3376,6 +3564,7 @@
   /// Create the only method enums have - `toString()`.
   void createToStringMethodElement() {
     var method = new MethodElementImpl('toString', -1);
+    method.isSynthetic = true;
     if (_unlinkedEnum != null) {
       method.returnType = context.typeProvider.stringType;
       method.type = new FunctionTypeImpl(method);
@@ -3745,7 +3934,7 @@
   /// order in which they were specified.
   List<NamespaceCombinator> _combinators;
 
-  /// The URI that was selected based on the [context] declared variables.
+  /// The URI that was selected based on the declared variables.
   String _selectedUri;
 
   /// Initialize a newly created export element at the given [offset].
@@ -3952,6 +4141,7 @@
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
 
+  @deprecated
   @override
   AstNode computeNode() {
     if (isEnumConstant) {
@@ -4016,7 +4206,10 @@
 
   @override
   DartType get type {
-    if (unlinkedParam != null && unlinkedParam.type == null && field != null) {
+    if (unlinkedParam != null &&
+        unlinkedParam.type == null &&
+        !unlinkedParam.isFunctionTyped &&
+        field != null) {
       _type ??= field?.type ?? DynamicTypeImpl.instance;
     }
     return super.type;
@@ -4124,6 +4317,7 @@
     super.appendTo(buffer);
   }
 
+  @deprecated
   @override
   FunctionDeclaration computeNode() =>
       getNodeMatching((node) => node is FunctionDeclaration);
@@ -4596,6 +4790,7 @@
     }
   }
 
+  @deprecated
   @override
   GenericTypeAlias computeNode() =>
       getNodeMatching((node) => node is GenericTypeAlias);
@@ -4723,7 +4918,7 @@
   ///` if there was no prefix specified.
   PrefixElement _prefix;
 
-  /// The URI that was selected based on the [context] declared variables.
+  /// The URI that was selected based on the declared variables.
   String _selectedUri;
 
   /// The cached value of [namespace].
@@ -5007,6 +5202,9 @@
   /// The analysis context in which this library is defined.
   final AnalysisContext context;
 
+  @override
+  final AnalysisSession session;
+
   final LibraryResynthesizerContext resynthesizerContext;
 
   final UnlinkedUnit unlinkedDefiningUnit;
@@ -5061,22 +5259,29 @@
 
   /// Initialize a newly created library element in the given [context] to have
   /// the given [name] and [offset].
-  LibraryElementImpl(this.context, String name, int offset, this.nameLength)
+  LibraryElementImpl(
+      this.context, this.session, String name, int offset, this.nameLength)
       : resynthesizerContext = null,
         unlinkedDefiningUnit = null,
         super(name, offset);
 
   /// Initialize a newly created library element in the given [context] to have
   /// the given [name].
-  LibraryElementImpl.forNode(this.context, LibraryIdentifier name)
+  LibraryElementImpl.forNode(this.context, this.session, LibraryIdentifier name)
       : nameLength = name != null ? name.length : 0,
         resynthesizerContext = null,
         unlinkedDefiningUnit = null,
         super.forNode(name);
 
   /// Initialize using the given serialized information.
-  LibraryElementImpl.forSerialized(this.context, String name, int offset,
-      this.nameLength, this.resynthesizerContext, this.unlinkedDefiningUnit)
+  LibraryElementImpl.forSerialized(
+      this.context,
+      this.session,
+      String name,
+      int offset,
+      this.nameLength,
+      this.resynthesizerContext,
+      this.unlinkedDefiningUnit)
       : super.forSerialized(null) {
     _name = name;
     _nameOffset = offset;
@@ -5468,6 +5673,19 @@
   }
 
   @override
+  Iterable<Element> get topLevelElements sync* {
+    for (var unit in units) {
+      yield* unit.accessors;
+      yield* unit.enums;
+      yield* unit.functionTypeAliases;
+      yield* unit.functions;
+      yield* unit.mixins;
+      yield* unit.topLevelVariables;
+      yield* unit.types;
+    }
+  }
+
+  @override
   List<CompilationUnitElement> get units {
     List<CompilationUnitElement> units = new List<CompilationUnitElement>();
     units.add(_definingCompilationUnit);
@@ -5770,6 +5988,7 @@
     buffer.write(displayName);
   }
 
+  @deprecated
   @override
   Declaration computeNode() => getNodeMatching(
       (node) => node is DeclaredIdentifier || node is VariableDeclaration);
@@ -5866,6 +6085,7 @@
     super.appendTo(buffer);
   }
 
+  @deprecated
   @override
   MethodDeclaration computeNode() =>
       getNodeMatching((node) => node is MethodDeclaration);
@@ -6143,6 +6363,9 @@
   @override
   final AnalysisContext context;
 
+  @override
+  final AnalysisSession session;
+
   /// The name of the conflicting elements.
   @override
   final String name;
@@ -6152,7 +6375,8 @@
 
   /// Initialize a newly created element in the given [context] to represent
   /// the given non-empty [conflictingElements].
-  MultiplyDefinedElementImpl(this.context, this.name, this.conflictingElements);
+  MultiplyDefinedElementImpl(
+      this.context, this.session, this.name, this.conflictingElements);
 
   @override
   String get displayName => name;
@@ -6182,6 +6406,9 @@
   bool get hasJS => false;
 
   @override
+  bool get hasLiteral => false;
+
+  @override
   bool get hasOverride => false;
 
   @override
@@ -6277,6 +6504,7 @@
   @override
   String computeDocumentationComment() => null;
 
+  @deprecated
   @override
   AstNode computeNode() => null;
 
@@ -6729,11 +6957,6 @@
     if (isExplicitlyCovariant || inheritsCovariant) {
       return true;
     }
-    for (ElementAnnotationImpl annotation in metadata) {
-      if (annotation.isCovariant) {
-        return true;
-      }
-    }
     return false;
   }
 
@@ -6901,6 +7124,7 @@
     buffer.write(right);
   }
 
+  @deprecated
   @override
   FormalParameter computeNode() =>
       getNodeMatching((node) => node is FormalParameter);
@@ -6996,11 +7220,6 @@
     if (isExplicitlyCovariant || inheritsCovariant) {
       return true;
     }
-    for (ElementAnnotationImpl annotation in setter.variable.metadata) {
-      if (annotation.isCovariant) {
-        return true;
-      }
-    }
     return false;
   }
 
@@ -7024,7 +7243,7 @@
 
 /// A mixin that provides a common implementation for methods defined in
 /// [ParameterElement].
-abstract class ParameterElementMixin implements ParameterElement {
+mixin ParameterElementMixin implements ParameterElement {
   @override
   bool get isNamed => parameterKind == ParameterKind.NAMED;
 
@@ -7278,6 +7497,7 @@
     super.appendTo(buffer);
   }
 
+  @deprecated
   @override
   AstNode computeNode() {
     if (isSynthetic) {
@@ -7391,6 +7611,9 @@
       UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement)
       : super.forSerialized(unlinkedVariable, enclosingElement);
 
+  @override
+  bool get isConstantEvaluated => true;
+
   @deprecated
   @override
   DartType get propagatedType => null;
@@ -7543,7 +7766,7 @@
 
 /// Mixin providing the implementation of
 /// [TypeParameterizedElement.isSimplyBounded] for elements that define a type.
-abstract class SimplyBoundableMixin implements TypeParameterizedElement {
+mixin SimplyBoundableMixin implements TypeParameterizedElement {
   CompilationUnitElementImpl get enclosingUnit;
 
   @override
@@ -7592,6 +7815,7 @@
   T accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitTopLevelVariableElement(this);
 
+  @deprecated
   @override
   VariableDeclaration computeNode() =>
       getNodeMatching((node) => node is VariableDeclaration);
@@ -7728,7 +7952,7 @@
 }
 
 /// Mixin representing an element which can have type parameters.
-abstract class TypeParameterizedElementMixin
+mixin TypeParameterizedElementMixin
     implements
         TypeParameterizedElement,
         ElementImpl,
@@ -7995,6 +8219,9 @@
   }
 
   @override
+  bool get isConstantEvaluated => true;
+
+  @override
   bool get isFinal {
     return hasModifier(Modifier.FINAL);
   }
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index 95ac102..67f47f7 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -45,6 +46,9 @@
   bool get hasJS => actualElement.hasJS;
 
   @override
+  bool get hasLiteral => actualElement.hasLiteral;
+
+  @override
   bool get hasNonFinalField => actualElement.hasNonFinalField;
 
   @override
@@ -117,6 +121,7 @@
   @override
   ConstructorElement get unnamedConstructor => actualElement.unnamedConstructor;
 
+  @deprecated
   @override
   NamedCompilationUnitMember computeNode() => super.computeNode();
 
@@ -246,6 +251,7 @@
   @override
   int get uriOffset => actualElement.uriOffset;
 
+  @deprecated
   @override
   CompilationUnit computeNode() => actualElement.computeNode();
 
@@ -281,6 +287,9 @@
   bool get isConst => actualElement.isConst;
 
   @override
+  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
+
+  @override
   bool get isDefaultConstructor => actualElement.isDefaultConstructor;
 
   @override
@@ -299,6 +308,7 @@
   ConstructorElement get redirectedConstructor =>
       actualElement.redirectedConstructor;
 
+  @deprecated
   @override
   ConstructorDeclaration computeNode() => actualElement.computeNode();
 }
@@ -382,6 +392,9 @@
   bool get hasJS => actualElement.hasJS;
 
   @override
+  bool get hasLiteral => actualElement.hasLiteral;
+
+  @override
   bool get hasOverride => actualElement.hasOverride;
 
   @override
@@ -455,8 +468,12 @@
   int get nameOffset => actualElement.nameOffset;
 
   @override
+  AnalysisSession get session => _resynthesizer.session;
+
+  @override
   Source get source => actualElement.source;
 
+  @deprecated
   @override
   CompilationUnit get unit => actualElement.unit;
 
@@ -470,6 +487,7 @@
   @override
   String computeDocumentationComment() => documentationComment;
 
+  @deprecated
   @override
   AstNode computeNode() => actualElement.computeNode();
 
@@ -506,10 +524,17 @@
   final AnalysisContext context;
 
   /**
+   * The session that owns the element to be resynthesized.
+   * 
+   * Note that this will be `null` if the task model is being used.
+   */
+  final AnalysisSession session;
+
+  /**
    * Initialize a newly created resynthesizer to resynthesize elements in the
    * given [context].
    */
-  ElementResynthesizer(this.context);
+  ElementResynthesizer(this.context, this.session);
 
   /**
    * Return the element referenced by the given [location].
@@ -643,6 +668,7 @@
   @override
   ElementKind get kind => ElementKind.FIELD;
 
+  @deprecated
   @override
   VariableDeclaration computeNode() => actualElement.computeNode();
 }
@@ -673,6 +699,7 @@
   @override
   SourceRange get visibleRange => actualElement.visibleRange;
 
+  @deprecated
   @override
   FunctionDeclaration computeNode() => actualElement.computeNode();
 }
@@ -720,6 +747,7 @@
   @override
   List<TypeParameterElement> get typeParameters => actualElement.typeParameters;
 
+  @deprecated
   @override
   FunctionTypeAlias computeNode() => actualElement.computeNode();
 
@@ -766,6 +794,7 @@
   @override
   List<TypeParameterElement> get typeParameters => actualElement.typeParameters;
 
+  @deprecated
   @override
   FunctionTypeAlias computeNode() => actualElement.computeNode();
 
@@ -920,6 +949,9 @@
   Namespace get publicNamespace => actualElement.publicNamespace;
 
   @override
+  Iterable<Element> get topLevelElements => actualElement.topLevelElements;
+
+  @override
   List<CompilationUnitElement> get units => actualElement.units;
 
   @override
@@ -954,6 +986,7 @@
   @override
   SourceRange get visibleRange => actualElement.visibleRange;
 
+  @deprecated
   @override
   VariableDeclaration computeNode() => actualElement.computeNode();
 }
@@ -984,6 +1017,7 @@
   @override
   ElementKind get kind => ElementKind.METHOD;
 
+  @deprecated
   @override
   MethodDeclaration computeNode() => actualElement.computeNode();
 
@@ -1036,6 +1070,7 @@
   @override
   SourceRange get visibleRange => actualElement.visibleRange;
 
+  @deprecated
   @override
   FormalParameter computeNode() => super.computeNode();
 }
@@ -1138,6 +1173,9 @@
   DartType get propagatedType => null;
 
   @override
+  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
+
+  @override
   PropertyAccessorElement get setter => actualElement.setter;
 }
 
@@ -1158,6 +1196,7 @@
   @override
   ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
 
+  @deprecated
   @override
   VariableDeclaration computeNode() => super.computeNode();
 }
@@ -1217,6 +1256,9 @@
   FunctionElement get initializer => actualElement.initializer;
 
   @override
+  bool get isConstantEvaluated => actualElement.isConstantEvaluated;
+
+  @override
   bool get isConst => actualElement.isConst;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
index 860bcb9..799dbc8 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
@@ -30,16 +30,16 @@
 
 /// Manages knowledge about interface types and their members.
 class InheritanceManager2 {
+  static final _noSuchMethodName = Name(null, 'noSuchMethod');
+
   final TypeSystem _typeSystem;
 
   /// Cached instance interfaces for [InterfaceType].
   final Map<InterfaceType, Interface> _interfaces = {};
 
-  /// Cached implemented members for [InterfaceType].
-  final Map<InterfaceType, Map<Name, FunctionType>> _implemented = {};
-
-  /// Cached member implemented in the mixin.
-  final Map<InterfaceType, Map<Name, FunctionType>> _mixinMembers = {};
+  /// The set of classes that are currently being processed, used to detect
+  /// self-referencing cycles.
+  final Set<ClassElement> _processingClasses = new Set<ClassElement>();
 
   InheritanceManager2(this._typeSystem);
 
@@ -53,75 +53,125 @@
   /// members, not necessary accessible in all libraries.
   Interface getInterface(InterfaceType type) {
     if (type == null) {
-      return const Interface._(const {}, const {}, const [{}], const []);
+      return Interface._empty;
     }
 
     var result = _interfaces[type];
     if (result != null) {
       return result;
     }
+    _interfaces[type] = Interface._empty;
 
-    _interfaces[type] = const Interface._(
-      const {},
-      const {},
-      const [{}],
-      const [],
-    );
-    Map<Name, FunctionType> map = {};
-    List<Map<Name, FunctionType>> superImplemented = [];
-    List<Conflict> conflicts = null;
-
-    // If a class declaration has a member declaration, the signature of that
-    // member declaration becomes the signature in the interface.
-    _addTypeMembers(map, type);
+    var classElement = type.element;
+    if (!_processingClasses.add(classElement)) {
+      return Interface._empty;
+    }
 
     Map<Name, List<FunctionType>> namedCandidates = {};
+    List<Map<Name, FunctionType>> superImplemented = [];
+    Map<Name, FunctionType> declared;
+    Interface superInterface;
+    Map<Name, FunctionType> implemented;
+    Map<Name, FunctionType> implementedForMixing;
+    try {
+      // If a class declaration has a member declaration, the signature of that
+      // member declaration becomes the signature in the interface.
+      declared = _getTypeMembers(type);
 
-    for (var interface in type.interfaces) {
-      _addCandidates(namedCandidates, interface);
-    }
-
-    if (type.element.isMixin) {
-      for (var constraint in type.superclassConstraints) {
-        _addCandidates(namedCandidates, constraint);
+      for (var interface in type.interfaces) {
+        var interfaceObj = getInterface(interface);
+        _addCandidates(namedCandidates, interfaceObj);
       }
 
-      // `mixin M on S1, S2 {}` can call using `super` any instance member
-      // from its superclass constraints, whether it is abstract or concrete.
-      Map<Name, FunctionType> mixinSuperClass = {};
-      _findMostSpecificFromNamedCandidates(mixinSuperClass, namedCandidates);
-      superImplemented.add(mixinSuperClass);
+      if (classElement.isMixin) {
+        for (var constraint in type.superclassConstraints) {
+          var interfaceObj = getInterface(constraint);
+          _addCandidates(namedCandidates, interfaceObj);
+        }
+
+        implemented = {};
+
+        // `mixin M on S1, S2 {}` can call using `super` any instance member
+        // from its superclass constraints, whether it is abstract or concrete.
+        Map<Name, FunctionType> mixinSuperClass = {};
+        _findMostSpecificFromNamedCandidates(mixinSuperClass, namedCandidates);
+        superImplemented.add(mixinSuperClass);
+      } else {
+        if (type.superclass != null) {
+          superInterface = getInterface(type.superclass);
+          _addCandidates(namedCandidates, superInterface);
+
+          implemented = superInterface.implemented;
+          superImplemented.add(implemented);
+        } else {
+          implemented = {};
+        }
+
+        implementedForMixing = {};
+        for (var mixin in type.mixins) {
+          var interfaceObj = getInterface(mixin);
+          _addCandidates(namedCandidates, interfaceObj);
+
+          implemented = <Name, FunctionType>{}
+            ..addAll(implemented)
+            ..addAll(interfaceObj.implementedForMixing);
+          superImplemented.add(implemented);
+          implementedForMixing.addAll(interfaceObj.implementedForMixing);
+        }
+      }
+    } finally {
+      _processingClasses.remove(classElement);
+    }
+
+    var thisImplemented = <Name, FunctionType>{};
+    _addImplemented(thisImplemented, type);
+
+    if (classElement.isMixin) {
+      implementedForMixing = thisImplemented;
     } else {
-      Map<Name, FunctionType> implemented;
-
-      if (type.superclass != null) {
-        _addCandidates(namedCandidates, type.superclass);
-
-        implemented = _getImplemented(type.superclass);
-        superImplemented.add(implemented);
-      }
-
-      for (var mixin in type.mixins) {
-        _addCandidates(namedCandidates, mixin);
-
-        var implementedInMixin = _getImplemented(mixin);
-        implemented = <Name, FunctionType>{}
-          ..addAll(implemented)
-          ..addAll(implementedInMixin);
-        superImplemented.add(implemented);
-      }
+      implementedForMixing.addAll(thisImplemented);
     }
 
+    implemented = <Name, FunctionType>{}..addAll(implemented);
+    _addImplemented(implemented, type);
+
     // If a class declaration does not have a member declaration with a
     // particular name, but some super-interfaces do have a member with that
     // name, it's a compile-time error if there is no signature among the
     // super-interfaces that is a valid override of all the other
     // super-interface signatures with the same name. That "most specific"
     // signature becomes the signature of the class's interface.
-    conflicts = _findMostSpecificFromNamedCandidates(map, namedCandidates);
+    Map<Name, FunctionType> map = new Map.of(declared);
+    List<Conflict> conflicts = _findMostSpecificFromNamedCandidates(
+      map,
+      namedCandidates,
+    );
+
+    var noSuchMethodForwarders = Set<Name>();
+    if (classElement.isAbstract) {
+      if (superInterface != null) {
+        noSuchMethodForwarders = superInterface.noSuchMethodForwarders;
+      }
+    } else {
+      var noSuchMethod = implemented[_noSuchMethodName]?.element;
+      if (noSuchMethod != null && !_isDeclaredInObject(noSuchMethod)) {
+        var superForwarders = superInterface?.noSuchMethodForwarders;
+        for (var name in map.keys) {
+          if (!implemented.containsKey(name) ||
+              superForwarders != null && superForwarders.contains(name)) {
+            implemented[name] = map[name];
+            noSuchMethodForwarders.add(name);
+          }
+        }
+      }
+    }
 
     var interface = new Interface._(
       map,
+      declared,
+      implemented,
+      noSuchMethodForwarders,
+      implementedForMixing,
       namedCandidates,
       superImplemented,
       conflicts ?? const [],
@@ -148,17 +198,18 @@
     int forMixinIndex: -1,
     bool forSuper: false,
   }) {
+    var interface = getInterface(type);
     if (forSuper) {
-      var superImplemented = getInterface(type)._superImplemented;
+      var superImplemented = interface._superImplemented;
       if (forMixinIndex >= 0) {
         return superImplemented[forMixinIndex][name];
       }
       return superImplemented.last[name];
     }
     if (concrete) {
-      return _getImplemented(type)[name];
+      return interface.implemented[name];
     }
-    return getInterface(type).map[name];
+    return interface.map[name];
   }
 
   /// Return all members of mixins, superclasses, and interfaces that a member
@@ -181,26 +232,31 @@
   }
 
   void _addCandidates(
-      Map<Name, List<FunctionType>> namedCandidates, InterfaceType type) {
-    var map = getInterface(type).map;
+      Map<Name, List<FunctionType>> namedCandidates, Interface interface) {
+    var map = interface.map;
     for (var name in map.keys) {
       var candidate = map[name];
       _addCandidate(namedCandidates, name, candidate);
     }
   }
 
-  void _addTypeMembers(Map<Name, FunctionType> map, InterfaceType type) {
+  void _addImplemented(
+      Map<Name, FunctionType> implemented, InterfaceType type) {
     var libraryUri = type.element.librarySource.uri;
 
-    void addTypeMember(ExecutableElement member) {
-      if (!member.isStatic) {
+    void addMember(ExecutableElement member) {
+      if (!member.isAbstract && !member.isStatic) {
         var name = new Name(libraryUri, member.name);
-        map[name] = member.type;
+        implemented[name] = member.type;
       }
     }
 
-    type.methods.forEach(addTypeMember);
-    type.accessors.forEach(addTypeMember);
+    void addMembers(InterfaceType type) {
+      type.methods.forEach(addMember);
+      type.accessors.forEach(addMember);
+    }
+
+    addMembers(type);
   }
 
   /// Check that all [candidates] for the given [name] have the same kind, all
@@ -305,89 +361,68 @@
     return conflicts;
   }
 
-  Map<Name, FunctionType> _getImplemented(InterfaceType type) {
-    var implemented = _implemented[type];
-    if (implemented != null) {
-      return implemented;
-    }
-
-    _implemented[type] = const {};
-    implemented = <Name, FunctionType>{};
-
+  Map<Name, FunctionType> _getTypeMembers(InterfaceType type) {
+    var declared = <Name, FunctionType>{};
     var libraryUri = type.element.librarySource.uri;
 
-    void addMember(ExecutableElement member) {
-      if (!member.isAbstract && !member.isStatic) {
-        var name = new Name(libraryUri, member.name);
-        implemented[name] = member.type;
+    var methods = type.methods;
+    for (var i = 0; i < methods.length; i++) {
+      var method = methods[i];
+      if (!method.isStatic) {
+        var name = new Name(libraryUri, method.name);
+        declared[name] = method.type;
       }
     }
 
-    void addMembers(InterfaceType type) {
-      type.methods.forEach(addMember);
-      type.accessors.forEach(addMember);
+    var accessors = type.accessors;
+    for (var i = 0; i < accessors.length; i++) {
+      var accessor = accessors[i];
+      if (!accessor.isStatic) {
+        var name = new Name(libraryUri, accessor.name);
+        declared[name] = accessor.type;
+      }
     }
 
-    if (type.superclass != null) {
-      var superImplemented = _getImplemented(type.superclass);
-      implemented.addAll(superImplemented);
-    }
-
-    // Mixins override the nominal superclass and previous mixins.
-    for (var mixin in type.mixins) {
-      var superImplemented = _getImplementedInMixin(mixin);
-      implemented.addAll(superImplemented);
-    }
-
-    // This type overrides everything from its actual superclass.
-    addMembers(type);
-
-    _implemented[type] = implemented;
-    return implemented;
+    return declared;
   }
 
-  /// TODO(scheglov) This repeats a lot of code from [_getImplemented].
-  Map<Name, FunctionType> _getImplementedInMixin(InterfaceType type) {
-    var implemented = _mixinMembers[type];
-    if (implemented != null) {
-      return implemented;
-    }
-
-    _mixinMembers[type] = const {};
-    implemented = <Name, FunctionType>{};
-
-    var libraryUri = type.element.librarySource.uri;
-
-    void addMember(ExecutableElement member) {
-      if (!member.isAbstract && !member.isStatic) {
-        var name = new Name(libraryUri, member.name);
-        implemented[name] = member.type;
-      }
-    }
-
-    void addMembers(InterfaceType type) {
-      type.methods.forEach(addMember);
-      type.accessors.forEach(addMember);
-    }
-
-    for (var mixin in type.mixins) {
-      var superImplemented = _getImplementedInMixin(mixin);
-      implemented.addAll(superImplemented);
-    }
-
-    // This type overrides everything from its actual superclass.
-    addMembers(type);
-
-    _mixinMembers[type] = implemented;
-    return implemented;
+  static bool _isDeclaredInObject(ExecutableElement element) {
+    var enclosing = element.enclosingElement;
+    return enclosing is ClassElement &&
+        enclosing.supertype == null &&
+        !enclosing.isMixin;
   }
 }
 
 /// The instance interface of an [InterfaceType].
 class Interface {
+  static final _empty = Interface._(
+    const {},
+    const {},
+    const {},
+    Set<Name>(),
+    const {},
+    const {},
+    const [{}],
+    const [],
+  );
+
   /// The map of names to their signature in the interface.
   final Map<Name, FunctionType> map;
 
+  /// The map of declared names to their signatures.
+  final Map<Name, FunctionType> declared;
+
+  /// The map of names to their concrete implementations.
+  final Map<Name, FunctionType> implemented;
+
+  /// The set of names that are `noSuchMethod` forwarders in [implemented].
+  final Set<Name> noSuchMethodForwarders;
+
+  /// The map of names to their concrete implementations that can be mixed
+  /// when this type is used as a mixin.
+  final Map<Name, FunctionType> implementedForMixing;
+
   /// The map of names to their signatures from the mixins, superclasses,
   /// or interfaces.
   final Map<Name, List<FunctionType>> _overridden;
@@ -403,8 +438,12 @@
   /// members of the class.
   final List<Conflict> conflicts;
 
-  const Interface._(
+  Interface._(
     this.map,
+    this.declared,
+    this.implemented,
+    this.noSuchMethodForwarders,
+    this.implementedForMixing,
     this._overridden,
     this._superImplemented,
     this.conflicts,
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index b1df8d9..484458a 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/constant/value.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -41,6 +42,9 @@
   bool get isConst => baseElement.isConst;
 
   @override
+  bool get isConstantEvaluated => baseElement.isConstantEvaluated;
+
+  @override
   bool get isDefaultConstructor => baseElement.isDefaultConstructor;
 
   @override
@@ -60,6 +64,7 @@
   T accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitConstructorElement(this);
 
+  @deprecated
   @override
   ConstructorDeclaration computeNode() => baseElement.computeNode();
 
@@ -265,6 +270,7 @@
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
 
+  @deprecated
   @override
   VariableDeclaration computeNode() => baseElement.computeNode();
 
@@ -323,6 +329,7 @@
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitFunctionElement(this);
 
+  @deprecated
   @override
   FunctionDeclaration computeNode() => baseElement.computeNode();
 
@@ -415,6 +422,9 @@
   bool get hasJS => _baseElement.hasJS;
 
   @override
+  bool get hasLiteral => _baseElement.hasLiteral;
+
+  @override
   bool get hasOverride => _baseElement.hasOverride;
 
   @override
@@ -493,14 +503,19 @@
   int get nameOffset => _baseElement.nameOffset;
 
   @override
+  AnalysisSession get session => _baseElement.session;
+
+  @override
   Source get source => _baseElement.source;
 
+  @deprecated
   @override
   CompilationUnit get unit => _baseElement.unit;
 
   @override
   String computeDocumentationComment() => documentationComment;
 
+  @deprecated
   @override
   AstNode computeNode() => _baseElement.computeNode();
 
@@ -583,6 +598,7 @@
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
 
+  @deprecated
   @override
   MethodDeclaration computeNode() => baseElement.computeNode();
 
@@ -726,6 +742,7 @@
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitParameterElement(this);
 
+  @deprecated
   @override
   FormalParameter computeNode() => baseElement.computeNode();
 
@@ -1012,6 +1029,9 @@
   bool get isConst => baseElement.isConst;
 
   @override
+  bool get isConstantEvaluated => baseElement.isConstantEvaluated;
+
+  @override
   bool get isFinal => baseElement.isFinal;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index b566cbb..6b7d311 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -56,14 +56,35 @@
  */
 class BottomTypeImpl extends TypeImpl {
   /**
-   * The unique instance of this class.
+   * The unique instance of this class, with indeterminate nullability.
    */
-  static final BottomTypeImpl instance = new BottomTypeImpl._();
+  static final BottomTypeImpl instance = instanceIndeterminate;
+
+  /**
+   * The unique instance of this class, nullable.
+   */
+  static final BottomTypeImpl instanceNullable =
+      new BottomTypeImpl._(Nullability.nullable);
+
+  /**
+   * The unique instance of this class, with indeterminate nullability.
+   */
+  static final BottomTypeImpl instanceIndeterminate =
+      new BottomTypeImpl._(Nullability.indeterminate);
+
+  /**
+   * The unique instance of this class, non-nullable.
+   */
+  static final BottomTypeImpl instanceNonNullable =
+      new BottomTypeImpl._(Nullability.nonNullable);
+
+  @override
+  final Nullability nullability;
 
   /**
    * Prevent the creation of instances of this class.
    */
-  BottomTypeImpl._() : super(null, "<bottom>");
+  BottomTypeImpl._(this.nullability) : super(null, "<bottom>");
 
   @override
   int get hashCode => 0;
@@ -111,6 +132,19 @@
           List<DartType> argumentTypes, List<DartType> parameterTypes,
           [List<FunctionTypeAliasElement> prune]) =>
       this;
+
+  @override
+  TypeImpl withNullability(Nullability nullability) {
+    switch (nullability) {
+      case Nullability.nullable:
+        return instanceNullable;
+      case Nullability.indeterminate:
+        return instanceIndeterminate;
+      case Nullability.nonNullable:
+        return instanceNonNullable;
+    }
+    throw StateError('Unexpected nullability: $nullability');
+  }
 }
 
 /**
@@ -119,7 +153,7 @@
  */
 class CircularFunctionTypeImpl extends DynamicTypeImpl
     implements _FunctionTypeImplLazy {
-  CircularFunctionTypeImpl() : super._circular();
+  CircularFunctionTypeImpl() : super._circular(Nullability.indeterminate);
 
   @override
   List<ParameterElement> get baseParameters => const <ParameterElement>[];
@@ -206,7 +240,8 @@
   bool operator ==(Object object) => object is CircularFunctionTypeImpl;
 
   @override
-  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes) {
+  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes,
+      {bool withNullability = false}) {
     buffer.write('...');
   }
 
@@ -227,6 +262,9 @@
   FunctionTypeImpl substitute3(List<DartType> argumentTypes) => this;
 
   @override
+  TypeImpl withNullability(Nullability nullability) => this;
+
+  @override
   void _forEachParameterType(
       ParameterKind kind, callback(String name, DartType type)) {
     // There are no parameters.
@@ -256,13 +294,14 @@
  * `...`.
  */
 class CircularTypeImpl extends DynamicTypeImpl {
-  CircularTypeImpl() : super._circular();
+  CircularTypeImpl() : super._circular(Nullability.indeterminate);
 
   @override
   bool operator ==(Object object) => object is CircularTypeImpl;
 
   @override
-  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes) {
+  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes,
+      {bool withNullability = false}) {
     buffer.write('...');
   }
 
@@ -292,8 +331,10 @@
   FunctionTypedElement _computedElement;
 
   DeferredFunctionTypeImpl(this._computeElement, String name,
-      List<DartType> typeArguments, bool isInstantiated)
-      : super._(null, name, null, typeArguments, null, null, isInstantiated);
+      List<DartType> typeArguments, bool isInstantiated,
+      {Nullability nullability = Nullability.indeterminate})
+      : super._(null, name, null, typeArguments, null, null, isInstantiated,
+            nullability: nullability);
 
   @override
   FunctionTypedElement get element {
@@ -303,6 +344,14 @@
     }
     return _computedElement;
   }
+
+  @override
+  TypeImpl withNullability(Nullability nullability) {
+    if (this.nullability == nullability) return this;
+    return DeferredFunctionTypeImpl(
+        _computeElement, name, typeArguments, isInstantiated,
+        nullability: nullability);
+  }
 }
 
 /**
@@ -310,14 +359,35 @@
  */
 class DynamicTypeImpl extends TypeImpl {
   /**
-   * The unique instance of this class.
+   * The unique instance of this class, with indeterminate nullability.
    */
-  static final DynamicTypeImpl instance = new DynamicTypeImpl._();
+  static final DynamicTypeImpl instance = instanceIndeterminate;
+
+  /**
+   * The unique instance of this class, nullable.
+   */
+  static final DynamicTypeImpl instanceNullable =
+      new DynamicTypeImpl._(Nullability.nullable);
+
+  /**
+   * The unique instance of this class, with indeterminate nullability.
+   */
+  static final DynamicTypeImpl instanceIndeterminate =
+      new DynamicTypeImpl._(Nullability.indeterminate);
+
+  /**
+   * The unique instance of this class, non-nullable.
+   */
+  static final DynamicTypeImpl instanceNonNullable =
+      new DynamicTypeImpl._(Nullability.nonNullable);
+
+  @override
+  final Nullability nullability;
 
   /**
    * Prevent the creation of instances of this class.
    */
-  DynamicTypeImpl._()
+  DynamicTypeImpl._(this.nullability)
       : super(new DynamicElementImpl(), Keyword.DYNAMIC.lexeme) {
     (element as DynamicElementImpl).type = this;
   }
@@ -325,7 +395,8 @@
   /**
    * Constructor used by [CircularTypeImpl].
    */
-  DynamicTypeImpl._circular() : super(instance.element, Keyword.DYNAMIC.lexeme);
+  DynamicTypeImpl._circular(this.nullability)
+      : super(instance.element, Keyword.DYNAMIC.lexeme);
 
   @override
   int get hashCode => 1;
@@ -378,23 +449,41 @@
     }
     return this;
   }
+
+  @override
+  TypeImpl withNullability(Nullability nullability) {
+    switch (nullability) {
+      case Nullability.nullable:
+        return instanceNullable;
+      case Nullability.indeterminate:
+        return instanceIndeterminate;
+      case Nullability.nonNullable:
+        return instanceNonNullable;
+    }
+    throw StateError('Unexpected nullability: $nullability');
+  }
 }
 
 /**
  * The type of a function, method, constructor, getter, or setter.
  */
 abstract class FunctionTypeImpl extends TypeImpl implements FunctionType {
+  @override
+  final Nullability nullability;
+
   /**
    * Initialize a newly created function type to be declared by the given
    * [element], and also initialize [typeArguments] to match the
    * [typeParameters], which permits later substitution.
    */
-  factory FunctionTypeImpl(FunctionTypedElement element) {
+  factory FunctionTypeImpl(FunctionTypedElement element,
+      {Nullability nullability = Nullability.indeterminate}) {
     if (element is FunctionTypeAliasElement) {
       throw new StateError('Use FunctionTypeImpl.forTypedef for typedefs');
     }
     return new _FunctionTypeImplLazy._(
-        element, null, null, null, null, null, false);
+        element, null, null, null, null, null, false,
+        nullability: nullability);
   }
 
   /**
@@ -404,9 +493,11 @@
    * Note: this constructor mishandles generics.
    * See https://github.com/dart-lang/sdk/issues/34657.
    */
-  factory FunctionTypeImpl.forTypedef(FunctionTypeAliasElement element) {
+  factory FunctionTypeImpl.forTypedef(FunctionTypeAliasElement element,
+      {Nullability nullability = Nullability.indeterminate}) {
     return new _FunctionTypeImplLazy._(
-        element, element?.name, null, null, null, null, false);
+        element, element?.name, null, null, null, null, false,
+        nullability: nullability);
   }
 
   /**
@@ -417,7 +508,9 @@
    * If type formals is empty, this returns the original unless [force] is set
    * to [true].
    */
-  factory FunctionTypeImpl.fresh(FunctionType original, {bool force = false}) {
+  factory FunctionTypeImpl.fresh(FunctionType original,
+      {bool force = false,
+      Nullability nullability = Nullability.indeterminate}) {
     // We build up a substitution for the type parameters,
     // {variablesFresh/variables} then apply it.
 
@@ -465,19 +558,21 @@
     function.returnType = newType.returnType;
     function.typeParameters = freshVarElements;
     function.shareParameters(newType.parameters);
-    return function.type = new FunctionTypeImpl(function);
+    return function.type =
+        new FunctionTypeImpl(function, nullability: nullability);
   }
 
   /// Creates a function type that's not associated with any element in the
   /// element tree.
-  factory FunctionTypeImpl.synthetic(
-      DartType returnType,
-      List<TypeParameterElement> typeFormals,
-      List<ParameterElement> parameters) {
-    return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters);
+  factory FunctionTypeImpl.synthetic(DartType returnType,
+      List<TypeParameterElement> typeFormals, List<ParameterElement> parameters,
+      {Nullability nullability = Nullability.indeterminate}) {
+    return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters,
+        nullability: nullability);
   }
 
-  FunctionTypeImpl._(Element element, String name) : super(element, name);
+  FunctionTypeImpl._(Element element, String name, this.nullability)
+      : super(element, name);
 
   @deprecated
   @override
@@ -626,7 +721,8 @@
   }
 
   @override
-  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes) {
+  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes,
+      {bool withNullability = false}) {
     if (visitedTypes.add(this)) {
       if (typeFormals.isNotEmpty) {
         // To print a type with type variables, first make sure we have unique
@@ -661,7 +757,7 @@
           }
           TypeParameterTypeImpl t =
               new TypeParameterTypeImpl(new TypeParameterElementImpl(name, -1));
-          t.appendTo(buffer, visitedTypes);
+          t.appendTo(buffer, visitedTypes, withNullability: withNullability);
           instantiateTypeArgs.add(t);
           variables.add(e.type);
           if (e.bound != null) {
@@ -675,7 +771,9 @@
 
         // Instantiate it and print the resulting type. After instantiation, it
         // will no longer have typeFormals, so we will continue below.
-        this.instantiate(instantiateTypeArgs).appendTo(buffer, visitedTypes);
+        this
+            .instantiate(instantiateTypeArgs)
+            .appendTo(buffer, visitedTypes, withNullability: withNullability);
         return;
       }
 
@@ -704,7 +802,8 @@
       if (normalParameterTypes.isNotEmpty) {
         for (DartType type in normalParameterTypes) {
           writeSeparator();
-          (type as TypeImpl).appendTo(buffer, visitedTypes);
+          (type as TypeImpl)
+              .appendTo(buffer, visitedTypes, withNullability: withNullability);
         }
       }
       if (optionalParameterTypes.isNotEmpty) {
@@ -712,7 +811,8 @@
         buffer.write("[");
         for (DartType type in optionalParameterTypes) {
           writeSeparator();
-          (type as TypeImpl).appendTo(buffer, visitedTypes);
+          (type as TypeImpl)
+              .appendTo(buffer, visitedTypes, withNullability: withNullability);
         }
         buffer.write("]");
         needsComma = true;
@@ -724,7 +824,8 @@
           writeSeparator();
           buffer.write(name);
           buffer.write(": ");
-          (type as TypeImpl).appendTo(buffer, visitedTypes);
+          (type as TypeImpl)
+              .appendTo(buffer, visitedTypes, withNullability: withNullability);
         });
         buffer.write("}");
         needsComma = true;
@@ -734,7 +835,11 @@
       if (returnType == null) {
         buffer.write("null");
       } else {
-        (returnType as TypeImpl).appendTo(buffer, visitedTypes);
+        (returnType as TypeImpl)
+            .appendTo(buffer, visitedTypes, withNullability: withNullability);
+      }
+      if (withNullability) {
+        _appendNullability(buffer);
       }
       visitedTypes.remove(this);
     } else {
@@ -795,7 +900,7 @@
 
   @override
   bool isSubtypeOf(DartType type) {
-    var typeSystem = new StrongTypeSystemImpl(null);
+    var typeSystem = new Dart2TypeSystem(null);
     return FunctionTypeImpl.relate(
         typeSystem.instantiateToBounds(this),
         typeSystem.instantiateToBounds(type),
@@ -823,9 +928,9 @@
     if (identical(returnType, this.returnType) &&
         identical(parameters, this.parameters)) {
       return this;
-    } else {
-      return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters);
     }
+    return new _FunctionTypeImplStrict._(returnType, typeFormals, parameters,
+        nullability: nullability);
   }
 
   @override
@@ -1191,6 +1296,9 @@
  * A concrete implementation of an [InterfaceType].
  */
 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
+  @override
+  final Nullability nullability;
+
   /**
    * A list containing the actual types of the type arguments.
    */
@@ -1231,7 +1339,8 @@
   /**
    * Initialize a newly created type to be declared by the given [element].
    */
-  InterfaceTypeImpl(ClassElement element, [this.prunedTypedefs])
+  InterfaceTypeImpl(ClassElement element,
+      [this.prunedTypedefs, this.nullability = Nullability.indeterminate])
       : super(element, element.displayName);
 
   /**
@@ -1239,26 +1348,42 @@
    * with the given [name] and [typeArguments].
    */
   InterfaceTypeImpl.elementWithNameAndArgs(
-      ClassElement element, String name, this._typeArgumentsComputer)
+      ClassElement element, String name, this._typeArgumentsComputer,
+      {this.nullability = Nullability.indeterminate})
       : prunedTypedefs = null,
         super(element, name) {
     _typeArguments = null;
   }
 
+  InterfaceTypeImpl.explicit(ClassElement element, List<DartType> typeArguments,
+      {this.nullability = Nullability.indeterminate})
+      : prunedTypedefs = null,
+        _typeArguments = typeArguments,
+        super(element, element.displayName);
+
   /**
    * Initialize a newly created type to have the given [name]. This constructor
    * should only be used in cases where there is no declaration of the type.
    */
-  InterfaceTypeImpl.named(String name)
+  InterfaceTypeImpl.named(String name,
+      {this.nullability = Nullability.indeterminate})
       : prunedTypedefs = null,
         super(null, name);
 
   /**
    * Private constructor.
    */
-  InterfaceTypeImpl._(Element element, String name, this.prunedTypedefs)
+  InterfaceTypeImpl._(Element element, String name, this.prunedTypedefs,
+      {this.nullability = Nullability.indeterminate})
       : super(element, name);
 
+  InterfaceTypeImpl._withNullability(InterfaceTypeImpl original,
+      {this.nullability = Nullability.indeterminate})
+      : _typeArguments = original._typeArguments,
+        _typeArgumentsComputer = original._typeArgumentsComputer,
+        prunedTypedefs = original.prunedTypedefs,
+        super(original.element, original.name);
+
   @override
   List<PropertyAccessorElement> get accessors {
     _flushCachedMembersIfStale();
@@ -1380,6 +1505,15 @@
   }
 
   @override
+  bool get isDartCoreInt {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "int" && element.library.isDartCore;
+  }
+
+  @override
   bool get isDartCoreNull {
     ClassElement element = this.element;
     if (element == null) {
@@ -1471,7 +1605,8 @@
   }
 
   @override
-  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes) {
+  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes,
+      {bool withNullability = false}) {
     if (visitedTypes.add(this)) {
       buffer.write(name);
       int argumentCount = typeArguments.length;
@@ -1481,10 +1616,14 @@
           if (i > 0) {
             buffer.write(", ");
           }
-          (typeArguments[i] as TypeImpl).appendTo(buffer, visitedTypes);
+          (typeArguments[i] as TypeImpl)
+              .appendTo(buffer, visitedTypes, withNullability: withNullability);
         }
         buffer.write(">");
       }
+      if (withNullability) {
+        _appendNullability(buffer);
+      }
       visitedTypes.remove(this);
     } else {
       buffer.write('<recursive>');
@@ -2042,7 +2181,8 @@
       // alias, and function type aliases are always expanded by starting with
       // base types.
       assert(this.prunedTypedefs == null);
-      InterfaceTypeImpl result = new InterfaceTypeImpl._(element, name, prune);
+      InterfaceTypeImpl result = new InterfaceTypeImpl._(element, name, prune,
+          nullability: nullability);
       result.typeArguments = typeArguments
           .map((DartType t) => (t as TypeImpl).pruned(prune))
           .toList();
@@ -2053,6 +2193,16 @@
   @override
   DartType replaceTopAndBottom(TypeProvider typeProvider,
       {bool isCovariant: true}) {
+    // First check if this is actually an instance of Bottom
+    if (this.isDartCoreNull) {
+      if (isCovariant) {
+        return this;
+      } else {
+        return typeProvider.objectType;
+      }
+    }
+
+    // Otherwise, recurse over type arguments.
     var typeArguments = _transformOrShare(
         this.typeArguments,
         (t) => (t as TypeImpl)
@@ -2060,7 +2210,8 @@
     if (identical(typeArguments, this.typeArguments)) {
       return this;
     } else {
-      return new InterfaceTypeImpl._(element, name, prunedTypedefs)
+      return new InterfaceTypeImpl._(element, name, prunedTypedefs,
+          nullability: nullability)
         ..typeArguments = typeArguments;
     }
   }
@@ -2083,7 +2234,8 @@
       return this;
     }
 
-    InterfaceTypeImpl newType = new InterfaceTypeImpl(element, prune);
+    InterfaceTypeImpl newType =
+        new InterfaceTypeImpl(element, prune, nullability);
     newType.typeArguments = newTypeArguments;
     return newType;
   }
@@ -2093,6 +2245,12 @@
   InterfaceTypeImpl substitute4(List<DartType> argumentTypes) =>
       instantiate(argumentTypes);
 
+  @override
+  TypeImpl withNullability(Nullability nullability) {
+    if (this.nullability == nullability) return this;
+    return InterfaceTypeImpl._withNullability(this, nullability: nullability);
+  }
+
   /**
    * Flush cache members if the version of [element] for which members are
    * cached and the current version of the [element].
@@ -2439,7 +2597,21 @@
         lubArguments[i] = DynamicTypeImpl.instance;
       }
     }
-    InterfaceTypeImpl lub = new InterfaceTypeImpl(firstElement);
+
+    Nullability computeNullability() {
+      Nullability first = (firstType as InterfaceTypeImpl).nullability;
+      Nullability second = (secondType as InterfaceTypeImpl).nullability;
+      if (first == Nullability.nullable || second == Nullability.nullable) {
+        return Nullability.nullable;
+      } else if (first == Nullability.indeterminate ||
+          second == Nullability.indeterminate) {
+        return Nullability.indeterminate;
+      }
+      return Nullability.nonNullable;
+    }
+
+    InterfaceTypeImpl lub =
+        new InterfaceTypeImpl(firstElement, null, computeNullability());
     lub.typeArguments = lubArguments;
     return lub;
   }
@@ -2505,6 +2677,27 @@
 }
 
 /**
+ * The nullability of a type.
+ */
+enum Nullability {
+  /**
+   * An indication that the type includes the value `null`.
+   */
+  nullable,
+
+  /**
+   * An indication that the type is a legacy type which may be interpreted as
+   * either nullable or non-nullable as appropriate.
+   */
+  indeterminate,
+
+  /**
+   * An indication that the type does not include the value `null`.
+   */
+  nonNullable
+}
+
+/**
  * The abstract class `TypeImpl` implements the behavior common to objects
  * representing the declared type of elements in the element model.
  */
@@ -2545,6 +2738,9 @@
   bool get isDartCoreFunction => false;
 
   @override
+  bool get isDartCoreInt => false;
+
+  @override
   bool get isDartCoreNull => false;
 
   @override
@@ -2560,10 +2756,16 @@
   bool get isVoid => false;
 
   /**
+   * Return the nullability of this type.
+   */
+  Nullability get nullability;
+
+  /**
    * Append a textual representation of this type to the given [buffer]. The set
    * of [visitedTypes] is used to prevent infinite recursion.
    */
-  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes) {
+  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes,
+      {bool withNullability = false}) {
     if (visitedTypes.add(this)) {
       if (name == null) {
         buffer.write("<unnamed type>");
@@ -2574,6 +2776,9 @@
     } else {
       buffer.write('<recursive>');
     }
+    if (withNullability) {
+      _appendNullability(buffer);
+    }
   }
 
   @override
@@ -2677,13 +2882,32 @@
       [List<FunctionTypeAliasElement> prune]);
 
   @override
-  String toString() {
+  String toString({bool withNullability = false}) {
     StringBuffer buffer = new StringBuffer();
-    appendTo(buffer, new Set.identity());
+    appendTo(buffer, new Set.identity(), withNullability: withNullability);
     return buffer.toString();
   }
 
   /**
+   * Return the same type, but with the given [nullability].
+   */
+  TypeImpl withNullability(Nullability nullability);
+
+  void _appendNullability(StringBuffer buffer) {
+    switch (nullability) {
+      case Nullability.nullable:
+        buffer.write('?');
+        break;
+      case Nullability.indeterminate:
+        buffer.write('*');
+        break;
+      case Nullability.nonNullable:
+        buffer.write('!');
+        break;
+    }
+  }
+
+  /**
    * Return `true` if corresponding elements of the [first] and [second] lists
    * of type arguments are all equal.
    */
@@ -2765,11 +2989,15 @@
 
   static bool _appendingBounds = false;
 
+  @override
+  final Nullability nullability;
+
   /**
    * Initialize a newly created type parameter type to be declared by the given
    * [element] and to have the given name.
    */
-  TypeParameterTypeImpl(TypeParameterElement element)
+  TypeParameterTypeImpl(TypeParameterElement element,
+      {this.nullability = Nullability.indeterminate})
       : super(element, element.name);
 
   @override
@@ -2806,8 +3034,9 @@
    * Append a textual representation of this type to the given [buffer]. The set
    * of [visitedTypes] is used to prevent infinite recursion.
    */
-  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes) {
-    super.appendTo(buffer, visitedTypes);
+  void appendTo(StringBuffer buffer, Set<TypeImpl> visitedTypes,
+      {bool withNullability = false}) {
+    super.appendTo(buffer, visitedTypes, withNullability: withNullability);
     TypeParameterElement e = element;
     if (e is TypeParameterMember &&
         e.bound != e.baseElement.bound &&
@@ -2816,7 +3045,8 @@
       // If we're appending bounds already, we don't want to do it recursively.
       _appendingBounds = true;
       try {
-        (e.bound as TypeImpl).appendTo(buffer, visitedTypes);
+        (e.bound as TypeImpl)
+            .appendTo(buffer, visitedTypes, withNullability: withNullability);
       } finally {
         _appendingBounds = false;
       }
@@ -2923,12 +3153,38 @@
     int length = parameterTypes.length;
     for (int i = 0; i < length; i++) {
       if (parameterTypes[i] == this) {
-        return argumentTypes[i];
+        TypeImpl argumentType = argumentTypes[i];
+
+        // TODO(scheglov) It should not happen, but sometimes arguments are null.
+        if (argumentType == null) {
+          return argumentType;
+        }
+
+        // TODO(scheglov) Proposed substitution rules for nullability.
+        Nullability resultNullability;
+        Nullability argumentNullability = argumentType.nullability;
+        if (argumentNullability == Nullability.nullable ||
+            nullability == Nullability.nullable) {
+          resultNullability = Nullability.nullable;
+        } else if (argumentNullability == Nullability.indeterminate ||
+            nullability == Nullability.indeterminate) {
+          resultNullability = Nullability.indeterminate;
+        } else {
+          resultNullability = Nullability.nonNullable;
+        }
+
+        return argumentType.withNullability(resultNullability);
       }
     }
     return this;
   }
 
+  @override
+  TypeImpl withNullability(Nullability nullability) {
+    if (this.nullability == nullability) return this;
+    return TypeParameterTypeImpl(element, nullability: nullability);
+  }
+
   /**
    * Return a list containing the type parameter types defined by the given
    * array of type parameter elements ([typeParameters]).
@@ -2976,6 +3232,9 @@
   bool get isUndefined => true;
 
   @override
+  Nullability get nullability => Nullability.indeterminate;
+
+  @override
   bool operator ==(Object object) => identical(object, this);
 
   @override
@@ -3020,6 +3279,9 @@
     }
     return this;
   }
+
+  @override
+  TypeImpl withNullability(Nullability nullability) => this;
 }
 
 /**
@@ -3036,14 +3298,35 @@
  */
 class VoidTypeImpl extends TypeImpl implements VoidType {
   /**
-   * The unique instance of this class.
+   * The unique instance of this class, with indeterminate nullability.
    */
-  static final VoidTypeImpl instance = new VoidTypeImpl._();
+  static final VoidTypeImpl instance = instanceIndeterminate;
+
+  /**
+   * The unique instance of this class, nullable.
+   */
+  static final VoidTypeImpl instanceNullable =
+      new VoidTypeImpl._(Nullability.nullable);
+
+  /**
+   * The unique instance of this class, with indeterminate nullability.
+   */
+  static final VoidTypeImpl instanceIndeterminate =
+      new VoidTypeImpl._(Nullability.indeterminate);
+
+  /**
+   * The unique instance of this class, non-nullable.
+   */
+  static final VoidTypeImpl instanceNonNullable =
+      new VoidTypeImpl._(Nullability.nonNullable);
+
+  @override
+  final Nullability nullability;
 
   /**
    * Prevent the creation of instances of this class.
    */
-  VoidTypeImpl._() : super(null, Keyword.VOID.lexeme);
+  VoidTypeImpl._(this.nullability) : super(null, Keyword.VOID.lexeme);
 
   @override
   int get hashCode => 2;
@@ -3086,6 +3369,19 @@
           List<DartType> argumentTypes, List<DartType> parameterTypes,
           [List<FunctionTypeAliasElement> prune]) =>
       this;
+
+  @override
+  TypeImpl withNullability(Nullability nullability) {
+    switch (nullability) {
+      case Nullability.nullable:
+        return instanceNullable;
+      case Nullability.indeterminate:
+        return instanceIndeterminate;
+      case Nullability.nonNullable:
+        return instanceNonNullable;
+    }
+    throw StateError('Unexpected nullability: $nullability');
+  }
 }
 
 /**
@@ -3136,9 +3432,10 @@
       this._typeArguments,
       this._returnType,
       this._parameters,
-      this._isInstantiated)
+      this._isInstantiated,
+      {Nullability nullability = Nullability.indeterminate})
       : _typeParameters = null,
-        super._(element, name);
+        super._(element, name, nullability);
 
   /**
    * Return the base parameter elements of this function element.
@@ -3344,7 +3641,8 @@
     newTypeArgs.addAll(argumentTypes);
 
     return new _FunctionTypeImplLazy._(element, name, prunedTypedefs,
-        newTypeArgs, _returnType, _parameters, true);
+        newTypeArgs, _returnType, _parameters, true,
+        nullability: nullability);
   }
 
   @override
@@ -3365,7 +3663,8 @@
           .map((DartType t) => (t as TypeImpl).pruned(prune))
           .toList(growable: false);
       return new _FunctionTypeImplLazy._(element, name, prune, typeArgs,
-          _returnType, _parameters, _isInstantiated);
+          _returnType, _parameters, _isInstantiated,
+          nullability: nullability);
     }
   }
 
@@ -3393,7 +3692,16 @@
     List<DartType> typeArgs =
         TypeImpl.substitute(typeArguments, argumentTypes, parameterTypes);
     return new _FunctionTypeImplLazy._(element, name, prune, typeArgs,
-        _returnType, _parameters, _isInstantiated);
+        _returnType, _parameters, _isInstantiated,
+        nullability: nullability);
+  }
+
+  @override
+  TypeImpl withNullability(Nullability nullability) {
+    if (this.nullability == nullability) return this;
+    return _FunctionTypeImplLazy._(element, name, prunedTypedefs,
+        _typeArguments, _returnType, _parameters, _isInstantiated,
+        nullability: nullability);
   }
 
   @override
@@ -3440,8 +3748,9 @@
   @override
   final List<ParameterElement> parameters;
 
-  _FunctionTypeImplStrict._(this.returnType, this.typeFormals, this.parameters)
-      : super._(null, null);
+  _FunctionTypeImplStrict._(this.returnType, this.typeFormals, this.parameters,
+      {Nullability nullability = Nullability.indeterminate})
+      : super._(null, null, nullability);
 
   @override
   List<TypeParameterElement> get boundTypeParameters => typeFormals;
@@ -3496,7 +3805,8 @@
     return new _FunctionTypeImplStrict._(
         returnType.substitute2(argumentTypes, parameterTypes),
         const [],
-        _transformOrShare(parameters, transformParameter));
+        _transformOrShare(parameters, transformParameter),
+        nullability: nullability);
   }
 
   @override
@@ -3555,7 +3865,15 @@
       return this;
     }
     return new _FunctionTypeImplStrict._(
-        newReturnType, newTypeFormals, newParameters);
+        newReturnType, newTypeFormals, newParameters,
+        nullability: nullability);
+  }
+
+  @override
+  TypeImpl withNullability(Nullability nullability) {
+    if (this.nullability == nullability) return this;
+    return _FunctionTypeImplStrict._(returnType, typeFormals, parameters,
+        nullability: nullability);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/wrapped.dart b/pkg/analyzer/lib/src/dart/element/wrapped.dart
index aaad9cd..3c6f7f1 100644
--- a/pkg/analyzer/lib/src/dart/element/wrapped.dart
+++ b/pkg/analyzer/lib/src/dart/element/wrapped.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart' hide Directive;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -64,6 +65,9 @@
   bool get hasJS => wrappedUnit.hasJS;
 
   @override
+  bool get hasLiteral => wrappedUnit.hasLiteral;
+
+  @override
   bool get hasLoadLibraryFunction => wrappedUnit.hasLoadLibraryFunction;
 
   @override
@@ -151,6 +155,9 @@
   int get nameOffset => wrappedUnit.nameOffset;
 
   @override
+  AnalysisSession get session => wrappedUnit.session;
+
+  @override
   Source get source => wrappedUnit.source;
 
   @override
@@ -160,6 +167,7 @@
   @override
   List<ClassElement> get types => wrappedUnit.types;
 
+  @deprecated
   @override
   CompilationUnit get unit => wrappedUnit.unit;
 
@@ -179,6 +187,7 @@
   String computeDocumentationComment() => wrappedUnit
       .computeDocumentationComment(); // ignore: deprecated_member_use
 
+  @deprecated
   @override
   CompilationUnit computeNode() => wrappedUnit.computeNode();
 
@@ -249,6 +258,9 @@
   bool get hasJS => wrappedImport.hasJS;
 
   @override
+  bool get hasLiteral => wrappedImport.hasLiteral;
+
+  @override
   bool get hasOverride => wrappedImport.hasOverride;
 
   @override
@@ -342,8 +354,12 @@
   int get prefixOffset => wrappedImport.prefixOffset;
 
   @override
+  AnalysisSession get session => wrappedImport.session;
+
+  @override
   Source get source => wrappedImport.source;
 
+  @deprecated
   @override
   CompilationUnit get unit => wrappedImport.unit;
 
@@ -363,6 +379,7 @@
   String computeDocumentationComment() => wrappedImport
       .computeDocumentationComment(); // ignore: deprecated_member_use
 
+  @deprecated
   @override
   AstNode computeNode() => wrappedImport.computeNode();
 
@@ -443,6 +460,9 @@
   bool get hasJS => wrappedLib.hasJS;
 
   @override
+  bool get hasLiteral => wrappedLib.hasLiteral;
+
+  @override
   bool get hasLoadLibraryFunction => wrappedLib.hasLoadLibraryFunction;
 
   @override
@@ -560,9 +580,16 @@
   Namespace get publicNamespace => wrappedLib.publicNamespace;
 
   @override
+  AnalysisSession get session => wrappedLib.session;
+
+  @override
   Source get source => wrappedLib.source;
 
   @override
+  Iterable<Element> get topLevelElements => wrappedLib.topLevelElements;
+
+  @deprecated
+  @override
   CompilationUnit get unit => wrappedLib.unit;
 
   @override
@@ -575,6 +602,7 @@
   String computeDocumentationComment() =>
       wrappedLib.computeDocumentationComment(); // ignore: deprecated_member_use
 
+  @deprecated
   @override
   AstNode computeNode() => wrappedLib.computeNode();
 
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index de302ca8..62c6a8a 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -11,19 +11,6 @@
  */
 class HintCode extends ErrorCode {
   /**
-   * This hint is generated anywhere where the
-   * [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE] would have been generated,
-   * if we used propagated information for the warnings.
-   *
-   * Parameters:
-   * 0: the name of the actual argument type
-   * 1: the name of the expected type
-   */
-  static const HintCode ARGUMENT_TYPE_NOT_ASSIGNABLE = const HintCode(
-      'ARGUMENT_TYPE_NOT_ASSIGNABLE',
-      "The argument type '{0}' can't be assigned to the parameter type '{1}'.");
-
-  /**
    * When the target expression uses '?.' operator, it can be `null`, so all the
    * subsequent invocations should also use '?.' operator.
    */
@@ -81,6 +68,23 @@
           "Try replacing the use of the deprecated member with the replacement.");
 
   /**
+   * Deprecated members should not be invoked or used from within the package
+   * where they are declared.
+   *
+   * Intentionally separate from DEPRECATED_MEMBER_USE, so that package owners
+   * can ignore same-package deprecate member use Hints if they like, and
+   * continue to see cross-package deprecated member use Hints.
+   *
+   * Parameters:
+   * 0: the name of the member
+   */
+  static const HintCode DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE = const HintCode(
+      'DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE',
+      "'{0}' is deprecated and shouldn't be used.",
+      correction:
+          "Try replacing the use of the deprecated member with the replacement.");
+
+  /**
    * Users should not create a class named `Function` anymore.
    */
   static const HintCode DEPRECATED_FUNCTION_CLASS_DECLARATION = const HintCode(
@@ -163,15 +167,6 @@
           correction: "Try using a package: URI instead.");
 
   /**
-   * Generic type comments (`/*<T>*/` and `/*=T*/`) are no longer necessary and
-   * will soon be ignored.
-   */
-  static const HintCode GENERIC_METHOD_COMMENT = const HintCode(
-      'GENERIC_METHOD_COMMENT',
-      "The generic type comment is being deprecated in favor of the real syntax.",
-      correction: "Try replacing the comment with the actual type annotation.");
-
-  /**
    * Deferred libraries shouldn't define a top level function 'loadLibrary'.
    */
   static const HintCode IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION =
@@ -183,21 +178,6 @@
               "rename the function in the imported library.");
 
   /**
-   * This hint is generated anywhere where the
-   * [StaticTypeWarningCode.INVALID_ASSIGNMENT] would have been generated, if we
-   * used propagated information for the warnings.
-   *
-   * Parameters:
-   * 0: the name of the right hand side type
-   * 1: the name of the left hand side type
-   */
-  static const HintCode INVALID_ASSIGNMENT = const HintCode(
-      'INVALID_ASSIGNMENT',
-      "A value of type '{0}' can't be assigned to a variable of type '{1}'.",
-      correction: "Try changing the type of the variable, or "
-          "casting the right-hand type to '{1}'.");
-
-  /**
    * This hint is generated anywhere a @factory annotation is associated with
    * anything other than a method.
    */
@@ -234,40 +214,12 @@
       "Only classes can be annotated as being immutable.");
 
   /**
-   * Generic Method DEP: number of type parameters must match.
-   * <https://github.com/leafpetersen/dep-generic-methods/blob/master/proposal.md#function-subtyping>
-   *
-   * Parameters:
-   * 0: the number of type parameters in the method
-   * 1: the number of type parameters in the overridden method
-   * 2: the name of the class where the overridden method is declared
+   * This hint is generated anywhere a @literal annotation is associated with
+   * anything other than a const constructor.
    */
-  static const HintCode INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS =
-      const HintCode(
-          'INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS',
-          "The method has {0} type parameters, but it is overriding a method "
-          "with {1} type parameters from '{2}'.",
-          correction:
-              "Try changing the number of type parameters so that they are the same.");
-
-  /**
-   * Generic Method DEP: bounds of type parameters must be compatible.
-   * <https://github.com/leafpetersen/dep-generic-methods/blob/master/proposal.md#function-subtyping>
-   *
-   * Parameters:
-   * 0: the type parameter name
-   * 1: the type parameter bound
-   * 2: the overridden type parameter name
-   * 3: the overridden type parameter bound
-   * 4: the name of the class where the overridden method is declared
-   */
-  static const HintCode INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND =
-      const HintCode(
-          'INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND',
-          "The type parameter '{0}' extends '{1}', but that is stricter than "
-          "'{2}' extends '{3}' in the overridden method from '{4}'.",
-          correction:
-              "Try changing the bounds on the type parameters so that they are compatible.");
+  static const HintCode INVALID_LITERAL_ANNOTATION = const HintCode(
+      'INVALID_LITERAL_ANNOTATION',
+      "Only const constructors can be annotated as being literal.");
 
   /**
    * This hint is generated anywhere where `@required` annotates a non named
@@ -284,15 +236,15 @@
 
   /**
    * This hint is generated anywhere where `@sealed` annotates something other
-   * than a class or mixin.
+   * than a class.
    *
    * Parameters:
    * 0: the name of the member
    */
   static const HintCode INVALID_SEALED_ANNOTATION = const HintCode(
       'INVALID_SEALED_ANNOTATION',
-      "The member '{0}' is annotated with @sealed but only classes and mixins "
-      "can be annotated with it.",
+      "The member '{0}' is annotated with '@sealed' but only classes can be "
+      "annotated with it.",
       correction: "Remove @sealed.");
 
   /**
@@ -413,13 +365,26 @@
           "or changing the return type to 'void'.");
 
   /**
+   * This hint is generated anywhere where a `@sealed` class is used as a
+   * a superclass constraint of a mixin.
+   */
+  static const HintCode MIXIN_ON_SEALED_CLASS = const HintCode(
+      'MIXIN_ON_SEALED_CLASS',
+      "The class '{0}' should not be used as a mixin constraint because it is "
+      "sealed, and any class mixing in this mixin has '{0}' as a superclass.",
+      correction:
+          "Try composing with this class, or refer to its documentation for "
+          "more information.");
+
+  /**
    * Generate a hint for classes that inherit from classes annotated with
    * `@immutable` but that are not immutable.
    */
   static const HintCode MUST_BE_IMMUTABLE = const HintCode(
       'MUST_BE_IMMUTABLE',
-      "This class inherits from a class marked as @immutable, "
-      "and therefore should be immutable (all instance fields must be final).");
+      "This class (or a class which this class inherits from) is marked as "
+      "'@immutable', but one or more of its instance fields are not final: "
+      "{0}");
 
   /**
    * Generate a hint for methods that override methods annotated `@mustCallSuper`
@@ -434,6 +399,27 @@
       "but does not invoke the overridden method.");
 
   /**
+   * Generate a hint for non-const instance creation using a constructor
+   * annotated with `@literal`.
+   */
+  static const HintCode NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR = const HintCode(
+      'NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR',
+      "This instance creation must be 'const', because the {0} constructor is "
+      "marked as '@literal'.",
+      correction: "Try adding a 'const' keyword.");
+
+  /**
+   * Generate a hint for non-const instance creation (with the `new` keyword)
+   * using a constructor annotated with `@literal`.
+   */
+  static const HintCode NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW =
+      const HintCode(
+          'NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW',
+          "This instance creation must be 'const', because the {0} constructor is "
+          "marked as '@literal'.",
+          correction: "Try replacing the 'new' keyword with 'const'.");
+
+  /**
    * When the left operand of a binary expression uses '?.' operator, it can be
    * `null`.
    */
@@ -468,6 +454,8 @@
    * Parameters:
    * 0: the name of the current class
    */
+  // TODO(brianwilkerson) Decide whether we want to implement this check
+  //  (possibly as a lint) or remove the hint code.
   static const HintCode OVERRIDE_EQUALS_BUT_NOT_HASH_CODE = const HintCode(
       'OVERRIDE_EQUALS_BUT_NOT_HASH_CODE',
       "The class '{0}' overrides 'operator==', but not 'get hashCode'.",
@@ -520,6 +508,30 @@
       "A package import shouldn't contain '..'.");
 
   /**
+   * A class defined in `dart:async` that was not exported from `dart:core`
+   * before version 2.1 is being referenced via `dart:core` in code that is
+   * expected to run on earlier versions.
+   */
+  static const HintCode SDK_VERSION_ASYNC_EXPORTED_FROM_CORE = const HintCode(
+      'SDK_VERSION_ASYNC_EXPORTED_FROM_CORE',
+      "The class '{0}' was not exported from 'dart:core' until version 2.1, "
+      "but this code is required to be able to run on earlier versions.",
+      correction:
+          "Try either importing 'dart:async' or updating the SDK constraints.");
+
+  /**
+   * This hint is generated anywhere where a `@sealed` class or mixin is used as
+   * a super-type of a class.
+   */
+  static const HintCode SUBTYPE_OF_SEALED_CLASS = const HintCode(
+      'SUBTYPE_OF_SEALED_CLASS',
+      "The class '{0}' should not be extended, mixed in, or implemented "
+      "because it is sealed.",
+      correction:
+          "Try composing instead of inheriting, or refer to its documentation "
+          "for more information.");
+
+  /**
    * Type checks of the type `x is! Null` should be done with `x != null`.
    */
   static const HintCode TYPE_CHECK_IS_NOT_NULL = const HintCode(
@@ -535,21 +547,6 @@
       correction: "Try replacing the 'is Null' check with '== null'.");
 
   /**
-   * This hint is generated anywhere where the
-   * [StaticTypeWarningCode.UNDEFINED_GETTER] or
-   * [StaticWarningCode.UNDEFINED_GETTER] would have been generated, if we used
-   * propagated information for the warnings.
-   *
-   * Parameters:
-   * 0: the name of the getter
-   * 1: the name of the enclosing type where the getter is being looked for
-   */
-  static const HintCode UNDEFINED_GETTER = const HintCode(
-      'UNDEFINED_GETTER', "The getter '{0}' isn't defined for the class '{1}'.",
-      correction:
-          "Try defining a getter or field named '{0}', or invoke a different getter.");
-
-  /**
    * An undefined name hidden in an import or export directive.
    */
   static const HintCode UNDEFINED_HIDDEN_NAME = const HintCode(
@@ -558,50 +555,6 @@
       correction: "Try removing the name from the list of hidden members.");
 
   /**
-   * This hint is generated anywhere where the
-   * [StaticTypeWarningCode.UNDEFINED_METHOD] would have been generated, if we
-   * used propagated information for the warnings.
-   *
-   * Parameters:
-   * 0: the name of the method that is undefined
-   * 1: the resolved type name that the method lookup is happening on
-   */
-  static const HintCode UNDEFINED_METHOD = const HintCode(
-      'UNDEFINED_METHOD', "The method '{0}' isn't defined for the class '{1}'.",
-      correction:
-          "Try correcting the name to the name of an existing method, or "
-          "defining a method named '{0}'.");
-
-  /**
-   * This hint is generated anywhere where the
-   * [StaticTypeWarningCode.UNDEFINED_OPERATOR] would have been generated, if we
-   * used propagated information for the warnings.
-   *
-   * Parameters:
-   * 0: the name of the operator
-   * 1: the name of the enclosing type where the operator is being looked for
-   */
-  static const HintCode UNDEFINED_OPERATOR = const HintCode(
-      'UNDEFINED_OPERATOR',
-      "The operator '{0}' isn't defined for the class '{1}'.",
-      correction: "Try defining the operator '{0}'.");
-
-  /**
-   * This hint is generated anywhere where the
-   * [StaticTypeWarningCode.UNDEFINED_SETTER] or
-   * [StaticWarningCode.UNDEFINED_SETTER] would have been generated, if we used
-   * propagated information for the warnings.
-   *
-   * Parameters:
-   * 0: the name of the setter
-   * 1: the name of the enclosing type where the setter is being looked for
-   */
-  static const HintCode UNDEFINED_SETTER = const HintCode(
-      'UNDEFINED_SETTER', "The setter '{0}' isn't defined for the class '{1}'.",
-      correction:
-          "Try defining a setter or field named '{0}', or invoke a different setter.");
-
-  /**
    * An undefined name shown in an import or export directive.
    */
   static const HintCode UNDEFINED_SHOWN_NAME = const HintCode(
@@ -707,21 +660,6 @@
       correction: "Try removing the name from the list of shown members.");
 
   /**
-   * It will be a static type warning if <i>m</i> is not a generic method with
-   * exactly <i>n</i> type parameters.
-   *
-   * Parameters:
-   * 0: the name of the method being referenced (<i>G</i>)
-   * 1: the number of type parameters that were declared
-   * 2: the number of type arguments provided
-   */
-  static const HintCode WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD = const HintCode(
-      'WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD',
-      "The method '{0}' is declared with {1} type parameters, "
-      "but {2} type arguments were given.",
-      correction: "Try adjusting the number of type arguments.");
-
-  /**
    * Initialize a newly created error code to have the given [name]. The message
    * associated with the error will be created from the given [message]
    * template. The correction associated with the error will be created from the
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index e689cd1..2d00fd9 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -56,11 +56,10 @@
 
   static const ParserErrorCode BREAK_OUTSIDE_OF_LOOP = _BREAK_OUTSIDE_OF_LOOP;
 
-  static const ParserErrorCode CATCH_SYNTAX = const ParserErrorCode(
-      'CATCH_SYNTAX',
-      "'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
-      correction:
-          "No types are needed, the first is given by 'on', the second is always 'StackTrace'.");
+  static const ParserErrorCode CATCH_SYNTAX = _CATCH_SYNTAX;
+
+  static const ParserErrorCode CATCH_SYNTAX_EXTRA_PARAMETERS =
+      _CATCH_SYNTAX_EXTRA_PARAMETERS;
 
   static const ParserErrorCode CLASS_IN_CLASS = _CLASS_IN_CLASS;
 
@@ -202,13 +201,16 @@
   static const ParserErrorCode EXTERNAL_CLASS = _EXTERNAL_CLASS;
 
   static const ParserErrorCode EXTERNAL_CONSTRUCTOR_WITH_BODY =
-      const ParserErrorCode('EXTERNAL_CONSTRUCTOR_WITH_BODY',
-          "External constructors can't have a body.",
-          correction: "Try removing the body of the constructor, or "
-              "removing the keyword 'external'.");
+      _EXTERNAL_CONSTRUCTOR_WITH_BODY;
 
   static const ParserErrorCode EXTERNAL_ENUM = _EXTERNAL_ENUM;
 
+  static const ParserErrorCode EXTERNAL_FACTORY_REDIRECTION =
+      _EXTERNAL_FACTORY_REDIRECTION;
+
+  static const ParserErrorCode EXTERNAL_FACTORY_WITH_BODY =
+      _EXTERNAL_FACTORY_WITH_BODY;
+
   static const ParserErrorCode EXTERNAL_FIELD = _EXTERNAL_FIELD;
 
   static const ParserErrorCode EXTERNAL_GETTER_WITH_BODY =
@@ -254,12 +256,12 @@
   static const ParserErrorCode FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR =
       _FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR;
 
+  static const ParserErrorCode FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS =
+      _FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS;
+
   static const ParserErrorCode FINAL_AND_COVARIANT = _FINAL_AND_COVARIANT;
 
-  static const ParserErrorCode FINAL_AND_VAR = const ParserErrorCode(
-      'FINAL_AND_VAR',
-      "Members can't be declared to be both 'final' and 'var'.",
-      correction: "Try removing the keyword 'var'.");
+  static const ParserErrorCode FINAL_AND_VAR = _FINAL_AND_VAR;
 
   static const ParserErrorCode FINAL_CLASS = const ParserErrorCode(
       'FINAL_CLASS', "Classes can't be declared to be 'final'.",
@@ -313,10 +315,7 @@
       _IMPORT_DIRECTIVE_AFTER_PART_DIRECTIVE;
 
   static const ParserErrorCode INITIALIZED_VARIABLE_IN_FOR_EACH =
-      const ParserErrorCode('INITIALIZED_VARIABLE_IN_FOR_EACH',
-          "The loop variable in a for-each loop can't be initialized.",
-          correction:
-              "Try removing the initializer, or using a different kind of loop.");
+      _INITIALIZED_VARIABLE_IN_FOR_EACH;
 
   static const ParserErrorCode INVALID_AWAIT_IN_FOR = _INVALID_AWAIT_IN_FOR;
 
@@ -360,11 +359,17 @@
   /**
    * Parameters:
    * 0: the operator being applied to 'super'
+   *
+   * Only generated by the old parser.
+   * Replaced by INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER.
    */
   static const ParserErrorCode INVALID_OPERATOR_FOR_SUPER =
       const ParserErrorCode('INVALID_OPERATOR_FOR_SUPER',
           "The operator '{0}' can't be used with 'super'.");
 
+  static const ParserErrorCode INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER =
+      _INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER;
+
   static const ParserErrorCode INVALID_STAR_AFTER_ASYNC = const ParserErrorCode(
       'INVALID_STAR_AFTER_ASYNC',
       "The modifier 'async*' isn't allowed for an expression function body.",
@@ -391,11 +396,8 @@
   static const ParserErrorCode MISSING_ASSIGNMENT_IN_INITIALIZER =
       _MISSING_ASSIGNMENT_IN_INITIALIZER;
 
-  static const ParserErrorCode MISSING_CATCH_OR_FINALLY = const ParserErrorCode(
-      'MISSING_CATCH_OR_FINALLY',
-      "A try statement must have either a catch or finally clause.",
-      correction: "Try adding either a catch or finally clause, or "
-          "remove the try statement.");
+  static const ParserErrorCode MISSING_CATCH_OR_FINALLY =
+      _MISSING_CATCH_OR_FINALLY;
 
   /// TODO(danrubel): Consider splitting this into two separate error messages.
   static const ParserErrorCode MISSING_CLASS_BODY = const ParserErrorCode(
@@ -643,10 +645,7 @@
       "Setters can't be defined within methods or functions.",
       correction: "Try moving the setter outside the method or function.");
 
-  static const ParserErrorCode STACK_OVERFLOW = const ParserErrorCode(
-      'STACK_OVERFLOW',
-      "The file has too many nested expressions or statements.",
-      correction: "Try simplifying the code.");
+  static const ParserErrorCode STACK_OVERFLOW = _STACK_OVERFLOW;
 
   static const ParserErrorCode STATIC_AFTER_CONST = _STATIC_AFTER_CONST;
 
@@ -720,10 +719,7 @@
           "Expected '{0}' to close parameter group.",
           correction: "Try replacing '{0}' with '{1}'.");
 
-  static const ParserErrorCode VAR_AND_TYPE = const ParserErrorCode(
-      'VAR_AND_TYPE',
-      "Variables can't be declared using both 'var' and a type name.",
-      correction: "Try removing the keyword 'var'.");
+  static const ParserErrorCode VAR_AND_TYPE = _VAR_AND_TYPE;
 
   static const ParserErrorCode VAR_AS_TYPE_NAME = _VAR_AS_TYPE_NAME;
 
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
index b523e42..c983796 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.g.dart
@@ -88,6 +88,18 @@
   _FACTORY_TOP_LEVEL_DECLARATION,
   _FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR,
   _FINAL_AND_COVARIANT,
+  _FINAL_AND_VAR,
+  _INITIALIZED_VARIABLE_IN_FOR_EACH,
+  _CATCH_SYNTAX_EXTRA_PARAMETERS,
+  _CATCH_SYNTAX,
+  _EXTERNAL_FACTORY_REDIRECTION,
+  _EXTERNAL_FACTORY_WITH_BODY,
+  _EXTERNAL_CONSTRUCTOR_WITH_BODY,
+  _FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS,
+  _VAR_AND_TYPE,
+  _INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER,
+  _STACK_OVERFLOW,
+  _MISSING_CATCH_OR_FINALLY,
 ];
 
 const ParserErrorCode _ABSTRACT_CLASS_MEMBER = const ParserErrorCode(
@@ -101,6 +113,17 @@
     r"A break statement can't be used outside of a loop or switch statement.",
     correction: "Try removing the break statement.");
 
+const ParserErrorCode _CATCH_SYNTAX = const ParserErrorCode('CATCH_SYNTAX',
+    r"'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
+    correction:
+        "No types are needed, the first is given by 'on', the second is always 'StackTrace'.");
+
+const ParserErrorCode _CATCH_SYNTAX_EXTRA_PARAMETERS = const ParserErrorCode(
+    'CATCH_SYNTAX_EXTRA_PARAMETERS',
+    r"'catch' must be followed by '(identifier)' or '(identifier, identifier)'.",
+    correction:
+        "No types are needed, the first is given by 'on', the second is always 'StackTrace'.");
+
 const ParserErrorCode _CLASS_IN_CLASS = const ParserErrorCode(
     'CLASS_IN_CLASS', r"Classes can't be declared inside other classes.",
     correction: "Try moving the class to the top-level.");
@@ -243,10 +266,25 @@
     'EXTERNAL_CLASS', r"Classes can't be declared to be 'external'.",
     correction: "Try removing the keyword 'external'.");
 
+const ParserErrorCode _EXTERNAL_CONSTRUCTOR_WITH_BODY = const ParserErrorCode(
+    'EXTERNAL_CONSTRUCTOR_WITH_BODY',
+    r"External constructors can't have a body.",
+    correction:
+        "Try removing the body of the constructor, or removing the keyword 'external'.");
+
 const ParserErrorCode _EXTERNAL_ENUM = const ParserErrorCode(
     'EXTERNAL_ENUM', r"Enums can't be declared to be 'external'.",
     correction: "Try removing the keyword 'external'.");
 
+const ParserErrorCode _EXTERNAL_FACTORY_REDIRECTION = const ParserErrorCode(
+    'EXTERNAL_FACTORY_REDIRECTION', r"A redirecting factory can't be external.",
+    correction: "Try removing the 'external' modifier.");
+
+const ParserErrorCode _EXTERNAL_FACTORY_WITH_BODY = const ParserErrorCode(
+    'EXTERNAL_FACTORY_WITH_BODY', r"External factories can't have a body.",
+    correction:
+        "Try removing the body of the factory, or removing the keyword 'external'.");
+
 const ParserErrorCode _EXTERNAL_FIELD = const ParserErrorCode(
     'EXTERNAL_FIELD', r"Fields can't be declared to be 'external'.",
     correction: "Try removing the keyword 'external'.");
@@ -268,6 +306,12 @@
     r"Top-level declarations can't be declared to be 'factory'.",
     correction: "Try removing the keyword 'factory'.");
 
+const ParserErrorCode _FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS =
+    const ParserErrorCode('FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS',
+        r"A field can only be initialized in it's declaring class",
+        correction:
+            "Try passing a value into the superclass constructor, or moving the initialization into the constructor body.");
+
 const ParserErrorCode _FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR =
     const ParserErrorCode('FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR',
         r"Field formal parameters can only be used in a constructor.",
@@ -278,6 +322,10 @@
     r"Members can't be declared to be both 'final' and 'covariant'.",
     correction: "Try removing either the 'final' or 'covariant' keyword.");
 
+const ParserErrorCode _FINAL_AND_VAR = const ParserErrorCode(
+    'FINAL_AND_VAR', r"Members can't be declared to be both 'final' and 'var'.",
+    correction: "Try removing the keyword 'var'.");
+
 const ParserErrorCode _ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE =
     const ParserErrorCode('ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE',
         r"Illegal assignment to non-assignable expression.");
@@ -303,6 +351,12 @@
         correction:
             "Try moving the import directives before the part directives.");
 
+const ParserErrorCode _INITIALIZED_VARIABLE_IN_FOR_EACH = const ParserErrorCode(
+    'INITIALIZED_VARIABLE_IN_FOR_EACH',
+    r"The loop variable in a for-each loop can't be initialized.",
+    correction:
+        "Try removing the initializer, or using a different kind of loop.");
+
 const ParserErrorCode _INVALID_AWAIT_IN_FOR = const ParserErrorCode(
     'INVALID_AWAIT_IN_FOR',
     r"The keyword 'await' isn't allowed for a normal 'for' statement.",
@@ -316,6 +370,11 @@
     'INVALID_OPERATOR',
     r"The string '#lexeme' isn't a user-definable operator.");
 
+const ParserErrorCode _INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER =
+    const ParserErrorCode('INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER',
+        r"The operator '?.' cannot be used with 'super' because 'super' cannot be null.",
+        correction: "Try replacing '?.' with '.'");
+
 const ParserErrorCode _INVALID_UNICODE_ESCAPE = const ParserErrorCode(
     'INVALID_UNICODE_ESCAPE',
     r"An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.");
@@ -336,6 +395,12 @@
         r"Expected an assignment after the field name.",
         correction: "To initialize a field, use the syntax 'name = value'.");
 
+const ParserErrorCode _MISSING_CATCH_OR_FINALLY = const ParserErrorCode(
+    'MISSING_CATCH_OR_FINALLY',
+    r"A try block must be followed by an 'on', 'catch', or 'finally' clause.",
+    correction:
+        "Try adding either a catch or finally clause, or remove the try statement.");
+
 const ParserErrorCode _MISSING_CONST_FINAL_VAR_OR_TYPE = const ParserErrorCode(
     'MISSING_CONST_FINAL_VAR_OR_TYPE',
     r"Variables must be declared using the keywords 'const', 'final', 'var' or a type name.",
@@ -412,6 +477,10 @@
         correction:
             "Try making this a factory constructor, or remove the redirection.");
 
+const ParserErrorCode _STACK_OVERFLOW = const ParserErrorCode('STACK_OVERFLOW',
+    r"The file has too many nested expressions or statements.",
+    correction: "Try simplifying the code.");
+
 const ParserErrorCode _STATIC_AFTER_CONST = const ParserErrorCode(
     'STATIC_AFTER_CONST',
     r"The modifier 'static' should be before the modifier 'const'.",
@@ -460,6 +529,10 @@
     r"Can't use type arguments with type variable '#name'.",
     correction: "Try removing the type arguments.");
 
+const ParserErrorCode _VAR_AND_TYPE = const ParserErrorCode('VAR_AND_TYPE',
+    r"Variables can't be declared using both 'var' and a type name.",
+    correction: "Try removing 'var.'");
+
 const ParserErrorCode _VAR_AS_TYPE_NAME = const ParserErrorCode(
     'VAR_AS_TYPE_NAME', r"The keyword 'var' can't be used as a type name.");
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart b/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
new file mode 100644
index 0000000..0b1cd1d
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
@@ -0,0 +1,793 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:meta/meta.dart';
+
+/// Object that tracks "assigned" status for local variables in a function body.
+///
+/// The client should create a new instance of tracker for a function body.
+///
+/// Each declared local variable must be added using [add].  If the variable
+/// is assigned at the declaration, it is not actually tracked.
+///
+/// For each read of a local variable [read] should be invoked, and for each
+/// write - [write].  If there is a  "read" of a variable before it is
+/// definitely written, the variable is added to output [readBeforeWritten].
+///
+/// For each AST node that affects definite assignment the client must invoke
+/// corresponding `beginX` and `endX` methods.  They will combine assignment
+/// facts registered in parts of AST. These invocations are expected to be
+/// performed as a part of the resolution pass over the AST.
+///
+/// In the examples below, Dart code is listed on the left, and the set of
+/// calls that need to be made to [DefiniteAssignmentTracker] are listed on
+/// the right.
+///
+///
+/// --------------------------------------------------
+/// Assignments.
+///
+/// When the LHS is a local variable, and the assignment is pure, i.e. uses
+/// operators `=` and `??=`, only the RHS is executed, and then the
+/// variable on the LHS is marked as definitely assigned.
+///
+/// ```dart
+/// int V1;      // add(V1)
+/// int V2;      // add(V2)
+/// V1 = 0;      // write(V1)
+/// V2 = V2;     // read(V2) => readBeforeWritten; write(V2)
+/// V1;          // read(V1) => OK
+/// V2;          // read(V2) => readBeforeWritten (already)
+/// ```
+///
+/// In compound assignments to a local variable, or assignments where the LHS
+/// is not a simple identifier, the LHS is executed first, and then the RHS.
+///
+/// ```dart
+/// int V1;                 // add(V1)
+/// List<int> V2;           // add(V2)
+/// V1 += 1;                // read(V1) => readBeforeWritten; write(V1)
+/// V2[0] = (V2 = [0])[0];  // read(V2) => readBeforeWritten; write(V2)
+/// V1;                     // read(V1) => readBeforeWritten (already)
+/// V2;                     // read(V2) => readBeforeWritten (already)
+/// ```
+///
+///
+/// --------------------------------------------------
+/// Logical expression.
+///
+/// In logical expressions `a && b` or `a || b` only `a` is always executed,
+/// in the enclosing branch.  The expression `b` might not be executed, so its
+/// results are on the exit from the logical expression.
+///
+/// ```dart
+/// int V1;      // add(V1)
+/// int V2;      // add(V2)
+/// (
+///   V1 = 1     // write(V1)
+/// ) > 0
+/// &&           // beginBinaryExpressionLogicalRight()
+/// (
+///   V2 = V1    // read(V1) => OK; write(V2)
+/// ) > 0
+/// ;            // endBinaryExpressionLogicalRight()
+/// V1;          // read(V1) => OK
+/// V2;          // read(V2) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// assert(C, M)
+///
+/// The `assert` statement is not guaranteed to execute, so assignments in the
+/// condition and the message are discarded.  But assignments in the condition
+/// are visible in the message.
+///
+/// ```dart
+/// bool V;    // add(V)
+/// assert(    // beginAssertStatement()
+///   V        // read(V) => readBeforeWritten
+/// );         // endAssertExpression()
+/// V          // read(V) => readBeforeWritten
+/// ```
+///
+/// ```dart
+/// bool V;      // add(V)
+/// assert(      // beginAssertExpression()
+///   V = true,  // write(V)
+///   "$V",      // read(V) => OK
+/// );           // endAssertExpression()
+/// V            // read(V) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// if (E) {} else {}
+///
+/// The variable must be assigned in the `then` branch, and the `else` branch.
+///
+/// The condition `E` contributes into the current branch.
+///
+/// ```dart
+/// int V1;     // add(V1)
+/// int V2;     // add(V2)
+/// int V3;     // add(V3)
+/// if (E)
+/// {           // beginIfStatementThen()
+///   V1 = 0;   // write(V1)
+///   V2 = 0;   // write(V2)
+///   V1;       // read(V1) => OK
+///   V2;       // read(V2) => OK
+/// } else {    // beginIfStatementElse()
+///   V1 = 0;   // write(V1)
+///   V3 = 0;   // write(V3)
+///   V1;       // read(V1) => OK
+///   V3;       // read(V3) => OK
+/// }           // endIfStatement(hasElse: true)
+/// V1;         // read(V1) => OK
+/// V2;         // read(V2) => readBeforeWritten
+/// V3;         // read(V3) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// while (E) {}
+///
+/// If `E` is not the `true` literal, which is covered below, then the body of
+/// the loop might be not executed at all.  So, the fork is discarded.
+///
+/// The condition `E` contributes into the current branch.
+///
+/// ```dart
+/// int V;      // add(V)
+/// while (     // beginWhileStatement(labels: [])
+///   E
+/// ) {         // beginWhileStatementBody(isTrue: false)
+///   V = 0;    // write(V)
+///   V;        // read(V) => OK
+/// }           // endWhileStatement()
+/// V;          // read(V) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// while (true) { ...break... }
+///
+/// Statements `break` and `continue` in loops make the rest of the enclosing
+/// (or labelled) loop ineligible for marking variables definitely assigned
+/// outside of the loop. However it is still OK to mark variables assigned and
+/// use their values in the rest of the loop.
+///
+/// ```dart
+/// int V;
+/// while (             // beginWhileStatement(labels: [])
+///   true
+/// ) {                 // beginWhileStatementBody(isTrue: true)
+///   if (condition) {  // beginIfStatement(hasElse: false)
+///     break;          // handleBreak(while);
+///   }                 // endIfStatement()
+///   V = 0;            // write(V)
+///   V;                // read(V) => OK
+/// }                   // endWhileStatement()
+/// V;                  // read(V) => readBeforeWritten
+/// ```
+///
+/// Nested loops:
+///
+/// ```dart
+/// int V1, V2;
+/// L1: while (         // beginWhileStatement(node)
+///   true
+/// ) {                 // beginWhileStatementBody(isTrue: true)
+///   while (           // beginWhileStatement(labels: [])
+///     true
+///   ) {               // beginWhileStatementBody()
+///     if (C1) {       // beginIfStatement(hasElse: true)
+///       V1 = 0;       // write(V1)
+///     } else {        // beginIfStatementElse()
+///       if (C2) {     // beginIfStatement(hasElse: false)
+///         break L1;   // handleBreak(L1: while)
+///       }             // endIfStatement()
+///       V1 = 0;       // write(V1)
+///     }               // endIfStatement()
+///     V1;             // read(V1) => OK
+///   }                 // endWhileStatement()
+///   V1;               // read(V1) => OK
+///   while (           // beginWhileStatement(node)
+///     true
+///   ) {               // beginWhileStatementBody(isTrue: true)
+///     V2 = 0;         // write(V2)
+///     break;          // handleBreak(while)
+///   }                 // endWhileStatement()
+///   V1;               // read(V1) => OK
+///   V2;               // read(V2) => OK
+/// }                   // endWhileStatement()
+/// V1;                 // read(V1) => readBeforeWritten
+/// V2;                 // read(V2) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// do {} while (E)
+///
+/// The body and the condition always execute, all assignments contribute to
+/// the current branch.  The body is tracked in its own branch, so that if
+/// it has an interruption (`break` or `continue`), we can discard the branch
+/// after or before the condition.
+///
+/// ```dart
+/// int V1;                  // add(V1)
+/// int V2;                  // add(V2)
+/// do {                     // beginDoWhileStatement(node)
+///   V1 = 0;                // write(V1)
+///   V1;                    // read(V1) => OK
+/// } while                  // beginDoWhileStatementCondition()
+///   ((V2 = 0) >= 0)        // write(V2)
+/// ;                        // endDoWhileStatement()
+/// V1;                      // read(V1) => OK
+/// V2;                      // read(V2) => OK
+/// ```
+///
+///
+/// --------------------------------------------------
+/// do { ...break... } while (E)
+///
+/// The `break` statement prevents execution of the rest of the body, and
+/// the condition.  So, the branch ends after the condition.
+///
+/// ```dart
+/// int V1;                  // add(V1)
+/// int V2;                  // add(V2)
+/// int V3;                  // add(V3)
+/// do {                     // beginDoWhileStatement(node)
+///   V1 = 0;                // write(V1)
+///   V1;                    // read(V1) => OK
+///   if (C1) break;         // handleBreak(do)
+///   V2 = 0;                // write(V2)
+///   V2;                    // read(V2) => OK
+/// } while                  // beginDoWhileStatementCondition()
+///   ((V3 = 0) >= 0)        // write(V3)
+/// ;                        // endDoWhileStatement()
+/// V1;                      // read(V1) => OK
+/// V2;                      // read(V2) => readBeforeWritten
+/// V3;                      // read(V3) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// do { ...continue... } while (E)
+///
+/// The `continue` statement prevents execution of the rest of the body, but
+/// the condition is always executed.  So, the branch ends before the condition,
+/// and the condition contributes to the enclosing branch.
+///
+/// ```dart
+/// int V1;                  // add(V1)
+/// int V2;                  // add(V2)
+/// int V3;                  // add(V3)
+/// do {                     // beginDoWhileStatement(node)
+///   V1 = 0;                // write(V1)
+///   V1;                    // read(V1) => OK
+///   if (C1) continue;      // handleContinue(do)
+///   V2 = 0;                // write(V2)
+///   V2;                    // read(V2) => OK
+/// } while                  // beginDoWhileStatementCondition()
+///   ((V3 = 0) >= 0)        // write(V3)
+/// ;                        // endDoWhileStatement()
+/// V1;                      // read(V1) => OK
+/// V2;                      // read(V2) => readBeforeWritten
+/// V3;                      // read(V3) => OK
+/// ```
+///
+///
+/// --------------------------------------------------
+/// Try / catch.
+///
+/// The variable must be assigned in the `try` branch and every `catch` branch.
+///
+/// Note, that an improvement is possible, when some first statements in the
+/// `try` branch can be shown to not throw (e.g. `V = 0;`). We could consider
+/// these statements as definitely executed, so producing definite assignments.
+///
+/// ```dart
+/// int V;        // add(V)
+/// try {         // beginTryStatement()
+///   V = f();    // write(V)
+/// }             // endTryStatementBody()
+/// catch (_) {   // beginTryStatementCatchClause()
+///   V = 0;      // write(V)
+/// }             // endTryStatementCatchClause(); endTryStatementCatchClauses()
+/// V;            // read(V) => OK
+/// ```
+///
+///
+/// --------------------------------------------------
+/// Try / finally.
+///
+/// The `finally` clause is always executed, so it is tracked in the branch
+/// that contains the `try` statement.
+///
+/// Without `catch` clauses the `try` clause is always executed to the end,
+/// so also can be tracked in the branch that contains the `try` statement.
+///
+/// ```dart
+/// int V1;     // add(V1)
+/// int V2;     // add(V2)
+/// try {       // beginTryStatement()
+///   V1 = 0;   // write(V1)
+/// }           // endTryStatementBody(); endTryStatementCatchClauses();
+/// finally {
+///   V2 = 0;   // write(V2)
+/// }
+/// V1;         // read(V1) => OK
+/// V2;         // read(V2) => OK
+/// ```
+///
+///
+/// --------------------------------------------------
+/// Try / catch / finally.
+///
+/// The `finally` clause is always executed, so it is tracked in the branch
+/// that contains the `try` statement.
+///
+/// The `try` and `catch` branches are tracked as without `finally`.
+///
+///
+/// --------------------------------------------------
+/// switch (E) { case E1: ... default: }
+///
+/// The variable must be assigned in every `case` branch and must have the
+/// `default` branch.  If the `default` branch is missing, then the `switch`
+/// does not definitely cover all possible values of `E`, so the variable is
+/// not definitely assigned.
+///
+/// The expression `E` contributes into the current branch.
+///
+/// ```dart
+/// int V;      // add(V)
+/// switch      // beginSwitchStatement()
+/// (E) {       // endSwitchStatementExpression()
+///   case 1:   // beginSwitchStatementMember()
+///     V = 0;  // write(V)
+///     break;  // handleBreak(switch)
+///   default:  // beginSwitchStatementMember()
+///     V = 0;  // write(V); handleBreak(switch)
+/// }           // endSwitchStatement(hasDefault: true)
+/// V;          // read(V) => OK
+/// ```
+///
+/// The presence of a `continue L` statement in switch / case is analyzed in an
+/// approximate way; if a given variable is not written to in all case bodies,
+/// it is considered "not definitely assigned", even though a full basic block
+/// analysis would show that it is definitely assigned.
+///
+/// ```dart
+/// int V;           // add(V)
+/// switch           // beginSwitchStatement()
+/// (E) {            // endSwitchStatementExpression()
+///   L: case 1:     // beginSwitchStatementMember()
+///     V = 0;       // write(V)
+///     break;       // handleBreak(switch)
+///   case 2:        // beginSwitchStatementMember()
+///     continue L;  // handleContinue(switch)
+///   default:       // beginSwitchStatementMember()
+///     V = 0;       // write(V); handleBreak(switch)
+/// }                // endSwitchStatement(hasDefault: true)
+/// V;               // read(V) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// For each.
+///
+/// The iterable might be empty, so the body might be not executed, so writes
+/// in the body are discarded.  But writes in the iterable expressions are
+/// always executed.
+///
+/// ```dart
+/// int V1;     // add(V1)
+/// int V2;     // add(V2)
+/// for (var _ in (V1 = [0, 1, 2]))  // beginForEachStatement(node)
+/// {                                // beginForEachStatementBody()
+///   V2 = 0;                        // write(V1)
+/// }                                // endForEachStatement();
+/// V1;         // read(V1) => OK
+/// V2;         // read(V2) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// For statement.
+///
+/// Very similar to `while` statement.  The initializer and condition parts
+/// are always executed, so contribute to definite assignments.  The body and
+/// updaters might be not executed, so writes in them are discarded.  The
+/// updaters are executed after the body, so writes in the body are visible in
+/// the updaters, correspondingly AST portions should be visited, and
+/// [beginForEachStatementBody] should be before [beginForStatementUpdaters],
+/// and followed with [endForStatement].
+///
+/// ```dart
+/// int V1;     // 1. add(V1)
+/// int V2;     // 2. add(V2)
+/// int V3;     // 3. add(V3)
+/// int V4;     // 4. add(V4)
+/// for (                //  5. beginForStatement(node)
+///   var _ = (V1 = 0);  //  6. write(V1)
+///   (V2 = 0) >= 0;     //  7. write(V2)
+///   V3 = 0             // 10. beginForStatementUpdaters(); write(V3)
+/// ) {                  //  8. beginForStatementBody()
+///   V4 = 0;            //  9. write(V4)
+/// }                    // 11. endForStatement()
+/// V1;         // 12. read(V1) => OK
+/// V2;         // 13. read(V2) => OK
+/// V3;         // 14. read(V3) => readBeforeWritten
+/// V4;         // 15. read(V4) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// Function expressions - local functions and closures.
+///
+/// A function expression, e.g. a closure passed as an argument of an
+/// invocation, might be invoked synchronously, asynchronously, or never.
+/// So, all local variables that are read in the function expression must be
+/// definitely assigned, but any writes should be discarded on exit from the
+/// function expression.
+///
+/// ```dart
+/// int V1;     // add(V1)
+/// int V2;     // add(V2)
+/// int V3;     // add(V2)
+/// V1 = 0;     // write(V1)
+/// void f() {  // beginFunctionExpression()
+///   V1;       // read(V1) => OK
+///   V2;       // read(V2) => readBeforeWritten
+///   V3 = 0;   // write(V1)
+/// }           // endFunctionExpression();
+/// V2 = 0;     // write(V2)
+/// f();
+/// V1;         // read(V1) => OK
+/// V2;         // read(V2) => OK
+/// V3;         // read(V3) => readBeforeWritten
+/// ```
+///
+///
+/// --------------------------------------------------
+/// Definite exit.
+///
+/// If a definite exit is reached, e.g. a `return` or a `throw` statement,
+/// then all the variables are vacuously definitely assigned.
+///
+/// ```dart
+/// int V;      // add(V)
+/// if (E) {
+/// {           // beginIfStatementThen()
+///   V = 0;    // write(V)
+/// } else {    // beginIfStatementElse()
+///   return;   // handleExit()
+/// }           // endIfStatement(hasElse: true)
+/// V;          // read(V) => OK
+/// ```
+class DefiniteAssignmentTracker {
+  /// The output list of variables that were read before they were written.
+  final List<LocalVariableElement> readBeforeWritten = [];
+
+  /// The stack of sets of variables that are not definitely assigned.
+  final List<_ElementSet> _stack = [];
+
+  /// The mapping from labeled [Statement]s to the index in the [_stack]
+  /// where the first related element is located.  The number of elements
+  /// is statement specific.
+  final Map<Statement, int> _statementToStackIndex = {};
+
+  /// The current set of variables that are not definitely assigned.
+  _ElementSet _current = _ElementSet.empty;
+
+  @visibleForTesting
+  bool get isRootBranch {
+    return _stack.isEmpty;
+  }
+
+  /// Add a new [variable], which might be already [assigned].
+  void add(LocalVariableElement variable, {bool assigned: false}) {
+    if (!assigned) {
+      _current = _current.add(variable);
+    }
+  }
+
+  void beginAssertStatement() {
+    _stack.add(_current);
+  }
+
+  void beginBinaryExpressionLogicalRight() {
+    _stack.add(_current);
+  }
+
+  void beginConditionalExpressionElse() {
+    var afterCondition = _stack.last;
+    _stack.last = _current; // after then
+    _current = afterCondition;
+  }
+
+  void beginConditionalExpressionThen() {
+    _stack.add(_current); // after condition
+  }
+
+  void beginDoWhileStatement(DoStatement statement) {
+    _statementToStackIndex[statement] = _stack.length;
+    _stack.add(_ElementSet.empty); // break set
+    _stack.add(_ElementSet.empty); // continue set
+  }
+
+  void beginDoWhileStatementCondition() {
+    var continueSet = _stack.removeLast();
+    // If there was a `continue`, use it.
+    // If there was not any, use the current.
+    _current = _current.union(continueSet);
+  }
+
+  void beginForEachStatement(ForEachStatement statement) {
+    // Not strongly necessary, because we discard everything anyway.
+    // Just for consistency, so that `break` is handled without `null`.
+    _statementToStackIndex[statement] = _stack.length;
+  }
+
+  void beginForEachStatementBody() {
+    _stack.add(_current);
+  }
+
+  void beginForStatement(ForStatement statement) {
+    // Not strongly necessary, because we discard everything anyway.
+    // Just for consistency, so that `break` is handled without `null`.
+    _statementToStackIndex[statement] = _stack.length;
+  }
+
+  void beginForStatementBody() {
+    _stack.add(_current); // break set
+    _stack.add(_ElementSet.empty); // continue set
+  }
+
+  void beginForStatementUpdaters() {
+    var continueSet = _stack.last;
+    _current = _current.union(continueSet);
+  }
+
+  void beginFunctionExpression() {
+    _stack.add(_current);
+  }
+
+  void beginIfStatementElse() {
+    var enclosing = _stack.last;
+    _stack.last = _current;
+    _current = enclosing;
+  }
+
+  void beginIfStatementThen() {
+    _stack.add(_current);
+  }
+
+  void beginSwitchStatement(SwitchStatement statement) {
+    _statementToStackIndex[statement] = _stack.length;
+    _stack.add(_ElementSet.empty); // break set
+    _stack.add(_ElementSet.empty); // continue set (placeholder)
+  }
+
+  void beginSwitchStatementMember() {
+    _current = _stack.last; // before cases
+  }
+
+  void beginTryStatement() {
+    _stack.add(_current); // before body, for catches
+  }
+
+  void beginTryStatementCatchClause() {
+    _current = _stack[_stack.length - 2]; // before body
+  }
+
+  void beginWhileStatement(WhileStatement statement) {
+    _statementToStackIndex[statement] = _stack.length;
+  }
+
+  void beginWhileStatementBody(bool isTrue) {
+    _stack.add(isTrue ? _ElementSet.empty : _current); // break set
+    _stack.add(_ElementSet.empty); // continue set
+  }
+
+  void endAssertStatement() {
+    _current = _stack.removeLast();
+  }
+
+  void endBinaryExpressionLogicalRight() {
+    _current = _stack.removeLast();
+  }
+
+  void endConditionalExpression() {
+    var thenSet = _stack.removeLast();
+    var elseSet = _current;
+    _current = thenSet.union(elseSet);
+  }
+
+  void endDoWhileStatement() {
+    var breakSet = _stack.removeLast();
+    // If there was a `break`, use it.
+    // If there was not any, use the current.
+    _current = _current.union(breakSet);
+  }
+
+  void endForEachStatement() {
+    _current = _stack.removeLast();
+  }
+
+  void endForStatement() {
+    _stack.removeLast(); // continue set
+    _current = _stack.removeLast(); // break set, before body
+  }
+
+  void endFunctionExpression() {
+    _current = _stack.removeLast();
+  }
+
+  void endIfStatement(bool hasElse) {
+    if (hasElse) {
+      var thenSet = _stack.removeLast();
+      var elseSet = _current;
+      _current = thenSet.union(elseSet);
+    } else {
+      var afterCondition = _stack.removeLast();
+      _current = afterCondition;
+    }
+  }
+
+  void endSwitchStatement(bool hasDefault) {
+    var beforeCasesSet = _stack.removeLast();
+    _stack.removeLast(); // continue set
+    var breakSet = _stack.removeLast();
+    if (hasDefault) {
+      _current = breakSet;
+    } else {
+      _current = beforeCasesSet;
+    }
+  }
+
+  void endSwitchStatementExpression() {
+    _stack.add(_current); // before cases
+  }
+
+  void endTryStatementBody() {
+    _stack.add(_current); // union of body and catches
+  }
+
+  void endTryStatementCatchClause() {
+    _stack.last = _stack.last.union(_current); // union of body and catches
+  }
+
+  void endTryStatementCatchClauses() {
+    _current = _stack.removeLast(); // union of body and catches
+    _stack.removeLast(); // before body
+  }
+
+  void endWhileStatement() {
+    _stack.removeLast(); // continue set
+    _current = _stack.removeLast(); // break set
+  }
+
+  /// Handle a `break` statement with the given [target].
+  void handleBreak(AstNode target) {
+    var breakSetIndex = _statementToStackIndex[target];
+    if (breakSetIndex != null) {
+      _stack[breakSetIndex] = _stack[breakSetIndex].union(_current);
+    }
+    _current = _ElementSet.empty;
+  }
+
+  /// Handle a `continue` statement with the given [target].
+  void handleContinue(AstNode target) {
+    var breakSetIndex = _statementToStackIndex[target];
+    if (breakSetIndex != null) {
+      var continueSetIndex = breakSetIndex + 1;
+      _stack[continueSetIndex] = _stack[continueSetIndex].union(_current);
+    }
+    _current = _ElementSet.empty;
+  }
+
+  /// Register the fact that the current branch definitely exists, e.g. returns
+  /// from the body, throws an exception, etc.  So, all variables in the branch
+  /// are vacuously definitely assigned.
+  void handleExit() {
+    _current = _ElementSet.empty;
+  }
+
+  /// Register read of the given [variable] in the current branch.
+  void read(LocalVariableElement variable) {
+    if (_current.contains(variable)) {
+      // Add to the list of violating variables, if not there yet.
+      for (var i = 0; i < readBeforeWritten.length; ++i) {
+        var violatingVariable = readBeforeWritten[i];
+        if (identical(violatingVariable, variable)) {
+          return;
+        }
+      }
+      readBeforeWritten.add(variable);
+    }
+  }
+
+  /// Register write of the given [variable] in the current branch.
+  void write(LocalVariableElement variable) {
+    _current = _current.remove(variable);
+  }
+}
+
+/// List based immutable set of elements.
+class _ElementSet {
+  static final empty = _ElementSet._(
+    List<LocalVariableElement>(0),
+  );
+
+  final List<LocalVariableElement> elements;
+
+  _ElementSet._(this.elements);
+
+  _ElementSet add(LocalVariableElement addedElement) {
+    if (contains(addedElement)) {
+      return this;
+    }
+
+    var length = elements.length;
+    var newElements = List<LocalVariableElement>(length + 1);
+    for (var i = 0; i < length; ++i) {
+      newElements[i] = elements[i];
+    }
+    newElements[length] = addedElement;
+    return _ElementSet._(newElements);
+  }
+
+  bool contains(LocalVariableElement element) {
+    var length = elements.length;
+    for (var i = 0; i < length; ++i) {
+      if (identical(elements[i], element)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  _ElementSet remove(LocalVariableElement removedElement) {
+    if (!contains(removedElement)) {
+      return this;
+    }
+
+    var length = elements.length;
+    if (length == 1) {
+      return empty;
+    }
+
+    var newElements = List<LocalVariableElement>(length - 1);
+    var newIndex = 0;
+    for (var i = 0; i < length; ++i) {
+      var element = elements[i];
+      if (!identical(element, removedElement)) {
+        newElements[newIndex++] = element;
+      }
+    }
+
+    return _ElementSet._(newElements);
+  }
+
+  _ElementSet union(_ElementSet other) {
+    if (other == null || other.elements.isEmpty) {
+      return this;
+    }
+
+    var result = this;
+    var otherElements = other.elements;
+    for (var i = 0; i < otherElements.length; ++i) {
+      var otherElement = otherElements[i];
+      result = result.add(otherElement);
+    }
+    return result;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
new file mode 100644
index 0000000..10e01f6
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -0,0 +1,630 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+
+class MethodInvocationResolver {
+  static final _nameCall = new Name(null, 'call');
+
+  /// The resolver driving this participant.
+  final ResolverVisitor _resolver;
+
+  /// The type representing the type 'dynamic'.
+  final DynamicTypeImpl _dynamicType = DynamicTypeImpl.instance;
+
+  /// The type representing the type 'type'.
+  final InterfaceType _typeType;
+
+  /// The manager for the inheritance mappings.
+  final InheritanceManager2 _inheritance;
+
+  /// The element for the library containing the compilation unit being visited.
+  final LibraryElement _definingLibrary;
+
+  /// The URI of [_definingLibrary].
+  final Uri _definingLibraryUri;
+
+  /// The object keeping track of which elements have had their types promoted.
+  final TypePromotionManager _promoteManager;
+
+  /// The [Name] object of the invocation being resolved by [resolve].
+  Name _currentName;
+
+  MethodInvocationResolver(this._resolver)
+      : _typeType = _resolver.typeProvider.typeType,
+        _inheritance = _resolver.inheritance,
+        _definingLibrary = _resolver.definingLibrary,
+        _definingLibraryUri = _resolver.definingLibrary.source.uri,
+        _promoteManager = _resolver.promoteManager;
+
+  /// The scope used to resolve identifiers.
+  Scope get nameScope => _resolver.nameScope;
+
+  void resolve(MethodInvocation node) {
+    SimpleIdentifier nameNode = node.methodName;
+    String name = nameNode.name;
+    _currentName = Name(_definingLibraryUri, name);
+
+    //
+    // Synthetic identifiers have been already reported during parsing.
+    //
+    if (nameNode.isSynthetic) {
+      return;
+    }
+
+    Expression receiver = node.realTarget;
+
+    if (receiver == null) {
+      _resolveReceiverNull(node, nameNode, name);
+      return;
+    }
+
+    if (receiver is NullLiteral) {
+      _setDynamicResolution(node);
+      return;
+    }
+
+    if (receiver is SimpleIdentifier) {
+      var receiverElement = receiver.staticElement;
+      if (receiverElement is PrefixElement) {
+        _resolveReceiverPrefix(node, receiver, receiverElement, nameNode, name);
+        return;
+      }
+    }
+
+    if (receiver is SuperExpression) {
+      _resolveReceiverSuper(node, receiver, nameNode, name);
+      return;
+    }
+
+    ClassElement typeReference = getTypeReference(receiver);
+    if (typeReference != null) {
+      _resolveReceiverTypeLiteral(node, typeReference, nameNode, name);
+      return;
+    }
+
+    DartType receiverType = receiver.staticType;
+    receiverType = _resolveTypeParameter(receiverType);
+
+    if (receiverType is InterfaceType) {
+      _resolveReceiverInterfaceType(node, receiverType, nameNode, name);
+      return;
+    }
+
+    if (receiverType is DynamicTypeImpl) {
+      _resolveReceiverDynamic(node, name);
+      return;
+    }
+
+    if (receiverType is FunctionType) {
+      _resolveReceiverFunctionType(
+          node, receiver, receiverType, nameNode, name);
+      return;
+    }
+
+    if (receiverType is VoidType) {
+      _reportUseOfVoidType(node, receiver);
+      return;
+    }
+  }
+
+  /// Given an [argumentList] and the executable [element] that  will be invoked
+  /// using those arguments, compute the list of parameters that correspond to
+  /// the list of arguments. Return the parameters that correspond to the
+  /// arguments, or `null` if no correspondence could be computed.
+  List<ParameterElement> _computeCorrespondingParameters(
+      ArgumentList argumentList, DartType type) {
+    if (type is InterfaceType) {
+      MethodElement callMethod =
+          type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
+      if (callMethod != null) {
+        return _resolveArgumentsToFunction(false, argumentList, callMethod);
+      }
+    } else if (type is FunctionType) {
+      return _resolveArgumentsToParameters(
+          false, argumentList, type.parameters);
+    }
+    return null;
+  }
+
+  /// If the element of the invoked [targetType] is a getter, then actually
+  /// the return type of the [targetType] is invoked.  So, remember the
+  /// [targetType] into [MethodInvocationImpl.methodNameType] and return the
+  /// actual invoked type.
+  DartType _getCalleeType(MethodInvocation node, FunctionType targetType) {
+    if (targetType.element.kind == ElementKind.GETTER) {
+      (node as MethodInvocationImpl).methodNameType = targetType;
+      var calleeType = targetType.returnType;
+      calleeType = _resolveTypeParameter(calleeType);
+      return calleeType;
+    }
+    return targetType;
+  }
+
+  /// Check for a generic type, and apply type arguments.
+  FunctionType _instantiateFunctionType(
+      FunctionType invokeType, TypeArgumentList typeArguments, AstNode node) {
+    var typeFormals = invokeType.typeFormals;
+    var arguments = typeArguments?.arguments;
+    if (arguments != null && arguments.length != typeFormals.length) {
+      _resolver.errorReporter.reportErrorForNode(
+          StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+          node,
+          [invokeType, typeFormals.length, arguments?.length ?? 0]);
+      arguments = null;
+    }
+
+    if (typeFormals.isNotEmpty) {
+      if (arguments == null) {
+        return _resolver.typeSystem.instantiateToBounds(invokeType);
+      } else {
+        return invokeType.instantiate(arguments.map((n) => n.type).toList());
+      }
+    }
+
+    return invokeType;
+  }
+
+  bool _isCoreFunction(DartType type) {
+    // TODO(scheglov) Can we optimize this?
+    return type is InterfaceType && type.isDartCoreFunction;
+  }
+
+  ExecutableElement _lookUpClassMember(ClassElement element, String name) {
+    // TODO(scheglov) Use class hierarchy.
+    return element.lookUpMethod(name, _definingLibrary);
+  }
+
+  void _reportInvocationOfNonFunction(MethodInvocation node) {
+    _setDynamicResolution(node, setNameTypeToDynamic: false);
+    _resolver.errorReporter.reportErrorForNode(
+      StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+      node.methodName,
+      [node.methodName.name],
+    );
+  }
+
+  void _reportPrefixIdentifierNotFollowedByDot(SimpleIdentifier target) {
+    _resolver.errorReporter.reportErrorForNode(
+      CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
+      target,
+      [target.name],
+    );
+  }
+
+  void _reportUndefinedFunction(
+      MethodInvocation node, Identifier ignorableIdentifier) {
+    _setDynamicResolution(node);
+
+    // TODO(scheglov) This is duplication.
+    if (nameScope.shouldIgnoreUndefined(ignorableIdentifier)) {
+      return;
+    }
+
+    _resolver.errorReporter.reportErrorForNode(
+      StaticTypeWarningCode.UNDEFINED_FUNCTION,
+      node.methodName,
+      [node.methodName.name],
+    );
+  }
+
+  void _reportUndefinedMethod(
+      MethodInvocation node, String name, ClassElement typeReference) {
+    _setDynamicResolution(node);
+    _resolver.errorReporter.reportErrorForNode(
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+      node.methodName,
+      [name, typeReference.displayName],
+    );
+  }
+
+  void _reportUseOfVoidType(MethodInvocation node, AstNode errorNode) {
+    _setDynamicResolution(node);
+    _resolver.errorReporter.reportErrorForNode(
+      StaticWarningCode.USE_OF_VOID_RESULT,
+      errorNode,
+    );
+  }
+
+  /// Given an [argumentList] and the [executableElement] that will be invoked
+  /// using those argument, compute the list of parameters that correspond to the
+  /// list of arguments. An error will be reported if any of the arguments cannot
+  /// be matched to a parameter. The flag [reportAsError] should be `true` if a
+  /// compile-time error should be reported; or `false` if a compile-time warning
+  /// should be reported. Return the parameters that correspond to the arguments,
+  /// or `null` if no correspondence could be computed.
+  List<ParameterElement> _resolveArgumentsToFunction(bool reportAsError,
+      ArgumentList argumentList, ExecutableElement executableElement) {
+    if (executableElement == null) {
+      return null;
+    }
+    List<ParameterElement> parameters = executableElement.parameters;
+    return _resolveArgumentsToParameters(
+        reportAsError, argumentList, parameters);
+  }
+
+  /// Given an [argumentList] and the [parameters] related to the element that
+  /// will be invoked using those arguments, compute the list of parameters that
+  /// correspond to the list of arguments. An error will be reported if any of
+  /// the arguments cannot be matched to a parameter. The flag [reportAsError]
+  /// should be `true` if a compile-time error should be reported; or `false` if
+  /// a compile-time warning should be reported. Return the parameters that
+  /// correspond to the arguments.
+  List<ParameterElement> _resolveArgumentsToParameters(bool reportAsError,
+      ArgumentList argumentList, List<ParameterElement> parameters) {
+    return ResolverVisitor.resolveArgumentsToParameters(
+        argumentList, parameters, _resolver.errorReporter.reportErrorForNode,
+        reportAsError: reportAsError);
+  }
+
+  /// Given that we are accessing a property of the given [classElement] with the
+  /// given [propertyName], return the element that represents the property.
+  Element _resolveElement(
+      ClassElement classElement, SimpleIdentifier propertyName) {
+    // TODO(scheglov) Replace with class hierarchy.
+    String name = propertyName.name;
+    Element element = null;
+    if (propertyName.inSetterContext()) {
+      element = classElement.getSetter(name);
+    }
+    if (element == null) {
+      element = classElement.getGetter(name);
+    }
+    if (element == null) {
+      element = classElement.getMethod(name);
+    }
+    if (element != null && element.isAccessibleIn(_definingLibrary)) {
+      return element;
+    }
+    return null;
+  }
+
+  void _resolveReceiverDynamic(MethodInvocation node, String name) {
+    _setDynamicResolution(node);
+  }
+
+  void _resolveReceiverFunctionType(MethodInvocation node, Expression receiver,
+      FunctionType receiverType, SimpleIdentifier nameNode, String name) {
+    if (name == FunctionElement.CALL_METHOD_NAME) {
+      _setResolution(node, receiverType);
+      // TODO(scheglov) Replace this with using FunctionType directly.
+      // Here was erase resolution that _setResolution() sets.
+      nameNode.staticElement = null;
+      nameNode.staticType = _dynamicType;
+      return;
+    }
+
+    // We can invoke Object methods on Function.
+    var type = _inheritance.getMember(
+      _resolver.typeProvider.objectType,
+      new Name(null, name),
+    );
+    if (type != null) {
+      nameNode.staticElement = type.element;
+      return _setResolution(node, type);
+    }
+
+    _reportUndefinedMethod(
+      node,
+      name,
+      _resolver.typeProvider.functionType.element,
+    );
+  }
+
+  void _resolveReceiverInterfaceType(MethodInvocation node,
+      InterfaceType receiverType, SimpleIdentifier nameNode, String name) {
+    if (_isCoreFunction(receiverType) &&
+        name == FunctionElement.CALL_METHOD_NAME) {
+      _setDynamicResolution(node);
+      return;
+    }
+
+    var targetType = _inheritance.getMember(receiverType, _currentName);
+    if (targetType != null) {
+      var calleeType = _getCalleeType(node, targetType);
+
+      // TODO(scheglov) This is bad, we have to create members here.
+      // Find a way to avoid this.
+      Element element;
+      var baseElement = targetType.element;
+      if (baseElement is MethodElement) {
+        element = MethodMember.from(baseElement, receiverType);
+      } else if (baseElement is PropertyAccessorElement) {
+        element = PropertyAccessorMember.from(baseElement, receiverType);
+      }
+      nameNode.staticElement = element;
+
+      return _setResolution(node, calleeType);
+    }
+
+    // The interface of the receiver does not have an instance member.
+    // Try to recover and find a member in the class.
+    var targetElement = _lookUpClassMember(receiverType.element, name);
+    if (targetElement != null && targetElement.isStatic) {
+      nameNode.staticElement = targetElement;
+      _setDynamicResolution(node);
+      _resolver.errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+        nameNode,
+        [
+          name,
+          targetElement.kind.displayName,
+          targetElement.enclosingElement.displayName,
+        ],
+      );
+      return;
+    }
+
+    _setDynamicResolution(node);
+    _resolver.errorReporter.reportErrorForNode(
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+      nameNode,
+      [name, receiverType.element.displayName],
+    );
+  }
+
+  void _resolveReceiverNull(
+      MethodInvocation node, SimpleIdentifier nameNode, String name) {
+    var element = nameScope.lookup(nameNode, _definingLibrary);
+    if (element != null) {
+      nameNode.staticElement = element;
+      if (element is MultiplyDefinedElement) {
+        MultiplyDefinedElement multiply = element;
+        element = multiply.conflictingElements[0];
+      }
+      if (element is ExecutableElement) {
+        var calleeType = _getCalleeType(node, element.type);
+        return _setResolution(node, calleeType);
+      }
+      if (element is VariableElement) {
+        var targetType = _promoteManager.getStaticType(element);
+        return _setResolution(node, targetType);
+      }
+      // TODO(scheglov) This is a questionable distinction.
+      if (element is PrefixElement) {
+        _setDynamicResolution(node);
+        return _reportPrefixIdentifierNotFollowedByDot(nameNode);
+      }
+      return _reportInvocationOfNonFunction(node);
+    }
+
+    ClassElement enclosingClass = _resolver.enclosingClass;
+    if (enclosingClass == null) {
+      return _reportUndefinedFunction(node, node.methodName);
+    }
+
+    var receiverType = enclosingClass.type;
+    var targetType = _inheritance.getMember(receiverType, _currentName);
+
+    if (targetType != null) {
+      nameNode.staticElement = targetType.element;
+      var calleeType = _getCalleeType(node, targetType);
+      return _setResolution(node, calleeType);
+    }
+
+    var targetElement = _lookUpClassMember(enclosingClass, name);
+    if (targetElement != null && targetElement.isStatic) {
+      nameNode.staticElement = targetElement;
+      _setDynamicResolution(node);
+      _resolver.errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+        nameNode,
+        [receiverType.displayName],
+      );
+      return;
+    }
+
+    return _reportUndefinedMethod(node, name, enclosingClass);
+  }
+
+  void _resolveReceiverPrefix(MethodInvocation node, SimpleIdentifier receiver,
+      PrefixElement prefix, SimpleIdentifier nameNode, String name) {
+    if (node.operator.type == TokenType.QUESTION_PERIOD) {
+      _reportPrefixIdentifierNotFollowedByDot(receiver);
+    }
+
+    if (name == FunctionElement.LOAD_LIBRARY_NAME) {
+      var imports = _definingLibrary.getImportsWithPrefix(prefix);
+      if (imports.length == 1 && imports[0].isDeferred) {
+        var importedLibrary = imports[0].importedLibrary;
+        var loadLibraryFunction = importedLibrary?.loadLibraryFunction;
+        nameNode.staticElement = loadLibraryFunction;
+        node.staticInvokeType = loadLibraryFunction?.type;
+        node.staticType = loadLibraryFunction?.returnType;
+        return;
+      }
+    }
+
+    // TODO(scheglov) I don't like how we resolve prefixed names.
+    // But maybe this is the only one solution.
+    var prefixedName = new PrefixedIdentifierImpl.temp(receiver, nameNode);
+    var element = nameScope.lookup(prefixedName, _definingLibrary);
+    nameNode.staticElement = element;
+
+    if (element is MultiplyDefinedElement) {
+      MultiplyDefinedElement multiply = element;
+      element = multiply.conflictingElements[0];
+    }
+
+    if (element is ExecutableElement) {
+      var calleeType = _getCalleeType(node, element.type);
+      return _setResolution(node, calleeType);
+    }
+
+    _reportUndefinedFunction(node, prefixedName);
+  }
+
+  void _resolveReceiverSuper(MethodInvocation node, SuperExpression receiver,
+      SimpleIdentifier nameNode, String name) {
+    if (!_isSuperInValidContext(receiver)) {
+      return;
+    }
+
+    var receiverType = _resolver.enclosingClass.type;
+    var targetType = _inheritance.getMember(
+      receiverType,
+      _currentName,
+      forSuper: true,
+    );
+
+    // If there is that concrete dispatch target, then we are done.
+    if (targetType != null) {
+      nameNode.staticElement = targetType.element;
+      var calleeType = _getCalleeType(node, targetType);
+      _setResolution(node, calleeType);
+      return;
+    }
+
+    // Otherwise, this is an error.
+    // But we would like to give the user at least some resolution.
+    // So, we try to find the interface target.
+    targetType = _inheritance.getInherited(receiverType, _currentName);
+    if (targetType != null) {
+      nameNode.staticElement = targetType.element;
+      var calleeType = _getCalleeType(node, targetType);
+      _setResolution(node, calleeType);
+
+      ClassElementImpl receiverSuperClass = AbstractClassElementImpl.getImpl(
+        receiverType.element.supertype.element,
+      );
+      if (receiverSuperClass.hasNoSuchMethod) {
+        return;
+      }
+
+      _resolver.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
+          nameNode,
+          [targetType.element.kind.displayName, name]);
+      return;
+    }
+
+    // Nothing help, there is no target at all.
+    _setDynamicResolution(node);
+    _resolver.errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
+        nameNode,
+        [name, _resolver.enclosingClass.displayName]);
+  }
+
+  void _resolveReceiverTypeLiteral(MethodInvocation node, ClassElement receiver,
+      SimpleIdentifier nameNode, String name) {
+    if (node.isCascaded) {
+      receiver = _typeType.element;
+    }
+
+    var element = _resolveElement(receiver, nameNode);
+    if (element != null) {
+      if (element is ExecutableElement) {
+        nameNode.staticElement = element;
+        var calleeType = _getCalleeType(node, element.type);
+        _setResolution(node, calleeType);
+      } else {
+        _reportInvocationOfNonFunction(node);
+      }
+      return;
+    }
+
+    _reportUndefinedMethod(node, name, receiver);
+  }
+
+  /// If the given [type] is a type parameter, replace with its bound.
+  /// Otherwise, return the original type.
+  DartType _resolveTypeParameter(DartType type) {
+    if (type is TypeParameterType) {
+      return type.resolveToBound(_resolver.typeProvider.objectType);
+    }
+    return type;
+  }
+
+  void _setDynamicResolution(MethodInvocation node,
+      {bool setNameTypeToDynamic: true}) {
+    if (setNameTypeToDynamic) {
+      node.methodName.staticType = _dynamicType;
+    }
+    node.staticInvokeType = _dynamicType;
+    node.staticType = _dynamicType;
+  }
+
+  void _setResolution(MethodInvocation node, DartType type) {
+    if (type == _dynamicType || _isCoreFunction(type)) {
+      _setDynamicResolution(node);
+      return;
+    }
+
+    // TODO(scheglov) We need this for StaticTypeAnalyzer to run inference.
+    // But it seems weird. Do we need to know the raw type of a function?!
+    node.methodName.staticType = type;
+
+    if (type is InterfaceType) {
+      var call = _inheritance.getMember(type, _nameCall);
+      if (call != null && call.element.kind == ElementKind.METHOD) {
+        type = call;
+      }
+    }
+
+    if (type is FunctionType) {
+      // TODO(scheglov) Extract this when receiver is already FunctionType?
+      var instantiatedType = _instantiateFunctionType(
+        type,
+        node.typeArguments,
+        node.methodName,
+      );
+      node.staticInvokeType = instantiatedType;
+      node.staticType = instantiatedType.returnType;
+      // TODO(scheglov) too much magic
+      node.argumentList.correspondingStaticParameters =
+          _computeCorrespondingParameters(
+        node.argumentList,
+        instantiatedType,
+      );
+      return;
+    }
+
+    if (type is VoidType) {
+      return _reportUseOfVoidType(node, node.methodName);
+    }
+
+    _reportInvocationOfNonFunction(node);
+  }
+
+  /// Checks whether the given [expression] is a reference to a class. If it is
+  /// then the element representing the class is returned, otherwise `null` is
+  /// returned.
+  static ClassElement getTypeReference(Expression expression) {
+    if (expression is Identifier) {
+      Element staticElement = expression.staticElement;
+      if (staticElement is ClassElement) {
+        return staticElement;
+      }
+    }
+    return null;
+  }
+
+  /// Return `true` if the given 'super' [expression] is used in a valid context.
+  static bool _isSuperInValidContext(SuperExpression expression) {
+    for (AstNode node = expression; node != null; node = node.parent) {
+      if (node is CompilationUnit) {
+        return false;
+      } else if (node is ConstructorDeclaration) {
+        return node.factoryKeyword == null;
+      } else if (node is ConstructorFieldInitializer) {
+        return false;
+      } else if (node is MethodDeclaration) {
+        return !node.isStatic;
+      }
+    }
+    return false;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index 4d71222..f1fb360 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -537,8 +537,11 @@
         var conflictingElements = <Element>[]
           ..addAll(sdkElements)
           ..addAll(nonSdkElements);
-        return new MultiplyDefinedElementImpl(_definingLibrary.context,
-            conflictingElements.first.name, conflictingElements);
+        return new MultiplyDefinedElementImpl(
+            _definingLibrary.context,
+            _definingLibrary.session,
+            conflictingElements.first.name,
+            conflictingElements);
       }
       if (nonSdkElements.isNotEmpty) {
         result = nonSdkElements.first;
@@ -1011,8 +1014,7 @@
    * not be determined.
    */
   Source getSource(AstNode identifier) {
-    CompilationUnit unit =
-        identifier.getAncestor((node) => node is CompilationUnit);
+    CompilationUnit unit = identifier.thisOrAncestorOfType<CompilationUnit>();
     if (unit != null) {
       CompilationUnitElement unitElement = unit.declaredElement;
       if (unitElement != null) {
diff --git a/pkg/analyzer/lib/src/dart/scanner/scanner.dart b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
index 25af788e..ab852cf 100644
--- a/pkg/analyzer/lib/src/dart/scanner/scanner.dart
+++ b/pkg/analyzer/lib/src/dart/scanner/scanner.dart
@@ -54,6 +54,11 @@
   bool scanLazyAssignmentOperators = false;
 
   /**
+   * A flag indicating whether the scanner should recognize the `>>>` operator.
+   */
+  bool enableGtGtGt = false;
+
+  /**
    * Initialize a newly created scanner to scan characters from the given
    * [source]. The given character [reader] will be used to read the characters
    * in the source. The given [_errorListener] will be informed of any errors
@@ -99,6 +104,7 @@
 
   Token tokenize() {
     fasta.ScannerResult result = fasta.scanString(_contents,
+        enableGtGtGt: enableGtGtGt,
         includeComments: _preserveComments,
         scanLazyAssignmentOperators: scanLazyAssignmentOperators);
 
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index d966ee8..bd26015 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -49,14 +49,6 @@
           "'{1}'.");
 
   /**
-   * 16.12.2 Const: It is a compile-time error if evaluation of a constant
-   * object results in an uncaught exception being thrown.
-   */
-  static const CheckedModeCompileTimeErrorCode CONST_EVAL_THROWS_EXCEPTION =
-      const CheckedModeCompileTimeErrorCode('CONST_EVAL_THROWS_EXCEPTION',
-          "Evaluation of this constant expression throws an exception.");
-
-  /**
    * 7.6.1 Generative Constructors: In checked mode, it is a dynamic type error
    * if o is not <b>null</b> and the interface of the class of <i>o</i> is not a
    * subtype of the static type of the field <i>v</i>.
@@ -87,6 +79,10 @@
    * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
    * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>,
    * 1 &lt;= j &lt;= m</i>.
+   *
+   * Parameters:
+   * 0: the actual type of the list element
+   * 1: the expected type of the list element
    */
   static const CheckedModeCompileTimeErrorCode
       LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CheckedModeCompileTimeErrorCode(
@@ -134,6 +130,15 @@
           "'{1}'.");
 
   /**
+   * Parameters:
+   * 0: the actual type of the set element
+   * 1: the expected type of the set element
+   */
+  static const CheckedModeCompileTimeErrorCode SET_ELEMENT_TYPE_NOT_ASSIGNABLE =
+      const CheckedModeCompileTimeErrorCode('SET_ELEMENT_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' can't be assigned to the set type '{1}'.");
+
+  /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
    * object results in an uncaught exception being thrown.
    */
@@ -539,7 +544,7 @@
       const CompileTimeErrorCode(
           'CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD',
           "Const constructor can't be declared for a class with a mixin "
-          "that declares a field.",
+          "that declares an instance field.",
           correction: "Try removing the 'const' keyword or "
               "removing the 'with' clause from the class declaration, "
               "or removing fields from the mixin class.");
@@ -659,6 +664,18 @@
           correction: "Try adding an initialization to the declaration.");
 
   /**
+   * Parameters:
+   * 0: the type of the element
+   */
+  static const CompileTimeErrorCode CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS =
+      const CompileTimeErrorCode(
+          'CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS',
+          "The constant set element type '{0}' can't override "
+          "the == operator.",
+          correction: "Try using a different value for the element, or "
+              "removing the keyword 'const' from the set.");
+
+  /**
    * 16.12.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2,
    * where e, e1 and e2 are constant expressions that evaluate to a boolean
    * value.
@@ -670,6 +687,17 @@
           "'bool'.");
 
   /**
+   * 16.12.2 Const: An expression of one of the forms !e, e1 && e2 or e1 || e2,
+   * where e, e1 and e2 are constant expressions that evaluate to a boolean
+   * value.
+   */
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_BOOL_INT =
+      const CompileTimeErrorCode(
+          'CONST_EVAL_TYPE_BOOL_INT',
+          "In constant expressions, operands of this operator must be of type "
+          "'bool' or 'int'.");
+
+  /**
    * 16.12.2 Const: An expression of one of the forms e1 == e2 or e1 != e2 where
    * e1 and e2 are constant expressions that evaluate to a numeric, string or
    * boolean value or to null.
@@ -703,6 +731,12 @@
           "In constant expressions, operands of this operator must be of type "
           "'num'.");
 
+  static const CompileTimeErrorCode CONST_EVAL_TYPE_TYPE =
+      const CompileTimeErrorCode(
+          'CONST_EVAL_TYPE_TYPE',
+          "In constant expressions, operands of this operator must be of type "
+          "'Type'.");
+
   /**
    * 16.12.2 Const: It is a compile-time error if evaluation of a constant
    * object results in an uncaught exception being thrown.
@@ -1587,6 +1621,14 @@
           correction:
               "Try replacing the type parameter with a different type.");
 
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_SET =
+      const CompileTimeErrorCode(
+          'INVALID_TYPE_ARGUMENT_IN_CONST_SET',
+          "Constant set literals can't include a type parameter as a type "
+          "argument, such as '{0}'.",
+          correction:
+              "Try replacing the type parameter with a different type.");
+
   /**
    * The 'covariant' keyword was found in an inappropriate location.
    */
@@ -1677,6 +1719,16 @@
           "expression.",
           correction: "Try adding the keyword 'const' before the literal.");
 
+  /**
+   * 12.1 Constants: A constant expression is ... a constant set literal.
+   */
+  static const CompileTimeErrorCode MISSING_CONST_IN_SET_LITERAL =
+      const CompileTimeErrorCode(
+          'MISSING_CONST_IN_SET_LITERAL',
+          "Set literals must be prefixed with 'const' when used as a constant "
+          "expression.",
+          correction: "Try adding the keyword 'const' before the literal.");
+
   static const CompileTimeErrorCode MISSING_DART_LIBRARY =
       const CompileTimeErrorCode(
           'MISSING_DART_LIBRARY', "Required library '{0}' is missing.",
@@ -1714,7 +1766,8 @@
   static const CompileTimeErrorCode
       MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE = const CompileTimeErrorCode(
           'MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE',
-          "The class doesn't implement the required class '{0}'.");
+          "The class doesn't implement the required class '{0}'.",
+          correction: "Try extending the class '{0}'.");
 
   /**
    * It's a compile-time error to apply a mixin containing super-invocations to
@@ -1967,8 +2020,8 @@
   static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT =
       const CompileTimeErrorCode(
           'NON_CONST_MAP_AS_EXPRESSION_STATEMENT',
-          "A non-constant map literal without type arguments can't be used as "
-          "an expression statement.");
+          "A non-constant map or set literal without type arguments can't be "
+          "used as an expression statement.");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) {
@@ -2041,7 +2094,8 @@
   static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT =
       const CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT',
           "The values in a const list literal must be constants.",
-          correction: "Try removing the keyword 'const' from the map literal.");
+          correction:
+              "Try removing the keyword 'const' from the list literal.");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list
@@ -2118,6 +2172,19 @@
       const CompileTimeErrorCode('NON_CONSTANT_ANNOTATION_CONSTRUCTOR',
           "Annotation creation can only call a const constructor.");
 
+  static const CompileTimeErrorCode NON_CONSTANT_SET_ELEMENT =
+      const CompileTimeErrorCode('NON_CONSTANT_SET_ELEMENT',
+          "The values in a const set literal must be constants.",
+          correction: "Try removing the keyword 'const' from the set literal.");
+
+  static const CompileTimeErrorCode
+      NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY =
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library can't be used as values in "
+          "a 'const' set.",
+          correction: "Try removing the keyword 'const' from the set literal.");
+
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the
    * initializer list of a constant constructor must be a potentially constant
@@ -2251,9 +2318,9 @@
   static const CompileTimeErrorCode PRIVATE_COLLISION_IN_MIXIN_APPLICATION =
       const CompileTimeErrorCode(
           'PRIVATE_COLLISION_IN_MIXIN_APPLICATION',
-          "The private name {0}, defined by {1}, conflicts with the same name "
-          "defined by {2}.",
-          correction: "Try removing {1} from the 'with' clause.");
+          "The private name '{0}', defined by '{1}', "
+          "conflicts with the same name defined by '{2}'.",
+          correction: "Try removing '{1}' from the 'with' clause.");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named
@@ -2555,13 +2622,13 @@
    * It is a compile-time error if a generic function type is used as an actual
    * type argument.
    */
-  static const CompileTimeErrorCode GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT =
+  static const CompileTimeErrorCode
+      GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT =
       const CompileTimeErrorCode(
-          'GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT',
-          "Generic function has type parameters '<{0}>', so it may not be used"
-          ' as a type argument',
-          correction: "Try removing the type parameters '<{0}>', or using"
-              " 'dynamic' as the type argument here instead of a function.");
+          'GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT',
+          "A generic function type cannot be a type argument.",
+          correction: "Try removing type parameters from the generic function "
+              "type, or using 'dynamic' as the type argument here.");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via
@@ -2808,6 +2875,17 @@
           correction: "Try adjusting the number of type arguments.");
 
   /**
+   * Parameters:
+   * 0: the number of provided type arguments
+   */
+  static const StaticTypeWarningCode EXPECTED_ONE_SET_TYPE_ARGUMENTS =
+      const StaticTypeWarningCode(
+          'EXPECTED_ONE_SET_TYPE_ARGUMENTS',
+          "Set literals require exactly one type argument or none, "
+          "but {0} found.",
+          correction: "Try adjusting the number of type arguments.");
+
+  /**
    * 12.8 Maps: A fresh instance (7.6.1) <i>m</i>, of size <i>n</i>, whose class
    * implements the built-in class <i>Map&lt;K, V></i> is allocated.
    *
@@ -2938,7 +3016,7 @@
    */
   static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION_EXPRESSION =
       const StaticTypeWarningCode('INVOCATION_OF_NON_FUNCTION_EXPRESSION',
-          "The expression doesn't evaluate to a function, so it can't invoked.");
+          "The expression doesn't evaluate to a function, so it can't be invoked.");
 
   /**
    * 12.20 Conditional: It is a static type warning if the type of
@@ -3145,22 +3223,6 @@
               "defining a method named '{0}'.");
 
   /**
-   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
-   * It is a static type warning if <i>T</i> does not have an accessible
-   * instance member named <i>m</i>.
-   *
-   * Parameters:
-   * 0: the name of the method that is undefined
-   * 1: the resolved type name that the method lookup is happening on
-   */
-  static const StaticTypeWarningCode UNDEFINED_METHOD_WITH_CONSTRUCTOR =
-      const StaticTypeWarningCode('UNDEFINED_METHOD_WITH_CONSTRUCTOR',
-          "The method '{0}' isn't defined for the class '{1}', but a constructor with that name is defined.",
-          correction:
-              "Try adding 'new' or 'const' to invoke the constructor, or "
-              "correcting the name to the name of an existing method.");
-
-  /**
    * 12.18 Assignment: Evaluation of an assignment of the form
    * <i>e<sub>1</sub></i>[<i>e<sub>2</sub></i>] = <i>e<sub>3</sub></i> is
    * equivalent to the evaluation of the expression (a, i, e){a.[]=(i, e);
@@ -3599,6 +3661,14 @@
       'EQUAL_KEYS_IN_MAP', "Two keys in a map literal can't be equal.");
 
   /**
+   * It is a compile-time error if any two of the values in a constant set are
+   * equal according to `==`.
+   */
+  static const StaticWarningCode EQUAL_VALUES_IN_CONST_SET =
+      const StaticWarningCode('EQUAL_VALUES_IN_CONST_SET',
+          "Two values in a constant set can't be equal.");
+
+  /**
    * 14.2 Exports: It is a static warning to export two different libraries with
    * the same name.
    *
@@ -3931,6 +4001,10 @@
    * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
    * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
    * &lt;= j &lt;= m</i>.
+   *
+   * Parameters:
+   * 0: the actual type of the list element
+   * 1: the expected type of the list element
    */
   static const StaticWarningCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE =
       const StaticWarningCode('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE',
@@ -4380,6 +4454,15 @@
       correction: null);
 
   /**
+   * Parameters:
+   * 0: the actual type of the set element
+   * 1: the expected type of the set element
+   */
+  static const StaticWarningCode SET_ELEMENT_TYPE_NOT_ASSIGNABLE =
+      const StaticWarningCode('SET_ELEMENT_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' can't be assigned to the set type '{1}'.");
+
+  /**
    * 12.16.3 Static Invocation: It is a static warning if <i>C</i> does not
    * declare a static method or getter <i>m</i>.
    *
@@ -4639,6 +4722,13 @@
       "type can be changed with an explicit generic type arguments or by "
       "changing the key and value types.");
 
+  static const StrongModeCode INVALID_CAST_LITERAL_SET = const StrongModeCode(
+      ErrorType.COMPILE_TIME_ERROR,
+      'INVALID_CAST_LITERAL_SET',
+      "The set literal type '{0}' isn't of expected type '{1}'. The set's "
+      "type can be changed with an explicit generic type argument or by "
+      "changing the element types.");
+
   static const StrongModeCode INVALID_CAST_FUNCTION_EXPR = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_FUNCTION_EXPR',
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index b74f141..20ecec0 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -1,11 +1,11 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
@@ -17,7 +17,7 @@
 class InheritanceOverrideVerifier {
   static const _missingOverridesKey = 'missingOverrides';
 
-  final StrongTypeSystemImpl _typeSystem;
+  final TypeSystem _typeSystem;
   final TypeProvider _typeProvider;
   final InheritanceManager2 _inheritance;
   final ErrorReporter _reporter;
@@ -78,7 +78,7 @@
 }
 
 class _ClassVerifier {
-  final StrongTypeSystemImpl typeSystem;
+  final TypeSystem typeSystem;
   final TypeProvider typeProvider;
   final InheritanceManager2 inheritance;
   final ErrorReporter reporter;
@@ -94,8 +94,12 @@
   final TypeName superclass;
   final WithClause withClause;
 
+  /// The set of unique supertypes of the current class.
+  /// It is used to decide when to add a new element to [allSuperinterfaces].
+  final Set<InterfaceType> allSupertypes = new Set<InterfaceType>();
+
   /// The list of all superinterfaces, collected so far.
-  final List<InterfaceType> allSuperinterfaces = [];
+  final List<Interface> allSuperinterfaces = [];
 
   _ClassVerifier({
     this.typeSystem,
@@ -118,12 +122,15 @@
       return;
     }
 
+    if (_checkForRecursiveInterfaceInheritance(classElement)) {
+      return;
+    }
+
     InterfaceTypeImpl type = classElement.type;
 
     // Add all superinterfaces of the direct supertype.
     if (type.superclass != null) {
-      ClassElementImpl.collectAllSupertypes(
-          allSuperinterfaces, type.superclass, null);
+      _addSuperinterfaces(type.superclass);
     }
 
     // Each mixin in `class C extends S with M0, M1, M2 {}` is equivalent to:
@@ -136,15 +143,14 @@
     var mixinNodes = withClause?.mixinTypes;
     var mixinTypes = type.mixins;
     for (var i = 0; i < mixinTypes.length; i++) {
-      _checkDeclaredMembers(mixinNodes[i], mixinTypes[i]);
-      ClassElementImpl.collectAllSupertypes(
-          allSuperinterfaces, mixinTypes[i], null);
+      var mixinType = mixinTypes[i];
+      _checkDeclaredMembers(mixinNodes[i], mixinType);
+      _addSuperinterfaces(mixinType);
     }
 
     // Add all superinterfaces of the direct class interfaces.
     for (var interface in type.interfaces) {
-      ClassElementImpl.collectAllSupertypes(
-          allSuperinterfaces, interface, null);
+      _addSuperinterfaces(interface);
     }
 
     // Check the members if the class itself, against all the previously
@@ -163,33 +169,31 @@
     }
 
     // Compute the interface of the class.
-    var interfaceMembers = inheritance.getInterface(type);
+    var interface = inheritance.getInterface(type);
 
     // Report conflicts between direct superinterfaces of the class.
-    for (var conflict in interfaceMembers.conflicts) {
+    for (var conflict in interface.conflicts) {
       _reportInconsistentInheritance(classNameNode, conflict);
     }
 
-    _checkForMismatchedAccessorTypes(interfaceMembers);
+    _checkForMismatchedAccessorTypes(interface);
 
     if (!classElement.isAbstract) {
       List<FunctionType> inheritedAbstract = null;
 
-      for (var name in interfaceMembers.map.keys) {
+      for (var name in interface.map.keys) {
         if (!name.isAccessibleFor(libraryUri)) {
           continue;
         }
 
-        var interfaceType = interfaceMembers.map[name];
-        var concreteType = inheritance.getMember(type, name, concrete: true);
+        var interfaceType = interface.map[name];
+        var concreteType = interface.implemented[name];
 
         // No concrete implementation of the name.
         if (concreteType == null) {
-          if (!classElement.hasNoSuchMethod) {
-            if (!_reportConcreteClassWithAbstractMember(name.name)) {
-              inheritedAbstract ??= [];
-              inheritedAbstract.add(interfaceType);
-            }
+          if (!_reportConcreteClassWithAbstractMember(name.name)) {
+            inheritedAbstract ??= [];
+            inheritedAbstract.add(interfaceType);
           }
           continue;
         }
@@ -226,6 +230,18 @@
     }
   }
 
+  void _addSuperinterfaces(InterfaceType startingType) {
+    var supertypes = <InterfaceType>[];
+    ClassElementImpl.collectAllSupertypes(supertypes, startingType, null);
+    for (int i = 0; i < supertypes.length; i++) {
+      var supertype = supertypes[i];
+      if (allSupertypes.add(supertype)) {
+        var interface = inheritance.getInterface(supertype);
+        allSuperinterfaces.add(interface);
+      }
+    }
+  }
+
   /// Check that the given [member] is a valid override of the corresponding
   /// instance members in each of [allSuperinterfaces].  The [libraryUri] is
   /// the URI of the library containing the [member].
@@ -238,8 +254,8 @@
     if (member.isStatic) return;
 
     var name = new Name(libraryUri, member.name);
-    for (var superType in allSuperinterfaces) {
-      var superMemberType = inheritance.getInterface(superType).map[name];
+    for (var superInterface in allSuperinterfaces) {
+      var superMemberType = superInterface.declared[name];
       if (superMemberType != null) {
         // The case when members have different kinds is reported in verifier.
         // TODO(scheglov) Do it here?
@@ -352,7 +368,7 @@
       if (getter.element.kind == ElementKind.GETTER) {
         // TODO(scheglov) We should separate getters and setters.
         var setter = interface.map[new Name(libraryUri, '${name.name}=')];
-        if (setter != null) {
+        if (setter != null && setter.parameters.length == 1) {
           var getterType = getter.returnType;
           var setterType = setter.parameters[0].type;
           if (!typeSystem.isAssignableTo(getterType, setterType)) {
@@ -390,6 +406,106 @@
     }
   }
 
+  /// Check that [classElement] is not a superinterface to itself.
+  /// The [path] is a list containing the potentially cyclic implements path.
+  ///
+  /// See [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE],
+  /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS],
+  /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS],
+  /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON],
+  /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH].
+  bool _checkForRecursiveInterfaceInheritance(ClassElement element,
+      [List<ClassElement> path]) {
+    path ??= <ClassElement>[];
+
+    // Detect error condition.
+    int size = path.length;
+    // If this is not the base case (size > 0), and the enclosing class is the
+    // given class element then report an error.
+    if (size > 0 && classElement == element) {
+      String className = classElement.displayName;
+      if (size > 1) {
+        // Construct a string showing the cyclic implements path:
+        // "A, B, C, D, A"
+        String separator = ", ";
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0; i < size; i++) {
+          buffer.write(path[i].displayName);
+          buffer.write(separator);
+        }
+        buffer.write(element.displayName);
+        reporter.reportErrorForElement(
+            CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+            classElement,
+            [className, buffer.toString()]);
+        return true;
+      } else {
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or
+        // RECURSIVE_INTERFACE_INHERITANCE_ON or
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
+        reporter.reportErrorForElement(
+            _getRecursiveErrorCode(element), classElement, [className]);
+        return true;
+      }
+    }
+
+    if (path.indexOf(element) > 0) {
+      return false;
+    }
+    path.add(element);
+
+    // n-case
+    InterfaceType supertype = element.supertype;
+    if (supertype != null &&
+        _checkForRecursiveInterfaceInheritance(supertype.element, path)) {
+      return true;
+    }
+
+    for (InterfaceType type in element.mixins) {
+      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
+        return true;
+      }
+    }
+
+    for (InterfaceType type in element.superclassConstraints) {
+      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
+        return true;
+      }
+    }
+
+    for (InterfaceType type in element.interfaces) {
+      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
+        return true;
+      }
+    }
+
+    path.removeAt(path.length - 1);
+    return false;
+  }
+
+  /// Return the error code that should be used when the given class [element]
+  /// references itself directly.
+  ErrorCode _getRecursiveErrorCode(ClassElement element) {
+    if (element.supertype?.element == classElement) {
+      return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS;
+    }
+
+    for (InterfaceType type in element.superclassConstraints) {
+      if (type.element == classElement) {
+        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON;
+      }
+    }
+
+    for (InterfaceType type in element.mixins) {
+      if (type.element == classElement) {
+        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH;
+      }
+    }
+
+    return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS;
+  }
+
   /// We identified that the current non-abstract class does not have the
   /// concrete implementation of a method with the given [name].  If this is
   /// because the class itself defines an abstract method with this [name],
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 382bfd6..94a0fbe 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -96,6 +96,13 @@
 
   bool parseFunctionBodies = true;
 
+  /// `true` if non-nullable behavior is enabled
+  bool enableNonNullable = false;
+
+  /// Is `true` if [enableNonNullable] is enabled, and the library directive
+  /// is annotated with `@pragma('analyzer:non-nullable')`.
+  bool hasPragmaAnalyzerNonNullable = false;
+
   AstBuilder(ErrorReporter errorReporter, this.fileUri, this.isFullAst,
       [Uri uri])
       : this.errorReporter = new FastaErrorReporter(errorReporter),
@@ -335,7 +342,7 @@
 
   void doPropertyGet() {}
 
-  void endExpressionStatement(Token semicolon) {
+  void handleExpressionStatement(Token semicolon) {
     assert(optional(';', semicolon));
     debugEvent("ExpressionStatement");
     Expression expression = pop();
@@ -625,12 +632,23 @@
         SimpleIdentifier fieldName;
         Expression left = initializerObject.leftHandSide;
         if (left is PropertyAccess) {
-          var thisExpression = left.target as ThisExpression;
-          thisKeyword = thisExpression.thisKeyword;
-          period = left.operator;
+          Expression target = left.target;
+          if (target is ThisExpression) {
+            thisKeyword = target.thisKeyword;
+            period = left.operator;
+          } else {
+            assert(target is SuperExpression);
+            // Recovery:
+            // Parser has reported FieldInitializedOutsideDeclaringClass.
+          }
           fieldName = left.propertyName;
+        } else if (left is SimpleIdentifier) {
+          fieldName = left;
         } else {
-          fieldName = left as SimpleIdentifier;
+          // Recovery:
+          // Parser has reported invalid assignment.
+          SuperExpression superExpression = left;
+          fieldName = ast.simpleIdentifier(superExpression.superKeyword);
         }
         initializers.add(ast.constructorFieldInitializer(
             thisKeyword,
@@ -767,6 +785,23 @@
     pop(); // block
   }
 
+  @override
+  void handleForInitializerEmptyStatement(Token token) {
+    debugEvent("ForInitializerEmptyStatement");
+    push(NullValue.Expression);
+  }
+
+  @override
+  void handleForInitializerExpressionStatement(Token token) {
+    debugEvent("ForInitializerExpressionStatement");
+  }
+
+  @override
+  void handleForInitializerLocalVariableDeclaration(Token token) {
+    debugEvent("ForInitializerLocalVariableDeclaration");
+  }
+
+  @override
   void endForStatement(Token forKeyword, Token leftParen, Token leftSeparator,
       int updateExpressionCount, Token endToken) {
     assert(optional('for', forKeyword));
@@ -862,6 +897,29 @@
     push(ast.nullLiteral(token));
   }
 
+  @override
+  void handleEmptyLiteralSetOrMap(
+      Token leftBrace, Token constKeyword, Token rightBrace) {
+    // TODO(danrubel): From a type resolution standpoint, this could be either
+    // a set literal or a map literal depending upon the context
+    // in which this expression occurs.
+    // For now, generate a map literal.
+    handleLiteralMap(0, leftBrace, constKeyword, rightBrace);
+  }
+
+  void handleLiteralSet(
+      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+    assert(optional('{', leftBracket));
+    assert(optionalOrNull('const', constKeyword));
+    assert(optional('}', rightBracket));
+    debugEvent("LiteralSet");
+
+    List<Expression> entries = popTypedList(count) ?? <Expression>[];
+    TypeArgumentList typeArguments = pop();
+    push(ast.setLiteral(
+        constKeyword, typeArguments, leftBracket, entries, rightBracket));
+  }
+
   void handleLiteralMap(
       int count, Token leftBracket, Token constKeyword, Token rightBracket) {
     assert(optional('{', leftBracket));
@@ -875,7 +933,7 @@
         constKeyword, typeArguments, leftBracket, entries, rightBracket));
   }
 
-  void endLiteralMapEntry(Token colon, Token endToken) {
+  void handleLiteralMapEntry(Token colon, Token endToken) {
     assert(optional(':', colon));
     debugEvent("LiteralMapEntry");
 
@@ -909,12 +967,15 @@
   }
 
   @override
-  void handleType(Token beginToken) {
+  void handleType(Token beginToken, Token questionMark) {
     debugEvent("Type");
+    if (!enableNonNullable) {
+      reportErrorIfNullableType(questionMark);
+    }
 
     TypeArgumentList arguments = pop();
     Identifier name = pop();
-    push(ast.typeName(name, arguments));
+    push(ast.typeName(name, arguments, question: questionMark));
   }
 
   @override
@@ -1066,15 +1127,19 @@
   }
 
   @override
-  void endFunctionType(Token functionToken) {
+  void endFunctionType(Token functionToken, Token questionMark) {
     assert(optional('Function', functionToken));
     debugEvent("FunctionType");
+    if (!enableNonNullable) {
+      reportErrorIfNullableType(questionMark);
+    }
 
     FormalParameterList parameters = pop();
     TypeAnnotation returnType = pop();
     TypeParameterList typeParameters = pop();
     push(ast.genericFunctionType(
-        returnType, functionToken, typeParameters, parameters));
+        returnType, functionToken, typeParameters, parameters,
+        question: questionMark));
   }
 
   void handleFormalParameterWithoutValue(Token token) {
@@ -1440,12 +1505,6 @@
     push(ast.label(name, colon));
   }
 
-  void handleNoExpression(Token token) {
-    debugEvent("NoExpression");
-
-    push(NullValue.Expression);
-  }
-
   void handleIndexedExpression(Token leftBracket, Token rightBracket) {
     assert(optional('[', leftBracket));
     assert(optional(']', rightBracket));
@@ -2036,6 +2095,23 @@
     List<SimpleIdentifier> libraryName = pop();
     var name = ast.libraryIdentifier(libraryName);
     List<Annotation> metadata = pop();
+    if (enableNonNullable && metadata != null) {
+      for (Annotation annotation in metadata) {
+        Identifier pragma = annotation.name;
+        if (pragma is SimpleIdentifier && pragma.name == 'pragma') {
+          NodeList<Expression> arguments = annotation.arguments.arguments;
+          if (arguments.length == 1) {
+            Expression tag = arguments[0];
+            if (tag is StringLiteral) {
+              if (tag.stringValue == 'analyzer:non-nullable') {
+                hasPragmaAnalyzerNonNullable = true;
+                break;
+              }
+            }
+          }
+        }
+      }
+    }
     Comment comment = _findComment(metadata, libraryKeyword);
     directives.add(ast.libraryDirective(
         comment, metadata, libraryKeyword, name, semicolon));
@@ -2507,7 +2583,7 @@
     // keyword up to an element?
     handleIdentifier(voidKeyword, IdentifierContext.typeReference);
     handleNoTypeArguments(voidKeyword);
-    handleType(voidKeyword);
+    handleType(voidKeyword, null);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/fasta/error_converter.dart b/pkg/analyzer/lib/src/fasta/error_converter.dart
index e6b36f3..50f2609 100644
--- a/pkg/analyzer/lib/src/fasta/error_converter.dart
+++ b/pkg/analyzer/lib/src/fasta/error_converter.dart
@@ -1,10 +1,12 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/token.dart' show Token;
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:front_end/src/fasta/messages.dart' show Code, Message;
 
 /// An error reporter that knows how to convert a Fasta error into an analyzer
@@ -45,10 +47,6 @@
             length,
             [lexeme()]);
         return;
-      case "CATCH_SYNTAX":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.CATCH_SYNTAX, offset, length);
-        return;
       case "CONCRETE_CLASS_WITH_ABSTRACT_MEMBER":
         errorReporter?.reportErrorForOffset(
             StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
@@ -99,20 +97,12 @@
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.EXPECTED_TYPE_NAME, offset, length);
         return;
-      case "EXTERNAL_CONSTRUCTOR_WITH_BODY":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, offset, length);
-        return;
       case "FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
             offset,
             length);
         return;
-      case "FINAL_AND_VAR":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.FINAL_AND_VAR, offset, length);
-        return;
       case "FINAL_NOT_INITIALIZED":
         String name = arguments['name'];
         errorReporter?.reportErrorForOffset(
@@ -138,10 +128,6 @@
         errorReporter?.reportErrorForOffset(
             ScannerErrorCode.ILLEGAL_CHARACTER, offset, length);
         return;
-      case "INITIALIZED_VARIABLE_IN_FOR_EACH":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH, offset, length);
-        return;
       case "INVALID_ASSIGNMENT":
         var type1 = arguments['type'];
         var type2 = arguments['type2'];
@@ -215,10 +201,6 @@
         errorReporter?.reportErrorForOffset(
             StrongModeCode.INVALID_SUPER_INVOCATION, offset, length);
         return;
-      case "MISSING_CATCH_OR_FINALLY":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.MISSING_CATCH_OR_FINALLY, offset, length);
-        return;
       case "MISSING_CLASS_BODY":
         errorReporter?.reportErrorForOffset(
             ParserErrorCode.MISSING_CLASS_BODY, offset, length);
@@ -296,10 +278,6 @@
             // involved in this error... either async* or sync*
             ['async*']);
         return;
-      case "STACK_OVERFLOW":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.STACK_OVERFLOW, offset, length);
-        return;
       case "SUPER_IN_REDIRECTING_CONSTRUCTOR":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
@@ -342,10 +320,6 @@
         errorReporter?.reportErrorForOffset(
             ScannerErrorCode.UNTERMINATED_STRING_LITERAL, offset, length);
         return;
-      case "VAR_AND_TYPE":
-        errorReporter?.reportErrorForOffset(
-            ParserErrorCode.VAR_AND_TYPE, offset, length);
-        return;
       case "WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER":
         errorReporter?.reportErrorForOffset(
             CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
diff --git a/pkg/analyzer/lib/src/generated/bazel.dart b/pkg/analyzer/lib/src/generated/bazel.dart
deleted file mode 100644
index 68e19fb..0000000
--- a/pkg/analyzer/lib/src/generated/bazel.dart
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:collection';
-import 'dart:core';
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/generated/workspace.dart';
-import 'package:analyzer/src/util/uri.dart';
-import 'package:path/path.dart';
-
-/**
- * Instances of the class `BazelFileUriResolver` resolve `file` URI's by first
- * resolving file uri's in the expected way, and then by looking in the
- * corresponding generated directories.
- */
-class BazelFileUriResolver extends ResourceUriResolver {
-  final BazelWorkspace workspace;
-
-  BazelFileUriResolver(BazelWorkspace workspace)
-      : workspace = workspace,
-        super(workspace.provider);
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    if (!ResourceUriResolver.isFileUri(uri)) {
-      return null;
-    }
-    String path = fileUriToNormalizedPath(provider.pathContext, uri);
-    File file = workspace.findFile(path);
-    if (file != null) {
-      return file.createSource(actualUri ?? uri);
-    }
-    return null;
-  }
-}
-
-/**
- * The [UriResolver] that can resolve `package` URIs in [BazelWorkspace].
- */
-class BazelPackageUriResolver extends UriResolver {
-  final BazelWorkspace _workspace;
-  final Context _context;
-
-  /**
-   * The cache of absolute [Uri]s to [Source]s mappings.
-   */
-  final Map<Uri, Source> _sourceCache = new HashMap<Uri, Source>();
-
-  BazelPackageUriResolver(BazelWorkspace workspace)
-      : _workspace = workspace,
-        _context = workspace.provider.pathContext;
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    return _sourceCache.putIfAbsent(uri, () {
-      if (uri.scheme != 'package') {
-        return null;
-      }
-      String uriPath = uri.path;
-      int slash = uriPath.indexOf('/');
-
-      // If the path either starts with a slash or has no slash, it is invalid.
-      if (slash < 1) {
-        return null;
-      }
-
-      String packageName = uriPath.substring(0, slash);
-      String fileUriPart = uriPath.substring(slash + 1);
-      String filePath = fileUriPart.replaceAll('/', _context.separator);
-
-      if (packageName.indexOf('.') == -1) {
-        String path = _context.join(_workspace.root, 'third_party', 'dart',
-            packageName, 'lib', filePath);
-        File file = _workspace.findFile(path);
-        return file?.createSource(uri);
-      } else {
-        String packagePath = packageName.replaceAll('.', _context.separator);
-        String path =
-            _context.join(_workspace.root, packagePath, 'lib', filePath);
-        File file = _workspace.findFile(path);
-        return file?.createSource(uri);
-      }
-    });
-  }
-
-  @override
-  Uri restoreAbsolute(Source source) {
-    Context context = _workspace.provider.pathContext;
-    String path = source.fullName;
-
-    Uri restore(String root, String path) {
-      if (root != null && context.isWithin(root, path)) {
-        String relative = context.relative(path, from: root);
-        List<String> components = context.split(relative);
-        if (components.length > 4 &&
-            components[0] == 'third_party' &&
-            components[1] == 'dart' &&
-            components[3] == 'lib') {
-          String packageName = components[2];
-          String pathInLib = components.skip(4).join('/');
-          return Uri.parse('package:$packageName/$pathInLib');
-        } else {
-          for (int i = 2; i < components.length - 1; i++) {
-            String component = components[i];
-            if (component == 'lib') {
-              String packageName = components.getRange(0, i).join('.');
-              String pathInLib = components.skip(i + 1).join('/');
-              return Uri.parse('package:$packageName/$pathInLib');
-            }
-          }
-        }
-      }
-      return null;
-    }
-
-    // Search in each root.
-    for (String root in [
-      _workspace.bin,
-      _workspace.genfiles,
-      _workspace.readonly,
-      _workspace.root
-    ]) {
-      Uri uri = restore(root, path);
-      if (uri != null) {
-        return uri;
-      }
-    }
-
-    return null;
-  }
-}
-
-/**
- * Information about a Bazel workspace.
- */
-class BazelWorkspace extends Workspace {
-  static const String _WORKSPACE = 'WORKSPACE';
-  static const String _READONLY = 'READONLY';
-
-  /**
-   * Default prefix for "-genfiles" and "-bin" that will be assumed if no build
-   * output symlinks are found.
-   */
-  static const defaultSymlinkPrefix = 'bazel';
-
-  final ResourceProvider provider;
-
-  /**
-   * The absolute workspace root path.
-   *
-   * It contains the `WORKSPACE` file or its parent contains the `READONLY`
-   * folder.
-   */
-  final String root;
-
-  /**
-   * The absolute path to the optional read only workspace root, in the
-   * `READONLY` folder if a git-based workspace, or `null`.
-   */
-  final String readonly;
-
-  /**
-   * The absolute path to the `bazel-bin` folder.
-   */
-  final String bin;
-
-  /**
-   * The absolute path to the `bazel-genfiles` folder.
-   */
-  final String genfiles;
-
-  BazelWorkspace._(
-      this.provider, this.root, this.readonly, this.bin, this.genfiles);
-
-  @override
-  Map<String, List<Folder>> get packageMap => null;
-
-  @override
-  UriResolver get packageUriResolver => new BazelPackageUriResolver(this);
-
-  @override
-  SourceFactory createSourceFactory(DartSdk sdk) {
-    List<UriResolver> resolvers = <UriResolver>[];
-    if (sdk != null) {
-      resolvers.add(new DartUriResolver(sdk));
-    }
-    resolvers.add(packageUriResolver);
-    resolvers.add(new BazelFileUriResolver(this));
-    return new SourceFactory(resolvers, null, provider);
-  }
-
-  /**
-   * Return the file with the given [absolutePath], looking first into
-   * directories for generated files: `bazel-bin` and `bazel-genfiles`, and
-   * then into the workspace root. The file in the workspace root is returned
-   * even if it does not exist. Return `null` if the given [absolutePath] is
-   * not in the workspace [root].
-   */
-  File findFile(String absolutePath) {
-    Context context = provider.pathContext;
-    try {
-      String relative = context.relative(absolutePath, from: root);
-      if (relative == '.') {
-        return null;
-      }
-      // genfiles
-      if (genfiles != null) {
-        File file = provider.getFile(context.join(genfiles, relative));
-        if (file.exists) {
-          return file;
-        }
-      }
-      // bin
-      if (bin != null) {
-        File file = provider.getFile(context.join(bin, relative));
-        if (file.exists) {
-          return file;
-        }
-      }
-      // Writable
-      File writableFile = provider.getFile(absolutePath);
-      if (writableFile.exists) {
-        return writableFile;
-      }
-      // READONLY
-      if (readonly != null) {
-        File file = provider.getFile(context.join(readonly, relative));
-        if (file.exists) {
-          return file;
-        }
-      }
-      // Not generated, return the default one.
-      return writableFile;
-    } catch (_) {
-      return null;
-    }
-  }
-
-  /**
-   * Find the Bazel workspace that contains the given [path].
-   *
-   * Return `null` if a workspace markers, such as the `WORKSPACE` file, or
-   * the sibling `READONLY` folder cannot be found.
-   *
-   * Return `null` if the workspace does not have `bazel-genfiles` or
-   * `blaze-genfiles` folders, so we don't know where to search generated files.
-   *
-   * Return `null` if there is a folder 'foo' with the sibling `READONLY`
-   * folder, but there is corresponding folder 'foo' in `READONLY`, i.e. the
-   * corresponding readonly workspace root.
-   */
-  static BazelWorkspace find(ResourceProvider provider, String path) {
-    Context context = provider.pathContext;
-
-    // Ensure that the path is absolute and normalized.
-    if (!context.isAbsolute(path)) {
-      throw new ArgumentError('not absolute: $path');
-    }
-    path = context.normalize(path);
-
-    Folder folder = provider.getFolder(path);
-    while (true) {
-      Folder parent = folder.parent;
-      if (parent == null) {
-        return null;
-      }
-
-      // Found the READONLY folder, might be a git-based workspace.
-      Folder readonlyFolder = parent.getChildAssumingFolder(_READONLY);
-      if (readonlyFolder.exists) {
-        String root = folder.path;
-        String readonlyRoot =
-            context.join(readonlyFolder.path, folder.shortName);
-        if (provider.getFolder(readonlyRoot).exists) {
-          String symlinkPrefix = _findSymlinkPrefix(provider, root);
-          if (symlinkPrefix != null) {
-            return new BazelWorkspace._(
-                provider,
-                root,
-                readonlyRoot,
-                context.join(root, '$symlinkPrefix-bin'),
-                context.join(root, '$symlinkPrefix-genfiles'));
-          }
-        }
-      }
-
-      // Found the WORKSPACE file, must be a non-git workspace.
-      if (folder.getChildAssumingFile(_WORKSPACE).exists) {
-        String root = folder.path;
-        String symlinkPrefix = _findSymlinkPrefix(provider, root);
-        if (symlinkPrefix == null) {
-          return null;
-        }
-        return new BazelWorkspace._(
-            provider,
-            root,
-            null,
-            context.join(root, '$symlinkPrefix-bin'),
-            context.join(root, '$symlinkPrefix-genfiles'));
-      }
-
-      // Go up the folder.
-      folder = parent;
-    }
-  }
-
-  /**
-   * Return the symlink prefix for folders `X-bin` or `X-genfiles` by probing
-   * the internal `blaze-genfiles` and `bazel-genfiles`. Make a default
-   * assumption according to defaultSymlinkPrefix if neither of the folders
-   * exists.
-   */
-  static String _findSymlinkPrefix(ResourceProvider provider, String root) {
-    Context context = provider.pathContext;
-    if (provider.getFolder(context.join(root, 'blaze-genfiles')).exists) {
-      return 'blaze';
-    }
-    if (provider.getFolder(context.join(root, 'bazel-genfiles')).exists) {
-      return 'bazel';
-    }
-    // Couldn't find it.  Make a default assumption.
-    return defaultSymlinkPrefix;
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 077f807..b4a0bda 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -12,7 +12,7 @@
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/source.dart' show Source;
 import 'package:analyzer/src/generated/type_system.dart'
-    show StrongTypeSystemImpl, TypeSystem;
+    show Dart2TypeSystem, TypeSystem;
 
 export 'package:analyzer/dart/analysis/declared_variables.dart';
 export 'package:analyzer/dart/constant/value.dart';
@@ -118,7 +118,7 @@
    */
   ConstantEvaluator(this._source, TypeProvider typeProvider,
       {TypeSystem typeSystem})
-      : _typeSystem = typeSystem ?? new StrongTypeSystemImpl(typeProvider),
+      : _typeSystem = typeSystem ?? new Dart2TypeSystem(typeProvider),
         _typeProvider = typeProvider;
 
   EvaluationResult evaluate(Expression expression) {
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 0f0d19b..7175395 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -103,7 +103,7 @@
     ConstructorElement element = _match(node.name, _walker.getConstructor(),
         offset: node.name?.offset ?? node.returnType.offset);
     _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () {
-      node.element = element;
+      (node as ConstructorDeclarationImpl).declaredElement = element;
       super.visitConstructorDeclaration(node);
     });
     resolveMetadata(node, node.metadata, element);
@@ -232,7 +232,8 @@
       }
     }
     _setGenericFunctionType(node.returnType, element.returnType);
-    node.functionExpression.element = element;
+    (node.functionExpression as FunctionExpressionImpl).declaredElement =
+        element;
     _walker._elementHolder?.addFunction(element);
     _walk(new ElementWalker.forExecutable(element, _enclosingUnit), () {
       super.visitFunctionDeclaration(node);
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index b759dd0..dbb487e 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -19,6 +19,7 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/method_invocation_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -82,7 +83,7 @@
  * combinators that are not defined in the imported library (which is not an
  * error).
  */
-class ElementResolver extends SimpleAstVisitor<Object> {
+class ElementResolver extends SimpleAstVisitor<void> {
   /**
    * The manager for the inheritance mappings.
    */
@@ -104,28 +105,25 @@
   DartType _dynamicType;
 
   /**
-   * The type representing the type 'type'.
+   * The type representing the type 'Type'.
    */
   InterfaceType _typeType;
 
-  /**
-   * The object keeping track of which elements have had their types promoted.
-   */
-  TypePromotionManager _promoteManager;
-
   /// Whether constant evaluation errors should be reported during resolution.
   final bool reportConstEvaluationErrors;
 
+  final MethodInvocationResolver _methodInvocationResolver;
+
   /**
    * Initialize a newly created visitor to work for the given [_resolver] to
    * resolve the nodes in a compilation unit.
    */
   ElementResolver(this._resolver, {this.reportConstEvaluationErrors: true})
       : _inheritance = _resolver.inheritance,
-        _definingLibrary = _resolver.definingLibrary {
+        _definingLibrary = _resolver.definingLibrary,
+        _methodInvocationResolver = new MethodInvocationResolver(_resolver) {
     _dynamicType = _resolver.typeProvider.dynamicType;
     _typeType = _resolver.typeProvider.typeType;
-    _promoteManager = _resolver.promoteManager;
   }
 
   /**
@@ -141,7 +139,7 @@
   }
 
   @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
+  void visitAssignmentExpression(AssignmentExpression node) {
     Token operator = node.operator;
     TokenType operatorType = operator.type;
     Expression leftHandSide = node.leftHandSide;
@@ -154,14 +152,14 @@
         staticType.isVoid) {
       _recordUndefinedToken(
           null, StaticWarningCode.USE_OF_VOID_RESULT, operator, []);
-      return null;
+      return;
     }
 
     if (operatorType != TokenType.AMPERSAND_AMPERSAND_EQ &&
         operatorType != TokenType.BAR_BAR_EQ &&
         operatorType != TokenType.EQ &&
         operatorType != TokenType.QUESTION_QUESTION_EQ) {
-      operatorType = _operatorFromCompoundAssignment(operatorType);
+      operatorType = operatorFromCompoundAssignment(operatorType);
       if (leftHandSide != null) {
         String methodName = operatorType.lexeme;
         MethodElement staticMethod =
@@ -176,40 +174,35 @@
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     Token operator = node.operator;
     if (operator.isUserDefinableOperator) {
       _resolveBinaryExpression(node, operator.lexeme);
     } else if (operator.type == TokenType.BANG_EQ) {
       _resolveBinaryExpression(node, TokenType.EQ_EQ.lexeme);
     }
-    return null;
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     node.target = _lookupBreakOrContinueTarget(node, node.label, false);
-    return null;
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitCommentReference(CommentReference node) {
+  void visitCommentReference(CommentReference node) {
     Identifier identifier = node.identifier;
     if (identifier is SimpleIdentifier) {
       Element element = _resolveSimpleIdentifier(identifier);
@@ -249,7 +242,7 @@
           // TODO(brianwilkerson) Report this error?
           element = _resolver.nameScope.lookup(identifier, _definingLibrary);
           name.staticElement = element;
-          return null;
+          return;
         }
         LibraryElement library = element.library;
         if (library == null) {
@@ -293,11 +286,10 @@
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     ConstructorElement element = node.declaredElement;
     if (element is ConstructorElementImpl) {
@@ -317,20 +309,18 @@
       }
       resolveMetadata(node);
     }
-    return null;
   }
 
   @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     SimpleIdentifier fieldName = node.fieldName;
     ClassElement enclosingClass = _resolver.enclosingClass;
     FieldElement fieldElement = enclosingClass.getField(fieldName.name);
     fieldName.staticElement = fieldElement;
-    return null;
   }
 
   @override
-  Object visitConstructorName(ConstructorName node) {
+  void visitConstructorName(ConstructorName node) {
     DartType type = node.type.type;
     if (type != null && type.isDynamic) {
       // Nothing to do.
@@ -358,29 +348,25 @@
 //        // This is part of a redirecting factory constructor; not sure which error code to use
 //      }
     }
-    return null;
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     node.target = _lookupBreakOrContinueTarget(node, node.label, true);
-    return null;
   }
 
   @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     ExportElement exportElement = node.element;
     if (exportElement != null) {
       // The element is null when the URI is invalid
@@ -389,23 +375,21 @@
       _resolveCombinators(exportElement.exportedLibrary, node.combinators);
       resolveMetadata(node);
     }
-    return null;
   }
 
   @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
+  void visitFieldFormalParameter(FieldFormalParameter node) {
     _resolveMetadataForParameter(node);
-    return super.visitFieldFormalParameter(node);
+    super.visitFieldFormalParameter(node);
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     Expression function = node.function;
     DartType staticInvokeType = _instantiateGenericMethod(
         function.staticType, node.typeArguments, node);
@@ -417,23 +401,20 @@
     if (parameters != null) {
       node.argumentList.correspondingStaticParameters = parameters;
     }
-    return null;
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     _resolveMetadataForParameter(node);
-    return null;
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     SimpleIdentifier prefixNode = node.prefix;
     if (prefixNode != null) {
       String prefixName = prefixNode.name;
@@ -456,11 +437,10 @@
       }
       resolveMetadata(node);
     }
-    return null;
   }
 
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     Expression target = node.realTarget;
     DartType staticType = _getStaticType(target);
     String getterMethodName = TokenType.INDEX.lexeme;
@@ -475,7 +455,7 @@
       node.staticElement = setterStaticMethod;
       // generate undefined method warning
       _checkForUndefinedIndexOperator(
-          node, target, getterMethodName, setterStaticMethod, staticType);
+          node, target, setterMethodName, setterStaticMethod, staticType);
       // lookup getter method
       MethodElement getterStaticMethod =
           _lookUpMethod(target, staticType, getterMethodName);
@@ -505,11 +485,10 @@
       _checkForUndefinedIndexOperator(
           node, target, setterMethodName, staticMethod, staticType);
     }
-    return null;
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorElement invokedConstructor = node.constructorName.staticElement;
     node.staticElement = invokedConstructor;
     ArgumentList argumentList = node.argumentList;
@@ -520,246 +499,35 @@
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
-    return null;
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) {
+  void visitLibraryDirective(LibraryDirective node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    SimpleIdentifier methodName = node.methodName;
-    //
-    // Synthetic identifiers have been already reported during parsing.
-    //
-    if (methodName.isSynthetic) {
-      return null;
-    }
-    //
-    // We have a method invocation of one of two forms: 'e.m(a1, ..., an)' or
-    // 'm(a1, ..., an)'. The first step is to figure out which executable is
-    // being invoked, using both the static and the propagated type information.
-    //
-    Expression target = node.realTarget;
-    if (target is SuperExpression && !_isSuperInValidContext(target)) {
-      return null;
-    }
-    Element staticElement;
-    if (target == null) {
-      staticElement = _resolveInvokedElement(methodName);
-    } else if (methodName.name == FunctionElement.LOAD_LIBRARY_NAME &&
-        _isDeferredPrefix(target)) {
-      if (node.operator.type == TokenType.QUESTION_PERIOD) {
-        _resolver.errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
-            target,
-            [(target as SimpleIdentifier).name]);
-      }
-      LibraryElement importedLibrary = _getImportedLibrary(target);
-      FunctionElement loadLibraryFunction =
-          importedLibrary?.loadLibraryFunction;
-      methodName.staticElement = loadLibraryFunction;
-      node.staticInvokeType = loadLibraryFunction?.type;
-      return null;
-    } else {
-      //
-      // If this method invocation is of the form 'C.m' where 'C' is a class,
-      // then we don't call resolveInvokedElement(...) which walks up the class
-      // hierarchy, instead we just look for the member in the type only.  This
-      // does not apply to conditional method invocation (i.e. 'C?.m(...)').
-      //
-      bool isConditional = node.operator.type == TokenType.QUESTION_PERIOD;
-      ClassElement typeReference = getTypeReference(target);
-
-      if (typeReference != null) {
-        if (node.isCascaded) {
-          typeReference = _typeType.element;
-        }
-        staticElement = _resolveElement(typeReference, methodName);
-      } else {
-        DartType staticType = _getStaticTypeOrFunctionType(target);
-
-        if (staticType is FunctionType &&
-            methodName.name == FunctionElement.CALL_METHOD_NAME) {
-          if (target is SimpleIdentifier) {
-            methodName.staticElement = target.staticElement;
-          }
-          methodName.staticType = target.staticType;
-          node.staticType = staticType;
-          node.staticInvokeType = staticType;
-          node.argumentList.correspondingStaticParameters =
-              _computeCorrespondingParameters(node.argumentList, staticType);
-          return null;
-        }
-
-        if (target is SuperExpression) {
-          if (staticType is InterfaceTypeImpl) {
-            staticElement = staticType.lookUpInheritedMember(
-                methodName.name, _definingLibrary,
-                concrete: true, forSuperInvocation: true);
-            // We were not able to find the concrete dispatch target.
-            // But we would like to give the user at least some resolution.
-            // So, we retry without the "concrete" requirement.
-            if (staticElement == null) {
-              staticElement = staticType.lookUpInheritedMember(
-                  methodName.name, _definingLibrary,
-                  concrete: false);
-              if (staticElement != null) {
-                _resolver.errorReporter.reportErrorForNode(
-                    CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
-                    methodName,
-                    [staticElement.kind.displayName, methodName.name]);
-              }
-            }
-          }
-        } else {
-          staticElement = _resolveInvokedElementWithTarget(
-              target, staticType, methodName, isConditional);
-        }
-      }
-    }
-
-    staticElement = _convertSetterToGetter(staticElement);
-
-    //
-    // Given the elements, determine the type of the function we are invoking
-    //
-    DartType staticType = _getInvokeType(staticElement);
-    methodName.staticType = staticType;
-
-    //
-    // Instantiate generic function or method if needed.
-    //
-    DartType staticInvokeType = _instantiateGenericMethod(
-        staticType, node.typeArguments, node.methodName);
-
-    //
-    // Record the results.
-    //
-    methodName.staticElement = staticElement;
-    node.staticInvokeType = staticInvokeType;
-    ArgumentList argumentList = node.argumentList;
-    if (staticInvokeType != null) {
-      List<ParameterElement> parameters =
-          _computeCorrespondingParameters(argumentList, staticInvokeType);
-      argumentList.correspondingStaticParameters = parameters;
-    }
-    //
-    // Then check for error conditions.
-    //
-    ErrorCode errorCode = _checkForInvocationError(
-        target, true, staticElement, staticType, methodName.name);
-    if (errorCode != null &&
-        target is SimpleIdentifier &&
-        target.staticElement is PrefixElement) {
-      Identifier functionName =
-          new PrefixedIdentifierImpl.temp(target, methodName);
-      if (_resolver.nameScope.shouldIgnoreUndefined(functionName)) {
-        return null;
-      }
-    }
-    if (errorCode == null) {
-      return null;
-    }
-
-    if (identical(
-            errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION) ||
-        identical(errorCode,
-            CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT) ||
-        identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) {
-      if (!_resolver.nameScope.shouldIgnoreUndefined(methodName)) {
-        _resolver.errorReporter
-            .reportErrorForNode(errorCode, methodName, [methodName.name]);
-      }
-    } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) {
-      String targetTypeName;
-      if (target == null) {
-        ClassElement enclosingClass = _resolver.enclosingClass;
-        targetTypeName = enclosingClass.displayName;
-        ErrorCode proxyErrorCode = StaticTypeWarningCode.UNDEFINED_METHOD;
-        _recordUndefinedNode(_resolver.enclosingClass, proxyErrorCode,
-            methodName, [methodName.name, targetTypeName]);
-      } else {
-        // ignore Function "call"
-        // (if we are about to create a hint using type propagation,
-        // then we can use type propagation here as well)
-        DartType targetType = null;
-        targetType = _getStaticType(target);
-        if (targetType != null &&
-            targetType.isDartCoreFunction &&
-            methodName.name == FunctionElement.CALL_METHOD_NAME) {
-          return null;
-        }
-        if (!node.isCascaded) {
-          ClassElement typeReference = getTypeReference(target);
-          if (typeReference != null) {
-            ConstructorElement constructor =
-                typeReference.getNamedConstructor(methodName.name);
-            if (constructor != null) {
-              _recordUndefinedNode(
-                  typeReference,
-                  StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR,
-                  methodName,
-                  [methodName.name, typeReference.name]);
-              return null;
-            }
-          }
-        }
-
-        targetTypeName = targetType?.displayName;
-        ErrorCode proxyErrorCode = StaticTypeWarningCode.UNDEFINED_METHOD;
-
-        _recordUndefinedNode(targetType.element, proxyErrorCode, methodName,
-            [methodName.name, targetTypeName]);
-      }
-    } else if (identical(
-        errorCode, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD)) {
-      // Generate the type name.
-      // The error code will never be generated via type propagation
-      DartType getSuperType(DartType type) {
-        if (type is InterfaceType) {
-          InterfaceType superclass = type.superclass;
-          if (superclass != null) return superclass;
-        }
-        return type;
-      }
-
-      DartType targetType = getSuperType(_getStaticType(target));
-      String targetTypeName = targetType?.name;
-      _resolver.errorReporter.reportErrorForNode(
-          StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
-          methodName,
-          [methodName.name, targetTypeName]);
-    } else if (identical(errorCode, StaticWarningCode.USE_OF_VOID_RESULT)) {
-      _resolver.errorReporter.reportErrorForNode(
-          StaticWarningCode.USE_OF_VOID_RESULT, target ?? methodName, []);
-    }
-    return null;
+  void visitMethodInvocation(MethodInvocation node) {
+    _methodInvocationResolver.resolve(node);
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitPartDirective(PartDirective node) {
+  void visitPartDirective(PartDirective node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(PostfixExpression node) {
     Expression operand = node.operand;
     String methodName = _getPostfixOperator(node);
     DartType staticType = _getStaticType(operand);
@@ -780,11 +548,10 @@
             [methodName, staticType.displayName]);
       }
     }
-    return null;
   }
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
     SimpleIdentifier identifier = node.identifier;
     //
@@ -794,7 +561,7 @@
         _isDeferredPrefix(prefix)) {
       LibraryElement importedLibrary = _getImportedLibrary(prefix);
       identifier.staticElement = importedLibrary?.loadLibraryFunction;
-      return null;
+      return;
     }
     //
     // Check to see whether the prefix is really a prefix.
@@ -810,7 +577,7 @@
         element = _resolver.nameScope.lookup(setterName, _definingLibrary);
       }
       if (element == null && _resolver.nameScope.shouldIgnoreUndefined(node)) {
-        return null;
+        return;
       }
       if (element == null) {
         if (identifier.inSetterContext()) {
@@ -818,7 +585,7 @@
               StaticTypeWarningCode.UNDEFINED_SETTER,
               identifier,
               [identifier.name, prefixElement.name]);
-          return null;
+          return;
         }
         AstNode parent = node.parent;
         if (parent is Annotation) {
@@ -832,7 +599,7 @@
               identifier,
               [identifier.name, prefixElement.name]);
         }
-        return null;
+        return;
       }
       Element accessor = element;
       if (accessor is PropertyAccessorElement && identifier.inSetterContext()) {
@@ -852,7 +619,7 @@
       if (parent is Annotation) {
         _resolveAnnotationElement(parent);
       }
-      return null;
+      return;
     }
     // May be annotation, resolve invocation of "const" constructor.
     AstNode parent = node.parent;
@@ -864,11 +631,10 @@
     // identifier and this is really equivalent to a property access node.
     //
     _resolvePropertyAccess(prefix, identifier, false);
-    return null;
   }
 
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
+  void visitPrefixExpression(PrefixExpression node) {
     Token operator = node.operator;
     TokenType operatorType = operator.type;
     if (operatorType.isUserDefinableOperator ||
@@ -896,27 +662,25 @@
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
     if (target is SuperExpression && !_isSuperInValidContext(target)) {
-      return null;
+      return;
     }
     SimpleIdentifier propertyName = node.propertyName;
     _resolvePropertyAccess(target, propertyName, node.isCascaded);
-    return null;
   }
 
   @override
-  Object visitRedirectingConstructorInvocation(
+  void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     ClassElement enclosingClass = _resolver.enclosingClass;
     if (enclosingClass == null) {
       // TODO(brianwilkerson) Report this error.
-      return null;
+      return;
     }
     SimpleIdentifier name = node.constructorName;
     ConstructorElement element;
@@ -928,7 +692,7 @@
     if (element == null) {
       // TODO(brianwilkerson) Report this error and decide what element to
       // associate with the node.
-      return null;
+      return;
     }
     if (name != null) {
       name.staticElement = element;
@@ -940,41 +704,39 @@
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
-    return null;
   }
 
   @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
     _resolveMetadataForParameter(node);
-    return null;
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     //
     // Synthetic identifiers have been already reported during parsing.
     //
     if (node.isSynthetic) {
-      return null;
+      return;
     }
     //
     // Ignore nodes that should have been resolved before getting here.
     //
     if (node.inDeclarationContext()) {
-      return null;
+      return;
     }
     if (node.staticElement is LocalVariableElement ||
         node.staticElement is ParameterElement) {
-      return null;
+      return;
     }
     AstNode parent = node.parent;
     if (parent is FieldFormalParameter) {
-      return null;
+      return;
     } else if (parent is ConstructorFieldInitializer &&
         parent.fieldName == node) {
-      return null;
+      return;
     } else if (parent is Annotation && parent.constructorName == node) {
-      return null;
+      return;
     }
     //
     // The name dynamic denotes a Type object even though dynamic is not a
@@ -983,7 +745,7 @@
     if (node.name == _dynamicType.name) {
       node.staticElement = _dynamicType.element;
       node.staticType = _typeType;
-      return null;
+      return;
     }
     //
     // Otherwise, the node should be resolved.
@@ -1039,21 +801,20 @@
     if (parent is Annotation) {
       _resolveAnnotationElement(parent);
     }
-    return null;
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     ClassElementImpl enclosingClass =
         AbstractClassElementImpl.getImpl(_resolver.enclosingClass);
     if (enclosingClass == null) {
       // TODO(brianwilkerson) Report this error.
-      return null;
+      return;
     }
     InterfaceType superType = enclosingClass.supertype;
     if (superType == null) {
       // TODO(brianwilkerson) Report this error.
-      return null;
+      return;
     }
     SimpleIdentifier name = node.constructorName;
     String superName = name?.name;
@@ -1071,7 +832,7 @@
             node,
             [superType.displayName]);
       }
-      return null;
+      return;
     } else {
       if (element.isFactory) {
         _resolver.errorReporter.reportErrorForNode(
@@ -1085,11 +846,11 @@
     // TODO(brianwilkerson) Defer this check until we know there's an error (by
     // in-lining _resolveArgumentsToFunction below).
     ClassDeclaration declaration =
-        node.getAncestor((AstNode node) => node is ClassDeclaration);
+        node.thisOrAncestorOfType<ClassDeclaration>();
     Identifier superclassName = declaration.extendsClause?.superclass?.name;
     if (superclassName != null &&
         _resolver.nameScope.shouldIgnoreUndefined(superclassName)) {
-      return null;
+      return;
     }
     ArgumentList argumentList = node.argumentList;
     List<ParameterElement> parameters = _resolveArgumentsToFunction(
@@ -1097,121 +858,25 @@
     if (parameters != null) {
       argumentList.correspondingStaticParameters = parameters;
     }
-    return null;
   }
 
   @override
-  Object visitSuperExpression(SuperExpression node) {
+  void visitSuperExpression(SuperExpression node) {
     if (!_isSuperInValidContext(node)) {
       _resolver.errorReporter.reportErrorForNode(
           CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node);
     }
-    return super.visitSuperExpression(node);
+    super.visitSuperExpression(node);
   }
 
   @override
-  Object visitTypeParameter(TypeParameter node) {
+  void visitTypeParameter(TypeParameter node) {
     resolveMetadata(node);
-    return null;
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     resolveMetadata(node);
-    return null;
-  }
-
-  /**
-   * Given that we have found code to invoke the given [element], return the
-   * error code that should be reported, or `null` if no error should be
-   * reported. The [target] is the target of the invocation, or `null` if there
-   * was no target. The flag [useStaticContext] should be `true` if the
-   * invocation is in a static constant (does not have access to instance state).
-   */
-  ErrorCode _checkForInvocationError(Expression target, bool useStaticContext,
-      Element element, DartType type, String name) {
-    // Prefix is not declared, instead "prefix.id" are declared.
-    if (element is PrefixElement) {
-      return CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT;
-    } else if (element is PropertyAccessorElement) {
-      //
-      // This is really a function expression invocation.
-      //
-      // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
-      FunctionType getterType = element.type;
-      if (getterType != null) {
-        DartType returnType = getterType.returnType;
-        return _getErrorCodeForExecuting(returnType);
-      }
-    } else if (element is ExecutableElement) {
-      return null;
-    } else if (element is MultiplyDefinedElement) {
-      // The error has already been reported
-      return null;
-    } else if (element == null && target is SuperExpression) {
-      // TODO(jwren) We should split the UNDEFINED_METHOD into two error codes,
-      // this one, and a code that describes the situation where the method was
-      // found, but it was not accessible from the current library.
-      return StaticTypeWarningCode.UNDEFINED_SUPER_METHOD;
-    } else {
-      //
-      // This is really a function expression invocation.
-      //
-      // TODO(brianwilkerson) Consider the possibility of re-writing the AST.
-      if (element is PropertyInducingElement) {
-        PropertyAccessorElement getter = element.getter;
-        FunctionType getterType = getter.type;
-        if (getterType != null) {
-          DartType returnType = getterType.returnType;
-          return _getErrorCodeForExecuting(returnType);
-        }
-      } else if (element is VariableElement) {
-        return _getErrorCodeForExecuting(type);
-      } else {
-        if (target == null) {
-          ClassElement enclosingClass = _resolver.enclosingClass;
-          if (enclosingClass == null) {
-            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
-          } else if (element == null) {
-            // Proxy-conditional warning, based on state of
-            // resolver.getEnclosingClass()
-            return StaticTypeWarningCode.UNDEFINED_METHOD;
-          } else {
-            return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
-          }
-        } else {
-          DartType targetType;
-          if (useStaticContext) {
-            targetType = _getStaticType(target);
-          } else {
-            // Compute and use the propagated type, if it is null, then it may
-            // be the case that static type is some type, in which the static
-            // type should be used.
-            targetType = _getBestType(target);
-          }
-          if (targetType == null) {
-            if (target is Identifier &&
-                _resolver.nameScope.shouldIgnoreUndefined(target)) {
-              return null;
-            }
-            return StaticTypeWarningCode.UNDEFINED_FUNCTION;
-          } else if (targetType.isVoid) {
-            return StaticWarningCode.USE_OF_VOID_RESULT;
-          } else if (!targetType.isDynamic && target is! NullLiteral) {
-            // Proxy-conditional warning, based on state of
-            // targetType.getElement()
-            return StaticTypeWarningCode.UNDEFINED_METHOD;
-          } else if (targetType.isDynamic) {
-            PropertyAccessorElement getter =
-                _resolver.typeProvider.objectType.getGetter(name);
-            if (getter != null && getter.returnType is! FunctionType) {
-              return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
-            }
-          }
-        }
-      }
-    }
-    return null;
   }
 
   /**
@@ -1275,50 +940,6 @@
   }
 
   /**
-   * If the given [element] is a setter, return the getter associated with it.
-   * Otherwise, return the element unchanged.
-   */
-  Element _convertSetterToGetter(Element element) {
-    // TODO(brianwilkerson) Determine whether and why the element could ever be
-    // a setter.
-    if (element is PropertyAccessorElement) {
-      return element.variable.getter;
-    }
-    return element;
-  }
-
-  /**
-   * Return the best type of the given [expression] that is to be used for
-   * type analysis.
-   */
-  DartType _getBestType(Expression expression) {
-    DartType bestType = _resolveTypeParameter(expression.staticType);
-    if (bestType is FunctionType) {
-      //
-      // All function types are subtypes of 'Function', which is itself a
-      // subclass of 'Object'.
-      //
-      bestType = _resolver.typeProvider.functionType;
-    }
-    return bestType;
-  }
-
-  /**
-   * Return an error if the [type], which is presumably being invoked, is not a
-   * function. The errors for non functions may be broken up by type; currently,
-   * it returns a special value for when the type is `void`.
-   */
-  ErrorCode _getErrorCodeForExecuting(DartType type) {
-    if (_isExecutableType(type)) {
-      return null;
-    }
-
-    return type.isVoid
-        ? StaticWarningCode.USE_OF_VOID_RESULT
-        : StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION;
-  }
-
-  /**
    * Assuming that the given [identifier] is a prefix for a deferred import,
    * return the library that is being imported.
    */
@@ -1330,28 +951,6 @@
   }
 
   /**
-   * Given an element, computes the type of the invocation.
-   *
-   * For executable elements (like methods, functions) this is just their type.
-   *
-   * For variables it is their type taking into account any type promotion.
-   *
-   * For calls to getters in Dart, we invoke the function that is returned by
-   * the getter, so the invoke type is the getter's returnType.
-   */
-  DartType _getInvokeType(Element element) {
-    DartType invokeType;
-    if (element is PropertyAccessorElement) {
-      invokeType = element.returnType;
-    } else if (element is ExecutableElement) {
-      invokeType = element.type;
-    } else if (element is VariableElement) {
-      invokeType = _promoteManager.getStaticType(element);
-    }
-    return invokeType ?? DynamicTypeImpl.instance;
-  }
-
-  /**
    * Return the name of the method invoked by the given postfix [expression].
    */
   String _getPostfixOperator(PostfixExpression expression) =>
@@ -1461,25 +1060,6 @@
   }
 
   /**
-   * Return `true` if the given [type] represents an object that could be
-   * invoked using the call operator '()'.
-   */
-  bool _isExecutableType(DartType type) {
-    type = type?.resolveToBound(_resolver.typeProvider.objectType);
-    if (type.isDynamic || type is FunctionType) {
-      return true;
-    } else if (type.isDartCoreFunction) {
-      return true;
-    } else if (type is InterfaceType) {
-      ClassElement classElement = type.element;
-      MethodElement methodElement = classElement.lookUpMethod(
-          FunctionElement.CALL_METHOD_NAME, _definingLibrary);
-      return methodElement != null;
-    }
-    return false;
-  }
-
-  /**
    * Return `true` if the given [element] is a static element.
    */
   bool _isStatic(Element element) {
@@ -1582,18 +1162,18 @@
 
   /**
    * Look up the [FunctionType] of a getter or a method with the given [name]
-   * in the given [targetType].  The [target] is the target of the invocation,
-   * or `null` if there is no target.
+   * in the given [targetType].
    */
-  FunctionType _lookUpGetterType(
-      Expression target, DartType targetType, String name) {
+  FunctionType _lookUpGetterType(DartType targetType, String name,
+      {bool concrete: false, bool forSuper: false}) {
     targetType = _resolveTypeParameter(targetType);
     if (targetType is InterfaceType) {
       var nameObject = new Name(_definingLibrary.source.uri, name);
       return _inheritance.getMember(
         targetType,
         nameObject,
-        forSuper: target is SuperExpression,
+        concrete: concrete,
+        forSuper: forSuper,
       );
     }
     return null;
@@ -1632,41 +1212,6 @@
   }
 
   /**
-   * Return the binary operator that is invoked by the given compound assignment
-   * [operator].
-   */
-  TokenType _operatorFromCompoundAssignment(TokenType operator) {
-    if (operator == TokenType.AMPERSAND_EQ) {
-      return TokenType.AMPERSAND;
-    } else if (operator == TokenType.BAR_EQ) {
-      return TokenType.BAR;
-    } else if (operator == TokenType.CARET_EQ) {
-      return TokenType.CARET;
-    } else if (operator == TokenType.GT_GT_EQ) {
-      return TokenType.GT_GT;
-    } else if (operator == TokenType.LT_LT_EQ) {
-      return TokenType.LT_LT;
-    } else if (operator == TokenType.MINUS_EQ) {
-      return TokenType.MINUS;
-    } else if (operator == TokenType.PERCENT_EQ) {
-      return TokenType.PERCENT;
-    } else if (operator == TokenType.PLUS_EQ) {
-      return TokenType.PLUS;
-    } else if (operator == TokenType.SLASH_EQ) {
-      return TokenType.SLASH;
-    } else if (operator == TokenType.STAR_EQ) {
-      return TokenType.STAR;
-    } else if (operator == TokenType.TILDE_SLASH_EQ) {
-      return TokenType.TILDE_SLASH;
-    } else {
-      // Internal error: Unmapped assignment operator.
-      AnalysisEngine.instance.logger.logError(
-          "Failed to map ${operator.lexeme} to it's corresponding operator");
-      return operator;
-    }
-  }
-
-  /**
    * Record that the given [node] is undefined, causing an error to be reported
    * if appropriate. The [declaringElement] is the element inside which no
    * declaration was found. If this element is a proxy, no error will be
@@ -1752,8 +1297,7 @@
       }
       // Class(args)
       if (element1 is ClassElement) {
-        constructor = new InterfaceTypeImpl(element1)
-            .lookUpConstructor(null, _definingLibrary);
+        constructor = element1.type.lookUpConstructor(null, _definingLibrary);
       } else if (element1 == null) {
         undefined = true;
       }
@@ -1781,8 +1325,8 @@
       }
       // Class.constructor(args)
       if (element1 is ClassElement) {
-        constructor = new InterfaceTypeImpl(element1)
-            .lookUpConstructor(nameNode2.name, _definingLibrary);
+        constructor =
+            element1.type.lookUpConstructor(nameNode2.name, _definingLibrary);
         nameNode2.staticElement = constructor;
       }
       if (element1 == null && element2 == null) {
@@ -1807,8 +1351,7 @@
           return;
         }
         // prefix.Class.constructor(args)
-        constructor = new InterfaceTypeImpl(element2)
-            .lookUpConstructor(name3, _definingLibrary);
+        constructor = element2.type.lookUpConstructor(name3, _definingLibrary);
         nameNode3.staticElement = constructor;
       } else if (element2 == null) {
         undefined = true;
@@ -1894,12 +1437,14 @@
     Expression leftOperand = node.leftOperand;
     if (leftOperand != null) {
       DartType leftType = _getStaticType(leftOperand);
-      var invokeType = _lookUpGetterType(leftOperand, leftType, methodName);
+      var isSuper = leftOperand is SuperExpression;
+      var invokeType = _lookUpGetterType(leftType, methodName,
+          concrete: isSuper, forSuper: isSuper);
       var invokeElement = invokeType?.element;
       node.staticElement = invokeElement;
       node.staticInvokeType = invokeType;
       if (_shouldReportMissingMember(leftType, invokeElement)) {
-        if (leftOperand is SuperExpression) {
+        if (isSuper) {
           _recordUndefinedToken(
               leftType.element,
               StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
@@ -1978,103 +1523,6 @@
   }
 
   /**
-   * Given an invocation of the form 'm(a1, ..., an)', resolve 'm' to the
-   * element being invoked. If the returned element is a method, then the method
-   * will be invoked. If the returned element is a getter, the getter will be
-   * invoked without arguments and the result of that invocation will then be
-   * invoked with the arguments. The [methodName] is the name of the method
-   * being invoked ('m').
-   */
-  Element _resolveInvokedElement(SimpleIdentifier methodName) {
-    //
-    // Look first in the lexical scope.
-    //
-    Element element = _resolver.nameScope.lookup(methodName, _definingLibrary);
-    if (element == null) {
-      //
-      // If it isn't defined in the lexical scope, and the invocation is within
-      // a class, then look in the inheritance scope.
-      //
-      ClassElement enclosingClass = _resolver.enclosingClass;
-      if (enclosingClass != null) {
-        InterfaceType enclosingType = enclosingClass.type;
-        element = _lookUpMethod(null, enclosingType, methodName.name);
-        if (element == null) {
-          //
-          // If there's no method, then it's possible that 'm' is a getter that
-          // returns a function.
-          //
-          element = _lookUpGetter(null, enclosingType, methodName.name);
-        }
-      }
-    }
-    // TODO(brianwilkerson) Report this error.
-    return element;
-  }
-
-  /**
-   * Given an invocation of the form 'e.m(a1, ..., an)', resolve 'e.m' to the
-   * element being invoked. If the returned element is a method, then the method
-   * will be invoked. If the returned element is a getter, the getter will be
-   * invoked without arguments and the result of that invocation will then be
-   * invoked with the arguments. The [target] is the target of the invocation
-   * ('e'). The [targetType] is the type of the target. The [methodName] is th
-   * name of the method being invoked ('m').  [isConditional] indicates
-   * whether the invocation uses a '?.' operator.
-   */
-  Element _resolveInvokedElementWithTarget(Expression target,
-      DartType targetType, SimpleIdentifier methodName, bool isConditional) {
-    String name = methodName.name;
-    if (targetType is InterfaceType) {
-      Element element = _lookUpMethod(target, targetType, name);
-      if (element == null) {
-        //
-        // If there's no method, then it's possible that 'm' is a getter that
-        // returns a function.
-        //
-        // TODO (collinsn): need to add union type support here too, in the
-        // style of [lookUpMethod].
-        element = _lookUpGetter(target, targetType, name);
-      }
-      return element;
-    } else if (targetType is FunctionType &&
-        _resolver.typeProvider.isObjectMethod(name)) {
-      return _resolver.typeProvider.objectType.element.getMethod(name);
-    } else if (target is SimpleIdentifier) {
-      Element targetElement = target.staticElement;
-      if (targetType is FunctionType &&
-          name == FunctionElement.CALL_METHOD_NAME) {
-        return targetElement;
-      }
-      if (targetElement is PrefixElement) {
-        if (isConditional) {
-          _resolver.errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
-              target,
-              [target.name]);
-        }
-        //
-        // Look to see whether the name of the method is really part of a
-        // prefixed identifier for an imported top-level function or top-level
-        // getter that returns a function.
-        //
-        Identifier functionName =
-            new PrefixedIdentifierImpl.temp(target, methodName);
-        Element element =
-            _resolver.nameScope.lookup(functionName, _definingLibrary);
-        if (element != null) {
-          // TODO(brianwilkerson) This isn't a method invocation, it's a
-          // function invocation where the function name is a prefixed
-          // identifier. Consider re-writing the AST.
-          return element;
-        }
-      }
-    }
-    // TODO(brianwilkerson) Report this error.
-    return null;
-  }
-
-  /**
    * Given a [node] that can have annotations associated with it, resolve the
    * annotations in the element model representing annotations to the node.
    */
@@ -2134,10 +1582,16 @@
                 propertyName.name, _definingLibrary,
                 setter: propertyName.inSetterContext(), concrete: false);
             if (staticElement != null) {
-              _resolver.errorReporter.reportErrorForNode(
-                  CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
-                  propertyName,
-                  [staticElement.kind.displayName, propertyName.name]);
+              ClassElementImpl receiverSuperClass =
+                  AbstractClassElementImpl.getImpl(
+                staticType.element.supertype.element,
+              );
+              if (!receiverSuperClass.hasNoSuchMethod) {
+                _resolver.errorReporter.reportErrorForNode(
+                    CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
+                    propertyName,
+                    [staticElement.kind.displayName, propertyName.name]);
+              }
             }
           }
         }
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 91e3739..527f2ed 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -17,6 +17,8 @@
 import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -40,6 +42,7 @@
 import 'package:path/path.dart' as pathos;
 import 'package:plugin/manager.dart';
 import 'package:plugin/plugin.dart';
+import 'package:pub_semver/pub_semver.dart';
 
 export 'package:analyzer/error/listener.dart' show RecordingErrorListener;
 export 'package:analyzer/src/generated/timestamped_data.dart'
@@ -1147,10 +1150,10 @@
   AnalyzeFunctionBodiesPredicate get analyzeFunctionBodiesPredicate;
 
   /**
-   * DEPRECATED: Return the maximum number of sources for which AST structures should be
+   * Return the maximum number of sources for which AST structures should be
    * kept in the cache.
    *
-   * This setting no longer has any effect.
+   * DEPRECATED: This setting no longer has any effect.
    */
   @deprecated
   int get cacheSize;
@@ -1197,6 +1200,15 @@
   bool get enableConditionalDirectives;
 
   /**
+   * Return a list containing the names of the experiments that are enabled in
+   * the context associated with these options.
+   *
+   * The process around these experiments is described in this
+   * [doc](https://github.com/dart-lang/sdk/blob/master/docs/process/experimental-flags.md).
+   */
+  List<String> get enabledExperiments;
+
+  /**
    * Return a list of the names of the packages for which, if they define a
    * plugin, the plugin should be enabled.
    */
@@ -1301,6 +1313,12 @@
   bool get previewDart2;
 
   /**
+   * The version range for the SDK specified in `pubspec.yaml`, or `null` if
+   * there is no `pubspec.yaml` or if it does not contain an SDK range.
+   */
+  VersionConstraint get sdkVersionConstraint;
+
+  /**
    * Return the opaque signature of the options.
    *
    * The length of the list is guaranteed to equal [signatureLength].
@@ -1338,6 +1356,7 @@
    * Set the values of the cross-context options to match those in the given set
    * of [options].
    */
+  @deprecated
   void setCrossContextOptionsFrom(AnalysisOptions options);
 
   /**
@@ -1394,13 +1413,8 @@
    */
   Uint32List _signature;
 
-  /**
-   * A flag indicating whether declaration casts are allowed in [strongMode]
-   * (they are always allowed in Dart 1.0 mode).
-   *
-   * This option is deprecated and will be removed in a future release.
-   */
-  bool declarationCasts = true;
+  @override
+  VersionConstraint sdkVersionConstraint;
 
   @override
   @deprecated
@@ -1409,6 +1423,13 @@
   @override
   bool dart2jsHint = false;
 
+  List<String> _enabledExperiments = const <String>[];
+
+  /**
+   * Parsed [enabledExperiments].
+   */
+  ExperimentStatus _experimentStatus = ExperimentStatus();
+
   @override
   List<String> enabledPluginNames = const <String>[];
 
@@ -1489,13 +1510,6 @@
    */
   bool implicitDynamic = true;
 
-  // A no-op setter.
-  /**
-   * Return `true` to enable mixin declarations.
-   * https://github.com/dart-lang/language/issues/12
-   */
-  bool isMixinSupportEnabled = false;
-
   /**
    * Initialize a newly created set of analysis options to have their default
    * values.
@@ -1509,6 +1523,7 @@
   AnalysisOptionsImpl.from(AnalysisOptions options) {
     analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate;
     dart2jsHint = options.dart2jsHint;
+    enabledExperiments = options.enabledExperiments;
     enabledPluginNames = options.enabledPluginNames;
     enableLazyAssignmentOperators = options.enableLazyAssignmentOperators;
     enableTiming = options.enableTiming;
@@ -1522,15 +1537,14 @@
     preserveComments = options.preserveComments;
     useFastaParser = options.useFastaParser;
     if (options is AnalysisOptionsImpl) {
-      declarationCasts = options.declarationCasts;
       strongModeHints = options.strongModeHints;
       implicitCasts = options.implicitCasts;
       implicitDynamic = options.implicitDynamic;
-      isMixinSupportEnabled = options.isMixinSupportEnabled;
     }
     trackCacheDependencies = options.trackCacheDependencies;
     disableCacheFlushing = options.disableCacheFlushing;
     patchPaths = options.patchPaths;
+    sdkVersionConstraint = options.sdkVersionConstraint;
   }
 
   bool get analyzeFunctionBodies {
@@ -1593,6 +1607,14 @@
   void set enableConditionalDirectives(_) {}
 
   @override
+  List<String> get enabledExperiments => _enabledExperiments;
+
+  set enabledExperiments(List<String> enabledExperiments) {
+    _enabledExperiments = enabledExperiments;
+    _experimentStatus = ExperimentStatus.fromStrings(enabledExperiments);
+  }
+
+  @override
   @deprecated
   bool get enableGenericMethods => true;
 
@@ -1645,6 +1667,21 @@
     _excludePatterns = patterns;
   }
 
+  /**
+   * The set of enabled experiments.
+   */
+  ExperimentStatus get experimentStatus => _experimentStatus;
+
+  /**
+   * Return `true` to enable mixin declarations.
+   * https://github.com/dart-lang/language/issues/12
+   */
+  @deprecated
+  bool get isMixinSupportEnabled => true;
+
+  @deprecated
+  set isMixinSupportEnabled(bool value) {}
+
   @override
   List<Linter> get lintRules => _lintRules ??= const <Linter>[];
 
@@ -1656,9 +1693,11 @@
     _lintRules = rules;
   }
 
+  @deprecated
   @override
   bool get previewDart2 => true;
 
+  @deprecated
   set previewDart2(bool value) {}
 
   @override
@@ -1666,15 +1705,23 @@
     if (_signature == null) {
       ApiSignature buffer = new ApiSignature();
 
+      // Append environment.
+      if (sdkVersionConstraint != null) {
+        buffer.addString(sdkVersionConstraint.toString());
+      }
+
       // Append boolean flags.
-      buffer.addBool(declarationCasts);
       buffer.addBool(enableLazyAssignmentOperators);
       buffer.addBool(implicitCasts);
       buffer.addBool(implicitDynamic);
       buffer.addBool(strongModeHints);
       buffer.addBool(useFastaParser);
-      buffer.addBool(previewDart2);
-      buffer.addBool(isMixinSupportEnabled);
+
+      // Append enabled experiments.
+      buffer.addInt(enabledExperiments.length);
+      for (String experimentName in enabledExperiments) {
+        buffer.addString(experimentName);
+      }
 
       // Append error processors.
       buffer.addInt(errorProcessors.length);
@@ -1721,6 +1768,12 @@
       buffer.addBool(enableLazyAssignmentOperators);
       buffer.addBool(useFastaParser);
 
+      // Append enabled experiments.
+      buffer.addInt(enabledExperiments.length);
+      for (String experimentName in enabledExperiments) {
+        buffer.addString(experimentName);
+      }
+
       // Hash and convert to Uint32List.
       List<int> bytes = buffer.toByteList();
       _unlinkedSignature = new Uint8List.fromList(bytes).buffer.asUint32List();
@@ -1730,9 +1783,9 @@
 
   @override
   void resetToDefaults() {
-    declarationCasts = true;
     dart2jsHint = false;
     disableCacheFlushing = false;
+    enabledExperiments = const <String>[];
     enabledPluginNames = const <String>[];
     enableLazyAssignmentOperators = false;
     enableTiming = false;
@@ -1749,9 +1802,10 @@
     preserveComments = true;
     strongModeHints = false;
     trackCacheDependencies = true;
-    useFastaParser = false;
+    useFastaParser = true;
   }
 
+  @deprecated
   @override
   void setCrossContextOptionsFrom(AnalysisOptions options) {
     enableLazyAssignmentOperators = options.enableLazyAssignmentOperators;
@@ -2686,7 +2740,7 @@
  * An visitor that removes any resolution information from an AST structure when
  * used to visit that structure.
  */
-class ResolutionEraser extends GeneralizingAstVisitor<Object> {
+class ResolutionEraser extends GeneralizingAstVisitor<void> {
   /**
    * A flag indicating whether the elements associated with declarations should
    * be erased.
@@ -2694,122 +2748,122 @@
   bool eraseDeclarations = true;
 
   @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
+  void visitAssignmentExpression(AssignmentExpression node) {
     node.staticElement = null;
-    return super.visitAssignmentExpression(node);
+    super.visitAssignmentExpression(node);
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     node.staticElement = null;
-    return super.visitBinaryExpression(node);
+    super.visitBinaryExpression(node);
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     node.target = null;
-    return super.visitBreakStatement(node);
+    super.visitBreakStatement(node);
   }
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     if (eraseDeclarations) {
       node.element = null;
     }
-    return super.visitCompilationUnit(node);
+    super.visitCompilationUnit(node);
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     if (eraseDeclarations) {
-      node.element = null;
+      (node as ConstructorDeclarationImpl).declaredElement = null;
     }
-    return super.visitConstructorDeclaration(node);
+    super.visitConstructorDeclaration(node);
   }
 
   @override
-  Object visitConstructorName(ConstructorName node) {
+  void visitConstructorName(ConstructorName node) {
     node.staticElement = null;
-    return super.visitConstructorName(node);
+    super.visitConstructorName(node);
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     node.target = null;
-    return super.visitContinueStatement(node);
+    super.visitContinueStatement(node);
   }
 
   @override
-  Object visitDirective(Directive node) {
+  void visitDirective(Directive node) {
     if (eraseDeclarations) {
       node.element = null;
     }
-    return super.visitDirective(node);
+    super.visitDirective(node);
   }
 
   @override
-  Object visitExpression(Expression node) {
+  void visitExpression(Expression node) {
     node.staticType = null;
-    return super.visitExpression(node);
+    super.visitExpression(node);
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     if (eraseDeclarations) {
-      node.element = null;
+      (node as FunctionExpressionImpl).declaredElement = null;
     }
-    return super.visitFunctionExpression(node);
+    super.visitFunctionExpression(node);
   }
 
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.staticElement = null;
-    return super.visitFunctionExpressionInvocation(node);
+    super.visitFunctionExpressionInvocation(node);
   }
 
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     node.staticElement = null;
-    return super.visitIndexExpression(node);
+    super.visitIndexExpression(node);
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     node.staticElement = null;
-    return super.visitInstanceCreationExpression(node);
+    super.visitInstanceCreationExpression(node);
   }
 
   @override
-  Object visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(PostfixExpression node) {
     node.staticElement = null;
-    return super.visitPostfixExpression(node);
+    super.visitPostfixExpression(node);
   }
 
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
+  void visitPrefixExpression(PrefixExpression node) {
     node.staticElement = null;
-    return super.visitPrefixExpression(node);
+    super.visitPrefixExpression(node);
   }
 
   @override
-  Object visitRedirectingConstructorInvocation(
+  void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     node.staticElement = null;
-    return super.visitRedirectingConstructorInvocation(node);
+    super.visitRedirectingConstructorInvocation(node);
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     if (eraseDeclarations || !node.inDeclarationContext()) {
       node.staticElement = null;
     }
-    return super.visitSimpleIdentifier(node);
+    super.visitSimpleIdentifier(node);
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     node.staticElement = null;
-    return super.visitSuperConstructorInvocation(node);
+    super.visitSuperConstructorInvocation(node);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 9f5eef9..5283d92 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -34,7 +34,7 @@
  * A visitor used to traverse an AST structure looking for additional errors and
  * warnings not covered by the parser and resolver.
  */
-class ErrorVerifier extends RecursiveAstVisitor<Object> {
+class ErrorVerifier extends RecursiveAstVisitor<void> {
   /**
    * The error reporter by which errors will be reported.
    */
@@ -328,38 +328,38 @@
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     _checkForInvalidAnnotationFromDeferredLibrary(node);
     _checkForMissingJSLibAnnotation(node);
-    return super.visitAnnotation(node);
+    super.visitAnnotation(node);
   }
 
   @override
-  Object visitArgumentList(ArgumentList node) {
+  void visitArgumentList(ArgumentList node) {
     _checkForArgumentTypesNotAssignableInList(node);
-    return super.visitArgumentList(node);
+    super.visitArgumentList(node);
   }
 
   @override
-  Object visitAsExpression(AsExpression node) {
+  void visitAsExpression(AsExpression node) {
     _checkForTypeAnnotationDeferredClass(node.type);
-    return super.visitAsExpression(node);
+    super.visitAsExpression(node);
   }
 
   @override
-  Object visitAssertInitializer(AssertInitializer node) {
+  void visitAssertInitializer(AssertInitializer node) {
     _checkForNonBoolExpression(node);
-    return super.visitAssertInitializer(node);
+    super.visitAssertInitializer(node);
   }
 
   @override
-  Object visitAssertStatement(AssertStatement node) {
+  void visitAssertStatement(AssertStatement node) {
     _checkForNonBoolExpression(node);
-    return super.visitAssertStatement(node);
+    super.visitAssertStatement(node);
   }
 
   @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
+  void visitAssignmentExpression(AssignmentExpression node) {
     TokenType operatorType = node.operator.type;
     Expression lhs = node.leftHandSide;
     Expression rhs = node.rightHandSide;
@@ -371,20 +371,20 @@
       _checkForArgumentTypeNotAssignableForArgument(rhs);
     }
     _checkForAssignmentToFinal(lhs);
-    return super.visitAssignmentExpression(node);
+    super.visitAssignmentExpression(node);
   }
 
   @override
-  Object visitAwaitExpression(AwaitExpression node) {
+  void visitAwaitExpression(AwaitExpression node) {
     if (!_inAsync) {
       _errorReporter.reportErrorForToken(
           CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT, node.awaitKeyword);
     }
-    return super.visitAwaitExpression(node);
+    super.visitAwaitExpression(node);
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     Token operator = node.operator;
     TokenType type = operator.type;
     if (type == TokenType.AMPERSAND_AMPERSAND || type == TokenType.BAR_BAR) {
@@ -398,22 +398,22 @@
       _checkForArgumentTypeNotAssignableForArgument(node.rightOperand);
     }
     _checkForUseOfVoidResult(node.leftOperand);
-    return super.visitBinaryExpression(node);
+    super.visitBinaryExpression(node);
   }
 
   @override
-  Object visitBlock(Block node) {
+  void visitBlock(Block node) {
     _hiddenElements = new HiddenElements(_hiddenElements, node);
     try {
       _checkDuplicateDeclarationInStatements(node.statements);
-      return super.visitBlock(node);
+      super.visitBlock(node);
     } finally {
       _hiddenElements = _hiddenElements.outerElements;
     }
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     bool wasInAsync = _inAsync;
     bool wasInGenerator = _inGenerator;
     bool previousHasReturnWithoutValue = _hasReturnWithoutValue;
@@ -434,11 +434,10 @@
       _returnsWithout = previousReturnsWithout;
       _hasReturnWithoutValue = previousHasReturnWithoutValue;
     }
-    return null;
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     SimpleIdentifier labelNode = node.label;
     if (labelNode != null) {
       Element labelElement = labelNode.staticElement;
@@ -447,24 +446,23 @@
             ResolverErrorCode.BREAK_LABEL_ON_SWITCH_MEMBER, labelNode);
       }
     }
-    return null;
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     _checkDuplicateDefinitionInCatchClause(node);
     bool previousIsInCatchClause = _isInCatchClause;
     try {
       _isInCatchClause = true;
       _checkForTypeAnnotationDeferredClass(node.exceptionType);
-      return super.visitCatchClause(node);
+      super.visitCatchClause(node);
     } finally {
       _isInCatchClause = previousIsInCatchClause;
     }
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     ClassElementImpl outerClass = _enclosingClass;
     try {
       _isInNativeClass = node.nativeClause != null;
@@ -491,7 +489,7 @@
       _initializeInitialFieldElementsMap(_enclosingClass.fields);
       _checkForFinalNotInitializedInClass(members);
       _checkForBadFunctionUse(node);
-      return super.visitClassDeclaration(node);
+      super.visitClassDeclaration(node);
     } finally {
       _isInNativeClass = false;
       _initialFieldElementsMap = null;
@@ -500,7 +498,7 @@
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     _checkForBuiltInIdentifierAsName(
         node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
     ClassElementImpl outerClassElement = _enclosingClass;
@@ -511,37 +509,37 @@
     } finally {
       _enclosingClass = outerClassElement;
     }
-    return super.visitClassTypeAlias(node);
+    super.visitClassTypeAlias(node);
   }
 
   @override
-  Object visitComment(Comment node) {
+  void visitComment(Comment node) {
     _isInComment = true;
     try {
-      return super.visitComment(node);
+      super.visitComment(node);
     } finally {
       _isInComment = false;
     }
   }
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     _checkDuplicateUnitMembers(node);
     _checkForDeferredPrefixCollisions(node);
-    return super.visitCompilationUnit(node);
+    super.visitCompilationUnit(node);
   }
 
   @override
-  Object visitConditionalExpression(ConditionalExpression node) {
+  void visitConditionalExpression(ConditionalExpression node) {
     _checkForNonBoolCondition(node.condition);
     // TODO(mfairhurst) Enable this and get code compliant.
     //_checkForUseOfVoidResult(node.thenExpression);
     //_checkForUseOfVoidResult(node.elseExpression);
-    return super.visitConditionalExpression(node);
+    super.visitConditionalExpression(node);
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     try {
       ConstructorElement constructorElement = node.declaredElement;
@@ -563,7 +561,7 @@
       _checkForUndefinedConstructorInInitializerImplicit(node);
       _checkForRedirectToNonConstConstructor(node, constructorElement);
       _checkForReturnInGenerativeConstructor(node);
-      return super.visitConstructorDeclaration(node);
+      super.visitConstructorDeclaration(node);
     } finally {
       _isEnclosingConstructorConst = false;
       _isInFactory = false;
@@ -572,7 +570,7 @@
   }
 
   @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     _isInConstructorInitializer = true;
     try {
       SimpleIdentifier fieldName = node.fieldName;
@@ -581,14 +579,14 @@
       if (staticElement is FieldElement) {
         _checkForFieldInitializerNotAssignable(node, staticElement);
       }
-      return super.visitConstructorFieldInitializer(node);
+      super.visitConstructorFieldInitializer(node);
     } finally {
       _isInConstructorInitializer = false;
     }
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     SimpleIdentifier labelNode = node.label;
     if (labelNode != null) {
       Element labelElement = labelNode.staticElement;
@@ -598,36 +596,35 @@
             ResolverErrorCode.CONTINUE_LABEL_ON_SWITCH, labelNode);
       }
     }
-    return null;
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     _checkForInvalidAssignment(node.identifier, node.defaultValue);
     _checkForDefaultValueInFunctionTypedParameter(node);
-    return super.visitDefaultFormalParameter(node);
+    super.visitDefaultFormalParameter(node);
   }
 
   @override
-  Object visitDoStatement(DoStatement node) {
+  void visitDoStatement(DoStatement node) {
     _checkForNonBoolCondition(node.condition);
-    return super.visitDoStatement(node);
+    super.visitDoStatement(node);
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     ClassElement outerEnum = _enclosingEnum;
     try {
       _enclosingEnum = node.declaredElement;
       _checkDuplicateEnumMembers(node);
-      return super.visitEnumDeclaration(node);
+      super.visitEnumDeclaration(node);
     } finally {
       _enclosingEnum = outerEnum;
     }
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     ExportElement exportElement = node.element;
     if (exportElement != null) {
       LibraryElement exportedLibrary = exportElement.exportedLibrary;
@@ -635,11 +632,11 @@
       _checkForExportDuplicateLibraryName(node, exportElement, exportedLibrary);
       _checkForExportInternalLibrary(node, exportElement);
     }
-    return super.visitExportDirective(node);
+    super.visitExportDirective(node);
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     bool wasInAsync = _inAsync;
     bool wasInGenerator = _inGenerator;
     try {
@@ -657,7 +654,7 @@
         _checkForReturnOfInvalidType(node.expression, expectedReturnType,
             isArrowFunction: true);
       }
-      return super.visitExpressionFunctionBody(node);
+      super.visitExpressionFunctionBody(node);
     } finally {
       _inAsync = wasInAsync;
       _inGenerator = wasInGenerator;
@@ -665,7 +662,7 @@
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     _isInStaticVariableDeclaration = node.isStatic;
     _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
     if (_isInInstanceVariableDeclaration) {
@@ -676,7 +673,7 @@
       }
     }
     try {
-      return super.visitFieldDeclaration(node);
+      super.visitFieldDeclaration(node);
     } finally {
       _isInStaticVariableDeclaration = false;
       _isInInstanceVariableDeclaration = false;
@@ -684,41 +681,41 @@
   }
 
   @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
+  void visitFieldFormalParameter(FieldFormalParameter node) {
     _checkForValidField(node);
     _checkForConstFormalParameter(node);
     _checkForPrivateOptionalParameter(node);
     _checkForFieldInitializingFormalRedirectingConstructor(node);
     _checkForTypeAnnotationDeferredClass(node.type);
-    return super.visitFieldFormalParameter(node);
+    super.visitFieldFormalParameter(node);
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
+  void visitForEachStatement(ForEachStatement node) {
     _checkForInIterable(node);
-    return super.visitForEachStatement(node);
+    super.visitForEachStatement(node);
   }
 
   @override
-  Object visitFormalParameterList(FormalParameterList node) {
+  void visitFormalParameterList(FormalParameterList node) {
     _checkDuplicateDefinitionInParameterList(node);
     _checkUseOfCovariantInParameters(node);
-    return super.visitFormalParameterList(node);
+    super.visitFormalParameterList(node);
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     if (node.condition != null) {
       _checkForNonBoolCondition(node.condition);
     }
     if (node.variables != null) {
       _checkDuplicateVariables(node.variables);
     }
-    return super.visitForStatement(node);
+    super.visitForStatement(node);
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement functionElement = node.declaredElement;
     if (functionElement != null &&
         functionElement.enclosingElement is! CompilationUnitElement) {
@@ -751,31 +748,31 @@
       _checkForTypeAnnotationDeferredClass(returnType);
       _checkForIllegalReturnType(returnType);
       _checkForImplicitDynamicReturn(node.name, node.declaredElement);
-      return super.visitFunctionDeclaration(node);
+      super.visitFunctionDeclaration(node);
     } finally {
       _enclosingFunction = outerFunction;
     }
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     // If this function expression is wrapped in a function declaration, don't
     // change the enclosingFunction field.
     if (node.parent is! FunctionDeclaration) {
       ExecutableElement outerFunction = _enclosingFunction;
       try {
         _enclosingFunction = node.declaredElement;
-        return super.visitFunctionExpression(node);
+        super.visitFunctionExpression(node);
       } finally {
         _enclosingFunction = outerFunction;
       }
     } else {
-      return super.visitFunctionExpression(node);
+      super.visitFunctionExpression(node);
     }
   }
 
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     Expression functionExpression = node.function;
     DartType expressionType = functionExpression.staticType;
     if (!_checkForUseOfVoidResult(functionExpression) &&
@@ -787,20 +784,20 @@
       _checkTypeArguments(node);
     }
     _checkForImplicitDynamicInvoke(node);
-    return super.visitFunctionExpressionInvocation(node);
+    super.visitFunctionExpressionInvocation(node);
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     _checkForBuiltInIdentifierAsName(
         node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME);
     _checkForDefaultValueInFunctionTypeAlias(node);
     _checkForTypeAliasCannotReferenceItself_function(node);
-    return super.visitFunctionTypeAlias(node);
+    super.visitFunctionTypeAlias(node);
   }
 
   @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     bool old = _isInFunctionTypedFormalParameter;
     _isInFunctionTypedFormalParameter = true;
     try {
@@ -828,35 +825,35 @@
             node);
       }
 
-      return super.visitFunctionTypedFormalParameter(node);
+      super.visitFunctionTypedFormalParameter(node);
     } finally {
       _isInFunctionTypedFormalParameter = old;
     }
   }
 
   @override
-  Object visitGenericTypeAlias(GenericTypeAlias node) {
+  void visitGenericTypeAlias(GenericTypeAlias node) {
     if (_hasTypedefSelfReference(node.declaredElement)) {
       _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node);
     }
-    return super.visitGenericTypeAlias(node);
+    super.visitGenericTypeAlias(node);
   }
 
   @override
-  Object visitIfStatement(IfStatement node) {
+  void visitIfStatement(IfStatement node) {
     _checkForNonBoolCondition(node.condition);
-    return super.visitIfStatement(node);
+    super.visitIfStatement(node);
   }
 
   @override
-  Object visitImplementsClause(ImplementsClause node) {
+  void visitImplementsClause(ImplementsClause node) {
     node.interfaces.forEach(_checkForImplicitDynamicType);
-    return super.visitImplementsClause(node);
+    super.visitImplementsClause(node);
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     ImportElement importElement = node.element;
     if (node.prefix != null) {
       _checkForBuiltInIdentifierAsName(
@@ -866,17 +863,17 @@
       _checkForImportDuplicateLibraryName(node, importElement);
       _checkForImportInternalLibrary(node, importElement);
     }
-    return super.visitImportDirective(node);
+    super.visitImportDirective(node);
   }
 
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     _checkForArgumentTypeNotAssignableForArgument(node.index);
-    return super.visitIndexExpression(node);
+    super.visitIndexExpression(node);
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     bool wasInConstInstanceCreation = _isInConstInstanceCreation;
     _isInConstInstanceCreation = node.isConst;
     try {
@@ -897,33 +894,33 @@
         }
       }
       _checkForImplicitDynamicType(typeName);
-      return super.visitInstanceCreationExpression(node);
+      super.visitInstanceCreationExpression(node);
     } finally {
       _isInConstInstanceCreation = wasInConstInstanceCreation;
     }
   }
 
   @override
-  Object visitIntegerLiteral(IntegerLiteral node) {
+  void visitIntegerLiteral(IntegerLiteral node) {
     _checkForOutOfRange(node);
-    return super.visitIntegerLiteral(node);
+    super.visitIntegerLiteral(node);
   }
 
   @override
-  Object visitInterpolationExpression(InterpolationExpression node) {
+  void visitInterpolationExpression(InterpolationExpression node) {
     _checkForUseOfVoidResult(node.expression);
-    return super.visitInterpolationExpression(node);
+    super.visitInterpolationExpression(node);
   }
 
   @override
-  Object visitIsExpression(IsExpression node) {
+  void visitIsExpression(IsExpression node) {
     _checkForTypeAnnotationDeferredClass(node.type);
     _checkForUseOfVoidResult(node.expression);
-    return super.visitIsExpression(node);
+    super.visitIsExpression(node);
   }
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
       if (node.isConst) {
@@ -938,11 +935,11 @@
     _checkForImplicitDynamicTypedLiteral(node);
     _checkForListElementTypeNotAssignable(node);
 
-    return super.visitListLiteral(node);
+    super.visitListLiteral(node);
   }
 
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
     if (typeArguments != null) {
       NodeList<TypeAnnotation> arguments = typeArguments.arguments;
@@ -957,11 +954,11 @@
     _checkForImplicitDynamicTypedLiteral(node);
     _checkForMapTypeNotAssignable(node);
     _checkForNonConstMapAsExpressionStatement(node);
-    return super.visitMapLiteral(node);
+    super.visitMapLiteral(node);
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement previousFunction = _enclosingFunction;
     try {
       _isInStaticMethod = node.isStatic;
@@ -981,7 +978,7 @@
       _checkForIllegalReturnType(returnType);
       _checkForImplicitDynamicReturn(node, node.declaredElement);
       _checkForMustCallSuper(node);
-      return super.visitMethodDeclaration(node);
+      super.visitMethodDeclaration(node);
     } finally {
       _enclosingFunction = previousFunction;
       _isInStaticMethod = false;
@@ -989,7 +986,7 @@
   }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
+  void visitMethodInvocation(MethodInvocation node) {
     Expression target = node.realTarget;
     SimpleIdentifier methodName = node.methodName;
     if (target != null) {
@@ -1001,11 +998,11 @@
     }
     _checkTypeArguments(node);
     _checkForImplicitDynamicInvoke(node);
-    return super.visitMethodInvocation(node);
+    super.visitMethodInvocation(node);
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     // TODO(scheglov) Verify for all mixin errors.
     ClassElementImpl outerClass = _enclosingClass;
     try {
@@ -1029,7 +1026,7 @@
       _initializeInitialFieldElementsMap(_enclosingClass.fields);
       _checkForFinalNotInitializedInClass(members);
 //      _checkForBadFunctionUse(node);
-      return super.visitMixinDeclaration(node);
+      super.visitMixinDeclaration(node);
     } finally {
       _initialFieldElementsMap = null;
       _enclosingClass = outerClass;
@@ -1037,31 +1034,31 @@
   }
 
   @override
-  Object visitNativeClause(NativeClause node) {
+  void visitNativeClause(NativeClause node) {
     // TODO(brianwilkerson) Figure out the right rule for when 'native' is
     // allowed.
     if (!_isInSystemLibrary) {
       _errorReporter.reportErrorForNode(
           ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE, node);
     }
-    return super.visitNativeClause(node);
+    super.visitNativeClause(node);
   }
 
   @override
-  Object visitNativeFunctionBody(NativeFunctionBody node) {
+  void visitNativeFunctionBody(NativeFunctionBody node) {
     _checkForNativeFunctionBodyInNonSdkCode(node);
-    return super.visitNativeFunctionBody(node);
+    super.visitNativeFunctionBody(node);
   }
 
   @override
-  Object visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(PostfixExpression node) {
     _checkForAssignmentToFinal(node.operand);
     _checkForIntNotAssignable(node.operand);
-    return super.visitPostfixExpression(node);
+    super.visitPostfixExpression(node);
   }
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     if (node.parent is! Annotation) {
       ClassElement typeReference =
           ElementResolver.getTypeReference(node.prefix);
@@ -1069,11 +1066,11 @@
       _checkForStaticAccessToInstanceMember(typeReference, name);
       _checkForInstanceAccessToStaticMember(typeReference, name);
     }
-    return super.visitPrefixedIdentifier(node);
+    super.visitPrefixedIdentifier(node);
   }
 
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
+  void visitPrefixExpression(PrefixExpression node) {
     TokenType operatorType = node.operator.type;
     Expression operand = node.operand;
     if (operatorType == TokenType.BANG) {
@@ -1083,49 +1080,68 @@
     }
     _checkForIntNotAssignable(operand);
     _checkForUseOfVoidResult(operand);
-    return super.visitPrefixExpression(node);
+    super.visitPrefixExpression(node);
   }
 
   @override
-  Object visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(PropertyAccess node) {
     ClassElement typeReference =
         ElementResolver.getTypeReference(node.realTarget);
     SimpleIdentifier propertyName = node.propertyName;
     _checkForStaticAccessToInstanceMember(typeReference, propertyName);
     _checkForInstanceAccessToStaticMember(typeReference, propertyName);
-    return super.visitPropertyAccess(node);
+    super.visitPropertyAccess(node);
   }
 
   @override
-  Object visitRedirectingConstructorInvocation(
+  void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     _isInConstructorInitializer = true;
     try {
-      return super.visitRedirectingConstructorInvocation(node);
+      super.visitRedirectingConstructorInvocation(node);
     } finally {
       _isInConstructorInitializer = false;
     }
   }
 
   @override
-  Object visitRethrowExpression(RethrowExpression node) {
+  void visitRethrowExpression(RethrowExpression node) {
     _checkForRethrowOutsideCatch(node);
-    return super.visitRethrowExpression(node);
+    super.visitRethrowExpression(node);
   }
 
   @override
-  Object visitReturnStatement(ReturnStatement node) {
+  void visitReturnStatement(ReturnStatement node) {
     if (node.expression == null) {
       _returnsWithout.add(node);
     } else {
       _returnsWith.add(node);
     }
     _checkForAllReturnStatementErrorCodes(node);
-    return super.visitReturnStatement(node);
+    super.visitReturnStatement(node);
   }
 
   @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+  void visitSetLiteral(SetLiteral node) {
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      if (node.isConst) {
+        NodeList<TypeAnnotation> arguments = typeArguments.arguments;
+        if (arguments.isNotEmpty) {
+          _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
+              CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET);
+        }
+      }
+      _checkForExpectedOneSetTypeArgument(node, typeArguments);
+    }
+    _checkForImplicitDynamicTypedLiteral(node);
+    _checkForSetElementTypeNotAssignable(node);
+
+    super.visitSetLiteral(node);
+  }
+
+  @override
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
     _checkForConstFormalParameter(node);
     _checkForPrivateOptionalParameter(node);
     _checkForTypeAnnotationDeferredClass(node.type);
@@ -1138,88 +1154,87 @@
     // - FunctionTypedFormalParameter is a function type, not dynamic.
     _checkForImplicitDynamicIdentifier(node, node.identifier);
 
-    return super.visitSimpleFormalParameter(node);
+    super.visitSimpleFormalParameter(node);
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     _checkForAmbiguousImport(node);
     _checkForReferenceBeforeDeclaration(node);
     _checkForImplicitThisReferenceInInitializer(node);
-    _checkForTypeParameterIdentifierReferencedByStatic(node);
+    _checkForTypeParameterReferencedByStatic(node);
     if (!_isUnqualifiedReferenceToNonLocalStaticMemberAllowed(node)) {
       _checkForUnqualifiedReferenceToNonLocalStaticMember(node);
     }
-    return super.visitSimpleIdentifier(node);
+    super.visitSimpleIdentifier(node);
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _isInConstructorInitializer = true;
     try {
-      return super.visitSuperConstructorInvocation(node);
+      super.visitSuperConstructorInvocation(node);
     } finally {
       _isInConstructorInitializer = false;
     }
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     _checkDuplicateDeclarationInStatements(node.statements);
-    return super.visitSwitchCase(node);
+    super.visitSwitchCase(node);
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     _checkDuplicateDeclarationInStatements(node.statements);
-    return super.visitSwitchDefault(node);
+    super.visitSwitchDefault(node);
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSwitchStatement(SwitchStatement node) {
     _checkForSwitchExpressionNotAssignable(node);
     _checkForCaseBlocksNotTerminated(node);
     _checkForMissingEnumConstantInSwitch(node);
-    return super.visitSwitchStatement(node);
+    super.visitSwitchStatement(node);
   }
 
   @override
-  Object visitThisExpression(ThisExpression node) {
+  void visitThisExpression(ThisExpression node) {
     _checkForInvalidReferenceToThis(node);
-    return super.visitThisExpression(node);
+    super.visitThisExpression(node);
   }
 
   @override
-  Object visitThrowExpression(ThrowExpression node) {
+  void visitThrowExpression(ThrowExpression node) {
     _checkForConstEvalThrowsException(node);
     _checkForUseOfVoidResult(node.expression);
-    return super.visitThrowExpression(node);
+    super.visitThrowExpression(node);
   }
 
   @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _checkForFinalNotInitialized(node.variables);
-    return super.visitTopLevelVariableDeclaration(node);
+    super.visitTopLevelVariableDeclaration(node);
   }
 
   @override
-  Object visitTypeArgumentList(TypeArgumentList node) {
+  void visitTypeArgumentList(TypeArgumentList node) {
     NodeList<TypeAnnotation> list = node.arguments;
     for (TypeAnnotation type in list) {
       _checkForTypeAnnotationDeferredClass(type);
     }
-    return super.visitTypeArgumentList(node);
+    super.visitTypeArgumentList(node);
   }
 
   @override
-  Object visitTypeName(TypeName node) {
+  void visitTypeName(TypeName node) {
     _checkForTypeArgumentNotMatchingBounds(node);
-    _checkForTypeParameterReferencedByStatic(node);
-    return super.visitTypeName(node);
+    super.visitTypeName(node);
   }
 
   @override
-  Object visitTypeParameter(TypeParameter node) {
+  void visitTypeParameter(TypeParameter node) {
     _checkForBuiltInIdentifierAsName(node.name,
         CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME);
     _checkForTypeParameterSupertypeOfItsBound(node);
@@ -1227,22 +1242,21 @@
     _checkForImplicitDynamicType(node.bound);
     _checkForGenericFunctionType(node.bound);
     node.bound?.accept(_uninstantiatedBoundChecker);
-    return super.visitTypeParameter(node);
+    super.visitTypeParameter(node);
   }
 
   @override
-  Object visitTypeParameterList(TypeParameterList node) {
+  void visitTypeParameterList(TypeParameterList node) {
     _checkDuplicateDefinitionInTypeParameterList(node);
-    return super.visitTypeParameterList(node);
+    super.visitTypeParameterList(node);
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     SimpleIdentifier nameNode = node.name;
     Expression initializerNode = node.initializer;
     // do checks
-    _checkForInvalidAssignment(nameNode, initializerNode,
-        isDeclarationCast: true);
+    _checkForInvalidAssignment(nameNode, initializerNode);
     _checkForImplicitDynamicIdentifier(node, nameNode);
     // visit name
     nameNode.accept(this);
@@ -1268,36 +1282,34 @@
         _hiddenElements.declare(element);
       }
     }
-    // done
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     _checkForTypeAnnotationDeferredClass(node.type);
-    return super.visitVariableDeclarationList(node);
+    super.visitVariableDeclarationList(node);
   }
 
   @override
-  Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+  void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
     _checkForFinalNotInitialized(node.variables);
-    return super.visitVariableDeclarationStatement(node);
+    super.visitVariableDeclarationStatement(node);
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     _checkForNonBoolCondition(node.condition);
-    return super.visitWhileStatement(node);
+    super.visitWhileStatement(node);
   }
 
   @override
-  Object visitWithClause(WithClause node) {
+  void visitWithClause(WithClause node) {
     node.mixinTypes.forEach(_checkForImplicitDynamicType);
-    return super.visitWithClause(node);
+    super.visitWithClause(node);
   }
 
   @override
-  Object visitYieldStatement(YieldStatement node) {
+  void visitYieldStatement(YieldStatement node) {
     if (_inGenerator) {
       _checkForYieldOfInvalidType(node.expression, node.star != null);
     } else {
@@ -1310,7 +1322,7 @@
       _errorReporter.reportErrorForNode(errorCode, node);
     }
     _checkForUseOfVoidResult(node.expression);
-    return super.visitYieldStatement(node);
+    super.visitYieldStatement(node);
   }
 
   /**
@@ -1330,7 +1342,6 @@
         !_checkForAllMixinErrorCodes(withClause)) {
       _checkForImplicitDynamicType(superclass);
       _checkForExtendsDeferredClass(superclass);
-      _checkForRecursiveInterfaceInheritance(_enclosingClass);
       _checkForConflictingClassMembers();
       _checkForRepeatedType(implementsClause?.interfaces,
           CompileTimeErrorCode.IMPLEMENTS_REPEATED);
@@ -1725,9 +1736,8 @@
     if (_inGenerator) {
       return;
     }
-    var returnType = _inAsync
-        ? expectedReturnType.flattenFutures(_typeSystem)
-        : expectedReturnType;
+    var returnType =
+        _inAsync ? _typeSystem.flatten(expectedReturnType) : expectedReturnType;
     if (returnType.isDynamic ||
         returnType.isDartCoreNull ||
         returnType.isVoid) {
@@ -1911,8 +1921,7 @@
             if (_checkForMixinSuperclassConstraints(
                 mixinNameIndex, mixinName)) {
               problemReported = true;
-            }
-            if (_checkForMixinSuperInvokedMembers(
+            } else if (_checkForMixinSuperInvokedMembers(
                 mixinTypeIndex, mixinName, mixinElement, mixinType)) {
               problemReported = true;
             }
@@ -2211,31 +2220,26 @@
     if (expressionType == null) {
       return;
     }
-    if (_expressionIsAssignableAtType(expression, expressionType, type)) {
+    if (_typeSystem.isAssignableTo(expressionType, type)) {
       return;
     }
     _errorReporter.reportErrorForNode(errorCode, expression, arguments);
   }
 
   bool _checkForAssignableExpression(
-      Expression expression, DartType expectedStaticType, ErrorCode errorCode,
-      {bool isDeclarationCast = false}) {
+      Expression expression, DartType expectedStaticType, ErrorCode errorCode) {
     DartType actualStaticType = getStaticType(expression);
     return actualStaticType != null &&
         _checkForAssignableExpressionAtType(
-            expression, actualStaticType, expectedStaticType, errorCode,
-            isDeclarationCast: isDeclarationCast);
+            expression, actualStaticType, expectedStaticType, errorCode);
   }
 
   bool _checkForAssignableExpressionAtType(
       Expression expression,
       DartType actualStaticType,
       DartType expectedStaticType,
-      ErrorCode errorCode,
-      {bool isDeclarationCast = false}) {
-    if (!_expressionIsAssignableAtType(
-        expression, actualStaticType, expectedStaticType,
-        isDeclarationCast: isDeclarationCast)) {
+      ErrorCode errorCode) {
+    if (!_typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
       _errorReporter.reportTypeErrorForNode(
           errorCode, expression, [actualStaticType, expectedStaticType]);
       return false;
@@ -2565,15 +2569,26 @@
     if (constructor.factoryKeyword != null) {
       return;
     }
+
     // check for mixins
+    var hasInstanceField = false;
     for (var mixin in _enclosingClass.mixins) {
-      if (mixin.element.fields.isNotEmpty) {
-        _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
-            constructor.returnType);
-        return;
+      var fields = mixin.element.fields;
+      for (var i = 0; i < fields.length; ++i) {
+        if (!fields[i].isStatic) {
+          hasInstanceField = true;
+          break;
+        }
       }
     }
+    if (hasInstanceField) {
+      // TODO(scheglov) Provide the list of fields.
+      _errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+          constructor.returnType);
+      return;
+    }
+
     // try to find and check super constructor invocation
     for (ConstructorInitializer initializer in constructor.initializers) {
       if (initializer is SuperConstructorInvocation) {
@@ -2895,6 +2910,24 @@
   }
 
   /**
+   * Verify that if the given set [literal] has type arguments then there is
+   * exactly one. The [typeArguments] are the type arguments.
+   *
+   * See [StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS].
+   */
+  void _checkForExpectedOneSetTypeArgument(
+      SetLiteral literal, TypeArgumentList typeArguments) {
+    // check number of type arguments
+    int count = typeArguments.arguments.length;
+    if (count != 1) {
+      _errorReporter.reportErrorForNode(
+          StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS,
+          typeArguments,
+          [count]);
+    }
+  }
+
+  /**
    * Verify that the given export [directive] has a unique name among other
    * exported libraries. The [exportElement] is the [ExportElement] retrieved
    * from the node, if the element in the node was `null`, then this method is
@@ -3059,7 +3092,7 @@
     if (staticType == null) {
       return;
     }
-    if (_expressionIsAssignableAtType(expression, staticType, fieldType)) {
+    if (_typeSystem.isAssignableTo(staticType, fieldType)) {
       return;
     }
     // report problem
@@ -3609,8 +3642,7 @@
           StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
           node.iterable,
           [iterableType, loopTypeName]);
-    } else if (!_typeSystem.isAssignableTo(bestIterableType, variableType,
-        isDeclarationCast: true)) {
+    } else if (!_typeSystem.isAssignableTo(bestIterableType, variableType)) {
       _errorReporter.reportTypeErrorForNode(
           StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
           node.iterable,
@@ -3689,8 +3721,7 @@
    *
    * See [StaticTypeWarningCode.INVALID_ASSIGNMENT].
    */
-  void _checkForInvalidAssignment(Expression lhs, Expression rhs,
-      {bool isDeclarationCast = false}) {
+  void _checkForInvalidAssignment(Expression lhs, Expression rhs) {
     if (lhs == null || rhs == null) {
       return;
     }
@@ -3704,8 +3735,7 @@
     }
 
     _checkForAssignableExpression(
-        rhs, leftType, StaticTypeWarningCode.INVALID_ASSIGNMENT,
-        isDeclarationCast: isDeclarationCast);
+        rhs, leftType, StaticTypeWarningCode.INVALID_ASSIGNMENT);
   }
 
   /**
@@ -4082,7 +4112,7 @@
     InterfaceType mixinSupertype = mixinElement.supertype;
     if (mixinSupertype != null) {
       if (!mixinSupertype.isObject ||
-          !mixinElement.isMixinApplication && mixinElement.mixins.length != 0) {
+          !mixinElement.isMixinApplication && mixinElement.mixins.isNotEmpty) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT,
             mixinName,
@@ -4154,7 +4184,7 @@
 
       var superMemberType = _inheritanceManager.getMember(
           enclosingType, nameObject,
-          forMixinIndex: mixinIndex, forSuper: true);
+          forMixinIndex: mixinIndex, concrete: true, forSuper: true);
 
       if (superMemberType == null) {
         _errorReporter.reportErrorForNode(
@@ -4321,7 +4351,7 @@
     DartType type = typeName.type;
     if (type is InterfaceType) {
       ClassElement element = type.element;
-      if (element != null && element.isEnum) {
+      if (element.isEnum || element.isMixin) {
         // We have already reported the error.
         return;
       }
@@ -4453,8 +4483,7 @@
       return;
     }
     // prepare statement
-    Statement statement =
-        literal.getAncestor((node) => node is ExpressionStatement);
+    Statement statement = literal.thisOrAncestorOfType<ExpressionStatement>();
     if (statement == null) {
       return;
     }
@@ -4685,86 +4714,6 @@
   }
 
   /**
-   * Check that [_enclosingClass] is not a superinterface to itself.
-   *  The [path] is a list containing the potentially cyclic implements path.
-   *
-   * See [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE],
-   * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS],
-   * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS],
-   * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON],
-   * [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH].
-   */
-  bool _checkForRecursiveInterfaceInheritance(ClassElement element,
-      [List<ClassElement> path]) {
-    path ??= <ClassElement>[];
-
-    // Detect error condition.
-    int size = path.length;
-    // If this is not the base case (size > 0), and the enclosing class is the
-    // given class element then an error an error.
-    if (size > 0 && _enclosingClass == element) {
-      String enclosingClassName = _enclosingClass.displayName;
-      if (size > 1) {
-        // Construct a string showing the cyclic implements path:
-        // "A, B, C, D, A"
-        String separator = ", ";
-        StringBuffer buffer = new StringBuffer();
-        for (int i = 0; i < size; i++) {
-          buffer.write(path[i].displayName);
-          buffer.write(separator);
-        }
-        buffer.write(element.displayName);
-        _errorReporter.reportErrorForElement(
-            CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-            _enclosingClass,
-            [enclosingClassName, buffer.toString()]);
-        return true;
-      } else {
-        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or
-        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or
-        // RECURSIVE_INTERFACE_INHERITANCE_ON or
-        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
-        _errorReporter.reportErrorForElement(_getBaseCaseErrorCode(element),
-            _enclosingClass, [enclosingClassName]);
-        return true;
-      }
-    }
-
-    if (path.indexOf(element) > 0) {
-      return false;
-    }
-    path.add(element);
-
-    // n-case
-    InterfaceType supertype = element.supertype;
-    if (supertype != null &&
-        _checkForRecursiveInterfaceInheritance(supertype.element, path)) {
-      return true;
-    }
-
-    for (InterfaceType type in element.mixins) {
-      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
-        return true;
-      }
-    }
-
-    for (InterfaceType type in element.superclassConstraints) {
-      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
-        return true;
-      }
-    }
-
-    for (InterfaceType type in element.interfaces) {
-      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
-        return true;
-      }
-    }
-
-    path.removeAt(path.length - 1);
-    return false;
-  }
-
-  /**
    * Check that the given constructor [declaration] has a valid combination of
    * redirected constructor invocation(s), super constructor invocations and
    * field initializers.
@@ -4996,8 +4945,8 @@
     var toType = expectedType;
     var fromType = expressionType;
     if (_inAsync) {
-      toType = toType.flattenFutures(_typeSystem);
-      fromType = fromType.flattenFutures(_typeSystem);
+      toType = _typeSystem.flatten(toType);
+      fromType = _typeSystem.flatten(fromType);
     }
 
     // Anything can be returned to `void` in an arrow bodied function
@@ -5022,8 +4971,7 @@
       var checkWithType = (!_inAsync)
           ? fromType
           : _typeProvider.futureType.instantiate(<DartType>[fromType]);
-      if (_expressionIsAssignableAtType(
-          returnExpression, checkWithType, expectedType)) {
+      if (_typeSystem.isAssignableTo(checkWithType, expectedType)) {
         return;
       }
     }
@@ -5032,6 +4980,41 @@
   }
 
   /**
+   * Verify that the elements in the given set [literal] are subtypes of the
+   * set's static type.
+   *
+   * See [CompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE], and
+   * [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE].
+   */
+  void _checkForSetElementTypeNotAssignable(SetLiteral literal) {
+    // Determine the list's element type. We base this on the static type and
+    // not the literal's type arguments because in strong mode, the type
+    // arguments may be inferred.
+    DartType setType = literal.staticType;
+    assert(setType is InterfaceTypeImpl);
+
+    List<DartType> typeArguments = (setType as InterfaceTypeImpl).typeArguments;
+    assert(typeArguments.length == 1);
+
+    DartType setElementType = typeArguments[0];
+
+    // Check every list element.
+    bool isConst = literal.isConst;
+    for (Expression element in literal.elements) {
+      if (isConst) {
+        // TODO(paulberry): this error should be based on the actual type of the
+        // element, not the static type.  See dartbug.com/21119.
+        _checkForArgumentTypeNotAssignableWithExpectedTypes(
+            element,
+            setElementType,
+            CheckedModeCompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE);
+      }
+      _checkForArgumentTypeNotAssignableWithExpectedTypes(element,
+          setElementType, StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE);
+    }
+  }
+
+  /**
    * Check the given [typeReference] and that the [name] is not a reference to
    * an instance member.
    *
@@ -5090,7 +5073,7 @@
     DartType caseType = getStaticType(caseExpression);
 
     // check types
-    if (!_expressionIsAssignableAtType(expression, expressionType, caseType)) {
+    if (!_typeSystem.isAssignableTo(expressionType, caseType)) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
           expression,
@@ -5175,10 +5158,10 @@
                 ? argumentNodes[i]
                 : typeName;
         if (argType is FunctionType && argType.typeFormals.isNotEmpty) {
-          _errorReporter.reportTypeErrorForNode(
-              CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
-              argumentNode,
-              [argType.typeFormals.join(', ')]);
+          _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
+            argumentNode,
+          );
           continue;
         }
         DartType boundType = parameterElements[i].bound;
@@ -5213,12 +5196,11 @@
     }
   }
 
-  void _checkForTypeParameterIdentifierReferencedByStatic(
-      SimpleIdentifier identifier) {
-    var element = identifier.staticElement;
-    if (element is TypeParameterElement &&
-        element.enclosingElement is ClassElement) {
-      if (_isInStaticMethod || _isInStaticVariableDeclaration) {
+  void _checkForTypeParameterReferencedByStatic(SimpleIdentifier identifier) {
+    if (_isInStaticMethod || _isInStaticVariableDeclaration) {
+      var element = identifier.staticElement;
+      if (element is TypeParameterElement &&
+          element.enclosingElement is ClassElement) {
         // The class's type parameters are not in scope for static methods.
         // However all other type parameters are legal (e.g. the static method's
         // type parameters, or a local function's type parameters).
@@ -5229,26 +5211,6 @@
   }
 
   /**
-   * Check whether the given type [name] is a type parameter being used to
-   * define a static member.
-   *
-   * See [StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC].
-   */
-  void _checkForTypeParameterReferencedByStatic(TypeName name) {
-    if (_isInStaticMethod || _isInStaticVariableDeclaration) {
-      DartType type = name.type;
-      // The class's type parameters are not in scope for static methods.
-      // However all other type parameters are legal (e.g. the static method's
-      // type parameters, or a local function's type parameters).
-      if (type is TypeParameterType &&
-          type.element.enclosingElement is ClassElement) {
-        _errorReporter.reportErrorForNode(
-            StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC, name);
-      }
-    }
-  }
-
-  /**
    * Check whether the given type [parameter] is a supertype of its bound.
    *
    * See [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND].
@@ -5666,7 +5628,6 @@
     if (!_checkForOnClauseErrorCodes(onClause) &&
         !_checkForImplementsClauseErrorCodes(implementsClause)) {
 //      _checkForImplicitDynamicType(superclass);
-      _checkForRecursiveInterfaceInheritance(_enclosingClass);
       _checkForConflictingClassMembers();
       _checkForRepeatedType(
         onClause?.superclassConstraints,
@@ -5720,10 +5681,10 @@
         DartType argType = typeArgs[i];
 
         if (argType is FunctionType && argType.typeFormals.isNotEmpty) {
-          _errorReporter.reportTypeErrorForNode(
-              CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
-              typeArgumentList[i],
-              [argType.typeFormals.join(', ')]);
+          _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
+            typeArgumentList[i],
+          );
           continue;
         }
 
@@ -5756,13 +5717,6 @@
     }
   }
 
-  bool _expressionIsAssignableAtType(Expression expression,
-      DartType actualStaticType, DartType expectedStaticType,
-      {isDeclarationCast: false}) {
-    return _typeSystem.isAssignableTo(actualStaticType, expectedStaticType,
-        isDeclarationCast: isDeclarationCast);
-  }
-
   InterfaceType _findInterfaceTypeForMixin(TypeName mixin,
       InterfaceType supertypeConstraint, List<InterfaceType> interfaceTypes) {
     var element = supertypeConstraint.element;
@@ -5827,30 +5781,6 @@
   }
 
   /**
-   * Return the error code that should be used when the given class [element]
-   * references itself directly.
-   */
-  ErrorCode _getBaseCaseErrorCode(ClassElement element) {
-    if (element.supertype?.element == _enclosingClass) {
-      return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS;
-    }
-
-    for (InterfaceType type in element.superclassConstraints) {
-      if (type.element == _enclosingClass) {
-        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON;
-      }
-    }
-
-    for (InterfaceType type in element.mixins) {
-      if (type.element == _enclosingClass) {
-        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH;
-      }
-    }
-
-    return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS;
-  }
-
-  /**
    * Given an [expression] in a switch case whose value is expected to be an
    * enum constant, return the name of the constant.
    */
@@ -5953,14 +5883,7 @@
   }
 
   ExecutableElement _getOverriddenMember(Element member) {
-    if (member == null) {
-      return null;
-    }
-    ClassElement classElement =
-        member.getAncestor((element) => element is ClassElement);
-    if (classElement == null) {
-      return null;
-    }
+    ClassElement classElement = member.enclosingElement;
     String name = member.name;
     ClassElement superclass = classElement.supertype?.element;
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
@@ -6082,7 +6005,7 @@
       return identical(parent.constructorName, identifier);
     }
     if (parent is CommentReference) {
-      return parent.newKeyword != null;
+      return true;
     }
     if (parent is ConstructorName) {
       return identical(parent.name, identifier);
@@ -6349,47 +6272,45 @@
       .firstWhere((ElementAnnotation e) => e.isRequired, orElse: () => null);
 }
 
-class _HasTypedefSelfReferenceVisitor
-    extends GeneralizingElementVisitor<Object> {
+class _HasTypedefSelfReferenceVisitor extends GeneralizingElementVisitor<void> {
   final GenericFunctionTypeElement element;
   bool hasSelfReference = false;
 
   _HasTypedefSelfReferenceVisitor(this.element);
 
   @override
-  Object visitClassElement(ClassElement element) {
+  void visitClassElement(ClassElement element) {
     // Typedefs are allowed to reference themselves via classes.
-    return null;
   }
 
   @override
-  Object visitFunctionElement(FunctionElement element) {
+  void visitFunctionElement(FunctionElement element) {
     _addTypeToCheck(element.returnType);
-    return super.visitFunctionElement(element);
+    super.visitFunctionElement(element);
   }
 
   @override
-  Object visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
+  void visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
     _addTypeToCheck(element.returnType);
-    return super.visitFunctionTypeAliasElement(element);
+    super.visitFunctionTypeAliasElement(element);
   }
 
   @override
-  Object visitGenericFunctionTypeElement(GenericFunctionTypeElement element) {
+  void visitGenericFunctionTypeElement(GenericFunctionTypeElement element) {
     _addTypeToCheck(element.returnType);
-    return super.visitGenericFunctionTypeElement(element);
+    super.visitGenericFunctionTypeElement(element);
   }
 
   @override
-  Object visitParameterElement(ParameterElement element) {
+  void visitParameterElement(ParameterElement element) {
     _addTypeToCheck(element.type);
-    return super.visitParameterElement(element);
+    super.visitParameterElement(element);
   }
 
   @override
-  Object visitTypeParameterElement(TypeParameterElement element) {
+  void visitTypeParameterElement(TypeParameterElement element) {
     _addTypeToCheck(element.bound);
-    return super.visitTypeParameterElement(element);
+    super.visitTypeParameterElement(element);
   }
 
   void _addTypeToCheck(DartType type) {
diff --git a/pkg/analyzer/lib/src/generated/gn.dart b/pkg/analyzer/lib/src/generated/gn.dart
deleted file mode 100644
index abbed00..0000000
--- a/pkg/analyzer/lib/src/generated/gn.dart
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:collection';
-import 'dart:core';
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/generated/workspace.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/util/uri.dart';
-import 'package:package_config/packages.dart';
-import 'package:package_config/packages_file.dart';
-import 'package:package_config/src/packages_impl.dart';
-import 'package:path/path.dart';
-
-/**
- * Information about a Gn workspace.
- */
-class GnWorkspace extends Workspace {
-  /**
-   * The name of the directory that identifies the root of the workspace.
-   */
-  static const String _jiriRootName = '.jiri_root';
-
-  /**
-   * The resource provider used to access the file system.
-   */
-  final ResourceProvider provider;
-
-  /**
-   * The absolute workspace root path (the directory containing the `.jiri_root`
-   * directory).
-   */
-  final String root;
-
-  /**
-   * The paths to the .packages files.
-   */
-  final List<String> _packagesFilePaths;
-
-  /**
-   * The map of package locations indexed by package name.
-   *
-   * This is a cached field.
-   */
-  Map<String, List<Folder>> _packageMap;
-
-  /**
-   * The package location strategy.
-   *
-   * This is a cached field.
-   */
-  Packages _packages;
-
-  GnWorkspace._(this.provider, this.root, this._packagesFilePaths);
-
-  @override
-  Map<String, List<Folder>> get packageMap =>
-      _packageMap ??= _convertPackagesToMap(packages);
-
-  Packages get packages => _packages ??= _createPackages();
-
-  @override
-  UriResolver get packageUriResolver =>
-      new PackageMapUriResolver(provider, packageMap);
-
-  @override
-  SourceFactory createSourceFactory(DartSdk sdk) {
-    List<UriResolver> resolvers = <UriResolver>[];
-    if (sdk != null) {
-      resolvers.add(new DartUriResolver(sdk));
-    }
-    resolvers.add(packageUriResolver);
-    resolvers.add(new ResourceUriResolver(provider));
-    return new SourceFactory(resolvers, packages, provider);
-  }
-
-  /**
-   * Return the file with the given [absolutePath].
-   *
-   * Return `null` if the given [absolutePath] is not in the workspace [root].
-   */
-  File findFile(String absolutePath) {
-    try {
-      File writableFile = provider.getFile(absolutePath);
-      if (writableFile.exists) {
-        return writableFile;
-      }
-    } catch (_) {}
-    return null;
-  }
-
-  /**
-   * Creates an alternate representation for available packages.
-   */
-  Map<String, List<Folder>> _convertPackagesToMap(Packages packages) {
-    Map<String, List<Folder>> folderMap = new HashMap<String, List<Folder>>();
-    if (packages != null && packages != Packages.noPackages) {
-      var pathContext = provider.pathContext;
-      packages.asMap().forEach((String packageName, Uri uri) {
-        String path = fileUriToNormalizedPath(pathContext, uri);
-        folderMap[packageName] = [provider.getFolder(path)];
-      });
-    }
-    return folderMap;
-  }
-
-  /**
-   * Loads the packages from the .packages file.
-   */
-  Packages _createPackages() {
-    Map<String, Uri> map = _packagesFilePaths.map((String path) {
-      File configFile = provider.getFile(path);
-      List<int> bytes = configFile.readAsBytesSync();
-      return parse(bytes, configFile.toUri());
-    }).reduce((mapOne, mapTwo) {
-      mapOne.addAll(mapTwo);
-      return mapOne;
-    });
-    _resolveSymbolicLinks(map);
-    return new MapPackages(map);
-  }
-
-  /**
-   * Resolve any symbolic links encoded in the path to the given [folder].
-   */
-  String _resolveSymbolicLink(Folder folder) {
-    try {
-      return folder.resolveSymbolicLinksSync().path;
-    } on FileSystemException {
-      return folder.path;
-    }
-  }
-
-  /**
-   * Resolve any symbolic links encoded in the URI's in the given [map] by
-   * replacing the values in the map.
-   */
-  void _resolveSymbolicLinks(Map<String, Uri> map) {
-    Context pathContext = provider.pathContext;
-    for (String packageName in map.keys) {
-      String path = fileUriToNormalizedPath(pathContext, map[packageName]);
-      Folder folder = provider.getFolder(path);
-      String folderPath = _resolveSymbolicLink(folder);
-      // Add a '.' so that the URI is suitable for resolving relative URI's
-      // against it.
-      String uriPath = pathContext.join(folderPath, '.');
-      map[packageName] = pathContext.toUri(uriPath);
-    }
-  }
-
-  /**
-   * Find the GN workspace that contains the given [path].
-   *
-   * Return `null` if a workspace could not be found. For a workspace to be
-   * found, both a `.jiri_root` file must be found, and at least one "packages"
-   * file must be found in [path]'s output directory.
-   */
-  static GnWorkspace find(ResourceProvider provider, String path) {
-    Context context = provider.pathContext;
-
-    // Ensure that the path is absolute and normalized.
-    if (!context.isAbsolute(path)) {
-      throw new ArgumentError('Not an absolute path: $path');
-    }
-    path = context.normalize(path);
-
-    Folder folder = provider.getFolder(path);
-    while (true) {
-      Folder parent = folder.parent;
-      if (parent == null) {
-        return null;
-      }
-
-      // Found the .jiri_root file, must be a non-git workspace.
-      if (folder.getChildAssumingFolder(_jiriRootName).exists) {
-        String root = folder.path;
-        List<String> packagesFiles = _findPackagesFile(provider, root, path);
-        if (packagesFiles.isEmpty) {
-          return null;
-        }
-        return new GnWorkspace._(provider, root, packagesFiles);
-      }
-
-      // Go up one folder.
-      folder = parent;
-    }
-  }
-
-  /**
-   * For a source at `$root/foo/bar`, the packages files are generated in
-   * `$root/out/<debug|release>-XYZ/dartlang/gen/foo/bar`.
-   *
-   * Note that in some cases multiple .packages files can be found at that
-   * location, for example if the package contains both a library and a binary
-   * target. For a complete view of the package, all of these files need to be
-   * taken into account.
-   */
-  static List<String> _findPackagesFile(
-    ResourceProvider provider,
-    String root,
-    String path,
-  ) {
-    Context pathContext = provider.pathContext;
-    String sourceDirectory = pathContext.relative(path, from: root);
-    Folder outDirectory = _getOutDirectory(root, provider);
-    if (outDirectory == null) {
-      return const <String>[];
-    }
-    Folder genDir = outDirectory.getChildAssumingFolder(
-        pathContext.join('dartlang', 'gen', sourceDirectory));
-    if (!genDir.exists) {
-      return const <String>[];
-    }
-    return genDir
-        .getChildren()
-        .where((resource) => resource is File)
-        .map((resource) => resource as File)
-        .where((File file) => pathContext.extension(file.path) == '.packages')
-        .map((File file) => file.path)
-        .toList();
-  }
-
-  /**
-   * Returns the output directory of the build, or `null` if it could not be
-   * found.
-   *
-   * First attempts to read a config file at the root of the source tree. If
-   * that file cannot be found, looks for standard output directory locations.
-   */
-  static Folder _getOutDirectory(String root, ResourceProvider provider) {
-    Context pathContext = provider.pathContext;
-    File config = provider.getFile(pathContext.join(root, '.config'));
-    if (config.exists) {
-      String content = config.readAsStringSync();
-      Match match =
-          new RegExp(r'^FUCHSIA_BUILD_DIR=["\x27](.+)["\x27]$', multiLine: true)
-              .firstMatch(content);
-      if (match != null) {
-        String path = match.group(1);
-        if (pathContext.isRelative(path)) {
-          path = pathContext.join(root, path);
-        }
-        return provider.getFolder(path);
-      }
-    }
-    Folder outDirectory = provider.getFolder(pathContext.join(root, 'out'));
-    if (!outDirectory.exists) {
-      return null;
-    }
-    return outDirectory
-        .getChildren()
-        .where((resource) => resource is Folder)
-        .map((resource) => resource as Folder)
-        .firstWhere((Folder folder) {
-      String baseName = pathContext.basename(folder.path);
-      // Taking a best guess to identify a build dir. This is clearly a fallback
-      // to the config-based method.
-      return baseName.startsWith('debug') || baseName.startsWith('release');
-    }, orElse: () => null);
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/package.dart b/pkg/analyzer/lib/src/generated/package.dart
deleted file mode 100644
index fba626f..0000000
--- a/pkg/analyzer/lib/src/generated/package.dart
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:collection';
-
-import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/builder.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_general.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:package_config/packages.dart';
-import 'package:yaml/yaml.dart';
-
-/**
- * Traverses the package structure to determine the transitive dependencies for
- * a given package.
- */
-class DependencyFinder {
-  /**
-   * The name of the pubspec.yaml file.
-   */
-  static const String pubspecName = 'pubspec.yaml';
-
-  /**
-   * The resource provider used to access the file system.
-   */
-  final ResourceProvider resourceProvider;
-
-  /**
-   * A table mapping the absolute paths of packages to a list of the names of
-   * the packages on which those packages depend.
-   */
-  final Map<String, List<String>> dependencyMap =
-      new HashMap<String, List<String>>();
-
-  /**
-   * Initialize a newly created dependency finder to use the given
-   * [resourceProvider] to access the file system.
-   */
-  DependencyFinder(this.resourceProvider);
-
-  /**
-   * Return a sorted list of the directories containing all of the packages on
-   * which the package at the given [packagePath] depends. The [packageMap]
-   * maps the names of packages to the directories in which they are contained.
-   *
-   * Throws an [AnalysisException] if any of the packages are missing their
-   * 'pubspec.yaml' file.
-   */
-  List<String> transitiveDependenciesFor(
-      Map<String, List<Folder>> packageMap, String packagePath) {
-    Set<String> processedPackages = new HashSet<String>();
-    Set<String> processedPaths = new HashSet<String>();
-    void process(String packageName) {
-      if (processedPackages.add(packageName)) {
-        List<Folder> folderList = packageMap[packageName];
-        if (folderList == null || folderList.isEmpty) {
-          throw new StateError('No mapping for package "$packageName"');
-        }
-        String packagePath = folderList[0].path;
-        processedPaths.add(packagePath);
-        List<String> dependencies = _dependenciesFor(packagePath);
-        for (String dependency in dependencies) {
-          process(dependency);
-        }
-      }
-    }
-
-    List<String> dependencies = _dependenciesFor(packagePath);
-    dependencies.forEach(process);
-    processedPaths.remove(packagePath);
-    List<String> transitiveDependencies = processedPaths.toList();
-    transitiveDependencies.sort();
-    return transitiveDependencies;
-  }
-
-  /**
-   * Add to the given set of [dependecies] all of the package names used as keys
-   * in the given [yamlMap].
-   */
-  void _collectDependencies(HashSet<String> dependencies, YamlMap yamlMap) {
-    if (yamlMap is Map) {
-      for (var key in yamlMap.keys) {
-        if (key is String) {
-          dependencies.add(key);
-        }
-      }
-    }
-  }
-
-  /**
-   * Return a list of the names of the packages on which the package at the
-   * [packagePath] depends.
-   */
-  List<String> _dependenciesFor(String packagePath) {
-    return dependencyMap.putIfAbsent(packagePath, () {
-      Set<String> dependencies = new HashSet<String>();
-      YamlNode yamlNode = _readPubspec(packagePath);
-      if (yamlNode is YamlMap) {
-        _collectDependencies(dependencies, yamlNode['dependencies']);
-      }
-      return dependencies.toList();
-    });
-  }
-
-  /**
-   * Read the content of the pubspec file in the directory at the given
-   * [directoryPath]. Return `null` if the file does not exist, cannot be read,
-   * or has content that is not valid YAML.
-   */
-  YamlNode _readPubspec(String directoryPath) {
-    try {
-      File yamlFile = resourceProvider
-          .getFolder(directoryPath)
-          .getChildAssumingFile(pubspecName);
-      String yamlContent = yamlFile.readAsStringSync();
-      return loadYamlNode(yamlContent);
-    } catch (exception, stackTrace) {
-      throw new AnalysisException('Missing $pubspecName in $directoryPath',
-          new CaughtException(exception, stackTrace));
-    }
-  }
-}
-
-/**
- * A description of the context in which a package will be analyzed.
- */
-class PackageDescription {
-  /**
-   * The id of the package being described. The id encodes the actual locations
-   * of the package itself and all of the packages on which it depends.
-   */
-  final String id;
-
-  /**
-   * The SDK against which the package will be analyzed.
-   */
-  final DartSdk sdk;
-
-  /**
-   * The analysis options that will be used when analyzing the package.
-   */
-  final AnalysisOptions options;
-
-  /**
-   * Initialize a newly create package description to describe the package with
-   * the given [id] that is being analyzed against the given [sdk] using the
-   * given [options].
-   */
-  PackageDescription(this.id, this.sdk, this.options);
-
-  @override
-  int get hashCode {
-    int hashCode = 0;
-    for (int value in options.signature) {
-      hashCode = JenkinsSmiHash.combine(hashCode, value);
-    }
-    hashCode = JenkinsSmiHash.combine(hashCode, id.hashCode);
-    hashCode = JenkinsSmiHash.combine(hashCode, sdk.hashCode);
-    return JenkinsSmiHash.finish(hashCode);
-  }
-
-  @override
-  bool operator ==(Object other) {
-    return other is PackageDescription &&
-        other.sdk == sdk &&
-        AnalysisOptions.signaturesEqual(
-            other.options.signature, options.signature) &&
-        other.id == id;
-  }
-}
-
-/**
- * Manages the contexts in which each package is analyzed.
- */
-class PackageManager {
-  /**
-   * The resource provider used to access the file system.
-   */
-  final ResourceProvider resourceProvider;
-
-  /**
-   * A table mapping the id's of packages to the context in which the package is
-   * analyzed.
-   */
-  final Map<PackageDescription, AnalysisContext> contextMap =
-      new HashMap<PackageDescription, AnalysisContext>();
-
-  /**
-   * Initialize a newly created package manager.
-   */
-  PackageManager(this.resourceProvider);
-
-  /**
-   * Return the context in which the package at the given [packagePath] should
-   * be analyzed when the given [packages] object is used to resolve package
-   * names, the given [resolver] will be used to resolve 'dart:' URI's, and the
-   * given [options] will control the analysis.
-   */
-  AnalysisContext getContext(String packagePath, Packages packages,
-      DartUriResolver resolver, AnalysisOptions options) {
-    DartSdk sdk = resolver.dartSdk;
-    Map<String, List<Folder>> packageMap =
-        new ContextBuilder(resourceProvider, null, null)
-            .convertPackagesToMap(packages);
-    PackageDescription description =
-        new PackageDescription(_buildId(packagePath, packageMap), sdk, options);
-    return contextMap.putIfAbsent(description, () {
-      AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
-      context.sourceFactory = new SourceFactory(<UriResolver>[
-        resolver,
-        new PackageMapUriResolver(resourceProvider, packageMap),
-        new ResourceUriResolver(resourceProvider)
-      ], packages, resourceProvider);
-      context.analysisOptions = options;
-      return context;
-    });
-  }
-
-  /**
-   * Return the id associated with the package at the given [packagePath] when
-   * the given [packageMap] is used to resolve package names.
-   */
-  String _buildId(String packagePath, Map<String, List<Folder>> packageMap) {
-    DependencyFinder finder = new DependencyFinder(resourceProvider);
-    List<String> dependencies =
-        finder.transitiveDependenciesFor(packageMap, packagePath);
-    StringBuffer buffer = new StringBuffer();
-    buffer.write(packagePath);
-    for (String dependency in dependencies) {
-      buffer.write(';');
-      buffer.write(dependency);
-    }
-    return buffer.toString();
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/package_build.dart b/pkg/analyzer/lib/src/generated/package_build.dart
deleted file mode 100644
index 8effaf9..0000000
--- a/pkg/analyzer/lib/src/generated/package_build.dart
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:collection';
-import 'dart:core';
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/builder.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/generated/workspace.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/util/uri.dart';
-import 'package:package_config/packages.dart';
-import 'package:path/path.dart';
-import 'package:yaml/yaml.dart';
-
-/**
- * Instances of the class `PackageBuildFileUriResolver` resolve `file` URI's by
- * first resolving file uri's in the expected way, and then by looking in the
- * corresponding generated directories.
- */
-class PackageBuildFileUriResolver extends ResourceUriResolver {
-  final PackageBuildWorkspace workspace;
-
-  PackageBuildFileUriResolver(PackageBuildWorkspace workspace)
-      : workspace = workspace,
-        super(workspace.provider);
-
-  @override
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    if (!ResourceUriResolver.isFileUri(uri)) {
-      return null;
-    }
-    String path = fileUriToNormalizedPath(provider.pathContext, uri);
-    File file = workspace.findFile(path);
-    if (file != null) {
-      return file.createSource(actualUri ?? uri);
-    }
-    return null;
-  }
-}
-
-/**
- * The [UriResolver] that can resolve `package` URIs in [PackageBuildWorkspace].
- */
-class PackageBuildPackageUriResolver extends UriResolver {
-  final PackageBuildWorkspace _workspace;
-  final UriResolver _normalUriResolver;
-  final Context _context;
-
-  /**
-   * The cache of absolute [Uri]s to [Source]s mappings.
-   */
-  final Map<Uri, Source> _sourceCache = new HashMap<Uri, Source>();
-
-  PackageBuildPackageUriResolver(
-      PackageBuildWorkspace workspace, this._normalUriResolver)
-      : _workspace = workspace,
-        _context = workspace.provider.pathContext;
-
-  @override
-  Source resolveAbsolute(Uri _ignore, [Uri uri]) {
-    uri ??= _ignore;
-    return _sourceCache.putIfAbsent(uri, () {
-      if (uri.scheme != 'package') {
-        return null;
-      }
-
-      Source basicResolverSource = _normalUriResolver.resolveAbsolute(uri);
-      if (basicResolverSource != null && basicResolverSource.exists()) {
-        return basicResolverSource;
-      }
-
-      String uriPath = uri.path;
-      int slash = uriPath.indexOf('/');
-
-      // If the path either starts with a slash or has no slash, it is invalid.
-      if (slash < 1) {
-        return null;
-      }
-
-      String packageName = uriPath.substring(0, slash);
-      String fileUriPart = uriPath.substring(slash + 1);
-      String filePath = fileUriPart.replaceAll('/', _context.separator);
-
-      File file = _workspace.builtFile(
-          _workspace.builtPackageSourcePath(filePath), packageName);
-      if (file != null && file.exists) {
-        return file.createSource(uri);
-      }
-      return basicResolverSource;
-    });
-  }
-
-  @override
-  Uri restoreAbsolute(Source source) {
-    Context context = _workspace.provider.pathContext;
-    String path = source.fullName;
-
-    if (context.isWithin(_workspace.root, path)) {
-      String relative = context.relative(path, from: _workspace.root);
-      List<String> components = context.split(relative);
-      if (components.length > 4 &&
-          components[0] == 'build' &&
-          components[1] == 'generated' &&
-          components[3] == 'lib') {
-        String packageName = components[2];
-        String pathInLib = components.skip(4).join('/');
-        return Uri.parse('package:$packageName/$pathInLib');
-      }
-    }
-    return source.uri;
-  }
-}
-
-/**
- * Information about a package:build workspace.
- */
-class PackageBuildWorkspace extends Workspace {
-  /**
-   * The name of the directory that identifies the root of the workspace. Note,
-   * the presence of this file does not show package:build is used. For that,
-   * the subdirectory [_dartToolBuildName] must exist. A `pub` subdirectory
-   * will usually exist in non-package:build projects too.
-   */
-  static const String _dartToolRootName = '.dart_tool';
-
-  /**
-   * The name of the subdirectory in [_dartToolName] that distinguishes projects
-   * built with package:build.
-   */
-  static const String _dartToolBuildName = 'build';
-
-  /**
-   * We use pubspec.yaml to get the package name to be consistent with how
-   * package:build does it.
-   */
-  static const String _pubspecName = 'pubspec.yaml';
-
-  /**
-   * The resource provider used to access the file system.
-   */
-  final ResourceProvider provider;
-
-  /**
-   * The absolute workspace root path (the directory containing the `.dart_tool`
-   * directory).
-   */
-  final String root;
-
-  /**
-   * The name of the package under development as defined in pubspec.yaml. This
-   * matches the behavior of package:build.
-   */
-  final String projectPackageName;
-
-  final ContextBuilder _builder;
-
-  /**
-   * The map of package locations indexed by package name.
-   *
-   * This is a cached field.
-   */
-  Map<String, List<Folder>> _packageMap;
-
-  /**
-   * The package location strategy.
-   *
-   * This is a cached field.
-   */
-  Packages _packages;
-
-  PackageBuildWorkspace._(
-      this.provider, this.root, this.projectPackageName, this._builder);
-
-  @override
-  Map<String, List<Folder>> get packageMap {
-    _packageMap ??= _builder.convertPackagesToMap(packages);
-    return _packageMap;
-  }
-
-  Packages get packages {
-    _packages ??= _builder.createPackageMap(root);
-    return _packages;
-  }
-
-  @override
-  UriResolver get packageUriResolver => new PackageBuildPackageUriResolver(
-      this, new PackageMapUriResolver(provider, packageMap));
-
-  /**
-   * For some package file, which may or may not be a package source (it could
-   * be in `bin/`, `web/`, etc), find where its built counterpart will exist if
-   * its a generated source.
-   *
-   * To get a [builtPath] for a package source file to use in this method,
-   * use [builtPackageSourcePath]. For `bin/`, `web/`, etc, it must be relative
-   * to the project root.
-   */
-  File builtFile(String builtPath, String packageName) {
-    if (!packageMap.containsKey(packageName)) {
-      return null;
-    }
-    String path = context.join(
-        root, _dartToolRootName, 'build', 'generated', packageName, builtPath);
-    return provider.getFile(path);
-  }
-
-  /**
-   * Unlike the way that sources are resolved against `.packages` (if foo points
-   * to folder bar, then `foo:baz.dart` is found at `bar/baz.dart`), the built
-   * sources for a package require the `lib/` prefix first. This is because
-   * `bin/`, `web/`, and `test/` etc can all be built as well. This method
-   * exists to give a name to that prefix processing step.
-   */
-  String builtPackageSourcePath(String path) {
-    assert(context.isRelative(path));
-    return context.join('lib', path);
-  }
-
-  @override
-  SourceFactory createSourceFactory(DartSdk sdk) {
-    List<UriResolver> resolvers = <UriResolver>[];
-    if (sdk != null) {
-      resolvers.add(new DartUriResolver(sdk));
-    }
-    resolvers.add(packageUriResolver);
-    resolvers.add(new PackageBuildFileUriResolver(this));
-    return new SourceFactory(resolvers, packages, provider);
-  }
-
-  /**
-   * Return the file with the given [path], looking first into directories for
-   * source files, and then in the generated directory
-   * `.dart_tool/build/generated/$projectPackageName/$FILE`. The file in the
-   * workspace root is returned even if it does not exist. Return `null` if the
-   * given [path] is not in the workspace [root].
-   */
-  File findFile(String path) {
-    assert(context.isAbsolute(path));
-    try {
-      final String builtPath = context.relative(path, from: root);
-      final File file = builtFile(builtPath, projectPackageName);
-
-      if (file.exists) {
-        return file;
-      }
-
-      return provider.getFile(path);
-    } catch (_) {
-      return null;
-    }
-  }
-
-  /**
-   * Find the package:build workspace that contains the given [path].
-   *
-   * Return `null` if the path is not in a package:build workspace.
-   */
-  static PackageBuildWorkspace find(
-      ResourceProvider provider, String path, ContextBuilder builder) {
-    Context context = provider.pathContext;
-
-    // Ensure that the path is absolute and normalized.
-    if (!context.isAbsolute(path)) {
-      throw new ArgumentError('Not an absolute path: $path');
-    }
-    path = context.normalize(path);
-
-    Folder folder = provider.getFolder(path);
-    while (true) {
-      Folder parent = folder.parent;
-      if (parent == null) {
-        return null;
-      }
-
-      final File pubspec = folder.getChildAssumingFile(_pubspecName);
-      final Folder dartToolDir =
-          folder.getChildAssumingFolder(_dartToolRootName);
-      final Folder dartToolBuildDir =
-          dartToolDir.getChildAssumingFolder(_dartToolBuildName);
-
-      // Found the .dart_tool file, that's our project root. We also require a
-      // pubspec, to know the package name that package:build will assume.
-      if (dartToolBuildDir.exists && pubspec.exists) {
-        try {
-          final yaml = loadYaml(pubspec.readAsStringSync());
-          return new PackageBuildWorkspace._(
-              provider, folder.path, yaml['name'], builder);
-        } on Exception {}
-      }
-
-      // Go up the folder.
-      folder = parent;
-    }
-  }
-}
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index dcaf2a5..b75defe 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
@@ -35,101 +36,65 @@
 
 part 'parser_fasta.dart';
 
-/**
- * A simple data-holder for a method that needs to return multiple values.
- */
+/// A simple data-holder for a method that needs to return multiple values.
 class CommentAndMetadata {
-  /**
-   * The documentation comment that was parsed, or `null` if none was given.
-   */
+  /// The documentation comment that was parsed, or `null` if none was given.
   final Comment comment;
 
-  /**
-   * The metadata that was parsed, or `null` if none was given.
-   */
+  /// The metadata that was parsed, or `null` if none was given.
   final List<Annotation> metadata;
 
-  /**
-   * Initialize a newly created holder with the given [comment] and [metadata].
-   */
+  /// Initialize a newly created holder with the given [comment] and [metadata].
   CommentAndMetadata(this.comment, this.metadata);
 
-  /**
-   * Return `true` if some metadata was parsed.
-   */
+  /// Return `true` if some metadata was parsed.
   bool get hasMetadata => metadata != null && metadata.isNotEmpty;
 }
 
-/**
- * A simple data-holder for a method that needs to return multiple values.
- */
+/// A simple data-holder for a method that needs to return multiple values.
 class FinalConstVarOrType {
-  /**
-   * The 'final', 'const' or 'var' keyword, or `null` if none was given.
-   */
+  /// The 'final', 'const' or 'var' keyword, or `null` if none was given.
   final Token keyword;
 
-  /**
-   * The type, or `null` if no type was specified.
-   */
+  /// The type, or `null` if no type was specified.
   final TypeAnnotation type;
 
-  /**
-   * Initialize a newly created holder with the given [keyword] and [type].
-   */
+  /// Initialize a newly created holder with the given [keyword] and [type].
   FinalConstVarOrType(this.keyword, this.type);
 }
 
-/**
- * A simple data-holder for a method that needs to return multiple values.
- */
+/// A simple data-holder for a method that needs to return multiple values.
 class Modifiers {
-  /**
-   * The token representing the keyword 'abstract', or `null` if the keyword was
-   * not found.
-   */
+  /// The token representing the keyword 'abstract', or `null` if the keyword
+  /// was not found.
   Token abstractKeyword;
 
-  /**
-   * The token representing the keyword 'const', or `null` if the keyword was
-   * not found.
-   */
+  /// The token representing the keyword 'const', or `null` if the keyword was
+  /// not found.
   Token constKeyword;
 
-  /**
-   * The token representing the keyword 'covariant', or `null` if the keyword
-   * was not found.
-   */
+  /// The token representing the keyword 'covariant', or `null` if the keyword
+  /// was not found.
   Token covariantKeyword;
 
-  /**
-   * The token representing the keyword 'external', or `null` if the keyword was
-   * not found.
-   */
+  /// The token representing the keyword 'external', or `null` if the keyword
+  /// was not found.
   Token externalKeyword;
 
-  /**
-   * The token representing the keyword 'factory', or `null` if the keyword was
-   * not found.
-   */
+  /// The token representing the keyword 'factory', or `null` if the keyword was
+  /// not found.
   Token factoryKeyword;
 
-  /**
-   * The token representing the keyword 'final', or `null` if the keyword was
-   * not found.
-   */
+  /// The token representing the keyword 'final', or `null` if the keyword was
+  /// not found.
   Token finalKeyword;
 
-  /**
-   * The token representing the keyword 'static', or `null` if the keyword was
-   * not found.
-   */
+  /// The token representing the keyword 'static', or `null` if the keyword was
+  /// not found.
   Token staticKeyword;
 
-  /**
-   * The token representing the keyword 'var', or `null` if the keyword was not
-   * found.
-   */
+  /// The token representing the keyword 'var', or `null` if the keyword was not
+  /// found.
   Token varKeyword;
 
   @override
@@ -145,11 +110,9 @@
     return buffer.toString();
   }
 
-  /**
-   * If the given [keyword] is not `null`, append it to the given [builder],
-   * prefixing it with a space if [needsSpace] is `true`. Return `true` if
-   * subsequent keywords need to be prefixed with a space.
-   */
+  /// If the given [keyword] is not `null`, append it to the given [builder],
+  /// prefixing it with a space if [needsSpace] is `true`. Return `true` if
+  /// subsequent keywords need to be prefixed with a space.
   bool _appendKeyword(StringBuffer buffer, bool needsSpace, Token keyword) {
     if (keyword != null) {
       if (needsSpace) {
@@ -162,9 +125,7 @@
   }
 }
 
-/**
- * A parser used to parse tokens into an AST structure.
- */
+/// A parser used to parse tokens into an AST structure.
 class Parser {
   static String ASYNC = Keyword.ASYNC.lexeme;
 
@@ -180,91 +141,61 @@
 
   static const int _MAX_TREE_DEPTH = 300;
 
-  /**
-   * A flag indicating whether the analyzer [Parser] factory method
-   * will return a fasta based parser or an analyzer based parser.
-   */
+  /// A flag indicating whether the analyzer [Parser] factory method
+  /// will return a fasta based parser or an analyzer based parser.
   static const bool useFasta =
       const bool.fromEnvironment("useFastaParser", defaultValue: true);
 
-  /**
-   * The source being parsed.
-   */
+  /// The source being parsed.
   final Source _source;
 
-  /**
-   * The error listener that will be informed of any errors that are found
-   * during the parse.
-   */
+  /// The error listener that will be informed of any errors that are found
+  /// during the parse.
   final AnalysisErrorListener _errorListener;
 
-  /**
-   * An [_errorListener] lock, if more than `0`, then errors are not reported.
-   */
+  /// An [_errorListener] lock, if more than `0`, then errors are not reported.
   int _errorListenerLock = 0;
 
-  /**
-   * A flag indicating whether the parser should parse instance creation
-   * expressions that lack either the `new` or `const` keyword.
-   */
+  /// A flag indicating whether the parser should parse instance creation
+  /// expressions that lack either the `new` or `const` keyword.
   bool _enableOptionalNewAndConst = true;
 
-  /**
-   * A flag indicating whether parser is to parse function bodies.
-   */
+  /// A flag indicating whether parser is to parse function bodies.
   bool _parseFunctionBodies = true;
 
-  /**
-   * The next token to be parsed.
-   */
+  /// The next token to be parsed.
   Token _currentToken;
 
-  /**
-   * The depth of the current AST. When this depth is too high, so we're at the
-   * risk of overflowing the stack, we stop parsing and report an error.
-   */
+  /// The depth of the current AST. When this depth is too high, so we're at the
+  /// risk of overflowing the stack, we stop parsing and report an error.
   int _treeDepth = 0;
 
-  /**
-   * A flag indicating whether the parser is currently in a function body marked
-   * as being 'async'.
-   */
+  /// A flag indicating whether the parser is currently in a function body
+  /// marked as being 'async'.
   bool _inAsync = false;
 
-  /**
-   * A flag indicating whether the parser is currently in a function body marked
-   * (by a star) as being a generator.
-   */
+  /// A flag indicating whether the parser is currently in a function body
+  ///  marked(by a star) as being a generator.
   bool _inGenerator = false;
 
-  /**
-   * A flag indicating whether the parser is currently in the body of a loop.
-   */
+  /// A flag indicating whether the parser is currently in the body of a loop.
   bool _inLoop = false;
 
-  /**
-   * A flag indicating whether the parser is currently in a switch statement.
-   */
+  /// A flag indicating whether the parser is currently in a switch statement.
   bool _inSwitch = false;
 
-  /**
-   * A flag indicating whether the parser is currently in a constructor field
-   * initializer, with no intervening parentheses, braces, or brackets.
-   */
+  /// A flag indicating whether the parser is currently in a constructor field
+  /// initializer, with no intervening parentheses, braces, or brackets.
   bool _inInitializer = false;
 
-  /**
-   * A flag indicating whether the parser is to parse generic method syntax.
-   */
+  /// A flag indicating whether the parser is to parse generic method syntax.
   @deprecated
   bool parseGenericMethods = false;
 
   bool allowNativeClause;
 
-  /**
-   * Initialize a newly created parser to parse tokens in the given [_source]
-   * and to report any errors that are found to the given [_errorListener].
-   */
+  /// Initialize a newly created parser to parse tokens in the given [_source]
+  /// and to report any errors that are found to the given [_errorListener].
   factory Parser(Source source, AnalysisErrorListener errorListener,
       {bool useFasta}) {
     if (useFasta ?? Parser.useFasta) {
@@ -276,65 +207,63 @@
 
   Parser.withoutFasta(this._source, this._errorListener);
 
-  /**
-   * Return the current token.
-   */
+  /// Return the current token.
   Token get currentToken => _currentToken;
 
-  /**
-   * Set the token with which the parse is to begin to the given [token].
-   */
+  /// Set the token with which the parse is to begin to the given [token].
   void set currentToken(Token token) {
     this._currentToken = token;
   }
 
-  /**
-   * Return `true` if the parser is to parse asserts in the initializer list of
-   * a constructor.
-   */
+  /// Return `true` if the parser is to parse asserts in the initializer list of
+  /// a constructor.
   @deprecated
   bool get enableAssertInitializer => true;
 
-  /**
-   * Set whether the parser is to parse asserts in the initializer list of a
-   * constructor to match the given [enable] flag.
-   */
+  /// Set whether the parser is to parse asserts in the initializer list of a
+  /// constructor to match the given [enable] flag.
   @deprecated
   void set enableAssertInitializer(bool enable) {}
 
-  /**
-   * Return `true` if the parser should parse instance creation expressions that
-   * lack either the `new` or `const` keyword.
-   */
+  /// Enables or disables non-nullable by default.
+  void set enableNonNullable(bool value) {
+    if (value) {
+      throw new UnimplementedError(
+          'non-nullable experiment not supported by analyzer parser');
+    }
+  }
+
+  /// Return `true` if the parser should parse instance creation expressions
+  /// that lack either the `new` or `const` keyword.
   bool get enableOptionalNewAndConst => _enableOptionalNewAndConst;
 
-  /**
-   * Set whether the parser should parse instance creation expressions that lack
-   * either the `new` or `const` keyword.
-   */
+  /// Set whether the parser should parse instance creation expressions that
+  /// lack either the `new` or `const` keyword.
   void set enableOptionalNewAndConst(bool enable) {
     _enableOptionalNewAndConst = enable;
   }
 
-  /**
-   * Return `true` if the parser is to allow URI's in part-of directives.
-   */
+  /// Enables or disables parsing of set literals.
+  void set enableSetLiterals(bool value) {
+    if (value) {
+      throw new UnimplementedError(
+          'set-literal experiment not supported by analyzer parser');
+    }
+  }
+
+  /// Return `true` if the parser is to allow URI's in part-of directives.
   @deprecated
   bool get enableUriInPartOf => true;
 
-  /**
-   * Set whether the parser is to allow URI's in part-of directives to the given
-   * [enable] flag.
-   */
+  /// Set whether the parser is to allow URI's in part-of directives to the
+  /// given [enable] flag.
   @deprecated
   void set enableUriInPartOf(bool enable) {}
 
-  /**
-   * Return `true` if the current token is the first token of a return type that
-   * is followed by an identifier, possibly followed by a list of type
-   * parameters, followed by a left-parenthesis. This is used by
-   * [parseTypeAlias] to determine whether or not to parse a return type.
-   */
+  /// Return `true` if the current token is the first token of a return type
+  /// that is followed by an identifier, possibly followed by a list of type
+  /// parameters, followed by a left-parenthesis. This is used by
+  /// [parseTypeAlias] to determine whether or not to parse a return type.
   bool get hasReturnTypeInTypeAlias {
     // TODO(brianwilkerson) This is too expensive as implemented and needs to be
     // re-implemented or removed.
@@ -345,11 +274,9 @@
     return _tokenMatchesIdentifier(next);
   }
 
-  /**
-   * Set whether the parser is to parse the async support.
-   *
-   * Support for removing the 'async' library has been removed.
-   */
+  /// Set whether the parser is to parse the async support.
+  ///
+  /// Support for removing the 'async' library has been removed.
   @deprecated
   void set parseAsync(bool parseAsync) {}
 
@@ -359,19 +286,15 @@
   @deprecated
   void set parseConditionalDirectives(bool value) {}
 
-  /**
-   * Set whether parser is to parse function bodies.
-   */
+  /// Set whether parser is to parse function bodies.
   void set parseFunctionBodies(bool parseFunctionBodies) {
     this._parseFunctionBodies = parseFunctionBodies;
   }
 
-  /**
-   * Return the content of a string with the given literal representation. The
-   * [lexeme] is the literal representation of the string. The flag [isFirst] is
-   * `true` if this is the first token in a string literal. The flag [isLast] is
-   * `true` if this is the last token in a string literal.
-   */
+  /// Return the content of a string with the given literal representation. The
+  /// [lexeme] is the literal representation of the string. The flag [isFirst]
+  /// is `true` if this is the first token in a string literal. The flag
+  /// [isLast] is `true` if this is the last token in a string literal.
   String computeStringValue(String lexeme, bool isFirst, bool isLast) {
     StringLexemeHelper helper = new StringLexemeHelper(lexeme, isFirst, isLast);
     int start = helper.start;
@@ -394,9 +317,7 @@
     return buffer.toString();
   }
 
-  /**
-   * Return a synthetic identifier.
-   */
+  /// Return a synthetic identifier.
   SimpleIdentifier createSyntheticIdentifier({bool isDeclaration: false}) {
     Token syntheticToken;
     if (_currentToken.type.isKeyword) {
@@ -414,26 +335,21 @@
         isDeclaration: isDeclaration);
   }
 
-  /**
-   * Return a synthetic string literal.
-   */
+  /// Return a synthetic string literal.
   SimpleStringLiteral createSyntheticStringLiteral() => astFactory
       .simpleStringLiteral(_createSyntheticToken(TokenType.STRING), "");
 
-  /**
-   * Advance to the next token in the token stream, making it the new current
-   * token and return the token that was current before this method was invoked.
-   */
+  /// Advance to the next token in the token stream, making it the new current
+  /// token and return the token that was current before this method was
+  /// invoked.
   Token getAndAdvance() {
     Token token = _currentToken;
     _currentToken = _currentToken.next;
     return token;
   }
 
-  /**
-   * Return `true` if the current token appears to be the beginning of a
-   * function declaration.
-   */
+  /// Return `true` if the current token appears to be the beginning of a
+  /// function declaration.
   bool isFunctionDeclaration() {
     Keyword keyword = _currentToken.keyword;
     Token afterReturnType = skipTypeWithoutFunction(_currentToken);
@@ -478,10 +394,8 @@
     return false;
   }
 
-  /**
-   * Return `true` if the given [token] appears to be the beginning of a
-   * function expression.
-   */
+  /// Return `true` if the given [token] appears to be the beginning of a
+  /// function expression.
   bool isFunctionExpression(Token token) {
     // Function expressions aren't allowed in initializer lists.
     if (_inInitializer) {
@@ -503,30 +417,28 @@
     return lexeme == ASYNC || lexeme == SYNC;
   }
 
-  /**
-   * Return `true` if the current token is the first token in an initialized
-   * variable declaration rather than an expression. This method assumes that we
-   * have already skipped past any metadata that might be associated with the
-   * declaration.
-   *
-   *     initializedVariableDeclaration ::=
-   *         declaredIdentifier ('=' expression)? (',' initializedIdentifier)*
-   *
-   *     declaredIdentifier ::=
-   *         metadata finalConstVarOrType identifier
-   *
-   *     finalConstVarOrType ::=
-   *         'final' type?
-   *       | 'const' type?
-   *       | 'var'
-   *       | type
-   *
-   *     type ::=
-   *         qualified typeArguments?
-   *
-   *     initializedIdentifier ::=
-   *         identifier ('=' expression)?
-   */
+  /// Return `true` if the current token is the first token in an initialized
+  /// variable declaration rather than an expression. This method assumes that
+  /// we have already skipped past any metadata that might be associated with
+  /// the declaration.
+  ///
+  ///     initializedVariableDeclaration ::=
+  ///         declaredIdentifier ('=' expression)? (',' initializedIdentifier)*
+  ///
+  ///     declaredIdentifier ::=
+  ///         metadata finalConstVarOrType identifier
+  ///
+  ///     finalConstVarOrType ::=
+  ///         'final' type?
+  ///       | 'const' type?
+  ///       | 'var'
+  ///       | type
+  ///
+  ///     type ::=
+  ///         qualified typeArguments?
+  ///
+  ///     initializedIdentifier ::=
+  ///         identifier ('=' expression)?
   bool isInitializedVariableDeclaration() {
     Keyword keyword = _currentToken.keyword;
     if (keyword == Keyword.FINAL ||
@@ -601,10 +513,8 @@
     return false;
   }
 
-  /**
-   * Return `true` if the current token appears to be the beginning of a switch
-   * member.
-   */
+  /// Return `true` if the current token appears to be the beginning of a switch
+  /// member.
   bool isSwitchMember() {
     Token token = _currentToken;
     while (_tokenMatches(token, TokenType.IDENTIFIER) &&
@@ -615,14 +525,12 @@
     return keyword == Keyword.CASE || keyword == Keyword.DEFAULT;
   }
 
-  /**
-   * Parse an additive expression. Return the additive expression that was
-   * parsed.
-   *
-   *     additiveExpression ::=
-   *         multiplicativeExpression (additiveOperator multiplicativeExpression)*
-   *       | 'super' (additiveOperator multiplicativeExpression)+
-   */
+  /// Parse an additive expression. Return the additive expression that was
+  /// parsed.
+  ///
+  ///     additiveExpression ::=
+  ///         multiplicativeExpression (additiveOperator multiplicativeExpression)*
+  ///       | 'super' (additiveOperator multiplicativeExpression)+
   Expression parseAdditiveExpression() {
     Expression expression;
     if (_currentToken.keyword == Keyword.SUPER &&
@@ -638,14 +546,12 @@
     return expression;
   }
 
-  /**
-   * Parse an annotation. Return the annotation that was parsed.
-   *
-   * This method assumes that the current token matches [TokenType.AT].
-   *
-   *     annotation ::=
-   *         '@' qualified ('.' identifier)? arguments?
-   */
+  /// Parse an annotation. Return the annotation that was parsed.
+  ///
+  /// This method assumes that the current token matches [TokenType.AT].
+  ///
+  ///     annotation ::=
+  ///         '@' qualified ('.' identifier)? arguments?
   Annotation parseAnnotation() {
     Token atSign = getAndAdvance();
     Identifier name = parsePrefixedIdentifier();
@@ -663,16 +569,14 @@
         atSign, name, period, constructorName, arguments);
   }
 
-  /**
-   * Parse an argument. Return the argument that was parsed.
-   *
-   *     argument ::=
-   *         namedArgument
-   *       | expression
-   *
-   *     namedArgument ::=
-   *         label expression
-   */
+  /// Parse an argument. Return the argument that was parsed.
+  ///
+  ///     argument ::=
+  ///         namedArgument
+  ///       | expression
+  ///
+  ///     namedArgument ::=
+  ///         label expression
   Expression parseArgument() {
     // TODO(brianwilkerson) Consider returning a wrapper indicating whether the
     // expression is a named expression in order to remove the 'is' check in
@@ -688,29 +592,25 @@
     }
   }
 
-  /**
-   * Parse a list of arguments. Return the argument list that was parsed.
-   *
-   * This method assumes that the current token matches [TokenType.OPEN_PAREN].
-   *
-   *     arguments ::=
-   *         '(' argumentList? ')'
-   *
-   *     argumentList ::=
-   *         namedArgument (',' namedArgument)*
-   *       | expressionList (',' namedArgument)*
-   */
+  /// Parse a list of arguments. Return the argument list that was parsed.
+  ///
+  /// This method assumes that the current token matches [TokenType.OPEN_PAREN].
+  ///
+  ///     arguments ::=
+  ///         '(' argumentList? ')'
+  ///
+  ///     argumentList ::=
+  ///         namedArgument (',' namedArgument)*
+  ///       | expressionList (',' namedArgument)*
   ArgumentList parseArgumentList() {
     Token leftParenthesis = getAndAdvance();
     if (_matches(TokenType.CLOSE_PAREN)) {
       return astFactory.argumentList(leftParenthesis, null, getAndAdvance());
     }
 
-    /**
-     * Return `true` if the parser appears to be at the beginning of an argument
-     * even though there was no comma. This is a special case of the more
-     * general recovery technique described below.
-     */
+    /// Return `true` if the parser appears to be at the beginning of an
+    /// argument even though there was no comma. This is a special case of the
+    /// more general recovery technique described below.
     bool isLikelyMissingComma() {
       if (_matchesIdentifier() &&
           _tokenMatches(_currentToken.next, TokenType.COLON) &&
@@ -770,14 +670,12 @@
     }
   }
 
-  /**
-   * Parse an assert statement. Return the assert statement.
-   *
-   * This method assumes that the current token matches `Keyword.ASSERT`.
-   *
-   *     assertStatement ::=
-   *         'assert' '(' expression [',' expression] ')' ';'
-   */
+  /// Parse an assert statement. Return the assert statement.
+  ///
+  /// This method assumes that the current token matches `Keyword.ASSERT`.
+  ///
+  ///     assertStatement ::=
+  ///         'assert' '(' expression [',' expression] ')' ';'
   AssertStatement parseAssertStatement() {
     Token keyword = getAndAdvance();
     Token leftParen = _expect(TokenType.OPEN_PAREN);
@@ -803,16 +701,14 @@
         keyword, leftParen, expression, comma, message, rightParen, semicolon);
   }
 
-  /**
-   * Parse an assignable expression. The [primaryAllowed] is `true` if the
-   * expression is allowed to be a primary without any assignable selector.
-   * Return the assignable expression that was parsed.
-   *
-   *     assignableExpression ::=
-   *         primary (arguments* assignableSelector)+
-   *       | 'super' unconditionalAssignableSelector
-   *       | identifier
-   */
+  /// Parse an assignable expression. The [primaryAllowed] is `true` if the
+  /// expression is allowed to be a primary without any assignable selector.
+  /// Return the assignable expression that was parsed.
+  ///
+  ///     assignableExpression ::=
+  ///         primary (arguments* assignableSelector)+
+  ///       | 'super' unconditionalAssignableSelector
+  ///       | identifier
   Expression parseAssignableExpression(bool primaryAllowed) {
     //
     // A primary expression can start with an identifier. We resolve the
@@ -862,21 +758,19 @@
     }
   }
 
-  /**
-   * Parse an assignable selector. The [prefix] is the expression preceding the
-   * selector. The [optional] is `true` if the selector is optional. Return the
-   * assignable selector that was parsed, or the original prefix if there was no
-   * assignable selector.  If [allowConditional] is false, then the '?.'
-   * operator will still be parsed, but a parse error will be generated.
-   *
-   *     unconditionalAssignableSelector ::=
-   *         '[' expression ']'
-   *       | '.' identifier
-   *
-   *     assignableSelector ::=
-   *         unconditionalAssignableSelector
-   *       | '?.' identifier
-   */
+  /// Parse an assignable selector. The [prefix] is the expression preceding the
+  /// selector. The [optional] is `true` if the selector is optional. Return the
+  /// assignable selector that was parsed, or the original prefix if there was
+  /// no assignable selector.  If [allowConditional] is false, then the '?.'
+  /// operator will still be parsed, but a parse error will be generated.
+  ///
+  ///     unconditionalAssignableSelector ::=
+  ///         '[' expression ']'
+  ///       | '.' identifier
+  ///
+  ///     assignableSelector ::=
+  ///         unconditionalAssignableSelector
+  ///       | '?.' identifier
   Expression parseAssignableSelector(Expression prefix, bool optional,
       {bool allowConditional: true}) {
     TokenType type = _currentToken.type;
@@ -921,28 +815,24 @@
     }
   }
 
-  /**
-   * Parse a await expression. Return the await expression that was parsed.
-   *
-   * This method assumes that the current token matches `_AWAIT`.
-   *
-   *     awaitExpression ::=
-   *         'await' unaryExpression
-   */
+  /// Parse a await expression. Return the await expression that was parsed.
+  ///
+  /// This method assumes that the current token matches `_AWAIT`.
+  ///
+  ///     awaitExpression ::=
+  ///         'await' unaryExpression
   AwaitExpression parseAwaitExpression() {
     Token awaitToken = getAndAdvance();
     Expression expression = parseUnaryExpression();
     return astFactory.awaitExpression(awaitToken, expression);
   }
 
-  /**
-   * Parse a bitwise and expression. Return the bitwise and expression that was
-   * parsed.
-   *
-   *     bitwiseAndExpression ::=
-   *         shiftExpression ('&' shiftExpression)*
-   *       | 'super' ('&' shiftExpression)+
-   */
+  /// Parse a bitwise and expression. Return the bitwise and expression that was
+  /// parsed.
+  ///
+  ///     bitwiseAndExpression ::=
+  ///         shiftExpression ('&' shiftExpression)*
+  ///       | 'super' ('&' shiftExpression)+
   Expression parseBitwiseAndExpression() {
     Expression expression;
     if (_currentToken.keyword == Keyword.SUPER &&
@@ -958,14 +848,12 @@
     return expression;
   }
 
-  /**
-   * Parse a bitwise or expression. Return the bitwise or expression that was
-   * parsed.
-   *
-   *     bitwiseOrExpression ::=
-   *         bitwiseXorExpression ('|' bitwiseXorExpression)*
-   *       | 'super' ('|' bitwiseXorExpression)+
-   */
+  /// Parse a bitwise or expression. Return the bitwise or expression that was
+  /// parsed.
+  ///
+  ///     bitwiseOrExpression ::=
+  ///         bitwiseXorExpression ('|' bitwiseXorExpression)*
+  ///       | 'super' ('|' bitwiseXorExpression)+
   Expression parseBitwiseOrExpression() {
     Expression expression;
     if (_currentToken.keyword == Keyword.SUPER &&
@@ -981,14 +869,12 @@
     return expression;
   }
 
-  /**
-   * Parse a bitwise exclusive-or expression. Return the bitwise exclusive-or
-   * expression that was parsed.
-   *
-   *     bitwiseXorExpression ::=
-   *         bitwiseAndExpression ('^' bitwiseAndExpression)*
-   *       | 'super' ('^' bitwiseAndExpression)+
-   */
+  /// Parse a bitwise exclusive-or expression. Return the bitwise exclusive-or
+  /// expression that was parsed.
+  ///
+  ///     bitwiseXorExpression ::=
+  ///         bitwiseAndExpression ('^' bitwiseAndExpression)*
+  ///       | 'super' ('^' bitwiseAndExpression)+
   Expression parseBitwiseXorExpression() {
     Expression expression;
     if (_currentToken.keyword == Keyword.SUPER &&
@@ -1004,15 +890,13 @@
     return expression;
   }
 
-  /**
-   * Parse a block. Return the block that was parsed.
-   *
-   * This method assumes that the current token matches
-   * [TokenType.OPEN_CURLY_BRACKET].
-   *
-   *     block ::=
-   *         '{' statements '}'
-   */
+  /// Parse a block. Return the block that was parsed.
+  ///
+  /// This method assumes that the current token matches
+  /// [TokenType.OPEN_CURLY_BRACKET].
+  ///
+  ///     block ::=
+  ///         '{' statements '}'
   Block parseBlock() {
     bool isEndOfBlock() {
       TokenType type = _currentToken.type;
@@ -1042,14 +926,12 @@
     return astFactory.block(leftBracket, statements, rightBracket);
   }
 
-  /**
-   * Parse a break statement. Return the break statement that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.BREAK`.
-   *
-   *     breakStatement ::=
-   *         'break' identifier? ';'
-   */
+  /// Parse a break statement. Return the break statement that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.BREAK`.
+  ///
+  ///     breakStatement ::=
+  ///         'break' identifier? ';'
   Statement parseBreakStatement() {
     Token breakKeyword = getAndAdvance();
     SimpleIdentifier label = null;
@@ -1063,24 +945,22 @@
     return astFactory.breakStatement(breakKeyword, label, semicolon);
   }
 
-  /**
-   * Parse a cascade section. Return the expression representing the cascaded
-   * method invocation.
-   *
-   * This method assumes that the current token matches
-   * `TokenType.PERIOD_PERIOD`.
-   *
-   *     cascadeSection ::=
-   *         '..' (cascadeSelector typeArguments? arguments*)
-   *         (assignableSelector typeArguments? arguments*)* cascadeAssignment?
-   *
-   *     cascadeSelector ::=
-   *         '[' expression ']'
-   *       | identifier
-   *
-   *     cascadeAssignment ::=
-   *         assignmentOperator expressionWithoutCascade
-   */
+  /// Parse a cascade section. Return the expression representing the cascaded
+  /// method invocation.
+  ///
+  /// This method assumes that the current token matches
+  /// `TokenType.PERIOD_PERIOD`.
+  ///
+  ///     cascadeSection ::=
+  ///         '..' (cascadeSelector typeArguments? arguments*)
+  ///         (assignableSelector typeArguments? arguments*)* cascadeAssignment?
+  ///
+  ///     cascadeSelector ::=
+  ///         '[' expression ']'
+  ///       | identifier
+  ///
+  ///     cascadeAssignment ::=
+  ///         assignmentOperator expressionWithoutCascade
   Expression parseCascadeSection() {
     Token period = getAndAdvance();
     Expression expression = null;
@@ -1162,18 +1042,16 @@
     return expression;
   }
 
-  /**
-   * Parse a class declaration. The [commentAndMetadata] is the metadata to be
-   * associated with the member. The [abstractKeyword] is the token for the
-   * keyword 'abstract', or `null` if the keyword was not given. Return the
-   * class declaration that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.CLASS`.
-   *
-   *     classDeclaration ::=
-   *         metadata 'abstract'? 'class' name typeParameterList? (extendsClause withClause?)? implementsClause? '{' classMembers '}' |
-   *         metadata 'abstract'? 'class' mixinApplicationClass
-   */
+  /// Parse a class declaration. The [commentAndMetadata] is the metadata to be
+  /// associated with the member. The [abstractKeyword] is the token for the
+  /// keyword 'abstract', or `null` if the keyword was not given. Return the
+  /// class declaration that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.CLASS`.
+  ///
+  ///     classDeclaration ::=
+  ///         metadata 'abstract'? 'class' name typeParameterList? (extendsClause withClause?)? implementsClause? '{' classMembers '}' |
+  ///         metadata 'abstract'? 'class' mixinApplicationClass
   CompilationUnitMember parseClassDeclaration(
       CommentAndMetadata commentAndMetadata, Token abstractKeyword) {
     //
@@ -1292,15 +1170,13 @@
     return classDeclaration;
   }
 
-  /**
-   * Parse a class member. The [className] is the name of the class containing
-   * the member being parsed. Return the class member that was parsed, or `null`
-   * if what was found was not a valid class member.
-   *
-   *     classMemberDefinition ::=
-   *         declaration ';'
-   *       | methodSignature functionBody
-   */
+  /// Parse a class member. The [className] is the name of the class containing
+  /// the member being parsed. Return the class member that was parsed, or
+  /// `null` if what was found was not a valid class member.
+  ///
+  ///     classMemberDefinition ::=
+  ///         declaration ';'
+  ///       | methodSignature functionBody
   ClassMember parseClassMember(String className) {
     CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
     Modifiers modifiers = parseModifiers();
@@ -1648,14 +1524,12 @@
         type);
   }
 
-  /**
-   * Parse a single combinator. Return the combinator that was parsed, or `null`
-   * if no combinator is found.
-   *
-   *     combinator ::=
-   *         'show' identifier (',' identifier)*
-   *       | 'hide' identifier (',' identifier)*
-   */
+  /// Parse a single combinator. Return the combinator that was parsed, or
+  /// `null` if no combinator is found.
+  ///
+  ///     combinator ::=
+  ///         'show' identifier (',' identifier)*
+  ///       | 'hide' identifier (',' identifier)*
   Combinator parseCombinator() {
     if (_matchesKeyword(Keyword.SHOW)) {
       return astFactory.showCombinator(getAndAdvance(), parseIdentifierList());
@@ -1665,14 +1539,12 @@
     return null;
   }
 
-  /**
-   * Parse a list of combinators in a directive. Return the combinators that
-   * were parsed, or `null` if there are no combinators.
-   *
-   *     combinator ::=
-   *         'show' identifier (',' identifier)*
-   *       | 'hide' identifier (',' identifier)*
-   */
+  /// Parse a list of combinators in a directive. Return the combinators that
+  /// were parsed, or `null` if there are no combinators.
+  ///
+  ///     combinator ::=
+  ///         'show' identifier (',' identifier)*
+  ///       | 'hide' identifier (',' identifier)*
   List<Combinator> parseCombinators() {
     List<Combinator> combinators = null;
     while (true) {
@@ -1686,16 +1558,14 @@
     return combinators;
   }
 
-  /**
-   * Parse the documentation comment and metadata preceding a declaration. This
-   * method allows any number of documentation comments to occur before, after
-   * or between the metadata, but only returns the last (right-most)
-   * documentation comment that is found. Return the documentation comment and
-   * metadata that were parsed.
-   *
-   *     metadata ::=
-   *         annotation*
-   */
+  /// Parse the documentation comment and metadata preceding a declaration. This
+  /// method allows any number of documentation comments to occur before, after
+  /// or between the metadata, but only returns the last (right-most)
+  /// documentation comment that is found. Return the documentation comment and
+  /// metadata that were parsed.
+  ///
+  ///     metadata ::=
+  ///         annotation*
   CommentAndMetadata parseCommentAndMetadata() {
     // TODO(brianwilkerson) Consider making the creation of documentation
     // comments be lazy.
@@ -1713,16 +1583,14 @@
     return new CommentAndMetadata(parseDocumentationComment(tokens), metadata);
   }
 
-  /**
-   * Parse a comment reference from the source between square brackets. The
-   * [referenceSource] is the source occurring between the square brackets
-   * within a documentation comment. The [sourceOffset] is the offset of the
-   * first character of the reference source. Return the comment reference that
-   * was parsed, or `null` if no reference could be found.
-   *
-   *     commentReference ::=
-   *         'new'? prefixedIdentifier
-   */
+  /// Parse a comment reference from the source between square brackets. The
+  /// [referenceSource] is the source occurring between the square brackets
+  /// within a documentation comment. The [sourceOffset] is the offset of the
+  /// first character of the reference source. Return the comment reference that
+  /// was parsed, or `null` if no reference could be found.
+  ///
+  ///     commentReference ::=
+  ///         'new'? prefixedIdentifier
   CommentReference parseCommentReference(
       String referenceSource, int sourceOffset) {
     // TODO(brianwilkerson) The errors are not getting the right offset/length
@@ -1822,18 +1690,16 @@
     return null;
   }
 
-  /**
-   * Parse all of the comment references occurring in the given array of
-   * documentation comments. The [tokens] are the comment tokens representing
-   * the documentation comments to be parsed. Return the comment references that
-   * were parsed.
-   *
-   *     commentReference ::=
-   *         '[' 'new'? qualified ']' libraryReference?
-   *
-   *     libraryReference ::=
-   *          '(' stringLiteral ')'
-   */
+  /// Parse all of the comment references occurring in the given array of
+  /// documentation comments. The [tokens] are the comment tokens representing
+  /// the documentation comments to be parsed. Return the comment references
+  /// that were parsed.
+  ///
+  ///     commentReference ::=
+  ///         '[' 'new'? qualified ']' libraryReference?
+  ///
+  ///     libraryReference ::=
+  ///          '(' stringLiteral ')'
   List<CommentReference> parseCommentReferences(
       List<DocumentationCommentToken> tokens) {
     List<CommentReference> references = <CommentReference>[];
@@ -1904,32 +1770,28 @@
     return references;
   }
 
-  /**
-   * Parse a compilation unit, starting with the given [token]. Return the
-   * compilation unit that was parsed.
-   */
+  /// Parse a compilation unit, starting with the given [token]. Return the
+  /// compilation unit that was parsed.
   CompilationUnit parseCompilationUnit(Token token) {
     _currentToken = token;
     return parseCompilationUnit2();
   }
 
-  /**
-   * Parse a compilation unit. Return the compilation unit that was parsed.
-   *
-   * Specified:
-   *
-   *     compilationUnit ::=
-   *         scriptTag? directive* topLevelDeclaration*
-   *
-   * Actual:
-   *
-   *     compilationUnit ::=
-   *         scriptTag? topLevelElement*
-   *
-   *     topLevelElement ::=
-   *         directive
-   *       | topLevelDeclaration
-   */
+  /// Parse a compilation unit. Return the compilation unit that was parsed.
+  ///
+  /// Specified:
+  ///
+  ///     compilationUnit ::=
+  ///         scriptTag? directive* topLevelDeclaration*
+  ///
+  /// Actual:
+  ///
+  ///     compilationUnit ::=
+  ///         scriptTag? topLevelElement*
+  ///
+  ///     topLevelElement ::=
+  ///         directive
+  ///       | topLevelDeclaration
   CompilationUnit parseCompilationUnit2() {
     Token firstToken = _currentToken;
     ScriptTag scriptTag = null;
@@ -2075,23 +1937,21 @@
         firstToken, scriptTag, directives, declarations, _currentToken);
   }
 
-  /**
-   * Parse a compilation unit member. The [commentAndMetadata] is the metadata
-   * to be associated with the member. Return the compilation unit member that
-   * was parsed, or `null` if what was parsed could not be represented as a
-   * compilation unit member.
-   *
-   *     compilationUnitMember ::=
-   *         classDefinition
-   *       | functionTypeAlias
-   *       | external functionSignature
-   *       | external getterSignature
-   *       | external setterSignature
-   *       | functionSignature functionBody
-   *       | returnType? getOrSet identifier formalParameterList functionBody
-   *       | (final | const) type? staticFinalDeclarationList ';'
-   *       | variableDeclaration ';'
-   */
+  /// Parse a compilation unit member. The [commentAndMetadata] is the metadata
+  /// to be associated with the member. Return the compilation unit member that
+  /// was parsed, or `null` if what was parsed could not be represented as a
+  /// compilation unit member.
+  ///
+  ///     compilationUnitMember ::=
+  ///         classDefinition
+  ///       | functionTypeAlias
+  ///       | external functionSignature
+  ///       | external getterSignature
+  ///       | external setterSignature
+  ///       | functionSignature functionBody
+  ///       | returnType? getOrSet identifier formalParameterList functionBody
+  ///       | (final | const) type? staticFinalDeclarationList ';'
+  ///       | variableDeclaration ';'
   CompilationUnitMember parseCompilationUnitMember(
       CommentAndMetadata commentAndMetadata) {
     Modifiers modifiers = parseModifiers();
@@ -2290,13 +2150,11 @@
         _expect(TokenType.SEMICOLON));
   }
 
-  /**
-   * Parse a conditional expression. Return the conditional expression that was
-   * parsed.
-   *
-   *     conditionalExpression ::=
-   *         ifNullExpression ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
-   */
+  /// Parse a conditional expression. Return the conditional expression that was
+  /// parsed.
+  ///
+  ///     conditionalExpression ::=
+  ///         ifNullExpression ('?' expressionWithoutCascade ':' expressionWithoutCascade)?
   Expression parseConditionalExpression() {
     Expression condition = parseIfNullExpression();
     if (_currentToken.type != TokenType.QUESTION) {
@@ -2310,20 +2168,18 @@
         condition, question, thenExpression, colon, elseExpression);
   }
 
-  /**
-   * Parse a configuration in either an import or export directive.
-   *
-   * This method assumes that the current token matches `Keyword.IF`.
-   *
-   *     configuration ::=
-   *         'if' '(' test ')' uri
-   *
-   *     test ::=
-   *         dottedName ('==' stringLiteral)?
-   *
-   *     dottedName ::=
-   *         identifier ('.' identifier)*
-   */
+  /// Parse a configuration in either an import or export directive.
+  ///
+  /// This method assumes that the current token matches `Keyword.IF`.
+  ///
+  ///     configuration ::=
+  ///         'if' '(' test ')' uri
+  ///
+  ///     test ::=
+  ///         dottedName ('==' stringLiteral)?
+  ///
+  ///     dottedName ::=
+  ///         identifier ('.' identifier)*
   Configuration parseConfiguration() {
     Token ifKeyword = getAndAdvance();
     Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
@@ -2344,16 +2200,14 @@
         equalToken, value, rightParenthesis, libraryUri);
   }
 
-  /**
-   * Parse a const expression. Return the const expression that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.CONST`.
-   *
-   *     constExpression ::=
-   *         instanceCreationExpression
-   *       | listLiteral
-   *       | mapLiteral
-   */
+  /// Parse a const expression. Return the const expression that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.CONST`.
+  ///
+  ///     constExpression ::=
+  ///         instanceCreationExpression
+  ///       | listLiteral
+  ///       | mapLiteral
   Expression parseConstExpression() {
     Token keyword = getAndAdvance();
     TokenType type = _currentToken.type;
@@ -2368,14 +2222,12 @@
     return parseInstanceCreationExpression(keyword);
   }
 
-  /**
-   * Parse a field initializer within a constructor. The flag [hasThis] should
-   * be true if the current token is `this`. Return the field initializer that
-   * was parsed.
-   *
-   *     fieldInitializer:
-   *         ('this' '.')? identifier '=' conditionalExpression cascadeSection*
-   */
+  /// Parse a field initializer within a constructor. The flag [hasThis] should
+  /// be true if the current token is `this`. Return the field initializer that
+  /// was parsed.
+  ///
+  ///     fieldInitializer:
+  ///         ('this' '.')? identifier '=' conditionalExpression cascadeSection*
   ConstructorFieldInitializer parseConstructorFieldInitializer(bool hasThis) {
     Token keywordToken = null;
     Token period = null;
@@ -2427,13 +2279,11 @@
     }
   }
 
-  /**
-   * Parse the name of a constructor. Return the constructor name that was
-   * parsed.
-   *
-   *     constructorName:
-   *         type ('.' identifier)?
-   */
+  /// Parse the name of a constructor. Return the constructor name that was
+  /// parsed.
+  ///
+  ///     constructorName:
+  ///         type ('.' identifier)?
   ConstructorName parseConstructorName() {
     TypeName type = parseTypeName(false);
     Token period = null;
@@ -2445,14 +2295,12 @@
     return astFactory.constructorName(type, period, name);
   }
 
-  /**
-   * Parse a continue statement. Return the continue statement that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.CONTINUE`.
-   *
-   *     continueStatement ::=
-   *         'continue' identifier? ';'
-   */
+  /// Parse a continue statement. Return the continue statement that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.CONTINUE`.
+  ///
+  ///     continueStatement ::=
+  ///         'continue' identifier? ';'
   Statement parseContinueStatement() {
     Token continueKeyword = getAndAdvance();
     if (!_inLoop && !_inSwitch) {
@@ -2471,16 +2319,14 @@
     return astFactory.continueStatement(continueKeyword, label, semicolon);
   }
 
-  /**
-   * Parse a directive. The [commentAndMetadata] is the metadata to be
-   * associated with the directive. Return the directive that was parsed.
-   *
-   *     directive ::=
-   *         exportDirective
-   *       | libraryDirective
-   *       | importDirective
-   *       | partDirective
-   */
+  /// Parse a directive. The [commentAndMetadata] is the metadata to be
+  /// associated with the directive. Return the directive that was parsed.
+  ///
+  ///     directive ::=
+  ///         exportDirective
+  ///       | libraryDirective
+  ///       | importDirective
+  ///       | partDirective
   Directive parseDirective(CommentAndMetadata commentAndMetadata) {
     if (_matchesKeyword(Keyword.IMPORT)) {
       return parseImportDirective(commentAndMetadata);
@@ -2498,25 +2344,21 @@
     }
   }
 
-  /**
-   * Parse the script tag and directives in a compilation unit, starting with
-   * the given [token], until the first non-directive is encountered. The
-   * remainder of the compilation unit will not be parsed. Specifically, if
-   * there are directives later in the file, they will not be parsed. Return the
-   * compilation unit that was parsed.
-   */
+  /// Parse the script tag and directives in a compilation unit, starting with
+  /// the given [token], until the first non-directive is encountered. The
+  /// remainder of the compilation unit will not be parsed. Specifically, if
+  /// there are directives later in the file, they will not be parsed. Return
+  /// the compilation unit that was parsed.
   CompilationUnit parseDirectives(Token token) {
     _currentToken = token;
     return parseDirectives2();
   }
 
-  /**
-   * Parse the script tag and directives in a compilation unit until the first
-   * non-directive is encountered. Return the compilation unit that was parsed.
-   *
-   *     compilationUnit ::=
-   *         scriptTag? directive*
-   */
+  /// Parse the script tag and directives in a compilation unit until the first
+  /// non-directive is encountered. Return the compilation unit that was parsed.
+  ///
+  ///     compilationUnit ::=
+  ///         scriptTag? directive*
   CompilationUnit parseDirectives2() {
     Token firstToken = _currentToken;
     ScriptTag scriptTag = null;
@@ -2550,15 +2392,13 @@
         firstToken, scriptTag, directives, null, _currentToken);
   }
 
-  /**
-   * Parse a documentation comment based on the given list of documentation
-   * comment tokens. Return the documentation comment that was parsed, or `null`
-   * if there was no comment.
-   *
-   *     documentationComment ::=
-   *         multiLineComment?
-   *       | singleLineComment*
-   */
+  /// Parse a documentation comment based on the given list of documentation
+  /// comment tokens. Return the documentation comment that was parsed, or
+  /// `null` if there was no comment.
+  ///
+  ///     documentationComment ::=
+  ///         multiLineComment?
+  ///       | singleLineComment*
   Comment parseDocumentationComment(List<DocumentationCommentToken> tokens) {
     if (tokens == null) {
       return null;
@@ -2567,14 +2407,12 @@
     return astFactory.documentationComment(tokens, references);
   }
 
-  /**
-   * Parse a documentation comment. Return the documentation comment that was
-   * parsed, or `null` if there was no comment.
-   *
-   *     documentationComment ::=
-   *         multiLineComment?
-   *       | singleLineComment*
-   */
+  /// Parse a documentation comment. Return the documentation comment that was
+  /// parsed, or `null` if there was no comment.
+  ///
+  ///     documentationComment ::=
+  ///         multiLineComment?
+  ///       | singleLineComment*
   List<DocumentationCommentToken> parseDocumentationCommentTokens() {
     List<DocumentationCommentToken> tokens = <DocumentationCommentToken>[];
     CommentToken commentToken = _currentToken.precedingComments;
@@ -2596,14 +2434,12 @@
     return tokens.isEmpty ? null : tokens;
   }
 
-  /**
-   * Parse a do statement. Return the do statement that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.DO`.
-   *
-   *     doStatement ::=
-   *         'do' statement 'while' '(' expression ')' ';'
-   */
+  /// Parse a do statement. Return the do statement that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.DO`.
+  ///
+  ///     doStatement ::=
+  ///         'do' statement 'while' '(' expression ')' ';'
   Statement parseDoStatement() {
     bool wasInLoop = _inLoop;
     _inLoop = true;
@@ -2622,12 +2458,10 @@
     }
   }
 
-  /**
-   * Parse a dotted name. Return the dotted name that was parsed.
-   *
-   *     dottedName ::=
-   *         identifier ('.' identifier)*
-   */
+  /// Parse a dotted name. Return the dotted name that was parsed.
+  ///
+  ///     dottedName ::=
+  ///         identifier ('.' identifier)*
   DottedName parseDottedName() {
     List<SimpleIdentifier> components = <SimpleIdentifier>[
       parseSimpleIdentifier()
@@ -2638,25 +2472,21 @@
     return astFactory.dottedName(components);
   }
 
-  /**
-   * Parse an empty statement. Return the empty statement that was parsed.
-   *
-   * This method assumes that the current token matches `TokenType.SEMICOLON`.
-   *
-   *     emptyStatement ::=
-   *         ';'
-   */
+  /// Parse an empty statement. Return the empty statement that was parsed.
+  ///
+  /// This method assumes that the current token matches `TokenType.SEMICOLON`.
+  ///
+  ///     emptyStatement ::=
+  ///         ';'
   Statement parseEmptyStatement() => astFactory.emptyStatement(getAndAdvance());
 
-  /**
-   * Parse an enum declaration. The [commentAndMetadata] is the metadata to be
-   * associated with the member. Return the enum declaration that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.ENUM`.
-   *
-   *     enumType ::=
-   *         metadata 'enum' id '{' id (',' id)* (',')? '}'
-   */
+  /// Parse an enum declaration. The [commentAndMetadata] is the metadata to be
+  /// associated with the member. Return the enum declaration that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.ENUM`.
+  ///
+  ///     enumType ::=
+  ///         metadata 'enum' id '{' id (',' id)* (',')? '}'
   EnumDeclaration parseEnumDeclaration(CommentAndMetadata commentAndMetadata) {
     Token keyword = getAndAdvance();
     SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
@@ -2697,14 +2527,12 @@
         rightBracket);
   }
 
-  /**
-   * Parse an equality expression. Return the equality expression that was
-   * parsed.
-   *
-   *     equalityExpression ::=
-   *         relationalExpression (equalityOperator relationalExpression)?
-   *       | 'super' equalityOperator relationalExpression
-   */
+  /// Parse an equality expression. Return the equality expression that was
+  /// parsed.
+  ///
+  ///     equalityExpression ::=
+  ///         relationalExpression (equalityOperator relationalExpression)?
+  ///       | 'super' equalityOperator relationalExpression
   Expression parseEqualityExpression() {
     Expression expression;
     if (_currentToken.keyword == Keyword.SUPER &&
@@ -2726,15 +2554,14 @@
     return expression;
   }
 
-  /**
-   * Parse an export directive. The [commentAndMetadata] is the metadata to be
-   * associated with the directive. Return the export directive that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.EXPORT`.
-   *
-   *     exportDirective ::=
-   *         metadata 'export' stringLiteral configuration* combinator*';'
-   */
+  /// Parse an export directive. The [commentAndMetadata] is the metadata to be
+  /// associated with the directive. Return the export directive that was
+  /// parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.EXPORT`.
+  ///
+  ///     exportDirective ::=
+  ///         metadata 'export' stringLiteral configuration* combinator*';'
   ExportDirective parseExportDirective(CommentAndMetadata commentAndMetadata) {
     Token exportKeyword = getAndAdvance();
     StringLiteral libraryUri = _parseUri();
@@ -2751,25 +2578,21 @@
         semicolon);
   }
 
-  /**
-   * Parse an expression, starting with the given [token]. Return the expression
-   * that was parsed, or `null` if the tokens do not represent a recognizable
-   * expression.
-   */
+  /// Parse an expression, starting with the given [token]. Return the
+  /// expression that was parsed, or `null` if the tokens do not represent a
+  /// recognizable expression.
   Expression parseExpression(Token token) {
     _currentToken = token;
     return parseExpression2();
   }
 
-  /**
-   * Parse an expression that might contain a cascade. Return the expression
-   * that was parsed.
-   *
-   *     expression ::=
-   *         assignableExpression assignmentOperator expression
-   *       | conditionalExpression cascadeSection*
-   *       | throwExpression
-   */
+  /// Parse an expression that might contain a cascade. Return the expression
+  /// that was parsed.
+  ///
+  ///     expression ::=
+  ///         assignableExpression assignmentOperator expression
+  ///       | conditionalExpression cascadeSection*
+  ///       | throwExpression
   Expression parseExpression2() {
     if (_treeDepth > _MAX_TREE_DEPTH) {
       throw new _TooDeepTreeError();
@@ -2812,12 +2635,10 @@
     }
   }
 
-  /**
-   * Parse a list of expressions. Return the expression that was parsed.
-   *
-   *     expressionList ::=
-   *         expression (',' expression)*
-   */
+  /// Parse a list of expressions. Return the expression that was parsed.
+  ///
+  ///     expressionList ::=
+  ///         expression (',' expression)*
   List<Expression> parseExpressionList() {
     List<Expression> expressions = <Expression>[parseExpression2()];
     while (_optional(TokenType.COMMA)) {
@@ -2826,15 +2647,13 @@
     return expressions;
   }
 
-  /**
-   * Parse an expression that does not contain any cascades. Return the
-   * expression that was parsed.
-   *
-   *     expressionWithoutCascade ::=
-   *         assignableExpression assignmentOperator expressionWithoutCascade
-   *       | conditionalExpression
-   *       | throwExpressionWithoutCascade
-   */
+  /// Parse an expression that does not contain any cascades. Return the
+  /// expression that was parsed.
+  ///
+  ///     expressionWithoutCascade ::=
+  ///         assignableExpression assignmentOperator expressionWithoutCascade
+  ///       | conditionalExpression
+  ///       | throwExpressionWithoutCascade
   Expression parseExpressionWithoutCascade() {
     if (_matchesKeyword(Keyword.THROW)) {
       return parseThrowExpressionWithoutCascade();
@@ -2857,32 +2676,28 @@
     return expression;
   }
 
-  /**
-   * Parse a class extends clause. Return the class extends clause that was
-   * parsed.
-   *
-   * This method assumes that the current token matches `Keyword.EXTENDS`.
-   *
-   *     classExtendsClause ::=
-   *         'extends' type
-   */
+  /// Parse a class extends clause. Return the class extends clause that was
+  /// parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.EXTENDS`.
+  ///
+  ///     classExtendsClause ::=
+  ///         'extends' type
   ExtendsClause parseExtendsClause() {
     Token keyword = getAndAdvance();
     TypeName superclass = parseTypeName(false);
     return astFactory.extendsClause(keyword, superclass);
   }
 
-  /**
-   * Parse the 'final', 'const', 'var' or type preceding a variable declaration.
-   * The [optional] is `true` if the keyword and type are optional. Return the
-   * 'final', 'const', 'var' or type that was parsed.
-   *
-   *     finalConstVarOrType ::=
-   *         'final' type?
-   *       | 'const' type?
-   *       | 'var'
-   *       | type
-   */
+  /// Parse the 'final', 'const', 'var' or type preceding a variable
+  /// declaration. The [optional] is `true` if the keyword and type are
+  /// optional. Return the 'final', 'const', 'var' or type that was parsed.
+  ///
+  ///     finalConstVarOrType ::=
+  ///         'final' type?
+  ///       | 'const' type?
+  ///       | 'var'
+  ///       | type
   FinalConstVarOrType parseFinalConstVarOrType(bool optional,
       {bool inFunctionType: false}) {
     Token keywordToken = null;
@@ -2925,19 +2740,17 @@
     return new FinalConstVarOrType(keywordToken, type);
   }
 
-  /**
-   * Parse a formal parameter. At most one of `isOptional` and `isNamed` can be
-   * `true`. The [kind] is the kind of parameter being expected based on the
-   * presence or absence of group delimiters. Return the formal parameter that
-   * was parsed.
-   *
-   *     defaultFormalParameter ::=
-   *         normalFormalParameter ('=' expression)?
-   *
-   *     defaultNamedParameter ::=
-   *         normalFormalParameter ('=' expression)?
-   *         normalFormalParameter (':' expression)?
-   */
+  /// Parse a formal parameter. At most one of `isOptional` and `isNamed` can be
+  /// `true`. The [kind] is the kind of parameter being expected based on the
+  /// presence or absence of group delimiters. Return the formal parameter that
+  /// was parsed.
+  ///
+  ///     defaultFormalParameter ::=
+  ///         normalFormalParameter ('=' expression)?
+  ///
+  ///     defaultNamedParameter ::=
+  ///         normalFormalParameter ('=' expression)?
+  ///         normalFormalParameter (':' expression)?
   FormalParameter parseFormalParameter(ParameterKind kind,
       {bool inFunctionType: false}) {
     NormalFormalParameter parameter =
@@ -3000,28 +2813,26 @@
     return parameter;
   }
 
-  /**
-   * Parse a list of formal parameters. Return the formal parameters that were
-   * parsed.
-   *
-   *     formalParameterList ::=
-   *         '(' ')'
-   *       | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
-   *       | '(' optionalFormalParameters ')'
-   *
-   *     normalFormalParameters ::=
-   *         normalFormalParameter (',' normalFormalParameter)*
-   *
-   *     optionalFormalParameters ::=
-   *         optionalPositionalFormalParameters
-   *       | namedFormalParameters
-   *
-   *     optionalPositionalFormalParameters ::=
-   *         '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
-   *
-   *     namedFormalParameters ::=
-   *         '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
-   */
+  /// Parse a list of formal parameters. Return the formal parameters that were
+  /// parsed.
+  ///
+  ///     formalParameterList ::=
+  ///         '(' ')'
+  ///       | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
+  ///       | '(' optionalFormalParameters ')'
+  ///
+  ///     normalFormalParameters ::=
+  ///         normalFormalParameter (',' normalFormalParameter)*
+  ///
+  ///     optionalFormalParameters ::=
+  ///         optionalPositionalFormalParameters
+  ///       | namedFormalParameters
+  ///
+  ///     optionalPositionalFormalParameters ::=
+  ///         '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
+  ///
+  ///     namedFormalParameters ::=
+  ///         '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
   FormalParameterList parseFormalParameterList({bool inFunctionType: false}) {
     if (_matches(TokenType.OPEN_PAREN)) {
       return _parseFormalParameterListUnchecked(inFunctionType: inFunctionType);
@@ -3035,21 +2846,19 @@
         _createSyntheticToken(TokenType.OPEN_PAREN));
   }
 
-  /**
-   * Parse a for statement. Return the for statement that was parsed.
-   *
-   *     forStatement ::=
-   *         'for' '(' forLoopParts ')' statement
-   *
-   *     forLoopParts ::=
-   *         forInitializerStatement expression? ';' expressionList?
-   *       | declaredIdentifier 'in' expression
-   *       | identifier 'in' expression
-   *
-   *     forInitializerStatement ::=
-   *         localVariableDeclaration ';'
-   *       | expression? ';'
-   */
+  /// Parse a for statement. Return the for statement that was parsed.
+  ///
+  ///     forStatement ::=
+  ///         'for' '(' forLoopParts ')' statement
+  ///
+  ///     forLoopParts ::=
+  ///         forInitializerStatement expression? ';' expressionList?
+  ///       | declaredIdentifier 'in' expression
+  ///       | identifier 'in' expression
+  ///
+  ///     forInitializerStatement ::=
+  ///         localVariableDeclaration ';'
+  ///       | expression? ';'
   Statement parseForStatement() {
     bool wasInLoop = _inLoop;
     _inLoop = true;
@@ -3181,21 +2990,20 @@
     }
   }
 
-  /**
-   * Parse a function body. The [mayBeEmpty] is `true` if the function body is
-   * allowed to be empty. The [emptyErrorCode] is the error code to report if
-   * function body expected, but not found. The [inExpression] is `true` if the
-   * function body is being parsed as part of an expression and therefore does
-   * not have a terminating semicolon. Return the function body that was parsed.
-   *
-   *     functionBody ::=
-   *         '=>' expression ';'
-   *       | block
-   *
-   *     functionExpressionBody ::=
-   *         '=>' expression
-   *       | block
-   */
+  /// Parse a function body. The [mayBeEmpty] is `true` if the function body is
+  /// allowed to be empty. The [emptyErrorCode] is the error code to report if
+  /// function body expected, but not found. The [inExpression] is `true` if the
+  /// function body is being parsed as part of an expression and therefore does
+  /// not have a terminating semicolon. Return the function body that was
+  /// parsed.
+  ///
+  ///     functionBody ::=
+  ///         '=>' expression ';'
+  ///       | block
+  ///
+  ///     functionExpressionBody ::=
+  ///         '=>' expression
+  ///       | block
   FunctionBody parseFunctionBody(
       bool mayBeEmpty, ParserErrorCode emptyErrorCode, bool inExpression) {
     bool wasInAsync = _inAsync;
@@ -3301,19 +3109,17 @@
     }
   }
 
-  /**
-   * Parse a function declaration. The [commentAndMetadata] is the documentation
-   * comment and metadata to be associated with the declaration. The
-   * [externalKeyword] is the 'external' keyword, or `null` if the function is
-   * not external. The [returnType] is the return type, or `null` if there is no
-   * return type. The [isStatement] is `true` if the function declaration is
-   * being parsed as a statement. Return the function declaration that was
-   * parsed.
-   *
-   *     functionDeclaration ::=
-   *         functionSignature functionBody
-   *       | returnType? getOrSet identifier formalParameterList functionBody
-   */
+  /// Parse a function declaration. The [commentAndMetadata] is the
+  /// documentation comment and metadata to be associated with the declaration.
+  /// The [externalKeyword] is the 'external' keyword, or `null` if the
+  /// function is not external. The [returnType] is the return type, or `null`
+  /// if there is no return type. The [isStatement] is `true` if the function
+  /// declaration is being parsed as a statement. Return the function
+  /// declaration that was parsed.
+  ///
+  ///     functionDeclaration ::=
+  ///         functionSignature functionBody
+  ///       | returnType? getOrSet identifier formalParameterList functionBody
   FunctionDeclaration parseFunctionDeclaration(
       CommentAndMetadata commentAndMetadata,
       Token externalKeyword,
@@ -3377,13 +3183,11 @@
         astFactory.functionExpression(typeParameters, parameters, body));
   }
 
-  /**
-   * Parse a function declaration statement. Return the function declaration
-   * statement that was parsed.
-   *
-   *     functionDeclarationStatement ::=
-   *         functionSignature functionBody
-   */
+  /// Parse a function declaration statement. Return the function declaration
+  /// statement that was parsed.
+  ///
+  ///     functionDeclarationStatement ::=
+  ///         functionSignature functionBody
   Statement parseFunctionDeclarationStatement() {
     Modifiers modifiers = parseModifiers();
     _validateModifiersForFunctionDeclarationStatement(modifiers);
@@ -3391,13 +3195,11 @@
         parseCommentAndMetadata(), _parseOptionalReturnType());
   }
 
-  /**
-   * Parse a function expression. Return the function expression that was
-   * parsed.
-   *
-   *     functionExpression ::=
-   *         typeParameters? formalParameterList functionExpressionBody
-   */
+  /// Parse a function expression. Return the function expression that was
+  /// parsed.
+  ///
+  ///     functionExpression ::=
+  ///         typeParameters? formalParameterList functionExpressionBody
   FunctionExpression parseFunctionExpression() {
     TypeParameterList typeParameters = _parseGenericMethodTypeParameters();
     FormalParameterList parameters = parseFormalParameterList();
@@ -3407,29 +3209,27 @@
     return astFactory.functionExpression(typeParameters, parameters, body);
   }
 
-  /**
-   * Parse the portion of a generic function type following the [returnType].
-   *
-   *     functionType ::=
-   *         returnType? 'Function' typeParameters? parameterTypeList
-   *     parameterTypeList ::=
-   *         '(' ')' |
-   *       | '(' normalParameterTypes ','? ')' |
-   *       | '(' normalParameterTypes ',' optionalParameterTypes ')' |
-   *       | '(' optionalParameterTypes ')'
-   *     normalParameterTypes ::=
-   *         normalParameterType (',' normalParameterType)*
-   *     normalParameterType ::=
-   *         type | typedIdentifier
-   *     optionalParameterTypes ::=
-   *         optionalPositionalParameterTypes | namedParameterTypes
-   *     optionalPositionalParameterTypes ::=
-   *         '[' normalParameterTypes ','? ']'
-   *     namedParameterTypes ::=
-   *         '{' typedIdentifier (',' typedIdentifier)* ','? '}'
-   *     typedIdentifier ::=
-   *         type identifier
-   */
+  /// Parse the portion of a generic function type following the [returnType].
+  ///
+  ///     functionType ::=
+  ///         returnType? 'Function' typeParameters? parameterTypeList
+  ///     parameterTypeList ::=
+  ///         '(' ')' |
+  ///       | '(' normalParameterTypes ','? ')' |
+  ///       | '(' normalParameterTypes ',' optionalParameterTypes ')' |
+  ///       | '(' optionalParameterTypes ')'
+  ///     normalParameterTypes ::=
+  ///         normalParameterType (',' normalParameterType)*
+  ///     normalParameterType ::=
+  ///         type | typedIdentifier
+  ///     optionalParameterTypes ::=
+  ///         optionalPositionalParameterTypes | namedParameterTypes
+  ///     optionalPositionalParameterTypes ::=
+  ///         '[' normalParameterTypes ','? ']'
+  ///     namedParameterTypes ::=
+  ///         '{' typedIdentifier (',' typedIdentifier)* ','? '}'
+  ///     typedIdentifier ::=
+  ///         type identifier
   GenericFunctionType parseGenericFunctionTypeAfterReturnType(
       TypeAnnotation returnType) {
     Token functionKeyword = null;
@@ -3450,14 +3250,12 @@
         returnType, functionKeyword, typeParameters, parameters);
   }
 
-  /**
-   * Parse a generic function type alias.
-   *
-   * This method assumes that the current token is an identifier.
-   *
-   *     genericTypeAlias ::=
-   *         'typedef' identifier typeParameterList? '=' functionType ';'
-   */
+  /// Parse a generic function type alias.
+  ///
+  /// This method assumes that the current token is an identifier.
+  ///
+  ///     genericTypeAlias ::=
+  ///         'typedef' identifier typeParameterList? '=' functionType ';'
   GenericTypeAlias parseGenericTypeAlias(
       CommentAndMetadata commentAndMetadata, Token keyword) {
     Identifier name = _parseSimpleIdentifierUnchecked(isDeclaration: true);
@@ -3494,22 +3292,20 @@
         semicolon);
   }
 
-  /**
-   * Parse a getter. The [commentAndMetadata] is the documentation comment and
-   * metadata to be associated with the declaration. The externalKeyword] is the
-   * 'external' token. The staticKeyword] is the static keyword, or `null` if
-   * the getter is not static. The [returnType] the return type that has already
-   * been parsed, or `null` if there was no return type. Return the getter that
-   * was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.GET`.
-   *
-   *     getter ::=
-   *         getterSignature functionBody?
-   *
-   *     getterSignature ::=
-   *         'external'? 'static'? returnType? 'get' identifier
-   */
+  /// Parse a getter. The [commentAndMetadata] is the documentation comment and
+  /// metadata to be associated with the declaration. The externalKeyword] is
+  /// the 'external' token. The staticKeyword] is the static keyword, or `null`
+  /// if the getter is not static. The [returnType] the return type that has
+  /// already been parsed, or `null` if there was no return type. Return the
+  /// getter that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.GET`.
+  ///
+  ///     getter ::=
+  ///         getterSignature functionBody?
+  ///
+  ///     getterSignature ::=
+  ///         'external'? 'static'? returnType? 'get' identifier
   MethodDeclaration parseGetter(CommentAndMetadata commentAndMetadata,
       Token externalKeyword, Token staticKeyword, TypeAnnotation returnType) {
     Token propertyKeyword = getAndAdvance();
@@ -3541,13 +3337,11 @@
         body);
   }
 
-  /**
-   * Parse a list of identifiers. Return the list of identifiers that were
-   * parsed.
-   *
-   *     identifierList ::=
-   *         identifier (',' identifier)*
-   */
+  /// Parse a list of identifiers. Return the list of identifiers that were
+  /// parsed.
+  ///
+  ///     identifierList ::=
+  ///         identifier (',' identifier)*
   List<SimpleIdentifier> parseIdentifierList() {
     List<SimpleIdentifier> identifiers = <SimpleIdentifier>[
       parseSimpleIdentifier()
@@ -3558,12 +3352,10 @@
     return identifiers;
   }
 
-  /**
-   * Parse an if-null expression.  Return the if-null expression that was
-   * parsed.
-   *
-   *     ifNullExpression ::= logicalOrExpression ('??' logicalOrExpression)*
-   */
+  /// Parse an if-null expression.  Return the if-null expression that was
+  /// parsed.
+  ///
+  ///     ifNullExpression ::= logicalOrExpression ('??' logicalOrExpression)*
   Expression parseIfNullExpression() {
     Expression expression = parseLogicalOrExpression();
     while (_currentToken.type == TokenType.QUESTION_QUESTION) {
@@ -3573,14 +3365,12 @@
     return expression;
   }
 
-  /**
-   * Parse an if statement. Return the if statement that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.IF`.
-   *
-   *     ifStatement ::=
-   *         'if' '(' expression ')' statement ('else' statement)?
-   */
+  /// Parse an if statement. Return the if statement that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.IF`.
+  ///
+  ///     ifStatement ::=
+  ///         'if' '(' expression ')' statement ('else' statement)?
   Statement parseIfStatement() {
     Token ifKeyword = getAndAdvance();
     Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
@@ -3597,14 +3387,12 @@
         rightParenthesis, thenStatement, elseKeyword, elseStatement);
   }
 
-  /**
-   * Parse an implements clause. Return the implements clause that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.IMPLEMENTS`.
-   *
-   *     implementsClause ::=
-   *         'implements' type (',' type)*
-   */
+  /// Parse an implements clause. Return the implements clause that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.IMPLEMENTS`.
+  ///
+  ///     implementsClause ::=
+  ///         'implements' type (',' type)*
   ImplementsClause parseImplementsClause() {
     Token keyword = getAndAdvance();
     List<TypeName> interfaces = <TypeName>[];
@@ -3615,15 +3403,14 @@
     return astFactory.implementsClause(keyword, interfaces);
   }
 
-  /**
-   * Parse an import directive. The [commentAndMetadata] is the metadata to be
-   * associated with the directive. Return the import directive that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.IMPORT`.
-   *
-   *     importDirective ::=
-   *         metadata 'import' stringLiteral configuration* (deferred)? ('as' identifier)? combinator*';'
-   */
+  /// Parse an import directive. The [commentAndMetadata] is the metadata to be
+  /// associated with the directive. Return the import directive that was
+  /// parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.IMPORT`.
+  ///
+  ///     importDirective ::=
+  ///         metadata 'import' stringLiteral configuration* (deferred)? ('as' identifier)? combinator*';'
   ImportDirective parseImportDirective(CommentAndMetadata commentAndMetadata) {
     Token importKeyword = getAndAdvance();
     StringLiteral libraryUri = _parseUri();
@@ -3671,25 +3458,23 @@
         semicolon);
   }
 
-  /**
-   * Parse a list of initialized identifiers. The [commentAndMetadata] is the
-   * documentation comment and metadata to be associated with the declaration.
-   * The [staticKeyword] is the static keyword, or `null` if the getter is not
-   * static. The [keyword] is the token representing the 'final', 'const' or
-   * 'var' keyword, or `null` if there is no keyword. The [type] is the type
-   * that has already been parsed, or `null` if 'var' was provided. Return the
-   * getter that was parsed.
-   *
-   *     declaration ::=
-   *         ('static' | 'covariant')? ('var' | type) initializedIdentifierList ';'
-   *       | 'final' type? initializedIdentifierList ';'
-   *
-   *     initializedIdentifierList ::=
-   *         initializedIdentifier (',' initializedIdentifier)*
-   *
-   *     initializedIdentifier ::=
-   *         identifier ('=' expression)?
-   */
+  /// Parse a list of initialized identifiers. The [commentAndMetadata] is the
+  /// documentation comment and metadata to be associated with the declaration.
+  /// The [staticKeyword] is the static keyword, or `null` if the getter is not
+  /// static. The [keyword] is the token representing the 'final', 'const' or
+  /// 'var' keyword, or `null` if there is no keyword. The [type] is the type
+  /// that has already been parsed, or `null` if 'var' was provided. Return the
+  /// getter that was parsed.
+  ///
+  ///     declaration ::=
+  ///         ('static' | 'covariant')? ('var' | type) initializedIdentifierList ';'
+  ///       | 'final' type? initializedIdentifierList ';'
+  ///
+  ///     initializedIdentifierList ::=
+  ///         initializedIdentifier (',' initializedIdentifier)*
+  ///
+  ///     initializedIdentifier ::=
+  ///         identifier ('=' expression)?
   FieldDeclaration parseInitializedIdentifierList(
       CommentAndMetadata commentAndMetadata,
       Token staticKeyword,
@@ -3707,14 +3492,12 @@
         semicolon: _expect(TokenType.SEMICOLON));
   }
 
-  /**
-   * Parse an instance creation expression. The [keyword] is the 'new' or
-   * 'const' keyword that introduces the expression. Return the instance
-   * creation expression that was parsed.
-   *
-   *     instanceCreationExpression ::=
-   *         ('new' | 'const') type ('.' identifier)? argumentList
-   */
+  /// Parse an instance creation expression. The [keyword] is the 'new' or
+  /// 'const' keyword that introduces the expression. Return the instance
+  /// creation expression that was parsed.
+  ///
+  ///     instanceCreationExpression ::=
+  ///         ('new' | 'const') type ('.' identifier)? argumentList
   InstanceCreationExpression parseInstanceCreationExpression(Token keyword) {
     ConstructorName constructorName = parseConstructorName();
     ArgumentList argumentList = _parseArgumentListChecked();
@@ -3722,15 +3505,13 @@
         keyword, constructorName, argumentList);
   }
 
-  /**
-   * Parse a label. Return the label that was parsed.
-   *
-   * This method assumes that the current token matches an identifier and that
-   * the following token matches `TokenType.COLON`.
-   *
-   *     label ::=
-   *         identifier ':'
-   */
+  /// Parse a label. Return the label that was parsed.
+  ///
+  /// This method assumes that the current token matches an identifier and that
+  /// the following token matches `TokenType.COLON`.
+  ///
+  ///     label ::=
+  ///         identifier ':'
   Label parseLabel({bool isDeclaration: false}) {
     SimpleIdentifier label =
         _parseSimpleIdentifierUnchecked(isDeclaration: isDeclaration);
@@ -3738,16 +3519,14 @@
     return astFactory.label(label, colon);
   }
 
-  /**
-   * Parse a library directive. The [commentAndMetadata] is the metadata to be
-   * associated with the directive. Return the library directive that was
-   * parsed.
-   *
-   * This method assumes that the current token matches `Keyword.LIBRARY`.
-   *
-   *     libraryDirective ::=
-   *         metadata 'library' identifier ';'
-   */
+  /// Parse a library directive. The [commentAndMetadata] is the metadata to be
+  /// associated with the directive. Return the library directive that was
+  /// parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.LIBRARY`.
+  ///
+  ///     libraryDirective ::=
+  ///         metadata 'library' identifier ';'
   LibraryDirective parseLibraryDirective(
       CommentAndMetadata commentAndMetadata) {
     Token keyword = getAndAdvance();
@@ -3758,12 +3537,10 @@
         commentAndMetadata.metadata, keyword, libraryName, semicolon);
   }
 
-  /**
-   * Parse a library identifier. Return the library identifier that was parsed.
-   *
-   *     libraryIdentifier ::=
-   *         identifier ('.' identifier)*
-   */
+  /// Parse a library identifier. Return the library identifier that was parsed.
+  ///
+  ///     libraryIdentifier ::=
+  ///         identifier ('.' identifier)*
   LibraryIdentifier parseLibraryIdentifier() {
     List<SimpleIdentifier> components = <SimpleIdentifier>[];
     components.add(parseSimpleIdentifier());
@@ -3773,18 +3550,16 @@
     return astFactory.libraryIdentifier(components);
   }
 
-  /**
-   * Parse a list literal. The [modifier] is the 'const' modifier appearing
-   * before the literal, or `null` if there is no modifier. The [typeArguments]
-   * is the type arguments appearing before the literal, or `null` if there are
-   * no type arguments. Return the list literal that was parsed.
-   *
-   * This method assumes that the current token matches either
-   * `TokenType.OPEN_SQUARE_BRACKET` or `TokenType.INDEX`.
-   *
-   *     listLiteral ::=
-   *         'const'? typeArguments? '[' (expressionList ','?)? ']'
-   */
+  /// Parse a list literal. The [modifier] is the 'const' modifier appearing
+  /// before the literal, or `null` if there is no modifier. The [typeArguments]
+  /// is the type arguments appearing before the literal, or `null` if there are
+  /// no type arguments. Return the list literal that was parsed.
+  ///
+  /// This method assumes that the current token matches either
+  /// `TokenType.OPEN_SQUARE_BRACKET` or `TokenType.INDEX`.
+  ///
+  ///     listLiteral ::=
+  ///         'const'? typeArguments? '[' (expressionList ','?)? ']'
   ListLiteral parseListLiteral(Token modifier, TypeArgumentList typeArguments) {
     if (_matches(TokenType.INDEX)) {
       _splitIndex();
@@ -3815,15 +3590,13 @@
     }
   }
 
-  /**
-   * Parse a list or map literal. The [modifier] is the 'const' modifier
-   * appearing before the literal, or `null` if there is no modifier. Return the
-   * list or map literal that was parsed.
-   *
-   *     listOrMapLiteral ::=
-   *         listLiteral
-   *       | mapLiteral
-   */
+  /// Parse a list or map literal. The [modifier] is the 'const' modifier
+  /// appearing before the literal, or `null` if there is no modifier. Return
+  /// the list or map literal that was parsed.
+  ///
+  ///     listOrMapLiteral ::=
+  ///         listLiteral
+  ///       | mapLiteral
   TypedLiteral parseListOrMapLiteral(Token modifier) {
     TypeArgumentList typeArguments = _parseOptionalTypeArguments();
     if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
@@ -3841,13 +3614,11 @@
         _createSyntheticToken(TokenType.CLOSE_SQUARE_BRACKET));
   }
 
-  /**
-   * Parse a logical and expression. Return the logical and expression that was
-   * parsed.
-   *
-   *     logicalAndExpression ::=
-   *         equalityExpression ('&&' equalityExpression)*
-   */
+  /// Parse a logical and expression. Return the logical and expression that was
+  /// parsed.
+  ///
+  ///     logicalAndExpression ::=
+  ///         equalityExpression ('&&' equalityExpression)*
   Expression parseLogicalAndExpression() {
     Expression expression = parseEqualityExpression();
     while (_currentToken.type == TokenType.AMPERSAND_AMPERSAND) {
@@ -3857,13 +3628,11 @@
     return expression;
   }
 
-  /**
-   * Parse a logical or expression. Return the logical or expression that was
-   * parsed.
-   *
-   *     logicalOrExpression ::=
-   *         logicalAndExpression ('||' logicalAndExpression)*
-   */
+  /// Parse a logical or expression. Return the logical or expression that was
+  /// parsed.
+  ///
+  ///     logicalOrExpression ::=
+  ///         logicalAndExpression ('||' logicalAndExpression)*
   Expression parseLogicalOrExpression() {
     Expression expression = parseLogicalAndExpression();
     while (_currentToken.type == TokenType.BAR_BAR) {
@@ -3873,18 +3642,16 @@
     return expression;
   }
 
-  /**
-   * Parse a map literal. The [modifier] is the 'const' modifier appearing
-   * before the literal, or `null` if there is no modifier. The [typeArguments]
-   * is the type arguments that were declared, or `null` if there are no type
-   * arguments. Return the map literal that was parsed.
-   *
-   * This method assumes that the current token matches
-   * `TokenType.OPEN_CURLY_BRACKET`.
-   *
-   *     mapLiteral ::=
-   *         'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}'
-   */
+  /// Parse a map literal. The [modifier] is the 'const' modifier appearing
+  /// before the literal, or `null` if there is no modifier. The [typeArguments]
+  /// is the type arguments that were declared, or `null` if there are no type
+  /// arguments. Return the map literal that was parsed.
+  ///
+  /// This method assumes that the current token matches
+  /// `TokenType.OPEN_CURLY_BRACKET`.
+  ///
+  ///     mapLiteral ::=
+  ///         'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}'
   MapLiteral parseMapLiteral(Token modifier, TypeArgumentList typeArguments) {
     Token leftBracket = getAndAdvance();
     if (_matches(TokenType.CLOSE_CURLY_BRACKET)) {
@@ -3910,12 +3677,10 @@
     }
   }
 
-  /**
-   * Parse a map literal entry. Return the map literal entry that was parsed.
-   *
-   *     mapLiteralEntry ::=
-   *         expression ':' expression
-   */
+  /// Parse a map literal entry. Return the map literal entry that was parsed.
+  ///
+  ///     mapLiteralEntry ::=
+  ///         expression ':' expression
   MapLiteralEntry parseMapLiteralEntry() {
     Expression key = parseExpression2();
     Token separator = _expect(TokenType.COLON);
@@ -3923,17 +3688,15 @@
     return astFactory.mapLiteralEntry(key, separator, value);
   }
 
-  /**
-   * Parse the modifiers preceding a declaration. This method allows the
-   * modifiers to appear in any order but does generate errors for duplicated
-   * modifiers. Checks for other problems, such as having the modifiers appear
-   * in the wrong order or specifying both 'const' and 'final', are reported in
-   * one of the methods whose name is prefixed with `validateModifiersFor`.
-   * Return the modifiers that were parsed.
-   *
-   *     modifiers ::=
-   *         ('abstract' | 'const' | 'external' | 'factory' | 'final' | 'static' | 'var')*
-   */
+  /// Parse the modifiers preceding a declaration. This method allows the
+  /// modifiers to appear in any order but does generate errors for duplicated
+  /// modifiers. Checks for other problems, such as having the modifiers appear
+  /// in the wrong order or specifying both 'const' and 'final', are reported in
+  /// one of the methods whose name is prefixed with `validateModifiersFor`.
+  /// Return the modifiers that were parsed.
+  ///
+  ///     modifiers ::=
+  ///         ('abstract' | 'const' | 'external' | 'factory' | 'final' | 'static' | 'var')*
   Modifiers parseModifiers() {
     Modifiers modifiers = new Modifiers();
     bool progress = true;
@@ -4016,14 +3779,12 @@
     return modifiers;
   }
 
-  /**
-   * Parse a multiplicative expression. Return the multiplicative expression
-   * that was parsed.
-   *
-   *     multiplicativeExpression ::=
-   *         unaryExpression (multiplicativeOperator unaryExpression)*
-   *       | 'super' (multiplicativeOperator unaryExpression)+
-   */
+  /// Parse a multiplicative expression. Return the multiplicative expression
+  /// that was parsed.
+  ///
+  ///     multiplicativeExpression ::=
+  ///         unaryExpression (multiplicativeOperator unaryExpression)*
+  ///       | 'super' (multiplicativeOperator unaryExpression)+
   Expression parseMultiplicativeExpression() {
     Expression expression;
     if (_currentToken.keyword == Keyword.SUPER &&
@@ -4039,37 +3800,33 @@
     return expression;
   }
 
-  /**
-   * Parse a new expression. Return the new expression that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.NEW`.
-   *
-   *     newExpression ::=
-   *         instanceCreationExpression
-   */
+  /// Parse a new expression. Return the new expression that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.NEW`.
+  ///
+  ///     newExpression ::=
+  ///         instanceCreationExpression
   InstanceCreationExpression parseNewExpression() =>
       parseInstanceCreationExpression(getAndAdvance());
 
-  /**
-   * Parse a non-labeled statement. Return the non-labeled statement that was
-   * parsed.
-   *
-   *     nonLabeledStatement ::=
-   *         block
-   *       | assertStatement
-   *       | breakStatement
-   *       | continueStatement
-   *       | doStatement
-   *       | forStatement
-   *       | ifStatement
-   *       | returnStatement
-   *       | switchStatement
-   *       | tryStatement
-   *       | whileStatement
-   *       | variableDeclarationList ';'
-   *       | expressionStatement
-   *       | functionSignature functionBody
-   */
+  /// Parse a non-labeled statement. Return the non-labeled statement that was
+  /// parsed.
+  ///
+  ///     nonLabeledStatement ::=
+  ///         block
+  ///       | assertStatement
+  ///       | breakStatement
+  ///       | continueStatement
+  ///       | doStatement
+  ///       | forStatement
+  ///       | ifStatement
+  ///       | returnStatement
+  ///       | switchStatement
+  ///       | tryStatement
+  ///       | whileStatement
+  ///       | variableDeclarationList ';'
+  ///       | expressionStatement
+  ///       | functionSignature functionBody
   Statement parseNonLabeledStatement() {
     // TODO(brianwilkerson) Pass the comment and metadata on where appropriate.
     CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
@@ -4269,25 +4026,23 @@
     }
   }
 
-  /**
-   * Parse a normal formal parameter. Return the normal formal parameter that
-   * was parsed.
-   *
-   *     normalFormalParameter ::=
-   *         functionSignature
-   *       | fieldFormalParameter
-   *       | simpleFormalParameter
-   *
-   *     functionSignature:
-   *         metadata returnType? identifier typeParameters? formalParameterList
-   *
-   *     fieldFormalParameter ::=
-   *         metadata finalConstVarOrType? 'this' '.' identifier
-   *
-   *     simpleFormalParameter ::=
-   *         declaredIdentifier
-   *       | metadata identifier
-   */
+  /// Parse a normal formal parameter. Return the normal formal parameter that
+  /// was parsed.
+  ///
+  ///     normalFormalParameter ::=
+  ///         functionSignature
+  ///       | fieldFormalParameter
+  ///       | simpleFormalParameter
+  ///
+  ///     functionSignature:
+  ///         metadata returnType? identifier typeParameters? formalParameterList
+  ///
+  ///     fieldFormalParameter ::=
+  ///         metadata finalConstVarOrType? 'this' '.' identifier
+  ///
+  ///     simpleFormalParameter ::=
+  ///         declaredIdentifier
+  ///       | metadata identifier
   NormalFormalParameter parseNormalFormalParameter(
       {bool inFunctionType: false}) {
     Token covariantKeyword;
@@ -4387,19 +4142,17 @@
             astFactory.simpleIdentifier(identifier.token, isDeclaration: true));
   }
 
-  /**
-   * Parse an operator declaration. The [commentAndMetadata] is the
-   * documentation comment and metadata to be associated with the declaration.
-   * The [externalKeyword] is the 'external' token. The [returnType] is the
-   * return type that has already been parsed, or `null` if there was no return
-   * type. Return the operator declaration that was parsed.
-   *
-   *     operatorDeclaration ::=
-   *         operatorSignature (';' | functionBody)
-   *
-   *     operatorSignature ::=
-   *         'external'? returnType? 'operator' operator formalParameterList
-   */
+  /// Parse an operator declaration. The [commentAndMetadata] is the
+  /// documentation comment and metadata to be associated with the declaration.
+  /// The [externalKeyword] is the 'external' token. The [returnType] is the
+  /// return type that has already been parsed, or `null` if there was no return
+  /// type. Return the operator declaration that was parsed.
+  ///
+  ///     operatorDeclaration ::=
+  ///         operatorSignature (';' | functionBody)
+  ///
+  ///     operatorSignature ::=
+  ///         'external'? returnType? 'operator' operator formalParameterList
   MethodDeclaration parseOperator(CommentAndMetadata commentAndMetadata,
       Token externalKeyword, TypeName returnType) {
     Token operatorKeyword;
@@ -4414,19 +4167,17 @@
         commentAndMetadata, externalKeyword, returnType, operatorKeyword);
   }
 
-  /**
-   * Parse a part or part-of directive. The [commentAndMetadata] is the metadata
-   * to be associated with the directive. Return the part or part-of directive
-   * that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.PART`.
-   *
-   *     partDirective ::=
-   *         metadata 'part' stringLiteral ';'
-   *
-   *     partOfDirective ::=
-   *         metadata 'part' 'of' identifier ';'
-   */
+  /// Parse a part or part-of directive. The [commentAndMetadata] is the
+  /// metadata to be associated with the directive. Return the part or part-of
+  /// directive that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.PART`.
+  ///
+  ///     partDirective ::=
+  ///         metadata 'part' stringLiteral ';'
+  ///
+  ///     partOfDirective ::=
+  ///         metadata 'part' 'of' identifier ';'
   Directive parsePartOrPartOfDirective(CommentAndMetadata commentAndMetadata) {
     if (_tokenMatchesKeyword(_peek(), Keyword.OF)) {
       return _parsePartOfDirective(commentAndMetadata);
@@ -4434,17 +4185,15 @@
     return _parsePartDirective(commentAndMetadata);
   }
 
-  /**
-   * Parse a postfix expression. Return the postfix expression that was parsed.
-   *
-   *     postfixExpression ::=
-   *         assignableExpression postfixOperator
-   *       | primary selector*
-   *
-   *     selector ::=
-   *         assignableSelector
-   *       | argumentPart
-   */
+  /// Parse a postfix expression. Return the postfix expression that was parsed.
+  ///
+  ///     postfixExpression ::=
+  ///         assignableExpression postfixOperator
+  ///       | primary selector*
+  ///
+  ///     selector ::=
+  ///         assignableSelector
+  ///       | argumentPart
   Expression parsePostfixExpression() {
     Expression operand = parseAssignableExpression(true);
     TokenType type = _currentToken.type;
@@ -4499,40 +4248,36 @@
     return astFactory.postfixExpression(operand, operator);
   }
 
-  /**
-   * Parse a prefixed identifier. Return the prefixed identifier that was
-   * parsed.
-   *
-   *     prefixedIdentifier ::=
-   *         identifier ('.' identifier)?
-   */
+  /// Parse a prefixed identifier. Return the prefixed identifier that was
+  /// parsed.
+  ///
+  ///     prefixedIdentifier ::=
+  ///         identifier ('.' identifier)?
   Identifier parsePrefixedIdentifier() {
     return _parsePrefixedIdentifierAfterIdentifier(parseSimpleIdentifier());
   }
 
-  /**
-   * Parse a primary expression. Return the primary expression that was parsed.
-   *
-   *     primary ::=
-   *         thisExpression
-   *       | 'super' unconditionalAssignableSelector
-   *       | functionExpression
-   *       | literal
-   *       | identifier
-   *       | newExpression
-   *       | constObjectExpression
-   *       | '(' expression ')'
-   *       | argumentDefinitionTest
-   *
-   *     literal ::=
-   *         nullLiteral
-   *       | booleanLiteral
-   *       | numericLiteral
-   *       | stringLiteral
-   *       | symbolLiteral
-   *       | mapLiteral
-   *       | listLiteral
-   */
+  /// Parse a primary expression. Return the primary expression that was parsed.
+  ///
+  ///     primary ::=
+  ///         thisExpression
+  ///       | 'super' unconditionalAssignableSelector
+  ///       | functionExpression
+  ///       | literal
+  ///       | identifier
+  ///       | newExpression
+  ///       | constObjectExpression
+  ///       | '(' expression ')'
+  ///       | argumentDefinitionTest
+  ///
+  ///     literal ::=
+  ///         nullLiteral
+  ///       | booleanLiteral
+  ///       | numericLiteral
+  ///       | stringLiteral
+  ///       | symbolLiteral
+  ///       | mapLiteral
+  ///       | listLiteral
   Expression parsePrimaryExpression() {
     if (_matchesIdentifier()) {
       // TODO(brianwilkerson) The code below was an attempt to recover from an
@@ -4646,16 +4391,14 @@
     }
   }
 
-  /**
-   * Parse a redirecting constructor invocation. The flag [hasPeriod] should be
-   * `true` if the `this` is followed by a period. Return the redirecting
-   * constructor invocation that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.THIS`.
-   *
-   *     redirectingConstructorInvocation ::=
-   *         'this' ('.' identifier)? arguments
-   */
+  /// Parse a redirecting constructor invocation. The flag [hasPeriod] should be
+  /// `true` if the `this` is followed by a period. Return the redirecting
+  /// constructor invocation that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.THIS`.
+  ///
+  ///     redirectingConstructorInvocation ::=
+  ///         'this' ('.' identifier)? arguments
   RedirectingConstructorInvocation parseRedirectingConstructorInvocation(
       bool hasPeriod) {
     Token keyword = getAndAdvance();
@@ -4676,14 +4419,12 @@
         keyword, period, constructorName, argumentList);
   }
 
-  /**
-   * Parse a relational expression. Return the relational expression that was
-   * parsed.
-   *
-   *     relationalExpression ::=
-   *         bitwiseOrExpression ('is' '!'? type | 'as' type | relationalOperator bitwiseOrExpression)?
-   *       | 'super' relationalOperator bitwiseOrExpression
-   */
+  /// Parse a relational expression. Return the relational expression that was
+  /// parsed.
+  ///
+  ///     relationalExpression ::=
+  ///         bitwiseOrExpression ('is' '!'? type | 'as' type | relationalOperator bitwiseOrExpression)?
+  ///       | 'super' relationalOperator bitwiseOrExpression
   Expression parseRelationalExpression() {
     if (_currentToken.keyword == Keyword.SUPER &&
         _currentToken.next.type.isRelationalOperator) {
@@ -4714,25 +4455,21 @@
     return expression;
   }
 
-  /**
-   * Parse a rethrow expression. Return the rethrow expression that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.RETHROW`.
-   *
-   *     rethrowExpression ::=
-   *         'rethrow'
-   */
+  /// Parse a rethrow expression. Return the rethrow expression that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.RETHROW`.
+  ///
+  ///     rethrowExpression ::=
+  ///         'rethrow'
   Expression parseRethrowExpression() =>
       astFactory.rethrowExpression(getAndAdvance());
 
-  /**
-   * Parse a return statement. Return the return statement that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.RETURN`.
-   *
-   *     returnStatement ::=
-   *         'return' expression? ';'
-   */
+  /// Parse a return statement. Return the return statement that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.RETURN`.
+  ///
+  ///     returnStatement ::=
+  ///         'return' expression? ';'
   Statement parseReturnStatement() {
     Token returnKeyword = getAndAdvance();
     if (_matches(TokenType.SEMICOLON)) {
@@ -4743,22 +4480,20 @@
     return astFactory.returnStatement(returnKeyword, expression, semicolon);
   }
 
-  /**
-   * Parse a setter. The [commentAndMetadata] is the documentation comment and
-   * metadata to be associated with the declaration. The [externalKeyword] is
-   * the 'external' token. The [staticKeyword] is the static keyword, or `null`
-   * if the setter is not static. The [returnType] is the return type that has
-   * already been parsed, or `null` if there was no return type. Return the
-   * setter that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.SET`.
-   *
-   *     setter ::=
-   *         setterSignature functionBody?
-   *
-   *     setterSignature ::=
-   *         'external'? 'static'? returnType? 'set' identifier formalParameterList
-   */
+  /// Parse a setter. The [commentAndMetadata] is the documentation comment and
+  /// metadata to be associated with the declaration. The [externalKeyword] is
+  /// the 'external' token. The [staticKeyword] is the static keyword, or `null`
+  /// if the setter is not static. The [returnType] is the return type that has
+  /// already been parsed, or `null` if there was no return type. Return the
+  /// setter that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.SET`.
+  ///
+  ///     setter ::=
+  ///         setterSignature functionBody?
+  ///
+  ///     setterSignature ::=
+  ///         'external'? 'static'? returnType? 'set' identifier formalParameterList
   MethodDeclaration parseSetter(CommentAndMetadata commentAndMetadata,
       Token externalKeyword, Token staticKeyword, TypeAnnotation returnType) {
     Token propertyKeyword = getAndAdvance();
@@ -4786,13 +4521,11 @@
         body);
   }
 
-  /**
-   * Parse a shift expression. Return the shift expression that was parsed.
-   *
-   *     shiftExpression ::=
-   *         additiveExpression (shiftOperator additiveExpression)*
-   *       | 'super' (shiftOperator additiveExpression)+
-   */
+  /// Parse a shift expression. Return the shift expression that was parsed.
+  ///
+  ///     shiftExpression ::=
+  ///         additiveExpression (shiftOperator additiveExpression)*
+  ///       | 'super' (shiftOperator additiveExpression)+
   Expression parseShiftExpression() {
     Expression expression;
     if (_currentToken.keyword == Keyword.SUPER &&
@@ -4808,12 +4541,10 @@
     return expression;
   }
 
-  /**
-   * Parse a simple identifier. Return the simple identifier that was parsed.
-   *
-   *     identifier ::=
-   *         IDENTIFIER
-   */
+  /// Parse a simple identifier. Return the simple identifier that was parsed.
+  ///
+  ///     identifier ::=
+  ///         IDENTIFIER
   SimpleIdentifier parseSimpleIdentifier(
       {bool allowKeyword: false, bool isDeclaration: false}) {
     if (_matchesIdentifier() ||
@@ -4824,22 +4555,18 @@
     return createSyntheticIdentifier(isDeclaration: isDeclaration);
   }
 
-  /**
-   * Parse a statement, starting with the given [token]. Return the statement
-   * that was parsed, or `null` if the tokens do not represent a recognizable
-   * statement.
-   */
+  /// Parse a statement, starting with the given [token]. Return the statement
+  /// that was parsed, or `null` if the tokens do not represent a recognizable
+  /// statement.
   Statement parseStatement(Token token) {
     _currentToken = token;
     return parseStatement2();
   }
 
-  /**
-   * Parse a statement. Return the statement that was parsed.
-   *
-   *     statement ::=
-   *         label* nonLabeledStatement
-   */
+  /// Parse a statement. Return the statement that was parsed.
+  ///
+  ///     statement ::=
+  ///         label* nonLabeledStatement
   Statement parseStatement2() {
     if (_treeDepth > _MAX_TREE_DEPTH) {
       throw new _TooDeepTreeError();
@@ -4866,23 +4593,19 @@
     }
   }
 
-  /**
-   * Parse a sequence of statements, starting with the given [token]. Return the
-   * statements that were parsed, or `null` if the tokens do not represent a
-   * recognizable sequence of statements.
-   */
+  /// Parse a sequence of statements, starting with the given [token]. Return
+  /// the statements that were parsed, or `null` if the tokens do not represent
+  /// a recognizable sequence of statements.
   List<Statement> parseStatements(Token token) {
     _currentToken = token;
     return _parseStatementList();
   }
 
-  /**
-   * Parse a string literal. Return the string literal that was parsed.
-   *
-   *     stringLiteral ::=
-   *         MULTI_LINE_STRING+
-   *       | SINGLE_LINE_STRING+
-   */
+  /// Parse a string literal. Return the string literal that was parsed.
+  ///
+  ///     stringLiteral ::=
+  ///         MULTI_LINE_STRING+
+  ///       | SINGLE_LINE_STRING+
   StringLiteral parseStringLiteral() {
     if (_matches(TokenType.STRING)) {
       return _parseStringLiteralUnchecked();
@@ -4891,15 +4614,13 @@
     return createSyntheticStringLiteral();
   }
 
-  /**
-   * Parse a super constructor invocation. Return the super constructor
-   * invocation that was parsed.
-   *
-   * This method assumes that the current token matches [Keyword.SUPER].
-   *
-   *     superConstructorInvocation ::=
-   *         'super' ('.' identifier)? arguments
-   */
+  /// Parse a super constructor invocation. Return the super constructor
+  /// invocation that was parsed.
+  ///
+  /// This method assumes that the current token matches [Keyword.SUPER].
+  ///
+  ///     superConstructorInvocation ::=
+  ///         'super' ('.' identifier)? arguments
   SuperConstructorInvocation parseSuperConstructorInvocation() {
     Token keyword = getAndAdvance();
     Token period = null;
@@ -4913,18 +4634,16 @@
         keyword, period, constructorName, argumentList);
   }
 
-  /**
-   * Parse a switch statement. Return the switch statement that was parsed.
-   *
-   *     switchStatement ::=
-   *         'switch' '(' expression ')' '{' switchCase* defaultCase? '}'
-   *
-   *     switchCase ::=
-   *         label* ('case' expression ':') statements
-   *
-   *     defaultCase ::=
-   *         label* 'default' ':' statements
-   */
+  /// Parse a switch statement. Return the switch statement that was parsed.
+  ///
+  ///     switchStatement ::=
+  ///         'switch' '(' expression ')' '{' switchCase* defaultCase? '}'
+  ///
+  ///     switchCase ::=
+  ///         label* ('case' expression ':') statements
+  ///
+  ///     defaultCase ::=
+  ///         label* 'default' ':' statements
   SwitchStatement parseSwitchStatement() {
     bool wasInSwitch = _inSwitch;
     _inSwitch = true;
@@ -5005,14 +4724,12 @@
     }
   }
 
-  /**
-   * Parse a symbol literal. Return the symbol literal that was parsed.
-   *
-   * This method assumes that the current token matches [TokenType.HASH].
-   *
-   *     symbolLiteral ::=
-   *         '#' identifier ('.' identifier)*
-   */
+  /// Parse a symbol literal. Return the symbol literal that was parsed.
+  ///
+  /// This method assumes that the current token matches [TokenType.HASH].
+  ///
+  ///     symbolLiteral ::=
+  ///         '#' identifier ('.' identifier)*
   SymbolLiteral parseSymbolLiteral() {
     Token poundSign = getAndAdvance();
     List<Token> components = <Token>[];
@@ -5038,14 +4755,12 @@
     return astFactory.symbolLiteral(poundSign, components);
   }
 
-  /**
-   * Parse a throw expression. Return the throw expression that was parsed.
-   *
-   * This method assumes that the current token matches [Keyword.THROW].
-   *
-   *     throwExpression ::=
-   *         'throw' expression
-   */
+  /// Parse a throw expression. Return the throw expression that was parsed.
+  ///
+  /// This method assumes that the current token matches [Keyword.THROW].
+  ///
+  ///     throwExpression ::=
+  ///         'throw' expression
   Expression parseThrowExpression() {
     Token keyword = getAndAdvance();
     TokenType type = _currentToken.type;
@@ -5058,14 +4773,12 @@
     return astFactory.throwExpression(keyword, expression);
   }
 
-  /**
-   * Parse a throw expression. Return the throw expression that was parsed.
-   *
-   * This method assumes that the current token matches [Keyword.THROW].
-   *
-   *     throwExpressionWithoutCascade ::=
-   *         'throw' expressionWithoutCascade
-   */
+  /// Parse a throw expression. Return the throw expression that was parsed.
+  ///
+  /// This method assumes that the current token matches [Keyword.THROW].
+  ///
+  ///     throwExpressionWithoutCascade ::=
+  ///         'throw' expressionWithoutCascade
   Expression parseThrowExpressionWithoutCascade() {
     Token keyword = getAndAdvance();
     TokenType type = _currentToken.type;
@@ -5078,24 +4791,22 @@
     return astFactory.throwExpression(keyword, expression);
   }
 
-  /**
-   * Parse a try statement. Return the try statement that was parsed.
-   *
-   * This method assumes that the current token matches [Keyword.TRY].
-   *
-   *     tryStatement ::=
-   *         'try' block (onPart+ finallyPart? | finallyPart)
-   *
-   *     onPart ::=
-   *         catchPart block
-   *       | 'on' type catchPart? block
-   *
-   *     catchPart ::=
-   *         'catch' '(' identifier (',' identifier)? ')'
-   *
-   *     finallyPart ::=
-   *         'finally' block
-   */
+  /// Parse a try statement. Return the try statement that was parsed.
+  ///
+  /// This method assumes that the current token matches [Keyword.TRY].
+  ///
+  ///     tryStatement ::=
+  ///         'try' block (onPart+ finallyPart? | finallyPart)
+  ///
+  ///     onPart ::=
+  ///         catchPart block
+  ///       | 'on' type catchPart? block
+  ///
+  ///     catchPart ::=
+  ///         'catch' '(' identifier (',' identifier)? ')'
+  ///
+  ///     finallyPart ::=
+  ///         'finally' block
   Statement parseTryStatement() {
     Token tryKeyword = getAndAdvance();
     Block body = _parseBlockChecked();
@@ -5147,25 +4858,23 @@
         tryKeyword, body, catchClauses, finallyKeyword, finallyClause);
   }
 
-  /**
-   * Parse a type alias. The [commentAndMetadata] is the metadata to be
-   * associated with the member. Return the type alias that was parsed.
-   *
-   * This method assumes that the current token matches [Keyword.TYPEDEF].
-   *
-   *     typeAlias ::=
-   *         'typedef' typeAliasBody
-   *       | genericTypeAlias
-   *
-   *     typeAliasBody ::=
-   *         functionTypeAlias
-   *
-   *     functionTypeAlias ::=
-   *         functionPrefix typeParameterList? formalParameterList ';'
-   *
-   *     functionPrefix ::=
-   *         returnType? name
-   */
+  /// Parse a type alias. The [commentAndMetadata] is the metadata to be
+  /// associated with the member. Return the type alias that was parsed.
+  ///
+  /// This method assumes that the current token matches [Keyword.TYPEDEF].
+  ///
+  ///     typeAlias ::=
+  ///         'typedef' typeAliasBody
+  ///       | genericTypeAlias
+  ///
+  ///     typeAliasBody ::=
+  ///         functionTypeAlias
+  ///
+  ///     functionTypeAlias ::=
+  ///         functionPrefix typeParameterList? formalParameterList ';'
+  ///
+  ///     functionPrefix ::=
+  ///         returnType? name
   TypeAlias parseTypeAlias(CommentAndMetadata commentAndMetadata) {
     Token keyword = getAndAdvance();
     if (_matchesIdentifier()) {
@@ -5186,13 +4895,11 @@
     return _parseFunctionTypeAlias(commentAndMetadata, keyword);
   }
 
-  /**
-   * Parse a type.
-   *
-   *     type ::=
-   *         typeWithoutFunction
-   *       | functionType
-   */
+  /// Parse a type.
+  ///
+  ///     type ::=
+  ///         typeWithoutFunction
+  ///       | functionType
   TypeAnnotation parseTypeAnnotation(bool inExpression) {
     TypeAnnotation type = null;
     if (_atGenericFunctionTypeAfterReturnType(_currentToken)) {
@@ -5207,18 +4914,16 @@
     return type;
   }
 
-  /**
-   * Parse a list of type arguments. Return the type argument list that was
-   * parsed.
-   *
-   * This method assumes that the current token matches `TokenType.LT`.
-   *
-   *     typeArguments ::=
-   *         '<' typeList '>'
-   *
-   *     typeList ::=
-   *         type (',' type)*
-   */
+  /// Parse a list of type arguments. Return the type argument list that was
+  /// parsed.
+  ///
+  /// This method assumes that the current token matches `TokenType.LT`.
+  ///
+  ///     typeArguments ::=
+  ///         '<' typeList '>'
+  ///
+  ///     typeList ::=
+  ///         type (',' type)*
   TypeArgumentList parseTypeArgumentList() {
     Token leftBracket = getAndAdvance();
     List<TypeAnnotation> arguments = <TypeAnnotation>[
@@ -5231,26 +4936,22 @@
     return astFactory.typeArgumentList(leftBracket, arguments, rightBracket);
   }
 
-  /**
-   * Parse a type which is not void and is not a function type. Return the type
-   * that was parsed.
-   *
-   *     typeNotVoidWithoutFunction ::=
-   *         qualified typeArguments?
-   */
+  /// Parse a type which is not void and is not a function type. Return the type
+  /// that was parsed.
+  ///
+  ///     typeNotVoidWithoutFunction ::=
+  ///         qualified typeArguments?
   // TODO(eernst): Rename this to `parseTypeNotVoidWithoutFunction`?
   // Apparently,  it was named `parseTypeName` before type arguments existed.
   TypeName parseTypeName(bool inExpression) {
     return _parseTypeName(inExpression);
   }
 
-  /**
-   * Parse a type which is not `void`.
-   *
-   *     typeNotVoid ::=
-   *         functionType
-   *       | typeNotVoidWithoutFunction
-   */
+  /// Parse a type which is not `void`.
+  ///
+  ///     typeNotVoid ::=
+  ///         functionType
+  ///       | typeNotVoidWithoutFunction
   TypeAnnotation parseTypeNotVoid(bool inExpression) {
     TypeAnnotation type = null;
     if (_atGenericFunctionTypeAfterReturnType(_currentToken)) {
@@ -5269,12 +4970,10 @@
     return type;
   }
 
-  /**
-   * Parse a type parameter. Return the type parameter that was parsed.
-   *
-   *     typeParameter ::=
-   *         metadata name ('extends' bound)?
-   */
+  /// Parse a type parameter. Return the type parameter that was parsed.
+  ///
+  ///     typeParameter ::=
+  ///         metadata name ('extends' bound)?
   TypeParameter parseTypeParameter() {
     CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
     SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
@@ -5288,15 +4987,13 @@
         commentAndMetadata.metadata, name, null, null);
   }
 
-  /**
-   * Parse a list of type parameters. Return the list of type parameters that
-   * were parsed.
-   *
-   * This method assumes that the current token matches `TokenType.LT`.
-   *
-   *     typeParameterList ::=
-   *         '<' typeParameter (',' typeParameter)* '>'
-   */
+  /// Parse a list of type parameters. Return the list of type parameters that
+  /// were parsed.
+  ///
+  /// This method assumes that the current token matches `TokenType.LT`.
+  ///
+  ///     typeParameterList ::=
+  ///         '<' typeParameter (',' typeParameter)* '>'
   TypeParameterList parseTypeParameterList() {
     Token leftBracket = getAndAdvance();
     List<TypeParameter> typeParameters = <TypeParameter>[parseTypeParameter()];
@@ -5308,13 +5005,11 @@
         leftBracket, typeParameters, rightBracket);
   }
 
-  /**
-   * Parse a type which is not a function type.
-   *
-   *     typeWithoutFunction ::=
-   *         `void`
-   *       | typeNotVoidWithoutFunction
-   */
+  /// Parse a type which is not a function type.
+  ///
+  ///     typeWithoutFunction ::=
+  ///         `void`
+  ///       | typeNotVoidWithoutFunction
   TypeAnnotation parseTypeWithoutFunction(bool inExpression) {
     if (_currentToken.keyword == Keyword.VOID) {
       return astFactory.typeName(
@@ -5324,17 +5019,15 @@
     }
   }
 
-  /**
-   * Parse a unary expression. Return the unary expression that was parsed.
-   *
-   *     unaryExpression ::=
-   *         prefixOperator unaryExpression
-   *       | awaitExpression
-   *       | postfixExpression
-   *       | unaryOperator 'super'
-   *       | '-' 'super'
-   *       | incrementOperator assignableExpression
-   */
+  /// Parse a unary expression. Return the unary expression that was parsed.
+  ///
+  ///     unaryExpression ::=
+  ///         prefixOperator unaryExpression
+  ///       | awaitExpression
+  ///       | postfixExpression
+  ///       | unaryOperator 'super'
+  ///       | '-' 'super'
+  ///       | incrementOperator assignableExpression
   Expression parseUnaryExpression() {
     TokenType type = _currentToken.type;
     if (type == TokenType.MINUS ||
@@ -5400,13 +5093,11 @@
     return parsePostfixExpression();
   }
 
-  /**
-   * Parse a variable declaration. Return the variable declaration that was
-   * parsed.
-   *
-   *     variableDeclaration ::=
-   *         identifier ('=' expression)?
-   */
+  /// Parse a variable declaration. Return the variable declaration that was
+  /// parsed.
+  ///
+  ///     variableDeclaration ::=
+  ///         identifier ('=' expression)?
   VariableDeclaration parseVariableDeclaration() {
     // TODO(paulberry): prior to the fix for bug 23204, we permitted
     // annotations before variable declarations (e.g. "String @deprecated s;").
@@ -5427,14 +5118,12 @@
     return astFactory.variableDeclaration(name, equals, initializer);
   }
 
-  /**
-   * Parse a variable declaration list. The [commentAndMetadata] is the metadata
-   * to be associated with the variable declaration list. Return the variable
-   * declaration list that was parsed.
-   *
-   *     variableDeclarationList ::=
-   *         finalConstVarOrType variableDeclaration (',' variableDeclaration)*
-   */
+  /// Parse a variable declaration list. The [commentAndMetadata] is the
+  /// metadata to be associated with the variable declaration list. Return the
+  /// variable declaration list that was parsed.
+  ///
+  ///     variableDeclarationList ::=
+  ///         finalConstVarOrType variableDeclaration (',' variableDeclaration)*
   VariableDeclarationList parseVariableDeclarationListAfterMetadata(
       CommentAndMetadata commentAndMetadata) {
     FinalConstVarOrType holder = parseFinalConstVarOrType(false);
@@ -5442,17 +5131,15 @@
         commentAndMetadata, holder.keyword, holder.type);
   }
 
-  /**
-   * Parse a variable declaration list. The [commentAndMetadata] is the metadata
-   * to be associated with the variable declaration list, or `null` if there is
-   * no attempt at parsing the comment and metadata. The [keyword] is the token
-   * representing the 'final', 'const' or 'var' keyword, or `null` if there is
-   * no keyword. The [type] is the type of the variables in the list. Return the
-   * variable declaration list that was parsed.
-   *
-   *     variableDeclarationList ::=
-   *         finalConstVarOrType variableDeclaration (',' variableDeclaration)*
-   */
+  /// Parse a variable declaration list. The [commentAndMetadata] is the
+  /// metadata to be associated with the variable declaration list, or `null`
+  /// if there is no attempt at parsing the comment and metadata. The [keyword]
+  /// is the token representing the 'final', 'const' or 'var' keyword, or
+  /// `null` if there is no keyword. The [type] is the type of the variables in
+  /// the list. Return the variable declaration list that was parsed.
+  ///
+  ///     variableDeclarationList ::=
+  ///         finalConstVarOrType variableDeclaration (',' variableDeclaration)*
   VariableDeclarationList parseVariableDeclarationListAfterType(
       CommentAndMetadata commentAndMetadata,
       Token keyword,
@@ -5472,15 +5159,13 @@
         commentAndMetadata?.metadata, keyword, type, variables);
   }
 
-  /**
-   * Parse a variable declaration statement. The [commentAndMetadata] is the
-   * metadata to be associated with the variable declaration statement, or
-   * `null` if there is no attempt at parsing the comment and metadata. Return
-   * the variable declaration statement that was parsed.
-   *
-   *     variableDeclarationStatement ::=
-   *         variableDeclarationList ';'
-   */
+  /// Parse a variable declaration statement. The [commentAndMetadata] is the
+  /// metadata to be associated with the variable declaration statement, or
+  /// `null` if there is no attempt at parsing the comment and metadata. Return
+  /// the variable declaration statement that was parsed.
+  ///
+  ///     variableDeclarationStatement ::=
+  ///         variableDeclarationList ';'
   VariableDeclarationStatement parseVariableDeclarationStatementAfterMetadata(
       CommentAndMetadata commentAndMetadata) {
     //    Token startToken = currentToken;
@@ -5496,14 +5181,12 @@
     return astFactory.variableDeclarationStatement(variableList, semicolon);
   }
 
-  /**
-   * Parse a while statement. Return the while statement that was parsed.
-   *
-   * This method assumes that the current token matches [Keyword.WHILE].
-   *
-   *     whileStatement ::=
-   *         'while' '(' expression ')' statement
-   */
+  /// Parse a while statement. Return the while statement that was parsed.
+  ///
+  /// This method assumes that the current token matches [Keyword.WHILE].
+  ///
+  ///     whileStatement ::=
+  ///         'while' '(' expression ')' statement
   Statement parseWhileStatement() {
     bool wasInLoop = _inLoop;
     _inLoop = true;
@@ -5520,14 +5203,12 @@
     }
   }
 
-  /**
-   * Parse a with clause. Return the with clause that was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.WITH`.
-   *
-   *     withClause ::=
-   *         'with' typeName (',' typeName)*
-   */
+  /// Parse a with clause. Return the with clause that was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.WITH`.
+  ///
+  ///     withClause ::=
+  ///         'with' typeName (',' typeName)*
   WithClause parseWithClause() {
     Token withKeyword = getAndAdvance();
     List<TypeName> types = <TypeName>[];
@@ -5538,14 +5219,12 @@
     return astFactory.withClause(withKeyword, types);
   }
 
-  /**
-   * Parse a yield statement. Return the yield statement that was parsed.
-   *
-   * This method assumes that the current token matches [Keyword.YIELD].
-   *
-   *     yieldStatement ::=
-   *         'yield' '*'? expression ';'
-   */
+  /// Parse a yield statement. Return the yield statement that was parsed.
+  ///
+  /// This method assumes that the current token matches [Keyword.YIELD].
+  ///
+  ///     yieldStatement ::=
+  ///         'yield' '*'? expression ';'
   YieldStatement parseYieldStatement() {
     Token yieldToken = getAndAdvance();
     Token star = null;
@@ -5557,14 +5236,12 @@
     return astFactory.yieldStatement(yieldToken, star, expression, semicolon);
   }
 
-  /**
-   * Parse a formal parameter list, starting at the [startToken], without
-   * actually creating a formal parameter list or changing the current token.
-   * Return the token following the parameter list that was parsed, or `null`
-   * if the given token is not the first token in a valid parameter list.
-   *
-   * This method must be kept in sync with [parseFormalParameterList].
-   */
+  /// Parse a formal parameter list, starting at the [startToken], without
+  /// actually creating a formal parameter list or changing the current token.
+  /// Return the token following the parameter list that was parsed, or `null`
+  /// if the given token is not the first token in a valid parameter list.
+  ///
+  /// This method must be kept in sync with [parseFormalParameterList].
   Token skipFormalParameterList(Token startToken) {
     if (!_tokenMatches(startToken, TokenType.OPEN_PAREN)) {
       return null;
@@ -5572,16 +5249,14 @@
     return (startToken as BeginToken).endToken?.next;
   }
 
-  /**
-   * Parse the portion of a generic function type after the return type,
-   * starting at the [startToken], without actually creating a generic function
-   * type or changing the current token. Return the token following the generic
-   * function type that was parsed, or `null` if the given token is not the
-   * first token in a valid generic function type.
-   *
-   * This method must be kept in sync with
-   * [parseGenericFunctionTypeAfterReturnType].
-   */
+  /// Parse the portion of a generic function type after the return type,
+  /// starting at the [startToken], without actually creating a generic function
+  /// type or changing the current token. Return the token following the generic
+  /// function type that was parsed, or `null` if the given token is not the
+  /// first token in a valid generic function type.
+  ///
+  /// This method must be kept in sync with
+  /// [parseGenericFunctionTypeAfterReturnType].
   Token skipGenericFunctionTypeAfterReturnType(Token startToken) {
     Token next = startToken.next; // Skip 'Function'
     if (_tokenMatches(next, TokenType.LT)) {
@@ -5593,17 +5268,16 @@
     return skipFormalParameterList(next);
   }
 
-  /**
-   * Parse a prefixed identifier, starting at the [startToken], without actually
-   * creating a prefixed identifier or changing the current token. Return the
-   * token following the prefixed identifier that was parsed, or `null` if the
-   * given token is not the first token in a valid prefixed identifier.
-   *
-   * This method must be kept in sync with [parsePrefixedIdentifier].
-   *
-   *     prefixedIdentifier ::=
-   *         identifier ('.' identifier)?
-   */
+  /// Parse a prefixed identifier, starting at the [startToken], without
+  /// actually creating a prefixed identifier or changing the current token.
+  /// Return the token following the prefixed identifier that was parsed, or
+  /// `null` if the given token is not the first token in a valid prefixed
+  /// identifier.
+  ///
+  /// This method must be kept in sync with [parsePrefixedIdentifier].
+  ///
+  ///     prefixedIdentifier ::=
+  ///         identifier ('.' identifier)?
   Token skipPrefixedIdentifier(Token startToken) {
     Token token = skipSimpleIdentifier(startToken);
     if (token == null) {
@@ -5625,17 +5299,15 @@
     return null;
   }
 
-  /**
-   * Parse a simple identifier, starting at the [startToken], without actually
-   * creating a simple identifier or changing the current token. Return the
-   * token following the simple identifier that was parsed, or `null` if the
-   * given token is not the first token in a valid simple identifier.
-   *
-   * This method must be kept in sync with [parseSimpleIdentifier].
-   *
-   *     identifier ::=
-   *         IDENTIFIER
-   */
+  /// Parse a simple identifier, starting at the [startToken], without actually
+  /// creating a simple identifier or changing the current token. Return the
+  /// token following the simple identifier that was parsed, or `null` if the
+  /// given token is not the first token in a valid simple identifier.
+  ///
+  /// This method must be kept in sync with [parseSimpleIdentifier].
+  ///
+  ///     identifier ::=
+  ///         IDENTIFIER
   Token skipSimpleIdentifier(Token startToken) {
     if (_tokenMatches(startToken, TokenType.IDENTIFIER) ||
         _tokenMatchesPseudoKeyword(startToken)) {
@@ -5644,18 +5316,16 @@
     return null;
   }
 
-  /**
-   * Parse a string literal, starting at the [startToken], without actually
-   * creating a string literal or changing the current token. Return the token
-   * following the string literal that was parsed, or `null` if the given token
-   * is not the first token in a valid string literal.
-   *
-   * This method must be kept in sync with [parseStringLiteral].
-   *
-   *     stringLiteral ::=
-   *         MULTI_LINE_STRING+
-   *       | SINGLE_LINE_STRING+
-   */
+  /// Parse a string literal, starting at the [startToken], without actually
+  /// creating a string literal or changing the current token. Return the token
+  /// following the string literal that was parsed, or `null` if the given token
+  /// is not the first token in a valid string literal.
+  ///
+  /// This method must be kept in sync with [parseStringLiteral].
+  ///
+  ///     stringLiteral ::=
+  ///         MULTI_LINE_STRING+
+  ///       | SINGLE_LINE_STRING+
   Token skipStringLiteral(Token startToken) {
     Token token = startToken;
     while (token != null && _tokenMatches(token, TokenType.STRING)) {
@@ -5672,14 +5342,12 @@
     return token;
   }
 
-  /**
-   * Parse a type annotation, starting at the [startToken], without actually
-   * creating a type annotation or changing the current token. Return the token
-   * following the type annotation that was parsed, or `null` if the given token
-   * is not the first token in a valid type annotation.
-   *
-   * This method must be kept in sync with [parseTypeAnnotation].
-   */
+  /// Parse a type annotation, starting at the [startToken], without actually
+  /// creating a type annotation or changing the current token. Return the token
+  /// following the type annotation that was parsed, or `null` if the given
+  /// token is not the first token in a valid type annotation.
+  ///
+  /// This method must be kept in sync with [parseTypeAnnotation].
   Token skipTypeAnnotation(Token startToken) {
     Token next = null;
     if (_atGenericFunctionTypeAfterReturnType(startToken)) {
@@ -5694,21 +5362,19 @@
     return next;
   }
 
-  /**
-   * Parse a list of type arguments, starting at the [startToken], without
-   * actually creating a type argument list or changing the current token.
-   * Return the token following the type argument list that was parsed, or
-   * `null` if the given token is not the first token in a valid type argument
-   * list.
-   *
-   * This method must be kept in sync with [parseTypeArgumentList].
-   *
-   *     typeArguments ::=
-   *         '<' typeList '>'
-   *
-   *     typeList ::=
-   *         type (',' type)*
-   */
+  /// Parse a list of type arguments, starting at the [startToken], without
+  /// actually creating a type argument list or changing the current token.
+  /// Return the token following the type argument list that was parsed, or
+  /// `null` if the given token is not the first token in a valid type argument
+  /// list.
+  ///
+  /// This method must be kept in sync with [parseTypeArgumentList].
+  ///
+  ///     typeArguments ::=
+  ///         '<' typeList '>'
+  ///
+  ///     typeList ::=
+  ///         type (',' type)*
   Token skipTypeArgumentList(Token startToken) {
     Token token = startToken;
     if (!_tokenMatches(token, TokenType.LT)) {
@@ -5740,17 +5406,15 @@
     return null;
   }
 
-  /**
-   * Parse a type name, starting at the [startToken], without actually creating
-   * a type name or changing the current token. Return the token following the
-   * type name that was parsed, or `null` if the given token is not the first
-   * token in a valid type name.
-   *
-   * This method must be kept in sync with [parseTypeName].
-   *
-   *     type ::=
-   *         qualified typeArguments?
-   */
+  /// Parse a type name, starting at the [startToken], without actually creating
+  /// a type name or changing the current token. Return the token following the
+  /// type name that was parsed, or `null` if the given token is not the first
+  /// token in a valid type name.
+  ///
+  /// This method must be kept in sync with [parseTypeName].
+  ///
+  ///     type ::=
+  ///         qualified typeArguments?
   Token skipTypeName(Token startToken) {
     Token token = skipPrefixedIdentifier(startToken);
     if (token == null) {
@@ -5762,14 +5426,13 @@
     return token;
   }
 
-  /**
-   * Parse a type parameter list, starting at the [startToken], without actually
-   * creating a type parameter list or changing the current token. Return the
-   * token following the type parameter list that was parsed, or `null` if the
-   * given token is not the first token in a valid type parameter list.
-   *
-   * This method must be kept in sync with [parseTypeParameterList].
-   */
+  /// Parse a type parameter list, starting at the [startToken], without
+  /// actually creating a type parameter list or changing the current token.
+  /// Return the token following the type parameter list that was parsed, or
+  /// `null` if the given token is not the first token in a valid type parameter
+  /// list.
+  ///
+  /// This method must be kept in sync with [parseTypeParameterList].
   Token skipTypeParameterList(Token startToken) {
     if (!_tokenMatches(startToken, TokenType.LT)) {
       return null;
@@ -5792,14 +5455,12 @@
     return null;
   }
 
-  /**
-   * Parse a typeWithoutFunction, starting at the [startToken], without actually
-   * creating a TypeAnnotation or changing the current token. Return the token
-   * following the typeWithoutFunction that was parsed, or `null` if the given
-   * token is not the first token in a valid typeWithoutFunction.
-   *
-   * This method must be kept in sync with [parseTypeWithoutFunction].
-   */
+  /// Parse a typeWithoutFunction, starting at the [startToken], without
+  /// actually creating a TypeAnnotation or changing the current token. Return
+  /// the token following the typeWithoutFunction that was parsed, or `null` if
+  /// the given token is not the first token in a valid typeWithoutFunction.
+  ///
+  /// This method must be kept in sync with [parseTypeWithoutFunction].
   Token skipTypeWithoutFunction(Token startToken) {
     if (startToken.keyword == Keyword.VOID) {
       return startToken.next;
@@ -5808,20 +5469,16 @@
     }
   }
 
-  /**
-   * Advance to the next token in the token stream.
-   */
+  /// Advance to the next token in the token stream.
   void _advance() {
     _currentToken = _currentToken.next;
   }
 
-  /**
-   * Append the character equivalent of the given [codePoint] to the given
-   * [builder]. Use the [startIndex] and [endIndex] to report an error, and
-   * don't append anything to the builder, if the code point is invalid. The
-   * [escapeSequence] is the escape sequence that was parsed to produce the
-   * code point (used for error reporting).
-   */
+  /// Append the character equivalent of the given [codePoint] to the given
+  /// [builder]. Use the [startIndex] and [endIndex] to report an error, and
+  /// don't append anything to the builder, if the code point is invalid. The
+  /// [escapeSequence] is the escape sequence that was parsed to produce the
+  /// code point (used for error reporting).
   void _appendCodePoint(StringBuffer buffer, String source, int codePoint,
       int startIndex, int endIndex) {
     if (codePoint < 0 || codePoint > Character.MAX_CODE_POINT) {
@@ -5837,10 +5494,8 @@
     }
   }
 
-  /**
-   * Return `true` if we are positioned at the keyword 'Function' in a generic
-   * function type alias.
-   */
+  /// Return `true` if we are positioned at the keyword 'Function' in a generic
+  /// function type alias.
   bool _atGenericFunctionTypeAfterReturnType(Token startToken) {
     if (_tokenMatchesKeyword(startToken, Keyword.FUNCTION)) {
       Token next = startToken.next;
@@ -5853,11 +5508,9 @@
     return false;
   }
 
-  /**
-   * Convert the given [method] declaration into the nearest valid top-level
-   * function declaration (that is, the function declaration that most closely
-   * captures the components of the given method declaration).
-   */
+  /// Convert the given [method] declaration into the nearest valid top-level
+  /// function declaration (that is, the function declaration that most closely
+  /// captures the components of the given method declaration).
   FunctionDeclaration _convertToFunctionDeclaration(MethodDeclaration method) =>
       astFactory.functionDeclaration(
           method.documentationComment,
@@ -5869,12 +5522,10 @@
           astFactory.functionExpression(
               method.typeParameters, method.parameters, method.body));
 
-  /**
-   * Return `true` if the current token could be the start of a compilation unit
-   * member. This method is used for recovery purposes to decide when to stop
-   * skipping tokens after finding an error while parsing a compilation unit
-   * member.
-   */
+  /// Return `true` if the current token could be the start of a compilation
+  /// unit member. This method is used for recovery purposes to decide when to
+  /// stop skipping tokens after finding an error while parsing a compilation
+  /// unit member.
   bool _couldBeStartOfCompilationUnitMember() {
     Keyword keyword = _currentToken.keyword;
     Token next = _currentToken.next;
@@ -5921,23 +5572,17 @@
     return false;
   }
 
-  /**
-   * Return a synthetic token representing the given [keyword].
-   */
+  /// Return a synthetic token representing the given [keyword].
   Token _createSyntheticKeyword(Keyword keyword) =>
       _injectToken(new SyntheticKeywordToken(keyword, _currentToken.offset));
 
-  /**
-   * Return a synthetic token with the given [type].
-   */
+  /// Return a synthetic token with the given [type].
   Token _createSyntheticToken(TokenType type) =>
       _injectToken(new StringToken(type, "", _currentToken.offset));
 
-  /**
-   * Create and return a new token with the given [type]. The token will replace
-   * the first portion of the given [token], so it will have the same offset and
-   * will have any comments that might have preceeded the token.
-   */
+  /// Create and return a new token with the given [type]. The token will
+  /// replace the first portion of the given [token], so it will have the same
+  /// offset and will have any comments that might have preceeded the token.
   Token _createToken(Token token, TokenType type, {bool isBegin: false}) {
     CommentToken comments = token.precedingComments;
     if (comments == null) {
@@ -5951,23 +5596,21 @@
     return new Token(type, token.offset, comments);
   }
 
-  /**
-   * Check that the given [expression] is assignable and report an error if it
-   * isn't.
-   *
-   *     assignableExpression ::=
-   *         primary (arguments* assignableSelector)+
-   *       | 'super' unconditionalAssignableSelector
-   *       | identifier
-   *
-   *     unconditionalAssignableSelector ::=
-   *         '[' expression ']'
-   *       | '.' identifier
-   *
-   *     assignableSelector ::=
-   *         unconditionalAssignableSelector
-   *       | '?.' identifier
-   */
+  /// Check that the given [expression] is assignable and report an error if it
+  /// isn't.
+  ///
+  ///     assignableExpression ::=
+  ///         primary (arguments* assignableSelector)+
+  ///       | 'super' unconditionalAssignableSelector
+  ///       | identifier
+  ///
+  ///     unconditionalAssignableSelector ::=
+  ///         '[' expression ']'
+  ///       | '.' identifier
+  ///
+  ///     assignableSelector ::=
+  ///         unconditionalAssignableSelector
+  ///       | '?.' identifier
   void _ensureAssignable(Expression expression) {
     if (expression != null && !expression.isAssignable) {
       _reportErrorForCurrentToken(
@@ -5975,16 +5618,14 @@
     }
   }
 
-  /**
-   * If the current token has the expected type, return it after advancing to
-   * the next token. Otherwise report an error and return the current token
-   * without advancing.
-   *
-   * Note that the method [_expectGt] should be used if the argument to this
-   * method would be [TokenType.GT].
-   *
-   * The [type] is the type of token that is expected.
-   */
+  /// If the current token has the expected type, return it after advancing to
+  /// the next token. Otherwise report an error and return the current token
+  /// without advancing.
+  ///
+  /// Note that the method [_expectGt] should be used if the argument to this
+  /// method would be [TokenType.GT].
+  ///
+  /// The [type] is the type of token that is expected.
   Token _expect(TokenType type) {
     if (_matches(type)) {
       return getAndAdvance();
@@ -6006,10 +5647,9 @@
     return _createSyntheticToken(type);
   }
 
-  /**
-   * If the current token has the type [TokenType.GT], return it after advancing
-   * to the next token. Otherwise report an error and create a synthetic token.
-   */
+  /// If the current token has the type [TokenType.GT], return it after
+  /// advancing to the next token. Otherwise report an error and create a
+  /// synthetic token.
   Token _expectGt() {
     if (_matchesGt()) {
       return getAndAdvance();
@@ -6019,11 +5659,9 @@
     return _createSyntheticToken(TokenType.GT);
   }
 
-  /**
-   * If the current token is a keyword matching the given [keyword], return it
-   * after advancing to the next token. Otherwise report an error and return the
-   * current token without advancing.
-   */
+  /// If the current token is a keyword matching the given [keyword], return it
+  /// after advancing to the next token. Otherwise report an error and return
+  /// the current token without advancing.
   Token _expectKeyword(Keyword keyword) {
     if (_matchesKeyword(keyword)) {
       return getAndAdvance();
@@ -6035,11 +5673,9 @@
     return _currentToken;
   }
 
-  /**
-   * Search the given list of [ranges] for a range that contains the given
-   * [index]. Return the range that was found, or `null` if none of the ranges
-   * contain the index.
-   */
+  /// Search the given list of [ranges] for a range that contains the given
+  /// [index]. Return the range that was found, or `null` if none of the ranges
+  /// contain the index.
   List<int> _findRange(List<List<int>> ranges, int index) {
     int rangeCount = ranges.length;
     for (int i = 0; i < rangeCount; i++) {
@@ -6053,10 +5689,8 @@
     return null;
   }
 
-  /**
-   * Return a list of the ranges of characters in the given [comment] that
-   * should be treated as code blocks.
-   */
+  /// Return a list of the ranges of characters in the given [comment] that
+  /// should be treated as code blocks.
   List<List<int>> _getCodeBlockRanges(String comment) {
     List<List<int>> ranges = <List<int>>[];
     int length = comment.length;
@@ -6118,11 +5752,9 @@
     return ranges;
   }
 
-  /**
-   * Return the end token associated with the given [beginToken], or `null` if
-   * either the given token is not a begin token or it does not have an end
-   * token associated with it.
-   */
+  /// Return the end token associated with the given [beginToken], or `null` if
+  /// either the given token is not a begin token or it does not have an end
+  /// token associated with it.
   Token _getEndToken(Token beginToken) {
     if (beginToken is BeginToken) {
       return beginToken.endToken;
@@ -6130,10 +5762,8 @@
     return null;
   }
 
-  /**
-   * Inject the given [token] into the token stream immediately before the
-   * current token.
-   */
+  /// Inject the given [token] into the token stream immediately before the
+  /// current token.
   Token _injectToken(Token token) {
     Token previous = _currentToken.previous;
     token.setNext(_currentToken);
@@ -6141,9 +5771,7 @@
     return token;
   }
 
-  /**
-   * Return `true` if the given [character] is a valid hexadecimal digit.
-   */
+  /// Return `true` if the given [character] is a valid hexadecimal digit.
   bool _isHexDigit(int character) =>
       (0x30 <= character && character <= 0x39) ||
       (0x41 <= character && character <= 0x46) ||
@@ -6159,13 +5787,11 @@
     return token != null && _tokenMatches(token, TokenType.OPEN_PAREN);
   }
 
-  /**
-   * Return `true` if it looks like we have found the invocation of a named
-   * constructor following the name of the type:
-   * ```
-   * typeArguments? '.' identifier '('
-   * ```
-   */
+  /// Return `true` if it looks like we have found the invocation of a named
+  /// constructor following the name of the type:
+  /// ```
+  /// typeArguments? '.' identifier '('
+  /// ```
   bool _isLikelyNamedInstanceCreation() {
     Token token = skipTypeArgumentList(_currentToken);
     if (token != null && _tokenMatches(token, TokenType.PERIOD)) {
@@ -6177,17 +5803,16 @@
     return false;
   }
 
-  /**
-   * Given that we have just found bracketed text within the given [comment],
-   * look to see whether that text is (a) followed by a parenthesized link
-   * address, (b) followed by a colon, or (c) followed by optional whitespace
-   * and another square bracket. The [rightIndex] is the index of the right
-   * bracket. Return `true` if the bracketed text is followed by a link address.
-   *
-   * This method uses the syntax described by the
-   * <a href="http://daringfireball.net/projects/markdown/syntax">markdown</a>
-   * project.
-   */
+  /// Given that we have just found bracketed text within the given [comment],
+  /// look to see whether that text is (a) followed by a parenthesized link
+  /// address, (b) followed by a colon, or (c) followed by optional whitespace
+  /// and another square bracket. The [rightIndex] is the index of the right
+  /// bracket. Return `true` if the bracketed text is followed by a link
+  /// address.
+  ///
+  /// This method uses the syntax described by the
+  /// <a href="http://daringfireball.net/projects/markdown/syntax">markdown</a>
+  /// project.
   bool _isLinkText(String comment, int rightIndex) {
     int length = comment.length;
     int index = rightIndex + 1;
@@ -6208,10 +5833,8 @@
     return nextChar == 0x5B;
   }
 
-  /**
-   * Return `true` if the given [startToken] appears to be the beginning of an
-   * operator declaration.
-   */
+  /// Return `true` if the given [startToken] appears to be the beginning of an
+  /// operator declaration.
   bool _isOperator(Token startToken) {
     // Accept any operator here, even if it is not user definable.
     if (!startToken.isOperator) {
@@ -6235,10 +5858,8 @@
     return token != null && _tokenMatches(token, TokenType.OPEN_PAREN);
   }
 
-  /**
-   * Return `true` if the [startToken] appears to be the first token of a type
-   * name that is followed by a variable or field formal parameter.
-   */
+  /// Return `true` if the [startToken] appears to be the first token of a type
+  /// name that is followed by a variable or field formal parameter.
   bool _isTypedIdentifier(Token startToken) {
     Token token = skipTypeAnnotation(startToken);
     if (token == null) {
@@ -6258,10 +5879,8 @@
     return false;
   }
 
-  /**
-   * Return `true` if the given [expression] is a primary expression that is
-   * allowed to be an assignable expression without any assignable selector.
-   */
+  /// Return `true` if the given [expression] is a primary expression that is
+  /// allowed to be an assignable expression without any assignable selector.
   bool _isValidAssignableExpression(Expression expression) {
     if (expression is SimpleIdentifier) {
       return true;
@@ -6273,28 +5892,22 @@
     return false;
   }
 
-  /**
-   * Increments the error reporting lock level. If level is more than `0`, then
-   * [reportError] wont report any error.
-   */
+  /// Increments the error reporting lock level. If level is more than `0`, then
+  /// [reportError] wont report any error.
   void _lockErrorListener() {
     _errorListenerLock++;
   }
 
-  /**
-   * Return `true` if the current token has the given [type]. Note that the
-   * method [_matchesGt] should be used if the argument to this method would be
-   * [TokenType.GT].
-   */
+  /// Return `true` if the current token has the given [type]. Note that the
+  /// method [_matchesGt] should be used if the argument to this method would be
+  /// [TokenType.GT].
   bool _matches(TokenType type) => _currentToken.type == type;
 
-  /**
-   * Return `true` if the current token has a type of [TokenType.GT]. Note that
-   * this method, unlike other variants, will modify the token stream if
-   * possible to match desired type. In particular, if the next token is either
-   * a '>>' or '>>>', the token stream will be re-written and `true` will be
-   * returned.
-   */
+  /// Return `true` if the current token has a type of [TokenType.GT]. Note that
+  /// this method, unlike other variants, will modify the token stream if
+  /// possible to match desired type. In particular, if the next token is either
+  /// a '>>' or '>>>', the token stream will be re-written and `true` will be
+  /// returned.
   bool _matchesGt() {
     TokenType currentType = _currentToken.type;
     if (currentType == TokenType.GT) {
@@ -6330,23 +5943,17 @@
     return false;
   }
 
-  /**
-   * Return `true` if the current token is a valid identifier. Valid identifiers
-   * include built-in identifiers (pseudo-keywords).
-   */
+  /// Return `true` if the current token is a valid identifier. Valid
+  /// identifiers include built-in identifiers (pseudo-keywords).
   bool _matchesIdentifier() => _tokenMatchesIdentifier(_currentToken);
 
-  /**
-   * Return `true` if the current token matches the given [keyword].
-   */
+  /// Return `true` if the current token matches the given [keyword].
   bool _matchesKeyword(Keyword keyword) =>
       _tokenMatchesKeyword(_currentToken, keyword);
 
-  /**
-   * If the current token has the given [type], then advance to the next token
-   * and return `true`. Otherwise, return `false` without advancing. This method
-   * should not be invoked with an argument value of [TokenType.GT].
-   */
+  /// If the current token has the given [type], then advance to the next token
+  /// and return `true`. Otherwise, return `false` without advancing. This
+  /// method should not be invoked with an argument value of [TokenType.GT].
   bool _optional(TokenType type) {
     if (_currentToken.type == type) {
       _advance();
@@ -6355,10 +5962,8 @@
     return false;
   }
 
-  /**
-   * Parse an argument list when we need to check for an open paren and recover
-   * when there isn't one. Return the argument list that was parsed.
-   */
+  /// Parse an argument list when we need to check for an open paren and recover
+  /// when there isn't one. Return the argument list that was parsed.
   ArgumentList _parseArgumentListChecked() {
     if (_matches(TokenType.OPEN_PAREN)) {
       return parseArgumentList();
@@ -6371,14 +5976,13 @@
         null, _createSyntheticToken(TokenType.CLOSE_PAREN));
   }
 
-  /**
-   * Parse an assert within a constructor's initializer list. Return the assert.
-   *
-   * This method assumes that the current token matches `Keyword.ASSERT`.
-   *
-   *     assertInitializer ::=
-   *         'assert' '(' expression [',' expression] ')'
-   */
+  /// Parse an assert within a constructor's initializer list. Return the
+  /// assert.
+  ///
+  /// This method assumes that the current token matches `Keyword.ASSERT`.
+  ///
+  ///     assertInitializer ::=
+  ///         'assert' '(' expression [',' expression] ')'
   AssertInitializer _parseAssertInitializer() {
     Token keyword = getAndAdvance();
     Token leftParen = _expect(TokenType.OPEN_PAREN);
@@ -6401,13 +6005,11 @@
         keyword, leftParen, expression, comma, message, rightParen);
   }
 
-  /**
-   * Parse a block when we need to check for an open curly brace and recover
-   * when there isn't one. Return the block that was parsed.
-   *
-   *     block ::=
-   *         '{' statements '}'
-   */
+  /// Parse a block when we need to check for an open curly brace and recover
+  /// when there isn't one. Return the block that was parsed.
+  ///
+  ///     block ::=
+  ///         '{' statements '}'
   Block _parseBlockChecked() {
     if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
       return parseBlock();
@@ -6421,15 +6023,13 @@
         null, _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET));
   }
 
-  /**
-   * Parse a list of class members. The [className] is the name of the class
-   * whose members are being parsed. The [closingBracket] is the closing bracket
-   * for the class, or `null` if the closing bracket is missing. Return the list
-   * of class members that were parsed.
-   *
-   *     classMembers ::=
-   *         (metadata memberDefinition)*
-   */
+  /// Parse a list of class members. The [className] is the name of the class
+  /// whose members are being parsed. The [closingBracket] is the closing
+  /// bracket for the class, or `null` if the closing bracket is missing.
+  /// Return the list of class members that were parsed.
+  ///
+  ///     classMembers ::=
+  ///         (metadata memberDefinition)*
   List<ClassMember> _parseClassMembers(String className, Token closingBracket) {
     List<ClassMember> members = <ClassMember>[];
     Token memberStart = _currentToken;
@@ -6461,20 +6061,18 @@
     return members;
   }
 
-  /**
-   * Parse a class type alias. The [commentAndMetadata] is the metadata to be
-   * associated with the member. The [abstractKeyword] is the token representing
-   * the 'abstract' keyword. The [classKeyword] is the token representing the
-   * 'class' keyword. The [className] is the name of the alias, and the
-   * [typeParameters] are the type parameters following the name. Return the
-   * class type alias that was parsed.
-   *
-   *     classTypeAlias ::=
-   *         identifier typeParameters? '=' 'abstract'? mixinApplication
-   *
-   *     mixinApplication ::=
-   *         type withClause implementsClause? ';'
-   */
+  /// Parse a class type alias. The [commentAndMetadata] is the metadata to be
+  /// associated with the member. The [abstractKeyword] is the token
+  /// representing the 'abstract' keyword. The [classKeyword] is the token
+  /// representing the 'class' keyword. The [className] is the name of the
+  /// alias, and the [typeParameters] are the type parameters following the
+  /// name. Return the class type alias that was parsed.
+  ///
+  ///     classTypeAlias ::=
+  ///         identifier typeParameters? '=' 'abstract'? mixinApplication
+  ///
+  ///     mixinApplication ::=
+  ///         type withClause implementsClause? ';'
   ClassTypeAlias _parseClassTypeAliasAfterName(
       CommentAndMetadata commentAndMetadata,
       Token abstractKeyword,
@@ -6524,10 +6122,8 @@
         semicolon);
   }
 
-  /**
-   * Parse a list of configurations. Return the configurations that were parsed,
-   * or `null` if there are no configurations.
-   */
+  /// Parse a list of configurations. Return the configurations that were
+  /// parsed, or `null` if there are no configurations.
   List<Configuration> _parseConfigurations() {
     List<Configuration> configurations = null;
     while (_matchesKeyword(Keyword.IF)) {
@@ -6637,20 +6233,18 @@
         body);
   }
 
-  /**
-   * Parse an enum constant declaration. Return the enum constant declaration
-   * that was parsed.
-   *
-   * Specified:
-   *
-   *     enumConstant ::=
-   *         id
-   *
-   * Actual:
-   *
-   *     enumConstant ::=
-   *         metadata id
-   */
+  /// Parse an enum constant declaration. Return the enum constant declaration
+  /// that was parsed.
+  ///
+  /// Specified:
+  ///
+  ///     enumConstant ::=
+  ///         id
+  ///
+  /// Actual:
+  ///
+  ///     enumConstant ::=
+  ///         metadata id
   EnumConstantDeclaration _parseEnumConstantDeclaration() {
     CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
     SimpleIdentifier name;
@@ -6663,10 +6257,8 @@
         commentAndMetadata.comment, commentAndMetadata.metadata, name);
   }
 
-  /**
-   * Parse a list of formal parameters given that the list starts with the given
-   * [leftParenthesis]. Return the formal parameters that were parsed.
-   */
+  /// Parse a list of formal parameters given that the list starts with the
+  /// given [leftParenthesis]. Return the formal parameters that were parsed.
   FormalParameterList _parseFormalParameterListAfterParen(Token leftParenthesis,
       {bool inFunctionType: false}) {
     if (_matches(TokenType.CLOSE_PAREN)) {
@@ -6837,27 +6429,23 @@
         leftSquareBracket, rightSquareBracket, rightParenthesis);
   }
 
-  /**
-   * Parse a list of formal parameters. Return the formal parameters that were
-   * parsed.
-   *
-   * This method assumes that the current token matches `TokenType.OPEN_PAREN`.
-   */
+  /// Parse a list of formal parameters. Return the formal parameters that were
+  /// parsed.
+  ///
+  /// This method assumes that the current token matches `TokenType.OPEN_PAREN`.
   FormalParameterList _parseFormalParameterListUnchecked(
       {bool inFunctionType: false}) {
     return _parseFormalParameterListAfterParen(getAndAdvance(),
         inFunctionType: inFunctionType);
   }
 
-  /**
-   * Parse a function declaration statement. The [commentAndMetadata] is the
-   * documentation comment and metadata to be associated with the declaration.
-   * The [returnType] is the return type, or `null` if there is no return type.
-   * Return the function declaration statement that was parsed.
-   *
-   *     functionDeclarationStatement ::=
-   *         functionSignature functionBody
-   */
+  /// Parse a function declaration statement. The [commentAndMetadata] is the
+  /// documentation comment and metadata to be associated with the declaration.
+  /// The [returnType] is the return type, or `null` if there is no return type.
+  /// Return the function declaration statement that was parsed.
+  ///
+  ///     functionDeclarationStatement ::=
+  ///         functionSignature functionBody
   Statement _parseFunctionDeclarationStatementAfterReturnType(
       CommentAndMetadata commentAndMetadata, TypeAnnotation returnType) {
     FunctionDeclaration declaration =
@@ -6875,17 +6463,15 @@
     return astFactory.functionDeclarationStatement(declaration);
   }
 
-  /**
-   * Parse a function type alias. The [commentAndMetadata] is the metadata to be
-   * associated with the member. The [keyword] is the token representing the
-   * 'typedef' keyword. Return the function type alias that was parsed.
-   *
-   *     functionTypeAlias ::=
-   *         functionPrefix typeParameterList? formalParameterList ';'
-   *
-   *     functionPrefix ::=
-   *         returnType? name
-   */
+  /// Parse a function type alias. The [commentAndMetadata] is the metadata to
+  /// be associated with the member. The [keyword] is the token representing the
+  /// 'typedef' keyword. Return the function type alias that was parsed.
+  ///
+  ///     functionTypeAlias ::=
+  ///         functionPrefix typeParameterList? formalParameterList ';'
+  ///
+  ///     functionPrefix ::=
+  ///         returnType? name
   FunctionTypeAlias _parseFunctionTypeAlias(
       CommentAndMetadata commentAndMetadata, Token keyword) {
     TypeAnnotation returnType = null;
@@ -6951,12 +6537,10 @@
     }
   }
 
-  /**
-   * Parse the generic method or function's type parameters.
-   *
-   * For backwards compatibility this can optionally use comments.
-   * See [parseGenericMethodComments].
-   */
+  /// Parse the generic method or function's type parameters.
+  ///
+  /// For backwards compatibility this can optionally use comments.
+  /// See [parseGenericMethodComments].
   TypeParameterList _parseGenericMethodTypeParameters() {
     if (_matches(TokenType.LT)) {
       return parseTypeParameterList();
@@ -6964,15 +6548,13 @@
     return null;
   }
 
-  /**
-   * Parse a library name. The [missingNameError] is the error code to be used
-   * if the library name is missing. The [missingNameToken] is the token
-   * associated with the error produced if the library name is missing. Return
-   * the library name that was parsed.
-   *
-   *     libraryName ::=
-   *         libraryIdentifier
-   */
+  /// Parse a library name. The [missingNameError] is the error code to be used
+  /// if the library name is missing. The [missingNameToken] is the token
+  /// associated with the error produced if the library name is missing. Return
+  /// the library name that was parsed.
+  ///
+  ///     libraryName ::=
+  ///         libraryIdentifier
   LibraryIdentifier _parseLibraryName(
       ParserErrorCode missingNameError, Token missingNameToken) {
     if (_matchesIdentifier()) {
@@ -6989,19 +6571,17 @@
         .libraryIdentifier(<SimpleIdentifier>[createSyntheticIdentifier()]);
   }
 
-  /**
-   * Parse a method declaration. The [commentAndMetadata] is the documentation
-   * comment and metadata to be associated with the declaration. The
-   * [externalKeyword] is the 'external' token. The [staticKeyword] is the
-   * static keyword, or `null` if the getter is not static. The [returnType] is
-   * the return type of the method. The [name] is the name of the method. The
-   * [parameters] is the parameters to the method. Return the method declaration
-   * that was parsed.
-   *
-   *     functionDeclaration ::=
-   *         ('external' 'static'?)? functionSignature functionBody
-   *       | 'external'? functionSignature ';'
-   */
+  /// Parse a method declaration. The [commentAndMetadata] is the documentation
+  /// comment and metadata to be associated with the declaration. The
+  /// [externalKeyword] is the 'external' token. The [staticKeyword] is the
+  /// static keyword, or `null` if the getter is not static. The [returnType] is
+  /// the return type of the method. The [name] is the name of the method. The
+  /// [parameters] is the parameters to the method. Return the method
+  /// declaration that was parsed.
+  ///
+  ///     functionDeclaration ::=
+  ///         ('external' 'static'?)? functionSignature functionBody
+  ///       | 'external'? functionSignature ';'
   MethodDeclaration _parseMethodDeclarationAfterParameters(
       CommentAndMetadata commentAndMetadata,
       Token externalKeyword,
@@ -7037,18 +6617,16 @@
         body);
   }
 
-  /**
-   * Parse a method declaration. The [commentAndMetadata] is the documentation
-   * comment and metadata to be associated with the declaration. The
-   * [externalKeyword] is the 'external' token. The [staticKeyword] is the
-   * static keyword, or `null` if the getter is not static. The [returnType] is
-   * the return type of the method. Return the method declaration that was
-   * parsed.
-   *
-   *     functionDeclaration ::=
-   *         'external'? 'static'? functionSignature functionBody
-   *       | 'external'? functionSignature ';'
-   */
+  /// Parse a method declaration. The [commentAndMetadata] is the documentation
+  /// comment and metadata to be associated with the declaration. The
+  /// [externalKeyword] is the 'external' token. The [staticKeyword] is the
+  /// static keyword, or `null` if the getter is not static. The [returnType] is
+  /// the return type of the method. Return the method declaration that was
+  /// parsed.
+  ///
+  ///     functionDeclaration ::=
+  ///         'external'? 'static'? functionSignature functionBody
+  ///       | 'external'? functionSignature ';'
   MethodDeclaration _parseMethodDeclarationAfterReturnType(
       CommentAndMetadata commentAndMetadata,
       Token externalKeyword,
@@ -7084,34 +6662,30 @@
         parameters);
   }
 
-  /**
-   * Parse a class native clause. Return the native clause that was parsed.
-   *
-   * This method assumes that the current token matches `_NATIVE`.
-   *
-   *     classNativeClause ::=
-   *         'native' name
-   */
+  /// Parse a class native clause. Return the native clause that was parsed.
+  ///
+  /// This method assumes that the current token matches `_NATIVE`.
+  ///
+  ///     classNativeClause ::=
+  ///         'native' name
   NativeClause _parseNativeClause() {
     Token keyword = getAndAdvance();
     StringLiteral name = parseStringLiteral();
     return astFactory.nativeClause(keyword, name);
   }
 
-  /**
-   * Parse an operator declaration starting after the 'operator' keyword. The
-   * [commentAndMetadata] is the documentation comment and metadata to be
-   * associated with the declaration. The [externalKeyword] is the 'external'
-   * token. The [returnType] is the return type that has already been parsed, or
-   * `null` if there was no return type. The [operatorKeyword] is the 'operator'
-   * keyword. Return the operator declaration that was parsed.
-   *
-   *     operatorDeclaration ::=
-   *         operatorSignature (';' | functionBody)
-   *
-   *     operatorSignature ::=
-   *         'external'? returnType? 'operator' operator formalParameterList
-   */
+  /// Parse an operator declaration starting after the 'operator' keyword. The
+  /// [commentAndMetadata] is the documentation comment and metadata to be
+  /// associated with the declaration. The [externalKeyword] is the 'external'
+  /// token. The [returnType] is the return type that has already been parsed,
+  /// or `null` if there was no return type. The [operatorKeyword] is the
+  /// 'operator' keyword. Return the operator declaration that was parsed.
+  ///
+  ///     operatorDeclaration ::=
+  ///         operatorSignature (';' | functionBody)
+  ///
+  ///     operatorSignature ::=
+  ///         'external'? returnType? 'operator' operator formalParameterList
   MethodDeclaration _parseOperatorAfterKeyword(
       CommentAndMetadata commentAndMetadata,
       Token externalKeyword,
@@ -7157,10 +6731,8 @@
         body);
   }
 
-  /**
-   * Parse a return type if one is given, otherwise return `null` without
-   * advancing. Return the return type that was parsed.
-   */
+  /// Parse a return type if one is given, otherwise return `null` without
+  /// advancing. Return the return type that was parsed.
   TypeAnnotation _parseOptionalReturnType() {
     Keyword keyword = _currentToken.keyword;
     if (keyword == Keyword.VOID) {
@@ -7198,10 +6770,8 @@
     return null;
   }
 
-  /**
-   * Parse a [TypeArgumentList] if present, otherwise return null.
-   * This also supports the comment form, if enabled: `/*<T>*/`
-   */
+  /// Parse a [TypeArgumentList] if present, otherwise return null.
+  /// This also supports the comment form, if enabled: `/*<T>*/`
   TypeArgumentList _parseOptionalTypeArguments() {
     if (_matches(TokenType.LT)) {
       return parseTypeArgumentList();
@@ -7209,16 +6779,14 @@
     return null;
   }
 
-  /**
-   * Parse a part directive. The [commentAndMetadata] is the metadata to be
-   * associated with the directive. Return the part or part-of directive that
-   * was parsed.
-   *
-   * This method assumes that the current token matches `Keyword.PART`.
-   *
-   *     partDirective ::=
-   *         metadata 'part' stringLiteral ';'
-   */
+  /// Parse a part directive. The [commentAndMetadata] is the metadata to be
+  /// associated with the directive. Return the part or part-of directive that
+  /// was parsed.
+  ///
+  /// This method assumes that the current token matches `Keyword.PART`.
+  ///
+  ///     partDirective ::=
+  ///         metadata 'part' stringLiteral ';'
   Directive _parsePartDirective(CommentAndMetadata commentAndMetadata) {
     Token partKeyword = getAndAdvance();
     StringLiteral partUri = _parseUri();
@@ -7227,17 +6795,15 @@
         commentAndMetadata.metadata, partKeyword, partUri, semicolon);
   }
 
-  /**
-   * Parse a part-of directive. The [commentAndMetadata] is the metadata to be
-   * associated with the directive. Return the part or part-of directive that
-   * was parsed.
-   *
-   * This method assumes that the current token matches [Keyword.PART] and that
-   * the following token matches the identifier 'of'.
-   *
-   *     partOfDirective ::=
-   *         metadata 'part' 'of' identifier ';'
-   */
+  /// Parse a part-of directive. The [commentAndMetadata] is the metadata to be
+  /// associated with the directive. Return the part or part-of directive that
+  /// was parsed.
+  ///
+  /// This method assumes that the current token matches [Keyword.PART] and that
+  /// the following token matches the identifier 'of'.
+  ///
+  ///     partOfDirective ::=
+  ///         metadata 'part' 'of' identifier ';'
   Directive _parsePartOfDirective(CommentAndMetadata commentAndMetadata) {
     Token partKeyword = getAndAdvance();
     Token ofKeyword = getAndAdvance();
@@ -7266,13 +6832,11 @@
         semicolon);
   }
 
-  /**
-   * Parse a prefixed identifier given that the given [qualifier] was already
-   * parsed. Return the prefixed identifier that was parsed.
-   *
-   *     prefixedIdentifier ::=
-   *         identifier ('.' identifier)?
-   */
+  /// Parse a prefixed identifier given that the given [qualifier] was already
+  /// parsed. Return the prefixed identifier that was parsed.
+  ///
+  ///     prefixedIdentifier ::=
+  ///         identifier ('.' identifier)?
   Identifier _parsePrefixedIdentifierAfterIdentifier(
       SimpleIdentifier qualifier) {
     if (!_matches(TokenType.PERIOD)) {
@@ -7283,28 +6847,24 @@
     return astFactory.prefixedIdentifier(qualifier, period, qualified);
   }
 
-  /**
-   * Parse a prefixed identifier. Return the prefixed identifier that was
-   * parsed.
-   *
-   * This method assumes that the current token matches an identifier.
-   *
-   *     prefixedIdentifier ::=
-   *         identifier ('.' identifier)?
-   */
+  /// Parse a prefixed identifier. Return the prefixed identifier that was
+  /// parsed.
+  ///
+  /// This method assumes that the current token matches an identifier.
+  ///
+  ///     prefixedIdentifier ::=
+  ///         identifier ('.' identifier)?
   Identifier _parsePrefixedIdentifierUnchecked() {
     return _parsePrefixedIdentifierAfterIdentifier(
         _parseSimpleIdentifierUnchecked());
   }
 
-  /**
-   * Parse a simple identifier. Return the simple identifier that was parsed.
-   *
-   * This method assumes that the current token matches an identifier.
-   *
-   *     identifier ::=
-   *         IDENTIFIER
-   */
+  /// Parse a simple identifier. Return the simple identifier that was parsed.
+  ///
+  /// This method assumes that the current token matches an identifier.
+  ///
+  ///     identifier ::=
+  ///         IDENTIFIER
   SimpleIdentifier _parseSimpleIdentifierUnchecked(
       {bool isDeclaration: false}) {
     String lexeme = _currentToken.lexeme;
@@ -7317,13 +6877,11 @@
         isDeclaration: isDeclaration);
   }
 
-  /**
-   * Parse a list of statements within a switch statement. Return the statements
-   * that were parsed.
-   *
-   *     statements ::=
-   *         statement*
-   */
+  /// Parse a list of statements within a switch statement. Return the
+  /// statements that were parsed.
+  ///
+  ///     statements ::=
+  ///         statement*
   List<Statement> _parseStatementList() {
     List<Statement> statements = <Statement>[];
     Token statementStart = _currentToken;
@@ -7343,14 +6901,12 @@
     return statements;
   }
 
-  /**
-   * Parse a string literal that contains interpolations. Return the string
-   * literal that was parsed.
-   *
-   * This method assumes that the current token matches either
-   * [TokenType.STRING_INTERPOLATION_EXPRESSION] or
-   * [TokenType.STRING_INTERPOLATION_IDENTIFIER].
-   */
+  /// Parse a string literal that contains interpolations. Return the string
+  /// literal that was parsed.
+  ///
+  /// This method assumes that the current token matches either
+  /// [TokenType.STRING_INTERPOLATION_EXPRESSION] or
+  /// [TokenType.STRING_INTERPOLATION_IDENTIFIER].
   StringInterpolation _parseStringInterpolation(Token string) {
     List<InterpolationElement> elements = <InterpolationElement>[
       astFactory.interpolationString(
@@ -7396,15 +6952,13 @@
     return astFactory.stringInterpolation(elements);
   }
 
-  /**
-   * Parse a string literal. Return the string literal that was parsed.
-   *
-   * This method assumes that the current token matches `TokenType.STRING`.
-   *
-   *     stringLiteral ::=
-   *         MULTI_LINE_STRING+
-   *       | SINGLE_LINE_STRING+
-   */
+  /// Parse a string literal. Return the string literal that was parsed.
+  ///
+  /// This method assumes that the current token matches `TokenType.STRING`.
+  ///
+  ///     stringLiteral ::=
+  ///         MULTI_LINE_STRING+
+  ///       | SINGLE_LINE_STRING+
   StringLiteral _parseStringLiteralUnchecked() {
     List<StringLiteral> strings = <StringLiteral>[];
     do {
@@ -7422,15 +6976,13 @@
         : astFactory.adjacentStrings(strings);
   }
 
-  /**
-   * Parse a type annotation, possibly superseded by a type name in a comment.
-   * Return the type name that was parsed.
-   *
-   * This method assumes that the current token is an identifier.
-   *
-   *     type ::=
-   *         qualified typeArguments?
-   */
+  /// Parse a type annotation, possibly superseded by a type name in a comment.
+  /// Return the type name that was parsed.
+  ///
+  /// This method assumes that the current token is an identifier.
+  ///
+  ///     type ::=
+  ///         qualified typeArguments?
   TypeAnnotation _parseTypeAnnotationAfterIdentifier() {
     return parseTypeAnnotation(false);
   }
@@ -7450,10 +7002,8 @@
     return astFactory.typeName(typeName, typeArguments);
   }
 
-  /**
-   * Parse a string literal representing a URI. Return the string literal that
-   * was parsed.
-   */
+  /// Parse a string literal representing a URI. Return the string literal that
+  /// was parsed.
   StringLiteral _parseUri() {
     // TODO(brianwilkerson) Should this function also return true for valid
     // top-level keywords?
@@ -7510,17 +7060,15 @@
     return parseStringLiteral();
   }
 
-  /**
-   * Parse a variable declaration statement. The [commentAndMetadata] is the
-   * metadata to be associated with the variable declaration statement, or
-   * `null` if there is no attempt at parsing the comment and metadata. The
-   * [keyword] is the token representing the 'final', 'const' or 'var' keyword,
-   * or `null` if there is no keyword. The [type] is the type of the variables
-   * in the list. Return the variable declaration statement that was parsed.
-   *
-   *     variableDeclarationStatement ::=
-   *         variableDeclarationList ';'
-   */
+  /// Parse a variable declaration statement. The [commentAndMetadata] is the
+  /// metadata to be associated with the variable declaration statement, or
+  /// `null` if there is no attempt at parsing the comment and metadata. The
+  /// [keyword] is the token representing the 'final', 'const' or 'var' keyword,
+  /// or `null` if there is no keyword. The [type] is the type of the variables
+  /// in the list. Return the variable declaration statement that was parsed.
+  ///
+  ///     variableDeclarationStatement ::=
+  ///         variableDeclarationList ';'
   VariableDeclarationStatement _parseVariableDeclarationStatementAfterType(
       CommentAndMetadata commentAndMetadata,
       Token keyword,
@@ -7532,17 +7080,13 @@
     return astFactory.variableDeclarationStatement(variableList, semicolon);
   }
 
-  /**
-   * Return the token that is immediately after the current token. This is
-   * equivalent to [_peekAt](1).
-   */
+  /// Return the token that is immediately after the current token. This is
+  /// equivalent to [_peekAt](1).
   Token _peek() => _currentToken.next;
 
-  /**
-   * Return the token that is the given [distance] after the current token,
-   * where the distance is the number of tokens to look ahead. A distance of `0`
-   * is the current token, `1` is the next token, etc.
-   */
+  /// Return the token that is the given [distance] after the current token,
+  /// where the distance is the number of tokens to look ahead. A distance of
+  /// `0` is the current token, `1` is the next token, etc.
   Token _peekAt(int distance) {
     Token token = _currentToken;
     for (int i = 0; i < distance; i++) {
@@ -7570,9 +7114,7 @@
     return comment;
   }
 
-  /**
-   * Report the given [error].
-   */
+  /// Report the given [error].
   void _reportError(AnalysisError error) {
     if (_errorListenerLock != 0) {
       return;
@@ -7580,29 +7122,23 @@
     _errorListener.onError(error);
   }
 
-  /**
-   * Report an error with the given [errorCode] and [arguments] associated with
-   * the current token.
-   */
+  /// Report an error with the given [errorCode] and [arguments] associated with
+  /// the current token.
   void _reportErrorForCurrentToken(ParserErrorCode errorCode,
       [List<Object> arguments]) {
     _reportErrorForToken(errorCode, _currentToken, arguments);
   }
 
-  /**
-   * Report an error with the given [errorCode] and [arguments] associated with
-   * the given [node].
-   */
+  /// Report an error with the given [errorCode] and [arguments] associated with
+  /// the given [node].
   void _reportErrorForNode(ParserErrorCode errorCode, AstNode node,
       [List<Object> arguments]) {
     _reportError(new AnalysisError(
         _source, node.offset, node.length, errorCode, arguments));
   }
 
-  /**
-   * Report an error with the given [errorCode] and [arguments] associated with
-   * the given [token].
-   */
+  /// Report an error with the given [errorCode] and [arguments] associated with
+  /// the given [token].
   void _reportErrorForToken(ErrorCode errorCode, Token token,
       [List<Object> arguments]) {
     if (token.type == TokenType.EOF) {
@@ -7612,9 +7148,7 @@
         math.max(token.length, 1), errorCode, arguments));
   }
 
-  /**
-   * Skips a block with all containing blocks.
-   */
+  /// Skips a block with all containing blocks.
   void _skipBlock() {
     Token endToken = (_currentToken as BeginToken).endToken;
     if (endToken == null) {
@@ -7630,20 +7164,18 @@
     }
   }
 
-  /**
-   * Parse the 'final', 'const', 'var' or type preceding a variable declaration,
-   * starting at the given token, without actually creating a type or changing
-   * the current token. Return the token following the type that was parsed, or
-   * `null` if the given token is not the first token in a valid type. The
-   * [startToken] is the token at which parsing is to begin. Return the token
-   * following the type that was parsed.
-   *
-   * finalConstVarOrType ::=
-   *   | 'final' type?
-   *   | 'const' type?
-   *   | 'var'
-   *   | type
-   */
+  /// Parse the 'final', 'const', 'var' or type preceding a variable
+  /// declaration, starting at the given token, without actually creating a
+  /// type or changing the current token. Return the token following the type
+  /// that was parsed, or `null` if the given token is not the first token in a
+  /// valid type. The [startToken] is the token at which parsing is to begin.
+  /// Return the token following the type that was parsed.
+  ///
+  /// finalConstVarOrType ::=
+  ///   | 'final' type?
+  ///   | 'const' type?
+  ///   | 'var'
+  ///   | type
   Token _skipFinalConstVarOrType(Token startToken) {
     Keyword keyword = startToken.keyword;
     if (keyword == Keyword.FINAL || keyword == Keyword.CONST) {
@@ -7677,40 +7209,38 @@
     return null;
   }
 
-  /**
-   * Parse a list of formal parameters, starting at the [startToken], without
-   * actually creating a formal parameter list or changing the current token.
-   * Return the token following the formal parameter list that was parsed, or
-   * `null` if the given token is not the first token in a valid list of formal
-   * parameter.
-   *
-   * Note that unlike other skip methods, this method uses a heuristic. In the
-   * worst case, the parameters could be prefixed by metadata, which would
-   * require us to be able to skip arbitrary expressions. Rather than duplicate
-   * the logic of most of the parse methods we simply look for something that is
-   * likely to be a list of parameters and then skip to returning the token
-   * after the closing parenthesis.
-   *
-   * This method must be kept in sync with [parseFormalParameterList].
-   *
-   *     formalParameterList ::=
-   *         '(' ')'
-   *       | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
-   *       | '(' optionalFormalParameters ')'
-   *
-   *     normalFormalParameters ::=
-   *         normalFormalParameter (',' normalFormalParameter)*
-   *
-   *     optionalFormalParameters ::=
-   *         optionalPositionalFormalParameters
-   *       | namedFormalParameters
-   *
-   *     optionalPositionalFormalParameters ::=
-   *         '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
-   *
-   *     namedFormalParameters ::=
-   *         '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
-   */
+  /// Parse a list of formal parameters, starting at the [startToken], without
+  /// actually creating a formal parameter list or changing the current token.
+  /// Return the token following the formal parameter list that was parsed, or
+  /// `null` if the given token is not the first token in a valid list of formal
+  /// parameter.
+  ///
+  /// Note that unlike other skip methods, this method uses a heuristic. In the
+  /// worst case, the parameters could be prefixed by metadata, which would
+  /// require us to be able to skip arbitrary expressions. Rather than duplicate
+  /// the logic of most of the parse methods we simply look for something that
+  /// is likely to be a list of parameters and then skip to returning the token
+  /// after the closing parenthesis.
+  ///
+  /// This method must be kept in sync with [parseFormalParameterList].
+  ///
+  ///     formalParameterList ::=
+  ///         '(' ')'
+  ///       | '(' normalFormalParameters (',' optionalFormalParameters)? ')'
+  ///       | '(' optionalFormalParameters ')'
+  ///
+  ///     normalFormalParameters ::=
+  ///         normalFormalParameter (',' normalFormalParameter)*
+  ///
+  ///     optionalFormalParameters ::=
+  ///         optionalPositionalFormalParameters
+  ///       | namedFormalParameters
+  ///
+  ///     optionalPositionalFormalParameters ::=
+  ///         '[' defaultFormalParameter (',' defaultFormalParameter)* ']'
+  ///
+  ///     namedFormalParameters ::=
+  ///         '{' defaultNamedParameter (',' defaultNamedParameter)* '}'
   Token _skipFormalParameterList(Token startToken) {
     if (!_tokenMatches(startToken, TokenType.OPEN_PAREN)) {
       return null;
@@ -7761,10 +7291,8 @@
     return _skipPastMatchingToken(startToken);
   }
 
-  /**
-   * If the [startToken] is a begin token with an associated end token, then
-   * return the token following the end token. Otherwise, return `null`.
-   */
+  /// If the [startToken] is a begin token with an associated end token, then
+  /// return the token following the end token. Otherwise, return `null`.
   Token _skipPastMatchingToken(Token startToken) {
     if (startToken is! BeginToken) {
       return null;
@@ -7776,15 +7304,13 @@
     return closeParen.next;
   }
 
-  /**
-   * Parse a string literal that contains interpolations, starting at the
-   * [startToken], without actually creating a string literal or changing the
-   * current token. Return the token following the string literal that was
-   * parsed, or `null` if the given token is not the first token in a valid
-   * string literal.
-   *
-   * This method must be kept in sync with [parseStringInterpolation].
-   */
+  /// Parse a string literal that contains interpolations, starting at the
+  /// [startToken], without actually creating a string literal or changing the
+  /// current token. Return the token following the string literal that was
+  /// parsed, or `null` if the given token is not the first token in a valid
+  /// string literal.
+  ///
+  /// This method must be kept in sync with [parseStringInterpolation].
   Token _skipStringInterpolation(Token startToken) {
     Token token = startToken;
     TokenType type = token.type;
@@ -7836,18 +7362,16 @@
     return token;
   }
 
-  /**
-   * Parse a list of type parameters, starting at the [startToken], without
-   * actually creating a type parameter list or changing the current token.
-   * Return the token following the type parameter list that was parsed, or
-   * `null` if the given token is not the first token in a valid type parameter
-   * list.
-   *
-   * This method must be kept in sync with [parseTypeParameterList].
-   *
-   *     typeParameterList ::=
-   *         '<' typeParameter (',' typeParameter)* '>'
-   */
+  /// Parse a list of type parameters, starting at the [startToken], without
+  /// actually creating a type parameter list or changing the current token.
+  /// Return the token following the type parameter list that was parsed, or
+  /// `null` if the given token is not the first token in a valid type parameter
+  /// list.
+  ///
+  /// This method must be kept in sync with [parseTypeParameterList].
+  ///
+  ///     typeParameterList ::=
+  ///         '<' typeParameter (',' typeParameter)* '>'
   Token _skipTypeParameterList(Token startToken) {
     if (!_tokenMatches(startToken, TokenType.LT)) {
       return null;
@@ -7889,10 +7413,8 @@
     return next;
   }
 
-  /**
-   * Assuming that the current token is an index token ('[]'), split it into two
-   * tokens ('[' and ']'), leaving the left bracket as the current token.
-   */
+  /// Assuming that the current token is an index token ('[]'), split it into
+  /// two tokens ('[' and ']'), leaving the left bracket as the current token.
   void _splitIndex() {
     // Split the token into two separate tokens.
     BeginToken leftBracket = _createToken(
@@ -7907,42 +7429,30 @@
     _currentToken = leftBracket;
   }
 
-  /**
-   * Return `true` if the given [token] has the given [type].
-   */
+  /// Return `true` if the given [token] has the given [type].
   bool _tokenMatches(Token token, TokenType type) => token.type == type;
 
-  /**
-   * Return `true` if the given [token] is a valid identifier. Valid identifiers
-   * include built-in identifiers (pseudo-keywords).
-   */
+  /// Return `true` if the given [token] is a valid identifier. Valid
+  /// identifiers include built-in identifiers (pseudo-keywords).
   bool _tokenMatchesIdentifier(Token token) =>
       _tokenMatches(token, TokenType.IDENTIFIER) ||
       _tokenMatchesPseudoKeyword(token);
 
-  /**
-   * Return `true` if the given [token] is either an identifier or a keyword.
-   */
+  /// Return `true` if the given [token] is either an identifier or a keyword.
   bool _tokenMatchesIdentifierOrKeyword(Token token) =>
       _tokenMatches(token, TokenType.IDENTIFIER) || token.type.isKeyword;
 
-  /**
-   * Return `true` if the given [token] matches the given [keyword].
-   */
+  /// Return `true` if the given [token] matches the given [keyword].
   bool _tokenMatchesKeyword(Token token, Keyword keyword) =>
       token.keyword == keyword;
 
-  /**
-   * Return `true` if the given [token] matches a pseudo keyword.
-   */
+  /// Return `true` if the given [token] matches a pseudo keyword.
   bool _tokenMatchesPseudoKeyword(Token token) =>
       token.keyword?.isBuiltInOrPseudo ?? false;
 
-  /**
-   * Translate the characters at the given [index] in the given [lexeme],
-   * appending the translated character to the given [buffer]. The index is
-   * assumed to be valid.
-   */
+  /// Translate the characters at the given [index] in the given [lexeme],
+  /// appending the translated character to the given [buffer]. The index is
+  /// assumed to be valid.
   int _translateCharacter(StringBuffer buffer, String lexeme, int index) {
     int currentChar = lexeme.codeUnitAt(index);
     if (currentChar != 0x5C) {
@@ -8081,10 +7591,8 @@
     return currentIndex + 1;
   }
 
-  /**
-   * Decrements the error reporting lock level. If level is more than `0`, then
-   * [reportError] wont report any error.
-   */
+  /// Decrements the error reporting lock level. If level is more than `0`, then
+  /// [reportError] wont report any error.
   void _unlockErrorListener() {
     if (_errorListenerLock == 0) {
       throw new StateError("Attempt to unlock not locked error listener.");
@@ -8092,10 +7600,8 @@
     _errorListenerLock--;
   }
 
-  /**
-   * Validate that the given [parameterList] does not contain any field
-   * initializers.
-   */
+  /// Validate that the given [parameterList] does not contain any field
+  /// initializers.
   void _validateFormalParameterList(FormalParameterList parameterList) {
     for (FormalParameter parameter in parameterList.parameters) {
       if (parameter is FieldFormalParameter) {
@@ -8106,10 +7612,8 @@
     }
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a class and
-   * return the 'abstract' keyword if there is one.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a class and
+  /// return the 'abstract' keyword if there is one.
   Token _validateModifiersForClass(Modifiers modifiers) {
     _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.constKeyword != null) {
@@ -8128,10 +7632,8 @@
     return modifiers.abstractKeyword;
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a constructor
-   * and return the 'const' keyword if there is one.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a
+  /// constructor and return the 'const' keyword if there is one.
   Token _validateModifiersForConstructor(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
       _reportErrorForToken(
@@ -8171,10 +7673,8 @@
     return constKeyword;
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for an enum and
-   * return the 'abstract' keyword if there is one.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for an enum and
+  /// return the 'abstract' keyword if there is one.
   void _validateModifiersForEnum(Modifiers modifiers) {
     _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
@@ -8196,10 +7696,8 @@
     }
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a field and
-   * return the 'final', 'const' or 'var' keyword if there is one.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a field and
+  /// return the 'final', 'const' or 'var' keyword if there is one.
   Token _validateModifiersForField(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
       _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER);
@@ -8258,10 +7756,8 @@
     return Token.lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a local
-   * function.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a local
+  /// function.
   void _validateModifiersForFunctionDeclarationStatement(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null ||
         modifiers.constKeyword != null ||
@@ -8275,10 +7771,8 @@
     }
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a getter,
-   * setter, or method.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a getter,
+  /// setter, or method.
   void _validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
       _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER);
@@ -8313,10 +7807,8 @@
     }
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a getter,
-   * setter, or method.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a getter,
+  /// setter, or method.
   void _validateModifiersForOperator(Modifiers modifiers) {
     if (modifiers.abstractKeyword != null) {
       _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER);
@@ -8343,10 +7835,8 @@
     }
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a top-level
-   * declaration.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a top-level
+  /// declaration.
   void _validateModifiersForTopLevelDeclaration(Modifiers modifiers) {
     if (modifiers.covariantKeyword != null) {
       _reportErrorForToken(ParserErrorCode.COVARIANT_TOP_LEVEL_DECLARATION,
@@ -8362,10 +7852,8 @@
     }
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a top-level
-   * function.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a top-level
+  /// function.
   void _validateModifiersForTopLevelFunction(Modifiers modifiers) {
     _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
@@ -8383,10 +7871,8 @@
     }
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a field and
-   * return the 'final', 'const' or 'var' keyword if there is one.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a field and
+  /// return the 'final', 'const' or 'var' keyword if there is one.
   Token _validateModifiersForTopLevelVariable(Modifiers modifiers) {
     _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
@@ -8414,10 +7900,8 @@
     return Token.lexicallyFirst([constKeyword, finalKeyword, varKeyword]);
   }
 
-  /**
-   * Validate that the given set of [modifiers] is appropriate for a class and
-   * return the 'abstract' keyword if there is one.
-   */
+  /// Validate that the given set of [modifiers] is appropriate for a class and
+  /// return the 'abstract' keyword if there is one.
   void _validateModifiersForTypedef(Modifiers modifiers) {
     _validateModifiersForTopLevelDeclaration(modifiers);
     if (modifiers.abstractKeyword != null) {
@@ -8442,9 +7926,7 @@
   }
 }
 
-/**
- * Instances of this class are thrown when the parser detects that AST has
- * too many nested expressions to be parsed safely and avoid possibility of
- * [StackOverflowError] in the parser or during later analysis.
- */
+/// Instances of this class are thrown when the parser detects that AST has
+/// too many nested expressions to be parsed safely and avoid possibility of
+/// [StackOverflowError] in the parser or during later analysis.
 class _TooDeepTreeError {}
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 946f327..389c230 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -27,6 +27,7 @@
       {bool allowNativeClause: false})
       : fastaParser = new fasta.Parser(null),
         astBuilder = new AstBuilder(errorReporter, fileUri, true) {
+    fastaParser.enableSetLiterals = IsEnabledByDefault.set_literals;
     fastaParser.listener = astBuilder;
     astBuilder.parser = fastaParser;
     astBuilder.allowNativeClause = allowNativeClause;
@@ -37,6 +38,15 @@
     astBuilder.allowNativeClause = value;
   }
 
+  /// Enables or disables non-nullable by default.
+  void set enableNonNullable(bool value) {
+    if (IsExpired.non_nullable && value != IsEnabledByDefault.non_nullable) {
+      throw new StateError(
+          'non_nullable may only be set to ${IsEnabledByDefault.non_nullable}');
+    }
+    astBuilder.enableNonNullable = value;
+  }
+
   @override
   bool get enableOptionalNewAndConst => false;
 
@@ -44,6 +54,15 @@
   void set enableOptionalNewAndConst(bool enable) {}
 
   @override
+  void set enableSetLiterals(bool value) {
+    if (IsExpired.set_literals && value != IsEnabledByDefault.set_literals) {
+      throw new StateError(
+          'set_literals may only be set to ${IsEnabledByDefault.set_literals}');
+    }
+    fastaParser.enableSetLiterals = value;
+  }
+
+  @override
   void set parseFunctionBodies(bool parseFunctionBodies) {
     astBuilder.parseFunctionBodies = parseFunctionBodies;
   }
@@ -150,6 +169,8 @@
     currentToken = fastaParser.parseUnit(currentToken);
     CompilationUnitImpl compilationUnit = astBuilder.pop();
     compilationUnit.localDeclarations = astBuilder.localDeclarations;
+    compilationUnit.hasPragmaAnalyzerNonNullable =
+        astBuilder.hasPragmaAnalyzerNonNullable;
     return compilationUnit;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 61fc2a4..9dc3ff1 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -14,6 +14,8 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
@@ -27,11 +29,12 @@
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/element_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/error_verifier.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/static_type_analyzer.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/type_system.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:path/path.dart' as path;
 
 export 'package:analyzer/src/dart/constant/constant_verifier.dart';
@@ -58,14 +61,14 @@
             nameScope: nameScope);
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
+  void visitMethodInvocation(MethodInvocation node) {
     super.visitMethodInvocation(node);
 
     SimpleIdentifier methodName = node.methodName;
     if (methodName.isSynthetic) {
       // This isn't a constructor invocation because the method name is
       // synthetic.
-      return null;
+      return;
     }
 
     Expression target = node.target;
@@ -73,7 +76,7 @@
       // Possible cases: C() or C<>()
       if (node.realTarget != null) {
         // This isn't a constructor invocation because it's in a cascade.
-        return null;
+        return;
       }
       Element element = nameScope.lookup(methodName, definingLibrary);
       if (element is ClassElement) {
@@ -204,7 +207,6 @@
         }
       }
     }
-    return null;
   }
 
   /// Return the token that should be used in the [InstanceCreationExpression]
@@ -220,27 +222,35 @@
   static InterfaceType getType(TypeSystem typeSystem, ClassElement element,
       TypeArgumentList typeArguments) {
     DartType type = element.type;
+
     List<TypeParameterElement> typeParameters = element.typeParameters;
-    if (typeArguments != null &&
-        typeParameters != null &&
-        typeArguments.arguments.length == typeParameters.length) {
-      List<DartType> argumentTypes = typeArguments.arguments
+    if (typeParameters.isEmpty) {
+      return type;
+    }
+
+    if (typeArguments == null) {
+      return typeSystem.instantiateToBounds(type);
+    }
+
+    List<DartType> argumentTypes;
+    if (typeArguments.arguments.length == typeParameters.length) {
+      argumentTypes = typeArguments.arguments
           .map((TypeAnnotation argument) => argument.type)
           .toList();
-      List<DartType> parameterTypes = typeParameters
-          .map((TypeParameterElement parameter) => parameter.type)
-          .toList();
-      type = type.substitute2(argumentTypes, parameterTypes);
-    } else if (typeArguments == null && typeParameters != null) {
-      type = typeSystem.instantiateToBounds(type);
+    } else {
+      argumentTypes = List<DartType>.filled(
+          typeParameters.length, DynamicTypeImpl.instance);
     }
-    return type;
+    List<DartType> parameterTypes = typeParameters
+        .map((TypeParameterElement parameter) => parameter.type)
+        .toList();
+    return type.substitute2(argumentTypes, parameterTypes);
   }
 }
 
 /// Instances of the class `BestPracticesVerifier` traverse an AST structure
 /// looking for violations of Dart best practices.
-class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
+class BestPracticesVerifier extends RecursiveAstVisitor<void> {
 //  static String _HASHCODE_GETTER_NAME = "hashCode";
 
   static String _NULL_TYPE_NAME = "Null";
@@ -273,26 +283,42 @@
 
   final _InvalidAccessVerifier _invalidAccessVerifier;
 
+  /// The [WorkspacePackage] in which [_currentLibrary] is declared.
+  WorkspacePackage _workspacePackage;
+
+  /// The [LinterContext] used for possible const calculations.
+  LinterContext _linterContext;
+
   /// Create a new instance of the [BestPracticesVerifier].
   ///
   /// @param errorReporter the error reporter
   BestPracticesVerifier(
-      this._errorReporter, TypeProvider typeProvider, this._currentLibrary,
-      {TypeSystem typeSystem})
-      : _nullType = typeProvider.nullType,
+    this._errorReporter,
+    TypeProvider typeProvider,
+    this._currentLibrary, {
+    TypeSystem typeSystem,
+    ResourceProvider resourceProvider,
+    DeclaredVariables declaredVariables,
+  })  : _nullType = typeProvider.nullType,
         _futureNullType = typeProvider.futureNullType,
-        _typeSystem = typeSystem ?? new StrongTypeSystemImpl(typeProvider),
+        _typeSystem = typeSystem ?? new Dart2TypeSystem(typeProvider),
         _invalidAccessVerifier =
             new _InvalidAccessVerifier(_errorReporter, _currentLibrary) {
     _inDeprecatedMember = _currentLibrary.hasDeprecated;
+    String libraryPath = _currentLibrary.source.fullName;
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, libraryPath, null /* ContextBuilder */);
+    _workspacePackage = workspace.findPackageFor(libraryPath);
+    _linterContext = LinterContextImpl(null /* allUnits */,
+        null /* currentUnit */, declaredVariables, typeProvider, _typeSystem);
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     ElementAnnotation element =
         resolutionMap.elementAnnotationForAnnotation(node);
+    AstNode parent = node.parent;
     if (element?.isFactory == true) {
-      AstNode parent = node.parent;
       if (parent is MethodDeclaration) {
         _checkForInvalidFactory(parent);
       } else {
@@ -300,52 +326,60 @@
             .reportErrorForNode(HintCode.INVALID_FACTORY_ANNOTATION, node, []);
       }
     } else if (element?.isImmutable == true) {
-      AstNode parent = node.parent;
-      if (parent is! ClassDeclaration) {
+      if (parent is! ClassOrMixinDeclaration && parent is! ClassTypeAlias) {
         _errorReporter.reportErrorForNode(
             HintCode.INVALID_IMMUTABLE_ANNOTATION, node, []);
       }
+    } else if (element?.isLiteral == true) {
+      if (parent is! ConstructorDeclaration ||
+          (parent as ConstructorDeclaration).constKeyword == null) {
+        _errorReporter
+            .reportErrorForNode(HintCode.INVALID_LITERAL_ANNOTATION, node, []);
+      }
+    } else if (element?.isSealed == true) {
+      if (!(parent is ClassDeclaration || parent is ClassTypeAlias)) {
+        _errorReporter.reportErrorForNode(HintCode.INVALID_SEALED_ANNOTATION,
+            node.parent, [node.element.name]);
+      }
     }
-    return super.visitAnnotation(node);
+    super.visitAnnotation(node);
   }
 
   @override
-  Object visitArgumentList(ArgumentList node) {
+  void visitArgumentList(ArgumentList node) {
     for (Expression argument in node.arguments) {
       ParameterElement parameter = argument.staticParameterElement;
       if (parameter?.isOptionalPositional == true) {
         _checkForDeprecatedMemberUse(parameter, argument);
       }
     }
-    return super.visitArgumentList(node);
+    super.visitArgumentList(node);
   }
 
   @override
-  Object visitAsExpression(AsExpression node) {
+  void visitAsExpression(AsExpression node) {
     _checkForUnnecessaryCast(node);
-    return super.visitAsExpression(node);
+    super.visitAsExpression(node);
   }
 
   @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
+  void visitAssignmentExpression(AssignmentExpression node) {
     TokenType operatorType = node.operator.type;
-    if (operatorType == TokenType.EQ) {
-      _checkForInvalidAssignment(node.leftHandSide, node.rightHandSide);
-    } else {
+    if (operatorType != TokenType.EQ) {
       _checkForDeprecatedMemberUse(node.staticElement, node);
     }
-    return super.visitAssignmentExpression(node);
+    super.visitAssignmentExpression(node);
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     _checkForDivisionOptimizationHint(node);
     _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitBinaryExpression(node);
+    super.visitBinaryExpression(node);
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     var element = AbstractClassElementImpl.getImpl(node.declaredElement);
     _enclosingClass = element;
     _invalidAccessVerifier._enclosingClass = element;
@@ -359,7 +393,8 @@
       // Commented out until we decide that we want this hint in the analyzer
       //    checkForOverrideEqualsButNotHashCode(node);
       _checkForImmutable(node);
-      return super.visitClassDeclaration(node);
+      _checkForInvalidSealedSuperclass(node);
+      super.visitClassDeclaration(node);
     } finally {
       _enclosingClass = null;
       _invalidAccessVerifier._enclosingClass = null;
@@ -368,7 +403,14 @@
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
+    _checkForImmutable(node);
+    _checkForInvalidSealedSuperclass(node);
+    super.visitClassTypeAlias(node);
+  }
+
+  @override
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     if (resolutionMap.elementDeclaredByConstructorDeclaration(node).isFactory) {
       if (node.body is BlockFunctionBody) {
         // Check the block for a return statement, if not, create the hint.
@@ -378,23 +420,37 @@
         }
       }
     }
-    return super.visitConstructorDeclaration(node);
+    super.visitConstructorDeclaration(node);
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     _checkForDeprecatedMemberUse(node.uriElement, node);
-    return super.visitExportDirective(node);
+    super.visitExportDirective(node);
   }
 
   @override
-  Object visitFormalParameterList(FormalParameterList node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
+    bool wasInDeprecatedMember = _inDeprecatedMember;
+    if (_hasDeprecatedAnnotation(node.metadata)) {
+      _inDeprecatedMember = true;
+    }
+
+    try {
+      super.visitFieldDeclaration(node);
+    } finally {
+      _inDeprecatedMember = wasInDeprecatedMember;
+    }
+  }
+
+  @override
+  void visitFormalParameterList(FormalParameterList node) {
     _checkRequiredParameter(node);
-    return super.visitFormalParameterList(node);
+    super.visitFormalParameterList(node);
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     bool wasInDeprecatedMember = _inDeprecatedMember;
     ExecutableElement element = node.declaredElement;
     if (element != null && element.hasDeprecated) {
@@ -403,42 +459,43 @@
     try {
       _checkForMissingReturn(
           node.returnType, node.functionExpression.body, element, node);
-      return super.visitFunctionDeclaration(node);
+      super.visitFunctionDeclaration(node);
     } finally {
       _inDeprecatedMember = wasInDeprecatedMember;
     }
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     _checkForDeprecatedMemberUse(node.uriElement, node);
     ImportElement importElement = node.element;
     if (importElement != null && importElement.isDeferred) {
       _checkForLoadLibraryFunction(node, importElement);
     }
-    return super.visitImportDirective(node);
+    super.visitImportDirective(node);
   }
 
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitIndexExpression(node);
+    super.visitIndexExpression(node);
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitInstanceCreationExpression(node);
+    _checkForLiteralConstructorUse(node);
+    super.visitInstanceCreationExpression(node);
   }
 
   @override
-  Object visitIsExpression(IsExpression node) {
+  void visitIsExpression(IsExpression node) {
     _checkAllTypeChecks(node);
-    return super.visitIsExpression(node);
+    super.visitIsExpression(node);
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     bool wasInDeprecatedMember = _inDeprecatedMember;
     ExecutableElement element = node.declaredElement;
     if (element != null && element.hasDeprecated) {
@@ -449,14 +506,14 @@
       //checkForOverridingPrivateMember(node);
       _checkForMissingReturn(node.returnType, node.body, element, node);
       _checkForUnnecessaryNoSuchMethod(node);
-      return super.visitMethodDeclaration(node);
+      super.visitMethodDeclaration(node);
     } finally {
       _inDeprecatedMember = wasInDeprecatedMember;
     }
   }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
+  void visitMethodInvocation(MethodInvocation node) {
     _checkForNullAwareHints(node, node.operator);
     DartType staticInvokeType = node.staticInvokeType;
     Element callElement = staticInvokeType?.element;
@@ -464,63 +521,80 @@
         callElement.name == FunctionElement.CALL_METHOD_NAME) {
       _checkForDeprecatedMemberUse(callElement, node);
     }
-    return super.visitMethodInvocation(node);
+    super.visitMethodInvocation(node);
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     _enclosingClass = node.declaredElement;
     _invalidAccessVerifier._enclosingClass = _enclosingClass;
+
+    bool wasInDeprecatedMember = _inDeprecatedMember;
+    if (_hasDeprecatedAnnotation(node.metadata)) {
+      _inDeprecatedMember = true;
+    }
+
     try {
-      return super.visitMixinDeclaration(node);
+      _checkForImmutable(node);
+      _checkForInvalidSealedSuperclass(node);
+      super.visitMixinDeclaration(node);
     } finally {
       _enclosingClass = null;
       _invalidAccessVerifier._enclosingClass = null;
+      _inDeprecatedMember = wasInDeprecatedMember;
     }
   }
 
   @override
-  Object visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(PostfixExpression node) {
     _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitPostfixExpression(node);
+    super.visitPostfixExpression(node);
   }
 
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
+  void visitPrefixExpression(PrefixExpression node) {
     _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitPrefixExpression(node);
+    super.visitPrefixExpression(node);
   }
 
   @override
-  Object visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(PropertyAccess node) {
     _checkForNullAwareHints(node, node.operator);
-    return super.visitPropertyAccess(node);
+    super.visitPropertyAccess(node);
   }
 
   @override
-  Object visitRedirectingConstructorInvocation(
+  void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitRedirectingConstructorInvocation(node);
+    super.visitRedirectingConstructorInvocation(node);
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     _checkForDeprecatedMemberUseAtIdentifier(node);
     _invalidAccessVerifier.verify(node);
-    return super.visitSimpleIdentifier(node);
+    super.visitSimpleIdentifier(node);
   }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     _checkForDeprecatedMemberUse(node.staticElement, node);
-    return super.visitSuperConstructorInvocation(node);
+    super.visitSuperConstructorInvocation(node);
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    _checkForInvalidAssignment(node.name, node.initializer);
-    return super.visitVariableDeclaration(node);
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    bool wasInDeprecatedMember = _inDeprecatedMember;
+    if (_hasDeprecatedAnnotation(node.metadata)) {
+      _inDeprecatedMember = true;
+    }
+
+    try {
+      super.visitTopLevelVariableDeclaration(node);
+    } finally {
+      _inDeprecatedMember = wasInDeprecatedMember;
+    }
   }
 
   /// Check for the passed is expression for the unnecessary type check hint
@@ -606,8 +680,7 @@
     bool isLocalParameter(Element element, AstNode node) {
       if (element is ParameterElement) {
         ExecutableElement definingFunction = element.enclosingElement;
-        FunctionBody body =
-            node.getAncestor((ancestor) => ancestor is FunctionBody);
+        FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
         while (body != null) {
           ExecutableElement enclosingFunction;
           AstNode parent = body.parent;
@@ -621,7 +694,7 @@
           if (enclosingFunction == definingFunction) {
             return true;
           }
-          body = parent?.getAncestor((ancestor) => ancestor is FunctionBody);
+          body = parent?.thisOrAncestorOfType<FunctionBody>();
         }
       }
       return false;
@@ -643,11 +716,16 @@
       } else if (displayName == FunctionElement.CALL_METHOD_NAME &&
           node is MethodInvocation &&
           node.staticInvokeType is InterfaceType) {
-        displayName =
-            "${resolutionMap.staticInvokeTypeForInvocationExpression(node).displayName}.${element.displayName}";
+        DartType staticInvokeType =
+            resolutionMap.staticInvokeTypeForInvocationExpression(node);
+        displayName = "${staticInvokeType.displayName}.${element.displayName}";
       }
-      _errorReporter.reportErrorForNode(
-          HintCode.DEPRECATED_MEMBER_USE, node, [displayName]);
+      LibraryElement library =
+          element is LibraryElement ? element : element.library;
+      HintCode hintCode = _workspacePackage.contains(library.source.fullName)
+          ? HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE
+          : HintCode.DEPRECATED_MEMBER_USE;
+      _errorReporter.reportErrorForNode(hintCode, node, [displayName]);
     }
   }
 
@@ -718,7 +796,13 @@
     return false;
   }
 
-  void _checkForImmutable(ClassDeclaration node) {
+  /// Checks whether [node] violates the rules of [immutable].
+  ///
+  /// If [node] is marked with [immutable] or inherits from a class or mixin
+  /// marked with [immutable], this function searches the fields of [node] and
+  /// its superclasses, reporting a hint if any non-final instance fields are
+  /// found.
+  void _checkForImmutable(NamedCompilationUnitMember node) {
     /// Return `true` if the given class [element] is annotated with the
     /// `@immutable` annotation.
     bool isImmutable(ClassElement element) {
@@ -757,79 +841,41 @@
 
     /// Return `true` if the given class [element] defines a non-final instance
     /// field.
-    bool hasNonFinalInstanceField(ClassElement element) {
-      for (FieldElement field in element.fields) {
-        if (!field.isSynthetic && !field.isFinal && !field.isStatic) {
-          return true;
-        }
-      }
-      return false;
+    Iterable<String> nonFinalInstanceFields(ClassElement element) {
+      return element.fields
+          .where((FieldElement field) =>
+              !field.isSynthetic && !field.isFinal && !field.isStatic)
+          .map((FieldElement field) => '${element.name}.${field.name}');
     }
 
     /// Return `true` if the given class [element] defines or inherits a
     /// non-final field.
-    bool hasOrInheritsNonFinalInstanceField(
+    Iterable<String> definedOrInheritedNonFinalInstanceFields(
         ClassElement element, HashSet<ClassElement> visited) {
+      Iterable<String> nonFinalFields = [];
       if (visited.add(element)) {
-        if (hasNonFinalInstanceField(element)) {
-          return true;
-        }
-        for (InterfaceType mixin in element.mixins) {
-          if (hasNonFinalInstanceField(mixin.element)) {
-            return true;
-          }
-        }
+        nonFinalFields = nonFinalInstanceFields(element);
+        nonFinalFields = nonFinalFields.followedBy(element.mixins.expand(
+            (InterfaceType mixin) => nonFinalInstanceFields(mixin.element)));
         if (element.supertype != null) {
-          return hasOrInheritsNonFinalInstanceField(
-              element.supertype.element, visited);
+          nonFinalFields = nonFinalFields.followedBy(
+              definedOrInheritedNonFinalInstanceFields(
+                  element.supertype.element, visited));
         }
       }
-      return false;
+      return nonFinalFields;
     }
 
     ClassElement element = node.declaredElement;
-    if (isOrInheritsImmutable(element, new HashSet<ClassElement>()) &&
-        hasOrInheritsNonFinalInstanceField(
-            element, new HashSet<ClassElement>())) {
-      _errorReporter.reportErrorForNode(HintCode.MUST_BE_IMMUTABLE, node.name);
-    }
-  }
-
-  /// This verifies that the passed left hand side and right hand side represent
-  /// a valid assignment.
-  ///
-  /// This method corresponds to ErrorVerifier.checkForInvalidAssignment.
-  ///
-  /// @param lhs the left hand side expression
-  /// @param rhs the right hand side expression
-  /// @return `true` if and only if an error code is generated on the passed
-  ///         node
-  /// See [HintCode.INVALID_ASSIGNMENT].
-  bool _checkForInvalidAssignment(Expression lhs, Expression rhs) {
-    if (lhs == null || rhs == null) {
-      return false;
-    }
-    VariableElement leftVariableElement = ErrorVerifier.getVariableElement(lhs);
-    DartType leftType = (leftVariableElement == null)
-        ? ErrorVerifier.getStaticType(lhs)
-        : leftVariableElement.type;
-    DartType staticRightType = ErrorVerifier.getStaticType(rhs);
-    if (!_typeSystem.isAssignableTo(staticRightType, leftType,
-        isDeclarationCast: true)) {
-      // The warning was generated on this rhs
-      return false;
-    }
-    // Test for, and then generate the hint
-    DartType bestRightType = rhs.staticType;
-    if (leftType != null && bestRightType != null) {
-      if (!_typeSystem.isAssignableTo(bestRightType, leftType,
-          isDeclarationCast: true)) {
-        _errorReporter.reportTypeErrorForNode(
-            HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]);
-        return true;
+    if (isOrInheritsImmutable(element, new HashSet<ClassElement>())) {
+      Iterable<String> nonFinalFields =
+          definedOrInheritedNonFinalInstanceFields(
+              element, new HashSet<ClassElement>());
+      if (nonFinalFields.isNotEmpty) {
+        _errorReporter.reportErrorForNode(
+            HintCode.MUST_BE_IMMUTABLE, node.name, [nonFinalFields.join(', ')]);
       }
     }
-    return false;
   }
 
   void _checkForInvalidFactory(MethodDeclaration decl) {
@@ -870,6 +916,64 @@
         decl.name, [decl.name.toString()]);
   }
 
+  void _checkForInvalidSealedSuperclass(NamedCompilationUnitMember node) {
+    bool currentPackageContains(Element element) {
+      String elementLibraryPath = element.library.source.fullName;
+      return _workspacePackage.contains(elementLibraryPath);
+    }
+
+    // [NamedCompilationUnitMember.declaredElement] is not necessarily a
+    // ClassElement, but [_checkForInvalidSealedSuperclass] should only be
+    // called with a [ClassOrMixinDeclaration], or a [ClassTypeAlias]. The
+    // `declaredElement` of these specific classes is a [ClassElement].
+    ClassElement element = node.declaredElement;
+    // TODO(srawlins): Perhaps replace this with a getter on Element, like
+    // `Element.hasOrInheritsSealed`?
+    for (InterfaceType supertype in element.allSupertypes) {
+      ClassElement superclass = supertype.element;
+      if (superclass.hasSealed) {
+        if (!currentPackageContains(superclass)) {
+          if (element.superclassConstraints.contains(supertype)) {
+            // This is a special violation of the sealed class contract,
+            // requiring specific messaging.
+            _errorReporter.reportErrorForNode(HintCode.MIXIN_ON_SEALED_CLASS,
+                node, [superclass.name.toString()]);
+          } else {
+            // This is a regular violation of the sealed class contract.
+            _errorReporter.reportErrorForNode(HintCode.SUBTYPE_OF_SEALED_CLASS,
+                node, [superclass.name.toString()]);
+          }
+        }
+      }
+    }
+  }
+
+  /// Check that the instance creation node is const if the constructor is
+  /// marked with [literal].
+  _checkForLiteralConstructorUse(InstanceCreationExpression node) {
+    ConstructorName constructorName = node.constructorName;
+    ConstructorElement constructor = constructorName.staticElement;
+    if (constructor == null) {
+      return;
+    }
+    if (!node.isConst &&
+        constructor.hasLiteral &&
+        _linterContext.canBeConst(node)) {
+      // Echoing jwren's TODO from _checkForDeprecatedMemberUse:
+      // TODO(jwren) We should modify ConstructorElement.getDisplayName(), or
+      // have the logic centralized elsewhere, instead of doing this logic
+      // here.
+      String fullConstructorName = constructorName.type.name.name;
+      if (constructorName.name != null) {
+        fullConstructorName = '$fullConstructorName.${constructorName.name}';
+      }
+      HintCode hint = node.keyword?.keyword == Keyword.NEW
+          ? HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW
+          : HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR;
+      _errorReporter.reportErrorForNode(hint, node, [fullConstructorName]);
+    }
+  }
+
   /// Check that the imported library does not define a loadLibrary function.
   /// The import has already been determined to be deferred when this is called.
   ///
@@ -919,48 +1023,16 @@
         return;
       }
 
-      if (_typeSystem is StrongTypeSystemImpl) {
-        var flattenedType = body.isAsynchronous
-            ? returnType.flattenFutures(_typeSystem)
-            : returnType;
+      var flattenedType =
+          body.isAsynchronous ? _typeSystem.flatten(returnType) : returnType;
 
-        // dynamic/Null/void are allowed to omit a return.
-        if (flattenedType.isDynamic ||
-            flattenedType.isDartCoreNull ||
-            flattenedType.isVoid) {
-          return;
-        }
-        // Otherwise issue a warning if the block doesn't have a return.
-        if (!ExitDetector.exits(body)) {
-          _errorReporter.reportErrorForNode(
-              HintCode.MISSING_RETURN, errorNode, [returnType.displayName]);
-        }
+      // dynamic/Null/void are allowed to omit a return.
+      if (flattenedType.isDynamic ||
+          flattenedType.isDartCoreNull ||
+          flattenedType.isVoid) {
         return;
       }
-
-      // TODO(leafp): Delete this non-strong mode path
-      // Check that the type is resolvable and not "void"
-      if (returnType.isVoid ||
-          (body.isAsynchronous && _isFutureVoid(returnType))) {
-        return;
-      }
-      // For async, give no hint if the return type does not matter, i.e.
-      // dynamic, Future<Null> or Future<dynamic>.
-      if (body.isAsynchronous) {
-        if (returnType.isDynamic) {
-          return;
-        }
-        if (returnType is InterfaceType && returnType.isDartAsyncFuture) {
-          DartType futureArgument = returnType.typeArguments[0];
-          if (futureArgument.isDynamic ||
-              futureArgument.isDartCoreNull ||
-              futureArgument.isVoid ||
-              futureArgument.isObject) {
-            return;
-          }
-        }
-      }
-      // Check the block for a return statement, if not, create the hint
+      // Otherwise issue a warning if the block doesn't have a return.
       if (!ExitDetector.exits(body)) {
         _errorReporter.reportErrorForNode(
             HintCode.MISSING_RETURN, errorNode, [returnType.displayName]);
@@ -1177,12 +1249,21 @@
 //    }
 //    return false;
 //  }
+//
+//  /// Return `true` if the given [type] represents `Future<void>`.
+//  bool _isFutureVoid(DartType type) {
+//    if (type.isDartAsyncFuture) {
+//      List<DartType> typeArgs = (type as InterfaceType).typeArguments;
+//      if (typeArgs.length == 1 && typeArgs[0].isVoid) {
+//        return true;
+//      }
+//    }
+//    return false;
+//  }
 
-  /// Return `true` if the given [type] represents `Future<void>`.
-  bool _isFutureVoid(DartType type) {
-    if (type.isDartAsyncFuture) {
-      List<DartType> typeArgs = (type as InterfaceType).typeArguments;
-      if (typeArgs.length == 1 && typeArgs[0].isVoid) {
+  static bool _hasDeprecatedAnnotation(List<Annotation> annotations) {
+    for (var i = 0; i < annotations.length; i++) {
+      if (annotations[i].elementAnnotation.isDeprecated) {
         return true;
       }
     }
@@ -1272,7 +1353,7 @@
 /// Instances of the class `Dart2JSVerifier` traverse an AST structure looking
 /// for hints for code that will be compiled to JS, such as
 /// [HintCode.IS_DOUBLE].
-class Dart2JSVerifier extends RecursiveAstVisitor<Object> {
+class Dart2JSVerifier extends RecursiveAstVisitor<void> {
   /// The name of the `double` type.
   static String _DOUBLE_TYPE_NAME = "double";
 
@@ -1285,9 +1366,9 @@
   Dart2JSVerifier(this._errorReporter);
 
   @override
-  Object visitIsExpression(IsExpression node) {
+  void visitIsExpression(IsExpression node) {
     _checkForIsDoubleHints(node);
-    return super.visitIsExpression(node);
+    super.visitIsExpression(node);
   }
 
   /// Check for instances of `x is double`, `x is int`, `x is! double` and
@@ -1330,7 +1411,7 @@
 }
 
 /// A visitor that finds dead code and unused labels.
-class DeadCodeVerifier extends RecursiveAstVisitor<Object> {
+class DeadCodeVerifier extends RecursiveAstVisitor<void> {
   /// The error reporter by which errors will be reported.
   final ErrorReporter _errorReporter;
 
@@ -1344,10 +1425,10 @@
   /// to the given [errorReporter] and will use the given [typeSystem] if one is
   /// provided.
   DeadCodeVerifier(this._errorReporter, {TypeSystem typeSystem})
-      : this._typeSystem = typeSystem ?? new StrongTypeSystemImpl(null);
+      : this._typeSystem = typeSystem ?? new Dart2TypeSystem(null);
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     Token operator = node.operator;
     bool isAmpAmp = operator.type == TokenType.AMPERSAND_AMPERSAND;
     bool isBarBar = operator.type == TokenType.BAR_BAR;
@@ -1363,14 +1444,14 @@
                 HintCode.DEAD_CODE, node.rightOperand);
             // Only visit the LHS:
             lhsCondition?.accept(this);
-            return null;
+            return;
           } else if (value == false && isAmpAmp) {
             // Report error on "if" block: false && !e!
             _errorReporter.reportErrorForNode(
                 HintCode.DEAD_CODE, node.rightOperand);
             // Only visit the LHS:
             lhsCondition?.accept(this);
-            return null;
+            return;
           }
         }
       }
@@ -1394,27 +1475,25 @@
 //              }
 //            }
     }
-    return super.visitBinaryExpression(node);
+    super.visitBinaryExpression(node);
   }
 
   /// For each block, this method reports and error on all statements between
   /// the end of the block and the first return statement (assuming there it is
   /// not at the end of the block.)
   @override
-  Object visitBlock(Block node) {
+  void visitBlock(Block node) {
     NodeList<Statement> statements = node.statements;
     _checkForDeadStatementsInNodeList(statements);
-    return null;
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     labelTracker?.recordUsage(node.label?.name);
-    return null;
   }
 
   @override
-  Object visitConditionalExpression(ConditionalExpression node) {
+  void visitConditionalExpression(ConditionalExpression node) {
     Expression conditionExpression = node.condition;
     conditionExpression?.accept(this);
     if (!_isDebugConstant(conditionExpression)) {
@@ -1426,27 +1505,26 @@
           _errorReporter.reportErrorForNode(
               HintCode.DEAD_CODE, node.elseExpression);
           node.thenExpression?.accept(this);
-          return null;
+          return;
         } else {
           // Report error on "if" block: false ? !1! : 2
           _errorReporter.reportErrorForNode(
               HintCode.DEAD_CODE, node.thenExpression);
           node.elseExpression?.accept(this);
-          return null;
+          return;
         }
       }
     }
-    return super.visitConditionalExpression(node);
+    super.visitConditionalExpression(node);
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     labelTracker?.recordUsage(node.label?.name);
-    return null;
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) {
+  void visitExportDirective(ExportDirective node) {
     ExportElement exportElement = node.element;
     if (exportElement != null) {
       // The element is null when the URI is invalid.
@@ -1457,11 +1535,11 @@
         }
       }
     }
-    return super.visitExportDirective(node);
+    super.visitExportDirective(node);
   }
 
   @override
-  Object visitIfStatement(IfStatement node) {
+  void visitIfStatement(IfStatement node) {
     Expression conditionExpression = node.condition;
     conditionExpression?.accept(this);
     if (!_isDebugConstant(conditionExpression)) {
@@ -1475,22 +1553,22 @@
             _errorReporter.reportErrorForNode(
                 HintCode.DEAD_CODE, elseStatement);
             node.thenStatement?.accept(this);
-            return null;
+            return;
           }
         } else {
           // Report error on if block: if (false) {!} else {}
           _errorReporter.reportErrorForNode(
               HintCode.DEAD_CODE, node.thenStatement);
           node.elseStatement?.accept(this);
-          return null;
+          return;
         }
       }
     }
-    return super.visitIfStatement(node);
+    super.visitIfStatement(node);
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     ImportElement importElement = node.element;
     if (importElement != null) {
       // The element is null when the URI is invalid, but not when the URI is
@@ -1502,34 +1580,33 @@
         }
       }
     }
-    return super.visitImportDirective(node);
+    super.visitImportDirective(node);
   }
 
   @override
-  Object visitLabeledStatement(LabeledStatement node) {
+  void visitLabeledStatement(LabeledStatement node) {
     _pushLabels(node.labels);
     try {
       super.visitLabeledStatement(node);
     } finally {
       _popLabels();
     }
-    return null;
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     _checkForDeadStatementsInNodeList(node.statements, allowMandated: true);
-    return super.visitSwitchCase(node);
+    super.visitSwitchCase(node);
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     _checkForDeadStatementsInNodeList(node.statements, allowMandated: true);
-    return super.visitSwitchDefault(node);
+    super.visitSwitchDefault(node);
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSwitchStatement(SwitchStatement node) {
     List<Label> labels = <Label>[];
     for (SwitchMember member in node.members) {
       labels.addAll(member.labels);
@@ -1540,11 +1617,10 @@
     } finally {
       _popLabels();
     }
-    return null;
   }
 
   @override
-  Object visitTryStatement(TryStatement node) {
+  void visitTryStatement(TryStatement node) {
     node.body?.accept(this);
     node.finallyBlock?.accept(this);
     NodeList<CatchClause> catchClauses = node.catchClauses;
@@ -1571,7 +1647,7 @@
               int length = lastCatchClause.end - offset;
               _errorReporter.reportErrorForOffset(
                   HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length);
-              return null;
+              return;
             }
           }
           int length = visitedTypes.length;
@@ -1586,7 +1662,7 @@
                   offset,
                   length,
                   [currentType.displayName, type.displayName]);
-              return null;
+              return;
             }
           }
           visitedTypes.add(currentType);
@@ -1605,15 +1681,14 @@
           int length = lastCatchClause.end - offset;
           _errorReporter.reportErrorForOffset(
               HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length);
-          return null;
+          return;
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     Expression conditionExpression = node.condition;
     conditionExpression?.accept(this);
     if (!_isDebugConstant(conditionExpression)) {
@@ -1623,12 +1698,11 @@
         if (result.value.toBoolValue() == false) {
           // Report error on while block: while (false) {!}
           _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body);
-          return null;
+          return;
         }
       }
     }
     node.body?.accept(this);
-    return null;
   }
 
   /// Resolve the names in the given [combinator] in the scope of the given
@@ -2229,7 +2303,7 @@
 
 /// Instances of the class `EnumMemberBuilder` build the members in enum
 /// declarations.
-class EnumMemberBuilder extends RecursiveAstVisitor<Object> {
+class EnumMemberBuilder extends RecursiveAstVisitor<void> {
   /// The type provider used to access the types needed to build an element
   /// model for enum declarations.
   final TypeProvider _typeProvider;
@@ -2241,7 +2315,7 @@
   EnumMemberBuilder(this._typeProvider);
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     //
     // Finish building the enum.
     //
@@ -2307,7 +2381,7 @@
     enumElement.accessors = getters;
     // Client code isn't allowed to invoke the constructor, so we do not model
     // it.
-    return super.visitEnumDeclaration(node);
+    super.visitEnumDeclaration(node);
   }
 
   /// Create a getter that corresponds to the given [field].
@@ -3592,8 +3666,8 @@
   ///
   /// The returned type may be partially or completely unknown, denoted with an
   /// unknown type `?`, for example `List<?>` or `(?, int) -> void`.
-  /// You can use [StrongTypeSystemImpl.upperBoundForType] or
-  /// [StrongTypeSystemImpl.lowerBoundForType] if you would prefer a known type
+  /// You can use [Dart2TypeSystem.upperBoundForType] or
+  /// [Dart2TypeSystem.lowerBoundForType] if you would prefer a known type
   /// that represents the bound of the context type.
   static DartType getContext(AstNode node) => node?.getProperty(_typeProperty);
 
@@ -3863,38 +3937,38 @@
             nameScope: nameScope);
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     if (_shouldBeSkipped(node)) {
       return null;
     }
-    return super.visitBlockFunctionBody(node);
+    super.visitBlockFunctionBody(node);
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     if (_shouldBeSkipped(node)) {
       return null;
     }
-    return super.visitExpressionFunctionBody(node);
+    super.visitExpressionFunctionBody(node);
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     if (node.isStatic) {
       _addStaticVariables(node.fields.variables);
     }
-    return super.visitFieldDeclaration(node);
+    super.visitFieldDeclaration(node);
   }
 
   @override
-  Object visitNode(AstNode node) {
-    return super.visitNode(node);
+  void visitNode(AstNode node) {
+    super.visitNode(node);
   }
 
   @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _addStaticVariables(node.variables.variables);
-    return super.visitTopLevelVariableDeclaration(node);
+    super.visitTopLevelVariableDeclaration(node);
   }
 
   /// Add all of the [variables] with initializers to the list of variables
@@ -4189,7 +4263,7 @@
     if (fnType.typeFormals.isEmpty) {
       // TODO(jmesserly): this is a legal subtype. We don't currently infer
       // here, but we could.  This is similar to
-      // StrongTypeSystemImpl.inferFunctionTypeInstantiation, but we don't
+      // Dart2TypeSystem.inferFunctionTypeInstantiation, but we don't
       // have the FunctionType yet for the current node, so it's not quite
       // straightforward to apply.
       return null;
@@ -4297,12 +4371,12 @@
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     AstNode parent = node.parent;
     if (identical(parent, _enclosingClassDeclaration) ||
         identical(parent, _enclosingFunctionTypeAlias) ||
         identical(parent, _enclosingMixinDeclaration)) {
-      return null;
+      return;
     }
     node.name?.accept(this);
     node.constructorName?.accept(this);
@@ -4320,11 +4394,10 @@
     } else {
       elementAnnotationImpl.annotationAst = _createCloner().cloneNode(node);
     }
-    return null;
   }
 
   @override
-  Object visitArgumentList(ArgumentList node) {
+  void visitArgumentList(ArgumentList node) {
     DartType callerType = InferenceContext.getContext(node);
     if (callerType is FunctionType) {
       Map<String, DartType> namedParameterTypes =
@@ -4364,26 +4437,24 @@
         }
       }
     }
-    return super.visitArgumentList(node);
+    super.visitArgumentList(node);
   }
 
   @override
-  Object visitAssertInitializer(AssertInitializer node) {
+  void visitAssertInitializer(AssertInitializer node) {
     InferenceContext.setType(node.condition, typeProvider.boolType);
     super.visitAssertInitializer(node);
-    return null;
   }
 
   @override
-  Object visitAssertStatement(AssertStatement node) {
+  void visitAssertStatement(AssertStatement node) {
     InferenceContext.setType(node.condition, typeProvider.boolType);
     super.visitAssertStatement(node);
     _propagateTrueState(node.condition);
-    return null;
   }
 
   @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
+  void visitAssignmentExpression(AssignmentExpression node) {
     node.leftHandSide?.accept(this);
     TokenType operator = node.operator.type;
     if (operator == TokenType.EQ ||
@@ -4394,21 +4465,20 @@
     node.rightHandSide?.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitAwaitExpression(AwaitExpression node) {
+  void visitAwaitExpression(AwaitExpression node) {
     DartType contextType = InferenceContext.getContext(node);
     if (contextType != null) {
       var futureUnion = _createFutureOr(contextType);
       InferenceContext.setType(node.expression, futureUnion);
     }
-    return super.visitAwaitExpression(node);
+    super.visitAwaitExpression(node);
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     TokenType operatorType = node.operator.type;
     Expression leftOperand = node.leftOperand;
     Expression rightOperand = node.rightOperand;
@@ -4483,11 +4553,10 @@
       rightOperand?.accept(this);
     }
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     _overrideManager.enterScope();
     try {
       inferenceContext.pushReturnContext(node);
@@ -4496,28 +4565,26 @@
       _overrideManager.exitScope();
       inferenceContext.popReturnContext(node);
     }
-    return null;
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) {
+  void visitBreakStatement(BreakStatement node) {
     //
     // We do not visit the label because it needs to be visited in the context
     // of the statement.
     //
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitCascadeExpression(CascadeExpression node) {
+  void visitCascadeExpression(CascadeExpression node) {
     InferenceContext.setTypeFromNode(node.target, node);
-    return super.visitCascadeExpression(node);
+    super.visitCascadeExpression(node);
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     //
     // Resolve the metadata in the library scope.
     //
@@ -4538,12 +4605,11 @@
       enclosingClass = outerType;
       _enclosingClassDeclaration = null;
     }
-    return null;
   }
 
   /// Implementation of this method should be synchronized with
   /// [visitClassDeclaration].
-  visitClassDeclarationIncrementally(ClassDeclaration node) {
+  void visitClassDeclarationIncrementally(ClassDeclaration node) {
     //
     // Resolve the metadata in the library scope.
     //
@@ -4559,31 +4625,29 @@
   }
 
   @override
-  Object visitComment(Comment node) {
+  void visitComment(Comment node) {
     AstNode parent = node.parent;
     if (parent is FunctionDeclaration ||
         parent is FunctionTypeAlias ||
         parent is ConstructorDeclaration ||
         parent is MethodDeclaration) {
-      return null;
+      return;
     }
     super.visitComment(node);
-    return null;
   }
 
   @override
-  Object visitCommentReference(CommentReference node) {
+  void visitCommentReference(CommentReference node) {
     //
     // We do not visit the identifier because it needs to be visited in the
     // context of the reference.
     //
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     _overrideManager.enterScope();
     try {
       NodeList<Directive> directives = node.directives;
@@ -4601,11 +4665,10 @@
     }
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitConditionalExpression(ConditionalExpression node) {
+  void visitConditionalExpression(ConditionalExpression node) {
     Expression condition = node.condition;
     condition?.accept(this);
     Expression thenExpression = node.thenExpression;
@@ -4652,11 +4715,10 @@
       _propagateFalseState(condition);
       _propagateState(elseExpression);
     }
-    return null;
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     FunctionBody outerFunctionBody = _currentFunctionBody;
     try {
@@ -4672,7 +4734,6 @@
     ConstructorElementImpl constructor = node.declaredElement;
     constructor.constantInitializers =
         _createCloner().cloneNodeList(node.initializers);
-    return null;
   }
 
   @override
@@ -4688,7 +4749,7 @@
   }
 
   @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+  void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     //
     // We visit the expression, but do not visit the field name because it needs
     // to be visited in the context of the constructor field initializer node.
@@ -4698,11 +4759,10 @@
     node.expression?.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitConstructorName(ConstructorName node) {
+  void visitConstructorName(ConstructorName node) {
     //
     // We do not visit either the type name, because it won't be visited anyway,
     // or the name, because it needs to be visited in the context of the
@@ -4710,22 +4770,20 @@
     //
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitContinueStatement(ContinueStatement node) {
+  void visitContinueStatement(ContinueStatement node) {
     //
     // We do not visit the label because it needs to be visited in the context
     // of the statement.
     //
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(DefaultFormalParameter node) {
     InferenceContext.setType(node.defaultValue,
         resolutionMap.elementDeclaredByFormalParameter(node.parameter)?.type);
     super.visitDefaultFormalParameter(node);
@@ -4741,11 +4799,10 @@
       (element as ConstVariableElement).constantInitializer =
           _createCloner().cloneNode(node.defaultValue);
     }
-    return null;
   }
 
   @override
-  Object visitDoStatement(DoStatement node) {
+  void visitDoStatement(DoStatement node) {
     _overrideManager.enterScope();
     try {
       InferenceContext.setType(node.condition, typeProvider.boolType);
@@ -4755,19 +4812,18 @@
     }
     // TODO(brianwilkerson) If the loop can only be exited because the condition
     // is false, then propagateFalseState(node.getCondition());
-    return null;
   }
 
   @override
-  Object visitEmptyFunctionBody(EmptyFunctionBody node) {
+  void visitEmptyFunctionBody(EmptyFunctionBody node) {
     if (resolveOnlyCommentInFunctionBody) {
-      return null;
+      return;
     }
-    return super.visitEmptyFunctionBody(node);
+    super.visitEmptyFunctionBody(node);
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     //
     // Resolve the metadata in the library scope
     // and associate the annotations with the element.
@@ -4792,13 +4848,12 @@
       enclosingClass = outerType;
       _enclosingClassDeclaration = null;
     }
-    return null;
   }
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     if (resolveOnlyCommentInFunctionBody) {
-      return null;
+      return;
     }
     _overrideManager.enterScope();
     try {
@@ -4808,7 +4863,7 @@
 
       DartType type = node.expression.staticType;
       if (_enclosingFunction.isAsynchronous) {
-        type = type.flattenFutures(typeSystem);
+        type = typeSystem.flatten(type);
       }
       if (type != null) {
         inferenceContext.addReturnOrYieldType(type);
@@ -4817,11 +4872,10 @@
       _overrideManager.exitScope();
       inferenceContext.popReturnContext(node);
     }
-    return null;
   }
 
   @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
+  void visitFieldDeclaration(FieldDeclaration node) {
     _overrideManager.enterScope();
     try {
       super.visitFieldDeclaration(node);
@@ -4831,18 +4885,16 @@
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
-    return null;
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
+  void visitForEachStatement(ForEachStatement node) {
     _overrideManager.enterScope();
     try {
       super.visitForEachStatement(node);
     } finally {
       _overrideManager.exitScope();
     }
-    return null;
   }
 
   @override
@@ -4915,14 +4967,13 @@
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     _overrideManager.enterScope();
     try {
       super.visitForStatement(node);
     } finally {
       _overrideManager.exitScope();
     }
-    return null;
   }
 
   @override
@@ -4944,7 +4995,7 @@
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     FunctionBody outerFunctionBody = _currentFunctionBody;
     try {
@@ -4958,7 +5009,6 @@
       _currentFunctionBody = outerFunctionBody;
       _enclosingFunction = outerFunction;
     }
-    return null;
   }
 
   @override
@@ -4968,7 +5018,7 @@
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     ExecutableElement outerFunction = _enclosingFunction;
     FunctionBody outerFunctionBody = _currentFunctionBody;
     try {
@@ -4977,8 +5027,7 @@
       _overrideManager.enterScope();
       try {
         DartType functionType = InferenceContext.getContext(node);
-        var ts = typeSystem;
-        if (functionType is FunctionType && ts is StrongTypeSystemImpl) {
+        if (functionType is FunctionType) {
           functionType =
               matchFunctionTypeParameters(node.typeParameters, functionType);
           if (functionType is FunctionType) {
@@ -4995,21 +5044,19 @@
       _currentFunctionBody = outerFunctionBody;
       _enclosingFunction = outerFunction;
     }
-    return null;
   }
 
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.function?.accept(this);
     node.accept(elementResolver);
     _inferArgumentTypesForInvocation(node);
     node.argumentList?.accept(this);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     // Resolve the metadata in the library scope.
     if (node.metadata != null) {
       node.metadata.accept(this);
@@ -5021,7 +5068,6 @@
     } finally {
       _enclosingFunctionTypeAlias = outerAlias;
     }
-    return null;
   }
 
   @override
@@ -5031,20 +5077,19 @@
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) => null;
+  void visitGenericFunctionType(GenericFunctionType node) {}
 
   @override
-  Object visitGenericTypeAliasInFunctionScope(GenericTypeAlias node) {
+  void visitGenericTypeAliasInFunctionScope(GenericTypeAlias node) {
     super.visitGenericTypeAliasInFunctionScope(node);
     safelyVisitComment(node.documentationComment);
-    return null;
   }
 
   @override
-  Object visitHideCombinator(HideCombinator node) => null;
+  void visitHideCombinator(HideCombinator node) {}
 
   @override
-  Object visitIfStatement(IfStatement node) {
+  void visitIfStatement(IfStatement node) {
     Expression condition = node.condition;
     InferenceContext.setType(condition, typeProvider.boolType);
     condition?.accept(this);
@@ -5103,11 +5148,10 @@
       perBranchOverrides.add(elseOverrides);
       _overrideManager.mergeOverrides(perBranchOverrides);
     }
-    return null;
   }
 
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     node.target?.accept(this);
     node.accept(elementResolver);
     var method = node.staticElement;
@@ -5117,27 +5161,25 @@
     }
     node.index?.accept(this);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     node.constructorName?.accept(this);
     _inferArgumentTypesForInstanceCreate(node);
     node.argumentList?.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitLabel(Label node) => null;
+  void visitLabel(Label node) {}
 
   @override
-  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+  void visitLibraryIdentifier(LibraryIdentifier node) {}
 
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     InterfaceType listT;
 
     if (node.typeArguments != null) {
@@ -5158,11 +5200,10 @@
       InferenceContext.clearType(node);
     }
     super.visitListLiteral(node);
-    return null;
   }
 
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     InterfaceType mapT;
     if (node.typeArguments != null) {
       var targs = node.typeArguments.arguments.map((t) => t.type).toList();
@@ -5171,6 +5212,15 @@
       }
     } else {
       mapT = typeAnalyzer.inferMapType(node, downwards: true);
+      if (mapT != null &&
+          node.typeArguments == null &&
+          node.entries.isEmpty &&
+          typeSystem.isAssignableTo(typeProvider.iterableObjectType, mapT) &&
+          !typeSystem.isAssignableTo(typeProvider.mapObjectObjectType, mapT)) {
+        // The node is really an empty set literal with no type arguments, so
+        // don't try to visit the replaced map literal.
+        return;
+      }
     }
     if (mapT != null) {
       DartType kType = mapT.typeArguments[0];
@@ -5184,11 +5234,10 @@
       InferenceContext.clearType(node);
     }
     super.visitMapLiteral(node);
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     FunctionBody outerFunctionBody = _currentFunctionBody;
     try {
@@ -5202,7 +5251,6 @@
       _currentFunctionBody = outerFunctionBody;
       _enclosingFunction = outerFunction;
     }
-    return null;
   }
 
   @override
@@ -5212,7 +5260,7 @@
   }
 
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
+  void visitMethodInvocation(MethodInvocation node) {
     //
     // We visit the target and argument list, but do not visit the method name
     // because it needs to be visited in the context of the invocation.
@@ -5223,11 +5271,10 @@
     _inferArgumentTypesForInvocation(node);
     node.argumentList?.accept(this);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     //
     // Resolve the metadata in the library scope.
     //
@@ -5248,31 +5295,29 @@
       enclosingClass = outerType;
       _enclosingMixinDeclaration = null;
     }
-    return null;
   }
 
   @override
-  Object visitNamedExpression(NamedExpression node) {
+  void visitNamedExpression(NamedExpression node) {
     InferenceContext.setTypeFromNode(node.expression, node);
-    return super.visitNamedExpression(node);
+    super.visitNamedExpression(node);
   }
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     node.visitChildren(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+  void visitParenthesizedExpression(ParenthesizedExpression node) {
     InferenceContext.setTypeFromNode(node.expression, node);
-    return super.visitParenthesizedExpression(node);
+    super.visitParenthesizedExpression(node);
   }
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     //
     // We visit the prefix, but do not visit the identifier because it needs to
     // be visited in the context of the prefix.
@@ -5280,11 +5325,10 @@
     node.prefix?.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(PropertyAccess node) {
     //
     // We visit the target, but do not visit the property name because it needs
     // to be visited in the context of the property access node.
@@ -5292,11 +5336,10 @@
     node.target?.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitRedirectingConstructorInvocation(
+  void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
     //
     // We visit the argument list, but do not visit the optional identifier
@@ -5308,11 +5351,10 @@
     node.argumentList?.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitReturnStatement(ReturnStatement node) {
+  void visitReturnStatement(ReturnStatement node) {
     Expression e = node.expression;
     InferenceContext.setType(e, inferenceContext.returnContext);
     super.visitReturnStatement(node);
@@ -5321,18 +5363,44 @@
     // we're processing erroneous code.
     if (type != null && _enclosingFunction?.isGenerator == false) {
       if (_enclosingFunction.isAsynchronous) {
-        type = type.flattenFutures(typeSystem);
+        type = typeSystem.flatten(type);
       }
       inferenceContext.addReturnOrYieldType(type);
     }
-    return null;
   }
 
   @override
-  Object visitShowCombinator(ShowCombinator node) => null;
+  void visitSetLiteral(SetLiteral node) {
+    InterfaceType setT;
+
+    TypeArgumentList typeArguments = node.typeArguments;
+    if (typeArguments != null) {
+      if (typeArguments.length == 1) {
+        DartType elementType = typeArguments.arguments[0].type;
+        if (!elementType.isDynamic) {
+          setT = typeProvider.setType.instantiate([elementType]);
+        }
+      }
+    } else {
+      setT = typeAnalyzer.inferSetType(node, downwards: true);
+    }
+    if (setT != null) {
+      DartType eType = setT.typeArguments[0];
+      for (Expression child in node.elements) {
+        InferenceContext.setType(child, eType);
+      }
+      InferenceContext.setType(node, setT);
+    } else {
+      InferenceContext.clearType(node);
+    }
+    super.visitSetLiteral(node);
+  }
 
   @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+  void visitShowCombinator(ShowCombinator node) {}
+
+  @override
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
     //
     // We visit the argument list, but do not visit the optional identifier
     // because it needs to be visited in the context of the constructor
@@ -5343,11 +5411,10 @@
     node.argumentList?.accept(this);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     _overrideManager.enterScope();
     try {
       InferenceContext.setType(
@@ -5356,22 +5423,20 @@
     } finally {
       _overrideManager.exitScope();
     }
-    return null;
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     _overrideManager.enterScope();
     try {
       super.visitSwitchDefault(node);
     } finally {
       _overrideManager.exitScope();
     }
-    return null;
   }
 
   @override
-  Object visitSwitchStatementInScope(SwitchStatement node) {
+  void visitSwitchStatementInScope(SwitchStatement node) {
     var previousExpressionType = _enclosingSwitchStatementExpressionType;
     try {
       node.expression?.accept(this);
@@ -5380,11 +5445,10 @@
     } finally {
       _enclosingSwitchStatementExpressionType = previousExpressionType;
     }
-    return null;
   }
 
   @override
-  Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+  void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _overrideManager.enterScope();
     try {
       super.visitTopLevelVariableDeclaration(node);
@@ -5394,14 +5458,13 @@
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
-    return null;
   }
 
   @override
-  Object visitTypeName(TypeName node) => null;
+  void visitTypeName(TypeName node) {}
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     InferenceContext.setTypeFromNode(node.initializer, node);
     super.visitVariableDeclaration(node);
     VariableElement element = node.declaredElement;
@@ -5417,22 +5480,20 @@
       (element as ConstVariableElement).constantInitializer =
           _createCloner().cloneNode(node.initializer);
     }
-    return null;
   }
 
   @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
+  void visitVariableDeclarationList(VariableDeclarationList node) {
     for (VariableDeclaration decl in node.variables) {
       VariableElement variableElement =
           resolutionMap.elementDeclaredByVariableDeclaration(decl);
       InferenceContext.setType(decl, variableElement?.type);
     }
     super.visitVariableDeclarationList(node);
-    return null;
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     // Note: since we don't call the base class, we have to maintain
     // _implicitLabelScope ourselves.
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
@@ -5458,11 +5519,10 @@
     // is false, then propagateFalseState(condition);
     node.accept(elementResolver);
     node.accept(typeAnalyzer);
-    return null;
   }
 
   @override
-  Object visitYieldStatement(YieldStatement node) {
+  void visitYieldStatement(YieldStatement node) {
     Expression e = node.expression;
     DartType returnType = inferenceContext.returnContext;
     bool isGenerator = _enclosingFunction?.isGenerator ?? false;
@@ -5498,7 +5558,6 @@
         inferenceContext.addReturnOrYieldType(type);
       }
     }
-    return null;
   }
 
   /// Checks each promoted variable in the current scope for compliance with the
@@ -5556,7 +5615,7 @@
         }
       }
       // async functions expect `Future<T> | T`
-      var futureTypeParam = declaredType.flattenFutures(typeSystem);
+      var futureTypeParam = typeSystem.flatten(declaredType);
       return _createFutureOr(futureTypeParam);
     }
     return declaredType;
@@ -5655,7 +5714,7 @@
     if (typeArguments == null &&
         uninstantiatedType is FunctionType &&
         uninstantiatedType.typeFormals.isNotEmpty &&
-        ts is StrongTypeSystemImpl) {
+        ts is Dart2TypeSystem) {
       return ts.inferGenericFunctionOrType<FunctionType>(
           uninstantiatedType,
           const <ParameterElement>[],
@@ -6066,7 +6125,7 @@
 
 /// The abstract class `ScopedVisitor` maintains name and label scopes as an AST
 /// structure is being visited.
-abstract class ScopedVisitor extends UnifyingAstVisitor<Object> {
+abstract class ScopedVisitor extends UnifyingAstVisitor<void> {
   /// The element for the library containing the compilation unit being visited.
   final LibraryElement definingLibrary;
 
@@ -6141,7 +6200,7 @@
   }
 
   @override
-  Object visitBlock(Block node) {
+  void visitBlock(Block node) {
     Scope outerScope = nameScope;
     try {
       EnclosedScope enclosedScope = new BlockScope(nameScope, node);
@@ -6150,11 +6209,10 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     ImplicitLabelScope implicitOuterScope = _implicitLabelScope;
     try {
       _implicitLabelScope = ImplicitLabelScope.ROOT;
@@ -6162,11 +6220,10 @@
     } finally {
       _implicitLabelScope = implicitOuterScope;
     }
-    return null;
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
       Scope outerScope = nameScope;
@@ -6184,11 +6241,10 @@
     } else {
       super.visitCatchClause(node);
     }
-    return null;
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     ClassElement classElement = node.declaredElement;
     Scope outerScope = nameScope;
     try {
@@ -6212,7 +6268,6 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   void visitClassDeclarationInScope(ClassDeclaration node) {
@@ -6231,7 +6286,7 @@
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     Scope outerScope = nameScope;
     try {
       ClassElement element = node.declaredElement;
@@ -6241,11 +6296,10 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     ConstructorElement constructorElement = node.declaredElement;
     if (constructorElement == null) {
       StringBuffer buffer = new StringBuffer();
@@ -6285,7 +6339,6 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   void visitConstructorDeclarationInScope(ConstructorDeclaration node) {
@@ -6293,17 +6346,16 @@
   }
 
   @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
     VariableElement element = node.declaredElement;
     if (element != null) {
       nameScope.define(element);
     }
     super.visitDeclaredIdentifier(node);
-    return null;
   }
 
   @override
-  Object visitDoStatement(DoStatement node) {
+  void visitDoStatement(DoStatement node) {
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
     try {
       _implicitLabelScope = _implicitLabelScope.nest(node);
@@ -6312,11 +6364,10 @@
     } finally {
       _implicitLabelScope = outerImplicitScope;
     }
-    return null;
   }
 
   @override
-  Object visitEnumDeclaration(EnumDeclaration node) {
+  void visitEnumDeclaration(EnumDeclaration node) {
     ClassElement classElement = node.declaredElement;
     Scope outerScope = nameScope;
     try {
@@ -6338,7 +6389,6 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   void visitEnumMembersInScope(EnumDeclaration node) {
@@ -6348,7 +6398,7 @@
   }
 
   @override
-  Object visitForEachStatement(ForEachStatement node) {
+  void visitForEachStatement(ForEachStatement node) {
     Scope outerNameScope = nameScope;
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
     try {
@@ -6359,7 +6409,6 @@
       nameScope = outerNameScope;
       _implicitLabelScope = outerImplicitScope;
     }
-    return null;
   }
 
   /// Visit the given statement after it's scope has been created. This replaces
@@ -6379,7 +6428,7 @@
   }
 
   @override
-  Object visitFormalParameterList(FormalParameterList node) {
+  void visitFormalParameterList(FormalParameterList node) {
     super.visitFormalParameterList(node);
     // We finished resolving function signature, now include formal parameters
     // scope.  Note: we must not do this if the parent is a
@@ -6392,11 +6441,10 @@
     if (nameScope is FunctionTypeScope) {
       (nameScope as FunctionTypeScope).defineParameters();
     }
-    return null;
   }
 
   @override
-  Object visitForStatement(ForStatement node) {
+  void visitForStatement(ForStatement node) {
     Scope outerNameScope = nameScope;
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
     try {
@@ -6407,7 +6455,6 @@
       nameScope = outerNameScope;
       _implicitLabelScope = outerImplicitScope;
     }
-    return null;
   }
 
   /// Visit the given statement after it's scope has been created. This replaces
@@ -6424,7 +6471,7 @@
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement functionElement = node.declaredElement;
     if (functionElement != null &&
         functionElement.enclosingElement is! CompilationUnitElement) {
@@ -6443,7 +6490,6 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   void visitFunctionDeclarationInScope(FunctionDeclaration node) {
@@ -6451,7 +6497,7 @@
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is FunctionDeclaration) {
       // We have already created a function scope and don't need to do so again.
       super.visitFunctionExpression(node);
@@ -6484,11 +6530,10 @@
         nameScope = outerScope;
       }
     }
-    return null;
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     Scope outerScope = nameScope;
     try {
       nameScope = new FunctionTypeScope(nameScope, node.declaredElement);
@@ -6496,7 +6541,6 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   void visitFunctionTypeAliasInScope(FunctionTypeAlias node) {
@@ -6504,7 +6548,7 @@
   }
 
   @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     Scope outerScope = nameScope;
     try {
       ParameterElement parameterElement = node.declaredElement;
@@ -6525,16 +6569,16 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) {
+  void visitGenericFunctionType(GenericFunctionType node) {
     DartType type = node.type;
     if (type == null) {
       // The function type hasn't been resolved yet, so we can't create a scope
       // for its parameters.
-      return super.visitGenericFunctionType(node);
+      super.visitGenericFunctionType(node);
+      return;
     }
     GenericFunctionTypeElement element = type.element;
     Scope outerScope = nameScope;
@@ -6551,11 +6595,10 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   @override
-  Object visitGenericTypeAlias(GenericTypeAlias node) {
+  void visitGenericTypeAlias(GenericTypeAlias node) {
     GenericTypeAliasElement element = node.declaredElement;
     Scope outerScope = nameScope;
     try {
@@ -6578,34 +6621,29 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
-  Object visitGenericTypeAliasInFunctionScope(GenericTypeAlias node) {
-    return null;
-  }
+  void visitGenericTypeAliasInFunctionScope(GenericTypeAlias node) {}
 
   @override
-  Object visitIfStatement(IfStatement node) {
+  void visitIfStatement(IfStatement node) {
     node.condition?.accept(this);
     visitStatementInScope(node.thenStatement);
     visitStatementInScope(node.elseStatement);
-    return null;
   }
 
   @override
-  Object visitLabeledStatement(LabeledStatement node) {
+  void visitLabeledStatement(LabeledStatement node) {
     LabelScope outerScope = _addScopesFor(node.labels, node.unlabeled);
     try {
       super.visitLabeledStatement(node);
     } finally {
       labelScope = outerScope;
     }
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     Scope outerScope = nameScope;
     try {
       ExecutableElement methodElement = node.declaredElement;
@@ -6620,7 +6658,6 @@
     } finally {
       nameScope = outerScope;
     }
-    return null;
   }
 
   void visitMethodDeclarationInScope(MethodDeclaration node) {
@@ -6628,7 +6665,7 @@
   }
 
   @override
-  Object visitMixinDeclaration(MixinDeclaration node) {
+  void visitMixinDeclaration(MixinDeclaration node) {
     ClassElement element = node.declaredElement;
 
     Scope outerScope = nameScope;
@@ -6645,7 +6682,6 @@
       nameScope = outerScope;
       enclosingClass = outerClass;
     }
-    return null;
   }
 
   void visitMixinDeclarationInScope(MixinDeclaration node) {
@@ -6683,7 +6719,7 @@
   }
 
   @override
-  Object visitSwitchCase(SwitchCase node) {
+  void visitSwitchCase(SwitchCase node) {
     node.expression.accept(this);
     Scope outerNameScope = nameScope;
     try {
@@ -6692,11 +6728,10 @@
     } finally {
       nameScope = outerNameScope;
     }
-    return null;
   }
 
   @override
-  Object visitSwitchDefault(SwitchDefault node) {
+  void visitSwitchDefault(SwitchDefault node) {
     Scope outerNameScope = nameScope;
     try {
       nameScope = new EnclosedScope(nameScope);
@@ -6704,11 +6739,10 @@
     } finally {
       nameScope = outerNameScope;
     }
-    return null;
   }
 
   @override
-  Object visitSwitchStatement(SwitchStatement node) {
+  void visitSwitchStatement(SwitchStatement node) {
     LabelScope outerScope = labelScope;
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
     try {
@@ -6726,7 +6760,6 @@
       labelScope = outerScope;
       _implicitLabelScope = outerImplicitScope;
     }
-    return null;
   }
 
   void visitSwitchStatementInScope(SwitchStatement node) {
@@ -6734,7 +6767,7 @@
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     if (node.parent.parent is! TopLevelVariableDeclaration &&
         node.parent.parent is! FieldDeclaration) {
@@ -6743,11 +6776,10 @@
         nameScope.define(element);
       }
     }
-    return null;
   }
 
   @override
-  Object visitWhileStatement(WhileStatement node) {
+  void visitWhileStatement(WhileStatement node) {
     node.condition?.accept(this);
     ImplicitLabelScope outerImplicitScope = _implicitLabelScope;
     try {
@@ -6756,7 +6788,6 @@
     } finally {
       _implicitLabelScope = outerImplicitScope;
     }
-    return null;
   }
 
   /// Add scopes for each of the given labels.
@@ -6836,6 +6867,8 @@
   final TypeSystem typeSystem;
   final DartType dynamicType;
   final DartType undefinedType;
+  final bool isNonNullableMigrated;
+  final AnalysisOptionsImpl analysisOptions;
   final LibraryElement definingLibrary;
   final Source source;
   final AnalysisErrorListener errorListener;
@@ -6849,11 +6882,17 @@
 
   Scope nameScope;
 
-  TypeNameResolver(this.typeSystem, TypeProvider typeProvider,
-      this.definingLibrary, this.source, this.errorListener,
+  TypeNameResolver(
+      this.typeSystem,
+      TypeProvider typeProvider,
+      this.isNonNullableMigrated,
+      this.definingLibrary,
+      this.source,
+      this.errorListener,
       {this.shouldUseWithClauseInferredTypes: true})
       : dynamicType = typeProvider.dynamicType,
-        undefinedType = typeProvider.undefinedType;
+        undefinedType = typeProvider.undefinedType,
+        analysisOptions = definingLibrary.context.analysisOptions;
 
   /// Report an error with the given error code and arguments.
   ///
@@ -7076,22 +7115,25 @@
       node.type = undefinedType;
       return;
     }
-    DartType type = null;
+
     if (element is ClassElement) {
-      _setElement(typeName, element);
-      type = element.type;
-    } else if (element == DynamicElementImpl.instance) {
+      _resolveClassElement(node, typeName, argumentList, element);
+      return;
+    }
+
+    TypeImpl type = null;
+    if (element == DynamicElementImpl.instance) {
       _setElement(typeName, element);
       type = DynamicTypeImpl.instance;
     } else if (element is FunctionTypeAliasElement) {
       _setElement(typeName, element);
-      type = element.type;
+      type = element.type as TypeImpl;
     } else if (element is TypeParameterElement) {
       _setElement(typeName, element);
-      type = element.type;
+      type = element.type as TypeImpl;
     } else if (element is MultiplyDefinedElement) {
       List<Element> elements = element.conflictingElements;
-      type = _getTypeWhenMultiplyDefined(elements);
+      type = _getTypeWhenMultiplyDefined(elements) as TypeImpl;
     } else {
       // The name does not represent a type.
       RedirectingConstructorKind redirectingConstructorKind;
@@ -7171,37 +7213,15 @@
                 element, typeArguments) ??
             dynamicType;
       } else {
-        DartType redirectedType =
-            _inferTypeArgumentsForRedirectedConstructor(node, type);
-        if (redirectedType != null) {
-          type = redirectedType;
-        } else {
-          type = typeSystem.instantiateToBounds(type);
-        }
+        type = typeSystem.instantiateToBounds(type);
       }
     }
-    DartType refinedType;
-    if (shouldUseWithClauseInferredTypes) {
-      var parent = node.parent;
-      if (parent is WithClause &&
-          type is InterfaceType &&
-          type.element.typeParameters.isNotEmpty) {
-        // Get the (possibly inferred) mixin type from the element model.
-        var grandParent = parent.parent;
-        if (grandParent is ClassDeclaration) {
-          refinedType =
-              _getInferredMixinType(grandParent.declaredElement, type.element);
-        } else if (grandParent is ClassTypeAlias) {
-          refinedType =
-              _getInferredMixinType(grandParent.declaredElement, type.element);
-        } else {
-          assert(false, 'Unexpected context for "with" clause');
-        }
-      }
-    }
-    refinedType ??= type;
-    typeName.staticType = refinedType;
-    node.type = refinedType;
+
+    var nullability = _getNullability(node.question != null);
+    type = type.withNullability(nullability);
+
+    typeName.staticType = type;
+    node.type = type;
   }
 
   DartType _getInferredMixinType(
@@ -7230,6 +7250,22 @@
     return StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS;
   }
 
+  Nullability _getNullability(bool hasQuestion) {
+    Nullability nullability;
+    if (analysisOptions.experimentStatus.non_nullable) {
+      if (hasQuestion) {
+        nullability = Nullability.nullable;
+      } else if (isNonNullableMigrated) {
+        nullability = Nullability.nonNullable;
+      } else {
+        nullability = Nullability.indeterminate;
+      }
+    } else {
+      nullability = Nullability.indeterminate;
+    }
+    return nullability;
+  }
+
   /// Checks if the given [typeName] is the target in a redirected constructor.
   RedirectingConstructorKind _getRedirectingConstructorKind(TypeName typeName) {
     AstNode parent = typeName.parent;
@@ -7303,7 +7339,7 @@
   /// If the [node] is the type name in a redirected factory constructor,
   /// infer type arguments using the enclosing class declaration. Return `null`
   /// otherwise.
-  DartType _inferTypeArgumentsForRedirectedConstructor(
+  InterfaceTypeImpl _inferTypeArgumentsForRedirectedConstructor(
       TypeName node, DartType type) {
     AstNode constructorName = node.parent;
     AstNode enclosingConstructor = constructorName?.parent;
@@ -7312,7 +7348,7 @@
         enclosingConstructor is ConstructorDeclaration &&
         enclosingConstructor.redirectedConstructor == constructorName &&
         type is InterfaceType &&
-        ts is StrongTypeSystemImpl) {
+        ts is Dart2TypeSystem) {
       ClassOrMixinDeclaration enclosingClassNode = enclosingConstructor.parent;
       ClassElement enclosingClassElement = enclosingClassNode.declaredElement;
       if (enclosingClassElement == type.element) {
@@ -7369,6 +7405,77 @@
   bool _isTypeNameInTypeArgumentList(TypeName typeName) =>
       typeName.parent is TypeArgumentList;
 
+  void _resolveClassElement(TypeName node, Identifier typeName,
+      TypeArgumentList argumentList, ClassElement element) {
+    _setElement(typeName, element);
+
+    var typeParameters = element.typeParameters;
+    var parameterCount = typeParameters.length;
+
+    List<DartType> typeArguments;
+    if (argumentList != null) {
+      var argumentNodes = argumentList.arguments;
+      var argumentCount = argumentNodes.length;
+
+      typeArguments = new List<DartType>(parameterCount);
+      if (argumentCount == parameterCount) {
+        for (int i = 0; i < parameterCount; i++) {
+          typeArguments[i] = _getType(argumentNodes[i]);
+        }
+      } else {
+        reportErrorForNode(_getInvalidTypeParametersErrorCode(node), node,
+            [typeName.name, parameterCount, argumentCount]);
+        for (int i = 0; i < parameterCount; i++) {
+          typeArguments[i] = dynamicType;
+        }
+      }
+    } else if (parameterCount == 0) {
+      typeArguments = const <DartType>[];
+    } else {
+      var redirectedType =
+          _inferTypeArgumentsForRedirectedConstructor(node, element.type);
+      if (redirectedType != null) {
+        typeArguments = redirectedType.typeArguments;
+      } else {
+        var typeFormals = typeParameters;
+        typeArguments = typeSystem.instantiateTypeFormalsToBounds(typeFormals);
+      }
+    }
+
+    var parent = node.parent;
+
+    Nullability nullability;
+    if (parent is ClassTypeAlias ||
+        parent is ExtendsClause ||
+        parent is ImplementsClause ||
+        parent is OnClause ||
+        parent is WithClause) {
+      nullability = Nullability.nonNullable;
+    } else {
+      nullability = _getNullability(node.question != null);
+    }
+
+    var type = InterfaceTypeImpl.explicit(element, typeArguments,
+        nullability: nullability);
+
+    if (shouldUseWithClauseInferredTypes) {
+      if (parent is WithClause && parameterCount != 0) {
+        // Get the (possibly inferred) mixin type from the element model.
+        var grandParent = parent.parent;
+        if (grandParent is ClassDeclaration) {
+          type = _getInferredMixinType(grandParent.declaredElement, element);
+        } else if (grandParent is ClassTypeAlias) {
+          type = _getInferredMixinType(grandParent.declaredElement, element);
+        } else {
+          assert(false, 'Unexpected context for "with" clause');
+        }
+      }
+    }
+
+    typeName.staticType = type;
+    node.type = type;
+  }
+
   /// Records the new Element for a TypeName's Identifier.
   ///
   /// A null may be passed in to indicate that the element can't be resolved.
@@ -7602,10 +7709,16 @@
   TypeNameResolver typeNameResolver = null;
 
   TypeParameterBoundsResolver(
-      this.typeSystem, this.library, this.source, this.errorListener)
+      this.typeSystem, this.library, this.source, this.errorListener,
+      {bool isNonNullableMigrated = false})
       : libraryScope = new LibraryScope(library),
-        typeNameResolver = new TypeNameResolver(typeSystem,
-            typeSystem.typeProvider, library, source, errorListener);
+        typeNameResolver = new TypeNameResolver(
+            typeSystem,
+            typeSystem.typeProvider,
+            isNonNullableMigrated,
+            library,
+            source,
+            errorListener);
 
   /// Resolve bounds of type parameters of classes, class and function type
   /// aliases.
@@ -7839,12 +7952,18 @@
   /// Return the type representing the type 'Iterable<dynamic>'.
   InterfaceType get iterableDynamicType;
 
+  /// Return the type representing the type 'Iterable<Object>'.
+  InterfaceType get iterableObjectType;
+
   /// Return the type representing the built-in type 'Iterable'.
   InterfaceType get iterableType;
 
   /// Return the type representing the built-in type 'List'.
   InterfaceType get listType;
 
+  /// Return the type representing 'Map<Object, Object>'.
+  InterfaceType get mapObjectObjectType;
+
   /// Return the type representing the built-in type 'Map'.
   InterfaceType get mapType;
 
@@ -7864,6 +7983,9 @@
   /// Return the type representing the built-in type 'Object'.
   InterfaceType get objectType;
 
+  /// Return the type representing the built-in type 'Set'.
+  InterfaceType get setType;
+
   /// Return the type representing the built-in type 'StackTrace'.
   InterfaceType get stackTraceType;
 
@@ -7972,6 +8094,9 @@
   /// The type representing 'Iterable<dynamic>'.
   InterfaceType _iterableDynamicType;
 
+  /// The type representing 'Iterable<Object>'.
+  InterfaceType _iterableObjectType;
+
   /// The type representing the built-in type 'Iterable'.
   InterfaceType _iterableType;
 
@@ -7981,9 +8106,15 @@
   /// The type representing the built-in type 'Map'.
   InterfaceType _mapType;
 
+  /// The type representing the built-in type 'Map<Object, Object>'.
+  InterfaceType _mapObjectObjectType;
+
   /// An shared object representing the value 'null'.
   DartObjectImpl _nullObject;
 
+  /// The type representing the type 'Set'.
+  InterfaceType _setType;
+
   /// The type representing the type 'Null'.
   InterfaceType _nullType;
 
@@ -8071,12 +8202,18 @@
   InterfaceType get iterableDynamicType => _iterableDynamicType;
 
   @override
+  InterfaceType get iterableObjectType => _iterableObjectType;
+
+  @override
   InterfaceType get iterableType => _iterableType;
 
   @override
   InterfaceType get listType => _listType;
 
   @override
+  InterfaceType get mapObjectObjectType => _mapObjectObjectType;
+
+  @override
   InterfaceType get mapType => _mapType;
 
   @override
@@ -8097,6 +8234,9 @@
   InterfaceType get objectType => _objectType;
 
   @override
+  InterfaceType get setType => _setType;
+
+  @override
   InterfaceType get stackTraceType => _stackTraceType;
 
   @override
@@ -8151,6 +8291,7 @@
     _nullType = _getType(coreNamespace, "Null");
     _numType = _getType(coreNamespace, "num");
     _objectType = _getType(coreNamespace, "Object");
+    _setType = _getType(coreNamespace, "Set");
     _stackTraceType = _getType(coreNamespace, "StackTrace");
     _streamType = _getType(asyncNamespace, "Stream");
     _stringType = _getType(coreNamespace, "String");
@@ -8160,6 +8301,9 @@
     _futureDynamicType = _futureType.instantiate(<DartType>[_dynamicType]);
     _futureNullType = _futureType.instantiate(<DartType>[_nullType]);
     _iterableDynamicType = _iterableType.instantiate(<DartType>[_dynamicType]);
+    _iterableObjectType = _iterableType.instantiate(<DartType>[_objectType]);
+    _mapObjectObjectType =
+        _mapType.instantiate(<DartType>[_objectType, _objectType]);
     _streamDynamicType = _streamType.instantiate(<DartType>[_dynamicType]);
     // FutureOr<T> is still fairly new, so if we're analyzing an SDK that
     // doesn't have it yet, create an element for it.
@@ -8218,6 +8362,9 @@
   /// Type type system in use for this resolver pass.
   TypeSystem _typeSystem;
 
+  /// Whether the library migrated to non-nullable.
+  final bool isNonNullableMigrated;
+
   /// The helper to resolve types.
   TypeNameResolver _typeNameResolver;
 
@@ -8253,6 +8400,7 @@
   TypeResolverVisitor(LibraryElement definingLibrary, Source source,
       TypeProvider typeProvider, AnalysisErrorListener errorListener,
       {Scope nameScope,
+      this.isNonNullableMigrated: false,
       this.mode: TypeResolverMode.everything,
       bool shouldUseWithClauseInferredTypes: true,
       this.shouldSetElementSupertypes: false})
@@ -8261,13 +8409,13 @@
     _dynamicType = typeProvider.dynamicType;
     _undefinedType = typeProvider.undefinedType;
     _typeSystem = TypeSystem.create(definingLibrary.context);
-    _typeNameResolver = new TypeNameResolver(
-        _typeSystem, typeProvider, definingLibrary, source, errorListener,
+    _typeNameResolver = new TypeNameResolver(_typeSystem, typeProvider,
+        isNonNullableMigrated, definingLibrary, source, errorListener,
         shouldUseWithClauseInferredTypes: shouldUseWithClauseInferredTypes);
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     //
     // Visit annotations, if the annotation is @proxy, on a class, and "proxy"
     // resolves to the proxy annotation in dart.core, then resolve the
@@ -8292,11 +8440,10 @@
         elementAnnotation.element = element;
       }
     }
-    return null;
   }
 
   @override
-  Object visitCatchClause(CatchClause node) {
+  void visitCatchClause(CatchClause node) {
     super.visitCatchClause(node);
     SimpleIdentifier exception = node.exceptionParameter;
     if (exception != null) {
@@ -8328,11 +8475,10 @@
         // TODO(brianwilkerson) Report the internal error
       }
     }
-    return null;
   }
 
   @override
-  Object visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(ClassDeclaration node) {
     _hasReferenceToSuper = false;
     super.visitClassDeclaration(node);
     ClassElementImpl classElement = _getClassElement(node.name);
@@ -8341,7 +8487,6 @@
       classElement.hasBeenInferred = false;
       classElement.hasReferenceToSuper = _hasReferenceToSuper;
     }
-    return null;
   }
 
   @override
@@ -8370,7 +8515,6 @@
     }
     _resolveWithClause(classElement, withClause);
     _resolveImplementsClause(classElement, implementsClause);
-    return null;
   }
 
   @override
@@ -8399,7 +8543,7 @@
   }
 
   @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
+  void visitClassTypeAlias(ClassTypeAlias node) {
     super.visitClassTypeAlias(node);
     ErrorCode errorCode = CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS;
     InterfaceType superclassType =
@@ -8413,15 +8557,14 @@
     }
     _resolveWithClause(classElement, node.withClause);
     _resolveImplementsClause(classElement, node.implementsClause);
-    return null;
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     super.visitConstructorDeclaration(node);
     if (node.declaredElement == null) {
       ClassDeclaration classNode =
-          node.getAncestor((node) => node is ClassDeclaration);
+          node.thisOrAncestorOfType<ClassDeclaration>();
       StringBuffer buffer = new StringBuffer();
       buffer.write("The element for the constructor ");
       buffer.write(node.name == null ? "<unnamed>" : node.name.name);
@@ -8437,11 +8580,10 @@
       AnalysisEngine.instance.logger.logError(buffer.toString(),
           new CaughtException(new AnalysisException(), null));
     }
-    return null;
   }
 
   @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
     super.visitDeclaredIdentifier(node);
     DartType declaredType;
     TypeAnnotation typeName = node.type;
@@ -8453,11 +8595,10 @@
     LocalVariableElementImpl element =
         node.declaredElement as LocalVariableElementImpl;
     element.declaredType = declaredType;
-    return null;
   }
 
   @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
+  void visitFieldFormalParameter(FieldFormalParameter node) {
     super.visitFieldFormalParameter(node);
     Element element = node.identifier.staticElement;
     if (element is ParameterElementImpl) {
@@ -8482,11 +8623,10 @@
     } else {
       // TODO(brianwilkerson) Report this internal error
     }
-    return null;
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     super.visitFunctionDeclaration(node);
     ExecutableElementImpl element =
         node.declaredElement as ExecutableElementImpl;
@@ -8503,19 +8643,17 @@
     element.declaredReturnType = _computeReturnType(node.returnType);
     element.type = new FunctionTypeImpl(element);
     _inferSetterReturnType(element);
-    return null;
   }
 
   @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+  void visitFunctionTypeAlias(FunctionTypeAlias node) {
     var element = node.declaredElement as GenericTypeAliasElementImpl;
     super.visitFunctionTypeAlias(node);
     element.function.returnType = _computeReturnType(node.returnType);
-    return null;
   }
 
   @override
-  Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+  void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
     super.visitFunctionTypedFormalParameter(node);
     Element element = node.identifier.staticElement;
     if (element is ParameterElementImpl) {
@@ -8523,28 +8661,26 @@
     } else {
       // TODO(brianwilkerson) Report this internal error
     }
-    return null;
   }
 
   @override
-  Object visitGenericFunctionType(GenericFunctionType node) {
+  void visitGenericFunctionType(GenericFunctionType node) {
     GenericFunctionTypeElementImpl element = node.type?.element;
     if (element != null) {
       super.visitGenericFunctionType(node);
       element.returnType =
           _computeReturnType(node.returnType) ?? DynamicTypeImpl.instance;
     }
-    return null;
   }
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     super.visitMethodDeclaration(node);
     ExecutableElementImpl element =
         node.declaredElement as ExecutableElementImpl;
     if (element == null) {
       ClassDeclaration classNode =
-          node.getAncestor((node) => node is ClassDeclaration);
+          node.thisOrAncestorOfType<ClassDeclaration>();
       StringBuffer buffer = new StringBuffer();
       buffer.write("The element for the method ");
       buffer.write(node.name.name);
@@ -8565,7 +8701,7 @@
     // already set - statically or inferred. We don't want to overwrite them.
     if (LibraryElementImpl.hasResolutionCapability(
         definingLibrary, LibraryResolutionCapability.resolvedTypeNames)) {
-      return null;
+      return;
     }
 
     element.declaredReturnType = _computeReturnType(node.returnType);
@@ -8586,8 +8722,6 @@
         variable.declaredType = type;
       }
     }
-
-    return null;
   }
 
   @override
@@ -8596,25 +8730,24 @@
     MixinElementImpl element = node.declaredElement;
     _resolveOnClause(element, node.onClause);
     _resolveImplementsClause(element, node.implementsClause);
-    return null;
   }
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     // In API mode we need to skip:
     //   - function bodies;
     //   - default values of parameters;
     //   - initializers of top-level variables.
     if (mode == TypeResolverMode.api) {
       if (node is FunctionBody) {
-        return null;
+        return;
       }
       if (node is DefaultFormalParameter) {
         node.parameter.accept(this);
-        return null;
+        return;
       }
       if (node is VariableDeclaration) {
-        return null;
+        return;
       }
     }
 
@@ -8628,7 +8761,8 @@
     if (mode == TypeResolverMode.local) {
       // We are in the state of visiting all nodes.
       if (_localModeVisitAll) {
-        return super.visitNode(node);
+        super.visitNode(node);
+        return;
       }
 
       // Ensure that the name scope is ready.
@@ -8696,15 +8830,14 @@
       } else if (node is VariableDeclarationList) {
         node.variables.forEach(visitNode);
       }
-      return null;
+      return;
     }
-
     // The mode in which we visit all nodes.
-    return super.visitNode(node);
+    super.visitNode(node);
   }
 
   @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
+  void visitSimpleFormalParameter(SimpleFormalParameter node) {
     super.visitSimpleFormalParameter(node);
     DartType declaredType;
     TypeAnnotation typeName = node.type;
@@ -8719,25 +8852,23 @@
     } else {
       // TODO(brianwilkerson) Report the internal error.
     }
-    return null;
   }
 
   @override
-  Object visitSuperExpression(SuperExpression node) {
+  void visitSuperExpression(SuperExpression node) {
     _hasReferenceToSuper = true;
-    return super.visitSuperExpression(node);
+    super.visitSuperExpression(node);
   }
 
   @override
-  Object visitTypeName(TypeName node) {
+  void visitTypeName(TypeName node) {
     super.visitTypeName(node);
     _typeNameResolver.nameScope = this.nameScope;
     _typeNameResolver.resolveTypeName(node);
-    return null;
   }
 
   @override
-  Object visitTypeParameter(TypeParameter node) {
+  void visitTypeParameter(TypeParameter node) {
     super.visitTypeParameter(node);
     AstNode parent2 = node.parent?.parent;
     if (parent2 is ClassDeclaration ||
@@ -8756,11 +8887,10 @@
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     super.visitVariableDeclaration(node);
     var variableList = node.parent as VariableDeclarationList;
     // When the library is resynthesized, the types of field elements are
@@ -8768,7 +8898,7 @@
     if (variableList.parent is FieldDeclaration &&
         LibraryElementImpl.hasResolutionCapability(
             definingLibrary, LibraryResolutionCapability.resolvedTypeNames)) {
-      return null;
+      return;
     }
     // Resolve the type.
     DartType declaredType;
@@ -8782,7 +8912,6 @@
     if (element is VariableElementImpl) {
       element.declaredType = declaredType;
     }
-    return null;
   }
 
   /// Given the [returnType] of a function, compute the return type of the
@@ -9220,20 +9349,20 @@
             nameScope: nameScope);
 
   @override
-  Object visitBlockFunctionBody(BlockFunctionBody node) {
+  void visitBlockFunctionBody(BlockFunctionBody node) {
     assert(_localVariableInfo != null);
-    return super.visitBlockFunctionBody(node);
+    super.visitBlockFunctionBody(node);
   }
 
   @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
+  void visitConstructorDeclaration(ConstructorDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     LocalVariableInfo outerLocalVariableInfo = _localVariableInfo;
     try {
       _localVariableInfo ??= new LocalVariableInfo();
       (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo;
       _enclosingFunction = node.declaredElement;
-      return super.visitConstructorDeclaration(node);
+      super.visitConstructorDeclaration(node);
     } finally {
       _localVariableInfo = outerLocalVariableInfo;
       _enclosingFunction = outerFunction;
@@ -9241,16 +9370,16 @@
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) => null;
+  void visitExportDirective(ExportDirective node) {}
 
   @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
+  void visitExpressionFunctionBody(ExpressionFunctionBody node) {
     assert(_localVariableInfo != null);
-    return super.visitExpressionFunctionBody(node);
+    super.visitExpressionFunctionBody(node);
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     LocalVariableInfo outerLocalVariableInfo = _localVariableInfo;
     try {
@@ -9258,7 +9387,7 @@
       (node.functionExpression.body as FunctionBodyImpl).localVariableInfo =
           _localVariableInfo;
       _enclosingFunction = node.declaredElement;
-      return super.visitFunctionDeclaration(node);
+      super.visitFunctionDeclaration(node);
     } finally {
       _localVariableInfo = outerLocalVariableInfo;
       _enclosingFunction = outerFunction;
@@ -9266,7 +9395,7 @@
   }
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is! FunctionDeclaration) {
       ExecutableElement outerFunction = _enclosingFunction;
       LocalVariableInfo outerLocalVariableInfo = _localVariableInfo;
@@ -9274,28 +9403,28 @@
         _localVariableInfo ??= new LocalVariableInfo();
         (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo;
         _enclosingFunction = node.declaredElement;
-        return super.visitFunctionExpression(node);
+        super.visitFunctionExpression(node);
       } finally {
         _localVariableInfo = outerLocalVariableInfo;
         _enclosingFunction = outerFunction;
       }
     } else {
-      return super.visitFunctionExpression(node);
+      super.visitFunctionExpression(node);
     }
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) => null;
+  void visitImportDirective(ImportDirective node) {}
 
   @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
+  void visitMethodDeclaration(MethodDeclaration node) {
     ExecutableElement outerFunction = _enclosingFunction;
     LocalVariableInfo outerLocalVariableInfo = _localVariableInfo;
     try {
       _localVariableInfo ??= new LocalVariableInfo();
       (node.body as FunctionBodyImpl).localVariableInfo = _localVariableInfo;
       _enclosingFunction = node.declaredElement;
-      return super.visitMethodDeclaration(node);
+      super.visitMethodDeclaration(node);
     } finally {
       _localVariableInfo = outerLocalVariableInfo;
       _enclosingFunction = outerFunction;
@@ -9303,43 +9432,43 @@
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     // Ignore if already resolved - declaration or type.
     if (node.inDeclarationContext()) {
-      return null;
+      return;
     }
     // Ignore if it cannot be a reference to a local variable.
     AstNode parent = node.parent;
     if (parent is FieldFormalParameter) {
-      return null;
+      return;
     } else if (parent is ConstructorDeclaration && parent.returnType == node) {
-      return null;
+      return;
     } else if (parent is ConstructorFieldInitializer &&
         parent.fieldName == node) {
-      return null;
+      return;
     }
     // Ignore if qualified.
     if (parent is PrefixedIdentifier && identical(parent.identifier, node)) {
-      return null;
+      return;
     }
     if (parent is PropertyAccess && identical(parent.propertyName, node)) {
-      return null;
+      return;
     }
     if (parent is MethodInvocation &&
         identical(parent.methodName, node) &&
         parent.realTarget != null) {
-      return null;
+      return;
     }
     if (parent is ConstructorName) {
-      return null;
+      return;
     }
     if (parent is Label) {
-      return null;
+      return;
     }
     // Prepare VariableElement.
     Element element = nameScope.lookup(node, definingLibrary);
     if (element is! VariableElement) {
-      return null;
+      return;
     }
     // Must be local or parameter.
     ElementKind kind = element.kind;
@@ -9352,13 +9481,10 @@
         }
       }
     }
-    return null;
   }
 
   @override
-  Object visitTypeName(TypeName node) {
-    return null;
-  }
+  void visitTypeName(TypeName node) {}
 }
 
 class _InvalidAccessVerifier {
@@ -9570,7 +9696,7 @@
 }
 
 class _ResolverVisitor_isVariableAccessedInClosure
-    extends RecursiveAstVisitor<Object> {
+    extends RecursiveAstVisitor<void> {
   final Element variable;
 
   bool result = false;
@@ -9580,30 +9706,29 @@
   _ResolverVisitor_isVariableAccessedInClosure(this.variable);
 
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     bool inClosure = this._inClosure;
     try {
       this._inClosure = true;
-      return super.visitFunctionExpression(node);
+      super.visitFunctionExpression(node);
     } finally {
       this._inClosure = inClosure;
     }
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     if (result) {
-      return null;
+      return;
     }
     if (_inClosure && identical(node.staticElement, variable)) {
       result = true;
     }
-    return null;
   }
 }
 
 class _ResolverVisitor_isVariablePotentiallyMutatedIn
-    extends RecursiveAstVisitor<Object> {
+    extends RecursiveAstVisitor<void> {
   final Element variable;
 
   bool result = false;
@@ -9611,15 +9736,14 @@
   _ResolverVisitor_isVariablePotentiallyMutatedIn(this.variable);
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     if (result) {
-      return null;
+      return;
     }
     if (identical(node.staticElement, variable)) {
       if (node.inSetterContext()) {
         result = true;
       }
     }
-    return null;
   }
 }
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index d024db1..c7ae2db 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -265,7 +265,7 @@
   }
 }
 
-class SdkLibrariesReader_LibraryBuilder extends RecursiveAstVisitor<Object> {
+class SdkLibrariesReader_LibraryBuilder extends RecursiveAstVisitor<void> {
   /**
    * The prefix added to the name of a library to form the URI used in code to
    * reference the library.
@@ -351,7 +351,7 @@
   }
 
   @override
-  Object visitMapLiteralEntry(MapLiteralEntry node) {
+  void visitMapLiteralEntry(MapLiteralEntry node) {
     String libraryName = null;
     Expression key = node.key;
     if (key is SimpleStringLiteral) {
@@ -392,7 +392,6 @@
       }
       _librariesMap.setLibrary(libraryName, library);
     }
-    return null;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 0de7ff4..9b1d4e7 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -17,6 +17,11 @@
 export 'package:analyzer/source/line_info.dart' show LineInfo;
 export 'package:analyzer/source/source_range.dart';
 
+/**
+ * A function that is used to visit [ContentCache] entries.
+ */
+typedef void ContentCacheVisitor(String fullPath, int stamp, String contents);
+
 /// Base class providing implementations for the methods in [Source] that don't
 /// require filesystem access.
 abstract class BasicSource extends Source {
@@ -44,11 +49,6 @@
 }
 
 /**
- * A function that is used to visit [ContentCache] entries.
- */
-typedef void ContentCacheVisitor(String fullPath, int stamp, String contents);
-
-/**
  * A cache used to override the default content of a [Source].
  */
 class ContentCache {
@@ -565,6 +565,12 @@
   Map<String, List<Folder>> get packageMap;
 
   /**
+   * Clear any cached URI resolution information in the [SourceFactory] itself,
+   * and also ask each [UriResolver]s to clear its caches.
+   */
+  void clearCache();
+
+  /**
    * Return a source factory that will resolve URI's in the same way that this
    * source factory does.
    */
@@ -769,9 +775,20 @@
  * The abstract class `UriResolver` defines the behavior of objects that are used to resolve
  * URI's for a source factory. Subclasses of this class are expected to resolve a single scheme of
  * absolute URI.
+ *
+ * NOTICE: in a future breaking change release of the analyzer, a method
+ * `void clearCache()` will be added.  Clients that implement, but do not
+ * extend, this class, can prepare for the breaking change by adding an
+ * implementation of this method that clears any cached URI resolution
+ * information.
  */
 abstract class UriResolver {
   /**
+   * Clear any cached URI resolution information.
+   */
+  void clearCache() {}
+
+  /**
    * Resolve the given absolute URI. Return a [Source] representing the file to which
    * it was resolved, whether or not the resulting source exists, or `null` if it could not be
    * resolved because the URI is invalid.
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index dfc94e4..88f8f3b 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,10 +10,15 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/ast_factory.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart' show ConstructorMember;
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/task/strong/checker.dart'
@@ -28,7 +33,7 @@
  * * Every node representing an expression should be resolved to the Type of the expression.
  * </ol>
  */
-class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
+class StaticTypeAnalyzer extends SimpleAstVisitor<void> {
   /**
    * The resolver driving the resolution and type analysis.
    */
@@ -50,6 +55,11 @@
   DartType _dynamicType;
 
   /**
+   * The status of the active experiments of the current context.
+   */
+  ExperimentStatus _experimentStatus;
+
+  /**
    * The type representing the class containing the nodes being analyzed,
    * or `null` if the nodes are not within a class.
    */
@@ -70,6 +80,9 @@
     _typeSystem = _resolver.typeSystem;
     _dynamicType = _typeProvider.dynamicType;
     _promoteManager = _resolver.promoteManager;
+    _experimentStatus = (_resolver.definingLibrary.context.analysisOptions
+            as AnalysisOptionsImpl)
+        .experimentStatus;
   }
 
   /**
@@ -94,7 +107,7 @@
       FormalParameterList node, DartType functionType) {
     bool inferred = false;
     if (node != null && functionType is FunctionType) {
-      var ts = _typeSystem as StrongTypeSystemImpl;
+      var ts = _typeSystem as Dart2TypeSystem;
       void inferType(ParameterElementImpl p, DartType inferredType) {
         // Check that there is no declared type, and that we have not already
         // inferred a type in some fashion.
@@ -139,7 +152,7 @@
   DartType inferListType(ListLiteral node, {bool downwards: false}) {
     DartType contextType = InferenceContext.getContext(node);
 
-    var ts = _typeSystem as StrongTypeSystemImpl;
+    var ts = _typeSystem as Dart2TypeSystem;
     List<DartType> elementTypes;
     List<ParameterElement> parameters;
 
@@ -171,6 +184,34 @@
 
   ParameterizedType inferMapType(MapLiteral node, {bool downwards: false}) {
     DartType contextType = InferenceContext.getContext(node);
+    if (contextType != null && _experimentStatus.set_literals) {
+      DartType unwrap(DartType type) {
+        if (type is InterfaceType &&
+            type.isDartAsyncFutureOr &&
+            type.typeArguments.length == 1) {
+          return unwrap(type.typeArguments[0]);
+        }
+        return type;
+      }
+
+      DartType unwrappedContextType = unwrap(contextType);
+      if (node.typeArguments == null &&
+          node.entries.isEmpty &&
+          _typeSystem.isAssignableTo(
+              _typeProvider.iterableObjectType, unwrappedContextType) &&
+          !_typeSystem.isAssignableTo(
+              _typeProvider.mapObjectObjectType, unwrappedContextType)) {
+        // The node is really an empty set literal with no type arguments.
+        // Rewrite the AST and infer the type of the set as appropriate.
+        SetLiteral setLiteral = new AstFactoryImpl().setLiteral(
+            node.constKeyword, null, node.leftBracket, null, node.rightBracket);
+        InferenceContext.setType(setLiteral, contextType);
+        NodeReplacer.replace(node, setLiteral);
+        DartType type = inferSetType(setLiteral, downwards: downwards);
+        setLiteral.staticType = type;
+        return type;
+      }
+    }
     List<DartType> elementTypes;
     List<ParameterElement> parameters;
     if (downwards) {
@@ -197,7 +238,7 @@
     }
 
     // Use both downwards and upwards information to infer the type.
-    var ts = _typeSystem as StrongTypeSystemImpl;
+    var ts = _typeSystem as Dart2TypeSystem;
     ParameterizedType inferred = ts.inferGenericFunctionOrType(
         _typeProvider.mapType, parameters, elementTypes, contextType,
         downwards: downwards,
@@ -206,14 +247,46 @@
     return inferred;
   }
 
+  DartType inferSetType(SetLiteral node, {bool downwards: false}) {
+    DartType contextType = InferenceContext.getContext(node);
+
+    var ts = _typeSystem as Dart2TypeSystem;
+    List<DartType> elementTypes;
+    List<ParameterElement> parameters;
+
+    if (downwards) {
+      if (contextType == null) {
+        return null;
+      }
+
+      elementTypes = [];
+      parameters = [];
+    } else {
+      // Also use upwards information to infer the type.
+      elementTypes = node.elements
+          .map((e) => e.staticType)
+          .where((t) => t != null)
+          .toList();
+      var setTypeParam = _typeProvider.setType.typeParameters[0].type;
+      var syntheticParamElement = new ParameterElementImpl.synthetic(
+          'element', setTypeParam, ParameterKind.POSITIONAL);
+      parameters = new List.filled(elementTypes.length, syntheticParamElement);
+    }
+    DartType inferred = ts.inferGenericFunctionOrType<InterfaceType>(
+        _typeProvider.setType, parameters, elementTypes, contextType,
+        downwards: downwards,
+        errorReporter: _resolver.errorReporter,
+        errorNode: node);
+    return inferred;
+  }
+
   /**
    * The Dart Language Specification, 12.5: <blockquote>The static type of a string literal is
    * `String`.</blockquote>
    */
   @override
-  Object visitAdjacentStrings(AdjacentStrings node) {
+  void visitAdjacentStrings(AdjacentStrings node) {
     _recordStaticType(node, _typeProvider.stringType);
-    return null;
   }
 
   /**
@@ -225,9 +298,8 @@
    * The static type of a cast expression <i>e as T</i> is <i>T</i>.</blockquote>
    */
   @override
-  Object visitAsExpression(AsExpression node) {
+  void visitAsExpression(AsExpression node) {
     _recordStaticType(node, _getType(node.type));
-    return null;
   }
 
   /**
@@ -270,7 +342,7 @@
    * <i>e<sub>3</sub></i>.</blockquote>
    */
   @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
+  void visitAssignmentExpression(AssignmentExpression node) {
     TokenType operator = node.operator.type;
     if (operator == TokenType.EQ) {
       Expression rightHandSide = node.rightHandSide;
@@ -281,7 +353,7 @@
       // bound of the static types of the LHS and RHS.
       _analyzeLeastUpperBound(node, node.leftHandSide, node.rightHandSide,
           read: true);
-      return null;
+      return;
     } else if (operator == TokenType.AMPERSAND_AMPERSAND_EQ ||
         operator == TokenType.BAR_BAR_EQ) {
       _recordStaticType(node, _typeProvider.boolType);
@@ -295,7 +367,6 @@
           staticType);
       _recordStaticType(node, staticType);
     }
-    return null;
   }
 
   /**
@@ -305,7 +376,7 @@
    *   the static type of e.
    */
   @override
-  Object visitAwaitExpression(AwaitExpression node) {
+  void visitAwaitExpression(AwaitExpression node) {
     // Await the Future. This results in whatever type is (ultimately) returned.
     DartType awaitType(DartType awaitedType) {
       if (awaitedType == null) {
@@ -314,11 +385,10 @@
       if (awaitedType.isDartAsyncFutureOr) {
         return awaitType((awaitedType as InterfaceType).typeArguments[0]);
       }
-      return awaitedType.flattenFutures(_typeSystem);
+      return _typeSystem.flatten(awaitedType);
     }
 
     _recordStaticType(node, awaitType(_getStaticType(node.expression)));
-    return null;
   }
 
   /**
@@ -359,14 +429,14 @@
    * <i>super.op(e<sub>2</sub>)</i>.</blockquote>
    */
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     if (node.operator.type == TokenType.QUESTION_QUESTION) {
       // Evaluation of an if-null expression e of the form e1 ?? e2 is
       // equivalent to the evaluation of the expression
       // ((x) => x == null ? e2 : x)(e1).  The static type of e is the least
       // upper bound of the static type of e1 and the static type of e2.
       _analyzeLeastUpperBound(node, node.leftOperand, node.rightOperand);
-      return null;
+      return;
     }
     DartType staticType = node.staticInvokeType?.returnType ?? _dynamicType;
     staticType = _typeSystem.refineBinaryExpressionType(
@@ -375,7 +445,6 @@
         node.rightOperand.staticType,
         staticType);
     _recordStaticType(node, staticType);
-    return null;
   }
 
   /**
@@ -383,9 +452,8 @@
    * bool.</blockquote>
    */
   @override
-  Object visitBooleanLiteral(BooleanLiteral node) {
+  void visitBooleanLiteral(BooleanLiteral node) {
     _recordStaticType(node, _typeProvider.boolType);
-    return null;
   }
 
   /**
@@ -394,9 +462,8 @@
    * t;}(e)</i>.</blockquote>
    */
   @override
-  Object visitCascadeExpression(CascadeExpression node) {
+  void visitCascadeExpression(CascadeExpression node) {
     _recordStaticType(node, _getStaticType(node.target));
-    return null;
   }
 
   /**
@@ -409,16 +476,14 @@
    * and the static type of <i>e<sub>3</sub></i>.</blockquote>
    */
   @override
-  Object visitConditionalExpression(ConditionalExpression node) {
+  void visitConditionalExpression(ConditionalExpression node) {
     _analyzeLeastUpperBound(node, node.thenExpression, node.elseExpression);
-    return null;
   }
 
   @override
-  Object visitDeclaredIdentifier(DeclaredIdentifier node) {
+  void visitDeclaredIdentifier(DeclaredIdentifier node) {
     super.visitDeclaredIdentifier(node);
     _inferForEachLoopVariableType(node);
-    return null;
   }
 
   /**
@@ -426,13 +491,12 @@
    * double.</blockquote>
    */
   @override
-  Object visitDoubleLiteral(DoubleLiteral node) {
+  void visitDoubleLiteral(DoubleLiteral node) {
     _recordStaticType(node, _typeProvider.doubleType);
-    return null;
   }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionExpression function = node.functionExpression;
     ExecutableElementImpl functionElement =
         node.declaredElement as ExecutableElementImpl;
@@ -441,13 +505,12 @@
       // we only need to handle local functions.
       if (node.returnType == null) {
         _inferLocalFunctionReturnType(node.functionExpression);
-        return null;
+        return;
       }
       functionElement.returnType =
           _computeStaticReturnTypeOfFunctionDeclaration(node);
     }
     _recordStaticType(function, functionElement.type);
-    return null;
   }
 
   /**
@@ -481,14 +544,13 @@
    * specified as dynamic.</blockquote>
    */
   @override
-  Object visitFunctionExpression(FunctionExpression node) {
+  void visitFunctionExpression(FunctionExpression node) {
     if (node.parent is FunctionDeclaration) {
       // The function type will be resolved and set when we visit the parent
       // node.
-      return null;
+      return;
     }
     _inferLocalFunctionReturnType(node);
-    return null;
   }
 
   /**
@@ -504,11 +566,10 @@
    * static type of <i>i</i> is the declared return type of <i>F</i>.</blockquote>
    */
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     _inferGenericInvocationExpression(node);
     DartType staticType = _computeInvokeReturnType(node.staticInvokeType);
     _recordStaticType(node, staticType);
-    return null;
   }
 
   /**
@@ -517,7 +578,7 @@
    * <i>[]</i> on <i>e<sub>1</sub></i> with argument <i>e<sub>2</sub></i>.</blockquote>
    */
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     if (node.inSetterContext()) {
       ExecutableElement staticMethodElement = node.staticElement;
       DartType staticType = _computeArgumentType(staticMethodElement);
@@ -527,7 +588,6 @@
       DartType staticType = _computeStaticReturnType(staticMethodElement);
       _recordStaticType(node, staticType);
     }
-    return null;
   }
 
   /**
@@ -540,11 +600,9 @@
    * form <i>const T(a<sub>1</sub>, &hellip;, a<sub>n</sub>)</i> is <i>T</i>. </blockquote>
    */
   @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
     _inferInstanceCreationExpression(node);
-
     _recordStaticType(node, node.constructorName.type.type);
-    return null;
   }
 
   /**
@@ -565,7 +623,7 @@
    * </blockquote>
    */
   @override
-  Object visitIntegerLiteral(IntegerLiteral node) {
+  void visitIntegerLiteral(IntegerLiteral node) {
     // Check the parent context for negated integer literals.
     var context = InferenceContext.getContext(
         (node as IntegerLiteralImpl).immediatelyNegated ? node.parent : node);
@@ -576,7 +634,6 @@
     } else {
       _recordStaticType(node, _typeProvider.doubleType);
     }
-    return null;
   }
 
   /**
@@ -586,9 +643,8 @@
    * The static type of an is-expression is `bool`.</blockquote>
    */
   @override
-  Object visitIsExpression(IsExpression node) {
+  void visitIsExpression(IsExpression node) {
     _recordStaticType(node, _typeProvider.boolType);
-    return null;
   }
 
   /**
@@ -600,7 +656,7 @@
    * .</blockquote>
    */
   @override
-  Object visitListLiteral(ListLiteral node) {
+  void visitListLiteral(ListLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
 
     // If we have explicit arguments, use them
@@ -615,7 +671,7 @@
       }
       _recordStaticType(
           node, _typeProvider.listType.instantiate(<DartType>[staticType]));
-      return null;
+      return;
     }
 
     DartType listDynamicType =
@@ -631,12 +687,11 @@
       // everything was successful?
       _resolver.inferenceContext.recordInference(node, inferred);
       _recordStaticType(node, inferred);
-      return null;
+      return;
     }
 
     // If we have no type arguments and couldn't infer any, use dynamic.
     _recordStaticType(node, listDynamicType);
-    return null;
   }
 
   /**
@@ -652,12 +707,9 @@
    * <i>String</i>.</blockquote>
    */
   @override
-  Object visitMapLiteral(MapLiteral node) {
+  void visitMapLiteral(MapLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
 
-    DartType mapDynamicType = _typeProvider.mapType
-        .instantiate(<DartType>[_dynamicType, _dynamicType]);
-
     // If we have type arguments, use them
     if (typeArguments != null) {
       DartType staticKeyType = _dynamicType;
@@ -677,9 +729,12 @@
           node,
           _typeProvider.mapType
               .instantiate(<DartType>[staticKeyType, staticValueType]));
-      return null;
+      return;
     }
 
+    DartType mapDynamicType = _typeProvider.mapType
+        .instantiate(<DartType>[_dynamicType, _dynamicType]);
+
     // If we have no explicit type arguments, try to infer type arguments.
     ParameterizedType inferred = inferMapType(node);
 
@@ -690,12 +745,11 @@
       // everything was successful?
       _resolver.inferenceContext.recordInference(node, inferred);
       _recordStaticType(node, inferred);
-      return null;
+      return;
     }
 
     // If no type arguments and no inference, use dynamic
     _recordStaticType(node, mapDynamicType);
-    return null;
   }
 
   /**
@@ -735,7 +789,7 @@
    * <i>F</i>.</blockquote>
    */
   @override
-  Object visitMethodInvocation(MethodInvocation node) {
+  void visitMethodInvocation(MethodInvocation node) {
     _inferGenericInvocationExpression(node);
     // Record static return type of the static element.
     bool inferredStaticType = _inferMethodInvocationObject(node) ||
@@ -746,14 +800,12 @@
           _computeInvokeReturnType(node.staticInvokeType);
       _recordStaticType(node, staticStaticType);
     }
-    return null;
   }
 
   @override
-  Object visitNamedExpression(NamedExpression node) {
+  void visitNamedExpression(NamedExpression node) {
     Expression expression = node.expression;
     _recordStaticType(node, _getStaticType(expression));
-    return null;
   }
 
   /**
@@ -761,16 +813,14 @@
    * </blockquote>
    */
   @override
-  Object visitNullLiteral(NullLiteral node) {
+  void visitNullLiteral(NullLiteral node) {
     _recordStaticType(node, _typeProvider.nullType);
-    return null;
   }
 
   @override
-  Object visitParenthesizedExpression(ParenthesizedExpression node) {
+  void visitParenthesizedExpression(ParenthesizedExpression node) {
     Expression expression = node.expression;
     _recordStaticType(node, _getStaticType(expression));
-    return null;
   }
 
   /**
@@ -800,25 +850,25 @@
    * = r - 1; return r}(e1, e2)</i></blockquote>
    */
   @override
-  Object visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(PostfixExpression node) {
     Expression operand = node.operand;
     DartType staticType = _getStaticType(operand, read: true);
-    TokenType operator = node.operator.type;
-    if (operator == TokenType.MINUS_MINUS || operator == TokenType.PLUS_PLUS) {
-      DartType intType = _typeProvider.intType;
-      if (identical(staticType, intType)) {
-        staticType = intType;
-      }
+
+    // No need to check for `intVar++`, the result is `int`.
+    if (!staticType.isDartCoreInt) {
+      var operatorElement = node.staticElement;
+      var operatorReturnType = _computeStaticReturnType(operatorElement);
+      _checkForInvalidAssignmentIncDec(node, operand, operatorReturnType);
     }
+
     _recordStaticType(node, staticType);
-    return null;
   }
 
   /**
    * See [visitSimpleIdentifier].
    */
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefixedIdentifier = node.identifier;
     Element staticElement = prefixedIdentifier.staticElement;
     DartType staticType = _dynamicType;
@@ -850,7 +900,6 @@
       _recordStaticType(prefixedIdentifier, staticType);
       _recordStaticType(node, staticType);
     }
-    return null;
   }
 
   /**
@@ -859,7 +908,7 @@
    * form <i>op super</i> is equivalent to the method invocation <i>super.op()<i>.</blockquote>
    */
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
+  void visitPrefixExpression(PrefixExpression node) {
     TokenType operator = node.operator.type;
     if (operator == TokenType.BANG) {
       _recordStaticType(node, _typeProvider.boolType);
@@ -869,14 +918,16 @@
       DartType staticType = _computeStaticReturnType(staticMethodElement);
       if (operator == TokenType.MINUS_MINUS ||
           operator == TokenType.PLUS_PLUS) {
-        DartType intType = _typeProvider.intType;
-        if (identical(_getStaticType(node.operand, read: true), intType)) {
-          staticType = intType;
+        Expression operand = node.operand;
+        var operandReadType = _getStaticType(operand, read: true);
+        if (operandReadType.isDartCoreInt) {
+          staticType = _typeProvider.intType;
+        } else {
+          _checkForInvalidAssignmentIncDec(node, operand, staticType);
         }
       }
       _recordStaticType(node, staticType);
     }
-    return null;
   }
 
   /**
@@ -921,7 +972,7 @@
    * The static type of <i>i</i> is the declared return type of <i>m</i>.</blockquote>
    */
   @override
-  Object visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(PropertyAccess node) {
     SimpleIdentifier propertyName = node.propertyName;
     Element staticElement = propertyName.staticElement;
     DartType staticType = _dynamicType;
@@ -937,7 +988,6 @@
       _recordStaticType(propertyName, staticType);
       _recordStaticType(node, staticType);
     }
-    return null;
   }
 
   /**
@@ -945,9 +995,47 @@
    * bottom.</blockquote>
    */
   @override
-  Object visitRethrowExpression(RethrowExpression node) {
+  void visitRethrowExpression(RethrowExpression node) {
     _recordStaticType(node, _typeProvider.bottomType);
-    return null;
+  }
+
+  @override
+  void visitSetLiteral(SetLiteral node) {
+    TypeArgumentList typeArguments = node.typeArguments;
+
+    // If we have type arguments, use them
+    if (typeArguments != null) {
+      DartType elementType = _dynamicType;
+      NodeList<TypeAnnotation> arguments = typeArguments.arguments;
+      if (arguments != null && arguments.length == 1) {
+        DartType type = _getType(arguments[0]);
+        if (type != null) {
+          elementType = type;
+        }
+      }
+      _recordStaticType(
+          node, _typeProvider.setType.instantiate(<DartType>[elementType]));
+      return;
+    }
+
+    DartType setDynamicType =
+        _typeProvider.setType.instantiate(<DartType>[_dynamicType]);
+
+    // If we have no explicit type arguments, try to infer type arguments.
+    ParameterizedType inferred = inferSetType(node);
+
+    if (inferred != setDynamicType) {
+      // TODO(jmesserly): this results in an "inferred" message even when we
+      // in fact had an error above, because it will still attempt to return
+      // a type. Perhaps we should record inference from TypeSystem if
+      // everything was successful?
+      _resolver.inferenceContext.recordInference(node, inferred);
+      _recordStaticType(node, inferred);
+      return;
+    }
+
+    // If no type arguments and no inference, use dynamic
+    _recordStaticType(node, setDynamicType);
   }
 
   /**
@@ -989,7 +1077,7 @@
    * </blockquote>
    */
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     Element element = node.staticElement;
     DartType staticType = _dynamicType;
     if (element is ClassElement) {
@@ -1019,7 +1107,7 @@
       var parent = node.parent;
       if (parent is PrefixedIdentifier && parent.prefix == node ||
           parent is MethodInvocation && parent.target == node) {
-        return null;
+        return;
       }
       staticType = _typeProvider.dynamicType;
     } else if (element is DynamicElementImpl) {
@@ -1029,7 +1117,6 @@
     }
     staticType = _inferGenericInstantiationFromContext(node, staticType);
     _recordStaticType(node, staticType);
-    return null;
   }
 
   /**
@@ -1037,9 +1124,8 @@
    * `String`.</blockquote>
    */
   @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
+  void visitSimpleStringLiteral(SimpleStringLiteral node) {
     _recordStaticType(node, _typeProvider.stringType);
-    return null;
   }
 
   /**
@@ -1047,13 +1133,12 @@
    * `String`.</blockquote>
    */
   @override
-  Object visitStringInterpolation(StringInterpolation node) {
+  void visitStringInterpolation(StringInterpolation node) {
     _recordStaticType(node, _typeProvider.stringType);
-    return null;
   }
 
   @override
-  Object visitSuperExpression(SuperExpression node) {
+  void visitSuperExpression(SuperExpression node) {
     if (thisType == null) {
       // TODO(brianwilkerson) Report this error if it hasn't already been
       // reported.
@@ -1061,13 +1146,11 @@
     } else {
       _recordStaticType(node, thisType);
     }
-    return null;
   }
 
   @override
-  Object visitSymbolLiteral(SymbolLiteral node) {
+  void visitSymbolLiteral(SymbolLiteral node) {
     _recordStaticType(node, _typeProvider.symbolType);
-    return null;
   }
 
   /**
@@ -1075,7 +1158,7 @@
    * interface of the immediately enclosing class.</blockquote>
    */
   @override
-  Object visitThisExpression(ThisExpression node) {
+  void visitThisExpression(ThisExpression node) {
     if (thisType == null) {
       // TODO(brianwilkerson) Report this error if it hasn't already been
       // reported.
@@ -1083,7 +1166,6 @@
     } else {
       _recordStaticType(node, thisType);
     }
-    return null;
   }
 
   /**
@@ -1091,13 +1173,12 @@
    * bottom.</blockquote>
    */
   @override
-  Object visitThrowExpression(ThrowExpression node) {
+  void visitThrowExpression(ThrowExpression node) {
     _recordStaticType(node, _typeProvider.bottomType);
-    return null;
   }
 
   @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
+  void visitVariableDeclaration(VariableDeclaration node) {
     Expression initializer = node.initializer;
     _inferLocalVariableType(node, initializer);
     if (initializer != null) {
@@ -1108,7 +1189,6 @@
         _resolver.overrideVariable(element, rightType, true);
       }
     }
-    return null;
   }
 
   /**
@@ -1136,6 +1216,20 @@
     _recordStaticType(node, staticType);
   }
 
+  /// Check that the result [type] of a prefix or postfix `++` or `--`
+  /// expression is assignable to the write type of the [operand].
+  void _checkForInvalidAssignmentIncDec(
+      AstNode node, Expression operand, DartType type) {
+    var operandWriteType = _getStaticType(operand);
+    if (!_typeSystem.isAssignableTo(type, operandWriteType)) {
+      _resolver.errorReporter.reportTypeErrorForNode(
+        StaticTypeWarningCode.INVALID_ASSIGNMENT,
+        node,
+        [type, operandWriteType],
+      );
+    }
+  }
+
   /**
    * Record that the static type of the given node is the type of the second argument to the method
    * represented by the given element.
@@ -1185,7 +1279,7 @@
         type = (type as InterfaceType).typeArguments[0];
       }
       return _typeProvider.futureType
-          .instantiate(<DartType>[type.flattenFutures(_typeSystem)]);
+          .instantiate(<DartType>[_typeSystem.flatten(type)]);
     } else {
       return type;
     }
@@ -1432,7 +1526,7 @@
     var context = InferenceContext.getContext(node);
     if (context is FunctionType &&
         type is FunctionType &&
-        ts is StrongTypeSystemImpl) {
+        ts is Dart2TypeSystem) {
       return ts.inferFunctionTypeInstantiation(context, type,
           errorReporter: _resolver.errorReporter, errorNode: node);
     }
@@ -1481,7 +1575,7 @@
     if (typeArguments == null &&
         fnType is FunctionType &&
         fnType.typeFormals.isNotEmpty &&
-        ts is StrongTypeSystemImpl) {
+        ts is Dart2TypeSystem) {
       // Get the parameters that correspond to the uninstantiated generic.
       List<ParameterElement> rawParameters =
           ResolverVisitor.resolveArgumentsToParameters(
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index 8dcf359..824767b 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -611,9 +611,12 @@
           parameters: formalParameterList(parameters));
 
   static GenericFunctionType genericFunctionType(TypeAnnotation returnType,
-          TypeParameterList typeParameters, FormalParameterList parameters) =>
+          TypeParameterList typeParameters, FormalParameterList parameters,
+          {bool question: false}) =>
       astFactory.genericFunctionType(returnType,
-          TokenFactory.tokenFromString("Function"), typeParameters, parameters);
+          TokenFactory.tokenFromString("Function"), typeParameters, parameters,
+          question:
+              question ? TokenFactory.tokenFromType(TokenType.QUESTION) : null);
 
   static GenericTypeAlias genericTypeAlias(String name,
           TypeParameterList typeParameters, GenericFunctionType functionType) =>
@@ -1066,6 +1069,15 @@
   static ScriptTag scriptTag(String scriptTag) =>
       astFactory.scriptTag(TokenFactory.tokenFromString(scriptTag));
 
+  static SetLiteral setLiteral(Keyword keyword, TypeArgumentList typeArguments,
+          List<Expression> elements) =>
+      astFactory.setLiteral(
+          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          typeArguments,
+          TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET),
+          elements,
+          TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
+
   static ShowCombinator showCombinator(List<SimpleIdentifier> identifiers) =>
       astFactory.showCombinator(
           TokenFactory.tokenFromString("show"), identifiers);
@@ -1255,8 +1267,11 @@
           [List<TypeAnnotation> arguments]) =>
       astFactory.typeName(name, typeArgumentList(arguments));
 
-  static TypeName typeName4(String name, [List<TypeAnnotation> arguments]) =>
-      astFactory.typeName(identifier3(name), typeArgumentList(arguments));
+  static TypeName typeName4(String name,
+          [List<TypeAnnotation> arguments, bool question = false]) =>
+      astFactory.typeName(identifier3(name), typeArgumentList(arguments),
+          question:
+              question ? TokenFactory.tokenFromType(TokenType.QUESTION) : null);
 
   static TypeParameter typeParameter(String name) =>
       astFactory.typeParameter(null, null, identifier3(name), null, null);
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 27a7460..8dfa63d 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -416,8 +416,8 @@
       AnalysisContext context, String libraryName) {
     String fileName = "/$libraryName.dart";
     CompilationUnitElementImpl unit = compilationUnit(fileName);
-    LibraryElementImpl library =
-        new LibraryElementImpl(context, libraryName, 0, libraryName.length);
+    LibraryElementImpl library = new LibraryElementImpl(
+        context, null, libraryName, 0, libraryName.length);
     library.definingCompilationUnit = unit;
     return library;
   }
diff --git a/pkg/analyzer/lib/src/generated/testing/element_search.dart b/pkg/analyzer/lib/src/generated/testing/element_search.dart
index 818b56d..c6c7a8f 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_search.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_search.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -15,7 +15,7 @@
   return finder.elements;
 }
 
-class _ElementsByNameFinder extends RecursiveAstVisitor<Null> {
+class _ElementsByNameFinder extends RecursiveAstVisitor<void> {
   final String name;
   final List<Element> elements = [];
 
diff --git a/pkg/analyzer/lib/src/generated/testing/node_search.dart b/pkg/analyzer/lib/src/generated/testing/node_search.dart
index 39889ee..e1fe5f6 100644
--- a/pkg/analyzer/lib/src/generated/testing/node_search.dart
+++ b/pkg/analyzer/lib/src/generated/testing/node_search.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -15,7 +15,7 @@
   return finder.identifiers;
 }
 
-class _DeclaredIdentifiersByNameFinder extends RecursiveAstVisitor<Null> {
+class _DeclaredIdentifiersByNameFinder extends RecursiveAstVisitor<void> {
   final String name;
   final List<SimpleIdentifier> identifiers = [];
 
diff --git a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
index 17afba9..30b176b 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/constant.dart';
@@ -88,6 +89,11 @@
   InterfaceType _iterableDynamicType;
 
   /**
+   * The type representing 'Iterable<Object>'
+   */
+  InterfaceType _iterableObjectType;
+
+  /**
    * The type representing the built-in type 'Iterable'.
    */
   InterfaceType _iterableType;
@@ -108,6 +114,11 @@
   InterfaceType _mapType;
 
   /**
+   * The type representing the built-in type 'Map<Object, Object>'.
+   */
+  InterfaceType _mapObjectObjectType;
+
+  /**
    * An shared object representing the value 'null'.
    */
   DartObjectImpl _nullObject;
@@ -128,6 +139,11 @@
   InterfaceType _objectType;
 
   /**
+   * The type representing the built-in type 'Set'.
+   */
+  InterfaceType _setType;
+
+  /**
    * The type representing the built-in type 'StackTrace'.
    */
   InterfaceType _stackTraceType;
@@ -168,7 +184,13 @@
    */
   AnalysisContext _context;
 
-  TestTypeProvider([this._context]);
+  /**
+   * The analysis driver, if any. Used to create an appropriate 'dart:async'
+   * library to back `Future<T>`.
+   */
+  AnalysisDriver _driver;
+
+  TestTypeProvider([this._context, this._driver]);
 
   @override
   InterfaceType get boolType {
@@ -312,6 +334,14 @@
   }
 
   @override
+  InterfaceType get iterableObjectType {
+    if (_iterableObjectType == null) {
+      _iterableObjectType = iterableType.instantiate(<DartType>[objectType]);
+    }
+    return _iterableObjectType;
+  }
+
+  @override
   InterfaceType get iterableType {
     if (_iterableType == null) {
       ClassElementImpl iterableElement =
@@ -377,6 +407,15 @@
   }
 
   @override
+  InterfaceType get mapObjectObjectType {
+    if (_mapObjectObjectType == null) {
+      _mapObjectObjectType =
+          mapType.instantiate(<DartType>[objectType, objectType]);
+    }
+    return _mapObjectObjectType;
+  }
+
+  @override
   InterfaceType get mapType {
     if (_mapType == null) {
       ClassElementImpl mapElement =
@@ -422,7 +461,7 @@
       // Create a library element for "dart:core"
       // This enables the "isDartCoreNull" getter.
       var library = new LibraryElementImpl.forNode(
-          _context, AstTestFactory.libraryIdentifier2(["dart.core"]));
+          _context, null, AstTestFactory.libraryIdentifier2(["dart.core"]));
       var unit = new CompilationUnitElementImpl();
       library.definingCompilationUnit = unit;
       unit.librarySource = unit.source = new StringSource('', null);
@@ -464,6 +503,15 @@
   }
 
   @override
+  InterfaceType get setType {
+    if (_setType == null) {
+      ClassElementImpl setElement = ElementFactory.classElement2("Set", ["E"]);
+      _setType = setElement.type;
+    }
+    return _setType;
+  }
+
+  @override
   InterfaceType get stackTraceType {
     if (_stackTraceType == null) {
       ClassElementImpl stackTraceElement =
@@ -558,11 +606,16 @@
   }
 
   void _initDartAsync() {
-    Source asyncSource = _context.sourceFactory.forUri(DartSdk.DART_ASYNC);
-    _context.setContents(asyncSource, "");
+    Source asyncSource;
+    if (_driver == null) {
+      asyncSource = _context.sourceFactory.forUri(DartSdk.DART_ASYNC);
+      _context.setContents(asyncSource, "");
+    } else {
+      asyncSource = _driver.sourceFactory.forUri(DartSdk.DART_ASYNC);
+    }
     CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl();
     LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(
-        _context, AstTestFactory.libraryIdentifier2(["dart.async"]));
+        _context, null, AstTestFactory.libraryIdentifier2(["dart.async"]));
     asyncLibrary.definingCompilationUnit = asyncUnit;
     asyncUnit.librarySource = asyncUnit.source = asyncSource;
 
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index beb1160..6a4ffba 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/ast/token.dart' show Keyword, TokenType;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/element/type_system.dart' as public;
 import 'package:analyzer/error/listener.dart' show ErrorReporter;
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
@@ -62,680 +63,13 @@
       identical(t, UnknownInferredType.instance);
 }
 
-/// Tracks upper and lower type bounds for a set of type parameters.
-///
-/// This class is used by calling [isSubtypeOf]. When it encounters one of
-/// the type parameters it is inferring, it will record the constraint, and
-/// optimistically assume the constraint will be satisfied.
-///
-/// For example if we are inferring type parameter A, and we ask if
-/// `A <: num`, this will record that A must be a subytpe of `num`. It also
-/// handles cases when A appears as part of the structure of another type, for
-/// example `Iterable<A> <: Iterable<num>` would infer the same constraint
-/// (due to covariant generic types) as would `() -> A <: () -> num`. In
-/// contrast `(A) -> void <: (num) -> void`.
-///
-/// Once the lower/upper bounds are determined, [infer] should be called to
-/// finish the inference. It will instantiate a generic function type with the
-/// inferred types for each type parameter.
-///
-/// It can also optionally compute a partial solution, in case some of the type
-/// parameters could not be inferred (because the constraints cannot be
-/// satisfied), or bail on the inference when this happens.
-///
-/// As currently designed, an instance of this class should only be used to
-/// infer a single call and discarded immediately afterwards.
-class GenericInferrer {
-  final StrongTypeSystemImpl _typeSystem;
-  final TypeProvider typeProvider;
-  final Map<TypeParameterElement, List<_TypeConstraint>> constraints;
-
-  /// Buffer recording constraints recorded while performing a recursive call to
-  /// [_matchSubtypeOf] that might fail, so that any constraints recorded during
-  /// the failed match can be rewound.
-  final _undoBuffer = <_TypeConstraint>[];
-
-  GenericInferrer(this.typeProvider, this._typeSystem,
-      Iterable<TypeParameterElement> typeFormals)
-      : constraints = new HashMap(
-            equals: (x, y) => x.location == y.location,
-            hashCode: (x) => x.location.hashCode) {
-    for (var formal in typeFormals) {
-      constraints[formal] = [];
-    }
-  }
-
-  /// Apply an argument constraint, which asserts that the [argument] staticType
-  /// is a subtype of the [parameterType].
-  void constrainArgument(
-      DartType argumentType, DartType parameterType, String parameterName,
-      {DartType genericType}) {
-    var origin = new _TypeConstraintFromArgument(
-        argumentType, parameterType, parameterName,
-        genericType: genericType);
-    tryMatchSubtypeOf(argumentType, parameterType, origin, covariant: false);
-  }
-
-  /// Constrain a universal function type [fnType] used in a context
-  /// [contextType].
-  void constrainGenericFunctionInContext(
-      FunctionType fnType, DartType contextType) {
-    var origin = new _TypeConstraintFromFunctionContext(fnType, contextType);
-
-    // Since we're trying to infer the instantiation, we want to ignore type
-    // formals as we check the parameters and return type.
-    var inferFnType =
-        fnType.instantiate(TypeParameterTypeImpl.getTypes(fnType.typeFormals));
-    tryMatchSubtypeOf(inferFnType, contextType, origin, covariant: true);
-  }
-
-  /// Apply a return type constraint, which asserts that the [declaredType]
-  /// is a subtype of the [contextType].
-  void constrainReturnType(DartType declaredType, DartType contextType) {
-    var origin = new _TypeConstraintFromReturnType(declaredType, contextType);
-    tryMatchSubtypeOf(declaredType, contextType, origin, covariant: true);
-  }
-
-  /// Given the constraints that were given by calling [isSubtypeOf], find the
-  /// instantiation of the generic function that satisfies these constraints.
-  ///
-  /// If [downwardsInferPhase] is set, we are in the first pass of inference,
-  /// pushing context types down. At that point we are allowed to push down
-  /// `?` to precisely represent an unknown type. If [downwardsInferPhase] is
-  /// false, we are on our final inference pass, have all available information
-  /// including argument types, and must not conclude `?` for any type formal.
-  T infer<T extends ParameterizedType>(
-      T genericType, List<TypeParameterElement> typeFormals,
-      {bool considerExtendsClause: true,
-      ErrorReporter errorReporter,
-      AstNode errorNode,
-      bool downwardsInferPhase: false}) {
-    var fnTypeParams = TypeParameterTypeImpl.getTypes(typeFormals);
-
-    // Initialize the inferred type array.
-    //
-    // In the downwards phase, they all start as `?` to offer reasonable
-    // degradation for f-bounded type parameters.
-    var inferredTypes = new List<DartType>.filled(
-        fnTypeParams.length, UnknownInferredType.instance);
-    var _inferTypeParameter = downwardsInferPhase
-        ? _inferTypeParameterFromContext
-        : _inferTypeParameterFromAll;
-
-    for (int i = 0; i < fnTypeParams.length; i++) {
-      TypeParameterType typeParam = fnTypeParams[i];
-
-      var typeParamBound = typeParam.bound;
-      _TypeConstraint extendsClause;
-      if (considerExtendsClause && !typeParamBound.isDynamic) {
-        extendsClause = new _TypeConstraint.fromExtends(typeParam,
-            typeParam.bound.substitute2(inferredTypes, fnTypeParams));
-      }
-
-      inferredTypes[i] =
-          _inferTypeParameter(constraints[typeParam.element], extendsClause);
-    }
-
-    // If the downwards infer phase has failed, we'll catch this in the upwards
-    // phase later on.
-    if (downwardsInferPhase) {
-      return genericType.instantiate(inferredTypes) as T;
-    }
-
-    // Check the inferred types against all of the constraints.
-    var knownTypes = new HashMap<TypeParameterType, DartType>(
-        equals: (x, y) => x.element == y.element,
-        hashCode: (x) => x.element.hashCode);
-    for (int i = 0; i < fnTypeParams.length; i++) {
-      TypeParameterType typeParam = fnTypeParams[i];
-      var constraints = this.constraints[typeParam.element];
-      var typeParamBound =
-          typeParam.bound.substitute2(inferredTypes, fnTypeParams);
-
-      var inferred = inferredTypes[i];
-      bool success =
-          constraints.every((c) => c.isSatisifedBy(_typeSystem, inferred));
-      if (success && !typeParamBound.isDynamic) {
-        // If everything else succeeded, check the `extends` constraint.
-        var extendsConstraint =
-            new _TypeConstraint.fromExtends(typeParam, typeParamBound);
-        constraints.add(extendsConstraint);
-        success = extendsConstraint.isSatisifedBy(_typeSystem, inferred);
-      }
-
-      if (!success) {
-        errorReporter?.reportErrorForNode(
-            StrongModeCode.COULD_NOT_INFER,
-            errorNode,
-            [typeParam, _formatError(typeParam, inferred, constraints)]);
-
-        // Heuristic: even if we failed, keep the erroneous type.
-        // It should satisfy at least some of the constraints (e.g. the return
-        // context). If we fall back to instantiateToBounds, we'll typically get
-        // more errors (e.g. because `dynamic` is the most common bound).
-      }
-
-      if (inferred is FunctionType && inferred.typeFormals.isNotEmpty) {
-        errorReporter
-            ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
-          typeParam,
-          ' Inferred candidate type $inferred has type parameters'
-              ' ${(inferred as FunctionType).typeFormals}, but a function with'
-              ' type parameters cannot be used as a type argument.'
-        ]);
-
-        // Heuristic: Using a generic function type as a bound makes subtyping
-        // undecidable. Therefore, we cannot keep [inferred] unless we wish to
-        // generate bogus subtyping errors. Instead generate plain [Function],
-        // which is the most general function type.
-        inferred = typeProvider.functionType;
-      }
-
-      if (UnknownInferredType.isKnown(inferred)) {
-        knownTypes[typeParam] = inferred;
-      }
-    }
-
-    // Use instantiate to bounds to finish things off.
-    var hasError = new List<bool>.filled(fnTypeParams.length, false);
-    var result = _typeSystem.instantiateToBounds(genericType,
-        hasError: hasError, knownTypes: knownTypes) as T;
-
-    // Report any errors from instantiateToBounds.
-    for (int i = 0; i < hasError.length; i++) {
-      if (hasError[i]) {
-        TypeParameterType typeParam = fnTypeParams[i];
-        var typeParamBound =
-            typeParam.bound.substitute2(inferredTypes, fnTypeParams);
-        // TODO(jmesserly): improve this error message.
-        errorReporter
-            ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
-          typeParam,
-          "\nRecursive bound cannot be instantiated: '$typeParamBound'."
-              "\nConsider passing explicit type argument(s) "
-              "to the generic.\n\n'"
-        ]);
-      }
-    }
-    return result;
-  }
-
-  /// Tries to make [i1] a subtype of [i2] and accumulate constraints as needed.
-  ///
-  /// The return value indicates whether the match was successful.  If it was
-  /// unsuccessful, any constraints that were accumulated during the match
-  /// attempt have been rewound (see [_rewindConstraints]).
-  bool tryMatchSubtypeOf(DartType t1, DartType t2, _TypeConstraintOrigin origin,
-      {bool covariant}) {
-    int previousRewindBufferLength = _undoBuffer.length;
-    bool success = _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
-    if (!success) {
-      _rewindConstraints(previousRewindBufferLength);
-    }
-    return success;
-  }
-
-  /// Choose the bound that was implied by the return type, if any.
-  ///
-  /// Which bound this is depends on what positions the type parameter
-  /// appears in. If the type only appears only in a contravariant position,
-  /// we will choose the lower bound instead.
-  ///
-  /// For example given:
-  ///
-  ///     Func1<T, bool> makeComparer<T>(T x) => (T y) => x() == y;
-  ///
-  ///     main() {
-  ///       Func1<num, bool> t = makeComparer/* infer <num> */(42);
-  ///       print(t(42.0)); /// false, no error.
-  ///     }
-  ///
-  /// The constraints we collect are:
-  ///
-  /// * `num <: T`
-  /// * `int <: T`
-  ///
-  /// ... and no upper bound. Therefore the lower bound is the best choice.
-  DartType _chooseTypeFromConstraints(Iterable<_TypeConstraint> constraints,
-      {bool toKnownType: false}) {
-    DartType lower = UnknownInferredType.instance;
-    DartType upper = UnknownInferredType.instance;
-    for (var constraint in constraints) {
-      // Given constraints:
-      //
-      //     L1 <: T <: U1
-      //     L2 <: T <: U2
-      //
-      // These can be combined to produce:
-      //
-      //     LUB(L1, L2) <: T <: GLB(U1, U2).
-      //
-      // This can then be done for all constraints in sequence.
-      //
-      // This resulting constraint may be unsatisfiable; in that case inference
-      // will fail.
-      upper = _getGreatestLowerBound(upper, constraint.upperBound);
-      lower = _typeSystem.getLeastUpperBound(lower, constraint.lowerBound);
-    }
-
-    // Prefer the known bound, if any.
-    // Otherwise take whatever bound has partial information, e.g. `Iterable<?>`
-    //
-    // For both of those, prefer the lower bound (arbitrary heuristic).
-    if (UnknownInferredType.isKnown(lower)) {
-      return lower;
-    }
-    if (UnknownInferredType.isKnown(upper)) {
-      return upper;
-    }
-    if (!identical(UnknownInferredType.instance, lower)) {
-      return toKnownType ? _typeSystem.lowerBoundForType(lower) : lower;
-    }
-    if (!identical(UnknownInferredType.instance, upper)) {
-      return toKnownType ? _typeSystem.upperBoundForType(upper) : upper;
-    }
-    return lower;
-  }
-
-  String _formatError(TypeParameterType typeParam, DartType inferred,
-      Iterable<_TypeConstraint> constraints) {
-    var intro = "Tried to infer '$inferred' for '$typeParam'"
-        " which doesn't work:";
-
-    var constraintsByOrigin = <_TypeConstraintOrigin, List<_TypeConstraint>>{};
-    for (var c in constraints) {
-      constraintsByOrigin.putIfAbsent(c.origin, () => []).add(c);
-    }
-
-    // Only report unique constraint origins.
-    Iterable<_TypeConstraint> isSatisified(bool expected) => constraintsByOrigin
-        .values
-        .where((l) =>
-            l.every((c) => c.isSatisifedBy(_typeSystem, inferred)) == expected)
-        .expand((i) => i);
-
-    String unsatisified = _formatConstraints(isSatisified(false));
-    String satisified = _formatConstraints(isSatisified(true));
-
-    assert(unsatisified.isNotEmpty);
-    if (satisified.isNotEmpty) {
-      satisified = "\nThe type '$inferred' was inferred from:\n$satisified";
-    }
-
-    return '\n\n$intro\n$unsatisified$satisified\n\n'
-        'Consider passing explicit type argument(s) to the generic.\n\n';
-  }
-
-  /// This is first calls strong mode's GLB, but if it fails to find anything
-  /// (i.e. returns the bottom type), we kick in a few additional rules:
-  ///
-  /// - `GLB(FutureOr<A>, B)` is defined as:
-  ///   - `GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>`
-  ///   - `GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>`
-  ///   - else `GLB(FutureOr<A>, B) == GLB(A, B)`
-  /// - `GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)` (defined above),
-  /// - else `GLB(A, B) == Null`
-  DartType _getGreatestLowerBound(DartType t1, DartType t2) {
-    var result = _typeSystem.getGreatestLowerBound(t1, t2);
-    if (result.isBottom) {
-      // See if we can do better by considering FutureOr rules.
-      if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
-        var t1TypeArg = t1.typeArguments[0];
-        if (t2 is InterfaceType) {
-          //  GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
-          if (t2.isDartAsyncFutureOr) {
-            var t2TypeArg = t2.typeArguments[0];
-            return typeProvider.futureOrType
-                .instantiate([_getGreatestLowerBound(t1TypeArg, t2TypeArg)]);
-          }
-          // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
-          if (t2.isDartAsyncFuture) {
-            var t2TypeArg = t2.typeArguments[0];
-            return typeProvider.futureType
-                .instantiate([_getGreatestLowerBound(t1TypeArg, t2TypeArg)]);
-          }
-        }
-        // GLB(FutureOr<A>, B) == GLB(A, B)
-        return _getGreatestLowerBound(t1TypeArg, t2);
-      }
-      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-        // GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)
-        return _getGreatestLowerBound(t2, t1);
-      }
-      return typeProvider.nullType;
-    }
-    return result;
-  }
-
-  DartType _inferTypeParameterFromAll(
-      List<_TypeConstraint> constraints, _TypeConstraint extendsClause) {
-    // See if we already fixed this type from downwards inference.
-    // If so, then we aren't allowed to change it based on argument types.
-    DartType t = _inferTypeParameterFromContext(
-        constraints.where((c) => c.isDownwards), extendsClause);
-    if (UnknownInferredType.isKnown(t)) {
-      // Remove constraints that aren't downward ones; we'll ignore these for
-      // error reporting, because inference already succeeded.
-      constraints.removeWhere((c) => !c.isDownwards);
-      return t;
-    }
-
-    if (extendsClause != null) {
-      constraints = constraints.toList()..add(extendsClause);
-    }
-
-    var choice = _chooseTypeFromConstraints(constraints, toKnownType: true);
-    return choice;
-  }
-
-  DartType _inferTypeParameterFromContext(
-      Iterable<_TypeConstraint> constraints, _TypeConstraint extendsClause) {
-    DartType t = _chooseTypeFromConstraints(constraints);
-    if (UnknownInferredType.isUnknown(t)) {
-      return t;
-    }
-
-    // If we're about to make our final choice, apply the extends clause.
-    // This gives us a chance to refine the choice, in case it would violate
-    // the `extends` clause. For example:
-    //
-    //     Object obj = math.min/*<infer Object, error>*/(1, 2);
-    //
-    // If we consider the `T extends num` we conclude `<num>`, which works.
-    if (extendsClause != null) {
-      constraints = constraints.toList()..add(extendsClause);
-      return _chooseTypeFromConstraints(constraints);
-    }
-    return t;
-  }
-
-  /// Tries to make [i1] a subtype of [i2] and accumulate constraints as needed.
-  ///
-  /// The return value indicates whether the match was successful.  If it was
-  /// unsuccessful, the caller is responsible for ignoring any constraints that
-  /// were accumulated (see [_rewindConstraints]).
-  bool _matchInterfaceSubtypeOf(InterfaceType i1, InterfaceType i2,
-      Set<Element> visited, _TypeConstraintOrigin origin,
-      {bool covariant}) {
-    if (identical(i1, i2)) {
-      return true;
-    }
-
-    if (i1.element == i2.element) {
-      List<DartType> tArgs1 = i1.typeArguments;
-      List<DartType> tArgs2 = i2.typeArguments;
-      assert(tArgs1.length == tArgs2.length);
-      for (int i = 0; i < tArgs1.length; i++) {
-        if (!_matchSubtypeOf(tArgs1[i], tArgs2[i], visited, origin,
-            covariant: covariant)) {
-          return false;
-        }
-      }
-      return true;
-    }
-    if (i1.isObject) {
-      return false;
-    }
-
-    // Guard against loops in the class hierarchy
-    //
-    // TODO(jmesserly): this function isn't guarding against anything (it's not
-    // passsing down `visitedSet`, so adding the element has no effect).
-    //
-    // If that's fixed, it breaks inference tests for types like
-    // `Iterable<Iterable<?>>` matched aganinst `List<List<int>>`.
-    //
-    // The fix is for type arguments (above) to not pass down `visited`, similar
-    // to how _isInterfaceSubtypeOf does not pass down `visited` for type
-    // arguments.
-    bool guardedInterfaceSubtype(InterfaceType t1) {
-      var visitedSet = visited ?? new HashSet<Element>();
-      if (visitedSet.add(t1.element)) {
-        bool matched = _matchInterfaceSubtypeOf(t1, i2, visited, origin,
-            covariant: covariant);
-        visitedSet.remove(t1.element);
-        return matched;
-      } else {
-        // In the case of a recursive type parameter, consider the subtype
-        // match to have failed.
-        return false;
-      }
-    }
-
-    // We don't need to search the entire class hierarchy, since a given
-    // subclass can't appear multiple times with different generic parameters.
-    // So shortcut to the first match found.
-    //
-    // We don't need undo logic here because if the classes don't match, nothing
-    // is added to the constraint set.
-    var superclass = i1.superclass;
-    if (superclass != null && guardedInterfaceSubtype(superclass)) return true;
-    for (final parent in i1.interfaces) {
-      if (guardedInterfaceSubtype(parent)) return true;
-    }
-    for (final parent in i1.mixins) {
-      if (guardedInterfaceSubtype(parent)) return true;
-    }
-    for (final parent in i1.superclassConstraints) {
-      if (guardedInterfaceSubtype(parent)) return true;
-    }
-    return false;
-  }
-
-  /// Assert that [t1] will be a subtype of [t2], and returns if the constraint
-  /// can be satisfied.
-  ///
-  /// [covariant] must be true if [t1] is a declared type of the generic
-  /// function and [t2] is the context type, or false if the reverse. For
-  /// example [covariant] is used when [t1] is the declared return type
-  /// and [t2] is the context type. Contravariant would be used if [t1] is the
-  /// argument type (i.e. passed in to the generic function) and [t2] is the
-  /// declared parameter type.
-  ///
-  /// [origin] indicates where the constraint came from, for example an argument
-  /// or return type.
-  bool _matchSubtypeOf(DartType t1, DartType t2, Set<Element> visited,
-      _TypeConstraintOrigin origin,
-      {bool covariant}) {
-    if (covariant && t1 is TypeParameterType) {
-      var constraints = this.constraints[t1.element];
-      if (constraints != null) {
-        if (!identical(t2, UnknownInferredType.instance)) {
-          var constraint = new _TypeConstraint(origin, t1, upper: t2);
-          constraints.add(constraint);
-          _undoBuffer.add(constraint);
-        }
-        return true;
-      }
-    }
-    if (!covariant && t2 is TypeParameterType) {
-      var constraints = this.constraints[t2.element];
-      if (constraints != null) {
-        if (!identical(t1, UnknownInferredType.instance)) {
-          var constraint = new _TypeConstraint(origin, t2, lower: t1);
-          constraints.add(constraint);
-          _undoBuffer.add(constraint);
-        }
-        return true;
-      }
-    }
-
-    if (identical(t1, t2)) {
-      return true;
-    }
-
-    // TODO(jmesserly): this logic is taken from subtype.
-    bool matchSubtype(DartType t1, DartType t2) {
-      return _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
-    }
-
-    // Handle FutureOr<T> union type.
-    if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
-      var t1TypeArg = t1.typeArguments[0];
-      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-        var t2TypeArg = t2.typeArguments[0];
-        // FutureOr<A> <: FutureOr<B> iff A <: B
-        return matchSubtype(t1TypeArg, t2TypeArg);
-      }
-
-      // given t1 is Future<A> | A, then:
-      // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
-      var t1Future = typeProvider.futureType.instantiate([t1TypeArg]);
-      return matchSubtype(t1Future, t2) && matchSubtype(t1TypeArg, t2);
-    }
-
-    if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
-      // given t2 is Future<A> | A, then:
-      // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
-      var t2TypeArg = t2.typeArguments[0];
-      var t2Future = typeProvider.futureType.instantiate([t2TypeArg]);
-
-      // First we try matching `t1 <: Future<A>`.  If that succeeds *and*
-      // records at least one constraint, then we proceed using that constraint.
-      var previousRewindBufferLength = _undoBuffer.length;
-      var success =
-          tryMatchSubtypeOf(t1, t2Future, origin, covariant: covariant);
-
-      if (_undoBuffer.length != previousRewindBufferLength) {
-        // Trying to match `t1 <: Future<A>` succeeded and recorded constraints,
-        // so those are the constraints we want.
-        return true;
-      } else {
-        // Either `t1 <: Future<A>` failed to match, or it matched trivially
-        // without recording any constraints (e.g. because t1 is `Null`).  We
-        // want constraints, because they let us do more precise inference, so
-        // go ahead and try matching `t1 <: A` to see if it records any
-        // constraints.
-        if (tryMatchSubtypeOf(t1, t2TypeArg, origin, covariant: covariant)) {
-          // Trying to match `t1 <: A` succeeded.  If it recorded constraints,
-          // those are the constraints we want.  If it didn't, then there's no
-          // way we're going to get any constraints.  So either way, we want to
-          // return `true` since the match suceeded and the constraints we want
-          // (if any) have been recorded.
-          return true;
-        } else {
-          // Trying to match `t1 <: A` failed.  So there's no way we are going
-          // to get any constraints.  Just return `success` to indicate whether
-          // the match succeeded.
-          return success;
-        }
-      }
-    }
-
-    // S <: T where S is a type variable
-    //  T is not dynamic or object (handled above)
-    //  True if T == S
-    //  Or true if bound of S is S' and S' <: T
-
-    if (t1 is TypeParameterType) {
-      // Guard against recursive type parameters
-      //
-      // TODO(jmesserly): this function isn't guarding against anything (it's
-      // not passsing down `visitedSet`, so adding the element has no effect).
-      bool guardedSubtype(DartType t1, DartType t2) {
-        var visitedSet = visited ?? new HashSet<Element>();
-        if (visitedSet.add(t1.element)) {
-          bool matched = matchSubtype(t1, t2);
-          visitedSet.remove(t1.element);
-          return matched;
-        } else {
-          // In the case of a recursive type parameter, consider the subtype
-          // match to have failed.
-          return false;
-        }
-      }
-
-      if (t2 is TypeParameterType && t1.definition == t2.definition) {
-        return guardedSubtype(t1.bound, t2.bound);
-      }
-      return guardedSubtype(t1.bound, t2);
-    }
-    if (t2 is TypeParameterType) {
-      return false;
-    }
-
-    if (_isBottom(t1) || _isTop(t2)) return true;
-
-    if (t1 is InterfaceType && t2 is InterfaceType) {
-      return _matchInterfaceSubtypeOf(t1, t2, visited, origin,
-          covariant: covariant);
-    }
-
-    if (t1 is FunctionType && t2 is FunctionType) {
-      return FunctionTypeImpl.relate(t1, t2, matchSubtype,
-          parameterRelation: (p1, p2) {
-            return _matchSubtypeOf(p2.type, p1.type, null, origin,
-                covariant: !covariant);
-          },
-          // Type parameter bounds are invariant.
-          boundsRelation: (t1, t2, p1, p2) =>
-              matchSubtype(t1, t2) && matchSubtype(t2, t1));
-    }
-
-    if (t1 is FunctionType && t2 == typeProvider.functionType) {
-      return true;
-    }
-
-    return false;
-  }
-
-  /// Un-does constraints that were gathered by a failed match attempt, until
-  /// [_undoBuffer] has length [previousRewindBufferLength].
-  ///
-  /// The intended usage is that the caller should record the length of
-  /// [_undoBuffer] before attempting to make a match.  Then, if the match
-  /// fails, pass the recorded length to this method to erase any constraints
-  /// that were recorded during the failed match.
-  void _rewindConstraints(int previousRewindBufferLength) {
-    while (_undoBuffer.length > previousRewindBufferLength) {
-      var constraint = _undoBuffer.removeLast();
-      var element = constraint.typeParameter.element;
-      assert(identical(constraints[element].last, constraint));
-      constraints[element].removeLast();
-    }
-  }
-
-  static String _formatConstraints(Iterable<_TypeConstraint> constraints) {
-    List<List<String>> lineParts =
-        new Set<_TypeConstraintOrigin>.from(constraints.map((c) => c.origin))
-            .map((o) => o.formatError())
-            .toList();
-
-    int prefixMax = lineParts.map((p) => p[0].length).fold(0, math.max);
-
-    // Use a set to prevent identical message lines.
-    // (It's not uncommon for the same constraint to show up in a few places.)
-    var messageLines = new Set<String>.from(lineParts.map((parts) {
-      var prefix = parts[0];
-      var middle = parts[1];
-      var prefixPad = ' ' * (prefixMax - prefix.length);
-      var middlePad = ' ' * (prefixMax);
-      var end = "";
-      if (parts.length > 2) {
-        end = '\n  $middlePad ${parts[2]}';
-      }
-      return '  $prefix$prefixPad $middle$end';
-    }));
-
-    return messageLines.join('\n');
-  }
-}
-
 /**
- * Implementation of [TypeSystem] using the strong mode rules.
- * https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
+ * A type system that implements the type semantics for Dart 2.0.
  */
-class StrongTypeSystemImpl extends TypeSystem {
+class Dart2TypeSystem extends TypeSystem {
   static bool _comparingTypeParameterBounds = false;
 
   /**
-   * True if declaration casts should be allowed, otherwise false.
-   *
-   * This affects the behavior of [isAssignableTo].
-   */
-  final bool declarationCasts;
-
-  /**
    * True if implicit casts should be allowed, otherwise false.
    *
    * This affects the behavior of [isAssignableTo].
@@ -744,9 +78,9 @@
 
   final TypeProvider typeProvider;
 
-  StrongTypeSystemImpl(this.typeProvider,
-      {this.declarationCasts: true, this.implicitCasts: true});
+  Dart2TypeSystem(this.typeProvider, {this.implicitCasts: true});
 
+  @deprecated
   @override
   bool get isStrong => true;
 
@@ -1048,8 +382,7 @@
   }
 
   @override
-  bool isAssignableTo(DartType fromType, DartType toType,
-      {bool isDeclarationCast = false}) {
+  bool isAssignableTo(DartType fromType, DartType toType) {
     // An actual subtype
     if (isSubtypeOf(fromType, toType)) {
       return true;
@@ -1063,11 +396,7 @@
       }
     }
 
-    if (isDeclarationCast) {
-      if (!declarationCasts) {
-        return false;
-      }
-    } else if (!implicitCasts) {
+    if (!implicitCasts) {
       return false;
     }
 
@@ -1556,7 +885,7 @@
   DartType _substituteForUnknownType(DartType type, {bool lowerBound: false}) {
     if (identical(type, UnknownInferredType.instance)) {
       if (lowerBound) {
-        // TODO(jmesserly): this should be the bottom type, once i can be
+        // TODO(jmesserly): this should be the bottom type, once it can be
         // reified.
         return typeProvider.nullType;
       }
@@ -1567,7 +896,8 @@
       var newTypeArgs = _transformList(type.typeArguments,
           (t) => _substituteForUnknownType(t, lowerBound: lowerBound));
       if (identical(type.typeArguments, newTypeArgs)) return type;
-      return new InterfaceTypeImpl(type.element, type.prunedTypedefs)
+      return new InterfaceTypeImpl(
+          type.element, type.prunedTypedefs, type.nullability)
         ..typeArguments = newTypeArgs;
     }
     if (type is FunctionType) {
@@ -1593,7 +923,8 @@
       }
 
       return new FunctionTypeImpl.synthetic(
-          newReturnType, type.typeFormals, newParameters);
+          newReturnType, type.typeFormals, newParameters,
+          nullability: (type as TypeImpl).nullability);
     }
     return type;
   }
@@ -1681,6 +1012,664 @@
   }
 }
 
+/// Tracks upper and lower type bounds for a set of type parameters.
+///
+/// This class is used by calling [isSubtypeOf]. When it encounters one of
+/// the type parameters it is inferring, it will record the constraint, and
+/// optimistically assume the constraint will be satisfied.
+///
+/// For example if we are inferring type parameter A, and we ask if
+/// `A <: num`, this will record that A must be a subytpe of `num`. It also
+/// handles cases when A appears as part of the structure of another type, for
+/// example `Iterable<A> <: Iterable<num>` would infer the same constraint
+/// (due to covariant generic types) as would `() -> A <: () -> num`. In
+/// contrast `(A) -> void <: (num) -> void`.
+///
+/// Once the lower/upper bounds are determined, [infer] should be called to
+/// finish the inference. It will instantiate a generic function type with the
+/// inferred types for each type parameter.
+///
+/// It can also optionally compute a partial solution, in case some of the type
+/// parameters could not be inferred (because the constraints cannot be
+/// satisfied), or bail on the inference when this happens.
+///
+/// As currently designed, an instance of this class should only be used to
+/// infer a single call and discarded immediately afterwards.
+class GenericInferrer {
+  final Dart2TypeSystem _typeSystem;
+  final TypeProvider typeProvider;
+  final Map<TypeParameterElement, List<_TypeConstraint>> constraints;
+
+  /// Buffer recording constraints recorded while performing a recursive call to
+  /// [_matchSubtypeOf] that might fail, so that any constraints recorded during
+  /// the failed match can be rewound.
+  final _undoBuffer = <_TypeConstraint>[];
+
+  GenericInferrer(this.typeProvider, this._typeSystem,
+      Iterable<TypeParameterElement> typeFormals)
+      : constraints = new HashMap(
+            equals: (x, y) => x.location == y.location,
+            hashCode: (x) => x.location.hashCode) {
+    for (var formal in typeFormals) {
+      constraints[formal] = [];
+    }
+  }
+
+  /// Apply an argument constraint, which asserts that the [argument] staticType
+  /// is a subtype of the [parameterType].
+  void constrainArgument(
+      DartType argumentType, DartType parameterType, String parameterName,
+      {DartType genericType}) {
+    var origin = new _TypeConstraintFromArgument(
+        argumentType, parameterType, parameterName,
+        genericType: genericType);
+    tryMatchSubtypeOf(argumentType, parameterType, origin, covariant: false);
+  }
+
+  /// Constrain a universal function type [fnType] used in a context
+  /// [contextType].
+  void constrainGenericFunctionInContext(
+      FunctionType fnType, DartType contextType) {
+    var origin = new _TypeConstraintFromFunctionContext(fnType, contextType);
+
+    // Since we're trying to infer the instantiation, we want to ignore type
+    // formals as we check the parameters and return type.
+    var inferFnType =
+        fnType.instantiate(TypeParameterTypeImpl.getTypes(fnType.typeFormals));
+    tryMatchSubtypeOf(inferFnType, contextType, origin, covariant: true);
+  }
+
+  /// Apply a return type constraint, which asserts that the [declaredType]
+  /// is a subtype of the [contextType].
+  void constrainReturnType(DartType declaredType, DartType contextType) {
+    var origin = new _TypeConstraintFromReturnType(declaredType, contextType);
+    tryMatchSubtypeOf(declaredType, contextType, origin, covariant: true);
+  }
+
+  /// Given the constraints that were given by calling [isSubtypeOf], find the
+  /// instantiation of the generic function that satisfies these constraints.
+  ///
+  /// If [downwardsInferPhase] is set, we are in the first pass of inference,
+  /// pushing context types down. At that point we are allowed to push down
+  /// `?` to precisely represent an unknown type. If [downwardsInferPhase] is
+  /// false, we are on our final inference pass, have all available information
+  /// including argument types, and must not conclude `?` for any type formal.
+  T infer<T extends ParameterizedType>(
+      T genericType, List<TypeParameterElement> typeFormals,
+      {bool considerExtendsClause: true,
+      ErrorReporter errorReporter,
+      AstNode errorNode,
+      bool downwardsInferPhase: false}) {
+    var fnTypeParams = TypeParameterTypeImpl.getTypes(typeFormals);
+
+    // Initialize the inferred type array.
+    //
+    // In the downwards phase, they all start as `?` to offer reasonable
+    // degradation for f-bounded type parameters.
+    var inferredTypes = new List<DartType>.filled(
+        fnTypeParams.length, UnknownInferredType.instance);
+    var _inferTypeParameter = downwardsInferPhase
+        ? _inferTypeParameterFromContext
+        : _inferTypeParameterFromAll;
+
+    for (int i = 0; i < fnTypeParams.length; i++) {
+      TypeParameterType typeParam = fnTypeParams[i];
+
+      var typeParamBound = typeParam.bound;
+      _TypeConstraint extendsClause;
+      if (considerExtendsClause && !typeParamBound.isDynamic) {
+        extendsClause = new _TypeConstraint.fromExtends(typeParam,
+            typeParam.bound.substitute2(inferredTypes, fnTypeParams));
+      }
+
+      inferredTypes[i] =
+          _inferTypeParameter(constraints[typeParam.element], extendsClause);
+    }
+
+    // If the downwards infer phase has failed, we'll catch this in the upwards
+    // phase later on.
+    if (downwardsInferPhase) {
+      return genericType.instantiate(inferredTypes) as T;
+    }
+
+    // Check the inferred types against all of the constraints.
+    var knownTypes = new HashMap<TypeParameterType, DartType>(
+        equals: (x, y) => x.element == y.element,
+        hashCode: (x) => x.element.hashCode);
+    for (int i = 0; i < fnTypeParams.length; i++) {
+      TypeParameterType typeParam = fnTypeParams[i];
+      var constraints = this.constraints[typeParam.element];
+      var typeParamBound =
+          typeParam.bound.substitute2(inferredTypes, fnTypeParams);
+
+      var inferred = inferredTypes[i];
+      bool success =
+          constraints.every((c) => c.isSatisifedBy(_typeSystem, inferred));
+      if (success && !typeParamBound.isDynamic) {
+        // If everything else succeeded, check the `extends` constraint.
+        var extendsConstraint =
+            new _TypeConstraint.fromExtends(typeParam, typeParamBound);
+        constraints.add(extendsConstraint);
+        success = extendsConstraint.isSatisifedBy(_typeSystem, inferred);
+      }
+
+      if (!success) {
+        errorReporter?.reportErrorForNode(
+            StrongModeCode.COULD_NOT_INFER,
+            errorNode,
+            [typeParam, _formatError(typeParam, inferred, constraints)]);
+
+        // Heuristic: even if we failed, keep the erroneous type.
+        // It should satisfy at least some of the constraints (e.g. the return
+        // context). If we fall back to instantiateToBounds, we'll typically get
+        // more errors (e.g. because `dynamic` is the most common bound).
+      }
+
+      if (inferred is FunctionType && inferred.typeFormals.isNotEmpty) {
+        errorReporter
+            ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
+          typeParam,
+          ' Inferred candidate type $inferred has type parameters'
+              ' ${(inferred as FunctionType).typeFormals}, but a function with'
+              ' type parameters cannot be used as a type argument.'
+        ]);
+
+        // Heuristic: Using a generic function type as a bound makes subtyping
+        // undecidable. Therefore, we cannot keep [inferred] unless we wish to
+        // generate bogus subtyping errors. Instead generate plain [Function],
+        // which is the most general function type.
+        inferred = typeProvider.functionType;
+      }
+
+      if (UnknownInferredType.isKnown(inferred)) {
+        knownTypes[typeParam] = inferred;
+      }
+    }
+
+    // Use instantiate to bounds to finish things off.
+    var hasError = new List<bool>.filled(fnTypeParams.length, false);
+    var result = _typeSystem.instantiateToBounds(genericType,
+        hasError: hasError, knownTypes: knownTypes) as T;
+
+    // Report any errors from instantiateToBounds.
+    for (int i = 0; i < hasError.length; i++) {
+      if (hasError[i]) {
+        TypeParameterType typeParam = fnTypeParams[i];
+        var typeParamBound =
+            typeParam.bound.substitute2(inferredTypes, fnTypeParams);
+        // TODO(jmesserly): improve this error message.
+        errorReporter
+            ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
+          typeParam,
+          "\nRecursive bound cannot be instantiated: '$typeParamBound'."
+              "\nConsider passing explicit type argument(s) "
+              "to the generic.\n\n'"
+        ]);
+      }
+    }
+    return result;
+  }
+
+  /// Tries to make [i1] a subtype of [i2] and accumulate constraints as needed.
+  ///
+  /// The return value indicates whether the match was successful.  If it was
+  /// unsuccessful, any constraints that were accumulated during the match
+  /// attempt have been rewound (see [_rewindConstraints]).
+  bool tryMatchSubtypeOf(DartType t1, DartType t2, _TypeConstraintOrigin origin,
+      {bool covariant}) {
+    int previousRewindBufferLength = _undoBuffer.length;
+    bool success = _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
+    if (!success) {
+      _rewindConstraints(previousRewindBufferLength);
+    }
+    return success;
+  }
+
+  /// Choose the bound that was implied by the return type, if any.
+  ///
+  /// Which bound this is depends on what positions the type parameter
+  /// appears in. If the type only appears only in a contravariant position,
+  /// we will choose the lower bound instead.
+  ///
+  /// For example given:
+  ///
+  ///     Func1<T, bool> makeComparer<T>(T x) => (T y) => x() == y;
+  ///
+  ///     main() {
+  ///       Func1<num, bool> t = makeComparer/* infer <num> */(42);
+  ///       print(t(42.0)); /// false, no error.
+  ///     }
+  ///
+  /// The constraints we collect are:
+  ///
+  /// * `num <: T`
+  /// * `int <: T`
+  ///
+  /// ... and no upper bound. Therefore the lower bound is the best choice.
+  DartType _chooseTypeFromConstraints(Iterable<_TypeConstraint> constraints,
+      {bool toKnownType: false}) {
+    DartType lower = UnknownInferredType.instance;
+    DartType upper = UnknownInferredType.instance;
+    for (var constraint in constraints) {
+      // Given constraints:
+      //
+      //     L1 <: T <: U1
+      //     L2 <: T <: U2
+      //
+      // These can be combined to produce:
+      //
+      //     LUB(L1, L2) <: T <: GLB(U1, U2).
+      //
+      // This can then be done for all constraints in sequence.
+      //
+      // This resulting constraint may be unsatisfiable; in that case inference
+      // will fail.
+      upper = _getGreatestLowerBound(upper, constraint.upperBound);
+      lower = _typeSystem.getLeastUpperBound(lower, constraint.lowerBound);
+    }
+
+    // Prefer the known bound, if any.
+    // Otherwise take whatever bound has partial information, e.g. `Iterable<?>`
+    //
+    // For both of those, prefer the lower bound (arbitrary heuristic).
+    if (UnknownInferredType.isKnown(lower)) {
+      return lower;
+    }
+    if (UnknownInferredType.isKnown(upper)) {
+      return upper;
+    }
+    if (!identical(UnknownInferredType.instance, lower)) {
+      return toKnownType ? _typeSystem.lowerBoundForType(lower) : lower;
+    }
+    if (!identical(UnknownInferredType.instance, upper)) {
+      return toKnownType ? _typeSystem.upperBoundForType(upper) : upper;
+    }
+    return lower;
+  }
+
+  String _formatError(TypeParameterType typeParam, DartType inferred,
+      Iterable<_TypeConstraint> constraints) {
+    var intro = "Tried to infer '$inferred' for '$typeParam'"
+        " which doesn't work:";
+
+    var constraintsByOrigin = <_TypeConstraintOrigin, List<_TypeConstraint>>{};
+    for (var c in constraints) {
+      constraintsByOrigin.putIfAbsent(c.origin, () => []).add(c);
+    }
+
+    // Only report unique constraint origins.
+    Iterable<_TypeConstraint> isSatisified(bool expected) => constraintsByOrigin
+        .values
+        .where((l) =>
+            l.every((c) => c.isSatisifedBy(_typeSystem, inferred)) == expected)
+        .expand((i) => i);
+
+    String unsatisified = _formatConstraints(isSatisified(false));
+    String satisified = _formatConstraints(isSatisified(true));
+
+    assert(unsatisified.isNotEmpty);
+    if (satisified.isNotEmpty) {
+      satisified = "\nThe type '$inferred' was inferred from:\n$satisified";
+    }
+
+    return '\n\n$intro\n$unsatisified$satisified\n\n'
+        'Consider passing explicit type argument(s) to the generic.\n\n';
+  }
+
+  /// This is first calls strong mode's GLB, but if it fails to find anything
+  /// (i.e. returns the bottom type), we kick in a few additional rules:
+  ///
+  /// - `GLB(FutureOr<A>, B)` is defined as:
+  ///   - `GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>`
+  ///   - `GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>`
+  ///   - else `GLB(FutureOr<A>, B) == GLB(A, B)`
+  /// - `GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)` (defined above),
+  /// - else `GLB(A, B) == Null`
+  DartType _getGreatestLowerBound(DartType t1, DartType t2) {
+    var result = _typeSystem.getGreatestLowerBound(t1, t2);
+    if (result.isBottom) {
+      // See if we can do better by considering FutureOr rules.
+      if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
+        var t1TypeArg = t1.typeArguments[0];
+        if (t2 is InterfaceType) {
+          //  GLB(FutureOr<A>, FutureOr<B>) == FutureOr<GLB(A, B)>
+          if (t2.isDartAsyncFutureOr) {
+            var t2TypeArg = t2.typeArguments[0];
+            return typeProvider.futureOrType
+                .instantiate([_getGreatestLowerBound(t1TypeArg, t2TypeArg)]);
+          }
+          // GLB(FutureOr<A>, Future<B>) == Future<GLB(A, B)>
+          if (t2.isDartAsyncFuture) {
+            var t2TypeArg = t2.typeArguments[0];
+            return typeProvider.futureType
+                .instantiate([_getGreatestLowerBound(t1TypeArg, t2TypeArg)]);
+          }
+        }
+        // GLB(FutureOr<A>, B) == GLB(A, B)
+        return _getGreatestLowerBound(t1TypeArg, t2);
+      }
+      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
+        // GLB(A, FutureOr<B>) ==  GLB(FutureOr<A>, B)
+        return _getGreatestLowerBound(t2, t1);
+      }
+      return typeProvider.nullType;
+    }
+    return result;
+  }
+
+  DartType _inferTypeParameterFromAll(
+      List<_TypeConstraint> constraints, _TypeConstraint extendsClause) {
+    // See if we already fixed this type from downwards inference.
+    // If so, then we aren't allowed to change it based on argument types.
+    DartType t = _inferTypeParameterFromContext(
+        constraints.where((c) => c.isDownwards), extendsClause);
+    if (UnknownInferredType.isKnown(t)) {
+      // Remove constraints that aren't downward ones; we'll ignore these for
+      // error reporting, because inference already succeeded.
+      constraints.removeWhere((c) => !c.isDownwards);
+      return t;
+    }
+
+    if (extendsClause != null) {
+      constraints = constraints.toList()..add(extendsClause);
+    }
+
+    var choice = _chooseTypeFromConstraints(constraints, toKnownType: true);
+    return choice;
+  }
+
+  DartType _inferTypeParameterFromContext(
+      Iterable<_TypeConstraint> constraints, _TypeConstraint extendsClause) {
+    DartType t = _chooseTypeFromConstraints(constraints);
+    if (UnknownInferredType.isUnknown(t)) {
+      return t;
+    }
+
+    // If we're about to make our final choice, apply the extends clause.
+    // This gives us a chance to refine the choice, in case it would violate
+    // the `extends` clause. For example:
+    //
+    //     Object obj = math.min/*<infer Object, error>*/(1, 2);
+    //
+    // If we consider the `T extends num` we conclude `<num>`, which works.
+    if (extendsClause != null) {
+      constraints = constraints.toList()..add(extendsClause);
+      return _chooseTypeFromConstraints(constraints);
+    }
+    return t;
+  }
+
+  /// Tries to make [i1] a subtype of [i2] and accumulate constraints as needed.
+  ///
+  /// The return value indicates whether the match was successful.  If it was
+  /// unsuccessful, the caller is responsible for ignoring any constraints that
+  /// were accumulated (see [_rewindConstraints]).
+  bool _matchInterfaceSubtypeOf(InterfaceType i1, InterfaceType i2,
+      Set<Element> visited, _TypeConstraintOrigin origin,
+      {bool covariant}) {
+    if (identical(i1, i2)) {
+      return true;
+    }
+
+    if (i1.element == i2.element) {
+      List<DartType> tArgs1 = i1.typeArguments;
+      List<DartType> tArgs2 = i2.typeArguments;
+      assert(tArgs1.length == tArgs2.length);
+      for (int i = 0; i < tArgs1.length; i++) {
+        if (!_matchSubtypeOf(
+            tArgs1[i], tArgs2[i], new HashSet<Element>(), origin,
+            covariant: covariant)) {
+          return false;
+        }
+      }
+      return true;
+    }
+    if (i1.isObject) {
+      return false;
+    }
+
+    // Guard against loops in the class hierarchy
+    bool guardedInterfaceSubtype(InterfaceType t1) {
+      visited ??= new HashSet<Element>();
+      if (visited.add(t1.element)) {
+        bool matched = _matchInterfaceSubtypeOf(t1, i2, visited, origin,
+            covariant: covariant);
+        visited.remove(t1.element);
+        return matched;
+      } else {
+        // In the case of a recursive type parameter, consider the subtype
+        // match to have failed.
+        return false;
+      }
+    }
+
+    // We don't need to search the entire class hierarchy, since a given
+    // subclass can't appear multiple times with different generic parameters.
+    // So shortcut to the first match found.
+    //
+    // We don't need undo logic here because if the classes don't match, nothing
+    // is added to the constraint set.
+    var superclass = i1.superclass;
+    if (superclass != null && guardedInterfaceSubtype(superclass)) return true;
+    for (final parent in i1.interfaces) {
+      if (guardedInterfaceSubtype(parent)) return true;
+    }
+    for (final parent in i1.mixins) {
+      if (guardedInterfaceSubtype(parent)) return true;
+    }
+    for (final parent in i1.superclassConstraints) {
+      if (guardedInterfaceSubtype(parent)) return true;
+    }
+    return false;
+  }
+
+  /// Assert that [t1] will be a subtype of [t2], and returns if the constraint
+  /// can be satisfied.
+  ///
+  /// [covariant] must be true if [t1] is a declared type of the generic
+  /// function and [t2] is the context type, or false if the reverse. For
+  /// example [covariant] is used when [t1] is the declared return type
+  /// and [t2] is the context type. Contravariant would be used if [t1] is the
+  /// argument type (i.e. passed in to the generic function) and [t2] is the
+  /// declared parameter type.
+  ///
+  /// [origin] indicates where the constraint came from, for example an argument
+  /// or return type.
+  bool _matchSubtypeOf(DartType t1, DartType t2, Set<Element> visited,
+      _TypeConstraintOrigin origin,
+      {bool covariant}) {
+    if (covariant && t1 is TypeParameterType) {
+      var constraints = this.constraints[t1.element];
+      if (constraints != null) {
+        if (!identical(t2, UnknownInferredType.instance)) {
+          var constraint = new _TypeConstraint(origin, t1, upper: t2);
+          constraints.add(constraint);
+          _undoBuffer.add(constraint);
+        }
+        return true;
+      }
+    }
+    if (!covariant && t2 is TypeParameterType) {
+      var constraints = this.constraints[t2.element];
+      if (constraints != null) {
+        if (!identical(t1, UnknownInferredType.instance)) {
+          var constraint = new _TypeConstraint(origin, t2, lower: t1);
+          constraints.add(constraint);
+          _undoBuffer.add(constraint);
+        }
+        return true;
+      }
+    }
+
+    if (identical(t1, t2)) {
+      return true;
+    }
+
+    // TODO(jmesserly): this logic is taken from subtype.
+    bool matchSubtype(DartType t1, DartType t2) {
+      return _matchSubtypeOf(t1, t2, null, origin, covariant: covariant);
+    }
+
+    // Handle FutureOr<T> union type.
+    if (t1 is InterfaceType && t1.isDartAsyncFutureOr) {
+      var t1TypeArg = t1.typeArguments[0];
+      if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
+        var t2TypeArg = t2.typeArguments[0];
+        // FutureOr<A> <: FutureOr<B> iff A <: B
+        return matchSubtype(t1TypeArg, t2TypeArg);
+      }
+
+      // given t1 is Future<A> | A, then:
+      // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
+      var t1Future = typeProvider.futureType.instantiate([t1TypeArg]);
+      return matchSubtype(t1Future, t2) && matchSubtype(t1TypeArg, t2);
+    }
+
+    if (t2 is InterfaceType && t2.isDartAsyncFutureOr) {
+      // given t2 is Future<A> | A, then:
+      // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
+      var t2TypeArg = t2.typeArguments[0];
+      var t2Future = typeProvider.futureType.instantiate([t2TypeArg]);
+
+      // First we try matching `t1 <: Future<A>`.  If that succeeds *and*
+      // records at least one constraint, then we proceed using that constraint.
+      var previousRewindBufferLength = _undoBuffer.length;
+      var success =
+          tryMatchSubtypeOf(t1, t2Future, origin, covariant: covariant);
+
+      if (_undoBuffer.length != previousRewindBufferLength) {
+        // Trying to match `t1 <: Future<A>` succeeded and recorded constraints,
+        // so those are the constraints we want.
+        return true;
+      } else {
+        // Either `t1 <: Future<A>` failed to match, or it matched trivially
+        // without recording any constraints (e.g. because t1 is `Null`).  We
+        // want constraints, because they let us do more precise inference, so
+        // go ahead and try matching `t1 <: A` to see if it records any
+        // constraints.
+        if (tryMatchSubtypeOf(t1, t2TypeArg, origin, covariant: covariant)) {
+          // Trying to match `t1 <: A` succeeded.  If it recorded constraints,
+          // those are the constraints we want.  If it didn't, then there's no
+          // way we're going to get any constraints.  So either way, we want to
+          // return `true` since the match suceeded and the constraints we want
+          // (if any) have been recorded.
+          return true;
+        } else {
+          // Trying to match `t1 <: A` failed.  So there's no way we are going
+          // to get any constraints.  Just return `success` to indicate whether
+          // the match succeeded.
+          return success;
+        }
+      }
+    }
+
+    // S <: T where S is a type variable
+    //  T is not dynamic or object (handled above)
+    //  True if T == S
+    //  Or true if bound of S is S' and S' <: T
+
+    if (t1 is TypeParameterType) {
+      // Guard against recursive type parameters
+      //
+      // TODO(jmesserly): this function isn't guarding against anything (it's
+      // not passsing down `visitedSet`, so adding the element has no effect).
+      bool guardedSubtype(DartType t1, DartType t2) {
+        var visitedSet = visited ?? new HashSet<Element>();
+        if (visitedSet.add(t1.element)) {
+          bool matched = matchSubtype(t1, t2);
+          visitedSet.remove(t1.element);
+          return matched;
+        } else {
+          // In the case of a recursive type parameter, consider the subtype
+          // match to have failed.
+          return false;
+        }
+      }
+
+      if (t2 is TypeParameterType && t1.definition == t2.definition) {
+        return guardedSubtype(t1.bound, t2.bound);
+      }
+      return guardedSubtype(t1.bound, t2);
+    }
+    if (t2 is TypeParameterType) {
+      return false;
+    }
+
+    if (_isBottom(t1) || _isTop(t2)) return true;
+
+    if (t1 is InterfaceType && t2 is InterfaceType) {
+      return _matchInterfaceSubtypeOf(t1, t2, visited, origin,
+          covariant: covariant);
+    }
+
+    if (t1 is FunctionType && t2 is FunctionType) {
+      return FunctionTypeImpl.relate(t1, t2, matchSubtype,
+          parameterRelation: (p1, p2) {
+            return _matchSubtypeOf(p2.type, p1.type, null, origin,
+                covariant: !covariant);
+          },
+          // Type parameter bounds are invariant.
+          boundsRelation: (t1, t2, p1, p2) =>
+              matchSubtype(t1, t2) && matchSubtype(t2, t1));
+    }
+
+    if (t1 is FunctionType && t2 == typeProvider.functionType) {
+      return true;
+    }
+
+    return false;
+  }
+
+  /// Un-does constraints that were gathered by a failed match attempt, until
+  /// [_undoBuffer] has length [previousRewindBufferLength].
+  ///
+  /// The intended usage is that the caller should record the length of
+  /// [_undoBuffer] before attempting to make a match.  Then, if the match
+  /// fails, pass the recorded length to this method to erase any constraints
+  /// that were recorded during the failed match.
+  void _rewindConstraints(int previousRewindBufferLength) {
+    while (_undoBuffer.length > previousRewindBufferLength) {
+      var constraint = _undoBuffer.removeLast();
+      var element = constraint.typeParameter.element;
+      assert(identical(constraints[element].last, constraint));
+      constraints[element].removeLast();
+    }
+  }
+
+  static String _formatConstraints(Iterable<_TypeConstraint> constraints) {
+    List<List<String>> lineParts =
+        new Set<_TypeConstraintOrigin>.from(constraints.map((c) => c.origin))
+            .map((o) => o.formatError())
+            .toList();
+
+    int prefixMax = lineParts.map((p) => p[0].length).fold(0, math.max);
+
+    // Use a set to prevent identical message lines.
+    // (It's not uncommon for the same constraint to show up in a few places.)
+    var messageLines = new Set<String>.from(lineParts.map((parts) {
+      var prefix = parts[0];
+      var middle = parts[1];
+      var prefixPad = ' ' * (prefixMax - prefix.length);
+      var middlePad = ' ' * (prefixMax);
+      var end = "";
+      if (parts.length > 2) {
+        end = '\n  $middlePad ${parts[2]}';
+      }
+      return '  $prefix$prefixPad $middle$end';
+    }));
+
+    return messageLines.join('\n');
+  }
+}
+
+/**
+ * A type system that implements the type semantics for strong mode.
+ */
+@deprecated
+class StrongTypeSystemImpl extends Dart2TypeSystem {
+  StrongTypeSystemImpl(TypeProvider typeProvider) : super(typeProvider);
+}
+
 /**
  * The interface `TypeSystem` defines the behavior of an object representing
  * the type system.  This provides a common location to put methods that act on
@@ -1688,10 +1677,12 @@
  * way for a possible future where we may wish to make the type system
  * pluggable.
  */
-abstract class TypeSystem {
+// TODO(brianwilkerson) Rename this class to TypeSystemImpl.
+abstract class TypeSystem implements public.TypeSystem {
   /**
    * Whether the type system is strong or not.
    */
+  @deprecated
   bool get isStrong;
 
   /**
@@ -1699,6 +1690,40 @@
    */
   TypeProvider get typeProvider;
 
+  @override
+  DartType flatten(DartType type) {
+    if (type is InterfaceType) {
+      // Implement the cases:
+      //  - "If T = FutureOr<S> then flatten(T) = S."
+      //  - "If T = Future<S> then flatten(T) = S."
+      if (type.isDartAsyncFutureOr || type.isDartAsyncFuture) {
+        return type.typeArguments.isNotEmpty
+            ? type.typeArguments[0]
+            : DynamicTypeImpl.instance;
+      }
+      // Implement the case: "Otherwise if T <: Future then let S be a type
+      // such that T << Future<S> and for all R, if T << Future<R> then S << R.
+      // Then flatten(T) = S."
+      //
+      // In other words, given the set of all types R such that T << Future<R>,
+      // let S be the most specific of those types, if any such S exists.
+      //
+      // Since we only care about the most specific type, it is sufficient to
+      // look at the types appearing as a parameter to Future in the type
+      // hierarchy of T.  We don't need to consider the supertypes of those
+      // types, since they are by definition less specific.
+      List<DartType> candidateTypes =
+          _searchTypeHierarchyForFutureTypeParameters(type);
+      DartType flattenResult =
+          InterfaceTypeImpl.findMostSpecificType(candidateTypes, this);
+      if (flattenResult != null) {
+        return flattenResult;
+      }
+    }
+    // Implement the case: "In any other circumstance, flatten(T) = T."
+    return type;
+  }
+
   List<InterfaceType> gatherMixinSupertypeConstraintsForInference(
       ClassElement mixinElement) {
     List<InterfaceType> candidates;
@@ -1758,16 +1783,10 @@
     // In Dart 2, the result is `Function` iff T is `Function`, otherwise the
     // result is `Object`.
     if (type1 is FunctionType && type2 is InterfaceType) {
-      if (isStrong) {
-        return type2.isDartCoreFunction ? type2 : typeProvider.objectType;
-      }
-      type1 = typeProvider.functionType;
+      return type2.isDartCoreFunction ? type2 : typeProvider.objectType;
     }
     if (type2 is FunctionType && type1 is InterfaceType) {
-      if (isStrong) {
-        return type1.isDartCoreFunction ? type1 : typeProvider.objectType;
-      }
-      type2 = typeProvider.functionType;
+      return type1.isDartCoreFunction ? type1 : typeProvider.objectType;
     }
 
     // At this point type1 and type2 should both either be interface types or
@@ -1819,8 +1838,7 @@
    * Return `true` if the [leftType] is assignable to the [rightType] (that is,
    * if leftType <==> rightType).
    */
-  bool isAssignableTo(DartType leftType, DartType rightType,
-      {bool isDeclarationCast = false});
+  bool isAssignableTo(DartType leftType, DartType rightType);
 
   /**
    * Return `true` if the [leftType] is more specific than the [rightType]
@@ -1843,6 +1861,11 @@
    */
   bool isSubtypeOf(DartType leftType, DartType rightType);
 
+  @override
+  DartType leastUpperBound(DartType leftType, DartType rightType) {
+    return getLeastUpperBound(leftType, rightType);
+  }
+
   /// Attempts to find the appropriate substitution for [typeParameters] that can
   /// be applied to [src] to make it equal to [dest].  If no such substitution can
   /// be found, `null` is returned.
@@ -1957,6 +1980,11 @@
     return currentType;
   }
 
+  @override
+  DartType resolveToBound(DartType type) {
+    return instantiateToBounds(type);
+  }
+
   /**
    * Tries to promote from the first type from the second type, and returns the
    * promoted type if it succeeds, otherwise null.
@@ -1967,7 +1995,7 @@
    * null.
    *
    * In strong mode, this can potentially return a different type, see
-   * the override in [StrongTypeSystemImpl].
+   * the override in [Dart2TypeSystem].
    */
   DartType tryPromoteToType(DartType to, DartType from);
 
@@ -2084,6 +2112,32 @@
   DartType _interfaceLeastUpperBound(InterfaceType type1, InterfaceType type2);
 
   /**
+   * Starting from the given [type], search its class hierarchy for types of the
+   * form Future<R>, and return a list of the resulting R's.
+   */
+  List<DartType> _searchTypeHierarchyForFutureTypeParameters(DartType type) {
+    List<DartType> result = <DartType>[];
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+    void recurse(InterfaceTypeImpl type) {
+      if (type.isDartAsyncFuture && type.typeArguments.isNotEmpty) {
+        result.add(type.typeArguments[0]);
+      }
+      if (visitedClasses.add(type.element)) {
+        if (type.superclass != null) {
+          recurse(type.superclass);
+        }
+        for (InterfaceType interface in type.interfaces) {
+          recurse(interface);
+        }
+        visitedClasses.remove(type.element);
+      }
+    }
+
+    recurse(type);
+    return result;
+  }
+
+  /**
    * Given two [DartType]s [type1] and [type2] at least one of which is a
    * [TypeParameterType], return their least upper bound in a type system
    * specific manner.
@@ -2095,8 +2149,7 @@
    */
   static TypeSystem create(AnalysisContext context) {
     var options = context.analysisOptions as AnalysisOptionsImpl;
-    return new StrongTypeSystemImpl(context.typeProvider,
-        declarationCasts: options.declarationCasts,
+    return new Dart2TypeSystem(context.typeProvider,
         implicitCasts: options.implicitCasts);
   }
 }
@@ -2120,10 +2173,14 @@
   bool get isDynamic => true;
 
   @override
+  Nullability get nullability => Nullability.indeterminate;
+
+  @override
   bool operator ==(Object object) => identical(object, this);
 
   @override
-  void appendTo(StringBuffer buffer, Set<TypeImpl> types) {
+  void appendTo(StringBuffer buffer, Set<TypeImpl> types,
+      {bool withNullability = false}) {
     buffer.write('?');
   }
 
@@ -2177,6 +2234,9 @@
     return this;
   }
 
+  @override
+  TypeImpl withNullability(Nullability nullability) => this;
+
   /// Given a [type] T, return true if it does not have an unknown type `?`.
   static bool isKnown(DartType type) => !isUnknown(type);
 
diff --git a/pkg/analyzer/lib/src/generated/workspace.dart b/pkg/analyzer/lib/src/generated/workspace.dart
deleted file mode 100644
index c122845..0000000
--- a/pkg/analyzer/lib/src/generated/workspace.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-/**
- * Abstract superclass of classes that provide information about the workspace
- * in which analysis is being performed.
- */
-abstract class Workspace {
-  /**
-   * Return `true` if this workspace defines a single "project" and that
-   * "project" depends upon flutter.
-   */
-  bool get hasFlutterDependency => packageMap?.containsKey('flutter') ?? false;
-
-  /**
-   * Return a (possibly null) map of package sources.
-   */
-  Map<String, List<Folder>> get packageMap;
-
-  /**
-   * The [UriResolver] that can resolve `package` URIs.
-   */
-  UriResolver get packageUriResolver;
-
-  /**
-   * Create the [SourceFactory] for resolving Uris to [Source]s.
-   * The [sdk] may be `null`.
-   */
-  SourceFactory createSourceFactory(DartSdk sdk);
-}
diff --git a/pkg/analyzer/lib/src/hint/sdk_constraint_extractor.dart b/pkg/analyzer/lib/src/hint/sdk_constraint_extractor.dart
new file mode 100644
index 0000000..0cd3180
--- /dev/null
+++ b/pkg/analyzer/lib/src/hint/sdk_constraint_extractor.dart
@@ -0,0 +1,95 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:pub_semver/pub_semver.dart';
+import 'package:yaml/yaml.dart';
+
+/// A utility class used to extract the SDK version constraint from a
+/// `pubspec.yaml` file.
+class SdkConstraintExtractor {
+  /// The file from which the constraint is to be extracted.
+  final File pubspecFile;
+
+  /// A flag indicating whether the [_constraintText], [_constraintOffset] and
+  /// [_constraint] have been initialized.
+  bool _initialized = false;
+
+  /// The text of the constraint, or `null` if the range has not yet been
+  /// computed or if there was an error when attempting to compute the range.
+  String _constraintText;
+
+  /// The offset of the constraint text, or `-1` if the offset is not known.
+  int _constraintOffset = -1;
+
+  /// The cached range of supported versions, or `null` if the range has not yet
+  /// been computed or if there was an error when attempting to compute the
+  /// range.
+  VersionConstraint _constraint;
+
+  /// Initialize a newly created extractor to extract the SDK version constraint
+  /// from the given `pubspec.yaml` file.
+  SdkConstraintExtractor(this.pubspecFile);
+
+  /// Return the range of supported versions, or `null` if the range could not
+  /// be computed.
+  VersionConstraint constraint() {
+    if (_constraint == null) {
+      String text = constraintText();
+      if (text != null) {
+        try {
+          _constraint = new VersionConstraint.parse(text);
+        } catch (e) {
+          // Ignore this, leaving [_constraint] unset.
+        }
+      }
+    }
+    return _constraint;
+  }
+
+  /// Return the offset of the constraint text.
+  int constraintOffset() {
+    if (_constraintText == null) {
+      _initializeTextAndOffset();
+    }
+    return _constraintOffset;
+  }
+
+  /// Return the constraint text following "sdk:".
+  String constraintText() {
+    if (_constraintText == null) {
+      _initializeTextAndOffset();
+    }
+    return _constraintText;
+  }
+
+  /// Initialize both [_constraintText] and [_constraintOffset], or neither if
+  /// there is an error or if the pubspec does not contain an sdk constraint.
+  void _initializeTextAndOffset() {
+    if (!_initialized) {
+      _initialized = true;
+      try {
+        String fileContent = pubspecFile.readAsStringSync();
+        YamlDocument document = loadYamlDocument(fileContent);
+        YamlNode contents = document.contents;
+        if (contents is YamlMap) {
+          YamlNode environment = contents.nodes['environment'];
+          if (environment is YamlMap) {
+            YamlNode sdk = environment.nodes['sdk'];
+            if (sdk is YamlScalar) {
+              _constraintText = sdk.value;
+              _constraintOffset = sdk.span.start.offset;
+              if (sdk.style == ScalarStyle.SINGLE_QUOTED ||
+                  sdk.style == ScalarStyle.DOUBLE_QUOTED) {
+                _constraintOffset++;
+              }
+            }
+          }
+        }
+      } catch (e) {
+        // Ignore this, leaving both fields unset.
+      }
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
new file mode 100644
index 0000000..cc2231a
--- /dev/null
+++ b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:pub_semver/pub_semver.dart';
+
+/// A visitor that finds code that assumes a later version of the SDK than the
+/// minimum version required by the SDK constraints in `pubspec.yaml`.
+class SdkConstraintVerifier extends RecursiveAstVisitor<void> {
+  /// The error reporter to be used to report errors.
+  final ErrorReporter _errorReporter;
+
+  /// The element representing the library containing the unit to be verified.
+  final LibraryElement _containingLibrary;
+
+  /// The typ provider used to access SDK types.
+  final TypeProvider _typeProvider;
+
+  /// The version constraint for the SDK.
+  final VersionConstraint _versionConstraint;
+
+  /// A cached flag indicating whether references to Future and Stream need to
+  /// be checked. Use [] to access this field.
+  bool _checkFutureAndStream;
+
+  /// Initialize a newly created verifier to use the given [_errorReporter] to
+  /// report errors.
+  SdkConstraintVerifier(this._errorReporter, this._containingLibrary,
+      this._typeProvider, this._versionConstraint);
+
+  /// Return a range covering every version up to, but not including, 2.1.0.
+  VersionRange get before_2_1_0 =>
+      new VersionRange(max: Version.parse('2.1.0'), includeMax: false);
+
+  /// Return `true` if references to Future and Stream need to be checked.
+  bool get checkFutureAndStream => _checkFutureAndStream ??=
+      !before_2_1_0.intersect(_versionConstraint).isEmpty;
+
+  @override
+  void visitHideCombinator(HideCombinator node) {
+    // Don't flag references to either `Future` or `Stream` within a combinator.
+  }
+
+  @override
+  void visitShowCombinator(ShowCombinator node) {
+    // Don't flag references to either `Future` or `Stream` within a combinator.
+  }
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    if (node.inDeclarationContext()) {
+      return;
+    }
+    Element element = node.staticElement;
+    if (checkFutureAndStream &&
+        (element == _typeProvider.futureType.element ||
+            element == _typeProvider.streamType.element)) {
+      for (LibraryElement importedLibrary
+          in _containingLibrary.importedLibraries) {
+        if (!importedLibrary.isDartCore) {
+          Namespace namespace = importedLibrary.exportNamespace;
+          if (namespace != null && namespace.get(element.name) != null) {
+            return;
+          }
+        }
+      }
+      _errorReporter.reportErrorForNode(
+          HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE, node, [element.name]);
+    }
+  }
+}
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart
index bc4e089..65fde36 100644
--- a/pkg/analyzer/lib/src/lint/analysis.dart
+++ b/pkg/analyzer/lib/src/lint/analysis.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,12 +6,15 @@
 import 'dart:collection';
 import 'dart:io' as io;
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/file_system.dart'
     show File, Folder, ResourceProvider, ResourceUriResolver;
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
@@ -25,8 +28,6 @@
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/util/sdk.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:package_config/packages.dart' show Packages;
 import 'package:package_config/packages_file.dart' as pkgfile show parse;
 import 'package:package_config/src/packages_impl.dart' show MapPackages;
@@ -49,7 +50,6 @@
 AnalysisOptions _buildAnalyzerOptions(LinterOptions options) {
   AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
   analysisOptions.hint = false;
-  analysisOptions.previewDart2 = options.previewDart2;
   analysisOptions.lint = options.enableLints;
   analysisOptions.generateSdkErrors = options.showSdkWarnings;
   analysisOptions.enableTiming = options.enableTiming;
@@ -83,9 +83,6 @@
   /// Whether to use Dart's Strong Mode analyzer.
   bool strongMode = true;
 
-  /// Whether to use Dart 2.0 features.
-  bool previewDart2 = false;
-
   /// The mock SDK (to speed up testing) or `null` to use the actual SDK.
   DartSdk mockSdk;
 
@@ -100,6 +97,13 @@
   void set enableAssertInitializer(bool enable) {
     // Ignored because the option is now always enabled.
   }
+
+  /// Whether to use Dart 2.0 features.
+  @deprecated
+  bool get previewDart2 => true;
+
+  @deprecated
+  void set previewDart2(bool value) {}
 }
 
 class LintDriver {
@@ -250,7 +254,18 @@
 /// [errorSink].
 class StdLogger extends Logger {
   @override
-  void logError(String message, [exception]) => errorSink.writeln(message);
+  void logError(String message, [exception]) {
+    errorSink.writeln(message);
+    if (exception != null) {
+      errorSink.writeln(exception);
+    }
+  }
+
   @override
-  void logInformation(String message, [exception]) => outSink.writeln(message);
+  void logInformation(String message, [exception]) {
+    outSink.writeln(message);
+    if (exception != null) {
+      outSink.writeln(exception);
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index a94e348..348322f 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -1,16 +1,24 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/file_system.dart' as file_system;
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisErrorInfo, AnalysisErrorInfoImpl, Logger;
 import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
+import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart' show LineInfo;
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/lint/analysis.dart';
@@ -186,6 +194,87 @@
   String _emph(msg) => bold ? '<strong>$msg</strong>' : msg;
 }
 
+/// Provides access to information needed by lint rules that is not available
+/// from AST nodes or the element model.
+abstract class LinterContext {
+  List<LinterContextUnit> get allUnits;
+
+  LinterContextUnit get currentUnit;
+
+  DeclaredVariables get declaredVariables;
+
+  TypeProvider get typeProvider;
+
+  TypeSystem get typeSystem;
+
+  /// Return `true` if it would be valid for the given instance creation
+  /// [expression] to have a keyword of `const`.
+  ///
+  /// The [expression] is expected to be a node within one of the compilation
+  /// units in [allUnits].
+  ///
+  /// Note that this method can cause constant evaluation to occur, which can be
+  /// computationally expensive.
+  bool canBeConst(InstanceCreationExpression expression);
+}
+
+/// Implementation of [LinterContext]
+class LinterContextImpl implements LinterContext {
+  @override
+  final List<LinterContextUnit> allUnits;
+
+  @override
+  final LinterContextUnit currentUnit;
+
+  @override
+  final DeclaredVariables declaredVariables;
+
+  @override
+  final TypeProvider typeProvider;
+
+  @override
+  final TypeSystem typeSystem;
+
+  LinterContextImpl(this.allUnits, this.currentUnit, this.declaredVariables,
+      this.typeProvider, this.typeSystem);
+
+  @override
+  bool canBeConst(InstanceCreationExpression expression) {
+    //
+    // Verify that the invoked constructor is a const constructor.
+    //
+    ConstructorElement element = expression.staticElement;
+    if (element == null || !element.isConst) {
+      return false;
+    }
+    //
+    // Verify that the evaluation of the constructor would not produce an
+    // exception.
+    //
+    Token oldKeyword = expression.keyword;
+    ConstantAnalysisErrorListener listener =
+        new ConstantAnalysisErrorListener();
+    try {
+      expression.keyword = new KeywordToken(Keyword.CONST, expression.offset);
+      LibraryElement library = element.library;
+      ErrorReporter errorReporter = new ErrorReporter(listener, element.source);
+      expression.accept(new ConstantVerifier(
+          errorReporter, library, typeProvider, declaredVariables));
+    } finally {
+      expression.keyword = oldKeyword;
+    }
+    return !listener.hasConstError;
+  }
+}
+
+class LinterContextUnit {
+  final String content;
+
+  final CompilationUnit unit;
+
+  LinterContextUnit(this.content, this.unit);
+}
+
 /// Thrown when an error occurs in linting.
 class LinterException implements Exception {
   /// A message describing the error.
@@ -274,15 +363,21 @@
   @override
   AstVisitor getVisitor() => null;
 
-  void reportLint(AstNode node, {bool ignoreSyntheticNodes: true}) {
+  void reportLint(AstNode node,
+      {List<Object> arguments: const [],
+      ErrorCode errorCode,
+      bool ignoreSyntheticNodes: true}) {
     if (node != null && (!node.isSynthetic || !ignoreSyntheticNodes)) {
-      reporter.reportErrorForNode(lintCode, node, []);
+      reporter.reportErrorForNode(lintCode, node, arguments);
     }
   }
 
-  void reportLintForToken(Token token, {bool ignoreSyntheticTokens: true}) {
+  void reportLintForToken(Token token,
+      {List<Object> arguments: const [],
+      ErrorCode errorCode,
+      bool ignoreSyntheticTokens: true}) {
     if (token != null && (!token.isSynthetic || !ignoreSyntheticTokens)) {
-      reporter.reportErrorForToken(lintCode, token, []);
+      reporter.reportErrorForToken(lintCode, token, arguments);
     }
   }
 
@@ -303,7 +398,9 @@
 
 class Maturity implements Comparable<Maturity> {
   static const Maturity stable = const Maturity._('stable', ordinal: 0);
-  static const Maturity experimental = const Maturity._('stable', ordinal: 1);
+  static const Maturity experimental =
+      const Maturity._('experimental', ordinal: 1);
+  static const Maturity deprecated = const Maturity._('deprecated', ordinal: 2);
 
   final String name;
   final int ordinal;
@@ -314,6 +411,8 @@
         return stable;
       case 'experimental':
         return experimental;
+      case 'deprecated':
+        return deprecated;
       default:
         return new Maturity._(name, ordinal: ordinal);
     }
@@ -330,9 +429,21 @@
 abstract class NodeLintRule {
   /// This method is invoked to let the [LintRule] register node processors
   /// in the given [registry].
-  void registerNodeProcessors(NodeLintRegistry registry);
+  ///
+  /// The node processors may use the provided [context] to access information
+  /// that is not available from the AST nodes or their associated elements.
+  void registerNodeProcessors(NodeLintRegistry registry, LinterContext context);
 }
 
+/// [LintRule]s that implement this interface want to process only some types
+/// of AST nodes, and will register their processors in the registry.
+///
+/// This class exists solely to allow a smoother transition from analyzer
+/// version 0.33.*.  It will be removed in a future analyzer release, so please
+/// use [NodeLintRule] instead.
+@deprecated
+abstract class NodeLintRuleWithContext extends NodeLintRule {}
+
 class PrintingReporter implements Reporter, Logger {
   final Printer _print;
 
diff --git a/pkg/analyzer/lib/src/lint/linter_visitor.dart b/pkg/analyzer/lib/src/lint/linter_visitor.dart
index fbf259b..7b2374e 100644
--- a/pkg/analyzer/lib/src/lint/linter_visitor.dart
+++ b/pkg/analyzer/lib/src/lint/linter_visitor.dart
@@ -19,6 +19,12 @@
   LinterVisitor(this.registry, this.exceptionHandler);
 
   @override
+  void visitAnnotation(Annotation node) {
+    _runSubscriptions(node, registry._forAnnotation);
+    super.visitAnnotation(node);
+  }
+
+  @override
   void visitAsExpression(AsExpression node) {
     _runSubscriptions(node, registry._forAsExpression);
     super.visitAsExpression(node);
@@ -680,6 +686,7 @@
 /// The container to register visitors for separate AST node types.
 class NodeLintRegistry {
   final bool enableTiming;
+  final List<_Subscription<Annotation>> _forAnnotation = [];
   final List<_Subscription<AsExpression>> _forAsExpression = [];
   final List<_Subscription<AssertInitializer>> _forAssertInitializer = [];
   final List<_Subscription<AssertStatement>> _forAssertStatement = [];
@@ -808,6 +815,10 @@
 
   NodeLintRegistry(this.enableTiming);
 
+  void addAnnotation(LintRule linter, AstVisitor visitor) {
+    _forAnnotation.add(new _Subscription(linter, visitor, _getTimer(linter)));
+  }
+
   void addAsExpression(LintRule linter, AstVisitor visitor) {
     _forAsExpression.add(new _Subscription(linter, visitor, _getTimer(linter)));
   }
diff --git a/pkg/analyzer/lib/src/lint/options_rule_validator.dart b/pkg/analyzer/lib/src/lint/options_rule_validator.dart
index 2d6911a..9b28b1a 100644
--- a/pkg/analyzer/lib/src/lint/options_rule_validator.dart
+++ b/pkg/analyzer/lib/src/lint/options_rule_validator.dart
@@ -2,13 +2,39 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
+import 'dart:collection';
+
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/analysis_options/error/option_codes.dart';
+import 'package:analyzer/src/lint/linter.dart';
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/plugin/options.dart';
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:yaml/yaml.dart';
 
 /**
+ * A hint code indicating reference to a deprecated lint.
+ *
+ * Parameters:
+ * 0: the rule name
+ */
+const AnalysisOptionsHintCode DEPRECATED_LINT_HINT =
+    const AnalysisOptionsHintCode('DEPRECATED_LINT_HINT',
+        "'{0}' is a deprecated lint rule and should not be used");
+
+/**
+ * Duplicate rules.
+ *
+ * Parameters:
+ * 0: the rule name
+ */
+const AnalysisOptionsHintCode DUPLICATE_RULE_HINT = const AnalysisOptionsHintCode(
+    'DUPLICATE_RULE',
+    "The rule {0} is already specified and doesn't need to be specified again.",
+    correction: "Try removing all but one specification of the rule.");
+
+/**
  * An error code indicating an undefined lint rule.
  *
  * Parameters:
@@ -19,12 +45,25 @@
         'UNDEFINED_LINT_WARNING', "'{0}' is not a recognized lint rule");
 
 /**
+ * Rule provider.
+ */
+typedef LintRuleProvider = Iterable<LintRule> Function();
+
+/**
  * Validates `linter` rule configurations.
  */
 class LinterRuleOptionsValidator extends OptionsValidator {
   static const linter = 'linter';
   static const rulesKey = 'rules';
 
+  final LintRuleProvider ruleProvider;
+
+  LinterRuleOptionsValidator({LintRuleProvider provider})
+      : ruleProvider = provider ?? (() => Registry.ruleRegistry.rules);
+
+  LintRule getRegisteredLint(Object value) => ruleProvider()
+      .firstWhere((rule) => rule.name == value, orElse: () => null);
+
   @override
   List<AnalysisError> validate(ErrorReporter reporter, YamlMap options) {
     List<AnalysisError> errors = <AnalysisError>[];
@@ -38,13 +77,21 @@
 
   validateRules(YamlNode rules, ErrorReporter reporter) {
     if (rules is YamlList) {
-      List<String> registeredLints =
-          Registry.ruleRegistry.map((r) => r.name).toList();
+      Set<String> seenRules = new HashSet<String>();
       rules.nodes.forEach((YamlNode ruleNode) {
         Object value = ruleNode.value;
-        if (value != null && !registeredLints.contains(value)) {
-          reporter.reportErrorForSpan(
-              UNDEFINED_LINT_WARNING, ruleNode.span, [value]);
+        if (value != null) {
+          LintRule rule = getRegisteredLint(value);
+          if (rule == null) {
+            reporter.reportErrorForSpan(
+                UNDEFINED_LINT_WARNING, ruleNode.span, [value]);
+          } else if (!seenRules.add(rule.name)) {
+            reporter.reportErrorForSpan(
+                DUPLICATE_RULE_HINT, ruleNode.span, [value]);
+          } else if (rule.maturity == Maturity.deprecated) {
+            reporter.reportErrorForSpan(
+                DEPRECATED_LINT_HINT, ruleNode.span, [value]);
+          }
         }
       });
     }
diff --git a/pkg/analyzer/lib/src/lint/project.dart b/pkg/analyzer/lib/src/lint/project.dart
index f87c70f..7243747 100644
--- a/pkg/analyzer/lib/src/lint/project.dart
+++ b/pkg/analyzer/lib/src/lint/project.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -135,7 +136,7 @@
     for (Source source in sources) {
       String path = source.uri.path;
       if (path.startsWith(libDir) && !path.startsWith(libSrcDir)) {
-        AnalysisResult result = await driver.getResult(source.fullName);
+        ResolvedUnitResult result = await driver.getResult(source.fullName);
         LibraryElement library = result.libraryElement;
 
         NamespaceBuilder namespaceBuilder = new NamespaceBuilder();
diff --git a/pkg/analyzer/lib/src/lint/pub.dart b/pkg/analyzer/lib/src/lint/pub.dart
index 1db39bf..8e6deed 100644
--- a/pkg/analyzer/lib/src/lint/pub.dart
+++ b/pkg/analyzer/lib/src/lint/pub.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -81,8 +81,7 @@
   PSEntry get version;
 }
 
-abstract class PSDependencyList extends Object
-    with IterableMixin<PSDependency> {}
+abstract class PSDependencyList with IterableMixin<PSDependency> {}
 
 class PSEntry {
   final PSNode key;
@@ -110,7 +109,7 @@
   String get text;
 }
 
-abstract class PSNodeList extends Object with IterableMixin<PSNode> {
+abstract class PSNodeList with IterableMixin<PSNode> {
   @override
   Iterator<PSNode> get iterator;
   PSNode get token;
@@ -137,8 +136,8 @@
   T visitPackageAuthors(PSNodeList authors) => null;
   T visitPackageDependencies(PSDependencyList dependencies) => null;
   T visitPackageDependency(PSDependency dependency) => null;
-  T visitPackageDependencyOverrides(PSDependencyList dependencies) => null;
   T visitPackageDependencyOverride(PSDependency dependency) => null;
+  T visitPackageDependencyOverrides(PSDependencyList dependencies) => null;
   T visitPackageDescription(PSEntry description) => null;
   T visitPackageDevDependencies(PSDependencyList dependencies) => null;
   T visitPackageDevDependency(PSDependency dependency) => null;
diff --git a/pkg/analyzer/lib/src/lint/registry.dart b/pkg/analyzer/lib/src/lint/registry.dart
index 24b5e47..4e02ac7 100644
--- a/pkg/analyzer/lib/src/lint/registry.dart
+++ b/pkg/analyzer/lib/src/lint/registry.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,7 +10,7 @@
 /**
  * Registry of lint rules.
  */
-class Registry extends Object with IterableMixin<LintRule> {
+class Registry with IterableMixin<LintRule> {
   /**
    * The default registry to be used by clients.
    */
diff --git a/pkg/analyzer/lib/src/lint/util.dart b/pkg/analyzer/lib/src/lint/util.dart
index 39248bc..2e12794 100644
--- a/pkg/analyzer/lib/src/lint/util.dart
+++ b/pkg/analyzer/lib/src/lint/util.dart
@@ -1,17 +1,20 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/parser.dart' show Parser;
 import 'package:analyzer/src/string_source.dart' show StringSource;
-import 'package:path/path.dart' as p;
+import 'package:path/path.dart' as path;
 
 final _identifier = new RegExp(r'^([(_|$)a-zA-Z]+([_a-zA-Z0-9])*)$');
 
@@ -32,21 +35,21 @@
 String createLibraryNamePrefix(
     {String libraryPath, String projectRoot, String packageName}) {
   // Use the posix context to canonicalize separators (`\`).
-  var libraryDirectory = p.posix.dirname(libraryPath);
-  var path = p.posix.relative(libraryDirectory, from: projectRoot);
+  var libraryDirectory = path.posix.dirname(libraryPath);
+  var relativePath = path.posix.relative(libraryDirectory, from: projectRoot);
   // Drop 'lib/'.
-  var segments = p.split(path);
+  var segments = path.split(relativePath);
   if (segments[0] == 'lib') {
-    path = p.posix.joinAll(segments.sublist(1));
+    relativePath = path.posix.joinAll(segments.sublist(1));
   }
   // Replace separators.
-  path = path.replaceAll('/', '.');
+  relativePath = relativePath.replaceAll('/', '.');
   // Add separator if needed.
-  if (path.isNotEmpty) {
-    path = '.$path';
+  if (relativePath.isNotEmpty) {
+    relativePath = '.$relativePath';
   }
 
-  return '$packageName$path';
+  return '$packageName$relativePath';
 }
 
 /// Returns `true` if this [fileName] is a Dart file.
diff --git a/pkg/analyzer/lib/src/summary/expr_builder.dart b/pkg/analyzer/lib/src/summary/expr_builder.dart
index 85053fe..e6af09e 100644
--- a/pkg/analyzer/lib/src/summary/expr_builder.dart
+++ b/pkg/analyzer/lib/src/summary/expr_builder.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -23,7 +23,7 @@
 
   final UnitResynthesizer resynthesizer;
   final ElementImpl context;
-  final UnlinkedExpr uc;
+  final UnlinkedExpr _uc;
   final bool requireValidConst;
 
   int intPtr = 0;
@@ -37,250 +37,258 @@
 
   final Map<String, ParameterElement> parametersInScope;
 
-  ExprBuilder(this.resynthesizer, this.context, this.uc,
+  ExprBuilder(this.resynthesizer, this.context, this._uc,
       {this.requireValidConst: true,
       this.localFunctions,
       Map<String, ParameterElement> parametersInScope})
       : this.parametersInScope =
             parametersInScope ?? _parametersInScope(context);
 
+  bool get hasNonEmptyExpr => _uc != null && _uc.operations.isNotEmpty;
+
   Expression build() {
-    if (requireValidConst && !uc.isValidConst) {
+    if (requireValidConst && !_uc.isValidConst) {
       return null;
     }
-    try {
-      for (UnlinkedExprOperation operation in uc.operations) {
-        switch (operation) {
-          case UnlinkedExprOperation.pushNull:
-            _push(AstTestFactory.nullLiteral());
-            break;
-          // bool
-          case UnlinkedExprOperation.pushFalse:
-            _push(AstTestFactory.booleanLiteral(false));
-            break;
-          case UnlinkedExprOperation.pushTrue:
-            _push(AstTestFactory.booleanLiteral(true));
-            break;
-          // literals
-          case UnlinkedExprOperation.pushInt:
-            int value = uc.ints[intPtr++];
-            _push(AstTestFactory.integer(value));
-            break;
-          case UnlinkedExprOperation.pushLongInt:
-            int value = 0;
-            int count = uc.ints[intPtr++];
-            for (int i = 0; i < count; i++) {
-              int next = uc.ints[intPtr++];
-              value = value << 32 | next;
-            }
-            _push(AstTestFactory.integer(value));
-            break;
-          case UnlinkedExprOperation.pushDouble:
-            double value = uc.doubles[doublePtr++];
-            _push(AstTestFactory.doubleLiteral(value));
-            break;
-          case UnlinkedExprOperation.makeSymbol:
-            String component = uc.strings[stringPtr++];
-            _push(AstTestFactory.symbolLiteral([component]));
-            break;
-          // String
-          case UnlinkedExprOperation.pushString:
-            String value = uc.strings[stringPtr++];
-            _push(AstTestFactory.string2(value));
-            break;
-          case UnlinkedExprOperation.concatenate:
-            int count = uc.ints[intPtr++];
-            List<InterpolationElement> elements = <InterpolationElement>[];
-            for (int i = 0; i < count; i++) {
-              Expression expr = _pop();
-              InterpolationElement element = _newInterpolationElement(expr);
-              elements.insert(0, element);
-            }
-            _push(AstTestFactory.string(elements));
-            break;
-          // binary
-          case UnlinkedExprOperation.equal:
-            _pushBinary(TokenType.EQ_EQ);
-            break;
-          case UnlinkedExprOperation.notEqual:
-            _pushBinary(TokenType.BANG_EQ);
-            break;
-          case UnlinkedExprOperation.and:
-            _pushBinary(TokenType.AMPERSAND_AMPERSAND);
-            break;
-          case UnlinkedExprOperation.or:
-            _pushBinary(TokenType.BAR_BAR);
-            break;
-          case UnlinkedExprOperation.bitXor:
-            _pushBinary(TokenType.CARET);
-            break;
-          case UnlinkedExprOperation.bitAnd:
-            _pushBinary(TokenType.AMPERSAND);
-            break;
-          case UnlinkedExprOperation.bitOr:
-            _pushBinary(TokenType.BAR);
-            break;
-          case UnlinkedExprOperation.bitShiftLeft:
-            _pushBinary(TokenType.LT_LT);
-            break;
-          case UnlinkedExprOperation.bitShiftRight:
-            _pushBinary(TokenType.GT_GT);
-            break;
-          case UnlinkedExprOperation.add:
-            _pushBinary(TokenType.PLUS);
-            break;
-          case UnlinkedExprOperation.subtract:
-            _pushBinary(TokenType.MINUS);
-            break;
-          case UnlinkedExprOperation.multiply:
-            _pushBinary(TokenType.STAR);
-            break;
-          case UnlinkedExprOperation.divide:
-            _pushBinary(TokenType.SLASH);
-            break;
-          case UnlinkedExprOperation.floorDivide:
-            _pushBinary(TokenType.TILDE_SLASH);
-            break;
-          case UnlinkedExprOperation.modulo:
-            _pushBinary(TokenType.PERCENT);
-            break;
-          case UnlinkedExprOperation.greater:
-            _pushBinary(TokenType.GT);
-            break;
-          case UnlinkedExprOperation.greaterEqual:
-            _pushBinary(TokenType.GT_EQ);
-            break;
-          case UnlinkedExprOperation.less:
-            _pushBinary(TokenType.LT);
-            break;
-          case UnlinkedExprOperation.lessEqual:
-            _pushBinary(TokenType.LT_EQ);
-            break;
-          // prefix
-          case UnlinkedExprOperation.complement:
-            _pushPrefix(TokenType.TILDE);
-            break;
-          case UnlinkedExprOperation.negate:
-            _pushPrefix(TokenType.MINUS);
-            break;
-          case UnlinkedExprOperation.not:
-            _pushPrefix(TokenType.BANG);
-            break;
-          // conditional
-          case UnlinkedExprOperation.conditional:
-            Expression elseExpr = _pop();
-            Expression thenExpr = _pop();
-            Expression condition = _pop();
-            _push(AstTestFactory.conditionalExpression(
-                condition, thenExpr, elseExpr));
-            break;
-          case UnlinkedExprOperation.invokeMethodRef:
-            _pushInvokeMethodRef();
-            break;
-          case UnlinkedExprOperation.invokeMethod:
-            List<Expression> arguments = _buildArguments();
-            TypeArgumentList typeArguments = _buildTypeArguments();
-            Expression target = _pop();
-            String name = uc.strings[stringPtr++];
-            _push(AstTestFactory.methodInvocation3(
-                target, name, typeArguments, arguments));
-            break;
-          // containers
-          case UnlinkedExprOperation.makeUntypedList:
-            _pushList(null);
-            break;
-          case UnlinkedExprOperation.makeTypedList:
-            TypeAnnotation itemType = _newTypeName();
-            _pushList(
-                AstTestFactory.typeArgumentList(<TypeAnnotation>[itemType]));
-            break;
-          case UnlinkedExprOperation.makeUntypedMap:
-            _pushMap(null);
-            break;
-          case UnlinkedExprOperation.makeTypedMap:
-            TypeAnnotation keyType = _newTypeName();
-            TypeAnnotation valueType = _newTypeName();
-            _pushMap(AstTestFactory.typeArgumentList(
-                <TypeAnnotation>[keyType, valueType]));
-            break;
-          case UnlinkedExprOperation.pushReference:
-            _pushReference();
-            break;
-          case UnlinkedExprOperation.extractProperty:
-            _pushExtractProperty();
-            break;
-          case UnlinkedExprOperation.invokeConstructor:
-            _pushInstanceCreation();
-            break;
-          case UnlinkedExprOperation.pushParameter:
-            String name = uc.strings[stringPtr++];
-            SimpleIdentifier identifier = AstTestFactory.identifier3(name);
-            identifier.staticElement = parametersInScope[name];
-            _push(identifier);
-            break;
-          case UnlinkedExprOperation.ifNull:
-            _pushBinary(TokenType.QUESTION_QUESTION);
-            break;
-          case UnlinkedExprOperation.await:
-            Expression expression = _pop();
-            _push(AstTestFactory.awaitExpression(expression));
-            break;
-          case UnlinkedExprOperation.pushLocalFunctionReference:
-            _pushLocalFunctionReference();
-            break;
-          case UnlinkedExprOperation.assignToRef:
-            var ref = _createReference();
-            _push(_createAssignment(ref));
-            break;
-          case UnlinkedExprOperation.typeCast:
-            Expression expression = _pop();
-            TypeAnnotation type = _newTypeName();
-            _push(AstTestFactory.asExpression(expression, type));
-            break;
-          case UnlinkedExprOperation.typeCheck:
-            Expression expression = _pop();
-            TypeAnnotation type = _newTypeName();
-            _push(AstTestFactory.isExpression(expression, false, type));
-            break;
-          case UnlinkedExprOperation.throwException:
-            Expression expression = _pop();
-            _push(AstTestFactory.throwExpression2(expression));
-            break;
-          case UnlinkedExprOperation.assignToProperty:
-            Expression target = _pop();
-            String name = uc.strings[stringPtr++];
-            SimpleIdentifier propertyNode = AstTestFactory.identifier3(name);
-            PropertyAccess propertyAccess =
-                AstTestFactory.propertyAccess(target, propertyNode);
-            _push(_createAssignment(propertyAccess));
-            break;
-          case UnlinkedExprOperation.assignToIndex:
-            Expression index = _pop();
-            Expression target = _pop();
-            IndexExpression indexExpression =
-                AstTestFactory.indexExpression(target, index);
-            _push(_createAssignment(indexExpression));
-            break;
-          case UnlinkedExprOperation.extractIndex:
-            Expression index = _pop();
-            Expression target = _pop();
-            _push(AstTestFactory.indexExpression(target, index));
-            break;
-          case UnlinkedExprOperation.pushSuper:
-          case UnlinkedExprOperation.pushThis:
-            throw const _InvalidConstantException(); // TODO(paulberry)
-          case UnlinkedExprOperation.cascadeSectionBegin:
-          case UnlinkedExprOperation.cascadeSectionEnd:
-          case UnlinkedExprOperation.pushLocalFunctionReference:
-          case UnlinkedExprOperation.pushError:
-          case UnlinkedExprOperation.pushTypedAbstract:
-          case UnlinkedExprOperation.pushUntypedAbstract:
-            throw new UnimplementedError(
-                'Unexpected $operation in a constant expression.');
-        }
+    for (UnlinkedExprOperation operation in _uc.operations) {
+      switch (operation) {
+        case UnlinkedExprOperation.pushNull:
+          _push(AstTestFactory.nullLiteral());
+          break;
+        // bool
+        case UnlinkedExprOperation.pushFalse:
+          _push(AstTestFactory.booleanLiteral(false));
+          break;
+        case UnlinkedExprOperation.pushTrue:
+          _push(AstTestFactory.booleanLiteral(true));
+          break;
+        // literals
+        case UnlinkedExprOperation.pushInt:
+          int value = _uc.ints[intPtr++];
+          _push(AstTestFactory.integer(value));
+          break;
+        case UnlinkedExprOperation.pushLongInt:
+          int value = 0;
+          int count = _uc.ints[intPtr++];
+          for (int i = 0; i < count; i++) {
+            int next = _uc.ints[intPtr++];
+            value = value << 32 | next;
+          }
+          _push(AstTestFactory.integer(value));
+          break;
+        case UnlinkedExprOperation.pushDouble:
+          double value = _uc.doubles[doublePtr++];
+          _push(AstTestFactory.doubleLiteral(value));
+          break;
+        case UnlinkedExprOperation.makeSymbol:
+          String component = _uc.strings[stringPtr++];
+          _push(AstTestFactory.symbolLiteral([component]));
+          break;
+        // String
+        case UnlinkedExprOperation.pushString:
+          String value = _uc.strings[stringPtr++];
+          _push(AstTestFactory.string2(value));
+          break;
+        case UnlinkedExprOperation.concatenate:
+          int count = _uc.ints[intPtr++];
+          List<InterpolationElement> elements = <InterpolationElement>[];
+          for (int i = 0; i < count; i++) {
+            Expression expr = _pop();
+            InterpolationElement element = _newInterpolationElement(expr);
+            elements.insert(0, element);
+          }
+          _push(AstTestFactory.string(elements));
+          break;
+        // binary
+        case UnlinkedExprOperation.equal:
+          _pushBinary(TokenType.EQ_EQ);
+          break;
+        case UnlinkedExprOperation.notEqual:
+          _pushBinary(TokenType.BANG_EQ);
+          break;
+        case UnlinkedExprOperation.and:
+          _pushBinary(TokenType.AMPERSAND_AMPERSAND);
+          break;
+        case UnlinkedExprOperation.or:
+          _pushBinary(TokenType.BAR_BAR);
+          break;
+        case UnlinkedExprOperation.bitXor:
+          _pushBinary(TokenType.CARET);
+          break;
+        case UnlinkedExprOperation.bitAnd:
+          _pushBinary(TokenType.AMPERSAND);
+          break;
+        case UnlinkedExprOperation.bitOr:
+          _pushBinary(TokenType.BAR);
+          break;
+        case UnlinkedExprOperation.bitShiftLeft:
+          _pushBinary(TokenType.LT_LT);
+          break;
+        case UnlinkedExprOperation.bitShiftRight:
+          _pushBinary(TokenType.GT_GT);
+          break;
+        case UnlinkedExprOperation.add:
+          _pushBinary(TokenType.PLUS);
+          break;
+        case UnlinkedExprOperation.subtract:
+          _pushBinary(TokenType.MINUS);
+          break;
+        case UnlinkedExprOperation.multiply:
+          _pushBinary(TokenType.STAR);
+          break;
+        case UnlinkedExprOperation.divide:
+          _pushBinary(TokenType.SLASH);
+          break;
+        case UnlinkedExprOperation.floorDivide:
+          _pushBinary(TokenType.TILDE_SLASH);
+          break;
+        case UnlinkedExprOperation.modulo:
+          _pushBinary(TokenType.PERCENT);
+          break;
+        case UnlinkedExprOperation.greater:
+          _pushBinary(TokenType.GT);
+          break;
+        case UnlinkedExprOperation.greaterEqual:
+          _pushBinary(TokenType.GT_EQ);
+          break;
+        case UnlinkedExprOperation.less:
+          _pushBinary(TokenType.LT);
+          break;
+        case UnlinkedExprOperation.lessEqual:
+          _pushBinary(TokenType.LT_EQ);
+          break;
+        // prefix
+        case UnlinkedExprOperation.complement:
+          _pushPrefix(TokenType.TILDE);
+          break;
+        case UnlinkedExprOperation.negate:
+          _pushPrefix(TokenType.MINUS);
+          break;
+        case UnlinkedExprOperation.not:
+          _pushPrefix(TokenType.BANG);
+          break;
+        // conditional
+        case UnlinkedExprOperation.conditional:
+          Expression elseExpr = _pop();
+          Expression thenExpr = _pop();
+          Expression condition = _pop();
+          _push(AstTestFactory.conditionalExpression(
+              condition, thenExpr, elseExpr));
+          break;
+        case UnlinkedExprOperation.invokeMethodRef:
+          _pushInvokeMethodRef();
+          break;
+        case UnlinkedExprOperation.invokeMethod:
+          List<Expression> arguments = _buildArguments();
+          TypeArgumentList typeArguments = _buildTypeArguments();
+          Expression target = _pop();
+          String name = _uc.strings[stringPtr++];
+          _push(AstTestFactory.methodInvocation3(
+              target, name, typeArguments, arguments));
+          break;
+        // containers
+        case UnlinkedExprOperation.makeUntypedList:
+          _pushList(null);
+          break;
+        case UnlinkedExprOperation.makeTypedList:
+          TypeAnnotation itemType = _newTypeName();
+          _pushList(
+              AstTestFactory.typeArgumentList(<TypeAnnotation>[itemType]));
+          break;
+        case UnlinkedExprOperation.makeUntypedMap:
+          _pushMap(null);
+          break;
+        case UnlinkedExprOperation.makeTypedMap:
+          TypeAnnotation keyType = _newTypeName();
+          TypeAnnotation valueType = _newTypeName();
+          _pushMap(AstTestFactory.typeArgumentList(
+              <TypeAnnotation>[keyType, valueType]));
+          break;
+        case UnlinkedExprOperation.makeUntypedSet:
+          _pushSet(null);
+          break;
+        case UnlinkedExprOperation.makeTypedSet:
+          TypeAnnotation itemType = _newTypeName();
+          _pushSet(AstTestFactory.typeArgumentList(<TypeAnnotation>[itemType]));
+          break;
+        case UnlinkedExprOperation.pushReference:
+          _pushReference();
+          break;
+        case UnlinkedExprOperation.extractProperty:
+          _pushExtractProperty();
+          break;
+        case UnlinkedExprOperation.invokeConstructor:
+          _pushInstanceCreation();
+          break;
+        case UnlinkedExprOperation.pushParameter:
+          String name = _uc.strings[stringPtr++];
+          SimpleIdentifier identifier = AstTestFactory.identifier3(name);
+          identifier.staticElement = parametersInScope[name];
+          _push(identifier);
+          break;
+        case UnlinkedExprOperation.ifNull:
+          _pushBinary(TokenType.QUESTION_QUESTION);
+          break;
+        case UnlinkedExprOperation.await:
+          Expression expression = _pop();
+          _push(AstTestFactory.awaitExpression(expression));
+          break;
+        case UnlinkedExprOperation.pushLocalFunctionReference:
+          _pushLocalFunctionReference();
+          break;
+        case UnlinkedExprOperation.assignToRef:
+          var ref = _createReference();
+          _push(_createAssignment(ref));
+          break;
+        case UnlinkedExprOperation.typeCast:
+          Expression expression = _pop();
+          TypeAnnotation type = _newTypeName();
+          _push(AstTestFactory.asExpression(expression, type));
+          break;
+        case UnlinkedExprOperation.typeCheck:
+          Expression expression = _pop();
+          TypeAnnotation type = _newTypeName();
+          _push(AstTestFactory.isExpression(expression, false, type));
+          break;
+        case UnlinkedExprOperation.throwException:
+          Expression expression = _pop();
+          _push(AstTestFactory.throwExpression2(expression));
+          break;
+        case UnlinkedExprOperation.assignToProperty:
+          Expression target = _pop();
+          String name = _uc.strings[stringPtr++];
+          SimpleIdentifier propertyNode = AstTestFactory.identifier3(name);
+          PropertyAccess propertyAccess =
+              AstTestFactory.propertyAccess(target, propertyNode);
+          _push(_createAssignment(propertyAccess));
+          break;
+        case UnlinkedExprOperation.assignToIndex:
+          Expression index = _pop();
+          Expression target = _pop();
+          IndexExpression indexExpression =
+              AstTestFactory.indexExpression(target, index);
+          _push(_createAssignment(indexExpression));
+          break;
+        case UnlinkedExprOperation.extractIndex:
+          Expression index = _pop();
+          Expression target = _pop();
+          _push(AstTestFactory.indexExpression(target, index));
+          break;
+        case UnlinkedExprOperation.pushSuper:
+          _push(AstTestFactory.superExpression());
+          break;
+        case UnlinkedExprOperation.pushThis:
+          _push(AstTestFactory.thisExpression());
+          break;
+        case UnlinkedExprOperation.cascadeSectionBegin:
+        case UnlinkedExprOperation.cascadeSectionEnd:
+        case UnlinkedExprOperation.pushLocalFunctionReference:
+        case UnlinkedExprOperation.pushError:
+        case UnlinkedExprOperation.pushTypedAbstract:
+        case UnlinkedExprOperation.pushUntypedAbstract:
+          throw new UnimplementedError(
+              'Unexpected $operation in a constant expression.');
       }
-    } on _InvalidConstantException {
-      return AstTestFactory.identifier3(r'#invalidConst');
     }
     return stack.single;
   }
@@ -288,13 +296,13 @@
   List<Expression> _buildArguments() {
     List<Expression> arguments;
     {
-      int numNamedArgs = uc.ints[intPtr++];
-      int numPositionalArgs = uc.ints[intPtr++];
+      int numNamedArgs = _uc.ints[intPtr++];
+      int numPositionalArgs = _uc.ints[intPtr++];
       int numArgs = numNamedArgs + numPositionalArgs;
       arguments = _removeTopItems(numArgs);
       // add names to the named arguments
       for (int i = 0; i < numNamedArgs; i++) {
-        String name = uc.strings[stringPtr++];
+        String name = _uc.strings[stringPtr++];
         int index = numPositionalArgs + i;
         arguments[index] =
             AstTestFactory.namedExpression2(name, arguments[index]);
@@ -324,7 +332,7 @@
       constructorName.name?.staticElement = constructorElement;
 
       var creation = astFactory.instanceCreationExpression(
-          uc.isValidConst
+          _uc.isValidConst
               ? TokenFactory.tokenFromKeyword(Keyword.CONST)
               : TokenFactory.tokenFromKeyword(Keyword.NEW),
           constructorName,
@@ -430,16 +438,13 @@
         ..staticElement = element;
       return AstTestFactory.identifier(enclosing, identifier);
     }
-    if (requireValidConst && element == null) {
-      throw const _InvalidConstantException();
-    }
     SimpleIdentifier property = AstTestFactory.identifier3(info.name)
       ..staticElement = element;
     return AstTestFactory.propertyAccess(enclosing, property);
   }
 
   TypeArgumentList _buildTypeArguments() {
-    int numTypeArguments = uc.ints[intPtr++];
+    int numTypeArguments = _uc.ints[intPtr++];
     if (numTypeArguments == 0) {
       return null;
     }
@@ -480,7 +485,7 @@
       return AstTestFactory.postfixExpression(lhs, tokenType);
     }
 
-    switch (uc.assignmentOperators[assignmentOperatorPtr++]) {
+    switch (_uc.assignmentOperators[assignmentOperatorPtr++]) {
       case UnlinkedExprAssignOperator.assign:
         return binary(TokenType.EQ);
       case UnlinkedExprAssignOperator.ifNull:
@@ -521,13 +526,17 @@
   }
 
   Expression _createReference() {
-    EntityRef ref = uc.references[refPtr++];
-    ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference);
-    Expression node = _buildIdentifierSequence(info);
-    if (requireValidConst && node is Identifier && node.staticElement == null) {
-      throw const _InvalidConstantException();
+    EntityRef ref = _uc.references[refPtr++];
+    if (ref.paramReference != 0) {
+      // This is a reference to a type parameter.  For type inference purposes
+      // we don't actually need to know which type parameter it's a reference
+      // to; we just need to know that it represents a type.  So map it to
+      // `Object`.
+      return AstTestFactory.identifier3('Object')
+        ..staticElement = resynthesizer.typeProvider.objectType.element;
     }
-    return node;
+    ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference);
+    return _buildIdentifierSequence(info);
   }
 
   PropertyAccessorElement _getStringLengthElement() =>
@@ -564,7 +573,7 @@
    * corresponding to this type.
    */
   TypeAnnotation _newTypeName() {
-    EntityRef typeRef = uc.references[refPtr++];
+    EntityRef typeRef = _uc.references[refPtr++];
     DartType type = resynthesizer.buildType(context, typeRef);
     return _buildTypeAst(type);
   }
@@ -583,7 +592,7 @@
 
   void _pushExtractProperty() {
     Expression target = _pop();
-    String name = uc.strings[stringPtr++];
+    String name = _uc.strings[stringPtr++];
     SimpleIdentifier propertyNode = AstTestFactory.identifier3(name);
     // Only String.length property access can be potentially resolved.
     if (name == 'length') {
@@ -593,7 +602,7 @@
   }
 
   void _pushInstanceCreation() {
-    EntityRef ref = uc.references[refPtr++];
+    EntityRef ref = _uc.references[refPtr++];
     ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference);
     // prepare ConstructorElement
     TypeName typeNode;
@@ -605,11 +614,11 @@
       } else if (info.element is ClassElement) {
         constructorName = null;
       } else {
-        List<Expression> arguments = _buildArguments();
-        SimpleIdentifier name = AstTestFactory.identifier3(info.name);
-        name.staticElement = info.element;
-        name.setProperty(ARGUMENT_LIST, AstTestFactory.argumentList(arguments));
-        _push(name);
+        // Unexpected element, consider it unresolved.
+        _buildArguments();
+        var identifier = AstTestFactory.identifier3('__unresolved__')
+          ..staticType = resynthesizer.typeProvider.dynamicType;
+        _push(identifier);
         return;
       }
       InterfaceType definingType = resynthesizer.createConstructorDefiningType(
@@ -657,9 +666,6 @@
       constructorNode = AstTestFactory.constructorName(typeNode, null);
     }
     constructorNode.staticElement = constructorElement;
-    if (constructorElement == null) {
-      throw const _InvalidConstantException();
-    }
     // create InstanceCreationExpression
     InstanceCreationExpression instanceCreation =
         AstTestFactory.instanceCreationExpression(
@@ -672,7 +678,7 @@
 
   void _pushInvokeMethodRef() {
     List<Expression> arguments = _buildArguments();
-    EntityRef ref = uc.references[refPtr++];
+    EntityRef ref = _uc.references[refPtr++];
     ReferenceInfo info = resynthesizer.getReferenceInfo(ref.reference);
     Expression node = _buildIdentifierSequence(info);
     TypeArgumentList typeArguments = _buildTypeArguments();
@@ -706,20 +712,24 @@
   }
 
   void _pushList(TypeArgumentList typeArguments) {
-    int count = uc.ints[intPtr++];
+    int count = _uc.ints[intPtr++];
     List<Expression> elements = <Expression>[];
     for (int i = 0; i < count; i++) {
       elements.insert(0, _pop());
     }
-    _push(AstTestFactory.listLiteral2(Keyword.CONST, typeArguments, elements));
+    var typeArg = typeArguments == null
+        ? resynthesizer.typeProvider.dynamicType
+        : typeArguments.arguments[0].type;
+    var staticType = resynthesizer.typeProvider.listType.instantiate([typeArg]);
+    _push(AstTestFactory.listLiteral2(Keyword.CONST, typeArguments, elements)
+      ..staticType = staticType);
   }
 
   void _pushLocalFunctionReference() {
-    _throwIfConst();
-    int popCount = uc.ints[intPtr++];
+    int popCount = _uc.ints[intPtr++];
     // Note: nonzero popCount is no longer used.
     assert(popCount == 0);
-    int functionIndex = uc.ints[intPtr++];
+    int functionIndex = _uc.ints[intPtr++];
     var localFunction = localFunctions[functionIndex];
     var parametersInScope =
         new Map<String, ParameterElement>.from(this.parametersInScope);
@@ -756,21 +766,30 @@
       functionBody = astFactory.expressionFunctionBody(asyncKeyword,
           TokenFactory.tokenFromType(TokenType.FUNCTION), bodyExpr, null);
     }
-    var functionExpression = astFactory.functionExpression(
+    FunctionExpressionImpl functionExpression = astFactory.functionExpression(
         null, AstTestFactory.formalParameterList(parameters), functionBody);
-    functionExpression.element = functionElement;
+    functionExpression.declaredElement = functionElement;
     _push(functionExpression);
   }
 
   void _pushMap(TypeArgumentList typeArguments) {
-    int count = uc.ints[intPtr++];
+    int count = _uc.ints[intPtr++];
     List<MapLiteralEntry> entries = <MapLiteralEntry>[];
     for (int i = 0; i < count; i++) {
       Expression value = _pop();
       Expression key = _pop();
       entries.insert(0, AstTestFactory.mapLiteralEntry2(key, value));
     }
-    _push(AstTestFactory.mapLiteral(Keyword.CONST, typeArguments, entries));
+    var keyType = typeArguments == null
+        ? resynthesizer.typeProvider.dynamicType
+        : typeArguments.arguments[0].type;
+    var valueType = typeArguments == null
+        ? resynthesizer.typeProvider.dynamicType
+        : typeArguments.arguments[1].type;
+    var staticType =
+        resynthesizer.typeProvider.mapType.instantiate([keyType, valueType]);
+    _push(AstTestFactory.mapLiteral(Keyword.CONST, typeArguments, entries)
+      ..staticType = staticType);
   }
 
   void _pushPrefix(TokenType operator) {
@@ -782,6 +801,15 @@
     _push(_createReference());
   }
 
+  void _pushSet(TypeArgumentList typeArguments) {
+    int count = _uc.ints[intPtr++];
+    List<Expression> elements = <Expression>[];
+    for (int i = 0; i < count; i++) {
+      elements.insert(0, _pop());
+    }
+    _push(AstTestFactory.setLiteral(Keyword.CONST, typeArguments, elements));
+  }
+
   List<Expression> _removeTopItems(int count) {
     int start = stack.length - count;
     int end = stack.length;
@@ -790,12 +818,6 @@
     return items;
   }
 
-  void _throwIfConst() {
-    if (requireValidConst) {
-      throw const _InvalidConstantException();
-    }
-  }
-
   /// Figures out the default value of [parametersInScope] based on [context].
   ///
   /// If [context] is (or contains) a constructor, then its parameters are used.
@@ -813,11 +835,3 @@
     return result;
   }
 }
-
-/**
- * This exception is thrown when we detect that the constant expression
- * being resynthesized is not a valid constant expression.
- */
-class _InvalidConstantException {
-  const _InvalidConstantException();
-}
diff --git a/pkg/analyzer/lib/src/summary/flat_buffers.dart b/pkg/analyzer/lib/src/summary/flat_buffers.dart
index 3449a3b..c291d61 100644
--- a/pkg/analyzer/lib/src/summary/flat_buffers.dart
+++ b/pkg/analyzer/lib/src/summary/flat_buffers.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -757,7 +757,7 @@
 /**
  * List of booleans backed by 8-bit unsigned integers.
  */
-class _FbBoolList extends Object with ListMixin<bool> implements List<bool> {
+class _FbBoolList with ListMixin<bool> implements List<bool> {
   final BufferContext bc;
   final int offset;
   int _length;
@@ -829,7 +829,7 @@
 /**
  * The base class for immutable lists read from flat buffers.
  */
-abstract class _FbList<E> extends Object with ListMixin<E> implements List<E> {
+abstract class _FbList<E> with ListMixin<E> implements List<E> {
   final BufferContext bc;
   final int offset;
   int _length;
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 0a66bae..3c8019c 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -8291,6 +8291,7 @@
   bool _isValidConst;
   List<idl.UnlinkedExprOperation> _operations;
   List<EntityRefBuilder> _references;
+  String _sourceRepresentation;
   List<String> _strings;
 
   @override
@@ -8352,6 +8353,15 @@
   }
 
   @override
+  String get sourceRepresentation => _sourceRepresentation ??= '';
+
+  /// String representation of the expression in a form suitable to be tokenized
+  /// and parsed.
+  void set sourceRepresentation(String value) {
+    this._sourceRepresentation = value;
+  }
+
+  @override
   List<String> get strings => _strings ??= <String>[];
 
   /// Sequence of strings consumed by the operations `pushString` and
@@ -8367,6 +8377,7 @@
       bool isValidConst,
       List<idl.UnlinkedExprOperation> operations,
       List<EntityRefBuilder> references,
+      String sourceRepresentation,
       List<String> strings})
       : _assignmentOperators = assignmentOperators,
         _doubles = doubles,
@@ -8374,6 +8385,7 @@
         _isValidConst = isValidConst,
         _operations = operations,
         _references = references,
+        _sourceRepresentation = sourceRepresentation,
         _strings = strings;
 
   /**
@@ -8436,6 +8448,7 @@
         signature.addInt(x.index);
       }
     }
+    signature.addString(this._sourceRepresentation ?? '');
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
@@ -8444,6 +8457,7 @@
     fb.Offset offset_ints;
     fb.Offset offset_operations;
     fb.Offset offset_references;
+    fb.Offset offset_sourceRepresentation;
     fb.Offset offset_strings;
     if (!(_assignmentOperators == null || _assignmentOperators.isEmpty)) {
       offset_assignmentOperators = fbBuilder
@@ -8463,6 +8477,10 @@
       offset_references = fbBuilder
           .writeList(_references.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (_sourceRepresentation != null) {
+      offset_sourceRepresentation =
+          fbBuilder.writeString(_sourceRepresentation);
+    }
     if (!(_strings == null || _strings.isEmpty)) {
       offset_strings = fbBuilder
           .writeList(_strings.map((b) => fbBuilder.writeString(b)).toList());
@@ -8486,6 +8504,9 @@
     if (offset_references != null) {
       fbBuilder.addOffset(2, offset_references);
     }
+    if (offset_sourceRepresentation != null) {
+      fbBuilder.addOffset(7, offset_sourceRepresentation);
+    }
     if (offset_strings != null) {
       fbBuilder.addOffset(3, offset_strings);
     }
@@ -8515,6 +8536,7 @@
   bool _isValidConst;
   List<idl.UnlinkedExprOperation> _operations;
   List<idl.EntityRef> _references;
+  String _sourceRepresentation;
   List<String> _strings;
 
   @override
@@ -8563,6 +8585,13 @@
   }
 
   @override
+  String get sourceRepresentation {
+    _sourceRepresentation ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 7, '');
+    return _sourceRepresentation;
+  }
+
+  @override
   List<String> get strings {
     _strings ??= const fb.ListReader<String>(const fb.StringReader())
         .vTableGet(_bc, _bcOffset, 3, const <String>[]);
@@ -8590,6 +8619,8 @@
     if (references.isNotEmpty)
       _result["references"] =
           references.map((_value) => _value.toJson()).toList();
+    if (sourceRepresentation != '')
+      _result["sourceRepresentation"] = sourceRepresentation;
     if (strings.isNotEmpty) _result["strings"] = strings;
     return _result;
   }
@@ -8602,6 +8633,7 @@
         "isValidConst": isValidConst,
         "operations": operations,
         "references": references,
+        "sourceRepresentation": sourceRepresentation,
         "strings": strings,
       };
 
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 4289b7f..5d328ce 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -107,6 +107,9 @@
   /// The synthetic `values` getter of an enum.
   enumValues,
 
+  /// The synthetic `toString` method of an enum.
+  enumToString,
+
   /// The containing unit itself.
   unit
 }
@@ -639,7 +642,19 @@
   pushThis,
 
   /// Push `super` expression onto the stack.
-  pushSuper
+  pushSuper,
+
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), place them in a [Set], and push the result back
+  /// onto the stack.  The type parameter for the [Set] is implicitly
+  /// `dynamic`.
+  makeUntypedSet,
+
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), place them in a [Set], and push the result back
+  /// onto the stack.  The type parameter for the [Set] is obtained from
+  /// [UnlinkedExpr.references].
+  makeTypedSet
 }
 
 /// Enum used to indicate the kind of a parameter.
@@ -1656,6 +1671,10 @@
   /// actual entity being referred to may be something other than a type.
   references:[EntityRef] (id: 2);
 
+  /// String representation of the expression in a form suitable to be tokenized
+  /// and parsed.
+  sourceRepresentation:string (id: 7);
+
   /// Sequence of strings consumed by the operations `pushString` and
   /// `invokeConstructor`.
   strings:[string] (id: 3);
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 8a85d55..d3dff59 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -502,6 +502,9 @@
   /// The synthetic `values` getter of an enum.
   enumValues,
 
+  /// The synthetic `toString` method of an enum.
+  enumToString,
+
   /// The containing unit itself.
   unit
 }
@@ -1528,6 +1531,11 @@
   @Id(2)
   List<EntityRef> get references;
 
+  /// String representation of the expression in a form suitable to be tokenized
+  /// and parsed.
+  @Id(7)
+  String get sourceRepresentation;
+
   /// Sequence of strings consumed by the operations `pushString` and
   /// `invokeConstructor`.
   @Id(3)
@@ -1954,6 +1962,18 @@
 
   /// Push `super` expression onto the stack.
   pushSuper,
+
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), place them in a [Set], and push the result back
+  /// onto the stack.  The type parameter for the [Set] is implicitly
+  /// `dynamic`.
+  makeUntypedSet,
+
+  /// Pop the top n values from the stack (where n is obtained from
+  /// [UnlinkedExpr.ints]), place them in a [Set], and push the result back
+  /// onto the stack.  The type parameter for the [Set] is obtained from
+  /// [UnlinkedExpr.references].
+  makeTypedSet,
 }
 
 /// Unlinked summary information about an import declaration.
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 7feaae8..f0a1a4a 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -1,7 +1,9 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/session.dart';
+
 /// This library is capable of producing linked summaries from unlinked
 /// ones (or prelinked ones).  It functions by building a miniature
 /// element model to represent the contents of the summaries, and then
@@ -60,6 +62,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/builder.dart';
@@ -416,14 +419,12 @@
   AnalysisOptionsForLink(this._linker);
 
   @override
-  bool get declarationCasts => true;
-
-  @override
   bool get hint => false;
 
   @override
   bool get implicitCasts => true;
 
+  @deprecated
   @override
   bool get previewDart2 => true;
 
@@ -434,12 +435,15 @@
   bool get strongModeHints => false;
 
   @override
+  ExperimentStatus get experimentStatus => new ExperimentStatus();
+
+  @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
 /// Element representing a class or enum resynthesized from a summary
 /// during linking.
-abstract class ClassElementForLink extends Object
+abstract class ClassElementForLink
     with ReferenceableElementForLink
     implements AbstractClassElementImpl {
   Map<String, ReferenceableElementForLink> _containedNames;
@@ -700,6 +704,9 @@
       _unlinkedClass.interfaces.map(_computeInterfaceType).toList();
 
   @override
+  bool get isAbstract => _unlinkedClass.isAbstract;
+
+  @override
   bool get isEnum => false;
 
   @override
@@ -800,6 +807,9 @@
   String get name => _unlinkedClass.name;
 
   @override
+  AnalysisSession get session => enclosingUnit.session;
+
+  @override
   List<InterfaceType> get superclassConstraints {
     if (_superclassConstraints == null) {
       if (isMixin) {
@@ -1002,6 +1012,9 @@
   List<InterfaceType> get interfaces => const [];
 
   @override
+  bool get isAbstract => false;
+
+  @override
   bool get isEnum => true;
 
   @override
@@ -1229,6 +1242,9 @@
   ResynthesizerContext get resynthesizerContext => this;
 
   @override
+  AnalysisSession get session => library.session;
+
+  @override
   List<TopLevelVariableElementForLink> get topLevelVariables {
     if (_topLevelVariables == null) {
       List<Expression> initializerExpressionsForInference;
@@ -1908,6 +1924,7 @@
           break;
         case UnlinkedExprOperation.makeUntypedList:
         case UnlinkedExprOperation.makeUntypedMap:
+        case UnlinkedExprOperation.makeUntypedSet:
           intPtr++;
           break;
         case UnlinkedExprOperation.assignToRef:
@@ -1930,6 +1947,7 @@
           refPtr += numTypeArguments;
           break;
         case UnlinkedExprOperation.makeTypedList:
+        case UnlinkedExprOperation.makeTypedSet:
           refPtr++;
           intPtr++;
           break;
@@ -2221,7 +2239,7 @@
 
 /// Base class for executable elements resynthesized from a summary during
 /// linking.
-abstract class ExecutableElementForLink extends Object
+abstract class ExecutableElementForLink
     with TypeParameterizedElementMixin, ParameterParentElementForLink
     implements ExecutableElementImpl {
   /// The unlinked representation of the method in the summary.
@@ -2339,6 +2357,9 @@
   }
 
   @override
+  AnalysisSession get session => compilationUnit.session;
+
+  @override
   FunctionTypeImpl get type => _type ??= new FunctionTypeImpl(this);
 
   @override
@@ -2501,7 +2522,7 @@
         expression = AstCloner().cloneNode(expressionForInference);
         expression.accept(LocalElementBuilder(ElementHolder(), null));
       }
-    } else if (_builder.uc != null && _builder.uc.operations.isNotEmpty) {
+    } else if (_builder.hasNonEmptyExpr) {
       expression = _builder.build();
     }
     if (expression == null) {
@@ -2722,7 +2743,7 @@
 
 /// Element representing a function-typed parameter resynthesied from a summary
 /// during linking.
-class FunctionElementForLink_FunctionTypedParam extends Object
+class FunctionElementForLink_FunctionTypedParam
     with ParameterParentElementForLink
     implements FunctionElement {
   @override
@@ -2775,7 +2796,7 @@
 }
 
 /// Element representing the initializer expression of a variable.
-class FunctionElementForLink_Initializer extends Object
+class FunctionElementForLink_Initializer
     with ReferenceableElementForLink, TypeParameterizedElementMixin
     implements FunctionElementForLink_Local {
   /// The variable for which this element is the initializer.
@@ -3086,7 +3107,7 @@
 }
 
 /// Element representing a typedef resynthesized from a summary during linking.
-class FunctionTypeAliasElementForLink extends Object
+class FunctionTypeAliasElementForLink
     with
         TypeParameterizedElementMixin,
         ParameterParentElementForLink,
@@ -3147,6 +3168,9 @@
       enclosingElement.resolveTypeRef(this, _unlinkedTypedef.returnType);
 
   @override
+  AnalysisSession get session => enclosingElement.session;
+
+  @override
   TypeParameterizedElementMixin get typeParameterContext => this;
 
   @override
@@ -3198,7 +3222,7 @@
 
 /// Element representing a generic function resynthesized from a summary during
 /// linking.
-class GenericFunctionTypeElementForLink extends Object
+class GenericFunctionTypeElementForLink
     with
         TypeParameterizedElementMixin,
         ParameterParentElementForLink,
@@ -3262,6 +3286,9 @@
       _returnType ??= enclosingUnit.resolveTypeRef(this, _unlinkedReturnType);
 
   @override
+  AnalysisSession get session => enclosingElement.session;
+
+  @override
   FunctionType get type {
     return _type ??= new FunctionTypeImpl(this);
   }
@@ -3278,7 +3305,7 @@
 
 /// Element representing a generic typedef resynthesized from a summary during
 /// linking.
-class GenericTypeAliasElementForLink extends Object
+class GenericTypeAliasElementForLink
     with
         TypeParameterizedElementMixin,
         ParameterParentElementForLink,
@@ -3342,6 +3369,9 @@
       this, _unlinkedTypedef.returnType.syntheticReturnType);
 
   @override
+  AnalysisSession get session => enclosingElement.session;
+
+  @override
   TypeParameterizedElementMixin get typeParameterContext => this;
 
   @override
@@ -3962,7 +3992,7 @@
 
   /// Get an instance of [TypeSystem] for use during linking.
   TypeSystem get typeSystem =>
-      _typeSystem ??= new StrongTypeSystemImpl(typeProvider);
+      _typeSystem ??= new Dart2TypeSystem(typeProvider);
 
   /// Get the element representing `void`.
   SpecialTypeElementForLink get voidElement => _voidElement ??=
@@ -4075,8 +4105,7 @@
 /// Accesses to a chain of non-static members separated by '.' are handled by
 /// creating a [NonstaticMemberElementForLink] that points to another
 /// [NonstaticMemberElementForLink], to whatever nesting level is necessary.
-class NonstaticMemberElementForLink extends Object
-    with ReferenceableElementForLink {
+class NonstaticMemberElementForLink with ReferenceableElementForLink {
   /// The [ReferenceableElementForLink] which is the target of the non-static
   /// reference.
   final ReferenceableElementForLink _target;
@@ -4238,18 +4267,6 @@
     if (isExplicitlyCovariant || inheritsCovariant) {
       return true;
     }
-    for (UnlinkedExpr annotation in unlinkedParam.annotations) {
-      if (annotation.operations.length == 1 &&
-          annotation.operations[0] == UnlinkedExprOperation.pushReference) {
-        ReferenceableElementForLink element =
-            this.compilationUnit.resolveRef(annotation.references[0].reference);
-        if (element is PropertyAccessorElementForLink &&
-            element.name == 'checked' &&
-            element.library.name == 'meta') {
-          return true;
-        }
-      }
-    }
     return false;
   }
 
@@ -4455,7 +4472,7 @@
 
 /// Specialization of [PropertyAccessorElementForLink] for synthetic accessors
 /// implied by the synthetic fields of an enum declaration.
-class PropertyAccessorElementForLink_EnumField extends Object
+class PropertyAccessorElementForLink_EnumField
     with ReferenceableElementForLink
     implements PropertyAccessorElementForLink {
   @override
@@ -4472,6 +4489,9 @@
   Element get enclosingElement => variable.enclosingElement;
 
   @override
+  bool get isAbstract => false;
+
+  @override
   bool get isGetter => true;
 
   @override
@@ -4592,7 +4612,7 @@
 
 /// Specialization of [PropertyAccessorElementForLink] for synthetic accessors
 /// implied by a field or variable declaration.
-class PropertyAccessorElementForLink_Variable extends Object
+class PropertyAccessorElementForLink_Variable
     with ReferenceableElementForLink
     implements PropertyAccessorElementForLink {
   @override
@@ -4710,7 +4730,7 @@
 /// Base class representing an element which can be the target of a reference.
 /// When used as a mixin, implements the default behavior shared by most
 /// elements.
-abstract class ReferenceableElementForLink implements Element {
+mixin ReferenceableElementForLink implements Element {
   /// If this element is a class reference, return it. Otherwise return `null`.
   ClassElementForLink get asClass => null;
 
@@ -4989,8 +5009,7 @@
 }
 
 /// Element used for references to special types such as `void`.
-class SpecialTypeElementForLink extends Object
-    with ReferenceableElementForLink {
+class SpecialTypeElementForLink with ReferenceableElementForLink {
   final Linker linker;
   final DartType type;
 
@@ -5178,9 +5197,11 @@
           break;
         case UnlinkedExprOperation.makeUntypedList:
         case UnlinkedExprOperation.makeUntypedMap:
+        case UnlinkedExprOperation.makeUntypedSet:
           intPtr++;
           break;
         case UnlinkedExprOperation.makeTypedList:
+        case UnlinkedExprOperation.makeTypedSet:
           refPtr++;
           intPtr++;
           break;
@@ -5276,7 +5297,7 @@
             bodyType = (bodyType as InterfaceType).typeArguments[0];
           }
           bodyType = typeProvider.futureType
-              .instantiate([bodyType.flattenFutures(typeSystem)]);
+              .instantiate([typeSystem.flatten(bodyType)]);
         }
         functionElement._setInferredType(bodyType);
       }
@@ -5301,12 +5322,15 @@
   InterfaceType _futureType;
   InterfaceType _intType;
   InterfaceType _iterableDynamicType;
+  InterfaceType _iterableObjectType;
   InterfaceType _iterableType;
   InterfaceType _listType;
   InterfaceType _mapType;
+  InterfaceType _mapObjectObjectType;
   InterfaceType _nullType;
   InterfaceType _numType;
   InterfaceType _objectType;
+  InterfaceType _setType;
   InterfaceType _stackTraceType;
   InterfaceType _streamDynamicType;
   InterfaceType _streamType;
@@ -5367,6 +5391,10 @@
       iterableType.instantiate(<DartType>[dynamicType]);
 
   @override
+  InterfaceType get iterableObjectType =>
+      _iterableObjectType ??= iterableType.instantiate(<DartType>[objectType]);
+
+  @override
   InterfaceType get iterableType =>
       _iterableType ??= _buildInterfaceType(_linker.coreLibrary, 'Iterable');
 
@@ -5375,6 +5403,10 @@
       _listType ??= _buildInterfaceType(_linker.coreLibrary, 'List');
 
   @override
+  InterfaceType get mapObjectObjectType => _mapObjectObjectType ??=
+      mapType.instantiate(<DartType>[objectType, objectType]);
+
+  @override
   InterfaceType get mapType =>
       _mapType ??= _buildInterfaceType(_linker.coreLibrary, 'Map');
 
@@ -5397,6 +5429,10 @@
       _objectType ??= _buildInterfaceType(_linker.coreLibrary, 'Object');
 
   @override
+  InterfaceType get setType =>
+      _setType ??= _buildInterfaceType(_linker.coreLibrary, 'Set');
+
+  @override
   InterfaceType get stackTraceType => _stackTraceType ??=
       _buildInterfaceType(_linker.coreLibrary, 'StackTrace');
 
@@ -5434,7 +5470,7 @@
 }
 
 /// Singleton element used for unresolved references.
-class UndefinedElementForLink extends Object with ReferenceableElementForLink {
+class UndefinedElementForLink with ReferenceableElementForLink {
   static final UndefinedElementForLink instance =
       new UndefinedElementForLink._();
 
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index 801ab29..dc9e818 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -1,6 +1,7 @@
 import 'dart:io' as io;
 import 'dart:math' show min;
 
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/context/cache.dart';
@@ -73,8 +74,9 @@
  */
 class InputPackagesResultProvider extends ResynthesizerResultProvider {
   InputPackagesResultProvider(
-      InternalAnalysisContext context, SummaryDataStore dataStore)
-      : super(context, dataStore) {
+      InternalAnalysisContext context, SummaryDataStore dataStore,
+      {AnalysisSession session})
+      : super(context, session, dataStore) {
     createResynthesizer();
     context.typeProvider = resynthesizer.typeProvider;
     resynthesizer.finishCoreAsyncLibraries();
@@ -167,11 +169,12 @@
  */
 abstract class ResynthesizerResultProvider extends ResultProvider {
   final InternalAnalysisContext context;
+  final AnalysisSession session;
   final SummaryDataStore _dataStore;
 
   StoreBasedSummaryResynthesizer _resynthesizer;
 
-  ResynthesizerResultProvider(this.context, this._dataStore);
+  ResynthesizerResultProvider(this.context, this.session, this._dataStore);
 
   SummaryResynthesizer get resynthesizer => _resynthesizer;
 
@@ -317,7 +320,7 @@
    */
   void createResynthesizer() {
     _resynthesizer = new StoreBasedSummaryResynthesizer(
-        context, context.sourceFactory, true, _dataStore);
+        context, session, context.sourceFactory, true, _dataStore);
   }
 
   /**
@@ -334,9 +337,13 @@
 class StoreBasedSummaryResynthesizer extends SummaryResynthesizer {
   final SummaryDataStore _dataStore;
 
-  StoreBasedSummaryResynthesizer(AnalysisContext context,
-      SourceFactory sourceFactory, bool _, this._dataStore)
-      : super(context, sourceFactory, true);
+  StoreBasedSummaryResynthesizer(
+      AnalysisContext context,
+      AnalysisSession session,
+      SourceFactory sourceFactory,
+      bool _,
+      this._dataStore)
+      : super(context, session, sourceFactory, true);
 
   @override
   LinkedLibrary getLinkedSummary(String uri) {
diff --git a/pkg/analyzer/lib/src/summary/public_namespace_computer.dart b/pkg/analyzer/lib/src/summary/public_namespace_computer.dart
index 4d78177..4c2e4db 100644
--- a/pkg/analyzer/lib/src/summary/public_namespace_computer.dart
+++ b/pkg/analyzer/lib/src/summary/public_namespace_computer.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 7fea9c5..3c6b194 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -4,6 +4,7 @@
 
 import 'dart:collection';
 
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -171,8 +172,9 @@
   final Map<String, LibraryElement> _resynthesizedLibraries =
       <String, LibraryElement>{};
 
-  SummaryResynthesizer(AnalysisContext context, this.sourceFactory, bool _)
-      : super(context) {
+  SummaryResynthesizer(AnalysisContext context, AnalysisSession session,
+      this.sourceFactory, bool _)
+      : super(context, session) {
     _buildTypeProvider();
   }
 
@@ -257,7 +259,10 @@
         if (libraryMap == null) {
           getLibraryElement(libraryUri);
           libraryMap = _resynthesizedUnits[libraryUri];
-          assert(libraryMap != null);
+          if (libraryMap == null) {
+            throw new StateError(
+                'Unable to find library `$libraryUri` in a summary file.');
+          }
         }
         CompilationUnitElementImpl unitElement = libraryMap[unitUri];
         // Fill elements in the unit map.
@@ -324,7 +329,7 @@
       Source librarySource = _getSource(uri);
       if (serializedLibrary == null) {
         LibraryElementImpl libraryElement =
-            new LibraryElementImpl(context, '', -1, 0);
+            new LibraryElementImpl(context, session, '', -1, 0);
         libraryElement.isSynthetic = true;
         CompilationUnitElementImpl unitElement =
             new CompilationUnitElementImpl();
@@ -334,6 +339,7 @@
         libraryElement.createLoadLibraryFunction(typeProvider);
         libraryElement.publicNamespace = new Namespace({});
         libraryElement.exportNamespace = new Namespace({});
+        _resynthesizedUnits[uri] = {uri: unitElement};
         return libraryElement;
       }
       UnlinkedUnit unlinkedSummary = getUnlinkedSummary(uri);
@@ -516,7 +522,7 @@
 
 /// [UnitResynthesizerMixin] contains methods useful for implementing the
 /// [UnitResynthesizer] interface.
-abstract class UnitResynthesizerMixin implements UnitResynthesizer {
+mixin UnitResynthesizerMixin implements UnitResynthesizer {
   @override
   DartType createConstructorDefiningType(ElementImpl context,
       ReferenceInfo info, List<EntityRef> typeArgumentRefs) {
@@ -576,6 +582,9 @@
 
   @override
   ElementLocation get location => actualElement.location;
+
+  @override
+  AnalysisSession get session => enclosingElement.session;
 }
 
 /// Specialization of [LibraryResynthesizer] for resynthesis from linked
@@ -695,6 +704,7 @@
     bool hasName = unlinkedUnits[0].libraryName.isNotEmpty;
     library = new LibraryElementImpl.forSerialized(
         summaryResynthesizer.context,
+        summaryResynthesizer.session,
         unlinkedUnits[0].libraryName,
         hasName ? unlinkedUnits[0].libraryNameOffset : -1,
         unlinkedUnits[0].libraryNameLength,
@@ -1239,21 +1249,13 @@
     if (constExpr == null) {
       // Invalid constant expression.
     } else if (constExpr is Identifier) {
-      var element = constExpr.staticElement;
       ArgumentList arguments = constExpr.getProperty(ExprBuilder.ARGUMENT_LIST);
-      if (element is PropertyAccessorElement && arguments == null) {
-        elementAnnotation.element = element;
-        elementAnnotation.annotationAst = AstTestFactory.annotation(constExpr);
-      } else if (element is ConstructorElement && arguments != null) {
-        elementAnnotation.element = element;
-        elementAnnotation.annotationAst =
-            AstTestFactory.annotation2(constExpr, null, arguments);
-      } else {
-        elementAnnotation.annotationAst = AstTestFactory.annotation(
-            AstTestFactory.identifier3(r'#invalidConst'));
-      }
-    } else if (constExpr is InstanceCreationExpression) {
       elementAnnotation.element = constExpr.staticElement;
+      elementAnnotation.annotationAst =
+          AstTestFactory.annotation2(constExpr, null, arguments);
+    } else if (constExpr is InstanceCreationExpression) {
+      var element = constExpr.staticElement;
+      elementAnnotation.element = element;
       Identifier typeName = constExpr.constructorName.type.name;
       SimpleIdentifier constructorName = constExpr.constructorName.name;
       if (typeName is SimpleIdentifier && constructorName != null) {
@@ -1270,20 +1272,10 @@
       var propertyName = constExpr.propertyName;
       var propertyElement = propertyName.staticElement;
       ArgumentList arguments = constExpr.getProperty(ExprBuilder.ARGUMENT_LIST);
-      if (propertyElement is PropertyAccessorElement && arguments == null) {
-        elementAnnotation.element = propertyElement;
-        elementAnnotation.annotationAst =
-            AstTestFactory.annotation2(target, propertyName, null)
-              ..element = propertyElement;
-      } else if (propertyElement is ConstructorElement && arguments != null) {
-        elementAnnotation.element = propertyElement;
-        elementAnnotation.annotationAst =
-            AstTestFactory.annotation2(target, propertyName, arguments)
-              ..element = propertyElement;
-      } else {
-        elementAnnotation.annotationAst = AstTestFactory.annotation(
-            AstTestFactory.identifier3(r'#invalidConst'));
-      }
+      elementAnnotation.element = propertyElement;
+      elementAnnotation.annotationAst =
+          AstTestFactory.annotation2(target, propertyName, arguments)
+            ..element = propertyElement;
     } else {
       throw new StateError(
           'Unexpected annotation type: ${constExpr.runtimeType}');
@@ -1466,6 +1458,19 @@
 
   @override
   _ReferenceInfo getReferenceInfo(int index) {
+    // We don't know how to reproduce this.
+    // https://github.com/dart-lang/sdk/issues/35551
+    // https://github.com/dart-lang/sdk/issues/34534
+    // So, adding logging to gather more information.
+    if (index >= referenceInfos.length) {
+      var buffer = StringBuffer();
+      buffer.writeln('librarySource: ${unit.librarySource}');
+      buffer.writeln('unitSource: ${unit.source}');
+      buffer.writeln('unlinkedUnit: ${unlinkedUnit.toJson()}');
+      buffer.writeln('linkedUnit: ${linkedUnit.toJson()}');
+      throw StateError(buffer.toString());
+    }
+
     _ReferenceInfo result = referenceInfos[index];
     if (result == null) {
       LinkedReference linkedReference = linkedUnit.references[index];
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index ae126f3..df89a01 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -355,7 +355,7 @@
       } on StateError {
         return new UnlinkedExprBuilder()..isValidConst = false;
       }
-      return serializer.toBuilder();
+      return serializer.toBuilder(a.atSign.next, a.endToken);
     }).toList();
   }
 
@@ -486,7 +486,7 @@
     _ConstExprSerializer serializer = new _ConstExprSerializer(
         forConst, this, localClosureIndexMap, parameterNames);
     serializer.serialize(expression);
-    return serializer.toBuilder();
+    return serializer.toBuilder(expression.beginToken, expression.endToken);
   }
 
   /// Serialize a [Comment] node into an [UnlinkedDocumentationComment] object.
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index 6bb8870..0fc9762 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -58,6 +58,34 @@
   throw new StateError('Unexpected initializer type ${node.runtimeType}');
 }
 
+/// Converts all the tokens between [startToken] and [endToken] (inclusive) into
+/// a string which, when scanned, will yield the same tokens back.
+String tokensToString(Token startToken, Token endToken) {
+  var buffer = StringBuffer();
+  var token = startToken;
+  var spaceNeeded = false;
+  while (true) {
+    if (token.type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
+      buffer.write(token.lexeme);
+      buffer.write(tokensToString(token.next, token.endGroup));
+      spaceNeeded = false;
+      token = token.endGroup;
+    } else if (token.type == TokenType.STRING_INTERPOLATION_IDENTIFIER) {
+      buffer.write(token.lexeme);
+      buffer.write(token.next.lexeme);
+      spaceNeeded = false;
+      token = token.next;
+    } else {
+      if (spaceNeeded) buffer.write(' ');
+      buffer.write(token.lexeme);
+      spaceNeeded = true;
+    }
+    if (identical(token, endToken)) break;
+    token = token.next;
+  }
+  return buffer.toString();
+}
+
 /// Instances of this class keep track of intermediate state during
 /// serialization of a single constant [Expression].
 abstract class AbstractConstExprSerializer {
@@ -175,7 +203,7 @@
 
   /// Return the [UnlinkedExprBuilder] that corresponds to the state of this
   /// serializer.
-  UnlinkedExprBuilder toBuilder() {
+  UnlinkedExprBuilder toBuilder(Token startToken, Token endToken) {
     return new UnlinkedExprBuilder(
         isValidConst: isValidConst,
         operations: operations,
@@ -183,7 +211,8 @@
         ints: ints,
         doubles: doubles,
         strings: strings,
-        references: references);
+        references: references,
+        sourceRepresentation: tokensToString(startToken, endToken));
   }
 
   /// Return `true` if the given [expr] is a sequence of identifiers.
@@ -317,6 +346,8 @@
       _serializeListLiteral(expr);
     } else if (expr is MapLiteral) {
       _serializeMapLiteral(expr);
+    } else if (expr is SetLiteral) {
+      _serializeSetLiteral(expr);
     } else if (expr is MethodInvocation) {
       _serializeMethodInvocation(expr);
     } else if (expr is BinaryExpression) {
@@ -621,6 +652,23 @@
     }
   }
 
+  void _serializeSetLiteral(SetLiteral expr) {
+    if (forConst || expr.typeArguments == null) {
+      List<Expression> elements = expr.elements;
+      elements.forEach(_serialize);
+      ints.add(elements.length);
+    } else {
+      ints.add(0);
+    }
+    if (expr.typeArguments != null &&
+        expr.typeArguments.arguments.length == 1) {
+      references.add(serializeType(expr.typeArguments.arguments[0]));
+      operations.add(UnlinkedExprOperation.makeTypedSet);
+    } else {
+      operations.add(UnlinkedExprOperation.makeUntypedSet);
+    }
+  }
+
   void _serializeString(StringLiteral expr) {
     if (expr is AdjacentStrings) {
       if (expr.strings.every((string) => string is SimpleStringLiteral)) {
diff --git a/pkg/analyzer/lib/src/summary/summarize_elements.dart b/pkg/analyzer/lib/src/summary/summarize_elements.dart
index 9964703..ba4cc40 100644
--- a/pkg/analyzer/lib/src/summary/summarize_elements.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_elements.dart
@@ -26,7 +26,7 @@
    * data that was previously not summarized), this value should be incremented
    * by 1.
    */
-  static const int currentMinorVersion = 0;
+  static const int currentMinorVersion = 1;
 
   final List<String> _linkedLibraryUris = <String>[];
   final List<LinkedLibraryBuilder> _linkedLibraries = <LinkedLibraryBuilder>[];
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index 9fc486b..b3389a0 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -128,13 +128,16 @@
   InterfaceType _futureType;
   InterfaceType _intType;
   InterfaceType _iterableDynamicType;
+  InterfaceType _iterableObjectType;
   InterfaceType _iterableType;
   InterfaceType _listType;
   InterfaceType _mapType;
+  InterfaceType _mapObjectObjectType;
   DartObjectImpl _nullObject;
   InterfaceType _nullType;
   InterfaceType _numType;
   InterfaceType _objectType;
+  InterfaceType _setType;
   InterfaceType _stackTraceType;
   InterfaceType _streamDynamicType;
   InterfaceType _streamType;
@@ -233,6 +236,13 @@
   }
 
   @override
+  InterfaceType get iterableObjectType {
+    assert(_coreLibrary != null);
+    _iterableObjectType ??= iterableType.instantiate(<DartType>[objectType]);
+    return _iterableObjectType;
+  }
+
+  @override
   InterfaceType get iterableType {
     assert(_coreLibrary != null);
     _iterableType ??= _getType(_coreLibrary, "Iterable");
@@ -247,6 +257,13 @@
   }
 
   @override
+  InterfaceType get mapObjectObjectType {
+    assert(_coreLibrary != null);
+    return _mapObjectObjectType ??=
+        mapType.instantiate(<DartType>[objectType, objectType]);
+  }
+
+  @override
   InterfaceType get mapType {
     assert(_coreLibrary != null);
     _mapType ??= _getType(_coreLibrary, "Map");
@@ -283,6 +300,12 @@
   }
 
   @override
+  InterfaceType get setType {
+    assert(_coreLibrary != null);
+    return _setType ??= _getType(_coreLibrary, "Set");
+  }
+
+  @override
   InterfaceType get stackTraceType {
     assert(_coreLibrary != null);
     _stackTraceType ??= _getType(_coreLibrary, "StackTrace");
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 875a093..81198ab 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -13,6 +13,8 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/exception/exception.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/dart/ast/ast.dart'
@@ -1627,7 +1629,7 @@
     //
     if (libraryElement == null) {
       libraryElement =
-          new LibraryElementImpl.forNode(owningContext, libraryNameNode);
+          new LibraryElementImpl.forNode(owningContext, null, libraryNameNode);
       libraryElement.isSynthetic = modificationTime < 0;
       libraryElement.definingCompilationUnit = definingCompilationUnitElement;
       libraryElement.entryPoint = entryPoint;
@@ -2383,6 +2385,11 @@
    * constant.
    */
   AnalysisContext get context;
+
+  /**
+   * Return whether this constant is evaluated.
+   */
+  bool get isConstantEvaluated;
 }
 
 /**
@@ -2856,10 +2863,11 @@
     // Dart best practices.
     var inheritanceManager2 = new InheritanceManager2(context.typeSystem);
     TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
+    ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
 
     unit.accept(new BestPracticesVerifier(
         errorReporter, typeProvider, libraryElement,
-        typeSystem: typeSystem));
+        typeSystem: typeSystem, resourceProvider: resourceProvider));
     unit.accept(new OverrideVerifier(
       inheritanceManager2,
       libraryElement,
@@ -3230,7 +3238,7 @@
           "${variable.displayName} at $offset in $variableSource");
     }
     VariableDeclaration declaration =
-        node.getAncestor((AstNode ancestor) => ancestor is VariableDeclaration);
+        node.thisOrAncestorOfType<VariableDeclaration>();
     if (declaration == null || declaration.name != node) {
       Source variableSource = variable.source;
       Source unitSource =
@@ -5446,9 +5454,8 @@
     if (options.strongMode) {
       CodeChecker checker = new CodeChecker(
           typeProvider,
-          new StrongTypeSystemImpl(typeProvider,
-              implicitCasts: options.implicitCasts,
-              declarationCasts: options.declarationCasts),
+          new Dart2TypeSystem(typeProvider,
+              implicitCasts: options.implicitCasts),
           errorListener,
           options);
       checker.visitCompilationUnit(unit);
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index c1c96b6..8c56720 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -1,12 +1,15 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:collection';
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
+import 'package:analyzer/src/analysis_options/error/option_codes.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -42,6 +45,7 @@
   static const String enableSuperMixins = 'enableSuperMixins';
   static const String enablePreviewDart2 = 'enablePreviewDart2';
 
+  static const String enableExperiment = 'enable-experiment';
   static const String errors = 'errors';
   static const String exclude = 'exclude';
   static const String include = 'include';
@@ -69,6 +73,7 @@
 
   /// Supported top-level `analyzer` options.
   static const List<String> topLevel = const [
+    enableExperiment,
     errors,
     exclude,
     language,
@@ -94,6 +99,7 @@
           new TopLevelAnalyzerOptionsValidator(),
           new StrongModeOptionValueValidator(),
           new ErrorFilterOptionValidator(),
+          new EnabledExperimentsValidator(),
           new LanguageOptionValidator()
         ]);
 }
@@ -109,6 +115,45 @@
       validators.forEach((v) => v.validate(reporter, options));
 }
 
+/// Validates `analyzer` language configuration options.
+class EnabledExperimentsValidator extends OptionsValidator {
+  ErrorBuilder builder = new ErrorBuilder(AnalyzerOptions.languageOptions);
+  ErrorBuilder trueOrFalseBuilder = new TrueOrFalseValueErrorBuilder();
+
+  @override
+  void validate(ErrorReporter reporter, YamlMap options) {
+    var analyzer = getValue(options, AnalyzerOptions.analyzer);
+    if (analyzer is YamlMap) {
+      var experimentNames =
+          getValue(analyzer, AnalyzerOptions.enableExperiment);
+      if (experimentNames is YamlList) {
+        var flags =
+            experimentNames.nodes.map((node) => node.toString()).toList();
+        for (var validationResult in validateFlags(flags)) {
+          var flagIndex = validationResult.stringIndex;
+          var span = experimentNames.nodes[flagIndex].span;
+          if (validationResult is UnrecognizedFlag) {
+            reporter.reportErrorForSpan(
+                AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES,
+                span,
+                [AnalyzerOptions.enableExperiment, flags[flagIndex]]);
+          } else {
+            reporter.reportErrorForSpan(
+                AnalysisOptionsWarningCode.INVALID_OPTION,
+                span,
+                [AnalyzerOptions.enableExperiment, validationResult.message]);
+          }
+        }
+      } else if (experimentNames != null) {
+        reporter.reportErrorForSpan(
+            AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT,
+            experimentNames.span,
+            [AnalyzerOptions.enableExperiment]);
+      }
+    }
+  }
+}
+
 /// Builds error reports with value proposals.
 class ErrorBuilder {
   String proposal;
@@ -578,10 +623,24 @@
       var strongMode = getValue(analyzer, AnalyzerOptions.strong_mode);
       _applyStrongOptions(options, strongMode);
 
-      // Set filters.
+      // Process filters.
       var filters = getValue(analyzer, AnalyzerOptions.errors);
       _applyProcessors(options, filters);
 
+      // Process enabled experiments.
+      var experimentNames =
+          getValue(analyzer, AnalyzerOptions.enableExperiment);
+      if (experimentNames is YamlList) {
+        List<String> enabledExperiments = <String>[];
+        for (var element in experimentNames.nodes) {
+          String experimentName = _toString(element);
+          if (experimentName != null) {
+            enabledExperiments.add(experimentName);
+          }
+        }
+        options.enabledExperiments = enabledExperiments;
+      }
+
       // Process language options.
       var language = getValue(analyzer, AnalyzerOptions.language);
       _applyLanguageOptions(options, language);
@@ -661,9 +720,6 @@
       AnalysisOptionsImpl options, String feature, Object value) {
     bool boolValue = toBool(value);
     if (boolValue != null) {
-      if (feature == AnalyzerOptions.declarationCasts) {
-        options.declarationCasts = boolValue;
-      }
       if (feature == AnalyzerOptions.implicitCasts) {
         options.implicitCasts = boolValue;
       }
diff --git a/pkg/analyzer/lib/src/task/strong/ast_properties.dart b/pkg/analyzer/lib/src/task/strong/ast_properties.dart
index 7fd42485..d2fea4e 100644
--- a/pkg/analyzer/lib/src/task/strong/ast_properties.dart
+++ b/pkg/analyzer/lib/src/task/strong/ast_properties.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,17 +6,37 @@
 ///
 /// These properties are not public, but provided by use of back-ends such as
 /// Dart Dev Compiler.
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 
-const String _hasImplicitCasts = '_hasImplicitCasts';
-const String _implicitOperationCast = '_implicitAssignmentCast';
-const String _implicitCast = '_implicitCast';
-const String _isDynamicInvoke = '_isDynamicInvoke';
 const String _classCovariantParameters = '_classCovariantParameters';
-const String _superclassCovariantParameters = '_superclassCovariantParameters';
 const String _covariantPrivateMembers = '_covariantPrivateMembers';
+const String _hasImplicitCasts = '_hasImplicitCasts';
+const String _implicitCast = '_implicitCast';
+const String _implicitOperationCast = '_implicitAssignmentCast';
+const String _isDynamicInvoke = '_isDynamicInvoke';
+const String _superclassCovariantParameters = '_superclassCovariantParameters';
+
+/// Returns a list of parameters and method type parameters in this class
+/// declaration that need a check at runtime to ensure soundness.
+Set<Element> getClassCovariantParameters(Declaration node) {
+  return node.getProperty(_classCovariantParameters);
+}
+
+/// Gets the private setters and methods that are accessed unsafely from
+/// this compilation unit.
+///
+/// These members will require a check.
+Set<ExecutableElement> getCovariantPrivateMembers(CompilationUnit node) {
+  return node.getProperty(_covariantPrivateMembers);
+}
+
+/// If this expression has an implicit cast, returns the type it is coerced to,
+/// otherwise returns null.
+DartType getImplicitCast(Expression node) {
+  return node.getProperty<DartType>(_implicitCast);
+}
 
 /// If this expression needs an implicit cast on a subexpression that cannot be
 /// expressed anywhere else, returns the type it is coerced to.
@@ -28,10 +48,11 @@
   return node.getProperty<DartType>(_implicitOperationCast);
 }
 
-/// If this expression has an implicit cast, returns the type it is coerced to,
-/// otherwise returns null.
-DartType getImplicitCast(Expression node) {
-  return node.getProperty<DartType>(_implicitCast);
+/// Returns a list of parameters and method type parameters from mixins and
+/// superclasses of this class that need a stub method to check their type at
+/// runtime for soundness.
+Set<Element> getSuperclassCovariantParameters(Declaration node) {
+  return node.getProperty(_superclassCovariantParameters);
 }
 
 /// True if this compilation unit has any implicit casts, otherwise false.
@@ -47,59 +68,38 @@
   return node.getProperty<bool>(_isDynamicInvoke) ?? false;
 }
 
+/// Sets [getClassCovariantParameters] property for this class.
+void setClassCovariantParameters(Declaration node, Set<Element> value) {
+  node.setProperty(_classCovariantParameters, value);
+}
+
+/// Sets [getCovariantPrivateMembers] property for this compilation unit.
+void setCovariantPrivateMembers(
+    CompilationUnit node, Set<ExecutableElement> value) {
+  node.setProperty(_covariantPrivateMembers, value);
+}
+
 /// Sets [hasImplicitCasts] property for this compilation unit.
 void setHasImplicitCasts(CompilationUnit node, bool value) {
   node.setProperty(_hasImplicitCasts, value == true ? true : null);
 }
 
-/// Sets the result of [getImplicitOperationCast] for this node.
-void setImplicitOperationCast(Expression node, DartType type) {
-  node.setProperty(_implicitOperationCast, type);
-}
-
 /// Sets the result of [getImplicitCast] for this node.
 void setImplicitCast(Expression node, DartType type) {
   node.setProperty(_implicitCast, type);
 }
 
+/// Sets the result of [getImplicitOperationCast] for this node.
+void setImplicitOperationCast(Expression node, DartType type) {
+  node.setProperty(_implicitOperationCast, type);
+}
+
 /// Sets [isDynamicInvoke] property for this expression.
 void setIsDynamicInvoke(Expression node, bool value) {
   node.setProperty(_isDynamicInvoke, value == true ? true : null);
 }
 
-/// Returns a list of parameters and method type parameters in this class
-/// declaration that need a check at runtime to ensure soundness.
-Set<Element> getClassCovariantParameters(Declaration node) {
-  return node.getProperty(_classCovariantParameters);
-}
-
-/// Sets [getClassCovariantParameters] property for this class.
-void setClassCovariantParameters(Declaration node, Set<Element> value) {
-  node.setProperty(_classCovariantParameters, value);
-}
-
-/// Returns a list of parameters and method type parameters from mixins and
-/// superclasses of this class that need a stub method to check their type at
-/// runtime for soundness.
-Set<Element> getSuperclassCovariantParameters(Declaration node) {
-  return node.getProperty(_superclassCovariantParameters);
-}
-
 /// Sets [getSuperclassCovariantParameters] property for this class.
 void setSuperclassCovariantParameters(Declaration node, Set<Element> value) {
   node.setProperty(_superclassCovariantParameters, value);
 }
-
-/// Gets the private setters and methods that are accessed unsafely from
-/// this compilation unit.
-///
-/// These members will require a check.
-Set<ExecutableElement> getCovariantPrivateMembers(CompilationUnit node) {
-  return node.getProperty(_covariantPrivateMembers);
-}
-
-/// Sets [getCovariantPrivateMembers] property for this compilation unit.
-void setCovariantPrivateMembers(
-    CompilationUnit node, Set<ExecutableElement> value) {
-  node.setProperty(_covariantPrivateMembers, value);
-}
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index a830600..3583fb3 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -6,7 +6,6 @@
 // refactored to fit into analyzer.
 import 'dart:collection';
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/ast/token.dart' show TokenType;
@@ -14,7 +13,10 @@
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/source/error_processor.dart' show ErrorProcessor;
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -110,7 +112,7 @@
 
 /// Checks the body of functions and properties.
 class CodeChecker extends RecursiveAstVisitor {
-  final StrongTypeSystemImpl rules;
+  final Dart2TypeSystem rules;
   final TypeProvider typeProvider;
   final AnalysisErrorListener reporter;
   final AnalysisOptionsImpl _options;
@@ -120,7 +122,7 @@
   bool _hasImplicitCasts;
   HashSet<ExecutableElement> _covariantPrivateMembers;
 
-  CodeChecker(TypeProvider typeProvider, StrongTypeSystemImpl rules,
+  CodeChecker(TypeProvider typeProvider, Dart2TypeSystem rules,
       AnalysisErrorListener reporter, this._options)
       : typeProvider = typeProvider,
         rules = rules,
@@ -156,34 +158,17 @@
     checkForCast(expr, type);
   }
 
-  void checkDeclarationCast(Expression expr, DartType type) {
-    checkForCast(expr, type, isDeclarationCast: true);
-  }
-
-  void checkForCast(Expression expr, DartType type,
-      {bool isDeclarationCast = false}) {
-    if (expr is ParenthesizedExpression) {
-      checkForCast(expr.expression, type);
-    } else {
-      _checkImplicitCast(expr, type, isDeclarationCast: isDeclarationCast);
-    }
-  }
-
   /// Analyzer checks boolean conversions, but we need to check too, because
   /// it uses the default assignability rules that allow `dynamic` and `Object`
   /// to be assigned to bool with no message.
   void checkBoolean(Expression expr) =>
       checkAssignment(expr, typeProvider.boolType);
 
-  void _checkFunctionApplication(InvocationExpression node) {
-    var ft = _getTypeAsCaller(node);
-
-    if (_isDynamicCall(node, ft)) {
-      // If f is Function and this is a method invocation, we should have
-      // gotten an analyzer error, so no need to issue another error.
-      _recordDynamicInvoke(node, node.function);
+  void checkForCast(Expression expr, DartType type) {
+    if (expr is ParenthesizedExpression) {
+      checkForCast(expr.expression, type);
     } else {
-      checkArgumentList(node.argumentList, ft);
+      _checkImplicitCast(expr, type);
     }
   }
 
@@ -305,7 +290,6 @@
     }
   }
 
-  // Check invocations
   @override
   void visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
     var field = node.fieldName;
@@ -315,6 +299,7 @@
     node.visitChildren(this);
   }
 
+  // Check invocations
   @override
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
     // Check that defaults have the proper subtype.
@@ -391,7 +376,7 @@
         // Insert a cast from the sequence's element type to the loop variable's
         // if needed.
         _checkImplicitCast(loopVariable, _getExpressionType(loopVariable),
-            from: elementType, isDeclarationCast: true);
+            from: elementType);
       }
     }
 
@@ -517,7 +502,9 @@
   visitMethodInvocation(MethodInvocation node) {
     var target = node.realTarget;
     var element = node.methodName.staticElement;
-    if (element == null && !typeProvider.isObjectMethod(node.methodName.name)) {
+    if (element == null &&
+        !typeProvider.isObjectMethod(node.methodName.name) &&
+        node.methodName.name != FunctionElement.CALL_METHOD_NAME) {
       _recordDynamicInvoke(node, target);
 
       // Mark the tear-off as being dynamic, too. This lets us distinguish
@@ -535,7 +522,9 @@
       // we call [checkFunctionApplication].
       setIsDynamicInvoke(node.methodName, true);
     } else {
-      _checkImplicitCovarianceCast(node, target, element);
+      var invokeType = (node as MethodInvocationImpl).methodNameType;
+      _checkImplicitCovarianceCast(node, target, element,
+          invokeType is FunctionType ? invokeType : null);
       _checkFunctionApplication(node);
     }
     // Don't visit methodName, we already checked things related to the call.
@@ -630,11 +619,11 @@
   void visitVariableDeclarationList(VariableDeclarationList node) {
     TypeAnnotation type = node.type;
 
-    for (VariableDeclaration variable in node.variables) {
-      var initializer = variable.initializer;
-      if (initializer != null) {
-        if (type != null) {
-          checkDeclarationCast(initializer, type.type);
+    if (type != null) {
+      for (VariableDeclaration variable in node.variables) {
+        var initializer = variable.initializer;
+        if (initializer != null) {
+          checkForCast(initializer, type.type);
         }
       }
     }
@@ -695,13 +684,57 @@
   void _checkFieldAccess(
       AstNode node, Expression target, SimpleIdentifier field) {
     var element = field.staticElement;
-    _checkImplicitCovarianceCast(node, target, element);
+    var invokeType = element is ExecutableElement ? element.type : null;
+    _checkImplicitCovarianceCast(node, target, element, invokeType);
     if (element == null && !typeProvider.isObjectMember(field.name)) {
       _recordDynamicInvoke(node, target);
     }
     node.visitChildren(this);
   }
 
+  void _checkFunctionApplication(InvocationExpression node) {
+    var ft = _getTypeAsCaller(node);
+
+    if (_isDynamicCall(node, ft)) {
+      // If f is Function and this is a method invocation, we should have
+      // gotten an analyzer error, so no need to issue another error.
+      _recordDynamicInvoke(node, node.function);
+    } else {
+      checkArgumentList(node.argumentList, ft);
+    }
+  }
+
+  /// Given an expression [expr] of type [fromType], returns true if an implicit
+  /// downcast is required, false if it is not, or null if the types are
+  /// unrelated.
+  bool _checkFunctionTypeCasts(
+      Expression expr, FunctionType to, DartType fromType) {
+    bool callTearoff = false;
+    FunctionType from;
+    if (fromType is FunctionType) {
+      from = fromType;
+    } else if (fromType is InterfaceType) {
+      from = rules.getCallMethodType(fromType);
+      callTearoff = true;
+    }
+    if (from == null) {
+      return null; // unrelated
+    }
+
+    if (rules.isSubtypeOf(from, to)) {
+      // Sound subtype.
+      // However we may still need cast if we have a call tearoff.
+      return callTearoff;
+    }
+
+    if (rules.isSubtypeOf(to, from)) {
+      // Assignable, but needs cast.
+      return true;
+    }
+
+    return null;
+  }
+
   /// Checks if an implicit cast of [expr] from [from] type to [to] type is
   /// needed, and if so records it.
   ///
@@ -710,19 +743,99 @@
   /// If [expr] does not require an implicit cast because it is not related to
   /// [to] or is already a subtype of it, does nothing.
   void _checkImplicitCast(Expression expr, DartType to,
-      {DartType from, bool opAssign: false, bool isDeclarationCast: false}) {
+      {DartType from, bool opAssign: false}) {
     from ??= _getExpressionType(expr);
 
-    if (_needsImplicitCast(expr, to,
-            from: from, isDeclarationCast: isDeclarationCast) ==
-        true) {
+    if (_needsImplicitCast(expr, to, from: from) == true) {
       _recordImplicitCast(expr, to, from: from, opAssign: opAssign);
     }
   }
 
+  /// If we're calling into [element] through the [target], we may need to
+  /// insert a caller side check for soundness on the result of the expression
+  /// [node].  The [invokeType] is the type of the [element] in the [target].
+  ///
+  /// This happens when [target] is an unsafe covariant interface, and [element]
+  /// could return a type that is not a subtype of the expected static type
+  /// given target's type. For example:
+  ///
+  ///     typedef F<T>(T t);
+  ///     class C<T> {
+  ///       F<T> f;
+  ///       C(this.f);
+  ///     }
+  ///     test1() {
+  ///       C<Object> c = new C<int>((int x) => x + 42));
+  ///       F<Object> f = c.f; // need an implicit cast here.
+  ///       f('hello');
+  ///     }
+  ///
+  /// Here target is `c`, the target type is `C<Object>`, the member is
+  /// `get f() -> F<T>`, and the expression node is `c.f`. When we call `c.f`
+  /// the expected static result is `F<Object>`. However `c.f` actually returns
+  /// `F<int>`, which is not a subtype of `F<Object>`. So this method will add
+  /// an implicit cast `(c.f as F<Object>)` to guard against this case.
+  ///
+  /// Note that it is possible for the cast to succeed, for example:
+  /// `new C<int>((Object x) => '$x'))`. It is safe to pass any object to that
+  /// function, including an `int`.
+  void _checkImplicitCovarianceCast(Expression node, Expression target,
+      Element element, FunctionType invokeType) {
+    // If we're calling an instance method or getter, then we
+    // want to check the result type.
+    //
+    // We intentionally ignore method tear-offs, because those methods have
+    // covariance checks for their parameters inside the method.
+    var targetType = target?.staticType;
+    if (element is ExecutableElement &&
+        _isInstanceMember(element) &&
+        targetType is InterfaceType &&
+        targetType.typeArguments.isNotEmpty &&
+        !_targetHasKnownGenericTypeArguments(target)) {
+      // Track private setters/method calls. We can sometimes eliminate the
+      // parameter check in code generation, if it was never needed.
+      // This member will need a check, however, because we are calling through
+      // an unsafe target.
+      if (element.isPrivate && element.parameters.isNotEmpty) {
+        _covariantPrivateMembers
+            .add(element is ExecutableMember ? element.baseElement : element);
+      }
+
+      // Get the lower bound of the declared return type (e.g. `F<Null>`) and
+      // see if it can be assigned to the expected type (e.g. `F<Object>`).
+      //
+      // That way we can tell if any lower `T` will work or not.
+      var classType = targetType.element.type;
+      var classLowerBound = classType.instantiate(new List.filled(
+          classType.typeParameters.length, typeProvider.nullType));
+      var memberLowerBound = _lookUpMember(classLowerBound, element).type;
+      var expectedType = invokeType.returnType;
+
+      if (!rules.isSubtypeOf(memberLowerBound.returnType, expectedType)) {
+        var isMethod = element is MethodElement;
+        var isCall = node is MethodInvocation;
+
+        if (isMethod && !isCall) {
+          // If `o.m` is a method tearoff, cast to the method type.
+          setImplicitCast(node, invokeType);
+        } else if (!isMethod && isCall) {
+          // If `o.g()` is calling a field/getter `g`, we need to cast `o.g`
+          // before the call: `(o.g as expectedType)(args)`.
+          // This cannot be represented by an `as` node without changing the
+          // Dart AST structure, so we record it as a special cast.
+          setImplicitOperationCast(node, expectedType);
+        } else {
+          // For method calls `o.m()` or getters `o.g`, simply cast the result.
+          setImplicitCast(node, expectedType);
+        }
+        _hasImplicitCasts = true;
+      }
+    }
+  }
+
   void _checkReturnOrYield(Expression expression, AstNode node,
       {bool yieldStar: false}) {
-    FunctionBody body = node.getAncestor((n) => n is FunctionBody);
+    FunctionBody body = node.thisOrAncestorOfType<FunctionBody>();
     var type = _getExpectedReturnType(body, yieldStar: yieldStar);
     if (type == null) {
       // We have a type mismatch: the async/async*/sync* modifier does
@@ -777,144 +890,6 @@
     }
   }
 
-  DartType _getExpressionType(Expression expr) =>
-      getExpressionType(expr, rules, typeProvider);
-
-  /// If we're calling into [member] through the [target], we may need to
-  /// insert a caller side check for soundness on the result of the expression
-  /// [node].
-  ///
-  /// This happens when [target] is an unsafe covariant interface, and [member]
-  /// could return a type that is not a subtype of the expected static type
-  /// given target's type. For example:
-  ///
-  ///     typedef F<T>(T t);
-  ///     class C<T> {
-  ///       F<T> f;
-  ///       C(this.f);
-  ///     }
-  ///     test1() {
-  ///       C<Object> c = new C<int>((int x) => x + 42));
-  ///       F<Object> f = c.f; // need an implicit cast here.
-  ///       f('hello');
-  ///     }
-  ///
-  /// Here target is `c`, the target type is `C<Object>`, the member is
-  /// `get f() -> F<T>`, and the expression node is `c.f`. When we call `c.f`
-  /// the expected static result is `F<Object>`. However `c.f` actually returns
-  /// `F<int>`, which is not a subtype of `F<Object>`. So this method will add
-  /// an implicit cast `(c.f as F<Object>)` to guard against this case.
-  ///
-  /// Note that it is possible for the cast to succeed, for example:
-  /// `new C<int>((Object x) => '$x'))`. It is safe to pass any object to that
-  /// function, including an `int`.
-  void _checkImplicitCovarianceCast(
-      Expression node, Expression target, Element member) {
-    // If we're calling an instance method or getter, then we
-    // want to check the result type.
-    //
-    // We intentionally ignore method tear-offs, because those methods have
-    // covariance checks for their parameters inside the method.
-    var targetType = target?.staticType;
-    if (member is ExecutableElement &&
-        _isInstanceMember(member) &&
-        targetType is InterfaceType &&
-        targetType.typeArguments.isNotEmpty &&
-        !_targetHasKnownGenericTypeArguments(target)) {
-      // Track private setters/method calls. We can sometimes eliminate the
-      // parameter check in code generation, if it was never needed.
-      // This member will need a check, however, because we are calling through
-      // an unsafe target.
-      if (member.isPrivate && member.parameters.isNotEmpty) {
-        _covariantPrivateMembers
-            .add(member is ExecutableMember ? member.baseElement : member);
-      }
-
-      // Get the lower bound of the declared return type (e.g. `F<Null>`) and
-      // see if it can be assigned to the expected type (e.g. `F<Object>`).
-      //
-      // That way we can tell if any lower `T` will work or not.
-      var classType = targetType.element.type;
-      var classLowerBound = classType.instantiate(new List.filled(
-          classType.typeParameters.length, typeProvider.nullType));
-      var memberLowerBound = _lookUpMember(classLowerBound, member).type;
-      var expectedType = member.returnType;
-
-      if (!rules.isSubtypeOf(memberLowerBound.returnType, expectedType)) {
-        var isMethod = member is MethodElement;
-        var isCall = node is MethodInvocation;
-
-        if (isMethod && !isCall) {
-          // If `o.m` is a method tearoff, cast to the method type.
-          setImplicitCast(node, member.type);
-        } else if (!isMethod && isCall) {
-          // If `o.g()` is calling a field/getter `g`, we need to cast `o.g`
-          // before the call: `(o.g as expectedType)(args)`.
-          // This cannot be represented by an `as` node without changing the
-          // Dart AST structure, so we record it as a special cast.
-          setImplicitOperationCast(node, expectedType);
-        } else {
-          // For method calls `o.m()` or getters `o.g`, simply cast the result.
-          setImplicitCast(node, expectedType);
-        }
-        _hasImplicitCasts = true;
-      }
-    }
-  }
-
-  /// Returns true if we can safely skip the covariance checks because [target]
-  /// has known type arguments, such as `this` `super` or a non-factory `new`.
-  ///
-  /// For example:
-  ///
-  ///     class C<T> {
-  ///       T _t;
-  ///     }
-  ///     class D<T> extends C<T> {
-  ///        method<S extends T>(T t, C<T> c) {
-  ///          // implicit cast: t as T;
-  ///          // implicit cast: c as C<T>;
-  ///
-  ///          // These do not need further checks. The type parameter `T` for
-  ///          // `this` must be the same as our `T`
-  ///          this._t = t;
-  ///          super._t = t;
-  ///          new C<T>()._t = t; // non-factory
-  ///
-  ///          // This needs further checks. The type of `c` could be `C<S>` for
-  ///          // some `S <: T`.
-  ///          c._t = t;
-  ///          // factory statically returns `C<T>`, dynamically returns `C<S>`.
-  ///          new F<T, S>()._t = t;
-  ///        }
-  ///     }
-  ///     class F<T, S extends T> extends C<T> {
-  ///       factory F() => new C<S>();
-  ///     }
-  ///
-  bool _targetHasKnownGenericTypeArguments(Expression target) {
-    return target == null || // implicit this
-        target is ThisExpression ||
-        target is SuperExpression ||
-        target is InstanceCreationExpression &&
-            target.staticElement?.isFactory == false;
-  }
-
-  bool _isInstanceMember(ExecutableElement e) =>
-      !e.isStatic &&
-      (e is MethodElement ||
-          e is PropertyAccessorElement && e.variable is FieldElement);
-
-  ExecutableElement _lookUpMember(InterfaceType type, ExecutableElement e) {
-    var name = e.name;
-    var library = e.library;
-    return e is PropertyAccessorElement
-        ? (e.isGetter
-            ? type.lookUpInheritedGetter(name, library: library)
-            : type.lookUpInheritedSetter(name, library: library))
-        : type.lookUpInheritedMethod(name, library: library);
-  }
-
   /// Gets the expected return type of the given function [body], either from
   /// a normal return/yield, or from a yield*.
   DartType _getExpectedReturnType(FunctionBody body, {bool yieldStar: false}) {
@@ -971,6 +946,9 @@
     }
   }
 
+  DartType _getExpressionType(Expression expr) =>
+      getExpressionType(expr, rules, typeProvider);
+
   /// Given an expression, return its type assuming it is
   /// in the caller position of a call (that is, accounting
   /// for the possibility of a call method).  Returns null
@@ -991,35 +969,28 @@
     return ft == null;
   }
 
-  /// Given an expression [expr] of type [fromType], returns true if an implicit
-  /// downcast is required, false if it is not, or null if the types are
-  /// unrelated.
-  bool _checkFunctionTypeCasts(
-      Expression expr, FunctionType to, DartType fromType) {
-    bool callTearoff = false;
-    FunctionType from;
-    if (fromType is FunctionType) {
-      from = fromType;
-    } else if (fromType is InterfaceType) {
-      from = rules.getCallMethodType(fromType);
-      callTearoff = true;
-    }
-    if (from == null) {
-      return null; // unrelated
-    }
+  bool _isInstanceMember(ExecutableElement e) =>
+      !e.isStatic &&
+      (e is MethodElement ||
+          e is PropertyAccessorElement && e.variable is FieldElement);
 
-    if (rules.isSubtypeOf(from, to)) {
-      // Sound subtype.
-      // However we may still need cast if we have a call tearoff.
-      return callTearoff;
-    }
+  ExecutableElement _lookUpMember(InterfaceType type, ExecutableElement e) {
+    var name = e.name;
+    var library = e.library;
+    return e is PropertyAccessorElement
+        ? (e.isGetter
+            ? type.lookUpInheritedGetter(name, library: library)
+            : type.lookUpInheritedSetter(name, library: library))
+        : type.lookUpInheritedMethod(name, library: library);
+  }
 
-    if (rules.isSubtypeOf(to, from)) {
-      // Assignable, but needs cast.
-      return true;
+  void _markImplicitCast(Expression expr, DartType to, {bool opAssign: false}) {
+    if (opAssign) {
+      setImplicitOperationCast(expr, to);
+    } else {
+      setImplicitCast(expr, to);
     }
-
-    return null;
+    _hasImplicitCasts = true;
   }
 
   /// Returns true if we need an implicit cast of [expr] from [from] type to
@@ -1029,8 +1000,7 @@
   /// downcast implicitly).
   ///
   /// If [from] is omitted, uses the static type of [expr]
-  bool _needsImplicitCast(Expression expr, DartType to,
-      {DartType from, bool isDeclarationCast: false}) {
+  bool _needsImplicitCast(Expression expr, DartType to, {DartType from}) {
     from ??= _getExpressionType(expr);
 
     // Void is considered Top, but may only be *explicitly* cast.
@@ -1047,7 +1017,7 @@
     }
 
     // Down cast or legal sideways cast, coercion needed.
-    if (rules.isAssignableTo(from, to, isDeclarationCast: isDeclarationCast)) {
+    if (rules.isAssignableTo(from, to)) {
       return true;
     }
 
@@ -1074,15 +1044,6 @@
     if (target != null) setIsDynamicInvoke(target, true);
   }
 
-  void _markImplicitCast(Expression expr, DartType to, {bool opAssign: false}) {
-    if (opAssign) {
-      setImplicitOperationCast(expr, to);
-    } else {
-      setImplicitCast(expr, to);
-    }
-    _hasImplicitCasts = true;
-  }
-
   /// Records an implicit cast for the [expr] from [from] to [to].
   ///
   /// This will emit the appropriate error/warning/hint message as well as mark
@@ -1109,6 +1070,9 @@
       } else if (expr is MapLiteral) {
         _recordMessage(
             expr, StrongModeCode.INVALID_CAST_LITERAL_MAP, [from, to]);
+      } else if (expr is SetLiteral) {
+        _recordMessage(
+            expr, StrongModeCode.INVALID_CAST_LITERAL_SET, [from, to]);
       } else {
         _recordMessage(
             expr, StrongModeCode.INVALID_CAST_LITERAL, [expr, from, to]);
@@ -1207,6 +1171,44 @@
     }
   }
 
+  /// Returns true if we can safely skip the covariance checks because [target]
+  /// has known type arguments, such as `this` `super` or a non-factory `new`.
+  ///
+  /// For example:
+  ///
+  ///     class C<T> {
+  ///       T _t;
+  ///     }
+  ///     class D<T> extends C<T> {
+  ///        method<S extends T>(T t, C<T> c) {
+  ///          // implicit cast: t as T;
+  ///          // implicit cast: c as C<T>;
+  ///
+  ///          // These do not need further checks. The type parameter `T` for
+  ///          // `this` must be the same as our `T`
+  ///          this._t = t;
+  ///          super._t = t;
+  ///          new C<T>()._t = t; // non-factory
+  ///
+  ///          // This needs further checks. The type of `c` could be `C<S>` for
+  ///          // some `S <: T`.
+  ///          c._t = t;
+  ///          // factory statically returns `C<T>`, dynamically returns `C<S>`.
+  ///          new F<T, S>()._t = t;
+  ///        }
+  ///     }
+  ///     class F<T, S extends T> extends C<T> {
+  ///       factory F() => new C<S>();
+  ///     }
+  ///
+  bool _targetHasKnownGenericTypeArguments(Expression target) {
+    return target == null || // implicit this
+        target is ThisExpression ||
+        target is SuperExpression ||
+        target is InstanceCreationExpression &&
+            target.staticElement?.isFactory == false;
+  }
+
   void _validateTopLevelInitializer(String name, Expression n) {
     n.accept(new _TopLevelInitializerValidator(this, name));
   }
@@ -1216,7 +1218,7 @@
 /// check overrides between classes and superclasses, interfaces, and mixin
 /// applications.
 class _OverrideChecker {
-  final StrongTypeSystemImpl rules;
+  final Dart2TypeSystem rules;
 
   _OverrideChecker(CodeChecker checker) : rules = checker.rules;
 
@@ -1229,6 +1231,36 @@
     _checkForCovariantGenerics(node, element);
   }
 
+  /// Visits each member on the class [node] and calls [checkMember] with the
+  /// corresponding instance element and AST node (for error reporting).
+  ///
+  /// See also [_checkTypeMembers], which is used when the class AST node is not
+  /// available.
+  void _checkClassMembers(Declaration node,
+      void checkMember(ExecutableElement member, ClassMember location)) {
+    for (var member in _classMembers(node)) {
+      if (member is FieldDeclaration) {
+        if (member.isStatic) {
+          continue;
+        }
+        for (var variable in member.fields.variables) {
+          var element = variable.declaredElement as PropertyInducingElement;
+          checkMember(element.getter, member);
+          if (!variable.isFinal && !variable.isConst) {
+            checkMember(element.setter, member);
+          }
+        }
+      } else if (member is MethodDeclaration) {
+        if (member.isStatic) {
+          continue;
+        }
+        checkMember(member.declaredElement, member);
+      } else {
+        assert(member is ConstructorDeclaration);
+      }
+    }
+  }
+
   /// Finds implicit casts that we need on parameters and type formals to
   /// ensure soundness of covariant generics, and records them on the [node].
   ///
@@ -1273,86 +1305,24 @@
     setSuperclassCovariantParameters(node, checks);
   }
 
-  /// For each member of this class and non-overridden inherited member, we
-  /// check to see if any generic super interface permits an unsound call to the
-  /// concrete member. For example:
+  /// Visits the [type] and calls [checkMember] for each instance member.
   ///
-  /// We must check non-overridden inherited members because this class could
-  /// contain a new interface that permits unsound access to that member. In
-  /// those cases, the class is expected to insert stub that checks the type
-  /// before calling `super`. For example:
-  ///
-  ///     class C<T> {
-  ///       add(T t) {}
-  ///     }
-  ///     class D {
-  ///       add(int t) {}
-  ///     }
-  ///     class E extends D implements C<int> {
-  ///       // C<Object>.add is unsafe, and D.m is marked for a check.
-  ///       //
-  ///       // one way to implement this is to generate a stub method:
-  ///       // add(t) => super.add(t as int);
-  ///     }
-  ///
-  Set<Element> _findSuperclassCovariantChecks(ClassElement element,
-      Set<ClassElement> allCovariant, HashSet<String> seenConcreteMembers) {
-    var visited = new HashSet<ClassElement>()..add(element);
-    var superChecks = _createCovariantCheckSet();
-    var existingChecks = _createCovariantCheckSet();
-
-    void visitImmediateSuper(InterfaceType type) {
-      // For members of mixins/supertypes, check them against new interfaces,
-      // and also record any existing checks they already had.
-      var oldCovariant = _findAllGenericInterfaces(type);
-      var newCovariant = allCovariant.difference(oldCovariant);
-      if (newCovariant.isEmpty) return;
-
-      void visitSuper(InterfaceType type) {
-        var element = type.element;
-        if (visited.add(element)) {
-          var members = _getConcreteMembers(type, seenConcreteMembers);
-          _findCovariantChecks(members, newCovariant, superChecks);
-          _findCovariantChecks(members, oldCovariant, existingChecks);
-          element.mixins.reversed.forEach(visitSuper);
-          var s = element.supertype;
-          if (s != null) visitSuper(s);
-        }
-      }
-
-      visitSuper(type);
+  /// See also [_checkClassMembers], which should be used when the class AST
+  /// node is available to allow for better error locations
+  void _checkTypeMembers(
+      InterfaceType type, void checkMember(ExecutableElement member)) {
+    void checkHelper(ExecutableElement e) {
+      if (!e.isStatic) checkMember(e);
     }
 
-    element.mixins.reversed.forEach(visitImmediateSuper);
-    var s = element.supertype;
-    if (s != null) visitImmediateSuper(s);
-
-    superChecks.removeAll(existingChecks);
-    return superChecks;
+    type.methods.forEach(checkHelper);
+    type.accessors.forEach(checkHelper);
   }
 
-  /// Gets all concrete instance members declared on this type, skipping already
-  /// [seenConcreteMembers] and adding any found ones to it.
-  ///
-  /// By tracking the set of seen members, we can visit superclasses and mixins
-  /// and ultimately collect every most-derived member exposed by a given type.
-  static List<ExecutableElement> _getConcreteMembers(
-      InterfaceType type, HashSet<String> seenConcreteMembers) {
-    var members = <ExecutableElement>[];
-    for (var declaredMembers in [type.accessors, type.methods]) {
-      for (var member in declaredMembers) {
-        // We only visit each most derived concrete member.
-        // To avoid visiting an overridden superclass member, we skip members
-        // we've seen, and visit starting from the class, then mixins in
-        // reverse order, then superclasses.
-        if (!member.isStatic &&
-            !member.isAbstract &&
-            seenConcreteMembers.add(member.name)) {
-          members.add(member);
-        }
-      }
-    }
-    return members;
+  /// If node is a [ClassDeclaration] returns its members, otherwise if node is
+  /// a [ClassTypeAlias] this returns an empty list.
+  Iterable<ClassMember> _classMembers(Declaration node) {
+    return node is ClassDeclaration ? node.members : [];
   }
 
   /// Find all covariance checks on parameters/type parameters needed for
@@ -1453,6 +1423,64 @@
     });
   }
 
+  /// For each member of this class and non-overridden inherited member, we
+  /// check to see if any generic super interface permits an unsound call to the
+  /// concrete member. For example:
+  ///
+  /// We must check non-overridden inherited members because this class could
+  /// contain a new interface that permits unsound access to that member. In
+  /// those cases, the class is expected to insert stub that checks the type
+  /// before calling `super`. For example:
+  ///
+  ///     class C<T> {
+  ///       add(T t) {}
+  ///     }
+  ///     class D {
+  ///       add(int t) {}
+  ///     }
+  ///     class E extends D implements C<int> {
+  ///       // C<Object>.add is unsafe, and D.m is marked for a check.
+  ///       //
+  ///       // one way to implement this is to generate a stub method:
+  ///       // add(t) => super.add(t as int);
+  ///     }
+  ///
+  Set<Element> _findSuperclassCovariantChecks(ClassElement element,
+      Set<ClassElement> allCovariant, HashSet<String> seenConcreteMembers) {
+    var visited = new HashSet<ClassElement>()..add(element);
+    var superChecks = _createCovariantCheckSet();
+    var existingChecks = _createCovariantCheckSet();
+
+    void visitImmediateSuper(InterfaceType type) {
+      // For members of mixins/supertypes, check them against new interfaces,
+      // and also record any existing checks they already had.
+      var oldCovariant = _findAllGenericInterfaces(type);
+      var newCovariant = allCovariant.difference(oldCovariant);
+      if (newCovariant.isEmpty) return;
+
+      void visitSuper(InterfaceType type) {
+        var element = type.element;
+        if (visited.add(element)) {
+          var members = _getConcreteMembers(type, seenConcreteMembers);
+          _findCovariantChecks(members, newCovariant, superChecks);
+          _findCovariantChecks(members, oldCovariant, existingChecks);
+          element.mixins.reversed.forEach(visitSuper);
+          var s = element.supertype;
+          if (s != null) visitSuper(s);
+        }
+      }
+
+      visitSuper(type);
+    }
+
+    element.mixins.reversed.forEach(visitImmediateSuper);
+    var s = element.supertype;
+    if (s != null) visitImmediateSuper(s);
+
+    superChecks.removeAll(existingChecks);
+    return superChecks;
+  }
+
   static Set<Element> _createCovariantCheckSet() {
     return new LinkedHashSet(
         equals: _equalMemberElements, hashCode: _hashCodeMemberElements);
@@ -1468,11 +1496,6 @@
     return x == y;
   }
 
-  static int _hashCodeMemberElements(Element x) {
-    x = x is Member ? x.baseElement : x;
-    return x.hashCode;
-  }
-
   /// Find all generic interfaces that are implemented by [type], including
   /// [type] itself if it is generic.
   ///
@@ -1503,58 +1526,37 @@
     return genericSupertypes;
   }
 
-  /// Visits each member on the class [node] and calls [checkMember] with the
-  /// corresponding instance element and AST node (for error reporting).
+  /// Gets all concrete instance members declared on this type, skipping already
+  /// [seenConcreteMembers] and adding any found ones to it.
   ///
-  /// See also [_checkTypeMembers], which is used when the class AST node is not
-  /// available.
-  void _checkClassMembers(Declaration node,
-      void checkMember(ExecutableElement member, ClassMember location)) {
-    for (var member in _classMembers(node)) {
-      if (member is FieldDeclaration) {
-        if (member.isStatic) {
-          continue;
+  /// By tracking the set of seen members, we can visit superclasses and mixins
+  /// and ultimately collect every most-derived member exposed by a given type.
+  static List<ExecutableElement> _getConcreteMembers(
+      InterfaceType type, HashSet<String> seenConcreteMembers) {
+    var members = <ExecutableElement>[];
+    for (var declaredMembers in [type.accessors, type.methods]) {
+      for (var member in declaredMembers) {
+        // We only visit each most derived concrete member.
+        // To avoid visiting an overridden superclass member, we skip members
+        // we've seen, and visit starting from the class, then mixins in
+        // reverse order, then superclasses.
+        if (!member.isStatic &&
+            !member.isAbstract &&
+            seenConcreteMembers.add(member.name)) {
+          members.add(member);
         }
-        for (var variable in member.fields.variables) {
-          var element = variable.declaredElement as PropertyInducingElement;
-          checkMember(element.getter, member);
-          if (!variable.isFinal && !variable.isConst) {
-            checkMember(element.setter, member);
-          }
-        }
-      } else if (member is MethodDeclaration) {
-        if (member.isStatic) {
-          continue;
-        }
-        checkMember(member.declaredElement, member);
-      } else {
-        assert(member is ConstructorDeclaration);
       }
     }
+    return members;
   }
 
-  /// Visits the [type] and calls [checkMember] for each instance member.
-  ///
-  /// See also [_checkClassMembers], which should be used when the class AST
-  /// node is available to allow for better error locations
-  void _checkTypeMembers(
-      InterfaceType type, void checkMember(ExecutableElement member)) {
-    void checkHelper(ExecutableElement e) {
-      if (!e.isStatic) checkMember(e);
-    }
-
-    type.methods.forEach(checkHelper);
-    type.accessors.forEach(checkHelper);
-  }
-
-  /// If node is a [ClassDeclaration] returns its members, otherwise if node is
-  /// a [ClassTypeAlias] this returns an empty list.
-  Iterable<ClassMember> _classMembers(Declaration node) {
-    return node is ClassDeclaration ? node.members : [];
+  static int _hashCodeMemberElements(Element x) {
+    x = x is Member ? x.baseElement : x;
+    return x.hashCode;
   }
 }
 
-class _TopLevelInitializerValidator extends RecursiveAstVisitor<Null> {
+class _TopLevelInitializerValidator extends RecursiveAstVisitor<void> {
   final CodeChecker _codeChecker;
   final String _name;
 
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
new file mode 100644
index 0000000..b68d13e
--- /dev/null
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -0,0 +1,680 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/context/cache.dart';
+import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
+import 'package:analyzer/src/summary/summary_file_builder.dart';
+import 'package:meta/meta.dart';
+
+const String librariesContent = r'''
+const Map<String, LibraryInfo> libraries = const {
+  "async": const LibraryInfo("async/async.dart"),
+  "collection": const LibraryInfo("collection/collection.dart"),
+  "convert": const LibraryInfo("convert/convert.dart"),
+  "core": const LibraryInfo("core/core.dart"),
+  "html": const LibraryInfo(
+    "html/dartium/html_dartium.dart",
+    dart2jsPath: "html/dart2js/html_dart2js.dart"),
+  "math": const LibraryInfo("math/math.dart"),
+  "_foreign_helper": const LibraryInfo("_internal/js_runtime/lib/foreign_helper.dart"),
+};
+''';
+
+const String sdkRoot = '/sdk';
+
+const _MockSdkLibrary _LIB_ASYNC =
+    const _MockSdkLibrary('dart:async', '$sdkRoot/lib/async/async.dart', '''
+library dart.async;
+
+import 'dart:math';
+
+part 'stream.dart';
+
+class Future<T> {
+  factory Future(computation()) => null;
+  factory Future.delayed(Duration duration, [T computation()]) => null;
+  factory Future.microtask(FutureOr<T> computation()) => null;
+  factory Future.value([FutureOr<T> result]) => null;
+
+  Future<R> then<R>(FutureOr<R> onValue(T value)) => null;
+  Future<T> whenComplete(action());
+  
+  static Future<List<T>> wait<T>(Iterable<Future<T>> futures) => null;
+}
+
+class FutureOr<T> {}
+
+abstract class Completer<T> {
+  factory Completer() => null;
+  factory Completer.sync() => null;
+  Future<T> get future;
+  void complete([value]);
+  void completeError(Object error, [StackTrace stackTrace]);
+  bool get isCompleted;
+}
+
+abstract class Timer {
+  static void run(void callback()) {}
+}
+''', const <String, String>{
+  '$sdkRoot/lib/async/stream.dart': r'''
+part of dart.async;
+abstract class Stream<T> {
+  Future<T> get first;
+  StreamSubscription<T> listen(void onData(T event),
+                               { Function onError,
+                                 void onDone(),
+                                 bool cancelOnError});
+  Stream();
+  factory Stream.fromIterable(Iterable<T> data) => null;
+}
+
+abstract class StreamIterator<T> {}
+
+abstract class StreamSubscription<T> {
+  Future cancel();
+  void onData(void handleData(T data));
+  void onError(Function handleError);
+  void onDone(void handleDone());
+  void pause([Future resumeSignal]);
+  void resume();
+  bool get isPaused;
+  Future<E> asFuture<E>([E futureValue]);
+}
+
+abstract class StreamTransformer<S, T> {}
+'''
+});
+
+const _MockSdkLibrary _LIB_ASYNC2 =
+    const _MockSdkLibrary('dart:async2', '$sdkRoot/lib/async2/async2.dart', '''
+library dart.async2;
+
+class Future {}
+''');
+
+const _MockSdkLibrary _LIB_COLLECTION = const _MockSdkLibrary(
+    'dart:collection', '$sdkRoot/lib/collection/collection.dart', '''
+library dart.collection;
+
+abstract class HashMap<K, V> implements Map<K, V> {}
+abstract class LinkedHashMap<K, V> implements Map<K, V> {}
+abstract class HashSet<E> implements Set<E> {}
+abstract class LinkedHashSet<E> implements Set<E> {}
+''');
+
+const _MockSdkLibrary _LIB_CONVERT = const _MockSdkLibrary(
+    'dart:convert', '$sdkRoot/lib/convert/convert.dart', '''
+library dart.convert;
+
+import 'dart:async';
+
+abstract class Converter<S, T> implements StreamTransformer {}
+class JsonDecoder extends Converter<String, Object> {}
+''');
+
+const _MockSdkLibrary _LIB_CORE =
+    const _MockSdkLibrary('dart:core', '$sdkRoot/lib/core/core.dart', '''
+library dart.core;
+
+import 'dart:async'; // ignore: unused_import
+
+export 'dart:async' show Future, Stream;
+
+const deprecated = const Deprecated("next release");
+
+const override = const _Override();
+
+const proxy = const _Proxy();
+
+external bool identical(Object a, Object b);
+
+void print(Object object) {}
+
+class bool extends Object {
+  external const factory bool.fromEnvironment(String name,
+      {bool defaultValue: false});
+}
+
+abstract class Comparable<T> {
+  int compareTo(T other);
+}
+
+class DateTime extends Object {}
+
+class Deprecated extends Object {
+  final String expires;
+  const Deprecated(this.expires);
+}
+
+class pragma {
+  final String name;
+  final Object options;
+  const pragma(this.name, [this.options]);
+}
+
+abstract class double extends num {
+  static const double NAN = 0.0 / 0.0;
+  static const double INFINITY = 1.0 / 0.0;
+  static const double NEGATIVE_INFINITY = -INFINITY;
+  static const double MIN_POSITIVE = 5e-324;
+  static const double MAX_FINITE = 1.7976931348623157e+308;
+
+  double get sign;
+  double operator %(num other);
+  double operator *(num other);
+  double operator +(num other);
+  double operator -(num other);
+  double operator -();
+  double operator /(num other);
+  double abs();
+  int ceil();
+  double ceilToDouble();
+  int floor();
+  double floorToDouble();
+  double remainder(num other);
+  int round();
+  double roundToDouble();
+  int truncate();
+  double truncateToDouble();
+  int operator ~/(num other);
+  external static double parse(String source, [double onError(String source)]);
+}
+
+class Duration implements Comparable<Duration> {}
+
+class Exception {
+  factory Exception([var message]) => null;
+}
+
+class Function {}
+
+abstract class int extends num {
+  external const factory int.fromEnvironment(String name, {int defaultValue});
+
+  bool get isEven => false;
+  bool get isNegative;
+
+  int operator &(int other);
+  int operator -();
+  int operator <<(int shiftAmount);
+  int operator >>(int shiftAmount);
+  int operator ^(int other);
+  String toString();
+
+  int operator |(int other);
+
+  int operator ~();
+
+  external static int parse(String source,
+      {int radix, int onError(String source)});
+}
+
+abstract class Invocation {}
+
+abstract class Iterable<E> {
+  E get first;
+  bool get isEmpty;
+  Iterator<E> get iterator;
+  int get length;
+
+  Iterable<T> expand<T>(Iterable<T> f(E element));
+
+  R fold<R>(R initialValue, R combine(R previousValue, E element)) => null;
+
+  void forEach(void f(E element));
+
+  Iterable<R> map<R>(R f(E e));
+
+  List<E> toList();
+
+  Iterable<E> where(bool test(E element));
+}
+
+abstract class Iterator<E> {
+  E get current;
+  bool moveNext();
+}
+
+class List<E> implements Iterable<E> {
+  List([int length]);
+  factory List.from(Iterable elements, {bool growable: true}) => null;
+
+  E get last => null;
+  E operator [](int index) => null;
+  void operator []=(int index, E value) {}
+
+  void add(E value) {}
+  void addAll(Iterable<E> iterable) {}
+  void clear() {}
+
+  noSuchMethod(Invocation invocation) => null;
+}
+
+class Map<K, V> {
+  Iterable<K> get keys => null;
+  int get length => 0;
+  Iterable<V> get values => null;
+  V operator [](K key) => null;
+  void operator []=(K key, V value) {}
+  Map<RK, RV> cast<RK, RV>() => null;
+  bool containsKey(Object key) => false;
+}
+
+class Null extends Object {
+  factory Null._uninstantiable() => null;
+}
+
+abstract class num implements Comparable<num> {
+  num operator %(num other);
+  num operator *(num other);
+  num operator +(num other);
+  num operator -(num other);
+  num operator -();
+  double operator /(num other);
+  bool operator <(num other);
+  int operator <<(int other);
+  bool operator <=(num other);
+  bool operator ==(Object other);
+  bool operator >(num other);
+  bool operator >=(num other);
+  int operator >>(int other);
+  int operator ^(int other);
+  num abs();
+  int round();
+  double toDouble();
+  int toInt();
+  int operator |(int other);
+  int operator ~();
+  int operator ~/(num other);
+}
+
+class Object {
+  const Object();
+  int get hashCode => 0;
+  Type get runtimeType => null;
+  bool operator ==(other) => identical(this, other);
+  dynamic noSuchMethod(Invocation invocation) => null;
+  String toString() => 'a string';
+}
+
+abstract class Pattern {}
+
+abstract class RegExp implements Pattern {
+  external factory RegExp(String source);
+}
+
+abstract class Set<E> implements Iterable<E> {
+  Set<R> cast<R>();
+}
+
+class StackTrace {}
+
+abstract class String implements Comparable<String>, Pattern {
+  external factory String.fromCharCodes(Iterable<int> charCodes,
+      [int start = 0, int end]);
+  List<int> get codeUnits;
+  bool get isEmpty => false;
+  bool get isNotEmpty => false;
+  int get length => 0;
+  String operator +(String other) => null;
+  bool operator ==(Object other);
+  int codeUnitAt(int index);
+  String substring(int len) => null;
+  String toLowerCase();
+  String toUpperCase();
+}
+
+class Symbol {
+  const factory Symbol(String name) = _SymbolImpl;
+}
+
+class Type {}
+
+class Uri {
+  static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
+    return null;
+  }
+}
+
+class _Override {
+  const _Override();
+}
+
+class _Proxy {
+  const _Proxy();
+}
+
+class _SymbolImpl {
+  const _SymbolImpl(String name);
+}
+''');
+
+const _MockSdkLibrary _LIB_FOREIGN_HELPER = const _MockSdkLibrary(
+    'dart:_foreign_helper',
+    '$sdkRoot/lib/_foreign_helper/_foreign_helper.dart', '''
+library dart._foreign_helper;
+
+JS(String typeDescription, String codeTemplate,
+  [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11])
+{}
+''');
+
+const _MockSdkLibrary _LIB_HTML_DART2JS = const _MockSdkLibrary(
+    'dart:html', '$sdkRoot/lib/html/dart2js/html_dart2js.dart', '''
+library dart.html;
+class HtmlElement {}
+''');
+
+const _MockSdkLibrary _LIB_HTML_DARTIUM = const _MockSdkLibrary(
+    'dart:html', '$sdkRoot/lib/html/dartium/html_dartium.dart', '''
+library dart.dom.html;
+
+final HtmlDocument document;
+
+abstract class Element {}
+
+abstract class HtmlDocument {
+  Element query(String relativeSelectors) => null;
+}
+
+abstract class HtmlElement extends Element {}
+
+abstract class AnchorElement extends HtmlElement {}
+abstract class BodyElement extends HtmlElement {}
+abstract class ButtonElement extends HtmlElement {}
+abstract class DivElement extends HtmlElement {}
+abstract class InputElement extends HtmlElement {}
+abstract class SelectElement extends HtmlElement {}
+
+
+abstract class CanvasElement extends HtmlElement {
+  Object getContext(String contextId, [Map attributes]);
+  CanvasRenderingContext2D get context2D;
+}
+
+abstract class CanvasRenderingContext2D {}
+
+Element query(String relativeSelectors) => null;
+''');
+
+const _MockSdkLibrary _LIB_INTERCEPTORS = const _MockSdkLibrary(
+    'dart:_interceptors',
+    '$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart', '''
+library dart._interceptors;
+''');
+
+const _MockSdkLibrary _LIB_INTERNAL = const _MockSdkLibrary(
+    'dart:_internal', '$sdkRoot/lib/_internal/internal.dart', '''
+library dart._internal;
+class Symbol {}
+class ExternalName {
+  final String name;
+  const ExternalName(this.name);
+}
+''');
+
+const _MockSdkLibrary _LIB_MATH =
+    const _MockSdkLibrary('dart:math', '$sdkRoot/lib/math/math.dart', '''
+library dart.math;
+
+const double E = 2.718281828459045;
+const double PI = 3.1415926535897932;
+const double LN10 =  2.302585092994046;
+
+T min<T extends num>(T a, T b) => null;
+T max<T extends num>(T a, T b) => null;
+
+external double cos(num radians);
+external double sin(num radians);
+external double sqrt(num radians);
+class Random {
+  bool nextBool() => true;
+  double nextDouble() => 2.0;
+  int nextInt() => 1;
+}
+''');
+
+const List<SdkLibrary> _LIBRARIES = const [
+  _LIB_CORE,
+  _LIB_ASYNC,
+  _LIB_ASYNC2,
+  _LIB_COLLECTION,
+  _LIB_CONVERT,
+  _LIB_FOREIGN_HELPER,
+  _LIB_MATH,
+  _LIB_HTML_DART2JS,
+  _LIB_HTML_DARTIUM,
+  _LIB_INTERCEPTORS,
+  _LIB_INTERNAL,
+];
+
+class MockSdk implements DartSdk {
+  static const Map<String, String> _URI_MAP = const {
+    "dart:core": "$sdkRoot/lib/core/core.dart",
+    "dart:html": "$sdkRoot/lib/html/dartium/html_dartium.dart",
+    "dart:async": "$sdkRoot/lib/async/async.dart",
+    "dart:async2": "$sdkRoot/lib/async2/async2.dart",
+    "dart:async/stream.dart": "$sdkRoot/lib/async/stream.dart",
+    "dart:collection": "$sdkRoot/lib/collection/collection.dart",
+    "dart:convert": "$sdkRoot/lib/convert/convert.dart",
+    "dart:_foreign_helper": "$sdkRoot/lib/_foreign_helper/_foreign_helper.dart",
+    "dart:_interceptors":
+        "$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart",
+    "dart:_internal": "$sdkRoot/lib/_internal/internal.dart",
+    "dart:math": "$sdkRoot/lib/math/math.dart"
+  };
+
+  final MemoryResourceProvider resourceProvider;
+
+  final Map<String, String> uriMap = {};
+
+  /**
+   * The [AnalysisContextImpl] which is used for all of the sources.
+   */
+  AnalysisContextImpl _analysisContext;
+
+  @override
+  final List<SdkLibrary> sdkLibraries = [];
+
+  /**
+   * The cached linked bundle of the SDK.
+   */
+  PackageBundle _bundle;
+
+  MockSdk({bool generateSummaryFiles: false, @required this.resourceProvider}) {
+    _URI_MAP.forEach((uri, path) {
+      uriMap[uri] = resourceProvider.convertPath(path);
+    });
+
+    for (_MockSdkLibrary library in _LIBRARIES) {
+      var convertedLibrary = library._toProvider(resourceProvider);
+      sdkLibraries.add(convertedLibrary);
+    }
+
+    for (_MockSdkLibrary library in sdkLibraries) {
+      resourceProvider.newFile(library.path, library.content);
+      library.parts.forEach((String path, String content) {
+        resourceProvider.newFile(path, content);
+      });
+    }
+    resourceProvider.newFile(
+        resourceProvider.convertPath(
+            '$sdkRoot/lib/_internal/sdk_library_metadata/lib/libraries.dart'),
+        librariesContent);
+    if (generateSummaryFiles) {
+      List<int> bytes = _computeLinkedBundleBytes();
+      resourceProvider.newFileWithBytes(
+          resourceProvider.convertPath('/lib/_internal/strong.sum'), bytes);
+    }
+  }
+
+  @override
+  AnalysisContextImpl get context {
+    if (_analysisContext == null) {
+      _analysisContext = new _SdkAnalysisContext(this);
+      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
+      _analysisContext.sourceFactory = factory;
+    }
+    return _analysisContext;
+  }
+
+  @override
+  String get sdkVersion => throw new UnimplementedError();
+
+  @override
+  List<String> get uris =>
+      sdkLibraries.map((SdkLibrary library) => library.shortName).toList();
+
+  @override
+  Source fromFileUri(Uri uri) {
+    String filePath = resourceProvider.pathContext.fromUri(uri);
+    if (!filePath.startsWith(resourceProvider.convertPath('$sdkRoot/lib/'))) {
+      return null;
+    }
+    for (SdkLibrary library in sdkLibraries) {
+      String libraryPath = library.path;
+      if (filePath == libraryPath) {
+        try {
+          File file = resourceProvider.getResource(filePath);
+          Uri dartUri = Uri.parse(library.shortName);
+          return file.createSource(dartUri);
+        } catch (exception) {
+          return null;
+        }
+      }
+      String libraryRootPath =
+          resourceProvider.pathContext.dirname(libraryPath) +
+              resourceProvider.pathContext.separator;
+      if (filePath.startsWith(libraryRootPath)) {
+        String pathInLibrary = filePath.substring(libraryRootPath.length);
+        String uriStr = '${library.shortName}/$pathInLibrary';
+        try {
+          File file = resourceProvider.getResource(filePath);
+          Uri dartUri = Uri.parse(uriStr);
+          return file.createSource(dartUri);
+        } catch (exception) {
+          return null;
+        }
+      }
+    }
+    return null;
+  }
+
+  @override
+  PackageBundle getLinkedBundle() {
+    if (_bundle == null) {
+      File summaryFile = resourceProvider
+          .getFile(resourceProvider.convertPath('/lib/_internal/strong.sum'));
+      List<int> bytes;
+      if (summaryFile.exists) {
+        bytes = summaryFile.readAsBytesSync();
+      } else {
+        bytes = _computeLinkedBundleBytes();
+      }
+      _bundle = new PackageBundle.fromBuffer(bytes);
+    }
+    return _bundle;
+  }
+
+  @override
+  SdkLibrary getSdkLibrary(String dartUri) {
+    for (SdkLibrary library in _LIBRARIES) {
+      if (library.shortName == dartUri) {
+        return library;
+      }
+    }
+    return null;
+  }
+
+  @override
+  Source mapDartUri(String dartUri) {
+    String path = uriMap[dartUri];
+    if (path != null) {
+      File file = resourceProvider.getResource(path);
+      Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
+      return file.createSource(uri);
+    }
+    // If we reach here then we tried to use a dartUri that's not in the
+    // table above.
+    return null;
+  }
+
+  /**
+   * Compute the bytes of the linked bundle associated with this SDK.
+   */
+  List<int> _computeLinkedBundleBytes() {
+    List<Source> librarySources = sdkLibraries
+        .map((SdkLibrary library) => mapDartUri(library.shortName))
+        .toList();
+    return new SummaryBuilder(librarySources, context).build();
+  }
+}
+
+class _MockSdkLibrary implements SdkLibrary {
+  final String shortName;
+  final String path;
+  final String content;
+  final Map<String, String> parts;
+
+  const _MockSdkLibrary(this.shortName, this.path, this.content,
+      [this.parts = const <String, String>{}]);
+
+  @override
+  String get category => throw new UnimplementedError();
+
+  @override
+  bool get isDart2JsLibrary => throw new UnimplementedError();
+
+  @override
+  bool get isDocumented => throw new UnimplementedError();
+
+  @override
+  bool get isImplementation => throw new UnimplementedError();
+
+  @override
+  bool get isInternal => shortName.startsWith('dart:_');
+
+  @override
+  bool get isShared => throw new UnimplementedError();
+
+  @override
+  bool get isVmLibrary => throw new UnimplementedError();
+
+  _MockSdkLibrary _toProvider(MemoryResourceProvider provider) {
+    return new _MockSdkLibrary(
+      shortName,
+      provider.convertPath(path),
+      content,
+      parts.map((path, content) {
+        var convertedPath = provider.convertPath(path);
+        return new MapEntry(convertedPath, content);
+      }),
+    );
+  }
+}
+
+/**
+ * An [AnalysisContextImpl] that only contains sources for a Dart SDK.
+ */
+class _SdkAnalysisContext extends AnalysisContextImpl {
+  final DartSdk sdk;
+
+  _SdkAnalysisContext(this.sdk);
+
+  @override
+  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
+    if (factory == null) {
+      return super.createCacheFromSourceFactory(factory);
+    }
+    return new AnalysisCache(
+        <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]);
+  }
+}
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index a24767d..4eba2df 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -13,16 +13,14 @@
  * for manipulating the file system. The utility methods all take a posix style
  * path and convert it as appropriate for the actual platform.
  */
-class ResourceProviderMixin {
+mixin ResourceProviderMixin {
   MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 
-  String convertPath(String path) => resourceProvider.convertPath(path);
-
   /// Convert the given [path] to be a valid import uri for this provider's path context.
   /// The URI will use forward slashes on all platforms and absolute paths on Windows
   /// will be formatted as /X:/path/file.dart
   String convertAbsolutePathToUri(String path) {
-    path = resourceProvider.convertPath(path);
+    path = convertPath(path);
 
     // On Windows, absolute import paths are not quite the same as a normal fs path.
     // C:\test.dart must be imported as one of:
@@ -38,23 +36,25 @@
     return path.replaceAll(r'\', '/');
   }
 
+  String convertPath(String path) => resourceProvider.convertPath(path);
+
   void deleteFile(String path) {
-    String convertedPath = resourceProvider.convertPath(path);
+    String convertedPath = convertPath(path);
     resourceProvider.deleteFile(convertedPath);
   }
 
   void deleteFolder(String path) {
-    String convertedPath = resourceProvider.convertPath(path);
+    String convertedPath = convertPath(path);
     resourceProvider.deleteFolder(convertedPath);
   }
 
   File getFile(String path) {
-    String convertedPath = resourceProvider.convertPath(path);
+    String convertedPath = convertPath(path);
     return resourceProvider.getFile(convertedPath);
   }
 
   Folder getFolder(String path) {
-    String convertedPath = resourceProvider.convertPath(path);
+    String convertedPath = convertPath(path);
     return resourceProvider.getFolder(convertedPath);
   }
 
@@ -70,32 +70,37 @@
           .join(part1, part2, part3, part4, part5, part6, part7, part8);
 
   void modifyFile(String path, String content) {
-    String convertedPath = resourceProvider.convertPath(path);
+    String convertedPath = convertPath(path);
     resourceProvider.modifyFile(convertedPath, content);
   }
 
   File newFile(String path, {String content = ''}) {
-    String convertedPath = resourceProvider.convertPath(path);
+    String convertedPath = convertPath(path);
     return resourceProvider.newFile(convertedPath, content);
   }
 
   File newFileWithBytes(String path, List<int> bytes) {
-    String convertedPath = resourceProvider.convertPath(path);
+    String convertedPath = convertPath(path);
     return resourceProvider.newFileWithBytes(convertedPath, bytes);
   }
 
   Folder newFolder(String path) {
-    String convertedPath = resourceProvider.convertPath(path);
+    String convertedPath = convertPath(path);
     return resourceProvider.newFolder(convertedPath);
   }
 
-  File newOptionsFile(String directoryPath) {
-    return newFile(resourceProvider.pathContext
-        .join(directoryPath, ContextLocatorImpl.ANALYSIS_OPTIONS_NAME));
+  File newOptionsFile(String directoryPath, {String content = ''}) {
+    String path = join(directoryPath, ContextLocatorImpl.ANALYSIS_OPTIONS_NAME);
+    return newFile(path, content: content);
   }
 
   File newPackagesFile(String directoryPath) {
-    return newFile(resourceProvider.pathContext
-        .join(directoryPath, ContextLocatorImpl.PACKAGES_FILE_NAME));
+    String path = join(directoryPath, ContextLocatorImpl.PACKAGES_FILE_NAME);
+    return newFile(path);
+  }
+
+  Uri toUri(String path) {
+    path = convertPath(path);
+    return resourceProvider.pathContext.toUri(path);
   }
 }
diff --git a/pkg/analyzer/lib/src/workspace/basic.dart b/pkg/analyzer/lib/src/workspace/basic.dart
new file mode 100644
index 0000000..89b270f
--- /dev/null
+++ b/pkg/analyzer/lib/src/workspace/basic.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/workspace/simple.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:package_config/packages.dart';
+
+/**
+ * Information about a default Dart workspace.
+ *
+ * A BasicWorkspace should only be used when no other workspace type is valid.
+ */
+class BasicWorkspace extends SimpleWorkspace {
+  /**
+   * The singular package in this workspace.
+   *
+   * Each basic workspace is itself one package.
+   */
+  BasicWorkspacePackage _theOnlyPackage;
+
+  BasicWorkspace._(
+      ResourceProvider provider, String root, ContextBuilder builder)
+      : super(provider, root, builder);
+
+  @override
+  WorkspacePackage findPackageFor(String filePath) {
+    final Folder folder = provider.getFolder(filePath);
+    if (provider.pathContext.isWithin(root, folder.path)) {
+      _theOnlyPackage ??= new BasicWorkspacePackage(root, this);
+      return _theOnlyPackage;
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * Find the basic workspace that contains the given [path].
+   *
+   * As a [BasicWorkspace] is not defined by any marker files or build
+   * artifacts, this simply creates a BasicWorkspace with [path] as the [root]
+   * (or [path]'s parent if [path] points to a file).
+   */
+  static BasicWorkspace find(
+      ResourceProvider provider, String path, ContextBuilder builder) {
+    Resource resource = provider.getResource(path);
+    if (resource is File) {
+      path = resource.parent.path;
+    }
+    return new BasicWorkspace._(provider, path, builder);
+  }
+}
+
+/**
+ * Information about a package defined in a [BasicWorkspace].
+ *
+ * Separate from [Packages] or package maps, this class is designed to simply
+ * understand whether arbitrary file paths represent libraries declared within
+ * a given package in a [BasicWorkspace].
+ */
+class BasicWorkspacePackage extends WorkspacePackage {
+  final String root;
+
+  final BasicWorkspace workspace;
+
+  BasicWorkspacePackage(this.root, this.workspace);
+
+  @override
+  bool contains(String path) {
+    // There is a 1-1 relationship between [BasicWorkspace]s and
+    // [BasicWorkspacePackage]s. If a file is in a package's workspace, then it
+    // is in the package as well.
+    return workspace.provider.pathContext.isWithin(root, path);
+  }
+}
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
new file mode 100644
index 0000000..5e90c71
--- /dev/null
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -0,0 +1,396 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+import 'dart:core';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/util/uri.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:path/path.dart' as path;
+
+/**
+ * Instances of the class `BazelFileUriResolver` resolve `file` URI's by first
+ * resolving file uri's in the expected way, and then by looking in the
+ * corresponding generated directories.
+ */
+class BazelFileUriResolver extends ResourceUriResolver {
+  final BazelWorkspace workspace;
+
+  BazelFileUriResolver(BazelWorkspace workspace)
+      : workspace = workspace,
+        super(workspace.provider);
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!ResourceUriResolver.isFileUri(uri)) {
+      return null;
+    }
+    String filePath = fileUriToNormalizedPath(provider.pathContext, uri);
+    File file = workspace.findFile(filePath);
+    if (file != null) {
+      return file.createSource(actualUri ?? uri);
+    }
+    return null;
+  }
+}
+
+/**
+ * The [UriResolver] that can resolve `package` URIs in [BazelWorkspace].
+ */
+class BazelPackageUriResolver extends UriResolver {
+  final BazelWorkspace _workspace;
+  final path.Context _context;
+
+  /**
+   * The cache of absolute [Uri]s to [Source]s mappings.
+   */
+  final Map<Uri, Source> _sourceCache = new HashMap<Uri, Source>();
+
+  BazelPackageUriResolver(BazelWorkspace workspace)
+      : _workspace = workspace,
+        _context = workspace.provider.pathContext;
+
+  @override
+  void clearCache() {
+    _sourceCache.clear();
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    return _sourceCache.putIfAbsent(uri, () {
+      if (uri.scheme != 'package') {
+        return null;
+      }
+      String uriPath = uri.path;
+      int slash = uriPath.indexOf('/');
+
+      // If the path either starts with a slash or has no slash, it is invalid.
+      if (slash < 1) {
+        return null;
+      }
+
+      String packageName = uriPath.substring(0, slash);
+      String fileUriPart = uriPath.substring(slash + 1);
+      String filePath = fileUriPart.replaceAll('/', _context.separator);
+
+      if (packageName.indexOf('.') == -1) {
+        String fullFilePath = _context.join(_workspace.root, 'third_party',
+            'dart', packageName, 'lib', filePath);
+        File file = _workspace.findFile(fullFilePath);
+        return file?.createSource(uri);
+      } else {
+        String packagePath = packageName.replaceAll('.', _context.separator);
+        String fullFilePath =
+            _context.join(_workspace.root, packagePath, 'lib', filePath);
+        File file = _workspace.findFile(fullFilePath);
+        return file?.createSource(uri);
+      }
+    });
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    path.Context context = _workspace.provider.pathContext;
+    String filePath = source.fullName;
+
+    Uri restore(String root, String filePath) {
+      if (root != null && context.isWithin(root, filePath)) {
+        String relative = context.relative(filePath, from: root);
+        List<String> components = context.split(relative);
+        if (components.length > 4 &&
+            components[0] == 'third_party' &&
+            components[1] == 'dart' &&
+            components[3] == 'lib') {
+          String packageName = components[2];
+          String pathInLib = components.skip(4).join('/');
+          return Uri.parse('package:$packageName/$pathInLib');
+        } else {
+          for (int i = 2; i < components.length - 1; i++) {
+            String component = components[i];
+            if (component == 'lib') {
+              String packageName = components.getRange(0, i).join('.');
+              String pathInLib = components.skip(i + 1).join('/');
+              return Uri.parse('package:$packageName/$pathInLib');
+            }
+          }
+        }
+      }
+      return null;
+    }
+
+    // Search in each root.
+    for (String root in [
+      _workspace.bin,
+      _workspace.genfiles,
+      _workspace.readonly,
+      _workspace.root
+    ]) {
+      Uri uri = restore(root, filePath);
+      if (uri != null) {
+        return uri;
+      }
+    }
+
+    return null;
+  }
+}
+
+/**
+ * Information about a Bazel workspace.
+ */
+class BazelWorkspace extends Workspace {
+  static const String _WORKSPACE = 'WORKSPACE';
+  static const String _READONLY = 'READONLY';
+
+  /**
+   * The name of the file that identifies a set of Bazel Targets.
+   *
+   * For Dart package purposes, a BUILD file identifies a package.
+   */
+  static const String _buildFileName = 'BUILD';
+
+  /**
+   * Default prefix for "-genfiles" and "-bin" that will be assumed if no build
+   * output symlinks are found.
+   */
+  static const defaultSymlinkPrefix = 'bazel';
+
+  final ResourceProvider provider;
+
+  /**
+   * The absolute workspace root path.
+   *
+   * It contains the `WORKSPACE` file or its parent contains the `READONLY`
+   * folder.
+   */
+  final String root;
+
+  /**
+   * The absolute path to the optional read only workspace root, in the
+   * `READONLY` folder if a git-based workspace, or `null`.
+   */
+  final String readonly;
+
+  /**
+   * The absolute path to the `bazel-bin` folder.
+   */
+  final String bin;
+
+  /**
+   * The absolute path to the `bazel-genfiles` folder.
+   */
+  final String genfiles;
+
+  BazelWorkspace._(
+      this.provider, this.root, this.readonly, this.bin, this.genfiles);
+
+  @override
+  Map<String, List<Folder>> get packageMap => null;
+
+  @override
+  UriResolver get packageUriResolver => new BazelPackageUriResolver(this);
+
+  @override
+  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData) {
+    List<UriResolver> resolvers = <UriResolver>[];
+    if (sdk != null) {
+      resolvers.add(new DartUriResolver(sdk));
+    }
+    resolvers.add(packageUriResolver);
+    resolvers.add(new BazelFileUriResolver(this));
+    if (summaryData != null) {
+      resolvers.add(InSummaryUriResolver(provider, summaryData));
+    }
+    return new SourceFactory(resolvers, null, provider);
+  }
+
+  /**
+   * Return the file with the given [absolutePath], looking first into
+   * directories for generated files: `bazel-bin` and `bazel-genfiles`, and
+   * then into the workspace root. The file in the workspace root is returned
+   * even if it does not exist. Return `null` if the given [absolutePath] is
+   * not in the workspace [root].
+   */
+  File findFile(String absolutePath) {
+    path.Context context = provider.pathContext;
+    try {
+      String relative = context.relative(absolutePath, from: root);
+      if (relative == '.') {
+        return null;
+      }
+      // genfiles
+      if (genfiles != null) {
+        File file = provider.getFile(context.join(genfiles, relative));
+        if (file.exists) {
+          return file;
+        }
+      }
+      // bin
+      if (bin != null) {
+        File file = provider.getFile(context.join(bin, relative));
+        if (file.exists) {
+          return file;
+        }
+      }
+      // Writable
+      File writableFile = provider.getFile(absolutePath);
+      if (writableFile.exists) {
+        return writableFile;
+      }
+      // READONLY
+      if (readonly != null) {
+        File file = provider.getFile(context.join(readonly, relative));
+        if (file.exists) {
+          return file;
+        }
+      }
+      // Not generated, return the default one.
+      return writableFile;
+    } catch (_) {
+      return null;
+    }
+  }
+
+  @override
+  WorkspacePackage findPackageFor(String filePath) {
+    path.Context context = provider.pathContext;
+    Folder folder = provider.getFolder(context.dirname(filePath));
+
+    while (true) {
+      Folder parent = folder.parent;
+      if (parent == null) {
+        return null;
+      }
+      if (parent.path.length < root.length) {
+        // We've walked up outside of [root], so [path] is definitely not
+        // defined in any package in this workspace.
+        return null;
+      }
+
+      if (folder.getChildAssumingFile(_buildFileName).exists) {
+        // Found the BUILD file, denoting a Dart package.
+        return BazelWorkspacePackage(folder.path, this);
+      }
+
+      // Go up a folder.
+      folder = parent;
+    }
+  }
+
+  /**
+   * Find the Bazel workspace that contains the given [filePath].
+   *
+   * Return `null` if a workspace marker, such as the `WORKSPACE` file, or
+   * the sibling `READONLY` folder cannot be found.
+   *
+   * Return `null` if the workspace does not have `bazel-genfiles` or
+   * `blaze-genfiles` folders, since we don't know where to search generated
+   * files.
+   *
+   * Return `null` if there is a folder 'foo' with the sibling `READONLY`
+   * folder, but there is corresponding folder 'foo' in `READONLY`, i.e. the
+   * corresponding readonly workspace root.
+   */
+  static BazelWorkspace find(ResourceProvider provider, String filePath) {
+    path.Context context = provider.pathContext;
+    Folder folder = provider.getFolder(filePath);
+    while (true) {
+      Folder parent = folder.parent;
+      if (parent == null) {
+        return null;
+      }
+
+      // Found the READONLY folder, might be a git-based workspace.
+      Folder readonlyFolder = parent.getChildAssumingFolder(_READONLY);
+      if (readonlyFolder.exists) {
+        String root = folder.path;
+        String readonlyRoot =
+            context.join(readonlyFolder.path, folder.shortName);
+        if (provider.getFolder(readonlyRoot).exists) {
+          String symlinkPrefix = _findSymlinkPrefix(provider, root);
+          if (symlinkPrefix != null) {
+            return new BazelWorkspace._(
+                provider,
+                root,
+                readonlyRoot,
+                context.join(root, '$symlinkPrefix-bin'),
+                context.join(root, '$symlinkPrefix-genfiles'));
+          }
+        }
+      }
+
+      // Found the WORKSPACE file, must be a non-git workspace.
+      if (folder.getChildAssumingFile(_WORKSPACE).exists) {
+        String root = folder.path;
+        String symlinkPrefix = _findSymlinkPrefix(provider, root);
+        if (symlinkPrefix == null) {
+          return null;
+        }
+        return new BazelWorkspace._(
+            provider,
+            root,
+            null,
+            context.join(root, '$symlinkPrefix-bin'),
+            context.join(root, '$symlinkPrefix-genfiles'));
+      }
+
+      // Go up the folder.
+      folder = parent;
+    }
+  }
+
+  /**
+   * Return the symlink prefix for folders `X-bin` or `X-genfiles` by probing
+   * the internal `blaze-genfiles` and `bazel-genfiles`. Make a default
+   * assumption according to defaultSymlinkPrefix if neither of the folders
+   * exists.
+   */
+  static String _findSymlinkPrefix(ResourceProvider provider, String root) {
+    path.Context context = provider.pathContext;
+    if (provider.getFolder(context.join(root, 'blaze-genfiles')).exists) {
+      return 'blaze';
+    }
+    if (provider.getFolder(context.join(root, 'bazel-genfiles')).exists) {
+      return 'bazel';
+    }
+    // Couldn't find it.  Make a default assumption.
+    return defaultSymlinkPrefix;
+  }
+}
+
+/**
+ * Information about a package defined in a BazelWorkspace.
+ *
+ * Separate from [Packages] or package maps, this class is designed to simply
+ * understand whether arbitrary file paths represent libraries declared within
+ * a given package in a BazelWorkspace.
+ */
+class BazelWorkspacePackage extends WorkspacePackage {
+  final String root;
+
+  final BazelWorkspace workspace;
+
+  BazelWorkspacePackage(this.root, this.workspace);
+
+  @override
+  bool contains(String path) {
+    if (workspace.findFile(path) == null) {
+      return false;
+    }
+    if (!workspace.provider.pathContext.isWithin(root, path)) {
+      return false;
+    }
+
+    // Just because [path] is within [root] does not mean it is in this
+    // package; it could be in a "subpackage." Must go through the work of
+    // learning exactly which package [path] is contained in.
+    return workspace.findPackageFor(path).root == root;
+  }
+}
diff --git a/pkg/analyzer/lib/src/workspace/gn.dart b/pkg/analyzer/lib/src/workspace/gn.dart
new file mode 100644
index 0000000..191c421
--- /dev/null
+++ b/pkg/analyzer/lib/src/workspace/gn.dart
@@ -0,0 +1,330 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+import 'dart:core';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/util/uri.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:package_config/packages.dart';
+import 'package:package_config/packages_file.dart';
+import 'package:package_config/src/packages_impl.dart';
+import 'package:path/path.dart' as path;
+
+/**
+ * Information about a Gn workspace.
+ */
+class GnWorkspace extends Workspace {
+  /**
+   * The name of the directory that identifies the root of the workspace.
+   */
+  static const String _jiriRootName = '.jiri_root';
+
+  /**
+   * The name of the file that identifies a set of GN Targets.
+   *
+   * For Dart package purposes, a BUILD.gn file identifies a package.
+   */
+  static const String _buildFileName = 'BUILD.gn';
+
+  /**
+   * The resource provider used to access the file system.
+   */
+  final ResourceProvider provider;
+
+  /**
+   * The absolute workspace root path (the directory containing the `.jiri_root`
+   * directory).
+   */
+  final String root;
+
+  /**
+   * The paths to the .packages files.
+   */
+  final List<String> _packagesFilePaths;
+
+  /**
+   * The map of package locations indexed by package name.
+   *
+   * This is a cached field.
+   */
+  Map<String, List<Folder>> _packageMap;
+
+  /**
+   * The package location strategy.
+   *
+   * This is a cached field.
+   */
+  Packages _packages;
+
+  GnWorkspace._(this.provider, this.root, this._packagesFilePaths);
+
+  @override
+  Map<String, List<Folder>> get packageMap =>
+      _packageMap ??= _convertPackagesToMap(packages);
+
+  Packages get packages => _packages ??= _createPackages();
+
+  @override
+  UriResolver get packageUriResolver =>
+      new PackageMapUriResolver(provider, packageMap);
+
+  @override
+  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData) {
+    if (summaryData != null) {
+      throw new UnsupportedError(
+          'Summary files are not supported in a GN workspace.');
+    }
+    List<UriResolver> resolvers = <UriResolver>[];
+    if (sdk != null) {
+      resolvers.add(new DartUriResolver(sdk));
+    }
+    resolvers.add(packageUriResolver);
+    resolvers.add(new ResourceUriResolver(provider));
+    return new SourceFactory(resolvers, packages, provider);
+  }
+
+  /**
+   * Return the file with the given [absolutePath].
+   *
+   * Return `null` if the given [absolutePath] is not in the workspace [root].
+   */
+  File findFile(String absolutePath) {
+    try {
+      File writableFile = provider.getFile(absolutePath);
+      if (writableFile.exists) {
+        return writableFile;
+      }
+    } catch (_) {}
+    return null;
+  }
+
+  @override
+  WorkspacePackage findPackageFor(String path) {
+    Folder folder = provider.getFolder(provider.pathContext.dirname(path));
+
+    while (true) {
+      Folder parent = folder.parent;
+      if (parent == null) {
+        return null;
+      }
+      if (parent.path.length < root.length) {
+        // We've walked up outside of [root], so [path] is definitely not
+        // defined in any package in this workspace.
+        return null;
+      }
+
+      if (folder.getChildAssumingFile(_buildFileName).exists) {
+        return GnWorkspacePackage(folder.path, this);
+      }
+
+      // Go up a folder.
+      folder = parent;
+    }
+  }
+
+  /**
+   * Creates an alternate representation for available packages.
+   */
+  Map<String, List<Folder>> _convertPackagesToMap(Packages packages) {
+    Map<String, List<Folder>> folderMap = new HashMap<String, List<Folder>>();
+    if (packages != null && packages != Packages.noPackages) {
+      var pathContext = provider.pathContext;
+      packages.asMap().forEach((String packageName, Uri uri) {
+        String filePath = fileUriToNormalizedPath(pathContext, uri);
+        folderMap[packageName] = [provider.getFolder(filePath)];
+      });
+    }
+    return folderMap;
+  }
+
+  /**
+   * Loads the packages from the .packages file.
+   */
+  Packages _createPackages() {
+    Map<String, Uri> map = _packagesFilePaths.map((String filePath) {
+      File configFile = provider.getFile(filePath);
+      List<int> bytes = configFile.readAsBytesSync();
+      return parse(bytes, configFile.toUri());
+    }).reduce((mapOne, mapTwo) {
+      mapOne.addAll(mapTwo);
+      return mapOne;
+    });
+    _resolveSymbolicLinks(map);
+    return new MapPackages(map);
+  }
+
+  /**
+   * Resolve any symbolic links encoded in the path to the given [folder].
+   */
+  String _resolveSymbolicLink(Folder folder) {
+    try {
+      return folder.resolveSymbolicLinksSync().path;
+    } on FileSystemException {
+      return folder.path;
+    }
+  }
+
+  /**
+   * Resolve any symbolic links encoded in the URI's in the given [map] by
+   * replacing the values in the map.
+   */
+  void _resolveSymbolicLinks(Map<String, Uri> map) {
+    path.Context pathContext = provider.pathContext;
+    for (String packageName in map.keys) {
+      String filePath = fileUriToNormalizedPath(pathContext, map[packageName]);
+      Folder folder = provider.getFolder(filePath);
+      String folderPath = _resolveSymbolicLink(folder);
+      // Add a '.' so that the URI is suitable for resolving relative URI's
+      // against it.
+      String uriPath = pathContext.join(folderPath, '.');
+      map[packageName] = pathContext.toUri(uriPath);
+    }
+  }
+
+  /**
+   * Find the GN workspace that contains the given [filePath].
+   *
+   * Return `null` if a workspace could not be found. For a workspace to be
+   * found, both a `.jiri_root` file must be found, and at least one "packages"
+   * file must be found in [filePath]'s output directory.
+   */
+  static GnWorkspace find(ResourceProvider provider, String filePath) {
+    Resource resource = provider.getResource(filePath);
+    if (resource is File) {
+      filePath = resource.parent.path;
+    }
+    Folder folder = provider.getFolder(filePath);
+    while (true) {
+      Folder parent = folder.parent;
+      if (parent == null) {
+        return null;
+      }
+
+      if (folder.getChildAssumingFolder(_jiriRootName).exists) {
+        // Found the .jiri_root file, must be a non-git workspace.
+        String root = folder.path;
+        List<String> packagesFiles =
+            _findPackagesFile(provider, root, filePath);
+        if (packagesFiles.isEmpty) {
+          return null;
+        }
+        return new GnWorkspace._(provider, root, packagesFiles);
+      }
+
+      // Go up a folder.
+      folder = parent;
+    }
+  }
+
+  /**
+   * For a source at `$root/foo/bar`, the packages files are generated in
+   * `$root/out/<debug|release>-XYZ/dartlang/gen/foo/bar`.
+   *
+   * Note that in some cases multiple .packages files can be found at that
+   * location, for example if the package contains both a library and a binary
+   * target. For a complete view of the package, all of these files need to be
+   * taken into account.
+   */
+  static List<String> _findPackagesFile(
+    ResourceProvider provider,
+    String root,
+    String filePath,
+  ) {
+    path.Context pathContext = provider.pathContext;
+    String sourceDirectory = pathContext.relative(filePath, from: root);
+    Folder outDirectory = _getOutDirectory(root, provider);
+    if (outDirectory == null) {
+      return const <String>[];
+    }
+    Folder genDir = outDirectory.getChildAssumingFolder(
+        pathContext.join('dartlang', 'gen', sourceDirectory));
+    if (!genDir.exists) {
+      return const <String>[];
+    }
+    return genDir
+        .getChildren()
+        .where((resource) => resource is File)
+        .map((resource) => resource as File)
+        .where((File file) => pathContext.extension(file.path) == '.packages')
+        .map((File file) => file.path)
+        .toList();
+  }
+
+  /**
+   * Returns the output directory of the build, or `null` if it could not be
+   * found.
+   *
+   * First attempts to read a config file at the root of the source tree. If
+   * that file cannot be found, looks for standard output directory locations.
+   */
+  static Folder _getOutDirectory(String root, ResourceProvider provider) {
+    path.Context pathContext = provider.pathContext;
+    File config = provider.getFile(pathContext.join(root, '.config'));
+    if (config.exists) {
+      String content = config.readAsStringSync();
+      Match match =
+          new RegExp(r'^FUCHSIA_BUILD_DIR=["\x27](.+)["\x27]$', multiLine: true)
+              .firstMatch(content);
+      if (match != null) {
+        String buildDirPath = match.group(1);
+        if (pathContext.isRelative(buildDirPath)) {
+          buildDirPath = pathContext.join(root, buildDirPath);
+        }
+        return provider.getFolder(buildDirPath);
+      }
+    }
+    Folder outDirectory = provider.getFolder(pathContext.join(root, 'out'));
+    if (!outDirectory.exists) {
+      return null;
+    }
+    return outDirectory
+        .getChildren()
+        .where((resource) => resource is Folder)
+        .map((resource) => resource as Folder)
+        .firstWhere((Folder folder) {
+      String baseName = pathContext.basename(folder.path);
+      // Taking a best guess to identify a build dir. This is clearly a fallback
+      // to the config-based method.
+      return baseName.startsWith('debug') || baseName.startsWith('release');
+    }, orElse: () => null);
+  }
+}
+
+/**
+ * Information about a package defined in a GnWorkspace.
+ *
+ * Separate from [Packages] or package maps, this class is designed to simply
+ * understand whether arbitrary file paths represent libraries declared within
+ * a given package in a GnWorkspace.
+ */
+class GnWorkspacePackage extends WorkspacePackage {
+  final String root;
+
+  final GnWorkspace workspace;
+
+  GnWorkspacePackage(this.root, this.workspace);
+
+  @override
+  bool contains(String path) {
+    if (workspace.findFile(path) == null) {
+      return false;
+    }
+    if (!workspace.provider.pathContext.isWithin(root, path)) {
+      return false;
+    }
+
+    // Just because [path] is within [root] does not mean it is in this
+    // package; it could be in a "subpackage." Must go through the work of
+    // learning exactly which package [path] is contained in.
+    return workspace.findPackageFor(path).root == root;
+  }
+}
diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart
new file mode 100644
index 0000000..d33e17a
--- /dev/null
+++ b/pkg/analyzer/lib/src/workspace/package_build.dart
@@ -0,0 +1,341 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+import 'dart:core';
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/file_system/file_system.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/util/uri.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:package_config/packages.dart';
+import 'package:path/path.dart' as path;
+import 'package:yaml/yaml.dart';
+
+/**
+ * Instances of the class `PackageBuildFileUriResolver` resolve `file` URI's by
+ * first resolving file uri's in the expected way, and then by looking in the
+ * corresponding generated directories.
+ */
+class PackageBuildFileUriResolver extends ResourceUriResolver {
+  final PackageBuildWorkspace workspace;
+
+  PackageBuildFileUriResolver(PackageBuildWorkspace workspace)
+      : workspace = workspace,
+        super(workspace.provider);
+
+  @override
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) {
+    if (!ResourceUriResolver.isFileUri(uri)) {
+      return null;
+    }
+    String filePath = fileUriToNormalizedPath(provider.pathContext, uri);
+    File file = workspace.findFile(filePath);
+    if (file != null) {
+      return file.createSource(actualUri ?? uri);
+    }
+    return null;
+  }
+}
+
+/**
+ * The [UriResolver] that can resolve `package` URIs in [PackageBuildWorkspace].
+ */
+class PackageBuildPackageUriResolver extends UriResolver {
+  final PackageBuildWorkspace _workspace;
+  final UriResolver _normalUriResolver;
+  final path.Context _context;
+
+  /**
+   * The cache of absolute [Uri]s to [Source]s mappings.
+   */
+  final Map<Uri, Source> _sourceCache = new HashMap<Uri, Source>();
+
+  PackageBuildPackageUriResolver(
+      PackageBuildWorkspace workspace, this._normalUriResolver)
+      : _workspace = workspace,
+        _context = workspace.provider.pathContext;
+
+  @override
+  Source resolveAbsolute(Uri _ignore, [Uri uri]) {
+    uri ??= _ignore;
+    return _sourceCache.putIfAbsent(uri, () {
+      if (uri.scheme != 'package') {
+        return null;
+      }
+
+      Source basicResolverSource = _normalUriResolver.resolveAbsolute(uri);
+      if (basicResolverSource != null && basicResolverSource.exists()) {
+        return basicResolverSource;
+      }
+
+      String uriPath = uri.path;
+      int slash = uriPath.indexOf('/');
+
+      // If the path either starts with a slash or has no slash, it is invalid.
+      if (slash < 1) {
+        return null;
+      }
+
+      String packageName = uriPath.substring(0, slash);
+      String fileUriPart = uriPath.substring(slash + 1);
+      String filePath = fileUriPart.replaceAll('/', _context.separator);
+
+      File file = _workspace.builtFile(
+          _workspace.builtPackageSourcePath(filePath), packageName);
+      if (file != null && file.exists) {
+        return file.createSource(uri);
+      }
+      return basicResolverSource;
+    });
+  }
+
+  @override
+  Uri restoreAbsolute(Source source) {
+    String filePath = source.fullName;
+
+    if (_context.isWithin(_workspace.root, filePath)) {
+      String relative = _context.relative(filePath, from: _workspace.root);
+      List<String> components = _context.split(relative);
+      if (components.length > 4 &&
+          components[0] == 'build' &&
+          components[1] == 'generated' &&
+          components[3] == 'lib') {
+        String packageName = components[2];
+        String pathInLib = components.skip(4).join('/');
+        return Uri.parse('package:$packageName/$pathInLib');
+      }
+    }
+    return source.uri;
+  }
+}
+
+/**
+ * Information about a package:build workspace.
+ */
+class PackageBuildWorkspace extends Workspace {
+  /**
+   * The name of the directory that identifies the root of the workspace. Note,
+   * the presence of this file does not show package:build is used. For that,
+   * the subdirectory [_dartToolBuildName] must exist. A `pub` subdirectory
+   * will usually exist in non-package:build projects too.
+   */
+  static const String _dartToolRootName = '.dart_tool';
+
+  /**
+   * The name of the subdirectory in [_dartToolName] that distinguishes projects
+   * built with package:build.
+   */
+  static const String _dartToolBuildName = 'build';
+
+  /**
+   * We use pubspec.yaml to get the package name to be consistent with how
+   * package:build does it.
+   */
+  static const String _pubspecName = 'pubspec.yaml';
+
+  /**
+   * The resource provider used to access the file system.
+   */
+  final ResourceProvider provider;
+
+  /**
+   * The absolute workspace root path (the directory containing the `.dart_tool`
+   * directory).
+   */
+  final String root;
+
+  /**
+   * The name of the package under development as defined in pubspec.yaml. This
+   * matches the behavior of package:build.
+   */
+  final String projectPackageName;
+
+  final ContextBuilder _builder;
+
+  /**
+   * The map of package locations indexed by package name.
+   *
+   * This is a cached field.
+   */
+  Map<String, List<Folder>> _packageMap;
+
+  /**
+   * The package location strategy.
+   *
+   * This is a cached field.
+   */
+  Packages _packages;
+
+  /**
+   * The singular package in this workspace.
+   *
+   * Each "package:build" workspace is itself one package.
+   */
+  PackageBuildWorkspacePackage _theOnlyPackage;
+
+  PackageBuildWorkspace._(
+      this.provider, this.root, this.projectPackageName, this._builder);
+
+  @override
+  Map<String, List<Folder>> get packageMap {
+    _packageMap ??= _builder.convertPackagesToMap(packages);
+    return _packageMap;
+  }
+
+  Packages get packages {
+    _packages ??= _builder.createPackageMap(root);
+    return _packages;
+  }
+
+  @override
+  UriResolver get packageUriResolver => new PackageBuildPackageUriResolver(
+      this, new PackageMapUriResolver(provider, packageMap));
+
+  /**
+   * For some package file, which may or may not be a package source (it could
+   * be in `bin/`, `web/`, etc), find where its built counterpart will exist if
+   * its a generated source.
+   *
+   * To get a [builtPath] for a package source file to use in this method,
+   * use [builtPackageSourcePath]. For `bin/`, `web/`, etc, it must be relative
+   * to the project root.
+   */
+  File builtFile(String builtPath, String packageName) {
+    if (!packageMap.containsKey(packageName)) {
+      return null;
+    }
+    path.Context context = provider.pathContext;
+    String fullBuiltPath = context.join(
+        root, _dartToolRootName, 'build', 'generated', packageName, builtPath);
+    return provider.getFile(fullBuiltPath);
+  }
+
+  /**
+   * Unlike the way that sources are resolved against `.packages` (if foo points
+   * to folder bar, then `foo:baz.dart` is found at `bar/baz.dart`), the built
+   * sources for a package require the `lib/` prefix first. This is because
+   * `bin/`, `web/`, and `test/` etc can all be built as well. This method
+   * exists to give a name to that prefix processing step.
+   */
+  String builtPackageSourcePath(String filePath) {
+    path.Context context = provider.pathContext;
+    assert(context.isRelative(filePath), 'Not a relative path: $filePath');
+    return context.join('lib', filePath);
+  }
+
+  @override
+  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData) {
+    if (summaryData != null) {
+      throw new UnsupportedError(
+          'Summary files are not supported in a package:build workspace.');
+    }
+    List<UriResolver> resolvers = <UriResolver>[];
+    if (sdk != null) {
+      resolvers.add(new DartUriResolver(sdk));
+    }
+    resolvers.add(packageUriResolver);
+    resolvers.add(new PackageBuildFileUriResolver(this));
+    return new SourceFactory(resolvers, packages, provider);
+  }
+
+  /**
+   * Return the file with the given [filePath], looking first into directories for
+   * source files, and then in the generated directory
+   * `.dart_tool/build/generated/$projectPackageName/$FILE`. The file in the
+   * workspace root is returned even if it does not exist. Return `null` if the
+   * given [filePath] is not in the workspace [root].
+   */
+  File findFile(String filePath) {
+    path.Context context = provider.pathContext;
+    assert(context.isAbsolute(filePath), 'Not an absolute path: $filePath');
+    try {
+      final String builtPath = context.relative(filePath, from: root);
+      final File file = builtFile(builtPath, projectPackageName);
+
+      if (file.exists) {
+        return file;
+      }
+
+      return provider.getFile(filePath);
+    } catch (_) {
+      return null;
+    }
+  }
+
+  @override
+  WorkspacePackage findPackageFor(String filePath) {
+    final Folder folder = provider.getFolder(filePath);
+    if (provider.pathContext.isWithin(root, folder.path)) {
+      _theOnlyPackage ??= new PackageBuildWorkspacePackage(root, this);
+      return _theOnlyPackage;
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * Find the package:build workspace that contains the given [filePath].
+   *
+   * Return `null` if the filePath is not in a package:build workspace.
+   */
+  static PackageBuildWorkspace find(
+      ResourceProvider provider, String filePath, ContextBuilder builder) {
+    Folder folder = provider.getFolder(filePath);
+    while (true) {
+      Folder parent = folder.parent;
+      if (parent == null) {
+        return null;
+      }
+
+      final File pubspec = folder.getChildAssumingFile(_pubspecName);
+      final Folder dartToolDir =
+          folder.getChildAssumingFolder(_dartToolRootName);
+      final Folder dartToolBuildDir =
+          dartToolDir.getChildAssumingFolder(_dartToolBuildName);
+
+      // Found the .dart_tool file, that's our project root. We also require a
+      // pubspec, to know the package name that package:build will assume.
+      if (dartToolBuildDir.exists && pubspec.exists) {
+        try {
+          final yaml = loadYaml(pubspec.readAsStringSync());
+          return new PackageBuildWorkspace._(
+              provider, folder.path, yaml['name'], builder);
+        } on Exception {}
+      }
+
+      // Go up the folder.
+      folder = parent;
+    }
+  }
+}
+
+/**
+ * Information about a package defined in a PackageBuildWorkspace.
+ *
+ * Separate from [Packages] or package maps, this class is designed to simply
+ * understand whether arbitrary file paths represent libraries declared within
+ * a given package in a PackageBuildWorkspace.
+ */
+class PackageBuildWorkspacePackage extends WorkspacePackage {
+  final String root;
+
+  final PackageBuildWorkspace workspace;
+
+  PackageBuildWorkspacePackage(this.root, this.workspace);
+
+  @override
+  bool contains(String path) {
+    // There is a 1-1 relationship between PackageBuildWorkspaces and
+    // PackageBuildWorkspacePackages. If a file is in a package's workspace,
+    // then it is in the package as well.
+    return workspace.findFile(path) != null;
+  }
+}
diff --git a/pkg/analyzer/lib/src/workspace/pub.dart b/pkg/analyzer/lib/src/workspace/pub.dart
new file mode 100644
index 0000000..f89937c
--- /dev/null
+++ b/pkg/analyzer/lib/src/workspace/pub.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/workspace/simple.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:package_config/packages.dart';
+
+/// Information about a Pub workspace.
+class PubWorkspace extends SimpleWorkspace {
+  /// The name of the file that identifies the root of the workspace.
+  static const String _pubspecName = 'pubspec.yaml';
+
+  /// The singular package in this workspace.
+  ///
+  /// Each Pub workspace is itself one package.
+  PubWorkspacePackage _theOnlyPackage;
+
+  PubWorkspace._(ResourceProvider provider, String root, ContextBuilder builder)
+      : super(provider, root, builder);
+
+  @override
+  WorkspacePackage findPackageFor(String filePath) {
+    final Folder folder = provider.getFolder(filePath);
+    if (provider.pathContext.isWithin(root, folder.path)) {
+      _theOnlyPackage ??= new PubWorkspacePackage(root, this);
+      return _theOnlyPackage;
+    } else {
+      return null;
+    }
+  }
+
+  /// Find the pub workspace that contains the given [path].
+  static PubWorkspace find(
+      ResourceProvider provider, String filePath, ContextBuilder builder) {
+    Resource resource = provider.getResource(filePath);
+    if (resource is File) {
+      filePath = resource.parent.path;
+    }
+    Folder folder = provider.getFolder(filePath);
+    while (true) {
+      Folder parent = folder.parent;
+      if (parent == null) {
+        return null;
+      }
+
+      if (folder.getChildAssumingFile(_pubspecName).exists) {
+        // Found the pubspec.yaml file; this is our root.
+        String root = folder.path;
+        return new PubWorkspace._(provider, root, builder);
+      }
+
+      // Go up a folder.
+      folder = parent;
+    }
+  }
+}
+
+/// Information about a package defined in a [PubWorkspace].
+///
+/// Separate from [Packages] or package maps, this class is designed to simply
+/// understand whether arbitrary file paths represent libraries declared within
+/// a given package in a [PubWorkspace].
+class PubWorkspacePackage extends WorkspacePackage {
+  final String root;
+
+  final PubWorkspace workspace;
+
+  PubWorkspacePackage(this.root, this.workspace);
+
+  @override
+  bool contains(String path) {
+    // There is a 1-1 relationship between [PubWorkspace]s and
+    // [PubWorkspacePackage]s. If a file is in a package's workspace, then it
+    // is in the package as well.
+    return workspace.provider.pathContext.isWithin(root, path);
+  }
+}
diff --git a/pkg/analyzer/lib/src/workspace/simple.dart b/pkg/analyzer/lib/src/workspace/simple.dart
new file mode 100644
index 0000000..c2d0d8e
--- /dev/null
+++ b/pkg/analyzer/lib/src/workspace/simple.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
+import 'package:package_config/packages.dart';
+
+/// An abstract class for simple workspaces which do not feature any build
+/// artifacts or generated files.
+///
+/// The [packageMap] and [packageUrlResolver] are simple derivations from the
+/// [ContextBuilder] and [ResourceProvider] required for the class.
+abstract class SimpleWorkspace extends Workspace {
+  /// The [ResourceProvider] by which paths are converted into [Resource]s.
+  final ResourceProvider provider;
+
+  /// The absolute workspace root path.
+  final String root;
+
+  final ContextBuilder _builder;
+
+  Map<String, List<Folder>> _packageMap;
+
+  Packages _packages;
+
+  SimpleWorkspace(this.provider, this.root, this._builder);
+
+  @override
+  Map<String, List<Folder>> get packageMap {
+    _packageMap ??= _builder.convertPackagesToMap(packages);
+    return _packageMap;
+  }
+
+  Packages get packages {
+    _packages ??= _builder.createPackageMap(root);
+    return _packages;
+  }
+
+  @override
+  UriResolver get packageUriResolver =>
+      new PackageMapUriResolver(provider, packageMap);
+
+  @override
+  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData) {
+    if (summaryData != null) {
+      throw new UnsupportedError(
+          'Summary files are not supported in a Pub workspace.');
+    }
+    List<UriResolver> resolvers = <UriResolver>[];
+    if (sdk != null) {
+      resolvers.add(new DartUriResolver(sdk));
+    }
+    resolvers.add(packageUriResolver);
+    resolvers.add(new ResourceUriResolver(provider));
+    return new SourceFactory(resolvers, packages, provider);
+  }
+}
diff --git a/pkg/analyzer/lib/src/workspace/workspace.dart b/pkg/analyzer/lib/src/workspace/workspace.dart
new file mode 100644
index 0000000..be58cdb
--- /dev/null
+++ b/pkg/analyzer/lib/src/workspace/workspace.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/package_bundle_reader.dart';
+
+/**
+ * Abstract superclass of classes that provide information about the workspace
+ * in which analysis is being performed.
+ */
+abstract class Workspace {
+  /**
+   * Return `true` if this workspace defines a single "project" and that
+   * "project" depends upon flutter.
+   */
+  bool get hasFlutterDependency => packageMap?.containsKey('flutter') ?? false;
+
+  /**
+   * Return a (possibly null) map of package sources.
+   */
+  Map<String, List<Folder>> get packageMap;
+
+  /**
+   * The [UriResolver] that can resolve `package` URIs.
+   */
+  UriResolver get packageUriResolver;
+
+  /**
+   * The absolute workspace root path.
+   */
+  String get root;
+
+  /**
+   * Create the source factory that should be used to resolve Uris to [Source]s.
+   * The [sdk] may be `null`. The [summaryData] can also be `null`.
+   */
+  SourceFactory createSourceFactory(DartSdk sdk, SummaryDataStore summaryData);
+
+  /**
+   * Find the [WorkspacePackage] where the library at [path] is defined.
+   *
+   * Separate from [Packages] or [packageMap], this method is designed to find
+   * the package, by its root, in which a library at an arbitrary path is
+   * defined.
+   */
+  WorkspacePackage findPackageFor(String path);
+}
+
+/**
+ * Abstract superclass of classes that provide information about a package
+ * defined in a Workspace.
+ *
+ * Separate from [Packages] or package maps, this class is designed to simply
+ * understand whether arbitrary file paths represent libraries declared within
+ * a given package in a Workspace.
+ */
+abstract class WorkspacePackage {
+  String get root;
+
+  Workspace get workspace;
+
+  bool contains(String path);
+}
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 9b2b39e..33c10f2 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,24 +1,25 @@
 name: analyzer
-version: 0.33.0
+version: 0.34.2-dev
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
 environment:
-  sdk: '>=2.0.0-dev.48.0 <3.0.0'
+  sdk: '>=2.1.0-dev.5.0 <3.0.0'
 dependencies:
   args: '>=0.12.1 <2.0.0'
   charcode: ^1.1.0
   collection: ^1.10.1
   convert: ^2.0.0
   crypto: '>=1.1.1 <3.0.0'
-  front_end: 0.1.6
+  front_end: 0.1.8
   glob: ^1.0.3
   html: '>=0.12.0 <1.14.0'
-  kernel: 0.3.6
+  kernel: 0.3.8
   meta: ^1.0.2
   package_config: '>=0.1.5 <2.0.0'
   path: '>=0.9.0 <2.0.0'
   plugin: ^0.2.0
+  pub_semver: ^1.4.2
   source_span: ^1.2.0
   watcher: '>=0.9.6 <0.10.0'
   yaml: ^2.1.2
diff --git a/pkg/analyzer/test/dart/ast/visitor_test.dart b/pkg/analyzer/test/dart/ast/visitor_test.dart
index f246a06..31b3c35a 100644
--- a/pkg/analyzer/test/dart/ast/visitor_test.dart
+++ b/pkg/analyzer/test/dart/ast/visitor_test.dart
@@ -8,7 +8,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/parser_test.dart' show ParserTestCase;
-import '../../generated/test_support.dart';
+import '../../util/ast_type_matchers.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -40,23 +40,15 @@
 }''';
     CompilationUnit unit = parseCompilationUnit(source);
     List<AstNode> nodes = new List<AstNode>();
-    BreadthFirstVisitor<Object> visitor =
+    _BreadthFirstVisitorTestHelper visitor =
         new _BreadthFirstVisitorTestHelper(nodes);
     visitor.visitAllNodes(unit);
     expect(nodes, hasLength(59));
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is CompilationUnit, CompilationUnit, nodes[0]);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassDeclaration, ClassDeclaration, nodes[2]);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FunctionDeclaration, FunctionDeclaration, nodes[3]);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FunctionDeclarationStatement,
-        FunctionDeclarationStatement,
-        nodes[27]);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is IntegerLiteral, IntegerLiteral, nodes[58]);
-    //3
+    expect(nodes[0], isCompilationUnit);
+    expect(nodes[2], isClassDeclaration);
+    expect(nodes[3], isFunctionDeclaration);
+    expect(nodes[27], isFunctionDeclarationStatement);
+    expect(nodes[58], isIntegerLiteral); // 3
   }
 }
 
@@ -64,14 +56,14 @@
  * A helper class used to collect the nodes that were visited and to preserve
  * the order in which they were visited.
  */
-class _BreadthFirstVisitorTestHelper extends BreadthFirstVisitor<Object> {
+class _BreadthFirstVisitorTestHelper extends BreadthFirstVisitor<void> {
   List<AstNode> nodes;
 
   _BreadthFirstVisitorTestHelper(this.nodes) : super();
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     nodes.add(node);
-    return super.visitNode(node);
+    super.visitNode(node);
   }
 }
diff --git a/pkg/analyzer/test/dart/element/builder_test.dart b/pkg/analyzer/test/dart/element/builder_test.dart
index f460cfc..b476b61 100644
--- a/pkg/analyzer/test/dart/element/builder_test.dart
+++ b/pkg/analyzer/test/dart/element/builder_test.dart
@@ -1207,7 +1207,7 @@
  * It is used to test the [ApiElementBuilder] itself, and its usage by
  * [ElementBuilder].
  */
-abstract class _ApiElementBuilderTestMixin {
+mixin _ApiElementBuilderTestMixin {
   CompilationUnit get compilationUnit;
 
   void set isMixinSupportEnabled(bool value);
@@ -1948,9 +1948,7 @@
     expect(accessor.isSetter, isFalse);
     expect(accessor.isSynthetic, isFalse);
     expect(accessor.typeParameters, hasLength(0));
-    PropertyInducingElement variable = accessor.variable;
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement,
-        TopLevelVariableElement, variable);
+    TopLevelVariableElement variable = accessor.variable;
     expect(variable.isSynthetic, isTrue);
   }
 
@@ -2012,9 +2010,7 @@
     expect(accessor.isSetter, isTrue);
     expect(accessor.isSynthetic, isFalse);
     expect(accessor.typeParameters, hasLength(0));
-    PropertyInducingElement variable = accessor.variable;
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement,
-        TopLevelVariableElement, variable);
+    TopLevelVariableElement variable = accessor.variable;
     expect(variable.isSynthetic, isTrue);
   }
 
diff --git a/pkg/analyzer/test/file_system/file_system_test_support.dart b/pkg/analyzer/test/file_system/file_system_test_support.dart
new file mode 100644
index 0000000..25c0d4b
--- /dev/null
+++ b/pkg/analyzer/test/file_system/file_system_test_support.dart
@@ -0,0 +1,749 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:meta/meta.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+final isFile = new TypeMatcher<File>();
+final isFileSystemException = new TypeMatcher<FileSystemException>();
+final isFolder = new TypeMatcher<Folder>();
+
+abstract class FileSystemTestSupport {
+  /// The content used for the file at the [defaultFilePath] if it is created
+  /// and no other content is provided.
+  String get defaultFileContent;
+
+  /// A path to a file within the [defaultFolderPath] that can be used by tests.
+  String get defaultFilePath;
+
+  /// A path to a folder within the [tempPath] that can be used by tests.
+  String get defaultFolderPath;
+
+  /// Return the resource provider to be used by the tests.
+  ResourceProvider get provider;
+
+  /// The absolute path to the temporary directory in which all of the tests are
+  /// to work.
+  String get tempPath;
+
+  /// Return a file accessed through the resource provider. If [exists] is
+  /// `true` then the returned file will exist, otherwise it won't. If [content]
+  /// is provided then the file will have the given content, otherwise it will
+  /// have the [defaultFileContent]. If the file does not exist then the content
+  /// is ignored. If a [filePath] is provided, then the file will be located at
+  /// that path; otherwise the file will have the [defaultFilePath].
+  File getFile({@required bool exists, String content, String filePath});
+
+  /// Return a folder accessed through the resource provider. If [exists] is
+  /// `true` then the returned folder will exist, otherwise it won't. If a
+  /// [folderPath] is provided, then the folder will be located at that path;
+  /// otherwise the folder will have the [defaultFolderPath].
+  Folder getFolder({@required bool exists, String folderPath});
+
+  /// Return a file path composed of the provided parts as defined by the
+  /// current path context.
+  String join(String part1,
+          [String part2,
+          String part3,
+          String part4,
+          String part5,
+          String part6]) =>
+      provider.pathContext.join(part1, part2, part3, part4, part5, part6);
+}
+
+/// Unlike most test mixins, this mixin defines some abstract test methods.
+/// These are tests whose behavior differs between the two implementations of
+/// the file system and therefore need to be implemented differently. (They
+/// probably shouldn't differ, but they do.) The abstract methods exist so that
+/// we cannot forget to implement the tests for each implementation.
+mixin FileTestMixin implements FileSystemTestSupport {
+  @failingTest
+  test_changes() {
+    // TODO(brianwilkerson) Implement this.
+    fail('Not tested');
+  }
+
+  test_copyTo_existing() {
+    File file = getFile(exists: true, content: 'contents');
+    Folder destination = provider.getFolder(join(tempPath, 'destination'));
+
+    File copy = file.copyTo(destination);
+    expect(copy.parent, destination);
+    expect(copy.shortName, file.shortName);
+    expect(copy.exists, isTrue);
+    expect(copy.readAsStringSync(), 'contents');
+  }
+
+  test_copyTo_notExisting() {
+    File file = getFile(exists: false);
+    Folder destination = provider.getFolder(join(tempPath, 'destination'));
+
+    expect(() => file.copyTo(destination), throwsA(isFileSystemException));
+  }
+
+  test_createSource() {
+    File file = getFile(exists: true);
+
+    Source source = file.createSource();
+    expect(source, isNotNull);
+    expect(source.fullName, defaultFilePath);
+    expect(source.uriKind, UriKind.FILE_URI);
+    expect(source.uri, new Uri.file(defaultFilePath));
+    expect(source.exists(), isTrue);
+    expect(source.contents.data, defaultFileContent);
+  }
+
+  test_delete_existing() {
+    File file = getFile(exists: true);
+    expect(file.exists, isTrue);
+
+    file.delete();
+    expect(file.exists, isFalse);
+  }
+
+  test_delete_notExisting();
+
+  test_equals_beforeAndAfterCreate() {
+    File file1 = getFile(exists: false);
+    File file2 = getFile(exists: true);
+
+    expect(file1 == file2, isTrue);
+  }
+
+  test_equals_differentPaths() {
+    File file1 = getFile(exists: true);
+    File file2 = getFile(exists: true, filePath: join(tempPath, 'file2.txt'));
+
+    expect(file1 == file2, isFalse);
+  }
+
+  test_equals_samePath() {
+    File file1 = getFile(exists: true);
+    File file2 = provider.getResource(file1.path);
+
+    expect(file1 == file2, isTrue);
+  }
+
+  test_exists_existing() {
+    File file = getFile(exists: true);
+
+    expect(file.exists, isTrue);
+  }
+
+  test_exists_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(file.exists, isFalse);
+  }
+
+  test_hashCode_samePath() {
+    File file1 = getFile(exists: true);
+    File file2 = provider.getResource(file1.path);
+
+    expect(file1.hashCode, equals(file2.hashCode));
+  }
+
+  test_isOrContains_false() {
+    File file = getFile(exists: false);
+
+    expect(file.isOrContains(join(tempPath, 'foo', 'a.dart')), isFalse);
+  }
+
+  test_isOrContains_true() {
+    File file = getFile(exists: false);
+
+    expect(file.isOrContains(file.path), isTrue);
+  }
+
+  test_lengthSync_existing() {
+    File file = getFile(exists: true);
+    List<int> bytes = <int>[1, 2, 3, 4, 5];
+    file.writeAsBytesSync(bytes);
+
+    expect(file.lengthSync, bytes.length);
+  }
+
+  test_lengthSync_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(() => file.lengthSync, throwsA(isFileSystemException));
+  }
+
+  test_modificationStamp_existing() {
+    File file = getFile(exists: true);
+
+    expect(file.modificationStamp, isNonNegative);
+  }
+
+  test_modificationStamp_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(() => file.modificationStamp, throwsA(isFileSystemException));
+  }
+
+  test_parent() {
+    File file = getFile(exists: true);
+
+    Folder parent = file.parent;
+    expect(parent, isNotNull);
+    expect(parent.exists, isTrue);
+    expect(parent.path, defaultFolderPath);
+  }
+
+  test_path() {
+    File file = getFile(exists: false);
+
+    expect(file.path, defaultFilePath);
+  }
+
+  test_readAsBytesSync_existing() {
+    File file = getFile(exists: true);
+
+    expect(file.readAsBytesSync(), <int>[97]);
+  }
+
+  test_readAsBytesSync_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(() => file.readAsBytesSync(), throwsA(isFileSystemException));
+  }
+
+  test_readAsStringSync_existing() {
+    File file = getFile(exists: true);
+
+    expect(file.readAsStringSync(), defaultFileContent);
+  }
+
+  test_readAsStringSync_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(() => file.readAsStringSync(), throwsA(isFileSystemException));
+  }
+
+  test_renameSync_existing() {
+    String oldPath = join(tempPath, 'file.txt');
+    String newPath = join(tempPath, 'new-file.txt');
+    File oldFile = getFile(exists: true, filePath: oldPath);
+
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, oldPath);
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), defaultFileContent);
+  }
+
+  test_renameSync_existing_conflictsWithFile() {
+    String oldPath = join(tempPath, 'file.txt');
+    String newPath = join(tempPath, 'new-file.txt');
+    File oldFile = getFile(content: 'old', exists: true, filePath: oldPath);
+    File newFile = getFile(content: 'new', exists: true, filePath: newPath);
+
+    oldFile.renameSync(newPath);
+    expect(oldFile.path, oldPath);
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), 'old');
+  }
+
+  test_renameSync_existing_conflictsWithFolder() {
+    String oldPath = join(tempPath, 'file.txt');
+    String newPath = join(tempPath, 'new-baz');
+    File oldFile = getFile(exists: true, filePath: oldPath);
+    Folder newFolder = getFolder(exists: true, folderPath: newPath);
+
+    expect(() => oldFile.renameSync(newPath), throwsA(isFileSystemException));
+    expect(oldFile.path, oldPath);
+    expect(oldFile.exists, isTrue);
+    expect(newFolder.path, newPath);
+    expect(newFolder.exists, isTrue);
+  }
+
+  test_renameSync_notExisting();
+
+  test_resolveSymbolicLinksSync_links_existing();
+
+  test_resolveSymbolicLinksSync_noLinks_existing() {
+    File file = getFile(exists: true);
+
+    expect(file.resolveSymbolicLinksSync(), file);
+  }
+
+  test_resolveSymbolicLinksSync_noLinks_notExisting();
+
+  test_shortName() {
+    File file = getFile(exists: false);
+
+    expect(file.shortName, 'test.dart');
+  }
+
+  test_toString() {
+    File file = getFile(exists: false);
+
+    expect(file.toString(), defaultFilePath);
+  }
+
+  test_toUri() {
+    File file = getFile(exists: true);
+
+    expect(file.toUri(), new Uri.file(file.path));
+  }
+
+  test_writeAsBytesSync_existing() {
+    File file = getFile(exists: true);
+
+    file.writeAsBytesSync(<int>[99, 99]);
+    expect(file.readAsBytesSync(), <int>[99, 99]);
+  }
+
+  test_writeAsBytesSync_notExisting();
+
+  test_writeAsStringSync_existing() {
+    File file = getFile(exists: true);
+
+    file.writeAsStringSync('cc');
+    expect(file.readAsStringSync(), 'cc');
+  }
+
+  test_writeAsStringSync_notExisting();
+}
+
+mixin FolderTestMixin implements FileSystemTestSupport {
+  test_canonicalizePath_absolute() {
+    Folder folder = getFolder(exists: false);
+    String path2 = join(tempPath, 'folder2');
+
+    expect(folder.canonicalizePath(path2), equals(path2));
+  }
+
+  test_canonicalizePath_absolute_dot() {
+    Folder folder = getFolder(exists: false);
+    String path2 = join(tempPath, 'folder2');
+
+    expect(folder.canonicalizePath(join(path2, '.', 'baz')),
+        equals(join(path2, 'baz')));
+  }
+
+  test_canonicalizePath_absolute_dotDot() {
+    Folder folder = getFolder(exists: false);
+    String path2 = join(tempPath, 'folder2');
+    String path3 = join(tempPath, 'folder3');
+
+    expect(
+        folder.canonicalizePath(join(path2, '..', 'folder3')), equals(path3));
+  }
+
+  test_canonicalizePath_relative() {
+    Folder folder = getFolder(exists: false);
+
+    expect(
+        folder.canonicalizePath('baz'), equals(join(defaultFolderPath, 'baz')));
+  }
+
+  test_canonicalizePath_relative_dot() {
+    Folder folder = getFolder(exists: false);
+
+    expect(folder.canonicalizePath(join('.', 'baz')),
+        equals(join(defaultFolderPath, 'baz')));
+  }
+
+  test_canonicalizePath_relative_dotDot() {
+    Folder folder = getFolder(exists: false);
+    String path2 = join(tempPath, 'folder2');
+
+    expect(folder.canonicalizePath(join('..', 'folder2')), equals(path2));
+  }
+
+  @failingTest
+  test_changes() {
+    // TODO(brianwilkerson) Implement this.
+    fail('Not tested');
+  }
+
+  test_contains_immediateChild() {
+    Folder folder = getFolder(exists: false);
+
+    expect(folder.contains(join(defaultFolderPath, 'aaa.txt')), isTrue);
+  }
+
+  test_contains_nestedChild() {
+    Folder folder = getFolder(exists: false);
+
+    expect(folder.contains(join(defaultFolderPath, 'aaa', 'bbb.txt')), isTrue);
+  }
+
+  test_contains_self() {
+    Folder folder = getFolder(exists: false);
+
+    expect(folder.contains(defaultFolderPath), isFalse);
+  }
+
+  test_contains_unrelated() {
+    Folder folder = getFolder(exists: false);
+
+    expect(folder.contains(join(tempPath, 'baz.txt')), isFalse);
+  }
+
+  test_copyTo() {
+    Folder source =
+        getFolder(exists: true, folderPath: join(tempPath, 'source'));
+    String sourcePath = source.path;
+    Folder subdirectory =
+        getFolder(exists: true, folderPath: join(sourcePath, 'subdir'));
+    String subdirectoryPath = subdirectory.path;
+    getFile(
+        exists: true,
+        content: 'file1',
+        filePath: join(sourcePath, 'file1.txt'));
+    getFile(
+        exists: true,
+        content: 'file2',
+        filePath: join(subdirectoryPath, 'file2.txt'));
+    Folder destination =
+        getFolder(exists: true, folderPath: join(tempPath, 'destination'));
+
+    Folder copy = source.copyTo(destination);
+    expect(copy.parent, destination);
+    _verifyStructure(copy, source);
+  }
+
+  test_create() {
+    Folder folder = getFolder(exists: false);
+    expect(folder.exists, isFalse);
+
+    folder.create();
+    expect(folder.exists, isTrue);
+  }
+
+  test_delete() {
+    File file =
+        getFile(exists: true, filePath: join(defaultFolderPath, 'myFile'));
+    Folder folder = file.parent;
+    expect(folder.exists, isTrue);
+    expect(file.exists, isTrue);
+
+    folder.delete();
+    expect(folder.exists, isFalse);
+    expect(file.exists, isFalse);
+  }
+
+  test_equals_differentPaths() {
+    Folder folder1 =
+        getFolder(exists: true, folderPath: join(tempPath, 'folder1'));
+    Folder folder2 =
+        getFolder(exists: true, folderPath: join(tempPath, 'folder2'));
+
+    expect(folder1 == folder2, isFalse);
+  }
+
+  test_equals_samePath() {
+    Folder folder1 = getFolder(exists: false);
+    Folder folder2 = getFolder(exists: false);
+
+    expect(folder1 == folder2, isTrue);
+  }
+
+  test_getChild_doesNotExist() {
+    Folder folder = getFolder(exists: true);
+
+    var child = folder.getChild('no-such-resource');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  test_getChild_file() {
+    Folder folder = getFolder(exists: true);
+    getFile(exists: true, filePath: join(defaultFolderPath, 'myFile'));
+
+    var child = folder.getChild('myFile');
+    expect(child, isFile);
+    expect(child.exists, isTrue);
+  }
+
+  test_getChild_folder() {
+    Folder folder = getFolder(exists: true);
+    getFolder(exists: true, folderPath: join(folder.path, 'myFolder'));
+
+    var child = folder.getChild('myFolder');
+    expect(child, isFolder);
+    expect(child.exists, isTrue);
+  }
+
+  test_getChildAssumingFile_doesNotExist() {
+    Folder folder = getFolder(exists: true);
+
+    File child = folder.getChildAssumingFile('myFile');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  test_getChildAssumingFile_file() {
+    Folder folder = getFolder(exists: true);
+    getFile(exists: true, filePath: join(defaultFolderPath, 'myFile'));
+
+    File child = folder.getChildAssumingFile('myFile');
+    expect(child, isNotNull);
+    expect(child.exists, isTrue);
+  }
+
+  test_getChildAssumingFile_folder() {
+    Folder folder = getFolder(exists: true);
+    getFolder(exists: true, folderPath: join(defaultFolderPath, 'myFolder'));
+
+    File child = folder.getChildAssumingFile('myFolder');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  test_getChildAssumingFolder_doesNotExist() {
+    Folder folder = getFolder(exists: true);
+
+    Folder child = folder.getChildAssumingFolder('myFile');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  test_getChildAssumingFolder_file() {
+    Folder folder = getFolder(exists: true);
+    getFile(exists: true, filePath: join(defaultFolderPath, 'myFile'));
+
+    Folder child = folder.getChildAssumingFolder('myFile');
+    expect(child, isNotNull);
+    expect(child.exists, isFalse);
+  }
+
+  test_getChildAssumingFolder_folder() {
+    Folder folder = getFolder(exists: true);
+    getFolder(exists: true, folderPath: join(defaultFolderPath, 'myFolder'));
+
+    Folder child = folder.getChildAssumingFolder('myFolder');
+    expect(child, isNotNull);
+    expect(child.exists, isTrue);
+  }
+
+  test_getChildren_doesNotExist() {
+    Folder folder = getFolder(exists: true);
+
+    folder = folder.getChildAssumingFolder('no-such-folder');
+    expect(() => folder.getChildren(), throwsA(isFileSystemException));
+  }
+
+  test_getChildren_exists() {
+    Folder folder = getFolder(exists: true);
+    // create 2 files and 1 folder
+    getFile(exists: true, filePath: join(defaultFolderPath, 'a.txt'));
+    getFolder(exists: true, folderPath: join(defaultFolderPath, 'bFolder'));
+    getFile(exists: true, filePath: join(defaultFolderPath, 'c.txt'));
+
+    // prepare 3 children
+    List<Resource> children = folder.getChildren();
+    expect(children, hasLength(3));
+    children.sort((a, b) => a.shortName.compareTo(b.shortName));
+    // check that each child exists
+    children.forEach((child) {
+      expect(child.exists, true);
+    });
+    // check names
+    expect(children[0].shortName, 'a.txt');
+    expect(children[1].shortName, 'bFolder');
+    expect(children[2].shortName, 'c.txt');
+    // check types
+    expect(children[0], isFile);
+    expect(children[1], isFolder);
+    expect(children[2], isFile);
+  }
+
+  test_hashCode() {
+    Folder folder1 = getFolder(exists: false);
+    Folder folder2 = getFolder(exists: false);
+
+    expect(folder1.hashCode, folder2.hashCode);
+  }
+
+  test_isOrContains_containedFile() {
+    Folder folder = getFolder(exists: true);
+
+    expect(folder.isOrContains(join(defaultFolderPath, 'aaa.txt')), isTrue);
+  }
+
+  test_isOrContains_deeplyContained() {
+    Folder folder = getFolder(exists: true);
+
+    expect(
+        folder.isOrContains(join(defaultFolderPath, 'aaa', 'bbb.txt')), isTrue);
+  }
+
+  test_isOrContains_notContained() {
+    Folder folder = getFolder(exists: true);
+
+    expect(folder.isOrContains(join(tempPath, 'baz.txt')), isFalse);
+  }
+
+  test_isOrContains_same() {
+    Folder folder = getFolder(exists: true);
+
+    expect(folder.isOrContains(defaultFolderPath), isTrue);
+  }
+
+  test_parent() {
+    Folder folder = getFolder(exists: true);
+
+    Folder parent = folder.parent;
+    expect(parent.path, equals(tempPath));
+    //
+    // Since the OS is in control of where tempPath is, we don't know how far it
+    // should be from the root. So just verify that each call to parent results
+    // in a folder with a shorter path, and that we reach the root eventually.
+    //
+    while (true) {
+      Folder grandParent = parent.parent;
+      if (grandParent == null) {
+        break;
+      }
+      expect(grandParent.path.length, lessThan(parent.path.length));
+      parent = grandParent;
+    }
+  }
+
+  test_toUri() {
+    Folder folder = getFolder(exists: true);
+
+    expect(folder.toUri(), new Uri.directory(defaultFolderPath));
+  }
+
+  /**
+   * Verify that the [copy] has the same name and content as the [source].
+   */
+  void _verifyStructure(Folder copy, Folder source) {
+    expect(copy.shortName, source.shortName);
+    Map<String, File> sourceFiles = <String, File>{};
+    Map<String, Folder> sourceFolders = <String, Folder>{};
+    for (Resource child in source.getChildren()) {
+      if (child is File) {
+        sourceFiles[child.shortName] = child;
+      } else if (child is Folder) {
+        sourceFolders[child.shortName] = child;
+      } else {
+        fail('Unknown class of resource: ${child.runtimeType}');
+      }
+    }
+    Map<String, File> copyFiles = <String, File>{};
+    Map<String, Folder> copyFolders = <String, Folder>{};
+    for (Resource child in source.getChildren()) {
+      if (child is File) {
+        copyFiles[child.shortName] = child;
+      } else if (child is Folder) {
+        copyFolders[child.shortName] = child;
+      } else {
+        fail('Unknown class of resource: ${child.runtimeType}');
+      }
+    }
+    for (String fileName in sourceFiles.keys) {
+      File sourceChild = sourceFiles[fileName];
+      File copiedChild = copyFiles[fileName];
+      if (copiedChild == null) {
+        fail('Failed to copy file ${sourceChild.path}');
+      }
+      expect(copiedChild.readAsStringSync(), sourceChild.readAsStringSync(),
+          reason: 'Incorrectly copied file ${sourceChild.path}');
+    }
+    for (String fileName in sourceFolders.keys) {
+      Folder sourceChild = sourceFolders[fileName];
+      Folder copiedChild = copyFolders[fileName];
+      if (copiedChild == null) {
+        fail('Failed to copy folder ${sourceChild.path}');
+      }
+      _verifyStructure(copiedChild, sourceChild);
+    }
+  }
+}
+
+mixin ResourceProviderTestMixin implements FileSystemTestSupport {
+  test_getFile_existing() {
+    getFile(exists: true);
+
+    File file = provider.getFile(defaultFilePath);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isTrue);
+  }
+
+  test_getFile_notExisting() {
+    File file = provider.getFile(defaultFilePath);
+    expect(file, isNotNull);
+    expect(file.path, defaultFilePath);
+    expect(file.exists, isFalse);
+  }
+
+  test_getFolder_existing() {
+    getFolder(exists: true);
+
+    Folder folder = provider.getFolder(defaultFolderPath);
+    expect(folder, isNotNull);
+    expect(folder.path, defaultFolderPath);
+    expect(folder.exists, isTrue);
+  }
+
+  test_getFolder_notExisting() {
+    Folder folder = provider.getFolder(defaultFolderPath);
+    expect(folder, isNotNull);
+    expect(folder.path, defaultFolderPath);
+    expect(folder.exists, isFalse);
+  }
+
+  test_getModificationTimes_existing() async {
+    Source source = getFile(exists: true).createSource();
+
+    List<int> times = await provider.getModificationTimes([source]);
+    expect(times, [source.modificationStamp]);
+  }
+
+  test_getModificationTimes_notExisting() async {
+    Source source = getFile(exists: false).createSource();
+
+    List<int> times = await provider.getModificationTimes([source]);
+    expect(times, [-1]);
+  }
+
+  test_getResource_file_existing() {
+    String filePath = getFile(exists: true).path;
+
+    Resource resource = provider.getResource(filePath);
+    expect(resource, isFile);
+  }
+
+  test_getResource_folder_existing() {
+    String filePath = getFolder(exists: true).path;
+
+    Resource resource = provider.getResource(filePath);
+    expect(resource, isFolder);
+  }
+
+  test_getResource_notExisting() {
+    String resourcePath = getFile(exists: false).path;
+
+    Resource resource = provider.getResource(resourcePath);
+    expect(resource, isFile);
+  }
+
+  test_getStateLocation_uniqueness() {
+    Folder folderOne = provider.getStateLocation('one');
+    expect(folderOne, isNotNull);
+
+    Folder folderTwo = provider.getStateLocation('two');
+    expect(folderTwo, isNotNull);
+    expect(folderTwo, isNot(equals(folderOne)));
+
+    expect(provider.getStateLocation('one'), equals(folderOne));
+  }
+
+  test_pathContext() {
+    expect(provider.pathContext, path.context);
+  }
+}
diff --git a/pkg/analyzer/test/file_system/memory_file_system_test.dart b/pkg/analyzer/test/file_system/memory_file_system_test.dart
index 1c58e09..443e842 100644
--- a/pkg/analyzer/test/file_system/memory_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/memory_file_system_test.dart
@@ -3,36 +3,92 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:core';
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:path/path.dart' as pathos;
+import 'package:meta/meta.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:watcher/watcher.dart';
 
+import 'file_system_test_support.dart';
+
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FileSystemExceptionTest);
-    defineReflectiveTests(FileTest);
-    defineReflectiveTests(FolderTest);
     defineReflectiveTests(MemoryFileSourceExistingTest);
     defineReflectiveTests(MemoryFileSourceNotExistingTest);
+    defineReflectiveTests(MemoryFileTest);
+    defineReflectiveTests(MemoryFolderTest);
     defineReflectiveTests(MemoryResourceProviderTest);
   });
 }
 
-final _isFile = new TypeMatcher<File>();
-final _isFileSystemException = new TypeMatcher<FileSystemException>();
-final _isFolder = new TypeMatcher<Folder>();
+abstract class BaseTest extends FileSystemTestSupport {
+  /// The resource provider to be used by the tests. Tests should use [provider]
+  /// to access the resource provider.
+  MemoryResourceProvider _provider;
+
+  /// The absolute path to the temporary directory in which all of the tests are
+  /// to work.
+  String tempPath;
+
+  /// A path to a folder within the [tempPath] that can be used by tests.
+  String defaultFolderPath;
+
+  /// A path to a file within the [defaultFolderPath] that can be used by tests.
+  String defaultFilePath;
+
+  /// The content used for the file at the [defaultFilePath] if it is created
+  /// and no other content is provided.
+  String get defaultFileContent => 'a';
+
+  /// Return the resource provider to be used by the tests.
+  MemoryResourceProvider get provider => _provider ??= createProvider();
+
+  /// Create the resource provider to be used by the tests. Subclasses can
+  /// override this method to change the class of resource provider that is
+  /// used.
+  MemoryResourceProvider createProvider() => new MemoryResourceProvider();
+
+  File getFile({@required bool exists, String content, String filePath}) {
+    if (filePath == null) {
+      filePath = defaultFilePath;
+    } else {
+      filePath = provider.convertPath(filePath);
+    }
+    if (exists) {
+      provider.newFile(filePath, content ?? defaultFileContent);
+    }
+    return provider.getFile(filePath);
+  }
+
+  Folder getFolder({@required bool exists, String folderPath}) {
+    if (folderPath == null) {
+      folderPath = defaultFolderPath;
+    } else {
+      folderPath = provider.convertPath(folderPath);
+    }
+    if (exists) {
+      provider.newFolder(folderPath);
+    }
+    return provider.getFolder(folderPath);
+  }
+
+  setUp() {
+    tempPath = provider.convertPath('/temp');
+    defaultFolderPath = join(tempPath, 'bar');
+    defaultFilePath = join(tempPath, 'bar', 'test.dart');
+  }
+}
 
 @reflectiveTest
 class FileSystemExceptionTest {
-  void test_constructor() {
+  test_constructor() {
     var exception = new FileSystemException('/my/path', 'my message');
     expect(exception.path, '/my/path');
     expect(exception.message, 'my message');
@@ -42,766 +98,289 @@
 }
 
 @reflectiveTest
-class FileTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-
-  void test_copy() {
-    String contents = 'contents';
-    File file =
-        provider.newFile(provider.convertPath('/foo/file.txt'), contents);
-    Folder destination =
-        provider.getFolder(provider.convertPath('/destination'));
-
-    File copy = file.copyTo(destination);
-    expect(copy.parent, destination);
-    expect(copy.shortName, file.shortName);
-    expect(copy.readAsStringSync(), contents);
-  }
-
-  void test_delete() {
-    File file =
-        provider.newFile(provider.convertPath('/foo/file.txt'), 'content');
-    expect(file.exists, isTrue);
-    // delete
-    file.delete();
-    expect(file.exists, isFalse);
-  }
-
-  void test_equals_beforeAndAfterCreate() {
-    String path = provider.convertPath('/file.txt');
-    File file1 = provider.getResource(path);
-    provider.newFile(path, 'contents');
-    File file2 = provider.getResource(path);
-    expect(file1 == file2, isTrue);
-  }
-
-  void test_equals_false() {
-    File fileA = provider.getResource(provider.convertPath('/fileA.txt'));
-    File fileB = provider.getResource(provider.convertPath('/fileB.txt'));
-    expect(fileA == new Object(), isFalse);
-    expect(fileA == fileB, isFalse);
-  }
-
-  void test_equals_true() {
-    File file = provider.getResource(provider.convertPath('/file.txt'));
-    expect(file == file, isTrue);
-  }
-
-  void test_exists_false() {
-    File file = provider.getResource(provider.convertPath('/file.txt'));
-    expect(file, isNotNull);
-    expect(file.exists, isFalse);
-  }
-
-  void test_exists_true() {
-    String path = provider.convertPath('/foo/file.txt');
-    provider.newFile(path, 'qwerty');
-    File file = provider.getResource(path);
-    expect(file, isNotNull);
-    expect(file.exists, isTrue);
-  }
-
-  void test_fullName() {
-    String path = provider.convertPath('/foo/bar/file.txt');
-    File file = provider.getResource(path);
-    expect(file.path, path);
-  }
-
-  void test_hashCode() {
-    String path = provider.convertPath('/foo/bar/file.txt');
-    File file1 = provider.getResource(path);
-    provider.newFile(path, 'contents');
-    File file2 = provider.getResource(path);
-    expect(file1.hashCode, equals(file2.hashCode));
-  }
-
-  void test_isOrContains() {
-    String path = provider.convertPath('/foo/bar/file.txt');
-    File file = provider.getResource(path);
-    expect(file.isOrContains(path), isTrue);
-    expect(file.isOrContains(provider.convertPath('/foo/bar')), isFalse);
-  }
-
-  void test_lengthSync_doesNotExist() {
-    File file = provider.getResource(provider.convertPath('/test.txt'));
-    expect(() {
-      file.lengthSync;
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_lengthSync_exists() {
-    List<int> bytes = <int>[1, 2, 3, 4, 5];
-    File file =
-        provider.newFileWithBytes(provider.convertPath('/file.bin'), bytes);
-    expect(file.lengthSync, bytes.length);
-  }
-
-  void test_modificationStamp_doesNotExist() {
-    String path = provider.convertPath('/foo/bar/file.txt');
-    File file = provider.newFile(path, 'qwerty');
-    provider.deleteFile(path);
-    expect(() {
-      file.modificationStamp;
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_modificationStamp_exists() {
-    String path = provider.convertPath('/foo/bar/file.txt');
-    File file = provider.newFile(path, 'qwerty');
-    expect(file.modificationStamp, isNonNegative);
-  }
-
-  void test_parent() {
-    String path = provider.convertPath('/foo/bar/file.txt');
-    provider.newFile(path, 'content');
-    File file = provider.getResource(path);
-    Resource parent = file.parent;
-    expect(parent, _isFolder);
-    expect(parent.path, equals(provider.convertPath('/foo/bar')));
-  }
-
-  void test_readAsBytesSync_doesNotExist() {
-    File file = provider.getResource(provider.convertPath('/test.bin'));
-    expect(() {
-      file.readAsBytesSync();
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_readAsBytesSync_exists() {
-    List<int> bytes = <int>[1, 2, 3, 4, 5];
-    File file =
-        provider.newFileWithBytes(provider.convertPath('/file.bin'), bytes);
-    expect(file.readAsBytesSync(), bytes);
-  }
-
-  void test_readAsStringSync_doesNotExist() {
-    File file = provider.getResource(provider.convertPath('/test.txt'));
-    expect(() {
-      file.readAsStringSync();
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_readAsStringSync_exists() {
-    File file = provider.newFile(provider.convertPath('/file.txt'), 'abc');
-    expect(file.readAsStringSync(), 'abc');
-  }
-
-  void test_renameSync_newDoesNotExist() {
-    String oldPath = provider.convertPath('/foo/bar/file.txt');
-    String newPath = provider.convertPath('/foo/bar/new-file.txt');
-    File file = provider.newFile(oldPath, 'text');
-    File newFile = file.renameSync(newPath);
-    expect(file.path, oldPath);
-    expect(file.exists, isFalse);
-    expect(newFile.path, newPath);
-    expect(newFile.exists, isTrue);
-    expect(newFile.readAsStringSync(), 'text');
-  }
-
-  void test_renameSync_newExists_file() {
-    String oldPath = provider.convertPath('/foo/bar/file.txt');
-    String newPath = provider.convertPath('/foo/bar/new-file.txt');
-    File file = provider.newFile(oldPath, 'text');
-    provider.newFile(newPath, 'new text');
-    File newFile = file.renameSync(newPath);
-    expect(file.path, oldPath);
-    expect(file.exists, isFalse);
-    expect(newFile.path, newPath);
-    expect(newFile.exists, isTrue);
-    expect(newFile.readAsStringSync(), 'text');
-  }
-
-  void test_renameSync_newExists_folder() {
-    String oldPath = provider.convertPath('/foo/bar/file.txt');
-    String newPath = provider.convertPath('/foo/bar/baz');
-    File file = provider.newFile(oldPath, 'text');
-    provider.newFolder(newPath);
-    expect(() {
-      file.renameSync(newPath);
-    }, throwsA(_isFileSystemException));
-    expect(file.path, oldPath);
-    expect(file.exists, isTrue);
-  }
-
-  void test_resolveSymbolicLinksSync() {
-    File file = provider.newFile(provider.convertPath('/test.txt'), 'text');
-    expect(file.resolveSymbolicLinksSync(), file);
-  }
-
-  void test_shortName() {
-    File file = provider.getResource(provider.convertPath('/foo/bar/file.txt'));
-    expect(file.shortName, 'file.txt');
-  }
-
-  void test_toString() {
-    String path = provider.convertPath('/foo/bar/file.txt');
-    File file = provider.getResource(path);
-    expect(file.toString(), path);
-  }
-
-  void test_toUri() {
-    String path = provider.convertPath('/foo/file.txt');
-    File file = provider.newFile(path, '');
-    expect(file.toUri(), provider.pathContext.toUri(path));
-  }
-
-  void test_writeAsBytesSync_existing() {
-    List<int> content = <int>[1, 2];
-    File file = provider.newFileWithBytes(
-        provider.convertPath('/foo/file.bin'), content);
-    expect(file.readAsBytesSync(), content);
-    // write new bytes
-    content = <int>[10, 20];
-    file.writeAsBytesSync(content);
-    expect(file.readAsBytesSync(), content);
-  }
-
-  void test_writeAsBytesSync_new() {
-    File file = provider.getFile(provider.convertPath('/foo/file.bin'));
-    expect(file.exists, false);
-    // write new bytes
-    List<int> content = <int>[10, 20];
-    file.writeAsBytesSync(content);
-    expect(file.exists, true);
-    expect(file.readAsBytesSync(), content);
-  }
-
-  void test_writeAsStringSync_existing() {
-    String content = 'ab';
-    File file =
-        provider.newFile(provider.convertPath('/foo/file.txt'), content);
-    expect(file.readAsStringSync(), content);
-    // write new bytes
-    content = 'CD';
-    file.writeAsStringSync(content);
-    expect(file.readAsStringSync(), content);
-  }
-
-  void test_writeAsStringSync_new() {
-    File file = provider.getFile(provider.convertPath('/foo/file.txt'));
-    expect(file.exists, false);
-    // write new bytes
-    String content = 'ef';
-    file.writeAsStringSync(content);
-    expect(file.exists, true);
-    expect(file.readAsStringSync(), content);
-  }
-}
-
-@reflectiveTest
-class FolderTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-  String path;
-  Folder folder;
-
-  void setUp() {
-    path = provider.convertPath('/foo/bar');
-    folder = provider.newFolder(path);
-  }
-
-  void test_canonicalizePath() {
-    expect(folder.canonicalizePath(provider.convertPath('baz')),
-        equals(provider.convertPath('/foo/bar/baz')));
-    expect(folder.canonicalizePath(provider.convertPath('/baz')),
-        equals(provider.convertPath('/baz')));
-    expect(folder.canonicalizePath(provider.convertPath('../baz')),
-        equals(provider.convertPath('/foo/baz')));
-    expect(folder.canonicalizePath(provider.convertPath('/a/b/../c')),
-        equals(provider.convertPath('/a/c')));
-    expect(folder.canonicalizePath(provider.convertPath('./baz')),
-        equals(provider.convertPath('/foo/bar/baz')));
-    expect(folder.canonicalizePath(provider.convertPath('/a/b/./c')),
-        equals(provider.convertPath('/a/b/c')));
-  }
-
-  void test_contains() {
-    expect(folder.contains(provider.convertPath('/foo/bar/aaa.txt')), isTrue);
-    expect(
-        folder.contains(provider.convertPath('/foo/bar/aaa/bbb.txt')), isTrue);
-    expect(folder.contains(provider.convertPath('/baz.txt')), isFalse);
-    expect(folder.contains(provider.convertPath('/foo/bar')), isFalse);
-  }
-
-  void test_copy() {
-    String sourcePath = provider.convertPath('/source');
-    String subdirPath = provider.convertPath('/source/subdir');
-    provider.newFolder(sourcePath);
-    provider.newFolder(subdirPath);
-    provider.newFile(provider.convertPath('/source/file1.txt'), 'file1');
-    provider.newFile(provider.convertPath('/source/subdir/file2.txt'), 'file2');
-    Folder source = provider.getFolder(sourcePath);
-    Folder destination =
-        provider.getFolder(provider.convertPath('/destination'));
-
-    Folder copy = source.copyTo(destination);
-    expect(copy.parent, destination);
-    _verifyStructure(copy, source);
-  }
-
-  void test_delete() {
-    Folder folder = provider.newFolder(provider.convertPath('/foo'));
-    Folder barFolder = provider.newFolder(provider.convertPath('/foo/bar'));
-    File aFile = provider.newFile(provider.convertPath('/foo/bar/a.txt'), '');
-    File bFile = provider.newFile(provider.convertPath('/foo/b.txt'), '');
-    expect(folder.exists, isTrue);
-    expect(barFolder.exists, isTrue);
-    expect(aFile.exists, isTrue);
-    expect(bFile.exists, isTrue);
-    // delete 'folder'
-    folder.delete();
-    expect(folder.exists, isFalse);
-    expect(barFolder.exists, isFalse);
-    expect(aFile.exists, isFalse);
-    expect(bFile.exists, isFalse);
-  }
-
-  void test_equal_false() {
-    String path2 = provider.convertPath('/foo/baz');
-    Folder folder2 = provider.newFolder(path2);
-    expect(folder == folder2, isFalse);
-  }
-
-  void test_equal_true() {
-    Folder folder2 = provider.getResource(path);
-    expect(folder == folder2, isTrue);
-  }
-
-  void test_getChild_doesNotExist() {
-    File file = folder.getChild('file.txt');
-    expect(file, isNotNull);
-    expect(file.exists, isFalse);
-  }
-
-  void test_getChild_file() {
-    provider.newFile(provider.convertPath('/foo/bar/file.txt'), 'content');
-    File child = folder.getChild('file.txt');
-    expect(child, isNotNull);
-    expect(child.exists, isTrue);
-  }
-
-  void test_getChild_folder() {
-    provider.newFolder(provider.convertPath('/foo/bar/baz'));
-    Folder child = folder.getChild('baz');
-    expect(child, isNotNull);
-    expect(child.exists, isTrue);
-  }
-
-  void test_getChildAssumingFile_doesNotExist() {
-    File child = folder.getChildAssumingFile('name');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChildAssumingFile_file() {
-    provider.newFile(provider.convertPath('/foo/bar/name'), 'content');
-    File child = folder.getChildAssumingFile('name');
-    expect(child, isNotNull);
-    expect(child.exists, isTrue);
-  }
-
-  void test_getChildAssumingFile_folder() {
-    provider.newFolder(provider.convertPath('/foo/bar/name'));
-    File child = folder.getChildAssumingFile('name');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChildAssumingFolder_doesNotExist() {
-    Folder child = folder.getChildAssumingFolder('foldername');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChildAssumingFolder_file() {
-    provider.newFile(provider.convertPath('/foo/bar/foldername'), 'content');
-    Folder child = folder.getChildAssumingFolder('foldername');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChildAssumingFolder_folder() {
-    provider.newFolder(provider.convertPath('/foo/bar/foldername'));
-    Folder child = folder.getChildAssumingFolder('foldername');
-    expect(child, isNotNull);
-    expect(child.exists, isTrue);
-  }
-
-  void test_getChildren_doesNotExist() {
-    folder = folder.getChildAssumingFolder('no-such-folder');
-    expect(() {
-      folder.getChildren();
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_getChildren_exists() {
-    provider.newFile(provider.convertPath('/foo/bar/a.txt'), 'aaa');
-    provider.newFolder(provider.convertPath('/foo/bar/bFolder'));
-    provider.newFile(provider.convertPath('/foo/bar/c.txt'), 'ccc');
-    // prepare 3 children
-    List<Resource> children = folder.getChildren();
-    expect(children, hasLength(3));
-    children.sort((a, b) => a.shortName.compareTo(b.shortName));
-    // check that each child exists
-    children.forEach((child) {
-      expect(child.exists, true);
-    });
-    // check names
-    expect(children[0].shortName, 'a.txt');
-    expect(children[1].shortName, 'bFolder');
-    expect(children[2].shortName, 'c.txt');
-    // check types
-    expect(children[0], _isFile);
-    expect(children[1], _isFolder);
-    expect(children[2], _isFile);
-  }
-
-  void test_hashCode() {
-    Folder folder2 = provider.getResource(path);
-    expect(folder.hashCode, folder2.hashCode);
-  }
-
-  void test_isOrContains() {
-    expect(folder.isOrContains(provider.convertPath('/foo/bar')), isTrue);
-    expect(
-        folder.isOrContains(provider.convertPath('/foo/bar/aaa.txt')), isTrue);
-    expect(folder.isOrContains(provider.convertPath('/foo/bar/aaa/bbb.txt')),
-        isTrue);
-    expect(folder.isOrContains(provider.convertPath('/baz.txt')), isFalse);
-  }
-
-  void test_parent() {
-    Resource parent1 = folder.parent;
-    expect(parent1, _isFolder);
-    expect(parent1.path, equals(provider.convertPath('/foo')));
-    Resource parent2 = parent1.parent;
-    expect(parent2, _isFolder);
-    expect(parent2.path, equals(provider.convertPath('/')));
-    expect(parent2.parent, isNull);
-  }
-
-  void test_toUri() {
-    String path = provider.convertPath('/foo/directory');
-    Folder folder = provider.newFolder(path);
-    expect(folder.toUri(), provider.pathContext.toUri(path + '/'));
-  }
-
-  /**
-   * Verify that the [copy] has the same name and content as the [source].
-   */
-  void _verifyStructure(Folder copy, Folder source) {
-    expect(copy.shortName, source.shortName);
-    Map<String, File> sourceFiles = <String, File>{};
-    Map<String, Folder> sourceFolders = <String, Folder>{};
-    for (Resource child in source.getChildren()) {
-      if (child is File) {
-        sourceFiles[child.shortName] = child;
-      } else if (child is Folder) {
-        sourceFolders[child.shortName] = child;
-      } else {
-        fail('Unknown class of resource: ${child.runtimeType}');
-      }
-    }
-    Map<String, File> copyFiles = <String, File>{};
-    Map<String, Folder> copyFolders = <String, Folder>{};
-    for (Resource child in source.getChildren()) {
-      if (child is File) {
-        copyFiles[child.shortName] = child;
-      } else if (child is Folder) {
-        copyFolders[child.shortName] = child;
-      } else {
-        fail('Unknown class of resource: ${child.runtimeType}');
-      }
-    }
-    for (String fileName in sourceFiles.keys) {
-      File sourceChild = sourceFiles[fileName];
-      File copiedChild = copyFiles[fileName];
-      if (copiedChild == null) {
-        fail('Failed to copy file ${sourceChild.path}');
-      }
-      expect(copiedChild.readAsStringSync(), sourceChild.readAsStringSync(),
-          reason: 'Incorrectly copied file ${sourceChild.path}');
-    }
-    for (String fileName in sourceFolders.keys) {
-      Folder sourceChild = sourceFolders[fileName];
-      Folder copiedChild = copyFolders[fileName];
-      if (copiedChild == null) {
-        fail('Failed to copy folder ${sourceChild.path}');
-      }
-      _verifyStructure(copiedChild, sourceChild);
-    }
-  }
-}
-
-@reflectiveTest
-class MemoryFileSourceExistingTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-  String path;
+class MemoryFileSourceExistingTest extends BaseTest {
+  String sourcePath;
   Source source;
 
   setUp() {
-    path = provider.convertPath('/foo/test.dart');
-    File file = provider.newFile(path, 'library test;');
+    super.setUp();
+    File file = getFile(exists: true);
+    sourcePath = file.path;
     source = file.createSource();
   }
 
-  void test_contents() {
+  test_contents() {
     TimestampedData<String> contents = source.contents;
-    expect(contents.data, 'library test;');
+    expect(contents.data, defaultFileContent);
   }
 
-  void test_encoding() {
-    String expected = 'file:///foo/test.dart';
-    if (provider.pathContext.style == pathos.windows.style) {
-      expected = 'file:///C:/foo/test.dart';
-    }
-    expect(source.encoding, expected);
+  test_encoding() {
+    expect(source.encoding, new Uri.file(defaultFilePath).toString());
   }
 
-  void test_equals_false_differentFile() {
-    File fileA = provider.newFile(provider.convertPath('/foo/a.dart'), '');
-    File fileB = provider.newFile(provider.convertPath('/foo/b.dart'), '');
+  test_equals_false_differentFile() {
+    File fileA = getFile(exists: false, filePath: join(tempPath, 'a.dart'));
+    File fileB = getFile(exists: false, filePath: join(tempPath, 'b.dart'));
     Source sourceA = fileA.createSource();
     Source sourceB = fileB.createSource();
+
     expect(sourceA == sourceB, isFalse);
   }
 
-  void test_equals_false_notMemorySource() {
-    File file = provider.newFile(path, '');
-    Source source = file.createSource();
+  test_equals_false_notMemorySource() {
     expect(source == new Object(), isFalse);
   }
 
-  void test_equals_true_sameFile() {
-    File file = provider.newFile(path, '');
-    Source sourceA = file.createSource();
-    Source sourceB = file.createSource();
+  test_equals_true_sameFile() {
+    Source sourceA = getFile(exists: false).createSource();
+    Source sourceB = getFile(exists: false).createSource();
+
     expect(sourceA == sourceB, isTrue);
   }
 
-  void test_equals_true_self() {
-    File file = provider.newFile(path, '');
-    Source source = file.createSource();
+  test_equals_true_self() {
     expect(source == source, isTrue);
   }
 
-  void test_exists() {
+  test_exists() {
     expect(source.exists(), isTrue);
   }
 
-  void test_fullName() {
-    expect(source.fullName, path);
+  test_fullName() {
+    expect(source.fullName, sourcePath);
   }
 
-  void test_hashCode() {
-    source.hashCode;
+  test_hashCode() {
+    expect(source.hashCode, isNotNull);
   }
 
-  void test_resolveRelative() {
+  test_resolveRelative() {
     Uri relative = resolveRelativeUri(
         source.uri,
         provider.pathContext
             .toUri(provider.pathContext.join('bar', 'baz.dart')));
-    expect(relative,
-        provider.pathContext.toUri(provider.convertPath('/foo/bar/baz.dart')));
+    expect(
+        relative,
+        provider.pathContext
+            .toUri(provider.convertPath('/temp/bar/bar/baz.dart')));
   }
 
-  void test_resolveRelative_dart() {
-    File file =
-        provider.newFile(provider.convertPath('/sdk/lib/core/core.dart'), '');
+  test_resolveRelative_dart() {
+    File file = getFile(
+        exists: false,
+        filePath: provider.convertPath('/sdk/lib/core/core.dart'));
     Source source = file.createSource(Uri.parse('dart:core'));
+
     Uri resolved = resolveRelativeUri(source.uri, Uri.parse('int.dart'));
     expect(resolved.toString(), 'dart:core/int.dart');
   }
 
-  void test_shortName() {
+  test_shortName() {
     expect(source.shortName, 'test.dart');
   }
 }
 
 @reflectiveTest
-class MemoryFileSourceNotExistingTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-  String path;
+class MemoryFileSourceNotExistingTest extends BaseTest {
+  String sourcePath;
   Source source;
 
   setUp() {
-    path = provider.convertPath('/foo/test.dart');
-    File file = provider.getResource(path);
+    super.setUp();
+    File file = getFile(exists: false);
+    sourcePath = file.path;
     source = file.createSource();
   }
 
-  void test_contents() {
-    expect(() {
-      source.contents;
-    }, throwsA(_isFileSystemException));
+  test_contents() {
+    expect(() => source.contents, throwsA(isFileSystemException));
   }
 
-  void test_encoding() {
-    String expected = 'file:///foo/test.dart';
-    if (provider.pathContext.style == pathos.windows.style) {
-      expected = 'file:///C:/foo/test.dart';
-    }
-    expect(source.encoding, expected);
+  test_encoding() {
+    expect(source.encoding, new Uri.file(defaultFilePath).toString());
   }
 
-  void test_exists() {
+  test_exists() {
     expect(source.exists(), isFalse);
   }
 
-  void test_fullName() {
-    expect(source.fullName, path);
+  test_fullName() {
+    expect(source.fullName, sourcePath);
   }
 
-  void test_modificationStamp() {
+  test_modificationStamp() {
     expect(source.modificationStamp, -1);
   }
 
-  void test_resolveRelative() {
+  test_resolveRelative() {
     Uri relative = resolveRelativeUri(
         source.uri,
         provider.pathContext
             .toUri(provider.pathContext.join('bar', 'baz.dart')));
-    expect(relative,
-        provider.pathContext.toUri(provider.convertPath('/foo/bar/baz.dart')));
+    expect(
+        relative,
+        provider.pathContext
+            .toUri(provider.convertPath('/temp/bar/bar/baz.dart')));
   }
 
-  void test_shortName() {
+  test_shortName() {
     expect(source.shortName, 'test.dart');
   }
 }
 
 @reflectiveTest
-class MemoryResourceProviderTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-
-  void test_deleteFile_folder() {
-    String path = provider.convertPath('/my/file');
-    provider.newFolder(path);
-    expect(() {
-      provider.deleteFile(path);
-    }, throwsArgumentError);
-    expect(provider.getResource(path), _isFolder);
-  }
-
-  void test_deleteFile_notExistent() {
-    String path = provider.convertPath('/my/file');
-    expect(() {
-      provider.deleteFile(path);
-    }, throwsArgumentError);
-    Resource file = provider.getResource(path);
-    expect(file, isNotNull);
+class MemoryFileTest extends BaseTest with FileTestMixin {
+  @override
+  test_delete_notExisting() {
+    File file = getFile(exists: false);
     expect(file.exists, isFalse);
+
+    expect(() => file.delete(), throwsA(const TypeMatcher<ArgumentError>()));
   }
 
-  void test_deleteFile_success() {
-    String path = provider.convertPath('/my/file');
-    provider.newFile(path, 'contents');
-    Resource file = provider.getResource(path);
-    expect(file, _isFile);
+  @override
+  test_renameSync_notExisting() {
+    String oldPath = join(tempPath, 'file.txt');
+    String newPath = join(tempPath, 'new-file.txt');
+    File oldFile = getFile(exists: true, filePath: oldPath);
+
+    File newFile = oldFile.renameSync(newPath);
+    expect(oldFile.path, oldPath);
+    expect(oldFile.exists, isFalse);
+    expect(newFile.path, newPath);
+    expect(newFile.exists, isTrue);
+    expect(newFile.readAsStringSync(), defaultFileContent);
+  }
+
+  @failingTest
+  @override
+  test_resolveSymbolicLinksSync_links_existing() {
+    // TODO(brianwilkerson) Decide how to test this given that we cannot
+    // create a link in a MemoryResourceProvider.
+    fail('Not tested');
+  }
+
+  @override
+  test_resolveSymbolicLinksSync_noLinks_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(file.resolveSymbolicLinksSync(), file);
+  }
+
+  @override
+  test_writeAsBytesSync_notExisting() {
+    File file = getFile(exists: false);
+
+    file.writeAsBytesSync(<int>[99, 99]);
+    expect(file.exists, true);
+    expect(file.readAsBytesSync(), <int>[99, 99]);
+  }
+
+  @override
+  test_writeAsStringSync_notExisting() {
+    File file = getFile(exists: false);
+
+    file.writeAsStringSync('cc');
+    expect(file.exists, true);
+    expect(file.readAsStringSync(), 'cc');
+  }
+}
+
+@reflectiveTest
+class MemoryFolderTest extends BaseTest with FolderTestMixin {}
+
+@reflectiveTest
+class MemoryResourceProviderTest extends BaseTest
+    with ResourceProviderTestMixin {
+  test_deleteFile_existing() {
+    File file = getFile(exists: true);
     expect(file.exists, isTrue);
-    provider.deleteFile(path);
+
+    provider.deleteFile(defaultFilePath);
     expect(file.exists, isFalse);
   }
 
-  test_getFolder_existing() async {
-    String path = provider.convertPath('/foo/bar');
-    provider.newFolder(path);
-    Folder folder = provider.getFolder(path);
-    expect(folder, isNotNull);
-    expect(folder.path, path);
+  test_deleteFile_folder() {
+    Folder folder = getFolder(exists: true);
+
+    expect(() => provider.deleteFile(defaultFolderPath), throwsArgumentError);
     expect(folder.exists, isTrue);
   }
 
-  test_getFolder_notExisting() async {
-    String path = provider.convertPath('/foo/bar');
-    Folder folder = provider.getFolder(path);
-    expect(folder, isNotNull);
-    expect(folder.path, path);
-    expect(folder.exists, isFalse);
+  @override
+  test_pathContext() {
+    if (path.style == path.Style.windows) {
+      // On Windows the path context is replaced by one whose current directory
+      // is the root of the 'C' drive.
+      path.Context context = provider.pathContext;
+      expect(context.style, path.Style.windows);
+      expect(context.current, 'C:\\');
+    } else {
+      super.test_pathContext();
+    }
   }
 
-  test_getModificationTimes() async {
-    File file = provider.newFile(provider.convertPath('/test.dart'), '');
-    Source source = file.createSource();
-    List<int> times = await provider.getModificationTimes([source]);
-    expect(times, [source.modificationStamp]);
-  }
+  test_deleteFile_notExisting() {
+    File file = getFile(exists: false);
 
-  void test_getStateLocation_uniqueness() {
-    String idOne = 'one';
-    Folder folderOne = provider.getStateLocation(idOne);
-    expect(folderOne, isNotNull);
-    String idTwo = 'two';
-    Folder folderTwo = provider.getStateLocation(idTwo);
-    expect(folderTwo, isNotNull);
-    expect(folderTwo, isNot(equals(folderOne)));
-    expect(provider.getStateLocation(idOne), equals(folderOne));
-  }
-
-  void test_modifyFile_isFolder() {
-    String path = provider.convertPath('/my/file');
-    provider.newFolder(path);
-    expect(() {
-      provider.modifyFile(path, 'contents');
-    }, throwsArgumentError);
-    expect(provider.getResource(path), _isFolder);
-  }
-
-  void test_modifyFile_notExistent() {
-    String path = provider.convertPath('/my/file');
-    expect(() {
-      provider.modifyFile(path, 'contents');
-    }, throwsArgumentError);
-    Resource file = provider.getResource(path);
-    expect(file, isNotNull);
+    expect(() => provider.deleteFile(defaultFilePath), throwsArgumentError);
     expect(file.exists, isFalse);
   }
 
-  void test_modifyFile_success() {
-    String path = provider.convertPath('/my/file');
-    provider.newFile(path, 'contents 1');
-    Resource file = provider.getResource(path);
-    expect(file, _isFile);
-    Source source = (file as File).createSource();
-    expect(source.contents.data, equals('contents 1'));
-    provider.modifyFile(path, 'contents 2');
-    expect(source.contents.data, equals('contents 2'));
+  test_modifyFile_existing_file() {
+    File file = getFile(exists: true);
+
+    provider.modifyFile(file.path, 'contents 2');
+    expect(file.readAsStringSync(), 'contents 2');
   }
 
-  void test_newFileWithBytes() {
-    String path = provider.convertPath('/my/file');
+  test_modifyFile_existing_folder() {
+    getFolder(exists: true);
+
+    expect(() => provider.modifyFile(defaultFolderPath, 'contents'),
+        throwsArgumentError);
+    expect(provider.getResource(defaultFolderPath), isFolder);
+  }
+
+  test_modifyFile_notExisting() {
+    getFile(exists: false);
+
+    expect(() => provider.modifyFile(defaultFilePath, 'contents'),
+        throwsArgumentError);
+    Resource file = provider.getResource(defaultFilePath);
+    expect(file, isFile);
+    expect(file.exists, isFalse);
+  }
+
+  test_newFileWithBytes() {
     List<int> bytes = <int>[1, 2, 3, 4, 5];
-    provider.newFileWithBytes(path, bytes);
-    File file = provider.getResource(path);
-    expect(file, isNotNull);
+
+    provider.newFileWithBytes(defaultFilePath, bytes);
+    Resource file = provider.getResource(defaultFilePath);
+    expect(file, isFile);
     expect(file.exists, isTrue);
-    expect(file.readAsBytesSync(), bytes);
+    expect((file as File).readAsBytesSync(), bytes);
   }
 
-  void test_newFolder_alreadyExists_asFile() {
-    provider.newFile(provider.convertPath('/my/file'), 'qwerty');
-    expect(() {
-      provider.newFolder(provider.convertPath('/my/file'));
-    }, throwsArgumentError);
+  test_newFolder_emptyPath() {
+    expect(() => provider.newFolder(''), throwsArgumentError);
   }
 
-  void test_newFolder_alreadyExists_asFolder() {
-    String path = provider.convertPath('/my/folder');
-    Folder folder = provider.newFolder(path);
-    Folder newFolder = provider.newFolder(path);
+  test_newFolder_existing_file() {
+    getFile(exists: true);
+
+    expect(() => provider.newFolder(defaultFilePath), throwsArgumentError);
+  }
+
+  test_newFolder_existing_folder() {
+    Folder folder = getFolder(exists: true);
+
+    Folder newFolder = provider.newFolder(folder.path);
     expect(newFolder, folder);
   }
 
-  void test_newFolder_emptyPath() {
-    expect(() {
-      provider.newFolder('');
-    }, throwsArgumentError);
-  }
-
-  void test_newFolder_notAbsolute() {
-    expect(() {
-      provider.newFolder('not/absolute');
-    }, throwsArgumentError);
+  test_newFolder_notAbsolute() {
+    expect(() => provider.newFolder('not/absolute'), throwsArgumentError);
   }
 
   test_watch_createFile() {
@@ -810,6 +389,7 @@
     return _watchingFolder(rootPath, (changesReceived) {
       expect(changesReceived, hasLength(0));
       String path = provider.pathContext.join(rootPath, 'foo');
+
       provider.newFile(path, 'contents');
       return _delayed(() {
         expect(changesReceived, hasLength(1));
@@ -826,6 +406,7 @@
     provider.newFile(path, 'contents 1');
     return _watchingFolder(rootPath, (changesReceived) {
       expect(changesReceived, hasLength(0));
+
       provider.deleteFile(path);
       return _delayed(() {
         expect(changesReceived, hasLength(1));
@@ -842,6 +423,7 @@
     provider.newFile(path, 'contents 1');
     return _watchingFolder(rootPath, (changesReceived) {
       expect(changesReceived, hasLength(0));
+
       provider.modifyFile(path, 'contents 2');
       return _delayed(() {
         expect(changesReceived, hasLength(1));
@@ -860,6 +442,7 @@
     provider.newFile(path, 'contents 1');
     return _watchingFolder(rootPath, (changesReceived) {
       expect(changesReceived, hasLength(0));
+
       provider.modifyFile(path, 'contents 2');
       return _delayed(() {
         expect(changesReceived, hasLength(1));
diff --git a/pkg/analyzer/test/file_system/overlay_file_system_test.dart b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
index 3460d9a..c422ade 100644
--- a/pkg/analyzer/test/file_system/overlay_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
@@ -1,9 +1,7 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:core';
-
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/file_system/overlay_file_system.dart';
@@ -731,6 +729,16 @@
     expect(provider.getStateLocation(idOne), equals(folderOne));
   }
 
+  test_hasOverlay() {
+    expect(provider.hasOverlay(defaultFilePath), isFalse);
+
+    provider.setOverlay(defaultFilePath, content: 'x', modificationStamp: 0);
+    expect(provider.hasOverlay(defaultFilePath), isTrue);
+
+    provider.removeOverlay(defaultFilePath);
+    expect(provider.hasOverlay(defaultFilePath), isFalse);
+  }
+
   test_pathContext() {
     expect(provider.pathContext, baseProvider.pathContext);
   }
diff --git a/pkg/analyzer/test/file_system/physical_file_system_test.dart b/pkg/analyzer/test/file_system/physical_file_system_test.dart
new file mode 100644
index 0000000..11e744e
--- /dev/null
+++ b/pkg/analyzer/test/file_system/physical_file_system_test.dart
@@ -0,0 +1,163 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' as io;
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'file_system_test_support.dart';
+
+main() {
+  if (!new bool.fromEnvironment('skipPhysicalResourceProviderTests')) {
+    defineReflectiveSuite(() {
+      defineReflectiveTests(PhysicalFileTest);
+      defineReflectiveTests(PhysicalFolderTest);
+      defineReflectiveTests(PhysicalResourceProviderTest);
+    });
+  }
+}
+
+abstract class BaseTest extends FileSystemTestSupport {
+  /// The resource provider to be used by the tests. Tests should use [provider]
+  /// to access the resource provider.
+  PhysicalResourceProvider _provider;
+
+  /// A temporary directory on disk. All files and folders created by the tests
+  /// should be inside this directory.
+  io.Directory tempDirectory;
+
+  /// The absolute path to the [tempDirectory]. This path will contain a
+  /// symbolic link on some operating systems.
+  String tempPath;
+
+  /// A path to a folder within the [tempDirectory] that can be used by tests.
+  String defaultFolderPath;
+
+  /// A path to a file within the [defaultFolderPath] that can be used by tests.
+  String defaultFilePath;
+
+  /// The content used for the file at the [defaultFilePath] if it is created
+  /// and no other content is provided.
+  String get defaultFileContent => 'a';
+
+  /// Return the resource provider to be used by the tests.
+  PhysicalResourceProvider get provider => _provider ??= createProvider();
+
+  /// Create the resource provider to be used by the tests. Subclasses can
+  /// override this method to change the class of resource provider that is
+  /// used.
+  PhysicalResourceProvider createProvider() =>
+      new PhysicalResourceProvider(null);
+
+  File getFile({@required bool exists, String content, String filePath}) {
+    File file = provider.getFile(filePath ?? defaultFilePath);
+    if (exists) {
+      file.parent.create();
+      file.writeAsStringSync(content ?? defaultFileContent);
+    }
+    return file;
+  }
+
+  Folder getFolder({@required bool exists, String folderPath}) {
+    Folder folder = provider.getFolder(folderPath ?? defaultFolderPath);
+    if (exists) {
+      folder.create();
+    }
+    return folder;
+  }
+
+  setUp() {
+    tempDirectory = io.Directory.systemTemp.createTempSync('test_resource');
+    //
+    // On some platforms the path to the temp directory includes a symbolic
+    // link. We remove that so that only the tests designed to test the behavior
+    // of symbolic links will do so.
+    //
+    tempPath = tempDirectory.absolute.resolveSymbolicLinksSync();
+    defaultFolderPath = join(tempPath, 'bar');
+    defaultFilePath = join(tempPath, 'bar', 'test.dart');
+  }
+
+  tearDown() {
+    tempDirectory.deleteSync(recursive: true);
+  }
+}
+
+@reflectiveTest
+class PhysicalFileTest extends BaseTest with FileTestMixin {
+  @override
+  test_delete_notExisting() {
+    File file = getFile(exists: false);
+    expect(file.exists, isFalse);
+
+    expect(() => file.delete(), throwsA(isFileSystemException));
+  }
+
+  @override
+  test_renameSync_notExisting() {
+    String oldPath = join(tempPath, 'file.txt');
+    String newPath = join(tempPath, 'new-file.txt');
+    File oldFile = getFile(exists: false, filePath: oldPath);
+
+    expect(() => oldFile.renameSync(newPath), throwsA(isFileSystemException));
+  }
+
+  @override
+  test_resolveSymbolicLinksSync_links_existing() {
+    String pathA = join(tempPath, defaultFileContent);
+    String pathB = join(pathA, 'b');
+    new io.Directory(pathB).createSync(recursive: true);
+    String filePath = join(pathB, 'test.txt');
+    io.File testFile = new io.File(filePath);
+    testFile.writeAsStringSync('test');
+
+    String pathC = join(tempPath, 'c');
+    String pathD = join(pathC, 'd');
+    new io.Link(pathD).createSync(pathA, recursive: true);
+
+    String pathE = join(tempPath, 'e');
+    String pathF = join(pathE, 'f');
+    new io.Link(pathF).createSync(pathC, recursive: true);
+
+    String linkPath = join(tempPath, 'e', 'f', 'd', 'b', 'test.txt');
+    File file = provider.getFile(linkPath);
+
+    expect(file.resolveSymbolicLinksSync().path,
+        testFile.resolveSymbolicLinksSync());
+  }
+
+  @override
+  test_resolveSymbolicLinksSync_noLinks_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(
+        () => file.resolveSymbolicLinksSync(), throwsA(isFileSystemException));
+  }
+
+  @override
+  test_writeAsBytesSync_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(() => file.writeAsBytesSync(<int>[99, 99]),
+        throwsA(isFileSystemException));
+  }
+
+  @override
+  test_writeAsStringSync_notExisting() {
+    File file = getFile(exists: false);
+
+    expect(() => file.writeAsStringSync('cc'), throwsA(isFileSystemException));
+  }
+}
+
+@reflectiveTest
+class PhysicalFolderTest extends BaseTest with FolderTestMixin {}
+
+@reflectiveTest
+class PhysicalResourceProviderTest extends BaseTest
+    with ResourceProviderTestMixin {}
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
deleted file mode 100644
index 4417780..0000000
--- a/pkg/analyzer/test/file_system/physical_resource_provider_test.dart
+++ /dev/null
@@ -1,565 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:core';
-import 'dart:io' as io;
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:path/path.dart' as pathos;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  if (!new bool.fromEnvironment('skipPhysicalResourceProviderTests')) {
-    defineReflectiveSuite(() {
-      defineReflectiveTests(PhysicalResourceProviderTest);
-      defineReflectiveTests(FileTest);
-      defineReflectiveTests(FolderTest);
-    });
-  }
-}
-
-final _isFile = new TypeMatcher<File>();
-final _isFileSystemException = new TypeMatcher<FileSystemException>();
-final _isFolder = new TypeMatcher<Folder>();
-
-String join(String part1, [String part2, String part3]) =>
-    pathos.join(part1, part2, part3);
-
-class BaseTest {
-  io.Directory tempDirectory;
-  String tempPath;
-
-  setUp() {
-    tempDirectory = io.Directory.systemTemp.createTempSync('test_resource');
-    tempPath = tempDirectory.absolute.path;
-  }
-
-  tearDown() {
-    tempDirectory.deleteSync(recursive: true);
-  }
-}
-
-@reflectiveTest
-class FileTest extends BaseTest {
-  String path;
-  File file;
-
-  setUp() {
-    super.setUp();
-    path = join(tempPath, 'file.txt');
-    file = PhysicalResourceProvider.INSTANCE.getResource(path);
-  }
-
-  void test_copy() {
-    PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
-    String contents = 'contents';
-    new io.File(path).writeAsStringSync(contents);
-    Folder destination = provider.getFolder(join(tempPath, 'destination'));
-
-    File copy = file.copyTo(destination);
-    expect(copy.parent, destination);
-    expect(copy.shortName, file.shortName);
-    expect(copy.readAsStringSync(), contents);
-  }
-
-  void test_createSource() {
-    new io.File(path).writeAsStringSync('contents');
-    Source source = file.createSource();
-    expect(source.uriKind, UriKind.FILE_URI);
-    expect(source.exists(), isTrue);
-    expect(source.contents.data, 'contents');
-  }
-
-  void test_delete() {
-    new io.File(path).writeAsStringSync('contents');
-    expect(file.exists, isTrue);
-    // delete
-    file.delete();
-    expect(file.exists, isFalse);
-  }
-
-  void test_equals_differentPaths() {
-    String path2 = join(tempPath, 'file2.txt');
-    File file2 = PhysicalResourceProvider.INSTANCE.getResource(path2);
-    expect(file == file2, isFalse);
-  }
-
-  void test_equals_samePath() {
-    new io.File(path).writeAsStringSync('contents');
-    File file2 = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(file == file2, isTrue);
-  }
-
-  void test_exists_false() {
-    expect(file.exists, isFalse);
-  }
-
-  void test_exists_true() {
-    new io.File(path).writeAsStringSync('contents');
-    expect(file.exists, isTrue);
-  }
-
-  void test_fullName() {
-    expect(file.path, path);
-  }
-
-  void test_hashCode() {
-    new io.File(path).writeAsStringSync('contents');
-    File file2 = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(file.hashCode, equals(file2.hashCode));
-  }
-
-  void test_isOrContains() {
-    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(file.isOrContains(path), isTrue);
-    expect(file.isOrContains('foo'), isFalse);
-  }
-
-  void test_lengthSync_doesNotExist() {
-    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(() {
-      file.lengthSync;
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_lengthSync_exists() {
-    List<int> bytes = <int>[1, 2, 3, 4, 5];
-    new io.File(path).writeAsBytesSync(bytes);
-    expect(file.lengthSync, bytes.length);
-  }
-
-  void test_modificationStamp_doesNotExist() {
-    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(() {
-      file.modificationStamp;
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_modificationStamp_exists() {
-    new io.File(path).writeAsStringSync('contents');
-    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(file.modificationStamp, isNonNegative);
-  }
-
-  void test_parent() {
-    Resource parent = file.parent;
-    expect(parent, _isFolder);
-    expect(parent.path, equals(tempPath));
-  }
-
-  void test_readAsBytesSync_doesNotExist() {
-    path = join(tempPath, 'doesNotExist.txt');
-    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(() {
-      file.readAsBytesSync();
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_readAsBytesSync_exists() {
-    List<int> bytes = <int>[1, 2, 3, 4, 5];
-    new io.File(path).writeAsBytesSync(bytes);
-    expect(file.readAsBytesSync(), bytes);
-  }
-
-  void test_readAsStringSync_doesNotExist() {
-    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(() {
-      file.readAsStringSync();
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_readAsStringSync_exists() {
-    new io.File(path).writeAsStringSync('abc');
-    File file = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(file.readAsStringSync(), 'abc');
-  }
-
-  void test_renameSync_newDoesNotExist() {
-    pathos.Context pathContext = PhysicalResourceProvider.INSTANCE.pathContext;
-    String oldPath = pathContext.join(tempPath, 'file.txt');
-    String newPath = pathContext.join(tempPath, 'new-file.txt');
-    new io.File(oldPath).writeAsStringSync('text');
-    File file = PhysicalResourceProvider.INSTANCE.getResource(oldPath);
-    File newFile = file.renameSync(newPath);
-    expect(file.path, oldPath);
-    expect(file.exists, isFalse);
-    expect(newFile.path, newPath);
-    expect(newFile.exists, isTrue);
-    expect(newFile.readAsStringSync(), 'text');
-  }
-
-  test_renameSync_newExists_file() async {
-    pathos.Context pathContext = PhysicalResourceProvider.INSTANCE.pathContext;
-    String oldPath = pathContext.join(tempPath, 'file.txt');
-    String newPath = pathContext.join(tempPath, 'new-file.txt');
-    new io.File(oldPath).writeAsStringSync('text');
-    new io.File(newPath).writeAsStringSync('new text');
-    File file = PhysicalResourceProvider.INSTANCE.getResource(oldPath);
-    File newFile = file.renameSync(newPath);
-    expect(file.path, oldPath);
-    expect(file.exists, isFalse);
-    expect(newFile.path, newPath);
-    expect(newFile.exists, isTrue);
-    expect(newFile.readAsStringSync(), 'text');
-  }
-
-  void test_renameSync_newExists_folder() {
-    pathos.Context pathContext = PhysicalResourceProvider.INSTANCE.pathContext;
-    String oldPath = pathContext.join(tempPath, 'file.txt');
-    String newPath = pathContext.join(tempPath, 'foo');
-    new io.File(oldPath).writeAsStringSync('text');
-    new io.Directory(newPath).createSync();
-    File file = PhysicalResourceProvider.INSTANCE.getResource(oldPath);
-    expect(() {
-      file.renameSync(newPath);
-    }, throwsA(_isFileSystemException));
-    expect(file.path, oldPath);
-    expect(file.exists, isTrue);
-  }
-
-  void test_resolveSymbolicLinksSync_links() {
-    pathos.Context pathContext = PhysicalResourceProvider.INSTANCE.pathContext;
-    String pathA = pathContext.join(tempPath, 'a');
-    String pathB = pathContext.join(pathA, 'b');
-    new io.Directory(pathB).createSync(recursive: true);
-    String filePath = pathContext.join(pathB, 'test.txt');
-    io.File testFile = new io.File(filePath);
-    testFile.writeAsStringSync('test');
-
-    String pathC = pathContext.join(tempPath, 'c');
-    String pathD = pathContext.join(pathC, 'd');
-    new io.Link(pathD).createSync(pathA, recursive: true);
-
-    String pathE = pathContext.join(tempPath, 'e');
-    String pathF = pathContext.join(pathE, 'f');
-    new io.Link(pathF).createSync(pathC, recursive: true);
-
-    String linkPath =
-        pathContext.join(tempPath, 'e', 'f', 'd', 'b', 'test.txt');
-    File file = PhysicalResourceProvider.INSTANCE.getFile(linkPath);
-    expect(file.resolveSymbolicLinksSync().path,
-        testFile.resolveSymbolicLinksSync());
-  }
-
-  void test_resolveSymbolicLinksSync_noLinks() {
-    //
-    // On some platforms the path to the temp directory includes a symbolic
-    // link. We remove that from the equation before creating the File in order
-    // to show that the operation works as expected without symbolic links.
-    //
-    io.File ioFile = new io.File(path);
-    ioFile.writeAsStringSync('test');
-    file = PhysicalResourceProvider.INSTANCE
-        .getFile(ioFile.resolveSymbolicLinksSync());
-    expect(file.resolveSymbolicLinksSync(), file);
-  }
-
-  void test_shortName() {
-    expect(file.shortName, 'file.txt');
-  }
-
-  void test_toString() {
-    expect(file.toString(), path);
-  }
-
-  void test_toUri() {
-    String path = io.Platform.isWindows ? r'C:\foo\file.txt' : '/foo/file.txt';
-    File file = PhysicalResourceProvider.INSTANCE.getFile(path);
-    expect(file.toUri(), new Uri.file(path));
-  }
-
-  void test_writeAsBytesSync() {
-    List<int> content = <int>[1, 2];
-    new io.File(path).writeAsBytesSync(content);
-    expect(file.readAsBytesSync(), content);
-    // write new bytes
-    content = <int>[10, 20];
-    file.writeAsBytesSync(content);
-    expect(file.readAsBytesSync(), content);
-  }
-
-  void test_writeAsStringSync() {
-    String content = 'ab';
-    new io.File(path).writeAsStringSync(content);
-    expect(file.readAsStringSync(), content);
-    // write new bytes
-    content = 'CD';
-    file.writeAsStringSync(content);
-    expect(file.readAsStringSync(), content);
-  }
-}
-
-@reflectiveTest
-class FolderTest extends BaseTest {
-  String path;
-  Folder folder;
-
-  setUp() {
-    super.setUp();
-    path = join(tempPath, 'folder');
-    new io.Directory(path).createSync();
-    folder = PhysicalResourceProvider.INSTANCE.getResource(path);
-  }
-
-  void test_canonicalizePath() {
-    String path2 = join(tempPath, 'folder2');
-    String path3 = join(tempPath, 'folder3');
-    expect(folder.canonicalizePath('baz'), equals(join(path, 'baz')));
-    expect(folder.canonicalizePath(path2), equals(path2));
-    expect(folder.canonicalizePath(join('..', 'folder2')), equals(path2));
-    expect(
-        folder.canonicalizePath(join(path2, '..', 'folder3')), equals(path3));
-    expect(
-        folder.canonicalizePath(join('.', 'baz')), equals(join(path, 'baz')));
-    expect(folder.canonicalizePath(join(path2, '.', 'baz')),
-        equals(join(path2, 'baz')));
-  }
-
-  void test_contains() {
-    expect(folder.contains(join(path, 'aaa.txt')), isTrue);
-    expect(folder.contains(join(path, 'aaa', 'bbb.txt')), isTrue);
-    expect(folder.contains(join(tempPath, 'baz.txt')), isFalse);
-    expect(folder.contains(path), isFalse);
-  }
-
-  void test_copy() {
-    PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
-    String sourcePath = join(tempPath, 'source');
-    String subdirPath = join(sourcePath, 'subdir');
-    new io.Directory(sourcePath).createSync();
-    new io.Directory(subdirPath).createSync();
-    new io.File(join(sourcePath, 'file1.txt')).writeAsStringSync('file1');
-    new io.File(join(subdirPath, 'file2.txt')).writeAsStringSync('file2');
-    Folder source = provider.getFolder(sourcePath);
-    Folder destination = provider.getFolder(join(tempPath, 'destination'));
-
-    Folder copy = source.copyTo(destination);
-    expect(copy.parent, destination);
-    _verifyStructure(copy, source);
-  }
-
-  void test_delete() {
-    new io.File(join(path, 'myFile')).createSync();
-    var child = folder.getChild('myFile');
-    expect(child, _isFile);
-    expect(child.exists, isTrue);
-    // delete "folder"
-    folder.delete();
-    expect(child.exists, isFalse);
-  }
-
-  void test_equals_differentPaths() {
-    String path2 = join(tempPath, 'folder2');
-    new io.Directory(path2).createSync();
-    Folder folder2 = PhysicalResourceProvider.INSTANCE.getResource(path2);
-    expect(folder == folder2, isFalse);
-  }
-
-  void test_equals_samePath() {
-    Folder folder2 = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(folder == folder2, isTrue);
-  }
-
-  void test_getChild_doesNotExist() {
-    var child = folder.getChild('no-such-resource');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChild_file() {
-    new io.File(join(path, 'myFile')).createSync();
-    var child = folder.getChild('myFile');
-    expect(child, _isFile);
-    expect(child.exists, isTrue);
-  }
-
-  void test_getChild_folder() {
-    new io.Directory(join(path, 'myFolder')).createSync();
-    var child = folder.getChild('myFolder');
-    expect(child, _isFolder);
-    expect(child.exists, isTrue);
-  }
-
-  void test_getChildAssumingFile_doesNotExist() {
-    File child = folder.getChildAssumingFile('no-such-resource');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChildAssumingFile_file() {
-    new io.File(join(path, 'myFile')).createSync();
-    File child = folder.getChildAssumingFile('myFile');
-    expect(child, isNotNull);
-    expect(child.exists, isTrue);
-  }
-
-  void test_getChildAssumingFile_folder() {
-    new io.Directory(join(path, 'myFolder')).createSync();
-    File child = folder.getChildAssumingFile('myFolder');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChildAssumingFolder_doesNotExist() {
-    Folder child = folder.getChildAssumingFolder('no-such-resource');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChildAssumingFolder_file() {
-    new io.File(join(path, 'myFile')).createSync();
-    Folder child = folder.getChildAssumingFolder('myFile');
-    expect(child, isNotNull);
-    expect(child.exists, isFalse);
-  }
-
-  void test_getChildAssumingFolder_folder() {
-    new io.Directory(join(path, 'myFolder')).createSync();
-    Folder child = folder.getChildAssumingFolder('myFolder');
-    expect(child, isNotNull);
-    expect(child.exists, isTrue);
-  }
-
-  void test_getChildren_doesNotExist() {
-    folder = folder.getChildAssumingFolder('no-such-folder');
-    expect(() {
-      folder.getChildren();
-    }, throwsA(_isFileSystemException));
-  }
-
-  void test_getChildren_exists() {
-    // create 2 files and 1 folder
-    new io.File(join(path, 'a.txt')).createSync();
-    new io.Directory(join(path, 'bFolder')).createSync();
-    new io.File(join(path, 'c.txt')).createSync();
-    // prepare 3 children
-    List<Resource> children = folder.getChildren();
-    expect(children, hasLength(3));
-    children.sort((a, b) => a.shortName.compareTo(b.shortName));
-    // check that each child exists
-    children.forEach((child) {
-      expect(child.exists, true);
-    });
-    // check names
-    expect(children[0].shortName, 'a.txt');
-    expect(children[1].shortName, 'bFolder');
-    expect(children[2].shortName, 'c.txt');
-    // check types
-    expect(children[0], _isFile);
-    expect(children[1], _isFolder);
-    expect(children[2], _isFile);
-  }
-
-  void test_hashCode() {
-    Folder folder2 = PhysicalResourceProvider.INSTANCE.getResource(path);
-    expect(folder.hashCode, equals(folder2.hashCode));
-  }
-
-  void test_isOrContains() {
-    expect(folder.isOrContains(path), isTrue);
-    expect(folder.isOrContains(join(path, 'aaa.txt')), isTrue);
-    expect(folder.isOrContains(join(path, 'aaa', 'bbb.txt')), isTrue);
-    expect(folder.isOrContains(join(tempPath, 'baz.txt')), isFalse);
-  }
-
-  void test_parent() {
-    Resource parent = folder.parent;
-    expect(parent, _isFolder);
-    expect(parent.path, equals(tempPath));
-
-    // Since the OS is in control of where tempPath is, we don't know how
-    // far it should be from the root.  So just verify that each call to
-    // parent results in a a folder with a shorter path, and that we
-    // reach the root eventually.
-    while (true) {
-      Resource grandParent = parent.parent;
-      if (grandParent == null) {
-        break;
-      }
-      expect(grandParent, _isFolder);
-      expect(grandParent.path.length, lessThan(parent.path.length));
-      parent = grandParent;
-    }
-  }
-
-  void test_toUri() {
-    String path =
-        io.Platform.isWindows ? r'C:\foo\directory' : '/foo/directory';
-    Folder folder = PhysicalResourceProvider.INSTANCE.getFolder(path);
-    expect(folder.toUri(), new Uri.directory(path));
-  }
-
-  /**
-   * Verify that the [copy] has the same name and content as the [source].
-   */
-  void _verifyStructure(Folder copy, Folder source) {
-    expect(copy.shortName, source.shortName);
-    Map<String, File> sourceFiles = <String, File>{};
-    Map<String, Folder> sourceFolders = <String, Folder>{};
-    for (Resource child in source.getChildren()) {
-      if (child is File) {
-        sourceFiles[child.shortName] = child;
-      } else if (child is Folder) {
-        sourceFolders[child.shortName] = child;
-      } else {
-        fail('Unknown class of resource: ${child.runtimeType}');
-      }
-    }
-    Map<String, File> copyFiles = <String, File>{};
-    Map<String, Folder> copyFolders = <String, Folder>{};
-    for (Resource child in source.getChildren()) {
-      if (child is File) {
-        copyFiles[child.shortName] = child;
-      } else if (child is Folder) {
-        copyFolders[child.shortName] = child;
-      } else {
-        fail('Unknown class of resource: ${child.runtimeType}');
-      }
-    }
-    for (String fileName in sourceFiles.keys) {
-      File sourceChild = sourceFiles[fileName];
-      File copiedChild = copyFiles[fileName];
-      if (copiedChild == null) {
-        fail('Failed to copy file ${sourceChild.path}');
-      }
-      expect(copiedChild.readAsStringSync(), sourceChild.readAsStringSync(),
-          reason: 'Incorrectly copied file ${sourceChild.path}');
-    }
-    for (String fileName in sourceFolders.keys) {
-      Folder sourceChild = sourceFolders[fileName];
-      Folder copiedChild = copyFolders[fileName];
-      if (copiedChild == null) {
-        fail('Failed to copy folder ${sourceChild.path}');
-      }
-      _verifyStructure(copiedChild, sourceChild);
-    }
-  }
-}
-
-@reflectiveTest
-class PhysicalResourceProviderTest extends BaseTest {
-  test_getModificationTimes() async {
-    PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
-    String path = join(tempPath, 'file1.txt');
-    new io.File(path).writeAsStringSync('');
-    Source source = provider.getFile(path).createSource();
-    List<int> times = await provider.getModificationTimes([source]);
-    expect(times, [source.modificationStamp]);
-  }
-
-  void test_getStateLocation_uniqueness() {
-    PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
-    String idOne = 'one';
-    Folder folderOne = provider.getStateLocation(idOne);
-    expect(folderOne, isNotNull);
-    String idTwo = 'two';
-    Folder folderTwo = provider.getStateLocation(idTwo);
-    expect(folderTwo, isNotNull);
-    expect(folderTwo, isNot(equals(folderOne)));
-    expect(provider.getStateLocation(idOne), equals(folderOne));
-  }
-}
diff --git a/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart b/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
index 7c1cd9e..6f68a1e 100644
--- a/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
+++ b/pkg/analyzer/test/file_system/physical_resource_provider_watch_test.dart
@@ -1,9 +1,8 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:core';
 import 'dart:io' as io;
 
 import 'package:analyzer/file_system/file_system.dart';
@@ -13,7 +12,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 import 'package:watcher/watcher.dart';
 
-import 'physical_resource_provider_test.dart' show BaseTest;
+import 'physical_file_system_test.dart' show BaseTest;
 
 main() {
   if (!new bool.fromEnvironment('skipPhysicalResourceProviderTests')) {
diff --git a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
index 4bb689e..27994af 100644
--- a/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
+++ b/pkg/analyzer/test/file_system/resource_uri_resolver_test.dart
@@ -1,10 +1,10 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -15,52 +15,55 @@
 }
 
 @reflectiveTest
-class ResourceUriResolverTest {
-  MemoryResourceProvider provider;
+class ResourceUriResolverTest with ResourceProviderMixin {
   ResourceUriResolver resolver;
 
   void setUp() {
-    provider = new MemoryResourceProvider();
-    resolver = new ResourceUriResolver(provider);
-    provider.newFile(provider.convertPath('/test.dart'), '');
-    provider.newFolder(provider.convertPath('/folder'));
+    resolver = new ResourceUriResolver(resourceProvider);
+    newFile('/test.dart');
+    newFolder('/folder');
   }
 
   void test_creation() {
-    expect(provider, isNotNull);
+    expect(resourceProvider, isNotNull);
     expect(resolver, isNotNull);
   }
 
   void test_resolveAbsolute_file() {
-    var uri = provider.pathContext.toUri(provider.convertPath('/test.dart'));
+    var uri = toUri('/test.dart');
+
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNotNull);
     expect(source.exists(), isTrue);
-    expect(source.fullName, provider.convertPath('/test.dart'));
+    expect(source.fullName, convertPath('/test.dart'));
   }
 
   void test_resolveAbsolute_folder() {
-    var uri = provider.pathContext.toUri(provider.convertPath('/folder'));
+    var uri = toUri('/folder');
+
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNotNull);
     expect(source.exists(), isFalse);
-    expect(source.fullName, provider.convertPath('/folder'));
+    expect(source.fullName, convertPath('/folder'));
   }
 
   void test_resolveAbsolute_notFile_dartUri() {
     var uri = new Uri(scheme: 'dart', path: 'core');
+
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
   void test_resolveAbsolute_notFile_httpsUri() {
     var uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
+
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNull);
   }
 
   void test_restoreAbsolute() {
-    var uri = provider.pathContext.toUri(provider.convertPath('/test.dart'));
+    var uri = toUri('/test.dart');
+
     Source source = resolver.resolveAbsolute(uri);
     expect(source, isNotNull);
     expect(resolver.restoreAbsolute(source), uri);
diff --git a/pkg/analyzer/test/file_system/test_all.dart b/pkg/analyzer/test/file_system/test_all.dart
index 48ca361..8fe75cc 100644
--- a/pkg/analyzer/test/file_system/test_all.dart
+++ b/pkg/analyzer/test/file_system/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,17 +6,16 @@
 
 import 'memory_file_system_test.dart' as memory_file_system;
 import 'overlay_file_system_test.dart' as overlay_file_system;
-import 'physical_resource_provider_test.dart' as physical_resource_provider;
+import 'physical_file_system_test.dart' as physical_file_system;
 import 'physical_resource_provider_watch_test.dart'
     as physical_resource_provider_watch_test;
 import 'resource_uri_resolver_test.dart' as resource_uri_resolver;
 
-/// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
     memory_file_system.main();
     overlay_file_system.main();
-    physical_resource_provider.main();
+    physical_file_system.main();
     physical_resource_provider_watch_test.main();
     resource_uri_resolver.main();
   }, name: 'file system');
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 4ac956a..0c87fa9 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -23,7 +23,7 @@
 import 'package:analyzer/src/generated/java_io.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/sdk_io.dart';
+import 'package:analyzer/src/generated/sdk_io.dart'; // ignore: deprecated_member_use
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
@@ -37,6 +37,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../util/element_type_matchers.dart';
 import 'parser_test.dart';
 import 'resolver_test_case.dart';
 import 'test_support.dart';
@@ -50,6 +51,7 @@
     defineReflectiveTests(ElementLocatorTest);
     defineReflectiveTests(EnumMemberBuilderTest);
     defineReflectiveTests(ErrorReporterTest);
+    defineReflectiveTests(ErrorReporterTest2);
     defineReflectiveTests(ErrorSeverityTest);
     defineReflectiveTests(ExitDetectorTest);
     defineReflectiveTests(ExitDetectorTest2);
@@ -150,16 +152,14 @@
 
   void test_restoreAbsolute_library() {
     _SourceMock source = new _SourceMock();
-    Uri fileUri = resourceProvider.pathContext.toUri(coreCorePath);
-    source.uri = fileUri;
+    source.uri = toUri('/sdk/lib/core/core.dart');
     Uri dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core');
   }
 
   void test_restoreAbsolute_part() {
     _SourceMock source = new _SourceMock();
-    Uri fileUri = resourceProvider.pathContext.toUri(coreIntPath);
-    source.uri = fileUri;
+    source.uri = toUri('/sdk/lib/core/int.dart');
     Uri dartUri = resolver.restoreAbsolute(source);
     expect(dartUri.toString(), 'dart:core/int.dart');
   }
@@ -189,22 +189,19 @@
   x += 1;
 }''');
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodElement, MethodElement, element);
+    expect(element, isMethodElement);
   }
 
   test_locate_BinaryExpression() async {
     AstNode id = await _findNodeIn("+", "var x = 3 + 4;");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodElement, MethodElement, element);
+    expect(element, isMethodElement);
   }
 
   test_locate_ClassDeclaration() async {
     AstNode id = await _findNodeIn("class", "class A { }");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassElement, ClassElement, element);
+    expect(element, isClassElement);
   }
 
   test_locate_CompilationUnit() async {
@@ -220,26 +217,23 @@
   A.bar() {}
 }''');
     ConstructorDeclaration declaration =
-        id.getAncestor((node) => node is ConstructorDeclaration);
+        id.thisOrAncestorOfType<ConstructorDeclaration>();
     Element element = ElementLocator.locate(declaration);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ConstructorElement, ConstructorElement, element);
+    expect(element, isConstructorElement);
   }
 
   test_locate_ExportDirective() async {
     AstNode id = await _findNodeIn("export", "export 'dart:core';");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ExportElement, ExportElement, element);
+    expect(element, isExportElement);
   }
 
   test_locate_FunctionDeclaration() async {
     AstNode id = await _findNodeIn("f", "int f() => 3;");
     FunctionDeclaration declaration =
-        id.getAncestor((node) => node is FunctionDeclaration);
+        id.thisOrAncestorOfType<FunctionDeclaration>();
     Element element = ElementLocator.locate(declaration);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FunctionElement, FunctionElement, element);
+    expect(element, isFunctionElement);
   }
 
   test_locate_Identifier_annotationClass_namedConstructor_forSimpleFormalParameter() async {
@@ -250,8 +244,7 @@
 void main(@Class.name() parameter) {
 }''');
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassElement, ClassElement, element);
+    expect(element, isClassElement);
   }
 
   test_locate_Identifier_annotationClass_unnamedConstructor_forSimpleFormalParameter() async {
@@ -262,15 +255,13 @@
 void main(@Class() parameter) {
 }''');
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ConstructorElement, ConstructorElement, element);
+    expect(element, isConstructorElement);
   }
 
   test_locate_Identifier_className() async {
     AstNode id = await _findNodeIn("A", "class A { }");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassElement, ClassElement, element);
+    expect(element, isClassElement);
   }
 
   test_locate_Identifier_constructor_named() async {
@@ -279,8 +270,7 @@
   A.bar() {}
 }''');
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ConstructorElement, ConstructorElement, element);
+    expect(element, isConstructorElement);
   }
 
   test_locate_Identifier_constructor_unnamed() async {
@@ -289,22 +279,19 @@
   A() {}
 }''');
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ConstructorElement, ConstructorElement, element);
+    expect(element, isConstructorElement);
   }
 
   test_locate_Identifier_fieldName() async {
     AstNode id = await _findNodeIn("x", "class A { var x; }");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FieldElement, FieldElement, element);
+    expect(element, isFieldElement);
   }
 
   test_locate_Identifier_libraryDirective() async {
     AstNode id = await _findNodeIn("foo", "library foo.bar;");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is LibraryElement, LibraryElement, element);
+    expect(element, isLibraryElement);
   }
 
   test_locate_Identifier_propertyAccess() async {
@@ -313,15 +300,13 @@
  int x = 'foo'.length;
 }''');
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement,
-        PropertyAccessorElement, element);
+    expect(element, isPropertyAccessorElement);
   }
 
   test_locate_ImportDirective() async {
     AstNode id = await _findNodeIn("import", "import 'dart:core';");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ImportElement, ImportElement, element);
+    expect(element, isImportElement);
   }
 
   test_locate_IndexExpression() async {
@@ -331,8 +316,7 @@
   var y = x[0];
 }''');
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodElement, MethodElement, element);
+    expect(element, isMethodElement);
   }
 
   test_locate_InstanceCreationExpression() async {
@@ -342,8 +326,7 @@
  new A();
 }''');
     Element element = ElementLocator.locate(node);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ConstructorElement, ConstructorElement, element);
+    expect(element, isConstructorElement);
   }
 
   test_locate_InstanceCreationExpression_type_prefixedIdentifier() async {
@@ -387,8 +370,7 @@
   test_locate_LibraryDirective() async {
     AstNode id = await _findNodeIn("library", "library foo;");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is LibraryElement, LibraryElement, element);
+    expect(element, isLibraryElement);
   }
 
   test_locate_MethodDeclaration() async {
@@ -397,10 +379,9 @@
   void m() {}
 }''');
     MethodDeclaration declaration =
-        id.getAncestor((node) => node is MethodDeclaration);
+        id.thisOrAncestorOfType<MethodDeclaration>();
     Element element = ElementLocator.locate(declaration);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodElement, MethodElement, element);
+    expect(element, isMethodElement);
   }
 
   test_locate_MethodInvocation_method() async {
@@ -412,8 +393,7 @@
  var f = new A().bar();
 }''');
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodElement, MethodElement, element);
+    expect(element, isMethodElement);
   }
 
   test_locate_MethodInvocation_topLevel() async {
@@ -425,11 +405,9 @@
     CompilationUnit cu = await _resolveContents(code);
     int offset = code.indexOf('foo(0)');
     AstNode node = new NodeLocator(offset).searchWithin(cu);
-    MethodInvocation invocation =
-        node.getAncestor((n) => n is MethodInvocation);
+    MethodInvocation invocation = node.thisOrAncestorOfType<MethodInvocation>();
     Element element = ElementLocator.locate(invocation);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FunctionElement, FunctionElement, element);
+    expect(element, isFunctionElement);
   }
 
   test_locate_PartOfDirective() async {
@@ -444,15 +422,13 @@
         analysisContext.resolveCompilationUnit2(unitSource, librarySource);
     PartOfDirective partOf = unit.directives.first;
     Element element = ElementLocator.locate(partOf);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is LibraryElement, LibraryElement, element);
+    expect(element, isLibraryElement);
   }
 
   test_locate_PostfixExpression() async {
     AstNode id = await _findNodeIn("++", "int addOne(int x) => x++;");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodElement, MethodElement, element);
+    expect(element, isMethodElement);
   }
 
   test_locate_PrefixedIdentifier() async {
@@ -460,25 +436,22 @@
 import 'dart:core' as core;
 core.int value;''');
     PrefixedIdentifier identifier =
-        id.getAncestor((node) => node is PrefixedIdentifier);
+        id.thisOrAncestorOfType<PrefixedIdentifier>();
     Element element = ElementLocator.locate(identifier);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassElement, ClassElement, element);
+    expect(element, isClassElement);
   }
 
   test_locate_PrefixExpression() async {
     AstNode id = await _findNodeIn("++", "int addOne(int x) => ++x;");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodElement, MethodElement, element);
+    expect(element, isMethodElement);
   }
 
   test_locate_StringLiteral_exportUri() async {
     addNamedSource("/foo.dart", "library foo;");
     AstNode id = await _findNodeIn("'foo.dart'", "export 'foo.dart';");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is LibraryElement, LibraryElement, element);
+    expect(element, isLibraryElement);
   }
 
   test_locate_StringLiteral_expression() async {
@@ -492,8 +465,7 @@
     AstNode id = await _findNodeIn(
         "'foo.dart'", "import 'foo.dart'; class B extends A {}");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is LibraryElement, LibraryElement, element);
+    expect(element, isLibraryElement);
   }
 
   test_locate_StringLiteral_partUri() async {
@@ -501,17 +473,15 @@
     AstNode id =
         await _findNodeIn("'foo.dart'", "library app; part 'foo.dart';");
     Element element = ElementLocator.locate(id);
-    EngineTestCase.assertInstanceOf((obj) => obj is CompilationUnitElement,
-        CompilationUnitElement, element);
+    expect(element, isCompilationUnitElement);
   }
 
   test_locate_VariableDeclaration() async {
     AstNode id = await _findNodeIn("x", "var x = 'abc';");
     VariableDeclaration declaration =
-        id.getAncestor((node) => node is VariableDeclaration);
+        id.thisOrAncestorOfType<VariableDeclaration>();
     Element element = ElementLocator.locate(declaration);
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableElement,
-        TopLevelVariableElement, element);
+    expect(element, isTopLevelVariableElement);
   }
 
   /**
@@ -669,11 +639,8 @@
 @reflectiveTest
 class ErrorReporterTest extends EngineTestCase {
   /**
-   * Create a type with the given name in a compilation unit with the given name.
-   *
-   * @param fileName the name of the compilation unit containing the class
-   * @param typeName the name of the type to be created
-   * @return the type that was created
+   * Return a newly created interface type with the given [typeName] in a
+   * compilation unit with the given [fileName].
    */
   InterfaceType createType(String fileName, String typeName) {
     CompilationUnitElementImpl unit = ElementFactory.compilationUnit(fileName);
@@ -748,7 +715,7 @@
         AstTestFactory.identifier3("x"),
         [firstType, secondType]);
     AnalysisError error = listener.errors[0];
-    expect(error.message.indexOf("(") < 0, isTrue);
+    expect(error.message.contains("("), isFalse);
   }
 
   test_reportTypeErrorForNode_sameName() async {
@@ -763,7 +730,69 @@
         AstTestFactory.identifier3("x"),
         [firstType, secondType]);
     AnalysisError error = listener.errors[0];
-    expect(error.message.indexOf("(") >= 0, isTrue);
+    expect(error.message.contains("("), isTrue);
+  }
+}
+
+@reflectiveTest
+class ErrorReporterTest2 extends ResolverTestCase {
+  test_reportTypeErrorForNode_sameName_functionType() async {
+    addNamedSource('/a.dart', '''
+class A {}
+''');
+    addNamedSource('/b.dart', '''
+class A {}
+''');
+    CompilationUnit unit = await resolveSource('''
+import 'a.dart' as a;
+import 'b.dart' as b;
+
+a.A Function() fa;
+b.A Function() fb;
+''');
+
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ErrorReporter reporter =
+        new ErrorReporter(listener, unit.declaredElement.source);
+    TopLevelVariableDeclaration fa = unit.declarations[0];
+    TopLevelVariableDeclaration fb = unit.declarations[1];
+    reporter.reportTypeErrorForNode(
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+        AstTestFactory.identifier3('x'),
+        [fa.variables.type.type, fb.variables.type.type]);
+    AnalysisError error = listener.errors[0];
+    expect(error.message.contains('a.dart'), isTrue);
+    expect(error.message.contains('b.dart'), isTrue);
+  }
+
+  test_reportTypeErrorForNode_sameName_nested() async {
+    addNamedSource('/a.dart', '''
+class A {}
+''');
+    addNamedSource('/b.dart', '''
+class A {}
+''');
+    CompilationUnit unit = await resolveSource('''
+import 'a.dart' as a;
+import 'b.dart' as b;
+
+B<a.A> ba;
+B<b.A> bb;
+class B<T> {}
+''');
+
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ErrorReporter reporter =
+        new ErrorReporter(listener, unit.declaredElement.source);
+    TopLevelVariableDeclaration fa = unit.declarations[0];
+    TopLevelVariableDeclaration fb = unit.declarations[1];
+    reporter.reportTypeErrorForNode(
+        StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
+        AstTestFactory.identifier3('x'),
+        [fa.variables.type.type, fb.variables.type.type]);
+    AnalysisError error = listener.errors[0];
+    expect(error.message.contains('a.dart'), isTrue);
+    expect(error.message.contains('b.dart'), isTrue);
   }
 }
 
@@ -2053,31 +2082,27 @@
   }
 }
 
-class _SimpleDartSdkTest extends Object with ResourceProviderMixin {
-  String coreCorePath;
-  String coreIntPath;
+class _SimpleDartSdkTest with ResourceProviderMixin {
   DartSdk sdk;
 
   void setUp() {
-    Folder sdkFolder =
-        resourceProvider.newFolder(resourceProvider.convertPath('/sdk'));
-    resourceProvider.newFile(
-        resourceProvider.convertPath(
-            '/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'),
-        '''
+    newFile('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart',
+        content: '''
 const Map<String, LibraryInfo> libraries = const {
   "core": const LibraryInfo("core/core.dart")
 };
 ''');
-    coreCorePath = resourceProvider.convertPath('/sdk/lib/core/core.dart');
-    resourceProvider.newFile(coreCorePath, '''
+
+    newFile('/sdk/lib/core/core.dart', content: '''
 library dart.core;
 part 'int.dart';
 ''');
-    coreIntPath = resourceProvider.convertPath('/sdk/lib/core/int.dart');
-    resourceProvider.newFile(coreIntPath, '''
+
+    newFile('/sdk/lib/core/int.dart', content: '''
 part of dart.core;
 ''');
+
+    Folder sdkFolder = newFolder('/sdk');
     sdk = new FolderBasedDartSdk(resourceProvider, sdkFolder);
   }
 }
diff --git a/pkg/analyzer/test/generated/analysis_context_factory.dart b/pkg/analyzer/test/generated/analysis_context_factory.dart
index 0226a04..0ab45f5 100644
--- a/pkg/analyzer/test/generated/analysis_context_factory.dart
+++ b/pkg/analyzer/test/generated/analysis_context_factory.dart
@@ -130,6 +130,7 @@
       objectClassElement,
       overrideClassElement,
       proxyClassElement,
+      provider.setType.element,
       provider.stackTraceType.element,
       provider.stringType.element,
       provider.symbolType.element,
@@ -173,13 +174,15 @@
       proxyTopLevelVariableElt
     ];
     LibraryElementImpl coreLibrary = new LibraryElementImpl.forNode(
-        coreContext, AstTestFactory.libraryIdentifier2(["dart", "core"]));
+        coreContext, null, AstTestFactory.libraryIdentifier2(["dart", "core"]));
     coreLibrary.definingCompilationUnit = coreUnit;
     //
     // dart:async
     //
     LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(
-        coreContext, AstTestFactory.libraryIdentifier2(["dart", "async"]));
+        coreContext,
+        null,
+        AstTestFactory.libraryIdentifier2(["dart", "async"]));
     CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl();
     Source asyncSource = sourceFactory.forUri(DartSdk.DART_ASYNC);
     coreContext.setContents(asyncSource, "");
@@ -329,7 +332,7 @@
     htmlUnit.topLevelVariables = <TopLevelVariableElement>[document];
     htmlUnit.accessors = <PropertyAccessorElement>[document.getter];
     LibraryElementImpl htmlLibrary = new LibraryElementImpl.forNode(coreContext,
-        AstTestFactory.libraryIdentifier2(["dart", "dom", "html"]));
+        null, AstTestFactory.libraryIdentifier2(["dart", "dom", "html"]));
     htmlLibrary.definingCompilationUnit = htmlUnit;
     //
     // dart:math
@@ -390,7 +393,7 @@
     ];
     mathUnit.types = <ClassElement>[randomElement];
     LibraryElementImpl mathLibrary = new LibraryElementImpl.forNode(
-        coreContext, AstTestFactory.libraryIdentifier2(["dart", "math"]));
+        coreContext, null, AstTestFactory.libraryIdentifier2(["dart", "math"]));
     mathLibrary.definingCompilationUnit = mathUnit;
     //
     // Set empty sources for the rest of the libraries.
@@ -534,8 +537,9 @@
   Map<String, Source> sourceMap = new HashMap<String, Source>();
 
   TestPackageUriResolver(Map<String, String> map) {
-    map.forEach((String uri, String contents) {
-      sourceMap[uri] = new StringSource(contents, '/test_pkg_source.dart');
+    map.forEach((String name, String contents) {
+      sourceMap['package:$name/$name.dart'] =
+          new StringSource(contents, '/$name/lib/$name.dart');
     });
   }
 
diff --git a/pkg/analyzer/test/generated/bazel_test.dart b/pkg/analyzer/test/generated/bazel_test.dart
deleted file mode 100644
index e339b74..0000000
--- a/pkg/analyzer/test/generated/bazel_test.dart
+++ /dev/null
@@ -1,683 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/generated/bazel.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(BazelFileUriResolverTest);
-    defineReflectiveTests(BazelPackageUriResolverTest);
-    defineReflectiveTests(BazelWorkspaceTest);
-  });
-}
-
-@reflectiveTest
-class BazelFileUriResolverTest extends Object with ResourceProviderMixin {
-  BazelWorkspace workspace;
-  BazelFileUriResolver resolver;
-
-  void setUp() {
-    newFile('/workspace/WORKSPACE');
-    newFolder('/workspace/bazel-genfiles');
-    workspace =
-        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
-    resolver = new BazelFileUriResolver(workspace);
-    newFile('/workspace/test.dart');
-    newFile('/workspace/bazel-bin/gen1.dart');
-    newFile('/workspace/bazel-genfiles/gen2.dart');
-  }
-
-  void test_resolveAbsolute_doesNotExist() {
-    Source source = _resolvePath('/workspace/foo.dart');
-    expect(source, isNotNull);
-    expect(source.exists(), isFalse);
-    expect(source.fullName, convertPath('/workspace/foo.dart'));
-  }
-
-  void test_resolveAbsolute_file() {
-    Source source = _resolvePath('/workspace/test.dart');
-    expect(source, isNotNull);
-    expect(source.exists(), isTrue);
-    expect(source.fullName, convertPath('/workspace/test.dart'));
-  }
-
-  void test_resolveAbsolute_folder() {
-    Source source = _resolvePath('/workspace');
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_generated_file_exists_one() {
-    Source source = _resolvePath('/workspace/gen1.dart');
-    expect(source, isNotNull);
-    expect(source.exists(), isTrue);
-    expect(source.fullName, convertPath('/workspace/bazel-bin/gen1.dart'));
-  }
-
-  void test_resolveAbsolute_generated_file_exists_two() {
-    Source source = _resolvePath('/workspace/gen2.dart');
-    expect(source, isNotNull);
-    expect(source.exists(), isTrue);
-    expect(source.fullName, convertPath('/workspace/bazel-genfiles/gen2.dart'));
-  }
-
-  void test_resolveAbsolute_notFile_dartUri() {
-    Uri uri = new Uri(scheme: 'dart', path: 'core');
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_notFile_httpsUri() {
-    Uri uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNull);
-  }
-
-  void test_restoreAbsolute() {
-    Uri uri =
-        resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
-    expect(resolver.restoreAbsolute(source), uri);
-    expect(
-        resolver.restoreAbsolute(
-            new NonExistingSource(source.fullName, null, null)),
-        uri);
-  }
-
-  Source _resolvePath(String absolutePosixPath) {
-    String absolutePath = convertPath(absolutePosixPath);
-    Uri uri = resourceProvider.pathContext.toUri(absolutePath);
-    return resolver.resolveAbsolute(uri);
-  }
-}
-
-@reflectiveTest
-class BazelPackageUriResolverTest extends Object with ResourceProviderMixin {
-  BazelWorkspace workspace;
-  BazelPackageUriResolver resolver;
-
-  void test_resolveAbsolute_bin() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/my/foo/lib/foo1.dart',
-      '/workspace/bazel-bin/my/foo/lib/foo1.dart'
-    ]);
-    _assertResolve(
-        'package:my.foo/foo1.dart', '/workspace/bazel-bin/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_bin_notInWorkspace() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/bazel-bin/my/foo/lib/foo1.dart'
-    ]);
-    _assertResolve(
-        'package:my.foo/foo1.dart', '/workspace/bazel-bin/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_genfiles() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/my/foo/lib/foo1.dart',
-      '/workspace/bazel-genfiles/my/foo/lib/foo1.dart'
-    ]);
-    _assertResolve('package:my.foo/foo1.dart',
-        '/workspace/bazel-genfiles/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_genfiles_notInWorkspace() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/bazel-genfiles/my/foo/lib/foo1.dart'
-    ]);
-    _assertResolve('package:my.foo/foo1.dart',
-        '/workspace/bazel-genfiles/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_null_noSlash() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-    ]);
-    Source source = resolver.resolveAbsolute(Uri.parse('package:foo'));
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_null_notPackage() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-    ]);
-    Source source = resolver.resolveAbsolute(Uri.parse('dart:async'));
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_null_startsWithSlash() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/my/foo/lib/bar.dart',
-    ]);
-    Source source =
-        resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_readonly_bin() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/READONLY/prime/my/foo/lib/foo1.dart',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-      '/Users/user/test/prime/bazel-bin/my/foo/lib/foo1.dart',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:my.foo/foo1.dart',
-        '/Users/user/test/prime/bazel-bin/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_readonly_bin_notInWorkspace() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-      '/Users/user/test/prime/bazel-bin/my/foo/lib/foo1.dart',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:my.foo/foo1.dart',
-        '/Users/user/test/prime/bazel-bin/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_readonly_genfiles() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/READONLY/prime/my/foo/lib/foo1.dart',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-      '/Users/user/test/prime/bazel-genfiles/my/foo/lib/foo1.dart',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:my.foo/foo1.dart',
-        '/Users/user/test/prime/bazel-genfiles/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_readonly_genfiles_notInWorkspace() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-      '/Users/user/test/prime/bazel-genfiles/my/foo/lib/foo1.dart',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:my.foo/foo1.dart',
-        '/Users/user/test/prime/bazel-genfiles/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_readonly_thirdParty_bin() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-      '/Users/user/test/prime/bazel-bin/third_party/dart/foo/lib/foo1.dart',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:foo/foo1.dart',
-        '/Users/user/test/prime/bazel-bin/third_party/dart/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_readonly_thirdParty_genfiles() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-      '/Users/user/test/prime/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:foo/foo1.dart',
-        '/Users/user/test/prime/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_readonly_thirdParty_workspace_doesNotExist() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:foo/foo2.dart',
-        '/Users/user/test/prime/third_party/dart/foo/lib/foo2.dart',
-        exists: false);
-  }
-
-  void test_resolveAbsolute_readonly_thirdParty_workspace_exists() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:foo/foo1.dart',
-        '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_readonly_workspace_doesNotExist() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:my.foo/foo1.dart',
-        '/Users/user/test/prime/my/foo/lib/foo1.dart',
-        exists: false);
-  }
-
-  void test_resolveAbsolute_readonly_workspace_exists() {
-    _addResources([
-      '/Users/user/test/READONLY/prime/',
-      '/Users/user/test/READONLY/prime/my/foo/lib/foo1.dart',
-      '/Users/user/test/prime/bazel-genfiles/',
-      '/Users/user/test/prime/my/module/',
-    ], workspacePath: '/Users/user/test/prime/my/module');
-    _assertResolve('package:my.foo/foo1.dart',
-        '/Users/user/test/READONLY/prime/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_thirdParty_bin() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/third_party/dart/foo/lib/foo1.dart',
-      '/workspace/bazel-bin/third_party/dart/foo/lib/foo1.dart',
-    ]);
-    _assertResolve('package:foo/foo1.dart',
-        '/workspace/bazel-bin/third_party/dart/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_thirdParty_bin_notInWorkspace() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/bazel-bin/third_party/dart/foo/lib/foo1.dart',
-    ]);
-    _assertResolve('package:foo/foo1.dart',
-        '/workspace/bazel-bin/third_party/dart/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_thirdParty_doesNotExist() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/third_party/dart/foo/lib/foo1.dart',
-    ]);
-    _assertResolve('package:foo/foo2.dart',
-        '/workspace/third_party/dart/foo/lib/foo2.dart',
-        exists: false);
-  }
-
-  void test_resolveAbsolute_thirdParty_exists() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/third_party/dart/foo/lib/foo1.dart',
-    ]);
-    _assertResolve('package:foo/foo1.dart',
-        '/workspace/third_party/dart/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_thirdParty_genfiles() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/third_party/dart/foo/lib/foo1.dart',
-      '/workspace/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
-    ]);
-    _assertResolve('package:foo/foo1.dart',
-        '/workspace/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_thirdParty_genfiles_notInWorkspace() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
-    ]);
-    _assertResolve('package:foo/foo1.dart',
-        '/workspace/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_workspace_doesNotExist() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-    ]);
-    _assertResolve('package:my.foo/doesNotExist.dart',
-        '/workspace/my/foo/lib/doesNotExist.dart',
-        exists: false);
-  }
-
-  void test_resolveAbsolute_workspace_exists() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/my/foo/lib/foo1.dart',
-    ]);
-    _assertResolve(
-        'package:my.foo/foo1.dart', '/workspace/my/foo/lib/foo1.dart',
-        exists: true);
-  }
-
-  void test_restoreAbsolute_noPackageName_workspace() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/lib/foo1.dart',
-      '/workspace/foo/lib/foo2.dart',
-    ]);
-    _assertRestore('/workspace/lib/foo1.dart', null);
-    _assertRestore('/workspace/foo/lib/foo2.dart', null);
-  }
-
-  void test_restoreAbsolute_noPathInLib_bin() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/bazel-bin/my/foo/lib/foo1.dart',
-    ]);
-    _assertRestore('/workspace/bazel-bin', null);
-    _assertRestore('/workspace/bazel-bin/my', null);
-    _assertRestore('/workspace/bazel-bin/my/foo', null);
-    _assertRestore('/workspace/bazel-bin/my/foo/lib', null);
-  }
-
-  void test_restoreAbsolute_noPathInLib_genfiles() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/bazel-genfiles/my/foo/lib/foo1.dart',
-    ]);
-    _assertRestore('/workspace/bazel-genfiles', null);
-    _assertRestore('/workspace/bazel-genfiles/my', null);
-    _assertRestore('/workspace/bazel-genfiles/my/foo', null);
-    _assertRestore('/workspace/bazel-genfiles/my/foo/lib', null);
-  }
-
-  void test_restoreAbsolute_noPathInLib_workspace() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/my/foo/lib/foo1.dart',
-    ]);
-    _assertRestore('/workspace', null);
-    _assertRestore('/workspace/my', null);
-    _assertRestore('/workspace/my/foo', null);
-    _assertRestore('/workspace/my/foo/lib', null);
-  }
-
-  void test_restoreAbsolute_thirdPartyNotDart_workspace() {
-    _addResources([
-      '/workspace/WORKSPACE',
-      '/workspace/bazel-genfiles/',
-      '/workspace/third_party/something/lib/foo.dart',
-    ]);
-    _assertRestore('/workspace/third_party/something/lib/foo.dart',
-        'package:third_party.something/foo.dart');
-  }
-
-  void _addResources(List<String> paths, {String workspacePath: '/workspace'}) {
-    for (String path in paths) {
-      if (path.endsWith('/')) {
-        newFolder(path.substring(0, path.length - 1));
-      } else {
-        newFile(path);
-      }
-    }
-    workspace =
-        BazelWorkspace.find(resourceProvider, convertPath(workspacePath));
-    resolver = new BazelPackageUriResolver(workspace);
-  }
-
-  void _assertResolve(String uriStr, String posixPath,
-      {bool exists: true, bool restore: true}) {
-    Uri uri = Uri.parse(uriStr);
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
-    expect(source.fullName, convertPath(posixPath));
-    expect(source.uri, uri);
-    expect(source.exists(), exists);
-    // If enabled, test also "restoreAbsolute".
-    if (restore) {
-      Uri uri = resolver.restoreAbsolute(source);
-      expect(uri.toString(), uriStr);
-    }
-  }
-
-  void _assertRestore(String posixPath, String expectedUri) {
-    String path = convertPath(posixPath);
-    _MockSource source = new _MockSource(path);
-    Uri uri = resolver.restoreAbsolute(source);
-    expect(uri?.toString(), expectedUri);
-  }
-}
-
-@reflectiveTest
-class BazelWorkspaceTest extends Object with ResourceProviderMixin {
-  void test_find_fail_notAbsolute() {
-    expect(
-        () =>
-            BazelWorkspace.find(resourceProvider, convertPath('not_absolute')),
-        throwsArgumentError);
-  }
-
-  void test_find_hasReadonlyFolder() {
-    newFolder('/Users/user/test/READONLY/prime');
-    newFolder('/Users/user/test/prime');
-    newFolder('/Users/user/test/prime/bazel-genfiles');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
-    expect(workspace.root, convertPath('/Users/user/test/prime'));
-    expect(workspace.readonly, convertPath('/Users/user/test/READONLY/prime'));
-    expect(workspace.bin, convertPath('/Users/user/test/prime/bazel-bin'));
-    expect(workspace.genfiles,
-        convertPath('/Users/user/test/prime/bazel-genfiles'));
-  }
-
-  void test_find_hasReadonlyFolder_bad_actuallyHasWorkspaceFile() {
-    newFolder('/Users/user/test/READONLY');
-    newFile('/Users/user/test/prime/WORKSPACE');
-    newFolder('/Users/user/test/prime/bazel-genfiles');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
-    expect(workspace.root, convertPath('/Users/user/test/prime'));
-    expect(workspace.readonly, isNull);
-    expect(workspace.bin, convertPath('/Users/user/test/prime/bazel-bin'));
-    expect(workspace.genfiles,
-        convertPath('/Users/user/test/prime/bazel-genfiles'));
-  }
-
-  void test_find_hasReadonlyFolder_blaze() {
-    newFolder('/Users/user/test/READONLY/prime');
-    newFolder('/Users/user/test/prime');
-    newFolder('/Users/user/test/prime/blaze-genfiles');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
-    expect(workspace.root, convertPath('/Users/user/test/prime'));
-    expect(workspace.readonly, convertPath('/Users/user/test/READONLY/prime'));
-    expect(workspace.bin, convertPath('/Users/user/test/prime/blaze-bin'));
-    expect(workspace.genfiles,
-        convertPath('/Users/user/test/prime/blaze-genfiles'));
-  }
-
-  void test_find_hasWorkspaceFile() {
-    newFile('/workspace/WORKSPACE');
-    newFolder('/workspace/bazel-genfiles');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.readonly, isNull);
-    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
-    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
-  }
-
-  void test_find_hasWorkspaceFile_forModuleInWorkspace() {
-    newFile('/workspace/WORKSPACE');
-    newFolder('/workspace/bazel-genfiles');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.readonly, isNull);
-    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
-    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
-  }
-
-  void test_find_hasWorkspaceFile_forWorkspace() {
-    newFile('/workspace/WORKSPACE');
-    newFolder('/workspace/bazel-genfiles');
-    BazelWorkspace workspace =
-        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.readonly, isNull);
-    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
-    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
-  }
-
-  void test_find_hasWorkspaceFile_forWorkspace_blaze() {
-    newFile('/workspace/WORKSPACE');
-    newFolder('/workspace/blaze-genfiles');
-    BazelWorkspace workspace =
-        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.readonly, isNull);
-    expect(workspace.bin, convertPath('/workspace/blaze-bin'));
-    expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
-  }
-
-  void test_find_null_noWorkspaceMarkers() {
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
-    expect(workspace, isNull);
-  }
-
-  void test_find_null_noWorkspaceMarkers_inRoot() {
-    BazelWorkspace workspace =
-        BazelWorkspace.find(resourceProvider, convertPath('/'));
-    expect(workspace, isNull);
-  }
-
-  void test_find_null_symlinkPrefix() {
-    String prefix = BazelWorkspace.defaultSymlinkPrefix;
-    newFile('/workspace/WORKSPACE');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.readonly, isNull);
-    expect(workspace.bin, convertPath('/workspace/$prefix-bin'));
-    expect(workspace.genfiles, convertPath('/workspace/$prefix-genfiles'));
-  }
-
-  void test_findFile_hasReadonlyFolder() {
-    newFolder('/Users/user/test/READONLY/prime');
-    newFolder('/Users/user/test/prime');
-    newFile('/Users/user/test/prime/my/module/test1.dart');
-    newFile('/Users/user/test/prime/my/module/test2.dart');
-    newFile('/Users/user/test/prime/my/module/test3.dart');
-    newFile('/Users/user/test/prime/bazel-bin/my/module/test2.dart');
-    newFile('/Users/user/test/prime/bazel-genfiles/my/module/test3.dart');
-    newFile('/Users/user/test/READONLY/prime/other/module/test4.dart');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
-    expect(
-        workspace
-            .findFile(
-                convertPath('/Users/user/test/prime/my/module/test1.dart'))
-            .path,
-        convertPath('/Users/user/test/prime/my/module/test1.dart'));
-    expect(
-        workspace
-            .findFile(
-                convertPath('/Users/user/test/prime/my/module/test2.dart'))
-            .path,
-        convertPath('/Users/user/test/prime/bazel-bin/my/module/test2.dart'));
-    expect(
-        workspace
-            .findFile(
-                convertPath('/Users/user/test/prime/my/module/test3.dart'))
-            .path,
-        convertPath(
-            '/Users/user/test/prime/bazel-genfiles/my/module/test3.dart'));
-    expect(
-        workspace
-            .findFile(
-                convertPath('/Users/user/test/prime/other/module/test4.dart'))
-            .path,
-        convertPath('/Users/user/test/READONLY/prime/other/module/test4.dart'));
-  }
-
-  void test_findFile_main_overrides_readonly() {
-    newFolder('/Users/user/test/READONLY/prime');
-    newFolder('/Users/user/test/prime');
-    newFolder('/Users/user/test/prime/bazel-genfiles');
-    newFile('/Users/user/test/prime/my/module/test.dart');
-    newFile('/Users/user/test/READONLY/prime/my/module/test.dart');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
-    expect(
-        workspace
-            .findFile(convertPath('/Users/user/test/prime/my/module/test.dart'))
-            .path,
-        convertPath('/Users/user/test/prime/my/module/test.dart'));
-  }
-
-  void test_findFile_noReadOnly() {
-    newFile('/workspace/WORKSPACE');
-    newFile('/workspace/my/module/test1.dart');
-    newFile('/workspace/my/module/test2.dart');
-    newFile('/workspace/my/module/test3.dart');
-    newFile('/workspace/bazel-bin/my/module/test2.dart');
-    newFile('/workspace/bazel-genfiles/my/module/test3.dart');
-    BazelWorkspace workspace = BazelWorkspace.find(
-        resourceProvider, convertPath('/workspace/my/module'));
-    expect(
-        workspace.findFile(convertPath('/workspace/my/module/test1.dart')).path,
-        convertPath('/workspace/my/module/test1.dart'));
-    expect(
-        workspace.findFile(convertPath('/workspace/my/module/test2.dart')).path,
-        convertPath('/workspace/bazel-bin/my/module/test2.dart'));
-    expect(
-        workspace.findFile(convertPath('/workspace/my/module/test3.dart')).path,
-        convertPath('/workspace/bazel-genfiles/my/module/test3.dart'));
-  }
-}
-
-class _MockSource implements Source {
-  @override
-  final String fullName;
-
-  _MockSource(this.fullName);
-
-  @override
-  noSuchMethod(Invocation invocation) {
-    throw new StateError('Unexpected invocation of ${invocation.memberName}');
-  }
-}
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_driver_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_driver_test.dart
index b8d01e9..2a3d968 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_driver_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_driver_test.dart
@@ -1,14 +1,19 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'checked_mode_compile_time_error_code_test.dart';
+import 'resolver_test_case.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(CheckedModeCompileTimeErrorCodeTest_Driver);
+    defineReflectiveTests(SetElementTypeNotAssignableTest);
   });
 }
 
@@ -18,3 +23,23 @@
   @override
   bool get enableNewAnalysisDriver => true;
 }
+
+@reflectiveTest
+class SetElementTypeNotAssignableTest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_simple() async {
+    Source source = addSource("var v = const <String>{42};");
+    await computeAnalysisResult(source);
+    // TODO(brianwilkerson) Fix this so that only one error is produced.
+    assertErrors(source, [
+      CheckedModeCompileTimeErrorCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE,
+      StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+}
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
index 32623b2..6bfb23d 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
@@ -28,8 +28,7 @@
 var v = const A(3, 2);
 ''');
     await computeAnalysisResult(source);
-    assertErrors(
-        source, [CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
     verify([source]);
   }
 
@@ -634,8 +633,7 @@
 }
 var v = const A.a1(0);''');
     await computeAnalysisResult(source);
-    assertErrors(
-        source, [CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
     verify([source]);
   }
 
@@ -651,8 +649,7 @@
 const f = const D('0.0');
 ''');
     await computeAnalysisResult(source);
-    assertErrors(
-        source, [CheckedModeCompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+    assertErrors(source, [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
     verify([source]);
   }
 
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
index e2ad9cf..9ff1460 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_driver_test.dart
@@ -1,14 +1,22 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'compile_time_error_code_test.dart';
+import 'resolver_test_case.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(CompileTimeErrorCodeTest_Driver);
+    defineReflectiveTests(ConstSetElementTypeImplementsEqualsTest);
+    defineReflectiveTests(InvalidTypeArgumentInConstSetTest);
+    defineReflectiveTests(NonConstSetElementFromDeferredLibraryTest);
+    defineReflectiveTests(NonConstSetElementTest);
   });
 }
 
@@ -31,12 +39,6 @@
 
   @override
   @failingTest
-  test_genericFunctionTypeArgument_typedef() {
-    return super.test_genericFunctionTypeArgument_typedef();
-  }
-
-  @override
-  @failingTest
   test_invalidIdentifierInAsync_async() {
     return super.test_invalidIdentifierInAsync_async();
   }
@@ -95,3 +97,188 @@
     return super.test_yieldInNonGenerator_sync();
   }
 }
+
+@reflectiveTest
+class ConstSetElementTypeImplementsEqualsTest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_constField() async {
+    Source source = addSource(r'''
+class A {
+  static const a = const A();
+  const A();
+  operator ==(other) => false;
+}
+main() {
+  const {A.a};
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  test_direct() async {
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+main() {
+  const {const A()};
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  test_dynamic() async {
+    // Note: static type of B.a is "dynamic", but actual type of the const
+    // object is A.  We need to make sure we examine the actual type when
+    // deciding whether there is a problem with operator==.
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+class B {
+  static const a = const A();
+}
+main() {
+  const {B.a};
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  test_factory() async {
+    Source source = addSource(r'''
+class A { const factory A() = B; }
+
+class B implements A {
+  const B();
+
+  operator ==(o) => true;
+}
+
+main() {
+  var m = const {const A()};
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+
+  test_super() async {
+    Source source = addSource(r'''
+class A {
+  const A();
+  operator ==(other) => false;
+}
+class B extends A {
+  const B();
+}
+main() {
+  const {const B()};
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source,
+        [CompileTimeErrorCode.CONST_SET_ELEMENT_TYPE_IMPLEMENTS_EQUALS]);
+    verify([source]);
+  }
+}
+
+@reflectiveTest
+class InvalidTypeArgumentInConstSetTest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_class() async {
+    Source source = addSource(r'''
+class A<E> {
+  m() {
+    return const <E>{};
+  }
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(
+        source, [CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET]);
+    verify([source]);
+  }
+}
+
+@reflectiveTest
+class NonConstSetElementFromDeferredLibraryTest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_topLevelVariable_immediate() async {
+    await resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {a.c};
+}'''
+    ], [
+      CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+
+  test_topLevelVariable_nested() async {
+    await resolveWithErrors(<String>[
+      r'''
+library lib1;
+const int c = 1;''',
+      r'''
+library root;
+import 'lib1.dart' deferred as a;
+f() {
+  return const {a.c + 1};
+}'''
+    ], [
+      CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY
+    ]);
+  }
+}
+
+@reflectiveTest
+class NonConstSetElementTest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_parameter() async {
+    Source source = addSource(r'''
+f(a) {
+  return const {a};
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT]);
+    verify([source]);
+  }
+}
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index a04cda9..c266770 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -38,12 +38,6 @@
 
   @override
   @failingTest
-  test_genericFunctionTypeArgument_typedef() {
-    return super.test_genericFunctionTypeArgument_typedef();
-  }
-
-  @override
-  @failingTest
   test_invalidIdentifierInAsync_async() {
     return super.test_invalidIdentifierInAsync_async();
   }
@@ -895,37 +889,6 @@
     verify([source]);
   }
 
-  test_constConstructorWithMixinWithField() async {
-    Source source = addSource(r'''
-class A {
-  var a;
-}
-class B extends Object with A {
-  const B();
-}''');
-    await computeAnalysisResult(source);
-
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
-      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD
-    ]);
-    verify([source]);
-  }
-
-  test_constConstructorWithMixinWithField_final() async {
-    Source source = addSource(r'''
-class A {
-  final int a = 0;
-}
-class B extends Object with A {
-  const B();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD]);
-    verify([source]);
-  }
-
   test_constConstructorWithNonConstSuper_explicit() async {
     Source source = addSource(r'''
 class A {
@@ -1235,9 +1198,9 @@
   }
 
   test_constEvalTypeInt_binary() async {
-    await _check_constEvalTypeInt_withParameter_binary("p ^ ''");
-    await _check_constEvalTypeInt_withParameter_binary("p & ''");
-    await _check_constEvalTypeInt_withParameter_binary("p | ''");
+    await _check_constEvalTypeBoolOrInt_withParameter_binary("p ^ ''");
+    await _check_constEvalTypeBoolOrInt_withParameter_binary("p & ''");
+    await _check_constEvalTypeBoolOrInt_withParameter_binary("p | ''");
     await _check_constEvalTypeInt_withParameter_binary("p >> ''");
     await _check_constEvalTypeInt_withParameter_binary("p << ''");
   }
@@ -2406,36 +2369,6 @@
     verify([source]);
   }
 
-  test_genericFunctionTypeArgument_class() async {
-    Source source = addSource(r'''
-class C<T> {}
-C<T Function<T>(T)> c;''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_function() async {
-    Source source = addSource(r'''
-T f<T>(T) => null;
-main() { f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_functionType() async {
-    Source source = addSource(r'''
-T Function<T>(T) f;
-main() { f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
   test_genericFunctionTypeArgument_inference_function() async {
     Source source = addSource(r'''
 T f<T>(T t) => null;
@@ -2465,29 +2398,6 @@
     verify([source]);
   }
 
-  test_genericFunctionTypeArgument_method() async {
-    Source source = addSource(r'''
-class C {
-  T f<T>(T) => null;
-}
-main() { new C().f<S Function<S>(S)>(null); }''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
-  test_genericFunctionTypeArgument_typedef() async {
-    // TODO(mfairhurst) diagnose these parse errors to give the correct error
-    Source source = addSource(r'''
-typedef T f<T>(T t);
-final T<Function<S>(int)> x = null;''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
-    verify([source]);
-  }
-
   test_genericFunctionTypeAsBound_class() async {
     Source source = addSource(r'''
 class C<T extends S Function<S>(S)> {
@@ -4730,7 +4640,7 @@
 }''');
     await computeAnalysisResult(source);
     assertErrors(source, [
-      CompileTimeErrorCode.CONST_EVAL_TYPE_INT,
+      CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT,
       StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
     ]);
     verify([source]);
@@ -5076,23 +4986,6 @@
     verify([source]);
   }
 
-  test_prefix_conditionalPropertyAccess_call() async {
-    addNamedSource('/lib.dart', '''
-library lib;
-g() {}
-''');
-    Source source = addSource('''
-import 'lib.dart' as p;
-f() {
-  p?.g();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
-    verify([source]);
-  }
-
   test_prefix_conditionalPropertyAccess_call_loadLibrary() async {
     addNamedSource('/lib.dart', '''
 library lib;
@@ -5175,36 +5068,6 @@
     verify([source]);
   }
 
-  test_prefix_unqualified_invocation_in_method() async {
-    addNamedSource('/lib.dart', 'librarylib;');
-    Source source = addSource('''
-import 'lib.dart' as p;
-class C {
-  f() {
-    p();
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
-    verify([source]);
-  }
-
-  test_prefix_unqualified_invocation_not_in_method() async {
-    addNamedSource('/lib.dart', 'librarylib;');
-    Source source = addSource('''
-import 'lib.dart' as p;
-f() {
-  p();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(
-        source, [CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT]);
-    verify([source]);
-  }
-
   test_prefixCollidesWithTopLevelMembers_functionTypeAlias() async {
     addNamedSource("/lib.dart", r'''
 library lib;
@@ -5423,9 +5286,9 @@
   }
 
   test_recursiveCompileTimeConstant_fromMapLiteral() async {
-    resourceProvider.newFile(
-      resourceProvider.convertPath('/constants.dart'),
-      r'''
+    newFile(
+      '/constants.dart',
+      content: r'''
 const int x = y;
 const int y = x;
 ''',
@@ -6334,7 +6197,7 @@
     assertErrors(test, [HintCode.UNUSED_IMPORT]);
 
     // Remove the overlay in the same way as AnalysisServer.
-    resourceProvider.deleteFile(target.fullName);
+    deleteFile(target.fullName);
     if (enableNewAnalysisDriver) {
       driver.removeFile(target.fullName);
     } else {
@@ -6352,7 +6215,7 @@
     await computeAnalysisResult(source);
     assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
 
-    String targetPath = resourceProvider.convertPath('/target.dart');
+    String targetPath = convertPath('/target.dart');
     if (enableNewAnalysisDriver) {
       // Add an overlay in the same way as AnalysisServer.
       fileContentOverlay[targetPath] = '';
@@ -6592,7 +6455,7 @@
     verify([source]);
   }
 
-  Future<Null> _check_constEvalThrowsException_binary_null(
+  Future<void> _check_constEvalThrowsException_binary_null(
       String expr, bool resolved) async {
     Source source = addSource("const C = $expr;");
     await computeAnalysisResult(source);
@@ -6602,7 +6465,7 @@
     }
   }
 
-  Future<Null> _check_constEvalTypeBool_withParameter_binary(
+  Future<void> _check_constEvalTypeBool_withParameter_binary(
       String expr) async {
     Source source = addSource('''
 class A {
@@ -6617,7 +6480,22 @@
     verify([source]);
   }
 
-  Future<Null> _check_constEvalTypeInt_withParameter_binary(String expr) async {
+  Future<void> _check_constEvalTypeBoolOrInt_withParameter_binary(
+      String expr) async {
+    Source source = addSource('''
+class A {
+  final a;
+  const A(int p) : a = $expr;
+}''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [
+      CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT,
+      StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE
+    ]);
+    verify([source]);
+  }
+
+  Future<void> _check_constEvalTypeInt_withParameter_binary(String expr) async {
     Source source = addSource('''
 class A {
   final a;
@@ -6631,7 +6509,7 @@
     verify([source]);
   }
 
-  Future<Null> _check_constEvalTypeNum_withParameter_binary(String expr) async {
+  Future<void> _check_constEvalTypeNum_withParameter_binary(String expr) async {
     Source source = addSource('''
 class A {
   final a;
@@ -6645,7 +6523,7 @@
     verify([source]);
   }
 
-  Future<Null> _check_wrongNumberOfParametersForOperator(
+  Future<void> _check_wrongNumberOfParametersForOperator(
       String name, String parameters) async {
     Source source = addSource('''
 class A {
@@ -6657,12 +6535,12 @@
     verify([source]);
   }
 
-  Future<Null> _check_wrongNumberOfParametersForOperator1(String name) async {
+  Future<void> _check_wrongNumberOfParametersForOperator1(String name) async {
     await _check_wrongNumberOfParametersForOperator(name, "");
     await _check_wrongNumberOfParametersForOperator(name, "a, b");
   }
 
-  Future<Null> _privateCollisionInMixinApplicationTest(String testCode) async {
+  Future<void> _privateCollisionInMixinApplicationTest(String testCode) async {
     addNamedSource('/lib1.dart', '''
 class A {
   int _x;
diff --git a/pkg/analyzer/test/generated/constant_test.dart b/pkg/analyzer/test/generated/constant_test.dart
index 8c5dadf..12c9c85 100644
--- a/pkg/analyzer/test/generated/constant_test.dart
+++ b/pkg/analyzer/test/generated/constant_test.dart
@@ -15,7 +15,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'resolver_test_case.dart';
-import 'test_support.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -478,11 +477,8 @@
         analysisContext.resolveCompilationUnit(source, library);
     expect(unit, isNotNull);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
-    CompilationUnitMember declaration = declarations[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
-        TopLevelVariableDeclaration, declaration);
-    NodeList<VariableDeclaration> variables =
-        (declaration as TopLevelVariableDeclaration).variables.variables;
+    TopLevelVariableDeclaration declaration = declarations[0];
+    NodeList<VariableDeclaration> variables = declaration.variables.variables;
     expect(variables, hasLength(1));
     ConstantEvaluator evaluator = new ConstantEvaluator(
         source, analysisContext.typeProvider,
diff --git a/pkg/analyzer/test/generated/declaration_resolver_test.dart b/pkg/analyzer/test/generated/declaration_resolver_test.dart
index 0a991f7..26dd5a1 100644
--- a/pkg/analyzer/test/generated/declaration_resolver_test.dart
+++ b/pkg/analyzer/test/generated/declaration_resolver_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -58,7 +58,7 @@
     }
   }
 
-  Future<Null> setupCode(String code) async {
+  Future<void> setupCode(String code) async {
     this.code = code;
     unit = await resolveSource(code + ' const a = null;');
     unit2 = _cloneResolveUnit(unit);
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 75e534a..58c0a5c 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -277,7 +277,7 @@
     });
   }
 
-  Future<Null> _validateAnnotation(
+  Future<void> _validateAnnotation(
       String annotationPrefix,
       String annotationText,
       validator(SimpleIdentifier name1, SimpleIdentifier name2,
@@ -829,31 +829,6 @@
     _listener.assertNoErrors();
   }
 
-  test_visitMethodInvocation_namedParameter() async {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    String methodName = "m";
-    String parameterName = "p";
-    MethodElementImpl method = ElementFactory.methodElement(methodName, null);
-    ParameterElement parameter = ElementFactory.namedParameter(parameterName);
-    method.parameters = <ParameterElement>[parameter];
-    classA.methods = <MethodElement>[method];
-    SimpleIdentifier left = AstTestFactory.identifier3("i");
-    left.staticType = classA.type;
-    MethodInvocation invocation = AstTestFactory.methodInvocation(
-        left, methodName, [
-      AstTestFactory.namedExpression2(parameterName, AstTestFactory.integer(0))
-    ]);
-    _resolveNode(invocation);
-    expect(invocation.methodName.staticElement, same(method));
-    expect(
-        (invocation.argumentList.arguments[0] as NamedExpression)
-            .name
-            .label
-            .staticElement,
-        same(parameter));
-    _listener.assertNoErrors();
-  }
-
   test_visitPostfixExpression() async {
     InterfaceType numType = _typeProvider.numType;
     SimpleIdentifier operand = AstTestFactory.identifier3("i");
@@ -1074,10 +1049,8 @@
     AstTestFactory.assignmentExpression(
         node, TokenType.EQ, AstTestFactory.integer(0));
     _resolveInClass(node, classA);
-    Element element = node.staticElement;
-    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement,
-        PropertyAccessorElement, element);
-    expect((element as PropertyAccessorElement).isSetter, isTrue);
+    PropertyAccessorElement element = node.staticElement;
+    expect(element.isSetter, isTrue);
     _listener.assertNoErrors();
   }
 
@@ -1290,8 +1263,7 @@
 
   @override
   void setUp() {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl()
-      ..previewDart2 = true;
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     resetWith(options: options);
   }
 
diff --git a/pkg/analyzer/test/generated/gn_test.dart b/pkg/analyzer/test/generated/gn_test.dart
deleted file mode 100644
index 46ff4ea..0000000
--- a/pkg/analyzer/test/generated/gn_test.dart
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/generated/gn.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(GnWorkspaceTest);
-  });
-}
-
-@reflectiveTest
-class GnWorkspaceTest extends Object with ResourceProviderMixin {
-  void test_find_noJiriRoot() {
-    newFolder('/workspace');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace'));
-    expect(workspace, isNull);
-  }
-
-  void test_find_noPackagesFiles() {
-    newFolder('/workspace/.jiri_root');
-    newFolder('/workspace/some/code');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace'));
-    expect(workspace, isNull);
-  }
-
-  void test_find_notAbsolute() {
-    expect(
-        () => GnWorkspace.find(resourceProvider, convertPath('not_absolute')),
-        throwsArgumentError);
-  }
-
-  void test_find_withRoot() {
-    newFolder('/workspace/.jiri_root');
-    newFolder('/workspace/some/code');
-    newFile('/workspace/some/code/pubspec.yaml');
-    String buildDir = convertPath('out/debug-x87_128');
-    newFile('/workspace/.config',
-        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
-    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
-    expect(workspace.root, convertPath('/workspace'));
-  }
-
-  void test_packages() {
-    newFolder('/workspace/.jiri_root');
-    newFolder('/workspace/some/code');
-    newFile('/workspace/some/code/pubspec.yaml');
-    String buildDir = convertPath('out/debug-x87_128');
-    newFile('/workspace/.config',
-        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
-    String packageLocation = convertPath('/workspace/this/is/the/package');
-    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
-    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
-        content: 'flutter:$packageUri');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path, packageLocation);
-  }
-
-  void test_packages_absoluteBuildDir() {
-    newFolder('/workspace/.jiri_root');
-    newFolder('/workspace/some/code');
-    newFile('/workspace/some/code/pubspec.yaml');
-    String buildDir = convertPath('/workspace/out/debug-x87_128');
-    newFile('/workspace/.config',
-        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
-    String packageLocation = convertPath('/workspace/this/is/the/package');
-    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
-    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
-        content: 'flutter:$packageUri');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path, packageLocation);
-  }
-
-  void test_packages_fallbackBuildDir() {
-    newFolder('/workspace/.jiri_root');
-    newFolder('/workspace/some/code');
-    newFile('/workspace/some/code/pubspec.yaml');
-    String packageLocation = convertPath('/workspace/this/is/the/package');
-    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
-    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
-        content: 'flutter:$packageUri');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path, packageLocation);
-  }
-
-  void test_packages_fallbackBuildDirWithUselessConfig() {
-    newFolder('/workspace/.jiri_root');
-    newFolder('/workspace/some/code');
-    newFile('/workspace/some/code/pubspec.yaml');
-    newFile('/workspace/.config', content: 'FOO=foo\n' + 'BAR=bar\n');
-    String packageLocation = convertPath('/workspace/this/is/the/package');
-    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
-    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
-        content: 'flutter:$packageUri');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['flutter'][0].path, packageLocation);
-  }
-
-  void test_packages_multipleCandidates() {
-    newFolder('/workspace/.jiri_root');
-    newFolder('/workspace/some/code');
-    newFile('/workspace/some/code/pubspec.yaml');
-    String buildDir = convertPath('out/release-y22_256');
-    newFile('/workspace/.config',
-        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
-    String packageLocation = convertPath('/workspace/this/is/the/package');
-    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
-    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
-        content: 'flutter:$packageUri');
-    String otherPackageLocation = convertPath('/workspace/here/too');
-    Uri otherPackageUri =
-        resourceProvider.pathContext.toUri(otherPackageLocation);
-    newFile(
-        '/workspace/out/release-y22_256/dartlang/gen/some/code/foo.packages',
-        content: 'rettulf:$otherPackageUri');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.packageMap.length, 1);
-    expect(workspace.packageMap['rettulf'][0].path, otherPackageLocation);
-  }
-
-  void test_packages_multipleFiles() {
-    newFolder('/workspace/.jiri_root');
-    newFolder('/workspace/some/code');
-    newFile('/workspace/some/code/pubspec.yaml');
-    String buildDir = convertPath('out/debug-x87_128');
-    newFile('/workspace/.config',
-        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR=$buildDir\n' + 'BAR=bar\n');
-    String packageOneLocation = convertPath('/workspace/this/is/the/package');
-    Uri packageOneUri = resourceProvider.pathContext.toUri(packageOneLocation);
-    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
-        content: 'flutter:$packageOneUri');
-    String packageTwoLocation =
-        convertPath('/workspace/this/is/the/other/package');
-    Uri packageTwoUri = resourceProvider.pathContext.toUri(packageTwoLocation);
-    newFile(
-        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_test.packages',
-        content: 'rettulf:$packageTwoUri');
-    GnWorkspace workspace =
-        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
-    expect(workspace, isNotNull);
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.packageMap.length, 2);
-    expect(workspace.packageMap['flutter'][0].path, packageOneLocation);
-    expect(workspace.packageMap['rettulf'][0].path, packageTwoLocation);
-  }
-}
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index bcf3bad..e33ea7d 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,7 +7,7 @@
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -17,18 +17,12 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(CrossPackageHintCodeTest);
     defineReflectiveTests(HintCodeTest);
   });
 }
 
-@reflectiveTest
-class HintCodeTest extends ResolverTestCase {
-  @override
-  void reset() {
-    super.resetWith(packages: [
-      [
-        'meta',
-        r'''
+final metaLibraryStub = r'''
 library meta;
 
 const _AlwaysThrows alwaysThrows = const _AlwaysThrows();
@@ -70,8 +64,301 @@
 class _VisibleForTesting {
   const _VisibleForTesting();
 }
+''';
+
+@reflectiveTest
+class CrossPackageHintCodeTest extends ResolverTestCase {
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_subtypeOfSealedClass_extending() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+      [
+        'foo',
+        r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
 '''
-      ],
+      ]
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:foo/foo.dart';
+                    class Bar extends Foo {}
+                    ''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    verify([source]);
+  }
+
+  test_subtypeOfSealedClass_implementing() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+      [
+        'foo',
+        r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+'''
+      ]
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:foo/foo.dart';
+                    class Bar implements Foo {}
+                    ''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    verify([source]);
+  }
+
+  test_subtypeOfSealedClass_mixinApplication() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+      [
+        'foo',
+        r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+'''
+      ]
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:foo/foo.dart';
+                    class Bar1 {}
+                    class Bar2 = Bar1 with Foo;
+                    ''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    verify([source]);
+  }
+
+  test_subtypeOfSealedClass_mixinImplements() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+      [
+        'foo',
+        r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+'''
+      ]
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:foo/foo.dart';
+                    mixin Bar implements Foo {}
+                    ''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    verify([source]);
+  }
+
+  test_subtypeOfSealedClass_mixinOn() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+      [
+        'foo',
+        r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+'''
+      ]
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:foo/foo.dart';
+                    mixin Bar on Foo {}
+                    ''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.MIXIN_ON_SEALED_CLASS]);
+    verify([source]);
+  }
+
+  test_subtypeOfSealedClass_with() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+      [
+        'foo',
+        r'''
+import 'package:meta/meta.dart';
+@sealed class Foo {}
+'''
+      ]
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:foo/foo.dart';
+                    class Bar extends Object with Foo {}
+                    ''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    verify([source]);
+  }
+
+  test_subtypeOfSealedClass_withinLibrary_OK() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:meta/meta.dart';
+                    @sealed class Foo {}
+
+                    class Bar1 extends Foo {}
+                    class Bar2 implements Foo {}
+                    class Bar4 = Bar1 with Foo;
+                    mixin Bar5 on Foo {}
+                    mixin Bar6 implements Foo {}
+                    ''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_subtypeOfSealedClass_withinPackageLibDirectory_OK() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source1 = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                     import 'package:meta/meta.dart';
+                     @sealed class Foo {}
+                     ''');
+    Source source2 = addNamedSource('/pkg1/lib/src/lib2.dart', r'''
+                     import '../lib1.dart';
+                     class Bar1 extends Foo {}
+                     class Bar2 implements Foo {}
+                     class Bar4 = Bar1 with Foo;
+                     mixin Bar5 on Foo {}
+                     mixin Bar6 implements Foo {}
+                     ''');
+    await computeAnalysisResult(source1);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source1);
+    assertNoErrors(source2);
+    verify([source1, source2]);
+  }
+
+  test_subtypeOfSealedClass_withinPackageTestDirectory_OK() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+    ]);
+
+    newFolder('/pkg1');
+    _newPubPackageRoot('/pkg1');
+
+    Source source1 = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                     import 'package:meta/meta.dart';
+                     @sealed class Foo {}
+                     ''');
+    Source source2 = addNamedSource('/pkg1/test/test.dart', r'''
+                     import '../lib/lib1.dart';
+                     class Bar1 extends Foo {}
+                     class Bar2 implements Foo {}
+                     class Bar4 = Bar1 with Foo;
+                     mixin Bar5 on Foo {}
+                     mixin Bar6 implements Foo {}
+                     ''');
+    await computeAnalysisResult(source1);
+    await computeAnalysisResult(source2);
+    assertNoErrors(source1);
+    assertNoErrors(source2);
+    verify([source1, source2]);
+  }
+
+  test_subtypeOfSealedClass_withinPart_OK() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source1 = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                     import 'package:meta/meta.dart';
+                     part 'part1.dart';
+                     @sealed class Foo {}
+                     ''');
+    addNamedSource('/pkg1/lib/part1.dart', r'''
+                     part of 'lib1.dart';
+                     class Bar1 extends Foo {}
+                     class Bar2 implements Foo {}
+                     class Bar4 = Bar1 with Foo;
+                     mixin Bar5 on Foo {}
+                     mixin Bar6 implements Foo {}
+                     ''');
+    await computeAnalysisResult(source1);
+    assertNoErrors(source1);
+    verify([source1]);
+  }
+
+  test_subtypeOfSealedMixin_mixinApplication() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+      [
+        'foo',
+        r'''
+import 'package:meta/meta.dart';
+@sealed mixin Foo {}
+'''
+      ]
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:foo/foo.dart';
+                    class Bar1 {}
+                    class Bar2 = Bar1 with Foo;
+                    ''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    verify([source]);
+  }
+
+  test_subtypeOfSealedMixin_with() async {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
+      [
+        'foo',
+        r'''
+import 'package:meta/meta.dart';
+@sealed mixin Foo {}
+'''
+      ]
+    ]);
+
+    _newPubPackageRoot('/pkg1');
+    Source source = addNamedSource('/pkg1/lib/lib1.dart', r'''
+                    import 'package:foo/foo.dart';
+                    class Bar extends Object with Foo {}
+                    ''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.SUBTYPE_OF_SEALED_CLASS]);
+    verify([source]);
+  }
+
+  /// Write a pubspec file at [root], so that BestPracticesVerifier can see
+  /// that [root] is the root of a PubWorkspace, and a PubWorkspacePackage.
+  void _newPubPackageRoot(String root) {
+    newFile('$root/pubspec.yaml');
+  }
+}
+
+@reflectiveTest
+class HintCodeTest extends ResolverTestCase {
+  @override
+  void reset() {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub],
       [
         'js',
         r'''
@@ -96,164 +383,6 @@
     ]);
   }
 
-  test_argumentTypeNotAssignable_functionType() async {
-    Source source = addSource(r'''
-m() {
-  var a = new A();
-  a.n(() => 0);
-}
-class A {
-  n(void f(int i)) {}
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    } else {
-      assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    }
-    verify([source]);
-  }
-
-  test_argumentTypeNotAssignable_message() async {
-    // The implementation of HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE assumes that
-    // StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE has the same message.
-    expect(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message,
-        HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE.message);
-  }
-
-  test_argumentTypeNotAssignable_type() async {
-    Source source = addSource(r'''
-m() {
-  var i = '';
-  n(i);
-}
-n(int i) {}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    } else {
-      assertErrors(source, [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    }
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_after_cascade() async {
-    Source source = addSource(r'''
-m(x) {
-  x..a?.b.c;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_before_cascade() async {
-    Source source = addSource(r'''
-m(x) {
-  x?.a..m();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_cascade_parenthesis() async {
-    Source source = addSource(r'''
-m(x) {
-  (x?.a)..m();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_false_methodInvocation() async {
-    Source source = addSource(r'''
-m(x) {
-  x?.a()?.b();
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_false_null() async {
-    Source source = addSource(r'''
-m(x) {
-  x?.a.hashCode;
-  x?.a.runtimeType;
-  x?.a.toString();
-  x?.b().hashCode;
-  x?.b().runtimeType;
-  x?.b().toString();
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_false_propertyAccess() async {
-    Source source = addSource(r'''
-m(x) {
-  x?.a?.b;
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_methodInvocation() async {
-    Source source = addSource(r'''
-m(x) {
-  x?.a.b();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_parenthesized() async {
-    Source source = addSource(r'''
-m(x) {
-  (x?.a).b;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_propertyAccess() async {
-    Source source = addSource(r'''
-m(x) {
-  x?.a.b;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
-    verify([source]);
-  }
-
-  test_canBeNullAfterNullAware_several() async {
-    Source source = addSource(r'''
-m(x) {
-  x?.a
-    ..m()
-    ..m();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
-    verify([source]);
-  }
-
   test_deadCode_deadBlock_conditionalElse() async {
     Source source = addSource(r'''
 f() {
@@ -790,233 +919,6 @@
     verify([source]);
   }
 
-  test_deprecatedAnnotationUse_assignment() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  A operator+(A a) { return a; }
-}
-f(A a) {
-  A b;
-  a += b;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_call() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  call() {}
-  m() {
-    A a = new A();
-    a();
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_deprecated() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  m() {}
-  n() {m();}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_Deprecated() async {
-    Source source = addSource(r'''
-class A {
-  @Deprecated('0.9')
-  m() {}
-  n() {m();}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_export() async {
-    Source source = addSource("export 'deprecated_library.dart';");
-    addNamedSource("/deprecated_library.dart", r'''
-@deprecated
-library deprecated_library;
-class A {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_field() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  int x = 1;
-}
-f(A a) {
-  return a.x;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_getter() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  get m => 1;
-}
-f(A a) {
-  return a.m;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_import() async {
-    Source source = addSource(r'''
-import 'deprecated_library.dart';
-f(A a) {}''');
-    addNamedSource("/deprecated_library.dart", r'''
-@deprecated
-library deprecated_library;
-class A {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_indexExpression() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  operator[](int i) {}
-}
-f(A a) {
-  return a[1];
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_instanceCreation() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  A(int i) {}
-}
-f() {
-  A a = new A(1);
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_instanceCreation_namedConstructor() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  A.named(int i) {}
-}
-f() {
-  A a = new A.named(1);
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_named() async {
-    Source source = addSource(r'''
-class A {
-  m({@deprecated int x}) {}
-  n() {m(x: 1);}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_operator() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  operator+(A a) {}
-}
-f(A a) {
-  A b;
-  return a + b;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_positional() async {
-    Source source = addSource(r'''
-class A {
-  m([@deprecated int x]) {}
-  n() {m(1);}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_setter() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  set s(v) {}
-}
-f(A a) {
-  return a.s = 1;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_superConstructor() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  A() {}
-}
-class B extends A {
-  B() : super() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_superConstructor_namedConstructor() async {
-    Source source = addSource(r'''
-class A {
-  @deprecated
-  A.named() {}
-}
-class B extends A {
-  B() : super.named() {}
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MEMBER_USE]);
-    verify([source]);
-  }
-
   test_deprecatedFunction_class() async {
     Source source = addSource(r'''
 class Function {}
@@ -1070,53 +972,6 @@
     verify([source]);
   }
 
-  test_divisionOptimization_double() async {
-    Source source = addSource(r'''
-f(double x, double y) {
-  var v = (x / y).toInt();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
-    verify([source]);
-  }
-
-  test_divisionOptimization_int() async {
-    Source source = addSource(r'''
-f(int x, int y) {
-  var v = (x / y).toInt();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
-    verify([source]);
-  }
-
-  test_divisionOptimization_propagatedType() async {
-    // Tests the propagated type information of the '/' method
-    Source source = addSource(r'''
-f(x, y) {
-  x = 1;
-  y = 1;
-  var v = (x / y).toInt();
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
-    }
-    verify([source]);
-  }
-
-  test_divisionOptimization_wrappedBinaryExpression() async {
-    Source source = addSource(r'''
-f(int x, int y) {
-  var v = (((x / y))).toInt();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DIVISION_OPTIMIZATION]);
-    verify([source]);
-  }
-
   test_duplicateImport() async {
     Source source = addSource(r'''
 library L;
@@ -1383,92 +1238,6 @@
     ]);
   }
 
-  test_invalidAssignment_instanceVariable() async {
-    Source source = addSource(r'''
-class A {
-  int x;
-}
-f(var y) {
-  A a;
-  if(y is String) {
-    a.x = y;
-  }
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    } else {
-      assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
-    }
-    verify([source]);
-  }
-
-  test_invalidAssignment_localVariable() async {
-    Source source = addSource(r'''
-f(var y) {
-  if(y is String) {
-    int x = y;
-  }
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    } else {
-      assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
-    }
-    verify([source]);
-  }
-
-  test_invalidAssignment_message() async {
-    // The implementation of HintCode.INVALID_ASSIGNMENT assumes that
-    // StaticTypeWarningCode.INVALID_ASSIGNMENT has the same message.
-    expect(StaticTypeWarningCode.INVALID_ASSIGNMENT.message,
-        HintCode.INVALID_ASSIGNMENT.message);
-  }
-
-  test_invalidAssignment_staticVariable() async {
-    Source source = addSource(r'''
-class A {
-  static int x;
-}
-f(var y) {
-  if(y is String) {
-    A.x = y;
-  }
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    } else {
-      assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
-    }
-    verify([source]);
-  }
-
-  test_invalidAssignment_variableDeclaration() async {
-    // 17971
-    Source source = addSource(r'''
-class Point {
-  final num x, y;
-  Point(this.x, this.y);
-  Point operator +(Point other) {
-    return new Point(x+other.x, y+other.y);
-  }
-}
-main() {
-  var p1 = new Point(0, 0);
-  var p2 = new Point(10, 10);
-  int n = p1 + p2;
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    } else {
-      assertErrors(source, [HintCode.INVALID_ASSIGNMENT]);
-    }
-    verify([source]);
-  }
-
   test_invalidImmutableAnnotation_method() async {
     Source source = addSource(r'''
 import 'package:meta/meta.dart';
@@ -1482,63 +1251,78 @@
     verify([source]);
   }
 
-  test_invalidRequiredParam_on_named_parameter_with_default() async {
-    Source source = addNamedSource('/lib1.dart', r'''
+  test_invalidLiteralAnnotation_nonConstConstructor() async {
+    Source source = addSource(r'''
 import 'package:meta/meta.dart';
-
-m({@required a = 1}) => null;
+class A {
+  @literal
+  A() {}
+}
 ''');
     await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_REQUIRED_PARAM]);
+    assertErrors(source, [HintCode.INVALID_LITERAL_ANNOTATION]);
     verify([source]);
   }
 
-  test_invalidRequiredParam_on_positional_parameter() async {
-    Source source = addNamedSource('/lib1.dart', r'''
+  test_nonConstCallToLiteralConstructor_nonConstContext() async {
+    Source source = addSource(r'''
 import 'package:meta/meta.dart';
-
-m([@required a]) => null;
+class A {
+  @literal
+  const A();
+}
+void main() {
+  var a = A();
+}
 ''');
     await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_REQUIRED_PARAM]);
+    assertErrors(source, [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR]);
     verify([source]);
   }
 
-  test_invalidRequiredParam_on_positional_parameter_with_default() async {
-    Source source = addNamedSource('/lib1.dart', r'''
+  test_nonConstCallToLiteralConstructor_usingNew() async {
+    Source source = addSource(r'''
 import 'package:meta/meta.dart';
-
-m([@required a = 1]) => null;
+class A {
+  @literal
+  const A();
+}
+void main() {
+  var a = new A();
+}
 ''');
     await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_REQUIRED_PARAM]);
+    assertErrors(
+        source, [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW]);
     verify([source]);
   }
 
-  test_invalidRequiredParam_on_required_parameter() async {
-    Source source = addNamedSource('/lib1.dart', r'''
+  test_nonConstCallToLiteralConstructor_namedConstructor() async {
+    Source source = addSource(r'''
 import 'package:meta/meta.dart';
-
-m(@required a) => null;
+class A {
+  @literal
+  const A.named();
+}
+void main() {
+  var a = A.named();
+}
 ''');
     await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.INVALID_REQUIRED_PARAM]);
+    assertErrors(source, [HintCode.NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR]);
     verify([source]);
   }
 
-  test_invalidRequiredParam_valid() async {
-    Source source = addNamedSource('/lib1.dart', r'''
+  test_invalidLiteralAnnotation_nonConstructor() async {
+    Source source = addSource(r'''
 import 'package:meta/meta.dart';
-
-m1() => null;
-m2(a) => null;
-m3([a]) => null;
-m4({a}) => null;
-m5({@required a}) => null;
-m6({a, @required b}) => null;
+class A {
+  @literal
+  void m() {}
+}
 ''');
     await computeAnalysisResult(source);
-    assertNoErrors(source);
+    assertErrors(source, [HintCode.INVALID_LITERAL_ANNOTATION]);
     verify([source]);
   }
 
@@ -1560,7 +1344,7 @@
 @sealed mixin M {}
 ''');
     await computeAnalysisResult(source);
-    assertNoErrors(source);
+    assertErrors(source, [HintCode.INVALID_SEALED_ANNOTATION]);
     verify([source]);
   }
 
@@ -2594,6 +2378,19 @@
     verify([source]);
   }
 
+  test_mustBeImmutable_directMixin() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+@immutable
+mixin A {
+  int x;
+}
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
+    verify([source]);
+  }
+
   test_mustBeImmutable_extends() async {
     Source source = addSource(r'''
 import 'package:meta/meta.dart';
@@ -2636,6 +2433,36 @@
     verify([source]);
   }
 
+  test_mustBeImmutable_mixinApplication() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+@immutable
+class A {}
+class B {
+  int x;
+}
+class C = A with B;
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
+    verify([source]);
+  }
+
+  test_mustBeImmutable_mixinApplicationBase() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  int x;
+}
+class B {}
+@immutable
+class C = A with B;
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [HintCode.MUST_BE_IMMUTABLE]);
+    verify([source]);
+  }
+
   test_mustCallSuper() async {
     Source source = addSource(r'''
 import 'package:meta/meta.dart';
@@ -3931,11 +3758,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_GETTER]);
-    }
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   test_undefinedIdentifier_exportHide() async {
@@ -3980,38 +3803,6 @@
     verify([source]);
   }
 
-  test_undefinedMethod() async {
-    Source source = addSource(r'''
-f() {
-  var a = 'str';
-  a.notAMethodOnString();
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_METHOD]);
-    }
-  }
-
-  test_undefinedMethod_assignmentExpression() async {
-    Source source = addSource(r'''
-class A {}
-class B {
-  f(var a, var a2) {
-    a = new A();
-    a2 = new A();
-    a += a2;
-  }
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_METHOD]);
-    }
-  }
-
   test_undefinedOperator_binaryExpression() async {
     Source source = addSource(r'''
 class A {}
@@ -4021,11 +3812,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-    }
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   test_undefinedOperator_indexBoth() async {
@@ -4037,11 +3824,10 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-    }
+    assertErrors(source, [
+      StaticTypeWarningCode.UNDEFINED_OPERATOR,
+      StaticTypeWarningCode.UNDEFINED_OPERATOR,
+    ]);
   }
 
   test_undefinedOperator_indexGetter() async {
@@ -4053,11 +3839,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-    }
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   test_undefinedOperator_indexSetter() async {
@@ -4069,11 +3851,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-    }
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   test_undefinedOperator_postfixExpression() async {
@@ -4085,11 +3863,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-    }
+    assertNoErrors(source);
   }
 
   test_undefinedOperator_prefixExpression() async {
@@ -4101,11 +3875,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_OPERATOR]);
-    }
+    assertNoErrors(source);
   }
 
   test_undefinedSetter() async {
@@ -4117,31 +3887,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
-    } else {
-      assertErrors(source, [HintCode.UNDEFINED_SETTER]);
-    }
-  }
-
-  test_unnecessaryCast_type_supertype() async {
-    Source source = addSource(r'''
-m(int i) {
-  var b = i as Object;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
-    verify([source]);
-  }
-
-  test_unnecessaryCast_type_type() async {
-    Source source = addSource(r'''
-m(num i) {
-  var b = i as num;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNNECESSARY_CAST]);
-    verify([source]);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   test_unnecessaryNoSuchMethod_blockBody() async {
@@ -4970,346 +4716,6 @@
     verify([source]);
   }
 
-  test_unusedField_isUsed_argument() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f = 0;
-  main() {
-    print(++_f);
-  }
-}
-print(x) {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source);
-    verify([source]);
-  }
-
-  test_unusedField_isUsed_reference_implicitThis() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-  main() {
-    print(_f);
-  }
-}
-print(x) {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source);
-    verify([source]);
-  }
-
-  test_unusedField_isUsed_reference_implicitThis_expressionFunctionBody() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-  m() => _f;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source);
-    verify([source]);
-  }
-
-  test_unusedField_isUsed_reference_implicitThis_subclass() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-  main() {
-    print(_f);
-  }
-}
-class B extends A {
-  int _f;
-}
-print(x) {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source);
-    verify([source]);
-  }
-
-  test_unusedField_isUsed_reference_qualified_propagatedElement() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-}
-main() {
-  var a = new A();
-  print(a._f);
-}
-print(x) {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source);
-    verify([source]);
-  }
-
-  test_unusedField_isUsed_reference_qualified_staticElement() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-}
-main() {
-  A a = new A();
-  print(a._f);
-}
-print(x) {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source);
-    verify([source]);
-  }
-
-  test_unusedField_isUsed_reference_qualified_unresolved() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-}
-main(a) {
-  print(a._f);
-}
-print(x) {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source);
-    verify([source]);
-  }
-
-  test_unusedField_notUsed_compoundAssign() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-  main() {
-    _f += 2;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_FIELD]);
-    verify([source]);
-  }
-
-  test_unusedField_notUsed_constructorFieldInitializers() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-  A() : _f = 0;
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_FIELD]);
-    verify([source]);
-  }
-
-  test_unusedField_notUsed_fieldFormalParameter() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-  A(this._f);
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_FIELD]);
-    verify([source]);
-  }
-
-  test_unusedField_notUsed_noReference() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_FIELD]);
-    verify([source]);
-  }
-
-  test_unusedField_notUsed_nullAssign() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  var _f;
-  m() {
-    _f ??= doSomething();
-  }
-}
-doSomething() => 0;
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedField_notUsed_postfixExpr() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f = 0;
-  main() {
-    _f++;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_FIELD]);
-    verify([source]);
-  }
-
-  test_unusedField_notUsed_prefixExpr() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f = 0;
-  main() {
-    ++_f;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_FIELD]);
-    verify([source]);
-  }
-
-  test_unusedField_notUsed_simpleAssignment() async {
-    enableUnusedElement = true;
-    Source source = addSource(r'''
-class A {
-  int _f;
-  m() {
-    _f = 1;
-  }
-}
-main(A a) {
-  a._f = 2;
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_FIELD]);
-    verify([source]);
-  }
-
-  test_unusedImport() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart';''');
-    Source source2 = addNamedSource("/lib1.dart", "library lib1;");
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  test_unusedImport_as() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart';
-import 'lib1.dart' as one;
-one.A a;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  @failingTest
-  test_unusedImport_as_equalPrefixes() async {
-    // See todo at ImportsVerifier.prefixElementMap.
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' as one;
-import 'lib2.dart' as one;
-one.A a;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}''');
-    Source source3 = addNamedSource("/lib2.dart", r'''
-library lib2;
-class B {}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    await computeAnalysisResult(source3);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    assertNoErrors(source3);
-    verify([source, source2, source3]);
-  }
-
-  test_unusedImport_hide() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart';
-import 'lib1.dart' hide A;
-A a;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  test_unusedImport_inComment_libraryDirective() async {
-    Source source = addSource(r'''
-/// Use [Future] class.
-library L;
-import 'dart:async';
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-  }
-
-  test_unusedImport_show() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show A;
-import 'lib1.dart' show B;
-A a;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-class B {}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_IMPORT]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  test_unusedLabel_inSwitch() async {
-    Source source = addSource(r'''
-f(x) {
-  switch (x) {
-    label: case 0:
-      break;
-    default:
-      break;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_LABEL]);
-    verify([source]);
-  }
-
-  test_unusedLabel_onWhile() async {
-    Source source = addSource(r'''
-f(condition()) {
-  label: while (condition()) {
-    break;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.UNUSED_LABEL]);
-    verify([source]);
-  }
-
   test_unusedLocalVariable_inCatch_exception() async {
     enableUnusedLocalVariable = true;
     Source source = addSource(r'''
@@ -5511,78 +4917,4 @@
     assertErrors(source);
     verify([source]);
   }
-
-  test_unusedShownName() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show A, B;
-A a;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-class B {}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  test_unusedShownName_as() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' as p show A, B;
-p.A a;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-class B {}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  test_unusedShownName_duplicates() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show A, B;
-import 'lib1.dart' show C, D;
-A a;
-C c;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-class B {}
-class C {}
-class D {}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(
-        source, [HintCode.UNUSED_SHOWN_NAME, HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
-
-  test_unusedShownName_topLevelVariable() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' show var1, var2;
-import 'lib1.dart' show var3, var4;
-int a = var1;
-int b = var2;
-int c = var3;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-const int var1 = 1;
-const int var2 = 2;
-const int var3 = 3;
-const int var4 = 4;''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
-    assertNoErrors(source2);
-    verify([source, source2]);
-  }
 }
diff --git a/pkg/analyzer/test/generated/inheritance_manager_test.dart b/pkg/analyzer/test/generated/inheritance_manager_test.dart
index fa5b0d4..d6def33 100644
--- a/pkg/analyzer/test/generated/inheritance_manager_test.dart
+++ b/pkg/analyzer/test/generated/inheritance_manager_test.dart
@@ -28,7 +28,7 @@
 }
 
 @reflectiveTest
-class InheritanceManagerTest extends Object with ResourceProviderMixin {
+class InheritanceManagerTest with ResourceProviderMixin {
   /**
    * The type provider used to access the types.
    */
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 253b063..3d24f99 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -48,7 +48,7 @@
 ''');
   }
 
-  Future<Null> _assertCanBeAnalyzed(String text) async {
+  Future<void> _assertCanBeAnalyzed(String text) async {
     Source source = addSource(text);
     var analysisResult = await computeAnalysisResult(source);
     expect(analysisResult.errors, isNotEmpty);
diff --git a/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
index c524c9c..300cae8 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_driver_test.dart
@@ -1,42 +1,73 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'non_error_resolver_test.dart';
+import 'resolver_test_case.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(NonErrorResolverTest_Driver);
+    defineReflectiveTests(NonConstantValueInInitializer);
   });
 }
 
 @reflectiveTest
+class NonConstantValueInInitializer extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.constant_update_2018];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_intLiteralInDoubleContext_const_exact() async {
+    Source source = addSource(r'''
+const double x = 0;
+class C {
+  const C(double y) : assert(y is double), assert(x is double);
+}
+@C(0)
+@C(-0)
+@C(0x0)
+@C(-0x0)
+void main() {
+  const C(0);
+  const C(-0);
+  const C(0x0);
+  const C(-0x0);
+}''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_isCheckInConstAssert() async {
+    Source source = addSource(r'''
+class C {
+  const C() : assert(1 is int);
+}
+
+void main() {
+  const C();
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+}
+
+@reflectiveTest
 class NonErrorResolverTest_Driver extends NonErrorResolverTestBase {
   @override
   bool get enableNewAnalysisDriver => true;
 
   @override
   @failingTest
-  test_constConstructorWithMixinWithField_withoutSuperMixins() {
-    return super.test_constConstructorWithMixinWithField_withoutSuperMixins();
-  }
-
-  @override
-  @failingTest
-  test_intLiteralInDoubleContext_const_exact() {
-    return super.test_intLiteralInDoubleContext_const_exact();
-  }
-
-  @override
-  @failingTest
-  test_null_callMethod() {
-    return super.test_null_callMethod();
-  }
-
-  @override
-  @failingTest
   test_null_callOperator() {
     return super.test_null_callOperator();
   }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index a40a5eb..12a26e8 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -16,7 +16,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'resolver_test_case.dart';
-import 'test_support.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -27,12 +26,6 @@
 @reflectiveTest
 class NonErrorResolverTest extends NonErrorResolverTestBase {
   @override
-  @failingTest
-  test_constConstructorWithMixinWithField_withoutSuperMixins() {
-    return super.test_constConstructorWithMixinWithField_withoutSuperMixins();
-  }
-
-  @override
   @failingTest // Does not work with old task model
   test_infer_mixin_new_syntax() {
     return super.test_infer_mixin_new_syntax();
@@ -51,12 +44,6 @@
   }
 
   @override
-  @failingTest
-  test_intLiteralInDoubleContext_const_exact() {
-    return super.test_intLiteralInDoubleContext_const_exact();
-  }
-
-  @override
   @failingTest // Fails with the old task model
   test_issue_32394() {
     return super.test_issue_32394();
@@ -76,12 +63,6 @@
 
   @override
   @failingTest
-  test_null_callMethod() {
-    return super.test_null_callMethod();
-  }
-
-  @override
-  @failingTest
   test_null_callOperator() {
     return super.test_null_callOperator();
   }
@@ -307,7 +288,7 @@
   }
 
   test_argumentTypeNotAssignable_optionalNew() async {
-    resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
+    resetWith(options: new AnalysisOptionsImpl());
     Source source = addSource(r'''
 class Widget { }
 
@@ -978,220 +959,6 @@
     expect(classC.documentationComment, isNotNull);
   }
 
-  test_commentReference_beforeConstructor() async {
-    String code = r'''
-abstract class A {
-  /// [p]
-  A(int p) {}
-}''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    {
-      SimpleIdentifier ref =
-          EngineTestCase.findSimpleIdentifier(unit, code, "p]");
-      expect(ref.staticElement, new TypeMatcher<ParameterElement>());
-    }
-  }
-
-  test_commentReference_beforeEnum() async {
-    String code = r'''
-/// This is the [Samurai] kind.
-enum Samurai {
-  /// Use [int].
-  WITH_SWORD,
-  /// Like [WITH_SWORD], but only without one.
-  WITHOUT_SWORD
-}''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    {
-      SimpleIdentifier ref =
-          EngineTestCase.findSimpleIdentifier(unit, code, 'Samurai]');
-      ClassElement refElement = ref.staticElement;
-      expect(refElement, isNotNull);
-      expect(refElement.name, 'Samurai');
-    }
-    {
-      SimpleIdentifier ref =
-          EngineTestCase.findSimpleIdentifier(unit, code, 'int]');
-      ClassElement refElement = ref.staticElement;
-      expect(refElement, isNotNull);
-      expect(refElement.name, 'int');
-    }
-    {
-      SimpleIdentifier ref =
-          EngineTestCase.findSimpleIdentifier(unit, code, 'WITH_SWORD]');
-      PropertyAccessorElement refElement = ref.staticElement;
-      expect(refElement, isNotNull);
-      expect(refElement.name, 'WITH_SWORD');
-    }
-  }
-
-  test_commentReference_beforeFunction_blockBody() async {
-    String code = r'''
-/// [p]
-foo(int p) {
-}''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    SimpleIdentifier ref =
-        EngineTestCase.findSimpleIdentifier(unit, code, 'p]');
-    expect(ref.staticElement, new TypeMatcher<ParameterElement>());
-  }
-
-  test_commentReference_beforeFunction_expressionBody() async {
-    String code = r'''
-/// [p]
-foo(int p) => null;''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    SimpleIdentifier ref =
-        EngineTestCase.findSimpleIdentifier(unit, code, 'p]');
-    expect(ref.staticElement, new TypeMatcher<ParameterElement>());
-  }
-
-  test_commentReference_beforeFunctionTypeAlias() async {
-    String code = r'''
-/// [p]
-typedef Foo(int p);
-''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    SimpleIdentifier ref =
-        EngineTestCase.findSimpleIdentifier(unit, code, 'p]');
-    expect(ref.staticElement, new TypeMatcher<ParameterElement>());
-  }
-
-  test_commentReference_beforeGenericTypeAlias() async {
-    String code = r'''
-/// Can resolve [T], [S], and [p].
-typedef Foo<T> = Function<S>(int p);
-''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-
-    Element getElement(String search) {
-      return EngineTestCase.findSimpleIdentifier(unit, code, search)
-          .staticElement;
-    }
-
-    expect(getElement('T]'), new TypeMatcher<TypeParameterElement>());
-    expect(getElement('S]'), new TypeMatcher<TypeParameterElement>());
-    expect(getElement('p]'), new TypeMatcher<ParameterElement>());
-  }
-
-  test_commentReference_beforeGetter() async {
-    String code = r'''
-abstract class A {
-  /// [int]
-  get g => null;
-}''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    {
-      SimpleIdentifier ref =
-          EngineTestCase.findSimpleIdentifier(unit, code, 'int]');
-      expect(ref.staticElement, isNotNull);
-    }
-  }
-
-  test_commentReference_beforeMethod() async {
-    String code = r'''
-abstract class A {
-  /// [p1]
-  ma(int p1) {}
-  /// [p2]
-  mb(int p2);
-  /// [p3] and [p4]
-  mc(int p3, p4());
-  /// [p5]
-  md(int p5, {int p6});
-}''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    assertIsParameter(String search) {
-      SimpleIdentifier ref =
-          EngineTestCase.findSimpleIdentifier(unit, code, search);
-      expect(ref.staticElement, new TypeMatcher<ParameterElement>());
-    }
-
-    assertIsParameter('p1');
-    assertIsParameter('p2');
-    assertIsParameter('p3');
-    assertIsParameter('p4');
-    assertIsParameter('p5');
-    assertIsParameter('p6');
-  }
-
-  test_commentReference_class() async {
-    String code = r'''
-/// [foo]
-class A {
-  foo() {}
-}''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    SimpleIdentifier ref =
-        EngineTestCase.findSimpleIdentifier(unit, code, 'foo]');
-    expect(ref.staticElement, new TypeMatcher<MethodElement>());
-  }
-
-  test_commentReference_setter() async {
-    String code = r'''
-class A {
-  /// [x] in A
-  mA() {}
-  set x(value) {}
-}
-class B extends A {
-  /// [x] in B
-  mB() {}
-}
-''';
-    Source source = addSource(code);
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-    CompilationUnit unit = analysisResult.unit;
-    {
-      SimpleIdentifier ref =
-          EngineTestCase.findSimpleIdentifier(unit, code, "x] in A");
-      expect(ref.staticElement, new TypeMatcher<PropertyAccessorElement>());
-    }
-    {
-      SimpleIdentifier ref =
-          EngineTestCase.findSimpleIdentifier(unit, code, 'x] in B');
-      expect(ref.staticElement, new TypeMatcher<PropertyAccessorElement>());
-    }
-  }
-
   test_concreteClassWithAbstractMember() async {
     Source source = addSource(r'''
 abstract class A {
@@ -1277,32 +1044,6 @@
     verify([source]);
   }
 
-  test_constConstructorWithMixinWithField_withoutSuperMixins() async {
-    Source source = addSource(r'''
-class M {
-}
-class A extends Object with M {
-  const A();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      CompileTimeErrorCode.CONST_CONSTRUCTOR_IN_SUBCLASS_OF_MIXIN_APPLICATION
-    ]);
-    verify([source]);
-  }
-
-  test_constConstructorWithMixinWithField_withSuperMixins_new_syntax() async {
-    Source source = addSource(r'''
-mixin M {
-}
-class A extends Object with M {
-  const A();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_constConstructorWithNonConstSuper_explicit() async {
     Source source = addSource(r'''
 class A {
@@ -2863,29 +2604,6 @@
     verify([source]);
   }
 
-  test_intLiteralInDoubleContext_const_exact() async {
-    // TODO(mfairhurst): get the commented out assertions to pass.
-    Source source = addSource(r'''
-class C {
-  const C(double x)
-    : assert("$x" == "0.0")
-    , assert(identical(x, 0.0));
-}
-@C(0)
-@C(-0)
-@C(0x0)
-@C(-0x0)
-void main() {
-  const C(0);
-  const C(-0);
-  const C(0x0);
-  const C(-0x0);
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_invalidAnnotation_constantVariable_field() async {
     Source source = addSource(r'''
 @A.C
@@ -3128,6 +2846,74 @@
     verify([source]);
   }
 
+  test_invalidAssignment_postfixExpression_localVariable() async {
+    Source source = addSource(r'''
+class A {
+  A operator+(_) => this;
+}
+
+f(A a) {
+  a++;
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_invalidAssignment_postfixExpression_property() async {
+    Source source = addSource(r'''
+class A {
+  A operator+(_) => this;
+}
+
+class C {
+  A a;
+}
+
+f(C c) {
+  c.a++;
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_invalidAssignment_prefixExpression_localVariable() async {
+    Source source = addSource(r'''
+class A {
+  A operator+(_) => this;
+}
+
+f(A a) {
+  ++a;
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_invalidAssignment_prefixExpression_property() async {
+    Source source = addSource(r'''
+class A {
+  A operator+(_) => this;
+}
+
+class C {
+  A a;
+}
+
+f(C c) {
+  ++c.a;
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_invalidAssignment_toDynamic() async {
     Source source = addSource(r'''
 f() {
@@ -3450,86 +3236,6 @@
     verify([source]);
   }
 
-  test_invocationOfNonFunction_dynamic() async {
-    Source source = addSource(r'''
-class A {
-  var f;
-}
-class B extends A {
-  g() {
-    f();
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_invocationOfNonFunction_functionTypeTypeParameter() async {
-    Source source = addSource(r'''
-typedef void Action<T>(T x);
-class C<T, U extends Action<T>> {
-  T value;
-  U action;
-  C(this.value, [this.action]);
-  void act() {
-    action(value);
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_invocationOfNonFunction_getter() async {
-    Source source = addSource(r'''
-class A {
-  var g;
-}
-f() {
-  A a;
-  a.g();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_invocationOfNonFunction_localVariable() async {
-    Source source = addSource(r'''
-f() {
-  var g;
-  g();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_invocationOfNonFunction_localVariable_dynamic() async {
-    Source source = addSource(r'''
-f() {}
-main() {
-  var v = f;
-  v();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_invocationOfNonFunction_Object() async {
-    Source source = addSource(r'''
-main() {
-  Object v = null;
-  v();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-    verify([source]);
-  }
-
   Future test_issue32114() async {
     addNamedSource('/a.dart', '''
 class O {}
@@ -3591,6 +3297,52 @@
     verify([source]);
   }
 
+  test_issue_35320_lists() async {
+    addNamedSource('/lib.dart', '''
+const x = const <String>['a'];
+''');
+    Source source = addSource('''
+import 'lib.dart';
+const y = const <String>['b'];
+int f(v) {
+  switch(v) {
+    case x:
+      return 0;
+    case y:
+      return 1;
+    default:
+      return 2;
+  }
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_issue_35320_maps() async {
+    addNamedSource('/lib.dart', '''
+const x = const <String, String>{'a': 'b'};
+''');
+    Source source = addSource('''
+import 'lib.dart';
+const y = const <String, String>{'c': 'd'};
+int f(v) {
+  switch(v) {
+    case x:
+      return 0;
+    case y:
+      return 1;
+    default:
+      return 2;
+  }
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_listElementTypeNotAssignable() async {
     Source source = addSource(r'''
 var v1 = <int> [42];
@@ -4749,15 +4501,6 @@
     verify([source]);
   }
 
-  test_null_callMethod() async {
-    Source source = addSource(r'''
-main() {
-  null.m();
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
   test_null_callOperator() async {
     Source source = addSource(r'''
 main() {
@@ -4773,7 +4516,7 @@
   }
 
   test_optionalNew_rewrite() async {
-    resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
+    resetWith(options: new AnalysisOptionsImpl());
     Source source = addSource(r'''
 import 'b.dart';
 main() {
@@ -4813,7 +4556,7 @@
   }
 
   test_optionalNew_rewrite_instantiatesToBounds() async {
-    resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
+    resetWith(options: new AnalysisOptionsImpl());
     Source source = addSource(r'''
 import 'b.dart';
 
@@ -5110,6 +4853,16 @@
     verify([source]);
   }
 
+  test_regress34906() async {
+    Source source = addSource(r'''
+typedef G<X, Y extends Function(X)> = X Function(Function(Y));
+G<dynamic, Function(Null)> superBoundedG;
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_rethrowOutsideCatch() async {
     Source source = addSource(r'''
 class A {
@@ -6032,20 +5785,6 @@
     verify([source]);
   }
 
-  test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new() async {
-    Source source = addSource(r'''
-class A {
-  A() {}
-  A.named() {}
-}
-/// [new A] or [new A.named]
-main() {
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_unusedShownName_unresolved() async {
     Source source = addSource(r'''
 import 'dart:math' show max, FooBar;
@@ -6391,7 +6130,7 @@
     verify([source]);
   }
 
-  Future<Null> _check_wrongNumberOfParametersForOperator(
+  Future<void> _check_wrongNumberOfParametersForOperator(
       String name, String parameters) async {
     Source source = addSource("""
 class A {
@@ -6402,7 +6141,7 @@
     verify([source]);
   }
 
-  Future<Null> _check_wrongNumberOfParametersForOperator1(String name) async {
+  Future<void> _check_wrongNumberOfParametersForOperator1(String name) async {
     await _check_wrongNumberOfParametersForOperator(name, "a");
   }
 }
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index 2900675e..bf270f1 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -26,10 +26,14 @@
 library meta;
 
 const _AlwaysThrows alwaysThrows = const _AlwaysThrows();
+const _Literal literal = const _Literal();
 
 class _AlwaysThrows {
   const _AlwaysThrows();
 }
+class _Literal {
+  const _Literal();
+}
 '''
       ]
     ]);
@@ -269,179 +273,6 @@
     verify([source]);
   }
 
-  test_deprecatedAnnotationUse_namedParameter_inDefiningFunction() async {
-    Source source = addSource(r'''
-f({@deprecated int x}) => x;
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction() async {
-    Source source = addSource(r'''
-class C {
-  m() {
-    f({@deprecated int x}) {
-      return x;
-    }
-    return f();
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_namedParameter_inDefiningMethod() async {
-    Source source = addSource(r'''
-class C {
-  m({@deprecated int x}) {
-    return x;
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction() async {
-    Source source = addSource(r'''
-class C {
-  m({@deprecated int x}) {
-    f() {
-      return x;
-    }
-    return f();
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deprecatedMemberUse_inDeprecatedClass() async {
-    Source source = addSource(r'''
-@deprecated
-f() {}
-
-@deprecated
-class C {
-  m() {
-    f();
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deprecatedMemberUse_inDeprecatedFunction() async {
-    Source source = addSource(r'''
-@deprecated
-f() {}
-
-@deprecated
-g() {
-  f();
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deprecatedMemberUse_inDeprecatedLibrary() async {
-    Source source = addSource(r'''
-@deprecated
-library lib;
-
-@deprecated
-f() {}
-
-class C {
-  m() {
-    f();
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deprecatedMemberUse_inDeprecatedMethod() async {
-    Source source = addSource(r'''
-@deprecated
-f() {}
-
-class C {
-  @deprecated
-  m() {
-    f();
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass() async {
-    Source source = addSource(r'''
-@deprecated
-f() {}
-
-@deprecated
-class C {
-  @deprecated
-  m() {
-    f();
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_divisionOptimization() async {
-    Source source = addSource(r'''
-f(int x, int y) {
-  var v = x / y.toInt();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_divisionOptimization_supressIfDivisionNotDefinedInCore() async {
-    Source source = addSource(r'''
-f(x, y) {
-  var v = (x / y).toInt();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_divisionOptimization_supressIfDivisionOverridden() async {
-    Source source = addSource(r'''
-class A {
-  num operator /(x) { return x; }
-}
-f(A x, A y) {
-  var v = (x / y).toInt();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_duplicateImport_as() async {
     Source source = addSource(r'''
 library L;
@@ -639,6 +470,70 @@
     verify([source]);
   }
 
+  test_invalidLiteralAnnotation_constConstructor() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_nonConstCallToLiteralConstructor_constCreation() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+
+void main() {
+  const a = const A();
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_nonConstCallToLiteralConstructor_constContextCreation() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A();
+}
+
+void main() {
+  const a = A();
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_nonConstCallToLiteralConstructor_unconstableCreation() async {
+    Source source = addSource(r'''
+import 'package:meta/meta.dart';
+class A {
+  @literal
+  const A(List list);
+}
+
+void main() {
+  var a = A(new List());
+}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   test_overrideOnNonOverridingField_inInterface() async {
     Source source = addSource(r'''
 class A {
@@ -655,14 +550,10 @@
   int c;
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(
-        source,
-        [CompileTimeErrorCode.INVALID_OVERRIDE],
-      );
-    } else {
-      assertNoErrors(source);
-    }
+    assertErrors(
+      source,
+      [CompileTimeErrorCode.INVALID_OVERRIDE],
+    );
     verify([source]);
   }
 
@@ -682,14 +573,10 @@
   int c;
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(
-        source,
-        [CompileTimeErrorCode.INVALID_OVERRIDE],
-      );
-    } else {
-      assertNoErrors(source);
-    }
+    assertErrors(
+      source,
+      [CompileTimeErrorCode.INVALID_OVERRIDE],
+    );
     verify([source]);
   }
 
@@ -898,11 +785,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
   test_undefinedMethod_assignmentExpression_inSubtype() async {
@@ -930,24 +813,6 @@
     assertNoErrors(source);
   }
 
-  test_undefinedMethod_inSubtype() async {
-    Source source = addSource(r'''
-class A {}
-class B extends A {
-  b() {}
-}
-f() {
-  var a = new A();
-  a.b();
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
-    } else {
-      assertNoErrors(source);
-    }
-  }
-
   test_undefinedMethod_unionType_all() async {
     Source source = addSource(r'''
 class A {
@@ -1000,11 +865,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   test_undefinedOperator_indexBoth_inSubtype() async {
@@ -1019,11 +880,10 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertErrors(source, [
+      StaticTypeWarningCode.UNDEFINED_OPERATOR,
+      StaticTypeWarningCode.UNDEFINED_OPERATOR,
+    ]);
   }
 
   test_undefinedOperator_indexGetter_inSubtype() async {
@@ -1038,11 +898,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   test_undefinedOperator_indexSetter_inSubtype() async {
@@ -1057,11 +913,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
-    } else {
-      assertNoErrors(source);
-    }
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
   }
 
   test_undefinedOperator_postfixExpression() async {
@@ -1106,107 +958,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
-    } else {
-      assertNoErrors(source);
-    }
-  }
-
-  test_unnecessaryCast_13855_parameter_A() async {
-    // dartbug.com/13855, dartbug.com/13732
-    Source source = addSource(r'''
-class A{
-  a() {}
-}
-class B<E> {
-  E e;
-  m() {
-    (e as A).a();
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unnecessaryCast_conditionalExpression() async {
-    Source source = addSource(r'''
-abstract class I {}
-class A implements I {}
-class B implements I {}
-I m(A a, B b) {
-  return a == null ? b as I : a as I;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unnecessaryCast_dynamic_type() async {
-    Source source = addSource(r'''
-m(v) {
-  var b = v as Object;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unnecessaryCast_function() async {
-    Source source = addSource(r'''
-void main() {
-  Function(Null) f = (String x) => x;
-  (f as Function(int))(3); 
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unnecessaryCast_function2() async {
-    Source source = addSource(r'''
-class A {}
-
-class B<T extends A> {
-  void foo() {
-    T Function(T) f;
-    A Function(A) g;
-    g = f as A Function(A);
-  }
-}
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unnecessaryCast_generics() async {
-    // dartbug.com/18953
-    Source source = addSource(r'''
-import 'dart:async';
-Future<int> f() => new Future.value(0);
-void g(bool c) {
-  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
-}''');
-    await computeAnalysisResult(source);
-    if (previewDart2 && enableNewAnalysisDriver) {
-      assertErrors(source, [HintCode.UNNECESSARY_CAST]);
-    } else {
-      assertNoErrors(source);
-    }
-    verify([source]);
-  }
-
-  test_unnecessaryCast_type_dynamic() async {
-    Source source = addSource(r'''
-m(v) {
-  var b = Object as dynamic;
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
+    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_SETTER]);
   }
 
   test_unnecessaryNoSuchMethod_blockBody_notReturnStatement() async {
@@ -1269,227 +1021,12 @@
     assertNoErrors(source);
     verify([source]);
   }
-
-  test_unusedImport_annotationOnDirective() async {
-    Source source = addSource(r'''
-library L;
-@A()
-import 'lib1.dart';''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {
-  const A() {}
-}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    assertErrors(source);
-    verify([source, source2]);
-  }
-
-  test_unusedImport_as_equalPrefixes() async {
-    // 18818
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' as one;
-import 'lib2.dart' as one;
-one.A a;
-one.B b;''');
-    Source source2 = addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}''');
-    Source source3 = addNamedSource("/lib2.dart", r'''
-library lib2;
-class B {}''');
-    await computeAnalysisResult(source);
-    await computeAnalysisResult(source2);
-    await computeAnalysisResult(source3);
-    assertErrors(source);
-    assertNoErrors(source2);
-    assertNoErrors(source3);
-    verify([source, source2, source3]);
-  }
-
-  test_unusedImport_core_library() async {
-    Source source = addSource(r'''
-library L;
-import 'dart:core';''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedImport_export() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart';
-Two two;''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-export 'lib2.dart';
-class One {}''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
-class Two {}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedImport_export2() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart';
-Three three;''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-export 'lib2.dart';
-class One {}''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
-export 'lib3.dart';
-class Two {}''');
-    addNamedSource("/lib3.dart", r'''
-library lib3;
-class Three {}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedImport_export_infiniteLoop() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart';
-Two two;''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-export 'lib2.dart';
-class One {}''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
-export 'lib3.dart';
-class Two {}''');
-    addNamedSource("/lib3.dart", r'''
-library lib3;
-export 'lib2.dart';
-class Three {}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedImport_metadata() async {
-    Source source = addSource(r'''
-library L;
-@A(x)
-import 'lib1.dart';
-class A {
-  final int value;
-  const A(this.value);
-}''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-const x = 0;''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedImport_prefix_topLevelFunction() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' hide topLevelFunction;
-import 'lib1.dart' as one show topLevelFunction;
-class A {
-  static void x() {
-    One o;
-    one.topLevelFunction();
-  }
-}''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-class One {}
-topLevelFunction() {}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedImport_prefix_topLevelFunction2() async {
-    Source source = addSource(r'''
-library L;
-import 'lib1.dart' hide topLevelFunction;
-import 'lib1.dart' as one show topLevelFunction;
-import 'lib1.dart' as two show topLevelFunction;
-class A {
-  static void x() {
-    One o;
-    one.topLevelFunction();
-    two.topLevelFunction();
-  }
-}''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-class One {}
-topLevelFunction() {}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedLabel_inSwitch() async {
-    Source source = addSource(r'''
-f(x) {
-  switch (x) {
-    label: case 0:
-      break;
-    default:
-      continue label;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_unusedLabel_onWhile() async {
-    Source source = addSource(r'''
-f(condition()) {
-  label: while (condition()) {
-    break label;
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_useOfVoidResult_implicitReturnValue() async {
-    Source source = addSource(r'''
-f() {}
-class A {
-  n() {
-    var a = f();
-  }
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_useOfVoidResult_nonVoidReturnValue() async {
-    Source source = addSource(r'''
-int f() => 1;
-g() {
-  var a = f();
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
 }
 
 class PubSuggestionCodeTest extends ResolverTestCase {
+  // TODO(brianwilkerson) The tests in this class are not being run, and all but
+  //  the first would fail. We should implement these checks and enable the
+  //  tests.
   test_import_package() async {
     Source source = addSource("import 'package:somepackage/other.dart';");
     await computeAnalysisResult(source);
diff --git a/pkg/analyzer/test/generated/package_build_test.dart b/pkg/analyzer/test/generated/package_build_test.dart
deleted file mode 100644
index 81b7d35..0000000
--- a/pkg/analyzer/test/generated/package_build_test.dart
+++ /dev/null
@@ -1,486 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/context/builder.dart';
-import 'package:analyzer/src/generated/package_build.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
-import 'package:package_config/packages.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(PackageBuildFileUriResolverTest);
-    defineReflectiveTests(PackageBuildPackageUriResolverTest);
-    defineReflectiveTests(PackageBuildWorkspaceTest);
-  });
-}
-
-class MockContextBuilder implements ContextBuilder {
-  Map<String, Packages> packagesMapMap = <String, Packages>{};
-  Map<Packages, Map<String, List<Folder>>> packagesToMapMap =
-      <Packages, Map<String, List<Folder>>>{};
-
-  Map<String, List<Folder>> convertPackagesToMap(Packages packages) =>
-      packagesToMapMap[packages];
-
-  Packages createPackageMap(String rootDirectoryPath) =>
-      packagesMapMap[rootDirectoryPath];
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-class MockPackages implements Packages {
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
-class MockUriResolver implements UriResolver {
-  Map<Uri, Source> resolveAbsoluteMap = {};
-
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
-  Source resolveAbsolute(Uri uri, [Uri actualUri]) => resolveAbsoluteMap[uri];
-}
-
-@reflectiveTest
-class PackageBuildFileUriResolverTest extends Object
-    with ResourceProviderMixin {
-  PackageBuildWorkspace workspace;
-  PackageBuildFileUriResolver resolver;
-
-  void setUp() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    final MockContextBuilder contextBuilder = new MockContextBuilder();
-    final Packages packages = new MockPackages();
-    contextBuilder.packagesMapMap[convertPath('/workspace')] = packages;
-    contextBuilder.packagesToMapMap[packages] = {'project': []};
-    workspace = PackageBuildWorkspace.find(
-        resourceProvider, convertPath('/workspace'), contextBuilder);
-    resolver = new PackageBuildFileUriResolver(workspace);
-    newFile('/workspace/test.dart');
-    newFile('/workspace/.dart_tool/build/generated/project/gen.dart');
-  }
-
-  void test_resolveAbsolute_doesNotExist() {
-    Source source = _resolvePath('/workspace/foo.dart');
-    expect(source, isNotNull);
-    expect(source.exists(), isFalse);
-    expect(source.fullName, convertPath('/workspace/foo.dart'));
-  }
-
-  void test_resolveAbsolute_file() {
-    Source source = _resolvePath('/workspace/test.dart');
-    expect(source, isNotNull);
-    expect(source.exists(), isTrue);
-    expect(source.fullName, convertPath('/workspace/test.dart'));
-  }
-
-  void test_resolveAbsolute_folder() {
-    Source source = _resolvePath('/workspace');
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_generated_file_exists_one() {
-    Source source = _resolvePath('/workspace/gen.dart');
-    expect(source, isNotNull);
-    expect(source.exists(), isTrue);
-    expect(source.fullName,
-        convertPath('/workspace/.dart_tool/build/generated/project/gen.dart'));
-  }
-
-  void test_resolveAbsolute_notFile_dartUri() {
-    Uri uri = new Uri(scheme: 'dart', path: 'core');
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_notFile_httpsUri() {
-    Uri uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNull);
-  }
-
-  void test_restoreAbsolute() {
-    Uri uri =
-        resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
-    expect(resolver.restoreAbsolute(source), uri);
-    expect(
-        resolver.restoreAbsolute(
-            new NonExistingSource(source.fullName, null, null)),
-        uri);
-  }
-
-  Source _resolvePath(String absolutePosixPath) {
-    String absolutePath = resourceProvider.convertPath(absolutePosixPath);
-    Uri uri = resourceProvider.pathContext.toUri(absolutePath);
-    return resolver.resolveAbsolute(uri);
-  }
-}
-
-@reflectiveTest
-class PackageBuildPackageUriResolverTest extends Object
-    with ResourceProviderMixin {
-  PackageBuildWorkspace workspace;
-  PackageBuildPackageUriResolver resolver;
-  MockUriResolver packageUriResolver;
-
-  Uri addPackageSource(String path, String uriStr, {bool create: true}) {
-    Uri uri = Uri.parse(uriStr);
-    final File file = create
-        ? newFile(path)
-        : resourceProvider.getResource(convertPath(path));
-    final Source source = file.createSource(uri);
-    packageUriResolver.resolveAbsoluteMap[uri] = source;
-    return uri;
-  }
-
-  void setUp() {
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-  }
-
-  void test_resolveAbsolute_generated() {
-    _addResources([
-      '/workspace/.dart_tool/build/generated/project/lib/generated_file.dart',
-    ]);
-    final Uri sourceUri = addPackageSource('/workspace/lib/generated_file.dart',
-        'package:project/generated_file.dart',
-        create: false);
-    _assertResolveUri(sourceUri,
-        '/workspace/.dart_tool/build/generated/project/lib/generated_file.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_null_notPackage() {
-    _addResources([
-      '/workspace/.dart_tool/build/generated',
-    ]);
-    Source source = resolver.resolveAbsolute(Uri.parse('dart:async'));
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_null_startsWithSlash() {
-    _addResources([
-      '/workspace/.dart_tool/build/generated',
-    ]);
-    Source source =
-        resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
-    expect(source, isNull);
-  }
-
-  void test_resolveAbsolute_source() {
-    _addResources([
-      '/workspace/.dart_tool/build/generated/project/lib/source_file.dart',
-    ]);
-    final Uri sourceUri = addPackageSource(
-        '/workspace/lib/source_file.dart', 'package:project/source_file.dart');
-    _assertResolveUri(sourceUri, '/workspace/lib/source_file.dart',
-        exists: true);
-  }
-
-  void test_resolveAbsolute_workspace_doesNotExist() {
-    _addResources([
-      '/workspace/.dart_tool/build/generated',
-    ]);
-    final Uri sourceUri = addPackageSource(
-        '/workspace/lib/doesNotExist.dart', 'package:project/doesNotExist.dart',
-        create: false);
-    _assertResolveUri(sourceUri, '/workspace/lib/doesNotExist.dart',
-        exists: false);
-  }
-
-  void _addResources(List<String> paths, {String workspacePath: '/workspace'}) {
-    for (String path in paths) {
-      if (path.endsWith('/')) {
-        newFolder(path.substring(0, path.length - 1));
-      } else {
-        newFile(path);
-      }
-    }
-    final contextBuilder = new MockContextBuilder();
-    final packages = new MockPackages();
-    contextBuilder.packagesMapMap[convertPath(workspacePath)] = packages;
-    contextBuilder.packagesToMapMap[packages] = {'project': []};
-    workspace = PackageBuildWorkspace.find(
-        resourceProvider, convertPath(workspacePath), contextBuilder);
-    packageUriResolver = new MockUriResolver();
-    resolver =
-        new PackageBuildPackageUriResolver(workspace, packageUriResolver);
-  }
-
-  Source _assertResolveUri(Uri uri, String posixPath,
-      {bool exists: true, bool restore: true}) {
-    Source source = resolver.resolveAbsolute(uri);
-    expect(source, isNotNull);
-    expect(source.fullName, convertPath(posixPath));
-    expect(source.uri, uri);
-    expect(source.exists(), exists);
-    // If enabled, test also "restoreAbsolute".
-    if (restore) {
-      Uri restoredUri = resolver.restoreAbsolute(source);
-      expect(restoredUri.toString(), uri.toString());
-    }
-    return source;
-  }
-}
-
-@reflectiveTest
-class PackageBuildWorkspaceTest extends Object with ResourceProviderMixin {
-  void test_builtFile_currentProject() {
-    newFolder('/workspace/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final libFile =
-        newFile('/workspace/.dart_tool/build/generated/project/lib/file.dart');
-    expect(
-        workspace.builtFile(convertPath('lib/file.dart'), 'project'), libFile);
-  }
-
-  void test_builtFile_importedPackage() {
-    newFolder('/workspace/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project', 'foo']);
-
-    final libFile =
-        newFile('/workspace/.dart_tool/build/generated/foo/lib/file.dart');
-    expect(workspace.builtFile(convertPath('lib/file.dart'), 'foo'), libFile);
-  }
-
-  void test_builtFile_notInPackagesGetsHidden() {
-    newFolder('/workspace/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-
-    // Ensure package:bar is not configured.
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project', 'foo']);
-
-    // Create a generated file in package:bar.
-    newFile('/workspace/.dart_tool/build/generated/bar/lib/file.dart');
-
-    // Bar not in packages, file should not be returned.
-    expect(workspace.builtFile('lib/file.dart', 'bar'), isNull);
-  }
-
-  void test_find_fail_notAbsolute() {
-    expect(
-        () => PackageBuildWorkspace.find(resourceProvider,
-            convertPath('not_absolute'), new MockContextBuilder()),
-        throwsArgumentError);
-  }
-
-  void test_find_hasDartToolAndPubspec() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.projectPackageName, 'project');
-  }
-
-  void test_find_hasDartToolAndPubspec_inParentDirectory() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
-    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
-        'name: subproject'.codeUnits);
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider,
-        convertPath('/workspace/opened/up/a/child/dir'),
-        new MockContextBuilder());
-    expect(workspace.root, convertPath('/workspace/opened/up/a/child/dir'));
-    expect(workspace.projectPackageName, 'subproject');
-  }
-
-  void
-      test_find_hasDartToolAndPubspec_inParentDirectory_ignoresMalformedPubspec() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
-    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
-        'not: yaml: here!!! 111'.codeUnits);
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider,
-        convertPath('/workspace/opened/up/a/child/dir'),
-        new MockContextBuilder());
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.projectPackageName, 'project');
-  }
-
-  void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloDartTool() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFolder('/workspace/opened/up/a/child/dir');
-    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider,
-        convertPath('/workspace/opened/up/a/child/dir'),
-        new MockContextBuilder());
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.projectPackageName, 'project');
-  }
-
-  void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloPubspec() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFolder('/workspace/opened/up/a/child/dir');
-    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
-        'name: subproject'.codeUnits);
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider,
-        convertPath('/workspace/opened/up/a/child/dir'),
-        new MockContextBuilder());
-    expect(workspace.root, convertPath('/workspace'));
-    expect(workspace.projectPackageName, 'project');
-  }
-
-  void test_find_hasDartToolNoBuild() {
-    // Edge case: an empty .dart_tool directory. Don't assume package:build.
-    newFolder('/workspace/.dart_tool');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
-    expect(workspace, isNull);
-  }
-
-  void test_find_hasDartToolNoPubspec() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
-    expect(workspace, isNull);
-  }
-
-  void test_find_hasDartToolPubButNotBuild() {
-    // Dart projects will have this directory, that don't use package:build.
-    newFolder('/workspace/.dart_tool/pub');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
-    expect(workspace, isNull);
-  }
-
-  void test_find_hasMalformedPubspec() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes(
-        '/workspace/pubspec.yaml', 'not: yaml: here! 1111'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
-    expect(workspace, isNull);
-  }
-
-  void test_find_hasPubspecNoDartTool() {
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
-        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
-    expect(workspace, isNull);
-  }
-
-  void test_findFile_bin() {
-    newFolder('/workspace/.dart_tool/build/generated/project/bin');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final binFile = newFile('/workspace/bin/file.dart');
-    expect(
-        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
-  }
-
-  void test_findFile_binGenerated() {
-    newFolder('/workspace/.dart_tool/build/generated/project/bin');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final binFile =
-        newFile('/workspace/.dart_tool/build/generated/project/bin/file.dart');
-    expect(
-        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
-  }
-
-  void test_findFile_libGenerated() {
-    newFolder('/workspace/.dart_tool/build/generated/project/lib');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final libFile =
-        newFile('/workspace/.dart_tool/build/generated/project/lib/file.dart');
-    expect(
-        workspace.findFile(convertPath('/workspace/lib/file.dart')), libFile);
-  }
-
-  void test_findFile_test() {
-    newFolder('/workspace/.dart_tool/build/generated/project/test');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final testFile = newFile('/workspace/test/file.dart');
-    expect(
-        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
-  }
-
-  void test_findFile_testGenerated() {
-    newFolder('/workspace/.dart_tool/build/generated/project/test');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final testFile =
-        newFile('/workspace/.dart_tool/build/generated/project/test/file.dart');
-    expect(
-        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
-  }
-
-  void test_findFile_web() {
-    newFolder('/workspace/.dart_tool/build/generated/project/web');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final webFile = newFile('/workspace/web/file.dart');
-    expect(
-        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
-  }
-
-  void test_findFile_webGenerated() {
-    newFolder('/workspace/.dart_tool/build/generated/project/web');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project']);
-
-    final webFile =
-        newFile('/workspace/.dart_tool/build/generated/project/web/file.dart');
-    expect(
-        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
-  }
-
-  void test_supports_flutter() {
-    newFolder('/workspace/.dart_tool/build');
-    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    PackageBuildWorkspace workspace =
-        _createWorkspace('/workspace', ['project', 'flutter']);
-
-    expect(workspace.hasFlutterDependency, true);
-  }
-
-  PackageBuildWorkspace _createWorkspace(
-      String root, List<String> packageNames) {
-    final contextBuilder = new MockContextBuilder();
-    final packages = new MockPackages();
-    final packageMap = new Map<String, List<Folder>>.fromIterable(packageNames,
-        value: ((_) => []));
-    contextBuilder.packagesMapMap[convertPath(root)] = packages;
-    contextBuilder.packagesToMapMap[packages] = packageMap;
-    return PackageBuildWorkspace.find(
-        resourceProvider, convertPath(root), contextBuilder);
-  }
-}
diff --git a/pkg/analyzer/test/generated/package_test.dart b/pkg/analyzer/test/generated/package_test.dart
deleted file mode 100644
index 1921f63..0000000
--- a/pkg/analyzer/test/generated/package_test.dart
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/package.dart';
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:package_config/packages.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../src/context/mock_sdk.dart';
-import 'resolver_test_case.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(DependencyFinderTest);
-    defineReflectiveTests(PackageDescriptionTest);
-    defineReflectiveTests(PackageManagerTest);
-  });
-}
-
-/**
- * The name of the pubspec.yaml file.
- */
-const String pubspecName = 'pubspec.yaml';
-
-@reflectiveTest
-class DependencyFinderTest extends ResolverTestCase {
-  void test_transitiveDependenciesFor_circularDependencies() {
-    var pathContext = resourceProvider.pathContext;
-    String packageA = resourceProvider.convertPath('/pub-cache/a-1.0');
-    String packageB = resourceProvider.convertPath('/pub-cache/b-1.0');
-    String packageC = resourceProvider.convertPath('/pub-cache/c-1.0');
-    resourceProvider.newFile(pathContext.join(packageA, pubspecName), '''
-    dependencies:
-      b: any
-    ''');
-    resourceProvider.newFile(pathContext.join(packageB, pubspecName), '''
-    dependencies:
-      c: any
-    ''');
-    resourceProvider.newFile(pathContext.join(packageC, pubspecName), '''
-    dependencies:
-      a: any
-    ''');
-    Map<String, List<Folder>> packageMap = <String, List<Folder>>{
-      'a': <Folder>[resourceProvider.getFolder(packageA)],
-      'b': <Folder>[resourceProvider.getFolder(packageB)],
-      'c': <Folder>[resourceProvider.getFolder(packageC)],
-    };
-
-    DependencyFinder finder = new DependencyFinder(resourceProvider);
-    List<String> result =
-        finder.transitiveDependenciesFor(packageMap, packageA);
-    expect(result, unorderedEquals([packageB, packageC]));
-  }
-
-  void test_transitiveDependenciesFor_missingPubspec() {
-    String packagePath = resourceProvider.convertPath('/pub-cache/a-1.0');
-    Map<String, List<Folder>> packageMap = <String, List<Folder>>{
-      'a': <Folder>[resourceProvider.getFolder(packagePath)]
-    };
-
-    DependencyFinder finder = new DependencyFinder(resourceProvider);
-    expect(() => finder.transitiveDependenciesFor(packageMap, packagePath),
-        throwsA(new TypeMatcher<AnalysisException>()));
-  }
-
-  void test_transitiveDependenciesFor_noDependencies() {
-    var pathContext = resourceProvider.pathContext;
-    String packagePath = resourceProvider.convertPath('/pub-cache/a-1.0');
-    resourceProvider.newFile(pathContext.join(packagePath, pubspecName), '');
-    Map<String, List<Folder>> packageMap = <String, List<Folder>>{
-      'a': <Folder>[resourceProvider.getFolder(packagePath)]
-    };
-
-    DependencyFinder finder = new DependencyFinder(resourceProvider);
-    List<String> result =
-        finder.transitiveDependenciesFor(packageMap, packagePath);
-    expect(result, hasLength(0));
-  }
-
-  void test_transitiveDependenciesFor_overlappingDependencies() {
-    var pathContext = resourceProvider.pathContext;
-    String packageA = resourceProvider.convertPath('/pub-cache/a-1.0');
-    String packageB = resourceProvider.convertPath('/pub-cache/b-1.0');
-    String packageC = resourceProvider.convertPath('/pub-cache/c-1.0');
-    String packageD = resourceProvider.convertPath('/pub-cache/d-1.0');
-    resourceProvider.newFile(pathContext.join(packageA, pubspecName), '''
-    dependencies:
-      b: any
-      c: any
-    ''');
-    resourceProvider.newFile(pathContext.join(packageB, pubspecName), '''
-    dependencies:
-      d: any
-    ''');
-    resourceProvider.newFile(pathContext.join(packageC, pubspecName), '''
-    dependencies:
-      d: any
-    ''');
-    resourceProvider.newFile(pathContext.join(packageD, pubspecName), '');
-    Map<String, List<Folder>> packageMap = <String, List<Folder>>{
-      'a': <Folder>[resourceProvider.getFolder(packageA)],
-      'b': <Folder>[resourceProvider.getFolder(packageB)],
-      'c': <Folder>[resourceProvider.getFolder(packageC)],
-      'd': <Folder>[resourceProvider.getFolder(packageD)],
-    };
-
-    DependencyFinder finder = new DependencyFinder(resourceProvider);
-    List<String> result =
-        finder.transitiveDependenciesFor(packageMap, packageA);
-    expect(result, unorderedEquals([packageB, packageC, packageD]));
-  }
-
-  void test_transitiveDependenciesFor_simpleDependencies() {
-    var pathContext = resourceProvider.pathContext;
-    String packageA = resourceProvider.convertPath('/pub-cache/a-1.0');
-    String packageB = resourceProvider.convertPath('/pub-cache/b-1.0');
-    String packageC = resourceProvider.convertPath('/pub-cache/c-1.0');
-    resourceProvider.newFile(pathContext.join(packageA, pubspecName), '''
-    dependencies:
-      b: any
-      c: any
-    ''');
-    resourceProvider.newFile(pathContext.join(packageB, pubspecName), '');
-    resourceProvider.newFile(pathContext.join(packageC, pubspecName), '');
-    Map<String, List<Folder>> packageMap = <String, List<Folder>>{
-      'a': <Folder>[resourceProvider.getFolder(packageA)],
-      'b': <Folder>[resourceProvider.getFolder(packageB)],
-      'c': <Folder>[resourceProvider.getFolder(packageC)],
-    };
-
-    DependencyFinder finder = new DependencyFinder(resourceProvider);
-    List<String> result =
-        finder.transitiveDependenciesFor(packageMap, packageA);
-    expect(result, unorderedEquals([packageB, packageC]));
-  }
-}
-
-@reflectiveTest
-class PackageDescriptionTest extends ResolverTestCase {
-  void test_equal_false_differentOptions() {
-    String packageId = 'path1;path2';
-    DartSdk sdk = new MockSdk();
-    AnalysisOptionsImpl options1 = new AnalysisOptionsImpl();
-    AnalysisOptionsImpl options2 = new AnalysisOptionsImpl();
-    options2.enableLazyAssignmentOperators =
-        !options1.enableLazyAssignmentOperators;
-    PackageDescription first = new PackageDescription(packageId, sdk, options1);
-    PackageDescription second =
-        new PackageDescription(packageId, sdk, options2);
-    expect(first == second, isFalse);
-  }
-
-  void test_equal_false_differentPaths() {
-    String packageId1 = 'path1;path2';
-    String packageId2 = 'path1;path3';
-    DartSdk sdk = new MockSdk();
-    AnalysisOptions options = new AnalysisOptionsImpl();
-    PackageDescription first = new PackageDescription(packageId1, sdk, options);
-    PackageDescription second =
-        new PackageDescription(packageId2, sdk, options);
-    expect(first == second, isFalse);
-  }
-
-  void test_equal_false_differentSdks() {
-    String packageId = 'path1;path2';
-    DartSdk sdk1 = new MockSdk();
-    DartSdk sdk2 = new MockSdk();
-    AnalysisOptions options = new AnalysisOptionsImpl();
-    PackageDescription first = new PackageDescription(packageId, sdk1, options);
-    PackageDescription second =
-        new PackageDescription(packageId, sdk2, options);
-    expect(first == second, isFalse);
-  }
-
-  void test_equal_true() {
-    String packageId = 'path1;path2';
-    DartSdk sdk = new MockSdk();
-    AnalysisOptions options = new AnalysisOptionsImpl();
-    PackageDescription first = new PackageDescription(packageId, sdk, options);
-    PackageDescription second = new PackageDescription(packageId, sdk, options);
-    expect(first == second, isTrue);
-  }
-}
-
-@reflectiveTest
-class PackageManagerTest extends ResolverTestCase {
-  void test_getContext() {
-    var pathContext = resourceProvider.pathContext;
-    String packageA = resourceProvider.convertPath('/pub-cache/a-1.0');
-    String packageB1 = resourceProvider.convertPath('/pub-cache/b-1.0');
-    String packageB2 = resourceProvider.convertPath('/pub-cache/b-2.0');
-    String packageC = resourceProvider.convertPath('/pub-cache/c-1.0');
-    resourceProvider.newFile(pathContext.join(packageA, pubspecName), '''
-    dependencies:
-      b: any
-      c: any
-    ''');
-    resourceProvider.newFile(pathContext.join(packageB1, pubspecName), '');
-    resourceProvider.newFile(pathContext.join(packageB2, pubspecName), '');
-    resourceProvider.newFile(pathContext.join(packageC, pubspecName), '');
-
-    Packages packages1 = new _MockPackages(<String, Uri>{
-      'a': pathContext.toUri(packageA),
-      'b': pathContext.toUri(packageB1),
-      'c': pathContext.toUri(packageC),
-    });
-    DartUriResolver resolver = new DartUriResolver(new MockSdk());
-    AnalysisOptions options = new AnalysisOptionsImpl();
-    //
-    // Verify that we can compute a context for a package.
-    //
-    PackageManager manager = new PackageManager(resourceProvider);
-    AnalysisContext context1 =
-        manager.getContext(packageA, packages1, resolver, options);
-    expect(context1, isNotNull);
-    //
-    // Verify that if we have the same package map we get the same context.
-    //
-    AnalysisContext context2 =
-        manager.getContext(packageA, packages1, resolver, options);
-    expect(context2, same(context1));
-    //
-    // Verify that if we have a different package map we get a different context.
-    //
-    Packages packages3 = new _MockPackages(<String, Uri>{
-      'a': pathContext.toUri(packageA),
-      'b': pathContext.toUri(packageB2),
-      'c': pathContext.toUri(packageC),
-    });
-    AnalysisContext context3 =
-        manager.getContext(packageA, packages3, resolver, options);
-    expect(context3, isNot(same(context1)));
-  }
-}
-
-/**
- * An implementation of [Packages] used for testing.
- */
-class _MockPackages implements Packages {
-  final Map<String, Uri> map;
-
-  _MockPackages(this.map);
-
-  @override
-  Iterable<String> get packages => map.keys;
-
-  @override
-  Map<String, Uri> asMap() => map;
-
-  @override
-  Uri resolve(Uri packageUri, {Uri notFound(Uri packageUri)}) {
-    fail('Unexpected invocation of resolve');
-  }
-}
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index a39d370..0808c6b 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -201,12 +201,6 @@
   }
 
   @override
-  void beginExpressionStatement(Token token) {
-    super.beginExpressionStatement(token);
-    begin('ExpressionStatement');
-  }
-
-  @override
   void beginFactoryMethod(
       Token lastConsumed, Token externalToken, Token constToken) {
     super.beginFactoryMethod(lastConsumed, externalToken, constToken);
@@ -341,12 +335,6 @@
   }
 
   @override
-  void beginLiteralMapEntry(Token token) {
-    super.beginLiteralMapEntry(token);
-    begin('LiteralMapEntry');
-  }
-
-  @override
   void beginLiteralString(Token token) {
     super.beginLiteralString(token);
     begin('LiteralString');
@@ -688,12 +676,6 @@
   }
 
   @override
-  void endExpressionStatement(Token token) {
-    end('ExpressionStatement');
-    super.endExpressionStatement(token);
-  }
-
-  @override
   void endFactoryMethod(
       Token beginToken, Token factoryKeyword, Token endToken) {
     end('FactoryMethod');
@@ -782,9 +764,9 @@
   }
 
   @override
-  void endFunctionType(Token functionToken) {
+  void endFunctionType(Token functionToken, Token questionMark) {
     end('FunctionType');
-    super.endFunctionType(functionToken);
+    super.endFunctionType(functionToken, questionMark);
   }
 
   @override
@@ -849,12 +831,6 @@
   }
 
   @override
-  void endLiteralMapEntry(Token colon, Token endToken) {
-    end('LiteralMapEntry');
-    super.endLiteralMapEntry(colon, endToken);
-  }
-
-  @override
   void endLiteralString(int interpolationCount, Token endToken) {
     end('LiteralString');
     super.endLiteralString(interpolationCount, endToken);
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index dce0e04..b022212 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart' show ErrorReporter;
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
@@ -14,15 +15,17 @@
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/string_source.dart';
+import 'package:front_end/src/fasta/parser/forwarding_listener.dart' as fasta;
+import 'package:front_end/src/fasta/parser/parser.dart' as fasta;
 import 'package:front_end/src/fasta/scanner.dart'
     show ScannerResult, scanString;
-import 'package:front_end/src/fasta/parser/parser.dart' as fasta;
 import 'package:front_end/src/fasta/scanner/error_token.dart' show ErrorToken;
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/scanner/errors.dart' show translateErrorToken;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../util/ast_type_matchers.dart';
 import 'parser_fasta_listener.dart';
 import 'parser_test.dart';
 import 'test_support.dart';
@@ -34,6 +37,7 @@
     defineReflectiveTests(ErrorParserTest_Fasta);
     defineReflectiveTests(ExpressionParserTest_Fasta);
     defineReflectiveTests(FormalParameterParserTest_Fasta);
+    defineReflectiveTests(NNBDParserTest_Fasta);
     defineReflectiveTests(RecoveryParserTest_Fasta);
     defineReflectiveTests(SimpleParserTest_Fasta);
     defineReflectiveTests(StatementParserTest_Fasta);
@@ -48,14 +52,125 @@
 
 @reflectiveTest
 class ClassMemberParserTest_Fasta extends FastaParserTestCase
-    with ClassMemberParserTestMixin {}
+    with ClassMemberParserTestMixin {
+  void test_parseClassMember_operator_gtgtgt() {
+    final sourceText = 'class C { bool operator >>>(other) => false; }';
+
+    // ---------------------------------------------------
+    // TODO(danrubel): Replace this section with a call to parseCompilationUnit
+    // once '>>>' token support is enabled permanently.
+
+    var source = new StringSource(sourceText, 'parser_test_StringSource.dart');
+    GatheringErrorListener errorListener =
+        new GatheringErrorListener(checkRanges: true);
+
+    // Scan tokens
+    StringScanner scanner = new StringScanner(sourceText, includeComments: true)
+      ..enableGtGtGt = true;
+    Token tokens = scanner.tokenize();
+    expect(scanner.hasErrors, isFalse);
+
+    // Run parser
+    ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
+    fasta.Parser parser = new fasta.Parser(null);
+    parser.enableSetLiterals = IsEnabledByDefault.set_literals;
+    AstBuilder astBuilder = new AstBuilder(errorReporter, source.uri, true);
+    parser.listener = astBuilder;
+    astBuilder.parser = parser;
+    parser.parseUnit(tokens);
+
+    CompilationUnitImpl unit = astBuilder.pop();
+    expect(unit, isNotNull);
+    unit.localDeclarations = astBuilder.localDeclarations;
+    errorListener.assertNoErrors();
+
+    // ---------------------------------------------------
+
+    ClassDeclaration declaration = unit.declarations[0];
+    ClassMember member = declaration.members[0];
+    expect(member, isNotNull);
+    expect(member, new TypeMatcher<MethodDeclaration>());
+    MethodDeclaration method = member;
+    expect(method.documentationComment, isNull);
+    expect(method.externalKeyword, isNull);
+    expect(method.modifierKeyword, isNull);
+    expect(method.propertyKeyword, isNull);
+    expect(method.returnType, isNotNull);
+    expect(method.name.name, '>>>');
+    expect(method.operatorKeyword, isNotNull);
+    expect(method.typeParameters, isNull);
+    expect(method.parameters, isNotNull);
+    expect(method.body, isNotNull);
+  }
+}
 
 /**
  * Tests of the fasta parser based on [ComplexParserTestMixin].
  */
 @reflectiveTest
 class ComplexParserTest_Fasta extends FastaParserTestCase
-    with ComplexParserTestMixin {}
+    with ComplexParserTestMixin {
+  void test_conditionalExpression_precedence_nullableType_as2() {
+    ExpressionStatement statement = parseStatement('x as bool? ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    AsExpression asExpression = expression.condition;
+    TypeName type = asExpression.type;
+    expect(type.question.lexeme, '?');
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, isParenthesizedExpression);
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, isSimpleIdentifier);
+    assertErrors(
+        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 9, 1)]);
+  }
+
+  void test_conditionalExpression_precedence_nullableType_as3() {
+    ExpressionStatement statement =
+        parseStatement('(x as bool?) ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    ParenthesizedExpression condition = expression.condition;
+    AsExpression asExpression = condition.expression;
+    TypeName type = asExpression.type;
+    expect(type.question.lexeme, '?');
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, isParenthesizedExpression);
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, isSimpleIdentifier);
+    assertErrors(
+        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 10, 1)]);
+  }
+
+  void test_conditionalExpression_precedence_nullableType_is2() {
+    ExpressionStatement statement =
+        parseStatement('x is String? ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    IsExpression isExpression = expression.condition;
+    TypeName type = isExpression.type;
+    expect(type.question.lexeme, '?');
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, isParenthesizedExpression);
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, isSimpleIdentifier);
+    assertErrors(
+        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 11, 1)]);
+  }
+
+  void test_conditionalExpression_precedence_nullableType_is3() {
+    ExpressionStatement statement =
+        parseStatement('(x is String?) ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    ParenthesizedExpression condition = expression.condition;
+    IsExpression isExpression = condition.expression;
+    TypeName type = isExpression.type;
+    expect(type.question.lexeme, '?');
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, isParenthesizedExpression);
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, isSimpleIdentifier);
+    assertErrors(
+        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 12, 1)]);
+  }
+}
 
 /**
  * Tests of the fasta parser based on [ErrorParserTest].
@@ -95,7 +210,10 @@
   void test_invalidOperatorAfterSuper_constructorInitializer2() {
     parseCompilationUnit('class C { C() : super?.namedConstructor(); }',
         errors: [
-          expectedError(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, 21, 2)
+          expectedError(
+              ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER,
+              21,
+              2)
         ]);
   }
 
@@ -141,13 +259,140 @@
     //   Actual: TokenType:<MINUS_MINUS>
     super.test_parseUnaryExpression_decrement_super_withComment();
   }
+
+  void test_mapLiteral() {
+    MapLiteral map = parseExpression('{3: 6}', parseSetLiterals: true);
+    expect(map.constKeyword, isNull);
+    expect(map.typeArguments, isNull);
+    expect(map.entries, hasLength(1));
+    MapLiteralEntry entry = map.entries[0];
+    IntegerLiteral key = entry.key;
+    expect(key.value, 3);
+    IntegerLiteral value = entry.value;
+    expect(value.value, 6);
+  }
+
+  void test_mapLiteral_const() {
+    MapLiteral map = parseExpression('const {3: 6}', parseSetLiterals: true);
+    expect(map.constKeyword, isNotNull);
+    expect(map.typeArguments, isNull);
+    expect(map.entries, hasLength(1));
+    MapLiteralEntry entry = map.entries[0];
+    IntegerLiteral key = entry.key;
+    expect(key.value, 3);
+    IntegerLiteral value = entry.value;
+    expect(value.value, 6);
+  }
+
+  void test_setLiteral() {
+    SetLiteral set = parseExpression('{3}', parseSetLiterals: true);
+    expect(set.constKeyword, isNull);
+    expect(set.typeArguments, isNull);
+    expect(set.elements, hasLength(1));
+    IntegerLiteral value = set.elements[0];
+    expect(value.value, 3);
+  }
+
+  void test_setLiteral_const() {
+    SetLiteral set = parseExpression('const {3, 6}', parseSetLiterals: true);
+    expect(set.constKeyword, isNotNull);
+    expect(set.typeArguments, isNull);
+    expect(set.elements, hasLength(2));
+    IntegerLiteral value1 = set.elements[0];
+    expect(value1.value, 3);
+    IntegerLiteral value2 = set.elements[1];
+    expect(value2.value, 6);
+  }
+
+  void test_setLiteral_const_typeArgument() {
+    SetLiteral set = parseExpression('const <int>{3}', parseSetLiterals: true);
+    expect(set.constKeyword, isNotNull);
+    expect(set.typeArguments.arguments, hasLength(1));
+    NamedType typeArg = set.typeArguments.arguments[0];
+    expect(typeArg.name.name, 'int');
+    expect(set.elements.length, 1);
+    IntegerLiteral value = set.elements[0];
+    expect(value.value, 3);
+  }
+
+  void test_setLiteral_invalid_map_entry() {
+    parseExpression('<int>{1: 1}', parseSetLiterals: true, errors: [
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1),
+    ]);
+  }
+
+  @failingTest
+  void test_setLiteral_invalid_too_many_type_arguments1() {
+    parseExpression('<int, int, int>{}', parseSetLiterals: true, errors: [
+      // TODO(danrubel): Currently the resolver reports invalid number of
+      // type arguments, but the parser could report this.
+      expectedError(
+          /* ParserErrorCode.EXPECTED_ONE_TYPE_VARIABLE */
+          ParserErrorCode.EXPECTED_TOKEN,
+          15,
+          1),
+    ]);
+  }
+
+  @failingTest
+  void test_setLiteral_invalid_too_many_type_arguments2() {
+    parseExpression('<int, int, int>{1}', parseSetLiterals: true, errors: [
+      // TODO(danrubel): Currently the resolver reports invalid number of
+      // type arguments, but the parser could report this.
+      expectedError(
+          /* ParserErrorCode.EXPECTED_ONE_TYPE_VARIABLE */
+          ParserErrorCode.EXPECTED_TOKEN,
+          15,
+          1),
+    ]);
+  }
+
+  @failingTest
+  void test_setLiteral_invalid_too_many_type_arguments3() {
+    parseExpression('<int, int>{1}', parseSetLiterals: true, errors: [
+      // TODO(danrubel): Currently the resolver reports invalid number of
+      // type arguments, but the parser could report this.
+      expectedError(
+          /* ParserErrorCode.EXPECTED_ONE_TYPE_VARIABLE */
+          ParserErrorCode.EXPECTED_TOKEN,
+          10,
+          1),
+    ]);
+  }
+
+  void test_setLiteral_nested_typeArgument() {
+    SetLiteral set = parseExpression('<Set<int>>{{3}}', parseSetLiterals: true);
+    expect(set.constKeyword, isNull);
+    expect(set.typeArguments.arguments, hasLength(1));
+    NamedType typeArg1 = set.typeArguments.arguments[0];
+    expect(typeArg1.name.name, 'Set');
+    expect(typeArg1.typeArguments.arguments, hasLength(1));
+    NamedType typeArg2 = typeArg1.typeArguments.arguments[0];
+    expect(typeArg2.name.name, 'int');
+    expect(set.elements.length, 1);
+    SetLiteral intSet = set.elements[0];
+    expect(intSet.elements, hasLength(1));
+    IntegerLiteral value = intSet.elements[0];
+    expect(value.value, 3);
+  }
+
+  void test_setLiteral_typeArgument() {
+    SetLiteral set = parseExpression('<int>{3}', parseSetLiterals: true);
+    expect(set.constKeyword, isNull);
+    expect(set.typeArguments.arguments, hasLength(1));
+    NamedType typeArg = set.typeArguments.arguments[0];
+    expect(typeArg.name.name, 'int');
+    expect(set.elements.length, 1);
+    IntegerLiteral value = set.elements[0];
+    expect(value.value, 3);
+  }
 }
 
 /**
  * Implementation of [AbstractParserTestCase] specialized for testing the
  * Fasta parser.
  */
-class FastaParserTestCase extends Object
+class FastaParserTestCase
     with ParserTestHelpers
     implements AbstractParserTestCase {
   static final List<ErrorCode> NO_ERROR_COMPARISON = <ErrorCode>[];
@@ -344,6 +589,7 @@
     // Run parser
     ErrorReporter errorReporter = new ErrorReporter(listener, source);
     fasta.Parser parser = new fasta.Parser(null);
+    parser.enableSetLiterals = IsEnabledByDefault.set_literals;
     AstBuilder astBuilder = new AstBuilder(errorReporter, source.uri, true);
     parser.listener = astBuilder;
     astBuilder.parser = parser;
@@ -397,8 +643,10 @@
   Expression parseExpression(String source,
       {List<ErrorCode> codes,
       List<ExpectedError> errors,
-      int expectedEndOffset}) {
+      int expectedEndOffset,
+      bool parseSetLiterals = false}) {
     createParser(source, expectedEndOffset: expectedEndOffset);
+    _parserProxy.fastaParser.enableSetLiterals = parseSetLiterals;
     Expression result = _parserProxy.parseExpression2();
     assertErrors(codes: codes, errors: errors);
     return result;
@@ -851,6 +1099,15 @@
 @reflectiveTest
 class RecoveryParserTest_Fasta extends FastaParserTestCase
     with RecoveryParserTestMixin {
+  @override
+  void test_equalityExpression_precedence_relational_right() {
+    parseExpression("== is", codes: [
+      ParserErrorCode.EXPECTED_TYPE_NAME,
+      ParserErrorCode.MISSING_IDENTIFIER,
+      ParserErrorCode.MISSING_IDENTIFIER
+    ]);
+  }
+
   void test_invalidTypeParameters_super() {
     parseCompilationUnit('class C<X super Y> {}', errors: [
       // TODO(danrubel): Improve recovery.
@@ -867,15 +1124,6 @@
   }
 
   @override
-  void test_equalityExpression_precedence_relational_right() {
-    parseExpression("== is", codes: [
-      ParserErrorCode.EXPECTED_TYPE_NAME,
-      ParserErrorCode.MISSING_IDENTIFIER,
-      ParserErrorCode.MISSING_IDENTIFIER
-    ]);
-  }
-
-  @override
   void test_relationalExpression_missing_LHS_RHS() {
     parseExpression("is", codes: [
       ParserErrorCode.EXPECTED_TYPE_NAME,
@@ -928,6 +1176,25 @@
 @reflectiveTest
 class StatementParserTest_Fasta extends FastaParserTestCase
     with StatementParserTestMixin {
+  void test_35177() {
+    ExpressionStatement statement = parseStatement('(f)()<int>();');
+
+    FunctionExpressionInvocation funct1 = statement.expression;
+    NodeList<TypeAnnotation> typeArgs = funct1.typeArguments.arguments;
+    expect(typeArgs, hasLength(1));
+    TypeName typeName = typeArgs[0];
+    expect(typeName.name.name, 'int');
+    expect(funct1.argumentList.arguments, hasLength(0));
+
+    FunctionExpressionInvocation funct2 = funct1.function;
+    expect(funct2.typeArguments, isNull);
+    expect(funct2.argumentList.arguments, hasLength(0));
+
+    ParenthesizedExpression expression = funct2.function;
+    SimpleIdentifier identifier = expression.expression;
+    expect(identifier.name, 'f');
+  }
+
   void test_invalid_typeArg_34850() {
     var unit = parseCompilationUnit('foo Future<List<int>> bar() {}', errors: [
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 11, 4),
@@ -1220,3 +1487,146 @@
     expectCommentText(declaration.documentationComment, '/// Doc');
   }
 }
+
+/**
+ * Tests of the fasta parser based on [ComplexParserTestMixin].
+ */
+@reflectiveTest
+class NNBDParserTest_Fasta extends FastaParserTestCase {
+  parseNNBDCompilationUnit(String code, {List<ExpectedError> errors}) {
+    createParser('''
+@pragma('analyzer:non-nullable') library nnbd.parser.test;
+$code
+''');
+    _parserProxy.astBuilder.enableNonNullable = true;
+    CompilationUnit unit = _parserProxy.parseCompilationUnit2();
+    assertNoErrors();
+    return unit;
+  }
+
+  void test_assignment_complex() {
+    parseNNBDCompilationUnit('D? foo(X? x) { X? x1; X? x2 = x + bar(7); }');
+  }
+
+  void test_assignment_simple() {
+    parseNNBDCompilationUnit('D? foo(X? x) { X? x1; X? x2 = x; }');
+  }
+
+  void test_gft_nullable() {
+    parseNNBDCompilationUnit('main() { C? Function() x = 7; }');
+  }
+
+  void test_gft_nullable_1() {
+    parseNNBDCompilationUnit('main() { C Function()? x = 7; }');
+  }
+
+  void test_gft_nullable_2() {
+    parseNNBDCompilationUnit('main() { C? Function()? x = 7; }');
+  }
+
+  void test_gft_nullable_3() {
+    parseNNBDCompilationUnit('main() { C? Function()? Function()? x = 7; }');
+  }
+
+  void test_gft_nullable_prefixed() {
+    parseNNBDCompilationUnit('main() { C.a? Function()? x = 7; }');
+  }
+
+  void test_conditional() {
+    parseNNBDCompilationUnit('D? foo(X? x) { X ? 7 : y; }');
+  }
+
+  void test_conditional_complex() {
+    parseNNBDCompilationUnit('D? foo(X? x) { X ? x2 = x + bar(7) : y; }');
+  }
+
+  void test_conditional_simple() {
+    parseNNBDCompilationUnit('D? foo(X? x) { X ? x2 = x : y; }');
+  }
+
+  void test_for() {
+    parseNNBDCompilationUnit('main() { for(int x = 0; x < 7; ++x) { } }');
+  }
+
+  void test_for_conditional() {
+    parseNNBDCompilationUnit(
+        'main() { for(x ? y = 7 : y = 8; y < 10; ++y) { } }');
+  }
+
+  void test_for_nullable() {
+    parseNNBDCompilationUnit('main() { for(int? x = 0; x < 7; ++x) { } }');
+  }
+
+  void test_foreach() {
+    parseNNBDCompilationUnit('main() { for(int x in [7]) { } }');
+  }
+
+  void test_foreach_nullable() {
+    parseNNBDCompilationUnit('main() { for(int? x in [7, null]) { } }');
+  }
+
+  void test_is_nullable() {
+    CompilationUnit unit =
+        parseNNBDCompilationUnit('main() { x is String? ? (x + y) : z; }');
+    FunctionDeclaration function = unit.declarations[0];
+    BlockFunctionBody body = function.functionExpression.body;
+    ExpressionStatement statement = body.block.statements[0];
+    ConditionalExpression expression = statement.expression;
+
+    IsExpression condition = expression.condition;
+    expect((condition.type as NamedType).question, isNotNull);
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, isParenthesizedExpression);
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, isSimpleIdentifier);
+  }
+
+  void test_is_nullable_parenthesis() {
+    CompilationUnit unit =
+        parseNNBDCompilationUnit('main() { (x is String?) ? (x + y) : z; }');
+    FunctionDeclaration function = unit.declarations[0];
+    BlockFunctionBody body = function.functionExpression.body;
+    ExpressionStatement statement = body.block.statements[0];
+    ConditionalExpression expression = statement.expression;
+
+    ParenthesizedExpression condition = expression.condition;
+    IsExpression isExpression = condition.expression;
+    expect((isExpression.type as NamedType).question, isNotNull);
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, isParenthesizedExpression);
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, isSimpleIdentifier);
+  }
+
+  void test_pragma_missing() {
+    createParser("library foo;");
+    _parserProxy.astBuilder.enableNonNullable = true;
+    CompilationUnitImpl unit = _parserProxy.parseCompilationUnit2();
+    expect(unit.hasPragmaAnalyzerNonNullable, false);
+  }
+
+  void test_pragma_non_nullable() {
+    createParser("@pragma('analyzer:non-nullable') library foo;");
+    _parserProxy.astBuilder.enableNonNullable = true;
+    CompilationUnitImpl unit = _parserProxy.parseCompilationUnit2();
+    expect(unit.hasPragmaAnalyzerNonNullable, true);
+  }
+
+  void test_pragma_non_nullable_not_enabled() {
+    createParser("@pragma('analyzer:non-nullable') library foo;");
+    CompilationUnitImpl unit = _parserProxy.parseCompilationUnit2();
+    expect(unit.hasPragmaAnalyzerNonNullable, false);
+  }
+
+  void test_pragma_other() {
+    createParser("@pragma('analyzer:foo') library foo;");
+    _parserProxy.astBuilder.enableNonNullable = true;
+    CompilationUnitImpl unit = _parserProxy.parseCompilationUnit2();
+    expect(unit.hasPragmaAnalyzerNonNullable, false);
+  }
+
+  void test_enableNonNullable_false() {
+    parseCompilationUnit('main() { x is String? ? (x + y) : z; }',
+        errors: [expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 20, 1)]);
+  }
+}
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index b46d1b7..e6fbf65 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -24,6 +24,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../util/ast_type_matchers.dart';
 import 'test_support.dart';
 
 main() {
@@ -251,7 +252,7 @@
  * Instances of the class `AstValidator` are used to validate the correct construction of an
  * AST structure.
  */
-class AstValidator extends UnifyingAstVisitor<Object> {
+class AstValidator extends UnifyingAstVisitor<void> {
   /**
    * A list containing the errors found while traversing the AST structure.
    */
@@ -274,9 +275,9 @@
   }
 
   @override
-  Object visitNode(AstNode node) {
+  void visitNode(AstNode node) {
     _validate(node);
-    return super.visitNode(node);
+    super.visitNode(node);
   }
 
   /**
@@ -335,23 +336,20 @@
 /**
  * Tests which exercise the parser using a class member.
  */
-abstract class ClassMemberParserTestMixin implements AbstractParserTestCase {
+mixin ClassMemberParserTestMixin implements AbstractParserTestCase {
   void test_parseAwaitExpression_asStatement_inAsync() {
     createParser('m() async { await x; }');
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     FunctionBody body = method.body;
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
+    expect(body, isBlockFunctionBody);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ExpressionStatement, ExpressionStatement, statement);
+    expect(statement, isExpressionStatement);
     Expression expression = (statement as ExpressionStatement).expression;
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is AwaitExpression, AwaitExpression, expression);
+    expect(expression, isAwaitExpression);
     expect((expression as AwaitExpression).awaitKeyword, isNotNull);
     expect((expression as AwaitExpression).expression, isNotNull);
   }
@@ -361,16 +359,12 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     FunctionBody body = method.body;
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
+    expect(body, isBlockFunctionBody);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is VariableDeclarationStatement,
-        VariableDeclarationStatement,
-        statement);
+    expect(statement, isVariableDeclarationStatement);
   }
 
   void test_parseAwaitExpression_inSync() {
@@ -391,20 +385,15 @@
             expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 29, 1)
           ]);
     FunctionBody body = method.body;
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is BlockFunctionBody, BlockFunctionBody, body);
+    expect(body, isBlockFunctionBody);
     Statement statement = (body as BlockFunctionBody).block.statements[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ReturnStatement, ReturnStatement, statement);
+    expect(statement, isReturnStatement);
     Expression expression = (statement as ReturnStatement).expression;
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is BinaryExpression, BinaryExpression, expression);
+    expect(expression, isBinaryExpression);
     if (!usingFastaParser) {
       // TODO(danrubel): capture `await` keywords in fasta generated AST
-      EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression,
-          AwaitExpression, (expression as BinaryExpression).leftOperand);
-      EngineTestCase.assertInstanceOf((obj) => obj is AwaitExpression,
-          AwaitExpression, (expression as BinaryExpression).rightOperand);
+      expect((expression as BinaryExpression).leftOperand, isAwaitExpression);
+      expect((expression as BinaryExpression).rightOperand, isAwaitExpression);
     }
   }
 
@@ -421,7 +410,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ConstructorDeclaration>());
+    expect(member, isConstructorDeclaration);
     ConstructorDeclaration constructor = member;
     expect(constructor.body, isNotNull);
     expect(constructor.separator, isNotNull);
@@ -440,7 +429,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     FieldDeclaration field = member;
     expect(field.covariantKeyword, isNotNull);
     expect(field.documentationComment, isNull);
@@ -459,7 +448,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     FieldDeclaration field = member;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
@@ -489,9 +478,9 @@
 ''');
     ClassMember member = parser.parseClassMember('C');
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     VariableDeclarationList fields = (member as FieldDeclaration).fields;
-    expect(fields.type, new TypeMatcher<GenericFunctionType>());
+    expect(fields.type, isGenericFunctionType);
   }
 
   void test_parseClassMember_field_gftType_noReturnType() {
@@ -500,9 +489,9 @@
 ''');
     ClassMember member = parser.parseClassMember('C');
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     VariableDeclarationList fields = (member as FieldDeclaration).fields;
-    expect(fields.type, new TypeMatcher<GenericFunctionType>());
+    expect(fields.type, isGenericFunctionType);
   }
 
   void test_parseClassMember_field_instance_prefixedType() {
@@ -510,7 +499,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     FieldDeclaration field = member;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
@@ -530,7 +519,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     FieldDeclaration field = member;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
@@ -549,7 +538,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     FieldDeclaration field = member;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
@@ -568,7 +557,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     FieldDeclaration field = member;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
@@ -588,7 +577,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     FieldDeclaration field = member;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
@@ -639,7 +628,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FieldDeclaration>());
+    expect(member, isFieldDeclaration);
     FieldDeclaration field = member;
     expect(field.covariantKeyword, isNull);
     expect(field.documentationComment, isNull);
@@ -658,7 +647,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -676,7 +665,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -695,7 +684,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNotNull);
@@ -719,7 +708,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.body, isNotNull);
     expect(method.documentationComment, isNull);
@@ -738,7 +727,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -757,7 +746,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -783,7 +772,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -802,7 +791,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -825,7 +814,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -855,7 +844,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -875,7 +864,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -894,7 +883,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -913,7 +902,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -932,7 +921,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -951,7 +940,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -971,9 +960,8 @@
 ''');
     ClassMember member = parser.parseClassMember('C');
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
-    expect((member as MethodDeclaration).body,
-        new TypeMatcher<ExpressionFunctionBody>());
+    expect(member, isMethodDeclaration);
+    expect((member as MethodDeclaration).body, isExpressionFunctionBody);
   }
 
   void test_parseClassMember_method_gftReturnType_voidReturnType() {
@@ -982,9 +970,8 @@
 ''');
     ClassMember member = parser.parseClassMember('C');
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
-    expect((member as MethodDeclaration).body,
-        new TypeMatcher<ExpressionFunctionBody>());
+    expect(member, isMethodDeclaration);
+    expect((member as MethodDeclaration).body, isExpressionFunctionBody);
   }
 
   void test_parseClassMember_method_native_allowed() {
@@ -1066,7 +1053,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1085,7 +1072,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1104,7 +1091,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1123,7 +1110,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1143,7 +1130,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1162,7 +1149,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1181,7 +1168,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1200,7 +1187,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1219,7 +1206,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1272,7 +1259,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1291,21 +1278,21 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
     expect(method.propertyKeyword, isNull);
-    expect(method.returnType, new TypeMatcher<GenericFunctionType>());
+    expect(method.returnType, isGenericFunctionType);
     expect(method.name, isNotNull);
     expect(method.operatorKeyword, isNotNull);
     expect(method.typeParameters, isNull);
     expect(method.parameters, isNotNull);
     NodeList<FormalParameter> parameters = method.parameters.parameters;
     expect(parameters, hasLength(1));
-    expect((parameters[0] as SimpleFormalParameter).type,
-        new TypeMatcher<GenericFunctionType>());
+    expect(
+        (parameters[0] as SimpleFormalParameter).type, isGenericFunctionType);
     expect(method.body, isNotNull);
   }
 
@@ -1314,7 +1301,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1333,7 +1320,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1352,7 +1339,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.documentationComment, isNull);
     expect(method.externalKeyword, isNull);
@@ -1386,7 +1373,7 @@
     expect(constructor.redirectedConstructor.type.name.name, 'prefix.B');
     expect(constructor.redirectedConstructor.period.type, TokenType.PERIOD);
     expect(constructor.redirectedConstructor.name.name, 'foo');
-    expect(constructor.body, new TypeMatcher<EmptyFunctionBody>());
+    expect(constructor.body, isEmptyFunctionBody);
   }
 
   void test_parseClassMember_redirectingFactory_expressionBody() {
@@ -1419,7 +1406,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ConstructorDeclaration>());
+    expect(member, isConstructorDeclaration);
     ConstructorDeclaration constructor = member;
     expect(constructor.externalKeyword, isNull);
     expect(constructor.constKeyword, isNull);
@@ -1436,7 +1423,7 @@
     expect(constructor.redirectedConstructor.type.name.name, 'B');
     expect(constructor.redirectedConstructor.period, isNull);
     expect(constructor.redirectedConstructor.name, isNull);
-    expect(constructor.body, new TypeMatcher<EmptyFunctionBody>());
+    expect(constructor.body, isEmptyFunctionBody);
   }
 
   void test_parseConstructor_assert() {
@@ -1444,12 +1431,12 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ConstructorDeclaration>());
+    expect(member, isConstructorDeclaration);
     ConstructorDeclaration constructor = member as ConstructorDeclaration;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
     expect(initializers, hasLength(3));
     ConstructorInitializer initializer = initializers[1];
-    expect(initializer, new TypeMatcher<AssertInitializer>());
+    expect(initializer, isAssertInitializer);
     AssertInitializer assertInitializer = initializer;
     expect(assertInitializer.condition, isNotNull);
     expect(assertInitializer.message, isNull);
@@ -1483,7 +1470,7 @@
     expect(constructor.separator, isNull);
     expect(constructor.initializers, isEmpty);
     expect(constructor.redirectedConstructor, isNull);
-    expect(constructor.body, new TypeMatcher<ExpressionFunctionBody>());
+    expect(constructor.body, isExpressionFunctionBody);
   }
 
   void test_parseConstructor_initializers_field() {
@@ -1491,7 +1478,7 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ConstructorDeclaration>());
+    expect(member, isConstructorDeclaration);
     ConstructorDeclaration constructor = member as ConstructorDeclaration;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
     expect(initializers, hasLength(2));
@@ -1531,7 +1518,7 @@
     expect(constructor.separator, isNull);
     expect(constructor.initializers, isEmpty);
     expect(constructor.redirectedConstructor, isNull);
-    expect(constructor.body, new TypeMatcher<EmptyFunctionBody>());
+    expect(constructor.body, isEmptyFunctionBody);
   }
 
   void test_parseConstructor_unnamed() {
@@ -1551,7 +1538,7 @@
     expect(constructor.separator, isNull);
     expect(constructor.initializers, isEmpty);
     expect(constructor.redirectedConstructor, isNull);
-    expect(constructor.body, new TypeMatcher<EmptyFunctionBody>());
+    expect(constructor.body, isEmptyFunctionBody);
   }
 
   void test_parseConstructor_with_pseudo_function_literal() {
@@ -1561,19 +1548,15 @@
     ClassMember member = parser.parseClassMember('C');
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ConstructorDeclaration>());
+    expect(member, isConstructorDeclaration);
     ConstructorDeclaration constructor = member as ConstructorDeclaration;
     NodeList<ConstructorInitializer> initializers = constructor.initializers;
     expect(initializers, hasLength(1));
     ConstructorInitializer initializer = initializers[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is ConstructorFieldInitializer,
-        ConstructorFieldInitializer, initializer);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ParenthesizedExpression,
-        ParenthesizedExpression,
-        (initializer as ConstructorFieldInitializer).expression);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is BlockFunctionBody, BlockFunctionBody, constructor.body);
+    expect(initializer, isConstructorFieldInitializer);
+    expect((initializer as ConstructorFieldInitializer).expression,
+        isParenthesizedExpression);
+    expect(constructor.body, isBlockFunctionBody);
   }
 
   void test_parseConstructorFieldInitializer_qualified() {
@@ -1771,43 +1754,36 @@
  *
  * Simpler tests should be defined in the class [SimpleParserTest].
  */
-abstract class ComplexParserTestMixin implements AbstractParserTestCase {
+mixin ComplexParserTestMixin implements AbstractParserTestCase {
   void test_additiveExpression_normal() {
     BinaryExpression expression = parseExpression("x + y - z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_noSpaces() {
     BinaryExpression expression = parseExpression("i+1");
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
-    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral,
-        IntegerLiteral, expression.rightOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
+    expect(expression.rightOperand, isIntegerLiteral);
   }
 
   void test_additiveExpression_precedence_multiplicative_left() {
     BinaryExpression expression = parseExpression("x * y + z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_precedence_multiplicative_left_withSuper() {
     BinaryExpression expression = parseExpression("super * y - z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_precedence_multiplicative_right() {
     BinaryExpression expression = parseExpression("x + y * z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_super() {
     BinaryExpression expression = parseExpression("super + y - z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_assignableExpression_arguments_normal_chain() {
@@ -1816,10 +1792,7 @@
     //
     // a(b)(c).d(e)
     //
-    MethodInvocation invocation2 = EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodInvocation,
-        MethodInvocation,
-        propertyAccess1.target);
+    MethodInvocation invocation2 = propertyAccess1.target;
     expect(invocation2.methodName.name, "d");
     expect(invocation2.typeArguments, isNull);
     ArgumentList argumentList2 = invocation2.argumentList;
@@ -1828,10 +1801,7 @@
     //
     // a(b)(c)
     //
-    FunctionExpressionInvocation invocation3 = EngineTestCase.assertInstanceOf(
-        (obj) => obj is FunctionExpressionInvocation,
-        FunctionExpressionInvocation,
-        invocation2.target);
+    FunctionExpressionInvocation invocation3 = invocation2.target;
     expect(invocation3.typeArguments, isNull);
     ArgumentList argumentList3 = invocation3.argumentList;
     expect(argumentList3, isNotNull);
@@ -1839,10 +1809,7 @@
     //
     // a(b)
     //
-    MethodInvocation invocation4 = EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodInvocation,
-        MethodInvocation,
-        invocation3.function);
+    MethodInvocation invocation4 = invocation3.function;
     expect(invocation4.methodName.name, "a");
     expect(invocation4.typeArguments, isNull);
     ArgumentList argumentList4 = invocation4.argumentList;
@@ -1857,106 +1824,86 @@
 
   void test_assignmentExpression_compound() {
     AssignmentExpression expression = parseExpression("x = y = 0");
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftHandSide);
-    EngineTestCase.assertInstanceOf((obj) => obj is AssignmentExpression,
-        AssignmentExpression, expression.rightHandSide);
+    expect(expression.leftHandSide, isSimpleIdentifier);
+    expect(expression.rightHandSide, isAssignmentExpression);
   }
 
   void test_assignmentExpression_indexExpression() {
     AssignmentExpression expression = parseExpression("x[1] = 0");
-    EngineTestCase.assertInstanceOf((obj) => obj is IndexExpression,
-        IndexExpression, expression.leftHandSide);
-    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral,
-        IntegerLiteral, expression.rightHandSide);
+    expect(expression.leftHandSide, isIndexExpression);
+    expect(expression.rightHandSide, isIntegerLiteral);
   }
 
   void test_assignmentExpression_prefixedIdentifier() {
     AssignmentExpression expression = parseExpression("x.y = 0");
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixedIdentifier,
-        PrefixedIdentifier, expression.leftHandSide);
-    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral,
-        IntegerLiteral, expression.rightHandSide);
+    expect(expression.leftHandSide, isPrefixedIdentifier);
+    expect(expression.rightHandSide, isIntegerLiteral);
   }
 
   void test_assignmentExpression_propertyAccess() {
     AssignmentExpression expression = parseExpression("super.y = 0");
-    EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccess,
-        PropertyAccess, expression.leftHandSide);
-    EngineTestCase.assertInstanceOf((obj) => obj is IntegerLiteral,
-        IntegerLiteral, expression.rightHandSide);
+    expect(expression.leftHandSide, isPropertyAccess);
+    expect(expression.rightHandSide, isIntegerLiteral);
   }
 
   void test_bitwiseAndExpression_normal() {
     BinaryExpression expression = parseExpression("x & y & z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_precedence_equality_left() {
     BinaryExpression expression = parseExpression("x == y && z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_precedence_equality_right() {
     BinaryExpression expression = parseExpression("x && y == z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_super() {
     BinaryExpression expression = parseExpression("super & y & z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_normal() {
     BinaryExpression expression = parseExpression("x | y | z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_precedence_xor_left() {
     BinaryExpression expression = parseExpression("x ^ y | z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_precedence_xor_right() {
     BinaryExpression expression = parseExpression("x | y ^ z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_super() {
     BinaryExpression expression = parseExpression("super | y | z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_normal() {
     BinaryExpression expression = parseExpression("x ^ y ^ z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_precedence_and_left() {
     BinaryExpression expression = parseExpression("x & y ^ z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_precedence_and_right() {
     BinaryExpression expression = parseExpression("x ^ y & z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_super() {
     BinaryExpression expression = parseExpression("super ^ y ^ z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_cascade_withAssignment() {
@@ -1964,11 +1911,9 @@
         parseExpression("new Map()..[3] = 4 ..[0] = 11");
     Expression target = cascade.target;
     for (Expression section in cascade.cascadeSections) {
-      EngineTestCase.assertInstanceOf(
-          (obj) => obj is AssignmentExpression, AssignmentExpression, section);
+      expect(section, isAssignmentExpression);
       Expression lhs = (section as AssignmentExpression).leftHandSide;
-      EngineTestCase.assertInstanceOf(
-          (obj) => obj is IndexExpression, IndexExpression, lhs);
+      expect(lhs, isIndexExpression);
       IndexExpression index = lhs as IndexExpression;
       expect(index.isCascaded, isTrue);
       expect(index.realTarget, same(target));
@@ -1977,39 +1922,110 @@
 
   void test_conditionalExpression_precedence_ifNullExpression() {
     ConditionalExpression expression = parseExpression('a ?? b ? y : z');
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.condition);
+    expect(expression.condition, isBinaryExpression);
   }
 
   void test_conditionalExpression_precedence_logicalOrExpression() {
     ConditionalExpression expression = parseExpression("a | b ? y : z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.condition);
+    expect(expression.condition, isBinaryExpression);
   }
 
-  void test_conditionalExpression_precedence_nullableType_as() {
-    Expression expression = parseExpression('x as String ? (x + y) : z');
-    expect(expression, isNotNull);
-    expect(expression, new TypeMatcher<ConditionalExpression>());
-    ConditionalExpression conditional = expression;
-    Expression condition = conditional.condition;
-    expect(condition, new TypeMatcher<AsExpression>());
-    Expression thenExpression = conditional.thenExpression;
+  void test_conditionalExpression_precedence_withAssignment() {
+    ExpressionStatement statement = parseStatement('b ? c = true : g();');
+    ConditionalExpression expression = statement.expression;
+    expect(expression.condition, new TypeMatcher<SimpleIdentifier>());
+    expect(expression.thenExpression, new TypeMatcher<AssignmentExpression>());
+  }
+
+  void test_conditionalExpression_precedence_withAssignment2() {
+    ExpressionStatement statement = parseStatement('b.x ? c = true : g();');
+    ConditionalExpression expression = statement.expression;
+    expect(expression.condition, new TypeMatcher<PrefixedIdentifier>());
+    expect(expression.thenExpression, new TypeMatcher<AssignmentExpression>());
+  }
+
+  void test_conditionalExpression_prefixedValue() {
+    ExpressionStatement statement = parseStatement('a.b ? y : z;');
+    ConditionalExpression expression = statement.expression;
+    expect(expression.condition, new TypeMatcher<PrefixedIdentifier>());
+    expect(expression.thenExpression, new TypeMatcher<SimpleIdentifier>());
+  }
+
+  void test_conditionalExpression_prefixedValue2() {
+    ExpressionStatement statement = parseStatement('a.b ? x.y : z;');
+    ConditionalExpression expression = statement.expression;
+    expect(expression.condition, new TypeMatcher<PrefixedIdentifier>());
+    expect(expression.thenExpression, new TypeMatcher<PrefixedIdentifier>());
+  }
+
+  void test_conditionalExpression_precedence_prefixedNullableType_is() {
+    ExpressionStatement statement = parseStatement('x is p.A ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+
+    Expression condition = expression.condition;
+    expect(condition, new TypeMatcher<IsExpression>());
+    Expression thenExpression = expression.thenExpression;
     expect(thenExpression, new TypeMatcher<ParenthesizedExpression>());
-    Expression elseExpression = conditional.elseExpression;
+    Expression elseExpression = expression.elseExpression;
     expect(elseExpression, new TypeMatcher<SimpleIdentifier>());
   }
 
+  void test_conditionalExpression_precedence_nullableType_as() {
+    ExpressionStatement statement = parseStatement('x as bool ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    Expression condition = expression.condition;
+    expect(condition, isAsExpression);
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, isParenthesizedExpression);
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, isSimpleIdentifier);
+  }
+
   void test_conditionalExpression_precedence_nullableType_is() {
-    Expression expression = parseExpression('x is String ? (x + y) : z');
-    expect(expression, isNotNull);
-    expect(expression, new TypeMatcher<ConditionalExpression>());
-    ConditionalExpression conditional = expression;
-    Expression condition = conditional.condition;
+    ExpressionStatement statement =
+        parseStatement('x is String ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    Expression condition = expression.condition;
+    expect(condition, isIsExpression);
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, isParenthesizedExpression);
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, isSimpleIdentifier);
+  }
+
+  void test_conditionalExpression_precedence_nullableTypeWithTypeArg1_is() {
+    ExpressionStatement statement =
+        parseStatement('x is String<S> ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    Expression condition = expression.condition;
     expect(condition, new TypeMatcher<IsExpression>());
-    Expression thenExpression = conditional.thenExpression;
+    Expression thenExpression = expression.thenExpression;
     expect(thenExpression, new TypeMatcher<ParenthesizedExpression>());
-    Expression elseExpression = conditional.elseExpression;
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, new TypeMatcher<SimpleIdentifier>());
+  }
+
+  void test_conditionalExpression_precedence_nullableTypeWithTypeArg1GFT_is() {
+    ExpressionStatement statement =
+        parseStatement('x is String<S> Function() ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    Expression condition = expression.condition;
+    expect(condition, new TypeMatcher<IsExpression>());
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, new TypeMatcher<ParenthesizedExpression>());
+    Expression elseExpression = expression.elseExpression;
+    expect(elseExpression, new TypeMatcher<SimpleIdentifier>());
+  }
+
+  void test_conditionalExpression_precedence_nullableTypeWithTypeArg2_is() {
+    ExpressionStatement statement =
+        parseStatement('x is String<S,T> ? (x + y) : z;');
+    ConditionalExpression expression = statement.expression;
+    Expression condition = expression.condition;
+    expect(condition, new TypeMatcher<IsExpression>());
+    Expression thenExpression = expression.thenExpression;
+    expect(thenExpression, new TypeMatcher<ParenthesizedExpression>());
+    Expression elseExpression = expression.elseExpression;
     expect(elseExpression, new TypeMatcher<SimpleIdentifier>());
   }
 
@@ -2027,83 +2043,75 @@
   void test_equalityExpression_normal() {
     BinaryExpression expression = parseExpression("x == y != z",
         codes: [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_equalityExpression_precedence_relational_left() {
     BinaryExpression expression = parseExpression("x is y == z");
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is IsExpression, IsExpression, expression.leftOperand);
+    expect(expression.leftOperand, isIsExpression);
   }
 
   void test_equalityExpression_precedence_relational_right() {
     BinaryExpression expression = parseExpression("x == y is z");
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is IsExpression, IsExpression, expression.rightOperand);
+    expect(expression.rightOperand, isIsExpression);
   }
 
   void test_equalityExpression_super() {
     BinaryExpression expression = parseExpression("super == y != z",
         codes: [ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_ifNullExpression() {
     BinaryExpression expression = parseExpression('x ?? y ?? z');
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_ifNullExpression_precedence_logicalOr_left() {
     BinaryExpression expression = parseExpression('x || y ?? z');
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_ifNullExpression_precedence_logicalOr_right() {
     BinaryExpression expression = parseExpression('x ?? y || z');
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpression() {
     BinaryExpression expression = parseExpression("x && y && z");
-    expect(expression.leftOperand, new TypeMatcher<BinaryExpression>());
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpression_precedence_bitwiseOr_left() {
     BinaryExpression expression = parseExpression("x | y < z");
-    expect(expression.leftOperand, new TypeMatcher<BinaryExpression>());
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpression_precedence_bitwiseOr_right() {
     BinaryExpression expression = parseExpression("x < y | z");
-    expect(expression.rightOperand, new TypeMatcher<BinaryExpression>());
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpressionStatement() {
     // Assert that `<` and `>` are not interpreted as type arguments.
     ExpressionStatement statement = parseStatement("C<T && T>U;");
     BinaryExpression expression = statement.expression;
-    expect(expression.leftOperand, new TypeMatcher<BinaryExpression>());
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression() {
     BinaryExpression expression = parseExpression("x || y || z");
-    expect(expression.leftOperand, new TypeMatcher<BinaryExpression>());
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression_precedence_logicalAnd_left() {
     BinaryExpression expression = parseExpression("x && y || z");
-    expect(expression.leftOperand, new TypeMatcher<BinaryExpression>());
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression_precedence_logicalAnd_right() {
     BinaryExpression expression = parseExpression("x || y && z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_methodInvocation1() {
@@ -2133,62 +2141,52 @@
   void test_multipleLabels_statement() {
     LabeledStatement statement = parseStatement("a: b: c: return x;");
     expect(statement.labels, hasLength(3));
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ReturnStatement, ReturnStatement, statement.statement);
+    expect(statement.statement, isReturnStatement);
   }
 
   void test_multiplicativeExpression_normal() {
     BinaryExpression expression = parseExpression("x * y / z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_multiplicativeExpression_precedence_unary_left() {
     BinaryExpression expression = parseExpression("-x * y");
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
-        PrefixExpression, expression.leftOperand);
+    expect(expression.leftOperand, isPrefixExpression);
   }
 
   void test_multiplicativeExpression_precedence_unary_right() {
     BinaryExpression expression = parseExpression("x * -y");
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
-        PrefixExpression, expression.rightOperand);
+    expect(expression.rightOperand, isPrefixExpression);
   }
 
   void test_multiplicativeExpression_super() {
     BinaryExpression expression = parseExpression("super * y / z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_relationalExpression_precedence_shift_right() {
     IsExpression expression = parseExpression("x << y is z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.expression);
+    expect(expression.expression, isBinaryExpression);
   }
 
   void test_shiftExpression_normal() {
     BinaryExpression expression = parseExpression("x >> 4 << 3");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_precedence_additive_left() {
     BinaryExpression expression = parseExpression("x + y << z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_precedence_additive_right() {
     BinaryExpression expression = parseExpression("x << y + z");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_super() {
     BinaryExpression expression = parseExpression("super >> 4 << 3");
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_topLevelFunction_nestedGenericFunction() {
@@ -2208,10 +2206,7 @@
     //
     // a<E>(b)<F>(c).d<G>(e)
     //
-    MethodInvocation invocation2 = EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodInvocation,
-        MethodInvocation,
-        propertyAccess1.target);
+    MethodInvocation invocation2 = propertyAccess1.target;
     expect(invocation2.methodName.name, "d");
     expect(invocation2.typeArguments, isNotNull);
     ArgumentList argumentList2 = invocation2.argumentList;
@@ -2220,10 +2215,7 @@
     //
     // a<E>(b)<F>(c)
     //
-    FunctionExpressionInvocation invocation3 = EngineTestCase.assertInstanceOf(
-        (obj) => obj is FunctionExpressionInvocation,
-        FunctionExpressionInvocation,
-        invocation2.target);
+    FunctionExpressionInvocation invocation3 = invocation2.target;
     expect(invocation3.typeArguments, isNotNull);
     ArgumentList argumentList3 = invocation3.argumentList;
     expect(argumentList3, isNotNull);
@@ -2231,10 +2223,7 @@
     //
     // a(b)
     //
-    MethodInvocation invocation4 = EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodInvocation,
-        MethodInvocation,
-        invocation3.function);
+    MethodInvocation invocation4 = invocation3.function;
     expect(invocation4.methodName.name, "a");
     expect(invocation4.typeArguments, isNotNull);
     ArgumentList argumentList4 = invocation4.argumentList;
@@ -2260,7 +2249,7 @@
   }
 }
 
-abstract class ErrorParserTestMixin implements AbstractParserTestCase {
+mixin ErrorParserTestMixin implements AbstractParserTestCase {
   void test_abstractClassMember_constructor() {
     createParser('abstract C.c();');
     ClassMember member = parser.parseClassMember('C');
@@ -3212,8 +3201,14 @@
     createParser('external factory C() {}');
     ClassMember member = parser.parseClassMember('C');
     expectNotNullIfNoErrors(member);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, 21, 1)]);
+    listener.assertErrors([
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.EXTERNAL_FACTORY_WITH_BODY
+              : ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY,
+          21,
+          1)
+    ]);
   }
 
   void test_externalConstructorWithBody_named() {
@@ -3884,6 +3879,41 @@
     ]);
   }
 
+  void test_invalidConstructorSuperAssignment() {
+    createParser("C() : super = 42;");
+    ClassMember member = parser.parseClassMember('C');
+    expectNotNullIfNoErrors(member);
+    listener.assertErrors(usingFastaParser
+        ? [expectedError(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR, 6, 5)]
+        : [
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 14, 1),
+            expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 16, 2),
+            expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 16, 2),
+            expectedError(
+                ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR, 16, 0),
+          ]);
+  }
+
+  void test_invalidConstructorSuperFieldAssignment() {
+    createParser("C() : super.a = 42;");
+    ClassMember member = parser.parseClassMember('C');
+    expectNotNullIfNoErrors(member);
+    listener.assertErrors(usingFastaParser
+        ? [
+            expectedError(
+                ParserErrorCode.FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS,
+                12,
+                1)
+          ]
+        : [
+            expectedError(ParserErrorCode.EXPECTED_TOKEN, 14, 1),
+            expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 16, 2),
+            expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 16, 2),
+            expectedError(
+                ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCTOR, 16, 0),
+          ]);
+  }
+
   void test_invalidHexEscape_invalidDigit() {
     StringLiteral literal = parseExpression("'not \\x0 a'",
         errors: [expectedError(ParserErrorCode.INVALID_HEX_ESCAPE, 5, 3)]);
@@ -3963,13 +3993,24 @@
   void test_invalidOperatorAfterSuper_assignableExpression() {
     Expression expression = parseAssignableExpression('super?.v', false);
     expectNotNullIfNoErrors(expression);
-    listener.assertErrors(
-        [expectedError(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, 5, 2)]);
+    listener.assertErrors([
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
+              : ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
+          5,
+          2)
+    ]);
   }
 
   void test_invalidOperatorAfterSuper_primaryExpression() {
     Expression expression = parseExpression('super?.v', errors: [
-      expectedError(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, 5, 2)
+      expectedError(
+          usingFastaParser
+              ? ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
+              : ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
+          5,
+          2)
     ]);
     expectNotNullIfNoErrors(expression);
   }
@@ -4207,7 +4248,7 @@
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 0), // close paren
             expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 0, 0)
           ]);
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(
         method.parameters.toString(), usingFastaParser ? '(E)' : '(E, extends)',
@@ -4227,7 +4268,7 @@
             expectedError(ParserErrorCode.EXPECTED_TOKEN, 0, 0) /*)*/,
             expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 0, 0)
           ]);
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.typeParameters.toString(), '<E, hello>',
         reason: 'parser recovers what it can');
@@ -4261,7 +4302,7 @@
     BlockFunctionBody blockBody = declaration.functionExpression.body;
     ExpressionStatement statement = (blockBody).block.statements.first;
     Expression expression = (statement).expression;
-    expect(expression, new TypeMatcher<SuperExpression>());
+    expect(expression, isSuperExpression);
     SuperExpression superExpression = expression;
     expect(superExpression.superKeyword, isNotNull);
   }
@@ -4531,7 +4572,7 @@
       expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS,
           usingFastaParser ? 5 : 7, 1)
     ]);
-    expect(member, new TypeMatcher<MethodDeclaration>());
+    expect(member, isMethodDeclaration);
     MethodDeclaration method = member;
     expect(method.parameters, hasLength(0));
   }
@@ -4788,14 +4829,14 @@
       expression = parser.parsePrimaryExpression();
       listener.assertErrors(
           [expectedError(ParserErrorCode.NAMED_FUNCTION_EXPRESSION, 0, 1)]);
-      expect(expression, new TypeMatcher<FunctionExpression>());
+      expect(expression, isFunctionExpression);
     } else {
       expression = parsePrimaryExpression('f() {}');
       expectNotNullIfNoErrors(expression);
       // Should generate an error.
       //listener.assertErrors(
       //    [expectedError(ParserErrorCode.NAMED_FUNCTION_EXPRESSION, 0, 1)]);
-      //expect(expression, new TypeMatcher<FunctionExpression>());
+      //expect(expression, isFunctionExpression);
     }
   }
 
@@ -5219,7 +5260,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expectNotNullIfNoErrors(member);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration function = member;
     expect(function.functionExpression.parameters, isNull);
   }
@@ -5692,7 +5733,7 @@
 class ExpressionParserTest extends ParserTestCase
     with ExpressionParserTestMixin {}
 
-abstract class ExpressionParserTestMixin implements AbstractParserTestCase {
+mixin ExpressionParserTestMixin implements AbstractParserTestCase {
   void test_namedArgument() {
     var invocation = parseExpression('m(a: 1, b: 2)') as MethodInvocation;
     List<Expression> arguments = invocation.argumentList.arguments;
@@ -5722,7 +5763,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var binaryExpression = expression as BinaryExpression;
-    expect(binaryExpression.leftOperand, new TypeMatcher<SuperExpression>());
+    expect(binaryExpression.leftOperand, isSuperExpression);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.PLUS);
     expect(binaryExpression.rightOperand, isNotNull);
@@ -5866,8 +5907,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var propertyAccess = expression as PropertyAccess;
-    EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
-        SuperExpression, propertyAccess.target);
+    expect(propertyAccess.target, isSuperExpression);
     expect(propertyAccess.operator, isNotNull);
     expect(propertyAccess.propertyName, isNotNull);
   }
@@ -5877,7 +5917,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var indexExpression = expression as IndexExpression;
-    expect(indexExpression.target, new TypeMatcher<SuperExpression>());
+    expect(indexExpression.target, isSuperExpression);
     expect(indexExpression.leftBracket, isNotNull);
     expect(indexExpression.index, isNotNull);
     expect(indexExpression.rightBracket, isNotNull);
@@ -5943,7 +5983,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var binaryExpression = expression as BinaryExpression;
-    expect(binaryExpression.leftOperand, new TypeMatcher<SuperExpression>());
+    expect(binaryExpression.leftOperand, isSuperExpression);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.AMPERSAND);
     expect(binaryExpression.rightOperand, isNotNull);
@@ -5965,7 +6005,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var binaryExpression = expression as BinaryExpression;
-    expect(binaryExpression.leftOperand, new TypeMatcher<SuperExpression>());
+    expect(binaryExpression.leftOperand, isSuperExpression);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.BAR);
     expect(binaryExpression.rightOperand, isNotNull);
@@ -5987,7 +6027,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var binaryExpression = expression as BinaryExpression;
-    expect(binaryExpression.leftOperand, new TypeMatcher<SuperExpression>());
+    expect(binaryExpression.leftOperand, isSuperExpression);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.CARET);
     expect(binaryExpression.rightOperand, isNotNull);
@@ -6009,7 +6049,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var section = expression as FunctionExpressionInvocation;
-    expect(section.function, new TypeMatcher<IndexExpression>());
+    expect(section.function, isIndexExpression);
     expect(section.typeArguments, isNull);
     expect(section.argumentList, isNotNull);
   }
@@ -6019,7 +6059,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var section = expression as FunctionExpressionInvocation;
-    expect(section.function, new TypeMatcher<IndexExpression>());
+    expect(section.function, isIndexExpression);
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
   }
@@ -6029,7 +6069,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var section = expression as MethodInvocation;
-    expect(section.target, new TypeMatcher<MethodInvocation>());
+    expect(section.target, isMethodInvocation);
     expect(section.operator, isNotNull);
     expect(section.methodName, isNotNull);
     expect(section.typeArguments, isNull);
@@ -6042,7 +6082,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var section = expression as MethodInvocation;
-    expect(section.target, new TypeMatcher<MethodInvocation>());
+    expect(section.target, isMethodInvocation);
     expect(section.operator, isNotNull);
     expect(section.methodName, isNotNull);
     expect(section.typeArguments, isNotNull);
@@ -6079,8 +6119,7 @@
     expect(section.leftHandSide, isNotNull);
     expect(section.operator, isNotNull);
     Expression rhs = section.rightHandSide;
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
+    expect(rhs, isIntegerLiteral);
   }
 
   void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
@@ -6091,8 +6130,7 @@
     expect(section.leftHandSide, isNotNull);
     expect(section.operator, isNotNull);
     Expression rhs = section.rightHandSide;
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is IntegerLiteral, IntegerLiteral, rhs);
+    expect(rhs, isIntegerLiteral);
   }
 
   void test_parseCascadeSection_p_builtIn() {
@@ -6136,7 +6174,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var section = expression as FunctionExpressionInvocation;
-    expect(section.function, new TypeMatcher<MethodInvocation>());
+    expect(section.function, isMethodInvocation);
     expect(section.typeArguments, isNull);
     expect(section.argumentList, isNotNull);
     expect(section.argumentList.arguments, hasLength(1));
@@ -6147,7 +6185,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var section = expression as FunctionExpressionInvocation;
-    expect(section.function, new TypeMatcher<MethodInvocation>());
+    expect(section.function, isMethodInvocation);
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
     expect(section.argumentList.arguments, hasLength(1));
@@ -6158,7 +6196,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var section = expression as FunctionExpressionInvocation;
-    expect(section.function, new TypeMatcher<MethodInvocation>());
+    expect(section.function, isMethodInvocation);
     expect(section.typeArguments, isNull);
     expect(section.argumentList, isNotNull);
     expect(section.argumentList.arguments, hasLength(1));
@@ -6170,7 +6208,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var section = expression as FunctionExpressionInvocation;
-    expect(section.function, new TypeMatcher<MethodInvocation>());
+    expect(section.function, isMethodInvocation);
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
     expect(section.argumentList.arguments, hasLength(1));
@@ -6211,7 +6249,7 @@
     Expression expression = parseConstExpression('const A()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new TypeMatcher<InstanceCreationExpression>());
+    expect(expression, isInstanceCreationExpression);
     InstanceCreationExpression instanceCreation = expression;
     expect(instanceCreation.keyword, isNotNull);
     ConstructorName name = instanceCreation.constructorName;
@@ -6293,7 +6331,7 @@
     BinaryExpression expression = parseEqualityExpression('super == y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.leftOperand, new TypeMatcher<SuperExpression>());
+    expect(expression.leftOperand, isSuperExpression);
     expect(expression.operator, isNotNull);
     expect(expression.operator.type, TokenType.EQ_EQ);
     expect(expression.rightOperand, isNotNull);
@@ -6380,7 +6418,7 @@
   void test_parseExpression_invokeFunctionExpression() {
     Expression expression = parseExpression('(a) {return a + a;} (3)');
     var invocation = expression as FunctionExpressionInvocation;
-    expect(invocation.function, new TypeMatcher<FunctionExpression>());
+    expect(invocation.function, isFunctionExpression);
     FunctionExpression functionExpression =
         invocation.function as FunctionExpression;
     expect(functionExpression.parameters, isNotNull);
@@ -6471,7 +6509,7 @@
     Expression expression = parseExpression('super.b.c<D>()');
     MethodInvocation invocation = expression as MethodInvocation;
     Expression target = invocation.target;
-    expect(target, new TypeMatcher<PropertyAccess>());
+    expect(target, isPropertyAccess);
     expect(invocation.methodName, isNotNull);
     expect(invocation.methodName.name, 'c');
     expect(invocation.typeArguments, isNotNull);
@@ -6919,6 +6957,15 @@
     expect(literal.rightBracket, isNotNull);
   }
 
+  void test_parseMapLiteral_multiple_trailing_comma() {
+    MapLiteral literal = parseMapLiteral(null, null, "{'a' : b, 'x' : y,}");
+    expect(literal, isNotNull);
+    assertNoErrors();
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.entries, hasLength(2));
+    expect(literal.rightBracket, isNotNull);
+  }
+
   void test_parseMapLiteral_single() {
     MapLiteral literal = parseMapLiteral(null, null, "{'x' : y}");
     expect(literal, isNotNull);
@@ -6971,7 +7018,7 @@
     expect(expression, isNotNull);
     assertNoErrors();
     var binaryExpression = expression as BinaryExpression;
-    expect(binaryExpression.leftOperand, new TypeMatcher<SuperExpression>());
+    expect(binaryExpression.leftOperand, isSuperExpression);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.STAR);
     expect(binaryExpression.rightOperand, isNotNull);
@@ -7234,7 +7281,7 @@
     Expression expression = parsePrimaryExpression('null');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new TypeMatcher<NullLiteral>());
+    expect(expression, isNullLiteral);
     NullLiteral literal = expression;
     expect(literal.literal, isNotNull);
   }
@@ -7345,7 +7392,7 @@
     var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
-    expect(asExpression.type, new TypeMatcher<GenericFunctionType>());
+    expect(asExpression.type, isGenericFunctionType);
   }
 
   void test_parseRelationalExpression_as_functionType_returnType() {
@@ -7356,7 +7403,7 @@
     var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
-    expect(asExpression.type, new TypeMatcher<GenericFunctionType>());
+    expect(asExpression.type, isGenericFunctionType);
   }
 
   void test_parseRelationalExpression_as_generic() {
@@ -7366,7 +7413,7 @@
     var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
-    expect(asExpression.type, new TypeMatcher<TypeName>());
+    expect(asExpression.type, isTypeName);
   }
 
   void test_parseRelationalExpression_as_simple() {
@@ -7376,7 +7423,7 @@
     var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
-    expect(asExpression.type, new TypeMatcher<TypeName>());
+    expect(asExpression.type, isTypeName);
   }
 
   void test_parseRelationalExpression_as_simple_function() {
@@ -7386,7 +7433,7 @@
     var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
-    expect(asExpression.type, new TypeMatcher<TypeName>());
+    expect(asExpression.type, isTypeName);
   }
 
   void test_parseRelationalExpression_is() {
@@ -7514,16 +7561,15 @@
     assertNoErrors();
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
-    expect(interpolation.elements[0], new TypeMatcher<InterpolationString>());
+    expect(interpolation.elements[0], isInterpolationString);
     InterpolationString element0 = interpolation.elements[0];
     expect(element0.value, 'x');
-    expect(
-        interpolation.elements[1], new TypeMatcher<InterpolationExpression>());
+    expect(interpolation.elements[1], isInterpolationExpression);
     InterpolationExpression element1 = interpolation.elements[1];
     expect(element1.leftBracket.lexeme, '\$');
-    expect(element1.expression, new TypeMatcher<SimpleIdentifier>());
+    expect(element1.expression, isSimpleIdentifier);
     expect(element1.rightBracket, isNull);
-    expect(interpolation.elements[2], new TypeMatcher<InterpolationString>());
+    expect(interpolation.elements[2], isInterpolationString);
     InterpolationString element2 = interpolation.elements[2];
     expect(element2.value, '');
   }
@@ -7532,7 +7578,7 @@
     Expression expression = parseStringLiteral("'a \${b} c \$this d'");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new TypeMatcher<StringInterpolation>());
+    expect(expression, isStringInterpolation);
     StringInterpolation literal = expression;
     NodeList<InterpolationElement> elements = literal.elements;
     expect(elements, hasLength(5));
@@ -7562,14 +7608,13 @@
     assertNoErrors();
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
-    expect(interpolation.elements[0], new TypeMatcher<InterpolationString>());
+    expect(interpolation.elements[0], isInterpolationString);
     InterpolationString element0 = interpolation.elements[0];
     expect(element0.value, 'x');
-    expect(
-        interpolation.elements[1], new TypeMatcher<InterpolationExpression>());
+    expect(interpolation.elements[1], isInterpolationExpression);
     InterpolationExpression element1 = interpolation.elements[1];
-    expect(element1.expression, new TypeMatcher<SimpleIdentifier>());
-    expect(interpolation.elements[2], new TypeMatcher<InterpolationString>());
+    expect(element1.expression, isSimpleIdentifier);
+    expect(interpolation.elements[2], isInterpolationString);
     InterpolationString element2 = interpolation.elements[2];
     expect(element2.value, '');
   }
@@ -7652,14 +7697,13 @@
     assertNoErrors();
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
-    expect(interpolation.elements[0], new TypeMatcher<InterpolationString>());
+    expect(interpolation.elements[0], isInterpolationString);
     InterpolationString element0 = interpolation.elements[0];
     expect(element0.value, '');
-    expect(
-        interpolation.elements[1], new TypeMatcher<InterpolationExpression>());
+    expect(interpolation.elements[1], isInterpolationExpression);
     InterpolationExpression element1 = interpolation.elements[1];
-    expect(element1.expression, new TypeMatcher<SimpleIdentifier>());
-    expect(interpolation.elements[2], new TypeMatcher<InterpolationString>());
+    expect(element1.expression, isSimpleIdentifier);
+    expect(interpolation.elements[2], isInterpolationString);
     InterpolationString element2 = interpolation.elements[2];
     expect(element2.value, "'y");
   }
@@ -7670,14 +7714,13 @@
     assertNoErrors();
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
-    expect(interpolation.elements[0], new TypeMatcher<InterpolationString>());
+    expect(interpolation.elements[0], isInterpolationString);
     InterpolationString element0 = interpolation.elements[0];
     expect(element0.value, '');
-    expect(
-        interpolation.elements[1], new TypeMatcher<InterpolationExpression>());
+    expect(interpolation.elements[1], isInterpolationExpression);
     InterpolationExpression element1 = interpolation.elements[1];
-    expect(element1.expression, new TypeMatcher<SimpleIdentifier>());
-    expect(interpolation.elements[2], new TypeMatcher<InterpolationString>());
+    expect(element1.expression, isSimpleIdentifier);
+    expect(interpolation.elements[2], isInterpolationString);
     InterpolationString element2 = interpolation.elements[2];
     expect(element2.value, 'y');
   }
@@ -7715,14 +7758,13 @@
     assertNoErrors();
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
-    expect(interpolation.elements[0], new TypeMatcher<InterpolationString>());
+    expect(interpolation.elements[0], isInterpolationString);
     InterpolationString element0 = interpolation.elements[0];
     expect(element0.value, '');
-    expect(
-        interpolation.elements[1], new TypeMatcher<InterpolationExpression>());
+    expect(interpolation.elements[1], isInterpolationExpression);
     InterpolationExpression element1 = interpolation.elements[1];
-    expect(element1.expression, new TypeMatcher<SimpleIdentifier>());
-    expect(interpolation.elements[2], new TypeMatcher<InterpolationString>());
+    expect(element1.expression, isSimpleIdentifier);
+    expect(interpolation.elements[2], isInterpolationString);
     InterpolationString element2 = interpolation.elements[2];
     expect(element2.value, '"');
   }
@@ -7742,14 +7784,13 @@
     assertNoErrors();
     var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
-    expect(interpolation.elements[0], new TypeMatcher<InterpolationString>());
+    expect(interpolation.elements[0], isInterpolationString);
     InterpolationString element0 = interpolation.elements[0];
     expect(element0.value, '');
-    expect(
-        interpolation.elements[1], new TypeMatcher<InterpolationExpression>());
+    expect(interpolation.elements[1], isInterpolationExpression);
     InterpolationExpression element1 = interpolation.elements[1];
-    expect(element1.expression, new TypeMatcher<SimpleIdentifier>());
-    expect(interpolation.elements[2], new TypeMatcher<InterpolationString>());
+    expect(element1.expression, isSimpleIdentifier);
+    expect(interpolation.elements[2], isInterpolationString);
     InterpolationString element2 = interpolation.elements[2];
     expect(element2.value, 'y');
   }
@@ -7998,8 +8039,7 @@
  * The class [FormalParameterParserTestMixin] defines parser tests that test
  * the parsing of formal parameters.
  */
-abstract class FormalParameterParserTestMixin
-    implements AbstractParserTestCase {
+mixin FormalParameterParserTestMixin implements AbstractParserTestCase {
   void test_parseConstructorParameter_this() {
     parseCompilationUnit('''
 class C {
@@ -8030,7 +8070,7 @@
         parseFormalParameter('covariant final a : null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8049,7 +8089,7 @@
     FormalParameter parameter = parseFormalParameter('covariant final a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -8064,7 +8104,7 @@
         parseFormalParameter('covariant final a = null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8084,7 +8124,7 @@
         parseFormalParameter('covariant final A a : null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8104,7 +8144,7 @@
         parseFormalParameter('covariant final A a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -8119,7 +8159,7 @@
         parseFormalParameter('covariant final A a = null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8139,12 +8179,12 @@
         parseFormalParameter('covariant String Function(int) a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.identifier, isNotNull);
     expect(simpleParameter.keyword, isNull);
-    expect(simpleParameter.type, new TypeMatcher<GenericFunctionType>());
+    expect(simpleParameter.type, isGenericFunctionType);
     expect(simpleParameter.isRequired, isTrue);
   }
 
@@ -8154,7 +8194,7 @@
         parseFormalParameter('covariant A a : null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8174,7 +8214,7 @@
         parseFormalParameter('covariant A<B<C>> a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -8189,7 +8229,7 @@
         parseFormalParameter('covariant A a = null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8209,7 +8249,7 @@
         parseFormalParameter('covariant var a : null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8228,7 +8268,7 @@
     FormalParameter parameter = parseFormalParameter('covariant var a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNotNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -8243,7 +8283,7 @@
         parseFormalParameter('covariant var a = null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8262,7 +8302,7 @@
     FormalParameter parameter = parseFormalParameter('final a : null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8281,7 +8321,7 @@
     FormalParameter parameter = parseFormalParameter('final a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -8295,7 +8335,7 @@
     FormalParameter parameter = parseFormalParameter('final a = null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8314,7 +8354,7 @@
     FormalParameter parameter = parseFormalParameter('final A a : null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8333,7 +8373,7 @@
     FormalParameter parameter = parseFormalParameter('final A a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -8347,7 +8387,7 @@
     FormalParameter parameter = parseFormalParameter('final A a = null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8367,12 +8407,12 @@
         parseFormalParameter('String Function(int) a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
     expect(simpleParameter.keyword, isNull);
-    expect(simpleParameter.type, new TypeMatcher<GenericFunctionType>());
+    expect(simpleParameter.type, isGenericFunctionType);
     expect(simpleParameter.isRequired, isTrue);
   }
 
@@ -8381,7 +8421,7 @@
     FormalParameter parameter = parseFormalParameter('A a : null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8400,7 +8440,7 @@
     FormalParameter parameter = parseFormalParameter('A a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8419,7 +8459,7 @@
     FormalParameter parameter = parseFormalParameter('A a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -8433,7 +8473,7 @@
     FormalParameter parameter = parseFormalParameter('A a = null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8452,7 +8492,7 @@
     FormalParameter parameter = parseFormalParameter('A a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8471,7 +8511,7 @@
     FormalParameter parameter = parseFormalParameter('var a : null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8490,7 +8530,7 @@
     FormalParameter parameter = parseFormalParameter('var a', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.identifier, isNotNull);
@@ -8504,7 +8544,7 @@
     FormalParameter parameter = parseFormalParameter('var a = null', kind);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<DefaultFormalParameter>());
+    expect(parameter, isDefaultFormalParameter);
     DefaultFormalParameter defaultParameter = parameter;
     SimpleFormalParameter simpleParameter =
         defaultParameter.parameter as SimpleFormalParameter;
@@ -8597,18 +8637,18 @@
     NodeList<FormalParameter> parameters = list.parameters;
     expect(parameters, hasLength(2));
 
-    expect(parameters[0], new TypeMatcher<SimpleFormalParameter>());
+    expect(parameters[0], isSimpleFormalParameter);
     SimpleFormalParameter required = parameters[0];
     expect(required.identifier, isNull);
-    expect(required.type, new TypeMatcher<TypeName>());
+    expect(required.type, isTypeName);
     expect((required.type as TypeName).name.name, 'A');
 
-    expect(parameters[1], new TypeMatcher<DefaultFormalParameter>());
+    expect(parameters[1], isDefaultFormalParameter);
     DefaultFormalParameter named = parameters[1];
     expect(named.identifier, isNotNull);
-    expect(named.parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(named.parameter, isSimpleFormalParameter);
     SimpleFormalParameter simple = named.parameter;
-    expect(simple.type, new TypeMatcher<TypeName>());
+    expect(simple.type, isTypeName);
     expect((simple.type as TypeName).name.name, 'B');
   }
 
@@ -8772,7 +8812,7 @@
         errorCodes:
             usingFastaParser ? [ParserErrorCode.EXTRANEOUS_MODIFIER] : []);
     expect(parameter, isNotNull);
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
@@ -8786,7 +8826,7 @@
         errorCodes:
             usingFastaParser ? [ParserErrorCode.EXTRANEOUS_MODIFIER] : []);
     expect(parameter, isNotNull);
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNotNull);
@@ -8799,7 +8839,7 @@
         parseNormalFormalParameter('final this.a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
@@ -8812,7 +8852,7 @@
         parseNormalFormalParameter('final A this.a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNotNull);
@@ -8824,7 +8864,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('this.a(B b)');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
@@ -8838,7 +8878,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('this.a()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
@@ -8857,7 +8897,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('this.a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNull);
@@ -8869,7 +8909,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('A this.a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNull);
     expect(fieldParameter.type, isNotNull);
@@ -8881,7 +8921,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('var this.a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FieldFormalParameter>());
+    expect(parameter, isFieldFormalParameter);
     FieldFormalParameter fieldParameter = parameter;
     expect(fieldParameter.keyword, isNotNull);
     expect(fieldParameter.type, isNull);
@@ -8915,7 +8955,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('a()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
+    expect(parameter, isFunctionTypedFormalParameter);
     FunctionTypedFormalParameter functionParameter = parameter;
     expect(functionParameter.returnType, isNull);
     expect(functionParameter.identifier, isNotNull);
@@ -8928,7 +8968,7 @@
         parseNormalFormalParameter('covariant a()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
+    expect(parameter, isFunctionTypedFormalParameter);
     FunctionTypedFormalParameter functionParameter = parameter;
     expect(functionParameter.covariantKeyword, isNotNull);
     expect(functionParameter.returnType, isNull);
@@ -8941,7 +8981,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('a<E>()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
+    expect(parameter, isFunctionTypedFormalParameter);
     FunctionTypedFormalParameter functionParameter = parameter;
     expect(functionParameter.returnType, isNull);
     expect(functionParameter.identifier, isNotNull);
@@ -8953,7 +8993,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('A a()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
+    expect(parameter, isFunctionTypedFormalParameter);
     FunctionTypedFormalParameter functionParameter = parameter;
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
@@ -8965,7 +9005,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('A a<E>()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
+    expect(parameter, isFunctionTypedFormalParameter);
     FunctionTypedFormalParameter functionParameter = parameter;
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
@@ -8978,7 +9018,7 @@
         parseNormalFormalParameter('covariant void a()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
+    expect(parameter, isFunctionTypedFormalParameter);
     FunctionTypedFormalParameter functionParameter = parameter;
     expect(functionParameter.covariantKeyword, isNotNull);
     expect(functionParameter.returnType, isNotNull);
@@ -8991,7 +9031,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('void a()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
+    expect(parameter, isFunctionTypedFormalParameter);
     FunctionTypedFormalParameter functionParameter = parameter;
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
@@ -9003,7 +9043,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('void a<E>()');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<FunctionTypedFormalParameter>());
+    expect(parameter, isFunctionTypedFormalParameter);
     FunctionTypedFormalParameter functionParameter = parameter;
     expect(functionParameter.returnType, isNotNull);
     expect(functionParameter.identifier, isNotNull);
@@ -9022,7 +9062,7 @@
         errorCodes:
             usingFastaParser ? [ParserErrorCode.EXTRANEOUS_MODIFIER] : []);
     expect(parameter, isNotNull);
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
@@ -9034,7 +9074,7 @@
         errorCodes:
             usingFastaParser ? [ParserErrorCode.EXTRANEOUS_MODIFIER] : []);
     expect(parameter, isNotNull);
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
@@ -9045,7 +9085,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('final a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNull);
@@ -9056,7 +9096,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('final A a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.keyword, isNotNull);
     expect(simpleParameter.type, isNotNull);
@@ -9068,7 +9108,7 @@
         parseNormalFormalParameter('a', inFunctionType: true);
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
@@ -9079,7 +9119,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNull);
@@ -9090,7 +9130,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('covariant');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.covariantKeyword, isNull);
     expect(simpleParameter.keyword, isNull);
@@ -9102,7 +9142,7 @@
     NormalFormalParameter parameter = parseNormalFormalParameter('A a');
     expect(parameter, isNotNull);
     assertNoErrors();
-    expect(parameter, new TypeMatcher<SimpleFormalParameter>());
+    expect(parameter, isSimpleFormalParameter);
     SimpleFormalParameter simpleParameter = parameter;
     expect(simpleParameter.keyword, isNull);
     expect(simpleParameter.type, isNotNull);
@@ -9893,7 +9933,7 @@
  *
  * Intended to be mixed in to parser test case classes.
  */
-class ParserTestHelpers {
+mixin ParserTestHelpers {
   void expectCommentText(Comment comment, String expectedText) {
     expect(comment.beginToken, same(comment.endToken));
     expect(comment.beginToken.lexeme, expectedText);
@@ -9922,12 +9962,11 @@
  * invalid code sequences to ensure that the correct recovery steps are taken in
  * the parser.
  */
-abstract class RecoveryParserTestMixin implements AbstractParserTestCase {
+mixin RecoveryParserTestMixin implements AbstractParserTestCase {
   void test_additiveExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("+ y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -9936,27 +9975,23 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x +", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_additiveExpression_missing_RHS_super() {
     BinaryExpression expression =
         parseExpression("super +", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
@@ -9966,8 +10001,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_precedence_multiplicative_right() {
@@ -9976,8 +10010,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_additiveExpression_super() {
@@ -9985,15 +10018,14 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_assignableSelector() {
     IndexExpression expression =
         parseExpression("a.b[]", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression index = expression.index;
-    expect(index, new TypeMatcher<SimpleIdentifier>());
+    expect(index, isSimpleIdentifier);
     expect(index.isSynthetic, isTrue);
   }
 
@@ -10001,8 +10033,7 @@
     AssignmentExpression expression =
         parseExpression("= y = 0", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression = expression.leftHandSide;
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression, isSimpleIdentifier);
     expect(syntheticExpression.isSynthetic, isTrue);
   }
 
@@ -10011,8 +10042,7 @@
         parseExpression("x = = 0", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression =
         (expression.rightHandSide as AssignmentExpression).leftHandSide;
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression, isSimpleIdentifier);
     expect(syntheticExpression.isSynthetic, isTrue);
   }
 
@@ -10021,32 +10051,28 @@
         parseExpression("x = y =", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
     Expression syntheticExpression =
         (expression.rightHandSide as AssignmentExpression).rightHandSide;
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression, isSimpleIdentifier);
     expect(syntheticExpression.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_LHS() {
     AssignmentExpression expression =
         parseExpression("= 0", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftHandSide);
+    expect(expression.leftHandSide, isSimpleIdentifier);
     expect(expression.leftHandSide.isSynthetic, isTrue);
   }
 
   void test_assignmentExpression_missing_RHS() {
     AssignmentExpression expression =
         parseExpression("x =", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftHandSide);
+    expect(expression.leftHandSide, isSimpleIdentifier);
     expect(expression.rightHandSide.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("& y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -10055,27 +10081,23 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x &", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseAndExpression_missing_RHS_super() {
     BinaryExpression expression =
         parseExpression("super &", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
@@ -10085,8 +10107,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_precedence_equality_right() {
@@ -10095,8 +10116,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseAndExpression_super() {
@@ -10104,15 +10124,13 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("| y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -10121,27 +10139,23 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x |", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseOrExpression_missing_RHS_super() {
     BinaryExpression expression =
         parseExpression("super |", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
@@ -10151,8 +10165,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_precedence_xor_right() {
@@ -10161,8 +10174,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseOrExpression_super() {
@@ -10170,15 +10182,13 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("^ y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -10187,27 +10197,23 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x ^", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_bitwiseXorExpression_missing_RHS_super() {
     BinaryExpression expression =
         parseExpression("super ^", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
@@ -10217,8 +10223,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_precedence_and_right() {
@@ -10227,8 +10232,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_bitwiseXorExpression_super() {
@@ -10236,8 +10240,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_classTypeAlias_withBody() {
@@ -10283,10 +10286,9 @@
     Expression expression =
         parseExpression('x ? y :', codes: [ParserErrorCode.MISSING_IDENTIFIER]);
     expectNotNullIfNoErrors(expression);
-    expect(expression, new TypeMatcher<ConditionalExpression>());
+    expect(expression, isConditionalExpression);
     ConditionalExpression conditionalExpression = expression;
-    expect(conditionalExpression.elseExpression,
-        new TypeMatcher<SimpleIdentifier>());
+    expect(conditionalExpression.elseExpression, isSimpleIdentifier);
     expect(conditionalExpression.elseExpression.isSynthetic, isTrue);
   }
 
@@ -10294,10 +10296,9 @@
     Expression expression =
         parseExpression('x ? : z', codes: [ParserErrorCode.MISSING_IDENTIFIER]);
     expectNotNullIfNoErrors(expression);
-    expect(expression, new TypeMatcher<ConditionalExpression>());
+    expect(expression, isConditionalExpression);
     ConditionalExpression conditionalExpression = expression;
-    expect(conditionalExpression.thenExpression,
-        new TypeMatcher<SimpleIdentifier>());
+    expect(conditionalExpression.thenExpression, isSimpleIdentifier);
     expect(conditionalExpression.thenExpression.isSynthetic, isTrue);
   }
 
@@ -10327,8 +10328,7 @@
   void test_equalityExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("== y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -10337,27 +10337,23 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x ==", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_equalityExpression_missing_RHS_super() {
     BinaryExpression expression = parseExpression("super ==",
         codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
@@ -10368,8 +10364,7 @@
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
     if (!usingFastaParser) {
-      EngineTestCase.assertInstanceOf(
-          (obj) => obj is IsExpression, IsExpression, expression.leftOperand);
+      expect(expression.leftOperand, isIsExpression);
     }
   }
 
@@ -10379,8 +10374,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is IsExpression, IsExpression, expression.rightOperand);
+    expect(expression.rightOperand, isIsExpression);
   }
 
   void test_equalityExpression_super() {
@@ -10389,8 +10383,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_equalityExpression_superRHS() {
@@ -10408,8 +10401,7 @@
 //        [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 0, 1)]);
     expect(result, hasLength(4));
     Expression syntheticExpression = result[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression, isSimpleIdentifier);
     expect(syntheticExpression.isSynthetic, isTrue);
   }
 
@@ -10422,8 +10414,7 @@
 //        [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 6, 1)]);
     expect(result, hasLength(4));
     Expression syntheticExpression = result[2];
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, syntheticExpression);
+    expect(syntheticExpression, isSimpleIdentifier);
     expect(syntheticExpression.isSynthetic, isTrue);
   }
 
@@ -10441,8 +10432,7 @@
           [expectedError(ParserErrorCode.MISSING_IDENTIFIER, 8, 0)]);
       expect(result, hasLength(4));
       Expression syntheticExpression = result[3];
-      EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-          SimpleIdentifier, syntheticExpression);
+      expect(syntheticExpression, isSimpleIdentifier);
       expect(syntheticExpression.isSynthetic, isTrue);
     }
   }
@@ -10459,8 +10449,7 @@
     ClassDeclaration declaration = unit.declarations[0] as ClassDeclaration;
     NodeList<ClassMember> members = declaration.members;
     ClassMember fieldDecl = members[1];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FieldDeclaration, FieldDeclaration, fieldDecl);
+    expect(fieldDecl, isFieldDeclaration);
     NodeList<VariableDeclaration> vars =
         (fieldDecl as FieldDeclaration).fields.variables;
     expect(vars, hasLength(1));
@@ -10534,20 +10523,17 @@
     listener.assertErrors([
       expectedError(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER, 6, 1)
     ]);
-    expect(member, new TypeMatcher<ConstructorDeclaration>());
+    expect(member, isConstructorDeclaration);
     NodeList<ConstructorInitializer> initializers =
         (member as ConstructorDeclaration).initializers;
     expect(initializers, hasLength(1));
     ConstructorInitializer initializer = initializers[0];
-    expect(initializer, new TypeMatcher<ConstructorFieldInitializer>());
+    expect(initializer, isConstructorFieldInitializer);
     Expression expression =
         (initializer as ConstructorFieldInitializer).expression;
     expect(expression, isNotNull);
-    expect(
-        expression,
-        usingFastaParser
-            ? new TypeMatcher<MethodInvocation>()
-            : new TypeMatcher<ParenthesizedExpression>());
+    expect(expression,
+        usingFastaParser ? isMethodInvocation : isParenthesizedExpression);
   }
 
   void test_incomplete_constructorInitializers_this() {
@@ -10652,8 +10638,7 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
-        TopLevelVariableDeclaration, member);
+    expect(member, isTopLevelVariableDeclaration);
     NodeList<VariableDeclaration> variables =
         (member as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
@@ -10671,8 +10656,7 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
-        TopLevelVariableDeclaration, member);
+    expect(member, isTopLevelVariableDeclaration);
     NodeList<VariableDeclaration> variables =
         (member as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
@@ -10688,8 +10672,7 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
-        TopLevelVariableDeclaration, member);
+    expect(member, isTopLevelVariableDeclaration);
     NodeList<VariableDeclaration> variables =
         (member as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
@@ -10705,8 +10688,7 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
-    EngineTestCase.assertInstanceOf((obj) => obj is TopLevelVariableDeclaration,
-        TopLevelVariableDeclaration, member);
+    expect(member, isTopLevelVariableDeclaration);
     NodeList<VariableDeclaration> variables =
         (member as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
@@ -10725,13 +10707,11 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    expect(unitMember, isClassDeclaration);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
     expect(members, hasLength(1));
     ClassMember classMember = members[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    expect(classMember, isFieldDeclaration);
     VariableDeclarationList fieldList =
         (classMember as FieldDeclaration).fields;
     expect(fieldList.keyword.keyword, Keyword.CONST);
@@ -10752,13 +10732,11 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    expect(unitMember, isClassDeclaration);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
     expect(members, hasLength(1));
     ClassMember classMember = members[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    expect(classMember, isFieldDeclaration);
     VariableDeclarationList fieldList =
         (classMember as FieldDeclaration).fields;
     expect(fieldList.keyword.keyword, Keyword.FINAL);
@@ -10783,13 +10761,11 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    expect(unitMember, isClassDeclaration);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
     expect(members, hasLength(1));
     ClassMember classMember = members[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    expect(classMember, isFieldDeclaration);
     FieldDeclaration declaration = classMember;
     expect(declaration.staticKeyword.lexeme, 'static');
     VariableDeclarationList fieldList = declaration.fields;
@@ -10808,13 +10784,11 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    expect(unitMember, isClassDeclaration);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
     expect(members, hasLength(1));
     ClassMember classMember = members[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    expect(classMember, isFieldDeclaration);
     FieldDeclaration declaration = classMember;
     expect(declaration.staticKeyword.lexeme, 'static');
     VariableDeclarationList fieldList = declaration.fields;
@@ -10840,13 +10814,11 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    expect(unitMember, isClassDeclaration);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
     expect(members, hasLength(1));
     ClassMember classMember = members[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    expect(classMember, isFieldDeclaration);
     VariableDeclarationList fieldList =
         (classMember as FieldDeclaration).fields;
     TypeName type = fieldList.type;
@@ -10873,13 +10845,11 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember unitMember = declarations[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassDeclaration, ClassDeclaration, unitMember);
+    expect(unitMember, isClassDeclaration);
     NodeList<ClassMember> members = (unitMember as ClassDeclaration).members;
     expect(members, hasLength(1));
     ClassMember classMember = members[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FieldDeclaration, FieldDeclaration, classMember);
+    expect(classMember, isFieldDeclaration);
     VariableDeclarationList fieldList =
         (classMember as FieldDeclaration).fields;
     expect(fieldList.keyword.keyword, Keyword.VAR);
@@ -10895,7 +10865,7 @@
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 12, 4),
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 17, 1)
     ]);
-    expect(statement, new TypeMatcher<ForStatement>());
+    expect(statement, isForStatement);
     expect(statement.toSource(), 'for (String item; i;) {}');
     expect(statement.leftSeparator, isNotNull);
     expect(statement.leftSeparator.type, TokenType.SEMICOLON);
@@ -10907,7 +10877,7 @@
     Statement statement = parseStatement('String v }', expectedEndOffset: 9);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
-    expect(statement, new TypeMatcher<VariableDeclarationStatement>());
+    expect(statement, isVariableDeclarationStatement);
     expect(statement.toSource(), 'String v;');
   }
 
@@ -10917,7 +10887,7 @@
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 6, 1),
       expectedError(ParserErrorCode.EXPECTED_TOKEN, 6, 1)
     ]);
-    expect(statement, new TypeMatcher<VariableDeclarationStatement>());
+    expect(statement, isVariableDeclarationStatement);
     expect(statement.toSource(), 'final ;');
   }
 
@@ -10926,7 +10896,7 @@
         parseStatement('String v String v2;', expectedEndOffset: 9);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
-    expect(statement, new TypeMatcher<VariableDeclarationStatement>());
+    expect(statement, isVariableDeclarationStatement);
     expect(statement.toSource(), 'String v;');
   }
 
@@ -10935,7 +10905,7 @@
         parseStatement('String v if (true) {}', expectedEndOffset: 9);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
-    expect(statement, new TypeMatcher<VariableDeclarationStatement>());
+    expect(statement, isVariableDeclarationStatement);
     expect(statement.toSource(), 'String v;');
   }
 
@@ -10943,7 +10913,7 @@
     Statement statement = parseStatement('String v {}', expectedEndOffset: 9);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 7, 1)]);
-    expect(statement, new TypeMatcher<VariableDeclarationStatement>());
+    expect(statement, isVariableDeclarationStatement);
     expect(statement.toSource(), 'String v;');
   }
 
@@ -10952,7 +10922,7 @@
         parseStatement('List<String> v {}', expectedEndOffset: 15);
     listener
         .assertErrors([expectedError(ParserErrorCode.EXPECTED_TOKEN, 13, 1)]);
-    expect(statement, new TypeMatcher<VariableDeclarationStatement>());
+    expect(statement, isVariableDeclarationStatement);
     expect(statement.toSource(), 'List<String> v;');
   }
 
@@ -11130,8 +11100,85 @@
       SimpleIdentifier simpleId = thenStatement.expression;
       expect(simpleId.isSynthetic, isTrue);
     } else {
-      EngineTestCase.assertInstanceOf((obj) => obj is EmptyStatement,
-          EmptyStatement, ifStatement.thenStatement);
+      expect(ifStatement.thenStatement, isEmptyStatement);
+    }
+  }
+
+  void test_issue_34610_get() {
+    final unit = parseCompilationUnit('class C { get C.named => null; }',
+        errors: usingFastaParser
+            ? [
+                expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 15, 1),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 15, 1),
+                expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 16, 5),
+              ]
+            : [
+                expectedError(
+                    ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, 15, 1),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 15, 1),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 15, 1),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 22, 2),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 22, 2),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 22, 2),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 25, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 25, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 29, 1),
+              ]);
+    ClassDeclaration declaration = unit.declarations[0];
+    MethodDeclaration method = declaration.members[0];
+    expect(method.name.name, 'C');
+    expect(method.isGetter, isTrue);
+  }
+
+  void test_issue_34610_initializers() {
+    final unit = parseCompilationUnit('class C { C.named : super(); }',
+        errors: usingFastaParser
+            ? [expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 10, 1)]
+            : [
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 18, 19),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 18, 19),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 18, 19),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 20, 25),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 20, 25),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 25, 26),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 25, 26),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 26, 27),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 26, 27),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 27, 28),
+              ]);
+    ClassDeclaration declaration = unit.declarations[0];
+    if (usingFastaParser) {
+      ConstructorDeclaration constructor = declaration.members[0];
+      expect(constructor.name.name, 'named');
+      expect(constructor.parameters, isNotNull);
+      expect(constructor.parameters.parameters, hasLength(0));
+    } else {
+      FieldDeclaration field = declaration.members[0];
+      expect(field.fields.type.toSource(), 'C.named');
+    }
+  }
+
+  void test_issue_34610_missing_param() {
+    final unit = parseCompilationUnit('class C { C.named => null; }',
+        errors: usingFastaParser
+            ? [expectedError(ParserErrorCode.MISSING_METHOD_PARAMETERS, 10, 1)]
+            : [
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 18, 2),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 18, 2),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 18, 2),
+                expectedError(ParserErrorCode.EXPECTED_CLASS_MEMBER, 21, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 21, 4),
+                expectedError(ParserErrorCode.UNEXPECTED_TOKEN, 25, 1),
+              ]);
+    ClassDeclaration declaration = unit.declarations[0];
+    if (usingFastaParser) {
+      ConstructorDeclaration constructor = declaration.members[0];
+      expect(constructor.name.name, 'named');
+      expect(constructor.parameters, isNotNull);
+      expect(constructor.parameters.parameters, hasLength(0));
+    } else {
+      FieldDeclaration field = declaration.members[0];
+      expect(field.fields.type.toSource(), 'C.named');
     }
   }
 
@@ -11151,8 +11198,7 @@
   void test_logicalAndExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("&& y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -11161,19 +11207,16 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_logicalAndExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x &&", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
@@ -11183,8 +11226,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalAndExpression_precedence_bitwiseOr_right() {
@@ -11193,15 +11235,13 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("|| y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -11210,19 +11250,16 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_logicalOrExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x ||", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
@@ -11232,8 +11269,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_logicalOrExpression_precedence_logicalAnd_right() {
@@ -11242,8 +11278,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_method_missingBody() {
@@ -11285,11 +11320,9 @@
         unit.declarations[0] as ClassDeclaration;
     NodeList<ClassMember> members = classDeclaration.members;
     expect(members, hasLength(2));
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodDeclaration, MethodDeclaration, members[0]);
+    expect(members[0], isMethodDeclaration);
     ClassMember member = members[1];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is MethodDeclaration, MethodDeclaration, member);
+    expect(member, isMethodDeclaration);
     expect((member as MethodDeclaration).name.name, "foo");
   }
 
@@ -11304,7 +11337,7 @@
       // existing annotation can be associated with a class member.
       expect(member, isNull);
     } else {
-      expect(member, new TypeMatcher<MethodDeclaration>());
+      expect(member, isMethodDeclaration);
       MethodDeclaration method = member;
       expect(method.documentationComment, isNull);
       NodeList<Annotation> metadata = method.metadata;
@@ -11316,7 +11349,7 @@
   void test_missingSemicolon_varialeDeclarationList() {
     void verify(CompilationUnitMember member, String expectedTypeName,
         String expectedName, String expectedSemicolon) {
-      expect(member, new TypeMatcher<TopLevelVariableDeclaration>());
+      expect(member, isTopLevelVariableDeclaration);
       TopLevelVariableDeclaration declaration = member;
       VariableDeclarationList variableList = declaration.variables;
       expect(variableList, isNotNull);
@@ -11350,8 +11383,7 @@
   void test_multiplicativeExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("* y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -11360,42 +11392,36 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x *", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_missing_RHS_super() {
     BinaryExpression expression =
         parseExpression("super *", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_multiplicativeExpression_precedence_unary_left() {
     BinaryExpression expression =
         parseExpression("-x *", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
-        PrefixExpression, expression.leftOperand);
+    expect(expression.leftOperand, isPrefixExpression);
   }
 
   void test_multiplicativeExpression_precedence_unary_right() {
     BinaryExpression expression =
         parseExpression("* -y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is PrefixExpression,
-        PrefixExpression, expression.rightOperand);
+    expect(expression.rightOperand, isPrefixExpression);
   }
 
   void test_multiplicativeExpression_super() {
@@ -11404,8 +11430,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_namedParameterOutsideGroup() {
@@ -11444,8 +11469,7 @@
   void test_prefixExpression_missing_operand_minus() {
     PrefixExpression expression =
         parseExpression("-", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is SimpleIdentifier, SimpleIdentifier, expression.operand);
+    expect(expression.operand, isSimpleIdentifier);
     expect(expression.operand.isSynthetic, isTrue);
     expect(expression.operator.type, TokenType.MINUS);
   }
@@ -11482,8 +11506,7 @@
   void test_relationalExpression_missing_LHS() {
     IsExpression expression =
         parseExpression("is y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.expression);
+    expect(expression.expression, isSimpleIdentifier);
     expect(expression.expression.isSynthetic, isTrue);
   }
 
@@ -11492,19 +11515,16 @@
       ParserErrorCode.EXPECTED_TYPE_NAME,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.expression);
+    expect(expression.expression, isSimpleIdentifier);
     expect(expression.expression.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is TypeName, TypeName, expression.type);
+    expect(expression.type, isTypeName);
     expect(expression.type.isSynthetic, isTrue);
   }
 
   void test_relationalExpression_missing_RHS() {
     IsExpression expression =
         parseExpression("x is", codes: [ParserErrorCode.EXPECTED_TYPE_NAME]);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is TypeName, TypeName, expression.type);
+    expect(expression.type, isTypeName);
     expect(expression.type.isSynthetic, isTrue);
   }
 
@@ -11514,15 +11534,13 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.expression);
+    expect(expression.expression, isBinaryExpression);
   }
 
   void test_shiftExpression_missing_LHS() {
     BinaryExpression expression =
         parseExpression("<< y", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
   }
 
@@ -11531,27 +11549,23 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.leftOperand);
+    expect(expression.leftOperand, isSimpleIdentifier);
     expect(expression.leftOperand.isSynthetic, isTrue);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_missing_RHS() {
     BinaryExpression expression =
         parseExpression("x <<", codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
   void test_shiftExpression_missing_RHS_super() {
     BinaryExpression expression = parseExpression("super <<",
         codes: [ParserErrorCode.MISSING_IDENTIFIER]);
-    EngineTestCase.assertInstanceOf((obj) => obj is SimpleIdentifier,
-        SimpleIdentifier, expression.rightOperand);
+    expect(expression.rightOperand, isSimpleIdentifier);
     expect(expression.rightOperand.isSynthetic, isTrue);
   }
 
@@ -11561,8 +11575,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_precedence_unary_right() {
@@ -11571,8 +11584,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.rightOperand);
+    expect(expression.rightOperand, isBinaryExpression);
   }
 
   void test_shiftExpression_super() {
@@ -11580,8 +11592,7 @@
       ParserErrorCode.MISSING_IDENTIFIER,
       ParserErrorCode.MISSING_IDENTIFIER
     ]);
-    EngineTestCase.assertInstanceOf((obj) => obj is BinaryExpression,
-        BinaryExpression, expression.leftOperand);
+    expect(expression.leftOperand, isBinaryExpression);
   }
 
   void test_typedef_eof() {
@@ -11592,8 +11603,7 @@
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(1));
     CompilationUnitMember member = declarations[0];
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FunctionTypeAlias, FunctionTypeAlias, member);
+    expect(member, isFunctionTypeAlias);
   }
 
   void test_unaryPlus() {
@@ -12102,7 +12112,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<EmptyFunctionBody>());
+    expect(functionBody, isEmptyFunctionBody);
   }
 
   void test_parseFunctionBody_skip_block_invalid() {
@@ -12111,7 +12121,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     listener.assertErrorsWithCodes([ScannerErrorCode.EXPECTED_TOKEN]);
-    expect(functionBody, new TypeMatcher<EmptyFunctionBody>());
+    expect(functionBody, isEmptyFunctionBody);
   }
 
   void test_parseFunctionBody_skip_blocks() {
@@ -12120,7 +12130,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<EmptyFunctionBody>());
+    expect(functionBody, isEmptyFunctionBody);
   }
 
   void test_parseFunctionBody_skip_expression() {
@@ -12129,7 +12139,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<EmptyFunctionBody>());
+    expect(functionBody, isEmptyFunctionBody);
   }
 
   void test_parseModifiers_abstract() {
@@ -12412,13 +12422,13 @@
  *
  * More complex tests should be defined in the class [ComplexParserTest].
  */
-abstract class SimpleParserTestMixin implements AbstractParserTestCase {
+mixin SimpleParserTestMixin implements AbstractParserTestCase {
   ConstructorName parseConstructorName(String name) {
     createParser('new $name();');
     Statement statement = parser.parseStatement2();
-    expect(statement, new TypeMatcher<ExpressionStatement>());
+    expect(statement, isExpressionStatement);
     Expression expression = (statement as ExpressionStatement).expression;
-    expect(expression, new TypeMatcher<InstanceCreationExpression>());
+    expect(expression, isInstanceCreationExpression);
     return (expression as InstanceCreationExpression).constructorName;
   }
 
@@ -12466,7 +12476,7 @@
    */
   void parseStatementList(String content, int expectedCount) {
     Statement statement = parseStatement('{$content}');
-    expect(statement, new TypeMatcher<Block>());
+    expect(statement, isBlock);
     Block block = statement;
     expect(block.statements, hasLength(expectedCount));
   }
@@ -12907,7 +12917,7 @@
     CommentReference reference = parseCommentReference('new a.b', 7);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<PrefixedIdentifier>());
+    expect(reference.identifier, isPrefixedIdentifier);
     PrefixedIdentifier prefixedIdentifier = reference.identifier;
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
     expect(prefix.token, isNotNull);
@@ -12925,7 +12935,7 @@
     CommentReference reference = parseCommentReference('new a', 5);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<SimpleIdentifier>());
+    expect(reference.identifier, isSimpleIdentifier);
     SimpleIdentifier identifier = reference.identifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "a");
@@ -12937,7 +12947,7 @@
     CommentReference reference = parseCommentReference('operator ==', 5);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<SimpleIdentifier>());
+    expect(reference.identifier, isSimpleIdentifier);
     SimpleIdentifier identifier = reference.identifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "==");
@@ -12949,7 +12959,7 @@
     CommentReference reference = parseCommentReference('Object.operator==', 7);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<PrefixedIdentifier>());
+    expect(reference.identifier, isPrefixedIdentifier);
     PrefixedIdentifier prefixedIdentifier = reference.identifier;
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
     expect(prefix.token, isNotNull);
@@ -12967,7 +12977,7 @@
     CommentReference reference = parseCommentReference('==', 5);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<SimpleIdentifier>());
+    expect(reference.identifier, isSimpleIdentifier);
     SimpleIdentifier identifier = reference.identifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "==");
@@ -12979,7 +12989,7 @@
     CommentReference reference = parseCommentReference('Object.==', 7);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<PrefixedIdentifier>());
+    expect(reference.identifier, isPrefixedIdentifier);
     PrefixedIdentifier prefixedIdentifier = reference.identifier;
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
     expect(prefix.token, isNotNull);
@@ -12997,7 +13007,7 @@
     CommentReference reference = parseCommentReference('a.b', 7);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<PrefixedIdentifier>());
+    expect(reference.identifier, isPrefixedIdentifier);
     PrefixedIdentifier prefixedIdentifier = reference.identifier;
     SimpleIdentifier prefix = prefixedIdentifier.prefix;
     expect(prefix.token, isNotNull);
@@ -13015,7 +13025,7 @@
     CommentReference reference = parseCommentReference('a', 5);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<SimpleIdentifier>());
+    expect(reference.identifier, isSimpleIdentifier);
     SimpleIdentifier identifier = reference.identifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "a");
@@ -13027,7 +13037,7 @@
     CommentReference reference = parseCommentReference('', 5);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    expect(reference.identifier, new TypeMatcher<SimpleIdentifier>());
+    expect(reference.identifier, isSimpleIdentifier);
     SimpleIdentifier identifier = reference.identifier;
     expect(identifier, isNotNull);
     expect(identifier.isSynthetic, isTrue);
@@ -13048,10 +13058,7 @@
     CommentReference reference = parseCommentReference('this', 5);
     expectNotNullIfNoErrors(reference);
     assertNoErrors();
-    SimpleIdentifier identifier = EngineTestCase.assertInstanceOf(
-        (obj) => obj is SimpleIdentifier,
-        SimpleIdentifier,
-        reference.identifier);
+    SimpleIdentifier identifier = reference.identifier;
     expect(identifier.token, isNotNull);
     expect(identifier.name, "a");
     expect(identifier.offset, 5);
@@ -13582,7 +13589,7 @@
     assertNoErrors();
     expect(clause.extendsKeyword, isNotNull);
     expect(clause.superclass, isNotNull);
-    expect(clause.superclass, new TypeMatcher<TypeName>());
+    expect(clause.superclass, isTypeName);
   }
 
   void test_parseFunctionBody_block() {
@@ -13590,7 +13597,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<BlockFunctionBody>());
+    expect(functionBody, isBlockFunctionBody);
     BlockFunctionBody body = functionBody;
     expect(body.keyword, isNull);
     expect(body.star, isNull);
@@ -13605,7 +13612,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<BlockFunctionBody>());
+    expect(functionBody, isBlockFunctionBody);
     BlockFunctionBody body = functionBody;
     expect(body.keyword, isNotNull);
     expect(body.keyword.lexeme, Parser.ASYNC);
@@ -13621,7 +13628,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<BlockFunctionBody>());
+    expect(functionBody, isBlockFunctionBody);
     BlockFunctionBody body = functionBody;
     expect(body.keyword, isNotNull);
     expect(body.keyword.lexeme, Parser.ASYNC);
@@ -13637,7 +13644,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<BlockFunctionBody>());
+    expect(functionBody, isBlockFunctionBody);
     BlockFunctionBody body = functionBody;
     expect(body.keyword, isNotNull);
     expect(body.keyword.lexeme, Parser.SYNC);
@@ -13653,7 +13660,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(true, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<EmptyFunctionBody>());
+    expect(functionBody, isEmptyFunctionBody);
     EmptyFunctionBody body = functionBody;
     expect(body.semicolon, isNotNull);
   }
@@ -13663,7 +13670,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<ExpressionFunctionBody>());
+    expect(functionBody, isExpressionFunctionBody);
     ExpressionFunctionBody body = functionBody;
     expect(body.keyword, isNull);
     expect(body.functionDefinition, isNotNull);
@@ -13679,7 +13686,7 @@
     FunctionBody functionBody = parser.parseFunctionBody(false, null, false);
     expectNotNullIfNoErrors(functionBody);
     assertNoErrors();
-    expect(functionBody, new TypeMatcher<ExpressionFunctionBody>());
+    expect(functionBody, isExpressionFunctionBody);
     ExpressionFunctionBody body = functionBody;
     expect(body.keyword, isNotNull);
     expect(body.keyword.lexeme, Parser.ASYNC);
@@ -13759,7 +13766,7 @@
     expect(unit, isNotNull);
     FunctionDeclaration f = unit.declarations[0];
     ExpressionFunctionBody body = f.functionExpression.body;
-    expect(body.expression, new TypeMatcher<InstanceCreationExpression>());
+    expect(body.expression, isInstanceCreationExpression);
     InstanceCreationExpressionImpl creation = body.expression;
     expect(creation.keyword, isNull);
     ConstructorName constructorName = creation.constructorName;
@@ -13780,7 +13787,7 @@
     expect(unit, isNotNull);
     FunctionDeclaration f = unit.declarations[0];
     ExpressionFunctionBody body = f.functionExpression.body;
-    expect(body.expression, new TypeMatcher<InstanceCreationExpression>());
+    expect(body.expression, isInstanceCreationExpression);
     InstanceCreationExpressionImpl creation = body.expression;
     expect(creation.keyword, isNull);
     ConstructorName constructorName = creation.constructorName;
@@ -13798,7 +13805,7 @@
     expect(unit, isNotNull);
     FunctionDeclaration f = unit.declarations[0];
     ExpressionFunctionBody body = f.functionExpression.body;
-    expect(body.expression, new TypeMatcher<InstanceCreationExpression>());
+    expect(body.expression, isInstanceCreationExpression);
     InstanceCreationExpression creation = body.expression;
     expect(creation.keyword, isNull);
     ConstructorName constructorName = creation.constructorName;
@@ -13897,13 +13904,13 @@
 Function<A>(core.List<core.int> x) m() => null;
 ''');
     Statement statement = parser.parseStatement2();
-    expect(statement, new TypeMatcher<FunctionDeclarationStatement>());
+    expect(statement, isFunctionDeclarationStatement);
     expect(
         (statement as FunctionDeclarationStatement)
             .functionDeclaration
             .functionExpression
             .body,
-        new TypeMatcher<ExpressionFunctionBody>());
+        isExpressionFunctionBody);
   }
 
   void test_parseStatements_multiple() {
@@ -13940,16 +13947,16 @@
     NodeList<FormalParameter> parameters = parameterList.parameters;
     expect(parameters, hasLength(2));
 
-    expect(parameters[0], new TypeMatcher<SimpleFormalParameter>());
+    expect(parameters[0], isSimpleFormalParameter);
     SimpleFormalParameter parameter = parameters[0];
     expect(parameter.identifier, isNull);
-    expect(parameter.type, new TypeMatcher<TypeName>());
+    expect(parameter.type, isTypeName);
     expect((parameter.type as TypeName).name.name, 'int');
 
-    expect(parameters[1], new TypeMatcher<SimpleFormalParameter>());
+    expect(parameters[1], isSimpleFormalParameter);
     parameter = parameters[1];
     expect(parameter.identifier, isNull);
-    expect(parameter.type, new TypeMatcher<TypeName>());
+    expect(parameter.type, isTypeName);
     expect((parameter.type as TypeName).name.name, 'int');
   }
 
@@ -14025,18 +14032,18 @@
     NodeList<FormalParameter> parameters = parameterList.parameters;
     expect(parameters, hasLength(2));
 
-    expect(parameters[0], new TypeMatcher<SimpleFormalParameter>());
+    expect(parameters[0], isSimpleFormalParameter);
     SimpleFormalParameter parameter = parameters[0];
     expect(parameter.identifier, isNotNull);
     expect(parameter.identifier.name, 's');
-    expect(parameter.type, new TypeMatcher<TypeName>());
+    expect(parameter.type, isTypeName);
     expect((parameter.type as TypeName).name.name, 'String');
 
-    expect(parameters[1], new TypeMatcher<SimpleFormalParameter>());
+    expect(parameters[1], isSimpleFormalParameter);
     parameter = parameters[1];
     expect(parameter.identifier, isNotNull);
     expect(parameter.identifier.name, 'i');
-    expect(parameter.type, new TypeMatcher<TypeName>());
+    expect(parameter.type, isTypeName);
     expect((parameter.type as TypeName).name.name, 'int');
   }
 
@@ -14211,7 +14218,7 @@
     TypeParameter parameter = parser.parseTypeParameter();
     expectNotNullIfNoErrors(parameter);
     assertNoErrors();
-    expect(parameter.bound, new TypeMatcher<GenericFunctionType>());
+    expect(parameter.bound, isGenericFunctionType);
     expect(parameter.extendsKeyword, isNotNull);
     expect(parameter.name, isNotNull);
   }
@@ -14221,7 +14228,7 @@
     TypeParameter parameter = parser.parseTypeParameter();
     expectNotNullIfNoErrors(parameter);
     assertNoErrors();
-    expect(parameter.bound, new TypeMatcher<GenericFunctionType>());
+    expect(parameter.bound, isGenericFunctionType);
     expect(parameter.extendsKeyword, isNotNull);
     expect(parameter.name, isNotNull);
   }
@@ -14231,7 +14238,7 @@
     TypeParameter parameter = parser.parseTypeParameter();
     expectNotNullIfNoErrors(parameter);
     assertNoErrors();
-    expect(parameter.bound, new TypeMatcher<TypeName>());
+    expect(parameter.bound, isTypeName);
     expect(parameter.extendsKeyword, isNotNull);
     expect(parameter.name, isNotNull);
   }
@@ -14241,7 +14248,7 @@
     TypeParameter parameter = parser.parseTypeParameter();
     expectNotNullIfNoErrors(parameter);
     assertNoErrors();
-    expect(parameter.bound, new TypeMatcher<TypeName>());
+    expect(parameter.bound, isTypeName);
     expect(parameter.extendsKeyword, isNotNull);
     expect(parameter.name, isNotNull);
   }
@@ -14366,7 +14373,7 @@
  * The class [FormalParameterParserTestMixin] defines parser tests that test
  * the parsing statements.
  */
-abstract class StatementParserTestMixin implements AbstractParserTestCase {
+mixin StatementParserTestMixin implements AbstractParserTestCase {
   void test_invalid_typeParamAnnotation() {
     parseCompilationUnit('main() { C<@Foo T> v; }',
         errors: usingFastaParser
@@ -15018,7 +15025,7 @@
         as FunctionDeclarationStatement;
     assertNoErrors();
     FunctionDeclaration function = statement.functionDeclaration;
-    expect(function.returnType, new TypeMatcher<GenericFunctionType>());
+    expect(function.returnType, isGenericFunctionType);
   }
 
   void test_parseNonLabeledStatement_null() {
@@ -15062,7 +15069,7 @@
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    expect(variableList.type, new TypeMatcher<GenericFunctionType>());
+    expect(variableList.type, isGenericFunctionType);
   }
 
   void
@@ -15075,7 +15082,7 @@
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    expect(variableList.type, new TypeMatcher<GenericFunctionType>());
+    expect(variableList.type, isGenericFunctionType);
   }
 
   void
@@ -15087,7 +15094,7 @@
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    expect(variableList.type, new TypeMatcher<GenericFunctionType>());
+    expect(variableList.type, isGenericFunctionType);
   }
 
   void
@@ -15099,7 +15106,7 @@
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    expect(variableList.type, new TypeMatcher<GenericFunctionType>());
+    expect(variableList.type, isGenericFunctionType);
   }
 
   void
@@ -15111,7 +15118,7 @@
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    expect(variableList.type, new TypeMatcher<GenericFunctionType>());
+    expect(variableList.type, isGenericFunctionType);
   }
 
   void test_parseNonLabeledStatement_variableDeclaration_gftType_returnType() {
@@ -15122,7 +15129,7 @@
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    expect(variableList.type, new TypeMatcher<GenericFunctionType>());
+    expect(variableList.type, isGenericFunctionType);
   }
 
   void
@@ -15134,7 +15141,7 @@
     List<VariableDeclaration> variables = variableList.variables;
     expect(variables, hasLength(1));
     expect(variables[0].name.name, 'v');
-    expect(variableList.type, new TypeMatcher<GenericFunctionType>());
+    expect(variableList.type, isGenericFunctionType);
   }
 
   void test_parseNonLabeledStatement_variableDeclaration_typeParam() {
@@ -15177,8 +15184,7 @@
     TypeName typeName = variableList.type;
     expect(typeName.name.name, 'C');
     expect(typeName.typeArguments.arguments, hasLength(1));
-    expect(typeName.typeArguments.arguments[0],
-        new TypeMatcher<GenericFunctionType>());
+    expect(typeName.typeArguments.arguments[0], isGenericFunctionType);
   }
 
   void test_parseStatement_emptyTypeArgumentList() {
@@ -15198,7 +15204,7 @@
         parseStatement('void Function<A>(core.List<core.int> x) m() => null;')
             as FunctionDeclarationStatement;
     expect(statement.functionDeclaration.functionExpression.body,
-        new TypeMatcher<ExpressionFunctionBody>());
+        isExpressionFunctionBody);
   }
 
   void test_parseStatement_functionDeclaration_noReturnType() {
@@ -15742,7 +15748,7 @@
  * Tests which exercise the parser using a complete compilation unit or
  * compilation unit member.
  */
-abstract class TopLevelParserTestMixin implements AbstractParserTestCase {
+mixin TopLevelParserTestMixin implements AbstractParserTestCase {
   void test_function_literal_allowed_at_toplevel() {
     parseCompilationUnit("var x = () {};");
   }
@@ -15797,7 +15803,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNotNull);
@@ -15816,7 +15822,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
@@ -15836,7 +15842,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
@@ -15855,7 +15861,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
@@ -15874,7 +15880,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
@@ -15894,7 +15900,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
@@ -15914,7 +15920,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
@@ -15936,7 +15942,7 @@
     {
       var annotation = declaration.metadata[0];
       expect(annotation.atSign, isNotNull);
-      expect(annotation.name, new TypeMatcher<SimpleIdentifier>());
+      expect(annotation.name, isSimpleIdentifier);
       expect(annotation.name.name, 'A');
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
@@ -15946,7 +15952,7 @@
     {
       var annotation = declaration.metadata[1];
       expect(annotation.atSign, isNotNull);
-      expect(annotation.name, new TypeMatcher<SimpleIdentifier>());
+      expect(annotation.name, isSimpleIdentifier);
       expect(annotation.name.name, 'B');
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
@@ -15957,7 +15963,7 @@
     {
       var annotation = declaration.metadata[2];
       expect(annotation.atSign, isNotNull);
-      expect(annotation.name, new TypeMatcher<PrefixedIdentifier>());
+      expect(annotation.name, isPrefixedIdentifier);
       expect(annotation.name.name, 'C.foo');
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
@@ -15968,7 +15974,7 @@
     {
       var annotation = declaration.metadata[3];
       expect(annotation.atSign, isNotNull);
-      expect(annotation.name, new TypeMatcher<PrefixedIdentifier>());
+      expect(annotation.name, isPrefixedIdentifier);
       expect(annotation.name.name, 'd.E');
       expect(annotation.period, isNotNull);
       expect(annotation.constructorName, isNotNull);
@@ -15989,7 +15995,7 @@
     } else {
       assertNoErrors();
     }
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     NativeClause nativeClause = declaration.nativeClause;
     expect(nativeClause, isNotNull);
@@ -16004,7 +16010,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
@@ -16023,7 +16029,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassTypeAlias>());
+    expect(member, isClassTypeAlias);
     ClassTypeAlias typeAlias = member;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
@@ -16041,7 +16047,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassTypeAlias>());
+    expect(member, isClassTypeAlias);
     ClassTypeAlias typeAlias = member;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name, isNotNull);
@@ -16058,7 +16064,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.documentationComment, isNull);
     expect(declaration.abstractKeyword, isNull);
@@ -16286,7 +16292,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<TopLevelVariableDeclaration>());
+    expect(member, isTopLevelVariableDeclaration);
     TopLevelVariableDeclaration declaration = member;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
@@ -16297,7 +16303,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassDeclaration>());
+    expect(member, isClassDeclaration);
     ClassDeclaration declaration = member;
     expect(declaration.name.name, "A");
     expect(declaration.members, hasLength(0));
@@ -16308,7 +16314,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassTypeAlias>());
+    expect(member, isClassTypeAlias);
     ClassTypeAlias declaration = member;
     expect(declaration.name.name, "A");
     expect(declaration.abstractKeyword, isNotNull);
@@ -16319,7 +16325,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<TopLevelVariableDeclaration>());
+    expect(member, isTopLevelVariableDeclaration);
     TopLevelVariableDeclaration declaration = member;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
@@ -16341,7 +16347,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<TopLevelVariableDeclaration>());
+    expect(member, isTopLevelVariableDeclaration);
     TopLevelVariableDeclaration declaration = member;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
@@ -16353,7 +16359,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
@@ -16365,7 +16371,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
@@ -16377,7 +16383,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.returnType, isNull);
     expect(declaration.functionExpression.typeParameters, isNotNull);
@@ -16389,7 +16395,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.returnType, isNull);
     expect(declaration.functionExpression.typeParameters, isNotNull);
@@ -16400,7 +16406,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.returnType, isNotNull);
     expect(declaration.functionExpression.typeParameters, isNotNull);
@@ -16411,7 +16417,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNull);
@@ -16442,7 +16448,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNull);
@@ -16453,7 +16459,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNull);
@@ -16464,7 +16470,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.returnType, isNotNull);
   }
@@ -16474,7 +16480,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
@@ -16487,7 +16493,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
@@ -16499,7 +16505,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
@@ -16510,7 +16516,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
@@ -16521,7 +16527,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
@@ -16533,7 +16539,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.externalKeyword, isNotNull);
     expect(declaration.functionExpression, isNotNull);
@@ -16545,7 +16551,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
@@ -16557,7 +16563,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<FunctionDeclaration>());
+    expect(member, isFunctionDeclaration);
     FunctionDeclaration declaration = member;
     expect(declaration.functionExpression, isNotNull);
     expect(declaration.propertyKeyword, isNotNull);
@@ -16569,7 +16575,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassTypeAlias>());
+    expect(member, isClassTypeAlias);
     ClassTypeAlias typeAlias = member;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name.name, "C");
@@ -16588,7 +16594,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassTypeAlias>());
+    expect(member, isClassTypeAlias);
     ClassTypeAlias typeAlias = member;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name.name, "C");
@@ -16606,7 +16612,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassTypeAlias>());
+    expect(member, isClassTypeAlias);
     ClassTypeAlias typeAlias = member;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name.name, "C");
@@ -16624,7 +16630,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<ClassTypeAlias>());
+    expect(member, isClassTypeAlias);
     ClassTypeAlias typeAlias = member;
     expect(typeAlias.typedefKeyword, isNotNull);
     expect(typeAlias.name.name, "C");
@@ -16660,7 +16666,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<TopLevelVariableDeclaration>());
+    expect(member, isTopLevelVariableDeclaration);
     TopLevelVariableDeclaration declaration = member;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
@@ -16674,7 +16680,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<TopLevelVariableDeclaration>());
+    expect(member, isTopLevelVariableDeclaration);
     TopLevelVariableDeclaration declaration = member;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
@@ -16691,7 +16697,7 @@
     expect(unit.declarations, hasLength(1));
     TopLevelVariableDeclaration declaration =
         unit.declarations[0] as TopLevelVariableDeclaration;
-    expect(declaration.variables.type, new TypeMatcher<GenericFunctionType>());
+    expect(declaration.variables.type, isGenericFunctionType);
   }
 
   void test_parseCompilationUnitMember_variable_gftType_noReturnType() {
@@ -16716,7 +16722,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<TopLevelVariableDeclaration>());
+    expect(member, isTopLevelVariableDeclaration);
     TopLevelVariableDeclaration declaration = member;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
@@ -16727,7 +16733,7 @@
     CompilationUnitMember member = parseFullCompilationUnitMember();
     expect(member, isNotNull);
     assertNoErrors();
-    expect(member, new TypeMatcher<TopLevelVariableDeclaration>());
+    expect(member, isTopLevelVariableDeclaration);
     TopLevelVariableDeclaration declaration = member;
     expect(declaration.semicolon, isNotNull);
     expect(declaration.variables, isNotNull);
@@ -17157,7 +17163,7 @@
     {
       var annotation = parameters[0].metadata[0];
       expect(annotation.atSign, isNotNull);
-      expect(annotation.name, new TypeMatcher<SimpleIdentifier>());
+      expect(annotation.name, isSimpleIdentifier);
       expect(annotation.name.name, 'A');
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
@@ -17167,7 +17173,7 @@
     {
       var annotation = parameters[1].metadata[0];
       expect(annotation.atSign, isNotNull);
-      expect(annotation.name, new TypeMatcher<SimpleIdentifier>());
+      expect(annotation.name, isSimpleIdentifier);
       expect(annotation.name.name, 'B');
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
@@ -17178,7 +17184,7 @@
     {
       var annotation = parameters[2].metadata[0];
       expect(annotation.atSign, isNotNull);
-      expect(annotation.name, new TypeMatcher<PrefixedIdentifier>());
+      expect(annotation.name, isPrefixedIdentifier);
       expect(annotation.name.name, 'C.foo');
       expect(annotation.period, isNull);
       expect(annotation.constructorName, isNull);
@@ -17189,7 +17195,7 @@
     {
       var annotation = parameters[3].metadata[0];
       expect(annotation.atSign, isNotNull);
-      expect(annotation.name, new TypeMatcher<PrefixedIdentifier>());
+      expect(annotation.name, isPrefixedIdentifier);
       expect(annotation.name.name, 'd.E');
       expect(annotation.period, isNotNull);
       expect(annotation.constructorName, isNotNull);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 2c0bdfd..69dc68b 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -413,7 +413,7 @@
  * Instances of the class `StaticTypeVerifier` verify that all of the nodes in an AST
  * structure that should have a static type associated with them do have a static type.
  */
-class StaticTypeVerifier extends GeneralizingAstVisitor<Object> {
+class StaticTypeVerifier extends GeneralizingAstVisitor<void> {
   /**
    * A list containing all of the AST Expression nodes that were not resolved.
    */
@@ -479,19 +479,19 @@
   }
 
   @override
-  Object visitBreakStatement(BreakStatement node) => null;
+  void visitBreakStatement(BreakStatement node) {}
 
   @override
-  Object visitCommentReference(CommentReference node) => null;
+  void visitCommentReference(CommentReference node) {}
 
   @override
-  Object visitContinueStatement(ContinueStatement node) => null;
+  void visitContinueStatement(ContinueStatement node) {}
 
   @override
-  Object visitExportDirective(ExportDirective node) => null;
+  void visitExportDirective(ExportDirective node) {}
 
   @override
-  Object visitExpression(Expression node) {
+  void visitExpression(Expression node) {
     node.visitChildren(this);
     DartType staticType = node.staticType;
     if (staticType == null) {
@@ -499,66 +499,65 @@
     } else {
       _resolvedExpressionCount++;
     }
-    return null;
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) => null;
+  void visitImportDirective(ImportDirective node) {}
 
   @override
-  Object visitLabel(Label node) => null;
+  void visitLabel(Label node) {}
 
   @override
-  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
+  void visitLibraryIdentifier(LibraryIdentifier node) {}
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     // In cases where we have a prefixed identifier where the prefix is dynamic,
     // we don't want to assert that the node will have a type.
     if (node.staticType == null &&
         resolutionMap.staticTypeForExpression(node.prefix).isDynamic) {
-      return null;
+      return;
     }
-    return super.visitPrefixedIdentifier(node);
+    super.visitPrefixedIdentifier(node);
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     // In cases where identifiers are being used for something other than an
     // expressions, then they can be ignored.
     AstNode parent = node.parent;
     if (parent is MethodInvocation && identical(node, parent.methodName)) {
-      return null;
+      return;
     } else if (parent is RedirectingConstructorInvocation &&
         identical(node, parent.constructorName)) {
-      return null;
+      return;
     } else if (parent is SuperConstructorInvocation &&
         identical(node, parent.constructorName)) {
-      return null;
+      return;
     } else if (parent is ConstructorName && identical(node, parent.name)) {
-      return null;
+      return;
     } else if (parent is ConstructorFieldInitializer &&
         identical(node, parent.fieldName)) {
-      return null;
+      return;
     } else if (node.staticElement is PrefixElement) {
       // Prefixes don't have a type.
-      return null;
+      return;
     }
-    return super.visitSimpleIdentifier(node);
+    super.visitSimpleIdentifier(node);
   }
 
   @override
-  Object visitTypeAnnotation(TypeAnnotation node) {
+  void visitTypeAnnotation(TypeAnnotation node) {
     if (node.type == null) {
       _unresolvedTypes.add(node);
     } else {
       _resolvedTypeCount++;
     }
-    return super.visitTypeAnnotation(node);
+    super.visitTypeAnnotation(node);
   }
 
   @override
-  Object visitTypeName(TypeName node) {
+  void visitTypeName(TypeName node) {
     // Note: do not visit children from this node, the child SimpleIdentifier in
     // TypeName (i.e. "String") does not have a static type defined.
     // TODO(brianwilkerson) Not visiting the children means that we won't catch
@@ -568,7 +567,6 @@
     } else {
       _resolvedTypeCount++;
     }
-    return null;
   }
 
   String _getFileName(AstNode node) {
@@ -856,77 +854,6 @@
     }
   }
 
-  test_functionExpression_asInvocationArgument() async {
-    if (previewDart2) {
-      return;
-    }
-    String code = r'''
-class MyMap<K, V> {
-  forEach(f(K key, V value)) {}
-}
-f(MyMap<int, String> m) {
-  m.forEach((k, v) {
-    k;
-    v;
-  });
-}''';
-    Source source = addSource(code);
-    CompilationUnit unit = await _computeResolvedUnit(source);
-    // k
-    SimpleIdentifier kIdentifier = EngineTestCase.findNode(
-        unit, code, "k;", (node) => node is SimpleIdentifier);
-    expect(kIdentifier.staticType, typeProvider.dynamicType);
-    // v
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(
-        unit, code, "v;", (node) => node is SimpleIdentifier);
-    expect(vIdentifier.staticType, typeProvider.dynamicType);
-  }
-
-  test_functionExpression_asInvocationArgument_functionExpressionInvocation() async {
-    if (previewDart2) {
-      return;
-    }
-    String code = r'''
-main() {
-  (f(String value)) {} ((v) {
-    v;
-  });
-}''';
-    Source source = addSource(code);
-    CompilationUnit unit = await _computeResolvedUnit(source);
-    // v
-    FormalParameter vParameter = EngineTestCase.findNode(
-        unit, code, "v)", (node) => node is FormalParameter);
-    expect(vParameter.identifier.staticType, typeProvider.dynamicType);
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(
-        unit, code, "v;", (node) => node is SimpleIdentifier);
-    expect(vIdentifier.staticType, typeProvider.dynamicType);
-  }
-
-  test_functionExpression_asInvocationArgument_keepIfLessSpecific() async {
-    if (previewDart2) {
-      return;
-    }
-    String code = r'''
-class MyList {
-  forEach(f(Object value)) {}
-}
-f(MyList list) {
-  list.forEach((int v) {
-    v;
-  });
-}''';
-    Source source = addSource(code);
-    CompilationUnit unit = await _computeResolvedUnit(source);
-    // v
-    FormalParameter vParameter = EngineTestCase.findNode(
-        unit, code, "v)", (node) => node is SimpleFormalParameter);
-    expect(vParameter.identifier.staticType, typeProvider.intType);
-    SimpleIdentifier vIdentifier = EngineTestCase.findNode(
-        unit, code, "v;", (node) => node is SimpleIdentifier);
-    expect(vIdentifier.staticType, typeProvider.intType);
-  }
-
   test_functionExpression_asInvocationArgument_notSubtypeOfStaticType() async {
     String code = r'''
 class A {
@@ -946,50 +873,6 @@
         same(0));
   }
 
-  test_functionExpression_asInvocationArgument_replaceIfMoreSpecific() async {
-    if (previewDart2) {
-      return;
-    }
-    String code = r'''
-class MyList<E> {
-  forEach(f(E value)) {}
-}
-f(MyList<String> list) {
-  list.forEach((Object v) {
-    v;
-  });
-}''';
-    Source source = addSource(code);
-    CompilationUnit unit = await _computeResolvedUnit(source);
-    // v
-    FormalParameter vParameter = EngineTestCase.findNode(
-        unit, code, "v)", (node) => node is SimpleFormalParameter);
-    expect(vParameter.identifier.staticType, typeProvider.objectType);
-  }
-
-  test_initializer() async {
-    if (previewDart2) {
-      return;
-    }
-    Source source = addSource(r'''
-f() {
-  var v = 0;
-  return v;
-}''');
-    CompilationUnit unit = await _computeResolvedUnit(source);
-    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
-    BlockFunctionBody body =
-        function.functionExpression.body as BlockFunctionBody;
-    NodeList<Statement> statements = body.block.statements;
-    // Type of 'v' in declaration.
-    {
-      VariableDeclarationStatement statement =
-          statements[0] as VariableDeclarationStatement;
-      SimpleIdentifier variableName = statement.variables.variables[0].name;
-      expect(variableName.staticType, typeProvider.dynamicType);
-    }
-  }
-
   test_initializer_hasStaticType() async {
     Source source = addSource(r'''
 f() {
@@ -1168,23 +1051,6 @@
     expect(getter.staticType, typeProvider.dynamicType);
   }
 
-  test_objectAccessInference_enabled_for_cascades() async {
-    if (previewDart2) {
-      return;
-    }
-    String name = 'hashCode';
-    String code = '''
-main() {
-  dynamic obj;
-  obj..$name..$name; // marker
-}''';
-    CompilationUnit unit = await resolveSource(code);
-    PropertyAccess access =
-        findMarkedIdentifier(code, unit, "; // marker").parent;
-    expect(access.staticType, typeProvider.dynamicType);
-    expect(access.realTarget.staticType, typeProvider.dynamicType);
-  }
-
   test_objectMethodInference_disabled_for_library_prefix() async {
     String name = 'toString';
     addNamedSource('/helper.dart', '''
@@ -1223,38 +1089,6 @@
     expect(methodInvoke.staticType, typeProvider.dynamicType);
   }
 
-  test_objectMethodInference_enabled_for_cascades() async {
-    if (previewDart2) {
-      return;
-    }
-    String name = 'toString';
-    String code = '''
-main() {
-  dynamic obj;
-  obj..$name()..$name(); // marker
-}''';
-    CompilationUnit unit = await resolveSource(code);
-    SimpleIdentifier methodName =
-        findMarkedIdentifier(code, unit, "(); // marker");
-    MethodInvocation methodInvoke = methodName.parent;
-
-    expect(methodInvoke.staticType, typeProvider.dynamicType);
-    expect(methodInvoke.realTarget.staticType, typeProvider.dynamicType);
-  }
-
-  test_propagatedReturnType_localFunction() async {
-    if (previewDart2) {
-      return;
-    }
-    String code = r'''
-main() {
-  f() => 42;
-  var v = f();
-}''';
-    CompilationUnit unit = await resolveSource(code);
-    assertAssignedType(code, unit, typeProvider.dynamicType);
-  }
-
   /**
    * Return the resolved unit for the given [source].
    *
@@ -1293,6 +1127,7 @@
         _classElement("Iterable", objectType, ["T"]).type;
     InterfaceType listType = _classElement("List", objectType, ["E"]).type;
     InterfaceType mapType = _classElement("Map", objectType, ["K", "V"]).type;
+    InterfaceType setType = _classElement("Set", objectType, ["E"]).type;
     InterfaceType stackTraceType = _classElement("StackTrace", objectType).type;
     InterfaceType streamType = _classElement("Stream", objectType, ["T"]).type;
     InterfaceType stringType = _classElement("String", objectType).type;
@@ -1307,24 +1142,28 @@
       iterableType.element,
       listType.element,
       mapType.element,
+      setType.element,
       objectType.element,
       stackTraceType.element,
       stringType.element,
       symbolType.element,
       typeType.element
     ];
+    coreUnit.source = new TestSource('dart:core');
+    coreUnit.librarySource = coreUnit.source;
     CompilationUnitElementImpl asyncUnit = new CompilationUnitElementImpl();
     asyncUnit.types = <ClassElement>[
       futureType.element,
       futureOrType.element,
       streamType.element
     ];
-    AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
+    asyncUnit.source = new TestSource('dart:async');
+    asyncUnit.librarySource = asyncUnit.source;
     LibraryElementImpl coreLibrary = new LibraryElementImpl.forNode(
-        context, AstTestFactory.libraryIdentifier2(["dart.core"]));
+        null, null, AstTestFactory.libraryIdentifier2(["dart.core"]));
     coreLibrary.definingCompilationUnit = coreUnit;
     LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode(
-        context, AstTestFactory.libraryIdentifier2(["dart.async"]));
+        null, null, AstTestFactory.libraryIdentifier2(["dart.async"]));
     asyncLibrary.definingCompilationUnit = asyncUnit;
     //
     // Create a type provider and ensure that it can return the expected types.
@@ -1425,7 +1264,7 @@
         resourceProvider: resourceProvider);
     Source librarySource = new FileSource(getFile("/lib.dart"));
     LibraryElementImpl element = new LibraryElementImpl.forNode(
-        context, AstTestFactory.libraryIdentifier2(["lib"]));
+        context, null, AstTestFactory.libraryIdentifier2(["lib"]));
     element.definingCompilationUnit = new CompilationUnitElementImpl();
     _typeProvider = new TestTypeProvider();
     libraryScope = new LibraryScope(element);
@@ -1462,7 +1301,7 @@
       InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
           resourceProvider: resourceProvider);
       var source = getFile('/test.dart').createSource();
-      var libraryElement = new LibraryElementImpl.forNode(context, null)
+      var libraryElement = new LibraryElementImpl.forNode(context, null, null)
         ..definingCompilationUnit = unitElement;
       var libraryScope = new LibraryScope(libraryElement);
       var visitor = new TypeResolverVisitor(
@@ -1893,13 +1732,13 @@
         null, "A", null, extendsClause, withClause, implementsClause);
     declaration.name.staticElement = elementA;
     _resolveNode(declaration, [elementA, elementB, elementC, elementD]);
-    expect(elementA.supertype, same(elementB.type));
+    expect(elementA.supertype, elementB.type);
     List<InterfaceType> mixins = elementA.mixins;
     expect(mixins, hasLength(1));
-    expect(mixins[0], same(elementC.type));
+    expect(mixins[0], elementC.type);
     List<InterfaceType> interfaces = elementA.interfaces;
     expect(interfaces, hasLength(1));
-    expect(interfaces[0], same(elementD.type));
+    expect(interfaces[0], elementD.type);
     _listener.assertNoErrors();
   }
 
@@ -1920,7 +1759,7 @@
         null, "B", null, extendsClause, null, null);
     declaration.name.staticElement = elementB;
     _resolveNode(declaration, [elementA, elementB]);
-    expect(elementB.supertype, same(elementA.type));
+    expect(elementB.supertype, elementA.type);
     _listener.assertNoErrors();
   }
 
@@ -1946,7 +1785,7 @@
     pElement.type = pType;
 
     _resolveFormalParameter(pNode, [intType.element]);
-    expect(pType.returnType, same(intType));
+    expect(pType.returnType, intType);
     expect(pType.parameters, hasLength(1));
     _listener.assertNoErrors();
   }
@@ -1969,7 +1808,7 @@
         AstTestFactory.fieldFormalParameter(null, intTypeName, parameterName);
     node.identifier.staticElement =
         ElementFactory.requiredParameter(parameterName);
-    expect(_resolveFormalParameter(node, [intType.element]), same(intType));
+    expect(_resolveFormalParameter(node, [intType.element]), intType);
     _listener.assertNoErrors();
   }
 
@@ -2178,7 +2017,7 @@
     SimpleIdentifier identifier = node.identifier;
     ParameterElementImpl element = new ParameterElementImpl.forNode(identifier);
     node.declaredElement = identifier.staticElement = element;
-    expect(_resolveFormalParameter(node, [intElement]), same(intType));
+    expect(_resolveFormalParameter(node, [intElement]), intType);
     _listener.assertNoErrors();
   }
 
@@ -2187,7 +2026,7 @@
     TypeName typeName = AstTestFactory.typeName(classA);
     typeName.type = null;
     _resolveNode(typeName, [classA]);
-    expect(typeName.type, same(classA.type));
+    expect(typeName.type, classA.type);
     _listener.assertNoErrors();
   }
 
@@ -2212,7 +2051,7 @@
     expect(resultType.element, same(classA));
     List<DartType> resultArguments = resultType.typeArguments;
     expect(resultArguments, hasLength(1));
-    expect(resultArguments[0], same(classB.type));
+    expect(resultArguments[0], classB.type);
     _listener.assertNoErrors();
   }
 
@@ -2268,11 +2107,11 @@
     _resolveNode(node, definedElements);
     SimpleIdentifier exceptionParameter = node.exceptionParameter;
     if (exceptionParameter != null) {
-      expect(exceptionParameter.staticType, same(exceptionType));
+      expect(exceptionParameter.staticType, exceptionType);
     }
     SimpleIdentifier stackTraceParameter = node.stackTraceParameter;
     if (stackTraceParameter != null) {
-      expect(stackTraceParameter.staticType, same(stackTraceType));
+      expect(stackTraceParameter.staticType, stackTraceType);
     }
   }
 
@@ -2332,7 +2171,7 @@
       InternalAnalysisContext context = AnalysisContextFactory.contextWithCore(
           resourceProvider: resourceProvider);
       var source = getFile('/test.dart').createSource();
-      var libraryElement = new LibraryElementImpl.forNode(context, null)
+      var libraryElement = new LibraryElementImpl.forNode(context, null, null)
         ..definingCompilationUnit = unitElement;
       libraryScope = new LibraryScope(libraryElement);
       visitor = new TypeResolverVisitor(
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index d7a954d..a682c9d 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -1,9 +1,10 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
@@ -11,9 +12,10 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -26,19 +28,20 @@
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 
-import '../src/context/mock_sdk.dart';
 import 'analysis_context_factory.dart';
 import 'test_support.dart';
 
+const String _defaultSourceName = "/test.dart";
+
 /**
  * An AST visitor used to verify that all of the nodes in an AST structure that
  * should have been resolved were resolved.
  */
-class ResolutionVerifier extends RecursiveAstVisitor<Object> {
+class ResolutionVerifier extends RecursiveAstVisitor<void> {
   /**
    * A set containing nodes that are known to not be resolvable and should
    * therefore not cause the test to fail.
@@ -88,7 +91,7 @@
   }
 
   @override
-  Object visitAnnotation(Annotation node) {
+  void visitAnnotation(Annotation node) {
     node.visitChildren(this);
     ElementAnnotation elementAnnotation = node.elementAnnotation;
     if (elementAnnotation == null) {
@@ -98,154 +101,153 @@
     } else if (elementAnnotation is! ElementAnnotation) {
       _wrongTypedNodes.add(node);
     }
-    return null;
   }
 
   @override
-  Object visitBinaryExpression(BinaryExpression node) {
+  void visitBinaryExpression(BinaryExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
-      return null;
+      return;
     }
     DartType operandType = node.leftOperand.staticType;
     if (operandType == null || operandType.isDynamic) {
-      return null;
+      return;
     }
-    return _checkResolved(
-        node, node.staticElement, (node) => node is MethodElement);
+    _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
   @override
-  Object visitCommentReference(CommentReference node) => null;
+  void visitCommentReference(CommentReference node) {}
 
   @override
-  Object visitCompilationUnit(CompilationUnit node) {
+  void visitCompilationUnit(CompilationUnit node) {
     node.visitChildren(this);
-    return _checkResolved(
+    _checkResolved(
         node, node.declaredElement, (node) => node is CompilationUnitElement);
   }
 
   @override
-  Object visitExportDirective(ExportDirective node) =>
-      _checkResolved(node, node.element, (node) => node is ExportElement);
+  void visitExportDirective(ExportDirective node) {
+    _checkResolved(node, node.element, (node) => node is ExportElement);
+  }
 
   @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
+  void visitFunctionDeclaration(FunctionDeclaration node) {
     node.visitChildren(this);
     if (node.declaredElement is LibraryElement) {
       _wrongTypedNodes.add(node);
     }
-    return null;
   }
 
   @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     node.visitChildren(this);
     // TODO(brianwilkerson) If we start resolving function expressions, then
     // conditionally check to see whether the node was resolved correctly.
-    return null;
     //checkResolved(node, node.getElement(), FunctionElement.class);
   }
 
   @override
-  Object visitImportDirective(ImportDirective node) {
+  void visitImportDirective(ImportDirective node) {
     // Not sure how to test the combinators given that it isn't an error if the
     // names are not defined.
     _checkResolved(node, node.element, (node) => node is ImportElement);
     SimpleIdentifier prefix = node.prefix;
     if (prefix == null) {
-      return null;
+      return;
     }
-    return _checkResolved(
+    _checkResolved(
         prefix, prefix.staticElement, (node) => node is PrefixElement);
   }
 
   @override
-  Object visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(IndexExpression node) {
     node.visitChildren(this);
     DartType targetType = node.realTarget.staticType;
     if (targetType == null || targetType.isDynamic) {
-      return null;
+      return;
     }
-    return _checkResolved(
-        node, node.staticElement, (node) => node is MethodElement);
+    _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
   @override
-  Object visitLibraryDirective(LibraryDirective node) =>
-      _checkResolved(node, node.element, (node) => node is LibraryElement);
+  void visitLibraryDirective(LibraryDirective node) {
+    _checkResolved(node, node.element, (node) => node is LibraryElement);
+  }
 
   @override
-  Object visitNamedExpression(NamedExpression node) =>
-      node.expression.accept(this);
+  void visitNamedExpression(NamedExpression node) {
+    node.expression.accept(this);
+  }
 
   @override
-  Object visitPartDirective(PartDirective node) => _checkResolved(
-      node, node.element, (node) => node is CompilationUnitElement);
+  void visitPartDirective(PartDirective node) {
+    _checkResolved(
+        node, node.element, (node) => node is CompilationUnitElement);
+  }
 
   @override
-  Object visitPartOfDirective(PartOfDirective node) =>
-      _checkResolved(node, node.element, (node) => node is LibraryElement);
+  void visitPartOfDirective(PartOfDirective node) {
+    _checkResolved(node, node.element, (node) => node is LibraryElement);
+  }
 
   @override
-  Object visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(PostfixExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
-      return null;
+      return;
     }
     DartType operandType = node.operand.staticType;
     if (operandType == null || operandType.isDynamic) {
-      return null;
+      return;
     }
-    return _checkResolved(
-        node, node.staticElement, (node) => node is MethodElement);
+    _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
   @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(PrefixedIdentifier node) {
     SimpleIdentifier prefix = node.prefix;
     prefix.accept(this);
     DartType prefixType = prefix.staticType;
     if (prefixType == null || prefixType.isDynamic) {
-      return null;
+      return;
     }
-    return _checkResolved(node, node.staticElement, null);
+    _checkResolved(node, node.staticElement, null);
   }
 
   @override
-  Object visitPrefixExpression(PrefixExpression node) {
+  void visitPrefixExpression(PrefixExpression node) {
     node.visitChildren(this);
     if (!node.operator.isUserDefinableOperator) {
-      return null;
+      return;
     }
     DartType operandType = node.operand.staticType;
     if (operandType == null || operandType.isDynamic) {
-      return null;
+      return;
     }
-    return _checkResolved(
-        node, node.staticElement, (node) => node is MethodElement);
+    _checkResolved(node, node.staticElement, (node) => node is MethodElement);
   }
 
   @override
-  Object visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
     target.accept(this);
     DartType targetType = target.staticType;
     if (targetType == null || targetType.isDynamic) {
-      return null;
+      return;
     }
-    return node.propertyName.accept(this);
+    node.propertyName.accept(this);
   }
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.name == "void") {
-      return null;
+      return;
     }
     if (resolutionMap.staticTypeForExpression(node) != null &&
         resolutionMap.staticTypeForExpression(node).isDynamic &&
         node.staticElement == null) {
-      return null;
+      return;
     }
     AstNode parent = node.parent;
     if (parent is MethodInvocation) {
@@ -254,14 +256,14 @@
         Expression target = invocation.realTarget;
         DartType targetType = target == null ? null : target.staticType;
         if (targetType == null || targetType.isDynamic) {
-          return null;
+          return;
         }
       }
     }
-    return _checkResolved(node, node.staticElement, null);
+    _checkResolved(node, node.staticElement, null);
   }
 
-  Object _checkResolved(
+  void _checkResolved(
       AstNode node, Element element, Predicate<Element> predicate) {
     if (element == null) {
       if (_knownExceptions == null || !_knownExceptions.contains(node)) {
@@ -272,7 +274,6 @@
         _wrongTypedNodes.add(node);
       }
     }
-    return null;
   }
 
   String _getFileName(AstNode node) {
@@ -310,12 +311,7 @@
   }
 }
 
-class ResolverTestCase extends EngineTestCase {
-  /**
-   * The resource provider used by the test case.
-   */
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class ResolverTestCase extends EngineTestCase with ResourceProviderMixin {
   /**
    * The analysis context used to parse the compilation units being resolved.
    */
@@ -348,10 +344,13 @@
    */
   AnalysisOptions get defaultAnalysisOptions => new AnalysisOptionsImpl();
 
-  bool get enableNewAnalysisDriver => false;
+  /**
+   * Return the list of experiments that are to be enabled for tests in this
+   * class.
+   */
+  List<String> get enabledExperiments => null;
 
-  /// TODO(brianwilkerson) Remove this getter.
-  bool get previewDart2 => true;
+  bool get enableNewAnalysisDriver => false;
 
   /**
    * Return a type provider that can be used to test the results of resolution.
@@ -362,7 +361,7 @@
   TypeProvider get typeProvider {
     if (enableNewAnalysisDriver) {
       if (analysisResults.isEmpty) {
-        fail('typeProvider can be called after computing an analysis result.');
+        fail('typeProvider called before computing an analysis result.');
       }
       return analysisResults
           .values.first.unit.declaredElement.context.typeProvider;
@@ -373,10 +372,17 @@
 
   /**
    * Return a type system that can be used to test the results of resolution.
-   *
-   * @return a type system
    */
-  TypeSystem get typeSystem => analysisContext2.typeSystem;
+  TypeSystem get typeSystem {
+    if (enableNewAnalysisDriver) {
+      if (analysisResults.isEmpty) {
+        fail('typeSystem called before computing an analysis result.');
+      }
+      return analysisResults.values.first.typeSystem;
+    } else {
+      return analysisContext2.typeSystem;
+    }
+  }
 
   /**
    * Add a source file with the given [filePath] in the root of the file system.
@@ -384,8 +390,8 @@
    * set in the content provider. Return the source representing the added file.
    */
   Source addNamedSource(String filePath, String contents) {
-    filePath = resourceProvider.convertPath(filePath);
-    File file = resourceProvider.newFile(filePath, contents);
+    filePath = convertPath(filePath);
+    File file = newFile(filePath, content: contents);
     Source source = file.createSource();
     if (enableNewAnalysisDriver) {
       driver.addFile(filePath);
@@ -403,7 +409,8 @@
    * file will have the given [contents] set in the content provider. Return the
    * source representing the added file.
    */
-  Source addSource(String contents) => addNamedSource("/test.dart", contents);
+  Source addSource(String contents) =>
+      addNamedSource(_defaultSourceName, contents);
 
   /**
    * The [code] that assigns the value to the variable "v", no matter how. We
@@ -452,9 +459,9 @@
    * Like [assertErrors], but takes a string of source code.
    */
   // TODO(rnystrom): Use this in more tests that have the same structure.
-  Future<Null> assertErrorsInCode(String code, List<ErrorCode> errors,
-      {bool verify: true}) async {
-    Source source = addSource(code);
+  Future<void> assertErrorsInCode(String code, List<ErrorCode> errors,
+      {bool verify: true, String sourceName: _defaultSourceName}) async {
+    Source source = addNamedSource(sourceName, code);
     await computeAnalysisResult(source);
     assertErrors(source, errors);
     if (verify) {
@@ -467,7 +474,7 @@
    *
    * Like [assertErrors], but takes a string of source code.
    */
-  Future<Null> assertErrorsInUnverifiedCode(
+  Future<void> assertErrorsInUnverifiedCode(
       String code, List<ErrorCode> errors) async {
     Source source = addSource(code);
     await computeAnalysisResult(source);
@@ -489,7 +496,7 @@
    * Asserts that [code] has no errors or warnings.
    */
   // TODO(rnystrom): Use this in more tests that have the same structure.
-  Future<Null> assertNoErrorsInCode(String code) async {
+  Future<void> assertNoErrorsInCode(String code) async {
     Source source = addSource(code);
     await computeAnalysisResult(source);
     assertNoErrors(source);
@@ -529,9 +536,9 @@
   Future<TestAnalysisResult> computeAnalysisResult(Source source) async {
     TestAnalysisResult analysisResult;
     if (enableNewAnalysisDriver) {
-      AnalysisResult result = await driver.getResult(source.fullName);
-      analysisResult =
-          new TestAnalysisResult(source, result.unit, result.errors);
+      ResolvedUnitResult result = await driver.getResult(source.fullName);
+      analysisResult = new TestAnalysisResult(
+          source, result.unit, result.errors, result.typeSystem);
     } else {
       analysisContext2.computeKindOf(source);
       List<Source> libraries = analysisContext2.getLibrariesContaining(source);
@@ -539,7 +546,8 @@
         CompilationUnit unit =
             analysisContext.resolveCompilationUnit2(source, libraries.first);
         List<AnalysisError> errors = analysisContext.computeErrors(source);
-        analysisResult = new TestAnalysisResult(source, unit, errors);
+        analysisResult = new TestAnalysisResult(
+            source, unit, errors, analysisContext2.typeSystem);
       }
     }
     analysisResults[source] = analysisResult;
@@ -570,7 +578,7 @@
    * give it an empty content. Return the source that was created.
    */
   Source createNamedSource(String fileName) {
-    Source source = resourceProvider.getFile(fileName).createSource();
+    Source source = getFile(fileName).createSource();
     analysisContext2.setContents(source, '');
     return source;
   }
@@ -585,7 +593,7 @@
   LibraryElementImpl createTestLibrary(
       AnalysisContext context, String libraryName,
       [List<String> typeNames]) {
-    String fileName = resourceProvider.convertPath("/test/$libraryName.dart");
+    String fileName = convertPath("/test/$libraryName.dart");
     Source definingCompilationUnitSource = createNamedSource(fileName);
     List<CompilationUnitElement> sourcedCompilationUnits;
     if (typeNames == null) {
@@ -611,7 +619,9 @@
     compilationUnit.librarySource =
         compilationUnit.source = definingCompilationUnitSource;
     LibraryElementImpl library = new LibraryElementImpl.forNode(
-        context, AstTestFactory.libraryIdentifier2([libraryName]));
+        context,
+        driver?.currentSession,
+        AstTestFactory.libraryIdentifier2([libraryName]));
     library.definingCompilationUnit = compilationUnit;
     library.parts = sourcedCompilationUnits;
     return library;
@@ -662,6 +672,10 @@
       fail('Only packages or options can be specified.');
     }
     options ??= defaultAnalysisOptions;
+    List<String> experiments = enabledExperiments;
+    if (experiments != null) {
+      (options as AnalysisOptionsImpl).enabledExperiments = experiments;
+    }
     if (enableNewAnalysisDriver) {
       DartSdk sdk = new MockSdk(resourceProvider: resourceProvider)
         ..context.analysisOptions = options;
@@ -674,10 +688,8 @@
         var packageMap = <String, List<Folder>>{};
         packages.forEach((args) {
           String name = args[0];
-          String path =
-              resourceProvider.convertPath('/packages/$name/$name.dart');
           String content = args[1];
-          File file = resourceProvider.newFile(path, content);
+          File file = newFile('/packages/$name/$name.dart', content: content);
           packageMap[name] = <Folder>[file.parent];
         });
         resolvers.add(new PackageMapUriResolver(resourceProvider, packageMap));
@@ -702,7 +714,7 @@
         packages.forEach((args) {
           String name = args[0];
           String content = args[1];
-          packageMap['package:$name/$name.dart'] = content;
+          packageMap[name] = content;
         });
         analysisContext2 = AnalysisContextFactory.contextWithCoreAndPackages(
             packageMap,
@@ -764,7 +776,7 @@
     return null;
   }
 
-  Future<Null> resolveWithAndWithoutExperimental(
+  Future<void> resolveWithAndWithoutExperimental(
       List<String> strSources,
       List<ErrorCode> codesWithoutExperimental,
       List<ErrorCode> codesWithExperimental) async {
@@ -786,7 +798,7 @@
     verify([source]);
   }
 
-  Future<Null> resolveWithErrors(
+  Future<void> resolveWithErrors(
       List<String> strSources, List<ErrorCode> codes) async {
     Source source = await resolveSources(strSources);
     assertErrors(source, codes);
@@ -832,6 +844,19 @@
   CompilationUnit testUnit;
 
   /**
+   * Find the expression that starts at the offset of [search] and validate its
+   * that its static type matches the given [type].
+   *
+   * If [type] is a string, validates that the expression's static type
+   * stringifies to that text. Otherwise, [type] is used directly a [Matcher]
+   * to match the type.
+   */
+  void expectExpressionType(String search, type) {
+    Expression expression = findExpression(search);
+    _expectType(expression.staticType, type);
+  }
+
+  /**
    * Looks up the identifier with [name] and validates that its type type
    * stringifies to [type] and that its generics match the given stringified
    * output.
@@ -889,18 +914,22 @@
   void expectInitializerType(String name, type) {
     SimpleIdentifier identifier = findIdentifier(name);
     VariableDeclaration declaration =
-        identifier.getAncestor((node) => node is VariableDeclaration);
+        identifier.thisOrAncestorOfType<VariableDeclaration>();
     Expression initializer = declaration.initializer;
     _expectType(initializer.staticType, type);
   }
 
-  SimpleIdentifier findIdentifier(String search) {
-    SimpleIdentifier identifier = EngineTestCase.findNode(
-        testUnit, testCode, search, (node) => node is SimpleIdentifier);
-    return identifier;
+  Expression findExpression(String search) {
+    return EngineTestCase.findNode(
+        testUnit, testCode, search, (node) => node is Expression);
   }
 
-  Future<Null> resolveTestUnit(String code, {bool noErrors: true}) async {
+  SimpleIdentifier findIdentifier(String search) {
+    return EngineTestCase.findNode(
+        testUnit, testCode, search, (node) => node is SimpleIdentifier);
+  }
+
+  Future<void> resolveTestUnit(String code, {bool noErrors: true}) async {
     testCode = code;
     testSource = addSource(testCode);
     TestAnalysisResult analysisResult = await computeAnalysisResult(testSource);
@@ -930,6 +959,7 @@
   final Source source;
   final CompilationUnit unit;
   final List<AnalysisError> errors;
+  final TypeSystem typeSystem;
 
-  TestAnalysisResult(this.source, this.unit, this.errors);
+  TestAnalysisResult(this.source, this.unit, this.errors, this.typeSystem);
 }
diff --git a/pkg/analyzer/test/generated/sdk_test.dart b/pkg/analyzer/test/generated/sdk_test.dart
index f311ea9..6dae63b 100644
--- a/pkg/analyzer/test/generated/sdk_test.dart
+++ b/pkg/analyzer/test/generated/sdk_test.dart
@@ -4,10 +4,11 @@
 
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/context/mock_sdk.dart';
 import 'test_support.dart';
 
 main() {
@@ -18,14 +19,14 @@
 }
 
 @reflectiveTest
-class DartSdkManagerTest extends EngineTestCase {
+class DartSdkManagerTest extends EngineTestCase with ResourceProviderMixin {
   void test_anySdk() {
     DartSdkManager manager = new DartSdkManager('/a/b/c', false);
     expect(manager.anySdk, isNull);
 
     AnalysisOptions options = new AnalysisOptionsImpl();
     SdkDescription description = new SdkDescription(<String>['/c/d'], options);
-    DartSdk sdk = new MockSdk();
+    DartSdk sdk = new MockSdk(resourceProvider: resourceProvider);
     manager.getSdk(description, () => sdk);
     expect(manager.anySdk, same(sdk));
   }
@@ -34,11 +35,11 @@
     DartSdkManager manager = new DartSdkManager('/a/b/c', false);
     AnalysisOptions options = new AnalysisOptionsImpl();
     SdkDescription description1 = new SdkDescription(<String>['/c/d'], options);
-    DartSdk sdk1 = new MockSdk();
+    DartSdk sdk1 = new MockSdk(resourceProvider: resourceProvider);
     DartSdk result1 = manager.getSdk(description1, () => sdk1);
     expect(result1, same(sdk1));
     SdkDescription description2 = new SdkDescription(<String>['/e/f'], options);
-    DartSdk sdk2 = new MockSdk();
+    DartSdk sdk2 = new MockSdk(resourceProvider: resourceProvider);
     DartSdk result2 = manager.getSdk(description2, () => sdk2);
     expect(result2, same(sdk2));
 
@@ -50,7 +51,7 @@
     DartSdkManager manager = new DartSdkManager('/a/b/c', false);
     AnalysisOptions options = new AnalysisOptionsImpl();
     SdkDescription description = new SdkDescription(<String>['/c/d'], options);
-    DartSdk sdk = new MockSdk();
+    DartSdk sdk = new MockSdk(resourceProvider: resourceProvider);
     DartSdk result = manager.getSdk(description, () => sdk);
     expect(result, same(sdk));
     manager.getSdk(description, _failIfAbsent);
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 3d64b48..91bb80a 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -142,7 +142,7 @@
     }
     // get parameter
     Expression rhs = assignment.rightHandSide;
-    expect(rhs.staticParameterElement, previewDart2 ? isNotNull : isNull);
+    expect(rhs.staticParameterElement, isNotNull);
   }
 
   test_argumentResolution_setter_propagated_propertyAccess() async {
@@ -166,7 +166,7 @@
     }
     // get parameter
     Expression rhs = assignment.rightHandSide;
-    expect(rhs.staticParameterElement, previewDart2 ? isNotNull : isNull);
+    expect(rhs.staticParameterElement, isNotNull);
   }
 
   test_argumentResolution_setter_static() async {
@@ -376,42 +376,6 @@
     verify([source]);
   }
 
-  test_commentReference_class() async {
-    Source source = addSource(r'''
-f() {}
-/** [A] [new A] [A.n] [new A.n] [m] [f] */
-class A {
-  A() {}
-  A.n() {}
-  m() {}
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_commentReference_parameter() async {
-    Source source = addSource(r'''
-class A {
-  A() {}
-  A.n() {}
-  /** [e] [f] */
-  m(e, f()) {}
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_commentReference_singleLine() async {
-    Source source = addSource(r'''
-/// [A]
-class A {}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
   test_continueTarget_labeled() async {
     // Verify that the target of the label is correctly found and is recorded
     // as the unlabeled portion of the statement.
@@ -1165,20 +1129,19 @@
     await computeAnalysisResult(source);
     assertNoErrors(source);
     verify([source]);
+
     CompilationUnit unit = resolveCompilationUnit(source, library);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(2));
-    Element expectedElement = (declarations[0] as TopLevelVariableDeclaration)
-        .variables
-        .variables[0]
-        .name
-        .staticElement;
-    EngineTestCase.assertInstanceOf((obj) => obj is PropertyInducingElement,
-        PropertyInducingElement, expectedElement);
-    expectedElement = (expectedElement as PropertyInducingElement).getter;
-    Element actualElement =
-        (declarations[1] as ClassDeclaration).metadata[0].name.staticElement;
-    expect(actualElement, same(expectedElement));
+
+    TopLevelVariableDeclaration variableDeclaration = declarations[0];
+    ClassDeclaration classDeclaration = declarations[1];
+
+    PropertyInducingElement expectedElement =
+        variableDeclaration.variables.variables[0].name.staticElement;
+
+    Element actualElement = classDeclaration.metadata[0].name.staticElement;
+    expect(actualElement, same(expectedElement.getter));
   }
 
   test_metadata_field() async {
@@ -1371,17 +1334,15 @@
     CompilationUnit unit = resolveCompilationUnit(source, library);
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(2));
-    Element expectedElement = (declarations[0] as TopLevelVariableDeclaration)
-        .variables
-        .variables[0]
-        .name
-        .staticElement;
-    EngineTestCase.assertInstanceOf((obj) => obj is PropertyInducingElement,
-        PropertyInducingElement, expectedElement);
-    expectedElement = (expectedElement as PropertyInducingElement).getter;
-    Element actualElement =
-        (declarations[1] as FunctionTypeAlias).metadata[0].name.staticElement;
-    expect(actualElement, same(expectedElement));
+
+    TopLevelVariableDeclaration variableDeclaration = declarations[0];
+    FunctionTypeAlias functionTypeAlias = declarations[1];
+
+    PropertyInducingElement expectedElement =
+        variableDeclaration.variables.variables[0].name.staticElement;
+
+    Element actualElement = functionTypeAlias.metadata[0].name.staticElement;
+    expect(actualElement, same(expectedElement.getter));
   }
 
   test_method_fromMixin() async {
@@ -1717,7 +1678,7 @@
 }
 
 class _SimpleResolverTest_localVariable_types_invoked
-    extends RecursiveAstVisitor<Object> {
+    extends RecursiveAstVisitor<void> {
   final SimpleResolverTest test;
 
   List<bool> found;
@@ -1729,25 +1690,19 @@
       : super();
 
   @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
+  void visitSimpleIdentifier(SimpleIdentifier node) {
     if (node.name == "myVar" && node.parent is MethodInvocation) {
       try {
         found[0] = true;
         // check static type
         DartType staticType = node.staticType;
-        if (test.previewDart2) {
-          expect(staticType is FunctionType, isTrue);
-          FunctionType functionType = staticType;
-          expect(
-              functionType.parameters[0].type, same(test.typeProvider.intType));
-          expect(functionType.returnType, same(test.typeProvider.stringType));
-        } else {
-          expect(staticType, same(test.typeProvider.dynamicType));
-        }
+        expect(staticType is FunctionType, isTrue);
+        FunctionType functionType = staticType;
+        expect(functionType.parameters[0].type, test.typeProvider.intType);
+        expect(functionType.returnType, test.typeProvider.stringType);
       } on AnalysisException catch (e, stackTrace) {
         thrownException[0] = new CaughtException(e, stackTrace);
       }
     }
-    return null;
   }
 }
diff --git a/pkg/analyzer/test/generated/source_factory_test.dart b/pkg/analyzer/test/generated/source_factory_test.dart
index 09a3c10..767de68 100644
--- a/pkg/analyzer/test/generated/source_factory_test.dart
+++ b/pkg/analyzer/test/generated/source_factory_test.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/source_resource.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/packages_file.dart' as pkgfile show parse;
 import 'package:package_config/src/packages_impl.dart';
@@ -217,9 +218,7 @@
 }
 
 @reflectiveTest
-class SourceFactoryTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class SourceFactoryTest with ResourceProviderMixin {
   void test_creation() {
     expect(new SourceFactory([]), isNotNull);
   }
@@ -252,12 +251,11 @@
   void test_resolveUri_nonAbsolute_absolute() {
     SourceFactory factory =
         new SourceFactory([new AbsoluteUriResolver(resourceProvider)]);
-    String sourcePath = resourceProvider.convertPath('/does/not/exist.dart');
+    String sourcePath = convertPath('/does/not/exist.dart');
     String targetRawPath = '/does/not/matter.dart';
-    String targetPath = resourceProvider.convertPath(targetRawPath);
-    String targetUri =
-        resourceProvider.pathContext.toUri(targetRawPath).toString();
-    Source sourceSource = new FileSource(resourceProvider.getFile(sourcePath));
+    String targetPath = convertPath(targetRawPath);
+    String targetUri = toUri(targetRawPath).toString();
+    Source sourceSource = new FileSource(getFile(sourcePath));
     Source result = factory.resolveUri(sourceSource, targetUri);
     expect(result.fullName, targetPath);
   }
@@ -265,10 +263,9 @@
   void test_resolveUri_nonAbsolute_relative() {
     SourceFactory factory =
         new SourceFactory([new AbsoluteUriResolver(resourceProvider)]);
-    String path = _p('/does/not/have.dart');
-    Source containingSource = new FileSource(resourceProvider.getFile(path));
+    Source containingSource = new FileSource(getFile('/does/not/have.dart'));
     Source result = factory.resolveUri(containingSource, 'exist.dart');
-    expect(result.fullName, _p('/does/not/exist.dart'));
+    expect(result.fullName, convertPath('/does/not/exist.dart'));
   }
 
   void test_resolveUri_nonAbsolute_relative_package() {
@@ -301,8 +298,8 @@
   }
 
   void test_restoreUri() {
-    File file1 = resourceProvider.getFile(_p("/some/file1.dart"));
-    File file2 = resourceProvider.getFile(_p("/some/file2.dart"));
+    File file1 = getFile("/some/file1.dart");
+    File file2 = getFile("/some/file2.dart");
     Source source1 = new FileSource(file1);
     Source source2 = new FileSource(file2);
     Uri expected1 = Uri.parse("file:///my_file.dart");
@@ -311,11 +308,6 @@
     expect(factory.restoreUri(source1), same(expected1));
     expect(factory.restoreUri(source2), same(null));
   }
-
-  /**
-   * Return the [resourceProvider] specific path for the given Posix [path].
-   */
-  String _p(String path) => resourceProvider.convertPath(path);
 }
 
 class UriResolver_absolute extends UriResolver {
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 8995879..fe9cb89 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,11 +8,13 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -31,8 +33,11 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(SetLiteralsTest);
     defineReflectiveTests(StaticTypeAnalyzerTest);
     defineReflectiveTests(StaticTypeAnalyzer2Test);
+    defineReflectiveTests(StaticTypeAnalyzer3Test);
+    defineReflectiveTests(StaticTypeAnalyzerWithSetLiteralsTest);
   });
 }
 
@@ -45,6 +50,27 @@
   fail(message);
 }
 
+@reflectiveTest
+class SetLiteralsTest extends StaticTypeAnalyzer2TestShared {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_emptySetLiteral_parameter_typed() async {
+    String code = r'''
+main() {
+  useSet({});
+}
+void useSet(Set<int> s) {
+}
+''';
+    await resolveTestUnit(code);
+    expectExpressionType('{}', 'Set<int>');
+  }
+}
+
 /**
  * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
  */
@@ -57,7 +83,7 @@
 }
 ''';
     await resolveTestUnit(code);
-    expectInitializerType('foo', previewDart2 ? 'int' : 'dynamic');
+    expectInitializerType('foo', 'int');
   }
 
   test_FunctionExpressionInvocation_curried() async {
@@ -117,11 +143,7 @@
 }
 """;
     await resolveTestUnit(code);
-    if (previewDart2) {
-      expectIdentifierType("p()", '() → dynamic');
-    } else {
-      expectIdentifierType("p()", DynamicTypeImpl.instance);
-    }
+    expectIdentifierType("p()", '() → dynamic');
   }
 
   test_staticMethods_classTypeParameters() async {
@@ -156,7 +178,7 @@
       FunctionTypeImpl type = expectFunctionType('m);', '<S>(S) → void',
           elementTypeParams: '[S]',
           typeFormals: '[S]',
-          identifierType: previewDart2 ? '<S>(S) → void' : '(dynamic) → void');
+          identifierType: '<S>(S) → void');
 
       typeS = type.typeFormals[0].type;
       type = type.instantiate([DynamicTypeImpl.instance]);
@@ -172,8 +194,7 @@
           typeParams: '[S]',
           typeArgs: '[S]',
           typeFormals: '[U]',
-          identifierType:
-              previewDart2 ? '<U>(S, U) → void' : '(S, dynamic) → void');
+          identifierType: '<U>(S, U) → void');
 
       type = type.instantiate([DynamicTypeImpl.instance]);
       expect(type.toString(), '(S, dynamic) → void');
@@ -184,6 +205,36 @@
   }
 }
 
+/**
+ * End-to-end tests of the static type analyzer that use the new driver.
+ */
+@reflectiveTest
+class StaticTypeAnalyzer3Test extends StaticTypeAnalyzer2TestShared {
+  bool get enableNewAnalysisDriver => true;
+
+  test_emptyMapLiteral_initializer_var() async {
+    String code = r'''
+main() {
+  var v = {};
+}
+''';
+    await resolveTestUnit(code);
+    expectExpressionType('{}', 'Map<dynamic, dynamic>');
+  }
+
+  test_emptyMapLiteral_parameter_typed() async {
+    String code = r'''
+main() {
+  useMap({});
+}
+void useMap(Map<int, int> m) {
+}
+''';
+    await resolveTestUnit(code);
+    expectExpressionType('{}', 'Map<int, int>');
+  }
+}
+
 @reflectiveTest
 class StaticTypeAnalyzerTest extends EngineTestCase with ResourceProviderMixin {
   /**
@@ -206,9 +257,6 @@
    */
   TypeProvider _typeProvider;
 
-  /// TODO(brianwilkerson) Remove this getter.
-  bool get previewDart2 => true;
-
   /**
    * The type system used to analyze the test cases.
    */
@@ -661,8 +709,6 @@
   void test_visitFunctionExpression_async_expression() {
     // () async => e, where e has type int
     InterfaceType intType = _typeProvider.intType;
-    InterfaceType futureIntType =
-        _typeProvider.futureType.instantiate(<DartType>[intType]);
     Expression expression = _resolvedVariable(intType, 'e');
     ExpressionFunctionBody body =
         AstTestFactory.expressionFunctionBody(expression);
@@ -670,17 +716,13 @@
     FunctionExpression node = _resolvedFunctionExpression(
         AstTestFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
-    if (previewDart2) {
-      _assertFunctionType(
-          _typeProvider.futureType
-              .instantiate(<DartType>[_typeProvider.dynamicType]),
-          null,
-          null,
-          null,
-          resultType);
-    } else {
-      _assertFunctionType(futureIntType, null, null, null, resultType);
-    }
+    _assertFunctionType(
+        _typeProvider.futureType
+            .instantiate(<DartType>[_typeProvider.dynamicType]),
+        null,
+        null,
+        null,
+        resultType);
     _listener.assertNoErrors();
   }
 
@@ -696,17 +738,13 @@
     FunctionExpression node = _resolvedFunctionExpression(
         AstTestFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
-    if (previewDart2) {
-      _assertFunctionType(
-          _typeProvider.futureType
-              .instantiate(<DartType>[_typeProvider.dynamicType]),
-          null,
-          null,
-          null,
-          resultType);
-    } else {
-      _assertFunctionType(futureIntType, null, null, null, resultType);
-    }
+    _assertFunctionType(
+        _typeProvider.futureType
+            .instantiate(<DartType>[_typeProvider.dynamicType]),
+        null,
+        null,
+        null,
+        resultType);
     _listener.assertNoErrors();
   }
 
@@ -724,17 +762,13 @@
     FunctionExpression node = _resolvedFunctionExpression(
         AstTestFactory.formalParameterList([]), body);
     DartType resultType = _analyze(node);
-    if (previewDart2) {
-      _assertFunctionType(
-          _typeProvider.futureType
-              .instantiate(<DartType>[_typeProvider.dynamicType]),
-          null,
-          null,
-          null,
-          resultType);
-    } else {
-      _assertFunctionType(futureIntType, null, null, null, resultType);
-    }
+    _assertFunctionType(
+        _typeProvider.futureType
+            .instantiate(<DartType>[_typeProvider.dynamicType]),
+        null,
+        null,
+        null,
+        resultType);
     _listener.assertNoErrors();
   }
 
@@ -800,13 +834,8 @@
     DartType resultType = _analyze(node);
     Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p"] = dynamicType;
-    if (previewDart2) {
-      _assertFunctionType(
-          dynamicType, null, null, expectedNamedTypes, resultType);
-    } else {
-      _assertFunctionType(
-          _typeProvider.intType, null, null, expectedNamedTypes, resultType);
-    }
+    _assertFunctionType(
+        dynamicType, null, null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
 
@@ -838,13 +867,8 @@
         AstTestFactory.expressionFunctionBody(_resolvedInteger(0)));
     _analyze5(p);
     DartType resultType = _analyze(node);
-    if (previewDart2) {
-      _assertFunctionType(
-          dynamicType, <DartType>[dynamicType], null, null, resultType);
-    } else {
-      _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType], null,
-          null, resultType);
-    }
+    _assertFunctionType(
+        dynamicType, <DartType>[dynamicType], null, null, resultType);
     _listener.assertNoErrors();
   }
 
@@ -883,13 +907,8 @@
     DartType resultType = _analyze(node);
     Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
-    if (previewDart2) {
-      _assertFunctionType(dynamicType, <DartType>[dynamicType], null,
-          expectedNamedTypes, resultType);
-    } else {
-      _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType], null,
-          expectedNamedTypes, resultType);
-    }
+    _assertFunctionType(dynamicType, <DartType>[dynamicType], null,
+        expectedNamedTypes, resultType);
     _listener.assertNoErrors();
   }
 
@@ -926,13 +945,8 @@
     _analyze5(p1);
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    if (previewDart2) {
-      _assertFunctionType(dynamicType, <DartType>[dynamicType],
-          <DartType>[dynamicType], null, resultType);
-    } else {
-      _assertFunctionType(_typeProvider.intType, <DartType>[dynamicType],
-          <DartType>[dynamicType], null, resultType);
-    }
+    _assertFunctionType(dynamicType, <DartType>[dynamicType],
+        <DartType>[dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
 
@@ -967,13 +981,8 @@
         AstTestFactory.expressionFunctionBody(_resolvedInteger(0)));
     _analyze5(p);
     DartType resultType = _analyze(node);
-    if (previewDart2) {
-      _assertFunctionType(
-          dynamicType, null, <DartType>[dynamicType], null, resultType);
-    } else {
-      _assertFunctionType(_typeProvider.intType, null, <DartType>[dynamicType],
-          null, resultType);
-    }
+    _assertFunctionType(
+        dynamicType, null, <DartType>[dynamicType], null, resultType);
     _listener.assertNoErrors();
   }
 
@@ -1139,16 +1148,9 @@
     // [0]
     Expression node = AstTestFactory.listLiteral([_resolvedInteger(0)]);
     DartType resultType = _analyze(node);
-    if (previewDart2) {
-      _assertType2(
-          _typeProvider.listType.instantiate(<DartType>[_typeProvider.intType]),
-          resultType);
-    } else {
-      _assertType2(
-          _typeProvider.listType
-              .instantiate(<DartType>[_typeProvider.dynamicType]),
-          resultType);
-    }
+    _assertType2(
+        _typeProvider.listType.instantiate(<DartType>[_typeProvider.intType]),
+        resultType);
     _listener.assertNoErrors();
   }
 
@@ -1194,17 +1196,10 @@
     Expression node = AstTestFactory.mapLiteral2(
         [AstTestFactory.mapLiteralEntry("k", _resolvedInteger(0))]);
     DartType resultType = _analyze(node);
-    if (previewDart2) {
-      _assertType2(
-          _typeProvider.mapType.instantiate(
-              <DartType>[_typeProvider.dynamicType, _typeProvider.intType]),
-          resultType);
-    } else {
-      _assertType2(
-          _typeProvider.mapType.instantiate(
-              <DartType>[_typeProvider.dynamicType, _typeProvider.dynamicType]),
-          resultType);
-    }
+    _assertType2(
+        _typeProvider.mapType.instantiate(
+            <DartType>[_typeProvider.dynamicType, _typeProvider.intType]),
+        resultType);
     _listener.assertNoErrors();
   }
 
@@ -1467,9 +1462,7 @@
       List<DartType> expectedOptionalTypes,
       Map<String, DartType> expectedNamedTypes,
       DartType actualType) {
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is FunctionType, FunctionType, actualType);
-    FunctionType functionType = actualType as FunctionType;
+    FunctionType functionType = actualType;
     List<DartType> normalTypes = functionType.normalParameterTypes;
     if (expectedNormalTypes == null) {
       expect(normalTypes, hasLength(0));
@@ -1517,8 +1510,6 @@
 
   void _assertType2(DartType expectedType, DartType actualType) {
     if (expectedType is InterfaceTypeImpl) {
-      EngineTestCase.assertInstanceOf(
-          (obj) => obj is InterfaceTypeImpl, InterfaceTypeImpl, actualType);
       _assertType(expectedType, actualType as InterfaceTypeImpl);
     }
     // TODO(brianwilkerson) Compare other kinds of types then make this a shared
@@ -1545,7 +1536,7 @@
     definingCompilationUnit.librarySource =
         definingCompilationUnit.source = source;
     LibraryElementImpl definingLibrary =
-        new LibraryElementImpl.forNode(context, null);
+        new LibraryElementImpl.forNode(context, null, null);
     definingLibrary.definingCompilationUnit = definingCompilationUnit;
     _typeProvider = context.typeProvider;
     _visitor = new ResolverVisitor(
@@ -1555,7 +1546,7 @@
     return _visitor.typeAnalyzer;
   }
 
-  DartType _flatten(DartType type) => type.flattenFutures(_typeSystem);
+  DartType _flatten(DartType type) => _typeSystem.flatten(type);
 
   /**
    * Return a boolean literal with the given [value] that has been resolved to
@@ -1606,7 +1597,7 @@
     FunctionElementImpl element = new FunctionElementImpl.forNode(null);
     element.parameters = parameterElements;
     element.type = new FunctionTypeImpl(element);
-    node.element = element;
+    (node as FunctionExpressionImpl).declaredElement = element;
     return node;
   }
 
@@ -1667,3 +1658,35 @@
     (element as ParameterElementImpl).type = type;
   }
 }
+
+/**
+ * End-to-end tests of the static type analyzer that use the new driver and
+ * enable the set-literals experiment.
+ */
+@reflectiveTest
+class StaticTypeAnalyzerWithSetLiteralsTest
+    extends StaticTypeAnalyzer2TestShared {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  bool get enableNewAnalysisDriver => true;
+
+  test_emptySetLiteral_inferredFromLinkedHashSet() async {
+    String code = r'''
+import 'dart:collection';
+LinkedHashSet<int> test4() => {};
+''';
+    await resolveTestUnit(code, noErrors: false);
+    expectExpressionType('{}', 'Set<?>');
+    await assertErrorsInCode(code, [StrongModeCode.INVALID_CAST_LITERAL_SET]);
+  }
+
+  test_emptySetLiteral_initializer_typed_nested() async {
+    String code = r'''
+Set<Set<int>> ints = {{}};
+''';
+    await resolveTestUnit(code);
+    expectExpressionType('{}', 'Set<int>');
+    expectExpressionType('{{}}', 'Set<Set<int>>');
+  }
+}
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
index e4f9e69..5c1f94b 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -2,12 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_core.dart' show formatList;
 import 'package:analyzer/src/generated/source_io.dart';
-import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'resolver_test_case.dart';
@@ -30,21 +27,6 @@
 }''', [StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT]);
   }
 
-  test_ambiguousImport_function() async {
-    Source source = addSource(r'''
-import 'lib1.dart';
-import 'lib2.dart';
-g() { return f(); }''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-f() {}''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
-f() {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
-  }
-
   test_assert_message_suppresses_type_promotion() async {
     // If a variable is assigned to inside the expression for an assert
     // message, type promotion should be suppressed, just as it would be if the
@@ -211,6 +193,13 @@
     ]);
   }
 
+  test_defaultSetLiteralNotEnabled() async {
+    await assertErrorsInCode(r'''
+void main() {
+  Set _ = {};
+}''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+
   test_expectedOneListTypeArgument() async {
     await assertErrorsInCode(r'''
 main() {
@@ -218,11 +207,12 @@
 }''', [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]);
   }
 
-  test_expectedTwoMapTypeArguments_one() async {
+  @failingTest
+  test_expectedOneSetTypeArgument() async {
     await assertErrorsInCode(r'''
 main() {
-  <int> {};
-}''', [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
+  <int, int>{2, 3};
+}''', [StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS]);
   }
 
   test_expectedTwoMapTypeArguments_three() async {
@@ -457,16 +447,6 @@
 ''', [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
   }
 
-  test_instanceAccessToStaticMember_method_invocation() async {
-    await assertErrorsInCode(r'''
-class A {
-  static m() {}
-}
-main(A a) {
-  a.m();
-}''', [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
-  }
-
   test_instanceAccessToStaticMember_method_reference() async {
     await assertErrorsInCode(r'''
 class A {
@@ -576,6 +556,70 @@
 }''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
+  test_invalidAssignment_postfixExpression_localVariable() async {
+    await assertErrorsInCode(r'''
+class A {
+  B operator+(_) => new B();
+}
+
+class B {}
+
+f(A a) {
+  a++;
+}
+''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+
+  test_invalidAssignment_postfixExpression_property() async {
+    await assertErrorsInCode(r'''
+class A {
+  B operator+(_) => new B();
+}
+
+class B {}
+
+class C {
+  A a;
+}
+
+f(C c) {
+  c.a++;
+}
+''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+
+  test_invalidAssignment_prefixExpression_localVariable() async {
+    await assertErrorsInCode(r'''
+class A {
+  B operator+(_) => new B();
+}
+
+class B {}
+
+f(A a) {
+  ++a;
+}
+''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+
+  test_invalidAssignment_prefixExpression_property() async {
+    await assertErrorsInCode(r'''
+class A {
+  B operator+(_) => new B();
+}
+
+class B {}
+
+class C {
+  A a;
+}
+
+f(C c) {
+  ++c.a;
+}
+''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+
   test_invalidAssignment_regressionInIssue18468Fix() async {
     // https://code.google.com/p/dart/issues/detail?id=18628
     await assertErrorsInCode(r'''
@@ -617,85 +661,6 @@
 }''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
   }
 
-  test_invocationOfNonFunction_class() async {
-    await assertErrorsInCode(r'''
-class A {
-  void m() {
-    A();
-  }
-}''', previewDart2 ? [] : [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-  }
-
-  test_invocationOfNonFunction_dynamic() async {
-    await assertErrorsInCode(r'''
-main() {
-  dynamic d;
-  d.hashCode();
-}
-''', [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-  }
-
-  test_invocationOfNonFunction_localGenericFunction() async {
-    // Invoking `.call` on a `Function` type works similarly to invoking it on
-    // `dynamic`--the invocation is accepted at compile time, and all type
-    // checking is deferred until runtime.
-    await assertErrorsInCode('''
-f(Function f) {
-  return f();
-}''', []);
-  }
-
-  test_invocationOfNonFunction_localObject() async {
-    await assertErrorsInCode('''
-f(Object o) {
-  return o();
-}''', [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-  }
-
-  test_invocationOfNonFunction_localVariable() async {
-    await assertErrorsInCode(r'''
-f() {
-  int x;
-  return x();
-}''', [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-  }
-
-  test_invocationOfNonFunction_ordinaryInvocation() async {
-    await assertErrorsInCode(r'''
-class A {
-  static int x;
-}
-class B {
-  m() {
-    A.x();
-  }
-}''', [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-    // A call to verify(source) fails as A.x() cannot be resolved.
-  }
-
-  test_invocationOfNonFunction_staticInvocation() async {
-    await assertErrorsInCode(r'''
-class A {
-  static int get g => 0;
-  f() {
-    A.g();
-  }
-}''', [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-    // A call to verify(source) fails as g() cannot be resolved.
-  }
-
-  test_invocationOfNonFunction_superExpression() async {
-    await assertErrorsInCode(r'''
-class A {
-  int get g => 0;
-}
-class B extends A {
-  m() {
-    var v = super.g();
-  }
-}''', [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
-  }
-
   test_invocationOfNonFunctionExpression_literal() async {
     await assertErrorsInCode(r'''
 f() {
@@ -1348,34 +1313,6 @@
 }''', [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
-  test_undefinedFunction() async {
-    await assertErrorsInCode(r'''
-void f() {
-  g();
-}''', [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
-  }
-
-  test_undefinedFunction_inCatch() async {
-    await assertErrorsInCode(r'''
-void f() {
-  try {
-  } on Object {
-    g();
-  }
-}''', [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
-  }
-
-  test_undefinedFunction_inImportedLib() async {
-    Source source = addSource(r'''
-import 'lib.dart' as f;
-main() { return f.g(); }''');
-    addNamedSource("/lib.dart", r'''
-library lib;
-h() {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
-  }
-
   test_undefinedGetter() async {
     await assertErrorsInUnverifiedCode(r'''
 class T {}
@@ -1433,12 +1370,11 @@
   test_undefinedGetter_typeLiteral_conditionalAccess() async {
     // When applied to a type literal, the conditional access operator '?.'
     // cannot be used to access instance getters of Type.
-    // TODO(brianwilkerson) We cannot verify in previewDart2 because hashCode
-    // isn't resolved.
+    // TODO(brianwilkerson) We cannot verify because hashCode isn't resolved.
     await assertErrorsInCode('''
 class A {}
 f() => A?.hashCode;
-''', [StaticTypeWarningCode.UNDEFINED_GETTER], verify: !previewDart2);
+''', [StaticTypeWarningCode.UNDEFINED_GETTER], verify: false);
   }
 
   test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() async {
@@ -1471,15 +1407,6 @@
 }''', [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
   }
 
-  test_undefinedMethod() async {
-    await assertErrorsInCode(r'''
-class A {
-  void m() {
-    n();
-  }
-}''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
   test_undefinedMethod_assignmentExpression() async {
     await assertErrorsInCode(r'''
 class A {}
@@ -1491,17 +1418,6 @@
 }''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
-  test_undefinedMethod_generic_function_call() async {
-    // Invoking `.call` on a `Function` type works similarly to invoking it on
-    // `dynamic`--the invocation is accepted at compile time, and all type
-    // checking is deferred until runtime.
-    await assertErrorsInCode('''
-f(Function f) {
-  f.call();
-}
-''', []);
-  }
-
   test_undefinedMethod_ignoreTypePropagation() async {
     await assertErrorsInCode(r'''
 class A {}
@@ -1521,14 +1437,6 @@
         [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
-  test_undefinedMethod_object_call() async {
-    await assertErrorsInCode('''
-f(Object o) {
-  o.call();
-}
-''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
   test_undefinedMethod_ofNull() async {
     // TODO(scheglov) Track https://github.com/dart-lang/sdk/issues/28430 to
     // decide whether a warning should be reported here.
@@ -1540,69 +1448,15 @@
 ''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
   }
 
-  test_undefinedMethod_private() async {
-    addNamedSource("/lib.dart", r'''
-library lib;
-class A {
-  _foo() {}
-}''');
-    await assertErrorsInCode(r'''
-import 'lib.dart';
-class B extends A {
-  test() {
-    _foo();
-  }
-}''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
-  test_undefinedMethod_proxy_annotation_fakeProxy() async {
-    await assertErrorsInCode(r'''
-library L;
-class Fake {
-  const Fake();
-}
-const proxy = const Fake();
-@proxy class PrefixProxy {}
-main() {
-  new PrefixProxy().foo();
-}''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
-  test_undefinedMethod_typeLiteral_cascadeTarget() async {
-    await assertErrorsInCode('''
-class T {
-  static void foo() {}
-}
-main() {
-  T..foo();
-}
-''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
-  test_undefinedMethod_typeLiteral_conditionalAccess() async {
-    // When applied to a type literal, the conditional access operator '?.'
-    // cannot be used to access instance methods of Type.
-    await assertErrorsInCode('''
-class A {}
-f() => A?.toString();
-''', [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
   test_undefinedMethodWithConstructor() async {
-    // TODO(brianwilkerson) We cannot verify in previewDart2 because 'C' could
-    // not be resolved.
-    await assertErrorsInCode(
-        r'''
+    // TODO(brianwilkerson) We cannot verify because 'C' could not be resolved.
+    await assertErrorsInCode(r'''
 class C {
   C.m();
 }
 f() {
   C c = C.m();
-}''',
-        previewDart2
-            ? []
-            : [StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR],
-        verify: !previewDart2);
+}''', [], verify: false);
   }
 
   test_undefinedOperator_indexBoth() async {
@@ -1610,7 +1464,10 @@
 class A {}
 f(A a) {
   a[0]++;
-}''', [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
+}''', [
+      StaticTypeWarningCode.UNDEFINED_OPERATOR,
+      StaticTypeWarningCode.UNDEFINED_OPERATOR,
+    ]);
   }
 
   test_undefinedOperator_indexGetter() async {
@@ -1701,18 +1558,6 @@
 ''', [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
   }
 
-  test_unqualifiedReferenceToNonLocalStaticMember_method() async {
-    await assertErrorsInCode(r'''
-class A {
-  static void a() {}
-}
-class B extends A {
-  void b() {
-    a();
-  }
-}''', [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER]);
-  }
-
   test_unqualifiedReferenceToNonLocalStaticMember_setter() async {
     await assertErrorsInCode(r'''
 class A {
@@ -1883,26 +1728,6 @@
     resetWith(options: options);
   }
 
-  test_genericMethodWrongNumberOfTypeArguments() async {
-    Source source = addSource('''
-f() {}
-main() {
-  f<int>();
-}
-''');
-    TestAnalysisResult analysisResult = await computeAnalysisResult(source);
-    assertErrors(
-        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD]);
-    for (AnalysisError error in analysisResult.errors) {
-      if (error.errorCode ==
-          StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS) {
-        expect(error.message,
-            formatList(error.errorCode.message, ['() → dynamic', 0, 1]));
-      }
-    }
-    verify([source]);
-  }
-
   test_legalAsyncGeneratorReturnType_function_supertypeOfStream() async {
     await assertErrorsInCode('''
 import 'dart:async';
diff --git a/pkg/analyzer/test/generated/static_warning_code_driver_test.dart b/pkg/analyzer/test/generated/static_warning_code_driver_test.dart
index adf005d..ec8e367 100644
--- a/pkg/analyzer/test/generated/static_warning_code_driver_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_driver_test.dart
@@ -1,18 +1,39 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'resolver_test_case.dart';
 import 'static_warning_code_test.dart';
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(SetElementTypeNotAssignableTest);
     defineReflectiveTests(StaticWarningCodeTest_Driver);
   });
 }
 
 @reflectiveTest
+class SetElementTypeNotAssignableTest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_setElementTypeNotAssignable() async {
+    Source source = addSource("var v = <String>{42};");
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.SET_ELEMENT_TYPE_NOT_ASSIGNABLE]);
+    verify([source]);
+  }
+}
+
+@reflectiveTest
 class StaticWarningCodeTest_Driver extends StaticWarningCodeTest {
   @override
   bool get enableNewAnalysisDriver => true;
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 4b7068e..f5b8968 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:test/test.dart';
@@ -13,11 +14,54 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(EqualValuesInConstSetTest);
     defineReflectiveTests(StaticWarningCodeTest);
   });
 }
 
 @reflectiveTest
+class EqualValuesInConstSetTest extends ResolverTestCase {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  test_simpleValues() async {
+    Source source = addSource('var s = const {0, 1, 0};');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.EQUAL_VALUES_IN_CONST_SET]);
+    verify([source]);
+  }
+
+  test_valuesWithEqualTypeParams() async {
+    Source source = addSource(r'''
+class A<T> {
+  const A();
+}
+var s = const {A<int>(), A<int>()};
+''');
+    await computeAnalysisResult(source);
+    assertErrors(source, [StaticWarningCode.EQUAL_VALUES_IN_CONST_SET]);
+    verify([source]);
+  }
+
+  test_valuesWithUnequalTypeParams() async {
+    // No error should be produced because A<int> and A<num> are different
+    // types.
+    Source source = addSource(r'''
+class A<T> {
+  const A();
+}
+const s = {A<int>(), A<num>()};
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+}
+
+@reflectiveTest
 class StaticWarningCodeTest extends ResolverTestCase {
   fail_argumentTypeNotAssignable_tearOff_required() async {
     Source source = addSource(r'''
@@ -274,24 +318,6 @@
     assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
-  test_ambiguousImport_withPrefix() async {
-    Source source = addSource(r'''
-library test;
-import 'lib1.dart' as p;
-import 'lib2.dart' as p;
-main() {
-  p.f();
-}''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-f() {}''');
-    addNamedSource("/lib2.dart", r'''
-library lib2;
-f() {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
-  }
-
   test_argumentTypeNotAssignable_ambiguousClassName() async {
     // See dartbug.com/19624
     Source source = addNamedSource("/lib1.dart", r'''
@@ -315,10 +341,6 @@
     expect(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, error.errorCode);
     String message = error.message;
     expect(message.indexOf("_A") != -1, isTrue);
-    if (!previewDart2) {
-      expect(message.indexOf("lib1.dart") != -1, isTrue);
-      expect(message.indexOf("lib2.dart") != -1, isTrue);
-    }
   }
 
   test_argumentTypeNotAssignable_annotation_namedConstructor() async {
@@ -501,11 +523,7 @@
   acceptFunNumOptBool(funNumBool);
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StrongModeCode.INVALID_CAST_FUNCTION]);
-    } else {
-      assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    }
+    assertErrors(source, [StrongModeCode.INVALID_CAST_FUNCTION]);
     verify([source]);
   }
 
@@ -1111,15 +1129,10 @@
   A(String this.x) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [
-        StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
-        StrongModeCode.INVALID_PARAMETER_DECLARATION
-      ]);
-    } else {
-      assertErrors(
-          source, [StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE]);
-    }
+    assertErrors(source, [
+      StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
+      StrongModeCode.INVALID_PARAMETER_DECLARATION
+    ]);
     verify([source]);
   }
 
@@ -1356,11 +1369,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
-    }
+    assertNoErrors(source);
   }
 
   test_generalizedVoid_interpolateVoidValueError() async {
@@ -1374,51 +1383,6 @@
     assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
   }
 
-  test_generalizedVoid_invocationOfVoidFieldError() async {
-    Source source = addSource(r'''
-class Container<T>{
-  T value;
-}
-void main(Container<void> voidContainer) {
-  voidContainer.value();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-  }
-
-  test_generalizedVoid_invocationOfVoidLocalError() async {
-    Source source = addSource(r'''
-void main() {
-  void x;
-  x();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-  }
-
-  test_generalizedVoid_invocationOfVoidResultError() async {
-    Source source = addSource(r'''
-void main() {
-  main()();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-  }
-
-  test_generalizedVoid_invocationOfVoidToplevelError() async {
-    Source source = addSource(r'''
-void x;
-void main() {
-  x();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-  }
-
   test_generalizedVoid_negateVoidValueError() async {
     Source source = addSource(r'''
 void main() {
@@ -1533,28 +1497,6 @@
     assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
   }
 
-  test_generalizedVoid_useOfVoidCallMethodError() async {
-    Source source = addSource(r'''
-void main() {
-  void x;
-  x.toString();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-  }
-
-  test_generalizedVoid_useOfVoidCallMethodWithNullError() async {
-    Source source = addSource(r'''
-void main() {
-  void x;
-  x?.toString();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-  }
-
   test_generalizedVoid_useOfVoidCallSetterError() async {
     Source source = addSource(r'''
 void main() {
@@ -1566,17 +1508,6 @@
     assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
   }
 
-  test_generalizedVoid_useOfVoidCascadeError() async {
-    Source source = addSource(r'''
-void main() {
-  void x;
-  x..toString();
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticWarningCode.USE_OF_VOID_RESULT]);
-  }
-
   test_generalizedVoid_useOfVoidCastsOk() async {
     Source source = addSource(r'''
 void use(dynamic x) { }
@@ -2257,13 +2188,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [
-        StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL
-      ]);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -2280,12 +2205,7 @@
 }
 ''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED]);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -2368,12 +2288,7 @@
   m({int p : 1}) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED]);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -2386,13 +2301,7 @@
   m([int p = 1]) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [
-        StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL
-      ]);
-    }
+    assertNoErrors(source);
     verify([source]);
   }
 
@@ -2405,11 +2314,7 @@
   m({a}) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
-    } else {
-      assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2422,11 +2327,7 @@
   m({a, c}) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
-    } else {
-      assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_NAMED]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2439,11 +2340,7 @@
   m([a]) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
-    } else {
-      assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2456,11 +2353,7 @@
   m(a, b, [c]) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
-    } else {
-      assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2473,11 +2366,7 @@
   m(a, [c, d]) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
-    } else {
-      assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_POSITIONAL]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2490,11 +2379,7 @@
   m(a, b) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
-    } else {
-      assertErrors(source, [StaticWarningCode.INVALID_OVERRIDE_REQUIRED]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2507,12 +2392,7 @@
   void set s(String v) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [CompileTimeErrorCode.INVALID_OVERRIDE]);
     verify([source]);
   }
 
@@ -2529,15 +2409,10 @@
   set setter14(String _) => null;
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [
-        CompileTimeErrorCode.INVALID_OVERRIDE,
-        CompileTimeErrorCode.INVALID_OVERRIDE,
-      ]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+    ]);
     verify([source]);
   }
 
@@ -2555,15 +2430,10 @@
   set setter14(String _) => null;
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [
-        CompileTimeErrorCode.INVALID_OVERRIDE,
-        CompileTimeErrorCode.INVALID_OVERRIDE
-      ]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -2579,15 +2449,10 @@
   set s(double d) {}
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [
-        CompileTimeErrorCode.INVALID_OVERRIDE,
-        CompileTimeErrorCode.INVALID_OVERRIDE
-      ]);
-    } else {
-      assertErrors(source,
-          [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
-    }
+    assertErrors(source, [
+      CompileTimeErrorCode.INVALID_OVERRIDE,
+      CompileTimeErrorCode.INVALID_OVERRIDE
+    ]);
     verify([source]);
   }
 
@@ -2653,14 +2518,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
-    } else {
-      assertErrors(source, [
-        StaticWarningCode.MIXED_RETURN_TYPES,
-        StaticWarningCode.MIXED_RETURN_TYPES
-      ]);
-    }
+    assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
     verify([source]);
   }
 
@@ -3451,11 +3309,7 @@
 Null f() {return;}
 ''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [StaticWarningCode.RETURN_WITHOUT_VALUE]);
-    }
+    assertNoErrors(source);
   }
 
   test_staticAccessToInstanceMember_method_invocation() async {
@@ -3813,11 +3667,7 @@
   }
 }''');
     await computeAnalysisResult(source);
-    if (previewDart2) {
-      assertNoErrors(source);
-    } else {
-      assertErrors(source, [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
-    }
+    assertNoErrors(source);
   }
 
   test_typeTestNonType() async {
@@ -3974,29 +3824,6 @@
     assertErrors(source, [StaticTypeWarningCode.UNDEFINED_GETTER]);
   }
 
-  test_undefinedStaticMethodOrGetter_method() async {
-    Source source = addSource(r'''
-class C {}
-f(var p) {
-  f(C.m());
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
-  test_undefinedStaticMethodOrGetter_method_inSuperclass() async {
-    Source source = addSource(r'''
-class S {
-  static m() {}
-}
-class C extends S {}
-f(var p) {
-  f(C.m());
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
-  }
-
   test_undefinedStaticMethodOrGetter_setter_inSuperclass() async {
     Source source = addSource(r'''
 class S {
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 70a60b6..88127b5 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -17,6 +17,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../src/dart/resolution/find_node.dart';
 import '../utils.dart';
 import 'resolver_test_case.dart';
 
@@ -445,6 +446,27 @@
     expect(covariantE.toList(), []);
   }
 
+  test_covarianceChecks2() async {
+    var content = r'''
+class View<T1> {
+  View<T1> create() => this;
+}
+
+class Bar<T2> extends View<Bar<T2>> {}
+
+main() {
+  var b = new Bar<int>();
+  b.create();
+}
+''';
+    var source = addSource(content);
+    var unit = (await computeAnalysisResult(source)).unit;
+    assertNoErrors(source);
+
+    var findNode = FindNode(content, unit);
+    expect(getImplicitCast(findNode.methodInvocation('b.create')), isNull);
+  }
+
   test_covarianceChecks_genericMethods() async {
     var source = addSource(r'''
 class C<T> {
@@ -2909,7 +2931,7 @@
 }
 
 /// Test cases for [StrongModeStaticTypeAnalyzer2Test]
-abstract class StrongModeStaticTypeAnalyzer2TestCases
+mixin StrongModeStaticTypeAnalyzer2TestCases
     implements StaticTypeAnalyzer2TestShared {
   void expectStaticInvokeType(String search, String type) {
     var invocation = findIdentifier(search).parent as MethodInvocation;
@@ -2927,17 +2949,6 @@
     expectInitializerType('foo', 'int');
   }
 
-  test_dynamicObjectMethod_toString() async {
-    String code = r'''
-main() {
-  dynamic a = null;
-  var foo = a.toString();
-}
-''';
-    await resolveTestUnit(code);
-    expectInitializerType('foo', 'String');
-  }
-
   test_futureOr_promotion1() async {
     // Test that promotion from FutureOr<T> to T works for concrete types
     String code = r'''
@@ -3612,22 +3623,6 @@
     verify([source]);
   }
 
-  test_genericMethod_partiallyAppliedErrorWithBound() async {
-    await resolveTestUnit(r'''
-void f<X extends List, Y>() => null;
-
-void test() {
-  f<int>();
-}
-''', noErrors: false);
-    assertErrors(testSource, [
-      // Make sure to catch both the missing parameter:
-      StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
-      // And the incorrect parameter:
-      StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
-    ]);
-  }
-
   test_genericMethod_propagatedType_promotion() async {
     // Regression test for:
     // https://github.com/dart-lang/sdk/issues/25340
@@ -4435,7 +4430,7 @@
     expectInitializerType('foo', 'int');
   }
 
-  Future<Null> _objectMethodOnFunctions_helper2(String code) async {
+  Future<void> _objectMethodOnFunctions_helper2(String code) async {
     await resolveTestUnit(code);
     expectIdentifierType('t0', "String");
     expectIdentifierType('t1', "() → String");
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 3b976b4..ac07574 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -5,7 +5,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'all_the_rest_test.dart' as all_the_rest;
-import 'bazel_test.dart' as bazel_test;
 import 'checked_mode_compile_time_error_code_driver_test.dart'
     as checked_mode_compile_time_error_code_driver_test;
 import 'checked_mode_compile_time_error_code_test.dart'
@@ -19,7 +18,6 @@
 import 'engine_test.dart' as engine_test;
 import 'error_suppression_driver_test.dart' as error_suppression_driver_test;
 import 'error_suppression_test.dart' as error_suppression_test;
-import 'gn_test.dart' as gn_test;
 import 'hint_code_driver_test.dart' as hint_code_driver_test;
 import 'hint_code_test.dart' as hint_code_test;
 import 'inheritance_manager_test.dart' as inheritance_manager_test;
@@ -31,8 +29,6 @@
 import 'non_error_resolver_test.dart' as non_error_resolver_test;
 import 'non_hint_code_driver_test.dart' as non_hint_code_driver_test;
 import 'non_hint_code_test.dart' as non_hint_code_test;
-import 'package_build_test.dart' as package_build_test;
-import 'package_test.dart' as package_test;
 import 'parser_fasta_test.dart' as parser_fasta_test;
 import 'parser_test.dart' as parser_test;
 import 'resolver_driver_test.dart' as resolver_driver_test;
@@ -59,7 +55,6 @@
 main() {
   defineReflectiveSuite(() {
     all_the_rest.main();
-    bazel_test.main();
     checked_mode_compile_time_error_code_driver_test.main();
     checked_mode_compile_time_error_code_test.main();
     compile_time_error_code_driver_test.main();
@@ -70,7 +65,6 @@
     engine_test.main();
     error_suppression_driver_test.main();
     error_suppression_test.main();
-    gn_test.main();
     hint_code_driver_test.main();
     hint_code_test.main();
     inheritance_manager_test.main();
@@ -82,8 +76,6 @@
     non_error_resolver_test.main();
     non_hint_code_driver_test.main();
     non_hint_code_test.main();
-    package_build_test.main();
-    package_test.main();
     parser_fasta_test.main();
     parser_test.main();
     resolver_driver_test.main();
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index 8a6e9d4..528bd33 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -107,23 +107,6 @@
   void tearDown() {}
 
   /**
-   * Assert that the given object is an instance of the expected class.
-   *
-   * @param expectedClass the class that the object is expected to be an instance of
-   * @param object the object being tested
-   * @return the object that was being tested
-   * @throws Exception if the object is not an instance of the expected class
-   */
-  static Object assertInstanceOf(
-      Predicate<Object> predicate, Type expectedClass, Object object) {
-    if (!predicate(object)) {
-      fail(
-          "Expected instance of $expectedClass, found ${object == null ? "null" : object.runtimeType}");
-    }
-    return object;
-  }
-
-  /**
    * @return the [AstNode] with requested type at offset of the "prefix".
    */
   static AstNode findNode(
@@ -133,7 +116,7 @@
       throw new ArgumentError("Not found '$prefix'.");
     }
     AstNode node = new NodeLocator(offset).searchWithin(root);
-    return node.getAncestor(predicate);
+    return node.thisOrAncestorMatching(predicate);
   }
 
   /**
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index 67110dd..190bc9b 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -1,25 +1,26 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 // Tests related to the [TypeSystem] class.
 
-import 'package:analyzer/analyzer.dart'
-    show ErrorReporter, ParameterKind, StrongModeCode;
 import 'package:analyzer/dart/ast/standard_ast_factory.dart' show astFactory;
 import 'package:analyzer/dart/ast/token.dart' show Keyword;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/ast/token.dart' show KeywordToken;
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart'
     show NonExistingSource, UriKind;
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:path/path.dart' show toUri;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -42,7 +43,7 @@
  */
 abstract class BoundTestBase {
   TypeProvider typeProvider;
-  TypeSystem typeSystem;
+  Dart2TypeSystem typeSystem;
   FunctionType simpleFunctionType;
 
   DartType get bottomType => typeProvider.bottomType;
@@ -56,8 +57,6 @@
   InterfaceType get numType => typeProvider.numType;
   InterfaceType get objectType => typeProvider.objectType;
   InterfaceType get stringType => typeProvider.stringType;
-  StrongTypeSystemImpl get strongTypeSystem =>
-      typeSystem as StrongTypeSystemImpl;
 
   DartType get voidType => VoidTypeImpl.instance;
 
@@ -72,7 +71,7 @@
 
   void _checkGreatestLowerBound(
       DartType type1, DartType type2, DartType expectedResult) {
-    DartType glb = strongTypeSystem.getGreatestLowerBound(type1, type2);
+    DartType glb = typeSystem.getGreatestLowerBound(type1, type2);
     expect(glb, expectedResult);
     // Check that the result is a lower bound.
     expect(typeSystem.isSubtypeOf(glb, type1), true);
@@ -83,7 +82,7 @@
     // for function types we just check if they are mutual subtypes.
     // https://github.com/dart-lang/sdk/issues/26126
     // TODO(leafp): Fix this.
-    glb = strongTypeSystem.getGreatestLowerBound(type2, type1);
+    glb = typeSystem.getGreatestLowerBound(type2, type1);
     if (glb is FunctionTypeImpl) {
       expect(typeSystem.isSubtypeOf(glb, expectedResult), true);
       expect(typeSystem.isSubtypeOf(expectedResult, glb), true);
@@ -173,7 +172,7 @@
     typeProvider = AnalysisContextFactory.contextWithCore(
             resourceProvider: new MemoryResourceProvider())
         .typeProvider;
-    typeSystem = new StrongTypeSystemImpl(typeProvider);
+    typeSystem = new Dart2TypeSystem(typeProvider);
     T = _newTypeParameter('T');
   }
 
@@ -844,7 +843,7 @@
 
   void setUp() {
     typeProvider = new TestTypeProvider();
-    typeSystem = new StrongTypeSystemImpl(typeProvider);
+    typeSystem = new Dart2TypeSystem(typeProvider);
   }
 
   void test_isAssignableTo_bottom_isBottom() {
@@ -1114,7 +1113,7 @@
 @reflectiveTest
 class StrongGenericFunctionInferenceTest {
   TypeProvider typeProvider;
-  StrongTypeSystemImpl typeSystem;
+  Dart2TypeSystem typeSystem;
 
   DartType get bottomType => typeProvider.bottomType;
   InterfaceType get doubleType => typeProvider.doubleType;
@@ -1131,7 +1130,7 @@
 
   void setUp() {
     typeProvider = new TestTypeProvider();
-    typeSystem = new StrongTypeSystemImpl(typeProvider);
+    typeSystem = new Dart2TypeSystem(typeProvider);
   }
 
   void test_boundedByAnotherTypeParameter() {
@@ -1436,7 +1435,7 @@
 class StrongGreatestLowerBoundTest extends BoundTestBase {
   void setUp() {
     super.setUp();
-    typeSystem = new StrongTypeSystemImpl(typeProvider);
+    typeSystem = new Dart2TypeSystem(typeProvider);
   }
 
   void test_bottom_function() {
@@ -1760,7 +1759,7 @@
 class StrongLeastUpperBoundTest extends LeastUpperBoundTestBase {
   void setUp() {
     super.setUp();
-    typeSystem = new StrongTypeSystemImpl(typeProvider);
+    typeSystem = new Dart2TypeSystem(typeProvider);
   }
 
   void test_functionsFuzzyArrows() {
@@ -1889,7 +1888,7 @@
     typeProvider = AnalysisContextFactory.contextWithCore(
             resourceProvider: new MemoryResourceProvider())
         .typeProvider;
-    typeSystem = new StrongTypeSystemImpl(typeProvider);
+    typeSystem = new Dart2TypeSystem(typeProvider);
   }
 
   void test_bottom_isBottom() {
diff --git a/pkg/analyzer/test/parse_compilation_unit_test.dart b/pkg/analyzer/test/parse_compilation_unit_test.dart
index a916d00..74a0179 100644
--- a/pkg/analyzer/test/parse_compilation_unit_test.dart
+++ b/pkg/analyzer/test/parse_compilation_unit_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// ignore: deprecated_member_use
 import 'package:analyzer/analyzer.dart';
 import 'package:test/test.dart';
 
diff --git a/pkg/analyzer/test/source/error_processor_test.dart b/pkg/analyzer/test/source/error_processor_test.dart
index 5ceb965..247d10f 100644
--- a/pkg/analyzer/test/source/error_processor_test.dart
+++ b/pkg/analyzer/test/source/error_processor_test.dart
@@ -18,8 +18,8 @@
 import '../src/util/yaml_test.dart';
 
 main() {
-  AnalysisError invalid_assignment =
-      new AnalysisError(new TestSource(), 0, 1, HintCode.INVALID_ASSIGNMENT, [
+  AnalysisError invalid_assignment = new AnalysisError(
+      new TestSource(), 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
     ['x'],
     ['y']
   ]);
diff --git a/pkg/analyzer/test/source/sdk_ext_test.dart b/pkg/analyzer/test/source/sdk_ext_test.dart
index b09c36b..4f542d1 100644
--- a/pkg/analyzer/test/source/sdk_ext_test.dart
+++ b/pkg/analyzer/test/source/sdk_ext_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/source/sdk_ext.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -15,9 +15,7 @@
 }
 
 @reflectiveTest
-class SdkExtUriResolverTest {
-  MemoryResourceProvider resourceProvider;
-
+class SdkExtUriResolverTest with ResourceProviderMixin {
   void setUp() {
     String joinAndEscape(List<String> components) {
       return resourceProvider.pathContext
@@ -25,10 +23,9 @@
           .replaceAll(r'\', r'\\');
     }
 
-    resourceProvider = new MemoryResourceProvider();
-    resourceProvider.newFolder(resourceProvider.convertPath('/empty'));
-    resourceProvider.newFolder(resourceProvider.convertPath('/tmp'));
-    resourceProvider.newFile(resourceProvider.convertPath('/tmp/_sdkext'), '''
+    newFolder('/empty');
+    newFolder('/tmp');
+    newFile('/tmp/_sdkext', content: '''
 {
   "dart:fox": "slippy.dart",
   "dart:bear": "grizzly.dart",
@@ -41,47 +38,37 @@
   test_create_badJSON() {
     var resolver = new SdkExtUriResolver(null);
     resolver.addSdkExt(r'''{{{,{{}}},}}''', null);
-    expect(resolver.length, equals(0));
+    expect(resolver.length, 0);
   }
 
   test_create_noSdkExtPackageMap() {
     var resolver = new SdkExtUriResolver({
-      'fox': <Folder>[
-        resourceProvider.getFolder(resourceProvider.convertPath('/empty'))
-      ]
+      'fox': <Folder>[getFolder('/empty')]
     });
-    expect(resolver.length, equals(0));
+    expect(resolver.length, 0);
   }
 
   test_create_nullPackageMap() {
     var resolver = new SdkExtUriResolver(null);
-    expect(resolver.length, equals(0));
+    expect(resolver.length, 0);
   }
 
   test_create_sdkExtPackageMap() {
     var resolver = new SdkExtUriResolver({
-      'fox': <Folder>[
-        resourceProvider.newFolder(resourceProvider.convertPath('/tmp'))
-      ]
+      'fox': <Folder>[newFolder('/tmp')]
     });
     // We have four mappings.
-    expect(resolver.length, equals(4));
+    expect(resolver.length, 4);
     // Check that they map to the correct paths.
-    expect(resolver['dart:fox'],
-        equals(resourceProvider.convertPath('/tmp/slippy.dart')));
-    expect(resolver['dart:bear'],
-        equals(resourceProvider.convertPath('/tmp/grizzly.dart')));
-    expect(resolver['dart:relative'],
-        equals(resourceProvider.convertPath('/relative.dart')));
-    expect(resolver['dart:deep'],
-        equals(resourceProvider.convertPath('/tmp/deep/directory/file.dart')));
+    expect(resolver['dart:fox'], convertPath('/tmp/slippy.dart'));
+    expect(resolver['dart:bear'], convertPath('/tmp/grizzly.dart'));
+    expect(resolver['dart:relative'], convertPath('/relative.dart'));
+    expect(resolver['dart:deep'], convertPath('/tmp/deep/directory/file.dart'));
   }
 
   test_restoreAbsolute() {
     var resolver = new SdkExtUriResolver({
-      'fox': <Folder>[
-        resourceProvider.newFolder(resourceProvider.convertPath('/tmp'))
-      ]
+      'fox': <Folder>[newFolder('/tmp')]
     });
     var source = resolver.resolveAbsolute(Uri.parse('dart:fox'));
     expect(source, isNotNull);
@@ -89,8 +76,8 @@
     var restoreUri = resolver.restoreAbsolute(source);
     expect(restoreUri, isNotNull);
     // Verify that it is 'dart:fox'.
-    expect(restoreUri.toString(), equals('dart:fox'));
-    expect(restoreUri.scheme, equals('dart'));
-    expect(restoreUri.path, equals('fox'));
+    expect(restoreUri.toString(), 'dart:fox');
+    expect(restoreUri.scheme, 'dart');
+    expect(restoreUri.path, 'fox');
   }
 }
diff --git a/pkg/analyzer/test/src/abstract_single_unit.dart b/pkg/analyzer/test/src/abstract_single_unit.dart
index f8fbb79..164b2f5 100644
--- a/pkg/analyzer/test/src/abstract_single_unit.dart
+++ b/pkg/analyzer/test/src/abstract_single_unit.dart
@@ -51,7 +51,7 @@
   AstNode findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) {
     AstNode result = new NodeLocator(offset).searchWithin(testUnit);
     if (result != null && predicate != null) {
-      result = result.getAncestor(predicate);
+      result = result.thisOrAncestorMatching(predicate);
     }
     return result;
   }
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index c612c12..3662f70 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:args/args.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -19,27 +19,25 @@
 }
 
 @reflectiveTest
-class ArgumentsTest {
+class ArgumentsTest with ResourceProviderMixin {
   void test_createContextBuilderOptions_all() {
     String dartSdkSummaryPath = 'a';
     String defaultAnalysisOptionsFilePath = 'b';
     String defaultPackageFilePath = 'c';
     String defaultPackagesDirectoryPath = 'd';
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = [
       '--dart-sdk-summary=$dartSdkSummaryPath',
       '-Dfoo=1',
       '-Dbar=2',
-      '--no-declaration-casts',
       '--no-implicit-casts',
       '--no-implicit-dynamic',
       '--options=$defaultAnalysisOptionsFilePath',
       '--packages=$defaultPackageFilePath',
       '--package-root=$defaultPackagesDirectoryPath',
     ];
-    ArgResults result = parse(provider, parser, args);
+    ArgResults result = parse(resourceProvider, parser, args);
     ContextBuilderOptions options = createContextBuilderOptions(result);
     expect(options, isNotNull);
     expect(options.dartSdkSummaryPath, dartSdkSummaryPath);
@@ -54,17 +52,15 @@
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
     expect(defaultOptions.strongMode, true);
-    expect(defaultOptions.declarationCasts, false);
     expect(defaultOptions.implicitCasts, false);
     expect(defaultOptions.implicitDynamic, false);
   }
 
   void test_createContextBuilderOptions_none() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = [];
-    ArgResults result = parse(provider, parser, args);
+    ArgResults result = parse(resourceProvider, parser, args);
     ContextBuilderOptions options = createContextBuilderOptions(result);
     expect(options, isNotNull);
     expect(options.dartSdkSummaryPath, isNull);
@@ -74,79 +70,61 @@
     expect(options.defaultPackagesDirectoryPath, isNull);
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
-    expect(defaultOptions.strongMode, defaultOptions.previewDart2);
-    expect(defaultOptions.declarationCasts, true);
+    expect(defaultOptions.strongMode, true);
     expect(defaultOptions.implicitCasts, true);
     expect(defaultOptions.implicitDynamic, true);
   }
 
   void test_createDartSdkManager_noPath_noSummaries() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = [];
-    ArgResults result = parse(provider, parser, args);
-    DartSdkManager manager = createDartSdkManager(provider, false, result);
+    ArgResults result = parse(resourceProvider, parser, args);
+    DartSdkManager manager =
+        createDartSdkManager(resourceProvider, false, result);
     expect(manager, isNotNull);
     expect(manager.defaultSdkDirectory,
-        FolderBasedDartSdk.defaultSdkDirectory(provider));
+        FolderBasedDartSdk.defaultSdkDirectory(resourceProvider));
     expect(manager.canUseSummaries, false);
   }
 
   void test_createDartSdkManager_noPath_summaries() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = [];
-    ArgResults result = parse(provider, parser, args);
-    DartSdkManager manager = createDartSdkManager(provider, true, result);
+    ArgResults result = parse(resourceProvider, parser, args);
+    DartSdkManager manager =
+        createDartSdkManager(resourceProvider, true, result);
     expect(manager, isNotNull);
     expect(manager.defaultSdkDirectory,
-        FolderBasedDartSdk.defaultSdkDirectory(provider));
+        FolderBasedDartSdk.defaultSdkDirectory(resourceProvider));
     expect(manager.canUseSummaries, true);
   }
 
   void test_createDartSdkManager_path_noSummaries() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = ['--dart-sdk=x'];
-    ArgResults result = parse(provider, parser, args);
-    DartSdkManager manager = createDartSdkManager(provider, false, result);
+    ArgResults result = parse(resourceProvider, parser, args);
+    DartSdkManager manager =
+        createDartSdkManager(resourceProvider, false, result);
     expect(manager, isNotNull);
     expect(manager.defaultSdkDirectory, 'x');
     expect(manager.canUseSummaries, false);
   }
 
   void test_createDartSdkManager_path_summaries() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = ['--dart-sdk=y'];
-    ArgResults result = parse(provider, parser, args);
-    DartSdkManager manager = createDartSdkManager(provider, true, result);
+    ArgResults result = parse(resourceProvider, parser, args);
+    DartSdkManager manager =
+        createDartSdkManager(resourceProvider, true, result);
     expect(manager, isNotNull);
     expect(manager.defaultSdkDirectory, 'y');
     expect(manager.canUseSummaries, true);
   }
 
-  void test_declarationCast_noImplicitCast() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
-    ArgParser parser = new ArgParser();
-    defineAnalysisArguments(parser);
-    List<String> args = [
-      '--declaration-casts',
-      '--no-implicit-casts',
-    ];
-    ArgResults result = parse(provider, parser, args);
-    ContextBuilderOptions options = createContextBuilderOptions(result);
-    expect(options, isNotNull);
-    AnalysisOptionsImpl defaultOptions = options.defaultOptions;
-    expect(defaultOptions, isNotNull);
-    expect(defaultOptions.declarationCasts, true);
-    expect(defaultOptions.implicitCasts, false);
-  }
-
   void test_defineAnalysisArguments() {
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
@@ -179,62 +157,40 @@
     expect(result, orderedEquals(['--a', '--c=0', '-e=2', '-f', 'bar']));
   }
 
-  void test_noAssignmentCast() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
+  void test_implicitCast() {
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = [
-      '--no-declaration-casts',
-    ];
-    ArgResults result = parse(provider, parser, args);
-    ContextBuilderOptions options = createContextBuilderOptions(result);
-    expect(options, isNotNull);
-    AnalysisOptionsImpl defaultOptions = options.defaultOptions;
-    expect(defaultOptions, isNotNull);
-    expect(defaultOptions.declarationCasts, false);
-    expect(defaultOptions.implicitCasts, true);
-  }
-
-  void test_noAssignmentCast_implicitCast() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
-    ArgParser parser = new ArgParser();
-    defineAnalysisArguments(parser);
-    List<String> args = [
-      '--no-declaration-casts',
       '--implicit-casts',
     ];
-    ArgResults result = parse(provider, parser, args);
+    ArgResults result = parse(resourceProvider, parser, args);
     ContextBuilderOptions options = createContextBuilderOptions(result);
     expect(options, isNotNull);
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
-    expect(defaultOptions.declarationCasts, false);
     expect(defaultOptions.implicitCasts, true);
   }
 
   void test_noImplicitCast() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     ArgParser parser = new ArgParser();
     defineAnalysisArguments(parser);
     List<String> args = [
       '--no-implicit-casts',
     ];
-    ArgResults result = parse(provider, parser, args);
+    ArgResults result = parse(resourceProvider, parser, args);
     ContextBuilderOptions options = createContextBuilderOptions(result);
     expect(options, isNotNull);
     AnalysisOptionsImpl defaultOptions = options.defaultOptions;
     expect(defaultOptions, isNotNull);
-    expect(defaultOptions.declarationCasts, false);
     expect(defaultOptions.implicitCasts, false);
   }
 
   void test_parse_noReplacement_noIgnored() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     ArgParser parser = new ArgParser();
     parser.addFlag('xx');
     parser.addOption('yy');
     List<String> args = ['--xx', '--yy=abc', 'foo', 'bar'];
-    ArgResults result = parse(provider, parser, args);
+    ArgResults result = parse(resourceProvider, parser, args);
     expect(result, isNotNull);
     expect(result['xx'], true);
     expect(result['yy'], 'abc');
@@ -242,17 +198,15 @@
   }
 
   void test_preprocessArgs_noReplacement() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
     List<String> original = ['--xx' '--yy' 'baz'];
-    List<String> result = preprocessArgs(provider, original);
+    List<String> result = preprocessArgs(resourceProvider, original);
     expect(result, orderedEquals(original));
     expect(identical(original, result), isFalse);
   }
 
   void test_preprocessArgs_replacement_exists() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
-    String filePath = provider.convertPath('/args.txt');
-    provider.newFile(filePath, '''
+    String filePath = convertPath('/args.txt');
+    newFile(filePath, content: '''
 -a
 --xx
 
@@ -260,16 +214,15 @@
 bar
 ''');
     List<String> result =
-        preprocessArgs(provider, ['--preserved', '@$filePath']);
+        preprocessArgs(resourceProvider, ['--preserved', '@$filePath']);
     expect(result, orderedEquals(['--preserved', '-a', '--xx', 'foo', 'bar']));
   }
 
   void test_preprocessArgs_replacement_nonexistent() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
-    String filePath = provider.convertPath('/args.txt');
+    String filePath = convertPath('/args.txt');
     List<String> args = ['ignored', '@$filePath'];
     try {
-      preprocessArgs(provider, args);
+      preprocessArgs(resourceProvider, args);
       fail('Expect exception');
     } on Exception catch (e) {
       expect(e.toString(), contains('Failed to read file'));
@@ -278,10 +231,9 @@
   }
 
   void test_preprocessArgs_replacement_notLast() {
-    MemoryResourceProvider provider = new MemoryResourceProvider();
-    String filePath = provider.convertPath('/args.txt');
+    String filePath = convertPath('/args.txt');
     List<String> args = ['a', '@$filePath', 'b'];
-    List<String> result = preprocessArgs(provider, args);
+    List<String> result = preprocessArgs(resourceProvider, args);
     expect(result, orderedEquals(args));
   }
 }
diff --git a/pkg/analyzer/test/src/context/abstract_context.dart b/pkg/analyzer/test/src/context/abstract_context.dart
index eb77d7e..131646e 100644
--- a/pkg/analyzer/test/src/context/abstract_context.dart
+++ b/pkg/analyzer/test/src/context/abstract_context.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
@@ -15,12 +14,12 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/driver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:plugin/manager.dart';
 import 'package:plugin/plugin.dart';
 import 'package:test/test.dart';
 
-import 'mock_sdk.dart';
-
 /**
  * Finds an [Element] with the given [name].
  */
@@ -43,12 +42,7 @@
  */
 typedef void _ElementVisitorFunction(Element element);
 
-class AbstractContextTest {
-  static final MockSdk SHARED_MOCK_SDK = new MockSdk();
-  static final MockSdk SHARED_STRONG_MOCK_SDK = new MockSdk();
-
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class AbstractContextTest with ResourceProviderMixin {
   DartSdk sdk;
   SourceFactory sourceFactory;
   AnalysisContextImpl context;
@@ -125,8 +119,7 @@
   DartSdk createDartSdk() => new MockSdk(resourceProvider: resourceProvider);
 
   Source newSource(String path, [String content = '']) {
-    File file =
-        resourceProvider.newFile(resourceProvider.convertPath(path), content);
+    File file = newFile(path, content: content);
     return file.createSource();
   }
 
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 45d21f0..23e564e 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -1,15 +1,13 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
-import 'package:analyzer/src/generated/bazel.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -17,6 +15,14 @@
 import 'package:analyzer/src/lint/registry.dart';
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/workspace/basic.dart';
+import 'package:analyzer/src/workspace/bazel.dart';
+import 'package:analyzer/src/workspace/gn.dart';
+import 'package:analyzer/src/workspace/package_build.dart';
+import 'package:analyzer/src/workspace/pub.dart';
+import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:args/args.dart';
 import 'package:package_config/packages.dart';
 import 'package:package_config/src/packages_impl.dart';
@@ -26,7 +32,6 @@
 
 import '../../embedder_tests.dart';
 import '../../generated/test_support.dart';
-import 'mock_sdk.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -36,17 +41,7 @@
 }
 
 @reflectiveTest
-class ContextBuilderTest extends EngineTestCase {
-  /**
-   * The resource provider to be used by tests.
-   */
-  MemoryResourceProvider resourceProvider;
-
-  /**
-   * The path context used to manipulate file paths.
-   */
-  path.Context pathContext;
-
+class ContextBuilderTest extends EngineTestCase with ResourceProviderMixin {
   /**
    * The SDK manager used by the tests;
    */
@@ -79,15 +74,15 @@
   _MockLintRule _mockPublicMemberApiDocs;
 
   Uri convertedDirectoryUri(String directoryPath) {
-    return new Uri.directory(resourceProvider.convertPath(directoryPath),
-        windows: pathContext.style == path.windows.style);
+    return new Uri.directory(convertPath(directoryPath),
+        windows: resourceProvider.pathContext.style == path.windows.style);
   }
 
   void createDefaultSdk(Folder sdkDir) {
-    defaultSdkPath = pathContext.join(sdkDir.path, 'default', 'sdk');
-    String librariesFilePath = pathContext.join(defaultSdkPath, 'lib',
-        '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart');
-    resourceProvider.newFile(librariesFilePath, r'''
+    defaultSdkPath = join(sdkDir.path, 'default', 'sdk');
+    String librariesFilePath = join(defaultSdkPath, 'lib', '_internal',
+        'sdk_library_metadata', 'lib', 'libraries.dart');
+    newFile(librariesFilePath, content: r'''
 const Map<String, LibraryInfo> libraries = const {
   "async": const LibraryInfo("async/async.dart"),
   "core": const LibraryInfo("core/core.dart"),
@@ -98,20 +93,17 @@
         options: builderOptions);
   }
 
-  void createFile(String path, String content) {
-    resourceProvider.newFile(path, content);
-  }
-
   @override
   void setUp() {
-    resourceProvider = new MemoryResourceProvider();
-    pathContext = resourceProvider.pathContext;
     new MockSdk(resourceProvider: resourceProvider);
-    sdkManager =
-        new DartSdkManager(resourceProvider.convertPath('/sdk'), false);
+    sdkManager = new DartSdkManager(convertPath('/sdk'), false);
     contentCache = new ContentCache();
-    builder = new ContextBuilder(resourceProvider, sdkManager, contentCache,
-        options: builderOptions);
+    builder = new ContextBuilder(
+      resourceProvider,
+      sdkManager,
+      contentCache,
+      options: builderOptions,
+    );
   }
 
   @failingTest
@@ -131,11 +123,9 @@
     expected.lint = true;
     expected.lintRules = Registry.ruleRegistry.defaultRules;
 
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
-''');
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath);
 
     AnalysisOptions options = builder.getAnalysisOptions(path);
     _expectEqualOptions(options, expected);
@@ -155,10 +145,9 @@
       Registry.ruleRegistry['mock_lint_rule'],
     ];
 
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 linter:
   rules:
     - mock_lint_rule
@@ -181,10 +170,9 @@
       Registry.ruleRegistry['mock_lint_rule'],
     ];
 
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 linter:
   rules:
     - mock_lint_rule
@@ -207,10 +195,9 @@
       Registry.ruleRegistry['mock_lint_rule'],
     ];
 
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 linter:
   rules:
     - mock_lint_rule
@@ -231,10 +218,9 @@
     expected.lint = false;
     expected.lintRules = <LintRule>[];
 
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 ''');
 
     AnalysisOptions options = builder.getAnalysisOptions(path);
@@ -251,15 +237,15 @@
 //        options: createContextBuilderOptions(argResults));
 //
 //    AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
-//    expected.previewDart2 = true;
+//    expected.option = true;
 //
 //    String path = resourceProvider.convertPath('/some/directory/path');
 //    String filePath =
-//        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+//        join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
 //    resourceProvider.newFile(filePath, '''
 //analyzer:
 //  language:
-//    enablePreviewDart2: true
+//    option: true
 //''');
 //
 //    AnalysisOptions options = builder.getAnalysisOptions(path);
@@ -276,11 +262,11 @@
 
   void test_convertPackagesToMap_packages() {
     String fooName = 'foo';
-    String fooPath = resourceProvider.convertPath('/pkg/foo');
-    Uri fooUri = pathContext.toUri(fooPath);
+    String fooPath = convertPath('/pkg/foo');
+    Uri fooUri = resourceProvider.pathContext.toUri(fooPath);
     String barName = 'bar';
-    String barPath = resourceProvider.convertPath('/pkg/bar');
-    Uri barUri = pathContext.toUri(barPath);
+    String barPath = convertPath('/pkg/bar');
+    Uri barUri = resourceProvider.pathContext.toUri(barPath);
 
     MapPackages packages = new MapPackages({fooName: fooUri, barName: barUri});
     Map<String, List<Folder>> result = builder.convertPackagesToMap(packages);
@@ -311,16 +297,16 @@
 
   void test_createPackageMap_fromPackageDirectory_explicit() {
     // Use a package directory that is outside the project directory.
-    String rootPath = resourceProvider.convertPath('/root');
-    String projectPath = pathContext.join(rootPath, 'project');
-    String packageDirPath = pathContext.join(rootPath, 'packages');
+    String rootPath = convertPath('/root');
+    String projectPath = join(rootPath, 'project');
+    String packageDirPath = join(rootPath, 'packages');
     String fooName = 'foo';
-    String fooPath = pathContext.join(packageDirPath, fooName);
+    String fooPath = join(packageDirPath, fooName);
     String barName = 'bar';
-    String barPath = pathContext.join(packageDirPath, barName);
-    resourceProvider.newFolder(projectPath);
-    resourceProvider.newFolder(fooPath);
-    resourceProvider.newFolder(barPath);
+    String barPath = join(packageDirPath, barName);
+    newFolder(projectPath);
+    newFolder(fooPath);
+    newFolder(barPath);
 
     builderOptions.defaultPackagesDirectoryPath = packageDirPath;
 
@@ -334,14 +320,14 @@
 
   void test_createPackageMap_fromPackageDirectory_inRoot() {
     // Use a package directory that is inside the project directory.
-    String projectPath = resourceProvider.convertPath('/root/project');
-    String packageDirPath = pathContext.join(projectPath, 'packages');
+    String projectPath = convertPath('/root/project');
+    String packageDirPath = join(projectPath, 'packages');
     String fooName = 'foo';
-    String fooPath = pathContext.join(packageDirPath, fooName);
+    String fooPath = join(packageDirPath, fooName);
     String barName = 'bar';
-    String barPath = pathContext.join(packageDirPath, barName);
-    resourceProvider.newFolder(fooPath);
-    resourceProvider.newFolder(barPath);
+    String barPath = join(packageDirPath, barName);
+    newFolder(fooPath);
+    newFolder(barPath);
 
     Packages packages = builder.createPackageMap(projectPath);
     expect(packages, isNotNull);
@@ -353,13 +339,13 @@
 
   void test_createPackageMap_fromPackageFile_explicit() {
     // Use a package file that is outside the project directory's hierarchy.
-    String rootPath = resourceProvider.convertPath('/root');
-    String projectPath = pathContext.join(rootPath, 'project');
-    String packageFilePath = pathContext.join(rootPath, 'child', '.packages');
-    resourceProvider.newFolder(projectPath);
+    String rootPath = convertPath('/root');
+    String projectPath = join(rootPath, 'project');
+    String packageFilePath = join(rootPath, 'child', '.packages');
+    newFolder(projectPath);
     Uri fooUri = convertedDirectoryUri('/pkg/foo');
     Uri barUri = convertedDirectoryUri('/pkg/bar');
-    createFile(packageFilePath, '''
+    newFile(packageFilePath, content: '''
 foo:$fooUri
 bar:$barUri
 ''');
@@ -375,13 +361,13 @@
 
   void test_createPackageMap_fromPackageFile_inParentOfRoot() {
     // Use a package file that is inside the parent of the project directory.
-    String rootPath = resourceProvider.convertPath('/root');
-    String projectPath = pathContext.join(rootPath, 'project');
-    String packageFilePath = pathContext.join(rootPath, '.packages');
-    resourceProvider.newFolder(projectPath);
+    String rootPath = convertPath('/root');
+    String projectPath = join(rootPath, 'project');
+    String packageFilePath = join(rootPath, '.packages');
+    newFolder(projectPath);
     Uri fooUri = convertedDirectoryUri('/pkg/foo');
     Uri barUri = convertedDirectoryUri('/pkg/bar');
-    createFile(packageFilePath, '''
+    newFile(packageFilePath, content: '''
 foo:$fooUri
 bar:$barUri
 ''');
@@ -396,13 +382,13 @@
 
   void test_createPackageMap_fromPackageFile_inRoot() {
     // Use a package file that is inside the project directory.
-    String rootPath = resourceProvider.convertPath('/root');
-    String projectPath = pathContext.join(rootPath, 'project');
-    String packageFilePath = pathContext.join(projectPath, '.packages');
-    resourceProvider.newFolder(projectPath);
+    String rootPath = convertPath('/root');
+    String projectPath = join(rootPath, 'project');
+    String packageFilePath = join(projectPath, '.packages');
+    newFolder(projectPath);
     Uri fooUri = convertedDirectoryUri('/pkg/foo');
     Uri barUri = convertedDirectoryUri('/pkg/bar');
-    createFile(packageFilePath, '''
+    newFile(packageFilePath, content: '''
 foo:$fooUri
 bar:$barUri
 ''');
@@ -416,26 +402,24 @@
   }
 
   void test_createPackageMap_none() {
-    String rootPath = resourceProvider.convertPath('/root');
-    resourceProvider.newFolder(rootPath);
+    String rootPath = convertPath('/root');
+    newFolder(rootPath);
     Packages packages = builder.createPackageMap(rootPath);
     expect(packages, same(Packages.noPackages));
   }
 
   void test_createPackageMap_rootDoesNotExist() {
-    String rootPath = resourceProvider.convertPath('/root');
+    String rootPath = convertPath('/root');
     Packages packages = builder.createPackageMap(rootPath);
     expect(packages, same(Packages.noPackages));
   }
 
   void test_createSourceFactory_bazelWorkspace_fileProvider() {
-    String _p(String path) => resourceProvider.convertPath(path);
-
-    String projectPath = _p('/workspace/my/module');
-    resourceProvider.newFile(_p('/workspace/WORKSPACE'), '');
-    resourceProvider.newFolder(_p('/workspace/bazel-bin'));
-    resourceProvider.newFolder(_p('/workspace/bazel-genfiles'));
-    resourceProvider.newFolder(projectPath);
+    String projectPath = convertPath('/workspace/my/module');
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-bin');
+    newFolder('/workspace/bazel-genfiles');
+    newFolder(projectPath);
 
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     SourceFactoryImpl factory =
@@ -447,14 +431,12 @@
   }
 
   void test_createSourceFactory_bazelWorkspace_withPackagesFile() {
-    String _p(String path) => resourceProvider.convertPath(path);
-
-    String projectPath = _p('/workspace/my/module');
-    resourceProvider.newFile(_p('/workspace/WORKSPACE'), '');
-    resourceProvider.newFolder(_p('/workspace/bazel-bin'));
-    resourceProvider.newFolder(_p('/workspace/bazel-genfiles'));
-    resourceProvider.newFolder(projectPath);
-    resourceProvider.newFile(_p(path.join(projectPath, '.packages')), '');
+    String projectPath = convertPath('/workspace/my/module');
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-bin');
+    newFolder('/workspace/bazel-genfiles');
+    newFolder(projectPath);
+    newFile(join(projectPath, '.packages'));
 
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     SourceFactoryImpl factory =
@@ -466,28 +448,28 @@
   }
 
   void test_createSourceFactory_noProvider_packages_embedder_extensions() {
-    String rootPath = resourceProvider.convertPath('/root');
-    Folder rootFolder = resourceProvider.getFolder(rootPath);
+    String rootPath = convertPath('/root');
+    Folder rootFolder = getFolder(rootPath);
     createDefaultSdk(rootFolder);
-    String projectPath = pathContext.join(rootPath, 'project');
-    String packageFilePath = pathContext.join(projectPath, '.packages');
-    String packageA = pathContext.join(rootPath, 'pkgs', 'a');
-    String embedderPath = pathContext.join(packageA, '_embedder.yaml');
-    String packageB = pathContext.join(rootPath, 'pkgs', 'b');
-    String extensionPath = pathContext.join(packageB, '_sdkext');
-    createFile(packageFilePath, '''
-a:${pathContext.toUri(packageA)}
-b:${pathContext.toUri(packageB)}
+    String projectPath = join(rootPath, 'project');
+    String packageFilePath = join(projectPath, '.packages');
+    String packageA = join(rootPath, 'pkgs', 'a');
+    String embedderPath = join(packageA, '_embedder.yaml');
+    String packageB = join(rootPath, 'pkgs', 'b');
+    String extensionPath = join(packageB, '_sdkext');
+    newFile(packageFilePath, content: '''
+a:${resourceProvider.pathContext.toUri(packageA)}
+b:${resourceProvider.pathContext.toUri(packageB)}
 ''');
-    String asyncPath = pathContext.join(packageA, 'sdk', 'async.dart');
-    String corePath = pathContext.join(packageA, 'sdk', 'core.dart');
-    createFile(embedderPath, '''
+    String asyncPath = join(packageA, 'sdk', 'async.dart');
+    String corePath = join(packageA, 'sdk', 'core.dart');
+    newFile(embedderPath, content: '''
 embedded_libs:
   "dart:async": ${_relativeUri(asyncPath, from: packageA)}
   "dart:core": ${_relativeUri(corePath, from: packageA)}
 ''');
-    String fooPath = pathContext.join(packageB, 'ext', 'foo.dart');
-    createFile(extensionPath, '''{
+    String fooPath = join(packageB, 'ext', 'foo.dart');
+    newFile(extensionPath, content: '''{
 "dart:foo": "${_relativeUri(fooPath, from: packageB)}"
 }''');
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
@@ -504,25 +486,25 @@
 
     Source packageSource = factory.forUri('package:b/b.dart');
     expect(packageSource, isNotNull);
-    expect(packageSource.fullName, pathContext.join(packageB, 'b.dart'));
+    expect(packageSource.fullName, join(packageB, 'b.dart'));
   }
 
   void test_createSourceFactory_noProvider_packages_embedder_noExtensions() {
-    String rootPath = resourceProvider.convertPath('/root');
-    Folder rootFolder = resourceProvider.getFolder(rootPath);
+    String rootPath = convertPath('/root');
+    Folder rootFolder = getFolder(rootPath);
     createDefaultSdk(rootFolder);
-    String projectPath = pathContext.join(rootPath, 'project');
-    String packageFilePath = pathContext.join(projectPath, '.packages');
-    String packageA = pathContext.join(rootPath, 'pkgs', 'a');
-    String embedderPath = pathContext.join(packageA, '_embedder.yaml');
-    String packageB = pathContext.join(rootPath, 'pkgs', 'b');
-    createFile(packageFilePath, '''
-a:${pathContext.toUri(packageA)}
-b:${pathContext.toUri(packageB)}
+    String projectPath = join(rootPath, 'project');
+    String packageFilePath = join(projectPath, '.packages');
+    String packageA = join(rootPath, 'pkgs', 'a');
+    String embedderPath = join(packageA, '_embedder.yaml');
+    String packageB = join(rootPath, 'pkgs', 'b');
+    newFile(packageFilePath, content: '''
+a:${resourceProvider.pathContext.toUri(packageA)}
+b:${resourceProvider.pathContext.toUri(packageB)}
 ''');
-    String asyncPath = pathContext.join(packageA, 'sdk', 'async.dart');
-    String corePath = pathContext.join(packageA, 'sdk', 'core.dart');
-    createFile(embedderPath, '''
+    String asyncPath = join(packageA, 'sdk', 'async.dart');
+    String corePath = join(packageA, 'sdk', 'core.dart');
+    newFile(embedderPath, content: '''
 embedded_libs:
   "dart:async": ${_relativeUri(asyncPath, from: packageA)}
   "dart:core": ${_relativeUri(corePath, from: packageA)}
@@ -537,7 +519,7 @@
 
     Source packageSource = factory.forUri('package:b/b.dart');
     expect(packageSource, isNotNull);
-    expect(packageSource.fullName, pathContext.join(packageB, 'b.dart'));
+    expect(packageSource.fullName, join(packageB, 'b.dart'));
   }
 
   @failingTest
@@ -546,16 +528,16 @@
   }
 
   void test_createSourceFactory_noProvider_packages_noEmbedder_noExtensions() {
-    String rootPath = resourceProvider.convertPath('/root');
-    Folder rootFolder = resourceProvider.getFolder(rootPath);
+    String rootPath = convertPath('/root');
+    Folder rootFolder = getFolder(rootPath);
     createDefaultSdk(rootFolder);
-    String projectPath = pathContext.join(rootPath, 'project');
-    String packageFilePath = pathContext.join(projectPath, '.packages');
-    String packageA = pathContext.join(rootPath, 'pkgs', 'a');
-    String packageB = pathContext.join(rootPath, 'pkgs', 'b');
-    createFile(packageFilePath, '''
-a:${pathContext.toUri(packageA)}
-b:${pathContext.toUri(packageB)}
+    String projectPath = join(rootPath, 'project');
+    String packageFilePath = join(projectPath, '.packages');
+    String packageA = join(rootPath, 'pkgs', 'a');
+    String packageB = join(rootPath, 'pkgs', 'b');
+    newFile(packageFilePath, content: '''
+a:${resourceProvider.pathContext.toUri(packageA)}
+b:${resourceProvider.pathContext.toUri(packageB)}
 ''');
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
 
@@ -563,12 +545,12 @@
 
     Source dartSource = factory.forUri('dart:core');
     expect(dartSource, isNotNull);
-    expect(dartSource.fullName,
-        pathContext.join(defaultSdkPath, 'lib', 'core', 'core.dart'));
+    expect(
+        dartSource.fullName, join(defaultSdkPath, 'lib', 'core', 'core.dart'));
 
     Source packageSource = factory.forUri('package:a/a.dart');
     expect(packageSource, isNotNull);
-    expect(packageSource.fullName, pathContext.join(packageA, 'a.dart'));
+    expect(packageSource.fullName, join(packageA, 'a.dart'));
   }
 
   void test_declareVariables_emptyMap() {
@@ -633,10 +615,8 @@
     DartSdk sdk = builder.findSdk(null, new AnalysisOptionsImpl());
     expect(sdk, isNotNull);
     Source htmlSource = sdk.mapDartUri('dart:html');
-    expect(
-        htmlSource.fullName,
-        resourceProvider
-            .convertPath('/sdk/lib/html/dart2js/html_dart2js.dart'));
+    expect(htmlSource.fullName,
+        convertPath('/sdk/lib/html/dart2js/html_dart2js.dart'));
     expect(htmlSource.exists(), isTrue);
   }
 
@@ -647,25 +627,19 @@
     AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
     expected.lint = true;
     expected.lintRules = <Linter>[_mockLintRule];
-    createFile(resourceProvider.convertPath('/root/WORKSPACE'), '');
-    createFile(
-        resourceProvider
-            .convertPath('/root/dart/analysis_options/lib/default.yaml'),
-        '''
+    newFile('/root/WORKSPACE');
+    newFile('/root/dart/analysis_options/lib/default.yaml', content: '''
 linter:
   rules:
     - mock_lint_rule
 ''');
-    createFile(
-        resourceProvider
-            .convertPath('/root/dart/analysis_options/lib/flutter.yaml'),
-        '''
+    newFile('/root/dart/analysis_options/lib/flutter.yaml', content: '''
 linter:
   rules:
     - mock_lint_rule2
 ''');
-    AnalysisOptions options = builder
-        .getAnalysisOptions(resourceProvider.convertPath('/root/some/path'));
+    AnalysisOptions options =
+        builder.getAnalysisOptions(convertPath('/root/some/path'));
     _expectEqualOptions(options, expected);
   }
 
@@ -676,18 +650,15 @@
     AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
     expected.lint = true;
     expected.lintRules = <Linter>[_mockLintRule];
-    String packagesFilePath =
-        resourceProvider.convertPath('/some/directory/path/.packages');
-    createFile(packagesFilePath, 'flutter:/pkg/flutter/lib/');
-    String optionsFilePath = resourceProvider
-        .convertPath('/pkg/flutter/lib/analysis_options_user.yaml');
-    createFile(optionsFilePath, '''
+    String packagesFilePath = convertPath('/some/directory/path/.packages');
+    newFile(packagesFilePath, content: 'flutter:/pkg/flutter/lib/');
+    newFile('/pkg/flutter/lib/analysis_options_user.yaml', content: '''
 linter:
   rules:
     - mock_lint_rule
 ''');
-    String projPath = resourceProvider.convertPath('/some/directory/path');
-    AnalysisOptions options = builder.getAnalysisOptions(projPath);
+    String projectPath = convertPath('/some/directory/path');
+    AnalysisOptions options = builder.getAnalysisOptions(projectPath);
     _expectEqualOptions(options, expected);
   }
 
@@ -697,10 +668,9 @@
     builderOptions.defaultOptions = defaultOptions;
     AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
     expected.enableLazyAssignmentOperators = true;
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 linter:
   rules:
     - empty_constructor_bodies
@@ -716,10 +686,9 @@
     builderOptions.defaultOptions = defaultOptions;
     AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
     expected.implicitDynamic = false;
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 analyzer:
   strong-mode:
     implicit-dynamic: false
@@ -730,13 +699,12 @@
   }
 
   void test_getAnalysisOptions_gnWorkspace() {
-    String _p(String path) => resourceProvider.convertPath(path);
+    String _p(String path) => convertPath(path);
     String projectPath = _p('/workspace/some/path');
-    resourceProvider.newFolder(_p('/workspace/.jiri_root'));
-    resourceProvider.newFile(
-        _p('/workspace/out/debug/gen/dart.sources/foo_pkg'),
-        _p('/workspace/foo_pkg/lib'));
-    resourceProvider.newFolder(projectPath);
+    newFolder('/workspace/.jiri_root');
+    newFile('/workspace/out/debug/gen/dart.sources/foo_pkg',
+        content: _p('/workspace/foo_pkg/lib'));
+    newFolder(projectPath);
     ArgParser argParser = new ArgParser();
     defineAnalysisArguments(argParser);
     ArgResults argResults = argParser.parse([]);
@@ -759,25 +727,23 @@
       _mockLintRule2,
       _mockLintRule3
     ];
-    resourceProvider.newFile(
-        resourceProvider.convertPath('/mypkgs/somepkg/lib/here.yaml'), '''
+    newFile('/mypkgs/somepkg/lib/here.yaml', content: '''
 linter:
   rules:
     - mock_lint_rule3
 ''');
-    String path = resourceProvider.convertPath('/some/directory/path');
-    resourceProvider.newFile(pathContext.join(path, '.packages'), '''
+    String path = convertPath('/some/directory/path');
+    newFile(join(path, '.packages'), content: '''
 somepkg:../../../mypkgs/somepkg/lib
 ''');
-    resourceProvider.newFile(pathContext.join(path, 'bar.yaml'), '''
+    newFile(join(path, 'bar.yaml'), content: '''
 include: package:somepkg/here.yaml
 linter:
   rules:
     - mock_lint_rule2
 ''');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 include: bar.yaml
 linter:
   rules:
@@ -789,20 +755,18 @@
   }
 
   void test_getAnalysisOptions_invalid() {
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, ';');
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: ';');
 
     AnalysisOptions options = builder.getAnalysisOptions(path);
     expect(options, isNotNull);
   }
 
   void test_getAnalysisOptions_noDefault_noOverrides() {
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 linter:
   rules:
     - empty_constructor_bodies
@@ -815,10 +779,9 @@
   void test_getAnalysisOptions_noDefault_overrides() {
     AnalysisOptionsImpl expected = new AnalysisOptionsImpl();
     expected.implicitDynamic = false;
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 analyzer:
   strong-mode:
     implicit-dynamic: false
@@ -829,24 +792,41 @@
   }
 
   void test_getAnalysisOptions_optionsPath() {
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '''
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath, content: '''
 linter:
   rules:
     - empty_constructor_bodies
 ''');
 
-    ContextRoot root = new ContextRoot(path, [], pathContext: pathContext);
+    ContextRoot root =
+        new ContextRoot(path, [], pathContext: resourceProvider.pathContext);
     builder.getAnalysisOptions(path, contextRoot: root);
     expect(root.optionsFilePath, equals(filePath));
   }
 
+  void test_getAnalysisOptions_sdkVersionConstraint() {
+    var projectPath = convertPath('/test');
+    newFile(join(projectPath, AnalysisEngine.PUBSPEC_YAML_FILE), content: '''
+environment:
+  sdk: ^2.1.0
+''');
+
+    var options = builder.getAnalysisOptions(projectPath);
+    expect(options.sdkVersionConstraint.toString(), '^2.1.0');
+  }
+
+  void test_getAnalysisOptions_sdkVersionConstraint_any_noOptionsFile() {
+    var projectPath = convertPath('/test');
+    var options = builder.getAnalysisOptions(projectPath);
+    expect(options.sdkVersionConstraint, isNull);
+  }
+
   void test_getOptionsFile_explicit() {
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath = resourceProvider.convertPath('/options/analysis.yaml');
-    resourceProvider.newFile(filePath, '');
+    String path = convertPath('/some/directory/path');
+    String filePath = convertPath('/options/analysis.yaml');
+    newFile(filePath);
 
     builderOptions.defaultAnalysisOptionsFilePath = filePath;
     File result = builder.getOptionsFile(path);
@@ -855,11 +835,11 @@
   }
 
   void test_getOptionsFile_inParentOfRoot_new() {
-    String parentPath = resourceProvider.convertPath('/some/directory');
-    String path = pathContext.join(parentPath, 'path');
+    String parentPath = convertPath('/some/directory');
+    String path = join(parentPath, 'path');
     String filePath =
-        pathContext.join(parentPath, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '');
+        join(parentPath, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath);
 
     File result = builder.getOptionsFile(path);
     expect(result, isNotNull);
@@ -867,11 +847,10 @@
   }
 
   void test_getOptionsFile_inParentOfRoot_old() {
-    String parentPath = resourceProvider.convertPath('/some/directory');
-    String path = pathContext.join(parentPath, 'path');
-    String filePath =
-        pathContext.join(parentPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE);
-    resourceProvider.newFile(filePath, '');
+    String parentPath = convertPath('/some/directory');
+    String path = join(parentPath, 'path');
+    String filePath = join(parentPath, AnalysisEngine.ANALYSIS_OPTIONS_FILE);
+    newFile(filePath);
 
     File result = builder.getOptionsFile(path);
     expect(result, isNotNull);
@@ -879,10 +858,9 @@
   }
 
   void test_getOptionsFile_inRoot_new() {
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    resourceProvider.newFile(filePath, '');
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    newFile(filePath);
 
     File result = builder.getOptionsFile(path);
     expect(result, isNotNull);
@@ -890,16 +868,77 @@
   }
 
   void test_getOptionsFile_inRoot_old() {
-    String path = resourceProvider.convertPath('/some/directory/path');
-    String filePath =
-        pathContext.join(path, AnalysisEngine.ANALYSIS_OPTIONS_FILE);
-    resourceProvider.newFile(filePath, '');
+    String path = convertPath('/some/directory/path');
+    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_FILE);
+    newFile(filePath);
 
     File result = builder.getOptionsFile(path);
     expect(result, isNotNull);
     expect(result.path, filePath);
   }
 
+  void test_createWorkspace_hasPackagesFile_hasDartToolAndPubspec() {
+    newFile('/workspace/.packages');
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, '/workspace/project/lib/lib.dart', builder);
+    expect(workspace, TypeMatcher<PackageBuildWorkspace>());
+  }
+
+  void test_createWorkspace_hasPackagesFile_hasPubspec() {
+    newFile('/workspace/.packages');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, '/workspace/project/lib/lib.dart', builder);
+    expect(workspace, TypeMatcher<PubWorkspace>());
+  }
+
+  void test_createWorkspace_hasPackagesFile_noMarkerFiles() {
+    newFile('/workspace/.packages');
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, '/workspace/project/lib/lib.dart', builder);
+    expect(workspace, TypeMatcher<BasicWorkspace>());
+  }
+
+  void test_createWorkspace_noPackagesFile_hasDartToolAndPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, '/workspace/project/lib/lib.dart', builder);
+    expect(workspace, TypeMatcher<PackageBuildWorkspace>());
+  }
+
+  void test_createWorkspace_noPackagesFile_hasPubspec() {
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, '/workspace/project/lib/lib.dart', builder);
+    expect(workspace, TypeMatcher<PubWorkspace>());
+  }
+
+  void test_createWorkspace_noPackagesFile_noMarkerFiles() {
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, '/workspace/project/lib/lib.dart', builder);
+    expect(workspace, TypeMatcher<BasicWorkspace>());
+  }
+
+  void test_createWorkspace_noPackagesFile_hasGnMarkerFiles() {
+    newFolder('/workspace/.jiri_root');
+    newFile(
+        '/workspace/out/debug-x87_128/dartlang/gen/project/lib/lib.packages');
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, '/workspace/project/lib/lib.dart', builder);
+    expect(workspace, TypeMatcher<GnWorkspace>());
+  }
+
+  void test_createWorkspace_noPackagesFile_hasBazelMarkerFiles() {
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    Workspace workspace = ContextBuilder.createWorkspace(
+        resourceProvider, '/workspace/project/lib/lib.dart', builder);
+    expect(workspace, TypeMatcher<BazelWorkspace>());
+  }
+
   _defineMockLintRules() {
     _mockLintRule = new _MockLintRule('mock_lint_rule');
     Registry.ruleRegistry.registerDefault(_mockLintRule);
@@ -931,7 +970,6 @@
     expect(actual.preserveComments, expected.preserveComments);
     expect(actual.strongMode, expected.strongMode);
     expect(actual.strongModeHints, expected.strongModeHints);
-    expect(actual.declarationCasts, expected.declarationCasts);
     expect(actual.implicitCasts, expected.implicitCasts);
     expect(actual.implicitDynamic, expected.implicitDynamic);
     expect(actual.trackCacheDependencies, expected.trackCacheDependencies);
@@ -939,6 +977,7 @@
   }
 
   Uri _relativeUri(String path, {String from}) {
+    var pathContext = resourceProvider.pathContext;
     String relativePath = pathContext.relative(path, from: from);
     return pathContext.toUri(relativePath);
   }
diff --git a/pkg/analyzer/test/src/context/cache_test.dart b/pkg/analyzer/test/src/context/cache_test.dart
index fbd0736..2b42c7d9 100644
--- a/pkg/analyzer/test/src/context/cache_test.dart
+++ b/pkg/analyzer/test/src/context/cache_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
@@ -14,6 +13,7 @@
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/task/api/model.dart';
 import 'package:analyzer/src/task/model.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -1162,13 +1162,12 @@
 }
 
 @reflectiveTest
-class PackageCachePartitionTest extends CachePartitionTest {
-  MemoryResourceProvider resourceProvider;
+class PackageCachePartitionTest extends CachePartitionTest
+    with ResourceProviderMixin {
   Folder rootFolder;
 
   CachePartition createPartition() {
-    resourceProvider = new MemoryResourceProvider();
-    rootFolder = resourceProvider.newFolder('/package/root');
+    rootFolder = newFolder('/package/root');
     return new PackageCachePartition(null, rootFolder);
   }
 
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index b33ce36..5822d82 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -33,6 +33,7 @@
 
 import '../../generated/engine_test.dart';
 import '../../generated/test_support.dart';
+import '../../util/element_type_matchers.dart';
 import 'abstract_context.dart';
 
 main() {
@@ -1671,8 +1672,7 @@
     expect(library, isNotNull);
     Namespace namespace = context.getPublicNamespace(library);
     expect(namespace, isNotNull);
-    EngineTestCase.assertInstanceOf(
-        (obj) => obj is ClassElement, ClassElement, namespace.get("A"));
+    expect(namespace.get("A"), isClassElement);
   }
 
   void test_getResolvedCompilationUnit_library() {
@@ -2686,7 +2686,7 @@
   void test_validateCacheConsistency_deletedFile() {
     String pathA = '/a.dart';
     String pathB = '/b.dart';
-    var fileA = newFile(pathA, content: "");
+    var fileA = newFile(pathA);
     var fileB = newFile(pathB, content: "import 'a.dart';");
     Source sourceA = fileA.createSource();
     Source sourceB = fileB.createSource();
diff --git a/pkg/analyzer/test/src/context/mock_sdk.dart b/pkg/analyzer/test/src/context/mock_sdk.dart
deleted file mode 100644
index 6dd644f..0000000
--- a/pkg/analyzer/test/src/context/mock_sdk.dart
+++ /dev/null
@@ -1,680 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/file_system/file_system.dart' as resource;
-import 'package:analyzer/file_system/memory_file_system.dart' as resource;
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
-import 'package:analyzer/src/summary/summary_file_builder.dart';
-
-const String librariesContent = r'''
-const Map<String, LibraryInfo> libraries = const {
-  "async": const LibraryInfo("async/async.dart"),
-  "collection": const LibraryInfo("collection/collection.dart"),
-  "convert": const LibraryInfo("convert/convert.dart"),
-  "core": const LibraryInfo("core/core.dart"),
-  "html": const LibraryInfo(
-    "html/dartium/html_dartium.dart",
-    dart2jsPath: "html/dart2js/html_dart2js.dart"),
-  "math": const LibraryInfo("math/math.dart"),
-  "_foreign_helper": const LibraryInfo("_internal/js_runtime/lib/foreign_helper.dart"),
-};
-''';
-
-const String sdkRoot = '/sdk';
-
-const _MockSdkLibrary _LIB_ASYNC =
-    const _MockSdkLibrary('dart:async', '$sdkRoot/lib/async/async.dart', '''
-library dart.async;
-
-import 'dart:math';
-
-part 'stream.dart';
-
-class Future<T> {
-  factory Future(computation()) => null;
-  factory Future.delayed(Duration duration, [T computation()]) => null;
-  factory Future.microtask(FutureOr<T> computation()) => null;
-  factory Future.value([FutureOr<T> result]) => null;
-
-  static Future<List<T>> wait<T>(
-      Iterable<Future<T>> futures) => null;
-  Future<R> then<R>(FutureOr<R> onValue(T value)) => null;
-
-  Future<T> whenComplete(action());
-}
-
-class FutureOr<T> {}
-
-abstract class Completer<T> {
-  factory Completer() => null;
-  factory Completer.sync() => null;
-  Future<T> get future;
-  void complete([value]);
-  void completeError(Object error, [StackTrace stackTrace]);
-  bool get isCompleted;
-}
-
-class _StreamIterator<T> implements StreamIterator<T> {}
-class _AsyncStarStreamController {}
-Function _asyncThenWrapperHelper(continuation) {}
-Function _asyncErrorWrapperHelper(continuation) {}
-Future _awaitHelper(
-    object, Function thenCallback, Function errorCallback, var awaiter) {}
-''', const <String, String>{
-  '$sdkRoot/lib/async/stream.dart': r'''
-part of dart.async;
-abstract class Stream<T> {
-  Future<T> get first;
-  StreamSubscription<T> listen(void onData(T event),
-                               { Function onError,
-                                 void onDone(),
-                                 bool cancelOnError});
-  Stream();
-  factory Stream.fromIterable(Iterable<T> data) => null;
-}
-
-abstract class StreamIterator<T> {}
-
-abstract class StreamSubscription<T> {
-  Future cancel();
-  void onData(void handleData(T data));
-  void onError(Function handleError);
-  void onDone(void handleDone());
-  void pause([Future resumeSignal]);
-  void resume();
-  bool get isPaused;
-  Future<E> asFuture<E>([E futureValue]);
-}
-
-abstract class StreamTransformer<S, T> {}
-'''
-});
-
-const _MockSdkLibrary _LIB_ASYNC2 =
-    const _MockSdkLibrary('dart:async2', '$sdkRoot/lib/async2/async2.dart', '''
-library dart.async2;
-
-class Future {}
-''');
-
-const _MockSdkLibrary _LIB_COLLECTION = const _MockSdkLibrary(
-    'dart:collection', '$sdkRoot/lib/collection/collection.dart', '''
-library dart.collection;
-
-abstract class HashMap<K, V> implements Map<K, V> {}
-''');
-
-const _MockSdkLibrary _LIB_CONVERT = const _MockSdkLibrary(
-    'dart:convert', '$sdkRoot/lib/convert/convert.dart', '''
-library dart.convert;
-
-import 'dart:async';
-
-abstract class Converter<S, T> implements StreamTransformer {}
-class JsonDecoder extends Converter<String, Object> {}
-''');
-
-const _MockSdkLibrary _LIB_CORE =
-    const _MockSdkLibrary('dart:core', '$sdkRoot/lib/core/core.dart', '''
-library dart.core;
-
-import 'dart:async';
-import 'dart:_internal';
-
-class Object {
-  const Object();
-  bool operator ==(other) => identical(this, other);
-  String toString() => 'a string';
-  int get hashCode => 0;
-  Type get runtimeType => null;
-  dynamic noSuchMethod(Invocation invocation) => null;
-}
-
-class Function {}
-class StackTrace {}
-
-class Symbol {
-  const factory Symbol(String name) = _SymbolImpl;
-}
-
-class _SymbolImpl {
-  const _SymbolImpl(String name);
-}
-
-class Type {}
-
-abstract class Comparable<T> {
-  int compareTo(T other);
-}
-
-abstract class Pattern {}
-abstract class String implements Comparable<String>, Pattern {
-  external factory String.fromCharCodes(Iterable<int> charCodes,
-                                        [int start = 0, int end]);
-  String operator +(String other) => null;
-  bool operator ==(Object other);
-  bool get isEmpty => false;
-  bool get isNotEmpty => false;
-  int get length => 0;
-  int codeUnitAt(int index);
-  String substring(int len) => null;
-  String toLowerCase();
-  String toUpperCase();
-  List<int> get codeUnits;
-}
-abstract class RegExp implements Pattern {
-  external factory RegExp(String source);
-}
-
-class bool extends Object {
-  external const factory bool.fromEnvironment(String name,
-                                              {bool defaultValue: false});
-}
-
-abstract class Invocation {}
-
-abstract class num implements Comparable<num> {
-  bool operator ==(Object other);
-  bool operator <(num other);
-  bool operator <=(num other);
-  bool operator >(num other);
-  bool operator >=(num other);
-  num operator +(num other);
-  num operator -(num other);
-  num operator *(num other);
-  double operator /(num other);
-  int operator ^(int other);
-  int operator |(int other);
-  int operator <<(int other);
-  int operator >>(int other);
-  int operator ~/(num other);
-  num operator %(num other);
-  int operator ~();
-  num operator -();
-  int toInt();
-  double toDouble();
-  num abs();
-  int round();
-}
-abstract class int extends num {
-  external const factory int.fromEnvironment(String name, {int defaultValue});
-
-  bool get isNegative;
-  bool get isEven => false;
-
-  int operator &(int other);
-  int operator |(int other);
-  int operator ^(int other);
-  int operator ~();
-  int operator <<(int shiftAmount);
-  int operator >>(int shiftAmount);
-
-  int operator -();
-
-  external static int parse(String source,
-                            { int radix,
-                              int onError(String source) });
-
-  String toString();
-}
-
-abstract class double extends num {
-  static const double NAN = 0.0 / 0.0;
-  static const double INFINITY = 1.0 / 0.0;
-  static const double NEGATIVE_INFINITY = -INFINITY;
-  static const double MIN_POSITIVE = 5e-324;
-  static const double MAX_FINITE = 1.7976931348623157e+308;
-
-  double remainder(num other);
-  double operator +(num other);
-  double operator -(num other);
-  double operator *(num other);
-  double operator %(num other);
-  double operator /(num other);
-  int operator ~/(num other);
-  double operator -();
-  double abs();
-  double get sign;
-  int round();
-  int floor();
-  int ceil();
-  int truncate();
-  double roundToDouble();
-  double floorToDouble();
-  double ceilToDouble();
-  double truncateToDouble();
-  external static double parse(String source,
-                               [double onError(String source)]);
-}
-
-class DateTime extends Object {}
-
-class Null extends Object {
-  factory Null._uninstantiable() => null;
-}
-
-class Deprecated extends Object {
-  final String expires;
-  const Deprecated(this.expires);
-}
-const Object deprecated = const Deprecated("next release");
-
-class Iterator<E> {
-  bool moveNext();
-  E get current;
-}
-
-abstract class Iterable<E> {
-  Iterator<E> get iterator;
-  bool get isEmpty;
-  E get first;
-  int get length;
-
-  Iterable<R> map<R>(R f(E e));
-
-  R fold<R>(R initialValue,
-      R combine(R previousValue, E element)) => null;
-
-  Iterable<T> expand<T>(Iterable<T> f(E element));
-
-  Iterable<E> where(bool test(E element));
-
-  void forEach(void f(E element));
-
-  List<E> toList();
-}
-
-class List<E> implements Iterable<E> {
-  List([int length]);
-  factory List.from(Iterable elements, {bool growable: true}) => null;
-  void add(E value) {}
-  void addAll(Iterable<E> iterable) {}
-  E operator [](int index) => null;
-  void operator []=(int index, E value) {}
-  Iterator<E> get iterator => null;
-  void clear() {}
-
-  bool get isEmpty => false;
-  E get first => null;
-  E get last => null;
-
-}
-
-class Map<K, V> extends Object {
-  Iterable<K> get keys => null;
-  int get length;
-  Iterable<V> get values;
-  V operator [](K key) => null;
-  void operator []=(K key, V value) {}
-  Map<RK, RV> cast<RK, RV>();
-  bool containsKey(Object key);
-}
-
-class Duration implements Comparable<Duration> {}
-
-class Exception {
-  factory Exception([var message]) => null;
-}
-
-external bool identical(Object a, Object b);
-
-void print(Object object) {}
-
-class _Proxy { const _Proxy(); }
-const Object proxy = const _Proxy();
-
-class _Override { const _Override(); }
-const Object override = const _Override();
-
-class _CompileTimeError {
-  final String _errorMsg;
-  _CompileTimeError(this._errorMsg);
-}
-
-class AbstractClassInstantiationError {
-  AbstractClassInstantiationError(String className);
-}
-
-class FallThroughError {
-  FallThroughError();
-  FallThroughError._create(String url, int line);
-}
-
-abstract class _SyncIterable implements Iterable {}
-class _InvocationMirror {
-  _InvocationMirror._withoutType(
-      String _functionName, List<Type> _typeArguments,
-      List _positionalArguments, Map<Symbol, dynamic>_namedArguments,
-      bool _isSuperInvocation);
-}
-''');
-
-const _MockSdkLibrary _LIB_FOREIGN_HELPER = const _MockSdkLibrary(
-    'dart:_foreign_helper',
-    '$sdkRoot/lib/_foreign_helper/_foreign_helper.dart', '''
-library dart._foreign_helper;
-
-JS(String typeDescription, String codeTemplate,
-  [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11])
-{}
-''');
-
-const _MockSdkLibrary _LIB_HTML_DART2JS = const _MockSdkLibrary(
-    'dart:html', '$sdkRoot/lib/html/dart2js/html_dart2js.dart', '''
-library dart.html;
-class HtmlElement {}
-''');
-
-const _MockSdkLibrary _LIB_HTML_DARTIUM = const _MockSdkLibrary(
-    'dart:html', '$sdkRoot/lib/html/dartium/html_dartium.dart', '''
-library dart.dom.html;
-
-final HtmlDocument document;
-
-abstract class Element {}
-
-abstract class HtmlDocument {
-  Element query(String relativeSelectors) => null;
-}
-
-abstract class HtmlElement extends Element {}
-
-abstract class AnchorElement extends HtmlElement {}
-abstract class BodyElement extends HtmlElement {}
-abstract class ButtonElement extends HtmlElement {}
-abstract class DivElement extends HtmlElement {}
-abstract class InputElement extends HtmlElement {}
-abstract class SelectElement extends HtmlElement {}
-
-
-abstract class CanvasElement extends HtmlElement {
-  Object getContext(String contextId, [Map attributes]);
-  CanvasRenderingContext2D get context2D;
-}
-
-abstract class CanvasRenderingContext2D {}
-
-Element query(String relativeSelectors) => null;
-''');
-
-const _MockSdkLibrary _LIB_INTERCEPTORS = const _MockSdkLibrary(
-    'dart:_interceptors',
-    '$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart', '''
-library dart._interceptors;
-''');
-
-const _MockSdkLibrary _LIB_INTERNAL = const _MockSdkLibrary(
-    'dart:_internal', '$sdkRoot/lib/_internal/internal.dart', '''
-library dart._internal;
-class Symbol {}
-class ExternalName {
-  final String name;
-  const ExternalName(this.name);
-}
-''');
-
-const _MockSdkLibrary _LIB_MATH =
-    const _MockSdkLibrary('dart:math', '$sdkRoot/lib/math/math.dart', '''
-library dart.math;
-
-const double E = 2.718281828459045;
-const double PI = 3.1415926535897932;
-const double LN10 =  2.302585092994046;
-
-T min<T extends num>(T a, T b) => null;
-T max<T extends num>(T a, T b) => null;
-
-external double cos(num radians);
-external double sin(num radians);
-external double sqrt(num radians);
-class Random {
-  bool nextBool() => true;
-  double nextDouble() => 2.0;
-  int nextInt() => 1;
-}
-''');
-
-const List<SdkLibrary> _LIBRARIES = const [
-  _LIB_CORE,
-  _LIB_ASYNC,
-  _LIB_ASYNC2,
-  _LIB_COLLECTION,
-  _LIB_CONVERT,
-  _LIB_FOREIGN_HELPER,
-  _LIB_MATH,
-  _LIB_HTML_DART2JS,
-  _LIB_HTML_DARTIUM,
-  _LIB_INTERCEPTORS,
-  _LIB_INTERNAL,
-];
-
-class MockSdk implements DartSdk {
-  static const Map<String, String> _URI_MAP = const {
-    "dart:core": "$sdkRoot/lib/core/core.dart",
-    "dart:html": "$sdkRoot/lib/html/dartium/html_dartium.dart",
-    "dart:async": "$sdkRoot/lib/async/async.dart",
-    "dart:async2": "$sdkRoot/lib/async2/async2.dart",
-    "dart:async/stream.dart": "$sdkRoot/lib/async/stream.dart",
-    "dart:collection": "$sdkRoot/lib/collection/collection.dart",
-    "dart:convert": "$sdkRoot/lib/convert/convert.dart",
-    "dart:_foreign_helper": "$sdkRoot/lib/_foreign_helper/_foreign_helper.dart",
-    "dart:_interceptors":
-        "$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart",
-    "dart:_internal": "$sdkRoot/lib/_internal/internal.dart",
-    "dart:math": "$sdkRoot/lib/math/math.dart"
-  };
-
-  final resource.MemoryResourceProvider provider;
-
-  final Map<String, String> uriMap = {};
-
-  /**
-   * The [AnalysisContextImpl] which is used for all of the sources.
-   */
-  AnalysisContextImpl _analysisContext;
-
-  @override
-  final List<SdkLibrary> sdkLibraries = [];
-
-  /**
-   * The cached linked bundle of the SDK.
-   */
-  PackageBundle _bundle;
-
-  MockSdk(
-      {bool generateSummaryFiles: false,
-      resource.MemoryResourceProvider resourceProvider})
-      : provider = resourceProvider ?? new resource.MemoryResourceProvider() {
-    _URI_MAP.forEach((uri, path) {
-      uriMap[uri] = provider.convertPath(path);
-    });
-
-    for (_MockSdkLibrary library in _LIBRARIES) {
-      var convertedLibrary = library._toProvider(provider);
-      sdkLibraries.add(convertedLibrary);
-    }
-
-    for (_MockSdkLibrary library in sdkLibraries) {
-      provider.newFile(library.path, library.content);
-      library.parts.forEach((String path, String content) {
-        provider.newFile(path, content);
-      });
-    }
-    provider.newFile(
-        provider.convertPath(
-            '$sdkRoot/lib/_internal/sdk_library_metadata/lib/libraries.dart'),
-        librariesContent);
-    if (generateSummaryFiles) {
-      List<int> bytes = _computeLinkedBundleBytes();
-      provider.newFileWithBytes(
-          provider.convertPath('/lib/_internal/strong.sum'), bytes);
-    }
-  }
-
-  @override
-  AnalysisContextImpl get context {
-    if (_analysisContext == null) {
-      _analysisContext = new _SdkAnalysisContext(this);
-      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
-      _analysisContext.sourceFactory = factory;
-    }
-    return _analysisContext;
-  }
-
-  @override
-  String get sdkVersion => throw new UnimplementedError();
-
-  @override
-  List<String> get uris =>
-      sdkLibraries.map((SdkLibrary library) => library.shortName).toList();
-
-  @override
-  Source fromFileUri(Uri uri) {
-    String filePath = provider.pathContext.fromUri(uri);
-    if (!filePath.startsWith(provider.convertPath('$sdkRoot/lib/'))) {
-      return null;
-    }
-    for (SdkLibrary library in sdkLibraries) {
-      String libraryPath = library.path;
-      if (filePath == libraryPath) {
-        try {
-          resource.File file = provider.getResource(filePath);
-          Uri dartUri = Uri.parse(library.shortName);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-      String libraryRootPath = provider.pathContext.dirname(libraryPath) +
-          provider.pathContext.separator;
-      if (filePath.startsWith(libraryRootPath)) {
-        String pathInLibrary = filePath.substring(libraryRootPath.length);
-        String uriStr = '${library.shortName}/$pathInLibrary';
-        try {
-          resource.File file = provider.getResource(filePath);
-          Uri dartUri = Uri.parse(uriStr);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  PackageBundle getLinkedBundle() {
-    if (_bundle == null) {
-      resource.File summaryFile =
-          provider.getFile(provider.convertPath('/lib/_internal/strong.sum'));
-      List<int> bytes;
-      if (summaryFile.exists) {
-        bytes = summaryFile.readAsBytesSync();
-      } else {
-        bytes = _computeLinkedBundleBytes();
-      }
-      _bundle = new PackageBundle.fromBuffer(bytes);
-    }
-    return _bundle;
-  }
-
-  @override
-  SdkLibrary getSdkLibrary(String dartUri) {
-    for (SdkLibrary library in _LIBRARIES) {
-      if (library.shortName == dartUri) {
-        return library;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Source mapDartUri(String dartUri) {
-    String path = uriMap[dartUri];
-    if (path != null) {
-      resource.File file = provider.getResource(path);
-      Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
-      return file.createSource(uri);
-    }
-    // If we reach here then we tried to use a dartUri that's not in the
-    // table above.
-    return null;
-  }
-
-  /**
-   * Compute the bytes of the linked bundle associated with this SDK.
-   */
-  List<int> _computeLinkedBundleBytes() {
-    List<Source> librarySources = sdkLibraries
-        .map((SdkLibrary library) => mapDartUri(library.shortName))
-        .toList();
-    return new SummaryBuilder(librarySources, context).build();
-  }
-}
-
-class _MockSdkLibrary implements SdkLibrary {
-  final String shortName;
-  final String path;
-  final String content;
-  final Map<String, String> parts;
-
-  const _MockSdkLibrary(this.shortName, this.path, this.content,
-      [this.parts = const <String, String>{}]);
-
-  @override
-  String get category => throw new UnimplementedError();
-
-  @override
-  bool get isDart2JsLibrary => throw new UnimplementedError();
-
-  @override
-  bool get isDocumented => throw new UnimplementedError();
-
-  @override
-  bool get isImplementation => throw new UnimplementedError();
-
-  @override
-  bool get isInternal => shortName.startsWith('dart:_');
-
-  @override
-  bool get isShared => throw new UnimplementedError();
-
-  @override
-  bool get isVmLibrary => throw new UnimplementedError();
-
-  _MockSdkLibrary _toProvider(resource.MemoryResourceProvider provider) {
-    return new _MockSdkLibrary(
-      shortName,
-      provider.convertPath(path),
-      content,
-      parts.map((path, content) {
-        var convertedPath = provider.convertPath(path);
-        return new MapEntry(convertedPath, content);
-      }),
-    );
-  }
-}
-
-/**
- * An [AnalysisContextImpl] that only contains sources for a Dart SDK.
- */
-class _SdkAnalysisContext extends AnalysisContextImpl {
-  final DartSdk sdk;
-
-  _SdkAnalysisContext(this.sdk);
-
-  @override
-  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
-    if (factory == null) {
-      return super.createCacheFromSourceFactory(factory);
-    }
-    return new AnalysisCache(
-        <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]);
-  }
-}
diff --git a/pkg/analyzer/test/src/context/source_test.dart b/pkg/analyzer/test/src/context/source_test.dart
index 18cc9b8..45a5ffc 100644
--- a/pkg/analyzer/test/src/context/source_test.dart
+++ b/pkg/analyzer/test/src/context/source_test.dart
@@ -20,8 +20,8 @@
 @reflectiveTest
 class SourceFactoryImplTest extends AbstractContextTest {
   void test_restoreUri() {
-    String libPath = resourceProvider.convertPath('/pkgs/somepkg/lib');
-    Uri libUri = resourceProvider.getFolder(libPath).toUri();
+    String libPath = convertPath('/pkgs/somepkg/lib');
+    Uri libUri = getFolder(libPath).toUri();
     Map<String, Uri> packageUriMap = <String, Uri>{'foo': libUri};
     SourceFactoryImpl sourceFactory = new SourceFactoryImpl(
       <UriResolver>[new ResourceUriResolver(resourceProvider)],
diff --git a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
index 0afd0b0..b2870e7 100644
--- a/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart
@@ -1,15 +1,14 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../context/mock_sdk.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisContextCollectionTest);
@@ -17,7 +16,7 @@
 }
 
 @reflectiveTest
-class AnalysisContextCollectionTest extends Object with ResourceProviderMixin {
+class AnalysisContextCollectionTest with ResourceProviderMixin {
   void setUp() {
     new MockSdk(resourceProvider: resourceProvider);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index e9f6eaa..a834e3d 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -2,12 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
@@ -16,12 +18,10 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 
-import '../../context/mock_sdk.dart';
-
 /**
  * Finds an [Element] with the given [name].
  */
@@ -46,8 +46,7 @@
  */
 typedef void _ElementVisitorFunction(Element element);
 
-class BaseAnalysisDriverTest {
-  final MemoryResourceProvider provider = new MemoryResourceProvider();
+class BaseAnalysisDriverTest with ResourceProviderMixin {
   DartSdk sdk;
   final ByteStore byteStore = new MemoryByteStore();
   final FileContentOverlay contentOverlay = new FileContentOverlay();
@@ -60,7 +59,7 @@
   AnalysisDriverScheduler scheduler;
   AnalysisDriver driver;
   final List<AnalysisStatus> allStatuses = <AnalysisStatus>[];
-  final List<AnalysisResult> allResults = <AnalysisResult>[];
+  final List<ResolvedUnitResult> allResults = <ResolvedUnitResult>[];
   final List<ExceptionResult> allExceptions = <ExceptionResult>[];
 
   String testProject;
@@ -71,7 +70,7 @@
 
   void addTestFile(String content, {bool priority: false}) {
     testCode = content;
-    provider.newFile(testFile, content);
+    newFile(testFile, content: content);
     driver.addFile(testFile);
     if (priority) {
       driver.priorityFiles = [testFile];
@@ -82,25 +81,26 @@
       {Map<String, List<Folder>> packageMap,
       SummaryDataStore externalSummaries}) {
     packageMap ??= <String, List<Folder>>{
-      'test': [provider.getFolder(testProject)],
-      'aaa': [provider.getFolder(_p('/aaa/lib'))],
-      'bbb': [provider.getFolder(_p('/bbb/lib'))],
+      'test': [getFolder(testProject)],
+      'aaa': [getFolder('/aaa/lib')],
+      'bbb': [getFolder('/bbb/lib')],
     };
     return new AnalysisDriver(
         scheduler,
         logger,
-        provider,
+        resourceProvider,
         byteStore,
         contentOverlay,
         null,
         new SourceFactory([
           new DartUriResolver(sdk),
           generatedUriResolver,
-          new PackageMapUriResolver(provider, packageMap),
-          new ResourceUriResolver(provider)
-        ], null, provider),
+          new PackageMapUriResolver(resourceProvider, packageMap),
+          new ResourceUriResolver(resourceProvider)
+        ], null, resourceProvider),
         createAnalysisOptions(),
         disableChangesAndCacheAllResults: disableChangesAndCacheAllResults,
+        enableIndex: true,
         externalSummaries: externalSummaries);
   }
 
@@ -137,9 +137,9 @@
   }
 
   void setUp() {
-    sdk = new MockSdk(resourceProvider: provider);
-    testProject = _p('/test/lib');
-    testFile = _p('/test/lib/test.dart');
+    sdk = new MockSdk(resourceProvider: resourceProvider);
+    testProject = convertPath('/test/lib');
+    testFile = convertPath('/test/lib/test.dart');
     logger = new PerformanceLog(logBuffer);
     scheduler = new AnalysisDriverScheduler(logger);
     driver = createAnalysisDriver();
@@ -150,8 +150,6 @@
   }
 
   void tearDown() {}
-
-  String _p(String path) => provider.convertPath(path);
 }
 
 /**
@@ -174,6 +172,9 @@
   Uri Function(Source) restoreAbsoluteFunction;
 
   @override
+  void clearCache() {}
+
+  @override
   noSuchMethod(Invocation invocation) {
     throw new StateError('Unexpected invocation of ${invocation.memberName}');
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
index 86c3094..c98351b 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_builder_test.dart
@@ -7,16 +7,14 @@
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/context_root.dart';
 import 'package:analyzer/dart/analysis/declared_variables.dart';
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/context_builder.dart';
 import 'package:analyzer/src/dart/analysis/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../context/mock_sdk.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ContextBuilderImplTest);
@@ -24,7 +22,7 @@
 }
 
 @reflectiveTest
-class ContextBuilderImplTest extends Object with ResourceProviderMixin {
+class ContextBuilderImplTest with ResourceProviderMixin {
   ContextBuilderImpl contextBuilder;
   ContextRoot contextRoot;
 
@@ -38,11 +36,9 @@
   }
 
   void setUp() {
-    resourceProvider.newFolder(resourceProvider.pathContext.dirname(
-        resourceProvider.pathContext.dirname(io.Platform.resolvedExecutable)));
+    newFile(io.Platform.resolvedExecutable); // create folders
+    var folder = newFolder('/home/test');
     contextBuilder = new ContextBuilderImpl(resourceProvider: resourceProvider);
-    String path = resourceProvider.convertPath('/temp/root');
-    Folder folder = resourceProvider.newFolder(path);
     contextRoot = new ContextRootImpl(resourceProvider, folder);
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index 388be9b..300320e 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -16,7 +16,7 @@
 }
 
 @reflectiveTest
-class ContextLocatorImplTest extends Object with ResourceProviderMixin {
+class ContextLocatorImplTest with ResourceProviderMixin {
   ContextLocatorImpl contextLocator;
 
   ContextRoot findRoot(List<ContextRoot> roots, Resource rootFolder) {
@@ -440,6 +440,31 @@
     expect(outerRoot.packagesFile, outerPackagesFile);
   }
 
+  @failingTest
+  void test_locateRoots_options_withExclude() {
+    // https://github.com/dart-lang/sdk/issues/35519
+    Folder rootFolder = newFolder('/test/outer');
+    newFolder('/test/outer/test/data');
+    File dataFile = newFile('/test/outer/test/data/test.dart');
+    File optionsFile = newOptionsFile('/test/outer', content: '''
+analyzer:
+  exclude:
+    - test/data/**
+''');
+    File packagesFile = newPackagesFile('/test/outer');
+
+    List<ContextRoot> roots =
+        contextLocator.locateRoots(includedPaths: [rootFolder.path]);
+    expect(roots, hasLength(1));
+
+    ContextRoot root = findRoot(roots, rootFolder);
+    expect(root.includedPaths, unorderedEquals([rootFolder.path]));
+    expect(root.excludedPaths, isEmpty);
+    expect(root.isAnalyzed(dataFile.path), isFalse);
+    expect(root.optionsFile, optionsFile);
+    expect(root.packagesFile, packagesFile);
+  }
+
   void test_locateRoots_single_dir_directOptions_directPackages() {
     Folder rootFolder = newFolder('/test/root');
     File optionsFile = newOptionsFile('/test/root');
diff --git a/pkg/analyzer/test/src/dart/analysis/context_root_test.dart b/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
index 9b6324d..6edc6d2 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_root_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/analysis/context_root.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -15,50 +15,48 @@
 }
 
 @reflectiveTest
-class ContextRootTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
+class ContextRootTest with ResourceProviderMixin {
   String rootPath;
   Folder rootFolder;
   ContextRootImpl contextRoot;
 
   void setUp() {
-    rootPath = provider.convertPath('/test/root');
-    rootFolder = provider.newFolder(rootPath);
-    contextRoot = new ContextRootImpl(provider, rootFolder);
+    rootPath = convertPath('/test/root');
+    rootFolder = newFolder(rootPath);
+    contextRoot = new ContextRootImpl(resourceProvider, rootFolder);
     contextRoot.included.add(rootFolder);
   }
 
   test_analyzedFiles() {
-    String optionsPath =
-        provider.convertPath('/test/root/analysis_options.yaml');
-    String readmePath = provider.convertPath('/test/root/README.md');
-    String aPath = provider.convertPath('/test/root/lib/a.dart');
-    String bPath = provider.convertPath('/test/root/lib/src/b.dart');
-    String excludePath = provider.convertPath('/test/root/exclude');
-    String cPath = provider.convertPath('/test/root/exclude/c.dart');
+    String optionsPath = convertPath('/test/root/analysis_options.yaml');
+    String readmePath = convertPath('/test/root/README.md');
+    String aPath = convertPath('/test/root/lib/a.dart');
+    String bPath = convertPath('/test/root/lib/src/b.dart');
+    String excludePath = convertPath('/test/root/exclude');
+    String cPath = convertPath('/test/root/exclude/c.dart');
 
-    provider.newFile(optionsPath, '');
-    provider.newFile(readmePath, '');
-    provider.newFile(aPath, '');
-    provider.newFile(bPath, '');
-    provider.newFile(cPath, '');
-    contextRoot.excluded.add(provider.newFolder(excludePath));
+    newFile(optionsPath);
+    newFile(readmePath);
+    newFile(aPath);
+    newFile(bPath);
+    newFile(cPath);
+    contextRoot.excluded.add(newFolder(excludePath));
 
     expect(contextRoot.analyzedFiles(),
         unorderedEquals([optionsPath, readmePath, aPath, bPath]));
   }
 
   test_isAnalyzed_explicitlyExcluded() {
-    String excludePath = provider.convertPath('/test/root/exclude');
-    String filePath = provider.convertPath('/test/root/exclude/root.dart');
-    contextRoot.excluded.add(provider.newFolder(excludePath));
+    String excludePath = convertPath('/test/root/exclude');
+    String filePath = convertPath('/test/root/exclude/root.dart');
+    contextRoot.excluded.add(newFolder(excludePath));
     expect(contextRoot.isAnalyzed(filePath), isFalse);
   }
 
   test_isAnalyzed_explicitlyExcluded_same() {
-    String aPath = provider.convertPath('/test/root/lib/a.dart');
-    String bPath = provider.convertPath('/test/root/lib/b.dart');
-    File aFile = provider.getFile(aPath);
+    String aPath = convertPath('/test/root/lib/a.dart');
+    String bPath = convertPath('/test/root/lib/b.dart');
+    File aFile = getFile(aPath);
 
     contextRoot.excluded.add(aFile);
 
@@ -67,26 +65,26 @@
   }
 
   test_isAnalyzed_implicitlyExcluded_dot_analysisOptions() {
-    String filePath = provider.convertPath('/test/root/lib/.analysis_options');
+    String filePath = convertPath('/test/root/lib/.analysis_options');
     expect(contextRoot.isAnalyzed(filePath), isFalse);
   }
 
   test_isAnalyzed_implicitlyExcluded_dot_packages() {
-    String filePath = provider.convertPath('/test/root/lib/.packages');
+    String filePath = convertPath('/test/root/lib/.packages');
     expect(contextRoot.isAnalyzed(filePath), isFalse);
   }
 
   test_isAnalyzed_included() {
-    String filePath = provider.convertPath('/test/root/lib/root.dart');
+    String filePath = convertPath('/test/root/lib/root.dart');
     expect(contextRoot.isAnalyzed(filePath), isTrue);
   }
 
   test_isAnalyzed_included_same() {
-    String aPath = provider.convertPath('/test/root/lib/a.dart');
-    String bPath = provider.convertPath('/test/root/lib/b.dart');
-    File aFile = provider.getFile(aPath);
+    String aPath = convertPath('/test/root/lib/a.dart');
+    String bPath = convertPath('/test/root/lib/b.dart');
+    File aFile = getFile(aPath);
 
-    contextRoot = new ContextRootImpl(provider, rootFolder);
+    contextRoot = new ContextRootImpl(resourceProvider, rootFolder);
     contextRoot.included.add(aFile);
 
     expect(contextRoot.isAnalyzed(aPath), isTrue);
@@ -94,8 +92,8 @@
   }
 
   test_isAnalyzed_packagesDirectory_analyzed() {
-    String folderPath = provider.convertPath('/test/root/lib/packages');
-    provider.newFolder(folderPath);
+    String folderPath = convertPath('/test/root/lib/packages');
+    newFolder(folderPath);
     expect(contextRoot.isAnalyzed(folderPath), isTrue);
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/base.dart b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
new file mode 100644
index 0000000..b217244
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/base.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/analysis/dependency/library_builder.dart';
+import 'package:analyzer/src/dart/analysis/dependency/node.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+
+import '../../resolution/driver_resolution.dart';
+
+class BaseDependencyTest extends DriverResolutionTest {
+//  DependencyTracker tracker;
+  String a;
+  String b;
+  String c;
+  Uri aUri;
+  Uri bUri;
+  Uri cUri;
+
+  bool hasDartCore = false;
+
+  void assertNodes(List<Node> actualNodes, List<ExpectedNode> expectedNodes,
+      {Node expectedEnclosingClass}) {
+    expect(actualNodes, hasLength(expectedNodes.length));
+    for (var expectedNode in expectedNodes) {
+      var topNode = _getNode(
+        actualNodes,
+        uri: expectedNode.uri,
+        name: expectedNode.name,
+        kind: expectedNode.kind,
+      );
+      expect(topNode.enclosingClass, expectedEnclosingClass);
+
+      if (expectedNode.classMembers != null) {
+        assertNodes(topNode.classMembers, expectedNode.classMembers,
+            expectedEnclosingClass: topNode);
+      } else {
+        expect(topNode.classMembers, isNull);
+      }
+
+      if (expectedNode.classTypeParameters != null) {
+        assertNodes(
+          topNode.classTypeParameters,
+          expectedNode.classTypeParameters,
+          expectedEnclosingClass: topNode,
+        );
+      } else {
+        expect(topNode.classTypeParameters, isNull);
+      }
+    }
+  }
+
+  Future<Library> buildTestLibrary(String path, String content) async {
+//    if (!hasDartCore) {
+//      hasDartCore = true;
+//      await _addLibraryByUri('dart:core');
+//      await _addLibraryByUri('dart:async');
+//      await _addLibraryByUri('dart:math');
+//      await _addLibraryByUri('dart:_internal');
+//    }
+
+    newFile(path, content: content);
+    driver.changeFile(path);
+
+    var units = await _resolveLibrary(path);
+    var uri = units.first.declaredElement.source.uri;
+
+    return buildLibrary(uri, units);
+
+//    tracker.addLibrary(uri, units);
+//
+//    var library = tracker.libraries[uri];
+//    expect(library, isNotNull);
+//
+//    return library;
+  }
+
+  Node getNode(Library library,
+      {@required String name,
+      NodeKind kind,
+      String memberOf,
+      String typeParameterOf}) {
+    var uri = library.uri;
+    var nodes = library.declaredNodes;
+    if (memberOf != null) {
+      var class_ = _getNode(nodes, uri: uri, name: memberOf);
+      expect(
+        class_.kind,
+        anyOf(NodeKind.CLASS, NodeKind.ENUM, NodeKind.MIXIN),
+      );
+      nodes = class_.classMembers;
+    } else if (typeParameterOf != null) {
+      var class_ = _getNode(nodes, uri: uri, name: typeParameterOf);
+      expect(class_.kind, anyOf(NodeKind.CLASS, NodeKind.MIXIN));
+      nodes = class_.classTypeParameters;
+    }
+    return _getNode(nodes, uri: uri, name: name, kind: kind);
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+//    var logger = PerformanceLog(null);
+//    tracker = DependencyTracker(logger);
+    a = convertPath('/test/lib/a.dart');
+    b = convertPath('/test/lib/b.dart');
+    c = convertPath('/test/lib/c.dart');
+    aUri = Uri.parse('package:test/a.dart');
+    bUri = Uri.parse('package:test/b.dart');
+    cUri = Uri.parse('package:test/c.dart');
+  }
+
+//  Future _addLibraryByUri(String uri) async {
+//    var path = driver.sourceFactory.forUri(uri).fullName;
+//    var unitResult = await driver.getUnitElement(path);
+//
+//    var signature = ApiSignature();
+//    signature.addString(unitResult.signature);
+//    var signatureBytes = signature.toByteList();
+//
+//    tracker.addLibraryElement(unitResult.element.library, signatureBytes);
+//  }
+
+  Node _getNode(List<Node> nodes,
+      {@required Uri uri, @required String name, NodeKind kind}) {
+    var nameObj = LibraryQualifiedName(uri, name);
+    for (var node in nodes) {
+      if (node.name == nameObj) {
+        if (kind != null && node.kind != kind) {
+          fail('Expected $kind "$name", found ${node.kind}');
+        }
+        return node;
+      }
+    }
+    fail('Expected to find $uri::$name in:\n    ${nodes.join('\n    ')}');
+  }
+
+  Future<List<CompilationUnit>> _resolveLibrary(String libraryPath) async {
+    var resolvedLibrary = await driver.getResolvedLibrary(libraryPath);
+    return resolvedLibrary.units.map((ru) => ru.unit).toList();
+  }
+}
+
+class ExpectedNode {
+  final Uri uri;
+  final String name;
+  final NodeKind kind;
+  final List<ExpectedNode> classMembers;
+  final List<ExpectedNode> classTypeParameters;
+
+  ExpectedNode(
+    this.uri,
+    this.name,
+    this.kind, {
+    this.classMembers,
+    this.classTypeParameters,
+  });
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart b/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart
new file mode 100644
index 0000000..5fbbf4b
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/declared_nodes_test.dart
@@ -0,0 +1,1795 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/dependency/library_builder.dart'
+    hide buildLibrary;
+import 'package:analyzer/src/dart/analysis/dependency/node.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DeclaredNodesTest);
+  });
+}
+
+@reflectiveTest
+class DeclaredNodesTest extends BaseDependencyTest {
+  test_api_tokens_include_enclosingClass() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  void foo() {}
+}
+
+class B {
+  void foo() {}
+}
+''');
+    _assertDifferentApiTokenSignature(
+      getNode(library, name: 'foo', memberOf: 'A'),
+      getNode(library, name: 'foo', memberOf: 'B'),
+    );
+  }
+
+  test_api_tokens_include_enclosingEnum() async {
+    var library = await buildTestLibrary(a, r'''
+enum A {
+  foo
+}
+
+enum B {
+  foo
+}
+''');
+    _assertDifferentApiTokenSignature(
+      getNode(library, name: 'foo', memberOf: 'A'),
+      getNode(library, name: 'foo', memberOf: 'B'),
+    );
+    _assertDifferentApiTokenSignature(
+      getNode(library, name: 'index', memberOf: 'A'),
+      getNode(library, name: 'index', memberOf: 'B'),
+    );
+    _assertDifferentApiTokenSignature(
+      getNode(library, name: 'values', memberOf: 'A'),
+      getNode(library, name: 'values', memberOf: 'B'),
+    );
+  }
+
+  test_api_tokens_include_enclosingLibrary_class() async {
+    var aLib = await buildTestLibrary(a, 'class C {}');
+    var bLib = await buildTestLibrary(b, 'class C {}');
+    _assertDifferentApiTokenSignature(
+      getNode(aLib, name: 'C'),
+      getNode(bLib, name: 'C'),
+    );
+  }
+
+  test_api_tokens_include_enclosingLibrary_enum() async {
+    var aLib = await buildTestLibrary(a, 'enum Foo {a, b, c}');
+    var bLib = await buildTestLibrary(b, 'enum Foo {a, b, c}');
+    _assertDifferentApiTokenSignature(
+      getNode(aLib, name: 'Foo'),
+      getNode(bLib, name: 'Foo'),
+    );
+  }
+
+  test_api_tokens_include_enclosingLibrary_function() async {
+    var aLib = await buildTestLibrary(a, 'void foo() {}');
+    var bLib = await buildTestLibrary(b, 'void foo() {}');
+    _assertDifferentApiTokenSignature(
+      getNode(aLib, name: 'foo'),
+      getNode(bLib, name: 'foo'),
+    );
+  }
+
+  test_api_tokens_include_functionOrMethod() async {
+    var library = await buildTestLibrary(a, r'''
+void foo() {}
+
+class C {
+  void foo() {}
+}
+''');
+    var fooFunction = getNode(library, name: 'foo');
+    var fooMethod = getNode(library, name: 'foo', memberOf: 'C');
+    expect(
+      fooFunction.api.tokenSignatureHex,
+      isNot(fooMethod.api.tokenSignatureHex),
+    );
+  }
+
+  test_class_constructor() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C();
+  C.named();
+}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'C',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+          ExpectedNode(aUri, 'named', NodeKind.CONSTRUCTOR),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_constructor_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.CONSTRUCTOR,
+      'class X {  X.foo();  }',
+      'class X {  @deprecated X.foo();  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_constructor_api_tokens_notSame_parameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.CONSTRUCTOR,
+      'class X {  X.foo();  }',
+      'class X {  X.foo(int a);  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_constructor_api_tokens_notSame_parameter_name_edit_named() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.CONSTRUCTOR,
+      'class X {  X.foo({int a});  }',
+      'class X {  X.foo({int b});  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_constructor_api_tokens_notSame_parameter_type() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.CONSTRUCTOR,
+      'class X {  X.foo(int a);  }',
+      'class X {  X.foo(double a);  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_constructor_api_tokens_same_body() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.CONSTRUCTOR,
+      'class X {  X.foo() { print(1); }  }',
+      'class X {  X.foo() { print(2); }  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_constructor_api_tokens_same_body_add() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.CONSTRUCTOR,
+      'class X {  X.foo();  }',
+      'class X {  X.foo() {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_constructor_api_tokens_same_parameter_name_edit_required() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.CONSTRUCTOR,
+      'class X {  X.foo(int a);  }',
+      'class X {  X.foo(int b);  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_constructor_default() async {
+    var library = await buildTestLibrary(a, r'''
+class C {}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'C',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_field() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  int a = 1;
+  int b = 2, c = 3;
+}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'C',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+          ExpectedNode(aUri, 'a', NodeKind.GETTER),
+          ExpectedNode(aUri, 'b', NodeKind.GETTER),
+          ExpectedNode(aUri, 'c', NodeKind.GETTER),
+          ExpectedNode(aUri, 'a=', NodeKind.SETTER),
+          ExpectedNode(aUri, 'b=', NodeKind.SETTER),
+          ExpectedNode(aUri, 'c=', NodeKind.SETTER),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_field_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  int foo = 0;  }',
+      'class X {  @deprecated int foo = 0;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_api_tokens_notSame_const() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  int foo = 0;  }',
+      'class X {  const int foo = 0;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_api_tokens_same_final() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  int foo = 0;  }',
+      'class X {  final int foo = 0;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_api_tokens_typed_notSame_type() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  int foo = 0;  }',
+      'class X {  num foo = 1;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_api_tokens_typed_same_initializer() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  int foo = 0;  }',
+      'class X {  int foo = 1;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_api_tokens_untyped_notSame_initializer() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  var foo = 0;  }',
+      'class X {  var foo = 1.0;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_const() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  const foo = 1;
+  const bar = 2;
+}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'X',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+          ExpectedNode(aUri, 'foo', NodeKind.GETTER),
+          ExpectedNode(aUri, 'bar', NodeKind.GETTER),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_field_const_api_tokens_typed_notSame_initializer() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  const int foo = 0;  }',
+      'class X {  const int foo = 1;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_final() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  final foo = 1;
+  final bar = 2;
+}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'X',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+          ExpectedNode(aUri, 'foo', NodeKind.GETTER),
+          ExpectedNode(aUri, 'bar', NodeKind.GETTER),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_field_final_api_tokens_typed_notSame_initializer_constClass() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  final int foo = 0;  const X();  }',
+      'class X {  final int foo = 1;  const X();  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_final_api_tokens_typed_same_initializer() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  final int foo = 0;  }',
+      'class X {  final int foo = 1;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_field_final_api_tokens_untyped_notSame_initializer() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  final foo = 0;  }',
+      'class X {  final foo = 1.0;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_getter() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  int get foo => 0;
+  int get bar => 0;
+}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'C',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+          ExpectedNode(aUri, 'foo', NodeKind.GETTER),
+          ExpectedNode(aUri, 'bar', NodeKind.GETTER),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_getter_api_tokens_notSame_returnType() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'class X {  int get foo => null;  }',
+      'class X {  double get foo => null;  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  void foo() {}
+  void bar() {}
+}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'C',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+          ExpectedNode(aUri, 'foo', NodeKind.METHOD),
+          ExpectedNode(aUri, 'bar', NodeKind.METHOD),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_method_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  void foo() {}  }',
+      'class X {  @deprecated void foo() {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_notSame_parameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  void foo() {}  }',
+      'class X {  void foo(int a) {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_notSame_parameter_name_edit_named() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  void foo({int a}) {}  }',
+      'class X {  void foo({int b}) {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_notSame_parameter_type() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  void foo(int a) {}  }',
+      'class X {  void foo(double a) {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_notSame_returnType() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  int foo() {}  }',
+      'class X {  double foo() {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_notSame_typeParameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  void foo() {}  }',
+      'class X {  void foo<T>() {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_notSame_typeParameter_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  void foo<T>() {}  }',
+      'class X {  void foo<T extends num>() {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_same_async_add() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  foo() {}  }',
+      'class X {  foo() async {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_same_body() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  void foo() { print(1); }  }',
+      'class X {  void foo() { print(2); }  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_method_api_tokens_same_parameter_name_edit_required() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.METHOD,
+      'class X {  void foo(int a) {}  }',
+      'class X {  void foo(int b) {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_setter() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  set foo(_) {}
+  set bar(_) {}
+}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'C',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+          ExpectedNode(aUri, 'foo', NodeKind.SETTER),
+          ExpectedNode(aUri, 'bar', NodeKind.SETTER),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_setter_api_tokens_notSame_returnType() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.SETTER,
+      'class X {  set foo(int a) {}  }',
+      'class X {  set foo(double a) {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_setter_api_tokens_same_parameter_name() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.SETTER,
+      'class X {  set foo(int a) {}  }',
+      'class X {  set foo(int b) {}  }',
+      memberOf: 'X',
+    );
+  }
+
+  test_class_typeParameter() async {
+    var library = await buildTestLibrary(a, r'''
+class A<T> {}
+class B<T, U> {}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'A',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+        ],
+        classTypeParameters: [
+          ExpectedNode(aUri, 'T', NodeKind.TYPE_PARAMETER),
+        ],
+      ),
+      ExpectedNode(
+        aUri,
+        'B',
+        NodeKind.CLASS,
+        classMembers: [
+          ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+        ],
+        classTypeParameters: [
+          ExpectedNode(aUri, 'T', NodeKind.TYPE_PARAMETER),
+          ExpectedNode(aUri, 'U', NodeKind.TYPE_PARAMETER),
+        ],
+      ),
+    ]);
+  }
+
+  test_class_typeParameter_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'T',
+      NodeKind.TYPE_PARAMETER,
+      'class X<T> {}',
+      'class X<@deprecate T> {}',
+      typeParameterOf: 'X',
+    );
+  }
+
+  test_class_typeParameter_api_tokens_notSame_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'T',
+      NodeKind.TYPE_PARAMETER,
+      'class X<T> {}',
+      'class X<T extends num> {}',
+      typeParameterOf: 'X',
+    );
+  }
+
+  test_class_typeParameter_api_tokens_notSame_bound_edit() async {
+    await _assertApiTokenSignatureNotSame(
+      'T',
+      NodeKind.TYPE_PARAMETER,
+      'class X<T extends num> {}',
+      'class X<T extends int> {}',
+      typeParameterOf: 'X',
+    );
+  }
+
+  test_library_export() async {
+    var library = await buildTestLibrary(a, r'''
+export 'dart:math';
+export 'package:aaa/aaa.dart';
+export 'package:bbb/bbb.dart' show b1, b2 hide b3;
+''');
+    _assertExports(library, [
+      Export(Uri.parse('dart:math'), []),
+      Export(Uri.parse('package:aaa/aaa.dart'), []),
+      Export(Uri.parse('package:bbb/bbb.dart'), [
+        Combinator(true, ['b1', 'b2']),
+        Combinator(false, ['b3']),
+      ]),
+    ]);
+  }
+
+  test_library_import() async {
+    var library = await buildTestLibrary(a, r'''
+import 'dart:math';
+import 'package:aaa/aaa.dart';
+import 'package:bbb/bbb.dart' as b;
+import 'package:ccc/ccc.dart' show c1, c2 hide c3;
+''');
+    _assertImports(library, [
+      Import(Uri.parse('dart:math'), null, []),
+      Import(Uri.parse('package:aaa/aaa.dart'), null, []),
+      Import(Uri.parse('package:bbb/bbb.dart'), 'b', []),
+      Import(Uri.parse('package:ccc/ccc.dart'), null, [
+        Combinator(true, ['c1', 'c2']),
+        Combinator(false, ['c3']),
+      ]),
+      Import(Uri.parse('dart:core'), null, []),
+    ]);
+  }
+
+  test_library_import_core_explicit() async {
+    var library = await buildTestLibrary(a, r'''
+import 'dart:core' hide List;
+''');
+    _assertImports(library, [
+      Import(Uri.parse('dart:core'), null, [
+        Combinator(false, ['List']),
+      ]),
+    ]);
+  }
+
+  test_library_import_core_implicit() async {
+    var library = await buildTestLibrary(a, '');
+    _assertImports(library, [
+      Import(Uri.parse('dart:core'), null, []),
+    ]);
+  }
+
+  test_unit_class() async {
+    var library = await buildTestLibrary(a, r'''
+class Foo {}
+class Bar {}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'Foo', NodeKind.CLASS, classMembers: [
+        ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+      ]),
+      ExpectedNode(aUri, 'Bar', NodeKind.CLASS, classMembers: [
+        ExpectedNode(aUri, '', NodeKind.CONSTRUCTOR),
+      ]),
+    ]);
+  }
+
+  test_unit_class_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X {}',
+      '@deprecated class X {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_extends_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X {}',
+      'class X extends A {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_extends_edit() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X extends A {}',
+      'class X extends B {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_extends_replace() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X extends A {}',
+      'class X implements A {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_extends_typeArgument() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X extends A {}',
+      'class X extends A<int> {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_implements_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X {}',
+      'class X implements A {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_implements_edit() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X implements A {}',
+      'class X implements B {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_implements_remove() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X implements A {}',
+      'class X {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_implements_remove2() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X implements A, B {}',
+      'class X implements B {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_implements_typeArgument() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X implements A {}',
+      'class X implements A<int> {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_typeParameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X {}',
+      'class X<T> {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_typeParameter_add2() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X<T> {}',
+      'class X<T, U> {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_typeParameter_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X<T> {}',
+      'class X<T extends num> {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_with_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X extends A {}',
+      'class X extends A with B {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_with_edit() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X extends A with B {}',
+      'class X extends A with C {}',
+    );
+  }
+
+  test_unit_class_api_tokens_notSame_with_typeArgument() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS,
+      'class X extends A with B {}',
+      'class X extends A with B<int> {}',
+    );
+  }
+
+  test_unit_class_api_tokens_same_body() async {
+    await _assertApiTokenSignatureSame(
+      'X',
+      NodeKind.CLASS,
+      'class X {  }',
+      'class X { void foo() {} }',
+    );
+  }
+
+  test_unit_classTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+class X = Object with M;
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'X', NodeKind.CLASS_TYPE_ALIAS),
+    ]);
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_implements_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M;',
+      'class X = A with M implements I;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_implements_edit() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M implements I;',
+      'class X = A with M implements J;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_implements_remove() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M implements I;',
+      'class X = A with M;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_implements_typeArgument() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M implements I;',
+      'class X = A with M implements I<int>;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_super() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M;',
+      'class X = B with M;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_super_typeArgument() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M;',
+      'class X = A<int> with M;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_typeParameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M;',
+      'class X<T> = A with M;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_typeParameter_add2() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X<T> = A with M;',
+      'class X<T, U> = A with M;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_typeParameter_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X<T> = A with M;',
+      'class X<T extends num> = A with M;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_with_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M;',
+      'class X = A with M, N;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_with_edit() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M;',
+      'class X = A with N;',
+    );
+  }
+
+  test_unit_classTypeAlias_api_tokens_notSame_with_typeArgument() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.CLASS_TYPE_ALIAS,
+      'class X = A with M;',
+      'class X = A with M<int>;',
+    );
+  }
+
+  test_unit_enumDeclaration() async {
+    var library = await buildTestLibrary(a, r'''
+enum Foo {a, b, c}
+enum Bar {d, e, f}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(
+        aUri,
+        'Foo',
+        NodeKind.ENUM,
+        classMembers: [
+          ExpectedNode(aUri, 'a', NodeKind.GETTER),
+          ExpectedNode(aUri, 'b', NodeKind.GETTER),
+          ExpectedNode(aUri, 'c', NodeKind.GETTER),
+          ExpectedNode(aUri, 'index', NodeKind.GETTER),
+          ExpectedNode(aUri, 'values', NodeKind.GETTER),
+        ],
+      ),
+      ExpectedNode(
+        aUri,
+        'Bar',
+        NodeKind.ENUM,
+        classMembers: [
+          ExpectedNode(aUri, 'd', NodeKind.GETTER),
+          ExpectedNode(aUri, 'e', NodeKind.GETTER),
+          ExpectedNode(aUri, 'f', NodeKind.GETTER),
+          ExpectedNode(aUri, 'index', NodeKind.GETTER),
+          ExpectedNode(aUri, 'values', NodeKind.GETTER),
+        ],
+      ),
+    ]);
+  }
+
+  test_unit_function() async {
+    var library = await buildTestLibrary(a, r'''
+void foo() {}
+void bar() {}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'foo', NodeKind.FUNCTION),
+      ExpectedNode(aUri, 'bar', NodeKind.FUNCTION),
+    ]);
+  }
+
+  test_unit_function_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'void foo() {}',
+      '@deprecated void foo() {}',
+    );
+  }
+
+  test_unit_function_api_tokens_notSame_parameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'void foo() {}',
+      'void foo(int a) {}',
+    );
+  }
+
+  test_unit_function_api_tokens_notSame_parameter_name_edit_named() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'void foo({int a}) {}',
+      'void foo({int b}) {}',
+    );
+  }
+
+  test_unit_function_api_tokens_notSame_parameter_type() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'void foo(int a) {}',
+      'void foo(double a) {}',
+    );
+  }
+
+  test_unit_function_api_tokens_notSame_returnType() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'int foo() {}',
+      'num foo() {}',
+    );
+  }
+
+  test_unit_function_api_tokens_notSame_typeParameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'void foo() {}',
+      'void foo<T>() {}',
+    );
+  }
+
+  test_unit_function_api_tokens_notSame_typeParameter_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'void foo<T>() {}',
+      'void foo<T extends num>() {}',
+    );
+  }
+
+  test_unit_function_api_tokens_same_async_add() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'foo() {}',
+      'foo() async {}',
+    );
+  }
+
+  test_unit_function_api_tokens_same_body() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'void foo() { print(1); }',
+      'void foo() { print(2); }',
+    );
+  }
+
+  test_unit_function_api_tokens_same_parameter_name_edit_required() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'void foo(int a) {}',
+      'void foo(int b) {}',
+    );
+  }
+
+  test_unit_function_api_tokens_same_syncStar_add() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.FUNCTION,
+      'foo() {}',
+      'foo() sync* {}',
+    );
+  }
+
+  test_unit_functionTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+typedef void Foo();
+typedef void Bar();
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'Foo', NodeKind.FUNCTION_TYPE_ALIAS),
+      ExpectedNode(aUri, 'Bar', NodeKind.FUNCTION_TYPE_ALIAS),
+    ]);
+  }
+
+  test_unit_functionTypeAlias_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef void Foo();',
+      '@deprecated typedef void Foo();',
+    );
+  }
+
+  test_unit_functionTypeAlias_api_tokens_notSame_parameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef void Foo();',
+      'typedef void Foo(int a);',
+    );
+  }
+
+  test_unit_functionTypeAlias_api_tokens_notSame_parameter_name_edit_named() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef void Foo({int a});',
+      'typedef void Foo({int b});',
+    );
+  }
+
+  test_unit_functionTypeAlias_api_tokens_notSame_parameter_type() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef void Foo(int a);',
+      'typedef void Foo(double a);',
+    );
+  }
+
+  test_unit_functionTypeAlias_api_tokens_notSame_returnType() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef int Foo();',
+      'typedef num Foo();',
+    );
+  }
+
+  test_unit_functionTypeAlias_api_tokens_notSame_typeParameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef void Foo();',
+      'typedef void Foo<T>();',
+    );
+  }
+
+  test_unit_functionTypeAlias_api_tokens_notSame_typeParameter_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef void Foo<T>();',
+      'typedef void Foo<T extends num>();',
+    );
+  }
+
+  test_unit_functionTypeAlias_api_tokens_same_comment() async {
+    await _assertApiTokenSignatureSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef int Foo();',
+      '/* text */ typedef int Foo();',
+    );
+  }
+
+  test_unit_functionTypeAlias_api_tokens_same_parameter_name_edit_required() async {
+    await _assertApiTokenSignatureSame(
+      'Foo',
+      NodeKind.FUNCTION_TYPE_ALIAS,
+      'typedef void Foo(int a);',
+      'typedef void Foo(int b);',
+    );
+  }
+
+  test_unit_genericTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+typedef Foo = void Function();
+typedef Bar = void Function();
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'Foo', NodeKind.GENERIC_TYPE_ALIAS),
+      ExpectedNode(aUri, 'Bar', NodeKind.GENERIC_TYPE_ALIAS),
+    ]);
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function();',
+      '@deprecated typedef Foo = void Function();',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_parameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function();',
+      'typedef Foo = void Function(int);',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_parameter_kind() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function(int a);',
+      'typedef Foo = void Function([int a]);',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_parameter_name_add_positional() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function([int]);',
+      'typedef Foo = void Function([int a]);',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_parameter_name_edit_named() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function({int a});',
+      'typedef Foo = void Function({int b});',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_parameter_name_edit_positional() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function([int]);',
+      'typedef Foo = void Function([int a]);',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_returnType() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = int Function();',
+      'typedef Foo = double Function();',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_typeParameter2_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function();',
+      'typedef Foo = void Function<T>();',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_typeParameter2_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function<T>();',
+      'typedef Foo = void Function<T extends num>();',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_typeParameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function();',
+      'typedef Foo<T> = void Function();',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_notSame_typeParameter_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo<T> = void Function();',
+      'typedef Foo<T extends num> = void Function();',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_same_parameter_name_add_required() async {
+    await _assertApiTokenSignatureSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function(int);',
+      'typedef Foo = void Function(int a);',
+    );
+  }
+
+  test_unit_genericTypeAlias_api_tokens_same_parameter_name_edit_required() async {
+    await _assertApiTokenSignatureSame(
+      'Foo',
+      NodeKind.GENERIC_TYPE_ALIAS,
+      'typedef Foo = void Function(int a);',
+      'typedef Foo = void Function(int b);',
+    );
+  }
+
+  test_unit_getter() async {
+    var library = await buildTestLibrary(a, r'''
+int get foo => 0;
+int get bar => 0;
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'foo', NodeKind.GETTER),
+      ExpectedNode(aUri, 'bar', NodeKind.GETTER),
+    ]);
+  }
+
+  test_unit_getter_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'int get foo => 0;',
+      '@deprecated int get foo => 0;',
+    );
+  }
+
+  test_unit_getter_api_tokens_notSame_returnType() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'int get foo => 0;',
+      'num get foo => 0;',
+    );
+  }
+
+  test_unit_getter_api_tokens_same_body() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.GETTER,
+      'int get foo => 0;',
+      'int get foo => 1;',
+    );
+  }
+
+  test_unit_mixin() async {
+    var library = await buildTestLibrary(a, r'''
+mixin Foo {}
+mixin Bar {}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'Foo', NodeKind.MIXIN, classMembers: const []),
+      ExpectedNode(aUri, 'Bar', NodeKind.MIXIN, classMembers: const []),
+    ]);
+  }
+
+  test_unit_mixin_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X {}',
+      '@deprecated mixin X {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_implements_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X {}',
+      'mixin X implements A {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_implements_edit() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X implements A {}',
+      'mixin X implements B {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_implements_remove() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X implements A {}',
+      'mixin X {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_implements_remove2() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X implements A, B {}',
+      'mixin X implements B {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_implements_typeArgument() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X implements A {}',
+      'mixin X implements A<int> {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_on_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X {}',
+      'mixin X on A {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_on_add2() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X on A {}',
+      'mixin X on A, B {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_on_edit() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X on A {}',
+      'mixin X on B {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_on_replace() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X on A {}',
+      'mixin X implements A {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_on_typeArgument() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X on A {}',
+      'mixin X on A<int> {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_typeParameter_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X {}',
+      'mixin X<T> {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_typeParameter_add2() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X<T> {}',
+      'mixin X<T, U> {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_notSame_typeParameter_bound_add() async {
+    await _assertApiTokenSignatureNotSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X<T> {}',
+      'mixin X<T extends num> {}',
+    );
+  }
+
+  test_unit_mixin_api_tokens_same_body() async {
+    await _assertApiTokenSignatureSame(
+      'X',
+      NodeKind.MIXIN,
+      'mixin X {  }',
+      'mixin X { void foo() {} }',
+    );
+  }
+
+  test_unit_setter() async {
+    var library = await buildTestLibrary(a, r'''
+void set foo(_) {}
+void set bar(_) {}
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'foo=', NodeKind.SETTER),
+      ExpectedNode(aUri, 'bar=', NodeKind.SETTER),
+    ]);
+  }
+
+  test_unit_setter_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo=',
+      NodeKind.SETTER,
+      'set foo(int a) {}',
+      '@deprecated set foo(int a) {}',
+    );
+  }
+
+  test_unit_setter_api_tokens_notSame_parameter_type() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo=',
+      NodeKind.SETTER,
+      'set foo(int a) {}',
+      'set foo(num a) {}',
+    );
+  }
+
+  test_unit_setter_api_tokens_same_body() async {
+    await _assertApiTokenSignatureSame(
+      'foo=',
+      NodeKind.SETTER,
+      'set foo(int a) { print(0); }',
+      'set foo(int a) { print(1); }',
+    );
+  }
+
+  test_unit_variable() async {
+    var library = await buildTestLibrary(a, r'''
+int a = 1;
+int b = 2, c = 3;
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'a', NodeKind.GETTER),
+      ExpectedNode(aUri, 'b', NodeKind.GETTER),
+      ExpectedNode(aUri, 'c', NodeKind.GETTER),
+      ExpectedNode(aUri, 'a=', NodeKind.SETTER),
+      ExpectedNode(aUri, 'b=', NodeKind.SETTER),
+      ExpectedNode(aUri, 'c=', NodeKind.SETTER),
+    ]);
+  }
+
+  test_unit_variable_api_tokens_notSame_annotation() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'int foo = 0;',
+      '@deprecated int foo = 0;',
+    );
+  }
+
+  test_unit_variable_api_tokens_notSame_const() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'int foo = 0;',
+      'const int foo = 0;',
+    );
+  }
+
+  test_unit_variable_api_tokens_same_final() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.GETTER,
+      'int foo = 0;',
+      'final int foo = 0;',
+    );
+  }
+
+  test_unit_variable_api_tokens_typed_notSame_type() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'int foo = 0;',
+      'num foo = 1;',
+    );
+  }
+
+  test_unit_variable_api_tokens_typed_same_initializer() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.GETTER,
+      'int foo = 0;',
+      'int foo = 1;',
+    );
+  }
+
+  test_unit_variable_api_tokens_untyped_notSame_initializer() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'var foo = 0;',
+      'var foo = 1.0;',
+    );
+  }
+
+  test_unit_variable_const() async {
+    var library = await buildTestLibrary(a, r'''
+const foo = 1;
+const bar = 2;
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'foo', NodeKind.GETTER),
+      ExpectedNode(aUri, 'bar', NodeKind.GETTER),
+    ]);
+  }
+
+  test_unit_variable_const_api_tokens_typed_notSame_initializer() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'const int foo = 0;',
+      'const int foo = 1;',
+    );
+  }
+
+  test_unit_variable_final() async {
+    var library = await buildTestLibrary(a, r'''
+final foo = 1;
+final bar = 2;
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'foo', NodeKind.GETTER),
+      ExpectedNode(aUri, 'bar', NodeKind.GETTER),
+    ]);
+  }
+
+  test_unit_variable_final_api_tokens_typed_same_initializer() async {
+    await _assertApiTokenSignatureSame(
+      'foo',
+      NodeKind.GETTER,
+      'final int foo = 0;',
+      'final int foo = 1;',
+    );
+  }
+
+  test_unit_variable_final_api_tokens_untyped_notSame_initializer() async {
+    await _assertApiTokenSignatureNotSame(
+      'foo',
+      NodeKind.GETTER,
+      'final foo = 0;',
+      'final foo = 1.0;',
+    );
+  }
+
+  test_unit_variable_final_withoutValue() async {
+    var library = await buildTestLibrary(a, r'''
+final foo;
+final bar;
+''');
+    assertNodes(library.declaredNodes, [
+      ExpectedNode(aUri, 'foo', NodeKind.GETTER),
+      ExpectedNode(aUri, 'bar', NodeKind.GETTER),
+    ]);
+  }
+
+  Future<void> _assertApiTokenSignatureNotSame(
+      String name, NodeKind kind, String codeBefore, String codeAfter,
+      {String memberOf, String typeParameterOf}) async {
+    Node getNodeLocal(Library library) {
+      return getNode(
+        library,
+        name: name,
+        kind: kind,
+        memberOf: memberOf,
+        typeParameterOf: typeParameterOf,
+      );
+    }
+
+    var libraryBefore = await buildTestLibrary(a, codeBefore);
+    var nodeBefore = getNodeLocal(libraryBefore);
+
+    var libraryAfter = await buildTestLibrary(a, codeAfter);
+    var nodeAfter = getNodeLocal(libraryAfter);
+
+    expect(
+      nodeAfter.api.tokenSignatureHex,
+      isNot(nodeBefore.api.tokenSignatureHex),
+    );
+  }
+
+  Future<void> _assertApiTokenSignatureSame(
+      String name, NodeKind kind, String codeBefore, String codeAfter,
+      {String memberOf, String typeParameterOf}) async {
+    Node getNodeLocal(Library library) {
+      return getNode(
+        library,
+        name: name,
+        kind: kind,
+        memberOf: memberOf,
+        typeParameterOf: typeParameterOf,
+      );
+    }
+
+    var libraryBefore = await buildTestLibrary(a, codeBefore);
+    var nodeBefore = getNodeLocal(libraryBefore);
+
+    var libraryAfter = await buildTestLibrary(a, codeAfter);
+    var nodeAfter = getNodeLocal(libraryAfter);
+
+    expect(
+      nodeAfter.api.tokenSignatureHex,
+      nodeBefore.api.tokenSignatureHex,
+    );
+  }
+
+  static _assertDifferentApiTokenSignature(Node a, Node b) {
+    expect(
+      a.api.tokenSignatureHex,
+      isNot(b.api.tokenSignatureHex),
+    );
+  }
+
+  static void _assertExports(Library library, List<Export> expectedExports) {
+    var actualExports = library.exports;
+    expect(actualExports, hasLength(expectedExports.length));
+    for (var i = 0; i < actualExports.length; ++i) {
+      var actual = actualExports[i];
+      var expected = expectedExports[i];
+      if (actual.uri != expected.uri ||
+          !_equalCombinators(actual.combinators, expected.combinators)) {
+        fail('Expected: $expected\nActual: $actual');
+      }
+    }
+  }
+
+  static void _assertImports(Library library, List<Import> expectedImports) {
+    var actualImports = library.imports;
+    expect(actualImports, hasLength(expectedImports.length));
+    for (var i = 0; i < actualImports.length; ++i) {
+      var actual = actualImports[i];
+      var expected = expectedImports[i];
+      if (actual.uri != expected.uri ||
+          actual.prefix != expected.prefix ||
+          !_equalCombinators(actual.combinators, expected.combinators)) {
+        fail('Expected: $expected\nActual: $actual');
+      }
+    }
+  }
+
+  static bool _equalCombinators(List<Combinator> actualCombinators,
+      List<Combinator> expectedCombinators) {
+    if (actualCombinators.length != expectedCombinators.length) {
+      return false;
+    }
+
+    for (var i = 0; i < actualCombinators.length; i++) {
+      var actualCombinator = actualCombinators[i];
+      var expectedCombinator = expectedCombinators[i];
+      if (actualCombinator.isShow != expectedCombinator.isShow) {
+        return false;
+      }
+
+      var actualNames = actualCombinator.names;
+      var expectedNames = expectedCombinator.names;
+      if (actualNames.length != expectedNames.length) {
+        return false;
+      }
+      for (var j = 0; j < actualNames.length; j++) {
+        if (actualNames[j] != expectedNames[j]) {
+          return false;
+        }
+      }
+    }
+
+    return true;
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
new file mode 100644
index 0000000..aacbb42
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/reference_collector_test.dart
@@ -0,0 +1,2346 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/dependency/library_builder.dart'
+    hide buildLibrary;
+import 'package:analyzer/src/dart/analysis/dependency/node.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ApiReferenceCollectorTest);
+    defineReflectiveTests(ExpressionReferenceCollectorTest);
+    defineReflectiveTests(ExpressionReferenceCollectorTest_SetLiterals);
+    defineReflectiveTests(ImplReferenceCollectorTest);
+    defineReflectiveTests(ShadowReferenceCollectorTest);
+    defineReflectiveTests(StatementReferenceCollectorTest);
+    defineReflectiveTests(TypeReferenceCollectorTest);
+  });
+}
+
+final dartCoreUri = Uri.parse('dart:core');
+
+@reflectiveTest
+class ApiReferenceCollectorTest extends _Base {
+  test_class_constructor_named_body() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C.test() {
+    x;
+  }
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR, memberOf: 'C');
+  }
+
+  test_class_constructor_named_parameter_defaultValue_named() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C.test({A a = x}) {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_constructor_named_parameter_defaultValue_positional() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C.test([A a = x]) {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_constructor_named_parameter_field_named() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  A f1;
+  B f2;
+  C.test({A this.f1: x, this.f2: y});
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_constructor_named_parameter_field_required() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  A f1;
+  B f2;
+  C.test(A this.f1, this.f2);
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_constructor_named_parameter_required() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C.test(A a, B b) {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A', 'B']);
+  }
+
+  test_class_constructor_unnamed_body() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C() {
+    x;
+  }
+}
+''');
+    _assertApi(library, '', NodeKind.CONSTRUCTOR, memberOf: 'C');
+  }
+
+  test_class_constructor_unnamed_parameter_required() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C(A a, B b) {}
+}
+''');
+    _assertApi(library, '', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A', 'B']);
+  }
+
+  test_class_field_hasType() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  int test = x;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER,
+        memberOf: 'C', unprefixed: ['int']);
+    _assertApi(library, 'test=', NodeKind.SETTER,
+        memberOf: 'C', unprefixed: ['int']);
+  }
+
+  test_class_field_hasType_const() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  static const int test = x;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER,
+        memberOf: 'C', unprefixed: ['int', 'x']);
+  }
+
+  test_class_field_hasType_final() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  final int test = x;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER,
+        memberOf: 'C', unprefixed: ['int']);
+  }
+
+  test_class_field_hasType_noInitializer() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  int test;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER,
+        memberOf: 'C', unprefixed: ['int']);
+    _assertApi(library, 'test=', NodeKind.SETTER,
+        memberOf: 'C', unprefixed: ['int']);
+  }
+
+  test_class_field_noType() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  var test = x;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER,
+        memberOf: 'C', unprefixed: ['x']);
+    _assertApi(library, 'test=', NodeKind.SETTER,
+        memberOf: 'C', unprefixed: ['x']);
+  }
+
+  test_class_field_noType_const() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  static const test = x;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER,
+        memberOf: 'C', unprefixed: ['x']);
+  }
+
+  test_class_field_noType_final() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  final test = x;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER,
+        memberOf: 'C', unprefixed: ['x']);
+  }
+
+  test_class_field_noType_noInitializer() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  var test;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER, memberOf: 'C');
+    _assertApi(library, 'test=', NodeKind.SETTER, memberOf: 'C');
+  }
+
+  test_class_method_body() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  void test() {
+    x;
+  }
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD, memberOf: 'C');
+  }
+
+  test_class_method_parameter_defaultValue_named() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  void test({A a = x}) {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_method_parameter_defaultValue_positional() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  void test([A a = x]) {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_method_parameter_required() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  void test(A a, B b) {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['A', 'B']);
+  }
+
+  test_class_method_returnType() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  A test() {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_method_typeParameter() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  void test<T, U extends A, V extends U>(T t, U u, V v) {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['A']);
+  }
+
+  test_class_typeParameter() async {
+    var library = await buildTestLibrary(a, r'''
+class X<T extends A<B, C>> {}
+''');
+    _assertApi(library, 'T', NodeKind.TYPE_PARAMETER,
+        typeParameterOf: 'X', unprefixed: ['A', 'B', 'C']);
+  }
+
+  test_unit_class() async {
+    var library = await buildTestLibrary(a, r'''
+class Test<T extends A, U extends T>
+  extends B<T> with C, D<E, U>
+  implements F<T>, G {
+  void test() {
+    x
+  }
+}
+''');
+    _assertApi(library, 'Test', NodeKind.CLASS,
+        unprefixed: ['A', 'B', 'C', 'D', 'E', 'F', 'G']);
+  }
+
+  test_unit_classTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+class Test = A with M1, M2 implements I1, I2;
+''');
+    _assertApi(library, 'Test', NodeKind.CLASS_TYPE_ALIAS,
+        unprefixed: ['A', 'I1', 'I2', 'M1', 'M2']);
+  }
+
+  test_unit_classTypeAlias_generic() async {
+    var library = await buildTestLibrary(a, r'''
+class Test<T extends A, U extends T> = B<T> with C<U, D> implements E<T, F>;
+''');
+    _assertApi(library, 'Test', NodeKind.CLASS_TYPE_ALIAS,
+        unprefixed: ['A', 'B', 'C', 'D', 'E', 'F']);
+  }
+
+  test_unit_function_body() async {
+    var library = await buildTestLibrary(a, r'''
+void test() {
+  x;
+}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_unit_function_parameter_defaultValue_named() async {
+    var library = await buildTestLibrary(a, r'''
+void test({a = x}) {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_unit_function_parameter_defaultValue_positional() async {
+    var library = await buildTestLibrary(a, r'''
+void test([a = x]) {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_unit_function_parameter_named() async {
+    var library = await buildTestLibrary(a, r'''
+void test({A a, B b}) {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
+  }
+
+  test_unit_function_parameter_positional() async {
+    var library = await buildTestLibrary(a, r'''
+void test([A a, B b]) {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
+  }
+
+  test_unit_function_parameter_required() async {
+    var library = await buildTestLibrary(a, r'''
+void test(A a, B b) {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
+  }
+
+  test_unit_function_parameter_required_function() async {
+    var library = await buildTestLibrary(a, r'''
+void test(A Function(B) a) {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
+  }
+
+  test_unit_function_parameter_required_functionTyped() async {
+    var library = await buildTestLibrary(a, r'''
+void test(A a(B b, C c)) {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B', 'C']);
+  }
+
+  test_unit_function_returnType_absent() async {
+    var library = await buildTestLibrary(a, r'''
+test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_unit_function_returnType_interface() async {
+    var library = await buildTestLibrary(a, r'''
+A test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
+  }
+
+  test_unit_function_typeParameter() async {
+    var library = await buildTestLibrary(a, r'''
+void test<T, U extends A, V extends U>(T t, U u, V v) {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
+  }
+
+  test_unit_functionTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+typedef A<B, U> Test<T extends C, U extends T>(D d, T t, U u);
+''');
+    _assertApi(library, 'Test', NodeKind.FUNCTION_TYPE_ALIAS,
+        unprefixed: ['A', 'B', 'C', 'D']);
+  }
+
+  test_unit_functionTypeAlias_reverseOrderTypeParameters() async {
+    var library = await buildTestLibrary(a, r'''
+typedef void Test<U extends T, T extends A>();
+''');
+    _assertApi(library, 'Test', NodeKind.FUNCTION_TYPE_ALIAS,
+        unprefixed: ['A']);
+  }
+
+  test_unit_genericTypeAlias_function() async {
+    var library = await buildTestLibrary(a, r'''
+typedef Test<T extends A, U extends T> =
+  B<T, C, V> Function<V extends D, W extends E<F, T, V>>(E, T, U, V, V, W);
+''');
+    _assertApi(library, 'Test', NodeKind.GENERIC_TYPE_ALIAS,
+        unprefixed: ['A', 'B', 'C', 'D', 'E', 'F']);
+  }
+
+  test_unit_genericTypeAlias_function_reverseOrderTypeParameters() async {
+    var library = await buildTestLibrary(a, r'''
+typedef Test<U extends T, T extends A> = Function<W extends V, V extends B>();
+''');
+    _assertApi(library, 'Test', NodeKind.GENERIC_TYPE_ALIAS,
+        unprefixed: ['A', 'B']);
+  }
+
+  test_unit_mixin() async {
+    var library = await buildTestLibrary(a, r'''
+mixin Test<T extends A, U extends T>
+  on B<T>, C, D<E, U>
+  implements F<T>, G {
+  void test() {
+    x
+  }
+}
+''');
+    _assertApi(library, 'Test', NodeKind.MIXIN,
+        unprefixed: ['A', 'B', 'C', 'D', 'E', 'F', 'G']);
+  }
+
+  test_unit_variable_hasType() async {
+    var library = await buildTestLibrary(a, r'''
+int test = x;
+''');
+    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['int']);
+    _assertApi(library, 'test=', NodeKind.SETTER, unprefixed: ['int']);
+  }
+
+  test_unit_variable_hasType_const() async {
+    var library = await buildTestLibrary(a, r'''
+const int test = x;
+''');
+    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['int', 'x']);
+  }
+
+  test_unit_variable_hasType_final() async {
+    var library = await buildTestLibrary(a, r'''
+final int test = x;
+''');
+    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['int']);
+  }
+
+  test_unit_variable_hasType_noInitializer() async {
+    var library = await buildTestLibrary(a, r'''
+int test;
+''');
+    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['int']);
+    _assertApi(library, 'test=', NodeKind.SETTER, unprefixed: ['int']);
+  }
+
+  test_unit_variable_noType() async {
+    var library = await buildTestLibrary(a, r'''
+var test = x;
+''');
+    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['x']);
+    _assertApi(library, 'test=', NodeKind.SETTER, unprefixed: ['x']);
+  }
+
+  test_unit_variable_noType_const() async {
+    var library = await buildTestLibrary(a, r'''
+const test = x;
+''');
+    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['x']);
+  }
+
+  test_unit_variable_noType_final() async {
+    var library = await buildTestLibrary(a, r'''
+final test = x;
+''');
+    _assertApi(library, 'test', NodeKind.GETTER, unprefixed: ['x']);
+  }
+
+  test_unit_variable_noType_noInitializer() async {
+    var library = await buildTestLibrary(a, r'''
+var test;
+''');
+    _assertApi(library, 'test', NodeKind.GETTER);
+    _assertApi(library, 'test=', NodeKind.SETTER);
+  }
+}
+
+@reflectiveTest
+class ExpressionReferenceCollectorTest extends _Base {
+  test_adjacentStrings() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  'foo' '$x' 'bar';
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_asExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x as Y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['Y', 'x']);
+  }
+
+  test_assignmentExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x = y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x=', 'y']);
+  }
+
+  test_assignmentExpression_compound() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  operator+(_) {}
+}
+
+class B extends A {}
+
+B x, y;
+
+test() {
+  x += y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'x=', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'B', '+')]);
+  }
+
+  test_assignmentExpression_nullAware() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x ??= y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'x=', 'y']);
+  }
+
+  test_awaitExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() async {
+  await x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_binaryExpression() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  operator+(_) {}
+}
+
+class B extends A {}
+
+B x, y;
+
+test() {
+  x + y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'B', '+')]);
+  }
+
+  test_binaryExpression_int() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  int operator+(_) {}
+}
+
+A x;
+
+test() {
+  x + 1 + 2;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
+      'x'
+    ], expectedMembers: [
+      _ExpectedClassMember(aUri, 'A', '+'),
+      _ExpectedClassMember(dartCoreUri, 'int', '+'),
+    ]);
+  }
+
+  test_binaryExpression_sort() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  operator*(_) {}
+}
+
+class B {
+  operator+(_) {}
+}
+
+A a;
+B b;
+
+test() {
+  (b + 1) + a * 2;
+}
+''');
+    _assertImpl(
+      library,
+      'test',
+      NodeKind.FUNCTION,
+      unprefixed: ['a', 'b'],
+      expectedMembers: [
+        _ExpectedClassMember(aUri, 'A', '*'),
+        _ExpectedClassMember(aUri, 'B', '+'),
+      ],
+    );
+  }
+
+  test_binaryExpression_super() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+class B extends A {
+  test() {
+    super + x;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'B', unprefixed: ['x'], superPrefixed: ['+']);
+  }
+
+  test_binaryExpression_super2() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+class B extends A {
+  test() {
+    super == x;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'B', unprefixed: ['x'], superPrefixed: ['==']);
+  }
+
+  test_binaryExpression_unique() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  A operator+(_) => null;
+}
+
+A x;
+
+test() {
+  x + 1 + 2 + 3;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', '+')]);
+  }
+
+  test_binaryExpression_unresolvedOperator() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x, y;
+
+test() {
+  x + y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', '+')]);
+  }
+
+  test_binaryExpression_unresolvedTarget() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x + y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_booleanLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  true;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_cascadeExpression() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  x
+    ..foo(y)
+    ..bar = z;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
+      'x',
+      'y',
+      'z'
+    ], expectedMembers: [
+      _ExpectedClassMember(aUri, 'A', 'bar='),
+      _ExpectedClassMember(aUri, 'A', 'foo'),
+    ]);
+  }
+
+  test_conditionalExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x ? y : z;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y', 'z']);
+  }
+
+  test_doubleLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  1.2;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_functionExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  <T extends A, U extends T>(B b, C c, T t, U u) {
+    T;
+    U;
+    x;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'B', 'C', 'x']);
+  }
+
+  test_functionExpressionInvocation() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  (x)<T>(y, z);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['T', 'x', 'y', 'z']);
+  }
+
+  test_indexExpression_get() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  x[y];
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', '[]')]);
+  }
+
+  test_indexExpression_getSet() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  x[y] += x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
+      'x',
+      'y'
+    ], expectedMembers: [
+      _ExpectedClassMember(aUri, 'A', '[]'),
+      _ExpectedClassMember(aUri, 'A', '[]=')
+    ]);
+  }
+
+  test_indexExpression_set() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  x[y] = x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', '[]=')]);
+  }
+
+  test_indexExpression_super_get() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  test() {
+    super[x];
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['x'], superPrefixed: ['[]']);
+  }
+
+  test_indexExpression_super_getSet() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  test() {
+    super[x] += y;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['x', 'y'], superPrefixed: ['[]', '[]=']);
+  }
+
+  test_indexExpression_super_set() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  test() {
+    super[x] = y;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['x', 'y'], superPrefixed: ['[]=']);
+  }
+
+  test_indexExpression_unresolvedTarget() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x[y];
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_instanceCreationExpression_explicitNew_named() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+test() {
+  new A<T>.named(x, b: y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'T', 'x', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'named')]);
+  }
+
+  test_instanceCreationExpression_explicitNew_unnamed() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+test() {
+  new A<T>(x, b: y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'T', 'x', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', '')]);
+  }
+
+  test_instanceCreationExpression_explicitNew_unresolvedClass() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  new A<T>.named(x);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'T', 'x']);
+  }
+
+  test_instanceCreationExpression_implicitNew_named() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+test() {
+  A<T>.named(x, b: y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'T', 'x', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'named')]);
+  }
+
+  test_instanceCreationExpression_implicitNew_unnamed() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+test() {
+  A<T>(x, b: y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'T', 'x', 'y'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', '')]);
+  }
+
+  test_instanceCreationExpression_implicitNew_unresolvedClass_named() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  A<T>.named(x, b: y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'T', 'x', 'y']);
+  }
+
+  test_integerLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  0;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_isExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x is Y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['Y', 'x']);
+  }
+
+  test_listLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  <A>[x, y];
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'x', 'y']);
+  }
+
+  test_mapLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  <A, B>{x: y, v: w};
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'B', 'v', 'w', 'x', 'y']);
+  }
+
+  test_methodInvocation_instance_withoutTarget_function() async {
+    var library = await buildTestLibrary(a, r'''
+void foo(a, {b}) {}
+
+test() {
+  foo(x, b: y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['foo', 'x', 'y']);
+  }
+
+  test_methodInvocation_instance_withoutTarget_method() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  void foo(a, {b}) {}
+
+  test() {
+    foo(x, b: y);
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['foo', 'x', 'y']);
+  }
+
+  test_methodInvocation_instance_withTarget() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  x.foo<T>(y, b: z);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['T', 'x', 'y', 'z'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'foo')]);
+  }
+
+  test_methodInvocation_instance_withTarget_super() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  void foo(a, b) {}
+}
+
+class B extends A {
+  test() {
+    super.foo(x, y);
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'B', unprefixed: ['x', 'y'], superPrefixed: ['foo']);
+  }
+
+  test_methodInvocation_static_withTarget() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+test() {
+  A.foo<T>(x);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'T', 'x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'foo')]);
+  }
+
+  test_nullLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  null;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_parenthesizedExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  ((x));
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_postfixExpression() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+class B extend A {}
+
+B x, y;
+
+test() {
+  x++;
+  y--;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
+      'x',
+      'y'
+    ], expectedMembers: [
+      _ExpectedClassMember(aUri, 'B', '+'),
+      _ExpectedClassMember(aUri, 'B', '-')
+    ]);
+  }
+
+  test_postfixExpression_unresolvedTarget() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x++;
+  y--;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_prefixedIdentifier_importPrefix() async {
+    newFile(b, content: 'var b = 0;');
+    var library = await buildTestLibrary(a, r'''
+import 'b.dart' as pb;
+
+test() {
+  pb.b;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, prefixed: {
+      'pb': ['b']
+    });
+  }
+
+  test_prefixedIdentifier_importPrefix_unresolvedIdentifier() async {
+    newFile(b, content: '');
+    var library = await buildTestLibrary(a, r'''
+import 'b.dart' as pb;
+
+test() {
+  pb.b;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, prefixed: {
+      'pb': ['b']
+    });
+  }
+
+  test_prefixedIdentifier_interfaceProperty() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  int get y => 0;
+}
+
+class B extends A {}
+
+B x;
+test() {
+  x.y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'B', 'y')]);
+  }
+
+  test_prefixedIdentifier_static() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+class B extends A {}
+
+test() {
+  B.x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['B'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'B', 'x')]);
+  }
+
+  test_prefixedIdentifier_unresolvedPrefix() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x.y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_prefixExpression() async {
+    var library = await buildTestLibrary(a, r'''
+class A {
+  operator-() {}
+}
+
+class B extend A {}
+
+B x;
+
+test() {
+  -x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'B', 'unary-')]);
+  }
+
+  test_prefixExpression_unresolvedOperator() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  -x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'unary-')]);
+  }
+
+  test_prefixExpression_unresolvedTarget() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  -x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_propertyAccess_get() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  (x).foo;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'foo')]);
+  }
+
+  test_propertyAccess_getSet() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  (x).foo += 1;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: [
+      'x'
+    ], expectedMembers: [
+      _ExpectedClassMember(aUri, 'A', 'foo'),
+      _ExpectedClassMember(aUri, 'A', 'foo='),
+    ]);
+  }
+
+  test_propertyAccess_set() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+A x;
+
+test() {
+  (x).foo = 1;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'foo=')]);
+  }
+
+  test_propertyAccess_super_get() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  test() {
+    super.foo;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', superPrefixed: ['foo']);
+  }
+
+  test_propertyAccess_super_getSet() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  test() {
+    super.foo += 1;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', superPrefixed: ['foo', 'foo=']);
+  }
+
+  test_propertyAccess_super_set() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  test() {
+    super.foo = 1;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', superPrefixed: ['foo=']);
+  }
+
+  test_rethrowExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  try {
+  } on A {
+    rethrow;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
+  }
+
+  test_simpleIdentifier() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_simpleIdentifier_sort() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  d; c; a; b; e;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['a', 'b', 'c', 'd', 'e']);
+  }
+
+  test_simpleIdentifier_synthetic() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x +;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_simpleIdentifier_unique() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  x; x; y; x; y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_simpleStringLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  '';
+  """""";
+  r"""""";
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_stringInterpolation() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  '$x ${y}';
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_symbolLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  #foo.bar;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_thisExpression() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  test() {
+    this;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD, memberOf: 'C');
+  }
+
+  test_throwExpression() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  throw x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+}
+
+@reflectiveTest
+class ExpressionReferenceCollectorTest_SetLiterals extends _Base {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.set_literals];
+
+  test_setLiteral() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  <A>{x, y, z};
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'x', 'y', 'z']);
+  }
+}
+
+@reflectiveTest
+class ImplReferenceCollectorTest extends _Base {
+  test_class_constructor() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  var f;
+  C.test(A a, {b: x, this.f: y}) {
+    z;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['x', 'y', 'z']);
+  }
+
+  test_class_constructor_factoryRedirect_named() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+class X {
+  factory X.test() = A.named;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X',
+        unprefixed: ['A'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'named')]);
+  }
+
+  test_class_constructor_factoryRedirect_named_prefixed() async {
+    newFile(b, content: 'class A {}');
+
+    var library = await buildTestLibrary(a, r'''
+import 'b.dart' as p;
+
+class X {
+  factory X.test() = p.A.named;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X',
+        prefixed: {
+          'p': ['A']
+        },
+        expectedMembers: [
+          _ExpectedClassMember(bUri, 'A', 'named')
+        ]);
+  }
+
+  test_class_constructor_factoryRedirect_named_unresolvedTarget() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  factory X.test() = A.named;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X', unprefixed: ['A']);
+  }
+
+  test_class_constructor_factoryRedirect_unnamed() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+class X {
+  factory X.test() = A;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X',
+        unprefixed: ['A'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', '')]);
+  }
+
+  test_class_constructor_factoryRedirect_unnamed_prefixed() async {
+    newFile(b, content: 'class A {}');
+
+    var library = await buildTestLibrary(a, r'''
+import 'b.dart' as p;
+
+class X {
+  factory X.test() = p.A;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X',
+        prefixed: {
+          'p': ['A']
+        },
+        expectedMembers: [
+          _ExpectedClassMember(bUri, 'A', '')
+        ]);
+  }
+
+  test_class_constructor_factoryRedirect_unnamed_unresolvedTarget() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  factory X.test() = A;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X', unprefixed: ['A']);
+  }
+
+  test_class_constructor_initializer_assert() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  C.test(a) : assert(a > x, y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['x', 'y']);
+  }
+
+  test_class_constructor_initializer_field() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  var f;
+  
+  C.test() : f = x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['x']);
+  }
+
+  test_class_constructor_initializer_super_named() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+class C extends A {
+  C.test() : super.named(x);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C',
+        unprefixed: ['A', 'x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', 'named')]);
+  }
+
+  test_class_constructor_initializer_super_named_unresolvedSuper() async {
+    var library = await buildTestLibrary(a, r'''
+class C extends A {
+  C.test() : super.named(x);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A', 'x']);
+  }
+
+  test_class_constructor_initializer_super_unnamed() async {
+    var library = await buildTestLibrary(a, r'''
+class A {}
+
+class C extends A {
+  C.test() : super(x);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C',
+        unprefixed: ['A', 'x'],
+        expectedMembers: [_ExpectedClassMember(aUri, 'A', '')]);
+  }
+
+  test_class_constructor_initializer_super_unnamed_unresolvedSuper() async {
+    var library = await buildTestLibrary(a, r'''
+class C extends A {
+  C.test() : super(x);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['A', 'x']);
+  }
+
+  test_class_constructor_initializer_this_named() async {
+    var library = await buildTestLibrary(a, r'''
+class C extends A {
+  C.test() : this.named(x);
+  
+  C.named(a);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['x']);
+  }
+
+  test_class_constructor_initializer_this_unnamed() async {
+    var library = await buildTestLibrary(a, r'''
+class C extends A {
+  C.test() : this(x);
+  
+  C(a);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'C', unprefixed: ['x']);
+  }
+
+  test_class_method() async {
+    var library = await buildTestLibrary(a, r'''
+class C {
+  void test(A a, {b: x}) {
+    y;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'C', unprefixed: ['x', 'y']);
+  }
+
+  test_class_typeParameter() async {
+    var library = await buildTestLibrary(a, r'''
+class C<T extends A> {}
+''');
+    _assertImpl(library, 'T', NodeKind.TYPE_PARAMETER, typeParameterOf: 'C');
+  }
+
+  test_classTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+class Test = A with B implements C;
+''');
+    _assertImpl(library, 'Test', NodeKind.CLASS_TYPE_ALIAS);
+  }
+
+  test_functionTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+typedef A Test<T extends B>(C c, T t);
+''');
+    _assertImpl(library, 'Test', NodeKind.FUNCTION_TYPE_ALIAS);
+  }
+
+  test_unit_class() async {
+    var library = await buildTestLibrary(a, r'''
+class Test<T extends A, U extends T> extends B with C, implements D {
+  void test() {
+    x;
+  }
+}
+''');
+    _assertImpl(library, 'Test', NodeKind.CLASS);
+  }
+
+  test_unit_classTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+class Test<T extends V, U extends T> = A<T> with B<U, W>;
+''');
+    _assertImpl(library, 'Test', NodeKind.CLASS_TYPE_ALIAS);
+  }
+
+  test_unit_function() async {
+    var library = await buildTestLibrary(a, r'''
+void test(A a, {b: x}) {
+  y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_unit_mixin() async {
+    var library = await buildTestLibrary(a, r'''
+mixin Test<T extends A, U extends T> on B<T>, C<D, U> {
+  void test() {
+    x;
+  }
+}
+''');
+    _assertImpl(library, 'Test', NodeKind.MIXIN);
+  }
+
+  test_unit_variable() async {
+    var library = await buildTestLibrary(a, r'''
+int test = x;
+''');
+    _assertImpl(library, 'test', NodeKind.GETTER, unprefixed: ['x']);
+    _assertImpl(library, 'test=', NodeKind.SETTER); // empty
+  }
+
+  test_unit_variable_noInitializer() async {
+    var library = await buildTestLibrary(a, r'''
+int test;
+''');
+    _assertImpl(library, 'test', NodeKind.GETTER);
+    _assertImpl(library, 'test=', NodeKind.SETTER); // empty
+  }
+}
+
+@reflectiveTest
+class ShadowReferenceCollectorTest extends _Base {
+  test_importPrefix_with_classMember_getter_field() async {
+    var library = await buildTestLibrary(a, r'''
+import 'b.dart' as p;
+
+class X {
+  p.A<B> test() {}
+
+  int p;
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD,
+        memberOf: 'X', unprefixed: ['B', 'p']);
+  }
+
+  test_importPrefix_with_classMember_method() async {
+    var library = await buildTestLibrary(a, r'''
+import 'b.dart' as p;
+
+class X {
+  p.A<B> test() {}
+
+  p() {}
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD,
+        memberOf: 'X', unprefixed: ['B', 'p']);
+  }
+
+  test_importPrefix_with_function() async {
+    var library = await buildTestLibrary(a, r'''
+import 'b.dart' as p;
+
+p() {} // this is a compilation error
+
+class X extends p.A<B> {}
+''');
+    _assertApi(library, 'X', NodeKind.CLASS, unprefixed: [
+      'B'
+    ], prefixed: {
+      'p': ['A']
+    });
+  }
+
+  test_syntacticScope_class_constructor() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  X.test(A a, X b) {
+    X;
+  }
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X', unprefixed: ['A']);
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR, memberOf: 'X');
+  }
+
+  test_syntacticScope_class_constructor_parameters() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  X.test(a, b, c) {
+    a; b; c;
+    d;
+  }
+}
+''');
+    _assertApi(library, 'test', NodeKind.CONSTRUCTOR, memberOf: 'X');
+    _assertImpl(library, 'test', NodeKind.CONSTRUCTOR,
+        memberOf: 'X', unprefixed: ['d']);
+  }
+
+  test_syntacticScope_class_field() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  var test = x + X + test;
+}
+''');
+    _assertApi(library, 'test', NodeKind.GETTER,
+        memberOf: 'X', unprefixed: ['x']);
+    _assertImpl(library, 'test', NodeKind.GETTER,
+        memberOf: 'X', unprefixed: ['x']);
+  }
+
+  test_syntacticScope_class_method() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  test(A a, X b, test c) {
+    X;
+    test;
+    B;
+  }
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD,
+        memberOf: 'X', unprefixed: ['A']);
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'X', unprefixed: ['B']);
+  }
+
+  test_syntacticScope_class_method_parameters() async {
+    var library = await buildTestLibrary(a, r'''
+class X {
+  test(a, b, c) {
+    a; b; c;
+    d;
+  }
+}
+''');
+    _assertApi(library, 'test', NodeKind.METHOD, memberOf: 'X');
+    _assertImpl(library, 'test', NodeKind.METHOD,
+        memberOf: 'X', unprefixed: ['d']);
+  }
+
+  test_syntacticScope_class_typeParameter_ofClass() async {
+    var library = await buildTestLibrary(a, r'''
+class X<T extends A<B, X, T>> {}
+''');
+    _assertApi(library, 'T', NodeKind.TYPE_PARAMETER,
+        typeParameterOf: 'X', unprefixed: ['A', 'B']);
+  }
+
+  test_syntacticScope_unit_class() async {
+    var library = await buildTestLibrary(a, r'''
+class X extends A<B, X> {}
+''');
+    _assertApi(library, 'X', NodeKind.CLASS, unprefixed: ['A', 'B']);
+  }
+
+  test_syntacticScope_unit_function() async {
+    var library = await buildTestLibrary(a, r'''
+test(A a, test b) {
+  test;
+  B;
+}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['B']);
+  }
+
+  test_syntacticScope_unit_function_parameters() async {
+    var library = await buildTestLibrary(a, r'''
+test(a, b, {c}) {
+  a; b; c;
+  d;
+}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION);
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['d']);
+  }
+
+  test_syntacticScope_unit_functionTypeAlias() async {
+    var library = await buildTestLibrary(a, r'''
+typedef X(A a, X b);
+''');
+    _assertApi(library, 'X', NodeKind.FUNCTION_TYPE_ALIAS, unprefixed: ['A']);
+  }
+
+  test_syntacticScope_unit_mixin() async {
+    var library = await buildTestLibrary(a, r'''
+mixin X on A<B, X> {}
+''');
+    _assertApi(library, 'X', NodeKind.MIXIN, unprefixed: ['A', 'B']);
+  }
+}
+
+@reflectiveTest
+class StatementReferenceCollectorTest extends _Base {
+  test_assertStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  assert(x, y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_block_localScope() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  var x = 0;
+  {
+    var y = 0;
+    {
+      x;
+      y;
+    }
+    x;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_breakStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  while (true) {
+    break;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_continueStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  while (true) {
+    continue;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_doStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  do {
+    x;
+  } while (y);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_emptyStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  while (true);
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_forEachStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  for (A a in x) {
+    a;
+    y;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'x', 'y']);
+  }
+
+  test_forEachStatement_body_singleStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  for (var a in x) a;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_forEachStatement_iterableAsLoopVariable() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  for (A x in x) {
+    y;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'x', 'y']);
+  }
+
+  test_forEachStatement_loopIdentifier() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  for (x in y) {
+    z;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y', 'z']);
+  }
+
+  test_forStatement_initialization() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  for (x; y; z) {
+    z2;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y', 'z', 'z2']);
+  }
+
+  test_forStatement_variables() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  for (A a = x, b = y, c = a; z; a, b, z2) {
+    z3;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'x', 'y', 'z', 'z2', 'z3']);
+  }
+
+  test_functionDeclarationStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  A foo(B b) {
+    x;
+    C;
+    b;
+    foo();
+  }
+  foo();
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'B', 'C', 'x']);
+  }
+
+  test_ifStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  if (x) {
+    y;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_ifStatement_else() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  if (x) {
+    y;
+  } else {
+    z;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y', 'z']);
+  }
+
+  test_labeledStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  label: x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_returnStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  return x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+
+  test_switchStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  switch (x) {
+    case y:
+      var local1 = 1;
+      z;
+      local1;
+      break;
+    default:
+      var local2 = 2;
+      z2;
+      local2;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['x', 'y', 'z', 'z2']);
+  }
+
+  test_switchStatement_localScopePerCase() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  switch (0) {
+    case 0:
+      var v1 = 1;
+      var v2 = 2;
+      v1;
+      v2;
+    default:
+      v1;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['v1']);
+  }
+
+  test_tryStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  try {
+    var local1 = 1;
+    x;
+    local1;
+  } finally {
+    var local2 = 2;
+    y;
+    local2;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_tryStatement_catch() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  try {
+    var local1 = 1;
+    x;
+    local1;
+  } on A {
+    var local2 = 2;
+    y;
+    local2;
+  } on B catch (ex1) {
+    var local3 = 3;
+    z;
+    ex1;
+    local3;
+  } catch (ex2, st2) {
+    ex2;
+    st2;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'B', 'x', 'y', 'z']);
+  }
+
+  test_variableDeclarationStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  var a = x, b = y;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_whileStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() {
+  while (x) {
+    y;
+  }
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x', 'y']);
+  }
+
+  test_yieldStatement() async {
+    var library = await buildTestLibrary(a, r'''
+test() sync* {
+  yield x;
+}
+''');
+    _assertImpl(library, 'test', NodeKind.FUNCTION, unprefixed: ['x']);
+  }
+}
+
+@reflectiveTest
+class TypeReferenceCollectorTest extends _Base {
+  test_dynamic() async {
+    var library = await buildTestLibrary(a, r'''
+dynamic test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION);
+  }
+
+  test_function() async {
+    var library = await buildTestLibrary(a, r'''
+A Function(B) test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
+  }
+
+  test_function_generic() async {
+    var library = await buildTestLibrary(a, r'''
+A Function<T, U extends B>(T t, C c, D<T> d, E e) test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'B', 'C', 'D', 'E']);
+  }
+
+  test_function_nested_generic() async {
+    var library = await buildTestLibrary(a, r'''
+A Function<T>(B Function<U>(U, C, T) f, D) test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'B', 'C', 'D']);
+  }
+
+  test_function_parameter_named() async {
+    var library = await buildTestLibrary(a, r'''
+A Function({B, C}) test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B', 'C']);
+  }
+
+  test_function_parameter_positional() async {
+    var library = await buildTestLibrary(a, r'''
+A Function([B, C]) test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B', 'C']);
+  }
+
+  test_function_shadow_typeParameters() async {
+    var library = await buildTestLibrary(a, r'''
+A Function<T extends U, U>(B) test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A', 'B']);
+  }
+
+  test_interface_generic() async {
+    var library = await buildTestLibrary(a, r'''
+A<B, C<D>> test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION,
+        unprefixed: ['A', 'B', 'C', 'D']);
+  }
+
+  test_interface_prefixed() async {
+    var library = await buildTestLibrary(a, r'''
+import 'b.dart' as pb;
+import 'c.dart' as pc;
+A<pb.B2, pc.C2, pb.B1, pc.C1, pc.C3> test() {}
+''');
+    _assertApi(
+      library,
+      'test',
+      NodeKind.FUNCTION,
+      unprefixed: ['A'],
+      prefixed: {
+        'pb': ['B1', 'B2'],
+        'pc': ['C1', 'C2', 'C3']
+      },
+    );
+  }
+
+  test_interface_simple() async {
+    var library = await buildTestLibrary(a, r'''
+A test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION, unprefixed: ['A']);
+  }
+
+  test_void() async {
+    var library = await buildTestLibrary(a, r'''
+void test() {}
+''');
+    _assertApi(library, 'test', NodeKind.FUNCTION);
+  }
+}
+
+class _Base extends BaseDependencyTest {
+  void _assertApi(Library library, String name, NodeKind kind,
+      {String memberOf,
+      String typeParameterOf,
+      List<String> unprefixed: const [],
+      Map<String, List<String>> prefixed: const {},
+      List<String> superPrefixed: const [],
+      List<_ExpectedClassMember> expectedMembers: const []}) {
+    var node = getNode(
+      library,
+      name: name,
+      kind: kind,
+      memberOf: memberOf,
+      typeParameterOf: typeParameterOf,
+    );
+    _assertDependencies(
+      node.api,
+      unprefixed: unprefixed,
+      prefixed: prefixed,
+      superPrefixed: superPrefixed,
+      expectedMembers: expectedMembers,
+    );
+  }
+
+  void _assertDependencies(Dependencies dependencies,
+      {List<String> unprefixed: const [],
+      Map<String, List<String>> prefixed: const {},
+      List<String> superPrefixed: const [],
+      List<_ExpectedClassMember> expectedMembers: const []}) {
+    expect(dependencies.unprefixedReferencedNames, unprefixed);
+    expect(dependencies.importPrefixes, prefixed.keys);
+    expect(dependencies.importPrefixedReferencedNames, prefixed.values);
+    expect(dependencies.superReferencedNames, superPrefixed);
+
+    var actualMembers = dependencies.classMemberReferences;
+    if (actualMembers.length != expectedMembers.length) {
+      fail('Expected: $expectedMembers\nActual: $actualMembers');
+    }
+    expect(actualMembers, hasLength(expectedMembers.length));
+    for (var i = 0; i < actualMembers.length; i++) {
+      var actualMember = actualMembers[i];
+      var expectedMember = expectedMembers[i];
+      if (actualMember.target.libraryUri != expectedMember.targetUri ||
+          actualMember.target.name != expectedMember.targetName ||
+          actualMember.name != expectedMember.name) {
+        fail('Expected: $expectedMember\nActual: $actualMember');
+      }
+    }
+  }
+
+  void _assertImpl(Library library, String name, NodeKind kind,
+      {String memberOf,
+      String typeParameterOf,
+      List<String> unprefixed: const [],
+      Map<String, List<String>> prefixed: const {},
+      List<String> superPrefixed: const [],
+      List<_ExpectedClassMember> expectedMembers: const []}) {
+    var node = getNode(
+      library,
+      name: name,
+      kind: kind,
+      memberOf: memberOf,
+      typeParameterOf: typeParameterOf,
+    );
+    _assertDependencies(
+      node.impl,
+      unprefixed: unprefixed,
+      prefixed: prefixed,
+      superPrefixed: superPrefixed,
+      expectedMembers: expectedMembers,
+    );
+  }
+}
+
+class _ExpectedClassMember {
+  final Uri targetUri;
+  final String targetName;
+  final String name;
+
+  _ExpectedClassMember(
+    this.targetUri,
+    this.targetName,
+    this.name,
+  );
+
+  @override
+  String toString() {
+    return '($targetUri, $targetName, $name)';
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/dependency/test_all.dart b/pkg/analyzer/test/src/dart/analysis/dependency/test_all.dart
new file mode 100644
index 0000000..0abdb5c
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/dependency/test_all.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'declared_nodes_test.dart' as declared_nodes_test;
+import 'reference_collector_test.dart' as reference_collector_test;
+
+main() {
+  defineReflectiveSuite(() {
+    declared_nodes_test.main();
+    reference_collector_test.main();
+  }, name: 'dependency');
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 7841c96..e52ece7 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -1,17 +1,19 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:test/test.dart';
@@ -25,6 +27,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(AnalysisDriverResolutionTest);
+    defineReflectiveTests(DriverResolutionWithExperimentsTest);
   });
 }
 
@@ -41,7 +44,7 @@
  */
 @reflectiveTest
 class AnalysisDriverResolutionTest extends BaseAnalysisDriverTest {
-  AnalysisResult result;
+  ResolvedUnitResult result;
   FindNode findNode;
   FindElement findElement;
 
@@ -376,7 +379,7 @@
   }
 
   test_annotation_onDirective_part() async {
-    provider.newFile(_p('/test/lib/a.dart'), r'''
+    newFile('/test/lib/a.dart', content: r'''
 part of 'test.dart';
 ''');
     addTestFile(r'''
@@ -399,8 +402,7 @@
   }
 
   test_annotation_onDirective_partOf() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 part 'test.dart';
 ''');
     addTestFile(r'''
@@ -409,7 +411,6 @@
 
 const a = 1;
 ''');
-    driver.addFile(a);
     await resolveTestFile();
 
     var directive = findNode.partOf('a.dart');
@@ -522,8 +523,7 @@
   }
 
   test_annotation_prefixed_classField() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class A {
   static const a = 1;
 }
@@ -563,8 +563,7 @@
   }
 
   test_annotation_prefixed_constructor() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class A {
   const A(int a, {int b});
 }
@@ -605,8 +604,7 @@
   }
 
   test_annotation_prefixed_constructor_named() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class A {
   const A.named(int a, {int b});
 }
@@ -649,8 +647,7 @@
   }
 
   test_annotation_prefixed_topLevelVariable() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 const topAnnotation = 1;
 ''');
     addTestFile(r'''
@@ -1538,8 +1535,7 @@
 
   @failingTest
   test_deferredImport_loadLibrary_invocation() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, '');
+    newFile('/test/lib/a.dart');
     addTestFile(r'''
 import 'a.dart' deferred as a;
 main() {
@@ -1564,8 +1560,7 @@
 
   @failingTest
   test_deferredImport_loadLibrary_invocation_argument() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, '');
+    newFile('/test/lib/a.dart');
     addTestFile(r'''
 import 'a.dart' deferred as a;
 var b = 1;
@@ -1599,8 +1594,7 @@
   }
 
   test_deferredImport_loadLibrary_tearOff() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, '');
+    newFile('/test/lib/a.dart');
     addTestFile(r'''
 import 'a.dart' deferred as a;
 main() {
@@ -1623,8 +1617,7 @@
   }
 
   test_deferredImport_variable() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, 'var v = 0;');
+    newFile('/test/lib/a.dart', content: 'var v = 0;');
     addTestFile(r'''
 import 'a.dart' deferred as a;
 main() async {
@@ -1664,8 +1657,7 @@
   }
 
   test_directive_export() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class MyClass {}
 int myVar;
 int get myGetter => 0;
@@ -1713,8 +1705,7 @@
   }
 
   test_directive_import_hide() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class MyClass {}
 int myVar;
 int get myGetter => 0;
@@ -1762,8 +1753,7 @@
   }
 
   test_directive_import_show() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class MyClass {}
 int myVar;
 int get myGetter => 0;
@@ -2325,8 +2315,7 @@
   }
 
   test_instanceCreation_prefixed() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class C<T> {
   C(T p);
   C.named(T p);
@@ -3567,7 +3556,6 @@
     assertType(aRef, 'int');
   }
 
-  @failingTest
   test_invalid_methodInvocation_simpleIdentifier() async {
     addTestFile(r'''
 int foo = 0;
@@ -3720,8 +3708,7 @@
 
   @failingTest
   test_invalid_nonTypeAsType_topLevelFunction_prefixed() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 int T() => 0;
 ''');
     addTestFile(r'''
@@ -3789,8 +3776,7 @@
 
   @failingTest
   test_invalid_nonTypeAsType_topLevelVariable_prefixed() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 int T;
 ''');
     addTestFile(r'''
@@ -4095,12 +4081,12 @@
 
     VariableDeclarationStatement vStatement = mainStatements[1];
     VariableDeclaration vDeclaration = vStatement.variables.variables[0];
-    expect(vDeclaration.declaredElement.type, same(doubleType));
+    expect(vDeclaration.declaredElement.type, doubleType);
 
     MethodInvocation fInvocation = vDeclaration.initializer;
     expect(fInvocation.methodName.staticElement, same(fElement));
     expect(fInvocation.methodName.staticType.toString(), fTypeString);
-    expect(fInvocation.staticType, same(doubleType));
+    expect(fInvocation.staticType, doubleType);
     expect(fInvocation.staticInvokeType.toString(), fTypeString);
   }
 
@@ -4421,12 +4407,12 @@
     {
       VariableDeclarationStatement statement = mainStatements[1];
       VariableDeclaration declaration = statement.variables.variables[0];
-      expect(declaration.declaredElement.type, same(doubleType));
+      expect(declaration.declaredElement.type, doubleType);
 
       MethodInvocation invocation = declaration.initializer;
       expect(invocation.methodName.staticElement, same(fElement));
       expect(invocation.methodName.staticType.toString(), fTypeString);
-      expect(invocation.staticType, same(doubleType));
+      expect(invocation.staticType, doubleType);
       expect(invocation.staticInvokeType.toString(), fTypeString);
 
       List<Expression> arguments = invocation.argumentList.arguments;
@@ -5388,8 +5374,8 @@
     expect(target.staticType.toString(), '(int) → double');
 
     SimpleIdentifier methodName = invocation.methodName;
-    expect(methodName.staticElement, same(parameter));
-    expect(methodName.staticType, parameter.type);
+    expect(methodName.staticElement, isNull);
+    expect(methodName.staticType, dynamicType);
   }
 
   test_methodInvocation_instanceMethod_forwardingStub() async {
@@ -5787,7 +5773,7 @@
 
     expect(invocation.methodName.staticElement, same(fElement));
     expect(invocation.methodName.staticType.toString(), fTypeString);
-    expect(invocation.staticType, same(doubleType));
+    expect(invocation.staticType, doubleType);
     expect(invocation.staticInvokeType.toString(), fTypeString);
 
     _assertArgumentToParameter(arguments[0], fElement.parameters[0]);
@@ -5899,7 +5885,7 @@
 
   @failingTest
   test_optionalConst_prefixed() async {
-    provider.newFile(_p('/test/lib/a.dart'), r'''
+    newFile('/test/lib/a.dart', content: r'''
 class C {
   const C();
   const C.named();
@@ -6426,8 +6412,7 @@
   }
 
   test_prefixedIdentifier_importPrefix_className() async {
-    var libPath = _p('/test/lib/lib.dart');
-    provider.newFile(libPath, '''
+    newFile('/test/lib/lib.dart', content: '''
 class MyClass {}
 typedef void MyFunctionTypeAlias();
 int myTopVariable;
@@ -6883,21 +6868,20 @@
       SimpleIdentifier identifier = statement.expression;
 
       expect(identifier.staticElement, same(getterElement));
-      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.staticType, typeProvider.intType);
     }
 
     // super.getter;
     {
       ExpressionStatement statement = testStatements[3];
       PropertyAccess propertyAccess = statement.expression;
-      expect(propertyAccess.staticType, same(typeProvider.intType));
+      expect(propertyAccess.staticType, typeProvider.intType);
 
       SuperExpression target = propertyAccess.target;
       expect(target.staticType, bNode.declaredElement.type); // raw
 
       expect(propertyAccess.propertyName.staticElement, same(getterElement));
-      expect(
-          propertyAccess.propertyName.staticType, same(typeProvider.intType));
+      expect(propertyAccess.propertyName.staticType, typeProvider.intType);
     }
 
     // setter = 3;
@@ -6907,7 +6891,7 @@
 
       SimpleIdentifier identifier = assignment.leftHandSide;
       expect(identifier.staticElement, same(setterElement));
-      expect(identifier.staticType, same(typeProvider.intType));
+      expect(identifier.staticType, typeProvider.intType);
     }
 
     // this.setter = 4;
@@ -6921,8 +6905,7 @@
       expect(target.staticType, bNode.declaredElement.type); // raw
 
       expect(propertyAccess.propertyName.staticElement, same(setterElement));
-      expect(
-          propertyAccess.propertyName.staticType, same(typeProvider.intType));
+      expect(propertyAccess.propertyName.staticType, typeProvider.intType);
     }
 
     // super + 5;
@@ -7526,7 +7509,7 @@
       TypeName typeName = bDeclaration.fields.type;
       SimpleIdentifier typeIdentifier = typeName.name;
       expect(typeIdentifier.staticElement, same(tElement));
-      expect(typeIdentifier.staticType, same(tElement.type));
+      expect(typeIdentifier.staticType, tElement.type);
 
       VariableDeclaration bNode = bDeclaration.fields.variables[0];
       expect(bNode.declaredElement, same(bElement));
@@ -8019,12 +8002,9 @@
   }
 
   test_typeAnnotation_prefixed() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, "export 'a.dart';");
-    provider.newFile(c, "export 'a.dart';");
+    newFile('/test/lib/a.dart', content: 'class A {}');
+    newFile('/test/lib/b.dart', content: "export 'a.dart';");
+    newFile('/test/lib/c.dart', content: "export 'a.dart';");
     addTestFile(r'''
 import 'b.dart' as b;
 import 'c.dart' as c;
@@ -8737,69 +8717,6 @@
     expect(identifier.staticType, isDynamicType);
   }
 
-  test_unresolved_static_call() async {
-    addTestFile('''
-class C {
-  static f() => C.g();
-}
-''');
-    await resolveTestFile();
-    expect(result.errors, isNotEmpty);
-
-    var g = findNode.simple('g()');
-    assertElementNull(g);
-    assertTypeDynamic(g);
-    var invocation = g.parent as MethodInvocation;
-    assertTypeDynamic(invocation);
-    expect(invocation.staticInvokeType, isDynamicType);
-  }
-
-  test_unresolved_static_call_arguments() async {
-    addTestFile('''
-int x;
-class C {
-  static f() => C.g(x);
-}
-''');
-    await resolveTestFile();
-    expect(result.errors, isNotEmpty);
-
-    var x = findNode.simple('x)');
-    assertElement(x, findElement.topGet('x'));
-    assertType(x, 'int');
-  }
-
-  test_unresolved_static_call_same_name_as_type_param() async {
-    addTestFile('''
-class C<T> {
-  static f() => C.T();
-}
-''');
-    await resolveTestFile();
-    expect(result.errors, isNotEmpty);
-
-    var t = findNode.simple('T()');
-    assertElementNull(t);
-    assertTypeDynamic(t);
-    var invocation = t.parent as MethodInvocation;
-    assertTypeDynamic(invocation);
-    expect(invocation.staticInvokeType, isDynamicType);
-  }
-
-  test_unresolved_static_call_type_arguments() async {
-    addTestFile('''
-class C {
-  static f() => C.g<int>();
-}
-''');
-    await resolveTestFile();
-    expect(result.errors, isNotEmpty);
-
-    var intRef = findNode.simple('int>');
-    assertElement(intRef, intType.element);
-    assertType(intRef, 'int');
-  }
-
   /// Assert that the [argument] is associated with the [expected]. If the
   /// [argument] is a [NamedExpression], the name must be resolved to the
   /// parameter.
@@ -8897,7 +8814,7 @@
 
     TypeName typeName = node.type;
     if (typeName != null) {
-      expect(typeName.type, same(type));
+      expect(typeName.type, type);
       expect(typeName.name.staticElement, same(type.element));
     }
   }
@@ -8910,7 +8827,7 @@
     expect(identifier.staticType, type);
   }
 
-  List<Statement> _getMainStatements(AnalysisResult result) {
+  List<Statement> _getMainStatements(ResolvedUnitResult result) {
     for (var declaration in result.unit.declarations) {
       if (declaration is FunctionDeclaration &&
           declaration.name.name == 'main') {
@@ -8922,7 +8839,7 @@
   }
 
   TopLevelVariableElement _getTopLevelVariable(
-      AnalysisResult result, String name) {
+      ResolvedUnitResult result, String name) {
     for (var variable in result.unit.declaredElement.topLevelVariables) {
       if (variable.name == name) {
         return variable;
@@ -8931,8 +8848,49 @@
     fail('Not found $name');
   }
 
-  /**
-   * Return the [provider] specific path for the given Posix [path].
-   */
-  String _p(String path) => provider.convertPath(path);
+//  String _p(String path) => convertPath(path);
+}
+
+/**
+ * Resolution tests that are run with all of the experiments enabled.
+ */
+@reflectiveTest
+class DriverResolutionWithExperimentsTest extends BaseAnalysisDriverTest {
+  AnalysisOptionsImpl createAnalysisOptions() => super.createAnalysisOptions()
+    ..enabledExperiments = _computeActiveExperimentNames();
+
+  test_binaryExpression_gtGtGt() async {
+    addTestFile('''
+class A {
+  A operator >>>(int amount) => this;
+}
+f(A a) {
+  a >>> 3;
+}
+''');
+    var result = await driver.getResult(testFile);
+    CompilationUnit unit = result.unit;
+    MethodDeclaration declaration =
+        (unit.declarations[0] as ClassDeclaration).members[0];
+    ExecutableElement operatorElement = declaration.declaredElement;
+    expect(operatorElement.name, '>>>');
+    ExpressionStatement statement =
+        ((unit.declarations[1] as FunctionDeclaration).functionExpression.body
+                as BlockFunctionBody)
+            .block
+            .statements[0];
+    BinaryExpression binary = statement.expression;
+    expect(binary.operator.type, TokenType.GT_GT_GT);
+    expect(binary.staticElement, operatorElement);
+  }
+
+  List<String> _computeActiveExperimentNames() {
+    var result = <String>[];
+    for (var feature in ExperimentStatus.knownFeatures.values) {
+      if (!feature.isExpired) {
+        result.add(feature.enableString);
+      }
+    }
+    return result;
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index b0adc84..0970f26 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1,17 +1,19 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
 import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
@@ -24,13 +26,12 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../utils.dart';
-import '../../context/mock_sdk.dart';
 import 'base.dart';
 
 main() {
@@ -56,8 +57,7 @@
 }
 
 @reflectiveTest
-class AnalysisDriverSchedulerTest {
-  final MemoryResourceProvider provider = new MemoryResourceProvider();
+class AnalysisDriverSchedulerTest with ResourceProviderMixin {
   DartSdk sdk;
   final ByteStore byteStore = new MemoryByteStore();
   final FileContentOverlay contentOverlay = new FileContentOverlay();
@@ -67,28 +67,28 @@
 
   AnalysisDriverScheduler scheduler;
 
-  List<AnalysisResult> allResults = [];
+  List<ResolvedUnitResult> allResults = [];
 
   AnalysisDriver newDriver() {
-    sdk = new MockSdk(resourceProvider: provider);
+    sdk = new MockSdk(resourceProvider: resourceProvider);
     AnalysisDriver driver = new AnalysisDriver(
         scheduler,
         logger,
-        provider,
+        resourceProvider,
         byteStore,
         contentOverlay,
         null,
-        new SourceFactory(
-            [new DartUriResolver(sdk), new ResourceUriResolver(provider)],
-            null,
-            provider),
+        new SourceFactory([
+          new DartUriResolver(sdk),
+          new ResourceUriResolver(resourceProvider)
+        ], null, resourceProvider),
         new AnalysisOptionsImpl());
     driver.results.forEach(allResults.add);
     return driver;
   }
 
   void setUp() {
-    sdk = new MockSdk(resourceProvider: provider);
+    sdk = new MockSdk(resourceProvider: resourceProvider);
     logger = new PerformanceLog(logBuffer);
     scheduler = new AnalysisDriverScheduler(logger);
     scheduler.start();
@@ -98,14 +98,14 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    String c = _p('/c.dart');
-    String d = _p('/d.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, "import 'a.dart';");
-    provider.newFile(c, 'class C {}');
-    provider.newFile(d, "import 'c.dart';");
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    String c = convertPath('/c.dart');
+    String d = convertPath('/d.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: "import 'a.dart';");
+    newFile(c, content: 'class C {}');
+    newFile(d, content: "import 'c.dart';");
     driver1.addFile(a);
     driver1.addFile(b);
     driver2.addFile(c);
@@ -114,8 +114,8 @@
     await scheduler.waitForIdle();
     allResults.clear();
 
-    provider.updateFile(a, 'class A2 {}');
-    provider.updateFile(c, 'class C2 {}');
+    modifyFile(a, 'class A2 {}');
+    modifyFile(c, 'class C2 {}');
     driver1.changeFile(a);
     driver1.changeFile(c);
     driver2.changeFile(a);
@@ -131,12 +131,12 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    String c = _p('/c.dart');
-    provider.newFile(a, "import 'c.dart';");
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, "import 'b.dart';");
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    String c = convertPath('/c.dart');
+    newFile(a, content: "import 'c.dart';");
+    newFile(b, content: 'class B {}');
+    newFile(c, content: "import 'b.dart';");
     driver1.addFile(a);
     driver1.addFile(b);
     driver2.addFile(c);
@@ -144,7 +144,7 @@
     await scheduler.waitForIdle();
     allResults.clear();
 
-    provider.updateFile(b, 'class B2 {}');
+    modifyFile(b, 'class B2 {}');
     driver1.changeFile(b);
     driver2.changeFile(b);
 
@@ -158,14 +158,14 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    String c = _p('/c.dart');
-    String d = _p('/d.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, "export 'a.dart';");
-    provider.newFile(c, "import 'b.dart';");
-    provider.newFile(d, "import 'b.dart'; class D extends X {}");
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    String c = convertPath('/c.dart');
+    String d = convertPath('/d.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: "export 'a.dart';");
+    newFile(c, content: "import 'b.dart';");
+    newFile(d, content: "import 'b.dart'; class D extends X {}");
     driver1.addFile(a);
     driver1.addFile(b);
     driver2.addFile(c);
@@ -174,7 +174,7 @@
     await scheduler.waitForIdle();
     allResults.clear();
 
-    provider.updateFile(a, 'class A2 {}');
+    modifyFile(a, 'class A2 {}');
     driver1.changeFile(a);
     driver2.changeFile(a);
 
@@ -188,19 +188,19 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    String c = _p('/c.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, 'class C {}');
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    String c = convertPath('/c.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
+    newFile(c, content: 'class C {}');
     driver1.addFile(a);
     driver2.addFile(b);
     driver2.addFile(c);
     driver1.priorityFiles = [a];
     driver2.priorityFiles = [a];
 
-    AnalysisResult result = await driver2.getResult(b);
+    ResolvedUnitResult result = await driver2.getResult(b);
     expect(result.path, b);
 
     await scheduler.status.firstWhere((status) => status.isIdle);
@@ -215,10 +215,10 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
     driver1.addFile(a);
     driver2.addFile(b);
     driver1.priorityFiles = [a];
@@ -235,10 +235,10 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
     driver1.addFile(a);
     driver2.addFile(b);
     driver1.priorityFiles = [b];
@@ -255,12 +255,12 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    String c = _p('/c.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, 'class C {}');
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    String c = convertPath('/c.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
+    newFile(c, content: 'class C {}');
     driver1.addFile(a);
     driver1.addFile(b);
     driver2.addFile(c);
@@ -279,12 +279,12 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    String c = _p('/c.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, 'class C {}');
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    String c = convertPath('/c.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
+    newFile(c, content: 'class C {}');
     driver1.addFile(a);
     driver2.addFile(b);
     driver2.addFile(c);
@@ -311,10 +311,10 @@
     AnalysisDriver driver1 = newDriver();
     AnalysisDriver driver2 = newDriver();
 
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
     driver1.addFile(a);
     driver2.addFile(b);
 
@@ -338,21 +338,18 @@
     await driver1.getFilesReferencingName('X');
     expect(allStatuses, isEmpty);
   }
-
-  String _p(String path) => provider.convertPath(path);
 }
 
 @reflectiveTest
 class AnalysisDriverTest extends BaseAnalysisDriverTest {
   void configurePreviewDart2() {
     driver.configure(
-        analysisOptions: new AnalysisOptionsImpl.from(driver.analysisOptions)
-          ..previewDart2 = true);
+        analysisOptions: new AnalysisOptionsImpl.from(driver.analysisOptions));
   }
 
   test_addedFiles() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
 
     driver.addFile(a);
     expect(driver.addedFiles, contains(a));
@@ -371,11 +368,11 @@
   }
 
   test_addFile_shouldRefresh() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
 
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, r'''
+    newFile(a, content: 'class A {}');
+    newFile(b, content: r'''
 import 'a.dart';
 ''');
 
@@ -393,7 +390,7 @@
     assertNumberOfErrorsInB(1);
 
     // Update 'b' to use 'a', no more hints.
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import 'a.dart';
 main() {
   print(A);
@@ -406,7 +403,7 @@
     // Change 'b' content so that it has a hint.
     // Remove 'b' and add it again.
     // The file 'b' must be refreshed, and the hint must be reported.
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import 'a.dart';
 ''');
     driver.removeFile(b);
@@ -416,10 +413,10 @@
   }
 
   test_addFile_thenRemove() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
     driver.addFile(a);
     driver.addFile(b);
 
@@ -434,24 +431,24 @@
   }
 
   test_analyze_resolveDirectives() async {
-    var lib = _p('/test/lib.dart');
-    var part1 = _p('/test/part1.dart');
-    var part2 = _p('/test/part2.dart');
-    provider.newFile(lib, '''
+    var lib = convertPath('/test/lib.dart');
+    var part1 = convertPath('/test/part1.dart');
+    var part2 = convertPath('/test/part2.dart');
+    newFile(lib, content: '''
 library lib;
 part 'part1.dart';
 part 'part2.dart';
 ''');
-    provider.newFile(part1, '''
+    newFile(part1, content: '''
 part of lib;
 ''');
-    provider.newFile(part2, '''
+    newFile(part2, content: '''
 part of 'lib.dart';
 ''');
 
-    AnalysisResult libResult = await driver.getResult(lib);
-    AnalysisResult partResult1 = await driver.getResult(part1);
-    AnalysisResult partResult2 = await driver.getResult(part2);
+    ResolvedUnitResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult partResult1 = await driver.getResult(part1);
+    ResolvedUnitResult partResult2 = await driver.getResult(part2);
 
     CompilationUnit libUnit = libResult.unit;
     CompilationUnit partUnit1 = partResult1.unit;
@@ -485,189 +482,87 @@
   }
 
   test_analyze_resolveDirectives_error_missingLibraryDirective() async {
-    var lib = _p('/test/lib.dart');
-    var part = _p('/test/part.dart');
-    provider.newFile(lib, '''
+    var lib = convertPath('/test/lib.dart');
+    var part = convertPath('/test/part.dart');
+    newFile(lib, content: '''
 part 'part.dart';
 ''');
-    provider.newFile(part, '''
+    newFile(part, content: '''
 part of lib;
 ''');
 
     driver.addFile(lib);
 
-    AnalysisResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult libResult = await driver.getResult(lib);
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, ResolverErrorCode.PART_OF_UNNAMED_LIBRARY);
   }
 
   test_analyze_resolveDirectives_error_partOfDifferentLibrary_byName() async {
-    var lib = _p('/test/lib.dart');
-    var part = _p('/test/part.dart');
-    provider.newFile(lib, '''
+    var lib = convertPath('/test/lib.dart');
+    var part = convertPath('/test/part.dart');
+    newFile(lib, content: '''
 library lib;
 part 'part.dart';
 ''');
-    provider.newFile(part, '''
+    newFile(part, content: '''
 part of someOtherLib;
 ''');
 
     driver.addFile(lib);
 
-    AnalysisResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult libResult = await driver.getResult(lib);
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY);
   }
 
   test_analyze_resolveDirectives_error_partOfDifferentLibrary_byUri() async {
-    var lib = _p('/test/lib.dart');
-    var part = _p('/test/part.dart');
-    provider.newFile(lib, '''
+    var lib = convertPath('/test/lib.dart');
+    var part = convertPath('/test/part.dart');
+    newFile(lib, content: '''
 library lib;
 part 'part.dart';
 ''');
-    provider.newFile(part, '''
+    newFile(part, content: '''
 part of 'other_lib.dart';
 ''');
 
     driver.addFile(lib);
 
-    AnalysisResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult libResult = await driver.getResult(lib);
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY);
   }
 
   test_analyze_resolveDirectives_error_partOfNonPart() async {
-    var lib = _p('/test/lib.dart');
-    var part = _p('/test/part.dart');
-    provider.newFile(lib, '''
+    var lib = convertPath('/test/lib.dart');
+    var part = convertPath('/test/part.dart');
+    newFile(lib, content: '''
 library lib;
 part 'part.dart';
 ''');
-    provider.newFile(part, '''
+    newFile(part, content: '''
 // no part of directive
 ''');
 
     driver.addFile(lib);
 
-    AnalysisResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult libResult = await driver.getResult(lib);
     List<AnalysisError> errors = libResult.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.PART_OF_NON_PART);
   }
 
-  test_asyncChangesDuringAnalysis_getErrors() async {
-    var path = _p('/test/lib/test.dart');
-    provider.newFile(path, 'class A {}');
-    driver.addFile(path);
-
-    // Compute and cache errors.
-    await driver.getErrors(path);
-    await waitForIdleWithoutExceptions();
-
-    // Simulate a change that happens during reading the cached errors.
-    bool asyncWorkExecuted = false;
-    driver.test.workToWaitAfterComputingResult = (path) async {
-      await new Future.value(); // the rest will be executed asynchronously
-      provider.updateFile(path, 'class B');
-      driver.changeFile(path);
-      asyncWorkExecuted = true;
-    };
-
-    ErrorsResult result = await driver.getErrors(testFile);
-    expect(asyncWorkExecuted, isTrue);
-    expect(result.errors, isNotEmpty);
-  }
-
-  test_asyncChangesDuringAnalysis_getResult() async {
-    var path = _p('/test/lib/test.dart');
-    provider.newFile(path, 'class A {}');
-    driver.addFile(path);
-
-    // Schedule the result to be computed.
-    Future<AnalysisResult> future1 = driver.getResult(testFile);
-
-    // Simulate a change that happens during computing the result.
-    // We also request a new result, which must include the change.
-    Future<AnalysisResult> future2;
-    bool asyncWorkExecuted = false;
-    driver.test.workToWaitAfterComputingResult = (path) async {
-      provider.updateFile(path, 'class B {}');
-      driver.changeFile(path);
-      future2 = driver.getResult(testFile);
-      asyncWorkExecuted = true;
-    };
-
-    // Both futures complete, with the same result.
-    // The result must be with the new changes.
-    //
-    // It would not be wrong to have "class A {}" in result1, and "class B {}"
-    // in result2, but we test here the actual implementation behaviour.
-    AnalysisResult result1 = await future1;
-    AnalysisResult result2 = await future2;
-    expect(asyncWorkExecuted, isTrue);
-    expect(result2, same(result1));
-    expect(result1.path, testFile);
-    expect(result1.unit, isNotNull);
-    expect((result1.unit.declarations[0] as ClassDeclaration).name.name, 'B');
-  }
-
-  test_asyncChangesDuringAnalysis_resultsStream() async {
-    var path = _p('/test/lib/test.dart');
-    provider.newFile(path, 'class A {}');
-    driver.addFile(path);
-
-    // Simulate a change that happens during computing the result.
-    bool asyncWorkExecuted = false;
-    driver.test.workToWaitAfterComputingResult = (p) async {
-      if (p == path && !asyncWorkExecuted) {
-        provider.updateFile(path, 'class B');
-        driver.changeFile(path);
-        asyncWorkExecuted = true;
-      }
-    };
-
-    await waitForIdleWithoutExceptions();
-    expect(asyncWorkExecuted, isTrue);
-
-    // The last result must have an error.
-    expect(allResults.last.errors, isNotEmpty);
-  }
-
-  test_asyncChangesDuringAnalysis_resultsStream_priority() async {
-    var path = _p('/test/lib/test.dart');
-    provider.newFile(path, 'class A {}');
-    driver.addFile(path);
-    driver.priorityFiles = [path];
-
-    // Simulate a change that happens during computing the result.
-    bool asyncWorkExecuted = false;
-    driver.test.workToWaitAfterComputingResult = (p) async {
-      if (p == path && !asyncWorkExecuted) {
-        provider.updateFile(path, 'class B {}');
-        driver.changeFile(path);
-        asyncWorkExecuted = true;
-      }
-    };
-
-    await waitForIdleWithoutExceptions();
-    expect(asyncWorkExecuted, isTrue);
-
-    // The last unit must have "class B {}".
-    var lastUnit = allResults.last.unit;
-    expect((lastUnit.declarations[0] as ClassDeclaration).name.name, 'B');
-  }
-
   test_cachedPriorityResults() async {
-    var a = _p('/test/bin/a.dart');
-    provider.newFile(a, 'var a = 1;');
+    var a = convertPath('/test/bin/a.dart');
+    newFile(a, content: 'var a = 1;');
 
     driver.priorityFiles = [a];
 
-    AnalysisResult result1 = await driver.getResult(a);
+    ResolvedUnitResult result1 = await driver.getResult(a);
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     await waitForIdleWithoutExceptions();
@@ -675,14 +570,14 @@
 
     // Get the (cached) result, not reported to the stream.
     {
-      AnalysisResult result2 = await driver.getResult(a);
+      ResolvedUnitResult result2 = await driver.getResult(a);
       expect(result2, same(result1));
       expect(allResults, isEmpty);
     }
 
     // Get the (cached) result, reported to the stream.
     {
-      AnalysisResult result2 =
+      ResolvedUnitResult result2 =
           await driver.getResult(a, sendCachedToStream: true);
       expect(result2, same(result1));
 
@@ -692,28 +587,28 @@
   }
 
   test_cachedPriorityResults_flush_onAnyFileChange() async {
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    provider.newFile(a, 'var a = 1;');
-    provider.newFile(a, 'var b = 2;');
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    newFile(a, content: 'var a = 1;');
+    newFile(a, content: 'var b = 2;');
 
     driver.priorityFiles = [a];
 
-    AnalysisResult result1 = await driver.getResult(a);
+    ResolvedUnitResult result1 = await driver.getResult(a);
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     // Change a file.
     // The cache is flushed.
     driver.changeFile(a);
     expect(driver.test.priorityResults, isEmpty);
-    AnalysisResult result2 = await driver.getResult(a);
+    ResolvedUnitResult result2 = await driver.getResult(a);
     expect(driver.test.priorityResults, containsPair(a, result2));
 
     // Add a file.
     // The cache is flushed.
     driver.addFile(b);
     expect(driver.test.priorityResults, isEmpty);
-    AnalysisResult result3 = await driver.getResult(a);
+    ResolvedUnitResult result3 = await driver.getResult(a);
     expect(driver.test.priorityResults, containsPair(a, result3));
 
     // Remove a file.
@@ -723,14 +618,14 @@
   }
 
   test_cachedPriorityResults_flush_onPrioritySetChange() async {
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    provider.newFile(a, 'var a = 1;');
-    provider.newFile(b, 'var b = 2;');
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    newFile(a, content: 'var a = 1;');
+    newFile(b, content: 'var b = 2;');
 
     driver.priorityFiles = [a];
 
-    AnalysisResult result1 = await driver.getResult(a);
+    ResolvedUnitResult result1 = await driver.getResult(a);
     expect(driver.test.priorityResults, hasLength(1));
     expect(driver.test.priorityResults, containsPair(a, result1));
 
@@ -741,7 +636,7 @@
     expect(driver.test.priorityResults, containsPair(a, result1));
 
     // Get the result for "b".
-    AnalysisResult result2 = await driver.getResult(b);
+    ResolvedUnitResult result2 = await driver.getResult(b);
     expect(driver.test.priorityResults, hasLength(2));
     expect(driver.test.priorityResults, containsPair(a, result1));
     expect(driver.test.priorityResults, containsPair(b, result2));
@@ -754,25 +649,25 @@
   }
 
   test_cachedPriorityResults_notPriority() async {
-    var a = _p('/test/bin/a.dart');
-    provider.newFile(a, 'var a = 1;');
+    var a = convertPath('/test/bin/a.dart');
+    newFile(a, content: 'var a = 1;');
 
-    AnalysisResult result1 = await driver.getResult(a);
+    ResolvedUnitResult result1 = await driver.getResult(a);
     expect(driver.test.priorityResults, isEmpty);
 
     // The file is not priority, so its result is not cached.
-    AnalysisResult result2 = await driver.getResult(a);
+    ResolvedUnitResult result2 = await driver.getResult(a);
     expect(result2, isNot(same(result1)));
   }
 
   test_changeFile_implicitlyAnalyzed() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: r'''
 import 'b.dart';
 var A = B;
 ''');
-    provider.newFile(b, 'var B = 1;');
+    newFile(b, content: 'var B = 1;');
 
     driver.priorityFiles = [a];
     driver.addFile(a);
@@ -781,13 +676,13 @@
     await waitForIdleWithoutExceptions();
     expect(allResults, hasLength(1));
     {
-      AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
+      ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
       expect(_getTopLevelVarType(ar.unit, 'A'), 'int');
     }
     allResults.clear();
 
     // Change "b" and notify.
-    provider.updateFile(b, 'var B = 1.2;');
+    modifyFile(b, 'var B = 1.2;');
     driver.changeFile(b);
 
     // "b" is not an added file, so it is not scheduled for analysis.
@@ -798,7 +693,7 @@
     await waitForIdleWithoutExceptions();
     expect(allResults, hasLength(1));
     {
-      AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
+      ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
       expect(_getTopLevelVarType(ar.unit, 'A'), 'double');
     }
   }
@@ -811,10 +706,10 @@
   }
 
   test_changeFile_notUsed() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/other/b.dart');
-    provider.newFile(a, '');
-    provider.newFile(b, 'class B1 {}');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/other/b.dart');
+    newFile(a);
+    newFile(b, content: 'class B1 {}');
 
     driver.addFile(a);
 
@@ -823,7 +718,7 @@
 
     // Change "b" and notify.
     // Nothing depends on "b", so nothing is analyzed.
-    provider.updateFile(b, 'class B2 {}');
+    modifyFile(b, 'class B2 {}');
     driver.changeFile(b);
     await waitForIdleWithoutExceptions();
     expect(allResults, isEmpty);
@@ -833,14 +728,14 @@
   }
 
   test_changeFile_selfConsistent() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: r'''
 import 'b.dart';
 var A1 = 1;
 var A2 = B1;
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import 'a.dart';
 var B1 = A1;
 ''');
@@ -853,18 +748,18 @@
     // We have results for both "a" and "b".
     expect(allResults, hasLength(2));
     {
-      AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
+      ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
       expect(_getTopLevelVarType(ar.unit, 'A1'), 'int');
       expect(_getTopLevelVarType(ar.unit, 'A2'), 'int');
     }
     {
-      AnalysisResult br = allResults.firstWhere((r) => r.path == b);
+      ResolvedUnitResult br = allResults.firstWhere((r) => r.path == b);
       expect(_getTopLevelVarType(br.unit, 'B1'), 'int');
     }
 
     // Clear the results and update "a".
     allResults.clear();
-    provider.updateFile(a, r'''
+    modifyFile(a, r'''
 import 'b.dart';
 var A1 = 1.2;
 var A2 = B1;
@@ -876,12 +771,12 @@
     await waitForIdleWithoutExceptions();
     expect(allResults, hasLength(2));
     {
-      AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
+      ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
       expect(_getTopLevelVarType(ar.unit, 'A1'), 'double');
       expect(_getTopLevelVarType(ar.unit, 'A2'), 'double');
     }
     {
-      AnalysisResult br = allResults.firstWhere((r) => r.path == b);
+      ResolvedUnitResult br = allResults.firstWhere((r) => r.path == b);
       expect(_getTopLevelVarType(br.unit, 'B1'), 'double');
     }
   }
@@ -893,14 +788,14 @@
     {
       await waitForIdleWithoutExceptions();
       expect(allResults, hasLength(1));
-      AnalysisResult result = allResults[0];
+      ResolvedUnitResult result = allResults[0];
       expect(result.path, testFile);
       expect(_getTopLevelVarType(result.unit, 'V'), 'int');
     }
 
     // Update the file, but don't notify the driver.
     allResults.clear();
-    provider.updateFile(testFile, 'var V = 1.2;');
+    modifyFile(testFile, 'var V = 1.2;');
 
     // No new results.
     await pumpEventQueue();
@@ -916,7 +811,7 @@
     {
       await waitForIdleWithoutExceptions();
       expect(allResults, hasLength(1));
-      AnalysisResult result = allResults[0];
+      ResolvedUnitResult result = allResults[0];
       expect(result.path, testFile);
       expect(_getTopLevelVarType(result.unit, 'V'), 'double');
     }
@@ -1012,15 +907,15 @@
   test_const_implicitCreation() async {
     configurePreviewDart2();
 
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    newFile(a, content: r'''
 class C {
   const C();
   static const C WARNING = C();
 }
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import 'a.dart';
 
 class D {
@@ -1031,16 +926,16 @@
 const c = C.WARNING;
 const d = D.WARNING;
 ''');
-    AnalysisResult result = await driver.getResult(b);
+    ResolvedUnitResult result = await driver.getResult(b);
     expect(result.errors, isEmpty);
   }
 
   test_const_implicitCreation_rewrite() async {
     configurePreviewDart2();
 
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    newFile(a, content: r'''
 class A {
   const A();
 }
@@ -1055,14 +950,14 @@
   const C();
 }
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import 'a.dart';
 
 main() {
   const C();
 }
 ''');
-    AnalysisResult result = await driver.getResult(b);
+    ResolvedUnitResult result = await driver.getResult(b);
     expect(result.errors, isEmpty);
   }
 
@@ -1089,15 +984,15 @@
   }
 
   test_currentSession() async {
-    var a = _p('/a.dart');
+    var a = convertPath('/a.dart');
 
-    provider.newFile(a, 'var V = 1;');
+    newFile(a, content: 'var V = 1;');
     await driver.getResult(a);
 
     var session1 = driver.currentSession;
     expect(session1, isNotNull);
 
-    provider.updateFile(a, 'var V = 2;');
+    modifyFile(a, 'var V = 2;');
     driver.changeFile(a);
     await driver.getResult(a);
 
@@ -1109,19 +1004,19 @@
   }
 
   test_discoverAvailableFiles_packages() async {
-    var t = _p('/test/lib/test.dart');
-    var a1 = _p('/aaa/lib/a1.dart');
-    var a2 = _p('/aaa/lib/src/a2.dart');
-    var a3 = _p('/aaa/lib/a3.txt');
-    var b = _p('/bbb/lib/b.dart');
-    var c = _p('/ccc/lib/c.dart');
+    var t = convertPath('/test/lib/test.dart');
+    var a1 = convertPath('/aaa/lib/a1.dart');
+    var a2 = convertPath('/aaa/lib/src/a2.dart');
+    var a3 = convertPath('/aaa/lib/a3.txt');
+    var b = convertPath('/bbb/lib/b.dart');
+    var c = convertPath('/ccc/lib/c.dart');
 
-    provider.newFile(t, 'class T {}');
-    provider.newFile(a1, 'class A1 {}');
-    provider.newFile(a2, 'class A2 {}');
-    provider.newFile(a3, 'text');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, 'class C {}');
+    newFile(t, content: 'class T {}');
+    newFile(a1, content: 'class A1 {}');
+    newFile(a2, content: 'class A2 {}');
+    newFile(a3, content: 'text');
+    newFile(b, content: 'class B {}');
+    newFile(c, content: 'class C {}');
 
     driver.addFile(t);
     // Don't add a1.dart, a2.dart, or b.dart - they should be discovered.
@@ -1160,7 +1055,7 @@
 export 'foo.dart';
 ''');
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1171,7 +1066,7 @@
 import 'foo.dart';
 ''');
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1185,7 +1080,7 @@
 }
 ''', priority: true);
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
@@ -1197,19 +1092,19 @@
 part 'foo.dart';
 ''');
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     List<AnalysisError> errors = result.errors;
     expect(errors, hasLength(1));
     expect(errors[0].errorCode, CompileTimeErrorCode.URI_DOES_NOT_EXIST);
   }
 
   test_externalSummaries() async {
-    var a = _p('/a.dart');
-    var b = _p('/b.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/a.dart');
+    var b = convertPath('/b.dart');
+    newFile(a, content: r'''
 class A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import 'a.dart';
 var a = new A();
 ''');
@@ -1219,37 +1114,37 @@
         await createAnalysisDriver().test.getSummaryStore(a);
 
     // There are at least a.dart and dart:core libraries.
-    String aUri = provider.pathContext.toUri(a).toString();
+    String aUri = toUri(a).toString();
     expect(summaryStore.unlinkedMap.keys, contains(aUri));
     expect(summaryStore.linkedMap.keys, contains(aUri));
     expect(summaryStore.unlinkedMap.keys, contains('dart:core'));
     expect(summaryStore.linkedMap.keys, contains('dart:core'));
 
     // Remove a.dart from the file system.
-    provider.deleteFile(a);
+    deleteFile(a);
 
     // We don't need a.dart file when we analyze with the summary store.
     // Still no analysis errors.
     AnalysisDriver driver =
         createAnalysisDriver(externalSummaries: summaryStore);
-    AnalysisResult result = await driver.getResult(b);
+    ResolvedUnitResult result = await driver.getResult(b);
     expect(result.errors, isEmpty);
   }
 
   test_externalSummaries_partReuse() async {
-    var a = _p('/a.dart');
-    var b = _p('/b.dart');
-    var c = _p('/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/a.dart');
+    var b = convertPath('/b.dart');
+    var c = convertPath('/c.dart');
+    newFile(a, content: r'''
 library a;
 part 'b.dart';
 class A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 part of a;
 class _B {}
 ''');
-    provider.newFile(c, r'''
+    newFile(c, content: r'''
 library a;
 import 'a.dart';
 part 'b.dart';
@@ -1261,8 +1156,8 @@
     SummaryDataStore summaryStore =
         await createAnalysisDriver().test.getSummaryStore(a);
 
-    String aUri = provider.pathContext.toUri(a).toString();
-    String bUri = provider.pathContext.toUri(b).toString();
+    String aUri = toUri(a).toString();
+    String bUri = toUri(b).toString();
     // There are unlinked units for a.dart and b.dart files.
     expect(summaryStore.hasUnlinkedUnit(aUri), isTrue);
     expect(summaryStore.hasUnlinkedUnit(bUri), isTrue);
@@ -1272,28 +1167,28 @@
 
     // Remove a.dart from the file system.
     // Keep b.dart, because we (re)use it as a part.
-    provider.deleteFile(a);
+    deleteFile(a);
 
     // We don't need a.dart file when we analyze with the summary store.
     // We can instantiate the class A the library a.dart.
     // We can instantiate the class _A the part b.dart.
     AnalysisDriver driver =
         createAnalysisDriver(externalSummaries: summaryStore);
-    AnalysisResult result = await driver.getResult(c);
+    ResolvedUnitResult result = await driver.getResult(c);
     expect(result.errors, isEmpty);
   }
 
   test_generatedFile() async {
     Uri uri = Uri.parse('package:aaa/foo.dart');
-    String templatePath = _p('/aaa/lib/foo.dart');
-    String generatedPath = _p('/generated/aaa/lib/foo.dart');
+    String templatePath = convertPath('/aaa/lib/foo.dart');
+    String generatedPath = convertPath('/generated/aaa/lib/foo.dart');
 
-    provider.newFile(templatePath, r'''
+    newFile(templatePath, content: r'''
 a() {}
 b() {}
 ''');
 
-    provider.newFile(generatedPath, r'''
+    newFile(generatedPath, content: r'''
 aaa() {}
 bbb() {}
 ''');
@@ -1337,13 +1232,13 @@
   }
 
   test_getCachedResult() async {
-    var a = _p('/test/bin/a.dart');
-    provider.newFile(a, 'var a = 1;');
+    var a = convertPath('/test/bin/a.dart');
+    newFile(a, content: 'var a = 1;');
 
     expect(driver.getCachedResult(a), isNull);
 
     driver.priorityFiles = [a];
-    AnalysisResult result = await driver.getResult(a);
+    ResolvedUnitResult result = await driver.getResult(a);
 
     expect(driver.getCachedResult(a), same(result));
   }
@@ -1366,15 +1261,15 @@
   }
 
   test_getFilesDefiningClassMemberName_class() async {
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    var c = _p('/test/bin/c.dart');
-    var d = _p('/test/bin/d.dart');
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    var c = convertPath('/test/bin/c.dart');
+    var d = convertPath('/test/bin/d.dart');
 
-    provider.newFile(a, 'class A { m1() {} }');
-    provider.newFile(b, 'class B { m2() {} }');
-    provider.newFile(c, 'class C { m2() {} }');
-    provider.newFile(d, 'class D { m3() {} }');
+    newFile(a, content: 'class A { m1() {} }');
+    newFile(b, content: 'class B { m2() {} }');
+    newFile(c, content: 'class C { m2() {} }');
+    newFile(d, content: 'class D { m3() {} }');
 
     driver.addFile(a);
     driver.addFile(b);
@@ -1392,15 +1287,15 @@
   }
 
   test_getFilesDefiningClassMemberName_mixin() async {
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    var c = _p('/test/bin/c.dart');
-    var d = _p('/test/bin/d.dart');
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    var c = convertPath('/test/bin/c.dart');
+    var d = convertPath('/test/bin/d.dart');
 
-    provider.newFile(a, 'mixin A { m1() {} }');
-    provider.newFile(b, 'mixin B { m2() {} }');
-    provider.newFile(c, 'mixin C { m2() {} }');
-    provider.newFile(d, 'mixin D { m3() {} }');
+    newFile(a, content: 'mixin A { m1() {} }');
+    newFile(b, content: 'mixin B { m2() {} }');
+    newFile(c, content: 'mixin C { m2() {} }');
+    newFile(d, content: 'mixin D { m3() {} }');
 
     driver.addFile(a);
     driver.addFile(b);
@@ -1418,17 +1313,17 @@
   }
 
   test_getFilesReferencingName() async {
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    var c = _p('/test/bin/c.dart');
-    var d = _p('/test/bin/d.dart');
-    var e = _p('/test/bin/e.dart');
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    var c = convertPath('/test/bin/c.dart');
+    var d = convertPath('/test/bin/d.dart');
+    var e = convertPath('/test/bin/e.dart');
 
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, "import 'a.dart'; A a;");
-    provider.newFile(c, "import 'a.dart'; var a = new A();");
-    provider.newFile(d, "class A{} A a;");
-    provider.newFile(e, "import 'a.dart'; main() {}");
+    newFile(a, content: 'class A {}');
+    newFile(b, content: "import 'a.dart'; A a;");
+    newFile(c, content: "import 'a.dart'; var a = new A();");
+    newFile(d, content: "class A{} A a;");
+    newFile(e, content: "import 'a.dart'; main() {}");
 
     driver.addFile(a);
     driver.addFile(b);
@@ -1449,15 +1344,15 @@
   }
 
   test_getFilesReferencingName_discover() async {
-    var t = _p('/test/lib/test.dart');
-    var a = _p('/aaa/lib/a.dart');
-    var b = _p('/bbb/lib/b.dart');
-    var c = _p('/ccc/lib/c.dart');
+    var t = convertPath('/test/lib/test.dart');
+    var a = convertPath('/aaa/lib/a.dart');
+    var b = convertPath('/bbb/lib/b.dart');
+    var c = convertPath('/ccc/lib/c.dart');
 
-    provider.newFile(t, 'int t;');
-    provider.newFile(a, 'int a;');
-    provider.newFile(b, 'int b;');
-    provider.newFile(c, 'int c;');
+    newFile(t, content: 'int t;');
+    newFile(a, content: 'int a;');
+    newFile(b, content: 'int b;');
+    newFile(c, content: 'int c;');
 
     driver.addFile(t);
 
@@ -1469,8 +1364,8 @@
   }
 
   test_getFileSync_library() async {
-    var path = _p('/test/lib/a.dart');
-    provider.newFile(path, '');
+    var path = convertPath('/test/lib/a.dart');
+    newFile(path);
     var file = driver.getFileSync(path);
     expect(file.path, path);
     expect(file.uri.toString(), 'package:test/a.dart');
@@ -1485,8 +1380,8 @@
   }
 
   test_getFileSync_part() async {
-    var path = _p('/test/lib/a.dart');
-    provider.newFile(path, 'part of lib;');
+    var path = convertPath('/test/lib/a.dart');
+    newFile(path, content: 'part of lib;');
     var file = driver.getFileSync(path);
     expect(file.path, path);
     expect(file.uri.toString(), 'package:test/a.dart');
@@ -1517,29 +1412,86 @@
     } on ArgumentError {}
   }
 
-  test_getLibraryByUri_external_resynthesize() async {
-    provider.newFile(testFile, r'''
-class Test {}
+  test_getLibraryByUri() async {
+    var a = '/test/lib/a.dart';
+    var b = '/test/lib/b.dart';
+
+    String aUriStr = 'package:test/a.dart';
+    String bUriStr = 'package:test/b.dart';
+
+    newFile(a, content: r'''
+part 'b.dart';
+
+class A {}
+''');
+
+    newFile(b, content: r'''
+part of 'a.dart';
+
+class B {}
+''');
+
+    var library = await driver.getLibraryByUri(aUriStr);
+    expect(library.getType('A'), isNotNull);
+    expect(library.getType('B'), isNotNull);
+
+    // It is an error to ask for a library when we know that it is a part.
+    expect(() async {
+      await driver.getLibraryByUri(bUriStr);
+    }, throwsArgumentError);
+  }
+
+  test_getLibraryByUri_external() async {
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+
+    String aUriStr = 'package:test/a.dart';
+    String bUriStr = 'package:test/b.dart';
+
+    newFile(a, content: r'''
+part 'b.dart';
+
+class A {}
+''');
+
+    newFile(b, content: r'''
+part of 'a.dart';
+
+class B {}
 ''');
 
     // Prepare the store with package:test/test.dart URI.
-    SummaryDataStore summaryStore =
-        await createAnalysisDriver().test.getSummaryStore(testFile);
+    var store = await createAnalysisDriver().test.getSummaryStore(a);
 
     // package:test/test.dart is in the store.
-    String uri = 'package:test/test.dart';
-    expect(summaryStore.unlinkedMap.keys, contains(uri));
-    expect(summaryStore.linkedMap.keys, contains(uri));
+    expect(store.unlinkedMap.keys, contains(aUriStr));
+    expect(store.unlinkedMap.keys, contains(bUriStr));
+    expect(store.linkedMap.keys, contains(aUriStr));
+    expect(store.linkedMap.keys, isNot(contains(bUriStr)));
 
-    // Remove the file from the file system.
-    provider.deleteFile(testFile);
+    // Remove the files from the file system.
+    deleteFile(a);
+    deleteFile(b);
 
-    // We can resynthesize the library from the store without reading the file.
-    AnalysisDriver driver =
-        createAnalysisDriver(externalSummaries: summaryStore);
-    expect(driver.test.numOfCreatedLibraryContexts, 0);
-    LibraryElement library = await driver.getLibraryByUri(uri);
-    expect(library.getType('Test'), isNotNull);
+    // We can resynthesize the library from the store.
+    var driver = createAnalysisDriver(externalSummaries: store);
+
+    // Ask by URI, so we get the "external" FileState.
+    var aUri = Uri.parse(aUriStr);
+    var aFile = driver.fsState.getFileForUri(aUri);
+    expect(aFile.uri, aUri);
+    expect(aFile.path, isNull);
+
+    // We still can resynthesize the library.
+    // The URI is known to be external, so we don't talk to the file.
+    var library = await driver.getLibraryByUri(aUriStr);
+    expect(library.getType('A'), isNotNull);
+    expect(library.getType('B'), isNotNull);
+
+    // It is an error to ask for a library when we know that it is a part.
+    expect(() async {
+      await driver.getLibraryByUri(bUriStr);
+    }, throwsArgumentError);
   }
 
   test_getLibraryByUri_sdk_analyze() async {
@@ -1550,11 +1502,9 @@
   }
 
   test_getLibraryByUri_sdk_resynthesize() async {
-    SummaryDataStore sdkStore;
-    {
-      String corePath = sdk.mapDartUri('dart:core').fullName;
-      sdkStore = await createAnalysisDriver().test.getSummaryStore(corePath);
-    }
+    String corePath = sdk.mapDartUri('dart:core').fullName;
+    String asyncPath = sdk.mapDartUri('dart:async').fullName;
+    var sdkStore = await createAnalysisDriver().test.getSummaryStore(corePath);
 
     // There are dart:core and dart:async in the store.
     expect(sdkStore.unlinkedMap.keys, contains('dart:core'));
@@ -1562,24 +1512,191 @@
     expect(sdkStore.linkedMap.keys, contains('dart:core'));
     expect(sdkStore.linkedMap.keys, contains('dart:async'));
 
-    // We don't create new library context (so, don't parse, summarize and
-    // link) for dart:core. The library is resynthesized from the provided
-    // external store.
+    // Remove dart:core and dart:async.
+    // So, the new driver below cannot parse and summarize them.
+    deleteFile(corePath);
+    deleteFile(asyncPath);
+
+    // We still get get dart:core library element.
     AnalysisDriver driver = createAnalysisDriver(externalSummaries: sdkStore);
     LibraryElement coreLibrary = await driver.getLibraryByUri('dart:core');
-    expect(driver.test.numOfCreatedLibraryContexts, 0);
     expect(coreLibrary, isNotNull);
     expect(coreLibrary.getType('Object'), isNotNull);
   }
 
+  test_getParsedLibrary_external() async {
+    var a1 = convertPath('/aaa/lib/a1.dart');
+    var a2 = convertPath('/aaa/lib/a2.dart');
+
+    var a1UriStr = 'package:aaa/a1.dart';
+    var a2UriStr = 'package:aaa/a2.dart';
+
+    newFile(a1, content: "part 'a2.dart';  class A {}");
+    newFile(a2, content: "part of 'a1.dart';");
+
+    // Build the store with the library.
+    var store = await createAnalysisDriver().test.getSummaryStore(a1);
+    expect(store.unlinkedMap.keys, contains(a1UriStr));
+    expect(store.unlinkedMap.keys, contains(a2UriStr));
+    expect(store.linkedMap.keys, contains(a1UriStr));
+
+    var driver = createAnalysisDriver(externalSummaries: store);
+    var libraryElement = await driver.getLibraryByUri(a1UriStr);
+    var classA = libraryElement.library.getType('A');
+
+    var parsedLibrary = driver.getParsedLibrary(a1);
+    expect(parsedLibrary, isNotNull);
+    expect(parsedLibrary.state, ResultState.NOT_A_FILE);
+    expect(() {
+      parsedLibrary.getElementDeclaration(classA);
+    }, throwsStateError);
+
+    // It is an error to ask for a library when we know that it is a part.
+    expect(() {
+      driver.getParsedLibrary(a2);
+    }, throwsArgumentError);
+  }
+
+  test_getParsedLibraryByUri_external() async {
+    var a1 = convertPath('/aaa/lib/a1.dart');
+    var a2 = convertPath('/aaa/lib/a2.dart');
+
+    var a1UriStr = 'package:aaa/a1.dart';
+    var a2UriStr = 'package:aaa/a2.dart';
+
+    var a1Uri = Uri.parse(a1UriStr);
+    var a2Uri = Uri.parse(a2UriStr);
+
+    newFile(a1, content: "part 'a2.dart';  class A {}");
+    newFile(a2, content: "part of 'a1.dart';");
+
+    // Build the store with the library.
+    var store = await createAnalysisDriver().test.getSummaryStore(a1);
+    expect(store.unlinkedMap.keys, contains(a1UriStr));
+    expect(store.unlinkedMap.keys, contains(a2UriStr));
+    expect(store.linkedMap.keys, contains(a1UriStr));
+
+    var driver = createAnalysisDriver(externalSummaries: store);
+    var libraryElement = await driver.getLibraryByUri(a1UriStr);
+    var classA = libraryElement.library.getType('A');
+
+    {
+      var parsedLibrary = driver.getParsedLibraryByUri(a1Uri);
+      expect(parsedLibrary, isNotNull);
+      expect(parsedLibrary.state, ResultState.NOT_A_FILE);
+      expect(() {
+        parsedLibrary.getElementDeclaration(classA);
+      }, throwsStateError);
+    }
+
+    // We can also get the result from the session.
+    {
+      var session = driver.currentSession;
+      var parsedLibrary = session.getParsedLibraryByElement(libraryElement);
+      expect(parsedLibrary, isNotNull);
+      expect(parsedLibrary.state, ResultState.NOT_A_FILE);
+      expect(() {
+        parsedLibrary.getElementDeclaration(classA);
+      }, throwsStateError);
+    }
+
+    // It is an error to ask for a library when we know that it is a part.
+    expect(() {
+      driver.getParsedLibraryByUri(a2Uri);
+    }, throwsArgumentError);
+  }
+
+  test_getResolvedLibrary_external() async {
+    var a1 = convertPath('/aaa/lib/a1.dart');
+    var a2 = convertPath('/aaa/lib/a2.dart');
+
+    var a1UriStr = 'package:aaa/a1.dart';
+    var a2UriStr = 'package:aaa/a2.dart';
+
+    newFile(a1, content: "part 'a2.dart';  class A {}");
+    newFile(a2, content: "part of 'a1.dart';");
+
+    // Build the store with the library.
+    var store = await createAnalysisDriver().test.getSummaryStore(a1);
+    expect(store.unlinkedMap.keys, contains(a1UriStr));
+    expect(store.unlinkedMap.keys, contains(a2UriStr));
+    expect(store.linkedMap.keys, contains(a1UriStr));
+
+    var driver = createAnalysisDriver(externalSummaries: store);
+    var libraryElement = await driver.getLibraryByUri(a1UriStr);
+    var classA = libraryElement.library.getType('A');
+
+    var resolvedLibrary = await driver.getResolvedLibrary(a1);
+    expect(resolvedLibrary, isNotNull);
+    expect(resolvedLibrary.state, ResultState.NOT_A_FILE);
+    expect(() {
+      resolvedLibrary.getElementDeclaration(classA);
+    }, throwsStateError);
+
+    // It is an error to ask for a library when we know that it is a part.
+    expect(() async {
+      await driver.getResolvedLibrary(a2);
+    }, throwsArgumentError);
+  }
+
+  test_getResolvedLibraryByUri_external() async {
+    var a1 = convertPath('/aaa/lib/a1.dart');
+    var a2 = convertPath('/aaa/lib/a2.dart');
+
+    var a1UriStr = 'package:aaa/a1.dart';
+    var a2UriStr = 'package:aaa/a2.dart';
+
+    var a1Uri = Uri.parse(a1UriStr);
+    var a2Uri = Uri.parse(a2UriStr);
+
+    newFile(a1, content: "part 'a2.dart';  class A {}");
+    newFile(a2, content: "part of 'a1.dart';");
+
+    // Build the store with the library.
+    var store = await createAnalysisDriver().test.getSummaryStore(a1);
+    expect(store.unlinkedMap.keys, contains(a1UriStr));
+    expect(store.unlinkedMap.keys, contains(a2UriStr));
+    expect(store.linkedMap.keys, contains(a1UriStr));
+
+    var driver = createAnalysisDriver(externalSummaries: store);
+    var libraryElement = await driver.getLibraryByUri(a1UriStr);
+    var classA = libraryElement.library.getType('A');
+
+    {
+      var resolvedLibrary = await driver.getResolvedLibraryByUri(a1Uri);
+      expect(resolvedLibrary, isNotNull);
+      expect(resolvedLibrary.state, ResultState.NOT_A_FILE);
+      expect(() {
+        resolvedLibrary.getElementDeclaration(classA);
+      }, throwsStateError);
+    }
+
+    // We can also get the result from the session.
+    {
+      var session = driver.currentSession;
+      var resolvedLibrary =
+          await session.getResolvedLibraryByElement(libraryElement);
+      expect(resolvedLibrary, isNotNull);
+      expect(resolvedLibrary.state, ResultState.NOT_A_FILE);
+      expect(() {
+        resolvedLibrary.getElementDeclaration(classA);
+      }, throwsStateError);
+    }
+
+    // It is an error to ask for a library when we know that it is a part.
+    expect(() async {
+      await driver.getResolvedLibraryByUri(a2Uri);
+    }, throwsArgumentError);
+  }
+
   test_getResult() async {
     String content = 'int f() => 42;';
     addTestFile(content, priority: true);
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     expect(result.uri.toString(), 'package:test/test.dart');
-    expect(result.exists, isTrue);
+    expect(result.state, ResultState.VALID);
     expect(result.content, content);
     expect(result.unit, isNotNull);
     expect(result.errors, hasLength(0));
@@ -1594,10 +1711,10 @@
   }
 
   test_getResult_constants_defaultParameterValue_localFunction() async {
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    provider.newFile(a, 'const C = 42;');
-    provider.newFile(b, r'''
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    newFile(a, content: 'const C = 42;');
+    newFile(b, content: r'''
 import 'a.dart';
 main() {
   foo({int p: C}) {}
@@ -1608,17 +1725,17 @@
     driver.addFile(b);
     await waitForIdleWithoutExceptions();
 
-    AnalysisResult result = await driver.getResult(b);
+    ResolvedUnitResult result = await driver.getResult(b);
     expect(result.errors, isEmpty);
   }
 
   test_getResult_doesNotExist() async {
-    var a = _p('/test/lib/a.dart');
+    var a = convertPath('/test/lib/a.dart');
 
-    AnalysisResult result = await driver.getResult(a);
+    ResolvedUnitResult result = await driver.getResult(a);
     expect(result.path, a);
     expect(result.uri.toString(), 'package:test/a.dart');
-    expect(result.exists, isFalse);
+    expect(result.state, ResultState.NOT_A_FILE);
     expect(result.content, '');
   }
 
@@ -1626,7 +1743,7 @@
     String content = 'main() { int vv; }';
     addTestFile(content, priority: true);
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     expect(result.errors, hasLength(1));
     {
@@ -1639,23 +1756,6 @@
     }
   }
 
-  test_getResult_fileContentOverlay_throughAnalysisContext() async {
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-
-    provider.newFile(a, 'import "b.dart";');
-    provider.newFile(b, 'var v = 1;');
-    contentOverlay[b] = 'var v = 2;';
-
-    var result = await driver.getResult(a);
-
-    // The content that was set into the overlay for "b" should be visible
-    // through the AnalysisContext that was used to analyze "a".
-    CompilationUnitElement unitA = result.unit.declaredElement;
-    Source sourceB = unitA.library.imports[0].importedLibrary.source;
-    expect(unitA.context.getContents(sourceB).data, 'var v = 2;');
-  }
-
   test_getResult_functionTypeFormalParameter_withTypeParameter() async {
     // This was code crashing because of incomplete implementation.
     // Consider (re)moving after fixing dartbug.com/28515
@@ -1666,7 +1766,7 @@
 class B {}
 ''');
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
   }
 
@@ -1683,10 +1783,10 @@
   }
 
   test_getResult_importLibrary_thenRemoveIt() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: r'''
 import 'a.dart';
 class B extends A {}
 ''');
@@ -1697,17 +1797,17 @@
 
     // No errors in b.dart
     {
-      AnalysisResult result = await driver.getResult(b);
+      ResolvedUnitResult result = await driver.getResult(b);
       expect(result.errors, isEmpty);
     }
 
     // Remove a.dart and reanalyze.
-    provider.deleteFile(a);
+    deleteFile(a);
     driver.removeFile(a);
 
     // The unresolved URI error must be reported.
     {
-      AnalysisResult result = await driver.getResult(b);
+      ResolvedUnitResult result = await driver.getResult(b);
       expect(
           result.errors,
           contains(predicate((AnalysisError e) =>
@@ -1715,12 +1815,12 @@
     }
 
     // Restore a.dart and reanalyze.
-    provider.newFile(a, 'class A {}');
+    newFile(a, content: 'class A {}');
     driver.addFile(a);
 
     // No errors in b.dart again.
     {
-      AnalysisResult result = await driver.getResult(b);
+      ResolvedUnitResult result = await driver.getResult(b);
       expect(result.errors, isEmpty);
     }
   }
@@ -1733,7 +1833,7 @@
 ''', priority: true);
     await waitForIdleWithoutExceptions();
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(_getClassFieldType(result.unit, 'C', 'f'), 'int');
   }
 
@@ -1748,7 +1848,7 @@
 ''', priority: true);
     await waitForIdleWithoutExceptions();
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(_getClassMethodReturnType(result.unit, 'A', 'm'), 'int');
     expect(_getClassMethodReturnType(result.unit, 'B', 'm'), 'int');
   }
@@ -1761,7 +1861,7 @@
 class C {}
 ''', priority: true);
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     ClassDeclaration c = result.unit.declarations[1] as ClassDeclaration;
     Annotation a = c.metadata[0];
     expect(a.name.name, 'fff');
@@ -1788,7 +1888,7 @@
 ''';
     addTestFile(content);
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
   }
 
@@ -1800,7 +1900,7 @@
 ''';
     addTestFile(content, priority: true);
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     // Has only exports for valid URIs.
     List<ExportElement> imports = resolutionMap
@@ -1820,7 +1920,7 @@
 ''';
     addTestFile(content, priority: true);
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     expect(result.path, testFile);
     // Has only imports for valid URIs.
     List<ImportElement> imports = resolutionMap
@@ -1848,23 +1948,23 @@
   }
 
   test_getResult_mix_fileAndPackageUris() async {
-    var a = _p('/test/bin/a.dart');
-    var b = _p('/test/bin/b.dart');
-    var c = _p('/test/lib/c.dart');
-    var d = _p('/test/test/d.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/bin/a.dart');
+    var b = convertPath('/test/bin/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    var d = convertPath('/test/test/d.dart');
+    newFile(a, content: r'''
 import 'package:test/c.dart';
 int x = y;
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import '../lib/c.dart';
 int x = y;
 ''');
-    provider.newFile(c, r'''
+    newFile(c, content: r'''
 import '../test/d.dart';
 var y = z;
 ''');
-    provider.newFile(d, r'''
+    newFile(d, content: r'''
 String z = "string";
 ''');
 
@@ -1878,7 +1978,7 @@
     // package:my_pkg/c.dart's import is erroneous, causing y's reference to z
     // to be unresolved (and therefore have type dynamic).
     {
-      AnalysisResult result = await driver.getResult(a);
+      ResolvedUnitResult result = await driver.getResult(a);
       expect(result.errors, isEmpty);
     }
 
@@ -1888,7 +1988,7 @@
     // successfully imports file:///my_pkg/test/d.dart, causing y to have an
     // inferred type of String.
     {
-      AnalysisResult result = await driver.getResult(b);
+      ResolvedUnitResult result = await driver.getResult(b);
       List<AnalysisError> errors = result.errors;
       expect(errors, hasLength(1));
       expect(errors[0].errorCode, StaticTypeWarningCode.INVALID_ASSIGNMENT);
@@ -1927,10 +2027,10 @@
   }
 
   test_getResult_notDartFile() async {
-    var path = _p('/test/lib/test.txt');
-    provider.newFile(path, 'class A {}');
+    var path = convertPath('/test/lib/test.txt');
+    newFile(path, content: 'class A {}');
 
-    AnalysisResult result = await driver.getResult(path);
+    ResolvedUnitResult result = await driver.getResult(path);
     expect(result, isNotNull);
     expect(result.unit.declaredElement.types.map((e) => e.name), ['A']);
   }
@@ -1946,15 +2046,15 @@
   }
 
   test_getResult_sameFile_twoUris() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/test/c.dart');
-    provider.newFile(a, 'class A<T> {}');
-    provider.newFile(b, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/test/c.dart');
+    newFile(a, content: 'class A<T> {}');
+    newFile(b, content: r'''
 import 'a.dart';
 var VB = new A<int>();
 ''');
-    provider.newFile(c, r'''
+    newFile(c, content: r'''
 import '../lib/a.dart';
 var VC = new A<double>();
 ''');
@@ -1964,29 +2064,31 @@
     await waitForIdleWithoutExceptions();
 
     {
-      AnalysisResult result = await driver.getResult(b);
+      ResolvedUnitResult result = await driver.getResult(b);
       expect(_getImportSource(result.unit, 0).uri.toString(),
           'package:test/a.dart');
       expect(_getTopLevelVarType(result.unit, 'VB'), 'A<int>');
     }
 
     {
-      AnalysisResult result = await driver.getResult(c);
-      expect(_getImportSource(result.unit, 0).uri,
-          provider.pathContext.toUri(_p('/test/lib/a.dart')));
+      ResolvedUnitResult result = await driver.getResult(c);
+      expect(
+        _getImportSource(result.unit, 0).uri,
+        toUri(convertPath('/test/lib/a.dart')),
+      );
       expect(_getTopLevelVarType(result.unit, 'VC'), 'A<double>');
     }
   }
 
   test_getResult_selfConsistent() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: r'''
 import 'b.dart';
 var A1 = 1;
 var A2 = B1;
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import 'a.dart';
 var B1 = A1;
 ''');
@@ -1996,7 +2098,7 @@
     await waitForIdleWithoutExceptions();
 
     {
-      AnalysisResult result = await driver.getResult(a);
+      ResolvedUnitResult result = await driver.getResult(a);
       expect(_getTopLevelVarType(result.unit, 'A1'), 'int');
       expect(_getTopLevelVarType(result.unit, 'A2'), 'int');
     }
@@ -2008,7 +2110,7 @@
     // That's because we check for "a" API signature consistency, and because
     // it has changed, we invalidated the dependency cache, relinked libraries
     // and recomputed types.
-    provider.updateFile(a, r'''
+    modifyFile(a, r'''
 import 'b.dart';
 var A1 = 1.2;
 var A2 = B1;
@@ -2016,7 +2118,7 @@
     driver.changeFile(a);
 
     {
-      AnalysisResult result = await driver.getResult(a);
+      ResolvedUnitResult result = await driver.getResult(a);
       expect(_getTopLevelVarType(result.unit, 'A1'), 'double');
       expect(_getTopLevelVarType(result.unit, 'A2'), 'double');
     }
@@ -2025,10 +2127,10 @@
   test_getResult_thenRemove() async {
     addTestFile('main() {}', priority: true);
 
-    Future<AnalysisResult> resultFuture = driver.getResult(testFile);
+    Future<ResolvedUnitResult> resultFuture = driver.getResult(testFile);
     driver.removeFile(testFile);
 
-    AnalysisResult result = await resultFuture;
+    ResolvedUnitResult result = await resultFuture;
     expect(result, isNotNull);
     expect(result.path, testFile);
     expect(result.unit, isNotNull);
@@ -2038,20 +2140,20 @@
     String content = 'main() {}';
     addTestFile(content, priority: true);
 
-    Future<AnalysisResult> future1 = driver.getResult(testFile);
-    Future<AnalysisResult> future2 = driver.getResult(testFile);
+    Future<ResolvedUnitResult> future1 = driver.getResult(testFile);
+    Future<ResolvedUnitResult> future2 = driver.getResult(testFile);
 
     // Both futures complete, with the same result.
-    AnalysisResult result1 = await future1;
-    AnalysisResult result2 = await future2;
+    ResolvedUnitResult result1 = await future1;
+    ResolvedUnitResult result2 = await future2;
     expect(result2, same(result1));
     expect(result1.path, testFile);
     expect(result1.unit, isNotNull);
   }
 
   test_getSourceKind_library() async {
-    var path = _p('/test/lib/test.dart');
-    provider.newFile(path, 'class A {}');
+    var path = convertPath('/test/lib/test.dart');
+    newFile(path, content: 'class A {}');
     expect(await driver.getSourceKind(path), SourceKind.LIBRARY);
   }
 
@@ -2063,27 +2165,27 @@
   }
 
   test_getSourceKind_notDartFile() async {
-    var path = _p('/test/lib/test.txt');
-    provider.newFile(path, 'class A {}');
+    var path = convertPath('/test/lib/test.txt');
+    newFile(path, content: 'class A {}');
     expect(await driver.getSourceKind(path), isNull);
   }
 
   test_getSourceKind_part() async {
-    var path = _p('/test/lib/test.dart');
-    provider.newFile(path, 'part of lib; class A {}');
+    var path = convertPath('/test/lib/test.dart');
+    newFile(path, content: 'part of lib; class A {}');
     expect(await driver.getSourceKind(path), SourceKind.PART);
   }
 
   test_getTopLevelNameDeclarations() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    var d = _p('/test/lib/d.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    var d = convertPath('/test/lib/d.dart');
 
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'export "a.dart"; class B {}');
-    provider.newFile(c, 'import "d.dart"; class C {}');
-    provider.newFile(d, 'class D {}');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'export "a.dart"; class B {}');
+    newFile(c, content: 'import "d.dart"; class C {}');
+    newFile(d, content: 'class D {}');
 
     driver.addFile(a);
     driver.addFile(b);
@@ -2107,17 +2209,17 @@
   }
 
   test_getTopLevelNameDeclarations_discover() async {
-    var t = _p('/test/lib/test.dart');
-    var a1 = _p('/aaa/lib/a1.dart');
-    var a2 = _p('/aaa/lib/src/a2.dart');
-    var b = _p('/bbb/lib/b.dart');
-    var c = _p('/ccc/lib/c.dart');
+    var t = convertPath('/test/lib/test.dart');
+    var a1 = convertPath('/aaa/lib/a1.dart');
+    var a2 = convertPath('/aaa/lib/src/a2.dart');
+    var b = convertPath('/bbb/lib/b.dart');
+    var c = convertPath('/ccc/lib/c.dart');
 
-    provider.newFile(t, 'class T {}');
-    provider.newFile(a1, 'class A1 {}');
-    provider.newFile(a2, 'class A2 {}');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, 'class C {}');
+    newFile(t, content: 'class T {}');
+    newFile(a1, content: 'class A1 {}');
+    newFile(a2, content: 'class A2 {}');
+    newFile(b, content: 'class B {}');
+    newFile(c, content: 'class C {}');
 
     driver.addFile(t);
     // Don't add a1.dart, a2.dart, or b.dart - they should be discovered.
@@ -2140,18 +2242,18 @@
   }
 
   test_getTopLevelNameDeclarations_parts() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
 
-    provider.newFile(a, r'''
+    newFile(a, content: r'''
 library lib;
 part 'b.dart';
 part 'c.dart';
 class A {}
 ''');
-    provider.newFile(b, 'part of lib; class B {}');
-    provider.newFile(c, 'part of lib; class C {}');
+    newFile(b, content: 'part of lib; class B {}');
+    newFile(c, content: 'part of lib; class C {}');
 
     driver.addFile(a);
     driver.addFile(b);
@@ -2187,6 +2289,18 @@
         unorderedEquals(['foo', 'main']));
   }
 
+  test_getUnitElement_doesNotExist_afterResynthesized() async {
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+
+    newFile(a, content: r'''
+import 'package:test/b.dart';
+''');
+
+    await driver.getResolvedLibrary(a);
+    await driver.getUnitElement(b);
+  }
+
   test_getUnitElement_notAbsolutePath() async {
     try {
       await driver.getUnitElement('not_absolute.dart');
@@ -2195,17 +2309,17 @@
   }
 
   test_getUnitElement_notDart() async {
-    var path = _p('/test.txt');
-    provider.newFile(path, 'class A {}');
+    var path = convertPath('/test.txt');
+    newFile(path, content: 'class A {}');
     UnitElementResult unitResult = await driver.getUnitElement(path);
     expect(unitResult, isNotNull);
     expect(unitResult.element.types.map((e) => e.name), ['A']);
   }
 
   test_getUnitElementSignature() async {
-    var a = _p('/test/lib/a.dart');
+    var a = convertPath('/test/lib/a.dart');
 
-    provider.newFile(a, 'foo() {}');
+    newFile(a, content: 'foo() {}');
 
     String signature = await driver.getUnitElementSignature(a);
     expect(signature, isNotNull);
@@ -2214,7 +2328,7 @@
     expect(unitResult.path, a);
     expect(unitResult.signature, signature);
 
-    provider.updateFile(a, 'bar() {}');
+    modifyFile(a, 'bar() {}');
     driver.changeFile(a);
 
     String signature2 = await driver.getUnitElementSignature(a);
@@ -2235,7 +2349,7 @@
     expect(driver.hasFilesToAnalyze, isFalse);
 
     // Ask to analyze the file, so there is a file to analyze.
-    Future<AnalysisResult> future = driver.getResult(testFile);
+    Future<ResolvedUnitResult> future = driver.getResult(testFile);
     expect(driver.hasFilesToAnalyze, isTrue);
 
     // Once analysis is done, there is nothing to analyze.
@@ -2243,7 +2357,7 @@
     expect(driver.hasFilesToAnalyze, isFalse);
 
     // Change a file, even if not added, it still might affect analysis.
-    driver.changeFile(_p('/not/added.dart'));
+    driver.changeFile(convertPath('/not/added.dart'));
     expect(driver.hasFilesToAnalyze, isTrue);
     await waitForIdleWithoutExceptions();
     expect(driver.hasFilesToAnalyze, isFalse);
@@ -2254,17 +2368,17 @@
   }
 
   test_hermetic_modifyLibraryFile_resolvePart() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
 
-    provider.newFile(a, r'''
+    newFile(a, content: r'''
 library a;
 part 'b.dart';
 class C {
   int foo;
 }
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 part of a;
 var c = new C();
 ''');
@@ -2276,7 +2390,7 @@
 
     // Modify the library, but don't notify the driver.
     // The driver should use the previous library content and elements.
-    provider.newFile(a, r'''
+    newFile(a, content: r'''
 library a;
 part 'b.dart';
 class C {
@@ -2293,8 +2407,8 @@
   }
 
   test_hermetic_overlayOnly_part() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
     contentOverlay[a] = r'''
 library a;
 part 'b.dart';
@@ -2306,14 +2420,14 @@
     driver.addFile(a);
     driver.addFile(b);
 
-    AnalysisResult result = await driver.getResult(a);
+    ResolvedUnitResult result = await driver.getResult(a);
     expect(result.errors, isEmpty);
     expect(_getTopLevelVarType(result.unit, 'b'), 'B');
   }
 
   test_instantiateToBounds_invalid() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    newFile(a, content: r'''
 class A<T extends B> {}
 class B<T extends A<B>> {}
 ''');
@@ -2322,9 +2436,54 @@
     await waitForIdleWithoutExceptions();
   }
 
+  test_isLibraryByUri() async {
+    var a1 = '/aaa/lib/a1.dart';
+    var a2 = '/aaa/lib/a2.dart';
+    var b1 = '/bbb/lib/b1.dart';
+    var b2 = '/bbb/lib/b2.dart';
+
+    String a1UriStr = 'package:aaa/a1.dart';
+    String a2UriStr = 'package:aaa/a2.dart';
+    String b1UriStr = 'package:bbb/b1.dart';
+    String b2UriStr = 'package:bbb/b2.dart';
+
+    newFile(a1, content: "part 'a2.dart';");
+    newFile(a2, content: "part of 'a1.dart';");
+    newFile(b1, content: "part 'b2.dart';");
+    newFile(b2, content: "part of 'b1.dart';");
+
+    // Build the store with the library.
+    var store =
+        await createAnalysisDriver().test.getSummaryStore(convertPath(a1));
+    expect(store.unlinkedMap.keys, contains(a1UriStr));
+    expect(store.unlinkedMap.keys, contains(a2UriStr));
+    expect(store.linkedMap.keys, contains(a1UriStr));
+
+    // Remove the stored files from the file system.
+    deleteFile(a1);
+    deleteFile(a2);
+
+    // We can ask isLibraryByUri() for both external and local units.
+    AnalysisDriver driver = createAnalysisDriver(externalSummaries: store);
+    expect(driver.isLibraryByUri(Uri.parse(a1UriStr)), isTrue);
+    expect(driver.isLibraryByUri(Uri.parse(a2UriStr)), isFalse);
+    expect(driver.isLibraryByUri(Uri.parse(b1UriStr)), isTrue);
+    expect(driver.isLibraryByUri(Uri.parse(b2UriStr)), isFalse);
+  }
+
+  test_isLibraryByUri_doesNotExist() async {
+    var uri = Uri.parse('file:///test.dart');
+    expect(driver.isLibraryByUri(uri), isTrue);
+  }
+
+  test_isLibraryByUri_invalidUri() async {
+    var uri = Uri.parse('package:aaa');
+    expect(driver.isLibraryByUri(uri), isTrue);
+  }
+
   test_issue34619() async {
-    var a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    newFile(a, content: r'''
 class C {
   final Set<String> f = new Set<String>();
 
@@ -2337,7 +2496,7 @@
     await waitForIdleWithoutExceptions();
 
     // Update the file in a
-    provider.updateFile(a, r'''
+    modifyFile(a, r'''
 class C {
   final Set<String> f = a + b + c;
 
@@ -2350,15 +2509,15 @@
   }
 
   test_knownFiles() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
 
-    provider.newFile(a, r'''
+    newFile(a, content: r'''
 import 'b.dart';
 ''');
-    provider.newFile(b, '');
-    provider.newFile(c, '');
+    newFile(b);
+    newFile(c);
 
     driver.addFile(a);
     driver.addFile(c);
@@ -2378,10 +2537,10 @@
   }
 
   test_knownFiles_beforeAnalysis() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
 
-    provider.newFile(a, '');
+    newFile(a);
 
     // 'a.dart' is added, but not processed yet.
     // So, the set of known files is empty yet.
@@ -2398,7 +2557,7 @@
 
   test_missingDartLibrary_async() async {
     var asyncPath = sdk.mapDartUri('dart:async').fullName;
-    provider.getFile(asyncPath).delete();
+    getFile(asyncPath).delete();
     addTestFile('class C {}');
 
     ErrorsResult result = await driver.getErrors(testFile);
@@ -2410,7 +2569,7 @@
 
   test_missingDartLibrary_core() async {
     var corePath = sdk.mapDartUri('dart:core').fullName;
-    provider.getFile(corePath).delete();
+    getFile(corePath).delete();
     addTestFile('class C {}');
 
     ErrorsResult result = await driver.getErrors(testFile);
@@ -2428,27 +2587,27 @@
   }
 
   test_parseFile_notDart() async {
-    var p = _p('/test/bin/a.txt');
-    provider.newFile(p, 'class A {}');
+    var p = convertPath('/test/bin/a.txt');
+    newFile(p, content: 'class A {}');
 
-    ParseResult parseResult = await driver.parseFile(p);
+    ParsedUnitResult parseResult = await driver.parseFile(p);
     expect(parseResult, isNotNull);
     expect(driver.knownFiles, contains(p));
   }
 
   test_parseFile_shouldRefresh() async {
-    var p = _p('/test/bin/a.dart');
+    var p = convertPath('/test/bin/a.dart');
 
-    provider.newFile(p, 'class A {}');
+    newFile(p, content: 'class A {}');
     driver.addFile(p);
 
     // Get the result, so force the file reading.
     await driver.getResult(p);
 
     // Update the file.
-    provider.newFile(p, 'class A2 {}');
+    newFile(p, content: 'class A2 {}');
 
-    ParseResult parseResult = await driver.parseFile(p);
+    ParsedUnitResult parseResult = await driver.parseFile(p);
     var clazz = parseResult.unit.declarations[0] as ClassDeclaration;
     expect(clazz.name.name, 'A2');
   }
@@ -2461,44 +2620,44 @@
   }
 
   test_parseFileSync_notDart() {
-    var p = _p('/test/bin/a.txt');
-    provider.newFile(p, 'class A {}');
+    var p = convertPath('/test/bin/a.txt');
+    newFile(p, content: 'class A {}');
 
-    ParseResult parseResult = driver.parseFileSync(p);
+    ParsedUnitResult parseResult = driver.parseFileSync(p);
     expect(parseResult, isNotNull);
     expect(driver.knownFiles, contains(p));
   }
 
   test_parseFileSync_shouldRefresh() async {
-    var p = _p('/test/bin/a.dart');
+    var p = convertPath('/test/bin/a.dart');
 
-    provider.newFile(p, 'class A {}');
+    newFile(p, content: 'class A {}');
     driver.addFile(p);
 
     // Get the result, so force the file reading.
     await driver.getResult(p);
 
     // Update the file.
-    provider.newFile(p, 'class A2 {}');
+    newFile(p, content: 'class A2 {}');
 
-    ParseResult parseResult = driver.parseFileSync(p);
+    ParsedUnitResult parseResult = driver.parseFileSync(p);
     var clazz = parseResult.unit.declarations[0] as ClassDeclaration;
     expect(clazz.name.name, 'A2');
   }
 
   test_part_getErrors_afterLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2523,18 +2682,18 @@
   }
 
   test_part_getErrors_beforeLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2553,18 +2712,18 @@
   }
 
   test_part_getResult_afterLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2577,14 +2736,14 @@
 
     // Process a.dart so that we know that it's a library for c.dart later.
     {
-      AnalysisResult result = await driver.getResult(a);
+      ResolvedUnitResult result = await driver.getResult(a);
       expect(result.errors, isEmpty);
       expect(_getTopLevelVarType(result.unit, 'c'), 'C');
     }
 
     // Now c.dart can be resolved without errors in the context of a.dart
     {
-      AnalysisResult result = await driver.getResult(c);
+      ResolvedUnitResult result = await driver.getResult(c);
       expect(result.errors, isEmpty);
       expect(_getTopLevelVarType(result.unit, 'a'), 'A');
       expect(_getTopLevelVarType(result.unit, 'b'), 'B');
@@ -2592,18 +2751,18 @@
   }
 
   test_part_getResult_beforeLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2616,15 +2775,41 @@
 
     // b.dart will be analyzed after a.dart is analyzed.
     // So, A and B references are resolved.
-    AnalysisResult result = await driver.getResult(c);
+    ResolvedUnitResult result = await driver.getResult(c);
     expect(result.errors, isEmpty);
     expect(_getTopLevelVarType(result.unit, 'a'), 'A');
     expect(_getTopLevelVarType(result.unit, 'b'), 'B');
   }
 
+  test_part_getResult_changePart_invalidatesLibraryCycle() async {
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: r'''
+import 'dart:async';
+part 'b.dart';
+''');
+    driver.addFile(a);
+
+    // Analyze the library without the part.
+    await driver.getResult(a);
+
+    // Create the part file.
+    // This should invalidate library file state (specifically the library
+    // cycle), so that we can re-link the library, and get new dependencies.
+    newFile(b, content: r'''
+part of 'a.dart';
+Future<int> f;
+''');
+    driver.changeFile(b);
+
+    // This should not crash.
+    var result = await driver.getResult(b);
+    expect(result.errors, isEmpty);
+  }
+
   test_part_getResult_noLibrary() async {
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(c, r'''
+    var c = convertPath('/test/lib/c.dart');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2635,24 +2820,24 @@
 
     // There is no library which c.dart is a part of, so it has unresolved
     // A and B references.
-    AnalysisResult result = await driver.getResult(c);
+    ResolvedUnitResult result = await driver.getResult(c);
     expect(result.errors, isNotEmpty);
     expect(result.unit, isNotNull);
   }
 
   test_part_getUnitElement_afterLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2680,18 +2865,18 @@
   }
 
   test_part_getUnitElement_beforeLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2716,8 +2901,8 @@
   }
 
   test_part_getUnitElement_noLibrary() async {
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(c, r'''
+    var c = convertPath('/test/lib/c.dart');
+    newFile(c, content: r'''
 part of a;
 var a = new A();
 var b = new B();
@@ -2740,18 +2925,18 @@
   }
 
   test_part_getUnitElementSignature() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2774,18 +2959,18 @@
   }
 
   test_part_results_afterLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2802,38 +2987,38 @@
 
       // c.dart was added after a.dart, so it is analyzed after a.dart,
       // so we know that a.dart is the library of c.dart, so no errors.
-      AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+      ResolvedUnitResult result = allResults.lastWhere((r) => r.path == c);
       expect(result.errors, isEmpty);
       expect(result.unit, isNull);
     }
 
     // Update a.dart so that c.dart is not a part.
     {
-      provider.updateFile(a, '// does not use c.dart anymore');
+      modifyFile(a, '// does not use c.dart anymore');
       driver.changeFile(a);
       await waitForIdleWithoutExceptions();
 
       // Now c.dart does not have a library context, so A and B cannot be
       // resolved, so there are errors.
-      AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+      ResolvedUnitResult result = allResults.lastWhere((r) => r.path == c);
       expect(result.errors, isNotEmpty);
       expect(result.unit, isNull);
     }
   }
 
   test_part_results_beforeLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2851,14 +3036,14 @@
     // a.dart, but we cannot find the library for it, so we delay analysis
     // until all other files are analyzed, including a.dart, after which we
     // analyze the delayed parts.
-    AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+    ResolvedUnitResult result = allResults.lastWhere((r) => r.path == c);
     expect(result.errors, isEmpty);
     expect(result.unit, isNull);
   }
 
   test_part_results_noLibrary() async {
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(c, r'''
+    var c = convertPath('/test/lib/c.dart');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2871,24 +3056,24 @@
 
     // There is no library which c.dart is a part of, so it has unresolved
     // A and B references.
-    AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+    ResolvedUnitResult result = allResults.lastWhere((r) => r.path == c);
     expect(result.errors, isNotEmpty);
     expect(result.unit, isNull);
   }
 
   test_part_results_priority_beforeLibrary() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: r'''
 library a;
 import 'b.dart';
 part 'c.dart';
 class A {}
 var c = new C();
 ''');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, r'''
+    newFile(b, content: 'class B {}');
+    newFile(c, content: r'''
 part of a;
 class C {}
 var a = new A();
@@ -2907,19 +3092,19 @@
     // a.dart, but we cannot find the library for it, so we delay analysis
     // until all other files are analyzed, including a.dart, after which we
     // analyze the delayed parts.
-    AnalysisResult result = allResults.lastWhere((r) => r.path == c);
+    ResolvedUnitResult result = allResults.lastWhere((r) => r.path == c);
     expect(result.errors, isEmpty);
     expect(result.unit, isNotNull);
   }
 
   test_removeFile_changeFile_implicitlyAnalyzed() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: r'''
 import 'b.dart';
 var A = B;
 ''');
-    provider.newFile(b, 'var B = 1;');
+    newFile(b, content: 'var B = 1;');
 
     driver.priorityFiles = [a, b];
     driver.addFile(a);
@@ -2929,17 +3114,17 @@
     await waitForIdleWithoutExceptions();
     expect(allResults, hasLength(2));
     {
-      AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
+      ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
       expect(_getTopLevelVarType(ar.unit, 'A'), 'int');
     }
     {
-      AnalysisResult br = allResults.firstWhere((r) => r.path == b);
+      ResolvedUnitResult br = allResults.firstWhere((r) => r.path == b);
       expect(_getTopLevelVarType(br.unit, 'B'), 'int');
     }
     allResults.clear();
 
     // Remove "b" and send the change notification.
-    provider.updateFile(b, 'var B = 1.2;');
+    modifyFile(b, 'var B = 1.2;');
     driver.removeFile(b);
     driver.changeFile(b);
 
@@ -2949,7 +3134,7 @@
     await waitForIdleWithoutExceptions();
     expect(allResults, hasLength(1));
     {
-      AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
+      ResolvedUnitResult ar = allResults.firstWhere((r) => r.path == a);
       expect(_getTopLevelVarType(ar.unit, 'A'), 'double');
     }
   }
@@ -2974,11 +3159,11 @@
   }
 
   test_removeFile_invalidate_importers() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
 
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, "import 'a.dart';  var a = new A();");
+    newFile(a, content: 'class A {}');
+    newFile(b, content: "import 'a.dart';  var a = new A();");
 
     driver.addFile(a);
     driver.addFile(b);
@@ -2989,7 +3174,7 @@
     allResults.clear();
 
     // Remove a.dart, now b.dart should be reanalyzed and has an error.
-    provider.deleteFile(a);
+    deleteFile(a);
     driver.removeFile(a);
     await waitForIdleWithoutExceptions();
     expect(allResults.singleWhere((r) => r.path == b).errors, hasLength(2));
@@ -3003,27 +3188,76 @@
     } on ArgumentError {}
   }
 
+  test_resetUriResolution() async {
+    var a = convertPath('/aaa/lib/a.dart');
+    var b = convertPath('/bbb/lib/b.dart');
+
+    newFile(a, content: '');
+    newFile(b, content: r'''
+import 'package:aaa/a.dart'; // ignore: unused_import
+A a;
+''');
+
+    // Subscribe for errors.
+    driver.addFile(b);
+
+    // `package:aaa/a.dart` does not define class `A`.
+    // So, there is an error in `b.dart`.
+    await waitForIdleWithoutExceptions();
+    expect(allResults, hasLength(1));
+    expect(allResults[0].path, b);
+    expect(allResults[0].errors, hasLength(1));
+
+    // Create generated file for `package:aaa/a.dart`.
+    var aUri = Uri.parse('package:aaa/a.dart');
+    var aGeneratedPath = convertPath('/generated/aaa/lib/a2.dart');
+    var aGeneratedFile = newFile(aGeneratedPath, content: 'class A {}');
+
+    // Configure UriResolver to provide this generated file.
+    generatedUriResolver.resolveAbsoluteFunction =
+        (uri, actualUri) => aGeneratedFile.createSource(actualUri);
+    generatedUriResolver.restoreAbsoluteFunction = (source) {
+      String path = source.fullName;
+      if (path == a || path == aGeneratedPath) {
+        return aUri;
+      } else {
+        return null;
+      }
+    };
+
+    // Reset URI resolution, and analyze.
+    allResults.clear();
+    driver.resetUriResolution();
+
+    // `package:aaa/a.dart` is resolved differently now, so the new list of
+    // errors for `b.dart` (the empty list) is reported.
+    await waitForIdleWithoutExceptions();
+    expect(allResults, hasLength(1));
+    expect(allResults[0].path, b);
+    expect(allResults[0].errors, isEmpty);
+  }
+
   test_results_order() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    var d = _p('/test/lib/d.dart');
-    var e = _p('/test/lib/e.dart');
-    var f = _p('/test/lib/f.dart');
-    provider.newFile(a, r'''
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    var d = convertPath('/test/lib/d.dart');
+    var e = convertPath('/test/lib/e.dart');
+    var f = convertPath('/test/lib/f.dart');
+    newFile(a, content: r'''
 import 'd.dart';
 ''');
-    provider.newFile(b, '');
-    provider.newFile(c, r'''
+    newFile(b);
+    newFile(c, content: r'''
 import 'd.dart';
 ''');
-    provider.newFile(d, r'''
+    newFile(d, content: r'''
 import 'b.dart';
 ''');
-    provider.newFile(e, r'''
+    newFile(e, content: r'''
 export 'b.dart';
 ''');
-    provider.newFile(f, r'''
+    newFile(f, content: r'''
 import 'e.dart';
 class F extends X {}
 ''');
@@ -3043,7 +3277,7 @@
     allResults.clear();
 
     // Update a.dart with changing its API signature.
-    provider.updateFile(b, 'class A {}');
+    modifyFile(b, 'class A {}');
     driver.changeFile(b);
     await waitForIdleWithoutExceptions();
 
@@ -3060,16 +3294,16 @@
   }
 
   test_results_order_allChangedFirst_thenImports() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    var d = _p('/test/lib/d.dart');
-    var e = _p('/test/lib/e.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, '');
-    provider.newFile(d, "import 'a.dart';");
-    provider.newFile(e, "import 'b.dart';");
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    var d = convertPath('/test/lib/d.dart');
+    var e = convertPath('/test/lib/e.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
+    newFile(c);
+    newFile(d, content: "import 'a.dart';");
+    newFile(e, content: "import 'b.dart';");
 
     driver.addFile(a);
     driver.addFile(b);
@@ -3083,8 +3317,8 @@
     // Change b.dart and then a.dart files.
     // So, a.dart and b.dart should be analyzed first.
     // Then d.dart and e.dart because they import a.dart and b.dart files.
-    provider.updateFile(a, 'class A2 {}');
-    provider.updateFile(b, 'class B2 {}');
+    modifyFile(a, 'class A2 {}');
+    modifyFile(b, 'class B2 {}');
     driver.changeFile(b);
     driver.changeFile(a);
     await waitForIdleWithoutExceptions();
@@ -3107,7 +3341,7 @@
     await waitForIdleWithoutExceptions();
 
     expect(allResults, hasLength(1));
-    AnalysisResult result = allResults.single;
+    ResolvedUnitResult result = allResults.single;
     expect(result.path, testFile);
     expect(result.uri.toString(), 'package:test/test.dart');
     expect(result.content, content);
@@ -3120,12 +3354,12 @@
   }
 
   test_results_priorityFirst() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    var c = _p('/test/lib/c.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, 'class C {}');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    var c = convertPath('/test/lib/c.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
+    newFile(c, content: 'class C {}');
 
     driver.addFile(a);
     driver.addFile(b);
@@ -3134,7 +3368,7 @@
     await waitForIdleWithoutExceptions();
 
     expect(allResults, hasLength(3));
-    AnalysisResult result = allResults[0];
+    ResolvedUnitResult result = allResults[0];
     expect(result.path, b);
     expect(result.unit, isNotNull);
     expect(result.errors, hasLength(0));
@@ -3146,7 +3380,7 @@
     await waitForIdleWithoutExceptions();
 
     expect(allResults, hasLength(1));
-    AnalysisResult result = allResults.single;
+    ResolvedUnitResult result = allResults.single;
     expect(result.path, testFile);
     expect(result.uri.toString(), 'package:test/test.dart');
     expect(result.content, isNull);
@@ -3154,11 +3388,33 @@
     expect(result.errors, hasLength(0));
   }
 
+  test_results_removeFile_changeFile() async {
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+
+    newFile(a, content: r'''
+var v = 0;
+''');
+    driver.addFile(a);
+
+    await waitForIdleWithoutExceptions();
+    expect(allResults.singleWhere((r) => r.path == a).errors, hasLength(0));
+    allResults.clear();
+
+    newFile(a, content: r'''
+var v = 0
+''');
+    driver.removeFile(b);
+    driver.changeFile(a);
+    await waitForIdleWithoutExceptions();
+    expect(allResults.singleWhere((r) => r.path == a).errors, hasLength(1));
+  }
+
   test_results_skipNotAffected() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
 
     driver.addFile(a);
     driver.addFile(b);
@@ -3168,7 +3424,7 @@
     allResults.clear();
 
     // Update a.dart and notify.
-    provider.updateFile(a, 'class A2 {}');
+    modifyFile(a, 'class A2 {}');
     driver.changeFile(a);
 
     // Only result for a.dart should be produced, b.dart is not affected.
@@ -3323,11 +3579,6 @@
         .type
         .toString();
   }
-
-  /**
-   * Return the [provider] specific path for the given Posix [path].
-   */
-  String _p(String path) => provider.convertPath(path);
 }
 
 @reflectiveTest
@@ -3335,31 +3586,31 @@
   bool get disableChangesAndCacheAllResults => true;
 
   test_addFile() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
     driver.addFile(a);
     driver.addFile(b);
   }
 
   test_changeFile() async {
-    var path = _p('/test.dart');
+    var path = convertPath('/test.dart');
     expect(() {
       driver.changeFile(path);
     }, throwsStateError);
   }
 
   test_getResult_libraryUnits() async {
-    var lib = _p('/lib.dart');
-    var part1 = _p('/part1.dart');
-    var part2 = _p('/part2.dart');
+    var lib = convertPath('/lib.dart');
+    var part1 = convertPath('/part1.dart');
+    var part2 = convertPath('/part2.dart');
 
-    provider.newFile(lib, r'''
+    newFile(lib, content: r'''
 library test;
 part 'part1.dart';
 part 'part2.dart';
 ''');
-    provider.newFile(part1, 'part of test; class A {}');
-    provider.newFile(part2, 'part of test; class B {}');
+    newFile(part1, content: 'part of test; class A {}');
+    newFile(part2, content: 'part of test; class B {}');
 
     driver.addFile(lib);
     driver.addFile(part1);
@@ -3368,9 +3619,9 @@
     // No analyzed libraries initially.
     expect(driver.test.numOfAnalyzedLibraries, 0);
 
-    AnalysisResult libResult = await driver.getResult(lib);
-    AnalysisResult partResult1 = await driver.getResult(part1);
-    AnalysisResult partResult2 = await driver.getResult(part2);
+    ResolvedUnitResult libResult = await driver.getResult(lib);
+    ResolvedUnitResult partResult1 = await driver.getResult(part1);
+    ResolvedUnitResult partResult2 = await driver.getResult(part2);
 
     // Just one library was analyzed, results for parts are cached.
     expect(driver.test.numOfAnalyzedLibraries, 1);
@@ -3392,11 +3643,11 @@
   }
 
   test_getResult_singleFile() async {
-    var path = _p('/test.dart');
-    provider.newFile(path, 'main() {}');
+    var path = convertPath('/test.dart');
+    newFile(path, content: 'main() {}');
     driver.addFile(path);
 
-    AnalysisResult result1 = await driver.getResult(path);
+    ResolvedUnitResult result1 = await driver.getResult(path);
     expect(driver.test.numOfAnalyzedLibraries, 1);
     var unit1 = result1.unit;
     var unitElement1 = unit1.declaredElement;
@@ -3404,7 +3655,7 @@
     expect(unit1, isNotNull);
     expect(unitElement1, isNotNull);
 
-    AnalysisResult result2 = await driver.getResult(path);
+    ResolvedUnitResult result2 = await driver.getResult(path);
     expect(driver.test.numOfAnalyzedLibraries, 1);
     expect(result2.path, path);
     expect(result2.unit, same(unit1));
@@ -3412,13 +3663,11 @@
   }
 
   test_removeFile() async {
-    var path = _p('/test.dart');
+    var path = convertPath('/test.dart');
     expect(() {
       driver.removeFile(path);
     }, throwsStateError);
   }
-
-  String _p(String path) => provider.convertPath(path);
 }
 
 class _SourceMock implements Source {
diff --git a/pkg/analyzer/test/src/dart/analysis/experiments_test.dart b/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
new file mode 100644
index 0000000..aa83160
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/analysis/experiments_test.dart
@@ -0,0 +1,226 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/analysis/experiments_impl.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExperimentsTest);
+  });
+}
+
+@reflectiveTest
+class ExperimentsTest {
+  var knownFeatures = <String, ExperimentalFeature>{};
+
+  ExperimentStatus fromStrings(List<String> flags) {
+    return overrideKnownFeatures(
+        knownFeatures, () => ExperimentStatus.fromStrings(flags));
+  }
+
+  List<bool> getFlags(ExperimentStatus status) {
+    return getExperimentalFlags_forTesting(status);
+  }
+
+  List<ConflictingFlagLists> getValidateCombinationResult(
+      List<String> flags1, List<String> flags2) {
+    return overrideKnownFeatures(
+        knownFeatures, () => validateFlagCombination(flags1, flags2).toList());
+  }
+
+  List<ValidationResult> getValidationResult(List<String> flags) {
+    return overrideKnownFeatures(
+        knownFeatures, () => validateFlags(flags).toList());
+  }
+
+  test_fromStrings_conflicting_flags_disable_then_enable() {
+    // Enable takes precedence because it's last
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    expect(getFlags(fromStrings(['no-a', 'a'])), [true]);
+  }
+
+  test_fromStrings_conflicting_flags_enable_then_disable() {
+    // Disable takes precedence because it's last
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    expect(getFlags(fromStrings(['a', 'no-a'])), [false]);
+  }
+
+  test_fromStrings_default_values() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    knownFeatures['b'] = ExperimentalFeature(1, 'b', true, false, 'b');
+    expect(getFlags(fromStrings([])), [false, true]);
+  }
+
+  test_fromStrings_disable_disabled_feature() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    expect(getFlags(fromStrings(['no-a'])), [false]);
+  }
+
+  test_fromStrings_disable_enabled_feature() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', true, false, 'a');
+    expect(getFlags(fromStrings(['no-a'])), [false]);
+  }
+
+  test_fromStrings_enable_disabled_feature() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    expect(getFlags(fromStrings(['a'])), [true]);
+  }
+
+  test_fromStrings_enable_enabled_feature() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', true, false, 'a');
+    expect(getFlags(fromStrings(['a'])), [true]);
+  }
+
+  test_fromStrings_illegal_use_of_expired_flag_disable() {
+    // Expired flags are ignored even if they would fail validation.
+    knownFeatures['a'] = ExperimentalFeature(null, 'a', true, true, 'a');
+    expect(getFlags(fromStrings(['no-a'])), []);
+  }
+
+  test_fromStrings_illegal_use_of_expired_flag_enable() {
+    // Expired flags are ignored even if they would fail validation.
+    knownFeatures['a'] = ExperimentalFeature(null, 'a', false, true, 'a');
+    expect(getFlags(fromStrings(['a'])), []);
+  }
+
+  test_fromStrings_unnecessary_use_of_expired_flag_disable() {
+    // Expired flags are ignored.
+    knownFeatures['a'] = ExperimentalFeature(null, 'a', false, true, 'a');
+    expect(getFlags(fromStrings(['no-a'])), []);
+  }
+
+  test_fromStrings_unnecessary_use_of_expired_flag_enable() {
+    // Expired flags are ignored.
+    knownFeatures['a'] = ExperimentalFeature(null, 'a', true, true, 'a');
+    expect(getFlags(fromStrings(['a'])), []);
+  }
+
+  test_fromStrings_unrecognized_flag() {
+    // Unrecognized flags are ignored.
+    expect(getFlags(fromStrings(['a'])), []);
+  }
+
+  test_validateFlagCombination_disable_then_enable() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    knownFeatures['b'] = ExperimentalFeature(1, 'b', false, false, 'b');
+    knownFeatures['c'] = ExperimentalFeature(2, 'c', false, false, 'c');
+    var validationResult =
+        getValidateCombinationResult(['a', 'no-c'], ['no-b', 'c']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0];
+    expect(error.feature, knownFeatures['c']);
+    expect(error.firstValue, false);
+  }
+
+  test_validateFlagCombination_enable_then_disable() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    knownFeatures['b'] = ExperimentalFeature(1, 'b', false, false, 'b');
+    knownFeatures['c'] = ExperimentalFeature(2, 'c', false, false, 'c');
+    var validationResult =
+        getValidateCombinationResult(['a', 'c'], ['no-b', 'no-c']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0];
+    expect(error.feature, knownFeatures['c']);
+    expect(error.firstValue, true);
+  }
+
+  test_validateFlagCombination_ok() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    knownFeatures['b'] = ExperimentalFeature(1, 'b', false, false, 'b');
+    knownFeatures['c'] = ExperimentalFeature(2, 'c', false, false, 'c');
+    expect(getValidateCombinationResult(['a', 'c'], ['no-b', 'c']), isEmpty);
+  }
+
+  test_validateFlags_conflicting_flags_disable_then_enable() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    var validationResult = getValidationResult(['no-a', 'a']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0] as ConflictingFlags;
+    expect(error.stringIndex, 1);
+    expect(error.flag, 'a');
+    expect(error.isError, true);
+    expect(error.feature, knownFeatures['a']);
+    expect(error.previousStringIndex, 0);
+    expect(error.requestedValue, true);
+  }
+
+  test_validateFlags_conflicting_flags_enable_then_disable() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    var validationResult = getValidationResult(['a', 'no-a']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0] as ConflictingFlags;
+    expect(error.stringIndex, 1);
+    expect(error.flag, 'no-a');
+    expect(error.isError, true);
+    expect(error.feature, knownFeatures['a']);
+    expect(error.previousStringIndex, 0);
+    expect(error.requestedValue, false);
+  }
+
+  test_validateFlags_ignore_redundant_disable_flags() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', true, false, 'a');
+    expect(getValidationResult(['no-a', 'no-a']), isEmpty);
+  }
+
+  test_validateFlags_ignore_redundant_enable_flags() {
+    knownFeatures['a'] = ExperimentalFeature(0, 'a', false, false, 'a');
+    expect(getValidationResult(['a', 'a']), isEmpty);
+  }
+
+  test_validateFlags_illegal_use_of_expired_flag_disable() {
+    knownFeatures['a'] = ExperimentalFeature(null, 'a', true, true, 'a');
+    var validationResult = getValidationResult(['no-a']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0] as IllegalUseOfExpiredFlag;
+    expect(error.stringIndex, 0);
+    expect(error.flag, 'no-a');
+    expect(error.isError, true);
+    expect(error.feature, knownFeatures['a']);
+  }
+
+  test_validateFlags_illegal_use_of_expired_flag_enable() {
+    knownFeatures['a'] = ExperimentalFeature(null, 'a', false, true, 'a');
+    var validationResult = getValidationResult(['a']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0] as IllegalUseOfExpiredFlag;
+    expect(error.stringIndex, 0);
+    expect(error.flag, 'a');
+    expect(error.isError, true);
+    expect(error.feature, knownFeatures['a']);
+  }
+
+  test_validateFlags_unnecessary_use_of_expired_flag_disable() {
+    knownFeatures['a'] = ExperimentalFeature(null, 'a', false, true, 'a');
+    var validationResult = getValidationResult(['no-a']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0] as UnnecessaryUseOfExpiredFlag;
+    expect(error.stringIndex, 0);
+    expect(error.flag, 'no-a');
+    expect(error.isError, false);
+    expect(error.feature, knownFeatures['a']);
+  }
+
+  test_validateFlags_unnecessary_use_of_expired_flag_enable() {
+    knownFeatures['a'] = ExperimentalFeature(null, 'a', true, true, 'a');
+    var validationResult = getValidationResult(['a']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0] as UnnecessaryUseOfExpiredFlag;
+    expect(error.stringIndex, 0);
+    expect(error.flag, 'a');
+    expect(error.isError, false);
+    expect(error.feature, knownFeatures['a']);
+  }
+
+  test_validateFlags_unrecognized_flag() {
+    var validationResult = getValidationResult(['a']);
+    expect(validationResult, hasLength(1));
+    var error = validationResult[0] as UnrecognizedFlag;
+    expect(error.stringIndex, 0);
+    expect(error.flag, 'a');
+    expect(error.isError, true);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 091ec5c..119f2b3 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -6,23 +6,23 @@
 import 'dart:typed_data';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/library_graph.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisOptions, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:convert/convert.dart';
 import 'package:crypto/crypto.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../context/mock_sdk.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FileSystemStateTest);
@@ -30,8 +30,7 @@
 }
 
 @reflectiveTest
-class FileSystemStateTest {
-  final MemoryResourceProvider provider = new MemoryResourceProvider();
+class FileSystemStateTest with ResourceProviderMixin {
   MockSdk sdk;
 
   final ByteStore byteStore = new MemoryByteStore();
@@ -47,22 +46,22 @@
 
   void setUp() {
     logger = new PerformanceLog(logBuffer);
-    sdk = new MockSdk(resourceProvider: provider);
+    sdk = new MockSdk(resourceProvider: resourceProvider);
     sourceFactory = new SourceFactory([
       new DartUriResolver(sdk),
       generatedUriResolver,
-      new PackageMapUriResolver(provider, <String, List<Folder>>{
-        'aaa': [provider.getFolder(_p('/aaa/lib'))],
-        'bbb': [provider.getFolder(_p('/bbb/lib'))],
+      new PackageMapUriResolver(resourceProvider, <String, List<Folder>>{
+        'aaa': [getFolder('/aaa/lib')],
+        'bbb': [getFolder('/bbb/lib')],
       }),
-      new ResourceUriResolver(provider)
-    ], null, provider);
+      new ResourceUriResolver(resourceProvider)
+    ], null, resourceProvider);
     AnalysisOptions analysisOptions = new AnalysisOptionsImpl();
     fileSystemState = new FileSystemState(
         logger,
         byteStore,
         contentOverlay,
-        provider,
+        resourceProvider,
         sourceFactory,
         analysisOptions,
         new Uint32List(0),
@@ -70,8 +69,8 @@
   }
 
   test_definedClassMemberNames() {
-    String path = _p('/aaa/lib/a.dart');
-    provider.newFile(path, r'''
+    String path = convertPath('/aaa/lib/a.dart');
+    newFile(path, content: r'''
 class A {
   int a, b;
   A();
@@ -90,8 +89,8 @@
   }
 
   test_definedTopLevelNames() {
-    String path = _p('/aaa/lib/a.dart');
-    provider.newFile(path, r'''
+    String path = convertPath('/aaa/lib/a.dart');
+    newFile(path, content: r'''
 class A {}
 class B = Object with A;
 typedef C();
@@ -106,18 +105,18 @@
   }
 
   test_exportedTopLevelDeclarations_cycle() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    String c = _p('/aaa/lib/c.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    String c = convertPath('/aaa/lib/c.dart');
+    newFile(a, content: r'''
 export 'b.dart';
 class A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'c.dart';
 class B {}
 ''');
-    provider.newFile(c, r'''
+    newFile(c, content: r'''
 export 'a.dart';
 class C {}
 ''');
@@ -130,24 +129,24 @@
   }
 
   test_exportedTopLevelDeclarations_cycle_anotherOutsideCycle() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    String c = _p('/aaa/lib/c.dart');
-    String d = _p('/aaa/lib/d.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    String c = convertPath('/aaa/lib/c.dart');
+    String d = convertPath('/aaa/lib/d.dart');
+    newFile(a, content: r'''
 export 'b.dart';
 class A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'c.dart';
 class B {}
 ''');
-    provider.newFile(c, r'''
+    newFile(c, content: r'''
 export 'b.dart';
 export 'd.dart';
 class C {}
 ''');
-    provider.newFile(d, r'''
+    newFile(d, content: r'''
 class D {}
 ''');
     _assertExportedTopLevelDeclarations(a, ['A', 'B', 'C', 'D']);
@@ -159,28 +158,28 @@
   }
 
   test_exportedTopLevelDeclarations_cycle_onSequence() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    String c = _p('/aaa/lib/c.dart');
-    String d = _p('/aaa/lib/d.dart');
-    String e = _p('/aaa/lib/e.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    String c = convertPath('/aaa/lib/c.dart');
+    String d = convertPath('/aaa/lib/d.dart');
+    String e = convertPath('/aaa/lib/e.dart');
+    newFile(a, content: r'''
 export 'b.dart';
 class A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'c.dart';
 class B {}
 ''');
-    provider.newFile(c, r'''
+    newFile(c, content: r'''
 export 'd.dart';
 class C {}
 ''');
-    provider.newFile(d, r'''
+    newFile(d, content: r'''
 export 'e.dart';
 class D {}
 ''');
-    provider.newFile(e, r'''
+    newFile(e, content: r'''
 export 'c.dart';
 class E {}
 ''');
@@ -197,12 +196,12 @@
   }
 
   test_exportedTopLevelDeclarations_export() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    newFile(a, content: r'''
 class A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'a.dart';
 class B {}
 ''');
@@ -211,20 +210,20 @@
   }
 
   test_exportedTopLevelDeclarations_export2_show() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    String c = _p('/aaa/lib/c.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    String c = convertPath('/aaa/lib/c.dart');
+    newFile(a, content: r'''
 class A1 {}
 class A2 {}
 class A3 {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'a.dart' show A1, A2;
 class B1 {}
 class B2 {}
 ''');
-    provider.newFile(c, r'''
+    newFile(c, content: r'''
 export 'b.dart' show A2, A3, B1;
 class C {}
 ''');
@@ -233,12 +232,12 @@
   }
 
   test_exportedTopLevelDeclarations_export_flushOnChange() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    newFile(a, content: r'''
 class A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'a.dart';
 class B {}
 ''');
@@ -247,20 +246,20 @@
     _assertExportedTopLevelDeclarations(b, ['A', 'B']);
 
     // Update a.dart, so a.dart and b.dart exported declarations are flushed.
-    provider.newFile(a, 'class A {} class A2 {}');
+    newFile(a, content: 'class A {} class A2 {}');
     fileSystemState.getFileForPath(a).refresh();
     _assertExportedTopLevelDeclarations(b, ['A', 'A2', 'B']);
   }
 
   test_exportedTopLevelDeclarations_export_hide() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    newFile(a, content: r'''
 class A1 {}
 class A2 {}
 class A3 {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'a.dart' hide A2;
 class B {}
 ''');
@@ -268,12 +267,12 @@
   }
 
   test_exportedTopLevelDeclarations_export_preferLocal() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    newFile(a, content: r'''
 class V {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'a.dart';
 int V;
 ''');
@@ -285,13 +284,13 @@
   }
 
   test_exportedTopLevelDeclarations_export_show() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    newFile(a, content: r'''
 class A1 {}
 class A2 {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'a.dart' show A2;
 class B {}
 ''');
@@ -299,21 +298,21 @@
   }
 
   test_exportedTopLevelDeclarations_export_show2() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    String c = _p('/aaa/lib/c.dart');
-    String d = _p('/aaa/lib/d.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    String c = convertPath('/aaa/lib/c.dart');
+    String d = convertPath('/aaa/lib/d.dart');
+    newFile(a, content: r'''
 export 'b.dart' show Foo;
 export 'c.dart' show Bar;
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 export 'd.dart';
 ''');
-    provider.newFile(c, r'''
+    newFile(c, content: r'''
 export 'd.dart';
 ''');
-    provider.newFile(d, r'''
+    newFile(d, content: r'''
 class Foo {}
 class Bar {}
 ''');
@@ -321,12 +320,12 @@
   }
 
   test_exportedTopLevelDeclarations_import() {
-    String a = _p('/aaa/lib/a.dart');
-    String b = _p('/aaa/lib/b.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String b = convertPath('/aaa/lib/b.dart');
+    newFile(a, content: r'''
 class A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 import 'a.dart';
 class B {}
 ''');
@@ -334,14 +333,14 @@
   }
 
   test_exportedTopLevelDeclarations_parts() {
-    String a = _p('/aaa/lib/a.dart');
-    String a2 = _p('/aaa/lib/a2.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/aaa/lib/a.dart');
+    String a2 = convertPath('/aaa/lib/a2.dart');
+    newFile(a, content: r'''
 library lib;
 part 'a2.dart';
 class A1 {}
 ''');
-    provider.newFile(a2, r'''
+    newFile(a2, content: r'''
 part of lib;
 class A2 {}
 ''');
@@ -349,7 +348,7 @@
   }
 
   test_getFileForPath_doesNotExist() {
-    String path = _p('/aaa/lib/a.dart');
+    String path = convertPath('/aaa/lib/a.dart');
     FileState file = fileSystemState.getFileForPath(path);
     expect(file.path, path);
     expect(file.uri, Uri.parse('package:aaa/a.dart'));
@@ -367,8 +366,8 @@
   }
 
   test_getFileForPath_emptyUri() {
-    String path = _p('/test.dart');
-    provider.newFile(path, r'''
+    String path = convertPath('/test.dart');
+    newFile(path, content: r'''
 import '';
 export '';
 part '';
@@ -381,8 +380,8 @@
   }
 
   test_getFileForPath_hasLibraryDirective_hasPartOfDirective() {
-    String a = _p('/test/lib/a.dart');
-    provider.newFile(a, r'''
+    String a = convertPath('/test/lib/a.dart');
+    newFile(a, content: r'''
 library L;
 part of L;
 ''');
@@ -391,10 +390,10 @@
   }
 
   test_getFileForPath_invalidUri() {
-    String a = _p('/aaa/lib/a.dart');
-    String a1 = _p('/aaa/lib/a1.dart');
-    String a2 = _p('/aaa/lib/a2.dart');
-    String a3 = _p('/aaa/lib/a3.dart');
+    String a = convertPath('/aaa/lib/a.dart');
+    String a1 = convertPath('/aaa/lib/a1.dart');
+    String a2 = convertPath('/aaa/lib/a2.dart');
+    String a3 = convertPath('/aaa/lib/a3.dart');
     String content_a1 = r'''
 import 'package:aaa/a1.dart';
 import ':[invalid uri]';
@@ -405,7 +404,7 @@
 part 'a3.dart';
 part ':[invalid uri]';
 ''';
-    provider.newFile(a, content_a1);
+    newFile(a, content: content_a1);
 
     FileState file = fileSystemState.getFileForPath(a);
 
@@ -429,12 +428,12 @@
   }
 
   test_getFileForPath_library() {
-    String a1 = _p('/aaa/lib/a1.dart');
-    String a2 = _p('/aaa/lib/a2.dart');
-    String a3 = _p('/aaa/lib/a3.dart');
-    String a4 = _p('/aaa/lib/a4.dart');
-    String b1 = _p('/bbb/lib/b1.dart');
-    String b2 = _p('/bbb/lib/b2.dart');
+    String a1 = convertPath('/aaa/lib/a1.dart');
+    String a2 = convertPath('/aaa/lib/a2.dart');
+    String a3 = convertPath('/aaa/lib/a3.dart');
+    String a4 = convertPath('/aaa/lib/a4.dart');
+    String b1 = convertPath('/bbb/lib/b1.dart');
+    String b2 = convertPath('/bbb/lib/b2.dart');
     String content_a1 = r'''
 import 'package:aaa/a2.dart';
 import 'package:bbb/b1.dart';
@@ -444,7 +443,7 @@
 
 class A1 {}
 ''';
-    provider.newFile(a1, content_a1);
+    newFile(a1, content: content_a1);
 
     FileState file = fileSystemState.getFileForPath(a1);
     expect(file.path, a1);
@@ -485,12 +484,12 @@
   }
 
   test_getFileForPath_onlyDartFiles() {
-    String not_dart = _p('/test/lib/not_dart.txt');
-    String a = _p('/test/lib/a.dart');
-    String b = _p('/test/lib/b.dart');
-    String c = _p('/test/lib/c.dart');
-    String d = _p('/test/lib/d.dart');
-    provider.newFile(a, r'''
+    String not_dart = convertPath('/test/lib/not_dart.txt');
+    String a = convertPath('/test/lib/a.dart');
+    String b = convertPath('/test/lib/b.dart');
+    String c = convertPath('/test/lib/c.dart');
+    String d = convertPath('/test/lib/d.dart');
+    newFile(a, content: r'''
 library lib;
 import 'dart:math';
 import 'b.dart';
@@ -511,13 +510,13 @@
   }
 
   test_getFileForPath_part() {
-    String a1 = _p('/aaa/lib/a1.dart');
-    String a2 = _p('/aaa/lib/a2.dart');
-    provider.newFile(a1, r'''
+    String a1 = convertPath('/aaa/lib/a1.dart');
+    String a2 = convertPath('/aaa/lib/a2.dart');
+    newFile(a1, content: r'''
 library a1;
 part 'a2.dart';
 ''');
-    provider.newFile(a2, r'''
+    newFile(a2, content: r'''
 part of a1;
 class A2 {}
 ''');
@@ -552,7 +551,7 @@
     // Now update the library, and refresh its file.
     // The 'a2.dart' is not referenced anymore.
     // So the part file does not have the library anymore.
-    provider.newFile(a1, r'''
+    newFile(a1, content: r'''
 library a1;
 part 'not-a2.dart';
 ''');
@@ -561,16 +560,25 @@
   }
 
   test_getFileForPath_samePath() {
-    String path = _p('/aaa/lib/a.dart');
+    String path = convertPath('/aaa/lib/a.dart');
     FileState file1 = fileSystemState.getFileForPath(path);
     FileState file2 = fileSystemState.getFileForPath(path);
     expect(file2, same(file1));
   }
 
+  test_getFileForUri_invalidUri() {
+    var uri = Uri.parse('package:x');
+    var file = fileSystemState.getFileForUri(uri);
+    expect(file.isUnresolved, isTrue);
+    expect(file.uri, isNull);
+    expect(file.path, isNull);
+    expect(file.isPart, isFalse);
+  }
+
   test_getFileForUri_packageVsFileUri() {
-    String path = _p('/aaa/lib/a.dart');
+    String path = convertPath('/aaa/lib/a.dart');
     var packageUri = Uri.parse('package:aaa/a.dart');
-    var fileUri = provider.pathContext.toUri(path);
+    var fileUri = toUri(path);
 
     // The files with `package:` and `file:` URIs are different.
     FileState filePackageUri = fileSystemState.getFileForUri(packageUri);
@@ -589,14 +597,14 @@
   }
 
   test_getFilesSubtypingName() {
-    String a = _p('/a.dart');
-    String b = _p('/b.dart');
+    String a = convertPath('/a.dart');
+    String b = convertPath('/b.dart');
 
-    provider.newFile(a, r'''
+    newFile(a, content: r'''
 class A {}
 class B extends A {}
 ''');
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 class A {}
 class D implements A {}
 ''');
@@ -610,7 +618,7 @@
     );
 
     // Change b.dart so that it does not subtype A.
-    provider.newFile(b, r'''
+    newFile(b, content: r'''
 class C {}
 class D implements C {}
 ''');
@@ -627,8 +635,8 @@
 
   test_hasUri() {
     Uri uri = Uri.parse('package:aaa/foo.dart');
-    String templatePath = _p('/aaa/lib/foo.dart');
-    String generatedPath = _p('/generated/aaa/lib/foo.dart');
+    String templatePath = convertPath('/aaa/lib/foo.dart');
+    String generatedPath = convertPath('/generated/aaa/lib/foo.dart');
 
     Source generatedSource = new _SourceMock(generatedPath, uri);
 
@@ -639,9 +647,87 @@
     expect(fileSystemState.hasUri(generatedPath), isTrue);
   }
 
+  test_libraryCycle() {
+    String pa = convertPath('/aaa/lib/a.dart');
+    String pb = convertPath('/aaa/lib/b.dart');
+    String pc = convertPath('/aaa/lib/c.dart');
+    String pd = convertPath('/aaa/lib/d.dart');
+
+    FileState fa = fileSystemState.getFileForPath(pa);
+    FileState fb = fileSystemState.getFileForPath(pb);
+    FileState fc = fileSystemState.getFileForPath(pc);
+    FileState fd = fileSystemState.getFileForPath(pd);
+
+    // Compute library cycles for all files.
+    fa.libraryCycle;
+    fb.libraryCycle;
+    fc.libraryCycle;
+    fd.libraryCycle;
+    _assertFilesWithoutLibraryCycle([]);
+
+    // No imports, so just a single file.
+    newFile(pa);
+    _assertLibraryCycle(fa, [fa], []);
+
+    // Import b.dart into a.dart, two files now.
+    newFile(pa, content: "import 'b.dart';");
+    fa.refresh();
+    _assertFilesWithoutLibraryCycle([fa]);
+    _assertLibraryCycle(fa, [fa], [fb.libraryCycle]);
+
+    // Update b.dart so that it imports c.dart now.
+    newFile(pb, content: "import 'c.dart';");
+    fb.refresh();
+    _assertFilesWithoutLibraryCycle([fa, fb]);
+    _assertLibraryCycle(fa, [fa], [fb.libraryCycle]);
+    _assertLibraryCycle(fb, [fb], [fc.libraryCycle]);
+    _assertFilesWithoutLibraryCycle([]);
+
+    // Update b.dart so that it exports d.dart instead.
+    newFile(pb, content: "export 'd.dart';");
+    fb.refresh();
+    _assertFilesWithoutLibraryCycle([fa, fb]);
+    _assertLibraryCycle(fa, [fa], [fb.libraryCycle]);
+    _assertLibraryCycle(fb, [fb], [fd.libraryCycle]);
+    _assertFilesWithoutLibraryCycle([]);
+
+    // Update a.dart so that it does not import b.dart anymore.
+    newFile(pa);
+    fa.refresh();
+    _assertFilesWithoutLibraryCycle([fa]);
+    _assertLibraryCycle(fa, [fa], []);
+  }
+
+  test_libraryCycle_cycle() {
+    String pa = convertPath('/aaa/lib/a.dart');
+    String pb = convertPath('/aaa/lib/b.dart');
+
+    newFile(pa, content: "import 'b.dart';");
+    newFile(pb, content: "import 'a.dart';");
+
+    FileState fa = fileSystemState.getFileForPath(pa);
+    FileState fb = fileSystemState.getFileForPath(pb);
+
+    // Compute library cycles for all files.
+    fa.libraryCycle;
+    fb.libraryCycle;
+    _assertFilesWithoutLibraryCycle([]);
+
+    // It's a cycle.
+    _assertLibraryCycle(fa, [fa, fb], []);
+    _assertLibraryCycle(fb, [fa, fb], []);
+
+    // Update a.dart so that it does not import b.dart anymore.
+    newFile(pa);
+    fa.refresh();
+    _assertFilesWithoutLibraryCycle([fa, fb]);
+    _assertLibraryCycle(fa, [fa], []);
+    _assertLibraryCycle(fb, [fb], [fa.libraryCycle]);
+  }
+
   test_referencedNames() {
-    String path = _p('/aaa/lib/a.dart');
-    provider.newFile(path, r'''
+    String path = convertPath('/aaa/lib/a.dart');
+    newFile(path, content: r'''
 A foo(B p) {
   foo(null);
   C c = new C(p);
@@ -653,8 +739,8 @@
   }
 
   test_refresh_differentApiSignature() {
-    String path = _p('/aaa/lib/a.dart');
-    provider.newFile(path, r'''
+    String path = convertPath('/aaa/lib/a.dart');
+    newFile(path, content: r'''
 class A {}
 ''');
     FileState file = fileSystemState.getFileForPath(path);
@@ -662,7 +748,7 @@
     List<int> signature = file.apiSignature;
 
     // Update the resource and refresh the file state.
-    provider.newFile(path, r'''
+    newFile(path, content: r'''
 class B {}
 ''');
     bool apiSignatureChanged = file.refresh();
@@ -673,8 +759,8 @@
   }
 
   test_refresh_sameApiSignature() {
-    String path = _p('/aaa/lib/a.dart');
-    provider.newFile(path, r'''
+    String path = convertPath('/aaa/lib/a.dart');
+    newFile(path, content: r'''
 class C {
   foo() {
     print(111);
@@ -685,7 +771,7 @@
     List<int> signature = file.apiSignature;
 
     // Update the resource and refresh the file state.
-    provider.newFile(path, r'''
+    newFile(path, content: r'''
 class C {
   foo() {
     print(222);
@@ -699,8 +785,8 @@
   }
 
   test_store_zeroLengthUnlinked() {
-    String path = _p('/test.dart');
-    provider.newFile(path, 'class A {}');
+    String path = convertPath('/test.dart');
+    newFile(path, content: 'class A {}');
 
     // Get the file, prepare unlinked.
     FileState file = fileSystemState.getFileForPath(path);
@@ -715,8 +801,8 @@
   }
 
   test_subtypedNames() {
-    String path = _p('/test.dart');
-    provider.newFile(path, r'''
+    String path = convertPath('/test.dart');
+    newFile(path, content: r'''
 class X extends A {}
 class Y extends A with B {}
 class Z implements C, D {}
@@ -726,8 +812,8 @@
   }
 
   test_topLevelDeclarations() {
-    String path = _p('/aaa/lib/a.dart');
-    provider.newFile(path, r'''
+    String path = convertPath('/aaa/lib/a.dart');
+    newFile(path, content: r'''
 class C {}
 typedef F();
 enum E {E1, E2}
@@ -766,95 +852,16 @@
     assertHas('V4', TopLevelDeclarationKind.variable);
   }
 
-  test_transitiveFiles() {
-    String pa = _p('/aaa/lib/a.dart');
-    String pb = _p('/aaa/lib/b.dart');
-    String pc = _p('/aaa/lib/c.dart');
-    String pd = _p('/aaa/lib/d.dart');
-
-    FileState fa = fileSystemState.getFileForPath(pa);
-    FileState fb = fileSystemState.getFileForPath(pb);
-    FileState fc = fileSystemState.getFileForPath(pc);
-    FileState fd = fileSystemState.getFileForPath(pd);
-
-    // Compute transitive closures for all files.
-    fa.transitiveFiles;
-    fb.transitiveFiles;
-    fc.transitiveFiles;
-    fd.transitiveFiles;
-    expect(
-        _excludeSdk(fileSystemState.test.filesWithoutTransitiveFiles), isEmpty);
-
-    // No imports, so just a single file.
-    provider.newFile(pa, "");
-    _assertTransitiveFiles(fa, [fa]);
-
-    // Import b.dart into a.dart, two files now.
-    provider.newFile(pa, "import 'b.dart';");
-    fa.refresh();
-    _assertFilesWithoutTransitiveFiles([fa]);
-    _assertTransitiveFiles(fa, [fa, fb]);
-
-    // Update b.dart so that it imports c.dart now.
-    provider.newFile(pb, "import 'c.dart';");
-    fb.refresh();
-    _assertFilesWithoutTransitiveFiles([fa, fb]);
-    _assertTransitiveFiles(fa, [fa, fb, fc]);
-    _assertTransitiveFiles(fb, [fb, fc]);
-    _assertFilesWithoutTransitiveFiles([]);
-
-    // Update b.dart so that it exports d.dart instead.
-    provider.newFile(pb, "export 'd.dart';");
-    fb.refresh();
-    _assertFilesWithoutTransitiveFiles([fa, fb]);
-    _assertTransitiveFiles(fa, [fa, fb, fd]);
-    _assertTransitiveFiles(fb, [fb, fd]);
-    _assertFilesWithoutTransitiveFiles([]);
-
-    // Update a.dart so that it does not import b.dart anymore.
-    provider.newFile(pa, "");
-    fa.refresh();
-    _assertFilesWithoutTransitiveFiles([fa]);
-    _assertTransitiveFiles(fa, [fa]);
-  }
-
-  test_transitiveFiles_cycle() {
-    String pa = _p('/aaa/lib/a.dart');
-    String pb = _p('/aaa/lib/b.dart');
-
-    provider.newFile(pa, "import 'b.dart';");
-    provider.newFile(pb, "import 'a.dart';");
-
-    FileState fa = fileSystemState.getFileForPath(pa);
-    FileState fb = fileSystemState.getFileForPath(pb);
-
-    // Compute transitive closures for all files.
-    fa.transitiveFiles;
-    fb.transitiveFiles;
-    _assertFilesWithoutTransitiveFiles([]);
-
-    // It's a cycle.
-    _assertTransitiveFiles(fa, [fa, fb]);
-    _assertTransitiveFiles(fb, [fa, fb]);
-
-    // Update a.dart so that it does not import b.dart anymore.
-    provider.newFile(pa, "");
-    fa.refresh();
-    _assertFilesWithoutTransitiveFiles([fa, fb]);
-    _assertTransitiveFiles(fa, [fa]);
-    _assertTransitiveFiles(fb, [fa, fb]);
-  }
-
   test_transitiveSignature() {
-    String pa = _p('/aaa/lib/a.dart');
-    String pb = _p('/aaa/lib/b.dart');
-    String pc = _p('/aaa/lib/c.dart');
-    String pd = _p('/aaa/lib/d.dart');
+    String pa = convertPath('/aaa/lib/a.dart');
+    String pb = convertPath('/aaa/lib/b.dart');
+    String pc = convertPath('/aaa/lib/c.dart');
+    String pd = convertPath('/aaa/lib/d.dart');
 
-    provider.newFile(pa, "class A {}");
-    provider.newFile(pb, "import 'a.dart';");
-    provider.newFile(pc, "import 'b.dart';");
-    provider.newFile(pd, "class D {}");
+    newFile(pa, content: "class A {}");
+    newFile(pb, content: "import 'a.dart';");
+    newFile(pc, content: "import 'b.dart';");
+    newFile(pd, content: "class D {}");
 
     FileState fa = fileSystemState.getFileForPath(pa);
     FileState fb = fileSystemState.getFileForPath(pb);
@@ -862,25 +869,24 @@
     FileState fd = fileSystemState.getFileForPath(pd);
 
     // Compute transitive closures for all files.
+    // This implicitly computes library cycles.
     expect(fa.transitiveSignature, isNotNull);
     expect(fb.transitiveSignature, isNotNull);
     expect(fc.transitiveSignature, isNotNull);
     expect(fd.transitiveSignature, isNotNull);
-    expect(
-        _excludeSdk(fileSystemState.test.filesWithoutTransitiveFiles), isEmpty);
+    _assertFilesWithoutLibraryCycle([]);
 
     // Make an update to a.dart that does not change its API signature.
-    // All transitive signatures are still valid.
-    provider.newFile(pa, "class A {} // the same API signature");
+    // All library cycles are still valid.
+    newFile(pa, content: "class A {} // the same API signature");
     fa.refresh();
-    expect(
-        _excludeSdk(fileSystemState.test.filesWithoutTransitiveFiles), isEmpty);
+    _assertFilesWithoutLibraryCycle([]);
 
-    // Change a.dart API signature, also flush signatures of b.dart and c.dart,
-    // but d.dart is still OK.
-    provider.newFile(pa, "class A2 {}");
+    // Change a.dart API signature.
+    // This flushes signatures of b.dart and c.dart, but d.dart is still OK.
+    newFile(pa, content: "class A2 {}");
     fa.refresh();
-    _assertFilesWithoutTransitiveSignatures([fa, fb, fc]);
+    _assertFilesWithoutLibraryCycle([fa, fb, fc]);
   }
 
   void _assertExportedTopLevelDeclarations(String path, List<String> expected) {
@@ -890,13 +896,8 @@
     expect(declarations.keys, unorderedEquals(expected));
   }
 
-  void _assertFilesWithoutTransitiveFiles(List<FileState> expected) {
-    var actual = fileSystemState.test.filesWithoutTransitiveFiles;
-    expect(_excludeSdk(actual), unorderedEquals(expected));
-  }
-
-  void _assertFilesWithoutTransitiveSignatures(List<FileState> expected) {
-    var actual = fileSystemState.test.filesWithoutTransitiveSignature;
+  void _assertFilesWithoutLibraryCycle(List<FileState> expected) {
+    var actual = fileSystemState.test.filesWithoutLibraryCycle;
     expect(_excludeSdk(actual), unorderedEquals(expected));
   }
 
@@ -912,22 +913,30 @@
     expect(file.source, isNull);
   }
 
-  void _assertTransitiveFiles(FileState file, List<FileState> expected) {
-    expect(_excludeSdk(file.transitiveFiles), unorderedEquals(expected));
+  void _assertLibraryCycle(
+    FileState file,
+    List<FileState> expectedLibraries,
+    List<LibraryCycle> expectedDirectDependencies,
+  ) {
+    expect(file.libraryCycle.libraries, unorderedEquals(expectedLibraries));
+    expect(
+      _excludeSdk(file.libraryCycle.directDependencies),
+      unorderedEquals(expectedDirectDependencies),
+    );
   }
 
   List<T> _excludeSdk<T>(Iterable<T> files) {
     return files.where((Object file) {
-      if (file is FileState) {
+      if (file is LibraryCycle) {
+        return !file.libraries.any((file) => file.uri.isScheme('dart'));
+      } else if (file is FileState) {
         return file.uri?.scheme != 'dart';
       } else {
-        return !(file as String).startsWith(_p('/sdk'));
+        return !(file as String).startsWith(convertPath('/sdk'));
       }
     }).toList();
   }
 
-  String _p(String path) => provider.convertPath(path);
-
   static String _md5(String content) {
     return hex.encode(md5.convert(utf8.encode(content)).bytes);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index e3106d1..a4217fe 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -1,13 +1,13 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 import 'dart:convert';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/index.dart';
 import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
@@ -134,7 +134,7 @@
   }
 
   test_isExtendedBy_ClassDeclaration_isQualified() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 class A {}
 ''');
     await _indexTestUnit('''
@@ -167,7 +167,7 @@
   }
 
   test_isExtendedBy_ClassTypeAlias_isQualified() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 class A {}
 ''');
     await _indexTestUnit('''
@@ -193,7 +193,7 @@
   }
 
   test_isImplementedBy_ClassDeclaration_isQualified() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 class A {}
 ''');
     await _indexTestUnit('''
@@ -256,7 +256,7 @@
   }
 
   test_isInvokedBy_FunctionElement() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 library lib;
 foo() {}
 ''');
@@ -393,7 +393,7 @@
   }
 
   test_isMixedInBy_ClassDeclaration_isQualified() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 class A {}
 ''');
     await _indexTestUnit('''
@@ -465,7 +465,7 @@
   }
 
   test_isReferencedBy_ClassElement_invocation_isQualified() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 class A {}
 ''');
     await _indexTestUnit('''
@@ -504,7 +504,7 @@
   }
 
   test_isReferencedBy_CompilationUnitElement_export() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 library lib;
 ''');
     await _indexTestUnit('''
@@ -515,7 +515,7 @@
   }
 
   test_isReferencedBy_CompilationUnitElement_import() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 library lib;
 ''');
     await _indexTestUnit('''
@@ -526,7 +526,7 @@
   }
 
   test_isReferencedBy_CompilationUnitElement_part() async {
-    provider.newFile(_p('$testProject/my_unit.dart'), 'part of my_lib;');
+    newFile('$testProject/my_unit.dart', content: 'part of my_lib;');
     await _indexTestUnit('''
 library my_lib;
 part 'my_unit.dart';
@@ -536,8 +536,8 @@
   }
 
   test_isReferencedBy_CompilationUnitElement_part_inPart() async {
-    provider.newFile(_p('$testProject/a.dart'), 'part of lib;');
-    provider.newFile(_p('$testProject/b.dart'), '''
+    newFile('$testProject/a.dart', content: 'part of lib;');
+    newFile('$testProject/b.dart', content: '''
 library lib;
 part 'a.dart';
 ''');
@@ -803,7 +803,7 @@
   }
 
   test_isReferencedBy_FunctionElement_with_LibraryElement() async {
-    provider.newFile(_p('$testProject/foo.dart'), r'''
+    newFile('$testProject/foo.dart', content: r'''
 bar() {}
 ''');
     await _indexTestUnit('''
@@ -863,8 +863,8 @@
   }
 
   test_isReferencedBy_MultiplyDefinedElement() async {
-    provider.newFile(_p('$testProject/a1.dart'), 'class A {}');
-    provider.newFile(_p('$testProject/a2.dart'), 'class A {}');
+    newFile('$testProject/a1.dart', content: 'class A {}');
+    newFile('$testProject/a2.dart', content: 'class A {}');
     await _indexTestUnit('''
 import 'a1.dart';
 import 'a2.dart';
@@ -911,7 +911,7 @@
   }
 
   test_isReferencedBy_TopLevelVariableElement() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 library lib;
 var V;
 ''');
@@ -935,7 +935,7 @@
   }
 
   test_isReferencedBy_TopLevelVariableElement_synthetic_hasGetterSetter() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 int get V => 0;
 void set V(_) {}
 ''');
@@ -947,7 +947,7 @@
   }
 
   test_isReferencedBy_TopLevelVariableElement_synthetic_hasSetter() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 void set V(_) {}
 ''');
     await _indexTestUnit('''
@@ -982,7 +982,7 @@
 
   test_subtypes_classDeclaration() async {
     String libP = 'package:test/lib.dart;package:test/lib.dart';
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 class A {}
 class B {}
 class C {}
@@ -1032,7 +1032,7 @@
 
   test_subtypes_classTypeAlias() async {
     String libP = 'package:test/lib.dart;package:test/lib.dart';
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 class A {}
 class B {}
 class C {}
@@ -1070,7 +1070,7 @@
 
   test_subtypes_mixinDeclaration() async {
     String libP = 'package:test/lib.dart;package:test/lib.dart';
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 class A {}
 class B {}
 class C {}
@@ -1336,10 +1336,10 @@
     return _getStringId(str);
   }
 
-  Future<Null> _indexTestUnit(String code) async {
+  Future<void> _indexTestUnit(String code) async {
     addTestFile(code);
 
-    AnalysisResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     testUnit = result.unit;
     testUnitElement = testUnit.declaredElement;
     testLibraryElement = testUnitElement.library;
@@ -1348,8 +1348,6 @@
     List<int> indexBytes = indexBuilder.toBuffer();
     index = new AnalysisDriverUnitIndex.fromBuffer(indexBytes);
   }
-
-  String _p(String path) => provider.convertPath(path);
 }
 
 class _ElementIndexAssert {
diff --git a/pkg/analyzer/test/src/dart/analysis/protected_file_byte_store_test.dart b/pkg/analyzer/test/src/dart/analysis/protected_file_byte_store_test.dart
deleted file mode 100644
index 05bcad5..0000000
--- a/pkg/analyzer/test/src/dart/analysis/protected_file_byte_store_test.dart
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:io' as io;
-
-import 'package:analyzer/src/dart/analysis/protected_file_byte_store.dart';
-import 'package:path/path.dart' as pathos;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(ProtectedKeysTest);
-    defineReflectiveTests(ProtectedFileByteStoreTest);
-  });
-}
-
-List<int> _b(int length) {
-  return new List<int>.filled(length, 0);
-}
-
-@reflectiveTest
-class ProtectedFileByteStoreTest {
-  static const PADDING = 4;
-
-  io.Directory cacheDirectory;
-  String cachePath;
-  ProtectedFileByteStore store;
-
-  int time = 0;
-
-  String get protectedKeysText {
-    String path =
-        pathos.join(cachePath, ProtectedFileByteStore.PROTECTED_FILE_NAME);
-    return new io.File(path).readAsStringSync();
-  }
-
-  void setUp() {
-    io.Directory systemTemp = io.Directory.systemTemp;
-    cacheDirectory = systemTemp.createTempSync('ProtectedFileByteStoreTest');
-    cachePath = cacheDirectory.absolute.path;
-    _createStore();
-  }
-
-  void tearDown() {
-    try {
-      cacheDirectory.deleteSync(recursive: true);
-    } on io.FileSystemException {}
-  }
-
-  test_flush() async {
-    store.put('a', _b(1));
-    store.put('b', _b(2));
-    store.put('c', _b(3));
-    store.put('d', _b(4));
-
-    store.updateProtectedKeys(add: ['b', 'd']);
-
-    // Add a delay to give the store time to write to disk.
-    await new Future.delayed(const Duration(milliseconds: 200));
-
-    // Flush, only protected 'b' and 'd' survive.
-    store.flush();
-    store.flush();
-    _assertCacheContent({'b': 2, 'd': 4}, ['a', 'c']);
-
-    // Remove 'b' and flush.
-    // Only 'd' survives.
-    store.updateProtectedKeys(remove: ['b']);
-    store.flush();
-    _assertCacheContent({'d': 4}, ['b']);
-  }
-
-  test_put() async {
-    store.put('a', _b(65));
-    store.put('b', _b(63));
-    store.put('c', _b(1));
-
-    // We can access all results.
-    expect(store.get('a'), hasLength(65));
-    expect(store.get('b'), hasLength(63));
-    expect(store.get('c'), hasLength(1));
-
-    // Add a delay to give the store time to write to disk.
-    await new Future.delayed(const Duration(milliseconds: 200));
-
-    _assertCacheContent({'a': 65, 'b': 63, 'c': 1}, []);
-  }
-
-  test_put_reservedKey() {
-    expect(() {
-      store.put(ProtectedFileByteStore.PROTECTED_FILE_NAME, <int>[]);
-    }, throwsArgumentError);
-  }
-
-  test_updateProtectedKeys_add() {
-    store.updateProtectedKeys(add: ['a', 'b']);
-    _assertKeys({'a': 0, 'b': 0});
-
-    time++;
-    store.updateProtectedKeys(add: ['c']);
-    _assertKeys({'a': 0, 'b': 0, 'c': 1});
-  }
-
-  test_updateProtectedKeys_add_hasSame() {
-    store.updateProtectedKeys(add: ['a', 'b', 'c']);
-    _assertKeys({'a': 0, 'b': 0, 'c': 0});
-
-    time++;
-    store.updateProtectedKeys(add: ['b', 'd']);
-    _assertKeys({'a': 0, 'b': 1, 'c': 0, 'd': 1});
-  }
-
-  test_updateProtectedKeys_add_removeTooOld() {
-    store.updateProtectedKeys(add: ['a', 'b']);
-    _assertKeys({'a': 0, 'b': 0});
-
-    // Move time to 10 ms, both 'a' and 'b' are still alive.
-    time = 10;
-    store.updateProtectedKeys(add: ['c']);
-    _assertKeys({'a': 0, 'b': 0, 'c': 10});
-
-    // Move time to 11 ms, now 'a' and 'b' are too old and removed.
-    time = 11;
-    store.updateProtectedKeys(add: ['d']);
-    _assertKeys({'c': 10, 'd': 11});
-  }
-
-  test_updateProtectedKeys_add_removeTooOld_nullDuration() {
-    _createStore(protectionDuration: null);
-
-    store.updateProtectedKeys(add: ['a', 'b']);
-    _assertKeys({'a': 0, 'b': 0});
-
-    // Move time far into the future, both 'a' and 'b' are still alive.
-    time = 1 << 30;
-    store.updateProtectedKeys(add: ['c']);
-    _assertKeys({'a': 0, 'b': 0, 'c': time});
-  }
-
-  test_updateProtectedKeys_addRemove() {
-    store.updateProtectedKeys(add: ['a', 'b', 'c']);
-    _assertKeys({'a': 0, 'b': 0, 'c': 0});
-
-    time++;
-    store.updateProtectedKeys(add: ['d'], remove: ['b']);
-    _assertKeys({'a': 0, 'c': 0, 'd': 1});
-  }
-
-  test_updateProtectedKeys_addRemove_same() {
-    store.updateProtectedKeys(add: ['a', 'b', 'c']);
-    _assertKeys({'a': 0, 'b': 0, 'c': 0});
-
-    time++;
-    store.updateProtectedKeys(add: ['b'], remove: ['b']);
-    _assertKeys({'a': 0, 'c': 0});
-  }
-
-  test_updateProtectedKeys_remove() {
-    store.updateProtectedKeys(add: ['a', 'b', 'c']);
-    _assertKeys({'a': 0, 'b': 0, 'c': 0});
-
-    time++;
-    store.updateProtectedKeys(remove: ['b']);
-    _assertKeys({'a': 0, 'c': 0});
-  }
-
-  void _assertCacheContent(Map<String, int> includes, List<String> excludes) {
-    Map<String, int> keyToLength = {};
-    for (var file in cacheDirectory.listSync()) {
-      String key = pathos.basename(file.path);
-      if (file is io.File) {
-        keyToLength[key] = file.lengthSync();
-      }
-    }
-    includes.forEach((expectedKey, expectedLength) {
-      expect(keyToLength, contains(expectedKey));
-      expect(keyToLength, containsPair(expectedKey, expectedLength + PADDING));
-    });
-    for (var excludedKey in excludes) {
-      expect(keyToLength.keys, isNot(contains(excludedKey)));
-    }
-  }
-
-  void _assertKeys(Map<String, int> expected) {
-    var path =
-        pathos.join(cachePath, ProtectedFileByteStore.PROTECTED_FILE_NAME);
-    var text = new io.File(path).readAsStringSync();
-    var keys = new ProtectedKeys.decode(text);
-    expect(keys.map.keys, expected.keys);
-    expected.forEach((key, start) {
-      expect(keys.map, containsPair(key, start));
-    });
-  }
-
-  void _createStore(
-      {Duration protectionDuration: const Duration(milliseconds: 10)}) {
-    store = new ProtectedFileByteStore(cachePath,
-        protectionDuration: protectionDuration,
-        cacheSizeBytes: 256,
-        getCurrentTime: _getTime);
-  }
-
-  int _getTime() => time;
-}
-
-@reflectiveTest
-class ProtectedKeysTest {
-  test_decode() {
-    var keys = new ProtectedKeys({'/a/b/c': 10, '/a/d/e': 123});
-
-    String text = keys.encode();
-    expect(text, r'''
-/a/b/c
-10
-/a/d/e
-123''');
-
-    keys = _decode(text);
-    expect(keys.map['/a/b/c'], 10);
-    expect(keys.map['/a/d/e'], 123);
-  }
-
-  test_decode_empty() {
-    var keys = _decode('');
-    expect(keys.map, isEmpty);
-  }
-
-  test_decode_error_notEvenNumberOfLines() {
-    var keys = _decode('a');
-    expect(keys.map, isEmpty);
-  }
-
-  test_decode_error_startIsEmpty() {
-    var keys = _decode('a\n');
-    expect(keys.map, isEmpty);
-  }
-
-  test_decode_error_startIsNotInt() {
-    var keys = _decode('a\n1.23');
-    expect(keys.map, isEmpty);
-  }
-
-  test_decode_error_startIsNotNumber() {
-    var keys = _decode('a\nb');
-    expect(keys.map, isEmpty);
-  }
-
-  test_removeOlderThan() {
-    var keys = new ProtectedKeys({'a': 1, 'b': 2, 'c': 3});
-    _assertKeys(keys, {'a': 1, 'b': 2, 'c': 3});
-
-    keys.removeOlderThan(5, 7);
-    _assertKeys(keys, {'b': 2, 'c': 3});
-  }
-
-  void _assertKeys(ProtectedKeys keys, Map<String, int> expected) {
-    expect(keys.map.keys, expected.keys);
-    expected.forEach((key, start) {
-      expect(keys.map, containsPair(key, start));
-    });
-  }
-
-  ProtectedKeys _decode(String text) {
-    return new ProtectedKeys.decode(text);
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index ad2bc6e..8be9b97 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -1,14 +1,14 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 import 'dart:collection';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart' hide Declaration;
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/member.dart';
@@ -149,15 +149,15 @@
   }
 
   test_declarations_discover() async {
-    var t = _p('/test/lib/t.dart');
-    var a = _p('/aaa/lib/a.dart');
-    var b = _p('/bbb/lib/b.dart');
-    var c = _p('/ccc/lib/c.dart');
+    var t = convertPath('/test/lib/t.dart');
+    var a = convertPath('/aaa/lib/a.dart');
+    var b = convertPath('/bbb/lib/b.dart');
+    var c = convertPath('/ccc/lib/c.dart');
 
-    provider.newFile(t, 'class T {}');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
-    provider.newFile(c, 'class C {}');
+    newFile(t, content: 'class T {}');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
+    newFile(c, content: 'class C {}');
 
     driver.addFile(t);
 
@@ -170,11 +170,11 @@
   }
 
   test_declarations_duplicateFile() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
 
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
 
     driver.addFile(a);
     driver.addFile(b);
@@ -243,10 +243,10 @@
   }
 
   test_declarations_onlyForFile() async {
-    var a = _p('/test/lib/a.dart');
-    var b = _p('/test/lib/b.dart');
-    provider.newFile(a, 'class A {}');
-    provider.newFile(b, 'class B {}');
+    var a = convertPath('/test/lib/a.dart');
+    var b = convertPath('/test/lib/b.dart');
+    newFile(a, content: 'class A {}');
+    newFile(b, content: 'class B {}');
 
     driver.addFile(a);
     driver.addFile(b);
@@ -423,15 +423,15 @@
   }
 
   test_references_discover() async {
-    var t = _p('/test/lib/t.dart');
-    var a = _p('/aaa/lib/a.dart');
-    var b = _p('/bbb/lib/b.dart');
-    var c = _p('/ccc/lib/c.dart');
+    var t = convertPath('/test/lib/t.dart');
+    var a = convertPath('/aaa/lib/a.dart');
+    var b = convertPath('/bbb/lib/b.dart');
+    var c = convertPath('/ccc/lib/c.dart');
 
-    provider.newFile(t, 'List t;');
-    provider.newFile(a, 'List a;');
-    provider.newFile(b, 'List b;');
-    provider.newFile(c, 'List c;');
+    newFile(t, content: 'List t;');
+    newFile(a, content: 'List a;');
+    newFile(b, content: 'List b;');
+    newFile(c, content: 'List c;');
 
     driver.addFile(t);
 
@@ -456,13 +456,13 @@
   }
 
   test_references_discover_onlyOwned() async {
-    var t = _p('/test/lib/t.dart');
-    var a = _p('/aaa/lib/a.dart');
-    var b = _p('/bbb/lib/b.dart');
+    var t = convertPath('/test/lib/t.dart');
+    var a = convertPath('/aaa/lib/a.dart');
+    var b = convertPath('/bbb/lib/b.dart');
 
-    provider.newFile(t, 'List t;');
-    provider.newFile(a, 'List a;');
-    provider.newFile(b, 'List b;');
+    newFile(t, content: 'List t;');
+    newFile(a, content: 'List a;');
+    newFile(b, content: 'List b;');
 
     driver.addFile(t);
     driver.addFile(a);
@@ -492,11 +492,11 @@
   }
 
   test_references_discover_onlyOwned_samePath() async {
-    var p = _p('/test/lib/t.dart');
-    provider.newFile(p, 'int t;');
+    var p = convertPath('/test/lib/t.dart');
+    newFile(p, content: 'int t;');
 
     var driver1 = createAnalysisDriver(packageMap: {
-      'test': [provider.newFolder(_p('/test/lib'))]
+      'test': [newFolder('/test/lib')]
     });
     var driver2 = createAnalysisDriver(packageMap: {});
 
@@ -512,17 +512,17 @@
   }
 
   test_references_discover_onlyOwned_sameUri() async {
-    var a = _p('/aaa/lib/t.dart');
-    var b = _p('/bbb/lib/t.dart');
+    var a = convertPath('/aaa/lib/t.dart');
+    var b = convertPath('/bbb/lib/t.dart');
 
-    provider.newFile(a, 'int t;');
-    provider.newFile(b, 'double t;');
+    newFile(a, content: 'int t;');
+    newFile(b, content: 'double t;');
 
     var driver1 = createAnalysisDriver(packageMap: {
-      'ttt': [provider.newFolder(_p('/aaa/lib'))]
+      'ttt': [newFolder('/aaa/lib')]
     });
     var driver2 = createAnalysisDriver(packageMap: {
-      'ttt': [provider.newFolder(_p('/bbb/lib'))]
+      'ttt': [newFolder('/bbb/lib')]
     });
 
     // driver1 owns `/aaa/lib/t.dart` with `package:ttt/t.dart`.
@@ -620,7 +620,7 @@
     ClassElement randomElement;
     {
       String randomPath = sdk.mapDartUri('dart:math').fullName;
-      AnalysisResult result = await driver.getResult(randomPath);
+      ResolvedUnitResult result = await driver.getResult(randomPath);
       randomElement = result.unit.declaredElement.getType('Random');
     }
 
@@ -680,7 +680,7 @@
   }
 
   test_searchReferences_ClassElement_definedOutside() async {
-    provider.newFile(_p('$testProject/lib.dart'), r'''
+    newFile('$testProject/lib.dart', content: r'''
 class A {};
 ''');
     await _resolveTestUnit('''
@@ -713,7 +713,7 @@
   }
 
   test_searchReferences_CompilationUnitElement() async {
-    provider.newFile(_p('$testProject/foo.dart'), '');
+    newFile('$testProject/foo.dart');
     await _resolveTestUnit('''
 import 'foo.dart'; // import
 export 'foo.dart'; // export
@@ -750,14 +750,14 @@
   }
 
   test_searchReferences_ConstructorElement_default_otherFile() async {
-    String other = _p('$testProject/other.dart');
+    String other = convertPath('$testProject/other.dart');
     String otherCode = '''
 import 'test.dart';
 main() {
   new A(); // in other
 }
 ''';
-    provider.newFile(other, otherCode);
+    newFile(other, content: otherCode);
     driver.addFile(other);
 
     await _resolveTestUnit('''
@@ -962,7 +962,7 @@
   }
 
   test_searchReferences_ImportElement_noPrefix_inPackage() async {
-    testFile = _p('/aaa/lib/a.dart');
+    testFile = convertPath('/aaa/lib/a.dart');
     await _resolveTestUnit('''
 import 'dart:math' show max, PI, Random hide min;
 export 'dart:math' show max, PI, Random hide min;
@@ -1063,8 +1063,8 @@
   test_searchReferences_LibraryElement() async {
     var codeA = 'part of lib; // A';
     var codeB = 'part of lib; // B';
-    provider.newFile(_p('$testProject/unitA.dart'), codeA);
-    provider.newFile(_p('$testProject/unitB.dart'), codeB);
+    newFile('$testProject/unitA.dart', content: codeA);
+    newFile('$testProject/unitB.dart', content: codeB);
     await _resolveTestUnit('''
 library lib;
 part 'unitA.dart';
@@ -1083,14 +1083,14 @@
   }
 
   test_searchReferences_LibraryElement_inPackage() async {
-    testFile = _p('/aaa/lib/a.dart');
-    var partPathA = _p('/aaa/lib/unitA.dart');
-    var partPathB = _p('/aaa/lib/unitB.dart');
+    testFile = convertPath('/aaa/lib/a.dart');
+    var partPathA = convertPath('/aaa/lib/unitA.dart');
+    var partPathB = convertPath('/aaa/lib/unitB.dart');
 
     var codeA = 'part of lib; // A';
     var codeB = 'part of lib; // B';
-    provider.newFile(partPathA, codeA);
-    provider.newFile(partPathB, codeB);
+    newFile(partPathA, content: codeA);
+    newFile(partPathB, content: codeB);
     await _resolveTestUnit('''
 library lib;
 part 'unitA.dart';
@@ -1152,7 +1152,7 @@
   }
 
   test_searchReferences_LocalVariableElement_inPackage() async {
-    testFile = _p('/aaa/lib/a.dart');
+    testFile = convertPath('/aaa/lib/a.dart');
 
     await _resolveTestUnit('''
 main() {
@@ -1370,7 +1370,7 @@
 part of my_lib;
 ppp.Future c;
 ''';
-    provider.newFile(_p('$testProject/my_part.dart'), partCode);
+    newFile('$testProject/my_part.dart', content: partCode);
     await _resolveTestUnit('''
 library my_lib;
 import 'dart:async' as ppp;
@@ -1393,14 +1393,14 @@
   }
 
   test_searchReferences_PrefixElement_inPackage() async {
-    testFile = _p('/aaa/lib/a.dart');
-    var partPath = _p('/aaa/lib/my_part.dart');
+    testFile = convertPath('/aaa/lib/a.dart');
+    var partPath = convertPath('/aaa/lib/my_part.dart');
 
     String partCode = r'''
 part of my_lib;
 ppp.Future c;
 ''';
-    provider.newFile(partPath, partCode);
+    newFile(partPath, content: partCode);
     await _resolveTestUnit('''
 library my_lib;
 import 'dart:async' as ppp;
@@ -1423,14 +1423,14 @@
   }
 
   test_searchReferences_private_declaredInDefiningUnit() async {
-    String p1 = _p('$testProject/part1.dart');
-    String p2 = _p('$testProject/part2.dart');
-    String p3 = _p('$testProject/part3.dart');
+    String p1 = convertPath('$testProject/part1.dart');
+    String p2 = convertPath('$testProject/part2.dart');
+    String p3 = convertPath('$testProject/part3.dart');
     String code1 = 'part of lib; _C v1;';
     String code2 = 'part of lib; _C v2;';
-    provider.newFile(p1, code1);
-    provider.newFile(p2, code2);
-    provider.newFile(p3, 'part of lib; int v3;');
+    newFile(p1, content: code1);
+    newFile(p2, content: code2);
+    newFile(p3, content: 'part of lib; int v3;');
 
     driver.addFile(p1);
     driver.addFile(p2);
@@ -1459,9 +1459,9 @@
   }
 
   test_searchReferences_private_declaredInPart() async {
-    String p = _p('$testProject/lib.dart');
-    String p1 = _p('$testProject/part1.dart');
-    String p2 = _p('$testProject/part2.dart');
+    String p = convertPath('$testProject/lib.dart');
+    String p1 = convertPath('$testProject/part1.dart');
+    String p2 = convertPath('$testProject/part2.dart');
 
     var code = '''
 library lib;
@@ -1476,15 +1476,15 @@
 ''';
     String code2 = 'part of lib; _C v2;';
 
-    provider.newFile(p, code);
-    provider.newFile(p1, code1);
-    provider.newFile(p2, code2);
+    newFile(p, content: code);
+    newFile(p1, content: code1);
+    newFile(p2, content: code2);
 
     driver.addFile(p);
     driver.addFile(p1);
     driver.addFile(p2);
 
-    AnalysisResult result = await driver.getResult(p);
+    ResolvedUnitResult result = await driver.getResult(p);
     testUnit = result.unit;
     testUnitElement = testUnit.declaredElement;
     testLibraryElement = testUnitElement.library;
@@ -1505,15 +1505,15 @@
   }
 
   test_searchReferences_private_inPackage() async {
-    testFile = _p('/aaa/lib/a.dart');
-    var p1 = _p('/aaa/lib/part1.dart');
-    var p2 = _p('/aaa/lib/part2.dart');
+    testFile = convertPath('/aaa/lib/a.dart');
+    var p1 = convertPath('/aaa/lib/part1.dart');
+    var p2 = convertPath('/aaa/lib/part2.dart');
 
     String code1 = 'part of lib; _C v1;';
     String code2 = 'part of lib; _C v2;';
 
-    provider.newFile(p1, code1);
-    provider.newFile(p2, code2);
+    newFile(p1, content: code1);
+    newFile(p2, content: code2);
 
     await _resolveTestUnit('''
 library lib;
@@ -1581,7 +1581,7 @@
   }
 
   test_searchReferences_TopLevelVariableElement() async {
-    provider.newFile(_p('$testProject/lib.dart'), '''
+    newFile('$testProject/lib.dart', content: '''
 library lib;
 var V;
 ''');
@@ -1768,15 +1768,15 @@
   }
 
   test_subtypes_discover() async {
-    var pathT = _p('/test/lib/t.dart');
-    var pathA = _p('/aaa/lib/a.dart');
-    var pathB = _p('/bbb/lib/b.dart');
+    var pathT = convertPath('/test/lib/t.dart');
+    var pathA = convertPath('/aaa/lib/a.dart');
+    var pathB = convertPath('/bbb/lib/b.dart');
 
     var tUri = 'package:test/t.dart';
     var aUri = 'package:aaa/a.dart';
     var bUri = 'package:bbb/b.dart';
 
-    provider.newFile(pathT, r'''
+    newFile(pathT, content: r'''
 import 'package:aaa/a.dart';
 
 class T1 extends A {
@@ -1788,7 +1788,7 @@
 }
 ''');
 
-    provider.newFile(pathB, r'''
+    newFile(pathB, content: r'''
 import 'package:aaa/a.dart';
 
 class B extends A {
@@ -1796,7 +1796,7 @@
 }
 ''');
 
-    provider.newFile(pathA, r'''
+    newFile(pathA, content: r'''
 class A {
   void method1() {}
   void method2() {}
@@ -1830,15 +1830,15 @@
   }
 
   test_subTypes_discover() async {
-    var t = _p('/test/lib/t.dart');
-    var a = _p('/aaa/lib/a.dart');
-    var b = _p('/bbb/lib/b.dart');
-    var c = _p('/ccc/lib/c.dart');
+    var t = convertPath('/test/lib/t.dart');
+    var a = convertPath('/aaa/lib/a.dart');
+    var b = convertPath('/bbb/lib/b.dart');
+    var c = convertPath('/ccc/lib/c.dart');
 
-    provider.newFile(t, 'class T implements List {}');
-    provider.newFile(a, 'class A implements List {}');
-    provider.newFile(b, 'class B implements List {}');
-    provider.newFile(c, 'class C implements List {}');
+    newFile(t, content: 'class T implements List {}');
+    newFile(a, content: 'class A implements List {}');
+    newFile(b, content: 'class B implements List {}');
+    newFile(c, content: 'class C implements List {}');
 
     driver.addFile(t);
 
@@ -1863,13 +1863,13 @@
   }
 
   test_subtypes_files() async {
-    String pathB = _p('$testProject/b.dart');
-    String pathC = _p('$testProject/c.dart');
-    provider.newFile(pathB, r'''
+    String pathB = convertPath('$testProject/b.dart');
+    String pathC = convertPath('$testProject/c.dart');
+    newFile(pathB, content: r'''
 import 'test.dart';
 class B extends A {}
 ''');
-    provider.newFile(pathC, r'''
+    newFile(pathC, content: r'''
 import 'test.dart';
 class C extends A {}
 class D {}
@@ -2016,24 +2016,22 @@
     return ElementLocator.locate(node);
   }
 
-  String _p(String path) => provider.convertPath(path);
-
-  Future<Null> _resolveTestUnit(String code, {bool addToDriver: true}) async {
+  Future<void> _resolveTestUnit(String code, {bool addToDriver: true}) async {
     if (addToDriver) {
       addTestFile(code);
     } else {
       testCode = code;
-      provider.newFile(testFile, testCode);
+      newFile(testFile, content: testCode);
     }
     if (testUnit == null) {
-      AnalysisResult result = await driver.getResult(testFile);
+      ResolvedUnitResult result = await driver.getResult(testFile);
       testUnit = result.unit;
       testUnitElement = testUnit.declaredElement;
       testLibraryElement = testUnitElement.library;
     }
   }
 
-  Future<Null> _verifyNameReferences(
+  Future<void> _verifyNameReferences(
       String name, List<ExpectedResult> expectedMatches) async {
     var searchedFiles = new SearchedFiles();
     List<SearchResult> results =
diff --git a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
index 81e7cbb..f815fbc 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_helper_test.dart
@@ -2,12 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'base.dart';
+import '../resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -16,163 +17,408 @@
 }
 
 @reflectiveTest
-class AnalysisSessionHelperTest extends BaseAnalysisDriverTest {
-  AnalysisSessionHelper sessionHelper;
+class AnalysisSessionHelperTest extends DriverResolutionTest {
+  AnalysisSessionHelper helper;
 
   @override
   void setUp() {
     super.setUp();
-    sessionHelper = new AnalysisSessionHelper(driver.currentSession);
+    helper = new AnalysisSessionHelper(driver.currentSession);
   }
 
   test_getClass_defined() async {
-    var path = _p('/c.dart');
-    var file = provider.newFile(path, r'''
+    var file = newFile('/test/lib/c.dart', content: r'''
 class C {}
 int v = 0;
 ''');
     String uri = file.toUri().toString();
 
-    var element = await sessionHelper.getClass(uri, 'C');
+    var element = await helper.getClass(uri, 'C');
     expect(element, isNotNull);
     expect(element.displayName, 'C');
   }
 
   test_getClass_defined_notClass() async {
-    var path = _p('/c.dart');
-    var file = provider.newFile(path, r'''
+    var file = newFile('/test/lib/c.dart', content: r'''
 int v = 0;
 ''');
     String uri = file.toUri().toString();
 
-    var element = await sessionHelper.getClass(uri, 'v');
+    var element = await helper.getClass(uri, 'v');
     expect(element, isNull);
   }
 
   test_getClass_exported() async {
-    var a = _p('/a.dart');
-    var b = _p('/b.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class A {}
 ''');
-    var bFile = provider.newFile(b, r'''
+    var bFile = newFile('/test/lib/b.dart', content: r'''
 export 'a.dart';
 ''');
     String bUri = bFile.toUri().toString();
 
-    var element = await sessionHelper.getClass(bUri, 'A');
+    var element = await helper.getClass(bUri, 'A');
     expect(element, isNotNull);
     expect(element.displayName, 'A');
   }
 
   test_getClass_imported() async {
-    var a = _p('/a.dart');
-    var b = _p('/b.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 class A {}
 ''');
-    var bFile = provider.newFile(b, r'''
+    var bFile = newFile('/test/lib/b.dart', content: r'''
 import 'a.dart';
 ''');
     String bUri = bFile.toUri().toString();
 
-    var element = await sessionHelper.getClass(bUri, 'A');
+    var element = await helper.getClass(bUri, 'A');
     expect(element, isNull);
   }
 
+  test_getElementDeclaration_class() async {
+    newFile('/test/lib/test.dart', content: r'''
+class A {}
+''');
+    await resolveTestFile();
+
+    var element = findNode.classDeclaration('A').declaredElement;
+    var result = await helper.getElementDeclaration(element);
+    ClassDeclaration node = result.node;
+    expect(node.name.name, 'A');
+  }
+
+  test_getElementDeclaration_class_duplicate() async {
+    newFile('/test/lib/test.dart', content: r'''
+class A {} // 1
+class A {} // 2
+''');
+    await resolveTestFile();
+
+    {
+      var element = findNode.classDeclaration('A {} // 1').declaredElement;
+      var result = await helper.getElementDeclaration(element);
+      ClassDeclaration node = result.node;
+      expect(node.name.name, 'A');
+      expect(
+        node.name.offset,
+        this.result.content.indexOf('A {} // 1'),
+      );
+    }
+
+    {
+      var element = findNode.classDeclaration('A {} // 2').declaredElement;
+      var result = await helper.getElementDeclaration(element);
+      ClassDeclaration node = result.node;
+      expect(node.name.name, 'A');
+      expect(
+        node.name.offset,
+        this.result.content.indexOf('A {} // 2'),
+      );
+    }
+  }
+
+  test_getElementDeclaration_class_inPart() async {
+    newFile('/test/lib/a.dart', content: r'''
+part of 'test.dart';
+class A {}
+''');
+    newFile('/test/lib/test.dart', content: r'''
+part 'a.dart';
+''');
+    await resolveTestFile();
+
+    var library = this.result.unit.declaredElement.library;
+    var element = library.getType('A');
+    var result = await helper.getElementDeclaration(element);
+    ClassDeclaration node = result.node;
+    expect(node.name.name, 'A');
+  }
+
+  test_getElementDeclaration_constructor() async {
+    newFile('/test/lib/test.dart', content: r'''
+class A {
+  A();
+  A.named();
+}
+''');
+    await resolveTestFile();
+
+    {
+      var unnamed = findNode.constructor('A();').declaredElement;
+      var result = await helper.getElementDeclaration(unnamed);
+      ConstructorDeclaration node = result.node;
+      expect(node.name, isNull);
+    }
+
+    {
+      var named = findNode.constructor('A.named();').declaredElement;
+      var result = await helper.getElementDeclaration(named);
+      ConstructorDeclaration node = result.node;
+      expect(node.name.name, 'named');
+    }
+  }
+
+  test_getElementDeclaration_constructor_duplicate_named() async {
+    newFile('/test/lib/test.dart', content: r'''
+class A {
+  A.named(); // 1
+  A.named(); // 2
+}
+''');
+    await resolveTestFile();
+
+    {
+      var element = findNode.constructor('A.named(); // 1').declaredElement;
+      var result = await helper.getElementDeclaration(element);
+      ConstructorDeclaration node = result.node;
+      expect(node.name.name, 'named');
+      expect(
+        node.name.offset,
+        this.result.content.indexOf('named(); // 1'),
+      );
+    }
+
+    {
+      var element = findNode.constructor('A.named(); // 2').declaredElement;
+      var result = await helper.getElementDeclaration(element);
+      ConstructorDeclaration node = result.node;
+      expect(node.name.name, 'named');
+      expect(
+        node.name.offset,
+        this.result.content.indexOf('named(); // 2'),
+      );
+    }
+  }
+
+  test_getElementDeclaration_constructor_duplicate_unnamed() async {
+    newFile('/test/lib/test.dart', content: r'''
+class A {
+  A(); // 1
+  A(); // 2
+}
+''');
+    await resolveTestFile();
+
+    {
+      var element = findNode.constructor('A(); // 1').declaredElement;
+      var result = await helper.getElementDeclaration(element);
+      ConstructorDeclaration node = result.node;
+      expect(node.name, isNull);
+      expect(
+        node.returnType.offset,
+        this.result.content.indexOf('A(); // 1'),
+      );
+    }
+
+    {
+      var element = findNode.constructor('A(); // 2').declaredElement;
+      var result = await helper.getElementDeclaration(element);
+      ConstructorDeclaration node = result.node;
+      expect(node.name, isNull);
+      expect(
+        node.returnType.offset,
+        this.result.content.indexOf('A(); // 2'),
+      );
+    }
+  }
+
+  test_getElementDeclaration_constructor_synthetic() async {
+    newFile('/test/lib/test.dart', content: r'''
+class A {}
+''');
+    await resolveTestFile();
+
+    var element = findElement.class_('A').unnamedConstructor;
+    expect(element.isSynthetic, isTrue);
+
+    var result = await helper.getElementDeclaration(element);
+    expect(result, isNull);
+  }
+
+  test_getElementDeclaration_field() async {
+    newFile('/test/lib/test.dart', content: r'''
+class C {
+  int foo;
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.field('foo');
+    var result = await helper.getElementDeclaration(element);
+    VariableDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_getElementDeclaration_functionDeclaration_local() async {
+    newFile('/test/lib/test.dart', content: r'''
+main() {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.localFunction('foo');
+    var result = await helper.getElementDeclaration(element);
+    FunctionDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_getElementDeclaration_functionDeclaration_top() async {
+    newFile('/test/lib/test.dart', content: r'''
+void foo() {}
+''');
+    await resolveTestFile();
+
+    var element = findElement.topFunction('foo');
+    var result = await helper.getElementDeclaration(element);
+    FunctionDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_getElementDeclaration_localVariable() async {
+    newFile('/test/lib/test.dart', content: r'''
+main() {
+  int foo;
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.localVar('foo');
+    var result = await helper.getElementDeclaration(element);
+    VariableDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_getElementDeclaration_method() async {
+    newFile('/test/lib/test.dart', content: r'''
+class C {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    var element = findElement.method('foo');
+    var result = await helper.getElementDeclaration(element);
+    MethodDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_getElementDeclaration_topLevelVariable() async {
+    newFile('/test/lib/test.dart', content: r'''
+int foo;
+''');
+    await resolveTestFile();
+
+    var element = findElement.topVar('foo');
+    var result = await helper.getElementDeclaration(element);
+    VariableDeclaration node = result.node;
+    expect(node.name.name, 'foo');
+  }
+
+  test_getElementDeclaration_topLevelVariable_synthetic() async {
+    newFile('/test/lib/test.dart', content: r'''
+int get foo => 0;
+''');
+    await resolveTestFile();
+
+    var element = findElement.topVar('foo');
+    var result = await helper.getElementDeclaration(element);
+    expect(result, isNull);
+  }
+
+  test_getResolvedUnitByElement() async {
+    newFile('/test/lib/test.dart', content: r'''
+class A {}
+class B {}
+''');
+    await resolveTestFile();
+
+    var element = findNode.classDeclaration('A').declaredElement;
+    var resolvedUnit = await helper.getResolvedUnitByElement(element);
+    expect(resolvedUnit.unit.declarations, hasLength(2));
+  }
+
   test_getTopLevelPropertyAccessor_defined_getter() async {
-    var path = _p('/test.dart');
-    var file = provider.newFile(path, r'''
+    var file = newFile('/test/lib/test.dart', content: r'''
 int get a => 0;
 ''');
     String uri = file.toUri().toString();
 
-    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+    var element = await helper.getTopLevelPropertyAccessor(uri, 'a');
     expect(element, isNotNull);
     expect(element.kind, ElementKind.GETTER);
     expect(element.displayName, 'a');
   }
 
   test_getTopLevelPropertyAccessor_defined_setter() async {
-    var path = _p('/test.dart');
-    var file = provider.newFile(path, r'''
+    var file = newFile('/test/lib/test.dart', content: r'''
 set a(_) {}
 ''');
     String uri = file.toUri().toString();
 
-    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a=');
+    var element = await helper.getTopLevelPropertyAccessor(uri, 'a=');
     expect(element, isNotNull);
     expect(element.kind, ElementKind.SETTER);
     expect(element.displayName, 'a');
   }
 
   test_getTopLevelPropertyAccessor_defined_variable() async {
-    var path = _p('/test.dart');
-    var file = provider.newFile(path, r'''
+    var file = newFile('/test/lib/test.dart', content: r'''
 int a;
 ''');
     String uri = file.toUri().toString();
 
-    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+    var element = await helper.getTopLevelPropertyAccessor(uri, 'a');
     expect(element, isNotNull);
     expect(element.kind, ElementKind.GETTER);
     expect(element.displayName, 'a');
   }
 
   test_getTopLevelPropertyAccessor_exported() async {
-    var a = _p('/a.dart');
-    var b = _p('/b.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 int a;
 ''');
-    var bFile = provider.newFile(b, r'''
+    var bFile = newFile('/test/lib/b.dart', content: r'''
 export 'a.dart';
 ''');
     String bUri = bFile.toUri().toString();
 
-    var element = await sessionHelper.getTopLevelPropertyAccessor(bUri, 'a');
+    var element = await helper.getTopLevelPropertyAccessor(bUri, 'a');
     expect(element, isNotNull);
     expect(element.kind, ElementKind.GETTER);
     expect(element.displayName, 'a');
   }
 
   test_getTopLevelPropertyAccessor_imported() async {
-    var a = _p('/a.dart');
-    var b = _p('/b.dart');
-    provider.newFile(a, r'''
+    newFile('/test/lib/a.dart', content: r'''
 int a;
 ''');
-    var bFile = provider.newFile(b, r'''
+    var bFile = newFile('/test/lib/b.dart', content: r'''
 import 'a.dart';
 ''');
     String bUri = bFile.toUri().toString();
 
-    var element = await sessionHelper.getTopLevelPropertyAccessor(bUri, 'a');
+    var element = await helper.getTopLevelPropertyAccessor(bUri, 'a');
     expect(element, isNull);
   }
 
   test_getTopLevelPropertyAccessor_notDefined() async {
-    var path = _p('/test.dart');
-    var file = provider.newFile(path, r'''
+    var file = newFile('/test/lib/test.dart', content: r'''
 int a;
 ''');
     String uri = file.toUri().toString();
 
-    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'b');
+    var element = await helper.getTopLevelPropertyAccessor(uri, 'b');
     expect(element, isNull);
   }
 
   test_getTopLevelPropertyAccessor_notPropertyAccessor() async {
-    var path = _p('/test.dart');
-    var file = provider.newFile(path, r'''
+    var file = newFile('/test/lib/test.dart', content: r'''
 int a() {}
 ''');
     String uri = file.toUri().toString();
 
-    var element = await sessionHelper.getTopLevelPropertyAccessor(uri, 'a');
+    var element = await helper.getTopLevelPropertyAccessor(uri, 'a');
     expect(element, isNull);
   }
-
-  /// Return the [provider] specific path for the given Posix [path].
-  String _p(String path) => provider.convertPath(path);
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 0c00794..555c2ec 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -2,20 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
-
-import 'package:analyzer/dart/analysis/session.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/dart/analysis/analysis_context.dart';
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
-import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisOptions, AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -26,214 +20,484 @@
 }
 
 @reflectiveTest
-class AnalysisSessionImplTest {
-  MockAnalysisDriver driver;
+class AnalysisSessionImplTest with ResourceProviderMixin {
+  AnalysisContextCollection contextCollection;
+  AnalysisContext context;
   AnalysisSessionImpl session;
 
+  String testContextPath;
+  String aaaContextPath;
+  String bbbContextPath;
+
+  String testPath;
+
   void setUp() {
-    driver = new MockAnalysisDriver();
-    session = new AnalysisSessionImpl(driver);
-    driver.currentSession = session;
+    MockSdk(resourceProvider: resourceProvider);
+
+    testContextPath = newFolder('/home/test').path;
+    aaaContextPath = newFolder('/home/aaa').path;
+    bbbContextPath = newFolder('/home/bbb').path;
+
+    newFile('/home/test/.packages', content: r'''
+test:lib/
+''');
+
+    contextCollection = AnalysisContextCollectionImpl(
+      includedPaths: [testContextPath, aaaContextPath, bbbContextPath],
+      resourceProvider: resourceProvider,
+      sdkPath: convertPath(sdkRoot),
+    );
+    context = contextCollection.contextFor(testContextPath);
+    session = context.currentSession;
+
+    testPath = convertPath('/home/test/lib/test.dart');
   }
 
   test_getErrors() async {
-    ErrorsResult result = new ErrorsResult(null, null, null, null, null, null);
-    driver.errorsResult = result;
-    expect(await session.getErrors('path'), result);
+    newFile(testPath, content: 'class C {');
+    var errorsResult = await session.getErrors(testPath);
+    expect(errorsResult.session, session);
+    expect(errorsResult.path, testPath);
+    expect(errorsResult.errors, isNotEmpty);
   }
 
   test_getLibraryByUri() async {
-    String uri = 'uri';
+    newFile(testPath, content: r'''
+class A {}
+class B {}
+''');
 
-    var source = new _SourceMock(Uri.parse(uri));
-    var unit = new CompilationUnitElementImpl()
-      ..librarySource = source
-      ..source = source;
-    var library = new LibraryElementImpl(null, null, null, null)
-      ..definingCompilationUnit = unit;
-
-    driver.libraryMap[uri] = library;
-    expect(await session.getLibraryByUri(uri), library);
+    var library = await session.getLibraryByUri('package:test/test.dart');
+    expect(library.getType('A'), isNotNull);
+    expect(library.getType('B'), isNotNull);
+    expect(library.getType('C'), isNull);
   }
 
-  test_getParsedAst() async {
-    ParseResult result =
-        new ParseResult(null, null, null, null, null, null, null, null);
-    driver.parseResult = result;
-    expect(await session.getParsedAst('path'), result);
+  test_getParsedLibrary() async {
+    newFile(testPath, content: r'''
+class A {}
+class B {}
+''');
+
+    var parsedLibrary = session.getParsedLibrary(testPath);
+    expect(parsedLibrary.session, session);
+    expect(parsedLibrary.path, testPath);
+    expect(parsedLibrary.uri, Uri.parse('package:test/test.dart'));
+
+    expect(parsedLibrary.units, hasLength(1));
+    {
+      var parsedUnit = parsedLibrary.units[0];
+      expect(parsedUnit.session, session);
+      expect(parsedUnit.path, testPath);
+      expect(parsedUnit.uri, Uri.parse('package:test/test.dart'));
+      expect(parsedUnit.unit.declarations, hasLength(2));
+    }
   }
 
-  test_getResolvedAst() async {
-    AnalysisResult result = new AnalysisResult(driver, null, null, null, null,
-        null, null, null, null, null, null, null);
-    driver.result = result;
-    expect(await session.getResolvedAst('path'), result);
+  test_getParsedLibrary_getElementDeclaration_class() async {
+    newFile(testPath, content: r'''
+class A {}
+class B {}
+''');
+
+    var library = await session.getLibraryByUri('package:test/test.dart');
+    var parsedLibrary = session.getParsedLibrary(testPath);
+
+    var element = library.getType('A');
+    var declaration = parsedLibrary.getElementDeclaration(element);
+    ClassDeclaration node = declaration.node;
+    expect(node.name.name, 'A');
+    expect(node.offset, 0);
+    expect(node.length, 10);
+  }
+
+  test_getParsedLibrary_getElementDeclaration_notThisLibrary() async {
+    newFile(testPath, content: '');
+
+    var parsedLibrary = await session.getParsedLibrary(testPath);
+
+    var typeProvider = await session.typeProvider;
+    var intClass = typeProvider.intType.element;
+
+    expect(() {
+      parsedLibrary.getElementDeclaration(intClass);
+    }, throwsArgumentError);
+  }
+
+  test_getParsedLibrary_getElementDeclaration_synthetic() async {
+    newFile(testPath, content: r'''
+int foo = 0;
+''');
+
+    var parsedLibrary = session.getParsedLibrary(testPath);
+
+    var unitElement = (await session.getUnitElement(testPath)).element;
+    var fooElement = unitElement.topLevelVariables[0];
+    expect(fooElement.name, 'foo');
+
+    // We can get the variable element declaration.
+    var fooDeclaration = parsedLibrary.getElementDeclaration(fooElement);
+    VariableDeclaration fooNode = fooDeclaration.node;
+    expect(fooNode.name.name, 'foo');
+    expect(fooNode.offset, 4);
+    expect(fooNode.length, 7);
+    expect(fooNode.name.staticElement, isNull);
+
+    // Synthetic elements don't have nodes.
+    expect(parsedLibrary.getElementDeclaration(fooElement.getter), isNull);
+    expect(parsedLibrary.getElementDeclaration(fooElement.setter), isNull);
+  }
+
+  test_getParsedLibrary_invalidPartUri() async {
+    newFile(testPath, content: r'''
+part 'a.dart';
+part ':[invalid uri].dart';
+part 'c.dart';
+''');
+
+    var parsedLibrary = session.getParsedLibrary(testPath);
+
+    expect(parsedLibrary.units, hasLength(3));
+    expect(
+      parsedLibrary.units[0].path,
+      convertPath('/home/test/lib/test.dart'),
+    );
+    expect(
+      parsedLibrary.units[1].path,
+      convertPath('/home/test/lib/a.dart'),
+    );
+    expect(
+      parsedLibrary.units[2].path,
+      convertPath('/home/test/lib/c.dart'),
+    );
+  }
+
+  test_getParsedLibrary_notLibrary() async {
+    newFile(testPath, content: 'part of "a.dart";');
+
+    expect(() {
+      session.getParsedLibrary(testPath);
+    }, throwsArgumentError);
+  }
+
+  test_getParsedLibrary_parts() async {
+    var a = convertPath('/home/test/lib/a.dart');
+    var b = convertPath('/home/test/lib/b.dart');
+    var c = convertPath('/home/test/lib/c.dart');
+
+    var aContent = r'''
+part 'b.dart';
+part 'c.dart';
+
+class A {}
+''';
+
+    var bContent = r'''
+part of 'a.dart';
+
+class B1 {}
+class B2 {}
+''';
+
+    var cContent = r'''
+part of 'a.dart';
+
+class C1 {}
+class C2 {}
+class C3 {}
+''';
+
+    newFile(a, content: aContent);
+    newFile(b, content: bContent);
+    newFile(c, content: cContent);
+
+    var parsedLibrary = session.getParsedLibrary(a);
+    expect(parsedLibrary.path, a);
+    expect(parsedLibrary.uri, Uri.parse('package:test/a.dart'));
+    expect(parsedLibrary.units, hasLength(3));
+
+    {
+      var aUnit = parsedLibrary.units[0];
+      expect(aUnit.path, a);
+      expect(aUnit.uri, Uri.parse('package:test/a.dart'));
+      expect(aUnit.unit.declarations, hasLength(1));
+    }
+
+    {
+      var bUnit = parsedLibrary.units[1];
+      expect(bUnit.path, b);
+      expect(bUnit.uri, Uri.parse('package:test/b.dart'));
+      expect(bUnit.unit.declarations, hasLength(2));
+    }
+
+    {
+      var cUnit = parsedLibrary.units[2];
+      expect(cUnit.path, c);
+      expect(cUnit.uri, Uri.parse('package:test/c.dart'));
+      expect(cUnit.unit.declarations, hasLength(3));
+    }
+  }
+
+  test_getParsedLibraryByElement() async {
+    newFile(testPath, content: '');
+
+    var element = await session.getLibraryByUri('package:test/test.dart');
+
+    var parsedLibrary = session.getParsedLibraryByElement(element);
+    expect(parsedLibrary.session, session);
+    expect(parsedLibrary.path, testPath);
+    expect(parsedLibrary.uri, Uri.parse('package:test/test.dart'));
+    expect(parsedLibrary.units, hasLength(1));
+  }
+
+  test_getParsedLibraryByElement_differentSession() async {
+    newFile(testPath, content: '');
+
+    var element = await session.getLibraryByUri('package:test/test.dart');
+
+    var aaaSession =
+        contextCollection.contextFor(aaaContextPath).currentSession;
+
+    expect(() {
+      aaaSession.getParsedLibraryByElement(element);
+    }, throwsArgumentError);
+  }
+
+  test_getParsedUnit() async {
+    newFile(testPath, content: r'''
+class A {}
+class B {}
+''');
+
+    var unitResult = session.getParsedUnit(testPath);
+    expect(unitResult.session, session);
+    expect(unitResult.path, testPath);
+    expect(unitResult.uri, Uri.parse('package:test/test.dart'));
+    expect(unitResult.unit.declarations, hasLength(2));
+  }
+
+  test_getResolvedLibrary() async {
+    var a = convertPath('/home/test/lib/a.dart');
+    var b = convertPath('/home/test/lib/b.dart');
+
+    var aContent = r'''
+part 'b.dart';
+
+class A /*a*/ {}
+''';
+    newFile(a, content: aContent);
+
+    var bContent = r'''
+part of 'a.dart';
+
+class B /*b*/ {}
+class B2 extends X {}
+''';
+    newFile(b, content: bContent);
+
+    var resolvedLibrary = await session.getResolvedLibrary(a);
+    expect(resolvedLibrary.session, session);
+    expect(resolvedLibrary.path, a);
+    expect(resolvedLibrary.uri, Uri.parse('package:test/a.dart'));
+
+    var typeProvider = resolvedLibrary.typeProvider;
+    expect(typeProvider.intType.element.name, 'int');
+
+    var libraryElement = resolvedLibrary.element;
+    expect(libraryElement, isNotNull);
+
+    var aClass = libraryElement.getType('A');
+    expect(aClass, isNotNull);
+
+    var bClass = libraryElement.getType('B');
+    expect(bClass, isNotNull);
+
+    var aUnitResult = resolvedLibrary.units[0];
+    expect(aUnitResult.path, a);
+    expect(aUnitResult.uri, Uri.parse('package:test/a.dart'));
+    expect(aUnitResult.content, aContent);
+    expect(aUnitResult.unit, isNotNull);
+    expect(aUnitResult.unit.directives, hasLength(1));
+    expect(aUnitResult.unit.declarations, hasLength(1));
+    expect(aUnitResult.errors, isEmpty);
+
+    var bUnitResult = resolvedLibrary.units[1];
+    expect(bUnitResult.path, b);
+    expect(bUnitResult.uri, Uri.parse('package:test/b.dart'));
+    expect(bUnitResult.content, bContent);
+    expect(bUnitResult.unit, isNotNull);
+    expect(bUnitResult.unit.directives, hasLength(1));
+    expect(bUnitResult.unit.declarations, hasLength(2));
+    expect(bUnitResult.errors, isNotEmpty);
+
+    var aDeclaration = resolvedLibrary.getElementDeclaration(aClass);
+    ClassDeclaration aNode = aDeclaration.node;
+    expect(aNode.name.name, 'A');
+    expect(aNode.offset, 16);
+    expect(aNode.length, 16);
+    expect(aNode.name.staticElement.name, 'A');
+
+    var bDeclaration = resolvedLibrary.getElementDeclaration(bClass);
+    ClassDeclaration bNode = bDeclaration.node;
+    expect(bNode.name.name, 'B');
+    expect(bNode.offset, 19);
+    expect(bNode.length, 16);
+    expect(bNode.name.staticElement.name, 'B');
+  }
+
+  test_getResolvedLibrary_getElementDeclaration_notThisLibrary() async {
+    newFile(testPath, content: '');
+
+    var resolvedLibrary = await session.getResolvedLibrary(testPath);
+
+    expect(() {
+      var intClass = resolvedLibrary.typeProvider.intType.element;
+      resolvedLibrary.getElementDeclaration(intClass);
+    }, throwsArgumentError);
+  }
+
+  test_getResolvedLibrary_getElementDeclaration_synthetic() async {
+    newFile(testPath, content: r'''
+int foo = 0;
+''');
+
+    var resolvedLibrary = await session.getResolvedLibrary(testPath);
+    var unitElement = resolvedLibrary.element.definingCompilationUnit;
+
+    var fooElement = unitElement.topLevelVariables[0];
+    expect(fooElement.name, 'foo');
+
+    // We can get the variable element declaration.
+    var fooDeclaration = resolvedLibrary.getElementDeclaration(fooElement);
+    VariableDeclaration fooNode = fooDeclaration.node;
+    expect(fooNode.name.name, 'foo');
+    expect(fooNode.offset, 4);
+    expect(fooNode.length, 7);
+    expect(fooNode.name.staticElement.name, 'foo');
+
+    // Synthetic elements don't have nodes.
+    expect(resolvedLibrary.getElementDeclaration(fooElement.getter), isNull);
+    expect(resolvedLibrary.getElementDeclaration(fooElement.setter), isNull);
+  }
+
+  test_getResolvedLibrary_invalidPartUri() async {
+    newFile(testPath, content: r'''
+part 'a.dart';
+part ':[invalid uri].dart';
+part 'c.dart';
+''');
+
+    var resolvedLibrary = await session.getResolvedLibrary(testPath);
+
+    expect(resolvedLibrary.units, hasLength(3));
+    expect(
+      resolvedLibrary.units[0].path,
+      convertPath('/home/test/lib/test.dart'),
+    );
+    expect(
+      resolvedLibrary.units[1].path,
+      convertPath('/home/test/lib/a.dart'),
+    );
+    expect(
+      resolvedLibrary.units[2].path,
+      convertPath('/home/test/lib/c.dart'),
+    );
+  }
+
+  test_getResolvedLibrary_notLibrary() async {
+    newFile(testPath, content: 'part of "a.dart";');
+
+    expect(() {
+      session.getResolvedLibrary(testPath);
+    }, throwsArgumentError);
+  }
+
+  test_getResolvedLibraryByElement() async {
+    newFile(testPath, content: '');
+
+    var element = await session.getLibraryByUri('package:test/test.dart');
+
+    var resolvedLibrary = await session.getResolvedLibraryByElement(element);
+    expect(resolvedLibrary.session, session);
+    expect(resolvedLibrary.path, testPath);
+    expect(resolvedLibrary.uri, Uri.parse('package:test/test.dart'));
+    expect(resolvedLibrary.units, hasLength(1));
+    expect(resolvedLibrary.units[0].unit.declaredElement, isNotNull);
+  }
+
+  test_getResolvedLibraryByElement_differentSession() async {
+    newFile(testPath, content: '');
+
+    var element = await session.getLibraryByUri('package:test/test.dart');
+
+    var aaaSession =
+        contextCollection.contextFor(aaaContextPath).currentSession;
+
+    expect(() async {
+      await aaaSession.getResolvedLibraryByElement(element);
+    }, throwsArgumentError);
+  }
+
+  test_getResolvedUnit() async {
+    newFile(testPath, content: r'''
+class A {}
+class B {}
+''');
+
+    var unitResult = await session.getResolvedUnit(testPath);
+    expect(unitResult.session, session);
+    expect(unitResult.path, testPath);
+    expect(unitResult.uri, Uri.parse('package:test/test.dart'));
+    expect(unitResult.unit.declarations, hasLength(2));
+    expect(unitResult.typeProvider, isNotNull);
+    expect(unitResult.libraryElement, isNotNull);
   }
 
   test_getSourceKind() async {
-    SourceKind kind = SourceKind.LIBRARY;
-    driver.sourceKind = kind;
-    expect(await session.getSourceKind('path'), kind);
+    newFile(testPath, content: 'class C {}');
+
+    var kind = await session.getSourceKind(testPath);
+    expect(kind, SourceKind.LIBRARY);
   }
 
-  test_getTopLevelDeclarations() async {
-    List<TopLevelDeclarationInSource> declarations = [];
-    driver.topLevelDeclarations = declarations;
-    expect(await session.getTopLevelDeclarations('path'), declarations);
+  test_getSourceKind_part() async {
+    newFile(testPath, content: 'part of "a.dart";');
+
+    var kind = await session.getSourceKind(testPath);
+    expect(kind, SourceKind.PART);
   }
 
   test_getUnitElement() async {
-    UnitElementResult result =
-        new UnitElementResult(null, null, null, null, null);
-    driver.unitElementResult = result;
-    expect(await session.getUnitElement('path'), result);
+    newFile(testPath, content: r'''
+class A {}
+class B {}
+''');
+
+    var unitResult = await session.getUnitElement(testPath);
+    expect(unitResult.session, session);
+    expect(unitResult.path, testPath);
+    expect(unitResult.uri, Uri.parse('package:test/test.dart'));
+    expect(unitResult.element.types, hasLength(2));
+
+    var signature = await session.getUnitElementSignature(testPath);
+    expect(unitResult.signature, signature);
   }
 
-  test_getUnitElementSignature() async {
-    String signature = 'xyzzy';
-    driver.unitElementSignature = signature;
-    expect(await session.getUnitElementSignature('path'), signature);
-  }
-
-  test_resourceProvider() {
-    ResourceProvider resourceProvider = new MemoryResourceProvider();
-    driver.resourceProvider = resourceProvider;
+  test_resourceProvider() async {
     expect(session.resourceProvider, resourceProvider);
   }
 
-  test_sourceFactory() {
-    SourceFactory sourceFactory = new SourceFactory([]);
-    driver.sourceFactory = sourceFactory;
-    expect(session.sourceFactory, sourceFactory);
-  }
-
   test_typeProvider() async {
-    _initializeSDK();
-    expect(await session.typeProvider, isNotNull);
+    var typeProvider = await session.typeProvider;
+    expect(typeProvider.intType.element.name, 'int');
   }
 
   test_typeSystem() async {
-    _initializeSDK();
-    expect(await session.typeSystem, isNotNull);
-  }
-
-  void _initializeSDK() {
-    CompilationUnitElementImpl newUnit(String name) {
-      CompilationUnitElementImpl unit = new CompilationUnitElementImpl();
-      unit.accessors = [];
-      unit.enums = [];
-      unit.functions = [];
-      unit.typeAliases = [];
-      return unit;
-    }
-
-    ClassElementImpl newClass(String name) {
-      TypeParameterElementImpl param = new TypeParameterElementImpl('E', 0);
-      param.type = new TypeParameterTypeImpl(param);
-      ClassElementImpl element = new ClassElementImpl(name, 0);
-      element.typeParameters = [param];
-      return element;
-    }
-
-    {
-      CompilationUnitElementImpl coreUnit = newUnit('dart.core');
-      coreUnit.types = <ClassElement>[newClass('Iterable')];
-      LibraryElementImpl core = new LibraryElementImpl(null, null, null, null);
-      core.definingCompilationUnit = coreUnit;
-      driver.libraryMap['dart:core'] = core;
-    }
-    {
-      CompilationUnitElementImpl asyncUnit = newUnit('dart.async');
-      asyncUnit.types = <ClassElement>[
-        newClass('Future'),
-        newClass('FutureOr'),
-        newClass('Stream')
-      ];
-      LibraryElementImpl async = new LibraryElementImpl(null, null, null, null);
-      async.definingCompilationUnit = asyncUnit;
-      driver.libraryMap['dart:async'] = async;
-    }
-  }
-}
-
-class MockAnalysisDriver implements AnalysisDriver {
-  @override
-  AnalysisSession currentSession;
-
-  ErrorsResult errorsResult;
-  Map<String, LibraryElement> libraryMap = <String, LibraryElement>{};
-  ParseResult parseResult;
-  ResourceProvider resourceProvider;
-  AnalysisResult result;
-  SourceFactory sourceFactory;
-  SourceKind sourceKind;
-  List<TopLevelDeclarationInSource> topLevelDeclarations;
-  UnitElementResult unitElementResult;
-  String unitElementSignature;
-
-  AnalysisOptions get analysisOptions => new AnalysisOptionsImpl();
-
-  @override
-  Future<ErrorsResult> getErrors(String path) async {
-    return errorsResult;
-  }
-
-  @override
-  Future<LibraryElement> getLibraryByUri(String uri) async {
-    return libraryMap[uri];
-  }
-
-  @override
-  Future<AnalysisResult> getResult(String path,
-      {bool sendCachedToStream: false}) async {
-    return result;
-  }
-
-  @override
-  Future<SourceKind> getSourceKind(String path) async {
-    return sourceKind;
-  }
-
-  @override
-  Future<List<TopLevelDeclarationInSource>> getTopLevelNameDeclarations(
-      String name) async {
-    return topLevelDeclarations;
-  }
-
-  @override
-  Future<UnitElementResult> getUnitElement(String path) async {
-    return unitElementResult;
-  }
-
-  @override
-  Future<String> getUnitElementSignature(String path) async {
-    return unitElementSignature;
-  }
-
-  @override
-  dynamic noSuchMethod(Invocation invocation) {
-    fail('Unexpected invocation of ${invocation.memberName}');
-  }
-
-  @override
-  Future<ParseResult> parseFile(String path) async {
-    return parseResult;
-  }
-
-  @override
-  ParseResult parseFileSync(String path) {
-    return parseResult;
-  }
-}
-
-class _SourceMock implements Source {
-  @override
-  final Uri uri;
-
-  _SourceMock(this.uri);
-
-  @override
-  noSuchMethod(Invocation invocation) {
-    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+    var typeSystem = await session.typeSystem;
+    var typeProvider = typeSystem.typeProvider;
+    expect(
+      typeSystem.isSubtypeOf(typeProvider.intType, typeProvider.numType),
+      isTrue,
+    );
   }
 }
diff --git a/pkg/analyzer/test/src/dart/analysis/test_all.dart b/pkg/analyzer/test/src/dart/analysis/test_all.dart
index a8e0105..77d968e 100644
--- a/pkg/analyzer/test/src/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/src/dart/analysis/test_all.dart
@@ -12,14 +12,15 @@
 import 'context_root_test.dart' as context_root;
 import 'crc32_test.dart' as crc32_test;
 import 'defined_names_test.dart' as defined_names;
+import 'dependency/test_all.dart' as dependency_test;
 import 'driver_resolution_test.dart' as driver_resolution;
 import 'driver_test.dart' as driver;
+import 'experiments_test.dart' as experiments_test;
 import 'file_byte_store_test.dart' as file_byte_store_test;
 import 'file_state_test.dart' as file_state;
 import 'fletcher16_test.dart' as fletcher16_test;
 import 'index_test.dart' as index;
 import 'mutex_test.dart' as mutex;
-import 'protected_file_byte_store_test.dart' as protected_file_byte_store_test;
 import 'referenced_names_test.dart' as referenced_names;
 import 'search_test.dart' as search;
 import 'session_helper_test.dart' as session_helper;
@@ -36,14 +37,15 @@
     context_root.main();
     crc32_test.main();
     defined_names.main();
+    dependency_test.main();
     driver.main();
     driver_resolution.main();
+    experiments_test.main();
     file_byte_store_test.main();
     file_state.main();
     fletcher16_test.main();
     index.main();
     mutex.main();
-    protected_file_byte_store_test.main();
     referenced_names.main();
     search.main();
     session.main();
diff --git a/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart b/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
index f400cee..c7e291e 100644
--- a/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/uri_converter_test.dart
@@ -3,18 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/context/context_root.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/uri_converter.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../context/mock_sdk.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(DriverBasedUriConverterTest);
@@ -22,12 +20,10 @@
 }
 
 @reflectiveTest
-class DriverBasedUriConverterTest extends Object with ResourceProviderMixin {
+class DriverBasedUriConverterTest with ResourceProviderMixin {
   DriverBasedUriConverter uriConverter;
 
   void setUp() {
-    resourceProvider = new MemoryResourceProvider();
-
     Folder barFolder = newFolder('/packages/bar/lib');
     Folder fooFolder = newFolder('/packages/foo/lib');
 
diff --git a/pkg/analyzer/test/src/dart/ast/ast_test.dart b/pkg/analyzer/test/src/dart/ast/ast_test.dart
index 1bbecda..f0a6265 100644
--- a/pkg/analyzer/test/src/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/ast_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,7 +6,6 @@
 
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -472,102 +471,24 @@
 
   bool get enableNewAnalysisDriver => true;
 
-  void assertCanBeConst(String snippet, bool expectedResult) {
-    int index = testSource.indexOf(snippet);
-    expect(index >= 0, isTrue);
-    NodeLocator visitor = new NodeLocator(index);
-    AstNodeImpl node = visitor.searchWithin(testUnit);
-    node = node.getAncestor((node) => node is InstanceCreationExpressionImpl);
-    expect(node, isNotNull);
-    expect((node as InstanceCreationExpressionImpl).canBeConst(),
-        expectedResult ? isTrue : isFalse);
-  }
-
   void assertIsConst(String snippet, bool expectedResult) {
     int index = testSource.indexOf(snippet);
     expect(index >= 0, isTrue);
     NodeLocator visitor = new NodeLocator(index);
     AstNodeImpl node = visitor.searchWithin(testUnit);
-    node = node.getAncestor((node) => node is InstanceCreationExpressionImpl);
+    node = node.thisOrAncestorOfType<InstanceCreationExpressionImpl>();
     expect(node, isNotNull);
     expect((node as InstanceCreationExpressionImpl).isConst,
         expectedResult ? isTrue : isFalse);
   }
 
-  void enablePreviewDart2() {
-    resetWith(options: new AnalysisOptionsImpl()..previewDart2 = true);
-  }
-
   Future<void> resolve(String source) async {
     testSource = source;
     testUnit = await resolveSource2('/test.dart', source);
   }
 
-  void test_canBeConst_false_argument_invocation() async {
-    enablePreviewDart2();
-    await resolve('''
-class A {}
-class B {
-  const B(A a);
-}
-A f() => A();
-B g() => B(f());
-''');
-    assertCanBeConst("B(f", false);
-  }
-
-  void test_canBeConst_false_argument_invocationInList() async {
-    enablePreviewDart2();
-    await resolve('''
-class A {}
-class B {
-  const B(a);
-}
-A f() => A();
-B g() => B([f()]);
-''');
-    assertCanBeConst("B([", false);
-  }
-
-  void test_canBeConst_false_argument_nonConstConstructor() async {
-    enablePreviewDart2();
-    await resolve('''
-class A {}
-class B {
-  const B(A a);
-}
-B f() => B(A());
-''');
-    assertCanBeConst("B(A(", false);
-  }
-
-  void test_canBeConst_false_nonConstConstructor() async {
-    enablePreviewDart2();
-    await resolve('''
-class A {}
-A f() => A();
-''');
-    assertCanBeConst("A(", false);
-  }
-
-  @failingTest
-  void test_canBeConst_true_argument_constConstructor() async {
-    enablePreviewDart2();
-    await resolve('''
-class A {
-  const A();
-}
-class B {
-  const B(A a);
-}
-B f() => B(A());
-''');
-    assertCanBeConst("B(A(", true);
-  }
-
   void
       test_isConst_notInContext_constructor_const_constParam_identifier() async {
-    enablePreviewDart2();
     await resolve('''
 var v = C(C.a);
 class C {
@@ -580,7 +501,6 @@
   }
 
   void test_isConst_notInContext_constructor_const_constParam_named() async {
-    enablePreviewDart2();
     await resolve('''
 var v = C(c: C());
 class C {
@@ -592,7 +512,6 @@
 
   void
       test_isConst_notInContext_constructor_const_constParam_named_parens() async {
-    enablePreviewDart2();
     await resolve('''
 var v = C(c: (C()));
 class C {
@@ -603,7 +522,6 @@
   }
 
   void test_isConst_notInContext_constructor_const_constParam_parens() async {
-    enablePreviewDart2();
     await resolve('''
 var v = C( (C.c()) );
 class C {
@@ -615,7 +533,6 @@
   }
 
   void test_isConst_notInContext_constructor_const_generic_named() async {
-    enablePreviewDart2();
     await resolve('''
 f() => <Object>[C<int>.n()];
 class C<E> {
@@ -627,7 +544,6 @@
 
   void
       test_isConst_notInContext_constructor_const_generic_named_prefixed() async {
-    enablePreviewDart2();
     addNamedSource('/c.dart', '''
 class C<E> {
   const C.n();
@@ -641,7 +557,6 @@
   }
 
   void test_isConst_notInContext_constructor_const_generic_unnamed() async {
-    enablePreviewDart2();
     await resolve('''
 f() => <Object>[C<int>()];
 class C<E> {
@@ -653,7 +568,6 @@
 
   void
       test_isConst_notInContext_constructor_const_generic_unnamed_prefixed() async {
-    enablePreviewDart2();
     addNamedSource('/c.dart', '''
 class C<E> {
   const C();
@@ -668,7 +582,6 @@
 
   void
       test_isConst_notInContext_constructor_const_nonConstParam_constructor() async {
-    enablePreviewDart2();
     await resolve('''
 f() {
   return A(B());
@@ -687,7 +600,6 @@
 
   void
       test_isConst_notInContext_constructor_const_nonConstParam_variable() async {
-    enablePreviewDart2();
     await resolve('''
 f(int i) => <Object>[C(i)];
 class C {
@@ -699,7 +611,6 @@
   }
 
   void test_isConst_notInContext_constructor_const_nonGeneric_named() async {
-    enablePreviewDart2();
     await resolve('''
 f() => <Object>[C.n()];
 class C<E> {
@@ -711,7 +622,6 @@
 
   void
       test_isConst_notInContext_constructor_const_nonGeneric_named_prefixed() async {
-    enablePreviewDart2();
     addNamedSource('/c.dart', '''
 class C {
   const C.n();
@@ -725,7 +635,6 @@
   }
 
   void test_isConst_notInContext_constructor_const_nonGeneric_unnamed() async {
-    enablePreviewDart2();
     await resolve('''
 f() => <Object>[C()];
 class C {
@@ -737,7 +646,6 @@
 
   void
       test_isConst_notInContext_constructor_const_nonGeneric_unnamed_prefixed() async {
-    enablePreviewDart2();
     addNamedSource('/c.dart', '''
 class C {
   const C();
@@ -751,7 +659,6 @@
   }
 
   void test_isConst_notInContext_constructor_nonConst() async {
-    enablePreviewDart2();
     await resolve('''
 f() => <Object>[C()];
 class C {
diff --git a/pkg/analyzer/test/src/dart/ast/utilities_test.dart b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
index de28384..c6d4eab 100644
--- a/pkg/analyzer/test/src/dart/ast/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/utilities_test.dart
@@ -11,8 +11,6 @@
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/java_engine.dart' show Predicate;
-import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/element_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
@@ -21,6 +19,7 @@
 
 import '../../../generated/parser_test.dart' show ParserTestCase;
 import '../../../generated/test_support.dart';
+import '../../../util/ast_type_matchers.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -72,21 +71,18 @@
   }
 
   void test_binary_bitAnd() {
-    Object value = _getConstantValue("74 & 42");
-    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    expect(value as int, 74 & 42);
+    int value = _getConstantValue("74 & 42");
+    expect(value, 74 & 42);
   }
 
   void test_binary_bitOr() {
-    Object value = _getConstantValue("74 | 42");
-    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    expect(value as int, 74 | 42);
+    int value = _getConstantValue("74 | 42");
+    expect(value, 74 | 42);
   }
 
   void test_binary_bitXor() {
-    Object value = _getConstantValue("74 ^ 42");
-    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    expect(value as int, 74 ^ 42);
+    int value = _getConstantValue("74 ^ 42");
+    expect(value, 74 ^ 42);
   }
 
   void test_binary_divide_double() {
@@ -135,9 +131,8 @@
   }
 
   void test_binary_leftShift() {
-    Object value = _getConstantValue("16 << 2");
-    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    expect(value as int, 64);
+    int value = _getConstantValue("16 << 2");
+    expect(value, 64);
   }
 
   void test_binary_lessThan() {
@@ -241,9 +236,8 @@
   }
 
   void test_binary_rightShift() {
-    Object value = _getConstantValue("64 >> 2");
-    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    expect(value as int, 16);
+    int value = _getConstantValue("64 >> 2");
+    expect(value, 16);
   }
 
   void test_binary_times_double() {
@@ -257,15 +251,13 @@
   }
 
   void test_binary_truncatingDivide_double() {
-    Object value = _getConstantValue("3.2 ~/ 2.3");
-    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    expect(value as int, 1);
+    int value = _getConstantValue("3.2 ~/ 2.3");
+    expect(value, 1);
   }
 
   void test_binary_truncatingDivide_integer() {
-    Object value = _getConstantValue("10 ~/ 3");
-    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    expect(value as int, 3);
+    int value = _getConstantValue("10 ~/ 3");
+    expect(value, 3);
   }
 
   void test_literal_boolean_false() {
@@ -279,23 +271,19 @@
   }
 
   void test_literal_list() {
-    Object value = _getConstantValue("['a', 'b', 'c']");
-    EngineTestCase.assertInstanceOf((obj) => obj is List, List, value);
-    List list = value as List;
-    expect(list.length, 3);
-    expect(list[0], "a");
-    expect(list[1], "b");
-    expect(list[2], "c");
+    List value = _getConstantValue("['a', 'b', 'c']");
+    expect(value.length, 3);
+    expect(value[0], "a");
+    expect(value[1], "b");
+    expect(value[2], "c");
   }
 
   void test_literal_map() {
-    Object value = _getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
-    EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, value);
-    Map map = value as Map;
-    expect(map.length, 3);
-    expect(map["a"], "m");
-    expect(map["b"], "n");
-    expect(map["c"], "o");
+    Map value = _getConstantValue("{'a' : 'm', 'b' : 'n', 'c' : 'o'}");
+    expect(value.length, 3);
+    expect(value["a"], "m");
+    expect(value["b"], "n");
+    expect(value["c"], "o");
   }
 
   void test_literal_null() {
@@ -339,9 +327,8 @@
   }
 
   void test_unary_bitNot() {
-    Object value = _getConstantValue("~42");
-    EngineTestCase.assertInstanceOf((obj) => obj is int, int, value);
-    expect(value as int, ~42);
+    int value = _getConstantValue("~42");
+    expect(value, ~42);
   }
 
   void test_unary_logicalNot() {
@@ -411,8 +398,8 @@
 class NodeLocatorTest extends ParserTestCase {
   void test_range() {
     CompilationUnit unit = parseCompilationUnit("library myLib;");
-    _assertLocate(
-        unit, 4, 10, (node) => node is LibraryDirective, LibraryDirective);
+    var node = _assertLocate(unit, 4, 10);
+    expect(node, isLibraryDirective);
   }
 
   void test_searchWithin_null() {
@@ -422,8 +409,8 @@
 
   void test_searchWithin_offset() {
     CompilationUnit unit = parseCompilationUnit("library myLib;");
-    _assertLocate(
-        unit, 10, 10, (node) => node is SimpleIdentifier, SimpleIdentifier);
+    var node = _assertLocate(unit, 10, 10);
+    expect(node, isSimpleIdentifier);
   }
 
   void test_searchWithin_offsetAfterNode() {
@@ -444,8 +431,11 @@
     expect(node, isNull);
   }
 
-  void _assertLocate(CompilationUnit unit, int start, int end,
-      Predicate<Object> predicate, Type expectedClass) {
+  AstNode _assertLocate(
+    CompilationUnit unit,
+    int start,
+    int end,
+  ) {
     NodeLocator locator = new NodeLocator(start, end);
     AstNode node = locator.searchWithin(unit);
     expect(node, isNotNull);
@@ -453,7 +443,7 @@
     expect(node.offset <= start, isTrue, reason: "Node starts after range");
     expect(node.offset + node.length > end, isTrue,
         reason: "Node ends before range");
-    EngineTestCase.assertInstanceOf(predicate, expectedClass, node);
+    return node;
   }
 }
 
@@ -580,14 +570,14 @@
   void test_visitConstructorDeclaration() {
     String className = "A";
     String constructorName = "c";
-    ConstructorDeclaration fromNode = AstTestFactory.constructorDeclaration(
+    ConstructorDeclarationImpl fromNode = AstTestFactory.constructorDeclaration(
         AstTestFactory.identifier3(className),
         constructorName,
         AstTestFactory.formalParameterList(),
         null);
     ConstructorElement element = ElementFactory.constructorElement2(
         ElementFactory.classElement2(className), constructorName);
-    fromNode.element = element;
+    fromNode.declaredElement = element;
     ConstructorDeclaration toNode = AstTestFactory.constructorDeclaration(
         AstTestFactory.identifier3(className),
         constructorName,
@@ -628,12 +618,12 @@
   }
 
   void test_visitFunctionExpression() {
-    FunctionExpression fromNode = AstTestFactory.functionExpression2(
+    FunctionExpressionImpl fromNode = AstTestFactory.functionExpression2(
         AstTestFactory.formalParameterList(),
         AstTestFactory.emptyFunctionBody());
     MethodElement element = ElementFactory.methodElement(
         "m", ElementFactory.classElement2("C").type);
-    fromNode.element = element;
+    fromNode.declaredElement = element;
     DartType staticType = ElementFactory.classElement2("C").type;
     fromNode.staticType = staticType;
     FunctionExpression toNode = AstTestFactory.functionExpression2(
@@ -805,7 +795,7 @@
   void test_visitPartDirective() {
     PartDirective fromNode = AstTestFactory.partDirective2("part.dart");
     LibraryElement element = new LibraryElementImpl.forNode(
-        null, AstTestFactory.libraryIdentifier2(["lib"]));
+        null, null, AstTestFactory.libraryIdentifier2(["lib"]));
     fromNode.element = element;
     PartDirective toNode = AstTestFactory.partDirective2("part.dart");
     ResolutionCopier.copyResolutionData(fromNode, toNode);
@@ -816,7 +806,7 @@
     PartOfDirective fromNode = AstTestFactory.partOfDirective(
         AstTestFactory.libraryIdentifier2(["lib"]));
     LibraryElement element = new LibraryElementImpl.forNode(
-        null, AstTestFactory.libraryIdentifier2(["lib"]));
+        null, null, AstTestFactory.libraryIdentifier2(["lib"]));
     fromNode.element = element;
     PartOfDirective toNode = AstTestFactory.partOfDirective(
         AstTestFactory.libraryIdentifier2(["lib"]));
@@ -2404,6 +2394,19 @@
             ])));
   }
 
+  void test_visitGenericFunctionType_withQuestion() {
+    _assertSource(
+        "int Function<T>(T)?",
+        AstTestFactory.genericFunctionType(
+            AstTestFactory.typeName4("int"),
+            AstTestFactory.typeParameterList(['T']),
+            AstTestFactory.formalParameterList([
+              AstTestFactory.simpleFormalParameter4(
+                  AstTestFactory.typeName4("T"), null)
+            ]),
+            question: true));
+  }
+
   void test_visitGenericTypeAlias() {
     _assertSource(
         "typedef X<S> = S Function<T>(T)",
@@ -3260,11 +3263,20 @@
     _assertSource("C", AstTestFactory.typeName4("C"));
   }
 
+  void test_visitTypeName_noArgs_withQuestion() {
+    _assertSource("C?", AstTestFactory.typeName4("C", null, true));
+  }
+
   void test_visitTypeName_singleArg() {
     _assertSource(
         "C<D>", AstTestFactory.typeName4("C", [AstTestFactory.typeName4("D")]));
   }
 
+  void test_visitTypeName_singleArg_withQuestion() {
+    _assertSource("C<D>?",
+        AstTestFactory.typeName4("C", [AstTestFactory.typeName4("D")], true));
+  }
+
   void test_visitTypeParameter_withExtends() {
     _assertSource("E extends C",
         AstTestFactory.typeParameter2("E", AstTestFactory.typeName4("C")));
@@ -4790,6 +4802,19 @@
             ])));
   }
 
+  void test_visitGenericFunctionType_withQuestion() {
+    _assertSource(
+        "int Function<T>(T)?",
+        AstTestFactory.genericFunctionType(
+            AstTestFactory.typeName4("int"),
+            AstTestFactory.typeParameterList(['T']),
+            AstTestFactory.formalParameterList([
+              AstTestFactory.simpleFormalParameter4(
+                  AstTestFactory.typeName4("T"), null)
+            ]),
+            question: true));
+  }
+
   void test_visitGenericTypeAlias() {
     _assertSource(
         "typedef X<S> = S Function<T>(T)",
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index 0a08cae..94176f6 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,9 +6,12 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/constant.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
@@ -24,12 +27,208 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ConstantVisitorTest);
+    defineReflectiveTests(ConstantVisitorTest_Driver);
+    defineReflectiveTests(ConstantVisitorWithConstantUpdate2018Test);
   });
 }
 
 @reflectiveTest
-class ConstantVisitorTest extends ResolverTestCase {
-  test_visitBinaryExpression_questionQuestion_notNull_notNull() async {
+class ConstantVisitorTest extends ConstantVisitorTestSupport {
+  test_visitAsExpression_instanceOfSameClass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a as A;
+class A {
+  const A();
+}
+''');
+    DartObjectImpl resultA = _evaluateConstant(compilationUnit, 'a',
+        experiments: [EnableString.constant_update_2018]);
+    DartObjectImpl resultB = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(resultB, resultA);
+  }
+
+  test_visitAsExpression_instanceOfSubclass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const B();
+const b = a as A;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl resultA = _evaluateConstant(compilationUnit, 'a',
+        experiments: [EnableString.constant_update_2018]);
+    DartObjectImpl resultB = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(resultB, resultA);
+  }
+
+  test_visitAsExpression_instanceOfSuperclass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a as B;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION],
+        experiments: [EnableString.constant_update_2018]);
+    expect(result, isNull);
+  }
+
+  test_visitAsExpression_instanceOfUnrelatedClass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a as B;
+class A {
+  const A();
+}
+class B {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION],
+        experiments: [EnableString.constant_update_2018]);
+    expect(result, isNull);
+  }
+
+  test_visitAsExpression_null() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = null;
+const b = a as A;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.nullType);
+  }
+
+  test_visitBinaryExpression_and_bool_known_known() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = false & true;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_and_bool_known_unknown() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const b = bool.fromEnvironment('y');
+const c = false & b;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_and_bool_unknown_known() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = bool.fromEnvironment('x');
+const c = a & true;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_and_bool_unknown_unknown() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a & b;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_and_int() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 3 & 5;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+  }
+
+  test_visitBinaryExpression_and_mixed() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 3 & false;
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitBinaryExpression_or_bool_known_known() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = false | true;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_or_bool_known_unknown() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const b = bool.fromEnvironment('y');
+const c = false | b;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_or_bool_unknown_known() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = bool.fromEnvironment('x');
+const c = a | true;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_or_bool_unknown_unknown() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a | b;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_or_int() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 3 | 5;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+  }
+
+  test_visitBinaryExpression_or_mixed() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 3 | false;
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitBinaryExpression_questionQuestion_eager_notNull_notNull() async {
     Expression left = AstTestFactory.string2('a');
     Expression right = AstTestFactory.string2('b');
     Expression expression = AstTestFactory.binaryExpression(
@@ -45,7 +244,7 @@
     errorListener.assertNoErrors();
   }
 
-  test_visitBinaryExpression_questionQuestion_null_notNull() async {
+  test_visitBinaryExpression_questionQuestion_eager_null_notNull() async {
     Expression left = AstTestFactory.nullLiteral();
     Expression right = AstTestFactory.string2('b');
     Expression expression = AstTestFactory.binaryExpression(
@@ -61,7 +260,7 @@
     errorListener.assertNoErrors();
   }
 
-  test_visitBinaryExpression_questionQuestion_null_null() async {
+  test_visitBinaryExpression_questionQuestion_eager_null_null() async {
     Expression left = AstTestFactory.nullLiteral();
     Expression right = AstTestFactory.nullLiteral();
     Expression expression = AstTestFactory.binaryExpression(
@@ -76,7 +275,115 @@
     errorListener.assertNoErrors();
   }
 
-  test_visitConditionalExpression_false() async {
+  test_visitBinaryExpression_questionQuestion_lazy_notNull_invalid() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 'a' ?? new C();
+class C {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.stringType);
+    expect(result.toStringValue(), 'a');
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_notNull_notNull() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 'a' ?? 'b';
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.stringType);
+    expect(result.toStringValue(), 'a');
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_null_invalid() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = null ?? new C();
+class C {}
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_null_notNull() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = null ?? 'b';
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.stringType);
+    expect(result.toStringValue(), 'b');
+  }
+
+  test_visitBinaryExpression_questionQuestion_lazy_null_null() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = null ?? null;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.isNull, isTrue);
+  }
+
+  test_visitBinaryExpression_xor_bool_known_known() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = false ^ true;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_xor_bool_known_unknown() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const b = bool.fromEnvironment('y');
+const c = false ^ b;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_xor_bool_unknown_known() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = bool.fromEnvironment('x');
+const c = a ^ true;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_xor_bool_unknown_unknown() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a ^ b;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+  }
+
+  test_visitBinaryExpression_xor_int() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 3 ^ 5;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+  }
+
+  test_visitBinaryExpression_xor_mixed() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 3 ^ false;
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitConditionalExpression_eager_false_int_int() async {
     Expression thenExpression = AstTestFactory.integer(1);
     Expression elseExpression = AstTestFactory.integer(0);
     ConditionalExpression expression = AstTestFactory.conditionalExpression(
@@ -88,7 +395,7 @@
     errorListener.assertNoErrors();
   }
 
-  test_visitConditionalExpression_nonBooleanCondition() async {
+  test_visitConditionalExpression_eager_invalid_int_int() async {
     Expression thenExpression = AstTestFactory.integer(1);
     Expression elseExpression = AstTestFactory.integer(0);
     NullLiteral conditionExpression = AstTestFactory.nullLiteral();
@@ -103,7 +410,19 @@
         .assertErrorsWithCodes([CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
   }
 
-  test_visitConditionalExpression_nonConstantElse() async {
+  test_visitConditionalExpression_eager_true_int_int() async {
+    Expression thenExpression = AstTestFactory.integer(1);
+    Expression elseExpression = AstTestFactory.integer(0);
+    ConditionalExpression expression = AstTestFactory.conditionalExpression(
+        AstTestFactory.booleanLiteral(true), thenExpression, elseExpression);
+    GatheringErrorListener errorListener = new GatheringErrorListener();
+    ErrorReporter errorReporter =
+        new ErrorReporter(errorListener, _dummySource());
+    _assertValue(1, _evaluate(expression, errorReporter));
+    errorListener.assertNoErrors();
+  }
+
+  test_visitConditionalExpression_eager_true_int_invalid() async {
     Expression thenExpression = AstTestFactory.integer(1);
     Expression elseExpression = AstTestFactory.identifier3("x");
     ConditionalExpression expression = AstTestFactory.conditionalExpression(
@@ -117,7 +436,7 @@
         .assertErrorsWithCodes([CompileTimeErrorCode.INVALID_CONSTANT]);
   }
 
-  test_visitConditionalExpression_nonConstantThen() async {
+  test_visitConditionalExpression_eager_true_invalid_int() async {
     Expression thenExpression = AstTestFactory.identifier3("x");
     Expression elseExpression = AstTestFactory.integer(0);
     ConditionalExpression expression = AstTestFactory.conditionalExpression(
@@ -131,16 +450,272 @@
         .assertErrorsWithCodes([CompileTimeErrorCode.INVALID_CONSTANT]);
   }
 
-  test_visitConditionalExpression_true() async {
-    Expression thenExpression = AstTestFactory.integer(1);
-    Expression elseExpression = AstTestFactory.integer(0);
-    ConditionalExpression expression = AstTestFactory.conditionalExpression(
-        AstTestFactory.booleanLiteral(true), thenExpression, elseExpression);
-    GatheringErrorListener errorListener = new GatheringErrorListener();
-    ErrorReporter errorReporter =
-        new ErrorReporter(errorListener, _dummySource());
-    _assertValue(1, _evaluate(expression, errorReporter));
-    errorListener.assertNoErrors();
+  test_visitConditionalExpression_lazy_false_int_int() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = false ? 1 : 0;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitConditionalExpression_lazy_false_int_invalid() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = false ? 1 : new C();
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitConditionalExpression_lazy_false_invalid_int() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = false ? new C() : 0;
+class C {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitConditionalExpression_lazy_invalid_int_int() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 3 ? 1 : 0;
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitConditionalExpression_lazy_true_int_int() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = true ? 1 : 0;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 1);
+  }
+
+  test_visitConditionalExpression_lazy_true_int_invalid() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = true ? 1 : new C();
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 1);
+  }
+
+  test_visitConditionalExpression_lazy_true_invalid_int() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = true ? new C() : 0;
+class C {}
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitIntegerLiteral() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const double d = 3;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'd');
+    expect(result.type, typeProvider.doubleType);
+    expect(result.toDoubleValue(), 3.0);
+  }
+
+  test_visitIsExpression_is_instanceOfSameClass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a is A;
+class A {
+  const A();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_is_instanceOfSubclass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const B();
+const b = a is A;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_is_instanceOfSuperclass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a is B;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_is_instanceOfUnrelatedClass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a is B;
+class A {
+  const A();
+}
+class B {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_is_null() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = null;
+const b = a is A;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_is_null_dynamic() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = null;
+const b = a is dynamic;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_is_null_null() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = null;
+const b = a is Null;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_is_null_object() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = null;
+const b = a is Object;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_isNot_instanceOfSameClass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a is! A;
+class A {
+  const A();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_isNot_instanceOfSubclass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const B();
+const b = a is! A;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), false);
+  }
+
+  test_visitIsExpression_isNot_instanceOfSuperclass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a is! B;
+class A {
+  const A();
+}
+class B extends A {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_isNot_instanceOfUnrelatedClass() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = const A();
+const b = a is! B;
+class A {
+  const A();
+}
+class B {
+  const B();
+}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
+  }
+
+  test_visitIsExpression_isNot_null() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const a = null;
+const b = a is! A;
+class A {}
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.boolType);
+    expect(result.toBoolValue(), true);
   }
 
   test_visitSimpleIdentifier_className() async {
@@ -148,7 +723,7 @@
 const a = C;
 class C {}
 ''');
-    DartObjectImpl result = _evaluateConstant(compilationUnit, 'a', null);
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'a');
     expect(result.type, typeProvider.typeType);
     expect(result.toTypeValue().name, 'C');
   }
@@ -157,7 +732,7 @@
     CompilationUnit compilationUnit = await resolveSource('''
 const a = dynamic;
 ''');
-    DartObjectImpl result = _evaluateConstant(compilationUnit, 'a', null);
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'a');
     expect(result.type, typeProvider.typeType);
     expect(result.toTypeValue(), typeProvider.dynamicType);
   }
@@ -170,7 +745,10 @@
     DartObjectImpl six =
         new DartObjectImpl(typeProvider.intType, new IntState(6));
     environment["b"] = six;
-    _assertValue(6, _evaluateConstant(compilationUnit, "a", environment));
+    _assertValue(
+        6,
+        _evaluateConstant(compilationUnit, "a",
+            lexicalEnvironment: environment));
   }
 
   test_visitSimpleIdentifier_notInEnvironment() async {
@@ -181,14 +759,17 @@
     DartObjectImpl six =
         new DartObjectImpl(typeProvider.intType, new IntState(6));
     environment["c"] = six;
-    _assertValue(3, _evaluateConstant(compilationUnit, "a", environment));
+    _assertValue(
+        3,
+        _evaluateConstant(compilationUnit, "a",
+            lexicalEnvironment: environment));
   }
 
   test_visitSimpleIdentifier_withoutEnvironment() async {
     CompilationUnit compilationUnit = await resolveSource(r'''
 const a = b;
 const b = 3;''');
-    _assertValue(3, _evaluateConstant(compilationUnit, "a", null));
+    _assertValue(3, _evaluateConstant(compilationUnit, "a"));
   }
 
   void _assertValue(int expectedValue, DartObjectImpl result) {
@@ -206,24 +787,132 @@
     TestTypeProvider typeProvider = new TestTypeProvider();
     return expression.accept(new ConstantVisitor(
         new ConstantEvaluationEngine(typeProvider, new DeclaredVariables(),
-            typeSystem: new StrongTypeSystemImpl(typeProvider)),
+            typeSystem: new Dart2TypeSystem(typeProvider)),
         errorReporter));
   }
+}
 
+@reflectiveTest
+class ConstantVisitorTest_Driver extends ConstantVisitorTest {
+  bool get enableNewAnalysisDriver => true;
+}
+
+class ConstantVisitorTestSupport extends ResolverTestCase {
   DartObjectImpl _evaluateConstant(CompilationUnit compilationUnit, String name,
-      Map<String, DartObjectImpl> lexicalEnvironment) {
+      {List<ErrorCode> errorCodes,
+      List<String> experiments,
+      Map<String, DartObjectImpl> lexicalEnvironment}) {
     Source source =
         resolutionMap.elementDeclaredByCompilationUnit(compilationUnit).source;
     Expression expression =
         findTopLevelConstantExpression(compilationUnit, name);
+
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    if (experiments != null) {
+      options..enabledExperiments = experiments;
+    }
+
     GatheringErrorListener errorListener = new GatheringErrorListener();
     ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
+
     DartObjectImpl result = expression.accept(new ConstantVisitor(
         new ConstantEvaluationEngine(typeProvider, new DeclaredVariables(),
-            typeSystem: typeSystem),
+            experimentStatus: options.experimentStatus, typeSystem: typeSystem),
         errorReporter,
         lexicalEnvironment: lexicalEnvironment));
-    errorListener.assertNoErrors();
+    if (errorCodes == null) {
+      errorListener.assertNoErrors();
+    } else {
+      errorListener.assertErrorsWithCodes(errorCodes);
+    }
     return result;
   }
 }
+
+@reflectiveTest
+class ConstantVisitorWithConstantUpdate2018Test
+    extends ConstantVisitorTestSupport {
+  @override
+  List<String> get enabledExperiments => [EnableString.constant_update_2018];
+
+  bool get enableNewAnalysisDriver => true;
+
+  test_visitBinaryExpression_gtGtGt_negative_fewerBits() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 0xFFFFFFFF >>> 8;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0xFFFFFF);
+  }
+
+  test_visitBinaryExpression_gtGtGt_negative_moreBits() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 0xFFFFFFFF >>> 33;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitBinaryExpression_gtGtGt_negative_negativeBits() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 0xFFFFFFFF >>> -2;
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitBinaryExpression_gtGtGt_negative_zeroBits() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 0xFFFFFFFF >>> 0;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0xFFFFFFFF);
+  }
+
+//  @soloTest
+  test_visitBinaryExpression_gtGtGt_positive_fewerBits() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 0xFF >>> 3;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0x1F);
+  }
+
+  test_visitBinaryExpression_gtGtGt_positive_moreBits() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 0xFF >>> 9;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0);
+  }
+
+  test_visitBinaryExpression_gtGtGt_positive_negativeBits() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 0xFF >>> -2;
+''');
+    _evaluateConstant(compilationUnit, 'c',
+        errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION],
+        experiments: [EnableString.constant_update_2018]);
+  }
+
+  test_visitBinaryExpression_gtGtGt_positive_zeroBits() async {
+    CompilationUnit compilationUnit = await resolveSource('''
+const c = 0xFF >>> 0;
+''');
+    DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
+        experiments: [EnableString.constant_update_2018]);
+    expect(result.type, typeProvider.intType);
+    expect(result.toIntValue(), 0xFF);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/constant/utilities_test.dart b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
index 05e7d25..0fa3898 100644
--- a/pkg/analyzer/test/src/dart/constant/utilities_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/utilities_test.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/constant.dart';
@@ -191,7 +192,7 @@
 
   ConstructorElement _setupConstructorDeclaration(String name, bool isConst) {
     Keyword constKeyword = isConst ? Keyword.CONST : null;
-    ConstructorDeclaration constructorDeclaration =
+    ConstructorDeclarationImpl constructorDeclaration =
         AstTestFactory.constructorDeclaration2(
             constKeyword,
             null,
@@ -203,7 +204,7 @@
     ClassElement classElement = ElementFactory.classElement2(name);
     ConstructorElement element =
         ElementFactory.constructorElement(classElement, name, isConst);
-    constructorDeclaration.element = element;
+    constructorDeclaration.declaredElement = element;
     _node = constructorDeclaration;
     return element;
   }
@@ -234,7 +235,7 @@
     classElement.fields = <FieldElement>[fieldElement];
     classDeclaration.name.staticElement = classElement;
     if (hasConstConstructor) {
-      ConstructorDeclaration constructorDeclaration =
+      ConstructorDeclarationImpl constructorDeclaration =
           AstTestFactory.constructorDeclaration2(
               Keyword.CONST,
               null,
@@ -246,7 +247,7 @@
       classDeclaration.members.add(constructorDeclaration);
       ConstructorElement constructorElement =
           ElementFactory.constructorElement(classElement, '', true);
-      constructorDeclaration.element = constructorElement;
+      constructorDeclaration.declaredElement = constructorElement;
       classElement.constructors = <ConstructorElement>[constructorElement];
     } else {
       classElement.constructors = const <ConstructorElement>[];
diff --git a/pkg/analyzer/test/src/dart/constant/value_test.dart b/pkg/analyzer/test/src/dart/constant/value_test.dart
index 1883704..b6c7046 100644
--- a/pkg/analyzer/test/src/dart/constant/value_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/value_test.dart
@@ -94,27 +94,27 @@
   }
 
   void test_bitAnd_knownInt_knownInt() {
-    _assertBitAnd(_intValue(2), _intValue(6), _intValue(3));
+    _assertEagerAnd(_intValue(2), _intValue(6), _intValue(3));
   }
 
   void test_bitAnd_knownInt_knownString() {
-    _assertBitAnd(null, _intValue(6), _stringValue("3"));
+    _assertEagerAnd(null, _intValue(6), _stringValue("3"));
   }
 
   void test_bitAnd_knownInt_unknownInt() {
-    _assertBitAnd(_intValue(null), _intValue(6), _intValue(null));
+    _assertEagerAnd(_intValue(null), _intValue(6), _intValue(null));
   }
 
   void test_bitAnd_knownString_knownInt() {
-    _assertBitAnd(null, _stringValue("6"), _intValue(3));
+    _assertEagerAnd(null, _stringValue("6"), _intValue(3));
   }
 
   void test_bitAnd_unknownInt_knownInt() {
-    _assertBitAnd(_intValue(null), _intValue(null), _intValue(3));
+    _assertEagerAnd(_intValue(null), _intValue(null), _intValue(3));
   }
 
   void test_bitAnd_unknownInt_unknownInt() {
-    _assertBitAnd(_intValue(null), _intValue(null), _intValue(null));
+    _assertEagerAnd(_intValue(null), _intValue(null), _intValue(null));
   }
 
   void test_bitNot_knownInt() {
@@ -130,51 +130,51 @@
   }
 
   void test_bitOr_knownInt_knownInt() {
-    _assertBitOr(_intValue(7), _intValue(6), _intValue(3));
+    _assertEagerOr(_intValue(7), _intValue(6), _intValue(3));
   }
 
   void test_bitOr_knownInt_knownString() {
-    _assertBitOr(null, _intValue(6), _stringValue("3"));
+    _assertEagerOr(null, _intValue(6), _stringValue("3"));
   }
 
   void test_bitOr_knownInt_unknownInt() {
-    _assertBitOr(_intValue(null), _intValue(6), _intValue(null));
+    _assertEagerOr(_intValue(null), _intValue(6), _intValue(null));
   }
 
   void test_bitOr_knownString_knownInt() {
-    _assertBitOr(null, _stringValue("6"), _intValue(3));
+    _assertEagerOr(null, _stringValue("6"), _intValue(3));
   }
 
   void test_bitOr_unknownInt_knownInt() {
-    _assertBitOr(_intValue(null), _intValue(null), _intValue(3));
+    _assertEagerOr(_intValue(null), _intValue(null), _intValue(3));
   }
 
   void test_bitOr_unknownInt_unknownInt() {
-    _assertBitOr(_intValue(null), _intValue(null), _intValue(null));
+    _assertEagerOr(_intValue(null), _intValue(null), _intValue(null));
   }
 
   void test_bitXor_knownInt_knownInt() {
-    _assertBitXor(_intValue(5), _intValue(6), _intValue(3));
+    _assertEagerXor(_intValue(5), _intValue(6), _intValue(3));
   }
 
   void test_bitXor_knownInt_knownString() {
-    _assertBitXor(null, _intValue(6), _stringValue("3"));
+    _assertEagerXor(null, _intValue(6), _stringValue("3"));
   }
 
   void test_bitXor_knownInt_unknownInt() {
-    _assertBitXor(_intValue(null), _intValue(6), _intValue(null));
+    _assertEagerXor(_intValue(null), _intValue(6), _intValue(null));
   }
 
   void test_bitXor_knownString_knownInt() {
-    _assertBitXor(null, _stringValue("6"), _intValue(3));
+    _assertEagerXor(null, _stringValue("6"), _intValue(3));
   }
 
   void test_bitXor_unknownInt_knownInt() {
-    _assertBitXor(_intValue(null), _intValue(null), _intValue(3));
+    _assertEagerXor(_intValue(null), _intValue(null), _intValue(3));
   }
 
   void test_bitXor_unknownInt_unknownInt() {
-    _assertBitXor(_intValue(null), _intValue(null), _intValue(null));
+    _assertEagerXor(_intValue(null), _intValue(null), _intValue(null));
   }
 
   void test_concatenate_knownInt_knownString() {
@@ -400,24 +400,34 @@
   }
 
   void test_getValue_map_empty() {
-    Object result = _mapValue().toMapValue();
-    EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, result);
-    Map map = result as Map;
-    expect(map, hasLength(0));
+    Map result = _mapValue().toMapValue();
+    expect(result, hasLength(0));
   }
 
   void test_getValue_map_valid() {
-    Object result =
+    Map result =
         _mapValue([_stringValue("key"), _stringValue("value")]).toMapValue();
-    EngineTestCase.assertInstanceOf((obj) => obj is Map, Map, result);
-    Map map = result as Map;
-    expect(map, hasLength(1));
+    expect(result, hasLength(1));
   }
 
   void test_getValue_null() {
     expect(_nullValue().isNull, isTrue);
   }
 
+  void test_getValue_set_empty() {
+    Object result = _setValue().toSetValue();
+    _assertInstanceOfObjectArray(result);
+    Set<Object> set = result as Set<Object>;
+    expect(set, hasLength(0));
+  }
+
+  void test_getValue_set_valid() {
+    Object result = _setValue(new Set.from([_intValue(23)])).toSetValue();
+    _assertInstanceOfObjectArray(result);
+    Set<Object> set = result as Set<Object>;
+    expect(set, hasLength(1));
+  }
+
   void test_getValue_string_known() {
     String value = "twenty-three";
     expect(_stringValue(value).toStringValue(), value);
@@ -958,65 +968,63 @@
   }
 
   void test_logicalAnd_false_false() {
-    _assertLogicalAnd(_boolValue(false), _boolValue(false), _boolValue(false));
+    _assertLazyAnd(_boolValue(false), _boolValue(false), _boolValue(false));
   }
 
   void test_logicalAnd_false_null() {
-    _assertLogicalAnd(_boolValue(false), _boolValue(false), _nullValue());
+    _assertLazyAnd(_boolValue(false), _boolValue(false), _nullValue());
   }
 
   void test_logicalAnd_false_string() {
-    _assertLogicalAnd(
-        _boolValue(false), _boolValue(false), _stringValue("false"));
+    _assertLazyAnd(_boolValue(false), _boolValue(false), _stringValue("false"));
   }
 
   void test_logicalAnd_false_true() {
-    _assertLogicalAnd(_boolValue(false), _boolValue(false), _boolValue(true));
+    _assertLazyAnd(_boolValue(false), _boolValue(false), _boolValue(true));
   }
 
   void test_logicalAnd_null_false() {
     expect(() {
-      _assertLogicalAnd(_boolValue(false), _nullValue(), _boolValue(false));
+      _assertLazyAnd(_boolValue(false), _nullValue(), _boolValue(false));
     }, throwsEvaluationException);
   }
 
   void test_logicalAnd_null_true() {
     expect(() {
-      _assertLogicalAnd(_boolValue(false), _nullValue(), _boolValue(true));
+      _assertLazyAnd(_boolValue(false), _nullValue(), _boolValue(true));
     }, throwsEvaluationException);
   }
 
   void test_logicalAnd_string_false() {
     expect(() {
-      _assertLogicalAnd(
+      _assertLazyAnd(
           _boolValue(false), _stringValue("true"), _boolValue(false));
     }, throwsEvaluationException);
   }
 
   void test_logicalAnd_string_true() {
     expect(() {
-      _assertLogicalAnd(
+      _assertLazyAnd(
           _boolValue(false), _stringValue("false"), _boolValue(true));
     }, throwsEvaluationException);
   }
 
   void test_logicalAnd_true_false() {
-    _assertLogicalAnd(_boolValue(false), _boolValue(true), _boolValue(false));
+    _assertLazyAnd(_boolValue(false), _boolValue(true), _boolValue(false));
   }
 
   void test_logicalAnd_true_null() {
-    _assertLogicalAnd(null, _boolValue(true), _nullValue());
+    _assertLazyAnd(null, _boolValue(true), _nullValue());
   }
 
   void test_logicalAnd_true_string() {
     expect(() {
-      _assertLogicalAnd(
-          _boolValue(false), _boolValue(true), _stringValue("true"));
+      _assertLazyAnd(_boolValue(false), _boolValue(true), _stringValue("true"));
     }, throwsEvaluationException);
   }
 
   void test_logicalAnd_true_true() {
-    _assertLogicalAnd(_boolValue(true), _boolValue(true), _boolValue(true));
+    _assertLazyAnd(_boolValue(true), _boolValue(true), _boolValue(true));
   }
 
   void test_logicalNot_false() {
@@ -1042,64 +1050,62 @@
   }
 
   void test_logicalOr_false_false() {
-    _assertLogicalOr(_boolValue(false), _boolValue(false), _boolValue(false));
+    _assertLazyOr(_boolValue(false), _boolValue(false), _boolValue(false));
   }
 
   void test_logicalOr_false_null() {
-    _assertLogicalOr(null, _boolValue(false), _nullValue());
+    _assertLazyOr(null, _boolValue(false), _nullValue());
   }
 
   void test_logicalOr_false_string() {
     expect(() {
-      _assertLogicalOr(
+      _assertLazyOr(
           _boolValue(false), _boolValue(false), _stringValue("false"));
     }, throwsEvaluationException);
   }
 
   void test_logicalOr_false_true() {
-    _assertLogicalOr(_boolValue(true), _boolValue(false), _boolValue(true));
+    _assertLazyOr(_boolValue(true), _boolValue(false), _boolValue(true));
   }
 
   void test_logicalOr_null_false() {
     expect(() {
-      _assertLogicalOr(_boolValue(false), _nullValue(), _boolValue(false));
+      _assertLazyOr(_boolValue(false), _nullValue(), _boolValue(false));
     }, throwsEvaluationException);
   }
 
   void test_logicalOr_null_true() {
     expect(() {
-      _assertLogicalOr(_boolValue(true), _nullValue(), _boolValue(true));
+      _assertLazyOr(_boolValue(true), _nullValue(), _boolValue(true));
     }, throwsEvaluationException);
   }
 
   void test_logicalOr_string_false() {
     expect(() {
-      _assertLogicalOr(
-          _boolValue(false), _stringValue("true"), _boolValue(false));
+      _assertLazyOr(_boolValue(false), _stringValue("true"), _boolValue(false));
     }, throwsEvaluationException);
   }
 
   void test_logicalOr_string_true() {
     expect(() {
-      _assertLogicalOr(
-          _boolValue(true), _stringValue("false"), _boolValue(true));
+      _assertLazyOr(_boolValue(true), _stringValue("false"), _boolValue(true));
     }, throwsEvaluationException);
   }
 
   void test_logicalOr_true_false() {
-    _assertLogicalOr(_boolValue(true), _boolValue(true), _boolValue(false));
+    _assertLazyOr(_boolValue(true), _boolValue(true), _boolValue(false));
   }
 
   void test_logicalOr_true_null() {
-    _assertLogicalOr(_boolValue(true), _boolValue(true), _nullValue());
+    _assertLazyOr(_boolValue(true), _boolValue(true), _nullValue());
   }
 
   void test_logicalOr_true_string() {
-    _assertLogicalOr(_boolValue(true), _boolValue(true), _stringValue("true"));
+    _assertLazyOr(_boolValue(true), _boolValue(true), _stringValue("true"));
   }
 
   void test_logicalOr_true_true() {
-    _assertLogicalOr(_boolValue(true), _boolValue(true), _boolValue(true));
+    _assertLazyOr(_boolValue(true), _boolValue(true), _boolValue(true));
   }
 
   void test_minus_knownDouble_knownDouble() {
@@ -1480,24 +1486,6 @@
   }
 
   /**
-   * Assert that the result of bit-anding the [left] and [right] operands is the
-   * [expected] value, or that the operation throws an exception if the expected
-   * value is `null`.
-   */
-  void _assertBitAnd(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
-    if (expected == null) {
-      expect(() {
-        left.bitAnd(_typeProvider, right);
-      }, throwsEvaluationException);
-    } else {
-      DartObjectImpl result = left.bitAnd(_typeProvider, right);
-      expect(result, isNotNull);
-      expect(result, expected);
-    }
-  }
-
-  /**
    * Assert that the bit-not of the [operand] is the [expected] value, or that
    * the operation throws an exception if the expected value is `null`.
    */
@@ -1514,42 +1502,6 @@
   }
 
   /**
-   * Assert that the result of bit-oring the [left] and [right] operands is the
-   * [expected] value, or that the operation throws an exception if the expected
-   * value is `null`.
-   */
-  void _assertBitOr(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
-    if (expected == null) {
-      expect(() {
-        left.bitOr(_typeProvider, right);
-      }, throwsEvaluationException);
-    } else {
-      DartObjectImpl result = left.bitOr(_typeProvider, right);
-      expect(result, isNotNull);
-      expect(result, expected);
-    }
-  }
-
-  /**
-   * Assert that the result of bit-xoring the [left] and [right] operands is the
-   * [expected] value, or that the operation throws an exception if the expected
-   * value is `null`.
-   */
-  void _assertBitXor(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
-    if (expected == null) {
-      expect(() {
-        left.bitXor(_typeProvider, right);
-      }, throwsEvaluationException);
-    } else {
-      DartObjectImpl result = left.bitXor(_typeProvider, right);
-      expect(result, isNotNull);
-      expect(result, expected);
-    }
-  }
-
-  /**
    * Assert that the result of concatenating the [left] and [right] operands is
    * the [expected] value, or that the operation throws an exception if the
    * expected value is `null`.
@@ -1586,6 +1538,60 @@
   }
 
   /**
+   * Assert that the result of bit-anding the [left] and [right] operands is the
+   * [expected] value, or that the operation throws an exception if the expected
+   * value is `null`.
+   */
+  void _assertEagerAnd(
+      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+    if (expected == null) {
+      expect(() {
+        left.eagerAnd(_typeProvider, right, false);
+      }, throwsEvaluationException);
+    } else {
+      DartObjectImpl result = left.eagerAnd(_typeProvider, right, false);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of bit-oring the [left] and [right] operands is the
+   * [expected] value, or that the operation throws an exception if the expected
+   * value is `null`.
+   */
+  void _assertEagerOr(
+      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+    if (expected == null) {
+      expect(() {
+        left.eagerOr(_typeProvider, right, false);
+      }, throwsEvaluationException);
+    } else {
+      DartObjectImpl result = left.eagerOr(_typeProvider, right, false);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of bit-xoring the [left] and [right] operands is the
+   * [expected] value, or that the operation throws an exception if the expected
+   * value is `null`.
+   */
+  void _assertEagerXor(
+      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+    if (expected == null) {
+      expect(() {
+        left.eagerXor(_typeProvider, right, false);
+      }, throwsEvaluationException);
+    } else {
+      DartObjectImpl result = left.eagerXor(_typeProvider, right, false);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
    * Assert that the result of comparing the [left] and [right] operands for
    * equality is the [expected] value, or that the operation throws an exception
    * if the expected value is `null`.
@@ -1673,6 +1679,42 @@
   }
 
   /**
+   * Assert that the result of logical-anding the [left] and [right] operands is
+   * the [expected] value, or that the operation throws an exception if the
+   * expected value is `null`.
+   */
+  void _assertLazyAnd(
+      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+    if (expected == null) {
+      expect(() {
+        left.lazyAnd(_typeProvider, () => right);
+      }, throwsEvaluationException);
+    } else {
+      DartObjectImpl result = left.lazyAnd(_typeProvider, () => right);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
+   * Assert that the result of logical-oring the [left] and [right] operands is
+   * the [expected] value, or that the operation throws an exception if the
+   * expected value is `null`.
+   */
+  void _assertLazyOr(
+      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
+    if (expected == null) {
+      expect(() {
+        left.lazyOr(_typeProvider, () => right);
+      }, throwsEvaluationException);
+    } else {
+      DartObjectImpl result = left.lazyOr(_typeProvider, () => right);
+      expect(result, isNotNull);
+      expect(result, expected);
+    }
+  }
+
+  /**
    * Assert that the result of comparing the [left] and [right] operands is the
    * [expected] value, or that the operation throws an exception if the expected
    * value is `null`.
@@ -1709,24 +1751,6 @@
   }
 
   /**
-   * Assert that the result of logical-anding the [left] and [right] operands is
-   * the [expected] value, or that the operation throws an exception if the
-   * expected value is `null`.
-   */
-  void _assertLogicalAnd(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
-    if (expected == null) {
-      expect(() {
-        left.logicalAnd(_typeProvider, () => right);
-      }, throwsEvaluationException);
-    } else {
-      DartObjectImpl result = left.logicalAnd(_typeProvider, () => right);
-      expect(result, isNotNull);
-      expect(result, expected);
-    }
-  }
-
-  /**
    * Assert that the logical-not of the [operand] is the [expected] value, or
    * that the operation throws an exception if the expected value is `null`.
    */
@@ -1743,24 +1767,6 @@
   }
 
   /**
-   * Assert that the result of logical-oring the [left] and [right] operands is
-   * the [expected] value, or that the operation throws an exception if the
-   * expected value is `null`.
-   */
-  void _assertLogicalOr(
-      DartObjectImpl expected, DartObjectImpl left, DartObjectImpl right) {
-    if (expected == null) {
-      expect(() {
-        left.logicalOr(_typeProvider, () => right);
-      }, throwsEvaluationException);
-    } else {
-      DartObjectImpl result = left.logicalOr(_typeProvider, () => right);
-      expect(result, isNotNull);
-      expect(result, expected);
-    }
-  }
-
-  /**
    * Assert that the result of subtracting the [left] and [right] operands is
    * the [expected] value, or that the operation throws an exception if the
    * expected value is `null`.
@@ -1975,6 +1981,11 @@
     return new DartObjectImpl(_typeProvider.nullType, NumState.UNKNOWN_VALUE);
   }
 
+  DartObjectImpl _setValue([Set<DartObjectImpl> elements]) {
+    return new DartObjectImpl(_typeProvider.setType,
+        new SetState(elements ?? new Set<DartObjectImpl>()));
+  }
+
   DartObjectImpl _stringValue(String value) {
     if (value == null) {
       return new DartObjectImpl(
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 3a0bc36..dbebb31 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -47,6 +47,7 @@
 
 @reflectiveTest
 class ClassElementImplTest extends EngineTestCase {
+  @deprecated
   void test_computeNode_ClassDeclaration() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
@@ -100,6 +101,7 @@
     }
   }
 
+  @deprecated
   void test_computeNode_ClassTypeAlias() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
@@ -130,8 +132,8 @@
         new TestElementResynthesizer(context, {location: classA});
     ClassElementHandle classAHandle =
         new ClassElementHandle(resynthesizer, location);
-    ClassElementImpl classB =
-        ElementFactory.classElement("B", new InterfaceTypeImpl(classAHandle));
+    ClassElementImpl classB = new ClassElementImpl('B', 0)
+      ..supertype = new InterfaceTypeImpl(classAHandle);
     classB.mixinApplication = true;
 
     expect(classB.constructors, hasLength(1));
@@ -1194,6 +1196,7 @@
 
 @reflectiveTest
 class FieldElementImplTest extends EngineTestCase {
+  @deprecated
   void test_computeNode() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
@@ -3692,8 +3695,8 @@
 class LibraryElementImplTest extends EngineTestCase {
   void test_creation() {
     expect(
-        new LibraryElementImpl.forNode(
-            createAnalysisContext(), AstTestFactory.libraryIdentifier2(["l"])),
+        new LibraryElementImpl.forNode(createAnalysisContext(), null,
+            AstTestFactory.libraryIdentifier2(["l"])),
         isNotNull);
   }
 
@@ -3780,7 +3783,7 @@
   void test_setImports() {
     AnalysisContext context = createAnalysisContext();
     LibraryElementImpl library = new LibraryElementImpl.forNode(
-        context, AstTestFactory.libraryIdentifier2(["l1"]));
+        context, null, AstTestFactory.libraryIdentifier2(["l1"]));
     List<ImportElementImpl> expectedImports = [
       ElementFactory.importFor(ElementFactory.library(context, "l2"), null),
       ElementFactory.importFor(ElementFactory.library(context, "l3"), null)
@@ -3799,6 +3802,7 @@
 
 @reflectiveTest
 class MethodElementImplTest extends EngineTestCase {
+  @deprecated
   void test_computeNode() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
@@ -3829,6 +3833,7 @@
     }
   }
 
+  @deprecated
   void test_computeNode_withoutFunctionBody() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.analyzeFunctionBodies = false;
@@ -3908,6 +3913,7 @@
 
 @reflectiveTest
 class ParameterElementImplTest extends EngineTestCase {
+  @deprecated
   void test_computeNode_DefaultFormalParameter() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
@@ -3927,6 +3933,7 @@
     }
   }
 
+  @deprecated
   void test_computeNode_FieldFormalParameter() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
@@ -3951,6 +3958,7 @@
     }
   }
 
+  @deprecated
   void test_computeNode_FunctionTypedFormalParameter() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
@@ -3970,6 +3978,7 @@
     }
   }
 
+  @deprecated
   void test_computeNode_SimpleFormalParameter() {
     AnalysisContextHelper contextHelper = new AnalysisContextHelper();
     AnalysisContext context = contextHelper.context;
@@ -4027,7 +4036,7 @@
   Map<ElementLocation, Element> locationMap;
 
   TestElementResynthesizer(AnalysisContext context, this.locationMap)
-      : super(context);
+      : super(context, null);
 
   @override
   Element getElement(ElementLocation location) {
diff --git a/pkg/analyzer/test/src/dart/element/function_type_test.dart b/pkg/analyzer/test/src/dart/element/function_type_test.dart
index 16b9189..975952b 100644
--- a/pkg/analyzer/test/src/dart/element/function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/function_type_test.dart
@@ -1,13 +1,13 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager2_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager2_test.dart
index 4dddf19..60497d0 100644
--- a/pkg/analyzer/test/src/dart/element/inheritance_manager2_test.dart
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager2_test.dart
@@ -115,7 +115,7 @@
     );
   }
 
-  void test_getMember_() async {
+  test_getMember() async {
     addTestFile('''
 abstract class I1 {
   void f(int i);
@@ -136,7 +136,196 @@
     assertElementTypeString(memberType, '(Object) → void');
   }
 
-  test_preferLatest_mixin() async {
+  test_getMember_concrete() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getConcrete('A', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+  }
+
+  test_getMember_concrete_abstract() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+''');
+    await resolveTestFile();
+
+    expect(_getConcrete('A', 'foo'), isNull);
+  }
+
+  test_getMember_concrete_fromMixedClass() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class X with A {}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getConcrete('X', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+  }
+
+  test_getMember_concrete_fromMixedClass2() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B = Object with A;
+
+class X with B {}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getConcrete('X', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+  }
+
+  test_getMember_concrete_fromMixedClass_skipObject() async {
+    addTestFile('''
+class A {
+  String toString() => 'A';
+}
+
+class B {}
+
+class X extends A with B {}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getConcrete('X', 'toString'),
+      same(findElement.method('toString', of: 'A')),
+    );
+  }
+
+  test_getMember_concrete_fromMixin() async {
+    addTestFile('''
+mixin M {
+  void foo() {}
+}
+
+class X with M {}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getConcrete('X', 'foo'),
+      same(findElement.method('foo', of: 'M')),
+    );
+  }
+
+  test_getMember_concrete_fromSuper() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {}
+
+abstract class C extends B {}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getConcrete('B', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+
+    expect(
+      _getConcrete('C', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+  }
+
+  test_getMember_concrete_missing() async {
+    addTestFile('''
+abstract class A {}
+''');
+    await resolveTestFile();
+
+    expect(_getConcrete('A', 'foo'), isNull);
+  }
+
+  test_getMember_concrete_noSuchMethod() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B implements A {
+  noSuchMethod(_) {}
+}
+
+abstract class C extends B {}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getConcrete('B', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+
+    expect(
+      _getConcrete('C', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+  }
+
+  test_getMember_concrete_noSuchMethod_mixin() async {
+    addTestFile('''
+class A {
+  void foo();
+
+  noSuchMethod(_) {}
+}
+
+abstract class B extends Object with A {}
+''');
+    await resolveTestFile();
+
+    // noSuchMethod forwarders are not mixed-in.
+    // https://github.com/dart-lang/sdk/issues/33553#issuecomment-424638320
+    expect(_getConcrete('B', 'foo'), isNull);
+  }
+
+  test_getMember_concrete_noSuchMethod_moreSpecificSignature() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B implements A {
+  noSuchMethod(_) {}
+}
+
+class C extends B {
+  void foo([a]);
+}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getConcrete('C', 'foo'),
+      same(findElement.method('foo', of: 'C')),
+    );
+  }
+
+  test_getMember_preferLatest_mixin() async {
     addTestFile('''
 class A {
   void foo() {}
@@ -165,7 +354,7 @@
     expect(member.element, findElement.method('foo', of: 'M2'));
   }
 
-  test_preferLatest_superclass() async {
+  test_getMember_preferLatest_superclass() async {
     addTestFile('''
 class A {
   void foo() {}
@@ -190,7 +379,7 @@
     expect(member.element, findElement.method('foo', of: 'B'));
   }
 
-  test_preferLatest_this() async {
+  test_getMember_preferLatest_this() async {
     addTestFile('''
 class A {
   void foo() {}
@@ -213,8 +402,103 @@
     expect(member.element, findElement.method('foo', of: 'X'));
   }
 
+  test_getMember_super_abstract() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+
+class B extends A {
+  noSuchMethod(_) {}
+}
+''');
+    await resolveTestFile();
+
+    expect(_getSuper('B', 'foo'), isNull);
+  }
+
+  test_getMember_super_fromMixin() async {
+    addTestFile('''
+mixin M {
+  void foo() {}
+}
+
+class X extends Object with M {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getSuper('X', 'foo'),
+      same(findElement.method('foo', of: 'M')),
+    );
+  }
+
+  test_getMember_super_fromSuper() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getSuper('B', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+  }
+
+  test_getMember_super_missing() async {
+    addTestFile('''
+class A {}
+
+class B extends A {}
+''');
+    await resolveTestFile();
+
+    expect(_getSuper('B', 'foo'), isNull);
+  }
+
+  test_getMember_super_noSuchMember() async {
+    addTestFile('''
+class A {
+  void foo();
+  noSuchMethod(_) {}
+}
+
+class B extends A {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    expect(
+      _getSuper('B', 'foo'),
+      same(findElement.method('foo', of: 'A')),
+    );
+  }
+
+  ExecutableElement _getConcrete(String className, String name) {
+    var type = findElement.class_(className).type;
+    return manager
+        .getMember(type, new Name(null, name), concrete: true)
+        ?.element;
+  }
+
   ExecutableElement _getInherited(String className, String name) {
     var type = findElement.class_(className).type;
     return manager.getInherited(type, new Name(null, name)).element;
   }
+
+  ExecutableElement _getSuper(String className, String name) {
+    var type = findElement.class_(className).type;
+    return manager
+        .getMember(type, new Name(null, name), forSuper: true)
+        ?.element;
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index c07703f..a2abdd1 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -22,7 +22,7 @@
 class AssignmentDriverResolutionTest extends DriverResolutionTest
     with AssignmentResolutionMixin {}
 
-abstract class AssignmentResolutionMixin implements ResolutionTest {
+mixin AssignmentResolutionMixin implements ResolutionTest {
   test_compound_indexExpression() async {
     addTestFile(r'''
 main() {
@@ -65,7 +65,7 @@
     assertType(assignment, 'num'); // num + int = num
 
     SimpleIdentifier left = assignment.leftHandSide;
-    assertElement(left, findElement.localVar('x'));
+    assertElement(left, findElement.localVar('v'));
     assertType(left, 'num');
 
     Expression right = assignment.rightHandSide;
@@ -247,7 +247,7 @@
     assertType(creation, 'B');
 
     var fRef = left.propertyName;
-    assertElement(fRef, findElement.setter('f', className: 'A'));
+    assertElement(fRef, findElement.setter('f', of: 'A'));
     assertType(fRef, 'int');
 
     var right = assignment.rightHandSide;
diff --git a/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
index aea7e0f..6a6388a 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_alias_test.dart
@@ -19,7 +19,7 @@
 class ClassAliasDriverResolutionTest extends DriverResolutionTest
     with ClassAliasResolutionMixin {}
 
-abstract class ClassAliasResolutionMixin implements ResolutionTest {
+mixin ClassAliasResolutionMixin implements ResolutionTest {
   test_defaultConstructor() async {
     addTestFile(r'''
 class A {}
diff --git a/pkg/analyzer/test/src/dart/resolution/class_test.dart b/pkg/analyzer/test/src/dart/resolution/class_test.dart
index f825033..efcec88 100644
--- a/pkg/analyzer/test/src/dart/resolution/class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/class_test.dart
@@ -21,7 +21,7 @@
 class ClassDriverResolutionTest extends DriverResolutionTest
     with ClassResolutionMixin {}
 
-abstract class ClassResolutionMixin implements ResolutionTest {
+mixin ClassResolutionMixin implements ResolutionTest {
   test_abstractSuperMemberReference_getter() async {
     addTestFile(r'''
 abstract class A {
@@ -55,28 +55,7 @@
     assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
     assertElement(
       findNode.simple('foo; // ref'),
-      findElement.getter('foo', className: 'Foo'),
-    );
-  }
-
-  test_abstractSuperMemberReference_method_invocation() async {
-    addTestFile(r'''
-abstract class A {
-  foo();
-}
-abstract class B extends A {
-  bar() {
-    super.foo(); // ref
-  }
-
-  foo() {} // does not matter
-}
-''');
-    await resolveTestFile();
-    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
-    assertElement(
-      findNode.simple('foo(); // ref'),
-      findElement.method('foo', of: 'A'),
+      findElement.getter('foo', of: 'Foo'),
     );
   }
 
@@ -96,31 +75,6 @@
     assertElement(findNode.simple('foo; // ref'), findElement.method('foo'));
   }
 
-  test_abstractSuperMemberReference_OK_mixinHasConcrete2_method() async {
-    addTestFile('''
-class A {
-}
-
-class M {
-  void foo() {}
-}
-
-class B = A with M;
-
-class C extends B {
-  void bar() {
-    super.foo(); // ref
-  }
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-    assertElement(
-      findNode.simple('foo(); // ref'),
-      findElement.method('foo', of: 'M'),
-    );
-  }
-
   test_abstractSuperMemberReference_OK_superHasConcrete_mixinHasAbstract_method() async {
     addTestFile('''
 class A {
@@ -163,31 +117,7 @@
     assertNoTestErrors();
     assertElement(
       findNode.simple('foo; // ref'),
-      findElement.getter('foo', className: 'A'),
-    );
-  }
-
-  test_abstractSuperMemberReference_OK_superSuperHasConcrete_method() async {
-    addTestFile('''
-abstract class A {
-  void foo() {}
-}
-
-abstract class B extends A {
-  void foo();
-}
-
-class C extends B {
-  void bar() {
-    super.foo(); // ref
-  }
-}
-''');
-    await resolveTestFile();
-    assertNoTestErrors();
-    assertElement(
-      findNode.simple('foo(); // ref'),
-      findElement.method('foo', of: 'A'),
+      findElement.getter('foo', of: 'A'),
     );
   }
 
@@ -211,7 +141,7 @@
     assertNoTestErrors();
     assertElement(
       findNode.simple('foo = 0;'),
-      findElement.setter('foo', className: 'A'),
+      findElement.setter('foo', of: 'A'),
     );
   }
 
@@ -1371,6 +1301,32 @@
     assertNoTestErrors();
   }
 
+  test_error_mismatchedGetterAndSetterTypes_OK_setterParameter_0() async {
+    addTestFile(r'''
+class C {
+  int get foo => 0;
+  set foo() {}
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
+    ]);
+  }
+
+  test_error_mismatchedGetterAndSetterTypes_OK_setterParameter_2() async {
+    addTestFile(r'''
+class C {
+  int get foo => 0;
+  set foo(String p1, String p2) {}
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER,
+    ]);
+  }
+
   test_error_mismatchedGetterAndSetterTypes_superGetter() async {
     addTestFile(r'''
 class A {
@@ -1483,6 +1439,22 @@
     ]);
   }
 
+  test_issue32815() async {
+    addTestFile(r'''
+class A<T> extends B<T> {}
+class B<T> extends A<T> {}
+class C<T> extends B<T> implements I<T> {}
+
+abstract class I<T> {}
+
+main() {
+  Iterable<I<int>> x = [new C()];
+}
+''');
+    await resolveTestFile();
+    assertHasTestErrors();
+  }
+
   test_recursiveInterfaceInheritance_extends() async {
     addTestFile(r'''
 class A extends B {}
@@ -1539,8 +1511,6 @@
     assertTestErrors([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
-      StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
-      StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
     ]);
   }
 
@@ -1596,7 +1566,6 @@
     await resolveTestFile();
     assertTestErrors([
       CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS,
-      StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
     ]);
   }
 
@@ -1670,7 +1639,10 @@
   }
 }''');
     await resolveTestFile();
-    assertTestErrors([StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+      StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR,
+    ]);
   }
 
   test_undefinedSuperOperator_indexGetter() async {
diff --git a/pkg/analyzer/test/src/dart/resolution/comment_test.dart b/pkg/analyzer/test/src/dart/resolution/comment_test.dart
new file mode 100644
index 0000000..5371eac
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/comment_test.dart
@@ -0,0 +1,261 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CommentDriverResolutionTest);
+    defineReflectiveTests(CommentTaskResolutionTest);
+  });
+}
+
+@reflectiveTest
+class CommentDriverResolutionTest extends DriverResolutionTest
+    with ClassAliasResolutionMixin {}
+
+mixin ClassAliasResolutionMixin implements ResolutionTest {
+  test_error_unqualifiedReferenceToNonLocalStaticMember() async {
+    addTestFile(r'''
+class A {
+  static void foo() {}
+}
+
+/// [foo]
+class B extends A {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('foo]'),
+      findElement.method('foo', of: 'A'),
+    );
+  }
+
+  test_new() async {
+    addTestFile(r'''
+class A {
+  A();
+  A.named();
+}
+
+/// [new A] or [new A.named]
+main() {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('A]'),
+      findElement.unnamedConstructor('A'),
+    );
+    assertElement(
+      findNode.simple('A.named]'),
+      findElement.class_('A'),
+    );
+    assertElement(
+      findNode.simple('named]'),
+      findElement.constructor('named', of: 'A'),
+    );
+  }
+
+  test_identifier_beforeConstructor() async {
+    addTestFile(r'''
+class A {
+  /// [p]
+  A(int p);
+}''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_identifier_beforeEnum() async {
+    addTestFile(r'''
+/// This is the [Samurai] kind.
+enum Samurai {
+  /// Use [int].
+  WITH_SWORD,
+  /// Like [WITH_SWORD], but only without one.
+  WITHOUT_SWORD
+}''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('Samurai]'),
+      findElement.enum_('Samurai'),
+    );
+    assertElement(
+      findNode.simple('int]'),
+      intElement,
+    );
+    assertElement(
+      findNode.simple('WITH_SWORD]'),
+      findElement.getter('WITH_SWORD'),
+    );
+  }
+
+  test_identifier_beforeFunction_blockBody() async {
+    addTestFile(r'''
+/// [p]
+foo(int p) {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_identifier_parameter_functionTyped() async {
+    addTestFile(r'''
+/// [bar]
+foo(int bar()) {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('bar]'),
+      findElement.parameter('bar'),
+    );
+  }
+
+  test_identifier_beforeFunction_expressionBody() async {
+    addTestFile(r'''
+/// [p]
+foo(int p) => null;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_identifier_beforeFunctionTypeAlias() async {
+    addTestFile(r'''
+/// [p]
+typedef Foo(int p);
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_identifier_beforeGenericTypeAlias() async {
+    addTestFile(r'''
+/// Can resolve [T], [S], and [p].
+typedef Foo<T> = Function<S>(int p);
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('T]'),
+      findElement.typeParameter('T'),
+    );
+    assertElement(findNode.simple('S]'), findElement.typeParameter('S'));
+    assertElement(
+      findNode.simple('p]'),
+      findElement.parameter('p'),
+    );
+  }
+
+  test_identifier_beforeGetter() async {
+    addTestFile(r'''
+/// [int]
+get g => null;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(findNode.simple('int]'), intElement);
+  }
+
+  test_identifier_beforeMethod() async {
+    addTestFile(r'''
+abstract class A {
+  /// [p1]
+  ma(int p1);
+  
+  /// [p2]
+  mb(int p2);
+  
+  /// [p3] and [p4]
+  mc(int p3, p4());
+  
+  /// [p5]
+  md(int p5, {int p6});
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(findNode.simple('p1]'), findElement.parameter('p1'));
+    assertElement(findNode.simple('p2]'), findElement.parameter('p2'));
+    assertElement(findNode.simple('p3]'), findElement.parameter('p3'));
+    assertElement(findNode.simple('p4]'), findElement.parameter('p4'));
+    assertElement(findNode.simple('p5]'), findElement.parameter('p5'));
+  }
+
+  test_identifier_beforeClass() async {
+    addTestFile(r'''
+/// [foo]
+class A {
+  foo() {}
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertElement(
+      findNode.simple('foo]'),
+      findElement.method('foo'),
+    );
+  }
+
+  test_identifier_setter() async {
+    addTestFile(r'''
+class A {
+  /// [x] in A
+  mA() {}
+  set x(value) {}
+}
+
+class B extends A {
+  /// [x] in B
+  mB() {}
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var x = findElement.setter('x', of: 'A');
+    assertElement(findNode.simple('x] in A'), x);
+    assertElement(findNode.simple('x] in B'), x);
+  }
+}
+
+@reflectiveTest
+class CommentTaskResolutionTest extends TaskResolutionTest
+    with ClassAliasResolutionMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/constant_test.dart b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
new file mode 100644
index 0000000..4ba17ed
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/constant_test.dart
@@ -0,0 +1,156 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+import 'resolution.dart';
+import 'task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstantDriverTest);
+    defineReflectiveTests(ConstantTaskTest);
+  });
+}
+
+@reflectiveTest
+class ConstantDriverTest extends DriverResolutionTest with ConstantMixin {}
+
+mixin ConstantMixin implements ResolutionTest {
+  test_annotation_constructor_named() async {
+    newFile('/test/lib/a.dart', content: r'''
+class A {
+  final int f;
+  const A.named(this.f);
+}
+''');
+
+    newFile('/test/lib/b.dart', content: r'''
+import 'a.dart';
+
+@A.named(42)
+class B {}
+''');
+
+    addTestFile(r'''
+import 'b.dart';
+
+B b;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var classB = findNode.typeName('B b;').name.staticElement;
+    var annotation = classB.metadata.single;
+    var value = annotation.computeConstantValue();
+    expect(value, isNotNull);
+    expect(value.getField('f').toIntValue(), 42);
+  }
+
+  test_annotation_constructor_unnamed() async {
+    newFile('/test/lib/a.dart', content: r'''
+class A {
+  final int f;
+  const A(this.f);
+}
+''');
+
+    newFile('/test/lib/b.dart', content: r'''
+import 'a.dart';
+
+@A(42)
+class B {}
+''');
+
+    addTestFile(r'''
+import 'b.dart';
+
+B b;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var classB = findNode.typeName('B b;').name.staticElement;
+    var annotation = classB.metadata.single;
+    var value = annotation.computeConstantValue();
+    expect(value, isNotNull);
+    expect(value.getField('f').toIntValue(), 42);
+  }
+
+  test_constantValue_defaultParameter_noDefaultValue() async {
+    newFile('/test/lib/a.dart', content: r'''
+class A {
+  const A({int p});
+}
+''');
+    addTestFile(r'''
+import 'a.dart';
+const a = const A();
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var aLib = findElement.import('package:test/a.dart').importedLibrary;
+    var aConstructor = aLib.getType('A').constructors.single;
+    DefaultParameterElementImpl p = aConstructor.parameters.single;
+
+    // To evaluate `const A()` we have to evaluate `{int p}`.
+    // Even if its value is `null`.
+    expect(p.isConstantEvaluated, isTrue);
+    expect(p.constantValue.isNull, isTrue);
+  }
+
+  test_constFactoryRedirection_super() async {
+    addTestFile(r'''
+class I {
+  const factory I(int f) = B;
+}
+
+class A implements I {
+  final int f;
+
+  const A(this.f);
+}
+
+class B extends A {
+  const B(int f) : super(f);
+}
+
+@I(42)
+main() {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var node = findNode.annotation('@I');
+    var value = node.elementAnnotation.constantValue;
+    expect(value.getField('(super)').getField('f').toIntValue(), 42);
+  }
+
+  test_constNotInitialized() async {
+    addTestFile(r'''
+class B {
+  const B(_);
+}
+
+class C extends B {
+  static const a;
+  const C() : super(a);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER,
+      CompileTimeErrorCode.CONST_NOT_INITIALIZED,
+      CompileTimeErrorCode.CONST_NOT_INITIALIZED,
+    ]);
+  }
+}
+
+@reflectiveTest
+class ConstantTaskTest extends TaskResolutionTest with ConstantMixin {}
diff --git a/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart
new file mode 100644
index 0000000..c9d840d
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart
@@ -0,0 +1,1533 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/resolver/definite_assignment.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DefiniteAssignmentTrackerTest);
+  });
+}
+
+@reflectiveTest
+class DefiniteAssignmentTrackerTest extends DriverResolutionTest {
+  DefiniteAssignmentTracker tracker;
+
+  /// Assert that only local variables with the given names are marked as read
+  /// before being written.  All the other local variables are implicitly
+  /// considered definitely assigned.
+  void assertReadBeforeWritten(
+      [String name1, String name2, String name3, String name4]) {
+    var expected = [name1, name2, name3, name4]
+        .where((i) => i != null)
+        .map((name) => findElement.localVar(name))
+        .toList();
+    expect(tracker.readBeforeWritten, unorderedEquals(expected));
+  }
+
+  test_assert() async {
+    await trackCode(r'''
+main() {
+  int v;
+  assert((v = 0) >= 0, v);
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_assignment_leftExpression() async {
+    await trackCode(r'''
+main() {
+  List<int> v;
+  v[0] = (v = [1, 2])[1];
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_assignment_leftLocal_compound() async {
+    await trackCode(r'''
+main() {
+  int v;
+  v += 1;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_assignment_leftLocal_compound_assignInRight() async {
+    await trackCode(r'''
+main() {
+  int v;
+  v += (v = v);
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_assignment_leftLocal_pure_eq() async {
+    await trackCode(r'''
+main() {
+  int v;
+  v = 0;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_assignment_leftLocal_pure_eq_self() async {
+    await trackCode(r'''
+main() {
+  int v;
+  v = v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_assignment_leftLocal_pure_questionEq() async {
+    await trackCode(r'''
+main() {
+  int v;
+  v ??= 0;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_assignment_leftLocal_pure_questionEq_self() async {
+    await trackCode(r'''
+main() {
+  int v;
+  v ??= v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_binaryExpression_ifNull_left() async {
+    await trackCode(r'''
+main() {
+  int v;
+  (v = 0) ?? 0;
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_binaryExpression_ifNull_right() async {
+    await trackCode(r'''
+main(int a) {
+  int v;
+  a ?? (v = 0);
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_binaryExpression_logicalAnd_left() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  ((v = 0) >= 0) && c;
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_binaryExpression_logicalAnd_right() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  c && ((v = 0) >= 0);
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_binaryExpression_logicalOr_left() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  ((v = 0) >= 0) || c;
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_binaryExpression_logicalOr_right() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  c || ((v = 0) >= 0);
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_binaryExpression_plus_left() async {
+    await trackCode(r'''
+main() {
+  int v;
+  (v = 0) + 1;
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_binaryExpression_plus_right() async {
+    await trackCode(r'''
+main() {
+  int v;
+  1 + (v = 0);
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_conditionalExpression_both() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  c ? (v = 0) : (v = 0);
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_conditionalExpression_condition() async {
+    await trackCode(r'''
+main() {
+  int v;
+  (v = 0) >= 0 ? 1 : 2;
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_conditionalExpression_else() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  c ? (v = 0) : 2;
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_conditionalExpression_then() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  c ? (v = 0) : 2;
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_doWhile_break_afterAssignment() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  do {
+    v = 0;
+    v;
+    if (c) break;
+  } while (c);
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_doWhile_break_beforeAssignment() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  do {
+    if (c) break;
+    v = 0;
+  } while (c);
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_doWhile_breakOuterFromInner() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2, v3;
+  L1: do {
+    do {
+      v1 = 0;
+      if (c) break L1;
+      v2 = 0;
+      v3 = 0;
+    } while (c);
+    v2;
+  } while (c);
+  v1;
+  v3;
+}
+''');
+    assertReadBeforeWritten('v3');
+  }
+
+  test_doWhile_condition() async {
+    await trackCode(r'''
+main() {
+  int v1, v2;
+  do {
+    v1; // assigned in the condition, but not yet
+  } while ((v1 = 0) + (v2 = 0) >= 0);
+  v2;
+}
+''');
+    assertReadBeforeWritten('v1');
+  }
+
+  test_doWhile_condition_break() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  do {
+    if (c) break;
+  } while ((v = 0) >= 0);
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_doWhile_condition_break_continue() async {
+    await trackCode(r'''
+main(bool c1, bool c2) {
+  int v1, v2, v3, v4, v5, v6;
+  do {
+    v1 = 0; // visible outside, visible to the condition
+    if (c1) break;
+    v2 = 0; // not visible outside, visible to the condition
+    v3 = 0; // not visible outside, visible to the condition
+    if (c2) continue;
+    v4 = 0; // not visible
+    v5 = 0; // not visible
+  } while ((v6 = v1 + v2 + v4) == 0); // has break => v6 is not visible outside
+  v1;
+  v3;
+  v5;
+  v6;
+}
+''');
+    assertReadBeforeWritten('v3', 'v4', 'v5', 'v6');
+  }
+
+  test_doWhile_condition_continue() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2, v3, v4;
+  do {
+    v1 = 0; // visible outside, visible to the condition
+    if (c) continue;
+    v2 = 0; // not visible
+    v3 = 0; // not visible
+  } while ((v4 = v1 + v2) == 0); // no break => v4 visible outside
+  v1;
+  v3;
+  v4;
+}
+''');
+    assertReadBeforeWritten('v2', 'v3');
+  }
+
+  test_doWhile_continue_beforeAssignment() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  do {
+    if (c) continue;
+    v = 0;
+  } while (c);
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_for_body() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  for (; c;) {
+    v = 0;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_for_break() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  for (; c;) {
+    v1 = 0;
+    if (c) break;
+    v2 = 0;
+  }
+  v1;
+  v2;
+}
+''');
+    assertReadBeforeWritten('v1', 'v2');
+  }
+
+  test_for_break_updaters() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  for (; c; v1 + v2) {
+    v1 = 0;
+    if (c) break;
+    v2 = 0;
+  }
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_for_condition() async {
+    await trackCode(r'''
+main() {
+  int v;
+  for (; (v = 0) >= 0;) {
+    v;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_for_continue() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  for (; c;) {
+    v1 = 0;
+    if (c) continue;
+    v2 = 0;
+  }
+  v1;
+  v2;
+}
+''');
+    assertReadBeforeWritten('v1', 'v2');
+  }
+
+  test_for_continue_updaters() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  for (; c; v1 + v2) {
+    v1 = 0;
+    if (c) continue;
+    v2 = 0;
+  }
+}
+''');
+    assertReadBeforeWritten('v2');
+  }
+
+  test_for_initializer_expression() async {
+    await trackCode(r'''
+main() {
+  int v;
+  for (v = 0;;) {
+    v;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_for_initializer_variable() async {
+    await trackCode(r'''
+main() {
+  int v;
+  for (var t = (v = 0);;) {
+    v;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_for_updaters() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2, v3, v4;
+  for (; c; v1 = 0, v2 = 0, v3 = 0, v4) {
+    v1;
+  }
+  v2;
+}
+''');
+    assertReadBeforeWritten('v1', 'v2', 'v4');
+  }
+
+  test_for_updaters_afterBody() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  for (; c; v) {
+    v = 0;
+  }
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_forEach() async {
+    await trackCode(r'''
+main() {
+  int v1, v2;
+  for (var _ in (v1 = [0, 1, 2])) {
+    v2 = 0;
+  }
+  v1;
+  v2;
+}
+''');
+    assertReadBeforeWritten('v2');
+  }
+
+  test_forEach_break() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  for (var _ in [0, 1, 2]) {
+    v1 = 0;
+    if (c) break;
+    v2 = 0;
+  }
+  v1;
+  v2;
+}
+''');
+    assertReadBeforeWritten('v1', 'v2');
+  }
+
+  test_forEach_continue() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  for (var _ in [0, 1, 2]) {
+    v1 = 0;
+    if (c) continue;
+    v2 = 0;
+  }
+  v1;
+  v2;
+}
+''');
+    assertReadBeforeWritten('v1', 'v2');
+  }
+
+  test_functionExpression_closure_read() async {
+    await trackCode(r'''
+main() {
+  int v1, v2;
+  
+  v1 = 0;
+  
+  [0, 1, 2].forEach((t) {
+    v1;
+    v2;
+  });
+}
+''');
+    assertReadBeforeWritten('v2');
+  }
+
+  test_functionExpression_closure_write() async {
+    await trackCode(r'''
+main() {
+  int v;
+  
+  [0, 1, 2].forEach((t) {
+    v = t;
+  });
+
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_functionExpression_localFunction_local() async {
+    await trackCode(r'''
+main() {
+  int v;
+
+  v = 0;
+
+  void f() {
+    int v; // 1
+    v;
+  }
+}
+''');
+    var localV = findNode.simple('v; // 1').staticElement;
+    expect(tracker.readBeforeWritten, unorderedEquals([localV]));
+  }
+
+  test_functionExpression_localFunction_local2() async {
+    await trackCode(r'''
+main() {
+  int v1;
+
+  v1 = 0;
+
+  void f() {
+    int v2, v3;
+    v2 = 0;
+    v1;
+    v2;
+    v3;
+  }
+}
+''');
+    assertReadBeforeWritten('v3');
+  }
+
+  test_functionExpression_localFunction_read() async {
+    await trackCode(r'''
+main() {
+  int v1, v2, v3;
+
+  v1 = 0;
+
+  void f() {
+    v1;
+    v2;
+  }
+
+  v2 = 0;
+}
+''');
+    assertReadBeforeWritten('v2');
+  }
+
+  test_functionExpression_localFunction_write() async {
+    await trackCode(r'''
+main() {
+  int v;
+
+  void f() {
+    v = 0;
+  }
+
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_if_condition() async {
+    await trackCode(r'''
+main() {
+  int v;
+  if ((v = 0) >= 0) {
+    v;
+  } else {
+    v;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_if_then() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  if (c) {
+    v = 0;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_if_thenElse_all() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  if (c) {
+    v = 0;
+    v;
+  } else {
+    v = 0;
+    v;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_if_thenElse_else() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  if (c) {
+    // not assigned
+  } else {
+    v = 0;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_if_thenElse_then() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  if (c) {
+    v = 0;
+  } else {
+    // not assigned
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_if_thenElse_then_exit_alwaysThrows() async {
+    addMetaPackage();
+    await trackCode(r'''
+import 'package:meta/meta.dart';
+
+main(bool c) {
+  int v;
+  if (c) {
+    v = 0;
+  } else {
+    foo();
+  }
+  v;
+}
+
+@alwaysThrows
+void foo() {}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_if_thenElse_then_exit_return() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  if (c) {
+    v = 0;
+  } else {
+    return;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_if_thenElse_then_exit_throw() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  if (c) {
+    v = 0;
+  } else {
+    throw 42;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_switch_case1_default() async {
+    await trackCode(r'''
+main(int e) {
+  int v;
+  switch (e) {
+    case 1:
+      v = 0;
+      break;
+    case 2:
+      // not assigned
+      break;
+    default:
+      v = 0;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_switch_case2_default() async {
+    await trackCode(r'''
+main(int e) {
+  int v1, v2;
+  switch (e) {
+    case 1:
+      v1 = 0;
+      v2 = 0;
+      v1;
+      break;
+    default:
+      v1 = 0;
+      v1;
+  }
+  v1;
+  v2;
+}
+''');
+    assertReadBeforeWritten('v2');
+  }
+
+  test_switch_case_default_break() async {
+    await trackCode(r'''
+main(int e, bool c) {
+  int v1, v2;
+  switch (e) {
+    case 1:
+      v1 = 0;
+      if (c) break;
+      v2 = 0;
+      break;
+    default:
+      v1 = 0;
+      if (c) break;
+      v2 = 0;
+  }
+  v1;
+  v2;
+}
+''');
+    assertReadBeforeWritten('v2');
+  }
+
+  test_switch_case_default_continue() async {
+    await trackCode(r'''
+main(int e) {
+  int v;
+  switch (e) {
+    L: case 1:
+      v = 0;
+      break;
+    case 2:
+      continue L;
+    default:
+      v = 0;
+  }
+  v;
+}
+''');
+    // We don't analyze to which `case` we go from `continue L`,
+    // but we don't have to. If all cases assign, then the variable is
+    // not in the `breakSet`. And if there is a case when it is not assigned,
+    // we the variable will be left in the `breakSet`.
+    assertReadBeforeWritten();
+  }
+
+  test_switch_case_noDefault() async {
+    await trackCode(r'''
+main(int e) {
+  int v;
+  switch (e) {
+    case 1:
+      v = 0;
+      break;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_switch_condition() async {
+    await trackCode(r'''
+main() {
+  int v;
+  switch (v = 0) {}
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_tryCatch_all() async {
+    await trackCode(r'''
+main() {
+  int v;
+  try {
+    f();
+    v = 0;
+  } catch (_) {
+    v = 0;
+  }
+  v;
+}
+
+void f() {}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_tryCatch_catch() async {
+    await trackCode(r'''
+main() {
+  int v;
+  try {
+    // not assigned
+  } catch (_) {
+    v = 0;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_tryCatch_try() async {
+    await trackCode(r'''
+main() {
+  int v;
+  try {
+    v = 0;
+  } catch (_) {
+    // not assigned
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_tryCatchFinally_catch() async {
+    await trackCode(r'''
+main() {
+  int v;
+  try {
+    // not assigned
+  } catch (_) {
+    v = 0;
+  } finally {
+    // not assigned
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_tryCatchFinally_finally() async {
+    await trackCode(r'''
+main() {
+  int v;
+  try {
+    // not assigned
+  } catch (_) {
+    // not assigned
+  } finally {
+    v = 0;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_tryCatchFinally_try() async {
+    await trackCode(r'''
+main() {
+  int v;
+  try {
+    v = 0;
+  } catch (_) {
+    // not assigned
+  } finally {
+    // not assigned
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten('v');
+  }
+
+  test_tryFinally_finally() async {
+    await trackCode(r'''
+main() {
+  int v;
+  try {
+    // not assigned
+  } finally {
+    v = 0;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_tryFinally_try() async {
+    await trackCode(r'''
+main() {
+  int v;
+  try {
+    v = 0;
+  } finally {
+    // not assigned
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_while_condition() async {
+    await trackCode(r'''
+main() {
+  int v;
+  while ((v = 0) >= 0) {
+    v;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_while_condition_notTrue() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  while (c) {
+    v1 = 0;
+    v2 = 0;
+    v1;
+  }
+  v2;
+}
+''');
+    assertReadBeforeWritten('v2');
+  }
+
+  test_while_true_break_afterAssignment() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  while (true) {
+    v1 = 0;
+    v1;
+    if (c) break;
+    v1;
+    v2 = 0;
+    v2;
+  }
+  v1;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_while_true_break_beforeAssignment() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  while (true) {
+    if (c) break;
+    v1 = 0;
+    v2 = 0;
+    v2;
+  }
+  v1;
+}
+''');
+    assertReadBeforeWritten('v1');
+  }
+
+  test_while_true_break_if() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  while (true) {
+    if (c) {
+      v = 0;
+      break;
+    } else {
+      v = 0;
+      break;
+    }
+    v;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_while_true_break_if2() async {
+    await trackCode(r'''
+main(bool c) {
+  var v;
+  while (true) {
+    if (c) {
+      break;
+    } else {
+      v = 0;
+    }
+    v;
+  }
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_while_true_break_if3() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2;
+  while (true) {
+    if (c) {
+      v1 = 0;
+      v2 = 0;
+      if (c) break;
+    } else {
+      if (c) break;
+      v1 = 0;
+      v2 = 0;
+    }
+    v1;
+  }
+  v2;
+}
+''');
+    assertReadBeforeWritten('v2');
+  }
+
+  test_while_true_breakOuterFromInner() async {
+    await trackCode(r'''
+main(bool c) {
+  int v1, v2, v3;
+  L1: while (true) {
+    L2: while (true) {
+      v1 = 0;
+      if (c) break L1;
+      v2 = 0;
+      v3 = 0;
+      if (c) break L2;
+    }
+    v2;
+  }
+  v1;
+  v3;
+}
+''');
+    assertReadBeforeWritten('v3');
+  }
+
+  test_while_true_continue() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  while (true) {
+    if (c) continue;
+    v = 0;
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  test_while_true_noBreak() async {
+    await trackCode(r'''
+main(bool c) {
+  int v;
+  while (true) {
+    // No assignment, but not break.
+    // So, we don't exit the loop.
+    // So, all variables are assigned.
+  }
+  v;
+}
+''');
+    assertReadBeforeWritten();
+  }
+
+  /// Resolve the given [code] and track assignments in the unit.
+  Future<void> trackCode(String code) async {
+    addTestFile(code);
+    await resolveTestFile();
+
+    tracker = DefiniteAssignmentTracker();
+
+    var visitor = _AstVisitor(tracker);
+    result.unit.accept(visitor);
+  }
+}
+
+/// [AstVisitor] that drives the [tracker] in the way we expect the resolver
+/// will do in production.
+class _AstVisitor extends RecursiveAstVisitor<void> {
+  final DefiniteAssignmentTracker tracker;
+
+  _AstVisitor(this.tracker);
+
+  @override
+  void visitAssertStatement(AssertStatement node) {
+    tracker.beginAssertStatement();
+    super.visitAssertStatement(node);
+    tracker.endAssertStatement();
+  }
+
+  @override
+  void visitAssignmentExpression(AssignmentExpression node) {
+    var left = node.leftHandSide;
+    var right = node.rightHandSide;
+
+    LocalVariableElement localElement;
+    if (left is SimpleIdentifier) {
+      var element = left.staticElement;
+      if (element is LocalVariableElement) {
+        localElement = element;
+      }
+    }
+
+    if (localElement != null) {
+      var isPure = node.operator.type == TokenType.EQ;
+      if (!isPure) {
+        tracker.read(localElement);
+      }
+      right.accept(this);
+      tracker.write(localElement);
+    } else {
+      left.accept(this);
+      right.accept(this);
+    }
+  }
+
+  @override
+  void visitBinaryExpression(BinaryExpression node) {
+    var left = node.leftOperand;
+    var right = node.rightOperand;
+
+    var operator = node.operator.type;
+    var isLogical = operator == TokenType.AMPERSAND_AMPERSAND ||
+        operator == TokenType.BAR_BAR ||
+        operator == TokenType.QUESTION_QUESTION;
+
+    left.accept(this);
+
+    if (isLogical) {
+      tracker.beginBinaryExpressionLogicalRight();
+    }
+
+    right.accept(this);
+
+    if (isLogical) {
+      tracker.endBinaryExpressionLogicalRight();
+    }
+  }
+
+  @override
+  void visitBreakStatement(BreakStatement node) {
+    var target = _getLabelTarget(node, node.label?.staticElement);
+    tracker.handleBreak(target);
+    super.visitBreakStatement(node);
+  }
+
+  @override
+  void visitConditionalExpression(ConditionalExpression node) {
+    var condition = node.condition;
+    var thenExpression = node.thenExpression;
+    var elseExpression = node.elseExpression;
+
+    condition.accept(this);
+
+    tracker.beginConditionalExpressionThen();
+    thenExpression.accept(this);
+
+    tracker.beginConditionalExpressionElse();
+    elseExpression.accept(this);
+
+    tracker.endConditionalExpression();
+  }
+
+  @override
+  void visitContinueStatement(ContinueStatement node) {
+    var target = _getLabelTarget(node, node.label?.staticElement);
+    tracker.handleContinue(target);
+    super.visitContinueStatement(node);
+  }
+
+  @override
+  void visitDoStatement(DoStatement node) {
+    var body = node.body;
+    var condition = node.condition;
+
+    tracker.beginDoWhileStatement(node);
+    body.accept(this);
+
+    tracker.beginDoWhileStatementCondition();
+    condition.accept(this);
+
+    tracker.endDoWhileStatement();
+  }
+
+  @override
+  void visitForEachStatement(ForEachStatement node) {
+    var iterable = node.iterable;
+    var body = node.body;
+
+    tracker.beginForEachStatement(node);
+    iterable.accept(this);
+
+    tracker.beginForEachStatementBody();
+    body.accept(this);
+
+    tracker.endForEachStatement();
+  }
+
+  @override
+  void visitForStatement(ForStatement node) {
+    var variables = node.variables;
+    var initialization = node.initialization;
+
+    var condition = node.condition;
+    var updaters = node.updaters;
+    var body = node.body;
+
+    tracker.beginForStatement(node);
+
+    variables?.accept(this);
+    initialization?.accept(this);
+    condition?.accept(this);
+
+    tracker.beginForStatementBody();
+    body?.accept(this);
+
+    tracker.beginForStatementUpdaters();
+    updaters?.accept(this);
+
+    tracker.endForStatement();
+  }
+
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    super.visitFunctionDeclaration(node);
+    if (node.parent is CompilationUnit) {
+      expect(tracker.isRootBranch, isTrue);
+    }
+  }
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    tracker.beginFunctionExpression();
+    super.visitFunctionExpression(node);
+    tracker.endFunctionExpression();
+  }
+
+  @override
+  void visitIfStatement(IfStatement node) {
+    var condition = node.condition;
+    var thenStatement = node.thenStatement;
+    var elseStatement = node.elseStatement;
+
+    condition.accept(this);
+
+    tracker.beginIfStatementThen();
+    thenStatement.accept(this);
+
+    if (elseStatement != null) {
+      tracker.beginIfStatementElse();
+      elseStatement.accept(this);
+    }
+
+    tracker.endIfStatement(elseStatement != null);
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    super.visitMethodInvocation(node);
+    var element = node.methodName.staticElement;
+    if (element != null && element.hasAlwaysThrows) {
+      tracker.handleExit();
+    }
+  }
+
+  @override
+  void visitReturnStatement(ReturnStatement node) {
+    super.visitReturnStatement(node);
+    tracker.handleExit();
+  }
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    var element = node.staticElement;
+    if (element is LocalVariableElement) {
+      if (node.inGetterContext()) {
+        tracker.read(element);
+      }
+    }
+
+    super.visitSimpleIdentifier(node);
+  }
+
+  @override
+  void visitSwitchStatement(SwitchStatement node) {
+    tracker.beginSwitchStatement(node);
+
+    node.expression.accept(this);
+    tracker.endSwitchStatementExpression();
+
+    var members = node.members;
+    var membersLength = members.length;
+    var hasDefault = false;
+    for (var i = 0; i < membersLength; i++) {
+      var member = members[i];
+      tracker.beginSwitchStatementMember();
+      member.accept(this);
+      // Implicit `break` at the end of `default`.
+      if (member is SwitchDefault) {
+        hasDefault = true;
+        tracker.handleBreak(node);
+      }
+    }
+
+    tracker.endSwitchStatement(hasDefault);
+  }
+
+  @override
+  void visitThrowExpression(ThrowExpression node) {
+    super.visitThrowExpression(node);
+    tracker.handleExit();
+  }
+
+  @override
+  void visitTryStatement(TryStatement node) {
+    var body = node.body;
+    var catchClauses = node.catchClauses;
+
+    tracker.beginTryStatement();
+
+    body.accept(this);
+    tracker.endTryStatementBody();
+
+    var catchLength = catchClauses.length;
+    for (var i = 0; i < catchLength; ++i) {
+      var catchClause = catchClauses[i];
+      tracker.beginTryStatementCatchClause();
+      catchClause.accept(this);
+      tracker.endTryStatementCatchClause();
+    }
+
+    tracker.endTryStatementCatchClauses();
+
+    node.finallyBlock?.accept(this);
+  }
+
+  @override
+  void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    var variables = node.variables.variables;
+    for (var i = 0; i < variables.length; ++i) {
+      var variable = variables[i];
+      tracker.add(variable.declaredElement,
+          assigned: variable.initializer != null);
+    }
+
+    super.visitVariableDeclarationStatement(node);
+  }
+
+  @override
+  void visitWhileStatement(WhileStatement node) {
+    var condition = node.condition;
+    var body = node.body;
+
+    tracker.beginWhileStatement(node);
+    condition.accept(this);
+
+    var conditionIsLiteralTrue = condition is BooleanLiteral && condition.value;
+    tracker.beginWhileStatementBody(conditionIsLiteralTrue);
+    body.accept(this);
+
+    tracker.endWhileStatement();
+  }
+
+  /// This code has OK performance for tests, but think if there is something
+  /// better when using in production.
+  AstNode _getLabelTarget(AstNode node, LabelElement element) {
+    for (; node != null; node = node.parent) {
+      if (node is DoStatement ||
+          node is ForEachStatement ||
+          node is ForStatement ||
+          node is SwitchStatement ||
+          node is WhileStatement) {
+        if (element == null) {
+          return node;
+        }
+        var parent = node.parent;
+        if (parent is LabeledStatement) {
+          for (var nodeLabel in parent.labels) {
+            if (identical(nodeLabel.label.staticElement, element)) {
+              return node;
+            }
+          }
+        }
+      }
+      if (element != null && node is SwitchStatement) {
+        for (var member in node.members) {
+          for (var nodeLabel in member.labels) {
+            if (identical(nodeLabel.label.staticElement, element)) {
+              return node;
+            }
+          }
+        }
+      }
+    }
+    return null;
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart b/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
index fb034da..081ef0e 100644
--- a/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/driver_resolution.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -13,14 +13,13 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 
-import '../../context/mock_sdk.dart';
 import 'resolution.dart';
 
 /// [AnalysisDriver] based implementation of [ResolutionTest].
-class DriverResolutionTest extends Object
-    with ResourceProviderMixin, ResolutionTest {
+class DriverResolutionTest with ResourceProviderMixin, ResolutionTest {
   final ByteStore byteStore = new MemoryByteStore();
 
   final StringBuffer logBuffer = new StringBuffer();
@@ -30,9 +29,20 @@
   AnalysisDriverScheduler scheduler;
   AnalysisDriver driver;
 
+  /// Override this to change the analysis options for a given set of tests.
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl();
+
+  void addMetaPackage() {
+    newFile('/.pub-cache/meta/lib/meta.dart', content: r'''
+library meta;
+
+const alwaysThrows = const Object();
+''');
+  }
+
   @override
   Future<TestAnalysisResult> resolveFile(String path) async {
-    AnalysisResult result = await driver.getResult(path);
+    var result = await driver.getResult(path);
     return new TestAnalysisResult(
       path,
       result.content,
@@ -50,6 +60,7 @@
       'test': [getFolder('/test/lib')],
       'aaa': [getFolder('/aaa/lib')],
       'bbb': [getFolder('/bbb/lib')],
+      'meta': [getFolder('/.pub-cache/meta/lib')],
     };
 
     driver = new AnalysisDriver(
@@ -64,7 +75,7 @@
           new PackageMapUriResolver(resourceProvider, packageMap),
           new ResourceUriResolver(resourceProvider)
         ], null, resourceProvider),
-        new AnalysisOptionsImpl());
+        analysisOptions);
 
     scheduler.start();
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index d30bf67..ff350fb 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
+import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'driver_resolution.dart';
@@ -20,7 +21,7 @@
 class EnumDriverResolutionTest extends DriverResolutionTest
     with EnumResolutionMixin {}
 
-abstract class EnumResolutionMixin implements ResolutionTest {
+mixin EnumResolutionMixin implements ResolutionTest {
   test_error_conflictingStaticAndInstance_index() async {
     addTestFile(r'''
 enum E {
@@ -44,6 +45,20 @@
     var v = findElement.topVar('v');
     assertElementTypeString(v.type, 'List<Object>');
   }
+
+  test_isConstantEvaluated() async {
+    addTestFile(r'''
+enum E {
+  aaa, bbb
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    expect(findElement.field('aaa').isConstantEvaluated, isTrue);
+    expect(findElement.field('bbb').isConstantEvaluated, isTrue);
+    expect(findElement.field('values').isConstantEvaluated, isTrue);
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analyzer/test/src/dart/resolution/find_element.dart b/pkg/analyzer/test/src/dart/resolution/find_element.dart
index dff0500..d0ac7bf 100644
--- a/pkg/analyzer/test/src/dart/resolution/find_element.dart
+++ b/pkg/analyzer/test/src/dart/resolution/find_element.dart
@@ -9,6 +9,7 @@
 
 import 'function_ast_visitor.dart';
 
+/// Helper for finding elements declared in the resolved [unit].
 class FindElement {
   final CompilationUnit unit;
 
@@ -22,18 +23,18 @@
         return class_;
       }
     }
-    fail('Not found class: $name');
+    fail('Not found: $name');
   }
 
-  ConstructorElement constructor(String name, {String className}) {
+  ConstructorElement constructor(String name, {String of}) {
     assert(name != '');
     ConstructorElement result;
     for (var class_ in unitElement.types) {
-      if (className == null || class_.name == className) {
+      if (of == null || class_.name == of) {
         for (var constructor in class_.constructors) {
           if (constructor.name == name) {
             if (result != null) {
-              throw new StateError('Not constructor name: $name');
+              fail('Not unique: $name');
             }
             result = constructor;
           }
@@ -43,7 +44,7 @@
     if (result != null) {
       return result;
     }
-    fail('Not found constructor: $name');
+    fail('Not found: $name');
   }
 
   ClassElement enum_(String name) {
@@ -52,42 +53,67 @@
         return enum_;
       }
     }
-    fail('Not found enum: $name');
+    fail('Not found: $name');
   }
 
   ExportElement export(String targetUri) {
-    ExportElement exportElement;
+    ExportElement result;
+
     for (var export in unitElement.library.exports) {
       var exportedUri = export.exportedLibrary.source.uri.toString();
       if (exportedUri == targetUri) {
-        if (exportElement != null) {
-          throw new StateError('Not unique $targetUri export.');
+        if (result != null) {
+          fail('Not unique: $targetUri');
         }
-        exportElement = export;
+        result = export;
       }
     }
-    if (exportElement != null) {
-      return exportElement;
+
+    if (result != null) {
+      return result;
     }
-    fail('Not found export: $targetUri');
+    fail('Not found: $targetUri');
   }
 
-  FieldElement field(String name) {
-    for (var type in unitElement.mixins) {
-      for (var field in type.fields) {
+  FieldElement field(String name, {String of}) {
+    FieldElement result;
+
+    void findIn(List<FieldElement> fields) {
+      for (var field in fields) {
         if (field.name == name) {
-          return field;
+          if (result != null) {
+            fail('Not unique: $name');
+          }
+          result = field;
         }
       }
     }
-    for (var type in unitElement.types) {
-      for (var field in type.fields) {
-        if (field.name == name) {
-          return field;
-        }
+
+    for (var enum_ in unitElement.enums) {
+      if (of != null && enum_.name != of) {
+        continue;
       }
+      findIn(enum_.fields);
     }
-    fail('Not found class field: $name');
+
+    for (var class_ in unitElement.types) {
+      if (of != null && class_.name != of) {
+        continue;
+      }
+      findIn(class_.fields);
+    }
+
+    for (var mixin in unitElement.mixins) {
+      if (of != null && mixin.name != of) {
+        continue;
+      }
+      findIn(mixin.fields);
+    }
+
+    if (result != null) {
+      return result;
+    }
+    fail('Not found: $name');
   }
 
   FunctionElement function(String name) {
@@ -96,7 +122,7 @@
         return function;
       }
     }
-    fail('Not found top-level function: $name');
+    fail('Not found: $name');
   }
 
   GenericTypeAliasElement genericTypeAlias(String name) {
@@ -105,59 +131,111 @@
         return element;
       }
     }
-    fail('Not found generic type alias: $name');
+    fail('Not found: $name');
   }
 
-  PropertyAccessorElement getter(String name, {String className}) {
-    for (var class_ in unitElement.types) {
-      if (className != null && class_.name != className) {
-        continue;
-      }
-      for (var accessor in class_.accessors) {
+  PropertyAccessorElement getter(String name, {String of}) {
+    PropertyAccessorElement result;
+
+    void findIn(List<PropertyAccessorElement> accessors) {
+      for (var accessor in accessors) {
         if (accessor.isGetter && accessor.displayName == name) {
-          return accessor;
+          if (result != null) {
+            fail('Not unique: $name');
+          }
+          result = accessor;
         }
       }
     }
-    fail('Not found class accessor: $name');
+
+    for (var enum_ in unitElement.enums) {
+      if (of != null && enum_.name != of) {
+        continue;
+      }
+      findIn(enum_.accessors);
+    }
+
+    for (var class_ in unitElement.types) {
+      if (of != null && class_.name != of) {
+        continue;
+      }
+      findIn(class_.accessors);
+    }
+
+    for (var mixin in unitElement.mixins) {
+      if (of != null && mixin.name != of) {
+        continue;
+      }
+      findIn(mixin.accessors);
+    }
+
+    if (result != null) {
+      return result;
+    }
+    fail('Not found: $name');
   }
 
   ImportElement import(String targetUri) {
     ImportElement importElement;
+
     for (var import in unitElement.library.imports) {
       var importedUri = import.importedLibrary.source.uri.toString();
       if (importedUri == targetUri) {
         if (importElement != null) {
-          throw new StateError('Not unique $targetUri import.');
+          fail('Not unique: $targetUri');
         }
         importElement = import;
       }
     }
+
     if (importElement != null) {
       return importElement;
     }
-    fail('Not found import: $targetUri');
+    fail('Not found: $targetUri');
   }
 
   InterfaceType interfaceType(String name) {
     return class_(name).type;
   }
 
-  LocalVariableElement localVar(String name) {
-    LocalVariableElement result;
+  FunctionElement localFunction(String name) {
+    FunctionElement result;
+
     unit.accept(new FunctionAstVisitor(
-      variableDeclaration: (node) {
-        var element = node.declaredElement;
-        if (element is LocalVariableElement) {
+      functionDeclarationStatement: (node) {
+        var element = node.functionDeclaration.declaredElement;
+        if (element is FunctionElement) {
           if (result != null) {
-            throw new StateError('Local variable name $name is not unique.');
+            fail('Not unique: $name');
           }
           result = element;
         }
       },
     ));
+
     if (result == null) {
-      fail('Not found local variable: $name');
+      fail('Not found: $name');
+    }
+    return result;
+  }
+
+  LocalVariableElement localVar(String name) {
+    LocalVariableElement result;
+
+    unit.accept(new FunctionAstVisitor(
+      variableDeclaration: (node) {
+        var element = node.declaredElement;
+        if (element is LocalVariableElement && element.name == name) {
+          if (result != null) {
+            fail('Not unique: $name');
+          }
+          result = element;
+        }
+      },
+    ));
+
+    if (result == null) {
+      fail('Not found: $name');
     }
     return result;
   }
@@ -169,7 +247,7 @@
       for (var method in methods) {
         if (method.name == name) {
           if (result != null) {
-            throw new StateError('Method name $name is not unique.');
+            fail('Not unique: $name');
           }
           result = method;
         }
@@ -193,7 +271,7 @@
     if (result != null) {
       return result;
     }
-    fail('Not found class method: $name');
+    fail('Not found: $name');
   }
 
   ClassElement mixin(String name) {
@@ -202,73 +280,92 @@
         return mixin;
       }
     }
-    fail('Not found mixin: $name');
+    fail('Not found: $name');
   }
 
   ParameterElement parameter(String name) {
-    ParameterElement parameterElement;
-    void considerParameter(ParameterElement parameter) {
-      if (parameter.name == name) {
-        if (parameterElement != null) {
-          throw new StateError('Parameter name $name is not unique.');
+    ParameterElement result;
+
+    void findIn(List<ParameterElement> parameters) {
+      for (var parameter in parameters) {
+        if (parameter.name == name) {
+          if (result != null) {
+            fail('Not unique: $name');
+          }
+          result = parameter;
         }
-        parameterElement = parameter;
       }
     }
 
     for (var accessor in unitElement.accessors) {
-      accessor.parameters.forEach(considerParameter);
+      findIn(accessor.parameters);
     }
+
     for (var function in unitElement.functions) {
-      function.parameters.forEach(considerParameter);
+      findIn(function.parameters);
     }
+
     for (var function in unitElement.functionTypeAliases) {
-      function.parameters.forEach(considerParameter);
+      findIn(function.parameters);
     }
+
     for (var class_ in unitElement.types) {
       for (var constructor in class_.constructors) {
-        constructor.parameters.forEach(considerParameter);
+        findIn(constructor.parameters);
       }
       for (var method in class_.methods) {
-        method.parameters.forEach(considerParameter);
+        findIn(method.parameters);
       }
     }
-    if (parameterElement != null) {
-      return parameterElement;
+
+    if (result != null) {
+      return result;
     }
-    fail('No parameter found with name $name');
+    fail('Not found: $name');
   }
 
   PrefixElement prefix(String name) {
     for (var import_ in unitElement.library.imports) {
       var prefix = import_.prefix;
-      if (prefix != null && prefix.name == name) {
+      if (prefix?.name == name) {
         return prefix;
       }
     }
-    fail('Prefix not found: $name');
+    fail('Not found: $name');
   }
 
-  PropertyAccessorElement setter(String name, {String className}) {
+  PropertyAccessorElement setter(String name, {String of}) {
     PropertyAccessorElement result;
-    for (var class_ in unitElement.types) {
-      if (className != null && class_.name != className) {
-        continue;
-      }
-      for (var accessor in class_.accessors) {
+
+    void findIn(List<PropertyAccessorElement> accessors) {
+      for (var accessor in accessors) {
         if (accessor.isSetter && accessor.displayName == name) {
-          if (result == null) {
-            result = accessor;
-          } else {
-            throw new StateError('Class setter $name is not unique.');
+          if (result != null) {
+            fail('Not unique: $name');
           }
+          result = accessor;
         }
       }
     }
-    if (result == null) {
-      fail('Not found class setter: $name');
+
+    for (var class_ in unitElement.types) {
+      if (of != null && class_.name != of) {
+        continue;
+      }
+      findIn(class_.accessors);
     }
-    return result;
+
+    for (var mixin in unitElement.mixins) {
+      if (of != null && mixin.name != of) {
+        continue;
+      }
+      findIn(mixin.accessors);
+    }
+
+    if (result != null) {
+      return result;
+    }
+    fail('Not found: $name');
   }
 
   FunctionElement topFunction(String name) {
@@ -277,7 +374,7 @@
         return function;
       }
     }
-    fail('Not found top-level function: $name');
+    fail('Not found: $name');
   }
 
   PropertyAccessorElement topGet(String name) {
@@ -294,31 +391,42 @@
         return variable;
       }
     }
-    fail('Not found top-level variable: $name');
+    fail('Not found: $name');
   }
 
   TypeParameterElement typeParameter(String name) {
     TypeParameterElement result;
 
-    void consider(TypeParameterElement candidate) {
-      if (candidate.name == name) {
-        if (result != null) {
-          throw new StateError('Type parameter $name is not unique.');
+    void findIn(List<TypeParameterElement> typeParameters) {
+      for (var typeParameter in typeParameters) {
+        if (typeParameter.name == name) {
+          if (result != null) {
+            fail('Not unique: $name');
+          }
+          result = typeParameter;
         }
-        result = candidate;
       }
     }
 
     for (var type in unitElement.functionTypeAliases) {
-      type.typeParameters.forEach(consider);
+      findIn(type.typeParameters);
+      if (type is GenericTypeAliasElement) {
+        findIn(type.function.typeParameters);
+      }
     }
-    for (var type in unitElement.types) {
-      type.typeParameters.forEach(consider);
+
+    for (var class_ in unitElement.types) {
+      findIn(class_.typeParameters);
     }
+
+    for (var mixin in unitElement.mixins) {
+      findIn(mixin.typeParameters);
+    }
+
     if (result != null) {
       return result;
     }
-    fail('Not found type parameter: $name');
+    fail('Not found: $name');
   }
 
   ConstructorElement unnamedConstructor(String name) {
diff --git a/pkg/analyzer/test/src/dart/resolution/find_node.dart b/pkg/analyzer/test/src/dart/resolution/find_node.dart
index 67271af..08de2f9 100644
--- a/pkg/analyzer/test/src/dart/resolution/find_node.dart
+++ b/pkg/analyzer/test/src/dart/resolution/find_node.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -28,6 +28,10 @@
     return _node(search, (n) => n is CascadeExpression);
   }
 
+  ClassDeclaration classDeclaration(String search) {
+    return _node(search, (n) => n is ClassDeclaration);
+  }
+
   CommentReference commentReference(String search) {
     return _node(search, (n) => n is CommentReference);
   }
@@ -158,7 +162,7 @@
     var node = new NodeLocator2(index).searchWithin(unit);
     expect(node, isNotNull);
 
-    var result = node.getAncestor(predicate);
+    var result = node.thisOrAncestorMatching(predicate);
     expect(result, isNotNull);
     return result;
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/for_in_test.dart b/pkg/analyzer/test/src/dart/resolution/for_in_test.dart
index fdbdd76..7ec1a40 100644
--- a/pkg/analyzer/test/src/dart/resolution/for_in_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/for_in_test.dart
@@ -20,7 +20,7 @@
 class ForInDriverResolutionTest extends DriverResolutionTest
     with ForInResolutionMixin {}
 
-abstract class ForInResolutionMixin implements ResolutionTest {
+mixin ForInResolutionMixin implements ResolutionTest {
   test_importPrefix_asIterable() async {
     // TODO(scheglov) Remove this test (already tested as import prefix).
     // TODO(scheglov) Move other for-in tests here.
diff --git a/pkg/analyzer/test/src/dart/resolution/function_ast_visitor.dart b/pkg/analyzer/test/src/dart/resolution/function_ast_visitor.dart
index 82ae780..f3c951b 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_ast_visitor.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_ast_visitor.dart
@@ -7,10 +7,23 @@
 
 /// [RecursiveAstVisitor] that delegates visit methods to functions.
 class FunctionAstVisitor extends RecursiveAstVisitor<void> {
+  final void Function(FunctionDeclarationStatement)
+      functionDeclarationStatement;
   final void Function(SimpleIdentifier) simpleIdentifier;
   final void Function(VariableDeclaration) variableDeclaration;
 
-  FunctionAstVisitor({this.simpleIdentifier, this.variableDeclaration});
+  FunctionAstVisitor(
+      {this.functionDeclarationStatement,
+      this.simpleIdentifier,
+      this.variableDeclaration});
+
+  @override
+  void visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    if (functionDeclarationStatement != null) {
+      functionDeclarationStatement(node);
+    }
+    super.visitFunctionDeclarationStatement(node);
+  }
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
diff --git a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
index 7f24421a..2e64644 100644
--- a/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/generic_type_alias_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/error/codes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -20,7 +21,111 @@
 class GenericTypeAliasDriverResolutionTest extends DriverResolutionTest
     with GenericTypeAliasResolutionMixin {}
 
-abstract class GenericTypeAliasResolutionMixin implements ResolutionTest {
+mixin GenericTypeAliasResolutionMixin implements ResolutionTest {
+  test_genericFunctionTypeCannotBeTypeArgument_def_class() async {
+    addTestFile(r'''
+class C<T> {}
+
+typedef G = Function<S>();
+
+C<G> x;
+''');
+    await resolveTestFile();
+    assertTestErrors(
+      [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
+    );
+  }
+
+  test_genericFunctionTypeCannotBeTypeArgument_literal_class() async {
+    addTestFile(r'''
+class C<T> {}
+
+C<Function<S>()> x;
+''');
+    await resolveTestFile();
+    assertTestErrors(
+      [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
+    );
+  }
+
+  test_genericFunctionTypeCannotBeTypeArgument_literal_function() async {
+    addTestFile(r'''
+T f<T>(T) => null;
+
+main() {
+  f<Function<S>()>(null);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors(
+      [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
+    );
+  }
+
+  test_genericFunctionTypeCannotBeTypeArgument_literal_functionType() async {
+    addTestFile(r'''
+T Function<T>(T) f;
+
+main() {
+  f<Function<S>()>(null);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors(
+      [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
+    );
+  }
+
+  test_genericFunctionTypeCannotBeTypeArgument_literal_method() async {
+    addTestFile(r'''
+class C {
+  T f<T>(T) => null;
+}
+
+main() {
+  new C().f<Function<S>()>(null);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors(
+      [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
+    );
+  }
+
+  test_genericFunctionTypeCannotBeTypeArgument_literal_typedef() async {
+    addTestFile(r'''
+typedef T F<T>(T t);
+
+F<Function<S>()> x;
+''');
+    await resolveTestFile();
+    assertTestErrors(
+      [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT],
+    );
+  }
+
+  test_genericFunctionTypeCannotBeTypeArgument_OK_def_class() async {
+    addTestFile(r'''
+class C<T> {}
+
+typedef G = Function();
+
+C<G> x;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
+  test_genericFunctionTypeCannotBeTypeArgument_OK_literal_class() async {
+    addTestFile(r'''
+class C<T> {}
+
+C<Function()> x;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
   test_typeParameters() async {
     addTestFile(r'''
 class A {}
diff --git a/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart b/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
index a269e79..b13db90 100644
--- a/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/import_prefix_test.dart
@@ -21,7 +21,7 @@
 class ImportPrefixDriverResolutionTest extends DriverResolutionTest
     with ImportPrefixResolutionMixin {}
 
-abstract class ImportPrefixResolutionMixin implements ResolutionTest {
+mixin ImportPrefixResolutionMixin implements ResolutionTest {
   test_asExpression_expressionStatement() async {
     addTestFile(r'''
 import 'dart:async' as p;
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
index 9594336..302d84b 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -20,7 +20,7 @@
 class InstanceCreationDriverResolutionTest extends DriverResolutionTest
     with InstanceCreationResolutionMixin {}
 
-abstract class InstanceCreationResolutionMixin implements ResolutionTest {
+mixin InstanceCreationResolutionMixin implements ResolutionTest {
   test_error_wrongNumberOfTypeArgumentsConstructor_explicitNew() async {
     addTestFile(r'''
 class Foo<X> {
@@ -47,6 +47,24 @@
 //    );
   }
 
+  test_error_newWithInvalidTypeParameters_implicitNew_inference_top() async {
+    addTestFile(r'''
+final foo = Map<int>();
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS,
+    ]);
+
+    var creation = findNode.instanceCreation('Map<int>');
+    assertInstanceCreation(
+      creation,
+      mapElement,
+      'Map<dynamic, dynamic>',
+      expectedConstructorMember: true,
+    );
+  }
+
   test_error_wrongNumberOfTypeArgumentsConstructor_explicitNew_prefix() async {
     newFile('/test/lib/a.dart', content: '''
 class Foo<X> {
@@ -137,4 +155,10 @@
 
 @reflectiveTest
 class InstanceCreationTaskResolutionTest extends TaskResolutionTest
-    with InstanceCreationResolutionMixin {}
+    with InstanceCreationResolutionMixin {
+  @FailingTest(reason: 'Does not report the error.')
+  test_error_newWithInvalidTypeParameters_implicitNew_inference_top() {
+    return super
+        .test_error_newWithInvalidTypeParameters_implicitNew_inference_top();
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
index 1218643..ad4b765 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_class_test.dart
@@ -19,7 +19,7 @@
 class InstanceMemberInferenceClassDriverResolutionTest
     extends DriverResolutionTest with InstanceMemberInferenceClassMixin {}
 
-abstract class InstanceMemberInferenceClassMixin implements ResolutionTest {
+mixin InstanceMemberInferenceClassMixin implements ResolutionTest {
   test_invalid_inheritanceCycle() async {
     addTestFile('''
 class A extends C {}
diff --git a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart
index 387e166..36db4b0 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_member_inference_mixin_test.dart
@@ -19,7 +19,7 @@
 class InstanceMemberInferenceMixinDriverResolutionTest
     extends DriverResolutionTest with InstanceMemberInferenceMixinMixin {}
 
-abstract class InstanceMemberInferenceMixinMixin implements ResolutionTest {
+mixin InstanceMemberInferenceMixinMixin implements ResolutionTest {
   test_invalid_inheritanceCycle() async {
     addTestFile('''
 mixin A on C {}
diff --git a/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
new file mode 100644
index 0000000..a10b0e1
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/method_invocation_test.dart
@@ -0,0 +1,1776 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MethodInvocationResolutionTest);
+  });
+}
+
+@reflectiveTest
+class MethodInvocationResolutionTest extends DriverResolutionTest {
+  test_error_abstractSuperMemberReference() async {
+    addTestFile(r'''
+abstract class A {
+  void foo(int _);
+}
+abstract class B extends A {
+  void bar() {
+    super.foo(0);
+  }
+
+  void foo(int _) {} // does not matter
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo', of: 'A'),
+      '(int) → void',
+    );
+    assertSuperExpression(invocation.target);
+  }
+
+  test_error_abstractSuperMemberReference_mixinHasNoSuchMethod() async {
+    addTestFile('''
+class A {
+  int foo();
+  noSuchMethod(im) => 42;
+}
+
+class B extends Object with A {
+  foo() => super.foo(); // ref
+  noSuchMethod(im) => 87;
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+
+    var invocation = findNode.methodInvocation('foo(); // ref');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo', of: 'A'),
+      '() → int',
+    );
+    assertSuperExpression(invocation.target);
+  }
+
+  test_error_abstractSuperMemberReference_OK_mixinHasConcrete() async {
+    addTestFile('''
+class A {}
+
+class M {
+  void foo(int _) {}
+}
+
+class B = A with M;
+
+class C extends B {
+  void bar() {
+    super.foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo', of: 'M'),
+      '(int) → void',
+    );
+    assertSuperExpression(invocation.target);
+  }
+
+  test_error_abstractSuperMemberReference_OK_superHasNoSuchMethod() async {
+    addTestFile(r'''
+class A {
+  int foo();
+  noSuchMethod(im) => 42;
+}
+
+class B extends A {
+  int foo() => super.foo(); // ref
+  noSuchMethod(im) => 87;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('super.foo(); // ref');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo', of: 'A'),
+      '() → int',
+    );
+    assertSuperExpression(invocation.target);
+  }
+
+  test_error_abstractSuperMemberReference_OK_superSuperHasConcrete() async {
+    addTestFile('''
+abstract class A {
+  void foo(int _) {}
+}
+
+abstract class B extends A {
+  void foo(int _);
+}
+
+class C extends B {
+  void bar() {
+    super.foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo', of: 'A'),
+      '(int) → void',
+    );
+    assertSuperExpression(invocation.target);
+  }
+
+  test_error_ambiguousImport_topFunction() async {
+    newFile('/test/lib/a.dart', content: r'''
+void foo(int _) {}
+''');
+    newFile('/test/lib/b.dart', content: r'''
+void foo(int _) {}
+''');
+
+    addTestFile(r'''
+import 'a.dart';
+import 'b.dart';
+
+main() {
+  foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+    ]);
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertInvokeType(invocation, '(int) → void');
+    assertType(invocation, 'void');
+  }
+
+  test_error_ambiguousImport_topFunction_prefixed() async {
+    newFile('/test/lib/a.dart', content: r'''
+void foo(int _) {}
+''');
+    newFile('/test/lib/b.dart', content: r'''
+void foo(int _) {}
+''');
+
+    addTestFile(r'''
+import 'a.dart' as p;
+import 'b.dart' as p;
+
+main() {
+  p.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.AMBIGUOUS_IMPORT,
+    ]);
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertInvokeType(invocation, '(int) → void');
+    assertType(invocation, 'void');
+  }
+
+  test_error_instanceAccessToStaticMember_method() async {
+    addTestFile(r'''
+class A {
+  static void foo(int _) {}
+}
+
+main(A a) {
+  a.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
+    ]);
+    _assertInvalidInvocation(
+      'a.foo(0)',
+      findElement.method('foo'),
+      expectedNameType: '(int) → void',
+    );
+  }
+
+  test_error_invocationOfNonFunction_interface_hasCall_field() async {
+    addTestFile(r'''
+class C {
+  void Function() call;
+}
+
+main(C c) {
+  c();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+    ]);
+    _assertInvalidInvocation(
+      'c()',
+      findElement.parameter('c'),
+    );
+  }
+
+  test_error_invocationOfNonFunction_localVariable() async {
+    addTestFile(r'''
+main() {
+  Object foo;
+  foo();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+    ]);
+    _assertInvalidInvocation(
+      'foo()',
+      findElement.localVar('foo'),
+      expectedNameType: 'Object',
+    );
+  }
+
+  test_error_invocationOfNonFunction_OK_dynamic_localVariable() async {
+    addTestFile(r'''
+main() {
+  var foo;
+  foo();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertInvalidInvocation('foo();', findElement.localVar('foo'));
+  }
+
+  test_error_invocationOfNonFunction_OK_dynamicGetter_instance() async {
+    addTestFile(r'''
+class C {
+  var foo;
+}
+
+main(C c) {
+  c.foo();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertInvalidInvocation(
+      'c.foo();',
+      findElement.getter('foo'),
+      expectedMethodNameType: '() → dynamic',
+    );
+  }
+
+  test_error_invocationOfNonFunction_OK_dynamicGetter_superClass() async {
+    addTestFile(r'''
+class A {
+  var foo;
+}
+
+class B extends A {
+  main() {
+    foo();
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertInvalidInvocation(
+      'foo();',
+      findElement.getter('foo'),
+      expectedMethodNameType: '() → dynamic',
+    );
+  }
+
+  test_error_invocationOfNonFunction_OK_dynamicGetter_thisClass() async {
+    addTestFile(r'''
+class C {
+  var foo;
+
+  main() {
+    foo();
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertInvalidInvocation(
+      'foo();',
+      findElement.getter('foo'),
+      expectedMethodNameType: '() → dynamic',
+    );
+  }
+
+  test_error_invocationOfNonFunction_OK_Function() async {
+    addTestFile(r'''
+f(Function foo) {
+  foo(1, 2);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertInvalidInvocation('foo(1, 2);', findElement.parameter('foo'));
+  }
+
+  test_error_invocationOfNonFunction_OK_functionTypeTypeParameter() async {
+    addTestFile(r'''
+typedef MyFunction = double Function(int _);
+
+class C<T extends MyFunction> {
+  T foo;
+  
+  main() {
+    foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    assertMethodInvocation(
+      findNode.methodInvocation('foo(0)'),
+      findElement.getter('foo'),
+      '(int) → double',
+      expectedMethodNameType: '() → T',
+    );
+  }
+
+  test_error_invocationOfNonFunction_static_hasTarget() async {
+    addTestFile(r'''
+class C {
+  static int foo;
+}
+
+main() {
+  C.foo();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+    ]);
+    _assertInvalidInvocation(
+      'foo()',
+      findElement.getter('foo'),
+      expectedMethodNameType: '() → int',
+    );
+  }
+
+  test_error_invocationOfNonFunction_static_noTarget() async {
+    addTestFile(r'''
+class C {
+  static int foo;
+  
+  main() {
+    foo();
+  }
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+    ]);
+    _assertInvalidInvocation(
+      'foo()',
+      findElement.getter('foo'),
+      expectedMethodNameType: '() → int',
+    );
+  }
+
+  test_error_invocationOfNonFunction_super_getter() async {
+    addTestFile(r'''
+class A {
+  int get foo => 0;
+}
+
+class B extends A {
+  main() {
+    super.foo();
+  }
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION,
+    ]);
+    _assertInvalidInvocation(
+      'foo()',
+      findElement.getter('foo'),
+      expectedMethodNameType: '() → int',
+    );
+  }
+
+  test_error_prefixIdentifierNotFollowedByDot() async {
+    newFile('/test/lib/a.dart', content: r'''
+void foo() {}
+''');
+
+    addTestFile(r'''
+import 'a.dart' as prefix;
+
+main() {
+  prefix?.foo();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
+    ]);
+
+    var import = _importFinder('package:test/a.dart');
+
+    var invocation = findNode.methodInvocation('foo();');
+    assertMethodInvocation(
+      invocation,
+      import.topFunction('foo'),
+      '() → void',
+    );
+    assertImportPrefix(invocation.target, import.prefix);
+  }
+
+  test_error_prefixIdentifierNotFollowedByDot_deferred() async {
+    addTestFile(r'''
+import 'dart:math' deferred as math;
+
+main() {
+  math?.loadLibrary();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
+    ]);
+
+    var import = _importFinder('dart:math');
+
+    var invocation = findNode.methodInvocation('loadLibrary()');
+    assertMethodInvocation(
+      invocation,
+      import.importedLibrary.loadLibraryFunction,
+      '() → Future<dynamic>',
+    );
+    assertImportPrefix(invocation.target, import.prefix);
+  }
+
+  test_error_prefixIdentifierNotFollowedByDot_invoke() async {
+    addTestFile(r'''
+import 'dart:math' as foo;
+
+main() {
+  foo();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
+    ]);
+    _assertInvalidInvocation(
+      'foo()',
+      findElement.import('dart:math').prefix,
+      dynamicNameType: true,
+    );
+  }
+
+  test_error_undefinedFunction() async {
+    addTestFile(r'''
+main() {
+  foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_FUNCTION,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0)');
+  }
+
+  test_error_undefinedFunction_hasTarget_importPrefix() async {
+    addTestFile(r'''
+import 'dart:math' as math;
+
+main() {
+  math.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_FUNCTION,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0);');
+  }
+
+  test_error_undefinedIdentifier_target() async {
+    addTestFile(r'''
+main() {
+  bar.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.UNDEFINED_IDENTIFIER,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0);');
+  }
+
+  test_error_undefinedMethod_hasTarget_class() async {
+    addTestFile(r'''
+class C {}
+main() {
+  C.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0);');
+  }
+
+  test_error_undefinedMethod_hasTarget_class_arguments() async {
+    addTestFile(r'''
+class C {}
+
+int x;
+main() {
+  C.foo(x);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+
+    _assertUnresolvedMethodInvocation('foo(x);');
+    assertTopGetRef('x)', 'x');
+  }
+
+  test_error_undefinedMethod_hasTarget_class_inSuperclass() async {
+    addTestFile(r'''
+class S {
+  static void foo(int _) {}
+}
+
+class C extends S {}
+
+main() {
+  C.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0);');
+  }
+
+  test_error_undefinedMethod_hasTarget_class_typeArguments() async {
+    addTestFile(r'''
+class C {}
+
+main() {
+  C.foo<int>();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+
+    _assertUnresolvedMethodInvocation('foo<int>();');
+    assertTypeName(findNode.typeName('int>'), intElement, 'int');
+  }
+
+  test_error_undefinedMethod_hasTarget_class_typeParameter() async {
+    addTestFile(r'''
+class C<T> {
+  static main() => C.T();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+    _assertUnresolvedMethodInvocation('C.T();');
+  }
+
+  test_error_undefinedMethod_hasTarget_instance() async {
+    addTestFile(r'''
+main() {
+  42.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0);');
+  }
+
+  test_error_undefinedMethod_hasTarget_localVariable_function() async {
+    addTestFile(r'''
+main() {
+  var v = () {};
+  v.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0);');
+  }
+
+  test_error_undefinedMethod_noTarget() async {
+    addTestFile(r'''
+class C {
+  main() {
+    foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0);');
+  }
+
+  test_error_undefinedMethod_object_call() async {
+    addTestFile(r'''
+main(Object o) {
+  o.call();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+  }
+
+  test_error_undefinedMethod_OK_null() async {
+    addTestFile(r'''
+main() {
+  null.foo();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertUnresolvedMethodInvocation('foo();');
+  }
+
+  test_error_undefinedMethod_private() async {
+    newFile('/test/lib/a.dart', content: r'''
+class A {
+  void _foo(int _) {}
+}
+''');
+    addTestFile(r'''
+import 'a.dart';
+
+class B extends A {
+  main() {
+    _foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+    _assertUnresolvedMethodInvocation('_foo(0);');
+  }
+
+  test_error_undefinedMethod_typeLiteral_cascadeTarget() async {
+    addTestFile(r'''
+class C {
+  static void foo() {}
+}
+
+main() {
+  C..foo();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+  }
+
+  test_error_undefinedMethod_typeLiteral_conditional() async {
+    // When applied to a type literal, the conditional access operator '?.'
+    // cannot be used to access instance methods of Type.
+    addTestFile(r'''
+class A {}
+main() {
+  A?.toString();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_METHOD,
+    ]);
+  }
+
+  test_error_undefinedSuperMethod() async {
+    addTestFile(r'''
+class A {}
+
+class B extends A {
+  void foo(int _) {
+    super.foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(0);');
+    assertSuperExpression(findNode.super_('super.foo'));
+  }
+
+  test_error_unqualifiedReferenceToNonLocalStaticMember_method() async {
+    addTestFile(r'''
+class A {
+  static void foo() {}
+}
+
+class B extends A {
+  main() {
+    foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
+    ]);
+
+    _assertInvalidInvocation(
+      'foo(0)',
+      findElement.method('foo'),
+      expectedNameType: '(int) → void',
+    );
+  }
+
+  /// The primary purpose of this test is to ensure that we are only getting a
+  /// single error generated when the only problem is that an imported file
+  /// does not exist.
+  test_error_uriDoesNotExist_prefixed() async {
+    addTestFile(r'''
+import 'missing.dart' as p;
+
+main() {
+  p.foo(1);
+  p.bar(2);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(1);');
+    _assertUnresolvedMethodInvocation('bar(2);');
+  }
+
+  /// The primary purpose of this test is to ensure that we are only getting a
+  /// single error generated when the only problem is that an imported file
+  /// does not exist.
+  test_error_uriDoesNotExist_show() async {
+    addTestFile(r'''
+import 'missing.dart' show foo, bar;
+
+main() {
+  foo(1);
+  bar(2);
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.URI_DOES_NOT_EXIST,
+    ]);
+    _assertUnresolvedMethodInvocation('foo(1);');
+    _assertUnresolvedMethodInvocation('bar(2);');
+  }
+
+  test_error_useOfVoidResult_name_getter() async {
+    addTestFile(r'''
+class C<T>{
+  T foo;
+}
+
+main(C<void> c) {
+  c.foo();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.USE_OF_VOID_RESULT,
+    ]);
+    _assertInvalidInvocation(
+      'c.foo()',
+      findElement.getter('foo'),
+      expectedNameType: 'void',
+      expectedMethodNameType: '() → void',
+    );
+  }
+
+  test_error_useOfVoidResult_name_localVariable() async {
+    addTestFile(r'''
+main() {
+  void foo;
+  foo();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.USE_OF_VOID_RESULT,
+    ]);
+    _assertInvalidInvocation(
+      'foo()',
+      findElement.localVar('foo'),
+      expectedNameType: 'void',
+    );
+  }
+
+  test_error_useOfVoidResult_name_topFunction() async {
+    addTestFile(r'''
+void foo() {}
+
+main() {
+  foo()();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.USE_OF_VOID_RESULT,
+    ]);
+    assertMethodInvocation(
+      findNode.methodInvocation('foo()()'),
+      findElement.topFunction('foo'),
+      '() → void',
+    );
+  }
+
+  test_error_useOfVoidResult_name_topVariable() async {
+    addTestFile(r'''
+void foo;
+
+main() {
+  foo();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.USE_OF_VOID_RESULT,
+    ]);
+    _assertInvalidInvocation(
+      'foo()',
+      findElement.topGet('foo'),
+      expectedNameType: 'void',
+      expectedMethodNameType: '() → void',
+    );
+  }
+
+  test_error_useOfVoidResult_receiver() async {
+    addTestFile(r'''
+main() {
+  void foo;
+  foo.toString();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.USE_OF_VOID_RESULT,
+    ]);
+    // TODO(scheglov) Resolve fully, or don't resolve at all.
+    assertMethodInvocation(
+      findNode.methodInvocation('toString()'),
+      null,
+      '() → String',
+    );
+  }
+
+  test_error_useOfVoidResult_receiver_cascade() async {
+    addTestFile(r'''
+main() {
+  void foo;
+  foo..toString();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.USE_OF_VOID_RESULT,
+    ]);
+    // TODO(scheglov) Resolve fully, or don't resolve at all.
+    assertMethodInvocation(
+      findNode.methodInvocation('toString()'),
+      null,
+      '() → String',
+    );
+  }
+
+  test_error_useOfVoidResult_receiver_withNull() async {
+    addTestFile(r'''
+main() {
+  void foo;
+  foo?.toString();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticWarningCode.USE_OF_VOID_RESULT,
+    ]);
+    // TODO(scheglov) Resolve fully, or don't resolve at all.
+    assertMethodInvocation(
+      findNode.methodInvocation('toString()'),
+      null,
+      '() → String',
+    );
+  }
+
+  test_error_wrongNumberOfTypeArgumentsMethod_01() async {
+    addTestFile(r'''
+void foo() {}
+
+main() {
+  foo<int>();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+    ]);
+    assertMethodInvocation(
+      findNode.methodInvocation('foo<int>()'),
+      findElement.topFunction('foo'),
+      '() → void',
+    );
+    assertTypeName(findNode.typeName('int>'), intElement, 'int');
+  }
+
+  test_error_wrongNumberOfTypeArgumentsMethod_21() async {
+    addTestFile(r'''
+Map<T, U> foo<T extends num, U>() => null;
+
+main() {
+  foo<int>();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
+    ]);
+    assertMethodInvocation(
+      findNode.methodInvocation('foo<int>()'),
+      findElement.topFunction('foo'),
+      '() → Map<num, dynamic>',
+    );
+    assertTypeName(findNode.typeName('int>'), intElement, 'int');
+  }
+
+  test_hasReceiver_class_staticGetter() async {
+    addTestFile(r'''
+class C {
+  static double Function(int) get foo => null;
+}
+
+main() {
+  C.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.getter('foo'),
+      '(int) → double',
+      expectedMethodNameType: '() → (int) → double',
+    );
+    assertClassRef(invocation.target, findElement.class_('C'));
+  }
+
+  test_hasReceiver_class_staticMethod() async {
+    addTestFile(r'''
+class C {
+  static void foo(int _) {}
+}
+
+main() {
+  C.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo'),
+      '(int) → void',
+    );
+    assertClassRef(invocation.target, findElement.class_('C'));
+  }
+
+  test_hasReceiver_deferredImportPrefix_loadLibrary() async {
+    addTestFile(r'''
+import 'dart:math' deferred as math;
+
+main() {
+  math.loadLibrary();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var import = _importFinder('dart:math');
+
+    var invocation = findNode.methodInvocation('loadLibrary()');
+    assertMethodInvocation(
+      invocation,
+      import.importedLibrary.loadLibraryFunction,
+      '() → Future<dynamic>',
+    );
+    assertImportPrefix(invocation.target, import.prefix);
+  }
+
+  test_hasReceiver_functionTyped_call() async {
+    addTestFile(r'''
+void foo(int _) {}
+
+main() {
+  foo.call(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('call(0)');
+    assertMethodInvocation(
+      invocation,
+      null,
+      '(int) → void',
+    );
+    assertElement(invocation.target, findElement.topFunction('foo'));
+    assertType(invocation.target, '(int) → void');
+  }
+
+  test_hasReceiver_importPrefix_topFunction() async {
+    newFile('/test/lib/a.dart', content: r'''
+T foo<T extends num>(T a, T b) => a;
+''');
+
+    addTestFile(r'''
+import 'a.dart' as prefix;
+
+main() {
+  prefix.foo(1, 2);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var import = _importFinder('package:test/a.dart');
+
+    var invocation = findNode.methodInvocation('foo(1, 2)');
+    assertMethodInvocation(
+      invocation,
+      import.topFunction('foo'),
+      '(int, int) → int',
+    );
+    assertImportPrefix(invocation.target, import.prefix);
+  }
+
+  test_hasReceiver_importPrefix_topGetter() async {
+    newFile('/test/lib/a.dart', content: r'''
+T Function<T>(T a, T b) get foo => null;
+''');
+
+    addTestFile(r'''
+import 'a.dart' as prefix;
+
+main() {
+  prefix.foo(1, 2);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var import = _importFinder('package:test/a.dart');
+
+    var invocation = findNode.methodInvocation('foo(1, 2)');
+    assertMethodInvocation(
+      invocation,
+      import.topGetter('foo'),
+      '(int, int) → int',
+      expectedMethodNameType: '() → <T>(T, T) → T',
+    );
+    assertImportPrefix(invocation.target, import.prefix);
+  }
+
+  test_hasReceiver_instance_Function_call_localVariable() async {
+    addTestFile(r'''
+void main() {
+  Function foo;
+
+  foo.call(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertInvalidInvocation('call(0)', null);
+  }
+
+  test_hasReceiver_instance_Function_call_topVariable() async {
+    addTestFile(r'''
+Function foo;
+
+void main() {
+  foo.call(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertInvalidInvocation('call(0)', null);
+  }
+
+  test_hasReceiver_instance_getter() async {
+    addTestFile(r'''
+class C {
+  double Function(int) get foo => null;
+}
+
+main(C c) {
+  c.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.getter('foo'),
+      '(int) → double',
+      expectedMethodNameType: '() → (int) → double',
+    );
+  }
+
+  test_hasReceiver_instance_method() async {
+    addTestFile(r'''
+class C {
+  void foo(int _) {}
+}
+
+main(C c) {
+  c.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo'),
+      '(int) → void',
+      expectedMethodNameType: '(int) → void',
+    );
+  }
+
+  test_hasReceiver_instance_method_generic() async {
+    addTestFile(r'''
+class C {
+  T foo<T>(T a) {
+    return a;
+  }
+}
+
+main(C c) {
+  c.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo'),
+      '(int) → int',
+      expectedMethodNameType: '(int) → int',
+    );
+  }
+
+  test_hasReceiver_instance_method_issue30552() async {
+    addTestFile(r'''
+abstract class I1 {
+  void foo(int i);
+}
+
+abstract class I2 {
+  void foo(Object o);
+}
+
+abstract class C implements I1, I2 {}
+
+class D extends C {
+  void foo(Object o) {}
+}
+
+void main(C c) {
+  c.foo('hi');
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation("foo('hi')");
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo', of: 'I2'),
+      '(Object) → void',
+    );
+  }
+
+  test_hasReceiver_instance_typeParameter() async {
+    addTestFile(r'''
+class A {
+  void foo(int _) {}
+}
+
+class C<T extends A> {
+  T a;
+  
+  main() {
+    a.foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo'),
+      '(int) → void',
+    );
+  }
+
+  test_hasReceiver_prefixed_class_staticGetter() async {
+    newFile('/test/lib/a.dart', content: r'''
+class C {
+  static double Function(int) get foo => null;
+}
+''');
+
+    addTestFile(r'''
+import 'a.dart' as prefix;
+
+main() {
+  prefix.C.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var import = _importFinder('package:test/a.dart');
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      import.class_('C').getGetter('foo'),
+      '(int) → double',
+      expectedMethodNameType: '() → (int) → double',
+    );
+
+    PrefixedIdentifier target = invocation.target;
+    assertImportPrefix(target.prefix, import.prefix);
+    assertClassRef(target.identifier, import.class_('C'));
+  }
+
+  test_hasReceiver_prefixed_class_staticMethod() async {
+    newFile('/test/lib/a.dart', content: r'''
+class C {
+  static void foo(int _) => null;
+}
+''');
+
+    addTestFile(r'''
+import 'a.dart' as prefix;
+
+main() {
+  prefix.C.foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var import = _importFinder('package:test/a.dart');
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      import.class_('C').getMethod('foo'),
+      '(int) → void',
+    );
+
+    PrefixedIdentifier target = invocation.target;
+    assertImportPrefix(target.prefix, import.prefix);
+    assertClassRef(target.identifier, import.class_('C'));
+  }
+
+  test_hasReceiver_super_getter() async {
+    addTestFile(r'''
+class A {
+  double Function(int) get foo => null;
+}
+
+class B extends A {
+  void bar() {
+    super.foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.getter('foo', of: 'A'),
+      '(int) → double',
+      expectedMethodNameType: '() → (int) → double',
+    );
+    assertSuperExpression(invocation.target);
+  }
+
+  test_hasReceiver_super_method() async {
+    addTestFile(r'''
+class A {
+  void foo(int _) {}
+}
+
+class B extends A {
+  void foo(int _) {
+    super.foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo', of: 'A'),
+      '(int) → void',
+    );
+    assertSuperExpression(invocation.target);
+  }
+
+  test_namedArgument() async {
+    addTestFile(r'''
+void foo({int a, bool b}) {}
+
+main() {
+  foo(b: false, a: 0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(b:');
+    assertMethodInvocation(
+      invocation,
+      findElement.topFunction('foo'),
+      '({a: int, b: bool}) → void',
+    );
+    assertNamedParameterRef('b: false', 'b');
+    assertNamedParameterRef('a: 0', 'a');
+  }
+
+  test_noReceiver_getter_superClass() async {
+    addTestFile(r'''
+class A {
+  double Function(int) get foo => null;
+}
+
+class B extends A {
+  void bar() {
+    foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.getter('foo'),
+      '(int) → double',
+      expectedMethodNameType: '() → (int) → double',
+    );
+  }
+
+  test_noReceiver_getter_thisClass() async {
+    addTestFile(r'''
+class C {
+  double Function(int) get foo => null;
+
+  void bar() {
+    foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.getter('foo'),
+      '(int) → double',
+      expectedMethodNameType: '() → (int) → double',
+    );
+  }
+
+  test_noReceiver_importPrefix() async {
+    addTestFile(r'''
+import 'dart:math' as math;
+
+main() {
+  math();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT,
+    ]);
+    assertElement(findNode.simple('math()'), findElement.prefix('math'));
+  }
+
+  test_noReceiver_localFunction() async {
+    addTestFile(r'''
+main() {
+  void foo(int _) {}
+
+  foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.localFunction('foo'),
+      '(int) → void',
+    );
+  }
+
+  test_noReceiver_localVariable() async {
+    addTestFile(r'''
+main() {
+  void Function(int) foo;
+
+  foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.localVar('foo'),
+      '(int) → void',
+    );
+  }
+
+  test_noReceiver_localVariable_call() async {
+    addTestFile(r'''
+class C {
+  void call(int _) {}
+}
+
+main(C c) {
+  c(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('c(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.parameter('c'),
+      '(int) → void',
+    );
+  }
+
+  test_noReceiver_localVariable_promoted() async {
+    addTestFile(r'''
+main() {
+  var foo;
+  if (foo is void Function(int)) {
+    foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.localVar('foo'),
+      '(int) → void',
+    );
+  }
+
+  test_noReceiver_method_superClass() async {
+    addTestFile(r'''
+class A {
+  void foo(int _) {}
+}
+
+class B extends A {
+  void bar() {
+    foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo'),
+      '(int) → void',
+    );
+  }
+
+  test_noReceiver_method_thisClass() async {
+    addTestFile(r'''
+class C {
+  void foo(int _) {}
+
+  void bar() {
+    foo(0);
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('foo'),
+      '(int) → void',
+    );
+  }
+
+  test_noReceiver_topFunction() async {
+    addTestFile(r'''
+void foo(int _) {}
+
+main() {
+  foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.topFunction('foo'),
+      '(int) → void',
+      expectedMethodNameType: '(int) → void',
+    );
+  }
+
+  test_noReceiver_topGetter() async {
+    addTestFile(r'''
+double Function(int) get foo => null;
+
+main() {
+  foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.topGet('foo'),
+      '(int) → double',
+      expectedMethodNameType: '() → (int) → double',
+    );
+  }
+
+  test_noReceiver_topVariable() async {
+    addTestFile(r'''
+void Function(int) foo;
+
+main() {
+  foo(0);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMethodInvocation(
+      invocation,
+      findElement.topGet('foo'),
+      '(int) → void',
+      expectedMethodNameType: '() → (int) → void',
+    );
+  }
+
+  test_objectMethodOnDynamic() async {
+    addTestFile(r'''
+main() {
+  var v;
+  v.toString(42);
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+    _assertUnresolvedMethodInvocation('toString(42);');
+  }
+
+  test_objectMethodOnFunction() async {
+    addTestFile(r'''
+void f() {}
+
+main() {
+  f.toString();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var invocation = findNode.methodInvocation('toString();');
+    assertMethodInvocation(
+      invocation,
+      typeProvider.objectType.getMethod('toString'),
+      '() → String',
+    );
+  }
+
+  void _assertInvalidInvocation(String search, Element expectedElement,
+      {String expectedMethodNameType,
+      String expectedNameType,
+      bool dynamicNameType: false}) {
+    var invocation = findNode.methodInvocation(search);
+    if (dynamicNameType) {
+      assertTypeDynamic(invocation.methodName);
+    }
+    // TODO(scheglov) I think `invokeType` should be `null`.
+    assertMethodInvocation(
+      invocation,
+      expectedElement,
+      'dynamic',
+      expectedMethodNameType: expectedMethodNameType,
+      expectedNameType: expectedNameType,
+      expectedType: 'dynamic',
+    );
+  }
+
+  void _assertUnresolvedMethodInvocation(String search) {
+    // TODO(scheglov) clean up
+    _assertInvalidInvocation(search, null);
+//    var invocation = findNode.methodInvocation(search);
+//    assertTypeDynamic(invocation.methodName);
+//    // TODO(scheglov) I think `invokeType` should be `null`.
+//    assertMethodInvocation(
+//      invocation,
+//      null,
+//      'dynamic',
+//      expectedType: 'dynamic',
+//    );
+  }
+
+  _ImportElementFinder _importFinder(String targetUri) {
+    var import = findElement.import(targetUri);
+    return _ImportElementFinder(import);
+  }
+}
+
+class _ImportElementFinder {
+  final ImportElement import;
+
+  _ImportElementFinder(this.import);
+
+  CompilationUnitElement get definingUnit {
+    return importedLibrary.definingCompilationUnit;
+  }
+
+  LibraryElement get importedLibrary => import.importedLibrary;
+
+  PrefixElement get prefix => import.prefix;
+
+  ClassElement class_(String name) {
+    for (var class_ in definingUnit.types) {
+      if (class_.name == name) {
+        return class_;
+      }
+    }
+    fail('Not found class: $name');
+  }
+
+  FunctionElement topFunction(String name) {
+    for (var function in definingUnit.functions) {
+      if (function.name == name) {
+        return function;
+      }
+    }
+    fail('Not found top-level function: $name');
+  }
+
+  PropertyAccessorElement topGetter(String name) {
+    for (var accessor in definingUnit.accessors) {
+      if (accessor.name == name && accessor.isGetter) {
+        return accessor;
+      }
+    }
+    fail('Not found top-level getter: $name');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index e086247..65cb6d7 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -24,7 +23,7 @@
 class MixinDriverResolutionTest extends DriverResolutionTest
     with MixinResolutionMixin {}
 
-abstract class MixinResolutionMixin implements ResolutionTest {
+mixin MixinResolutionMixin implements ResolutionTest {
   test_accessor_getter() async {
     addTestFile(r'''
 mixin M {
@@ -1005,6 +1004,54 @@
     ]);
   }
 
+  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_hasNSM() async {
+    addTestFile(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+class C implements A {
+  noSuchMethod(_) {}
+}
+
+class X extends C with M {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
+  test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_hasNSM2() async {
+    addTestFile(r'''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+/// Class `B` has noSuchMethod forwarder for `foo`.
+class B implements A {
+  noSuchMethod(_) {}
+}
+
+/// Class `C` is abstract, but it inherits noSuchMethod forwarders from `B`.
+abstract class C extends B {}
+
+class X extends C with M {}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
   test_error_mixinApplicationNoConcreteSuperInvokedMember_OK_inPreviousMixin() async {
     addTestFile(r'''
 abstract class A {
@@ -1135,6 +1182,30 @@
     ]);
   }
 
+  test_error_mixinApplicationNotImplementedInterface_noMemberErrors() async {
+    addTestFile(r'''
+class A {
+  void foo() {}
+}
+
+mixin M on A {
+  void bar() {
+    super.foo();
+  }
+}
+
+class C {
+  noSuchMethod(_) {}
+}
+
+class X = C with M;
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE,
+    ]);
+  }
+
   test_error_mixinApplicationNotImplementedInterface_OK_0() async {
     addTestFile(r'''
 mixin M {}
@@ -1269,6 +1340,24 @@
     assertInstanceCreation(creation, m, 'M', constructorName: 'named');
   }
 
+  test_error_mixinInstantiate_undefined() async {
+    addTestFile(r'''
+mixin M {}
+
+main() {
+  new M.named();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.MIXIN_INSTANTIATE,
+    ]);
+
+    var creation = findNode.instanceCreation('M.named();');
+    var m = findElement.mixin('M');
+    assertElement(creation.constructorName.type.name, m);
+  }
+
   test_error_onClause_deferredClass() async {
     addTestFile(r'''
 import 'dart:math' deferred as math;
diff --git a/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart b/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
new file mode 100644
index 0000000..0616164
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/non_nullable_test.dart
@@ -0,0 +1,220 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonNullableTest);
+  });
+}
+
+@reflectiveTest
+class NonNullableTest extends DriverResolutionTest {
+  static const _migrated = "@pragma('analyzer:non-nullable') library test;";
+
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  @override
+  bool get typeToStringWithNullability => true;
+
+  test_class_hierarchy() async {
+    addTestFile('''
+class A {}
+
+class X1 extends A {} // 1
+class X2 implements A {} // 2
+class X3 with A {} // 3
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('A {} // 1'), 'A!');
+    assertType(findNode.typeName('A {} // 2'), 'A!');
+    assertType(findNode.typeName('A {} // 3'), 'A!');
+  }
+
+  test_classTypeAlias_hierarchy() async {
+    addTestFile('''
+class A {}
+class B {}
+class C {}
+
+class X = A with B implements C;
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('A with'), 'A!');
+    assertType(findNode.typeName('B implements'), 'B!');
+    assertType(findNode.typeName('C;'), 'C!');
+  }
+
+  test_local_parameter_interfaceType() async {
+    addTestFile('''
+$_migrated
+main() {
+  f(int? a, int b) {}
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('int? a'), 'int?');
+    assertType(findNode.typeName('int b'), 'int!');
+  }
+
+  test_local_returnType_interfaceType() async {
+    addTestFile('''
+$_migrated
+main() {
+  int? f() => 0;
+  int g() => 0;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('int? f'), 'int?');
+    assertType(findNode.typeName('int g'), 'int!');
+  }
+
+  @failingTest
+  test_local_variable_genericFunctionType() async {
+    addTestFile('''
+$_migrated
+main() {
+  int? Function(bool, String?)? a;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(
+      findNode.genericFunctionType('Function('),
+      '(bool!, String?) → int??',
+    );
+  }
+
+  test_local_variable_interfaceType() async {
+    addTestFile('''
+$_migrated
+main() {
+  int? a = 0;
+  int b = 0;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('int? a'), 'int?');
+    assertType(findNode.typeName('int b'), 'int!');
+  }
+
+  test_local_variable_interfaceType_generic() async {
+    addTestFile('''
+$_migrated
+main() {
+  List<int?>? a = [];
+  List<int>? b = [];
+  List<int?> c = [];
+  List<int> d = [];
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('List<int?>? a'), 'List<int?>?');
+    assertType(findNode.typeName('List<int>? b'), 'List<int!>?');
+    assertType(findNode.typeName('List<int?> c'), 'List<int?>!');
+    assertType(findNode.typeName('List<int> d'), 'List<int!>!');
+  }
+
+  test_local_variable_interfaceType_notMigrated() async {
+    addTestFile('''
+main() {
+  int? a = 0;
+  int b = 0;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('int? a'), 'int?');
+    assertType(findNode.typeName('int b'), 'int*');
+  }
+
+  test_local_variable_typeParameter() async {
+    addTestFile('''
+$_migrated
+
+class A<T> {
+  main(T a) {
+    T? b;
+  }
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('T a'), 'T!');
+    assertType(findNode.typeName('T? b'), 'T?');
+  }
+
+  test_mixin_hierarchy() async {
+    addTestFile('''
+class A {}
+
+mixin X1 on A {} // 1
+mixin X2 implements A {} // 2
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('A {} // 1'), 'A!');
+    assertType(findNode.typeName('A {} // 2'), 'A!');
+  }
+
+  test_typedef_classic() async {
+    addTestFile('''
+$_migrated
+
+typedef int? F(bool a, String? b);
+
+main() {
+  F? a;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(findNode.typeName('F? a'), '(bool!, String?) → int??');
+  }
+
+  @failingTest
+  test_typedef_function() async {
+    addTestFile('''
+$_migrated
+
+typedef F<T> = int? Function(bool, T, T?);
+
+main() {
+  F<String>? a;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    assertType(
+      findNode.typeName('F<String>'),
+      '(bool!, String!, String?) → int??',
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
index 6b9d107..df32638 100644
--- a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
@@ -22,7 +22,7 @@
 class OptionalConstDriverResolutionTest extends DriverResolutionTest
     with OptionalConstMixin {}
 
-abstract class OptionalConstMixin implements ResolutionTest {
+mixin OptionalConstMixin implements ResolutionTest {
   Map<String, LibraryElement> libraries = {};
 
   LibraryElement get libraryA => libraries['package:test/a.dart'];
diff --git a/pkg/analyzer/test/src/dart/resolution/property_access_test.dart b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
new file mode 100644
index 0000000..c127e27
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/property_access_test.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PropertyAccessResolutionTest);
+  });
+}
+
+@reflectiveTest
+class PropertyAccessResolutionTest extends DriverResolutionTest {
+  test_get_error_abstractSuperMemberReference_mixinHasNoSuchMethod() async {
+    addTestFile('''
+class A {
+  int get foo;
+  noSuchMethod(im) => 1;
+}
+
+class B extends Object with A {
+  get foo => super.foo; // ref
+  noSuchMethod(im) => 2;
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+
+    var access = findNode.propertyAccess('foo; // ref');
+    assertPropertyAccess(access, findElement.getter('foo', of: 'A'), 'int');
+    assertSuperExpression(access.target);
+  }
+
+  test_get_error_abstractSuperMemberReference_OK_superHasNoSuchMethod() async {
+    addTestFile(r'''
+class A {
+  int get foo;
+  noSuchMethod(im) => 1;
+}
+
+class B extends A {
+  get foo => super.foo; // ref
+  noSuchMethod(im) => 2;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var access = findNode.propertyAccess('super.foo; // ref');
+    assertPropertyAccess(access, findElement.getter('foo', of: 'A'), 'int');
+    assertSuperExpression(access.target);
+  }
+
+  test_set_error_abstractSuperMemberReference_mixinHasNoSuchMethod() async {
+    addTestFile('''
+class A {
+  set foo(int a);
+  noSuchMethod(im) {}
+}
+
+class B extends Object with A {
+  set foo(v) => super.foo = v; // ref
+  noSuchMethod(im) {}
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE]);
+
+    var access = findNode.propertyAccess('foo = v; // ref');
+    assertPropertyAccess(
+      access,
+      findElement.setter('foo', of: 'A'),
+      'int',
+    );
+    assertSuperExpression(access.target);
+  }
+
+  test_set_error_abstractSuperMemberReference_OK_superHasNoSuchMethod() async {
+    addTestFile(r'''
+class A {
+  set foo(int a);
+  noSuchMethod(im) => 1;
+}
+
+class B extends A {
+  set foo(v) => super.foo = v; // ref
+  noSuchMethod(im) => 2;
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+
+    var access = findNode.propertyAccess('foo = v; // ref');
+    assertPropertyAccess(
+      access,
+      findElement.setter('foo', of: 'A'),
+      'int',
+    );
+    assertSuperExpression(access.target);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index f6fdc6f..efd7d8e 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
@@ -29,7 +30,7 @@
 final isVoidType = new TypeMatcher<VoidTypeImpl>();
 
 /// Base for resolution tests.
-abstract class ResolutionTest implements ResourceProviderMixin {
+mixin ResolutionTest implements ResourceProviderMixin {
   TestAnalysisResult result;
   FindNode findNode;
   FindElement findElement;
@@ -57,10 +58,23 @@
   TypeProvider get typeProvider =>
       result.unit.declaredElement.context.typeProvider;
 
+  /// Whether `DartType.toString()` with nullability should be asked.
+  bool get typeToStringWithNullability => false;
+
   void addTestFile(String content) {
     newFile('/test/lib/test.dart', content: content);
   }
 
+  /// Assert that the given [identifier] is a reference to a class, in the
+  /// form that is not a separate expression, e.g. in a static method
+  /// invocation like `C.staticMethod()`, or a type annotation `C c = null`.
+  void assertClassRef(
+      SimpleIdentifier identifier, ClassElement expectedElement) {
+    assertElement(identifier, expectedElement);
+    // TODO(scheglov) Enforce this.
+//    assertTypeNull(identifier);
+  }
+
   void assertConstructorElement(
       ConstructorElement expected, ConstructorElement actual) {
     if (expected is ConstructorMember && actual is ConstructorMember) {
@@ -116,7 +130,9 @@
   }
 
   void assertElementTypeString(DartType type, String expected) {
-    expect(type.toString(), expected);
+    TypeImpl typeImpl = type;
+    expect(typeImpl.toString(withNullability: typeToStringWithNullability),
+        expected);
   }
 
   void assertElementTypeStrings(List<DartType> types, List<String> expected) {
@@ -168,6 +184,11 @@
     assertType(ref, type);
   }
 
+  void assertImportPrefix(SimpleIdentifier identifier, PrefixElement element) {
+    assertElement(identifier, element);
+    assertTypeNull(identifier);
+  }
+
   void assertInstanceCreation(InstanceCreationExpression creation,
       ClassElement expectedClassElement, String expectedType,
       {String constructorName,
@@ -232,10 +253,68 @@
     expect(actual.baseElement, same(expectedBase));
   }
 
+  void assertMethodInvocation(MethodInvocation invocation,
+      Element expectedElement, String expectedInvokeType,
+      {String expectedMethodNameType,
+      String expectedNameType,
+      String expectedType}) {
+    MethodInvocationImpl invocationImpl = invocation;
+
+    // TODO(scheglov) Check for Member.
+    var element = invocation.methodName.staticElement;
+    if (element is Member) {
+      element = (element as Member).baseElement;
+      expect(element, same(expectedElement));
+    } else {
+      assertElement(invocation.methodName, expectedElement);
+    }
+
+    // TODO(scheglov) Should we enforce this?
+//    if (expectedNameType == null) {
+//      if (expectedElement is ExecutableElement) {
+//        expectedNameType = expectedElement.type.displayName;
+//      } else if (expectedElement is VariableElement) {
+//        expectedNameType = expectedElement.type.displayName;
+//      }
+//    }
+//    assertType(invocation.methodName, expectedNameType);
+
+    assertInvokeType(invocation, expectedInvokeType);
+
+    expectedType ??= _extractReturnType(expectedInvokeType);
+    assertType(invocation, expectedType);
+
+    expectedMethodNameType ??= expectedInvokeType;
+    assertElementTypeString(
+        invocationImpl.methodNameType, expectedMethodNameType);
+  }
+
+  void assertNamedParameterRef(String search, String name) {
+    var ref = findNode.simple(search);
+    assertElement(ref, findElement.parameter(name));
+    assertTypeNull(ref);
+  }
+
   void assertNoTestErrors() {
     assertTestErrors(const <ErrorCode>[]);
   }
 
+  void assertPropertyAccess(
+    PropertyAccess access,
+    Element expectedElement,
+    String expectedType,
+  ) {
+    assertElement(access.propertyName, expectedElement);
+    assertType(access, expectedType);
+  }
+
+  void assertSuperExpression(SuperExpression superExpression) {
+    // TODO(scheglov) I think `super` does not have type itself.
+    // It is just a signal to look for implemented method in the supertype.
+    // With mixins there isn't a type anyway.
+//    assertTypeNull(superExpression);
+  }
+
   void assertTestErrors(List<ErrorCode> expected) {
     assertErrors(result.errors, expected);
   }
@@ -246,7 +325,7 @@
   }
 
   void assertType(AstNode node, String expected) {
-    DartType actual;
+    TypeImpl actual;
     if (node is Expression) {
       actual = node.staticType;
     } else if (node is GenericFunctionType) {
@@ -256,7 +335,8 @@
     } else {
       fail('Unsupported node: (${node.runtimeType}) $node');
     }
-    expect(actual?.toString(), expected);
+    expect(actual?.toString(withNullability: typeToStringWithNullability),
+        expected);
   }
 
   void assertTypeDynamic(Expression expression) {
@@ -332,6 +412,12 @@
     }
     return element;
   }
+
+  static String _extractReturnType(String invokeType) {
+    int arrowIndex = invokeType.indexOf('→');
+    expect(arrowIndex, isNonNegative);
+    return invokeType.substring(arrowIndex + 1).trim();
+  }
 }
 
 class TestAnalysisResult {
diff --git a/pkg/analyzer/test/src/dart/resolution/task_resolution.dart b/pkg/analyzer/test/src/dart/resolution/task_resolution.dart
index 7e02ab4..7c84ed2 100644
--- a/pkg/analyzer/test/src/dart/resolution/task_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/task_resolution.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -9,15 +9,14 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 
 import '../../../generated/analysis_context_factory.dart';
-import '../../context/mock_sdk.dart';
 import 'resolution.dart';
 
 /// Task model based implementation of [ResolutionTest].
-class TaskResolutionTest extends Object
-    with ResourceProviderMixin, ResolutionTest {
+class TaskResolutionTest with ResourceProviderMixin, ResolutionTest {
   DartSdk sdk;
 
   SourceFactory sourceFactory;
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index f0c2ee6..4848102 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -6,7 +6,8 @@
 
 import 'assignment_test.dart' as assignment_test;
 import 'class_test.dart' as class_test;
-import 'optional_const_test.dart' as optional_const_test;
+import 'comment_test.dart' as comment_test;
+import 'constant_test.dart' as constant_test;
 import 'enum_test.dart' as enum_test;
 import 'for_in_test.dart' as for_in_test;
 import 'generic_type_alias_test.dart' as generic_type_alias_test;
@@ -16,13 +17,19 @@
     as instance_member_inference_class_test;
 import 'instance_member_inference_mixin_test.dart'
     as instance_member_inference_mixin_test;
+import 'method_invocation_test.dart' as method_invocation_test;
 import 'mixin_test.dart' as mixin_test;
+import 'non_nullable_test.dart' as non_nullable_test;
+import 'optional_const_test.dart' as optional_const_test;
+import 'property_access_test.dart' as property_access_test;
 import 'top_type_inference_test.dart' as top_type_inference_test;
 
 main() {
   defineReflectiveSuite(() {
     assignment_test.main();
     class_test.main();
+    comment_test.main();
+    constant_test.main();
     enum_test.main();
     for_in_test.main();
     generic_type_alias_test.main();
@@ -30,8 +37,11 @@
     instance_creation_test.main();
     instance_member_inference_class_test.main();
     instance_member_inference_mixin_test.main();
+    method_invocation_test.main();
     mixin_test.main();
+    non_nullable_test.main();
     optional_const_test.main();
+    property_access_test.main();
     top_type_inference_test.main();
   }, name: 'resolution');
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart b/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart
index 3b6eb93..3c3defe 100644
--- a/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/top_type_inference_test.dart
@@ -24,7 +24,7 @@
 class TopTypeInferenceTaskResolutionTest extends TaskResolutionTest
     with TopTypeInstanceMixin {}
 
-abstract class TopTypeInstanceMixin implements ResolutionTest {
+mixin TopTypeInstanceMixin implements ResolutionTest {
   test_referenceInstanceVariable_withDeclaredType() async {
     addTestFile(r'''
 class A {
diff --git a/pkg/analyzer/test/src/dart/sdk/patch_test.dart b/pkg/analyzer/test/src/dart/sdk/patch_test.dart
index 6ffbf04..dd57aa6 100644
--- a/pkg/analyzer/test/src/dart/sdk/patch_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/patch_test.dart
@@ -5,11 +5,11 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/sdk/patch.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -20,8 +20,7 @@
 }
 
 @reflectiveTest
-class SdkPatcherTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
+class SdkPatcherTest with ResourceProviderMixin {
   Folder sdkFolder;
   FolderBasedDartSdk sdk;
 
@@ -29,7 +28,7 @@
   RecordingErrorListener listener = new RecordingErrorListener();
 
   void setUp() {
-    sdkFolder = provider.getFolder(_p('/sdk'));
+    sdkFolder = getFolder('/sdk');
   }
 
   test_class_constructor_append_fail_notPrivate_named() {
@@ -717,12 +716,12 @@
 };''');
       _createSdk();
       var patchPaths = {
-        'dart:test': [_p('/sdk/lib/does_not_exist.dart')]
+        'dart:test': [convertPath('/sdk/lib/does_not_exist.dart')]
       };
-      File file = provider.newFile(_p('/sdk/lib/test/test.dart'), '');
+      File file = newFile('/sdk/lib/test/test.dart');
       Source source = file.createSource(Uri.parse('dart:test'));
       CompilationUnit unit = SdkPatcher.parse(source, listener);
-      patcher.patch(provider, patchPaths, listener, source, unit);
+      patcher.patch(resourceProvider, patchPaths, listener, source, unit);
     }, throwsArgumentError);
   }
 
@@ -733,16 +732,16 @@
     'internal/internal.dart'),
 };''');
     var patchPaths = {
-      'dart:_internal': [_p('/sdk/lib/internal/internal_patch.dart')]
+      'dart:_internal': [convertPath('/sdk/lib/internal/internal_patch.dart')]
     };
-    File file = provider.newFile(_p('/sdk/lib/internal/internal.dart'), r'''
+    File file = newFile('/sdk/lib/internal/internal.dart', content: r'''
 library dart._internal;
 class A {}
 class B {
   B();
 }
 ''');
-    provider.newFile(_p('/sdk/lib/internal/internal_patch.dart'), r'''
+    newFile(convertPath('/sdk/lib/internal/internal_patch.dart'), content: r'''
 @patch
 class B {
   int newField;
@@ -757,7 +756,7 @@
 
     Source source = file.createSource(Uri.parse('dart:_internal'));
     CompilationUnit unit = SdkPatcher.parse(source, listener);
-    patcher.patch(provider, patchPaths, listener, source, unit);
+    patcher.patch(resourceProvider, patchPaths, listener, source, unit);
     _assertUnitCode(
         unit,
         'library dart._internal; class A {} '
@@ -782,12 +781,12 @@
     patches: {VM_PLATFORM: ['test/test_patch.dart']}),
 };''');
     var patchPaths = {
-      'dart:test': [_p('/sdk/lib/test/test_patch.dart')]
+      'dart:test': [convertPath('/sdk/lib/test/test_patch.dart')]
     };
-    File fileLib = provider.newFile(_p('/sdk/lib/test/test.dart'), baseLibCode);
+    File fileLib = newFile('/sdk/lib/test/test.dart', content: baseLibCode);
     File filePart =
-        provider.newFile(_p('/sdk/lib/test/test_part.dart'), basePartCode);
-    provider.newFile(_p('/sdk/lib/test/test_patch.dart'), r'''
+        newFile('/sdk/lib/test/test_part.dart', content: basePartCode);
+    newFile('/sdk/lib/test/test_patch.dart', content: r'''
 import 'foo.dart';
 
 @patch
@@ -809,7 +808,7 @@
       Uri uri = Uri.parse('dart:test');
       Source source = fileLib.createSource(uri);
       CompilationUnit unit = SdkPatcher.parse(source, listener);
-      patcher.patch(provider, patchPaths, listener, source, unit);
+      patcher.patch(resourceProvider, patchPaths, listener, source, unit);
       _assertUnitCode(
           unit,
           "library test; part 'test_part.dart'; import 'foo.dart'; "
@@ -820,7 +819,7 @@
       Uri uri = Uri.parse('dart:test/test_part.dart');
       Source source = filePart.createSource(uri);
       CompilationUnit unit = SdkPatcher.parse(source, listener);
-      patcher.patch(provider, patchPaths, listener, source, unit);
+      patcher.patch(resourceProvider, patchPaths, listener, source, unit);
       _assertUnitCode(unit, "part of test; class B {int _b() => 1;}");
     }
   }
@@ -1053,7 +1052,7 @@
   }
 
   void _createSdk() {
-    sdk = new FolderBasedDartSdk(provider, sdkFolder);
+    sdk = new FolderBasedDartSdk(resourceProvider, sdkFolder);
     sdk.analysisOptions = new AnalysisOptionsImpl();
   }
 
@@ -1064,24 +1063,24 @@
     'test/test.dart'),
 };''');
     var patchPaths = {
-      'dart:test': [_p('/sdk/lib/test/test_patch.dart')]
+      'dart:test': [convertPath('/sdk/lib/test/test_patch.dart')]
     };
-    File file = provider.newFile(_p('/sdk/lib/test/test.dart'), baseCode);
-    provider.newFile(_p('/sdk/lib/test/test_patch.dart'), patchCode);
+    File file = newFile('/sdk/lib/test/test.dart', content: baseCode);
+    newFile('/sdk/lib/test/test_patch.dart', content: patchCode);
 
     _createSdk();
 
     Source source = file.createSource(Uri.parse('dart:test'));
     CompilationUnit unit = SdkPatcher.parse(source, listener);
-    patcher.patch(provider, patchPaths, listener, source, unit);
+    patcher.patch(resourceProvider, patchPaths, listener, source, unit);
     return unit;
   }
 
-  String _p(String path) => provider.convertPath(path);
-
   void _setSdkLibraries(String code) {
-    provider.newFile(
-        _p('/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart'), code);
+    newFile(
+      '/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart',
+      content: code,
+    );
   }
 
   static void _assertPrevNextToken(Token prev, Token next) {
diff --git a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
index cfc0540..b795f9d 100644
--- a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
@@ -110,7 +110,7 @@
 }
 
 @reflectiveTest
-class FolderBasedDartSdkTest extends Object with ResourceProviderMixin {
+class FolderBasedDartSdkTest with ResourceProviderMixin {
   void test_addExtensions() {
     FolderBasedDartSdk sdk = _createDartSdk();
     String uri = 'dart:my.internal';
@@ -315,7 +315,7 @@
 }
 
 @reflectiveTest
-class SdkExtensionFinderTest extends Object with ResourceProviderMixin {
+class SdkExtensionFinderTest with ResourceProviderMixin {
   void setUp() {
     newFile('/tmp/_sdkext', content: r'''
 {
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
new file mode 100644
index 0000000..73966e0
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ArgumentTypeNotAssignableTest);
+    defineReflectiveTests(ArgumentTypeNotAssignableTest_Driver);
+  });
+}
+
+@reflectiveTest
+class ArgumentTypeNotAssignableTest extends ResolverTestCase {
+  test_functionType() async {
+    await assertErrorsInCode(r'''
+m() {
+  var a = new A();
+  a.n(() => 0);
+}
+class A {
+  n(void f(int i)) {}
+}
+''', [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+  }
+
+  test_interfaceType() async {
+    await assertErrorsInCode(r'''
+m() {
+  var i = '';
+  n(i);
+}
+n(int i) {}
+''', [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]);
+  }
+}
+
+@reflectiveTest
+class ArgumentTypeNotAssignableTest_Driver
+    extends ArgumentTypeNotAssignableTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart b/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart
new file mode 100644
index 0000000..94f9c00
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/can_be_null_after_null_aware_test.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CanBeNullAfterNullAwareTest);
+    defineReflectiveTests(CanBeNullAfterNullAwareTest_Driver);
+  });
+}
+
+@reflectiveTest
+class CanBeNullAfterNullAwareTest extends ResolverTestCase {
+  test_afterCascade() async {
+    await assertErrorsInCode(r'''
+m(x) {
+  x..a?.b.c;
+}
+''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+  }
+
+  test_beforeCascade() async {
+    await assertErrorsInCode(r'''
+m(x) {
+  x?.a..m();
+}
+''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+  }
+
+  test_cascadeWithParenthesis() async {
+    await assertErrorsInCode(r'''
+m(x) {
+  (x?.a)..m();
+}
+''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+  }
+
+  test_definedForNull() async {
+    await assertNoErrorsInCode(r'''
+m(x) {
+  x?.a.hashCode;
+  x?.a.runtimeType;
+  x?.a.toString();
+  x?.b().hashCode;
+  x?.b().runtimeType;
+  x?.b().toString();
+}
+''');
+  }
+
+  test_guarded_methodInvocation() async {
+    await assertNoErrorsInCode(r'''
+m(x) {
+  x?.a()?.b();
+}
+''');
+  }
+
+  test_guarded_propertyAccess() async {
+    await assertNoErrorsInCode(r'''
+m(x) {
+  x?.a?.b;
+}
+''');
+  }
+
+  test_methodInvocation() async {
+    await assertErrorsInCode(r'''
+m(x) {
+  x?.a.b();
+}
+''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+  }
+
+  test_multipleInvocations() async {
+    await assertErrorsInCode(r'''
+m(x) {
+  x?.a
+    ..m()
+    ..m();
+}
+''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+  }
+
+  test_parenthesized() async {
+    await assertErrorsInCode(r'''
+m(x) {
+  (x?.a).b;
+}
+''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+  }
+
+  test_propertyAccess() async {
+    await assertErrorsInCode(r'''
+m(x) {
+  x?.a.b;
+}
+''', [HintCode.CAN_BE_NULL_AFTER_NULL_AWARE]);
+  }
+}
+
+@reflectiveTest
+class CanBeNullAfterNullAwareTest_Driver extends CanBeNullAfterNullAwareTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
new file mode 100644
index 0000000..c864b70
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_with_mixin_with_field_test.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+import '../dart/resolution/resolution.dart';
+import '../dart/resolution/task_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstConstructorWithMixinWithFieldTest_DriverTest);
+    defineReflectiveTests(ConstConstructorWithMixinWithFieldTest_TaskTest);
+  });
+}
+
+mixin ConstConstructorWithMixinWithFieldMixin implements ResolutionTest {
+  test_class_instance() async {
+    addTestFile(r'''
+class A {
+  var a;
+}
+
+class B extends Object with A {
+  const B();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
+    ]);
+  }
+
+  test_class_instance_final() async {
+    addTestFile(r'''
+class A {
+  final a = 0;
+}
+
+class B extends Object with A {
+  const B();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+    ]);
+  }
+
+  test_class_noFields() async {
+    addTestFile(r'''
+class M {}
+
+class X extends Object with M {
+  const X();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
+  test_class_static() async {
+    addTestFile(r'''
+class M {
+  static final a = 0;
+}
+
+class X extends Object with M {
+  const X();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
+  test_mixin_instance() async {
+    addTestFile(r'''
+mixin M {
+  var a;
+}
+
+class X extends Object with M {
+  const X();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD,
+    ]);
+  }
+
+  test_mixin_instance_final() async {
+    addTestFile(r'''
+mixin M {
+  final a = 0;
+}
+
+class X extends Object with M {
+  const X();
+}
+''');
+    await resolveTestFile();
+    assertTestErrors([
+      CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN_WITH_FIELD,
+    ]);
+  }
+
+  test_mixin_noFields() async {
+    addTestFile(r'''
+mixin M {}
+
+class X extends Object with M {
+  const X();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+
+  test_mixin_static() async {
+    addTestFile(r'''
+mixin M {
+  static final a = 0;
+}
+
+class X extends Object with M {
+  const X();
+}
+''');
+    await resolveTestFile();
+    assertNoTestErrors();
+  }
+}
+
+@reflectiveTest
+class ConstConstructorWithMixinWithFieldTest_DriverTest
+    extends DriverResolutionTest with ConstConstructorWithMixinWithFieldMixin {}
+
+@reflectiveTest
+class ConstConstructorWithMixinWithFieldTest_TaskTest extends TaskResolutionTest
+    with ConstConstructorWithMixinWithFieldMixin {}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
new file mode 100644
index 0000000..1dcc23e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -0,0 +1,451 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DeprecatedMemberUseFromSamePackageTest);
+    defineReflectiveTests(DeprecatedMemberUseFromSamePackageTest_Driver);
+    defineReflectiveTests(DeprecatedMemberUseTest);
+    defineReflectiveTests(DeprecatedMemberUseTest_Driver);
+  });
+}
+
+@reflectiveTest
+class DeprecatedMemberUseTest extends ResolverTestCase {
+  /// Write a pubspec file at [root], so that BestPracticesVerifier can see that
+  /// [root] is the root of a BasicWorkspace, and a BasicWorkspacePackage.
+  void newBasicPackage(String root) {
+    newFile('$root/pubspec.yaml');
+  }
+
+  test_methodInvocation_contructor() async {
+    resetWithFooLibrary(r'''
+class A {
+  @Deprecated('0.9')
+  m() {}
+}
+''');
+
+    newBasicPackage('/pkg1');
+    assertErrorsInCode(r'''
+import 'package:foo/foo.dart';
+void main() => A().m();
+''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
+  }
+
+  test_methodInvocation_constant() async {
+    resetWithFooLibrary(r'''
+class A {
+  @deprecated
+  m() {}
+}
+''');
+
+    newBasicPackage('/pkg1');
+    assertErrorsInCode(r'''
+import 'package:foo/foo.dart';
+void main() => A().m();
+''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
+  }
+
+  void resetWithFooLibrary(String source) {
+    super.resetWith(packages: [
+      ['foo', source]
+    ]);
+  }
+
+  test_export() async {
+    resetWithFooLibrary(r'''
+@deprecated
+library deprecated_library;
+class A {}
+''');
+
+    newBasicPackage('/pkg1');
+    assertErrorsInCode('''
+export 'package:foo/foo.dart';
+''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
+  }
+
+  test_import() async {
+    resetWithFooLibrary(r'''
+@deprecated
+library deprecated_library;
+class A {}
+''');
+
+    newBasicPackage('/pkg1');
+    assertErrorsInCode(r'''
+import 'package:foo/foo.dart';
+f(A a) {}
+''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
+  }
+}
+
+@reflectiveTest
+class DeprecatedMemberUseTest_Driver extends DeprecatedMemberUseTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
+
+@reflectiveTest
+class DeprecatedMemberUseFromSamePackageTest extends ResolverTestCase {
+  test_methodInvocation_contructor() async {
+    assertErrorsInCode(r'''
+class A {
+  @Deprecated('0.9')
+  m() {}
+  n() {m();}
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_call() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  call() {}
+  m() {
+    A a = new A();
+    a();
+  }
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_compoundAssignment() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  A operator+(A a) { return a; }
+}
+f(A a) {
+  A b;
+  a += b;
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_export() async {
+    addNamedSource("/deprecated_library.dart", r'''
+@deprecated
+library deprecated_library;
+class A {}
+''');
+    await assertErrorsInCode('''
+export 'deprecated_library.dart';
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_field() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  int x = 1;
+}
+f(A a) {
+  return a.x;
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_getter() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  get m => 1;
+}
+f(A a) {
+  return a.m;
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_import() async {
+    addNamedSource("/deprecated_library.dart", r'''
+@deprecated
+library deprecated_library;
+class A {}
+''');
+    await assertErrorsInCode(r'''
+import 'deprecated_library.dart';
+f(A a) {}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_inDeprecatedClass() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+f() {}
+
+@deprecated
+class C {
+  m() {
+    f();
+  }
+}
+''');
+  }
+
+  test_inDeprecatedField() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+class C {}
+
+class X {
+  @deprecated
+  C f;
+}
+''');
+  }
+
+  test_inDeprecatedFunction() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+f() {}
+
+@deprecated
+g() {
+  f();
+}
+''');
+  }
+
+  test_inDeprecatedLibrary() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+library lib;
+
+@deprecated
+f() {}
+
+class C {
+  m() {
+    f();
+  }
+}
+''');
+  }
+
+  test_inDeprecatedMethod() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+f() {}
+
+class C {
+  @deprecated
+  m() {
+    f();
+  }
+}
+''');
+  }
+
+  test_inDeprecatedMethod_inDeprecatedClass() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+f() {}
+
+@deprecated
+class C {
+  @deprecated
+  m() {
+    f();
+  }
+}
+''');
+  }
+
+  test_inDeprecatedMixin() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+f() {}
+
+@deprecated
+mixin M {
+  m() {
+    f();
+  }
+}
+''');
+  }
+
+  test_inDeprecatedTopLevelVariable() async {
+    await assertNoErrorsInCode(r'''
+@deprecated
+class C {}
+
+@deprecated
+C v;
+''');
+  }
+
+  test_indexExpression() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  operator[](int i) {}
+}
+f(A a) {
+  return a[1];
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_instanceCreation_defaultConstructor() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  A(int i) {}
+}
+f() {
+  A a = new A(1);
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_instanceCreation_namedConstructor() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  A.named(int i) {}
+}
+f() {
+  A a = new A.named(1);
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_methodInvocation_constant() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  m() {}
+  n() {m();}
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_operator() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  operator+(A a) {}
+}
+f(A a) {
+  A b;
+  return a + b;
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_parameter_named() async {
+    await assertErrorsInCode(r'''
+class A {
+  m({@deprecated int x}) {}
+  n() {m(x: 1);}
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_parameter_named_inDefiningFunction() async {
+    await assertNoErrorsInCode(r'''
+f({@deprecated int x}) => x;
+''');
+  }
+
+  test_parameter_named_inDefiningLocalFunction() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  m() {
+    f({@deprecated int x}) {
+      return x;
+    }
+    return f();
+  }
+}
+''');
+  }
+
+  test_parameter_named_inDefiningMethod() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  m({@deprecated int x}) {
+    return x;
+  }
+}
+''');
+  }
+
+  test_parameter_named_inNestedLocalFunction() async {
+    await assertNoErrorsInCode(r'''
+class C {
+  m({@deprecated int x}) {
+    f() {
+      return x;
+    }
+    return f();
+  }
+}
+''');
+  }
+
+  test_parameter_positional() async {
+    await assertErrorsInCode(r'''
+class A {
+  m([@deprecated int x]) {}
+  n() {m(1);}
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_setter() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  set s(v) {}
+}
+f(A a) {
+  return a.s = 1;
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_superConstructor_defaultConstructor() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  A() {}
+}
+class B extends A {
+  B() : super() {}
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+
+  test_superConstructor_namedConstructor() async {
+    await assertErrorsInCode(r'''
+class A {
+  @deprecated
+  A.named() {}
+}
+class B extends A {
+  B() : super.named() {}
+}
+''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE]);
+  }
+}
+
+@reflectiveTest
+class DeprecatedMemberUseFromSamePackageTest_Driver
+    extends DeprecatedMemberUseFromSamePackageTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart b/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
new file mode 100644
index 0000000..6adfcf2
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/division_optimization_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DivisionOptimizationTest);
+    defineReflectiveTests(DivisionOptimizationTest_Driver);
+  });
+}
+
+@reflectiveTest
+class DivisionOptimizationTest extends ResolverTestCase {
+  test_divisionOptimization() async {
+    await assertNoErrorsInCode(r'''
+f(int x, int y) {
+  var v = x / y.toInt();
+}
+''');
+  }
+
+  test_double() async {
+    await assertErrorsInCode(r'''
+f(double x, double y) {
+  var v = (x / y).toInt();
+}
+''', [HintCode.DIVISION_OPTIMIZATION]);
+  }
+
+  test_dynamic() async {
+    await assertNoErrorsInCode(r'''
+f(x, y) {
+  var v = (x / y).toInt();
+}
+''');
+  }
+
+  test_int() async {
+    await assertErrorsInCode(r'''
+f(int x, int y) {
+  var v = (x / y).toInt();
+}
+''', [HintCode.DIVISION_OPTIMIZATION]);
+  }
+
+  test_nonNumeric() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  num operator /(x) { return x; }
+}
+f(A x, A y) {
+  var v = (x / y).toInt();
+}
+''');
+  }
+
+  test_wrappedInParentheses() async {
+    await assertErrorsInCode(r'''
+f(int x, int y) {
+  var v = (((x / y))).toInt();
+}
+''', [HintCode.DIVISION_OPTIMIZATION]);
+  }
+}
+
+@reflectiveTest
+class DivisionOptimizationTest_Driver extends DivisionOptimizationTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
new file mode 100644
index 0000000..0630617
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_assignment_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidAssignmentTest);
+    defineReflectiveTests(InvalidAssignmentTest_Driver);
+  });
+}
+
+@reflectiveTest
+class InvalidAssignmentTest extends ResolverTestCase {
+  test_instanceVariable() async {
+    await assertErrorsInCode(r'''
+class A {
+  int x;
+}
+f(var y) {
+  A a;
+  if (y is String) {
+    a.x = y;
+  }
+}
+''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+
+  test_localVariable() async {
+    await assertErrorsInCode(r'''
+f(var y) {
+  if (y is String) {
+    int x = y;
+  }
+}
+''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+
+  test_staticVariable() async {
+    await assertErrorsInCode(r'''
+class A {
+  static int x;
+}
+f(var y) {
+  if (y is String) {
+    A.x = y;
+  }
+}
+''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+
+  test_variableDeclaration() async {
+    // 17971
+    await assertErrorsInCode(r'''
+class Point {
+  final num x, y;
+  Point(this.x, this.y);
+  Point operator +(Point other) {
+    return new Point(x+other.x, y+other.y);
+  }
+}
+main() {
+  var p1 = new Point(0, 0);
+  var p2 = new Point(10, 10);
+  int n = p1 + p2;
+}
+''', [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+  }
+}
+
+@reflectiveTest
+class InvalidAssignmentTest_Driver extends InvalidAssignmentTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart
new file mode 100644
index 0000000..e10b266
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_required_param_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/hint_code_test.dart' show metaLibraryStub;
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidRequiredParamTest);
+    defineReflectiveTests(InvalidRequiredParamTest_Driver);
+  });
+}
+
+@reflectiveTest
+class InvalidRequiredParamTest extends ResolverTestCase {
+  @override
+  void reset() {
+    super.resetWith(packages: [
+      ['meta', metaLibraryStub]
+    ]);
+  }
+
+  test_namedParameter_withDefault() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+m({@required a = 1}) => null;
+''', [HintCode.INVALID_REQUIRED_PARAM]);
+  }
+
+  test_positionalParameter_withDefault() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+m([@required a = 1]) => null;
+''', [HintCode.INVALID_REQUIRED_PARAM]);
+  }
+
+  test_ppositionalParameter_noDefault() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+m([@required a]) => null;
+''', [HintCode.INVALID_REQUIRED_PARAM]);
+  }
+
+  test_requiredParameter() async {
+    await assertErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+m(@required a) => null;
+''', [HintCode.INVALID_REQUIRED_PARAM]);
+  }
+
+  test_valid() async {
+    await assertNoErrorsInCode(r'''
+import 'package:meta/meta.dart';
+
+m1() => null;
+m2(a) => null;
+m3([a]) => null;
+m4({a}) => null;
+m5({@required a}) => null;
+m6({a, @required b}) => null;
+''');
+  }
+}
+
+@reflectiveTest
+class InvalidRequiredParamTest_Driver extends InvalidRequiredParamTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
new file mode 100644
index 0000000..0be860c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'argument_type_not_assignable_test.dart' as argument_type_not_assignable;
+import 'can_be_null_after_null_aware_test.dart' as can_be_null_after_null_aware;
+import 'deprecated_member_use_test.dart' as deprecated_member_use;
+import 'division_optimization_test.dart' as division_optimization;
+import 'invalid_assignment_test.dart' as invalid_assignment;
+import 'invalid_required_param_test.dart' as invalid_required_param;
+import 'unnecessary_cast_test.dart' as unnecessary_cast;
+import 'unused_field_test.dart' as unused_field;
+import 'unused_import_test.dart' as unused_import;
+import 'unused_label_test.dart' as unused_label;
+import 'unused_shown_name_test.dart' as unused_shown_name;
+import 'use_of_void_result_test.dart' as use_of_void_result;
+
+main() {
+  defineReflectiveSuite(() {
+    argument_type_not_assignable.main();
+    can_be_null_after_null_aware.main();
+    deprecated_member_use.main();
+    division_optimization.main();
+    invalid_assignment.main();
+    invalid_required_param.main();
+    unnecessary_cast.main();
+    unused_field.main();
+    unused_import.main();
+    unused_label.main();
+    unused_shown_name.main();
+    use_of_void_result.main();
+  }, name: 'diagnostics');
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
new file mode 100644
index 0000000..507e656
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnnecessaryCastTest);
+    defineReflectiveTests(UnnecessaryCastTest_Driver);
+  });
+}
+
+@reflectiveTest
+class UnnecessaryCastTest extends ResolverTestCase {
+  test_conditionalExpression() async {
+    await assertNoErrorsInCode(r'''
+abstract class I {}
+class A implements I {}
+class B implements I {}
+I m(A a, B b) {
+  return a == null ? b as I : a as I;
+}
+''');
+  }
+
+  test_dynamic_type() async {
+    await assertNoErrorsInCode(r'''
+m(v) {
+  var b = v as Object;
+}
+''');
+  }
+
+  test_function() async {
+    await assertNoErrorsInCode(r'''
+void main() {
+  Function(Null) f = (String x) => x;
+  (f as Function(int))(3); 
+}
+''');
+  }
+
+  test_function2() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+
+class B<T extends A> {
+  void foo() {
+    T Function(T) f;
+    A Function(A) g;
+    g = f as A Function(A);
+  }
+}
+''');
+  }
+
+  test_generics() async {
+    // dartbug.com/18953
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+Future<int> f() => new Future.value(0);
+void g(bool c) {
+  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
+}
+''');
+  }
+
+  test_parameter_A() async {
+    // dartbug.com/13855, dartbug.com/13732
+    await assertNoErrorsInCode(r'''
+class A{
+  a() {}
+}
+class B<E> {
+  E e;
+  m() {
+    (e as A).a();
+  }
+}
+''');
+  }
+
+  test_type_dynamic() async {
+    await assertNoErrorsInCode(r'''
+m(v) {
+  var b = Object as dynamic;
+}
+''');
+  }
+
+  test_type_supertype() async {
+    await assertErrorsInCode(r'''
+m(int i) {
+  var b = i as Object;
+}
+''', [HintCode.UNNECESSARY_CAST]);
+  }
+
+  test_type_type() async {
+    await assertErrorsInCode(r'''
+m(num i) {
+  var b = i as num;
+}
+''', [HintCode.UNNECESSARY_CAST]);
+  }
+}
+
+@reflectiveTest
+class UnnecessaryCastTest_Driver extends UnnecessaryCastTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  @override
+  test_generics() async {
+    // dartbug.com/18953
+    assertErrorsInCode(r'''
+import 'dart:async';
+Future<int> f() => new Future.value(0);
+void g(bool c) {
+  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
+}
+''', [HintCode.UNNECESSARY_CAST]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unused_field_test.dart b/pkg/analyzer/test/src/diagnostics/unused_field_test.dart
new file mode 100644
index 0000000..6a60a1b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unused_field_test.dart
@@ -0,0 +1,198 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnusedFieldTest);
+    defineReflectiveTests(UnusedFieldTest_Driver);
+  });
+}
+
+@reflectiveTest
+class UnusedFieldTest extends ResolverTestCase {
+  @override
+  bool get enableUnusedElement => true;
+
+  test_unusedField_isUsed_argument() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int _f = 0;
+  main() {
+    print(++_f);
+  }
+}
+print(x) {}
+''');
+  }
+
+  test_unusedField_isUsed_reference_implicitThis() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int _f;
+  main() {
+    print(_f);
+  }
+}
+print(x) {}
+''');
+  }
+
+  test_unusedField_isUsed_reference_implicitThis_expressionFunctionBody() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int _f;
+  m() => _f;
+}
+''');
+  }
+
+  test_unusedField_isUsed_reference_implicitThis_subclass() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int _f;
+  main() {
+    print(_f);
+  }
+}
+class B extends A {
+  int _f;
+}
+print(x) {}
+''');
+  }
+
+  test_unusedField_isUsed_reference_qualified_propagatedElement() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int _f;
+}
+main() {
+  var a = new A();
+  print(a._f);
+}
+print(x) {}
+''');
+  }
+
+  test_unusedField_isUsed_reference_qualified_staticElement() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int _f;
+}
+main() {
+  A a = new A();
+  print(a._f);
+}
+print(x) {}
+''');
+  }
+
+  test_unusedField_isUsed_reference_qualified_unresolved() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  int _f;
+}
+main(a) {
+  print(a._f);
+}
+print(x) {}
+''');
+  }
+
+  test_unusedField_notUsed_compoundAssign() async {
+    await assertErrorsInCode(r'''
+class A {
+  int _f;
+  main() {
+    _f += 2;
+  }
+}
+''', [HintCode.UNUSED_FIELD]);
+  }
+
+  test_unusedField_notUsed_constructorFieldInitializers() async {
+    await assertErrorsInCode(r'''
+class A {
+  int _f;
+  A() : _f = 0;
+}
+''', [HintCode.UNUSED_FIELD]);
+  }
+
+  test_unusedField_notUsed_fieldFormalParameter() async {
+    await assertErrorsInCode(r'''
+class A {
+  int _f;
+  A(this._f);
+}
+''', [HintCode.UNUSED_FIELD]);
+  }
+
+  test_unusedField_notUsed_noReference() async {
+    await assertErrorsInCode(r'''
+class A {
+  int _f;
+}
+''', [HintCode.UNUSED_FIELD]);
+  }
+
+  test_unusedField_notUsed_nullAssign() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  var _f;
+  m() {
+    _f ??= doSomething();
+  }
+}
+doSomething() => 0;
+''');
+  }
+
+  test_unusedField_notUsed_postfixExpr() async {
+    await assertErrorsInCode(r'''
+class A {
+  int _f = 0;
+  main() {
+    _f++;
+  }
+}
+''', [HintCode.UNUSED_FIELD]);
+  }
+
+  test_unusedField_notUsed_prefixExpr() async {
+    await assertErrorsInCode(r'''
+class A {
+  int _f = 0;
+  main() {
+    ++_f;
+  }
+}
+''', [HintCode.UNUSED_FIELD]);
+  }
+
+  test_unusedField_notUsed_simpleAssignment() async {
+    await assertErrorsInCode(r'''
+class A {
+  int _f;
+  m() {
+    _f = 1;
+  }
+}
+main(A a) {
+  a._f = 2;
+}
+''', [HintCode.UNUSED_FIELD]);
+  }
+}
+
+@reflectiveTest
+class UnusedFieldTest_Driver extends UnusedFieldTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unused_import_test.dart b/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
new file mode 100644
index 0000000..e930e3e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
@@ -0,0 +1,321 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnusedImportTest);
+    defineReflectiveTests(UnusedImportTest_Driver);
+  });
+}
+
+@reflectiveTest
+class UnusedImportTest extends ResolverTestCase {
+  test_annotationOnDirective() async {
+    Source source = addSource(r'''
+library L;
+@A()
+import 'lib1.dart';
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {
+  const A() {}
+}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source);
+    verify([source, source2]);
+  }
+
+  test_as() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' as one;
+one.A a;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_as_equalPrefixes_referenced() async {
+    // 18818
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as one;
+import 'lib2.dart' as one;
+one.A a;
+one.B b;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+''');
+    Source source3 = addNamedSource("/lib2.dart", r'''
+library lib2;
+class B {}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    await computeAnalysisResult(source3);
+    assertErrors(source);
+    assertNoErrors(source2);
+    assertNoErrors(source3);
+    verify([source, source2, source3]);
+  }
+
+  @failingTest
+  test_as_equalPrefixes_unreferenced() async {
+    // See todo at ImportsVerifier.prefixElementMap.
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as one;
+import 'lib2.dart' as one;
+one.A a;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+''');
+    Source source3 = addNamedSource("/lib2.dart", r'''
+library lib2;
+class B {}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    await computeAnalysisResult(source3);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    assertNoErrors(source3);
+    verify([source, source2, source3]);
+  }
+
+  test_core_library() async {
+    Source source = addSource(r'''
+library L;
+import 'dart:core';
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_export() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Two two;
+''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+export 'lib2.dart';
+class One {}
+''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+class Two {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_export2() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Three three;
+''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+export 'lib2.dart';
+class One {}
+''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+export 'lib3.dart';
+class Two {}
+''');
+    addNamedSource("/lib3.dart", r'''
+library lib3;
+class Three {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_export_infiniteLoop() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+Two two;
+''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+export 'lib2.dart';
+class One {}
+''');
+    addNamedSource("/lib2.dart", r'''
+library lib2;
+export 'lib3.dart';
+class Two {}
+''');
+    addNamedSource("/lib3.dart", r'''
+library lib3;
+export 'lib2.dart';
+class Three {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_hide() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+import 'lib1.dart' hide A;
+A a;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_inComment_libraryDirective() async {
+    Source source = addSource(r'''
+/// Use [Future] class.
+library L;
+import 'dart:async';
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+  }
+
+  test_metadata() async {
+    Source source = addSource(r'''
+library L;
+@A(x)
+import 'lib1.dart';
+class A {
+  final int value;
+  const A(this.value);
+}
+''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+const x = 0;
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_prefix_topLevelFunction() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' hide topLevelFunction;
+import 'lib1.dart' as one show topLevelFunction;
+class A {
+  static void x() {
+    One o;
+    one.topLevelFunction();
+  }
+}
+''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class One {}
+topLevelFunction() {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_prefix_topLevelFunction2() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' hide topLevelFunction;
+import 'lib1.dart' as one show topLevelFunction;
+import 'lib1.dart' as two show topLevelFunction;
+class A {
+  static void x() {
+    One o;
+    one.topLevelFunction();
+    two.topLevelFunction();
+  }
+}
+''');
+    addNamedSource("/lib1.dart", r'''
+library lib1;
+class One {}
+topLevelFunction() {}
+''');
+    await computeAnalysisResult(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
+  test_show() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A;
+import 'lib1.dart' show B;
+A a;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_unusedImport() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart';
+''');
+    Source source2 = addNamedSource("/lib1.dart", '''
+library lib1;
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+}
+
+@reflectiveTest
+class UnusedImportTest_Driver extends UnusedImportTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unused_label_test.dart b/pkg/analyzer/test/src/diagnostics/unused_label_test.dart
new file mode 100644
index 0000000..7609554
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unused_label_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnusedLabelTest);
+    defineReflectiveTests(UnusedLabelTest_Driver);
+  });
+}
+
+@reflectiveTest
+class UnusedLabelTest extends ResolverTestCase {
+  test_unused_inSwitch() async {
+    await assertErrorsInCode(r'''
+f(x) {
+  switch (x) {
+    label: case 0:
+      break;
+    default:
+      break;
+  }
+}
+''', [HintCode.UNUSED_LABEL]);
+  }
+
+  test_unused_onWhile() async {
+    await assertErrorsInCode(r'''
+f(condition()) {
+  label: while (condition()) {
+    break;
+  }
+}
+''', [HintCode.UNUSED_LABEL]);
+  }
+
+  test_used_inSwitch() async {
+    await assertNoErrorsInCode(r'''
+f(x) {
+  switch (x) {
+    label: case 0:
+      break;
+    default:
+      continue label;
+  }
+}
+''');
+  }
+
+  test_used_onWhile() async {
+    await assertNoErrorsInCode(r'''
+f(condition()) {
+  label: while (condition()) {
+    break label;
+  }
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UnusedLabelTest_Driver extends UnusedLabelTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
new file mode 100644
index 0000000..8fba003
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnusedShownNameTest);
+    defineReflectiveTests(UnusedShownNameTest_Driver);
+  });
+}
+
+@reflectiveTest
+class UnusedShownNameTest extends ResolverTestCase {
+  test_unreferenced() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A, B;
+A a;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_unusedShownName_as() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' as p show A, B;
+p.A a;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_unusedShownName_duplicates() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A, B;
+import 'lib1.dart' show C, D;
+A a;
+C c;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}
+class C {}
+class D {}
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(
+        source, [HintCode.UNUSED_SHOWN_NAME, HintCode.UNUSED_SHOWN_NAME]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+
+  test_unusedShownName_topLevelVariable() async {
+    Source source = addSource(r'''
+library L;
+import 'lib1.dart' show var1, var2;
+import 'lib1.dart' show var3, var4;
+int a = var1;
+int b = var2;
+int c = var3;
+''');
+    Source source2 = addNamedSource("/lib1.dart", r'''
+library lib1;
+const int var1 = 1;
+const int var2 = 2;
+const int var3 = 3;
+const int var4 = 4;
+''');
+    await computeAnalysisResult(source);
+    await computeAnalysisResult(source2);
+    assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+    assertNoErrors(source2);
+    verify([source, source2]);
+  }
+}
+
+@reflectiveTest
+class UnusedShownNameTest_Driver extends UnusedShownNameTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
new file mode 100644
index 0000000..f44a502
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UseOfVoidResultTest);
+    defineReflectiveTests(UseOfVoidResultTest_Driver);
+  });
+}
+
+@reflectiveTest
+class UseOfVoidResultTest extends ResolverTestCase {
+  test_implicitReturnValue() async {
+    await assertNoErrorsInCode(r'''
+f() {}
+class A {
+  n() {
+    var a = f();
+  }
+}
+''');
+  }
+
+  test_nonVoidReturnValue() async {
+    await assertNoErrorsInCode(r'''
+int f() => 1;
+g() {
+  var a = f();
+}
+''');
+  }
+}
+
+@reflectiveTest
+class UseOfVoidResultTest_Driver extends UseOfVoidResultTest {
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analyzer/test/src/fasta/ast_builder_test.dart b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
index 9f0485d..7dc9c97 100644
--- a/pkg/analyzer/test/src/fasta/ast_builder_test.dart
+++ b/pkg/analyzer/test/src/fasta/ast_builder_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart b/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart
index 17b4d06..0958f78 100644
--- a/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/code_order_test.dart
@@ -1,8 +1,8 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -341,14 +341,6 @@
 ''');
   }
 
-  void test_multipleOn() {
-    testRecovery('''
-mixin A on B on C {}
-''', [ParserErrorCode.MULTIPLE_ON_CLAUSES], '''
-mixin A on B, C {}
-''');
-  }
-
   void test_multipleImplements() {
     testRecovery('''
 mixin A implements B implements C, D {}
@@ -357,6 +349,14 @@
 ''');
   }
 
+  void test_multipleOn() {
+    testRecovery('''
+mixin A on B on C {}
+''', [ParserErrorCode.MULTIPLE_ON_CLAUSES], '''
+mixin A on B, C {}
+''');
+  }
+
   @failingTest
   void test_typing_implements() {
     testRecovery('''
diff --git a/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
index 002ca1a..deb16fa 100644
--- a/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/extra_code_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
index b53afa1..95b1703 100644
--- a/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/invalid_code_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
index 492f026..ebcd8d0 100644
--- a/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/missing_code_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -118,24 +118,6 @@
 ''');
   }
 
-  @failingTest
-  void test_initializerList_missingComma() {
-    // https://github.com/dart-lang/sdk/issues/33241
-    testRecovery('''
-class Test {
-  Test()
-    : assert(true)
-      assert(true);
-}
-''', [ParserErrorCode.EXPECTED_TOKEN], '''
-class Test {
-  Test()
-    : assert(true),
-      assert(true);
-}
-''');
-  }
-
   void test_asExpression_missingRight() {
     testRecovery('''
 convert(x) => x as ;
@@ -196,6 +178,14 @@
 ''');
   }
 
+  void test_comma_missing() {
+    testRecovery('''
+f(int a int b) { }
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+f(int a, int b) { }
+''');
+  }
+
   void test_conditionalExpression_else() {
     testRecovery('''
 f() => x ? y : 
@@ -252,6 +242,24 @@
     testUserDefinableOperatorWithSuper('^');
   }
 
+  @failingTest
+  void test_initializerList_missingComma() {
+    // https://github.com/dart-lang/sdk/issues/33241
+    testRecovery('''
+class Test {
+  Test()
+    : assert(true)
+      assert(true);
+}
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+class Test {
+  Test()
+    : assert(true),
+      assert(true);
+}
+''');
+  }
+
   void test_isExpression_missingLeft() {
     testRecovery('''
 f() {
diff --git a/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart b/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
index 50e04a7..5b9b63a 100644
--- a/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/paired_tokens_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -22,6 +22,66 @@
  */
 @reflectiveTest
 class AngleBracketsTest extends AbstractRecoveryTest {
+  @failingTest
+  void test_typeArguments_inner_last() {
+    testRecovery('''
+List<List<int>
+''', [ScannerErrorCode.EXPECTED_TOKEN], '''
+List<List<int>> _s_;
+''');
+  }
+
+  void test_typeArguments_inner_last2() {
+    testRecovery('''
+List<List<int> f;
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+List<List<int>> f;
+''');
+  }
+
+  @failingTest
+  void test_typeArguments_inner_notLast() {
+    testRecovery('''
+Map<List<int, List<String>>
+''', [ScannerErrorCode.EXPECTED_TOKEN], '''
+Map<List<int>, List<String>> _s_;
+''');
+  }
+
+  void test_typeArguments_inner_notLast2() {
+    // TODO(danrubel): Investigate better recovery.
+    testRecovery('''
+Map<List<int, List<String>> f;
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+Map<List<int, List<String>>> f;
+''');
+  }
+
+  void test_typeArguments_missing_comma() {
+    testRecovery('''
+List<int double> f;
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+List<int, double> f;
+''');
+  }
+
+  @failingTest
+  void test_typeArguments_outer_last() {
+    testRecovery('''
+List<int
+''', [ScannerErrorCode.EXPECTED_TOKEN], '''
+List<int> _s_;
+''');
+  }
+
+  void test_typeArguments_outer_last2() {
+    testRecovery('''
+List<int f;
+''', [ParserErrorCode.EXPECTED_TOKEN], '''
+List<int> f;
+''');
+  }
+
   void test_typeParameters_extraGt() {
     testRecovery('''
 f<T>>() => null;
@@ -76,66 +136,6 @@
 ''');
   }
 
-  @failingTest
-  void test_typeArguments_inner_last() {
-    testRecovery('''
-List<List<int>
-''', [ScannerErrorCode.EXPECTED_TOKEN], '''
-List<List<int>> _s_;
-''');
-  }
-
-  void test_typeArguments_inner_last2() {
-    testRecovery('''
-List<List<int> f;
-''', [ParserErrorCode.EXPECTED_TOKEN], '''
-List<List<int>> f;
-''');
-  }
-
-  @failingTest
-  void test_typeArguments_inner_notLast() {
-    testRecovery('''
-Map<List<int, List<String>>
-''', [ScannerErrorCode.EXPECTED_TOKEN], '''
-Map<List<int>, List<String>> _s_;
-''');
-  }
-
-  void test_typeArguments_inner_notLast2() {
-    // TODO(danrubel): Investigate better recovery.
-    testRecovery('''
-Map<List<int, List<String>> f;
-''', [ParserErrorCode.EXPECTED_TOKEN], '''
-Map<List<int, List<String>>> f;
-''');
-  }
-
-  @failingTest
-  void test_typeArguments_outer_last() {
-    testRecovery('''
-List<int
-''', [ScannerErrorCode.EXPECTED_TOKEN], '''
-List<int> _s_;
-''');
-  }
-
-  void test_typeArguments_outer_last2() {
-    testRecovery('''
-List<int f;
-''', [ParserErrorCode.EXPECTED_TOKEN], '''
-List<int> f;
-''');
-  }
-
-  void test_typeArguments_missing_comma() {
-    testRecovery('''
-List<int double> f;
-''', [ParserErrorCode.EXPECTED_TOKEN], '''
-List<int, double> f;
-''');
-  }
-
   void test_typeParameters_last() {
     testRecovery('''
 f<T() => null;
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
index 06105e3..74d995d 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -41,7 +41,13 @@
       [
         new TestDescriptor(
             'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
-            failing: ['typedef', 'functionNonVoid', 'getter', 'setter']),
+            failing: [
+              'typedef',
+              'functionNonVoid',
+              'getter',
+              'mixin',
+              'setter'
+            ]),
         new TestDescriptor(
             'leftParen', '@a(', [ScannerErrorCode.EXPECTED_TOKEN], '@a()',
             allFailing: true),
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
index decfa5e..511b2cc 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/break_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/break_statement_test.dart
index 477bc1c..c84fd5d 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/break_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/break_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
index e932751..934bad6 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/class_declaration_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -36,7 +36,7 @@
               ],
               'class A extend _s_ {}',
               expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_INSTEAD],
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'extends',
               'class A extends',
@@ -45,7 +45,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'class A extends _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'on',
               'class A on',
@@ -56,7 +56,7 @@
               ],
               'class A on _s_ {}',
               expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_INSTEAD],
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor('extendsBody', 'class A extends {}',
               [ParserErrorCode.EXPECTED_TYPE_NAME], 'class A extends _s_ {}'),
           new TestDescriptor(
@@ -78,7 +78,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'class A extends B with _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'extendsNameWithBody',
               'class A extends B with {}',
@@ -92,7 +92,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'class A extends B implements _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'extendsNameImplementsBody',
               'class A extends B implements {}',
@@ -106,7 +106,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'class A extends B with C implements _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'extendsNameWithNameImplementsBody',
               'class A extends B with C implements {}',
@@ -120,7 +120,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'class A implements _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'implementsBody',
               'class A implements {}',
@@ -134,7 +134,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'class A implements B, _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'implementsNameCommaBody',
               'class A implements B, {}',
@@ -149,7 +149,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               'class A = _s_ with _s_;',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'equalsName',
               'class A = B',
@@ -164,7 +164,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               'class A = B with _s_;',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'equalsNameName',
               'class A = B C',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_declaration_test.dart
new file mode 100644
index 0000000..443f166
--- /dev/null
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_declaration_test.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+
+import 'partial_code_support.dart';
+
+main() {
+  new ConstructorTest().buildAll();
+}
+
+class ConstructorTest extends PartialCodeTest {
+  buildAll() {
+    buildTests(
+        'constructor',
+        [
+          new TestDescriptor(
+            'colon',
+            'C() :',
+            [
+              ParserErrorCode.MISSING_INITIALIZER,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : _s_ = _s_ {}',
+            adjustValidUnitBeforeComparison: setSeparator,
+            failing: ['methodNonVoid', 'getter', 'setter'],
+          ),
+          new TestDescriptor(
+            'colon_field',
+            'C() : f',
+            [
+              ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : f = _s_ {}',
+            adjustValidUnitBeforeComparison: setSeparator,
+          ),
+          new TestDescriptor(
+            'colon_field_increment',
+            'C() : f++',
+            [
+              ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : _s_ = f++ {}',
+            adjustValidUnitBeforeComparison: setSeparator,
+          ),
+          new TestDescriptor(
+            'colon_field_comma',
+            'C() : f = 0,',
+            [
+              ParserErrorCode.MISSING_INITIALIZER,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : f = 0, _s_ = _s_ {}',
+            adjustValidUnitBeforeComparison: setSeparator,
+            failing: ['methodNonVoid', 'getter', 'setter'],
+          ),
+          new TestDescriptor(
+            'colon_block',
+            'C() : {}',
+            [ParserErrorCode.MISSING_INITIALIZER],
+            'C() : _s_ = _s_ {}',
+            adjustValidUnitBeforeComparison: setSeparator,
+          ),
+          new TestDescriptor(
+            'colon_semicolon',
+            'C() : ;',
+            [ParserErrorCode.MISSING_INITIALIZER],
+            'C() : _s_ = _s_ ;',
+            adjustValidUnitBeforeComparison: setSeparator,
+          ),
+          new TestDescriptor(
+            'super',
+            'C() : super',
+            [
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : super() {}',
+          ),
+          new TestDescriptor(
+            'super_dot',
+            'C() : super.',
+            [
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_IDENTIFIER,
+              ParserErrorCode.MISSING_FUNCTION_BODY
+            ],
+            'C() : super._s_() {}',
+            failing: ['fieldConst', 'methodNonVoid', 'getter', 'setter'],
+          ),
+          new TestDescriptor(
+            'super_qdot',
+            'C() : super?.',
+            [
+              ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER,
+              ParserErrorCode.EXPECTED_TOKEN,
+              ParserErrorCode.MISSING_FUNCTION_BODY,
+            ],
+            'C() : super?._s_() {}',
+            expectedErrorsInValidCode: [
+              ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
+            ],
+            failing: ['methodNonVoid', 'getter', 'setter'],
+          ),
+        ],
+        PartialCodeTest.classMemberSuffixes,
+        head: 'class C {',
+        tail: '}');
+  }
+
+  CompilationUnit setSeparator(CompilationUnit unit) {
+    ClassDeclaration declaration = unit.declarations[0];
+    ConstructorDeclaration member = declaration.members[0];
+    member.separator =
+        new Token(TokenType.COLON, member.parameters.endToken.charOffset + 1);
+    return unit;
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_test.dart
deleted file mode 100644
index 3f834fd..0000000
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/constructor_test.dart
+++ /dev/null
@@ -1,119 +0,0 @@
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-
-import 'partial_code_support.dart';
-
-main() {
-  new ConstructorTest().buildAll();
-}
-
-class ConstructorTest extends PartialCodeTest {
-  buildAll() {
-    buildTests(
-        'constructor',
-        [
-          new TestDescriptor(
-            'colon',
-            'C() :',
-            [
-              ParserErrorCode.MISSING_INITIALIZER,
-              ParserErrorCode.MISSING_FUNCTION_BODY
-            ],
-            'C() : _s_ = _s_ {}',
-            adjustValidUnitBeforeComparison: setSeparator,
-            failing: ['methodNonVoid', 'getter', 'setter'],
-          ),
-          new TestDescriptor(
-            'colon_field',
-            'C() : f',
-            [
-              ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
-              ParserErrorCode.MISSING_FUNCTION_BODY
-            ],
-            'C() : f = _s_ {}',
-            adjustValidUnitBeforeComparison: setSeparator,
-          ),
-          new TestDescriptor(
-            'colon_field_increment',
-            'C() : f++',
-            [
-              ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER,
-              ParserErrorCode.MISSING_FUNCTION_BODY
-            ],
-            'C() : _s_ = f++ {}',
-            adjustValidUnitBeforeComparison: setSeparator,
-          ),
-          new TestDescriptor(
-            'colon_field_comma',
-            'C() : f = 0,',
-            [
-              ParserErrorCode.MISSING_INITIALIZER,
-              ParserErrorCode.MISSING_FUNCTION_BODY
-            ],
-            'C() : f = 0, _s_ = _s_ {}',
-            adjustValidUnitBeforeComparison: setSeparator,
-            failing: ['methodNonVoid', 'getter', 'setter'],
-          ),
-          new TestDescriptor(
-            'colon_block',
-            'C() : {}',
-            [ParserErrorCode.MISSING_INITIALIZER],
-            'C() : _s_ = _s_ {}',
-            adjustValidUnitBeforeComparison: setSeparator,
-          ),
-          new TestDescriptor(
-            'colon_semicolon',
-            'C() : ;',
-            [ParserErrorCode.MISSING_INITIALIZER],
-            'C() : _s_ = _s_ ;',
-            adjustValidUnitBeforeComparison: setSeparator,
-          ),
-          new TestDescriptor(
-            'super',
-            'C() : super',
-            [
-              ParserErrorCode.EXPECTED_TOKEN,
-              ParserErrorCode.MISSING_FUNCTION_BODY
-            ],
-            'C() : super() {}',
-          ),
-          new TestDescriptor(
-            'super_dot',
-            'C() : super.',
-            [
-              ParserErrorCode.EXPECTED_TOKEN,
-              ParserErrorCode.MISSING_IDENTIFIER,
-              ParserErrorCode.MISSING_FUNCTION_BODY
-            ],
-            'C() : super._s_() {}',
-            failing: ['fieldConst', 'methodNonVoid', 'getter', 'setter'],
-          ),
-          new TestDescriptor(
-            'super_qdot',
-            'C() : super?.',
-            [
-              ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
-              ParserErrorCode.EXPECTED_TOKEN,
-              ParserErrorCode.MISSING_FUNCTION_BODY,
-            ],
-            'C() : super?._s_() {}',
-            expectedErrorsInValidCode: [
-              ParserErrorCode.INVALID_OPERATOR_FOR_SUPER
-            ],
-            failing: ['methodNonVoid', 'getter', 'setter'],
-          ),
-        ],
-        PartialCodeTest.classMemberSuffixes,
-        head: 'class C {',
-        tail: '}');
-  }
-
-  CompilationUnit setSeparator(CompilationUnit unit) {
-    ClassDeclaration declaration = unit.declarations[0];
-    ConstructorDeclaration member = declaration.members[0];
-    member.separator =
-        new Token(TokenType.COLON, member.parameters.endToken.charOffset + 1);
-    return unit;
-  }
-}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/continue_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/continue_statement_test.dart
index 89a70ae..1b49362 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/continue_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/continue_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
index 45a68bc..74b4feb 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/do_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/enum_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/enum_declaration_test.dart
index 167587a..ad5f65e 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/enum_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/enum_declaration_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -50,6 +50,7 @@
                 'typedef',
                 'functionNonVoid',
                 'getter',
+                'mixin',
                 'setter'
               ]),
           new TestDescriptor(
@@ -66,6 +67,7 @@
                 'typedef',
                 'functionNonVoid',
                 'getter',
+                'mixin',
                 'setter'
               ]),
           new TestDescriptor('value', 'enum E {a',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
index fda0f64..4e3ccff 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
index badf5ff..d7db9ab 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/forEach_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/forEach_statement_test.dart
index 799cf53..247cc34 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/forEach_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/forEach_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/for_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/for_statement_test.dart
index 4106cdf..8d22fdf 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/for_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/for_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/if_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/if_statement_test.dart
index ca24085..aa09fb2 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/if_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/if_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
index 4c1c8e1..5472bd1 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/index_expression_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/index_expression_test.dart
new file mode 100644
index 0000000..a55d362
--- /dev/null
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/index_expression_test.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+
+import 'partial_code_support.dart';
+
+main() {
+  new IndexStatementTest().buildAll();
+}
+
+class IndexStatementTest extends PartialCodeTest {
+  buildAll() {
+    buildTests(
+      'index_assignment',
+      [
+        new TestDescriptor(
+          'missing_index_no_space',
+          'intList[] = 0;',
+          [ParserErrorCode.MISSING_IDENTIFIER],
+          'intList[_s_] = 0;',
+        ),
+        new TestDescriptor(
+          'missing_index_with_space',
+          'intList[ ] = 0;',
+          [ParserErrorCode.MISSING_IDENTIFIER],
+          'intList[_s_] = 0;',
+        ),
+        new TestDescriptor(
+          'trailing_comma',
+          'intList[x,] = 0;',
+          [ParserErrorCode.EXPECTED_TOKEN],
+          'intList[x] = 0;',
+        ),
+        new TestDescriptor(
+          'trailing_comma_and_identifier',
+          'intList[x,y] = 0;',
+          [ParserErrorCode.EXPECTED_TOKEN],
+          'intList[x] = 0;',
+        ),
+        new TestDescriptor(
+          'trailing_identifier_no_comma',
+          'intList[x y] = 0;',
+          [ParserErrorCode.EXPECTED_TOKEN],
+          'intList[x] = 0;',
+        ),
+      ],
+      [], //PartialCodeTest.statementSuffixes,
+      head: 'f() { ',
+      tail: ' }',
+    );
+    buildTests(
+      'index_partial',
+      [
+        new TestDescriptor(
+          'open',
+          'intList[',
+          [
+            ParserErrorCode.MISSING_IDENTIFIER,
+            ScannerErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.EXPECTED_TOKEN,
+          ],
+          'intList[_s_];',
+          failing: [
+            'eof',
+            'assert',
+            'block',
+            'labeled',
+            'localFunctionNonVoid',
+            'localFunctionVoid',
+            'return'
+          ],
+        ),
+        new TestDescriptor(
+          'identifier',
+          'intList[x',
+          [
+            ScannerErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.EXPECTED_TOKEN,
+            ParserErrorCode.EXPECTED_TOKEN,
+          ],
+          'intList[x];',
+          failing: ['eof'],
+        ),
+      ],
+      PartialCodeTest.statementSuffixes,
+      head: 'f() { ',
+      tail: ' }',
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/index_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/index_statement_test.dart
deleted file mode 100644
index 1391a1e..0000000
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/index_statement_test.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-
-import 'partial_code_support.dart';
-
-main() {
-  new IndexStatementTest().buildAll();
-}
-
-class IndexStatementTest extends PartialCodeTest {
-  buildAll() {
-    buildTests(
-      'index_assignment',
-      [
-        new TestDescriptor(
-          'missing_index_no_space',
-          'intList[] = 0;',
-          [ParserErrorCode.MISSING_IDENTIFIER],
-          'intList[_s_] = 0;',
-        ),
-        new TestDescriptor(
-          'missing_index_with_space',
-          'intList[ ] = 0;',
-          [ParserErrorCode.MISSING_IDENTIFIER],
-          'intList[_s_] = 0;',
-        ),
-        new TestDescriptor(
-          'trailing_comma',
-          'intList[x,] = 0;',
-          [ParserErrorCode.EXPECTED_TOKEN],
-          'intList[x] = 0;',
-        ),
-        new TestDescriptor(
-          'trailing_comma_and_identifier',
-          'intList[x,y] = 0;',
-          [ParserErrorCode.EXPECTED_TOKEN],
-          'intList[x] = 0;',
-        ),
-        new TestDescriptor(
-          'trailing_identifier_no_comma',
-          'intList[x y] = 0;',
-          [ParserErrorCode.EXPECTED_TOKEN],
-          'intList[x] = 0;',
-        ),
-      ],
-      [], //PartialCodeTest.statementSuffixes,
-      head: 'f() { ',
-      tail: ' }',
-    );
-    buildTests(
-      'index_partial',
-      [
-        new TestDescriptor(
-          'open',
-          'intList[',
-          [
-            ParserErrorCode.MISSING_IDENTIFIER,
-            ScannerErrorCode.EXPECTED_TOKEN,
-            ParserErrorCode.EXPECTED_TOKEN,
-            ParserErrorCode.EXPECTED_TOKEN,
-          ],
-          'intList[_s_];',
-          failing: [
-            'eof',
-            'assert',
-            'block',
-            'labeled',
-            'localFunctionNonVoid',
-            'localFunctionVoid',
-            'return'
-          ],
-        ),
-        new TestDescriptor(
-          'identifier',
-          'intList[x',
-          [
-            ScannerErrorCode.EXPECTED_TOKEN,
-            ParserErrorCode.EXPECTED_TOKEN,
-            ParserErrorCode.EXPECTED_TOKEN,
-          ],
-          'intList[x];',
-          failing: ['eof'],
-        ),
-      ],
-      PartialCodeTest.statementSuffixes,
-      head: 'f() { ',
-      tail: ' }',
-    );
-  }
-}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
index 826aa32..e62cc14 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/instance_creation_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
index ba1d480..256fbd3 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/library_directive_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
index ad6cb54..848d86d 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
index 1391383..080d5d4 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/method_declaration_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart
index 33fe03f..02a221b 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/mixin_declaration_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -34,7 +34,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'mixin A on _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'extend',
               'mixin A extend',
@@ -45,7 +45,7 @@
               ],
               'mixin A extend _s_ {}',
               expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_INSTEAD],
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'extends',
               'mixin A extends',
@@ -56,7 +56,7 @@
               ],
               'mixin A extends _s_ {}',
               expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_INSTEAD],
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor('onBody', 'mixin A on {}',
               [ParserErrorCode.EXPECTED_TYPE_NAME], 'mixin A on _s_ {}'),
           new TestDescriptor(
@@ -67,7 +67,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'mixin A on B, _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor('onNameCommaBody', 'mixin A on B, {}',
               [ParserErrorCode.EXPECTED_TYPE_NAME], 'mixin A on B, _s_ {}'),
           new TestDescriptor(
@@ -84,9 +84,9 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'mixin A on B implements _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
-              'onNameImplements',
+              'onNameImplementsBody',
               'mixin A on B implements {}',
               [ParserErrorCode.EXPECTED_TYPE_NAME],
               'mixin A on B implements _s_ {}'),
@@ -98,7 +98,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'mixin A implements _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'implementsBody',
               'mixin A implements {}',
@@ -112,7 +112,7 @@
                 ParserErrorCode.MISSING_CLASS_BODY
               ],
               'mixin A implements B, _s_ {}',
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
           new TestDescriptor(
               'implementsNameCommaBody',
               'mixin A implements B, {}',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
index 814cf9b..970336d 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_directive_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
index 17da7bc..246de37 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -34,7 +34,8 @@
                 ParserErrorCode.EXPECTED_STRING_LITERAL,
                 ParserErrorCode.EXPECTED_TOKEN
               ],
-              'part of "";'),
+              'part of "";',
+              failing: ['mixin']),
         ],
         nonIdentifierSuffixes);
     buildTests(
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
index 62a722f..8634b8f 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
@@ -1,8 +1,8 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:test/test.dart';
@@ -46,6 +46,8 @@
    */
   static final List<TestSuffix> declarationSuffixes = <TestSuffix>[
     new TestSuffix('class', 'class A {}'),
+    new TestSuffix('enum', 'enum E { v }'),
+    new TestSuffix('mixin', 'mixin M {}'),
     new TestSuffix('typedef', 'typedef A = B Function(C, D);'),
     new TestSuffix('functionVoid', 'void f() {}'),
     new TestSuffix('functionNonVoid', 'int f() {}'),
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/return_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/return_statement_test.dart
index 4ba4a81..a56d5b1 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/return_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/return_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/switch_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/switch_statement_test.dart
index ea94764..f8a05c4 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/switch_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/switch_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
index 316e1bb..768c05b 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,8 +8,7 @@
 import 'assert_statement_test.dart' as assert_statement;
 import 'break_statement_test.dart' as break_statement;
 import 'class_declaration_test.dart' as class_declaration;
-import 'constructor_test.dart' as constructor;
-import 'mixin_declaration_test.dart' as mixin_declaration;
+import 'constructor_declaration_test.dart' as constructor_declaration;
 import 'continue_statement_test.dart' as continue_statement;
 import 'do_statement_test.dart' as do_statement;
 import 'enum_declaration_test.dart' as enum_declaration;
@@ -19,11 +18,12 @@
 import 'for_statement_test.dart' as for_statement;
 import 'if_statement_test.dart' as if_statement;
 import 'import_directive_test.dart' as import_directive;
-import 'index_statement_test.dart' as index_statement;
+import 'index_expression_test.dart' as index_expression;
 import 'instance_creation_test.dart' as instance_creation;
 import 'library_directive_test.dart' as library_directive;
 import 'local_variable_test.dart' as local_variable;
 import 'method_declaration_test.dart' as method_declaration;
+import 'mixin_declaration_test.dart' as mixin_declaration;
 import 'parameter_test.dart' as parameter;
 import 'part_directive_test.dart' as part_directive;
 import 'part_of_directive_test.dart' as part_of_directive;
@@ -41,7 +41,7 @@
     assert_statement.main();
     break_statement.main();
     class_declaration.main();
-    constructor.main();
+    constructor_declaration.main();
     continue_statement.main();
     do_statement.main();
     enum_declaration.main();
@@ -51,7 +51,7 @@
     forEach_statement.main();
     if_statement.main();
     import_directive.main();
-    index_statement.main();
+    index_expression.main();
     instance_creation.main();
     library_directive.main();
     local_variable.main();
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
index e4cfd56..06a3ef6 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -43,7 +43,7 @@
               CompileTimeErrorCode.CONST_NOT_INITIALIZED
             ],
             "const a;",
-            failing: ['functionNonVoid', 'getter', 'setter'],
+            failing: ['functionNonVoid', 'getter', 'setter', 'mixin'],
             expectedErrorsInValidCode: [
               CompileTimeErrorCode.CONST_NOT_INITIALIZED
             ],
@@ -145,7 +145,7 @@
               StaticWarningCode.FINAL_NOT_INITIALIZED
             ],
             "final a;",
-            failing: ['functionNonVoid', 'getter', 'setter'],
+            failing: ['functionNonVoid', 'getter', 'setter', 'mixin'],
             expectedErrorsInValidCode: [
               StaticWarningCode.FINAL_NOT_INITIALIZED
             ],
@@ -193,7 +193,7 @@
             'var a',
             [ParserErrorCode.EXPECTED_TOKEN],
             "var a;",
-            failing: ['functionNonVoid', 'getter', 'setter'],
+            failing: ['functionNonVoid', 'getter', 'mixin', 'setter'],
           ),
           new TestDescriptor(
             'varNameEquals',
@@ -209,7 +209,9 @@
               'functionVoid',
               'functionNonVoid',
               'const',
+              'enum',
               'getter',
+              'mixin',
               'setter'
             ],
           ),
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
index dde0479..ca80f4c 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -93,7 +93,9 @@
               'catch_identifierCommaIdentifier',
               'try {} catch (e, s',
               [
-                ParserErrorCode.CATCH_SYNTAX,
+                // TODO(danrubel): Update parser to generate CATCH_SYNTAX
+                // because in this situation there are not any extra parameters.
+                ParserErrorCode.CATCH_SYNTAX_EXTRA_PARAMETERS,
                 ParserErrorCode.EXPECTED_TOKEN,
                 ScannerErrorCode.EXPECTED_TOKEN
               ],
@@ -145,8 +147,10 @@
               'on_catch_identifierCommaIdentifier',
               'try {} on A catch (e, s',
               [
+                // TODO(danrubel): Update parser to generate CATCH_SYNTAX
+                // because in this situation there are not any extra parameters.
+                ParserErrorCode.CATCH_SYNTAX_EXTRA_PARAMETERS,
                 ParserErrorCode.EXPECTED_TOKEN,
-                ParserErrorCode.CATCH_SYNTAX,
                 ScannerErrorCode.EXPECTED_TOKEN
               ],
               "try {} on A catch (e, s) {}",
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart
index 95f261e..f961ba7 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/typedef_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -33,7 +33,7 @@
                 ParserErrorCode.EXPECTED_TOKEN
               ],
               "typedef T();",
-              failing: ['functionNonVoid', 'getter', 'setter']),
+              failing: ['functionNonVoid', 'getter', 'mixin', 'setter']),
           new TestDescriptor(
               'keywordEquals',
               'typedef =',
@@ -56,7 +56,7 @@
               expectedErrorsInValidCode: [
                 ParserErrorCode.INVALID_GENERIC_FUNCTION_TYPE
               ],
-              failing: ['functionVoid', 'functionNonVoid', 'getter']),
+              failing: ['functionVoid', 'functionNonVoid', 'getter', 'mixin']),
         ],
         PartialCodeTest.declarationSuffixes);
   }
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/while_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/while_statement_test.dart
index 07640a5..7a01697 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/while_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/while_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
index bc15d07..f97da43 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
index 60b559c..f42bcdd 100644
--- a/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/recovery_test_support.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/recovery/test_all.dart b/pkg/analyzer/test/src/fasta/recovery/test_all.dart
index 4a668cc..2c37da8 100644
--- a/pkg/analyzer/test/src/fasta/recovery/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/test_all.dart b/pkg/analyzer/test/src/fasta/test_all.dart
index b9f73b5..91b1a9c 100644
--- a/pkg/analyzer/test/src/fasta/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/fasta/token_utils_test.dart b/pkg/analyzer/test/src/fasta/token_utils_test.dart
index 03f057d..40e05d0 100644
--- a/pkg/analyzer/test/src/fasta/token_utils_test.dart
+++ b/pkg/analyzer/test/src/fasta/token_utils_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer/test/src/hint/sdk_constraint_extractor_test.dart b/pkg/analyzer/test/src/hint/sdk_constraint_extractor_test.dart
new file mode 100644
index 0000000..76974b6
--- /dev/null
+++ b/pkg/analyzer/test/src/hint/sdk_constraint_extractor_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/hint/sdk_constraint_extractor.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SdkConstraintExtractorTest);
+  });
+}
+
+@reflectiveTest
+class SdkConstraintExtractorTest with ResourceProviderMixin {
+  SdkConstraintExtractor extractorFor(String pubspecContent) {
+    String pubspecPath = '/pkg/test/pubspec.yaml';
+    File pubspecFile = newFile(pubspecPath, content: pubspecContent);
+    return new SdkConstraintExtractor(pubspecFile);
+  }
+
+  test_constraint_any() {
+    SdkConstraintExtractor extractor = extractorFor('''
+environment:
+  sdk: any
+''');
+    expect(extractor.constraint().toString(), 'any');
+  }
+
+  test_constraint_caret() {
+    SdkConstraintExtractor extractor = extractorFor('''
+environment:
+  sdk: ^2.1.0
+''');
+    expect(extractor.constraint().toString(), '^2.1.0');
+  }
+
+  test_constraint_compound() {
+    SdkConstraintExtractor extractor = extractorFor('''
+environment:
+  sdk: '>=2.1.0 <3.0.0'
+''');
+    expect(extractor.constraint().toString(), '>=2.1.0 <3.0.0');
+  }
+
+  test_constraint_gt() {
+    SdkConstraintExtractor extractor = extractorFor('''
+environment:
+  sdk: '>2.1.0'
+''');
+    expect(extractor.constraint().toString(), '>2.1.0');
+  }
+
+  test_constraint_gte() {
+    SdkConstraintExtractor extractor = extractorFor('''
+environment:
+  sdk: '>=2.2.0-dev.3.0'
+''');
+    expect(extractor.constraint().toString(), '>=2.2.0-dev.3.0');
+  }
+
+  test_constraint_invalid_badConstraint() {
+    SdkConstraintExtractor extractor = extractorFor('''
+environment:
+  sdk: latest
+''');
+    expect(extractor.constraint(), isNull);
+  }
+
+  test_constraint_invalid_noEnvironment() {
+    SdkConstraintExtractor extractor = extractorFor('''
+name: test
+''');
+    expect(extractor.constraint(), isNull);
+  }
+
+  test_constraint_invalid_noSdk() {
+    SdkConstraintExtractor extractor = extractorFor('''
+environment:
+  os: 'Analytical Engine'
+''');
+    expect(extractor.constraint(), isNull);
+  }
+
+  test_constraint_invalid_notYaml() {
+    SdkConstraintExtractor extractor = extractorFor('''
+class C {}
+''');
+    expect(extractor.constraint(), isNull);
+  }
+}
diff --git a/pkg/analyzer/test/src/hint/sdk_constraint_verifier.dart b/pkg/analyzer/test/src/hint/sdk_constraint_verifier.dart
new file mode 100644
index 0000000..ad910f0
--- /dev/null
+++ b/pkg/analyzer/test/src/hint/sdk_constraint_verifier.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:pub_semver/pub_semver.dart';
+
+import '../../generated/resolver_test_case.dart';
+import '../../generated/test_support.dart';
+
+/// A base class designed to be used by tests of the hints produced by an
+/// SdkConstraintVerifier.
+class SdkConstraintVerifierTest extends ResolverTestCase {
+  bool get enableNewAnalysisDriver => true;
+
+  verifyVersion(String version, String source,
+      {List<ErrorCode> errorCodes}) async {
+    driver.configure(
+        analysisOptions: AnalysisOptionsImpl()
+          ..sdkVersionConstraint = VersionConstraint.parse(version));
+
+    TestAnalysisResult result = await computeTestAnalysisResult(source);
+    GatheringErrorListener listener = new GatheringErrorListener();
+    listener.addAll(result.errors);
+    if (errorCodes == null) {
+      listener.assertNoErrors();
+    } else {
+      listener.assertErrorsWithCodes(errorCodes);
+    }
+  }
+}
diff --git a/pkg/analyzer/test/src/hint/sdk_version_async_exported_from_core_test.dart b/pkg/analyzer/test/src/hint/sdk_version_async_exported_from_core_test.dart
new file mode 100644
index 0000000..a9f42b6
--- /dev/null
+++ b/pkg/analyzer/test/src/hint/sdk_version_async_exported_from_core_test.dart
@@ -0,0 +1,129 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'sdk_constraint_verifier.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SdkVersionAsyncExportedFromCoreTest);
+  });
+}
+
+@reflectiveTest
+class SdkVersionAsyncExportedFromCoreTest extends SdkConstraintVerifierTest {
+  test_equals_explicitImportOfAsync() async {
+    await verifyVersion('2.1.0', '''
+import 'dart:async';
+
+Future<int> zero() async => 0;
+''');
+  }
+
+  test_equals_explicitImportOfCore() async {
+    await verifyVersion('2.1.0', '''
+import 'dart:core';
+
+Future<int> zero() async => 0;
+''');
+  }
+
+  test_equals_explicitImportOfExportingLibrary() async {
+    addNamedSource('/exporter.dart', '''
+export 'dart:async';
+''');
+    await verifyVersion('2.1.0', '''
+import 'exporter.dart';
+
+Future<int> zero() async => 0;
+''');
+  }
+
+  test_equals_implicitImportOfCore() async {
+    await verifyVersion('2.1.0', '''
+Future<int> zero() async => 0;
+''');
+  }
+
+  test_equals_implicitImportOfCore_inPart() async {
+    newFile('/lib.dart', content: '''
+library lib;
+''');
+    await verifyVersion('2.1.0', '''
+part of lib;
+
+Future<int> zero() async => 0;
+''');
+  }
+
+  test_lessThan_explicitImportOfAsync() async {
+    await verifyVersion('2.0.0', '''
+import 'dart:async';
+
+Future<int> zero() async => 0;
+''');
+  }
+
+  test_lessThan_explicitImportOfCore() async {
+    await verifyVersion('2.0.0', '''
+import 'dart:core' show Future, int;
+
+Future<int> zero() async => 0;
+''', errorCodes: [HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE]);
+  }
+
+  test_lessThan_explicitImportOfExportingLibrary() async {
+    addNamedSource('/exporter.dart', '''
+export 'dart:async';
+''');
+    await verifyVersion('2.0.0', '''
+import 'exporter.dart';
+
+Future<int> zero() async => 0;
+''');
+  }
+
+  test_lessThan_implicitImportOfCore() async {
+    await verifyVersion('2.0.0', '''
+Future<int> zero() async => 0;
+''', errorCodes: [HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE]);
+  }
+
+  test_lessThan_implicitImportOfCore_inPart() async {
+    newFile('/lib.dart', content: '''
+library lib;
+''');
+    await verifyVersion('2.0.0', '''
+part of lib;
+
+Future<int> zero() async => 0;
+''', errorCodes: [HintCode.SDK_VERSION_ASYNC_EXPORTED_FROM_CORE]);
+  }
+
+  test_lessThan_onlyReferencedInExport_hide() async {
+    await verifyVersion('2.0.0', '''
+export 'dart:async' hide Future;
+''');
+  }
+
+  test_lessThan_onlyReferencedInExport_show() async {
+    await verifyVersion('2.0.0', '''
+export 'dart:async' show Future;
+''');
+  }
+
+  test_lessThan_onlyReferencedInImport_hide() async {
+    await verifyVersion('2.0.0', '''
+import 'dart:core' hide Future;
+''');
+  }
+
+  test_lessThan_onlyReferencedInImport_show() async {
+    await verifyVersion('2.0.0', '''
+import 'dart:core' show Future;
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/hint/test_all.dart b/pkg/analyzer/test/src/hint/test_all.dart
new file mode 100644
index 0000000..0234ba4
--- /dev/null
+++ b/pkg/analyzer/test/src/hint/test_all.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'sdk_constraint_extractor_test.dart' as sdk_constraint_extractor;
+import 'sdk_version_async_exported_from_core_test.dart'
+    as sdk_version_async_exported_from_core;
+
+main() {
+  defineReflectiveSuite(() {
+    sdk_constraint_extractor.main();
+    sdk_version_async_exported_from_core.main();
+  }, name: 'hint');
+}
diff --git a/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
new file mode 100644
index 0000000..49e4be9
--- /dev/null
+++ b/pkg/analyzer/test/src/lint/linter/linter_context_impl_test.dart
@@ -0,0 +1,121 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../generated/resolver_test_case.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(LinterContextImplTest);
+  });
+}
+
+@reflectiveTest
+class LinterContextImplTest extends ResolverTestCase {
+  String testSource;
+  CompilationUnitImpl testUnit;
+  LinterContextImpl context;
+
+  bool get enableNewAnalysisDriver => true;
+
+  void assertCanBeConst(String snippet, bool expectedResult) {
+    int index = testSource.indexOf(snippet);
+    expect(index >= 0, isTrue);
+    NodeLocator visitor = new NodeLocator(index);
+    AstNodeImpl node = visitor.searchWithin(testUnit);
+    node = node.thisOrAncestorOfType<InstanceCreationExpressionImpl>();
+    expect(node, isNotNull);
+    expect(context.canBeConst(node as InstanceCreationExpressionImpl),
+        expectedResult ? isTrue : isFalse);
+  }
+
+  Future<void> resolve(String sourceText) async {
+    testSource = sourceText;
+    Source source = addNamedSource('/test.dart', sourceText);
+    ResolvedUnitResult analysisResult = await driver.getResult(source.fullName);
+    testUnit = analysisResult.unit;
+    LinterContextUnit contextUnit = new LinterContextUnit(sourceText, testUnit);
+    context = new LinterContextImpl(
+        [contextUnit],
+        contextUnit,
+        analysisResult.session.declaredVariables,
+        analysisResult.typeProvider,
+        analysisResult.typeSystem);
+  }
+
+  void test_canBeConst_false_argument_invocation() async {
+    await resolve('''
+class A {}
+class B {
+  const B(A a);
+}
+A f() => A();
+B g() => B(f());
+''');
+    assertCanBeConst("B(f", false);
+  }
+
+  void test_canBeConst_false_argument_invocationInList() async {
+    await resolve('''
+class A {}
+class B {
+  const B(a);
+}
+A f() => A();
+B g() => B([f()]);
+''');
+    assertCanBeConst("B([", false);
+  }
+
+  void test_canBeConst_false_argument_nonConstConstructor() async {
+    await resolve('''
+class A {}
+class B {
+  const B(A a);
+}
+B f() => B(A());
+''');
+    assertCanBeConst("B(A(", false);
+  }
+
+  void test_canBeConst_false_nonConstConstructor() async {
+    await resolve('''
+class A {}
+A f() => A();
+''');
+    assertCanBeConst("A(", false);
+  }
+
+  void test_canBeConst_true_constConstructorArg() async {
+    await resolve('''
+class A {
+  const A();
+}
+class B {
+  const B(A a);
+}
+B f() => B(A());
+''');
+    assertCanBeConst("B(A(", true);
+  }
+
+  void test_canBeConst_true_constListArg() async {
+    await resolve('''
+class A {
+  const A(List<int> l);
+}
+A f() => A([1, 2, 3]);
+''');
+    assertCanBeConst("A([", true);
+  }
+}
diff --git a/pkg/analyzer/test/src/lint/linter/test_all.dart b/pkg/analyzer/test/src/lint/linter/test_all.dart
new file mode 100644
index 0000000..101588b
--- /dev/null
+++ b/pkg/analyzer/test/src/lint/linter/test_all.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'linter_context_impl_test.dart' as linter_context_impl;
+
+main() {
+  defineReflectiveSuite(() {
+    linter_context_impl.main();
+  }, name: 'linter');
+}
diff --git a/pkg/analyzer/test/src/lint/test_all.dart b/pkg/analyzer/test/src/lint/test_all.dart
index 60555a3..47596f2 100644
--- a/pkg/analyzer/test/src/lint/test_all.dart
+++ b/pkg/analyzer/test/src/lint/test_all.dart
@@ -1,20 +1,21 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'config_test.dart' as config_test;
-import 'io_test.dart' as io_test;
-import 'project_test.dart' as project_test;
-import 'pub_test.dart' as pub_test;
+import 'config_test.dart' as config;
+import 'io_test.dart' as io;
+import 'linter/test_all.dart' as linter;
+import 'project_test.dart' as project;
+import 'pub_test.dart' as pub;
 
-/// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
-    config_test.main();
-    io_test.main();
-    project_test.main();
-    pub_test.main();
+    config.main();
+    io.main();
+    linter.main();
+    project.main();
+    pub.main();
   }, name: 'lint');
 }
diff --git a/pkg/analyzer/test/src/options/options_rule_validator_test.dart b/pkg/analyzer/test/src/options/options_rule_validator_test.dart
new file mode 100644
index 0000000..5150828
--- /dev/null
+++ b/pkg/analyzer/test/src/options/options_rule_validator_test.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/lint/linter.dart';
+import 'package:analyzer/src/lint/options_rule_validator.dart';
+import 'package:analyzer/src/string_source.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:yaml/yaml.dart';
+
+import '../../generated/test_support.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(OptionsRuleValidatorTest);
+  });
+}
+
+class DeprecatedLint extends LintRule {
+  DeprecatedLint()
+      : super(
+            name: 'deprecated_lint',
+            group: Group.style,
+            maturity: Maturity.deprecated);
+}
+
+@reflectiveTest
+class OptionsRuleValidatorTest extends Object with ResourceProviderMixin {
+  LinterRuleOptionsValidator validator = new LinterRuleOptionsValidator(
+      provider: () => [new DeprecatedLint(), new StableLint()]);
+
+/**
+ * Assert that when the validator is used on the given [content] the
+ * [expectedErrorCodes] are produced.
+ */
+  void assertErrors(String content, List<ErrorCode> expectedErrorCodes) {
+    GatheringErrorListener listener = new GatheringErrorListener();
+    ErrorReporter reporter = new ErrorReporter(
+        listener, new StringSource(content, 'analysis_options.yaml'));
+    validator.validate(reporter, loadYamlNode(content));
+    listener.assertErrorsWithCodes(expectedErrorCodes);
+  }
+
+  test_deprecated_rule() {
+    assertErrors('''
+linter:
+  rules:
+    - deprecated_lint
+      ''', [DEPRECATED_LINT_HINT]);
+  }
+
+  test_duplicated_rule() {
+    assertErrors('''
+linter:
+  rules:
+    - stable_lint
+    - stable_lint
+      ''', [DUPLICATE_RULE_HINT]);
+  }
+
+  test_stable_rule() {
+    assertErrors('''
+linter:
+  rules:
+    - stable_lint
+      ''', []);
+  }
+
+  test_undefined_rule() {
+    assertErrors('''
+linter:
+  rules:
+    - this_rule_does_not_exist
+      ''', [UNDEFINED_LINT_WARNING]);
+  }
+}
+
+class StableLint extends LintRule {
+  StableLint()
+      : super(
+            name: 'stable_lint', group: Group.style, maturity: Maturity.stable);
+}
diff --git a/pkg/analyzer/test/src/options/test_all.dart b/pkg/analyzer/test/src/options/test_all.dart
new file mode 100644
index 0000000..e38e167
--- /dev/null
+++ b/pkg/analyzer/test/src/options/test_all.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'options_rule_validator_test.dart' as options_rule_validator;
+
+main() {
+  defineReflectiveSuite(() {
+    options_rule_validator.main();
+  }, name: 'options');
+}
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index f841d78..ef1cc99 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -20,7 +20,7 @@
 }
 
 @reflectiveTest
-class PubspecValidatorTest extends Object with ResourceProviderMixin {
+class PubspecValidatorTest with ResourceProviderMixin {
   PubspecValidator validator;
 
   /**
diff --git a/pkg/analyzer/test/src/source/source_resource_test.dart b/pkg/analyzer/test/src/source/source_resource_test.dart
index abf46f6..863117b 100644
--- a/pkg/analyzer/test/src/source/source_resource_test.dart
+++ b/pkg/analyzer/test/src/source/source_resource_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -10,12 +10,11 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/source/source_resource.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../context/mock_sdk.dart';
-
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(FileSourceTest);
@@ -23,7 +22,7 @@
 }
 
 @reflectiveTest
-class FileSourceTest extends Object with ResourceProviderMixin {
+class FileSourceTest with ResourceProviderMixin {
   void test_equals_false_differentFiles() {
     File file1 = getFile("/does/not/exist1.dart");
     File file2 = getFile("/does/not/exist2.dart");
diff --git a/pkg/analyzer/test/src/summary/expr_builder_test.dart b/pkg/analyzer/test/src/summary/expr_builder_test.dart
index c17d7f8..cf2ecd6 100644
--- a/pkg/analyzer/test/src/summary/expr_builder_test.dart
+++ b/pkg/analyzer/test/src/summary/expr_builder_test.dart
@@ -1,13 +1,20 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/scanner/reader.dart';
+import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/string_source.dart';
 import 'package:analyzer/src/summary/expr_builder.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
+import 'package:analyzer/src/summary/summarize_const_expr.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -17,6 +24,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ExprBuilderTest);
+    defineReflectiveTests(TokensToStringTest);
   });
 }
 
@@ -24,10 +32,128 @@
 class ExprBuilderTest extends ResynthesizeTestStrategyTwoPhase
     with ExprBuilderTestCases, ExprBuilderTestHelpers {}
 
+@reflectiveTest
+class TokensToStringTest {
+  void test_empty_list_no_space() {
+    // This is an interesting test case because "[]" is scanned as a single
+    // token, but the parser splits it into two.
+    _check('[]');
+  }
+
+  void test_empty_list_with_space() {
+    _check('[ ]');
+  }
+
+  void test_gt_gt_gt_in_type() {
+    // This is an interesting test case because ">>>" is scanned as a single
+    // token, but the parser splits it into three.
+    _check('A<B<C>>>[]');
+  }
+
+  void test_gt_gt_gt_in_type_split_both() {
+    _check('A<B<C> > >[]');
+  }
+
+  void test_gt_gt_gt_in_type_split_left() {
+    _check('A<B<C> >>[]');
+  }
+
+  void test_gt_gt_gt_in_type_split_right() {
+    _check('A<B<C>> >[]');
+  }
+
+  void test_gt_gt_in_type() {
+    // This is an interesting test case because ">>" is scanned as a single
+    // token, but the parser splits it into two.
+    _check('<A<B>>[]');
+  }
+
+  void test_gt_gt_in_type_split() {
+    _check('A<B> >[]');
+  }
+
+  void test_identifier() {
+    _check('foo');
+  }
+
+  void test_interpolation_expr_at_end_of_string() {
+    _check(r'"foo${bar}"');
+  }
+
+  void test_interpolation_expr_at_start_of_string() {
+    _check(r'"${foo}bar"');
+  }
+
+  void test_interpolation_expr_inside_string() {
+    _check(r'"foo${bar}baz"');
+  }
+
+  void test_interpolation_var_at_end_of_string() {
+    _check(r'"foo$bar"');
+  }
+
+  void test_interpolation_var_at_start_of_string() {
+    _check(r'"$foo bar"');
+  }
+
+  void test_interpolation_var_inside_string() {
+    _check(r'"foo$bar baz"');
+  }
+
+  void test_simple_string() {
+    _check('"foo"');
+  }
+
+  void _check(String originalString) {
+    var expression = _parseExpression(originalString);
+    var originalTokens =
+        _extractTokenList(expression.beginToken, expression.endToken);
+    var newString = tokensToString(expression.beginToken, expression.endToken);
+    var errorListener = AnalysisErrorListener.NULL_LISTENER;
+    var reader = new CharSequenceReader(newString);
+    var stringSource = new StringSource(newString, null);
+    var scanner = new Scanner(stringSource, reader, errorListener);
+    var startToken = scanner.tokenize();
+    var newTokens = _extractTokenList(startToken);
+    expect(newTokens, originalTokens);
+  }
+
+  List<String> _extractTokenList(Token startToken, [Token endToken]) {
+    var result = <String>[];
+    while (!startToken.isEof) {
+      if (!startToken.isSynthetic) result.add(startToken.lexeme);
+      if (identical(startToken, endToken)) break;
+      startToken = startToken.next;
+    }
+    return result;
+  }
+
+  Expression _parseExpression(String expressionString) {
+    // Note: to normalize the token string it's not sufficient to tokenize it
+    // and then pass the tokens to `tokensToString`; we also need to parse it
+    // because parsing modifies the token stream (splitting up `[]`, `>>`, and
+    // `>>>` tokens when circumstances warrant).
+    //
+    // We wrap the expression in "f() async => ...;" to ensure that the await
+    // keyword is properly parsed.
+    var sourceText = 'f() async => $expressionString;';
+    var errorListener = AnalysisErrorListener.NULL_LISTENER;
+    var reader = new CharSequenceReader(sourceText);
+    var stringSource = new StringSource(sourceText, null);
+    var scanner = new Scanner(stringSource, reader, errorListener);
+    var startToken = scanner.tokenize();
+    var parser = new Parser(stringSource, errorListener);
+    var compilationUnit = parser.parseCompilationUnit(startToken);
+    var f = compilationUnit.declarations[0] as FunctionDeclaration;
+    var body = f.functionExpression.body as ExpressionFunctionBody;
+    return body.expression;
+  }
+}
+
 /// Mixin containing test cases exercising the [ExprBuilder].  Intended to be
 /// applied to a class implementing [ResynthesizeTestStrategy], along with the
 /// mixin [ExprBuilderTestHelpers].
-abstract class ExprBuilderTestCases implements ExprBuilderTestHelpers {
+mixin ExprBuilderTestCases implements ExprBuilderTestHelpers {
   void test_add() {
     checkSimpleExpression('0 + 1');
   }
@@ -360,7 +486,7 @@
 
   @failingTest
   void test_pushLocalFunctionReference_nested() {
-    prepareAnalysisContext(new AnalysisOptionsImpl()..previewDart2 = false);
+    prepareAnalysisContext(new AnalysisOptionsImpl());
     var expr =
         checkSimpleExpression('(x) => (y) => x + y') as FunctionExpression;
     var outerFunctionElement = expr.declaredElement;
@@ -383,7 +509,7 @@
 
   @failingTest
   void test_pushLocalFunctionReference_paramReference() {
-    prepareAnalysisContext(new AnalysisOptionsImpl()..previewDart2 = false);
+    prepareAnalysisContext(new AnalysisOptionsImpl());
     var expr = checkSimpleExpression('(x, y) => x + y') as FunctionExpression;
     var localFunctionElement = expr.declaredElement;
     var xElement = localFunctionElement.parameters[0];
@@ -478,9 +604,9 @@
   }
 }
 
-/// Mixin containing helper methods for testing the [ExprBuilder].  Intended to
+/// Mixin containing helper methods for testing the [ExprBuilder]. Intended to
 /// be applied to a class implementing [ResynthesizeTestStrategy].
-abstract class ExprBuilderTestHelpers implements ResynthesizeTestStrategy {
+mixin ExprBuilderTestHelpers implements ResynthesizeTestStrategy {
   Expression buildConstructorInitializer(String sourceText,
       {String className: 'C',
       String initializerName: 'x',
diff --git a/pkg/analyzer/test/src/summary/linker_test.dart b/pkg/analyzer/test/src/summary/linker_test.dart
index 4a6136f..e406c24 100644
--- a/pkg/analyzer/test/src/summary/linker_test.dart
+++ b/pkg/analyzer/test/src/summary/linker_test.dart
@@ -26,7 +26,7 @@
 /// These test cases may be mixed into any class derived from
 /// [SummaryLinkerTestStrategy], allowing the linker to be unit-tested in a
 /// variety of ways.
-abstract class LinkerUnitTestCases implements SummaryLinkerTestStrategy {
+mixin LinkerUnitTestCases implements SummaryLinkerTestStrategy {
   Matcher get isUndefined => const TypeMatcher<UndefinedElementForLink>();
 
   LibraryElementForLink getLibrary(String uri) {
@@ -165,14 +165,9 @@
   }
 
   void test_covariance() {
-    // Note: due to dartbug.com/27393, the keyword "checked" is identified by
-    // its presence in a library called "meta".  If that bug is fixed, this test
-    // may need to be changed.
     createLinker('''
-library meta;
-const checked = null;
 class A<T> {
-  void f(@checked T t) {}
+  void f(covariant T t) {}
 }
 class B<T> extends A<T> {
   void f(T t) {}
diff --git a/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart b/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
index 0709a95..1061dba 100644
--- a/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
+++ b/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
@@ -368,7 +368,7 @@
 
   _TestResynthesizerResultProvider(
       InternalAnalysisContext context, SummaryDataStore dataStore)
-      : super(context, dataStore);
+      : super(context, null, dataStore);
 
   @override
   bool hasResultsForSource(Source source) {
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index adbbdba..69d2215 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -25,12 +25,12 @@
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/test_support.dart';
 import '../abstract_single_unit.dart';
-import '../context/abstract_context.dart';
 import 'element_text.dart';
 import 'test_strategies.dart';
 
@@ -100,7 +100,7 @@
     }
   }
 
-  DartSdk createDartSdk() => AbstractContextTest.SHARED_MOCK_SDK;
+  DartSdk createDartSdk() => new MockSdk(resourceProvider: resourceProvider);
 
   /**
    * Create the analysis options that should be used for this test.
@@ -117,7 +117,7 @@
 /// Mixin containing test cases exercising summary resynthesis.  Intended to be
 /// applied to a class implementing [ResynthesizeTestStrategy], along with the
 /// mixin [ResynthesizeTestHelpers].
-abstract class ResynthesizeTestCases implements ResynthesizeTestHelpers {
+mixin ResynthesizeTestCases implements ResynthesizeTestHelpers {
   test_class_abstract() async {
     var library = await checkLibrary('abstract class C {}');
     checkElementText(library, r'''
@@ -451,6 +451,36 @@
 ''');
   }
 
+  test_class_constructor_field_formal_functionTyped_noReturnType() async {
+    var library = await checkLibrary(r'''
+class C {
+  var x;
+  C(this.x(double b));
+}
+''');
+    checkElementText(library, r'''
+class C {
+  dynamic x;
+  C((double) → dynamic this.x);
+}
+''');
+  }
+
+  test_class_constructor_field_formal_functionTyped_withReturnType() async {
+    var library = await checkLibrary(r'''
+class C {
+  var x;
+  C(int this.x(double b));
+}
+''');
+    checkElementText(library, r'''
+class C {
+  dynamic x;
+  C((double) → int this.x);
+}
+''');
+  }
+
   test_class_constructor_field_formal_multiple_matching_fields() async {
     // This is a compile-time error but it should still analyze consistently.
     var library = await checkLibrary('class C { C(this.x); int x; String x; }',
@@ -2152,7 +2182,9 @@
     checkElementText(library, r'''
 class C {
 }
-const dynamic V = #invalidConst;
+const dynamic V = const
+        C/*location: test.dart;C*/.
+        named/*location: null*/();
 ''');
   }
 
@@ -2162,7 +2194,9 @@
 const V = const C.named();
 ''', allowErrors: true);
     checkElementText(library, r'''
-const dynamic V = #invalidConst;
+const dynamic V = const
+        C/*location: null*/.
+        named/*location: null*/();
 ''');
   }
 
@@ -2178,7 +2212,10 @@
 ''', allowErrors: true);
     checkElementText(library, r'''
 import 'a.dart' as p;
-const dynamic V = #invalidConst;
+const dynamic V = const
+        p/*location: test.dart;p*/.
+        C/*location: a.dart;C*/.
+        named/*location: null*/();
 ''');
   }
 
@@ -2191,7 +2228,10 @@
 ''', allowErrors: true);
     checkElementText(library, r'''
 import 'a.dart' as p;
-const dynamic V = #invalidConst;
+const dynamic V = const
+        p/*location: test.dart;p*/.
+        C/*location: null*/.
+        named/*location: null*/();
 ''');
   }
 
@@ -2201,7 +2241,10 @@
 const V = const p.C.named();
 ''', allowErrors: true);
     checkElementText(library, r'''
-const dynamic V = #invalidConst;
+const dynamic V = const
+        p/*location: null*/.
+        C/*location: null*/.
+        named/*location: null*/();
 ''');
   }
 
@@ -2214,7 +2257,9 @@
     checkElementText(library, r'''
 class C<T> {
 }
-const dynamic V = #invalidConst;
+const dynamic V = const
+        C/*location: test.dart;C*/.
+        named/*location: null*/();
 ''');
   }
 
@@ -2274,7 +2319,8 @@
 const V = const C();
 ''', allowErrors: true);
     checkElementText(library, r'''
-const dynamic V = #invalidConst;
+const dynamic V = const
+        C/*location: null*/();
 ''');
   }
 
@@ -2287,7 +2333,9 @@
 ''', allowErrors: true);
     checkElementText(library, r'''
 import 'a.dart' as p;
-const dynamic V = #invalidConst;
+const dynamic V = const
+        p/*location: test.dart;p*/.
+        C/*location: null*/();
 ''');
   }
 
@@ -2297,7 +2345,9 @@
 const V = const p.C();
 ''', allowErrors: true);
     checkElementText(library, r'''
-const dynamic V = #invalidConst;
+const dynamic V = const
+        p/*location: null*/.
+        C/*location: null*/();
 ''');
   }
 
@@ -2863,7 +2913,8 @@
 const V = foo;
 ''', allowErrors: true);
     checkElementText(library, r'''
-const dynamic V = #invalidConst;
+const dynamic V =
+        foo/*location: null*/;
 ''');
   }
 
@@ -2876,7 +2927,9 @@
     checkElementText(library, r'''
 class C {
 }
-const dynamic V = #invalidConst;
+const dynamic V =
+        C/*location: test.dart;C*/.
+        foo/*location: null*/;
 ''');
   }
 
@@ -2891,7 +2944,10 @@
 ''', allowErrors: true);
     checkElementText(library, r'''
 import 'foo.dart' as p;
-const dynamic V = #invalidConst;
+const dynamic V =
+        p/*location: test.dart;p*/.
+        C/*location: foo.dart;C*/.
+        foo/*location: null*/;
 ''');
   }
 
@@ -3029,7 +3085,7 @@
 const vSuper = super;
 ''');
     checkElementText(library, r'''
-const dynamic vSuper = #invalidConst;
+const dynamic vSuper = super;
 ''');
   }
 
@@ -3039,7 +3095,7 @@
 const vThis = this;
 ''');
     checkElementText(library, r'''
-const dynamic vThis = #invalidConst;
+const dynamic vThis = this;
 ''');
   }
 
@@ -5145,7 +5201,8 @@
 import '';
 ''');
     checkElementText(library, r'''
-@#invalidConst
+@
+        foo/*location: null*/
 import '<unresolved>';
 ''');
   }
@@ -5894,7 +5951,10 @@
 ''');
     checkElementText(library, r'''
 import 'a.dart' as a;
-@#invalidConst
+@
+        a/*location: test.dart;a*/.
+        C/*location: a.dart;C*/.
+        named/*location: a.dart;C;named*/
 class D {
 }
 ''');
@@ -5914,7 +5974,9 @@
 ''');
     checkElementText(library, r'''
 import 'a.dart';
-@#invalidConst
+@
+        C/*location: a.dart;C*/.
+        named/*location: a.dart;C;named*/
 class D {
 }
 ''');
@@ -5948,7 +6010,8 @@
     checkElementText(library, r'''
 import 'a.dart';
 import 'b.dart';
-dynamic foo([dynamic p = #invalidConst]) {}
+dynamic foo([dynamic p =
+        V/*location: null*/]) {}
 ''');
   }
 
@@ -5967,7 +6030,8 @@
 ''');
     checkElementText(library, r'''
 import 'c.dart';
-dynamic foo([dynamic p = #invalidConst]) {}
+dynamic foo([dynamic p =
+        V/*location: null*/]) {}
 ''');
   }
 
@@ -5981,7 +6045,8 @@
 ''');
     checkElementText(library, r'''
 dynamic V;
-dynamic foo([dynamic p = #invalidConst]) {}
+dynamic foo([dynamic p =
+        V/*location: null*/]) {}
 dynamic V() {}
 ''');
   }
@@ -6662,7 +6727,8 @@
     shouldCompareLibraryElements = false;
     var library = await checkLibrary('f(_) {} @f(42) class C {}');
     checkElementText(library, r'''
-@#invalidConst
+@
+        __unresolved__/*location: null*/
 class C {
 }
 dynamic f(dynamic _) {}
@@ -7220,54 +7286,6 @@
         withOffsets: true);
   }
 
-  test_parameter_checked() async {
-    // Note: due to dartbug.com/27393, the keyword "checked" is identified by
-    // its presence in a library called "meta".  If that bug is fixed, this test
-    // my need to be changed.
-    var library = await checkLibrary(r'''
-library meta;
-const checked = null;
-class A<T> {
-  void f(@checked T t) {}
-}
-''');
-    checkElementText(library, r'''
-library meta;
-class A<T> {
-  void f(@
-        checked/*location: test.dart;checked?*/ covariant T t) {}
-}
-const dynamic checked = null;
-''');
-  }
-
-  test_parameter_checked_inherited() async {
-    // Note: due to dartbug.com/27393, the keyword "checked" is identified by
-    // its presence in a library called "meta".  If that bug is fixed, this test
-    // my need to be changed.
-    var library = await checkLibrary(r'''
-library meta;
-const checked = null;
-class A<T> {
-  void f(@checked T t) {}
-}
-class B<T> extends A<T> {
-  void f(T t) {}
-}
-''');
-    checkElementText(library, r'''
-library meta;
-class A<T> {
-  void f(@
-        checked/*location: test.dart;checked?*/ covariant T t) {}
-}
-class B<T> extends A<T> {
-  void f(covariant T t) {}
-}
-const dynamic checked = null;
-''');
-  }
-
   test_parameter_covariant() async {
     var library = await checkLibrary('class C { void m(covariant C c) {} }');
     checkElementText(library, r'''
@@ -8323,7 +8341,8 @@
 class A {
   const A(dynamic _);
 }
-@#invalidConst
+@
+        A/*location: test.dart;A*/(this)
 class C {
 }
 ''');
@@ -8334,7 +8353,9 @@
     var library =
         await checkLibrary('@foo.bar() class C {}', allowErrors: true);
     checkElementText(library, r'''
-@#invalidConst
+@
+        foo/*location: null*/.
+        bar/*location: null*/()
 class C {
 }
 ''');
@@ -8345,7 +8366,9 @@
     var library =
         await checkLibrary('@String.foo() class C {}', allowErrors: true);
     checkElementText(library, r'''
-@#invalidConst
+@
+        String/*location: dart:core;String*/.
+        foo/*location: null*/()
 class C {
 }
 ''');
@@ -8355,7 +8378,9 @@
     shouldCompareLibraryElements = false;
     var library = await checkLibrary('@foo.bar class C {}', allowErrors: true);
     checkElementText(library, r'''
-@#invalidConst
+@
+        foo/*location: null*/.
+        bar/*location: null*/
 class C {
 }
 ''');
@@ -8368,7 +8393,9 @@
         allowErrors: true);
     checkElementText(library, r'''
 import 'dart:async' as foo;
-@#invalidConst
+@
+        foo/*location: test.dart;foo*/.
+        bar/*location: null*/
 class C {
 }
 ''');
@@ -8379,7 +8406,10 @@
     var library =
         await checkLibrary('@foo.bar.baz() class C {}', allowErrors: true);
     checkElementText(library, r'''
-@#invalidConst
+@
+        foo/*location: null*/.
+        bar/*location: null*/.
+        baz/*location: null*/()
 class C {
 }
 ''');
@@ -8392,7 +8422,10 @@
         allowErrors: true);
     checkElementText(library, r'''
 import 'dart:async' as foo;
-@#invalidConst
+@
+        foo/*location: test.dart;foo*/.
+        bar/*location: null*/.
+        baz/*location: null*/()
 class C {
 }
 ''');
@@ -8405,7 +8438,10 @@
         allowErrors: true);
     checkElementText(library, r'''
 import 'dart:async' as foo;
-@#invalidConst
+@
+        foo/*location: test.dart;foo*/.
+        Future/*location: dart:async;Future*/.
+        bar/*location: null*/()
 class C {
 }
 ''');
@@ -8416,7 +8452,9 @@
     var library =
         await checkLibrary('@foo.bar() class C {}', allowErrors: true);
     checkElementText(library, r'''
-@#invalidConst
+@
+        foo/*location: null*/.
+        bar/*location: null*/()
 class C {
 }
 ''');
@@ -8429,7 +8467,9 @@
         allowErrors: true);
     checkElementText(library, r'''
 import 'dart:async' as foo;
-@#invalidConst
+@
+        foo/*location: test.dart;foo*/.
+        bar/*location: null*/()
 class C {
 }
 ''');
@@ -8439,7 +8479,8 @@
     shouldCompareLibraryElements = false;
     var library = await checkLibrary('@foo class C {}', allowErrors: true);
     checkElementText(library, r'''
-@#invalidConst
+@
+        foo/*location: null*/
 class C {
 }
 ''');
@@ -8449,7 +8490,8 @@
     shouldCompareLibraryElements = false;
     var library = await checkLibrary('@foo() class C {}', allowErrors: true);
     checkElementText(library, r'''
-@#invalidConst
+@
+        foo/*location: null*/()
 class C {
 }
 ''');
@@ -8746,7 +8788,7 @@
 
 /// Mixin containing helper methods for testing summary resynthesis.  Intended
 /// to be applied to a class implementing [ResynthesizeTestStrategy].
-abstract class ResynthesizeTestHelpers implements ResynthesizeTestStrategy {
+mixin ResynthesizeTestHelpers implements ResynthesizeTestStrategy {
   /**
    * Names of variables which have initializers that are not valid constants,
    * so they are not resynthesized.
@@ -10012,7 +10054,7 @@
 
   TestSummaryResynthesizer(AnalysisContext context, this.unlinkedSummaries,
       this.linkedSummaries, this.allowMissingFiles)
-      : super(context, context.sourceFactory, true) {
+      : super(context, null, context.sourceFactory, true) {
     // Clear after resynthesizing TypeProvider in super().
     unlinkedSummariesRequested.clear();
     linkedSummariesRequested.clear();
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 3f1e604..71fd7cd 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -1,19 +1,21 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/string_source.dart';
 import 'package:analyzer/src/summary/base.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/public_namespace_computer.dart'
     as public_namespace;
+import 'package:analyzer/src/summary/summarize_const_expr.dart';
 import 'package:test/test.dart';
 
 import 'test_strategies.dart';
@@ -79,7 +81,7 @@
 /// These test cases may be mixed into any class derived from
 /// [SummaryBlackBoxTestStrategy], allowing summary generation to be unit-tested
 /// in a variety of ways.
-abstract class SummaryTestCases implements SummaryBlackBoxTestStrategy {
+mixin SummaryTestCases implements SummaryBlackBoxTestStrategy {
   /**
    * Get access to the linked defining compilation unit.
    */
@@ -88,7 +90,7 @@
   /**
    * TODO(scheglov) rename "Const" to "Expr" everywhere
    */
-  void assertUnlinkedConst(UnlinkedExpr constExpr,
+  void assertUnlinkedConst(UnlinkedExpr constExpr, String sourceRepresentation,
       {bool isValidConst: true,
       List<UnlinkedExprOperation> operators: const <UnlinkedExprOperation>[],
       List<UnlinkedExprAssignOperator> assignmentOperators:
@@ -104,6 +106,8 @@
       return;
     }
     expect(constExpr, isNotNull);
+    expect(constExpr.sourceRepresentation,
+        _normalizeTokenString(sourceRepresentation));
     expect(constExpr.isValidConst, isValidConst);
     expect(constExpr.operations, operators);
     expect(constExpr.ints, ints);
@@ -122,7 +126,7 @@
    */
   void checkAnnotationA(List<UnlinkedExpr> annotations) {
     expect(annotations, hasLength(1));
-    assertUnlinkedConst(annotations[0], operators: [
+    assertUnlinkedConst(annotations[0], 'a', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'a',
@@ -1665,7 +1669,7 @@
 
   test_constExpr_binary_add() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 + 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 + 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.add
@@ -1678,16 +1682,17 @@
   test_constExpr_binary_and() {
     UnlinkedVariable variable =
         serializeVariableText('const v = true && false;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushTrue,
-      UnlinkedExprOperation.pushFalse,
-      UnlinkedExprOperation.and
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'true && false',
+        operators: [
+          UnlinkedExprOperation.pushTrue,
+          UnlinkedExprOperation.pushFalse,
+          UnlinkedExprOperation.and
+        ]);
   }
 
   test_constExpr_binary_bitAnd() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 & 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 & 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.bitAnd
@@ -1699,7 +1704,7 @@
 
   test_constExpr_binary_bitOr() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 | 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 | 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.bitOr
@@ -1711,7 +1716,7 @@
 
   test_constExpr_binary_bitShiftLeft() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 << 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 << 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.bitShiftLeft
@@ -1723,7 +1728,7 @@
 
   test_constExpr_binary_bitShiftRight() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 >> 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 >> 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.bitShiftRight
@@ -1735,7 +1740,7 @@
 
   test_constExpr_binary_bitXor() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 ^ 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 ^ 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.bitXor
@@ -1747,7 +1752,7 @@
 
   test_constExpr_binary_divide() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 / 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 / 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.divide
@@ -1759,7 +1764,7 @@
 
   test_constExpr_binary_equal() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 == 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 == 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.equal
@@ -1771,7 +1776,7 @@
 
   test_constExpr_binary_equal_not() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 != 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 != 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.notEqual
@@ -1783,7 +1788,7 @@
 
   test_constExpr_binary_floorDivide() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 ~/ 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 ~/ 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.floorDivide
@@ -1795,7 +1800,7 @@
 
   test_constExpr_binary_greater() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 > 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 > 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.greater
@@ -1807,7 +1812,7 @@
 
   test_constExpr_binary_greaterEqual() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 >= 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 >= 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.greaterEqual
@@ -1819,7 +1824,7 @@
 
   test_constExpr_binary_less() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 < 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 < 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.less
@@ -1831,7 +1836,7 @@
 
   test_constExpr_binary_lessEqual() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 <= 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 <= 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.lessEqual
@@ -1843,7 +1848,7 @@
 
   test_constExpr_binary_modulo() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 % 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 % 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.modulo
@@ -1855,7 +1860,7 @@
 
   test_constExpr_binary_multiply() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 * 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 * 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.multiply
@@ -1868,16 +1873,17 @@
   test_constExpr_binary_or() {
     UnlinkedVariable variable =
         serializeVariableText('const v = false || true;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushFalse,
-      UnlinkedExprOperation.pushTrue,
-      UnlinkedExprOperation.or
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'false || true',
+        operators: [
+          UnlinkedExprOperation.pushFalse,
+          UnlinkedExprOperation.pushTrue,
+          UnlinkedExprOperation.or
+        ]);
   }
 
   test_constExpr_binary_qq() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 ?? 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 ?? 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.ifNull
@@ -1889,7 +1895,7 @@
 
   test_constExpr_binary_subtract() {
     UnlinkedVariable variable = serializeVariableText('const v = 1 - 2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1 - 2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.subtract
@@ -1912,7 +1918,8 @@
 }
 ''';
     UnlinkedClass cls = serializeClassText(text, allowErrors: true);
-    assertUnlinkedConst(cls.executables[0].constantInitializers[0].expression,
+    assertUnlinkedConst(
+        cls.executables[0].constantInitializers[0].expression, 'T',
         operators: [
           UnlinkedExprOperation.pushReference
         ],
@@ -1929,15 +1936,17 @@
   test_constExpr_conditional() {
     UnlinkedVariable variable =
         serializeVariableText('const v = true ? 1 : 2;', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushTrue,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.conditional
-    ], ints: [
-      1,
-      2
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'true ? 1 : 2',
+        operators: [
+          UnlinkedExprOperation.pushTrue,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.conditional
+        ],
+        ints: [
+          1,
+          2
+        ]);
   }
 
   test_constExpr_constructorParam_shadows_classMember() {
@@ -1948,7 +1957,8 @@
   const C(a) : b = a;
 }
 ''');
-    assertUnlinkedConst(cls.executables[0].constantInitializers[0].expression,
+    assertUnlinkedConst(
+        cls.executables[0].constantInitializers[0].expression, 'a',
         operators: [UnlinkedExprOperation.pushParameter], strings: ['a']);
   }
 
@@ -1959,7 +1969,8 @@
   const C(T) : x = T;
 }
 ''');
-    assertUnlinkedConst(cls.executables[0].constantInitializers[0].expression,
+    assertUnlinkedConst(
+        cls.executables[0].constantInitializers[0].expression, 'T',
         operators: [UnlinkedExprOperation.pushParameter], strings: ['T']);
   }
 
@@ -1968,7 +1979,8 @@
 import 'dart:async';
 var v = (f) async => await f;
 ''');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.localFunctions[0].bodyExpr, 'await f',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushParameter,
@@ -1987,7 +1999,7 @@
 const v = foo(5, () => 42);
 foo(a, b) {}
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'foo(5, () => 42)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -2016,7 +2028,8 @@
 const v = foo(5, () => 42, () => 43);
 foo(a, b, c) {}
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'foo(5, () => 42, () => 43)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -2051,11 +2064,13 @@
 }
 ''').executables[0];
     expect(executable.localFunctions, hasLength(2));
-    assertUnlinkedConst(executable.constantInitializers[0].expression,
+    assertUnlinkedConst(
+        executable.constantInitializers[0].expression, '(() => 42)',
         isValidConst: false,
         operators: [UnlinkedExprOperation.pushLocalFunctionReference],
         ints: [0, 0]);
-    assertUnlinkedConst(executable.constantInitializers[1].expression,
+    assertUnlinkedConst(
+        executable.constantInitializers[1].expression, '(() => 43)',
         isValidConst: false,
         operators: [UnlinkedExprOperation.pushLocalFunctionReference],
         ints: [0, 1]);
@@ -2068,24 +2083,28 @@
 }
 const v = const C<int, String>.named();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) {
-        checkTypeRef(r, null, 'named',
-            expectedKind: ReferenceKind.constructor,
-            prefixExpectations: [
-              new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                  numTypeParameters: 2)
-            ],
-            numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
-      }
-    ]);
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'const C<int, String>.named()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) {
+            checkTypeRef(r, null, 'named',
+                expectedKind: ReferenceKind.constructor,
+                prefixExpectations: [
+                  new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                      numTypeParameters: 2)
+                ],
+                numTypeArguments: 2);
+            checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+            checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
+          }
+        ]);
   }
 
   test_constExpr_invokeConstructor_generic_named_imported() {
@@ -2098,24 +2117,28 @@
 import 'a.dart';
 const v = const C<int, String>.named();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) {
-        checkTypeRef(r, null, 'named',
-            expectedKind: ReferenceKind.constructor,
-            prefixExpectations: [
-              new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                  absoluteUri: absUri('/a.dart'), numTypeParameters: 2)
-            ],
-            numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
-      }
-    ]);
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'const C<int, String>.named()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) {
+            checkTypeRef(r, null, 'named',
+                expectedKind: ReferenceKind.constructor,
+                prefixExpectations: [
+                  new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                      absoluteUri: absUri('/a.dart'), numTypeParameters: 2)
+                ],
+                numTypeArguments: 2);
+            checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+            checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
+          }
+        ]);
   }
 
   test_constExpr_invokeConstructor_generic_named_imported_withPrefix() {
@@ -2128,25 +2151,29 @@
 import 'a.dart' as p;
 const v = const p.C<int, String>.named();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) {
-        checkTypeRef(r, null, 'named',
-            expectedKind: ReferenceKind.constructor,
-            prefixExpectations: [
-              new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                  absoluteUri: absUri('/a.dart'), numTypeParameters: 2),
-              new _PrefixExpectation(ReferenceKind.prefix, 'p')
-            ],
-            numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
-      }
-    ]);
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'const p.C<int, String>.named()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) {
+            checkTypeRef(r, null, 'named',
+                expectedKind: ReferenceKind.constructor,
+                prefixExpectations: [
+                  new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                      absoluteUri: absUri('/a.dart'), numTypeParameters: 2),
+                  new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                ],
+                numTypeArguments: 2);
+            checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+            checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
+          }
+        ]);
   }
 
   test_constExpr_invokeConstructor_generic_unnamed() {
@@ -2156,21 +2183,24 @@
 }
 const v = const C<int, String>();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) {
-        checkTypeRef(r, null, 'C',
-            expectedKind: ReferenceKind.classOrEnum,
-            numTypeParameters: 2,
-            numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
-      }
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const C<int, String>()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) {
+            checkTypeRef(r, null, 'C',
+                expectedKind: ReferenceKind.classOrEnum,
+                numTypeParameters: 2,
+                numTypeArguments: 2);
+            checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+            checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
+          }
+        ]);
   }
 
   test_constExpr_invokeConstructor_generic_unnamed_imported() {
@@ -2183,21 +2213,24 @@
 import 'a.dart';
 const v = const C<int, String>();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) {
-        checkTypeRef(r, absUri('/a.dart'), 'C',
-            expectedKind: ReferenceKind.classOrEnum,
-            numTypeParameters: 2,
-            numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
-      }
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const C<int, String>()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) {
+            checkTypeRef(r, absUri('/a.dart'), 'C',
+                expectedKind: ReferenceKind.classOrEnum,
+                numTypeParameters: 2,
+                numTypeArguments: 2);
+            checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+            checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
+          }
+        ]);
   }
 
   test_constExpr_invokeConstructor_generic_unnamed_imported_withPrefix() {
@@ -2210,24 +2243,28 @@
 import 'a.dart' as p;
 const v = const p.C<int, String>();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) {
-        checkTypeRef(r, absUri('/a.dart'), 'C',
-            expectedKind: ReferenceKind.classOrEnum,
-            numTypeParameters: 2,
-            numTypeArguments: 2,
-            prefixExpectations: [
-              new _PrefixExpectation(ReferenceKind.prefix, 'p')
-            ]);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
-      }
-    ]);
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'const p.C<int, String>()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) {
+            checkTypeRef(r, absUri('/a.dart'), 'C',
+                expectedKind: ReferenceKind.classOrEnum,
+                numTypeParameters: 2,
+                numTypeArguments: 2,
+                prefixExpectations: [
+                  new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                ]);
+            checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+            checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
+          }
+        ]);
   }
 
   test_constExpr_invokeConstructor_named() {
@@ -2237,18 +2274,21 @@
 }
 const v = const C.named();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'named',
-              expectedKind: ReferenceKind.constructor,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const C.named()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'named',
+                  expectedKind: ReferenceKind.constructor,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
+                  ])
+        ]);
   }
 
   test_constExpr_invokeConstructor_named_imported() {
@@ -2261,19 +2301,22 @@
 import 'a.dart';
 const v = const C.named();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'named',
-              expectedKind: ReferenceKind.constructor,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'))
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const C.named()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'named',
+                  expectedKind: ReferenceKind.constructor,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                        absoluteUri: absUri('/a.dart'))
+                  ])
+        ]);
   }
 
   test_constExpr_invokeConstructor_named_imported_withPrefix() {
@@ -2286,20 +2329,23 @@
 import 'a.dart' as p;
 const v = const p.C.named();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'named',
-              expectedKind: ReferenceKind.constructor,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart')),
-                new _PrefixExpectation(ReferenceKind.prefix, 'p')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const p.C.named()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'named',
+                  expectedKind: ReferenceKind.constructor,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                        absoluteUri: absUri('/a.dart')),
+                    new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                  ])
+        ]);
   }
 
   test_constExpr_invokeConstructor_unnamed() {
@@ -2313,34 +2359,40 @@
     // Ints: ^pointer 3 4
     // Doubles: ^pointer
     // Strings: ^pointer 'e' 'g' 'f' ''
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushDouble,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      11,
-      22,
-      55,
-      66,
-      3,
-      4,
-    ], doubles: [
-      3.3
-    ], strings: [
-      '444',
-      '777',
-      'e',
-      'g',
-      'f'
-    ], referenceValidators: [
-      (EntityRef r) =>
-          checkTypeRef(r, null, 'C', expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr,
+        "const C(11, 22, 3.3, '444', e: 55, g: '777', f: 66)",
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushDouble,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          11,
+          22,
+          55,
+          66,
+          3,
+          4,
+        ],
+        doubles: [
+          3.3
+        ],
+        strings: [
+          '444',
+          '777',
+          'e',
+          'g',
+          'f'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'C',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_constExpr_invokeConstructor_unnamed_imported() {
@@ -2353,7 +2405,7 @@
 import 'a.dart';
 const v = const C();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const C()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -2374,18 +2426,21 @@
 import 'a.dart' as p;
 const v = const p.C();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'C',
-              expectedKind: ReferenceKind.classOrEnum,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.prefix, 'p')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const p.C()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'C',
+                  expectedKind: ReferenceKind.classOrEnum,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                  ])
+        ]);
   }
 
   test_constExpr_invokeConstructor_unresolved_named() {
@@ -2393,36 +2448,42 @@
 class C {}
 const v = const C.foo();
 ''', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'foo',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const C.foo()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'foo',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
+                  ])
+        ]);
   }
 
   test_constExpr_invokeConstructor_unresolved_named2() {
     UnlinkedVariable variable = serializeVariableText('''
 const v = const C.foo();
 ''', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'foo',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.unresolved, 'C')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const C.foo()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'foo',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.unresolved, 'C')
+                  ])
+        ]);
   }
 
   test_constExpr_invokeConstructor_unresolved_named_prefixed() {
@@ -2434,20 +2495,23 @@
 import 'a.dart' as p;
 const v = const p.C.foo();
 ''', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'foo',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart')),
-                new _PrefixExpectation(ReferenceKind.prefix, 'p')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const p.C.foo()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'foo',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                        absoluteUri: absUri('/a.dart')),
+                    new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                  ])
+        ]);
   }
 
   test_constExpr_invokeConstructor_unresolved_named_prefixed2() {
@@ -2456,54 +2520,63 @@
 import 'a.dart' as p;
 const v = const p.C.foo();
 ''', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'foo',
-              expectedKind: ReferenceKind.unresolved,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.unresolved, 'C'),
-                new _PrefixExpectation(ReferenceKind.prefix, 'p')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const p.C.foo()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'foo',
+                  expectedKind: ReferenceKind.unresolved,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.unresolved, 'C'),
+                    new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                  ])
+        ]);
   }
 
   test_constExpr_invokeConstructor_unresolved_unnamed() {
     UnlinkedVariable variable = serializeVariableText('''
 const v = const Foo();
 ''', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.invokeConstructor,
-    ], ints: [
-      0,
-      0
-    ], referenceValidators: [
-      (EntityRef r) =>
-          checkTypeRef(r, null, 'Foo', expectedKind: ReferenceKind.unresolved)
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const Foo()',
+        operators: [
+          UnlinkedExprOperation.invokeConstructor,
+        ],
+        ints: [
+          0,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'Foo',
+              expectedKind: ReferenceKind.unresolved)
+        ]);
   }
 
   test_constExpr_invokeMethodRef_identical() {
     UnlinkedVariable variable =
         serializeVariableText('const v = identical(42, null);');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushNull,
-      UnlinkedExprOperation.invokeMethodRef
-    ], ints: [
-      42,
-      0,
-      2,
-      0
-    ], referenceValidators: [
-      (EntityRef r) {
-        checkTypeRef(r, 'dart:core', 'identical',
-            expectedKind: ReferenceKind.topLevelFunction);
-      }
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'identical(42, null)',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushNull,
+          UnlinkedExprOperation.invokeMethodRef
+        ],
+        ints: [
+          42,
+          0,
+          2,
+          0
+        ],
+        referenceValidators: [
+          (EntityRef r) {
+            checkTypeRef(r, 'dart:core', 'identical',
+                expectedKind: ReferenceKind.topLevelFunction);
+          }
+        ]);
   }
 
   test_constExpr_length_classConstField() {
@@ -2513,7 +2586,7 @@
 }
 const int v = C.length;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.length', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'length',
@@ -2534,17 +2607,19 @@
 import 'a.dart' as p;
 const int v = p.C.length;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushReference
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'length',
-              expectedKind: ReferenceKind.propertyAccessor,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart')),
-                new _PrefixExpectation(ReferenceKind.prefix, 'p')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.C.length',
+        operators: [
+          UnlinkedExprOperation.pushReference
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'length',
+                  expectedKind: ReferenceKind.propertyAccessor,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
+                        absoluteUri: absUri('/a.dart')),
+                    new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                  ])
+        ]);
   }
 
   test_constExpr_length_identifierTarget() {
@@ -2552,7 +2627,7 @@
 const String a = 'aaa';
 const int v = a.length;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'a.length', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'length',
@@ -2572,17 +2647,19 @@
 }
 const int v = C.F.length;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushReference
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'length',
-              expectedKind: ReferenceKind.unresolved,
-              unresolvedHasName: true,
-              prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.propertyAccessor, 'F'),
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'C'),
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.F.length',
+        operators: [
+          UnlinkedExprOperation.pushReference
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'length',
+                  expectedKind: ReferenceKind.unresolved,
+                  unresolvedHasName: true,
+                  prefixExpectations: [
+                    new _PrefixExpectation(ReferenceKind.propertyAccessor, 'F'),
+                    new _PrefixExpectation(ReferenceKind.classOrEnum, 'C'),
+                  ])
+        ]);
   }
 
   test_constExpr_length_identifierTarget_imported() {
@@ -2593,7 +2670,7 @@
 import 'a.dart';
 const int v = a.length;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'a.length', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'length',
@@ -2615,107 +2692,123 @@
 import 'a.dart' as p;
 const int v = p.a.length;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushReference
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, 'length',
-              expectedKind: ReferenceKind.unresolved,
-              unresolvedHasName: true,
-              prefixExpectations: [
-                new _PrefixExpectation(
-                    ReferenceKind.topLevelPropertyAccessor, 'a',
-                    absoluteUri: absUri('/a.dart')),
-                new _PrefixExpectation(ReferenceKind.prefix, 'p')
-              ])
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.a.length',
+        operators: [
+          UnlinkedExprOperation.pushReference
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, null, 'length',
+                  expectedKind: ReferenceKind.unresolved,
+                  unresolvedHasName: true,
+                  prefixExpectations: [
+                    new _PrefixExpectation(
+                        ReferenceKind.topLevelPropertyAccessor, 'a',
+                        absoluteUri: absUri('/a.dart')),
+                    new _PrefixExpectation(ReferenceKind.prefix, 'p')
+                  ])
+        ]);
   }
 
   test_constExpr_length_parenthesizedBinaryTarget() {
     UnlinkedVariable variable =
         serializeVariableText('const v = ("abc" + "edf").length;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.add,
-      UnlinkedExprOperation.extractProperty
-    ], strings: [
-      'abc',
-      'edf',
-      'length'
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, '("abc" + "edf").length',
+        operators: [
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.add,
+          UnlinkedExprOperation.extractProperty
+        ],
+        strings: [
+          'abc',
+          'edf',
+          'length'
+        ]);
   }
 
   test_constExpr_length_parenthesizedStringTarget() {
     UnlinkedVariable variable =
         serializeVariableText('const v = ("abc").length;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.extractProperty
-    ], strings: [
-      'abc',
-      'length'
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, '("abc").length',
+        operators: [
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.extractProperty
+        ],
+        strings: [
+          'abc',
+          'length'
+        ]);
   }
 
   test_constExpr_length_stringLiteralTarget() {
     UnlinkedVariable variable =
         serializeVariableText('const v = "abc".length;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.extractProperty
-    ], strings: [
-      'abc',
-      'length'
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, '"abc".length',
+        operators: [
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.extractProperty
+        ],
+        strings: [
+          'abc',
+          'length'
+        ]);
   }
 
   test_constExpr_makeSymbol() {
     UnlinkedVariable variable = serializeVariableText('const v = #a.bb.ccc;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '#a.bb.ccc',
         operators: [UnlinkedExprOperation.makeSymbol], strings: ['a.bb.ccc']);
   }
 
   test_constExpr_makeTypedList() {
     UnlinkedVariable variable =
         serializeVariableText('const v = const <int>[11, 22, 33];');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.makeTypedList
-    ], ints: [
-      11,
-      22,
-      33,
-      3
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, 'dart:core', 'int',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'const <int>[11, 22, 33]',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.makeTypedList
+        ],
+        ints: [
+          11,
+          22,
+          33,
+          3
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'int',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_constExpr_makeTypedList_dynamic() {
     UnlinkedVariable variable =
         serializeVariableText('const v = const <dynamic>[11, 22, 33];');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.makeTypedList
-    ], ints: [
-      11,
-      22,
-      33,
-      3
-    ], referenceValidators: [
-      (EntityRef r) => checkDynamicTypeRef(r)
-    ]);
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'const <dynamic>[11, 22, 33]',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.makeTypedList
+        ],
+        ints: [
+          11,
+          22,
+          33,
+          3
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkDynamicTypeRef(r)
+        ]);
   }
 
   test_constExpr_makeTypedList_functionType() {
     UnlinkedVariable variable =
         serializeVariableText('final v = <void Function(int)>[];');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '<void Function(int)>[]',
         operators: [UnlinkedExprOperation.makeTypedList],
         ints: [
           0 // Size of the list
@@ -2744,6 +2837,7 @@
     UnlinkedVariable variable = serializeVariableText(
         'final v = <void Function<T>(Function<Q>(T, Q))>[];');
     assertUnlinkedConst(variable.initializer.bodyExpr,
+        '<void Function<T>(Function<Q>(T, Q))>[]',
         operators: [UnlinkedExprOperation.makeTypedList],
         ints: [
           0 // Size of the list
@@ -2785,114 +2879,261 @@
   test_constExpr_makeTypedMap() {
     UnlinkedVariable variable = serializeVariableText(
         'const v = const <int, String>{11: "aaa", 22: "bbb", 33: "ccc"};');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.makeTypedMap
-    ], ints: [
-      11,
-      22,
-      33,
-      3
-    ], strings: [
-      'aaa',
-      'bbb',
-      'ccc'
-    ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, 'dart:core', 'int',
-          expectedKind: ReferenceKind.classOrEnum),
-      (EntityRef r) => checkTypeRef(r, 'dart:core', 'String',
-          expectedKind: ReferenceKind.classOrEnum)
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr,
+        'const <int, String>{11: "aaa", 22: "bbb", 33: "ccc"}',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.makeTypedMap
+        ],
+        ints: [
+          11,
+          22,
+          33,
+          3
+        ],
+        strings: [
+          'aaa',
+          'bbb',
+          'ccc'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'int',
+              expectedKind: ReferenceKind.classOrEnum),
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'String',
+              expectedKind: ReferenceKind.classOrEnum)
+        ]);
   }
 
   test_constExpr_makeTypedMap_dynamic() {
     UnlinkedVariable variable = serializeVariableText(
         'const v = const <dynamic, dynamic>{11: "aaa", 22: "bbb", 33: "ccc"};');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.makeTypedMap
-    ], ints: [
-      11,
-      22,
-      33,
-      3
-    ], strings: [
-      'aaa',
-      'bbb',
-      'ccc'
-    ], referenceValidators: [
-      (EntityRef r) => checkDynamicTypeRef(r),
-      (EntityRef r) => checkDynamicTypeRef(r)
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr,
+        'const <dynamic, dynamic>{11: "aaa", 22: "bbb", 33: "ccc"}',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.makeTypedMap
+        ],
+        ints: [
+          11,
+          22,
+          33,
+          3
+        ],
+        strings: [
+          'aaa',
+          'bbb',
+          'ccc'
+        ],
+        referenceValidators: [
+          (EntityRef r) => checkDynamicTypeRef(r),
+          (EntityRef r) => checkDynamicTypeRef(r)
+        ]);
+  }
+
+  test_constExpr_makeTypedSet() {
+    experimentStatus = ExperimentStatus(set_literals: true);
+    UnlinkedVariable variable =
+        serializeVariableText('const v = const <int>{11, 22, 33};');
+    assertUnlinkedConst(
+      variable.initializer.bodyExpr,
+      'const <int>{11, 22, 33}',
+      operators: [
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.makeTypedSet
+      ],
+      ints: [11, 22, 33, 3],
+      referenceValidators: [
+        (EntityRef r) => checkTypeRef(r, 'dart:core', 'int',
+            expectedKind: ReferenceKind.classOrEnum)
+      ],
+    );
+  }
+
+  test_constExpr_makeTypedSet_dynamic() {
+    experimentStatus = ExperimentStatus(set_literals: true);
+    UnlinkedVariable variable =
+        serializeVariableText('const v = const <dynamic>{11, 22, 33};');
+    assertUnlinkedConst(
+      variable.initializer.bodyExpr,
+      'const <dynamic>{11, 22, 33}',
+      operators: [
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.makeTypedSet
+      ],
+      ints: [11, 22, 33, 3],
+      referenceValidators: [(EntityRef r) => checkDynamicTypeRef(r)],
+    );
+  }
+
+  test_constExpr_makeTypedSet_functionType() {
+    experimentStatus = ExperimentStatus(set_literals: true);
+    UnlinkedVariable variable =
+        serializeVariableText('final v = <void Function(int)>{};');
+    assertUnlinkedConst(variable.initializer.bodyExpr, '<void Function(int)>{}',
+        operators: [UnlinkedExprOperation.makeTypedSet],
+        ints: [
+          0 // Size of the list
+        ],
+        referenceValidators: [
+          (EntityRef reference) {
+            expect(reference, new TypeMatcher<EntityRef>());
+            expect(reference.entityKind, EntityRefKind.genericFunctionType);
+            expect(reference.syntheticParams, hasLength(1));
+            {
+              final param = reference.syntheticParams[0];
+              expect(param.name, ''); // no name for generic type parameters
+              checkTypeRef(param.type, 'dart:core', 'int',
+                  expectedKind: ReferenceKind.classOrEnum);
+            }
+            expect(reference.paramReference, 0);
+            expect(reference.typeParameters, hasLength(0));
+            // TODO(mfairhurst) check this references void
+            expect(reference.syntheticReturnType, isNotNull);
+          }
+        ],
+        forTypeInferenceOnly: true);
+  }
+
+  test_constExpr_makeTypedSet_functionType_withTypeParameters() {
+    experimentStatus = ExperimentStatus(set_literals: true);
+    UnlinkedVariable variable = serializeVariableText(
+        'final v = <void Function<T>(Function<Q>(T, Q))>{};');
+    assertUnlinkedConst(variable.initializer.bodyExpr,
+        '<void Function<T>(Function<Q>(T, Q))>{}',
+        operators: [UnlinkedExprOperation.makeTypedSet],
+        ints: [
+          0 // Size of the list
+        ],
+        referenceValidators: [
+          (EntityRef reference) {
+            expect(reference, new TypeMatcher<EntityRef>());
+            expect(reference.entityKind, EntityRefKind.genericFunctionType);
+            expect(reference.syntheticParams, hasLength(1));
+            {
+              final param = reference.syntheticParams[0];
+              expect(param.type, new TypeMatcher<EntityRef>());
+              expect(param.type.entityKind, EntityRefKind.genericFunctionType);
+              expect(param.type.syntheticParams, hasLength(2));
+              {
+                final subparam = param.type.syntheticParams[0];
+                expect(
+                    subparam.name, ''); // no name for generic type parameters
+                expect(subparam.type, new TypeMatcher<EntityRef>());
+                expect(subparam.type.paramReference, 2);
+              }
+              {
+                final subparam = param.type.syntheticParams[1];
+                expect(
+                    subparam.name, ''); // no name for generic type parameters
+                expect(subparam.type, new TypeMatcher<EntityRef>());
+                expect(subparam.type.paramReference, 1);
+              }
+            }
+            expect(reference.paramReference, 0);
+            expect(reference.typeParameters, hasLength(1));
+            // TODO(mfairhurst) check this references void
+            expect(reference.syntheticReturnType, isNotNull);
+          }
+        ],
+        forTypeInferenceOnly: true);
   }
 
   test_constExpr_makeUntypedList() {
     UnlinkedVariable variable =
         serializeVariableText('const v = const [11, 22, 33];');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.makeUntypedList
-    ], ints: [
-      11,
-      22,
-      33,
-      3
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'const [11, 22, 33]',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.makeUntypedList
+        ],
+        ints: [
+          11,
+          22,
+          33,
+          3
+        ]);
   }
 
   test_constExpr_makeUntypedMap() {
     UnlinkedVariable variable = serializeVariableText(
         'const v = const {11: "aaa", 22: "bbb", 33: "ccc"};');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.makeUntypedMap
-    ], ints: [
-      11,
-      22,
-      33,
-      3
-    ], strings: [
-      'aaa',
-      'bbb',
-      'ccc'
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr,
+        'const {11: "aaa", 22: "bbb", 33: "ccc"}',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.makeUntypedMap
+        ],
+        ints: [
+          11,
+          22,
+          33,
+          3
+        ],
+        strings: [
+          'aaa',
+          'bbb',
+          'ccc'
+        ]);
+  }
+
+  test_constExpr_makeUntypedSet() {
+    experimentStatus = ExperimentStatus(set_literals: true);
+    UnlinkedVariable variable =
+        serializeVariableText('const v = const {11, 22, 33};');
+    assertUnlinkedConst(
+      variable.initializer.bodyExpr,
+      'const {11, 22, 33}',
+      operators: [
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.pushInt,
+        UnlinkedExprOperation.makeUntypedSet
+      ],
+      ints: [11, 22, 33, 3],
+    );
   }
 
   test_constExpr_parenthesized() {
     UnlinkedVariable variable = serializeVariableText('const v = (1 + 2) * 3;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.add,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.multiply,
-    ], ints: [
-      1,
-      2,
-      3
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(1 + 2) * 3',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.add,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.multiply,
+        ],
+        ints: [
+          1,
+          2,
+          3
+        ]);
   }
 
   test_constExpr_prefix_complement() {
     UnlinkedVariable variable = serializeVariableText('const v = ~2;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '~2', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.complement
     ], ints: [
@@ -2902,7 +3143,7 @@
 
   test_constExpr_prefix_negate() {
     UnlinkedVariable variable = serializeVariableText('const v = -(2);');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '-(2)', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.negate
     ], ints: [
@@ -2912,40 +3153,42 @@
 
   test_constExpr_prefix_not() {
     UnlinkedVariable variable = serializeVariableText('const v = !true;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '!true',
         operators: [UnlinkedExprOperation.pushTrue, UnlinkedExprOperation.not]);
   }
 
   test_constExpr_pushDouble() {
     UnlinkedVariable variable = serializeVariableText('const v = 123.4567;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '123.4567',
         operators: [UnlinkedExprOperation.pushDouble], doubles: [123.4567]);
   }
 
   test_constExpr_pushFalse() {
     UnlinkedVariable variable = serializeVariableText('const v = false;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'false',
         operators: [UnlinkedExprOperation.pushFalse]);
   }
 
   test_constExpr_pushInt() {
     UnlinkedVariable variable = serializeVariableText('const v = 1;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '1',
         operators: [UnlinkedExprOperation.pushInt], ints: [1]);
   }
 
   test_constExpr_pushInt_max() {
     UnlinkedVariable variable = serializeVariableText('const v = 0xFFFFFFFF;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-    ], ints: [
-      0xFFFFFFFF
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, '0xFFFFFFFF',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+        ],
+        ints: [
+          0xFFFFFFFF
+        ]);
   }
 
   test_constExpr_pushInt_negative() {
     UnlinkedVariable variable = serializeVariableText('const v = -5;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, '-5', operators: [
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.negate
     ], ints: [
@@ -2956,43 +3199,47 @@
   test_constExpr_pushLongInt_maxNegative() {
     UnlinkedVariable variable =
         serializeVariableText('const v = 0xFFFFFFFFFFFFFFFF;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.negate
-    ], ints: [
-      1
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, '0xFFFFFFFFFFFFFFFF',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.negate
+        ],
+        ints: [
+          1
+        ]);
   }
 
   test_constExpr_pushLongInt_maxPositive() {
     UnlinkedVariable variable =
         serializeVariableText('const v = 0x7FFFFFFFFFFFFFFF;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '0x7FFFFFFFFFFFFFFF',
         operators: [UnlinkedExprOperation.pushLongInt],
         ints: [2, 0x7FFFFFFF, 0xFFFFFFFF]);
   }
 
   test_constExpr_pushLongInt_min2() {
     UnlinkedVariable variable = serializeVariableText('const v = 0x100000000;');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushLongInt
-    ], ints: [
-      2,
-      1,
-      0,
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, '0x100000000',
+        operators: [
+          UnlinkedExprOperation.pushLongInt
+        ],
+        ints: [
+          2,
+          1,
+          0,
+        ]);
   }
 
   test_constExpr_pushLongInt_tooLong() {
     UnlinkedVariable variable =
         serializeVariableText('const v = 0x10000000000000000;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '0x10000000000000000',
         operators: [UnlinkedExprOperation.pushInt], ints: [0]);
   }
 
   test_constExpr_pushNull() {
     UnlinkedVariable variable = serializeVariableText('const v = null;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'null',
         operators: [UnlinkedExprOperation.pushNull]);
   }
 
@@ -3001,7 +3248,7 @@
 class C {}
 const v = C;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) =>
@@ -3014,7 +3261,7 @@
 enum C {V1, V2, V3}
 const v = C;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) =>
@@ -3027,7 +3274,7 @@
 enum C {V1, V2, V3}
 const v = C.V1;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.V1', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'V1',
@@ -3046,7 +3293,7 @@
 import 'a.dart';
 const v = C.V1;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.V1', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'V1',
@@ -3063,7 +3310,7 @@
 enum C {V1, V2, V3}
 const v = C.values;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.values', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'values',
@@ -3082,7 +3329,7 @@
 import 'a.dart';
 const v = C.values;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.values', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'values',
@@ -3101,7 +3348,7 @@
 }
 const v = C.F;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.F', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'F',
@@ -3122,7 +3369,7 @@
 import 'a.dart';
 const v = C.F;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.F', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'F',
@@ -3144,7 +3391,7 @@
 import 'a.dart' as p;
 const v = p.C.F;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.C.F', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'F',
@@ -3164,7 +3411,7 @@
   static const b = null;
 }
 ''').fields[0];
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'b', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'b',
@@ -3182,7 +3429,7 @@
 }
 const v = C.x;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.x', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'x',
@@ -3203,7 +3450,7 @@
 import 'a.dart';
 const v = C.x;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.x', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'x',
@@ -3225,7 +3472,7 @@
 import 'a.dart' as p;
 const v = p.C.x;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.C.x', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'x',
@@ -3245,7 +3492,7 @@
 }
 const v = C.m;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.m', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'm',
@@ -3266,7 +3513,7 @@
 import 'a.dart';
 const v = C.m;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.m', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'm',
@@ -3288,7 +3535,7 @@
 import 'a.dart' as p;
 const v = p.C.m;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.C.m', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'm',
@@ -3308,7 +3555,7 @@
   static m() {}
 }
 ''').fields[0];
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'm', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'm',
@@ -3324,7 +3571,7 @@
 f() {}
 const v = f;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'f', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'f',
@@ -3340,7 +3587,7 @@
 import 'a.dart';
 const v = f;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'f', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'f',
@@ -3356,7 +3603,7 @@
 import 'a.dart' as p;
 const v = p.f;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.f', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'f',
@@ -3372,7 +3619,7 @@
 int get x => null;
 const v = x;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'x', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'x',
@@ -3386,7 +3633,7 @@
 import 'a.dart';
 const v = x;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'x', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'x',
@@ -3400,7 +3647,7 @@
 import 'a.dart' as p;
 const v = p.x;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.x', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'x',
@@ -3414,7 +3661,7 @@
 const int a = 1;
 const v = a;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'a', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'a',
@@ -3428,7 +3675,7 @@
 import 'a.dart';
 const v = a;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'a', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a',
@@ -3442,7 +3689,7 @@
 import 'a.dart' as p;
 const v = p.a;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.a', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) {
@@ -3461,7 +3708,7 @@
 ''';
     UnlinkedVariable variable =
         serializeClassText(text, allowErrors: true).fields[0];
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'T', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) {
@@ -3474,7 +3721,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 const v = foo;
 ''', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'foo', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) =>
@@ -3487,7 +3734,7 @@
 class C {}
 const v = C.foo;
 ''', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'C.foo', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'foo',
@@ -3506,7 +3753,7 @@
 import 'a.dart' as p;
 const v = p.C.foo;
 ''', allowErrors: true);
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.C.foo', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'foo',
@@ -3522,59 +3769,66 @@
   test_constExpr_pushString_adjacent() {
     UnlinkedVariable variable =
         serializeVariableText('const v = "aaa" "b" "ccc";');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '"aaa" "b" "ccc"',
         operators: [UnlinkedExprOperation.pushString], strings: ['aaabccc']);
   }
 
   test_constExpr_pushString_adjacent_interpolation() {
     UnlinkedVariable variable =
         serializeVariableText(r'const v = "aaa" "bb ${42} bbb" "cccc";');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.concatenate,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.concatenate,
-    ], ints: [
-      42,
-      3,
-      3,
-    ], strings: [
-      'aaa',
-      'bb ',
-      ' bbb',
-      'cccc'
-    ]);
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, r'"aaa" "bb ${42} bbb" "cccc"',
+        operators: [
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.concatenate,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.concatenate,
+        ],
+        ints: [
+          42,
+          3,
+          3,
+        ],
+        strings: [
+          'aaa',
+          'bb ',
+          ' bbb',
+          'cccc'
+        ]);
   }
 
   test_constExpr_pushString_interpolation() {
     UnlinkedVariable variable =
         serializeVariableText(r'const v = "aaa ${42} bbb";');
-    assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.pushInt,
-      UnlinkedExprOperation.pushString,
-      UnlinkedExprOperation.concatenate
-    ], ints: [
-      42,
-      3
-    ], strings: [
-      'aaa ',
-      ' bbb'
-    ]);
+    assertUnlinkedConst(variable.initializer.bodyExpr, r'"aaa ${42} bbb"',
+        operators: [
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushString,
+          UnlinkedExprOperation.concatenate
+        ],
+        ints: [
+          42,
+          3
+        ],
+        strings: [
+          'aaa ',
+          ' bbb'
+        ]);
   }
 
   test_constExpr_pushString_simple() {
     UnlinkedVariable variable = serializeVariableText('const v = "abc";');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '"abc"',
         operators: [UnlinkedExprOperation.pushString], strings: ['abc']);
   }
 
   test_constExpr_pushTrue() {
     UnlinkedVariable variable = serializeVariableText('const v = true;');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'true',
         operators: [UnlinkedExprOperation.pushTrue]);
   }
 
@@ -3668,7 +3922,7 @@
     expect(initializer.name, '');
     expect(initializer.expression, isNull);
     expect(initializer.arguments, hasLength(1));
-    assertUnlinkedConst(initializer.arguments[0], operators: [
+    assertUnlinkedConst(initializer.arguments[0], 'x >= 42', operators: [
       UnlinkedExprOperation.pushParameter,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.greaterEqual
@@ -3694,7 +3948,7 @@
     expect(initializer.name, '');
     expect(initializer.expression, isNull);
     expect(initializer.arguments, hasLength(2));
-    assertUnlinkedConst(initializer.arguments[0], operators: [
+    assertUnlinkedConst(initializer.arguments[0], 'x >= 42', operators: [
       UnlinkedExprOperation.pushParameter,
       UnlinkedExprOperation.pushInt,
       UnlinkedExprOperation.greaterEqual
@@ -3703,7 +3957,7 @@
     ], strings: [
       'x',
     ]);
-    assertUnlinkedConst(initializer.arguments[1], operators: [
+    assertUnlinkedConst(initializer.arguments[1], "'foo'", operators: [
       UnlinkedExprOperation.pushString,
     ], strings: [
       'foo'
@@ -3723,7 +3977,7 @@
         executable.constantInitializers[0];
     expect(initializer.kind, UnlinkedConstructorInitializerKind.field);
     expect(initializer.name, 'x');
-    assertUnlinkedConst(initializer.expression,
+    assertUnlinkedConst(initializer.expression, '42',
         operators: [UnlinkedExprOperation.pushInt], ints: [42]);
     expect(initializer.arguments, isEmpty);
   }
@@ -3741,7 +3995,7 @@
         executable.constantInitializers[0];
     expect(initializer.kind, UnlinkedConstructorInitializerKind.field);
     expect(initializer.name, 'x');
-    assertUnlinkedConst(initializer.expression,
+    assertUnlinkedConst(initializer.expression, 'p',
         operators: [UnlinkedExprOperation.pushParameter], strings: ['p']);
     expect(initializer.arguments, isEmpty);
   }
@@ -3775,7 +4029,7 @@
     expect(initializer.name, 'aaa');
     expect(initializer.expression, isNull);
     expect(initializer.arguments, hasLength(1));
-    assertUnlinkedConst(initializer.arguments[0],
+    assertUnlinkedConst(initializer.arguments[0], '42',
         operators: [UnlinkedExprOperation.pushInt], ints: [42]);
   }
 
@@ -3797,11 +4051,11 @@
     expect(initializer.name, '');
     expect(initializer.expression, isNull);
     expect(initializer.arguments, hasLength(3));
-    assertUnlinkedConst(initializer.arguments[0],
+    assertUnlinkedConst(initializer.arguments[0], '1',
         operators: [UnlinkedExprOperation.pushInt], ints: [1]);
-    assertUnlinkedConst(initializer.arguments[1],
+    assertUnlinkedConst(initializer.arguments[1], '2',
         operators: [UnlinkedExprOperation.pushInt], ints: [2]);
-    assertUnlinkedConst(initializer.arguments[2],
+    assertUnlinkedConst(initializer.arguments[2], '3',
         operators: [UnlinkedExprOperation.pushInt], ints: [3]);
     expect(initializer.argumentNames, ['b', 'c']);
   }
@@ -3824,7 +4078,7 @@
     expect(initializer.name, '');
     expect(initializer.expression, isNull);
     expect(initializer.arguments, hasLength(1));
-    assertUnlinkedConst(initializer.arguments[0],
+    assertUnlinkedConst(initializer.arguments[0], '42',
         operators: [UnlinkedExprOperation.pushInt], ints: [42]);
   }
 
@@ -3843,9 +4097,9 @@
     expect(initializer.name, 'named');
     expect(initializer.expression, isNull);
     expect(initializer.arguments, hasLength(2));
-    assertUnlinkedConst(initializer.arguments[0],
+    assertUnlinkedConst(initializer.arguments[0], '1',
         operators: [UnlinkedExprOperation.pushInt], ints: [1]);
-    assertUnlinkedConst(initializer.arguments[1],
+    assertUnlinkedConst(initializer.arguments[1], "'bbb'",
         operators: [UnlinkedExprOperation.pushString], strings: ['bbb']);
   }
 
@@ -3864,11 +4118,11 @@
     expect(initializer.name, 'named');
     expect(initializer.expression, isNull);
     expect(initializer.arguments, hasLength(3));
-    assertUnlinkedConst(initializer.arguments[0],
+    assertUnlinkedConst(initializer.arguments[0], '1',
         operators: [UnlinkedExprOperation.pushInt], ints: [1]);
-    assertUnlinkedConst(initializer.arguments[1],
+    assertUnlinkedConst(initializer.arguments[1], '2',
         operators: [UnlinkedExprOperation.pushInt], ints: [2]);
-    assertUnlinkedConst(initializer.arguments[2],
+    assertUnlinkedConst(initializer.arguments[2], '3',
         operators: [UnlinkedExprOperation.pushInt], ints: [3]);
     expect(initializer.argumentNames, ['b', 'c']);
   }
@@ -3888,9 +4142,9 @@
     expect(initializer.name, '');
     expect(initializer.expression, isNull);
     expect(initializer.arguments, hasLength(2));
-    assertUnlinkedConst(initializer.arguments[0],
+    assertUnlinkedConst(initializer.arguments[0], '1',
         operators: [UnlinkedExprOperation.pushInt], ints: [1]);
-    assertUnlinkedConst(initializer.arguments[1],
+    assertUnlinkedConst(initializer.arguments[1], "'bbb'",
         operators: [UnlinkedExprOperation.pushString], strings: ['bbb']);
   }
 
@@ -3975,7 +4229,7 @@
     expect(param.isFunctionTyped, isTrue);
     expect(param.kind, UnlinkedParamKind.positional);
     expect(param.defaultValueCode, 'foo');
-    assertUnlinkedConst(param.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(param.initializer.bodyExpr, 'foo', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'foo',
@@ -4020,7 +4274,7 @@
     expect(parameter.initializer, isNotNull);
     expect(parameter.defaultValueCode, '42');
     _assertCodeRange(parameter.codeRange, 13, 10);
-    assertUnlinkedConst(parameter.initializer.bodyExpr,
+    assertUnlinkedConst(parameter.initializer.bodyExpr, '42',
         operators: [UnlinkedExprOperation.pushInt], ints: [42]);
   }
 
@@ -4052,7 +4306,7 @@
     expect(parameter.initializer, isNotNull);
     expect(parameter.defaultValueCode, '42');
     _assertCodeRange(parameter.codeRange, 13, 11);
-    assertUnlinkedConst(parameter.initializer.bodyExpr,
+    assertUnlinkedConst(parameter.initializer.bodyExpr, '42',
         operators: [UnlinkedExprOperation.pushInt], ints: [42]);
   }
 
@@ -4084,7 +4338,7 @@
     UnlinkedParam param = executable.parameters[0];
     expect(param.kind, UnlinkedParamKind.positional);
     expect(param.defaultValueCode, '42');
-    assertUnlinkedConst(param.initializer.bodyExpr,
+    assertUnlinkedConst(param.initializer.bodyExpr, '42',
         operators: [UnlinkedExprOperation.pushInt], ints: [42]);
   }
 
@@ -5625,7 +5879,7 @@
     expect(param.kind, UnlinkedParamKind.positional);
     expect(param.initializer, isNotNull);
     expect(param.defaultValueCode, 'foo');
-    assertUnlinkedConst(param.initializer.bodyExpr, operators: [
+    assertUnlinkedConst(param.initializer.bodyExpr, 'foo', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'foo',
@@ -5658,7 +5912,7 @@
     expect(param.initializer, isNotNull);
     expect(param.defaultValueCode, '42');
     _assertCodeRange(param.codeRange, 3, 5);
-    assertUnlinkedConst(param.initializer.bodyExpr,
+    assertUnlinkedConst(param.initializer.bodyExpr, '42',
         operators: [UnlinkedExprOperation.pushInt], ints: [42]);
   }
 
@@ -5677,7 +5931,7 @@
     expect(param.initializer, isNotNull);
     expect(param.defaultValueCode, '42');
     _assertCodeRange(param.codeRange, 3, 6);
-    assertUnlinkedConst(param.initializer.bodyExpr,
+    assertUnlinkedConst(param.initializer.bodyExpr, '42',
         operators: [UnlinkedExprOperation.pushInt], ints: [42]);
   }
 
@@ -6261,7 +6515,7 @@
 A a = new A();
 final v = (a.b.c.f[1] = 5);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(a.b.c.f[1] = 5)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6299,7 +6553,7 @@
 A a = new A();
 final v = (a.b[1].c[2].f[3] = 5);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(a.b[1].c[2].f[3] = 5)',
         isValidConst: false,
         operators: [
           // 5
@@ -6341,7 +6595,7 @@
 List<int> a = <int>[0, 1, 2];
 final v = (a[1] = 5);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(a[1] = 5)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6369,7 +6623,7 @@
 }
 final v = (new C().f = 5);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(new C().f = 5)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6397,7 +6651,7 @@
 }
 final v = (C.f = 1);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(C.f = 1)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6432,7 +6686,7 @@
 A a = new A();
 final v = (a.b.c.f = 1);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(a.b.c.f = 1)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6481,7 +6735,7 @@
 int a = 0;
 final v = (a = 1);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(a = 1)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6507,7 +6761,7 @@
 import 'a.dart';
 final v = (a = 1);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(a = 1)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6533,7 +6787,7 @@
 import 'a.dart' as p;
 final v = (p.a = 1);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '(p.a = 1)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6562,7 +6816,7 @@
 final C c = new C();
 final v = c.items..[1] = 2;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'c.items..[1] = 2',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushReference,
@@ -6589,7 +6843,8 @@
 }
 final v = new C()..f1 = 1..f2 += 2;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'new C()..f1 = 1..f2 += 2',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.invokeConstructor,
@@ -6620,6 +6875,7 @@
   ..fa2 = 3;
 ''');
     assertUnlinkedConst(variable.initializer.bodyExpr,
+        'new A()..fa1 = 1..b = (new B()..fb = 2)..fa2 = 3',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.invokeConstructor,
@@ -6645,7 +6901,7 @@
 final A a = new A();
 final v = a..m(5).abs()..m(6);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'a..m(5).abs()..m(6)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushReference,
@@ -6666,7 +6922,7 @@
 }
 final v = new C().items[5];
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'new C().items[5]',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.invokeConstructor,
@@ -6690,7 +6946,7 @@
 }
 final v = new C().f;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'new C().f',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.invokeConstructor,
@@ -6710,7 +6966,7 @@
 final v = foo(5, () => 42);
 foo(a, b) {}
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'foo(5, () => 42)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6730,7 +6986,8 @@
 final v = foo(5, () => 42, () => 43);
 foo(a, b, c) {}
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'foo(5, () => 42, () => 43)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -6750,7 +7007,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = () { return 42; };
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '() { return 42; }',
         isValidConst: false,
         operators: [UnlinkedExprOperation.pushLocalFunctionReference],
         ints: [0, 0],
@@ -6761,7 +7018,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = () => 42;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '() => 42',
         isValidConst: false,
         operators: [UnlinkedExprOperation.pushLocalFunctionReference],
         ints: [0, 0],
@@ -6772,7 +7029,8 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = ((a, b) {return 42;})(1, 2);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, '((a, b) {return 42;})(1, 2)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushLocalFunctionReference,
@@ -6789,7 +7047,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = ((a, b) => 42)(1, 2);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '((a, b) => 42)(1, 2)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushLocalFunctionReference,
@@ -6804,7 +7062,7 @@
 
   test_expr_inClosure() {
     UnlinkedVariable variable = serializeVariableText('var v = () => 1;');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr, '1',
         operators: [UnlinkedExprOperation.pushInt],
         ints: [1],
         forTypeInferenceOnly: true);
@@ -6821,7 +7079,7 @@
     UnlinkedVariable variable =
         serializeVariableText('var v = (x) => (y) => x;');
     assertUnlinkedConst(
-        variable.initializer.localFunctions[0].localFunctions[0].bodyExpr,
+        variable.initializer.localFunctions[0].localFunctions[0].bodyExpr, 'x',
         operators: [UnlinkedExprOperation.pushParameter],
         strings: ['x'],
         forTypeInferenceOnly: true);
@@ -6829,7 +7087,7 @@
 
   test_expr_inClosure_refersToParam() {
     UnlinkedVariable variable = serializeVariableText('var v = (x) => x;');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr, 'x',
         operators: [UnlinkedExprOperation.pushParameter],
         strings: ['x'],
         forTypeInferenceOnly: true);
@@ -6837,7 +7095,8 @@
 
   test_expr_inClosure_refersToParam_methodCall() {
     UnlinkedVariable variable = serializeVariableText('var v = (x) => x.f();');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.localFunctions[0].bodyExpr, 'x.f()',
         operators: [
           UnlinkedExprOperation.pushParameter,
           UnlinkedExprOperation.invokeMethod
@@ -6850,7 +7109,8 @@
   test_expr_inClosure_refersToParam_methodCall_prefixed() {
     UnlinkedVariable variable =
         serializeVariableText('var v = (x) => x.y.f();');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.localFunctions[0].bodyExpr, 'x.y.f()',
         operators: [
           UnlinkedExprOperation.pushParameter,
           UnlinkedExprOperation.extractProperty,
@@ -6864,7 +7124,8 @@
   test_expr_inClosure_refersToParam_outOfScope() {
     UnlinkedVariable variable =
         serializeVariableText('var x; var v = (b) => (b ? (x) => x : x);');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.localFunctions[0].bodyExpr, '(b ? (x) => x : x)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushParameter,
@@ -6883,7 +7144,7 @@
 
   test_expr_inClosure_refersToParam_prefixedIdentifier() {
     UnlinkedVariable variable = serializeVariableText('var v = (x) => x.y;');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr, 'x.y',
         operators: [
           UnlinkedExprOperation.pushParameter,
           UnlinkedExprOperation.extractProperty
@@ -6895,7 +7156,8 @@
   test_expr_inClosure_refersToParam_prefixedIdentifier_assign() {
     UnlinkedVariable variable =
         serializeVariableText('var v = (x) => x.y = null;');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.localFunctions[0].bodyExpr, 'x.y = null',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushNull,
@@ -6909,7 +7171,8 @@
 
   test_expr_inClosure_refersToParam_prefixedPrefixedIdentifier() {
     UnlinkedVariable variable = serializeVariableText('var v = (x) => x.y.z;');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.localFunctions[0].bodyExpr, 'x.y.z',
         operators: [
           UnlinkedExprOperation.pushParameter,
           UnlinkedExprOperation.extractProperty,
@@ -6922,7 +7185,8 @@
   test_expr_inClosure_refersToParam_prefixedPrefixedIdentifier_assign() {
     UnlinkedVariable variable =
         serializeVariableText('var v = (x) => x.y.z = null;');
-    assertUnlinkedConst(variable.initializer.localFunctions[0].bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.localFunctions[0].bodyExpr, 'x.y.z = null',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushNull,
@@ -6942,7 +7206,7 @@
 }
 ''').fields[0];
     if (containsNonConstExprs) {
-      assertUnlinkedConst(variable.initializer.bodyExpr,
+      assertUnlinkedConst(variable.initializer.bodyExpr, 'T.k',
           isValidConst: false, operators: []);
     } else {
       expect(variable.initializer.bodyExpr, isNull);
@@ -6956,7 +7220,8 @@
 }
 final v = new C().m(1, b: 2, c: 3);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'new C().m(1, b: 2, c: 3)',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.invokeConstructor,
@@ -6981,7 +7246,8 @@
 }
 final v = new C().f<int, String>();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, 'new C().f<int, String>()',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.invokeConstructor,
@@ -7011,7 +7277,7 @@
 A a = new A();
 final v = a.b.c.m(10, 20);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'a.b.c.m(10, 20)',
         operators: [
           UnlinkedExprOperation.pushInt,
           UnlinkedExprOperation.pushInt,
@@ -7042,7 +7308,7 @@
 import 'a.dart' as p;
 final v = p.C.m();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'p.C.m()',
         operators: [
           UnlinkedExprOperation.invokeMethodRef,
         ],
@@ -7066,7 +7332,7 @@
 final u = null;
 final v = f(u);
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'f(u)',
         operators: [
           UnlinkedExprOperation.pushReference,
           UnlinkedExprOperation.invokeMethodRef
@@ -7086,7 +7352,7 @@
 f<T, U>() => null;
 final v = f<int, String>();
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'f<int, String>()',
         operators: [UnlinkedExprOperation.invokeMethodRef],
         ints: [0, 0, 2],
         referenceValidators: [
@@ -7102,7 +7368,7 @@
   test_expr_makeTypedList() {
     UnlinkedVariable variable =
         serializeVariableText('var v = <int>[11, 22, 33];');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '<int>[11, 22, 33]',
         operators: [UnlinkedExprOperation.makeTypedList],
         ints: [0],
         referenceValidators: [
@@ -7116,6 +7382,7 @@
     UnlinkedVariable variable = serializeVariableText(
         'var v = <int, String>{11: "aaa", 22: "bbb", 33: "ccc"};');
     assertUnlinkedConst(variable.initializer.bodyExpr,
+        '<int, String>{11: "aaa", 22: "bbb", 33: "ccc"}',
         operators: [UnlinkedExprOperation.makeTypedMap],
         ints: [0],
         referenceValidators: [
@@ -7127,9 +7394,23 @@
         forTypeInferenceOnly: true);
   }
 
+  test_expr_makeTypedSet() {
+    experimentStatus = ExperimentStatus(set_literals: true);
+    UnlinkedVariable variable =
+        serializeVariableText('var v = <int>{11, 22, 33};');
+    assertUnlinkedConst(variable.initializer.bodyExpr, '<int>{11, 22, 33}',
+        operators: [UnlinkedExprOperation.makeTypedSet],
+        ints: [0],
+        referenceValidators: [
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'int',
+              expectedKind: ReferenceKind.classOrEnum)
+        ],
+        forTypeInferenceOnly: true);
+  }
+
   test_expr_makeUntypedList() {
     UnlinkedVariable variable = serializeVariableText('var v = [11, 22, 33];');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '[11, 22, 33]',
         operators: [
           UnlinkedExprOperation.pushInt,
           UnlinkedExprOperation.pushInt,
@@ -7143,7 +7424,8 @@
   test_expr_makeUntypedMap() {
     UnlinkedVariable variable =
         serializeVariableText('var v = {11: "aaa", 22: "bbb", 33: "ccc"};');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(
+        variable.initializer.bodyExpr, '{11: "aaa", 22: "bbb", 33: "ccc"}',
         operators: [
           UnlinkedExprOperation.pushInt,
           UnlinkedExprOperation.pushString,
@@ -7158,11 +7440,25 @@
         forTypeInferenceOnly: true);
   }
 
+  test_expr_makeUntypedSet() {
+    experimentStatus = ExperimentStatus(set_literals: true);
+    UnlinkedVariable variable = serializeVariableText('var v = {11, 22, 33};');
+    assertUnlinkedConst(variable.initializer.bodyExpr, '{11, 22, 33}',
+        operators: [
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.pushInt,
+          UnlinkedExprOperation.makeUntypedSet
+        ],
+        ints: [11, 22, 33, 3],
+        forTypeInferenceOnly: true);
+  }
+
   test_expr_super() {
     UnlinkedVariable variable = serializeVariableText('''
 final v = super;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'super',
         operators: [
           UnlinkedExprOperation.pushSuper,
         ],
@@ -7173,7 +7469,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = this;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'this',
         operators: [
           UnlinkedExprOperation.pushThis,
         ],
@@ -7184,7 +7480,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = throw 1 + 2;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, 'throw 1 + 2',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -7200,7 +7496,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = 42 as num;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '42 as num',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -7218,7 +7514,7 @@
     UnlinkedVariable variable = serializeVariableText('''
 final v = 42 is num;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '42 is num',
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -7253,7 +7549,7 @@
         serializeClassText('class C { static const int i = 0; }').fields[0];
     expect(variable.isConst, isTrue);
     expect(variable.inheritsCovariantSlot, 0);
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, '0',
         operators: [UnlinkedExprOperation.pushInt], ints: [0]);
   }
 
@@ -7278,7 +7574,7 @@
 }''').fields[0];
     expect(variable.isFinal, isTrue);
     if (containsNonConstExprs) {
-      assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
+      assertUnlinkedConst(variable.initializer.bodyExpr, '1 + m()', operators: [
         UnlinkedExprOperation.pushInt,
         UnlinkedExprOperation.invokeMethodRef,
         UnlinkedExprOperation.add,
@@ -7306,7 +7602,7 @@
 }''').fields[0];
     expect(variable.isFinal, isTrue);
     if (containsNonConstExprs) {
-      assertUnlinkedConst(variable.initializer.bodyExpr,
+      assertUnlinkedConst(variable.initializer.bodyExpr, '<T>[]',
           operators: [UnlinkedExprOperation.makeTypedList],
           ints: [0],
           referenceValidators: [(EntityRef r) => checkParamTypeRef(r, 1)]);
@@ -8415,7 +8711,7 @@
     UnlinkedClass cls = serializeClassText(
         'class A { const A.named(); } @A.named() class C {}');
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'A.named()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8434,7 +8730,7 @@
     UnlinkedClass cls = serializeClassText(
         'import "foo.dart" as foo; @foo.A.named() class C {}');
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'foo.A.named()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8459,7 +8755,7 @@
         'import "foo.dart" as foo; @foo.A.named() class C {}',
         allowErrors: true);
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'foo.A.named()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8480,7 +8776,7 @@
         'import "foo.dart" as foo; @foo.A.named() class C {}',
         allowErrors: true);
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'foo.A.named()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8503,7 +8799,7 @@
     UnlinkedClass cls =
         serializeClassText('@A.named() class C {}', allowErrors: true);
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'A.named()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8521,7 +8817,7 @@
     UnlinkedClass cls = serializeClassText('class A {} @A.named() class C {}',
         allowErrors: true);
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'A.named()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8539,7 +8835,7 @@
     UnlinkedClass cls =
         serializeClassText('class A { const A(); } @A() class C {}');
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'A()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8555,7 +8851,7 @@
     UnlinkedClass cls =
         serializeClassText('import "foo.dart" as foo; @foo.A() class C {}');
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'foo.A()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8572,7 +8868,7 @@
         'import "foo.dart" as foo; @foo.A() class C {}',
         allowErrors: true);
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'foo.A()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8587,7 +8883,7 @@
     UnlinkedClass cls =
         serializeClassText('@A() class C {}', allowErrors: true);
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'A()', operators: [
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
       0,
@@ -8602,7 +8898,7 @@
     UnlinkedClass cls =
         serializeClassText('class A { const A(x); } @A(null) class C {}');
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'A(null)', operators: [
       UnlinkedExprOperation.pushNull,
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
@@ -8734,7 +9030,7 @@
 class C {}
 ''').annotations;
     expect(annotations, hasLength(1));
-    assertUnlinkedConst(annotations[0], operators: [
+    assertUnlinkedConst(annotations[0], 'A(super)', operators: [
       UnlinkedExprOperation.pushSuper,
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
@@ -8756,7 +9052,7 @@
 class C {}
 ''').annotations;
     expect(annotations, hasLength(1));
-    assertUnlinkedConst(annotations[0], operators: [
+    assertUnlinkedConst(annotations[0], 'A(this)', operators: [
       UnlinkedExprOperation.pushThis,
       UnlinkedExprOperation.invokeConstructor,
     ], ints: [
@@ -8803,13 +9099,13 @@
         serializeClassText('const a = null, b = null; @a @b class C {}');
     List<UnlinkedExpr> annotations = cls.annotations;
     expect(annotations, hasLength(2));
-    assertUnlinkedConst(annotations[0], operators: [
+    assertUnlinkedConst(annotations[0], 'a', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'a',
           expectedKind: ReferenceKind.topLevelPropertyAccessor)
     ]);
-    assertUnlinkedConst(annotations[1], operators: [
+    assertUnlinkedConst(annotations[1], 'b', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'b',
@@ -8828,7 +9124,7 @@
     UnlinkedClass cls =
         serializeClassText('import "a.dart" as a; @a.b class C {}');
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'a.b', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'b',
@@ -8843,7 +9139,7 @@
         'import "a.dart" as a; @a.b class C {}',
         allowErrors: true);
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'a.b', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) => checkTypeRef(r, null, 'b',
@@ -8898,7 +9194,7 @@
   test_metadata_variable_unresolved() {
     UnlinkedClass cls = serializeClassText('@a class C {}', allowErrors: true);
     expect(cls.annotations, hasLength(1));
-    assertUnlinkedConst(cls.annotations[0], operators: [
+    assertUnlinkedConst(cls.annotations[0], 'a', operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) =>
@@ -9640,6 +9936,16 @@
     checkDynamicTypeRef(serializeTypeText('dynamic'));
   }
 
+  test_type_inference_based_on_type_parameter() {
+    var class_ = serializeClassText('''
+class C<T> {
+  var field = T;
+}
+''');
+    var field = class_.fields[0];
+    checkLinkedTypeSlot(field.inferredTypeSlot, 'dart:core', 'Type');
+  }
+
   test_type_invalid_typeParameter_asPrefix() {
     UnlinkedClass c = serializeClassText('''
 class C<T> {
@@ -10387,7 +10693,7 @@
 int a = 0;
 final v = $expr;
     ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, expr,
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.pushInt,
@@ -10437,7 +10743,7 @@
 int a = 0;
 final v = $expr;
 ''');
-    assertUnlinkedConst(variable.initializer.bodyExpr,
+    assertUnlinkedConst(variable.initializer.bodyExpr, expr,
         isValidConst: false,
         operators: [
           UnlinkedExprOperation.assignToRef,
@@ -10453,6 +10759,30 @@
         ],
         forTypeInferenceOnly: true);
   }
+
+  String _normalizeTokenString(String tokenString) {
+    // Note: to normalize the token string it's not sufficient to tokenize it
+    // and then pass the tokens to `tokensToString`; we also need to parse it
+    // because parsing modifies the token stream (splitting up `[]`, `>>`, and
+    // `>>>` tokens when circumstances warrant).
+    //
+    // We wrap the expression in "f() async => ...;" to ensure that the await
+    // keyword is properly parsed.
+    var sourceText = 'f() async => $tokenString;';
+    var errorListener = AnalysisErrorListener.NULL_LISTENER;
+    var reader = new CharSequenceReader(sourceText);
+    var stringSource = new StringSource(sourceText, null);
+    var scanner = new Scanner(stringSource, reader, errorListener);
+    var startToken = scanner.tokenize();
+    var parser = new Parser(stringSource, errorListener)
+      ..enableSetLiterals = experimentStatus.set_literals
+      ..enableNonNullable = experimentStatus.non_nullable;
+    var compilationUnit = parser.parseCompilationUnit(startToken);
+    var f = compilationUnit.declarations[0] as FunctionDeclaration;
+    var body = f.functionExpression.body as ExpressionFunctionBody;
+    var expression = body.expression;
+    return tokensToString(expression.beginToken, expression.endToken);
+  }
 }
 
 /**
diff --git a/pkg/analyzer/test/src/summary/test_strategies.dart b/pkg/analyzer/test/src/summary/test_strategies.dart
index 03c020d..fe525e0 100644
--- a/pkg/analyzer/test/src/summary/test_strategies.dart
+++ b/pkg/analyzer/test/src/summary/test_strategies.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/context/context.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -21,12 +22,11 @@
 import 'package:analyzer/src/summary/prelink.dart';
 import 'package:analyzer/src/summary/summarize_ast.dart';
 import 'package:analyzer/src/summary/summarize_elements.dart';
-import 'package:analyzer/src/task/api/dart.dart';
 import 'package:analyzer/src/task/api/general.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:path/path.dart' show posix;
 import 'package:test/test.dart';
 
-import '../context/mock_sdk.dart';
 import 'resynthesize_common.dart';
 
 /// Convert the given Posix style file [path] to the corresponding absolute URI.
@@ -35,13 +35,19 @@
   return posix.toUri(absolutePath).toString();
 }
 
-CompilationUnit _parseText(String text) {
+CompilationUnit _parseText(
+  String text, {
+  ExperimentStatus experimentStatus,
+}) {
+  experimentStatus ??= ExperimentStatus();
   CharSequenceReader reader = new CharSequenceReader(text);
   Scanner scanner =
       new Scanner(null, reader, AnalysisErrorListener.NULL_LISTENER);
   Token token = scanner.tokenize();
-  Parser parser = new Parser(
-      NonExistingSource.unknown, AnalysisErrorListener.NULL_LISTENER);
+  Parser parser =
+      new Parser(NonExistingSource.unknown, AnalysisErrorListener.NULL_LISTENER)
+        ..enableSetLiterals = experimentStatus.set_literals
+        ..enableNonNullable = experimentStatus.non_nullable;
   CompilationUnit unit = parser.parseCompilationUnit(token);
   unit.lineInfo = new LineInfo(scanner.lineStarts);
   return unit;
@@ -88,8 +94,8 @@
 /// The tests themselves can then be provided via mixin, allowing summaries to
 /// be tested in a variety of ways.
 abstract class ResynthesizeTestStrategy {
-  //Future<LibraryElementImpl> checkLibrary(String text,
-  //    {bool allowErrors: false, bool dumpSummaries: false});
+  /// The set of [ExperimentStatus] enabled in this test.
+  ExperimentStatus experimentStatus;
 
   void set allowMissingFiles(bool value);
 
@@ -121,6 +127,9 @@
 /// generation using the old two-phase API.
 class ResynthesizeTestStrategyTwoPhase extends AbstractResynthesizeTest
     implements ResynthesizeTestStrategy {
+  @override
+  ExperimentStatus experimentStatus = ExperimentStatus();
+
   final Set<Source> serializedSources = new Set<Source>();
 
   final Map<String, UnlinkedUnitBuilder> uriToUnit =
@@ -203,7 +212,10 @@
         }
         return null;
       }
-      CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
+
+      String contents = context.getContents(source).data;
+      CompilationUnit unit = _parseText(contents);
+
       UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
       bundleAssembler.addUnlinkedUnit(source, unlinkedUnit);
       return unlinkedUnit;
@@ -257,7 +269,9 @@
     try {
       Map<String, UnlinkedUnit> uriToUnlinkedUnit = <String, UnlinkedUnit>{};
       Map<String, LinkedLibrary> uriToLinkedLibrary = <String, LinkedLibrary>{};
-      PackageBundle bundle = new MockSdk().getLinkedBundle();
+      var resourceProvider = new MemoryResourceProvider();
+      PackageBundle bundle =
+          new MockSdk(resourceProvider: resourceProvider).getLinkedBundle();
       for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) {
         String uri = bundle.unlinkedUnitUris[i];
         uriToUnlinkedUnit[uri] = bundle.unlinkedUnits[i];
@@ -280,6 +294,9 @@
 /// The tests themselves can then be provided via mixin, allowing summaries to
 /// be tested in a variety of ways.
 abstract class SummaryBaseTestStrategy {
+  /// The set of [ExperimentStatus] enabled in this test.
+  ExperimentStatus experimentStatus;
+
   /// Add the given package bundle as a dependency so that it may be referenced
   /// by the files under test.
   void addBundle(String path, PackageBundle bundle);
@@ -497,6 +514,9 @@
   _FilesToLink<UnlinkedUnitBuilder> _filesToLink =
       new _FilesToLink<UnlinkedUnitBuilder>();
 
+  @override
+  ExperimentStatus experimentStatus = ExperimentStatus();
+
   _LinkerInputs _linkerInputs;
 
   bool get _allowMissingFiles;
@@ -532,7 +552,8 @@
   }
 
   UnlinkedUnitBuilder createUnlinkedSummary(Uri uri, String text) =>
-      serializeAstUnlinked(_parseText(text));
+      serializeAstUnlinked(
+          _parseText(text, experimentStatus: experimentStatus));
 
   _LinkerInputs _createLinkerInputs(String text,
       {String path: '/test.dart', String uri}) {
@@ -558,7 +579,7 @@
 /// generation using the old two-phase API.
 ///
 /// Not intended to be used directly; instead use a derived class that either
-/// exercises the full summary algorithmm or just pre-linking.
+/// exercises the full summary algorithm or just pre-linking.
 abstract class _SummaryBlackBoxTestStrategyTwoPhase
     extends _SummaryBaseTestStrategyTwoPhase
     implements SummaryBlackBoxTestStrategy {
diff --git a/pkg/analyzer/test/src/summary/top_level_inference_test.dart b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
index bf6a1bc..9151786 100644
--- a/pkg/analyzer/test/src/summary/top_level_inference_test.dart
+++ b/pkg/analyzer/test/src/summary/top_level_inference_test.dart
@@ -1,11 +1,11 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/analysis/base.dart';
@@ -354,7 +354,7 @@
     await checkFile(content);
   }
 
-  Future<Null> _assertErrorOnlyLeft(List<String> operators) async {
+  Future<void> _assertErrorOnlyLeft(List<String> operators) async {
     String code = 'var a = 1;\n';
     for (var i = 0; i < operators.length; i++) {
       String operator = operators[i];
@@ -366,10 +366,6 @@
 
 @reflectiveTest
 class TopLevelInferenceTest extends BaseAnalysisDriverTest {
-  void addFile(String path, String code) {
-    provider.newFile(_p(path), code);
-  }
-
   test_initializer_additive() async {
     var library = await _encodeDecodeLibrary(r'''
 var vPlusIntInt = 1 + 2;
@@ -682,11 +678,11 @@
   }
 
   test_initializer_extractProperty_inOtherLibraryCycle() async {
-    addFile('/a.dart', r'''
+    newFile('/a.dart', content: r'''
 import 'b.dart';
 var x = new C().f;
 ''');
-    addFile('/b.dart', r'''
+    newFile('/b.dart', content: r'''
 class C {
   var f = 0;
 }
@@ -2532,8 +2528,7 @@
   }
 
   test_method_OK_single_private_linkThroughOtherLibraryOfCycle() async {
-    String path = _p('/other.dart');
-    provider.newFile(path, r'''
+    newFile('/other.dart', content: r'''
 import 'test.dart';
 class B extends A2 {}
 ''');
@@ -2628,11 +2623,9 @@
   }
 
   Future<LibraryElement> _encodeDecodeLibrary(String text) async {
-    String path = _p('/test.dart');
-    provider.newFile(path, text);
+    String path = convertPath('/test.dart');
+    newFile(path, content: text);
     UnitElementResult result = await driver.getUnitElement(path);
     return result.element.library;
   }
-
-  String _p(String path) => provider.convertPath(path);
 }
diff --git a/pkg/analyzer/test/src/task/dart_test.dart b/pkg/analyzer/test/src/task/dart_test.dart
index a2a0da0..22b79c4 100644
--- a/pkg/analyzer/test/src/task/dart_test.dart
+++ b/pkg/analyzer/test/src/task/dart_test.dart
@@ -3158,9 +3158,7 @@
 
   void _performParseTask(String content) {
     if (content == null) {
-      source = resourceProvider
-          .getFile(resourceProvider.convertPath('/test.dart'))
-          .createSource();
+      source = getFile('/test.dart').createSource();
     } else {
       source = newSource('/test.dart', content);
     }
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index befc23b..cd1e370 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -1,14 +1,17 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:mirrors';
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
+import 'package:analyzer/src/analysis_options/error/option_codes.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -66,8 +69,8 @@
         new TestSource(), 0, 1, HintCode.UNUSED_LOCAL_VARIABLE, [
       ['x']
     ]);
-    var invalid_assignment =
-        new AnalysisError(new TestSource(), 0, 1, HintCode.INVALID_ASSIGNMENT, [
+    var invalid_assignment = new AnalysisError(
+        new TestSource(), 0, 1, StaticTypeWarningCode.INVALID_ASSIGNMENT, [
       ['x'],
       ['y']
     ]);
@@ -193,6 +196,7 @@
         removeCode(StrongModeCode.INVALID_CAST_LITERAL);
         removeCode(StrongModeCode.INVALID_CAST_LITERAL_LIST);
         removeCode(StrongModeCode.INVALID_CAST_LITERAL_MAP);
+        removeCode(StrongModeCode.INVALID_CAST_LITERAL_SET);
         removeCode(StrongModeCode.INVALID_CAST_FUNCTION_EXPR);
         removeCode(StrongModeCode.INVALID_CAST_NEW_EXPR);
         removeCode(StrongModeCode.INVALID_CAST_METHOD);
@@ -486,6 +490,22 @@
       new OptionsFileValidator(new TestSource());
   final AnalysisOptionsProvider optionsProvider = new AnalysisOptionsProvider();
 
+  test_analyzer_enableExperiment_badValue() {
+    validate('''
+analyzer:
+  enable-experiment:
+    - not-an-experiment
+    ''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITHOUT_VALUES]);
+  }
+
+  test_analyzer_enableExperiment_notAList() {
+    validate('''
+analyzer:
+  enable-experiment:
+    experiment: true
+    ''', [AnalysisOptionsWarningCode.INVALID_SECTION_FORMAT]);
+  }
+
   test_analyzer_error_code_supported() {
     validate('''
 analyzer:
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 5e74843..981b10e 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -523,20 +523,18 @@
   }
 
   test_covariantOverride() async {
-    _addMetaLibrary();
     await checkFile(r'''
-import 'meta.dart';
 class C {
   num f(num x) => x;
 }
 class D extends C {
-  int f(@checked int x) => x;
+  int f(covariant int x) => x;
 }
 class E extends D {
   int f(Object x) => /*info:DOWN_CAST_IMPLICIT*/x;
 }
 class F extends E {
-  int f(@checked int x) => x;
+  int f(covariant int x) => x;
 }
 class G extends E implements D {}
 
@@ -544,32 +542,30 @@
   /*error:INVALID_OVERRIDE*/int f(int x) => x;
 }
 class E_error extends D {
-  /*error:INVALID_OVERRIDE*/int f(@checked double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(covariant double x) => 0;
 }
 class F_error extends E {
-  /*error:INVALID_OVERRIDE*/int f(@checked double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(covariant double x) => 0;
 }
 class G_error extends E implements D {
-  /*error:INVALID_OVERRIDE*/int f(@checked double x) => 0;
+  /*error:INVALID_OVERRIDE*/int f(covariant double x) => 0;
 }
     ''');
   }
 
   @failingTest
   test_covariantOverride_fields() async {
-    _addMetaLibrary();
     await checkFile(r'''
-import 'meta.dart';
 class A {
   get foo => '';
   set foo(_) {}
 }
 
 class B extends A {
-  @checked num foo;
+  covariant num foo;
 }
 class C extends A {
-  @checked @virtual num foo;
+  covariant @virtual num foo;
 }
 class D extends C {
   @virtual int foo;
@@ -581,9 +577,7 @@
   }
 
   test_covariantOverride_leastUpperBound() async {
-    _addMetaLibrary();
     await checkFile(r'''
-import "meta.dart";
 abstract class Top {}
 abstract class Left implements Top {}
 abstract class Right implements Top {}
@@ -600,17 +594,15 @@
 }
 abstract class TakesBottom implements TakesLeft, TakesRight {
   // LUB(Left, Right) == Top, so this is an implicit cast from Top to Bottom.
-  m(@checked Bottom x);
+  m(covariant Bottom x);
 }
     ''');
   }
 
   test_covariantOverride_markerIsInherited() async {
-    _addMetaLibrary();
     await checkFile(r'''
-import 'meta.dart';
 class C {
-  num f(@checked num x) => x;
+  num f(covariant num x) => x;
 }
 class D extends C {
   int f(int x) => x;
@@ -2134,73 +2126,49 @@
     addFile(
         'num n; int i; void main() { i = /*info:DOWN_CAST_IMPLICIT*/n;}//yy');
     await check();
+
     addFile(
         'num n; int i; void main() { i = /*error:INVALID_ASSIGNMENT*/n;}//ny');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile(
-        'num n; int i; void main() { i = /*info:DOWN_CAST_IMPLICIT*/n;}//yn');
-    await check(implicitCasts: true, declarationCasts: false);
-    addFile(
-        'num n; int i; void main() { i = /*error:INVALID_ASSIGNMENT*/n;}//nn');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_compoundAssignment() async {
     addFile('''f(num n, int i) {
                /*info:DOWN_CAST_IMPLICIT_ASSIGN*/i += n;}//yy''');
     await check();
+
     addFile('''f(num n, int i) {
                i += /*error:INVALID_ASSIGNMENT*/n;}//ny''');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile('''f(num n, int i) {
-               /*info:DOWN_CAST_IMPLICIT_ASSIGN*/i += n;}//yn''');
-    await check(implicitCasts: true, declarationCasts: false);
-    addFile('''f(num n, int i) {
-               i += /*error:INVALID_ASSIGNMENT*/n;}//nn''');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_constructorInitializer() async {
     addFile(
         'class A { int i; A(num n) : i = /*info:DOWN_CAST_IMPLICIT*/n;}//yy');
     await check();
+
     addFile(
         'class A { int i; A(num n) : i = /*error:FIELD_INITIALIZER_NOT_ASSIGNABLE*/n;}//ny');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile(
-        'class A { int i; A(num n) : i = /*info:DOWN_CAST_IMPLICIT*/n;}//yn');
-    await check(implicitCasts: true, declarationCasts: false);
-    addFile(
-        'class A { int i; A(num n) : i = /*error:FIELD_INITIALIZER_NOT_ASSIGNABLE*/n;}//nn');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_defaultValue() async {
     addFile('''const num n = 0;
                f({int i = /*info:DOWN_CAST_IMPLICIT*/n}) => i;//yy''');
     await check();
+
     addFile('''const num n = 0;
                f({int i = /*error:INVALID_ASSIGNMENT*/n}) => i;//ny''');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile('''const num n = 0;
-               f({int i = /*info:DOWN_CAST_IMPLICIT*/n}) => i;//yn''');
-    await check(implicitCasts: true, declarationCasts: false);
-    addFile('''const num n = 0;
-               f({int i = /*error:INVALID_ASSIGNMENT*/n}) => i;//nn''');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_fieldInitializer() async {
     addFile('class A { static num n; int i = /*info:ASSIGNMENT_CAST*/n;}//yy');
     await check();
-    addFile('class A { static num n; int i = /*info:ASSIGNMENT_CAST*/n;}//ny');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile(
-        'class A { static num n; int i = /*error:INVALID_ASSIGNMENT*/n;}//yn');
-    await check(implicitCasts: true, declarationCasts: false);
+
     addFile(
         'class A { static num n; int i = /*error:INVALID_ASSIGNMENT*/n;}//nn');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_functionCall() async {
@@ -2208,18 +2176,11 @@
                f(int i) => i;
                var i = f(/*info:DOWN_CAST_IMPLICIT*/n);//yy''');
     await check();
-    addFile('''num n;
-               f(int i) => i;
-               var i = f(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/n);//ny''');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile('''num n;
-               f(int i) => i;
-               var i = f(/*info:DOWN_CAST_IMPLICIT*/n);//yn''');
-    await check(implicitCasts: true, declarationCasts: false);
+
     addFile('''num n;
              f(int i) => i;
              var i = f(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/n);//nn''');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_genericMethods() async {
@@ -2232,12 +2193,9 @@
   test_implicitCasts_initializer() async {
     addFile('num n; int i = /*info:ASSIGNMENT_CAST*/n;//yy');
     await check();
-    addFile('num n; int i = /*info:ASSIGNMENT_CAST*/n;//ny');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile('num n; int i = /*error:INVALID_ASSIGNMENT*/n;//yn');
-    await check(implicitCasts: true, declarationCasts: false);
+
     addFile('num n; int i = /*error:INVALID_ASSIGNMENT*/n;//nn');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_numericOps() async {
@@ -2257,29 +2215,19 @@
              int i;
              var r = i & /*info:DOWN_CAST_IMPLICIT*/n;//yy''');
     await check();
-    addFile('''num n;
-             int i;
-             var r = i & /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/n;//ny''');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile('''num n;
-             int i;
-             var r = i & /*info:DOWN_CAST_IMPLICIT*/n;//yn''');
-    await check(implicitCasts: true, declarationCasts: false);
+
     addFile('''num n;
              int i;
              var r = i & /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/n;//nn''');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_return() async {
     addFile('int f(num n) => /*info:DOWN_CAST_IMPLICIT*/n;//yy');
     await check();
-    addFile('int f(num n) => /*error:RETURN_OF_INVALID_TYPE*/n;//ny');
-    await check(implicitCasts: false, declarationCasts: true);
-    addFile('int f(num n) => /*info:DOWN_CAST_IMPLICIT*/n;//yn');
-    await check(implicitCasts: true, declarationCasts: false);
+
     addFile('int f(num n) => /*error:RETURN_OF_INVALID_TYPE*/n;//nn');
-    await check(implicitCasts: false, declarationCasts: false);
+    await check(implicitCasts: false);
   }
 
   test_implicitCasts_return_async() async {
@@ -3445,11 +3393,9 @@
 
   test_overrideNarrowsType_legalWithChecked() async {
     // Regression test for https://github.com/dart-lang/sdk/issues/25232
-    _addMetaLibrary();
     await checkFile(r'''
-import 'meta.dart';
 abstract class A { void test(A arg) { } }
-abstract class B extends A { void test(@checked B arg) { } }
+abstract class B extends A { void test(covariant B arg) { } }
 abstract class X implements A { }
 class C extends B with X { }
 class D extends B implements A { }
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index ccef7a7..51c6016 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -17,10 +18,76 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(InferredTypeTest);
     defineReflectiveTests(InferredTypeTest_Driver);
+    defineReflectiveTests(InferredTypeTest_SetLiterals);
   });
 }
 
-abstract class InferredTypeMixin {
+@reflectiveTest
+class InferredTypeTest extends AbstractStrongTest with InferredTypeMixin {
+  @override
+  bool get mayCheckTypesOfLocals => true;
+
+  @override
+  Future<CompilationUnitElement> checkFileElement(String content) async {
+    CompilationUnit unit = await checkFile(content);
+    return unit.declaredElement;
+  }
+
+  @override
+  @failingTest
+  test_circularReference_viaClosures() {
+    return super.test_circularReference_viaClosures();
+  }
+
+  @override
+  @failingTest
+  test_circularReference_viaClosures_initializerTypes() {
+    return super.test_circularReference_viaClosures_initializerTypes();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_typeName_error1() {
+    // Test doesn't work with the old task model
+    return super.test_instantiateToBounds_typeName_error1();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_typeName_error2() {
+    // Test doesn't work with the old task model
+    return super.test_instantiateToBounds_typeName_error2();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_typeName_error3() {
+    // Test doesn't work with the old task model
+    return super.test_instantiateToBounds_typeName_error3();
+  }
+
+  @override
+  @failingTest
+  test_instantiateToBounds_typeName_OK_hasBound_definedAfter() {
+    return super.test_instantiateToBounds_typeName_OK_hasBound_definedAfter();
+  }
+
+  @override
+  @failingTest
+  test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr1() {
+    return super
+        .test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr1();
+  }
+
+  @failingTest
+  @override
+  test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr1() {
+    return super
+        .test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr1();
+  }
+}
+
+mixin InferredTypeMixin {
   /// Extra top-level errors if needed due to being analyze multiple times.
   bool get hasExtraTaskModelPass => true;
 
@@ -39,9 +106,7 @@
    * unit.
    */
   Future<CompilationUnit> checkFile(String content,
-      {bool declarationCasts: true,
-      bool implicitCasts: true,
-      bool implicitDynamic: true});
+      {bool implicitCasts: true, bool implicitDynamic: true});
 
   /**
    * Add the file, process it (resolve, validate, etc) and return the resolved
@@ -2231,8 +2296,8 @@
   test_infer_assignToProperty_custom() async {
     await checkFileElement(r'''
 class A {
-  int operator +(other) => 1;
-  double operator -(other) => 2.0;
+  A operator +(other) => this;
+  A operator -(other) => this;
 }
 class B {
   A a;
@@ -4393,71 +4458,6 @@
 }
 
 @reflectiveTest
-class InferredTypeTest extends AbstractStrongTest with InferredTypeMixin {
-  @override
-  bool get mayCheckTypesOfLocals => true;
-
-  @override
-  Future<CompilationUnitElement> checkFileElement(String content) async {
-    CompilationUnit unit = await checkFile(content);
-    return unit.declaredElement;
-  }
-
-  @override
-  @failingTest
-  test_circularReference_viaClosures() {
-    return super.test_circularReference_viaClosures();
-  }
-
-  @override
-  @failingTest
-  test_circularReference_viaClosures_initializerTypes() {
-    return super.test_circularReference_viaClosures_initializerTypes();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_typeName_error1() {
-    // Test doesn't work with the old task model
-    return super.test_instantiateToBounds_typeName_error1();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_typeName_error2() {
-    // Test doesn't work with the old task model
-    return super.test_instantiateToBounds_typeName_error2();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_typeName_error3() {
-    // Test doesn't work with the old task model
-    return super.test_instantiateToBounds_typeName_error3();
-  }
-
-  @override
-  @failingTest
-  test_instantiateToBounds_typeName_OK_hasBound_definedAfter() {
-    return super.test_instantiateToBounds_typeName_OK_hasBound_definedAfter();
-  }
-
-  @override
-  @failingTest
-  test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr1() {
-    return super
-        .test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr1();
-  }
-
-  @failingTest
-  @override
-  test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr1() {
-    return super
-        .test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr1();
-  }
-}
-
-@reflectiveTest
 class InferredTypeTest_Driver extends AbstractStrongTest
     with InferredTypeMixin {
   @override
@@ -4484,9 +4484,65 @@
 
   @failingTest
   @override
-  test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr2() async {
-    await super
-        .test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr2();
+  test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr1() {
+    return super
+        .test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr1();
+  }
+}
+
+@reflectiveTest
+class InferredTypeTest_SetLiterals extends AbstractStrongTest
+    with InferredTypeMixin {
+  @override
+  List<String> get enabledExperiments => [EnableString.set_literals];
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+
+  @override
+  bool get hasExtraTaskModelPass => false;
+
+  @override
+  bool get mayCheckTypesOfLocals => true;
+
+  @override
+  Future<CompilationUnitElement> checkFileElement(String content) async {
+    CompilationUnit unit = await checkFile(content);
+    return unit.declaredElement;
+  }
+
+  @override
+  test_downwardsInferenceYieldYieldStar() async {
+    // The fifth to last case is inferred differently with set_literals enabled,
+    // and no longer an error compared to the base implementation.
+    await checkFileElement('''
+import 'dart:async';
+
+abstract class MyStream<T> extends Stream<T> {
+  factory MyStream() => null;
+}
+
+Stream<List<int>> foo() async* {
+  yield /*info:INFERRED_TYPE_LITERAL*/[];
+  yield /*error:YIELD_OF_INVALID_TYPE*/new MyStream();
+  yield* /*error:YIELD_OF_INVALID_TYPE*/[];
+  yield* /*info:INFERRED_TYPE_ALLOCATION*/new MyStream();
+}
+
+Iterable<Map<int, int>> bar() sync* {
+  yield /*info:INFERRED_TYPE_LITERAL*/{};
+  yield /*error:YIELD_OF_INVALID_TYPE*/new List();
+  yield* {};
+  yield* /*info:INFERRED_TYPE_ALLOCATION*/new List();
+}
+''');
+  }
+
+  @failingTest
+  @override
+  test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr1() {
+    return super
+        .test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr1();
   }
 
   @failingTest
@@ -4495,11 +4551,4 @@
     return super
         .test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr1();
   }
-
-  @failingTest
-  @override
-  test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr2() async {
-    await super
-        .test_unsafeBlockClosureInference_functionCall_explicitTypeParam_viaExpr2();
-  }
 }
diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
index d9e4081..521f759 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -25,11 +25,11 @@
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:source_span/source_span.dart';
 import 'package:test/test.dart';
 
-import '../../context/mock_sdk.dart';
-
 SourceSpanWithContext _createSpanHelper(
     LineInfo lineInfo, int start, Source source, String content,
     {int end}) {
@@ -237,8 +237,7 @@
   fail('Checker errors do not match expected errors:\n\n$message');
 }
 
-class AbstractStrongTest {
-  MemoryResourceProvider _resourceProvider = new MemoryResourceProvider();
+class AbstractStrongTest with ResourceProviderMixin {
   bool _checkCalled = false;
 
   AnalysisContext _context = null;
@@ -246,6 +245,8 @@
 
   bool get enableNewAnalysisDriver => false;
 
+  List<String> get enabledExperiments => [];
+
   /// Adds a file to check. The file should contain:
   ///
   ///   * all expected failures are listed in the source code using comments
@@ -266,7 +267,7 @@
   /// For a single file, you may also use [checkFile].
   void addFile(String content, {String name: '/main.dart'}) {
     name = name.replaceFirst('^package:', '/packages/');
-    _resourceProvider.newFile(_resourceProvider.convertPath(name), content);
+    newFile(name, content: content);
   }
 
   /// Run the checker on a program, staring from '/main.dart', and verifies that
@@ -277,27 +278,24 @@
   ///
   /// Returns the main resolved library. This can be used for further checks.
   Future<CompilationUnit> check(
-      {bool declarationCasts: true,
-      bool implicitCasts: true,
-      bool implicitDynamic: true}) async {
+      {bool implicitCasts: true, bool implicitDynamic: true}) async {
     _checkCalled = true;
 
-    File mainFile =
-        _resourceProvider.getFile(_resourceProvider.convertPath('/main.dart'));
+    File mainFile = getFile('/main.dart');
     expect(mainFile.exists, true, reason: '`/main.dart` is missing');
 
     AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
     analysisOptions.strongModeHints = true;
-    analysisOptions.declarationCasts = declarationCasts;
     analysisOptions.implicitCasts = implicitCasts;
     analysisOptions.implicitDynamic = implicitDynamic;
+    analysisOptions.enabledExperiments = enabledExperiments;
 
-    var mockSdk = new MockSdk(resourceProvider: _resourceProvider);
+    var mockSdk = new MockSdk(resourceProvider: resourceProvider);
     mockSdk.context.analysisOptions = analysisOptions;
 
     SourceFactory sourceFactory;
     {
-      var uriResolver = new _TestUriResolver(_resourceProvider);
+      var uriResolver = new _TestUriResolver(resourceProvider);
       sourceFactory =
           new SourceFactory([new DartUriResolver(mockSdk), uriResolver]);
     }
@@ -311,7 +309,7 @@
       _driver = new AnalysisDriver(
           scheduler,
           log,
-          _resourceProvider,
+          resourceProvider,
           new MemoryByteStore(),
           fileContentOverlay,
           null,
@@ -367,14 +365,12 @@
   ///
   /// Also returns the resolved compilation unit.
   Future<CompilationUnit> checkFile(String content,
-      {bool declarationCasts: true,
-      bool implicitCasts: true,
-      bool implicitDynamic: true}) async {
+      {bool implicitCasts: true, bool implicitDynamic: true}) async {
     addFile(content);
     return await check(
-        declarationCasts: declarationCasts,
-        implicitCasts: implicitCasts,
-        implicitDynamic: implicitDynamic);
+      implicitCasts: implicitCasts,
+      implicitDynamic: implicitDynamic,
+    );
   }
 
   void setUp() {
diff --git a/pkg/analyzer/test/src/task/yaml_test.dart b/pkg/analyzer/test/src/task/yaml_test.dart
index d952887..4342087 100644
--- a/pkg/analyzer/test/src/task/yaml_test.dart
+++ b/pkg/analyzer/test/src/task/yaml_test.dart
@@ -58,9 +58,9 @@
   }
 
   void _performParseTask(String content) {
-    var path = resourceProvider.convertPath('/test.yaml');
+    var path = '/test.yaml';
     if (content == null) {
-      source = resourceProvider.getFile(path).createSource();
+      source = getFile(path).createSource();
     } else {
       source = newSource(path, content);
     }
diff --git a/pkg/analyzer/test/src/test_all.dart b/pkg/analyzer/test/src/test_all.dart
index 369c7b9..011e198 100644
--- a/pkg/analyzer/test/src/test_all.dart
+++ b/pkg/analyzer/test/src/test_all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,8 +7,10 @@
 import 'command_line/test_all.dart' as command_line;
 import 'context/test_all.dart' as context;
 import 'dart/test_all.dart' as dart;
+import 'diagnostics/test_all.dart' as diagnostics;
 import 'fasta/test_all.dart' as fasta;
 import 'lint/test_all.dart' as lint;
+import 'options/test_all.dart' as options;
 import 'pubspec/test_all.dart' as pubspec;
 import 'source/test_all.dart' as source;
 import 'summary/test_all.dart' as summary;
@@ -21,8 +23,10 @@
     command_line.main();
     context.main();
     dart.main();
+    diagnostics.main();
     fasta.main();
     lint.main();
+    options.main();
     pubspec.main();
     source.main();
     summary.main();
diff --git a/pkg/analyzer/test/src/workspace/basic_test.dart b/pkg/analyzer/test/src/workspace/basic_test.dart
new file mode 100644
index 0000000..6df62db
--- /dev/null
+++ b/pkg/analyzer/test/src/workspace/basic_test.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/workspace/basic.dart';
+import 'package:package_config/packages.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+class MockContextBuilder implements ContextBuilder {
+  Map<String, Packages> packagesMapMap = <String, Packages>{};
+  Map<Packages, Map<String, List<Folder>>> packagesToMapMap =
+      <Packages, Map<String, List<Folder>>>{};
+
+  Map<String, List<Folder>> convertPackagesToMap(Packages packages) =>
+      packagesToMapMap[packages];
+
+  Packages createPackageMap(String rootDirectoryPath) =>
+      packagesMapMap[rootDirectoryPath];
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class MockPackages implements Packages {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(BasicWorkspaceTest);
+    defineReflectiveTests(BasicWorkspacePackageTest);
+  });
+}
+
+@reflectiveTest
+class BasicWorkspaceTest with ResourceProviderMixin {
+  setUp() {
+    newFolder('/workspace');
+  }
+
+  void test_find_fail_notAbsolute() {
+    expect(
+        () => BasicWorkspace.find(resourceProvider, convertPath('not_absolute'),
+            new MockContextBuilder()),
+        throwsA(TypeMatcher<ArgumentError>()));
+  }
+
+  void test_find_directory() {
+    BasicWorkspace workspace = BasicWorkspace.find(
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
+  }
+
+  void test_find_file() {
+    BasicWorkspace workspace = BasicWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/project/lib/lib1.dart'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace/project/lib'));
+  }
+}
+
+@reflectiveTest
+class BasicWorkspacePackageTest with ResourceProviderMixin {
+  BasicWorkspace workspace;
+
+  setUp() {
+    final contextBuilder = new MockContextBuilder();
+    final packages = new MockPackages();
+    final packageMap = <String, List<Folder>>{'project': []};
+    contextBuilder.packagesMapMap[convertPath('/workspace')] = packages;
+    contextBuilder.packagesToMapMap[packages] = packageMap;
+
+    newFolder('/workspace');
+    workspace = BasicWorkspace.find(
+        resourceProvider, convertPath('/workspace'), contextBuilder);
+  }
+
+  void test_findPackageFor_unrelatedFile() {
+    newFile('/workspace/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace2/project/lib/file.dart'));
+    expect(package, isNull);
+  }
+
+  void test_findPackageFor_includedFile() {
+    newFile('/workspace/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/file.dart'));
+    expect(package, isNotNull);
+    expect(package.root, convertPath('/workspace'));
+    expect(package.workspace, equals(workspace));
+  }
+
+  void test_contains_differentWorkspace() {
+    newFile('/workspace2/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
+    expect(package.contains('/workspace2/project/lib/file.dart'), isFalse);
+  }
+
+  void test_contains_sameWorkspace() {
+    newFile('/workspace/project/lib/file2.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
+    expect(package.contains('/workspace/project/lib/file2.dart'), isTrue);
+    expect(package.contains('/workspace/project/bin/bin.dart'), isTrue);
+    expect(package.contains('/workspace/project/test/test.dart'), isTrue);
+  }
+}
diff --git a/pkg/analyzer/test/src/workspace/bazel_test.dart b/pkg/analyzer/test/src/workspace/bazel_test.dart
new file mode 100644
index 0000000..799eff6
--- /dev/null
+++ b/pkg/analyzer/test/src/workspace/bazel_test.dart
@@ -0,0 +1,759 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/workspace/bazel.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(BazelFileUriResolverTest);
+    defineReflectiveTests(BazelPackageUriResolverTest);
+    defineReflectiveTests(BazelWorkspaceTest);
+    defineReflectiveTests(BazelWorkspacePackageTest);
+  });
+}
+
+@reflectiveTest
+class BazelFileUriResolverTest with ResourceProviderMixin {
+  BazelWorkspace workspace;
+  BazelFileUriResolver resolver;
+
+  void setUp() {
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
+    resolver = new BazelFileUriResolver(workspace);
+    newFile('/workspace/test.dart');
+    newFile('/workspace/bazel-bin/gen1.dart');
+    newFile('/workspace/bazel-genfiles/gen2.dart');
+  }
+
+  void test_resolveAbsolute_doesNotExist() {
+    Source source = _resolvePath('/workspace/foo.dart');
+    expect(source, isNotNull);
+    expect(source.exists(), isFalse);
+    expect(source.fullName, convertPath('/workspace/foo.dart'));
+  }
+
+  void test_resolveAbsolute_file() {
+    Source source = _resolvePath('/workspace/test.dart');
+    expect(source, isNotNull);
+    expect(source.exists(), isTrue);
+    expect(source.fullName, convertPath('/workspace/test.dart'));
+  }
+
+  void test_resolveAbsolute_folder() {
+    Source source = _resolvePath('/workspace');
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_generated_file_exists_one() {
+    Source source = _resolvePath('/workspace/gen1.dart');
+    expect(source, isNotNull);
+    expect(source.exists(), isTrue);
+    expect(source.fullName, convertPath('/workspace/bazel-bin/gen1.dart'));
+  }
+
+  void test_resolveAbsolute_generated_file_exists_two() {
+    Source source = _resolvePath('/workspace/gen2.dart');
+    expect(source, isNotNull);
+    expect(source.exists(), isTrue);
+    expect(source.fullName, convertPath('/workspace/bazel-genfiles/gen2.dart'));
+  }
+
+  void test_resolveAbsolute_notFile_dartUri() {
+    Uri uri = new Uri(scheme: 'dart', path: 'core');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_notFile_httpsUri() {
+    Uri uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNull);
+  }
+
+  void test_restoreAbsolute() {
+    Uri uri =
+        resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNotNull);
+    expect(resolver.restoreAbsolute(source), uri);
+    expect(
+        resolver.restoreAbsolute(
+            new NonExistingSource(source.fullName, null, null)),
+        uri);
+  }
+
+  Source _resolvePath(String absolutePosixPath) {
+    String absolutePath = convertPath(absolutePosixPath);
+    Uri uri = resourceProvider.pathContext.toUri(absolutePath);
+    return resolver.resolveAbsolute(uri);
+  }
+}
+
+@reflectiveTest
+class BazelPackageUriResolverTest with ResourceProviderMixin {
+  BazelWorkspace workspace;
+  BazelPackageUriResolver resolver;
+
+  void test_resolveAbsolute_bin() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/my/foo/lib/foo1.dart',
+      '/workspace/bazel-bin/my/foo/lib/foo1.dart'
+    ]);
+    _assertResolve(
+        'package:my.foo/foo1.dart', '/workspace/bazel-bin/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_bin_notInWorkspace() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/bazel-bin/my/foo/lib/foo1.dart'
+    ]);
+    _assertResolve(
+        'package:my.foo/foo1.dart', '/workspace/bazel-bin/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_genfiles() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/my/foo/lib/foo1.dart',
+      '/workspace/bazel-genfiles/my/foo/lib/foo1.dart'
+    ]);
+    _assertResolve('package:my.foo/foo1.dart',
+        '/workspace/bazel-genfiles/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_genfiles_notInWorkspace() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/bazel-genfiles/my/foo/lib/foo1.dart'
+    ]);
+    _assertResolve('package:my.foo/foo1.dart',
+        '/workspace/bazel-genfiles/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_null_noSlash() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+    ]);
+    Source source = resolver.resolveAbsolute(Uri.parse('package:foo'));
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_null_notPackage() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+    ]);
+    Source source = resolver.resolveAbsolute(Uri.parse('dart:async'));
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_null_startsWithSlash() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/my/foo/lib/bar.dart',
+    ]);
+    Source source =
+        resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_readonly_bin() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/READONLY/prime/my/foo/lib/foo1.dart',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+      '/Users/user/test/prime/bazel-bin/my/foo/lib/foo1.dart',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:my.foo/foo1.dart',
+        '/Users/user/test/prime/bazel-bin/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_readonly_bin_notInWorkspace() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+      '/Users/user/test/prime/bazel-bin/my/foo/lib/foo1.dart',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:my.foo/foo1.dart',
+        '/Users/user/test/prime/bazel-bin/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_readonly_genfiles() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/READONLY/prime/my/foo/lib/foo1.dart',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+      '/Users/user/test/prime/bazel-genfiles/my/foo/lib/foo1.dart',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:my.foo/foo1.dart',
+        '/Users/user/test/prime/bazel-genfiles/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_readonly_genfiles_notInWorkspace() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+      '/Users/user/test/prime/bazel-genfiles/my/foo/lib/foo1.dart',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:my.foo/foo1.dart',
+        '/Users/user/test/prime/bazel-genfiles/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_readonly_thirdParty_bin() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+      '/Users/user/test/prime/bazel-bin/third_party/dart/foo/lib/foo1.dart',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:foo/foo1.dart',
+        '/Users/user/test/prime/bazel-bin/third_party/dart/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_readonly_thirdParty_genfiles() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+      '/Users/user/test/prime/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:foo/foo1.dart',
+        '/Users/user/test/prime/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_readonly_thirdParty_workspace_doesNotExist() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:foo/foo2.dart',
+        '/Users/user/test/prime/third_party/dart/foo/lib/foo2.dart',
+        exists: false);
+  }
+
+  void test_resolveAbsolute_readonly_thirdParty_workspace_exists() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:foo/foo1.dart',
+        '/Users/user/test/READONLY/prime/third_party/dart/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_readonly_workspace_doesNotExist() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:my.foo/foo1.dart',
+        '/Users/user/test/prime/my/foo/lib/foo1.dart',
+        exists: false);
+  }
+
+  void test_resolveAbsolute_readonly_workspace_exists() {
+    _addResources([
+      '/Users/user/test/READONLY/prime/',
+      '/Users/user/test/READONLY/prime/my/foo/lib/foo1.dart',
+      '/Users/user/test/prime/bazel-genfiles/',
+      '/Users/user/test/prime/my/module/',
+    ], workspacePath: '/Users/user/test/prime/my/module');
+    _assertResolve('package:my.foo/foo1.dart',
+        '/Users/user/test/READONLY/prime/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_thirdParty_bin() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/third_party/dart/foo/lib/foo1.dart',
+      '/workspace/bazel-bin/third_party/dart/foo/lib/foo1.dart',
+    ]);
+    _assertResolve('package:foo/foo1.dart',
+        '/workspace/bazel-bin/third_party/dart/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_thirdParty_bin_notInWorkspace() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/bazel-bin/third_party/dart/foo/lib/foo1.dart',
+    ]);
+    _assertResolve('package:foo/foo1.dart',
+        '/workspace/bazel-bin/third_party/dart/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_thirdParty_doesNotExist() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/third_party/dart/foo/lib/foo1.dart',
+    ]);
+    _assertResolve('package:foo/foo2.dart',
+        '/workspace/third_party/dart/foo/lib/foo2.dart',
+        exists: false);
+  }
+
+  void test_resolveAbsolute_thirdParty_exists() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/third_party/dart/foo/lib/foo1.dart',
+    ]);
+    _assertResolve('package:foo/foo1.dart',
+        '/workspace/third_party/dart/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_thirdParty_genfiles() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/third_party/dart/foo/lib/foo1.dart',
+      '/workspace/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
+    ]);
+    _assertResolve('package:foo/foo1.dart',
+        '/workspace/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_thirdParty_genfiles_notInWorkspace() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
+    ]);
+    _assertResolve('package:foo/foo1.dart',
+        '/workspace/bazel-genfiles/third_party/dart/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_workspace_doesNotExist() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+    ]);
+    _assertResolve('package:my.foo/doesNotExist.dart',
+        '/workspace/my/foo/lib/doesNotExist.dart',
+        exists: false);
+  }
+
+  void test_resolveAbsolute_workspace_exists() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/my/foo/lib/foo1.dart',
+    ]);
+    _assertResolve(
+        'package:my.foo/foo1.dart', '/workspace/my/foo/lib/foo1.dart',
+        exists: true);
+  }
+
+  void test_restoreAbsolute_noPackageName_workspace() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/lib/foo1.dart',
+      '/workspace/foo/lib/foo2.dart',
+    ]);
+    _assertRestore('/workspace/lib/foo1.dart', null);
+    _assertRestore('/workspace/foo/lib/foo2.dart', null);
+  }
+
+  void test_restoreAbsolute_noPathInLib_bin() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/bazel-bin/my/foo/lib/foo1.dart',
+    ]);
+    _assertRestore('/workspace/bazel-bin', null);
+    _assertRestore('/workspace/bazel-bin/my', null);
+    _assertRestore('/workspace/bazel-bin/my/foo', null);
+    _assertRestore('/workspace/bazel-bin/my/foo/lib', null);
+  }
+
+  void test_restoreAbsolute_noPathInLib_genfiles() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/bazel-genfiles/my/foo/lib/foo1.dart',
+    ]);
+    _assertRestore('/workspace/bazel-genfiles', null);
+    _assertRestore('/workspace/bazel-genfiles/my', null);
+    _assertRestore('/workspace/bazel-genfiles/my/foo', null);
+    _assertRestore('/workspace/bazel-genfiles/my/foo/lib', null);
+  }
+
+  void test_restoreAbsolute_noPathInLib_workspace() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/my/foo/lib/foo1.dart',
+    ]);
+    _assertRestore('/workspace', null);
+    _assertRestore('/workspace/my', null);
+    _assertRestore('/workspace/my/foo', null);
+    _assertRestore('/workspace/my/foo/lib', null);
+  }
+
+  void test_restoreAbsolute_thirdPartyNotDart_workspace() {
+    _addResources([
+      '/workspace/WORKSPACE',
+      '/workspace/bazel-genfiles/',
+      '/workspace/third_party/something/lib/foo.dart',
+    ]);
+    _assertRestore('/workspace/third_party/something/lib/foo.dart',
+        'package:third_party.something/foo.dart');
+  }
+
+  void _addResources(List<String> paths, {String workspacePath: '/workspace'}) {
+    for (String path in paths) {
+      if (path.endsWith('/')) {
+        newFolder(path.substring(0, path.length - 1));
+      } else {
+        newFile(path);
+      }
+    }
+    workspace =
+        BazelWorkspace.find(resourceProvider, convertPath(workspacePath));
+    resolver = new BazelPackageUriResolver(workspace);
+  }
+
+  void _assertResolve(String uriStr, String posixPath,
+      {bool exists: true, bool restore: true}) {
+    Uri uri = Uri.parse(uriStr);
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNotNull);
+    expect(source.fullName, convertPath(posixPath));
+    expect(source.uri, uri);
+    expect(source.exists(), exists);
+    // If enabled, test also "restoreAbsolute".
+    if (restore) {
+      Uri uri = resolver.restoreAbsolute(source);
+      expect(uri.toString(), uriStr);
+    }
+  }
+
+  void _assertRestore(String posixPath, String expectedUri) {
+    String path = convertPath(posixPath);
+    _MockSource source = new _MockSource(path);
+    Uri uri = resolver.restoreAbsolute(source);
+    expect(uri?.toString(), expectedUri);
+  }
+}
+
+@reflectiveTest
+class BazelWorkspaceTest with ResourceProviderMixin {
+  void test_find_fail_notAbsolute() {
+    expect(
+        () =>
+            BazelWorkspace.find(resourceProvider, convertPath('not_absolute')),
+        throwsA(const TypeMatcher<ArgumentError>()));
+  }
+
+  void test_find_hasReadonlyFolder() {
+    newFolder('/Users/user/test/READONLY/prime');
+    newFolder('/Users/user/test/prime');
+    newFolder('/Users/user/test/prime/bazel-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    expect(workspace.root, convertPath('/Users/user/test/prime'));
+    expect(workspace.readonly, convertPath('/Users/user/test/READONLY/prime'));
+    expect(workspace.bin, convertPath('/Users/user/test/prime/bazel-bin'));
+    expect(workspace.genfiles,
+        convertPath('/Users/user/test/prime/bazel-genfiles'));
+  }
+
+  void test_find_hasReadonlyFolder_bad_actuallyHasWorkspaceFile() {
+    newFolder('/Users/user/test/READONLY');
+    newFile('/Users/user/test/prime/WORKSPACE');
+    newFolder('/Users/user/test/prime/bazel-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    expect(workspace.root, convertPath('/Users/user/test/prime'));
+    expect(workspace.readonly, isNull);
+    expect(workspace.bin, convertPath('/Users/user/test/prime/bazel-bin'));
+    expect(workspace.genfiles,
+        convertPath('/Users/user/test/prime/bazel-genfiles'));
+  }
+
+  void test_find_hasReadonlyFolder_blaze() {
+    newFolder('/Users/user/test/READONLY/prime');
+    newFolder('/Users/user/test/prime');
+    newFolder('/Users/user/test/prime/blaze-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    expect(workspace.root, convertPath('/Users/user/test/prime'));
+    expect(workspace.readonly, convertPath('/Users/user/test/READONLY/prime'));
+    expect(workspace.bin, convertPath('/Users/user/test/prime/blaze-bin'));
+    expect(workspace.genfiles,
+        convertPath('/Users/user/test/prime/blaze-genfiles'));
+  }
+
+  void test_find_hasWorkspaceFile() {
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.readonly, isNull);
+    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
+  }
+
+  void test_find_hasWorkspaceFile_forModuleInWorkspace() {
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.readonly, isNull);
+    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
+  }
+
+  void test_find_hasWorkspaceFile_forWorkspace() {
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/bazel-genfiles');
+    BazelWorkspace workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.readonly, isNull);
+    expect(workspace.bin, convertPath('/workspace/bazel-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/bazel-genfiles'));
+  }
+
+  void test_find_hasWorkspaceFile_forWorkspace_blaze() {
+    newFile('/workspace/WORKSPACE');
+    newFolder('/workspace/blaze-genfiles');
+    BazelWorkspace workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/workspace'));
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.readonly, isNull);
+    expect(workspace.bin, convertPath('/workspace/blaze-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
+  }
+
+  void test_find_null_noWorkspaceMarkers() {
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(workspace, isNull);
+  }
+
+  void test_find_null_noWorkspaceMarkers_inRoot() {
+    BazelWorkspace workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/'));
+    expect(workspace, isNull);
+  }
+
+  void test_find_null_symlinkPrefix() {
+    String prefix = BazelWorkspace.defaultSymlinkPrefix;
+    newFile('/workspace/WORKSPACE');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.readonly, isNull);
+    expect(workspace.bin, convertPath('/workspace/$prefix-bin'));
+    expect(workspace.genfiles, convertPath('/workspace/$prefix-genfiles'));
+  }
+
+  void test_findFile_hasReadonlyFolder() {
+    newFolder('/Users/user/test/READONLY/prime');
+    newFolder('/Users/user/test/prime');
+    newFile('/Users/user/test/prime/my/module/test1.dart');
+    newFile('/Users/user/test/prime/my/module/test2.dart');
+    newFile('/Users/user/test/prime/my/module/test3.dart');
+    newFile('/Users/user/test/prime/bazel-bin/my/module/test2.dart');
+    newFile('/Users/user/test/prime/bazel-genfiles/my/module/test3.dart');
+    newFile('/Users/user/test/READONLY/prime/other/module/test4.dart');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    expect(
+        workspace
+            .findFile(
+                convertPath('/Users/user/test/prime/my/module/test1.dart'))
+            .path,
+        convertPath('/Users/user/test/prime/my/module/test1.dart'));
+    expect(
+        workspace
+            .findFile(
+                convertPath('/Users/user/test/prime/my/module/test2.dart'))
+            .path,
+        convertPath('/Users/user/test/prime/bazel-bin/my/module/test2.dart'));
+    expect(
+        workspace
+            .findFile(
+                convertPath('/Users/user/test/prime/my/module/test3.dart'))
+            .path,
+        convertPath(
+            '/Users/user/test/prime/bazel-genfiles/my/module/test3.dart'));
+    expect(
+        workspace
+            .findFile(
+                convertPath('/Users/user/test/prime/other/module/test4.dart'))
+            .path,
+        convertPath('/Users/user/test/READONLY/prime/other/module/test4.dart'));
+  }
+
+  void test_findFile_main_overrides_readonly() {
+    newFolder('/Users/user/test/READONLY/prime');
+    newFolder('/Users/user/test/prime');
+    newFolder('/Users/user/test/prime/bazel-genfiles');
+    newFile('/Users/user/test/prime/my/module/test.dart');
+    newFile('/Users/user/test/READONLY/prime/my/module/test.dart');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/Users/user/test/prime/my/module'));
+    expect(
+        workspace
+            .findFile(convertPath('/Users/user/test/prime/my/module/test.dart'))
+            .path,
+        convertPath('/Users/user/test/prime/my/module/test.dart'));
+  }
+
+  void test_findFile_noReadOnly() {
+    newFile('/workspace/WORKSPACE');
+    newFile('/workspace/my/module/test1.dart');
+    newFile('/workspace/my/module/test2.dart');
+    newFile('/workspace/my/module/test3.dart');
+    newFile('/workspace/bazel-bin/my/module/test2.dart');
+    newFile('/workspace/bazel-genfiles/my/module/test3.dart');
+    BazelWorkspace workspace = BazelWorkspace.find(
+        resourceProvider, convertPath('/workspace/my/module'));
+    expect(
+        workspace.findFile(convertPath('/workspace/my/module/test1.dart')).path,
+        convertPath('/workspace/my/module/test1.dart'));
+    expect(
+        workspace.findFile(convertPath('/workspace/my/module/test2.dart')).path,
+        convertPath('/workspace/bazel-bin/my/module/test2.dart'));
+    expect(
+        workspace.findFile(convertPath('/workspace/my/module/test3.dart')).path,
+        convertPath('/workspace/bazel-genfiles/my/module/test3.dart'));
+  }
+}
+
+@reflectiveTest
+class BazelWorkspacePackageTest with ResourceProviderMixin {
+  BazelWorkspace workspace;
+
+  void setUp() {
+    newFile('/ws/WORKSPACE');
+    newFolder('/ws/bazel-genfiles');
+    workspace =
+        BazelWorkspace.find(resourceProvider, convertPath('/ws/some/code'));
+  }
+
+  void test_findPackageFor_missingBuildFile() {
+    final targetFile = newFile('/ws/some/code/lib/code.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    expect(package, isNull);
+  }
+
+  void test_findPackageFor_buildFileExists() {
+    newFile('/ws/some/code/BUILD');
+    final targetFile = newFile('/ws/some/code/lib/code.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    expect(package, isNotNull);
+    expect(package.root, convertPath('/ws/some/code'));
+    expect(package.workspace, equals(workspace));
+  }
+
+  void test_contains_differentWorkspace() {
+    newFile('/ws/some/code/BUILD');
+    final targetFile = newFile('/ws/some/code/lib/code.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    expect(package.contains('/ws2/some/file.dart'), isFalse);
+  }
+
+  void test_contains_differentPackageInWorkspace() {
+    newFile('/ws/some/code/BUILD');
+    final targetFile = newFile('/ws/some/code/lib/code.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    // A file that is _not_ in this package is not required to have a BUILD.gn
+    // file above it, for simplicity and reduced I/O.
+    expect(package.contains('/ws/some/other/code/file.dart'), isFalse);
+  }
+
+  void test_contains_samePackage() {
+    newFile('/ws/some/code/BUILD');
+    final targetFile = newFile('/ws/some/code/lib/code.dart');
+    final targetFile2 = newFile('/ws/some/code/lib/code2.dart');
+    final targetFile3 = newFile('/ws/some/code/lib/src/code3.dart');
+    final targetBinFile = newFile('/ws/some/code/bin/code.dart');
+    final targetTestFile = newFile('/ws/some/code/test/code_test.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    expect(package.contains(targetFile2.path), isTrue);
+    expect(package.contains(targetFile3.path), isTrue);
+    expect(package.contains(targetBinFile.path), isTrue);
+    expect(package.contains(targetTestFile.path), isTrue);
+  }
+
+  void test_contains_subPackage() {
+    newFile('/ws/some/code/BUILD');
+    newFile('/ws/some/code/lib/code.dart');
+    newFile('/ws/some/code/testing/BUILD');
+    newFile('/ws/some/code/testing/lib/testing.dart');
+
+    var package =
+        workspace.findPackageFor(convertPath('/ws/some/code/lib/code.dart'));
+    expect(
+        package.contains(convertPath('/ws/some/code/testing/lib/testing.dart')),
+        isFalse);
+  }
+}
+
+class _MockSource implements Source {
+  @override
+  final String fullName;
+
+  _MockSource(this.fullName);
+
+  @override
+  noSuchMethod(Invocation invocation) {
+    throw new StateError('Unexpected invocation of ${invocation.memberName}');
+  }
+}
diff --git a/pkg/analyzer/test/src/workspace/gn_test.dart b/pkg/analyzer/test/src/workspace/gn_test.dart
new file mode 100644
index 0000000..8cd0a5b
--- /dev/null
+++ b/pkg/analyzer/test/src/workspace/gn_test.dart
@@ -0,0 +1,258 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/workspace/gn.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GnWorkspaceTest);
+    defineReflectiveTests(GnWorkspacePackageTest);
+  });
+}
+
+@reflectiveTest
+class GnWorkspaceTest with ResourceProviderMixin {
+  void test_find_noJiriRoot() {
+    newFolder('/workspace');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace'));
+    expect(workspace, isNull);
+  }
+
+  void test_find_noPackagesFiles() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace'));
+    expect(workspace, isNull);
+  }
+
+  void test_find_notAbsolute() {
+    expect(
+        () => GnWorkspace.find(resourceProvider, convertPath('not_absolute')),
+        throwsA(const TypeMatcher<ArgumentError>()));
+  }
+
+  void test_find_withRoot() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('out/debug-x87_128');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace'));
+  }
+
+  void test_packages() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('out/debug-x87_128');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.packageMap.length, 1);
+    expect(workspace.packageMap['flutter'][0].path, packageLocation);
+  }
+
+  void test_packages_absoluteBuildDir() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('/workspace/out/debug-x87_128');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.packageMap.length, 1);
+    expect(workspace.packageMap['flutter'][0].path, packageLocation);
+  }
+
+  void test_packages_fallbackBuildDir() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.packageMap.length, 1);
+    expect(workspace.packageMap['flutter'][0].path, packageLocation);
+  }
+
+  void test_packages_fallbackBuildDirWithUselessConfig() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    newFile('/workspace/.config', content: 'FOO=foo\n' + 'BAR=bar\n');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.packageMap.length, 1);
+    expect(workspace.packageMap['flutter'][0].path, packageLocation);
+  }
+
+  void test_packages_multipleCandidates() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('out/release-y22_256');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    String packageLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageUri = resourceProvider.pathContext.toUri(packageLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageUri');
+    String otherPackageLocation = convertPath('/workspace/here/too');
+    Uri otherPackageUri =
+        resourceProvider.pathContext.toUri(otherPackageLocation);
+    newFile(
+        '/workspace/out/release-y22_256/dartlang/gen/some/code/foo.packages',
+        content: 'rettulf:$otherPackageUri');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.packageMap.length, 1);
+    expect(workspace.packageMap['rettulf'][0].path, otherPackageLocation);
+  }
+
+  void test_packages_multipleFiles() {
+    newFolder('/workspace/.jiri_root');
+    newFolder('/workspace/some/code');
+    newFile('/workspace/some/code/pubspec.yaml');
+    String buildDir = convertPath('out/debug-x87_128');
+    newFile('/workspace/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR=$buildDir\n' + 'BAR=bar\n');
+    String packageOneLocation = convertPath('/workspace/this/is/the/package');
+    Uri packageOneUri = resourceProvider.pathContext.toUri(packageOneLocation);
+    newFile('/workspace/out/debug-x87_128/dartlang/gen/some/code/foo.packages',
+        content: 'flutter:$packageOneUri');
+    String packageTwoLocation =
+        convertPath('/workspace/this/is/the/other/package');
+    Uri packageTwoUri = resourceProvider.pathContext.toUri(packageTwoLocation);
+    newFile(
+        '/workspace/out/debug-x87_128/dartlang/gen/some/code/foo_test.packages',
+        content: 'rettulf:$packageTwoUri');
+    GnWorkspace workspace =
+        GnWorkspace.find(resourceProvider, convertPath('/workspace/some/code'));
+    expect(workspace, isNotNull);
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.packageMap.length, 2);
+    expect(workspace.packageMap['flutter'][0].path, packageOneLocation);
+    expect(workspace.packageMap['rettulf'][0].path, packageTwoLocation);
+  }
+}
+
+@reflectiveTest
+class GnWorkspacePackageTest with ResourceProviderMixin {
+  GnWorkspace _buildStandardGnWorkspace() {
+    newFolder('/ws/.jiri_root');
+    String buildDir = convertPath('out/debug-x87_128');
+    newFile('/ws/.config',
+        content: 'FOO=foo\n' + 'FUCHSIA_BUILD_DIR="$buildDir"\n' + 'BAR=bar\n');
+    newFile('/ws/out/debug-x87_128/dartlang/gen/some/code/foo.packages');
+    newFolder('/ws/some/code');
+    return GnWorkspace.find(resourceProvider, convertPath('/ws/some/code'));
+  }
+
+  void test_findPackageFor_missingBuildFile() {
+    GnWorkspace workspace = _buildStandardGnWorkspace();
+    newFile('/ws/some/code/lib/code.dart');
+
+    var package =
+        workspace.findPackageFor(convertPath('/ws/some/code/lib/code.dart'));
+    expect(package, isNull);
+  }
+
+  void test_findPackageFor_buildFileExists() {
+    GnWorkspace workspace = _buildStandardGnWorkspace();
+    newFile('/ws/some/code/BUILD.gn');
+    var targetFile = newFile('/ws/some/code/lib/code.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    expect(package, isNotNull);
+    expect(package.root, convertPath('/ws/some/code'));
+    expect(package.workspace, equals(workspace));
+  }
+
+  void test_contains_differentWorkspace() {
+    GnWorkspace workspace = _buildStandardGnWorkspace();
+    newFile('/ws/some/code/BUILD.gn');
+    var targetFile = newFile('/ws/some/code/lib/code.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    expect(package.contains('/ws2/some/file.dart'), isFalse);
+  }
+
+  void test_contains_differentPackageInWorkspace() {
+    GnWorkspace workspace = _buildStandardGnWorkspace();
+    newFile('/ws/some/code/BUILD.gn');
+    var targetFile = newFile('/ws/some/code/lib/code.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    // A file that is _not_ in this package is not required to have a BUILD.gn
+    // file above it, for simplicity and reduced I/O.
+    expect(package.contains('/ws/some/other/code/file.dart'), isFalse);
+  }
+
+  void test_contains_samePackage() {
+    GnWorkspace workspace = _buildStandardGnWorkspace();
+    newFile('/ws/some/code/BUILD.gn');
+    var targetFile = newFile('/ws/some/code/lib/code.dart');
+    var targetFile2 = newFile('/ws/some/code/lib/code2.dart');
+    var targetFile3 = newFile('/ws/some/code/lib/src/code3.dart');
+    var targetBinFile = newFile('/ws/some/code/bin/code.dart');
+    var targetTestFile = newFile('/ws/some/code/test/code_test.dart');
+
+    var package = workspace.findPackageFor(targetFile.path);
+    expect(package.contains(targetFile2.path), isTrue);
+    expect(package.contains(targetFile3.path), isTrue);
+    expect(package.contains(targetBinFile.path), isTrue);
+    expect(package.contains(targetTestFile.path), isTrue);
+  }
+
+  void test_contains_subPackage() {
+    GnWorkspace workspace = _buildStandardGnWorkspace();
+    newFile('/ws/some/code/BUILD.gn');
+    newFile('/ws/some/code/lib/code.dart');
+    newFile('/ws/some/code/testing/BUILD.gn');
+    newFile('/ws/some/code/testing/lib/testing.dart');
+
+    var package =
+        workspace.findPackageFor(convertPath('/ws/some/code/lib/code.dart'));
+    expect(
+        package.contains(convertPath('/ws/some/code/testing/lib/testing.dart')),
+        isFalse);
+  }
+}
diff --git a/pkg/analyzer/test/src/workspace/package_build_test.dart b/pkg/analyzer/test/src/workspace/package_build_test.dart
new file mode 100644
index 0000000..173fc46
--- /dev/null
+++ b/pkg/analyzer/test/src/workspace/package_build_test.dart
@@ -0,0 +1,547 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/workspace/package_build.dart';
+import 'package:package_config/packages.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PackageBuildFileUriResolverTest);
+    defineReflectiveTests(PackageBuildPackageUriResolverTest);
+    defineReflectiveTests(PackageBuildWorkspaceTest);
+    defineReflectiveTests(PackageBuildWorkspacePackageTest);
+  });
+}
+
+class MockContextBuilder implements ContextBuilder {
+  Map<String, Packages> packagesMapMap = <String, Packages>{};
+  Map<Packages, Map<String, List<Folder>>> packagesToMapMap =
+      <Packages, Map<String, List<Folder>>>{};
+
+  Map<String, List<Folder>> convertPackagesToMap(Packages packages) =>
+      packagesToMapMap[packages];
+
+  Packages createPackageMap(String rootDirectoryPath) =>
+      packagesMapMap[rootDirectoryPath];
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class MockPackages implements Packages {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class MockUriResolver implements UriResolver {
+  Map<Uri, Source> resolveAbsoluteMap = {};
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  Source resolveAbsolute(Uri uri, [Uri actualUri]) => resolveAbsoluteMap[uri];
+}
+
+@reflectiveTest
+class PackageBuildFileUriResolverTest with ResourceProviderMixin {
+  PackageBuildWorkspace workspace;
+  PackageBuildFileUriResolver resolver;
+
+  void setUp() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    final MockContextBuilder contextBuilder = new MockContextBuilder();
+    final Packages packages = new MockPackages();
+    contextBuilder.packagesMapMap[convertPath('/workspace')] = packages;
+    contextBuilder.packagesToMapMap[packages] = {'project': []};
+    workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), contextBuilder);
+    resolver = new PackageBuildFileUriResolver(workspace);
+    newFile('/workspace/test.dart');
+    newFile('/workspace/.dart_tool/build/generated/project/gen.dart');
+  }
+
+  void test_resolveAbsolute_doesNotExist() {
+    Source source = _resolvePath('/workspace/foo.dart');
+    expect(source, isNotNull);
+    expect(source.exists(), isFalse);
+    expect(source.fullName, convertPath('/workspace/foo.dart'));
+  }
+
+  void test_resolveAbsolute_file() {
+    Source source = _resolvePath('/workspace/test.dart');
+    expect(source, isNotNull);
+    expect(source.exists(), isTrue);
+    expect(source.fullName, convertPath('/workspace/test.dart'));
+  }
+
+  void test_resolveAbsolute_folder() {
+    Source source = _resolvePath('/workspace');
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_generated_file_exists_one() {
+    Source source = _resolvePath('/workspace/gen.dart');
+    expect(source, isNotNull);
+    expect(source.exists(), isTrue);
+    expect(source.fullName,
+        convertPath('/workspace/.dart_tool/build/generated/project/gen.dart'));
+  }
+
+  void test_resolveAbsolute_notFile_dartUri() {
+    Uri uri = new Uri(scheme: 'dart', path: 'core');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_notFile_httpsUri() {
+    Uri uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNull);
+  }
+
+  void test_restoreAbsolute() {
+    Uri uri =
+        resourceProvider.pathContext.toUri(convertPath('/workspace/test.dart'));
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNotNull);
+    expect(resolver.restoreAbsolute(source), uri);
+    expect(
+        resolver.restoreAbsolute(
+            new NonExistingSource(source.fullName, null, null)),
+        uri);
+  }
+
+  Source _resolvePath(String path) {
+    Uri uri = toUri(path);
+    return resolver.resolveAbsolute(uri);
+  }
+}
+
+@reflectiveTest
+class PackageBuildPackageUriResolverTest with ResourceProviderMixin {
+  PackageBuildWorkspace workspace;
+  PackageBuildPackageUriResolver resolver;
+  MockUriResolver packageUriResolver;
+
+  Uri addPackageSource(String path, String uriStr, {bool create: true}) {
+    Uri uri = Uri.parse(uriStr);
+    final File file = create
+        ? newFile(path)
+        : resourceProvider.getResource(convertPath(path));
+    final Source source = file.createSource(uri);
+    packageUriResolver.resolveAbsoluteMap[uri] = source;
+    return uri;
+  }
+
+  void setUp() {
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+  }
+
+  void test_resolveAbsolute_generated() {
+    _addResources([
+      '/workspace/.dart_tool/build/generated/project/lib/generated_file.dart',
+    ]);
+    final Uri sourceUri = addPackageSource('/workspace/lib/generated_file.dart',
+        'package:project/generated_file.dart',
+        create: false);
+    _assertResolveUri(sourceUri,
+        '/workspace/.dart_tool/build/generated/project/lib/generated_file.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_null_notPackage() {
+    _addResources([
+      '/workspace/.dart_tool/build/generated',
+    ]);
+    Source source = resolver.resolveAbsolute(Uri.parse('dart:async'));
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_null_startsWithSlash() {
+    _addResources([
+      '/workspace/.dart_tool/build/generated',
+    ]);
+    Source source =
+        resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
+    expect(source, isNull);
+  }
+
+  void test_resolveAbsolute_source() {
+    _addResources([
+      '/workspace/.dart_tool/build/generated/project/lib/source_file.dart',
+    ]);
+    final Uri sourceUri = addPackageSource(
+        '/workspace/lib/source_file.dart', 'package:project/source_file.dart');
+    _assertResolveUri(sourceUri, '/workspace/lib/source_file.dart',
+        exists: true);
+  }
+
+  void test_resolveAbsolute_workspace_doesNotExist() {
+    _addResources([
+      '/workspace/.dart_tool/build/generated',
+    ]);
+    final Uri sourceUri = addPackageSource(
+        '/workspace/lib/doesNotExist.dart', 'package:project/doesNotExist.dart',
+        create: false);
+    _assertResolveUri(sourceUri, '/workspace/lib/doesNotExist.dart',
+        exists: false);
+  }
+
+  void _addResources(List<String> paths, {String workspacePath: '/workspace'}) {
+    for (String path in paths) {
+      if (path.endsWith('/')) {
+        newFolder(path.substring(0, path.length - 1));
+      } else {
+        newFile(path);
+      }
+    }
+    final contextBuilder = new MockContextBuilder();
+    final packages = new MockPackages();
+    contextBuilder.packagesMapMap[convertPath(workspacePath)] = packages;
+    contextBuilder.packagesToMapMap[packages] = {'project': []};
+    workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath(workspacePath), contextBuilder);
+    packageUriResolver = new MockUriResolver();
+    resolver =
+        new PackageBuildPackageUriResolver(workspace, packageUriResolver);
+  }
+
+  Source _assertResolveUri(Uri uri, String posixPath,
+      {bool exists: true, bool restore: true}) {
+    Source source = resolver.resolveAbsolute(uri);
+    expect(source, isNotNull);
+    expect(source.fullName, convertPath(posixPath));
+    expect(source.uri, uri);
+    expect(source.exists(), exists);
+    // If enabled, test also "restoreAbsolute".
+    if (restore) {
+      Uri restoredUri = resolver.restoreAbsolute(source);
+      expect(restoredUri.toString(), uri.toString());
+    }
+    return source;
+  }
+}
+
+@reflectiveTest
+class PackageBuildWorkspaceTest with ResourceProviderMixin {
+  void test_builtFile_currentProject() {
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project']);
+
+    final libFile =
+        newFile('/workspace/.dart_tool/build/generated/project/lib/file.dart');
+    expect(
+        workspace.builtFile(convertPath('lib/file.dart'), 'project'), libFile);
+  }
+
+  void test_builtFile_importedPackage() {
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project', 'foo']);
+
+    final libFile =
+        newFile('/workspace/.dart_tool/build/generated/foo/lib/file.dart');
+    expect(workspace.builtFile(convertPath('lib/file.dart'), 'foo'), libFile);
+  }
+
+  void test_builtFile_notInPackagesGetsHidden() {
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+
+    // Ensure package:bar is not configured.
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project', 'foo']);
+
+    // Create a generated file in package:bar.
+    newFile('/workspace/.dart_tool/build/generated/bar/lib/file.dart');
+
+    // Bar not in packages, file should not be returned.
+    expect(workspace.builtFile('lib/file.dart', 'bar'), isNull);
+  }
+
+  void test_find_fail_notAbsolute() {
+    expect(
+        () => PackageBuildWorkspace.find(resourceProvider,
+            convertPath('not_absolute'), new MockContextBuilder()),
+        throwsA(const TypeMatcher<ArgumentError>()));
+  }
+
+  void test_find_hasDartToolAndPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.projectPackageName, 'project');
+  }
+
+  void test_find_hasDartToolAndPubspec_inParentDirectory() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
+    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
+        'name: subproject'.codeUnits);
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/opened/up/a/child/dir'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace/opened/up/a/child/dir'));
+    expect(workspace.projectPackageName, 'subproject');
+  }
+
+  void
+      test_find_hasDartToolAndPubspec_inParentDirectory_ignoresMalformedPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
+    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
+        'not: yaml: here!!! 111'.codeUnits);
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/opened/up/a/child/dir'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.projectPackageName, 'project');
+  }
+
+  void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloDartTool() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir');
+    newFolder('/workspace/opened/up/a/child/dir/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/opened/up/a/child/dir'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.projectPackageName, 'project');
+  }
+
+  void test_find_hasDartToolAndPubspec_inParentDirectory_ignoresSoloPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFolder('/workspace/opened/up/a/child/dir');
+    newFileWithBytes('/workspace/opened/up/a/child/dir/pubspec.yaml',
+        'name: subproject'.codeUnits);
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider,
+        convertPath('/workspace/opened/up/a/child/dir'),
+        new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
+    expect(workspace.projectPackageName, 'project');
+  }
+
+  void test_find_hasDartToolNoBuild() {
+    // Edge case: an empty .dart_tool directory. Don't assume package:build.
+    newFolder('/workspace/.dart_tool');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace, isNull);
+  }
+
+  void test_find_hasDartToolNoPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace, isNull);
+  }
+
+  void test_find_hasDartToolPubButNotBuild() {
+    // Dart projects will have this directory, that don't use package:build.
+    newFolder('/workspace/.dart_tool/pub');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace, isNull);
+  }
+
+  void test_find_hasMalformedPubspec() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes(
+        '/workspace/pubspec.yaml', 'not: yaml: here! 1111'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace, isNull);
+  }
+
+  void test_find_hasPubspecNoDartTool() {
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace = PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace, isNull);
+  }
+
+  void test_findFile_bin() {
+    newFolder('/workspace/.dart_tool/build/generated/project/bin');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project']);
+
+    final binFile = newFile('/workspace/bin/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
+  }
+
+  void test_findFile_binGenerated() {
+    newFolder('/workspace/.dart_tool/build/generated/project/bin');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project']);
+
+    final binFile =
+        newFile('/workspace/.dart_tool/build/generated/project/bin/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/bin/file.dart')), binFile);
+  }
+
+  void test_findFile_libGenerated() {
+    newFolder('/workspace/.dart_tool/build/generated/project/lib');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project']);
+
+    final libFile =
+        newFile('/workspace/.dart_tool/build/generated/project/lib/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/lib/file.dart')), libFile);
+  }
+
+  void test_findFile_test() {
+    newFolder('/workspace/.dart_tool/build/generated/project/test');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project']);
+
+    final testFile = newFile('/workspace/test/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
+  }
+
+  void test_findFile_testGenerated() {
+    newFolder('/workspace/.dart_tool/build/generated/project/test');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project']);
+
+    final testFile =
+        newFile('/workspace/.dart_tool/build/generated/project/test/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/test/file.dart')), testFile);
+  }
+
+  void test_findFile_web() {
+    newFolder('/workspace/.dart_tool/build/generated/project/web');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project']);
+
+    final webFile = newFile('/workspace/web/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
+  }
+
+  void test_findFile_webGenerated() {
+    newFolder('/workspace/.dart_tool/build/generated/project/web');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project']);
+
+    final webFile =
+        newFile('/workspace/.dart_tool/build/generated/project/web/file.dart');
+    expect(
+        workspace.findFile(convertPath('/workspace/web/file.dart')), webFile);
+  }
+
+  void test_supports_flutter() {
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PackageBuildWorkspace workspace =
+        _createWorkspace('/workspace', ['project', 'flutter']);
+
+    expect(workspace.hasFlutterDependency, true);
+  }
+
+  PackageBuildWorkspace _createWorkspace(
+      String root, List<String> packageNames) {
+    final contextBuilder = new MockContextBuilder();
+    final packages = new MockPackages();
+    final packageMap = new Map<String, List<Folder>>.fromIterable(packageNames,
+        value: ((_) => []));
+    contextBuilder.packagesMapMap[convertPath(root)] = packages;
+    contextBuilder.packagesToMapMap[packages] = packageMap;
+    return PackageBuildWorkspace.find(
+        resourceProvider, convertPath(root), contextBuilder);
+  }
+}
+
+@reflectiveTest
+class PackageBuildWorkspacePackageTest with ResourceProviderMixin {
+  PackageBuildWorkspace _createPackageBuildWorkspace() {
+    final contextBuilder = new MockContextBuilder();
+    final packages = new MockPackages();
+    final packageMap = <String, List<Folder>>{'project': []};
+    contextBuilder.packagesMapMap[convertPath('/workspace')] = packages;
+    contextBuilder.packagesToMapMap[packages] = packageMap;
+
+    newFolder('/workspace/.dart_tool/build');
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    return PackageBuildWorkspace.find(
+        resourceProvider, convertPath('/workspace'), contextBuilder);
+  }
+
+  void test_findPackageFor_unrelatedFile() {
+    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
+    newFile('/workspace/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace2/project/lib/file.dart'));
+    expect(package, isNull);
+  }
+
+  void test_findPackageFor_includedFile() {
+    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
+    newFile('/workspace/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/file.dart'));
+    expect(package, isNotNull);
+    expect(package.root, convertPath('/workspace'));
+    expect(package.workspace, equals(workspace));
+  }
+
+  void test_contains_differentWorkspace() {
+    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
+    newFile('/workspace2/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
+    expect(package.contains('/workspace2/project/lib/file.dart'), isFalse);
+  }
+
+  void test_contains_sameWorkspace() {
+    PackageBuildWorkspace workspace = _createPackageBuildWorkspace();
+    newFile('/workspace/project/lib/file2.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
+    var file2Path =
+        path.separator + path.join('workspace', 'project', 'lib', 'file2.dart');
+    expect(package.contains(file2Path), isTrue);
+    var binPath =
+        path.separator + path.join('workspace', 'project', 'bin', 'bin.dart');
+    expect(package.contains(binPath), isTrue);
+    var testPath =
+        path.separator + path.join('workspace', 'project', 'test', 'test.dart');
+    expect(package.contains(testPath), isTrue);
+  }
+}
diff --git a/pkg/analyzer/test/src/workspace/pub_test.dart b/pkg/analyzer/test/src/workspace/pub_test.dart
new file mode 100644
index 0000000..48d88d6
--- /dev/null
+++ b/pkg/analyzer/test/src/workspace/pub_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/workspace/pub.dart';
+import 'package:package_config/packages.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PubWorkspacePackageTest);
+    defineReflectiveTests(PubWorkspaceTest);
+  });
+}
+
+class MockContextBuilder implements ContextBuilder {
+  Map<String, Packages> packagesMapMap = <String, Packages>{};
+  Map<Packages, Map<String, List<Folder>>> packagesToMapMap =
+      <Packages, Map<String, List<Folder>>>{};
+
+  Map<String, List<Folder>> convertPackagesToMap(Packages packages) =>
+      packagesToMapMap[packages];
+
+  Packages createPackageMap(String rootDirectoryPath) =>
+      packagesMapMap[rootDirectoryPath];
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+class MockPackages implements Packages {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+@reflectiveTest
+class PubWorkspacePackageTest with ResourceProviderMixin {
+  PubWorkspace workspace;
+
+  setUp() {
+    final contextBuilder = new MockContextBuilder();
+    final packages = new MockPackages();
+    final packageMap = <String, List<Folder>>{'project': []};
+    contextBuilder.packagesMapMap[convertPath('/workspace')] = packages;
+    contextBuilder.packagesToMapMap[packages] = packageMap;
+
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    workspace = PubWorkspace.find(
+        resourceProvider, convertPath('/workspace'), contextBuilder);
+  }
+
+  void test_findPackageFor_unrelatedFile() {
+    newFile('/workspace/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace2/project/lib/file.dart'));
+    expect(package, isNull);
+  }
+
+  void test_findPackageFor_includedFile() {
+    newFile('/workspace/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/file.dart'));
+    expect(package, isNotNull);
+    expect(package.root, convertPath('/workspace'));
+    expect(package.workspace, equals(workspace));
+  }
+
+  void test_contains_differentWorkspace() {
+    newFile('/workspace2/project/lib/file.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
+    expect(package.contains('/workspace2/project/lib/file.dart'), isFalse);
+  }
+
+  void test_contains_sameWorkspace() {
+    newFile('/workspace/project/lib/file2.dart');
+
+    var package = workspace
+        .findPackageFor(convertPath('/workspace/project/lib/code.dart'));
+    expect(package.contains('/workspace/project/lib/file2.dart'), isTrue);
+    expect(package.contains('/workspace/project/bin/bin.dart'), isTrue);
+    expect(package.contains('/workspace/project/test/test.dart'), isTrue);
+  }
+}
+
+@reflectiveTest
+class PubWorkspaceTest with ResourceProviderMixin {
+  void test_find_fail_notAbsolute() {
+    expect(
+        () => PubWorkspace.find(resourceProvider, convertPath('not_absolute'),
+            new MockContextBuilder()),
+        throwsA(TypeMatcher<ArgumentError>()));
+  }
+
+  void test_find_missingPubspec() {
+    PubWorkspace workspace = PubWorkspace.find(resourceProvider,
+        convertPath('/workspace/lib/lib1.dart'), new MockContextBuilder());
+    expect(workspace, isNull);
+  }
+
+  void test_find_directory() {
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PubWorkspace workspace = PubWorkspace.find(
+        resourceProvider, convertPath('/workspace'), new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
+  }
+
+  void test_find_file() {
+    newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
+    PubWorkspace workspace = PubWorkspace.find(resourceProvider,
+        convertPath('/workspace/lib/lib1.dart'), new MockContextBuilder());
+    expect(workspace.root, convertPath('/workspace'));
+  }
+}
diff --git a/pkg/analyzer/test/src/workspace/test_all.dart b/pkg/analyzer/test/src/workspace/test_all.dart
new file mode 100644
index 0000000..c2e0512
--- /dev/null
+++ b/pkg/analyzer/test/src/workspace/test_all.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'basic_test.dart' as basic_test;
+import 'bazel_test.dart' as bazel_test;
+import 'gn_test.dart' as gn_test;
+import 'package_build_test.dart' as package_build_test;
+
+main() {
+  defineReflectiveSuite(() {
+    basic_test.main();
+    bazel_test.main();
+    gn_test.main();
+    package_build_test.main();
+  }, name: 'workspace');
+}
diff --git a/pkg/analyzer/test/util/ast_type_matchers.dart b/pkg/analyzer/test/util/ast_type_matchers.dart
new file mode 100644
index 0000000..a56dddf
--- /dev/null
+++ b/pkg/analyzer/test/util/ast_type_matchers.dart
@@ -0,0 +1,306 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:test/test.dart';
+
+const isAdjacentStrings = const TypeMatcher<AdjacentStrings>();
+
+const isAnnotatedNode = const TypeMatcher<AnnotatedNode>();
+
+const isAnnotation = const TypeMatcher<Annotation>();
+
+const isArgumentList = const TypeMatcher<ArgumentList>();
+
+const isAsExpression = const TypeMatcher<AsExpression>();
+
+const isAssertInitializer = const TypeMatcher<AssertInitializer>();
+
+const isAssertion = const TypeMatcher<Assertion>();
+
+const isAssertStatement = const TypeMatcher<AssertStatement>();
+
+const isAssignmentExpression = const TypeMatcher<AssignmentExpression>();
+
+const isAwaitExpression = const TypeMatcher<AwaitExpression>();
+
+const isBinaryExpression = const TypeMatcher<BinaryExpression>();
+
+const isBlock = const TypeMatcher<Block>();
+
+const isBlockFunctionBody = const TypeMatcher<BlockFunctionBody>();
+
+const isBooleanLiteral = const TypeMatcher<BooleanLiteral>();
+
+const isBreakStatement = const TypeMatcher<BreakStatement>();
+
+const isCascadeExpression = const TypeMatcher<CascadeExpression>();
+
+const isCatchClause = const TypeMatcher<CatchClause>();
+
+const isClassDeclaration = const TypeMatcher<ClassDeclaration>();
+
+const isClassMember = const TypeMatcher<ClassMember>();
+
+const isClassOrMixinDeclaration = const TypeMatcher<ClassOrMixinDeclaration>();
+
+const isClassTypeAlias = const TypeMatcher<ClassTypeAlias>();
+
+const isCombinator = const TypeMatcher<Combinator>();
+
+const isComment = const TypeMatcher<Comment>();
+
+const isCommentReference = const TypeMatcher<CommentReference>();
+
+const isCompilationUnit = const TypeMatcher<CompilationUnit>();
+
+const isCompilationUnitMember = const TypeMatcher<CompilationUnitMember>();
+
+const isConditionalExpression = const TypeMatcher<ConditionalExpression>();
+
+const isConfiguration = const TypeMatcher<Configuration>();
+
+const isConstructorDeclaration = const TypeMatcher<ConstructorDeclaration>();
+
+const isConstructorFieldInitializer =
+    const TypeMatcher<ConstructorFieldInitializer>();
+
+const isConstructorInitializer = const TypeMatcher<ConstructorInitializer>();
+
+const isConstructorName = const TypeMatcher<ConstructorName>();
+
+const isConstructorReferenceNode =
+    const TypeMatcher<ConstructorReferenceNode>();
+
+const isContinueStatement = const TypeMatcher<ContinueStatement>();
+
+const isDeclaration = const TypeMatcher<Declaration>();
+
+const isDeclaredIdentifier = const TypeMatcher<DeclaredIdentifier>();
+
+const isDefaultFormalParameter = const TypeMatcher<DefaultFormalParameter>();
+
+const isDirective = const TypeMatcher<Directive>();
+
+const isDoStatement = const TypeMatcher<DoStatement>();
+
+const isDottedName = const TypeMatcher<DottedName>();
+
+const isDoubleLiteral = const TypeMatcher<DoubleLiteral>();
+
+const isEmptyFunctionBody = const TypeMatcher<EmptyFunctionBody>();
+
+const isEmptyStatement = const TypeMatcher<EmptyStatement>();
+
+const isEnumConstantDeclaration = const TypeMatcher<EnumConstantDeclaration>();
+
+const isEnumDeclaration = const TypeMatcher<EnumDeclaration>();
+
+const isExportDirective = const TypeMatcher<ExportDirective>();
+
+const isExpression = const TypeMatcher<Expression>();
+
+const isExpressionFunctionBody = const TypeMatcher<ExpressionFunctionBody>();
+
+const isExpressionStatement = const TypeMatcher<ExpressionStatement>();
+
+const isExtendsClause = const TypeMatcher<ExtendsClause>();
+
+const isFieldDeclaration = const TypeMatcher<FieldDeclaration>();
+
+const isFieldFormalParameter = const TypeMatcher<FieldFormalParameter>();
+
+const isForEachStatement = const TypeMatcher<ForEachStatement>();
+
+const isFormalParameter = const TypeMatcher<FormalParameter>();
+
+const isFormalParameterList = const TypeMatcher<FormalParameterList>();
+
+const isForStatement = const TypeMatcher<ForStatement>();
+
+const isFunctionBody = const TypeMatcher<FunctionBody>();
+
+const isFunctionDeclaration = const TypeMatcher<FunctionDeclaration>();
+
+const isFunctionDeclarationStatement =
+    const TypeMatcher<FunctionDeclarationStatement>();
+
+const isFunctionExpression = const TypeMatcher<FunctionExpression>();
+
+const isFunctionExpressionInvocation =
+    const TypeMatcher<FunctionExpressionInvocation>();
+
+const isFunctionTypeAlias = const TypeMatcher<FunctionTypeAlias>();
+
+const isFunctionTypedFormalParameter =
+    const TypeMatcher<FunctionTypedFormalParameter>();
+
+const isGenericFunctionType = const TypeMatcher<GenericFunctionType>();
+
+const isGenericTypeAlias = const TypeMatcher<GenericTypeAlias>();
+
+const isHideCombinator = const TypeMatcher<HideCombinator>();
+
+const isIdentifier = const TypeMatcher<Identifier>();
+
+const isIfStatement = const TypeMatcher<IfStatement>();
+
+const isImplementsClause = const TypeMatcher<ImplementsClause>();
+
+const isImportDirective = const TypeMatcher<ImportDirective>();
+
+const isIndexExpression = const TypeMatcher<IndexExpression>();
+
+const isInstanceCreationExpression =
+    const TypeMatcher<InstanceCreationExpression>();
+
+const isIntegerLiteral = const TypeMatcher<IntegerLiteral>();
+
+const isInterpolationElement = const TypeMatcher<InterpolationElement>();
+
+const isInterpolationExpression = const TypeMatcher<InterpolationExpression>();
+
+const isInterpolationString = const TypeMatcher<InterpolationString>();
+
+const isInvocationExpression = const TypeMatcher<InvocationExpression>();
+
+const isIsExpression = const TypeMatcher<IsExpression>();
+
+const isLabel = const TypeMatcher<Label>();
+
+const isLabeledStatement = const TypeMatcher<LabeledStatement>();
+
+const isLibraryDirective = const TypeMatcher<LibraryDirective>();
+
+const isLibraryIdentifier = const TypeMatcher<LibraryIdentifier>();
+
+const isListLiteral = const TypeMatcher<ListLiteral>();
+
+const isLiteral = const TypeMatcher<Literal>();
+
+const isMapLiteral = const TypeMatcher<MapLiteral>();
+
+const isMapLiteralEntry = const TypeMatcher<MapLiteralEntry>();
+
+const isMethodDeclaration = const TypeMatcher<MethodDeclaration>();
+
+const isMethodInvocation = const TypeMatcher<MethodInvocation>();
+
+const isMethodReferenceExpression =
+    const TypeMatcher<MethodReferenceExpression>();
+
+const isMixinDeclaration = const TypeMatcher<MixinDeclaration>();
+
+const isNamedCompilationUnitMember =
+    const TypeMatcher<NamedCompilationUnitMember>();
+
+const isNamedExpression = const TypeMatcher<NamedExpression>();
+
+const isNamedType = const TypeMatcher<NamedType>();
+
+const isNamespaceDirective = const TypeMatcher<NamespaceDirective>();
+
+const isNativeClause = const TypeMatcher<NativeClause>();
+
+const isNativeFunctionBody = const TypeMatcher<NativeFunctionBody>();
+
+const isNormalFormalParameter = const TypeMatcher<NormalFormalParameter>();
+
+const isNullLiteral = const TypeMatcher<NullLiteral>();
+
+const isOnClause = const TypeMatcher<OnClause>();
+
+const isParenthesizedExpression = const TypeMatcher<ParenthesizedExpression>();
+
+const isPartDirective = const TypeMatcher<PartDirective>();
+
+const isPartOfDirective = const TypeMatcher<PartOfDirective>();
+
+const isPostfixExpression = const TypeMatcher<PostfixExpression>();
+
+const isPrefixedIdentifier = const TypeMatcher<PrefixedIdentifier>();
+
+const isPrefixExpression = const TypeMatcher<PrefixExpression>();
+
+const isPropertyAccess = const TypeMatcher<PropertyAccess>();
+
+const isRedirectingConstructorInvocation =
+    const TypeMatcher<RedirectingConstructorInvocation>();
+
+const isRethrowExpression = const TypeMatcher<RethrowExpression>();
+
+const isReturnStatement = const TypeMatcher<ReturnStatement>();
+
+const isScriptTag = const TypeMatcher<ScriptTag>();
+
+const isSetLiteral = const TypeMatcher<SetLiteral>();
+
+const isShowCombinator = const TypeMatcher<ShowCombinator>();
+
+const isSimpleFormalParameter = const TypeMatcher<SimpleFormalParameter>();
+
+const isSimpleIdentifier = const TypeMatcher<SimpleIdentifier>();
+
+const isSimpleStringLiteral = const TypeMatcher<SimpleStringLiteral>();
+
+const isSingleStringLiteral = const TypeMatcher<SingleStringLiteral>();
+
+const isStatement = const TypeMatcher<Statement>();
+
+const isStringInterpolation = const TypeMatcher<StringInterpolation>();
+
+const isStringLiteral = const TypeMatcher<StringLiteral>();
+
+const isSuperConstructorInvocation =
+    const TypeMatcher<SuperConstructorInvocation>();
+
+const isSuperExpression = const TypeMatcher<SuperExpression>();
+
+const isSwitchCase = const TypeMatcher<SwitchCase>();
+
+const isSwitchDefault = const TypeMatcher<SwitchDefault>();
+
+const isSwitchMember = const TypeMatcher<SwitchMember>();
+
+const isSwitchStatement = const TypeMatcher<SwitchStatement>();
+
+const isSymbolLiteral = const TypeMatcher<SymbolLiteral>();
+
+const isThisExpression = const TypeMatcher<ThisExpression>();
+
+const isThrowExpression = const TypeMatcher<ThrowExpression>();
+
+const isTopLevelVariableDeclaration =
+    const TypeMatcher<TopLevelVariableDeclaration>();
+
+const isTryStatement = const TypeMatcher<TryStatement>();
+
+const isTypeAlias = const TypeMatcher<TypeAlias>();
+
+const isTypeAnnotation = const TypeMatcher<TypeAnnotation>();
+
+const isTypeArgumentList = const TypeMatcher<TypeArgumentList>();
+
+const isTypedLiteral = const TypeMatcher<TypedLiteral>();
+
+const isTypeName = const TypeMatcher<TypeName>();
+
+const isTypeParameter = const TypeMatcher<TypeParameter>();
+
+const isTypeParameterList = const TypeMatcher<TypeParameterList>();
+
+const isUriBasedDirective = const TypeMatcher<UriBasedDirective>();
+
+const isVariableDeclaration = const TypeMatcher<VariableDeclaration>();
+
+const isVariableDeclarationList = const TypeMatcher<VariableDeclarationList>();
+
+const isVariableDeclarationStatement =
+    const TypeMatcher<VariableDeclarationStatement>();
+
+const isWhileStatement = const TypeMatcher<WhileStatement>();
+
+const isWithClause = const TypeMatcher<WithClause>();
+
+const isYieldStatement = const TypeMatcher<YieldStatement>();
diff --git a/pkg/analyzer/test/util/element_type_matchers.dart b/pkg/analyzer/test/util/element_type_matchers.dart
new file mode 100644
index 0000000..c141414
--- /dev/null
+++ b/pkg/analyzer/test/util/element_type_matchers.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/element/element.dart';
+import 'package:test/test.dart';
+
+const isClassElement = const TypeMatcher<ClassElement>();
+
+const isClassMemberElement = const TypeMatcher<ClassMemberElement>();
+
+const isCompilationUnitElement = const TypeMatcher<CompilationUnitElement>();
+
+const isConstructorElement = const TypeMatcher<ConstructorElement>();
+
+const isElementAnnotation = const TypeMatcher<ElementAnnotation>();
+
+const isExecutableElement = const TypeMatcher<ExecutableElement>();
+
+const isExportElement = const TypeMatcher<ExportElement>();
+
+const isFieldElement = const TypeMatcher<FieldElement>();
+
+const isFieldFormalParameterElement =
+    const TypeMatcher<FieldFormalParameterElement>();
+
+const isFunctionElement = const TypeMatcher<FunctionElement>();
+
+const isFunctionTypeAliasElement =
+    const TypeMatcher<FunctionTypeAliasElement>();
+
+const isFunctionTypedElement = const TypeMatcher<FunctionTypedElement>();
+
+const isGenericFunctionTypeElement =
+    const TypeMatcher<GenericFunctionTypeElement>();
+
+const isGenericTypeAliasElement = const TypeMatcher<GenericTypeAliasElement>();
+
+const isHideElementCombinator = const TypeMatcher<HideElementCombinator>();
+
+const isImportElement = const TypeMatcher<ImportElement>();
+
+const isLabelElement = const TypeMatcher<LabelElement>();
+
+const isLibraryElement = const TypeMatcher<LibraryElement>();
+
+const isLocalElement = const TypeMatcher<LocalElement>();
+
+const isLocalVariableElement = const TypeMatcher<LocalVariableElement>();
+
+const isMethodElement = const TypeMatcher<MethodElement>();
+
+const isNamespaceCombinator = const TypeMatcher<NamespaceCombinator>();
+
+const isParameterElement = const TypeMatcher<ParameterElement>();
+
+const isPrefixElement = const TypeMatcher<PrefixElement>();
+
+const isPropertyAccessorElement = const TypeMatcher<PropertyAccessorElement>();
+
+const isPropertyInducingElement = const TypeMatcher<PropertyInducingElement>();
+
+const isShowElementCombinator = const TypeMatcher<ShowElementCombinator>();
+
+const isTopLevelVariableElement = const TypeMatcher<TopLevelVariableElement>();
+
+const isTypeDefiningElement = const TypeMatcher<TypeDefiningElement>();
+
+const isTypeParameterElement = const TypeMatcher<TypeParameterElement>();
+
+const isTypeParameterizedElement =
+    const TypeMatcher<TypeParameterizedElement>();
+
+const isUriReferencedElement = const TypeMatcher<UriReferencedElement>();
+
+const isVariableElement = const TypeMatcher<VariableElement>();
diff --git a/pkg/analyzer/tool/messages/generate.dart b/pkg/analyzer/tool/messages/generate.dart
index dc7e1cb..b0e7c53 100644
--- a/pkg/analyzer/tool/messages/generate.dart
+++ b/pkg/analyzer/tool/messages/generate.dart
@@ -18,6 +18,7 @@
 import 'package:analyzer/src/codegen/tools.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:front_end/src/testing/package_root.dart' as pkgRoot;
+import 'package:front_end/src/fasta/scanner.dart';
 import 'package:path/path.dart';
 import 'package:yaml/yaml.dart' show loadYaml;
 
@@ -33,9 +34,12 @@
   String syntacticErrorsSource = new File(join(analyzerPkgPath,
           joinAll(posix.split('lib/src/dart/error/syntactic_errors.dart'))))
       .readAsStringSync();
+  String parserSource = new File(join(frontEndPkgPath,
+          joinAll(posix.split('lib/src/fasta/parser/parser.dart'))))
+      .readAsStringSync();
 
   final codeGenerator = new _SyntacticErrorGenerator(
-      messagesYaml, errorConverterSource, syntacticErrorsSource);
+      messagesYaml, errorConverterSource, syntacticErrorsSource, parserSource);
 
   await GeneratedContent.generateAll(analyzerPkgPath, <GeneratedContent>[
     new GeneratedFile('lib/src/dart/error/syntactic_errors.g.dart',
@@ -68,7 +72,6 @@
 List<String> nameForEntry(Map entry) {
   final analyzerCode = entry['analyzerCode'];
   if (analyzerCode is String) {
-    // TODO(danrubel): Revise to handle others such as ScannerErrorCode.
     if (!analyzerCode.startsWith('ParserErrorCode.')) {
       throw invalidAnalyzerCode;
     }
@@ -85,7 +88,9 @@
   final Map messagesYaml;
   final String errorConverterSource;
   final String syntacticErrorsSource;
+  final String parserSource;
   final translatedEntries = <Map>[];
+  final translatedFastaErrorCodes = new Set<String>();
   final out = new StringBuffer('''
 //
 // THIS FILE IS GENERATED. DO NOT EDIT.
@@ -96,8 +101,9 @@
 part of 'syntactic_errors.dart';
 
 ''');
-  _SyntacticErrorGenerator(
-      this.messagesYaml, this.errorConverterSource, this.syntacticErrorsSource);
+
+  _SyntacticErrorGenerator(this.messagesYaml, this.errorConverterSource,
+      this.syntacticErrorsSource, this.parserSource);
 
   void checkForManualChanges() {
     // Check for ParserErrorCodes that could be removed from
@@ -200,6 +206,7 @@
     messagesYaml.forEach((name, entry) {
       if (entry is Map) {
         if (entry['index'] is int && entry['analyzerCode'] is String) {
+          translatedFastaErrorCodes.add(name);
           translatedEntries.add(entry);
         }
       }
@@ -262,5 +269,47 @@
         print('  ${analyzerToFasta.length} total');
       }
     }
+
+    // List error codes in the parser that have not been translated.
+    final untranslatedFastaErrorCodes = new Set<String>();
+    Token token = scanString(parserSource).tokens;
+    while (!token.isEof) {
+      if (token.isIdentifier) {
+        String fastaErrorCode;
+        String lexeme = token.lexeme;
+        if (lexeme.length > 7) {
+          if (lexeme.startsWith('message')) {
+            fastaErrorCode = lexeme.substring(7);
+          } else if (lexeme.length > 8) {
+            if (lexeme.startsWith('template')) {
+              fastaErrorCode = lexeme.substring(8);
+            }
+          }
+        }
+        if (fastaErrorCode != null &&
+            !translatedFastaErrorCodes.contains(fastaErrorCode)) {
+          untranslatedFastaErrorCodes.add(fastaErrorCode);
+        }
+      }
+      token = token.next;
+    }
+    if (untranslatedFastaErrorCodes.isNotEmpty) {
+      print('');
+      print('The following error codes in the parser are not auto generated:');
+      final sorted = untranslatedFastaErrorCodes.toList()..sort();
+      for (String fastaErrorCode in sorted) {
+        String analyzerCode = '';
+        String template = '';
+        var entry = messagesYaml[fastaErrorCode];
+        if (entry is Map) {
+          if (entry['index'] is! int && entry['analyzerCode'] is String) {
+            analyzerCode = entry['analyzerCode'];
+            template = entry['template'];
+          }
+        }
+        print('  ${fastaErrorCode.padRight(30)} --> $analyzerCode'
+            '\n      $template');
+      }
+    }
   }
 }
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index 23b6c43..d99b76a 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -21,6 +21,7 @@
 import 'dart:io';
 
 import 'package:analyzer/src/codegen/tools.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
 import 'package:front_end/src/scanner/token.dart' show Token;
 import 'package:front_end/src/testing/package_root.dart' as package_root;
@@ -85,6 +86,7 @@
     var startingToken = scanner.tokenize();
     var listener = new MiniAstBuilder();
     var parser = new MiniAstParser(listener);
+    parser.enableSetLiterals = IsEnabledByDefault.set_literals;
     parser.parseUnit(startingToken);
     extractIdl(listener.compilationUnit);
     checkIdl();
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 2559cb9..031b497 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -478,8 +478,9 @@
   }
 
   @override
-  void handleType(Token beginToken) {
+  void handleType(Token beginToken, Token questionMark) {
     debugEvent("Type");
+    reportErrorIfNullableType(questionMark);
     List<TypeName> typeArguments = popTypedList();
     String name = pop();
     push(new TypeName(name, typeArguments));
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
index 739ac6c..3a9aa7b 100644
--- a/pkg/analyzer/tool/task_dependency_graph/generate.dart
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -19,13 +19,18 @@
 import 'dart:io' hide File;
 import 'dart:io' as io;
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/codegen/tools.dart';
 import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/constant.dart';
@@ -35,9 +40,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/source/package_map_resolver.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/codegen/tools.dart';
 import 'package:front_end/src/testing/package_root.dart' as package_root;
 import 'package:path/path.dart' as path;
 import 'package:path/path.dart';
diff --git a/pkg/analyzer_cli/README.md b/pkg/analyzer_cli/README.md
index db0a161..19054e3 100644
--- a/pkg/analyzer_cli/README.md
+++ b/pkg/analyzer_cli/README.md
@@ -3,8 +3,8 @@
 Use _dartanalyzer_ to statically analyze your code at the command line,
 checking for errors and warnings that are specified in the
 [Dart Language Specification](https://www.dartlang.org/docs/spec/).
-DartPad, code editors, and IDEs such as WebStorm use the same
-analysis engine that dartanalyzer uses.
+DartPad, code editors, and IDEs such as Android Studio and VS Code
+use the same analysis engine that dartanalyzer uses.
 
 ## Basic usage
 
diff --git a/pkg/analyzer_cli/bin/analyzer.dart b/pkg/analyzer_cli/bin/analyzer.dart
index 8e2bbd2..45b7bc3 100644
--- a/pkg/analyzer_cli/bin/analyzer.dart
+++ b/pkg/analyzer_cli/bin/analyzer.dart
@@ -1,11 +1,12 @@
 #!/usr/bin/env dart
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer_cli/starter.dart';
 import 'dart:isolate';
 
+import 'package:analyzer_cli/starter.dart';
+
 /// The entry point for the command-line analyzer.
 ///
 /// [sendPort] may be passed in when started in an isolate. If provided, it is
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 1974fc4..617bdf9 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -1,12 +1,11 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer_cli.src.analyzer_impl;
-
 import 'dart:async';
 import 'dart:io';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/exception/exception.dart';
@@ -121,7 +120,7 @@
   }
 
   /// Fills [errorInfos] using [files].
-  Future<Null> prepareErrors() async {
+  Future<void> prepareErrors() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     PerformanceTag previous = _prepareErrorsTag.makeCurrent();
diff --git a/pkg/analyzer_cli/lib/src/ansi.dart b/pkg/analyzer_cli/lib/src/ansi.dart
index 1b9a539..1f94f9e 100644
--- a/pkg/analyzer_cli/lib/src/ansi.dart
+++ b/pkg/analyzer_cli/lib/src/ansi.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/lib/src/batch_mode.dart b/pkg/analyzer_cli/lib/src/batch_mode.dart
index 5bd75b0..f96a48c 100644
--- a/pkg/analyzer_cli/lib/src/batch_mode.dart
+++ b/pkg/analyzer_cli/lib/src/batch_mode.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 206341a..2c64108 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -1,18 +1,20 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer_cli.src.build_mode;
-
 import 'dart:async';
 import 'dart:io' as io;
 import 'dart:isolate';
 
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/cache.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
@@ -35,9 +37,6 @@
 import 'package:bazel_worker/bazel_worker.dart';
 import 'package:collection/collection.dart';
 import 'package:convert/convert.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/dart/analysis/cache.dart';
 
 /**
  * Persistent Bazel worker.
@@ -58,14 +57,6 @@
         resourceProvider, logger, 256 * 1024 * 1024);
   }
 
-  factory AnalyzerWorkerLoop.std(ResourceProvider resourceProvider,
-      {io.Stdin stdinStream, io.Stdout stdoutStream, String dartSdkPath}) {
-    AsyncWorkerConnection connection = new StdAsyncWorkerConnection(
-        inputStream: stdinStream, outputStream: stdoutStream);
-    return new AnalyzerWorkerLoop(resourceProvider, connection,
-        dartSdkPath: dartSdkPath);
-  }
-
   factory AnalyzerWorkerLoop.sendPort(
       ResourceProvider resourceProvider, SendPort sendPort,
       {String dartSdkPath}) {
@@ -75,10 +66,18 @@
         dartSdkPath: dartSdkPath);
   }
 
+  factory AnalyzerWorkerLoop.std(ResourceProvider resourceProvider,
+      {io.Stdin stdinStream, io.Stdout stdoutStream, String dartSdkPath}) {
+    AsyncWorkerConnection connection = new StdAsyncWorkerConnection(
+        inputStream: stdinStream, outputStream: stdoutStream);
+    return new AnalyzerWorkerLoop(resourceProvider, connection,
+        dartSdkPath: dartSdkPath);
+  }
+
   /**
    * Performs analysis with given [options].
    */
-  Future<Null> analyze(
+  Future<void> analyze(
       CommandLineOptions options, Map<String, WorkerInput> inputs) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -148,7 +147,7 @@
    * Run the worker loop.
    */
   @override
-  Future<Null> run() async {
+  Future<void> run() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     errorSink = errorBuffer;
@@ -174,7 +173,7 @@
 /**
  * Analyzer used when the "--build-mode" option is supplied.
  */
-class BuildMode extends Object with HasContextMixin {
+class BuildMode with HasContextMixin {
   final ResourceProvider resourceProvider;
   final CommandLineOptions options;
   final AnalysisStats stats;
@@ -192,7 +191,6 @@
   AnalysisDriver analysisDriver;
 
   PackageBundleAssembler assembler;
-  final Set<Source> processedSources = new Set<Source>();
   final Map<String, UnlinkedUnit> uriToUnit = <String, UnlinkedUnit>{};
 
   BuildMode(this.resourceProvider, this.options, this.stats, this.contextCache,
@@ -474,7 +472,7 @@
    *
    * Otherwise compute it and store into the [uriToUnit] and [assembler].
    */
-  Future<Null> _prepareUnlinkedUnit(String absoluteUri) async {
+  Future<void> _prepareUnlinkedUnit(String absoluteUri) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // Maybe an input package contains the source.
@@ -499,7 +497,7 @@
    * Print errors for all explicit sources.  If [outputPath] is supplied, output
    * is sent to a new file at that path.
    */
-  Future<Null> _printErrors({String outputPath}) async {
+  Future<void> _printErrors({String outputPath}) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     await logger.runAsync('Compute and print analysis errors', () async {
diff --git a/pkg/analyzer_cli/lib/src/context_cache.dart b/pkg/analyzer_cli/lib/src/context_cache.dart
index 0e875ce..808a4f9 100644
--- a/pkg/analyzer_cli/lib/src/context_cache.dart
+++ b/pkg/analyzer_cli/lib/src/context_cache.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -18,7 +18,7 @@
 
   /// A mapping from normalized paths (currently, directories) to cache entries
   /// which include builder, analysis_options paths, and [AnalysisOptionImpl]s.
-  Map<String, ContextCacheEntry> _byDirectory = {};
+  final Map<String, ContextCacheEntry> _byDirectory = {};
 
   ContextCache(this.resourceProvider, this.clOptions, this.verbosePrint);
 
@@ -87,15 +87,16 @@
   /// automatically.
   AnalysisOptionsImpl _getAnalysisOptions() {
     AnalysisOptionsImpl contextOptions = builder.getAnalysisOptions(
-        requestedSourceDirectory,
-        verbosePrint: clOptions.verbose ? verbosePrint : null);
+            requestedSourceDirectory,
+            verbosePrint: clOptions.verbose ? verbosePrint : null)
+        as AnalysisOptionsImpl;
 
     contextOptions.trackCacheDependencies = false;
     contextOptions.disableCacheFlushing = clOptions.disableCacheFlushing;
+    contextOptions.enabledExperiments = clOptions.enabledExperiments;
     contextOptions.hint = !clOptions.disableHints;
     contextOptions.generateImplicitErrors = clOptions.showPackageWarnings;
     contextOptions.generateSdkErrors = clOptions.showSdkWarnings;
-    contextOptions.previewDart2 = clOptions.previewDart2;
     contextOptions.useFastaParser = clOptions.useFastaParser;
     return contextOptions;
   }
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 63ed79f..8b2b808 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,7 +7,6 @@
 import 'dart:isolate';
 
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/file_system/file_system.dart' as file_system;
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/context/builder.dart';
@@ -93,11 +92,11 @@
   _analytics = replacementAnalytics;
 }
 
-class Driver extends Object with HasContextMixin implements CommandLineStarter {
+class Driver with HasContextMixin implements CommandLineStarter {
   static final PerformanceTag _analyzeAllTag =
       new PerformanceTag("Driver._analyzeAll");
 
-  static ByteStore analysisDriverMemoryByteStore = new MemoryByteStore();
+  static final ByteStore analysisDriverMemoryByteStore = new MemoryByteStore();
 
   ContextCache contextCache;
 
@@ -125,8 +124,8 @@
   /**
    * The resource provider used to access the file system.
    */
-  file_system.ResourceProvider resourceProvider =
-      PhysicalResourceProvider.INSTANCE;
+  @override
+  final ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
 
   /// Collected analysis statistics.
   final AnalysisStats stats = new AnalysisStats();
@@ -166,9 +165,7 @@
   }
 
   @override
-  Future<Null> start(List<String> args, {SendPort sendPort}) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
+  Future<void> start(List<String> args, {SendPort sendPort}) async {
     if (analysisDriver != null) {
       throw new StateError("start() can only be called once");
     }
@@ -357,7 +354,7 @@
         var shortName = resourceProvider.pathContext.basename(path);
         if (shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE ||
             shortName == AnalysisEngine.ANALYSIS_OPTIONS_FILE) {
-          file_system.File file = resourceProvider.getFile(path);
+          File file = resourceProvider.getFile(path);
           String content = file.readAsStringSync();
           LineInfo lineInfo = new LineInfo.fromContent(content);
           List<AnalysisError> errors =
@@ -373,7 +370,7 @@
           }
         } else if (shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
           try {
-            file_system.File file = resourceProvider.getFile(path);
+            File file = resourceProvider.getFile(path);
             String content = file.readAsStringSync();
             YamlNode node = loadYamlNode(content);
             if (node is YamlMap) {
@@ -472,14 +469,14 @@
   /// In this situation, [analysisOptions] is ignored and can be `null`.
   SourceFactory _chooseUriResolutionPolicy(
       CommandLineOptions options,
-      Map<file_system.Folder, YamlMap> embedderMap,
+      Map<Folder, YamlMap> embedderMap,
       _PackageInfo packageInfo,
       SummaryDataStore summaryDataStore,
       bool includeSdkResolver,
       AnalysisOptions analysisOptions) {
     // Create a custom package resolver if one has been specified.
     if (packageResolverProvider != null) {
-      file_system.Folder folder = resourceProvider.getResource('.');
+      Folder folder = resourceProvider.getFolder('.');
       UriResolver resolver = packageResolverProvider(folder);
       if (resolver != null) {
         // TODO(brianwilkerson) This doesn't handle sdk extensions.
@@ -610,7 +607,7 @@
     _PackageInfo packageInfo = _findPackages(options);
 
     // Process embedders.
-    Map<file_system.Folder, YamlMap> embedderMap =
+    Map<Folder, YamlMap> embedderMap =
         new EmbedderYamlLocator(packageInfo.packageMap).embedderYamls;
 
     // Scan for SDK extenders.
@@ -679,7 +676,7 @@
     }
 
     Packages packages;
-    Map<String, List<file_system.Folder>> packageMap;
+    Map<String, List<Folder>> packageMap;
 
     if (options.packageConfigPath != null) {
       String packageConfigPath = options.packageConfigPath;
@@ -698,7 +695,7 @@
       packageMap = _PackageRootPackageMapBuilder.buildPackageMap(
           options.packageRootPath);
     } else {
-      file_system.Resource cwd = resourceProvider.getResource(path.current);
+      Resource cwd = resourceProvider.getResource(path.current);
       // Look for .packages.
       packages = _discoverPackagespec(new Uri.directory(cwd.path));
       packageMap = _getPackageMap(packages);
@@ -707,13 +704,12 @@
     return new _PackageInfo(packages, packageMap);
   }
 
-  Map<String, List<file_system.Folder>> _getPackageMap(Packages packages) {
+  Map<String, List<Folder>> _getPackageMap(Packages packages) {
     if (packages == null) {
       return null;
     }
 
-    Map<String, List<file_system.Folder>> folderMap =
-        new Map<String, List<file_system.Folder>>();
+    Map<String, List<Folder>> folderMap = new Map<String, List<Folder>>();
     var pathContext = resourceProvider.pathContext;
     packages.asMap().forEach((String packagePath, Uri uri) {
       String path = fileUriToNormalizedPath(pathContext, uri);
@@ -722,11 +718,11 @@
     return folderMap;
   }
 
-  bool _hasSdkExt(Iterable<List<file_system.Folder>> folders) {
+  bool _hasSdkExt(Iterable<List<Folder>> folders) {
     if (folders != null) {
       //TODO: ideally share this traversal with SdkExtUriResolver
-      for (Iterable<file_system.Folder> libDirs in folders) {
-        if (libDirs.any((file_system.Folder libDir) =>
+      for (Iterable<Folder> libDirs in folders) {
+        if (libDirs.any((Folder libDir) =>
             libDir.getChild(SdkExtUriResolver.SDK_EXT_NAME).exists)) {
           return true;
         }
@@ -800,48 +796,23 @@
   /// Return whether the [newOptions] are equal to the [previous].
   static bool _equalCommandLineOptions(
       CommandLineOptions previous, CommandLineOptions newOptions) {
-    if (previous == null || newOptions == null) {
-      return false;
-    }
-    if (newOptions.packageRootPath != previous.packageRootPath) {
-      return false;
-    }
-    if (newOptions.packageConfigPath != previous.packageConfigPath) {
-      return false;
-    }
-    if (!_equalMaps(newOptions.definedVariables, previous.definedVariables)) {
-      return false;
-    }
-    if (newOptions.log != previous.log) {
-      return false;
-    }
-    if (newOptions.disableHints != previous.disableHints) {
-      return false;
-    }
-    if (newOptions.showPackageWarnings != previous.showPackageWarnings) {
-      return false;
-    }
-    if (newOptions.showPackageWarningsPrefix !=
-        previous.showPackageWarningsPrefix) {
-      return false;
-    }
-    if (newOptions.showSdkWarnings != previous.showSdkWarnings) {
-      return false;
-    }
-    if (newOptions.lints != previous.lints) {
-      return false;
-    }
-    if (newOptions.strongMode != previous.strongMode) {
-      return false;
-    }
-    if (!_equalLists(
-        newOptions.buildSummaryInputs, previous.buildSummaryInputs)) {
-      return false;
-    }
-    if (newOptions.disableCacheFlushing != previous.disableCacheFlushing) {
-      return false;
-    }
-    return true;
+    return previous != null &&
+        newOptions != null &&
+        newOptions.packageRootPath == previous.packageRootPath &&
+        newOptions.packageConfigPath == previous.packageConfigPath &&
+        _equalMaps(newOptions.definedVariables, previous.definedVariables) &&
+        newOptions.log == previous.log &&
+        newOptions.disableHints == previous.disableHints &&
+        newOptions.showPackageWarnings == previous.showPackageWarnings &&
+        newOptions.showPackageWarningsPrefix ==
+            previous.showPackageWarningsPrefix &&
+        newOptions.showSdkWarnings == previous.showSdkWarnings &&
+        newOptions.lints == previous.lints &&
+        newOptions.strongMode == previous.strongMode &&
+        _equalLists(
+            newOptions.buildSummaryInputs, previous.buildSummaryInputs) &&
+        newOptions.disableCacheFlushing == previous.disableCacheFlushing &&
+        _equalLists(newOptions.enabledExperiments, previous.enabledExperiments);
   }
 
   /// Perform a deep comparison of two string lists.
@@ -872,14 +843,14 @@
 }
 
 class _DriverError implements Exception {
-  String msg;
+  final String msg;
 
   _DriverError(this.msg);
 }
 
 class _PackageInfo {
-  Packages packages;
-  Map<String, List<file_system.Folder>> packageMap;
+  final Packages packages;
+  final Map<String, List<Folder>> packageMap;
 
   _PackageInfo(this.packages, this.packageMap);
 }
@@ -890,15 +861,14 @@
 /// [_PackageRootPackageMapBuilder] creates a simple mapping from package name
 /// to full path on disk (resolving any symbolic links).
 class _PackageRootPackageMapBuilder {
-  static Map<String, List<file_system.Folder>> buildPackageMap(
-      String packageRootPath) {
+  static Map<String, List<Folder>> buildPackageMap(String packageRootPath) {
     var packageRoot = new io.Directory(packageRootPath);
     if (!packageRoot.existsSync()) {
       throw new _DriverError(
           'Package root directory ($packageRootPath) does not exist.');
     }
     var packages = packageRoot.listSync(followLinks: false);
-    var result = new Map<String, List<file_system.Folder>>();
+    var result = new Map<String, List<Folder>>();
     for (var package in packages) {
       var packageName = path.basename(package.path);
       var realPath = package.resolveSymbolicLinksSync();
diff --git a/pkg/analyzer_cli/lib/src/error_formatter.dart b/pkg/analyzer_cli/lib/src/error_formatter.dart
index 0c84618..72ea9ed 100644
--- a/pkg/analyzer_cli/lib/src/error_formatter.dart
+++ b/pkg/analyzer_cli/lib/src/error_formatter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -211,7 +211,7 @@
   AnsiLogger ansi;
 
   // This is a Set in order to de-dup CLI errors.
-  Set<CLIError> batchedErrors = new Set();
+  final Set<CLIError> batchedErrors = new Set();
 
   HumanErrorFormatter(
       StringSink out, CommandLineOptions options, AnalysisStats stats,
@@ -262,7 +262,7 @@
   void formatError(
       Map<AnalysisError, LineInfo> errorToLine, AnalysisError error) {
     Source source = error.source;
-    CharacterLocation location = errorToLine[error].getLocation(error.offset);
+    var location = errorToLine[error].getLocation(error.offset);
 
     ErrorSeverity severity = _severityProcessor(error);
 
@@ -323,7 +323,7 @@
   void formatError(
       Map<AnalysisError, LineInfo> errorToLine, AnalysisError error) {
     Source source = error.source;
-    CharacterLocation location = errorToLine[error].getLocation(error.offset);
+    var location = errorToLine[error].getLocation(error.offset);
     int length = error.length;
 
     ErrorSeverity severity = _severityProcessor(error);
diff --git a/pkg/analyzer_cli/lib/src/error_severity.dart b/pkg/analyzer_cli/lib/src/error_severity.dart
index 71a2d7a..e43d77c 100644
--- a/pkg/analyzer_cli/lib/src/error_severity.dart
+++ b/pkg/analyzer_cli/lib/src/error_severity.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/lib/src/has_context_mixin.dart b/pkg/analyzer_cli/lib/src/has_context_mixin.dart
index 8b51af6..1159f56 100644
--- a/pkg/analyzer_cli/lib/src/has_context_mixin.dart
+++ b/pkg/analyzer_cli/lib/src/has_context_mixin.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 640fd1a..81712bc 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -7,6 +7,7 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/util/sdk.dart';
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
 import 'package:analyzer_cli/src/driver.dart';
@@ -35,9 +36,6 @@
 
 /// Analyzer commandline configuration options.
 class CommandLineOptions {
-  /// Whether declaration casts are enabled (in strong mode)
-  final bool declarationCasts;
-
   /// The path to output analysis results when in build mode.
   final String buildAnalysisOutput;
 
@@ -76,11 +74,8 @@
   /// The path to the dart SDK.
   String dartSdkPath;
 
-  /// The path to the folder with the 'vm_platform.dill' file.
-  String dartSdkPlatformBinariesPath;
-
   /// The path to the dart SDK summary file.
-  String dartSdkSummaryPath;
+  final String dartSdkSummaryPath;
 
   /// Whether to disable cache flushing.  This option can improve analysis
   /// speed at the expense of memory usage.  It may also be useful for working
@@ -93,6 +88,9 @@
   /// Whether to display version information
   final bool displayVersion;
 
+  /// A list of the names of the experiments that are to be enabled.
+  final List<String> enabledExperiments;
+
   /// Whether to ignore unrecognized flags
   final bool ignoreUnrecognizedFlags;
 
@@ -138,16 +136,10 @@
   /// This flag is deprecated and hard-coded to `true`.
   final bool strongMode = true;
 
-  /// Whether implicit casts are enabled (in strong mode)
-  final bool implicitCasts;
-
-  /// Whether implicit dynamic is enabled (mainly for strong mode users)
-  final bool implicitDynamic;
-
   /// Whether to treat lints as fatal
+  // TODO(devoncarew): Deprecate and remove this flag.
   final bool lintsAreFatal;
 
-  // TODO(devoncarew): Deprecate and remove this flag.
   /// Emit output in a verbose mode.
   final bool verbose;
 
@@ -176,12 +168,11 @@
         contextBuilderOptions = createContextBuilderOptions(args),
         dartSdkPath = cast(args['dart-sdk']),
         dartSdkSummaryPath = cast(args['dart-sdk-summary']),
-        declarationCasts = args.wasParsed(declarationCastsFlag)
-            ? cast(args[declarationCastsFlag])
-            : cast(args[implicitCastsFlag]),
         disableCacheFlushing = cast(args['disable-cache-flushing']),
         disableHints = cast(args['no-hints']),
         displayVersion = cast(args['version']),
+        enabledExperiments =
+            cast(args['enable-experiment'] ?? const <String>[]),
         ignoreUnrecognizedFlags = cast(args['ignore-unrecognized-flags']),
         lints = cast(args[lintsFlag]),
         log = cast(args['log']),
@@ -198,8 +189,6 @@
         infosAreFatal = cast(args['fatal-infos']) || cast(args['fatal-hints']),
         warningsAreFatal = cast(args['fatal-warnings']),
         lintsAreFatal = cast(args['fatal-lints']),
-        implicitCasts = cast(args[implicitCastsFlag]),
-        implicitDynamic = !cast<bool>(args['no-implicit-dynamic']),
         trainSnapshot = cast(args['train-snapshot']),
         verbose = cast(args['verbose']),
         color = cast(args['color']);
@@ -219,11 +208,6 @@
   String get packageRootPath =>
       contextBuilderOptions.defaultPackagesDirectoryPath;
 
-  /// Whether to enable the Dart 2.0 Preview.
-  ///
-  /// This flag is deprecated and hard-coded to `true`.
-  bool get previewDart2 => true;
-
   /// The source files to analyze
   List<String> get sourceFiles => _sourceFiles;
 
@@ -261,9 +245,6 @@
         printAndFail('Invalid Dart SDK path: $sdkPath');
         return null; // Only reachable in testing.
       }
-
-      options.dartSdkPlatformBinariesPath =
-          computePlatformBinariesPath(sdkPath);
     }
 
     // Check package config.
@@ -338,6 +319,11 @@
           help: 'Print the analyzer version.',
           defaultsTo: false,
           negatable: false)
+      ..addMultiOption('enable-experiment',
+          help:
+              'Enable one or more experimental features. If multiple features '
+              'are being added, they should be comma separated.',
+          splitCommas: true)
       ..addFlag('no-hints',
           help: 'Do not show hint results.',
           defaultsTo: false,
@@ -592,6 +578,23 @@
             'Note: the --strong flag is deprecated and will be removed in an '
             'future release.\n');
       }
+      if (results.wasParsed('enable-experiment')) {
+        List<String> names =
+            (results['enable-experiment'] as List).cast<String>().toList();
+        bool errorFound = false;
+        for (var validationResult in validateFlags(names)) {
+          if (validationResult.isError) {
+            errorFound = true;
+          }
+          var kind = validationResult.isError ? 'ERROR' : 'WARNING';
+          errorSink.writeln('$kind: ${validationResult.message}');
+        }
+        if (errorFound) {
+          _showUsage(parser, null);
+          exitHandler(15);
+          return null; // Only reachable in testing.
+        }
+      }
 
       return new CommandLineOptions._fromArgs(results);
     } on FormatException catch (e) {
diff --git a/pkg/analyzer_cli/lib/src/perf_report.dart b/pkg/analyzer_cli/lib/src/perf_report.dart
index e9227a9..0463ddd 100644
--- a/pkg/analyzer_cli/lib/src/perf_report.dart
+++ b/pkg/analyzer_cli/lib/src/perf_report.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -13,7 +13,7 @@
 
 const _JSON = const JsonEncoder.withIndent("  ");
 
-String _osType = () {
+final String _osType = () {
   if (Platform.isLinux) {
     return "linux";
   } else if (Platform.isMacOS) {
diff --git a/pkg/analyzer_cli/lib/starter.dart b/pkg/analyzer_cli/lib/starter.dart
index 4caa91f..09db5bf 100644
--- a/pkg/analyzer_cli/lib/starter.dart
+++ b/pkg/analyzer_cli/lib/starter.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -40,5 +40,5 @@
    * If [sendPort] is provided it is used for bazel worker communication
    * instead of stdin/stdout.
    */
-  Future<Null> start(List<String> arguments, {SendPort sendPort});
+  Future<void> start(List<String> arguments, {SendPort sendPort});
 }
diff --git a/pkg/analyzer_cli/test/all.dart b/pkg/analyzer_cli/test/all.dart
index b5015f7..a16799b 100644
--- a/pkg/analyzer_cli/test/all.dart
+++ b/pkg/analyzer_cli/test/all.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -6,7 +6,6 @@
 import 'build_mode_test.dart' as build_mode_test;
 import 'driver_test.dart' as driver_test;
 import 'embedder_test.dart' as embedder_test;
-import 'error_test.dart' as error_test;
 import 'errors_reported_once_test.dart' as errors_reported_once_test;
 import 'errors_upgrade_fails_cli_test.dart' as errors_upgrade_fails_cli_test;
 import 'options_test.dart' as options_test;
@@ -21,7 +20,6 @@
   build_mode_test.main();
   driver_test.main();
   embedder_test.main();
-  error_test.main();
   errors_reported_once_test.main();
   errors_upgrade_fails_cli_test.main();
   options_test.main();
diff --git a/pkg/analyzer_cli/test/analysis_options_test.dart b/pkg/analyzer_cli/test/analysis_options_test.dart
index b04f1a4..e8bd10a 100644
--- a/pkg/analyzer_cli/test/analysis_options_test.dart
+++ b/pkg/analyzer_cli/test/analysis_options_test.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 import 'dart:async';
 import 'dart:io';
 
@@ -71,7 +75,7 @@
 
   String get stdout => _stdout.toString();
 
-  Future<Null> run2(List<String> args) async {
+  Future<void> run2(List<String> args) async {
     await new Driver(isTesting: true).start(args);
     if (stderr.isNotEmpty) {
       fail("Unexpected output to stderr:\n$stderr");
diff --git a/pkg/analyzer_cli/test/build_mode_test.dart b/pkg/analyzer_cli/test/build_mode_test.dart
index 90655ef..25e884f 100644
--- a/pkg/analyzer_cli/test/build_mode_test.dart
+++ b/pkg/analyzer_cli/test/build_mode_test.dart
@@ -1,9 +1,7 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer_cli.test.built_mode;
-
 import 'dart:async';
 
 import 'package:analyzer/file_system/memory_file_system.dart';
@@ -32,7 +30,7 @@
       : super(new MemoryResourceProvider(), connection);
 
   @override
-  Future<Null> analyze(CommandLineOptions options, inputs) async {
+  Future<void> analyze(CommandLineOptions options, inputs) async {
     if (_analyze != null) {
       _analyze(options);
     }
diff --git a/pkg/analyzer_cli/test/data/embedder_client/embedder_yaml_user.dart b/pkg/analyzer_cli/test/data/embedder_client/embedder_yaml_user.dart
index 2d88a2a..8643286 100644
--- a/pkg/analyzer_cli/test/data/embedder_client/embedder_yaml_user.dart
+++ b/pkg/analyzer_cli/test/data/embedder_client/embedder_yaml_user.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/linter_project/test_file.dart b/pkg/analyzer_cli/test/data/linter_project/test_file.dart
index c1726a8..36319de 100644
--- a/pkg/analyzer_cli/test/data/linter_project/test_file.dart
+++ b/pkg/analyzer_cli/test/data/linter_project/test_file.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/no_lints_project/test_file.dart b/pkg/analyzer_cli/test/data/no_lints_project/test_file.dart
index 93088d6..c601c04 100644
--- a/pkg/analyzer_cli/test/data/no_lints_project/test_file.dart
+++ b/pkg/analyzer_cli/test/data/no_lints_project/test_file.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/no_packages_file/sdk_ext_user.dart b/pkg/analyzer_cli/test/data/no_packages_file/sdk_ext_user.dart
index b346f7f..1a5f662 100644
--- a/pkg/analyzer_cli/test/data/no_packages_file/sdk_ext_user.dart
+++ b/pkg/analyzer_cli/test/data/no_packages_file/sdk_ext_user.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
index f4f9491..05bc617 100644
--- a/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
+++ b/pkg/analyzer_cli/test/data/options_include_directive_tests_project/lib/test_file.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/options_tests_project/test_file.dart b/pkg/analyzer_cli/test/data/options_tests_project/test_file.dart
index 21308e4..1160fe1 100644
--- a/pkg/analyzer_cli/test/data/options_tests_project/test_file.dart
+++ b/pkg/analyzer_cli/test/data/options_tests_project/test_file.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/async.dart b/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/async.dart
index 78eb5c2..7c38a26 100644
--- a/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/async.dart
+++ b/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/async.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/core.dart b/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/core.dart
index cf2d05a..de47fc2 100644
--- a/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/core.dart
+++ b/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/core.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/grizzly.dart b/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/grizzly.dart
index d575643..abc1a2f 100644
--- a/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/grizzly.dart
+++ b/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/grizzly.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/package_with_sdk_extension/lib/foo.dart b/pkg/analyzer_cli/test/data/package_with_sdk_extension/lib/foo.dart
index c56eef9..71e91c8 100644
--- a/pkg/analyzer_cli/test/data/package_with_sdk_extension/lib/foo.dart
+++ b/pkg/analyzer_cli/test/data/package_with_sdk_extension/lib/foo.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/packages_file/sdk_ext_user.dart b/pkg/analyzer_cli/test/data/packages_file/sdk_ext_user.dart
index b346f7f..1a5f662 100644
--- a/pkg/analyzer_cli/test/data/packages_file/sdk_ext_user.dart
+++ b/pkg/analyzer_cli/test/data/packages_file/sdk_ext_user.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/strong_example.dart b/pkg/analyzer_cli/test/data/strong_example.dart
index 2f332cd..514de94 100644
--- a/pkg/analyzer_cli/test/data/strong_example.dart
+++ b/pkg/analyzer_cli/test/data/strong_example.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/super_mixin_example.dart b/pkg/analyzer_cli/test/data/super_mixin_example.dart
index 8983592..8c8a7ec 100644
--- a/pkg/analyzer_cli/test/data/super_mixin_example.dart
+++ b/pkg/analyzer_cli/test/data/super_mixin_example.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/data/test_file.dart b/pkg/analyzer_cli/test/data/test_file.dart
index 1ac3540..334dfb5 100644
--- a/pkg/analyzer_cli/test/data/test_file.dart
+++ b/pkg/analyzer_cli/test/data/test_file.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index cb85943..aa44888 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -36,35 +36,6 @@
   }, name: 'Driver');
 }
 
-/**
- * Call a test that we think will fail.
- *
- * Ensure that we return any thrown exception correctly (avoiding the
- * package:test zone error handler).
- */
-callFailingTest(NoArgFunction expectedFailingTestFn) {
-  final Completer completer = new Completer();
-
-  try {
-    runZoned(
-      () async => await expectedFailingTestFn(),
-      onError: (error) {
-        completer.completeError(error);
-      },
-    ).then((result) {
-      completer.complete(result);
-    }).catchError((error) {
-      completer.completeError(error);
-    });
-  } catch (error) {
-    completer.completeError(error);
-  }
-
-  return completer.future;
-}
-
-typedef dynamic NoArgFunction();
-
 class BaseTest {
   static const emptyOptionsFile = 'data/empty_options.yaml';
 
@@ -85,7 +56,7 @@
   /// [args] and an [options] file path. The value of [options] defaults to an
   /// empty options file to avoid unwanted configuration from an otherwise
   /// discovered options file.
-  Future<Null> drive(
+  Future<void> drive(
     String source, {
     String options: emptyOptionsFile,
     List<String> args: const <String>[],
@@ -94,7 +65,7 @@
   }
 
   /// Like [drive], but takes an array of sources.
-  Future<Null> driveMany(
+  Future<void> driveMany(
     List<String> sources, {
     String options: emptyOptionsFile,
     List<String> args: const <String>[],
@@ -240,7 +211,7 @@
 var b = a;
 ''');
 
-      Future<Null> buildUnlinked(String uri, String path, String output) async {
+      Future<void> buildUnlinked(String uri, String path, String output) async {
         await _doDrive(path, uri: uri, additionalArgs: [
           '--build-summary-only',
           '--build-summary-only-unlinked',
@@ -514,7 +485,7 @@
     });
   }
 
-  Future<Null> _doDrive(String path,
+  Future<void> _doDrive(String path,
       {String uri,
       List<String> additionalArgs: const [],
       String dartSdkSummaryPath}) async {
@@ -777,17 +748,17 @@
   YamlMap _parseOptions(String src) =>
       new AnalysisOptionsProvider().getOptionsFromString(src);
 
-  Future<Null> _runLinter_defaultLints() async {
+  Future<void> _runLinter_defaultLints() async {
     await drive('data/linter_project/test_file.dart',
         options: 'data/linter_project/$optionsFileName', args: ['--lints']);
   }
 
-  Future<Null> _runLinter_lintsInOptions() async {
+  Future<void> _runLinter_lintsInOptions() async {
     await drive('data/linter_project/test_file.dart',
         options: 'data/linter_project/$optionsFileName', args: ['--lints']);
   }
 
-  Future<Null> _runLinter_noLintsFlag() async {
+  Future<void> _runLinter_noLintsFlag() async {
     await drive('data/no_lints_project/test_file.dart',
         options: 'data/no_lints_project/$optionsFileName');
   }
@@ -946,21 +917,17 @@
     expect(outSink.toString(), contains("1 error and 1 warning found."));
   }
 
-  Future<Null> _driveBasic() async {
+  Future<void> _driveBasic() async {
     await drive('data/options_tests_project/test_file.dart',
         options: 'data/options_tests_project/$optionsFileName');
   }
 
   void _expectUndefinedClassErrorsWithoutExclusions() {
-    bool isStrong = usePreviewDart2 || new AnalysisOptionsImpl().previewDart2;
-    final String issueType = isStrong ? 'error' : 'warning';
     expect(bulletToDash(outSink),
-        contains("$issueType - Undefined class 'IncludedUndefinedClass'"));
-    expect(
-        bulletToDash(outSink),
-        isNot(
-            contains("$issueType - Undefined class 'ExcludedUndefinedClass'")));
-    expect(outSink.toString(), contains("1 $issueType found."));
+        contains("error - Undefined class 'IncludedUndefinedClass'"));
+    expect(bulletToDash(outSink),
+        isNot(contains("error - Undefined class 'ExcludedUndefinedClass'")));
+    expect(outSink.toString(), contains("1 error found."));
   }
 }
 
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index a5d5f04..e32e6f2 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/error_test.dart b/pkg/analyzer_cli/test/error_test.dart
deleted file mode 100644
index c8d1d0f..0000000
--- a/pkg/analyzer_cli/test/error_test.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library analyzer_cli.test.error;
-
-import 'package:test/test.dart';
-
-import 'utils.dart';
-
-const badDeclaration = 'var int foo;';
-const badDeclarationMessage = 'Error in test.dart: '
-    'Variables can\'t be declared using both \'var\' and a type name.\n';
-
-void main() {
-  group('error', () {
-    test("a valid Dart file doesn't throw any errors", () {
-      expect(errorsForFile('void main() => print("Hello, world!");'), isNull);
-    });
-
-    test("an empty Dart file doesn't throw any errors", () {
-      expect(errorsForFile(''), isNull);
-    });
-
-    test("an error on the first line", () {
-      expect(errorsForFile('$badDeclaration\n'), equals(badDeclarationMessage));
-    });
-
-    test("an error on the last line", () {
-      expect(errorsForFile('\n$badDeclaration'), equals(badDeclarationMessage));
-    });
-
-    test("an error in the middle", () {
-      expect(
-          errorsForFile('\n$badDeclaration\n'), equals(badDeclarationMessage));
-    });
-
-    var veryLongString = new List.filled(107, ' ').join('');
-
-    test("an error at the end of a very long line", () {
-      expect(errorsForFile('$veryLongString     $badDeclaration'),
-          equals(badDeclarationMessage));
-    });
-
-    test("an error at the beginning of a very long line", () {
-      expect(errorsForFile('$badDeclaration     $veryLongString'),
-          equals(badDeclarationMessage));
-    });
-
-    test("an error in the middle of a very long line", () {
-      expect(errorsForFile('$veryLongString $badDeclaration$veryLongString'),
-          equals(badDeclarationMessage));
-    });
-  });
-}
diff --git a/pkg/analyzer_cli/test/errors_reported_once_test.dart b/pkg/analyzer_cli/test/errors_reported_once_test.dart
index 01905ab..7127abf 100644
--- a/pkg/analyzer_cli/test/errors_reported_once_test.dart
+++ b/pkg/analyzer_cli/test/errors_reported_once_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
index fa281ec..851a83e 100644
--- a/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
+++ b/pkg/analyzer_cli/test/errors_upgrade_fails_cli_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/test/mocks.dart b/pkg/analyzer_cli/test/mocks.dart
index 985464c..49f7251 100644
--- a/pkg/analyzer_cli/test/mocks.dart
+++ b/pkg/analyzer_cli/test/mocks.dart
@@ -1,8 +1,8 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index b0c8a8c..55621d3 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -1,11 +1,12 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer_cli.test.options;
-
 import 'dart:io';
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/analysis/experiments_impl.dart'
+    show overrideKnownFeatures;
 import 'package:analyzer_cli/src/driver.dart';
 import 'package:analyzer_cli/src/options.dart';
 import 'package:telemetry/telemetry.dart' as telemetry;
@@ -58,6 +59,7 @@
         expect(options.dartSdkPath, isNotNull);
         expect(options.disableCacheFlushing, isFalse);
         expect(options.disableHints, isFalse);
+        expect(options.enabledExperiments, isEmpty);
         expect(options.lints, isFalse);
         expect(options.displayVersion, isFalse);
         expect(options.infosAreFatal, isFalse);
@@ -72,7 +74,6 @@
         expect(options.warningsAreFatal, isFalse);
         expect(options.strongMode, isTrue);
         expect(options.lintsAreFatal, isFalse);
-        expect(options.previewDart2, isTrue);
         expect(options.trainSnapshot, isFalse);
       });
 
@@ -95,6 +96,64 @@
         expect(options.disableCacheFlushing, isTrue);
       });
 
+      group('enable experiment', () {
+        var knownFeatures = {
+          'a': ExperimentalFeature(0, 'a', false, false, 'a'),
+          'b': ExperimentalFeature(1, 'b', false, false, 'b'),
+          'c': ExperimentalFeature(2, 'c', false, false, 'c'),
+        };
+
+        test('no values', () {
+          CommandLineOptions options = overrideKnownFeatures(
+              knownFeatures, () => CommandLineOptions.parse(['foo.dart']));
+          expect(options.enabledExperiments, isEmpty);
+        });
+
+        test('single value', () {
+          CommandLineOptions options = overrideKnownFeatures(
+              knownFeatures,
+              () => CommandLineOptions.parse(
+                  ['--enable-experiment', 'a', 'foo.dart']));
+          expect(options.enabledExperiments, ['a']);
+        });
+
+        group('multiple values', () {
+          test('single flag', () {
+            CommandLineOptions options = overrideKnownFeatures(
+                knownFeatures,
+                () => CommandLineOptions.parse(
+                    ['--enable-experiment', 'a,b', 'foo.dart']));
+            expect(options.enabledExperiments, ['a', 'b']);
+          });
+
+          test('mixed single and multiple flags', () {
+            CommandLineOptions options = overrideKnownFeatures(
+                knownFeatures,
+                () => CommandLineOptions.parse([
+                      '--enable-experiment',
+                      'a,b',
+                      '--enable-experiment',
+                      'c',
+                      'foo.dart'
+                    ]));
+            expect(options.enabledExperiments, ['a', 'b', 'c']);
+          });
+
+          test('multiple flags', () {
+            CommandLineOptions options = overrideKnownFeatures(
+                knownFeatures,
+                () => CommandLineOptions.parse([
+                      '--enable-experiment',
+                      'a',
+                      '--enable-experiment',
+                      'b',
+                      'foo.dart'
+                    ]));
+            expect(options.enabledExperiments, ['a', 'b']);
+          });
+        });
+      });
+
       test('hintsAreFatal', () {
         CommandLineOptions options = CommandLineOptions.parse(
             ['--dart-sdk', '.', '--fatal-hints', 'foo.dart']);
@@ -231,12 +290,6 @@
         expect(options.useFastaParser, isTrue);
       });
 
-      test('--preview-dart-2', () {
-        CommandLineOptions options =
-            CommandLineOptions.parse(['--preview-dart-2', 'foo.dart']);
-        expect(options.previewDart2, isTrue);
-      });
-
       test('--train-snapshot', () {
         CommandLineOptions options =
             CommandLineOptions.parse(['--train-snapshot', 'foo.dart']);
diff --git a/pkg/analyzer_cli/test/package_prefix_test.dart b/pkg/analyzer_cli/test/package_prefix_test.dart
index a85fc16..61ae3b4 100644
--- a/pkg/analyzer_cli/test/package_prefix_test.dart
+++ b/pkg/analyzer_cli/test/package_prefix_test.dart
@@ -1,3 +1,7 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 import 'dart:async';
 import 'dart:io' show exitCode;
 
@@ -60,7 +64,7 @@
 
   String get stdout => _stdout.toString();
 
-  Future<Null> run2(List<String> args) async {
+  Future<void> run2(List<String> args) async {
     await new Driver(isTesting: true).start(args);
     if (stderr.isNotEmpty) {
       fail("Unexpected output to stderr:\n$stderr");
diff --git a/pkg/analyzer_cli/test/perf_report_test.dart b/pkg/analyzer_cli/test/perf_report_test.dart
index 71ba735..2fe369f 100644
--- a/pkg/analyzer_cli/test/perf_report_test.dart
+++ b/pkg/analyzer_cli/test/perf_report_test.dart
@@ -1,9 +1,7 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer_cli.test.perf_report;
-
 import 'dart:convert' show json;
 
 import 'package:analyzer_cli/src/error_formatter.dart' show AnalysisStats;
diff --git a/pkg/analyzer_cli/test/reporter_test.dart b/pkg/analyzer_cli/test/reporter_test.dart
index a86c03d..26d37ac 100644
--- a/pkg/analyzer_cli/test/reporter_test.dart
+++ b/pkg/analyzer_cli/test/reporter_test.dart
@@ -1,8 +1,8 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
diff --git a/pkg/analyzer_cli/test/sdk_ext_test.dart b/pkg/analyzer_cli/test/sdk_ext_test.dart
index 0559b3a..6ed310f 100644
--- a/pkg/analyzer_cli/test/sdk_ext_test.dart
+++ b/pkg/analyzer_cli/test/sdk_ext_test.dart
@@ -1,10 +1,8 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 /// Test that sdk extensions are properly detected in various scenarios.
-library analyzer_cli.test.sdk_ext;
-
 import 'dart:io';
 
 import 'package:analyzer/src/dart/sdk/sdk.dart';
diff --git a/pkg/analyzer_cli/test/strong_mode_test.dart b/pkg/analyzer_cli/test/strong_mode_test.dart
index 85a4928..1dd5b43 100644
--- a/pkg/analyzer_cli/test/strong_mode_test.dart
+++ b/pkg/analyzer_cli/test/strong_mode_test.dart
@@ -1,9 +1,7 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer_cli.test.strong_mode;
-
 import 'dart:io';
 
 import 'package:analyzer_cli/src/driver.dart' show outSink;
diff --git a/pkg/analyzer_cli/test/utils.dart b/pkg/analyzer_cli/test/utils.dart
index fd431a2..b12c19e 100644
--- a/pkg/analyzer_cli/test/utils.dart
+++ b/pkg/analyzer_cli/test/utils.dart
@@ -1,14 +1,11 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library analyzer_cli.test.utils;
-
 import 'dart:async';
 import 'dart:io';
 import 'dart:mirrors';
 
-import 'package:analyzer/analyzer.dart';
 import 'package:path/path.dart' as pathos;
 
 /// Gets the test directory in a way that works with package:test
@@ -16,33 +13,9 @@
 final String testDirectory = pathos.dirname(
     pathos.fromUri((reflectClass(_TestUtils).owner as LibraryMirror).uri));
 
-/// Returns the string representation of the [AnalyzerErrorGroup] thrown when
-/// parsing [contents] as a Dart file. If [contents] doesn't throw any errors,
-/// this will return null.
-///
-/// This replaces the filename in the error string with its basename, since the
-/// full path will vary from machine to machine. It also replaces the exception
-/// message with "..." to decouple these tests from the specific exception
-/// messages.
-String errorsForFile(String contents) {
-  return withTempDir((temp) {
-    var path = pathos.join(temp, 'test.dart');
-    new File(path).writeAsStringSync(contents);
-    try {
-      parseDartFile(path);
-    } on AnalyzerErrorGroup catch (e) {
-      return e.toString().replaceAllMapped(
-          new RegExp(r"^(Error on line \d+ of )((?:[A-Z]+:)?[^:]+): .*$",
-              multiLine: true),
-          (match) => match[1] + pathos.basename(match[2]) + ': ...');
-    }
-    return null;
-  });
-}
-
 /// Recursively copy the specified [src] directory (or file)
 /// to the specified destination path.
-Future<Null> recursiveCopy(FileSystemEntity src, String dstPath) async {
+Future<void> recursiveCopy(FileSystemEntity src, String dstPath) async {
   if (src is Directory) {
     await (new Directory(dstPath)).create(recursive: true);
     for (FileSystemEntity entity in src.listSync()) {
@@ -58,19 +31,6 @@
 /// completes, the temporary directory and all its contents will be deleted.
 ///
 /// Returns the return value of [fn].
-T withTempDir<T>(T fn(String path)) {
-  var tempDir = Directory.systemTemp.createTempSync('analyzer_').path;
-  try {
-    return fn(tempDir);
-  } finally {
-    new Directory(tempDir).deleteSync(recursive: true);
-  }
-}
-
-/// Creates a temporary directory and passes its path to [fn]. Once [fn]
-/// completes, the temporary directory and all its contents will be deleted.
-///
-/// Returns the return value of [fn].
 Future<dynamic> withTempDirAsync(Future<dynamic> fn(String path)) async {
   var tempDir = (await Directory.systemTemp.createTemp('analyzer_')).path;
   try {
diff --git a/pkg/analyzer_cli/tool/perf.dart b/pkg/analyzer_cli/tool/perf.dart
index 3e622c8..7d9bd7e 100644
--- a/pkg/analyzer_cli/tool/perf.dart
+++ b/pkg/analyzer_cli/tool/perf.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/analyzer_cli/tool/perf_test.dart b/pkg/analyzer_cli/tool/perf_test.dart
index 3302a51..b137ec4 100644
--- a/pkg/analyzer_cli/tool/perf_test.dart
+++ b/pkg/analyzer_cli/tool/perf_test.dart
@@ -1,11 +1,9 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 /// The only purpose of this file is to enable analyzer tests on `perf.dart`,
 /// the code here just has a dummy import to the rest of the code.
-library analyzer_cli.tool.perf_test;
-
 import 'perf.dart' as m;
 
 main() => print('done ${m.scanTotalChars}');
diff --git a/pkg/analyzer_fe_comparison/lib/src/kernel.dart b/pkg/analyzer_fe_comparison/lib/src/kernel.dart
index bb87e0b..bb7e328 100644
--- a/pkg/analyzer_fe_comparison/lib/src/kernel.dart
+++ b/pkg/analyzer_fe_comparison/lib/src/kernel.dart
@@ -64,7 +64,7 @@
 
 CompilerOptions _makeCompilerOptions(Uri packagesFileUri, Uri platformUri,
     DiagnosticMessageHandler onDiagnostic) {
-  var targetFlags = TargetFlags(syncAsync: true);
+  var targetFlags = TargetFlags();
   var target = NoneTarget(targetFlags);
   var fileSystem = StandardFileSystem.instance;
 
diff --git a/pkg/analyzer_fe_comparison/pubspec.yaml b/pkg/analyzer_fe_comparison/pubspec.yaml
index 94e9893..fb579c8 100644
--- a/pkg/analyzer_fe_comparison/pubspec.yaml
+++ b/pkg/analyzer_fe_comparison/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer_fe_comparison
-version: 1.0.0
+publish_to: none
 author: Dart Team <misc@dartlang.org>
 description: Tool for comparing the behavior of the analyzer and the front end.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_fe_comparison
diff --git a/pkg/analyzer_plugin/doc/api.html b/pkg/analyzer_plugin/doc/api.html
index 6ab809c..0d84b98 100644
--- a/pkg/analyzer_plugin/doc/api.html
+++ b/pkg/analyzer_plugin/doc/api.html
@@ -1004,6 +1004,12 @@
           is only defined if the displayed text should be different than the
           completion.  Otherwise it is omitted.
         </p>
+      </dd><dt class="field"><b>elementUri: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The URI of the element corresponding to this suggestion. It will be
+          set whenever analysis server is able to compute it.
+        </p>
       </dd><dt class="field"><b>selectionOffset: int</b></dt><dd>
         
         <p>
diff --git a/pkg/analyzer_plugin/doc/tutorial/debugging.md b/pkg/analyzer_plugin/doc/tutorial/debugging.md
new file mode 100644
index 0000000..d5905e5
--- /dev/null
+++ b/pkg/analyzer_plugin/doc/tutorial/debugging.md
@@ -0,0 +1,63 @@
+# Debugging Plugins
+
+Unfortunately, debugging a plugin is not well supported at this point. The
+server is typically run as a sub-process by a client. Some clients provide a way
+to add command-line arguments when invoking the server, others don't. To make
+matters worse, each plugin is run in a separate isolate.
+
+Nevertheless, there are a few ways to get some information about what's going on
+in a plugin. Those are outlined below. If you know of other useful techniques,
+or if you have a request for better support, please let us know.
+
+## Check the Status Pages
+
+The analysis server has the ability to host a set of web pages that describe the
+current state of the server. One of the pieces of information available through
+those pages is a list of the plugins that are currently being run.
+
+The server does not host these pages unless it has been requested to do so. You
+can request it by passing a command-line argument to the server when it is being
+started. The argument should be similar to `--port=10000` (any valid port number
+will work). You can then point your browser to `http://localhost:10000/status`.
+
+If you're using IntelliJ as your client, there is a gear icon on the Dart
+Analysis view's header that can be used to open the status pages.
+
+The plugin information can be displayed by clicking on "Plugins" in the list on
+the left.
+
+## Check the Instrumentation Log
+
+The analysis server has the ability to log debugging data to a file. For
+historic reasons this file is referred to as the _instrumentation log_. The data
+primarily consists of a record of the communications between the server and both
+the client that started it and any plugins that the server is running.
+
+The server does not write to this file unless it has been requested to do so.
+You can request it by passing a command-line argument to the server when it is
+being started. The argument should be similar to
+`--instrumentation-log-file=/path/to/file.txt`.
+
+## Println Debugging
+
+You cannot use the `print` function to get debugging information because server
+is run by the client in a child process, and hence doesn't have the ability to
+write to the console.
+
+The closest approximation is for the plugin to send notifications to the server
+that will be written to the instrumentation log file. Currently, the best choice
+for this is the `plugin.error` notification. Just be sure that `isFatal` has a
+value of `false`.
+
+## Using Observatory
+
+If the client you're using allows you to pass command-line flags to the VM, then
+you can also run the analysis server under the Observatory. Pass in both
+`--observe` and `--pause-isolates-on-start`, then point your browser to
+`http://localhost:8181`. To learn more, see the
+[observatory][observatory] documentation.
+
+If you're using IntelliJ as your client, open the "Registry..." dialog and edit
+the entry named "dart.server.vm.options".
+
+[observatory]: https://dart-lang.github.io/observatory/
\ No newline at end of file
diff --git a/pkg/analyzer_plugin/doc/tutorial/tutorial.md b/pkg/analyzer_plugin/doc/tutorial/tutorial.md
index 4031afa..8d9fafb 100644
--- a/pkg/analyzer_plugin/doc/tutorial/tutorial.md
+++ b/pkg/analyzer_plugin/doc/tutorial/tutorial.md
@@ -43,9 +43,13 @@
 [Providing Folding Information][folding] -
 How to provide support for code folding.
 
+[Debugging Plugins][debugging] -
+How to debug a plugin.
+
 [assists]: assists.md
 [completion]: completion.md
 [creatingEdits]: creating_edits.md
+[debugging]: debugging.md
 [fixes]: fixes.md
 [folding]: folding.md
 [gettingStarted]: getting_started.md
diff --git a/pkg/analyzer_plugin/lib/plugin/assist_mixin.dart b/pkg/analyzer_plugin/lib/plugin/assist_mixin.dart
index 9eb8286..d17d4cd 100644
--- a/pkg/analyzer_plugin/lib/plugin/assist_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/assist_mixin.dart
@@ -17,10 +17,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for handling assist requests.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class AssistsMixin implements ServerPlugin {
+mixin AssistsMixin implements ServerPlugin {
   /**
    * Return a list containing the assist contributors that should be used to
    * create assists for the file with the given [path].
@@ -67,7 +67,7 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     String path = parameters.file;
-    ResolveResult result = await getResolveResult(path);
+    ResolvedUnitResult result = await getResolvedUnitResult(path);
     return new DartAssistRequestImpl(
         resourceProvider, parameters.offset, parameters.length, result);
   }
diff --git a/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart b/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
index 72de7ce..a8aa3b8 100644
--- a/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/completion_mixin.dart
@@ -17,10 +17,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for handling code completion requests.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class CompletionMixin implements ServerPlugin {
+mixin CompletionMixin implements ServerPlugin {
   /**
    * Return a list containing the completion contributors that should be used to
    * create completion suggestions for the file with the given [path].
@@ -68,7 +68,7 @@
       CompletionGetSuggestionsParams parameters) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    ResolveResult result = await getResolveResult(parameters.file);
+    ResolvedUnitResult result = await getResolvedUnitResult(parameters.file);
     return new DartCompletionRequestImpl(
         resourceProvider, parameters.offset, result);
   }
diff --git a/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart b/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
index 917dc3e..a4a113d 100644
--- a/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/fix_mixin.dart
@@ -20,23 +20,23 @@
  * mixing in [FixesMixin]. This implements the creation of the fixes request
  * based on the assumption that the driver being created is an [AnalysisDriver].
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin] that also uses
- * [FixesMixin] as a mix-in.
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin] that also uses [FixesMixin] as a
+ * mix-in.
  */
-abstract class DartFixesMixin implements FixesMixin {
+mixin DartFixesMixin implements FixesMixin {
   @override
   Future<FixesRequest> getFixesRequest(EditGetFixesParams parameters) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     String path = parameters.file;
     int offset = parameters.offset;
-    ResolveResult result = await getResolveResult(path);
+    ResolvedUnitResult result = await getResolvedUnitResult(path);
     return new DartFixesRequestImpl(
         resourceProvider, offset, _getErrors(offset, result), result);
   }
 
-  List<AnalysisError> _getErrors(int offset, ResolveResult result) {
+  List<AnalysisError> _getErrors(int offset, ResolvedUnitResult result) {
     LineInfo lineInfo = result.lineInfo;
     int offsetLine = lineInfo.getLocation(offset).lineNumber;
     return result.errors.where((AnalysisError error) {
@@ -50,10 +50,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for handling fix requests.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class FixesMixin implements ServerPlugin {
+mixin FixesMixin implements ServerPlugin {
   /**
    * Return a list containing the fix contributors that should be used to create
    * fixes for the file with the given [path].
diff --git a/pkg/analyzer_plugin/lib/plugin/folding_mixin.dart b/pkg/analyzer_plugin/lib/plugin/folding_mixin.dart
index 3c8d88c..1ca0f81 100644
--- a/pkg/analyzer_plugin/lib/plugin/folding_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/folding_mixin.dart
@@ -18,16 +18,16 @@
  * request based on the assumption that the driver being created is an
  * [AnalysisDriver].
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin] that also uses
- * [FoldingMixin] as a mix-in.
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin] that also uses [FoldingMixin] as a
+ * mix-in.
  */
-abstract class DartFoldingMixin implements FoldingMixin {
+mixin DartFoldingMixin implements FoldingMixin {
   @override
   Future<FoldingRequest> getFoldingRequest(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    ResolveResult result = await getResolveResult(path);
+    ResolvedUnitResult result = await getResolvedUnitResult(path);
     return new DartFoldingRequestImpl(resourceProvider, result);
   }
 }
@@ -36,10 +36,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for producing folding notifications.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class FoldingMixin implements ServerPlugin {
+mixin FoldingMixin implements ServerPlugin {
   /**
    * Return a list containing the folding contributors that should be used
    * to create folding regions for the file with the given [path].
diff --git a/pkg/analyzer_plugin/lib/plugin/highlights_mixin.dart b/pkg/analyzer_plugin/lib/plugin/highlights_mixin.dart
index a401db8..20748c9 100644
--- a/pkg/analyzer_plugin/lib/plugin/highlights_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/highlights_mixin.dart
@@ -18,16 +18,16 @@
  * highlighting request based on the assumption that the driver being created is
  * an [AnalysisDriver].
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin] that also uses
- * [HighlightsMixin] as a mix-in.
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin] that also uses [HighlightsMixin]
+ * as a mix-in.
  */
-abstract class DartHighlightsMixin implements HighlightsMixin {
+mixin DartHighlightsMixin implements HighlightsMixin {
   @override
   Future<HighlightsRequest> getHighlightsRequest(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    ResolveResult result = await getResolveResult(path);
+    ResolvedUnitResult result = await getResolvedUnitResult(path);
     return new DartHighlightsRequestImpl(resourceProvider, result);
   }
 }
@@ -36,10 +36,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for producing highlighting notifications.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class HighlightsMixin implements ServerPlugin {
+mixin HighlightsMixin implements ServerPlugin {
   /**
    * Return a list containing the highlighting contributors that should be used
    * to create highlighting information for the file with the given [path].
diff --git a/pkg/analyzer_plugin/lib/plugin/kythe_mixin.dart b/pkg/analyzer_plugin/lib/plugin/kythe_mixin.dart
index 999ba57..be89c6c 100644
--- a/pkg/analyzer_plugin/lib/plugin/kythe_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/kythe_mixin.dart
@@ -19,18 +19,18 @@
  * request based on the assumption that the driver being created is an
  * [AnalysisDriver].
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin] that also uses
- * [KytheMixin] as a mix-in.
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin] that also uses [KytheMixin] as a
+ * mix-in.
  */
-abstract class DartEntryMixin implements EntryMixin {
+mixin DartEntryMixin implements EntryMixin {
   @override
   Future<EntryRequest> getEntryRequest(
       KytheGetKytheEntriesParams parameters) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     String path = parameters.file;
-    ResolveResult result = await getResolveResult(path);
+    ResolvedUnitResult result = await getResolvedUnitResult(path);
     return new DartEntryRequestImpl(resourceProvider, result);
   }
 }
@@ -39,10 +39,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for handling kythe.getEntries requests.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class EntryMixin implements ServerPlugin {
+mixin EntryMixin implements ServerPlugin {
   /**
    * Return a list containing the entry contributors that should be used to
    * create entries for the file with the given [path]
diff --git a/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart b/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
index e1e6e28..96bfdc5 100644
--- a/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/navigation_mixin.dart
@@ -19,18 +19,18 @@
  * request based on the assumption that the driver being created is an
  * [AnalysisDriver].
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin] that also uses
- * [NavigationMixin] as a mix-in.
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin] that also uses [NavigationMixin]
+ * as a mix-in.
  */
-abstract class DartNavigationMixin implements NavigationMixin {
+mixin DartNavigationMixin implements NavigationMixin {
   @override
   Future<NavigationRequest> getNavigationRequest(
       AnalysisGetNavigationParams parameters) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     String path = parameters.file;
-    ResolveResult result = await getResolveResult(path);
+    ResolvedUnitResult result = await getResolvedUnitResult(path);
     int offset = parameters.offset;
     int length = parameters.length;
     if (offset < 0 && length < 0) {
@@ -46,10 +46,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for handling navigation requests.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class NavigationMixin implements ServerPlugin {
+mixin NavigationMixin implements ServerPlugin {
   /**
    * Return a list containing the navigation contributors that should be used to
    * create navigation information for the file with the given [path]
diff --git a/pkg/analyzer_plugin/lib/plugin/occurrences_mixin.dart b/pkg/analyzer_plugin/lib/plugin/occurrences_mixin.dart
index 5766d9b..8547779 100644
--- a/pkg/analyzer_plugin/lib/plugin/occurrences_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/occurrences_mixin.dart
@@ -18,16 +18,16 @@
  * request based on the assumption that the driver being created is an
  * [AnalysisDriver].
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin] that also uses
- * [OccurrencesMixin] as a mix-in.
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin] that also uses [OccurrencesMixin]
+ * as a mix-in.
  */
-abstract class DartOccurrencesMixin implements OccurrencesMixin {
+mixin DartOccurrencesMixin implements OccurrencesMixin {
   @override
   Future<OccurrencesRequest> getOccurrencesRequest(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    ResolveResult result = await getResolveResult(path);
+    ResolvedUnitResult result = await getResolvedUnitResult(path);
     return new DartOccurrencesRequestImpl(resourceProvider, result);
   }
 }
@@ -36,10 +36,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for producing occurrences notifications.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class OccurrencesMixin implements ServerPlugin {
+mixin OccurrencesMixin implements ServerPlugin {
   /**
    * Return a list containing the occurrences contributors that should be used
    * to create occurrences information for the file with the given [path].
diff --git a/pkg/analyzer_plugin/lib/plugin/outline_mixin.dart b/pkg/analyzer_plugin/lib/plugin/outline_mixin.dart
index 96bbdc4..4207a25 100644
--- a/pkg/analyzer_plugin/lib/plugin/outline_mixin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/outline_mixin.dart
@@ -18,16 +18,16 @@
  * request based on the assumption that the driver being created is an
  * [AnalysisDriver].
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin] that also uses
- * [OutlineMixin] as a mix-in.
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin] that also uses [OutlineMixin] as a
+ * mix-in.
  */
-abstract class DartOutlineMixin implements OutlineMixin {
+mixin DartOutlineMixin implements OutlineMixin {
   @override
   Future<OutlineRequest> getOutlineRequest(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    ResolveResult result = await getResolveResult(path);
+    ResolvedUnitResult result = await getResolvedUnitResult(path);
     return new DartOutlineRequestImpl(resourceProvider, result);
   }
 }
@@ -36,10 +36,10 @@
  * A mixin that can be used when creating a subclass of [ServerPlugin] to
  * provide most of the implementation for producing outline notifications.
  *
- * Clients may not extend or implement this class, but are allowed to use it as
- * a mix-in when creating a subclass of [ServerPlugin].
+ * Clients may not implement this mixin, but are allowed to use it as a mix-in
+ * when creating a subclass of [ServerPlugin].
  */
-abstract class OutlineMixin implements ServerPlugin {
+mixin OutlineMixin implements ServerPlugin {
   /**
    * Return a list containing the outline contributors that should be used to
    * create outline information for the file with the given [path].
diff --git a/pkg/analyzer_plugin/lib/plugin/plugin.dart b/pkg/analyzer_plugin/lib/plugin/plugin.dart
index 5fb6296..44ad8e9 100644
--- a/pkg/analyzer_plugin/lib/plugin/plugin.dart
+++ b/pkg/analyzer_plugin/lib/plugin/plugin.dart
@@ -208,7 +208,7 @@
    * Throw a [RequestFailure] is the file cannot be analyzed or if the driver
    * associated with the file is not an [AnalysisDriver].
    */
-  Future<ResolveResult> getResolveResult(String path) async {
+  Future<ResolvedUnitResult> getResolvedUnitResult(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     AnalysisDriverGeneric driver = driverForPath(path);
@@ -217,7 +217,8 @@
       throw new RequestFailure(
           RequestErrorFactory.pluginError('Failed to analyze $path', null));
     }
-    ResolveResult result = await (driver as AnalysisDriver).getResult(path);
+    ResolvedUnitResult result =
+        await (driver as AnalysisDriver).getResult(path);
     ResultState state = result.state;
     if (state != ResultState.VALID) {
       // Return an error from the request.
@@ -228,6 +229,16 @@
   }
 
   /**
+   * Return the result of analyzing the file with the given [path].
+   *
+   * Throw a [RequestFailure] is the file cannot be analyzed or if the driver
+   * associated with the file is not an [AnalysisDriver].
+   */
+  @deprecated
+  Future<ResolveResult> getResolveResult(String path) =>
+      getResolvedUnitResult(path);
+
+  /**
    * Handle an 'analysis.getNavigation' request.
    *
    * Throw a [RequestFailure] if the request could not be handled.
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index 596aa9e..b7718d7 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -598,6 +598,7 @@
  *   "relevance": int
  *   "completion": String
  *   "displayText": optional String
+ *   "elementUri": optional String
  *   "selectionOffset": int
  *   "selectionLength": int
  *   "isDeprecated": bool
@@ -629,6 +630,8 @@
 
   String _displayText;
 
+  String _elementUri;
+
   int _selectionOffset;
 
   int _selectionLength;
@@ -729,6 +732,20 @@
   }
 
   /**
+   * The URI of the element corresponding to this suggestion. It will be set
+   * whenever analysis server is able to compute it.
+   */
+  String get elementUri => _elementUri;
+
+  /**
+   * The URI of the element corresponding to this suggestion. It will be set
+   * whenever analysis server is able to compute it.
+   */
+  void set elementUri(String value) {
+    this._elementUri = value;
+  }
+
+  /**
    * The offset, relative to the beginning of the completion, of where the
    * selection should be placed after insertion.
    */
@@ -1003,6 +1020,7 @@
       bool isDeprecated,
       bool isPotential,
       {String displayText,
+      String elementUri,
       String docSummary,
       String docComplete,
       String declaringType,
@@ -1021,6 +1039,7 @@
     this.relevance = relevance;
     this.completion = completion;
     this.displayText = displayText;
+    this.elementUri = elementUri;
     this.selectionOffset = selectionOffset;
     this.selectionLength = selectionLength;
     this.isDeprecated = isDeprecated;
@@ -1073,6 +1092,11 @@
         displayText = jsonDecoder.decodeString(
             jsonPath + ".displayText", json["displayText"]);
       }
+      String elementUri;
+      if (json.containsKey("elementUri")) {
+        elementUri = jsonDecoder.decodeString(
+            jsonPath + ".elementUri", json["elementUri"]);
+      }
       int selectionOffset;
       if (json.containsKey("selectionOffset")) {
         selectionOffset = jsonDecoder.decodeInt(
@@ -1178,6 +1202,7 @@
       return new CompletionSuggestion(kind, relevance, completion,
           selectionOffset, selectionLength, isDeprecated, isPotential,
           displayText: displayText,
+          elementUri: elementUri,
           docSummary: docSummary,
           docComplete: docComplete,
           declaringType: declaringType,
@@ -1206,6 +1231,9 @@
     if (displayText != null) {
       result["displayText"] = displayText;
     }
+    if (elementUri != null) {
+      result["elementUri"] = elementUri;
+    }
     result["selectionOffset"] = selectionOffset;
     result["selectionLength"] = selectionLength;
     result["isDeprecated"] = isDeprecated;
@@ -1265,6 +1293,7 @@
           relevance == other.relevance &&
           completion == other.completion &&
           displayText == other.displayText &&
+          elementUri == other.elementUri &&
           selectionOffset == other.selectionOffset &&
           selectionLength == other.selectionLength &&
           isDeprecated == other.isDeprecated &&
@@ -1297,6 +1326,7 @@
     hash = JenkinsSmiHash.combine(hash, relevance.hashCode);
     hash = JenkinsSmiHash.combine(hash, completion.hashCode);
     hash = JenkinsSmiHash.combine(hash, displayText.hashCode);
+    hash = JenkinsSmiHash.combine(hash, elementUri.hashCode);
     hash = JenkinsSmiHash.combine(hash, selectionOffset.hashCode);
     hash = JenkinsSmiHash.combine(hash, selectionLength.hashCode);
     hash = JenkinsSmiHash.combine(hash, isDeprecated.hashCode);
diff --git a/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart b/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
index 8d7b094..aa65532 100644
--- a/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
+++ b/pkg/analyzer_plugin/lib/src/channel/isolate_channel.dart
@@ -121,7 +121,7 @@
   void listen(void onRequest(Request request),
       {Function onError, void onDone()}) {
     void onData(data) {
-      Map<String, Object> requestMap = data;
+      Map<String, Object> requestMap = data as Map<String, Object>;
       Request request = new Request.fromJson(requestMap);
       if (request != null) {
         onRequest(request);
diff --git a/pkg/analyzer_plugin/lib/src/utilities/assist/assist.dart b/pkg/analyzer_plugin/lib/src/utilities/assist/assist.dart
index dcbe5eb..95b0893 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/assist/assist.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/assist/assist.dart
@@ -36,7 +36,7 @@
   final int length;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * Initialize a newly create request with the given data.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
index 2b61d17..298c22c 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_core.dart
@@ -66,6 +66,10 @@
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     FileEditBuilderImpl builder = await createFileEditBuilder(path);
+    if (builder == null) {
+      return;
+    }
+
     buildFileEdit(builder);
     if (builder.hasEdits) {
       _change.addFileEdit(builder.fileEdit);
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 7618568..d1ab672 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -21,6 +21,7 @@
 import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:charcode/ascii.dart';
 
@@ -30,21 +31,24 @@
 class DartChangeBuilderImpl extends ChangeBuilderImpl
     implements DartChangeBuilder {
   /**
-   * The analysis session in which the files being edited were analyzed.
+   * The analysis session in which the files are analyzed and edited.
    */
-  final AnalysisSession session;
+  final ChangeWorkspace workspace;
 
   /**
    * Initialize a newly created change builder.
    */
-  DartChangeBuilderImpl(this.session);
+  DartChangeBuilderImpl(AnalysisSession session)
+      : this.forWorkspace(_SingleSessionWorkspace(session));
+
+  DartChangeBuilderImpl.forWorkspace(this.workspace);
 
   @override
   Future<void> addFileEdit(
       String path, void buildFileEdit(DartFileEditBuilder builder),
       {ImportPrefixGenerator importPrefixGenerator}) {
     return super.addFileEdit(path, (builder) {
-      DartFileEditBuilderImpl dartBuilder = builder;
+      DartFileEditBuilderImpl dartBuilder = builder as DartFileEditBuilderImpl;
       dartBuilder.importPrefixGenerator = importPrefixGenerator;
       buildFileEdit(dartBuilder);
     });
@@ -54,13 +58,19 @@
   Future<DartFileEditBuilderImpl> createFileEditBuilder(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    ResolveResult result = await session.getResolvedAst(path);
+
+    if (!workspace.containsFile(path)) {
+      return null;
+    }
+
+    var session = workspace.getSession(path);
+    ResolvedUnitResult result = await session.getResolvedUnit(path);
     ResultState state = result?.state ?? ResultState.INVALID_FILE_TYPE;
     if (state == ResultState.INVALID_FILE_TYPE) {
       throw new AnalysisException('Cannot analyze "$path"');
     }
     int timeStamp = state == ResultState.VALID ? 0 : -1;
-    return new DartFileEditBuilderImpl(this, path, timeStamp, result.unit);
+    return DartFileEditBuilderImpl(this, path, timeStamp, session, result.unit);
   }
 }
 
@@ -402,7 +412,7 @@
       }
     }
 
-    ExecutableElement element = signature.element;
+    ExecutableElement element = signature.element as ExecutableElement;
     String prefix = getIndent(1);
     String prefix2 = getIndent(2);
     ElementKind elementKind = element.kind;
@@ -472,10 +482,11 @@
 
       // TO-DO
       write(prefix2);
-      writeln('// TODO: implement $memberName');
+      write('// TODO: implement $memberName');
 
       if (isSetter) {
         if (invokeSuper) {
+          writeln();
           write(prefix2);
           selectAll(() {
             write('super.');
@@ -485,9 +496,13 @@
             write(';');
           });
           writeln();
+        } else {
+          selectHere();
+          writeln();
         }
       } else if (returnType.isVoid) {
         if (invokeSuper) {
+          writeln();
           write(prefix2);
           selectAll(() {
             write('super.');
@@ -502,8 +517,12 @@
             write(');');
           });
           writeln();
+        } else {
+          selectHere();
+          writeln();
         }
       } else {
+        writeln();
         write(prefix2);
         if (invokeSuper) {
           selectAll(() {
@@ -1087,6 +1106,11 @@
 class DartFileEditBuilderImpl extends FileEditBuilderImpl
     implements DartFileEditBuilder {
   /**
+   * The session that analyzed this file.
+   */
+  final AnalysisSession session;
+
+  /**
    * The compilation unit to which the code will be added.
    */
   final CompilationUnit unit;
@@ -1113,7 +1137,7 @@
    * the given [path] and [timeStamp], and the given fully resolved [unit].
    */
   DartFileEditBuilderImpl(DartChangeBuilderImpl changeBuilder, String path,
-      int timeStamp, this.unit)
+      int timeStamp, this.session, this.unit)
       : libraryElement = unit.declaredElement.library,
         super(changeBuilder, path, timeStamp);
 
@@ -1395,7 +1419,6 @@
    */
   String _getLibraryUriText(Uri what) {
     if (what.scheme == 'file') {
-      var session = (changeBuilder as DartChangeBuilderImpl).session;
       var pathContext = session.resourceProvider.pathContext;
       String whatPath = pathContext.fromUri(what);
       String libraryPath = libraryElement.source.fullName;
@@ -1530,3 +1553,24 @@
         other.prefix == prefix;
   }
 }
+
+/// Workspace that wraps a single [AnalysisSession].
+class _SingleSessionWorkspace extends ChangeWorkspace {
+  final AnalysisSession session;
+
+  _SingleSessionWorkspace(this.session);
+
+  @override
+  bool containsFile(String path) {
+    var analysisContext = session.analysisContext;
+    return analysisContext.contextRoot.isAnalyzed(path);
+  }
+
+  @override
+  AnalysisSession getSession(String path) {
+    if (containsFile(path)) {
+      return session;
+    }
+    throw StateError('Not in a context root: $path');
+  }
+}
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
index 209e451..7bf30d5 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
@@ -84,7 +84,7 @@
   final int offset;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * A flag indicating whether completion has been aborted.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
index 03fcb97..69a0aae 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_target.dart
@@ -154,7 +154,7 @@
       if (containingNode is Comment) {
         // Comments are handled specially: we descend into any CommentReference
         // child node that contains the cursor offset.
-        Comment comment = containingNode;
+        Comment comment = containingNode as Comment;
         for (CommentReference commentReference in comment.references) {
           if (commentReference.offset <= offset &&
               offset <= commentReference.end) {
@@ -276,7 +276,7 @@
         token.type.isKeyword || token.type == TokenType.IDENTIFIER;
 
     Token token = droppedToken ??
-        (entity is AstNode ? (entity as AstNode).beginToken : entity);
+        (entity is AstNode ? (entity as AstNode).beginToken : entity as Token);
     if (token != null && requestOffset < token.offset) {
       token = containingNode.findPrevious(token);
     }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
index 546f664..8b93677 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/element_suggestion_builder.dart
@@ -13,7 +13,7 @@
 /**
  * Common mixin for sharing behavior.
  */
-abstract class ElementSuggestionBuilder {
+mixin ElementSuggestionBuilder {
   // Copied from analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
   /**
    * A collection of completion suggestions.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index a77fe18..e005b30 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -129,21 +129,26 @@
       return optype;
     }
 
-    target.containingNode
-        .accept(new _OpTypeAstVisitor(optype, target.entity, offset));
-    var methodDeclaration =
-        target.containingNode.getAncestor((node) => node is MethodDeclaration);
-    optype.inMethodBody = methodDeclaration != null;
-    optype.inStaticMethodBody =
-        methodDeclaration is MethodDeclaration && methodDeclaration.isStatic;
+    var targetNode = target.containingNode;
+    targetNode.accept(new _OpTypeAstVisitor(optype, target.entity, offset));
 
-    var functionDeclaration = target.containingNode
-        .getAncestor((node) => node is FunctionDeclaration);
-    optype.inFunctionBody = functionDeclaration != null;
+    var functionBody = targetNode.thisOrAncestorOfType<FunctionBody>();
+    if (functionBody != null) {
+      var parent = functionBody.parent;
 
-    var constructorDeclaration = target.containingNode
-        .getAncestor((node) => node is ConstructorDeclaration);
-    optype.inConstructorBody = constructorDeclaration != null;
+      if (parent is ConstructorDeclaration) {
+        optype.inConstructorBody = true;
+      }
+
+      if (parent is FunctionExpression) {
+        optype.inFunctionBody = true;
+      }
+
+      if (parent is MethodDeclaration) {
+        optype.inMethodBody = true;
+        optype.inStaticMethodBody = parent.isStatic;
+      }
+    }
 
     // If a value should be suggested, suggest also constructors.
     if (optype.includeReturnValueSuggestions) {
@@ -482,6 +487,14 @@
   }
 
   @override
+  visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (identical(entity, node.expression)) {
+      optype.includeReturnValueSuggestions = true;
+      optype.includeTypeNameSuggestions = true;
+    }
+  }
+
+  @override
   visitConstructorName(ConstructorName node) {
     // some PrefixedIdentifier nodes are transformed into
     // ConstructorName nodes during the resolution process.
@@ -548,7 +561,7 @@
     // Given f[], the parser drops the [] from the expression statement
     // but the [] token is the CompletionTarget entity
     if (entity is Token) {
-      Token token = entity;
+      Token token = entity as Token;
       if (token.lexeme == '[]' && offset == token.offset + 1) {
         optype.includeReturnValueSuggestions = true;
         optype.includeTypeNameSuggestions = true;
@@ -976,7 +989,7 @@
   @override
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     if (entity is Token) {
-      Token token = entity;
+      Token token = entity as Token;
       if (token.isSynthetic || token.lexeme == ';') {
         optype.includeVarNameSuggestions = true;
       }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/fixes/fixes.dart b/pkg/analyzer_plugin/lib/src/utilities/fixes/fixes.dart
index 54d9b45..8973624 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/fixes/fixes.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/fixes/fixes.dart
@@ -23,7 +23,7 @@
   final List<AnalysisError> errorsToFix;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * Initialize a newly create request with the given data.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/folding/folding.dart b/pkg/analyzer_plugin/lib/src/utilities/folding/folding.dart
index 1e7eb67f..2d5578c 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/folding/folding.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/folding/folding.dart
@@ -17,7 +17,7 @@
   final ResourceProvider resourceProvider;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * Initialize a newly create request with the given data.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/highlights/highlights.dart b/pkg/analyzer_plugin/lib/src/utilities/highlights/highlights.dart
index bb24bcb..8412dac 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/highlights/highlights.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/highlights/highlights.dart
@@ -17,7 +17,7 @@
   final ResourceProvider resourceProvider;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * Initialize a newly create request with the given data.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/kythe/entries.dart b/pkg/analyzer_plugin/lib/src/utilities/kythe/entries.dart
index 72256df..eb4163a 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/kythe/entries.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/kythe/entries.dart
@@ -15,7 +15,7 @@
   final ResourceProvider resourceProvider;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * Initialize a newly create request with the given data.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/navigation/navigation.dart b/pkg/analyzer_plugin/lib/src/utilities/navigation/navigation.dart
index f8b4b11..31e004b 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/navigation/navigation.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/navigation/navigation.dart
@@ -23,7 +23,7 @@
   final int offset;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * Initialize a newly create request with the given data.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/occurrences/occurrences.dart b/pkg/analyzer_plugin/lib/src/utilities/occurrences/occurrences.dart
index 42b95c2..2538191 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/occurrences/occurrences.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/occurrences/occurrences.dart
@@ -16,7 +16,7 @@
   final ResourceProvider resourceProvider;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * Initialize a newly create request with the given data.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/outline/outline.dart b/pkg/analyzer_plugin/lib/src/utilities/outline/outline.dart
index f87c5fc..47fba67 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/outline/outline.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/outline/outline.dart
@@ -16,7 +16,7 @@
   final ResourceProvider resourceProvider;
 
   @override
-  final ResolveResult result;
+  final ResolvedUnitResult result;
 
   /**
    * Initialize a newly create request with the given data.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
index ec525ca..ba1ec8f 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
@@ -35,6 +35,8 @@
 
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration);
 
+  void declaredGenericTypeAlias(GenericTypeAlias declaration);
+
   void declaredLabel(Label label, bool isCaseLabel);
 
   void declaredLocalVar(SimpleIdentifier name, TypeAnnotation type);
@@ -113,6 +115,8 @@
         declaredClassTypeAlias(declaration);
       } else if (declaration is FunctionTypeAlias) {
         declaredFunctionTypeAlias(declaration);
+      } else if (declaration is GenericTypeAlias) {
+        declaredGenericTypeAlias(declaration);
       }
     });
   }
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index 5fd4f25..c4fe0c2 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -36,7 +36,8 @@
     int startLine = -1;
     int startColumn = -1;
     if (lineInfo != null) {
-      analyzer.CharacterLocation lineLocation = lineInfo.getLocation(offset);
+      analyzer.CharacterLocation lineLocation =
+          lineInfo.getLocation(offset) as analyzer.CharacterLocation;
       if (lineLocation != null) {
         startLine = lineLocation.lineNumber;
         startColumn = lineLocation.columnNumber;
@@ -126,6 +127,8 @@
       return plugin.ElementKind.FUNCTION;
     } else if (kind == analyzer.ElementKind.FUNCTION_TYPE_ALIAS) {
       return plugin.ElementKind.FUNCTION_TYPE_ALIAS;
+    } else if (kind == analyzer.ElementKind.GENERIC_FUNCTION_TYPE) {
+      return plugin.ElementKind.FUNCTION_TYPE_ALIAS;
     } else if (kind == analyzer.ElementKind.GETTER) {
       return plugin.ElementKind.GETTER;
     } else if (kind == analyzer.ElementKind.LABEL) {
@@ -340,7 +343,7 @@
       analyzer.LineInfo lineInfo = unitElement.lineInfo;
       if (lineInfo != null) {
         analyzer.CharacterLocation offsetLocation =
-            lineInfo.getLocation(range.offset);
+            lineInfo.getLocation(range.offset) as analyzer.CharacterLocation;
         startLine = offsetLocation.lineNumber;
         startColumn = offsetLocation.columnNumber;
       }
diff --git a/pkg/analyzer_plugin/lib/utilities/assist/assist.dart b/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
index 72c3e0d..7e02aea 100644
--- a/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
+++ b/pkg/analyzer_plugin/lib/utilities/assist/assist.dart
@@ -145,5 +145,5 @@
   /**
    * The analysis result for the file in which the assists are being requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
index 90b4794..25932c0 100644
--- a/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart
@@ -26,6 +26,8 @@
 abstract class DartChangeBuilder implements ChangeBuilder {
   /**
    * Initialize a newly created change builder.
+   *
+   * TODO(scheglov) Replace this constructor with using workspace.
    */
   factory DartChangeBuilder(AnalysisSession session) = DartChangeBuilderImpl;
 
diff --git a/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart b/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart
new file mode 100644
index 0000000..a0f4469
--- /dev/null
+++ b/pkg/analyzer_plugin/lib/utilities/change_builder/change_workspace.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/analysis/session.dart';
+
+/// Information about the workspace in which change builders operate.
+abstract class ChangeWorkspace {
+  /// Return `true` if the file with the given [path] is in a context root.
+  bool containsFile(String path);
+
+  /// Return the session that should analyze the given [path], or throw
+  /// [StateError] if the [path] does not belong to a context root.
+  AnalysisSession getSession(String path);
+}
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart b/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
index c037112..6a354cd 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
@@ -160,5 +160,5 @@
    * The analysis result for the file in which the completion is being
    * requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
index c3af0db..e3567fc 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/inherited_reference_contributor.dart
@@ -21,7 +21,7 @@
  * Plugin developers should extend this function and primarily
  * overload `computeSuggestions` (if needed).
  */
-class InheritedReferenceContributor extends Object
+class InheritedReferenceContributor
     with ElementSuggestionBuilder
     implements CompletionContributor {
   @override
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
index 28ab1f9..dd4a046 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -151,7 +151,7 @@
       // Determine the name of the containing method because
       // the most likely completion is a super expression with same name
       MethodDeclaration containingMethod =
-          expression.getAncestor((p) => p is MethodDeclaration);
+          expression.thisOrAncestorOfType<MethodDeclaration>();
       if (containingMethod != null) {
         SimpleIdentifier id = containingMethod.name;
         if (id != null) {
@@ -241,6 +241,17 @@
   }
 
   @override
+  void declaredGenericTypeAlias(GenericTypeAlias declaration) {
+    if (declaration.name.name == targetName) {
+      TypeAnnotation typeName = declaration.functionType.returnType;
+      if (typeName != null) {
+        typeFound = typeName.type;
+      }
+      finished();
+    }
+  }
+
+  @override
   void declaredLabel(Label label, bool isCaseLabel) {
     if (label.label.name == targetName) {
       // no type
diff --git a/pkg/analyzer_plugin/lib/utilities/fixes/fixes.dart b/pkg/analyzer_plugin/lib/utilities/fixes/fixes.dart
index 3b0ab66..377fe37 100644
--- a/pkg/analyzer_plugin/lib/utilities/fixes/fixes.dart
+++ b/pkg/analyzer_plugin/lib/utilities/fixes/fixes.dart
@@ -20,7 +20,7 @@
   /**
    * The analysis result for the file in which the fixes are being requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
 
 /**
@@ -147,11 +147,6 @@
   final String appliedTogetherMessage;
 
   /**
-   * The change can be made with other fixes of this [FixKind].
-   */
-  bool canBeAppliedTogether() => appliedTogetherMessage != null;
-
-  /**
    * Initialize a newly created kind of fix to have the given [name],
    * [priority], [message], and optionally [canBeAppliedTogether] and
    * [appliedTogetherMessage].
@@ -160,11 +155,16 @@
       {this.appliedTogetherMessage: null});
 
   @override
-  String toString() => name;
+  int get hashCode => name.hashCode;
 
   @override
   bool operator ==(o) => o is FixKind && o.name == name;
 
+  /**
+   * The change can be made with other fixes of this [FixKind].
+   */
+  bool canBeAppliedTogether() => appliedTogetherMessage != null;
+
   @override
-  int get hashCode => name.hashCode;
+  String toString() => name;
 }
diff --git a/pkg/analyzer_plugin/lib/utilities/folding/folding.dart b/pkg/analyzer_plugin/lib/utilities/folding/folding.dart
index 7eab6ad..6408d2f 100644
--- a/pkg/analyzer_plugin/lib/utilities/folding/folding.dart
+++ b/pkg/analyzer_plugin/lib/utilities/folding/folding.dart
@@ -23,7 +23,7 @@
    * The analysis result for the file for which the folding regions are being
    * requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
 
 /**
diff --git a/pkg/analyzer_plugin/lib/utilities/highlights/highlights.dart b/pkg/analyzer_plugin/lib/utilities/highlights/highlights.dart
index 59acbe4..f24b280 100644
--- a/pkg/analyzer_plugin/lib/utilities/highlights/highlights.dart
+++ b/pkg/analyzer_plugin/lib/utilities/highlights/highlights.dart
@@ -22,7 +22,7 @@
    * The analysis result for the file for which the highlight regions are being
    * requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
 
 /**
diff --git a/pkg/analyzer_plugin/lib/utilities/kythe/entries.dart b/pkg/analyzer_plugin/lib/utilities/kythe/entries.dart
index b89cab9..11b42d1 100644
--- a/pkg/analyzer_plugin/lib/utilities/kythe/entries.dart
+++ b/pkg/analyzer_plugin/lib/utilities/kythe/entries.dart
@@ -20,7 +20,7 @@
   /**
    * The analysis result for the file in which the entries are being requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
 
 /**
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation.dart
index d3233bc..3bc3471 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation.dart
@@ -23,7 +23,7 @@
    * The analysis result for the file in which the navigation regions are being
    * requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
 
 /**
diff --git a/pkg/analyzer_plugin/lib/utilities/occurrences/occurrences.dart b/pkg/analyzer_plugin/lib/utilities/occurrences/occurrences.dart
index 820f38e..1fe0c1b 100644
--- a/pkg/analyzer_plugin/lib/utilities/occurrences/occurrences.dart
+++ b/pkg/analyzer_plugin/lib/utilities/occurrences/occurrences.dart
@@ -22,7 +22,7 @@
    * The analysis result for the file for which the occurrences information is
    * being requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
 
 /**
diff --git a/pkg/analyzer_plugin/lib/utilities/outline/outline.dart b/pkg/analyzer_plugin/lib/utilities/outline/outline.dart
index f675976..21983f6 100644
--- a/pkg/analyzer_plugin/lib/utilities/outline/outline.dart
+++ b/pkg/analyzer_plugin/lib/utilities/outline/outline.dart
@@ -21,7 +21,7 @@
   /**
    * The analysis result for the file for which the outline is being requested.
    */
-  ResolveResult get result;
+  ResolvedUnitResult get result;
 }
 
 /**
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
index 4a58401..e27ac4c 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
@@ -548,10 +548,10 @@
         return;
       }
       outOfTestExpect(message, isMap);
-      Map messageAsMap = message;
+      Map messageAsMap = message as Map;
       if (messageAsMap.containsKey('id')) {
         outOfTestExpect(messageAsMap['id'], isString);
-        String id = message['id'];
+        String id = message['id'] as String;
         Completer completer = _pendingCommands[id];
         if (completer == null) {
           fail('Unexpected response from server: id=$id');
diff --git a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
index 820f31e..d95c14d 100644
--- a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
+++ b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
@@ -134,6 +134,7 @@
  *   "relevance": int
  *   "completion": String
  *   "displayText": optional String
+ *   "elementUri": optional String
  *   "selectionOffset": int
  *   "selectionLength": int
  *   "isDeprecated": bool
@@ -165,6 +166,7 @@
           "isPotential": isBool
         }, optionalFields: {
           "displayText": isString,
+          "elementUri": isString,
           "docSummary": isString,
           "docComplete": isString,
           "declaringType": isString,
diff --git a/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
index 51e9802..f3d65c5 100644
--- a/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/assist_mixin_test.dart
@@ -5,14 +5,12 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/assist_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -23,9 +21,7 @@
 }
 
 @reflectiveTest
-class AssistsMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class AssistsMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -34,11 +30,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -90,7 +84,7 @@
   @override
   Future<AssistRequest> getAssistRequest(
       EditGetAssistsParams parameters) async {
-    AnalysisResult result = new MockAnalysisResult();
+    var result = new MockResolvedUnitResult();
     return new DartAssistRequestImpl(
         resourceProvider, parameters.offset, parameters.length, result);
   }
diff --git a/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
index 0dcc99e..0c51a0a 100644
--- a/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/completion_mixin_test.dart
@@ -5,14 +5,12 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/completion_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/utilities/completion/completion_core.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -23,9 +21,7 @@
 }
 
 @reflectiveTest
-class CompletionMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class CompletionMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -34,11 +30,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, 'int foo = bar;');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1, content: 'int foo = bar;');
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -98,7 +92,7 @@
   @override
   Future<CompletionRequest> getCompletionRequest(
       CompletionGetSuggestionsParams parameters) async {
-    AnalysisResult result = new MockAnalysisResult();
+    var result = new MockResolvedUnitResult();
     return new DartCompletionRequestImpl(
         resourceProvider, parameters.offset, result);
   }
diff --git a/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
index 1d785dd..decd70d 100644
--- a/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/fix_mixin_test.dart
@@ -6,17 +6,15 @@
 
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/fix_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/fixes/fixes.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -27,9 +25,7 @@
 }
 
 @reflectiveTest
-class FixesMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class FixesMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -38,11 +34,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -98,7 +92,7 @@
     int offset = parameters.offset;
     AnalysisError error = new AnalysisError(
         new MockSource(), 0, 0, CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT);
-    AnalysisResult result = new MockAnalysisResult(
+    var result = new MockResolvedUnitResult(
         lineInfo: new LineInfo([0, 20]), errors: [error]);
     return new DartFixesRequestImpl(resourceProvider, offset, [error], result);
   }
diff --git a/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
index 5123b40..0b429bc 100644
--- a/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/folding_mixin_test.dart
@@ -5,15 +5,13 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/folding_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/folding/folding.dart';
 import 'package:analyzer_plugin/utilities/folding/folding.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -24,9 +22,7 @@
 }
 
 @reflectiveTest
-class FoldingMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class FoldingMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -35,11 +31,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -93,7 +87,7 @@
 
   @override
   Future<FoldingRequest> getFoldingRequest(String path) async {
-    AnalysisResult result = new MockAnalysisResult(path: path);
+    var result = new MockResolvedUnitResult(path: path);
     return new DartFoldingRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
index c0b4543..ced8227 100644
--- a/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/highlights_mixin_test.dart
@@ -5,15 +5,13 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/highlights_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/highlights/highlights.dart';
 import 'package:analyzer_plugin/utilities/highlights/highlights.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -24,9 +22,7 @@
 }
 
 @reflectiveTest
-class HighlightsMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class HighlightsMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -35,11 +31,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -93,7 +87,7 @@
 
   @override
   Future<HighlightsRequest> getHighlightsRequest(String path) async {
-    AnalysisResult result = new MockAnalysisResult(path: path);
+    var result = new MockResolvedUnitResult(path: path);
     return new DartHighlightsRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
index 0ce5e0a..63f0f63 100644
--- a/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/kythe_mixin_test.dart
@@ -5,14 +5,12 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/kythe_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/kythe/entries.dart';
 import 'package:analyzer_plugin/utilities/kythe/entries.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -23,9 +21,7 @@
 }
 
 @reflectiveTest
-class KytheMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class KytheMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -34,11 +30,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -94,7 +88,7 @@
   @override
   Future<EntryRequest> getEntryRequest(
       KytheGetKytheEntriesParams parameters) async {
-    AnalysisResult result = new MockAnalysisResult();
+    var result = new MockResolvedUnitResult();
     return new DartEntryRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/mocks.dart b/pkg/analyzer_plugin/test/plugin/mocks.dart
index 3e7d651..79bb3bb 100644
--- a/pkg/analyzer_plugin/test/plugin/mocks.dart
+++ b/pkg/analyzer_plugin/test/plugin/mocks.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 import 'dart:collection';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
@@ -56,22 +57,6 @@
   Future<Null> performWork() => new Future.value(null);
 }
 
-class MockAnalysisResult implements AnalysisResult {
-  @override
-  final List<AnalysisError> errors;
-
-  @override
-  final LineInfo lineInfo;
-
-  @override
-  final String path;
-
-  MockAnalysisResult({this.errors, this.lineInfo, this.path});
-
-  @override
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
-
 class MockChannel implements PluginCommunicationChannel {
   bool _closed = false;
 
@@ -143,6 +128,22 @@
   }
 }
 
+class MockResolvedUnitResult implements ResolvedUnitResult {
+  @override
+  final List<AnalysisError> errors;
+
+  @override
+  final LineInfo lineInfo;
+
+  @override
+  final String path;
+
+  MockResolvedUnitResult({this.errors, this.lineInfo, this.path});
+
+  @override
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
 class MockResourceProvider implements ResourceProvider {
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
diff --git a/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
index 7996888..f4f2ffa 100644
--- a/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/navigation_mixin_test.dart
@@ -5,15 +5,13 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/navigation_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -24,9 +22,7 @@
 }
 
 @reflectiveTest
-class NavigationMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class NavigationMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -35,11 +31,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -109,7 +103,7 @@
   @override
   Future<NavigationRequest> getNavigationRequest(
       AnalysisGetNavigationParams parameters) async {
-    AnalysisResult result = new MockAnalysisResult(path: parameters.file);
+    var result = new MockResolvedUnitResult(path: parameters.file);
     return new DartNavigationRequestImpl(
         resourceProvider, parameters.offset, parameters.length, result);
   }
diff --git a/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
index 6555427..cf2b96f 100644
--- a/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/occurrences_mixin_test.dart
@@ -5,15 +5,13 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/occurrences_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/occurrences/occurrences.dart';
 import 'package:analyzer_plugin/utilities/occurrences/occurrences.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -24,9 +22,7 @@
 }
 
 @reflectiveTest
-class OccurrencesMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class OccurrencesMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -35,11 +31,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -120,7 +114,7 @@
 
   @override
   Future<OccurrencesRequest> getOccurrencesRequest(String path) async {
-    AnalysisResult result = new MockAnalysisResult(path: path);
+    var result = new MockResolvedUnitResult(path: path);
     return new DartOccurrencesRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart b/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
index 2ac58ad..cd15cfa 100644
--- a/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/outline_mixin_test.dart
@@ -5,15 +5,13 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/plugin/outline_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
 import 'package:analyzer_plugin/src/utilities/outline/outline.dart';
 import 'package:analyzer_plugin/utilities/outline/outline.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -24,9 +22,7 @@
 }
 
 @reflectiveTest
-class OutlineMixinTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class OutlineMixinTest with ResourceProviderMixin {
   String packagePath1;
   String filePath1;
   ContextRoot contextRoot1;
@@ -35,11 +31,9 @@
   _TestServerPlugin plugin;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
     channel = new MockChannel();
@@ -94,7 +88,7 @@
 
   @override
   Future<OutlineRequest> getOutlineRequest(String path) async {
-    AnalysisResult result = new MockAnalysisResult(path: path);
+    var result = new MockResolvedUnitResult(path: path);
     return new DartOutlineRequestImpl(resourceProvider, result);
   }
 }
diff --git a/pkg/analyzer_plugin/test/plugin/plugin_test.dart b/pkg/analyzer_plugin/test/plugin/plugin_test.dart
index 0356e77..118f33e 100644
--- a/pkg/analyzer_plugin/test/plugin/plugin_test.dart
+++ b/pkg/analyzer_plugin/test/plugin/plugin_test.dart
@@ -5,12 +5,11 @@
 import 'dart:async';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart';
-import 'package:path/src/context.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -21,9 +20,7 @@
 }
 
 @reflectiveTest
-class ServerPluginTest {
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
-
+class ServerPluginTest with ResourceProviderMixin {
   MockChannel channel;
   _TestServerPlugin plugin;
 
@@ -36,16 +33,14 @@
   ContextRoot contextRoot2;
 
   void setUp() {
-    Context pathContext = resourceProvider.pathContext;
-
-    packagePath1 = resourceProvider.convertPath('/package1');
-    filePath1 = pathContext.join(packagePath1, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath1, '');
+    packagePath1 = convertPath('/package1');
+    filePath1 = join(packagePath1, 'lib', 'test.dart');
+    newFile(filePath1);
     contextRoot1 = new ContextRoot(packagePath1, <String>[]);
 
-    packagePath2 = resourceProvider.convertPath('/package2');
-    filePath2 = pathContext.join(packagePath2, 'lib', 'test.dart');
-    resourceProvider.newFile(filePath2, '');
+    packagePath2 = convertPath('/package2');
+    filePath2 = join(packagePath2, 'lib', 'test.dart');
+    newFile(filePath2);
     contextRoot2 = new ContextRoot(packagePath2, <String>[]);
 
     channel = new MockChannel();
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index 0f8e505..1ed1d1d 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -4,14 +4,12 @@
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/context/source.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
@@ -33,7 +31,7 @@
   });
 }
 
-abstract class BuilderTestMixin {
+mixin BuilderTestMixin implements AbstractContextTest {
   SourceEdit getEdit(DartChangeBuilder builder) {
     SourceChange sourceChange = builder.sourceChange;
     expect(sourceChange, isNotNull);
@@ -55,14 +53,19 @@
     expect(fileEdit, isNotNull);
     return fileEdit.edits;
   }
+
+  /// Return a newly created Dart change builder.
+  DartChangeBuilderImpl newBuilder() =>
+      new DartChangeBuilder(session) as DartChangeBuilderImpl;
 }
 
 @reflectiveTest
-class DartChangeBuilderImplTest extends AbstractContextTest {
+class DartChangeBuilderImplTest extends AbstractContextTest
+    with BuilderTestMixin {
   test_createFileEditBuilder() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'library test;');
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     DartFileEditBuilderImpl fileEditBuilder =
         await builder.createFileEditBuilder(path);
     expect(fileEditBuilder, const TypeMatcher<DartFileEditBuilder>());
@@ -387,11 +390,11 @@
   }
 
   test_writeClassDeclaration_interfaces() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -404,10 +407,10 @@
   }
 
   test_writeClassDeclaration_isAbstract() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -419,10 +422,10 @@
   }
 
   test_writeClassDeclaration_memberWriter() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder).writeClassDeclaration('C',
@@ -436,11 +439,11 @@
   }
 
   test_writeClassDeclaration_mixins_noSuperclass() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -453,12 +456,12 @@
   }
 
   test_writeClassDeclaration_mixins_superclass() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {} class B {}');
     DartType typeA = await _getType(path, 'A');
     DartType typeB = await _getType(path, 'B');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -471,10 +474,10 @@
   }
 
   test_writeClassDeclaration_nameGroupName() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -493,11 +496,11 @@
   }
 
   test_writeClassDeclaration_superclass() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class B {}');
     DartType typeB = await _getType(path, 'B');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder).writeClassDeclaration('C',
@@ -516,10 +519,10 @@
   }
 
   test_writeConstructorDeclaration_bodyWriter() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class C {}');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       builder.addInsertion(9, (DartEditBuilder builder) {
         builder.writeConstructorDeclaration('A', bodyWriter: () {
@@ -532,7 +535,7 @@
   }
 
   test_writeConstructorDeclaration_fieldNames() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, r'''
 class C {
   final int a;
@@ -540,7 +543,7 @@
 }
 ''');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       builder.addInsertion(42, (DartEditBuilder builder) {
         builder.writeConstructorDeclaration('A', fieldNames: ['a', 'bb']);
@@ -551,10 +554,10 @@
   }
 
   test_writeConstructorDeclaration_initializerWriter() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class C {}');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       builder.addInsertion(9, (DartEditBuilder builder) {
         builder.writeConstructorDeclaration('A', initializerWriter: () {
@@ -567,10 +570,10 @@
   }
 
   test_writeConstructorDeclaration_parameterWriter() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class C {}');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       builder.addInsertion(9, (DartEditBuilder builder) {
         builder.writeConstructorDeclaration('A', parameterWriter: () {
@@ -583,11 +586,11 @@
   }
 
   test_writeFieldDeclaration_initializerWriter() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeFieldDeclaration('f',
@@ -601,11 +604,11 @@
   }
 
   test_writeFieldDeclaration_isConst() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeFieldDeclaration('f', isConst: true);
@@ -616,11 +619,11 @@
   }
 
   test_writeFieldDeclaration_isConst_isFinal() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -632,12 +635,12 @@
   }
 
   test_writeFieldDeclaration_isConst_type() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -649,11 +652,11 @@
   }
 
   test_writeFieldDeclaration_isFinal() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeFieldDeclaration('f', isFinal: true);
@@ -664,12 +667,12 @@
   }
 
   test_writeFieldDeclaration_isFinal_type() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -681,11 +684,11 @@
   }
 
   test_writeFieldDeclaration_isStatic() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeFieldDeclaration('f', isStatic: true);
@@ -696,11 +699,11 @@
   }
 
   test_writeFieldDeclaration_nameGroupName() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -721,12 +724,12 @@
   }
 
   test_writeFieldDeclaration_type_typeGroupName() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -747,11 +750,11 @@
   }
 
   test_writeFunctionDeclaration_noReturnType_noParams_body() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder).writeFunctionDeclaration('fib',
@@ -765,11 +768,11 @@
   }
 
   test_writeFunctionDeclaration_noReturnType_noParams_noBody() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -788,11 +791,11 @@
   }
 
   test_writeFunctionDeclaration_noReturnType_params_noBody() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder).writeFunctionDeclaration('fib',
@@ -806,13 +809,13 @@
   }
 
   test_writeFunctionDeclaration_returnType_noParams_noBody() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder).writeFunctionDeclaration('fib',
@@ -831,11 +834,11 @@
   }
 
   test_writeGetterDeclaration_bodyWriter() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeGetterDeclaration('g',
@@ -849,11 +852,11 @@
   }
 
   test_writeGetterDeclaration_isStatic() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -865,11 +868,11 @@
   }
 
   test_writeGetterDeclaration_nameGroupName() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -890,12 +893,12 @@
   }
 
   test_writeGetterDeclaration_returnType() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeGetterDeclaration('g',
@@ -916,7 +919,7 @@
   }
 
   test_writeLocalVariableDeclaration_noType_initializer() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -924,7 +927,7 @@
     addSource(path, content);
     await driver.getResult(path);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(11, (EditBuilder builder) {
         (builder as DartEditBuilder).writeLocalVariableDeclaration('foo',
@@ -938,7 +941,7 @@
   }
 
   test_writeLocalVariableDeclaration_noType_noInitializer() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -946,7 +949,7 @@
     addSource(path, content);
     await driver.getResult(path);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(11, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -965,7 +968,7 @@
   }
 
   test_writeLocalVariableDeclaration_noType_noInitializer_const() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -973,7 +976,7 @@
     addSource(path, content);
     await driver.getResult(path);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(11, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -985,7 +988,7 @@
   }
 
   test_writeLocalVariableDeclaration_noType_noInitializer_final() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -993,7 +996,7 @@
     addSource(path, content);
     await driver.getResult(path);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(11, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -1005,7 +1008,7 @@
   }
 
   test_writeLocalVariableDeclaration_type_initializer() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -1014,9 +1017,9 @@
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
 
-    ClassDeclaration A = unit.declarations[1];
+    ClassDeclaration A = unit.declarations[1] as ClassDeclaration;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(11, (EditBuilder builder) {
         (builder as DartEditBuilder).writeLocalVariableDeclaration('foo',
@@ -1030,7 +1033,7 @@
   }
 
   test_writeLocalVariableDeclaration_type_noInitializer() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -1039,9 +1042,9 @@
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
 
-    ClassDeclaration A = unit.declarations[1];
+    ClassDeclaration A = unit.declarations[1] as ClassDeclaration;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(11, (EditBuilder builder) {
         (builder as DartEditBuilder).writeLocalVariableDeclaration('foo',
@@ -1060,7 +1063,7 @@
   }
 
   test_writeLocalVariableDeclaration_type_noInitializer_final() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 void f() {
 
@@ -1069,9 +1072,9 @@
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
 
-    ClassDeclaration A = unit.declarations[1];
+    ClassDeclaration A = unit.declarations[1] as ClassDeclaration;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(11, (EditBuilder builder) {
         (builder as DartEditBuilder).writeLocalVariableDeclaration('foo',
@@ -1090,11 +1093,11 @@
   }
 
   test_writeMixinDeclaration_interfaces() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -1107,12 +1110,12 @@
   }
 
   test_writeMixinDeclaration_interfacesAndSuperclassConstraints() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {} class B {}');
     DartType typeA = await _getType(path, 'A');
     DartType typeB = await _getType(path, 'B');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder).writeMixinDeclaration('M',
@@ -1125,10 +1128,10 @@
   }
 
   test_writeMixinDeclaration_memberWriter() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder).writeMixinDeclaration('M',
@@ -1142,10 +1145,10 @@
   }
 
   test_writeMixinDeclaration_nameGroupName() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -1164,11 +1167,11 @@
   }
 
   test_writeMixinDeclaration_superclassConstraints() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'class A {}');
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(0, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -1529,6 +1532,27 @@
     );
   }
 
+  test_writeOverride_method_returnVoid_abstract() async {
+    await _assertWriteOverride(
+      content: '''
+abstract class A {
+  void test();
+}
+class B extends A {
+}
+''',
+      nameToOverride: 'test',
+      expected: '''
+  @override
+  void test() {
+    // TODO: implement test
+  }
+''',
+      displayText: 'test() { … }',
+      selection: new SourceRange(109, 0),
+    );
+  }
+
   test_writeOverride_method_voidAsTypeArgument_abstract() async {
     await _assertWriteOverride(
       content: '''
@@ -1590,6 +1614,7 @@
   }
 ''',
       displayText: 'value(int value) { … }',
+      selection: new SourceRange(133, 0),
     );
   }
 
@@ -1616,11 +1641,11 @@
   }
 
   test_writeParameter() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeParameter('a');
@@ -1631,12 +1656,12 @@
   }
 
   test_writeParameter_type() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeParameter('a', type: typeA);
@@ -1647,7 +1672,7 @@
   }
 
   test_writeParameterMatchingArgument() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = r'''
 f() {}
 g() {
@@ -1657,13 +1682,14 @@
 ''';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    FunctionDeclaration g = unit.declarations[1];
-    BlockFunctionBody body = g.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
+    FunctionDeclaration g = unit.declarations[1] as FunctionDeclaration;
+    BlockFunctionBody body = g.functionExpression.body as BlockFunctionBody;
+    ExpressionStatement statement =
+        body.block.statements[0] as ExpressionStatement;
+    MethodInvocation invocation = statement.expression as MethodInvocation;
     Expression argument = invocation.argumentList.arguments[0];
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(2, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -1675,17 +1701,17 @@
   }
 
   test_writeParameters_named() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'f(int a, {bool b = false, String c}) {}';
     addSource(path, content);
 
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    FunctionDeclaration f = unit.declarations[0];
+    FunctionDeclaration f = unit.declarations[0] as FunctionDeclaration;
     FormalParameterList parameters = f.functionExpression.parameters;
     Iterable<ParameterElement> elements = parameters.parameters
         .map(resolutionMap.elementDeclaredByFormalParameter);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeParameters(elements);
@@ -1697,16 +1723,16 @@
   }
 
   test_writeParameters_positional() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'f(int a, [bool b = false, String c]) {}';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    FunctionDeclaration f = unit.declarations[0];
+    FunctionDeclaration f = unit.declarations[0] as FunctionDeclaration;
     FormalParameterList parameters = f.functionExpression.parameters;
     Iterable<ParameterElement> elements = parameters.parameters
         .map(resolutionMap.elementDeclaredByFormalParameter);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeParameters(elements);
@@ -1718,16 +1744,16 @@
   }
 
   test_writeParameters_required() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'f(int i, String s) {}';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    FunctionDeclaration f = unit.declarations[0];
+    FunctionDeclaration f = unit.declarations[0] as FunctionDeclaration;
     FormalParameterList parameters = f.functionExpression.parameters;
     Iterable<ParameterElement> elements = parameters.parameters
         .map(resolutionMap.elementDeclaredByFormalParameter);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeParameters(elements);
@@ -1738,19 +1764,20 @@
   }
 
   test_writeParametersMatchingArguments_named() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 f(int i, String s) {
   g(s, index: i);
 }''';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    FunctionDeclaration f = unit.declarations[0];
-    BlockFunctionBody body = f.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
+    FunctionDeclaration f = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = f.functionExpression.body as BlockFunctionBody;
+    ExpressionStatement statement =
+        body.block.statements[0] as ExpressionStatement;
+    MethodInvocation invocation = statement.expression as MethodInvocation;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -1762,19 +1789,20 @@
   }
 
   test_writeParametersMatchingArguments_required() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '''
 f(int i, String s) {
   g(s, i);
 }''';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    FunctionDeclaration f = unit.declarations[0];
-    BlockFunctionBody body = f.functionExpression.body;
-    ExpressionStatement statement = body.block.statements[0];
-    MethodInvocation invocation = statement.expression;
+    FunctionDeclaration f = unit.declarations[0] as FunctionDeclaration;
+    BlockFunctionBody body = f.functionExpression.body as BlockFunctionBody;
+    ExpressionStatement statement =
+        body.block.statements[0] as ExpressionStatement;
+    MethodInvocation invocation = statement.expression as MethodInvocation;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -1786,14 +1814,14 @@
   }
 
   test_writeReference_method() async {
-    String aPath = provider.convertPath('/a.dart');
+    String aPath = convertPath('/a.dart');
     addSource(aPath, r'''
 class A {
   void foo() {}
 }
 ''');
 
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = r'''
 import 'a.dart';
 ''';
@@ -1802,7 +1830,7 @@
     var aElement = await _getClassElement(aPath, 'A');
     var fooElement = aElement.methods[0];
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
         builder.writeReference(fooElement);
@@ -1813,10 +1841,10 @@
   }
 
   test_writeReference_topLevel_hasImport_noPrefix() async {
-    String aPath = provider.convertPath('/a.dart');
+    String aPath = convertPath('/home/test/lib/a.dart');
     addSource(aPath, 'const a = 42;');
 
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = r'''
 import 'a.dart';
 ''';
@@ -1824,7 +1852,7 @@
 
     var aElement = await _getTopLevelAccessorElement(aPath, 'a');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
         builder.writeReference(aElement);
@@ -1835,10 +1863,10 @@
   }
 
   test_writeReference_topLevel_hasImport_prefix() async {
-    String aPath = provider.convertPath('/a.dart');
+    String aPath = convertPath('/home/test/lib/a.dart');
     addSource(aPath, 'const a = 42;');
 
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = r'''
 import 'a.dart' as p;
 ''';
@@ -1846,7 +1874,7 @@
 
     var aElement = await _getTopLevelAccessorElement(aPath, 'a');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
         builder.writeReference(aElement);
@@ -1857,16 +1885,16 @@
   }
 
   test_writeReference_topLevel_noImport() async {
-    String aPath = provider.convertPath('/a.dart');
+    String aPath = convertPath('/home/test/bin/a.dart');
     addSource(aPath, 'const a = 42;');
 
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/bin/test.dart');
     String content = '';
     addSource(path, content);
 
     var aElement = await _getTopLevelAccessorElement(aPath, 'a');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (DartEditBuilder builder) {
         builder.writeReference(aElement);
@@ -1879,12 +1907,12 @@
   }
 
   test_writeType_dynamic() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeType(resolutionMap
@@ -1925,13 +1953,13 @@
   }
 
   test_writeType_genericType() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B<E> {}';
     addSource(path, content);
     InterfaceType typeA = await _getType(path, 'A');
     InterfaceType typeB = await _getType(path, 'B');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeType(typeB.instantiate([typeA]));
@@ -1942,12 +1970,12 @@
   }
 
   test_writeType_groupName() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B extends A {} class C extends B {}';
     addSource(path, content);
     DartType typeC = await _getType(path, 'C');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeType(typeC, groupName: 'type');
@@ -1964,12 +1992,12 @@
   }
 
   test_writeType_groupName_addSupertypeProposals() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B extends A {} class C extends B {}';
     addSource(path, content);
     DartType typeC = await _getType(path, 'C');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder)
@@ -1997,14 +2025,14 @@
   }
 
   test_writeType_groupName_invalidType() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A<T> {}';
     addSource(path, content);
 
     InterfaceType typeA = await _getType(path, 'A');
     DartType typeT = typeA.typeParameters.single.type;
 
-    var builder = new DartChangeBuilder(session);
+    var builder = newBuilder();
     await builder.addFileEdit(path, (builder) {
       builder.addInsertion(content.length, (builder) {
         // "T" cannot be written, because we are outside of "A".
@@ -2024,11 +2052,11 @@
   }
 
   test_writeType_null() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeType(null);
@@ -2039,8 +2067,8 @@
   }
 
   test_writeType_prefixGenerator() async {
-    String aPath = provider.convertPath('/a.dart');
-    String bPath = provider.convertPath('/b.dart');
+    String aPath = convertPath('/home/test/lib/a.dart');
+    String bPath = convertPath('/home/test/lib/b.dart');
 
     addSource(aPath, r'''
 class A1 {}
@@ -2050,7 +2078,7 @@
 class B {}
 ''');
 
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = '';
     addSource(path, content);
 
@@ -2063,7 +2091,7 @@
       return '_prefix${nextPrefixIndex++}';
     }
 
-    var builder = new DartChangeBuilder(session);
+    var builder = newBuilder();
     await builder.addFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
         builder.writeType(a1.type);
@@ -2080,8 +2108,8 @@
     expect(edits, hasLength(2));
     expect(
         edits[0].replacement,
-        equalsIgnoringWhitespace(
-            "import 'a.dart' as _prefix0; import 'b.dart' as _prefix1;"));
+        equalsIgnoringWhitespace("import 'package:test/a.dart' as _prefix0; "
+            "import 'package:test/b.dart' as _prefix1;"));
     expect(
         edits[1].replacement,
         equalsIgnoringWhitespace(
@@ -2089,12 +2117,12 @@
   }
 
   test_writeType_required_dynamic() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     CompilationUnit unit = (await driver.getResult(path))?.unit;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeType(
@@ -2111,12 +2139,12 @@
   }
 
   test_writeType_required_notNull() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeType(typeA, required: true);
@@ -2127,11 +2155,11 @@
   }
 
   test_writeType_required_null() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeType(null, required: true);
@@ -2142,12 +2170,12 @@
   }
 
   test_writeType_simpleType() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilder).writeType(typeA);
@@ -2167,11 +2195,11 @@
   }
 
   test_writeTypes_empty() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilderImpl).writeTypes([]);
@@ -2182,13 +2210,13 @@
   }
 
   test_writeTypes_noPrefix() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
     DartType typeB = await _getType(path, 'B');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilderImpl).writeTypes([typeA, typeB]);
@@ -2199,11 +2227,11 @@
   }
 
   test_writeTypes_null() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {}';
     addSource(path, content);
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilderImpl).writeTypes(null);
@@ -2214,13 +2242,13 @@
   }
 
   test_writeTypes_prefix() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = 'class A {} class B {}';
     addSource(path, content);
     DartType typeA = await _getType(path, 'A');
     DartType typeB = await _getType(path, 'B');
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 1, (EditBuilder builder) {
         (builder as DartEditBuilderImpl)
@@ -2233,9 +2261,9 @@
 
   Future<void> _assertImportLibrary(
       String initialCode, List<String> newUris, String expectedCode) async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, initialCode);
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (DartFileEditBuilder builder) {
       for (String newUri in newUris) {
         builder.importLibrary(Uri.parse(newUri));
@@ -2266,7 +2294,7 @@
     String displayText,
     SourceRange selection,
   }) async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, content);
 
     TypeSystem typeSystem = await session.typeSystem;
@@ -2279,10 +2307,10 @@
     StringBuffer displayBuffer =
         displayText != null ? new StringBuffer() : null;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       builder.addInsertion(content.length - 2, (EditBuilder builder) {
-        ExecutableElement element = inherited.element;
+        ExecutableElement element = inherited.element as ExecutableElement;
         (builder as DartEditBuilder).writeOverride(
           inherited,
           displayTextBuffer: displayBuffer,
@@ -2299,13 +2327,13 @@
   }
 
   Future<void> _assertWriteType(String typeCode, {String declarations}) async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     String content = (declarations ?? '') + '$typeCode v;';
     addSource(path, content);
 
     var f = await _getTopLevelAccessorElement(path, 'v');
 
-    var builder = new DartChangeBuilder(session);
+    var builder = newBuilder();
     await builder.addFileEdit(path, (builder) {
       builder.addInsertion(content.length - 1, (builder) {
         builder.writeType(f.returnType);
@@ -2336,22 +2364,21 @@
 class DartFileEditBuilderImplTest extends AbstractContextTest
     with BuilderTestMixin {
   TypeProvider get typeProvider {
-    AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
-    context.sourceFactory = new SourceFactoryImpl([new DartUriResolver(sdk)]);
-    return new TestTypeProvider(context);
+    return new TestTypeProvider(null, driver);
   }
 
   test_convertFunctionFromSyncToAsync_closure() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '''var f = () {}''');
 
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    TopLevelVariableDeclaration variable = unit.declarations[0];
+    TopLevelVariableDeclaration variable =
+        unit.declarations[0] as TopLevelVariableDeclaration;
     FunctionBody body =
         (variable.variables.variables[0].initializer as FunctionExpression)
             .body;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       (builder as DartFileEditBuilder)
           .convertFunctionFromSyncToAsync(body, typeProvider);
@@ -2362,30 +2389,28 @@
   }
 
   test_convertFunctionFromSyncToAsync_topLevelFunction() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
 
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    FunctionDeclaration function = unit.declarations[0];
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
     FunctionBody body = function.functionExpression.body;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       (builder as DartFileEditBuilder)
           .convertFunctionFromSyncToAsync(body, typeProvider);
     });
     List<SourceEdit> edits = getEdits(builder);
-    expect(edits, hasLength(3));
+    expect(edits, hasLength(2));
     expect(edits[0].replacement, equalsIgnoringWhitespace('async'));
-    expect(
-        edits[1].replacement, equalsIgnoringWhitespace("import 'dart:async';"));
-    expect(edits[2].replacement, equalsIgnoringWhitespace('Future<String>'));
+    expect(edits[1].replacement, equalsIgnoringWhitespace('Future<String>'));
   }
 
   test_createEditBuilder() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'library test;');
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       int offset = 4;
       int length = 5;
@@ -2400,37 +2425,35 @@
   }
 
   test_replaceTypeWithFuture() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
 
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    FunctionDeclaration function = unit.declarations[0];
+    FunctionDeclaration function = unit.declarations[0] as FunctionDeclaration;
     TypeAnnotation type = function.returnType;
 
-    DartChangeBuilderImpl builder = new DartChangeBuilder(session);
+    DartChangeBuilderImpl builder = newBuilder();
     await builder.addFileEdit(path, (FileEditBuilder builder) {
       (builder as DartFileEditBuilder)
           .replaceTypeWithFuture(type, typeProvider);
     });
     List<SourceEdit> edits = getEdits(builder);
-    expect(edits, hasLength(2));
-    expect(
-        edits[0].replacement, equalsIgnoringWhitespace("import 'dart:async';"));
-    expect(edits[1].replacement, equalsIgnoringWhitespace('Future<String>'));
+    expect(edits, hasLength(1));
+    expect(edits[0].replacement, equalsIgnoringWhitespace('Future<String>'));
   }
 }
 
 @reflectiveTest
 class DartLinkedEditBuilderImplTest extends AbstractContextTest {
   test_addSuperTypesAsSuggestions() async {
-    String path = provider.convertPath('/test.dart');
+    String path = convertPath('/home/test/lib/test.dart');
     addSource(path, '''
 class A {}
 class B extends A {}
 class C extends B {}
 ''');
     CompilationUnit unit = (await driver.getResult(path))?.unit;
-    ClassDeclaration classC = unit.declarations[2];
+    ClassDeclaration classC = unit.declarations[2] as ClassDeclaration;
     DartLinkedEditBuilderImpl builder = new DartLinkedEditBuilderImpl(null);
     builder.addSuperTypesAsSuggestions(classC.declaredElement.type);
     List<LinkedEditSuggestion> suggestions = builder.suggestions;
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
index 45c0388..241ec1f 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/completion_target_test.dart
@@ -4,8 +4,8 @@
 
 import 'dart:async';
 
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
@@ -36,8 +36,8 @@
     expect(nextOffset, equals(-1), reason: 'too many ^');
     content = content.substring(0, completionOffset) +
         content.substring(completionOffset + 1);
-    testSource = addSource(provider.convertPath('/test.dart'), content);
-    AnalysisResult result = await driver.getResult(testSource.fullName);
+    testSource = addSource('/test.dart', content);
+    ResolvedUnitResult result = await driver.getResult(testSource.fullName);
     target = new CompletionTarget.forOffset(result.unit, completionOffset);
   }
 
@@ -56,7 +56,7 @@
 
     // Assert with parsed unit
     assertCommon();
-    AnalysisResult result = await driver.getResult(testSource.fullName);
+    ResolvedUnitResult result = await driver.getResult(testSource.fullName);
     target = new CompletionTarget.forOffset(result.unit, completionOffset);
     // Assert more with resolved unit
     assertCommon();
diff --git a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
index f85cb6f..f4c2eb8 100644
--- a/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/completion/optype_test.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
 import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
@@ -107,11 +107,7 @@
 
   test_AssertInitializer() async {
     addTestSource('class C { C() : assert(^); }');
-    await assertOpType(
-        constructors: true,
-        returnValue: true,
-        typeNames: true,
-        constructorBody: true);
+    await assertOpType(constructors: true, returnValue: true, typeNames: true);
   }
 
   test_AssignmentExpression_RHS() async {
@@ -427,25 +423,13 @@
         methodBody: true);
   }
 
-  test_Block_keyword() async {
-    addTestSource('class C { static C get instance => null; } main() {C.in^}');
-    await assertOpType(
-        constructors: true,
-        prefixed: true,
-        returnValue: true,
-        typeNames: true,
-        voidReturn: true,
-        functionBody: true);
-  }
-
-  test_Block_static() async {
-    addTestSource('class A {static foo() {^}}');
+  test_Block_in_constructor() async {
+    addTestSource('class A {A() {^}}');
     await assertOpType(
         constructors: true,
         returnValue: true,
         typeNames: true,
-        staticMethodBody: true,
-        methodBody: true,
+        constructorBody: true,
         voidReturn: true);
   }
 
@@ -469,13 +453,25 @@
         voidReturn: true);
   }
 
-  test_Block_in_constructor() async {
-    addTestSource('class A {A() {^}}');
+  test_Block_keyword() async {
+    addTestSource('class C { static C get instance => null; } main() {C.in^}');
+    await assertOpType(
+        constructors: true,
+        prefixed: true,
+        returnValue: true,
+        typeNames: true,
+        voidReturn: true,
+        functionBody: true);
+  }
+
+  test_Block_static() async {
+    addTestSource('class A {static foo() {^}}');
     await assertOpType(
         constructors: true,
         returnValue: true,
         typeNames: true,
-        constructorBody: true,
+        staticMethodBody: true,
+        methodBody: true,
         voidReturn: true);
   }
 
@@ -557,7 +553,6 @@
         returnValue: true,
         typeNames: true,
         voidReturn: true,
-        methodBody: true,
         kind: CompletionSuggestionKind.IDENTIFIER);
   }
 
@@ -611,14 +606,40 @@
         methodBody: true);
   }
 
+  test_ConstructorFieldInitializer_name() async {
+    addTestSource(r'''
+class C {
+  final int foo;
+  
+  C() : ^
+}
+''');
+    await assertOpType();
+  }
+
+  test_ConstructorFieldInitializer_value() async {
+    addTestSource(r'''
+class C {
+  final int foo;
+  
+  C() : foo = ^
+}
+''');
+    await assertOpType(
+      constructors: true,
+      returnValue: true,
+      typeNames: true,
+    );
+  }
+
   test_DefaultFormalParameter_named_expression() async {
     // DefaultFormalParameter FormalParameterList MethodDeclaration
     addTestSource('class A {a(blat: ^) { }}');
     await assertOpType(
-        constructors: true,
-        returnValue: true,
-        typeNames: true,
-        methodBody: true);
+      constructors: true,
+      returnValue: true,
+      typeNames: true,
+    );
   }
 
   test_DoStatement() async {
@@ -698,33 +719,33 @@
     // FormalParameterList MethodDeclaration
     addTestSource('class A {a(b.^ f) { }}');
     await assertOpType(
-        constructors: true,
-        returnValue: true,
-        typeNames: true,
-        prefixed: true,
-        methodBody: true);
+      constructors: true,
+      returnValue: true,
+      typeNames: true,
+      prefixed: true,
+    );
   }
 
   test_FormalParameter_partialType2() async {
     // FormalParameterList MethodDeclaration
     addTestSource('class A {a(b.z^ f) { }}');
     await assertOpType(
-        constructors: true,
-        returnValue: true,
-        typeNames: true,
-        prefixed: true,
-        methodBody: true);
+      constructors: true,
+      returnValue: true,
+      typeNames: true,
+      prefixed: true,
+    );
   }
 
   test_FormalParameter_partialType3() async {
     // FormalParameterList MethodDeclaration
     addTestSource('class A {a(b.^) { }}');
     await assertOpType(
-        constructors: true,
-        returnValue: true,
-        typeNames: true,
-        prefixed: true,
-        methodBody: true);
+      constructors: true,
+      returnValue: true,
+      typeNames: true,
+      prefixed: true,
+    );
   }
 
   test_ForStatement_condition() async {
@@ -1604,7 +1625,7 @@
   test_FormalParameterList() async {
     // FormalParameterList MethodDeclaration
     addTestSource('class A {a(^) { }}');
-    await assertOpType(typeNames: true, methodBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_ForStatement_initializer() async {
@@ -1680,7 +1701,7 @@
     addTestSource('''
       /// some dartdoc ^
       zoo(z) { } String name;''');
-    await assertOpType(functionBody: true);
+    await assertOpType();
   }
 
   test_FunctionDeclaration_inLineDocComment2() async {
@@ -1688,7 +1709,7 @@
     addTestSource('''
       /// some ^dartdoc
       zoo(z) { } String name;''');
-    await assertOpType(functionBody: true);
+    await assertOpType();
   }
 
   test_FunctionDeclaration_inStarComment() async {
@@ -1706,13 +1727,13 @@
   test_FunctionDeclaration_inStarDocComment() async {
     // Comment  FunctionDeclaration  CompilationUnit
     addTestSource('/** ^ */ zoo(z) { } String name; ');
-    await assertOpType(functionBody: true);
+    await assertOpType();
   }
 
   test_FunctionDeclaration_inStarDocComment2() async {
     // Comment  FunctionDeclaration  CompilationUnit
     addTestSource('/**  *^/ zoo(z) { } String name;');
-    await assertOpType(functionBody: true);
+    await assertOpType();
   }
 
   test_FunctionDeclaration_returnType() async {
@@ -1743,7 +1764,7 @@
     addTestSource('''
       /// some dartdoc
       ^ zoo(z) { } String name;''');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_FunctionDeclaration_returnType_afterLineDocComment2() async {
@@ -1751,7 +1772,7 @@
     addTestSource('''
 /// some dartdoc
 ^ zoo(z) { } String name;''');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_FunctionDeclaration_returnType_afterStarComment() async {
@@ -1769,19 +1790,19 @@
   test_FunctionDeclaration_returnType_afterStarDocComment() async {
     // FunctionDeclaration  CompilationUnit
     addTestSource('/** */ ^ zoo(z) { } String name;');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_FunctionDeclaration_returnType_afterStarDocComment2() async {
     // FunctionDeclaration  CompilationUnit
     addTestSource('/** */^ zoo(z) { } String name;');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_FunctionExpression() async {
     // BlockFunctionBody  FunctionExpression  FunctionDeclaration
     addTestSource('main()^ { int b = 2; b++; b. }');
-    await assertOpType(functionBody: true);
+    await assertOpType();
   }
 
   test_FunctionExpressionInvocation() async {
@@ -1898,7 +1919,7 @@
       class C2 {
         /// some dartdoc ^
         zoo(z) { } String name; }''');
-    await assertOpType(methodBody: true);
+    await assertOpType();
   }
 
   test_MethodDeclaration_inLineDocComment2() async {
@@ -1907,7 +1928,7 @@
       class C2 {
         /// some ^dartdoc
         zoo(z) { } String name; }''');
-    await assertOpType(methodBody: true);
+    await assertOpType();
   }
 
   test_MethodDeclaration_inStarComment() async {
@@ -1925,13 +1946,13 @@
   test_MethodDeclaration_inStarDocComment() async {
     // Comment  MethodDeclaration  ClassDeclaration  CompilationUnit
     addTestSource('class C2 {/** ^ */ zoo(z) { } String name; }');
-    await assertOpType(methodBody: true);
+    await assertOpType();
   }
 
   test_MethodDeclaration_inStarDocComment2() async {
     // Comment  MethodDeclaration  ClassDeclaration  CompilationUnit
     addTestSource('class C2 {/**  *^/ zoo(z) { } String name; }');
-    await assertOpType(methodBody: true);
+    await assertOpType();
   }
 
   test_MethodDeclaration_returnType() async {
@@ -1965,7 +1986,7 @@
       class C2 {
         /// some dartdoc
         ^ zoo(z) { } String name; }''');
-    await assertOpType(typeNames: true, methodBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_MethodDeclaration_returnType_afterLineDocComment2() async {
@@ -1974,7 +1995,7 @@
 class C2 {
   /// some dartdoc
 ^ zoo(z) { } String name; }''');
-    await assertOpType(typeNames: true, methodBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_MethodDeclaration_returnType_afterStarComment() async {
@@ -1992,13 +2013,13 @@
   test_MethodDeclaration_returnType_afterStarDocComment() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
     addTestSource('class C2 {/** */ ^ zoo(z) { } String name; }');
-    await assertOpType(typeNames: true, methodBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_MethodDeclaration_returnType_afterStarDocComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
     addTestSource('class C2 {/** */^ zoo(z) { } String name; }');
-    await assertOpType(typeNames: true, methodBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_NamedExpression() async {
@@ -2043,49 +2064,49 @@
   test_SimpleFormalParameter_name1() async {
     // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
     addTestSource('m(String na^) {}');
-    await assertOpType(typeNames: false, functionBody: true);
+    await assertOpType(typeNames: false);
   }
 
   test_SimpleFormalParameter_name2() async {
     // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
     addTestSource('m(int first, String na^) {}');
-    await assertOpType(typeNames: false, functionBody: true);
+    await assertOpType(typeNames: false);
   }
 
   test_SimpleFormalParameter_type_optionalNamed() async {
     // SimpleIdentifier  DefaultFormalParameter  FormalParameterList
     addTestSource('m({Str^}) {}');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_SimpleFormalParameter_type_optionalPositional() async {
     // SimpleIdentifier  DefaultFormalParameter  FormalParameterList
     addTestSource('m([Str^]) {}');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_SimpleFormalParameter_type_withName() async {
     // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
     addTestSource('m(Str^ name) {}');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_SimpleFormalParameter_type_withoutName1() async {
     // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
     addTestSource('m(Str^) {}');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_SimpleFormalParameter_type_withoutName2() async {
     // FormalParameterList
     addTestSource('m(^) {}');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_SimpleFormalParameter_type_withoutName3() async {
     // SimpleIdentifier  SimpleFormalParameter  FormalParameterList
     addTestSource('m(int first, Str^) {}');
-    await assertOpType(typeNames: true, functionBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_SwitchCase_before() async {
@@ -2112,7 +2133,7 @@
       class A implements I {
         A(this.^) {}
       }''');
-    await assertOpType(prefixed: true, constructorBody: true);
+    await assertOpType(prefixed: true);
   }
 
   test_ThisExpression_constructor_param2() async {
@@ -2121,7 +2142,7 @@
       class A implements I {
         A(this.f^) {}
       }''');
-    await assertOpType(prefixed: true, constructorBody: true);
+    await assertOpType(prefixed: true);
   }
 
   test_ThisExpression_constructor_param3() async {
@@ -2130,7 +2151,7 @@
       class A implements I {
         A(this.^f) {}
       }''');
-    await assertOpType(prefixed: true, constructorBody: true);
+    await assertOpType(prefixed: true);
   }
 
   test_ThisExpression_constructor_param4() async {
@@ -2139,7 +2160,7 @@
       class A implements I {
         A(Str^ this.foo) {}
       }''');
-    await assertOpType(typeNames: true, constructorBody: true);
+    await assertOpType(typeNames: true);
   }
 
   test_TopLevelVariableDeclaration_typed_name() async {
@@ -2221,7 +2242,7 @@
 
 /// Common test methods to Dart1/Dart2 versions of OpType tests.
 class OpTypeTestCommon extends AbstractContextTest {
-  String testpath;
+  String testPath;
   int completionOffset;
   OpType visitor;
 
@@ -2232,7 +2253,7 @@
     expect(nextOffset, equals(-1), reason: 'too many ^');
     content = content.substring(0, completionOffset) +
         content.substring(completionOffset + 1);
-    super.addSource(testpath, content);
+    super.addSource(testPath, content);
   }
 
   Future<void> assertOpType(
@@ -2251,10 +2272,10 @@
       bool voidReturn: false,
       CompletionSuggestionKind kind:
           CompletionSuggestionKind.INVOCATION}) async {
-    AnalysisResult analysisResult = await driver.getResult(testpath);
+    ResolvedUnitResult resolvedUnit = await driver.getResult(testPath);
 
     CompletionTarget completionTarget =
-        new CompletionTarget.forOffset(analysisResult.unit, completionOffset);
+        new CompletionTarget.forOffset(resolvedUnit.unit, completionOffset);
     visitor = new OpType.forCompletion(completionTarget, completionOffset);
 
     expect(visitor.includeCaseLabelSuggestions, caseLabel, reason: 'caseLabel');
@@ -2283,6 +2304,6 @@
   @override
   void setUp() {
     super.setUp();
-    testpath = provider.convertPath('/completionTest.dart');
+    testPath = convertPath('/completionTest.dart');
   }
 }
diff --git a/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart b/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
index 3811ea4..fd96c31 100644
--- a/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test.dart
@@ -42,9 +42,9 @@
 ''');
     NodeList<CompilationUnitMember> declarations = unit.declarations;
     expect(declarations, hasLength(2));
-    FunctionDeclaration f = declarations[1];
+    FunctionDeclaration f = declarations[1] as FunctionDeclaration;
     expect(f, isNotNull);
-    BlockFunctionBody body = f.functionExpression.body;
+    BlockFunctionBody body = f.functionExpression.body as BlockFunctionBody;
     Statement statement = body.block.statements[0];
     expect(statement, const TypeMatcher<ForEachStatement>());
     statement.accept(new TestVisitor(statement.offset));
@@ -70,6 +70,9 @@
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {}
 
   @override
+  void declaredGenericTypeAlias(GenericTypeAlias declaration) {}
+
+  @override
   void declaredLabel(Label label, bool isCaseLabel) {}
 
   @override
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart
index 8c7cdaf..f06e837 100644
--- a/pkg/analyzer_plugin/test/support/abstract_context.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart
@@ -10,20 +10,14 @@
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/analysis/file_state.dart';
-import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/engine.dart' as engine;
-import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/testing/element_search.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
-
-import 'mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 
 /**
  * Finds an [Element] with the given [name].
@@ -47,24 +41,18 @@
  */
 typedef void _ElementVisitorFunction(Element element);
 
-class AbstractContextTest {
-  MemoryResourceProvider provider;
-  DartSdk sdk;
-  Map<String, List<Folder>> packageMap;
-  UriResolver resourceResolver;
-
-  StringBuffer _logBuffer = new StringBuffer();
-  FileContentOverlay _fileContentOverlay = new FileContentOverlay();
+class AbstractContextTest with ResourceProviderMixin {
   AnalysisDriver _driver;
 
   AnalysisDriver get driver => _driver;
 
-  /**
-   * Return the analysis session associated with the driver.
-   */
   AnalysisSession get session => driver.currentSession;
 
-  Source addMetaPackageSource() => addPackageSource('meta', 'meta.dart', r'''
+  /// The file system specific `/home/test/pubspec.yaml` path.
+  String get testPubspecPath => convertPath('/home/test/pubspec.yaml');
+
+  void addMetaPackage() {
+    addPackageFile('meta', 'meta.dart', r'''
 library meta;
 
 const Required required = const Required();
@@ -74,21 +62,23 @@
   const Required([this.reason]);
 }
 ''');
+  }
 
-  Source addPackageSource(String packageName, String filePath, String content) {
-    packageMap[packageName] = [(newFolder('/pubcache/$packageName'))];
-    File file = newFile('/pubcache/$packageName/$filePath', content);
-    return file.createSource();
+  /// Add a new file with the given [pathInLib] to the package with the
+  /// given [packageName].  Then ensure that the test package depends on the
+  /// [packageName].
+  File addPackageFile(String packageName, String pathInLib, String content) {
+    var packagePath = '/.pub-cache/$packageName';
+    _addTestPackageDependency(packageName, packagePath);
+    return newFile('$packagePath/lib/$pathInLib', content: content);
   }
 
   Source addSource(String path, String content, [Uri uri]) {
-    if (path.startsWith('/')) {
-      path = provider.convertPath(path);
-    }
-    driver.addFile(path);
-    driver.changeFile(path);
-    _fileContentOverlay[path] = content;
-    return provider.getFile(path).createSource();
+    File file = newFile(path, content: content);
+    Source source = file.createSource(uri);
+    driver.addFile(file.path);
+    driver.changeFile(file.path);
+    return source;
   }
 
   Element findElementInUnit(CompilationUnit unit, String name,
@@ -98,55 +88,55 @@
         .single;
   }
 
-  File newFile(String path, [String content]) =>
-      provider.newFile(provider.convertPath(path), content ?? '');
-
-  Folder newFolder(String path) =>
-      provider.newFolder(provider.convertPath(path));
-
-  void processRequiredPlugins() {
-    AnalysisEngine.instance.processRequiredPlugins();
-  }
-
   Future<CompilationUnit> resolveLibraryUnit(Source source) async {
     return (await driver.getResult(source.fullName))?.unit;
   }
 
   void setUp() {
-    processRequiredPlugins();
-    setupResourceProvider();
-    sdk = new MockSdk(resourceProvider: provider);
-    resourceResolver = new ResourceUriResolver(provider);
-    packageMap = new Map<String, List<Folder>>();
-    PackageMapUriResolver packageResolver =
-        new PackageMapUriResolver(provider, packageMap);
-    SourceFactory sourceFactory = new SourceFactory(
-        [new DartUriResolver(sdk), packageResolver, resourceResolver]);
-    PerformanceLog log = new PerformanceLog(_logBuffer);
-    AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log);
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    _driver = new AnalysisDriver(
-        scheduler,
-        log,
-        provider,
-        new MemoryByteStore(),
-        _fileContentOverlay,
-        null,
-        sourceFactory,
-        options);
-    scheduler.start();
-    AnalysisEngine.instance.logger = PrintLogger.instance;
-  }
+    new MockSdk(resourceProvider: resourceProvider);
 
-  void setupResourceProvider() {
-    provider = new MemoryResourceProvider();
+    newFolder('/home/test');
+    newFile('/home/test/.packages', content: r'''
+test:file:///home/test/lib
+''');
+
+    _createDriver();
   }
 
   void tearDown() {
-    provider = null;
     AnalysisEngine.instance.clearCaches();
     AnalysisEngine.instance.logger = null;
   }
+
+  void _addTestPackageDependency(String name, String rootPath) {
+    var packagesFile = getFile('/home/test/.packages');
+    var packagesContent = packagesFile.readAsStringSync();
+
+    // Ignore if there is already the same package dependency.
+    if (packagesContent.contains('$name:file://')) {
+      return;
+    }
+
+    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
+
+    packagesFile.writeAsStringSync(packagesContent);
+
+    _createDriver();
+  }
+
+  void _createDriver() {
+    var collection = AnalysisContextCollectionImpl(
+      includedPaths: [convertPath('/home')],
+      enableIndex: true,
+      resourceProvider: resourceProvider,
+      sdkPath: convertPath('/sdk'),
+    );
+
+    var testPath = convertPath('/home/test');
+    var context = collection.contextFor(testPath) as DriverBasedAnalysisContext;
+
+    _driver = context.driver;
+  }
 }
 
 /**
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
index 7a3b6bc..0b14065 100644
--- a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart
@@ -49,7 +49,7 @@
   AstNode findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) {
     AstNode result = new NodeLocator(offset).searchWithin(testUnit);
     if (result != null && predicate != null) {
-      result = result.getAncestor(predicate);
+      result = result.thisOrAncestorMatching(predicate);
     }
     return result;
   }
@@ -117,6 +117,6 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = provider.convertPath('/test.dart');
+    testFile = convertPath('/test.dart');
   }
 }
diff --git a/pkg/analyzer_plugin/test/support/mock_sdk.dart b/pkg/analyzer_plugin/test/support/mock_sdk.dart
deleted file mode 100644
index f76516c4..0000000
--- a/pkg/analyzer_plugin/test/support/mock_sdk.dart
+++ /dev/null
@@ -1,685 +0,0 @@
-// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/file_system/file_system.dart' as resource;
-import 'package:analyzer/file_system/memory_file_system.dart' as resource;
-import 'package:analyzer/src/context/cache.dart';
-import 'package:analyzer/src/context/context.dart';
-import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
-import 'package:analyzer/src/generated/sdk.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/summary/idl.dart' show PackageBundle;
-import 'package:analyzer/src/summary/summary_file_builder.dart';
-
-const String librariesContent = r'''
-const Map<String, LibraryInfo> libraries = const {
-  "async": const LibraryInfo("async/async.dart"),
-  "collection": const LibraryInfo("collection/collection.dart"),
-  "convert": const LibraryInfo("convert/convert.dart"),
-  "core": const LibraryInfo("core/core.dart"),
-  "html": const LibraryInfo(
-    "html/dartium/html_dartium.dart",
-    dart2jsPath: "html/dart2js/html_dart2js.dart"),
-  "math": const LibraryInfo("math/math.dart"),
-  "_foreign_helper": const LibraryInfo("_internal/js_runtime/lib/foreign_helper.dart"),
-};
-''';
-
-const String sdkRoot = '/sdk';
-
-const _MockSdkLibrary _LIB_ASYNC =
-    const _MockSdkLibrary('dart:async', '$sdkRoot/lib/async/async.dart', '''
-library dart.async;
-
-import 'dart:math';
-
-part 'stream.dart';
-
-class Future<T> {
-  factory Future(computation()) => null;
-  factory Future.delayed(Duration duration, [T computation()]) => null;
-  factory Future.microtask(FutureOr<T> computation()) => null;
-  factory Future.value([FutureOr<T> result]) => null;
-
-  static Future<List<T>> wait<T>(
-      Iterable<Future<T>> futures) => null;
-  Future<R> then<R>(FutureOr<R> onValue(T value)) => null;
-
-  Future<T> whenComplete(action());
-}
-
-class FutureOr<T> {}
-
-abstract class Completer<T> {
-  factory Completer() => null;
-  factory Completer.sync() => null;
-  Future<T> get future;
-  void complete([value]);
-  void completeError(Object error, [StackTrace stackTrace]);
-  bool get isCompleted;
-}
-
-class _StreamIterator<T> implements StreamIterator<T> {}
-class _AsyncStarStreamController {}
-Function _asyncThenWrapperHelper(continuation) {}
-Function _asyncErrorWrapperHelper(continuation) {}
-Future _awaitHelper(
-    object, Function thenCallback, Function errorCallback, var awaiter) {}
-''', const <String, String>{
-  '$sdkRoot/lib/async/stream.dart': r'''
-part of dart.async;
-abstract class Stream<T> {
-  Future<T> get first;
-  StreamSubscription<T> listen(void onData(T event),
-                               { Function onError,
-                                 void onDone(),
-                                 bool cancelOnError});
-  Stream();
-  factory Stream.fromIterable(Iterable<T> data) => null;
-}
-
-abstract class StreamIterator<T> {}
-
-abstract class StreamSubscription<T> {
-  Future cancel();
-  void onData(void handleData(T data));
-  void onError(Function handleError);
-  void onDone(void handleDone());
-  void pause([Future resumeSignal]);
-  void resume();
-  bool get isPaused;
-  Future<E> asFuture<E>([E futureValue]);
-}
-
-abstract class StreamTransformer<S, T> {}
-'''
-});
-
-const _MockSdkLibrary _LIB_ASYNC2 =
-    const _MockSdkLibrary('dart:async2', '$sdkRoot/lib/async2/async2.dart', '''
-library dart.async2;
-
-class Future {}
-''');
-
-const _MockSdkLibrary _LIB_COLLECTION = const _MockSdkLibrary(
-    'dart:collection', '$sdkRoot/lib/collection/collection.dart', '''
-library dart.collection;
-
-abstract class HashMap<K, V> implements Map<K, V> {}
-''');
-
-const _MockSdkLibrary _LIB_CONVERT = const _MockSdkLibrary(
-    'dart:convert', '$sdkRoot/lib/convert/convert.dart', '''
-library dart.convert;
-
-import 'dart:async';
-
-abstract class Converter<S, T> implements StreamTransformer {}
-class JsonDecoder extends Converter<String, Object> {}
-''');
-
-const _MockSdkLibrary _LIB_CORE =
-    const _MockSdkLibrary('dart:core', '$sdkRoot/lib/core/core.dart', '''
-library dart.core;
-
-import 'dart:async';
-import 'dart:_internal';
-
-class Object {
-  const Object();
-  bool operator ==(other) => identical(this, other);
-  String toString() => 'a string';
-  int get hashCode => 0;
-  Type get runtimeType => null;
-  dynamic noSuchMethod(Invocation invocation) => null;
-}
-
-class Function {}
-class StackTrace {}
-
-class Symbol {
-  const factory Symbol(String name) = _SymbolImpl;
-}
-
-class _SymbolImpl {
-  const _SymbolImpl(String name);
-}
-
-class Type {}
-
-abstract class Comparable<T> {
-  int compareTo(T other);
-}
-
-abstract class Pattern {}
-abstract class String implements Comparable<String>, Pattern {
-  external factory String.fromCharCodes(Iterable<int> charCodes,
-                                        [int start = 0, int end]);
-  String operator +(String other) => null;
-  bool operator ==(Object other);
-  bool get isEmpty => false;
-  bool get isNotEmpty => false;
-  int get length => 0;
-  int codeUnitAt(int index);
-  String substring(int len) => null;
-  String toLowerCase();
-  String toUpperCase();
-  List<int> get codeUnits;
-}
-abstract class RegExp implements Pattern {
-  external factory RegExp(String source);
-}
-
-class bool extends Object {
-  external const factory bool.fromEnvironment(String name,
-                                              {bool defaultValue: false});
-}
-
-abstract class Invocation {}
-
-abstract class num implements Comparable<num> {
-  bool operator ==(Object other);
-  bool operator <(num other);
-  bool operator <=(num other);
-  bool operator >(num other);
-  bool operator >=(num other);
-  num operator +(num other);
-  num operator -(num other);
-  num operator *(num other);
-  double operator /(num other);
-  int operator ^(int other);
-  int operator |(int other);
-  int operator <<(int other);
-  int operator >>(int other);
-  int operator ~/(num other);
-  num operator %(num other);
-  int operator ~();
-  num operator -();
-  int toInt();
-  double toDouble();
-  num abs();
-  int round();
-}
-abstract class int extends num {
-  external const factory int.fromEnvironment(String name, {int defaultValue});
-
-  bool get isNegative;
-  bool get isEven => false;
-
-  int operator &(int other);
-  int operator |(int other);
-  int operator ^(int other);
-  int operator ~();
-  int operator <<(int shiftAmount);
-  int operator >>(int shiftAmount);
-
-  int operator -();
-
-  external static int parse(String source,
-                            { int radix,
-                              int onError(String source) });
-
-  String toString();
-}
-
-abstract class double extends num {
-  static const double NAN = 0.0 / 0.0;
-  static const double INFINITY = 1.0 / 0.0;
-  static const double NEGATIVE_INFINITY = -INFINITY;
-  static const double MIN_POSITIVE = 5e-324;
-  static const double MAX_FINITE = 1.7976931348623157e+308;
-
-  double remainder(num other);
-  double operator +(num other);
-  double operator -(num other);
-  double operator *(num other);
-  double operator %(num other);
-  double operator /(num other);
-  int operator ~/(num other);
-  double operator -();
-  double abs();
-  double get sign;
-  int round();
-  int floor();
-  int ceil();
-  int truncate();
-  double roundToDouble();
-  double floorToDouble();
-  double ceilToDouble();
-  double truncateToDouble();
-  external static double parse(String source,
-                               [double onError(String source)]);
-}
-
-class DateTime extends Object {}
-
-class Null extends Object {
-  factory Null._uninstantiable() => null;
-}
-
-class Deprecated extends Object {
-  final String expires;
-  const Deprecated(this.expires);
-}
-const Object deprecated = const Deprecated("next release");
-
-class Iterator<E> {
-  bool moveNext();
-  E get current;
-}
-
-abstract class Iterable<E> {
-  Iterator<E> get iterator;
-  bool get isEmpty;
-  E get first;
-  int get length;
-
-  Iterable<R> map<R>(R f(E e));
-
-  R fold<R>(R initialValue,
-      R combine(R previousValue, E element)) => null;
-
-  Iterable<T> expand<T>(Iterable<T> f(E element));
-
-  Iterable<E> where(bool test(E element));
-
-  void forEach(void f(E element));
-
-  List<E> toList();
-}
-
-class List<E> implements Iterable<E> {
-  List([int length]);
-  factory List.from(Iterable elements, {bool growable: true}) => null;
-  void add(E value) {}
-  void addAll(Iterable<E> iterable) {}
-  E operator [](int index) => null;
-  void operator []=(int index, E value) {}
-  Iterator<E> get iterator => null;
-  void clear() {}
-
-  bool get isEmpty => false;
-  E get first => null;
-  E get last => null;
-
-}
-
-class Map<K, V> extends Object {
-  Iterable<K> get keys => null;
-  int get length;
-  Iterable<V> get values;
-  V operator [](K key) => null;
-  void operator []=(K key, V value) {}
-  Map<RK, RV> cast<RK, RV>();
-  bool containsKey(Object key);
-}
-
-class Duration implements Comparable<Duration> {}
-
-class Exception {
-  factory Exception([var message]) => null;
-}
-
-external bool identical(Object a, Object b);
-
-void print(Object object) {}
-
-class _Proxy { const _Proxy(); }
-const Object proxy = const _Proxy();
-
-class _Override { const _Override(); }
-const Object override = const _Override();
-
-class _CompileTimeError {
-  final String _errorMsg;
-  _CompileTimeError(this._errorMsg);
-}
-
-class AbstractClassInstantiationError {
-  AbstractClassInstantiationError(String className);
-}
-
-class FallThroughError {
-  FallThroughError();
-  FallThroughError._create(String url, int line);
-}
-
-abstract class _SyncIterable implements Iterable {}
-class _InvocationMirror {
-  _InvocationMirror._withoutType(
-      String _functionName, List<Type> _typeArguments,
-      List _positionalArguments, Map<Symbol, dynamic>_namedArguments,
-      bool _isSuperInvocation);
-}
-''');
-
-const _MockSdkLibrary _LIB_FOREIGN_HELPER = const _MockSdkLibrary(
-    'dart:_foreign_helper',
-    '$sdkRoot/lib/_foreign_helper/_foreign_helper.dart', '''
-library dart._foreign_helper;
-
-JS(String typeDescription, String codeTemplate,
-  [arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11])
-{}
-''');
-
-const _MockSdkLibrary _LIB_HTML_DART2JS = const _MockSdkLibrary(
-    'dart:html', '$sdkRoot/lib/html/dart2js/html_dart2js.dart', '''
-library dart.html;
-class HtmlElement {}
-''');
-
-const _MockSdkLibrary _LIB_HTML_DARTIUM = const _MockSdkLibrary(
-    'dart:html', '$sdkRoot/lib/html/dartium/html_dartium.dart', '''
-library dart.dom.html;
-
-final HtmlDocument document;
-
-abstract class Element {}
-
-abstract class HtmlDocument {
-  Element query(String relativeSelectors) => null;
-}
-
-abstract class HtmlElement extends Element {}
-
-abstract class AnchorElement extends HtmlElement {}
-abstract class BodyElement extends HtmlElement {}
-abstract class ButtonElement extends HtmlElement {}
-abstract class DivElement extends HtmlElement {}
-abstract class InputElement extends HtmlElement {}
-abstract class SelectElement extends HtmlElement {}
-
-
-abstract class CanvasElement extends HtmlElement {
-  Object getContext(String contextId, [Map attributes]);
-  CanvasRenderingContext2D get context2D;
-}
-
-abstract class CanvasRenderingContext2D {}
-
-Element query(String relativeSelectors) => null;
-''');
-
-const _MockSdkLibrary _LIB_INTERCEPTORS = const _MockSdkLibrary(
-    'dart:_interceptors',
-    '$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart', '''
-library dart._interceptors;
-''');
-
-const _MockSdkLibrary _LIB_INTERNAL = const _MockSdkLibrary(
-    'dart:_internal', '$sdkRoot/lib/_internal/internal.dart', '''
-library dart._internal;
-class Symbol {}
-class ExternalName {
-  final String name;
-  const ExternalName(this.name);
-}
-''');
-
-const _MockSdkLibrary _LIB_MATH =
-    const _MockSdkLibrary('dart:math', '$sdkRoot/lib/math/math.dart', '''
-library dart.math;
-
-const double E = 2.718281828459045;
-const double PI = 3.1415926535897932;
-const double LN10 =  2.302585092994046;
-
-T min<T extends num>(T a, T b) => null;
-T max<T extends num>(T a, T b) => null;
-
-external double cos(num radians);
-external double sin(num radians);
-external double sqrt(num radians);
-class Random {
-  bool nextBool() => true;
-  double nextDouble() => 2.0;
-  int nextInt() => 1;
-}
-''');
-
-const List<SdkLibrary> _LIBRARIES = const [
-  _LIB_CORE,
-  _LIB_ASYNC,
-  _LIB_ASYNC2,
-  _LIB_COLLECTION,
-  _LIB_CONVERT,
-  _LIB_FOREIGN_HELPER,
-  _LIB_MATH,
-  _LIB_HTML_DART2JS,
-  _LIB_HTML_DARTIUM,
-  _LIB_INTERCEPTORS,
-  _LIB_INTERNAL,
-];
-
-class MockSdk implements DartSdk {
-  static const Map<String, String> _URI_MAP = const {
-    "dart:core": "$sdkRoot/lib/core/core.dart",
-    "dart:html": "$sdkRoot/lib/html/dartium/html_dartium.dart",
-    "dart:async": "$sdkRoot/lib/async/async.dart",
-    "dart:async2": "$sdkRoot/lib/async2/async2.dart",
-    "dart:async/stream.dart": "$sdkRoot/lib/async/stream.dart",
-    "dart:collection": "$sdkRoot/lib/collection/collection.dart",
-    "dart:convert": "$sdkRoot/lib/convert/convert.dart",
-    "dart:_foreign_helper": "$sdkRoot/lib/_foreign_helper/_foreign_helper.dart",
-    "dart:_interceptors":
-        "$sdkRoot/lib/_internal/js_runtime/lib/interceptors.dart",
-    "dart:_internal": "$sdkRoot/lib/_internal/internal.dart",
-    "dart:math": "$sdkRoot/lib/math/math.dart"
-  };
-
-  final resource.MemoryResourceProvider provider;
-
-  final Map<String, String> uriMap = {};
-
-  /**
-   * The [AnalysisContextImpl] which is used for all of the sources.
-   */
-  AnalysisContextImpl _analysisContext;
-
-  @override
-  final List<SdkLibrary> sdkLibraries = [];
-
-  /**
-   * The cached linked bundle of the SDK.
-   */
-  PackageBundle _bundle;
-
-  MockSdk(
-      {bool generateSummaryFiles: false,
-      resource.MemoryResourceProvider resourceProvider})
-      : provider = resourceProvider ?? new resource.MemoryResourceProvider() {
-    _URI_MAP.forEach((uri, path) {
-      uriMap[uri] = provider.convertPath(path);
-    });
-
-    for (_MockSdkLibrary library in _LIBRARIES) {
-      var convertedLibrary = library._toProvider(provider);
-      sdkLibraries.add(convertedLibrary);
-    }
-
-    for (_MockSdkLibrary library in sdkLibraries) {
-      provider.newFile(library.path, library.content);
-      library.parts.forEach((String path, String content) {
-        provider.newFile(path, content);
-      });
-    }
-    provider.newFile(
-        provider.convertPath(
-            '$sdkRoot/lib/_internal/sdk_library_metadata/lib/libraries.dart'),
-        librariesContent);
-    if (generateSummaryFiles) {
-      List<int> bytes = _computeLinkedBundleBytes();
-      provider.newFileWithBytes(
-          provider.convertPath('/lib/_internal/strong.sum'), bytes);
-    }
-  }
-
-  @override
-  AnalysisContextImpl get context {
-    if (_analysisContext == null) {
-      _analysisContext = new _SdkAnalysisContext(this);
-      SourceFactory factory = new SourceFactory([new DartUriResolver(this)]);
-      _analysisContext.sourceFactory = factory;
-    }
-    return _analysisContext;
-  }
-
-  @override
-  String get sdkVersion => throw new UnimplementedError();
-
-  @override
-  List<String> get uris =>
-      sdkLibraries.map((SdkLibrary library) => library.shortName).toList();
-
-  @override
-  Source fromFileUri(Uri uri) {
-    String filePath = provider.pathContext.fromUri(uri);
-    if (!filePath.startsWith(provider.convertPath('$sdkRoot/lib/'))) {
-      return null;
-    }
-    for (SdkLibrary library in sdkLibraries) {
-      String libraryPath = library.path;
-      if (filePath == libraryPath) {
-        try {
-          resource.File file = provider.getResource(filePath);
-          Uri dartUri = Uri.parse(library.shortName);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-      String libraryRootPath = provider.pathContext.dirname(libraryPath) +
-          provider.pathContext.separator;
-      if (filePath.startsWith(libraryRootPath)) {
-        String pathInLibrary = filePath.substring(libraryRootPath.length);
-        String uriStr = '${library.shortName}/$pathInLibrary';
-        try {
-          resource.File file = provider.getResource(filePath);
-          Uri dartUri = Uri.parse(uriStr);
-          return file.createSource(dartUri);
-        } catch (exception) {
-          return null;
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  PackageBundle getLinkedBundle() {
-    if (_bundle == null) {
-      resource.File summaryFile =
-          provider.getFile(provider.convertPath('/lib/_internal/strong.sum'));
-      List<int> bytes;
-      if (summaryFile.exists) {
-        bytes = summaryFile.readAsBytesSync();
-      } else {
-        bytes = _computeLinkedBundleBytes();
-      }
-      _bundle = new PackageBundle.fromBuffer(bytes);
-    }
-    return _bundle;
-  }
-
-  @override
-  SdkLibrary getSdkLibrary(String dartUri) {
-    for (SdkLibrary library in _LIBRARIES) {
-      if (library.shortName == dartUri) {
-        return library;
-      }
-    }
-    return null;
-  }
-
-  @override
-  Source mapDartUri(String dartUri) {
-    String path = uriMap[dartUri];
-    if (path != null) {
-      resource.File file = provider.getResource(path);
-      Uri uri = new Uri(scheme: 'dart', path: dartUri.substring(5));
-      return file.createSource(uri);
-    }
-    // If we reach here then we tried to use a dartUri that's not in the
-    // table above.
-    return null;
-  }
-
-  /**
-   * Compute the bytes of the linked bundle associated with this SDK.
-   */
-  List<int> _computeLinkedBundleBytes() {
-    List<Source> librarySources = sdkLibraries
-        .map((SdkLibrary library) => mapDartUri(library.shortName))
-        .toList();
-    return new SummaryBuilder(librarySources, context).build();
-  }
-}
-
-class _MockSdkLibrary implements SdkLibrary {
-  @override
-  final String shortName;
-
-  @override
-  final String path;
-
-  final String content;
-
-  final Map<String, String> parts;
-
-  const _MockSdkLibrary(this.shortName, this.path, this.content,
-      [this.parts = const <String, String>{}]);
-
-  @override
-  String get category => throw new UnimplementedError();
-
-  @override
-  bool get isDart2JsLibrary => throw new UnimplementedError();
-
-  @override
-  bool get isDocumented => throw new UnimplementedError();
-
-  @override
-  bool get isImplementation => throw new UnimplementedError();
-
-  @override
-  bool get isInternal => shortName.startsWith('dart:_');
-
-  @override
-  bool get isShared => throw new UnimplementedError();
-
-  @override
-  bool get isVmLibrary => throw new UnimplementedError();
-
-  _MockSdkLibrary _toProvider(resource.MemoryResourceProvider provider) {
-    return new _MockSdkLibrary(
-      shortName,
-      provider.convertPath(path),
-      content,
-      parts.map((path, content) {
-        var convertedPath = provider.convertPath(path);
-        return new MapEntry(convertedPath, content);
-      }),
-    );
-  }
-}
-
-/**
- * An [AnalysisContextImpl] that only contains sources for a Dart SDK.
- */
-class _SdkAnalysisContext extends AnalysisContextImpl {
-  final DartSdk sdk;
-
-  _SdkAnalysisContext(this.sdk);
-
-  @override
-  AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
-    if (factory == null) {
-      return super.createCacheFromSourceFactory(factory);
-    }
-    return new AnalysisCache(
-        <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]);
-  }
-}
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 3d17d82..775e9a6 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -63,10 +63,8 @@
   @override
   void setUp() {
     super.setUp();
-    source = provider
-        .newFile(provider.convertPath('/foo/bar.dart'), '')
-        .createSource();
-    testFile = provider.convertPath('/test.dart');
+    source = newFile('/foo/bar.dart').createSource();
+    testFile = convertPath('/test.dart');
   }
 
   test_convertAnalysisError_lineInfo_noSeverity() {
@@ -187,7 +185,8 @@
 class B<K, V> {}''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
     {
-      analyzer.ClassElement engineElement = findElementInUnit(unit, '_A');
+      analyzer.ClassElement engineElement =
+          findElementInUnit(unit, '_A') as analyzer.ClassElement;
       // create notification Element
       plugin.Element element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.CLASS);
@@ -209,7 +208,8 @@
               plugin.Element.FLAG_PRIVATE);
     }
     {
-      analyzer.ClassElement engineElement = findElementInUnit(unit, 'B');
+      analyzer.ClassElement engineElement =
+          findElementInUnit(unit, 'B') as analyzer.ClassElement;
       // create notification Element
       plugin.Element element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.CLASS);
@@ -226,7 +226,7 @@
 }''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
     analyzer.ConstructorElement engineElement =
-        findElementInUnit(unit, 'myConstructor');
+        findElementInUnit(unit, 'myConstructor') as analyzer.ConstructorElement;
     // create notification Element
     plugin.Element element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.CONSTRUCTOR);
@@ -264,7 +264,8 @@
 enum E2 { three, four }''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
     {
-      analyzer.ClassElement engineElement = findElementInUnit(unit, '_E1');
+      analyzer.ClassElement engineElement =
+          findElementInUnit(unit, '_E1') as analyzer.ClassElement;
       expect(engineElement.hasDeprecated, isTrue);
       // create notification Element
       plugin.Element element = converter.convertElement(engineElement);
@@ -286,7 +287,8 @@
               plugin.Element.FLAG_PRIVATE);
     }
     {
-      analyzer.ClassElement engineElement = findElementInUnit(unit, 'E2');
+      analyzer.ClassElement engineElement =
+          findElementInUnit(unit, 'E2') as analyzer.ClassElement;
       // create notification Element
       plugin.Element element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.ENUM);
@@ -303,7 +305,8 @@
 enum E2 { three, four }''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
     {
-      analyzer.FieldElement engineElement = findElementInUnit(unit, 'one');
+      analyzer.FieldElement engineElement =
+          findElementInUnit(unit, 'one') as analyzer.FieldElement;
       // create notification Element
       plugin.Element element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.ENUM_CONSTANT);
@@ -327,7 +330,8 @@
           plugin.Element.FLAG_CONST | plugin.Element.FLAG_STATIC);
     }
     {
-      analyzer.FieldElement engineElement = findElementInUnit(unit, 'three');
+      analyzer.FieldElement engineElement =
+          findElementInUnit(unit, 'three') as analyzer.FieldElement;
       // create notification Element
       plugin.Element element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.ENUM_CONSTANT);
@@ -393,7 +397,8 @@
   static const myField = 42;
 }''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
-    analyzer.FieldElement engineElement = findElementInUnit(unit, 'myField');
+    analyzer.FieldElement engineElement =
+        findElementInUnit(unit, 'myField') as analyzer.FieldElement;
     // create notification Element
     plugin.Element element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.FIELD);
@@ -418,7 +423,7 @@
 ''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
     analyzer.FunctionTypeAliasElement engineElement =
-        findElementInUnit(unit, 'F');
+        findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
     // create notification Element
     plugin.Element element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.FUNCTION_TYPE_ALIAS);
@@ -437,6 +442,31 @@
     expect(element.flags, 0);
   }
 
+  test_convertElement_genericTypeAlias_function() async {
+    analyzer.Source source = addSource(testFile, '''
+typedef F<T> = int Function(String x);
+''');
+    analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
+    analyzer.FunctionTypeAliasElement engineElement =
+        findElementInUnit(unit, 'F') as analyzer.FunctionTypeAliasElement;
+    // create notification Element
+    plugin.Element element = converter.convertElement(engineElement);
+    expect(element.kind, plugin.ElementKind.FUNCTION_TYPE_ALIAS);
+    expect(element.name, 'F');
+    expect(element.typeParameters, '<T>');
+    {
+      plugin.Location location = element.location;
+      expect(location.file, testFile);
+      expect(location.offset, 8);
+      expect(location.length, 'F'.length);
+      expect(location.startLine, 1);
+      expect(location.startColumn, 9);
+    }
+    expect(element.parameters, '(String x)');
+    expect(element.returnType, 'int');
+    expect(element.flags, 0);
+  }
+
   test_convertElement_getter() async {
     analyzer.Source source = addSource(testFile, '''
 class A {
@@ -444,7 +474,8 @@
 }''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
     analyzer.PropertyAccessorElement engineElement =
-        findElementInUnit(unit, 'myGetter', analyzer.ElementKind.GETTER);
+        findElementInUnit(unit, 'myGetter', analyzer.ElementKind.GETTER)
+            as analyzer.PropertyAccessorElement;
     // create notification Element
     plugin.Element element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.GETTER);
@@ -470,7 +501,8 @@
   }
 }''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
-    analyzer.MethodElement engineElement = findElementInUnit(unit, 'myMethod');
+    analyzer.MethodElement engineElement =
+        findElementInUnit(unit, 'myMethod') as analyzer.MethodElement;
     // create notification Element
     plugin.Element element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.METHOD);
@@ -495,7 +527,8 @@
 }''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
     analyzer.PropertyAccessorElement engineElement =
-        findElementInUnit(unit, 'mySetter', analyzer.ElementKind.SETTER);
+        findElementInUnit(unit, 'mySetter', analyzer.ElementKind.SETTER)
+            as analyzer.PropertyAccessorElement;
     // create notification Element
     plugin.Element element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.SETTER);
@@ -572,7 +605,8 @@
   }
 }''');
     analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
-    analyzer.LabelElement engineElement = findElementInUnit(unit, 'myLabel');
+    analyzer.LabelElement engineElement =
+        findElementInUnit(unit, 'myLabel') as analyzer.LabelElement;
     // create notification Element
     plugin.Element element = converter.convertElement(engineElement);
     expect(element.kind, plugin.ElementKind.LABEL);
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
index b8a4aef..665a350 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_contributor_util.dart
@@ -5,9 +5,7 @@
 import 'dart:async';
 
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_core.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
@@ -16,7 +14,6 @@
 import 'package:test/test.dart';
 
 import '../../support/abstract_context.dart';
-import 'flutter_util.dart';
 
 int suggestionComparator(CompletionSuggestion s1, CompletionSuggestion s2) {
   String c1 = s1.completion.toLowerCase();
@@ -446,18 +443,15 @@
     return cs;
   }
 
-  /**
-   * Return a [Future] that completes with the containing library information
-   * after it is accessible via [context.getLibrariesContaining].
-   */
   Future<void> computeLibrariesContaining() {
     return driver.getResult(testFile).then((result) => null);
   }
 
   Future computeSuggestions() async {
-    ResolveResult result = await driver.getResult(testFile);
+    ResolvedUnitResult result = await driver.getResult(testFile);
     testSource = result.unit.declaredElement.source;
-    request = new DartCompletionRequestImpl(provider, completionOffset, result);
+    request = new DartCompletionRequestImpl(
+        resourceProvider, completionOffset, result);
 
     CompletionTarget target =
         new CompletionTarget.forOffset(request.result.unit, request.offset);
@@ -472,30 +466,6 @@
     expect(suggestions, isNotNull, reason: 'expected suggestions');
   }
 
-  /**
-   * Configures the [SourceFactory] to have the `flutter` package in
-   * `/packages/flutter/lib` folder.
-   */
-  void configureFlutterPkg(Map<String, String> pathToCode) {
-    pathToCode.forEach((path, code) {
-      provider.newFile('$flutterPkgLibPath/$path', code);
-    });
-    // configure SourceFactory
-    Folder myPkgFolder = provider.getResource(flutterPkgLibPath);
-    UriResolver pkgResolver = new PackageMapUriResolver(provider, {
-      'flutter': [myPkgFolder]
-    });
-    SourceFactory sourceFactory = new SourceFactory(
-        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
-    driver.configure(sourceFactory: sourceFactory);
-    // force 'flutter' resolution
-    addSource(
-        '/tmp/other.dart',
-        pathToCode.keys
-            .map((path) => "import 'package:flutter/$path';")
-            .join('\n'));
-  }
-
   CompletionContributor createContributor();
 
   void failedCompletion(String message,
@@ -561,7 +531,7 @@
   @override
   void setUp() {
     super.setUp();
-    testFile = provider.convertPath('/completionTest.dart');
+    testFile = convertPath('/home/test/lib/test.dart');
     contributor = createContributor();
   }
 }
diff --git a/pkg/analyzer_plugin/test/utilities/completion/completion_target_test.dart b/pkg/analyzer_plugin/test/utilities/completion/completion_target_test.dart
index 8e1674e..9b44141 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/completion_target_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/completion_target_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -26,6 +25,17 @@
 
 @reflectiveTest
 class CompletionTargetTest {
+  /// Parse a dangling expression (no parent node). The angular plugin, for
+  /// instance, does this.
+  Expression parseDanglingDart(String code) {
+    final reader = new CharSequenceReader(code);
+    final scanner = new Scanner(null, reader, null);
+    final source = new StringSource(code, 'test.dart');
+    final listener = new _ErrorCollector();
+
+    return new Parser(source, listener).parseExpression(scanner.tokenize());
+  }
+
   test_danglingExpressionCompletionIsValid() {
     // Test that users can parse dangling expressions of dart and autocomplete
     // them without crash/with the correct offset information.
@@ -39,17 +49,6 @@
     expect(replacementRange.length, 'identifier'.length);
   }
 
-  /// Parse a dangling expression (no parent node). The angular plugin, for
-  /// instance, does this.
-  Expression parseDanglingDart(String code) {
-    final reader = new CharSequenceReader(code);
-    final scanner = new Scanner(null, reader, null);
-    final source = new StringSource(code, 'test.dart');
-    final listener = new _ErrorCollector();
-
-    return new Parser(source, listener).parseExpression(scanner.tokenize());
-  }
-
   Expression wrapForCompliance(Expression expression) {
     // TODO(mfairhurst) This should be performed for clients or the need should
     // be dropped. It's a fairly valid invariant that all autocompletion target
@@ -69,10 +68,6 @@
 
   _ErrorCollector();
 
-  /// The group of errors collected.
-  AnalyzerErrorGroup get group =>
-      new AnalyzerErrorGroup.fromAnalysisErrors(_errors);
-
   /// Whether any errors where collected.
   bool get hasErrors => !_errors.isEmpty;
 
diff --git a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
index 9ac962d..b7496ec 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/inherited_reference_contributor_test.dart
@@ -28,8 +28,8 @@
 
   /// Sanity check.  Permutations tested in local_ref_contributor.
   test_ArgDefaults_inherited_method_with_required_named() async {
-    addMetaPackageSource();
-    resolveSource('/testB.dart', '''
+    addMetaPackage();
+    resolveSource('/home/test/lib/b.dart', '''
 import 'package:meta/meta.dart';
 
 lib libB;
@@ -37,7 +37,7 @@
    bool foo(int bar, {bool boo, @required int baz}) => false;
 }''');
     addTestSource('''
-import "testB.dart";
+import 'b.dart';
 class B extends A {
   b() => f^
 }
@@ -50,13 +50,13 @@
 
   test_AwaitExpression_inherited() async {
     // SimpleIdentifier  AwaitExpression  ExpressionStatement
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A {
   Future y() async {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import 'b.dart';
 class B extends A {
   Future a() async {return 0;}
   foo() async {await ^}
@@ -71,19 +71,19 @@
     assertNotSuggested('B');
     assertNotSuggested('A');
     assertNotSuggested('Object');
-    assertSuggestMethod('y', 'A', 'dynamic');
+    assertSuggestMethod('y', 'A', 'Future<dynamic>');
   }
 
   test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
       lib B;
       class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
       class E extends F { var e1; e2() { } }
       class I { int i1; i2() { } }
       class M { var m1; int m2() { } }''');
     addTestSource('''
-      import "testB.dart";
+      import 'b.dart';
       class A extends E implements I with M {a() {^}}''');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -126,7 +126,7 @@
   }
 
   test_inherited() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -135,7 +135,7 @@
   int y2() {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import 'b.dart';
 class A1 {
   int x;
   int y() {return 0;}
@@ -178,13 +178,13 @@
   }
 
   test_method_parameters_mixed_required_and_named() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m(x, {int y}) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -221,13 +221,13 @@
   }
 
   test_method_parameters_mixed_required_and_positional() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m(x, [int y]) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -264,13 +264,13 @@
   }
 
   test_method_parameters_named() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m({x, int y}) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -307,13 +307,13 @@
   }
 
   test_method_parameters_none() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m() {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -344,13 +344,13 @@
   }
 
   test_method_parameters_positional() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m([x, int y]) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -387,13 +387,13 @@
   }
 
   test_method_parameters_required() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   void m(x, int y) {}
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -410,7 +410,7 @@
   }
 
   test_mixin_ordering() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class B {}
 class M1 {
   void m() {}
@@ -420,7 +420,7 @@
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class C extends B with M1, M2 {
   void f() {
     ^
@@ -432,13 +432,13 @@
   }
 
   test_no_parameters_field() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   int x;
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -449,13 +449,13 @@
   }
 
   test_no_parameters_getter() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   int get x => null;
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -466,13 +466,13 @@
   }
 
   test_no_parameters_setter() async {
-    resolveSource('/libA.dart', '''
+    resolveSource('/home/test/lib/a.dart', '''
 class A {
   set x(int value) {};
 }
 ''');
     addTestSource('''
-import 'libA.dart';
+import 'a.dart';
 class B extends A {
   main() {^}
 }
@@ -483,7 +483,7 @@
   }
 
   test_outside_class() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -492,7 +492,7 @@
   int y2() {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import 'b.dart';
 class A1 {
   int x;
   int y() {return 0;}
@@ -524,7 +524,7 @@
   }
 
   test_static_field() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -533,7 +533,7 @@
   int y2() {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import 'b.dart';
 class A1 {
   int x;
   int y() {return 0;}
@@ -565,7 +565,7 @@
   }
 
   test_static_method() async {
-    resolveSource('/testB.dart', '''
+    resolveSource('/home/test/lib/b.dart', '''
 lib libB;
 class A2 {
   int x;
@@ -574,7 +574,7 @@
   int y2() {return 0;}
 }''');
     addTestSource('''
-import "testB.dart";
+import 'b.dart';
 class A1 {
   int x;
   int y() {return 0;}
diff --git a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
index 8b3178c..5611381 100644
--- a/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/completion/type_member_contributor_test.dart
@@ -82,7 +82,7 @@
   }
 
   test_ArgDefaults_method_with_optional_positional() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -97,7 +97,7 @@
   }
 
   test_ArgDefaults_method_with_required_named() async {
-    addMetaPackageSource();
+    addMetaPackage();
     addTestSource('''
 import 'package:meta/meta.dart';
 
@@ -114,12 +114,12 @@
 
   test_ArgumentList() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import 'libA.dart';
+        import 'a.dart';;
         class B { }
         String bar() => true;
         void main() {expect(^)}''');
@@ -139,13 +139,13 @@
 
   test_ArgumentList_imported_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         expect(arg) { }
         void baz() { }''');
     addTestSource('''
-        import 'libA.dart'
+        import 'a.dart';
         class B { }
         String bar() => true;
         void main() {expect(^)}''');
@@ -165,14 +165,14 @@
 
   test_ArgumentList_InstanceCreationExpression_functionalArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import 'libA.dart';
+        import 'a.dart';;
         class B { }
         String bar() => true;
         void main() {new A(^)}''');
@@ -193,7 +193,7 @@
 
   test_ArgumentList_InstanceCreationExpression_typedefArg() async {
     // ArgumentList  InstanceCreationExpression  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         typedef Funct();
         class A { A(Funct f) { } }
@@ -201,7 +201,7 @@
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import 'libA.dart';
+        import 'a.dart';;
         class B { }
         String bar() => true;
         void main() {new A(^)}''');
@@ -222,12 +222,12 @@
 
   test_ArgumentList_local_function() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import 'libA.dart'
+        import 'a.dart';
         expect(arg) { }
         class B { }
         String bar() => true;
@@ -248,12 +248,12 @@
 
   test_ArgumentList_local_method() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
-        import 'libA.dart'
+        import 'a.dart';
         class B {
           expect(arg) { }
           void foo() {expect(^)}}
@@ -274,14 +274,14 @@
 
   test_ArgumentList_MethodInvocation_functionalArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import 'libA.dart';
+        import 'a.dart';;
         class B { }
         String bar(f()) => true;
         void main() {bar(^);}''');
@@ -302,14 +302,14 @@
 
   test_ArgumentList_MethodInvocation_methodArg() async {
     // ArgumentList  MethodInvocation  ExpressionStatement  Block
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         class A { A(f()) { } }
         bool hasLength(int expected) { }
         void baz() { }''');
     addTestSource('''
         import 'dart:async';
-        import 'libA.dart';
+        import 'a.dart';;
         class B { String bar(f()) => true; }
         void main() {new B().bar(^);}''');
     await computeSuggestions();
@@ -329,11 +329,11 @@
   test_ArgumentList_namedParam() async {
     // SimpleIdentifier  NamedExpression  ArgumentList  MethodInvocation
     // ExpressionStatement
-    addSource('/libA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library A;
         bool hasLength(int expected) { }''');
     addTestSource('''
-        import 'libA.dart'
+        import 'a.dart';
         String bar() => true;
         void main() {expect(foo: ^)}''');
     await computeSuggestions();
@@ -984,14 +984,14 @@
 
   test_Block_inherited_imported() async {
     // Block  BlockFunctionBody  MethodDeclaration  ClassDeclaration
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class F { var f1; f2() { } get f3 => 0; set f4(fx) { } var _pf; }
         class E extends F { var e1; e2() { } }
         class I { int i1; i2() { } }
         class M { var m1; int m2() { } }''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class A extends E implements I with M {a() {^}}''');
     await computeSuggestions();
 
@@ -1086,10 +1086,10 @@
   }
 
   test_Block_unimported() async {
-    addPackageSource('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
+    addPackageFile('myBar', 'bar.dart', 'class Foo2 { Foo2() { } }');
     addSource(
         '/proj/testAB.dart', 'import "package:myBar/bar.dart"; class Foo { }');
-    testFile = provider.convertPath('/proj/completionTest.dart');
+    testFile = convertPath('/proj/completionTest.dart');
     addTestSource('class C {foo(){F^}}');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -1102,10 +1102,10 @@
 
   test_CascadeExpression_method1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class A {var b; X _c;}
         class X{}
         // looks like a cascade to the parser
@@ -1126,10 +1126,10 @@
 
   test_CascadeExpression_selector1() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class A {var b; X _c;}
         class X{}
         // looks like a cascade to the parser
@@ -1150,10 +1150,10 @@
 
   test_CascadeExpression_selector2() async {
     // SimpleIdentifier  PropertyAccess  CascadeExpression  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class A {var b; X _c;}
         class X{}
         main() {A a; a..^z}''');
@@ -1172,10 +1172,10 @@
 
   test_CascadeExpression_selector2_withTrailingReturn() async {
     // PropertyAccess  CascadeExpression  ExpressionStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class A {var b; X _c;}
         class X{}
         main() {A a; a..^ return}''');
@@ -1261,10 +1261,10 @@
 
   test_ClassDeclaration_body() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import 'b.dart'; as x;
         @deprecated class A {^}
         class _B {}
         A T;''');
@@ -1280,10 +1280,10 @@
 
   test_ClassDeclaration_body_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import 'b.dart'; as x;
         class A {final ^}
         class _B {}
         A T;''');
@@ -1299,10 +1299,10 @@
 
   test_ClassDeclaration_body_final_field() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import 'b.dart'; as x;
         class A {final ^ A(){}}
         class _B {}
         A T;''');
@@ -1318,10 +1318,10 @@
 
   test_ClassDeclaration_body_final_field2() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as Soo;
+        import 'b.dart'; as Soo;
         class A {final S^ A();}
         class _B {}
         A Sew;''');
@@ -1337,10 +1337,10 @@
 
   test_ClassDeclaration_body_final_final() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import 'b.dart'; as x;
         class A {final ^ final foo;}
         class _B {}
         A T;''');
@@ -1356,10 +1356,10 @@
 
   test_ClassDeclaration_body_final_var() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         class B { }''');
     addTestSource('''
-        import "testB.dart" as x;
+        import 'b.dart'; as x;
         class A {final ^ var foo;}
         class _B {}
         A T;''');
@@ -1423,12 +1423,12 @@
 
   test_ConditionalExpression_elseExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1442,12 +1442,12 @@
 
   test_ConditionalExpression_elseExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1467,12 +1467,12 @@
 
   test_ConditionalExpression_partial_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1486,12 +1486,12 @@
 
   test_ConditionalExpression_partial_thenExpression_empty() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1511,12 +1511,12 @@
 
   test_ConditionalExpression_thenExpression() async {
     // SimpleIdentifier  ConditionalExpression  ReturnStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -1531,13 +1531,13 @@
   test_ConstructorName_importedClass() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         var m;
         main() {new X.^}''');
     await computeSuggestions();
@@ -1555,13 +1555,13 @@
   test_ConstructorName_importedFactory() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName  ConstructorName
     // InstanceCreationExpression
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         var m;
         main() {new X.^}''');
     await computeSuggestions();
@@ -1715,12 +1715,12 @@
 
   test_ExpressionStatement_identifier() async {
     // SimpleIdentifier  ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         _B F1() { }
         class A {int x;}
         class _B { }''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         typedef int F2(int blat);
         class Clz = Object with Object;
         class C {foo(){^} void bar() {}}''');
@@ -1741,11 +1741,11 @@
 
   test_ExpressionStatement_name() async {
     // ExpressionStatement  Block  BlockFunctionBody  MethodDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         B T1;
         class B{}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {a() {C ^}}''');
     await computeSuggestions();
     assertNoSuggestions();
@@ -1754,9 +1754,9 @@
   test_FieldDeclaration_name_typed() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {A ^}''');
     await computeSuggestions();
     assertNoSuggestions();
@@ -1765,9 +1765,9 @@
   test_FieldDeclaration_name_var() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // FieldDeclaration
-    addSource('/testA.dart', 'class A { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class C {var ^}''');
     await computeSuggestions();
     assertNoSuggestions();
@@ -1917,13 +1917,13 @@
 
   test_FunctionDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -1946,13 +1946,13 @@
 
   test_FunctionDeclaration_returnType_afterComment2() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -1975,13 +1975,13 @@
 
   test_FunctionDeclaration_returnType_afterComment3() async {
     // FunctionDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2144,12 +2144,12 @@
 
   test_IndexExpression() async {
     // ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -2169,12 +2169,12 @@
 
   test_IndexExpression2() async {
     // SimpleIdentifier IndexExpression ExpressionStatement  Block
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         class B {int x;}
@@ -2188,12 +2188,12 @@
 
   test_InstanceCreationExpression_imported() async {
     // SimpleIdentifier  TypeName  ConstructorName  InstanceCreationExpression
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         class A {A(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         import "dart:async";
         int T2;
         F2() { }
@@ -2229,13 +2229,13 @@
 
   test_InterpolationExpression() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2258,13 +2258,13 @@
 
   test_InterpolationExpression_block() async {
     // SimpleIdentifier  InterpolationExpression  StringInterpolation
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2324,12 +2324,12 @@
 
   test_IsExpression() async {
     // SimpleIdentifier  TypeName  IsExpression  IfStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class Y {Y.c(); Y._d(); z() {}}
         main() {var x; if (x is ^) { }}''');
     await computeSuggestions();
@@ -2396,14 +2396,14 @@
   }
 
   test_keyword2() async {
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int newT1;
         int T1;
         nowIsIt() { }
         class X {factory X.c(); factory X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         String newer() {}
         var m;
         main() {new^ X.c();}''');
@@ -2456,9 +2456,9 @@
   }
 
   test_libraryPrefix_with_exports() async {
-    addSource('/libA.dart', 'library libA; class A { }');
-    addSource('/libB.dart', 'library libB; export "libA.dart"; class B { }');
-    addTestSource('import "libB.dart" as foo; main() {foo.^} class C { }');
+    addSource('/home/test/lib/a.dart', 'class A { }');
+    addSource('/home/test/lib/b.dart', 'export "a.dart"; class B { }');
+    addTestSource('import "b.dart" as foo; main() {foo.^} class C { }');
     await computeSuggestions();
     // Suggested by LibraryMemberContributor
     assertNotSuggested('B');
@@ -2515,13 +2515,13 @@
 
   test_MapLiteralEntry() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2542,13 +2542,13 @@
 
   test_MapLiteralEntry1() async {
     // MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2562,13 +2562,13 @@
 
   test_MapLiteralEntry2() async {
     // SimpleIdentifier  MapLiteralEntry  MapLiteral  VariableDeclaration
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2771,13 +2771,13 @@
 
   test_MethodDeclaration_returnType() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2799,13 +2799,13 @@
 
   test_MethodDeclaration_returnType_afterComment() async {
     // ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2827,13 +2827,13 @@
 
   test_MethodDeclaration_returnType_afterComment2() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -2855,13 +2855,13 @@
 
   test_MethodDeclaration_returnType_afterComment3() async {
     // MethodDeclaration  ClassDeclaration  CompilationUnit
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         int T1;
         F1() { }
         typedef D1();
         class C1 {C1(this.x) { } int x;}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         int T2;
         F2() { }
         typedef D2();
@@ -3052,14 +3052,14 @@
 
   test_partFile_TypeName() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         library libA;
-        import "testB.dart";
+        import 'b.dart';
         part "$testFile";
         class A { }
         var m;''');
@@ -3084,18 +3084,18 @@
 
   test_partFile_TypeName2() async {
     // SimpleIdentifier  TypeName  ConstructorName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         int T1;
         F1() { }
         class X {X.c(); X._d(); z() {}}''');
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         part of libA;
         class B { }''');
     addTestSource('''
         library libA;
-        import "testB.dart";
-        part "testA.dart";
+        import 'b.dart';
+        part "a.dart";
         class A { A({String boo: 'hoo'}) { } }
         main() {new ^}
         var m;''');
@@ -3116,7 +3116,7 @@
 
   test_PrefixedIdentifier_class_const() async {
     // SimpleIdentifier PrefixedIdentifier ExpressionStatement Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class I {
           static const scI = 'boo';
@@ -3130,7 +3130,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class A extends B {
           static const String scA = 'foo';
           w() { }}
@@ -3162,7 +3162,7 @@
 
   test_PrefixedIdentifier_class_imported() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class I {X get f => new A();get _g => new A();}
         class A implements I {
@@ -3173,7 +3173,7 @@
           m(X x) {} I _n(X x) {}}
         class X{}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         main() {A a; a.^}''');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -3238,13 +3238,13 @@
 
   test_PrefixedIdentifier_library() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "testB.dart" as b;
+        import 'b.dart'; as b;
         var T2;
         class A { }
         main() {b.^}''');
@@ -3264,13 +3264,13 @@
 
   test_PrefixedIdentifier_library_typesOnly() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "testB.dart" as b;
+        import 'b.dart'; as b;
         var T2;
         class A { }
         foo(b.^ f) {}''');
@@ -3290,13 +3290,13 @@
 
   test_PrefixedIdentifier_library_typesOnly2() async {
     // SimpleIdentifier  PrefixedIdentifier  TypeName
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         var T1;
         class X { }
         class Y { }''');
     addTestSource('''
-        import "testB.dart" as b;
+        import 'b.dart'; as b;
         var T2;
         class A { }
         foo(b.^) {}''');
@@ -3316,13 +3316,13 @@
 
   test_PrefixedIdentifier_parameter() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         class _W {M y; var _z;}
         class X extends _W {}
         class M{}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         foo(X x) {x.^}''');
     await computeSuggestions();
     expect(replacementOffset, completionOffset);
@@ -3334,11 +3334,11 @@
 
   test_PrefixedIdentifier_prefix() async {
     // SimpleIdentifier  PrefixedIdentifier  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class A {static int bar = 10;}
         _B() {}''');
     addTestSource('''
-        import "testA.dart";
+        import "a.dart";
         class X {foo(){A^.bar}}''');
     await computeSuggestions();
     expect(replacementOffset, completionOffset - 1);
@@ -3903,12 +3903,12 @@
 
   test_TypeArgumentList() async {
     // SimpleIdentifier  BinaryExpression  ExpressionStatement
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
     addTestSource('''
-        import "testA.dart";'
+        import "a.dart";'
         class C2 {int x;}
         F2() => 0;
         typedef int T2(int blat);
@@ -3928,12 +3928,12 @@
 
   test_TypeArgumentList2() async {
     // TypeName  TypeArgumentList  TypeName
-    addSource('/testA.dart', '''
+    addSource('/home/test/lib/a.dart', '''
         class C1 {int x;}
         F1() => 0;
         typedef String T1(int blat);''');
     addTestSource('''
-        import "testA.dart";'
+        import "a.dart";'
         class C2 {int x;}
         F2() => 0;
         typedef int T2(int blat);
@@ -3949,13 +3949,13 @@
   test_VariableDeclaration_name() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement  Block
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class Y {Y.c(); Y._d(); z() {}}
         main() {var ^}''');
     await computeSuggestions();
@@ -3974,13 +3974,13 @@
   test_VariableDeclarationStatement_RHS() async {
     // SimpleIdentifier  VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         class Y {Y.c(); Y._d(); z() {}}
         class C {bar(){var f; {var x;} var e = ^}}''');
     await computeSuggestions();
@@ -3998,14 +3998,14 @@
   test_VariableDeclarationStatement_RHS_missing_semicolon() async {
     // VariableDeclaration  VariableDeclarationList
     // VariableDeclarationStatement
-    addSource('/testB.dart', '''
+    addSource('/home/test/lib/b.dart', '''
         lib B;
         foo1() { }
         void bar1() { }
         class _B { }
         class X {X.c(); X._d(); z() {}}''');
     addTestSource('''
-        import "testB.dart";
+        import 'b.dart';
         foo2() { }
         void bar2() { }
         class Y {Y.c(); Y._d(); z() {}}
diff --git a/pkg/analyzer_plugin/test/utilities/navigation_test.dart b/pkg/analyzer_plugin/test/utilities/navigation_test.dart
index fdafcd3..80ec0db 100644
--- a/pkg/analyzer_plugin/test/utilities/navigation_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/navigation_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
 import 'package:analyzer_plugin/utilities/generator.dart';
 import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
@@ -17,15 +17,13 @@
 }
 
 @reflectiveTest
-class NavigationGeneratorTest {
-  MemoryResourceProvider provider = new MemoryResourceProvider();
-
-  ResolveResult resolveResult = new MockAnalysisResult(path: 'a.dart');
+class NavigationGeneratorTest with ResourceProviderMixin {
+  ResolvedUnitResult resolvedUnit = new MockResolvedUnitResult(path: 'a.dart');
 
   test_none() {
     NavigationGenerator generator = new NavigationGenerator([]);
     NavigationRequest request =
-        new DartNavigationRequestImpl(provider, 0, 100, resolveResult);
+        new DartNavigationRequestImpl(resourceProvider, 0, 100, resolvedUnit);
     GeneratorResult result = generator.generateNavigationNotification(request);
     expect(result.notifications, hasLength(1));
   }
@@ -34,7 +32,7 @@
     TestContributor contributor = new TestContributor();
     NavigationGenerator generator = new NavigationGenerator([contributor]);
     NavigationRequest request =
-        new DartNavigationRequestImpl(provider, 0, 100, resolveResult);
+        new DartNavigationRequestImpl(resourceProvider, 0, 100, resolvedUnit);
     GeneratorResult result = generator.generateNavigationNotification(request);
     expect(result.notifications, hasLength(1));
     expect(contributor.count, 1);
@@ -53,7 +51,7 @@
     NavigationGenerator generator = new NavigationGenerator(
         [contributor1, contributor2, contributor3, contributor4]);
     NavigationRequest request =
-        new DartNavigationRequestImpl(provider, 0, 100, resolveResult);
+        new DartNavigationRequestImpl(resourceProvider, 0, 100, resolvedUnit);
     GeneratorResult result = generator.generateNavigationNotification(request);
     expect(result.notifications, hasLength(3));
     expect(
diff --git a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
index af79bc1..105ae6f 100644
--- a/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/range_factory_test.dart
@@ -29,7 +29,8 @@
 
   test_endEnd() async {
     await resolveTestUnit('main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     FunctionBody mainBody = mainFunction.functionExpression.body;
     expect(range.endEnd(mainName, mainBody), new SourceRange(4, 5));
@@ -37,14 +38,16 @@
 
   test_endLength() async {
     await resolveTestUnit('main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     expect(range.endLength(mainName, 3), new SourceRange(4, 3));
   }
 
   test_endStart() async {
     await resolveTestUnit('main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     FunctionBody mainBody = mainFunction.functionExpression.body;
     expect(range.endStart(mainName, mainBody), new SourceRange(4, 3));
@@ -58,14 +61,16 @@
 
   test_node() async {
     await resolveTestUnit('main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     expect(range.node(mainName), new SourceRange(0, 4));
   }
 
   test_nodes() async {
     await resolveTestUnit(' main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     FunctionBody mainBody = mainFunction.functionExpression.body;
     expect(range.nodes([mainName, mainBody]), new SourceRange(1, 9));
@@ -82,7 +87,8 @@
 
   test_startEnd_nodeNode() async {
     await resolveTestUnit(' main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     FunctionBody mainBody = mainFunction.functionExpression.body;
     expect(range.startEnd(mainName, mainBody), new SourceRange(1, 9));
@@ -90,7 +96,8 @@
 
   test_startLength_node() async {
     await resolveTestUnit(' main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     expect(range.startLength(mainName, 10), new SourceRange(1, 10));
   }
@@ -101,7 +108,8 @@
 
   test_startStart_nodeNode() async {
     await resolveTestUnit('main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     FunctionBody mainBody = mainFunction.functionExpression.body;
     expect(range.startStart(mainName, mainBody), new SourceRange(0, 7));
@@ -109,7 +117,8 @@
 
   test_token() async {
     await resolveTestUnit(' main() {}');
-    FunctionDeclaration mainFunction = testUnit.declarations[0];
+    FunctionDeclaration mainFunction =
+        testUnit.declarations[0] as FunctionDeclaration;
     SimpleIdentifier mainName = mainFunction.name;
     expect(range.token(mainName.beginToken), new SourceRange(1, 4));
   }
diff --git a/pkg/analyzer_plugin/tool/spec/common_types_spec.html b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
index ed8daca..d12b351 100644
--- a/pkg/analyzer_plugin/tool/spec/common_types_spec.html
+++ b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
@@ -206,6 +206,13 @@
           completion.  Otherwise it is omitted.
         </p>
       </field>
+      <field name="elementUri" optional="true">
+        <ref>String</ref>
+        <p>
+          The URI of the element corresponding to this suggestion. It will be
+          set whenever analysis server is able to compute it.
+        </p>
+      </field>
       <field name="selectionOffset">
         <ref>int</ref>
         <p>
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index a8c5bef..b746b5c 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -5,5 +5,8 @@
 # This package is not intended to be published - yet
 publish_to: none
 
+environment:
+  sdk: '>=2.0.0 <3.0.0'
+
 dependencies:
   front_end: ^0.1.0
diff --git a/pkg/compiler/.gitignore b/pkg/compiler/.gitignore
index 16a1724..52a27d1 100644
--- a/pkg/compiler/.gitignore
+++ b/pkg/compiler/.gitignore
@@ -1 +1,2 @@
+.dart_tool/
 .packages
diff --git a/pkg/compiler/README.md b/pkg/compiler/README.md
index 16abf7b..755369e 100644
--- a/pkg/compiler/README.md
+++ b/pkg/compiler/README.md
@@ -487,9 +487,6 @@
   * sdk patch files are hardcoded in the codebase in
     `lib/src/js_backend/backend.dart` (see `_patchLocations`).
 
-  * package resolution is specified with a `.packages` file, which is parsed
-    using the `package_config` package.
-
   * `lib/src/resolved_uri_translator.dart`: has the logic to translate all these
     URIs when they are encountered by the library loader.
 
diff --git a/pkg/compiler/analysis_options.yaml b/pkg/compiler/analysis_options.yaml
index 050bbb3..af22f6b 100644
--- a/pkg/compiler/analysis_options.yaml
+++ b/pkg/compiler/analysis_options.yaml
@@ -3,8 +3,10 @@
 # BSD-style license that can be found in the LICENSE file.
 
 analyzer:
-  language:
-    enableSuperMixins: false
   errors:
     todo: ignore
+    # Allow cross-package deprecated calls
+    # TODO(srawlins): clean these up and remove this "ignore."
     deprecated_member_use: ignore
+    # Allow deprecated calls from within the same package
+    deprecated_member_use_from_same_package: ignore
diff --git a/pkg/compiler/lib/compiler.dart b/pkg/compiler/lib/compiler.dart
index 671f426..11816ed 100644
--- a/pkg/compiler/lib/compiler.dart
+++ b/pkg/compiler/lib/compiler.dart
@@ -6,8 +6,6 @@
 
 import 'dart:async';
 
-import 'package:package_config/packages.dart';
-
 import 'compiler_new.dart' as new_api;
 import 'src/old_to_new_api.dart';
 import 'src/options.dart' show CompilerOptions;
@@ -15,66 +13,54 @@
 // Unless explicitly allowed, passing [:null:] for any argument to the
 // methods of library will result in an Error being thrown.
 
-/**
- * Returns a future that completes to the source corresponding to [uri].
- * If an exception occurs, the future completes with this exception.
- *
- * The source can be represented either as a [:List<int>:] of UTF-8 bytes or as
- * a [String].
- *
- * The following text is non-normative:
- *
- * It is recommended to return a UTF-8 encoded list of bytes because the scanner
- * is more efficient in this case. In either case, the data structure is
- * expected to hold a zero element at the last position. If this is not the
- * case, the entire data structure is copied before scanning.
- */
+/// Returns a future that completes to the source corresponding to [uri].
+/// If an exception occurs, the future completes with this exception.
+///
+/// The source can be represented either as a [:List<int>:] of UTF-8 bytes or as
+/// a [String].
+///
+/// The following text is non-normative:
+///
+/// It is recommended to return a UTF-8 encoded list of bytes because the
+/// scanner is more efficient in this case. In either case, the data structure
+/// is expected to hold a zero element at the last position. If this is not the
+/// case, the entire data structure is copied before scanning.
 typedef Future /* <String | List<int>> */ CompilerInputProvider(Uri uri);
 
 /// Deprecated, please use [CompilerInputProvider] instead.
 typedef Future<String> ReadStringFromUri(Uri uri);
 
-/**
- * Returns an [EventSink] that will serve as compiler output for the given
- * component.
- *
- * Components are identified by [name] and [extension]. By convention,
- * the empty string [:"":] will represent the main script
- * (corresponding to the script parameter of [compile]) even if the
- * main script is a library. For libraries that are compiled
- * separately, the library name is used.
- *
- * At least the following extensions can be expected:
- *
- * * "js" for JavaScript output.
- * * "js.map" for source maps.
- * * "dart" for Dart output.
- * * "dart.map" for source maps.
- *
- * As more features are added to the compiler, new names and
- * extensions may be introduced.
- */
+/// Returns an [EventSink] that will serve as compiler output for the given
+/// component.
+///
+/// Components are identified by [name] and [extension]. By convention,
+/// the empty string [:"":] will represent the main script
+/// (corresponding to the script parameter of [compile]) even if the
+/// main script is a library. For libraries that are compiled
+/// separately, the library name is used.
+///
+/// At least the following extensions can be expected:
+///
+/// * "js" for JavaScript output.
+/// * "js.map" for source maps.
+/// * "dart" for Dart output.
+/// * "dart.map" for source maps.
+///
+/// As more features are added to the compiler, new names and
+/// extensions may be introduced.
 typedef EventSink<String> CompilerOutputProvider(String name, String extension);
 
-/**
- * Invoked by the compiler to report diagnostics. If [uri] is
- * [:null:], so are [begin] and [end]. No other arguments may be
- * [:null:]. If [uri] is not [:null:], neither are [begin] and
- * [end]. [uri] indicates the compilation unit from where the
- * diagnostic originates. [begin] and [end] are zero-based character
- * offsets from the beginning of the compilation unit. [message] is the
- * diagnostic message, and [kind] indicates indicates what kind of
- * diagnostic it is.
- */
+/// Invoked by the compiler to report diagnostics. If [uri] is
+/// [:null:], so are [begin] and [end]. No other arguments may be
+/// [:null:]. If [uri] is not [:null:], neither are [begin] and
+/// [end]. [uri] indicates the compilation unit from where the
+/// diagnostic originates. [begin] and [end] are zero-based character
+/// offsets from the beginning of the compilation unit. [message] is the
+/// diagnostic message, and [kind] indicates indicates what kind of
+/// diagnostic it is.
 typedef void DiagnosticHandler(
     Uri uri, int begin, int end, String message, Diagnostic kind);
 
-/**
- * Provides a package lookup mechanism in the case that no package root or
- * package resolution configuration file are explicitly specified.
- */
-typedef Future<Packages> PackagesDiscoveryProvider(Uri uri);
-
 /// Information resulting from the compilation.
 class CompilationResult {
   /// `true` if the compilation succeeded, that is, compilation didn't fail due
@@ -90,35 +76,35 @@
   CompilationResult(this.compiler, {this.isSuccess: true});
 }
 
-/**
- * Returns a future that completes to a non-null String when [script]
- * has been successfully compiled.
- *
- * The compiler output is obtained by providing an [outputProvider].
- *
- * If the compilation fails, the future's value will be [:null:] and
- * [handler] will have been invoked at least once with [:kind ==
- * Diagnostic.ERROR:] or [:kind == Diagnostic.CRASH:].
- *
- * Deprecated: if no [outputProvider] is given, the future completes
- * to the compiled script. This behavior will be removed in the future
- * as the compiler may create multiple files to support lazy loading
- * of libraries.
- */
-Future<CompilationResult> compile(Uri script, Uri libraryRoot, Uri packageRoot,
-    CompilerInputProvider inputProvider, DiagnosticHandler handler,
+/// Returns a future that completes to a non-null String when [script]
+/// has been successfully compiled.
+///
+/// The compiler output is obtained by providing an [outputProvider].
+///
+/// If the compilation fails, the future's value will be [:null:] and
+/// [handler] will have been invoked at least once with [:kind ==
+/// Diagnostic.ERROR:] or [:kind == Diagnostic.CRASH:].
+///
+/// Deprecated: if no [outputProvider] is given, the future completes
+/// to the compiled script. This behavior will be removed in the future
+/// as the compiler may create multiple files to support lazy loading
+/// of libraries.
+Future<CompilationResult> compile(
+    Uri script,
+    Uri librariesSpecificationUri,
+    Uri packageRoot,
+    CompilerInputProvider inputProvider,
+    DiagnosticHandler handler,
     [List<String> options = const [],
     CompilerOutputProvider outputProvider,
     Map<String, String> environment = const {},
-    Uri packageConfig,
-    PackagesDiscoveryProvider packagesDiscoveryProvider]) {
-  CompilerOptions compilerOptions =
-      CompilerOptions.parse(options, libraryRoot: libraryRoot)
-        ..entryPoint = script
-        ..packageRoot = packageRoot
-        ..packageConfig = packageConfig
-        ..packagesDiscoveryProvider = packagesDiscoveryProvider
-        ..environment = environment;
+    Uri packageConfig]) {
+  CompilerOptions compilerOptions = CompilerOptions.parse(options,
+      librariesSpecificationUri: librariesSpecificationUri)
+    ..entryPoint = script
+    ..packageRoot = packageRoot
+    ..packageConfig = packageConfig
+    ..environment = environment;
 
   new_api.CompilerInput compilerInput = new LegacyCompilerInput(inputProvider);
   new_api.CompilerDiagnostics compilerDiagnostics =
@@ -134,74 +120,54 @@
   });
 }
 
-/**
- * Kind of diagnostics that the compiler can report.
- */
+/// Kind of diagnostics that the compiler can report.
 class Diagnostic {
-  /**
-   * An error as identified by the "Dart Programming Language
-   * Specification" [http://www.dartlang.org/docs/spec/].
-   *
-   * Note: the compiler may still produce an executable result after
-   * reporting a compilation error. The specification says:
-   *
-   * "A compile-time error must be reported by a Dart compiler before
-   * the erroneous code is executed." and "If a compile-time error
-   * occurs within the code of a running isolate A, A is immediately
-   * suspended."
-   *
-   * This means that the compiler can generate code that when executed
-   * terminates execution.
-   */
+  /// An error as identified by the "Dart Programming Language
+  /// Specification" [http://www.dartlang.org/docs/spec/].
+  ///
+  /// Note: the compiler may still produce an executable result after
+  /// reporting a compilation error. The specification says:
+  ///
+  /// "A compile-time error must be reported by a Dart compiler before
+  /// the erroneous code is executed." and "If a compile-time error
+  /// occurs within the code of a running isolate A, A is immediately
+  /// suspended."
+  ///
+  /// This means that the compiler can generate code that when executed
+  /// terminates execution.
   static const Diagnostic ERROR = const Diagnostic(1, 'error');
 
-  /**
-   * A warning as identified by the "Dart Programming Language
-   * Specification" [http://www.dartlang.org/docs/spec/].
-   */
+  /// A warning as identified by the "Dart Programming Language
+  /// Specification" [http://www.dartlang.org/docs/spec/].
   static const Diagnostic WARNING = const Diagnostic(2, 'warning');
 
-  /**
-   * Any other warning that is not covered by [WARNING].
-   */
+  /// Any other warning that is not covered by [WARNING].
   static const Diagnostic HINT = const Diagnostic(4, 'hint');
 
-  /**
-   * Additional information about the preceding non-info diagnostic from the
-   * compiler.
-   *
-   * For example, consider a duplicated definition. The compiler first emits a
-   * message about the duplicated definition, then emits an info message about
-   * the location of the existing definition.
-   */
+  /// Additional information about the preceding non-info diagnostic from the
+  /// compiler.
+  ///
+  /// For example, consider a duplicated definition. The compiler first emits a
+  /// message about the duplicated definition, then emits an info message about
+  /// the location of the existing definition.
   static const Diagnostic INFO = const Diagnostic(8, 'info');
 
-  /**
-   * Informational messages that shouldn't be printed unless
-   * explicitly requested by the user of a compiler.
-   */
+  /// Informational messages that shouldn't be printed unless
+  /// explicitly requested by the user of a compiler.
   static const Diagnostic VERBOSE_INFO = const Diagnostic(16, 'verbose info');
 
-  /**
-   * An internal error in the compiler.
-   */
+  /// An internal error in the compiler.
   static const Diagnostic CRASH = const Diagnostic(32, 'crash');
 
-  /**
-   * An [int] representation of this kind. The ordinals are designed
-   * to be used as bitsets.
-   */
+  /// An [int] representation of this kind. The ordinals are designed
+  /// to be used as bitsets.
   final int ordinal;
 
-  /**
-   * The name of this kind.
-   */
+  /// The name of this kind.
   final String name;
 
-  /**
-   * This constructor is not private to support user-defined
-   * diagnostic kinds.
-   */
+  /// This constructor is not private to support user-defined
+  /// diagnostic kinds.
   const Diagnostic(this.ordinal, this.name);
 
   String toString() => name;
diff --git a/pkg/compiler/lib/compiler_new.dart b/pkg/compiler/lib/compiler_new.dart
index a85fe85..918c627 100644
--- a/pkg/compiler/lib/compiler_new.dart
+++ b/pkg/compiler/lib/compiler_new.dart
@@ -15,7 +15,7 @@
 import 'src/apiimpl.dart';
 import 'src/options.dart' show CompilerOptions;
 
-export 'compiler.dart' show Diagnostic, PackagesDiscoveryProvider;
+export 'compiler.dart' show Diagnostic;
 
 // Unless explicitly allowed, passing `null` for any argument to the
 // methods of library will result in an Error being thrown.
@@ -72,9 +72,11 @@
   /// A source map for a JavaScript output.
   sourceMap,
 
-  /// Additional information requested by the user, such dump info or a deferred
-  /// map.
-  info,
+  /// Dump info output.
+  dumpInfo,
+
+  /// Deferred map output.
+  deferredMap,
 
   /// Implementation specific output used for debugging the compiler.
   debug,
@@ -89,6 +91,15 @@
   void close();
 }
 
+/// Sink interface used for generating binary data from the compiler.
+abstract class BinaryOutputSink {
+  /// Writes indices [start] to [end] of [buffer] to the sink.
+  void write(List<int> buffer, [int start = 0, int end]);
+
+  /// Closes the sink.
+  void close();
+}
+
 /// Interface for producing output from the compiler. That is, JavaScript target
 /// files, source map files, dump info files, etc.
 abstract class CompilerOutput {
@@ -101,6 +112,10 @@
   // TODO(johnniwinther): Replace [name] and [extension] with something like
   // [id] and [uri].
   OutputSink createOutputSink(String name, String extension, OutputType type);
+
+  /// Returns an [BinaryOutputSink] that will serve as compiler output for the
+  /// given URI.
+  BinaryOutputSink createBinarySink(Uri uri);
 }
 
 /// Interface for receiving diagnostic message from the compiler. That is,
@@ -175,6 +190,6 @@
     return new CompilationResult(compiler,
         isSuccess: success,
         kernelInitializedCompilerState:
-            compiler.libraryLoader.initializedCompilerState);
+            compiler.kernelLoader.initializedCompilerState);
   });
 }
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index a855925..f54520a 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -5,12 +5,10 @@
 library leg_apiimpl;
 
 import 'dart:async';
+import 'dart:convert' show utf8;
 
-import 'package:package_config/packages.dart';
-import 'package:package_config/packages_file.dart' as pkgs;
-import 'package:package_config/src/packages_impl.dart'
-    show MapPackages, NonFilePackagesDirectoryPackages;
-import 'package:package_config/src/util.dart' show checkValidPackageUri;
+import 'package:front_end/src/api_unstable/dart2js.dart'
+    show getSupportedLibraryNames;
 
 import '../compiler_new.dart' as api;
 import 'common/tasks.dart' show GenericTask, Measurer;
@@ -18,9 +16,8 @@
 import 'compiler.dart';
 import 'diagnostics/messages.dart' show Message;
 import 'environment.dart';
+import 'io/source_file.dart';
 import 'options.dart' show CompilerOptions;
-import 'platform_configuration.dart' as platform_configuration;
-import 'resolved_uri_translator.dart';
 
 /// Implements the [Compiler] using a [api.CompilerInput] for supplying the
 /// sources.
@@ -28,15 +25,9 @@
   final Measurer measurer;
   api.CompilerInput provider;
   api.CompilerDiagnostics handler;
-  Packages packages;
-
-  ForwardingResolvedUriTranslator resolvedUriTranslator;
 
   GenericTask userHandlerTask;
   GenericTask userProviderTask;
-  GenericTask userPackagesDiscoveryTask;
-
-  Uri get libraryRoot => options.platformConfigUri.resolve(".");
 
   CompilerImpl(this.provider, api.CompilerOutput outputProvider, this.handler,
       CompilerOptions options,
@@ -44,19 +35,14 @@
       // NOTE: allocating measurer is done upfront to ensure the wallclock is
       // started before other computations.
       : measurer = new Measurer(enableTaskMeasurements: options.verbose),
-        resolvedUriTranslator = new ForwardingResolvedUriTranslator(),
         super(
             options: options,
             outputProvider: outputProvider,
             environment: new _Environment(options.environment),
             makeReporter: makeReporter) {
-    _Environment env = environment;
-    env.compiler = this;
     tasks.addAll([
       userHandlerTask = new GenericTask('Diagnostic handler', measurer),
       userProviderTask = new GenericTask('Input provider', measurer),
-      userPackagesDiscoveryTask =
-          new GenericTask('Package discovery', measurer),
     ]);
   }
 
@@ -65,68 +51,27 @@
         null, null, null, null, message, api.Diagnostic.VERBOSE_INFO);
   }
 
-  /**
-   * Translates a readable URI into a resource URI.
-   *
-   * See [LibraryLoader] for terminology on URIs.
-   */
-  Uri translateUri(Spannable node, Uri uri) =>
-      uri.scheme == 'package' ? translatePackageUri(node, uri) : uri;
-
-  Uri translatePackageUri(Spannable node, Uri uri) {
-    try {
-      checkValidPackageUri(uri);
-    } on ArgumentError catch (e) {
-      reporter.reportErrorMessage(node, MessageKind.INVALID_PACKAGE_URI,
-          {'uri': uri, 'exception': e.message});
-      return null;
-    }
-    return packages.resolve(uri, notFound: (Uri notFound) {
-      reporter.reportErrorMessage(
-          node, MessageKind.LIBRARY_NOT_FOUND, {'resolvedUri': uri});
-      return null;
-    });
-  }
-
-  Future setupPackages(Uri uri) {
-    if (options.packageRoot != null) {
-      // Use "non-file" packages because the file version requires a [Directory]
-      // and we can't depend on 'dart:io' classes.
-      packages = new NonFilePackagesDirectoryPackages(options.packageRoot);
-    } else if (options.packageConfig != null) {
-      Future<api.Input<List<int>>> future =
-          callUserProvider(options.packageConfig, api.InputKind.binary);
-      return future.then((api.Input<List<int>> binary) {
-        packages =
-            new MapPackages(pkgs.parse(binary.data, options.packageConfig));
-      }).catchError((error) {
-        reporter.reportErrorMessage(
-            NO_LOCATION_SPANNABLE,
-            MessageKind.INVALID_PACKAGE_CONFIG,
-            {'uri': options.packageConfig, 'exception': error});
-        packages = Packages.noPackages;
-      });
-    } else {
-      if (options.packagesDiscoveryProvider == null) {
-        packages = Packages.noPackages;
-      } else {
-        return callUserPackagesDiscovery(uri).then((p) {
-          packages = p;
-        });
-      }
-    }
-    return new Future.value();
-  }
-
   Future setupSdk() {
     var future = new Future.value(null);
-    if (resolvedUriTranslator.isNotSet) {
+    _Environment env = environment;
+    if (env.supportedLibraries == null) {
       future = future.then((_) {
-        return platform_configuration
-            .load(options.platformConfigUri, provider)
-            .then((Map<String, Uri> mapping) {
-          resolvedUriTranslator.resolvedUriTranslator =
-              new ResolvedUriTranslator(mapping);
+        Uri specificationUri = options.librariesSpecificationUri;
+        return provider.readFromUri(specificationUri).then((api.Input spec) {
+          String json = null;
+          // TODO(sigmund): simplify this, we have some API inconsistencies when
+          // our internal input adds a terminating zero.
+          if (spec is SourceFile) {
+            json = spec.slowText();
+          } else if (spec is Binary) {
+            json = utf8.decode(spec.data);
+          }
+
+          // TODO(sigmund): would be nice to front-load some of the CFE option
+          // processing and parse this .json file only once.
+          env.supportedLibraries = getSupportedLibraryNames(specificationUri,
+                  json, options.compileForServer ? "dart2js_server" : "dart2js")
+              .toSet();
         });
       });
     }
@@ -137,14 +82,9 @@
   }
 
   Future<bool> run(Uri uri) {
-    Duration setupDuration = measurer.wallClock.elapsed;
-    return selfTask.measureSubtask("CompilerImpl.run", () {
-      log('Using platform configuration at ${options.platformConfigUri}');
-
-      return setupSdk().then((_) => setupPackages(uri)).then((_) {
-        assert(resolvedUriTranslator.isSet);
-        assert(packages != null);
-
+    Duration setupDuration = measurer.elapsedWallClock;
+    return selfTask.measureSubtask("impl.run", () {
+      return setupSdk().then((_) {
         return super.run(uri);
       }).then((bool success) {
         if (options.verbose) {
@@ -163,24 +103,37 @@
 
   void computeTimings(Duration setupDuration, StringBuffer timings) {
     timings.writeln("Timings:");
-    Duration totalDuration = measurer.wallClock.elapsed;
-    Duration asyncDuration = measurer.asyncWallClock.elapsed;
+    Duration totalDuration = measurer.elapsedWallClock;
+    Duration asyncDuration = measurer.elapsedAsyncWallClock;
     Duration cumulatedDuration = Duration.zero;
+    List<_TimingData> timingData = [];
     for (final task in tasks) {
-      String running = task.isRunning ? "*" : "";
+      String running = task.isRunning ? "*" : " ";
       Duration duration = task.duration;
       if (duration != Duration.zero) {
         cumulatedDuration += duration;
-        timings.writeln('    $running${task.name}:'
-            ' ${_formatMs(duration.inMilliseconds)}');
+        int milliseconds = duration.inMilliseconds;
+        timingData.add(_TimingData('   $running${task.name}:', milliseconds,
+            milliseconds * 100 / totalDuration.inMilliseconds));
         for (String subtask in task.subtasks) {
           int subtime = task.getSubtaskTime(subtask);
-          String running = task.getSubtaskIsRunning(subtask) ? "*" : "";
-          timings.writeln(
-              '    $running${task.name} > $subtask: ${_formatMs(subtime)}');
+          String running = task.getSubtaskIsRunning(subtask) ? "*" : " ";
+          timingData.add(_TimingData('   $running${task.name} > $subtask:',
+              subtime, subtime * 100 / totalDuration.inMilliseconds));
         }
       }
     }
+    int longestDescription = timingData
+        .map((d) => d.description.length)
+        .fold(0, (a, b) => a < b ? b : a);
+    for (var data in timingData) {
+      var ms = _formatMs(data.milliseconds);
+      var padding =
+          " " * (longestDescription + 10 - data.description.length - ms.length);
+      var percentPadding = data.percent < 10 ? " " : "";
+      timings.writeln('${data.description}$padding $ms '
+          '$percentPadding(${data.percent.toStringAsFixed(1)}%)');
+    }
     Duration unaccountedDuration =
         totalDuration - cumulatedDuration - setupDuration - asyncDuration;
     double percent =
@@ -236,32 +189,15 @@
       rethrow;
     }
   }
-
-  Future<Packages> callUserPackagesDiscovery(Uri uri) {
-    try {
-      return userPackagesDiscoveryTask
-          .measureIo(() => options.packagesDiscoveryProvider(uri));
-    } catch (ex, s) {
-      reportCrashInUserCode('Uncaught exception in package discovery', ex, s);
-      rethrow;
-    }
-  }
 }
 
 class _Environment implements Environment {
   final Map<String, String> definitions;
-
-  // TODO(sigmund): break the circularity here: Compiler needs an environment to
-  // initialize the library loader, but the environment here needs to know about
-  // how the sdk is set up and about whether the backend supports mirrors.
-  CompilerImpl compiler;
+  Set<String> supportedLibraries;
 
   _Environment(this.definitions);
 
   String valueOf(String name) {
-    assert(compiler.resolvedUriTranslator != null,
-        failedAt(NO_LOCATION_SPANNABLE, "setupSdk() has not been run"));
-
     var result = definitions[name];
     if (result != null || definitions.containsKey(name)) return result;
     if (!name.startsWith(_dartLibraryEnvironmentPrefix)) return null;
@@ -270,28 +206,7 @@
 
     // Private libraries are not exposed to the users.
     if (libraryName.startsWith("_")) return null;
-
-    Uri libraryUri = compiler.resolvedUriTranslator.sdkLibraries[libraryName];
-    // TODO(sigmund): use libraries.json instead of .platform files, then simply
-    // use the `supported` bit.
-    if (libraryUri != null && libraryUri.scheme != "unsupported") {
-      if (libraryName == 'mirrors') return null;
-      if (libraryName == 'isolate') return null;
-      return "true";
-    }
-
-    // Note: we return null on `dart:io` here, even if we allow users to
-    // unconditionally import it.
-    //
-    // In the past it was invalid to import `dart:io` for client apps. We just
-    // made it valid to import it as a stopgap measure to support packages like
-    // `http`. This is temporary until we support config-imports in the
-    // language.
-    //
-    // Because it is meant to be temporary and because the returned `dart:io`
-    // implementation will throw on most APIs, we still preserve that
-    // when compiling client apps the `dart:io` library is technically not
-    // supported, and so `const bool.fromEnvironment(dart.library.io)` is false.
+    if (supportedLibraries.contains(libraryName)) return "true";
     return null;
   }
 }
@@ -303,3 +218,11 @@
 /// For example 'dart:html' has the environment variable 'dart.library.html' set
 /// to "true".
 const String _dartLibraryEnvironmentPrefix = 'dart.library.';
+
+class _TimingData {
+  final String description;
+  final int milliseconds;
+  final double percent;
+
+  _TimingData(this.description, this.milliseconds, this.percent);
+}
diff --git a/pkg/compiler/lib/src/backend_strategy.dart b/pkg/compiler/lib/src/backend_strategy.dart
index c3aefb1..c5cfe60 100644
--- a/pkg/compiler/lib/src/backend_strategy.dart
+++ b/pkg/compiler/lib/src/backend_strategy.dart
@@ -9,12 +9,13 @@
 import 'deferred_load.dart' show OutputUnitData;
 import 'enqueue.dart';
 import 'elements/entities.dart';
+import 'inferrer/types.dart';
 import 'io/source_information.dart';
 import 'js_backend/inferred_data.dart';
 import 'js_backend/js_backend.dart';
 import 'js_backend/native_data.dart';
 import 'ssa/ssa.dart';
-import 'types/types.dart';
+import 'universe/codegen_world_builder.dart';
 import 'universe/world_builder.dart';
 import 'world.dart';
 
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index 22b3fc7..467dfe1c3 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart' as ir;
-import 'common/tasks.dart' show CompilerTask, Measurer;
 import 'common.dart';
 import 'elements/entities.dart';
 import 'elements/types.dart';
@@ -11,10 +10,6 @@
 import 'js_model/element_map.dart';
 import 'serialization/serialization.dart';
 
-abstract class ClosureConversionTask extends CompilerTask {
-  ClosureConversionTask(Measurer measurer) : super(measurer);
-}
-
 /// Class that provides information for how closures are rewritten/represented
 /// to preserve Dart semantics when compiled to JavaScript. Given a particular
 /// node to look up, it returns a information about the internal representation
@@ -113,7 +108,7 @@
   void forEachBoxedVariable(f(Local local, FieldEntity field)) {}
 
   /// True if [variable] has been mutated and is also used in another scope.
-  bool isBoxed(Local variable) => false;
+  bool isBoxedVariable(Local variable) => false;
 }
 
 /// Class representing the usage of a scope that has been captured in the
@@ -299,10 +294,6 @@
   /// scopes.
   void forEachFreeVariable(f(Local variable, FieldEntity field)) {}
 
-  /// Return true if [variable] has been captured and mutated (all other
-  /// variables do not require boxing).
-  bool isVariableBoxed(Local variable) => false;
-
   // TODO(efortuna): Remove this method. The old system was using
   // ClosureClassMaps for situations other than closure class maps, and that's
   // just confusing.
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index c68391d..991fb58 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -13,6 +13,8 @@
   static const String disableDiagnosticColors = '--disable-diagnostic-colors';
   static const String disableNativeLiveTypeAnalysis =
       '--disable-native-live-type-analysis';
+  static const String useTrivialAbstractValueDomain =
+      '--use-trivial-abstract-value-domain';
   static const String disableTypeInference = '--disable-type-inference';
   static const String disableRtiOptimization = '--disable-rti-optimization';
   static const String dumpInfo = '--dump-info';
@@ -31,6 +33,18 @@
   // 'this' and constants.
   static const String experimentLocalNames = '--experiment-code-1';
 
+  // Experimentally try to force part-file functions to be seen as IIFEs.
+  static const String experimentStartupFunctions = '--experiment-code-2';
+
+  // Experimentally rely on JavaScript ToBoolean conversions.
+  static const String experimentToBoolean = '--experiment-code-3';
+
+  // Add instrumentation to log every method call.
+  static const String experimentCallInstrumentation =
+      '--experiment-call-instrumentation';
+
+  static const String enableLanguageExperiments = '--enable-experiment';
+
   static const String fastStartup = '--fast-startup';
   static const String fatalWarnings = '--fatal-warnings';
   static const String generateCodeWithCompileTimeErrors =
@@ -47,6 +61,8 @@
   static const String minify = '--minify';
   static const String noFrequencyBasedMinification =
       '--no-frequency-based-minification';
+  // Disables minification even if enabled by other options, e.g. '-O2'.
+  static const String noMinify = '--no-minify';
   static const String noSourceMaps = '--no-source-maps';
   static const String preserveUris = '--preserve-uris';
   static const String showPackageWarnings = '--show-package-warnings';
@@ -62,8 +78,19 @@
   static const String useMultiSourceInfo = '--use-multi-source-info';
   static const String useNewSourceInfo = '--use-new-source-info';
   static const String verbose = '--verbose';
+  static const String progress = '--show-internal-progress';
   static const String version = '--version';
 
+  static const String readData = '--read-data';
+  static const String writeData = '--write-data';
+  static const String cfeOnly = '--cfe-only';
+
+  static const String serverMode = '--server-mode';
+
+  static const String newDeferredSplit = '--new-deferred-split';
+  static const String reportInvalidInferredDeferredTypes =
+      '--report-invalid-deferred-types';
+
   /// Flag for a combination of flags for 'production' mode.
   static const String benchmarkingProduction = '--benchmarking-production';
 
@@ -92,19 +119,6 @@
   // https://gist.github.com/eernstg/4353d7b4f669745bed3a5423e04a453c.
   static const String genericMethodSyntax = '--generic-method-syntax';
 
-  // Deprecated. This flag is no longer in use for dart2js, but we are keeping
-  // it around for a while longer until all other tools deprecate the same flag.
-  //
-  // It was used to start `async` functions synchronously, but now dart2js
-  // switched on this behavior by default.
-  // TODO(sigmund): delete once this is on by default on all of our tools.
-  static const String syncAsync = '--sync-async';
-
-  // Starts `async` functions asynchronously.
-  //
-  // This is the old Dart 1.0 behavior. Only used during the migration.
-  static const String noSyncAsync = '--no-sync-async';
-
   // Initializing-formal access is enabled by default and cannot be disabled.
   // For backward compatibility the option is still accepted, but it is ignored.
   static const String initializingFormalAccess = '--initializing-formal-access';
@@ -117,6 +131,10 @@
   static const String showPackageWarnings =
       '${Flags.showPackageWarnings}|${Flags.showPackageWarnings}=.*';
 
+  static const String enableLanguageExperiments =
+      '${Flags.enableLanguageExperiments}|'
+      '${Flags.enableLanguageExperiments}=.*';
+
   // Experimental options.
   static const String resolutionInput = '--resolution-input=.+';
   static const String bazelPaths = '--bazel-paths=.+';
diff --git a/pkg/compiler/lib/src/common/tasks.dart b/pkg/compiler/lib/src/common/tasks.dart
index 9f3ce1e5..83a1e0d 100644
--- a/pkg/compiler/lib/src/common/tasks.dart
+++ b/pkg/compiler/lib/src/common/tasks.dart
@@ -14,20 +14,19 @@
 /// introduced by using [measureSubtask].
 // TODO(sigmund): rename to MeasurableTask
 abstract class CompilerTask {
-  final Measurer measurer;
+  final Measurer _measurer;
   final Stopwatch _watch;
   final Map<String, GenericTask> _subtasks = <String, GenericTask>{};
 
-  int asyncCount = 0;
+  int _asyncCount = 0;
 
   // Each task has a fixed, lazily computed, ZoneSpecification and zoneValues
   // for [_measureZoned].
   ZoneSpecification _zoneSpecification;
   Map _zoneValues;
 
-  CompilerTask(Measurer measurer)
-      : measurer = measurer,
-        _watch = measurer.enableTaskMeasurements ? new Stopwatch() : null;
+  CompilerTask(this._measurer)
+      : _watch = _measurer.enableTaskMeasurements ? new Stopwatch() : null;
 
   /// Whether measurement is disabled. The functions [measure] and [measureIo]
   /// only measure time if measurements are enabled.
@@ -66,12 +65,12 @@
   /// make this task the currently measured task.
   CompilerTask _start() {
     if (_isDisabled) return null;
-    CompilerTask previous = measurer.currentTask;
-    measurer.currentTask = this;
+    CompilerTask previous = _measurer._currentTask;
+    _measurer._currentTask = this;
     if (previous != null) previous._watch.stop();
     // Regardless of whether [previous] is `null` we've returned from the
     // eventloop.
-    measurer.stopAsyncWallClock();
+    _measurer.stopAsyncWallClock();
     _watch.start();
     return previous;
   }
@@ -86,9 +85,9 @@
     } else {
       // If there's no previous task, we're about to return control to the
       // event loop. Start counting that as waiting asynchronous I/O.
-      measurer.startAsyncWallClock();
+      _measurer.startAsyncWallClock();
     }
-    measurer.currentTask = previous;
+    _measurer._currentTask = previous;
   }
 
   T _measureZoned<T>(T action()) {
@@ -100,10 +99,10 @@
     assert(_watch != null);
 
     // The current zone is already measuring `this` task.
-    if (Zone.current[measurer] == this) return action();
+    if (Zone.current[_measurer] == this) return action();
 
     return runZoned(action,
-        zoneValues: _zoneValues ??= {measurer: this},
+        zoneValues: _zoneValues ??= {_measurer: this},
         zoneSpecification: _zoneSpecification ??= new ZoneSpecification(
             run: _run, runUnary: _runUnary, runBinary: _runBinary));
   }
@@ -113,10 +112,10 @@
   /// has the right value). Since [_measureZoned] can be called recursively
   /// (synchronously), some of the measuring zones we create will be parents
   /// of other measuring zones, but we still need to call through the parent
-  /// chain. Consequently, we use a zone value keyed by [measurer] to see if
+  /// chain. Consequently, we use a zone value keyed by [_measurer] to see if
   /// we should measure or not when delegating.
   R _run<R>(Zone self, ZoneDelegate parent, Zone zone, R f()) {
-    if (zone[measurer] != this) return parent.run(zone, f);
+    if (zone[_measurer] != this) return parent.run(zone, f);
     CompilerTask previous = _start();
     try {
       return parent.run(zone, f);
@@ -128,7 +127,7 @@
   /// Same as [run] except that [f] takes one argument, [arg].
   R _runUnary<R, T>(
       Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg) {
-    if (zone[measurer] != this) return parent.runUnary(zone, f, arg);
+    if (zone[_measurer] != this) return parent.runUnary(zone, f, arg);
     CompilerTask previous = _start();
     try {
       return parent.runUnary(zone, f, arg);
@@ -140,7 +139,7 @@
   /// Same as [run] except that [f] takes two arguments ([a1] and [a2]).
   R _runBinary<R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone,
       R f(T1 a1, T2 a2), T1 a1, T2 a2) {
-    if (zone[measurer] != this) return parent.runBinary(zone, f, a1, a2);
+    if (zone[_measurer] != this) return parent.runBinary(zone, f, a1, a2);
     CompilerTask previous = _start();
     try {
       return parent.runBinary(zone, f, a1, a2);
@@ -159,16 +158,16 @@
   Future<T> measureIo<T>(Future<T> action()) {
     if (_isDisabled) return action();
 
-    if (measurer.currentAsyncTask == null) {
-      measurer.currentAsyncTask = this;
-    } else if (measurer.currentAsyncTask != this) {
+    if (_measurer._currentAsyncTask == null) {
+      _measurer._currentAsyncTask = this;
+    } else if (_measurer._currentAsyncTask != this) {
       throw "Can't track async task '$name' because"
-          " '${measurer.currentAsyncTask.name}' is already being tracked.";
+          " '${_measurer._currentAsyncTask.name}' is already being tracked.";
     }
-    asyncCount++;
+    _asyncCount++;
     return measure(action).whenComplete(() {
-      asyncCount--;
-      if (asyncCount == 0) measurer.currentAsyncTask = null;
+      _asyncCount--;
+      if (_asyncCount == 0) _measurer._currentAsyncTask = null;
     });
   }
 
@@ -180,11 +179,27 @@
     // Use a nested CompilerTask for the measurement to ensure nested [measure]
     // calls work correctly. The subtasks will never themselves have nested
     // subtasks because they are not accessible outside.
-    GenericTask subtask =
-        _subtasks.putIfAbsent(name, () => new GenericTask(name, measurer));
+    GenericTask subtask = _subtasks[name] ??= new GenericTask(name, _measurer);
     return subtask.measure(action);
   }
 
+  /// Asynchronous version of [measureSubtask]. Use this when action returns a
+  /// future that's truly asynchronous, such I/O. Only one task can use this
+  /// concurrently.
+  ///
+  /// Note: we assume that this method is used only by the compiler input
+  /// provider, but it could be used by other tasks as long as the input
+  /// provider will not be called by those tasks.
+  Future<T> measureIoSubtask<T>(String name, Future<T> action()) {
+    if (_isDisabled) return action();
+
+    // Use a nested CompilerTask for the measurement to ensure nested [measure]
+    // calls work correctly. The subtasks will never themselves have nested
+    // subtasks because they are not accessible outside.
+    GenericTask subtask = _subtasks[name] ??= new GenericTask(name, _measurer);
+    return subtask.measureIo(action);
+  }
+
   Iterable<String> get subtasks => _subtasks.keys;
 
   int getSubtaskTime(String subtask) => _subtasks[subtask].timing;
@@ -202,10 +217,14 @@
   ///
   /// Note: MUST be the first field of this class to ensure [wallclock] is
   /// started before other computations.
-  final Stopwatch wallClock = new Stopwatch()..start();
+  final Stopwatch _wallClock = new Stopwatch()..start();
+
+  Duration get elapsedWallClock => _wallClock.elapsed;
 
   /// Measures gaps between zoned closures due to asynchronicity.
-  final Stopwatch asyncWallClock = new Stopwatch();
+  final Stopwatch _asyncWallClock = new Stopwatch();
+
+  Duration get elapsedAsyncWallClock => _asyncWallClock.elapsed;
 
   /// Whether measurement of tasks is enabled.
   final bool enableTaskMeasurements;
@@ -217,35 +236,35 @@
 
   /// The currently running task, that is, the task whose [Stopwatch] is
   /// currently running.
-  CompilerTask currentTask;
+  CompilerTask _currentTask;
 
   /// The current task which should be charged for asynchronous gaps.
-  CompilerTask currentAsyncTask;
+  CompilerTask _currentAsyncTask;
 
   /// Start counting the total elapsed time since the compiler started.
   void startWallClock() {
-    wallClock.start();
+    _wallClock.start();
   }
 
   /// Start counting the total elapsed time since the compiler started.
   void stopWallClock() {
-    wallClock.stop();
+    _wallClock.stop();
   }
 
   /// Call this before returning to the eventloop.
   void startAsyncWallClock() {
-    if (currentAsyncTask != null) {
-      currentAsyncTask._watch.start();
+    if (_currentAsyncTask != null) {
+      _currentAsyncTask._watch.start();
     } else {
-      asyncWallClock.start();
+      _asyncWallClock.start();
     }
   }
 
   /// Call this when the eventloop returns control to us.
   void stopAsyncWallClock() {
-    if (currentAsyncTask != null) {
-      currentAsyncTask._watch.stop();
+    if (_currentAsyncTask != null) {
+      _currentAsyncTask._watch.stop();
     }
-    asyncWallClock.stop();
+    _asyncWallClock.stop();
   }
 }
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 0a8a1b1..9913a66 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -11,11 +11,10 @@
 import 'constants/values.dart';
 import 'elements/entities.dart';
 import 'elements/types.dart';
-import 'js_backend/backend.dart' show JavaScriptBackend;
+import 'inferrer/abstract_value_domain.dart';
 import 'js_backend/constant_system_javascript.dart';
 import 'js_backend/native_data.dart' show NativeBasicData;
-import 'native/native.dart';
-import 'types/abstract_value_domain.dart';
+import 'kernel/dart2js_target.dart';
 import 'universe/selector.dart' show Selector;
 
 /// The common elements and types in Dart.
@@ -216,7 +215,6 @@
   bool isDefaultNoSuchMethodImplementation(FunctionEntity element);
 
   // From dart:async
-  FunctionEntity get asyncHelperStart;
   FunctionEntity get asyncHelperStartSync;
   FunctionEntity get asyncHelperAwait;
   FunctionEntity get asyncHelperReturn;
@@ -250,8 +248,6 @@
 
   FunctionEntity get asyncAwaitCompleterFactory;
 
-  FunctionEntity get syncCompleterFactory;
-
   FunctionEntity get asyncStarStreamControllerFactory;
 
   ClassEntity get jsInterceptorClass;
@@ -474,8 +470,6 @@
 
   ClassEntity get expectNoInlineClass;
 
-  ClassEntity get expectTrustTypeAnnotationsClass;
-
   ClassEntity get expectAssumeDynamicClass;
 
   /// Returns `true` if [member] is a "foreign helper", that is, a member whose
@@ -1030,8 +1024,6 @@
   FunctionEntity _findAsyncHelperFunction(String name) =>
       _findLibraryMember(asyncLibrary, name);
 
-  FunctionEntity get asyncHelperStart =>
-      _findAsyncHelperFunction("_asyncStart");
   FunctionEntity get asyncHelperStartSync =>
       _findAsyncHelperFunction("_asyncStartSync");
   FunctionEntity get asyncHelperAwait =>
@@ -1084,10 +1076,6 @@
       _asyncAwaitCompleterFactory ??=
           _findAsyncHelperFunction('_makeAsyncAwaitCompleter');
 
-  FunctionEntity _syncCompleterFactory;
-  FunctionEntity get syncCompleterFactory =>
-      _syncCompleterFactory ??= _findAsyncHelperFunction('_makeSyncCompleter');
-
   FunctionEntity _asyncStarStreamControllerFactory;
   FunctionEntity get asyncStarStreamControllerFactory =>
       _asyncStarStreamControllerFactory ??=
@@ -1240,7 +1228,9 @@
     }
     return selector.applies(_jsStringSplit) &&
         (receiver == null ||
-            abstractValueDomain.canHit(receiver, jsStringSplit, selector));
+            abstractValueDomain
+                .isTargetingMember(receiver, jsStringSplit, selector.memberName)
+                .isPotentiallyTrue);
   }
 
   FunctionEntity _jsStringSplit;
@@ -1416,17 +1406,7 @@
   FunctionEntity get boolConversionCheck =>
       _findHelperFunction('boolConversionCheck');
 
-  FunctionEntity get _consoleTraceHelper =>
-      _findHelperFunction('consoleTraceHelper');
-
-  FunctionEntity get _postTraceHelper => _findHelperFunction('postTraceHelper');
-
-  FunctionEntity _traceHelper;
-  FunctionEntity get traceHelper {
-    return _traceHelper ??= JavaScriptBackend.TRACE_METHOD == 'console'
-        ? _consoleTraceHelper
-        : _postTraceHelper;
-  }
+  FunctionEntity get traceHelper => _findHelperFunction('traceHelper');
 
   FunctionEntity get closureFromTearOff =>
       _findHelperFunction('closureFromTearOff');
@@ -1675,7 +1655,6 @@
 
   bool _expectAnnotationChecked = false;
   ClassEntity _expectNoInlineClass;
-  ClassEntity _expectTrustTypeAnnotationsClass;
   ClassEntity _expectAssumeDynamicClass;
 
   void _ensureExpectAnnotations() {
@@ -1684,15 +1663,10 @@
       LibraryEntity library = _env.lookupLibrary(PACKAGE_EXPECT);
       if (library != null) {
         _expectNoInlineClass = _env.lookupClass(library, 'NoInline');
-        _expectTrustTypeAnnotationsClass =
-            _env.lookupClass(library, 'TrustTypeAnnotations');
         _expectAssumeDynamicClass = _env.lookupClass(library, 'AssumeDynamic');
-        if (_expectNoInlineClass == null ||
-            _expectTrustTypeAnnotationsClass == null ||
-            _expectAssumeDynamicClass == null) {
+        if (_expectNoInlineClass == null || _expectAssumeDynamicClass == null) {
           // This is not the package you're looking for.
           _expectNoInlineClass = null;
-          _expectTrustTypeAnnotationsClass = null;
           _expectAssumeDynamicClass = null;
         }
       }
@@ -1704,11 +1678,6 @@
     return _expectNoInlineClass;
   }
 
-  ClassEntity get expectTrustTypeAnnotationsClass {
-    _ensureExpectAnnotations();
-    return _expectTrustTypeAnnotationsClass;
-  }
-
   ClassEntity get expectAssumeDynamicClass {
     _ensureExpectAnnotations();
     return _expectAssumeDynamicClass;
@@ -1936,16 +1905,6 @@
   /// Returns the function type variables defined on [function].
   List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function);
 
-  /// Returns the 'element' type of a function with an async, async* or sync*
-  /// marker. The return type of the method is inspected to determine the type
-  /// parameter of the Future, Stream or Iterable.
-  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function);
-
-  /// Returns the 'element' type of a function with the async, async* or sync*
-  /// marker [marker]. [returnType] is the return type marked function.
-  DartType getAsyncOrSyncStarElementType(
-      AsyncMarker marker, DartType returnType);
-
   /// Returns the type of the [local] function.
   FunctionType getLocalFunctionType(Local local);
 
@@ -2027,4 +1986,14 @@
   /// This is the type used as the default type argument when no explicit type
   /// argument is passed.
   DartType getTypeVariableDefaultType(TypeVariableEntity typeVariable);
+
+  /// Returns the 'element' type of a function with the async, async* or sync*
+  /// marker [marker]. [returnType] is the return type marked function.
+  DartType getAsyncOrSyncStarElementType(
+      AsyncMarker marker, DartType returnType);
+
+  /// Returns the 'element' type of a function with an async, async* or sync*
+  /// marker. The return type of the method is inspected to determine the type
+  /// parameter of the Future, Stream or Iterable.
+  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function);
 }
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 9140c04..b35401a 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -26,22 +26,25 @@
 import 'enqueue.dart' show Enqueuer, EnqueueTask, ResolutionEnqueuer;
 import 'environment.dart';
 import 'frontend_strategy.dart';
+import 'inferrer/abstract_value_domain.dart' show AbstractValueStrategy;
+import 'inferrer/trivial.dart' show TrivialAbstractValueStrategy;
 import 'inferrer/typemasks/masks.dart' show TypeMaskStrategy;
+import 'inferrer/types.dart'
+    show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
 import 'io/source_information.dart' show SourceInformation;
 import 'js_backend/backend.dart' show JavaScriptBackend;
 import 'js_backend/inferred_data.dart';
 import 'js_model/js_strategy.dart';
 import 'kernel/kernel_strategy.dart';
-import 'library_loader.dart' show LibraryLoaderTask, LoadedLibraries;
-import 'null_compiler_output.dart' show NullCompilerOutput, NullSink;
+import 'kernel/loader.dart' show KernelLoaderTask, KernelResult;
+import 'null_compiler_output.dart' show NullCompilerOutput;
 import 'options.dart' show CompilerOptions, DiagnosticOptions;
+import 'serialization/task.dart';
+import 'serialization/strategies.dart';
 import 'ssa/nodes.dart' show HInstruction;
-import 'types/abstract_value_domain.dart' show AbstractValueStrategy;
-import 'types/types.dart'
-    show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
 import 'universe/selector.dart' show Selector;
-import 'universe/world_builder.dart'
-    show ResolutionWorldBuilder, CodegenWorldBuilder;
+import 'universe/codegen_world_builder.dart';
+import 'universe/resolution_world_builder.dart';
 import 'universe/world_impact.dart'
     show ImpactStrategy, WorldImpact, WorldImpactBuilderImpl;
 import 'world.dart' show JClosedWorld, KClosedWorld;
@@ -65,10 +68,9 @@
   /// Options provided from command-line arguments.
   final CompilerOptions options;
 
-  /**
-   * If true, stop compilation after type inference is complete. Used for
-   * debugging and testing purposes only.
-   */
+  // These internal flags are used to stop compilation after a specific phase.
+  // Used only for debugging and testing purposes only.
+  bool stopAfterClosedWorld = false;
   bool stopAfterTypeInference = false;
 
   /// Output provider from user of Compiler API.
@@ -99,12 +101,12 @@
   Entity get currentElement => _reporter.currentElement;
 
   List<CompilerTask> tasks;
-  LibraryLoaderTask libraryLoader;
+  KernelLoaderTask kernelLoader;
   GlobalTypeInferenceTask globalInference;
   JavaScriptBackend backend;
   CodegenWorldBuilder _codegenWorldBuilder;
 
-  AbstractValueStrategy abstractValueStrategy = const TypeMaskStrategy();
+  AbstractValueStrategy abstractValueStrategy;
 
   GenericTask selfTask;
 
@@ -115,6 +117,7 @@
   EnqueueTask enqueuer;
   DeferredLoadTask deferredLoadTask;
   DumpInfoTask dumpInfoTask;
+  SerializationTask serializationTask;
 
   bool get hasCrashed => _reporter.hasCrashed;
 
@@ -142,6 +145,10 @@
       : this.options = options {
     options.deriveOptions();
     options.validate();
+
+    abstractValueStrategy = options.useTrivialAbstractValueDomain
+        ? const TrivialAbstractValueStrategy()
+        : const TypeMaskStrategy();
     CompilerTask kernelFrontEndTask;
     selfTask = new GenericTask('self', measurer);
     _outputProvider = new _CompilerOutput(this, outputProvider);
@@ -157,16 +164,16 @@
     _impactCache = <Entity, WorldImpact>{};
     _impactCacheDeleter = new _MapImpactCacheDeleter(_impactCache);
 
-    if (options.verbose) {
-      progress = new ProgressImpl(_reporter);
+    if (options.showInternalProgress) {
+      progress = new InteractiveProgress();
     }
 
     backend = createBackend();
     enqueuer = backend.makeEnqueuer();
 
     tasks = [
-      libraryLoader =
-          new LibraryLoaderTask(options, provider, reporter, measurer),
+      kernelLoader = new KernelLoaderTask(
+          options, provider, _outputProvider, reporter, measurer),
       kernelFrontEndTask,
       globalInference = new GlobalTypeInferenceTask(this),
       constants = backend.constantCompilerTask,
@@ -176,6 +183,7 @@
       enqueuer,
       dumpInfoTask = new DumpInfoTask(this),
       selfTask,
+      serializationTask = new SerializationTask(this, measurer),
     ];
 
     tasks.addAll(backend.tasks);
@@ -187,7 +195,6 @@
   JavaScriptBackend createBackend() {
     return new JavaScriptBackend(this,
         generateSourceMap: options.generateSourceMap,
-        useStartupEmitter: options.useStartupEmitter,
         useMultiSourceInfo: options.useMultiSourceInfo,
         useNewSourceInfo: options.useNewSourceInfo);
   }
@@ -210,7 +217,7 @@
   //
   // The resulting future will complete with true if the compilation
   // succeeded.
-  Future<bool> run(Uri uri) => selfTask.measureSubtask("Compiler.run", () {
+  Future<bool> run(Uri uri) => selfTask.measureSubtask("run", () {
         measurer.startWallClock();
 
         return new Future.sync(() => runInternal(uri))
@@ -222,30 +229,6 @@
         });
       });
 
-  /// This method is called when all new libraries loaded through
-  /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
-  /// have been computed.
-  ///
-  /// [loadedLibraries] contains the newly loaded libraries.
-  void processLoadedLibraries(LoadedLibraries loadedLibraries) {
-    frontendStrategy.registerLoadedLibraries(loadedLibraries);
-    loadedLibraries.forEachLibrary((Uri uri) {
-      LibraryEntity library =
-          frontendStrategy.elementEnvironment.lookupLibrary(uri);
-      backend.setAnnotations(library);
-    });
-
-    // TODO(efortuna, sigmund): These validation steps should be done in the
-    // front end for the Kernel path since Kernel doesn't have the notion of
-    // imports (everything has already been resolved). (See
-    // https://github.com/dart-lang/sdk/issues/29368)
-    if (loadedLibraries.containsLibrary(Uris.dart_mirrors)) {
-      reporter.reportWarningMessage(NO_LOCATION_SPANNABLE,
-          MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_CFE);
-    }
-    backend.onLibrariesLoaded(frontendStrategy.commonElements, loadedLibraries);
-  }
-
   Future runInternal(Uri uri) async {
     // TODO(ahe): This prevents memory leaks when invoking the compiler
     // multiple times. Implement a better mechanism where we can store
@@ -264,16 +247,39 @@
     assert(uri != null);
     // As far as I can tell, this branch is only used by test code.
     reporter.log('Compiling $uri (${options.buildId})');
-    LoadedLibraries loadedLibraries = await libraryLoader.loadLibraries(uri);
-    // Note: libraries may be null because of errors trying to find files or
-    // parse-time errors (when using `package:front_end` as a loader).
-    if (loadedLibraries == null) return;
-    if (compilationFailed && !options.generateCodeWithCompileTimeErrors) {
-      return;
+
+    if (options.readDataUri != null) {
+      GlobalTypeInferenceResults results =
+          await serializationTask.deserialize();
+      generateJavaScriptCode(results);
+    } else {
+      KernelResult result = await kernelLoader.load(uri);
+      reporter.log("Kernel load complete");
+      if (result == null) return;
+      if (compilationFailed && !options.generateCodeWithCompileTimeErrors) {
+        return;
+      }
+      if (options.cfeOnly) return;
+      _mainLibraryUri = result.rootLibraryUri;
+
+      frontendStrategy.registerLoadedLibraries(result);
+      for (Uri uri in result.libraries) {
+        LibraryEntity library =
+            frontendStrategy.elementEnvironment.lookupLibrary(uri);
+        backend.setAnnotations(library);
+      }
+
+      // TODO(efortuna, sigmund): These validation steps should be done in the
+      // front end for the Kernel path since Kernel doesn't have the notion of
+      // imports (everything has already been resolved). (See
+      // https://github.com/dart-lang/sdk/issues/29368)
+      if (result.libraries.contains(Uris.dart_mirrors)) {
+        reporter.reportWarningMessage(NO_LOCATION_SPANNABLE,
+            MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_WITH_CFE);
+      }
+
+      await compileFromKernel(result.rootLibraryUri, result.libraries);
     }
-    _mainLibraryUri = loadedLibraries.rootLibraryUri;
-    processLoadedLibraries(loadedLibraries);
-    compileLoadedLibraries(loadedLibraries);
   }
 
   /// Starts the resolution phase, creating the [ResolutionEnqueuer] if not
@@ -292,7 +298,7 @@
     return resolutionEnqueuer;
   }
 
-  JClosedWorld computeClosedWorld(LoadedLibraries loadedLibraries) {
+  JClosedWorld computeClosedWorld(Uri rootLibraryUri, Iterable<Uri> libraries) {
     ResolutionEnqueuer resolutionEnqueuer = startResolution();
     for (LibraryEntity library
         in frontendStrategy.elementEnvironment.libraries) {
@@ -310,14 +316,14 @@
     // compile-time constants that are metadata.  This means adding
     // something to the resolution queue.  So we cannot wait with
     // this until after the resolution queue is processed.
-    deferredLoadTask.beforeResolution(loadedLibraries);
+    deferredLoadTask.beforeResolution(rootLibraryUri, libraries);
     impactStrategy = backend.createImpactStrategy(
         supportDeferredLoad: deferredLoadTask.isProgramSplit,
         supportDumpInfo: options.dumpInfo);
 
     phase = PHASE_RESOLVING;
     resolutionEnqueuer.applyImpact(mainImpact);
-    reporter.log('Resolving...');
+    if (options.showInternalProgress) reporter.log('Resolving...');
 
     processQueue(
         frontendStrategy.elementEnvironment, resolutionEnqueuer, mainFunction,
@@ -350,7 +356,7 @@
   GlobalTypeInferenceResults performGlobalTypeInference(
       JClosedWorld closedWorld) {
     FunctionEntity mainFunction = closedWorld.elementEnvironment.mainFunction;
-    reporter.log('Inferring types...');
+    if (options.showInternalProgress) reporter.log('Inferring types...');
     InferredDataBuilder inferredDataBuilder =
         new InferredDataBuilderImpl(closedWorld.annotationsData);
     return globalInference.runGlobalTypeInference(
@@ -362,7 +368,7 @@
     JClosedWorld closedWorld = globalInferenceResults.closedWorld;
     backendStrategy.registerJClosedWorld(closedWorld);
     FunctionEntity mainFunction = closedWorld.elementEnvironment.mainFunction;
-    reporter.log('Compiling...');
+    if (options.showInternalProgress) reporter.log('Compiling...');
     phase = PHASE_COMPILING;
 
     Enqueuer codegenEnqueuer =
@@ -384,13 +390,32 @@
     checkQueue(codegenEnqueuer);
   }
 
-  /// Performs the compilation when all libraries have been loaded.
-  void compileLoadedLibraries(LoadedLibraries loadedLibraries) {
-    selfTask.measureSubtask("Compiler.compileLoadedLibraries", () {
-      JClosedWorld closedWorld = computeClosedWorld(loadedLibraries);
+  void compileFromKernel(Uri rootLibraryUri, Iterable<Uri> libraries) {
+    selfTask.measureSubtask("compileFromKernel", () {
+      JClosedWorld closedWorld = selfTask.measureSubtask("computeClosedWorld",
+          () => computeClosedWorld(rootLibraryUri, libraries));
+      if (stopAfterClosedWorld) return;
       if (closedWorld != null) {
         GlobalTypeInferenceResults globalInferenceResults =
             performGlobalTypeInference(closedWorld);
+        if (options.writeDataUri != null) {
+          serializationTask.serialize(globalInferenceResults);
+          return;
+        }
+        if (options.testMode) {
+          SerializationStrategy strategy =
+              const BytesInMemorySerializationStrategy();
+          List<int> irData =
+              strategy.serializeComponent(globalInferenceResults);
+          List worldData = strategy.serializeData(globalInferenceResults);
+          globalInferenceResults = strategy.deserializeData(
+              options,
+              reporter,
+              environment,
+              abstractValueStrategy,
+              strategy.deserializeComponent(irData),
+              worldData);
+        }
         if (stopAfterTypeInference) return;
         generateJavaScriptCode(globalInferenceResults);
       }
@@ -418,18 +443,16 @@
     return jClosedWorld;
   }
 
-  /**
-   * Empty the [enqueuer] queue.
-   */
+  /// Empty the [enqueuer] queue.
   void emptyQueue(Enqueuer enqueuer, {void onProgress(Enqueuer enqueuer)}) {
-    selfTask.measureSubtask("Compiler.emptyQueue", () {
+    selfTask.measureSubtask("emptyQueue", () {
       enqueuer.forEach((WorkItem work) {
         if (onProgress != null) {
           onProgress(enqueuer);
         }
         reporter.withCurrentElement(
             work.element,
-            () => selfTask.measureSubtask("world.applyImpact", () {
+            () => selfTask.measureSubtask("applyImpact", () {
                   enqueuer.applyImpact(
                       selfTask.measureSubtask("work.run", () => work.run()),
                       impactSource: work.element);
@@ -441,7 +464,7 @@
   void processQueue(ElementEnvironment elementEnvironment, Enqueuer enqueuer,
       FunctionEntity mainMethod,
       {void onProgress(Enqueuer enqueuer)}) {
-    selfTask.measureSubtask("Compiler.processQueue", () {
+    selfTask.measureSubtask("processQueue", () {
       enqueuer.open(
           impactStrategy,
           mainMethod,
@@ -625,11 +648,17 @@
         // Disable output in test mode: The build bot currently uses the time
         // stamp of the generated file to determine whether the output is
         // up-to-date.
-        return NullSink.outputProvider(name, extension, type);
+        return const NullCompilerOutput()
+            .createOutputSink(name, extension, type);
       }
     }
     return _userOutput.createOutputSink(name, extension, type);
   }
+
+  @override
+  api.BinaryOutputSink createBinarySink(Uri uri) {
+    return _userOutput.createBinarySink(uri);
+  }
 }
 
 /// Information about suppressed warnings and hints for a given library.
@@ -743,11 +772,9 @@
   @override
   bool get hasReportedError => compiler.compilationFailed;
 
-  /**
-   * Perform an operation, [f], returning the return value from [f].  If an
-   * error occurs then report it as having occurred during compilation of
-   * [element].  Can be nested.
-   */
+  /// Perform an operation, [f], returning the return value from [f].  If an
+  /// error occurs then report it as having occurred during compilation of
+  /// [element].  Can be nested.
   withCurrentElement(Entity element, f()) {
     Entity old = currentElement;
     _currentElement = element;
@@ -970,3 +997,33 @@
     _stopwatch.reset();
   }
 }
+
+/// Progress implementations that prints progress to the [DiagnosticReporter]
+/// with 500ms intervals using escape sequences to keep the progress data on a
+/// single line.
+class InteractiveProgress implements Progress {
+  final Stopwatch _stopwatchPhase = new Stopwatch()..start();
+  final Stopwatch _stopwatchInterval = new Stopwatch()..start();
+  void startPhase() {
+    print('');
+    _stopwatchPhase.reset();
+    _stopwatchInterval.reset();
+  }
+
+  void showProgress(String prefix, int count, String suffix) {
+    if (_stopwatchInterval.elapsedMilliseconds > 500) {
+      var time = _stopwatchPhase.elapsedMilliseconds / 1000;
+      var rate = count / _stopwatchPhase.elapsedMilliseconds;
+      var s = new StringBuffer('\x1b[1A\x1b[K') // go up and clear the line.
+        ..write('\x1b[48;5;40m\x1b[30m==>\x1b[0m $prefix')
+        ..write(count)
+        ..write('$suffix Elapsed time: ')
+        ..write(time.toStringAsFixed(2))
+        ..write(' s. Rate: ')
+        ..write(rate.toStringAsFixed(2))
+        ..write(' units/ms');
+      print('$s');
+      _stopwatchInterval.reset();
+    }
+  }
+}
diff --git a/pkg/compiler/lib/src/constant_system_dart.dart b/pkg/compiler/lib/src/constant_system_dart.dart
index 8d9fab5..1fc88a5 100644
--- a/pkg/compiler/lib/src/constant_system_dart.dart
+++ b/pkg/compiler/lib/src/constant_system_dart.dart
@@ -51,9 +51,7 @@
   }
 }
 
-/**
- * Operations that only work if both arguments are integers.
- */
+/// Operations that only work if both arguments are integers.
 abstract class BinaryBitOperation implements BinaryOperation {
   const BinaryBitOperation();
   ConstantValue fold(ConstantValue left, ConstantValue right) {
@@ -412,12 +410,10 @@
   }
 }
 
-/**
- * A constant system implementing the Dart semantics. This system relies on
- * the underlying runtime-system. That is, if dart2js is run in an environment
- * that doesn't correctly implement Dart's semantics this constant system will
- * not return the correct values.
- */
+/// A constant system implementing the Dart semantics. This system relies on
+/// the underlying runtime-system. That is, if dart2js is run in an environment
+/// that doesn't correctly implement Dart's semantics this constant system will
+/// not return the correct values.
 class DartConstantSystem extends ConstantSystem {
   final add = const AddOperation();
   final bitAnd = const BitAndOperation();
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index c543720..91d89f2 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -14,19 +14,17 @@
 }
 
 abstract class UnaryOperation extends Operation {
-  /** Returns [:null:] if it was unable to fold the operation. */
+  /// Returns [:null:] if it was unable to fold the operation.
   ConstantValue fold(ConstantValue constant);
 }
 
 abstract class BinaryOperation extends Operation {
-  /** Returns [:null:] if it was unable to fold the operation. */
+  /// Returns [:null:] if it was unable to fold the operation.
   ConstantValue fold(ConstantValue left, ConstantValue right);
   apply(left, right);
 }
 
-/**
- * A [ConstantSystem] is responsible for creating constants and folding them.
- */
+/// A [ConstantSystem] is responsible for creating constants and folding them.
 abstract class ConstantSystem {
   BinaryOperation get add;
   BinaryOperation get bitAnd;
@@ -75,15 +73,19 @@
   // system because an int is a double at runtime.
   bool isSubtype(DartTypes types, DartType s, DartType t);
 
-  /** Returns true if the [constant] is an integer at runtime. */
+  /// Returns true if the [constant] is an integer at runtime.
   bool isInt(ConstantValue constant);
-  /** Returns true if the [constant] is a double at runtime. */
+
+  /// Returns true if the [constant] is a double at runtime.
   bool isDouble(ConstantValue constant);
-  /** Returns true if the [constant] is a string at runtime. */
+
+  /// Returns true if the [constant] is a string at runtime.
   bool isString(ConstantValue constant);
-  /** Returns true if the [constant] is a boolean at runtime. */
+
+  /// Returns true if the [constant] is a boolean at runtime.
   bool isBool(ConstantValue constant);
-  /** Returns true if the [constant] is null at runtime. */
+
+  /// Returns true if the [constant] is null at runtime.
   bool isNull(ConstantValue constant);
 
   UnaryOperation lookupUnary(UnaryOperator operator) {
diff --git a/pkg/compiler/lib/src/constants/evaluation.dart b/pkg/compiler/lib/src/constants/evaluation.dart
index 9ed3440..ff9355f 100644
--- a/pkg/compiler/lib/src/constants/evaluation.dart
+++ b/pkg/compiler/lib/src/constants/evaluation.dart
@@ -59,6 +59,12 @@
 
   /// `true` if assertions are enabled.
   bool get enableAssertions;
+
+  /// If `true`, implicit casts should be checked.
+  ///
+  /// This is used to avoid circular dependencies between js-interop classes
+  /// and their metadata. For non-metadata constants we always check the casts.
+  bool get checkCasts;
 }
 
 abstract class EvaluationEnvironmentBase implements EvaluationEnvironment {
@@ -71,6 +77,8 @@
     _spannableStack = _spannableStack.prepend(spannable);
   }
 
+  bool get checkCasts => true;
+
   DiagnosticReporter get reporter;
 
   /// Returns the [Spannable] used for reporting errors and warnings.
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 79419e8..60a18ca 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -24,7 +24,6 @@
   CONCATENATE,
   CONDITIONAL,
   CONSTRUCTED,
-  DEFERRED,
   DOUBLE,
   ERRONEOUS,
   FUNCTION,
@@ -39,7 +38,6 @@
   STRING_FROM_ENVIRONMENT,
   STRING_LENGTH,
   SYMBOL,
-  SYNTHETIC,
   TYPE,
   UNARY,
   LOCAL_VARIABLE,
@@ -162,41 +160,6 @@
   bool _equals(ErroneousConstantExpression other) => true;
 }
 
-// TODO(johnniwinther): Avoid the need for this class.
-class SyntheticConstantExpression extends ConstantExpression {
-  final SyntheticConstantValue value;
-
-  SyntheticConstantExpression(this.value);
-
-  @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return value;
-  }
-
-  @override
-  void _createStructuredText(StringBuffer sb) {
-    sb.write('Synthetic(value=${value.toStructuredText()})');
-  }
-
-  @override
-  int _computeHashCode() => 13 * value.hashCode;
-
-  accept(ConstantExpressionVisitor visitor, [context]) {
-    throw "unsupported";
-  }
-
-  @override
-  bool _equals(SyntheticConstantExpression other) {
-    return value == other.value;
-  }
-
-  ConstantExpressionKind get kind => ConstantExpressionKind.SYNTHETIC;
-
-  @override
-  bool get isImplicit => false;
-}
-
 /// Boolean literal constant.
 class BoolConstantExpression extends ConstantExpression {
   final bool boolValue;
@@ -866,6 +829,8 @@
     ConstantValue expressionValue =
         expression.evaluate(environment, constantSystem);
 
+    if (!environment.checkCasts) return expressionValue;
+
     // The expression type is `int`.
     DartType expressionType =
         expressionValue.getType(environment.commonElements);
@@ -2112,55 +2077,6 @@
   }
 }
 
-/// A constant expression referenced with a deferred prefix.
-/// For example `lib.C`.
-class DeferredConstantExpression extends ConstantExpression {
-  final ConstantExpression expression;
-  final ImportEntity import;
-
-  DeferredConstantExpression(this.expression, this.import);
-
-  ConstantExpressionKind get kind => ConstantExpressionKind.DEFERRED;
-
-  @override
-  void _createStructuredText(StringBuffer sb) {
-    sb.write('Deferred(import=$import,expression=');
-    expression._createStructuredText(sb);
-    sb.write(')');
-  }
-
-  @override
-  ConstantValue evaluate(
-      EvaluationEnvironment environment, ConstantSystem constantSystem) {
-    return new DeferredConstantValue(
-        expression.evaluate(environment, constantSystem), import);
-  }
-
-  @override
-  int _computeHashCode() {
-    return 13 * expression.hashCode;
-  }
-
-  ConstantExpression apply(NormalizedArguments arguments) {
-    return new DeferredConstantExpression(expression.apply(arguments), import);
-  }
-
-  @override
-  bool _equals(DeferredConstantExpression other) {
-    return expression == other.expression;
-  }
-
-  @override
-  accept(ConstantExpressionVisitor visitor, [context]) {
-    return visitor.visitDeferred(this, context);
-  }
-
-  @override
-  bool get isPotential {
-    return expression.isPotential;
-  }
-}
-
 class InstantiationConstantExpression extends ConstantExpression {
   final List<DartType> typeArguments;
   final ConstantExpression expression;
@@ -2245,7 +2161,6 @@
       IntFromEnvironmentConstantExpression exp, A context);
   R visitStringFromEnvironment(
       StringFromEnvironmentConstantExpression exp, A context);
-  R visitDeferred(DeferredConstantExpression exp, A context);
   R visitAssert(AssertConstantExpression exp, A context);
   R visitInstantiation(InstantiationConstantExpression exp, A context);
 
@@ -2487,13 +2402,6 @@
   }
 
   @override
-  void visitDeferred(DeferredConstantExpression exp, context) {
-    sb.write(exp.import.name);
-    sb.write('.');
-    write(exp, exp.expression);
-  }
-
-  @override
   void visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp,
       [_]) {
     sb.write('const bool.fromEnvironment(');
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 48f4397..3d30d3b 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -24,7 +24,7 @@
   TYPE,
   INTERCEPTOR,
   SYNTHETIC,
-  DEFERRED,
+  INSTANTIATION,
   DEFERRED_GLOBAL,
   NON_CONSTANT,
 }
@@ -46,7 +46,6 @@
   R visitInterceptor(
       covariant InterceptorConstantValue constant, covariant A arg);
   R visitSynthetic(covariant SyntheticConstantValue constant, covariant A arg);
-  R visitDeferred(covariant DeferredConstantValue constant, covariant A arg);
   R visitDeferredGlobal(
       covariant DeferredGlobalConstantValue constant, covariant A arg);
   R visitNonConstant(covariant NonConstantValue constant, covariant A arg);
@@ -72,9 +71,11 @@
   bool get isMap => false;
   bool get isConstructedObject => false;
   bool get isFunction => false;
-  /** Returns true if the constant is null, a bool, a number or a string. */
+
+  /// Returns true if the constant is null, a bool, a number or a string.
   bool get isPrimitive => false;
-  /** Returns true if the constant is a list, a map or a constructed object. */
+
+  /// Returns true if the constant is a list, a map or a constructed object.
   bool get isObject => false;
   bool get isType => false;
   bool get isInterceptor => false;
@@ -171,7 +172,7 @@
 }
 
 class NullConstantValue extends PrimitiveConstantValue {
-  /** The value a Dart null is compiled to in JavaScript. */
+  /// The value a Dart null is compiled to in JavaScript.
   static const String JsNull = "null";
 
   const factory NullConstantValue() = NullConstantValue._internal;
@@ -676,6 +677,7 @@
         hashCode = Hashing.unorderedMapHash(fields, Hashing.objectHash(type)),
         super(type) {
     assert(type != null);
+    assert(!fields.containsKey(null));
     assert(!fields.containsValue(null));
   }
 
@@ -743,40 +745,6 @@
   }
 }
 
-/// A reference to a constant in another output unit.
-///
-/// Used for referring to deferred constants when evaluating constant values.
-class DeferredConstantValue extends ConstantValue {
-  DeferredConstantValue(this.referenced, this.import);
-
-  final ConstantValue referenced;
-  final ImportEntity import;
-
-  bool get isReference => true;
-
-  bool operator ==(other) {
-    return other is DeferredConstantValue &&
-        referenced == other.referenced &&
-        import == other.import;
-  }
-
-  int get hashCode => (referenced.hashCode * 17 + import.hashCode) & 0x3fffffff;
-
-  List<ConstantValue> getDependencies() => <ConstantValue>[referenced];
-
-  accept(ConstantValueVisitor visitor, arg) => visitor.visitDeferred(this, arg);
-
-  DartType getType(CommonElements types) => referenced.getType(types);
-
-  ConstantValueKind get kind => ConstantValueKind.DEFERRED;
-
-  String toDartText() => 'deferred(${referenced.toDartText()})';
-
-  String toStructuredText() {
-    return 'DeferredConstant(${referenced.toStructuredText()})';
-  }
-}
-
 class InstantiationConstantValue extends ConstantValue {
   final List<DartType> typeArguments;
   final FunctionConstantValue function;
@@ -805,7 +773,7 @@
     return type.instantiate(typeArguments);
   }
 
-  ConstantValueKind get kind => ConstantValueKind.DEFERRED;
+  ConstantValueKind get kind => ConstantValueKind.INSTANTIATION;
 
   String toDartText() =>
       '<${typeArguments.join(', ')}>(${function.toDartText()})';
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index c1db5c4..dbfe890 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -10,7 +10,6 @@
 import 'dart:isolate' show Isolate;
 
 import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
-import 'package:package_config/discovery.dart' show findPackages;
 
 import '../compiler_new.dart' as api;
 import 'commandline_options.dart';
@@ -21,24 +20,20 @@
 import 'util/uri_extras.dart';
 import 'util/util.dart' show stackTraceFilePrefix;
 
-const String LIBRARY_ROOT = '../../../../sdk';
+const String _defaultSpecificationUri = '../../../../sdk/lib/libraries.json';
 const String OUTPUT_LANGUAGE_DART = 'Dart';
 
-/**
- * A string to identify the revision or build.
- *
- * This ID is displayed if the compiler crashes and in verbose mode, and is
- * an aid in reproducing bug reports.
- *
- * The actual string is rewritten by a wrapper script when included in the sdk.
- */
+/// A string to identify the revision or build.
+///
+/// This ID is displayed if the compiler crashes and in verbose mode, and is
+/// an aid in reproducing bug reports.
+///
+/// The actual string is rewritten by a wrapper script when included in the sdk.
 String BUILD_ID = null;
 
-/**
- * The data passed to the [HandleOption] callback is either a single
- * string argument, or the arguments iterator for multiple arguments
- * handlers.
- */
+/// The data passed to the [HandleOption] callback is either a single
+/// string argument, or the arguments iterator for multiple arguments
+/// handlers.
 typedef void HandleOption(Null data);
 
 class OptionHandler {
@@ -53,12 +48,10 @@
   OptionHandler(this.pattern, this._handle, {this.multipleArguments: false});
 }
 
-/**
- * Extract the parameter of an option.
- *
- * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters
- * are ['fisk.js'] and ['hest.js'], respectively.
- */
+/// Extract the parameter of an option.
+///
+/// For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters
+/// are ['fisk.js'] and ['hest.js'], respectively.
 String extractParameter(String argument, {bool isOptionalArgument: false}) {
   // m[0] is the entire match (which will be equal to argument). m[1]
   // is something like "-o" or "--out=", and m[2] is the parameter.
@@ -110,10 +103,13 @@
     {fe.InitializedCompilerState kernelInitializedCompilerState}) {
   Stopwatch wallclock = new Stopwatch()..start();
   stackTraceFilePrefix = '$currentDirectory';
-  Uri libraryRoot = currentDirectory;
+  Uri librariesSpecificationUri =
+      currentDirectory.resolve('lib/libraries.json');
   bool outputSpecified = false;
-  Uri out = currentDirectory.resolve('out.js');
-  Uri sourceMapOut = currentDirectory.resolve('out.js.map');
+  Uri out;
+  Uri sourceMapOut;
+  Uri readDataUri;
+  Uri writeDataUri;
   List<String> bazelPaths;
   Uri packageConfig = null;
   Uri packageRoot = null;
@@ -133,6 +129,7 @@
   int optimizationLevel = null;
   Uri platformBinaries = fe.computePlatformBinariesLocation();
   Map<String, String> environment = new Map<String, String>();
+  CompilationStrategy compilationStrategy = CompilationStrategy.direct;
 
   void passThrough(String argument) => options.add(argument);
   void ignoreOption(String argument) {}
@@ -141,8 +138,9 @@
     passThrough("--build-id=$BUILD_ID");
   }
 
-  void setLibraryRoot(String argument) {
-    libraryRoot = currentDirectory.resolve(extractPath(argument));
+  void setLibrarySpecificationUri(String argument) {
+    librariesSpecificationUri =
+        currentDirectory.resolve(extractPath(argument, isDirectory: false));
   }
 
   void setPackageRoot(String argument) {
@@ -166,7 +164,6 @@
       path = extractParameter(arguments.current);
     }
     out = currentDirectory.resolve(nativeToUriPath(path));
-    sourceMapOut = Uri.parse('$out.map');
   }
 
   void setOptimizationLevel(String argument) {
@@ -215,7 +212,6 @@
 
   void setTrustTypeAnnotations(String argument) {
     trustTypeAnnotations = true;
-    passThrough(argument);
   }
 
   void setCheckedMode(String argument) {
@@ -232,17 +228,16 @@
 
   void setCategories(String argument) {
     List<String> categories = extractParameter(argument).split(',');
-    if (categories.contains('all')) {
-      categories = ["Client", "Server"];
+    bool isServerMode = categories.length == 1 && categories.single == "Server";
+    if (isServerMode) {
+      hints.add("The --categories flag is deprecated and will be deleted in a "
+          "future release, please use '${Flags.serverMode}' instead of "
+          "'--categories=Server'.");
+      passThrough(Flags.serverMode);
     } else {
-      for (String category in categories) {
-        if (!["Client", "Server"].contains(category)) {
-          fail('Unsupported library category "$category", '
-              'supported categories are: Client, Server, all');
-        }
-      }
+      hints.add(
+          "The --categories flag is deprecated, see the usage for details.");
     }
-    passThrough('--categories=${categories.join(",")}');
   }
 
   void setPlatformBinaries(String argument) {
@@ -250,6 +245,32 @@
         currentDirectory.resolve(extractPath(argument, isDirectory: true));
   }
 
+  void setReadData(String argument) {
+    if (compilationStrategy == CompilationStrategy.toData) {
+      fail("Cannot read and write serialized simultaneously.");
+    }
+    if (argument != Flags.readData) {
+      readDataUri = currentDirectory
+          .resolve(nativeToUriPath(extractPath(argument, isDirectory: false)));
+    }
+    compilationStrategy = CompilationStrategy.fromData;
+  }
+
+  void setCfeOnly(String argument) {
+    compilationStrategy = CompilationStrategy.toKernel;
+  }
+
+  void setWriteData(String argument) {
+    if (compilationStrategy == CompilationStrategy.fromData) {
+      fail("Cannot read and write serialized simultaneously.");
+    }
+    if (argument != Flags.writeData) {
+      writeDataUri = currentDirectory
+          .resolve(nativeToUriPath(extractPath(argument, isDirectory: false)));
+    }
+    compilationStrategy = CompilationStrategy.toData;
+  }
+
   void handleThrowOnError(String argument) {
     throwOnError = true;
     String parameter = extractParameter(argument, isOptionalArgument: true);
@@ -303,17 +324,21 @@
     new OptionHandler(Flags.platformBinaries, setPlatformBinaries),
     new OptionHandler(Flags.noFrequencyBasedMinification, passThrough),
     new OptionHandler(Flags.verbose, setVerbose),
+    new OptionHandler(Flags.progress, passThrough),
     new OptionHandler(Flags.version, (_) => wantVersion = true),
-    new OptionHandler('--library-root=.+', setLibraryRoot),
+    new OptionHandler('--library-root=.+', ignoreOption),
+    new OptionHandler('--libraries-spec=.+', setLibrarySpecificationUri),
+    new OptionHandler('${Flags.readData}|${Flags.readData}=.+', setReadData),
+    new OptionHandler('${Flags.writeData}|${Flags.writeData}=.+', setWriteData),
+    new OptionHandler(Flags.cfeOnly, setCfeOnly),
     new OptionHandler('--out=.+|-o.*', setOutput, multipleArguments: true),
     new OptionHandler('-O.*', setOptimizationLevel),
     new OptionHandler(Flags.allowMockCompilation, ignoreOption),
-    new OptionHandler(Flags.fastStartup, passThrough),
+    new OptionHandler(Flags.fastStartup, ignoreOption),
     new OptionHandler(Flags.genericMethodSyntax, ignoreOption),
-    new OptionHandler(Flags.syncAsync, ignoreOption),
-    new OptionHandler(Flags.noSyncAsync, passThrough),
     new OptionHandler(Flags.initializingFormalAccess, ignoreOption),
     new OptionHandler(Flags.minify, passThrough),
+    new OptionHandler(Flags.noMinify, passThrough),
     new OptionHandler(Flags.preserveUris, ignoreOption),
     new OptionHandler('--force-strip=.*', setStrip),
     new OptionHandler(Flags.disableDiagnosticColors, (_) {
@@ -337,15 +362,20 @@
     new OptionHandler(Flags.resolveOnly, ignoreOption),
     new OptionHandler(Flags.disableNativeLiveTypeAnalysis, passThrough),
     new OptionHandler('--categories=.*', setCategories),
+    new OptionHandler(Flags.serverMode, passThrough),
     new OptionHandler(Flags.disableInlining, passThrough),
     new OptionHandler(Flags.disableProgramSplit, passThrough),
     new OptionHandler(Flags.disableTypeInference, passThrough),
+    new OptionHandler(Flags.useTrivialAbstractValueDomain, passThrough),
     new OptionHandler(Flags.disableRtiOptimization, passThrough),
     new OptionHandler(Flags.terse, passThrough),
     new OptionHandler('--deferred-map=.+', passThrough),
+    new OptionHandler(Flags.newDeferredSplit, passThrough),
+    new OptionHandler(Flags.reportInvalidInferredDeferredTypes, passThrough),
     new OptionHandler(Flags.dumpInfo, passThrough),
     new OptionHandler('--disallow-unsafe-eval', ignoreOption),
     new OptionHandler(Option.showPackageWarnings, passThrough),
+    new OptionHandler(Option.enableLanguageExperiments, passThrough),
     new OptionHandler(Flags.useContentSecurityPolicy, passThrough),
     new OptionHandler(Flags.enableExperimentalMirrors, passThrough),
     new OptionHandler(Flags.enableAssertMessage, passThrough),
@@ -378,6 +408,9 @@
     new OptionHandler("${Flags.experimentalAllocationsPath}=.+", passThrough),
 
     new OptionHandler(Flags.experimentLocalNames, passThrough),
+    new OptionHandler(Flags.experimentStartupFunctions, passThrough),
+    new OptionHandler(Flags.experimentToBoolean, passThrough),
+    new OptionHandler(Flags.experimentCallInstrumentation, passThrough),
 
     // The following three options must come last.
     new OptionHandler('-D.+=.*', addInEnvironment),
@@ -455,8 +488,30 @@
     helpAndFail("Cannot specify both '--package-root' and '--packages.");
   }
 
+  String scriptName = arguments[0];
+
+  switch (compilationStrategy) {
+    case CompilationStrategy.direct:
+      out ??= currentDirectory.resolve('out.js');
+      break;
+    case CompilationStrategy.toKernel:
+      out ??= currentDirectory.resolve('out.dill');
+      options.add(Flags.cfeOnly);
+      break;
+    case CompilationStrategy.toData:
+      out ??= currentDirectory.resolve('out.dill');
+      writeDataUri ??= currentDirectory.resolve('$out.data');
+      options.add('${Flags.writeData}=${writeDataUri}');
+      break;
+    case CompilationStrategy.fromData:
+      out ??= currentDirectory.resolve('out.js');
+      readDataUri ??= currentDirectory.resolve('$scriptName.data');
+      options.add('${Flags.readData}=${readDataUri}');
+      break;
+  }
   options.add('--out=$out');
-  options.add('--source-map=$sourceMapOut');
+  sourceMapOut = Uri.parse('$out.map');
+  options.add('--source-map=${sourceMapOut}');
 
   RandomAccessFileOutputProvider outputProvider =
       new RandomAccessFileOutputProvider(out, sourceMapOut,
@@ -468,45 +523,101 @@
     }
     writeString(
         Uri.parse('$out.deps'), getDepsOutput(inputProvider.getSourceUris()));
-    int dartCharactersRead = inputProvider.dartCharactersRead;
-    int jsCharactersWritten = outputProvider.totalCharactersWrittenJavaScript;
-    int jsCharactersPrimary = outputProvider.totalCharactersWrittenPrimary;
+    switch (compilationStrategy) {
+      case CompilationStrategy.direct:
+        int dartCharactersRead = inputProvider.dartCharactersRead;
+        int jsCharactersWritten =
+            outputProvider.totalCharactersWrittenJavaScript;
+        int jsCharactersPrimary = outputProvider.totalCharactersWrittenPrimary;
+        print('Compiled '
+            '${_formatCharacterCount(dartCharactersRead)} characters Dart to '
+            '${_formatCharacterCount(jsCharactersWritten)} characters '
+            'JavaScript in '
+            '${_formatDurationAsSeconds(wallclock.elapsed)} seconds');
 
-    print('Compiled '
-        '${_formatCharacterCount(dartCharactersRead)} characters Dart'
-        ' to '
-        '${_formatCharacterCount(jsCharactersWritten)} characters JavaScript'
-        ' in '
-        '${_formatDurationAsSeconds(wallclock.elapsed)} seconds');
+        diagnosticHandler
+            .info('${_formatCharacterCount(jsCharactersPrimary)} characters '
+                'JavaScript in '
+                '${relativize(currentDirectory, out, Platform.isWindows)}');
+        if (outputSpecified || diagnosticHandler.verbose) {
+          String input = uriPathToNative(scriptName);
+          String output = relativize(currentDirectory, out, Platform.isWindows);
+          print('Dart file ($input) compiled to JavaScript: $output');
+          if (diagnosticHandler.verbose) {
+            var files = outputProvider.allOutputFiles;
+            int jsCount = files.where((f) => f.endsWith('.js')).length;
+            print('Emitted file $jsCount JavaScript files.');
+          }
+        }
+        break;
+      case CompilationStrategy.toKernel:
+        int dartCharactersRead = inputProvider.dartCharactersRead;
+        int dataBytesWritten = outputProvider.totalDataWritten;
+        print('Compiled '
+            '${_formatCharacterCount(dartCharactersRead)} characters Dart to '
+            '${_formatCharacterCount(dataBytesWritten)} kernel bytes in '
+            '${_formatDurationAsSeconds(wallclock.elapsed)} seconds');
+        String input = uriPathToNative(scriptName);
+        String dillOutput =
+            relativize(currentDirectory, out, Platform.isWindows);
+        print('Dart file ($input) compiled to ${dillOutput}.');
+        break;
+      case CompilationStrategy.toData:
+        int dartCharactersRead = inputProvider.dartCharactersRead;
+        int dataBytesWritten = outputProvider.totalDataWritten;
+        print('Serialized '
+            '${_formatCharacterCount(dartCharactersRead)} characters Dart to '
+            '${_formatCharacterCount(dataBytesWritten)} bytes data in '
+            '${_formatDurationAsSeconds(wallclock.elapsed)} seconds');
+        String input = uriPathToNative(scriptName);
+        String dillOutput =
+            relativize(currentDirectory, out, Platform.isWindows);
+        String dataOutput =
+            relativize(currentDirectory, writeDataUri, Platform.isWindows);
+        print('Dart file ($input) serialized to '
+            '${dillOutput} and ${dataOutput}.');
+        break;
+      case CompilationStrategy.fromData:
+        int dataCharactersRead = inputProvider.dartCharactersRead;
+        int jsCharactersWritten =
+            outputProvider.totalCharactersWrittenJavaScript;
+        int jsCharactersPrimary = outputProvider.totalCharactersWrittenPrimary;
+        print('Compiled '
+            '${_formatCharacterCount(dataCharactersRead)} bytes data to '
+            '${_formatCharacterCount(jsCharactersWritten)} characters '
+            'JavaScript in '
+            '${_formatDurationAsSeconds(wallclock.elapsed)} seconds');
 
-    diagnosticHandler.info(
-        '${_formatCharacterCount(jsCharactersPrimary)} characters JavaScript'
-        ' in '
-        '${relativize(currentDirectory, out, Platform.isWindows)}');
-    if (diagnosticHandler.verbose) {
-      String input = uriPathToNative(arguments[0]);
-      print('Dart file ($input) compiled to JavaScript.');
-      print('Wrote the following files:');
-      for (String filename in outputProvider.allOutputFiles) {
-        print("  $filename");
-      }
-    } else if (outputSpecified) {
-      String input = uriPathToNative(arguments[0]);
-      String output = relativize(currentDirectory, out, Platform.isWindows);
-      print('Dart file ($input) compiled to JavaScript: $output');
+        diagnosticHandler
+            .info('${_formatCharacterCount(jsCharactersPrimary)} characters '
+                'JavaScript in '
+                '${relativize(currentDirectory, out, Platform.isWindows)}');
+        if (outputSpecified || diagnosticHandler.verbose) {
+          String input = uriPathToNative(scriptName);
+          String output = relativize(currentDirectory, out, Platform.isWindows);
+          print('Dart file ($input) compiled to JavaScript: $output');
+          if (diagnosticHandler.verbose) {
+            var files = outputProvider.allOutputFiles;
+            int jsCount = files.where((f) => f.endsWith('.js')).length;
+            print('Emitted file $jsCount JavaScript files.');
+          }
+        }
+        break;
     }
+
     return result;
   }
 
-  Uri script = currentDirectory.resolve(arguments[0]);
+  Uri script = currentDirectory.resolve(scriptName);
+
   diagnosticHandler.autoReadFileUri = true;
   CompilerOptions compilerOptions = CompilerOptions.parse(options,
-      libraryRoot: libraryRoot, platformBinaries: platformBinaries)
+      librariesSpecificationUri: librariesSpecificationUri,
+      platformBinaries: platformBinaries)
     ..entryPoint = script
     ..packageRoot = packageRoot
     ..packageConfig = packageConfig
     ..environment = environment
-    ..packagesDiscoveryProvider = findPackages
     ..kernelInitializedCompilerState = kernelInitializedCompilerState
     ..optimizationLevel = optimizationLevel;
   return compileFunc(
@@ -563,13 +674,15 @@
 
 Future<api.CompilationResult> compilerMain(List<String> arguments,
     {fe.InitializedCompilerState kernelInitializedCompilerState}) async {
-  Uri script = Platform.script;
-  if (script.isScheme("package")) {
-    script = await Isolate.resolvePackageUri(script);
+  if (!arguments.any((a) => a.startsWith('--libraries-spec='))) {
+    Uri script = Platform.script;
+    if (script.isScheme("package")) {
+      script = await Isolate.resolvePackageUri(script);
+    }
+    Uri librariesJson = script.resolve(_defaultSpecificationUri);
+    arguments = <String>['--libraries-spec=${librariesJson.toFilePath()}']
+      ..addAll(arguments);
   }
-  Uri libraryRoot = script.resolve(LIBRARY_ROOT);
-  arguments = <String>['--library-root=${libraryRoot.toFilePath()}']
-    ..addAll(arguments);
   return compile(arguments,
       kernelInitializedCompilerState: kernelInitializedCompilerState);
 }
@@ -620,7 +733,7 @@
 
   --packages=<path>
     Path to the package resolution configuration file, which supplies a mapping
-    of package names to paths.  This option cannot be used with --package-root.
+    of package names to paths.
 
   --suppress-warnings
     Do not display any warnings.
@@ -648,10 +761,6 @@
   --no-source-maps
     Do not generate a source map file.
 
-  --fast-startup
-    Produce JavaScript that can be parsed more quickly by VMs. This option
-    usually results in larger JavaScript files with faster startup.
-
   -O<0,1,2,3,4>
     Controls optimizations that can help reduce code-size and improve
     performance of the generated code for deployment.
@@ -741,8 +850,8 @@
   --throw-on-error
     Throw an exception if a compile-time error is detected.
 
-  --library-root=<directory>
-    Where to find the Dart platform libraries.
+  --libraries-spec=<file>
+    A .json file containing the libraries specification for dart2js.
 
   --allow-mock-compilation
     Do not generate a call to main if either of the following
@@ -752,11 +861,14 @@
     Disable the optimization that removes unused native types from dart:html
     and related libraries.
 
+  --server-mode
+    Compile with server support. The compiler will use a library specification
+    that disables dart:html but supports dart:js in conditional imports.
+
   --categories=<categories>
-    A comma separated list of allowed library categories.  The default
-    is "Client".  Possible categories can be seen by providing an
-    unsupported category, for example, --categories=help.  To enable
-    all categories, use --categories=all.
+    (deprecated)
+    Use '--server-mode' instead of '--categories=Server'. All other category
+    values have no effect on the compiler behavior.
 
   --deferred-map=<file>
     Generates a json file with a mapping from each deferred import to a list of
@@ -908,3 +1020,5 @@
     });
   });
 }
+
+enum CompilationStrategy { direct, toKernel, toData, fromData }
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 7243452..d2fd134 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -8,21 +8,20 @@
 
 import 'common/tasks.dart' show CompilerTask;
 import 'common.dart';
-import 'common_elements.dart' show KElementEnvironment;
+import 'common_elements.dart' show ElementEnvironment, KElementEnvironment;
 import 'compiler.dart' show Compiler;
 import 'constants/values.dart'
     show
         ConstantValue,
         ConstructedConstantValue,
-        DeferredConstantValue,
         TypeConstantValue,
         DeferredGlobalConstantValue,
         InstantiationConstantValue;
 import 'elements/types.dart';
 import 'elements/entities.dart';
 import 'kernel/kelements.dart' show KLocalFunction;
-import 'library_loader.dart';
 import 'serialization/serialization.dart';
+import 'options.dart';
 import 'universe/use.dart';
 import 'universe/world_impact.dart'
     show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
@@ -99,16 +98,6 @@
 
   static const ImpactUseCase IMPACT_USE = const ImpactUseCase('Deferred load');
 
-  /// A mapping from the name of a defer import to all the output units it
-  /// depends on in a list of lists to be loaded in the order they appear.
-  ///
-  /// For example {"lib1": [[lib1_lib2_lib3], [lib1_lib2, lib1_lib3],
-  /// [lib1]]} would mean that in order to load "lib1" first the hunk
-  /// lib1_lib2_lib2 should be loaded, then the hunks lib1_lib2 and lib1_lib3
-  /// can be loaded in parallel. And finally lib1 can be loaded.
-  final Map<String, List<OutputUnit>> hunksToLoad =
-      new Map<String, List<OutputUnit>>();
-
   /// A cache of the result of calling `computeImportDeferName` on the keys of
   /// this map.
   final Map<ImportEntity, String> _importDeferName = <ImportEntity, String>{};
@@ -127,7 +116,7 @@
   Map<ConstantValue, ImportSet> _constantToSet =
       new Map<ConstantValue, ImportSet>();
 
-  Iterable<ImportEntity> get allDeferredImports =>
+  Iterable<ImportEntity> get _allDeferredImports =>
       _deferredImportDescriptions.keys;
 
   /// Because the token-stream is forgotten later in the program, we cache a
@@ -141,6 +130,9 @@
   final Compiler compiler;
 
   bool get disableProgramSplit => compiler.options.disableProgramSplit;
+  bool get newDeferredSplit => compiler.options.newDeferredSplit;
+  bool get reportInvalidInferredDeferredTypes =>
+      compiler.options.reportInvalidInferredDeferredTypes;
 
   DeferredLoadTask(this.compiler) : super(compiler.measurer) {
     _mainOutputUnit = new OutputUnit(true, 'main', new Set<ImportEntity>());
@@ -152,29 +144,6 @@
       compiler.frontendStrategy.elementEnvironment;
   DiagnosticReporter get reporter => compiler.reporter;
 
-  /// Returns the unique name for the given deferred [import].
-  String getImportDeferName(Spannable node, ImportEntity import) {
-    String name = _importDeferName[import];
-    if (name == null) {
-      reporter.internalError(node, "No deferred name for $import.");
-    }
-    return name;
-  }
-
-  /// Returns the names associated with each deferred import in [unit].
-  Iterable<String> getImportNames(OutputUnit unit) {
-    return unit._imports.map((i) => _importDeferName[i]);
-  }
-
-  void registerConstantDeferredUse(
-      DeferredConstantValue constant, ImportEntity import) {
-    if (!isProgramSplit || disableProgramSplit) return;
-    var newSet = importSets.singleton(import);
-    assert(
-        _constantToSet[constant] == null || _constantToSet[constant] == newSet);
-    _constantToSet[constant] = newSet;
-  }
-
   /// Given [imports] that refer to an element from a library, determine whether
   /// the element is explicitly deferred.
   static bool _isExplicitlyDeferred(Iterable<ImportEntity> imports) {
@@ -227,7 +196,7 @@
     void addLiveInstanceMember(MemberEntity member) {
       if (!compiler.resolutionWorldBuilder.isMemberUsed(member)) return;
       if (!member.isInstanceMember) return;
-      dependencies.members.add(member);
+      dependencies.addMember(member);
       _collectDirectMemberDependencies(member, dependencies);
     }
 
@@ -236,7 +205,7 @@
     elementEnvironment.forEachSupertype(cls, (InterfaceType type) {
       _collectTypeDependencies(type, dependencies);
     });
-    dependencies.classes.add(cls);
+    dependencies.addClass(cls);
   }
 
   /// Finds all elements and constants that [element] depends directly on.
@@ -250,7 +219,7 @@
           elementEnvironment.getFunctionType(element), dependencies);
     }
     if (element.isStatic || element.isTopLevel || element.isConstructor) {
-      dependencies.members.add(element);
+      dependencies.addMember(element);
       _collectDirectMemberDependencies(element, dependencies);
     }
     if (element is ConstructorEntity && element.isGenerativeConstructor) {
@@ -277,21 +246,26 @@
 
   /// Recursively collects all the dependencies of [type].
   void _collectTypeDependencies(DartType type, Dependencies dependencies) {
-    // TODO(het): we would like to separate out types that are only needed for
-    // rti from types that are needed for their members.
     if (type is FunctionType) {
       _collectFunctionTypeDependencies(type, dependencies);
     } else if (type is TypedefType) {
-      type.typeArguments
-          .forEach((t) => _collectTypeDependencies(t, dependencies));
+      _collectTypeArgumentDependencies(type.typeArguments, dependencies);
       _collectTypeDependencies(type.unaliased, dependencies);
     } else if (type is InterfaceType) {
-      type.typeArguments
-          .forEach((t) => _collectTypeDependencies(t, dependencies));
-      dependencies.classes.add(type.element);
+      _collectTypeArgumentDependencies(type.typeArguments, dependencies);
+      // TODO(sigmund): when we are able to split classes from types in our
+      // runtime-type representation, this should track type.element as a type
+      // dependency instead.
+      dependencies.addClass(type.element);
     }
   }
 
+  void _collectTypeArgumentDependencies(
+      Iterable<DartType> typeArguments, Dependencies dependencies) {
+    if (typeArguments == null) return;
+    typeArguments.forEach((t) => _collectTypeDependencies(t, dependencies));
+  }
+
   void _collectFunctionTypeDependencies(
       FunctionType type, Dependencies dependencies) {
     for (FunctionTypeVariable typeVariable in type.typeVariables) {
@@ -319,7 +293,7 @@
         new WorldImpactVisitorImpl(visitStaticUse: (StaticUse staticUse) {
           Entity usedEntity = staticUse.element;
           if (usedEntity is MemberEntity) {
-            dependencies.members.add(usedEntity);
+            dependencies.addMember(usedEntity, staticUse.deferredImport);
           } else {
             assert(usedEntity is KLocalFunction,
                 failedAt(usedEntity, "Unexpected static use $staticUse."));
@@ -332,19 +306,23 @@
           switch (staticUse.kind) {
             case StaticUseKind.CONSTRUCTOR_INVOKE:
             case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
-              _collectTypeDependencies(staticUse.type, dependencies);
+              // The receiver type of generative constructors is a dependency of
+              // the constructor (handled by `addMember` above) and not a
+              // dependency at the call site.
+              // Factory methods, on the other hand, are like static methods so
+              // the target type is not relevant.
+              // TODO(johnniwinther): Use rti need data to skip unneeded type
+              // arguments.
+              _collectTypeArgumentDependencies(
+                  staticUse.type.typeArguments, dependencies);
               break;
             case StaticUseKind.INVOKE:
             case StaticUseKind.CLOSURE_CALL:
             case StaticUseKind.DIRECT_INVOKE:
               // TODO(johnniwinther): Use rti need data to skip unneeded type
               // arguments.
-              List<DartType> typeArguments = staticUse.typeArguments;
-              if (typeArguments != null) {
-                for (DartType typeArgument in typeArguments) {
-                  _collectTypeDependencies(typeArgument, dependencies);
-                }
-              }
+              _collectTypeArgumentDependencies(
+                  staticUse.typeArguments, dependencies);
               break;
             default:
           }
@@ -354,7 +332,8 @@
             case TypeUseKind.TYPE_LITERAL:
               if (type.isInterfaceType) {
                 InterfaceType interface = type;
-                dependencies.classes.add(interface.element);
+                dependencies.addClass(
+                    interface.element, typeUse.deferredImport);
               }
               break;
             case TypeUseKind.INSTANTIATION:
@@ -386,12 +365,8 @@
         }, visitDynamicUse: (DynamicUse dynamicUse) {
           // TODO(johnniwinther): Use rti need data to skip unneeded type
           // arguments.
-          List<DartType> typeArguments = dynamicUse.typeArguments;
-          if (typeArguments != null) {
-            for (DartType typeArgument in typeArguments) {
-              _collectTypeDependencies(typeArgument, dependencies);
-            }
-          }
+          _collectTypeArgumentDependencies(
+              dynamicUse.typeArguments, dependencies);
         }),
         DeferredLoadTask.IMPACT_USE);
   }
@@ -462,7 +437,8 @@
       Dependencies dependencies = new Dependencies();
       _collectAllElementsAndConstantsResolvedFromClass(element, dependencies);
       LibraryEntity library = element.library;
-      _processDependencies(library, dependencies, oldSet, newSet, queue);
+      _processDependencies(
+          library, dependencies, oldSet, newSet, queue, element);
     } else {
       queue.addClass(element, newSet);
     }
@@ -489,7 +465,8 @@
       _collectAllElementsAndConstantsResolvedFromMember(element, dependencies);
 
       LibraryEntity library = element.library;
-      _processDependencies(library, dependencies, oldSet, newSet, queue);
+      _processDependencies(
+          library, dependencies, oldSet, newSet, queue, element);
     } else {
       queue.addMember(element, newSet);
     }
@@ -521,70 +498,111 @@
   /// same nodes we have already seen.
   _shouldAddDeferredDependency(ImportSet newSet) => newSet.length <= 1;
 
+  void _fixDependencyInfo(DependencyInfo info, List<ImportEntity> imports,
+      String prefix, String name, Spannable context) {
+    var isDeferred = _isExplicitlyDeferred(imports);
+    if (isDeferred) {
+      if (!newDeferredSplit) {
+        info.isDeferred = true;
+        info.imports = imports;
+      }
+      if (reportInvalidInferredDeferredTypes) {
+        reporter.reportErrorMessage(context, MessageKind.GENERIC, {
+          'text': "$prefix '$name' is deferred but appears to be inferred as"
+              " a return type or a type parameter (dartbug.com/35311)."
+        });
+      }
+    }
+  }
+
+  // The following 3 methods are used to check whether the new deferred split
+  // algorithm and the old one match. Because of a soundness bug in the old
+  // algorithm the new algorithm can pull in a lot of code to the main output
+  // unit. This logic detects it and will make it easier for us to migrate code
+  // off it incrementally.
+  // Note: we only expect discrepancies on class-dependency-info due to how
+  // inferred types expose deferred types in type-variables and return types
+  // (Issue #35311). We added the other two methods to test our transition, but
+  // we don't expect to detect any mismatches there.
+  //
+  // TODO(sigmund): delete once the new implementation is on by default.
+  void _fixClassDependencyInfo(DependencyInfo info, ClassEntity cls,
+      LibraryEntity library, Spannable context) {
+    if (info.isDeferred) return;
+    if (newDeferredSplit && !reportInvalidInferredDeferredTypes) return;
+    var imports = classImportsTo(cls, library);
+    _fixDependencyInfo(info, imports, "Class", cls.name, context);
+  }
+
+  void _fixMemberDependencyInfo(DependencyInfo info, MemberEntity member,
+      LibraryEntity library, Spannable context) {
+    if (info.isDeferred || compiler.options.newDeferredSplit) return;
+    var imports = memberImportsTo(member, library);
+    _fixDependencyInfo(info, imports, "Member", member.name, context);
+  }
+
+  void _fixConstantDependencyInfo(DependencyInfo info, ConstantValue constant,
+      LibraryEntity library, Spannable context) {
+    if (info.isDeferred || compiler.options.newDeferredSplit) return;
+    if (constant is TypeConstantValue) {
+      var type = constant.representedType;
+      if (type is InterfaceType) {
+        var imports = classImportsTo(type.element, library);
+        _fixDependencyInfo(
+            info, imports, "Class (in constant) ", type.element.name, context);
+      } else if (type is TypedefType) {
+        var imports = typedefImportsTo(type.element, library);
+        _fixDependencyInfo(
+            info, imports, "Typedef ", type.element.name, context);
+      }
+    }
+  }
+
   void _processDependencies(LibraryEntity library, Dependencies dependencies,
-      ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
-    for (ClassEntity cls in dependencies.classes) {
-      Iterable<ImportEntity> imports = classImportsTo(cls, library);
-      if (_isExplicitlyDeferred(imports)) {
+      ImportSet oldSet, ImportSet newSet, WorkQueue queue, Spannable context) {
+    dependencies.classes.forEach((ClassEntity cls, DependencyInfo info) {
+      _fixClassDependencyInfo(info, cls, library, context);
+      if (info.isDeferred) {
         if (_shouldAddDeferredDependency(newSet)) {
-          for (ImportEntity deferredImport in imports) {
+          for (ImportEntity deferredImport in info.imports) {
             queue.addClass(cls, importSets.singleton(deferredImport));
           }
         }
       } else {
         _updateClassRecursive(cls, oldSet, newSet, queue);
       }
-    }
+    });
 
-    for (MemberEntity member in dependencies.members) {
-      Iterable<ImportEntity> imports = memberImportsTo(member, library);
-      if (_isExplicitlyDeferred(imports)) {
+    dependencies.members.forEach((MemberEntity member, DependencyInfo info) {
+      _fixMemberDependencyInfo(info, member, library, context);
+      if (info.isDeferred) {
         if (_shouldAddDeferredDependency(newSet)) {
-          for (ImportEntity deferredImport in imports) {
+          for (ImportEntity deferredImport in info.imports) {
             queue.addMember(member, importSets.singleton(deferredImport));
           }
         }
       } else {
         _updateMemberRecursive(member, oldSet, newSet, queue);
       }
-    }
+    });
 
     for (Local localFunction in dependencies.localFunctions) {
       _updateLocalFunction(localFunction, oldSet, newSet);
     }
 
-    for (ConstantValue dependency in dependencies.constants) {
-      // TODO(sigmund): either delete DeferredConstantValue or use it to
-      // represent deferred TypeConstantValues below.
-      if (dependency is DeferredConstantValue) {
+    dependencies.constants
+        .forEach((ConstantValue constant, DependencyInfo info) {
+      _fixConstantDependencyInfo(info, constant, library, context);
+      if (info.isDeferred) {
         if (_shouldAddDeferredDependency(newSet)) {
-          queue.addConstant(
-              dependency, importSets.singleton(dependency.import));
-        }
-        continue;
-      }
-
-      if (dependency is TypeConstantValue) {
-        var type = dependency.representedType;
-        var imports = const <ImportEntity>[];
-        if (type is InterfaceType) {
-          imports = classImportsTo(type.element, library);
-        } else if (type is TypedefType) {
-          imports = typedefImportsTo(type.element, library);
-        }
-        if (_isExplicitlyDeferred(imports)) {
-          if (_shouldAddDeferredDependency(newSet)) {
-            for (ImportEntity deferredImport in imports) {
-              queue.addConstant(
-                  dependency, importSets.singleton(deferredImport));
-            }
+          for (ImportEntity deferredImport in info.imports) {
+            queue.addConstant(constant, importSets.singleton(deferredImport));
           }
-          continue;
         }
+      } else {
+        _updateConstantRecursive(constant, oldSet, newSet, queue);
       }
-
-      _updateConstantRecursive(dependency, oldSet, newSet, queue);
-    }
+    });
   }
 
   /// Adds extra dependencies coming from mirror usage.
@@ -618,10 +636,11 @@
     _allOutputUnits.sort();
   }
 
-  void _setupHunksToLoad() {
+  Map<String, List<OutputUnit>> _setupHunksToLoad() {
+    Map<String, List<OutputUnit>> hunksToLoad = {};
     Set<String> usedImportNames = new Set<String>();
 
-    for (ImportEntity import in allDeferredImports) {
+    for (ImportEntity import in _allDeferredImports) {
       String result = computeImportDeferName(import, compiler);
       assert(result != null);
       // Note: tools that process the json file to build multi-part initial load
@@ -645,7 +664,7 @@
     List<OutputUnit> sortedOutputUnits = _allOutputUnits.reversed.toList();
 
     // For each deferred import we find out which outputUnits to load.
-    for (ImportEntity import in allDeferredImports) {
+    for (ImportEntity import in _allDeferredImports) {
       // We expect to find an entry for any call to `loadLibrary`, even if
       // there is no code to load. In that case, the entry will be an empty
       // list.
@@ -657,6 +676,7 @@
         }
       }
     }
+    return hunksToLoad;
   }
 
   /// Returns a name for a deferred import.
@@ -794,7 +814,7 @@
 
   OutputUnitData _buildResult() {
     _createOutputUnits();
-    _setupHunksToLoad();
+    Map<String, List<OutputUnit>> hunksToLoad = _setupHunksToLoad();
     Map<ClassEntity, OutputUnit> classMap = <ClassEntity, OutputUnit>{};
     Map<MemberEntity, OutputUnit> memberMap = <MemberEntity, OutputUnit>{};
     Map<Local, OutputUnit> localFunctionMap = <Local, OutputUnit>{};
@@ -817,26 +837,31 @@
         memberMap,
         localFunctionMap,
         constantMap,
-        _allOutputUnits);
+        _allOutputUnits,
+        _importDeferName,
+        hunksToLoad,
+        _deferredImportDescriptions);
   }
 
   /// Frees up strategy-specific temporary data.
   void cleanup() {}
 
-  void beforeResolution(LoadedLibraries loadedLibraries) {
-    for (Uri uri in loadedLibraries.libraries) {
-      LibraryEntity library = elementEnvironment.lookupLibrary(uri);
-      reporter.withCurrentElement(library, () {
-        checkForDeferredErrorCases(library);
-        for (ImportEntity import in elementEnvironment.getImports(library)) {
-          if (import.isDeferred) {
-            _deferredImportDescriptions[import] = new ImportDescription(
-                import, library, loadedLibraries.rootLibraryUri);
-            isProgramSplit = true;
+  void beforeResolution(Uri rootLibraryUri, Iterable<Uri> libraries) {
+    measureSubtask('prepare', () {
+      for (Uri uri in libraries) {
+        LibraryEntity library = elementEnvironment.lookupLibrary(uri);
+        reporter.withCurrentElement(library, () {
+          checkForDeferredErrorCases(library);
+          for (ImportEntity import in elementEnvironment.getImports(library)) {
+            if (import.isDeferred) {
+              _deferredImportDescriptions[import] =
+                  new ImportDescription(import, library, rootLibraryUri);
+              isProgramSplit = true;
+            }
           }
-        }
-      });
-    }
+        });
+      }
+    });
   }
 
   /// Detects errors like duplicate uses of a prefix or using the old deferred
@@ -846,62 +871,6 @@
   /// skipped by the new compiler pipeline.
   void checkForDeferredErrorCases(LibraryEntity library);
 
-  /// Returns a json-style map for describing what files that are loaded by a
-  /// given deferred import.
-  /// The mapping is structured as:
-  /// library uri -> {"name": library name, "files": (prefix -> list of files)}
-  /// Where
-  ///
-  /// - <library uri> is the relative uri of the library making a deferred
-  ///   import.
-  /// - <library name> is the name of the library, or "<unnamed>" if it is
-  ///   unnamed.
-  /// - <prefix> is the `as` prefix used for a given deferred import.
-  /// - <list of files> is a list of the filenames the must be loaded when that
-  ///   import is loaded.
-  Map<String, Map<String, dynamic>> computeDeferredMap(
-      {Set<OutputUnit> omittedUnits}) {
-    omittedUnits ??= Set();
-    Map<String, Map<String, dynamic>> mapping = {};
-
-    _deferredImportDescriptions.keys.forEach((ImportEntity import) {
-      List<OutputUnit> outputUnits = hunksToLoad[_importDeferName[import]];
-      ImportDescription description = _deferredImportDescriptions[import];
-      String getName(LibraryEntity library) {
-        var name = elementEnvironment.getLibraryName(library);
-        return name == '' ? '<unnamed>' : name;
-      }
-
-      Map<String, dynamic> libraryMap = mapping.putIfAbsent(
-          description.importingUri,
-          () => <String, dynamic>{
-                "name": getName(description._importingLibrary),
-                "imports": <String, List<String>>{}
-              });
-
-      List<String> partFileNames = outputUnits
-          .where((outputUnit) => !omittedUnits.contains(outputUnit))
-          .map((outputUnit) => deferredPartFileName(outputUnit.name))
-          .toList();
-      libraryMap["imports"][_importDeferName[import]] = partFileNames;
-    });
-    return mapping;
-  }
-
-  /// Returns the filename for the output-unit named [name].
-  ///
-  /// The filename is of the form "<main output file>_<name>.part.js".
-  /// If [addExtension] is false, the ".part.js" suffix is left out.
-  String deferredPartFileName(String name, {bool addExtension: true}) {
-    assert(name != "");
-    String outPath = compiler.options.outputUri != null
-        ? compiler.options.outputUri.path
-        : "out";
-    String outName = outPath.substring(outPath.lastIndexOf('/') + 1);
-    String extension = addExtension ? ".part.js" : "";
-    return "${outName}_$name$extension";
-  }
-
   bool ignoreEntityInDump(Entity element) => false;
 
   /// Creates a textual representation of the output unit content.
@@ -995,12 +964,16 @@
 
   final LibraryEntity _importingLibrary;
 
+  ImportDescription.internal(
+      this.importingUri, this.prefix, this._importingLibrary);
+
   ImportDescription(
       ImportEntity import, LibraryEntity importingLibrary, Uri mainLibraryUri)
-      : importingUri = uri_extras.relativize(
-            mainLibraryUri, importingLibrary.canonicalUri, false),
-        prefix = import.name,
-        _importingLibrary = importingLibrary;
+      : this.internal(
+            uri_extras.relativize(
+                mainLibraryUri, importingLibrary.canonicalUri, false),
+            import.name,
+            importingLibrary);
 }
 
 /// Indirectly represents a deferred import in an [ImportSet].
@@ -1283,6 +1256,20 @@
   final Map<Local, OutputUnit> _localFunctionToUnit;
   final Map<ConstantValue, OutputUnit> _constantToUnit;
   final Iterable<OutputUnit> outputUnits;
+  final Map<ImportEntity, String> _importDeferName;
+
+  /// A mapping from the name of a defer import to all the output units it
+  /// depends on in a list of lists to be loaded in the order they appear.
+  ///
+  /// For example {"lib1": [[lib1_lib2_lib3], [lib1_lib2, lib1_lib3],
+  /// [lib1]]} would mean that in order to load "lib1" first the hunk
+  /// lib1_lib2_lib2 should be loaded, then the hunks lib1_lib2 and lib1_lib3
+  /// can be loaded in parallel. And finally lib1 can be loaded.
+  final Map<String, List<OutputUnit>> hunksToLoad;
+
+  /// Because the token-stream is forgotten later in the program, we cache a
+  /// description of each deferred import.
+  final Map<ImportEntity, ImportDescription> _deferredImportDescriptions;
 
   OutputUnitData(
       this.isProgramSplit,
@@ -1291,11 +1278,15 @@
       this._memberToUnit,
       this._localFunctionToUnit,
       this._constantToUnit,
-      this.outputUnits);
+      this.outputUnits,
+      this._importDeferName,
+      this.hunksToLoad,
+      this._deferredImportDescriptions);
 
   // Creates J-world data from the K-world data.
-  OutputUnitData.from(
+  factory OutputUnitData.from(
       OutputUnitData other,
+      LibraryEntity convertLibrary(LibraryEntity library),
       Map<ClassEntity, OutputUnit> Function(
               Map<ClassEntity, OutputUnit>, Map<Local, OutputUnit>)
           convertClassMap,
@@ -1303,35 +1294,44 @@
               Map<MemberEntity, OutputUnit>, Map<Local, OutputUnit>)
           convertMemberMap,
       Map<ConstantValue, OutputUnit> Function(Map<ConstantValue, OutputUnit>)
-          convertConstantMap)
-      : isProgramSplit = other.isProgramSplit,
-        mainOutputUnit = other.mainOutputUnit,
-        this.outputUnits = other.outputUnits,
-        _memberToUnit =
-            convertMemberMap(other._memberToUnit, other._localFunctionToUnit),
-        _classToUnit =
-            convertClassMap(other._classToUnit, other._localFunctionToUnit),
+          convertConstantMap) {
+    Map<ClassEntity, OutputUnit> classToUnit =
+        convertClassMap(other._classToUnit, other._localFunctionToUnit);
+    Map<MemberEntity, OutputUnit> memberToUnit =
+        convertMemberMap(other._memberToUnit, other._localFunctionToUnit);
+    Map<ConstantValue, OutputUnit> constantToUnit =
+        convertConstantMap(other._constantToUnit);
+    Map<ImportEntity, ImportDescription> deferredImportDescriptions = {};
+    other._deferredImportDescriptions
+        .forEach((ImportEntity import, ImportDescription description) {
+      deferredImportDescriptions[import] = new ImportDescription.internal(
+          description.importingUri,
+          description.prefix,
+          convertLibrary(description._importingLibrary));
+    });
+
+    return new OutputUnitData(
+        other.isProgramSplit,
+        other.mainOutputUnit,
+        classToUnit,
+        memberToUnit,
         // Local functions only make sense in the K-world model.
-        _localFunctionToUnit = const <Local, OutputUnit>{},
-        _constantToUnit = convertConstantMap(other._constantToUnit);
+        const <Local, OutputUnit>{},
+        constantToUnit,
+        other.outputUnits,
+        other._importDeferName,
+        other.hunksToLoad,
+        deferredImportDescriptions);
+  }
 
   /// Deserializes an [OutputUnitData] object from [source].
   factory OutputUnitData.readFromDataSource(DataSource source) {
     source.begin(tag);
     bool isProgramSplit = source.readBool();
-    List<ImportEntity> imports = source.readList(() {
-      String name = source.readString();
-      Uri uri = source.readUri();
-      Uri enclosingLibraryUri = source.readUri();
-      bool isDeferred = source.readBool();
-      return new ImportEntity(isDeferred, name, uri, enclosingLibraryUri);
-    });
     List<OutputUnit> outputUnits = source.readList(() {
       bool isMainOutput = source.readBool();
       String name = source.readString();
-      Set<ImportEntity> importSet = source.readList(() {
-        return imports[source.readInt()];
-      }).toSet();
+      Set<ImportEntity> importSet = source.readImports().toSet();
       return new OutputUnit(isMainOutput, name, importSet);
     });
     OutputUnit mainOutputUnit = outputUnits[source.readInt()];
@@ -1345,6 +1345,21 @@
     Map<ConstantValue, OutputUnit> constantToUnit = source.readConstantMap(() {
       return outputUnits[source.readInt()];
     });
+    Map<ImportEntity, String> importDeferName =
+        source.readImportMap(source.readString);
+    Map<String, List<OutputUnit>> hunksToLoad = source.readStringMap(() {
+      return source.readList(() {
+        return outputUnits[source.readInt()];
+      });
+    });
+    Map<ImportEntity, ImportDescription> deferredImportDescriptions =
+        source.readImportMap(() {
+      String importingUri = source.readString();
+      String prefix = source.readString();
+      LibraryEntity importingLibrary = source.readLibrary();
+      return new ImportDescription.internal(
+          importingUri, prefix, importingLibrary);
+    });
     source.end(tag);
     return new OutputUnitData(
         isProgramSplit,
@@ -1354,33 +1369,22 @@
         // Local functions only make sense in the K-world model.
         const <Local, OutputUnit>{},
         constantToUnit,
-        outputUnits);
+        outputUnits,
+        importDeferName,
+        hunksToLoad,
+        deferredImportDescriptions);
   }
 
   /// Serializes this [OutputUnitData] to [sink].
   void writeToDataSink(DataSink sink) {
     sink.begin(tag);
     sink.writeBool(isProgramSplit);
-    Map<ImportEntity, int> importIndex = {};
-    for (OutputUnit outputUnit in outputUnits) {
-      for (ImportEntity import in outputUnit._imports) {
-        importIndex[import] ??= importIndex.length;
-      }
-    }
-    sink.writeList(importIndex.keys, (ImportEntity import) {
-      sink.writeString(import.name);
-      sink.writeUri(import.uri);
-      sink.writeUri(import.enclosingLibraryUri);
-      sink.writeBool(import.isDeferred);
-    });
     Map<OutputUnit, int> outputUnitIndices = {};
     sink.writeList(outputUnits, (OutputUnit outputUnit) {
       outputUnitIndices[outputUnit] = outputUnitIndices.length;
       sink.writeBool(outputUnit.isMainOutput);
       sink.writeString(outputUnit.name);
-      sink.writeList(outputUnit._imports, (ImportEntity import) {
-        sink.writeInt(importIndex[import]);
-      });
+      sink.writeImports(outputUnit._imports);
     });
     sink.writeInt(outputUnitIndices[mainOutputUnit]);
     sink.writeClassMap(_classToUnit, (OutputUnit outputUnit) {
@@ -1392,6 +1396,19 @@
     sink.writeConstantMap(_constantToUnit, (OutputUnit outputUnit) {
       sink.writeInt(outputUnitIndices[outputUnit]);
     });
+    sink.writeImportMap(_importDeferName, sink.writeString);
+    sink.writeStringMap(hunksToLoad, (List<OutputUnit> outputUnits) {
+      sink.writeList(
+          outputUnits,
+          (OutputUnit outputUnit) =>
+              sink.writeInt(outputUnitIndices[outputUnit]));
+    });
+    sink.writeImportMap(_deferredImportDescriptions,
+        (ImportDescription importDescription) {
+      sink.writeString(importDescription.importingUri);
+      sink.writeString(importDescription.prefix);
+      sink.writeLibrary(importDescription._importingLibrary);
+    });
     sink.end(tag);
   }
 
@@ -1459,11 +1476,110 @@
     assert(_memberToUnit[newEntity] == null);
     _memberToUnit[newEntity] = outputUnitForMember(existingEntity);
   }
+
+  /// Returns the unique name for the given deferred [import].
+  String getImportDeferName(Spannable node, ImportEntity import) {
+    String name = _importDeferName[import];
+    if (name == null) {
+      throw new SpannableAssertionFailure(
+          node, "No deferred name for $import.");
+    }
+    return name;
+  }
+
+  /// Returns the names associated with each deferred import in [unit].
+  Iterable<String> getImportNames(OutputUnit unit) {
+    return unit._imports.map((i) => _importDeferName[i]);
+  }
+
+  /// Returns a json-style map for describing what files that are loaded by a
+  /// given deferred import.
+  /// The mapping is structured as:
+  /// library uri -> {"name": library name, "files": (prefix -> list of files)}
+  /// Where
+  ///
+  /// - <library uri> is the relative uri of the library making a deferred
+  ///   import.
+  /// - <library name> is the name of the library, or "<unnamed>" if it is
+  ///   unnamed.
+  /// - <prefix> is the `as` prefix used for a given deferred import.
+  /// - <list of files> is a list of the filenames the must be loaded when that
+  ///   import is loaded.
+  Map<String, Map<String, dynamic>> computeDeferredMap(
+      CompilerOptions options, ElementEnvironment elementEnvironment,
+      {Set<OutputUnit> omittedUnits}) {
+    omittedUnits ??= Set();
+    Map<String, Map<String, dynamic>> mapping = {};
+
+    _deferredImportDescriptions.keys.forEach((ImportEntity import) {
+      List<OutputUnit> outputUnits = hunksToLoad[_importDeferName[import]];
+      ImportDescription description = _deferredImportDescriptions[import];
+      String getName(LibraryEntity library) {
+        var name = elementEnvironment.getLibraryName(library);
+        return name == '' ? '<unnamed>' : name;
+      }
+
+      Map<String, dynamic> libraryMap = mapping.putIfAbsent(
+          description.importingUri,
+          () => <String, dynamic>{
+                "name": getName(description._importingLibrary),
+                "imports": <String, List<String>>{}
+              });
+
+      List<String> partFileNames = outputUnits
+          .where((outputUnit) => !omittedUnits.contains(outputUnit))
+          .map((outputUnit) => deferredPartFileName(options, outputUnit.name))
+          .toList();
+      libraryMap["imports"][_importDeferName[import]] = partFileNames;
+    });
+    return mapping;
+  }
+}
+
+/// Returns the filename for the output-unit named [name].
+///
+/// The filename is of the form "<main output file>_<name>.part.js".
+/// If [addExtension] is false, the ".part.js" suffix is left out.
+String deferredPartFileName(CompilerOptions options, String name,
+    {bool addExtension: true}) {
+  assert(name != "");
+  String outPath = options.outputUri != null ? options.outputUri.path : "out";
+  String outName = outPath.substring(outPath.lastIndexOf('/') + 1);
+  String extension = addExtension ? ".part.js" : "";
+  return "${outName}_$name$extension";
 }
 
 class Dependencies {
-  final Set<ClassEntity> classes = new Set<ClassEntity>();
-  final Set<MemberEntity> members = new Set<MemberEntity>();
+  final Map<ClassEntity, DependencyInfo> classes = {};
+  final Map<MemberEntity, DependencyInfo> members = {};
   final Set<Local> localFunctions = new Set<Local>();
-  final Set<ConstantValue> constants = new Set<ConstantValue>();
+  final Map<ConstantValue, DependencyInfo> constants = {};
+
+  void addClass(ClassEntity cls, [ImportEntity import]) {
+    (classes[cls] ??= new DependencyInfo()).registerImport(import);
+  }
+
+  void addMember(MemberEntity m, [ImportEntity import]) {
+    (members[m] ??= new DependencyInfo()).registerImport(import);
+  }
+
+  void addConstant(ConstantValue c, [ImportEntity import]) {
+    (constants[c] ??= new DependencyInfo()).registerImport(import);
+  }
+}
+
+class DependencyInfo {
+  bool isDeferred = true;
+  List<ImportEntity> imports;
+
+  registerImport(ImportEntity import) {
+    if (!isDeferred) return;
+    // A null import represents a direct non-deferred dependency.
+    if (import != null) {
+      (imports ??= []).add(import);
+    } else {
+      imports = null;
+      isDeferred = false;
+    }
+  }
 }
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 31c1687..ddbd195 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -133,14 +133,12 @@
   /// Should describe how to fix the problem. Elided when using --terse option.
   final String howToFix;
 
-  /**
-   *  Examples will be checked by
-   *  tests/compiler/dart2js/message_kind_test.dart.
-   *
-   *  An example is either a String containing the example source code or a Map
-   *  from filenames to source code. In the latter case, the filename for the
-   *  main library code must be 'main.dart'.
-   */
+  ///  Examples will be checked by
+  ///  tests/compiler/dart2js/message_kind_test.dart.
+  ///
+  ///  An example is either a String containing the example source code or a Map
+  ///  from filenames to source code. In the latter case, the filename for the
+  ///  main library code must be 'main.dart'.
   final List examples;
 
   /// Additional options needed for the examples to work.
diff --git a/pkg/compiler/lib/src/diagnostics/spannable.dart b/pkg/compiler/lib/src/diagnostics/spannable.dart
index 3c8b6d1..cdba684 100644
--- a/pkg/compiler/lib/src/diagnostics/spannable.dart
+++ b/pkg/compiler/lib/src/diagnostics/spannable.dart
@@ -4,9 +4,7 @@
 
 library dart2js.diagnostics.spannable;
 
-/**
- * Tagging interface for classes from which source spans can be generated.
- */
+/// Tagging interface for classes from which source spans can be generated.
 // TODO(johnniwinther): Find a better name.
 // TODO(ahe): How about "Bolt"?
 abstract class Spannable {}
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index f05939b..d3f9c4d 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -18,12 +18,12 @@
 import 'constants/values.dart' show ConstantValue, InterceptorConstantValue;
 import 'deferred_load.dart' show OutputUnit;
 import 'elements/entities.dart';
+import 'inferrer/abstract_value_domain.dart';
+import 'inferrer/types.dart'
+    show GlobalTypeInferenceMemberResult, GlobalTypeInferenceResults;
 import 'js/js.dart' as jsAst;
 import 'js_backend/js_backend.dart' show JavaScriptBackend;
-import 'types/abstract_value_domain.dart';
-import 'types/types.dart'
-    show GlobalTypeInferenceMemberResult, GlobalTypeInferenceResults;
-import 'universe/world_builder.dart' show CodegenWorldBuilder;
+import 'universe/codegen_world_builder.dart';
 import 'universe/world_impact.dart'
     show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
 import 'world.dart' show JClosedWorld;
@@ -32,6 +32,7 @@
   final Compiler compiler;
   final JClosedWorld closedWorld;
   final GlobalTypeInferenceResults _globalInferenceResults;
+  final DumpInfoTask dumpInfoTask;
 
   JElementEnvironment get environment => closedWorld.elementEnvironment;
   CodegenWorldBuilder get codegenWorldBuilder => compiler.codegenWorldBuilder;
@@ -41,13 +42,13 @@
   final Map<ConstantValue, Info> _constantToInfo = <ConstantValue, Info>{};
   final Map<OutputUnit, OutputUnitInfo> _outputToInfo = {};
 
-  ElementInfoCollector(
-      this.compiler, this.closedWorld, this._globalInferenceResults);
+  ElementInfoCollector(this.compiler, this.dumpInfoTask, this.closedWorld,
+      this._globalInferenceResults);
 
   void run() {
-    compiler.dumpInfoTask._constantToNode.forEach((constant, node) {
+    dumpInfoTask._constantToNode.forEach((constant, node) {
       // TODO(sigmund): add dependencies on other constants
-      var size = compiler.dumpInfoTask._nodeToSize[node];
+      var size = dumpInfoTask._nodeData[node].length;
       var code = jsAst.prettyPrint(node,
           enableMinification: compiler.options.enableMinification);
       var info = new ConstantInfo(
@@ -64,8 +65,8 @@
   /// output size. Either because it is a function being emitted or inlined,
   /// or because it is an entity that holds dependencies to other entities.
   bool shouldKeep(Entity entity) {
-    return compiler.dumpInfoTask.impacts.containsKey(entity) ||
-        compiler.dumpInfoTask.inlineCount.containsKey(entity);
+    return dumpInfoTask.impacts.containsKey(entity) ||
+        dumpInfoTask.inlineCount.containsKey(entity);
   }
 
   LibraryInfo visitLibrary(LibraryEntity lib) {
@@ -73,7 +74,7 @@
     if (libname.isEmpty) {
       libname = '<unnamed>';
     }
-    int size = compiler.dumpInfoTask.sizeOf(lib);
+    int size = dumpInfoTask.sizeOf(lib);
     LibraryInfo info = new LibraryInfo(libname, lib.canonicalUri, null, size);
     _entityToInfo[lib] = info;
 
@@ -113,23 +114,17 @@
       _globalInferenceResults.resultOfParameter(e);
 
   FieldInfo visitField(FieldEntity field, {ClassEntity containingClass}) {
-    var isInInstantiatedClass = false;
-    if (containingClass != null) {
-      isInInstantiatedClass =
-          closedWorld.classHierarchy.isInstantiated(containingClass);
-    }
-    if (!isInInstantiatedClass && !_hasBeenResolved(field)) {
-      return null;
-    }
     AbstractValue inferredType = _resultOfMember(field).type;
     // If a field has an empty inferred type it is never used.
     if (inferredType == null ||
-        closedWorld.abstractValueDomain.isEmpty(inferredType)) {
+        closedWorld.abstractValueDomain
+            .isEmpty(inferredType)
+            .isDefinitelyTrue) {
       return null;
     }
 
-    int size = compiler.dumpInfoTask.sizeOf(field);
-    String code = compiler.dumpInfoTask.codeOf(field);
+    int size = dumpInfoTask.sizeOf(field);
+    String code = dumpInfoTask.codeOf(field);
 
     // TODO(het): Why doesn't `size` account for the code size already?
     if (code != null) size += code.length;
@@ -147,7 +142,7 @@
           codegenWorldBuilder.getConstantFieldInitializer(field)];
     }
 
-    if (JavaScriptBackend.TRACE_METHOD == 'post') {
+    if (compiler.options.experimentCallInstrumentation) {
       // We use field.hashCode because it is globally unique and it is
       // available while we are doing codegen.
       info.coverageId = '${field.hashCode}';
@@ -160,12 +155,6 @@
     return info;
   }
 
-  bool _hasBeenResolved(MemberEntity entity) {
-    return compiler.globalInference.typesInferrerInternal.inferrer.types
-        .memberTypeInformations
-        .containsKey(entity);
-  }
-
   ClassInfo visitClass(ClassEntity clazz) {
     // Omit class if it is not needed.
     ClassInfo classInfo = new ClassInfo(
@@ -174,7 +163,7 @@
         outputUnit: _unitInfoForClass(clazz));
     _entityToInfo[clazz] = classInfo;
 
-    int size = compiler.dumpInfoTask.sizeOf(clazz);
+    int size = dumpInfoTask.sizeOf(clazz);
     environment.forEachLocalClassMember(clazz, (member) {
       if (member.isFunction || member.isGetter || member.isSetter) {
         FunctionInfo functionInfo = visitFunction(member);
@@ -225,7 +214,7 @@
     ClosureInfo closureInfo = new ClosureInfo(
         name: element.name,
         outputUnit: _unitInfoForClass(element),
-        size: compiler.dumpInfoTask.sizeOf(element));
+        size: dumpInfoTask.sizeOf(element));
     _entityToInfo[element] = closureInfo;
 
     FunctionEntity callMethod = closedWorld.elementEnvironment
@@ -241,7 +230,7 @@
   }
 
   FunctionInfo visitFunction(FunctionEntity function) {
-    int size = compiler.dumpInfoTask.sizeOf(function);
+    int size = dumpInfoTask.sizeOf(function);
     // TODO(sigmund): consider adding a small info to represent unreachable
     // code here.
     if (size == 0 && !shouldKeep(function)) return null;
@@ -272,7 +261,7 @@
           : false,
       isExternal: function.isExternal,
     );
-    String code = compiler.dumpInfoTask.codeOf(function);
+    String code = dumpInfoTask.codeOf(function);
 
     List<ParameterInfo> parameters = <ParameterInfo>[];
     List<String> inferredParameterTypes = <String>[];
@@ -292,7 +281,7 @@
     String sideEffects =
         '${_globalInferenceResults.inferredData.getSideEffectsOfElement(function)}';
 
-    int inlinedCount = compiler.dumpInfoTask.inlineCount[function];
+    int inlinedCount = dumpInfoTask.inlineCount[function];
     if (inlinedCount == null) inlinedCount = 0;
 
     FunctionInfo info = new FunctionInfo(
@@ -312,7 +301,7 @@
     int closureSize = _addClosureInfo(info, function);
     size += closureSize;
 
-    if (JavaScriptBackend.TRACE_METHOD == 'post') {
+    if (compiler.options.experimentCallInstrumentation) {
       // We use function.hashCode because it is globally unique and it is
       // available while we are doing codegen.
       info.coverageId = '${function.hashCode}';
@@ -353,7 +342,8 @@
       assert(outputUnit.name != null || outputUnit.isMainOutput);
       OutputUnitInfo info = new OutputUnitInfo(
           outputUnit.name, backend.emitter.emitter.generatedSize(outputUnit));
-      info.imports.addAll(compiler.deferredLoadTask.getImportNames(outputUnit));
+      info.imports
+          .addAll(closedWorld.outputUnitData.getImportNames(outputUnit));
       result.outputUnits.add(info);
       return info;
     });
@@ -411,10 +401,10 @@
   /// The size of the generated output.
   int _programSize;
 
-  // A set of javascript AST nodes that we care about the size of.
-  // This set is automatically populated when registerEntityAst()
-  // is called.
-  final Set<jsAst.Node> _tracking = new Set<jsAst.Node>();
+  /// Data associated with javascript AST nodes. The map only contains keys for
+  /// nodes that we care about.  Keys are automatically added when
+  /// [registerEntityAst] is called.
+  final Map<jsAst.Node, _CodeData> _nodeData = <jsAst.Node, _CodeData>{};
 
   // A mapping from Dart Entities to Javascript AST Nodes.
   final Map<Entity, List<jsAst.Node>> _entityToNodes =
@@ -422,10 +412,6 @@
   final Map<ConstantValue, jsAst.Node> _constantToNode =
       <ConstantValue, jsAst.Node>{};
 
-  // A mapping from Javascript AST Nodes to the size of their
-  // pretty-printed contents.
-  final Map<jsAst.Node, int> _nodeToSize = <jsAst.Node, int>{};
-
   final Map<Entity, int> inlineCount = <Entity, int>{};
 
   // A mapping from an entity to a list of entities that are
@@ -481,24 +467,15 @@
     return selections;
   }
 
-  // Returns true if we care about tracking the size of
-  // this node.
-  bool isTracking(jsAst.Node code) {
-    if (compiler.options.dumpInfo) {
-      return _tracking.contains(code);
-    } else {
-      return false;
-    }
-  }
-
   /// Registers that a javascript AST node [code] was produced by the dart
   /// Entity [entity].
-  void registerEntityAst(Entity entity, jsAst.Node code) {
+  void registerEntityAst(Entity entity, jsAst.Node code,
+      {LibraryEntity library}) {
     if (compiler.options.dumpInfo) {
       _entityToNodes
           .putIfAbsent(entity, () => new List<jsAst.Node>())
           .add(code);
-      _tracking.add(code);
+      _nodeData[code] ??= _CodeData();
     }
   }
 
@@ -507,19 +484,36 @@
       assert(_constantToNode[constant] == null ||
           _constantToNode[constant] == code);
       _constantToNode[constant] = code;
-      _tracking.add(code);
+      _nodeData[code] ??= _CodeData();
     }
   }
 
-  /// Records the size of a dart AST node after it has been pretty-printed into
-  /// the output buffer.
-  void recordAstSize(jsAst.Node node, int size) {
-    if (isTracking(node)) {
-      //TODO: should I be incrementing here instead?
-      _nodeToSize[node] = size;
+  // TODO(sigmund): delete the stack once we stop emitting the source text.
+  List<_CodeData> _stack = [];
+  void enterNode(jsAst.Node node, int start) {
+    var data = _nodeData[node];
+    if (data != null) {
+      _stack.add(data);
+      data.start = start;
     }
   }
 
+  void emit(String string) {
+    // Note: historically we emitted the full body of classes and methods, so
+    // instance methods ended up emitted twice.  Once we use a different
+    // encoding of dump info, we also plan to remove this duplication.
+    _stack.forEach((f) => f.text.write(string));
+  }
+
+  void exitNode(jsAst.Node node, int start, int end, int closing) {
+    var data = _nodeData[node];
+    if (data == null) return;
+    var last = _stack.removeLast();
+    assert(data == last);
+    assert(data.start == start);
+    data.end = end;
+  }
+
   /// Returns the size of the source code that was generated for an entity.
   /// If no source code was produced, return 0.
   int sizeOf(Entity entity) {
@@ -530,7 +524,7 @@
     }
   }
 
-  int sizeOfNode(jsAst.Node node) => _nodeToSize[node] ?? 0;
+  int sizeOfNode(jsAst.Node node) => _nodeData[node].length ?? 0;
 
   String codeOf(Entity entity) {
     List<jsAst.Node> code = _entityToNodes[entity];
@@ -538,8 +532,7 @@
     // Concatenate rendered ASTs.
     StringBuffer sb = new StringBuffer();
     for (jsAst.Node ast in code) {
-      sb.writeln(jsAst.prettyPrint(ast,
-          enableMinification: compiler.options.enableMinification));
+      sb.writeln(_nodeData[ast].text);
     }
     return sb.toString();
   }
@@ -548,16 +541,17 @@
       GlobalTypeInferenceResults globalInferenceResults) {
     measure(() {
       infoCollector = new ElementInfoCollector(
-          compiler, closedWorld, globalInferenceResults)
+          compiler, this, closedWorld, globalInferenceResults)
         ..run();
       StringBuffer jsonBuffer = new StringBuffer();
       dumpInfoJson(jsonBuffer, closedWorld);
       compiler.outputProvider.createOutputSink(
           compiler.options.outputUri.pathSegments.last,
           'info.json',
-          OutputType.info)
+          OutputType.dumpInfo)
         ..add(jsonBuffer.toString())
         ..close();
+      BasicInfo.resetIds();
     });
   }
 
@@ -613,7 +607,8 @@
       }
     }
 
-    result.deferredFiles = compiler.deferredLoadTask.computeDeferredMap();
+    result.deferredFiles = closedWorld.outputUnitData
+        .computeDeferredMap(compiler.options, closedWorld.elementEnvironment);
     stopwatch.stop();
 
     result.program = new ProgramInfo(
@@ -623,7 +618,7 @@
         dart2jsVersion:
             compiler.options.hasBuildId ? compiler.options.buildId : null,
         compilationMoment: new DateTime.now(),
-        compilationDuration: compiler.measurer.wallClock.elapsed,
+        compilationDuration: compiler.measurer.elapsedWallClock,
         toJsonDuration:
             new Duration(milliseconds: stopwatch.elapsedMilliseconds),
         dumpInfoDuration: new Duration(milliseconds: this.timing),
@@ -643,3 +638,15 @@
     });
   }
 }
+
+/// Helper class to store what dump-info will show for a piece of code.
+///
+/// Currently we print out the actual text, in the future, we will only emit
+/// start and end offsets.
+class _CodeData {
+  int start;
+  int end;
+  StringBuffer text = new StringBuffer();
+
+  int get length => end - start;
+}
diff --git a/pkg/compiler/lib/src/elements/entity_utils.dart b/pkg/compiler/lib/src/elements/entity_utils.dart
index 6096e4a..0a26700 100644
--- a/pkg/compiler/lib/src/elements/entity_utils.dart
+++ b/pkg/compiler/lib/src/elements/entity_utils.dart
@@ -101,15 +101,13 @@
   }
 }
 
-/**
- * Map an operator-name to a valid JavaScript identifier.
- *
- * For non-operator names, this method just returns its input.
- *
- * The results returned from this method are guaranteed to be valid
- * JavaScript identifiers, except it may include reserved words for
- * non-operator names.
- */
+/// Map an operator-name to a valid JavaScript identifier.
+///
+/// For non-operator names, this method just returns its input.
+///
+/// The results returned from this method are guaranteed to be valid
+/// JavaScript identifiers, except it may include reserved words for
+/// non-operator names.
 String operatorNameToIdentifier(String name) {
   if (name == null) {
     return name;
diff --git a/pkg/compiler/lib/src/elements/types.dart b/pkg/compiler/lib/src/elements/types.dart
index d869e48..d42f31a 100644
--- a/pkg/compiler/lib/src/elements/types.dart
+++ b/pkg/compiler/lib/src/elements/types.dart
@@ -68,9 +68,6 @@
   /// Is `true` if this type is a `FutureOr` type.
   bool get isFutureOr => false;
 
-  /// Is `true` if this type is a malformed type.
-  bool get isMalformed => false;
-
   /// Whether this type contains a type variable.
   bool get containsTypeVariables => false;
 
@@ -106,7 +103,8 @@
   bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) => false;
 }
 
-/// Pairs of [FunctionTypeVariable]s that are currently assumed to be equivalent.
+/// Pairs of [FunctionTypeVariable]s that are currently assumed to be
+/// equivalent.
 ///
 /// This is used to compute the equivalence relation on types coinductively.
 class _Assumptions {
@@ -357,22 +355,6 @@
   }
 }
 
-/// Provides a thin model of method type variables for compabitility with the
-/// old compiler behavior in Dart 1: They are treated as if their value were
-/// `dynamic` when used in a type annotation, and as a malformed type when
-/// used in an `as` or `is` expression.
-class Dart1MethodTypeVariableType extends TypeVariableType {
-  Dart1MethodTypeVariableType(TypeVariableEntity element) : super(element);
-
-  @override
-  bool get treatAsDynamic => true;
-
-  @override
-  bool get isMalformed => true;
-
-  bool _containsFreeTypeVariables(List<FunctionTypeVariable> bindings) => false;
-}
-
 class TypeVariableType extends DartType {
   final TypeVariableEntity element;
 
@@ -571,7 +553,17 @@
       this.optionalParameterTypes,
       this.namedParameters,
       this.namedParameterTypes,
-      this.typeVariables);
+      this.typeVariables) {
+    assert(returnType != null, "Invalid return type in $this.");
+    assert(!parameterTypes.contains(null), "Invalid parameter types in $this.");
+    assert(!optionalParameterTypes.contains(null),
+        "Invalid optional parameter types in $this.");
+    assert(
+        !namedParameters.contains(null), "Invalid named parameters in $this.");
+    assert(!namedParameterTypes.contains(null),
+        "Invalid named parameter types in $this.");
+    assert(!typeVariables.contains(null), "Invalid type variables in $this.");
+  }
 
   bool get containsTypeVariables {
     return typeVariables.any((type) => type.bound.containsTypeVariables) ||
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 3cef111..499f749 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -15,8 +15,10 @@
 import 'options.dart';
 import 'elements/entities.dart';
 import 'elements/types.dart';
+import 'inferrer/types.dart';
 import 'js_backend/enqueuer.dart';
-import 'types/types.dart';
+import 'universe/member_usage.dart';
+import 'universe/resolution_world_builder.dart';
 import 'universe/world_builder.dart';
 import 'universe/use.dart'
     show
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index dcd11fc..23a1cee 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -12,16 +12,18 @@
 import 'elements/entities.dart';
 import 'elements/types.dart';
 import 'enqueue.dart';
+import 'js_backend/annotations.dart';
 import 'js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
 import 'js_backend/backend_usage.dart';
 import 'js_backend/interceptor_data.dart';
 import 'js_backend/native_data.dart';
 import 'js_backend/no_such_method_registry.dart';
 import 'js_backend/runtime_types.dart';
-import 'library_loader.dart';
+import 'kernel/loader.dart';
 import 'native/enqueue.dart' show NativeResolutionEnqueuer;
 import 'native/resolver.dart';
 import 'universe/class_hierarchy.dart';
+import 'universe/resolution_world_builder.dart';
 import 'universe/world_builder.dart';
 import 'universe/world_impact.dart';
 
@@ -29,7 +31,7 @@
 /// the resolved element model.
 abstract class FrontendStrategy {
   /// Registers a set of loaded libraries with this strategy.
-  void registerLoadedLibraries(LoadedLibraries loadedLibraries);
+  void registerLoadedLibraries(KernelResult result);
 
   /// Returns the [ElementEnvironment] for the element model used in this
   /// strategy.
@@ -71,6 +73,7 @@
       KAllocatorAnalysis allocatorAnalysis,
       NativeResolutionEnqueuer nativeResolutionEnqueuer,
       NoSuchMethodRegistry noSuchMethodRegistry,
+      AnnotationsDataBuilder annotationsDataBuilder,
       SelectorConstraintsStrategy selectorConstraintsStrategy,
       ClassHierarchyBuilder classHierarchyBuilder,
       ClassQueries classQueries);
@@ -80,6 +83,7 @@
   WorkItemBuilder createResolutionWorkItemBuilder(
       NativeBasicData nativeBasicData,
       NativeDataBuilder nativeDataBuilder,
+      AnnotationsDataBuilder annotationsDataBuilder,
       ImpactTransformer impactTransformer,
       Map<Entity, WorldImpact> impactCache);
 
diff --git a/pkg/compiler/lib/src/hash/sha1.dart b/pkg/compiler/lib/src/hash/sha1.dart
index 814cd43..f34c204 100644
--- a/pkg/compiler/lib/src/hash/sha1.dart
+++ b/pkg/compiler/lib/src/hash/sha1.dart
@@ -2,20 +2,20 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * SHA-1.
- * Ripped from package:crypto.
- */
-library sha1;
-
 import 'dart:convert';
-import 'dart:math' show pow;
+
+import 'package:crypto/crypto.dart';
 
 import '../io/code_output.dart' show CodeOutputListener;
 
 class Hasher implements CodeOutputListener {
-  Hash _hasher = new SHA1();
-  String _hashString;
+  final _DigestSink _digestSink;
+  ByteConversionSink _byteSink;
+
+  Hasher._(this._digestSink)
+      : _byteSink = sha1.startChunkedConversion(_digestSink);
+
+  factory Hasher() => Hasher._(_DigestSink());
 
   @override
   void onDone(int length) {
@@ -24,345 +24,43 @@
 
   @override
   void onText(String text) {
-    if (_hasher != null) {
-      _hasher.add(const Utf8Encoder().convert(text));
+    if (_byteSink != null) {
+      _byteSink.add(utf8.encode(text));
     }
   }
 
   /// Returns the base64-encoded SHA-1 hash of the utf-8 bytes of the output
   /// text.
   String getHash() {
-    if (_hashString == null) {
-      _hashString = _bytesToBase64(_hasher.close());
-      _hasher = null;
+    if (_byteSink != null) {
+      _byteSink.close();
+      _byteSink = null;
     }
-    return _hashString;
-  }
-
-  /**
-   * Converts a list of bytes into a Base 64 encoded string.
-   *
-   * The list can be any list of integers in the range 0..255,
-   * for example a message digest.
-   *
-   * If [addLineSeparator] is true, the resulting string will  be
-   * broken into lines of 76 characters, separated by "\r\n".
-   *
-   * If [urlSafe] is true, the result is URL and filename safe.
-   *
-   * Based on [RFC 4648](http://tools.ietf.org/html/rfc4648)
-   *
-   */
-  String _bytesToBase64(List<int> bytes,
-      {bool urlSafe: false, bool addLineSeparator: false}) {
-    return _CryptoUtils.bytesToBase64(bytes, urlSafe, addLineSeparator);
+    return base64.encode(_digestSink.value.bytes);
   }
 }
 
-// Constants.
-const _MASK_8 = 0xff;
-const _MASK_32 = 0xffffffff;
-const _BITS_PER_BYTE = 8;
-const _BYTES_PER_WORD = 4;
+/// A sink used to get a digest value out of `Hash.startChunkedConversion`.
+class _DigestSink extends Sink<Digest> {
+  Digest _value;
 
-// Helper functions used by more than one hasher.
-
-// Rotate left limiting to unsigned 32-bit values.
-int _rotl32(int val, int shift) {
-  var mod_shift = shift & 31;
-  return ((val << mod_shift) & _MASK_32) |
-      ((val & _MASK_32) >> (32 - mod_shift));
-}
-
-// Base class encapsulating common behavior for cryptographic hash
-// functions.
-abstract class _HashBase implements Hash {
-  final int _chunkSizeInWords;
-  final bool _bigEndianWords;
-  final List<int> _currentChunk;
-  final List<int> _h;
-  int _lengthInBytes = 0;
-  List<int> _pendingData;
-  bool _digestCalled = false;
-
-  _HashBase(
-      int chunkSizeInWords, int digestSizeInWords, bool this._bigEndianWords)
-      : _pendingData = [],
-        _currentChunk = new List(chunkSizeInWords),
-        _h = new List(digestSizeInWords),
-        _chunkSizeInWords = chunkSizeInWords;
-
-  // Update the hasher with more data.
-  void add(List<int> data) {
-    if (_digestCalled) {
-      throw new StateError(
-          'Hash update method called after digest was retrieved');
-    }
-    _lengthInBytes += data.length;
-    _pendingData.addAll(data);
-    _iterate();
+  /// The value added to the sink, if any.
+  Digest get value {
+    assert(_value != null);
+    return _value;
   }
 
-  // Finish the hash computation and return the digest string.
-  List<int> close() {
-    if (_digestCalled) {
-      return _resultAsBytes();
-    }
-    _digestCalled = true;
-    _finalizeData();
-    _iterate();
-    assert(_pendingData.length == 0);
-    return _resultAsBytes();
+  /// Adds [value] to the sink.
+  ///
+  /// Unlike most sinks, this may only be called once.
+  @override
+  void add(Digest value) {
+    assert(_value == null);
+    _value = value;
   }
 
-  // Returns the block size of the hash in bytes.
-  int get blockSize {
-    return _chunkSizeInWords * _BYTES_PER_WORD;
-  }
-
-  // One round of the hash computation.
-  void _updateHash(List<int> m);
-
-  // Helper methods.
-  int _add32(x, y) => (x + y) & _MASK_32;
-  int _roundUp(val, n) => (val + n - 1) & -n;
-
-  // Compute the final result as a list of bytes from the hash words.
-  List<int> _resultAsBytes() {
-    var result = <int>[];
-    for (var i = 0; i < _h.length; i++) {
-      result.addAll(_wordToBytes(_h[i]));
-    }
-    return result;
-  }
-
-  // Converts a list of bytes to a chunk of 32-bit words.
-  void _bytesToChunk(List<int> data, int dataIndex) {
-    assert((data.length - dataIndex) >= (_chunkSizeInWords * _BYTES_PER_WORD));
-
-    for (var wordIndex = 0; wordIndex < _chunkSizeInWords; wordIndex++) {
-      var w3 = _bigEndianWords ? data[dataIndex] : data[dataIndex + 3];
-      var w2 = _bigEndianWords ? data[dataIndex + 1] : data[dataIndex + 2];
-      var w1 = _bigEndianWords ? data[dataIndex + 2] : data[dataIndex + 1];
-      var w0 = _bigEndianWords ? data[dataIndex + 3] : data[dataIndex];
-      dataIndex += 4;
-      var word = (w3 & 0xff) << 24;
-      word |= (w2 & _MASK_8) << 16;
-      word |= (w1 & _MASK_8) << 8;
-      word |= (w0 & _MASK_8);
-      _currentChunk[wordIndex] = word;
-    }
-  }
-
-  // Convert a 32-bit word to four bytes.
-  List<int> _wordToBytes(int word) {
-    List<int> bytes = new List(_BYTES_PER_WORD);
-    bytes[0] = (word >> (_bigEndianWords ? 24 : 0)) & _MASK_8;
-    bytes[1] = (word >> (_bigEndianWords ? 16 : 8)) & _MASK_8;
-    bytes[2] = (word >> (_bigEndianWords ? 8 : 16)) & _MASK_8;
-    bytes[3] = (word >> (_bigEndianWords ? 0 : 24)) & _MASK_8;
-    return bytes;
-  }
-
-  // Iterate through data updating the hash computation for each
-  // chunk.
-  void _iterate() {
-    var len = _pendingData.length;
-    var chunkSizeInBytes = _chunkSizeInWords * _BYTES_PER_WORD;
-    if (len >= chunkSizeInBytes) {
-      var index = 0;
-      for (; (len - index) >= chunkSizeInBytes; index += chunkSizeInBytes) {
-        _bytesToChunk(_pendingData, index);
-        _updateHash(_currentChunk);
-      }
-      _pendingData = _pendingData.sublist(index, len);
-    }
-  }
-
-  // Finalize the data. Add a 1 bit to the end of the message. Expand with
-  // 0 bits and add the length of the message.
-  void _finalizeData() {
-    _pendingData.add(0x80);
-    var contentsLength = _lengthInBytes + 9;
-    var chunkSizeInBytes = _chunkSizeInWords * _BYTES_PER_WORD;
-    var finalizedLength = _roundUp(contentsLength, chunkSizeInBytes);
-    var zeroPadding = finalizedLength - contentsLength;
-    for (var i = 0; i < zeroPadding; i++) {
-      _pendingData.add(0);
-    }
-    var lengthInBits = _lengthInBytes * _BITS_PER_BYTE;
-    assert(lengthInBits < pow(2, 32));
-    if (_bigEndianWords) {
-      _pendingData.addAll(_wordToBytes(0));
-      _pendingData.addAll(_wordToBytes(lengthInBits & _MASK_32));
-    } else {
-      _pendingData.addAll(_wordToBytes(lengthInBits & _MASK_32));
-      _pendingData.addAll(_wordToBytes(0));
-    }
-  }
-}
-
-/**
- * Interface for cryptographic hash functions.
- *
- * The [add] method is used to add data to the hash. The [close] method
- * is used to extract the message digest.
- *
- * Once the [close] method has been called no more data can be added using the
- * [add] method. If [add] is called after the first call to [close] a
- * HashException is thrown.
- *
- * If multiple instances of a given Hash is needed the [newInstance]
- * method can provide a new instance.
- */
-// TODO(floitsch): make Hash implement Sink, EventSink or similar.
-abstract class Hash {
-  /**
-   * Add a list of bytes to the hash computation.
-   */
-  void add(List<int> data);
-
-  /**
-   * Finish the hash computation and extract the message digest as
-   * a list of bytes.
-   */
-  List<int> close();
-
-  /**
-   * Internal block size of the hash in bytes.
-   *
-   * This is exposed for use by the HMAC class which needs to know the
-   * block size for the [Hash] it is using.
-   */
-  int get blockSize;
-}
-
-/**
- * SHA1 hash function implementation.
- */
-class SHA1 extends _HashBase {
-  final List<int> _w;
-
-  // Construct a SHA1 hasher object.
-  SHA1()
-      : _w = new List(80),
-        super(16, 5, true) {
-    _h[0] = 0x67452301;
-    _h[1] = 0xEFCDAB89;
-    _h[2] = 0x98BADCFE;
-    _h[3] = 0x10325476;
-    _h[4] = 0xC3D2E1F0;
-  }
-
-  // Compute one iteration of the SHA1 algorithm with a chunk of
-  // 16 32-bit pieces.
-  void _updateHash(List<int> m) {
-    assert(m.length == 16);
-
-    var a = _h[0];
-    var b = _h[1];
-    var c = _h[2];
-    var d = _h[3];
-    var e = _h[4];
-
-    for (var i = 0; i < 80; i++) {
-      if (i < 16) {
-        _w[i] = m[i];
-      } else {
-        var n = _w[i - 3] ^ _w[i - 8] ^ _w[i - 14] ^ _w[i - 16];
-        _w[i] = _rotl32(n, 1);
-      }
-      var t = _add32(_add32(_rotl32(a, 5), e), _w[i]);
-      if (i < 20) {
-        t = _add32(_add32(t, (b & c) | (~b & d)), 0x5A827999);
-      } else if (i < 40) {
-        t = _add32(_add32(t, (b ^ c ^ d)), 0x6ED9EBA1);
-      } else if (i < 60) {
-        t = _add32(_add32(t, (b & c) | (b & d) | (c & d)), 0x8F1BBCDC);
-      } else {
-        t = _add32(_add32(t, b ^ c ^ d), 0xCA62C1D6);
-      }
-
-      e = d;
-      d = c;
-      c = _rotl32(b, 30);
-      b = a;
-      a = t & _MASK_32;
-    }
-
-    _h[0] = _add32(a, _h[0]);
-    _h[1] = _add32(b, _h[1]);
-    _h[2] = _add32(c, _h[2]);
-    _h[3] = _add32(d, _h[3]);
-    _h[4] = _add32(e, _h[4]);
-  }
-}
-
-abstract class _CryptoUtils {
-  static const int PAD = 61; // '='
-  static const int CR = 13; // '\r'
-  static const int LF = 10; // '\n'
-  static const int LINE_LENGTH = 76;
-
-  static const String _encodeTable =
-      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-  static const String _encodeTableUrlSafe =
-      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-
-  static String bytesToBase64(List<int> bytes,
-      [bool urlSafe = false, bool addLineSeparator = false]) {
-    int len = bytes.length;
-    if (len == 0) {
-      return "";
-    }
-    final String lookup = urlSafe ? _encodeTableUrlSafe : _encodeTable;
-    // Size of 24 bit chunks.
-    final int remainderLength = len.remainder(3);
-    final int chunkLength = len - remainderLength;
-    // Size of base output.
-    int outputLen = ((len ~/ 3) * 4) + ((remainderLength > 0) ? 4 : 0);
-    // Add extra for line separators.
-    if (addLineSeparator) {
-      outputLen += ((outputLen - 1) ~/ LINE_LENGTH) << 1;
-    }
-    List<int> out = new List<int>(outputLen);
-
-    // Encode 24 bit chunks.
-    int j = 0, i = 0, c = 0;
-    while (i < chunkLength) {
-      int x = ((bytes[i++] << 16) & 0xFFFFFF) |
-          ((bytes[i++] << 8) & 0xFFFFFF) |
-          bytes[i++];
-      out[j++] = lookup.codeUnitAt(x >> 18);
-      out[j++] = lookup.codeUnitAt((x >> 12) & 0x3F);
-      out[j++] = lookup.codeUnitAt((x >> 6) & 0x3F);
-      out[j++] = lookup.codeUnitAt(x & 0x3f);
-      // Add optional line separator for each 76 char output.
-      if (addLineSeparator && ++c == 19 && j < outputLen - 2) {
-        out[j++] = CR;
-        out[j++] = LF;
-        c = 0;
-      }
-    }
-
-    // If input length if not a multiple of 3, encode remaining bytes and
-    // add padding.
-    if (remainderLength == 1) {
-      int x = bytes[i];
-      out[j++] = lookup.codeUnitAt(x >> 2);
-      out[j++] = lookup.codeUnitAt((x << 4) & 0x3F);
-      out[j++] = PAD;
-      out[j++] = PAD;
-    } else if (remainderLength == 2) {
-      int x = bytes[i];
-      int y = bytes[i + 1];
-      out[j++] = lookup.codeUnitAt(x >> 2);
-      out[j++] = lookup.codeUnitAt(((x << 4) | (y >> 4)) & 0x3F);
-      out[j++] = lookup.codeUnitAt((y << 2) & 0x3F);
-      out[j++] = PAD;
-    }
-
-    return new String.fromCharCodes(out);
+  @override
+  void close() {
+    assert(_value != null);
   }
 }
diff --git a/pkg/compiler/lib/src/helpers/expensive_map.dart b/pkg/compiler/lib/src/helpers/expensive_map.dart
index 5f5cb44..ed95b22 100644
--- a/pkg/compiler/lib/src/helpers/expensive_map.dart
+++ b/pkg/compiler/lib/src/helpers/expensive_map.dart
@@ -4,11 +4,9 @@
 
 import "dart:collection";
 
-/**
- * The expensive map is a data structure useful for tracking down
- * excessive memory usage due to large maps. It acts as an ordinary
- * hash map, but it uses 10 times more memory (by default).
- */
+/// The expensive map is a data structure useful for tracking down
+/// excessive memory usage due to large maps. It acts as an ordinary
+/// hash map, but it uses 10 times more memory (by default).
 class ExpensiveMap<K, V> extends MapBase<K, V> {
   final List _maps;
 
diff --git a/pkg/compiler/lib/src/helpers/expensive_set.dart b/pkg/compiler/lib/src/helpers/expensive_set.dart
index 76f8cd7..f4c2f4f 100644
--- a/pkg/compiler/lib/src/helpers/expensive_set.dart
+++ b/pkg/compiler/lib/src/helpers/expensive_set.dart
@@ -4,11 +4,9 @@
 
 import 'dart:collection';
 
-/**
- * The expensive set is a data structure useful for tracking down
- * excessive memory usage due to large sets. It acts as an ordinary
- * hash set, but it uses 10 times more memory (by default).
- */
+/// The expensive set is a data structure useful for tracking down
+/// excessive memory usage due to large sets. It acts as an ordinary
+/// hash set, but it uses 10 times more memory (by default).
 class ExpensiveSet<E> extends SetBase<E> {
   final List _sets;
 
diff --git a/pkg/compiler/lib/src/helpers/trace.dart b/pkg/compiler/lib/src/helpers/trace.dart
index 2c92824..104c227 100644
--- a/pkg/compiler/lib/src/helpers/trace.dart
+++ b/pkg/compiler/lib/src/helpers/trace.dart
@@ -9,23 +9,21 @@
 typedef void Trace(String message,
     {bool condition(String stackTrace), int limit, bool throwOnPrint});
 
-/**
- * Helper method for printing stack traces for debugging.
- *
- * [message] is printed as the header of the stack trace.
- *
- * If [condition] is provided, the stack trace is only printed if [condition]
- * returns [:true:] on the stack trace text. This can be used to filter the
- * printed stack traces based on their content. For instance only print stack
- * traces that contain specific paths.
- *
- * If [limit] is provided, the stack trace is limited to [limit] entries.
- *
- * If [throwOnPrint] is `true`, [message] will be thrown after the stack trace
- * has been printed. Together with [condition] this can be used to discover
- * unknown call-sites in tests by filtering known call-sites and throwning
- * otherwise.
- */
+/// Helper method for printing stack traces for debugging.
+///
+/// [message] is printed as the header of the stack trace.
+///
+/// If [condition] is provided, the stack trace is only printed if [condition]
+/// returns [:true:] on the stack trace text. This can be used to filter the
+/// printed stack traces based on their content. For instance only print stack
+/// traces that contain specific paths.
+///
+/// If [limit] is provided, the stack trace is limited to [limit] entries.
+///
+/// If [throwOnPrint] is `true`, [message] will be thrown after the stack trace
+/// has been printed. Together with [condition] this can be used to discover
+/// unknown call-sites in tests by filtering known call-sites and throwning
+/// otherwise.
 Trace get trace {
   enableDebugMode();
   return _trace;
@@ -293,22 +291,20 @@
 }
 
 // TODO(johnniwinther): Use this format for --throw-on-error.
-/**
- * Converts the normal VM stack trace into a more compact and readable format.
- *
- * The output format is [: <file> . . . <lineNo>:<columnNo> <method> :] where
- * [: <file> :] is file name, [: <lineNo> :] is the line number,
- * [: <columnNo> :] is the column number, and [: <method> :] is the method name.
- *
- * If [rangeStart] and/or [rangeEnd] are provided, only the lines within the
- * range are included.
- * If [showColumnNo] is [:false:], the [: :<columnNo> :] part is omitted.
- * If [showDots] is [:true:], the space between [: <file> :] and [: <lineNo> :]
- * is padded with dots on every other line.
- * If [filePrefix] is provided, then for  every file name thats starts with
- * [filePrefix] only the remainder is printed.
- * If [lambda] is non-null, anonymous closures are printed as [lambda].
- */
+/// Converts the normal VM stack trace into a more compact and readable format.
+///
+/// The output format is `<file> . . . <lineNo>:<columnNo> <method>` where
+/// `<file>` is file name, `<lineNo>` is the line number, `<columnNo>` is the
+/// column number, and `<method>` is the method name.
+///
+/// If [rangeStart] and/or [rangeEnd] are provided, only the lines within the
+/// range are included.
+/// If [showColumnNo] is `false`, the `:<columnNo>` part is omitted.
+/// If [showDots] is `true`, the space between `<file>` and `<lineNo>` is padded
+/// with dots on every other line.
+/// If [filePrefix] is provided, then for  every file name thats starts with
+/// [filePrefix] only the remainder is printed.
+/// If [lambda] is non-null, anonymous closures are printed as [lambda].
 String prettifyStackTrace(StackTrace stackTrace,
     {int rangeStart,
     int rangeEnd,
@@ -324,12 +320,10 @@
       .prettify(showColumnNo: showColumnNo, showDots: showDots);
 }
 
-/**
- * Pads (or truncates) [text] to the [intendedLength].
- *
- * If [padLeft] is [:true:] the text is padding inserted to the left of [text].
- * A repetition of the [dots] text is used for padding.
- */
+/// Pads (or truncates) [text] to the [intendedLength].
+///
+/// If [padLeft] is [:true:] the text is padding inserted to the left of [text].
+/// A repetition of the [dots] text is used for padding.
 String pad(String text, int intendedLength,
     {bool padLeft: false, String dots: ' '}) {
   if (text.length == intendedLength) return text;
diff --git a/pkg/compiler/lib/src/helpers/track_map.dart b/pkg/compiler/lib/src/helpers/track_map.dart
index 7c2eb86..6cb7121 100644
--- a/pkg/compiler/lib/src/helpers/track_map.dart
+++ b/pkg/compiler/lib/src/helpers/track_map.dart
@@ -2,17 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * The track map is a simple wrapper around a map that keeps track
- * of the 'final' size of maps grouped by description. It allows
- * determining the distribution of sizes for a specific allocation
- * site and it can be used like this:
- *
- *    Map<String, int> map = new TrackMap<String, int>("my-map");
- *
- * After finishing the compilaton, the histogram of track map sizes
- * is printed but only when running in verbose mode.
- */
+/// The track map is a simple wrapper around a map that keeps track
+/// of the 'final' size of maps grouped by description. It allows
+/// determining the distribution of sizes for a specific allocation
+/// site and it can be used like this:
+///
+///    Map<String, int> map = new TrackMap<String, int>("my-map");
+///
+/// After finishing the compilaton, the histogram of track map sizes
+/// is printed but only when running in verbose mode.
 class TrackMap<K, V> implements Map<K, V> {
   final Map<K, V> _map;
   final List _counts;
diff --git a/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart b/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
new file mode 100644
index 0000000..784e018
--- /dev/null
+++ b/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
@@ -0,0 +1,517 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.abstract_value_domain;
+
+import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
+import '../elements/entities.dart';
+import '../elements/names.dart';
+import '../serialization/serialization.dart';
+import '../universe/selector.dart';
+import '../universe/world_builder.dart';
+import '../world.dart';
+
+/// Enum-like values used for reporting known and unknown truth values.
+class AbstractBool {
+  final bool _value;
+
+  const AbstractBool._(this._value);
+
+  bool get isDefinitelyTrue => _value == true;
+
+  bool get isPotentiallyTrue => _value != false;
+
+  bool get isDefinitelyFalse => _value == false;
+
+  bool get isPotentiallyFalse => _value != true;
+
+  /// A value of `Abstract.True` is used when the property is known _always_ to
+  /// be true.
+  static const AbstractBool True = const AbstractBool._(true);
+
+  /// A value of `Abstract.False` is used when the property is known _never_ to
+  /// be true.
+  static const AbstractBool False = const AbstractBool._(false);
+
+  /// A value of `Abstract.Maybe` is used when the property might or might not
+  /// be true.
+  static const AbstractBool Maybe = const AbstractBool._(null);
+
+  static AbstractBool trueOrMaybe(bool value) => value ? True : Maybe;
+
+  static AbstractBool trueOrFalse(bool value) => value ? True : False;
+
+  static AbstractBool maybeOrFalse(bool value) => value ? Maybe : False;
+}
+
+/// Strategy for the abstraction of runtime values used by the global type
+/// inference.
+abstract class AbstractValueStrategy {
+  /// Creates the abstract value domain for [closedWorld].
+  AbstractValueDomain createDomain(JClosedWorld closedWorld);
+
+  /// Creates the [SelectorConstraintsStrategy] used by the backend enqueuer.
+  SelectorConstraintsStrategy createSelectorStrategy();
+}
+
+/// A value in an abstraction of runtime values.
+abstract class AbstractValue {}
+
+/// A system that implements an abstraction over runtime values.
+abstract class AbstractValueDomain {
+  /// The [AbstractValue] that represents an unknown runtime value.
+  AbstractValue get dynamicType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `Type` at
+  /// runtime.
+  AbstractValue get typeType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `Function` at
+  /// runtime.
+  AbstractValue get functionType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `bool` at
+  /// runtime.
+  AbstractValue get boolType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `int` at
+  /// runtime.
+  AbstractValue get intType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `double` at
+  /// runtime.
+  AbstractValue get doubleType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `num` at
+  /// runtime.
+  AbstractValue get numType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `String` at
+  /// runtime.
+  AbstractValue get stringType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `List` at
+  /// runtime.
+  AbstractValue get listType;
+
+  /// The [AbstractValue] that represents a non-null subtype of `Map` at
+  /// runtime.
+  AbstractValue get mapType;
+
+  /// The [AbstractValue] that represents a non-null value at runtime.
+  AbstractValue get nonNullType;
+
+  /// The [AbstractValue] that represents the `null` at runtime.
+  AbstractValue get nullType;
+
+  /// The [AbstractValue] that represents a non-null growable JavaScript array
+  /// at runtime.
+  AbstractValue get growableListType;
+
+  /// The [AbstractValue] that represents a non-null fixed size JavaScript array
+  /// at runtime.
+  AbstractValue get fixedListType;
+
+  /// The [AbstractValue] that represents a non-null 31-bit unsigned integer at
+  /// runtime.
+  AbstractValue get uint31Type;
+
+  /// The [AbstractValue] that represents a non-null 32-bit unsigned integer at
+  /// runtime.
+  AbstractValue get uint32Type;
+
+  /// The [AbstractValue] that represents a non-null unsigned integer at
+  /// runtime.
+  AbstractValue get positiveIntType;
+
+  /// The [AbstractValue] that represents a non-null constant list literal at
+  /// runtime.
+  AbstractValue get constListType;
+
+  /// The [AbstractValue] that represents a non-null constant map literal at
+  /// runtime.
+  AbstractValue get constMapType;
+
+  /// The [AbstractValue] that represents the empty set of runtime values.
+  AbstractValue get emptyType;
+
+  /// The [AbstractValue] that represents a non-null instance at runtime of the
+  /// `Iterable` class used for the `sync*` implementation.
+  AbstractValue get syncStarIterableType;
+
+  /// The [AbstractValue] that represents a non-null instance at runtime of the
+  /// `Future` class used for the `async` implementation.
+  AbstractValue get asyncFutureType;
+
+  /// The [AbstractValue] that represents a non-null instance at runtime of the
+  /// `Stream` class used for the `async*` implementation.
+  AbstractValue get asyncStarStreamType;
+
+  /// Creates an [AbstractValue] for a non-null exact instance of [cls].
+  AbstractValue createNonNullExact(ClassEntity cls);
+
+  /// Creates an [AbstractValue] for a potentially null exact instance of [cls].
+  AbstractValue createNullableExact(ClassEntity cls);
+
+  /// Creates an [AbstractValue] for a non-null instance that extends [cls].
+  AbstractValue createNonNullSubclass(ClassEntity cls);
+
+  /// Creates an [AbstractValue] for a non-null instance that implements [cls].
+  AbstractValue createNonNullSubtype(ClassEntity cls);
+
+  /// Creates an [AbstractValue] for a potentially null instance that implements
+  /// [cls].
+  AbstractValue createNullableSubtype(ClassEntity cls);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a native typed
+  /// array or `null` at runtime.
+  AbstractBool isTypedArray(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] could be a native
+  /// typed array at runtime.
+  AbstractBool couldBeTypedArray(covariant AbstractValue value);
+
+  /// Returns the version of the abstract [value] that excludes `null`.
+  AbstractValue excludeNull(covariant AbstractValue value);
+
+  /// Returns the version of the abstract [value] that includes `null`.
+  AbstractValue includeNull(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] contains
+  /// instances of [cls] at runtime.
+  AbstractBool containsType(covariant AbstractValue value, ClassEntity cls);
+
+  /// Returns an [AbstractBool] that describes whether [value] only contains
+  /// subtypes of [cls] or `null` at runtime.
+  AbstractBool containsOnlyType(covariant AbstractValue value, ClassEntity cls);
+
+  /// Returns an [AbstractBool] that describes whether [value] is an instance of
+  /// [cls] or `null` at runtime.
+  // TODO(johnniwinther): Merge this with [isInstanceOf].
+  AbstractBool isInstanceOfOrNull(
+      covariant AbstractValue value, ClassEntity cls);
+
+  /// Returns an [AbstractBool] that describes whether [value] is known to be an
+  /// instance of [cls] at runtime.
+  AbstractBool isInstanceOf(AbstractValue value, ClassEntity cls);
+
+  /// Returns an [AbstractBool] that describes whether [value] is empty set of
+  /// runtime values.
+  AbstractBool isEmpty(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a non-null
+  /// exact class at runtime.
+  AbstractBool isExact(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is an exact class
+  /// or `null` at runtime.
+  AbstractBool isExactOrNull(covariant AbstractValue value);
+
+  /// Returns the [ClassEntity] if this [value] is a non-null instance of an
+  /// exact class at runtime, and `null` otherwise.
+  ClassEntity getExactClass(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is `null` at
+  /// runtime.
+  AbstractBool isNull(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// bool, number, string, array or `null` at runtime.
+  AbstractBool isPrimitive(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// number at runtime.
+  AbstractBool isPrimitiveNumber(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// bool at runtime.
+  AbstractBool isPrimitiveBoolean(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// array at runtime.
+  AbstractBool isPrimitiveArray(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// string, array, native HTML list or `null` at runtime.
+  AbstractBool isIndexablePrimitive(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a fixed-size
+  /// or constant JavaScript array or `null` at runtime.
+  AbstractBool isFixedArray(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a growable
+  /// JavaScript array or `null` at runtime.
+  AbstractBool isExtendableArray(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a mutable
+  /// JavaScript array or `null` at runtime.
+  AbstractBool isMutableArray(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a mutable
+  /// JavaScript array, native HTML list or `null` at runtime.
+  AbstractBool isMutableIndexable(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// array or `null` at runtime.
+  AbstractBool isArray(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// string at runtime.
+  AbstractBool isPrimitiveString(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is an interceptor
+  /// at runtime.
+  AbstractBool isInterceptor(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a non-null
+  /// integer value at runtime.
+  AbstractBool isInteger(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a non-null 32
+  /// bit unsigned integer value at runtime.
+  AbstractBool isUInt32(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a non-null 31
+  /// bit unsigned integer value at runtime.
+  AbstractBool isUInt31(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a non-null
+  /// unsigned integer value at runtime.
+  AbstractBool isPositiveInteger(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is an unsigned
+  /// integer value or `null` at runtime.
+  AbstractBool isPositiveIntegerOrNull(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is an integer
+  /// value or `null` at runtime.
+  AbstractBool isIntegerOrNull(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a non-null
+  /// JavaScript number at runtime.
+  AbstractBool isNumber(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// number or `null` at runtime.
+  AbstractBool isNumberOrNull(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a non-integer
+  /// number at runtime.
+  AbstractBool isDouble(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a non-integer
+  /// number or `null` at runtime.
+  AbstractBool isDoubleOrNull(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// bool at runtime.
+  AbstractBool isBoolean(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// bool or `null` at runtime.
+  AbstractBool isBooleanOrNull(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// string at runtime.
+  AbstractBool isString(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] is a JavaScript
+  /// string or `null` at runtime.
+  AbstractBool isStringOrNull(covariant AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes whether [value] a JavaScript
+  /// primitive, possible `null`.
+  AbstractBool isPrimitiveOrNull(covariant AbstractValue value);
+
+  /// Returns [AbstractValue] for the runtime values contained in either [a] or
+  /// [b].
+  AbstractValue union(covariant AbstractValue a, covariant AbstractValue b);
+
+  /// Returns [AbstractValue] for the runtime values contained in at least one
+  /// of [values].
+  AbstractValue unionOfMany(Iterable<AbstractValue> values);
+
+  /// Returns [AbstractValue] for the runtime values that [a] and [b] have in
+  /// common.
+  AbstractValue intersection(
+      covariant AbstractValue a, covariant AbstractValue b);
+
+  /// Returns an [AbstractBool] that describes whether [a] and [b] have no
+  /// runtime values in common.
+  AbstractBool areDisjoint(
+      covariant AbstractValue a, covariant AbstractValue b);
+
+  /// Returns an [AbstractBool] that describes whether [a] contains all non-null
+  /// runtime values.
+  AbstractBool containsAll(covariant AbstractValue a);
+
+  /// Computes the [AbstractValue] corresponding to the constant [value].
+  AbstractValue computeAbstractValueForConstant(ConstantValue value);
+
+  /// Returns `true` if [value] represents a container value at runtime.
+  bool isContainer(covariant AbstractValue value);
+
+  /// Creates a container value specialization of [originalValue] with the
+  /// inferred [element] runtime value and inferred runtime [length].
+  ///
+  /// The [allocationNode] is used to identify this particular map allocation.
+  /// The [allocationElement] is used only for debugging.
+  AbstractValue createContainerValue(
+      AbstractValue originalValue,
+      Object allocationNode,
+      MemberEntity allocationElement,
+      AbstractValue elementType,
+      int length);
+
+  /// Returns the element type of [value] if it represents a container value
+  /// at runtime. Returns [dynamicType] otherwise.
+  AbstractValue getContainerElementType(AbstractValue value);
+
+  /// Return the known length of [value] if it represents a container value
+  /// at runtime. Returns `null` if the length is unknown or if [value] doesn't
+  /// represent a container value at runtime.
+  int getContainerLength(AbstractValue value);
+
+  /// Returns `true` if [value] represents a map value at runtime.
+  bool isMap(covariant AbstractValue value);
+
+  /// Creates a map value specialization of [originalValue] with the inferred
+  /// [key] and [value] runtime values.
+  ///
+  /// The [allocationNode] is used to identify this particular map allocation.
+  /// The [allocationElement] is used only for debugging.
+  AbstractValue createMapValue(
+      AbstractValue originalValue,
+      Object allocationNode,
+      MemberEntity allocationElement,
+      AbstractValue key,
+      AbstractValue value);
+
+  /// Returns the key type of [value] if it represents a map value at runtime.
+  /// Returns [dynamicType] otherwise.
+  AbstractValue getMapKeyType(AbstractValue value);
+
+  /// Returns the value type of [value] if it represents a map value at runtime.
+  /// Returns [dynamicType] otherwise.
+  AbstractValue getMapValueType(AbstractValue value);
+
+  /// Returns `true` if [value] represents a dictionary value, that is, a map
+  /// with strings as keys, at runtime.
+  bool isDictionary(covariant AbstractValue value);
+
+  /// Creates a dictionary value specialization of [originalValue] with the
+  /// inferred [key] and [value] runtime values.
+  ///
+  /// The [allocationNode] is used to identify this particular map allocation.
+  /// The [allocationElement] is used only for debugging.
+  AbstractValue createDictionaryValue(
+      AbstractValue originalValue,
+      Object allocationNode,
+      MemberEntity allocationElement,
+      AbstractValue key,
+      AbstractValue value,
+      Map<String, AbstractValue> mappings);
+
+  /// Returns `true` if [value] is a dictionary value which contains [key] as
+  /// a key.
+  bool containsDictionaryKey(AbstractValue value, String key);
+
+  /// Returns the value type for [key] in [value] if it represents a dictionary
+  /// value at runtime. Returns [dynamicType] otherwise.
+  AbstractValue getDictionaryValueForKey(AbstractValue value, String key);
+
+  /// Returns `true` if [specialization] is a specialization of
+  /// [generalization].
+  ///
+  /// Specializations are created through [createPrimitiveValue],
+  /// [createMapValue], [createDictionaryValue] and [createContainerValue].
+  bool isSpecializationOf(
+      AbstractValue specialization, AbstractValue generalization);
+
+  /// Returns the value of which [value] is a specialization. Return `null` if
+  /// [value] is not a specialization.
+  ///
+  /// Specializations are created through [createPrimitiveValue],
+  /// [createMapValue], [createDictionaryValue] and [createContainerValue].
+  AbstractValue getGeneralization(AbstractValue value);
+
+  /// Return the object identifying the allocation of [value] if it is an
+  /// allocation based specialization. Otherwise returns `null`.
+  ///
+  /// Allocation based specializations are created through [createMapValue],
+  /// [createDictionaryValue] and [createContainerValue]
+  Object getAllocationNode(AbstractValue value);
+
+  /// Return the allocation element of [value] if it is an allocation based
+  /// specialization. Otherwise returns `null`.
+  ///
+  /// Allocation based specializations are created through [createMapValue],
+  /// [createDictionaryValue] and [createContainerValue]
+  MemberEntity getAllocationElement(AbstractValue value);
+
+  /// Returns `true` if [value] a known primitive JavaScript value at runtime.
+  bool isPrimitiveValue(covariant AbstractValue value);
+
+  /// Creates a primitive value specialization of [originalValue] with the
+  /// inferred primitive constant [value].
+  AbstractValue createPrimitiveValue(
+      AbstractValue originalValue, PrimitiveConstantValue value);
+
+  /// Returns the primitive JavaScript value of [value] if it represents a
+  /// primitive JavaScript value at runtime, value at runtime. Returns `null`
+  /// otherwise.
+  PrimitiveConstantValue getPrimitiveValue(covariant AbstractValue value);
+
+  /// Compute the type of all potential receivers of the set of live [members].
+  AbstractValue computeReceiver(Iterable<MemberEntity> members);
+
+  /// Returns an [AbstractBool] that describes whether [member] is a potential
+  /// target when being invoked on a [receiver]. [name] is used to ensure
+  /// library privacy is taken into account.
+  AbstractBool isTargetingMember(
+      AbstractValue receiver, MemberEntity member, Name name);
+
+  /// Returns an [AbstractBool] that describes whether [selector] invoked on a
+  /// [receiver] can hit a [noSuchMethod].
+  AbstractBool needsNoSuchMethodHandling(
+      AbstractValue receiver, Selector selector);
+
+  /// Returns an [AbstractBool] that describes if the set of runtime values of
+  /// [subset] are known to all be in the set of runtime values of [superset].
+  AbstractBool contains(AbstractValue superset, AbstractValue subset);
+
+  /// Returns an [AbstractBool] that describes if the set of runtime values of
+  /// [subset] are known to all be in the set of runtime values of [superset].
+  AbstractBool isIn(AbstractValue subset, AbstractValue superset);
+
+  /// Returns the [MemberEntity] that is known to always be hit at runtime
+  /// [receiver].
+  ///
+  /// Returns `null` if 0 or more than 1 member can be hit at runtime.
+  MemberEntity locateSingleMember(AbstractValue receiver, Selector selector);
+
+  /// Returns an [AbstractBool] that describes if [value] is known to be an
+  /// indexable JavaScript value at runtime.
+  AbstractBool isJsIndexable(covariant AbstractValue value);
+
+  /// RReturns an [AbstractBool] that describes if [value] is known to be an
+  /// indexable or iterable JavaScript value at runtime.
+  ///
+  /// JavaScript arrays are both indexable and iterable whereas JavaScript
+  /// strings are indexable but not iterable.
+  AbstractBool isJsIndexableAndIterable(AbstractValue value);
+
+  /// Returns an [AbstractBool] that describes if [value] is known to be a
+  /// JavaScript indexable of fixed length.
+  AbstractBool isFixedLengthJsIndexable(AbstractValue value);
+
+  /// Returns compact a textual representation for [value] used for debugging.
+  String getCompactText(AbstractValue value);
+
+  /// Deserializes an [AbstractValue] for this domain from [source].
+  AbstractValue readAbstractValueFromDataSource(DataSource source);
+
+  /// Serializes this [value] for this domain to [sink].
+  void writeAbstractValueToDataSink(DataSink sink, AbstractValue value);
+}
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index c494d4d..204cdce 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -12,14 +12,16 @@
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
+import '../ir/static_type_provider.dart';
+import '../ir/util.dart';
 import '../js_backend/backend.dart';
 import '../js_model/element_map.dart';
 import '../js_model/locals.dart' show JumpVisitor;
-import '../js_model/js_strategy.dart';
+import '../js_model/js_world.dart';
 import '../native/behavior.dart';
 import '../options.dart';
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
 import '../universe/selector.dart';
 import '../universe/side_effects.dart';
 import 'inferrer_engine.dart';
@@ -27,10 +29,6 @@
 import 'type_graph_nodes.dart';
 import 'type_system.dart';
 
-/// Whether the static type of property gets and method invocations is used
-/// to narrow the inferred type in strong mode.
-bool useStaticResultTypes = false;
-
 /// [KernelTypeGraphBuilder] constructs a type-inference graph for a particular
 /// element.
 ///
@@ -48,28 +46,79 @@
   final GlobalTypeInferenceElementData _memberData;
   final bool _inGenerativeConstructor;
 
-  LocalsHandler _locals;
+  LocalState _stateInternal;
+  LocalState _stateAfterWhenTrueInternal;
+  LocalState _stateAfterWhenFalseInternal;
+
+  /// Returns the current local state for when the boolean value of the most
+  /// recently visited node is not taken into account
+  LocalState get _state {
+    return _stateInternal;
+  }
+
+  /// Sets the current local state for when the boolean value of the most
+  /// recently visited node is not taken into account
+  ///
+  /// This used for when the most recently visited node is not a boolean
+  /// expression and there for also resets [_stateAfterWhenTrue] and
+  /// [_stateAfterWhenFalse] to the same value.
+  void set _state(LocalState value) {
+    _stateInternal = value;
+    _stateAfterWhenTrueInternal = _stateAfterWhenFalseInternal = null;
+  }
+
+  /// Returns the current local state for when the most recently visited node
+  /// has evaluated to `true`.
+  ///
+  /// If the most recently visited node is not a boolean expression then this is
+  /// the same as [_state].
+  LocalState get _stateAfterWhenTrue =>
+      _stateAfterWhenTrueInternal ?? _stateInternal;
+
+  /// Returns the current local state for when the most recently visited node
+  /// has evaluated to `false`.
+  ///
+  /// If the most recently visited node is not a boolean expression then this is
+  /// the same as [_state].
+  LocalState get _stateAfterWhenFalse =>
+      _stateAfterWhenFalseInternal ?? _stateInternal;
+
+  /// Sets the current local state. [base] is the local state for when the
+  /// boolean value of the most recently visited node is not taken into account.
+  /// [whenTrue] and [whenFalse] are the local state for when the boolean value
+  /// of the most recently visited node is `true` or `false`, respectively.
+  void _setStateAfter(
+      LocalState base, LocalState whenTrue, LocalState whenFalse) {
+    _stateInternal = base;
+    _stateAfterWhenTrueInternal = whenTrue;
+    _stateAfterWhenFalseInternal = whenFalse;
+  }
+
   final SideEffectsBuilder _sideEffectsBuilder;
-  final Map<JumpTarget, List<LocalsHandler>> _breaksFor =
-      <JumpTarget, List<LocalsHandler>>{};
-  final Map<JumpTarget, List<LocalsHandler>> _continuesFor =
-      <JumpTarget, List<LocalsHandler>>{};
+  final Map<JumpTarget, List<LocalState>> _breaksFor =
+      <JumpTarget, List<LocalState>>{};
+  final Map<JumpTarget, List<LocalState>> _continuesFor =
+      <JumpTarget, List<LocalState>>{};
   TypeInformation _returnType;
   final Set<Local> _capturedVariables = new Set<Local>();
+  final Map<Local, FieldEntity> _capturedAndBoxed;
 
-  /// Whether we currently collect [IsCheck]s.
+  final StaticTypeProvider _staticTypeProvider;
+
+  /// Whether we currently taken the boolean result of is-checks or null-checks
+  /// into account in the local state.
   bool _accumulateIsChecks = false;
-  bool _conditionIsSimple = false;
 
-  /// The [IsCheck]s that show us what types locals currently _are_.
-  List<IsCheck> _positiveIsChecks;
-
-  /// The [IsCheck]s that show us what types locals currently are _not_.
-  List<IsCheck> _negativeIsChecks;
-
-  KernelTypeGraphBuilder(this._options, this._closedWorld, this._inferrer,
-      this._analyzedMember, this._analyzedNode, this._localsMap,
-      [this._locals])
+  KernelTypeGraphBuilder(
+      this._options,
+      this._closedWorld,
+      this._inferrer,
+      this._analyzedMember,
+      this._analyzedNode,
+      this._localsMap,
+      this._staticTypeProvider,
+      [this._stateInternal,
+      Map<Local, FieldEntity> capturedAndBoxed])
       : this._types = _inferrer.types,
         this._memberData = _inferrer.dataOfMember(_analyzedMember),
         // TODO(johnniwinther): Should side effects also be tracked for field
@@ -78,33 +127,28 @@
             ? _inferrer.inferredDataBuilder
                 .getSideEffectsBuilder(_analyzedMember)
             : new SideEffectsBuilder.free(_analyzedMember),
-        this._inGenerativeConstructor = _analyzedNode is ir.Constructor {
-    if (_locals != null) return;
+        this._inGenerativeConstructor = _analyzedNode is ir.Constructor,
+        this._capturedAndBoxed = capturedAndBoxed != null
+            ? new Map<Local, FieldEntity>.from(capturedAndBoxed)
+            : <Local, FieldEntity>{} {
+    if (_state != null) return;
 
-    FieldInitializationScope fieldScope =
-        _inGenerativeConstructor ? new FieldInitializationScope(_types) : null;
-    _locals = new LocalsHandler(
-        _inferrer, _types, _options, _analyzedNode, fieldScope);
+    _state = new LocalState.initial(
+        inGenerativeConstructor: _inGenerativeConstructor);
   }
 
   JsToElementMap get _elementMap => _closedWorld.elementMap;
 
   ClosureData get _closureDataLookup => _closedWorld.closureDataLookup;
 
+  DartType _getStaticType(ir.Expression node) {
+    return _elementMap.getDartType(_staticTypeProvider.getStaticType(node));
+  }
+
   int _loopLevel = 0;
 
   bool get inLoop => _loopLevel > 0;
 
-  bool get _isThisExposed {
-    return _inGenerativeConstructor ? _locals.fieldScope.isThisExposed : true;
-  }
-
-  void _markThisAsExposed() {
-    if (_inGenerativeConstructor) {
-      _locals.fieldScope.isThisExposed = true;
-    }
-  }
-
   /// Returns `true` if [member] is defined in a subclass of the current this
   /// type.
   bool _isInClassOrSubclass(MemberEntity member) {
@@ -123,14 +167,14 @@
   /// field is considered to have been read before initialization and the field
   /// is assumed to be potentially `null`.
   void _checkIfExposesThis(Selector selector, AbstractValue mask) {
-    if (_isThisExposed) {
+    if (_state.isThisExposed) {
       // We already consider `this` to have been exposed.
       return;
     }
     if (_inferrer.closedWorld.includesClosureCall(selector, mask)) {
       // TODO(ngeoffray): We could do better here if we knew what we
       // are calling does not expose this.
-      _markThisAsExposed();
+      _state.markThisAsExposed();
     } else {
       _inferrer.forEachElementMatching(selector, mask, (MemberEntity element) {
         if (element != null && element.isField) {
@@ -138,7 +182,7 @@
           if (!selector.isSetter &&
               _isInClassOrSubclass(field) &&
               field.isAssignable &&
-              _locals.fieldScope.readField(field) == null &&
+              _state.readField(field) == null &&
               getFieldInitializer(_elementMap, field) == null) {
             // If the field is being used before this constructor
             // actually had a chance to initialize it, say it can be
@@ -150,7 +194,7 @@
         }
         // TODO(ngeoffray): We could do better here if we knew what we
         // are calling does not expose this.
-        _markThisAsExposed();
+        _state.markThisAsExposed();
         return false;
       });
     }
@@ -171,7 +215,7 @@
     // previous analysis of [outermostElement].
     ScopeInfo scopeInfo = _closureDataLookup.getScopeInfo(_analyzedMember);
     scopeInfo.forEachBoxedVariable((variable, field) {
-      _locals.setCapturedAndBoxed(variable, field);
+      _capturedAndBoxed[variable] = field;
     });
 
     return visit(_analyzedNode);
@@ -193,12 +237,6 @@
         _inferrer.addReturnTypeForMethod(analyzedMethod, _returnType, type);
   }
 
-  void initializationIsIndefinite() {
-    if (_inGenerativeConstructor) {
-      _locals.fieldScope.isIndefinite = true;
-    }
-  }
-
   TypeInformation _thisType;
   TypeInformation get thisType {
     if (_thisType != null) return _thisType;
@@ -226,7 +264,8 @@
   void handleParameter(ir.VariableDeclaration node, {bool isOptional}) {
     Local local = _localsMap.getLocalVariable(node);
     DartType type = _localsMap.getLocalType(_elementMap, local);
-    _locals.update(local, _inferrer.typeOfParameter(local), node, type);
+    _state.updateLocal(_inferrer, _capturedAndBoxed, local,
+        _inferrer.typeOfParameter(local), node, type);
     if (isOptional) {
       TypeInformation type;
       if (node.initializer != null) {
@@ -253,7 +292,7 @@
       _elementMap.elementEnvironment.forEachLocalClassMember(cls,
           (MemberEntity member) {
         if (member.isField && member.isInstanceMember && member.isAssignable) {
-          TypeInformation type = _locals.fieldScope.readField(member);
+          TypeInformation type = _state.readField(member);
           MemberDefinition definition = _elementMap.getMemberDefinition(member);
           assert(definition.kind == MemberKind.regular);
           ir.Field node = definition.node;
@@ -265,7 +304,7 @@
         }
       });
     }
-    _inferrer.recordExposesThis(_analyzedMember, _isThisExposed);
+    _inferrer.recordExposesThis(_analyzedMember, _state.isThisExposed);
 
     if (cls.isAbstract) {
       if (_closedWorld.classHierarchy.isInstantiated(cls)) {
@@ -287,7 +326,7 @@
   visitFieldInitializer(ir.FieldInitializer node) {
     TypeInformation rhsType = visit(node.value);
     FieldEntity field = _elementMap.getField(node.field);
-    _locals.updateField(field, rhsType);
+    _state.updateField(field, rhsType);
     _inferrer.recordTypeOfField(field, rhsType);
     return null;
   }
@@ -304,7 +343,7 @@
 
     _inferrer.analyze(constructor);
     if (_inferrer.checkIfExposesThis(constructor)) {
-      _markThisAsExposed();
+      _state.markThisAsExposed();
     }
     return null;
   }
@@ -321,7 +360,7 @@
 
     _inferrer.analyze(constructor);
     if (_inferrer.checkIfExposesThis(constructor)) {
-      _markThisAsExposed();
+      _state.markThisAsExposed();
     }
     return null;
   }
@@ -359,10 +398,10 @@
       case ir.AsyncMarker.Sync:
         if (_returnType == null) {
           // No return in the body.
-          _returnType = _locals.seenReturnOrThrow
+          _returnType = _state.seenReturnOrThrow
               ? _types.nonNullEmpty() // Body always throws.
               : _types.nullType;
-        } else if (!_locals.seenReturnOrThrow) {
+        } else if (!_state.seenReturnOrThrow) {
           // We haven'TypeInformation seen returns on all branches. So the
           // method may also return null.
           recordReturnType(_types.nullType);
@@ -422,7 +461,7 @@
   visitBlock(ir.Block block) {
     for (ir.Statement statement in block.statements) {
       visit(statement);
-      if (_locals.aborts) break;
+      if (_state.aborts) break;
     }
     return null;
   }
@@ -447,34 +486,29 @@
     }
     // TODO(johnniwinther): Should assert be used with --trust-type-annotations?
     // TODO(johnniwinther): Track reachable for assertions known to fail.
-    List<IsCheck> positiveTests = <IsCheck>[];
-    List<IsCheck> negativeTests = <IsCheck>[];
-    bool simpleCondition =
-        handleCondition(node.condition, positiveTests, negativeTests);
-    LocalsHandler saved = _locals;
-    _locals = new LocalsHandler.from(_locals, node);
-    _updateIsChecks(positiveTests, negativeTests);
-
-    LocalsHandler thenLocals = _locals;
-    _locals = new LocalsHandler.from(saved, node);
-    if (simpleCondition) _updateIsChecks(negativeTests, positiveTests);
+    LocalState stateBefore = _state;
+    handleCondition(node.condition);
+    LocalState afterConditionWhenTrue = _stateAfterWhenTrue;
+    LocalState afterConditionWhenFalse = _stateAfterWhenFalse;
+    _state = new LocalState.childPath(afterConditionWhenFalse);
     visit(node.message);
-    _locals.seenReturnOrThrow = true;
-    saved.mergeDiamondFlow(thenLocals, _locals);
-    _locals = saved;
+    LocalState stateAfterMessage = _state;
+    stateAfterMessage.seenReturnOrThrow = true;
+    _state = stateBefore.mergeDiamondFlow(
+        _inferrer, afterConditionWhenTrue, stateAfterMessage);
     return null;
   }
 
   @override
   visitBreakStatement(ir.BreakStatement node) {
     JumpTarget target = _localsMap.getJumpTargetForBreak(node);
-    _locals.seenBreakOrContinue = true;
+    _state.seenBreakOrContinue = true;
     // Do a deep-copy of the locals, because the code following the
     // break will change them.
     if (_localsMap.generateContinueForBreak(node)) {
-      _continuesFor[target].add(new LocalsHandler.deepCopyOf(_locals));
+      _continuesFor[target].add(new LocalState.deepCopyOf(_state));
     } else {
-      _breaksFor[target].add(new LocalsHandler.deepCopyOf(_locals));
+      _breaksFor[target].add(new LocalState.deepCopyOf(_state));
     }
     return null;
   }
@@ -489,7 +523,7 @@
       JumpTarget jumpTarget = _localsMap.getJumpTargetForLabel(node);
       _setupBreaksAndContinues(jumpTarget);
       visit(body);
-      _locals.mergeAfterBreaks(_getBreaks(jumpTarget));
+      _state.mergeAfterBreaks(_inferrer, _getBreaks(jumpTarget));
       _clearBreaksAndContinues(jumpTarget);
     }
     return null;
@@ -517,35 +551,38 @@
       // visit all cases and update [locals] until we have reached a
       // fixed point.
       bool changed;
-      _locals.startLoop(node);
+      _state.startLoop(_inferrer, node);
       do {
         changed = false;
         for (ir.SwitchCase switchCase in node.cases) {
-          LocalsHandler saved = _locals;
-          _locals = new LocalsHandler.from(_locals, switchCase);
+          LocalState stateBeforeCase = _state;
+          _state = new LocalState.childPath(stateBeforeCase);
           visit(switchCase);
-          changed = saved.mergeAll([_locals]) || changed;
-          _locals = saved;
+          LocalState stateAfterCase = _state;
+          changed =
+              stateBeforeCase.mergeAll(_inferrer, [stateAfterCase]) || changed;
+          _state = stateBeforeCase;
         }
       } while (changed);
-      _locals.endLoop(node);
+      _state.endLoop(_inferrer, node);
 
       continueTargets.forEach(_clearBreaksAndContinues);
     } else {
-      LocalsHandler saved = _locals;
-      List<LocalsHandler> localsToMerge = <LocalsHandler>[];
+      LocalState stateBeforeCase = _state;
+      List<LocalState> statesToMerge = <LocalState>[];
       bool hasDefaultCase = false;
 
       for (ir.SwitchCase switchCase in node.cases) {
         if (switchCase.isDefault) {
           hasDefaultCase = true;
         }
-        _locals = new LocalsHandler.from(saved, switchCase);
+        _state = new LocalState.childPath(stateBeforeCase);
         visit(switchCase);
-        localsToMerge.add(_locals);
+        statesToMerge.add(_state);
       }
-      saved.mergeAfterBreaks(localsToMerge, keepOwnLocals: !hasDefaultCase);
-      _locals = saved;
+      stateBeforeCase.mergeAfterBreaks(_inferrer, statesToMerge,
+          keepOwnLocals: !hasDefaultCase);
+      _state = stateBeforeCase;
     }
     _clearBreaksAndContinues(jumpTarget);
     return null;
@@ -560,10 +597,10 @@
   @override
   visitContinueSwitchStatement(ir.ContinueSwitchStatement node) {
     JumpTarget target = _localsMap.getJumpTargetForContinueSwitch(node);
-    _locals.seenBreakOrContinue = true;
+    _state.seenBreakOrContinue = true;
     // Do a deep-copy of the locals, because the code following the
     // break will change them.
-    _continuesFor[target].add(new LocalsHandler.deepCopyOf(_locals));
+    _continuesFor[target].add(new LocalState.deepCopyOf(_state));
     return null;
   }
 
@@ -613,8 +650,8 @@
   TypeInformation visitReturnStatement(ir.ReturnStatement node) {
     ir.Node expression = node.expression;
     recordReturnType(expression == null ? _types.nullType : visit(expression));
-    _locals.seenReturnOrThrow = true;
-    initializationIsIndefinite();
+    _state.seenReturnOrThrow = true;
+    _state.markInitializationAsIndefinite();
     return null;
   }
 
@@ -682,12 +719,14 @@
     Local local = _localsMap.getLocalVariable(node);
     DartType type = _localsMap.getLocalType(_elementMap, local);
     if (node.initializer == null) {
-      _locals.update(local, _types.nullType, node, type);
+      _state.updateLocal(
+          _inferrer, _capturedAndBoxed, local, _types.nullType, node, type);
     } else {
-      _locals.update(local, visit(node.initializer), node, type);
+      _state.updateLocal(_inferrer, _capturedAndBoxed, local,
+          visit(node.initializer), node, type);
     }
     if (node.initializer is ir.ThisExpression) {
-      _markThisAsExposed();
+      _state.markThisAsExposed();
     }
     return null;
   }
@@ -695,7 +734,8 @@
   @override
   TypeInformation visitVariableGet(ir.VariableGet node) {
     Local local = _localsMap.getLocalVariable(node.variable);
-    TypeInformation type = _locals.use(local);
+    TypeInformation type =
+        _state.readLocal(_inferrer, _capturedAndBoxed, local);
     assert(type != null, "Missing type information for $local.");
     return type;
   }
@@ -704,11 +744,12 @@
   TypeInformation visitVariableSet(ir.VariableSet node) {
     TypeInformation rhsType = visit(node.value);
     if (node.value is ir.ThisExpression) {
-      _markThisAsExposed();
+      _state.markThisAsExposed();
     }
     Local local = _localsMap.getLocalVariable(node.variable);
     DartType type = _localsMap.getLocalType(_elementMap, local);
-    _locals.update(local, rhsType, node, type);
+    _state.updateLocal(
+        _inferrer, _capturedAndBoxed, local, rhsType, node, type);
     return rhsType;
   }
 
@@ -719,7 +760,7 @@
       // TODO(ngeoffray): We could do better here if we knew what we
       // are calling does not expose this.
       if (argument is ir.ThisExpression) {
-        _markThisAsExposed();
+        _state.markThisAsExposed();
       }
       positional.add(visit(argument));
     }
@@ -729,7 +770,7 @@
       // TODO(ngeoffray): We could do better here if we knew what we
       // are calling does not expose this.
       if (value is ir.ThisExpression) {
-        _markThisAsExposed();
+        _state.markThisAsExposed();
       }
       named[argument.name] = visit(value);
     }
@@ -755,8 +796,12 @@
 
       TypeInformation type =
           handleStaticInvoke(node, selector, mask, info.callMethod, arguments);
-      if (useStaticResultTypes) {
-        type = _types.narrowType(type, _elementMap.getStaticType(node));
+      FunctionType functionType =
+          _elementMap.elementEnvironment.getFunctionType(info.callMethod);
+      if (functionType.returnType.containsFreeTypeVariables) {
+        // The return type varies with the call site so we narrow the static
+        // return type.
+        type = _types.narrowType(type, _getStaticType(node));
       }
       return type;
     }
@@ -780,8 +825,29 @@
     }
     TypeInformation type = handleDynamicInvoke(
         CallType.access, node, selector, mask, receiverType, arguments);
-    if (useStaticResultTypes) {
-      type = _types.narrowType(type, _elementMap.getStaticType(node));
+    ir.Member interfaceTarget = node.interfaceTarget;
+    if (interfaceTarget != null) {
+      if (interfaceTarget is ir.Procedure &&
+          (interfaceTarget.kind == ir.ProcedureKind.Method ||
+              interfaceTarget.kind == ir.ProcedureKind.Operator)) {
+        // Pull the type from kernel (instead of from the J-model) because the
+        // interface target might be abstract and therefore not part of the
+        // J-model.
+        ir.DartType returnType = interfaceTarget.function.returnType;
+        // The return type varies with the call site so we narrow the static
+        // return type.
+        if (containsFreeVariables(returnType)) {
+          type = _types.narrowType(type, _getStaticType(node));
+        }
+      } else {
+        // The return type is thrown away when using [TypeMask]s; narrow to the
+        // static return type.
+        type = _types.narrowType(type, _getStaticType(node));
+      }
+    } else {
+      // We don't have a known target but the static type hold some information
+      // if it is a function type.
+      type = _types.narrowType(type, _getStaticType(node));
     }
     return type;
   }
@@ -820,7 +886,8 @@
         TypeInformation refinedType = _types
             .refineReceiver(selector, mask, receiverType, isConditional: false);
         DartType type = _localsMap.getLocalType(_elementMap, local);
-        _locals.update(local, refinedType, node, type);
+        _state.updateLocal(
+            _inferrer, _capturedAndBoxed, local, refinedType, node, type);
         List<Refinement> refinements = _localRefinementMap[variable];
         if (refinements != null) {
           refinements.add(new Refinement(selector, mask));
@@ -903,12 +970,14 @@
       if (refinements.isNotEmpty) {
         Local local = _localsMap.getLocalVariable(alias);
         DartType type = _localsMap.getLocalType(_elementMap, local);
-        TypeInformation localType = _locals.use(local);
+        TypeInformation localType =
+            _state.readLocal(_inferrer, _capturedAndBoxed, local);
         for (Refinement refinement in refinements) {
           localType = _types.refineReceiver(
               refinement.selector, refinement.mask, localType,
               isConditional: true);
-          _locals.update(local, localType, node, type);
+          _state.updateLocal(
+              _inferrer, _capturedAndBoxed, local, localType, node, type);
         }
       }
     }
@@ -920,7 +989,7 @@
     if (node.iterable is ir.ThisExpression) {
       // Any reasonable implementation of an iterator would expose
       // this, so we play it safe and assume it will.
-      _markThisAsExposed();
+      _state.markThisAsExposed();
     }
 
     AbstractValue currentMask;
@@ -961,7 +1030,8 @@
 
     Local variable = _localsMap.getLocalVariable(node.variable);
     DartType variableType = _localsMap.getLocalType(_elementMap, variable);
-    _locals.update(variable, currentType, node.variable, variableType);
+    _state.updateLocal(_inferrer, _capturedAndBoxed, variable, currentType,
+        node.variable, variableType);
 
     JumpTarget target = _localsMap.getJumpTargetForForIn(node);
     return handleLoop(node, target, () {
@@ -972,10 +1042,10 @@
   void _setupBreaksAndContinues(JumpTarget target) {
     if (target == null) return;
     if (target.isContinueTarget) {
-      _continuesFor[target] = <LocalsHandler>[];
+      _continuesFor[target] = <LocalState>[];
     }
     if (target.isBreakTarget) {
-      _breaksFor[target] = <LocalsHandler>[];
+      _breaksFor[target] = <LocalState>[];
     }
   }
 
@@ -984,15 +1054,15 @@
     _breaksFor.remove(element);
   }
 
-  List<LocalsHandler> _getBreaks(JumpTarget target) {
-    List<LocalsHandler> list = <LocalsHandler>[_locals];
+  List<LocalState> _getBreaks(JumpTarget target) {
+    List<LocalState> list = <LocalState>[_state];
     if (target == null) return list;
     if (!target.isBreakTarget) return list;
     return list..addAll(_breaksFor[target]);
   }
 
-  List<LocalsHandler> _getLoopBackEdges(JumpTarget target) {
-    List<LocalsHandler> list = <LocalsHandler>[_locals];
+  List<LocalState> _getLoopBackEdges(JumpTarget target) {
+    List<LocalState> list = <LocalState>[_state];
     if (target == null) return list;
     if (!target.isContinueTarget) return list;
     return list..addAll(_continuesFor[target]);
@@ -1001,21 +1071,21 @@
   TypeInformation handleLoop(ir.Node node, JumpTarget target, void logic()) {
     _loopLevel++;
     bool changed = false;
-    LocalsHandler saved = _locals;
-    saved.startLoop(node);
+    LocalState stateBefore = _state;
+    stateBefore.startLoop(_inferrer, node);
     do {
       // Setup (and clear in case of multiple iterations of the loop)
       // the lists of breaks and continues seen in the loop.
       _setupBreaksAndContinues(target);
-      _locals = new LocalsHandler.from(saved, node);
+      _state = new LocalState.childPath(stateBefore);
       logic();
-      changed = saved.mergeAll(_getLoopBackEdges(target));
+      changed = stateBefore.mergeAll(_inferrer, _getLoopBackEdges(target));
     } while (changed);
     _loopLevel--;
-    saved.endLoop(node);
+    stateBefore.endLoop(_inferrer, node);
     bool keepOwnLocals = node is! ir.DoStatement;
-    saved.mergeAfterBreaks(_getBreaks(target), keepOwnLocals: keepOwnLocals);
-    _locals = saved;
+    _state = stateBefore.mergeAfterBreaks(_inferrer, _getBreaks(target),
+        keepOwnLocals: keepOwnLocals);
     _clearBreaksAndContinues(target);
     return null;
   }
@@ -1177,18 +1247,16 @@
     } else if (member.isConstructor) {
       return handleConstructorInvoke(
           node, node.arguments, selector, mask, member, arguments);
-    } else if (member.isFunction) {
+    } else {
+      assert(member.isFunction, "Unexpected static invocation target: $member");
       TypeInformation type =
           handleStaticInvoke(node, selector, mask, member, arguments);
-      if (useStaticResultTypes) {
-        type = _types.narrowType(type, _elementMap.getStaticType(node));
-      }
-      return type;
-    } else {
-      TypeInformation type =
-          handleClosureCall(node, selector, mask, member, arguments);
-      if (useStaticResultTypes) {
-        type = _types.narrowType(type, _elementMap.getStaticType(node));
+      FunctionType functionType =
+          _elementMap.elementEnvironment.getFunctionType(member);
+      if (functionType.returnType.containsFreeTypeVariables) {
+        // The return type varies with the call site so we narrow the static
+        // return type.
+        type = _types.narrowType(type, _getStaticType(node));
       }
       return type;
     }
@@ -1204,19 +1272,15 @@
   TypeInformation visitStaticGet(ir.StaticGet node) {
     MemberEntity member = _elementMap.getMember(node.target);
     AbstractValue mask = _memberData.typeOfSend(node);
-    TypeInformation type = handleStaticInvoke(
+    return handleStaticInvoke(
         node, new Selector.getter(member.memberName), mask, member, null);
-    if (useStaticResultTypes) {
-      type = _types.narrowType(type, _elementMap.getStaticType(node));
-    }
-    return type;
   }
 
   @override
   TypeInformation visitStaticSet(ir.StaticSet node) {
     TypeInformation rhsType = visit(node.value);
     if (node.value is ir.ThisExpression) {
-      _markThisAsExposed();
+      _state.markThisAsExposed();
     }
     MemberEntity member = _elementMap.getMember(node.target);
     AbstractValue mask = _memberData.typeOfSend(node);
@@ -1225,37 +1289,41 @@
     return rhsType;
   }
 
-  @override
-  TypeInformation visitPropertyGet(ir.PropertyGet node) {
-    TypeInformation receiverType = visit(node.receiver);
+  TypeInformation handlePropertyGet(
+      ir.TreeNode node, TypeInformation receiverType, ir.Member interfaceTarget,
+      {bool isThis}) {
     Selector selector = _elementMap.getSelector(node);
     AbstractValue mask = _memberData.typeOfSend(node);
-    // TODO(johnniwinther): Use `node.interfaceTarget` to narrow the receiver
-    // type for --trust-type-annotations/strong-mode.
-    if (node.receiver is ir.ThisExpression) {
+    if (isThis) {
       _checkIfExposesThis(
           selector, _types.newTypedSelector(receiverType, mask));
     }
     TypeInformation type = handleDynamicGet(node, selector, mask, receiverType);
-    if (useStaticResultTypes) {
-      type = _types.narrowType(type, _elementMap.getStaticType(node));
+    if (interfaceTarget != null) {
+      // Pull the type from kernel (instead of from the J-model) because the
+      // interface target might be abstract and therefore not part of the
+      // J-model.
+      ir.DartType resultType = interfaceTarget.getterType;
+      // The result type varies with the call site so we narrow the static
+      // result type.
+      if (containsFreeVariables(resultType)) {
+        type = _types.narrowType(type, _getStaticType(node));
+      }
     }
     return type;
   }
 
   @override
+  TypeInformation visitPropertyGet(ir.PropertyGet node) {
+    TypeInformation receiverType = visit(node.receiver);
+    return handlePropertyGet(node, receiverType, node.interfaceTarget,
+        isThis: node.receiver is ir.ThisExpression);
+  }
+
+  @override
   TypeInformation visitDirectPropertyGet(ir.DirectPropertyGet node) {
     TypeInformation receiverType = thisType;
-    MemberEntity member = _elementMap.getMember(node.target);
-    AbstractValue mask = _memberData.typeOfSend(node);
-    // TODO(johnniwinther): Use `node.target` to narrow the receiver type.
-    Selector selector = new Selector.getter(member.memberName);
-    _checkIfExposesThis(selector, _types.newTypedSelector(receiverType, mask));
-    TypeInformation type = handleDynamicGet(node, selector, mask, receiverType);
-    if (useStaticResultTypes) {
-      type = _types.narrowType(type, _elementMap.getStaticType(node));
-    }
-    return type;
+    return handlePropertyGet(node, receiverType, node.target, isThis: true);
   }
 
   @override
@@ -1266,7 +1334,7 @@
 
     TypeInformation rhsType = visit(node.value);
     if (node.value is ir.ThisExpression) {
-      _markThisAsExposed();
+      _state.markThisAsExposed();
     }
 
     if (_inGenerativeConstructor && node.receiver is ir.ThisExpression) {
@@ -1281,7 +1349,7 @@
           MemberEntity single = targets.first;
           if (single.isField) {
             FieldEntity field = single;
-            _locals.updateField(field, rhsType);
+            _state.updateField(field, rhsType);
           }
         }
       }
@@ -1299,33 +1367,24 @@
     return thisType;
   }
 
-  bool handleCondition(
-      ir.Node node, List<IsCheck> positiveTests, List<IsCheck> negativeTests) {
-    bool oldConditionIsSimple = _conditionIsSimple;
+  void handleCondition(ir.Node node) {
     bool oldAccumulateIsChecks = _accumulateIsChecks;
-    List<IsCheck> oldPositiveIsChecks = _positiveIsChecks;
-    List<IsCheck> oldNegativeIsChecks = _negativeIsChecks;
     _accumulateIsChecks = true;
-    _conditionIsSimple = true;
-    _positiveIsChecks = positiveTests;
-    _negativeIsChecks = negativeTests;
     visit(node, conditionContext: true);
-    bool simpleCondition = _conditionIsSimple;
     _accumulateIsChecks = oldAccumulateIsChecks;
-    _positiveIsChecks = oldPositiveIsChecks;
-    _negativeIsChecks = oldNegativeIsChecks;
-    _conditionIsSimple = oldConditionIsSimple;
-    return simpleCondition;
   }
 
   void _potentiallyAddIsCheck(ir.IsExpression node) {
     if (!_accumulateIsChecks) return;
     ir.Expression operand = node.operand;
     if (operand is ir.VariableGet) {
-      _positiveIsChecks.add(new IsCheck(
-          node,
-          _localsMap.getLocalVariable(operand.variable),
-          _elementMap.getDartType(node.type)));
+      Local local = _localsMap.getLocalVariable(operand.variable);
+      DartType type = _elementMap.getDartType(node.type);
+      LocalState stateAfterCheckWhenTrue = new LocalState.childPath(_state);
+      LocalState stateAfterCheckWhenFalse = new LocalState.childPath(_state);
+      stateAfterCheckWhenTrue.narrowLocal(
+          _inferrer, _capturedAndBoxed, local, type, node);
+      _setStateAfter(_state, stateAfterCheckWhenTrue, stateAfterCheckWhenFalse);
     }
   }
 
@@ -1333,121 +1392,89 @@
       ir.MethodInvocation node, ir.Expression receiver) {
     if (!_accumulateIsChecks) return;
     if (receiver is ir.VariableGet) {
-      _positiveIsChecks.add(new IsCheck(
-          node, _localsMap.getLocalVariable(receiver.variable), null));
-    }
-  }
-
-  void _updateIsChecks(
-      List<IsCheck> positiveTests, List<IsCheck> negativeTests) {
-    for (IsCheck check in positiveTests) {
-      if (check.type != null) {
-        _locals.narrow(check.local, check.type, check.node);
-      } else {
-        DartType localType = _localsMap.getLocalType(_elementMap, check.local);
-        _locals.update(check.local, _types.nullType, check.node, localType);
-      }
-    }
-    for (IsCheck check in negativeTests) {
-      if (check.type != null) {
-        // TODO(johnniwinther): Use negative type knowledge.
-      } else {
-        _locals.narrow(
-            check.local, _closedWorld.commonElements.objectType, check.node);
-      }
+      Local local = _localsMap.getLocalVariable(receiver.variable);
+      DartType localType = _localsMap.getLocalType(_elementMap, local);
+      LocalState stateAfterCheckWhenTrue = new LocalState.childPath(_state);
+      LocalState stateAfterCheckWhenFalse = new LocalState.childPath(_state);
+      stateAfterCheckWhenTrue.updateLocal(_inferrer, _capturedAndBoxed, local,
+          _types.nullType, node, localType);
+      stateAfterCheckWhenFalse.narrowLocal(_inferrer, _capturedAndBoxed, local,
+          _closedWorld.commonElements.objectType, node);
+      _setStateAfter(_state, stateAfterCheckWhenTrue, stateAfterCheckWhenFalse);
     }
   }
 
   @override
   TypeInformation visitIfStatement(ir.IfStatement node) {
-    List<IsCheck> positiveTests = <IsCheck>[];
-    List<IsCheck> negativeTests = <IsCheck>[];
-    bool simpleCondition =
-        handleCondition(node.condition, positiveTests, negativeTests);
-    LocalsHandler saved = _locals;
-    _locals = new LocalsHandler.from(_locals, node);
-    _updateIsChecks(positiveTests, negativeTests);
+    LocalState stateBefore = _state;
+    handleCondition(node.condition);
+    LocalState stateAfterConditionWhenTrue = _stateAfterWhenTrue;
+    LocalState stateAfterConditionWhenFalse = _stateAfterWhenFalse;
+    _state = new LocalState.childPath(stateAfterConditionWhenTrue);
     visit(node.then);
-    LocalsHandler thenLocals = _locals;
-    _locals = new LocalsHandler.from(saved, node);
-    if (simpleCondition) {
-      _updateIsChecks(negativeTests, positiveTests);
-    }
+    LocalState stateAfterThen = _state;
+    _state = new LocalState.childPath(stateAfterConditionWhenFalse);
     visit(node.otherwise);
-    saved.mergeDiamondFlow(thenLocals, _locals);
-    _locals = saved;
+    LocalState stateAfterElse = _state;
+    _state =
+        stateBefore.mergeDiamondFlow(_inferrer, stateAfterThen, stateAfterElse);
     return null;
   }
 
   @override
   TypeInformation visitIsExpression(ir.IsExpression node) {
-    _potentiallyAddIsCheck(node);
     visit(node.operand);
+    _potentiallyAddIsCheck(node);
     return _types.boolType;
   }
 
   @override
   TypeInformation visitNot(ir.Not node) {
-    List<IsCheck> temp = _positiveIsChecks;
-    _positiveIsChecks = _negativeIsChecks;
-    _negativeIsChecks = temp;
     visit(node.operand, conditionContext: _accumulateIsChecks);
-    temp = _positiveIsChecks;
-    _positiveIsChecks = _negativeIsChecks;
-    _negativeIsChecks = temp;
+    LocalState stateAfterOperandWhenTrue = _stateAfterWhenTrue;
+    LocalState stateAfterOperandWhenFalse = _stateAfterWhenFalse;
+    _setStateAfter(
+        _state, stateAfterOperandWhenFalse, stateAfterOperandWhenTrue);
     return _types.boolType;
   }
 
   @override
   TypeInformation visitLogicalExpression(ir.LogicalExpression node) {
     if (node.operator == '&&') {
-      _conditionIsSimple = false;
-      bool oldAccumulateIsChecks = _accumulateIsChecks;
-      List<IsCheck> oldPositiveIsChecks = _positiveIsChecks;
-      List<IsCheck> oldNegativeIsChecks = _negativeIsChecks;
-      if (!_accumulateIsChecks) {
-        _accumulateIsChecks = true;
-        _positiveIsChecks = <IsCheck>[];
-        _negativeIsChecks = <IsCheck>[];
-      }
-      visit(node.left, conditionContext: _accumulateIsChecks);
-      LocalsHandler saved = _locals;
-      _locals = new LocalsHandler.from(_locals, node);
-      _updateIsChecks(_positiveIsChecks, _negativeIsChecks);
-      LocalsHandler narrowed;
-      if (oldAccumulateIsChecks) {
-        narrowed = new LocalsHandler.topLevelCopyOf(_locals);
-      } else {
-        _accumulateIsChecks = false;
-        _positiveIsChecks = oldPositiveIsChecks;
-        _negativeIsChecks = oldNegativeIsChecks;
-      }
-      visit(node.right, conditionContext: _accumulateIsChecks);
-      if (oldAccumulateIsChecks) {
-        bool invalidatedInRightHandSide(IsCheck check) {
-          return narrowed.locals[check.local] != _locals.locals[check.local];
-        }
-
-        _positiveIsChecks.removeWhere(invalidatedInRightHandSide);
-        _negativeIsChecks.removeWhere(invalidatedInRightHandSide);
-      }
-      saved.mergeDiamondFlow(_locals, null);
-      _locals = saved;
+      LocalState stateBefore = _state;
+      _state = new LocalState.childPath(stateBefore);
+      handleCondition(node.left);
+      LocalState stateAfterLeftWhenTrue = _stateAfterWhenTrue;
+      LocalState stateAfterLeftWhenFalse = _stateAfterWhenFalse;
+      _state = new LocalState.childPath(stateAfterLeftWhenTrue);
+      handleCondition(node.right);
+      LocalState stateAfterRightWhenTrue = _stateAfterWhenTrue;
+      LocalState stateAfterRightWhenFalse = _stateAfterWhenFalse;
+      LocalState stateAfterWhenTrue = stateAfterRightWhenTrue;
+      LocalState stateAfterWhenFalse = new LocalState.childPath(stateBefore)
+          .mergeDiamondFlow(
+              _inferrer, stateAfterLeftWhenFalse, stateAfterRightWhenFalse);
+      LocalState after = stateBefore.mergeDiamondFlow(
+          _inferrer, stateAfterWhenTrue, stateAfterWhenFalse);
+      _setStateAfter(after, stateAfterWhenTrue, stateAfterWhenFalse);
       return _types.boolType;
     } else if (node.operator == '||') {
-      _conditionIsSimple = false;
-      List<IsCheck> positiveIsChecks = <IsCheck>[];
-      List<IsCheck> negativeIsChecks = <IsCheck>[];
-      bool isSimple =
-          handleCondition(node.left, positiveIsChecks, negativeIsChecks);
-      LocalsHandler saved = _locals;
-      _locals = new LocalsHandler.from(_locals, node);
-      if (isSimple) {
-        _updateIsChecks(negativeIsChecks, positiveIsChecks);
-      }
-      visit(node.right, conditionContext: false);
-      saved.mergeDiamondFlow(_locals, null);
-      _locals = saved;
+      LocalState stateBefore = _state;
+      _state = new LocalState.childPath(stateBefore);
+      handleCondition(node.left);
+      LocalState stateAfterLeftWhenTrue = _stateAfterWhenTrue;
+      LocalState stateAfterLeftWhenFalse = _stateAfterWhenFalse;
+      _state = new LocalState.childPath(stateAfterLeftWhenFalse);
+      handleCondition(node.right);
+      LocalState stateAfterRightWhenTrue = _stateAfterWhenTrue;
+      LocalState stateAfterRightWhenFalse = _stateAfterWhenFalse;
+      LocalState stateAfterWhenTrue = new LocalState.childPath(stateBefore)
+          .mergeDiamondFlow(
+              _inferrer, stateAfterLeftWhenTrue, stateAfterRightWhenTrue);
+      LocalState stateAfterWhenFalse = stateAfterRightWhenFalse;
+      LocalState stateAfter = stateBefore.mergeDiamondFlow(
+          _inferrer, stateAfterWhenTrue, stateAfterWhenFalse);
+      _setStateAfter(stateAfter, stateAfterWhenTrue, stateAfterWhenFalse);
       return _types.boolType;
     }
     failedAt(CURRENT_ELEMENT_SPANNABLE,
@@ -1457,20 +1484,18 @@
 
   @override
   TypeInformation visitConditionalExpression(ir.ConditionalExpression node) {
-    List<IsCheck> positiveTests = <IsCheck>[];
-    List<IsCheck> negativeTests = <IsCheck>[];
-    bool simpleCondition =
-        handleCondition(node.condition, positiveTests, negativeTests);
-    LocalsHandler saved = _locals;
-    _locals = new LocalsHandler.from(_locals, node);
-    _updateIsChecks(positiveTests, negativeTests);
+    LocalState stateBefore = _state;
+    handleCondition(node.condition);
+    LocalState stateAfterWhenTrue = _stateAfterWhenTrue;
+    LocalState stateAfterWhenFalse = _stateAfterWhenFalse;
+    _state = new LocalState.childPath(stateAfterWhenTrue);
     TypeInformation firstType = visit(node.then);
-    LocalsHandler thenLocals = _locals;
-    _locals = new LocalsHandler.from(saved, node);
-    if (simpleCondition) _updateIsChecks(negativeTests, positiveTests);
+    LocalState stateAfterThen = _state;
+    _state = new LocalState.childPath(stateAfterWhenFalse);
     TypeInformation secondType = visit(node.otherwise);
-    saved.mergeDiamondFlow(thenLocals, _locals);
-    _locals = saved;
+    LocalState stateAfterElse = _state;
+    _state =
+        stateBefore.mergeDiamondFlow(_inferrer, stateAfterThen, stateAfterElse);
     return _types.allocateDiamondPhi(firstType, secondType);
   }
 
@@ -1482,21 +1507,24 @@
     // analyzing the closure.
     // TODO(herhut): Analyze whether closure exposes this. Possibly using
     // whether the created closure as a `thisLocal`.
-    _markThisAsExposed();
+    _state.markThisAsExposed();
 
     ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
 
     // Record the types of captured non-boxed variables. Types of
     // these variables may already be there, because of an analysis of
     // a previous closure.
-    info.forEachFreeVariable((variable, field) {
-      if (!info.isVariableBoxed(variable)) {
+    info.forEachFreeVariable((Local variable, FieldEntity field) {
+      if (!info.isBoxedVariable(variable)) {
         if (variable == info.thisLocal) {
           _inferrer.recordTypeOfField(field, thisType);
         }
+        TypeInformation localType =
+            _state.readLocal(_inferrer, _capturedAndBoxed, variable);
         // The type is null for type parameters.
-        if (_locals.locals[variable] == null) return;
-        _inferrer.recordTypeOfField(field, _locals.locals[variable]);
+        if (localType != null) {
+          _inferrer.recordTypeOfField(field, localType);
+        }
       }
       _capturedVariables.add(variable);
     });
@@ -1508,14 +1536,14 @@
     if (variable != null) {
       Local local = _localsMap.getLocalVariable(variable);
       DartType type = _localsMap.getLocalType(_elementMap, local);
-      _locals.update(local, localFunctionType, node, type);
+      _state.updateLocal(
+          _inferrer, _capturedAndBoxed, local, localFunctionType, node, type);
     }
 
     // We don't put the closure in the work queue of the
     // inferrer, because it will share information with its enclosing
     // method, like for example the types of local variables.
-    LocalsHandler closureLocals =
-        new LocalsHandler.from(_locals, node, useOtherTryBlock: false);
+    LocalState closureState = new LocalState.closure(_state);
     KernelTypeGraphBuilder visitor = new KernelTypeGraphBuilder(
         _options,
         _closedWorld,
@@ -1523,7 +1551,9 @@
         info.callMethod,
         functionNode,
         _localsMap,
-        closureLocals);
+        _staticTypeProvider,
+        closureState,
+        _capturedAndBoxed);
     visitor.run();
     _inferrer.recordReturnType(info.callMethod, visitor._returnType);
 
@@ -1543,10 +1573,8 @@
   @override
   visitWhileStatement(ir.WhileStatement node) {
     return handleLoop(node, _localsMap.getJumpTargetForWhile(node), () {
-      List<IsCheck> positiveTests = <IsCheck>[];
-      List<IsCheck> negativeTests = <IsCheck>[];
-      handleCondition(node.condition, positiveTests, negativeTests);
-      _updateIsChecks(positiveTests, negativeTests);
+      handleCondition(node.condition);
+      _state = new LocalState.childPath(_stateAfterWhenTrue);
       visit(node.body);
     });
   }
@@ -1555,14 +1583,12 @@
   visitDoStatement(ir.DoStatement node) {
     return handleLoop(node, _localsMap.getJumpTargetForDo(node), () {
       visit(node.body);
-      List<IsCheck> positiveTests = <IsCheck>[];
-      List<IsCheck> negativeTests = <IsCheck>[];
-      handleCondition(node.condition, positiveTests, negativeTests);
+      handleCondition(node.condition);
       // TODO(29309): This condition appears to strengthen both the back-edge
       // and exit-edge. For now, avoid strengthening on the condition until the
       // proper fix is found.
       //
-      //     updateIsChecks(positiveTests, negativeTests);
+      //     _state = new LocalState.childPath(_stateAfterWhenTrue, node.body);
     });
   }
 
@@ -1572,10 +1598,8 @@
       visit(variable);
     }
     return handleLoop(node, _localsMap.getJumpTargetForFor(node), () {
-      List<IsCheck> positiveTests = <IsCheck>[];
-      List<IsCheck> negativeTests = <IsCheck>[];
-      handleCondition(node.condition, positiveTests, negativeTests);
-      _updateIsChecks(positiveTests, negativeTests);
+      handleCondition(node.condition);
+      _state = new LocalState.childPath(_stateAfterWhenTrue);
       visit(node.body);
       for (ir.Expression update in node.updates) {
         visit(update);
@@ -1585,32 +1609,30 @@
 
   @override
   visitTryCatch(ir.TryCatch node) {
-    LocalsHandler saved = _locals;
-    _locals = new LocalsHandler.from(_locals, node,
-        isTry: true, useOtherTryBlock: false);
-    initializationIsIndefinite();
+    LocalState stateBefore = _state;
+    _state = new LocalState.tryBlock(stateBefore, node);
+    _state.markInitializationAsIndefinite();
     visit(node.body);
-    saved.mergeDiamondFlow(_locals, null);
-    _locals = saved;
+    LocalState stateAfterBody = _state;
+    _state = stateBefore.mergeFlow(_inferrer, stateAfterBody);
     for (ir.Catch catchBlock in node.catches) {
-      saved = _locals;
-      _locals = new LocalsHandler.from(_locals, catchBlock);
+      LocalState stateBeforeCatch = _state;
+      _state = new LocalState.childPath(stateBeforeCatch);
       visit(catchBlock);
-      saved.mergeDiamondFlow(_locals, null);
-      _locals = saved;
+      LocalState stateAfterCatch = _state;
+      _state = stateBeforeCatch.mergeFlow(_inferrer, stateAfterCatch);
     }
     return null;
   }
 
   @override
   visitTryFinally(ir.TryFinally node) {
-    LocalsHandler saved = _locals;
-    _locals = new LocalsHandler.from(_locals, node,
-        isTry: true, useOtherTryBlock: false);
-    initializationIsIndefinite();
+    LocalState stateBefore = _state;
+    _state = new LocalState.tryBlock(stateBefore, node);
+    _state.markInitializationAsIndefinite();
     visit(node.body);
-    saved.mergeDiamondFlow(_locals, null);
-    _locals = saved;
+    LocalState stateAfterBody = _state;
+    _state = stateBefore.mergeFlow(_inferrer, stateAfterBody);
     visit(node.finalizer);
     return null;
   }
@@ -1630,13 +1652,15 @@
         mask = _types.dynamicType;
       }
       Local local = _localsMap.getLocalVariable(exception);
-      _locals.update(local, mask, node, const DynamicType());
+      _state.updateLocal(
+          _inferrer, _capturedAndBoxed, local, mask, node, const DynamicType());
     }
     ir.VariableDeclaration stackTrace = node.stackTrace;
     if (stackTrace != null) {
       Local local = _localsMap.getLocalVariable(stackTrace);
       // TODO(johnniwinther): Use a mask based on [StackTrace].
-      _locals.update(local, _types.dynamicType, node, const DynamicType());
+      _state.updateLocal(_inferrer, _capturedAndBoxed, local,
+          _types.dynamicType, node, const DynamicType());
     }
     visit(node.body);
     return null;
@@ -1645,13 +1669,13 @@
   @override
   TypeInformation visitThrow(ir.Throw node) {
     visit(node.expression);
-    _locals.seenReturnOrThrow = true;
+    _state.seenReturnOrThrow = true;
     return _types.nonNullEmpty();
   }
 
   @override
   TypeInformation visitRethrow(ir.Rethrow node) {
-    _locals.seenReturnOrThrow = true;
+    _state.seenReturnOrThrow = true;
     return _types.nonNullEmpty();
   }
 
@@ -1668,49 +1692,56 @@
   TypeInformation visitSuperPropertyGet(ir.SuperPropertyGet node) {
     // TODO(herhut): We could do better here if we knew what we
     // are calling does not expose this.
-    _markThisAsExposed();
+    _state.markThisAsExposed();
 
     MemberEntity member =
         _elementMap.getSuperMember(_analyzedMember, node.name);
+    assert(member != null, "No member found for super property get: $node");
     AbstractValue mask = _memberData.typeOfSend(node);
     Selector selector = new Selector.getter(_elementMap.getName(node.name));
-    if (member == null) {
-      return handleSuperNoSuchMethod(node, selector, mask, null);
-    } else {
-      TypeInformation type =
-          handleStaticInvoke(node, selector, mask, member, null);
-      if (useStaticResultTypes) {
-        type = _types.narrowType(type, _elementMap.getStaticType(node));
+    TypeInformation type =
+        handleStaticInvoke(node, selector, mask, member, null);
+    if (member.isGetter) {
+      FunctionType functionType =
+          _elementMap.elementEnvironment.getFunctionType(member);
+      if (functionType.returnType.containsFreeTypeVariables) {
+        // The result type varies with the call site so we narrow the static
+        // result type.
+        type = _types.narrowType(type, _getStaticType(node));
       }
-      return type;
+    } else if (member.isField) {
+      DartType fieldType = _elementMap.elementEnvironment.getFieldType(member);
+      if (fieldType.containsFreeTypeVariables) {
+        // The result type varies with the call site so we narrow the static
+        // result type.
+        type = _types.narrowType(type, _getStaticType(node));
+      }
     }
+    return type;
   }
 
   @override
   TypeInformation visitSuperPropertySet(ir.SuperPropertySet node) {
     // TODO(herhut): We could do better here if we knew what we
     // are calling does not expose this.
-    _markThisAsExposed();
+    _state.markThisAsExposed();
 
     TypeInformation rhsType = visit(node.value);
     MemberEntity member =
         _elementMap.getSuperMember(_analyzedMember, node.name, setter: true);
+    assert(member != null, "No member found for super property set: $node");
     AbstractValue mask = _memberData.typeOfSend(node);
     Selector selector = new Selector.setter(_elementMap.getName(node.name));
     ArgumentsTypes arguments = new ArgumentsTypes([rhsType], null);
-    if (member == null) {
-      return handleSuperNoSuchMethod(node, selector, mask, arguments);
-    } else {
-      handleStaticInvoke(node, selector, mask, member, arguments);
-      return rhsType;
-    }
+    handleStaticInvoke(node, selector, mask, member, arguments);
+    return rhsType;
   }
 
   @override
   TypeInformation visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
     // TODO(herhut): We could do better here if we knew what we
     // are calling does not expose this.
-    _markThisAsExposed();
+    _state.markThisAsExposed();
 
     MemberEntity member =
         _elementMap.getSuperMember(_analyzedMember, node.name);
@@ -1718,25 +1749,24 @@
     Selector selector = _elementMap.getSelector(node);
     AbstractValue mask = _memberData.typeOfSend(node);
     if (member == null) {
+      // TODO(johnniwinther): This shouldn't be necessary.
       return handleSuperNoSuchMethod(node, selector, mask, arguments);
-    } else if (member.isFunction) {
+    } else {
+      assert(member.isFunction, "Unexpected super invocation target: $member");
       if (isIncompatibleInvoke(member, arguments)) {
         return handleSuperNoSuchMethod(node, selector, mask, arguments);
       } else {
         TypeInformation type =
             handleStaticInvoke(node, selector, mask, member, arguments);
-        if (useStaticResultTypes) {
-          type = _types.narrowType(type, _elementMap.getStaticType(node));
+        FunctionType functionType =
+            _elementMap.elementEnvironment.getFunctionType(member);
+        if (functionType.returnType.containsFreeTypeVariables) {
+          // The return type varies with the call site so we narrow the static
+          // return type.
+          type = _types.narrowType(type, _getStaticType(node));
         }
         return type;
       }
-    } else {
-      TypeInformation type =
-          handleClosureCall(node, selector, mask, member, arguments);
-      if (useStaticResultTypes) {
-        type = _types.narrowType(type, _elementMap.getStaticType(node));
-      }
-      return type;
     }
   }
 
@@ -1770,19 +1800,223 @@
   }
 }
 
-class IsCheck {
-  final ir.Expression node;
-  final Local local;
-  final DartType type;
-
-  IsCheck(this.node, this.local, this.type);
-
-  String toString() => 'IsCheck($local,$type)';
-}
-
 class Refinement {
   final Selector selector;
   final AbstractValue mask;
 
   Refinement(this.selector, this.mask);
 }
+
+class LocalState {
+  final LocalsHandler _locals;
+  final FieldInitializationScope _fields;
+  bool seenReturnOrThrow = false;
+  bool seenBreakOrContinue = false;
+  LocalsHandler _tryBlock;
+
+  LocalState.initial({bool inGenerativeConstructor})
+      : this.internal(
+            new LocalsHandler(),
+            inGenerativeConstructor ? new FieldInitializationScope() : null,
+            null,
+            seenReturnOrThrow: false,
+            seenBreakOrContinue: false);
+
+  LocalState.childPath(LocalState other)
+      : this.internal(new LocalsHandler.from(other._locals),
+            new FieldInitializationScope.from(other._fields), other._tryBlock,
+            seenReturnOrThrow: false, seenBreakOrContinue: false);
+
+  LocalState.closure(LocalState other)
+      : this.internal(new LocalsHandler.from(other._locals),
+            new FieldInitializationScope.from(other._fields), null,
+            seenReturnOrThrow: false, seenBreakOrContinue: false);
+
+  factory LocalState.tryBlock(LocalState other, ir.TreeNode node) {
+    LocalsHandler locals = new LocalsHandler.tryBlock(other._locals, node);
+    FieldInitializationScope fieldScope =
+        new FieldInitializationScope.from(other._fields);
+    LocalsHandler tryBlock = locals;
+    return new LocalState.internal(locals, fieldScope, tryBlock,
+        seenReturnOrThrow: false, seenBreakOrContinue: false);
+  }
+
+  LocalState.deepCopyOf(LocalState other)
+      : _locals = new LocalsHandler.deepCopyOf(other._locals),
+        _tryBlock = other._tryBlock,
+        _fields = other._fields;
+
+  LocalState.internal(this._locals, this._fields, this._tryBlock,
+      {this.seenReturnOrThrow, this.seenBreakOrContinue});
+
+  bool get aborts {
+    return seenReturnOrThrow || seenBreakOrContinue;
+  }
+
+  bool get isThisExposed {
+    return _fields == null || _fields.isThisExposed;
+  }
+
+  void markThisAsExposed() {
+    _fields?.isThisExposed = true;
+  }
+
+  void markInitializationAsIndefinite() {
+    _fields?.isIndefinite = true;
+  }
+
+  TypeInformation readField(FieldEntity field) {
+    return _fields.readField(field);
+  }
+
+  void updateField(FieldEntity field, TypeInformation type) {
+    _fields.updateField(field, type);
+  }
+
+  TypeInformation readLocal(InferrerEngine inferrer,
+      Map<Local, FieldEntity> capturedAndBoxed, Local local) {
+    FieldEntity field = capturedAndBoxed[local];
+    if (field != null) {
+      return inferrer.typeOfMember(field);
+    } else {
+      return _locals.use(inferrer, local);
+    }
+  }
+
+  void updateLocal(
+      InferrerEngine inferrer,
+      Map<Local, FieldEntity> capturedAndBoxed,
+      Local local,
+      TypeInformation type,
+      ir.Node node,
+      DartType staticType) {
+    assert(type != null);
+    type = inferrer.types.narrowType(type, staticType);
+
+    FieldEntity field = capturedAndBoxed[local];
+    if (field != null) {
+      inferrer.recordTypeOfField(field, type);
+    } else {
+      _locals.update(inferrer, local, type, node, staticType, _tryBlock);
+    }
+  }
+
+  void narrowLocal(
+      InferrerEngine inferrer,
+      Map<Local, FieldEntity> capturedAndBoxed,
+      Local local,
+      DartType type,
+      ir.Node node) {
+    TypeInformation existing = readLocal(inferrer, capturedAndBoxed, local);
+    TypeInformation newType =
+        inferrer.types.narrowType(existing, type, isNullable: false);
+    updateLocal(inferrer, capturedAndBoxed, local, newType, node, type);
+  }
+
+  LocalState mergeFlow(InferrerEngine inferrer, LocalState other) {
+    seenReturnOrThrow = false;
+    seenBreakOrContinue = false;
+
+    if (other.aborts) {
+      return this;
+    }
+    LocalsHandler locals = _locals.mergeFlow(inferrer, other._locals);
+    return new LocalState.internal(locals, _fields, _tryBlock,
+        seenReturnOrThrow: seenReturnOrThrow,
+        seenBreakOrContinue: seenBreakOrContinue);
+  }
+
+  LocalState mergeDiamondFlow(
+      InferrerEngine inferrer, LocalState thenBranch, LocalState elseBranch) {
+    seenReturnOrThrow =
+        thenBranch.seenReturnOrThrow && elseBranch.seenReturnOrThrow;
+    seenBreakOrContinue =
+        thenBranch.seenBreakOrContinue && elseBranch.seenBreakOrContinue;
+
+    LocalsHandler locals;
+    if (aborts) {
+      locals = _locals;
+    } else if (thenBranch.aborts) {
+      locals = _locals.mergeFlow(inferrer, elseBranch._locals, inPlace: true);
+    } else if (elseBranch.aborts) {
+      locals = _locals.mergeFlow(inferrer, thenBranch._locals, inPlace: true);
+    } else {
+      locals = _locals.mergeDiamondFlow(
+          inferrer, thenBranch._locals, elseBranch._locals);
+    }
+
+    FieldInitializationScope fieldScope = _fields?.mergeDiamondFlow(
+        inferrer, thenBranch._fields, elseBranch._fields);
+    return new LocalState.internal(locals, fieldScope, _tryBlock,
+        seenReturnOrThrow: seenReturnOrThrow,
+        seenBreakOrContinue: seenBreakOrContinue);
+  }
+
+  LocalState mergeAfterBreaks(InferrerEngine inferrer, List<LocalState> states,
+      {bool keepOwnLocals: true}) {
+    bool allBranchesAbort = true;
+    for (LocalState state in states) {
+      allBranchesAbort = allBranchesAbort && state.seenReturnOrThrow;
+    }
+
+    keepOwnLocals = keepOwnLocals && !seenReturnOrThrow;
+
+    LocalsHandler locals = _locals.mergeAfterBreaks(
+        inferrer,
+        states
+            .where((LocalState state) => !state.seenReturnOrThrow)
+            .map((LocalState state) => state._locals),
+        keepOwnLocals: keepOwnLocals);
+    seenReturnOrThrow = allBranchesAbort && !keepOwnLocals;
+    return new LocalState.internal(locals, _fields, _tryBlock,
+        seenReturnOrThrow: seenReturnOrThrow,
+        seenBreakOrContinue: seenBreakOrContinue);
+  }
+
+  bool mergeAll(InferrerEngine inferrer, List<LocalState> states) {
+    assert(!seenReturnOrThrow);
+    return _locals.mergeAll(
+        inferrer,
+        states
+            .where((LocalState state) => !state.seenReturnOrThrow)
+            .map((LocalState state) => state._locals));
+  }
+
+  void startLoop(InferrerEngine inferrer, ir.Node loop) {
+    _locals.startLoop(inferrer, loop);
+  }
+
+  void endLoop(InferrerEngine inferrer, ir.Node loop) {
+    _locals.endLoop(inferrer, loop);
+  }
+
+  String toStructuredText(String indent) {
+    StringBuffer sb = new StringBuffer();
+    _toStructuredText(sb, indent);
+    return sb.toString();
+  }
+
+  void _toStructuredText(StringBuffer sb, String indent) {
+    sb.write('LocalState($hashCode) [');
+    sb.write('\n${indent}  locals:');
+    sb.write(_locals.toStructuredText('${indent}    '));
+    sb.write('\n]');
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('LocalState(');
+    sb.write('locals=$_locals');
+    if (_fields != null) {
+      sb.write(',fields=$_fields');
+    }
+    if (seenReturnOrThrow) {
+      sb.write(',seenReturnOrThrow');
+    }
+    if (seenBreakOrContinue) {
+      sb.write(',seenBreakOrContinue');
+    }
+    sb.write(')');
+    return sb.toString();
+  }
+}
diff --git a/pkg/compiler/lib/src/inferrer/closure_tracer.dart b/pkg/compiler/lib/src/inferrer/closure_tracer.dart
index ce86148..e7ecf72 100644
--- a/pkg/compiler/lib/src/inferrer/closure_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/closure_tracer.dart
@@ -7,8 +7,8 @@
 import '../common/names.dart' show Names;
 import '../elements/entities.dart';
 import '../js_backend/backend.dart' show JavaScriptBackend;
-import '../types/abstract_value_domain.dart';
 import '../universe/selector.dart' show Selector;
+import 'abstract_value_domain.dart';
 import 'debug.dart' as debug;
 import 'inferrer_engine.dart';
 import 'node_tracer.dart';
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
index 5ce0f07..60ea7a3 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_engine.dart
@@ -17,17 +17,16 @@
 import '../js_backend/inferred_data.dart';
 import '../js_backend/no_such_method_registry.dart';
 import '../js_model/element_map.dart';
-import '../js_model/js_strategy.dart';
+import '../js_model/js_world.dart';
 import '../js_model/locals.dart';
-import '../native/behavior.dart' as native;
+import '../native/behavior.dart';
 import '../options.dart';
 import '../serialization/serialization.dart';
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
 import '../universe/call_structure.dart';
 import '../universe/selector.dart';
 import '../universe/side_effects.dart';
 import '../world.dart';
+import 'abstract_value_domain.dart';
 import 'builder_kernel.dart';
 import 'closure_tracer.dart';
 import 'debug.dart' as debug;
@@ -38,6 +37,7 @@
 import 'type_graph_inferrer.dart';
 import 'type_graph_nodes.dart';
 import 'type_system.dart';
+import 'types.dart';
 
 /// An inferencing engine that computes a call graph of [TypeInformation] nodes
 /// by visiting the AST of the application, and then does the inferencing on the
@@ -216,8 +216,8 @@
   TypeInformation typeOfParameter(Local element);
 
   /// Returns the type for [nativeBehavior]. See documentation on
-  /// [native.NativeBehavior].
-  TypeInformation typeOfNativeBehavior(native.NativeBehavior nativeBehavior);
+  /// [NativeBehavior].
+  TypeInformation typeOfNativeBehavior(NativeBehavior nativeBehavior);
 
   bool returnsListElementType(Selector selector, AbstractValue mask);
 
@@ -242,10 +242,6 @@
   bool canFunctionParametersBeUsedForGlobalOptimizations(
       FunctionEntity function);
 
-  /// Returns `true` if parameter and returns types should be trusted for
-  /// [member].
-  bool trustTypeAnnotations(MemberEntity member);
-
   /// Returns `true` if inference of parameter types is disabled for [member].
   bool assumeDynamic(MemberEntity member);
 }
@@ -314,10 +310,8 @@
   GlobalTypeInferenceElementData dataOfMember(MemberEntity element) =>
       _memberData[element] ??= new KernelGlobalTypeInferenceElementData();
 
-  /**
-   * Update [sideEffects] with the side effects of [callee] being
-   * called with [selector].
-   */
+  /// Update [sideEffects] with the side effects of [callee] being
+  /// called with [selector].
   void updateSideEffects(SideEffectsBuilder sideEffectsBuilder,
       Selector selector, MemberEntity callee) {
     if (callee.isField) {
@@ -346,14 +340,14 @@
     }
   }
 
-  TypeInformation typeOfNativeBehavior(native.NativeBehavior nativeBehavior) {
+  TypeInformation typeOfNativeBehavior(NativeBehavior nativeBehavior) {
     if (nativeBehavior == null) return types.dynamicType;
     List typesReturned = nativeBehavior.typesReturned;
     if (typesReturned.isEmpty) return types.dynamicType;
     TypeInformation returnType;
     for (var type in typesReturned) {
       TypeInformation mappedType;
-      if (type == native.SpecialType.JsObject) {
+      if (type == SpecialType.JsObject) {
         mappedType = types.nonNullExact(commonElements.objectClass);
       } else if (type == commonElements.stringType) {
         mappedType = types.stringType;
@@ -388,7 +382,7 @@
 
   void updateSelectorInMember(MemberEntity owner, CallType callType,
       ir.Node node, Selector selector, AbstractValue mask) {
-    GlobalTypeInferenceElementData data = dataOfMember(owner);
+    KernelGlobalTypeInferenceElementData data = dataOfMember(owner);
     assert(validCallType(callType, node));
     switch (callType) {
       case CallType.access:
@@ -473,10 +467,7 @@
   }
 
   void runOverAllElements() {
-    progress.startPhase();
-
     analyzeAllElements();
-
     TypeGraphDump dump =
         debug.PRINT_GRAPH ? new TypeGraphDump(_compilerOutput, this) : null;
 
@@ -648,6 +639,7 @@
     Iterable<MemberEntity> processedMembers = closedWorld.processedMembers
         .where((MemberEntity member) => !member.isAbstract);
 
+    progress.startPhase();
     processedMembers.forEach((MemberEntity member) {
       progress.showProgress(
           'Added ', addedInGraph, ' elements in inferencing graph.');
@@ -784,7 +776,8 @@
         this,
         member,
         body,
-        closedWorld.globalLocalsMap.getLocalsMap(member));
+        closedWorld.globalLocalsMap.getLocalsMap(member),
+        closedWorld.elementMap.getStaticTypeProvider(member));
     return visitor.run();
   }
 
@@ -834,7 +827,7 @@
         MemberEntity member = info.calledElement;
         inferredDataBuilder.addFunctionCalledInLoop(member);
       } else if (info.mask != null &&
-          !abstractValueDomain.containsAll(info.mask)) {
+          abstractValueDomain.containsAll(info.mask).isDefinitelyFalse) {
         // For instance methods, we only register a selector called in a
         // loop if it is a typed selector, to avoid marking too many
         // methods as being called from within a loop. This cuts down
@@ -847,6 +840,7 @@
   }
 
   void refine() {
+    progress.startPhase();
     while (!workQueue.isEmpty) {
       progress.showProgress('Inferred ', overallRefineCount, ' types.');
       TypeInformation info = workQueue.remove();
@@ -1247,12 +1241,6 @@
   }
 
   @override
-  bool trustTypeAnnotations(MemberEntity member) {
-    return closedWorld.annotationsData.trustTypeAnnotationsMembers
-        .contains(member);
-  }
-
-  @override
   bool assumeDynamic(MemberEntity member) {
     return closedWorld.annotationsData.assumeDynamicMembers.contains(member);
   }
@@ -1279,7 +1267,8 @@
   bool checkLoopPhiNode(ir.Node node) => true;
 
   @override
-  bool checkPhiNode(ir.Node node) => true;
+  bool checkPhiNode(ir.Node node) =>
+      node == null || node is ir.TryCatch || node is ir.TryFinally;
 
   @override
   void forEachParameter(FunctionEntity function, void f(Local parameter)) {
@@ -1426,7 +1415,7 @@
   }
 
   @override
-  void compress() {
+  GlobalTypeInferenceElementData compress() {
     if (_sendMap != null) {
       _sendMap.removeWhere(_mapsToNull);
       if (_sendMap.isEmpty) {
@@ -1451,6 +1440,13 @@
         _moveNextMap = null;
       }
     }
+    if (_sendMap == null &&
+        _iteratorMap == null &&
+        _currentMap == null &&
+        _moveNextMap == null) {
+      return null;
+    }
+    return this;
   }
 
   @override
@@ -1459,23 +1455,17 @@
     return _sendMap[node];
   }
 
-  @override
-  void setCurrentTypeMask(
-      covariant ir.ForInStatement node, AbstractValue mask) {
+  void setCurrentTypeMask(ir.ForInStatement node, AbstractValue mask) {
     _currentMap ??= <ir.ForInStatement, AbstractValue>{};
     _currentMap[node] = mask;
   }
 
-  @override
-  void setMoveNextTypeMask(
-      covariant ir.ForInStatement node, AbstractValue mask) {
+  void setMoveNextTypeMask(ir.ForInStatement node, AbstractValue mask) {
     _moveNextMap ??= <ir.ForInStatement, AbstractValue>{};
     _moveNextMap[node] = mask;
   }
 
-  @override
-  void setIteratorTypeMask(
-      covariant ir.ForInStatement node, AbstractValue mask) {
+  void setIteratorTypeMask(ir.ForInStatement node, AbstractValue mask) {
     _iteratorMap ??= <ir.ForInStatement, AbstractValue>{};
     _iteratorMap[node] = mask;
   }
@@ -1498,7 +1488,6 @@
     return _iteratorMap[node];
   }
 
-  @override
   void setTypeMask(ir.TreeNode node, AbstractValue mask) {
     _sendMap ??= <ir.TreeNode, AbstractValue>{};
     _sendMap[node] = mask;
diff --git a/pkg/compiler/lib/src/inferrer/list_tracer.dart b/pkg/compiler/lib/src/inferrer/list_tracer.dart
index 7043105..dfe10a0 100644
--- a/pkg/compiler/lib/src/inferrer/list_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/list_tracer.dart
@@ -11,11 +11,9 @@
 import 'node_tracer.dart';
 import 'type_graph_nodes.dart';
 
-/**
- * A set of selector names that [List] implements, that we know do not
- * change the element type of the list, or let the list escape to code
- * that might change the element type.
- */
+/// A set of selector names that [List] implements, that we know do not
+/// change the element type of the list, or let the list escape to code
+/// that might change the element type.
 Set<String> okListSelectorsSet = new Set<String>.from(const <String>[
   // From Object.
   '==',
@@ -137,11 +135,9 @@
 
   ListTracerVisitor(tracedType, inferrer) : super(tracedType, inferrer);
 
-  /**
-   * Returns [true] if the analysis completed successfully, [false] if it
-   * bailed out. In the former case, [assignments] holds a list of
-   * [TypeInformation] nodes that flow into the element type of this list.
-   */
+  /// Returns [true] if the analysis completed successfully, [false] if it
+  /// bailed out. In the former case, [assignments] holds a list of
+  /// [TypeInformation] nodes that flow into the element type of this list.
   bool run() {
     analyze();
     ListTypeInformation list = tracedType;
diff --git a/pkg/compiler/lib/src/inferrer/locals_handler.dart b/pkg/compiler/lib/src/inferrer/locals_handler.dart
index ae92797..aff2896 100644
--- a/pkg/compiler/lib/src/inferrer/locals_handler.dart
+++ b/pkg/compiler/lib/src/inferrer/locals_handler.dart
@@ -6,57 +6,82 @@
 
 import 'dart:collection' show IterableMixin;
 import 'package:kernel/ast.dart' as ir;
-import '../options.dart' show CompilerOptions;
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../ir/util.dart';
 import '../util/util.dart';
 import 'inferrer_engine.dart';
 import 'type_graph_nodes.dart';
-import 'type_system.dart';
 
-/**
- * A variable scope holds types for variables. It has a link to a
- * parent scope, but never changes the types in that parent. Instead,
- * updates to locals of a parent scope are put in the current scope.
- * The inferrer makes sure updates get merged into the parent scope,
- * once the control flow block has been visited.
- */
+/// A variable scope holds types for variables. It has a link to a
+/// parent scope, but never changes the types in that parent. Instead,
+/// updates to locals of a parent scope are put in the current scope.
+/// The inferrer makes sure updates get merged into the parent scope,
+/// once the control flow block has been visited.
 class VariableScope {
+  /// The number of parent scopes of this scope.
+  ///
+  /// This is used for computing common parents efficiently.
+  final int _level;
+
   Map<Local, TypeInformation> variables;
 
   /// The parent of this scope. Null for the root scope.
   final VariableScope parent;
 
   /// The [ir.Node] that created this scope.
-  final ir.Node block;
+  final ir.Node tryBlock;
 
-  /// `true` if this scope is for a try block.
-  final bool isTry;
+  final VariableScope copyOf;
 
-  VariableScope(this.block, {VariableScope parent, this.isTry})
+  VariableScope({this.parent})
       : this.variables = null,
-        this.parent = parent {
-    assert(isTry == (block is ir.TryCatch || block is ir.TryFinally),
-        "Unexpected block $block for isTry=$isTry");
+        this.copyOf = null,
+        this.tryBlock = null,
+        _level = (parent?._level ?? -1) + 1;
+
+  VariableScope.tryBlock(this.tryBlock, {this.parent})
+      : this.variables = null,
+        this.copyOf = null,
+        _level = (parent?._level ?? -1) + 1 {
+    assert(tryBlock is ir.TryCatch || tryBlock is ir.TryFinally,
+        "Unexpected block $tryBlock for VariableScope.tryBlock");
   }
 
   VariableScope.deepCopyOf(VariableScope other)
       : variables = other.variables == null
             ? null
             : new Map<Local, TypeInformation>.from(other.variables),
-        block = other.block,
-        isTry = other.isTry,
+        tryBlock = other.tryBlock,
+        copyOf = other.copyOf ?? other,
+        _level = other._level,
         parent = other.parent == null
             ? null
             : new VariableScope.deepCopyOf(other.parent);
 
-  VariableScope.topLevelCopyOf(VariableScope other)
-      : variables = other.variables == null
-            ? null
-            : new Map<Local, TypeInformation>.from(other.variables),
-        block = other.block,
-        isTry = other.isTry,
-        parent = other.parent;
+  /// `true` if this scope is for a try block.
+  bool get isTry => tryBlock != null;
+
+  /// Returns the [VariableScope] that defines the identity of this scope.
+  ///
+  /// If this scope is a copy of another scope, the identity is the identity
+  /// of the other scope, otherwise the identity is the scope itself.
+  VariableScope get identity => copyOf ?? this;
+
+  /// Returns the common parent between this and [other] based on [identity].
+  VariableScope commonParent(VariableScope other) {
+    if (identity == other.identity) {
+      return identity;
+    } else if (_level > other._level) {
+      return parent.commonParent(other);
+    } else if (_level < other._level) {
+      return commonParent(other.parent);
+    } else if (_level > 0) {
+      return parent.commonParent(other.parent);
+    } else {
+      return null;
+    }
+  }
 
   TypeInformation operator [](Local variable) {
     TypeInformation result;
@@ -74,15 +99,18 @@
     variables[variable] = mask;
   }
 
-  void forEachOwnLocal(void f(Local variable, TypeInformation type)) {
-    if (variables == null) return;
-    variables.forEach(f);
+  /// Calls [f] for all variables in this and parent scopes until and including
+  /// [scope]. [f] is called at most once for each variable.
+  void forEachLocalUntilScope(
+      VariableScope scope, void f(Local variable, TypeInformation type)) {
+    _forEachLocalUntilScope(scope, f, new Setlet<Local>(), this);
   }
 
-  void forEachLocalUntilNode(
-      ir.Node node, void f(Local variable, TypeInformation type),
-      [Setlet<Local> seenLocals]) {
-    if (seenLocals == null) seenLocals = new Setlet<Local>();
+  void _forEachLocalUntilScope(
+      VariableScope scope,
+      void f(Local variable, TypeInformation type),
+      Setlet<Local> seenLocals,
+      VariableScope origin) {
     if (variables != null) {
       variables.forEach((variable, type) {
         if (seenLocals.contains(variable)) return;
@@ -90,12 +118,22 @@
         f(variable, type);
       });
     }
-    if (block == node) return;
-    if (parent != null) parent.forEachLocalUntilNode(node, f, seenLocals);
+    if (scope?.identity == identity) {
+      return;
+    }
+    if (parent != null) {
+      parent._forEachLocalUntilScope(scope, f, seenLocals, origin);
+    } else {
+      assert(
+          scope == null,
+          "Scope not found: \n"
+          "origin=${origin.toStructuredText('')}\n"
+          "scope=${scope.toStructuredText('')}");
+    }
   }
 
   void forEachLocal(void f(Local variable, TypeInformation type)) {
-    forEachLocalUntilNode(null, f);
+    forEachLocalUntilScope(null, f);
   }
 
   bool updates(Local variable) {
@@ -103,15 +141,43 @@
     return variables.containsKey(variable);
   }
 
+  String toStructuredText(String indent) {
+    StringBuffer sb = new StringBuffer();
+    _toStructuredText(sb, indent);
+    return sb.toString();
+  }
+
+  void _toStructuredText(StringBuffer sb, String indent) {
+    sb.write('VariableScope($hashCode) [');
+    sb.write('\n${indent}  level:$_level');
+    if (copyOf != null) {
+      sb.write('\n${indent}  copyOf:VariableScope(${copyOf.hashCode})');
+    }
+    if (tryBlock != null) {
+      sb.write('\n${indent}  tryBlock: ${nodeToDebugString(tryBlock)}');
+    }
+    if (variables != null) {
+      sb.write('\n${indent}  variables:');
+      variables.forEach((Local local, TypeInformation type) {
+        sb.write('\n${indent}    $local: ');
+        sb.write(type.toStructuredText('${indent}      '));
+      });
+    }
+    if (parent != null) {
+      sb.write('\n${indent}  parent:');
+      parent._toStructuredText(sb, '${indent}     ');
+    }
+    sb.write(']');
+  }
+
   String toString() {
     String rest = parent == null ? "null" : parent.toString();
-    return '$variables $rest';
+    return '{$variables} $rest';
   }
 }
 
 /// Tracks initializers via initializations and assignments.
 class FieldInitializationScope {
-  final TypeSystem types;
   Map<FieldEntity, TypeInformation> fields;
   bool isThisExposed;
 
@@ -119,13 +185,12 @@
   /// e.g. an early return or caught exception.
   bool isIndefinite;
 
-  FieldInitializationScope(this.types)
+  FieldInitializationScope()
       : isThisExposed = false,
         isIndefinite = false;
 
   FieldInitializationScope.internalFrom(FieldInitializationScope other)
-      : types = other.types,
-        isThisExposed = other.isThisExposed,
+      : isThisExposed = other.isThisExposed,
         isIndefinite = other.isIndefinite;
 
   factory FieldInitializationScope.from(FieldInitializationScope other) {
@@ -148,30 +213,33 @@
     fields?.forEach(f);
   }
 
-  void mergeDiamondFlow(
+  /// Returns the join between [thenScope] and [elseScope] which models the
+  /// flow through either [thenScope] or [elseScope].
+  FieldInitializationScope mergeDiamondFlow(InferrerEngine inferrer,
       FieldInitializationScope thenScope, FieldInitializationScope elseScope) {
+    assert(elseScope != null);
+
     // Quick bailout check. If [isThisExposed] or [isIndefinite] is true, we
     // know the code following won'TypeInformation do anything.
-    if (isThisExposed) return;
-    if (isIndefinite) return;
+    if (isThisExposed) return this;
+    if (isIndefinite) return this;
 
     FieldInitializationScope otherScope =
-        (elseScope == null || elseScope.fields == null) ? this : elseScope;
+        elseScope.fields == null ? this : elseScope;
 
     thenScope.forEach((FieldEntity field, TypeInformation type) {
       TypeInformation otherType = otherScope.readField(field);
       if (otherType == null) return;
-      updateField(field, types.allocateDiamondPhi(type, otherType));
+      updateField(field, inferrer.types.allocateDiamondPhi(type, otherType));
     });
 
     isThisExposed = thenScope.isThisExposed || elseScope.isThisExposed;
     isIndefinite = thenScope.isIndefinite || elseScope.isIndefinite;
+    return this;
   }
 }
 
-/**
- * Placeholder for inferred arguments types on sends.
- */
+/// Placeholder for inferred arguments types on sends.
 class ArgumentsTypes extends IterableMixin<TypeInformation> {
   final List<TypeInformation> positional;
   final Map<String, TypeInformation> named;
@@ -245,323 +313,284 @@
   }
 }
 
-/**
- * Placeholder for inferred types of local variables.
- */
+/// Placeholder for inferred types of local variables.
 class LocalsHandler {
-  final CompilerOptions options;
-  final TypeSystem types;
-  final InferrerEngine inferrer;
-  final VariableScope locals;
-  final Map<Local, FieldEntity> _capturedAndBoxed;
-  final FieldInitializationScope fieldScope;
-  LocalsHandler tryBlock;
-  bool seenReturnOrThrow = false;
-  bool seenBreakOrContinue = false;
+  final VariableScope _locals;
 
-  bool get aborts {
-    return seenReturnOrThrow || seenBreakOrContinue;
-  }
+  LocalsHandler() : _locals = new VariableScope();
 
-  bool get inTryBlock => tryBlock != null;
+  LocalsHandler.from(LocalsHandler other)
+      : _locals = new VariableScope(parent: other._locals);
 
-  LocalsHandler(this.inferrer, this.types, this.options, ir.Node block,
-      [this.fieldScope])
-      : locals = new VariableScope(block, isTry: false),
-        _capturedAndBoxed = new Map<Local, FieldEntity>(),
-        tryBlock = null;
-
-  LocalsHandler.from(LocalsHandler other, ir.Node block,
-      {bool isTry: false, bool useOtherTryBlock: true})
-      : locals = new VariableScope(block, isTry: isTry, parent: other.locals),
-        fieldScope = new FieldInitializationScope.from(other.fieldScope),
-        _capturedAndBoxed = other._capturedAndBoxed,
-        types = other.types,
-        inferrer = other.inferrer,
-        options = other.options {
-    tryBlock = useOtherTryBlock ? other.tryBlock : this;
-  }
+  LocalsHandler.tryBlock(LocalsHandler other, ir.TreeNode block)
+      : _locals = new VariableScope.tryBlock(block, parent: other._locals);
 
   LocalsHandler.deepCopyOf(LocalsHandler other)
-      : locals = new VariableScope.deepCopyOf(other.locals),
-        fieldScope = new FieldInitializationScope.from(other.fieldScope),
-        _capturedAndBoxed = other._capturedAndBoxed,
-        tryBlock = other.tryBlock,
-        types = other.types,
-        inferrer = other.inferrer,
-        options = other.options;
+      : _locals = new VariableScope.deepCopyOf(other._locals);
 
-  LocalsHandler.topLevelCopyOf(LocalsHandler other)
-      : locals = new VariableScope.topLevelCopyOf(other.locals),
-        fieldScope = new FieldInitializationScope.from(other.fieldScope),
-        _capturedAndBoxed = other._capturedAndBoxed,
-        tryBlock = other.tryBlock,
-        types = other.types,
-        inferrer = other.inferrer,
-        options = other.options;
-
-  TypeInformation use(Local local) {
-    if (_capturedAndBoxed.containsKey(local)) {
-      FieldEntity field = _capturedAndBoxed[local];
-      return inferrer.typeOfMember(field);
-    } else {
-      return locals[local];
-    }
+  TypeInformation use(InferrerEngine inferrer, Local local) {
+    return _locals[local];
   }
 
-  void update(
-      Local local, TypeInformation type, ir.Node node, DartType staticType,
-      {bool isSetIfNull: false}) {
-    assert(type != null);
-    if (!options.assignmentCheckPolicy.isIgnored) {
-      type = types.narrowType(type, staticType);
-    }
-    updateLocal() {
-      TypeInformation currentType = locals[local];
-
-      if (isSetIfNull && currentType != null) {
-        // If-null assignments may return either the new or the original value
-        // narrowed to non-null.
-        type = types.addPhiInput(
-            local,
-            types.allocatePhi(
-                locals.block, local, types.narrowNotNull(currentType),
-                isTry: locals.isTry),
-            type);
-      }
-      locals[local] = type;
-    }
-
-    if (_capturedAndBoxed.containsKey(local)) {
-      inferrer.recordTypeOfField(_capturedAndBoxed[local], type);
-    } else if (inTryBlock) {
+  void update(InferrerEngine inferrer, Local local, TypeInformation type,
+      ir.Node node, DartType staticType, LocalsHandler tryBlock) {
+    if (tryBlock != null) {
       // We don't know if an assignment in a try block
       // will be executed, so all assignments in that block are
       // potential types after we have left it. We update the parent
       // of the try block so that, at exit of the try block, we get
       // the right phi for it.
-      TypeInformation existing = tryBlock.locals.parent[local];
+      TypeInformation existing = tryBlock._locals.parent[local];
       if (existing != null) {
-        TypeInformation phiType = types.allocatePhi(
-            tryBlock.locals.block, local, existing,
-            isTry: tryBlock.locals.isTry);
-        TypeInformation inputType = types.addPhiInput(local, phiType, type);
-        tryBlock.locals.parent[local] = inputType;
+        TypeInformation phiType = inferrer.types.allocatePhi(
+            tryBlock._locals.tryBlock, local, existing,
+            isTry: tryBlock._locals.isTry);
+        TypeInformation inputType =
+            inferrer.types.addPhiInput(local, phiType, type);
+        tryBlock._locals.parent[local] = inputType;
       }
       // Update the current handler unconditionally with the new
       // type.
-      updateLocal();
+      _locals[local] = type;
     } else {
-      updateLocal();
+      _locals[local] = type;
     }
   }
 
-  void narrow(Local local, DartType type, ir.Node node,
-      {bool isSetIfNull: false}) {
-    TypeInformation existing = use(local);
-    TypeInformation newType =
-        types.narrowType(existing, type, isNullable: false);
-    update(local, newType, node, type, isSetIfNull: isSetIfNull);
+  /// Returns the join between this locals handler and [other] which models the
+  /// flow through either this or [other].
+  ///
+  /// If [inPlace] is `true`, the variable types in this locals handler are
+  /// replaced by the variables types in [other]. Otherwise the variable types
+  /// from both are merged with a phi type.
+  LocalsHandler mergeFlow(InferrerEngine inferrer, LocalsHandler other,
+      {bool inPlace: false}) {
+    VariableScope common = _locals.commonParent(other._locals);
+    assert(
+        common != null,
+        "No common parent for\n"
+        "1:${_locals.toStructuredText('  ')}\n"
+        "2:${other._locals.toStructuredText('  ')}");
+    assert(
+        common == _locals || _locals.variables == null,
+        "Non-empty common parent for\n"
+        "1:${common.toStructuredText('  ')}\n"
+        "2:${_locals.toStructuredText('  ')}");
+    other._locals.forEachLocalUntilScope(common,
+        (Local local, TypeInformation type) {
+      TypeInformation myType = _locals[local];
+      if (myType == null) return; // Variable is only defined in [other].
+      if (type == myType) return;
+      _locals[local] =
+          inPlace ? type : inferrer.types.allocateDiamondPhi(myType, type);
+    });
+    return this;
   }
 
-  void setCapturedAndBoxed(Local local, FieldEntity field) {
-    _capturedAndBoxed[local] = field;
-  }
+  /// Returns the join between [thenBranch] and [elseBranch] which models the
+  /// flow through either [thenBranch] or [elseBranch].
+  LocalsHandler mergeDiamondFlow(InferrerEngine inferrer,
+      LocalsHandler thenBranch, LocalsHandler elseBranch) {
+    assert(elseBranch != null);
 
-  void mergeDiamondFlow(LocalsHandler thenBranch, LocalsHandler elseBranch) {
-    if (fieldScope != null && elseBranch != null) {
-      fieldScope.mergeDiamondFlow(thenBranch.fieldScope, elseBranch.fieldScope);
-    }
-    seenReturnOrThrow = thenBranch.seenReturnOrThrow &&
-        elseBranch != null &&
-        elseBranch.seenReturnOrThrow;
-    seenBreakOrContinue = thenBranch.seenBreakOrContinue &&
-        elseBranch != null &&
-        elseBranch.seenBreakOrContinue;
-    if (aborts) return;
-
-    void mergeOneBranch(LocalsHandler other) {
-      other.locals.forEachOwnLocal((Local local, TypeInformation type) {
-        TypeInformation myType = locals[local];
-        if (myType == null) return; // Variable is only defined in [other].
-        if (type == myType) return;
-        locals[local] = types.allocateDiamondPhi(myType, type);
-      });
-    }
-
-    void inPlaceUpdateOneBranch(LocalsHandler other) {
-      other.locals.forEachOwnLocal((Local local, TypeInformation type) {
-        TypeInformation myType = locals[local];
-        if (myType == null) return; // Variable is only defined in [other].
-        if (type == myType) return;
-        locals[local] = type;
-      });
-    }
-
-    if (thenBranch.aborts) {
-      if (elseBranch == null) return;
-      inPlaceUpdateOneBranch(elseBranch);
-    } else if (elseBranch == null) {
-      mergeOneBranch(thenBranch);
-    } else if (elseBranch.aborts) {
-      inPlaceUpdateOneBranch(thenBranch);
-    } else {
-      void mergeLocal(Local local) {
-        TypeInformation myType = locals[local];
-        if (myType == null) return;
-        TypeInformation elseType = elseBranch.locals[local];
-        TypeInformation thenType = thenBranch.locals[local];
-        if (thenType == elseType) {
-          locals[local] = thenType;
-        } else {
-          locals[local] = types.allocateDiamondPhi(thenType, elseType);
-        }
+    void mergeLocal(Local local) {
+      TypeInformation myType = _locals[local];
+      if (myType == null) return;
+      TypeInformation elseType = elseBranch._locals[local];
+      TypeInformation thenType = thenBranch._locals[local];
+      if (thenType == elseType) {
+        _locals[local] = thenType;
+      } else {
+        _locals[local] = inferrer.types.allocateDiamondPhi(thenType, elseType);
       }
-
-      thenBranch.locals.forEachOwnLocal((Local local, _) {
-        mergeLocal(local);
-      });
-      elseBranch.locals.forEachOwnLocal((Local local, _) {
-        // Discard locals we already processed when iterating over
-        // [thenBranch]'s locals.
-        if (!thenBranch.locals.updates(local)) mergeLocal(local);
-      });
     }
+
+    VariableScope common = _locals.commonParent(thenBranch._locals);
+    assert(
+        common != null,
+        "No common parent for\n"
+        "1:${_locals.toStructuredText('  ')}\n"
+        "2:${thenBranch._locals.toStructuredText('  ')}");
+    assert(
+        _locals.commonParent(elseBranch._locals) == common,
+        "Diff common parent for\n"
+        "1:${common.toStructuredText('  ')}\n2:"
+        "${_locals.commonParent(elseBranch._locals)?.toStructuredText('  ')}");
+    assert(
+        common == _locals || _locals.variables == null,
+        "Non-empty common parent for\n"
+        "common:${common.toStructuredText('  ')}\n"
+        "1:${_locals.toStructuredText('  ')}\n"
+        "2:${thenBranch._locals.toStructuredText('  ')}");
+    thenBranch._locals.forEachLocalUntilScope(common, (Local local, _) {
+      mergeLocal(local);
+    });
+    elseBranch._locals.forEachLocalUntilScope(common, (Local local, _) {
+      // Discard locals we already processed when iterating over
+      // [thenBranch]'s locals.
+      if (!thenBranch._locals.updates(local)) mergeLocal(local);
+    });
+    return this;
   }
 
-  /**
-   * Merge all [LocalsHandler] in [handlers] into [:this:].
-   *
-   * If [keepOwnLocals] is true, the types of locals in this
-   * [LocalsHandler] are being used in the merge. [keepOwnLocals]
-   * should be true if this [LocalsHandler], the dominator of
-   * all [handlers], also directly flows into the join point,
-   * that is the code after all [handlers]. For example, consider:
-   *
-   * [: switch (...) {
-   *      case 1: ...; break;
-   *    }
-   * :]
-   *
-   * The [LocalsHandler] at entry of the switch also flows into the
-   * exit of the switch, because there is no default case. So the
-   * types of locals at entry of the switch have to take part to the
-   * merge.
-   *
-   * The above situation is also true for labeled statements like
-   *
-   * [: L: {
-   *      if (...) break;
-   *      ...
-   *    }
-   * :]
-   *
-   * where [:this:] is the [LocalsHandler] for the paths through the
-   * labeled statement that do not break out.
-   */
-  void mergeAfterBreaks(List<LocalsHandler> handlers,
+  /// Merge all [LocalsHandler] in [handlers] into [:this:].
+  ///
+  /// If [keepOwnLocals] is true, the types of locals in this
+  /// [LocalsHandler] are being used in the merge. [keepOwnLocals]
+  /// should be true if this [LocalsHandler], the dominator of
+  /// all [handlers], also directly flows into the join point,
+  /// that is the code after all [handlers]. For example, consider:
+  ///
+  /// [: switch (...) {
+  ///      case 1: ...; break;
+  ///    }
+  /// :]
+  ///
+  /// The [LocalsHandler] at entry of the switch also flows into the
+  /// exit of the switch, because there is no default case. So the
+  /// types of locals at entry of the switch have to take part to the
+  /// merge.
+  ///
+  /// The above situation is also true for labeled statements like
+  ///
+  /// [: L: {
+  ///      if (...) break;
+  ///      ...
+  ///    }
+  /// :]
+  ///
+  /// where [:this:] is the [LocalsHandler] for the paths through the
+  /// labeled statement that do not break out.
+  LocalsHandler mergeAfterBreaks(
+      InferrerEngine inferrer, Iterable<LocalsHandler> handlers,
       {bool keepOwnLocals: true}) {
-    ir.Node level = locals.block;
+    ir.Node tryBlock = _locals.tryBlock;
     // Use a separate locals handler to perform the merge in, so that Phi
     // creation does not invalidate previous type knowledge while we might
     // still look it up.
-    LocalsHandler merged =
-        new LocalsHandler.from(this, level, isTry: locals.isTry);
+    VariableScope merged = tryBlock != null
+        ? new VariableScope.tryBlock(tryBlock, parent: _locals)
+        : new VariableScope(parent: _locals);
     Set<Local> seenLocals = new Setlet<Local>();
-    bool allBranchesAbort = true;
     // Merge all other handlers.
     for (LocalsHandler handler in handlers) {
-      allBranchesAbort = allBranchesAbort && handler.seenReturnOrThrow;
-      merged.mergeHandler(handler, seenLocals);
+      VariableScope common = _locals.commonParent(handler._locals);
+      assert(
+          common != null,
+          "No common parent for\n"
+          "1:${_locals.toStructuredText('  ')}\n"
+          "2:${handler._locals.toStructuredText('  ')}");
+      assert(
+          common == _locals || _locals.variables == null,
+          "Non-empty common parent for\n"
+          "common:${common.toStructuredText('  ')}\n"
+          "1:${_locals.toStructuredText('  ')}\n"
+          "2:${handler._locals.toStructuredText('  ')}");
+      handler._locals.forEachLocalUntilScope(common, (local, otherType) {
+        TypeInformation myType = merged[local];
+        if (myType == null) return;
+        TypeInformation newType;
+        if (!seenLocals.contains(local)) {
+          newType = inferrer.types.allocatePhi(
+              merged.tryBlock, local, otherType,
+              isTry: merged.isTry);
+          seenLocals.add(local);
+        } else {
+          newType = inferrer.types.addPhiInput(local, myType, otherType);
+        }
+        if (newType != myType) {
+          merged[local] = newType;
+        }
+      });
     }
     // If we want to keep own locals, we merge [seenLocals] from [this] into
     // [merged] to update the Phi nodes with original values.
-    if (keepOwnLocals && !seenReturnOrThrow) {
+    if (keepOwnLocals) {
       for (Local variable in seenLocals) {
-        TypeInformation originalType = locals[variable];
+        TypeInformation originalType = _locals[variable];
         if (originalType != null) {
-          merged.locals[variable] = types.addPhiInput(
-              variable, merged.locals[variable], originalType);
+          merged[variable] = inferrer.types
+              .addPhiInput(variable, merged[variable], originalType);
         }
       }
     }
     // Clean up Phi nodes with single input and store back result into
     // actual locals handler.
-    merged.locals.forEachOwnLocal((Local variable, TypeInformation type) {
-      locals[variable] = types.simplifyPhi(level, variable, type);
+    merged.forEachLocalUntilScope(merged,
+        (Local variable, TypeInformation type) {
+      _locals[variable] = inferrer.types.simplifyPhi(tryBlock, variable, type);
     });
-    seenReturnOrThrow =
-        allBranchesAbort && (!keepOwnLocals || seenReturnOrThrow);
+    return this;
   }
 
-  /**
-   * Merge [other] into this handler. Returns whether a local in this
-   * has changed. If [seen] is not null, we allocate new Phi nodes
-   * unless the local is already present in the set [seen]. This effectively
-   * overwrites the current type knowledge in this handler.
-   */
-  bool mergeHandler(LocalsHandler other, [Set<Local> seen]) {
-    if (other.seenReturnOrThrow) return false;
+  /// Merge all [LocalsHandler] in [handlers] into this handler.
+  /// Returns whether a local in this handler has changed.
+  bool mergeAll(InferrerEngine inferrer, Iterable<LocalsHandler> handlers) {
     bool changed = false;
-    other.locals.forEachLocalUntilNode(locals.block, (local, otherType) {
-      TypeInformation myType = locals[local];
-      if (myType == null) return;
-      TypeInformation newType;
-      if (seen != null && !seen.contains(local)) {
-        newType = types.allocatePhi(locals.block, local, otherType,
-            isTry: locals.isTry);
-        seen.add(local);
-      } else {
-        newType = types.addPhiInput(local, myType, otherType);
-      }
-      if (newType != myType) {
-        changed = true;
-        locals[local] = newType;
-      }
+    handlers.forEach((LocalsHandler other) {
+      VariableScope common = _locals.commonParent(other._locals);
+      assert(
+          common != null,
+          "No common parent for\n"
+          "1:${_locals.toStructuredText('  ')}\n"
+          "2:${other._locals.toStructuredText('  ')}");
+      assert(
+          common == _locals || _locals.variables == null,
+          "Non-empty common parent for\n"
+          "common:${common.toStructuredText('  ')}\n"
+          "1:${_locals.toStructuredText('  ')}\n"
+          "2:${other._locals.toStructuredText('  ')}");
+      other._locals.forEachLocalUntilScope(common, (local, otherType) {
+        TypeInformation myType = _locals[local];
+        if (myType == null) return;
+        TypeInformation newType =
+            inferrer.types.addPhiInput(local, myType, otherType);
+        if (newType != myType) {
+          changed = true;
+          _locals[local] = newType;
+        }
+      });
     });
     return changed;
   }
 
-  /**
-   * Merge all [LocalsHandler] in [handlers] into this handler.
-   * Returns whether a local in this handler has changed.
-   */
-  bool mergeAll(List<LocalsHandler> handlers) {
-    bool changed = false;
-    assert(!seenReturnOrThrow);
-    handlers.forEach((other) {
-      changed = mergeHandler(other) || changed;
-    });
-    return changed;
-  }
-
-  void startLoop(ir.Node loop) {
-    locals.forEachLocal((Local variable, TypeInformation type) {
+  void startLoop(InferrerEngine inferrer, ir.Node loop) {
+    _locals.forEachLocal((Local variable, TypeInformation type) {
       TypeInformation newType =
-          types.allocateLoopPhi(loop, variable, type, isTry: false);
+          inferrer.types.allocateLoopPhi(loop, variable, type, isTry: false);
       if (newType != type) {
-        locals[variable] = newType;
+        _locals[variable] = newType;
       }
     });
   }
 
-  void endLoop(ir.Node loop) {
-    locals.forEachLocal((Local variable, TypeInformation type) {
-      TypeInformation newType = types.simplifyPhi(loop, variable, type);
+  void endLoop(InferrerEngine inferrer, ir.Node loop) {
+    _locals.forEachLocal((Local variable, TypeInformation type) {
+      TypeInformation newType =
+          inferrer.types.simplifyPhi(loop, variable, type);
       if (newType != type) {
-        locals[variable] = newType;
+        _locals[variable] = newType;
       }
     });
   }
 
-  void updateField(FieldEntity element, TypeInformation type) {
-    fieldScope.updateField(element, type);
+  String toStructuredText(String indent) {
+    StringBuffer sb = new StringBuffer();
+    _toStructuredText(sb, indent);
+    return sb.toString();
+  }
+
+  void _toStructuredText(StringBuffer sb, String indent) {
+    sb.write('LocalsHandler($hashCode) [');
+    sb.write('\n${indent}  locals:');
+    _locals._toStructuredText(sb, '${indent}    ');
+    sb.write('\n]');
   }
 
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write('LocalsHandler(');
-    sb.write('locals=$locals');
+    sb.write('locals=$_locals');
     sb.write(')');
     return sb.toString();
   }
diff --git a/pkg/compiler/lib/src/inferrer/map_tracer.dart b/pkg/compiler/lib/src/inferrer/map_tracer.dart
index 83ad71c..e9da06a 100644
--- a/pkg/compiler/lib/src/inferrer/map_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/map_tracer.dart
@@ -43,12 +43,10 @@
 
   MapTracerVisitor(tracedType, inferrer) : super(tracedType, inferrer);
 
-  /**
-   * Returns [true] if the analysis completed successfully, [false]
-   * if it bailed out. In the former case, [keyAssignments] and
-   * [valueAssignments] hold a list of [TypeInformation] nodes that
-   * flow into the key and value types of this map.
-   */
+  /// Returns [true] if the analysis completed successfully, [false]
+  /// if it bailed out. In the former case, [keyAssignments] and
+  /// [valueAssignments] hold a list of [TypeInformation] nodes that
+  /// flow into the key and value types of this map.
   bool run() {
     analyze();
     MapTypeInformation map = tracedType;
diff --git a/pkg/compiler/lib/src/inferrer/node_tracer.dart b/pkg/compiler/lib/src/inferrer/node_tracer.dart
index b09dfcc..e0abccf 100644
--- a/pkg/compiler/lib/src/inferrer/node_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/node_tracer.dart
@@ -6,8 +6,8 @@
 
 import '../common/names.dart' show Identifiers;
 import '../elements/entities.dart';
-import '../types/abstract_value_domain.dart';
 import '../util/util.dart' show Setlet;
+import 'abstract_value_domain.dart';
 import 'debug.dart' as debug;
 import 'inferrer_engine.dart';
 import 'type_graph_nodes.dart';
@@ -249,11 +249,9 @@
     }
   }
 
-  /**
-   * Checks whether this is a call to a list adding method. The definition of
-   * what list adding means has to stay in sync with
-   * [isParameterOfListAddingMethod].
-   */
+  /// Checks whether this is a call to a list adding method. The definition of
+  /// what list adding means has to stay in sync with
+  /// [isParameterOfListAddingMethod].
   bool mightAddToContainer(DynamicCallSiteTypeInformation info) {
     if (info.arguments == null) return false;
     if (info.arguments.named.isNotEmpty) return false;
@@ -275,20 +273,16 @@
     return currentUser == arguments[index];
   }
 
-  /**
-   * Checks whether the call site flows the currentUser to the key argument of
-   * an indexing setter. This must be kept in sync with
-   * [isParameterOfMapAddingMethod].
-   */
+  /// Checks whether the call site flows the currentUser to the key argument of
+  /// an indexing setter. This must be kept in sync with
+  /// [isParameterOfMapAddingMethod].
   bool isIndexSetKey(DynamicCallSiteTypeInformation info) {
     return isIndexSetArgument(info, 0);
   }
 
-  /**
-   * Checks whether the call site flows the currentUser to the value argument of
-   * an indexing setter. This must be kept in sync with
-   * [isParameterOfListAddingMethod] and [isParameterOfMapAddingMethod].
-   */
+  /// Checks whether the call site flows the currentUser to the value argument
+  /// of an indexing setter. This must be kept in sync with
+  /// [isParameterOfListAddingMethod] and [isParameterOfMapAddingMethod].
   bool isIndexSetValue(DynamicCallSiteTypeInformation info) {
     return isIndexSetArgument(info, 1);
   }
@@ -398,11 +392,9 @@
     }
   }
 
-  /**
-   * Check whether element is the parameter of a list adding method.
-   * The definition of what a list adding method is has to stay in sync with
-   * [mightAddToContainer].
-   */
+  /// Check whether element is the parameter of a list adding method.
+  /// The definition of what a list adding method is has to stay in sync with
+  /// [mightAddToContainer].
   bool isParameterOfListAddingMethod(ParameterTypeInformation parameterInfo) {
     if (!parameterInfo.isRegularParameter) return false;
     if (parameterInfo.method.enclosingClass !=
@@ -413,11 +405,9 @@
     return (name == '[]=') || (name == 'add') || (name == 'insert');
   }
 
-  /**
-   * Check whether element is the parameter of a list adding method.
-   * The definition of what a list adding method is has to stay in sync with
-   * [isIndexSetKey] and [isIndexSetValue].
-   */
+  /// Check whether element is the parameter of a list adding method.
+  /// The definition of what a list adding method is has to stay in sync with
+  /// [isIndexSetKey] and [isIndexSetValue].
   bool isParameterOfMapAddingMethod(ParameterTypeInformation parameterInfo) {
     if (!parameterInfo.isRegularParameter) return false;
     if (parameterInfo.method.enclosingClass !=
diff --git a/pkg/compiler/lib/src/inferrer/trivial.dart b/pkg/compiler/lib/src/inferrer/trivial.dart
new file mode 100644
index 0000000..63d0b8e
--- /dev/null
+++ b/pkg/compiler/lib/src/inferrer/trivial.dart
@@ -0,0 +1,449 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
+import '../elements/entities.dart';
+import '../elements/names.dart';
+import '../serialization/serialization.dart';
+import '../universe/selector.dart';
+import '../universe/world_builder.dart';
+import '../universe/use.dart';
+import '../world.dart';
+import 'abstract_value_domain.dart';
+
+class TrivialAbstractValue implements AbstractValue {
+  const TrivialAbstractValue();
+
+  String toString() => '?';
+}
+
+class TrivialAbstractValueDomain implements AbstractValueDomain {
+  const TrivialAbstractValueDomain();
+
+  @override
+  AbstractValue get dynamicType => const TrivialAbstractValue();
+
+  @override
+  void writeAbstractValueToDataSink(DataSink sink, AbstractValue value) {}
+
+  @override
+  AbstractValue readAbstractValueFromDataSource(DataSource source) =>
+      const TrivialAbstractValue();
+
+  @override
+  String getCompactText(AbstractValue value) => '?';
+
+  @override
+  AbstractBool isFixedLengthJsIndexable(AbstractValue value) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool isJsIndexableAndIterable(AbstractValue value) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool isJsIndexable(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  MemberEntity locateSingleMember(AbstractValue receiver, Selector selector) =>
+      null;
+
+  @override
+  AbstractBool isIn(AbstractValue subset, AbstractValue superset) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool contains(AbstractValue superset, AbstractValue subset) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool needsNoSuchMethodHandling(
+          AbstractValue receiver, Selector selector) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool isTargetingMember(
+          AbstractValue receiver, MemberEntity member, Name name) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractValue computeReceiver(Iterable<MemberEntity> members) =>
+      const TrivialAbstractValue();
+
+  @override
+  PrimitiveConstantValue getPrimitiveValue(AbstractValue value) => null;
+
+  @override
+  AbstractValue createPrimitiveValue(
+          AbstractValue originalValue, PrimitiveConstantValue value) =>
+      const TrivialAbstractValue();
+
+  @override
+  bool isPrimitiveValue(AbstractValue value) => false;
+
+  @override
+  MemberEntity getAllocationElement(AbstractValue value) => null;
+
+  @override
+  Object getAllocationNode(AbstractValue value) => null;
+
+  @override
+  AbstractValue getGeneralization(AbstractValue value) =>
+      const TrivialAbstractValue();
+
+  @override
+  bool isSpecializationOf(
+          AbstractValue specialization, AbstractValue generalization) =>
+      false;
+
+  @override
+  AbstractValue getDictionaryValueForKey(AbstractValue value, String key) {
+    throw new UnsupportedError(
+        "TrivialAbstractValueDomain.getDictionaryValueForKey");
+  }
+
+  @override
+  bool containsDictionaryKey(AbstractValue value, String key) {
+    throw new UnsupportedError(
+        "TrivialAbstractValueDomain.containsDictionaryKey");
+  }
+
+  @override
+  AbstractValue createDictionaryValue(
+          AbstractValue originalValue,
+          Object allocationNode,
+          MemberEntity allocationElement,
+          AbstractValue key,
+          AbstractValue value,
+          Map<String, AbstractValue> mappings) =>
+      const TrivialAbstractValue();
+
+  @override
+  bool isDictionary(AbstractValue value) => false;
+
+  @override
+  AbstractValue getMapValueType(AbstractValue value) {
+    throw new UnsupportedError("TrivialAbstractValueDomain.getMapValueType");
+  }
+
+  @override
+  AbstractValue getMapKeyType(AbstractValue value) {
+    throw new UnsupportedError("TrivialAbstractValueDomain.getMapKeyType");
+  }
+
+  @override
+  AbstractValue createMapValue(
+          AbstractValue originalValue,
+          Object allocationNode,
+          MemberEntity allocationElement,
+          AbstractValue key,
+          AbstractValue value) =>
+      const TrivialAbstractValue();
+
+  @override
+  bool isMap(AbstractValue value) => false;
+
+  @override
+  int getContainerLength(AbstractValue value) => null;
+
+  @override
+  AbstractValue getContainerElementType(AbstractValue value) {
+    throw new UnsupportedError(
+        "TrivialAbstractValueDomain.getContainerElementType");
+  }
+
+  @override
+  AbstractValue createContainerValue(
+          AbstractValue originalValue,
+          Object allocationNode,
+          MemberEntity allocationElement,
+          AbstractValue elementType,
+          int length) =>
+      const TrivialAbstractValue();
+
+  @override
+  bool isContainer(AbstractValue value) => false;
+
+  @override
+  AbstractValue computeAbstractValueForConstant(ConstantValue value) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractBool containsAll(AbstractValue a) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool areDisjoint(AbstractValue a, AbstractValue b) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractValue intersection(AbstractValue a, AbstractValue b) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractValue unionOfMany(Iterable<AbstractValue> values) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractValue union(AbstractValue a, AbstractValue b) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractBool isPrimitiveOrNull(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isStringOrNull(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isString(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isBooleanOrNull(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isBoolean(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isDoubleOrNull(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isDouble(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isNumberOrNull(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isNumber(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isIntegerOrNull(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isPositiveIntegerOrNull(AbstractValue value) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool isPositiveInteger(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isUInt31(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isUInt32(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isInteger(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isInterceptor(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isPrimitiveString(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isArray(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isMutableIndexable(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isMutableArray(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isExtendableArray(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isFixedArray(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isIndexablePrimitive(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isPrimitiveArray(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isPrimitiveBoolean(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isPrimitiveNumber(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isPrimitive(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isNull(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  ClassEntity getExactClass(AbstractValue value) => null;
+
+  @override
+  AbstractBool isExactOrNull(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isExact(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isEmpty(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isInstanceOf(AbstractValue value, ClassEntity cls) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool isInstanceOfOrNull(AbstractValue value, ClassEntity cls) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool containsOnlyType(AbstractValue value, ClassEntity cls) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractBool containsType(AbstractValue value, ClassEntity cls) =>
+      AbstractBool.Maybe;
+
+  @override
+  AbstractValue includeNull(AbstractValue value) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractValue excludeNull(AbstractValue value) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractBool couldBeTypedArray(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractBool isTypedArray(AbstractValue value) => AbstractBool.Maybe;
+
+  @override
+  AbstractValue createNullableSubtype(ClassEntity cls) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractValue createNonNullSubtype(ClassEntity cls) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractValue createNonNullSubclass(ClassEntity cls) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractValue createNullableExact(ClassEntity cls) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractValue createNonNullExact(ClassEntity cls) =>
+      const TrivialAbstractValue();
+
+  @override
+  AbstractValue get asyncStarStreamType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get asyncFutureType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get syncStarIterableType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get emptyType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get constMapType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get constListType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get positiveIntType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get uint32Type => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get uint31Type => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get fixedListType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get growableListType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get nullType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get nonNullType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get mapType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get listType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get stringType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get numType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get doubleType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get intType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get boolType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get functionType => const TrivialAbstractValue();
+
+  @override
+  AbstractValue get typeType => const TrivialAbstractValue();
+}
+
+class TrivialAbstractValueStrategy implements AbstractValueStrategy {
+  const TrivialAbstractValueStrategy();
+
+  @override
+  AbstractValueDomain createDomain(JClosedWorld closedWorld) {
+    return const TrivialAbstractValueDomain();
+  }
+
+  @override
+  SelectorConstraintsStrategy createSelectorStrategy() {
+    return const TrivialSelectorStrategy();
+  }
+}
+
+class TrivialSelectorStrategy implements SelectorConstraintsStrategy {
+  const TrivialSelectorStrategy();
+
+  @override
+  UniverseSelectorConstraints createSelectorConstraints(
+      Selector selector, Object initialConstraint) {
+    return const TrivialUniverseSelectorConstraints();
+  }
+
+  @override
+  bool appliedUnnamed(DynamicUse dynamicUse, MemberEntity member,
+      covariant JClosedWorld world) {
+    return dynamicUse.selector.appliesUnnamed(member);
+  }
+}
+
+class TrivialUniverseSelectorConstraints
+    implements UniverseSelectorConstraints {
+  const TrivialUniverseSelectorConstraints();
+
+  @override
+  bool addReceiverConstraint(Object constraint) => false;
+
+  @override
+  bool needsNoSuchMethodHandling(Selector selector, World world) => true;
+
+  @override
+  bool canHit(MemberEntity element, Name name, World world) => true;
+
+  String toString() => 'TrivialUniverseSelectorConstraints:$hashCode';
+}
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
index 549c287..9eadce5 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
@@ -6,7 +6,7 @@
 import '../../compiler_new.dart';
 import '../elements/entities.dart';
 import '../elements/entity_utils.dart' as utils;
-import '../types/abstract_value_domain.dart';
+import 'abstract_value_domain.dart';
 import 'inferrer_engine.dart';
 import 'type_graph_nodes.dart';
 import 'debug.dart';
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index c8c20c2..d9f69ca 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -12,18 +12,16 @@
 import '../elements/entities.dart';
 import '../js_backend/inferred_data.dart';
 import '../js_model/elements.dart' show JClosureCallMethod;
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
 import '../world.dart';
+import 'abstract_value_domain.dart';
 import 'inferrer_engine.dart';
 import 'type_graph_nodes.dart';
+import 'types.dart';
 
-/**
- * A work queue for the inferrer. It filters out nodes that are tagged as
- * [TypeInformation.doNotEnqueue], as well as ensures through
- * [TypeInformation.inQueue] that a node is in the queue only once at
- * a time.
- */
+/// A work queue for the inferrer. It filters out nodes that are tagged as
+/// [TypeInformation.doNotEnqueue], as well as ensures through
+/// [TypeInformation.inQueue] that a node is in the queue only once at
+/// a time.
 class WorkQueue {
   final Queue<TypeInformation> queue = new Queue<TypeInformation>();
 
@@ -89,26 +87,14 @@
   GlobalTypeInferenceResults buildResults() {
     inferrer.close();
 
-    Map<ir.TreeNode, AbstractValue> allocatedLists =
-        <ir.TreeNode, AbstractValue>{};
-    Set<ir.TreeNode> checkedForGrowableLists = new Set<ir.TreeNode>();
-    inferrer.types.allocatedLists
-        .forEach((ir.TreeNode node, ListTypeInformation typeInformation) {
-      ListTypeInformation info = inferrer.types.allocatedLists[node];
-      if (info.checksGrowable) {
-        checkedForGrowableLists.add(node);
-      }
-      allocatedLists[node] = typeInformation.type;
-    });
-
     Map<MemberEntity, GlobalTypeInferenceMemberResult> memberResults =
         <MemberEntity, GlobalTypeInferenceMemberResult>{};
     Map<Local, AbstractValue> parameterResults = <Local, AbstractValue>{};
 
     void createMemberResults(
         MemberEntity member, MemberTypeInformation typeInformation) {
-      GlobalTypeInferenceElementData data = inferrer.dataOfMember(member);
-      data.compress();
+      GlobalTypeInferenceElementData data =
+          inferrer.dataOfMember(member).compress();
       bool isJsInterop = closedWorld.nativeData.isJsInteropMember(member);
 
       AbstractValue returnType;
@@ -126,13 +112,14 @@
 
       bool throwsAlways =
           // Always throws if the return type was inferred to be non-null empty.
-          returnType != null && abstractValueDomain.isEmpty(returnType);
+          returnType != null &&
+              abstractValueDomain.isEmpty(returnType).isDefinitelyTrue;
 
       bool isCalledOnce =
           typeInformation.isCalledOnce(); //isMemberCalledOnce(member);
 
       memberResults[member] = new GlobalTypeInferenceMemberResultImpl(
-          data, allocatedLists, returnType, type,
+          data, returnType, type,
           throwsAlways: throwsAlways, isCalledOnce: isCalledOnce);
     }
 
@@ -163,13 +150,26 @@
       parameterResults[parameter] = type;
     });
 
+    Map<ir.TreeNode, AbstractValue> allocatedLists =
+        <ir.TreeNode, AbstractValue>{};
+    Set<ir.TreeNode> checkedForGrowableLists = new Set<ir.TreeNode>();
+    inferrer.types.allocatedLists
+        .forEach((ir.TreeNode node, ListTypeInformation typeInformation) {
+      ListTypeInformation info = inferrer.types.allocatedLists[node];
+      if (info.checksGrowable) {
+        checkedForGrowableLists.add(node);
+      }
+      allocatedLists[node] = typeInformation.type;
+    });
+
     GlobalTypeInferenceResults results = new GlobalTypeInferenceResultsImpl(
         closedWorld,
         _inferredDataBuilder.close(closedWorld),
         memberResults,
         parameterResults,
         checkedForGrowableLists,
-        inferrer.returnsListElementTypeSet);
+        inferrer.returnsListElementTypeSet,
+        allocatedLists);
 
     inferrer.clear();
 
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 4b5d61e..794e62d 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -12,31 +12,29 @@
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/selector.dart' show Selector;
 import '../util/util.dart' show ImmutableEmptySet, Setlet;
 import '../world.dart' show JClosedWorld;
+import 'abstract_value_domain.dart';
 import 'debug.dart' as debug;
 import 'locals_handler.dart' show ArgumentsTypes;
 import 'inferrer_engine.dart';
 import 'type_system.dart';
 
-/**
- * Common class for all nodes in the graph. The current nodes are:
- *
- * - Concrete types
- * - Elements
- * - Call sites
- * - Narrowing instructions
- * - Phi instructions
- * - Containers (for lists)
- * - Type of the element in a container
- *
- * A node has a set of assignments and users. Assignments are used to
- * compute the type of the node ([TypeInformation.computeType]). Users are
- * added to the inferrer's work queue when the type of the node
- * changes.
- */
+/// Common class for all nodes in the graph. The current nodes are:
+///
+/// - Concrete types
+/// - Elements
+/// - Call sites
+/// - Narrowing instructions
+/// - Phi instructions
+/// - Containers (for lists)
+/// - Type of the element in a container
+///
+/// A node has a set of assignments and users. Assignments are used to
+/// compute the type of the node ([TypeInformation.computeType]). Users are
+/// added to the inferrer's work queue when the type of the node
+/// changes.
 abstract class TypeInformation {
   Set<TypeInformation> users;
   var /* List|ParameterAssignments */ _assignments;
@@ -149,16 +147,12 @@
     return abandonInferencing ? safeType(inferrer) : computeType(inferrer);
   }
 
-  /**
-   * Computes a new type for this [TypeInformation] node depending on its
-   * potentially updated inputs.
-   */
+  /// Computes a new type for this [TypeInformation] node depending on its
+  /// potentially updated inputs.
   AbstractValue computeType(InferrerEngine inferrer);
 
-  /**
-   * Returns an approximation for this [TypeInformation] node that is always
-   * safe to use. Used when abandoning inference on a node.
-   */
+  /// Returns an approximation for this [TypeInformation] node that is always
+  /// safe to use. Used when abandoning inference on a node.
   AbstractValue safeType(InferrerEngine inferrer) {
     return inferrer.types.dynamicType.type;
   }
@@ -227,14 +221,14 @@
     _assignments = null;
   }
 
-  String toStructuredTest() {
+  String toStructuredText(String indent) {
     StringBuffer sb = new StringBuffer();
-    _toStructuredText(sb, '');
+    _toStructuredText(sb, indent, new Set<TypeInformation>());
     return sb.toString();
   }
 
-  void _toStructuredText(StringBuffer sb, String indent) {
-    sb.write(indent);
+  void _toStructuredText(
+      StringBuffer sb, String indent, Set<TypeInformation> seen) {
     sb.write(toString());
   }
 }
@@ -243,14 +237,12 @@
   bool mightBePassedToFunctionApply = false;
 }
 
-/**
- * Marker node used only during tree construction but not during actual type
- * refinement.
- *
- * Currently, this is used to give a type to an optional parameter even before
- * the corresponding default expression has been analyzed. See
- * [getDefaultTypeOfParameter] and [setDefaultTypeOfParameter] for details.
- */
+/// Marker node used only during tree construction but not during actual type
+/// refinement.
+///
+/// Currently, this is used to give a type to an optional parameter even before
+/// the corresponding default expression has been analyzed. See
+/// [getDefaultTypeOfParameter] and [setDefaultTypeOfParameter] for details.
 class PlaceholderTypeInformation extends TypeInformation {
   PlaceholderTypeInformation(
       AbstractValueDomain abstractValueDomain, MemberTypeInformation context)
@@ -267,13 +259,11 @@
   toString() => "Placeholder [$hashCode]";
 }
 
-/**
- * Parameters of instance functions behave differently than other
- * elements because the inferrer may remove assignments. This happens
- * when the receiver of a dynamic call site can be refined
- * to a type where we know more about which instance method is being
- * called.
- */
+/// Parameters of instance functions behave differently than other
+/// elements because the inferrer may remove assignments. This happens
+/// when the receiver of a dynamic call site can be refined
+/// to a type where we know more about which instance method is being
+/// called.
 class ParameterAssignments extends IterableBase<TypeInformation> {
   final Map<TypeInformation, int> assignments = new Map<TypeInformation, int>();
 
@@ -314,33 +304,31 @@
   String toString() => assignments.keys.toList().toString();
 }
 
-/**
- * A node representing a resolved element of the component. The kind of
- * elements that need an [ElementTypeInformation] are:
- *
- * - Functions (including getters and setters)
- * - Constructors (factory or generative)
- * - Fields
- * - Parameters
- * - Local variables mutated in closures
- *
- * The [ElementTypeInformation] of a function and a constructor is its
- * return type.
- *
- * Note that a few elements of these kinds must be treated specially,
- * and they are dealt in [ElementTypeInformation.handleSpecialCases]:
- *
- * - Parameters of closures, `noSuchMethod` and `call` instance
- *   methods: we currently do not infer types for those.
- *
- * - Fields and parameters being assigned by synthesized calls done by
- *   the backend: we do not know what types the backend will use.
- *
- * - Native functions and fields: because native methods contain no Dart
- *   code, and native fields do not have Dart assignments, we just
- *   trust their type annotation.
- *
- */
+/// A node representing a resolved element of the component. The kind of
+/// elements that need an [ElementTypeInformation] are:
+///
+/// - Functions (including getters and setters)
+/// - Constructors (factory or generative)
+/// - Fields
+/// - Parameters
+/// - Local variables mutated in closures
+///
+/// The [ElementTypeInformation] of a function and a constructor is its
+/// return type.
+///
+/// Note that a few elements of these kinds must be treated specially,
+/// and they are dealt in [ElementTypeInformation.handleSpecialCases]:
+///
+/// - Parameters of closures, `noSuchMethod` and `call` instance
+///   methods: we currently do not infer types for those.
+///
+/// - Fields and parameters being assigned by synthesized calls done by
+///   the backend: we do not know what types the backend will use.
+///
+/// - Native functions and fields: because native methods contain no Dart
+///   code, and native fields do not have Dart assignments, we just
+///   trust their type annotation.
+///
 abstract class ElementTypeInformation extends TypeInformation {
   /// Marker to disable inference for closures in [handleSpecialCases].
   bool disableInferenceForClosures = true;
@@ -360,42 +348,36 @@
   String get debugName;
 }
 
-/**
- * A node representing members in the broadest sense:
- *
- * - Functions
- * - Constructors
- * - Fields (also synthetic ones due to closures)
- * - Local functions (closures)
- *
- * These should never be created directly but instead are constructed by
- * the [ElementTypeInformation] factory.
- */
+/// A node representing members in the broadest sense:
+///
+/// - Functions
+/// - Constructors
+/// - Fields (also synthetic ones due to closures)
+/// - Local functions (closures)
+///
+/// These should never be created directly but instead are constructed by
+/// the [ElementTypeInformation] factory.
 abstract class MemberTypeInformation extends ElementTypeInformation
     with ApplyableTypeInformation {
   final MemberEntity _member;
 
-  /**
-   * If [element] is a function, [closurizedCount] is the number of
-   * times it is closurized. The value gets updated while inferring.
-   */
+  /// If [element] is a function, [closurizedCount] is the number of
+  /// times it is closurized. The value gets updated while inferring.
   int closurizedCount = 0;
 
   // Strict `bool` value is computed in cleanup(). Also used as a flag to see if
   // cleanup has been called.
   bool _isCalledOnce = null;
 
-  /**
-   * This map contains the callers of [element]. It stores all unique call sites
-   * to enable counting the global number of call sites of [element].
-   *
-   * A call site is either an AST [ast.Node], an [Element] (see uses of
-   * [synthesizeForwardingCall] in [SimpleTypeInferrerVisitor]) or an IR
-   * [ir.Node].
-   *
-   * The global information is summarized in [cleanup], after which [_callers]
-   * is set to `null`.
-   */
+  /// This map contains the callers of [element]. It stores all unique call
+  /// sites to enable counting the global number of call sites of [element].
+  ///
+  /// A call site is either an AST [ast.Node], an [Element] (see uses of
+  /// [synthesizeForwardingCall] in [SimpleTypeInferrerVisitor]) or an IR
+  /// [ir.Node].
+  ///
+  /// The global information is summarized in [cleanup], after which [_callers]
+  /// is set to `null`.
   Map<MemberEntity, Setlet<Object>> _callers;
 
   MemberTypeInformation._internal(
@@ -478,8 +460,7 @@
   AbstractValue potentiallyNarrowType(
       AbstractValue mask, InferrerEngine inferrer) {
     if (inferrer.options.assignmentCheckPolicy.isTrusted ||
-        inferrer.options.assignmentCheckPolicy.isEmitted ||
-        inferrer.trustTypeAnnotations(_member)) {
+        inferrer.options.assignmentCheckPolicy.isEmitted) {
       return _potentiallyNarrowType(mask, inferrer);
     }
     return mask;
@@ -674,15 +655,13 @@
   }
 }
 
-/**
- * A node representing parameters:
- *
- * - Parameters
- * - Initializing formals
- *
- * These should never be created directly but instead are constructed by
- * the [ElementTypeInformation] factory.
- */
+/// A node representing parameters:
+///
+/// - Parameters
+/// - Initializing formals
+///
+/// These should never be created directly but instead are constructed by
+/// the [ElementTypeInformation] factory.
 class ParameterTypeInformation extends ElementTypeInformation {
   final Local _parameter;
   final DartType _type;
@@ -792,8 +771,7 @@
 
   AbstractValue potentiallyNarrowType(
       AbstractValue mask, InferrerEngine inferrer) {
-    if (inferrer.options.parameterCheckPolicy.isTrusted ||
-        inferrer.trustTypeAnnotations(_method)) {
+    if (inferrer.options.parameterCheckPolicy.isTrusted) {
       // In checked or strong mode we don't trust the types of the arguments
       // passed to a parameter. The means that the checking of a parameter is
       // based on the actual arguments.
@@ -874,16 +852,14 @@
   throw new StateError('Unexpected call type $callType.');
 }
 
-/**
- * A [CallSiteTypeInformation] is a call found in the AST, or a
- * synthesized call for implicit calls in Dart (such as forwarding
- * factories). The [_call] field is a [ast.Node] for the former, and an
- * [Element] for the latter.
- *
- * In the inferrer graph, [CallSiteTypeInformation] nodes do not have
- * any assignment. They rely on the [caller] field for static calls,
- * and [selector] and [receiver] fields for dynamic calls.
- */
+/// A [CallSiteTypeInformation] is a call found in the AST, or a
+/// synthesized call for implicit calls in Dart (such as forwarding
+/// factories). The [_call] field is a [ast.Node] for the former, and an
+/// [Element] for the latter.
+///
+/// In the inferrer graph, [CallSiteTypeInformation] nodes do not have
+/// any assignment. They rely on the [caller] field for static calls,
+/// and [selector] and [receiver] fields for dynamic calls.
 abstract class CallSiteTypeInformation extends TypeInformation
     with ApplyableTypeInformation {
   final Object _call;
@@ -1071,20 +1047,18 @@
     });
   }
 
-  /**
-   * We optimize certain operations on the [int] class because we know more
-   * about their return type than the actual Dart code. For example, we know int
-   * + int returns an int. The Dart library code for [int.operator+] only says
-   * it returns a [num].
-   *
-   * Returns the more precise TypeInformation, or `null` to defer to the library
-   * code.
-   */
+  /// We optimize certain operations on the [int] class because we know more
+  /// about their return type than the actual Dart code. For example, we know
+  /// int + int returns an int. The Dart library code for [int.operator+] only
+  /// says it returns a [num].
+  ///
+  /// Returns the more precise TypeInformation, or `null` to defer to the
+  /// library code.
   TypeInformation handleIntrisifiedSelector(
       Selector selector, AbstractValue mask, InferrerEngine inferrer) {
     JClosedWorld closedWorld = inferrer.closedWorld;
     if (mask == null) return null;
-    if (!inferrer.abstractValueDomain.isIntegerOrNull(mask)) {
+    if (inferrer.abstractValueDomain.isIntegerOrNull(mask).isPotentiallyFalse) {
       return null;
     }
     if (!selector.isCall && !selector.isOperator) return null;
@@ -1242,8 +1216,8 @@
                 return abstractValueDomain.getDictionaryValueForKey(
                     typeMask, key);
               } else {
-                // The typeMap is precise, so if we do not find the key, the lookup
-                // will be [null] at runtime.
+                // The typeMap is precise, so if we do not find the key, the
+                // lookup will be [null] at runtime.
                 if (debug.VERBOSE) {
                   print("Dictionary lookup for $key yields [null].");
                 }
@@ -1265,7 +1239,8 @@
         }
       }));
     }
-    if (isConditional && abstractValueDomain.canBeNull(receiver.type)) {
+    if (isConditional &&
+        abstractValueDomain.isNull(receiver.type).isPotentiallyTrue) {
       // Conditional call sites (e.g. `a?.b`) may be null if the receiver is
       // null.
       result = abstractValueDomain.includeNull(result);
@@ -1365,16 +1340,14 @@
   }
 }
 
-/**
- * A [ConcreteTypeInformation] represents a type that needed
- * to be materialized during the creation of the graph. For example,
- * literals, [:this:] or [:super:] need a [ConcreteTypeInformation].
- *
- * [ConcreteTypeInformation] nodes have no assignment. Also, to save
- * on memory, we do not add users to [ConcreteTypeInformation] nodes,
- * because we know such node will never be refined to a different
- * type.
- */
+/// A [ConcreteTypeInformation] represents a type that needed
+/// to be materialized during the creation of the graph. For example,
+/// literals, [:this:] or [:super:] need a [ConcreteTypeInformation].
+///
+/// [ConcreteTypeInformation] nodes have no assignment. Also, to save
+/// on memory, we do not add users to [ConcreteTypeInformation] nodes,
+/// because we know such node will never be refined to a different
+/// type.
 class ConcreteTypeInformation extends TypeInformation {
   ConcreteTypeInformation(AbstractValue type) : super.untracked(type) {
     this.isStable = true;
@@ -1448,25 +1421,23 @@
   }
 }
 
-/**
- * A [NarrowTypeInformation] narrows a [TypeInformation] to a type,
- * represented in [typeAnnotation].
- *
- * A [NarrowTypeInformation] node has only one assignment: the
- * [TypeInformation] it narrows.
- *
- * [NarrowTypeInformation] nodes are created for:
- *
- * - Code after `is` and `as` checks, where we have more information
- *   on the type of the right hand side of the expression.
- *
- * - Code after a dynamic call, where we have more information on the
- *   type of the receiver: it can only be of a class that holds a
- *   potential target of this dynamic call.
- *
- * - In checked mode, after a type annotation, we have more
- *   information on the type of a local.
- */
+/// A [NarrowTypeInformation] narrows a [TypeInformation] to a type,
+/// represented in [typeAnnotation].
+///
+/// A [NarrowTypeInformation] node has only one assignment: the
+/// [TypeInformation] it narrows.
+///
+/// [NarrowTypeInformation] nodes are created for:
+///
+/// - Code after `is` and `as` checks, where we have more information
+///   on the type of the right hand side of the expression.
+///
+/// - Code after a dynamic call, where we have more information on the
+///   type of the receiver: it can only be of a class that holds a
+///   potential target of this dynamic call.
+///
+/// - In checked mode, after a type annotation, we have more
+///   information on the type of a local.
 class NarrowTypeInformation extends TypeInformation {
   final AbstractValue typeAnnotation;
 
@@ -1487,8 +1458,10 @@
     AbstractValue intersection =
         abstractValueDomain.intersection(input, typeAnnotation);
     if (debug.ANOMALY_WARN) {
-      if (!abstractValueDomain.contains(input, intersection) ||
-          !abstractValueDomain.contains(typeAnnotation, intersection)) {
+      if (abstractValueDomain.contains(input, intersection).isDefinitelyFalse ||
+          abstractValueDomain
+              .contains(typeAnnotation, intersection)
+              .isDefinitelyFalse) {
         print("ANOMALY WARNING: narrowed $input to $intersection via "
             "$typeAnnotation");
       }
@@ -1505,14 +1478,12 @@
   }
 }
 
-/**
- * An [InferredTypeInformation] is a [TypeInformation] that
- * defaults to the dynamic type until it is marked as being
- * inferred, at which point it computes its type based on
- * its assignments.
- */
+/// An [InferredTypeInformation] is a [TypeInformation] that
+/// defaults to the dynamic type until it is marked as being
+/// inferred, at which point it computes its type based on
+/// its assignments.
 abstract class InferredTypeInformation extends TypeInformation {
-  /** Whether the element type in that container has been inferred. */
+  /// Whether the element type in that container has been inferred.
   bool inferred = false;
 
   InferredTypeInformation(AbstractValueDomain abstractValueDomain,
@@ -1531,26 +1502,22 @@
   }
 }
 
-/**
- * A [ListTypeInformation] is a [TypeInformation] created
- * for each `List` instantiations.
- */
+/// A [ListTypeInformation] is a [TypeInformation] created
+/// for each `List` instantiations.
 class ListTypeInformation extends TypeInformation with TracedTypeInformation {
   final ElementInContainerTypeInformation elementType;
 
-  /** The container type before it is inferred. */
+  /// The container type before it is inferred.
   final AbstractValue originalType;
 
-  /** The length at the allocation site. */
+  /// The length at the allocation site.
   final int originalLength;
 
-  /** The length after the container has been traced. */
+  /// The length after the container has been traced.
   int inferredLength;
 
-  /**
-   * Whether this list goes through a growable check.
-   * We conservatively assume it does.
-   */
+  /// Whether this list goes through a growable check.
+  /// We conservatively assume it does.
   bool checksGrowable = true;
 
   ListTypeInformation(
@@ -1599,10 +1566,8 @@
   }
 }
 
-/**
- * An [ElementInContainerTypeInformation] holds the common type of the
- * elements in a [ListTypeInformation].
- */
+/// An [ElementInContainerTypeInformation] holds the common type of the
+/// elements in a [ListTypeInformation].
 class ElementInContainerTypeInformation extends InferredTypeInformation {
   ElementInContainerTypeInformation(AbstractValueDomain abstractValueDomain,
       MemberTypeInformation context, elementType)
@@ -1615,10 +1580,8 @@
   }
 }
 
-/**
- * A [MapTypeInformation] is a [TypeInformation] created
- * for maps.
- */
+/// A [MapTypeInformation] is a [TypeInformation] created
+/// for maps.
 class MapTypeInformation extends TypeInformation with TracedTypeInformation {
   // When in Dictionary mode, this map tracks the type of the values that
   // have been assigned to a specific [String] key.
@@ -1732,8 +1695,8 @@
       for (String key in typeInfoMap.keys) {
         TypeInformation value = typeInfoMap[key];
         if (!abstractValueDomain.containsDictionaryKey(type, key) &&
-            !abstractValueDomain.containsAll(value.type) &&
-            !abstractValueDomain.canBeNull(value.type)) {
+            abstractValueDomain.containsAll(value.type).isDefinitelyFalse &&
+            abstractValueDomain.isNull(value.type).isDefinitelyFalse) {
           return toTypeMask(inferrer);
         }
         if (abstractValueDomain.getDictionaryValueForKey(type, key) !=
@@ -1776,10 +1739,8 @@
   }
 }
 
-/**
- * A [KeyInMapTypeInformation] holds the common type
- * for the keys in a [MapTypeInformation]
- */
+/// A [KeyInMapTypeInformation] holds the common type
+/// for the keys in a [MapTypeInformation]
 class KeyInMapTypeInformation extends InferredTypeInformation {
   KeyInMapTypeInformation(AbstractValueDomain abstractValueDomain,
       MemberTypeInformation context, TypeInformation keyType)
@@ -1792,10 +1753,8 @@
   String toString() => 'Key in Map $type';
 }
 
-/**
- * A [ValueInMapTypeInformation] holds the common type
- * for the values in a [MapTypeInformation]
- */
+/// A [ValueInMapTypeInformation] holds the common type
+/// for the values in a [MapTypeInformation]
 class ValueInMapTypeInformation extends InferredTypeInformation {
   // [nonNull] is set to true if this value is known to be part of the map.
   // Note that only values assigned to a specific key value in dictionary
@@ -1820,10 +1779,8 @@
   String toString() => 'Value in Map $type';
 }
 
-/**
- * A [PhiElementTypeInformation] is an union of
- * [ElementTypeInformation], that is local to a method.
- */
+/// A [PhiElementTypeInformation] is an union of
+/// [ElementTypeInformation], that is local to a method.
 class PhiElementTypeInformation extends TypeInformation {
   final ir.Node branchNode;
   final Local variable;
@@ -1838,22 +1795,19 @@
     return inferrer.types.computeTypeMask(assignments);
   }
 
-  String toString() => 'Phi $variable $type';
+  String toString() => 'Phi($hashCode) $variable $type';
 
-  void _toStructuredText(StringBuffer sb, String indent) {
-    sb.write(indent);
-    sb.write(toString());
-    if (branchNode != null) {
-      String context = '$branchNode'.replaceAll('\n', ' ');
-      if (context.length > 80) {
-        context = context.substring(0, 77) + '...';
-      }
-      sb.write(': $context');
-    } else {
+  void _toStructuredText(
+      StringBuffer sb, String indent, Set<TypeInformation> seen) {
+    if (seen.add(this)) {
+      sb.write('${toString()} [');
       for (TypeInformation assignment in assignments) {
-        sb.write('\n');
-        assignment._toStructuredText(sb, '$indent  ');
+        sb.write('\n$indent  ');
+        assignment._toStructuredText(sb, '$indent  ', seen);
       }
+      sb.write(' ]');
+    } else {
+      sb.write('${toString()} [ ... ]');
     }
   }
 
@@ -1895,9 +1849,7 @@
   }
 }
 
-/**
- * Mixin for [TypeInformation] nodes that can bail out during tracing.
- */
+/// Mixin for [TypeInformation] nodes that can bail out during tracing.
 abstract class TracedTypeInformation implements TypeInformation {
   /// Set to false once analysis has succeeded.
   bool bailedOut = true;
@@ -1907,19 +1859,16 @@
 
   Set<TypeInformation> _flowsInto;
 
-  /**
-   * The set of [TypeInformation] nodes where values from the traced node could
-   * flow in.
-   */
+  /// The set of [TypeInformation] nodes where values from the traced node could
+  /// flow in.
   Set<TypeInformation> get flowsInto {
     return (_flowsInto == null)
         ? const ImmutableEmptySet<TypeInformation>()
         : _flowsInto;
   }
 
-  /**
-   * Adds [nodes] to the sets of values this [TracedTypeInformation] flows into.
-   */
+  /// Adds [nodes] to the sets of values this [TracedTypeInformation] flows
+  /// into.
   void addFlowsIntoTargets(Iterable<TypeInformation> nodes) {
     if (_flowsInto == null) {
       _flowsInto = nodes.toSet();
diff --git a/pkg/compiler/lib/src/inferrer/type_system.dart b/pkg/compiler/lib/src/inferrer/type_system.dart
index e2c5335..21c5316 100644
--- a/pkg/compiler/lib/src/inferrer/type_system.dart
+++ b/pkg/compiler/lib/src/inferrer/type_system.dart
@@ -6,9 +6,9 @@
 import '../common.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/selector.dart';
 import '../world.dart';
+import 'abstract_value_domain.dart';
 import 'type_graph_nodes.dart';
 
 /// Strategy for creating type information from members and parameters and type
@@ -43,9 +43,7 @@
   bool checkClassEntity(ClassEntity cls);
 }
 
-/**
- * The class [SimpleInferrerVisitor] will use when working on types.
- */
+/// The class [SimpleInferrerVisitor] will use when working on types.
 class TypeSystem {
   final JClosedWorld _closedWorld;
   final TypeSystemStrategy strategy;
@@ -274,10 +272,8 @@
         _abstractValueDomain, value, _abstractValueDomain.boolType);
   }
 
-  /**
-   * Returns the least upper bound between [firstType] and
-   * [secondType].
-   */
+  /// Returns the least upper bound between [firstType] and
+  /// [secondType].
   TypeInformation computeLUB(
       TypeInformation firstType, TypeInformation secondType) {
     if (firstType == null) return secondType;
@@ -291,26 +287,24 @@
         _abstractValueDomain.union(firstType.type, secondType.type));
   }
 
-  /**
-   * Returns `true` if `selector` should be updated to reflect the new
-   * `receiverType`.
-   */
+  /// Returns `true` if `selector` should be updated to reflect the new
+  /// `receiverType`.
   bool selectorNeedsUpdate(TypeInformation info, AbstractValue mask) {
     return info.type != mask;
   }
 
-  /**
-   * Returns a new receiver type for this [selector] applied to
-   * [receiverType].
-   *
-   * The option [isConditional] is true when [selector] was seen in a
-   * conditional send (e.g.  `a?.selector`), in which case the returned type may
-   * be null.
-   */
+  /// Returns a new receiver type for this [selector] applied to
+  /// [receiverType].
+  ///
+  /// The option [isConditional] is true when [selector] was seen in a
+  /// conditional send (e.g.  `a?.selector`), in which case the returned type
+  /// may be null.
   TypeInformation refineReceiver(
       Selector selector, AbstractValue mask, TypeInformation receiver,
       {bool isConditional}) {
-    if (_abstractValueDomain.isExact(receiver.type)) return receiver;
+    if (_abstractValueDomain.isExact(receiver.type).isDefinitelyTrue) {
+      return receiver;
+    }
     AbstractValue otherType = _closedWorld.computeReceiverType(selector, mask);
     // Conditional sends (a?.b) can still narrow the possible types of `a`,
     // however, we still need to consider that `a` may be null.
@@ -321,8 +315,8 @@
     }
     // If this is refining to nullable subtype of `Object` just return
     // the receiver. We know the narrowing is useless.
-    if (_abstractValueDomain.canBeNull(otherType) &&
-        _abstractValueDomain.containsAll(otherType)) {
+    if (_abstractValueDomain.isNull(otherType).isPotentiallyTrue &&
+        _abstractValueDomain.containsAll(otherType).isPotentiallyTrue) {
       return receiver;
     }
     TypeInformation newType =
@@ -331,11 +325,9 @@
     return newType;
   }
 
-  /**
-   * Returns the intersection between [type] and [annotation].
-   * [isNullable] indicates whether the annotation implies a null
-   * type.
-   */
+  /// Returns the intersection between [type] and [annotation].
+  /// [isNullable] indicates whether the annotation implies a null
+  /// type.
   TypeInformation narrowType(TypeInformation type, DartType annotation,
       {bool isNullable: true}) {
     if (annotation.treatAsDynamic) return type;
@@ -365,7 +357,7 @@
     if (isNullable) {
       otherType = _abstractValueDomain.includeNull(otherType);
     }
-    if (_abstractValueDomain.isExact(type.type)) {
+    if (_abstractValueDomain.isExact(type.type).isDefinitelyTrue) {
       return type;
     } else {
       TypeInformation newType =
@@ -375,11 +367,9 @@
     }
   }
 
-  /**
-   * Returns the non-nullable type of [type].
-   */
+  /// Returns the non-nullable type of [type].
   TypeInformation narrowNotNull(TypeInformation type) {
-    if (_abstractValueDomain.isExact(type.type)) {
+    if (_abstractValueDomain.isExact(type.type).isDefinitelyTrue) {
       return type;
     }
     TypeInformation newType = new NarrowTypeInformation(_abstractValueDomain,
@@ -421,9 +411,7 @@
     return typeInformation;
   }
 
-  /**
-   * Returns the internal inferrer representation for [mask].
-   */
+  /// Returns the internal inferrer representation for [mask].
   ConcreteTypeInformation getConcreteTypeFor(AbstractValue mask) {
     assert(mask != null);
     return concreteTypes.putIfAbsent(mask, () {
@@ -472,7 +460,9 @@
     ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
     bool isTypedArray = typedDataClass != null &&
         _closedWorld.classHierarchy.isInstantiated(typedDataClass) &&
-        _abstractValueDomain.isInstanceOfOrNull(type.type, typedDataClass);
+        _abstractValueDomain
+            .isInstanceOfOrNull(type.type, typedDataClass)
+            .isDefinitelyTrue;
     bool isConst = (type.type == _abstractValueDomain.constListType);
     bool isFixed = (type.type == _abstractValueDomain.fixedListType) ||
         isConst ||
@@ -554,9 +544,7 @@
     return info.isConcrete ? info.type : mask;
   }
 
-  /**
-   * Returns a new type that unions [firstInput] and [secondInput].
-   */
+  /// Returns a new type that unions [firstInput] and [secondInput].
   TypeInformation allocateDiamondPhi(
       TypeInformation firstInput, TypeInformation secondInput) {
     PhiElementTypeInformation result = new PhiElementTypeInformation(
@@ -578,10 +566,8 @@
     return result;
   }
 
-  /**
-   * Returns a new type for holding the potential types of [element].
-   * [inputType] is the first incoming type of the phi.
-   */
+  /// Returns a new type for holding the potential types of [element].
+  /// [inputType] is the first incoming type of the phi.
   PhiElementTypeInformation allocatePhi(
       ir.Node node, Local variable, TypeInformation inputType,
       {bool isTry}) {
@@ -597,13 +583,11 @@
     return _addPhi(node, variable, inputType, isTry);
   }
 
-  /**
-   * Returns a new type for holding the potential types of [element].
-   * [inputType] is the first incoming type of the phi. [allocateLoopPhi]
-   * only differs from [allocatePhi] in that it allows the underlying
-   * implementation of [TypeSystem] to differentiate Phi nodes due to loops
-   * from other merging uses.
-   */
+  /// Returns a new type for holding the potential types of [element].
+  /// [inputType] is the first incoming type of the phi. [allocateLoopPhi]
+  /// only differs from [allocatePhi] in that it allows the underlying
+  /// implementation of [TypeSystem] to differentiate Phi nodes due to loops
+  /// from other merging uses.
   PhiElementTypeInformation allocateLoopPhi(
       ir.Node node, Local variable, TypeInformation inputType,
       {bool isTry}) {
@@ -611,12 +595,10 @@
     return _addPhi(node, variable, inputType, isTry);
   }
 
-  /**
-   * Simplies the phi representing [element] and of the type
-   * [phiType]. For example, if this phi has one incoming input, an
-   * implementation of this method could just return that incoming
-   * input type.
-   */
+  /// Simplies the phi representing [element] and of the type
+  /// [phiType]. For example, if this phi has one incoming input, an
+  /// implementation of this method could just return that incoming
+  /// input type.
   TypeInformation simplifyPhi(
       ir.Node node, Local variable, PhiElementTypeInformation phiType) {
     assert(phiType.branchNode == node);
@@ -624,9 +606,7 @@
     return phiType;
   }
 
-  /**
-   * Adds [newType] as an input of [phiType].
-   */
+  /// Adds [newType] as an input of [phiType].
   PhiElementTypeInformation addPhiInput(Local variable,
       PhiElementTypeInformation phiType, TypeInformation newType) {
     phiType.addAssignment(newType);
@@ -648,7 +628,9 @@
       // work the result will be `dynamic`.
       // TODO(sigmund): change to `mask == dynamicType` so we can continue to
       // track the non-nullable bit.
-      if (_abstractValueDomain.containsAll(mask)) return dynamicType;
+      if (_abstractValueDomain.containsAll(mask).isPotentiallyTrue) {
+        return dynamicType;
+      }
       list.add(mask);
     }
 
@@ -657,7 +639,9 @@
       newType =
           newType == null ? mask : _abstractValueDomain.union(newType, mask);
       // Likewise - stop early if we already reach dynamic.
-      if (_abstractValueDomain.containsAll(newType)) return dynamicType;
+      if (_abstractValueDomain.containsAll(newType).isPotentiallyTrue) {
+        return dynamicType;
+      }
     }
 
     return newType ?? _abstractValueDomain.emptyType;
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/constants.dart b/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
index 5003c72b..c539521 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/constants.dart
@@ -29,12 +29,6 @@
   }
 
   @override
-  TypeMask visitDeferred(
-      DeferredConstantValue constant, JClosedWorld closedWorld) {
-    return constant.referenced.accept(this, closedWorld);
-  }
-
-  @override
   TypeMask visitDeferredGlobal(
       DeferredGlobalConstantValue constant, JClosedWorld closedWorld) {
     return constant.referenced.accept(this, closedWorld);
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
index 9a64845..8463350 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart
@@ -4,14 +4,12 @@
 
 part of masks;
 
-/**
- * A [DictionaryTypeMask] is a [TypeMask] for a specific allocation
- * site of a map (currently only internal Map class) that is used as
- * a dictionary, i.e. a mapping from a set of statically known strings
- * to values. These typemasks only come into existence after the
- * [TypeGraphInferrer] has successfully identified such a usage. Otherwise,
- * the more general [MapTypeMask] is used.
- */
+/// A [DictionaryTypeMask] is a [TypeMask] for a specific allocation
+/// site of a map (currently only internal Map class) that is used as
+/// a dictionary, i.e. a mapping from a set of statically known strings
+/// to values. These typemasks only come into existence after the
+/// [TypeGraphInferrer] has successfully identified such a usage. Otherwise,
+/// the more general [MapTypeMask] is used.
 class DictionaryTypeMask extends MapTypeMask {
   /// Tag used for identifying serialized [DictionaryTypeMask] objects in a
   /// debugging data stream.
@@ -34,8 +32,8 @@
       DataSource source, JClosedWorld closedWorld) {
     source.begin(tag);
     TypeMask forwardTo = new TypeMask.readFromDataSource(source, closedWorld);
-    ir.TreeNode allocationNode = source.readTreeNode();
-    MemberEntity allocationElement = source.readMember();
+    ir.TreeNode allocationNode = source.readTreeNodeOrNull();
+    MemberEntity allocationElement = source.readMemberOrNull();
     TypeMask keyType = new TypeMask.readFromDataSource(source, closedWorld);
     TypeMask valueType = new TypeMask.readFromDataSource(source, closedWorld);
     Map<String, AbstractValue> typeMap = source.readStringMap(
@@ -50,10 +48,10 @@
     sink.writeEnum(TypeMaskKind.dictionary);
     sink.begin(tag);
     forwardTo.writeToDataSink(sink);
-    sink.writeTreeNode(allocationNode);
-    sink.writeMember(allocationElement);
-    valueType.writeToDataSink(sink);
+    sink.writeTreeNodeOrNull(allocationNode);
+    sink.writeMemberOrNull(allocationElement);
     keyType.writeToDataSink(sink);
+    valueType.writeToDataSink(sink);
     sink.writeStringMap(_typeMap, (AbstractValue value) {
       TypeMask typeMask = value;
       typeMask.writeToDataSink(sink);
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index c74600a..41db5e8 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -4,10 +4,8 @@
 
 part of masks;
 
-/**
- * A flat type mask is a type mask that has been flattened to contain a
- * base type.
- */
+/// A flat type mask is a type mask that has been flattened to contain a
+/// base type.
 class FlatTypeMask implements TypeMask {
   /// Tag used for identifying serialized [FlatTypeMask] objects in a
   /// debugging data stream.
@@ -45,10 +43,8 @@
 
   FlatTypeMask.internal(this.base, this.flags);
 
-  /**
-   * Ensures that the generated mask is normalized, i.e., a call to
-   * [TypeMask.assertIsNormalized] with the factory's result returns `true`.
-   */
+  /// Ensures that the generated mask is normalized, i.e., a call to
+  /// [TypeMask.assertIsNormalized] with the factory's result returns `true`.
   factory FlatTypeMask.normalized(
       ClassEntity base, int flags, JClosedWorld world) {
     if ((flags >> 1) == EMPTY || ((flags >> 1) == EXACT)) {
@@ -260,9 +256,7 @@
     }
   }
 
-  /**
-   * Returns whether or not this type mask contains all types.
-   */
+  /// Returns whether or not this type mask contains all types.
   bool containsAll(JClosedWorld closedWorld) {
     if (isEmptyOrNull || isExact) return false;
     return identical(base, closedWorld.commonElements.objectClass);
@@ -519,33 +513,30 @@
         : new TypeMask.nonNullEmpty();
   }
 
-  /**
-   * Returns whether [element] is a potential target when being
-   * invoked on this type mask. [selector] is used to ensure library
-   * privacy is taken into account.
-   */
-  bool canHit(
-      MemberEntity element, Selector selector, JClosedWorld closedWorld) {
+  /// Returns whether [element] is a potential target when being
+  /// invoked on this type mask. [selector] is used to ensure library
+  /// privacy is taken into account.
+  bool canHit(MemberEntity element, Name name, JClosedWorld closedWorld) {
     CommonElements commonElements = closedWorld.commonElements;
-    assert(element.name == selector.name);
+    assert(element.name == name.text);
     if (isEmpty) return false;
     if (isNull) {
       return closedWorld.hasElementIn(
-          commonElements.jsNullClass, selector, element);
+          commonElements.jsNullClass, name, element);
     }
 
     ClassEntity other = element.enclosingClass;
     if (other == commonElements.jsNullClass) {
       return isNullable;
     } else if (isExact) {
-      return closedWorld.hasElementIn(base, selector, element);
+      return closedWorld.hasElementIn(base, name, element);
     } else if (isSubclass) {
-      return closedWorld.hasElementIn(base, selector, element) ||
+      return closedWorld.hasElementIn(base, name, element) ||
           closedWorld.classHierarchy.isSubclassOf(other, base) ||
           closedWorld.hasAnySubclassThatMixes(base, other);
     } else {
       assert(isSubtype);
-      bool result = closedWorld.hasElementIn(base, selector, element) ||
+      bool result = closedWorld.hasElementIn(base, name, element) ||
           closedWorld.classHierarchy.isSubtypeOf(other, base) ||
           closedWorld.hasAnySubclassThatImplements(other, base) ||
           closedWorld.hasAnySubclassOfMixinUseThatImplements(other, base);
@@ -554,7 +545,7 @@
       // can be hit from any of the mixin applications.
       Iterable<ClassEntity> mixinUses = closedWorld.mixinUsesOf(base);
       return mixinUses.any((mixinApplication) =>
-          closedWorld.hasElementIn(mixinApplication, selector, element) ||
+          closedWorld.hasElementIn(mixinApplication, name, element) ||
           closedWorld.classHierarchy.isSubclassOf(other, mixinApplication) ||
           closedWorld.hasAnySubclassThatMixes(mixinApplication, other));
     }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
index 82b6bd0..7b8e73a 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart
@@ -4,10 +4,8 @@
 
 part of masks;
 
-/**
- * A type mask that wraps an other one, and delegate all its
- * implementation methods to it.
- */
+/// A type mask that wraps an other one, and delegate all its
+/// implementation methods to it.
 abstract class ForwardingTypeMask implements TypeMask {
   TypeMask get forwardTo;
 
@@ -98,9 +96,8 @@
     return forwardTo.needsNoSuchMethodHandling(selector, closedWorld);
   }
 
-  bool canHit(
-      MemberEntity element, Selector selector, JClosedWorld closedWorld) {
-    return forwardTo.canHit(element, selector, closedWorld);
+  bool canHit(MemberEntity element, Name name, JClosedWorld closedWorld) {
+    return forwardTo.canHit(element, name, closedWorld);
   }
 
   MemberEntity locateSingleMember(Selector selector, JClosedWorld closedWorld) {
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
index 5e6e2fb..2486256 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart
@@ -4,11 +4,9 @@
 
 part of masks;
 
-/**
- * A [MapTypeMask] is a [TypeMask] for a specific allocation
- * site of a map (currently only internal Map class) that will get specialized
- * once the [TypeGraphInferrer] phase finds a key and/or value type for it.
- */
+/// A [MapTypeMask] is a [TypeMask] for a specific allocation
+/// site of a map (currently only internal Map class) that will get specialized
+/// once the [TypeGraphInferrer] phase finds a key and/or value type for it.
 class MapTypeMask extends AllocationTypeMask {
   /// Tag used for identifying serialized [MapTypeMask] objects in a
   /// debugging data stream.
@@ -36,8 +34,8 @@
       DataSource source, JClosedWorld closedWorld) {
     source.begin(tag);
     TypeMask forwardTo = new TypeMask.readFromDataSource(source, closedWorld);
-    ir.TreeNode allocationNode = source.readTreeNode();
-    MemberEntity allocationElement = source.readMember();
+    ir.TreeNode allocationNode = source.readTreeNodeOrNull();
+    MemberEntity allocationElement = source.readMemberOrNull();
     TypeMask keyType = new TypeMask.readFromDataSource(source, closedWorld);
     TypeMask valueType = new TypeMask.readFromDataSource(source, closedWorld);
     source.end(tag);
@@ -50,10 +48,10 @@
     sink.writeEnum(TypeMaskKind.map);
     sink.begin(tag);
     forwardTo.writeToDataSink(sink);
-    sink.writeTreeNode(allocationNode);
-    sink.writeMember(allocationElement);
-    valueType.writeToDataSink(sink);
+    sink.writeTreeNodeOrNull(allocationNode);
+    sink.writeMemberOrNull(allocationElement);
     keyType.writeToDataSink(sink);
+    valueType.writeToDataSink(sink);
     sink.end(tag);
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index 6987117..17794f1 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -10,8 +10,8 @@
 import '../../common_elements.dart' show CommonElements;
 import '../../constants/values.dart';
 import '../../elements/entities.dart';
+import '../../elements/names.dart';
 import '../../serialization/serialization.dart';
-import '../../types/abstract_value_domain.dart';
 import '../../universe/class_hierarchy.dart';
 import '../../universe/selector.dart' show Selector;
 import '../../universe/use.dart' show DynamicUse;
@@ -19,6 +19,7 @@
     show UniverseSelectorConstraints, SelectorConstraintsStrategy;
 import '../../util/util.dart';
 import '../../world.dart' show JClosedWorld;
+import '../abstract_value_domain.dart';
 import '../type_graph_inferrer.dart' show TypeGraphInferrer;
 import 'constants.dart';
 
@@ -195,33 +196,33 @@
           commonElements.jsInterceptorClass, _closedWorld);
 
   @override
-  bool isTypedArray(TypeMask mask) {
+  AbstractBool isTypedArray(TypeMask mask) {
     // Just checking for `TypedData` is not sufficient, as it is an abstract
     // class any user-defined class can implement. So we also check for the
     // interface `JavaScriptIndexingBehavior`.
     ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
-    return typedDataClass != null &&
+    return AbstractBool.trueOrMaybe(typedDataClass != null &&
         _closedWorld.classHierarchy.isInstantiated(typedDataClass) &&
         mask.satisfies(typedDataClass, _closedWorld) &&
         mask.satisfies(_closedWorld.commonElements.jsIndexingBehaviorInterface,
-            _closedWorld);
+            _closedWorld));
   }
 
   @override
-  bool couldBeTypedArray(TypeMask mask) {
+  AbstractBool couldBeTypedArray(TypeMask mask) {
     bool intersects(TypeMask type1, TypeMask type2) =>
         !type1.intersection(type2, _closedWorld).isEmpty;
     // TODO(herhut): Maybe cache the TypeMask for typedDataClass and
     //               jsIndexingBehaviourInterface.
     ClassEntity typedDataClass = _closedWorld.commonElements.typedDataClass;
-    return typedDataClass != null &&
+    return AbstractBool.maybeOrFalse(typedDataClass != null &&
         _closedWorld.classHierarchy.isInstantiated(typedDataClass) &&
         intersects(mask, new TypeMask.subtype(typedDataClass, _closedWorld)) &&
         intersects(
             mask,
             new TypeMask.subtype(
                 _closedWorld.commonElements.jsIndexingBehaviorInterface,
-                _closedWorld));
+                _closedWorld)));
   }
 
   @override
@@ -256,19 +257,30 @@
   TypeMask includeNull(TypeMask mask) => mask.nullable();
 
   @override
-  bool containsType(TypeMask typeMask, ClassEntity cls) {
+  AbstractBool containsType(TypeMask typeMask, ClassEntity cls) {
+    return AbstractBool.trueOrMaybe(_containsType(typeMask, cls));
+  }
+
+  bool _containsType(TypeMask typeMask, ClassEntity cls) {
     return _closedWorld.classHierarchy.isInstantiated(cls) &&
         typeMask.contains(cls, _closedWorld);
   }
 
   @override
-  bool containsOnlyType(TypeMask typeMask, ClassEntity cls) {
+  AbstractBool containsOnlyType(TypeMask typeMask, ClassEntity cls) {
+    return AbstractBool.trueOrMaybe(_containsOnlyType(typeMask, cls));
+  }
+
+  bool _containsOnlyType(TypeMask typeMask, ClassEntity cls) {
     return _closedWorld.classHierarchy.isInstantiated(cls) &&
         typeMask.containsOnly(cls);
   }
 
   @override
-  bool isInstanceOfOrNull(TypeMask typeMask, ClassEntity cls) {
+  AbstractBool isInstanceOfOrNull(TypeMask typeMask, ClassEntity cls) =>
+      AbstractBool.trueOrMaybe(_isInstanceOfOrNull(typeMask, cls));
+
+  bool _isInstanceOfOrNull(TypeMask typeMask, ClassEntity cls) {
     return _closedWorld.isImplemented(cls) &&
         typeMask.satisfies(cls, _closedWorld);
   }
@@ -289,13 +301,16 @@
   }
 
   @override
-  bool isEmpty(TypeMask value) => value.isEmpty;
+  AbstractBool isEmpty(TypeMask value) =>
+      AbstractBool.trueOrMaybe(value.isEmpty);
 
   @override
-  bool isExact(TypeMask value) => value.isExact && !value.isNullable;
+  AbstractBool isExact(TypeMask value) =>
+      AbstractBool.trueOrMaybe(value.isExact && !value.isNullable);
 
   @override
-  bool isExactOrNull(TypeMask value) => value.isExact || isNull(value);
+  AbstractBool isExactOrNull(TypeMask value) =>
+      AbstractBool.trueOrMaybe(value.isExact || _isNull(value));
 
   @override
   ClassEntity getExactClass(TypeMask mask) {
@@ -321,167 +336,204 @@
   }
 
   @override
-  bool canBeNull(TypeMask value) => value.isNullable;
+  AbstractBool isNull(TypeMask value) {
+    if (value.isNull) {
+      return AbstractBool.True;
+    } else if (value.isNullable) {
+      return AbstractBool.Maybe;
+    } else {
+      return AbstractBool.False;
+    }
+  }
+
+  bool _isNull(TypeMask value) => value.isNull;
 
   @override
-  bool isNull(TypeMask value) => value.isNull;
-
-  @override
-  bool canBePrimitive(TypeMask value) {
-    return canBePrimitiveNumber(value) ||
-        canBePrimitiveArray(value) ||
-        canBePrimitiveBoolean(value) ||
-        canBePrimitiveString(value) ||
-        isNull(value);
+  AbstractBool isPrimitive(TypeMask value) {
+    return AbstractBool.maybeOrFalse(_canBePrimitiveNumber(value) ||
+        _canBePrimitiveArray(value) ||
+        _canBePrimitiveBoolean(value) ||
+        _canBePrimitiveString(value) ||
+        _isNull(value));
   }
 
   @override
-  bool canBePrimitiveNumber(TypeMask value) {
+  AbstractBool isPrimitiveNumber(TypeMask value) =>
+      AbstractBool.maybeOrFalse(_canBePrimitiveNumber(value));
+
+  bool _canBePrimitiveNumber(TypeMask value) {
     // TODO(sra): It should be possible to test only jsDoubleClass and
     // jsUInt31Class, since all others are superclasses of these two.
-    return containsType(value, commonElements.jsNumberClass) ||
-        containsType(value, commonElements.jsIntClass) ||
-        containsType(value, commonElements.jsPositiveIntClass) ||
-        containsType(value, commonElements.jsUInt32Class) ||
-        containsType(value, commonElements.jsUInt31Class) ||
-        containsType(value, commonElements.jsDoubleClass);
+    return _containsType(value, commonElements.jsNumberClass) ||
+        _containsType(value, commonElements.jsIntClass) ||
+        _containsType(value, commonElements.jsPositiveIntClass) ||
+        _containsType(value, commonElements.jsUInt32Class) ||
+        _containsType(value, commonElements.jsUInt31Class) ||
+        _containsType(value, commonElements.jsDoubleClass);
   }
 
   @override
-  bool canBePrimitiveBoolean(TypeMask value) {
-    return containsType(value, commonElements.jsBoolClass);
+  AbstractBool isPrimitiveBoolean(TypeMask value) =>
+      AbstractBool.maybeOrFalse(_canBePrimitiveBoolean(value));
+
+  bool _canBePrimitiveBoolean(TypeMask value) {
+    return _containsType(value, commonElements.jsBoolClass);
   }
 
   @override
-  bool canBePrimitiveArray(TypeMask value) {
-    return containsType(value, commonElements.jsArrayClass) ||
-        containsType(value, commonElements.jsFixedArrayClass) ||
-        containsType(value, commonElements.jsExtendableArrayClass) ||
-        containsType(value, commonElements.jsUnmodifiableArrayClass);
+  AbstractBool isPrimitiveArray(TypeMask value) =>
+      AbstractBool.maybeOrFalse(_canBePrimitiveArray(value));
+
+  bool _canBePrimitiveArray(TypeMask value) {
+    return _containsType(value, commonElements.jsArrayClass) ||
+        _containsType(value, commonElements.jsFixedArrayClass) ||
+        _containsType(value, commonElements.jsExtendableArrayClass) ||
+        _containsType(value, commonElements.jsUnmodifiableArrayClass);
   }
 
   @override
-  bool isIndexablePrimitive(TypeMask value) {
+  AbstractBool isIndexablePrimitive(TypeMask value) =>
+      AbstractBool.trueOrMaybe(_isIndexablePrimitive(value));
+
+  bool _isIndexablePrimitive(TypeMask value) {
     return value.containsOnlyString(_closedWorld) ||
-        isInstanceOfOrNull(value, commonElements.jsIndexableClass);
+        _isInstanceOfOrNull(value, commonElements.jsIndexableClass);
   }
 
   @override
-  bool isFixedArray(TypeMask value) {
+  AbstractBool isFixedArray(TypeMask value) {
     // TODO(sra): Recognize the union of these types as well.
-    return containsOnlyType(value, commonElements.jsFixedArrayClass) ||
-        containsOnlyType(value, commonElements.jsUnmodifiableArrayClass);
+    return AbstractBool.trueOrMaybe(
+        _containsOnlyType(value, commonElements.jsFixedArrayClass) ||
+            _containsOnlyType(value, commonElements.jsUnmodifiableArrayClass));
   }
 
   @override
-  bool isExtendableArray(TypeMask value) {
-    return containsOnlyType(value, commonElements.jsExtendableArrayClass);
+  AbstractBool isExtendableArray(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        _containsOnlyType(value, commonElements.jsExtendableArrayClass));
   }
 
   @override
-  bool isMutableArray(TypeMask value) {
-    return isInstanceOfOrNull(value, commonElements.jsMutableArrayClass);
+  AbstractBool isMutableArray(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        _isInstanceOfOrNull(value, commonElements.jsMutableArrayClass));
   }
 
   @override
-  bool isMutableIndexable(TypeMask value) {
-    return isInstanceOfOrNull(value, commonElements.jsMutableIndexableClass);
+  AbstractBool isMutableIndexable(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        _isInstanceOfOrNull(value, commonElements.jsMutableIndexableClass));
   }
 
   @override
-  bool isArray(TypeMask value) {
-    return isInstanceOfOrNull(value, commonElements.jsArrayClass);
+  AbstractBool isArray(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        _isInstanceOfOrNull(value, commonElements.jsArrayClass));
   }
 
   @override
-  bool canBePrimitiveString(TypeMask value) {
-    return containsType(value, commonElements.jsStringClass);
+  AbstractBool isPrimitiveString(TypeMask value) =>
+      AbstractBool.maybeOrFalse(_canBePrimitiveString(value));
+
+  bool _canBePrimitiveString(TypeMask value) {
+    return _containsType(value, commonElements.jsStringClass);
   }
 
   @override
-  bool isInteger(TypeMask value) {
-    return value.containsOnlyInt(_closedWorld) && !value.isNullable;
+  AbstractBool isInteger(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        value.containsOnlyInt(_closedWorld) && !value.isNullable);
   }
 
   @override
-  bool isUInt32(TypeMask value) {
-    return !value.isNullable &&
-        isInstanceOfOrNull(value, commonElements.jsUInt32Class);
+  AbstractBool isUInt32(TypeMask value) {
+    return AbstractBool.trueOrMaybe(!value.isNullable &&
+        _isInstanceOfOrNull(value, commonElements.jsUInt32Class));
   }
 
   @override
-  bool isUInt31(TypeMask value) {
-    return !value.isNullable &&
-        isInstanceOfOrNull(value, commonElements.jsUInt31Class);
+  AbstractBool isUInt31(TypeMask value) {
+    return AbstractBool.trueOrMaybe(!value.isNullable &&
+        _isInstanceOfOrNull(value, commonElements.jsUInt31Class));
   }
 
   @override
-  bool isPositiveInteger(TypeMask value) {
-    return !value.isNullable &&
-        isInstanceOfOrNull(value, commonElements.jsPositiveIntClass);
+  AbstractBool isPositiveInteger(TypeMask value) {
+    return AbstractBool.trueOrMaybe(!value.isNullable &&
+        _isInstanceOfOrNull(value, commonElements.jsPositiveIntClass));
   }
 
   @override
-  bool isPositiveIntegerOrNull(TypeMask value) {
-    return isInstanceOfOrNull(value, commonElements.jsPositiveIntClass);
+  AbstractBool isPositiveIntegerOrNull(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        _isInstanceOfOrNull(value, commonElements.jsPositiveIntClass));
   }
 
   @override
-  bool isIntegerOrNull(TypeMask value) {
-    return value.containsOnlyInt(_closedWorld);
+  AbstractBool isIntegerOrNull(TypeMask value) {
+    return AbstractBool.trueOrMaybe(value.containsOnlyInt(_closedWorld));
   }
 
   @override
-  bool isNumber(TypeMask value) {
-    return value.containsOnlyNum(_closedWorld) && !value.isNullable;
+  AbstractBool isNumber(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        value.containsOnlyNum(_closedWorld) && !value.isNullable);
   }
 
   @override
-  bool isNumberOrNull(TypeMask value) {
+  AbstractBool isNumberOrNull(TypeMask value) =>
+      AbstractBool.trueOrMaybe(_isNumberOrNull(value));
+
+  bool _isNumberOrNull(TypeMask value) {
     return value.containsOnlyNum(_closedWorld);
   }
 
   @override
-  bool isDouble(TypeMask value) {
-    return value.containsOnlyDouble(_closedWorld) && !value.isNullable;
+  AbstractBool isDouble(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        value.containsOnlyDouble(_closedWorld) && !value.isNullable);
   }
 
   @override
-  bool isDoubleOrNull(TypeMask value) {
-    return value.containsOnlyDouble(_closedWorld);
+  AbstractBool isDoubleOrNull(TypeMask value) {
+    return AbstractBool.trueOrMaybe(value.containsOnlyDouble(_closedWorld));
   }
 
   @override
-  bool isBoolean(TypeMask value) {
-    return value.containsOnlyBool(_closedWorld) && !value.isNullable;
+  AbstractBool isBoolean(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        value.containsOnlyBool(_closedWorld) && !value.isNullable);
   }
 
   @override
-  bool isBooleanOrNull(TypeMask value) {
+  AbstractBool isBooleanOrNull(TypeMask value) =>
+      AbstractBool.trueOrMaybe(_isBooleanOrNull(value));
+
+  bool _isBooleanOrNull(TypeMask value) {
     return value.containsOnlyBool(_closedWorld);
   }
 
   @override
-  bool isString(TypeMask value) {
-    return value.containsOnlyString(_closedWorld) && !value.isNullable;
+  AbstractBool isString(TypeMask value) {
+    return AbstractBool.trueOrMaybe(
+        value.containsOnlyString(_closedWorld) && !value.isNullable);
   }
 
   @override
-  bool isStringOrNull(TypeMask value) {
-    return value.containsOnlyString(_closedWorld);
+  AbstractBool isStringOrNull(TypeMask value) {
+    return AbstractBool.trueOrMaybe(value.containsOnlyString(_closedWorld));
   }
 
   @override
-  bool isPrimitive(TypeMask value) {
-    return (isPrimitiveOrNull(value) && !value.isNullable) || isNull(value);
-  }
+  AbstractBool isPrimitiveOrNull(TypeMask value) =>
+      AbstractBool.trueOrMaybe(_isPrimitiveOrNull(value));
 
-  @override
-  bool isPrimitiveOrNull(TypeMask value) {
-    return isIndexablePrimitive(value) ||
-        isNumberOrNull(value) ||
-        isBooleanOrNull(value) ||
-        isNull(value);
+  bool _isPrimitiveOrNull(TypeMask value) {
+    return _isIndexablePrimitive(value) ||
+        _isNumberOrNull(value) ||
+        _isBooleanOrNull(value) ||
+        _isNull(value);
   }
 
   @override
@@ -492,10 +544,12 @@
       a.intersection(b, _closedWorld);
 
   @override
-  bool areDisjoint(TypeMask a, TypeMask b) => a.isDisjoint(b, _closedWorld);
+  AbstractBool areDisjoint(TypeMask a, TypeMask b) =>
+      AbstractBool.trueOrMaybe(a.isDisjoint(b, _closedWorld));
 
   @override
-  bool containsAll(TypeMask a) => a.containsAll(_closedWorld);
+  AbstractBool containsAll(TypeMask a) =>
+      AbstractBool.maybeOrFalse(a.containsAll(_closedWorld));
 
   @override
   AbstractValue computeAbstractValueForConstant(ConstantValue value) {
@@ -574,25 +628,29 @@
   }
 
   @override
-  bool canHit(
-      covariant TypeMask receiver, MemberEntity member, Selector selector) {
-    return receiver.canHit(member, selector, _closedWorld);
+  AbstractBool isTargetingMember(
+      covariant TypeMask receiver, MemberEntity member, Name name) {
+    return AbstractBool.maybeOrFalse(
+        receiver.canHit(member, name, _closedWorld));
   }
 
   @override
-  bool needsNoSuchMethodHandling(
+  AbstractBool needsNoSuchMethodHandling(
       covariant TypeMask receiver, Selector selector) {
-    return receiver.needsNoSuchMethodHandling(selector, _closedWorld);
+    return AbstractBool.trueOrFalse(
+        receiver.needsNoSuchMethodHandling(selector, _closedWorld));
   }
 
   @override
-  bool contains(covariant TypeMask superset, covariant TypeMask subset) {
-    return superset.containsMask(subset, _closedWorld);
+  AbstractBool contains(
+      covariant TypeMask superset, covariant TypeMask subset) {
+    return AbstractBool.maybeOrFalse(
+        superset.containsMask(subset, _closedWorld));
   }
 
   @override
-  bool isIn(covariant TypeMask subset, covariant TypeMask superset) {
-    return subset.isInMask(superset, _closedWorld);
+  AbstractBool isIn(covariant TypeMask subset, covariant TypeMask superset) {
+    return AbstractBool.trueOrMaybe(subset.isInMask(superset, _closedWorld));
   }
 
   @override
@@ -602,41 +660,42 @@
   }
 
   @override
-  bool isJsIndexable(TypeMask mask) {
-    return mask.satisfies(
-        _closedWorld.commonElements.jsIndexableClass, _closedWorld);
+  AbstractBool isJsIndexable(TypeMask mask) {
+    return AbstractBool.trueOrMaybe(mask.satisfies(
+        _closedWorld.commonElements.jsIndexableClass, _closedWorld));
   }
 
   @override
-  bool isJsIndexableAndIterable(covariant TypeMask mask) {
-    return mask != null &&
+  AbstractBool isJsIndexableAndIterable(covariant TypeMask mask) {
+    return AbstractBool.trueOrMaybe(mask != null &&
         mask.satisfies(
             _closedWorld.commonElements.jsIndexableClass, _closedWorld) &&
         // String is indexable but not iterable.
         !mask.satisfies(
-            _closedWorld.commonElements.jsStringClass, _closedWorld);
+            _closedWorld.commonElements.jsStringClass, _closedWorld));
   }
 
   @override
-  bool isFixedLengthJsIndexable(covariant TypeMask mask) {
+  AbstractBool isFixedLengthJsIndexable(covariant TypeMask mask) {
     if (mask.isContainer && (mask as ContainerTypeMask).length != null) {
       // A container on which we have inferred the length.
-      return true;
+      return AbstractBool.True;
     }
     // TODO(sra): Recognize any combination of fixed length indexables.
     if (mask.containsOnly(_closedWorld.commonElements.jsFixedArrayClass) ||
         mask.containsOnly(
             _closedWorld.commonElements.jsUnmodifiableArrayClass) ||
         mask.containsOnlyString(_closedWorld) ||
-        _closedWorld.abstractValueDomain.isTypedArray(mask)) {
-      return true;
+        _closedWorld.abstractValueDomain.isTypedArray(mask).isDefinitelyTrue) {
+      return AbstractBool.True;
     }
-    return false;
+    return AbstractBool.Maybe;
   }
 
   @override
-  bool canBeInterceptor(TypeMask value) {
-    return !interceptorType.isDisjoint(value, _closedWorld);
+  AbstractBool isInterceptor(TypeMask value) {
+    return AbstractBool.maybeOrFalse(
+        !interceptorType.isDisjoint(value, _closedWorld));
   }
 
   @override
@@ -722,12 +781,14 @@
 
   @override
   TypeMask readAbstractValueFromDataSource(DataSource source) {
-    return new TypeMask.readFromDataSource(source, _closedWorld);
+    return source.readCached<TypeMask>(
+        () => new TypeMask.readFromDataSource(source, _closedWorld));
   }
 
   @override
   void writeAbstractValueToDataSink(DataSink sink, covariant TypeMask value) {
-    value.writeToDataSink(sink);
+    sink.writeCached<TypeMask>(
+        value, (TypeMask value) => value.writeToDataSink(sink));
   }
 }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
index a08d320..d54859d 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart
@@ -12,11 +12,11 @@
   Set<TypeMask> _masks;
 
   @override
-  bool applies(MemberEntity element, Selector selector, JClosedWorld world) {
+  bool canHit(MemberEntity element, Name name, JClosedWorld world) {
     if (isAll) return true;
     if (_masks == null) return false;
     for (TypeMask mask in _masks) {
-      if (mask.canHit(element, selector, world)) return true;
+      if (mask.canHit(element, name, world)) return true;
     }
     return false;
   }
@@ -77,8 +77,10 @@
   const TypeMaskSelectorStrategy();
 
   @override
-  UniverseSelectorConstraints createSelectorConstraints(Selector selector) {
-    return new IncreasingTypeMaskSet();
+  UniverseSelectorConstraints createSelectorConstraints(
+      Selector selector, Object initialConstraint) {
+    return new IncreasingTypeMaskSet()
+      ..addReceiverConstraint(initialConstraint);
   }
 
   @override
@@ -87,7 +89,7 @@
     Selector selector = dynamicUse.selector;
     TypeMask mask = dynamicUse.receiverConstraint;
     return selector.appliesUnnamed(member) &&
-        (mask == null || mask.canHit(member, selector, world));
+        (mask == null || mask.canHit(member, selector.memberName, world));
   }
 }
 
@@ -101,11 +103,9 @@
   value,
 }
 
-/**
- * A type mask represents a set of contained classes, but the
- * operations on it are not guaranteed to be precise and they may
- * yield conservative answers that contain too many classes.
- */
+/// A type mask represents a set of contained classes, but the
+/// operations on it are not guaranteed to be precise and they may
+/// yield conservative answers that contain too many classes.
 abstract class TypeMask implements AbstractValue {
   factory TypeMask(
       ClassEntity base, int kind, bool isNullable, JClosedWorld closedWorld) {
@@ -243,10 +243,8 @@
   /// Serializes this [TypeMask] to [sink].
   void writeToDataSink(DataSink sink);
 
-  /**
-   * If [mask] is forwarding, returns the first non-forwarding [TypeMask] in
-   * [mask]'s forwarding chain.
-   */
+  /// If [mask] is forwarding, returns the first non-forwarding [TypeMask] in
+  /// [mask]'s forwarding chain.
   static TypeMask nonForwardingMask(mask) {
     while (mask.isForwarding) {
       mask = mask.forwardTo;
@@ -254,13 +252,11 @@
     return mask;
   }
 
-  /**
-   * Asserts that this mask uses the smallest possible representation for
-   * its types. Currently, we normalize subtype and subclass to exact if no
-   * subtypes or subclasses are present and subtype to subclass if only
-   * subclasses exist. We also normalize exact to empty if the corresponding
-   * baseclass was never instantiated.
-   */
+  /// Asserts that this mask uses the smallest possible representation for
+  /// its types. Currently, we normalize subtype and subclass to exact if no
+  /// subtypes or subclasses are present and subtype to subclass if only
+  /// subclasses exist. We also normalize exact to empty if the corresponding
+  /// baseclass was never instantiated.
   static bool assertIsNormalized(TypeMask mask, JClosedWorld closedWorld) {
     String reason = getNotNormalizedReason(mask, closedWorld);
     assert(reason == null,
@@ -305,14 +301,10 @@
     return 'Unknown type mask $mask.';
   }
 
-  /**
-   * Returns a nullable variant of [this] type mask.
-   */
+  /// Returns a nullable variant of [this] type mask.
   TypeMask nullable();
 
-  /**
-   * Returns a non-nullable variant of [this] type mask.
-   */
+  /// Returns a non-nullable variant of [this] type mask.
   TypeMask nonNullable();
 
   /// Whether nothing matches this mask, not even null.
@@ -359,38 +351,28 @@
   bool containsOnlyString(JClosedWorld closedWorld);
   bool containsOnly(ClassEntity cls);
 
-  /**
-   * Compares two [TypeMask] objects for structural equality.
-   *
-   * Note: This may differ from semantic equality in the set containment sense.
-   *   Use [containsMask] and [isInMask] for that, instead.
-   */
+  /// Compares two [TypeMask] objects for structural equality.
+  ///
+  /// Note: This may differ from semantic equality in the set containment sense.
+  ///   Use [containsMask] and [isInMask] for that, instead.
   bool operator ==(other);
 
-  /**
-   * If this returns `true`, [other] is guaranteed to be a supertype of this
-   * mask, i.e., this mask is in [other]. However, the inverse does not hold.
-   * Enable [UnionTypeMask.PERFORM_EXTRA_CONTAINS_CHECK] to be notified of
-   * false negatives.
-   */
+  /// If this returns `true`, [other] is guaranteed to be a supertype of this
+  /// mask, i.e., this mask is in [other]. However, the inverse does not hold.
+  /// Enable [UnionTypeMask.PERFORM_EXTRA_CONTAINS_CHECK] to be notified of
+  /// false negatives.
   bool isInMask(TypeMask other, JClosedWorld closedWorld);
 
-  /**
-   * If this returns `true`, [other] is guaranteed to be a subtype of this mask,
-   * i.e., this mask contains [other]. However, the inverse does not hold.
-   * Enable [UnionTypeMask.PERFORM_EXTRA_CONTAINS_CHECK] to be notified of
-   * false negatives.
-   */
+  /// If this returns `true`, [other] is guaranteed to be a subtype of this
+  /// mask, i.e. this mask contains [other]. However, the inverse does not hold.
+  /// Enable [UnionTypeMask.PERFORM_EXTRA_CONTAINS_CHECK] to be notified of
+  /// false negatives.
   bool containsMask(TypeMask other, JClosedWorld closedWorld);
 
-  /**
-   * Returns whether this type mask is an instance of [cls].
-   */
+  /// Returns whether this type mask is an instance of [cls].
   bool satisfies(ClassEntity cls, JClosedWorld closedWorld);
 
-  /**
-   * Returns whether or not this type mask contains the given class [cls].
-   */
+  /// Returns whether or not this type mask contains the given class [cls].
   bool contains(ClassEntity cls, JClosedWorld closedWorld);
 
   /// Returns whether or not this type mask contains all types.
@@ -400,34 +382,24 @@
   /// otherwise returns `null`.  This method is conservative.
   ClassEntity singleClass(JClosedWorld closedWorld);
 
-  /**
-   * Returns a type mask representing the union of [this] and [other].
-   */
+  /// Returns a type mask representing the union of [this] and [other].
   TypeMask union(TypeMask other, JClosedWorld closedWorld);
 
   /// Returns whether the intersection of this and [other] is empty.
   bool isDisjoint(TypeMask other, JClosedWorld closedWorld);
 
-  /**
-   * Returns a type mask representing the intersection of [this] and [other].
-   */
+  /// Returns a type mask representing the intersection of [this] and [other].
   TypeMask intersection(TypeMask other, JClosedWorld closedWorld);
 
-  /**
-   * Returns whether [element] is a potential target when being
-   * invoked on this type mask. [selector] is used to ensure library
-   * privacy is taken into account.
-   */
-  bool canHit(
-      MemberEntity element, Selector selector, JClosedWorld closedWorld);
+  /// Returns whether [element] is a potential target when being invoked on this
+  /// type mask. [name] is used to ensure library privacy is taken into account.
+  bool canHit(MemberEntity element, Name name, JClosedWorld closedWorld);
 
   /// Returns whether this [TypeMask] applied to [selector] can hit a
   /// [noSuchMethod].
   bool needsNoSuchMethodHandling(Selector selector, JClosedWorld world);
 
-  /**
-   * Returns the [element] that is known to always be hit at runtime
-   * on this mask. Returns null if there is none.
-   */
+  /// Returns the [element] that is known to always be hit at runtime
+  /// on this mask. Returns null if there is none.
   MemberEntity locateSingleMember(Selector selector, JClosedWorld closedWorld);
 }
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
index aba7ea6..2f1f9de 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
@@ -16,7 +16,7 @@
   // helpful in debugging.
   static const bool PERFORM_EXTRA_CONTAINS_CHECK = false;
 
-  final Iterable<FlatTypeMask> disjointMasks;
+  final List<FlatTypeMask> disjointMasks;
 
   UnionTypeMask._internal(this.disjointMasks) {
     assert(disjointMasks.length > 1);
@@ -216,7 +216,7 @@
     Iterable<FlatTypeMask> newIterable = disjointMasks.map((e) {
       FlatTypeMask r = e.nonNullable();
       return r;
-    });
+    }).toList();
     return new UnionTypeMask._internal(newIterable);
   }
 
@@ -232,14 +232,12 @@
   bool get isForwarding => false;
   bool get isValue => false;
 
-  /**
-   * Checks whether [other] is contained in this union.
-   *
-   * Invariants:
-   * - [other] may not be a [UnionTypeMask] itself
-   * - the cheap test matching against individual members of [disjointMasks]
-   *   must have failed.
-   */
+  /// Checks whether [other] is contained in this union.
+  ///
+  /// Invariants:
+  /// - [other] may not be a [UnionTypeMask] itself
+  /// - the cheap test matching against individual members of [disjointMasks]
+  ///   must have failed.
   bool slowContainsCheck(TypeMask other, JClosedWorld closedWorld) {
     // Unions should never make it here.
     assert(!other.isUnion);
@@ -357,9 +355,8 @@
         .any((e) => e.needsNoSuchMethodHandling(selector, closedWorld));
   }
 
-  bool canHit(
-      MemberEntity element, Selector selector, JClosedWorld closedWorld) {
-    return disjointMasks.any((e) => e.canHit(element, selector, closedWorld));
+  bool canHit(MemberEntity element, Name name, JClosedWorld closedWorld) {
+    return disjointMasks.any((e) => e.canHit(element, name, closedWorld));
   }
 
   MemberEntity locateSingleMember(Selector selector, JClosedWorld closedWorld) {
diff --git a/pkg/compiler/lib/src/inferrer/types.dart b/pkg/compiler/lib/src/inferrer/types.dart
new file mode 100644
index 0000000..6a1017b
--- /dev/null
+++ b/pkg/compiler/lib/src/inferrer/types.dart
@@ -0,0 +1,588 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library types;
+
+import 'package:kernel/ast.dart' as ir;
+import '../common.dart' show failedAt, retainDataForTesting;
+import '../common/names.dart';
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
+import '../elements/entities.dart';
+import '../js_backend/inferred_data.dart';
+import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
+import '../serialization/serialization.dart';
+import '../universe/selector.dart' show Selector;
+import '../world.dart' show JClosedWorld;
+import 'abstract_value_domain.dart';
+import '../inferrer/inferrer_engine.dart';
+
+/// Results about a single element (e.g. a method, parameter, or field)
+/// produced by the global type-inference algorithm.
+///
+/// All queries in this class may contain results that assume whole-program
+/// closed-world semantics. Any [TypeMask] for an element or node that we return
+/// was inferred to be a "guaranteed type", that means, it is a type that we
+/// can prove to be correct for all executions of the program.  A trivial
+/// implementation would return false on all boolean properties (giving no
+/// guarantees) and the `subclass of Object or null` type mask for the type
+/// based queries (the runtime value could be anything).
+abstract class GlobalTypeInferenceMemberResult {
+  /// Deserializes a [GlobalTypeInferenceMemberResult] object from [source].
+  factory GlobalTypeInferenceMemberResult.readFromDataSource(
+          DataSource source, AbstractValueDomain abstractValueDomain) =
+      GlobalTypeInferenceMemberResultImpl.readFromDataSource;
+
+  /// Serializes this [GlobalTypeInferenceMemberResult] to [sink].
+  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain);
+
+  /// The inferred type when this result belongs to a field, null otherwise.
+  AbstractValue get type;
+
+  /// Whether the member associated with this result is only called once in one
+  /// location in the entire program.
+  bool get isCalledOnce;
+
+  /// Whether the method element associated with this result always throws.
+  bool get throwsAlways;
+
+  /// The inferred return type when this result belongs to a function element.
+  AbstractValue get returnType;
+
+  /// Returns the type of a send [node].
+  // TODO(johnniwinther): Rename this.
+  AbstractValue typeOfSend(ir.TreeNode node);
+
+  /// Returns the type of the getter in a complex send-set [node], for example,
+  /// the type of the `a.f` getter in `a.f += b`.
+  AbstractValue typeOfGetter(ir.TreeNode node);
+
+  /// Returns the type of the iterator in a [loop].
+  AbstractValue typeOfIterator(ir.TreeNode node);
+
+  /// Returns the type of the `moveNext` call of an iterator in a [loop].
+  AbstractValue typeOfIteratorMoveNext(ir.TreeNode node);
+
+  /// Returns the type of the `current` getter of an iterator in a [loop].
+  AbstractValue typeOfIteratorCurrent(ir.TreeNode node);
+}
+
+/// Internal data used during type-inference to store intermediate results about
+/// a single element.
+abstract class GlobalTypeInferenceElementData {
+  /// Deserializes a [GlobalTypeInferenceElementData] object from [source].
+  factory GlobalTypeInferenceElementData.readFromDataSource(
+          DataSource source, AbstractValueDomain abstractValueDomain) =
+      KernelGlobalTypeInferenceElementData.readFromDataSource;
+
+  /// Serializes this [GlobalTypeInferenceElementData] to [sink].
+  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain);
+
+  /// Compresses the inner representation by removing [AbstractValue] mappings
+  /// to `null`. Returns the data object itself or `null` if the data object
+  /// was empty after compression.
+  GlobalTypeInferenceElementData compress();
+
+  // TODO(johnniwinther): Remove this. Maybe split by access/invoke.
+  AbstractValue typeOfSend(ir.TreeNode node);
+  AbstractValue typeOfGetter(ir.TreeNode node);
+
+  AbstractValue typeOfIterator(ir.TreeNode node);
+
+  AbstractValue typeOfIteratorMoveNext(ir.TreeNode node);
+
+  AbstractValue typeOfIteratorCurrent(ir.TreeNode node);
+}
+
+/// API to interact with the global type-inference engine.
+abstract class TypesInferrer {
+  GlobalTypeInferenceResults analyzeMain(FunctionEntity element);
+}
+
+/// Results produced by the global type-inference algorithm.
+///
+/// All queries in this class may contain results that assume whole-program
+/// closed-world semantics. Any [AbstractValue] for an element or node that we
+/// return was inferred to be a "guaranteed type", that means, it is a type that
+/// we can prove to be correct for all executions of the program.
+abstract class GlobalTypeInferenceResults {
+  /// Deserializes a [GlobalTypeInferenceResults] object from [source].
+  factory GlobalTypeInferenceResults.readFromDataSource(
+      DataSource source, JClosedWorld closedWorld, InferredData inferredData) {
+    bool isTrivial = source.readBool();
+    if (isTrivial) {
+      return new TrivialGlobalTypeInferenceResults(closedWorld);
+    }
+    return new GlobalTypeInferenceResultsImpl.readFromDataSource(
+        source, closedWorld, inferredData);
+  }
+
+  /// Serializes this [GlobalTypeInferenceResults] to [sink].
+  void writeToDataSink(DataSink sink);
+
+  JClosedWorld get closedWorld;
+
+  InferredData get inferredData;
+
+  GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member);
+
+  AbstractValue resultOfParameter(Local parameter);
+
+  /// Returns the type of a [selector] when applied to a receiver with the given
+  /// type [mask].
+  AbstractValue typeOfSelector(Selector selector, AbstractValue mask);
+
+  /// Returns whether a fixed-length constructor call goes through a growable
+  /// check.
+  bool isFixedArrayCheckedForGrowable(ir.TreeNode node);
+
+  /// Returns the type of a list new expression [node].
+  AbstractValue typeOfNewList(ir.TreeNode node);
+
+  /// Returns the type of a list literal [node].
+  AbstractValue typeOfListLiteral(ir.TreeNode node);
+}
+
+/// Global analysis that infers concrete types.
+class GlobalTypeInferenceTask extends CompilerTask {
+  // TODO(sigmund): rename at the same time as our benchmarking tools.
+  final String name = 'Type inference';
+
+  final Compiler compiler;
+
+  /// The [TypeGraphInferrer] used by the global type inference. This should by
+  /// accessed from outside this class for testing only.
+  TypeGraphInferrer typesInferrerInternal;
+
+  GlobalTypeInferenceResults resultsForTesting;
+
+  GlobalTypeInferenceTask(Compiler compiler)
+      : compiler = compiler,
+        super(compiler.measurer);
+
+  /// Runs the global type-inference algorithm once.
+  GlobalTypeInferenceResults runGlobalTypeInference(FunctionEntity mainElement,
+      JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder) {
+    return measure(() {
+      GlobalTypeInferenceResults results;
+      if (compiler.disableTypeInference) {
+        results = new TrivialGlobalTypeInferenceResults(closedWorld);
+      } else {
+        typesInferrerInternal ??= compiler.backendStrategy
+            .createTypesInferrer(closedWorld, inferredDataBuilder);
+        results = typesInferrerInternal.analyzeMain(mainElement);
+      }
+      closedWorld.noSuchMethodData.categorizeComplexImplementations(results);
+      if (retainDataForTesting) {
+        resultsForTesting = results;
+      }
+      return results;
+    });
+  }
+}
+
+class GlobalTypeInferenceResultsImpl implements GlobalTypeInferenceResults {
+  /// Tag used for identifying serialized [GlobalTypeInferenceResults] objects
+  /// in a debugging data stream.
+  static const String tag = 'global-type-inference-results';
+
+  final JClosedWorld closedWorld;
+  final InferredData inferredData;
+  final GlobalTypeInferenceMemberResult _deadFieldResult;
+  final GlobalTypeInferenceMemberResult _deadMethodResult;
+  final AbstractValue _trivialParameterResult;
+
+  final Map<MemberEntity, GlobalTypeInferenceMemberResult> memberResults;
+  final Map<Local, AbstractValue> parameterResults;
+  final Set<ir.TreeNode> checkedForGrowableLists;
+  final Set<Selector> returnsListElementTypeSet;
+  final Map<ir.TreeNode, AbstractValue> _allocatedLists;
+
+  GlobalTypeInferenceResultsImpl(
+      this.closedWorld,
+      this.inferredData,
+      this.memberResults,
+      this.parameterResults,
+      this.checkedForGrowableLists,
+      this.returnsListElementTypeSet,
+      this._allocatedLists)
+      : _deadFieldResult = new DeadFieldGlobalTypeInferenceResult(
+            closedWorld.abstractValueDomain),
+        _deadMethodResult = new DeadMethodGlobalTypeInferenceResult(
+            closedWorld.abstractValueDomain),
+        _trivialParameterResult = closedWorld.abstractValueDomain.dynamicType;
+
+  factory GlobalTypeInferenceResultsImpl.readFromDataSource(
+      DataSource source, JClosedWorld closedWorld, InferredData inferredData) {
+    source.begin(tag);
+    Map<MemberEntity, GlobalTypeInferenceMemberResult> memberResults =
+        source.readMemberMap(() =>
+            new GlobalTypeInferenceMemberResult.readFromDataSource(
+                source, closedWorld.abstractValueDomain));
+    Map<Local, AbstractValue> parameterResults = source.readLocalMap(() =>
+        closedWorld.abstractValueDomain
+            .readAbstractValueFromDataSource(source));
+    Set<ir.TreeNode> checkedForGrowableLists = source.readTreeNodes().toSet();
+    Set<Selector> returnsListElementTypeSet =
+        source.readList(() => new Selector.readFromDataSource(source)).toSet();
+    Map<ir.TreeNode, AbstractValue> allocatedLists = source.readTreeNodeMap(
+        () => closedWorld.abstractValueDomain
+            .readAbstractValueFromDataSource(source));
+    source.end(tag);
+    return new GlobalTypeInferenceResultsImpl(
+        closedWorld,
+        inferredData,
+        memberResults,
+        parameterResults,
+        checkedForGrowableLists,
+        returnsListElementTypeSet,
+        allocatedLists);
+  }
+
+  void writeToDataSink(DataSink sink) {
+    sink.writeBool(false); // Is _not_ trivial.
+    sink.begin(tag);
+    sink.writeMemberMap(
+        memberResults,
+        (GlobalTypeInferenceMemberResult result) =>
+            result.writeToDataSink(sink, closedWorld.abstractValueDomain));
+    sink.writeLocalMap(
+        parameterResults,
+        (AbstractValue value) => closedWorld.abstractValueDomain
+            .writeAbstractValueToDataSink(sink, value));
+    sink.writeTreeNodes(checkedForGrowableLists);
+    sink.writeList(returnsListElementTypeSet,
+        (Selector selector) => selector.writeToDataSink(sink));
+    sink.writeTreeNodeMap(
+        _allocatedLists,
+        (AbstractValue value) => closedWorld.abstractValueDomain
+            .writeAbstractValueToDataSink(sink, value));
+    sink.end(tag);
+  }
+
+  @override
+  GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member) {
+    assert(
+        member is! ConstructorBodyEntity,
+        failedAt(
+            member,
+            "unexpected input: ConstructorBodyElements are created"
+            " after global type inference, no data is avaiable for them."));
+    // TODO(sigmund,johnniwinther): Make it an error to query for results that
+    // don't exist..
+    /*assert(memberResults.containsKey(member) || member is JSignatureMethod,
+        "No inference result for member $member");*/
+    return memberResults[member] ??
+        (member is FunctionEntity ? _deadMethodResult : _deadFieldResult);
+  }
+
+  @override
+  AbstractValue resultOfParameter(Local parameter) {
+    // TODO(sigmund,johnniwinther): Make it an error to query for results that
+    // don't exist.
+    /*assert(parameterResults.containsKey(parameter),
+        "No inference result for parameter $parameter");*/
+    return parameterResults[parameter] ?? _trivialParameterResult;
+  }
+
+  /// Returns the type of a [selector] when applied to a receiver with the given
+  /// [receiver] type.
+  @override
+  AbstractValue typeOfSelector(Selector selector, AbstractValue receiver) {
+    // Bailout for closure calls. We're not tracking types of
+    // closures.
+    if (selector.isClosureCall)
+      return closedWorld.abstractValueDomain.dynamicType;
+    if (selector.isSetter || selector.isIndexSet) {
+      return closedWorld.abstractValueDomain.dynamicType;
+    }
+    if (returnsListElementType(selector, receiver)) {
+      return closedWorld.abstractValueDomain.getContainerElementType(receiver);
+    }
+    if (returnsMapValueType(selector, receiver)) {
+      return closedWorld.abstractValueDomain.getMapValueType(receiver);
+    }
+
+    if (closedWorld.includesClosureCall(selector, receiver)) {
+      return closedWorld.abstractValueDomain.dynamicType;
+    } else {
+      Iterable<MemberEntity> elements =
+          closedWorld.locateMembers(selector, receiver);
+      List<AbstractValue> types = <AbstractValue>[];
+      for (MemberEntity element in elements) {
+        AbstractValue type = typeOfMemberWithSelector(element, selector);
+        types.add(type);
+      }
+      return closedWorld.abstractValueDomain.unionOfMany(types);
+    }
+  }
+
+  bool returnsListElementType(Selector selector, AbstractValue mask) {
+    return mask != null &&
+        closedWorld.abstractValueDomain.isContainer(mask) &&
+        returnsListElementTypeSet.contains(selector);
+  }
+
+  bool returnsMapValueType(Selector selector, AbstractValue mask) {
+    return mask != null &&
+        closedWorld.abstractValueDomain.isMap(mask) &&
+        selector.isIndex;
+  }
+
+  AbstractValue typeOfMemberWithSelector(
+      MemberEntity element, Selector selector) {
+    if (element.name == Identifiers.noSuchMethod_ &&
+        selector.name != element.name) {
+      // An invocation can resolve to a [noSuchMethod], in which case
+      // we get the return type of [noSuchMethod].
+      return resultOfMember(element).returnType;
+    } else if (selector.isGetter) {
+      if (element.isFunction) {
+        // [functionType] is null if the inferrer did not run.
+        return closedWorld.abstractValueDomain.functionType;
+      } else if (element.isField) {
+        return resultOfMember(element).type;
+      } else if (element.isGetter) {
+        return resultOfMember(element).returnType;
+      } else {
+        assert(false, failedAt(element, "Unexpected member $element"));
+        return closedWorld.abstractValueDomain.dynamicType;
+      }
+    } else if (element.isGetter || element.isField) {
+      assert(selector.isCall || selector.isSetter);
+      return closedWorld.abstractValueDomain.dynamicType;
+    } else {
+      return resultOfMember(element).returnType;
+    }
+  }
+
+  /// Returns whether a fixed-length constructor call goes through a growable
+  /// check.
+  // TODO(sigmund): move into the result of the element containing such
+  // constructor call.
+  @override
+  bool isFixedArrayCheckedForGrowable(ir.Node ctorCall) =>
+      checkedForGrowableLists.contains(ctorCall);
+
+  AbstractValue typeOfNewList(ir.Node node) => _allocatedLists[node];
+
+  AbstractValue typeOfListLiteral(ir.Node node) => _allocatedLists[node];
+}
+
+class GlobalTypeInferenceMemberResultImpl
+    implements GlobalTypeInferenceMemberResult {
+  /// Tag used for identifying serialized [GlobalTypeInferenceMemberResult]
+  /// objects in a debugging data stream.
+  static const String tag = 'global-type-inference-member-result';
+
+  final GlobalTypeInferenceElementData _data;
+  final AbstractValue returnType;
+  final AbstractValue type;
+  final bool throwsAlways;
+  final bool isCalledOnce;
+
+  GlobalTypeInferenceMemberResultImpl(this._data, this.returnType, this.type,
+      {this.throwsAlways, this.isCalledOnce});
+
+  factory GlobalTypeInferenceMemberResultImpl.readFromDataSource(
+      DataSource source, AbstractValueDomain abstractValueDomain) {
+    source.begin(tag);
+    GlobalTypeInferenceElementData data = source.readValueOrNull(() {
+      return new GlobalTypeInferenceElementData.readFromDataSource(
+          source, abstractValueDomain);
+    });
+    AbstractValue returnType =
+        abstractValueDomain.readAbstractValueFromDataSource(source);
+    AbstractValue type =
+        abstractValueDomain.readAbstractValueFromDataSource(source);
+    bool throwsAlways = source.readBool();
+    bool isCalledOnce = source.readBool();
+    source.end(tag);
+    return new GlobalTypeInferenceMemberResultImpl(data, returnType, type,
+        throwsAlways: throwsAlways, isCalledOnce: isCalledOnce);
+  }
+
+  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain) {
+    sink.begin(tag);
+    sink.writeValueOrNull(_data, (GlobalTypeInferenceElementData data) {
+      data.writeToDataSink(sink, abstractValueDomain);
+    });
+    abstractValueDomain.writeAbstractValueToDataSink(sink, returnType);
+    abstractValueDomain.writeAbstractValueToDataSink(sink, type);
+    sink.writeBool(throwsAlways);
+    sink.writeBool(isCalledOnce);
+    sink.end(tag);
+  }
+
+  AbstractValue typeOfSend(ir.Node node) => _data?.typeOfSend(node);
+  AbstractValue typeOfGetter(ir.Node node) => _data?.typeOfGetter(node);
+  AbstractValue typeOfIterator(ir.Node node) => _data?.typeOfIterator(node);
+  AbstractValue typeOfIteratorMoveNext(ir.Node node) =>
+      _data?.typeOfIteratorMoveNext(node);
+  AbstractValue typeOfIteratorCurrent(ir.Node node) =>
+      _data?.typeOfIteratorCurrent(node);
+}
+
+class TrivialGlobalTypeInferenceResults implements GlobalTypeInferenceResults {
+  final JClosedWorld closedWorld;
+  final TrivialGlobalTypeInferenceMemberResult _trivialMemberResult;
+  final AbstractValue _trivialParameterResult;
+  final InferredData inferredData = new TrivialInferredData();
+
+  TrivialGlobalTypeInferenceResults(this.closedWorld)
+      : _trivialMemberResult = new TrivialGlobalTypeInferenceMemberResult(
+            closedWorld.abstractValueDomain.dynamicType),
+        _trivialParameterResult = closedWorld.abstractValueDomain.dynamicType;
+
+  void writeToDataSink(DataSink sink) {
+    sink.writeBool(true); // Is trivial.
+  }
+
+  @override
+  bool isFixedArrayCheckedForGrowable(ir.Node node) => false;
+
+  @override
+  AbstractValue typeOfSelector(Selector selector, AbstractValue mask) {
+    return closedWorld.abstractValueDomain.dynamicType;
+  }
+
+  @override
+  AbstractValue resultOfParameter(Local parameter) {
+    return _trivialParameterResult;
+  }
+
+  @override
+  GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member) {
+    return _trivialMemberResult;
+  }
+
+  @override
+  AbstractValue typeOfListLiteral(ir.TreeNode node) => null;
+
+  @override
+  AbstractValue typeOfNewList(ir.TreeNode node) => null;
+}
+
+class TrivialGlobalTypeInferenceMemberResult
+    implements GlobalTypeInferenceMemberResult {
+  final AbstractValue dynamicType;
+
+  TrivialGlobalTypeInferenceMemberResult(this.dynamicType);
+
+  @override
+  AbstractValue get type => dynamicType;
+
+  @override
+  AbstractValue get returnType => dynamicType;
+
+  @override
+  bool get throwsAlways => false;
+
+  @override
+  AbstractValue typeOfIteratorCurrent(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfIteratorMoveNext(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfIterator(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfGetter(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfSend(ir.Node node) => null;
+
+  @override
+  bool get isCalledOnce => false;
+
+  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain) {
+    throw new UnsupportedError(
+        "TrivialGlobalTypeInferenceMemberResult.writeToDataSink");
+  }
+}
+
+class DeadFieldGlobalTypeInferenceResult
+    implements GlobalTypeInferenceMemberResult {
+  final AbstractValue dynamicType;
+  final AbstractValue emptyType;
+
+  DeadFieldGlobalTypeInferenceResult(AbstractValueDomain domain)
+      : this.dynamicType = domain.dynamicType,
+        this.emptyType = domain.emptyType;
+
+  @override
+  AbstractValue get type => emptyType;
+
+  @override
+  AbstractValue get returnType => dynamicType;
+
+  @override
+  bool get throwsAlways => false;
+
+  @override
+  AbstractValue typeOfIteratorCurrent(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfIteratorMoveNext(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfIterator(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfGetter(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfSend(ir.Node node) => null;
+
+  @override
+  bool get isCalledOnce => false;
+
+  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain) {
+    throw new UnsupportedError(
+        "DeadFieldGlobalTypeInferenceResult.writeToDataSink");
+  }
+}
+
+class DeadMethodGlobalTypeInferenceResult
+    implements GlobalTypeInferenceMemberResult {
+  final AbstractValue emptyType;
+  final AbstractValue functionType;
+
+  DeadMethodGlobalTypeInferenceResult(AbstractValueDomain domain)
+      : this.functionType = domain.functionType,
+        this.emptyType = domain.emptyType;
+
+  @override
+  AbstractValue get type => functionType;
+
+  @override
+  AbstractValue get returnType => emptyType;
+
+  @override
+  bool get throwsAlways => false;
+
+  @override
+  AbstractValue typeOfIteratorCurrent(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfIteratorMoveNext(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfIterator(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfGetter(ir.Node node) => null;
+
+  @override
+  AbstractValue typeOfSend(ir.Node node) => null;
+
+  @override
+  bool get isCalledOnce => false;
+
+  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain) {
+    throw new UnsupportedError(
+        "DeadFieldGlobalTypeInferenceResult.writeToDataSink");
+  }
+}
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 4fb641a..0d3b387 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -549,6 +549,7 @@
             CallPosition.getSemanticPositionForCall(node);
         registerPosition(callPosition.sourcePositionKind);
         break;
+      case StepKind.ACCESS:
       case StepKind.NEW:
       case StepKind.RETURN:
       case StepKind.BREAK:
@@ -771,6 +772,7 @@
   FUN_EXIT,
   CALL,
   NEW,
+  ACCESS,
   RETURN,
   BREAK,
   CONTINUE,
@@ -1010,6 +1012,18 @@
   @override
   visitAccess(js.PropertyAccess node) {
     visit(node.receiver);
+    notifyStep(
+        node,
+        // Technically we'd like to use the offset of the `.` in the property
+        // access, but the js_ast doesn't expose it. Since this is only used to
+        // search backwards for inlined frames, we use the receiver's END offset
+        // instead as an approximation. Note that the END offset points one
+        // character after the end of the node, so it is likely always the
+        // offset we want.
+        getOffsetForNode(
+            node, getSyntaxOffset(node.receiver, kind: CodePositionKind.END)),
+        StepKind.ACCESS);
+    steps.add(node);
     visit(node.selector);
   }
 
diff --git a/pkg/compiler/lib/src/ir/cached_static_type.dart b/pkg/compiler/lib/src/ir/cached_static_type.dart
new file mode 100644
index 0000000..5daea39
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/cached_static_type.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+import 'static_type_base.dart';
+import 'static_type_provider.dart';
+
+/// Class that provides the static type of expression using the visitor pattern
+/// and a precomputed cache for complex expression type.
+class CachedStaticType extends StaticTypeBase implements StaticTypeProvider {
+  final Map<ir.Expression, ir.DartType> _cache;
+  final ThisInterfaceType thisType;
+
+  CachedStaticType(
+      ir.TypeEnvironment typeEnvironment, this._cache, this.thisType)
+      : super(typeEnvironment);
+
+  @override
+  ir.DartType getStaticType(ir.Expression node) {
+    ir.DartType type = node.accept(this);
+    assert(type != null, "No static type found for ${node.runtimeType}.");
+    return type;
+  }
+
+  ir.DartType _getStaticType(ir.Expression node) {
+    ir.DartType type = _cache[node];
+    assert(type != null, "No static type cached for ${node.runtimeType}.");
+    return type;
+  }
+
+  @override
+  ir.DartType visitVariableGet(ir.VariableGet node) => _getStaticType(node);
+
+  @override
+  ir.DartType visitPropertyGet(ir.PropertyGet node) => _getStaticType(node);
+
+  @override
+  ir.DartType visitDirectPropertyGet(ir.DirectPropertyGet node) =>
+      _getStaticType(node);
+
+  @override
+  ir.DartType visitSuperPropertyGet(ir.SuperPropertyGet node) =>
+      _getStaticType(node);
+
+  @override
+  ir.DartType visitMethodInvocation(ir.MethodInvocation node) =>
+      _getStaticType(node);
+
+  @override
+  ir.DartType visitDirectMethodInvocation(ir.DirectMethodInvocation node) =>
+      _getStaticType(node);
+
+  @override
+  ir.DartType visitStaticInvocation(ir.StaticInvocation node) =>
+      _getStaticType(node);
+
+  @override
+  ir.DartType visitSuperMethodInvocation(ir.SuperMethodInvocation node) =>
+      _getStaticType(node);
+
+  @override
+  ir.DartType visitConstructorInvocation(ir.ConstructorInvocation node) =>
+      _getStaticType(node);
+
+  @override
+  ir.DartType visitInstantiation(ir.Instantiation node) => _getStaticType(node);
+}
diff --git a/pkg/compiler/lib/src/ir/closure.dart b/pkg/compiler/lib/src/ir/closure.dart
new file mode 100644
index 0000000..c53f10f
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/closure.dart
@@ -0,0 +1,413 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+
+/// Collection of scope data collected for a single member.
+class ClosureScopeModel {
+  /// Collection [ScopeInfo] data for the member.
+  KernelScopeInfo scopeInfo;
+
+  /// Collected [CapturedScope] data for nodes.
+  Map<ir.Node, KernelCapturedScope> capturedScopesMap =
+      <ir.Node, KernelCapturedScope>{};
+
+  /// Collected [ScopeInfo] data for nodes.
+  Map<ir.TreeNode, KernelScopeInfo> closuresToGenerate =
+      <ir.TreeNode, KernelScopeInfo>{};
+
+  String toString() {
+    return '$scopeInfo\n$capturedScopesMap\n$closuresToGenerate';
+  }
+}
+
+class KernelScopeInfo {
+  final Set<ir.VariableDeclaration> localsUsedInTryOrSync;
+  final bool hasThisLocal;
+  final Set<ir.VariableDeclaration> boxedVariables;
+  // If boxedVariables is empty, this will be null, because no variables will
+  // need to be boxed.
+  final NodeBox capturedVariablesAccessor;
+
+  /// The set of variables that were defined in another scope, but are used in
+  /// this scope. The items in this set are either of type VariableDeclaration
+  /// or TypeParameterTypeWithContext.
+  Set<ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ >
+      freeVariables = new Set<ir.Node>();
+
+  /// A set of type parameters that are defined in another scope and are only
+  /// used if runtime type information is checked. If runtime type information
+  /// needs to be retained, all of these type variables will be added ot the
+  /// freeVariables set. Whether these variables are actually used as
+  /// freeVariables will be set by the time this structure is converted to a
+  /// JsScopeInfo, so JsScopeInfo does not need to use them.
+  Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti =
+      <TypeVariableTypeWithContext, Set<VariableUse>>{};
+
+  /// If true, `this` is used as a free variable, in this scope. It is stored
+  /// separately from [freeVariables] because there is no single
+  /// `VariableDeclaration` node that represents `this`.
+  bool thisUsedAsFreeVariable = false;
+
+  /// If true, `this` is used as a free variable, in this scope if we are also
+  /// performing runtime type checks. It is stored
+  /// separately from [thisUsedAsFreeVariable] because we don't know at this
+  /// stage if we will be needing type checks for this scope.
+  Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti = new Set<VariableUse>();
+
+  KernelScopeInfo(this.hasThisLocal)
+      : localsUsedInTryOrSync = new Set<ir.VariableDeclaration>(),
+        boxedVariables = new Set<ir.VariableDeclaration>(),
+        capturedVariablesAccessor = null;
+
+  KernelScopeInfo.from(this.hasThisLocal, KernelScopeInfo info)
+      : localsUsedInTryOrSync = info.localsUsedInTryOrSync,
+        boxedVariables = info.boxedVariables,
+        capturedVariablesAccessor = null;
+
+  KernelScopeInfo.withBoxedVariables(
+      this.boxedVariables,
+      this.capturedVariablesAccessor,
+      this.localsUsedInTryOrSync,
+      this.freeVariables,
+      this.freeVariablesForRti,
+      this.thisUsedAsFreeVariable,
+      this.thisUsedAsFreeVariableIfNeedsRti,
+      this.hasThisLocal);
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('KernelScopeInfo(this=$hasThisLocal,');
+    sb.write('freeVriables=$freeVariables,');
+    sb.write('localsUsedInTryOrSync={${localsUsedInTryOrSync.join(', ')}}');
+    String comma = '';
+    sb.write('freeVariablesForRti={');
+    freeVariablesForRti.forEach((key, value) {
+      sb.write('$comma$key:$value');
+      comma = ',';
+    });
+    sb.write('})');
+    return sb.toString();
+  }
+}
+
+class KernelCapturedScope extends KernelScopeInfo {
+  KernelCapturedScope(
+      Set<ir.VariableDeclaration> boxedVariables,
+      NodeBox capturedVariablesAccessor,
+      Set<ir.VariableDeclaration> localsUsedInTryOrSync,
+      Set<ir.Node /* VariableDeclaration | TypeVariableTypeWithContext */ >
+          freeVariables,
+      Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti,
+      bool thisUsedAsFreeVariable,
+      Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti,
+      bool hasThisLocal)
+      : super.withBoxedVariables(
+            boxedVariables,
+            capturedVariablesAccessor,
+            localsUsedInTryOrSync,
+            freeVariables,
+            freeVariablesForRti,
+            thisUsedAsFreeVariable,
+            thisUsedAsFreeVariableIfNeedsRti,
+            hasThisLocal);
+
+  // Loops through the free variables of an existing KernelCapturedScope and
+  // creates a new KernelCapturedScope that only captures type variables.
+  KernelCapturedScope.forSignature(KernelCapturedScope scope)
+      : this(
+            _empty,
+            null,
+            _empty,
+            scope.freeVariables.where(
+                (ir.Node variable) => variable is TypeVariableTypeWithContext),
+            scope.freeVariablesForRti,
+            scope.thisUsedAsFreeVariable,
+            scope.thisUsedAsFreeVariableIfNeedsRti,
+            scope.hasThisLocal);
+
+  // Silly hack because we don't have const sets.
+  static final Set<ir.VariableDeclaration> _empty = new Set();
+
+  bool get requiresContextBox => boxedVariables.isNotEmpty;
+}
+
+class KernelCapturedLoopScope extends KernelCapturedScope {
+  final List<ir.VariableDeclaration> boxedLoopVariables;
+
+  KernelCapturedLoopScope(
+      Set<ir.VariableDeclaration> boxedVariables,
+      NodeBox capturedVariablesAccessor,
+      this.boxedLoopVariables,
+      Set<ir.VariableDeclaration> localsUsedInTryOrSync,
+      Set<ir.Node /* VariableDeclaration | TypeVariableTypeWithContext */ >
+          freeVariables,
+      Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti,
+      bool thisUsedAsFreeVariable,
+      Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti,
+      bool hasThisLocal)
+      : super(
+            boxedVariables,
+            capturedVariablesAccessor,
+            localsUsedInTryOrSync,
+            freeVariables,
+            freeVariablesForRti,
+            thisUsedAsFreeVariable,
+            thisUsedAsFreeVariableIfNeedsRti,
+            hasThisLocal);
+
+  bool get hasBoxedLoopVariables => boxedLoopVariables.isNotEmpty;
+}
+
+/// A local variable to disambiguate between a variable that has been captured
+/// from one scope to another. This is the ir.Node version that corresponds to
+/// [BoxLocal].
+class NodeBox {
+  final String name;
+  final ir.TreeNode executableContext;
+  NodeBox(this.name, this.executableContext);
+}
+
+enum VariableUseKind {
+  /// An explicit variable use.
+  ///
+  /// For type variable this is an explicit as-cast, an is-test or a type
+  /// literal.
+  explicit,
+
+  /// A type variable used in the type of a local variable.
+  localType,
+
+  /// A type variable used in an implicit cast.
+  implicitCast,
+
+  /// A type variable passed as the type argument of a list literal.
+  listLiteral,
+
+  /// A type variable passed as the type argument of a map literal.
+  mapLiteral,
+
+  /// A type variable passed as a type argument to a constructor.
+  constructorTypeArgument,
+
+  /// A type variable passed as a type argument to a static method.
+  staticTypeArgument,
+
+  /// A type variable passed as a type argument to an instance method.
+  instanceTypeArgument,
+
+  /// A type variable passed as a type argument to a local function.
+  localTypeArgument,
+
+  /// A type variable in a parameter type of a member.
+  memberParameter,
+
+  /// A type variable in a parameter type of a local function.
+  localParameter,
+
+  /// A type variable used in a return type of a member.
+  memberReturnType,
+
+  /// A type variable used in a return type of a local function.
+  localReturnType,
+
+  /// A type variable in a field type.
+  fieldType,
+
+  /// A type argument of an generic instantiation.
+  instantiationTypeArgument,
+}
+
+class VariableUse {
+  final VariableUseKind kind;
+  final ir.Member member;
+  final ir.TreeNode /*ir.FunctionDeclaration|ir.FunctionExpression*/
+      localFunction;
+  final ir.MethodInvocation invocation;
+  final ir.Instantiation instantiation;
+
+  const VariableUse._simple(this.kind)
+      : this.member = null,
+        this.localFunction = null,
+        this.invocation = null,
+        this.instantiation = null;
+
+  VariableUse.memberParameter(this.member)
+      : this.kind = VariableUseKind.memberParameter,
+        this.localFunction = null,
+        this.invocation = null,
+        this.instantiation = null;
+
+  VariableUse.localParameter(this.localFunction)
+      : this.kind = VariableUseKind.localParameter,
+        this.member = null,
+        this.invocation = null,
+        this.instantiation = null {
+    assert(localFunction is ir.FunctionDeclaration ||
+        localFunction is ir.FunctionExpression);
+  }
+
+  VariableUse.memberReturnType(this.member)
+      : this.kind = VariableUseKind.memberReturnType,
+        this.localFunction = null,
+        this.invocation = null,
+        this.instantiation = null;
+
+  VariableUse.localReturnType(this.localFunction)
+      : this.kind = VariableUseKind.localReturnType,
+        this.member = null,
+        this.invocation = null,
+        this.instantiation = null {
+    assert(localFunction is ir.FunctionDeclaration ||
+        localFunction is ir.FunctionExpression);
+  }
+
+  VariableUse.constructorTypeArgument(this.member)
+      : this.kind = VariableUseKind.constructorTypeArgument,
+        this.localFunction = null,
+        this.invocation = null,
+        this.instantiation = null;
+
+  VariableUse.staticTypeArgument(this.member)
+      : this.kind = VariableUseKind.staticTypeArgument,
+        this.localFunction = null,
+        this.invocation = null,
+        this.instantiation = null;
+
+  VariableUse.instanceTypeArgument(this.invocation)
+      : this.kind = VariableUseKind.instanceTypeArgument,
+        this.member = null,
+        this.localFunction = null,
+        this.instantiation = null;
+
+  VariableUse.localTypeArgument(this.localFunction, this.invocation)
+      : this.kind = VariableUseKind.localTypeArgument,
+        this.member = null,
+        this.instantiation = null {
+    assert(localFunction is ir.FunctionDeclaration ||
+        localFunction is ir.FunctionExpression);
+  }
+
+  VariableUse.instantiationTypeArgument(this.instantiation)
+      : this.kind = VariableUseKind.instantiationTypeArgument,
+        this.member = null,
+        this.localFunction = null,
+        this.invocation = null;
+
+  static const VariableUse explicit =
+      const VariableUse._simple(VariableUseKind.explicit);
+
+  static const VariableUse localType =
+      const VariableUse._simple(VariableUseKind.localType);
+
+  static const VariableUse implicitCast =
+      const VariableUse._simple(VariableUseKind.implicitCast);
+
+  static const VariableUse listLiteral =
+      const VariableUse._simple(VariableUseKind.listLiteral);
+
+  static const VariableUse mapLiteral =
+      const VariableUse._simple(VariableUseKind.mapLiteral);
+
+  static const VariableUse fieldType =
+      const VariableUse._simple(VariableUseKind.fieldType);
+
+  int get hashCode =>
+      kind.hashCode * 11 +
+      member.hashCode * 13 +
+      localFunction.hashCode * 17 +
+      invocation.hashCode * 19 +
+      instantiation.hashCode * 23;
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! VariableUse) return false;
+    return kind == other.kind &&
+        member == other.member &&
+        localFunction == other.localFunction &&
+        invocation == other.invocation &&
+        instantiation == other.instantiation;
+  }
+
+  String toString() => 'VariableUse(kind=$kind,member=$member,'
+      'localFunction=$localFunction,invocation=$invocation,'
+      'instantiation=$instantiation)';
+}
+
+enum TypeVariableKind { cls, method, local, function }
+
+/// A fake ir.Node that holds the TypeParameterType as well as the context in
+/// which it occurs.
+class TypeVariableTypeWithContext implements ir.Node {
+  final ir.Node context;
+  final ir.TypeParameterType type;
+  final TypeVariableKind kind;
+  final ir.TreeNode typeDeclaration;
+
+  /// [context] can be either an ir.Member or a ir.FunctionDeclaration or
+  /// ir.FunctionExpression.
+  factory TypeVariableTypeWithContext(
+      ir.TypeParameterType type, ir.TreeNode context) {
+    TypeVariableKind kind;
+    ir.TreeNode typeDeclaration = type.parameter.parent;
+    if (typeDeclaration == null) {
+      // We have a function type variable, like `T` in `void Function<T>(int)`.
+      kind = TypeVariableKind.function;
+    } else if (typeDeclaration is ir.Class) {
+      // We have a class type variable, like `T` in `class Class<T> { ... }`.
+      kind = TypeVariableKind.cls;
+    } else if (typeDeclaration.parent is ir.Member) {
+      ir.Member member = typeDeclaration.parent;
+      if (member is ir.Constructor ||
+          (member is ir.Procedure && member.isFactory)) {
+        // We have a synthesized generic method type variable for a class type
+        // variable.
+        // TODO(johnniwinther): Handle constructor/factory type variables as
+        // method type variables.
+        kind = TypeVariableKind.cls;
+        typeDeclaration = member.enclosingClass;
+      } else {
+        // We have a generic method type variable, like `T` in
+        // `m<T>() { ... }`.
+        kind = TypeVariableKind.method;
+        typeDeclaration = typeDeclaration.parent;
+        context = typeDeclaration;
+      }
+    } else {
+      // We have a generic local function type variable, like `T` in
+      // `m() { local<T>() { ... } ... }`.
+      assert(
+          typeDeclaration.parent is ir.FunctionExpression ||
+              typeDeclaration.parent is ir.FunctionDeclaration,
+          "Unexpected type declaration: $typeDeclaration");
+      kind = TypeVariableKind.local;
+      typeDeclaration = typeDeclaration.parent;
+      context = typeDeclaration;
+    }
+    return new TypeVariableTypeWithContext.internal(
+        type, context, kind, typeDeclaration);
+  }
+
+  TypeVariableTypeWithContext.internal(
+      this.type, this.context, this.kind, this.typeDeclaration);
+
+  accept(ir.Visitor v) {
+    throw new UnsupportedError('TypeVariableTypeWithContext.accept');
+  }
+
+  visitChildren(ir.Visitor v) {
+    throw new UnsupportedError('TypeVariableTypeWithContext.visitChildren');
+  }
+
+  int get hashCode => type.hashCode;
+
+  bool operator ==(other) {
+    if (other is! TypeVariableTypeWithContext) return false;
+    return type == other.type && context == other.context;
+  }
+
+  String toString() =>
+      'TypeVariableTypeWithContext(type=$type,context=$context,'
+      'kind=$kind,typeDeclaration=$typeDeclaration)';
+}
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
new file mode 100644
index 0000000..570fa82
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -0,0 +1,534 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:front_end/src/api_unstable/dart2js.dart'
+    show operatorFromString;
+
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+
+import '../common.dart';
+import 'scope.dart';
+import 'static_type.dart';
+import 'static_type_base.dart';
+import 'util.dart';
+
+abstract class ImpactBuilder extends StaticTypeVisitor {
+  final VariableScopeModel variableScopeModel;
+
+  ImpactBuilder(ir.TypeEnvironment typeEnvironment,
+      ir.ClassHierarchy classHierarchy, this.variableScopeModel)
+      : super(typeEnvironment, classHierarchy);
+
+  ClassRelation _computeClassRelationFromType(ir.DartType type) {
+    if (type is ThisInterfaceType) {
+      return ClassRelation.thisExpression;
+    } else if (type is ExactInterfaceType) {
+      return ClassRelation.exact;
+    } else {
+      return ClassRelation.subtype;
+    }
+  }
+
+  void registerIntLiteral(int value);
+
+  @override
+  void handleIntLiteral(ir.IntLiteral node) {
+    registerIntLiteral(node.value);
+  }
+
+  void registerDoubleLiteral(double value);
+
+  @override
+  void handleDoubleLiteral(ir.DoubleLiteral node) {
+    registerDoubleLiteral(node.value);
+  }
+
+  void registerBoolLiteral(bool value);
+
+  @override
+  void handleBoolLiteral(ir.BoolLiteral node) {
+    registerBoolLiteral(node.value);
+  }
+
+  void registerStringLiteral(String value);
+
+  @override
+  void handleStringLiteral(ir.StringLiteral node) {
+    registerStringLiteral(node.value);
+  }
+
+  void registerSymbolLiteral(String value);
+
+  @override
+  void handleSymbolLiteral(ir.SymbolLiteral node) {
+    registerSymbolLiteral(node.value);
+  }
+
+  void registerNullLiteral();
+
+  @override
+  void handleNullLiteral(ir.NullLiteral node) {
+    registerNullLiteral();
+  }
+
+  void registerListLiteral(ir.DartType elementType,
+      {bool isConstant, bool isEmpty});
+
+  @override
+  void handleListLiteral(ir.ListLiteral node) {
+    registerListLiteral(node.typeArgument,
+        isConstant: node.isConst, isEmpty: node.expressions.isEmpty);
+  }
+
+  void registerMapLiteral(ir.DartType keyType, ir.DartType valueType,
+      {bool isConstant, bool isEmpty});
+
+  @override
+  void handleMapLiteral(ir.MapLiteral node) {
+    registerMapLiteral(node.keyType, node.valueType,
+        isConstant: node.isConst, isEmpty: node.entries.isEmpty);
+  }
+
+  void registerStaticTearOff(
+      ir.Procedure procedure, ir.LibraryDependency import);
+
+  void registerStaticGet(ir.Member member, ir.LibraryDependency import);
+
+  @override
+  void handleStaticGet(ir.StaticGet node, ir.DartType resultType) {
+    ir.Member target = node.target;
+    if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
+      registerStaticTearOff(target, getDeferredImport(node));
+    } else {
+      registerStaticGet(target, getDeferredImport(node));
+    }
+  }
+
+  void registerStaticSet(ir.Member member, ir.LibraryDependency import);
+
+  @override
+  void handleStaticSet(ir.StaticSet node, ir.DartType valueType) {
+    registerStaticSet(node.target, getDeferredImport(node));
+  }
+
+  void registerAssert({bool withMessage});
+
+  @override
+  void handleAssertStatement(ir.AssertStatement node) {
+    registerAssert(withMessage: node.message != null);
+  }
+
+  void registerGenericInstantiation(
+      ir.FunctionType expressionType, List<ir.DartType> typeArguments);
+
+  @override
+  void handleInstantiation(ir.Instantiation node,
+      ir.FunctionType expressionType, ir.DartType resultType) {
+    registerGenericInstantiation(expressionType, node.typeArguments);
+  }
+
+  void registerSyncStar(ir.DartType elementType);
+
+  void registerAsync(ir.DartType elementType);
+
+  void registerAsyncStar(ir.DartType elementType);
+
+  void handleAsyncMarker(ir.FunctionNode function) {
+    ir.AsyncMarker asyncMarker = function.asyncMarker;
+    ir.DartType returnType = function.returnType;
+
+    switch (asyncMarker) {
+      case ir.AsyncMarker.Sync:
+        break;
+      case ir.AsyncMarker.SyncStar:
+        ir.DartType elementType = const ir.DynamicType();
+        if (returnType is ir.InterfaceType) {
+          if (returnType.classNode == typeEnvironment.coreTypes.iterableClass) {
+            elementType = returnType.typeArguments.first;
+          }
+        }
+        registerSyncStar(elementType);
+        break;
+
+      case ir.AsyncMarker.Async:
+        ir.DartType elementType = const ir.DynamicType();
+        if (returnType is ir.InterfaceType) {
+          if (returnType.classNode == typeEnvironment.coreTypes.futureOrClass) {
+            elementType = returnType.typeArguments.first;
+          } else if (returnType.classNode ==
+              typeEnvironment.coreTypes.futureClass) {
+            elementType = returnType.typeArguments.first;
+          }
+        }
+        registerAsync(elementType);
+        break;
+
+      case ir.AsyncMarker.AsyncStar:
+        ir.DartType elementType = const ir.DynamicType();
+        if (returnType is ir.InterfaceType) {
+          if (returnType.classNode == typeEnvironment.coreTypes.streamClass) {
+            elementType = returnType.typeArguments.first;
+          }
+        }
+        registerAsyncStar(elementType);
+        break;
+
+      case ir.AsyncMarker.SyncYielding:
+        failedAt(CURRENT_ELEMENT_SPANNABLE,
+            "Unexpected async marker: ${asyncMarker}");
+    }
+  }
+
+  void registerStringConcatenation();
+
+  @override
+  void handleStringConcatenation(ir.StringConcatenation node) {
+    registerStringConcatenation();
+  }
+
+  void registerLocalFunction(ir.TreeNode node);
+
+  @override
+  Null handleFunctionDeclaration(ir.FunctionDeclaration node) {
+    registerLocalFunction(node);
+    handleAsyncMarker(node.function);
+  }
+
+  @override
+  void handleFunctionExpression(ir.FunctionExpression node) {
+    registerLocalFunction(node);
+    handleAsyncMarker(node.function);
+  }
+
+  void registerLocalWithoutInitializer();
+
+  @override
+  void handleVariableDeclaration(ir.VariableDeclaration node) {
+    if (node.initializer == null) {
+      registerLocalWithoutInitializer();
+    }
+  }
+
+  void registerIsCheck(ir.DartType type);
+
+  @override
+  void handleIsExpression(ir.IsExpression node) {
+    registerIsCheck(node.type);
+  }
+
+  void registerImplicitCast(ir.DartType type);
+
+  void registerAsCast(ir.DartType type);
+
+  @override
+  void handleAsExpression(ir.AsExpression node, ir.DartType operandType) {
+    if (typeEnvironment.isSubtypeOf(operandType, node.type)) {
+      // Skip unneeded casts.
+      return;
+    }
+    if (node.isTypeError) {
+      registerImplicitCast(node.type);
+    } else {
+      registerAsCast(node.type);
+    }
+  }
+
+  void registerThrow();
+
+  @override
+  void handleThrow(ir.Throw node) {
+    registerThrow();
+  }
+
+  void registerSyncForIn(ir.DartType iterableType);
+
+  void registerAsyncForIn(ir.DartType iterableType);
+
+  @override
+  void handleForInStatement(ir.ForInStatement node, ir.DartType iterableType) {
+    if (node.isAsync) {
+      registerAsyncForIn(iterableType);
+    } else {
+      registerSyncForIn(iterableType);
+    }
+  }
+
+  void registerCatch();
+
+  void registerStackTrace();
+
+  void registerCatchType(ir.DartType type);
+
+  @override
+  void handleCatch(ir.Catch node) {
+    registerCatch();
+    if (node.stackTrace != null) {
+      registerStackTrace();
+    }
+    if (node.guard is! ir.DynamicType) {
+      registerCatchType(node.guard);
+    }
+  }
+
+  void registerTypeLiteral(ir.DartType type, ir.LibraryDependency import);
+
+  @override
+  void handleTypeLiteral(ir.TypeLiteral node) {
+    registerTypeLiteral(node.type, getDeferredImport(node));
+  }
+
+  void registerFieldInitializer(ir.Field node);
+
+  @override
+  void handleFieldInitializer(ir.FieldInitializer node) {
+    registerFieldInitializer(node.field);
+  }
+
+  void registerLoadLibrary();
+
+  @override
+  void handleLoadLibrary(ir.LoadLibrary node) {
+    registerLoadLibrary();
+  }
+
+  void registerRedirectingInitializer(
+      ir.Constructor constructor, ir.Arguments arguments);
+
+  void handleRedirectingInitializer(
+      ir.RedirectingInitializer node, ArgumentTypes argumentTypes) {
+    registerRedirectingInitializer(node.target, node.arguments);
+  }
+
+  void registerParameterCheck(ir.DartType type);
+
+  @override
+  void handleParameter(ir.VariableDeclaration parameter) {
+    registerParameterCheck(parameter.type);
+  }
+
+  @override
+  void handleSignature(ir.FunctionNode node) {
+    for (ir.TypeParameter parameter in node.typeParameters) {
+      registerParameterCheck(parameter.bound);
+    }
+  }
+
+  void registerLazyField();
+
+  @override
+  void handleField(ir.Field field) {
+    registerParameterCheck(field.type);
+    if (field.initializer != null) {
+      if (!field.isInstanceMember &&
+          !field.isConst &&
+          field.initializer is! ir.NullLiteral) {
+        registerLazyField();
+      }
+    } else {
+      registerNullLiteral();
+    }
+  }
+
+  @override
+  void handleProcedure(ir.Procedure procedure) {
+    handleAsyncMarker(procedure.function);
+  }
+
+  void registerNew(ir.Member constructor, ir.InterfaceType type,
+      ir.Arguments arguments, ir.LibraryDependency import,
+      {bool isConst});
+
+  @override
+  void handleConstructorInvocation(ir.ConstructorInvocation node,
+      ArgumentTypes argumentTypes, ir.DartType resultType) {
+    registerNew(node.target, node.constructedType, node.arguments,
+        getDeferredImport(node),
+        isConst: node.isConst);
+  }
+
+  void registerStaticInvocation(
+      ir.Procedure target, ir.Arguments arguments, ir.LibraryDependency import);
+
+  @override
+  void handleStaticInvocation(ir.StaticInvocation node,
+      ArgumentTypes argumentTypes, ir.DartType returnType) {
+    if (node.target.kind == ir.ProcedureKind.Factory) {
+      // TODO(johnniwinther): We should not mark the type as instantiated but
+      // rather follow the type arguments directly.
+      //
+      // Consider this:
+      //
+      //    abstract class A<T> {
+      //      factory A.regular() => new B<T>();
+      //      factory A.redirect() = B<T>;
+      //    }
+      //
+      //    class B<T> implements A<T> {}
+      //
+      //    main() {
+      //      print(new A<int>.regular() is B<int>);
+      //      print(new A<String>.redirect() is B<String>);
+      //    }
+      //
+      // To track that B is actually instantiated as B<int> and B<String> we
+      // need to follow the type arguments passed to A.regular and A.redirect
+      // to B. Currently, we only do this soundly if we register A<int> and
+      // A<String> as instantiated. We should instead register that A.T is
+      // instantiated as int and String.
+      registerNew(
+          node.target,
+          new ir.InterfaceType(
+              node.target.enclosingClass, node.arguments.types),
+          node.arguments,
+          getDeferredImport(node),
+          isConst: node.isConst);
+    } else {
+      registerStaticInvocation(
+          node.target, node.arguments, getDeferredImport(node));
+    }
+  }
+
+  void registerLocalFunctionInvocation(
+      ir.FunctionDeclaration localFunction, ir.Arguments arguments);
+
+  void registerDynamicInvocation(ir.DartType receiverType,
+      ClassRelation relation, ir.Name name, ir.Arguments arguments);
+
+  void registerInstanceInvocation(ir.DartType receiverType,
+      ClassRelation relation, ir.Member target, ir.Arguments arguments);
+
+  void registerFunctionInvocation(
+      ir.DartType receiverType, ir.Arguments arguments);
+
+  @override
+  void handleMethodInvocation(
+      ir.MethodInvocation node,
+      ir.DartType receiverType,
+      ArgumentTypes argumentTypes,
+      ir.DartType returnType) {
+    ir.Expression receiver = node.receiver;
+    if (receiver is ir.VariableGet &&
+        receiver.variable.isFinal &&
+        receiver.variable.parent is ir.FunctionDeclaration) {
+      registerLocalFunctionInvocation(receiver.variable.parent, node.arguments);
+    } else {
+      ClassRelation relation = _computeClassRelationFromType(receiverType);
+
+      ir.Member interfaceTarget = node.interfaceTarget;
+      if (interfaceTarget == null) {
+        registerDynamicInvocation(
+            receiverType, relation, node.name, node.arguments);
+        // TODO(johnniwinther): Avoid treating a known function call as a
+        // dynamic call when CFE provides a way to distinguish the two.
+        if (operatorFromString(node.name.name) == null &&
+            receiverType is ir.DynamicType) {
+          // We might implicitly call a getter that returns a function.
+          registerFunctionInvocation(const ir.DynamicType(), node.arguments);
+        }
+      } else {
+        if (interfaceTarget is ir.Field ||
+            interfaceTarget is ir.Procedure &&
+                interfaceTarget.kind == ir.ProcedureKind.Getter) {
+          registerInstanceInvocation(
+              receiverType, relation, interfaceTarget, node.arguments);
+          registerFunctionInvocation(
+              interfaceTarget.getterType, node.arguments);
+        } else {
+          registerInstanceInvocation(
+              receiverType, relation, interfaceTarget, node.arguments);
+        }
+      }
+    }
+  }
+
+  @override
+  void handleDirectMethodInvocation(
+      ir.DirectMethodInvocation node,
+      ir.DartType receiverType,
+      ArgumentTypes argumentTypes,
+      ir.DartType returnType) {
+    registerInstanceInvocation(
+        receiverType, ClassRelation.exact, node.target, node.arguments);
+  }
+
+  void registerDynamicGet(
+      ir.DartType receiverType, ClassRelation relation, ir.Name name);
+
+  void registerInstanceGet(
+      ir.DartType receiverType, ClassRelation relation, ir.Member target);
+
+  @override
+  void handlePropertyGet(
+      ir.PropertyGet node, ir.DartType receiverType, ir.DartType resultType) {
+    ClassRelation relation = _computeClassRelationFromType(receiverType);
+    if (node.interfaceTarget != null) {
+      registerInstanceGet(receiverType, relation, node.interfaceTarget);
+    } else {
+      registerDynamicGet(receiverType, relation, node.name);
+    }
+  }
+
+  @override
+  void handleDirectPropertyGet(ir.DirectPropertyGet node,
+      ir.DartType receiverType, ir.DartType resultType) {
+    registerInstanceGet(receiverType, ClassRelation.exact, node.target);
+  }
+
+  void registerDynamicSet(
+      ir.DartType receiverType, ClassRelation relation, ir.Name name);
+
+  void registerInstanceSet(
+      ir.DartType receiverType, ClassRelation relation, ir.Member target);
+
+  @override
+  void handlePropertySet(
+      ir.PropertySet node, ir.DartType receiverType, ir.DartType valueType) {
+    ClassRelation relation = _computeClassRelationFromType(receiverType);
+    if (node.interfaceTarget != null) {
+      registerInstanceSet(receiverType, relation, node.interfaceTarget);
+    } else {
+      registerDynamicSet(receiverType, relation, node.name);
+    }
+  }
+
+  @override
+  void handleDirectPropertySet(ir.DirectPropertySet node,
+      ir.DartType receiverType, ir.DartType valueType) {
+    registerInstanceSet(receiverType, ClassRelation.exact, node.target);
+  }
+
+  void registerSuperInvocation(ir.Name name, ir.Arguments arguments);
+
+  @override
+  void handleSuperMethodInvocation(ir.SuperMethodInvocation node,
+      ArgumentTypes argumentTypes, ir.DartType returnType) {
+    registerSuperInvocation(node.name, node.arguments);
+  }
+
+  void registerSuperGet(ir.Name name);
+
+  @override
+  void handleSuperPropertyGet(
+      ir.SuperPropertyGet node, ir.DartType resultType) {
+    registerSuperGet(node.name);
+  }
+
+  void registerSuperSet(ir.Name name);
+
+  @override
+  void handleSuperPropertySet(ir.SuperPropertySet node, ir.DartType valueType) {
+    registerSuperSet(node.name);
+  }
+
+  void registerSuperInitializer(
+      ir.Constructor source, ir.Constructor target, ir.Arguments arguments);
+
+  @override
+  void handleSuperInitializer(
+      ir.SuperInitializer node, ArgumentTypes argumentTypes) {
+    registerSuperInitializer(node.parent, node.target, node.arguments);
+  }
+}
diff --git a/pkg/compiler/lib/src/ir/runtime_type_analysis.dart b/pkg/compiler/lib/src/ir/runtime_type_analysis.dart
new file mode 100644
index 0000000..cde8217
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/runtime_type_analysis.dart
@@ -0,0 +1,414 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+
+import '../common/names.dart';
+import 'util.dart';
+
+/// Enum for recognized use kinds of `Object.runtimeType`.
+enum RuntimeTypeUseKind {
+  /// Unknown use of `Object.runtimeType`. This is the fallback value if the
+  /// usage didn't match any of the recognized patterns.
+  unknown,
+
+  /// `Object.runtimeType` used in a pattern like
+  /// `a.runtimeType == b.runtimeType`.
+  equals,
+
+  /// `Object.runtimeType` used in a pattern like `'${e.runtimeType}'` or
+  /// `e.runtimeType.toString()`.
+  string,
+}
+
+/// Data object use for computing static type information on uses of
+/// `Object.runtimeType`.
+class RuntimeTypeUseData {
+  /// The use kind of `Object.runtimeType`.
+  final RuntimeTypeUseKind kind;
+
+  /// The property get for the left (or single) occurrence of `.runtimeType`.
+  final ir.PropertyGet leftRuntimeTypeExpression;
+
+  /// The receiver expression.
+  final ir.Expression receiver;
+
+  /// The static type of the receiver expression. This is set in the static type
+  /// visitor.
+  ir.DartType receiverType;
+
+  /// The property get for the right occurrence of `.runtimeType` when [kind]
+  /// is `RuntimeTypeUseKind.equals`.
+  final ir.PropertyGet rightRuntimeTypeExpression;
+
+  /// The argument expression if [kind] is `RuntimeTypeUseKind.equals`.
+  final ir.Expression argument;
+
+  /// The static type of the argument expression. This is set in the static type
+  /// visitor.
+  ir.DartType argumentType;
+
+  RuntimeTypeUseData(this.kind, this.leftRuntimeTypeExpression, this.receiver,
+      this.rightRuntimeTypeExpression, this.argument);
+
+  bool get isComplete {
+    switch (kind) {
+      case RuntimeTypeUseKind.unknown:
+      case RuntimeTypeUseKind.string:
+        return receiverType != null;
+      case RuntimeTypeUseKind.equals:
+        return receiverType != null && argumentType != null;
+    }
+    throw new UnsupportedError("Unexpected RuntimeTypeUseKind $kind.");
+  }
+
+  String toString() {
+    return "RuntimeTypeUseData(kind=$kind,"
+        "receiverGet=$leftRuntimeTypeExpression,receiver=$receiver,"
+        "receiverType=$receiverType,argumentGet=$rightRuntimeTypeExpression,"
+        "argument=$argument,argumentType=$argumentType)";
+  }
+}
+
+/// Computes the [RuntimeTypeUseData] corresponding to the `e.runtimeType`
+/// [node].
+///
+/// [cache] is used to ensure that only one [RuntimeTypeUseData] object is
+/// created per case, even for the `==` case.
+RuntimeTypeUseData computeRuntimeTypeUse(
+    Map<ir.PropertyGet, RuntimeTypeUseData> cache, ir.PropertyGet node) {
+  RuntimeTypeUseData receiverData = cache[node];
+  if (receiverData != null) return receiverData;
+
+  /// Returns `true` if [node] is of the form `e.runtimeType`.
+  bool isGetRuntimeType(ir.TreeNode node) {
+    return node is ir.PropertyGet && node.name.name == Identifiers.runtimeType_;
+  }
+
+  /// Returns [node] if [node] is of the form `e.runtimeType` and `null`
+  /// otherwise.
+  ir.PropertyGet asGetRuntimeType(ir.TreeNode node) {
+    return isGetRuntimeType(node) ? node : null;
+  }
+
+  /// Returns `true` if [node] is of the form `e.toString()`.
+  bool isInvokeToString(ir.TreeNode node) {
+    return node is ir.MethodInvocation && node.name.name == 'toString';
+  }
+
+  assert(isGetRuntimeType(node));
+
+  // TODO(johnniwinther): Special-case `this.runtimeType`.
+  ir.PropertyGet receiverGet;
+  ir.Expression receiver;
+  ir.PropertyGet argumentGet;
+  ir.Expression argument;
+  RuntimeTypeUseKind kind;
+
+  if (node.receiver is ir.VariableGet &&
+      node.parent is ir.ConditionalExpression &&
+      node.parent.parent is ir.Let) {
+    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
+    if (nullAware != null) {
+      // The node is of the form:
+      //
+      //     let #t1 = e in #t1 == null ? null : #t1.runtimeType
+      //                                             ^
+
+      if (nullAware.parent is ir.VariableDeclaration &&
+          nullAware.parent.parent is ir.Let) {
+        NullAwareExpression outer =
+            getNullAwareExpression(nullAware.parent.parent);
+        if (outer != null &&
+            outer.receiver == nullAware.let &&
+            isInvokeToString(outer.expression)) {
+          // Detected
+          //
+          //     e?.runtimeType?.toString()
+          //        ^
+          // encoded as
+          //
+          //     let #t2 = (let #t1 = e in #t1 == null ? null : #t1.runtimeType)
+          //                                                        ^
+          //        in #t2 == null ? null : #t2.toString()
+          //
+          kind = RuntimeTypeUseKind.string;
+          receiver = nullAware.receiver;
+          receiverGet = node;
+        }
+      } else if (nullAware.parent is ir.MethodInvocation) {
+        ir.MethodInvocation methodInvocation = nullAware.parent;
+        if (methodInvocation.receiver == nullAware.let &&
+            methodInvocation.name.name == '==') {
+          // Detected
+          //
+          //  e0?.runtimeType == other
+          ir.PropertyGet otherGetRuntimeType =
+              asGetRuntimeType(methodInvocation.arguments.positional.first);
+          if (otherGetRuntimeType != null) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1.runtimeType
+            //         ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //                                               ^
+            //        .==(e1.runtimeType)
+            kind = RuntimeTypeUseKind.equals;
+            receiver = nullAware.receiver;
+            receiverGet = node;
+            argument = otherGetRuntimeType.receiver;
+            argumentGet = methodInvocation.arguments.positional.first;
+          }
+
+          NullAwareExpression otherNullAware = getNullAwareExpression(
+              methodInvocation.arguments.positional.first);
+          if (otherNullAware != null &&
+              isGetRuntimeType(otherNullAware.expression)) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1?.runtimeType
+            //         ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //                                               ^
+            //         .==(let #t2 = e1 in #t2 == null ? null : #t2.runtimeType)
+            //
+            kind = RuntimeTypeUseKind.equals;
+            receiver = nullAware.receiver;
+            receiverGet = node;
+            argument = otherNullAware.receiver;
+            argumentGet = otherNullAware.expression;
+          }
+        } else if (isInvokeToString(nullAware.parent)) {
+          // Detected
+          //
+          //     e?.runtimeType.toString()
+          //        ^
+          // encoded as
+          //
+          //     (let #t1 = e in #t1 == null ? null : #t1.runtimeType)
+          //                                          ^
+          //         .toString()
+          //
+          kind = RuntimeTypeUseKind.string;
+          receiver = nullAware.receiver;
+          receiverGet = node;
+        }
+      } else if (nullAware.parent is ir.Arguments &&
+          nullAware.parent.parent is ir.MethodInvocation) {
+        ir.MethodInvocation methodInvocation = nullAware.parent.parent;
+        if (methodInvocation.name.name == '==' &&
+            methodInvocation.arguments.positional.first == nullAware.let) {
+          // [nullAware] is the right hand side of ==.
+
+          ir.PropertyGet otherGetRuntimeType =
+              asGetRuntimeType(methodInvocation.receiver);
+          NullAwareExpression otherNullAware =
+              getNullAwareExpression(methodInvocation.receiver);
+
+          if (otherGetRuntimeType != null) {
+            // Detected
+            //
+            //     e0.runtimeType == e1?.runtimeType
+            //                           ^
+            // encoded as
+            //
+            //     e0.runtimeType.==(
+            //         let #t1 = e1 in #t1 == null ? null : #t1.runtimeType)
+            //                                                  ^
+            kind = RuntimeTypeUseKind.equals;
+            receiver = otherGetRuntimeType.receiver;
+            receiverGet = otherGetRuntimeType;
+            argument = nullAware.receiver;
+            argumentGet = node;
+          }
+
+          if (otherNullAware != null &&
+              isGetRuntimeType(otherNullAware.expression)) {
+            // Detected
+            //
+            //     e0?.runtimeType == e1?.runtimeType
+            //                            ^
+            // encoded as
+            //
+            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+            //         .==(let #t2 = e1 in #t2 == null ? null : #t2.runtimeType)
+            //                                                      ^
+            kind = RuntimeTypeUseKind.equals;
+            receiver = otherNullAware.receiver;
+            receiverGet = otherNullAware.expression;
+            argument = nullAware.receiver;
+            argumentGet = node;
+          }
+        }
+      } else if (nullAware.parent is ir.StringConcatenation) {
+        // Detected
+        //
+        //     '${e?.runtimeType}'
+        //           ^
+        // encoded as
+        //
+        //     '${let #t1 = e in #t1 == null ? null : #t1.runtimeType}'
+        //                                                ^
+        kind = RuntimeTypeUseKind.string;
+        receiver = nullAware.receiver;
+        receiverGet = node;
+      } else {
+        // Default to unknown
+        //
+        //     e?.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     let #t1 = e in #t1 == null ? null : #t1.runtimeType
+        //                                         ^
+        kind = RuntimeTypeUseKind.unknown;
+        receiver = nullAware.receiver;
+        receiverGet = node;
+      }
+    }
+  } else if (node.parent is ir.VariableDeclaration &&
+      node.parent.parent is ir.Let) {
+    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
+    if (nullAware != null && isInvokeToString(nullAware.expression)) {
+      // Detected
+      //
+      //     e.runtimeType?.toString()
+      //       ^
+      // encoded as
+      //
+      //     let #t1 = e.runtimeType in #t1 == null ? null : #t1.toString()
+      //                 ^
+      kind = RuntimeTypeUseKind.string;
+      receiver = node.receiver;
+      receiverGet = node;
+    }
+  } else if (node.parent is ir.MethodInvocation) {
+    ir.MethodInvocation methodInvocation = node.parent;
+    if (methodInvocation.name.name == '==' &&
+        methodInvocation.receiver == node) {
+      // [node] is the left hand side of ==.
+
+      ir.PropertyGet otherGetRuntimeType =
+          asGetRuntimeType(methodInvocation.arguments.positional.first);
+      NullAwareExpression nullAware =
+          getNullAwareExpression(methodInvocation.arguments.positional.first);
+      if (otherGetRuntimeType != null) {
+        // Detected
+        //
+        //     e0.runtimeType == e1.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(e1.runtimeType)
+        //        ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = node.receiver;
+        receiverGet = node;
+        argument = otherGetRuntimeType.receiver;
+        argumentGet = otherGetRuntimeType;
+      } else if (nullAware != null && isGetRuntimeType(nullAware.expression)) {
+        // Detected
+        //
+        //     e0.runtimeType == e1?.runtimeType
+        //        ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(
+        //        ^
+        //         let #t1 = e1 in #t1 == null ? null : #t1.runtimeType)
+        kind = RuntimeTypeUseKind.equals;
+        receiver = node.receiver;
+        receiverGet = node;
+        argument = nullAware.receiver;
+        argumentGet = nullAware.expression;
+      }
+    } else if (isInvokeToString(node.parent)) {
+      // Detected
+      //
+      //     e.runtimeType.toString()
+      //       ^
+      kind = RuntimeTypeUseKind.string;
+      receiver = node.receiver;
+      receiverGet = node;
+    }
+  } else if (node.parent is ir.Arguments &&
+      node.parent.parent is ir.MethodInvocation) {
+    ir.MethodInvocation methodInvocation = node.parent.parent;
+    if (methodInvocation.name.name == '==' &&
+        methodInvocation.arguments.positional.first == node) {
+      // [node] is the right hand side of ==.
+      ir.PropertyGet otherGetRuntimeType =
+          asGetRuntimeType(methodInvocation.receiver);
+      NullAwareExpression nullAware =
+          getNullAwareExpression(methodInvocation.receiver);
+
+      if (otherGetRuntimeType != null) {
+        // Detected
+        //
+        //     e0.runtimeType == e1.runtimeType
+        //                          ^
+        // encoded as
+        //
+        //     e0.runtimeType.==(e1.runtimeType)
+        //                          ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = otherGetRuntimeType.receiver;
+        receiverGet = otherGetRuntimeType;
+        argument = node.receiver;
+        argumentGet = node;
+      } else if (nullAware != null && isGetRuntimeType(nullAware.expression)) {
+        // Detected
+        //
+        //     e0?.runtimeType == e1.runtimeType
+        //                           ^
+        // encoded as
+        //
+        //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
+        //         .==(e1.runtimeType)
+        //                ^
+        kind = RuntimeTypeUseKind.equals;
+        receiver = nullAware.receiver;
+        receiverGet = nullAware.expression;
+        argument = node.receiver;
+        argumentGet = node;
+      }
+    }
+  } else if (node.parent is ir.StringConcatenation) {
+    // Detected
+    //
+    //     '${e.runtimeType}'
+    //          ^
+    kind = RuntimeTypeUseKind.string;
+    receiver = node.receiver;
+    receiverGet = node;
+  }
+
+  if (kind == null) {
+    // Default to unknown
+    //
+    //     e.runtimeType
+    //       ^
+    kind = RuntimeTypeUseKind.unknown;
+    receiver = node.receiver;
+    receiverGet = node;
+  }
+
+  RuntimeTypeUseData data = new RuntimeTypeUseData(
+      kind, receiverGet, receiver, argumentGet, argument);
+  cache[receiverGet] = data;
+  if (argumentGet != null) {
+    cache[argumentGet] = data;
+  }
+
+  assert(receiverGet != null, "Missing receiverGet in $data for $node.");
+  assert(!(argument != null && argumentGet == null),
+      "Missing argumentGet in $data for $node.");
+  assert(
+      receiverGet != argumentGet, "Duplicate property get in $data for $node.");
+  return data;
+}
diff --git a/pkg/compiler/lib/src/ir/scope.dart b/pkg/compiler/lib/src/ir/scope.dart
new file mode 100644
index 0000000..1b547d2
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/scope.dart
@@ -0,0 +1,142 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+import 'closure.dart';
+import 'scope_visitor.dart';
+
+class ScopeModel {
+  final ClosureScopeModel closureScopeModel;
+  final VariableScopeModel variableScopeModel;
+
+  ScopeModel(this.closureScopeModel, this.variableScopeModel);
+
+  /// Inspect members and mark if those members capture any state that needs to
+  /// be marked as free variables.
+  static ScopeModel computeScopeModel(ir.Member node) {
+    if (node.isAbstract && !node.isExternal) return null;
+    if (node is ir.Field && !node.isInstanceMember) {
+      ir.Field field = node;
+      // Skip top-level/static fields without an initializer.
+      if (field.initializer == null) return null;
+    }
+
+    bool hasThisLocal = false;
+    if (node is ir.Constructor) {
+      hasThisLocal = true;
+    } else if (node is ir.Procedure && node.kind == ir.ProcedureKind.Factory) {
+      hasThisLocal = false;
+    } else if (node.isInstanceMember) {
+      hasThisLocal = true;
+    }
+    ClosureScopeModel closureScopeModel = new ClosureScopeModel();
+    ScopeModelBuilder translator =
+        new ScopeModelBuilder(closureScopeModel, hasThisLocal: hasThisLocal);
+    if (node is ir.Field) {
+      if (node is ir.Field && node.initializer != null) {
+        node.accept(translator);
+      } else {
+        assert(node.isInstanceMember);
+        closureScopeModel.scopeInfo = new KernelScopeInfo(true);
+      }
+    } else {
+      assert(node is ir.Procedure || node is ir.Constructor);
+      node.accept(translator);
+    }
+    return new ScopeModel(closureScopeModel, translator.variableScopeModel);
+  }
+}
+
+abstract class VariableScopeModel {
+  VariableScope getScopeFor(ir.TreeNode node);
+  Iterable<ir.VariableDeclaration> get assignedVariables;
+  bool isEffectivelyFinal(ir.VariableDeclaration node);
+}
+
+class VariableScopeModelImpl implements VariableScopeModel {
+  Map<ir.TreeNode, VariableScope> _scopeMap = {};
+  Set<ir.VariableDeclaration> _assignedVariables;
+
+  VariableScope createScopeFor(ir.TreeNode node) {
+    return _scopeMap[node] ??= new VariableScopeImpl();
+  }
+
+  void registerAssignedVariable(ir.VariableDeclaration node) {
+    _assignedVariables ??= new Set<ir.VariableDeclaration>();
+    _assignedVariables.add(node);
+  }
+
+  @override
+  VariableScope getScopeFor(ir.TreeNode node) {
+    return _scopeMap[node];
+  }
+
+  @override
+  Iterable<ir.VariableDeclaration> get assignedVariables =>
+      _assignedVariables ?? <ir.VariableDeclaration>[];
+
+  @override
+  bool isEffectivelyFinal(ir.VariableDeclaration node) {
+    return _assignedVariables == null || !_assignedVariables.contains(node);
+  }
+}
+
+/// Variable information for a scope.
+abstract class VariableScope {
+  /// Returns the set of [ir.VariableDeclaration]s that have been assigned to in
+  /// this scope.
+  Iterable<ir.VariableDeclaration> get assignedVariables;
+
+  /// Returns `true` if this scope has a [ir.ContinueSwitchStatement].
+  bool get hasContinueSwitch;
+}
+
+class VariableScopeImpl implements VariableScope {
+  List<VariableScope> _subScopes;
+  Set<ir.VariableDeclaration> _assignedVariables;
+  bool hasContinueSwitch = false;
+
+  void addSubScope(VariableScope scope) {
+    _subScopes ??= <VariableScope>[];
+    _subScopes.add(scope);
+  }
+
+  void registerAssignedVariable(ir.VariableDeclaration variable) {
+    _assignedVariables ??= new Set<ir.VariableDeclaration>();
+    _assignedVariables.add(variable);
+  }
+
+  Iterable<ir.VariableDeclaration> get assignedVariables sync* {
+    if (_assignedVariables != null) {
+      yield* _assignedVariables;
+    }
+    if (_subScopes != null) {
+      for (VariableScope subScope in _subScopes) {
+        yield* subScope.assignedVariables;
+      }
+    }
+  }
+}
+
+abstract class VariableCollectorMixin {
+  VariableScopeImpl currentVariableScope;
+  VariableScopeModelImpl variableScopeModel = new VariableScopeModelImpl();
+
+  void visitInVariableScope(ir.TreeNode root, void f()) {
+    VariableScopeImpl oldScope = currentVariableScope;
+    currentVariableScope = variableScopeModel.createScopeFor(root);
+    oldScope?.addSubScope(currentVariableScope);
+    f();
+    currentVariableScope = oldScope;
+  }
+
+  void registerAssignedVariable(ir.VariableDeclaration node) {
+    currentVariableScope?.registerAssignedVariable(node);
+    variableScopeModel.registerAssignedVariable(node);
+  }
+
+  void registerContinueSwitch() {
+    currentVariableScope?.hasContinueSwitch = true;
+  }
+}
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
new file mode 100644
index 0000000..2e7061a
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -0,0 +1,942 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+
+import 'closure.dart';
+import 'scope.dart';
+
+/// This builder walks the code to determine what variables are
+/// assigned/captured/free at various points to build a [ClosureScopeModel] and
+/// a [VariableScopeModel] that can respond to queries about how a particular
+/// variable is being used at any point in the code.
+class ScopeModelBuilder extends ir.Visitor<void> with VariableCollectorMixin {
+  ClosureScopeModel _model;
+
+  /// A map of each visited call node with the associated information about what
+  /// variables are captured/used. Each ir.Node key corresponds to a scope that
+  /// was encountered while visiting a closure (initially called through
+  /// [translateLazyInitializer] or [translateConstructorOrProcedure]).
+  Map<ir.Node, KernelCapturedScope> get _scopesCapturedInClosureMap =>
+      _model.capturedScopesMap;
+
+  /// A map of the nodes that we have flagged as necessary to generate closure
+  /// classes for in a later stage. We map that node to information ascertained
+  /// about variable usage in the surrounding scope.
+  Map<ir.TreeNode, KernelScopeInfo> get _closuresToGenerate =>
+      _model.closuresToGenerate;
+
+  /// The local variables that have been declared in the current scope.
+  List<ir.Node /* ir.VariableDeclaration | TypeParameterTypeWithContext */ >
+      _scopeVariables;
+
+  /// Pointer to the context in which this closure is executed.
+  /// For example, in the expression `var foo = () => 3 + i;`, the executable
+  /// context as we walk the nodes in that expression is the ir.Field `foo`.
+  ir.TreeNode _executableContext;
+
+  /// A flag to indicate if we are currently inside a closure.
+  bool _isInsideClosure = false;
+
+  /// Pointer to the original node where this closure builder started.
+  ir.Node _outermostNode;
+
+  /// Keep track of the mutated local variables so that we don't need to box
+  /// non-mutated variables. We know these are only VariableDeclarations because
+  /// type variable types and `this` types can't be mutated!
+  Set<ir.VariableDeclaration> _mutatedVariables =
+      new Set<ir.VariableDeclaration>();
+
+  /// The set of variables that are accessed in some form, whether they are
+  /// mutated or not.
+  Set<ir.Node /* ir.VariableDeclaration | TypeParameterTypeWithContext */ >
+      _capturedVariables = new Set<ir.Node>();
+
+  /// If true, the visitor is currently traversing some nodes that are inside a
+  /// try block.
+  bool _inTry = false;
+
+  /// The current scope we are in.
+  KernelScopeInfo _currentScopeInfo;
+
+  final bool _hasThisLocal;
+
+  /// Keeps track of the number of boxes that we've created so that they each
+  /// have unique names.
+  int _boxCounter = 0;
+
+  /// The current usage of a type annotation.
+  ///
+  /// This is updated in the visitor to distinguish between unconditional
+  /// type variable usage, such as type literals and is tests, and conditional
+  /// type variable usage, such as type argument in method invocations.
+  VariableUse _currentTypeUsage;
+
+  ScopeModelBuilder(this._model, {bool hasThisLocal})
+      : this._hasThisLocal = hasThisLocal;
+
+  @override
+  ir.DartType defaultNode(ir.Node node) =>
+      throw UnsupportedError('Unhandled node $node (${node.runtimeType})');
+
+  void visitNode(ir.Node node) {
+    return node?.accept(this);
+  }
+
+  void visitNodes(List<ir.Node> nodes) {
+    for (ir.Node node in nodes) {
+      visitNode(node);
+    }
+  }
+
+  /// Update the [CapturedScope] object corresponding to
+  /// this node if any variables are captured.
+  void attachCapturedScopeVariables(ir.TreeNode node) {
+    Set<ir.VariableDeclaration> capturedVariablesForScope =
+        new Set<ir.VariableDeclaration>();
+
+    for (ir.Node variable in _scopeVariables) {
+      // No need to box non-assignable elements.
+      if (variable is ir.VariableDeclaration) {
+        if (variable.isFinal || variable.isConst) continue;
+        if (!_mutatedVariables.contains(variable)) continue;
+        if (_capturedVariables.contains(variable)) {
+          capturedVariablesForScope.add(variable);
+        }
+      }
+    }
+    if (!capturedVariablesForScope.isEmpty) {
+      assert(_model.scopeInfo != null);
+      KernelScopeInfo from = _model.scopeInfo;
+
+      KernelCapturedScope capturedScope;
+      var nodeBox = new NodeBox(getBoxName(), _executableContext);
+      if (node is ir.ForStatement ||
+          node is ir.ForInStatement ||
+          node is ir.WhileStatement ||
+          node is ir.DoStatement) {
+        capturedScope = new KernelCapturedLoopScope(
+            capturedVariablesForScope,
+            nodeBox,
+            [],
+            from.localsUsedInTryOrSync,
+            from.freeVariables,
+            from.freeVariablesForRti,
+            from.thisUsedAsFreeVariable,
+            from.thisUsedAsFreeVariableIfNeedsRti,
+            _hasThisLocal);
+      } else {
+        capturedScope = new KernelCapturedScope(
+            capturedVariablesForScope,
+            nodeBox,
+            from.localsUsedInTryOrSync,
+            from.freeVariables,
+            from.freeVariablesForRti,
+            from.thisUsedAsFreeVariable,
+            from.thisUsedAsFreeVariableIfNeedsRti,
+            _hasThisLocal);
+      }
+      _model.scopeInfo = _scopesCapturedInClosureMap[node] = capturedScope;
+    }
+  }
+
+  /// Generate a unique name for the [_boxCounter]th box field.
+  ///
+  /// The result is used as the name of [NodeBox]s and [BoxLocal]s, and must
+  /// therefore be unique to avoid breaking an invariant in the element model
+  /// (classes cannot declare multiple fields with the same name).
+  ///
+  /// Also, the names should be distinct from real field names to prevent
+  /// clashes with selectors for those fields.
+  ///
+  /// These names are not used in generated code, just as element name.
+  String getBoxName() {
+    return "_box_${_boxCounter++}";
+  }
+
+  /// Perform book-keeping with the current set of local variables that have
+  /// been seen thus far before entering this new scope.
+  void enterNewScope(ir.Node node, void visitNewScope()) {
+    List<ir.Node> oldScopeVariables = _scopeVariables;
+    _scopeVariables = <ir.Node>[];
+    visitNewScope();
+    attachCapturedScopeVariables(node);
+    _mutatedVariables.removeAll(_scopeVariables);
+    _scopeVariables = oldScopeVariables;
+  }
+
+  @override
+  void visitNamedExpression(ir.NamedExpression node) {
+    visitNode(node.value);
+  }
+
+  @override
+  void visitTryCatch(ir.TryCatch node) {
+    bool oldInTry = _inTry;
+    _inTry = true;
+    visitInVariableScope(node, () {
+      visitNode(node.body);
+    });
+    visitNodes(node.catches);
+    _inTry = oldInTry;
+  }
+
+  @override
+  void visitTryFinally(ir.TryFinally node) {
+    bool oldInTry = _inTry;
+    _inTry = true;
+    visitInVariableScope(node, () {
+      visitNode(node.body);
+    });
+    visitNode(node.finalizer);
+    _inTry = oldInTry;
+  }
+
+  @override
+  void visitVariableGet(ir.VariableGet node) {
+    _markVariableAsUsed(node.variable, VariableUse.explicit);
+    // Don't visit `node.promotedType`.
+  }
+
+  @override
+  void visitVariableSet(ir.VariableSet node) {
+    _mutatedVariables.add(node.variable);
+    _markVariableAsUsed(node.variable, VariableUse.explicit);
+    visitInContext(node.variable.type, VariableUse.localType);
+    visitNode(node.value);
+    registerAssignedVariable(node.variable);
+  }
+
+  void _handleVariableDeclaration(
+      ir.VariableDeclaration node, VariableUse usage) {
+    if (!node.isFieldFormal) {
+      _scopeVariables.add(node);
+    }
+
+    visitInContext(node.type, usage);
+    visitNode(node.initializer);
+  }
+
+  @override
+  void visitVariableDeclaration(ir.VariableDeclaration node) {
+    _handleVariableDeclaration(node, VariableUse.localType);
+  }
+
+  /// Add this variable to the set of free variables if appropriate and add to
+  /// the tally of variables used in try or sync blocks.
+  /// If [onlyForRtiChecks] is true, add to the freeVariablesForRti set instead
+  /// of freeVariables as we will only use it if runtime type information is
+  /// checked.
+  void _markVariableAsUsed(
+      ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ variable,
+      VariableUse usage) {
+    assert(variable is ir.VariableDeclaration ||
+        variable is TypeVariableTypeWithContext);
+    assert(usage != null);
+    if (_isInsideClosure && !_inCurrentContext(variable)) {
+      // If the element is not declared in the current function and the element
+      // is not the closure itself we need to mark the element as free variable.
+      // Note that the check on [insideClosure] is not just an
+      // optimization: factories have type parameters as function
+      // parameters, and type parameters are declared in the class, not
+      // the factory.
+      if (usage == VariableUse.explicit) {
+        _currentScopeInfo.freeVariables.add(variable);
+      } else {
+        _currentScopeInfo.freeVariablesForRti
+            .putIfAbsent(variable, () => new Set<VariableUse>())
+            .add(usage);
+      }
+    }
+    if (_inTry && variable is ir.VariableDeclaration) {
+      _currentScopeInfo.localsUsedInTryOrSync.add(variable);
+    }
+  }
+
+  @override
+  void visitThisExpression(ir.ThisExpression thisExpression) {
+    if (_hasThisLocal) _registerNeedsThis(VariableUse.explicit);
+  }
+
+  @override
+  void visitTypeParameter(ir.TypeParameter typeParameter) {
+    ir.TreeNode context = _executableContext;
+    TypeVariableTypeWithContext typeVariable = new TypeVariableTypeWithContext(
+        new ir.TypeParameterType(typeParameter),
+        // If this typeParameter is part of a typedef then its parent is
+        // null because it has no context. Just pass in null for the
+        // context in that case.
+        typeParameter.parent != null ? typeParameter.parent.parent : null);
+    if (_isInsideClosure && context is ir.Procedure && context.isFactory) {
+      // This is a closure in a factory constructor.  Since there is no
+      // [:this:], we have to mark the type arguments as free variables to
+      // capture them in the closure.
+      _useTypeVariableAsLocal(typeVariable, _currentTypeUsage);
+    }
+
+    if (_executableContext is ir.Member && _executableContext is! ir.Field) {
+      // In checked mode, using a type variable in a type annotation may lead
+      // to a runtime type check that needs to access the type argument and
+      // therefore the closure needs a this-element, if it is not in a field
+      // initializer; field initializers are evaluated in a context where
+      // the type arguments are available in locals.
+
+      if (_hasThisLocal) {
+        _registerNeedsThis(_currentTypeUsage);
+      } else {
+        _useTypeVariableAsLocal(typeVariable, _currentTypeUsage);
+      }
+    }
+  }
+
+  /// Add `this` as a variable that needs to be accessed (and thus may become a
+  /// free/captured variable.
+  /// If [onlyIfNeedsRti] is true, set thisUsedAsFreeVariableIfNeedsRti to true
+  /// instead of thisUsedAsFreeVariable as we will only use `this` if runtime
+  /// type information is checked.
+  void _registerNeedsThis(VariableUse usage) {
+    if (_isInsideClosure) {
+      if (usage == VariableUse.explicit) {
+        _currentScopeInfo.thisUsedAsFreeVariable = true;
+      } else {
+        _currentScopeInfo.thisUsedAsFreeVariableIfNeedsRti.add(usage);
+      }
+    }
+  }
+
+  @override
+  void visitForInStatement(ir.ForInStatement node) {
+    // We need to set `inTry` to true if this is an async for-in because we
+    // desugar it into a try-finally in the SSA phase.
+    bool oldInTry = _inTry;
+    if (node.isAsync) {
+      _inTry = true;
+    }
+    enterNewScope(node, () {
+      visitNode(node.variable);
+      visitInVariableScope(node, () {
+        visitNode(node.iterable);
+        visitNode(node.body);
+      });
+    });
+    if (node.isAsync) {
+      _inTry = oldInTry;
+    }
+  }
+
+  void visitWhileStatement(ir.WhileStatement node) {
+    enterNewScope(node, () {
+      visitInVariableScope(node, () {
+        visitNode(node.condition);
+        visitNode(node.body);
+      });
+    });
+  }
+
+  void visitDoStatement(ir.DoStatement node) {
+    enterNewScope(node, () {
+      visitInVariableScope(node, () {
+        visitNode(node.body);
+        visitNode(node.condition);
+      });
+    });
+  }
+
+  @override
+  void visitForStatement(ir.ForStatement node) {
+    List<ir.VariableDeclaration> boxedLoopVariables =
+        <ir.VariableDeclaration>[];
+    enterNewScope(node, () {
+      // First visit initialized variables and update steps so we can easily
+      // check if a loop variable was captured in one of these subexpressions.
+      visitNodes(node.variables);
+      visitInVariableScope(node, () {
+        visitNodes(node.updates);
+      });
+
+      // Loop variables that have not been captured yet can safely be flagged as
+      // non-mutated, because no nested function can observe the mutation.
+      for (ir.VariableDeclaration variable in node.variables) {
+        if (!_capturedVariables.contains(variable)) {
+          _mutatedVariables.remove(variable);
+        }
+      }
+
+      // Visit condition and body.
+      // This must happen after the above, so any loop variables mutated in the
+      // condition or body are indeed flagged as mutated.
+      visitInVariableScope(node, () {
+        visitNode(node.condition);
+        visitNode(node.body);
+      });
+
+      // See if we have declared loop variables that need to be boxed.
+      for (ir.VariableDeclaration variable in node.variables) {
+        // Non-mutated variables should not be boxed.  The _mutatedVariables set
+        // gets cleared when `enterNewScope` returns, so check it here.
+        if (_capturedVariables.contains(variable) &&
+            _mutatedVariables.contains(variable)) {
+          boxedLoopVariables.add(variable);
+        }
+      }
+    });
+    KernelCapturedScope scope = _scopesCapturedInClosureMap[node];
+    if (scope == null) return;
+    _scopesCapturedInClosureMap[node] = new KernelCapturedLoopScope(
+        scope.boxedVariables,
+        scope.capturedVariablesAccessor,
+        boxedLoopVariables,
+        scope.localsUsedInTryOrSync,
+        scope.freeVariables,
+        scope.freeVariablesForRti,
+        scope.thisUsedAsFreeVariable,
+        scope.thisUsedAsFreeVariableIfNeedsRti,
+        scope.hasThisLocal);
+  }
+
+  void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
+    if (_hasThisLocal) {
+      _registerNeedsThis(VariableUse.explicit);
+    }
+    if (node.arguments.types.isNotEmpty) {
+      visitNodesInContext(node.arguments.types,
+          new VariableUse.staticTypeArgument(node.interfaceTarget));
+    }
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+  }
+
+  void visitSuperPropertySet(ir.SuperPropertySet node) {
+    if (_hasThisLocal) {
+      _registerNeedsThis(VariableUse.explicit);
+    }
+    visitNode(node.value);
+  }
+
+  void visitSuperPropertyGet(ir.SuperPropertyGet node) {
+    if (_hasThisLocal) {
+      _registerNeedsThis(VariableUse.explicit);
+    }
+  }
+
+  void visitInvokable(ir.TreeNode node, void f()) {
+    assert(node is ir.Member ||
+        node is ir.FunctionExpression ||
+        node is ir.FunctionDeclaration);
+    bool oldIsInsideClosure = _isInsideClosure;
+    ir.TreeNode oldExecutableContext = _executableContext;
+    KernelScopeInfo oldScopeInfo = _currentScopeInfo;
+
+    // _outermostNode is only null the first time we enter the body of the
+    // field, constructor, or method that is being analyzed.
+    _isInsideClosure = _outermostNode != null;
+    _executableContext = node;
+
+    _currentScopeInfo = new KernelScopeInfo(_hasThisLocal);
+
+    if (_isInsideClosure) {
+      _closuresToGenerate[node] = _currentScopeInfo;
+    } else {
+      _outermostNode = node;
+      _model.scopeInfo = _currentScopeInfo;
+    }
+
+    enterNewScope(node, f);
+
+    KernelScopeInfo savedScopeInfo = _currentScopeInfo;
+    bool savedIsInsideClosure = _isInsideClosure;
+
+    // Restore old values.
+    _isInsideClosure = oldIsInsideClosure;
+    _currentScopeInfo = oldScopeInfo;
+    _executableContext = oldExecutableContext;
+
+    // Mark all free variables as captured and expect to encounter them in the
+    // outer function.
+    Iterable<ir.Node> freeVariables = savedScopeInfo.freeVariables;
+    assert(freeVariables.isEmpty || savedIsInsideClosure);
+    for (ir.Node freeVariable in freeVariables) {
+      _capturedVariables.add(freeVariable);
+      _markVariableAsUsed(freeVariable, VariableUse.explicit);
+    }
+    savedScopeInfo.freeVariablesForRti.forEach(
+        (TypeVariableTypeWithContext freeVariableForRti,
+            Set<VariableUse> useSet) {
+      for (VariableUse usage in useSet) {
+        _markVariableAsUsed(freeVariableForRti, usage);
+      }
+    });
+    if (_isInsideClosure && savedScopeInfo.thisUsedAsFreeVariable) {
+      _currentScopeInfo.thisUsedAsFreeVariable = true;
+    }
+    if (_isInsideClosure) {
+      _currentScopeInfo.thisUsedAsFreeVariableIfNeedsRti
+          .addAll(savedScopeInfo.thisUsedAsFreeVariableIfNeedsRti);
+    }
+  }
+
+  /// Return true if [variable]'s context is the same as the current executable
+  /// context.
+  bool _inCurrentContext(ir.Node variable) {
+    assert(variable is ir.VariableDeclaration ||
+        variable is TypeVariableTypeWithContext);
+    if (variable is TypeVariableTypeWithContext) {
+      return variable.context == _executableContext;
+    }
+    ir.TreeNode node = variable;
+    while (node != _outermostNode && node != _executableContext) {
+      node = node.parent;
+    }
+    return node == _executableContext;
+  }
+
+  @override
+  void visitField(ir.Field node) {
+    _currentTypeUsage = VariableUse.fieldType;
+    visitInvokable(node, () {
+      visitNode(node.initializer);
+    });
+    _currentTypeUsage = null;
+  }
+
+  @override
+  void visitConstructor(ir.Constructor node) {
+    visitInvokable(node, () {
+      visitNodes(node.initializers);
+      visitNode(node.function);
+    });
+  }
+
+  @override
+  void visitProcedure(ir.Procedure node) {
+    visitInvokable(node, () {
+      visitNode(node.function);
+    });
+  }
+
+  @override
+  void visitFunctionExpression(ir.FunctionExpression node) {
+    visitInvokable(node, () {
+      visitInVariableScope(node, () {
+        visitNode(node.function);
+      });
+    });
+  }
+
+  @override
+  void visitFunctionDeclaration(ir.FunctionDeclaration node) {
+    visitInvokable(node, () {
+      visitInVariableScope(node, () {
+        visitNode(node.function);
+      });
+    });
+  }
+
+  @override
+  void visitDynamicType(ir.DynamicType node) {}
+
+  @override
+  void visitBottomType(ir.BottomType node) {}
+
+  @override
+  void visitInvalidType(ir.InvalidType node) {}
+
+  @override
+  void visitVoidType(ir.VoidType node) {}
+
+  @override
+  void visitInterfaceType(ir.InterfaceType node) {
+    visitNodes(node.typeArguments);
+  }
+
+  @override
+  void visitFunctionType(ir.FunctionType node) {
+    visitNode(node.returnType);
+    visitNodes(node.positionalParameters);
+    visitNodes(node.namedParameters);
+    visitNodes(node.typeParameters);
+  }
+
+  @override
+  void visitNamedType(ir.NamedType node) {
+    visitNode(node.type);
+  }
+
+  @override
+  void visitTypeParameterType(ir.TypeParameterType node) {
+    _analyzeTypeVariable(node, _currentTypeUsage);
+  }
+
+  void visitInContext(ir.Node node, VariableUse use) {
+    VariableUse oldCurrentTypeUsage = _currentTypeUsage;
+    _currentTypeUsage = use;
+    visitNode(node);
+    _currentTypeUsage = oldCurrentTypeUsage;
+  }
+
+  void visitNodesInContext(List<ir.Node> nodes, VariableUse use) {
+    VariableUse oldCurrentTypeUsage = _currentTypeUsage;
+    _currentTypeUsage = use;
+    visitNodes(nodes);
+    _currentTypeUsage = oldCurrentTypeUsage;
+  }
+
+  @override
+  void visitTypeLiteral(ir.TypeLiteral node) {
+    visitInContext(node.type, VariableUse.explicit);
+  }
+
+  @override
+  void visitIsExpression(ir.IsExpression node) {
+    visitNode(node.operand);
+    visitInContext(node.type, VariableUse.explicit);
+  }
+
+  @override
+  void visitAsExpression(ir.AsExpression node) {
+    visitNode(node.operand);
+    visitInContext(node.type,
+        node.isTypeError ? VariableUse.implicitCast : VariableUse.explicit);
+  }
+
+  @override
+  void visitAwaitExpression(ir.AwaitExpression node) {
+    visitNode(node.operand);
+  }
+
+  @override
+  void visitYieldStatement(ir.YieldStatement node) {
+    visitNode(node.expression);
+  }
+
+  @override
+  void visitLoadLibrary(ir.LoadLibrary node) {}
+
+  @override
+  void visitCheckLibraryIsLoaded(ir.CheckLibraryIsLoaded node) {}
+
+  @override
+  void visitFunctionNode(ir.FunctionNode node) {
+    VariableUse parameterUsage = node.parent is ir.Member
+        ? new VariableUse.memberParameter(node.parent)
+        : new VariableUse.localParameter(node.parent);
+    visitNodesInContext(node.typeParameters, parameterUsage);
+    for (ir.VariableDeclaration declaration in node.positionalParameters) {
+      _handleVariableDeclaration(declaration, parameterUsage);
+    }
+    for (ir.VariableDeclaration declaration in node.namedParameters) {
+      _handleVariableDeclaration(declaration, parameterUsage);
+    }
+    visitInContext(
+        node.returnType,
+        node.parent is ir.Member
+            ? new VariableUse.memberReturnType(node.parent)
+            : new VariableUse.localReturnType(node.parent));
+    visitNode(node.body);
+  }
+
+  @override
+  void visitListLiteral(ir.ListLiteral node) {
+    visitInContext(node.typeArgument, VariableUse.listLiteral);
+    visitNodes(node.expressions);
+  }
+
+  @override
+  void visitMapLiteral(ir.MapLiteral node) {
+    visitInContext(node.keyType, VariableUse.mapLiteral);
+    visitInContext(node.valueType, VariableUse.mapLiteral);
+    visitNodes(node.entries);
+  }
+
+  @override
+  void visitMapEntry(ir.MapEntry node) {
+    visitNode(node.key);
+    visitNode(node.value);
+  }
+
+  @override
+  void visitNullLiteral(ir.NullLiteral node) {}
+
+  @override
+  void visitStringLiteral(ir.StringLiteral node) {}
+  @override
+  void visitIntLiteral(ir.IntLiteral node) {}
+
+  @override
+  void visitDoubleLiteral(ir.DoubleLiteral node) {}
+
+  @override
+  void visitSymbolLiteral(ir.SymbolLiteral node) {}
+
+  @override
+  void visitBoolLiteral(ir.BoolLiteral node) {}
+
+  @override
+  void visitStringConcatenation(ir.StringConcatenation node) {
+    visitNodes(node.expressions);
+  }
+
+  @override
+  void visitStaticGet(ir.StaticGet node) {}
+
+  @override
+  void visitStaticSet(ir.StaticSet node) {
+    visitNode(node.value);
+  }
+
+  @override
+  void visitStaticInvocation(ir.StaticInvocation node) {
+    if (node.arguments.types.isNotEmpty) {
+      VariableUse usage;
+      if (node.target.kind == ir.ProcedureKind.Factory) {
+        usage = new VariableUse.constructorTypeArgument(node.target);
+      } else {
+        usage = new VariableUse.staticTypeArgument(node.target);
+      }
+
+      visitNodesInContext(node.arguments.types, usage);
+    }
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+  }
+
+  @override
+  void visitConstructorInvocation(ir.ConstructorInvocation node) {
+    if (node.arguments.types.isNotEmpty) {
+      visitNodesInContext(node.arguments.types,
+          new VariableUse.constructorTypeArgument(node.target));
+    }
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+  }
+
+  @override
+  void visitConditionalExpression(ir.ConditionalExpression node) {
+    visitNode(node.condition);
+    visitNode(node.then);
+    visitNode(node.otherwise);
+    // Don't visit `node.staticType`.
+  }
+
+  @override
+  void visitMethodInvocation(ir.MethodInvocation node) {
+    ir.TreeNode receiver = node.receiver;
+    visitNode(receiver);
+    if (node.arguments.types.isNotEmpty) {
+      VariableUse usage;
+      if (receiver is ir.VariableGet &&
+          (receiver.variable.parent is ir.FunctionDeclaration ||
+              receiver.variable.parent is ir.FunctionExpression)) {
+        usage =
+            new VariableUse.localTypeArgument(receiver.variable.parent, node);
+      } else {
+        usage = new VariableUse.instanceTypeArgument(node);
+      }
+      visitNodesInContext(node.arguments.types, usage);
+    }
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+  }
+
+  @override
+  void visitPropertyGet(ir.PropertyGet node) {
+    visitNode(node.receiver);
+  }
+
+  @override
+  void visitPropertySet(ir.PropertySet node) {
+    visitNode(node.receiver);
+    visitNode(node.value);
+  }
+
+  @override
+  void visitDirectPropertyGet(ir.DirectPropertyGet node) {
+    visitNode(node.receiver);
+  }
+
+  @override
+  void visitDirectPropertySet(ir.DirectPropertySet node) {
+    visitNode(node.receiver);
+    visitNode(node.value);
+  }
+
+  @override
+  void visitNot(ir.Not node) {
+    visitNode(node.operand);
+  }
+
+  @override
+  void visitLogicalExpression(ir.LogicalExpression node) {
+    visitNode(node.left);
+    visitNode(node.right);
+  }
+
+  @override
+  void visitLet(ir.Let node) {
+    visitNode(node.variable);
+    visitNode(node.body);
+  }
+
+  @override
+  void visitCatch(ir.Catch node) {
+    visitInContext(node.guard, VariableUse.explicit);
+    visitNode(node.exception);
+    visitNode(node.stackTrace);
+    visitInVariableScope(node, () {
+      visitNode(node.body);
+    });
+  }
+
+  @override
+  void visitInstantiation(ir.Instantiation node) {
+    visitNodesInContext(
+        node.typeArguments, new VariableUse.instantiationTypeArgument(node));
+    visitNode(node.expression);
+  }
+
+  @override
+  void visitThrow(ir.Throw node) {
+    visitNode(node.expression);
+  }
+
+  @override
+  void visitRethrow(ir.Rethrow node) {}
+
+  @override
+  void visitBlock(ir.Block node) {
+    visitNodes(node.statements);
+  }
+
+  @override
+  void visitAssertStatement(ir.AssertStatement node) {
+    visitInVariableScope(node, () {
+      visitNode(node.condition);
+      visitNode(node.message);
+    });
+  }
+
+  @override
+  void visitReturnStatement(ir.ReturnStatement node) {
+    visitNode(node.expression);
+  }
+
+  @override
+  void visitEmptyStatement(ir.EmptyStatement node) {}
+
+  @override
+  void visitExpressionStatement(ir.ExpressionStatement node) {
+    visitNode(node.expression);
+  }
+
+  @override
+  void visitSwitchStatement(ir.SwitchStatement node) {
+    visitNode(node.expression);
+    visitInVariableScope(node, () {
+      visitNodes(node.cases);
+    });
+  }
+
+  @override
+  void visitSwitchCase(ir.SwitchCase node) {
+    visitNode(node.body);
+  }
+
+  @override
+  void visitContinueSwitchStatement(ir.ContinueSwitchStatement node) {
+    registerContinueSwitch();
+  }
+
+  @override
+  void visitBreakStatement(ir.BreakStatement node) {}
+
+  @override
+  void visitLabeledStatement(ir.LabeledStatement node) {
+    visitNode(node.body);
+  }
+
+  @override
+  void visitFieldInitializer(ir.FieldInitializer node) {
+    visitNode(node.value);
+  }
+
+  @override
+  void visitLocalInitializer(ir.LocalInitializer node) {
+    visitNode(node.variable.initializer);
+  }
+
+  @override
+  void visitSuperInitializer(ir.SuperInitializer node) {
+    if (node.arguments.types.isNotEmpty) {
+      visitNodesInContext(node.arguments.types,
+          new VariableUse.constructorTypeArgument(node.target));
+    }
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+  }
+
+  @override
+  void visitRedirectingInitializer(ir.RedirectingInitializer node) {
+    if (node.arguments.types.isNotEmpty) {
+      visitNodesInContext(node.arguments.types,
+          new VariableUse.constructorTypeArgument(node.target));
+    }
+    visitNodes(node.arguments.positional);
+    visitNodes(node.arguments.named);
+  }
+
+  @override
+  void visitAssertInitializer(ir.AssertInitializer node) {
+    visitNode(node.statement);
+  }
+
+  @override
+  void visitIfStatement(ir.IfStatement node) {
+    visitNode(node.condition);
+    visitNode(node.then);
+    visitNode(node.otherwise);
+  }
+
+  /// Returns true if the node is a field, or a constructor (factory or
+  /// generative).
+  bool _isFieldOrConstructor(ir.Node node) =>
+      node is ir.Constructor ||
+      node is ir.Field ||
+      (node is ir.Procedure && node.isFactory);
+
+  void _analyzeTypeVariable(ir.TypeParameterType type, VariableUse usage) {
+    assert(usage != null);
+    if (_outermostNode is ir.Member) {
+      TypeVariableTypeWithContext typeVariable =
+          new TypeVariableTypeWithContext(type, _outermostNode);
+      switch (typeVariable.kind) {
+        case TypeVariableKind.cls:
+          if (_isFieldOrConstructor(_outermostNode)) {
+            // Class type variable used in a field or constructor.
+            _useTypeVariableAsLocal(typeVariable, usage);
+          } else {
+            // Class type variable used in a method.
+            _registerNeedsThis(usage);
+          }
+          break;
+        case TypeVariableKind.method:
+        case TypeVariableKind.local:
+          _useTypeVariableAsLocal(typeVariable, usage);
+          break;
+        case TypeVariableKind.function:
+        // The type variable is a function type variable, like `T` in
+        //
+        //     List<void Function<T>(T)> list;
+        //
+        // which doesn't correspond to a captured local variable.
+      }
+    }
+  }
+
+  /// If [onlyForRtiChecks] is true, the variable will be added to a list
+  /// indicating it *may* be used only if runtime type information is checked.
+  void _useTypeVariableAsLocal(
+      TypeVariableTypeWithContext typeVariable, VariableUse usage) {
+    _markVariableAsUsed(typeVariable, usage);
+  }
+}
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index ce1bd2f..9ddc390 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -7,21 +7,138 @@
 import 'package:kernel/core_types.dart' as ir;
 import 'package:kernel/type_algebra.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
+import '../common/names.dart';
+import '../util/util.dart';
+import 'runtime_type_analysis.dart';
+import 'scope.dart';
+import 'static_type_base.dart';
 
-/// Visitor that computes the static type of an expression.
+/// Enum values for how the target of a static type should be interpreted.
+enum ClassRelation {
+  /// The target is any subtype of the static type.
+  subtype,
+
+  /// The target is a subclass or mixin application of the static type.
+  ///
+  /// This corresponds to accessing a member through a this expression.
+  thisExpression,
+
+  /// The target is an exact instance of the static type.
+  exact,
+}
+
+/// Visitor that computes and caches the static type of expression while
+/// visiting the full tree at expression level.
 ///
-/// This visitor doesn't traverse subtrees that are not needed for computing
-/// the static type.
-// TODO(johnniwinther): Add improved type promotion to handle negative
-// reasoning.
-abstract class StaticTypeVisitor extends ir.Visitor<ir.DartType> {
-  ir.TypeEnvironment _typeEnvironment;
+/// To ensure that the traversal only visits and computes the expression type
+/// for each expression once, this class performs the traversal explicitly and
+/// adds 'handleX' hooks for subclasses to handle individual expressions using
+/// the readily compute static types of subexpressions.
+abstract class StaticTypeVisitor extends StaticTypeBase {
+  Map<ir.Expression, ir.DartType> _cache = {};
+  Map<ir.Expression, TypeMap> typeMapsForTesting;
+  Map<ir.PropertyGet, RuntimeTypeUseData> _pendingRuntimeTypeUseData = {};
 
-  StaticTypeVisitor(this._typeEnvironment);
+  final ir.ClassHierarchy hierarchy;
 
-  fail(String message) => message;
+  ThisInterfaceType _thisType;
 
-  ir.TypeEnvironment get typeEnvironment => _typeEnvironment;
+  StaticTypeVisitor(ir.TypeEnvironment typeEnvironment, this.hierarchy)
+      : super(typeEnvironment);
+
+  Map<ir.Expression, ir.DartType> get cachedStaticTypes => _cache;
+
+  /// If `true`, the effect of executing assert statements is taken into account
+  /// when computing the static type.
+  bool get useAsserts;
+
+  /// If `true`, the static type of an effectively final variable is inferred
+  /// from the static type of its initializer.
+  bool get inferEffectivelyFinalVariableTypes;
+
+  VariableScopeModel get variableScopeModel;
+
+  ThisInterfaceType get thisType {
+    assert(_thisType != null);
+    return _thisType;
+  }
+
+  void set thisType(ThisInterfaceType value) {
+    assert(value == null || _thisType == null);
+    _thisType = value;
+  }
+
+  bool completes(ir.DartType type) => type != const DoesNotCompleteType();
+
+  Set<ir.VariableDeclaration> _currentVariables;
+  Set<ir.VariableDeclaration> _invalidatedVariables =
+      new Set<ir.VariableDeclaration>();
+
+  TypeMap _typeMapBase = const TypeMap();
+  TypeMap _typeMapWhenTrue;
+  TypeMap _typeMapWhenFalse;
+
+  /// Returns the local variable type promotions for when the boolean value of
+  /// the most recent node is not taken into account.
+  TypeMap get typeMap {
+    if (_typeMapBase == null) {
+      _typeMapBase = _typeMapWhenTrue.join(_typeMapWhenFalse);
+      _typeMapWhenTrue = _typeMapWhenFalse = null;
+    }
+    return _typeMapBase;
+  }
+
+  /// Sets the local variable type promotions for when the boolean value of
+  /// the most recent node is not taken into account.
+  void set typeMap(TypeMap value) {
+    _typeMapBase = value;
+    _typeMapWhenTrue = _typeMapWhenFalse = null;
+  }
+
+  /// Returns the local variable type promotions for when the boolean value of
+  /// the most recent node is `true`.
+  TypeMap get typeMapWhenTrue => _typeMapWhenTrue ?? _typeMapBase;
+
+  /// Sets the local variable type promotions for when the boolean value of
+  /// the most recent node is `true`.
+  void set typeMapWhenTrue(TypeMap value) {
+    _typeMapWhenTrue = value;
+    _typeMapBase = null;
+  }
+
+  /// Returns the local variable type promotions for when the boolean value of
+  /// the most recent node is `false`.
+  TypeMap get typeMapWhenFalse => _typeMapWhenFalse ?? _typeMapBase;
+
+  /// Sets the local variable type promotions for when the boolean value of
+  /// the most recent node is `false`.
+  void set typeMapWhenFalse(TypeMap value) {
+    _typeMapWhenFalse = value;
+    _typeMapBase = null;
+  }
+
+  @override
+  ir.DartType defaultNode(ir.Node node) =>
+      throw UnsupportedError('Unhandled node $node (${node.runtimeType})');
+
+  @override
+  Null visitComponent(ir.Component node) {
+    visitNodes(node.libraries);
+  }
+
+  @override
+  Null visitLibrary(ir.Library node) {
+    visitNodes(node.classes);
+    visitNodes(node.procedures);
+    visitNodes(node.fields);
+  }
+
+  @override
+  Null visitClass(ir.Class node) {
+    visitNodes(node.constructors);
+    visitNodes(node.procedures);
+    visitNodes(node.fields);
+  }
 
   /// Returns the static type of the expression as an instantiation of
   /// [superclass].
@@ -48,7 +165,7 @@
     }
     if (type is ir.InterfaceType) {
       ir.InterfaceType upcastType =
-          typeEnvironment.hierarchy.getTypeAsInstanceOf(type, superclass);
+          typeEnvironment.getTypeAsInstanceOf(type, superclass);
       if (upcastType != null) return upcastType;
     } else if (type is ir.BottomType) {
       return superclass.bottomType;
@@ -56,92 +173,18 @@
     return superclass.rawType;
   }
 
-  @override
-  ir.DartType defaultNode(ir.Node node) {
-    return null;
-  }
-
-  ir.DartType visitNode(ir.Node node) {
-    return node?.accept(this);
-  }
-
-  Null visitNodes(List<ir.Node> nodes) {
-    for (ir.Node node in nodes) {
-      visitNode(node);
-    }
-  }
-
-  ir.DartType defaultExpression(ir.Expression node) {
-    throw fail('Unhandled node $node (${node.runtimeType})');
-  }
-
-  @override
-  ir.DartType visitAsExpression(ir.AsExpression node) {
-    return node.type;
-  }
-
-  @override
-  ir.DartType visitAwaitExpression(ir.AwaitExpression node) {
-    return typeEnvironment.unfutureType(visitNode(node.operand));
-  }
-
-  @override
-  ir.DartType visitBoolLiteral(ir.BoolLiteral node) => typeEnvironment.boolType;
-
-  @override
-  ir.DartType visitCheckLibraryIsLoaded(ir.CheckLibraryIsLoaded node) =>
-      typeEnvironment.objectType;
-
-  @override
-  ir.DartType visitStringLiteral(ir.StringLiteral node) =>
-      typeEnvironment.stringType;
-
-  @override
-  ir.DartType visitStringConcatenation(ir.StringConcatenation node) {
-    return typeEnvironment.stringType;
-  }
-
-  @override
-  ir.DartType visitNullLiteral(ir.NullLiteral node) => const ir.BottomType();
-
-  @override
-  ir.DartType visitIntLiteral(ir.IntLiteral node) => typeEnvironment.intType;
-
-  @override
-  ir.DartType visitDoubleLiteral(ir.DoubleLiteral node) =>
-      typeEnvironment.doubleType;
-
-  @override
-  ir.DartType visitSymbolLiteral(ir.SymbolLiteral node) =>
-      typeEnvironment.symbolType;
-
-  @override
-  ir.DartType visitListLiteral(ir.ListLiteral node) {
-    return typeEnvironment.literalListType(node.typeArgument);
-  }
-
-  @override
-  ir.DartType visitMapLiteral(ir.MapLiteral node) {
-    return typeEnvironment.literalMapType(node.keyType, node.valueType);
-  }
-
-  @override
-  ir.DartType visitVariableGet(ir.VariableGet node) =>
-      node.promotedType ?? node.variable.type;
-
-  @override
-  ir.DartType visitVariableSet(ir.VariableSet node) {
-    return visitNode(node.value);
-  }
-
   /// Computes the result type of the property access [node] on a receiver of
   /// type [receiverType].
   ///
   /// If the `node.interfaceTarget` is `null` but matches an `Object` member
   /// it is updated to target this member.
-  ir.DartType computePropertyGetType(
+  ir.DartType _computePropertyGetType(
       ir.PropertyGet node, ir.DartType receiverType) {
     ir.Member interfaceTarget = node.interfaceTarget;
+    if (interfaceTarget == null && receiverType is ir.InterfaceType) {
+      interfaceTarget = node.interfaceTarget =
+          hierarchy.getInterfaceMember(receiverType.classNode, node.name);
+    }
     if (interfaceTarget != null) {
       ir.Class superclass = interfaceTarget.enclosingClass;
       receiverType = getTypeAsInstanceOf(receiverType, superclass);
@@ -158,52 +201,118 @@
     return const ir.DynamicType();
   }
 
+  void handlePropertyGet(
+      ir.PropertyGet node, ir.DartType receiverType, ir.DartType resultType) {}
+
+  void handleRuntimeTypeUse(ir.PropertyGet node, RuntimeTypeUseKind kind,
+      ir.DartType receiverType, ir.DartType argumentType) {}
+
   @override
   ir.DartType visitPropertyGet(ir.PropertyGet node) {
     ir.DartType receiverType = visitNode(node.receiver);
-    return computePropertyGetType(node, receiverType);
+    ir.DartType resultType =
+        _cache[node] = _computePropertyGetType(node, receiverType);
+    receiverType = _narrowInstanceReceiver(node.interfaceTarget, receiverType);
+    handlePropertyGet(node, receiverType, resultType);
+    if (node.name.name == Identifiers.runtimeType_) {
+      RuntimeTypeUseData data =
+          computeRuntimeTypeUse(_pendingRuntimeTypeUseData, node);
+      if (data.leftRuntimeTypeExpression == node) {
+        // [node] is the left (or single) occurrence of `.runtimeType` so we
+        // can set the static type of the receiver expression.
+        data.receiverType = receiverType;
+      } else {
+        // [node] is the right occurrence of `.runtimeType` so we
+        // can set the static type of the argument expression.
+        assert(data.rightRuntimeTypeExpression == node,
+            "Unexpected RuntimeTypeUseData for $node: $data");
+        data.argumentType = receiverType;
+      }
+      if (data.isComplete) {
+        /// We now have all need static types so we can remove the data from
+        /// the cache and handle the runtime type use.
+        _pendingRuntimeTypeUseData.remove(data.leftRuntimeTypeExpression);
+        if (data.rightRuntimeTypeExpression != null) {
+          _pendingRuntimeTypeUseData.remove(data.rightRuntimeTypeExpression);
+        }
+        handleRuntimeTypeUse(
+            node, data.kind, data.receiverType, data.argumentType);
+      }
+    }
+    return resultType;
   }
 
+  void handlePropertySet(
+      ir.PropertySet node, ir.DartType receiverType, ir.DartType valueType) {}
+
   @override
   ir.DartType visitPropertySet(ir.PropertySet node) {
-    return visitNode(node.value);
+    ir.DartType receiverType = visitNode(node.receiver);
+    ir.DartType valueType = super.visitPropertySet(node);
+    if (node.interfaceTarget == null && receiverType is ir.InterfaceType) {
+      node.interfaceTarget = hierarchy
+          .getInterfaceMember(receiverType.classNode, node.name, setter: true);
+    }
+    receiverType = _narrowInstanceReceiver(node.interfaceTarget, receiverType);
+    handlePropertySet(node, receiverType, valueType);
+    return valueType;
   }
 
+  void handleDirectPropertyGet(ir.DirectPropertyGet node,
+      ir.DartType receiverType, ir.DartType resultType) {}
+
   @override
   ir.DartType visitDirectPropertyGet(ir.DirectPropertyGet node) {
     ir.DartType receiverType = visitNode(node.receiver);
     ir.Class superclass = node.target.enclosingClass;
     receiverType = getTypeAsInstanceOf(receiverType, superclass);
-    return ir.Substitution.fromInterfaceType(receiverType)
+    ir.DartType resultType = ir.Substitution.fromInterfaceType(receiverType)
         .substituteType(node.target.getterType);
+    _cache[node] = resultType;
+    handleDirectPropertyGet(node, receiverType, resultType);
+    return resultType;
   }
 
+  void handleDirectMethodInvocation(
+      ir.DirectMethodInvocation node,
+      ir.DartType receiverType,
+      ArgumentTypes argumentTypes,
+      ir.DartType returnType) {}
+
   @override
   ir.DartType visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
     ir.DartType receiverType = visitNode(node.receiver);
+    ArgumentTypes argumentTypes = _visitArguments(node.arguments);
+    ir.DartType returnType;
     if (typeEnvironment.isOverloadedArithmeticOperator(node.target)) {
-      ir.DartType argumentType = visitNode(node.arguments.positional[0]);
-      return typeEnvironment.getTypeOfOverloadedArithmetic(
+      ir.DartType argumentType = argumentTypes.positional[0];
+      returnType = typeEnvironment.getTypeOfOverloadedArithmetic(
           receiverType, argumentType);
+    } else {
+      ir.Class superclass = node.target.enclosingClass;
+      receiverType = getTypeAsInstanceOf(receiverType, superclass);
+      ir.DartType returnType = ir.Substitution.fromInterfaceType(receiverType)
+          .substituteType(node.target.function.returnType);
+      returnType = ir.Substitution.fromPairs(
+              node.target.function.typeParameters, node.arguments.types)
+          .substituteType(returnType);
     }
-    ir.Class superclass = node.target.enclosingClass;
-    receiverType = getTypeAsInstanceOf(receiverType, superclass);
-    ir.DartType returnType = ir.Substitution.fromInterfaceType(receiverType)
-        .substituteType(node.target.function.returnType);
-    return ir.Substitution.fromPairs(
-            node.target.function.typeParameters, node.arguments.types)
-        .substituteType(returnType);
+    _cache[node] = returnType;
+    handleDirectMethodInvocation(node, receiverType, argumentTypes, returnType);
+    return returnType;
   }
 
+  void handleDirectPropertySet(ir.DirectPropertySet node,
+      ir.DartType receiverType, ir.DartType valueType) {}
+
   @override
   ir.DartType visitDirectPropertySet(ir.DirectPropertySet node) {
-    return visitNode(node.value);
+    ir.DartType receiverType = visitNode(node.receiver);
+    ir.DartType valueType = super.visitDirectPropertySet(node);
+    handleDirectPropertySet(node, receiverType, valueType);
+    return valueType;
   }
 
-  @override
-  ir.DartType visitThisExpression(ir.ThisExpression node) =>
-      typeEnvironment.thisType;
-
   /// Returns `true` if [interfaceTarget] is an arithmetic operator whose result
   /// type is computed using both the receiver type and the argument type.
   ///
@@ -229,7 +338,7 @@
   ///
   /// If [interfaceTarget] is `null` or `receiverType` is _not_ `dynamic` no
   /// narrowing is performed.
-  ir.DartType narrowInstanceReceiver(
+  ir.DartType _narrowInstanceReceiver(
       ir.Member interfaceTarget, ir.DartType receiverType) {
     if (interfaceTarget != null && receiverType == const ir.DynamicType()) {
       receiverType = interfaceTarget.enclosingClass.thisType;
@@ -237,13 +346,82 @@
     return receiverType;
   }
 
+  /// Returns `true` if [member] can be called with the structure of
+  /// [arguments].
+  bool _isApplicable(ir.Arguments arguments, ir.Member member) {
+    /// Returns `true` if [arguments] are applicable to the function type
+    /// structure.
+    bool isFunctionTypeApplicable(
+        int typeParameterCount,
+        int requiredParameterCount,
+        int positionalParameterCount,
+        Iterable<String> Function() getNamedParameters) {
+      if (arguments.types.isNotEmpty &&
+          arguments.types.length != typeParameterCount) {
+        return false;
+      }
+      if (arguments.positional.length < requiredParameterCount) {
+        return false;
+      }
+      if (arguments.positional.length > positionalParameterCount) {
+        return false;
+      }
+      Iterable<String> namedParameters = getNamedParameters();
+      if (arguments.named.length > namedParameters.length) {
+        return false;
+      }
+      if (arguments.named.isNotEmpty) {
+        for (ir.NamedExpression namedArguments in arguments.named) {
+          if (!namedParameters.contains(namedArguments.name)) {
+            return false;
+          }
+        }
+      }
+      return true;
+    }
+
+    /// Returns `true` if [arguments] are applicable to a value of the static
+    /// [type].
+    bool isTypeApplicable(ir.DartType type) {
+      if (type is ir.DynamicType) return true;
+      if (type == typeEnvironment.rawFunctionType) return true;
+      if (type is ir.FunctionType) {
+        return isFunctionTypeApplicable(
+            type.typeParameters.length,
+            type.requiredParameterCount,
+            type.positionalParameters.length,
+            () => type.namedParameters.map((p) => p.name).toSet());
+      }
+      return false;
+    }
+
+    if (member is ir.Procedure) {
+      if (member.kind == ir.ProcedureKind.Setter ||
+          member.kind == ir.ProcedureKind.Factory) {
+        return false;
+      } else if (member.kind == ir.ProcedureKind.Getter) {
+        return isTypeApplicable(member.getterType);
+      } else if (member.kind == ir.ProcedureKind.Method ||
+          member.kind == ir.ProcedureKind.Operator) {
+        return isFunctionTypeApplicable(
+            member.function.typeParameters.length,
+            member.function.requiredParameterCount,
+            member.function.positionalParameters.length,
+            () => member.function.namedParameters.map((p) => p.name).toSet());
+      }
+    } else if (member is ir.Field) {
+      return isTypeApplicable(member.type);
+    }
+    return false;
+  }
+
   /// Computes the result type of the method invocation [node] on a receiver of
   /// type [receiverType].
   ///
   /// If the `node.interfaceTarget` is `null` but matches an `Object` member
   /// it is updated to target this member.
-  ir.DartType computeMethodInvocationType(
-      ir.MethodInvocation node, ir.DartType receiverType) {
+  ir.DartType _computeMethodInvocationType(ir.MethodInvocation node,
+      ir.DartType receiverType, ArgumentTypes argumentTypes) {
     ir.Member interfaceTarget = node.interfaceTarget;
     // TODO(34602): Remove when `interfaceTarget` is set on synthetic calls to
     // ==.
@@ -254,9 +432,16 @@
         node.arguments.named.isEmpty) {
       interfaceTarget = node.interfaceTarget = objectEquals;
     }
+    if (interfaceTarget == null && receiverType is ir.InterfaceType) {
+      ir.Member member =
+          hierarchy.getInterfaceMember(receiverType.classNode, node.name);
+      if (_isApplicable(node.arguments, member)) {
+        interfaceTarget = node.interfaceTarget = member;
+      }
+    }
     if (interfaceTarget != null) {
       if (isSpecialCasedBinaryOperator(interfaceTarget)) {
-        ir.DartType argumentType = visitNode(node.arguments.positional[0]);
+        ir.DartType argumentType = argumentTypes.positional[0];
         return typeEnvironment.getTypeOfOverloadedArithmetic(
             receiverType, argumentType);
       }
@@ -265,8 +450,21 @@
       ir.DartType getterType = ir.Substitution.fromInterfaceType(receiverType)
           .substituteType(interfaceTarget.getterType);
       if (getterType is ir.FunctionType) {
+        List<ir.DartType> typeArguments = node.arguments.types;
+        if (interfaceTarget is ir.Procedure &&
+            interfaceTarget.function.typeParameters.isNotEmpty &&
+            typeArguments.isEmpty) {
+          // If this was a dynamic call the invocation does not have the
+          // inferred default type arguments so we need to create them here
+          // to perform a valid substitution.
+          ir.Substitution substitution =
+              ir.Substitution.fromInterfaceType(receiverType);
+          typeArguments = interfaceTarget.function.typeParameters
+              .map((t) => substitution.substituteType(t.defaultType))
+              .toList();
+        }
         return ir.Substitution.fromPairs(
-                getterType.typeParameters, node.arguments.types)
+                getterType.typeParameters, typeArguments)
             .substituteType(getterType.returnType);
       } else {
         return const ir.DynamicType();
@@ -275,7 +473,7 @@
     if (node.name.name == 'call') {
       if (receiverType is ir.FunctionType) {
         if (receiverType.typeParameters.length != node.arguments.types.length) {
-          return const ir.BottomType();
+          return const DoesNotCompleteType();
         }
         return ir.Substitution.fromPairs(
                 receiverType.typeParameters, node.arguments.types)
@@ -289,174 +487,340 @@
     return const ir.DynamicType();
   }
 
-  @override
-  ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
-    ir.DartType receiverType = visitNode(node.receiver);
-    return computeMethodInvocationType(node, receiverType);
+  ArgumentTypes _visitArguments(ir.Arguments arguments) {
+    List<ir.DartType> positional;
+    List<ir.DartType> named;
+    if (arguments.positional.isEmpty) {
+      positional = const <ir.DartType>[];
+    } else {
+      positional = new List<ir.DartType>(arguments.positional.length);
+      int index = 0;
+      for (ir.Expression argument in arguments.positional) {
+        positional[index++] = visitNode(argument);
+      }
+    }
+    if (arguments.named.isEmpty) {
+      named = const <ir.DartType>[];
+    } else {
+      named = new List<ir.DartType>(arguments.named.length);
+      int index = 0;
+      for (ir.NamedExpression argument in arguments.named) {
+        named[index++] = visitNode(argument);
+      }
+    }
+    return new ArgumentTypes(positional, named);
   }
 
+  void handleMethodInvocation(
+      ir.MethodInvocation node,
+      ir.DartType receiverType,
+      ArgumentTypes argumentTypes,
+      ir.DartType returnType) {}
+
   @override
-  ir.DartType visitStaticGet(ir.StaticGet node) => node.target.getterType;
+  ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
+    ArgumentTypes argumentTypes = _visitArguments(node.arguments);
+    ir.DartType receiverType = visitNode(node.receiver);
+    ir.DartType returnType =
+        _computeMethodInvocationType(node, receiverType, argumentTypes);
+    receiverType = _narrowInstanceReceiver(node.interfaceTarget, receiverType);
+    if (node.name.name == '==') {
+      ir.Expression left = node.receiver;
+      ir.Expression right = node.arguments.positional[0];
+      TypeMap afterInvocation = typeMap;
+      if (left is ir.VariableGet &&
+          right is ir.NullLiteral &&
+          !_invalidatedVariables.contains(left.variable)) {
+        // If `left == null` is true, we promote the type of the variable to
+        // `Null` by registering that is known _not_ to be of its declared type.
+        typeMapWhenTrue = afterInvocation
+            .promote(left.variable, left.variable.type, isTrue: false);
+        typeMapWhenFalse = afterInvocation
+            .promote(left.variable, left.variable.type, isTrue: true);
+      }
+      if (right is ir.VariableGet &&
+          left is ir.NullLiteral &&
+          !_invalidatedVariables.contains(right.variable)) {
+        // If `null == right` is true, we promote the type of the variable to
+        // `Null` by registering that is known _not_ to be of its declared type.
+        typeMapWhenTrue = afterInvocation
+            .promote(right.variable, right.variable.type, isTrue: false);
+        typeMapWhenFalse = afterInvocation
+            .promote(right.variable, right.variable.type, isTrue: true);
+      }
+    }
+    _cache[node] = returnType;
+    handleMethodInvocation(node, receiverType, argumentTypes, returnType);
+    return returnType;
+  }
+
+  void handleVariableGet(ir.VariableGet node, ir.DartType type) {}
+
+  @override
+  ir.DartType visitVariableGet(ir.VariableGet node) {
+    if (typeMapsForTesting != null) {
+      typeMapsForTesting[node] = typeMap;
+    }
+    ir.DartType promotedType = typeMap.typeOf(node, typeEnvironment);
+    assert(
+        node.promotedType == null ||
+            promotedType == typeEnvironment.nullType ||
+            typeEnvironment.isSubtypeOf(promotedType, node.promotedType),
+        "Unexpected promotion of ${node.variable} in ${node.parent}. "
+        "Expected ${node.promotedType}, found $promotedType");
+    _cache[node] = promotedType;
+    handleVariableGet(node, promotedType);
+    return promotedType;
+  }
+
+  void handleVariableSet(ir.VariableSet node, ir.DartType resultType) {}
+
+  @override
+  ir.DartType visitVariableSet(ir.VariableSet node) {
+    ir.DartType resultType = super.visitVariableSet(node);
+    handleVariableSet(node, resultType);
+    if (!_currentVariables.contains(node.variable)) {
+      _invalidatedVariables.add(node.variable);
+      typeMap = typeMap.remove([node.variable]);
+    } else {
+      typeMap = typeMap.reduce(node, resultType, typeEnvironment);
+    }
+    return resultType;
+  }
+
+  void handleStaticGet(ir.StaticGet node, ir.DartType resultType) {}
+
+  @override
+  ir.DartType visitStaticGet(ir.StaticGet node) {
+    ir.DartType resultType = super.visitStaticGet(node);
+    handleStaticGet(node, resultType);
+    return resultType;
+  }
+
+  void handleStaticSet(ir.StaticSet node, ir.DartType valueType) {}
 
   @override
   ir.DartType visitStaticSet(ir.StaticSet node) {
-    return visitNode(node.value);
+    ir.DartType valueType = super.visitStaticSet(node);
+    handleStaticSet(node, valueType);
+    return valueType;
   }
 
+  void handleStaticInvocation(ir.StaticInvocation node,
+      ArgumentTypes argumentTypes, ir.DartType returnType) {}
+
   @override
   ir.DartType visitStaticInvocation(ir.StaticInvocation node) {
-    return ir.Substitution.fromPairs(
+    ArgumentTypes argumentTypes = _visitArguments(node.arguments);
+    ir.DartType returnType = ir.Substitution.fromPairs(
             node.target.function.typeParameters, node.arguments.types)
         .substituteType(node.target.function.returnType);
+    _cache[node] = returnType;
+    handleStaticInvocation(node, argumentTypes, returnType);
+    return returnType;
   }
 
+  void handleConstructorInvocation(ir.ConstructorInvocation node,
+      ArgumentTypes argumentTypes, ir.DartType resultType) {}
+
   @override
   ir.DartType visitConstructorInvocation(ir.ConstructorInvocation node) {
-    return node.arguments.types.isEmpty
-        ? node.target.enclosingClass.rawType
-        : new ir.InterfaceType(
+    ArgumentTypes argumentTypes = _visitArguments(node.arguments);
+    ir.DartType resultType = node.arguments.types.isEmpty
+        ? new ExactInterfaceType.from(node.target.enclosingClass.rawType)
+        : new ExactInterfaceType(
             node.target.enclosingClass, node.arguments.types);
+    _cache[node] = resultType;
+    handleConstructorInvocation(node, argumentTypes, resultType);
+    return resultType;
   }
 
+  void handleSuperPropertyGet(
+      ir.SuperPropertyGet node, ir.DartType resultType) {}
+
   @override
   ir.DartType visitSuperPropertyGet(ir.SuperPropertyGet node) {
+    ir.DartType resultType;
     if (node.interfaceTarget == null) {
       // TODO(johnniwinther): Resolve and set the target here.
-      return const ir.DynamicType();
+      resultType = const ir.DynamicType();
+    } else {
+      ir.Class declaringClass = node.interfaceTarget.enclosingClass;
+      if (declaringClass.typeParameters.isEmpty) {
+        resultType = node.interfaceTarget.getterType;
+      } else {
+        ir.DartType receiver =
+            typeEnvironment.getTypeAsInstanceOf(thisType, declaringClass);
+        resultType = ir.Substitution.fromInterfaceType(receiver)
+            .substituteType(node.interfaceTarget.getterType);
+      }
     }
-    ir.Class declaringClass = node.interfaceTarget.enclosingClass;
-    if (declaringClass.typeParameters.isEmpty) {
-      return node.interfaceTarget.getterType;
-    }
-    ir.DartType receiver = typeEnvironment.hierarchy
-        .getTypeAsInstanceOf(typeEnvironment.thisType, declaringClass);
-    return ir.Substitution.fromInterfaceType(receiver)
-        .substituteType(node.interfaceTarget.getterType);
+    _cache[node] = resultType;
+    handleSuperPropertyGet(node, resultType);
+    return resultType;
   }
 
+  void handleSuperPropertySet(
+      ir.SuperPropertySet node, ir.DartType valueType) {}
+
   @override
   ir.DartType visitSuperPropertySet(ir.SuperPropertySet node) {
-    return visitNode(node.value);
+    ir.DartType valueType = super.visitSuperPropertySet(node);
+    handleSuperPropertySet(node, valueType);
+    return valueType;
   }
 
+  void handleSuperMethodInvocation(ir.SuperMethodInvocation node,
+      ArgumentTypes argumentTypes, ir.DartType returnType) {}
+
   @override
   ir.DartType visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
+    ArgumentTypes argumentTypes = _visitArguments(node.arguments);
+    ir.DartType returnType;
     if (node.interfaceTarget == null) {
       // TODO(johnniwinther): Resolve and set the target here.
-      return const ir.DynamicType();
+      returnType = const ir.DynamicType();
+    } else {
+      ir.Class superclass = node.interfaceTarget.enclosingClass;
+      ir.InterfaceType receiverType =
+          typeEnvironment.getTypeAsInstanceOf(thisType, superclass);
+      returnType = ir.Substitution.fromInterfaceType(receiverType)
+          .substituteType(node.interfaceTarget.function.returnType);
+      returnType = ir.Substitution.fromPairs(
+              node.interfaceTarget.function.typeParameters,
+              node.arguments.types)
+          .substituteType(returnType);
     }
-    ir.Class superclass = node.interfaceTarget.enclosingClass;
-    ir.InterfaceType receiverType = typeEnvironment.hierarchy
-        .getTypeAsInstanceOf(typeEnvironment.thisType, superclass);
-    ir.DartType returnType = ir.Substitution.fromInterfaceType(receiverType)
-        .substituteType(node.interfaceTarget.function.returnType);
-    return ir.Substitution.fromPairs(
-            node.interfaceTarget.function.typeParameters, node.arguments.types)
-        .substituteType(returnType);
+    _cache[node] = returnType;
+    handleSuperMethodInvocation(node, argumentTypes, returnType);
+    return returnType;
   }
 
   @override
-  ir.DartType visitThrow(ir.Throw node) => const ir.BottomType();
-
-  @override
-  ir.DartType visitRethrow(ir.Rethrow node) => const ir.BottomType();
-
-  @override
-  ir.DartType visitLogicalExpression(ir.LogicalExpression node) =>
-      typeEnvironment.boolType;
+  ir.DartType visitLogicalExpression(ir.LogicalExpression node) {
+    if (node.operator == '&&') {
+      visitNode(node.left);
+      TypeMap afterLeftWhenTrue = typeMapWhenTrue;
+      TypeMap afterLeftWhenFalse = typeMapWhenFalse;
+      typeMap = afterLeftWhenTrue;
+      visitNode(node.right);
+      TypeMap afterRightWhenTrue = typeMapWhenTrue;
+      TypeMap afterRightWhenFalse = typeMapWhenFalse;
+      typeMapWhenTrue = afterRightWhenTrue;
+      typeMapWhenFalse = afterLeftWhenFalse.join(afterRightWhenFalse);
+    } else {
+      visitNode(node.left);
+      TypeMap afterLeftWhenTrue = typeMapWhenTrue;
+      TypeMap afterLeftWhenFalse = typeMapWhenFalse;
+      typeMap = afterLeftWhenFalse;
+      visitNode(node.right);
+      TypeMap afterRightWhenTrue = typeMapWhenTrue;
+      TypeMap afterRightWhenFalse = typeMapWhenFalse;
+      typeMapWhenTrue = afterLeftWhenTrue.join(afterRightWhenTrue);
+      typeMapWhenFalse = afterRightWhenFalse;
+    }
+    return super.visitLogicalExpression(node);
+  }
 
   @override
   ir.DartType visitNot(ir.Not node) {
-    return typeEnvironment.boolType;
+    visitNode(node.operand);
+    TypeMap afterOperandWhenTrue = typeMapWhenTrue;
+    TypeMap afterOperandWhenFalse = typeMapWhenFalse;
+    typeMapWhenTrue = afterOperandWhenFalse;
+    typeMapWhenFalse = afterOperandWhenTrue;
+    return super.visitNot(node);
+  }
+
+  ir.DartType _handleConditional(
+      ir.Expression condition, ir.TreeNode then, ir.TreeNode otherwise) {
+    visitNode(condition);
+    TypeMap afterConditionWhenTrue = typeMapWhenTrue;
+    TypeMap afterConditionWhenFalse = typeMapWhenFalse;
+    typeMap = afterConditionWhenTrue;
+    ir.DartType thenType = visitNode(then);
+    TypeMap afterThen = typeMap;
+    typeMap = afterConditionWhenFalse;
+    ir.DartType otherwiseType = visitNode(otherwise);
+    TypeMap afterOtherwise = typeMap;
+    if (completes(thenType) && completes(otherwiseType)) {
+      typeMap = afterThen.join(afterOtherwise);
+      return null;
+    } else if (completes(thenType)) {
+      typeMap = afterThen;
+      return null;
+    } else if (completes(otherwiseType)) {
+      typeMap = afterOtherwise;
+      return null;
+    } else {
+      typeMap = afterThen.join(afterOtherwise);
+      return const DoesNotCompleteType();
+    }
   }
 
   @override
   ir.DartType visitConditionalExpression(ir.ConditionalExpression node) {
-    return node.staticType;
+    // TODO(johnniwinther): Should we return `const DoesNotCompleteType()` if
+    // both branches are failing?
+    _handleConditional(node.condition, node.then, node.otherwise);
+    return super.visitConditionalExpression(node);
   }
 
+  void handleIsExpression(ir.IsExpression node) {}
+
   @override
   ir.DartType visitIsExpression(ir.IsExpression node) {
-    return typeEnvironment.boolType;
-  }
-
-  @override
-  ir.DartType visitTypeLiteral(ir.TypeLiteral node) => typeEnvironment.typeType;
-
-  @override
-  ir.DartType visitFunctionExpression(ir.FunctionExpression node) {
-    return node.function.functionType;
+    ir.Expression operand = node.operand;
+    visitNode(operand);
+    if (operand is ir.VariableGet &&
+        !_invalidatedVariables.contains(operand.variable)) {
+      TypeMap afterOperand = typeMap;
+      typeMapWhenTrue =
+          afterOperand.promote(operand.variable, node.type, isTrue: true);
+      typeMapWhenFalse =
+          afterOperand.promote(operand.variable, node.type, isTrue: false);
+    }
+    handleIsExpression(node);
+    return super.visitIsExpression(node);
   }
 
   @override
   ir.DartType visitLet(ir.Let node) {
-    return visitNode(node.body);
+    visitNode(node.variable.initializer);
+    return super.visitLet(node);
   }
 
-  ir.DartType computeInstantiationType(
+  ir.DartType _computeInstantiationType(
       ir.Instantiation node, ir.FunctionType expressionType) {
     return ir.Substitution.fromPairs(
             expressionType.typeParameters, node.typeArguments)
         .substituteType(expressionType.withoutTypeParameters);
   }
 
+  void handleInstantiation(ir.Instantiation node,
+      ir.FunctionType expressionType, ir.DartType resultType) {}
+
   @override
   ir.DartType visitInstantiation(ir.Instantiation node) {
     ir.FunctionType expressionType = visitNode(node.expression);
-    return computeInstantiationType(node, expressionType);
+    ir.DartType resultType = _computeInstantiationType(node, expressionType);
+    _cache[node] = resultType;
+    handleInstantiation(node, expressionType, resultType);
+    return resultType;
   }
 
   @override
-  ir.DartType visitInvalidExpression(ir.InvalidExpression node) =>
-      const ir.BottomType();
-
-  @override
-  ir.DartType visitLoadLibrary(ir.LoadLibrary node) {
-    return typeEnvironment.futureType(const ir.DynamicType());
-  }
-}
-
-/// Visitor that computes the static type of an expression using a cache to
-/// avoid recomputations.
-class CachingStaticTypeVisitor extends StaticTypeVisitor {
-  Map<ir.Expression, ir.DartType> _cache = {};
-
-  CachingStaticTypeVisitor(ir.TypeEnvironment typeEnvironment)
-      : super(typeEnvironment);
-
-  @override
-  ir.DartType visitNode(ir.Node node) {
-    ir.DartType result;
-    if (node is ir.Expression) {
-      result = _cache[node];
-      if (result != null) return result;
-      result = super.visitNode(node);
-      _cache[node] = result;
-    } else {
-      result = super.visitNode(node);
+  ir.DartType visitBlock(ir.Block node) {
+    assert(_pendingRuntimeTypeUseData.isEmpty);
+    ir.DartType type;
+    for (ir.Statement statement in node.statements) {
+      if (!completes(visitNode(statement))) {
+        type = const DoesNotCompleteType();
+      }
     }
-    return result;
-  }
-}
-
-/// Visitor that traverse the whole tree while returning the static type of
-/// expressions.
-abstract class StaticTypeTraversalVisitor extends StaticTypeVisitor {
-  StaticTypeTraversalVisitor(ir.TypeEnvironment typeEnvironment)
-      : super(typeEnvironment);
-
-  @override
-  ir.DartType defaultNode(ir.Node node) {
-    node.visitChildren(this);
-    return null;
-  }
-
-  Null defaultMember(ir.Member node) {
-    typeEnvironment.thisType =
-        node.enclosingClass != null ? node.enclosingClass.thisType : null;
-    node.visitChildren(this);
-    typeEnvironment.thisType = null;
-    return null;
+    assert(_pendingRuntimeTypeUseData.isEmpty,
+        "Incomplete RuntimeTypeUseData: $_pendingRuntimeTypeUseData");
+    return type;
   }
 
   ir.DartType visitExpressionStatement(ir.ExpressionStatement node) {
@@ -464,122 +828,883 @@
     return null;
   }
 
+  void handleAsExpression(ir.AsExpression node, ir.DartType operandType) {}
+
   @override
   ir.DartType visitAsExpression(ir.AsExpression node) {
-    visitNode(node.operand);
+    ir.DartType operandType = visitNode(node.operand);
+    handleAsExpression(node, operandType);
     return super.visitAsExpression(node);
   }
 
+  void handleStringConcatenation(ir.StringConcatenation node) {}
+
   @override
   ir.DartType visitStringConcatenation(ir.StringConcatenation node) {
     visitNodes(node.expressions);
+    handleStringConcatenation(node);
     return super.visitStringConcatenation(node);
   }
 
+  void handleIntLiteral(ir.IntLiteral node) {}
+
+  @override
+  ir.DartType visitIntLiteral(ir.IntLiteral node) {
+    handleIntLiteral(node);
+    return super.visitIntLiteral(node);
+  }
+
+  void handleDoubleLiteral(ir.DoubleLiteral node) {}
+
+  @override
+  ir.DartType visitDoubleLiteral(ir.DoubleLiteral node) {
+    handleDoubleLiteral(node);
+    return super.visitDoubleLiteral(node);
+  }
+
+  void handleBoolLiteral(ir.BoolLiteral node) {}
+
+  @override
+  ir.DartType visitBoolLiteral(ir.BoolLiteral node) {
+    handleBoolLiteral(node);
+    return super.visitBoolLiteral(node);
+  }
+
+  void handleStringLiteral(ir.StringLiteral node) {}
+
+  @override
+  ir.DartType visitStringLiteral(ir.StringLiteral node) {
+    handleStringLiteral(node);
+    return super.visitStringLiteral(node);
+  }
+
+  void handleSymbolLiteral(ir.SymbolLiteral node) {}
+
+  @override
+  ir.DartType visitSymbolLiteral(ir.SymbolLiteral node) {
+    handleSymbolLiteral(node);
+    return super.visitSymbolLiteral(node);
+  }
+
+  void handleNullLiteral(ir.NullLiteral node) {}
+
+  @override
+  ir.DartType visitNullLiteral(ir.NullLiteral node) {
+    handleNullLiteral(node);
+    return super.visitNullLiteral(node);
+  }
+
+  void handleListLiteral(ir.ListLiteral node) {}
+
   @override
   ir.DartType visitListLiteral(ir.ListLiteral node) {
     visitNodes(node.expressions);
+    handleListLiteral(node);
     return super.visitListLiteral(node);
   }
 
+  void handleMapLiteral(ir.MapLiteral node) {}
+
   @override
   ir.DartType visitMapLiteral(ir.MapLiteral node) {
     visitNodes(node.entries);
+    handleMapLiteral(node);
     return super.visitMapLiteral(node);
   }
 
   @override
-  ir.DartType visitPropertySet(ir.PropertySet node) {
-    visitNode(node.receiver);
-    return super.visitPropertySet(node);
+  Null visitMapEntry(ir.MapEntry entry) {
+    visitNode(entry.key);
+    visitNode(entry.value);
   }
 
-  @override
-  ir.DartType visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
-    visitNodes(node.arguments.positional);
-    visitNodes(node.arguments.named);
-    return super.visitDirectMethodInvocation(node);
-  }
+  void handleFunctionExpression(ir.FunctionExpression node) {}
 
   @override
-  ir.DartType visitDirectPropertySet(ir.DirectPropertySet node) {
-    visitNode(node.receiver);
-    return super.visitDirectPropertySet(node);
+  ir.DartType visitFunctionExpression(ir.FunctionExpression node) {
+    ir.DartType returnType = super.visitFunctionExpression(node);
+    Set<ir.VariableDeclaration> _oldVariables = _currentVariables;
+    _currentVariables = new Set<ir.VariableDeclaration>();
+    visitSignature(node.function);
+    visitNode(node.function.body);
+    handleFunctionExpression(node);
+    _invalidatedVariables.removeAll(_currentVariables);
+    _currentVariables = _oldVariables;
+    return returnType;
   }
 
-  @override
-  ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
-    if (isSpecialCasedBinaryOperator(node.interfaceTarget)) {
-      return super.visitMethodInvocation(node);
-    }
-    visitNodes(node.arguments.positional);
-    visitNodes(node.arguments.named);
-    return super.visitMethodInvocation(node);
-  }
-
-  @override
-  ir.DartType visitStaticInvocation(ir.StaticInvocation node) {
-    visitNodes(node.arguments.positional);
-    visitNodes(node.arguments.named);
-    return super.visitStaticInvocation(node);
-  }
-
-  @override
-  ir.DartType visitConstructorInvocation(ir.ConstructorInvocation node) {
-    visitNodes(node.arguments.positional);
-    visitNodes(node.arguments.named);
-    return super.visitConstructorInvocation(node);
-  }
-
-  @override
-  ir.DartType visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
-    visitNodes(node.arguments.positional);
-    visitNodes(node.arguments.named);
-    return super.visitSuperMethodInvocation(node);
-  }
+  void handleThrow(ir.Throw node) {}
 
   @override
   ir.DartType visitThrow(ir.Throw node) {
     visitNode(node.expression);
+    handleThrow(node);
     return super.visitThrow(node);
   }
 
   @override
-  ir.DartType visitLogicalExpression(ir.LogicalExpression node) {
-    visitNode(node.left);
-    visitNode(node.right);
-    return super.visitLogicalExpression(node);
+  Null visitSwitchCase(ir.SwitchCase node) {
+    visitNodes(node.expressions);
+    visitNode(node.body);
   }
 
   @override
-  ir.DartType visitNot(ir.Not node) {
-    visitNode(node.operand);
-    return super.visitNot(node);
+  ir.DartType visitContinueSwitchStatement(ir.ContinueSwitchStatement node) {
+    return const DoesNotCompleteType();
   }
 
   @override
-  ir.DartType visitConditionalExpression(ir.ConditionalExpression node) {
+  Null visitLabeledStatement(ir.LabeledStatement node) {
+    visitNode(node.body);
+  }
+
+  @override
+  ir.DartType visitBreakStatement(ir.BreakStatement node) {
+    return const DoesNotCompleteType();
+  }
+
+  @override
+  Null visitYieldStatement(ir.YieldStatement node) {
+    visitNode(node.expression);
+  }
+
+  @override
+  Null visitAssertInitializer(ir.AssertInitializer node) {
+    visitNode(node.statement);
+  }
+
+  void handleFieldInitializer(ir.FieldInitializer node) {}
+
+  @override
+  Null visitFieldInitializer(ir.FieldInitializer node) {
+    visitNode(node.value);
+    handleFieldInitializer(node);
+  }
+
+  void handleRedirectingInitializer(
+      ir.RedirectingInitializer node, ArgumentTypes argumentTypes) {}
+
+  @override
+  Null visitRedirectingInitializer(ir.RedirectingInitializer node) {
+    ArgumentTypes argumentTypes = _visitArguments(node.arguments);
+    handleRedirectingInitializer(node, argumentTypes);
+  }
+
+  void handleSuperInitializer(
+      ir.SuperInitializer node, ArgumentTypes argumentTypes) {}
+
+  @override
+  Null visitSuperInitializer(ir.SuperInitializer node) {
+    ArgumentTypes argumentTypes = _visitArguments(node.arguments);
+    handleSuperInitializer(node, argumentTypes);
+  }
+
+  @override
+  Null visitLocalInitializer(ir.LocalInitializer node) {
+    visitNode(node.variable);
+  }
+
+  @override
+  ir.DartType visitNamedExpression(ir.NamedExpression node) =>
+      visitNode(node.value);
+
+  @override
+  Null visitEmptyStatement(ir.EmptyStatement node) {}
+
+  @override
+  Null visitForStatement(ir.ForStatement node) {
+    visitNodes(node.variables);
+    TypeMap beforeLoop = typeMap =
+        typeMap.remove(variableScopeModel.getScopeFor(node).assignedVariables);
     visitNode(node.condition);
-    visitNode(node.then);
-    visitNode(node.otherwise);
-    return super.visitConditionalExpression(node);
+    typeMap = typeMapWhenTrue;
+    visitNode(node.body);
+    visitNodes(node.updates);
+    typeMap = beforeLoop;
+  }
+
+  void handleForInStatement(ir.ForInStatement node, ir.DartType iterableType) {}
+
+  @override
+  Null visitForInStatement(ir.ForInStatement node) {
+    ir.DartType iterableType = visitNode(node.iterable);
+    TypeMap beforeLoop = typeMap =
+        typeMap.remove(variableScopeModel.getScopeFor(node).assignedVariables);
+    visitNode(node.variable);
+    visitNode(node.body);
+    handleForInStatement(node, iterableType);
+    typeMap = beforeLoop;
   }
 
   @override
-  ir.DartType visitIsExpression(ir.IsExpression node) {
-    visitNode(node.operand);
-    return super.visitIsExpression(node);
+  Null visitDoStatement(ir.DoStatement node) {
+    TypeMap beforeLoop = typeMap =
+        typeMap.remove(variableScopeModel.getScopeFor(node).assignedVariables);
+    visitNode(node.body);
+    visitNode(node.condition);
+    typeMap = beforeLoop;
   }
 
   @override
-  ir.DartType visitFunctionExpression(ir.FunctionExpression node) {
+  Null visitWhileStatement(ir.WhileStatement node) {
+    TypeMap beforeLoop = typeMap =
+        typeMap.remove(variableScopeModel.getScopeFor(node).assignedVariables);
+    visitNode(node.condition);
+    typeMap = typeMapWhenTrue;
+    visitNode(node.body);
+    typeMap = beforeLoop;
+  }
+
+  void handleSwitchStatement(ir.SwitchStatement node) {}
+
+  @override
+  Null visitSwitchStatement(ir.SwitchStatement node) {
+    visitNode(node.expression);
+    TypeMap afterExpression = typeMap;
+    VariableScope scope = variableScopeModel.getScopeFor(node);
+    TypeMap afterStatement = afterExpression.remove(scope.assignedVariables);
+    TypeMap beforeCase =
+        scope.hasContinueSwitch ? afterStatement : afterExpression;
+    for (ir.SwitchCase switchCase in node.cases) {
+      typeMap = beforeCase;
+      visitNode(switchCase);
+    }
+    handleSwitchStatement(node);
+    typeMap = afterStatement;
+  }
+
+  @override
+  ir.DartType visitReturnStatement(ir.ReturnStatement node) {
+    visitNode(node.expression);
+    return const DoesNotCompleteType();
+  }
+
+  @override
+  ir.DartType visitIfStatement(ir.IfStatement node) {
+    return _handleConditional(node.condition, node.then, node.otherwise);
+  }
+
+  @override
+  Null visitTryCatch(ir.TryCatch node) {
+    visitNode(node.body);
+    visitNodes(node.catches);
+  }
+
+  void handleCatch(ir.Catch node) {}
+
+  @override
+  Null visitCatch(ir.Catch node) {
+    handleCatch(node);
+    visitNode(node.body);
+  }
+
+  @override
+  Null visitTryFinally(ir.TryFinally node) {
+    visitNode(node.body);
+    visitNode(node.finalizer);
+  }
+
+  void handleTypeLiteral(ir.TypeLiteral node) {}
+
+  @override
+  ir.DartType visitTypeLiteral(ir.TypeLiteral node) {
+    handleTypeLiteral(node);
+    return super.visitTypeLiteral(node);
+  }
+
+  void handleLoadLibrary(ir.LoadLibrary node) {}
+
+  @override
+  ir.DartType visitLoadLibrary(ir.LoadLibrary node) {
+    handleLoadLibrary(node);
+    return super.visitLoadLibrary(node);
+  }
+
+  void handleAssertStatement(ir.AssertStatement node) {}
+
+  @override
+  Null visitAssertStatement(ir.AssertStatement node) {
+    TypeMap beforeCondition = typeMap;
+    visitNode(node.condition);
+    TypeMap afterConditionWhenTrue = typeMapWhenTrue;
+    TypeMap afterConditionWhenFalse = typeMapWhenFalse;
+    typeMap = afterConditionWhenFalse;
+    visitNode(node.message);
+    handleAssertStatement(node);
+    typeMap = useAsserts ? afterConditionWhenTrue : beforeCondition;
+  }
+
+  void handleFunctionDeclaration(ir.FunctionDeclaration node) {}
+
+  @override
+  Null visitFunctionDeclaration(ir.FunctionDeclaration node) {
+    TypeMap beforeClosure =
+        typeMap = typeMap.remove(variableScopeModel.assignedVariables);
+    Set<ir.VariableDeclaration> _oldVariables = _currentVariables;
+    _currentVariables = new Set<ir.VariableDeclaration>();
+    visitSignature(node.function);
     visitNode(node.function.body);
-    return super.visitFunctionExpression(node);
+    handleFunctionDeclaration(node);
+    _invalidatedVariables.removeAll(_currentVariables);
+    _currentVariables = _oldVariables;
+    typeMap = beforeClosure;
   }
 
+  void handleParameter(ir.VariableDeclaration node) {}
+
+  void visitParameter(ir.VariableDeclaration node) {
+    _currentVariables.add(node);
+    visitNode(node.initializer);
+    handleParameter(node);
+  }
+
+  void handleSignature(ir.FunctionNode node) {}
+
+  void visitSignature(ir.FunctionNode node) {
+    node.positionalParameters.forEach(visitParameter);
+    node.namedParameters.forEach(visitParameter);
+    handleSignature(node);
+  }
+
+  void handleProcedure(ir.Procedure node) {}
+
   @override
-  ir.DartType visitLet(ir.Let node) {
-    visitNode(node.variable.initializer);
-    return super.visitLet(node);
+  Null visitProcedure(ir.Procedure node) {
+    thisType = new ThisInterfaceType.from(node.enclosingClass?.thisType);
+    _currentVariables = new Set<ir.VariableDeclaration>();
+    visitSignature(node.function);
+    visitNode(node.function.body);
+    handleProcedure(node);
+    _invalidatedVariables.removeAll(_currentVariables);
+    _currentVariables = null;
+    thisType = null;
+  }
+
+  void handleConstructor(ir.Constructor node) {}
+
+  @override
+  Null visitConstructor(ir.Constructor node) {
+    thisType = new ThisInterfaceType.from(node.enclosingClass.thisType);
+    _currentVariables = new Set<ir.VariableDeclaration>();
+    visitSignature(node.function);
+    visitNodes(node.initializers);
+    visitNode(node.function.body);
+    handleConstructor(node);
+    _invalidatedVariables.removeAll(_currentVariables);
+    _currentVariables = null;
+    thisType = null;
+  }
+
+  void handleField(ir.Field node) {}
+
+  @override
+  Null visitField(ir.Field node) {
+    thisType = new ThisInterfaceType.from(node.enclosingClass?.thisType);
+    visitNode(node.initializer);
+    handleField(node);
+    thisType = null;
+  }
+
+  void handleVariableDeclaration(ir.VariableDeclaration node) {}
+
+  @override
+  Null visitVariableDeclaration(ir.VariableDeclaration node) {
+    _currentVariables.add(node);
+    ir.DartType type = visitNode(node.initializer);
+    if (node.initializer != null &&
+        variableScopeModel.isEffectivelyFinal(node) &&
+        inferEffectivelyFinalVariableTypes) {
+      node.type = type;
+    }
+    handleVariableDeclaration(node);
+  }
+}
+
+class ArgumentTypes {
+  final List<ir.DartType> positional;
+  final List<ir.DartType> named;
+
+  ArgumentTypes(this.positional, this.named);
+}
+
+/// Type information collected for a single path for a local variable.
+///
+/// This is used to implement guarded type promotion.
+///
+/// The terminology and implementation is based on this paper:
+///
+///   http://www.cs.williams.edu/FTfJP2011/6-Winther.pdf
+///
+class TypeHolder {
+  /// The declared type of the local variable.
+  final ir.DartType declaredType;
+
+  /// The types that the local variable is known to be an instance of.
+  final Set<ir.DartType> trueTypes;
+
+  /// The types that the local variable is known _not_ to be an instance of.
+  final Set<ir.DartType> falseTypes;
+
+  int _hashCode;
+
+  TypeHolder(this.declaredType, this.trueTypes, this.falseTypes);
+
+  /// Computes a single type that soundly represents the promoted type of the
+  /// local variable on this single path.
+  ir.DartType typeOf(ir.TypeEnvironment typeEnvironment) {
+    ir.DartType candidate = declaredType;
+    if (falseTypes != null) {
+      // TODO(johnniwinther): Special-case the `== null` representation to
+      // make it faster.
+      for (ir.DartType type in falseTypes) {
+        if (typeEnvironment.isSubtypeOf(declaredType, type)) {
+          return typeEnvironment.nullType;
+        }
+      }
+    }
+    if (trueTypes != null) {
+      for (ir.DartType type in trueTypes) {
+        if (type == typeEnvironment.nullType) {
+          return type;
+        }
+        if (typeEnvironment.isSubtypeOf(type, candidate)) {
+          candidate = type;
+        } else if (!typeEnvironment.isSubtypeOf(candidate, type)) {
+          // We cannot promote. No single type is most specific.
+          // TODO(johnniwinther): Compute implied types? For instance when the
+          // declared type is `Iterable<String>` and tested type is
+          // `List<dynamic>` we could promote to the implied type
+          // `List<String>`.
+          return null;
+        }
+      }
+    }
+    return candidate;
+  }
+
+  int get hashCode {
+    if (_hashCode == null) {
+      _hashCode = Hashing.setHash(falseTypes,
+          Hashing.setHash(trueTypes, Hashing.objectHash(declaredType)));
+    }
+    return _hashCode;
+  }
+
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    return other is TypeHolder &&
+        declaredType == other.declaredType &&
+        equalSets(trueTypes, other.trueTypes) &&
+        equalSets(falseTypes, other.falseTypes);
+  }
+
+  void _getText(
+      StringBuffer sb, String Function(Iterable<ir.DartType>) typesToText) {
+    sb.write('{');
+    String comma = '';
+    if (trueTypes != null) {
+      sb.write('true:');
+      sb.write(typesToText(trueTypes));
+      comma = ',';
+    }
+    if (falseTypes != null) {
+      sb.write(comma);
+      sb.write('false:');
+      sb.write(typesToText(falseTypes));
+    }
+    sb.write('}');
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('TypeHolder(');
+    sb.write('declared=$declaredType');
+    if (trueTypes != null) {
+      sb.write(',true=$trueTypes');
+    }
+    if (falseTypes != null) {
+      sb.write(',false=$falseTypes');
+    }
+    sb.write(')');
+    return sb.toString();
+  }
+}
+
+/// Type information for a single local variable on all possible paths.
+///
+/// This is used to implement guarded type promotion.
+///
+/// The terminology and implementation is based on this paper:
+///
+///   http://www.cs.williams.edu/FTfJP2011/6-Winther.pdf
+///
+class TargetInfo {
+  /// The declared type of the local variable.
+  final ir.DartType declaredType;
+
+  /// Collected type information for disjoint paths.
+  final Iterable<TypeHolder> typeHolders;
+
+  /// Types relevant for promotion of the local variable.
+  final Iterable<ir.DartType> typesOfInterest;
+
+  TargetInfo(this.declaredType, this.typeHolders, this.typesOfInterest);
+
+  /// Returns the [TargetInfo] that describes the added type knowledge for the
+  /// local variable. If [isTrue] is `true`, the local variable is known to
+  /// be an instance of [type]. If [isTrue] is `false`, the local variable is
+  /// known _not_ to be an instance of [type].
+  TargetInfo promote(ir.DartType type, {bool isTrue}) {
+    Set<TypeHolder> newTypeHolders = new Set<TypeHolder>();
+
+    bool addTypeHolder(TypeHolder typeHolder) {
+      bool changed = false;
+
+      Set<ir.DartType> addAsCopy(Set<ir.DartType> set, ir.DartType type) {
+        Set<ir.DartType> result;
+        if (set == null) {
+          result = new Set<ir.DartType>();
+        } else if (set.contains(type)) {
+          return set;
+        } else {
+          result = Set<ir.DartType>.from(set);
+        }
+        changed = true;
+        return result..add(type);
+      }
+
+      Set<ir.DartType> trueTypes = typeHolder?.trueTypes;
+      Set<ir.DartType> falseTypes = typeHolder?.falseTypes;
+      if (isTrue) {
+        trueTypes = addAsCopy(trueTypes, type);
+      } else {
+        falseTypes = addAsCopy(falseTypes, type);
+      }
+      // TODO(johnniwinther): Check validity; if the true types are
+      // contradicting, for instance if the local is known to be and instance
+      // of types `int` and `String` simultaneously, then we could flag code
+      // as dead code.
+      newTypeHolders.add(TypeHolder(declaredType, trueTypes, falseTypes));
+      return changed;
+    }
+
+    bool changed = false;
+    if (typeHolders.isEmpty) {
+      changed |= addTypeHolder(null);
+    } else {
+      for (TypeHolder typeHolder in typeHolders) {
+        changed |= addTypeHolder(typeHolder);
+      }
+    }
+    Iterable<ir.DartType> newTypesOfInterest;
+    if (typesOfInterest.contains(type)) {
+      newTypesOfInterest = typesOfInterest;
+    } else {
+      newTypesOfInterest = new Set<ir.DartType>.from(typesOfInterest)
+        ..add(type);
+      changed = true;
+    }
+    return changed
+        ? new TargetInfo(declaredType, newTypeHolders, newTypesOfInterest)
+        : this;
+  }
+
+  /// Returns the [TargetInfo] that describes that the local is either of [this]
+  /// or the [other] type.
+  ///
+  /// Returns `null` if the join is empty.
+  TargetInfo join(TargetInfo other) {
+    if (other == null) return null;
+    if (identical(this, other)) return this;
+
+    Set<TypeHolder> newTypeHolders = new Set<TypeHolder>();
+    Set<ir.DartType> newTypesOfInterest = new Set<ir.DartType>();
+
+    /// Adds the [typeHolders] to [newTypeHolders] for types in
+    /// [otherTypesOfInterest] while removing the information
+    /// invalidated by [otherTrueTypes] and [otherFalseTypes].
+    void addTypeHolders(
+        Iterable<TypeHolder> typeHolders,
+        Set<ir.DartType> otherTrueTypes,
+        Set<ir.DartType> otherFalseTypes,
+        Iterable<ir.DartType> otherTypesOfInterest) {
+      for (TypeHolder typeHolder in typeHolders) {
+        Set<ir.DartType> newTrueTypes;
+        if (typeHolder.trueTypes != null) {
+          newTrueTypes = new Set<ir.DartType>.from(typeHolder.trueTypes);
+
+          /// Only types in [otherTypesOfInterest] has information from all
+          /// paths.
+          newTrueTypes.retainAll(otherTypesOfInterest);
+
+          /// Remove types that are known to be false on other paths; these
+          /// would amount to knowing that a variable is or is not of some
+          /// type.
+          newTrueTypes.removeAll(otherFalseTypes);
+          if (newTrueTypes.isEmpty) {
+            newTrueTypes = null;
+          } else {
+            newTypesOfInterest.addAll(newTrueTypes);
+          }
+        }
+        Set<ir.DartType> newFalseTypes;
+        if (typeHolder.falseTypes != null) {
+          newFalseTypes = new Set<ir.DartType>.from(typeHolder.falseTypes);
+
+          /// Only types in [otherTypesOfInterest] has information from all
+          /// paths.
+          newFalseTypes.retainAll(otherTypesOfInterest);
+
+          /// Remove types that are known to be true on other paths; these
+          /// would amount to knowing that a variable is or is not of some
+          /// type.
+          newFalseTypes.removeAll(otherTrueTypes);
+          if (newFalseTypes.isEmpty) {
+            newFalseTypes = null;
+          } else {
+            newTypesOfInterest.addAll(newFalseTypes);
+          }
+        }
+        if (newTrueTypes != null || newFalseTypes != null) {
+          // Only include type holders with information.
+          newTypeHolders
+              .add(new TypeHolder(declaredType, newTrueTypes, newFalseTypes));
+        }
+      }
+    }
+
+    Set<ir.DartType> thisTrueTypes = new Set<ir.DartType>();
+    Set<ir.DartType> thisFalseTypes = new Set<ir.DartType>();
+    for (TypeHolder typeHolder in typeHolders) {
+      if (typeHolder.trueTypes != null) {
+        thisTrueTypes.addAll(typeHolder.trueTypes);
+      }
+      if (typeHolder.falseTypes != null) {
+        thisFalseTypes.addAll(typeHolder.falseTypes);
+      }
+    }
+
+    Set<ir.DartType> otherTrueTypes = new Set<ir.DartType>();
+    Set<ir.DartType> otherFalseTypes = new Set<ir.DartType>();
+    for (TypeHolder typeHolder in other.typeHolders) {
+      if (typeHolder.trueTypes != null) {
+        otherTrueTypes.addAll(typeHolder.trueTypes);
+      }
+      if (typeHolder.falseTypes != null) {
+        otherFalseTypes.addAll(typeHolder.falseTypes);
+      }
+    }
+
+    addTypeHolders(this.typeHolders, otherTrueTypes, otherFalseTypes,
+        other.typesOfInterest);
+    addTypeHolders(
+        other.typeHolders, thisTrueTypes, thisFalseTypes, this.typesOfInterest);
+
+    if (newTypeHolders.isEmpty) {
+      assert(newTypesOfInterest.isEmpty);
+      return null;
+    }
+
+    return new TargetInfo(declaredType, newTypeHolders, newTypesOfInterest);
+  }
+
+  /// Computes a single type that soundly represents the promoted type of the
+  /// local variable on all possible paths.
+  ir.DartType typeOf(ir.TypeEnvironment typeEnvironment) {
+    ir.DartType candidate = null;
+    for (TypeHolder typeHolder in typeHolders) {
+      ir.DartType type = typeHolder.typeOf(typeEnvironment);
+      if (type == null) {
+        // We cannot promote. No single type is most specific.
+        return null;
+      }
+      if (candidate == null) {
+        candidate = type;
+      } else {
+        if (type == typeEnvironment.nullType) {
+          // Keep the current candidate.
+        } else if (candidate == typeEnvironment.nullType) {
+          candidate = type;
+        } else if (typeEnvironment.isSubtypeOf(candidate, type)) {
+          candidate = type;
+        } else if (!typeEnvironment.isSubtypeOf(type, candidate)) {
+          // We cannot promote. No promoted type of one path is a supertype of
+          // the promoted type from all other paths.
+          // TODO(johnniwinther): Compute a greatest lower bound, instead?
+          return null;
+        }
+      }
+    }
+    return candidate;
+  }
+
+  void _getText(
+      StringBuffer sb, String Function(Iterable<ir.DartType>) typesToText) {
+    sb.write('[');
+    String comma = '';
+    for (TypeHolder typeHolder in typeHolders) {
+      sb.write(comma);
+      typeHolder._getText(sb, typesToText);
+      comma = ',';
+    }
+    sb.write('|');
+    sb.write(typesToText(typesOfInterest));
+    sb.write(']');
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('TargetInfo(');
+    sb.write('declaredType=$declaredType,');
+    sb.write('typeHolders=$typeHolders,');
+    sb.write('declarationsOfInterest=$typesOfInterest');
+    sb.write(')');
+    return sb.toString();
+  }
+}
+
+/// Map from local variables to type information used for guarded type
+/// promotion.
+///
+/// The terminology and implementation is based on this paper:
+///
+///   http://www.cs.williams.edu/FTfJP2011/6-Winther.pdf
+///
+class TypeMap {
+  final Map<ir.VariableDeclaration, TargetInfo> _targetInfoMap;
+
+  const TypeMap([this._targetInfoMap = const {}]);
+
+  /// Returns the [TypeMap] that describes the added type knowledge for the
+  /// local [variable]. If [isTrue] is `true`, the local [variable] is known to
+  /// be an instance of [type]. If [isTrue] is `false`, the local [variable] is
+  /// known _not_ to be an instance of [type].
+  TypeMap promote(ir.VariableDeclaration variable, ir.DartType type,
+      {bool isTrue}) {
+    Map<ir.VariableDeclaration, TargetInfo> newInfoMap =
+        new Map<ir.VariableDeclaration, TargetInfo>.from(_targetInfoMap);
+    TargetInfo targetInfo = newInfoMap[variable];
+    bool changed = false;
+    if (targetInfo != null) {
+      TargetInfo result = targetInfo.promote(type, isTrue: isTrue);
+      changed = !identical(targetInfo, result);
+      targetInfo = result;
+    } else {
+      changed = true;
+      Set<ir.DartType> trueTypes =
+          isTrue ? (new Set<ir.DartType>()..add(type)) : null;
+      Set<ir.DartType> falseTypes =
+          isTrue ? null : (new Set<ir.DartType>()..add(type));
+      TypeHolder typeHolder =
+          new TypeHolder(variable.type, trueTypes, falseTypes);
+      targetInfo = new TargetInfo(
+          variable.type, <TypeHolder>[typeHolder], <ir.DartType>[type]);
+    }
+    newInfoMap[variable] = targetInfo;
+    return changed ? new TypeMap(newInfoMap) : this;
+  }
+
+  /// Returns the [TypeMap] that describes that the locals are either of [this]
+  /// or the [other] types.
+  TypeMap join(TypeMap other) {
+    if (identical(this, other)) return this;
+
+    Map<ir.VariableDeclaration, TargetInfo> newInfoMap = {};
+    bool changed = false;
+    _targetInfoMap.forEach((ir.VariableDeclaration variable, TargetInfo info) {
+      TargetInfo result = info.join(other._targetInfoMap[variable]);
+      changed |= !identical(info, result);
+      if (result != null) {
+        // Add only non-empty information.
+        newInfoMap[variable] = result;
+      }
+    });
+    return changed ? new TypeMap(newInfoMap) : this;
+  }
+
+  /// Returns the [TypeMap] in which all type information for any of the
+  /// [variables] has been removed.
+  TypeMap remove(Iterable<ir.VariableDeclaration> variables) {
+    bool changed = false;
+    Map<ir.VariableDeclaration, TargetInfo> newInfoMap = {};
+    _targetInfoMap.forEach((ir.VariableDeclaration variable, TargetInfo info) {
+      if (!variables.contains(variable)) {
+        newInfoMap[variable] = info;
+      } else {
+        changed = true;
+      }
+    });
+    return changed ? new TypeMap(newInfoMap) : this;
+  }
+
+  /// Returns the [TypeMap] where type information for `node.variable` is
+  /// reduced to the promotions upheld by an assignment to `node.variable` of
+  /// the static [type].
+  TypeMap reduce(ir.VariableSet node, ir.DartType type,
+      ir.TypeEnvironment typeEnvironment) {
+    Map<ir.VariableDeclaration, TargetInfo> newInfoMap = {};
+    bool changed = false;
+    _targetInfoMap.forEach((ir.VariableDeclaration variable, TargetInfo info) {
+      if (variable != node.variable) {
+        newInfoMap[variable] = info;
+      } else if (type != null) {
+        changed = true;
+        Set<ir.DartType> newTypesOfInterest = new Set<ir.DartType>();
+        for (ir.DartType typeOfInterest in info.typesOfInterest) {
+          if (typeEnvironment.isSubtypeOf(type, typeOfInterest)) {
+            newTypesOfInterest.add(typeOfInterest);
+          }
+        }
+        if (newTypesOfInterest.isNotEmpty) {
+          TypeHolder typeHolderIfNonNull =
+              new TypeHolder(info.declaredType, newTypesOfInterest, null);
+          TypeHolder typeHolderIfNull = new TypeHolder(info.declaredType, null,
+              new Set<ir.DartType>()..add(info.declaredType));
+          newInfoMap[variable] = new TargetInfo(
+              info.declaredType,
+              <TypeHolder>[typeHolderIfNonNull, typeHolderIfNull],
+              newTypesOfInterest);
+        }
+      } else {
+        changed = true;
+      }
+    });
+    return changed ? new TypeMap(newInfoMap) : this;
+  }
+
+  /// Computes a single type that soundly represents the promoted type of
+  /// `node.variable` on all possible paths.
+  ir.DartType typeOf(ir.VariableGet node, ir.TypeEnvironment typeEnvironment) {
+    TargetInfo info = _targetInfoMap[node.variable];
+    ir.DartType type;
+    if (info != null) {
+      type = info.typeOf(typeEnvironment);
+    }
+    return type ?? node.promotedType ?? node.variable.type;
+  }
+
+  String getText(String Function(Iterable<ir.DartType>) typesToText) {
+    StringBuffer sb = new StringBuffer();
+    sb.write('{');
+    String comma = '';
+    _targetInfoMap.forEach((ir.VariableDeclaration variable, TargetInfo info) {
+      sb.write('${comma}${variable.name}:');
+      info._getText(sb, typesToText);
+      comma = ',';
+    });
+    sb.write('}');
+    return sb.toString();
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('TypeMap(');
+    String comma = '';
+    _targetInfoMap.forEach((ir.VariableDeclaration variable, TargetInfo info) {
+      sb.write('${comma}$variable->$info');
+      comma = ',';
+    });
+    sb.write(')');
+    return sb.toString();
   }
 }
diff --git a/pkg/compiler/lib/src/ir/static_type_base.dart b/pkg/compiler/lib/src/ir/static_type_base.dart
new file mode 100644
index 0000000..20cf00c
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/static_type_base.dart
@@ -0,0 +1,213 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+
+/// Special bottom type used to signal that an expression or statement does
+/// not complete normally. This is the case for instance of throw expressions
+/// and return statements.
+class DoesNotCompleteType extends ir.BottomType {
+  const DoesNotCompleteType();
+
+  String toString() => 'DoesNotCompleteType()';
+}
+
+/// Special interface type used to signal that the static type of an expression
+/// has precision of a this-expression.
+class ThisInterfaceType extends ir.InterfaceType {
+  ThisInterfaceType(ir.Class classNode, [List<ir.DartType> typeArguments])
+      : super(classNode, typeArguments);
+
+  factory ThisInterfaceType.from(ir.InterfaceType type) => type != null
+      ? new ThisInterfaceType(type.classNode, type.typeArguments)
+      : null;
+
+  String toString() => 'this:${super.toString()}';
+}
+
+/// Special interface type used to signal that the static type of an expression
+/// is exact, i.e. the runtime type is not a subtype or subclass of the type.
+class ExactInterfaceType extends ir.InterfaceType {
+  ExactInterfaceType(ir.Class classNode, [List<ir.DartType> typeArguments])
+      : super(classNode, typeArguments);
+
+  factory ExactInterfaceType.from(ir.InterfaceType type) => type != null
+      ? new ExactInterfaceType(type.classNode, type.typeArguments)
+      : null;
+
+  String toString() => 'exact:${super.toString()}';
+}
+
+/// Base class for computing static types.
+///
+/// This class uses the visitor pattern to compute the static type that are
+/// directly defined by the expression kind.
+///
+/// Subclasses will compute the static type or use a cache to look up the static
+/// type of expression whose static type is not directly defined by the
+/// expression kind. For instance method invocations whose static type depend
+/// on the static types of the receiver and type arguments and the signature
+/// of the targeted procedure.
+abstract class StaticTypeBase extends ir.Visitor<ir.DartType> {
+  final ir.TypeEnvironment _typeEnvironment;
+
+  StaticTypeBase(this._typeEnvironment);
+
+  fail(String message) => message;
+
+  ir.TypeEnvironment get typeEnvironment => _typeEnvironment;
+
+  ThisInterfaceType get thisType;
+
+  @override
+  ir.DartType defaultNode(ir.Node node) {
+    return null;
+  }
+
+  ir.DartType visitNode(ir.Node node) {
+    return node?.accept(this);
+  }
+
+  Null visitNodes(List<ir.Node> nodes) {
+    for (ir.Node node in nodes) {
+      visitNode(node);
+    }
+  }
+
+  ir.DartType defaultExpression(ir.Expression node) {
+    throw fail('Unhandled node $node (${node.runtimeType})');
+  }
+
+  @override
+  ir.DartType visitAsExpression(ir.AsExpression node) {
+    return node.type;
+  }
+
+  @override
+  ir.DartType visitAwaitExpression(ir.AwaitExpression node) {
+    return typeEnvironment.unfutureType(visitNode(node.operand));
+  }
+
+  @override
+  ir.DartType visitBoolLiteral(ir.BoolLiteral node) => typeEnvironment.boolType;
+
+  @override
+  ir.DartType visitCheckLibraryIsLoaded(ir.CheckLibraryIsLoaded node) =>
+      typeEnvironment.objectType;
+
+  @override
+  ir.DartType visitStringLiteral(ir.StringLiteral node) =>
+      typeEnvironment.stringType;
+
+  @override
+  ir.DartType visitStringConcatenation(ir.StringConcatenation node) {
+    return typeEnvironment.stringType;
+  }
+
+  @override
+  ir.DartType visitNullLiteral(ir.NullLiteral node) => typeEnvironment.nullType;
+
+  @override
+  ir.DartType visitIntLiteral(ir.IntLiteral node) => typeEnvironment.intType;
+
+  @override
+  ir.DartType visitDoubleLiteral(ir.DoubleLiteral node) =>
+      typeEnvironment.doubleType;
+
+  @override
+  ir.DartType visitSymbolLiteral(ir.SymbolLiteral node) =>
+      typeEnvironment.symbolType;
+
+  @override
+  ir.DartType visitListLiteral(ir.ListLiteral node) {
+    return typeEnvironment.literalListType(node.typeArgument);
+  }
+
+  @override
+  ir.DartType visitMapLiteral(ir.MapLiteral node) {
+    return typeEnvironment.literalMapType(node.keyType, node.valueType);
+  }
+
+  @override
+  ir.DartType visitVariableSet(ir.VariableSet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ir.DartType visitPropertySet(ir.PropertySet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ir.DartType visitDirectPropertySet(ir.DirectPropertySet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ThisInterfaceType visitThisExpression(ir.ThisExpression node) => thisType;
+
+  @override
+  ir.DartType visitStaticGet(ir.StaticGet node) => node.target.getterType;
+
+  @override
+  ir.DartType visitStaticSet(ir.StaticSet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ir.DartType visitSuperPropertySet(ir.SuperPropertySet node) {
+    return visitNode(node.value);
+  }
+
+  @override
+  ir.DartType visitThrow(ir.Throw node) => const DoesNotCompleteType();
+
+  @override
+  ir.DartType visitRethrow(ir.Rethrow node) => const DoesNotCompleteType();
+
+  @override
+  ir.DartType visitLogicalExpression(ir.LogicalExpression node) =>
+      typeEnvironment.boolType;
+
+  @override
+  ir.DartType visitNot(ir.Not node) {
+    return typeEnvironment.boolType;
+  }
+
+  @override
+  ir.DartType visitConditionalExpression(ir.ConditionalExpression node) {
+    return node.staticType;
+  }
+
+  @override
+  ir.DartType visitIsExpression(ir.IsExpression node) {
+    return typeEnvironment.boolType;
+  }
+
+  @override
+  ir.DartType visitTypeLiteral(ir.TypeLiteral node) => typeEnvironment.typeType;
+
+  @override
+  ir.DartType visitFunctionExpression(ir.FunctionExpression node) {
+    return node.function.functionType;
+  }
+
+  @override
+  ir.DartType visitLet(ir.Let node) {
+    return visitNode(node.body);
+  }
+
+  @override
+  ir.DartType visitInvalidExpression(ir.InvalidExpression node) =>
+      const DoesNotCompleteType();
+
+  @override
+  ir.DartType visitLoadLibrary(ir.LoadLibrary node) {
+    return typeEnvironment.futureType(const ir.DynamicType());
+  }
+}
diff --git a/pkg/compiler/lib/src/ir/static_type_provider.dart b/pkg/compiler/lib/src/ir/static_type_provider.dart
new file mode 100644
index 0000000..2901f34
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/static_type_provider.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+
+/// Interface for accessing static types on expressions.
+abstract class StaticTypeProvider {
+  ir.DartType getStaticType(ir.Expression node);
+}
diff --git a/pkg/compiler/lib/src/ir/util.dart b/pkg/compiler/lib/src/ir/util.dart
index 8a4a0c4..f286702 100644
--- a/pkg/compiler/lib/src/ir/util.dart
+++ b/pkg/compiler/lib/src/ir/util.dart
@@ -10,6 +10,16 @@
 import '../common.dart';
 import '../elements/entities.dart';
 
+/// Returns a textual representation of [node] that include the runtime type and
+/// hash code of the node and a one line prefix of the node toString text.
+String nodeToDebugString(ir.Node node, [int textLength = 40]) {
+  String blockText = node.toString().replaceAll('\n', ' ');
+  if (blockText.length > textLength) {
+    blockText = blockText.substring(0, textLength - 3) + '...';
+  }
+  return '(${node.runtimeType}:${node.hashCode})${blockText}';
+}
+
 /// Comparator for the canonical order or named arguments.
 // TODO(johnniwinther): Remove this when named parameters are sorted in dill.
 int namedOrdering(ir.VariableDeclaration a, ir.VariableDeclaration b) {
@@ -101,3 +111,99 @@
   }
   return null;
 }
+
+/// Check whether [node] is immediately guarded by a
+/// [ir.CheckLibraryIsLoaded], and hence the node is a deferred access.
+ir.LibraryDependency getDeferredImport(ir.TreeNode node) {
+  // Note: this code relies on the CFE generating the code as we expect it here.
+  // If one day we optimize away redundant CheckLibraryIsLoaded instructions,
+  // we'd need to derive this information directly from the CFE (See #35005),
+  ir.TreeNode parent = node.parent;
+
+  // TODO(sigmund): remove when CFE generates the correct tree (#35320). For
+  // instance, it currently generates
+  //
+  //   let _ = check(prefix) in (prefix::field.property)
+  //
+  // instead of:
+  //
+  //   (let _ = check(prefix) in prefix::field).property
+  if (node is ir.StaticGet) {
+    while (parent is ir.PropertyGet || parent is ir.MethodInvocation) {
+      parent = parent.parent;
+    }
+  }
+
+  if (parent is ir.Let) {
+    var initializer = parent.variable.initializer;
+    if (initializer is ir.CheckLibraryIsLoaded) {
+      return initializer.import;
+    }
+  }
+  return null;
+}
+
+class _FreeVariableVisitor implements ir.DartTypeVisitor<bool> {
+  const _FreeVariableVisitor();
+
+  bool visit(ir.DartType type) {
+    if (type != null) return type.accept(this);
+    return false;
+  }
+
+  bool visitList(List<ir.DartType> types) {
+    for (ir.DartType type in types) {
+      if (visit(type)) return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitTypedefType(ir.TypedefType node) {
+    return visitList(node.typeArguments);
+  }
+
+  @override
+  bool visitTypeParameterType(ir.TypeParameterType node) {
+    return true;
+  }
+
+  @override
+  bool visitFunctionType(ir.FunctionType node) {
+    if (visit(node.returnType)) return true;
+    if (visitList(node.positionalParameters)) return true;
+    for (ir.NamedType namedType in node.namedParameters) {
+      if (visit(namedType.type)) return true;
+    }
+    return false;
+  }
+
+  @override
+  bool visitInterfaceType(ir.InterfaceType node) {
+    return visitList(node.typeArguments);
+  }
+
+  @override
+  bool visitBottomType(ir.BottomType node) => false;
+
+  @override
+  bool visitVoidType(ir.VoidType node) => false;
+
+  @override
+  bool visitDynamicType(ir.DynamicType node) => false;
+
+  @override
+  bool visitInvalidType(ir.InvalidType node) => false;
+
+  @override
+  bool defaultDartType(ir.DartType node) {
+    throw new UnsupportedError("FreeVariableVisitor.defaultTypeNode");
+  }
+}
+
+/// Returns `true` if [type] contains a type variable.
+///
+/// All type variables (class type variables, generic method type variables,
+/// and function type variables) are considered.
+bool containsFreeVariables(ir.DartType type) =>
+    type.accept(const _FreeVariableVisitor());
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart
index 9893f5b..523cd66 100644
--- a/pkg/compiler/lib/src/js/js.dart
+++ b/pkg/compiler/lib/src/js/js.dart
@@ -69,20 +69,20 @@
 
   @override
   void emit(String string) {
+    monitor?.emit(string);
     outBuffer.add(string);
   }
 
   @override
   void enterNode(Node node, int startPosition) {
+    monitor?.enterNode(node, startPosition);
     codePositionListener.onStartPosition(node, startPosition);
   }
 
   @override
   void exitNode(
       Node node, int startPosition, int endPosition, int closingPosition) {
-    if (monitor != null) {
-      monitor.recordAstSize(node, endPosition - startPosition);
-    }
+    monitor?.exitNode(node, startPosition, endPosition, closingPosition);
     codePositionListener.onPositions(
         node, startPosition, endPosition, closingPosition);
   }
diff --git a/pkg/compiler/lib/src/js/js_debug.dart b/pkg/compiler/lib/src/js/js_debug.dart
index f58853e..d191491 100644
--- a/pkg/compiler/lib/src/js/js_debug.dart
+++ b/pkg/compiler/lib/src/js/js_debug.dart
@@ -52,9 +52,7 @@
     openAndCloseNode(node, '${node.runtimeType}', {'value': node.value});
   }
 
-  /**
-   * Pretty-prints given node tree into string.
-   */
+  /// Pretty-prints given node tree into string.
   static String prettyPrint(Node node) {
     var p = new DebugPrinter();
     node.accept(p);
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index b31697c..68fffe8 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -1251,6 +1251,12 @@
   js.Name visitName(js.Name node) => node;
 
   @override
+  js.Parentheses visitParentheses(js.Parentheses node) {
+    unsupported(node);
+    return null;
+  }
+
+  @override
   visitNamedFunction(js.NamedFunction node) {
     unsupported(node);
   }
@@ -2712,6 +2718,11 @@
   }
 
   @override
+  bool visitParentheses(js.Parentheses node) {
+    return visit(node.enclosed);
+  }
+
+  @override
   bool visitNamedFunction(js.NamedFunction node) {
     return false;
   }
diff --git a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
index 6e15c77..787e64c 100644
--- a/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/allocator_analysis.dart
@@ -33,8 +33,7 @@
 class KAllocatorAnalysis implements AllocatorAnalysis {
   final KernelToElementMap _elementMap;
 
-  final Map<KField, ConstantValue> _fixedInitializers =
-      <KField, ConstantValue>{};
+  final Map<KField, ConstantValue> _fixedInitializers = {};
 
   KAllocatorAnalysis(KernelFrontEndStrategy kernelStrategy)
       : _elementMap = kernelStrategy.elementMap;
@@ -44,12 +43,23 @@
   void registerInstantiatedClass(KClass class_) {
     ir.Class classNode = _elementMap.getClassNode(class_);
 
-    Set<ir.Field> nulls = new Set<ir.Field>();
+    Map<ir.Field, ConstantValue> inits = {};
     for (ir.Field field in classNode.fields) {
       if (!field.isInstanceMember) continue;
       ir.Expression initializer = field.initializer;
+      // TODO(sra): Should really be using constant evaluator to determine
+      // value.
       if (initializer == null || initializer is ir.NullLiteral) {
-        nulls.add(field);
+        inits[field] = const NullConstantValue();
+      } else if (initializer is ir.IntLiteral) {
+        BigInt intValue = BigInt.from(initializer.value).toUnsigned(64);
+        inits[field] = IntConstantValue(intValue);
+      } else if (initializer is ir.BoolLiteral) {
+        inits[field] = BoolConstantValue(initializer.value);
+      } else if (initializer is ir.StringLiteral) {
+        if (initializer.value.length <= 20) {
+          inits[field] = StringConstantValue(initializer.value);
+        }
       }
     }
 
@@ -58,15 +68,14 @@
         if (initializer is ir.FieldInitializer) {
           // TODO(sra): Check explicit initializer value to see if consistent
           // over all constructors.
-          nulls.remove(initializer.field);
+          inits.remove(initializer.field);
         }
       }
     }
 
-    for (var fieldNode in nulls) {
-      _fixedInitializers[_elementMap.getField(fieldNode)] =
-          const NullConstantValue();
-    }
+    inits.forEach((ir.Field fieldNode, ConstantValue value) {
+      _fixedInitializers[_elementMap.getField(fieldNode)] = value;
+    });
   }
 }
 
@@ -76,22 +85,19 @@
   static const String tag = 'allocator-analysis';
 
   // --csp and --fast-startup have different constraints to the generated code.
-  final CompilerOptions _options;
-  final Map<JField, ConstantValue> _fixedInitializers =
-      <JField, ConstantValue>{};
+  final Map<JField, ConstantValue> _fixedInitializers = {};
 
-  JAllocatorAnalysis._(this._options);
+  JAllocatorAnalysis._();
 
   /// Deserializes a [JAllocatorAnalysis] object from [source].
   factory JAllocatorAnalysis.readFromDataSource(
       DataSource source, CompilerOptions options) {
     source.begin(tag);
-    JAllocatorAnalysis analysis = new JAllocatorAnalysis._(options);
+    JAllocatorAnalysis analysis = new JAllocatorAnalysis._();
     int fieldCount = source.readInt();
     for (int i = 0; i < fieldCount; i++) {
       JField field = source.readMember();
-      // TODO(sra): Deserialize constant, when non-null is supported.
-      ConstantValue value = const NullConstantValue();
+      ConstantValue value = source.readConstant();
       analysis._fixedInitializers[field] = value;
     }
     source.end(tag);
@@ -104,19 +110,19 @@
     sink.writeInt(_fixedInitializers.length);
     _fixedInitializers.forEach((JField field, ConstantValue value) {
       sink.writeMember(field);
-      // TODO(sra): Serialize constant, when non-null is supported.
-      assert(value.isNull);
+      sink.writeConstant(value);
     });
     sink.end(tag);
   }
 
   static JAllocatorAnalysis from(KAllocatorAnalysis kAnalysis,
       JsToFrontendMap map, CompilerOptions options) {
-    var result = new JAllocatorAnalysis._(options);
+    var result = JAllocatorAnalysis._();
 
     kAnalysis._fixedInitializers.forEach((KField kField, ConstantValue value) {
-      // TODO(sra): Translate constant, but Null does not need translating.
-      if (value.isNull) {
+      // TODO(sra): Translate constant, but Null and these primitives do not
+      // need translating.
+      if (value.isNull || value.isInt || value.isBool || value.isString) {
         JField jField = map.toBackendMember(kField);
         if (jField != null) {
           result._fixedInitializers[jField] = value;
@@ -128,11 +134,6 @@
   }
 
   bool get _isEnabled {
-    if (_options.useContentSecurityPolicy && !_options.useStartupEmitter) {
-      // TODO(sra): Refactor csp 'precompiled' constructor generation to allow
-      // in-allocator initialization.
-      return false;
-    }
     return true;
   }
   // TODO(sra): Add way to let injected fields be initialized to a constant in
diff --git a/pkg/compiler/lib/src/js_backend/annotations.dart b/pkg/compiler/lib/src/js_backend/annotations.dart
index 025f6d8..15db202 100644
--- a/pkg/compiler/lib/src/js_backend/annotations.dart
+++ b/pkg/compiler/lib/src/js_backend/annotations.dart
@@ -9,17 +9,9 @@
 import '../diagnostics/diagnostic_listener.dart';
 import '../diagnostics/messages.dart';
 import '../elements/entities.dart';
-import '../native/native.dart' as native;
+import '../kernel/dart2js_target.dart';
 import '../serialization/serialization.dart';
 
-/// Returns `true` if parameter and returns types should be trusted for
-/// [element].
-bool _trustTypeAnnotations(KElementEnvironment elementEnvironment,
-    KCommonElements commonElements, MemberEntity element) {
-  return _hasAnnotation(elementEnvironment, element,
-      commonElements.expectTrustTypeAnnotationsClass);
-}
-
 /// Returns `true` if inference of parameter types is disabled for [element].
 bool _assumeDynamic(KElementEnvironment elementEnvironment,
     KCommonElements commonElements, MemberEntity element) {
@@ -42,141 +34,154 @@
   return false;
 }
 
-/// Process backend specific annotations.
-// TODO(johnniwinther): Merge this with [AnnotationProcessor].
-AnnotationsData processAnnotations(
+enum PragmaAnnotation {
+  noInline,
+  tryInline,
+  disableFinal,
+  noThrows,
+  noSideEffects,
+  trustTypeAnnotations,
+  assumeDynamic,
+}
+
+Set<PragmaAnnotation> processMemberAnnotations(
     DiagnosticReporter reporter,
     KCommonElements commonElements,
     KElementEnvironment elementEnvironment,
-    Iterable<MemberEntity> processedMembers) {
-  AnnotationsDataBuilder annotationsDataBuilder = new AnnotationsDataBuilder();
+    AnnotationsDataBuilder annotationsDataBuilder,
+    MemberEntity element) {
+  Set<PragmaAnnotation> values = new Set<PragmaAnnotation>();
+  bool hasNoInline = false;
+  bool hasTryInline = false;
+  bool disableFinal = false;
 
-  void processMemberAnnotations(MemberEntity element) {
-    bool hasNoInline = false;
-    bool hasTryInline = false;
+  if (_assumeDynamic(elementEnvironment, commonElements, element)) {
+    values.add(PragmaAnnotation.assumeDynamic);
+    annotationsDataBuilder.registerAssumeDynamic(element);
+  }
 
-    if (_trustTypeAnnotations(elementEnvironment, commonElements, element)) {
-      annotationsDataBuilder.registerTrustTypeAnnotations(element);
-    }
+  // TODO(sra): Check for inappropriate annotations on fields.
+  if (element.isField) {
+    return values;
+  }
 
-    if (_assumeDynamic(elementEnvironment, commonElements, element)) {
-      annotationsDataBuilder.registerAssumeDynamic(element);
-    }
+  FunctionEntity method = element;
+  LibraryEntity library = element.library;
+  bool platformAnnotationsAllowed = library.canonicalUri.scheme == 'dart' ||
+      maybeEnableNative(library.canonicalUri);
 
-    // TODO(sra): Check for inappropriate annotations on fields.
-    if (element.isField) return;
+  bool hasNoThrows = false;
+  bool hasNoSideEffects = false;
 
-    FunctionEntity method = element;
-    LibraryEntity library = element.library;
-    bool platformAnnotationsAllowed = library.canonicalUri.scheme == 'dart' ||
-        native.maybeEnableNative(library.canonicalUri);
+  for (ConstantValue constantValue
+      in elementEnvironment.getMemberMetadata(method)) {
+    if (!constantValue.isConstructedObject) continue;
+    ConstructedConstantValue value = constantValue;
+    ClassEntity cls = value.type.element;
+    assert(cls != null); // Unresolved classes null.
 
-    bool hasNoThrows = false;
-    bool hasNoSideEffects = false;
-
-    for (ConstantValue constantValue
-        in elementEnvironment.getMemberMetadata(method)) {
-      if (!constantValue.isConstructedObject) continue;
-      ConstructedConstantValue value = constantValue;
-      ClassEntity cls = value.type.element;
-      assert(cls != null); // Unresolved classes null.
-
-      if (platformAnnotationsAllowed) {
-        if (cls == commonElements.forceInlineClass) {
-          hasTryInline = true;
-        } else if (cls == commonElements.noInlineClass) {
-          hasNoInline = true;
-        } else if (cls == commonElements.noThrowsClass) {
-          hasNoThrows = true;
-          bool isValid = true;
-          if (method.isTopLevel) {
-            isValid = true;
-          } else if (method.isStatic) {
-            isValid = true;
-          } else if (method is ConstructorEntity &&
-              method.isFactoryConstructor) {
-            isValid = true;
-          }
-          if (!isValid) {
-            reporter.internalError(
-                method,
-                "@NoThrows() is currently limited to top-level"
-                " or static functions and factory constructors.");
-          }
-          annotationsDataBuilder.registerCannotThrow(method);
-        } else if (cls == commonElements.noSideEffectsClass) {
-          hasNoSideEffects = true;
-          annotationsDataBuilder.registerSideEffectsFree(method);
-        }
-      }
-
-      if (cls == commonElements.expectNoInlineClass) {
-        hasNoInline = true;
-      } else if (cls == commonElements.metaNoInlineClass) {
-        hasNoInline = true;
-      } else if (cls == commonElements.metaTryInlineClass) {
+    if (platformAnnotationsAllowed) {
+      if (cls == commonElements.forceInlineClass) {
         hasTryInline = true;
-      } else if (cls == commonElements.pragmaClass) {
-        // Recognize:
-        //
-        //     @pragma('dart2js:noInline')
-        //     @pragma('dart2js:tryInline')
-        //
-        ConstantValue nameValue =
-            value.fields[commonElements.pragmaClassNameField];
-        if (nameValue == null || !nameValue.isString) continue;
-        String name = (nameValue as StringConstantValue).stringValue;
-        if (!name.startsWith('dart2js:')) continue;
-
-        ConstantValue optionsValue =
-            value.fields[commonElements.pragmaClassOptionsField];
-        if (name == 'dart2js:noInline') {
-          if (!optionsValue.isNull) {
-            reporter.reportErrorMessage(element, MessageKind.GENERIC,
-                {'text': "@pragma('$name') annotation does not take options"});
-          }
-          hasNoInline = true;
-        } else if (name == 'dart2js:tryInline') {
-          if (!optionsValue.isNull) {
-            reporter.reportErrorMessage(element, MessageKind.GENERIC,
-                {'text': "@pragma('$name') annotation does not take options"});
-          }
-          hasTryInline = true;
-        } else if (!platformAnnotationsAllowed) {
-          reporter.reportErrorMessage(element, MessageKind.GENERIC,
-              {'text': "Unknown dart2js pragma @pragma('$name')"});
-        } else {
-          // Handle platform-only `@pragma` annotations.
+      } else if (cls == commonElements.noInlineClass) {
+        hasNoInline = true;
+      } else if (cls == commonElements.noThrowsClass) {
+        hasNoThrows = true;
+        bool isValid = true;
+        if (method.isTopLevel) {
+          isValid = true;
+        } else if (method.isStatic) {
+          isValid = true;
+        } else if (method is ConstructorEntity && method.isFactoryConstructor) {
+          isValid = true;
         }
+        if (!isValid) {
+          reporter.internalError(
+              method,
+              "@NoThrows() is currently limited to top-level"
+              " or static functions and factory constructors.");
+        }
+        annotationsDataBuilder.registerCannotThrow(method);
+      } else if (cls == commonElements.noSideEffectsClass) {
+        hasNoSideEffects = true;
+        annotationsDataBuilder.registerSideEffectsFree(method);
       }
     }
 
-    if (hasTryInline && hasNoInline) {
-      reporter.reportErrorMessage(element, MessageKind.GENERIC,
-          {'text': '@tryInline must not be used with @noInline.'});
-      hasTryInline = false;
-    }
-    if (hasNoInline) {
-      annotationsDataBuilder.markAsNonInlinable(method);
-    }
-    if (hasTryInline) {
-      annotationsDataBuilder.markAsTryInline(method);
-    }
-    if (hasNoThrows && !hasNoInline) {
-      reporter.internalError(
-          method, "@NoThrows() should always be combined with @noInline.");
-    }
-    if (hasNoSideEffects && !hasNoInline) {
-      reporter.internalError(
-          method, "@NoSideEffects() should always be combined with @noInline.");
+    if (cls == commonElements.expectNoInlineClass) {
+      hasNoInline = true;
+    } else if (cls == commonElements.metaNoInlineClass) {
+      hasNoInline = true;
+    } else if (cls == commonElements.metaTryInlineClass) {
+      hasTryInline = true;
+    } else if (cls == commonElements.pragmaClass) {
+      // Recognize:
+      //
+      //     @pragma('dart2js:noInline')
+      //     @pragma('dart2js:tryInline')
+      //
+      ConstantValue nameValue =
+          value.fields[commonElements.pragmaClassNameField];
+      if (nameValue == null || !nameValue.isString) continue;
+      String name = (nameValue as StringConstantValue).stringValue;
+      if (!name.startsWith('dart2js:')) continue;
+
+      ConstantValue optionsValue =
+          value.fields[commonElements.pragmaClassOptionsField];
+      if (name == 'dart2js:noInline') {
+        if (!optionsValue.isNull) {
+          reporter.reportErrorMessage(element, MessageKind.GENERIC,
+              {'text': "@pragma('$name') annotation does not take options"});
+        }
+        hasNoInline = true;
+      } else if (name == 'dart2js:tryInline') {
+        if (!optionsValue.isNull) {
+          reporter.reportErrorMessage(element, MessageKind.GENERIC,
+              {'text': "@pragma('$name') annotation does not take options"});
+        }
+        hasTryInline = true;
+      } else if (!platformAnnotationsAllowed) {
+        reporter.reportErrorMessage(element, MessageKind.GENERIC,
+            {'text': "Unknown dart2js pragma @pragma('$name')"});
+      } else {
+        // Handle platform-only `@pragma` annotations.
+        if (name == 'dart2js:disableFinal') {
+          if (!optionsValue.isNull) {
+            reporter.reportErrorMessage(element, MessageKind.GENERIC,
+                {'text': "@pragma('$name') annotation does not take options"});
+          }
+          disableFinal = true;
+        }
+      }
     }
   }
 
-  for (MemberEntity entity in processedMembers) {
-    processMemberAnnotations(entity);
+  if (hasTryInline && hasNoInline) {
+    reporter.reportErrorMessage(element, MessageKind.GENERIC,
+        {'text': '@tryInline must not be used with @noInline.'});
+    hasTryInline = false;
   }
-
-  return annotationsDataBuilder;
+  if (hasNoInline) {
+    values.add(PragmaAnnotation.noInline);
+    annotationsDataBuilder.markAsNonInlinable(method);
+  }
+  if (hasTryInline) {
+    values.add(PragmaAnnotation.tryInline);
+    annotationsDataBuilder.markAsTryInline(method);
+  }
+  if (disableFinal) {
+    values.add(PragmaAnnotation.disableFinal);
+    annotationsDataBuilder.markAsDisableFinal(method);
+  }
+  if (hasNoThrows && !hasNoInline) {
+    reporter.internalError(
+        method, "@NoThrows() should always be combined with @noInline.");
+  }
+  if (hasNoSideEffects && !hasNoInline) {
+    reporter.internalError(
+        method, "@NoSideEffects() should always be combined with @noInline.");
+  }
+  return values;
 }
 
 abstract class AnnotationsData {
@@ -187,21 +192,23 @@
   /// Serializes this [AnnotationsData] to [sink].
   void writeToDataSink(DataSink sink);
 
-  /// Functions with a `@NoInline()` or `@noInline` annotation.
+  /// Functions with a `@NoInline()`, `@noInline`, or
+  /// `@pragma('dart2js:noInline')` annotation.
   Iterable<FunctionEntity> get nonInlinableFunctions;
 
-  /// Functions with a `@ForceInline()` or `@tryInline` annotation.
+  /// Functions with a `@ForceInline()`, `@tryInline`, or
+  /// `@pragma('dart2js:tryInline')` annotation.
   Iterable<FunctionEntity> get tryInlineFunctions;
 
+  /// Functions with a `@pragma('dart2js:disable-final')` annotation.
+  Iterable<FunctionEntity> get disableFinalFunctions;
+
   /// Functions with a `@NoThrows()` annotation.
   Iterable<FunctionEntity> get cannotThrowFunctions;
 
   /// Functions with a `@NoSideEffects()` annotation.
   Iterable<FunctionEntity> get sideEffectFreeFunctions;
 
-  /// Members with a `@TrustTypeAnnotations()` annotation.
-  Iterable<MemberEntity> get trustTypeAnnotationsMembers;
-
   /// Members with a `@AssumeDynamic()` annotation.
   Iterable<MemberEntity> get assumeDynamicMembers;
 }
@@ -213,34 +220,46 @@
 
   final Iterable<FunctionEntity> nonInlinableFunctions;
   final Iterable<FunctionEntity> tryInlineFunctions;
+  final Iterable<FunctionEntity> disableFinalFunctions;
   final Iterable<FunctionEntity> cannotThrowFunctions;
   final Iterable<FunctionEntity> sideEffectFreeFunctions;
-  final Iterable<MemberEntity> trustTypeAnnotationsMembers;
   final Iterable<MemberEntity> assumeDynamicMembers;
 
   AnnotationsDataImpl(
       this.nonInlinableFunctions,
       this.tryInlineFunctions,
+      this.disableFinalFunctions,
       this.cannotThrowFunctions,
       this.sideEffectFreeFunctions,
-      this.trustTypeAnnotationsMembers,
       this.assumeDynamicMembers);
 
   factory AnnotationsDataImpl.readFromDataSource(DataSource source) {
     source.begin(tag);
-    Iterable<FunctionEntity> nonInlinableFunctions = source.readMembers();
-    Iterable<FunctionEntity> tryInlineFunctions = source.readMembers();
-    Iterable<FunctionEntity> cannotThrowFunctions = source.readMembers();
-    Iterable<FunctionEntity> sideEffectFreeFunctions = source.readMembers();
-    Iterable<MemberEntity> trustTypeAnnotationsMembers = source.readMembers();
-    Iterable<MemberEntity> assumeDynamicMembers = source.readMembers();
+    Iterable<FunctionEntity> nonInlinableFunctions =
+        source.readMembers<FunctionEntity>(emptyAsNull: true) ??
+            const <FunctionEntity>[];
+    Iterable<FunctionEntity> tryInlineFunctions =
+        source.readMembers<FunctionEntity>(emptyAsNull: true) ??
+            const <FunctionEntity>[];
+    Iterable<FunctionEntity> disableFinalFunctions =
+        source.readMembers<FunctionEntity>(emptyAsNull: true) ??
+            const <FunctionEntity>[];
+    Iterable<FunctionEntity> cannotThrowFunctions =
+        source.readMembers<FunctionEntity>(emptyAsNull: true) ??
+            const <FunctionEntity>[];
+    Iterable<FunctionEntity> sideEffectFreeFunctions =
+        source.readMembers<FunctionEntity>(emptyAsNull: true) ??
+            const <FunctionEntity>[];
+    Iterable<MemberEntity> assumeDynamicMembers =
+        source.readMembers<MemberEntity>(emptyAsNull: true) ??
+            const <MemberEntity>[];
     source.end(tag);
     return new AnnotationsDataImpl(
         nonInlinableFunctions,
         tryInlineFunctions,
+        disableFinalFunctions,
         cannotThrowFunctions,
         sideEffectFreeFunctions,
-        trustTypeAnnotationsMembers,
         assumeDynamicMembers);
   }
 
@@ -248,54 +267,67 @@
     sink.begin(tag);
     sink.writeMembers(nonInlinableFunctions);
     sink.writeMembers(tryInlineFunctions);
+    sink.writeMembers(disableFinalFunctions);
     sink.writeMembers(cannotThrowFunctions);
     sink.writeMembers(sideEffectFreeFunctions);
-    sink.writeMembers(trustTypeAnnotationsMembers);
     sink.writeMembers(assumeDynamicMembers);
     sink.end(tag);
   }
 }
 
 class AnnotationsDataBuilder implements AnnotationsData {
-  List<FunctionEntity> _nonInlinableFunctions = <FunctionEntity>[];
-  List<FunctionEntity> _tryInlinableFunctions = <FunctionEntity>[];
-  List<FunctionEntity> _cannotThrowFunctions = <FunctionEntity>[];
-  List<FunctionEntity> _sideEffectFreeFunctions = <FunctionEntity>[];
-  List<MemberEntity> _trustTypeAnnotationsMembers = <MemberEntity>[];
-  List<MemberEntity> _assumeDynamicMembers = <MemberEntity>[];
+  List<FunctionEntity> _nonInlinableFunctions;
+  List<FunctionEntity> _tryInlinableFunctions;
+  List<FunctionEntity> _disableFinalFunctions;
+  List<FunctionEntity> _cannotThrowFunctions;
+  List<FunctionEntity> _sideEffectFreeFunctions;
+  List<MemberEntity> _trustTypeAnnotationsMembers;
+  List<MemberEntity> _assumeDynamicMembers;
 
   void markAsNonInlinable(FunctionEntity function) {
+    _nonInlinableFunctions ??= <FunctionEntity>[];
     _nonInlinableFunctions.add(function);
   }
 
   void markAsTryInline(FunctionEntity function) {
+    _tryInlinableFunctions ??= <FunctionEntity>[];
     _tryInlinableFunctions.add(function);
   }
 
+  void markAsDisableFinal(FunctionEntity function) {
+    _disableFinalFunctions ??= <FunctionEntity>[];
+    _disableFinalFunctions.add(function);
+  }
+
   void registerCannotThrow(FunctionEntity function) {
+    _cannotThrowFunctions ??= <FunctionEntity>[];
     _cannotThrowFunctions.add(function);
   }
 
   void registerSideEffectsFree(FunctionEntity function) {
+    _sideEffectFreeFunctions ??= <FunctionEntity>[];
     _sideEffectFreeFunctions.add(function);
   }
 
-  void registerTrustTypeAnnotations(MemberEntity member) {
-    _trustTypeAnnotationsMembers.add(member);
-  }
-
   void registerAssumeDynamic(MemberEntity member) {
+    _assumeDynamicMembers ??= <MemberEntity>[];
     _assumeDynamicMembers.add(member);
   }
 
-  Iterable<FunctionEntity> get nonInlinableFunctions => _nonInlinableFunctions;
-  Iterable<FunctionEntity> get tryInlineFunctions => _tryInlinableFunctions;
-  Iterable<FunctionEntity> get cannotThrowFunctions => _cannotThrowFunctions;
+  Iterable<FunctionEntity> get nonInlinableFunctions =>
+      _nonInlinableFunctions ?? const <FunctionEntity>[];
+  Iterable<FunctionEntity> get tryInlineFunctions =>
+      _tryInlinableFunctions ?? const <FunctionEntity>[];
+  Iterable<FunctionEntity> get disableFinalFunctions =>
+      _disableFinalFunctions ?? const <FunctionEntity>[];
+  Iterable<FunctionEntity> get cannotThrowFunctions =>
+      _cannotThrowFunctions ?? const <FunctionEntity>[];
   Iterable<FunctionEntity> get sideEffectFreeFunctions =>
-      _sideEffectFreeFunctions;
+      _sideEffectFreeFunctions ?? const <FunctionEntity>[];
   Iterable<MemberEntity> get trustTypeAnnotationsMembers =>
-      _trustTypeAnnotationsMembers;
-  Iterable<MemberEntity> get assumeDynamicMembers => _assumeDynamicMembers;
+      _trustTypeAnnotationsMembers ?? const <MemberEntity>[];
+  Iterable<MemberEntity> get assumeDynamicMembers =>
+      _assumeDynamicMembers ?? const <MemberEntity>[];
 
   void writeToDataSink(DataSink sink) {
     throw new UnsupportedError('AnnotationsDataBuilder.writeToDataSink');
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index c65153b..be118eb 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -9,7 +9,8 @@
 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
 import '../common/names.dart' show Uris;
 import '../common/tasks.dart' show CompilerTask;
-import '../common_elements.dart' show CommonElements, ElementEnvironment;
+import '../common_elements.dart'
+    show CommonElements, ElementEnvironment, JElementEnvironment;
 import '../compiler.dart' show Compiler;
 import '../constants/constant_system.dart';
 import '../deferred_load.dart' show DeferredLoadTask;
@@ -18,6 +19,7 @@
 import '../elements/types.dart';
 import '../enqueue.dart' show Enqueuer, EnqueueTask, ResolutionEnqueuer;
 import '../frontend_strategy.dart';
+import '../inferrer/types.dart';
 import '../io/source_information.dart'
     show SourceInformation, SourceInformationStrategy;
 import '../js/js.dart' as jsAst;
@@ -26,14 +28,14 @@
 import '../js/rewrite_async.dart';
 import '../js_emitter/js_emitter.dart' show CodeEmitterTask;
 import '../js_emitter/sorter.dart' show Sorter;
-import '../library_loader.dart' show LoadedLibraries;
-import '../native/native.dart' as native;
+import '../kernel/dart2js_target.dart';
+import '../native/enqueue.dart';
 import '../ssa/ssa.dart' show SsaFunctionCompiler;
 import '../tracer.dart';
-import '../types/types.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/class_hierarchy.dart'
     show ClassHierarchyBuilder, ClassQueries;
+import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart' show Selector;
 import '../universe/use.dart' show StaticUse;
 import '../universe/world_builder.dart';
@@ -53,7 +55,6 @@
 import 'impact_transformer.dart';
 import 'inferred_data.dart';
 import 'interceptor_data.dart';
-import 'js_interop_analysis.dart' show JsInteropAnalysis;
 import 'namer.dart';
 import 'native_data.dart';
 import 'no_such_method_registry.dart';
@@ -312,20 +313,10 @@
 
   CodeEmitterTask emitter;
 
-  /**
-   * The generated code as a js AST for compiled methods.
-   */
+  /// The generated code as a js AST for compiled methods.
   final Map<MemberEntity, jsAst.Expression> generatedCode =
       <MemberEntity, jsAst.Expression>{};
 
-  /// If [true], the compiler will emit code that logs whenever a method is
-  /// called. When TRACE_METHOD is 'console' this will be logged
-  /// directly in the JavaScript console. When TRACE_METHOD is 'post' the
-  /// information will be sent to a server via a POST request.
-  static const String TRACE_METHOD = const String.fromEnvironment('traceCalls');
-  static const bool TRACE_CALLS =
-      TRACE_METHOD == 'post' || TRACE_METHOD == 'console';
-
   Namer _namer;
 
   Namer get namer {
@@ -334,9 +325,7 @@
     return _namer;
   }
 
-  /**
-   * Set of classes whose `operator ==` methods handle `null` themselves.
-   */
+  /// Set of classes whose `operator ==` methods handle `null` themselves.
   final Set<ClassEntity> specialOperatorEqClasses = new Set<ClassEntity>();
 
   List<CompilerTask> get tasks {
@@ -364,9 +353,6 @@
 
   KAllocatorAnalysis _allocatorResolutionAnalysis;
 
-  /// Codegen support for typed JavaScript interop.
-  JsInteropAnalysis jsInteropAnalysis;
-
   /// Support for classifying `noSuchMethod` implementations.
   NoSuchMethodRegistry noSuchMethodRegistry;
 
@@ -391,14 +377,13 @@
 
   final SuperMemberData superMemberData = new SuperMemberData();
 
-  native.NativeResolutionEnqueuer _nativeResolutionEnqueuer;
-  native.NativeCodegenEnqueuer _nativeCodegenEnqueuer;
+  NativeResolutionEnqueuer _nativeResolutionEnqueuer;
+  NativeCodegenEnqueuer _nativeCodegenEnqueuer;
 
   Tracer tracer;
 
   JavaScriptBackend(this.compiler,
       {bool generateSourceMap: true,
-      bool useStartupEmitter: false,
       bool useMultiSourceInfo: false,
       bool useNewSourceInfo: false})
       : this.sourceInformationStrategy =
@@ -408,10 +393,7 @@
     _backendUsageBuilder =
         new BackendUsageBuilderImpl(compiler.frontendStrategy);
     _checkedModeHelpers = new CheckedModeHelpers();
-    emitter =
-        new CodeEmitterTask(compiler, generateSourceMap, useStartupEmitter);
-    jsInteropAnalysis = new JsInteropAnalysis(this);
-
+    emitter = new CodeEmitterTask(compiler, generateSourceMap);
     noSuchMethodRegistry = new NoSuchMethodRegistryImpl(
         commonElements, compiler.frontendStrategy.createNoSuchMethodResolver());
     functionCompiler = new SsaFunctionCompiler(
@@ -552,9 +534,8 @@
     NativeBasicData nativeBasicData = compiler.frontendStrategy.nativeBasicData;
     RuntimeTypesNeedBuilder rtiNeedBuilder =
         compiler.frontendStrategy.createRuntimeTypesNeedBuilder();
-    BackendImpacts impacts =
-        new BackendImpacts(compiler.options, commonElements);
-    _nativeResolutionEnqueuer = new native.NativeResolutionEnqueuer(
+    BackendImpacts impacts = new BackendImpacts(commonElements);
+    _nativeResolutionEnqueuer = new NativeResolutionEnqueuer(
         compiler.options,
         elementEnvironment,
         commonElements,
@@ -586,6 +567,8 @@
     InterceptorDataBuilder interceptorDataBuilder =
         new InterceptorDataBuilderImpl(
             nativeBasicData, elementEnvironment, commonElements);
+    AnnotationsDataBuilder annotationsDataBuilder =
+        new AnnotationsDataBuilder();
     return new ResolutionEnqueuer(
         task,
         compiler.options,
@@ -612,12 +595,14 @@
             _allocatorResolutionAnalysis,
             _nativeResolutionEnqueuer,
             noSuchMethodRegistry,
+            annotationsDataBuilder,
             const StrongModeWorldStrategy(),
             classHierarchyBuilder,
             classQueries),
         compiler.frontendStrategy.createResolutionWorkItemBuilder(
             nativeBasicData,
             _nativeDataBuilder,
+            annotationsDataBuilder,
             impactTransformer,
             compiler.impactCache));
   }
@@ -630,14 +615,13 @@
       GlobalTypeInferenceResults globalInferenceResults) {
     ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
     CommonElements commonElements = closedWorld.commonElements;
-    BackendImpacts impacts =
-        new BackendImpacts(compiler.options, commonElements);
+    BackendImpacts impacts = new BackendImpacts(commonElements);
     _customElementsCodegenAnalysis = new CustomElementsCodegenAnalysis(
         constantSystem,
         commonElements,
         elementEnvironment,
         closedWorld.nativeData);
-    _nativeCodegenEnqueuer = new native.NativeCodegenEnqueuer(
+    _nativeCodegenEnqueuer = new NativeCodegenEnqueuer(
         compiler.options,
         elementEnvironment,
         commonElements,
@@ -707,16 +691,14 @@
     return worldImpact;
   }
 
-  native.NativeResolutionEnqueuer get nativeResolutionEnqueuerForTesting =>
+  NativeResolutionEnqueuer get nativeResolutionEnqueuerForTesting =>
       _nativeResolutionEnqueuer;
 
-  native.NativeEnqueuer get nativeCodegenEnqueuer => _nativeCodegenEnqueuer;
+  NativeEnqueuer get nativeCodegenEnqueuer => _nativeCodegenEnqueuer;
 
-  /**
-   * Unit test hook that returns code of an element as a String.
-   *
-   * Invariant: [element] must be a declaration element.
-   */
+  /// Unit test hook that returns code of an element as a String.
+  ///
+  /// Invariant: [element] must be a declaration element.
   String getGeneratedCode(MemberEntity element) {
     return jsAst.prettyPrint(generatedCode[element],
         enableMinification: compiler.options.enableMinification);
@@ -729,10 +711,8 @@
     return programSize;
   }
 
-  /**
-   * Returns [:true:] if the checking of [type] is performed directly on the
-   * object and not on an interceptor.
-   */
+  /// Returns [:true:] if the checking of [type] is performed directly on the
+  /// object and not on an interceptor.
   bool hasDirectCheckFor(CommonElements commonElements, DartType type) {
     if (!type.isInterfaceType) return false;
     InterfaceType interfaceType = type;
@@ -754,7 +734,7 @@
   void setAnnotations(LibraryEntity library) {
     AnnotationProcessor processor =
         compiler.frontendStrategy.annotationProcesser;
-    if (native.maybeEnableNative(library.canonicalUri)) {
+    if (maybeEnableNative(library.canonicalUri)) {
       processor.extractNativeAnnotations(library);
     }
     processor.extractJsInteropAnnotations(library);
@@ -764,18 +744,6 @@
     }
   }
 
-  /// This method is called when all new libraries loaded through
-  /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
-  /// have been computed.
-  void onLibrariesLoaded(
-      CommonElements commonElements, LoadedLibraries loadedLibraries) {
-    if (loadedLibraries.containsLibrary(Uris.dart_core)) {
-      assert(loadedLibraries.containsLibrary(Uris.dart_core));
-      assert(loadedLibraries.containsLibrary(Uris.dart__interceptors));
-      assert(loadedLibraries.containsLibrary(Uris.dart__js_helper));
-    }
-  }
-
   /// Called when the compiler starts running the codegen enqueuer. The
   /// [WorldImpact] of enabled backend features is returned.
   WorldImpact onCodegenStart(JClosedWorld closedWorld,
@@ -794,8 +762,7 @@
     emitter.createEmitter(namer, closedWorld, codegenWorldBuilder, sorter);
     // TODO(johnniwinther): Share the impact object created in
     // createCodegenEnqueuer.
-    BackendImpacts impacts =
-        new BackendImpacts(compiler.options, closedWorld.commonElements);
+    BackendImpacts impacts = new BackendImpacts(closedWorld.commonElements);
     if (compiler.options.disableRtiOptimization) {
       _rtiSubstitutions = new TrivialRuntimeTypesSubstitutions(closedWorld);
       _rtiChecksBuilder =
@@ -833,7 +800,7 @@
 
   jsAst.Expression rewriteAsync(
       CommonElements commonElements,
-      ElementEnvironment elementEnvironment,
+      JElementEnvironment elementEnvironment,
       CodegenRegistry registry,
       FunctionEntity element,
       jsAst.Expression code,
@@ -909,20 +876,14 @@
 
   AsyncRewriter _makeAsyncRewriter(
       CommonElements commonElements,
-      ElementEnvironment elementEnvironment,
+      JElementEnvironment elementEnvironment,
       CodegenRegistry registry,
       FunctionEntity element,
       jsAst.Expression code,
       DartType elementType,
       jsAst.Name name) {
-    bool startAsyncSynchronously = compiler.options.startAsyncSynchronously;
-
-    var startFunction = startAsyncSynchronously
-        ? commonElements.asyncHelperStartSync
-        : commonElements.asyncHelperStart;
-    var completerFactory = startAsyncSynchronously
-        ? commonElements.asyncAwaitCompleterFactory
-        : commonElements.syncCompleterFactory;
+    var startFunction = commonElements.asyncHelperStartSync;
+    var completerFactory = commonElements.asyncAwaitCompleterFactory;
 
     List<jsAst.Expression> itemTypeExpression = _fetchItemType(elementType);
 
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 704ac1a..f553d9f 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -8,7 +8,6 @@
 import '../common_elements.dart' show CommonElements, ElementEnvironment;
 import '../elements/types.dart' show InterfaceType;
 import '../elements/entities.dart';
-import '../options.dart' show CompilerOptions;
 import '../universe/selector.dart';
 import '../universe/world_impact.dart'
     show WorldImpact, WorldImpactBuilder, WorldImpactBuilderImpl;
@@ -89,10 +88,9 @@
 
 /// The JavaScript backend dependencies for various features.
 class BackendImpacts {
-  final CompilerOptions _options;
   final CommonElements _commonElements;
 
-  BackendImpacts(this._options, this._commonElements);
+  BackendImpacts(this._commonElements);
 
   BackendImpact _getRuntimeTypeArgument;
 
@@ -128,21 +126,14 @@
 
   BackendImpact _asyncBody;
 
-  BackendImpact get asyncBody => _asyncBody ??= () {
-        var staticUses = [
-          _commonElements.asyncHelperAwait,
-          _commonElements.asyncHelperReturn,
-          _commonElements.asyncHelperRethrow,
-          _commonElements.streamIteratorConstructor,
-          _commonElements.wrapBody
-        ];
-        if (_options.startAsyncSynchronously) {
-          staticUses.add(_commonElements.asyncHelperStartSync);
-        } else {
-          staticUses.add(_commonElements.asyncHelperStart);
-        }
-        return new BackendImpact(staticUses: staticUses);
-      }();
+  BackendImpact get asyncBody => _asyncBody ??= new BackendImpact(staticUses: [
+        _commonElements.asyncHelperAwait,
+        _commonElements.asyncHelperReturn,
+        _commonElements.asyncHelperRethrow,
+        _commonElements.streamIteratorConstructor,
+        _commonElements.wrapBody,
+        _commonElements.asyncHelperStartSync
+      ]);
 
   BackendImpact _syncStarBody;
 
@@ -462,14 +453,6 @@
     return _typeCheck ??= new BackendImpact(otherImpacts: [boolValues]);
   }
 
-  BackendImpact _malformedTypeCheck;
-
-  BackendImpact get malformedTypeCheck {
-    return _malformedTypeCheck ??= new BackendImpact(staticUses: [
-      _commonElements.throwTypeError,
-    ]);
-  }
-
   BackendImpact _genericTypeCheck;
 
   BackendImpact get genericTypeCheck {
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index efe00d9..39612fd 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -7,6 +7,7 @@
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../frontend_strategy.dart';
+import '../ir/runtime_type_analysis.dart';
 import '../serialization/serialization.dart';
 import '../universe/feature.dart';
 import '../util/util.dart' show Setlet;
diff --git a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
index ed231cc..71bb262 100644
--- a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
@@ -154,12 +154,10 @@
       new Map<String, CheckedModeHelper>.fromIterable(helpers,
           key: (helper) => helper.name);
 
-  /**
-   * Returns the checked mode helper that will be needed to do a type check/type
-   * cast on [type] at runtime. Note that this method is being called both by
-   * the resolver with interface types (int, String, ...), and by the SSA
-   * backend with implementation types (JSInt, JSString, ...).
-   */
+  /// Returns the checked mode helper that will be needed to do a type
+  /// check/type cast on [type] at runtime. Note that this method is being
+  /// called both by the resolver with interface types (int, String, ...), and
+  /// by the SSA backend with implementation types (JSInt, JSString, ...).
   CheckedModeHelper getCheckedModeHelper(
       DartType type, CommonElements commonElements,
       {bool typeCast}) {
@@ -167,11 +165,9 @@
         typeCast: typeCast, nativeCheckOnly: false);
   }
 
-  /**
-   * Returns the native checked mode helper that will be needed to do a type
-   * check/type cast on [type] at runtime. If no native helper exists for
-   * [type], [:null:] is returned.
-   */
+  /// Returns the native checked mode helper that will be needed to do a type
+  /// check/type cast on [type] at runtime. If no native helper exists for
+  /// [type], [:null:] is returned.
   CheckedModeHelper getNativeCheckedModeHelper(
       DartType type, CommonElements commonElements,
       {bool typeCast}) {
@@ -179,10 +175,9 @@
         typeCast: typeCast, nativeCheckOnly: true);
   }
 
-  /**
-   * Returns the checked mode helper for the type check/type cast for [type]. If
-   * [nativeCheckOnly] is [:true:], only names for native helpers are returned.
-   */
+  /// Returns the checked mode helper for the type check/type cast for
+  /// [type]. If [nativeCheckOnly] is [:true:], only names for native helpers
+  /// are returned.
   CheckedModeHelper getCheckedModeHelperInternal(
       DartType type, CommonElements commonElements,
       {bool typeCast, bool nativeCheckOnly}) {
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 2d2ddea..3fb4475 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -12,7 +12,7 @@
 import '../js/js.dart' show js;
 import '../js_emitter/code_emitter_task.dart';
 import '../options.dart';
-import '../universe/world_builder.dart';
+import '../universe/codegen_world_builder.dart';
 import 'allocator_analysis.dart' show JAllocatorAnalysis;
 import 'constant_system_javascript.dart';
 import 'js_backend.dart';
@@ -22,13 +22,11 @@
 
 typedef jsAst.Expression _ConstantListGenerator(jsAst.Expression array);
 
-/**
- * Generates the JavaScript expressions for constants.
- *
- * It uses a given [constantReferenceGenerator] to reference nested constants
- * (if there are some). It is hence up to that function to decide which
- * constants should be inlined or not.
- */
+/// Generates the JavaScript expressions for constants.
+///
+/// It uses a given [constantReferenceGenerator] to reference nested constants
+/// (if there are some). It is hence up to that function to decide which
+/// constants should be inlined or not.
 class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
   // Matches blank lines, comment lines and trailing comments that can't be part
   // of a string.
@@ -45,11 +43,9 @@
   final _ConstantReferenceGenerator constantReferenceGenerator;
   final _ConstantListGenerator makeConstantList;
 
-  /**
-   * The given [constantReferenceGenerator] function must, when invoked with a
-   * constant, either return a reference or return its literal expression if it
-   * can be inlined.
-   */
+  /// The given [constantReferenceGenerator] function must, when invoked with a
+  /// constant, either return a reference or return its literal expression if it
+  /// can be inlined.
   ConstantEmitter(
       this._options,
       this._commonElements,
@@ -63,11 +59,9 @@
 
   Emitter get _emitter => _task.emitter;
 
-  /**
-   * Constructs a literal expression that evaluates to the constant. Uses a
-   * canonical name unless the constant can be emitted multiple times (as for
-   * numbers and strings).
-   */
+  /// Constructs a literal expression that evaluates to the constant. Uses a
+  /// canonical name unless the constant can be emitted multiple times (as for
+  /// numbers and strings).
   jsAst.Expression generate(ConstantValue constant) {
     return _visit(constant);
   }
@@ -171,11 +165,9 @@
     }
   }
 
-  /**
-   * Write the contents of the quoted string to a [CodeBuffer] in
-   * a form that is valid as JavaScript string literal content.
-   * The string is assumed quoted by double quote characters.
-   */
+  /// Write the contents of the quoted string to a [CodeBuffer] in
+  /// a form that is valid as JavaScript string literal content.
+  /// The string is assumed quoted by double quote characters.
   @override
   jsAst.Expression visitString(StringConstantValue constant, [_]) {
     return js.escapedString(constant.stringValue, ascii: true);
@@ -385,11 +377,6 @@
   }
 
   @override
-  jsAst.Expression visitDeferred(DeferredConstantValue constant, [_]) {
-    return constantReferenceGenerator(constant.referenced);
-  }
-
-  @override
   jsAst.Expression visitDeferredGlobal(DeferredGlobalConstantValue constant,
       [_]) {
     return constantReferenceGenerator(constant.referenced);
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index d454cf3..6b9de6a 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -31,14 +31,12 @@
   ConstantSystem get constantSystem => dartConstantSystem;
 }
 
-/**
- * The [JavaScriptConstantCompiler] is used to keep track of compile-time
- * constants, initializations of global and static fields, and default values of
- * optional parameters for the JavaScript interpretation of constants.
- */
+/// The [JavaScriptConstantCompiler] is used to keep track of compile-time
+/// constants, initializations of global and static fields, and default values
+/// of optional parameters for the JavaScript interpretation of constants.
 class JavaScriptConstantCompiler implements BackendConstantEnvironment {
   // TODO(johnniwinther): Move this to the backend constant handler.
-  /** Caches the statics where the initial value cannot be eagerly compiled. */
+  /// Caches the statics where the initial value cannot be eagerly compiled.
   final Set<FieldEntity> lazyStatics = new Set<FieldEntity>();
 
   JavaScriptConstantCompiler();
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
index 8b0d237..21eabbf 100644
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
@@ -28,10 +28,8 @@
   }
 }
 
-/**
- * In JavaScript we truncate the result to an unsigned 32 bit integer. Also, -0
- * is treated as if it was the integer 0.
- */
+/// In JavaScript we truncate the result to an unsigned 32 bit integer. Also, -0
+/// is treated as if it was the integer 0.
 class JavaScriptBinaryBitOperation implements BinaryOperation {
   final BinaryBitOperation dartBitOperation;
 
@@ -223,10 +221,8 @@
   }
 }
 
-/**
- * Constant system following the semantics for Dart code that has been
- * compiled to JavaScript.
- */
+/// Constant system following the semantics for Dart code that has been
+/// compiled to JavaScript.
 class JavaScriptConstantSystem extends ConstantSystem {
   final BITS32 = new BigInt.from(0xFFFFFFFF);
 
@@ -269,10 +265,8 @@
 
   JavaScriptConstantSystem._internal();
 
-  /**
-   * Returns true if [value] will turn into NaN or infinity
-   * at runtime.
-   */
+  /// Returns true if [value] will turn into NaN or infinity
+  /// at runtime.
   bool integerBecomesNanOrInfinity(BigInt value) {
     double doubleValue = value.toDouble();
     return doubleValue.isNaN || doubleValue.isInfinite;
@@ -411,13 +405,11 @@
 }
 
 class JavaScriptMapConstant extends MapConstantValue {
-  /**
-   * The [PROTO_PROPERTY] must not be used as normal property in any JavaScript
-   * object. It would change the prototype chain.
-   */
+  /// The [PROTO_PROPERTY] must not be used as normal property in any JavaScript
+  /// object. It would change the prototype chain.
   static const String PROTO_PROPERTY = "__proto__";
 
-  /** The dart class implementing constant map literals. */
+  /// The dart class implementing constant map literals.
   static const String DART_CLASS = "ConstantMap";
   static const String DART_STRING_CLASS = "ConstantStringMap";
   static const String DART_PROTO_CLASS = "ConstantProtoMap";
diff --git a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
index 4b27e24..79a4453 100644
--- a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
@@ -14,43 +14,41 @@
 import 'backend_usage.dart' show BackendUsageBuilder;
 import 'native_data.dart';
 
-/**
- * Support for Custom Elements.
- *
- * The support for custom elements the compiler builds a table that maps the
- * custom element class's [Type] to the interceptor for the class and the
- * constructor(s) for the class.
- *
- * We want the table to contain only the custom element classes used, and we
- * want to avoid resolving and compiling constructors that are not used since
- * that may bring in unused code.  This class controls the resolution and code
- * generation to restrict the impact.
- *
- * The following line of code requires the generation of the generative
- * constructor factory function(s) for FancyButton, and their insertion into the
- * table:
- *
- *     document.register(FancyButton, 'x-fancy-button');
- *
- * We detect this by 'joining' the classes that are referenced as type literals
- * with the classes that are custom elements, enabled by detecting the presence
- * of the table access code used by document.register.
- *
- * We have to be more conservative when the type is unknown, e.g.
- *
- *     document.register(classMirror.reflectedType, tagFromMetadata);
- *
- * and
- *
- *     class Component<T> {
- *       final tag;
- *       Component(this.tag);
- *       void register() => document.register(T, tag);
- *     }
- *     const Component<FancyButton>('x-fancy-button').register();
- *
- * In these cases we conservatively generate all viable entries in the table.
- */
+/// Support for Custom Elements.
+///
+/// The support for custom elements the compiler builds a table that maps the
+/// custom element class's [Type] to the interceptor for the class and the
+/// constructor(s) for the class.
+///
+/// We want the table to contain only the custom element classes used, and we
+/// want to avoid resolving and compiling constructors that are not used since
+/// that may bring in unused code.  This class controls the resolution and code
+/// generation to restrict the impact.
+///
+/// The following line of code requires the generation of the generative
+/// constructor factory function(s) for FancyButton, and their insertion into
+/// the table:
+///
+///     document.register(FancyButton, 'x-fancy-button');
+///
+/// We detect this by 'joining' the classes that are referenced as type literals
+/// with the classes that are custom elements, enabled by detecting the presence
+/// of the table access code used by document.register.
+///
+/// We have to be more conservative when the type is unknown, e.g.
+///
+///     document.register(classMirror.reflectedType, tagFromMetadata);
+///
+/// and
+///
+///     class Component<T> {
+///       final tag;
+///       Component(this.tag);
+///       void register() => document.register(T, tag);
+///     }
+///     const Component<FancyButton>('x-fancy-button').register();
+///
+/// In these cases we conservatively generate all viable entries in the table.
 abstract class CustomElementsAnalysisBase {
   final NativeBasicData _nativeData;
   final ElementEnvironment _elementEnvironment;
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 7b8589b..72910ae 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -14,7 +14,8 @@
 import '../elements/types.dart';
 import '../enqueue.dart';
 import '../options.dart';
-import '../universe/world_builder.dart';
+import '../universe/codegen_world_builder.dart';
+import '../universe/member_usage.dart';
 import '../universe/use.dart'
     show
         ConstantUse,
diff --git a/pkg/compiler/lib/src/js_backend/field_naming_mixin.dart b/pkg/compiler/lib/src/js_backend/field_naming_mixin.dart
index f7e8984..828dd25 100644
--- a/pkg/compiler/lib/src/js_backend/field_naming_mixin.dart
+++ b/pkg/compiler/lib/src/js_backend/field_naming_mixin.dart
@@ -33,13 +33,11 @@
   }
 }
 
-/**
- * Encapsulates the global state of field naming.
- *
- * The field naming registry allocates names to be used along a path in the
- * inheritance hierarchy of fields, starting with the object class. The actual
- * hierarchy is encoded using instances of [_FieldNamingScope].
- */
+/// Encapsulates the global state of field naming.
+///
+/// The field naming registry allocates names to be used along a path in the
+/// inheritance hierarchy of fields, starting with the object class. The actual
+/// hierarchy is encoded using instances of [_FieldNamingScope].
 class _FieldNamingRegistry {
   final Namer namer;
 
@@ -82,18 +80,16 @@
   }
 }
 
-/**
- * A [_FieldNamingScope] encodes a node in the inheritance tree of the current
- * class hierarchy. The root node typically is the node corresponding to the
- * `Object` class. It is used to assign a unique name to each field of a class.
- * Unique here means unique wrt. all fields along the path back to the root.
- * This is achieved at construction time via the [_fieldNameCounter] field that
- * counts the number of fields on the path to the root node that have been
- * encountered so far.
- *
- * Obviously, this only works if no fields are added to a parent node after its
- * children have added their first field.
- */
+/// A [_FieldNamingScope] encodes a node in the inheritance tree of the current
+/// class hierarchy. The root node typically is the node corresponding to the
+/// `Object` class. It is used to assign a unique name to each field of a class.
+/// Unique here means unique wrt. all fields along the path back to the root.
+/// This is achieved at construction time via the [_fieldNameCounter] field that
+/// counts the number of fields on the path to the root node that have been
+/// encountered so far.
+///
+/// Obviously, this only works if no fields are added to a parent node after its
+/// children have added their first field.
 class _FieldNamingScope {
   final _FieldNamingScope superScope;
   final Entity container;
@@ -160,9 +156,7 @@
     _fieldNameCounter = superScope.inheritanceBasedFieldNameCounter;
   }
 
-  /**
-   * Checks whether [name] is already used in the current scope chain.
-   */
+  /// Checks whether [name] is already used in the current scope chain.
   _isNameUnused(jsAst.Name name) {
     return !names.values.contains(name) &&
         ((superScope == null) || superScope._isNameUnused(name));
@@ -187,15 +181,13 @@
   bool containsField(Entity field) => names.containsKey(field);
 }
 
-/**
- * Field names for mixins have two constraints: They need to be unique in the
- * hierarchy of each application of a mixin and they need to be the same for
- * all applications of a mixin. To achieve this, we use global naming for
- * mixins from the same name pool as fields and add a `$` at the end to ensure
- * they do not collide with normal field names. The `$` sign is typically used
- * as a separator between method names and argument counts and does not appear
- * in generated names themselves.
- */
+/// Field names for mixins have two constraints: They need to be unique in the
+/// hierarchy of each application of a mixin and they need to be the same for
+/// all applications of a mixin. To achieve this, we use global naming for
+/// mixins from the same name pool as fields and add a `$` at the end to ensure
+/// they do not collide with normal field names. The `$` sign is typically used
+/// as a separator between method names and argument counts and does not appear
+/// in generated names themselves.
 class _MixinFieldNamingScope extends _FieldNamingScope {
   int get _localFieldNameCounter => registry.globalCount;
   void set _localFieldNameCounter(int val) {
@@ -218,12 +210,10 @@
   }
 }
 
-/**
- * [BoxFieldElement] fields work differently in that they do not belong to an
- * actual class but an anonymous box associated to a [Local]. As there is no
- * inheritance chain, we do not need to compute fields a priori but can assign
- * names on the fly.
- */
+/// [BoxFieldElement] fields work differently in that they do not belong to an
+/// actual class but an anonymous box associated to a [Local]. As there is no
+/// inheritance chain, we do not need to compute fields a priori but can assign
+/// names on the fly.
 class _BoxFieldNamingScope extends _FieldNamingScope {
   _BoxFieldNamingScope(Local box, _FieldNamingRegistry registry)
       : super.rootScope(box, registry);
diff --git a/pkg/compiler/lib/src/js_backend/frequency_namer.dart b/pkg/compiler/lib/src/js_backend/frequency_namer.dart
index 343d440..781d1ef 100644
--- a/pkg/compiler/lib/src/js_backend/frequency_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/frequency_namer.dart
@@ -21,6 +21,9 @@
   final String getterPrefix = 'g';
   final String setterPrefix = 's';
   final String callPrefix = ''; // this will create function names $<n>
+  String get operatorIsPrefix => r'$i';
+  String get operatorAsPrefix => r'$a';
+  String get callCatchAllName => r'$C';
   String get requiredParameterField => r'$R';
   String get defaultValuesField => r'$D';
   String get operatorSignature => r'$S';
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 282086e..9a04642 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -16,7 +16,7 @@
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../native/enqueue.dart';
-import '../native/native.dart' as native;
+import '../native/behavior.dart';
 import '../options.dart';
 import '../universe/feature.dart';
 import '../universe/use.dart'
@@ -286,7 +286,7 @@
       }
     }
 
-    for (native.NativeBehavior behavior in worldImpact.nativeData) {
+    for (NativeBehavior behavior in worldImpact.nativeData) {
       _nativeResolutionEnqueuer.registerNativeBehavior(
           transformed, behavior, worldImpact);
     }
@@ -317,9 +317,6 @@
     type = _elementEnvironment.getUnaliasedType(type);
     registerImpact(_impacts.typeCheck);
 
-    if (type.isMalformed) {
-      registerImpact(_impacts.malformedTypeCheck);
-    }
     if (!type.treatAsRaw || type.containsTypeVariables || type.isFunctionType) {
       registerImpact(_impacts.genericTypeCheck);
       if (type.isTypeVariable) {
diff --git a/pkg/compiler/lib/src/js_backend/inferred_data.dart b/pkg/compiler/lib/src/js_backend/inferred_data.dart
index 73bb493..d68b500 100644
--- a/pkg/compiler/lib/src/js_backend/inferred_data.dart
+++ b/pkg/compiler/lib/src/js_backend/inferred_data.dart
@@ -6,8 +6,8 @@
 
 import '../common.dart';
 import '../elements/entities.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../serialization/serialization.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/selector.dart';
 import '../universe/side_effects.dart';
 import '../world.dart';
diff --git a/pkg/compiler/lib/src/js_backend/interceptor_data.dart b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
index 833c7c7..06c66ae 100644
--- a/pkg/compiler/lib/src/js_backend/interceptor_data.dart
+++ b/pkg/compiler/lib/src/js_backend/interceptor_data.dart
@@ -9,9 +9,9 @@
     show CommonElements, KCommonElements, KElementEnvironment;
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../js/js.dart' as jsAst;
 import '../serialization/serialization.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/selector.dart';
 import '../world.dart' show JClosedWorld;
 import 'namer.dart';
@@ -182,7 +182,9 @@
     return elements.any((element) {
       return selector.applies(element) &&
           (mask == null ||
-              closedWorld.abstractValueDomain.canHit(mask, element, selector));
+              closedWorld.abstractValueDomain
+                  .isTargetingMember(mask, element, selector.memberName)
+                  .isPotentiallyTrue);
     });
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/js_interop_analysis.dart b/pkg/compiler/lib/src/js_backend/js_interop_analysis.dart
index 5e9c4cb..225d9b5 100644
--- a/pkg/compiler/lib/src/js_backend/js_interop_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/js_interop_analysis.dart
@@ -9,50 +9,46 @@
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
 import '../universe/selector.dart' show Selector;
+import '../universe/codegen_world_builder.dart';
 import '../universe/world_builder.dart' show SelectorConstraints;
-import 'js_backend.dart' show JavaScriptBackend;
+import 'namer.dart';
+import 'native_data.dart';
 
-class JsInteropAnalysis {
-  final JavaScriptBackend backend;
+jsAst.Statement buildJsInteropBootstrap(CodegenWorldBuilder codegenWorldBuilder,
+    NativeBasicData nativeBasicData, Namer namer) {
+  if (!nativeBasicData.isJsInteropUsed) return null;
+  List<jsAst.Statement> statements = <jsAst.Statement>[];
+  codegenWorldBuilder.forEachInvokedName(
+      (String name, Map<Selector, SelectorConstraints> selectors) {
+    selectors.forEach((Selector selector, SelectorConstraints constraints) {
+      if (selector.isClosureCall) {
+        // TODO(jacobr): support named arguments.
+        if (selector.namedArgumentCount > 0) return;
+        int argumentCount = selector.argumentCount;
+        String candidateParameterNames =
+            'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+        List<String> parameters = new List<String>.generate(
+            argumentCount, (i) => candidateParameterNames[i]);
 
-  JsInteropAnalysis(this.backend);
-
-  jsAst.Statement buildJsInteropBootstrap() {
-    if (!backend.compiler.frontendStrategy.nativeBasicData.isJsInteropUsed)
-      return null;
-    List<jsAst.Statement> statements = <jsAst.Statement>[];
-    backend.compiler.codegenWorldBuilder.forEachInvokedName(
-        (String name, Map<Selector, SelectorConstraints> selectors) {
-      selectors.forEach((Selector selector, SelectorConstraints constraints) {
-        if (selector.isClosureCall) {
-          // TODO(jacobr): support named arguments.
-          if (selector.namedArgumentCount > 0) return;
-          int argumentCount = selector.argumentCount;
-          var candidateParameterNames =
-              'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
-          var parameters = new List<String>.generate(
-              argumentCount, (i) => candidateParameterNames[i]);
-
-          var name = backend.namer.invocationName(selector);
-          statements.add(js.statement(
-              'Function.prototype.# = function(#) { return this(#) }',
-              [name, parameters, parameters]));
-        }
-      });
+        jsAst.Name name = namer.invocationName(selector);
+        statements.add(js.statement(
+            'Function.prototype.# = function(#) { return this(#) }',
+            [name, parameters, parameters]));
+      }
     });
-    return new jsAst.Block(statements);
-  }
+  });
+  return new jsAst.Block(statements);
+}
 
-  FunctionType buildJsFunctionType() {
-    // TODO(jacobr): consider using codegenWorldBuilder.isChecks to determine the
-    // range of positional arguments that need to be supported by JavaScript
-    // function types.
-    return new FunctionType(
-        const DynamicType(),
-        const <DartType>[],
-        new List<DartType>.filled(16, const DynamicType()),
-        const <String>[],
-        const <DartType>[],
-        const <FunctionTypeVariable>[]);
-  }
+FunctionType buildJsFunctionType() {
+  // TODO(jacobr): consider using codegenWorldBuilder.isChecks to determine the
+  // range of positional arguments that need to be supported by JavaScript
+  // function types.
+  return new FunctionType(
+      const DynamicType(),
+      const <DartType>[],
+      new List<DartType>.filled(16, const DynamicType()),
+      const <String>[],
+      const <DartType>[],
+      const <FunctionTypeVariable>[]);
 }
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index b701376..2d772ff 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -4,9 +4,7 @@
 
 part of js_backend.namer;
 
-/**
- * Assigns JavaScript identifiers to Dart variables, class-names and members.
- */
+/// Assigns JavaScript identifiers to Dart variables, class-names and members.
 class MinifyNamer extends Namer
     with
         _MinifiedFieldNamer,
@@ -27,6 +25,9 @@
   final String getterPrefix = 'g';
   final String setterPrefix = 's';
   final String callPrefix = ''; // this will create function names $<n>
+  String get operatorIsPrefix => r'$i';
+  String get operatorAsPrefix => r'$a';
+  String get callCatchAllName => r'$C';
   String get requiredParameterField => r'$R';
   String get defaultValuesField => r'$D';
   String get operatorSignature => r'$S';
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index a6674a7..9e7a95b 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -26,8 +26,8 @@
 import '../js_model/closure.dart';
 import '../js_model/elements.dart' show JGeneratorBody;
 import '../universe/call_structure.dart' show CallStructure;
+import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart' show Selector, SelectorKind;
-import '../universe/world_builder.dart' show CodegenWorldBuilder;
 import '../util/util.dart';
 import '../world.dart' show JClosedWorld;
 import 'backend.dart';
@@ -40,103 +40,101 @@
 part 'minify_namer.dart';
 part 'namer_names.dart';
 
-/**
- * Assigns JavaScript identifiers to Dart variables, class-names and members.
- *
- * Names are generated through three stages:
- *
- * 1. Original names and proposed names
- * 2. Disambiguated names (also known as "mangled names")
- * 3. Annotated names
- *
- * Original names are names taken directly from the input.
- *
- * Proposed names are either original names or synthesized names for input
- * elements that do not have original names.
- *
- * Disambiguated names are derived from the above, but are mangled to ensure
- * uniqueness within some namespace (e.g. as fields on the same JS object).
- * In [MinifyNamer], disambiguated names are also minified.
- *
- * Annotated names are names generated from a disambiguated name. Annotated
- * names must be computable at runtime by prefixing/suffixing constant strings
- * onto the disambiguated name.
- *
- * For example, some entity called `x` might be associated with these names:
- *
- *     Original name: `x`
- *
- *     Disambiguated name: `x1` (if something else was called `x`)
- *
- *     Annotated names: `x1`     (field name)
- *                      `get$x1` (getter name)
- *                      `set$x1` (setter name)
- *
- * The [Namer] can choose the disambiguated names, and to some degree the
- * prefix/suffix constants used to construct annotated names. It cannot choose
- * annotated names with total freedom, for example, it cannot choose that the
- * getter for `x1` should be called `getX` -- the annotated names are always
- * built by concatenation.
- *
- * Disambiguated names must be chosen such that none of the annotated names can
- * clash with each other. This may happen even if the disambiguated names are
- * distinct, for example, suppose a field `x` and `get$x` exists in the input:
- *
- *     Original names: `x` and `get$x`
- *
- *     Disambiguated names: `x` and `get$x` (the two names a different)
- *
- *     Annotated names: `x` (field for `x`)
- *                      `get$x` (getter for `x`)
- *                      `get$x` (field for `get$x`)
- *                      `get$get$x` (getter for `get$x`)
- *
- * The getter for `x` clashes with the field name for `get$x`, so the
- * disambiguated names are invalid.
- *
- * Additionally, disambiguated names must be chosen such that all annotated
- * names are valid JavaScript identifiers and do not coincide with a native
- * JavaScript property such as `__proto__`.
- *
- * The following annotated names are generated for instance members, where
- * <NAME> denotes the disambiguated name.
- *
- * 0. The disambiguated name can itself be seen as an annotated name.
- *
- * 1. Multiple annotated names exist for the `call` method, encoding arity and
- *    named parameters with the pattern:
- *
- *       call$<N>$namedParam1...$namedParam<M>
- *
- *    where <N> is the number of parameters (required and optional) and <M> is
- *    the number of named parameters, and namedParam<n> are the names of the
- *    named parameters in alphabetical order.
- *
- *    Note that the same convention is used for the *proposed name* of other
- *    methods. Thus, for ordinary methods, the suffix becomes embedded in the
- *    disambiguated name (and can be minified), whereas for the 'call' method,
- *    the suffix is an annotation that must be computable at runtime
- *    (and thus cannot be minified).
- *
- *    Note that the ordering of named parameters is not encapsulated in the
- *    [Namer], and is hardcoded into other components, such as [Element] and
- *    [Selector].
- *
- * 2. The getter/setter for a field:
- *
- *        get$<NAME>
- *        set$<NAME>
- *
- *    (The [getterPrefix] and [setterPrefix] are different in [MinifyNamer]).
- *
- * 3. The `is` and operator uses the following names:
- *
- *        $is<NAME>
- *        $as<NAME>
- *
- * For local variables, the [Namer] only provides *proposed names*. These names
- * must be disambiguated elsewhere.
- */
+/// Assigns JavaScript identifiers to Dart variables, class-names and members.
+///
+/// Names are generated through three stages:
+///
+/// 1. Original names and proposed names
+/// 2. Disambiguated names (also known as "mangled names")
+/// 3. Annotated names
+///
+/// Original names are names taken directly from the input.
+///
+/// Proposed names are either original names or synthesized names for input
+/// elements that do not have original names.
+///
+/// Disambiguated names are derived from the above, but are mangled to ensure
+/// uniqueness within some namespace (e.g. as fields on the same JS object).
+/// In [MinifyNamer], disambiguated names are also minified.
+///
+/// Annotated names are names generated from a disambiguated name. Annotated
+/// names must be computable at runtime by prefixing/suffixing constant strings
+/// onto the disambiguated name.
+///
+/// For example, some entity called `x` might be associated with these names:
+///
+///     Original name: `x`
+///
+///     Disambiguated name: `x1` (if something else was called `x`)
+///
+///     Annotated names: `x1`     (field name)
+///                      `get$x1` (getter name)
+///                      `set$x1` (setter name)
+///
+/// The [Namer] can choose the disambiguated names, and to some degree the
+/// prefix/suffix constants used to construct annotated names. It cannot choose
+/// annotated names with total freedom, for example, it cannot choose that the
+/// getter for `x1` should be called `getX` -- the annotated names are always
+/// built by concatenation.
+///
+/// Disambiguated names must be chosen such that none of the annotated names can
+/// clash with each other. This may happen even if the disambiguated names are
+/// distinct, for example, suppose a field `x` and `get$x` exists in the input:
+///
+///     Original names: `x` and `get$x`
+///
+///     Disambiguated names: `x` and `get$x` (the two names a different)
+///
+///     Annotated names: `x` (field for `x`)
+///                      `get$x` (getter for `x`)
+///                      `get$x` (field for `get$x`)
+///                      `get$get$x` (getter for `get$x`)
+///
+/// The getter for `x` clashes with the field name for `get$x`, so the
+/// disambiguated names are invalid.
+///
+/// Additionally, disambiguated names must be chosen such that all annotated
+/// names are valid JavaScript identifiers and do not coincide with a native
+/// JavaScript property such as `__proto__`.
+///
+/// The following annotated names are generated for instance members, where
+/// <NAME> denotes the disambiguated name.
+///
+/// 0. The disambiguated name can itself be seen as an annotated name.
+///
+/// 1. Multiple annotated names exist for the `call` method, encoding arity and
+///    named parameters with the pattern:
+///
+///       call$<N>$namedParam1...$namedParam<M>
+///
+///    where <N> is the number of parameters (required and optional) and <M> is
+///    the number of named parameters, and namedParam<n> are the names of the
+///    named parameters in alphabetical order.
+///
+///    Note that the same convention is used for the *proposed name* of other
+///    methods. Thus, for ordinary methods, the suffix becomes embedded in the
+///    disambiguated name (and can be minified), whereas for the 'call' method,
+///    the suffix is an annotation that must be computable at runtime
+///    (and thus cannot be minified).
+///
+///    Note that the ordering of named parameters is not encapsulated in the
+///    [Namer], and is hardcoded into other components, such as [Element] and
+///    [Selector].
+///
+/// 2. The getter/setter for a field:
+///
+///        get$<NAME>
+///        set$<NAME>
+///
+///    (The [getterPrefix] and [setterPrefix] are different in [MinifyNamer]).
+///
+/// 3. The `is` and operator uses the following names:
+///
+///        $is<NAME>
+///        $as<NAME>
+///
+/// For local variables, the [Namer] only provides *proposed names*. These names
+/// must be disambiguated elsewhere.
 class Namer {
   static const List<String> javaScriptKeywords = const <String>[
     // ES5 7.6.1.1 Keywords.
@@ -447,8 +445,6 @@
   final String superPrefix = r'super$';
   final String metadataField = '@';
   final String callPrefix = 'call';
-  // Note: We can't shorten 'call*' in the minified namers because the catch-all
-  // formula `name + "*"` is used by mirrors.
   String get callCatchAllName => r'call*';
   final String callNameField = r'$callName';
   final String stubNameField = r'$stubName';
@@ -475,7 +471,6 @@
   jsAst.Name _literalAsyncPrefix;
   jsAst.Name _literalGetterPrefix;
   jsAst.Name _literalSetterPrefix;
-  jsAst.Name _literalLazyGetterPrefix;
 
   jsAst.Name _staticsPropertyName;
 
@@ -518,22 +513,34 @@
   /// Although global names are distributed across a number of global objects,
   /// (see [globalObjectFor]), we currently use a single namespace for all these
   /// names.
-  final NamingScope globalScope = new NamingScope();
-  final Map<Entity, jsAst.Name> userGlobals = new HashMap<Entity, jsAst.Name>();
-  final Map<String, jsAst.Name> internalGlobals =
-      new HashMap<String, jsAst.Name>();
+  final NamingScope globalScope = NamingScope();
+  final Map<Entity, jsAst.Name> userGlobals = {};
+  // [userGlobalsSecondName] is used when an entity has a second name, e.g. a
+  // lazily initialized static variable has a location and a getter.
+  final Map<Entity, jsAst.Name> userGlobalsSecondName = {};
+  final Map<String, jsAst.Name> internalGlobals = {};
+
+  _registerName(
+      Map<String, String> map, jsAst.Name jsName, String originalName) {
+    // Non-finalized names are not present in the output program
+    if (jsName is TokenName && !jsName.isFinalized) return;
+    map[jsName.name] = originalName;
+    var getterName = userGetters[jsName];
+    if (getterName != null) map[getterName.name] = originalName;
+    var setterName = userSetters[jsName];
+    if (setterName != null) map[setterName.name] = originalName;
+  }
 
   Map<String, String> createMinifiedGlobalNameMap() {
     var map = <String, String>{};
     userGlobals.forEach((entity, jsName) {
-      // Non-finalized names are not present in the output program
-      if (jsName is TokenName && !jsName.isFinalized) return;
-      map[jsName.name] = entity.name;
+      _registerName(map, jsName, entity.name);
+    });
+    userGlobalsSecondName.forEach((entity, jsName) {
+      _registerName(map, jsName, entity.name);
     });
     internalGlobals.forEach((name, jsName) {
-      // Non-finalized names are not present in the output program
-      if (jsName is TokenName && !jsName.isFinalized) return;
-      map[jsName.name] = name;
+      _registerName(map, jsName, name);
     });
     return map;
   }
@@ -541,36 +548,27 @@
   /// Used disambiguated names in the instance namespace, issued by
   /// [_disambiguateMember], [_disambiguateInternalMember],
   /// [_disambiguateOperator], and [reservePublicMemberName].
-  final NamingScope instanceScope = new NamingScope();
-  final Map<String, jsAst.Name> userInstanceMembers =
-      new HashMap<String, jsAst.Name>();
-  final Map<String, String> userInstanceMembersOriginalName =
-      new HashMap<String, String>();
-  final Map<MemberEntity, jsAst.Name> internalInstanceMembers =
-      new HashMap<MemberEntity, jsAst.Name>();
-  final Map<String, jsAst.Name> userInstanceOperators =
-      new HashMap<String, jsAst.Name>();
+  final NamingScope instanceScope = NamingScope();
+  final Map<String, jsAst.Name> userInstanceMembers = HashMap();
+  final Map<String, String> userInstanceMembersOriginalName = HashMap();
+  final Map<MemberEntity, jsAst.Name> internalInstanceMembers = HashMap();
+  final Map<String, jsAst.Name> userInstanceOperators = HashMap();
+  final Map<jsAst.Name, jsAst.Name> userGetters = HashMap();
+  final Map<jsAst.Name, jsAst.Name> userSetters = HashMap();
 
   Map<String, String> createMinifiedInstanceNameMap() {
     var map = <String, String>{};
     internalInstanceMembers.forEach((entity, jsName) {
-      // Non-finalized names are not present in the output program
-      if (jsName is TokenName && !jsName.isFinalized) return;
-      map[jsName.name] = entity.name;
+      _registerName(map, jsName, entity.name);
     });
     userInstanceMembers.forEach((name, jsName) {
-      // Non-finalized names are not present in the output program
-      if (jsName is TokenName && !jsName.isFinalized) return;
-      var originalName = userInstanceMembersOriginalName[name];
-      map[jsName.name] = originalName ?? name;
+      _registerName(map, jsName, userInstanceMembersOriginalName[name] ?? name);
     });
 
     // TODO(sigmund): reverse the operator names back to the original Dart
     // names.
     userInstanceOperators.forEach((name, jsName) {
-      // Non-finalized names are not present in the output program
-      if (jsName is TokenName && !jsName.isFinalized) return;
-      map[jsName.name] = name;
+      _registerName(map, jsName, name);
     });
     return map;
   }
@@ -579,39 +577,29 @@
   final NamingScope constantScope = new NamingScope();
 
   /// Used to store scopes for instances of [PrivatelyNamedJsEntity]
-  final Map<Entity, NamingScope> _privateNamingScopes =
-      new Map<Entity, NamingScope>();
+  final Map<Entity, NamingScope> _privateNamingScopes = {};
 
-  final Map<String, int> popularNameCounters = <String, int>{};
+  final Map<String, int> popularNameCounters = {};
 
-  final Map<LibraryEntity, String> libraryLongNames =
-      new HashMap<LibraryEntity, String>();
+  final Map<LibraryEntity, String> libraryLongNames = HashMap();
 
-  final Map<ConstantValue, jsAst.Name> constantNames =
-      new HashMap<ConstantValue, jsAst.Name>();
-  final Map<ConstantValue, String> constantLongNames =
-      <ConstantValue, String>{};
+  final Map<ConstantValue, jsAst.Name> constantNames = HashMap();
+  final Map<ConstantValue, String> constantLongNames = {};
   ConstantCanonicalHasher _constantHasher;
 
   /// Maps private names to a library that may use that name without prefixing
   /// itself. Used for building proposed names.
-  final Map<String, LibraryEntity> shortPrivateNameOwners =
-      <String, LibraryEntity>{};
-
-  final Map<String, String> suggestedGlobalNames = <String, String>{};
-  final Map<String, String> suggestedInstanceNames = <String, String>{};
+  final Map<String, LibraryEntity> shortPrivateNameOwners = {};
 
   /// Used to store unique keys for library names. Keys are not used as names,
   /// nor are they visible in the output. The only serve as an internal
   /// key into maps.
-  final Map<LibraryEntity, String> _libraryKeys =
-      new HashMap<LibraryEntity, String>();
+  final Map<LibraryEntity, String> _libraryKeys = HashMap();
 
   Namer(this._closedWorld, this._codegenWorldBuilder) {
     _literalAsyncPrefix = new StringBackedName(asyncPrefix);
     _literalGetterPrefix = new StringBackedName(getterPrefix);
     _literalSetterPrefix = new StringBackedName(setterPrefix);
-    _literalLazyGetterPrefix = new StringBackedName(lazyGetterPrefix);
   }
 
   ElementEnvironment get elementEnvironment => _closedWorld.elementEnvironment;
@@ -626,10 +614,8 @@
   String get isolatePropertiesName => r'$isolateProperties';
   jsAst.Name get noSuchMethodName => invocationName(Selectors.noSuchMethod_);
 
-  /**
-   * Some closures must contain their name. The name is stored in
-   * [STATIC_CLOSURE_NAME_NAME].
-   */
+  /// Some closures must contain their name. The name is stored in
+  /// [STATIC_CLOSURE_NAME_NAME].
   String get STATIC_CLOSURE_NAME_NAME => r'$name';
   String get closureInvocationSelectorName => Identifiers.call;
   bool get shouldMinify => false;
@@ -773,17 +759,15 @@
     return 'c\$${target.nestingLevel}';
   }
 
-  /**
-   * If the [originalName] is not private returns [originalName]. Otherwise
-   * mangles the [originalName] so that each library has its own distinguished
-   * version of the name.
-   *
-   * Although the name is not guaranteed to be unique within any namespace,
-   * clashes are very unlikely in practice. Therefore, it can be used in cases
-   * where uniqueness is nice but not a strict requirement.
-   *
-   * The resulting name is a *proposed name* and is never minified.
-   */
+  /// If the [originalName] is not private returns [originalName]. Otherwise
+  /// mangles the [originalName] so that each library has its own distinguished
+  /// version of the name.
+  ///
+  /// Although the name is not guaranteed to be unique within any namespace,
+  /// clashes are very unlikely in practice. Therefore, it can be used in cases
+  /// where uniqueness is nice but not a strict requirement.
+  ///
+  /// The resulting name is a *proposed name* and is never minified.
   String privateName(Name originalName) {
     String text = originalName.text;
 
@@ -943,26 +927,20 @@
         CURRENT_ELEMENT_SPANNABLE, 'Unexpected special selector: $selector');
   }
 
-  /**
-   * Returns the internal name used for an invocation mirror of this selector.
-   */
+  /// Returns the internal name used for an invocation mirror of this selector.
   jsAst.Name invocationMirrorInternalName(Selector selector) =>
       invocationName(selector);
 
-  /**
-   * Returns the disambiguated name for the given field, used for constructing
-   * the getter and setter names.
-   */
+  /// Returns the disambiguated name for the given field, used for constructing
+  /// the getter and setter names.
   jsAst.Name fieldAccessorName(FieldEntity element) {
     return element.isInstanceMember
         ? _disambiguateMember(element.memberName)
         : _disambiguateGlobalMember(element);
   }
 
-  /**
-   * Returns name of the JavaScript property used to store a static or instance
-   * field.
-   */
+  /// Returns name of the JavaScript property used to store a static or instance
+  /// field.
   jsAst.Name fieldPropertyName(FieldEntity element) {
     return element.isInstanceMember
         ? instanceFieldPropertyName(element)
@@ -993,9 +971,7 @@
   jsAst.Name globalPropertyNameForType(Entity element) =>
       _disambiguateGlobalType(element);
 
-  /**
-   * Returns the JavaScript property name used to store an instance field.
-   */
+  /// Returns the JavaScript property name used to store an instance field.
   jsAst.Name instanceFieldPropertyName(FieldEntity element) {
     ClassEntity enclosingClass = element.enclosingClass;
 
@@ -1077,14 +1053,16 @@
   jsAst.Name deriveSetterName(jsAst.Name disambiguatedName) {
     // We dynamically create setters from the field-name. The setter name must
     // therefore be derived from the instance field-name.
-    return new SetterName(_literalSetterPrefix, disambiguatedName);
+    return userSetters[disambiguatedName] ??=
+        new SetterName(_literalSetterPrefix, disambiguatedName);
   }
 
   /// Annotated name for the setter of any member with [disambiguatedName].
   jsAst.Name deriveGetterName(jsAst.Name disambiguatedName) {
     // We dynamically create getters from the field-name. The getter name must
     // therefore be derived from the instance field-name.
-    return new GetterName(_literalGetterPrefix, disambiguatedName);
+    return userGetters[disambiguatedName] ??=
+        new GetterName(_literalGetterPrefix, disambiguatedName);
   }
 
   /// Annotated name for the getter of [element].
@@ -1145,25 +1123,26 @@
   }
 
   jsAst.Name _disambiguateGlobalMember(MemberEntity element) {
-    return _disambiguateGlobal<MemberEntity>(element, _proposeNameForMember);
+    return _disambiguateGlobal<MemberEntity>(
+        element, _proposeNameForMember, userGlobals);
   }
 
   jsAst.Name _disambiguateGlobalType(Entity element) {
-    return _disambiguateGlobal(element, _proposeNameForType);
+    return _disambiguateGlobal(element, _proposeNameForType, userGlobals);
   }
 
   /// Returns the disambiguated name for a top-level or static element.
   ///
   /// The resulting name is unique within the global-member namespace.
-  jsAst.Name _disambiguateGlobal<T extends Entity>(
-      T element, String proposeName(T element)) {
+  jsAst.Name _disambiguateGlobal<T extends Entity>(T element,
+      String proposeName(T element), Map<Entity, jsAst.Name> globals) {
     // TODO(asgerf): We can reuse more short names if we disambiguate with
     // a separate namespace for each of the global holder objects.
-    jsAst.Name newName = userGlobals[element];
+    jsAst.Name newName = globals[element];
     if (newName == null) {
       String proposedName = proposeName(element);
       newName = getFreshName(globalScope, proposedName);
-      userGlobals[element] = newName;
+      globals[element] = newName;
     }
     return _newReference(newName);
   }
@@ -1402,6 +1381,10 @@
     return element.name.replaceAll('+', '_');
   }
 
+  String _proposeNameForLazyStaticGetter(MemberEntity element) {
+    return r'$get$' + _proposeNameForMember(element);
+  }
+
   String _proposeNameForConstructor(ConstructorEntity element) {
     String className = element.enclosingClass.name;
     if (element.isGenerativeConstructor) {
@@ -1413,10 +1396,8 @@
     }
   }
 
-  /**
-   * Returns a proposed name for the given [LibraryElement].
-   * The returned id is guaranteed to be a valid JavaScript identifier.
-   */
+  /// Returns a proposed name for the given [LibraryElement].
+  /// The returned id is guaranteed to be a valid JavaScript identifier.
   // TODO(sra): Pre-process libraries to assign [libraryLongNames] in a way that
   // is independent of the order of calls to namer.
   String _proposeNameForLibrary(LibraryEntity library) {
@@ -1643,16 +1624,11 @@
     return userGlobalObjects[library.name.hashCode % userGlobalObjects.length];
   }
 
-  jsAst.Name deriveLazyInitializerName(jsAst.Name name) {
-    // These are not real dart getters, so do not use GetterName;
-    return new CompoundName([_literalLazyGetterPrefix, name]);
-  }
-
   jsAst.Name lazyInitializerName(FieldEntity element) {
     assert(element.isTopLevel || element.isStatic);
-    jsAst.Name name = _disambiguateGlobalMember(element);
-    // These are not real dart getters, so do not use GetterName;
-    return deriveLazyInitializerName(name);
+    jsAst.Name name = _disambiguateGlobal<MemberEntity>(
+        element, _proposeNameForLazyStaticGetter, userGlobalsSecondName);
+    return name;
   }
 
   jsAst.Name staticClosureName(FunctionEntity element) {
@@ -1707,8 +1683,7 @@
   // parts with the fast-startup emitter.
   String get typesOffsetName => r'typesOffset';
 
-  Map<FunctionType, jsAst.Name> functionTypeNameMap =
-      new HashMap<FunctionType, jsAst.Name>();
+  Map<FunctionType, jsAst.Name> functionTypeNameMap = HashMap();
 
   FunctionTypeNamer _functionTypeNamer;
 
@@ -1846,21 +1821,19 @@
   }
 }
 
-/**
- * Generator of names for [ConstantValue] values.
- *
- * The names are stable under perturbations of the source.  The name is either a
- * short sequence of words, if this can be found from the constant, or a type
- * followed by a hash tag.
- *
- *     List_imX                // A List, with hash tag.
- *     C_Sentinel              // const Sentinel(),  "C_" added to avoid clash
- *                             //   with class name.
- *     JSInt_methods           // an interceptor.
- *     Duration_16000          // const Duration(milliseconds: 16)
- *     EventKeyProvider_keyup  // const EventKeyProvider('keyup')
- *
- */
+/// Generator of names for [ConstantValue] values.
+///
+/// The names are stable under perturbations of the source.  The name is either
+/// a short sequence of words, if this can be found from the constant, or a type
+/// followed by a hash tag.
+///
+///     List_imX                // A List, with hash tag.
+///     C_Sentinel              // const Sentinel(),  "C_" added to avoid clash
+///                             //   with class name.
+///     JSInt_methods           // an interceptor.
+///     Duration_16000          // const Duration(milliseconds: 16)
+///     EventKeyProvider_keyup  // const EventKeyProvider('keyup')
+///
 class ConstantNamingVisitor implements ConstantValueVisitor {
   static final RegExp IDENTIFIER = new RegExp(r'^[A-Za-z_$][A-Za-z0-9_$]*$');
   static const MAX_FRAGMENTS = 5;
@@ -2087,31 +2060,24 @@
   }
 
   @override
-  void visitDeferred(DeferredConstantValue constant, [_]) {
-    addRoot('Deferred');
-  }
-
-  @override
   void visitDeferredGlobal(DeferredGlobalConstantValue constant, [_]) {
     addRoot('Deferred');
   }
 }
 
-/**
- * Generates canonical hash values for [ConstantValue]s.
- *
- * Unfortunately, [Constant.hashCode] is not stable under minor perturbations,
- * so it can't be used for generating names.  This hasher keeps consistency
- * between runs by basing hash values of the names of elements, rather than
- * their hashCodes.
- */
+/// Generates canonical hash values for [ConstantValue]s.
+///
+/// Unfortunately, [Constant.hashCode] is not stable under minor perturbations,
+/// so it can't be used for generating names.  This hasher keeps consistency
+/// between runs by basing hash values of the names of elements, rather than
+/// their hashCodes.
 class ConstantCanonicalHasher implements ConstantValueVisitor<int, Null> {
   static const _MASK = 0x1fffffff;
   static const _UINT32_LIMIT = 4 * 1024 * 1024 * 1024;
 
   final RuntimeTypesEncoder rtiEncoder;
   final CodegenWorldBuilder codegenWorldBuilder;
-  final Map<ConstantValue, int> hashes = new Map<ConstantValue, int>();
+  final Map<ConstantValue, int> hashes = {};
 
   ConstantCanonicalHasher(this.rtiEncoder, this.codegenWorldBuilder);
 
@@ -2218,14 +2184,6 @@
   }
 
   @override
-  int visitDeferred(DeferredConstantValue constant, [_]) {
-    // TODO(sra): Investigate that the use of hashCode here is probably a source
-    // of instability.
-    int hash = constant.import.hashCode;
-    return _combine(hash, _visit(constant.referenced));
-  }
-
-  @override
   int visitDeferredGlobal(DeferredGlobalConstantValue constant, [_]) {
     int hash = constant.unit.hashCode;
     return _combine(hash, _visit(constant.referenced));
@@ -2282,12 +2240,10 @@
     }
   }
 
-  /**
-   * [_combine] and [_finish] are parts of the [Jenkins hash function][1],
-   * modified by using masking to keep values in SMI range.
-   *
-   * [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
-   */
+  /// [_combine] and [_finish] are parts of the [Jenkins hash function][1],
+  /// modified by using masking to keep values in SMI range.
+  ///
+  /// [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
   static int _combine(int hash, int value) {
     hash = _MASK & (hash + value);
     hash = _MASK & (hash + (((_MASK >> 10) & hash) << 10));
@@ -2374,8 +2330,8 @@
   ///
   /// This is currently used in [MinifyNamer] to assign very short minified
   /// names to things that tend to be used very often.
-  final Map<String, String> _suggestedNames = new Map<String, String>();
-  final Set<String> _usedNames = new Set<String>();
+  final Map<String, String> _suggestedNames = {};
+  final Set<String> _usedNames = Set();
 
   bool isUsed(String name) => _usedNames.contains(name);
   bool isUnused(String name) => !_usedNames.contains(name);
diff --git a/pkg/compiler/lib/src/js_backend/native_data.dart b/pkg/compiler/lib/src/js_backend/native_data.dart
index e41e541..a491286 100644
--- a/pkg/compiler/lib/src/js_backend/native_data.dart
+++ b/pkg/compiler/lib/src/js_backend/native_data.dart
@@ -326,10 +326,10 @@
     Map<LibraryEntity, String> jsInteropLibraries =
         source.readLibraryMap(source.readString);
     Map<ClassEntity, String> jsInteropClasses =
-        source.readLibraryMap(source.readString);
+        source.readClassMap(source.readString);
     Set<ClassEntity> anonymousJsInteropClasses = source.readClasses().toSet();
     Map<MemberEntity, String> jsInteropMembers =
-        source.readLibraryMap(source.readString);
+        source.readMemberMap(source.readString);
     source.end(tag);
     return new NativeBasicDataImpl(
         elementEnvironment,
diff --git a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
index e997b3e..3dc3075 100644
--- a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
+++ b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
@@ -6,8 +6,8 @@
 import '../common_elements.dart' show CommonElements;
 import '../common/names.dart' show Identifiers, Selectors;
 import '../elements/entities.dart';
+import '../inferrer/types.dart';
 import '../serialization/serialization.dart';
-import '../types/types.dart';
 
 /// [NoSuchMethodRegistry] and [NoSuchMethodData] categorizes `noSuchMethod`
 /// implementations.
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index aef92595..8f18ffb 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -18,7 +18,6 @@
 import '../universe/world_impact.dart'
     show WorldImpact, WorldImpactBuilder, WorldImpactBuilderImpl;
 import 'allocator_analysis.dart';
-import 'backend.dart';
 import 'backend_impact.dart';
 import 'backend_usage.dart';
 import 'checked_mode_helpers.dart';
@@ -429,7 +428,7 @@
       _registerBackendImpact(impactBuilder, _impacts.getRuntimeTypeArgument);
     }
 
-    if (JavaScriptBackend.TRACE_CALLS) {
+    if (_options.experimentCallInstrumentation) {
       _registerBackendImpact(impactBuilder, _impacts.traceHelper);
     }
     _registerBackendImpact(impactBuilder, _impacts.assertUnreachable);
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 3329424..ec375e0 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -15,13 +15,16 @@
 import '../elements/entities.dart';
 import '../elements/names.dart';
 import '../elements/types.dart';
+import '../ir/runtime_type_analysis.dart';
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
 import '../js_emitter/js_emitter.dart' show Emitter;
 import '../options.dart';
 import '../serialization/serialization.dart';
 import '../universe/class_hierarchy.dart';
+import '../universe/codegen_world_builder.dart';
 import '../universe/feature.dart';
+import '../universe/resolution_world_builder.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
 import '../world.dart' show JClosedWorld, KClosedWorld;
@@ -701,15 +704,13 @@
 
   _RuntimeTypesBase(this._types);
 
-  /**
-   * Compute type arguments of classes that use one of their type variables in
-   * is-checks and add the is-checks that they imply.
-   *
-   * This function must be called after all is-checks have been registered.
-   *
-   * TODO(karlklose): move these computations into a function producing an
-   * immutable datastructure.
-   */
+  /// Compute type arguments of classes that use one of their type variables in
+  /// is-checks and add the is-checks that they imply.
+  ///
+  /// This function must be called after all is-checks have been registered.
+  ///
+  /// TODO(karlklose): move these computations into a function producing an
+  /// immutable datastructure.
   void registerImplicitChecks(
       Set<InterfaceType> instantiatedTypes,
       Iterable<ClassEntity> classesUsingChecks,
@@ -1682,21 +1683,24 @@
 
     Set<ClassEntity> classesDirectlyNeedingRuntimeType = new Set<ClassEntity>();
 
-    ClassEntity impliedClass(DartType type) {
+    Iterable<ClassEntity> impliedClasses(DartType type) {
       if (type is InterfaceType) {
-        return type.element;
+        return [type.element];
       } else if (type is DynamicType) {
-        return commonElements.objectClass;
+        return [commonElements.objectClass];
       } else if (type is FunctionType) {
         // TODO(johnniwinther): Include only potential function type subtypes.
-        return commonElements.functionClass;
+        return [commonElements.functionClass];
       } else if (type is VoidType) {
         // No classes implied.
       } else if (type is FunctionTypeVariable) {
-        return impliedClass(type.bound);
+        return impliedClasses(type.bound);
+      } else if (type is FutureOrType) {
+        return [commonElements.futureClass]
+          ..addAll(impliedClasses(type.typeArgument));
       } else if (type is TypeVariableType) {
         // TODO(johnniwinther): Can we do better?
-        return impliedClass(
+        return impliedClasses(
             _elementEnvironment.getTypeVariableBound(type.element));
       }
       throw new UnsupportedError('Unexpected type $type');
@@ -1718,43 +1722,47 @@
       switch (runtimeTypeUse.kind) {
         case RuntimeTypeUseKind.string:
           if (!options.laxRuntimeTypeToString) {
-            addClass(impliedClass(runtimeTypeUse.receiverType));
+            impliedClasses(runtimeTypeUse.receiverType).forEach(addClass);
           }
 
           break;
         case RuntimeTypeUseKind.equals:
-          ClassEntity receiverClass = impliedClass(runtimeTypeUse.receiverType);
-          ClassEntity argumentClass = impliedClass(runtimeTypeUse.argumentType);
+          Iterable<ClassEntity> receiverClasses =
+              impliedClasses(runtimeTypeUse.receiverType);
+          Iterable<ClassEntity> argumentClasses =
+              impliedClasses(runtimeTypeUse.argumentType);
 
-          // TODO(johnniwinther): Special case use of `this.runtimeType`.
-          SubclassResult result = closedWorld.classHierarchy.commonSubclasses(
-              receiverClass,
-              ClassQuery.SUBTYPE,
-              argumentClass,
-              ClassQuery.SUBTYPE);
-          switch (result.kind) {
-            case SubclassResultKind.EMPTY:
-              break;
-            case SubclassResultKind.EXACT1:
-            case SubclassResultKind.SUBCLASS1:
-            case SubclassResultKind.SUBTYPE1:
-              addClass(receiverClass);
-              break;
-            case SubclassResultKind.EXACT2:
-            case SubclassResultKind.SUBCLASS2:
-            case SubclassResultKind.SUBTYPE2:
-              addClass(argumentClass);
-              break;
-            case SubclassResultKind.SET:
-              for (ClassEntity cls in result.classes) {
-                addClass(cls);
-                if (neededOnAll) break;
+          for (ClassEntity receiverClass in receiverClasses) {
+            for (ClassEntity argumentClass in argumentClasses) {
+              // TODO(johnniwinther): Special case use of `this.runtimeType`.
+              SubclassResult result = closedWorld.classHierarchy
+                  .commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
+                      argumentClass, ClassQuery.SUBTYPE);
+              switch (result.kind) {
+                case SubclassResultKind.EMPTY:
+                  break;
+                case SubclassResultKind.EXACT1:
+                case SubclassResultKind.SUBCLASS1:
+                case SubclassResultKind.SUBTYPE1:
+                  addClass(receiverClass);
+                  break;
+                case SubclassResultKind.EXACT2:
+                case SubclassResultKind.SUBCLASS2:
+                case SubclassResultKind.SUBTYPE2:
+                  addClass(argumentClass);
+                  break;
+                case SubclassResultKind.SET:
+                  for (ClassEntity cls in result.classes) {
+                    addClass(cls);
+                    if (neededOnAll) break;
+                  }
+                  break;
               }
-              break;
+            }
           }
           break;
         case RuntimeTypeUseKind.unknown:
-          addClass(impliedClass(runtimeTypeUse.receiverType));
+          impliedClasses(runtimeTypeUse.receiverType).forEach(addClass);
           break;
       }
       if (neededOnAll) break;
@@ -2267,20 +2275,18 @@
     }
   }
 
-  /**
-   * Compute a JavaScript expression that describes the necessary substitution
-   * for type arguments in a subtype test.
-   *
-   * The result can be:
-   *  1) `null`, if no substituted check is necessary, because the
-   *     type variables are the same or there are no type variables in the class
-   *     that is checked for.
-   *  2) A list expression describing the type arguments to be used in the
-   *     subtype check, if the type arguments to be used in the check do not
-   *     depend on the type arguments of the object.
-   *  3) A function mapping the type variables of the object to be checked to
-   *     a list expression.
-   */
+  /// Compute a JavaScript expression that describes the necessary substitution
+  /// for type arguments in a subtype test.
+  ///
+  /// The result can be:
+  ///  1) `null`, if no substituted check is necessary, because the type
+  ///     variables are the same or there are no type variables in the class
+  ///     that is checked for.
+  ///  2) A list expression describing the type arguments to be used in the
+  ///     subtype check, if the type arguments to be used in the check do not
+  ///     depend on the type arguments of the object.
+  ///  3) A function mapping the type variables of the object to be checked to
+  ///     a list expression.
   @override
   jsAst.Expression getSubstitutionCode(
       Emitter emitter, Substitution substitution) {
@@ -2372,10 +2378,8 @@
 
   TypeRepresentationGenerator(this.namer, this._nativeData);
 
-  /**
-   * Creates a type representation for [type]. [onVariable] is called to provide
-   * the type representation for type variables.
-   */
+  /// Creates a type representation for [type]. [onVariable] is called to
+  /// provide the type representation for type variables.
   jsAst.Expression getTypeRepresentation(
       Emitter emitter,
       DartType type,
@@ -2778,10 +2782,8 @@
       'parameters=$parameters,length=$length)';
 }
 
-/**
- * A pair of a class that we need a check against and the type argument
- * substitution for this check.
- */
+/// A pair of a class that we need a check against and the type argument
+/// substitution for this check.
 class TypeCheck {
   final ClassEntity cls;
   final bool needsIs;
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index ea23cbd..fb31e92 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -4,7 +4,7 @@
 
 library dart2js.js_emitter.class_stub_generator;
 
-import '../common/names.dart' show Identifiers;
+import '../common/names.dart' show Identifiers, Selectors;
 import '../common_elements.dart' show CommonElements;
 import '../elements/entities.dart';
 import '../js/js.dart' as jsAst;
@@ -12,9 +12,9 @@
 import '../js_backend/namer.dart' show Namer;
 import '../js_backend/interceptor_data.dart' show InterceptorData;
 import '../options.dart';
+import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart' show Selector;
-import '../universe/world_builder.dart'
-    show CodegenWorldBuilder, SelectorConstraints;
+import '../universe/world_builder.dart' show SelectorConstraints;
 import '../world.dart' show JClosedWorld;
 
 import 'code_emitter_task.dart';
@@ -85,11 +85,9 @@
         'function(#, v) { return #.# = v; }', [args, receiver, fieldName]);
   }
 
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [member] must be a declaration element.
-   */
+  /// Documentation wanted -- johnniwinther
+  ///
+  /// Invariant: [member] must be a declaration element.
   Map<jsAst.Name, jsAst.Expression> generateCallStubsForGetter(
       MemberEntity member, Map<Selector, SelectorConstraints> selectors) {
     // If the method is intercepted, the stub gets the
@@ -125,7 +123,8 @@
     for (Selector selector in selectors.keys) {
       if (generatedSelectors.contains(selector)) continue;
       if (!selector.appliesUnnamed(member)) continue;
-      if (selectors[selector].applies(member, selector, _closedWorld)) {
+      if (selectors[selector]
+          .canHit(member, selector.memberName, _closedWorld)) {
         generatedSelectors.add(selector);
 
         jsAst.Name invocationName = _namer.invocationName(selector);
@@ -165,6 +164,16 @@
     void addNoSuchMethodHandlers(
         String ignore, Map<Selector, SelectorConstraints> selectors) {
       for (Selector selector in selectors.keys) {
+        if (selector == Selectors.runtimeType_ ||
+            selector == Selectors.equals ||
+            selector == Selectors.toString_ ||
+            selector == Selectors.hashCode_ ||
+            selector == Selectors.noSuchMethod_) {
+          // Skip Object methods since these need no noSuchMethod handling
+          // regardless of the precision of the selector constraints.
+          continue;
+        }
+
         SelectorConstraints maskSet = selectors[selector];
         if (maskSet.needsNoSuchMethodHandling(selector, _closedWorld)) {
           jsAst.Name jsName = _namer.invocationMirrorInternalName(selector);
@@ -234,12 +243,13 @@
 ///
 /// `tearOff` takes the following arguments:
 ///   * `funcs`: a list of functions. These are the functions representing the
-///    member that is torn off. There can be more than one, since a member
-///    can have several stubs.
-///    Each function must have the `$callName` property set.
-///   * `applyTrampolineIndex` is the index of the stub to be used for Function.apply
+///     member that is torn off. There can be more than one, since a member
+///     can have several stubs.
+///     Each function must have the `$callName` property set.
+///   * `applyTrampolineIndex` is the index of the stub to be used for
+///     Function.apply
 ///   * `reflectionInfo`: contains reflective information, and the function
-///    type. TODO(floitsch): point to where this is specified.
+///     type. TODO(floitsch): point to where this is specified.
 ///   * `isStatic`.
 ///   * `name`.
 ///   * `isIntercepted.
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index 063d03f..7fac11d 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -15,9 +15,8 @@
 import '../js/js.dart' as jsAst;
 import '../js_backend/js_backend.dart' show JavaScriptBackend, Namer;
 import '../js_backend/inferred_data.dart';
-import '../universe/world_builder.dart' show CodegenWorldBuilder;
+import '../universe/codegen_world_builder.dart';
 import '../world.dart' show JClosedWorld;
-import 'full_emitter/emitter.dart' as full_js_emitter;
 import 'program_builder/program_builder.dart';
 import 'startup_emitter/emitter.dart' as startup_js_emitter;
 
@@ -27,12 +26,10 @@
 import 'type_test_registry.dart' show TypeTestRegistry;
 import 'sorter.dart';
 
-/**
- * Generates the code for all used classes in the program. Static fields (even
- * in classes) are ignored, since they can be treated as non-class elements.
- *
- * The code for the containing (used) methods must exist in the `universe`.
- */
+/// Generates the code for all used classes in the program. Static fields (even
+/// in classes) are ignored, since they can be treated as non-class elements.
+///
+/// The code for the containing (used) methods must exist in the `universe`.
 class CodeEmitterTask extends CompilerTask {
   TypeTestRegistry typeTestRegistry;
   NativeEmitter _nativeEmitter;
@@ -50,14 +47,10 @@
   /// Contains a list of all classes that are emitted.
   Set<ClassEntity> neededClasses;
 
-  CodeEmitterTask(
-      Compiler compiler, bool generateSourceMap, bool useStartupEmitter)
+  CodeEmitterTask(Compiler compiler, bool generateSourceMap)
       : compiler = compiler,
-        _emitterFactory = useStartupEmitter
-            ? new startup_js_emitter.EmitterFactory(
-                generateSourceMap: generateSourceMap)
-            : new full_js_emitter.EmitterFactory(
-                generateSourceMap: generateSourceMap),
+        _emitterFactory = startup_js_emitter.EmitterFactory(
+            generateSourceMap: generateSourceMap),
         super(compiler.measurer);
 
   NativeEmitter get nativeEmitter {
@@ -179,7 +172,6 @@
           compiler.reporter,
           closedWorld.elementEnvironment,
           closedWorld.commonElements,
-          compiler.deferredLoadTask,
           closedWorld.outputUnitData,
           compiler.codegenWorldBuilder,
           backend.nativeCodegenEnqueuer,
@@ -191,7 +183,6 @@
           backend.superMemberData,
           typeTestRegistry.rtiChecks,
           backend.rtiEncoder,
-          backend.jsInteropAnalysis,
           backend.oneShotInterceptorData,
           backend.customElementsCodegenAnalysis,
           backend.generatedCode,
diff --git a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
index a38df23..93b4e7d 100644
--- a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
+++ b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
@@ -7,7 +7,6 @@
 import '../constants/values.dart';
 import '../elements/entities.dart'
     show ClassEntity, FieldEntity, MemberEntity, TypedefEntity;
-import '../elements/entity_utils.dart' as utils;
 import '../elements/types.dart';
 import '../js_backend/js_backend.dart' show SyntheticConstantKind;
 import 'sorter.dart' show Sorter;
@@ -177,15 +176,6 @@
     }
   }
 
-  int visitDeferred(DeferredConstantValue a, DeferredConstantValue b) {
-    int r = compareValues(a.referenced, b.referenced);
-    if (r != 0) return r;
-    r = a.import.name.compareTo(b.import.name);
-    if (r != 0) return r;
-    return utils.compareLibrariesUris(
-        a.import.enclosingLibraryUri, b.import.enclosingLibraryUri);
-  }
-
   int visitDeferredGlobal(
       DeferredGlobalConstantValue a, DeferredGlobalConstantValue b) {
     int r = compareValues(a.referenced, b.referenced);
@@ -216,10 +206,9 @@
   static const int TYPE = 10;
   static const int INTERCEPTOR = 11;
   static const int SYNTHETIC = 12;
-  static const int DEFERRED = 13;
-  static const int DEFERRED_GLOBAL = 14;
-  static const int NONCONSTANT = 15;
-  static const int INSTANTIATION = 16;
+  static const int DEFERRED_GLOBAL = 13;
+  static const int NONCONSTANT = 14;
+  static const int INSTANTIATION = 15;
 
   static int kind(ConstantValue constant) =>
       constant.accept(const _KindVisitor(), null);
@@ -237,7 +226,6 @@
   int visitType(TypeConstantValue a, _) => TYPE;
   int visitInterceptor(InterceptorConstantValue a, _) => INTERCEPTOR;
   int visitSynthetic(SyntheticConstantValue a, _) => SYNTHETIC;
-  int visitDeferred(DeferredConstantValue a, _) => DEFERRED;
   int visitDeferredGlobal(DeferredGlobalConstantValue a, _) => DEFERRED_GLOBAL;
   int visitInstantiation(InstantiationConstantValue a, _) => INSTANTIATION;
 }
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart
deleted file mode 100644
index 7f55142..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.js_emitter.full_emitter.class_builder;
-
-import '../../elements/entities.dart';
-import '../../js/js.dart' as jsAst;
-import '../../js/js.dart' show js;
-import '../../js_backend/js_backend.dart' show Namer;
-
-/**
- * A data structure for collecting fragments of a class definition.
- */
-class ClassBuilder {
-  final List<jsAst.Property> properties = <jsAst.Property>[];
-  final List<jsAst.Literal> fields = <jsAst.Literal>[];
-
-  jsAst.Name superName;
-  jsAst.Node functionType;
-  List<jsAst.Expression> fieldMetadata;
-
-  final Entity element;
-  final Namer namer;
-  final bool isForActualClass;
-
-  ClassBuilder.forLibrary(LibraryEntity library, this.namer)
-      : isForActualClass = false,
-        element = library;
-
-  ClassBuilder.forClass(ClassEntity cls, this.namer)
-      : isForActualClass = true,
-        element = cls;
-
-  ClassBuilder.forStatics(this.element, this.namer) : isForActualClass = false;
-
-  jsAst.Property addProperty(jsAst.Literal name, jsAst.Expression value) {
-    jsAst.Property property = new jsAst.Property(js.quoteName(name), value);
-    properties.add(property);
-    return property;
-  }
-
-  jsAst.Property addPropertyByName(String name, jsAst.Expression value) {
-    jsAst.Property property = new jsAst.Property(js.string(name), value);
-    properties.add(property);
-    return property;
-  }
-
-  void addField(jsAst.Literal field) {
-    fields.add(field);
-  }
-
-  static String functionTypeEncodingDescription =
-      'For simple function types the function type is stored in the metadata '
-      'and the index is encoded into the superclass field.';
-
-  static String fieldEncodingDescription =
-      'Fields are encoded as a comma separated list. If there is a superclass '
-      '(and possibly a function type encoding) the fields are separated from '
-      'the superclass by a semicolon.';
-
-  jsAst.ObjectInitializer toObjectInitializer(
-      {bool emitClassDescriptor: true}) {
-    List<jsAst.Literal> parts = <jsAst.Literal>[];
-    if (isForActualClass) {
-      if (superName != null) {
-        parts.add(superName);
-        if (functionType != null) {
-          // See [functionTypeEncodingDescription] above.
-          parts.add(js.stringPart(':'));
-          parts.add(functionType);
-        }
-      }
-      parts.add(js.stringPart(';'));
-    }
-    // See [fieldEncodingDescription] above.
-    parts.addAll(js.joinLiterals(fields, js.stringPart(',')));
-    dynamic classData = js.concatenateStrings(parts, addQuotes: true);
-    if (fieldMetadata != null) {
-      // If we need to store fieldMetadata, classData is turned into an array,
-      // and the field metadata is appended. So if classData is just a string,
-      // there is no field metadata.
-      classData =
-          new jsAst.ArrayInitializer([classData]..addAll(fieldMetadata));
-    }
-    List<jsAst.Property> fieldsAndProperties;
-    if (emitClassDescriptor) {
-      fieldsAndProperties = <jsAst.Property>[];
-      fieldsAndProperties.add(new jsAst.Property(
-          js.string(namer.classDescriptorProperty), classData));
-      fieldsAndProperties.addAll(properties);
-    } else {
-      fieldsAndProperties = properties;
-    }
-    return new jsAst.ObjectInitializer(fieldsAndProperties, isOneLiner: false);
-  }
-}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
deleted file mode 100644
index 61df0af..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.js_emitter.full_emitter.class_emitter;
-
-import '../../common.dart';
-import '../../common/names.dart' show Names;
-import '../../common_elements.dart';
-import '../../deferred_load.dart' show OutputUnit;
-import '../../elements/entities.dart';
-import '../../js/js.dart' as jsAst;
-import '../../js/js.dart' show js;
-import '../../js_backend/js_backend.dart' show CompoundName, Namer;
-import '../../world.dart' show JClosedWorld;
-import '../js_emitter.dart' hide Emitter, EmitterFactory;
-import '../model.dart';
-import 'emitter.dart';
-
-class ClassEmitter extends CodeEmitterHelper {
-  final JClosedWorld closedWorld;
-
-  ClassEmitter(this.closedWorld);
-
-  ClassStubGenerator get _stubGenerator => new ClassStubGenerator(task.emitter,
-      closedWorld.commonElements, namer, codegenWorldBuilder, closedWorld,
-      enableMinification: compiler.options.enableMinification);
-
-  ElementEnvironment get _elementEnvironment => closedWorld.elementEnvironment;
-
-  /**
-   * Documentation wanted -- johnniwinther
-   */
-  void emitClass(Class cls, ClassBuilder enclosingBuilder, Fragment fragment) {
-    ClassEntity classElement = cls.element;
-
-    emitter.needsClassSupport = true;
-
-    ClassEntity superclass = _elementEnvironment.getSuperClass(classElement);
-    jsAst.Name superName;
-    if (superclass != null) {
-      superName = namer.className(superclass);
-    }
-
-    if (cls.mixinClass != null) {
-      jsAst.Name mixinName = cls.mixinClass.name;
-      superName = new CompoundName([superName, Namer.literalPlus, mixinName]);
-      emitter.needsMixinSupport = true;
-    }
-
-    ClassBuilder builder = new ClassBuilder.forClass(classElement, namer);
-    builder.superName = superName;
-    emitConstructorsForCSP(cls);
-    emitFields(cls, builder);
-    if (cls.hasRtiField) {
-      builder.addField(namer.rtiFieldJsName);
-    }
-    emitCheckedClassSetters(cls, builder);
-    emitClassGettersSettersForCSP(cls, builder);
-    emitInstanceMembers(cls, builder);
-    emitStubs(cls.callStubs, builder);
-    emitRuntimeTypeInformation(cls, builder);
-    emitNativeInfo(cls, builder);
-
-    if (classElement == closedWorld.commonElements.closureClass) {
-      // We add a special getter here to allow for tearing off a closure from
-      // itself.
-      jsAst.Fun function = js('function() { return this; }');
-      jsAst.Name name = namer.getterForMember(Names.call);
-      builder.addProperty(name, function);
-    }
-
-    emitClassBuilderWithReflectionData(
-        cls, builder, enclosingBuilder, fragment);
-  }
-
-  /**
-  * Emits the precompiled constructor when in CSP mode.
-  */
-  void emitConstructorsForCSP(Class cls) {
-    if (!compiler.options.useContentSecurityPolicy) return;
-
-    List<jsAst.Name> fieldNames = <jsAst.Name>[];
-    if (!cls.onlyForRti && !cls.isNative) {
-      fieldNames = cls.fields.map((Field field) => field.name).toList();
-    }
-
-    ClassEntity classElement = cls.element;
-
-    jsAst.Expression constructorAst = _stubGenerator.generateClassConstructor(
-        classElement, fieldNames, cls.hasRtiField);
-
-    jsAst.Name constructorName = namer.className(classElement);
-    OutputUnit outputUnit =
-        closedWorld.outputUnitData.outputUnitForClass(classElement);
-    emitter.assemblePrecompiledConstructor(
-        outputUnit, constructorName, constructorAst, fieldNames);
-  }
-
-  /// Returns `true` if fields added.
-  bool emitFields(FieldContainer container, ClassBuilder builder,
-      {bool classIsNative: false, bool emitStatics: false}) {
-    Iterable<Field> fields;
-    if (container is Class) {
-      if (emitStatics) {
-        fields = container.staticFieldsForReflection;
-      } else if (container.onlyForRti) {
-        return false;
-      } else {
-        fields = container.fields;
-      }
-    } else {
-      assert(container is Library);
-      assert(emitStatics);
-      fields = container.staticFieldsForReflection;
-    }
-
-    bool fieldsAdded = false;
-
-    for (Field field in fields) {
-      FieldEntity fieldElement = field.element;
-      jsAst.Name name = field.name;
-      jsAst.Name accessorName = field.accessorName;
-      bool needsGetter = field.needsGetter;
-      bool needsSetter = field.needsUncheckedSetter;
-
-      // Ignore needsCheckedSetter - that is handled below.
-      bool needsAccessor = (needsGetter || needsSetter);
-      // We need to output the fields for non-native classes so we can auto-
-      // generate the constructor.  For native classes there are no
-      // constructors, so we don't need the fields unless we are generating
-      // accessors at runtime.
-      bool needsFieldsForConstructor = !emitStatics && !classIsNative;
-      if (needsFieldsForConstructor || needsAccessor) {
-        List<jsAst.Literal> fieldNameParts = <jsAst.Literal>[];
-        if (field.nullInitializerInAllocator) {
-          fieldNameParts.add(js.stringPart('0'));
-        }
-        if (!needsAccessor) {
-          // Emit field for constructor generation.
-          assert(!classIsNative);
-          fieldNameParts.add(name);
-        } else {
-          // Emit (possibly renaming) field name so we can add accessors at
-          // runtime.
-          if (name != accessorName) {
-            fieldNameParts.add(accessorName);
-            fieldNameParts.add(js.stringPart(':'));
-          }
-          fieldNameParts.add(name);
-          if (field.needsInterceptedGetter) {
-            emitter.interceptorEmitter.interceptorInvocationNames
-                .add(namer.getterForElement(fieldElement));
-          }
-          // TODO(16168): The setter creator only looks at the getter-name.
-          // Even though the setter could avoid the interceptor convention we
-          // currently still need to add the additional argument.
-          if (field.needsInterceptedGetter || field.needsInterceptedSetter) {
-            emitter.interceptorEmitter.interceptorInvocationNames
-                .add(namer.setterForMember(fieldElement));
-          }
-
-          int code = field.getterFlags + (field.setterFlags << 2);
-          if (code == 0) {
-            reporter.internalError(
-                fieldElement, 'Field code is 0 ($fieldElement).');
-          }
-          fieldNameParts.add(
-              js.stringPart(FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]));
-        }
-        jsAst.Literal fieldNameAst = js.concatenateStrings(fieldNameParts);
-        builder.addField(fieldNameAst);
-        // Add 1 because adding a field to the class also requires a comma
-        compiler.dumpInfoTask.registerEntityAst(fieldElement, fieldNameAst);
-        fieldsAdded = true;
-      }
-    }
-
-    return fieldsAdded;
-  }
-
-  /// Emits checked setters for fields.
-  void emitCheckedClassSetters(Class cls, ClassBuilder builder) {
-    if (cls.onlyForRti) return;
-
-    for (StubMethod method in cls.checkedSetters) {
-      MemberEntity member = method.element;
-      assert(member != null);
-      jsAst.Expression code = method.code;
-      jsAst.Name setterName = method.name;
-      compiler.dumpInfoTask
-          .registerEntityAst(member, builder.addProperty(setterName, code));
-    }
-  }
-
-  /// Emits getters/setters for fields if compiling in CSP mode.
-  void emitClassGettersSettersForCSP(Class cls, ClassBuilder builder) {
-    if (!compiler.options.useContentSecurityPolicy || cls.onlyForRti) return;
-
-    for (Field field in cls.fields) {
-      FieldEntity member = field.element;
-      reporter.withCurrentElement(member, () {
-        if (field.needsGetter) {
-          emitGetterForCSP(member, field.name, field.accessorName, builder);
-        }
-        if (field.needsUncheckedSetter) {
-          emitSetterForCSP(member, field.name, field.accessorName, builder);
-        }
-      });
-    }
-  }
-
-  void emitStubs(Iterable<StubMethod> stubs, ClassBuilder builder) {
-    for (Method method in stubs) {
-      jsAst.Property property = builder.addProperty(method.name, method.code);
-      compiler.dumpInfoTask.registerEntityAst(method.element, property);
-    }
-  }
-
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: [classElement] must be a declaration element.
-   */
-  void emitInstanceMembers(Class cls, ClassBuilder builder) {
-    ClassEntity classElement = cls.element;
-
-    if (cls.onlyForRti || cls.isSimpleMixinApplication) return;
-
-    // TODO(herhut): This is a no-op. Should it be removed?
-    for (Field field in cls.fields) {
-      emitter.containerBuilder.addMemberField(field, builder);
-    }
-
-    for (Method method in cls.methods) {
-      assert(method.element.isInstanceMember, failedAt(classElement));
-      emitter.containerBuilder.addMemberMethod(method, builder);
-    }
-
-    if (classElement == closedWorld.commonElements.objectClass &&
-        closedWorld.backendUsage.isNoSuchMethodUsed) {
-      // Emit the noSuchMethod handlers on the Object prototype now,
-      // so that the code in the dynamicFunction helper can find
-      // them. Note that this helper is invoked before analyzing the
-      // full JS script.
-      emitter.nsmEmitter.emitNoSuchMethodHandlers(builder.addProperty);
-    }
-  }
-
-  /// Emits the members from the model.
-  void emitRuntimeTypeInformation(Class cls, ClassBuilder builder) {
-    assert(builder.functionType == null);
-    if (cls.functionTypeIndex != null) {
-      builder.functionType = cls.functionTypeIndex;
-    }
-
-    for (Method method in cls.isChecks) {
-      builder.addProperty(method.name, method.code);
-    }
-  }
-
-  void emitNativeInfo(Class cls, ClassBuilder builder) {
-    jsAst.Expression nativeInfo = NativeGenerator.encodeNativeInfo(cls);
-    if (nativeInfo != null) {
-      builder.addPropertyByName(namer.nativeSpecProperty, nativeInfo);
-    }
-  }
-
-  void emitClassBuilderWithReflectionData(Class cls, ClassBuilder classBuilder,
-      ClassBuilder enclosingBuilder, Fragment fragment) {
-    ClassEntity classEntity = cls.element;
-    jsAst.Name className = cls.name;
-
-    List<jsAst.Property> statics = new List<jsAst.Property>();
-    ClassBuilder staticsBuilder =
-        new ClassBuilder.forStatics(classEntity, namer);
-    if (emitFields(cls, staticsBuilder, emitStatics: true)) {
-      jsAst.ObjectInitializer initializer =
-          staticsBuilder.toObjectInitializer();
-      compiler.dumpInfoTask.registerEntityAst(classEntity, initializer);
-      jsAst.Node property = initializer.properties.single;
-      compiler.dumpInfoTask.registerEntityAst(classEntity, property);
-      statics.add(property);
-    }
-
-    // TODO(herhut): Do not grab statics out of the properties.
-    ClassBuilder classProperties =
-        emitter.classDescriptors[fragment]?.remove(classEntity);
-    if (classProperties != null) {
-      statics.addAll(classProperties.properties);
-    }
-
-    if (!statics.isEmpty) {
-      classBuilder.addProperty(
-          namer.staticsPropertyName, // 'static' or its minified name.
-          new jsAst.ObjectInitializer(statics, isOneLiner: false));
-    }
-
-    // TODO(ahe): This method (generateClass) should return a jsAst.Expression.
-    jsAst.ObjectInitializer propertyValue = classBuilder.toObjectInitializer();
-    compiler.dumpInfoTask
-        .registerEntityAst(classBuilder.element, propertyValue);
-    enclosingBuilder.addProperty(className, propertyValue);
-
-    String reflectionName =
-        emitter.getReflectionClassName(classEntity, className);
-    if (reflectionName != null) {
-      // TODO(herhut): Fix use of reflection name here.
-      enclosingBuilder.addPropertyByName("+$reflectionName", js.number(0));
-    }
-  }
-
-  void emitGetterForCSP(FieldEntity member, jsAst.Name fieldName,
-      jsAst.Name accessorName, ClassBuilder builder) {
-    jsAst.Expression function =
-        _stubGenerator.generateGetter(member, fieldName);
-
-    jsAst.Name getterName = namer.deriveGetterName(accessorName);
-    ClassEntity cls = member.enclosingClass;
-    jsAst.Name className = namer.className(cls);
-    OutputUnit outputUnit =
-        closedWorld.outputUnitData.outputUnitForMember(member);
-    emitter
-        .cspPrecompiledFunctionFor(outputUnit)
-        .add(js('#.prototype.# = #', [className, getterName, function]));
-  }
-
-  void emitSetterForCSP(FieldEntity member, jsAst.Name fieldName,
-      jsAst.Name accessorName, ClassBuilder builder) {
-    jsAst.Expression function =
-        _stubGenerator.generateSetter(member, fieldName);
-
-    jsAst.Name setterName = namer.deriveSetterName(accessorName);
-    ClassEntity cls = member.enclosingClass;
-    jsAst.Name className = namer.className(cls);
-    OutputUnit outputUnit =
-        closedWorld.outputUnitData.outputUnitForMember(member);
-    emitter
-        .cspPrecompiledFunctionFor(outputUnit)
-        .add(js('#.prototype.# = #', [className, setterName, function]));
-  }
-}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/code_emitter_helper.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/code_emitter_helper.dart
deleted file mode 100644
index 36932fb..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/code_emitter_helper.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.js_emitter.full_emitter;
-
-class CodeEmitterHelper {
-  Emitter emitter;
-
-  Namer get namer => emitter.namer;
-
-  JavaScriptBackend get backend => emitter.backend;
-
-  CodeEmitterTask get task => emitter.task;
-
-  Compiler get compiler => emitter.compiler;
-
-  DiagnosticReporter get reporter => compiler.reporter;
-
-  CodegenWorldBuilder get codegenWorldBuilder => compiler.codegenWorldBuilder;
-
-  String get n => emitter.n;
-
-  String get _ => emitter._;
-
-  String get N => emitter.N;
-}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart
deleted file mode 100644
index 0836206..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.js_emitter.full_emitter.container_builder;
-
-import '../../deferred_load.dart' show OutputUnit;
-import '../../elements/entities.dart';
-import '../../elements/names.dart';
-import '../../js/js.dart' as jsAst;
-import '../../js/js.dart' show js;
-import '../../world.dart';
-import '../js_emitter.dart' hide Emitter, EmitterFactory;
-import '../model.dart';
-import 'emitter.dart';
-
-/// This class should morph into something that makes it easy to build
-/// JavaScript representations of libraries, class-sides, and instance-sides.
-/// Initially, it is just a placeholder for code that is moved from
-/// [CodeEmitterTask].
-class ContainerBuilder extends CodeEmitterHelper {
-  JClosedWorld _closedWorld;
-
-  ContainerBuilder(this._closedWorld);
-
-  void addMemberMethod(DartMethod method, ClassBuilder builder) {
-    FunctionEntity member = method.element;
-    OutputUnit outputUnit =
-        _closedWorld.outputUnitData.outputUnitForMember(member);
-    jsAst.Name name = method.name;
-    ParameterStructure parameters = member.parameterStructure;
-    jsAst.Expression code = method.code;
-    bool needsStubs = method.parameterStubs.isNotEmpty;
-    bool canBeApplied = method.canBeApplied;
-    bool canTearOff = method.needsTearOff;
-    jsAst.Name tearOffName = method.tearOffName;
-    bool isClosure = method is InstanceMethod && method.isClosureCallMethod;
-    jsAst.Name superAlias = method is InstanceMethod ? method.aliasName : null;
-    bool hasSuperAlias = superAlias != null;
-    jsAst.Expression memberTypeExpression = method.functionType;
-    bool needStructuredInfo = canTearOff || canBeApplied || hasSuperAlias;
-
-    bool isIntercepted = false;
-    if (method is InstanceMethod) {
-      isIntercepted = method.isIntercepted;
-    }
-
-    emitter.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
-
-    if (!needStructuredInfo) {
-      compiler.dumpInfoTask
-          .registerEntityAst(member, builder.addProperty(name, code));
-
-      for (ParameterStubMethod stub in method.parameterStubs) {
-        assert(stub.callName == null);
-        jsAst.Property property = builder.addProperty(stub.name, stub.code);
-        compiler.dumpInfoTask.registerEntityAst(member, property);
-        emitter.interceptorEmitter
-            .recordMangledNameOfMemberMethod(member, stub.name);
-      }
-      return;
-    }
-    emitter.needsStructuredMemberInfo = true;
-
-    // This element is needed for reflection or needs additional stubs or has a
-    // super alias. So we need to retain additional information.
-
-    // The information is stored in an array with this format:
-    //
-    // 1.   The alias name for this function (optional).
-    // 2.   Index into the functions and stubs of the apply stub (optional).
-    // 3.   The JS function for this member.
-    // 4.   First stub.
-    // 5.   Name of first stub.
-    // ...
-    // M.   Call name of this member.
-    // M+1. Call name of first stub.
-    // ...
-    // N.   Getter name for tearOff.
-    // N+1. (Required parameter count << 2) + (member.isAccessor ? 2 : 0) +
-    //        (isIntercepted ? 1 : 0)
-    // N+2. (Optional parameter count << 1) +
-    //                      (parameters.optionalParametersAreNamed ? 1 : 0).
-    // N+3. Index to function type in constant pool.
-    // N+4. First default argument.
-    // ...
-    // O.   First parameter name (if needed for reflection or Function.apply).
-    // ...
-    // P.   Unmangled name (if reflectable).
-    // P+1. First metadata (if reflectable).
-    // ...
-    // TODO(ahe): Consider one of the parameter counts can be replaced by the
-    // length property of the JavaScript function object.
-
-    List<jsAst.Expression> expressions = <jsAst.Expression>[];
-
-    // Create the optional aliasing entry if this method is called via super.
-    if (hasSuperAlias) {
-      expressions.add(js.quoteName(superAlias));
-    }
-
-    if (canBeApplied && parameters.typeParameters > 0) {
-      // The first stub is the one that has all the value parameters parameters
-      // but no type parameters. This is the entry point for Function.apply.
-      expressions.add(js.number(1));
-    }
-
-    expressions.add(code);
-
-    bool onlyNeedsSuperAlias = !(canTearOff || canBeApplied || needsStubs);
-
-    if (onlyNeedsSuperAlias) {
-      jsAst.ArrayInitializer arrayInit =
-          new jsAst.ArrayInitializer(expressions);
-      compiler.dumpInfoTask
-          .registerEntityAst(member, builder.addProperty(name, arrayInit));
-      return;
-    }
-
-    jsAst.Literal callSelectorString;
-    if (method.callName == null) {
-      callSelectorString = new jsAst.LiteralNull();
-    } else {
-      callSelectorString = js.quoteName(method.callName);
-    }
-
-    // On [requiredParameterCount], the lower bit is set if this method can be
-    // called reflectively.
-    int requiredParameterCount = parameters.requiredParameters << 2;
-    if (member.isGetter || member.isSetter) requiredParameterCount += 2;
-    if (isIntercepted) requiredParameterCount += 1;
-
-    int optionalParameterCount = parameters.optionalParameters << 1;
-    if (parameters.namedParameters.isNotEmpty) optionalParameterCount++;
-
-    var tearOffInfo = <jsAst.Expression>[callSelectorString];
-
-    for (ParameterStubMethod stub in method.parameterStubs) {
-      jsAst.Name invocationName = stub.name;
-      emitter.interceptorEmitter
-          .recordMangledNameOfMemberMethod(member, invocationName);
-
-      expressions.add(stub.code);
-      if (member.isInstanceMember) {
-        expressions.add(js.quoteName(invocationName));
-      }
-      jsAst.Name callName = stub.callName;
-      jsAst.Literal callSelectorString =
-          (callName == null) ? new jsAst.LiteralNull() : js.quoteName(callName);
-      tearOffInfo.add(callSelectorString);
-    }
-
-    expressions
-      ..addAll(tearOffInfo)
-      ..add((tearOffName == null || member.isGetter || member.isSetter)
-          ? js("null")
-          : js.quoteName(tearOffName))
-      ..add(js.number(requiredParameterCount))
-      ..add(js.number(optionalParameterCount))
-      ..add(memberTypeExpression == null ? js("null") : memberTypeExpression);
-
-    if (canBeApplied) {
-      expressions.addAll(
-          task.metadataCollector.reifyDefaultArguments(member, outputUnit));
-
-      codegenWorldBuilder.forEachParameter(member, (_, String name, _2) {
-        expressions.add(task.metadataCollector.reifyName(name, outputUnit));
-      });
-    }
-    Name memberName = member.memberName;
-    if (isClosure && canBeApplied) {
-      expressions.add(js.string(namer.privateName(memberName)));
-    }
-
-    jsAst.ArrayInitializer arrayInit =
-        new jsAst.ArrayInitializer(expressions.toList());
-    compiler.dumpInfoTask
-        .registerEntityAst(member, builder.addProperty(name, arrayInit));
-  }
-
-  void addMemberField(Field field, ClassBuilder builder) {
-    // For now, do nothing.
-  }
-}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/declarations.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/declarations.dart
deleted file mode 100644
index ac14c66..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/declarations.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.js_emitter.full_emitter;
-
-/// Enables debugging of fast/slow objects using V8-specific primitives.
-const DEBUG_FAST_OBJECTS = false;
-
-/**
- * Call-back for adding property with [name] and [value].
- */
-typedef jsAst.Property AddPropertyFunction(
-    jsAst.Name name, jsAst.Expression value);
-
-// Compact field specifications.  The format of the field specification is
-// <accessorName>:<fieldName><suffix> where the suffix and accessor name
-// prefix are optional.  The suffix directs the generation of getter and
-// setter methods.  Each of the getter and setter has two bits to determine
-// the calling convention.  Setter listed below, getter is similar.
-//
-//     00: no setter
-//     01: function(value) { this.field = value; }
-//     10: function(receiver, value) { receiver.field = value; }
-//     11: function(receiver, value) { this.field = value; }
-//
-// The suffix encodes 4 bits using three ASCII ranges of non-identifier
-// characters.
-const FIELD_CODE_CHARACTERS = r"<=>?@{|}~%&'()*";
-const NO_FIELD_CODE = 0;
-const FIRST_FIELD_CODE = 1;
-const RANGE1_FIRST = 0x3c; //  <=>?@    encodes 1..5
-const RANGE1_LAST = 0x40;
-const RANGE2_FIRST = 0x7b; //  {|}~     encodes 6..9
-const RANGE2_LAST = 0x7e;
-const RANGE3_FIRST = 0x25; //  %&'()*+  encodes 10..16
-const RANGE3_LAST = 0x2b;
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/deferred_output_unit_hash.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/deferred_output_unit_hash.dart
deleted file mode 100644
index 8c79a8b..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/deferred_output_unit_hash.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.js_emitter.full_emitter;
-
-class _DeferredOutputUnitHash extends jsAst.DeferredString {
-  String _hash;
-  final OutputUnit _outputUnit;
-
-  _DeferredOutputUnitHash(this._outputUnit);
-
-  void setHash(String hash) {
-    assert(_hash == null);
-    _hash = hash;
-  }
-
-  String get value {
-    assert(_hash != null);
-    return '"$_hash"';
-  }
-
-  String toString() => "HashCode for ${_outputUnit} [$_hash]";
-}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
deleted file mode 100644
index d009d79..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ /dev/null
@@ -1,1719 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.js_emitter.full_emitter;
-
-import 'dart:convert';
-
-import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
-import 'package:js_runtime/shared/embedded_names.dart'
-    show JsBuiltin, JsGetName;
-
-import '../../../compiler_new.dart';
-import '../../common.dart';
-import '../../common_elements.dart' show CommonElements, ElementEnvironment;
-import '../../compiler.dart' show Compiler;
-import '../../constants/values.dart';
-import '../../deferred_load.dart' show OutputUnit, OutputUnitData;
-import '../../elements/entities.dart';
-import '../../hash/sha1.dart' show Hasher;
-import '../../io/code_output.dart';
-import '../../io/location_provider.dart' show LocationCollector;
-import '../../io/source_map_builder.dart' show SourceMapBuilder;
-import '../../js/js.dart' as jsAst;
-import '../../js/js.dart' show js;
-import '../../js_backend/js_backend.dart'
-    show ConstantEmitter, JavaScriptBackend, Namer;
-import '../../js_backend/native_data.dart';
-import '../../universe/call_structure.dart' show CallStructure;
-import '../../universe/world_builder.dart' show CodegenWorldBuilder;
-import '../../util/uri_extras.dart' show relativize;
-import '../../world.dart' show JClosedWorld;
-import '../constant_ordering.dart' show ConstantOrdering;
-import '../headers.dart';
-import '../js_emitter.dart' hide Emitter, EmitterFactory;
-import '../js_emitter.dart' as js_emitter show EmitterBase, EmitterFactory;
-import '../model.dart';
-import '../program_builder/program_builder.dart';
-import '../sorter.dart';
-
-import 'class_builder.dart';
-import 'class_emitter.dart';
-import 'container_builder.dart';
-import 'interceptor_emitter.dart';
-import 'nsm_emitter.dart';
-
-export 'class_builder.dart';
-export 'class_emitter.dart';
-export 'container_builder.dart';
-export 'interceptor_emitter.dart';
-export 'nsm_emitter.dart';
-
-part 'code_emitter_helper.dart';
-part 'declarations.dart';
-part 'deferred_output_unit_hash.dart';
-part 'setup_program_builder.dart';
-
-class EmitterFactory implements js_emitter.EmitterFactory {
-  final bool generateSourceMap;
-
-  EmitterFactory({this.generateSourceMap});
-
-  @override
-  bool get supportsReflection => true;
-
-  @override
-  Emitter createEmitter(CodeEmitterTask task, Namer namer,
-      JClosedWorld closedWorld, Sorter sorter) {
-    return new Emitter(
-        task.compiler, namer, closedWorld, generateSourceMap, task, sorter);
-  }
-}
-
-class Emitter extends js_emitter.EmitterBase {
-  final Compiler compiler;
-  final CodeEmitterTask task;
-  final JClosedWorld _closedWorld;
-
-  // The following fields will be set to copies of the program-builder's
-  // collector.
-  Map<OutputUnit, List<FieldEntity>> outputStaticNonFinalFieldLists;
-  Map<OutputUnit, Set<LibraryEntity>> outputLibraryLists;
-
-  final ContainerBuilder containerBuilder;
-  final ClassEmitter classEmitter;
-  final NsmEmitter nsmEmitter;
-  final InterceptorEmitter interceptorEmitter;
-  final Sorter _sorter;
-  final ConstantOrdering _constantOrdering;
-
-  // TODO(johnniwinther): Wrap these fields in a caching strategy.
-  final List<jsAst.Statement> cachedEmittedConstantsAst = <jsAst.Statement>[];
-
-  bool needsClassSupport = false;
-  bool needsMixinSupport = false;
-  bool needsLazyInitializer = false;
-
-  /// True if [ContainerBuilder.addMemberMethodFromInfo] used "structured info",
-  /// that is, some function was needed for reflection, had stubs, or had a
-  /// super alias.
-  bool needsStructuredMemberInfo = false;
-
-  final Namer namer;
-  ConstantEmitter constantEmitter;
-  NativeEmitter get nativeEmitter => task.nativeEmitter;
-  TypeTestRegistry get typeTestRegistry => task.typeTestRegistry;
-  CommonElements get commonElements => _closedWorld.commonElements;
-  ElementEnvironment get _elementEnvironment => _closedWorld.elementEnvironment;
-  CodegenWorldBuilder get _worldBuilder => compiler.codegenWorldBuilder;
-  OutputUnitData get _outputUnitData => _closedWorld.outputUnitData;
-
-  // The full code that is written to each hunk part-file.
-  Map<OutputUnit, CodeOutput> outputBuffers = new Map<OutputUnit, CodeOutput>();
-
-  String classesCollector;
-
-  JavaScriptBackend get backend => compiler.backend;
-
-  String get _ => space;
-  String get space => compiler.options.enableMinification ? "" : " ";
-  String get n => compiler.options.enableMinification ? "" : "\n";
-  String get N => compiler.options.enableMinification ? "\n" : ";\n";
-
-  /**
-   * List of expressions and statements that will be included in the
-   * precompiled function.
-   *
-   * To save space, dart2js normally generates constructors and accessors
-   * dynamically. This doesn't work in CSP mode, so dart2js emits them directly
-   * when in CSP mode.
-   */
-  Map<OutputUnit, List<jsAst.Node>> _cspPrecompiledFunctions =
-      new Map<OutputUnit, List<jsAst.Node>>();
-
-  Map<OutputUnit, List<jsAst.Expression>> _cspPrecompiledConstructorNames =
-      new Map<OutputUnit, List<jsAst.Expression>>();
-
-  /**
-   * Accumulate properties for classes and libraries, describing their
-   * static/top-level members.
-   * Later, these members are emitted when the class or library is emitted.
-   *
-   * See [getElementDescriptor].
-   */
-  // TODO(ahe): Generate statics with their class, and store only libraries in
-  // this map.
-  final Map<Fragment, Map<LibraryEntity, ClassBuilder>> libraryDescriptors =
-      new Map<Fragment, Map<LibraryEntity, ClassBuilder>>();
-
-  final Map<Fragment, Map<ClassEntity, ClassBuilder>> classDescriptors =
-      new Map<Fragment, Map<ClassEntity, ClassBuilder>>();
-
-  final bool generateSourceMap;
-
-  Emitter(this.compiler, this.namer, this._closedWorld, this.generateSourceMap,
-      this.task, Sorter sorter)
-      : classEmitter = new ClassEmitter(_closedWorld),
-        interceptorEmitter = new InterceptorEmitter(_closedWorld),
-        nsmEmitter = new NsmEmitter(_closedWorld),
-        _sorter = sorter,
-        containerBuilder = new ContainerBuilder(_closedWorld),
-        _constantOrdering = new ConstantOrdering(sorter) {
-    constantEmitter = new ConstantEmitter(
-        compiler.options,
-        _closedWorld.commonElements,
-        compiler.codegenWorldBuilder,
-        _closedWorld.rtiNeed,
-        compiler.backend.rtiEncoder,
-        _closedWorld.allocatorAnalysis,
-        task,
-        this.constantReference,
-        constantListGenerator);
-    containerBuilder.emitter = this;
-    classEmitter.emitter = this;
-    nsmEmitter.emitter = this;
-    interceptorEmitter.emitter = this;
-  }
-
-  DiagnosticReporter get reporter => compiler.reporter;
-
-  NativeData get _nativeData => _closedWorld.nativeData;
-
-  List<jsAst.Node> cspPrecompiledFunctionFor(OutputUnit outputUnit) {
-    return _cspPrecompiledFunctions.putIfAbsent(
-        outputUnit, () => new List<jsAst.Node>());
-  }
-
-  List<jsAst.Expression> cspPrecompiledConstructorNamesFor(
-      OutputUnit outputUnit) {
-    return _cspPrecompiledConstructorNames.putIfAbsent(
-        outputUnit, () => new List<jsAst.Expression>());
-  }
-
-  @override
-  bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) {
-    if (constant.isFunction) return true; // Already emitted.
-    if (constant.isPrimitive) return true; // Inlined.
-    if (constant.isDummy) return true; // Inlined.
-    // The name is null when the constant is already a JS constant.
-    // TODO(floitsch): every constant should be registered, so that we can
-    // share the ones that take up too much space (like some strings).
-    if (namer.constantName(constant) == null) return true;
-    return false;
-  }
-
-  @override
-  int compareConstants(ConstantValue a, ConstantValue b) {
-    // Inlined constants don't affect the order and sometimes don't even have
-    // names.
-    int cmp1 = isConstantInlinedOrAlreadyEmitted(a) ? 0 : 1;
-    int cmp2 = isConstantInlinedOrAlreadyEmitted(b) ? 0 : 1;
-    if (cmp1 + cmp2 < 2) return cmp1 - cmp2;
-
-    // Emit constant interceptors first. Constant interceptors for primitives
-    // might be used by code that builds other constants.  See Issue 18173.
-    if (a.isInterceptor != b.isInterceptor) {
-      return a.isInterceptor ? -1 : 1;
-    }
-
-    // Sorting by the long name clusters constants with the same constructor
-    // which compresses a tiny bit better.
-    int r = namer.constantLongName(a).compareTo(namer.constantLongName(b));
-    if (r != 0) return r;
-
-    // Resolve collisions in the long name by using a structural order.
-    return _constantOrdering.compare(a, b);
-  }
-
-  @override
-  jsAst.Expression constantReference(ConstantValue value) {
-    if (value.isFunction) {
-      FunctionConstantValue functionConstant = value;
-      return isolateStaticClosureAccess(functionConstant.element);
-    }
-
-    // We are only interested in the "isInlined" part, but it does not hurt to
-    // test for the other predicates.
-    if (isConstantInlinedOrAlreadyEmitted(value)) {
-      return constantEmitter.generate(value);
-    }
-    return js('#.#',
-        [namer.globalObjectForConstant(value), namer.constantName(value)]);
-  }
-
-  jsAst.Expression constantInitializerExpression(ConstantValue value) {
-    return constantEmitter.generate(value);
-  }
-
-  String get name => 'CodeEmitter';
-
-  String get finishIsolateConstructorName =>
-      '${namer.isolateName}.\$finishIsolateConstructor';
-  String get isolatePropertiesName =>
-      '${namer.isolateName}.${namer.isolatePropertiesName}';
-  String get lazyInitializerProperty => r'$lazy';
-  String get lazyInitializerName =>
-      '${namer.isolateName}.${lazyInitializerProperty}';
-  String get initName => 'init';
-
-  jsAst.Name get makeConstListProperty =>
-      namer.internalGlobal('makeConstantList');
-
-  /// For deferred loading we communicate the initializers via this global var.
-  final String deferredInitializers = r"$dart_deferred_initializers$";
-
-  /// Contains the global state that is needed to initialize and load a
-  /// deferred library.
-  String get globalsHolder => r"$globals$";
-
-  @override
-  jsAst.Expression generateEmbeddedGlobalAccess(String global) {
-    return js(generateEmbeddedGlobalAccessString(global));
-  }
-
-  String generateEmbeddedGlobalAccessString(String global) {
-    // TODO(floitsch): don't use 'init' as global embedder storage.
-    return '$initName.$global';
-  }
-
-  @override
-  jsAst.Expression isolateLazyInitializerAccess(FieldEntity element) {
-    return jsAst.js('#.#', [
-      namer.globalObjectForMember(element),
-      namer.lazyInitializerName(element)
-    ]);
-  }
-
-  @override
-  jsAst.Expression isolateStaticClosureAccess(FunctionEntity element) {
-    return jsAst.js('#.#()', [
-      namer.globalObjectForMember(element),
-      namer.staticClosureName(element)
-    ]);
-  }
-
-  @override
-  jsAst.PropertyAccess prototypeAccess(
-      ClassEntity element, bool hasBeenInstantiated) {
-    return jsAst.js('#.prototype', constructorAccess(element));
-  }
-
-  @override
-  jsAst.Template templateForBuiltin(JsBuiltin builtin) {
-    switch (builtin) {
-      case JsBuiltin.dartObjectConstructor:
-        return jsAst.js
-            .expressionTemplateYielding(typeAccess(commonElements.objectClass));
-
-      case JsBuiltin.isCheckPropertyToJsConstructorName:
-        int isPrefixLength = namer.operatorIsPrefix.length;
-        return jsAst.js.expressionTemplateFor('#.substring($isPrefixLength)');
-
-      case JsBuiltin.isFunctionType:
-        return backend.rtiEncoder.templateForIsFunctionType;
-
-      case JsBuiltin.isFutureOrType:
-        return backend.rtiEncoder.templateForIsFutureOrType;
-
-      case JsBuiltin.isVoidType:
-        return backend.rtiEncoder.templateForIsVoidType;
-
-      case JsBuiltin.isDynamicType:
-        return backend.rtiEncoder.templateForIsDynamicType;
-
-      case JsBuiltin.isJsInteropTypeArgument:
-        return backend.rtiEncoder.templateForIsJsInteropTypeArgument;
-
-      case JsBuiltin.rawRtiToJsConstructorName:
-        return jsAst.js.expressionTemplateFor("#.$typeNameProperty");
-
-      case JsBuiltin.rawRuntimeType:
-        return jsAst.js.expressionTemplateFor("#.constructor");
-
-      case JsBuiltin.isSubtype:
-        // TODO(floitsch): move this closer to where is-check properties are
-        // built.
-        String isPrefix = namer.operatorIsPrefix;
-        return jsAst.js
-            .expressionTemplateFor("('$isPrefix' + #) in #.prototype");
-
-      case JsBuiltin.isGivenTypeRti:
-        return jsAst.js.expressionTemplateFor('#.$typeNameProperty === #');
-
-      case JsBuiltin.getMetadata:
-        String metadataAccess =
-            generateEmbeddedGlobalAccessString(embeddedNames.METADATA);
-        return jsAst.js.expressionTemplateFor("$metadataAccess[#]");
-
-      case JsBuiltin.getType:
-        String typesAccess =
-            generateEmbeddedGlobalAccessString(embeddedNames.TYPES);
-        return jsAst.js.expressionTemplateFor("$typesAccess[#]");
-
-      default:
-        reporter.internalError(
-            NO_LOCATION_SPANNABLE, "Unhandled Builtin: $builtin");
-        return null;
-    }
-  }
-
-  @override
-  int generatedSize(OutputUnit unit) {
-    return outputBuffers[unit].length;
-  }
-
-  List<jsAst.Statement> buildTrivialNsmHandlers() {
-    return nsmEmitter.buildTrivialNsmHandlers();
-  }
-
-  jsAst.Statement buildNativeInfoHandler(
-      jsAst.Expression infoAccess,
-      jsAst.Expression constructorAccess,
-      jsAst.Expression subclassReadGenerator(jsAst.Expression subclass),
-      jsAst.Expression interceptorsByTagAccess,
-      jsAst.Expression leafTagsAccess) {
-    return NativeGenerator.buildNativeInfoHandler(infoAccess, constructorAccess,
-        subclassReadGenerator, interceptorsByTagAccess, leafTagsAccess);
-  }
-
-  /// In minified mode we want to keep the name for the most common core types.
-  bool _isNativeTypeNeedingReflectionName(ClassEntity element) {
-    return (element == commonElements.intClass ||
-        element == commonElements.doubleClass ||
-        element == commonElements.numClass ||
-        element == commonElements.stringClass ||
-        element == commonElements.boolClass ||
-        element == commonElements.nullClass ||
-        element == commonElements.listClass);
-  }
-
-  /// Returns the "reflection name" of a [ClassEntity], if needed.
-  ///
-  /// The reflection name of class 'C' is 'C'.
-  /// An anonymous mixin application has no reflection name.
-  ///
-  /// This is used by js_mirrors.dart.
-  // TODO(johnniwinther): Do we still need this when js_mirrors is deleted?
-  String getReflectionClassName(ClassEntity cls, jsAst.Name mangledName) {
-    // Make sure to retain names of common native types.
-    if (_isNativeTypeNeedingReflectionName(cls)) {
-      assert(!cls.isClosure);
-      assert(!_elementEnvironment.isUnnamedMixinApplication(cls));
-      return cls.name;
-    }
-    return null;
-  }
-
-  String namedParametersAsReflectionNames(CallStructure structure) {
-    if (structure.isUnnamed) return '';
-    String names = structure.getOrderedNamedArguments().join(':');
-    return ':$names';
-  }
-
-  jsAst.Statement buildCspPrecompiledFunctionFor(OutputUnit outputUnit) {
-    if (compiler.options.useContentSecurityPolicy) {
-      // TODO(ahe): Compute a hash code.
-      // TODO(sigurdm): Avoid this precompiled function. Generated
-      // constructor-functions and getter/setter functions can be stored in the
-      // library-description table. Setting properties on these can be moved to
-      // finishClasses.
-      return js.statement(r"""
-        #precompiled = function ($collectedClasses$) {
-          #norename;
-          var $desc;
-          #functions;
-          return #result;
-        };""", {
-        'norename': new jsAst.Comment("// ::norenaming:: "),
-        'precompiled': generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED),
-        'functions': cspPrecompiledFunctionFor(outputUnit),
-        'result': new jsAst.ArrayInitializer(
-            cspPrecompiledConstructorNamesFor(outputUnit))
-      });
-    } else {
-      return js.comment("Constructors are generated at runtime.");
-    }
-  }
-
-  void assembleClass(
-      Class cls, ClassBuilder enclosingBuilder, Fragment fragment) {
-    ClassEntity classElement = cls.element;
-    reporter.withCurrentElement(classElement, () {
-      classEmitter.emitClass(cls, enclosingBuilder, fragment);
-    });
-  }
-
-  void assembleStaticFunctions(
-      Iterable<Method> staticFunctions, Fragment fragment) {
-    if (staticFunctions == null) return;
-
-    for (Method method in staticFunctions) {
-      FunctionEntity element = method.element;
-      // We need to filter out null-elements for the interceptors.
-      // TODO(floitsch): use the precomputed interceptors here.
-      if (element == null) continue;
-      ClassBuilder builder = new ClassBuilder.forStatics(element, namer);
-      containerBuilder.addMemberMethod(method, builder);
-      getStaticMethodDescriptor(element, fragment)
-          .properties
-          .addAll(builder.properties);
-    }
-  }
-
-  jsAst.Statement buildStaticNonFinalFieldInitializations(
-      OutputUnit outputUnit) {
-    jsAst.Statement buildInitialization(
-        FieldEntity element, jsAst.Expression initialValue) {
-      return js.statement('${namer.staticStateHolder}.# = #',
-          [namer.globalPropertyNameForMember(element), initialValue]);
-    }
-
-    bool inMainUnit = (outputUnit == _outputUnitData.mainOutputUnit);
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-
-    Iterable<FieldEntity> fields = outputStaticNonFinalFieldLists[outputUnit];
-    // If the outputUnit does not contain any static non-final fields, then
-    // [fields] is `null`.
-    if (fields != null) {
-      for (FieldEntity element in fields) {
-        reporter.withCurrentElement(element, () {
-          ConstantValue constant =
-              _worldBuilder.getConstantFieldInitializer(element);
-          parts.add(buildInitialization(element, constantReference(constant)));
-        });
-      }
-    }
-
-    if (inMainUnit && outputStaticNonFinalFieldLists.length > 1) {
-      // In the main output-unit we output a stub initializer for deferred
-      // variables, so that `isolateProperties` stays a fast object.
-      outputStaticNonFinalFieldLists
-          .forEach((OutputUnit fieldsOutputUnit, Iterable<FieldEntity> fields) {
-        if (fieldsOutputUnit == outputUnit) return; // Skip the main unit.
-        for (FieldEntity element in fields) {
-          reporter.withCurrentElement(element, () {
-            parts.add(buildInitialization(element, jsAst.number(0)));
-          });
-        }
-      });
-    }
-
-    return new jsAst.Block(parts);
-  }
-
-  jsAst.Statement buildLazilyInitializedStaticFields(
-      Iterable<StaticField> lazyFields,
-      {bool isMainFragment: true}) {
-    if (lazyFields.isNotEmpty) {
-      needsLazyInitializer = true;
-      List<jsAst.Expression> laziesInfo =
-          buildLaziesInfo(lazyFields, isMainFragment);
-      return js.statement('''
-      (function(lazies) {
-        for (var i = 0; i < lazies.length; ) {
-          var fieldName = lazies[i++];
-          var getterName = lazies[i++];
-          var lazyValue = lazies[i++];
-          if (#notMinified) {
-            var staticName = lazies[i++];
-          }
-          if (#isDeferredFragment) {
-            var fieldHolder = lazies[i++];
-          }
-          // We build the lazy-check here:
-          //   lazyInitializer(fieldName, getterName, lazyValue, staticName);
-          // 'staticName' is used for error reporting in non-minified mode.
-          // 'lazyValue' must be a closure that constructs the initial value.
-          if (#isMainFragment) {
-            if (#notMinified) {
-              #lazy(fieldName, getterName, lazyValue, staticName);
-            } else {
-              #lazy(fieldName, getterName, lazyValue);
-            }
-          } else {
-            if (#notMinified) {
-              #lazy(fieldName, getterName, lazyValue, staticName, fieldHolder);
-            } else {
-              #lazy(fieldName, getterName, lazyValue, null, fieldHolder);
-            }
-          }
-        }
-      })(#laziesInfo)
-      ''', {
-        'notMinified': !compiler.options.enableMinification,
-        'laziesInfo': new jsAst.ArrayInitializer(laziesInfo),
-        'lazy': js(lazyInitializerName),
-        'isMainFragment': isMainFragment,
-        'isDeferredFragment': !isMainFragment
-      });
-    } else {
-      return js.comment("No lazy statics.");
-    }
-  }
-
-  List<jsAst.Expression> buildLaziesInfo(
-      Iterable<StaticField> lazies, bool isMainFragment) {
-    List<jsAst.Expression> laziesInfo = <jsAst.Expression>[];
-    for (StaticField field in lazies) {
-      laziesInfo.add(js.quoteName(field.name));
-      laziesInfo.add(js.quoteName(namer.deriveLazyInitializerName(field.name)));
-      laziesInfo.add(field.code);
-      if (!compiler.options.enableMinification) {
-        laziesInfo.add(js.quoteName(field.name));
-      }
-      if (!isMainFragment) {
-        laziesInfo.add(js('#', field.holder.name));
-      }
-    }
-    return laziesInfo;
-  }
-
-  jsAst.Statement buildMetadata(Program program, OutputUnit outputUnit) {
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-
-    jsAst.Expression metadata = program.metadataForOutputUnit(outputUnit);
-    jsAst.Expression types = program.metadataTypesForOutputUnit(outputUnit);
-
-    if (outputUnit == _outputUnitData.mainOutputUnit) {
-      jsAst.Expression metadataAccess =
-          generateEmbeddedGlobalAccess(embeddedNames.METADATA);
-      jsAst.Expression typesAccess =
-          generateEmbeddedGlobalAccess(embeddedNames.TYPES);
-
-      parts
-        ..add(js.statement('# = #;', [metadataAccess, metadata]))
-        ..add(js.statement('# = #;', [typesAccess, types]));
-    } else if (types != null) {
-      parts.add(
-          js.statement('var ${namer.deferredMetadataName} = #;', metadata));
-      parts.add(js.statement('var ${namer.deferredTypesName} = #;', types));
-    }
-    return new jsAst.Block(parts);
-  }
-
-  jsAst.Statement buildCompileTimeConstants(List<Constant> constants,
-      {bool isMainFragment}) {
-    assert(isMainFragment != null);
-
-    if (constants.isEmpty) return js.comment("No constants in program.");
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-    for (Constant constant in constants) {
-      ConstantValue constantValue = constant.value;
-      parts.add(buildConstantInitializer(constantValue));
-    }
-
-    return new jsAst.Block(parts);
-  }
-
-  jsAst.Statement buildConstantInitializer(ConstantValue constant) {
-    jsAst.Name name = namer.constantName(constant);
-    jsAst.Statement initializer = js.statement('#.# = #', [
-      namer.globalObjectForConstant(constant),
-      name,
-      constantInitializerExpression(constant)
-    ]);
-    compiler.dumpInfoTask.registerConstantAst(constant, initializer);
-    return initializer;
-  }
-
-  jsAst.Expression constantListGenerator(jsAst.Expression array) {
-    // TODO(floitsch): there is no harm in caching the template.
-    return js('${namer.isolateName}.#(#)', [makeConstListProperty, array]);
-  }
-
-  jsAst.Statement buildMakeConstantList(bool outputContainsConstantList) {
-    if (outputContainsConstantList) {
-      return js.statement(r'''
-          // Functions are stored in the hidden class and not as properties in
-          // the object. We never actually look at the value, but only want
-          // to know if the property exists.
-          #.# = function (list) {
-            list.immutable$list = Array;
-            list.fixed$length = Array;
-            return list;
-          }''', [namer.isolateName, makeConstListProperty]);
-    } else {
-      return js.comment("Output contains no constant list.");
-    }
-  }
-
-  jsAst.Statement buildFunctionThatReturnsNull() {
-    return js.statement('#.# = function() {}',
-        [namer.isolateName, backend.rtiEncoder.getFunctionThatReturnsNullName]);
-  }
-
-  jsAst.Expression generateFunctionThatReturnsNull() {
-    return js("#.#",
-        [namer.isolateName, backend.rtiEncoder.getFunctionThatReturnsNullName]);
-  }
-
-  buildMain(jsAst.Statement invokeMain) {
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-
-    if (NativeGenerator.needsIsolateAffinityTagInitialization(
-        _closedWorld.backendUsage)) {
-      parts.add(NativeGenerator.generateIsolateAffinityTagInitialization(
-          _closedWorld.backendUsage, generateEmbeddedGlobalAccess, js("""
-        // On V8, the 'intern' function converts a string to a symbol, which
-        // makes property access much faster.
-        function (s) {
-          var o = {};
-          o[s] = 1;
-          return Object.keys(convertToFastObject(o))[0];
-        }""", [])));
-    }
-
-    parts
-      ..add(js.comment('BEGIN invoke [main].'))
-      ..add(invokeMain)
-      ..add(js.comment('END invoke [main].'));
-
-    return new jsAst.Block(parts);
-  }
-
-  jsAst.Statement buildInitFunction(bool outputContainsConstantList) {
-    jsAst.Expression allClassesAccess =
-        generateEmbeddedGlobalAccess(embeddedNames.ALL_CLASSES);
-    jsAst.Expression getTypeFromNameAccess =
-        generateEmbeddedGlobalAccess(embeddedNames.GET_TYPE_FROM_NAME);
-    jsAst.Expression interceptorsByTagAccess =
-        generateEmbeddedGlobalAccess(embeddedNames.INTERCEPTORS_BY_TAG);
-    jsAst.Expression leafTagsAccess =
-        generateEmbeddedGlobalAccess(embeddedNames.LEAF_TAGS);
-    jsAst.Expression finishedClassesAccess =
-        generateEmbeddedGlobalAccess(embeddedNames.FINISHED_CLASSES);
-    jsAst.Expression cyclicThrow =
-        staticFunctionAccess(commonElements.cyclicThrowHelper);
-    jsAst.Expression laziesAccess =
-        generateEmbeddedGlobalAccess(embeddedNames.LAZIES);
-
-    return js.statement("""
-      function init() {
-        $isolatePropertiesName = Object.create(null);
-        #allClasses = map();
-        #getTypeFromName = function(name) {return #allClasses[name];};
-        #interceptorsByTag = map();
-        #leafTags = map();
-        #finishedClasses = map();
-
-        if (#needsLazyInitializer) {
-          // [staticName] is only provided in non-minified mode. If missing, we
-          // fall back to [fieldName]. Likewise, [prototype] is optional and
-          // defaults to the isolateProperties object.
-          $lazyInitializerName = function (fieldName, getterName, lazyValue,
-                                           staticName, prototype) {
-            if (!#lazies) #lazies = Object.create(null);
-            #lazies[fieldName] = getterName;
-
-            // 'prototype' will be undefined except if we are doing an update
-            // during incremental compilation. In this case we put the lazy
-            // field directly on the isolate instead of the isolateProperties.
-            prototype = prototype || $isolatePropertiesName;
-            var sentinelUndefined = {};
-            var sentinelInProgress = {};
-            prototype[fieldName] = sentinelUndefined;
-
-            prototype[getterName] = function () {
-              var result = this[fieldName];
-              if (result == sentinelInProgress) {
-                // In minified mode, static name is not provided, so fall back
-                // to the minified fieldName.
-                #cyclicThrow(staticName || fieldName);
-              }
-              try {
-                if (result === sentinelUndefined) {
-                  this[fieldName] = sentinelInProgress;
-                  try {
-                    result = this[fieldName] = lazyValue();
-                  } finally {
-                    // Use try-finally, not try-catch/throw as it destroys the
-                    // stack trace.
-                    if (result === sentinelUndefined)
-                      this[fieldName] = null;
-                  }
-                }
-                return result;
-              } finally {
-                this[getterName] = function() { return this[fieldName]; };
-              }
-            }
-          }
-        }
-
-        // We replace the old Isolate function with a new one that initializes
-        // all its fields with the initial (and often final) value of all
-        // globals.
-        //
-        // We also copy over old values like the prototype, and the
-        // isolateProperties themselves.
-        $finishIsolateConstructorName = function (oldIsolate) {
-          var isolateProperties = oldIsolate.#isolatePropertiesName;
-          function Isolate() {
-
-            var staticNames = Object.keys(isolateProperties);
-            for (var i = 0; i < staticNames.length; i++) {
-              var staticName = staticNames[i];
-              this[staticName] = isolateProperties[staticName];
-            }
-
-            // Reset lazy initializers to null.
-            // When forcing the object to fast mode (below) v8 will consider
-            // functions as part the object's map. Since we will change them
-            // (after the first call to the getter), we would have a map
-            // transition.
-            var lazies = init.lazies;
-            var lazyInitializers = lazies ? Object.keys(lazies) : [];
-            for (var i = 0; i < lazyInitializers.length; i++) {
-               this[lazies[lazyInitializers[i]]] = null;
-            }
-
-            // Use the newly created object as prototype. In Chrome,
-            // this creates a hidden class for the object and makes
-            // sure it is fast to access.
-            function ForceEfficientMap() {}
-            ForceEfficientMap.prototype = this;
-            new ForceEfficientMap();
-
-            // Now, after being a fast map we can set the lazies again.
-            for (var i = 0; i < lazyInitializers.length; i++) {
-              var lazyInitName = lazies[lazyInitializers[i]];
-              this[lazyInitName] = isolateProperties[lazyInitName];
-            }
-          }
-          Isolate.prototype = oldIsolate.prototype;
-          Isolate.prototype.constructor = Isolate;
-          Isolate.#isolatePropertiesName = isolateProperties;
-          if (#outputContainsConstantList) {
-            Isolate.#makeConstListProperty = oldIsolate.#makeConstListProperty;
-          }
-          Isolate.#functionThatReturnsNullProperty =
-              oldIsolate.#functionThatReturnsNullProperty;
-          return Isolate;
-      }
-
-      }""", {
-      'allClasses': allClassesAccess,
-      'getTypeFromName': getTypeFromNameAccess,
-      'interceptorsByTag': interceptorsByTagAccess,
-      'leafTags': leafTagsAccess,
-      'finishedClasses': finishedClassesAccess,
-      'needsLazyInitializer': needsLazyInitializer,
-      'lazies': laziesAccess,
-      'cyclicThrow': cyclicThrow,
-      'isolatePropertiesName': namer.isolatePropertiesName,
-      'outputContainsConstantList': outputContainsConstantList,
-      'makeConstListProperty': makeConstListProperty,
-      'functionThatReturnsNullProperty':
-          backend.rtiEncoder.getFunctionThatReturnsNullName,
-    });
-  }
-
-  jsAst.Statement buildConvertToFastObjectFunction() {
-    List<jsAst.Statement> debugCode = <jsAst.Statement>[];
-    if (DEBUG_FAST_OBJECTS) {
-      debugCode.add(js.statement(r'''
-        // The following only works on V8 when run with option
-        // "--allow-natives-syntax".  We use'new Function' because the
-         // miniparser does not understand V8 native syntax.
-        if (typeof print === "function") {
-          var HasFastProperties =
-            new Function("a", "return %HasFastProperties(a)");
-          print("Size of global object: "
-                   + String(Object.getOwnPropertyNames(properties).length)
-                   + ", fast properties " + HasFastProperties(properties));
-        }'''));
-    }
-
-    return js.statement(r'''
-      function convertToFastObject(properties) {
-        // Create an instance that uses 'properties' as prototype. This should
-        // make 'properties' a fast object.
-        function MyClass() {};
-        MyClass.prototype = properties;
-        new MyClass();
-        #;
-        return properties;
-      }''', [debugCode]);
-  }
-
-  jsAst.Statement buildConvertToSlowObjectFunction() {
-    return js.statement(r'''
-    function convertToSlowObject(properties) {
-      // Add and remove a property to make the object transition into hashmap
-      // mode.
-      properties.__MAGIC_SLOW_PROPERTY = 1;
-      delete properties.__MAGIC_SLOW_PROPERTY;
-      return properties;
-    }''');
-  }
-
-  jsAst.Statement buildSupportsDirectProtoAccess() {
-    jsAst.Statement supportsDirectProtoAccess;
-
-    supportsDirectProtoAccess = js.statement(r'''
-      var supportsDirectProtoAccess = (function () {
-        var cls = function () {};
-        cls.prototype = {'p': {}};
-        var object = new cls();
-        if (!(object.__proto__ && object.__proto__.p === cls.prototype.p))
-          return false;
-
-        try {
-          // Are we running on a platform where the performance is good?
-          // (i.e. Chrome or d8).
-
-          // Chrome userAgent?
-          if (typeof navigator != "undefined" &&
-              typeof navigator.userAgent == "string" &&
-              navigator.userAgent.indexOf("Chrome/") >= 0) return true;
-
-          // d8 version() looks like "N.N.N.N", jsshell version() like "N".
-          if (typeof version == "function" &&
-              version.length == 0) {
-            var v = version();
-            if (/^\d+\.\d+\.\d+\.\d+$/.test(v)) return true;
-          }
-        } catch(_) {}
-
-        return false;
-      })();
-    ''');
-
-    return supportsDirectProtoAccess;
-  }
-
-  jsAst.Expression generateLibraryDescriptor(
-      LibraryEntity library, Fragment fragment) {
-    dynamic uri = "";
-    if (!compiler.options.enableMinification) {
-      uri = library.canonicalUri;
-      if (uri.scheme == 'file' && compiler.options.outputUri != null) {
-        uri =
-            relativize(compiler.options.outputUri, library.canonicalUri, false);
-      }
-    }
-
-    String libraryName = !compiler.options.enableMinification
-        ? _elementEnvironment.getLibraryName(library)
-        : "";
-
-    jsAst.Fun metadata = null;
-
-    ClassBuilder descriptor = libraryDescriptors[fragment][library];
-
-    jsAst.ObjectInitializer initializer;
-    if (descriptor == null) {
-      // Nothing of the library was emitted.
-      // TODO(floitsch): this should not happen. We currently have an example
-      // with language/prefix6_negative_test.dart where we have an instance
-      // method without its corresponding class.
-      initializer = new jsAst.ObjectInitializer([]);
-    } else {
-      initializer = descriptor.toObjectInitializer();
-    }
-
-    compiler.dumpInfoTask.registerEntityAst(library, metadata);
-    compiler.dumpInfoTask.registerEntityAst(library, initializer);
-
-    List<jsAst.Expression> parts = <jsAst.Expression>[];
-    parts
-      ..add(js.string(libraryName))
-      ..add(js.string(uri.toString()))
-      ..add(metadata == null ? new jsAst.ArrayHole() : metadata)
-      ..add(js('#', namer.globalObjectForLibrary(library)))
-      ..add(initializer);
-    if (library == _closedWorld.elementEnvironment.mainLibrary) {
-      parts.add(js.number(1));
-    }
-
-    return new jsAst.ArrayInitializer(parts);
-  }
-
-  void assemblePrecompiledConstructor(
-      OutputUnit outputUnit,
-      jsAst.Name constructorName,
-      jsAst.Expression constructorAst,
-      List<jsAst.Name> fields) {
-    cspPrecompiledFunctionFor(outputUnit)
-        .add(new jsAst.FunctionDeclaration(constructorName, constructorAst));
-
-    cspPrecompiledFunctionFor(outputUnit).add(js.statement(r'''
-        {
-          #constructorName.#typeNameProperty = #constructorNameString;
-          // IE does not have a name property.
-          if (!("name" in #constructorName))
-              #constructorName.name = #constructorNameString;
-          $desc = $collectedClasses$.#constructorName[1];
-          #constructorName.prototype = $desc;
-        }''', {
-      "constructorName": constructorName,
-      "typeNameProperty": typeNameProperty,
-      "constructorNameString": js.quoteName(constructorName),
-    }));
-
-    cspPrecompiledConstructorNamesFor(outputUnit).add(js('#', constructorName));
-  }
-
-  jsAst.Statement buildGlobalObjectSetup(bool isProgramSplit) {
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-
-    parts.add(js.comment("""
-      // The global objects start as so-called "slow objects". For V8, this
-      // means that it won't try to make map transitions as we add properties
-      // to these objects. Later on, we attempt to turn these objects into
-      // fast objects by calling "convertToFastObject" (see
-      // [emitConvertToFastObjectFunction]).
-      """));
-
-    for (String globalObject in Namer.reservedGlobalObjectNames) {
-      if (isProgramSplit) {
-        String template =
-            "var #globalObject = #globalsHolder.#globalObject = map();";
-        parts.add(js.statement(template,
-            {"globalObject": globalObject, "globalsHolder": globalsHolder}));
-      } else {
-        parts.add(js.statement(
-            "var #globalObject = map();", {"globalObject": globalObject}));
-      }
-    }
-
-    return new jsAst.Block(parts);
-  }
-
-  jsAst.Statement buildConvertGlobalObjectToFastObjects() {
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-
-    for (String globalObject in Namer.reservedGlobalObjectNames) {
-      parts.add(js.statement(
-          '#globalObject = convertToFastObject(#globalObject);',
-          {"globalObject": globalObject}));
-    }
-
-    return new jsAst.Block(parts);
-  }
-
-  jsAst.Statement buildDebugFastObjectCode() {
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-
-    if (DEBUG_FAST_OBJECTS) {
-      parts.add(js.statement(r'''
-          // The following only works on V8 when run with option
-          // "--allow-natives-syntax".  We use'new Function' because the
-          // miniparser does not understand V8 native syntax.
-          if (typeof print === "function") {
-            var HasFastProperties =
-              new Function("a", "return %HasFastProperties(a)");
-            print("Size of global helper object: "
-                   + String(Object.getOwnPropertyNames(H).length)
-                   + ", fast properties " + HasFastProperties(H));
-            print("Size of global platform object: "
-                   + String(Object.getOwnPropertyNames(P).length)
-                   + ", fast properties " + HasFastProperties(P));
-            print("Size of global dart:html object: "
-                   + String(Object.getOwnPropertyNames(W).length)
-                   + ", fast properties " + HasFastProperties(W));
-            print("Size of isolate properties object: "
-                   + String(Object.getOwnPropertyNames($).length)
-                   + ", fast properties " + HasFastProperties($));
-            print("Size of constant object: "
-                   + String(Object.getOwnPropertyNames(C).length)
-                   + ", fast properties " + HasFastProperties(C));
-            var names = Object.getOwnPropertyNames($);
-            for (var i = 0; i < names.length; i++) {
-              print("$." + names[i]);
-            }
-          }
-       '''));
-
-      for (String object in Namer.userGlobalObjects) {
-        parts.add(js.statement('''
-          if (typeof print === "function") {
-            print("Size of " + #objectString + ": "
-                  + String(Object.getOwnPropertyNames(#object).length)
-                  + ", fast properties " + HasFastProperties(#object));
-          }
-        ''', {"object": object, "objectString": js.string(object)}));
-      }
-    }
-
-    return new jsAst.Block(parts);
-  }
-
-  void checkEverythingEmitted(
-      Map<ClassEntity, ClassBuilder> pendingClassBuilders) {
-    if (pendingClassBuilders == null) return;
-    List<ClassEntity> pendingClasses =
-        _sorter.sortClasses(pendingClassBuilders.keys);
-
-    pendingClasses.forEach((ClassEntity element) => reporter.reportInfo(
-        element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
-
-    if (pendingClasses != null && !pendingClasses.isEmpty) {
-      reporter.internalError(
-          pendingClasses.first, 'Pending statics (see above).');
-    }
-  }
-
-  void assembleLibrary(Library library, Fragment fragment) {
-    LibraryEntity libraryElement = library.element;
-
-    assembleStaticFunctions(library.statics, fragment);
-
-    ClassBuilder libraryBuilder =
-        getLibraryDescriptor(libraryElement, fragment);
-    for (Class cls in library.classes) {
-      assembleClass(cls, libraryBuilder, fragment);
-    }
-
-    classEmitter.emitFields(library, libraryBuilder, emitStatics: true);
-  }
-
-  void assembleProgram(Program program) {
-    for (Fragment fragment in program.fragments) {
-      for (Library library in fragment.libraries) {
-        assembleLibrary(library, fragment);
-      }
-    }
-  }
-
-  jsAst.Statement buildDeferredHeader() {
-    /// For deferred loading we communicate the initializers via this global
-    /// variable. The deferred hunks will add their initialization to this.
-    /// The semicolon is important in minified mode, without it the
-    /// following parenthesis looks like a call to the object literal.
-    return js.statement(
-        'self.#deferredInitializers = '
-        'self.#deferredInitializers || Object.create(null);',
-        {'deferredInitializers': deferredInitializers});
-  }
-
-  jsAst.Program buildOutputAstForMain(Program program,
-      Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes) {
-    MainFragment mainFragment = program.mainFragment;
-    OutputUnit mainOutputUnit = mainFragment.outputUnit;
-    bool isProgramSplit = program.isSplit;
-
-    List<jsAst.Statement> statements = <jsAst.Statement>[];
-
-    statements..add(buildGeneratedBy())..add(js.comment(HOOKS_API_USAGE));
-
-    if (isProgramSplit) {
-      statements.add(buildDeferredHeader());
-    }
-
-    // Collect the AST for the descriptors.
-    Map<LibraryEntity, ClassBuilder> descriptors =
-        libraryDescriptors[mainFragment] ?? const {};
-
-    checkEverythingEmitted(classDescriptors[mainFragment]);
-
-    Iterable<LibraryEntity> libraries = outputLibraryLists[mainOutputUnit];
-    if (libraries == null) libraries = <LibraryEntity>[];
-
-    List<jsAst.Expression> parts = <jsAst.Expression>[];
-    for (LibraryEntity library in _sorter.sortLibraries(libraries)) {
-      parts.add(generateLibraryDescriptor(library, mainFragment));
-      descriptors.remove(library);
-    }
-
-    if (descriptors.isNotEmpty) {
-      List<LibraryEntity> remainingLibraries = descriptors.keys.toList();
-
-      // The remaining descriptors are only accessible through reflection.
-      // The program builder does not collect libraries that only
-      // contain typedefs that are used for reflection.
-      for (LibraryEntity element in remainingLibraries) {
-        parts.add(generateLibraryDescriptor(element, mainFragment));
-        descriptors.remove(element);
-      }
-    }
-    jsAst.ArrayInitializer descriptorsAst = new jsAst.ArrayInitializer(parts);
-
-    // Using a named function here produces easier to read stack traces in
-    // Chrome/V8.
-    statements.add(js.statement("""
-    (function() {
-       // No renaming in the top-level function to save the locals for the
-       // nested context where they will be used more. We have to put the
-       // comment into a hole as the parser strips out comments right away.
-       #disableVariableRenaming;
-       #supportsDirectProtoAccess;
-
-       if (#isProgramSplit) {
-         /// We collect all the global state, so it can be passed to the
-         /// initializer of deferred files.
-         var #globalsHolder = Object.create(null)
-       }
-
-       // [map] returns an object that V8 shouldn't try to optimize with a
-       // hidden class. This prevents a potential performance problem where V8
-       // tries to build a hidden class for an object used as a hashMap.
-       // It requires fewer characters to declare a variable as a parameter than
-       // with `var`.
-       function map(x) {
-         x = Object.create(null);
-         x.x = 0;
-         delete x.x;
-         return x;
-       }
-
-       #globalObjectSetup;
-
-       function #isolateName() {}
-
-       if (#isProgramSplit) {
-         #globalsHolder.#isolateName = #isolateName;
-         #globalsHolder.#initName = #initName;
-         #globalsHolder.#setupProgramName = #setupProgramName;
-       }
-
-       init();
-
-       #cspPrecompiledFunctions;
-
-       #setupProgram;
-
-       #functionThatReturnsNull;
-
-       // The argument to reflectionDataParser is assigned to a temporary 'dart'
-       // so that 'dart.' will appear as the prefix to dart methods in stack
-       // traces and profile entries.
-       var dart = #descriptors;
-
-       #setupProgramName(dart, 0, 0);
-
-       #getInterceptorMethods;
-       #oneShotInterceptors;
-
-       #makeConstantList;
-
-       // We abuse the short name used for the isolate here to store
-       // the isolate properties. This is safe as long as the real isolate
-       // object does not exist yet.
-       var ${namer.staticStateHolder} = #isolatePropertiesName;
-
-       // Constants in checked mode call into RTI code to set type information
-       // which may need getInterceptor (and one-shot interceptor) methods, so
-       // we have to make sure that [emitGetInterceptorMethods] and
-       // [emitOneShotInterceptors] have been called.
-       #compileTimeConstants;
-
-       // Static field initializations require the classes and compile-time
-       // constants to be set up.
-       #staticNonFinalInitializers;
-
-       ${namer.staticStateHolder} = null;
-
-       #deferredBoilerPlate;
-
-       #typeToInterceptorMap;
-
-       #lazyStaticFields;
-
-       #isolateName = $finishIsolateConstructorName(#isolateName);
-
-       ${namer.staticStateHolder} = new #isolateName();
-
-       #metadata;
-
-       #convertToFastObject;
-       #convertToSlowObject;
-
-       #convertGlobalObjectsToFastObjects;
-       #debugFastObjects;
-
-       #init;
-
-       #main;
-    })();
-    """, {
-      "disableVariableRenaming": js.comment("/* ::norenaming:: */"),
-      "isProgramSplit": isProgramSplit,
-      "supportsDirectProtoAccess": buildSupportsDirectProtoAccess(),
-      "globalsHolder": globalsHolder,
-      "globalObjectSetup": buildGlobalObjectSetup(isProgramSplit),
-      "isolateName": namer.isolateName,
-      "isolatePropertiesName": js(isolatePropertiesName),
-      "initName": initName,
-      "functionThatReturnsNull": buildFunctionThatReturnsNull(),
-      "setupProgram": buildSetupProgram(
-          program, compiler, backend, namer, this, _closedWorld),
-      "setupProgramName": setupProgramName,
-      "descriptors": descriptorsAst,
-      "cspPrecompiledFunctions": buildCspPrecompiledFunctionFor(mainOutputUnit),
-      "getInterceptorMethods": interceptorEmitter.buildGetInterceptorMethods(),
-      "oneShotInterceptors": interceptorEmitter.buildOneShotInterceptors(),
-      "makeConstantList":
-          buildMakeConstantList(program.outputContainsConstantList),
-      "compileTimeConstants": buildCompileTimeConstants(mainFragment.constants,
-          isMainFragment: true),
-      "deferredBoilerPlate": buildDeferredBoilerPlate(deferredLoadHashes),
-      "staticNonFinalInitializers":
-          buildStaticNonFinalFieldInitializations(mainOutputUnit),
-      "typeToInterceptorMap":
-          interceptorEmitter.buildTypeToInterceptorMap(program),
-      "lazyStaticFields": buildLazilyInitializedStaticFields(
-          mainFragment.staticLazilyInitializedFields),
-      "metadata": buildMetadata(program, mainOutputUnit),
-      "convertToFastObject": buildConvertToFastObjectFunction(),
-      "convertToSlowObject": buildConvertToSlowObjectFunction(),
-      "convertGlobalObjectsToFastObjects":
-          buildConvertGlobalObjectToFastObjects(),
-      "debugFastObjects": buildDebugFastObjectCode(),
-      "init": buildInitFunction(program.outputContainsConstantList),
-      "main": buildMain(mainFragment.invokeMain)
-    }));
-
-    return new jsAst.Program(statements);
-  }
-
-  void emitMainOutputUnit(OutputUnit mainOutputUnit, jsAst.Program program) {
-    LocationCollector locationCollector;
-    List<CodeOutputListener> codeOutputListeners;
-    if (generateSourceMap) {
-      locationCollector = new LocationCollector();
-      codeOutputListeners = <CodeOutputListener>[locationCollector];
-    }
-
-    CodeOutput mainOutput = new StreamCodeOutput(
-        compiler.outputProvider.createOutputSink('', 'js', OutputType.js),
-        codeOutputListeners);
-    outputBuffers[mainOutputUnit] = mainOutput;
-
-    mainOutput.addBuffer(jsAst.createCodeBuffer(
-        program, compiler.options, backend.sourceInformationStrategy,
-        monitor: compiler.dumpInfoTask));
-
-    if (compiler.options.deferredMapUri != null) {
-      outputDeferredMap();
-    }
-
-    if (generateSourceMap) {
-      mainOutput.add(SourceMapBuilder.generateSourceMapTag(
-          compiler.options.sourceMapUri, compiler.options.outputUri));
-    }
-
-    mainOutput.close();
-
-    if (generateSourceMap) {
-      SourceMapBuilder.outputSourceMap(
-          mainOutput,
-          locationCollector,
-          namer.createMinifiedGlobalNameMap(),
-          namer.createMinifiedInstanceNameMap(),
-          '',
-          compiler.options.sourceMapUri,
-          compiler.options.outputUri,
-          compiler.outputProvider);
-    }
-  }
-
-  Map<OutputUnit, jsAst.Expression> buildDescriptorsForOutputUnits(
-      Program program) {
-    Map<OutputUnit, jsAst.Expression> outputs =
-        new Map<OutputUnit, jsAst.Expression>();
-
-    for (Fragment fragment in program.deferredFragments) {
-      OutputUnit outputUnit = fragment.outputUnit;
-
-      Map<LibraryEntity, ClassBuilder> descriptors =
-          libraryDescriptors[fragment];
-
-      if (descriptors != null && descriptors.isNotEmpty) {
-        Iterable<LibraryEntity> libraries = outputLibraryLists[outputUnit];
-        if (libraries == null) libraries = <LibraryEntity>[];
-
-        // TODO(johnniwinther): Avoid creating [CodeBuffer]s.
-        List<jsAst.Expression> parts = <jsAst.Expression>[];
-        for (LibraryEntity library in _sorter.sortLibraries(libraries)) {
-          parts.add(generateLibraryDescriptor(library, fragment));
-          descriptors.remove(library);
-        }
-
-        outputs[outputUnit] = new jsAst.ArrayInitializer(parts);
-      }
-    }
-
-    return outputs;
-  }
-
-  void finalizeTokensInAst(
-      jsAst.Program main, Iterable<jsAst.Program> deferredParts) {
-    jsAst.TokenCounter counter = new jsAst.TokenCounter();
-    counter.countTokens(main);
-    deferredParts.forEach(counter.countTokens);
-    task.metadataCollector.finalizeTokens();
-    if (backend.namer is jsAst.TokenFinalizer) {
-      dynamic finalizer = backend.namer;
-      finalizer.finalizeTokens();
-    }
-  }
-
-  int emitProgram(ProgramBuilder programBuilder) {
-    Program program =
-        programBuilder.buildProgram(storeFunctionTypesInMetadata: true);
-    if (retainDataForTesting) {
-      programForTesting = program;
-    }
-
-    outputStaticNonFinalFieldLists =
-        programBuilder.collector.outputStaticNonFinalFieldLists;
-    outputLibraryLists = programBuilder.collector.outputLibraryLists;
-
-    assembleProgram(program);
-
-    // Construct the ASTs for all deferred output units.
-    Map<OutputUnit, jsAst.Program> deferredParts =
-        buildOutputAstForDeferredCode(program);
-
-    Map<OutputUnit, _DeferredOutputUnitHash> deferredHashTokens =
-        new Map<OutputUnit, _DeferredOutputUnitHash>.fromIterables(
-            deferredParts.keys, deferredParts.keys.map((OutputUnit unit) {
-      return new _DeferredOutputUnitHash(unit);
-    }));
-
-    jsAst.Program mainOutput =
-        buildOutputAstForMain(program, deferredHashTokens);
-
-    finalizeTokensInAst(mainOutput, deferredParts.values);
-
-    // Emit deferred units first, so we have their hashes.
-    // Map from OutputUnit to a hash of its content. The hash uniquely
-    // identifies the code of the output-unit. It does not include
-    // boilerplate JS code, like the sourcemap directives or the hash
-    // itself.
-    Map<OutputUnit, String> deferredLoadHashes =
-        emitDeferredOutputUnits(deferredParts);
-
-    deferredHashTokens.forEach((OutputUnit key, _DeferredOutputUnitHash token) {
-      token.setHash(deferredLoadHashes[key]);
-    });
-    emitMainOutputUnit(program.mainFragment.outputUnit, mainOutput);
-
-    if (_closedWorld.backendUsage.requiresPreamble &&
-        !backend.htmlLibraryIsLoaded) {
-      reporter.reportHintMessage(NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
-    }
-    // Return the total program size.
-    return outputBuffers.values.fold(0, (a, b) => a + b.length);
-  }
-
-  ClassBuilder getStaticMethodDescriptor(
-      FunctionEntity element, Fragment fragment) {
-    if (!_nativeData.isNativeMember(element)) {
-      // For static (not top level) elements, record their code in a buffer
-      // specific to the class. For now, not supported for native classes and
-      // native elements.
-      ClassEntity cls = element.enclosingClass;
-      if (compiler.codegenWorldBuilder.directlyInstantiatedClasses
-              .contains(cls) &&
-          !_nativeData.isNativeClass(cls) &&
-          _outputUnitData.outputUnitForMember(element) ==
-              _outputUnitData.outputUnitForClass(cls)) {
-        return classDescriptors
-            .putIfAbsent(fragment, () => new Map<ClassEntity, ClassBuilder>())
-            .putIfAbsent(cls, () {
-          return new ClassBuilder.forClass(cls, namer);
-        });
-      }
-    }
-    return _getLibraryDescriptor(element, element.library, fragment);
-  }
-
-  ClassBuilder getLibraryDescriptor(LibraryEntity element, Fragment fragment) {
-    return _getLibraryDescriptor(element, element, fragment);
-  }
-
-  ClassBuilder _getLibraryDescriptor(
-      Entity element, LibraryEntity owner, Fragment fragment) {
-    if (owner == null) {
-      reporter.internalError(element, 'Owner is null.');
-    }
-    return libraryDescriptors
-        .putIfAbsent(fragment, () => new Map<LibraryEntity, ClassBuilder>())
-        .putIfAbsent(owner, () {
-      return new ClassBuilder.forLibrary(owner, namer);
-    });
-  }
-
-  /// Emits support-code for deferred loading into [output].
-  jsAst.Statement buildDeferredBoilerPlate(
-      Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes) {
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-
-    parts.add(js.statement('''
-        {
-          // Function for checking if a hunk is loaded given its hash.
-          #isHunkLoaded = function(hunkHash) {
-            return !!$deferredInitializers[hunkHash];
-          };
-          #deferredInitialized = new Object(null);
-          // Function for checking if a hunk is initialized given its hash.
-          #isHunkInitialized = function(hunkHash) {
-            return #deferredInitialized[hunkHash];
-          };
-          // Function for initializing a loaded hunk, given its hash.
-          #initializeLoadedHunk = function(hunkHash) {
-            var hunk = $deferredInitializers[hunkHash];
-            if (hunk == null) {
-                throw "DeferredLoading state error: code with hash '" +
-                    hunkHash + "' was not loaded";
-            }
-            hunk(#globalsHolder, ${namer.staticStateHolder});
-            #deferredInitialized[hunkHash] = true;
-          };
-        }
-        ''', {
-      "globalsHolder": globalsHolder,
-      "isHunkLoaded":
-          generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_LOADED),
-      "isHunkInitialized":
-          generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_INITIALIZED),
-      "initializeLoadedHunk":
-          generateEmbeddedGlobalAccess(embeddedNames.INITIALIZE_LOADED_HUNK),
-      "deferredInitialized":
-          generateEmbeddedGlobalAccess(embeddedNames.DEFERRED_INITIALIZED)
-    }));
-
-    void store(
-        jsAst.Expression map, jsAst.Expression uris, jsAst.Expression hashes) {
-      void assign(String name, jsAst.Expression value) {
-        parts.add(
-            js.statement('# = #', [generateEmbeddedGlobalAccess(name), value]));
-      }
-
-      assign(embeddedNames.DEFERRED_LIBRARY_PARTS, map);
-      assign(embeddedNames.DEFERRED_PART_URIS, uris);
-      assign(embeddedNames.DEFERRED_PART_HASHES, hashes);
-    }
-
-    createDeferredLoadingData(
-        compiler.deferredLoadTask.hunksToLoad, deferredLoadHashes, store);
-
-    return new jsAst.Block(parts);
-  }
-
-  // Create data used for loading and initializing the hunks for a deferred
-  // import. There are three parts: a map from loadId to list of parts, where
-  // parts are represented as an index; an array of uris indexed by part; and an
-  // array of hashes indexed by part.
-  void createDeferredLoadingData(
-      Map<String, List<OutputUnit>> loadMap,
-      Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes,
-      void finish(jsAst.Expression map, jsAst.Expression uris,
-          jsAst.Expression hashes)) {
-    Map<OutputUnit, int> fragmentIndexes = <OutputUnit, int>{};
-    var uris = <jsAst.Expression>[];
-    var hashes = <jsAst.Expression>[];
-
-    List<jsAst.Property> libraryPartsMapEntries = <jsAst.Property>[];
-
-    loadMap.forEach((String loadId, List<OutputUnit> fragmentList) {
-      List<jsAst.Expression> indexes = <jsAst.Expression>[];
-      for (OutputUnit fragment in fragmentList) {
-        int index = fragmentIndexes[fragment];
-        if (index == null) {
-          index = fragmentIndexes[fragment] = fragmentIndexes.length;
-          uris.add(js.escapedString(
-              compiler.deferredLoadTask.deferredPartFileName(fragment.name)));
-          hashes.add(deferredLoadHashes[fragment]);
-        }
-        indexes.add(js.number(index));
-      }
-      libraryPartsMapEntries.add(new jsAst.Property(
-          js.string(loadId), new jsAst.ArrayInitializer(indexes)));
-    });
-
-    finish(new jsAst.ObjectInitializer(libraryPartsMapEntries),
-        new jsAst.ArrayInitializer(uris), new jsAst.ArrayInitializer(hashes));
-  }
-
-  Map<OutputUnit, jsAst.Program> buildOutputAstForDeferredCode(
-      Program program) {
-    if (!program.isSplit) return const <OutputUnit, jsAst.Program>{};
-
-    Map<OutputUnit, jsAst.Program> result =
-        new Map<OutputUnit, jsAst.Program>();
-
-    Map<OutputUnit, jsAst.Expression> deferredAsts =
-        buildDescriptorsForOutputUnits(program);
-
-    for (Fragment fragment in program.deferredFragments) {
-      OutputUnit outputUnit = fragment.outputUnit;
-      jsAst.Expression libraryDescriptor = deferredAsts[outputUnit];
-      List<jsAst.Statement> body = <jsAst.Statement>[];
-
-      // No renaming in the top-level function to save the locals for the
-      // nested context where they will be used more.
-      body.add(js.comment("/* ::norenaming:: "));
-
-      for (String globalObject in Namer.reservedGlobalObjectNames) {
-        body.add(js.statement('var #object = #globalsHolder.#object;',
-            {'globalsHolder': globalsHolder, 'object': globalObject}));
-      }
-      body
-        ..add(js.statement('var init = #globalsHolder.init;',
-            {'globalsHolder': globalsHolder}))
-        ..add(js.statement(
-            'var $setupProgramName = '
-            '#globalsHolder.$setupProgramName;',
-            {'globalsHolder': globalsHolder}))
-        ..add(js.statement(
-            'var ${namer.isolateName} = '
-            '#globalsHolder.${namer.isolateName};',
-            {'globalsHolder': globalsHolder}));
-      String metadataAccess =
-          generateEmbeddedGlobalAccessString(embeddedNames.METADATA);
-      String typesAccess =
-          generateEmbeddedGlobalAccessString(embeddedNames.TYPES);
-      if (libraryDescriptor != null) {
-        // The argument to reflectionDataParser is assigned to a temporary
-        // 'dart' so that 'dart.' will appear as the prefix to dart methods
-        // in stack traces and profile entries.
-        body.add(js.statement('var dart = #', libraryDescriptor));
-
-        if (compiler.options.useContentSecurityPolicy) {
-          body.add(buildCspPrecompiledFunctionFor(outputUnit));
-        }
-        body.add(js.statement('$setupProgramName('
-            'dart, ${metadataAccess}.length, ${typesAccess}.length);'));
-      }
-
-      body
-        ..add(buildMetadata(program, outputUnit))
-        ..add(js.statement('${metadataAccess}.push.apply(${metadataAccess}, '
-            '${namer.deferredMetadataName});'))
-        ..add(js.statement('${typesAccess}.push.apply(${typesAccess}, '
-            '${namer.deferredTypesName});'));
-
-      body.add(
-          buildCompileTimeConstants(fragment.constants, isMainFragment: false));
-      body.add(buildStaticNonFinalFieldInitializations(outputUnit));
-      body.add(buildLazilyInitializedStaticFields(
-          fragment.staticLazilyInitializedFields,
-          isMainFragment: false));
-
-      List<jsAst.Statement> statements = <jsAst.Statement>[];
-
-      statements
-        ..add(buildGeneratedBy())
-        ..add(buildDeferredHeader())
-        ..add(js.statement(
-            '${deferredInitializers}.current = '
-            """function (#, ${namer.staticStateHolder}) {
-                                  #
-                                }
-                             """,
-            [globalsHolder, body]));
-
-      result[outputUnit] = new jsAst.Program(statements);
-    }
-
-    return result;
-  }
-
-  /// Returns a map from OutputUnit to a hash of its content. The hash uniquely
-  /// identifies the code of the output-unit. It does not include
-  /// boilerplate JS code, like the sourcemap directives or the hash
-  /// itself.
-  Map<OutputUnit, String> emitDeferredOutputUnits(
-      Map<OutputUnit, jsAst.Program> outputAsts) {
-    Map<OutputUnit, String> hunkHashes = new Map<OutputUnit, String>();
-
-    for (OutputUnit outputUnit in outputAsts.keys) {
-      List<CodeOutputListener> outputListeners = <CodeOutputListener>[];
-      Hasher hasher = new Hasher();
-      outputListeners.add(hasher);
-
-      LocationCollector locationCollector;
-      if (generateSourceMap) {
-        locationCollector = new LocationCollector();
-        outputListeners.add(locationCollector);
-      }
-
-      String partPrefix = compiler.deferredLoadTask
-          .deferredPartFileName(outputUnit.name, addExtension: false);
-      CodeOutput output = new StreamCodeOutput(
-          compiler.outputProvider
-              .createOutputSink(partPrefix, 'part.js', OutputType.jsPart),
-          outputListeners);
-
-      outputBuffers[outputUnit] = output;
-
-      output.addBuffer(jsAst.createCodeBuffer(outputAsts[outputUnit],
-          compiler.options, backend.sourceInformationStrategy,
-          monitor: compiler.dumpInfoTask));
-
-      // Make a unique hash of the code (before the sourcemaps are added)
-      // This will be used to retrieve the initializing function from the global
-      // variable.
-      String hash = hasher.getHash();
-
-      output.add('$N${deferredInitializers}["$hash"]$_=$_'
-          '${deferredInitializers}.current$N');
-
-      if (generateSourceMap) {
-        Uri mapUri, partUri;
-        Uri sourceMapUri = compiler.options.sourceMapUri;
-        Uri outputUri = compiler.options.outputUri;
-
-        String partName = "$partPrefix.part";
-
-        if (sourceMapUri != null) {
-          String mapFileName = partName + ".js.map";
-          List<String> mapSegments = sourceMapUri.pathSegments.toList();
-          mapSegments[mapSegments.length - 1] = mapFileName;
-          mapUri =
-              compiler.options.sourceMapUri.replace(pathSegments: mapSegments);
-        }
-
-        if (outputUri != null) {
-          String partFileName = partName + ".js";
-          List<String> partSegments = outputUri.pathSegments.toList();
-          partSegments[partSegments.length - 1] = partFileName;
-          partUri =
-              compiler.options.outputUri.replace(pathSegments: partSegments);
-        }
-
-        output.add(SourceMapBuilder.generateSourceMapTag(mapUri, partUri));
-        output.close();
-        SourceMapBuilder.outputSourceMap(output, locationCollector, {}, {},
-            partName, mapUri, partUri, compiler.outputProvider);
-      } else {
-        output.close();
-      }
-
-      hunkHashes[outputUnit] = hash;
-    }
-    return hunkHashes;
-  }
-
-  jsAst.Comment buildGeneratedBy() {
-    StringBuffer flavor = new StringBuffer();
-    flavor.write('full emitter');
-    // TODO(johnniwinther): Remove this flavor.
-    flavor.write(', strong');
-    if (compiler.options.trustPrimitives) flavor.write(', trust primitives');
-    if (compiler.options.omitImplicitChecks) flavor.write(', omit checks');
-    if (compiler.options.laxRuntimeTypeToString) {
-      flavor.write(', lax runtime type');
-    }
-    if (compiler.options.useContentSecurityPolicy) flavor.write(', CSP');
-    if (_closedWorld.backendUsage.isMirrorsUsed) flavor.write(', mirrors');
-    return new jsAst.Comment(generatedBy(compiler, flavor: '$flavor'));
-  }
-
-  void outputDeferredMap() {
-    Map<String, dynamic> mapping = new Map<String, dynamic>();
-    // Json does not support comments, so we embed the explanation in the
-    // data.
-    mapping["_comment"] = "This mapping shows which compiled `.js` files are "
-        "needed for a given deferred library import.";
-    mapping.addAll(compiler.deferredLoadTask.computeDeferredMap());
-    compiler.outputProvider.createOutputSink(
-        compiler.options.deferredMapUri.path, '', OutputType.info)
-      ..add(const JsonEncoder.withIndent("  ").convert(mapping))
-      ..close();
-  }
-}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart
deleted file mode 100644
index e7afba7..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.js_emitter.full_emitter.interceptor_emitter;
-
-import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
-import '../../elements/entities.dart';
-import '../../js/js.dart' as jsAst;
-import '../../js/js.dart' show js;
-import '../../world.dart' show JClosedWorld;
-import '../js_emitter.dart' hide Emitter, EmitterFactory;
-import '../model.dart';
-import 'emitter.dart';
-
-class InterceptorEmitter extends CodeEmitterHelper {
-  final JClosedWorld closedWorld;
-  final Set<jsAst.Name> interceptorInvocationNames = new Set<jsAst.Name>();
-
-  InterceptorEmitter(this.closedWorld);
-
-  void recordMangledNameOfMemberMethod(MemberEntity member, jsAst.Name name) {
-    if (closedWorld.interceptorData.isInterceptedMethod(member)) {
-      interceptorInvocationNames.add(name);
-    }
-  }
-
-  jsAst.Expression buildGetInterceptorMethod(
-      jsAst.Name key, Set<ClassEntity> classes) {
-    InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(
-        compiler.options,
-        closedWorld.commonElements,
-        backend.emitter,
-        backend.nativeCodegenEnqueuer,
-        namer,
-        backend.oneShotInterceptorData,
-        backend.customElementsCodegenAnalysis,
-        compiler.codegenWorldBuilder,
-        closedWorld);
-    jsAst.Expression function =
-        stubGenerator.generateGetInterceptorMethod(classes);
-
-    return function;
-  }
-
-  /**
-   * Emit all versions of the [:getInterceptor:] method.
-   */
-  jsAst.Statement buildGetInterceptorMethods() {
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-
-    parts.add(js.comment('getInterceptor methods'));
-
-    Iterable<jsAst.Name> names =
-        backend.oneShotInterceptorData.specializedGetInterceptorNames;
-    for (jsAst.Name name in names) {
-      Set<ClassEntity> classes =
-          backend.oneShotInterceptorData.getSpecializedGetInterceptorsFor(name);
-      parts.add(js.statement('#.# = #', [
-        namer.globalObjectForLibrary(
-            closedWorld.commonElements.interceptorsLibrary),
-        name,
-        buildGetInterceptorMethod(name, classes)
-      ]));
-    }
-
-    return new jsAst.Block(parts);
-  }
-
-  jsAst.Statement buildOneShotInterceptors() {
-    List<jsAst.Statement> parts = <jsAst.Statement>[];
-    Iterable<jsAst.Name> names =
-        backend.oneShotInterceptorData.oneShotInterceptorNames;
-
-    InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(
-        compiler.options,
-        closedWorld.commonElements,
-        backend.emitter,
-        backend.nativeCodegenEnqueuer,
-        namer,
-        backend.oneShotInterceptorData,
-        backend.customElementsCodegenAnalysis,
-        compiler.codegenWorldBuilder,
-        closedWorld);
-    String globalObject = namer
-        .globalObjectForLibrary(closedWorld.commonElements.interceptorsLibrary);
-    for (jsAst.Name name in names) {
-      jsAst.Expression function =
-          stubGenerator.generateOneShotInterceptor(name);
-      parts.add(js.statement('${globalObject}.# = #', [name, function]));
-    }
-
-    return new jsAst.Block(parts);
-  }
-
-  /**
-   * Emit initializer for `typeToInterceptorMap` data structure used by
-   * `findInterceptorForType`.  See declaration of `typeToInterceptor` in
-   * `interceptors.dart`.
-   */
-  jsAst.Statement buildTypeToInterceptorMap(Program program) {
-    jsAst.Expression array = program.typeToInterceptorMap;
-    if (array == null) return js.comment("Empty type-to-interceptor map.");
-
-    jsAst.Expression typeToInterceptorMap = emitter
-        .generateEmbeddedGlobalAccess(embeddedNames.TYPE_TO_INTERCEPTOR_MAP);
-    return js.statement('# = #', [typeToInterceptorMap, array]);
-  }
-}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
deleted file mode 100644
index 4f1d533..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
+++ /dev/null
@@ -1,398 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.js_emitter.full_emitter.nsm_emitter;
-
-import '../../elements/entities.dart';
-import '../../js/js.dart' as jsAst;
-import '../../js/js.dart' show js;
-import '../../js_backend/js_backend.dart' show GetterName, SetterName;
-import '../../universe/selector.dart' show Selector;
-import 'package:front_end/src/api_unstable/dart2js.dart'
-    show $$, $A, $HASH, $Z, $a, $z;
-import '../../world.dart' show JClosedWorld;
-import '../js_emitter.dart' hide Emitter, EmitterFactory;
-import '../model.dart';
-import 'emitter.dart';
-
-class NsmEmitter extends CodeEmitterHelper {
-  final JClosedWorld closedWorld;
-  final List<Selector> trivialNsmHandlers = <Selector>[];
-
-  NsmEmitter(this.closedWorld);
-
-  /// If this is true then we can generate the noSuchMethod handlers at startup
-  /// time, instead of them being emitted as part of the Object class.
-  bool get generateTrivialNsmHandlers => true;
-
-  // If we need fewer than this many noSuchMethod handlers we can save space by
-  // just emitting them in JS, rather than emitting the JS needed to generate
-  // them at run time.
-  static const VERY_FEW_NO_SUCH_METHOD_HANDLERS = 10;
-
-  static const MAX_MINIFIED_LENGTH_FOR_DIFF_ENCODING = 4;
-
-  void emitNoSuchMethodHandlers(AddPropertyFunction addProperty) {
-    ClassStubGenerator generator = new ClassStubGenerator(task.emitter,
-        closedWorld.commonElements, namer, codegenWorldBuilder, closedWorld,
-        enableMinification: compiler.options.enableMinification);
-
-    // Keep track of the JavaScript names we've already added so we
-    // do not introduce duplicates (bad for code size).
-    Map<jsAst.Name, Selector> addedJsNames =
-        generator.computeSelectorsForNsmHandlers();
-
-    // Set flag used by generateMethod helper below.  If we have very few
-    // handlers we use addProperty for them all, rather than try to generate
-    // them at runtime.
-    bool haveVeryFewNoSuchMemberHandlers =
-        (addedJsNames.length < VERY_FEW_NO_SUCH_METHOD_HANDLERS);
-    List<jsAst.Name> names = addedJsNames.keys.toList()..sort();
-    for (jsAst.Name jsName in names) {
-      Selector selector = addedJsNames[jsName];
-      List<jsAst.Expression> argNames = selector.callStructure
-          .getOrderedNamedArguments()
-          .map((String name) => js.string(name))
-          .toList();
-      int type = selector.invocationMirrorKind;
-      if (!haveVeryFewNoSuchMemberHandlers &&
-          isTrivialNsmHandler(type, argNames, selector, jsName)) {
-        trivialNsmHandlers.add(selector);
-      } else {
-        StubMethod method =
-            generator.generateStubForNoSuchMethod(jsName, selector);
-        addProperty(method.name, method.code);
-      }
-    }
-  }
-
-  // Identify the noSuchMethod handlers that are so simple that we can
-  // generate them programatically.
-  bool isTrivialNsmHandler(
-      int type, List argNames, Selector selector, jsAst.Name internalName) {
-    if (!generateTrivialNsmHandlers) return false;
-    // Check for named arguments.
-    if (argNames.length != 0) return false;
-    if (selector.typeArgumentCount > 0) return false;
-    // Check for unexpected name (this doesn't really happen).
-    if (internalName is GetterName) return type == 1;
-    if (internalName is SetterName) return type == 2;
-    return type == 0;
-  }
-
-  /**
-   * Adds (at runtime) the handlers to the Object class which catch calls to
-   * methods that the object does not have.  The handlers create an invocation
-   * mirror object.
-   *
-   * The current version only gives you the minified name when minifying (when
-   * not minifying this method is not called).
-   *
-   * In order to generate the noSuchMethod handlers we only need the minified
-   * name of the method.  We test the first character of the minified name to
-   * determine if it is a getter or a setter, and we use the arguments array at
-   * runtime to get the number of arguments and their values.  If the method
-   * involves named arguments etc. then we don't handle it here, but emit the
-   * handler method directly on the Object class.
-   *
-   * The minified names are mostly 1-4 character names, which we emit in sorted
-   * order (primary key is length, secondary ordering is lexicographic).  This
-   * gives an order like ... dD dI dX da ...
-   *
-   * Gzip is good with repeated text, but it can't diff-encode, so we do that
-   * for it.  We encode the minified names in a comma-separated string, but all
-   * the 1-4 character names are encoded before the first comma as a series of
-   * base 26 numbers.  The last digit of each number is lower case, the others
-   * are upper case, so 1 is "b" and 26 is "Ba".
-   *
-   * We think of the minified names as base 88 numbers using the ASCII
-   * characters from # to z.  The base 26 numbers each encode the delta from
-   * the previous minified name to the next.  So if there is a minified name
-   * called Df and the next is Dh, then they are 2971 and 2973 when thought of
-   * as base 88 numbers.  The difference is 2, which is "c" in lower-case-
-   * terminated base 26.
-   *
-   * The reason we don't encode long minified names with this method is that
-   * decoding the base 88 numbers would overflow JavaScript's puny integers.
-   *
-   * There are some selectors that have a special calling convention (because
-   * they are called with the receiver as the first argument).  They need a
-   * slightly different noSuchMethod handler, so we handle these first.
-   */
-  List<jsAst.Statement> buildTrivialNsmHandlers() {
-    List<jsAst.Statement> statements = <jsAst.Statement>[];
-    if (trivialNsmHandlers.length == 0) return statements;
-
-    bool minify = compiler.options.enableMinification;
-    bool useDiffEncoding = minify && trivialNsmHandlers.length > 30;
-
-    // Find out how many selectors there are with the special calling
-    // convention.
-    Iterable<Selector> interceptedSelectors = trivialNsmHandlers.where(
-        (Selector s) => closedWorld.interceptorData.isInterceptedName(s.name));
-    Iterable<Selector> ordinarySelectors = trivialNsmHandlers.where(
-        (Selector s) => !closedWorld.interceptorData.isInterceptedName(s.name));
-
-    // Get the short names (JS names, perhaps minified).
-    Iterable<jsAst.Name> interceptedShorts =
-        interceptedSelectors.map(namer.invocationMirrorInternalName);
-    Iterable<jsAst.Name> ordinaryShorts =
-        ordinarySelectors.map(namer.invocationMirrorInternalName);
-
-    jsAst.Expression sortedShorts;
-    Iterable<String> sortedLongs;
-    if (useDiffEncoding) {
-      assert(minify);
-      sortedShorts =
-          new _DiffEncodedListOfNames([interceptedShorts, ordinaryShorts]);
-    } else {
-      Iterable<Selector> sorted =
-          [interceptedSelectors, ordinarySelectors].expand((e) => (e));
-      sortedShorts = js.concatenateStrings(
-          js.joinLiterals(sorted.map(namer.invocationMirrorInternalName),
-              js.stringPart(",")),
-          addQuotes: true);
-
-      if (!minify) {
-        sortedLongs =
-            sorted.map((selector) => selector.invocationMirrorMemberName);
-      }
-    }
-    // Startup code that loops over the method names and puts handlers on the
-    // Object class to catch noSuchMethod invocations.
-    ClassEntity objectClass = closedWorld.commonElements.objectClass;
-    jsAst.Expression createInvocationMirror = backend.emitter
-        .staticFunctionAccess(
-            closedWorld.commonElements.createInvocationMirror);
-    if (useDiffEncoding) {
-      statements.add(js.statement('''{
-          var objectClassObject = processedClasses.collected[#objectClass],
-              nameSequences = #diffEncoding.split("."),
-              shortNames = [];
-          if (objectClassObject instanceof Array)
-              objectClassObject = objectClassObject[1];
-          for (var j = 0; j < nameSequences.length; ++j) {
-              var sequence = nameSequences[j].split(","),
-                nameNumber = 0;
-            // If we are loading a deferred library the object class will not be
-            // in the collectedClasses so objectClassObject is undefined, and we
-            // skip setting up the names.
-            if (!objectClassObject) break;
-            // Likewise, if the current sequence is empty, we don't process it.
-            if (sequence.length == 0) continue;
-            var diffEncodedString = sequence[0];
-            for (var i = 0; i < diffEncodedString.length; i++) {
-              var codes = [],
-                  diff = 0,
-                  digit = diffEncodedString.charCodeAt(i);
-              for (; digit <= ${$Z};) {
-                diff *= 26;
-                diff += (digit - ${$A});
-                digit = diffEncodedString.charCodeAt(++i);
-              }
-              diff *= 26;
-              diff += (digit - ${$a});
-              nameNumber += diff;
-              for (var remaining = nameNumber;
-                   remaining > 0;
-                   remaining = (remaining / 88) | 0) {
-                codes.unshift(${$HASH} + remaining % 88);
-              }
-              shortNames.push(
-                String.fromCharCode.apply(String, codes));
-            }
-            if (sequence.length > 1) {
-              Array.prototype.push.apply(shortNames, sequence.shift());
-            }
-          }
-        }''', {
-        'objectClass': js.quoteName(namer.className(objectClass)),
-        'diffEncoding': sortedShorts
-      }));
-    } else {
-      // No useDiffEncoding version.
-      statements.add(js.statement(
-          'var objectClassObject = processedClasses.collected[#objectClass],'
-          '    shortNames = #diffEncoding.split(",")',
-          {
-            'objectClass': js.quoteName(namer.className(objectClass)),
-            'diffEncoding': sortedShorts
-          }));
-      if (!minify) {
-        statements.add(js.statement('var longNames = #longs.split(",")',
-            {'longs': js.string(sortedLongs.join(','))}));
-      }
-      statements.add(js.statement('if (objectClassObject instanceof Array)'
-          '  objectClassObject = objectClassObject[1];'));
-    }
-
-    dynamic isIntercepted = // jsAst.Expression or bool.
-        interceptedSelectors.isEmpty
-            ? false
-            : ordinarySelectors.isEmpty
-                ? true
-                : js('j < #', js.number(interceptedSelectors.length));
-
-    statements.add(js.statement('''
-      // If we are loading a deferred library the object class will not be in
-      // the collectedClasses so objectClassObject is undefined, and we skip
-      // setting up the names.
-      if (objectClassObject) {
-        for (var j = 0; j < shortNames.length; j++) {
-          var type = 0;
-          var shortName = shortNames[j];
-          if (shortName.indexOf("${namer.getterPrefix}") == 0) type = 1;
-          if (shortName.indexOf("${namer.setterPrefix}") == 0) type = 2;
-          // Generate call to:
-          //
-          //     createInvocationMirror(String name, internalName, type,
-          //         arguments, argumentNames, typeArgumentCount)
-          //
-
-          // This 'if' is either a static choice or dynamic choice depending on
-          // [isIntercepted].
-          if (#isIntercepted) {
-            objectClassObject[shortName] =
-                (function(name, shortName, type) {
-                  return function(receiver) {
-                    return this.#noSuchMethodName(
-                      receiver,
-                      #createInvocationMirror(name, shortName, type,
-                          // Create proper Array with all arguments except first
-                          // (receiver).
-                          Array.prototype.slice.call(arguments, 1),
-                          [],
-                          0));
-                  }
-                 })(#names[j], shortName, type);
-          } else {
-            objectClassObject[shortName] =
-                (function(name, shortName, type) {
-                  return function() {
-                    return this.#noSuchMethodName(
-                      // Object.noSuchMethodName ignores the explicit receiver
-                      // argument. We could pass anything in place of [this].
-                      this,
-                      #createInvocationMirror(name, shortName, type,
-                          // Create proper Array with all arguments.
-                          Array.prototype.slice.call(arguments, 0),
-                          [],
-                          0));
-                  }
-                 })(#names[j], shortName, type);
-          }
-        }
-      }''', {
-      'noSuchMethodName': namer.noSuchMethodName,
-      'createInvocationMirror': createInvocationMirror,
-      'names': minify ? 'shortNames' : 'longNames',
-      'isIntercepted': isIntercepted
-    }));
-
-    return statements;
-  }
-}
-
-/// When pretty printed, this node computes a diff-encoded string for the list
-/// of given names.
-///
-/// See [buildTrivialNsmHandlers].
-class _DiffEncodedListOfNames extends jsAst.DeferredString
-    implements jsAst.AstContainer {
-  String _cachedValue;
-  List<jsAst.ArrayInitializer> ast;
-
-  Iterable<jsAst.Node> get containedNodes => ast;
-
-  _DiffEncodedListOfNames(Iterable<Iterable<jsAst.Name>> names) {
-    // Store the names in ArrayInitializer nodes to make them discoverable
-    // by traversals of the ast.
-    ast = names
-        .map((Iterable i) => new jsAst.ArrayInitializer(i.toList()))
-        .toList();
-  }
-
-  void _computeDiffEncodingForList(
-      Iterable<jsAst.Name> names, StringBuffer diffEncoding) {
-    // Treat string as a number in base 88 with digits in ASCII order from # to
-    // z.  The short name sorting is based on length, and uses ASCII order for
-    // equal length strings so this means that names are ascending.  The hash
-    // character, #, is never given as input, but we need it because it's the
-    // implicit leading zero (otherwise we could not code names with leading
-    // dollar signs).
-    int fromBase88(String x) {
-      int answer = 0;
-      for (int i = 0; i < x.length; i++) {
-        int c = x.codeUnitAt(i);
-        // No support for Unicode minified identifiers in JS.
-        assert(c >= $$ && c <= $z);
-        answer *= 88;
-        answer += c - $HASH;
-      }
-      return answer;
-    }
-
-    // Big endian encoding, A = 0, B = 1...
-    // A lower case letter terminates the number.
-    String toBase26(int x) {
-      int c = x;
-      var encodingChars = <int>[];
-      encodingChars.add($a + (c % 26));
-      while (true) {
-        c ~/= 26;
-        if (c == 0) break;
-        encodingChars.add($A + (c % 26));
-      }
-      return new String.fromCharCodes(encodingChars.reversed.toList());
-    }
-
-    // Sort by length, then lexicographic.
-    int compare(String a, String b) {
-      if (a.length != b.length) return a.length - b.length;
-      return a.compareTo(b);
-    }
-
-    List<String> shorts = names.map((jsAst.Name name) => name.name).toList()
-      ..sort(compare);
-
-    int previous = 0;
-    for (String short in shorts) {
-      if (short.length <= NsmEmitter.MAX_MINIFIED_LENGTH_FOR_DIFF_ENCODING) {
-        int base63 = fromBase88(short);
-        int diff = base63 - previous;
-        previous = base63;
-        String base26Diff = toBase26(diff);
-        diffEncoding.write(base26Diff);
-      } else {
-        if (diffEncoding.length != 0) {
-          diffEncoding.write(',');
-        }
-        diffEncoding.write(short);
-      }
-    }
-  }
-
-  String _computeDiffEncoding() {
-    StringBuffer buffer = new StringBuffer();
-    for (jsAst.ArrayInitializer list in ast) {
-      if (buffer.isNotEmpty) {
-        // Emit period that resets the diff base to zero when we switch to
-        // normal calling convention (this avoids the need to code negative
-        // diffs).
-        buffer.write(".");
-      }
-      List<jsAst.Name> names = list.elements;
-      _computeDiffEncodingForList(names, buffer);
-    }
-    return '"${buffer.toString()}"';
-  }
-
-  String get value {
-    if (_cachedValue == null) {
-      _cachedValue = _computeDiffEncoding();
-    }
-
-    return _cachedValue;
-  }
-}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
deleted file mode 100644
index a6a0143..0000000
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
+++ /dev/null
@@ -1,815 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart2js.js_emitter.full_emitter;
-
-// TODO(ahe): Share these with js_helper.dart.
-const FUNCTION_INDEX = 0;
-const NAME_INDEX = 1;
-const CALL_NAME_INDEX = 2;
-const REQUIRED_PARAMETER_INDEX = 3;
-const OPTIONAL_PARAMETER_INDEX = 4;
-const DEFAULT_ARGUMENTS_INDEX = 5;
-
-const bool VALIDATE_DATA = false;
-
-const RANGE1_SIZE = RANGE1_LAST - RANGE1_FIRST + 1;
-const RANGE2_SIZE = RANGE2_LAST - RANGE2_FIRST + 1;
-const RANGE1_ADJUST = -(FIRST_FIELD_CODE - RANGE1_FIRST);
-const RANGE2_ADJUST = -(FIRST_FIELD_CODE + RANGE1_SIZE - RANGE2_FIRST);
-const RANGE3_ADJUST =
-    -(FIRST_FIELD_CODE + RANGE1_SIZE + RANGE2_SIZE - RANGE3_FIRST);
-
-const String setupProgramName = 'setupProgram';
-// TODO(floitsch): make sure this property can't clash with anything. It's
-//   unlikely since it lives on types, but still.
-const String typeNameProperty = r'builtin$cls';
-
-jsAst.Statement buildSetupProgram(
-    Program program,
-    Compiler compiler,
-    JavaScriptBackend backend,
-    Namer namer,
-    Emitter emitter,
-    JClosedWorld closedWorld) {
-  jsAst.Expression typeInformationAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.TYPE_INFORMATION);
-  jsAst.Expression staticsAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.STATICS);
-  jsAst.Expression mangledGlobalNamesAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.MANGLED_GLOBAL_NAMES);
-  jsAst.Expression mangledNamesAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.MANGLED_NAMES);
-  jsAst.Expression librariesAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.LIBRARIES);
-  jsAst.Expression typesAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.TYPES);
-  jsAst.Expression allClassesAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.ALL_CLASSES);
-  jsAst.Expression precompiledAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED);
-  jsAst.Expression finishedClassesAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.FINISHED_CLASSES);
-  jsAst.Expression interceptorsByTagAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.INTERCEPTORS_BY_TAG);
-  jsAst.Expression leafTagsAccess =
-      emitter.generateEmbeddedGlobalAccess(embeddedNames.LEAF_TAGS);
-
-  String reflectableField = namer.reflectableField;
-  String reflectionInfoField = namer.reflectionInfoField;
-  String reflectionNameField = namer.reflectionNameField;
-  String metadataIndexField = namer.metadataIndexField;
-  String defaultValuesField = namer.defaultValuesField;
-  String methodsWithOptionalArgumentsField =
-      namer.methodsWithOptionalArgumentsField;
-  String unmangledNameIndex =
-      ' 2 * optionalParameterCount + requiredParameterCount + 3';
-  String receiverParamName =
-      compiler.options.enableMinification ? "r" : "receiver";
-  String valueParamName = compiler.options.enableMinification ? "v" : "value";
-  String space = compiler.options.enableMinification ? "" : " ";
-  String _ = space;
-
-  String specProperty = '"${namer.nativeSpecProperty}"'; // "%"
-  jsAst.Expression nativeInfoAccess = js('prototype[$specProperty]', []);
-  jsAst.Expression constructorAccess = js('constructor', []);
-  Function subclassReadGenerator =
-      (jsAst.Expression subclass) => js('allClasses[#]', subclass);
-  jsAst.Statement nativeInfoHandler = emitter.buildNativeInfoHandler(
-      nativeInfoAccess,
-      constructorAccess,
-      subclassReadGenerator,
-      interceptorsByTagAccess,
-      leafTagsAccess);
-
-  Map<String, dynamic> holes = {
-    'needsClassSupport': emitter.needsClassSupport,
-    'libraries': librariesAccess,
-    'mangledNames': mangledNamesAccess,
-    'mangledGlobalNames': mangledGlobalNamesAccess,
-    'statics': staticsAccess,
-    'staticsPropertyName': namer.staticsPropertyName,
-    'staticsPropertyNameString': js.quoteName(namer.staticsPropertyName),
-    'typeInformation': typeInformationAccess,
-    'notInCspMode': !compiler.options.useContentSecurityPolicy,
-    'inCspMode': compiler.options.useContentSecurityPolicy,
-    'deferredAction': namer.deferredAction,
-    'allClasses': allClassesAccess,
-    'debugFastObjects': DEBUG_FAST_OBJECTS,
-    'precompiled': precompiledAccess,
-    'finishedClassesAccess': finishedClassesAccess,
-    'needsMixinSupport': emitter.needsMixinSupport,
-    'needsNativeSupport': program.needsNativeSupport,
-    'enabledJsInterop': closedWorld.nativeData.isJsInteropUsed,
-    'jsInteropBoostrap': backend.jsInteropAnalysis.buildJsInteropBootstrap(),
-    'isInterceptorClass':
-        namer.operatorIs(closedWorld.commonElements.jsInterceptorClass),
-    'isObject': namer.operatorIs(closedWorld.commonElements.objectClass),
-    'specProperty': js.string(namer.nativeSpecProperty),
-    'trivialNsmHandlers': emitter.buildTrivialNsmHandlers(),
-    'types': typesAccess,
-    'objectClassName': js.quoteName(
-        namer.runtimeTypeName(closedWorld.commonElements.objectClass)),
-    'needsStructuredMemberInfo': emitter.needsStructuredMemberInfo,
-    'usesMangledNames': closedWorld.backendUsage.isMirrorsUsed ||
-        closedWorld.backendUsage.isFunctionApplyUsed,
-    'tearOffCode': buildTearOffCode(
-        compiler.options, emitter, namer, closedWorld.commonElements),
-    'nativeInfoHandler': nativeInfoHandler,
-    'operatorIsPrefix': js.string(namer.operatorIsPrefix),
-    'deferredActionString': js.string(namer.deferredAction)
-  };
-  String skeleton = '''
-function $setupProgramName(programData, metadataOffset, typesOffset) {
-  "use strict";
-  if (#needsClassSupport) {
-
-    function generateAccessor(fieldDescriptor, accessors, cls) {
-      var fieldInformation = fieldDescriptor.split("-");
-      var field = fieldInformation[0];
-      var len = field.length;
-      var code = field.charCodeAt(len - 1);
-      var reflectable;
-      if (fieldInformation.length > 1) reflectable = true;
-           else reflectable = false;
-      code = ((code >= $RANGE1_FIRST) && (code <= $RANGE1_LAST))
-            ? code - $RANGE1_ADJUST
-            : ((code >= $RANGE2_FIRST) && (code <= $RANGE2_LAST))
-              ? code - $RANGE2_ADJUST
-              : ((code >= $RANGE3_FIRST) && (code <= $RANGE3_LAST))
-                ? code - $RANGE3_ADJUST
-                : $NO_FIELD_CODE;
-
-      if (code) {  // needsAccessor
-        var getterCode = code & 3;
-        var setterCode = code >> 2;
-        var accessorName = field = field.substring(0, len - 1);
-
-        var divider = field.indexOf(":");
-        if (divider > 0) { // Colon never in first position.
-          accessorName = field.substring(0, divider);
-          field = field.substring(divider + 1);
-        }
-
-        if (getterCode) {  // needsGetter
-          var args = (getterCode & 2) ? "$receiverParamName" : "";
-          var receiver = (getterCode & 1) ? "this" : "$receiverParamName";
-          var body = "return " + receiver + "." + field;
-          var property =
-              cls + ".prototype.${namer.getterPrefix}" + accessorName + "=";
-          var fn = "function(" + args + "){" + body + "}";
-          if (reflectable)
-            accessors.push(property + "\$reflectable(" + fn + ");\\n");
-          else
-            accessors.push(property + fn + ";\\n");
-        }
-
-        if (setterCode) {  // needsSetter
-          var args = (setterCode & 2)
-              ? "$receiverParamName,${_}$valueParamName"
-              : "$valueParamName";
-          var receiver = (setterCode & 1) ? "this" : "$receiverParamName";
-          var body = receiver + "." + field + "$_=$_$valueParamName";
-          var property =
-              cls + ".prototype.${namer.setterPrefix}" + accessorName + "=";
-          var fn = "function(" + args + "){" + body + "}";
-          if (reflectable)
-            accessors.push(property + "\$reflectable(" + fn + ");\\n");
-          else
-            accessors.push(property + fn + ";\\n");
-        }
-      }
-
-      return field;
-    }
-
-    // First the class name, then the field names in an array and the members
-    // (inside an Object literal).
-    // The caller can also pass in the constructor as a function if needed.
-    //
-    // Example:
-    // defineClass("A", ["x", "y"], {
-    //  foo\$1: function(y) {
-    //   print(this.x + y);
-    //  },
-    //  bar\$2: function(t, v) {
-    //   this.x = t - v;
-    //  },
-    // });
-    function defineClass(name, fields) {
-      var accessors = [];
-
-      var str = "function " + name + "(";
-      var comma = "", body = "";
-
-      for (var i = 0; i < fields.length; i++) {
-        var fieldDescriptor = fields[i];
-        if (fieldDescriptor.charCodeAt(0) == 48) {
-          // null-initialized field.
-          fieldDescriptor = fieldDescriptor.substring(1);
-          var field = generateAccessor(fieldDescriptor, accessors, name);
-          body += ("this." + field + " = null;\\n");
-        } else {
-          var field = generateAccessor(fieldDescriptor, accessors, name);
-          var parameter = "p_" + field;
-          str += comma;
-          comma = ", ";
-          str += parameter;
-          body += ("this." + field + " = " + parameter + ";\\n");
-        }
-      }
-      if (supportsDirectProtoAccess) {
-        body += "this." + #deferredActionString + "();";
-      }
-      str += ") {\\n" + body + "}\\n";
-      str += name + ".$typeNameProperty=\\"" + name + "\\";\\n";
-      str += "\$desc=\$collectedClasses." + name + "[1];\\n";
-      str += name + ".prototype = \$desc;\\n";
-      if (typeof defineClass.name != "string") {
-        str += name + ".name=\\"" + name + "\\";\\n";
-      }
-      str += accessors.join("");
-
-      return str;
-    }
-
-    // If the browser supports changing the prototype via __proto__, we make
-    // use of that feature. Otherwise, we copy the properties into a new
-    // constructor.
-    var inheritFrom = supportsDirectProtoAccess ?
-      function(constructor, superConstructor) {
-        var prototype = constructor.prototype;
-        prototype.__proto__ = superConstructor.prototype;
-        // Use a function for `true` here, as functions are stored in the
-        // hidden class and not as properties in the object.
-        prototype.constructor = constructor;
-        prototype[#operatorIsPrefix + constructor.name] = constructor;
-        return convertToFastObject(prototype);
-      } :
-      function() {
-        function tmp() {}
-        return function (constructor, superConstructor) {
-          tmp.prototype = superConstructor.prototype;
-          var object = new tmp();
-          convertToSlowObject(object);
-          var properties = constructor.prototype;
-          var members = Object.keys(properties);
-          for (var i = 0; i < members.length; i++) {
-            var member = members[i];
-            object[member] = properties[member];
-          }
-          // Use a function for `true` here, as functions are stored in the
-          // hidden class and not as properties in the object.
-          object[#operatorIsPrefix + constructor.name] = constructor;
-          object.constructor = constructor;
-          constructor.prototype = object;
-          return object;
-        };
-      }();
-
-    // Class descriptions are collected in a JS object.
-    // 'finishClasses' takes all collected descriptions and sets up
-    // the prototype.
-    // Once set up, the constructors prototype field satisfy:
-    //  - it contains all (local) members.
-    //  - its internal prototype (__proto__) points to the superclass'
-    //    prototype field.
-    //  - the prototype's constructor field points to the JavaScript
-    //    constructor.
-    // For engines where we have access to the '__proto__' we can manipulate
-    // the object literal directly. For other engines we have to create a new
-    // object and copy over the members.
-    function finishClasses(processedClasses) {
-      if (#debugFastObjects)
-        print("Number of classes: " +
-              Object.getOwnPropertyNames(processedClasses.collected).length);
-
-      var allClasses = #allClasses;
-
-      if (#inCspMode) {
-        var constructors = #precompiled(processedClasses.collected);
-      }
-
-      if (#notInCspMode) {
-        processedClasses.combinedConstructorFunction +=
-          "return [\\n" + processedClasses.constructorsList.join(",\\n  ") +
-          "\\n]";
-       var constructors =
-         new Function("\$collectedClasses",
-             processedClasses.combinedConstructorFunction)
-                 (processedClasses.collected);
-        processedClasses.combinedConstructorFunction = null;
-      }
-
-      for (var i = 0; i < constructors.length; i++) {
-        var constructor = constructors[i];
-        var cls = constructor.name;
-        var desc = processedClasses.collected[cls];
-        var globalObject = desc[0];
-        desc = desc[1];
-        allClasses[cls] = constructor;
-        globalObject[cls] = constructor;
-      }
-      constructors = null;
-
-      var finishedClasses = #finishedClassesAccess;
-
-      function finishClass(cls) {
-
-        if (finishedClasses[cls]) return;
-        finishedClasses[cls] = true;
-
-        var superclass = processedClasses.pending[cls];
-
-        if (#needsMixinSupport) {
-          if (superclass && superclass.indexOf("+") > 0) {
-            var s = superclass.split("+");
-            superclass = s[0];
-            var mixinClass = s[1];
-            finishClass(mixinClass);
-            var mixin = allClasses[mixinClass];
-            var mixinPrototype = mixin.prototype;
-            var clsPrototype = allClasses[cls].prototype;
-
-            var properties = Object.keys(mixinPrototype);
-            for (var i = 0; i < properties.length; i++) {
-              var d = properties[i];
-              if (!hasOwnProperty.call(clsPrototype, d))
-                clsPrototype[d] = mixinPrototype[d];
-            }
-          }
-        }
-
-        // The superclass is only false (empty string) for the Dart Object
-        // class.  The minifier together with noSuchMethod can put methods on
-        // the Object.prototype object, and they show through here, so we check
-        // that we have a string.
-        if (!superclass || typeof superclass != "string") {
-          // Inlined special case of InheritFrom here for performance reasons.
-          // Fix up the Dart Object class' prototype.
-          var constructor = allClasses[cls];
-          var prototype = constructor.prototype;
-          prototype.constructor = constructor;
-          prototype.#isObject = constructor;
-          prototype.#deferredAction = function() {};
-          return;
-        }
-        finishClass(superclass);
-        var superConstructor = allClasses[superclass];
-
-        if (!superConstructor) {
-          superConstructor = existingIsolateProperties[superclass];
-        }
-
-        var constructor = allClasses[cls];
-        var prototype = inheritFrom(constructor, superConstructor);
-
-        if (#needsMixinSupport) {
-          if (mixinPrototype) {
-            prototype.#deferredAction
-              = mixinDeferredActionHelper(mixinPrototype, prototype);
-          }
-        }
-
-        if (#needsNativeSupport) {
-          if (Object.prototype.hasOwnProperty.call(prototype, #specProperty)) {
-            #nativeInfoHandler;
-            // As native classes can come into existence without a constructor
-            // call, we have to ensure that the class has been fully
-            // initialized.
-            prototype.#deferredAction();
-          }
-        }
-        // Interceptors (or rather their prototypes) are also used without
-        // first instantiating them first.
-        if (prototype.#isInterceptorClass) {
-          prototype.#deferredAction();
-        }
-      }
-
-      #trivialNsmHandlers;
-
-      var properties = Object.keys(processedClasses.pending);
-      for (var i = 0; i < properties.length; i++) finishClass(properties[i]);
-    }
-
-    // Generic handler for deferred class setup. The handler updates the
-    // prototype that it is installed on (it traverses the prototype chain
-    // of [this] to find itself) and then removes itself. It recurses by
-    // calling deferred handling again, which terminates on Object due to
-    // the final handler.
-    function finishAddStubsHelper() {
-      var prototype = this;
-      // Find the actual prototype that this handler is installed on.
-      while (!prototype.hasOwnProperty(#deferredActionString)) {
-        prototype = prototype.__proto__;
-      }
-      delete prototype.#deferredAction; // Intended to make it slow, too.
-      var properties = Object.keys(prototype);
-      for (var index = 0; index < properties.length; index++) {
-        var property = properties[index];
-        var firstChar = property.charCodeAt(0);
-        var elem;
-        // We have to filter out some special properties that are used for
-        // metadata in descriptors. Currently, we filter everything that
-        // starts with + or *. This has to stay in sync with the special
-        // properties that are used by processClassData below.
-        if (property !== "${namer.classDescriptorProperty}" &&
-            property !== "$reflectableField" &&
-            firstChar !== 43 && // 43 is aka "+".
-            firstChar !== 42 && // 42 is aka "*"
-            (elem = prototype[property]) != null &&
-            elem.constructor === Array &&
-            property !== "<>") {
-          addStubs(prototype, elem, property, false, []);
-        }
-      }
-      convertToFastObject(prototype);
-      prototype = prototype.__proto__;
-      // Call other handlers.
-      prototype.#deferredAction();
-    }
-
-    if (#needsMixinSupport) {
-      // Returns a deferred class setup handler that first invokes the
-      // handler on [mixinPrototype] and then resumes handling on
-      // [targetPrototype]. If [targetPrototype] already has a handler
-      // installed, the handler is preserved in the generated closure and
-      // thus can be safely overwritten.
-      function mixinDeferredActionHelper(mixinPrototype, targetPrototype) {
-        var chain;
-        if (targetPrototype.hasOwnProperty(#deferredActionString)) {
-          chain = targetPrototype.#deferredAction;
-        }
-        return function foo() {
-          if (!supportsDirectProtoAccess) return;
-          var prototype = this;
-          // Find the actual prototype that this handler is installed on.
-          while (!prototype.hasOwnProperty(#deferredActionString)) {
-            prototype = prototype.__proto__;
-          }
-          if (chain) {
-            prototype.#deferredAction = chain;
-          } else {
-            delete prototype.#deferredAction;
-            convertToFastObject(prototype);
-          }
-          mixinPrototype.#deferredAction();
-          prototype.#deferredAction();
-        }
-      }
-    }
-
-    function processClassData(cls, descriptor, processedClasses) {
-      descriptor = convertToSlowObject(descriptor); // Use a slow object.
-      var previousProperty;
-      var properties = Object.keys(descriptor);
-      var hasDeferredWork = false;
-      var shouldDeferWork =
-          supportsDirectProtoAccess && cls != #objectClassName;
-      for (var i = 0; i < properties.length; i++) {
-        var property = properties[i];
-        var firstChar = property.charCodeAt(0);
-        if (property === #staticsPropertyNameString) {
-          processStatics(#statics[cls] = descriptor.#staticsPropertyName,
-                         processedClasses);
-          delete descriptor.#staticsPropertyName;
-        } else if (firstChar === 43) { // 43 is "+".
-          mangledNames[previousProperty] = property.substring(1);
-          var flag = descriptor[property];
-          if (flag > 0)
-            descriptor[previousProperty].$reflectableField = flag;
-        } else if (firstChar === 42) { // 42 is "*"
-          descriptor[previousProperty].$defaultValuesField =
-              descriptor[property];
-          var optionalMethods = descriptor.$methodsWithOptionalArgumentsField;
-          if (!optionalMethods) {
-            descriptor.$methodsWithOptionalArgumentsField = optionalMethods = {}
-          }
-          optionalMethods[property] = previousProperty;
-        } else {
-          var elem = descriptor[property];
-          if (property !== "${namer.classDescriptorProperty}" &&
-              elem != null &&
-              elem.constructor === Array &&
-              property !== "<>") {
-            if (shouldDeferWork) {
-              hasDeferredWork = true;
-            } else {
-              addStubs(descriptor, elem, property, false, []);
-            }
-          } else {
-            previousProperty = property;
-          }
-        }
-      }
-
-      if (hasDeferredWork)
-        descriptor.#deferredAction = finishAddStubsHelper;
-
-      /* The 'fields' are either a constructor function or a
-       * string encoding fields, constructor and superclass. Gets the
-       * superclass and fields in the format
-       *   'Super;field1,field2'
-       * from the CLASS_DESCRIPTOR_PROPERTY property on the descriptor.
-       */
-      var classData = descriptor["${namer.classDescriptorProperty}"],
-          split, supr, fields = classData;
-
-      // ${ClassBuilder.fieldEncodingDescription}.
-      var s = fields.split(";");
-      fields = s[1] ? s[1].split(",") : [];
-      supr = s[0];
-      // ${ClassBuilder.functionTypeEncodingDescription}.
-      split = supr.split(":");
-      if (split.length == 2) {
-        supr = split[0];
-        var functionSignature = split[1];
-        if (functionSignature)
-          descriptor.${namer.operatorSignature} = function(s) {
-            return function() {
-              return #types[s];
-            };
-          }(functionSignature);
-      }
-
-      if (supr) processedClasses.pending[cls] = supr;
-      if (#notInCspMode) {
-        processedClasses.combinedConstructorFunction +=
-            defineClass(cls, fields);
-        processedClasses.constructorsList.push(cls);
-      }
-      processedClasses.collected[cls] = [globalObject, descriptor];
-      classes.push(cls);
-    }
-  }
-
-  function processStatics(descriptor, processedClasses) {
-    var properties = Object.keys(descriptor);
-    for (var i = 0; i < properties.length; i++) {
-      var property = properties[i];
-      if (property === "${namer.classDescriptorProperty}") continue;
-      var element = descriptor[property];
-      var firstChar = property.charCodeAt(0);
-      var previousProperty;
-      if (firstChar === 43) { // 43 is "+".
-        mangledGlobalNames[previousProperty] = property.substring(1);
-        var flag = descriptor[property];
-        if (flag > 0)
-          descriptor[previousProperty].$reflectableField = flag;
-        if (element && element.length)
-          #typeInformation[previousProperty] = element;
-      } else if (firstChar === 42) { // 42 is "*"
-        globalObject[previousProperty].$defaultValuesField = element;
-        var optionalMethods = descriptor.$methodsWithOptionalArgumentsField;
-        if (!optionalMethods) {
-          descriptor.$methodsWithOptionalArgumentsField = optionalMethods = {}
-        }
-        optionalMethods[property] = previousProperty;
-      } else if (typeof element === "function") {
-        globalObject[previousProperty = property] = element;
-        functions.push(property);
-      } else if (element.constructor === Array) {
-        if (#needsStructuredMemberInfo) {
-          addStubs(globalObject, element, property, true, functions);
-        }
-      } else {
-        // We will not enter this case if no classes are defined.
-        if (#needsClassSupport) {
-          previousProperty = property;
-          processClassData(property, element, processedClasses);
-        }
-      }
-    }
-  }
-
-  if (#needsStructuredMemberInfo) {
-
-    // See [dart2js.js_emitter.ContainerBuilder.addMemberMethod] for format of
-    // [array].
-
-    // Processes the stub declaration given by [array] and stores the results
-    // in the corresponding [prototype]. [name] is the property name in
-    // [prototype] that the stub declaration belongs to.
-    // If [isStatic] is true, the property being processed belongs to a static
-    // function and thus is stored as a global. In that case we also add all
-    // generated functions to the [functions] array, which is used by the
-    // mirrors system to enumerate all static functions of a library. For
-    // non-static functions we might still add some functions to [functions] but
-    // the information is thrown away at the call site. This is to avoid
-    // conditionals.
-    function addStubs(prototype, array, name, isStatic, functions) {
-      var index = $FUNCTION_INDEX, applyTrampolineIndex = index, alias = array[index], f;
-      if (typeof alias == "string") {
-        f = array[++index];
-      } else {
-        f = alias;
-        alias = name;
-      }
-      if (typeof f == "number") {
-        applyTrampolineIndex = f;
-        f = array[++index];
-      }
-      prototype[name] = prototype[alias] = f;
-      var funcs = [f];
-      f.\$stubName = name;
-      functions.push(name);
-      for (index++; index < array.length; index++) {
-        f = array[index];
-        if (typeof f != "function") break;
-        if (!isStatic) {
-          f.\$stubName = ${readString("array", "++index")};
-        }
-        funcs.push(f);
-        if (f.\$stubName) {
-          prototype[f.\$stubName] = f;
-          functions.push(f.\$stubName);
-        }
-      }
-
-      for (var i = 0; i < funcs.length; index++, i++) {
-        funcs[i].\$callName = ${readString("array", "index")};
-      }
-      var getterStubName = ${readString("array", "index")};
-      array = array.slice(++index);
-      var requiredParameterInfo = ${readInt("array", "0")};
-      var isIntercepted = (requiredParameterInfo & 1) === 1;
-      requiredParameterInfo = requiredParameterInfo >> 1;
-      var requiredParameterCount = requiredParameterInfo >> 1;
-      var isAccessor = (requiredParameterInfo & 1) === 1;
-      var isSetter = requiredParameterInfo === 3;
-      var isGetter = requiredParameterInfo === 1;
-      var optionalParameterInfo = ${readInt("array", "1")};
-      var optionalParameterCount = optionalParameterInfo >> 1;
-      var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
-      var totalParameterCount = requiredParameterCount + optionalParameterCount;
-      var functionTypeIndex = ${readFunctionType("array", "2")};
-      if (typeof functionTypeIndex == "number")
-        ${readFunctionType("array", "2")} = functionTypeIndex + typesOffset;
-      if (metadataOffset > 0) {
-        var position = 3;
-        // Update index that refers to the parameter default value.
-        for (var i = 0; i < optionalParameterCount; i++) {
-          if (typeof ${readInt("array", "position")} == "number")
-          ${readInt("array", "position")} =
-              ${readInt("array", "position")} + metadataOffset;
-          position++;
-        }
-        for (var i = 0; i < totalParameterCount; i++) {
-          // Update index that refers to the parameter name.
-          ${readInt("array", "position")} =
-              ${readInt("array", "position")} + metadataOffset;
-          position++;
-        }
-      }
-      var unmangledNameIndex = $unmangledNameIndex;
-
-      if (getterStubName) {
-        f = tearOff(funcs, applyTrampolineIndex, array, isStatic, name, isIntercepted);
-        prototype[name].\$getter = f;
-        f.\$getterStub = true;
-        if (isStatic) {
-          functions.push(getterStubName);
-        }
-        prototype[getterStubName] = f;
-        funcs.push(f);
-        f.\$stubName = getterStubName;
-        f.\$callName = null;
-      }
-
-      if (#usesMangledNames) {
-        var isReflectable = array.length > unmangledNameIndex;
-        if (isReflectable) {
-          funcs[0].$reflectableField = 1;
-          funcs[0].$reflectionInfoField = array;
-          for (var i = 1; i < funcs.length; i++) {
-            funcs[i].$reflectableField = 2;
-            funcs[i].$reflectionInfoField = array;
-          }
-          var mangledNames = isStatic ? #mangledGlobalNames : #mangledNames;
-          var unmangledName = ${readString("array", "unmangledNameIndex")};
-          // The function is either a getter, a setter, or a method.
-          // If it is a method, it might also have a tear-off closure.
-          // The unmangledName is the same as the getter-name.
-          var reflectionName = unmangledName;
-          if (getterStubName) mangledNames[getterStubName] = reflectionName;
-          if (isSetter) {
-            reflectionName += "=";
-          } else if (!isGetter) {
-            reflectionName += ":" +
-                (requiredParameterCount + optionalParameterCount);
-          }
-          mangledNames[name] = reflectionName;
-          funcs[0].$reflectionNameField = reflectionName;
-          for (var i = unmangledNameIndex + 1; i < array.length; i++) {
-            ${readInt("array", "i")} =
-                ${readInt("array", "i")} + metadataOffset;
-          }
-          funcs[0].$metadataIndexField = unmangledNameIndex + 1;
-          // The following line installs the [${JsGetName.CALL_CATCH_ALL}]
-          // property for closures.
-          if (optionalParameterCount) prototype[unmangledName + "*"] = funcs[applyTrampolineIndex];
-        }
-      }
-    }
-
-    if (#enabledJsInterop) {
-      #jsInteropBoostrap
-    }
-    #tearOffCode;
-  }
-
-  var functionCounter = 0;
-  if (!#libraries) #libraries = [];
-  if (!#mangledNames) #mangledNames = map();
-  if (!#mangledGlobalNames) #mangledGlobalNames = map();
-  if (!#statics) #statics = map();
-  if (!#typeInformation) #typeInformation = map();
-  var libraries = #libraries;
-  var mangledNames = #mangledNames;
-  var mangledGlobalNames = #mangledGlobalNames;
-  var hasOwnProperty = Object.prototype.hasOwnProperty;
-  var length = programData.length;
-  var processedClasses = map();
-  processedClasses.collected = map();
-  processedClasses.pending = map();
-  if (#notInCspMode) {
-    processedClasses.constructorsList = [];
-    // For every class processed [processedClasses.combinedConstructorFunction]
-    // will be updated with the corresponding constructor function.
-    processedClasses.combinedConstructorFunction =
-        "function \$reflectable(fn){fn.$reflectableField=1;return fn};\\n"+
-        "var \$desc;\\n";
-  }
-  for (var i = 0; i < length; i++) {
-    var data = programData[i];
-
-// [data] contains these elements:
-// 0. The library name (not unique).
-// 1. The library URI (unique).
-// 2. A function returning the metadata associated with this library.
-// 3. The global object to use for this library.
-// 4. An object literal listing the members of the library.
-// 5. This element is optional and if present it is true and signals that this
-// library is the root library (see dart:mirrors IsolateMirror.rootLibrary).
-//
-// The entries of [data] are built in [assembleProgram] above.
-
-    var name = data[0];
-    var uri = data[1];
-    var metadata = data[2];
-    var globalObject = data[3];
-    var descriptor = data[4];
-    var isRoot = !!data[5];
-    var fields = descriptor && descriptor["${namer.classDescriptorProperty}"];
-    if (fields instanceof Array) fields = fields[0];
-    var classes = [];
-    var functions = [];
-    processStatics(descriptor, processedClasses);
-    libraries.push([name, uri, classes, functions, metadata, fields, isRoot,
-                    globalObject]);
-  }
-  if (#needsClassSupport) finishClasses(processedClasses);
-}''';
-
-  // TODO(zarah): Remove empty else branches in output when if(#hole) is false.
-  return js.statement(skeleton, holes);
-}
-
-String readString(String array, String index) {
-  return readChecked(
-      array, index, 'result != null && typeof result != "string"', 'string');
-}
-
-String readInt(String array, String index) {
-  return readChecked(
-      array,
-      index,
-      'result != null && (typeof result != "number" || (result|0) !== result)',
-      'int');
-}
-
-String readFunctionType(String array, String index) {
-  return readChecked(
-      array,
-      index,
-      'result != null && '
-      '(typeof result != "number" || (result|0) !== result) && '
-      'typeof result != "function"',
-      'function or int');
-}
-
-String readChecked(String array, String index, String check, String type) {
-  if (!VALIDATE_DATA) return '$array[$index]';
-  return '''
-(function() {
-  var result = $array[$index];
-  if ($check) {
-    throw new Error(
-        name + ": expected value of type \'$type\' at index " + ($index) +
-        " but got " + (typeof result));
-  }
-  return result;
-})()''';
-}
diff --git a/pkg/compiler/lib/src/js_emitter/headers.dart b/pkg/compiler/lib/src/js_emitter/headers.dart
index ad9e783..9af8ea1 100644
--- a/pkg/compiler/lib/src/js_emitter/headers.dart
+++ b/pkg/compiler/lib/src/js_emitter/headers.dart
@@ -33,6 +33,11 @@
 //    successCallback. If it fails to do so, it should call errorCallback with
 //    an error.
 //
+// dartCallInstrumentation(id, qualifiedName):
+//    if this function is defined, it will be called at each entry of a
+//    method or constructor. Used only when compiling programs with
+//    --experiment-call-instrumentation.
+//
 // defaultPackagesBase:
 //    Override the location where `package:` uris are resolved from. By default
 //    they are resolved under "packages/" from the current window location.
diff --git a/pkg/compiler/lib/src/js_emitter/instantiation_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/instantiation_stub_generator.dart
index f8dabcf..e6fbf87 100644
--- a/pkg/compiler/lib/src/js_emitter/instantiation_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/instantiation_stub_generator.dart
@@ -12,9 +12,9 @@
 import '../js/js.dart' show js;
 import '../js_backend/namer.dart' show Namer;
 import '../universe/call_structure.dart' show CallStructure;
+import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart' show Selector;
-import '../universe/world_builder.dart'
-    show CodegenWorldBuilder, SelectorConstraints;
+import '../universe/world_builder.dart' show SelectorConstraints;
 import '../world.dart' show JClosedWorld;
 
 import 'model.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 0e3bb18..3bbdcfa0 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -19,8 +19,8 @@
 import '../js_backend/interceptor_data.dart';
 import '../native/enqueue.dart';
 import '../options.dart';
+import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart' show Selector;
-import '../universe/world_builder.dart' show CodegenWorldBuilder;
 import '../world.dart' show JClosedWorld;
 
 import 'code_emitter_task.dart' show CodeEmitterTask, Emitter;
@@ -58,10 +58,8 @@
       return _emitterTask.interceptorPrototypeAccess(cls);
     }
 
-    /**
-     * Build a JavaScript AST node for doing a type check on
-     * [cls]. [cls] must be a non-native interceptor class.
-     */
+    /// Build a JavaScript AST node for doing a type check on
+    /// [cls]. [cls] must be a non-native interceptor class.
     jsAst.Statement buildInterceptorCheck(ClassEntity cls) {
       jsAst.Expression condition;
       assert(_interceptorData.isInterceptedClass(cls));
diff --git a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
index cdf72cb..db2d3c0 100644
--- a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
@@ -17,7 +17,7 @@
 import '../js/js.dart' show js;
 import '../js_backend/runtime_types.dart' show RuntimeTypesEncoder;
 import '../options.dart';
-import '../universe/world_builder.dart' show CodegenWorldBuilder;
+import '../universe/codegen_world_builder.dart';
 
 import 'code_emitter_task.dart' show Emitter;
 
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 78d8585..7829d79 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -72,10 +72,8 @@
   Fragment get mainFragment => fragments.first;
 }
 
-/**
- * This class represents a JavaScript object that contains static state, like
- * classes or functions.
- */
+/// This class represents a JavaScript object that contains static state, like
+/// classes or functions.
 class Holder {
   final String name;
   final int index;
@@ -90,12 +88,10 @@
   }
 }
 
-/**
- * This class represents one output file.
- *
- * If no library is deferred, there is only one [Fragment] of type
- * [MainFragment].
- */
+/// This class represents one output file.
+///
+/// If no library is deferred, there is only one [Fragment] of type
+/// [MainFragment].
 abstract class Fragment {
   /// The outputUnit should only be used during the transition to the new model.
   /// Uses indicate missing information in the model.
@@ -122,12 +118,10 @@
   bool get isMainFragment;
 }
 
-/**
- * The main output file.
- *
- * This code emitted from this [Fragment] must be loaded first. It can then load
- * other [DeferredFragment]s.
- */
+/// The main output file.
+///
+/// This code emitted from this [Fragment] must be loaded first. It can then load
+/// other [DeferredFragment]s.
 class MainFragment extends Fragment {
   final js.Statement invokeMain;
 
@@ -149,9 +143,7 @@
   }
 }
 
-/**
- * An output (file) for deferred code.
- */
+/// An output (file) for deferred code.
 class DeferredFragment extends Fragment {
   final String name;
 
@@ -213,7 +205,8 @@
   /// Uses indicate missing information in the model.
   final FieldEntity element;
 
-  js.Name name;
+  final js.Name name;
+  final js.Name getterName;
   // TODO(floitsch): the holder for static fields is the isolate object. We
   // could remove this field and use the isolate object directly.
   final Holder holder;
@@ -221,8 +214,8 @@
   final bool isFinal;
   final bool isLazy;
 
-  StaticField(this.element, this.name, this.holder, this.code, this.isFinal,
-      this.isLazy);
+  StaticField(this.element, this.name, this.getterName, this.holder, this.code,
+      this.isFinal, this.isLazy);
 
   String toString() {
     return 'StaticField(name=${name.key},element=${element})';
@@ -389,17 +382,11 @@
 
   final bool needsCheckedSetter;
 
-  final bool nullInitializerInAllocator; // TODO(sra): Generalize.
+  final ConstantValue initializerInAllocator;
 
   // TODO(floitsch): support renamed fields.
-  Field(
-      this.element,
-      this.name,
-      this.accessorName,
-      this.getterFlags,
-      this.setterFlags,
-      this.needsCheckedSetter,
-      this.nullInitializerInAllocator);
+  Field(this.element, this.name, this.accessorName, this.getterFlags,
+      this.setterFlags, this.needsCheckedSetter, this.initializerInAllocator);
 
   bool get needsGetter => getterFlags != 0;
   bool get needsUncheckedSetter => setterFlags != 0;
@@ -447,8 +434,9 @@
   // this field holds a function computing the function signature.
   final js.Expression functionType;
 
-  // Signature information for this method. This is only required and stored
-  // here if the method [canBeApplied].
+  // Signature information for this method. [optionalParameterDefaultValues] is
+  // only required and stored here if the method [canBeApplied]. The count is
+  // always stored to help select specialized tear-off paths.
   final int requiredParameterCount;
   final /* Map | List */ optionalParameterDefaultValues;
 
diff --git a/pkg/compiler/lib/src/js_emitter/native_emitter.dart b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
index 0a7ccef..2e0dca3 100644
--- a/pkg/compiler/lib/src/js_emitter/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
@@ -13,7 +13,7 @@
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
 import '../native/enqueue.dart' show NativeCodegenEnqueuer;
-import '../universe/world_builder.dart' show CodegenWorldBuilder;
+import '../universe/codegen_world_builder.dart';
 import '../world.dart' show JClosedWorld;
 
 import 'code_emitter_task.dart' show CodeEmitterTask;
@@ -46,36 +46,35 @@
   NativeData get _nativeData => _closedWorld.nativeData;
   InterceptorData get _interceptorData => _closedWorld.interceptorData;
 
-  /**
-   * Prepares native classes for emission. Returns the unneeded classes.
-   *
-   * Removes trivial classes (that can be represented by a super type) and
-   * generates properties that have to be added to classes (native or not).
-   *
-   * Updates the `nativeLeafTags`, `nativeNonLeafTags` and `nativeExtensions`
-   * fields of the given classes. This data must be emitted with the
-   * corresponding classes.
-   *
-   * The interceptors are filtered to avoid emitting trivial interceptors.  For
-   * example, if the program contains no code that can distinguish between the
-   * numerous subclasses of `Element` then we can pretend that `Element` is a
-   * leaf class, and all instances of subclasses of `Element` are instances of
-   * `Element`.
-   *
-   * There is also a performance benefit (in addition to the obvious code size
-   * benefit), due to how [getNativeInterceptor] works.  Finding the interceptor
-   * of a leaf class in the hierarchy is more efficient that a non-leaf, so it
-   * improves performance when more classes can be treated as leaves.
-   *
-   * [classes] contains native classes, mixin applications, and user subclasses
-   * of native classes.
-   *
-   * [interceptorClassesNeededByConstants] contains the interceptors that are
-   * referenced by constants.
-   *
-   * [classesModifiedByEmitRTISupport] contains the list of classes that must
-   * exist, because runtime-type support adds information to the class.
-   */
+  /// Prepares native classes for emission. Returns the unneeded classes.
+  ///
+  /// Removes trivial classes (that can be represented by a super type) and
+  /// generates properties that have to be added to classes (native or not).
+  ///
+  /// Updates the `nativeLeafTags`, `nativeNonLeafTags` and `nativeExtensions`
+  /// fields of the given classes. This data must be emitted with the
+  /// corresponding classes.
+  ///
+  /// The interceptors are filtered to avoid emitting trivial interceptors.  For
+  /// example, if the program contains no code that can distinguish between the
+  /// numerous subclasses of `Element` then we can pretend that `Element` is a
+  /// leaf class, and all instances of subclasses of `Element` are instances of
+  /// `Element`.
+  ///
+  /// There is also a performance benefit (in addition to the obvious code size
+  /// benefit), due to how [getNativeInterceptor] works.  Finding the
+  /// interceptor of a leaf class in the hierarchy is more efficient that a
+  /// non-leaf, so it improves performance when more classes can be treated as
+  /// leaves.
+  ///
+  /// [classes] contains native classes, mixin applications, and user subclasses
+  /// of native classes.
+  ///
+  /// [interceptorClassesNeededByConstants] contains the interceptors that are
+  /// referenced by constants.
+  ///
+  /// [classesModifiedByEmitRTISupport] contains the list of classes that must
+  /// exist, because runtime-type support adds information to the class.
   Set<Class> prepareNativeClasses(
       List<Class> classes,
       Set<ClassEntity> interceptorClassesNeededByConstants,
@@ -219,11 +218,9 @@
         .toSet();
   }
 
-  /**
-   * Computes the native classes that are extended (subclassed) by non-native
-   * classes and the set non-mative classes that extend them.  (A List is used
-   * instead of a Set for out stability).
-   */
+  /// Computes the native classes that are extended (subclassed) by non-native
+  /// classes and the set non-mative classes that extend them.  (A List is used
+  /// instead of a Set for out stability).
   Map<Class, List<Class>> computeExtensionPoints(List<Class> classes) {
     Class nativeSuperclassOf(Class cls) {
       if (cls == null) return null;
diff --git a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
index 0492ada..ac44280 100644
--- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
@@ -15,9 +15,9 @@
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/runtime_types.dart';
 import '../universe/call_structure.dart' show CallStructure;
+import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart' show Selector;
-import '../universe/world_builder.dart'
-    show CodegenWorldBuilder, SelectorConstraints;
+import '../universe/world_builder.dart' show SelectorConstraints;
 import '../world.dart' show JClosedWorld;
 
 import 'model.dart';
@@ -378,7 +378,8 @@
     for (Selector selector in liveSelectors.keys) {
       if (renamedCallSelectors.contains(selector)) continue;
       if (!selector.appliesUnnamed(member)) continue;
-      if (!liveSelectors[selector].applies(member, selector, _closedWorld)) {
+      if (!liveSelectors[selector]
+          .canHit(member, selector.memberName, _closedWorld)) {
         continue;
       }
 
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
index 6592f68..e57a3ab 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
@@ -4,12 +4,10 @@
 
 part of dart2js.js_emitter.program_builder;
 
-/**
- * Generates the code for all used classes in the program. Static fields (even
- * in classes) are ignored, since they can be treated as non-class elements.
- *
- * The code for the containing (used) methods must exist in the `universe`.
- */
+/// Generates the code for all used classes in the program. Static fields (even
+/// in classes) are ignored, since they can be treated as non-class elements.
+///
+/// The code for the containing (used) methods must exist in the `universe`.
 class Collector {
   final CompilerOptions _options;
   final JCommonElements _commonElements;
@@ -78,10 +76,8 @@
     return classes;
   }
 
-  /**
-   * Return a function that returns true if its argument is a class
-   * that needs to be emitted.
-   */
+  /// Return a function that returns true if its argument is a class
+  /// that needs to be emitted.
   Function computeClassFilter(Iterable<ClassEntity> backendTypeHelpers) {
     Set<ClassEntity> unneededClasses = new Set<ClassEntity>();
     // The [Bool] class is not marked as abstract, but has a factory
@@ -129,9 +125,7 @@
     ];
   }
 
-  /**
-   * Compute all the constants that must be emitted.
-   */
+  /// Compute all the constants that must be emitted.
   void computeNeededConstants() {
     List<ConstantValue> constants =
         _worldBuilder.getConstantsForEmission(_emitter.compareConstants);
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
index c5f8d9a..493afa9 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
@@ -4,24 +4,22 @@
 
 part of dart2js.js_emitter.program_builder;
 
-/**
- * [member] is a field (instance, static, or top level).
- *
- * [name] is the field name that the [Namer] has picked for this field's
- * storage, that is, the JavaScript property name.
- *
- * [accessorName] is the name of the accessor. For instance fields this is
- * mostly the same as [name] except when [member] is shadowing a field in its
- * superclass.  For other fields, they are rarely the same.
- *
- * [needsGetter] and [needsSetter] represent if a getter or a setter
- * respectively is needed.  There are many factors in this, for example, if the
- * accessor can be inlined.
- *
- * [needsCheckedSetter] indicates that a checked getter is needed, and in this
- * case, [needsSetter] is always false. [needsCheckedSetter] is only true when
- * type assertions are enabled (checked mode).
- */
+/// [member] is a field (instance, static, or top level).
+///
+/// [name] is the field name that the [Namer] has picked for this field's
+/// storage, that is, the JavaScript property name.
+///
+/// [accessorName] is the name of the accessor. For instance fields this is
+/// mostly the same as [name] except when [member] is shadowing a field in its
+/// superclass.  For other fields, they are rarely the same.
+///
+/// [needsGetter] and [needsSetter] represent if a getter or a setter
+/// respectively is needed.  There are many factors in this, for example, if the
+/// accessor can be inlined.
+///
+/// [needsCheckedSetter] indicates that a checked getter is needed, and in this
+/// case, [needsSetter] is always false. [needsCheckedSetter] is only true when
+/// type assertions are enabled (checked mode).
 typedef void AcceptField(FieldEntity member, js.Name name, js.Name accessorName,
     bool needsGetter, bool needsSetter, bool needsCheckedSetter);
 
@@ -43,22 +41,20 @@
       this._namer,
       this._closedWorld);
 
-  /**
-   * Invokes [f] for each of the fields of [element].
-   *
-   * [element] must be a [ClassEntity] or a [LibraryEntity].
-   *
-   * If [element] is a [ClassEntity], the static fields of the class are
-   * visited if [visitStatics] is true and the instance fields are visited if
-   * [visitStatics] is false.
-   *
-   * If [element] is a [LibraryEntity], [visitStatics] must be true.
-   *
-   * When visiting the instance fields of a class, the fields of its superclass
-   * are also visited if the class is instantiated.
-   *
-   * Invariant: [element] must be a declaration element.
-   */
+  /// Invokes [f] for each of the fields of [element].
+  ///
+  /// [element] must be a [ClassEntity] or a [LibraryEntity].
+  ///
+  /// If [element] is a [ClassEntity], the static fields of the class are
+  /// visited if [visitStatics] is true and the instance fields are visited if
+  /// [visitStatics] is false.
+  ///
+  /// If [element] is a [LibraryEntity], [visitStatics] must be true.
+  ///
+  /// When visiting the instance fields of a class, the fields of its superclass
+  /// are also visited if the class is instantiated.
+  ///
+  /// Invariant: [element] must be a declaration element.
   void visitFields(AcceptField f,
       {bool visitStatics: false, LibraryEntity library, ClassEntity cls}) {
     bool isNativeClass = false;
@@ -146,7 +142,7 @@
     assert(field.isField);
     if (fieldAccessNeverThrows(field)) return false;
     return field.enclosingClass != null &&
-        _codegenWorldBuilder.hasInvokedGetter(field, _closedWorld);
+        _codegenWorldBuilder.hasInvokedGetter(field);
   }
 
   bool fieldNeedsSetter(FieldEntity field) {
@@ -154,7 +150,7 @@
     if (fieldAccessNeverThrows(field)) return false;
     if (!field.isAssignable) return false;
     return field.enclosingClass != null &&
-        _codegenWorldBuilder.hasInvokedSetter(field, _closedWorld);
+        _codegenWorldBuilder.hasInvokedSetter(field);
   }
 
   static bool fieldAccessNeverThrows(FieldEntity field) {
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index 4780f74..023faf2 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -13,7 +13,7 @@
     show ConstantValue, InterceptorConstantValue;
 import '../../common_elements.dart' show JCommonElements, JElementEnvironment;
 import '../../deferred_load.dart'
-    show DeferredLoadTask, OutputUnit, OutputUnitData;
+    show deferredPartFileName, OutputUnit, OutputUnitData;
 import '../../elements/entities.dart';
 import '../../elements/types.dart';
 import '../../io/source_information.dart';
@@ -26,7 +26,6 @@
 import '../../js_backend/custom_elements_analysis.dart';
 import '../../js_backend/inferred_data.dart';
 import '../../js_backend/interceptor_data.dart';
-import '../../js_backend/js_interop_analysis.dart';
 import '../../js_backend/namer.dart' show Namer, StringBackedName;
 import '../../js_backend/native_data.dart';
 import '../../js_backend/runtime_types.dart'
@@ -34,9 +33,9 @@
 import '../../js_model/elements.dart' show JGeneratorBody, JSignatureMethod;
 import '../../native/enqueue.dart' show NativeCodegenEnqueuer;
 import '../../options.dart';
+import '../../universe/codegen_world_builder.dart';
 import '../../universe/selector.dart' show Selector;
-import '../../universe/world_builder.dart'
-    show CodegenWorldBuilder, SelectorConstraints;
+import '../../universe/world_builder.dart' show SelectorConstraints;
 import '../../world.dart' show JClosedWorld;
 import '../js_emitter.dart'
     show
@@ -63,7 +62,6 @@
   final DiagnosticReporter _reporter;
   final JElementEnvironment _elementEnvironment;
   final JCommonElements _commonElements;
-  final DeferredLoadTask _deferredLoadTask;
   final OutputUnitData _outputUnitData;
   final CodegenWorldBuilder _worldBuilder;
   final NativeCodegenEnqueuer _nativeCodegenEnqueuer;
@@ -75,7 +73,6 @@
   final SuperMemberData _superMemberData;
   final RuntimeTypesChecks _rtiChecks;
   final RuntimeTypesEncoder _rtiEncoder;
-  final JsInteropAnalysis _jsInteropAnalysis;
   final OneShotInterceptorData _oneShotInterceptorData;
   final CustomElementsCodegenAnalysis _customElementsCodegenAnalysis;
   final Map<MemberEntity, js.Expression> _generatedCode;
@@ -109,7 +106,6 @@
       this._reporter,
       this._elementEnvironment,
       this._commonElements,
-      this._deferredLoadTask,
       this._outputUnitData,
       this._worldBuilder,
       this._nativeCodegenEnqueuer,
@@ -121,7 +117,6 @@
       this._superMemberData,
       this._rtiChecks,
       this._rtiEncoder,
-      this._jsInteropAnalysis,
       this._oneShotInterceptorData,
       this._customElementsCodegenAnalysis,
       this._generatedCode,
@@ -338,7 +333,7 @@
   /// Builds a map from loadId to outputs-to-load.
   Map<String, List<Fragment>> _buildLoadMap() {
     Map<String, List<Fragment>> loadMap = <String, List<Fragment>>{};
-    _deferredLoadTask.hunksToLoad
+    _closedWorld.outputUnitData.hunksToLoad
         .forEach((String loadId, List<OutputUnit> outputUnits) {
       loadMap[loadId] = outputUnits
           .map((OutputUnit unit) => _outputs[unit])
@@ -383,8 +378,7 @@
   DeferredFragment _buildDeferredFragment(LibrariesMap librariesMap) {
     DeferredFragment result = new DeferredFragment(
         librariesMap.outputUnit,
-        _deferredLoadTask.deferredPartFileName(librariesMap.name,
-            addExtension: false),
+        deferredPartFileName(_options, librariesMap.name, addExtension: false),
         librariesMap.name,
         _buildLibraries(librariesMap),
         _buildStaticNonFinalFields(librariesMap),
@@ -427,8 +421,8 @@
     // building a static field. (Note that the static-state holder was
     // already registered earlier, and that we just call the register to get
     // the holder-instance.
-    return new StaticField(
-        element, name, _registerStaticStateHolder(), code, isFinal, isLazy);
+    return new StaticField(element, name, null, _registerStaticStateHolder(),
+        code, isFinal, isLazy);
   }
 
   List<StaticField> _buildStaticLazilyInitializedFields(
@@ -453,14 +447,15 @@
     if (code == null) return null;
 
     js.Name name = _namer.globalPropertyNameForMember(element);
+    js.Name getterName = _namer.lazyInitializerName(element);
     bool isFinal = !element.isAssignable;
     bool isLazy = true;
     // TODO(floitsch): we shouldn't update the registry in the middle of
     // building a static field. (Note that the static-state holder was
     // already registered earlier, and that we just call the register to get
     // the holder-instance.
-    return new StaticField(
-        element, name, _registerStaticStateHolder(), code, isFinal, isLazy);
+    return new StaticField(element, name, getterName,
+        _registerStaticStateHolder(), code, isFinal, isLazy);
   }
 
   List<Library> _buildLibraries(LibrariesMap librariesMap) {
@@ -646,8 +641,7 @@
         _task,
         _namer,
         _rtiChecks,
-        _rtiEncoder,
-        _jsInteropAnalysis);
+        _rtiEncoder);
 
     void visitInstanceMember(MemberEntity member) {
       if (!member.isAbstract && !member.isField) {
@@ -890,7 +884,7 @@
         isClosureCallMethod = true;
       } else {
         // Careful with operators.
-        canTearOff = _worldBuilder.hasInvokedGetter(element, _closedWorld);
+        canTearOff = _worldBuilder.hasInvokedGetter(element);
         assert(canTearOff ||
             !_worldBuilder.methodsNeedingSuperGetter.contains(element));
         tearOffName = _namer.getterForElement(element);
@@ -919,17 +913,14 @@
       functionType = _generateFunctionType(memberType, outputUnit);
     }
 
-    int requiredParameterCount;
+    FunctionEntity method = element;
+    ParameterStructure parameterStructure = method.parameterStructure;
+    int requiredParameterCount = parameterStructure.requiredParameters;
     var /* List | Map */ optionalParameterDefaultValues;
     int applyIndex = 0;
     if (canBeApplied) {
-      // TODO(redemption): Handle function entities.
-      FunctionEntity method = element;
-      ParameterStructure parameterStructure = method.parameterStructure;
-      requiredParameterCount = parameterStructure.requiredParameters;
       optionalParameterDefaultValues = _computeParameterDefaultValues(method);
-
-      if (element.parameterStructure.typeParameters > 0) {
+      if (parameterStructure.typeParameters > 0) {
         applyIndex = 1;
       }
     }
@@ -1076,15 +1067,13 @@
         }
       }
 
-      // TODO(sra): Generalize for constants other than null.
-      bool nullInitializerInAllocator = false;
+      ConstantValue initializerInAllocator = null;
       if (_allocatorAnalysis.isInitializedInAllocator(field)) {
-        assert(_allocatorAnalysis.initializerValue(field).isNull);
-        nullInitializerInAllocator = true;
+        initializerInAllocator = _allocatorAnalysis.initializerValue(field);
       }
 
       fields.add(new Field(field, name, accessorName, getterFlags, setterFlags,
-          needsCheckedSetter, nullInitializerInAllocator));
+          needsCheckedSetter, initializerInAllocator));
     }
 
     FieldVisitor visitor = new FieldVisitor(_options, _elementEnvironment,
@@ -1148,14 +1137,12 @@
       functionType = _generateFunctionType(type, outputUnit);
     }
 
-    int requiredParameterCount;
+    FunctionEntity method = element;
+    ParameterStructure parameterStructure = method.parameterStructure;
+    int requiredParameterCount = parameterStructure.requiredParameters;
     var /* List | Map */ optionalParameterDefaultValues;
     int applyIndex = 0;
     if (canBeApplied) {
-      // TODO(redemption): Support entities;
-      FunctionEntity method = element;
-      ParameterStructure parameterStructure = method.parameterStructure;
-      requiredParameterCount = parameterStructure.requiredParameters;
       optionalParameterDefaultValues = _computeParameterDefaultValues(method);
       if (parameterStructure.typeParameters > 0) {
         applyIndex = 1;
diff --git a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
index cd30c3d..02cdf45 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -10,7 +10,7 @@
 import '../elements/types.dart';
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
-import '../js_backend/js_interop_analysis.dart';
+import '../js_backend/js_interop_analysis.dart' as jsInteropAnalysis;
 import '../js_backend/namer.dart' show Namer;
 import '../js_backend/runtime_types.dart'
     show
@@ -95,27 +95,18 @@
   final Namer _namer;
   final RuntimeTypesChecks _rtiChecks;
   final RuntimeTypesEncoder _rtiEncoder;
-  final JsInteropAnalysis _jsInteropAnalysis;
   final _TypeContainedInOutputUnitVisitor _outputUnitVisitor;
 
-  RuntimeTypeGenerator(
-      this._commonElements,
-      this._outputUnitData,
-      this.emitterTask,
-      this._namer,
-      this._rtiChecks,
-      this._rtiEncoder,
-      this._jsInteropAnalysis)
+  RuntimeTypeGenerator(this._commonElements, this._outputUnitData,
+      this.emitterTask, this._namer, this._rtiChecks, this._rtiEncoder)
       : _outputUnitVisitor = new _TypeContainedInOutputUnitVisitor(
             _commonElements, _outputUnitData);
 
-  /**
-   * Generate "is tests" for [cls] itself, and the "is tests" for the
-   * classes it implements and type argument substitution functions for these
-   * tests.   We don't need to add the "is tests" of the super class because
-   * they will be inherited at runtime, but we may need to generate the
-   * substitutions, because they may have changed.
-   */
+  /// Generate "is tests" for [cls] itself, and the "is tests" for the
+  /// classes it implements and type argument substitution functions for these
+  /// tests.   We don't need to add the "is tests" of the super class because
+  /// they will be inherited at runtime, but we may need to generate the
+  /// substitutions, because they may have changed.
 
   /// Generates all properties necessary for is-checks on the [classElement].
   ///
@@ -206,7 +197,7 @@
         classElement, generateFunctionTypeSignature, generateTypeCheck);
 
     if (classElement == _commonElements.jsJavaScriptFunctionClass) {
-      var type = _jsInteropAnalysis.buildJsFunctionType();
+      var type = jsInteropAnalysis.buildJsFunctionType();
       if (type != null) {
         jsAst.Expression thisAccess = new jsAst.This();
         jsAst.Expression encoding = _rtiEncoder.getSignatureEncoding(
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index e13bf8f..8e5224c 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -69,16 +69,13 @@
 // copying properties) on platforms where we know it works well (Chrome / d8).
 var supportsDirectProtoAccess = #directAccessTestExpression;
 
-var functionsHaveName = (function() {
-  function t() {};
-  return (typeof t.name == 'string')
-})();
-
 // Sets the name property of functions, if the JS engine doesn't set the name
 // itself.
 // As of 2018 only IE11 doesn't set the name.
 function setFunctionNamesIfNecessary(holders) {
-  if (functionsHaveName) return;
+  function t(){};
+  if (typeof t.name == "string") return;
+
   for (var i = 0; i < holders.length; i++) {
     var holder = holders[i];
     var keys = Object.keys(holder);
@@ -250,6 +247,29 @@
   }
 }
 
+function installStaticTearOff(
+    container, getterName,
+    requiredParameterCount, optionalParameterDefaultValues,
+    callNames, funsOrNames, funType, applyIndex) {
+  // TODO(sra): Specialize installTearOff for static methods. It might be
+  // possible to handle some very common simple cases directly.
+  return installTearOff(
+      container, getterName, true, false,
+      requiredParameterCount, optionalParameterDefaultValues,
+      callNames, funsOrNames, funType, applyIndex);
+}
+
+function installInstanceTearOff(
+    container, getterName, isIntercepted,
+    requiredParameterCount, optionalParameterDefaultValues,
+    callNames, funsOrNames, funType, applyIndex) {
+  // TODO(sra): Specialize installTearOff for instance methods.
+  return installTearOff(
+      container, getterName, false, isIntercepted,
+      requiredParameterCount, optionalParameterDefaultValues,
+      callNames, funsOrNames, funType, applyIndex);
+}
+
 // Instead of setting the interceptor tags directly we use this update
 // function. This makes it easier for deferred fragments to contribute to the
 // embedded global.
@@ -292,6 +312,63 @@
   return holder;
 }
 
+var #hunkHelpers = (function(){
+  var mkInstance = function(
+      isIntercepted, requiredParameterCount, optionalParameterDefaultValues,
+      callNames, applyIndex) {
+    return function(container, getterName, name, funType) {
+      return installInstanceTearOff(
+          container, getterName, isIntercepted,
+          requiredParameterCount, optionalParameterDefaultValues,
+          callNames, [name], funType, applyIndex);
+    }
+  },
+
+  mkStatic = function(
+      requiredParameterCount, optionalParameterDefaultValues,
+      callNames, applyIndex) {
+    return function(container, getterName, name, funType) {
+      return installStaticTearOff(
+          container, getterName,
+          requiredParameterCount, optionalParameterDefaultValues,
+          callNames, [name], funType, applyIndex);
+    }
+  };
+
+  // TODO(sra): Minify properties of 'hunkHelpers'.
+  return {
+    inherit: inherit,
+    inheritMany: inheritMany,
+    mixin: mixin,
+    installStaticTearOff: installStaticTearOff,
+    installInstanceTearOff: installInstanceTearOff,
+
+        // Unintercepted methods.
+    _instance_0u: mkInstance(0, 0, null, [#call0selector], 0),
+    _instance_1u: mkInstance(0, 1, null, [#call1selector], 0),
+    _instance_2u: mkInstance(0, 2, null, [#call2selector], 0),
+
+        // Intercepted methods.
+    _instance_0i: mkInstance(1, 0, null, [#call0selector], 0),
+    _instance_1i: mkInstance(1, 1, null, [#call1selector], 0),
+    _instance_2i: mkInstance(1, 2, null, [#call2selector], 0),
+
+        // Static methods.
+    _static_0: mkStatic(0, null, [#call0selector], 0),
+    _static_1: mkStatic(1, null, [#call1selector], 0),
+    _static_2: mkStatic(2, null, [#call2selector], 0),
+
+    makeConstList: makeConstList,
+    lazy: lazy,
+    updateHolder: updateHolder,
+    convertToFastObject: convertToFastObject,
+    setFunctionNamesIfNecessary: setFunctionNamesIfNecessary,
+    updateTypes: updateTypes,
+    setOrUpdateInterceptorsByTag: setOrUpdateInterceptorsByTag,
+    setOrUpdateLeafTags: setOrUpdateLeafTags,
+  };
+})();
+
 // Every deferred hunk (i.e. fragment) is a function that we can invoke to
 // initialize it. At this moment it contributes its data to the main hunk.
 function initializeDeferredHunk(hunk) {
@@ -299,10 +376,7 @@
   typesOffset = #embeddedTypes.length;
 
   // TODO(floitsch): extend natives.
-  hunk(inherit, inheritMany, mixin, lazy, makeConstList, convertToFastObject, installTearOff,
-       setFunctionNamesIfNecessary, updateHolder, updateTypes,
-       setOrUpdateInterceptorsByTag, setOrUpdateLeafTags,
-       #embeddedGlobalsObject, holders, #staticState);
+  hunk(hunkHelpers, #embeddedGlobalsObject, holders, #staticState);
 }
 
 // Returns the global with the given [name].
@@ -325,8 +399,7 @@
     softDef = function(o) {};  // Replace ourselves.
     #deferredGlobal[#softId](
         holders, #embeddedGlobalsObject, #staticState,
-        inherit, inheritMany, mixin,
-        installTearOff);
+        hunkHelpers);
     if (o != null) {
       // TODO(29574): should we do something different for Firefox?
       // If we recommend that the program triggers the load by itself before
@@ -345,7 +418,7 @@
 #holders;
 
 // If the name is not set on the functions, do it now.
-setFunctionNamesIfNecessary(holders);
+hunkHelpers.setFunctionNamesIfNecessary(holders);
 
 // TODO(floitsch): we should build this object as a literal.
 var #staticStateDeclaration = {};
@@ -378,6 +451,7 @@
 
 // Ensure holders are in fast mode, now we have finished adding things.
 convertAllToFastObject(holders);
+convertToFastObject(#staticState);
 
 // Invokes main (making sure that it records the 'current-script' value).
 #invokeMain;
@@ -424,16 +498,13 @@
 ///
 /// This template is used for Dart 2.
 const String deferredBoilerplateDart2 = '''
-function(inherit, inheritMany, mixin, lazy, makeConstList, convertToFastObject,
-         installTearOff, setFunctionNamesIfNecessary, updateHolder, updateTypes,
-         setOrUpdateInterceptorsByTag, setOrUpdateLeafTags,
-         #embeddedGlobalsObject, holdersList, #staticState) {
+function(hunkHelpers, #embeddedGlobalsObject, holdersList, #staticState) {
 
 // Builds the holders. They only contain the data for new holders.
 #holders;
 
 // If the name is not set on the functions, do it now.
-setFunctionNamesIfNecessary(#deferredHoldersList);
+hunkHelpers.setFunctionNamesIfNecessary(#deferredHoldersList);
 
 // Updates the holders of the main-fragment. Uses the provided holdersList to
 // access the main holders.
@@ -446,7 +517,7 @@
 // These can only refer to regular classes and in Dart 2 only closures have
 // function types so the `typesOffset` has been safely computed before it's
 // referred in the signatures of the `closures` below.
-var #typesOffset = updateTypes(#types);
+var #typesOffset = hunkHelpers.updateTypes(#types);
 #closures;
 // Sets aliases of methods (on the prototypes of classes).
 #aliases;
@@ -475,8 +546,7 @@
 const String softDeferredBoilerplate = '''
 #deferredGlobal[#softId] =
   function(holdersList, #embeddedGlobalsObject, #staticState,
-           inherit, inheritMany, mixin,
-           installTearOff) {
+           hunkHelpers) {
 
 // Installs the holders as local variables.
 #installHoldersAsLocals;
@@ -490,14 +560,12 @@
 #inheritance;
 }''';
 
-/**
- * This class builds a JavaScript tree for a given fragment.
- *
- * A fragment is generally written into a separate file so that it can be
- * loaded dynamically when a deferred library is loaded.
- *
- * This class is stateless and can be reused for different fragments.
- */
+/// This class builds a JavaScript tree for a given fragment.
+///
+/// A fragment is generally written into a separate file so that it can be
+/// loaded dynamically when a deferred library is loaded.
+///
+/// This class is stateless and can be reused for different fragments.
 class FragmentEmitter {
   final Compiler compiler;
   final Namer namer;
@@ -506,6 +574,14 @@
   final ModelEmitter modelEmitter;
   final JClosedWorld _closedWorld;
 
+  js.Name _call0Name, _call1Name, _call2Name;
+  js.Name get call0Name =>
+      _call0Name ??= namer.getNameForJsGetName(null, JsGetName.CALL_PREFIX0);
+  js.Name get call1Name =>
+      _call1Name ??= namer.getNameForJsGetName(null, JsGetName.CALL_PREFIX1);
+  js.Name get call2Name =>
+      _call2Name ??= namer.getNameForJsGetName(null, JsGetName.CALL_PREFIX2);
+
   FragmentEmitter(this.compiler, this.namer, this.backend, this.constantEmitter,
       this.modelEmitter, this._closedWorld);
 
@@ -519,6 +595,13 @@
     return js.js('#.#', [cls.holder.name, cls.name]);
   }
 
+  void registerEntityAst(Entity entity, js.Node code, {LibraryEntity library}) {
+    compiler.dumpInfoTask.registerEntityAst(entity, code);
+    // TODO(sigmund): stop recoding associations twice, dump-info already
+    // has library to element dependencies to recover this data.
+    if (library != null) compiler.dumpInfoTask.registerEntityAst(library, code);
+  }
+
   js.Statement emitMainFragment(
       Program program, DeferredLoadingState deferredLoadingState) {
     MainFragment fragment = program.fragments.first;
@@ -532,6 +615,8 @@
         emitHolders(program.holders, fragment, initializeEmptyHolders: true);
 
     js.Statement mainCode = js.js.statement(mainBoilerplate, {
+      // TODO(29455): 'hunkHelpers' displaces other names, so don't minify it.
+      'hunkHelpers': js.VariableDeclaration('hunkHelpers', allowRename: false),
       'directAccessTestExpression': js.js(directAccessTestExpression),
       'cyclicThrow': backend.emitter
           .staticFunctionAccess(_closedWorld.commonElements.cyclicThrowHelper),
@@ -568,10 +653,14 @@
       'nativeSupport': program.needsNativeSupport
           ? emitNativeSupport(fragment)
           : new js.EmptyStatement(),
-      'jsInteropSupport': _closedWorld.nativeData.isJsInteropUsed
-          ? backend.jsInteropAnalysis.buildJsInteropBootstrap()
-          : new js.EmptyStatement(),
+      'jsInteropSupport': jsInteropAnalysis.buildJsInteropBootstrap(
+              compiler.codegenWorldBuilder, _closedWorld.nativeData, namer) ??
+          new js.EmptyStatement(),
       'invokeMain': fragment.invokeMain,
+
+      'call0selector': js.quoteName(call0Name),
+      'call1selector': js.quoteName(call1Name),
+      'call2selector': js.quoteName(call2Name),
     });
     if (program.hasSoftDeferredClasses) {
       return new js.Block([
@@ -619,10 +708,11 @@
       Holder holder = nonStaticStateHolders[i];
       if (holderCode.activeHolders.contains(holder)) {
         updateHolderAssignments.add(js.js.statement(
-            '#holder = updateHolder(holdersList[#index], #holder)', {
-          'index': js.number(i),
-          'holder': new js.VariableUse(holder.name)
-        }));
+            '#holder = hunkHelpers.updateHolder(holdersList[#index], #holder)',
+            {
+              'index': js.number(i),
+              'holder': new js.VariableUse(holder.name)
+            }));
       } else {
         // TODO(sra): Change declaration followed by assignments to declarations
         // with initialization.
@@ -667,8 +757,8 @@
       return null;
     }
 
-    // TODO(floitsch): don't just reference 'init'.
-    return js.js(deferredBoilerplateDart2, {
+    js.Expression code = js.js(deferredBoilerplateDart2, {
+      // TODO(floitsch): don't just reference 'init'.
       'embeddedGlobalsObject': new js.Parameter('init'),
       'staticState': new js.Parameter(namer.staticStateHolder),
       'holders': holderCode.statements,
@@ -688,6 +778,11 @@
       'nativeSupport': nativeSupport,
       'typesOffset': namer.typesOffsetName,
     });
+
+    if (compiler.options.experimentStartupFunctions) {
+      code = js.Parentheses(code);
+    }
+    return code;
   }
 
   /// Emits all holders, except for the static-state holder.
@@ -702,30 +797,28 @@
         .where((Holder holder) => !holder.isStaticStateHolder)
         .toList(growable: false);
 
-    Map<Holder, Map<js.Name, js.Expression>> holderCode = {};
+    Map<Holder, List<js.Property>> holderCode = {};
 
     for (Holder holder in holders) {
-      holderCode[holder] = <js.Name, js.Expression>{};
+      holderCode[holder] = <js.Property>[];
     }
 
     for (Library library in fragment.libraries) {
       for (StaticMethod method in library.statics) {
         assert(!method.holder.isStaticStateHolder);
         var staticMethod = emitStaticMethod(method);
-        if (compiler.options.dumpInfo) {
-          for (var code in staticMethod.values) {
-            compiler.dumpInfoTask.registerEntityAst(method.element, code);
-            compiler.dumpInfoTask.registerEntityAst(library.element, code);
-          }
-        }
-        holderCode[method.holder].addAll(staticMethod);
+        staticMethod.forEach((key, value) {
+          var property = new js.Property(js.quoteName(key), value);
+          holderCode[method.holder].add(property);
+          registerEntityAst(method.element, property, library: library.element);
+        });
       }
       for (Class cls in library.classes) {
         assert(!cls.holder.isStaticStateHolder);
         var constructor = emitConstructor(cls);
-        compiler.dumpInfoTask.registerEntityAst(cls.element, constructor);
-        compiler.dumpInfoTask.registerEntityAst(library.element, constructor);
-        holderCode[cls.holder][cls.name] = constructor;
+        var property = new js.Property(js.quoteName(cls.name), constructor);
+        registerEntityAst(cls.element, property, library: library.element);
+        holderCode[cls.holder].add(property);
       }
     }
 
@@ -733,10 +826,7 @@
     List<Holder> activeHolders = [];
 
     for (Holder holder in holders) {
-      List<js.Property> properties = [];
-      holderCode[holder].forEach((js.Name key, js.Expression value) {
-        properties.add(new js.Property(js.quoteName(key), value));
-      });
+      List<js.Property> properties = holderCode[holder];
       if (properties.isEmpty) {
         holderInitializations.add(new js.VariableInitialization(
             new js.VariableDeclaration(holder.name, allowRename: false),
@@ -845,26 +935,31 @@
     const int maxChainLength = 30;
     js.Expression assignment = null;
     int chainLength = 0;
-    bool previousIsNull = false;
+    ConstantValue previousConstant = null;
     void flushAssignment() {
       if (assignment != null) {
         statements.add(js.js.statement('#;', assignment));
         assignment = null;
         chainLength = 0;
-        previousIsNull = false;
+        previousConstant = null;
       }
     }
 
     for (Field field in cls.fields) {
-      if (field.nullInitializerInAllocator) {
-        if (previousIsNull && chainLength < maxChainLength) {
+      ConstantValue constant = field.initializerInAllocator;
+      if (constant != null) {
+        if (constant == previousConstant && chainLength < maxChainLength) {
           assignment = js.js('#.# = #', [thisRef, field.name, assignment]);
         } else {
           flushAssignment();
-          assignment = js.js('#.# = null', [thisRef, field.name]);
+          assignment = js.js('#.# = #', [
+            thisRef,
+            field.name,
+            constantEmitter.generate(constant),
+          ]);
         }
         ++chainLength;
-        previousIsNull = true;
+        previousConstant = constant;
       } else {
         flushAssignment();
         js.Parameter parameter = new js.Parameter('t${parameters.length}');
@@ -911,8 +1006,7 @@
       var proto = js.js.statement(
           '#.prototype = #;', [classReference(cls), emitPrototype(cls)]);
       ClassEntity element = cls.element;
-      compiler.dumpInfoTask.registerEntityAst(element, proto);
-      compiler.dumpInfoTask.registerEntityAst(element.library, proto);
+      registerEntityAst(element, proto, library: element.library);
       return proto;
     }).toList(growable: false);
 
@@ -947,16 +1041,15 @@
     if (cls.superclass == null) {
       // TODO(sra): What is this doing? Document or remove.
       properties
-          .add(new js.Property(js.string("constructor"), classReference(cls)));
-      properties
-          .add(new js.Property(namer.operatorIs(cls.element), js.number(1)));
+          .add(js.Property(js.string("constructor"), classReference(cls)));
+      properties.add(js.Property(namer.operatorIs(cls.element), js.number(1)));
     }
 
     allMethods.forEach((Method method) {
       emitInstanceMethod(method)
           .forEach((js.Expression name, js.Expression code) {
-        var prop = new js.Property(name, code);
-        compiler.dumpInfoTask.registerEntityAst(method.element, prop);
+        var prop = js.Property(name, code);
+        registerEntityAst(method.element, prop);
         properties.add(prop);
       });
     });
@@ -965,8 +1058,14 @@
       // Closures extend a common base class, so we can put properties on the
       // prototype for common values.
 
+      // Closures taking exactly one argument are common.
+      properties.add(js.Property(
+          js.string(namer.callCatchAllName), js.quoteName(call1Name)));
+      properties.add(
+          js.Property(js.string(namer.requiredParameterField), js.number(1)));
+
       // Most closures have no optional arguments.
-      properties.add(new js.Property(
+      properties.add(js.Property(
           js.string(namer.defaultValuesField), new js.LiteralNull()));
     }
 
@@ -1049,12 +1148,22 @@
         // complex cases. [forceAdd] might be true when this is fixed.
         bool forceAdd = !method.isClosureCallMethod;
 
-        properties[js.string(namer.callCatchAllName)] = js.quoteName(
-            method.applyIndex == 0
-                ? method.name
-                : method.parameterStubs[method.applyIndex - 1].name);
-        properties[js.string(namer.requiredParameterField)] =
-            js.number(method.requiredParameterCount);
+        // Common case of "call*": "call$1" is stored on the Closure class.
+        if (method.applyIndex != 0 ||
+            method.parameterStubs.isNotEmpty ||
+            method.requiredParameterCount != 1 ||
+            forceAdd) {
+          js.Name applyName = method.applyIndex == 0
+              ? method.name
+              : method.parameterStubs[method.applyIndex - 1].name;
+          properties[js.string(namer.callCatchAllName)] =
+              js.quoteName(applyName);
+        }
+        // Common case of '1' is stored on the Closure class.
+        if (method.requiredParameterCount != 1 || forceAdd) {
+          properties[js.string(namer.requiredParameterField)] =
+              js.number(method.requiredParameterCount);
+        }
 
         js.Expression defaultValues =
             _encodeOptionalParameterDefaultValues(method);
@@ -1077,7 +1186,7 @@
     List<js.Statement> inheritCalls = [];
     List<js.Statement> mixinCalls = [];
     // local caches of functions to allow minifaction of function name in call.
-    Map<String, js.Expression> locals = {};
+    LocalAliases locals = LocalAliases();
 
     Set<Class> classesInFragment = Set();
     for (Library library in fragment.libraries) {
@@ -1105,11 +1214,14 @@
       for (Class cls in library.classes) {
         if (cls.isSoftDeferred != softDeferred) continue;
         collect(cls);
-
         if (cls.mixinClass != null) {
-          locals['_mixin'] ??= js.js('mixin');
-          mixinCalls.add(js.js.statement('_mixin(#, #)',
-              [classReference(cls), classReference(cls.mixinClass)]));
+          js.Statement statement = js.js.statement('#(#, #)', [
+            locals.find('_mixin', 'hunkHelpers.mixin'),
+            classReference(cls),
+            classReference(cls.mixinClass),
+          ]);
+          registerEntityAst(cls.element, statement, library: library.element);
+          mixinCalls.add(statement);
         }
       }
     }
@@ -1120,26 +1232,38 @@
           ? new js.LiteralNull()
           : classReference(superclass);
       if (list.length == 1) {
-        locals['_inherit'] ??= js.js('inherit');
-        inheritCalls.add(js.js.statement('_inherit(#, #)',
-            [classReference(list.single), superclassReference]));
+        Class cls = list.single;
+        var statement = js.js.statement('#(#, #)', [
+          locals.find('_inherit', 'hunkHelpers.inherit'),
+          classReference(cls),
+          superclassReference
+        ]);
+        registerEntityAst(cls.element, statement, library: cls.element.library);
+        inheritCalls.add(statement);
       } else {
-        locals['_inheritMany'] ??= js.js('inheritMany');
-        var listElements = list.map(classReference).toList();
-        inheritCalls.add(js.js.statement('_inheritMany(#, #)',
-            [superclassReference, js.ArrayInitializer(listElements)]));
+        List<js.Expression> listElements = [];
+        // Since inheritMany shares the superclass reference, we attribute it
+        // only to the first subclass.
+        ClassEntity firstClass = list.first.element;
+        registerEntityAst(firstClass, superclassReference,
+            library: firstClass.library);
+        for (Class cls in list) {
+          js.Expression reference = classReference(cls);
+          registerEntityAst(cls.element, reference,
+              library: cls.element.library);
+          listElements.add(reference);
+        }
+        inheritCalls.add(js.js.statement('#(#, #)', [
+          locals.find('_inheritMany', 'hunkHelpers.inheritMany'),
+          superclassReference,
+          js.ArrayInitializer(listElements)
+        ]));
       }
     }
 
     List<js.Statement> statements = [];
     if (locals.isNotEmpty) {
-      List<js.VariableInitialization> initializations = [];
-      locals.forEach((local, value) {
-        initializations.add(
-            js.VariableInitialization(js.VariableDeclaration(local), value));
-      });
-      statements.add(
-          js.ExpressionStatement(js.VariableDeclarationList(initializations)));
+      statements.add(locals.toStatement());
     }
     statements.addAll(inheritCalls);
     statements.addAll(mixinCalls);
@@ -1157,19 +1281,28 @@
     for (Library library in fragment.libraries) {
       for (Class cls in library.classes) {
         if (cls.isSoftDeferred != softDeferred) continue;
+        bool firstAlias = true;
         for (InstanceMethod method in cls.methods) {
           if (method.aliasName != null) {
-            assignments.add(js.js.statement('#.prototype.# = #.prototype.#', [
-              classReference(cls),
-              js.quoteName(method.aliasName),
-              classReference(cls),
-              js.quoteName(method.name)
-            ]));
+            if (firstAlias) {
+              firstAlias = false;
+              js.Statement statement = js.js.statement(
+                  assignments.isEmpty
+                      ? 'var _ = #.prototype;'
+                      : '_ = #.prototype',
+                  classReference(cls));
+              registerEntityAst(method.element, statement);
+              assignments.add(statement);
+            }
+            js.Statement statement = js.js.statement('_.# = _.#',
+                [js.quoteName(method.aliasName), js.quoteName(method.name)]);
+            registerEntityAst(method.element, statement);
+            assignments.add(statement);
           }
         }
       }
     }
-    return new js.Block(assignments);
+    return wrapPhase('aliases', assignments);
   }
 
   /// Encodes the optional default values so that the runtime Function.apply
@@ -1204,75 +1337,6 @@
     }
   }
 
-  /// Emits the statement that installs a tear off for a method.
-  ///
-  /// Tear-offs might be passed to `Function.apply` which means that all
-  /// calling-conventions (with or without optional positional/named arguments)
-  /// are possible. As such, the tear-off needs enough information to fill in
-  /// missing parameters.
-  js.Statement emitInstallTearOff(js.Expression container, DartMethod method) {
-    List<js.Name> callNames = [];
-    List<js.Expression> funsOrNames = [];
-
-    /// Adds the stub-method's code or name to the [funsOrNames] array.
-    ///
-    /// Static methods don't need stub-methods except for tear-offs. As such,
-    /// they are not emitted in the prototype, but directly passed here.
-    ///
-    /// Instance-methods install the stub-methods in their prototype, and we
-    /// use string-based redirections to find them there.
-    void addFunOrName(StubMethod stubMethod) {
-      if (method.isStatic) {
-        funsOrNames.add(stubMethod.code);
-      } else {
-        funsOrNames.add(js.quoteName(stubMethod.name));
-      }
-    }
-
-    callNames.add(method.callName);
-    // The first entry in the funsOrNames-array must be a string.
-    funsOrNames.add(js.quoteName(method.name));
-    for (ParameterStubMethod stubMethod in method.parameterStubs) {
-      callNames.add(stubMethod.callName);
-      addFunOrName(stubMethod);
-    }
-
-    js.ArrayInitializer callNameArray =
-        new js.ArrayInitializer(callNames.map(js.quoteName).toList());
-    js.ArrayInitializer funsOrNamesArray = new js.ArrayInitializer(funsOrNames);
-
-    bool isIntercepted = false;
-    if (method is InstanceMethod) {
-      isIntercepted = method.isIntercepted;
-    }
-    int requiredParameterCount = 0;
-    js.Expression optionalParameterDefaultValues = new js.LiteralNull();
-    if (method.canBeApplied) {
-      requiredParameterCount = method.requiredParameterCount;
-      optionalParameterDefaultValues =
-          _encodeOptionalParameterDefaultValues(method);
-    }
-
-    var applyIndex = js.number(method.applyIndex);
-
-    return js.js.statement('''
-        installTearOff(#container, #getterName, #isStatic, #isIntercepted,
-                       #requiredParameterCount, #optionalParameterDefaultValues,
-                       #callNames, #funsOrNames, #funType, #applyIndex)''', {
-      "container": container,
-      "getterName": js.quoteName(method.tearOffName),
-      // 'Truthy' values are ok for `isStatic` and `isIntercepted`.
-      "isStatic": js.number(method.isStatic ? 1 : 0),
-      "isIntercepted": js.number(isIntercepted ? 1 : 0),
-      "requiredParameterCount": js.number(requiredParameterCount),
-      "optionalParameterDefaultValues": optionalParameterDefaultValues,
-      "callNames": callNameArray,
-      "funsOrNames": funsOrNamesArray,
-      "funType": method.functionType,
-      "applyIndex": applyIndex,
-    });
-  }
-
   /// Wraps the statement in a named function to that it shows up as a unit in
   /// profiles.
   // TODO(sra): Should this be conditional?
@@ -1292,6 +1356,149 @@
   /// Emits the section that installs tear-off getters.
   js.Statement emitInstallTearOffs(Fragment fragment,
       {bool softDeferred = false}) {
+    LocalAliases locals = LocalAliases();
+
+    /// Emits the statement that installs a tear off for a method.
+    ///
+    /// Tear-offs might be passed to `Function.apply` which means that all
+    /// calling-conventions (with or without optional positional/named
+    /// arguments) are possible. As such, the tear-off needs enough information
+    /// to fill in missing parameters.
+    js.Statement emitInstallTearOff(
+        js.Expression container, DartMethod method) {
+      List<js.Name> callNames = [];
+      List<js.Expression> funsOrNames = [];
+
+      /// Adds the stub-method's code or name to the [funsOrNames] array.
+      ///
+      /// Static methods don't need stub-methods except for tear-offs. As such,
+      /// they are not emitted in the prototype, but directly passed here.
+      ///
+      /// Instance-methods install the stub-methods in their prototype, and we
+      /// use string-based redirections to find them there.
+      void addFunOrName(StubMethod stubMethod) {
+        if (method.isStatic) {
+          funsOrNames.add(stubMethod.code);
+        } else {
+          funsOrNames.add(js.quoteName(stubMethod.name));
+        }
+      }
+
+      callNames.add(method.callName);
+      // The first entry in the funsOrNames-array must be a string.
+      funsOrNames.add(js.quoteName(method.name));
+      for (ParameterStubMethod stubMethod in method.parameterStubs) {
+        callNames.add(stubMethod.callName);
+        addFunOrName(stubMethod);
+      }
+
+      js.ArrayInitializer callNameArray =
+          new js.ArrayInitializer(callNames.map(js.quoteName).toList());
+      js.ArrayInitializer funsOrNamesArray =
+          new js.ArrayInitializer(funsOrNames);
+
+      bool isIntercepted = false;
+      if (method is InstanceMethod) {
+        isIntercepted = method.isIntercepted;
+      }
+
+      int requiredParameterCount = method.requiredParameterCount;
+      js.Expression optionalParameterDefaultValues = new js.LiteralNull();
+      if (method.canBeApplied) {
+        optionalParameterDefaultValues =
+            _encodeOptionalParameterDefaultValues(method);
+      }
+
+      var applyIndex = js.number(method.applyIndex);
+
+      if (method.isStatic) {
+        if (requiredParameterCount <= 2 &&
+            callNames.length == 1 &&
+            optionalParameterDefaultValues is js.LiteralNull &&
+            method.applyIndex == 0) {
+          js.Statement finish(int arity) {
+            // Short form for exactly 0/1/2 arguments.
+            var install =
+                locals.find('_static_${arity}', 'hunkHelpers._static_${arity}');
+            return js.js.statement('''
+                #install(#container, #getterName, #name, #funType)''', {
+              "install": install,
+              "container": container,
+              "getterName": js.quoteName(method.tearOffName),
+              "name": funsOrNames.single,
+              "funType": method.functionType,
+            });
+          }
+
+          var installedName = callNames.single;
+          if (installedName == call0Name) return finish(0);
+          if (installedName == call1Name) return finish(1);
+          if (installedName == call2Name) return finish(2);
+        }
+
+        var install =
+            locals.find('_static', 'hunkHelpers.installStaticTearOff');
+        return js.js.statement('''
+            #install(#container, #getterName,
+                     #requiredParameterCount, #optionalParameterDefaultValues,
+                      #callNames, #funsOrNames, #funType, #applyIndex)''', {
+          "install": install,
+          "container": container,
+          "getterName": js.quoteName(method.tearOffName),
+          "requiredParameterCount": js.number(requiredParameterCount),
+          "optionalParameterDefaultValues": optionalParameterDefaultValues,
+          "callNames": callNameArray,
+          "funsOrNames": funsOrNamesArray,
+          "funType": method.functionType,
+          "applyIndex": applyIndex,
+        });
+      } else {
+        if (requiredParameterCount <= 2 &&
+            callNames.length == 1 &&
+            optionalParameterDefaultValues is js.LiteralNull &&
+            method.applyIndex == 0) {
+          js.Statement finish(int arity) {
+            // Short form for exactly 0/1/2 arguments.
+            String isInterceptedTag = isIntercepted ? 'i' : 'u';
+            var install = locals.find('_instance_${arity}_${isInterceptedTag}',
+                'hunkHelpers._instance_${arity}${isInterceptedTag}');
+            return js.js.statement('''
+                #install(#container, #getterName, #name, #funType)''', {
+              "install": install,
+              "container": container,
+              "getterName": js.quoteName(method.tearOffName),
+              "name": funsOrNames.single,
+              "funType": method.functionType,
+            });
+          }
+
+          var installedName = callNames.single;
+          if (installedName == call0Name) return finish(0);
+          if (installedName == call1Name) return finish(1);
+          if (installedName == call2Name) return finish(2);
+        }
+
+        var install =
+            locals.find('_instance', 'hunkHelpers.installInstanceTearOff');
+        return js.js.statement('''
+            #install(#container, #getterName, #isIntercepted,
+                     #requiredParameterCount, #optionalParameterDefaultValues,
+                     #callNames, #funsOrNames, #funType, #applyIndex)''', {
+          "install": install,
+          "container": container,
+          "getterName": js.quoteName(method.tearOffName),
+          // 'Truthy' values are ok for `isIntercepted`.
+          "isIntercepted": js.number(isIntercepted ? 1 : 0),
+          "requiredParameterCount": js.number(requiredParameterCount),
+          "optionalParameterDefaultValues": optionalParameterDefaultValues,
+          "callNames": callNameArray,
+          "funsOrNames": funsOrNamesArray,
+          "funType": method.functionType,
+          "applyIndex": applyIndex,
+        });
+      }
+    }
+
     List<js.Statement> inits = [];
     js.Expression temp;
 
@@ -1301,8 +1508,11 @@
         if (method is StaticDartMethod) {
           if (method.needsTearOff) {
             Holder holder = method.holder;
-            inits.add(
-                emitInstallTearOff(new js.VariableUse(holder.name), method));
+            js.Statement statement =
+                emitInstallTearOff(new js.VariableUse(holder.name), method);
+            registerEntityAst(method.element, statement,
+                library: library.element);
+            inits.add(statement);
           }
         }
       }
@@ -1320,22 +1530,28 @@
           reference = js.js('# = #', [temp, container]);
         }
         for (InstanceMethod method in methods) {
-          inits.add(emitInstallTearOff(reference, method));
+          js.Statement statement = emitInstallTearOff(reference, method);
+          registerEntityAst(method.element, statement);
+          inits.add(statement);
           reference = temp; // Second and subsequent calls use temp.
         }
       }
     }
+
+    if (locals.isNotEmpty) {
+      inits.insert(0, locals.toStatement());
+    }
+
     return wrapPhase('installTearOffs', inits);
   }
 
   /// Emits the constants section.
   js.Statement emitConstants(Fragment fragment) {
     List<js.Statement> assignments = [];
+    bool hasList = false;
     for (Constant constant in fragment.constants) {
-      // TODO(floitsch): instead of just updating the constant holder, we should
-      // find the constants that don't have any dependency on other constants
-      // and create an object-literal with them (and assign it to the
-      // constant-holder variable).
+      // TODO(25230): We only need to name constants that are used from function
+      // bodies or from other constants in a different part.
       var assignment = js.js.statement('#.# = #', [
         constant.holder.name,
         constant.name,
@@ -1343,6 +1559,11 @@
       ]);
       compiler.dumpInfoTask.registerConstantAst(constant.value, assignment);
       assignments.add(assignment);
+      if (constant.value.isList) hasList = true;
+    }
+    if (hasList) {
+      assignments.insert(
+          0, js.js.statement('var makeConstList = hunkHelpers.makeConstList;'));
     }
     return wrapPhase('constants', assignments);
   }
@@ -1353,15 +1574,19 @@
   /// an initializer.
   js.Statement emitStaticNonFinalFields(Fragment fragment) {
     List<StaticField> fields = fragment.staticNonFinalFields;
-    // TODO(floitsch): instead of assigning the fields one-by-one we should
-    // create a literal and assign it to the static-state holder.
-    // TODO(floitsch): if we don't make a literal we should at least initialize
-    // statics that have the same initial value in the same expression:
-    //    `$.x = $.y = $.z = null;`.
+    // TODO(sra): Chain assignments that have the same value, i.e.
+    //
+    //    $.x = null; $.y = null; $.z = null;
+    // -->
+    //    $.z = $.y = $.x = null;
+    //
     Iterable<js.Statement> statements = fields.map((StaticField field) {
       assert(field.holder.isStaticStateHolder);
-      return js.js
+      js.Statement statement = js.js
           .statement("#.# = #;", [field.holder.name, field.name, field.code]);
+      registerEntityAst(field.element, statement,
+          library: field.element.library);
+      return statement;
     });
     return wrapPhase('staticFields', statements.toList());
   }
@@ -1372,17 +1597,28 @@
   /// require an initializer.
   js.Statement emitLazilyInitializedStatics(Fragment fragment) {
     List<StaticField> fields = fragment.staticLazilyInitializedFields;
-    Iterable<js.Statement> statements = fields.map((StaticField field) {
+    List<js.Statement> statements = [];
+    LocalAliases locals = LocalAliases();
+    for (StaticField field in fields) {
       assert(field.holder.isStaticStateHolder);
-      return js.js.statement("lazy(#, #, #, #);", [
+      js.Statement statement = js.js.statement("#(#, #, #, #);", [
+        locals.find('_lazy', 'hunkHelpers.lazy'),
         field.holder.name,
         js.quoteName(field.name),
-        js.quoteName(namer.deriveLazyInitializerName(field.name)),
+        js.quoteName(field.getterName),
         field.code
       ]);
-    });
 
-    return wrapPhase('lazyInitializers', statements.toList());
+      registerEntityAst(field.element, statement,
+          library: field.element.library);
+      statements.add(statement);
+    }
+
+    if (locals.isNotEmpty) {
+      statements.insert(0, locals.toStatement());
+    }
+
+    return wrapPhase('lazyInitializers', statements);
   }
 
   /// Emits the embedded globals that are needed for deferred loading.
@@ -1599,10 +1835,11 @@
           _closedWorld.backendUsage, generateEmbeddedGlobalAccess, js.js("""
         // On V8, the 'intern' function converts a string to a symbol, which
         // makes property access much faster.
+        // TODO(sra): Use Symbol on non-IE11 browsers.
         function (s) {
           var o = {};
           o[s] = 1;
-          return Object.keys(convertToFastObject(o))[0];
+          return Object.keys(hunkHelpers.convertToFastObject(o))[0];
         }""", [])));
     }
 
@@ -1640,12 +1877,13 @@
     }
 
     if (interceptorsByTag.isNotEmpty) {
-      statements.add(js.js.statement("setOrUpdateInterceptorsByTag(#);",
+      statements.add(js.js.statement(
+          "hunkHelpers.setOrUpdateInterceptorsByTag(#);",
           js.objectLiteral(interceptorsByTag)));
     }
     if (leafTags.isNotEmpty) {
-      statements.add(js.js
-          .statement("setOrUpdateLeafTags(#);", js.objectLiteral(leafTags)));
+      statements.add(js.js.statement(
+          "hunkHelpers.setOrUpdateLeafTags(#);", js.objectLiteral(leafTags)));
     }
     statements.addAll(subclassAssignments);
 
@@ -1653,6 +1891,27 @@
   }
 }
 
+class LocalAliases {
+  final Map<String, js.Expression> _locals = {};
+
+  bool get isEmpty => _locals.isEmpty;
+  bool get isNotEmpty => !isEmpty;
+
+  String find(String alias, String expression) {
+    _locals[alias] ??= js.js(expression);
+    return alias;
+  }
+
+  js.Statement toStatement() {
+    List<js.VariableInitialization> initializations = [];
+    _locals.forEach((local, value) {
+      initializations
+          .add(js.VariableInitialization(js.VariableDeclaration(local), value));
+    });
+    return js.ExpressionStatement(js.VariableDeclarationList(initializations));
+  }
+}
+
 /// Code to initialize holder with ancillary information.
 class HolderCode {
   final List<Holder> activeHolders;
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 1ba4a80..d091e73 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -18,6 +18,7 @@
         INTERCEPTORS_BY_TAG,
         IS_HUNK_INITIALIZED,
         IS_HUNK_LOADED,
+        JsGetName,
         LEAF_TAGS,
         MANGLED_GLOBAL_NAMES,
         MANGLED_NAMES,
@@ -41,6 +42,7 @@
 import '../../js/js.dart' as js;
 import '../../js_backend/js_backend.dart'
     show JavaScriptBackend, Namer, ConstantEmitter, StringBackedName;
+import '../../js_backend/js_interop_analysis.dart' as jsInteropAnalysis;
 import '../../world.dart';
 import '../code_emitter_task.dart';
 import '../constant_ordering.dart' show ConstantOrdering;
@@ -55,6 +57,7 @@
 class ModelEmitter {
   final Compiler compiler;
   final Namer namer;
+  final CodeEmitterTask task;
   ConstantEmitter constantEmitter;
   final NativeEmitter nativeEmitter;
   final bool shouldGenerateSourceMap;
@@ -78,7 +81,7 @@
   static const String typeNameProperty = r"builtin$cls";
 
   ModelEmitter(this.compiler, this.namer, this.nativeEmitter, this._closedWorld,
-      Sorter sorter, CodeEmitterTask task, this.shouldGenerateSourceMap)
+      Sorter sorter, this.task, this.shouldGenerateSourceMap)
       : _constantOrdering = new ConstantOrdering(sorter) {
     this.constantEmitter = new ConstantEmitter(
         compiler.options,
@@ -269,8 +272,10 @@
     LocationCollector locationCollector;
     List<CodeOutputListener> codeOutputListeners;
     if (shouldGenerateSourceMap) {
-      locationCollector = new LocationCollector();
-      codeOutputListeners = <CodeOutputListener>[locationCollector];
+      task.measureSubtask('source-maps', () {
+        locationCollector = new LocationCollector();
+        codeOutputListeners = <CodeOutputListener>[locationCollector];
+      });
     }
 
     CodeOutput mainOutput = new StreamCodeOutput(
@@ -290,22 +295,26 @@
         monitor: compiler.dumpInfoTask));
 
     if (shouldGenerateSourceMap) {
-      mainOutput.add(SourceMapBuilder.generateSourceMapTag(
-          compiler.options.sourceMapUri, compiler.options.outputUri));
+      task.measureSubtask('source-maps', () {
+        mainOutput.add(SourceMapBuilder.generateSourceMapTag(
+            compiler.options.sourceMapUri, compiler.options.outputUri));
+      });
     }
 
     mainOutput.close();
 
     if (shouldGenerateSourceMap) {
-      SourceMapBuilder.outputSourceMap(
-          mainOutput,
-          locationCollector,
-          namer.createMinifiedGlobalNameMap(),
-          namer.createMinifiedInstanceNameMap(),
-          '',
-          compiler.options.sourceMapUri,
-          compiler.options.outputUri,
-          compiler.outputProvider);
+      task.measureSubtask('source-maps', () {
+        SourceMapBuilder.outputSourceMap(
+            mainOutput,
+            locationCollector,
+            namer.createMinifiedGlobalNameMap(),
+            namer.createMinifiedInstanceNameMap(),
+            '',
+            compiler.options.sourceMapUri,
+            compiler.options.outputUri,
+            compiler.outputProvider);
+      });
     }
   }
 
@@ -321,8 +330,10 @@
 
     LocationCollector locationCollector;
     if (shouldGenerateSourceMap) {
-      locationCollector = new LocationCollector();
-      outputListeners.add(locationCollector);
+      task.measureSubtask('source-maps', () {
+        locationCollector = new LocationCollector();
+        outputListeners.add(locationCollector);
+      });
     }
 
     String hunkPrefix = fragment.outputFileName;
@@ -363,31 +374,33 @@
         '${deferredInitializersGlobal}.current');
 
     if (shouldGenerateSourceMap) {
-      Uri mapUri, partUri;
-      Uri sourceMapUri = compiler.options.sourceMapUri;
-      Uri outputUri = compiler.options.outputUri;
-      String partName = "$hunkPrefix.$partExtension";
-      String hunkFileName = "$hunkPrefix.$deferredExtension";
+      task.measureSubtask('source-maps', () {
+        Uri mapUri, partUri;
+        Uri sourceMapUri = compiler.options.sourceMapUri;
+        Uri outputUri = compiler.options.outputUri;
+        String partName = "$hunkPrefix.$partExtension";
+        String hunkFileName = "$hunkPrefix.$deferredExtension";
 
-      if (sourceMapUri != null) {
-        String mapFileName = hunkFileName + ".map";
-        List<String> mapSegments = sourceMapUri.pathSegments.toList();
-        mapSegments[mapSegments.length - 1] = mapFileName;
-        mapUri =
-            compiler.options.sourceMapUri.replace(pathSegments: mapSegments);
-      }
+        if (sourceMapUri != null) {
+          String mapFileName = hunkFileName + ".map";
+          List<String> mapSegments = sourceMapUri.pathSegments.toList();
+          mapSegments[mapSegments.length - 1] = mapFileName;
+          mapUri =
+              compiler.options.sourceMapUri.replace(pathSegments: mapSegments);
+        }
 
-      if (outputUri != null) {
-        List<String> partSegments = outputUri.pathSegments.toList();
-        partSegments[partSegments.length - 1] = hunkFileName;
-        partUri =
-            compiler.options.outputUri.replace(pathSegments: partSegments);
-      }
+        if (outputUri != null) {
+          List<String> partSegments = outputUri.pathSegments.toList();
+          partSegments[partSegments.length - 1] = hunkFileName;
+          partUri =
+              compiler.options.outputUri.replace(pathSegments: partSegments);
+        }
 
-      output.add(SourceMapBuilder.generateSourceMapTag(mapUri, partUri));
-      output.close();
-      SourceMapBuilder.outputSourceMap(output, locationCollector, {}, {},
-          partName, mapUri, partUri, compiler.outputProvider);
+        output.add(SourceMapBuilder.generateSourceMapTag(mapUri, partUri));
+        output.close();
+        SourceMapBuilder.outputSourceMap(output, locationCollector, {}, {},
+            partName, mapUri, partUri, compiler.outputProvider);
+      });
     } else {
       output.close();
     }
@@ -405,11 +418,12 @@
     // data.
     mapping["_comment"] = "This mapping shows which compiled `.js` files are "
         "needed for a given deferred library import.";
-    mapping.addAll(compiler.deferredLoadTask.computeDeferredMap(
+    mapping.addAll(_closedWorld.outputUnitData.computeDeferredMap(
+        compiler.options, _closedWorld.elementEnvironment,
         omittedUnits:
             omittedFragments.map((fragemnt) => fragemnt.outputUnit).toSet()));
     compiler.outputProvider.createOutputSink(
-        compiler.options.deferredMapUri.path, '', OutputType.info)
+        compiler.options.deferredMapUri.path, '', OutputType.deferredMap)
       ..add(const JsonEncoder.withIndent("  ").convert(mapping))
       ..close();
   }
diff --git a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
index f353ebb..fd5ffa3 100644
--- a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
@@ -13,7 +13,7 @@
         RuntimeTypesChecksBuilder,
         RuntimeTypesSubstitutions;
 import '../options.dart';
-import '../universe/world_builder.dart';
+import '../universe/codegen_world_builder.dart';
 
 class TypeTestRegistry {
   final ElementEnvironment _elementEnvironment;
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index a500d9d..1afc338 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -6,12 +6,12 @@
 
 import '../closure.dart';
 import '../common.dart';
-import '../common/tasks.dart';
 import '../constants/expressions.dart';
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/names.dart' show Name;
 import '../elements/types.dart';
+import '../ir/closure.dart';
 import '../ir/element_map.dart';
 import '../ir/util.dart';
 import '../js_model/element_map.dart';
@@ -22,49 +22,8 @@
 import '../ssa/type_builder.dart';
 import '../universe/selector.dart';
 import 'elements.dart';
-import 'closure_visitors.dart';
+import 'js_world_builder.dart' show JsClosedWorldBuilder;
 import 'locals.dart';
-import 'js_strategy.dart' show JsClosedWorldBuilder;
-
-class KernelClosureAnalysis {
-  /// Inspect members and mark if those members capture any state that needs to
-  /// be marked as free variables.
-  static ScopeModel computeScopeModel(MemberEntity entity, ir.Member node) {
-    if (entity.isAbstract) return null;
-    if (entity.isField && !entity.isInstanceMember) {
-      ir.Field field = node;
-      // Skip top-level/static fields without an initializer.
-      if (field.initializer == null) return null;
-    }
-
-    bool hasThisLocal = false;
-    if (entity.isInstanceMember) {
-      hasThisLocal = true;
-    } else if (entity.isConstructor) {
-      ConstructorEntity constructor = entity;
-      hasThisLocal = !constructor.isFactoryConstructor;
-    }
-    ScopeModel model = new ScopeModel();
-    CapturedScopeBuilder translator =
-        new CapturedScopeBuilder(model, hasThisLocal: hasThisLocal);
-    if (entity.isField) {
-      if (node is ir.Field && node.initializer != null) {
-        node.accept(translator);
-      } else {
-        assert(entity.isInstanceMember);
-        model.scopeInfo = new KernelScopeInfo(true);
-      }
-    } else {
-      assert(node is ir.Procedure || node is ir.Constructor);
-      node.accept(translator);
-    }
-    return model;
-  }
-}
-
-class KernelClosureConversionTask extends ClosureConversionTask {
-  KernelClosureConversionTask(Measurer measurer) : super(measurer);
-}
 
 class ClosureDataImpl implements ClosureData {
   /// Tag used for identifying serialized [ClosureData] objects in a
@@ -332,10 +291,10 @@
 
   ClosureData createClosureEntities(
       JsClosedWorldBuilder closedWorldBuilder,
-      Map<MemberEntity, ScopeModel> closureModels,
+      Map<MemberEntity, ClosureScopeModel> closureModels,
       ClosureRtiNeed rtiNeed,
       List<FunctionEntity> callMethods) {
-    closureModels.forEach((MemberEntity member, ScopeModel model) {
+    closureModels.forEach((MemberEntity member, ClosureScopeModel model) {
       KernelToLocalsMap localsMap = _globalLocalsMap.getLocalsMap(member);
       Map<Local, JRecordField> allBoxedVariables =
           _elementMap.makeRecordContainer(model.scopeInfo, member, localsMap);
@@ -445,242 +404,6 @@
   }
 }
 
-enum VariableUseKind {
-  /// An explicit variable use.
-  ///
-  /// For type variable this is an explicit as-cast, an is-test or a type
-  /// literal.
-  explicit,
-
-  /// A type variable used in the type of a local variable.
-  localType,
-
-  /// A type variable used in an implicit cast.
-  implicitCast,
-
-  /// A type variable passed as the type argument of a list literal.
-  listLiteral,
-
-  /// A type variable passed as the type argument of a map literal.
-  mapLiteral,
-
-  /// A type variable passed as a type argument to a constructor.
-  constructorTypeArgument,
-
-  /// A type variable passed as a type argument to a static method.
-  staticTypeArgument,
-
-  /// A type variable passed as a type argument to an instance method.
-  instanceTypeArgument,
-
-  /// A type variable passed as a type argument to a local function.
-  localTypeArgument,
-
-  /// A type variable in a parameter type of a member.
-  memberParameter,
-
-  /// A type variable in a parameter type of a local function.
-  localParameter,
-
-  /// A type variable used in a return type of a member.
-  memberReturnType,
-
-  /// A type variable used in a return type of a local function.
-  localReturnType,
-
-  /// A type variable in a field type.
-  fieldType,
-
-  /// A type argument of an generic instantiation.
-  instantiationTypeArgument,
-}
-
-class VariableUse {
-  final VariableUseKind kind;
-  final ir.Member member;
-  final ir.TreeNode /*ir.FunctionDeclaration|ir.FunctionExpression*/
-      localFunction;
-  final ir.MethodInvocation invocation;
-  final ir.Instantiation instantiation;
-
-  const VariableUse._simple(this.kind)
-      : this.member = null,
-        this.localFunction = null,
-        this.invocation = null,
-        this.instantiation = null;
-
-  VariableUse.memberParameter(this.member)
-      : this.kind = VariableUseKind.memberParameter,
-        this.localFunction = null,
-        this.invocation = null,
-        this.instantiation = null;
-
-  VariableUse.localParameter(this.localFunction)
-      : this.kind = VariableUseKind.localParameter,
-        this.member = null,
-        this.invocation = null,
-        this.instantiation = null {
-    assert(localFunction is ir.FunctionDeclaration ||
-        localFunction is ir.FunctionExpression);
-  }
-
-  VariableUse.memberReturnType(this.member)
-      : this.kind = VariableUseKind.memberReturnType,
-        this.localFunction = null,
-        this.invocation = null,
-        this.instantiation = null;
-
-  VariableUse.localReturnType(this.localFunction)
-      : this.kind = VariableUseKind.localReturnType,
-        this.member = null,
-        this.invocation = null,
-        this.instantiation = null {
-    assert(localFunction is ir.FunctionDeclaration ||
-        localFunction is ir.FunctionExpression);
-  }
-
-  VariableUse.constructorTypeArgument(this.member)
-      : this.kind = VariableUseKind.constructorTypeArgument,
-        this.localFunction = null,
-        this.invocation = null,
-        this.instantiation = null;
-
-  VariableUse.staticTypeArgument(this.member)
-      : this.kind = VariableUseKind.staticTypeArgument,
-        this.localFunction = null,
-        this.invocation = null,
-        this.instantiation = null;
-
-  VariableUse.instanceTypeArgument(this.invocation)
-      : this.kind = VariableUseKind.instanceTypeArgument,
-        this.member = null,
-        this.localFunction = null,
-        this.instantiation = null;
-
-  VariableUse.localTypeArgument(this.localFunction, this.invocation)
-      : this.kind = VariableUseKind.localTypeArgument,
-        this.member = null,
-        this.instantiation = null {
-    assert(localFunction is ir.FunctionDeclaration ||
-        localFunction is ir.FunctionExpression);
-  }
-
-  VariableUse.instantiationTypeArgument(this.instantiation)
-      : this.kind = VariableUseKind.instantiationTypeArgument,
-        this.member = null,
-        this.localFunction = null,
-        this.invocation = null;
-
-  static const VariableUse explicit =
-      const VariableUse._simple(VariableUseKind.explicit);
-
-  static const VariableUse localType =
-      const VariableUse._simple(VariableUseKind.localType);
-
-  static const VariableUse implicitCast =
-      const VariableUse._simple(VariableUseKind.implicitCast);
-
-  static const VariableUse listLiteral =
-      const VariableUse._simple(VariableUseKind.listLiteral);
-
-  static const VariableUse mapLiteral =
-      const VariableUse._simple(VariableUseKind.mapLiteral);
-
-  static const VariableUse fieldType =
-      const VariableUse._simple(VariableUseKind.fieldType);
-
-  int get hashCode =>
-      kind.hashCode * 11 +
-      member.hashCode * 13 +
-      localFunction.hashCode * 17 +
-      invocation.hashCode * 19 +
-      instantiation.hashCode * 23;
-
-  bool operator ==(other) {
-    if (identical(this, other)) return true;
-    if (other is! VariableUse) return false;
-    return kind == other.kind &&
-        member == other.member &&
-        localFunction == other.localFunction &&
-        invocation == other.invocation &&
-        instantiation == other.instantiation;
-  }
-
-  String toString() => 'VariableUse(kind=$kind,member=$member,'
-      'localFunction=$localFunction,invocation=$invocation,'
-      'instantiation=$instantiation)';
-}
-
-class KernelScopeInfo {
-  final Set<ir.VariableDeclaration> localsUsedInTryOrSync;
-  final bool hasThisLocal;
-  final Set<ir.VariableDeclaration> boxedVariables;
-  // If boxedVariables is empty, this will be null, because no variables will
-  // need to be boxed.
-  final NodeBox capturedVariablesAccessor;
-
-  /// The set of variables that were defined in another scope, but are used in
-  /// this scope. The items in this set are either of type VariableDeclaration
-  /// or TypeParameterTypeWithContext.
-  Set<ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ >
-      freeVariables = new Set<ir.Node>();
-
-  /// A set of type parameters that are defined in another scope and are only
-  /// used if runtime type information is checked. If runtime type information
-  /// needs to be retained, all of these type variables will be added ot the
-  /// freeVariables set. Whether these variables are actually used as
-  /// freeVariables will be set by the time this structure is converted to a
-  /// JsScopeInfo, so JsScopeInfo does not need to use them.
-  Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti =
-      <TypeVariableTypeWithContext, Set<VariableUse>>{};
-
-  /// If true, `this` is used as a free variable, in this scope. It is stored
-  /// separately from [freeVariables] because there is no single
-  /// `VariableDeclaration` node that represents `this`.
-  bool thisUsedAsFreeVariable = false;
-
-  /// If true, `this` is used as a free variable, in this scope if we are also
-  /// performing runtime type checks. It is stored
-  /// separately from [thisUsedAsFreeVariable] because we don't know at this
-  /// stage if we will be needing type checks for this scope.
-  Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti = new Set<VariableUse>();
-
-  KernelScopeInfo(this.hasThisLocal)
-      : localsUsedInTryOrSync = new Set<ir.VariableDeclaration>(),
-        boxedVariables = new Set<ir.VariableDeclaration>(),
-        capturedVariablesAccessor = null;
-
-  KernelScopeInfo.from(this.hasThisLocal, KernelScopeInfo info)
-      : localsUsedInTryOrSync = info.localsUsedInTryOrSync,
-        boxedVariables = info.boxedVariables,
-        capturedVariablesAccessor = null;
-
-  KernelScopeInfo.withBoxedVariables(
-      this.boxedVariables,
-      this.capturedVariablesAccessor,
-      this.localsUsedInTryOrSync,
-      this.freeVariables,
-      this.freeVariablesForRti,
-      this.thisUsedAsFreeVariable,
-      this.thisUsedAsFreeVariableIfNeedsRti,
-      this.hasThisLocal);
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write('KernelScopeInfo(this=$hasThisLocal,');
-    sb.write('freeVriables=$freeVariables,');
-    sb.write('localsUsedInTryOrSync={${localsUsedInTryOrSync.join(', ')}}');
-    String comma = '';
-    sb.write('freeVariablesForRti={');
-    freeVariablesForRti.forEach((key, value) {
-      sb.write('$comma$key:$value');
-      comma = ',';
-    });
-    sb.write('})');
-    return sb.toString();
-  }
-}
-
 /// Helper method to get or create a Local variable out of a variable
 /// declaration or type parameter.
 Local _getLocal(
@@ -744,7 +467,7 @@
     return sb.toString();
   }
 
-  bool isBoxed(Local variable) => boxedVariables.containsKey(variable);
+  bool isBoxedVariable(Local variable) => boxedVariables.containsKey(variable);
 
   factory JsScopeInfo.readFromDataSource(DataSource source) {
     source.begin(tag);
@@ -770,47 +493,6 @@
   }
 }
 
-class KernelCapturedScope extends KernelScopeInfo {
-  KernelCapturedScope(
-      Set<ir.VariableDeclaration> boxedVariables,
-      NodeBox capturedVariablesAccessor,
-      Set<ir.VariableDeclaration> localsUsedInTryOrSync,
-      Set<ir.Node /* VariableDeclaration | TypeVariableTypeWithContext */ >
-          freeVariables,
-      Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti,
-      bool thisUsedAsFreeVariable,
-      Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti,
-      bool hasThisLocal)
-      : super.withBoxedVariables(
-            boxedVariables,
-            capturedVariablesAccessor,
-            localsUsedInTryOrSync,
-            freeVariables,
-            freeVariablesForRti,
-            thisUsedAsFreeVariable,
-            thisUsedAsFreeVariableIfNeedsRti,
-            hasThisLocal);
-
-  // Loops through the free variables of an existing KernelCapturedScope and
-  // creates a new KernelCapturedScope that only captures type variables.
-  KernelCapturedScope.forSignature(KernelCapturedScope scope)
-      : this(
-            _empty,
-            null,
-            _empty,
-            scope.freeVariables.where(
-                (ir.Node variable) => variable is TypeVariableTypeWithContext),
-            scope.freeVariablesForRti,
-            scope.thisUsedAsFreeVariable,
-            scope.thisUsedAsFreeVariableIfNeedsRti,
-            scope.hasThisLocal);
-
-  // Silly hack because we don't have const sets.
-  static final Set<ir.VariableDeclaration> _empty = new Set();
-
-  bool get requiresContextBox => boxedVariables.isNotEmpty;
-}
-
 class JsCapturedScope extends JsScopeInfo implements CapturedScope {
   /// Tag used for identifying serialized [JsCapturedScope] objects in a
   /// debugging data stream.
@@ -864,33 +546,6 @@
   }
 }
 
-class KernelCapturedLoopScope extends KernelCapturedScope {
-  final List<ir.VariableDeclaration> boxedLoopVariables;
-
-  KernelCapturedLoopScope(
-      Set<ir.VariableDeclaration> boxedVariables,
-      NodeBox capturedVariablesAccessor,
-      this.boxedLoopVariables,
-      Set<ir.VariableDeclaration> localsUsedInTryOrSync,
-      Set<ir.Node /* VariableDeclaration | TypeVariableTypeWithContext */ >
-          freeVariables,
-      Map<TypeVariableTypeWithContext, Set<VariableUse>> freeVariablesForRti,
-      bool thisUsedAsFreeVariable,
-      Set<VariableUse> thisUsedAsFreeVariableIfNeedsRti,
-      bool hasThisLocal)
-      : super(
-            boxedVariables,
-            capturedVariablesAccessor,
-            localsUsedInTryOrSync,
-            freeVariables,
-            freeVariablesForRti,
-            thisUsedAsFreeVariable,
-            thisUsedAsFreeVariableIfNeedsRti,
-            hasThisLocal);
-
-  bool get hasBoxedLoopVariables => boxedLoopVariables.isNotEmpty;
-}
-
 class JsCapturedLoopScope extends JsCapturedScope implements CapturedLoopScope {
   /// Tag used for identifying serialized [JsCapturedLoopScope] objects in a
   /// debugging data stream.
@@ -1045,31 +700,14 @@
 
   FieldEntity get thisFieldEntity => localToFieldMap[thisLocal];
 
-  @override
-  void forEachBoxedVariable(f(Local local, JField field)) {
-    boxedVariables.forEach(f);
-  }
-
   void forEachFreeVariable(f(Local variable, JField field)) {
     localToFieldMap.forEach(f);
     boxedVariables.forEach(f);
   }
 
-  bool isVariableBoxed(Local variable) =>
-      boxedVariables.keys.contains(variable);
-
   bool get isClosure => true;
 }
 
-/// A local variable to disambiguate between a variable that has been captured
-/// from one scope to another. This is the ir.Node version that corresponds to
-/// [BoxLocal].
-class NodeBox {
-  final String name;
-  final ir.TreeNode executableContext;
-  NodeBox(this.name, this.executableContext);
-}
-
 class JClosureClass extends JClass {
   /// Tag used for identifying serialized [JClosureClass] objects in a
   /// debugging data stream.
@@ -1382,6 +1020,11 @@
 
   ClosureMemberData(this.definition, this.memberThisType);
 
+  Map<ir.Expression, ir.DartType> get staticTypes {
+    // The cached types are stored in the data for enclosing member.
+    throw new UnsupportedError("ClosureMemberData.staticTypes");
+  }
+
   @override
   InterfaceType getMemberThisType(JsToElementMap elementMap) {
     return memberThisType;
@@ -1615,101 +1258,6 @@
       'RecordContainerDefinition(kind:$kind,location:$location)';
 }
 
-/// Collection of scope data collected for a single member.
-class ScopeModel {
-  /// Collection [ScopeInfo] data for the member.
-  KernelScopeInfo scopeInfo;
-
-  /// Collected [CapturedScope] data for nodes.
-  Map<ir.Node, KernelCapturedScope> capturedScopesMap =
-      <ir.Node, KernelCapturedScope>{};
-
-  /// Collected [ScopeInfo] data for nodes.
-  Map<ir.TreeNode, KernelScopeInfo> closuresToGenerate =
-      <ir.TreeNode, KernelScopeInfo>{};
-
-  String toString() {
-    return '$scopeInfo\n$capturedScopesMap\n$closuresToGenerate';
-  }
-}
-
-enum TypeVariableKind { cls, method, local, function }
-
-/// A fake ir.Node that holds the TypeParameterType as well as the context in
-/// which it occurs.
-class TypeVariableTypeWithContext implements ir.Node {
-  final ir.Node context;
-  final ir.TypeParameterType type;
-  final TypeVariableKind kind;
-  final ir.TreeNode typeDeclaration;
-
-  /// [context] can be either an ir.Member or a ir.FunctionDeclaration or
-  /// ir.FunctionExpression.
-  factory TypeVariableTypeWithContext(
-      ir.TypeParameterType type, ir.TreeNode context) {
-    TypeVariableKind kind;
-    ir.TreeNode typeDeclaration = type.parameter.parent;
-    if (typeDeclaration == null) {
-      // We have a function type variable, like `T` in `void Function<T>(int)`.
-      kind = TypeVariableKind.function;
-    } else if (typeDeclaration is ir.Class) {
-      // We have a class type variable, like `T` in `class Class<T> { ... }`.
-      kind = TypeVariableKind.cls;
-    } else if (typeDeclaration.parent is ir.Member) {
-      ir.Member member = typeDeclaration.parent;
-      if (member is ir.Constructor ||
-          (member is ir.Procedure && member.isFactory)) {
-        // We have a synthesized generic method type variable for a class type
-        // variable.
-        // TODO(johnniwinther): Handle constructor/factory type variables as
-        // method type variables.
-        kind = TypeVariableKind.cls;
-        typeDeclaration = member.enclosingClass;
-      } else {
-        // We have a generic method type variable, like `T` in
-        // `m<T>() { ... }`.
-        kind = TypeVariableKind.method;
-        typeDeclaration = typeDeclaration.parent;
-        context = typeDeclaration;
-      }
-    } else {
-      // We have a generic local function type variable, like `T` in
-      // `m() { local<T>() { ... } ... }`.
-      assert(
-          typeDeclaration.parent is ir.FunctionExpression ||
-              typeDeclaration.parent is ir.FunctionDeclaration,
-          "Unexpected type declaration: $typeDeclaration");
-      kind = TypeVariableKind.local;
-      typeDeclaration = typeDeclaration.parent;
-      context = typeDeclaration;
-    }
-    return new TypeVariableTypeWithContext.internal(
-        type, context, kind, typeDeclaration);
-  }
-
-  TypeVariableTypeWithContext.internal(
-      this.type, this.context, this.kind, this.typeDeclaration);
-
-  accept(ir.Visitor v) {
-    throw new UnsupportedError('TypeVariableTypeWithContext.accept');
-  }
-
-  visitChildren(ir.Visitor v) {
-    throw new UnsupportedError('TypeVariableTypeWithContext.visitChildren');
-  }
-
-  int get hashCode => type.hashCode;
-
-  bool operator ==(other) {
-    if (other is! TypeVariableTypeWithContext) return false;
-    return type == other.type && context == other.context;
-  }
-
-  String toString() =>
-      'TypeVariableTypeWithContext(type=$type,context=$context,'
-      'kind=$kind,typeDeclaration=$typeDeclaration)';
-}
-
 abstract class ClosureRtiNeed {
   bool classNeedsTypeArguments(ClassEntity cls);
 
diff --git a/pkg/compiler/lib/src/js_model/closure_visitors.dart b/pkg/compiler/lib/src/js_model/closure_visitors.dart
deleted file mode 100644
index 7987280..0000000
--- a/pkg/compiler/lib/src/js_model/closure_visitors.dart
+++ /dev/null
@@ -1,677 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/ast.dart' as ir;
-
-import '../closure.dart';
-import 'closure.dart';
-
-/// This builder walks the code to determine what variables are captured/free at
-/// various points to build CapturedScope that can respond to queries
-/// about how a particular variable is being used at any point in the code.
-class CapturedScopeBuilder extends ir.Visitor {
-  ScopeModel _model;
-
-  /// A map of each visited call node with the associated information about what
-  /// variables are captured/used. Each ir.Node key corresponds to a scope that
-  /// was encountered while visiting a closure (initially called through
-  /// [translateLazyInitializer] or [translateConstructorOrProcedure]).
-  Map<ir.Node, KernelCapturedScope> get _scopesCapturedInClosureMap =>
-      _model.capturedScopesMap;
-
-  /// A map of the nodes that we have flagged as necessary to generate closure
-  /// classes for in a later stage. We map that node to information ascertained
-  /// about variable usage in the surrounding scope.
-  Map<ir.TreeNode, KernelScopeInfo> get _closuresToGenerate =>
-      _model.closuresToGenerate;
-
-  /// The local variables that have been declared in the current scope.
-  List<ir.Node /* ir.VariableDeclaration | TypeParameterTypeWithContext */ >
-      _scopeVariables;
-
-  /// Pointer to the context in which this closure is executed.
-  /// For example, in the expression `var foo = () => 3 + i;`, the executable
-  /// context as we walk the nodes in that expression is the ir.Field `foo`.
-  ir.TreeNode _executableContext;
-
-  /// A flag to indicate if we are currently inside a closure.
-  bool _isInsideClosure = false;
-
-  /// Pointer to the original node where this closure builder started.
-  ir.Node _outermostNode;
-
-  /// Keep track of the mutated local variables so that we don't need to box
-  /// non-mutated variables. We know these are only VariableDeclarations because
-  /// type variable types and `this` types can't be mutated!
-  Set<ir.VariableDeclaration> _mutatedVariables =
-      new Set<ir.VariableDeclaration>();
-
-  /// The set of variables that are accessed in some form, whether they are
-  /// mutated or not.
-  Set<ir.Node /* ir.VariableDeclaration | TypeParameterTypeWithContext */ >
-      _capturedVariables = new Set<ir.Node>();
-
-  /// If true, the visitor is currently traversing some nodes that are inside a
-  /// try block.
-  bool _inTry = false;
-
-  /// The current scope we are in.
-  KernelScopeInfo _currentScopeInfo;
-
-  final bool _hasThisLocal;
-
-  /// Keeps track of the number of boxes that we've created so that they each
-  /// have unique names.
-  int _boxCounter = 0;
-
-  /// The current usage of a type annotation.
-  ///
-  /// This is updated in the visitor to distinguish between unconditional
-  /// type variable usage, such as type literals and is tests, and conditional
-  /// type variable usage, such as type argument in method invocations.
-  VariableUse _currentTypeUsage;
-
-  CapturedScopeBuilder(this._model, {bool hasThisLocal})
-      : this._hasThisLocal = hasThisLocal;
-
-  /// Update the [CapturedScope] object corresponding to
-  /// this node if any variables are captured.
-  void attachCapturedScopeVariables(ir.TreeNode node) {
-    Set<ir.VariableDeclaration> capturedVariablesForScope =
-        new Set<ir.VariableDeclaration>();
-
-    for (ir.Node variable in _scopeVariables) {
-      // No need to box non-assignable elements.
-      if (variable is ir.VariableDeclaration) {
-        if (variable.isFinal || variable.isConst) continue;
-        if (!_mutatedVariables.contains(variable)) continue;
-        if (_capturedVariables.contains(variable)) {
-          capturedVariablesForScope.add(variable);
-        }
-      }
-    }
-    if (!capturedVariablesForScope.isEmpty) {
-      assert(_model.scopeInfo != null);
-      KernelScopeInfo from = _model.scopeInfo;
-
-      KernelCapturedScope capturedScope;
-      var nodeBox = new NodeBox(getBoxName(), _executableContext);
-      if (node is ir.ForStatement ||
-          node is ir.ForInStatement ||
-          node is ir.WhileStatement ||
-          node is ir.DoStatement) {
-        capturedScope = new KernelCapturedLoopScope(
-            capturedVariablesForScope,
-            nodeBox,
-            [],
-            from.localsUsedInTryOrSync,
-            from.freeVariables,
-            from.freeVariablesForRti,
-            from.thisUsedAsFreeVariable,
-            from.thisUsedAsFreeVariableIfNeedsRti,
-            _hasThisLocal);
-      } else {
-        capturedScope = new KernelCapturedScope(
-            capturedVariablesForScope,
-            nodeBox,
-            from.localsUsedInTryOrSync,
-            from.freeVariables,
-            from.freeVariablesForRti,
-            from.thisUsedAsFreeVariable,
-            from.thisUsedAsFreeVariableIfNeedsRti,
-            _hasThisLocal);
-      }
-      _model.scopeInfo = _scopesCapturedInClosureMap[node] = capturedScope;
-    }
-  }
-
-  /// Generate a unique name for the [_boxCounter]th box field.
-  ///
-  /// The result is used as the name of [NodeBox]s and [BoxLocal]s, and must
-  /// therefore be unique to avoid breaking an invariant in the element model
-  /// (classes cannot declare multiple fields with the same name).
-  ///
-  /// Also, the names should be distinct from real field names to prevent
-  /// clashes with selectors for those fields.
-  ///
-  /// These names are not used in generated code, just as element name.
-  String getBoxName() {
-    return "_box_${_boxCounter++}";
-  }
-
-  /// Perform book-keeping with the current set of local variables that have
-  /// been seen thus far before entering this new scope.
-  void enterNewScope(ir.Node node, void visitNewScope()) {
-    List<ir.Node> oldScopeVariables = _scopeVariables;
-    _scopeVariables = <ir.Node>[];
-    visitNewScope();
-    attachCapturedScopeVariables(node);
-    _mutatedVariables.removeAll(_scopeVariables);
-    _scopeVariables = oldScopeVariables;
-  }
-
-  @override
-  void defaultNode(ir.Node node) {
-    node.visitChildren(this);
-  }
-
-  @override
-  visitTryCatch(ir.TryCatch node) {
-    bool oldInTry = _inTry;
-    _inTry = true;
-    node.visitChildren(this);
-    _inTry = oldInTry;
-  }
-
-  @override
-  visitTryFinally(ir.TryFinally node) {
-    bool oldInTry = _inTry;
-    _inTry = true;
-    node.visitChildren(this);
-    _inTry = oldInTry;
-  }
-
-  @override
-  visitVariableGet(ir.VariableGet node) {
-    _markVariableAsUsed(node.variable, VariableUse.explicit);
-    // Don't visit `node.promotedType`.
-  }
-
-  @override
-  visitVariableSet(ir.VariableSet node) {
-    _mutatedVariables.add(node.variable);
-    _markVariableAsUsed(node.variable, VariableUse.explicit);
-    visitInContext(node.variable.type, VariableUse.localType);
-    node.visitChildren(this);
-  }
-
-  void handleVariableDeclaration(
-      ir.VariableDeclaration node, VariableUse usage) {
-    if (!node.isFieldFormal) {
-      _scopeVariables.add(node);
-    }
-
-    visitInContext(node.type, usage);
-    node.initializer?.accept(this);
-  }
-
-  @override
-  visitVariableDeclaration(ir.VariableDeclaration node) {
-    handleVariableDeclaration(node, VariableUse.localType);
-  }
-
-  /// Add this variable to the set of free variables if appropriate and add to
-  /// the tally of variables used in try or sync blocks.
-  /// If [onlyForRtiChecks] is true, add to the freeVariablesForRti set instead
-  /// of freeVariables as we will only use it if runtime type information is
-  /// checked.
-  void _markVariableAsUsed(
-      ir.Node /* VariableDeclaration | TypeParameterTypeWithContext */ variable,
-      VariableUse usage) {
-    assert(variable is ir.VariableDeclaration ||
-        variable is TypeVariableTypeWithContext);
-    assert(usage != null);
-    if (_isInsideClosure && !_inCurrentContext(variable)) {
-      // If the element is not declared in the current function and the element
-      // is not the closure itself we need to mark the element as free variable.
-      // Note that the check on [insideClosure] is not just an
-      // optimization: factories have type parameters as function
-      // parameters, and type parameters are declared in the class, not
-      // the factory.
-      if (usage == VariableUse.explicit) {
-        _currentScopeInfo.freeVariables.add(variable);
-      } else {
-        _currentScopeInfo.freeVariablesForRti
-            .putIfAbsent(variable, () => new Set<VariableUse>())
-            .add(usage);
-      }
-    }
-    if (_inTry && variable is ir.VariableDeclaration) {
-      _currentScopeInfo.localsUsedInTryOrSync.add(variable);
-    }
-  }
-
-  @override
-  void visitThisExpression(ir.ThisExpression thisExpression) {
-    if (_hasThisLocal) _registerNeedsThis(VariableUse.explicit);
-  }
-
-  @override
-  void visitTypeParameter(ir.TypeParameter typeParameter) {
-    ir.TreeNode context = _executableContext;
-    TypeVariableTypeWithContext typeVariable = new TypeVariableTypeWithContext(
-        new ir.TypeParameterType(typeParameter),
-        // If this typeParameter is part of a typedef then its parent is
-        // null because it has no context. Just pass in null for the
-        // context in that case.
-        typeParameter.parent != null ? typeParameter.parent.parent : null);
-    if (_isInsideClosure && context is ir.Procedure && context.isFactory) {
-      // This is a closure in a factory constructor.  Since there is no
-      // [:this:], we have to mark the type arguments as free variables to
-      // capture them in the closure.
-      _useTypeVariableAsLocal(typeVariable, _currentTypeUsage);
-    }
-
-    if (_executableContext is ir.Member && _executableContext is! ir.Field) {
-      // In checked mode, using a type variable in a type annotation may lead
-      // to a runtime type check that needs to access the type argument and
-      // therefore the closure needs a this-element, if it is not in a field
-      // initializer; field initializers are evaluated in a context where
-      // the type arguments are available in locals.
-
-      if (_hasThisLocal) {
-        _registerNeedsThis(_currentTypeUsage);
-      } else {
-        _useTypeVariableAsLocal(typeVariable, _currentTypeUsage);
-      }
-    }
-  }
-
-  /// Add `this` as a variable that needs to be accessed (and thus may become a
-  /// free/captured variable.
-  /// If [onlyIfNeedsRti] is true, set thisUsedAsFreeVariableIfNeedsRti to true
-  /// instead of thisUsedAsFreeVariable as we will only use `this` if runtime
-  /// type information is checked.
-  void _registerNeedsThis(VariableUse usage) {
-    if (_isInsideClosure) {
-      if (usage == VariableUse.explicit) {
-        _currentScopeInfo.thisUsedAsFreeVariable = true;
-      } else {
-        _currentScopeInfo.thisUsedAsFreeVariableIfNeedsRti.add(usage);
-      }
-    }
-  }
-
-  @override
-  void visitForInStatement(ir.ForInStatement node) {
-    // We need to set `inTry` to true if this is an async for-in because we
-    // desugar it into a try-finally in the SSA phase.
-    bool oldInTry = _inTry;
-    if (node.isAsync) {
-      _inTry = true;
-    }
-    enterNewScope(node, () {
-      node.visitChildren(this);
-    });
-    if (node.isAsync) {
-      _inTry = oldInTry;
-    }
-  }
-
-  void visitWhileStatement(ir.WhileStatement node) {
-    enterNewScope(node, () {
-      node.visitChildren(this);
-    });
-  }
-
-  void visitDoStatement(ir.DoStatement node) {
-    enterNewScope(node, () {
-      node.visitChildren(this);
-    });
-  }
-
-  @override
-  void visitForStatement(ir.ForStatement node) {
-    List<ir.VariableDeclaration> boxedLoopVariables =
-        <ir.VariableDeclaration>[];
-    enterNewScope(node, () {
-      // First visit initialized variables and update steps so we can easily
-      // check if a loop variable was captured in one of these subexpressions.
-      node.variables
-          .forEach((ir.VariableDeclaration variable) => variable.accept(this));
-      node.updates
-          .forEach((ir.Expression expression) => expression.accept(this));
-
-      // Loop variables that have not been captured yet can safely be flagged as
-      // non-mutated, because no nested function can observe the mutation.
-      for (ir.VariableDeclaration variable in node.variables) {
-        if (!_capturedVariables.contains(variable)) {
-          _mutatedVariables.remove(variable);
-        }
-      }
-
-      // Visit condition and body.
-      // This must happen after the above, so any loop variables mutated in the
-      // condition or body are indeed flagged as mutated.
-      if (node.condition != null) node.condition.accept(this);
-      node.body.accept(this);
-
-      // See if we have declared loop variables that need to be boxed.
-      for (ir.VariableDeclaration variable in node.variables) {
-        // Non-mutated variables should not be boxed.  The _mutatedVariables set
-        // gets cleared when `enterNewScope` returns, so check it here.
-        if (_capturedVariables.contains(variable) &&
-            _mutatedVariables.contains(variable)) {
-          boxedLoopVariables.add(variable);
-        }
-      }
-    });
-    KernelCapturedScope scope = _scopesCapturedInClosureMap[node];
-    if (scope == null) return;
-    _scopesCapturedInClosureMap[node] = new KernelCapturedLoopScope(
-        scope.boxedVariables,
-        scope.capturedVariablesAccessor,
-        boxedLoopVariables,
-        scope.localsUsedInTryOrSync,
-        scope.freeVariables,
-        scope.freeVariablesForRti,
-        scope.thisUsedAsFreeVariable,
-        scope.thisUsedAsFreeVariableIfNeedsRti,
-        scope.hasThisLocal);
-  }
-
-  void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
-    if (_hasThisLocal) {
-      _registerNeedsThis(VariableUse.explicit);
-    }
-    if (node.arguments.types.isNotEmpty) {
-      visitListInContext(node.arguments.types,
-          new VariableUse.staticTypeArgument(node.interfaceTarget));
-    }
-    ir.visitList(node.arguments.positional, this);
-    ir.visitList(node.arguments.named, this);
-  }
-
-  void visitSuperPropertySet(ir.SuperPropertySet node) {
-    if (_hasThisLocal) {
-      _registerNeedsThis(VariableUse.explicit);
-    }
-    node.visitChildren(this);
-  }
-
-  void visitSuperPropertyGet(ir.SuperPropertyGet node) {
-    if (_hasThisLocal) {
-      _registerNeedsThis(VariableUse.explicit);
-    }
-    node.visitChildren(this);
-  }
-
-  void visitInvokable(ir.TreeNode node) {
-    assert(node is ir.Member ||
-        node is ir.FunctionExpression ||
-        node is ir.FunctionDeclaration);
-    bool oldIsInsideClosure = _isInsideClosure;
-    ir.TreeNode oldExecutableContext = _executableContext;
-    KernelScopeInfo oldScopeInfo = _currentScopeInfo;
-
-    // _outermostNode is only null the first time we enter the body of the
-    // field, constructor, or method that is being analyzed.
-    _isInsideClosure = _outermostNode != null;
-    _executableContext = node;
-
-    _currentScopeInfo = new KernelScopeInfo(_hasThisLocal);
-
-    if (_isInsideClosure) {
-      _closuresToGenerate[node] = _currentScopeInfo;
-    } else {
-      _outermostNode = node;
-      _model.scopeInfo = _currentScopeInfo;
-    }
-
-    enterNewScope(node, () {
-      node.visitChildren(this);
-    });
-
-    KernelScopeInfo savedScopeInfo = _currentScopeInfo;
-    bool savedIsInsideClosure = _isInsideClosure;
-
-    // Restore old values.
-    _isInsideClosure = oldIsInsideClosure;
-    _currentScopeInfo = oldScopeInfo;
-    _executableContext = oldExecutableContext;
-
-    // Mark all free variables as captured and expect to encounter them in the
-    // outer function.
-    Iterable<ir.Node> freeVariables = savedScopeInfo.freeVariables;
-    assert(freeVariables.isEmpty || savedIsInsideClosure);
-    for (ir.Node freeVariable in freeVariables) {
-      _capturedVariables.add(freeVariable);
-      _markVariableAsUsed(freeVariable, VariableUse.explicit);
-    }
-    savedScopeInfo.freeVariablesForRti.forEach(
-        (TypeVariableTypeWithContext freeVariableForRti,
-            Set<VariableUse> useSet) {
-      for (VariableUse usage in useSet) {
-        _markVariableAsUsed(freeVariableForRti, usage);
-      }
-    });
-    if (_isInsideClosure && savedScopeInfo.thisUsedAsFreeVariable) {
-      _currentScopeInfo.thisUsedAsFreeVariable = true;
-    }
-    if (_isInsideClosure) {
-      _currentScopeInfo.thisUsedAsFreeVariableIfNeedsRti
-          .addAll(savedScopeInfo.thisUsedAsFreeVariableIfNeedsRti);
-    }
-  }
-
-  /// Return true if [variable]'s context is the same as the current executable
-  /// context.
-  bool _inCurrentContext(ir.Node variable) {
-    assert(variable is ir.VariableDeclaration ||
-        variable is TypeVariableTypeWithContext);
-    if (variable is TypeVariableTypeWithContext) {
-      return variable.context == _executableContext;
-    }
-    ir.TreeNode node = variable;
-    while (node != _outermostNode && node != _executableContext) {
-      node = node.parent;
-    }
-    return node == _executableContext;
-  }
-
-  @override
-  void visitField(ir.Field field) {
-    _currentTypeUsage = VariableUse.fieldType;
-    visitInvokable(field);
-    _currentTypeUsage = null;
-  }
-
-  @override
-  void visitConstructor(ir.Constructor constructor) {
-    visitInvokable(constructor);
-  }
-
-  @override
-  void visitProcedure(ir.Procedure procedure) {
-    visitInvokable(procedure);
-  }
-
-  @override
-  void visitFunctionExpression(ir.FunctionExpression functionExpression) {
-    visitInvokable(functionExpression);
-  }
-
-  @override
-  void visitFunctionDeclaration(ir.FunctionDeclaration functionDeclaration) {
-    visitInvokable(functionDeclaration);
-  }
-
-  @override
-  visitTypeParameterType(ir.TypeParameterType type) {
-    _analyzeTypeVariable(type, _currentTypeUsage);
-  }
-
-  visitInContext(ir.Node node, VariableUse use) {
-    VariableUse oldCurrentTypeUsage = _currentTypeUsage;
-    _currentTypeUsage = use;
-    node?.accept(this);
-    _currentTypeUsage = oldCurrentTypeUsage;
-  }
-
-  visitListInContext(List<ir.Node> nodes, VariableUse use) {
-    VariableUse oldCurrentTypeUsage = _currentTypeUsage;
-    _currentTypeUsage = use;
-    ir.visitList(nodes, this);
-    _currentTypeUsage = oldCurrentTypeUsage;
-  }
-
-  visitChildrenInContext(ir.Node node, VariableUse use) {
-    VariableUse oldCurrentTypeUsage = _currentTypeUsage;
-    _currentTypeUsage = use;
-    node.visitChildren(this);
-    _currentTypeUsage = oldCurrentTypeUsage;
-  }
-
-  @override
-  visitTypeLiteral(ir.TypeLiteral node) {
-    visitChildrenInContext(node, VariableUse.explicit);
-  }
-
-  @override
-  visitIsExpression(ir.IsExpression node) {
-    node.operand.accept(this);
-    visitInContext(node.type, VariableUse.explicit);
-  }
-
-  @override
-  visitAsExpression(ir.AsExpression node) {
-    node.operand.accept(this);
-    visitInContext(node.type,
-        node.isTypeError ? VariableUse.implicitCast : VariableUse.explicit);
-  }
-
-  @override
-  visitFunctionNode(ir.FunctionNode node) {
-    VariableUse parameterUsage = node.parent is ir.Member
-        ? new VariableUse.memberParameter(node.parent)
-        : new VariableUse.localParameter(node.parent);
-    visitListInContext(node.typeParameters, parameterUsage);
-    for (ir.VariableDeclaration declaration in node.positionalParameters) {
-      handleVariableDeclaration(declaration, parameterUsage);
-    }
-    for (ir.VariableDeclaration declaration in node.namedParameters) {
-      handleVariableDeclaration(declaration, parameterUsage);
-    }
-    visitInContext(
-        node.returnType,
-        node.parent is ir.Member
-            ? new VariableUse.memberReturnType(node.parent)
-            : new VariableUse.localReturnType(node.parent));
-    node.body?.accept(this);
-  }
-
-  @override
-  visitListLiteral(ir.ListLiteral node) {
-    visitInContext(node.typeArgument, VariableUse.listLiteral);
-    ir.visitList(node.expressions, this);
-  }
-
-  @override
-  visitMapLiteral(ir.MapLiteral node) {
-    visitInContext(node.keyType, VariableUse.mapLiteral);
-    visitInContext(node.valueType, VariableUse.mapLiteral);
-    ir.visitList(node.entries, this);
-  }
-
-  @override
-  visitStaticInvocation(ir.StaticInvocation node) {
-    if (node.arguments.types.isNotEmpty) {
-      VariableUse usage;
-      if (node.target.kind == ir.ProcedureKind.Factory) {
-        usage = new VariableUse.constructorTypeArgument(node.target);
-      } else {
-        usage = new VariableUse.staticTypeArgument(node.target);
-      }
-
-      visitListInContext(node.arguments.types, usage);
-    }
-    ir.visitList(node.arguments.positional, this);
-    ir.visitList(node.arguments.named, this);
-  }
-
-  @override
-  visitConstructorInvocation(ir.ConstructorInvocation node) {
-    if (node.arguments.types.isNotEmpty) {
-      visitListInContext(node.arguments.types,
-          new VariableUse.constructorTypeArgument(node.target));
-    }
-    ir.visitList(node.arguments.positional, this);
-    ir.visitList(node.arguments.named, this);
-  }
-
-  @override
-  visitConditionalExpression(ir.ConditionalExpression node) {
-    node.condition.accept(this);
-    node.then.accept(this);
-    node.otherwise.accept(this);
-    // Don't visit `node.staticType`.
-  }
-
-  @override
-  visitMethodInvocation(ir.MethodInvocation node) {
-    ir.TreeNode receiver = node.receiver;
-    receiver.accept(this);
-    if (node.arguments.types.isNotEmpty) {
-      VariableUse usage;
-      if (receiver is ir.VariableGet &&
-          (receiver.variable.parent is ir.FunctionDeclaration ||
-              receiver.variable.parent is ir.FunctionExpression)) {
-        usage =
-            new VariableUse.localTypeArgument(receiver.variable.parent, node);
-      } else {
-        usage = new VariableUse.instanceTypeArgument(node);
-      }
-      visitListInContext(node.arguments.types, usage);
-    }
-    ir.visitList(node.arguments.positional, this);
-    ir.visitList(node.arguments.named, this);
-  }
-
-  @override
-  visitCatch(ir.Catch node) {
-    visitInContext(node.guard, VariableUse.explicit);
-    node.exception?.accept(this);
-    node.stackTrace?.accept(this);
-    node.body.accept(this);
-  }
-
-  @override
-  visitInstantiation(ir.Instantiation node) {
-    visitChildrenInContext(
-        node, new VariableUse.instantiationTypeArgument(node));
-  }
-
-  /// Returns true if the node is a field, or a constructor (factory or
-  /// generative).
-  bool _isFieldOrConstructor(ir.Node node) =>
-      node is ir.Constructor ||
-      node is ir.Field ||
-      (node is ir.Procedure && node.isFactory);
-
-  void _analyzeTypeVariable(ir.TypeParameterType type, VariableUse usage) {
-    assert(usage != null);
-    if (_outermostNode is ir.Member) {
-      TypeVariableTypeWithContext typeVariable =
-          new TypeVariableTypeWithContext(type, _outermostNode);
-      switch (typeVariable.kind) {
-        case TypeVariableKind.cls:
-          if (_isFieldOrConstructor(_outermostNode)) {
-            // Class type variable used in a field or constructor.
-            _useTypeVariableAsLocal(typeVariable, usage);
-          } else {
-            // Class type variable used in a method.
-            _registerNeedsThis(usage);
-          }
-          break;
-        case TypeVariableKind.method:
-        case TypeVariableKind.local:
-          _useTypeVariableAsLocal(typeVariable, usage);
-          break;
-        case TypeVariableKind.function:
-        // The type variable is a function type variable, like `T` in
-        //
-        //     List<void Function<T>(T)> list;
-        //
-        // which doesn't correspond to a captured local variable.
-      }
-    }
-  }
-
-  /// If [onlyForRtiChecks] is true, the variable will be added to a list
-  /// indicating it *may* be used only if runtime type information is checked.
-  void _useTypeVariableAsLocal(
-      TypeVariableTypeWithContext typeVariable, VariableUse usage) {
-    _markVariableAsUsed(typeVariable, usage);
-  }
-}
diff --git a/pkg/compiler/lib/src/js_model/element_map.dart b/pkg/compiler/lib/src/js_model/element_map.dart
index 22a306b..f0b0efd 100644
--- a/pkg/compiler/lib/src/js_model/element_map.dart
+++ b/pkg/compiler/lib/src/js_model/element_map.dart
@@ -11,16 +11,18 @@
 import '../elements/jumps.dart';
 import '../elements/names.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../ir/closure.dart';
+import '../ir/static_type_provider.dart';
 import '../ir/util.dart';
 import '../js/js.dart' as js;
 import '../js_backend/namer.dart';
 import '../js_emitter/code_emitter_task.dart';
-import '../js_model/closure.dart' show JRecordField, KernelScopeInfo;
+import '../js_model/closure.dart' show JRecordField;
 import '../js_model/elements.dart' show JGeneratorBody;
-import '../native/native.dart' as native;
+import '../native/behavior.dart';
 import '../serialization/serialization.dart';
 import '../ssa/type_builder.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/call_structure.dart';
 import '../universe/selector.dart';
 import '../world.dart';
@@ -91,16 +93,15 @@
   Name getName(ir.Name name);
 
   /// Computes the [native.NativeBehavior] for a call to the [JS] function.
-  native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
+  NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
 
   /// Computes the [native.NativeBehavior] for a call to the [JS_BUILTIN]
   /// function.
-  native.NativeBehavior getNativeBehaviorForJsBuiltinCall(
-      ir.StaticInvocation node);
+  NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node);
 
   /// Computes the [native.NativeBehavior] for a call to the
   /// [JS_EMBEDDED_GLOBAL] function.
-  native.NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
+  NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
       ir.StaticInvocation node);
 
   /// Returns the [js.Name] for the `JsGetName` [constant] value.
@@ -118,10 +119,6 @@
   /// Returns the definition information for [cls].
   ClassDefinition getClassDefinition(covariant ClassEntity cls);
 
-  /// Returns the static type of [node].
-  // TODO(johnniwinther): This should be provided directly from kernel.
-  DartType getStaticType(ir.Expression node);
-
   /// [ElementEnvironment] for library, class and member lookup.
   JElementEnvironment get elementEnvironment;
 
@@ -165,6 +162,9 @@
   /// modified in another get their values updated correctly.
   Map<Local, JRecordField> makeRecordContainer(
       KernelScopeInfo info, MemberEntity member, KernelToLocalsMap localsMap);
+
+  /// Returns a provider for static types for [member].
+  StaticTypeProvider getStaticTypeProvider(MemberEntity member);
 }
 
 /// Interface for type inference results for kernel IR nodes.
@@ -187,7 +187,7 @@
       ir.PropertySet write, AbstractValueDomain abstractValueDomain);
 
   /// Returns the inferred type of [listLiteral].
-  AbstractValue typeOfListLiteral(MemberEntity owner,
+  AbstractValue typeOfListLiteral(
       ir.ListLiteral listLiteral, AbstractValueDomain abstractValueDomain);
 
   /// Returns the inferred type of iterator in [forInStatement].
@@ -219,7 +219,7 @@
 
   /// Returns the returned type annotation in the [nativeBehavior].
   AbstractValue typeFromNativeBehavior(
-      native.NativeBehavior nativeBehavior, JClosedWorld closedWorld);
+      NativeBehavior nativeBehavior, JClosedWorld closedWorld);
 }
 
 /// Map from kernel IR nodes to local entities.
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index dccda12..47433bc 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -27,10 +27,14 @@
 import '../elements/names.dart';
 import '../elements/types.dart';
 import '../environment.dart';
+import '../ir/cached_static_type.dart';
+import '../ir/closure.dart';
 import '../ir/debug.dart';
 import '../ir/element_map.dart';
 import '../ir/types.dart';
 import '../ir/visitors.dart';
+import '../ir/static_type_base.dart';
+import '../ir/static_type_provider.dart';
 import '../ir/util.dart';
 import '../js/js.dart' as js;
 import '../js_backend/constant_system_javascript.dart';
@@ -40,14 +44,13 @@
 import '../kernel/element_map_impl.dart';
 import '../kernel/env.dart';
 import '../kernel/kelements.dart';
-import '../native/native.dart' as native;
+import '../native/behavior.dart';
 import '../options.dart';
 import '../ordered_typeset.dart';
 import '../serialization/serialization.dart';
 import '../ssa/type_builder.dart';
 import '../universe/call_structure.dart';
 import '../universe/selector.dart';
-import '../universe/world_builder.dart';
 
 import 'closure.dart';
 import 'elements.dart';
@@ -69,7 +72,26 @@
       void f(DartType type, String name, ConstantValue defaultValue));
 }
 
-abstract class JsToElementMapBase implements IrToElementMap, JsToElementMap {
+class JsKernelToElementMap
+    implements JsToWorldBuilder, JsToElementMap, IrToElementMap {
+  /// Tag used for identifying serialized [JsKernelToElementMap] objects in a
+  /// debugging data stream.
+  static const String tag = 'js-kernel-to-element-map';
+
+  /// Tags used for identifying serialized subsections of a
+  /// [JsKernelToElementMap] object in a debugging data stream.
+  static const String libraryTag = 'libraries';
+  static const String classTag = 'classes';
+  static const String typedefTag = 'typedefs';
+  static const String memberTag = 'members';
+  static const String typeVariableTag = 'type-variables';
+  static const String libraryDataTag = 'library-data';
+  static const String classDataTag = 'class-data';
+  static const String typedefDataTag = 'typedef-data';
+  static const String memberDataTag = 'member-data';
+  static const String typeVariableDataTag = 'type-variable-data';
+  static const String nestedClosuresTag = 'nested-closures';
+
   final CompilerOptions options;
   final DiagnosticReporter reporter;
   CommonElementsImpl _commonElements;
@@ -78,6 +100,7 @@
   JsConstantEnvironment _constantEnvironment;
   KernelDartTypes _types;
   ir.TypeEnvironment _typeEnvironment;
+  ir.ClassHierarchy _classHierarchy;
 
   /// Library environment. Used for fast lookup.
   JProgramEnv programEnv;
@@ -93,15 +116,367 @@
   final EntityDataMap<IndexedTypedef, JTypedefData> typedefs =
       new EntityDataMap<IndexedTypedef, JTypedefData>();
 
-  JsToElementMapBase(this.options, this.reporter, Environment environment) {
+  final Map<ir.Library, IndexedLibrary> libraryMap = {};
+  final Map<ir.Class, IndexedClass> classMap = {};
+  final Map<ir.Typedef, IndexedTypedef> typedefMap = {};
+
+  /// Map from [ir.TypeParameter] nodes to the corresponding
+  /// [TypeVariableEntity].
+  ///
+  /// Normally the type variables are [IndexedTypeVariable]s, but for type
+  /// parameters on local function (in the frontend) these are _not_ since
+  /// their type declaration is neither a class nor a member. In the backend,
+  /// these type parameters belong to the call-method and are therefore indexed.
+  final Map<ir.TypeParameter, TypeVariableEntity> typeVariableMap = {};
+  final Map<ir.Member, IndexedConstructor> constructorMap = {};
+  final Map<ir.Procedure, IndexedFunction> methodMap = {};
+  final Map<ir.Field, IndexedField> fieldMap = {};
+  final Map<ir.TreeNode, Local> localFunctionMap = {};
+
+  /// Map from members to the call methods created for their nested closures.
+  Map<IndexedMember, List<IndexedFunction>> _nestedClosureMap = {};
+
+  /// NativeBasicData is need for computation of the default super class.
+  NativeBasicData nativeBasicData;
+
+  Map<IndexedFunction, JGeneratorBody> _generatorBodies = {};
+
+  Map<IndexedClass, List<IndexedMember>> _injectedClassMembers = {};
+
+  JsKernelToElementMap(this.reporter, Environment environment,
+      KernelToElementMapImpl _elementMap, Iterable<MemberEntity> liveMembers)
+      : this.options = _elementMap.options {
     _elementEnvironment = new JsElementEnvironment(this);
     _commonElements = new CommonElementsImpl(_elementEnvironment);
     _constantEnvironment = new JsConstantEnvironment(this, environment);
     _typeConverter = new DartTypeConverter(this);
     _types = new KernelDartTypes(this);
+
+    programEnv = _elementMap.env.convert();
+    for (int libraryIndex = 0;
+        libraryIndex < _elementMap.libraries.length;
+        libraryIndex++) {
+      IndexedLibrary oldLibrary = _elementMap.libraries.getEntity(libraryIndex);
+      KLibraryEnv oldEnv = _elementMap.libraries.getEnv(oldLibrary);
+      KLibraryData data = _elementMap.libraries.getData(oldLibrary);
+      IndexedLibrary newLibrary = convertLibrary(oldLibrary);
+      JLibraryEnv newEnv = oldEnv.convert(_elementMap, liveMembers);
+      libraryMap[oldEnv.library] =
+          libraries.register<IndexedLibrary, JLibraryData, JLibraryEnv>(
+              newLibrary, data.convert(), newEnv);
+      assert(newLibrary.libraryIndex == oldLibrary.libraryIndex);
+      programEnv.registerLibrary(newEnv);
+    }
+    // TODO(johnniwinther): Filter unused classes.
+    for (int classIndex = 0;
+        classIndex < _elementMap.classes.length;
+        classIndex++) {
+      IndexedClass oldClass = _elementMap.classes.getEntity(classIndex);
+      KClassEnv env = _elementMap.classes.getEnv(oldClass);
+      KClassData data = _elementMap.classes.getData(oldClass);
+      IndexedLibrary oldLibrary = oldClass.library;
+      LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
+      IndexedClass newClass = convertClass(newLibrary, oldClass);
+      JClassEnv newEnv = env.convert(_elementMap, liveMembers);
+      classMap[env.cls] = classes.register(newClass, data.convert(), newEnv);
+      assert(newClass.classIndex == oldClass.classIndex);
+      libraries.getEnv(newClass.library).registerClass(newClass.name, newEnv);
+    }
+    for (int typedefIndex = 0;
+        typedefIndex < _elementMap.typedefs.length;
+        typedefIndex++) {
+      IndexedTypedef oldTypedef = _elementMap.typedefs.getEntity(typedefIndex);
+      KTypedefData data = _elementMap.typedefs.getData(oldTypedef);
+      IndexedLibrary oldLibrary = oldTypedef.library;
+      LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
+      IndexedTypedef newTypedef = convertTypedef(newLibrary, oldTypedef);
+      typedefMap[data.node] = typedefs.register(
+          newTypedef,
+          new JTypedefData(
+              data.node,
+              new TypedefType(
+                  newTypedef,
+                  new List<DartType>.filled(
+                      data.node.typeParameters.length, const DynamicType()),
+                  getDartType(data.node.type))));
+      assert(newTypedef.typedefIndex == oldTypedef.typedefIndex);
+    }
+    for (int memberIndex = 0;
+        memberIndex < _elementMap.members.length;
+        memberIndex++) {
+      IndexedMember oldMember = _elementMap.members.getEntity(memberIndex);
+      if (!liveMembers.contains(oldMember)) {
+        members.skipIndex(oldMember.memberIndex);
+        continue;
+      }
+      KMemberData data = _elementMap.members.getData(oldMember);
+      IndexedLibrary oldLibrary = oldMember.library;
+      IndexedClass oldClass = oldMember.enclosingClass;
+      LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
+      ClassEntity newClass =
+          oldClass != null ? classes.getEntity(oldClass.classIndex) : null;
+      IndexedMember newMember = convertMember(newLibrary, newClass, oldMember);
+      members.register(newMember, data.convert());
+      assert(newMember.memberIndex == oldMember.memberIndex);
+      if (newMember.isField) {
+        fieldMap[data.node] = newMember;
+      } else if (newMember.isConstructor) {
+        constructorMap[data.node] = newMember;
+      } else {
+        methodMap[data.node] = newMember;
+      }
+    }
+    for (int typeVariableIndex = 0;
+        typeVariableIndex < _elementMap.typeVariables.length;
+        typeVariableIndex++) {
+      IndexedTypeVariable oldTypeVariable =
+          _elementMap.typeVariables.getEntity(typeVariableIndex);
+      KTypeVariableData oldTypeVariableData =
+          _elementMap.typeVariables.getData(oldTypeVariable);
+      Entity newTypeDeclaration;
+      if (oldTypeVariable.typeDeclaration is ClassEntity) {
+        IndexedClass cls = oldTypeVariable.typeDeclaration;
+        newTypeDeclaration = classes.getEntity(cls.classIndex);
+        // TODO(johnniwinther): Skip type variables of unused classes.
+      } else if (oldTypeVariable.typeDeclaration is MemberEntity) {
+        IndexedMember member = oldTypeVariable.typeDeclaration;
+        newTypeDeclaration = members.getEntity(member.memberIndex);
+        if (newTypeDeclaration == null) {
+          typeVariables.skipIndex(typeVariableIndex);
+          continue;
+        }
+      } else {
+        assert(oldTypeVariable.typeDeclaration is Local);
+      }
+      IndexedTypeVariable newTypeVariable = createTypeVariable(
+          newTypeDeclaration, oldTypeVariable.name, oldTypeVariable.index);
+      typeVariableMap[oldTypeVariableData.node] =
+          typeVariables.register<IndexedTypeVariable, JTypeVariableData>(
+              newTypeVariable, oldTypeVariableData.copy());
+      assert(newTypeVariable.typeVariableIndex ==
+          oldTypeVariable.typeVariableIndex);
+    }
+    // TODO(johnniwinther): We should close the environment in the beginning of
+    // this constructor but currently we need the [MemberEntity] to query if the
+    // member is live, thus potentially creating the [MemberEntity] in the
+    // process. Avoid this.
+    _elementMap.envIsClosed = true;
   }
 
-  bool checkFamily(Entity entity);
+  JsKernelToElementMap.readFromDataSource(this.options, this.reporter,
+      Environment environment, ir.Component component, DataSource source) {
+    _elementEnvironment = new JsElementEnvironment(this);
+    _commonElements = new CommonElementsImpl(_elementEnvironment);
+    _constantEnvironment = new JsConstantEnvironment(this, environment);
+    _typeConverter = new DartTypeConverter(this);
+    _types = new KernelDartTypes(this);
+
+    source.registerComponentLookup(new ComponentLookup(component));
+    _EntityLookup entityLookup = new _EntityLookup();
+    source.registerEntityLookup(entityLookup);
+
+    source.begin(tag);
+    source.begin(libraryTag);
+    int libraryCount = source.readInt();
+    for (int i = 0; i < libraryCount; i++) {
+      int index = source.readInt();
+      JLibrary library = new JLibrary.readFromDataSource(source);
+      entityLookup.registerLibrary(index, library);
+    }
+    source.end(libraryTag);
+
+    source.begin(classTag);
+    int classCount = source.readInt();
+    for (int i = 0; i < classCount; i++) {
+      int index = source.readInt();
+      JClass cls = new JClass.readFromDataSource(source);
+      entityLookup.registerClass(index, cls);
+    }
+    source.end(classTag);
+
+    source.begin(typedefTag);
+    int typedefCount = source.readInt();
+    for (int i = 0; i < typedefCount; i++) {
+      int index = source.readInt();
+      JTypedef typedef = new JTypedef.readFromDataSource(source);
+      entityLookup.registerTypedef(index, typedef);
+    }
+    source.end(typedefTag);
+
+    source.begin(memberTag);
+    int memberCount = source.readInt();
+    for (int i = 0; i < memberCount; i++) {
+      int index = source.readInt();
+      JMember member = new JMember.readFromDataSource(source);
+      entityLookup.registerMember(index, member);
+    }
+    source.end(memberTag);
+
+    source.begin(typeVariableTag);
+    int typeVariableCount = source.readInt();
+    for (int i = 0; i < typeVariableCount; i++) {
+      int index = source.readInt();
+      JTypeVariable typeVariable = new JTypeVariable.readFromDataSource(source);
+      entityLookup.registerTypeVariable(index, typeVariable);
+    }
+    source.end(typeVariableTag);
+
+    programEnv = new JProgramEnv([component]);
+    source.begin(libraryDataTag);
+    entityLookup.forEachLibrary((int index, JLibrary library) {
+      JLibraryEnv env = new JLibraryEnv.readFromDataSource(source);
+      JLibraryData data = new JLibraryData.readFromDataSource(source);
+      libraryMap[env.library] =
+          libraries.registerByIndex(index, library, data, env);
+      programEnv.registerLibrary(env);
+      assert(index == library.libraryIndex);
+    });
+    source.end(libraryDataTag);
+
+    source.begin(classDataTag);
+    entityLookup.forEachClass((int index, JClass cls) {
+      JClassEnv env = new JClassEnv.readFromDataSource(source);
+      JClassData data = new JClassData.readFromDataSource(source);
+      classMap[env.cls] = classes.registerByIndex(index, cls, data, env);
+      if (cls is! JRecord && cls is! JClosureClass) {
+        // Synthesized classes are not part of the library environment.
+        libraries.getEnv(cls.library).registerClass(cls.name, env);
+      }
+      assert(index == cls.classIndex);
+    });
+    source.end(classDataTag);
+
+    source.begin(typedefDataTag);
+    entityLookup.forEachTypedef((int index, JTypedef typedef) {
+      JTypedefData data = new JTypedefData.readFromDataSource(source);
+      typedefMap[data.node] = typedefs.registerByIndex(index, typedef, data);
+      assert(index == typedef.typedefIndex);
+    });
+    source.end(typedefDataTag);
+
+    source.begin(memberDataTag);
+    entityLookup.forEachMember((int index, IndexedMember member) {
+      JMemberData data = new JMemberData.readFromDataSource(source);
+      members.registerByIndex(index, member, data);
+      switch (data.definition.kind) {
+        case MemberKind.regular:
+        case MemberKind.constructor:
+          ir.Member node = data.definition.node;
+          if (member.isField) {
+            fieldMap[node] = member;
+          } else if (member.isConstructor) {
+            constructorMap[node] = member;
+          } else {
+            methodMap[node] = member;
+          }
+          break;
+        default:
+      }
+      assert(index == member.memberIndex);
+    });
+    source.end(memberDataTag);
+
+    source.begin(typeVariableDataTag);
+    entityLookup.forEachTypeVariable((int index, JTypeVariable typeVariable) {
+      JTypeVariableData data = new JTypeVariableData.readFromDataSource(source);
+      typeVariableMap[data.node] =
+          typeVariables.registerByIndex(index, typeVariable, data);
+      assert(index == typeVariable.typeVariableIndex);
+    });
+    source.end(typeVariableDataTag);
+
+    source.begin(nestedClosuresTag);
+    _nestedClosureMap.addAll(
+        source.readMemberMap(() => source.readMembers<IndexedFunction>()));
+    source.end(nestedClosuresTag);
+
+    source.end(tag);
+  }
+
+  /// Serializes this [JsToElementMap] to [sink].
+  void writeToDataSink(DataSink sink) {
+    sink.begin(tag);
+
+    // Serialize the entities before serializing the data.
+    sink.begin(libraryTag);
+    sink.writeInt(libraries.size);
+    libraries.forEach((JLibrary library, _, __) {
+      sink.writeInt(library.libraryIndex);
+      library.writeToDataSink(sink);
+    });
+    sink.end(libraryTag);
+
+    sink.begin(classTag);
+    sink.writeInt(classes.size);
+    classes.forEach((JClass cls, _, __) {
+      sink.writeInt(cls.classIndex);
+      cls.writeToDataSink(sink);
+    });
+    sink.end(classTag);
+
+    sink.begin(typedefTag);
+    sink.writeInt(typedefs.size);
+    typedefs.forEach((JTypedef typedef, _) {
+      sink.writeInt(typedef.typedefIndex);
+      typedef.writeToDataSink(sink);
+    });
+    sink.end(typedefTag);
+
+    sink.begin(memberTag);
+    sink.writeInt(members.size);
+    members.forEach((JMember member, _) {
+      sink.writeInt(member.memberIndex);
+      member.writeToDataSink(sink);
+    });
+    sink.end(memberTag);
+
+    sink.begin(typeVariableTag);
+    sink.writeInt(typeVariables.size);
+    typeVariables.forEach((JTypeVariable typeVariable, _) {
+      sink.writeInt(typeVariable.typeVariableIndex);
+      typeVariable.writeToDataSink(sink);
+    });
+    sink.end(typeVariableTag);
+
+    // Serialize the entity data after having serialized the entities.
+    sink.begin(libraryDataTag);
+    libraries.forEach((_, JLibraryData data, JLibraryEnv env) {
+      env.writeToDataSink(sink);
+      data.writeToDataSink(sink);
+    });
+    sink.end(libraryDataTag);
+
+    sink.begin(classDataTag);
+    classes.forEach((_, JClassData data, JClassEnv env) {
+      env.writeToDataSink(sink);
+      data.writeToDataSink(sink);
+    });
+    sink.end(classDataTag);
+
+    sink.begin(typedefDataTag);
+    typedefs.forEach((_, JTypedefData data) {
+      data.writeToDataSink(sink);
+    });
+    sink.end(typedefDataTag);
+
+    sink.begin(memberDataTag);
+    members.forEach((_, JMemberData data) {
+      data.writeToDataSink(sink);
+    });
+    sink.end(memberDataTag);
+
+    sink.begin(typeVariableDataTag);
+    typeVariables.forEach((_, JTypeVariableData data) {
+      data.writeToDataSink(sink);
+    });
+    sink.end(typeVariableDataTag);
+
+    sink.begin(nestedClosuresTag);
+    sink.writeMemberMap(_nestedClosureMap, sink.writeMembers);
+    sink.end(nestedClosuresTag);
+
+    sink.end(tag);
+  }
 
   DartTypes get types => _types;
 
@@ -110,9 +485,6 @@
   @override
   CommonElementsImpl get commonElements => _commonElements;
 
-  /// NativeBasicData is need for computation of the default super class.
-  NativeBasicData get nativeBasicData;
-
   FunctionEntity get _mainFunction {
     return programEnv.mainMethod != null
         ? getMethodInternal(programEnv.mainMethod)
@@ -125,8 +497,6 @@
         : null;
   }
 
-  Iterable<LibraryEntity> get libraryListInternal;
-
   SourceSpan getSourceSpan(Spannable spannable, Entity currentElement) {
     SourceSpan fromSpannable(Spannable spannable) {
       if (spannable is IndexedLibrary &&
@@ -224,13 +594,9 @@
 
   LibraryEntity getLibrary(ir.Library node) => getLibraryInternal(node);
 
-  LibraryEntity getLibraryInternal(ir.Library node, [JLibraryEnv libraryEnv]);
-
   @override
   ClassEntity getClass(ir.Class node) => getClassInternal(node);
 
-  ClassEntity getClassInternal(ir.Class node, [JClassEnv classEnv]);
-
   InterfaceType getSuperType(IndexedClass cls) {
     assert(checkFamily(cls));
     JClassData data = classes.getData(cls);
@@ -264,8 +630,6 @@
   TypeVariableEntity getTypeVariable(ir.TypeParameter node) =>
       getTypeVariableInternal(node);
 
-  TypeVariableEntity getTypeVariableInternal(ir.TypeParameter node);
-
   void _ensureSupertypes(ClassEntity cls, JClassData data) {
     assert(checkFamily(cls));
     if (data is JClassDataImpl && data.orderedTypeSet == null) {
@@ -347,8 +711,6 @@
     return typedefs.getData(typedef).rawType;
   }
 
-  TypedefEntity getTypedefInternal(ir.Typedef node);
-
   @override
   MemberEntity getMember(ir.Member node) {
     if (node is ir.Field) {
@@ -394,8 +756,6 @@
   ConstructorEntity getConstructor(ir.Member node) =>
       getConstructorInternal(node);
 
-  ConstructorEntity getConstructorInternal(ir.Member node);
-
   ConstructorEntity getSuperConstructor(
       ir.Constructor sourceNode, ir.Member targetNode) {
     ConstructorEntity source = getConstructor(sourceNode);
@@ -417,13 +777,9 @@
   @override
   FunctionEntity getMethod(ir.Procedure node) => getMethodInternal(node);
 
-  FunctionEntity getMethodInternal(ir.Procedure node);
-
   @override
   FieldEntity getField(ir.Field node) => getFieldInternal(node);
 
-  FieldEntity getFieldInternal(ir.Field node);
-
   @override
   DartType getDartType(ir.DartType type) => _typeConverter.convert(type);
 
@@ -618,15 +974,6 @@
     env.forEachConstructor(this, f);
   }
 
-  void forEachConstructorBody(
-      IndexedClass cls, void f(ConstructorBodyEntity member)) {
-    throw new UnsupportedError(
-        'KernelToElementMapBase._forEachConstructorBody');
-  }
-
-  void forEachNestedClosure(
-      MemberEntity member, void f(FunctionEntity closure));
-
   void _forEachLocalClassMember(IndexedClass cls, void f(MemberEntity member)) {
     assert(checkFamily(cls));
     JClassEnv env = classes.getEnv(cls);
@@ -635,13 +982,6 @@
     });
   }
 
-  void forEachInjectedClassMember(
-      IndexedClass cls, void f(MemberEntity member)) {
-    assert(checkFamily(cls));
-    throw new UnsupportedError(
-        'KernelToElementMapBase._forEachInjectedClassMember');
-  }
-
   void _forEachClassMember(
       IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) {
     assert(checkFamily(cls));
@@ -719,26 +1059,52 @@
   ir.TypeEnvironment get typeEnvironment {
     if (_typeEnvironment == null) {
       _typeEnvironment ??= new ir.TypeEnvironment(
-          new ir.CoreTypes(programEnv.mainComponent),
-          new ir.ClassHierarchy(programEnv.mainComponent));
+          new ir.CoreTypes(programEnv.mainComponent), classHierarchy);
     }
     return _typeEnvironment;
   }
 
-  DartType getStaticType(ir.Expression node) {
-    ir.TreeNode enclosingClass = node;
-    while (enclosingClass != null && enclosingClass is! ir.Class) {
-      enclosingClass = enclosingClass.parent;
+  ir.ClassHierarchy get classHierarchy {
+    if (_classHierarchy == null) {
+      _classHierarchy ??= new ir.ClassHierarchy(programEnv.mainComponent);
     }
-    try {
-      typeEnvironment.thisType =
-          enclosingClass is ir.Class ? enclosingClass.thisType : null;
-      return getDartType(node.getStaticType(typeEnvironment));
-    } catch (e) {
-      // The static type computation crashes on type errors. Use `dynamic`
-      // as static type.
-      return commonElements.dynamicType;
+    return _classHierarchy;
+  }
+
+  StaticTypeProvider getStaticTypeProvider(MemberEntity member) {
+    MemberDefinition memberDefinition = members.getData(member).definition;
+    Map<ir.Expression, ir.DartType> cachedStaticTypes;
+    ir.InterfaceType thisType;
+    switch (memberDefinition.kind) {
+      case MemberKind.regular:
+      case MemberKind.constructor:
+      case MemberKind.constructorBody:
+        ir.Member node = memberDefinition.node;
+        thisType = node.enclosingClass?.thisType;
+        cachedStaticTypes = members.getData(member).staticTypes;
+        break;
+      case MemberKind.closureCall:
+        ir.TreeNode node = memberDefinition.node;
+        while (node != null) {
+          if (node is ir.Member) {
+            ir.Member member = node;
+            thisType = member.enclosingClass?.thisType;
+            cachedStaticTypes = members.getData(getMember(member)).staticTypes;
+            break;
+          }
+          node = node.parent;
+        }
+        break;
+      case MemberKind.closureField:
+      case MemberKind.signature:
+      case MemberKind.generatorBody:
+        cachedStaticTypes = const {};
+        break;
     }
+
+    assert(cachedStaticTypes != null, "No static types cached for $member.");
+    return new CachedStaticType(typeEnvironment, cachedStaticTypes,
+        new ThisInterfaceType.from(thisType));
   }
 
   Name getName(ir.Name name) {
@@ -774,6 +1140,9 @@
     if (node is ir.PropertyGet) {
       return getGetterSelector(node.name);
     }
+    if (node is ir.DirectPropertyGet) {
+      return getGetterSelector(node.target.name);
+    }
     if (node is ir.SuperPropertyGet) {
       return getGetterSelector(node.name);
     }
@@ -824,16 +1193,16 @@
   /// Looks up [typeName] for use in the spec-string of a `JS` call.
   // TODO(johnniwinther): Use this in [native.NativeBehavior] instead of calling
   // the `ForeignResolver`.
-  native.TypeLookup typeLookup({bool resolveAsRaw: true}) {
+  TypeLookup typeLookup({bool resolveAsRaw: true}) {
     return resolveAsRaw
         ? (_cachedTypeLookupRaw ??= _typeLookup(resolveAsRaw: true))
         : (_cachedTypeLookupFull ??= _typeLookup(resolveAsRaw: false));
   }
 
-  native.TypeLookup _cachedTypeLookupRaw;
-  native.TypeLookup _cachedTypeLookupFull;
+  TypeLookup _cachedTypeLookupRaw;
+  TypeLookup _cachedTypeLookupFull;
 
-  native.TypeLookup _typeLookup({bool resolveAsRaw: true}) {
+  TypeLookup _typeLookup({bool resolveAsRaw: true}) {
     bool cachedMayLookupInMain;
     bool mayLookupInMain() {
       var mainUri = elementEnvironment.mainLibrary.canonicalUri;
@@ -898,28 +1267,28 @@
 
   /// Computes the [native.NativeBehavior] for a call to the [JS] function.
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
+  NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length < 2 ||
         node.arguments.named.isNotEmpty) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS);
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_FIRST);
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
 
     String codeString = _getStringArgument(node, 1);
     if (codeString == null) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_SECOND);
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
 
-    return native.NativeBehavior.ofJsCall(
+    return NativeBehavior.ofJsCall(
         specString,
         codeString,
         typeLookup(resolveAsRaw: true),
@@ -928,28 +1297,27 @@
         commonElements);
   }
 
-  /// Computes the [native.NativeBehavior] for a call to the [JS_BUILTIN]
+  /// Computes the [NativeBehavior] for a call to the [JS_BUILTIN]
   /// function.
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForJsBuiltinCall(
-      ir.StaticInvocation node) {
+  NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length < 1) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS builtin expression has no type.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     if (node.arguments.positional.length < 2) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS builtin is missing name.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
-    return native.NativeBehavior.ofJsBuiltinCall(
+    return NativeBehavior.ofJsBuiltinCall(
         specString,
         typeLookup(resolveAsRaw: true),
         CURRENT_ELEMENT_SPANNABLE,
@@ -957,34 +1325,34 @@
         commonElements);
   }
 
-  /// Computes the [native.NativeBehavior] for a call to the
+  /// Computes the [NativeBehavior] for a call to the
   /// [JS_EMBEDDED_GLOBAL] function.
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
+  NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
       ir.StaticInvocation node) {
     if (node.arguments.positional.length < 1) {
       reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
           "JS embedded global expression has no type.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     if (node.arguments.positional.length < 2) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS embedded global is missing name.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     if (node.arguments.positional.length > 2 ||
         node.arguments.named.isNotEmpty) {
       reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
           "JS embedded global has more than 2 arguments.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
-    return native.NativeBehavior.ofJsEmbeddedGlobalCall(
+    return NativeBehavior.ofJsEmbeddedGlobalCall(
         specString,
         typeLookup(resolveAsRaw: true),
         CURRENT_ELEMENT_SPANNABLE,
@@ -1076,731 +1444,144 @@
         failedAt(cls, "No super noSuchMethod found for class $cls."));
     return function;
   }
-}
 
-class JsElementEnvironment extends ElementEnvironment
-    implements JElementEnvironment {
-  final JsToElementMapBase elementMap;
-
-  JsElementEnvironment(this.elementMap);
-
-  @override
-  DartType get dynamicType => const DynamicType();
-
-  @override
-  LibraryEntity get mainLibrary => elementMap._mainLibrary;
-
-  @override
-  FunctionEntity get mainFunction => elementMap._mainFunction;
-
-  @override
-  Iterable<LibraryEntity> get libraries => elementMap.libraryListInternal;
-
-  @override
-  String getLibraryName(LibraryEntity library) {
-    return elementMap._getLibraryName(library);
+  IndexedLibrary createLibrary(String name, Uri canonicalUri) {
+    return new JLibrary(name, canonicalUri);
   }
 
-  @override
-  InterfaceType getThisType(ClassEntity cls) {
-    return elementMap.getThisType(cls);
+  IndexedClass createClass(LibraryEntity library, String name,
+      {bool isAbstract}) {
+    return new JClass(library, name, isAbstract: isAbstract);
   }
 
-  @override
-  InterfaceType getRawType(ClassEntity cls) {
-    return elementMap._getRawType(cls);
+  IndexedTypedef createTypedef(LibraryEntity library, String name) {
+    return new JTypedef(library, name);
   }
 
-  @override
-  bool isGenericClass(ClassEntity cls) {
-    return getThisType(cls).typeArguments.isNotEmpty;
+  TypeVariableEntity createTypeVariable(
+      Entity typeDeclaration, String name, int index) {
+    return new JTypeVariable(typeDeclaration, name, index);
   }
 
-  @override
-  bool isMixinApplication(ClassEntity cls) {
-    return elementMap._isMixinApplication(cls);
+  IndexedConstructor createGenerativeConstructor(ClassEntity enclosingClass,
+      Name name, ParameterStructure parameterStructure,
+      {bool isExternal, bool isConst}) {
+    return new JGenerativeConstructor(enclosingClass, name, parameterStructure,
+        isExternal: isExternal, isConst: isConst);
   }
 
-  @override
-  bool isUnnamedMixinApplication(ClassEntity cls) {
-    return elementMap._isUnnamedMixinApplication(cls);
+  IndexedConstructor createFactoryConstructor(ClassEntity enclosingClass,
+      Name name, ParameterStructure parameterStructure,
+      {bool isExternal, bool isConst, bool isFromEnvironmentConstructor}) {
+    return new JFactoryConstructor(enclosingClass, name, parameterStructure,
+        isExternal: isExternal,
+        isConst: isConst,
+        isFromEnvironmentConstructor: isFromEnvironmentConstructor);
   }
 
-  @override
-  bool isSuperMixinApplication(ClassEntity cls) {
-    return elementMap._isSuperMixinApplication(cls);
+  JConstructorBody createConstructorBody(ConstructorEntity constructor) {
+    return new JConstructorBody(constructor);
   }
 
-  @override
-  ClassEntity getEffectiveMixinClass(ClassEntity cls) {
-    if (!isMixinApplication(cls)) return null;
-    do {
-      cls = elementMap.getAppliedMixin(cls);
-    } while (isMixinApplication(cls));
-    return cls;
+  JGeneratorBody createGeneratorBody(
+      FunctionEntity function, DartType elementType) {
+    return new JGeneratorBody(function, elementType);
   }
 
-  @override
-  DartType getTypeVariableBound(TypeVariableEntity typeVariable) {
-    return elementMap.getTypeVariableBound(typeVariable);
+  IndexedFunction createGetter(LibraryEntity library,
+      ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker,
+      {bool isStatic, bool isExternal, bool isAbstract}) {
+    return new JGetter(library, enclosingClass, name, asyncMarker,
+        isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
   }
 
-  @override
-  DartType getTypeVariableDefaultType(TypeVariableEntity typeVariable) {
-    return elementMap._getTypeVariableDefaultType(typeVariable);
+  IndexedFunction createMethod(
+      LibraryEntity library,
+      ClassEntity enclosingClass,
+      Name name,
+      ParameterStructure parameterStructure,
+      AsyncMarker asyncMarker,
+      {bool isStatic,
+      bool isExternal,
+      bool isAbstract}) {
+    return new JMethod(
+        library, enclosingClass, name, parameterStructure, asyncMarker,
+        isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
   }
 
-  @override
-  InterfaceType createInterfaceType(
-      ClassEntity cls, List<DartType> typeArguments) {
-    return new InterfaceType(cls, typeArguments);
+  IndexedFunction createSetter(
+      LibraryEntity library, ClassEntity enclosingClass, Name name,
+      {bool isStatic, bool isExternal, bool isAbstract}) {
+    return new JSetter(library, enclosingClass, name,
+        isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
   }
 
-  @override
-  FunctionType getFunctionType(FunctionEntity function) {
-    return elementMap._getFunctionType(function);
+  IndexedField createField(
+      LibraryEntity library, ClassEntity enclosingClass, Name name,
+      {bool isStatic, bool isAssignable, bool isConst}) {
+    return new JField(library, enclosingClass, name,
+        isStatic: isStatic, isAssignable: isAssignable, isConst: isConst);
   }
 
-  @override
-  List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function) {
-    return elementMap._getFunctionTypeVariables(function);
+  LibraryEntity convertLibrary(IndexedLibrary library) {
+    return createLibrary(library.name, library.canonicalUri);
   }
 
-  @override
-  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function) {
-    // TODO(sra): Should be getting the DartType from the node.
-    DartType returnType = getFunctionType(function).returnType;
-    return getAsyncOrSyncStarElementType(function.asyncMarker, returnType);
+  ClassEntity convertClass(LibraryEntity library, IndexedClass cls) {
+    return createClass(library, cls.name, isAbstract: cls.isAbstract);
   }
 
-  @override
-  DartType getAsyncOrSyncStarElementType(
-      AsyncMarker asyncMarker, DartType returnType) {
-    switch (asyncMarker) {
-      case AsyncMarker.SYNC:
-        return returnType;
-      case AsyncMarker.SYNC_STAR:
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.iterableClass) {
-            return returnType.typeArguments.first;
-          }
-        }
-        return dynamicType;
-      case AsyncMarker.ASYNC:
-        if (returnType is FutureOrType) return returnType.typeArgument;
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.futureClass) {
-            return returnType.typeArguments.first;
-          }
-        }
-        return dynamicType;
-      case AsyncMarker.ASYNC_STAR:
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.streamClass) {
-            return returnType.typeArguments.first;
-          }
-        }
-        return dynamicType;
-    }
-    assert(false, 'Unexpected marker ${asyncMarker}');
-    return null;
+  TypedefEntity convertTypedef(LibraryEntity library, IndexedTypedef typedef) {
+    return createTypedef(library, typedef.name);
   }
 
-  @override
-  DartType getFieldType(FieldEntity field) {
-    return elementMap._getFieldType(field);
-  }
-
-  @override
-  FunctionType getLocalFunctionType(covariant KLocalFunction function) {
-    return function.functionType;
-  }
-
-  @override
-  DartType getUnaliasedType(DartType type) => type;
-
-  @override
-  ConstructorEntity lookupConstructor(ClassEntity cls, String name,
-      {bool required: false}) {
-    ConstructorEntity constructor = elementMap.lookupConstructor(cls, name);
-    if (constructor == null && required) {
-      throw failedAt(
-          CURRENT_ELEMENT_SPANNABLE,
-          "The constructor '$name' was not found in class '${cls.name}' "
-          "in library ${cls.library.canonicalUri}.");
-    }
-    return constructor;
-  }
-
-  @override
-  MemberEntity lookupLocalClassMember(ClassEntity cls, String name,
-      {bool setter: false, bool required: false}) {
-    MemberEntity member =
-        elementMap.lookupClassMember(cls, name, setter: setter);
-    if (member == null && required) {
-      throw failedAt(CURRENT_ELEMENT_SPANNABLE,
-          "The member '$name' was not found in ${cls.name}.");
-    }
-    return member;
-  }
-
-  @override
-  ClassEntity getSuperClass(ClassEntity cls,
-      {bool skipUnnamedMixinApplications: false}) {
-    assert(elementMap.checkFamily(cls));
-    ClassEntity superclass = elementMap.getSuperType(cls)?.element;
-    if (skipUnnamedMixinApplications) {
-      while (superclass != null &&
-          elementMap._isUnnamedMixinApplication(superclass)) {
-        superclass = elementMap.getSuperType(superclass)?.element;
-      }
-    }
-    return superclass;
-  }
-
-  @override
-  void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) {
-    elementMap._forEachSupertype(cls, f);
-  }
-
-  @override
-  void forEachLocalClassMember(ClassEntity cls, void f(MemberEntity member)) {
-    elementMap._forEachLocalClassMember(cls, f);
-  }
-
-  @override
-  void forEachInjectedClassMember(
-      ClassEntity cls, void f(MemberEntity member)) {
-    elementMap.forEachInjectedClassMember(cls, f);
-  }
-
-  @override
-  void forEachClassMember(
-      ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) {
-    elementMap._forEachClassMember(cls, f);
-  }
-
-  @override
-  void forEachConstructor(
-      ClassEntity cls, void f(ConstructorEntity constructor)) {
-    elementMap._forEachConstructor(cls, f);
-  }
-
-  @override
-  void forEachConstructorBody(
-      ClassEntity cls, void f(ConstructorBodyEntity constructor)) {
-    elementMap.forEachConstructorBody(cls, f);
-  }
-
-  @override
-  void forEachNestedClosure(
-      MemberEntity member, void f(FunctionEntity closure)) {
-    elementMap.forEachNestedClosure(member, f);
-  }
-
-  @override
-  void forEachLibraryMember(
-      LibraryEntity library, void f(MemberEntity member)) {
-    elementMap._forEachLibraryMember(library, f);
-  }
-
-  @override
-  MemberEntity lookupLibraryMember(LibraryEntity library, String name,
-      {bool setter: false, bool required: false}) {
-    MemberEntity member =
-        elementMap.lookupLibraryMember(library, name, setter: setter);
-    if (member == null && required) {
-      failedAt(CURRENT_ELEMENT_SPANNABLE,
-          "The member '${name}' was not found in library '${library.name}'.");
-    }
-    return member;
-  }
-
-  @override
-  ClassEntity lookupClass(LibraryEntity library, String name,
-      {bool required: false}) {
-    ClassEntity cls = elementMap.lookupClass(library, name);
-    if (cls == null && required) {
-      failedAt(CURRENT_ELEMENT_SPANNABLE,
-          "The class '$name'  was not found in library '${library.name}'.");
-    }
-    return cls;
-  }
-
-  @override
-  void forEachClass(LibraryEntity library, void f(ClassEntity cls)) {
-    elementMap._forEachClass(library, f);
-  }
-
-  @override
-  LibraryEntity lookupLibrary(Uri uri, {bool required: false}) {
-    LibraryEntity library = elementMap.lookupLibrary(uri);
-    if (library == null && required) {
-      failedAt(CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found.");
-    }
-    return library;
-  }
-
-  @override
-  bool isEnumClass(ClassEntity cls) {
-    assert(elementMap.checkFamily(cls));
-    JClassData classData = elementMap.classes.getData(cls);
-    return classData.isEnumClass;
-  }
-}
-
-/// [native.BehaviorBuilder] for kernel based elements.
-class JsBehaviorBuilder extends native.BehaviorBuilder {
-  final ElementEnvironment elementEnvironment;
-  final CommonElements commonElements;
-  final DiagnosticReporter reporter;
-  final NativeBasicData nativeBasicData;
-  final CompilerOptions _options;
-
-  JsBehaviorBuilder(this.elementEnvironment, this.commonElements,
-      this.nativeBasicData, this.reporter, this._options);
-
-  @override
-  bool get trustJSInteropTypeAnnotations =>
-      _options.trustJSInteropTypeAnnotations;
-}
-
-/// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using
-/// [_EvaluationEnvironment] for the evaluation.
-class JsConstantEnvironment implements ConstantEnvironment {
-  final JsToElementMapBase _elementMap;
-  final Environment _environment;
-
-  Map<ConstantExpression, ConstantValue> _valueMap =
-      <ConstantExpression, ConstantValue>{};
-
-  JsConstantEnvironment(this._elementMap, this._environment);
-
-  @override
-  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
-
-  ConstantValue _getConstantValue(
-      Spannable spannable, ConstantExpression expression,
-      {bool constantRequired}) {
-    return _valueMap.putIfAbsent(expression, () {
-      return expression.evaluate(
-          new JsEvaluationEnvironment(_elementMap, _environment, spannable,
-              constantRequired: constantRequired),
-          constantSystem);
-    });
-  }
-}
-
-/// Evaluation environment used for computing [ConstantValue]s for
-/// kernel based [ConstantExpression]s.
-class JsEvaluationEnvironment extends EvaluationEnvironmentBase {
-  final JsToElementMapBase _elementMap;
-  final Environment _environment;
-
-  JsEvaluationEnvironment(
-      this._elementMap, this._environment, Spannable spannable,
-      {bool constantRequired})
-      : super(spannable, constantRequired: constantRequired);
-
-  @override
-  CommonElements get commonElements => _elementMap.commonElements;
-
-  @override
-  DartTypes get types => _elementMap.types;
-
-  @override
-  DartType substByContext(DartType base, InterfaceType target) {
-    return _elementMap.substByContext(base, target);
-  }
-
-  @override
-  ConstantConstructor getConstructorConstant(ConstructorEntity constructor) {
-    return _elementMap._getConstructorConstant(constructor);
-  }
-
-  @override
-  ConstantExpression getFieldConstant(FieldEntity field) {
-    return _elementMap._getFieldConstantExpression(field);
-  }
-
-  @override
-  ConstantExpression getLocalConstant(Local local) {
-    throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant");
-  }
-
-  @override
-  String readFromEnvironment(String name) {
-    return _environment.valueOf(name);
-  }
-
-  @override
-  DiagnosticReporter get reporter => _elementMap.reporter;
-
-  @override
-  bool get enableAssertions => _elementMap.options.enableUserAssertions;
-}
-
-class JsKernelToElementMap extends JsToElementMapBase
-    with JsElementCreatorMixin
-    implements JsToWorldBuilder, JsToElementMap {
-  /// Tag used for identifying serialized [JsKernelToElementMap] objects in a
-  /// debugging data stream.
-  static const String tag = 'js-kernel-to-element-map';
-
-  /// Tags used for identifying serialized subsections of a
-  /// [JsKernelToElementMap] object in a debugging data stream.
-  static const String libraryTag = 'libraries';
-  static const String classTag = 'classes';
-  static const String typedefTag = 'typedefs';
-  static const String memberTag = 'members';
-  static const String typeVariableTag = 'type-variables';
-  static const String libraryDataTag = 'library-data';
-  static const String classDataTag = 'class-data';
-  static const String typedefDataTag = 'typedef-data';
-  static const String memberDataTag = 'member-data';
-  static const String typeVariableDataTag = 'type-variable-data';
-
-  final Map<ir.Library, IndexedLibrary> libraryMap = {};
-  final Map<ir.Class, IndexedClass> classMap = {};
-  final Map<ir.Typedef, IndexedTypedef> typedefMap = {};
-
-  /// Map from [ir.TypeParameter] nodes to the corresponding
-  /// [TypeVariableEntity].
-  ///
-  /// Normally the type variables are [IndexedTypeVariable]s, but for type
-  /// parameters on local function (in the frontend) these are _not_ since
-  /// their type declaration is neither a class nor a member. In the backend,
-  /// these type parameters belong to the call-method and are therefore indexed.
-  final Map<ir.TypeParameter, TypeVariableEntity> typeVariableMap = {};
-  final Map<ir.Member, IndexedConstructor> constructorMap = {};
-  final Map<ir.Procedure, IndexedFunction> methodMap = {};
-  final Map<ir.Field, IndexedField> fieldMap = {};
-  final Map<ir.TreeNode, Local> localFunctionMap = {};
-
-  /// Map from members to the call methods created for their nested closures.
-  Map<IndexedMember, List<IndexedFunction>> _nestedClosureMap = {};
-
-  @override
-  NativeBasicData nativeBasicData;
-
-  Map<IndexedFunction, JGeneratorBody> _generatorBodies = {};
-
-  Map<IndexedClass, List<IndexedMember>> _injectedClassMembers = {};
-
-  JsKernelToElementMap(DiagnosticReporter reporter, Environment environment,
-      KernelToElementMapImpl _elementMap, Iterable<MemberEntity> liveMembers)
-      : super(_elementMap.options, reporter, environment) {
-    programEnv = _elementMap.env.convert();
-    for (int libraryIndex = 0;
-        libraryIndex < _elementMap.libraries.length;
-        libraryIndex++) {
-      IndexedLibrary oldLibrary = _elementMap.libraries.getEntity(libraryIndex);
-      KLibraryEnv oldEnv = _elementMap.libraries.getEnv(oldLibrary);
-      KLibraryData data = _elementMap.libraries.getData(oldLibrary);
-      IndexedLibrary newLibrary = convertLibrary(oldLibrary);
-      JLibraryEnv newEnv = oldEnv.convert(_elementMap, liveMembers);
-      libraryMap[oldEnv.library] =
-          libraries.register<IndexedLibrary, JLibraryData, JLibraryEnv>(
-              newLibrary, data.convert(), newEnv);
-      assert(newLibrary.libraryIndex == oldLibrary.libraryIndex);
-      programEnv.registerLibrary(newEnv);
-    }
-    // TODO(johnniwinther): Filter unused classes.
-    for (int classIndex = 0;
-        classIndex < _elementMap.classes.length;
-        classIndex++) {
-      IndexedClass oldClass = _elementMap.classes.getEntity(classIndex);
-      KClassEnv env = _elementMap.classes.getEnv(oldClass);
-      KClassData data = _elementMap.classes.getData(oldClass);
-      IndexedLibrary oldLibrary = oldClass.library;
-      LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
-      IndexedClass newClass = convertClass(newLibrary, oldClass);
-      JClassEnv newEnv = env.convert(_elementMap, liveMembers);
-      classMap[env.cls] = classes.register(newClass, data.convert(), newEnv);
-      assert(newClass.classIndex == oldClass.classIndex);
-      libraries.getEnv(newClass.library).registerClass(newClass.name, newEnv);
-    }
-    for (int typedefIndex = 0;
-        typedefIndex < _elementMap.typedefs.length;
-        typedefIndex++) {
-      IndexedTypedef oldTypedef = _elementMap.typedefs.getEntity(typedefIndex);
-      KTypedefData data = _elementMap.typedefs.getData(oldTypedef);
-      IndexedLibrary oldLibrary = oldTypedef.library;
-      LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
-      IndexedTypedef newTypedef = convertTypedef(newLibrary, oldTypedef);
-      typedefMap[data.node] = typedefs.register(
-          newTypedef,
-          new JTypedefData(new TypedefType(
-              newTypedef,
-              new List<DartType>.filled(
-                  data.node.typeParameters.length, const DynamicType()),
-              getDartType(data.node.type))));
-      assert(newTypedef.typedefIndex == oldTypedef.typedefIndex);
-    }
-    for (int memberIndex = 0;
-        memberIndex < _elementMap.members.length;
-        memberIndex++) {
-      IndexedMember oldMember = _elementMap.members.getEntity(memberIndex);
-      if (!liveMembers.contains(oldMember)) {
-        members.skipIndex(oldMember.memberIndex);
-        continue;
-      }
-      KMemberData data = _elementMap.members.getData(oldMember);
-      IndexedLibrary oldLibrary = oldMember.library;
-      IndexedClass oldClass = oldMember.enclosingClass;
-      LibraryEntity newLibrary = libraries.getEntity(oldLibrary.libraryIndex);
-      ClassEntity newClass =
-          oldClass != null ? classes.getEntity(oldClass.classIndex) : null;
-      IndexedMember newMember = convertMember(newLibrary, newClass, oldMember);
-      members.register(newMember, data.convert());
-      assert(newMember.memberIndex == oldMember.memberIndex);
-      if (newMember.isField) {
-        fieldMap[data.node] = newMember;
-      } else if (newMember.isConstructor) {
-        constructorMap[data.node] = newMember;
+  MemberEntity convertMember(
+      LibraryEntity library, ClassEntity cls, IndexedMember member) {
+    Name memberName = new Name(member.memberName.text, library,
+        isSetter: member.memberName.isSetter);
+    if (member.isField) {
+      IndexedField field = member;
+      return createField(library, cls, memberName,
+          isStatic: field.isStatic,
+          isAssignable: field.isAssignable,
+          isConst: field.isConst);
+    } else if (member.isConstructor) {
+      IndexedConstructor constructor = member;
+      if (constructor.isFactoryConstructor) {
+        // TODO(redemption): This should be a JFunction.
+        return createFactoryConstructor(
+            cls, memberName, constructor.parameterStructure,
+            isExternal: constructor.isExternal,
+            isConst: constructor.isConst,
+            isFromEnvironmentConstructor:
+                constructor.isFromEnvironmentConstructor);
       } else {
-        methodMap[data.node] = newMember;
+        return createGenerativeConstructor(
+            cls, memberName, constructor.parameterStructure,
+            isExternal: constructor.isExternal, isConst: constructor.isConst);
       }
+    } else if (member.isGetter) {
+      IndexedFunction getter = member;
+      return createGetter(library, cls, memberName, getter.asyncMarker,
+          isStatic: getter.isStatic,
+          isExternal: getter.isExternal,
+          isAbstract: getter.isAbstract);
+    } else if (member.isSetter) {
+      IndexedFunction setter = member;
+      return createSetter(library, cls, memberName,
+          isStatic: setter.isStatic,
+          isExternal: setter.isExternal,
+          isAbstract: setter.isAbstract);
+    } else {
+      IndexedFunction function = member;
+      return createMethod(library, cls, memberName, function.parameterStructure,
+          function.asyncMarker,
+          isStatic: function.isStatic,
+          isExternal: function.isExternal,
+          isAbstract: function.isAbstract);
     }
-    for (int typeVariableIndex = 0;
-        typeVariableIndex < _elementMap.typeVariables.length;
-        typeVariableIndex++) {
-      IndexedTypeVariable oldTypeVariable =
-          _elementMap.typeVariables.getEntity(typeVariableIndex);
-      KTypeVariableData oldTypeVariableData =
-          _elementMap.typeVariables.getData(oldTypeVariable);
-      Entity newTypeDeclaration;
-      if (oldTypeVariable.typeDeclaration is ClassEntity) {
-        IndexedClass cls = oldTypeVariable.typeDeclaration;
-        newTypeDeclaration = classes.getEntity(cls.classIndex);
-        // TODO(johnniwinther): Skip type variables of unused classes.
-      } else if (oldTypeVariable.typeDeclaration is MemberEntity) {
-        IndexedMember member = oldTypeVariable.typeDeclaration;
-        newTypeDeclaration = members.getEntity(member.memberIndex);
-        if (newTypeDeclaration == null) {
-          typeVariables.skipIndex(typeVariableIndex);
-          continue;
-        }
-      } else {
-        assert(oldTypeVariable.typeDeclaration is Local);
-      }
-      IndexedTypeVariable newTypeVariable = createTypeVariable(
-          newTypeDeclaration, oldTypeVariable.name, oldTypeVariable.index);
-      typeVariableMap[oldTypeVariableData.node] =
-          typeVariables.register<IndexedTypeVariable, JTypeVariableData>(
-              newTypeVariable, oldTypeVariableData.copy());
-      assert(newTypeVariable.typeVariableIndex ==
-          oldTypeVariable.typeVariableIndex);
-    }
-    // TODO(johnniwinther): We should close the environment in the beginning of
-    // this constructor but currently we need the [MemberEntity] to query if the
-    // member is live, thus potentially creating the [MemberEntity] in the
-    // process. Avoid this.
-    _elementMap.envIsClosed = true;
   }
 
-  JsKernelToElementMap.readFromDataSource(
-      CompilerOptions options,
-      DiagnosticReporter reporter,
-      Environment environment,
-      ir.Component component,
-      DataSource source)
-      : super(options, reporter, environment) {
-    source.registerComponentLookup(new ComponentLookup(component));
-    _EntityLookup entityLookup = new _EntityLookup();
-    source.registerEntityLookup(entityLookup);
-
-    source.begin(tag);
-    source.begin(libraryTag);
-    int libraryCount = source.readInt();
-    for (int i = 0; i < libraryCount; i++) {
-      int index = source.readInt();
-      JLibrary library = new JLibrary.readFromDataSource(source);
-      entityLookup.registerLibrary(index, library);
-    }
-    source.end(libraryTag);
-
-    source.begin(classTag);
-    int classCount = source.readInt();
-    for (int i = 0; i < classCount; i++) {
-      int index = source.readInt();
-      JClass cls = new JClass.readFromDataSource(source);
-      entityLookup.registerClass(index, cls);
-    }
-    source.end(classTag);
-
-    source.begin(typedefTag);
-    int typedefCount = source.readInt();
-    for (int i = 0; i < typedefCount; i++) {
-      int index = source.readInt();
-      JTypedef typedef = new JTypedef.readFromDataSource(source);
-      entityLookup.registerTypedef(index, typedef);
-    }
-    source.end(typedefTag);
-
-    source.begin(memberTag);
-    int memberCount = source.readInt();
-    for (int i = 0; i < memberCount; i++) {
-      int index = source.readInt();
-      JMember member = new JMember.readFromDataSource(source);
-      entityLookup.registerMember(index, member);
-    }
-    source.end(memberTag);
-
-    source.begin(typeVariableTag);
-    int typeVariableCount = source.readInt();
-    for (int i = 0; i < typeVariableCount; i++) {
-      int index = source.readInt();
-      JTypeVariable typeVariable = new JTypeVariable.readFromDataSource(source);
-      entityLookup.registerTypeVariable(index, typeVariable);
-    }
-    source.end(typeVariableTag);
-
-    programEnv = new JProgramEnv([component]);
-    source.begin(libraryDataTag);
-    entityLookup.forEachLibrary((int index, JLibrary library) {
-      JLibraryEnv env = new JLibraryEnv.readFromDataSource(source);
-      JLibraryData data = new JLibraryData.readFromDataSource(source);
-      libraryMap[env.library] =
-          libraries.registerByIndex(index, library, data, env);
-      programEnv.registerLibrary(env);
-      assert(index == library.libraryIndex);
-    });
-    source.end(libraryDataTag);
-
-    source.begin(classDataTag);
-    entityLookup.forEachClass((int index, JClass cls) {
-      JClassEnv env = new JClassEnv.readFromDataSource(source);
-      JClassData data = new JClassData.readFromDataSource(source);
-      classMap[env.cls] = classes.registerByIndex(index, cls, data, env);
-      libraries.getEnv(cls.library).registerClass(cls.name, env);
-      assert(index == cls.classIndex);
-    });
-    source.end(classDataTag);
-
-    source.begin(typedefDataTag);
-    entityLookup.forEachTypedef((int index, JTypedef typedef) {
-      JTypedefData data = new JTypedefData.readFromDataSource(source);
-      typedefs.registerByIndex(index, typedef, data);
-      assert(index == typedef.typedefIndex);
-    });
-    source.end(typedefDataTag);
-
-    source.begin(memberDataTag);
-    entityLookup.forEachMember((int index, IndexedMember member) {
-      JMemberData data = new JMemberData.readFromDataSource(source);
-      members.registerByIndex(index, member, data);
-      switch (data.definition.kind) {
-        case MemberKind.regular:
-        case MemberKind.constructor:
-          ir.Member node = data.definition.node;
-          if (member.isField) {
-            fieldMap[node] = member;
-          } else if (member.isConstructor) {
-            constructorMap[node] = member;
-          } else {
-            methodMap[node] = member;
-          }
-          break;
-        default:
-      }
-      assert(index == member.memberIndex);
-    });
-    source.end(memberDataTag);
-
-    source.begin(typeVariableDataTag);
-    entityLookup.forEachTypeVariable((int index, JTypeVariable typeVariable) {
-      JTypeVariableData data = new JTypeVariableData.readFromDataSource(source);
-      typeVariableMap[data.node] =
-          typeVariables.registerByIndex(index, typeVariable, data);
-      assert(index == typeVariable.typeVariableIndex);
-    });
-    source.end(typeVariableDataTag);
-    source.end(tag);
-  }
-
-  /// Serializes this [JsToElementMap] to [sink].
-  void writeToDataSink(DataSink sink) {
-    sink.begin(tag);
-
-    // Serialize the entities before serializing the data.
-    sink.begin(libraryTag);
-    sink.writeInt(libraries.size);
-    libraries.forEach((JLibrary library, _, __) {
-      sink.writeInt(library.libraryIndex);
-      library.writeToDataSink(sink);
-    });
-    sink.end(libraryTag);
-
-    sink.begin(classTag);
-    sink.writeInt(classes.size);
-    classes.forEach((JClass cls, _, __) {
-      sink.writeInt(cls.classIndex);
-      cls.writeToDataSink(sink);
-    });
-    sink.end(classTag);
-
-    sink.begin(typedefTag);
-    sink.writeInt(typedefs.size);
-    typedefs.forEach((JTypedef typedef, _) {
-      sink.writeInt(typedef.typedefIndex);
-      typedef.writeToDataSink(sink);
-    });
-    sink.end(typedefTag);
-
-    sink.begin(memberTag);
-    sink.writeInt(members.size);
-    members.forEach((JMember member, _) {
-      sink.writeInt(member.memberIndex);
-      member.writeToDataSink(sink);
-    });
-    sink.end(memberTag);
-
-    sink.begin(typeVariableTag);
-    sink.writeInt(typeVariables.size);
-    typeVariables.forEach((JTypeVariable typeVariable, _) {
-      sink.writeInt(typeVariable.typeVariableIndex);
-      typeVariable.writeToDataSink(sink);
-    });
-    sink.end(typeVariableTag);
-
-    // Serialize the entity data after having serialized the entities.
-    sink.begin(libraryDataTag);
-    libraries.forEach((_, JLibraryData data, JLibraryEnv env) {
-      env.writeToDataSink(sink);
-      data.writeToDataSink(sink);
-    });
-    sink.end(libraryDataTag);
-
-    sink.begin(classDataTag);
-    classes.forEach((_, JClassData data, JClassEnv env) {
-      env.writeToDataSink(sink);
-      data.writeToDataSink(sink);
-    });
-    sink.end(classDataTag);
-
-    sink.begin(typedefDataTag);
-    typedefs.forEach((_, JTypedefData data) {
-      data.writeToDataSink(sink);
-    });
-    sink.end(typedefDataTag);
-
-    sink.begin(memberDataTag);
-    members.forEach((_, JMemberData data) {
-      data.writeToDataSink(sink);
-    });
-    sink.end(memberDataTag);
-
-    sink.begin(typeVariableDataTag);
-    typeVariables.forEach((_, JTypeVariableData data) {
-      data.writeToDataSink(sink);
-    });
-    sink.end(typeVariableDataTag);
-
-    sink.end(tag);
-  }
-
-  @override
   void forEachNestedClosure(
       MemberEntity member, void f(FunctionEntity closure)) {
     assert(checkFamily(member));
@@ -1818,7 +1599,6 @@
     return members.getData(member).classTypeVariableAccess;
   }
 
-  @override
   bool checkFamily(Entity entity) {
     assert(
         '$entity'.startsWith(jsElementPrefix),
@@ -1837,47 +1617,40 @@
     return sourceSpan;
   }
 
-  @override
   Iterable<LibraryEntity> get libraryListInternal {
     return libraryMap.values;
   }
 
-  @override
   LibraryEntity getLibraryInternal(ir.Library node, [JLibraryEnv env]) {
     LibraryEntity library = libraryMap[node];
     assert(library != null, "No library entity for $node");
     return library;
   }
 
-  @override
   ClassEntity getClassInternal(ir.Class node, [JClassEnv env]) {
     ClassEntity cls = classMap[node];
     assert(cls != null, "No class entity for $node");
     return cls;
   }
 
-  @override
   FieldEntity getFieldInternal(ir.Field node) {
     FieldEntity field = fieldMap[node];
     assert(field != null, "No field entity for $node");
     return field;
   }
 
-  @override
   FunctionEntity getMethodInternal(ir.Procedure node) {
     FunctionEntity function = methodMap[node];
     assert(function != null, "No function entity for $node");
     return function;
   }
 
-  @override
   ConstructorEntity getConstructorInternal(ir.Member node) {
     ConstructorEntity constructor = constructorMap[node];
     assert(constructor != null, "No constructor entity for $node");
     return constructor;
   }
 
-  @override
   TypeVariableEntity getTypeVariableInternal(ir.TypeParameter node) {
     TypeVariableEntity typeVariable = typeVariableMap[node];
     if (typeVariable == null) {
@@ -1906,7 +1679,6 @@
     return typeVariable;
   }
 
-  @override
   TypedefEntity getTypedefInternal(ir.Typedef node) {
     TypedefEntity typedef = typedefMap[node];
     assert(typedef != null, "No typedef entity for $node");
@@ -1926,8 +1698,11 @@
       JConstructorBody constructorBody = createConstructorBody(constructor);
       members.register<IndexedFunction, FunctionData>(
           constructorBody,
-          new ConstructorBodyDataImpl(node, node.function,
-              new SpecialMemberDefinition(node, MemberKind.constructorBody)));
+          new ConstructorBodyDataImpl(
+              node,
+              node.function,
+              new SpecialMemberDefinition(node, MemberKind.constructorBody),
+              data.staticTypes));
       IndexedClass cls = constructor.enclosingClass;
       JClassEnvImpl classEnv = classes.getEnv(cls);
       // TODO(johnniwinther): Avoid this by only including live members in the
@@ -1939,9 +1714,6 @@
   }
 
   @override
-  JConstructorBody createConstructorBody(ConstructorEntity constructor);
-
-  @override
   MemberDefinition getMemberDefinition(MemberEntity member) {
     return getMemberDefinitionInternal(member);
   }
@@ -1977,14 +1749,12 @@
     data.forEachParameter(this, f);
   }
 
-  @override
   void forEachConstructorBody(
       IndexedClass cls, void f(ConstructorBodyEntity member)) {
     JClassEnv env = classes.getEnv(cls);
     env.forEachConstructorBody(f);
   }
 
-  @override
   void forEachInjectedClassMember(
       IndexedClass cls, void f(MemberEntity member)) {
     _injectedClassMembers[cls]?.forEach(f);
@@ -2396,10 +2166,6 @@
   }
 
   @override
-  JGeneratorBody createGeneratorBody(
-      FunctionEntity function, DartType elementType);
-
-  @override
   js.Template getJsBuiltinTemplate(
       ConstantValue constant, CodeEmitterTask emitter) {
     int index = extractEnumIndexFromConstantValue(
@@ -2409,9 +2175,371 @@
   }
 }
 
+class JsElementEnvironment extends ElementEnvironment
+    implements JElementEnvironment {
+  final JsKernelToElementMap elementMap;
+
+  JsElementEnvironment(this.elementMap);
+
+  @override
+  DartType get dynamicType => const DynamicType();
+
+  @override
+  LibraryEntity get mainLibrary => elementMap._mainLibrary;
+
+  @override
+  FunctionEntity get mainFunction => elementMap._mainFunction;
+
+  @override
+  Iterable<LibraryEntity> get libraries => elementMap.libraryListInternal;
+
+  @override
+  String getLibraryName(LibraryEntity library) {
+    return elementMap._getLibraryName(library);
+  }
+
+  @override
+  InterfaceType getThisType(ClassEntity cls) {
+    return elementMap.getThisType(cls);
+  }
+
+  @override
+  InterfaceType getRawType(ClassEntity cls) {
+    return elementMap._getRawType(cls);
+  }
+
+  @override
+  bool isGenericClass(ClassEntity cls) {
+    return getThisType(cls).typeArguments.isNotEmpty;
+  }
+
+  @override
+  bool isMixinApplication(ClassEntity cls) {
+    return elementMap._isMixinApplication(cls);
+  }
+
+  @override
+  bool isUnnamedMixinApplication(ClassEntity cls) {
+    return elementMap._isUnnamedMixinApplication(cls);
+  }
+
+  @override
+  bool isSuperMixinApplication(ClassEntity cls) {
+    return elementMap._isSuperMixinApplication(cls);
+  }
+
+  @override
+  ClassEntity getEffectiveMixinClass(ClassEntity cls) {
+    if (!isMixinApplication(cls)) return null;
+    do {
+      cls = elementMap.getAppliedMixin(cls);
+    } while (isMixinApplication(cls));
+    return cls;
+  }
+
+  @override
+  DartType getTypeVariableBound(TypeVariableEntity typeVariable) {
+    return elementMap.getTypeVariableBound(typeVariable);
+  }
+
+  @override
+  DartType getTypeVariableDefaultType(TypeVariableEntity typeVariable) {
+    return elementMap._getTypeVariableDefaultType(typeVariable);
+  }
+
+  @override
+  InterfaceType createInterfaceType(
+      ClassEntity cls, List<DartType> typeArguments) {
+    return new InterfaceType(cls, typeArguments);
+  }
+
+  @override
+  FunctionType getFunctionType(FunctionEntity function) {
+    return elementMap._getFunctionType(function);
+  }
+
+  @override
+  List<TypeVariableType> getFunctionTypeVariables(FunctionEntity function) {
+    return elementMap._getFunctionTypeVariables(function);
+  }
+
+  @override
+  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function) {
+    // TODO(sra): Should be getting the DartType from the node.
+    DartType returnType = getFunctionType(function).returnType;
+    return getAsyncOrSyncStarElementType(function.asyncMarker, returnType);
+  }
+
+  @override
+  DartType getAsyncOrSyncStarElementType(
+      AsyncMarker asyncMarker, DartType returnType) {
+    switch (asyncMarker) {
+      case AsyncMarker.SYNC:
+        return returnType;
+      case AsyncMarker.SYNC_STAR:
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.iterableClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+      case AsyncMarker.ASYNC:
+        if (returnType is FutureOrType) return returnType.typeArgument;
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.futureClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+      case AsyncMarker.ASYNC_STAR:
+        if (returnType is InterfaceType) {
+          if (returnType.element == elementMap.commonElements.streamClass) {
+            return returnType.typeArguments.first;
+          }
+        }
+        return dynamicType;
+    }
+    assert(false, 'Unexpected marker ${asyncMarker}');
+    return null;
+  }
+
+  @override
+  DartType getFieldType(FieldEntity field) {
+    return elementMap._getFieldType(field);
+  }
+
+  @override
+  FunctionType getLocalFunctionType(covariant KLocalFunction function) {
+    return function.functionType;
+  }
+
+  @override
+  DartType getUnaliasedType(DartType type) => type;
+
+  @override
+  ConstructorEntity lookupConstructor(ClassEntity cls, String name,
+      {bool required: false}) {
+    ConstructorEntity constructor = elementMap.lookupConstructor(cls, name);
+    if (constructor == null && required) {
+      throw failedAt(
+          CURRENT_ELEMENT_SPANNABLE,
+          "The constructor '$name' was not found in class '${cls.name}' "
+          "in library ${cls.library.canonicalUri}.");
+    }
+    return constructor;
+  }
+
+  @override
+  MemberEntity lookupLocalClassMember(ClassEntity cls, String name,
+      {bool setter: false, bool required: false}) {
+    MemberEntity member =
+        elementMap.lookupClassMember(cls, name, setter: setter);
+    if (member == null && required) {
+      throw failedAt(CURRENT_ELEMENT_SPANNABLE,
+          "The member '$name' was not found in ${cls.name}.");
+    }
+    return member;
+  }
+
+  @override
+  ClassEntity getSuperClass(ClassEntity cls,
+      {bool skipUnnamedMixinApplications: false}) {
+    assert(elementMap.checkFamily(cls));
+    ClassEntity superclass = elementMap.getSuperType(cls)?.element;
+    if (skipUnnamedMixinApplications) {
+      while (superclass != null &&
+          elementMap._isUnnamedMixinApplication(superclass)) {
+        superclass = elementMap.getSuperType(superclass)?.element;
+      }
+    }
+    return superclass;
+  }
+
+  @override
+  void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) {
+    elementMap._forEachSupertype(cls, f);
+  }
+
+  @override
+  void forEachLocalClassMember(ClassEntity cls, void f(MemberEntity member)) {
+    elementMap._forEachLocalClassMember(cls, f);
+  }
+
+  @override
+  void forEachInjectedClassMember(
+      ClassEntity cls, void f(MemberEntity member)) {
+    elementMap.forEachInjectedClassMember(cls, f);
+  }
+
+  @override
+  void forEachClassMember(
+      ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) {
+    elementMap._forEachClassMember(cls, f);
+  }
+
+  @override
+  void forEachConstructor(
+      ClassEntity cls, void f(ConstructorEntity constructor)) {
+    elementMap._forEachConstructor(cls, f);
+  }
+
+  @override
+  void forEachConstructorBody(
+      ClassEntity cls, void f(ConstructorBodyEntity constructor)) {
+    elementMap.forEachConstructorBody(cls, f);
+  }
+
+  @override
+  void forEachNestedClosure(
+      MemberEntity member, void f(FunctionEntity closure)) {
+    elementMap.forEachNestedClosure(member, f);
+  }
+
+  @override
+  void forEachLibraryMember(
+      LibraryEntity library, void f(MemberEntity member)) {
+    elementMap._forEachLibraryMember(library, f);
+  }
+
+  @override
+  MemberEntity lookupLibraryMember(LibraryEntity library, String name,
+      {bool setter: false, bool required: false}) {
+    MemberEntity member =
+        elementMap.lookupLibraryMember(library, name, setter: setter);
+    if (member == null && required) {
+      failedAt(CURRENT_ELEMENT_SPANNABLE,
+          "The member '${name}' was not found in library '${library.name}'.");
+    }
+    return member;
+  }
+
+  @override
+  ClassEntity lookupClass(LibraryEntity library, String name,
+      {bool required: false}) {
+    ClassEntity cls = elementMap.lookupClass(library, name);
+    if (cls == null && required) {
+      failedAt(CURRENT_ELEMENT_SPANNABLE,
+          "The class '$name'  was not found in library '${library.name}'.");
+    }
+    return cls;
+  }
+
+  @override
+  void forEachClass(LibraryEntity library, void f(ClassEntity cls)) {
+    elementMap._forEachClass(library, f);
+  }
+
+  @override
+  LibraryEntity lookupLibrary(Uri uri, {bool required: false}) {
+    LibraryEntity library = elementMap.lookupLibrary(uri);
+    if (library == null && required) {
+      failedAt(CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found.");
+    }
+    return library;
+  }
+
+  @override
+  bool isEnumClass(ClassEntity cls) {
+    assert(elementMap.checkFamily(cls));
+    JClassData classData = elementMap.classes.getData(cls);
+    return classData.isEnumClass;
+  }
+}
+
+/// [BehaviorBuilder] for kernel based elements.
+class JsBehaviorBuilder extends BehaviorBuilder {
+  final ElementEnvironment elementEnvironment;
+  final CommonElements commonElements;
+  final DiagnosticReporter reporter;
+  final NativeBasicData nativeBasicData;
+  final CompilerOptions _options;
+
+  JsBehaviorBuilder(this.elementEnvironment, this.commonElements,
+      this.nativeBasicData, this.reporter, this._options);
+
+  @override
+  bool get trustJSInteropTypeAnnotations =>
+      _options.trustJSInteropTypeAnnotations;
+}
+
+/// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using
+/// [_EvaluationEnvironment] for the evaluation.
+class JsConstantEnvironment implements ConstantEnvironment {
+  final JsKernelToElementMap _elementMap;
+  final Environment _environment;
+
+  Map<ConstantExpression, ConstantValue> _valueMap =
+      <ConstantExpression, ConstantValue>{};
+
+  JsConstantEnvironment(this._elementMap, this._environment);
+
+  @override
+  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
+
+  ConstantValue _getConstantValue(
+      Spannable spannable, ConstantExpression expression,
+      {bool constantRequired}) {
+    return _valueMap.putIfAbsent(expression, () {
+      return expression.evaluate(
+          new JsEvaluationEnvironment(_elementMap, _environment, spannable,
+              constantRequired: constantRequired),
+          constantSystem);
+    });
+  }
+}
+
+/// Evaluation environment used for computing [ConstantValue]s for
+/// kernel based [ConstantExpression]s.
+class JsEvaluationEnvironment extends EvaluationEnvironmentBase {
+  final JsKernelToElementMap _elementMap;
+  final Environment _environment;
+
+  JsEvaluationEnvironment(
+      this._elementMap, this._environment, Spannable spannable,
+      {bool constantRequired})
+      : super(spannable, constantRequired: constantRequired);
+
+  @override
+  CommonElements get commonElements => _elementMap.commonElements;
+
+  @override
+  DartTypes get types => _elementMap.types;
+
+  @override
+  DartType substByContext(DartType base, InterfaceType target) {
+    return _elementMap.substByContext(base, target);
+  }
+
+  @override
+  ConstantConstructor getConstructorConstant(ConstructorEntity constructor) {
+    return _elementMap._getConstructorConstant(constructor);
+  }
+
+  @override
+  ConstantExpression getFieldConstant(FieldEntity field) {
+    return _elementMap._getFieldConstantExpression(field);
+  }
+
+  @override
+  ConstantExpression getLocalConstant(Local local) {
+    throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant");
+  }
+
+  @override
+  String readFromEnvironment(String name) {
+    return _environment.valueOf(name);
+  }
+
+  @override
+  DiagnosticReporter get reporter => _elementMap.reporter;
+
+  @override
+  bool get enableAssertions => _elementMap.options.enableUserAssertions;
+}
+
 class JsToFrontendMapImpl extends JsToFrontendMapBase
     implements JsToFrontendMap {
-  final JsToElementMapBase _backend;
+  final JsKernelToElementMap _backend;
 
   JsToFrontendMapImpl(this._backend);
 
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index f964ef9..cc98750 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -106,146 +106,6 @@
   TypeVariableEntity toBackendTypeVariable(TypeVariableEntity typeVariable);
 }
 
-// TODO(johnniwinther): Merge this with [JsKernelToElementMap].
-class JsElementCreatorMixin {
-  IndexedLibrary createLibrary(String name, Uri canonicalUri) {
-    return new JLibrary(name, canonicalUri);
-  }
-
-  IndexedClass createClass(LibraryEntity library, String name,
-      {bool isAbstract}) {
-    return new JClass(library, name, isAbstract: isAbstract);
-  }
-
-  IndexedTypedef createTypedef(LibraryEntity library, String name) {
-    return new JTypedef(library, name);
-  }
-
-  TypeVariableEntity createTypeVariable(
-      Entity typeDeclaration, String name, int index) {
-    return new JTypeVariable(typeDeclaration, name, index);
-  }
-
-  IndexedConstructor createGenerativeConstructor(ClassEntity enclosingClass,
-      Name name, ParameterStructure parameterStructure,
-      {bool isExternal, bool isConst}) {
-    return new JGenerativeConstructor(enclosingClass, name, parameterStructure,
-        isExternal: isExternal, isConst: isConst);
-  }
-
-  IndexedConstructor createFactoryConstructor(ClassEntity enclosingClass,
-      Name name, ParameterStructure parameterStructure,
-      {bool isExternal, bool isConst, bool isFromEnvironmentConstructor}) {
-    return new JFactoryConstructor(enclosingClass, name, parameterStructure,
-        isExternal: isExternal,
-        isConst: isConst,
-        isFromEnvironmentConstructor: isFromEnvironmentConstructor);
-  }
-
-  JConstructorBody createConstructorBody(ConstructorEntity constructor) {
-    return new JConstructorBody(constructor);
-  }
-
-  JGeneratorBody createGeneratorBody(
-      FunctionEntity function, DartType elementType) {
-    return new JGeneratorBody(function, elementType);
-  }
-
-  IndexedFunction createGetter(LibraryEntity library,
-      ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker,
-      {bool isStatic, bool isExternal, bool isAbstract}) {
-    return new JGetter(library, enclosingClass, name, asyncMarker,
-        isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
-  }
-
-  IndexedFunction createMethod(
-      LibraryEntity library,
-      ClassEntity enclosingClass,
-      Name name,
-      ParameterStructure parameterStructure,
-      AsyncMarker asyncMarker,
-      {bool isStatic,
-      bool isExternal,
-      bool isAbstract}) {
-    return new JMethod(
-        library, enclosingClass, name, parameterStructure, asyncMarker,
-        isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
-  }
-
-  IndexedFunction createSetter(
-      LibraryEntity library, ClassEntity enclosingClass, Name name,
-      {bool isStatic, bool isExternal, bool isAbstract}) {
-    return new JSetter(library, enclosingClass, name,
-        isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
-  }
-
-  IndexedField createField(
-      LibraryEntity library, ClassEntity enclosingClass, Name name,
-      {bool isStatic, bool isAssignable, bool isConst}) {
-    return new JField(library, enclosingClass, name,
-        isStatic: isStatic, isAssignable: isAssignable, isConst: isConst);
-  }
-
-  LibraryEntity convertLibrary(IndexedLibrary library) {
-    return createLibrary(library.name, library.canonicalUri);
-  }
-
-  ClassEntity convertClass(LibraryEntity library, IndexedClass cls) {
-    return createClass(library, cls.name, isAbstract: cls.isAbstract);
-  }
-
-  TypedefEntity convertTypedef(LibraryEntity library, IndexedTypedef typedef) {
-    return createTypedef(library, typedef.name);
-  }
-
-  MemberEntity convertMember(
-      LibraryEntity library, ClassEntity cls, IndexedMember member) {
-    Name memberName = new Name(member.memberName.text, library,
-        isSetter: member.memberName.isSetter);
-    if (member.isField) {
-      IndexedField field = member;
-      return createField(library, cls, memberName,
-          isStatic: field.isStatic,
-          isAssignable: field.isAssignable,
-          isConst: field.isConst);
-    } else if (member.isConstructor) {
-      IndexedConstructor constructor = member;
-      if (constructor.isFactoryConstructor) {
-        // TODO(redemption): This should be a JFunction.
-        return createFactoryConstructor(
-            cls, memberName, constructor.parameterStructure,
-            isExternal: constructor.isExternal,
-            isConst: constructor.isConst,
-            isFromEnvironmentConstructor:
-                constructor.isFromEnvironmentConstructor);
-      } else {
-        return createGenerativeConstructor(
-            cls, memberName, constructor.parameterStructure,
-            isExternal: constructor.isExternal, isConst: constructor.isConst);
-      }
-    } else if (member.isGetter) {
-      IndexedFunction getter = member;
-      return createGetter(library, cls, memberName, getter.asyncMarker,
-          isStatic: getter.isStatic,
-          isExternal: getter.isExternal,
-          isAbstract: getter.isAbstract);
-    } else if (member.isSetter) {
-      IndexedFunction setter = member;
-      return createSetter(library, cls, memberName,
-          isStatic: setter.isStatic,
-          isExternal: setter.isExternal,
-          isAbstract: setter.isAbstract);
-    } else {
-      IndexedFunction function = member;
-      return createMethod(library, cls, memberName, function.parameterStructure,
-          function.asyncMarker,
-          isStatic: function.isStatic,
-          isExternal: function.isExternal,
-          isAbstract: function.isAbstract);
-    }
-  }
-}
-
 typedef Entity EntityConverter(Entity cls);
 
 class TypeConverter implements DartTypeVisitor<DartType, EntityConverter> {
@@ -901,7 +761,8 @@
     bool isExternal = source.readBool();
     bool isAbstract = source.readBool();
     source.end(tag);
-    return new JSetter(library, enclosingClass, new Name(name, library),
+    return new JSetter(
+        library, enclosingClass, new Name(name, library, isSetter: true),
         isStatic: isStatic, isExternal: isExternal, isAbstract: isAbstract);
   }
 
diff --git a/pkg/compiler/lib/src/js_model/env.dart b/pkg/compiler/lib/src/js_model/env.dart
index 876106a..a22112b 100644
--- a/pkg/compiler/lib/src/js_model/env.dart
+++ b/pkg/compiler/lib/src/js_model/env.dart
@@ -140,7 +140,12 @@
     int importCount = source.readInt();
     Map<ir.LibraryDependency, ImportEntity> imports;
     if (importCount > 0) {
-      // TODO(johnniwinther): Deserialize imports.
+      imports = {};
+      for (int i = 0; i < importCount; i++) {
+        int index = source.readInt();
+        ImportEntity import = source.readImport();
+        imports[library.dependencies[index]] = import;
+      }
     }
     source.end(tag);
     return new JLibraryData(library, imports);
@@ -153,7 +158,15 @@
       sink.writeInt(0);
     } else {
       sink.writeInt(imports.length);
-      // TODO(johnniwinther): Serialize imports.
+      int index = 0;
+      for (ir.LibraryDependency node in library.dependencies) {
+        ImportEntity import = imports[node];
+        if (import != null) {
+          sink.writeInt(index);
+          sink.writeImport(import);
+        }
+        index++;
+      }
     }
     sink.end(tag);
   }
@@ -496,6 +509,8 @@
 
   ClassTypeVariableAccess get classTypeVariableAccess;
 
+  Map<ir.Expression, ir.DartType> get staticTypes;
+
   JMemberData();
 
   /// Deserializes a [JMemberData] object from [source].
@@ -531,7 +546,9 @@
 
   final MemberDefinition definition;
 
-  JMemberDataImpl(this.node, this.definition);
+  final Map<ir.Expression, ir.DartType> staticTypes;
+
+  JMemberDataImpl(this.node, this.definition, this.staticTypes);
 
   InterfaceType getMemberThisType(JsToElementMap elementMap) {
     MemberEntity member = elementMap.getMember(node);
@@ -557,7 +574,7 @@
   List<TypeVariableType> _typeVariables;
 
   List<TypeVariableType> getFunctionTypeVariables(
-      covariant JsToElementMapBase elementMap) {
+      covariant JsKernelToElementMap elementMap) {
     if (_typeVariables == null) {
       if (functionNode.typeParameters.isEmpty) {
         _typeVariables = const <TypeVariableType>[];
@@ -590,9 +607,9 @@
   final ir.FunctionNode functionNode;
   FunctionType _type;
 
-  FunctionDataImpl(
-      ir.Member node, this.functionNode, MemberDefinition definition)
-      : super(node, definition);
+  FunctionDataImpl(ir.Member node, this.functionNode,
+      MemberDefinition definition, Map<ir.Expression, ir.DartType> staticTypes)
+      : super(node, definition, staticTypes);
 
   factory FunctionDataImpl.readFromDataSource(DataSource source) {
     source.begin(tag);
@@ -608,8 +625,10 @@
     }
     MemberDefinition definition =
         new MemberDefinition.readFromDataSource(source);
+    Map<ir.Expression, ir.DartType> staticTypes =
+        source.readTreeNodeMap(() => source.readDartTypeNode());
     source.end(tag);
-    return new FunctionDataImpl(node, functionNode, definition);
+    return new FunctionDataImpl(node, functionNode, definition, staticTypes);
   }
 
   void writeToDataSink(DataSink sink) {
@@ -617,10 +636,11 @@
     sink.begin(tag);
     sink.writeMemberNode(node);
     definition.writeToDataSink(sink);
+    sink.writeTreeNodeMap(staticTypes, sink.writeDartTypeNode);
     sink.end(tag);
   }
 
-  FunctionType getFunctionType(covariant JsToElementMapBase elementMap) {
+  FunctionType getFunctionType(covariant JsKernelToElementMap elementMap) {
     return _type ??= elementMap.getFunctionType(functionNode);
   }
 
@@ -692,7 +712,10 @@
     sink.end(tag);
   }
 
-  FunctionType getFunctionType(covariant JsToElementMapBase elementMap) {
+  @override
+  Map<ir.Expression, ir.DartType> get staticTypes => const {};
+
+  FunctionType getFunctionType(covariant JsKernelToElementMap elementMap) {
     throw new UnsupportedError("SignatureFunctionData.getFunctionType");
   }
 
@@ -718,7 +741,7 @@
 
   DelegatedFunctionData(this.baseData);
 
-  FunctionType getFunctionType(covariant JsToElementMapBase elementMap) {
+  FunctionType getFunctionType(covariant JsKernelToElementMap elementMap) {
     return baseData.getFunctionType(elementMap);
   }
 
@@ -766,11 +789,14 @@
     definition.writeToDataSink(sink);
     sink.end(tag);
   }
+
+  @override
+  Map<ir.Expression, ir.DartType> get staticTypes => const {};
 }
 
 abstract class JConstructorData extends FunctionData {
   ConstantConstructor getConstructorConstant(
-      JsToElementMapBase elementMap, ConstructorEntity constructor);
+      JsKernelToElementMap elementMap, ConstructorEntity constructor);
 }
 
 class JConstructorDataImpl extends FunctionDataImpl
@@ -782,9 +808,9 @@
   ConstantConstructor _constantConstructor;
   JConstructorBody constructorBody;
 
-  JConstructorDataImpl(
-      ir.Member node, ir.FunctionNode functionNode, MemberDefinition definition)
-      : super(node, functionNode, definition);
+  JConstructorDataImpl(ir.Member node, ir.FunctionNode functionNode,
+      MemberDefinition definition, Map<ir.Expression, ir.DartType> staticTypes)
+      : super(node, functionNode, definition, staticTypes);
 
   factory JConstructorDataImpl.readFromDataSource(DataSource source) {
     source.begin(tag);
@@ -800,8 +826,11 @@
     }
     MemberDefinition definition =
         new MemberDefinition.readFromDataSource(source);
+    Map<ir.Expression, ir.DartType> staticTypes =
+        source.readTreeNodeMap(() => source.readDartTypeNode());
     source.end(tag);
-    return new JConstructorDataImpl(node, functionNode, definition);
+    return new JConstructorDataImpl(
+        node, functionNode, definition, staticTypes);
   }
 
   void writeToDataSink(DataSink sink) {
@@ -810,11 +839,12 @@
     sink.writeMemberNode(node);
     definition.writeToDataSink(sink);
     assert(constructorBody == null);
+    sink.writeTreeNodeMap(staticTypes, sink.writeDartTypeNode);
     sink.end(tag);
   }
 
   ConstantConstructor getConstructorConstant(
-      JsToElementMapBase elementMap, ConstructorEntity constructor) {
+      JsKernelToElementMap elementMap, ConstructorEntity constructor) {
     if (_constantConstructor == null) {
       if (node is ir.Constructor && constructor.isConst) {
         _constantConstructor =
@@ -839,9 +869,9 @@
   /// a debugging data stream.
   static const String tag = 'constructor-body-data';
 
-  ConstructorBodyDataImpl(
-      ir.Member node, ir.FunctionNode functionNode, MemberDefinition definition)
-      : super(node, functionNode, definition);
+  ConstructorBodyDataImpl(ir.Member node, ir.FunctionNode functionNode,
+      MemberDefinition definition, Map<ir.Expression, ir.DartType> staticTypes)
+      : super(node, functionNode, definition, staticTypes);
 
   factory ConstructorBodyDataImpl.readFromDataSource(DataSource source) {
     source.begin(tag);
@@ -857,8 +887,11 @@
     }
     MemberDefinition definition =
         new MemberDefinition.readFromDataSource(source);
+    Map<ir.Expression, ir.DartType> staticTypes =
+        source.readTreeNodeMap(() => source.readDartTypeNode());
     source.end(tag);
-    return new ConstructorBodyDataImpl(node, functionNode, definition);
+    return new ConstructorBodyDataImpl(
+        node, functionNode, definition, staticTypes);
   }
 
   void writeToDataSink(DataSink sink) {
@@ -866,6 +899,7 @@
     sink.begin(tag);
     sink.writeMemberNode(node);
     definition.writeToDataSink(sink);
+    sink.writeTreeNodeMap(staticTypes, sink.writeDartTypeNode);
     sink.end(tag);
   }
 
@@ -879,15 +913,16 @@
 abstract class JFieldData extends JMemberData {
   DartType getFieldType(IrToElementMap elementMap);
 
-  ConstantExpression getFieldConstantExpression(JsToElementMapBase elementMap);
+  ConstantExpression getFieldConstantExpression(
+      JsKernelToElementMap elementMap);
 
   /// Return the [ConstantValue] the initial value of [field] or `null` if
   /// the initializer is not a constant expression.
-  ConstantValue getFieldConstantValue(JsToElementMapBase elementMap);
+  ConstantValue getFieldConstantValue(JsKernelToElementMap elementMap);
 
-  bool hasConstantFieldInitializer(JsToElementMapBase elementMap);
+  bool hasConstantFieldInitializer(JsKernelToElementMap elementMap);
 
-  ConstantValue getConstantFieldInitializer(JsToElementMapBase elementMap);
+  ConstantValue getConstantFieldInitializer(JsKernelToElementMap elementMap);
 }
 
 class JFieldDataImpl extends JMemberDataImpl implements JFieldData {
@@ -900,16 +935,19 @@
   ConstantValue _constantValue;
   ConstantExpression _constantExpression;
 
-  JFieldDataImpl(ir.Field node, MemberDefinition definition)
-      : super(node, definition);
+  JFieldDataImpl(ir.Field node, MemberDefinition definition,
+      Map<ir.Expression, ir.DartType> staticTypes)
+      : super(node, definition, staticTypes);
 
   factory JFieldDataImpl.readFromDataSource(DataSource source) {
     source.begin(tag);
     ir.Member node = source.readMemberNode();
     MemberDefinition definition =
         new MemberDefinition.readFromDataSource(source);
+    Map<ir.Expression, ir.DartType> staticTypes =
+        source.readTreeNodeMap(() => source.readDartTypeNode());
     source.end(tag);
-    return new JFieldDataImpl(node, definition);
+    return new JFieldDataImpl(node, definition, staticTypes);
   }
 
   void writeToDataSink(DataSink sink) {
@@ -917,16 +955,18 @@
     sink.begin(tag);
     sink.writeMemberNode(node);
     definition.writeToDataSink(sink);
+    sink.writeTreeNodeMap(staticTypes, sink.writeDartTypeNode);
     sink.end(tag);
   }
 
   ir.Field get node => super.node;
 
-  DartType getFieldType(covariant JsToElementMapBase elementMap) {
+  DartType getFieldType(covariant JsKernelToElementMap elementMap) {
     return _type ??= elementMap.getDartType(node.type);
   }
 
-  ConstantExpression getFieldConstantExpression(JsToElementMapBase elementMap) {
+  ConstantExpression getFieldConstantExpression(
+      JsKernelToElementMap elementMap) {
     if (_constantExpression == null) {
       if (node.isConst) {
         _constantExpression =
@@ -942,7 +982,7 @@
   }
 
   @override
-  ConstantValue getFieldConstantValue(JsToElementMapBase elementMap) {
+  ConstantValue getFieldConstantValue(JsKernelToElementMap elementMap) {
     if (!_isConstantComputed) {
       _constantValue = elementMap.getConstantValue(node.initializer,
           requireConstant: node.isConst, implicitNull: !node.isConst);
@@ -952,12 +992,12 @@
   }
 
   @override
-  bool hasConstantFieldInitializer(JsToElementMapBase elementMap) {
+  bool hasConstantFieldInitializer(JsKernelToElementMap elementMap) {
     return getFieldConstantValue(elementMap) != null;
   }
 
   @override
-  ConstantValue getConstantFieldInitializer(JsToElementMapBase elementMap) {
+  ConstantValue getConstantFieldInitializer(JsKernelToElementMap elementMap) {
     ConstantValue value = getFieldConstantValue(elementMap);
     assert(
         value != null,
@@ -980,19 +1020,22 @@
   /// a debugging data stream.
   static const String tag = 'typedef-data';
 
+  final ir.Typedef node;
   final TypedefType rawType;
 
-  JTypedefData(this.rawType);
+  JTypedefData(this.node, this.rawType);
 
   factory JTypedefData.readFromDataSource(DataSource source) {
     source.begin(tag);
+    ir.Typedef node = source.readTypedefNode();
     TypedefType rawType = source.readDartType();
     source.end(tag);
-    return new JTypedefData(rawType);
+    return new JTypedefData(node, rawType);
   }
 
   void writeToDataSink(DataSink sink) {
     sink.begin(tag);
+    sink.writeTypedefNode(node);
     sink.writeDartType(rawType);
     sink.end(tag);
   }
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 3421f91..22b6f9d8 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -7,61 +7,40 @@
 import 'package:kernel/ast.dart' as ir;
 
 import '../backend_strategy.dart';
-import '../closure.dart';
 import '../common.dart';
 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
 import '../common/tasks.dart';
-import '../common_elements.dart';
 import '../compiler.dart';
-import '../constants/constant_system.dart';
-import '../constants/values.dart';
 import '../deferred_load.dart';
-import '../diagnostics/diagnostic_listener.dart';
 import '../elements/entities.dart';
-import '../elements/names.dart';
-import '../elements/types.dart';
-import '../elements/entity_utils.dart' as utils;
-import '../environment.dart';
 import '../enqueue.dart';
 import '../io/kernel_source_information.dart'
     show KernelSourceInformationStrategy;
 import '../io/source_information.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../inferrer/type_graph_inferrer.dart';
-import '../js_emitter/sorter.dart';
+import '../inferrer/types.dart';
 import '../js/js_source_mapping.dart';
-import '../js_backend/annotations.dart';
-import '../js_backend/allocator_analysis.dart';
 import '../js_backend/backend.dart';
-import '../js_backend/backend_usage.dart';
-import '../js_backend/constant_system_javascript.dart';
 import '../js_backend/inferred_data.dart';
-import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
-import '../js_backend/no_such_method_registry.dart';
-import '../js_backend/runtime_types.dart';
 import '../kernel/kernel_strategy.dart';
-import '../kernel/kelements.dart';
 import '../native/behavior.dart';
-import '../ordered_typeset.dart';
 import '../options.dart';
-import '../serialization/serialization.dart';
 import '../ssa/builder_kernel.dart';
 import '../ssa/nodes.dart';
 import '../ssa/ssa.dart';
 import '../ssa/types.dart';
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
-import '../universe/class_hierarchy.dart';
-import '../universe/class_set.dart';
-import '../universe/feature.dart';
+import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart';
 import '../universe/world_builder.dart';
 import '../universe/world_impact.dart';
 import '../world.dart';
 import 'closure.dart';
-import 'elements.dart';
 import 'element_map.dart';
 import 'element_map_impl.dart';
+import 'js_world.dart';
+import 'js_world_builder.dart';
 import 'locals.dart';
 
 class JsBackendStrategy implements BackendStrategy {
@@ -77,9 +56,6 @@
     return _elementMap;
   }
 
-  ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
-  CommonElements get _commonElements => _elementMap.commonElements;
-
   @override
   JClosedWorld createJClosedWorld(
       KClosedWorld closedWorld, OutputUnitData outputUnitData) {
@@ -98,7 +74,7 @@
         closureDataBuilder,
         _compiler.options,
         _compiler.abstractValueStrategy);
-    return closedWorldBuilder._convertClosedWorld(
+    return closedWorldBuilder.convertClosedWorld(
         closedWorld, strategy.closureModels, outputUnitData);
   }
 
@@ -149,950 +125,6 @@
   }
 }
 
-class JsClosedWorldBuilder {
-  final JsKernelToElementMap _elementMap;
-  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes =
-      new ClassHierarchyNodesMap();
-  final Map<ClassEntity, ClassSet> _classSets = <ClassEntity, ClassSet>{};
-  final GlobalLocalsMap _globalLocalsMap;
-  final ClosureDataBuilder _closureDataBuilder;
-  final CompilerOptions _options;
-  final AbstractValueStrategy _abstractValueStrategy;
-
-  JsClosedWorldBuilder(this._elementMap, this._globalLocalsMap,
-      this._closureDataBuilder, this._options, this._abstractValueStrategy);
-
-  ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
-  CommonElements get _commonElements => _elementMap.commonElements;
-
-  JsClosedWorld _convertClosedWorld(
-      KClosedWorld closedWorld,
-      Map<MemberEntity, ScopeModel> closureModels,
-      OutputUnitData kOutputUnitData) {
-    JsToFrontendMap map = new JsToFrontendMapImpl(_elementMap);
-
-    BackendUsage backendUsage =
-        _convertBackendUsage(map, closedWorld.backendUsage);
-    NativeData nativeData = _convertNativeData(map, closedWorld.nativeData);
-    _elementMap.nativeBasicData = nativeData;
-    InterceptorData interceptorData =
-        _convertInterceptorData(map, nativeData, closedWorld.interceptorData);
-
-    Set<ClassEntity> implementedClasses = new Set<ClassEntity>();
-
-    /// Converts [node] from the frontend world to the corresponding
-    /// [ClassHierarchyNode] for the backend world.
-    ClassHierarchyNode convertClassHierarchyNode(ClassHierarchyNode node) {
-      ClassEntity cls = map.toBackendClass(node.cls);
-      if (closedWorld.isImplemented(node.cls)) {
-        implementedClasses.add(cls);
-      }
-      ClassHierarchyNode newNode = _classHierarchyNodes.putIfAbsent(cls, () {
-        ClassHierarchyNode parentNode;
-        if (node.parentNode != null) {
-          parentNode = convertClassHierarchyNode(node.parentNode);
-        }
-        return new ClassHierarchyNode(parentNode, cls, node.hierarchyDepth);
-      });
-      newNode.isAbstractlyInstantiated = node.isAbstractlyInstantiated;
-      newNode.isDirectlyInstantiated = node.isDirectlyInstantiated;
-      return newNode;
-    }
-
-    /// Converts [classSet] from the frontend world to the corresponding
-    /// [ClassSet] for the backend world.
-    ClassSet convertClassSet(ClassSet classSet) {
-      ClassEntity cls = map.toBackendClass(classSet.cls);
-      return _classSets.putIfAbsent(cls, () {
-        ClassHierarchyNode newNode = convertClassHierarchyNode(classSet.node);
-        ClassSet newClassSet = new ClassSet(newNode);
-        for (ClassHierarchyNode subtype in classSet.subtypeNodes) {
-          ClassHierarchyNode newSubtype = convertClassHierarchyNode(subtype);
-          newClassSet.addSubtype(newSubtype);
-        }
-        return newClassSet;
-      });
-    }
-
-    closedWorld.classHierarchy
-        .getClassHierarchyNode(closedWorld.commonElements.objectClass)
-        .forEachSubclass((ClassEntity cls) {
-      convertClassSet(closedWorld.classHierarchy.getClassSet(cls));
-    }, ClassHierarchyNode.ALL);
-
-    Set<MemberEntity> liveInstanceMembers =
-        map.toBackendMemberSet(closedWorld.liveInstanceMembers);
-
-    Map<ClassEntity, Set<ClassEntity>> mixinUses =
-        map.toBackendClassMap(closedWorld.mixinUses, map.toBackendClassSet);
-
-    Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses =
-        map.toBackendClassMap(
-            closedWorld.typesImplementedBySubclasses, map.toBackendClassSet);
-
-    Iterable<MemberEntity> assignedInstanceMembers =
-        map.toBackendMemberSet(closedWorld.assignedInstanceMembers);
-
-    Iterable<ClassEntity> liveNativeClasses =
-        map.toBackendClassSet(closedWorld.liveNativeClasses);
-
-    Iterable<MemberEntity> processedMembers =
-        map.toBackendMemberSet(closedWorld.processedMembers);
-
-    RuntimeTypesNeed rtiNeed;
-
-    List<FunctionEntity> callMethods = <FunctionEntity>[];
-    ClosureData closureData;
-    if (_options.disableRtiOptimization) {
-      rtiNeed = new TrivialRuntimeTypesNeed();
-      closureData = _closureDataBuilder.createClosureEntities(
-          this,
-          map.toBackendMemberMap(closureModels, identity),
-          const TrivialClosureRtiNeed(),
-          callMethods);
-    } else {
-      RuntimeTypesNeedImpl kernelRtiNeed = closedWorld.rtiNeed;
-      Set<ir.Node> localFunctionsNodesNeedingSignature = new Set<ir.Node>();
-      for (KLocalFunction localFunction
-          in kernelRtiNeed.localFunctionsNeedingSignature) {
-        ir.Node node = localFunction.node;
-        assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression,
-            "Unexpected local function node: $node");
-        localFunctionsNodesNeedingSignature.add(node);
-      }
-      Set<ir.Node> localFunctionsNodesNeedingTypeArguments = new Set<ir.Node>();
-      for (KLocalFunction localFunction
-          in kernelRtiNeed.localFunctionsNeedingTypeArguments) {
-        ir.Node node = localFunction.node;
-        assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression,
-            "Unexpected local function node: $node");
-        localFunctionsNodesNeedingTypeArguments.add(node);
-      }
-
-      RuntimeTypesNeedImpl jRtiNeed =
-          _convertRuntimeTypesNeed(map, backendUsage, kernelRtiNeed);
-      closureData = _closureDataBuilder.createClosureEntities(
-          this,
-          map.toBackendMemberMap(closureModels, identity),
-          new JsClosureRtiNeed(
-              jRtiNeed,
-              localFunctionsNodesNeedingTypeArguments,
-              localFunctionsNodesNeedingSignature),
-          callMethods);
-
-      List<FunctionEntity> callMethodsNeedingSignature = <FunctionEntity>[];
-      for (ir.Node node in localFunctionsNodesNeedingSignature) {
-        callMethodsNeedingSignature
-            .add(closureData.getClosureInfo(node).callMethod);
-      }
-      List<FunctionEntity> callMethodsNeedingTypeArguments = <FunctionEntity>[];
-      for (ir.Node node in localFunctionsNodesNeedingTypeArguments) {
-        callMethodsNeedingTypeArguments
-            .add(closureData.getClosureInfo(node).callMethod);
-      }
-      jRtiNeed.methodsNeedingSignature.addAll(callMethodsNeedingSignature);
-      jRtiNeed.methodsNeedingTypeArguments
-          .addAll(callMethodsNeedingTypeArguments);
-
-      rtiNeed = jRtiNeed;
-    }
-
-    NoSuchMethodDataImpl oldNoSuchMethodData = closedWorld.noSuchMethodData;
-    NoSuchMethodData noSuchMethodData = new NoSuchMethodDataImpl(
-        map.toBackendFunctionSet(oldNoSuchMethodData.throwingImpls),
-        map.toBackendFunctionSet(oldNoSuchMethodData.otherImpls),
-        map.toBackendFunctionSet(oldNoSuchMethodData.forwardingSyntaxImpls));
-
-    JAllocatorAnalysis allocatorAnalysis =
-        JAllocatorAnalysis.from(closedWorld.allocatorAnalysis, map, _options);
-
-    AnnotationsData annotationsData = new AnnotationsDataImpl(
-        map.toBackendFunctionSet(
-            closedWorld.annotationsData.nonInlinableFunctions),
-        map.toBackendFunctionSet(
-            closedWorld.annotationsData.tryInlineFunctions),
-        map.toBackendFunctionSet(
-            closedWorld.annotationsData.cannotThrowFunctions),
-        map.toBackendFunctionSet(
-            closedWorld.annotationsData.sideEffectFreeFunctions),
-        map.toBackendMemberSet(
-            closedWorld.annotationsData.trustTypeAnnotationsMembers),
-        map.toBackendMemberSet(
-            closedWorld.annotationsData.assumeDynamicMembers));
-
-    OutputUnitData outputUnitData =
-        _convertOutputUnitData(map, kOutputUnitData, closureData);
-
-    return new JsClosedWorld(_elementMap,
-        backendUsage: backendUsage,
-        noSuchMethodData: noSuchMethodData,
-        nativeData: nativeData,
-        interceptorData: interceptorData,
-        rtiNeed: rtiNeed,
-        classHierarchy: new ClassHierarchyImpl(
-            _elementMap.commonElements, _classHierarchyNodes, _classSets),
-        implementedClasses: implementedClasses,
-        liveNativeClasses: liveNativeClasses,
-        // TODO(johnniwinther): Include the call method when we can also
-        // represent the synthesized call methods for static and instance method
-        // closurizations.
-        liveInstanceMembers: liveInstanceMembers /*..addAll(callMethods)*/,
-        assignedInstanceMembers: assignedInstanceMembers,
-        processedMembers: processedMembers,
-        mixinUses: mixinUses,
-        typesImplementedBySubclasses: typesImplementedBySubclasses,
-        abstractValueStrategy: _abstractValueStrategy,
-        allocatorAnalysis: allocatorAnalysis,
-        annotationsData: annotationsData,
-        globalLocalsMap: _globalLocalsMap,
-        closureDataLookup: closureData,
-        outputUnitData: outputUnitData);
-  }
-
-  BackendUsage _convertBackendUsage(
-      JsToFrontendMap map, BackendUsageImpl backendUsage) {
-    Set<FunctionEntity> globalFunctionDependencies =
-        map.toBackendFunctionSet(backendUsage.globalFunctionDependencies);
-    Set<ClassEntity> globalClassDependencies =
-        map.toBackendClassSet(backendUsage.globalClassDependencies);
-    Set<FunctionEntity> helperFunctionsUsed =
-        map.toBackendFunctionSet(backendUsage.helperFunctionsUsed);
-    Set<ClassEntity> helperClassesUsed =
-        map.toBackendClassSet(backendUsage.helperClassesUsed);
-    Set<RuntimeTypeUse> runtimeTypeUses =
-        backendUsage.runtimeTypeUses.map((RuntimeTypeUse runtimeTypeUse) {
-      return new RuntimeTypeUse(
-          runtimeTypeUse.kind,
-          map.toBackendType(runtimeTypeUse.receiverType),
-          map.toBackendType(runtimeTypeUse.argumentType));
-    }).toSet();
-
-    return new BackendUsageImpl(
-        globalFunctionDependencies: globalFunctionDependencies,
-        globalClassDependencies: globalClassDependencies,
-        helperFunctionsUsed: helperFunctionsUsed,
-        helperClassesUsed: helperClassesUsed,
-        needToInitializeIsolateAffinityTag:
-            backendUsage.needToInitializeIsolateAffinityTag,
-        needToInitializeDispatchProperty:
-            backendUsage.needToInitializeDispatchProperty,
-        requiresPreamble: backendUsage.requiresPreamble,
-        runtimeTypeUses: runtimeTypeUses,
-        isFunctionApplyUsed: backendUsage.isFunctionApplyUsed,
-        isMirrorsUsed: backendUsage.isMirrorsUsed,
-        isNoSuchMethodUsed: backendUsage.isNoSuchMethodUsed);
-  }
-
-  NativeBasicData _convertNativeBasicData(
-      JsToFrontendMap map, NativeBasicDataImpl nativeBasicData) {
-    Map<ClassEntity, NativeClassTag> nativeClassTagInfo =
-        <ClassEntity, NativeClassTag>{};
-    nativeBasicData.nativeClassTagInfo
-        .forEach((ClassEntity cls, NativeClassTag tag) {
-      nativeClassTagInfo[map.toBackendClass(cls)] = tag;
-    });
-    Map<LibraryEntity, String> jsInteropLibraries =
-        map.toBackendLibraryMap(nativeBasicData.jsInteropLibraries, identity);
-    Map<ClassEntity, String> jsInteropClasses =
-        map.toBackendClassMap(nativeBasicData.jsInteropClasses, identity);
-    Set<ClassEntity> anonymousJsInteropClasses =
-        map.toBackendClassSet(nativeBasicData.anonymousJsInteropClasses);
-    Map<MemberEntity, String> jsInteropMembers =
-        map.toBackendMemberMap(nativeBasicData.jsInteropMembers, identity);
-    return new NativeBasicDataImpl(
-        _elementEnvironment,
-        nativeClassTagInfo,
-        jsInteropLibraries,
-        jsInteropClasses,
-        anonymousJsInteropClasses,
-        jsInteropMembers);
-  }
-
-  NativeData _convertNativeData(
-      JsToFrontendMap map, NativeDataImpl nativeData) {
-    convertNativeBehaviorType(type) {
-      if (type is DartType) return map.toBackendType(type);
-      assert(type is SpecialType);
-      return type;
-    }
-
-    NativeBehavior convertNativeBehavior(NativeBehavior behavior) {
-      NativeBehavior newBehavior = new NativeBehavior();
-
-      for (dynamic type in behavior.typesReturned) {
-        newBehavior.typesReturned.add(convertNativeBehaviorType(type));
-      }
-      for (dynamic type in behavior.typesInstantiated) {
-        newBehavior.typesInstantiated.add(convertNativeBehaviorType(type));
-      }
-
-      newBehavior.codeTemplateText = behavior.codeTemplateText;
-      newBehavior.codeTemplate = behavior.codeTemplate;
-      newBehavior.throwBehavior = behavior.throwBehavior;
-      newBehavior.isAllocation = behavior.isAllocation;
-      newBehavior.useGvn = behavior.useGvn;
-      return newBehavior;
-    }
-
-    NativeBasicData nativeBasicData = _convertNativeBasicData(map, nativeData);
-
-    Map<MemberEntity, String> nativeMemberName =
-        map.toBackendMemberMap(nativeData.nativeMemberName, identity);
-    Map<FunctionEntity, NativeBehavior> nativeMethodBehavior =
-        <FunctionEntity, NativeBehavior>{};
-    nativeData.nativeMethodBehavior
-        .forEach((FunctionEntity method, NativeBehavior behavior) {
-      FunctionEntity backendMethod = map.toBackendMember(method);
-      if (backendMethod != null) {
-        // If [method] isn't used it doesn't have a corresponding backend
-        // method.
-        nativeMethodBehavior[backendMethod] = convertNativeBehavior(behavior);
-      }
-    });
-    Map<MemberEntity, NativeBehavior> nativeFieldLoadBehavior =
-        map.toBackendMemberMap(
-            nativeData.nativeFieldLoadBehavior, convertNativeBehavior);
-    Map<MemberEntity, NativeBehavior> nativeFieldStoreBehavior =
-        map.toBackendMemberMap(
-            nativeData.nativeFieldStoreBehavior, convertNativeBehavior);
-    Map<LibraryEntity, String> jsInteropLibraryNames =
-        map.toBackendLibraryMap(nativeData.jsInteropLibraries, identity);
-    Set<ClassEntity> anonymousJsInteropClasses =
-        map.toBackendClassSet(nativeData.anonymousJsInteropClasses);
-    Map<ClassEntity, String> jsInteropClassNames =
-        map.toBackendClassMap(nativeData.jsInteropClasses, identity);
-    Map<MemberEntity, String> jsInteropMemberNames =
-        map.toBackendMemberMap(nativeData.jsInteropMembers, identity);
-
-    return new NativeDataImpl(
-        nativeBasicData,
-        nativeMemberName,
-        nativeMethodBehavior,
-        nativeFieldLoadBehavior,
-        nativeFieldStoreBehavior,
-        jsInteropLibraryNames,
-        anonymousJsInteropClasses,
-        jsInteropClassNames,
-        jsInteropMemberNames);
-  }
-
-  InterceptorData _convertInterceptorData(JsToFrontendMap map,
-      NativeData nativeData, InterceptorDataImpl interceptorData) {
-    Map<String, Set<MemberEntity>> interceptedMembers =
-        <String, Set<MemberEntity>>{};
-    interceptorData.interceptedMembers
-        .forEach((String name, Set<MemberEntity> members) {
-      interceptedMembers[name] = map.toBackendMemberSet(members);
-    });
-    return new InterceptorDataImpl(
-        nativeData,
-        _commonElements,
-        interceptedMembers,
-        map.toBackendClassSet(interceptorData.interceptedClasses),
-        map.toBackendClassSet(
-            interceptorData.classesMixedIntoInterceptedClasses));
-  }
-
-  RuntimeTypesNeed _convertRuntimeTypesNeed(JsToFrontendMap map,
-      BackendUsage backendUsage, RuntimeTypesNeedImpl rtiNeed) {
-    Set<ClassEntity> classesNeedingTypeArguments =
-        map.toBackendClassSet(rtiNeed.classesNeedingTypeArguments);
-    Set<FunctionEntity> methodsNeedingTypeArguments =
-        map.toBackendFunctionSet(rtiNeed.methodsNeedingTypeArguments);
-    Set<FunctionEntity> methodsNeedingSignature =
-        map.toBackendFunctionSet(rtiNeed.methodsNeedingSignature);
-    Set<Selector> selectorsNeedingTypeArguments =
-        rtiNeed.selectorsNeedingTypeArguments.map((Selector selector) {
-      if (selector.memberName.isPrivate) {
-        return new Selector(
-            selector.kind,
-            new PrivateName(selector.memberName.text,
-                map.toBackendLibrary(selector.memberName.library),
-                isSetter: selector.memberName.isSetter),
-            selector.callStructure);
-      }
-      return selector;
-    }).toSet();
-    return new RuntimeTypesNeedImpl(
-        _elementEnvironment,
-        classesNeedingTypeArguments,
-        methodsNeedingSignature,
-        methodsNeedingTypeArguments,
-        null,
-        null,
-        selectorsNeedingTypeArguments,
-        rtiNeed.instantiationsNeedingTypeArguments);
-  }
-
-  /// Construct a closure class and set up the necessary class inference
-  /// hierarchy.
-  KernelClosureClassInfo buildClosureClass(
-      MemberEntity member,
-      ir.FunctionNode originalClosureFunctionNode,
-      JLibrary enclosingLibrary,
-      Map<Local, JRecordField> boxedVariables,
-      KernelScopeInfo info,
-      KernelToLocalsMap localsMap,
-      {bool createSignatureMethod}) {
-    ClassEntity superclass = _commonElements.closureClass;
-
-    KernelClosureClassInfo closureClassInfo = _elementMap.constructClosureClass(
-        member,
-        originalClosureFunctionNode,
-        enclosingLibrary,
-        boxedVariables,
-        info,
-        localsMap,
-        new InterfaceType(superclass, const []),
-        createSignatureMethod: createSignatureMethod);
-
-    // Tell the hierarchy that this is the super class. then we can use
-    // .getSupertypes(class)
-    ClassHierarchyNode parentNode = _classHierarchyNodes[superclass];
-    ClassHierarchyNode node = new ClassHierarchyNode(parentNode,
-        closureClassInfo.closureClassEntity, parentNode.hierarchyDepth + 1);
-    _classHierarchyNodes[closureClassInfo.closureClassEntity] = node;
-    _classSets[closureClassInfo.closureClassEntity] = new ClassSet(node);
-    node.isDirectlyInstantiated = true;
-
-    return closureClassInfo;
-  }
-
-  OutputUnitData _convertOutputUnitData(JsToFrontendMapImpl map,
-      OutputUnitData data, ClosureData closureDataLookup) {
-    Entity toBackendEntity(Entity entity) {
-      if (entity is ClassEntity) return map.toBackendClass(entity);
-      if (entity is MemberEntity) return map.toBackendMember(entity);
-      if (entity is TypedefEntity) return map.toBackendTypedef(entity);
-      if (entity is TypeVariableEntity) {
-        return map.toBackendTypeVariable(entity);
-      }
-      assert(
-          entity is LibraryEntity, 'unexpected entity ${entity.runtimeType}');
-      return map.toBackendLibrary(entity);
-    }
-
-    // Convert front-end maps containing K-class and K-local function keys to a
-    // backend map using J-classes as keys.
-    Map<ClassEntity, OutputUnit> convertClassMap(
-        Map<ClassEntity, OutputUnit> classMap,
-        Map<Local, OutputUnit> localFunctionMap) {
-      var result = <ClassEntity, OutputUnit>{};
-      classMap.forEach((ClassEntity entity, OutputUnit unit) {
-        ClassEntity backendEntity = toBackendEntity(entity);
-        if (backendEntity != null) {
-          // If [entity] isn't used it doesn't have a corresponding backend
-          // entity.
-          result[backendEntity] = unit;
-        }
-      });
-      localFunctionMap.forEach((Local entity, OutputUnit unit) {
-        // Ensure closure classes are included in the output unit corresponding
-        // to the local function.
-        if (entity is KLocalFunction) {
-          var closureInfo = closureDataLookup.getClosureInfo(entity.node);
-          result[closureInfo.closureClassEntity] = unit;
-        }
-      });
-      return result;
-    }
-
-    // Convert front-end maps containing K-member and K-local function keys to
-    // a backend map using J-members as keys.
-    Map<MemberEntity, OutputUnit> convertMemberMap(
-        Map<MemberEntity, OutputUnit> memberMap,
-        Map<Local, OutputUnit> localFunctionMap) {
-      var result = <MemberEntity, OutputUnit>{};
-      memberMap.forEach((MemberEntity entity, OutputUnit unit) {
-        MemberEntity backendEntity = toBackendEntity(entity);
-        if (backendEntity != null) {
-          // If [entity] isn't used it doesn't have a corresponding backend
-          // entity.
-          result[backendEntity] = unit;
-        }
-      });
-      localFunctionMap.forEach((Local entity, OutputUnit unit) {
-        // Ensure closure call-methods are included in the output unit
-        // corresponding to the local function.
-        if (entity is KLocalFunction) {
-          var closureInfo = closureDataLookup.getClosureInfo(entity.node);
-          result[closureInfo.callMethod] = unit;
-        }
-      });
-      return result;
-    }
-
-    ConstantValue toBackendConstant(ConstantValue constant) {
-      return constant.accept(new ConstantConverter(toBackendEntity), null);
-    }
-
-    return new OutputUnitData.from(
-        data,
-        convertClassMap,
-        convertMemberMap,
-        (m) => convertMap<ConstantValue, OutputUnit>(
-            m, toBackendConstant, (v) => v));
-  }
-}
-
-class JsClosedWorld extends ClosedWorldBase {
-  static const String tag = 'closed-world';
-
-  final JsKernelToElementMap elementMap;
-  final RuntimeTypesNeed rtiNeed;
-  AbstractValueDomain _abstractValueDomain;
-  final JAllocatorAnalysis allocatorAnalysis;
-  final AnnotationsData annotationsData;
-  final GlobalLocalsMap globalLocalsMap;
-  final ClosureData closureDataLookup;
-  final OutputUnitData outputUnitData;
-  Sorter _sorter;
-
-  JsClosedWorld(this.elementMap,
-      {ConstantSystem constantSystem,
-      NativeData nativeData,
-      InterceptorData interceptorData,
-      BackendUsage backendUsage,
-      this.rtiNeed,
-      this.allocatorAnalysis,
-      NoSuchMethodData noSuchMethodData,
-      Iterable<ClassEntity> implementedClasses,
-      Iterable<ClassEntity> liveNativeClasses,
-      Iterable<MemberEntity> liveInstanceMembers,
-      Iterable<MemberEntity> assignedInstanceMembers,
-      Iterable<MemberEntity> processedMembers,
-      Map<ClassEntity, Set<ClassEntity>> mixinUses,
-      Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses,
-      ClassHierarchy classHierarchy,
-      AbstractValueStrategy abstractValueStrategy,
-      this.annotationsData,
-      this.globalLocalsMap,
-      this.closureDataLookup,
-      this.outputUnitData})
-      : super(
-            elementMap.elementEnvironment,
-            elementMap.types,
-            elementMap.commonElements,
-            JavaScriptConstantSystem.only,
-            nativeData,
-            interceptorData,
-            backendUsage,
-            noSuchMethodData,
-            implementedClasses,
-            liveNativeClasses,
-            liveInstanceMembers,
-            assignedInstanceMembers,
-            processedMembers,
-            mixinUses,
-            typesImplementedBySubclasses,
-            classHierarchy) {
-    _abstractValueDomain = abstractValueStrategy.createDomain(this);
-  }
-
-  /// Deserializes a [JsClosedWorld] object from [source].
-  factory JsClosedWorld.readFromDataSource(
-      CompilerOptions options,
-      DiagnosticReporter reporter,
-      Environment environment,
-      AbstractValueStrategy abstractValueStrategy,
-      ir.Component component,
-      DataSource source) {
-    source.begin(tag);
-
-    JsKernelToElementMap elementMap =
-        new JsKernelToElementMap.readFromDataSource(
-            options, reporter, environment, component, source);
-    GlobalLocalsMap globalLocalsMap =
-        new GlobalLocalsMap.readFromDataSource(source);
-    source.registerLocalLookup(new LocalLookupImpl(globalLocalsMap));
-    ClassHierarchy classHierarchy = new ClassHierarchy.readFromDataSource(
-        source, elementMap.commonElements);
-    NativeData nativeData = new NativeData.readFromDataSource(
-        source, elementMap.elementEnvironment);
-    elementMap.nativeBasicData = nativeData;
-    InterceptorData interceptorData = new InterceptorData.readFromDataSource(
-        source, nativeData, elementMap.commonElements);
-    BackendUsage backendUsage = new BackendUsage.readFromDataSource(source);
-    RuntimeTypesNeed rtiNeed = new RuntimeTypesNeed.readFromDataSource(
-        source, elementMap.elementEnvironment);
-    JAllocatorAnalysis allocatorAnalysis =
-        new JAllocatorAnalysis.readFromDataSource(source, options);
-    NoSuchMethodData noSuchMethodData =
-        new NoSuchMethodData.readFromDataSource(source);
-
-    Set<ClassEntity> implementedClasses = source.readClasses().toSet();
-    Iterable<ClassEntity> liveNativeClasses = source.readClasses();
-    Iterable<MemberEntity> liveInstanceMembers = source.readMembers();
-    Iterable<MemberEntity> assignedInstanceMembers = source.readMembers();
-    Iterable<MemberEntity> processedMembers = source.readMembers();
-    Map<ClassEntity, Set<ClassEntity>> mixinUses =
-        source.readClassMap(() => source.readClasses().toSet());
-    Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses =
-        source.readClassMap(() => source.readClasses().toSet());
-
-    AnnotationsData annotationsData =
-        new AnnotationsData.readFromDataSource(source);
-
-    ClosureData closureData =
-        new ClosureData.readFromDataSource(elementMap, source);
-
-    OutputUnitData outputUnitData =
-        new OutputUnitData.readFromDataSource(source);
-
-    source.end(tag);
-
-    return new JsClosedWorld(elementMap,
-        nativeData: nativeData,
-        interceptorData: interceptorData,
-        backendUsage: backendUsage,
-        rtiNeed: rtiNeed,
-        allocatorAnalysis: allocatorAnalysis,
-        noSuchMethodData: noSuchMethodData,
-        implementedClasses: implementedClasses,
-        liveNativeClasses: liveNativeClasses,
-        liveInstanceMembers: liveInstanceMembers,
-        assignedInstanceMembers: assignedInstanceMembers,
-        processedMembers: processedMembers,
-        mixinUses: mixinUses,
-        typesImplementedBySubclasses: typesImplementedBySubclasses,
-        classHierarchy: classHierarchy,
-        abstractValueStrategy: abstractValueStrategy,
-        annotationsData: annotationsData,
-        globalLocalsMap: globalLocalsMap,
-        closureDataLookup: closureData,
-        outputUnitData: outputUnitData);
-  }
-
-  /// Serializes this [JsClosedWorld] to [sink].
-  void writeToDataSink(DataSink sink) {
-    sink.begin(tag);
-    elementMap.writeToDataSink(sink);
-    globalLocalsMap.writeToDataSink(sink);
-
-    classHierarchy.writeToDataSink(sink);
-    nativeData.writeToDataSink(sink);
-    interceptorData.writeToDataSink(sink);
-    backendUsage.writeToDataSink(sink);
-    rtiNeed.writeToDataSink(sink);
-    allocatorAnalysis.writeToDataSink(sink);
-    noSuchMethodData.writeToDataSink(sink);
-    sink.writeClasses(implementedClasses);
-    sink.writeClasses(liveNativeClasses);
-    sink.writeMembers(liveInstanceMembers);
-    sink.writeMembers(assignedInstanceMembers);
-    sink.writeMembers(processedMembers);
-    sink.writeClassMap(
-        mixinUses, (Set<ClassEntity> set) => sink.writeClasses(set));
-    sink.writeClassMap(typesImplementedBySubclasses,
-        (Set<ClassEntity> set) => sink.writeClasses(set));
-    annotationsData.writeToDataSink(sink);
-    closureDataLookup.writeToDataSink(sink);
-    outputUnitData.writeToDataSink(sink);
-    sink.end(tag);
-  }
-
-  @override
-  Sorter get sorter {
-    return _sorter ??= new KernelSorter(elementMap);
-  }
-
-  @override
-  AbstractValueDomain get abstractValueDomain {
-    return _abstractValueDomain;
-  }
-
-  @override
-  bool hasElementIn(ClassEntity cls, Selector selector, Entity element) {
-    while (cls != null) {
-      MemberEntity member = elementEnvironment.lookupLocalClassMember(
-          cls, selector.name,
-          setter: selector.isSetter);
-      if (member != null &&
-          !member.isAbstract &&
-          (!selector.memberName.isPrivate ||
-              member.library == selector.library)) {
-        return member == element;
-      }
-      cls = elementEnvironment.getSuperClass(cls);
-    }
-    return false;
-  }
-
-  @override
-  bool hasConcreteMatch(ClassEntity cls, Selector selector,
-      {ClassEntity stopAtSuperclass}) {
-    assert(classHierarchy.isInstantiated(cls),
-        failedAt(cls, '$cls has not been instantiated.'));
-    MemberEntity element = elementEnvironment
-        .lookupClassMember(cls, selector.name, setter: selector.isSetter);
-    if (element == null) return false;
-
-    if (element.isAbstract) {
-      ClassEntity enclosingClass = element.enclosingClass;
-      return hasConcreteMatch(
-          elementEnvironment.getSuperClass(enclosingClass), selector);
-    }
-    return selector.appliesUntyped(element);
-  }
-
-  @override
-  bool isNamedMixinApplication(ClassEntity cls) {
-    return elementMap.elementEnvironment.isMixinApplication(cls) &&
-        !elementMap.elementEnvironment.isUnnamedMixinApplication(cls);
-  }
-
-  @override
-  ClassEntity getAppliedMixin(ClassEntity cls) {
-    return elementMap.getAppliedMixin(cls);
-  }
-
-  @override
-  Iterable<ClassEntity> getInterfaces(ClassEntity cls) {
-    return elementMap.getInterfaces(cls).map((t) => t.element);
-  }
-
-  @override
-  ClassEntity getSuperClass(ClassEntity cls) {
-    return elementMap.getSuperType(cls)?.element;
-  }
-
-  @override
-  int getHierarchyDepth(ClassEntity cls) {
-    return elementMap.getHierarchyDepth(cls);
-  }
-
-  @override
-  OrderedTypeSet getOrderedTypeSet(ClassEntity cls) {
-    return elementMap.getOrderedTypeSet(cls);
-  }
-}
-
-class ConstantConverter implements ConstantValueVisitor<ConstantValue, Null> {
-  final Entity Function(Entity) toBackendEntity;
-  final TypeConverter typeConverter;
-
-  ConstantConverter(this.toBackendEntity)
-      : typeConverter = new TypeConverter(toBackendEntity);
-
-  ConstantValue visitNull(NullConstantValue constant, _) => constant;
-  ConstantValue visitInt(IntConstantValue constant, _) => constant;
-  ConstantValue visitDouble(DoubleConstantValue constant, _) => constant;
-  ConstantValue visitBool(BoolConstantValue constant, _) => constant;
-  ConstantValue visitString(StringConstantValue constant, _) => constant;
-  ConstantValue visitSynthetic(SyntheticConstantValue constant, _) => constant;
-  ConstantValue visitNonConstant(NonConstantValue constant, _) => constant;
-
-  ConstantValue visitFunction(FunctionConstantValue constant, _) {
-    return new FunctionConstantValue(toBackendEntity(constant.element),
-        typeConverter.convert(constant.type));
-  }
-
-  ConstantValue visitList(ListConstantValue constant, _) {
-    var type = typeConverter.convert(constant.type);
-    List<ConstantValue> entries = _handleValues(constant.entries);
-    if (identical(entries, constant.entries) && type == constant.type) {
-      return constant;
-    }
-    return new ListConstantValue(type, entries);
-  }
-
-  ConstantValue visitMap(MapConstantValue constant, _) {
-    var type = typeConverter.convert(constant.type);
-    List<ConstantValue> keys = _handleValues(constant.keys);
-    List<ConstantValue> values = _handleValues(constant.values);
-    if (identical(keys, constant.keys) &&
-        identical(values, constant.values) &&
-        type == constant.type) {
-      return constant;
-    }
-    return new MapConstantValue(type, keys, values);
-  }
-
-  ConstantValue visitConstructed(ConstructedConstantValue constant, _) {
-    var type = typeConverter.convert(constant.type);
-    if (type == constant.type && constant.fields.isEmpty) {
-      return constant;
-    }
-    var fields = <FieldEntity, ConstantValue>{};
-    constant.fields.forEach((f, v) {
-      fields[toBackendEntity(f)] = v.accept(this, null);
-    });
-    return new ConstructedConstantValue(type, fields);
-  }
-
-  ConstantValue visitType(TypeConstantValue constant, _) {
-    var type = typeConverter.convert(constant.type);
-    var representedType = typeConverter.convert(constant.representedType);
-    if (type == constant.type && representedType == constant.representedType) {
-      return constant;
-    }
-    return new TypeConstantValue(representedType, type);
-  }
-
-  ConstantValue visitInterceptor(InterceptorConstantValue constant, _) {
-    return new InterceptorConstantValue(toBackendEntity(constant.cls));
-  }
-
-  ConstantValue visitDeferred(DeferredConstantValue constant, _) {
-    throw new UnsupportedError("DeferredConstantValue with --use-kernel");
-  }
-
-  ConstantValue visitDeferredGlobal(DeferredGlobalConstantValue constant, _) {
-    var referenced = constant.referenced.accept(this, null);
-    if (referenced == constant.referenced) return constant;
-    return new DeferredGlobalConstantValue(referenced, constant.unit);
-  }
-
-  ConstantValue visitInstantiation(InstantiationConstantValue constant, _) {
-    ConstantValue function = constant.function.accept(this, null);
-    List<DartType> typeArguments =
-        typeConverter.convertTypes(constant.typeArguments);
-    return new InstantiationConstantValue(typeArguments, function);
-  }
-
-  List<ConstantValue> _handleValues(List<ConstantValue> values) {
-    List<ConstantValue> result;
-    for (int i = 0; i < values.length; i++) {
-      var value = values[i];
-      var newValue = value.accept(this, null);
-      if (newValue != value && result == null) {
-        result = values.sublist(0, i).toList();
-      }
-      result?.add(newValue);
-    }
-    return result ?? values;
-  }
-}
-
-class TypeConverter extends DartTypeVisitor<DartType, Null> {
-  final Entity Function(Entity) toBackendEntity;
-  TypeConverter(this.toBackendEntity);
-
-  Map<FunctionTypeVariable, FunctionTypeVariable> _functionTypeVariables =
-      <FunctionTypeVariable, FunctionTypeVariable>{};
-
-  DartType convert(DartType type) => type.accept(this, null);
-
-  List<DartType> convertTypes(List<DartType> types) => _visitList(types);
-
-  DartType visitVoidType(VoidType type, _) => type;
-  DartType visitDynamicType(DynamicType type, _) => type;
-
-  DartType visitTypeVariableType(TypeVariableType type, _) {
-    return new TypeVariableType(toBackendEntity(type.element));
-  }
-
-  DartType visitFunctionTypeVariable(FunctionTypeVariable type, _) {
-    return _functionTypeVariables[type];
-  }
-
-  DartType visitFunctionType(FunctionType type, _) {
-    var returnType = type.returnType.accept(this, null);
-    var parameterTypes = _visitList(type.parameterTypes);
-    var optionalParameterTypes = _visitList(type.optionalParameterTypes);
-    var namedParameterTypes = _visitList(type.namedParameterTypes);
-    List<FunctionTypeVariable> typeVariables = <FunctionTypeVariable>[];
-    for (FunctionTypeVariable typeVariable in type.typeVariables) {
-      typeVariables.add(_functionTypeVariables[typeVariable] =
-          new FunctionTypeVariable(typeVariable.index));
-    }
-    for (FunctionTypeVariable typeVariable in type.typeVariables) {
-      _functionTypeVariables[typeVariable].bound =
-          typeVariable.bound?.accept(this, null);
-    }
-    for (FunctionTypeVariable typeVariable in type.typeVariables) {
-      _functionTypeVariables.remove(typeVariable);
-    }
-    return new FunctionType(returnType, parameterTypes, optionalParameterTypes,
-        type.namedParameters, namedParameterTypes, typeVariables);
-  }
-
-  DartType visitInterfaceType(InterfaceType type, _) {
-    var element = toBackendEntity(type.element);
-    var args = _visitList(type.typeArguments);
-    return new InterfaceType(element, args);
-  }
-
-  DartType visitTypedefType(TypedefType type, _) {
-    var element = toBackendEntity(type.element);
-    var args = _visitList(type.typeArguments);
-    var unaliased = convert(type.unaliased);
-    return new TypedefType(element, args, unaliased);
-  }
-
-  List<DartType> _visitList(List<DartType> list) =>
-      list.map<DartType>((t) => t.accept(this, null)).toList();
-}
-
-class TrivialClosureRtiNeed implements ClosureRtiNeed {
-  const TrivialClosureRtiNeed();
-
-  @override
-  bool localFunctionNeedsSignature(ir.Node node) => true;
-
-  @override
-  bool classNeedsTypeArguments(ClassEntity cls) => true;
-
-  @override
-  bool methodNeedsTypeArguments(FunctionEntity method) => true;
-
-  @override
-  bool localFunctionNeedsTypeArguments(ir.Node node) => true;
-
-  @override
-  bool selectorNeedsTypeArguments(Selector selector) => true;
-
-  @override
-  bool methodNeedsSignature(MemberEntity method) => true;
-
-  @override
-  bool instantiationNeedsTypeArguments(
-          DartType functionType, int typeArgumentCount) =>
-      true;
-}
-
-class JsClosureRtiNeed implements ClosureRtiNeed {
-  final RuntimeTypesNeed rtiNeed;
-  final Set<ir.Node> localFunctionsNodesNeedingTypeArguments;
-  final Set<ir.Node> localFunctionsNodesNeedingSignature;
-
-  JsClosureRtiNeed(this.rtiNeed, this.localFunctionsNodesNeedingTypeArguments,
-      this.localFunctionsNodesNeedingSignature);
-
-  @override
-  bool localFunctionNeedsSignature(ir.Node node) {
-    assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
-    return localFunctionsNodesNeedingSignature.contains(node);
-  }
-
-  @override
-  bool classNeedsTypeArguments(ClassEntity cls) =>
-      rtiNeed.classNeedsTypeArguments(cls);
-
-  @override
-  bool methodNeedsTypeArguments(FunctionEntity method) =>
-      rtiNeed.methodNeedsTypeArguments(method);
-
-  @override
-  bool localFunctionNeedsTypeArguments(ir.Node node) {
-    assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
-    return localFunctionsNodesNeedingTypeArguments.contains(node);
-  }
-
-  @override
-  bool selectorNeedsTypeArguments(Selector selector) =>
-      rtiNeed.selectorNeedsTypeArguments(selector);
-
-  @override
-  bool methodNeedsSignature(MemberEntity method) =>
-      rtiNeed.methodNeedsSignature(method);
-
-  @override
-  bool instantiationNeedsTypeArguments(
-          DartType functionType, int typeArgumentCount) =>
-      rtiNeed.instantiationNeedsTypeArguments(functionType, typeArgumentCount);
-}
-
 class KernelCodegenWorkItemBuilder implements WorkItemBuilder {
   final JavaScriptBackend _backend;
   final JClosedWorld _closedWorld;
@@ -1206,9 +238,9 @@
     return _targetResults.typeOfSend(node);
   }
 
-  AbstractValue typeOfListLiteral(MemberEntity owner,
+  AbstractValue typeOfListLiteral(
       ir.ListLiteral listLiteral, AbstractValueDomain abstractValueDomain) {
-    return _resultOf(owner).typeOfListLiteral(listLiteral) ??
+    return _globalInferenceResults.typeOfListLiteral(listLiteral) ??
         abstractValueDomain.dynamicType;
   }
 
@@ -1227,7 +259,7 @@
   bool isJsIndexableIterator(
       ir.ForInStatement node, AbstractValueDomain abstractValueDomain) {
     AbstractValue mask = typeOfIterator(node);
-    return abstractValueDomain.isJsIndexableAndIterable(mask);
+    return abstractValueDomain.isJsIndexableAndIterable(mask).isDefinitelyTrue;
   }
 
   AbstractValue inferredIndexType(ir.ForInStatement node) {
@@ -1255,109 +287,3 @@
     return AbstractValueFactory.fromNativeBehavior(nativeBehavior, closedWorld);
   }
 }
-
-class KernelSorter implements Sorter {
-  final JsToElementMap elementMap;
-
-  KernelSorter(this.elementMap);
-
-  int _compareLibraries(LibraryEntity a, LibraryEntity b) {
-    return utils.compareLibrariesUris(a.canonicalUri, b.canonicalUri);
-  }
-
-  int _compareSourceSpans(Entity entity1, SourceSpan sourceSpan1,
-      Entity entity2, SourceSpan sourceSpan2) {
-    int r = utils.compareSourceUris(sourceSpan1.uri, sourceSpan2.uri);
-    if (r != 0) return r;
-    return utils.compareEntities(
-        entity1, sourceSpan1.begin, null, entity2, sourceSpan2.begin, null);
-  }
-
-  @override
-  Iterable<LibraryEntity> sortLibraries(Iterable<LibraryEntity> libraries) {
-    return libraries.toList()..sort(_compareLibraries);
-  }
-
-  @override
-  Iterable<T> sortMembers<T extends MemberEntity>(Iterable<T> members) {
-    return members.toList()..sort(compareMembersByLocation);
-  }
-
-  @override
-  Iterable<ClassEntity> sortClasses(Iterable<ClassEntity> classes) {
-    List<ClassEntity> regularClasses = <ClassEntity>[];
-    List<ClassEntity> unnamedMixins = <ClassEntity>[];
-    for (ClassEntity cls in classes) {
-      if (elementMap.elementEnvironment.isUnnamedMixinApplication(cls)) {
-        unnamedMixins.add(cls);
-      } else {
-        regularClasses.add(cls);
-      }
-    }
-    List<ClassEntity> sorted = <ClassEntity>[];
-    regularClasses.sort(compareClassesByLocation);
-    sorted.addAll(regularClasses);
-    unnamedMixins.sort((a, b) {
-      int result = _compareLibraries(a.library, b.library);
-      if (result != 0) return result;
-      result = a.name.compareTo(b.name);
-      assert(result != 0,
-          failedAt(a, "Multiple mixins named ${a.name}: $a vs $b."));
-      return result;
-    });
-    sorted.addAll(unnamedMixins);
-    return sorted;
-  }
-
-  @override
-  Iterable<TypedefEntity> sortTypedefs(Iterable<TypedefEntity> typedefs) {
-    // TODO(redemption): Support this.
-    assert(typedefs.isEmpty);
-    return typedefs;
-  }
-
-  @override
-  int compareLibrariesByLocation(LibraryEntity a, LibraryEntity b) {
-    return _compareLibraries(a, b);
-  }
-
-  @override
-  int compareClassesByLocation(ClassEntity a, ClassEntity b) {
-    int r = _compareLibraries(a.library, b.library);
-    if (r != 0) return r;
-    ClassDefinition definition1 = elementMap.getClassDefinition(a);
-    ClassDefinition definition2 = elementMap.getClassDefinition(b);
-    return _compareSourceSpans(
-        a, definition1.location, b, definition2.location);
-  }
-
-  @override
-  int compareTypedefsByLocation(TypedefEntity a, TypedefEntity b) {
-    // TODO(redemption): Support this.
-    failedAt(a, 'KernelSorter.compareTypedefsByLocation unimplemented');
-    return 0;
-  }
-
-  @override
-  int compareMembersByLocation(MemberEntity a, MemberEntity b) {
-    int r = _compareLibraries(a.library, b.library);
-    if (r != 0) return r;
-    MemberDefinition definition1 = elementMap.getMemberDefinition(a);
-    MemberDefinition definition2 = elementMap.getMemberDefinition(b);
-    return _compareSourceSpans(
-        a, definition1.location, b, definition2.location);
-  }
-}
-
-/// [LocalLookup] implementation used to deserialize [JsClosedWorld].
-class LocalLookupImpl implements LocalLookup {
-  final GlobalLocalsMap _globalLocalsMap;
-
-  LocalLookupImpl(this._globalLocalsMap);
-
-  @override
-  Local getLocalByIndex(MemberEntity memberContext, int index) {
-    KernelToLocalsMapImpl map = _globalLocalsMap.getLocalsMap(memberContext);
-    return map.getLocalByIndex(index);
-  }
-}
diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart
new file mode 100644
index 0000000..39e86a0
--- /dev/null
+++ b/pkg/compiler/lib/src/js_model/js_world.dart
@@ -0,0 +1,639 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+import 'package:front_end/src/api_unstable/dart2js.dart' show Link;
+
+import '../closure.dart';
+import '../common.dart';
+import '../common/names.dart';
+import '../common_elements.dart' show JCommonElements, JElementEnvironment;
+import '../constants/constant_system.dart';
+import '../deferred_load.dart';
+import '../diagnostics/diagnostic_listener.dart';
+import '../elements/entities.dart';
+import '../elements/entity_utils.dart' as utils;
+import '../elements/names.dart';
+import '../elements/types.dart';
+import '../environment.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../js_emitter/sorter.dart';
+import '../js_backend/annotations.dart';
+import '../js_backend/allocator_analysis.dart';
+import '../js_backend/backend_usage.dart';
+import '../js_backend/constant_system_javascript.dart';
+import '../js_backend/interceptor_data.dart';
+import '../js_backend/native_data.dart';
+import '../js_backend/no_such_method_registry.dart';
+import '../js_backend/runtime_types.dart';
+import '../js_model/locals.dart';
+import '../ordered_typeset.dart';
+import '../options.dart';
+import '../serialization/serialization.dart';
+import '../universe/class_hierarchy.dart';
+import '../universe/class_set.dart';
+import '../universe/function_set.dart' show FunctionSet;
+import '../universe/selector.dart';
+import '../world.dart';
+import 'element_map.dart';
+import 'element_map_impl.dart';
+import 'locals.dart';
+
+class JsClosedWorld implements JClosedWorld {
+  static const String tag = 'closed-world';
+
+  final NativeData nativeData;
+  final InterceptorData interceptorData;
+  final BackendUsage backendUsage;
+  final NoSuchMethodData noSuchMethodData;
+
+  FunctionSet _allFunctions;
+
+  final Map<ClassEntity, Set<ClassEntity>> mixinUses;
+  Map<ClassEntity, List<ClassEntity>> _liveMixinUses;
+
+  final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
+
+  final Map<ClassEntity, Map<ClassEntity, bool>> _subtypeCoveredByCache =
+      <ClassEntity, Map<ClassEntity, bool>>{};
+
+  // TODO(johnniwinther): Can this be derived from [ClassSet]s?
+  final Set<ClassEntity> implementedClasses;
+
+  final Set<MemberEntity> liveInstanceMembers;
+
+  /// Members that are written either directly or through a setter selector.
+  final Set<MemberEntity> assignedInstanceMembers;
+
+  final Set<ClassEntity> liveNativeClasses;
+
+  final Set<MemberEntity> processedMembers;
+
+  final ClassHierarchy classHierarchy;
+
+  final JsKernelToElementMap elementMap;
+  final RuntimeTypesNeed rtiNeed;
+  AbstractValueDomain _abstractValueDomain;
+  final JAllocatorAnalysis allocatorAnalysis;
+  final AnnotationsData annotationsData;
+  final GlobalLocalsMap globalLocalsMap;
+  final ClosureData closureDataLookup;
+  final OutputUnitData outputUnitData;
+  Sorter _sorter;
+
+  JsClosedWorld(
+      this.elementMap,
+      this.nativeData,
+      this.interceptorData,
+      this.backendUsage,
+      this.rtiNeed,
+      this.allocatorAnalysis,
+      this.noSuchMethodData,
+      this.implementedClasses,
+      this.liveNativeClasses,
+      this.liveInstanceMembers,
+      this.assignedInstanceMembers,
+      this.processedMembers,
+      this.mixinUses,
+      this.typesImplementedBySubclasses,
+      this.classHierarchy,
+      AbstractValueStrategy abstractValueStrategy,
+      this.annotationsData,
+      this.globalLocalsMap,
+      this.closureDataLookup,
+      this.outputUnitData) {
+    _abstractValueDomain = abstractValueStrategy.createDomain(this);
+  }
+
+  /// Deserializes a [JsClosedWorld] object from [source].
+  factory JsClosedWorld.readFromDataSource(
+      CompilerOptions options,
+      DiagnosticReporter reporter,
+      Environment environment,
+      AbstractValueStrategy abstractValueStrategy,
+      ir.Component component,
+      DataSource source) {
+    source.begin(tag);
+
+    JsKernelToElementMap elementMap =
+        new JsKernelToElementMap.readFromDataSource(
+            options, reporter, environment, component, source);
+    GlobalLocalsMap globalLocalsMap =
+        new GlobalLocalsMap.readFromDataSource(source);
+    source.registerLocalLookup(new LocalLookupImpl(globalLocalsMap));
+    ClassHierarchy classHierarchy = new ClassHierarchy.readFromDataSource(
+        source, elementMap.commonElements);
+    NativeData nativeData = new NativeData.readFromDataSource(
+        source, elementMap.elementEnvironment);
+    elementMap.nativeBasicData = nativeData;
+    InterceptorData interceptorData = new InterceptorData.readFromDataSource(
+        source, nativeData, elementMap.commonElements);
+    BackendUsage backendUsage = new BackendUsage.readFromDataSource(source);
+    RuntimeTypesNeed rtiNeed = new RuntimeTypesNeed.readFromDataSource(
+        source, elementMap.elementEnvironment);
+    JAllocatorAnalysis allocatorAnalysis =
+        new JAllocatorAnalysis.readFromDataSource(source, options);
+    NoSuchMethodData noSuchMethodData =
+        new NoSuchMethodData.readFromDataSource(source);
+
+    Set<ClassEntity> implementedClasses = source.readClasses().toSet();
+    Set<ClassEntity> liveNativeClasses = source.readClasses().toSet();
+    Set<MemberEntity> liveInstanceMembers = source.readMembers().toSet();
+    Set<MemberEntity> assignedInstanceMembers = source.readMembers().toSet();
+    Set<MemberEntity> processedMembers = source.readMembers().toSet();
+    Map<ClassEntity, Set<ClassEntity>> mixinUses =
+        source.readClassMap(() => source.readClasses().toSet());
+    Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses =
+        source.readClassMap(() => source.readClasses().toSet());
+
+    AnnotationsData annotationsData =
+        new AnnotationsData.readFromDataSource(source);
+
+    ClosureData closureData =
+        new ClosureData.readFromDataSource(elementMap, source);
+
+    OutputUnitData outputUnitData =
+        new OutputUnitData.readFromDataSource(source);
+
+    source.end(tag);
+
+    return new JsClosedWorld(
+        elementMap,
+        nativeData,
+        interceptorData,
+        backendUsage,
+        rtiNeed,
+        allocatorAnalysis,
+        noSuchMethodData,
+        implementedClasses,
+        liveNativeClasses,
+        liveInstanceMembers,
+        assignedInstanceMembers,
+        processedMembers,
+        mixinUses,
+        typesImplementedBySubclasses,
+        classHierarchy,
+        abstractValueStrategy,
+        annotationsData,
+        globalLocalsMap,
+        closureData,
+        outputUnitData);
+  }
+
+  /// Serializes this [JsClosedWorld] to [sink].
+  void writeToDataSink(DataSink sink) {
+    sink.begin(tag);
+    elementMap.writeToDataSink(sink);
+    globalLocalsMap.writeToDataSink(sink);
+
+    classHierarchy.writeToDataSink(sink);
+    nativeData.writeToDataSink(sink);
+    interceptorData.writeToDataSink(sink);
+    backendUsage.writeToDataSink(sink);
+    rtiNeed.writeToDataSink(sink);
+    allocatorAnalysis.writeToDataSink(sink);
+    noSuchMethodData.writeToDataSink(sink);
+    sink.writeClasses(implementedClasses);
+    sink.writeClasses(liveNativeClasses);
+    sink.writeMembers(liveInstanceMembers);
+    sink.writeMembers(assignedInstanceMembers);
+    sink.writeMembers(processedMembers);
+    sink.writeClassMap(
+        mixinUses, (Set<ClassEntity> set) => sink.writeClasses(set));
+    sink.writeClassMap(typesImplementedBySubclasses,
+        (Set<ClassEntity> set) => sink.writeClasses(set));
+    annotationsData.writeToDataSink(sink);
+    closureDataLookup.writeToDataSink(sink);
+    outputUnitData.writeToDataSink(sink);
+    sink.end(tag);
+  }
+
+  ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
+
+  JElementEnvironment get elementEnvironment => elementMap.elementEnvironment;
+
+  JCommonElements get commonElements => elementMap.commonElements;
+
+  DartTypes get dartTypes => elementMap.types;
+
+  /// Returns `true` if [cls] is implemented by an instantiated class.
+  bool isImplemented(ClassEntity cls) {
+    return implementedClasses.contains(cls);
+  }
+
+  @override
+  ClassEntity getLubOfInstantiatedSubclasses(ClassEntity cls) {
+    if (nativeData.isJsInteropClass(cls)) {
+      return commonElements.jsJavaScriptObjectClass;
+    }
+    ClassHierarchyNode hierarchy = classHierarchy.getClassHierarchyNode(cls);
+    return hierarchy != null
+        ? hierarchy.getLubOfInstantiatedSubclasses()
+        : null;
+  }
+
+  @override
+  ClassEntity getLubOfInstantiatedSubtypes(ClassEntity cls) {
+    if (nativeData.isJsInteropClass(cls)) {
+      return commonElements.jsJavaScriptObjectClass;
+    }
+    ClassSet classSet = classHierarchy.getClassSet(cls);
+    return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null;
+  }
+
+  /// Returns `true` if [cls] is mixed into a live class.
+  bool isUsedAsMixin(ClassEntity cls) {
+    return !mixinUsesOf(cls).isEmpty;
+  }
+
+  /// Returns `true` if any live class that mixes in [cls] implements [type].
+  bool hasAnySubclassOfMixinUseThatImplements(
+      ClassEntity cls, ClassEntity type) {
+    return mixinUsesOf(cls)
+        .any((use) => hasAnySubclassThatImplements(use, type));
+  }
+
+  /// Returns `true` if every subtype of [x] is a subclass of [y] or a subclass
+  /// of a mixin application of [y].
+  bool everySubtypeIsSubclassOfOrMixinUseOf(ClassEntity x, ClassEntity y) {
+    Map<ClassEntity, bool> secondMap =
+        _subtypeCoveredByCache[x] ??= <ClassEntity, bool>{};
+    return secondMap[y] ??= classHierarchy.subtypesOf(x).every(
+        (ClassEntity cls) =>
+            classHierarchy.isSubclassOf(cls, y) ||
+            isSubclassOfMixinUseOf(cls, y));
+  }
+
+  /// Returns `true` if any subclass of [superclass] implements [type].
+  bool hasAnySubclassThatImplements(ClassEntity superclass, ClassEntity type) {
+    Set<ClassEntity> subclasses = typesImplementedBySubclasses[superclass];
+    if (subclasses == null) return false;
+    return subclasses.contains(type);
+  }
+
+  @override
+  bool needsNoSuchMethod(
+      ClassEntity base, Selector selector, ClassQuery query) {
+    /// Returns `true` if subclasses in the [rootNode] tree needs noSuchMethod
+    /// handling.
+    bool subclassesNeedNoSuchMethod(ClassHierarchyNode rootNode) {
+      if (!rootNode.isInstantiated) {
+        // No subclass needs noSuchMethod handling since they are all
+        // uninstantiated.
+        return false;
+      }
+      ClassEntity rootClass = rootNode.cls;
+      if (_hasConcreteMatch(rootClass, selector)) {
+        // The root subclass has a concrete implementation so no subclass needs
+        // noSuchMethod handling.
+        return false;
+      } else if (rootNode.isExplicitlyInstantiated) {
+        // The root class need noSuchMethod handling.
+        return true;
+      }
+      IterationStep result = rootNode.forEachSubclass((ClassEntity subclass) {
+        if (_hasConcreteMatch(subclass, selector,
+            stopAtSuperclass: rootClass)) {
+          // Found a match - skip all subclasses.
+          return IterationStep.SKIP_SUBCLASSES;
+        } else {
+          // Stop fast - we found a need for noSuchMethod handling.
+          return IterationStep.STOP;
+        }
+      }, ClassHierarchyNode.EXPLICITLY_INSTANTIATED, strict: true);
+      // We stopped fast so we need noSuchMethod handling.
+      return result == IterationStep.STOP;
+    }
+
+    ClassSet classSet = classHierarchy.getClassSet(base);
+    assert(classSet != null, failedAt(base, "No class set for $base."));
+    ClassHierarchyNode node = classSet.node;
+    if (query == ClassQuery.EXACT) {
+      return node.isExplicitlyInstantiated &&
+          !_hasConcreteMatch(base, selector);
+    } else if (query == ClassQuery.SUBCLASS) {
+      return subclassesNeedNoSuchMethod(node);
+    } else {
+      if (subclassesNeedNoSuchMethod(node)) return true;
+      for (ClassHierarchyNode subtypeNode in classSet.subtypeNodes) {
+        if (subclassesNeedNoSuchMethod(subtypeNode)) return true;
+      }
+      return false;
+    }
+  }
+
+  /// Returns an iterable over the common supertypes of the [classes].
+  Iterable<ClassEntity> commonSupertypesOf(Iterable<ClassEntity> classes) {
+    Iterator<ClassEntity> iterator = classes.iterator;
+    if (!iterator.moveNext()) return const <ClassEntity>[];
+
+    ClassEntity cls = iterator.current;
+    OrderedTypeSet typeSet = elementMap.getOrderedTypeSet(cls);
+    if (!iterator.moveNext()) return typeSet.types.map((type) => type.element);
+
+    int depth = typeSet.maxDepth;
+    Link<OrderedTypeSet> otherTypeSets = const Link<OrderedTypeSet>();
+    do {
+      ClassEntity otherClass = iterator.current;
+      OrderedTypeSet otherTypeSet = elementMap.getOrderedTypeSet(otherClass);
+      otherTypeSets = otherTypeSets.prepend(otherTypeSet);
+      if (otherTypeSet.maxDepth < depth) {
+        depth = otherTypeSet.maxDepth;
+      }
+    } while (iterator.moveNext());
+
+    List<ClassEntity> commonSupertypes = <ClassEntity>[];
+    OUTER:
+    for (Link<InterfaceType> link = typeSet[depth];
+        link.head.element != commonElements.objectClass;
+        link = link.tail) {
+      ClassEntity cls = link.head.element;
+      for (Link<OrderedTypeSet> link = otherTypeSets;
+          !link.isEmpty;
+          link = link.tail) {
+        if (link.head.asInstanceOf(cls, elementMap.getHierarchyDepth(cls)) ==
+            null) {
+          continue OUTER;
+        }
+      }
+      commonSupertypes.add(cls);
+    }
+    commonSupertypes.add(commonElements.objectClass);
+    return commonSupertypes;
+  }
+
+  /// Returns an iterable over the live mixin applications that mixin [cls].
+  Iterable<ClassEntity> mixinUsesOf(ClassEntity cls) {
+    if (_liveMixinUses == null) {
+      _liveMixinUses = new Map<ClassEntity, List<ClassEntity>>();
+      for (ClassEntity mixin in mixinUses.keys) {
+        List<ClassEntity> uses = <ClassEntity>[];
+
+        void addLiveUse(ClassEntity mixinApplication) {
+          if (classHierarchy.isInstantiated(mixinApplication)) {
+            uses.add(mixinApplication);
+          } else if (_isNamedMixinApplication(mixinApplication)) {
+            Set<ClassEntity> next = mixinUses[mixinApplication];
+            if (next != null) {
+              next.forEach(addLiveUse);
+            }
+          }
+        }
+
+        mixinUses[mixin].forEach(addLiveUse);
+        if (uses.isNotEmpty) {
+          _liveMixinUses[mixin] = uses;
+        }
+      }
+    }
+    Iterable<ClassEntity> uses = _liveMixinUses[cls];
+    return uses != null ? uses : const <ClassEntity>[];
+  }
+
+  /// Returns `true` if any live class that mixes in [mixin] is also a subclass
+  /// of [superclass].
+  bool hasAnySubclassThatMixes(ClassEntity superclass, ClassEntity mixin) {
+    return mixinUsesOf(mixin).any((ClassEntity each) {
+      return classHierarchy.isSubclassOf(each, superclass);
+    });
+  }
+
+  /// Returns `true` if [cls] or any superclass mixes in [mixin].
+  bool isSubclassOfMixinUseOf(ClassEntity cls, ClassEntity mixin) {
+    if (isUsedAsMixin(mixin)) {
+      ClassEntity current = cls;
+      while (current != null) {
+        ClassEntity currentMixin = elementMap.getAppliedMixin(current);
+        if (currentMixin == mixin) return true;
+        current = elementEnvironment.getSuperClass(current);
+      }
+    }
+    return false;
+  }
+
+  void _ensureFunctionSet() {
+    if (_allFunctions == null) {
+      // [FunctionSet] is created lazily because it is not used when we switch
+      // from a frontend to a backend model before inference.
+      _allFunctions = new FunctionSet(liveInstanceMembers);
+    }
+  }
+
+  /// Returns `true` if [selector] on [receiver] can hit a `call` method on a
+  /// subclass of `Closure`.
+  ///
+  /// Every implementation of `Closure` has a 'call' method with its own
+  /// signature so it cannot be modelled by a [FunctionEntity]. Also,
+  /// call-methods for tear-off are not part of the element model.
+  bool includesClosureCall(Selector selector, AbstractValue receiver) {
+    return selector.name == Identifiers.call &&
+        (receiver == null ||
+            // TODO(johnniwinther): Should this have been `intersects` instead?
+            abstractValueDomain
+                .contains(receiver, abstractValueDomain.functionType)
+                .isPotentiallyTrue);
+  }
+
+  AbstractValue computeReceiverType(Selector selector, AbstractValue receiver) {
+    _ensureFunctionSet();
+    if (includesClosureCall(selector, receiver)) {
+      return abstractValueDomain.dynamicType;
+    }
+    return _allFunctions.receiverType(selector, receiver, abstractValueDomain);
+  }
+
+  Iterable<MemberEntity> locateMembers(
+      Selector selector, AbstractValue receiver) {
+    _ensureFunctionSet();
+    return _allFunctions.filter(selector, receiver, abstractValueDomain);
+  }
+
+  bool hasAnyUserDefinedGetter(Selector selector, AbstractValue receiver) {
+    _ensureFunctionSet();
+    return _allFunctions
+        .filter(selector, receiver, abstractValueDomain)
+        .any((each) => each.isGetter);
+  }
+
+  MemberEntity locateSingleMember(Selector selector, AbstractValue receiver) {
+    if (includesClosureCall(selector, receiver)) {
+      return null;
+    }
+    receiver ??= abstractValueDomain.dynamicType;
+    return abstractValueDomain.locateSingleMember(receiver, selector);
+  }
+
+  bool fieldNeverChanges(MemberEntity element) {
+    if (!element.isField) return false;
+    if (nativeData.isNativeMember(element)) {
+      // Some native fields are views of data that may be changed by operations.
+      // E.g. node.firstChild depends on parentNode.removeBefore(n1, n2).
+      // TODO(sra): Refine the effect classification so that native effects are
+      // distinct from ordinary Dart effects.
+      return false;
+    }
+
+    if (!element.isAssignable) {
+      return true;
+    }
+    if (element.isInstanceMember) {
+      return !assignedInstanceMembers.contains(element);
+    }
+    return false;
+  }
+
+  @override
+  Sorter get sorter {
+    return _sorter ??= new KernelSorter(elementMap);
+  }
+
+  @override
+  AbstractValueDomain get abstractValueDomain {
+    return _abstractValueDomain;
+  }
+
+  @override
+  bool hasElementIn(ClassEntity cls, Name name, Entity element) {
+    while (cls != null) {
+      MemberEntity member = elementEnvironment
+          .lookupLocalClassMember(cls, name.text, setter: name.isSetter);
+      if (member != null &&
+          !member.isAbstract &&
+          (!name.isPrivate || member.library == name.library)) {
+        return member == element;
+      }
+      cls = elementEnvironment.getSuperClass(cls);
+    }
+    return false;
+  }
+
+  /// Returns whether a [selector] call on an instance of [cls]
+  /// will hit a method at runtime, and not go through [noSuchMethod].
+  bool _hasConcreteMatch(ClassEntity cls, Selector selector,
+      {ClassEntity stopAtSuperclass}) {
+    assert(classHierarchy.isInstantiated(cls),
+        failedAt(cls, '$cls has not been instantiated.'));
+    MemberEntity element = elementEnvironment
+        .lookupClassMember(cls, selector.name, setter: selector.isSetter);
+    if (element == null) return false;
+
+    if (element.isAbstract) {
+      ClassEntity enclosingClass = element.enclosingClass;
+      return _hasConcreteMatch(
+          elementEnvironment.getSuperClass(enclosingClass), selector);
+    }
+    return selector.appliesUnnamed(element);
+  }
+
+  bool _isNamedMixinApplication(ClassEntity cls) {
+    return elementEnvironment.isMixinApplication(cls) &&
+        !elementEnvironment.isUnnamedMixinApplication(cls);
+  }
+}
+
+class KernelSorter implements Sorter {
+  final JsToElementMap elementMap;
+
+  KernelSorter(this.elementMap);
+
+  int _compareLibraries(LibraryEntity a, LibraryEntity b) {
+    return utils.compareLibrariesUris(a.canonicalUri, b.canonicalUri);
+  }
+
+  int _compareSourceSpans(Entity entity1, SourceSpan sourceSpan1,
+      Entity entity2, SourceSpan sourceSpan2) {
+    int r = utils.compareSourceUris(sourceSpan1.uri, sourceSpan2.uri);
+    if (r != 0) return r;
+    return utils.compareEntities(
+        entity1, sourceSpan1.begin, null, entity2, sourceSpan2.begin, null);
+  }
+
+  @override
+  Iterable<LibraryEntity> sortLibraries(Iterable<LibraryEntity> libraries) {
+    return libraries.toList()..sort(_compareLibraries);
+  }
+
+  @override
+  Iterable<T> sortMembers<T extends MemberEntity>(Iterable<T> members) {
+    return members.toList()..sort(compareMembersByLocation);
+  }
+
+  @override
+  Iterable<ClassEntity> sortClasses(Iterable<ClassEntity> classes) {
+    List<ClassEntity> regularClasses = <ClassEntity>[];
+    List<ClassEntity> unnamedMixins = <ClassEntity>[];
+    for (ClassEntity cls in classes) {
+      if (elementMap.elementEnvironment.isUnnamedMixinApplication(cls)) {
+        unnamedMixins.add(cls);
+      } else {
+        regularClasses.add(cls);
+      }
+    }
+    List<ClassEntity> sorted = <ClassEntity>[];
+    regularClasses.sort(compareClassesByLocation);
+    sorted.addAll(regularClasses);
+    unnamedMixins.sort((a, b) {
+      int result = _compareLibraries(a.library, b.library);
+      if (result != 0) return result;
+      result = a.name.compareTo(b.name);
+      assert(result != 0,
+          failedAt(a, "Multiple mixins named ${a.name}: $a vs $b."));
+      return result;
+    });
+    sorted.addAll(unnamedMixins);
+    return sorted;
+  }
+
+  @override
+  Iterable<TypedefEntity> sortTypedefs(Iterable<TypedefEntity> typedefs) {
+    // TODO(redemption): Support this.
+    assert(typedefs.isEmpty);
+    return typedefs;
+  }
+
+  @override
+  int compareLibrariesByLocation(LibraryEntity a, LibraryEntity b) {
+    return _compareLibraries(a, b);
+  }
+
+  @override
+  int compareClassesByLocation(ClassEntity a, ClassEntity b) {
+    int r = _compareLibraries(a.library, b.library);
+    if (r != 0) return r;
+    ClassDefinition definition1 = elementMap.getClassDefinition(a);
+    ClassDefinition definition2 = elementMap.getClassDefinition(b);
+    return _compareSourceSpans(
+        a, definition1.location, b, definition2.location);
+  }
+
+  @override
+  int compareTypedefsByLocation(TypedefEntity a, TypedefEntity b) {
+    // TODO(redemption): Support this.
+    failedAt(a, 'KernelSorter.compareTypedefsByLocation unimplemented');
+    return 0;
+  }
+
+  @override
+  int compareMembersByLocation(MemberEntity a, MemberEntity b) {
+    int r = _compareLibraries(a.library, b.library);
+    if (r != 0) return r;
+    MemberDefinition definition1 = elementMap.getMemberDefinition(a);
+    MemberDefinition definition2 = elementMap.getMemberDefinition(b);
+    return _compareSourceSpans(
+        a, definition1.location, b, definition2.location);
+  }
+}
+
+/// [LocalLookup] implementation used to deserialize [JsClosedWorld].
+class LocalLookupImpl implements LocalLookup {
+  final GlobalLocalsMap _globalLocalsMap;
+
+  LocalLookupImpl(this._globalLocalsMap);
+
+  @override
+  Local getLocalByIndex(MemberEntity memberContext, int index) {
+    KernelToLocalsMapImpl map = _globalLocalsMap.getLocalsMap(memberContext);
+    return map.getLocalByIndex(index);
+  }
+}
diff --git a/pkg/compiler/lib/src/js_model/js_world_builder.dart b/pkg/compiler/lib/src/js_model/js_world_builder.dart
new file mode 100644
index 0000000..552d014
--- /dev/null
+++ b/pkg/compiler/lib/src/js_model/js_world_builder.dart
@@ -0,0 +1,757 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+
+import '../closure.dart';
+import '../common_elements.dart';
+import '../constants/values.dart';
+import '../deferred_load.dart';
+import '../elements/entities.dart';
+import '../elements/names.dart';
+import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../ir/closure.dart';
+import '../js_backend/annotations.dart';
+import '../js_backend/allocator_analysis.dart';
+import '../js_backend/backend_usage.dart';
+import '../js_backend/interceptor_data.dart';
+import '../js_backend/native_data.dart';
+import '../js_backend/no_such_method_registry.dart';
+import '../js_backend/runtime_types.dart';
+import '../kernel/kelements.dart';
+import '../native/behavior.dart';
+import '../options.dart';
+import '../universe/class_hierarchy.dart';
+import '../universe/class_set.dart';
+import '../universe/feature.dart';
+import '../universe/selector.dart';
+import '../world.dart';
+import 'closure.dart';
+import 'elements.dart';
+import 'element_map.dart';
+import 'element_map_impl.dart';
+import 'js_world.dart';
+import 'locals.dart';
+
+class JsClosedWorldBuilder {
+  final JsKernelToElementMap _elementMap;
+  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes =
+      new ClassHierarchyNodesMap();
+  final Map<ClassEntity, ClassSet> _classSets = <ClassEntity, ClassSet>{};
+  final GlobalLocalsMap _globalLocalsMap;
+  final ClosureDataBuilder _closureDataBuilder;
+  final CompilerOptions _options;
+  final AbstractValueStrategy _abstractValueStrategy;
+
+  JsClosedWorldBuilder(this._elementMap, this._globalLocalsMap,
+      this._closureDataBuilder, this._options, this._abstractValueStrategy);
+
+  ElementEnvironment get _elementEnvironment => _elementMap.elementEnvironment;
+  CommonElements get _commonElements => _elementMap.commonElements;
+
+  JsClosedWorld convertClosedWorld(
+      KClosedWorld closedWorld,
+      Map<MemberEntity, ClosureScopeModel> closureModels,
+      OutputUnitData kOutputUnitData) {
+    JsToFrontendMap map = new JsToFrontendMapImpl(_elementMap);
+
+    BackendUsage backendUsage =
+        _convertBackendUsage(map, closedWorld.backendUsage);
+    NativeData nativeData = _convertNativeData(map, closedWorld.nativeData);
+    _elementMap.nativeBasicData = nativeData;
+    InterceptorData interceptorData =
+        _convertInterceptorData(map, nativeData, closedWorld.interceptorData);
+
+    Set<ClassEntity> implementedClasses = new Set<ClassEntity>();
+
+    /// Converts [node] from the frontend world to the corresponding
+    /// [ClassHierarchyNode] for the backend world.
+    ClassHierarchyNode convertClassHierarchyNode(ClassHierarchyNode node) {
+      ClassEntity cls = map.toBackendClass(node.cls);
+      if (closedWorld.isImplemented(node.cls)) {
+        implementedClasses.add(cls);
+      }
+      ClassHierarchyNode newNode = _classHierarchyNodes.putIfAbsent(cls, () {
+        ClassHierarchyNode parentNode;
+        if (node.parentNode != null) {
+          parentNode = convertClassHierarchyNode(node.parentNode);
+        }
+        return new ClassHierarchyNode(parentNode, cls, node.hierarchyDepth);
+      });
+      newNode.isAbstractlyInstantiated = node.isAbstractlyInstantiated;
+      newNode.isDirectlyInstantiated = node.isDirectlyInstantiated;
+      return newNode;
+    }
+
+    /// Converts [classSet] from the frontend world to the corresponding
+    /// [ClassSet] for the backend world.
+    ClassSet convertClassSet(ClassSet classSet) {
+      ClassEntity cls = map.toBackendClass(classSet.cls);
+      return _classSets.putIfAbsent(cls, () {
+        ClassHierarchyNode newNode = convertClassHierarchyNode(classSet.node);
+        ClassSet newClassSet = new ClassSet(newNode);
+        for (ClassHierarchyNode subtype in classSet.subtypeNodes) {
+          ClassHierarchyNode newSubtype = convertClassHierarchyNode(subtype);
+          newClassSet.addSubtype(newSubtype);
+        }
+        return newClassSet;
+      });
+    }
+
+    closedWorld.classHierarchy
+        .getClassHierarchyNode(closedWorld.commonElements.objectClass)
+        .forEachSubclass((ClassEntity cls) {
+      convertClassSet(closedWorld.classHierarchy.getClassSet(cls));
+    }, ClassHierarchyNode.ALL);
+
+    Set<MemberEntity> liveInstanceMembers =
+        map.toBackendMemberSet(closedWorld.liveInstanceMembers);
+
+    Map<ClassEntity, Set<ClassEntity>> mixinUses =
+        map.toBackendClassMap(closedWorld.mixinUses, map.toBackendClassSet);
+
+    Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses =
+        map.toBackendClassMap(
+            closedWorld.typesImplementedBySubclasses, map.toBackendClassSet);
+
+    Set<MemberEntity> assignedInstanceMembers =
+        map.toBackendMemberSet(closedWorld.assignedInstanceMembers);
+
+    Set<ClassEntity> liveNativeClasses =
+        map.toBackendClassSet(closedWorld.liveNativeClasses);
+
+    Set<MemberEntity> processedMembers =
+        map.toBackendMemberSet(closedWorld.processedMembers);
+
+    RuntimeTypesNeed rtiNeed;
+
+    List<FunctionEntity> callMethods = <FunctionEntity>[];
+    ClosureData closureData;
+    if (_options.disableRtiOptimization) {
+      rtiNeed = new TrivialRuntimeTypesNeed();
+      closureData = _closureDataBuilder.createClosureEntities(
+          this,
+          map.toBackendMemberMap(closureModels, identity),
+          const TrivialClosureRtiNeed(),
+          callMethods);
+    } else {
+      RuntimeTypesNeedImpl kernelRtiNeed = closedWorld.rtiNeed;
+      Set<ir.Node> localFunctionsNodesNeedingSignature = new Set<ir.Node>();
+      for (KLocalFunction localFunction
+          in kernelRtiNeed.localFunctionsNeedingSignature) {
+        ir.Node node = localFunction.node;
+        assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression,
+            "Unexpected local function node: $node");
+        localFunctionsNodesNeedingSignature.add(node);
+      }
+      Set<ir.Node> localFunctionsNodesNeedingTypeArguments = new Set<ir.Node>();
+      for (KLocalFunction localFunction
+          in kernelRtiNeed.localFunctionsNeedingTypeArguments) {
+        ir.Node node = localFunction.node;
+        assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression,
+            "Unexpected local function node: $node");
+        localFunctionsNodesNeedingTypeArguments.add(node);
+      }
+
+      RuntimeTypesNeedImpl jRtiNeed =
+          _convertRuntimeTypesNeed(map, backendUsage, kernelRtiNeed);
+      closureData = _closureDataBuilder.createClosureEntities(
+          this,
+          map.toBackendMemberMap(closureModels, identity),
+          new JsClosureRtiNeed(
+              jRtiNeed,
+              localFunctionsNodesNeedingTypeArguments,
+              localFunctionsNodesNeedingSignature),
+          callMethods);
+
+      List<FunctionEntity> callMethodsNeedingSignature = <FunctionEntity>[];
+      for (ir.Node node in localFunctionsNodesNeedingSignature) {
+        callMethodsNeedingSignature
+            .add(closureData.getClosureInfo(node).callMethod);
+      }
+      List<FunctionEntity> callMethodsNeedingTypeArguments = <FunctionEntity>[];
+      for (ir.Node node in localFunctionsNodesNeedingTypeArguments) {
+        callMethodsNeedingTypeArguments
+            .add(closureData.getClosureInfo(node).callMethod);
+      }
+      jRtiNeed.methodsNeedingSignature.addAll(callMethodsNeedingSignature);
+      jRtiNeed.methodsNeedingTypeArguments
+          .addAll(callMethodsNeedingTypeArguments);
+
+      rtiNeed = jRtiNeed;
+    }
+
+    NoSuchMethodDataImpl oldNoSuchMethodData = closedWorld.noSuchMethodData;
+    NoSuchMethodData noSuchMethodData = new NoSuchMethodDataImpl(
+        map.toBackendFunctionSet(oldNoSuchMethodData.throwingImpls),
+        map.toBackendFunctionSet(oldNoSuchMethodData.otherImpls),
+        map.toBackendFunctionSet(oldNoSuchMethodData.forwardingSyntaxImpls));
+
+    JAllocatorAnalysis allocatorAnalysis =
+        JAllocatorAnalysis.from(closedWorld.allocatorAnalysis, map, _options);
+
+    AnnotationsData annotationsData = new AnnotationsDataImpl(
+        map.toBackendFunctionSet(
+            closedWorld.annotationsData.nonInlinableFunctions),
+        map.toBackendFunctionSet(
+            closedWorld.annotationsData.tryInlineFunctions),
+        map.toBackendFunctionSet(
+            closedWorld.annotationsData.disableFinalFunctions),
+        map.toBackendFunctionSet(
+            closedWorld.annotationsData.cannotThrowFunctions),
+        map.toBackendFunctionSet(
+            closedWorld.annotationsData.sideEffectFreeFunctions),
+        map.toBackendMemberSet(
+            closedWorld.annotationsData.assumeDynamicMembers));
+
+    OutputUnitData outputUnitData =
+        _convertOutputUnitData(map, kOutputUnitData, closureData);
+
+    return new JsClosedWorld(
+        _elementMap,
+        nativeData,
+        interceptorData,
+        backendUsage,
+        rtiNeed,
+        allocatorAnalysis,
+        noSuchMethodData,
+        implementedClasses,
+        liveNativeClasses,
+        // TODO(johnniwinther): Include the call method when we can also
+        // represent the synthesized call methods for static and instance method
+        // closurizations.
+        liveInstanceMembers /*..addAll(callMethods)*/,
+        assignedInstanceMembers,
+        processedMembers,
+        mixinUses,
+        typesImplementedBySubclasses,
+        new ClassHierarchyImpl(
+            _elementMap.commonElements, _classHierarchyNodes, _classSets),
+        _abstractValueStrategy,
+        annotationsData,
+        _globalLocalsMap,
+        closureData,
+        outputUnitData);
+  }
+
+  BackendUsage _convertBackendUsage(
+      JsToFrontendMap map, BackendUsageImpl backendUsage) {
+    Set<FunctionEntity> globalFunctionDependencies =
+        map.toBackendFunctionSet(backendUsage.globalFunctionDependencies);
+    Set<ClassEntity> globalClassDependencies =
+        map.toBackendClassSet(backendUsage.globalClassDependencies);
+    Set<FunctionEntity> helperFunctionsUsed =
+        map.toBackendFunctionSet(backendUsage.helperFunctionsUsed);
+    Set<ClassEntity> helperClassesUsed =
+        map.toBackendClassSet(backendUsage.helperClassesUsed);
+    Set<RuntimeTypeUse> runtimeTypeUses =
+        backendUsage.runtimeTypeUses.map((RuntimeTypeUse runtimeTypeUse) {
+      return new RuntimeTypeUse(
+          runtimeTypeUse.kind,
+          map.toBackendType(runtimeTypeUse.receiverType),
+          map.toBackendType(runtimeTypeUse.argumentType));
+    }).toSet();
+
+    return new BackendUsageImpl(
+        globalFunctionDependencies: globalFunctionDependencies,
+        globalClassDependencies: globalClassDependencies,
+        helperFunctionsUsed: helperFunctionsUsed,
+        helperClassesUsed: helperClassesUsed,
+        needToInitializeIsolateAffinityTag:
+            backendUsage.needToInitializeIsolateAffinityTag,
+        needToInitializeDispatchProperty:
+            backendUsage.needToInitializeDispatchProperty,
+        requiresPreamble: backendUsage.requiresPreamble,
+        runtimeTypeUses: runtimeTypeUses,
+        isFunctionApplyUsed: backendUsage.isFunctionApplyUsed,
+        isMirrorsUsed: backendUsage.isMirrorsUsed,
+        isNoSuchMethodUsed: backendUsage.isNoSuchMethodUsed);
+  }
+
+  NativeBasicData _convertNativeBasicData(
+      JsToFrontendMap map, NativeBasicDataImpl nativeBasicData) {
+    Map<ClassEntity, NativeClassTag> nativeClassTagInfo =
+        <ClassEntity, NativeClassTag>{};
+    nativeBasicData.nativeClassTagInfo
+        .forEach((ClassEntity cls, NativeClassTag tag) {
+      nativeClassTagInfo[map.toBackendClass(cls)] = tag;
+    });
+    Map<LibraryEntity, String> jsInteropLibraries =
+        map.toBackendLibraryMap(nativeBasicData.jsInteropLibraries, identity);
+    Map<ClassEntity, String> jsInteropClasses =
+        map.toBackendClassMap(nativeBasicData.jsInteropClasses, identity);
+    Set<ClassEntity> anonymousJsInteropClasses =
+        map.toBackendClassSet(nativeBasicData.anonymousJsInteropClasses);
+    Map<MemberEntity, String> jsInteropMembers =
+        map.toBackendMemberMap(nativeBasicData.jsInteropMembers, identity);
+    return new NativeBasicDataImpl(
+        _elementEnvironment,
+        nativeClassTagInfo,
+        jsInteropLibraries,
+        jsInteropClasses,
+        anonymousJsInteropClasses,
+        jsInteropMembers);
+  }
+
+  NativeData _convertNativeData(
+      JsToFrontendMap map, NativeDataImpl nativeData) {
+    convertNativeBehaviorType(type) {
+      if (type is DartType) return map.toBackendType(type);
+      assert(type is SpecialType);
+      return type;
+    }
+
+    NativeBehavior convertNativeBehavior(NativeBehavior behavior) {
+      NativeBehavior newBehavior = new NativeBehavior();
+
+      for (dynamic type in behavior.typesReturned) {
+        newBehavior.typesReturned.add(convertNativeBehaviorType(type));
+      }
+      for (dynamic type in behavior.typesInstantiated) {
+        newBehavior.typesInstantiated.add(convertNativeBehaviorType(type));
+      }
+
+      newBehavior.codeTemplateText = behavior.codeTemplateText;
+      newBehavior.codeTemplate = behavior.codeTemplate;
+      newBehavior.throwBehavior = behavior.throwBehavior;
+      newBehavior.isAllocation = behavior.isAllocation;
+      newBehavior.useGvn = behavior.useGvn;
+      return newBehavior;
+    }
+
+    NativeBasicData nativeBasicData = _convertNativeBasicData(map, nativeData);
+
+    Map<MemberEntity, String> nativeMemberName =
+        map.toBackendMemberMap(nativeData.nativeMemberName, identity);
+    Map<FunctionEntity, NativeBehavior> nativeMethodBehavior =
+        <FunctionEntity, NativeBehavior>{};
+    nativeData.nativeMethodBehavior
+        .forEach((FunctionEntity method, NativeBehavior behavior) {
+      FunctionEntity backendMethod = map.toBackendMember(method);
+      if (backendMethod != null) {
+        // If [method] isn't used it doesn't have a corresponding backend
+        // method.
+        nativeMethodBehavior[backendMethod] = convertNativeBehavior(behavior);
+      }
+    });
+    Map<MemberEntity, NativeBehavior> nativeFieldLoadBehavior =
+        map.toBackendMemberMap(
+            nativeData.nativeFieldLoadBehavior, convertNativeBehavior);
+    Map<MemberEntity, NativeBehavior> nativeFieldStoreBehavior =
+        map.toBackendMemberMap(
+            nativeData.nativeFieldStoreBehavior, convertNativeBehavior);
+    Map<LibraryEntity, String> jsInteropLibraryNames =
+        map.toBackendLibraryMap(nativeData.jsInteropLibraries, identity);
+    Set<ClassEntity> anonymousJsInteropClasses =
+        map.toBackendClassSet(nativeData.anonymousJsInteropClasses);
+    Map<ClassEntity, String> jsInteropClassNames =
+        map.toBackendClassMap(nativeData.jsInteropClasses, identity);
+    Map<MemberEntity, String> jsInteropMemberNames =
+        map.toBackendMemberMap(nativeData.jsInteropMembers, identity);
+
+    return new NativeDataImpl(
+        nativeBasicData,
+        nativeMemberName,
+        nativeMethodBehavior,
+        nativeFieldLoadBehavior,
+        nativeFieldStoreBehavior,
+        jsInteropLibraryNames,
+        anonymousJsInteropClasses,
+        jsInteropClassNames,
+        jsInteropMemberNames);
+  }
+
+  InterceptorData _convertInterceptorData(JsToFrontendMap map,
+      NativeData nativeData, InterceptorDataImpl interceptorData) {
+    Map<String, Set<MemberEntity>> interceptedMembers =
+        <String, Set<MemberEntity>>{};
+    interceptorData.interceptedMembers
+        .forEach((String name, Set<MemberEntity> members) {
+      interceptedMembers[name] = map.toBackendMemberSet(members);
+    });
+    return new InterceptorDataImpl(
+        nativeData,
+        _commonElements,
+        interceptedMembers,
+        map.toBackendClassSet(interceptorData.interceptedClasses),
+        map.toBackendClassSet(
+            interceptorData.classesMixedIntoInterceptedClasses));
+  }
+
+  RuntimeTypesNeed _convertRuntimeTypesNeed(JsToFrontendMap map,
+      BackendUsage backendUsage, RuntimeTypesNeedImpl rtiNeed) {
+    Set<ClassEntity> classesNeedingTypeArguments =
+        map.toBackendClassSet(rtiNeed.classesNeedingTypeArguments);
+    Set<FunctionEntity> methodsNeedingTypeArguments =
+        map.toBackendFunctionSet(rtiNeed.methodsNeedingTypeArguments);
+    Set<FunctionEntity> methodsNeedingSignature =
+        map.toBackendFunctionSet(rtiNeed.methodsNeedingSignature);
+    Set<Selector> selectorsNeedingTypeArguments =
+        rtiNeed.selectorsNeedingTypeArguments.map((Selector selector) {
+      if (selector.memberName.isPrivate) {
+        return new Selector(
+            selector.kind,
+            new PrivateName(selector.memberName.text,
+                map.toBackendLibrary(selector.memberName.library),
+                isSetter: selector.memberName.isSetter),
+            selector.callStructure);
+      }
+      return selector;
+    }).toSet();
+    return new RuntimeTypesNeedImpl(
+        _elementEnvironment,
+        classesNeedingTypeArguments,
+        methodsNeedingSignature,
+        methodsNeedingTypeArguments,
+        null,
+        null,
+        selectorsNeedingTypeArguments,
+        rtiNeed.instantiationsNeedingTypeArguments);
+  }
+
+  /// Construct a closure class and set up the necessary class inference
+  /// hierarchy.
+  KernelClosureClassInfo buildClosureClass(
+      MemberEntity member,
+      ir.FunctionNode originalClosureFunctionNode,
+      JLibrary enclosingLibrary,
+      Map<Local, JRecordField> boxedVariables,
+      KernelScopeInfo info,
+      KernelToLocalsMap localsMap,
+      {bool createSignatureMethod}) {
+    ClassEntity superclass = _commonElements.closureClass;
+
+    KernelClosureClassInfo closureClassInfo = _elementMap.constructClosureClass(
+        member,
+        originalClosureFunctionNode,
+        enclosingLibrary,
+        boxedVariables,
+        info,
+        localsMap,
+        new InterfaceType(superclass, const []),
+        createSignatureMethod: createSignatureMethod);
+
+    // Tell the hierarchy that this is the super class. then we can use
+    // .getSupertypes(class)
+    ClassHierarchyNode parentNode = _classHierarchyNodes[superclass];
+    ClassHierarchyNode node = new ClassHierarchyNode(parentNode,
+        closureClassInfo.closureClassEntity, parentNode.hierarchyDepth + 1);
+    _classHierarchyNodes[closureClassInfo.closureClassEntity] = node;
+    _classSets[closureClassInfo.closureClassEntity] = new ClassSet(node);
+    node.isDirectlyInstantiated = true;
+
+    return closureClassInfo;
+  }
+
+  OutputUnitData _convertOutputUnitData(JsToFrontendMapImpl map,
+      OutputUnitData data, ClosureData closureDataLookup) {
+    Entity toBackendEntity(Entity entity) {
+      if (entity is ClassEntity) return map.toBackendClass(entity);
+      if (entity is MemberEntity) return map.toBackendMember(entity);
+      if (entity is TypedefEntity) return map.toBackendTypedef(entity);
+      if (entity is TypeVariableEntity) {
+        return map.toBackendTypeVariable(entity);
+      }
+      assert(
+          entity is LibraryEntity, 'unexpected entity ${entity.runtimeType}');
+      return map.toBackendLibrary(entity);
+    }
+
+    // Convert front-end maps containing K-class and K-local function keys to a
+    // backend map using J-classes as keys.
+    Map<ClassEntity, OutputUnit> convertClassMap(
+        Map<ClassEntity, OutputUnit> classMap,
+        Map<Local, OutputUnit> localFunctionMap) {
+      var result = <ClassEntity, OutputUnit>{};
+      classMap.forEach((ClassEntity entity, OutputUnit unit) {
+        ClassEntity backendEntity = toBackendEntity(entity);
+        if (backendEntity != null) {
+          // If [entity] isn't used it doesn't have a corresponding backend
+          // entity.
+          result[backendEntity] = unit;
+        }
+      });
+      localFunctionMap.forEach((Local entity, OutputUnit unit) {
+        // Ensure closure classes are included in the output unit corresponding
+        // to the local function.
+        if (entity is KLocalFunction) {
+          var closureInfo = closureDataLookup.getClosureInfo(entity.node);
+          result[closureInfo.closureClassEntity] = unit;
+        }
+      });
+      return result;
+    }
+
+    // Convert front-end maps containing K-member and K-local function keys to
+    // a backend map using J-members as keys.
+    Map<MemberEntity, OutputUnit> convertMemberMap(
+        Map<MemberEntity, OutputUnit> memberMap,
+        Map<Local, OutputUnit> localFunctionMap) {
+      var result = <MemberEntity, OutputUnit>{};
+      memberMap.forEach((MemberEntity entity, OutputUnit unit) {
+        MemberEntity backendEntity = toBackendEntity(entity);
+        if (backendEntity != null) {
+          // If [entity] isn't used it doesn't have a corresponding backend
+          // entity.
+          result[backendEntity] = unit;
+        }
+      });
+      localFunctionMap.forEach((Local entity, OutputUnit unit) {
+        // Ensure closure call-methods are included in the output unit
+        // corresponding to the local function.
+        if (entity is KLocalFunction) {
+          var closureInfo = closureDataLookup.getClosureInfo(entity.node);
+          result[closureInfo.callMethod] = unit;
+        }
+      });
+      return result;
+    }
+
+    ConstantValue toBackendConstant(ConstantValue constant) {
+      return constant.accept(new ConstantConverter(toBackendEntity), null);
+    }
+
+    return new OutputUnitData.from(
+        data,
+        map.toBackendLibrary,
+        convertClassMap,
+        convertMemberMap,
+        (m) => convertMap<ConstantValue, OutputUnit>(
+            m, toBackendConstant, (v) => v));
+  }
+}
+
+class TrivialClosureRtiNeed implements ClosureRtiNeed {
+  const TrivialClosureRtiNeed();
+
+  @override
+  bool localFunctionNeedsSignature(ir.Node node) => true;
+
+  @override
+  bool classNeedsTypeArguments(ClassEntity cls) => true;
+
+  @override
+  bool methodNeedsTypeArguments(FunctionEntity method) => true;
+
+  @override
+  bool localFunctionNeedsTypeArguments(ir.Node node) => true;
+
+  @override
+  bool selectorNeedsTypeArguments(Selector selector) => true;
+
+  @override
+  bool methodNeedsSignature(MemberEntity method) => true;
+
+  @override
+  bool instantiationNeedsTypeArguments(
+          DartType functionType, int typeArgumentCount) =>
+      true;
+}
+
+class JsClosureRtiNeed implements ClosureRtiNeed {
+  final RuntimeTypesNeed rtiNeed;
+  final Set<ir.Node> localFunctionsNodesNeedingTypeArguments;
+  final Set<ir.Node> localFunctionsNodesNeedingSignature;
+
+  JsClosureRtiNeed(this.rtiNeed, this.localFunctionsNodesNeedingTypeArguments,
+      this.localFunctionsNodesNeedingSignature);
+
+  @override
+  bool localFunctionNeedsSignature(ir.Node node) {
+    assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
+    return localFunctionsNodesNeedingSignature.contains(node);
+  }
+
+  @override
+  bool classNeedsTypeArguments(ClassEntity cls) =>
+      rtiNeed.classNeedsTypeArguments(cls);
+
+  @override
+  bool methodNeedsTypeArguments(FunctionEntity method) =>
+      rtiNeed.methodNeedsTypeArguments(method);
+
+  @override
+  bool localFunctionNeedsTypeArguments(ir.Node node) {
+    assert(node is ir.FunctionDeclaration || node is ir.FunctionExpression);
+    return localFunctionsNodesNeedingTypeArguments.contains(node);
+  }
+
+  @override
+  bool selectorNeedsTypeArguments(Selector selector) =>
+      rtiNeed.selectorNeedsTypeArguments(selector);
+
+  @override
+  bool methodNeedsSignature(MemberEntity method) =>
+      rtiNeed.methodNeedsSignature(method);
+
+  @override
+  bool instantiationNeedsTypeArguments(
+          DartType functionType, int typeArgumentCount) =>
+      rtiNeed.instantiationNeedsTypeArguments(functionType, typeArgumentCount);
+}
+
+class ConstantConverter implements ConstantValueVisitor<ConstantValue, Null> {
+  final Entity Function(Entity) toBackendEntity;
+  final TypeConverter typeConverter;
+
+  ConstantConverter(this.toBackendEntity)
+      : typeConverter = new TypeConverter(toBackendEntity);
+
+  ConstantValue visitNull(NullConstantValue constant, _) => constant;
+  ConstantValue visitInt(IntConstantValue constant, _) => constant;
+  ConstantValue visitDouble(DoubleConstantValue constant, _) => constant;
+  ConstantValue visitBool(BoolConstantValue constant, _) => constant;
+  ConstantValue visitString(StringConstantValue constant, _) => constant;
+  ConstantValue visitSynthetic(SyntheticConstantValue constant, _) => constant;
+  ConstantValue visitNonConstant(NonConstantValue constant, _) => constant;
+
+  ConstantValue visitFunction(FunctionConstantValue constant, _) {
+    return new FunctionConstantValue(
+        toBackendEntity(constant.element), typeConverter.visit(constant.type));
+  }
+
+  ConstantValue visitList(ListConstantValue constant, _) {
+    DartType type = typeConverter.visit(constant.type);
+    List<ConstantValue> entries = _handleValues(constant.entries);
+    if (identical(entries, constant.entries) && type == constant.type) {
+      return constant;
+    }
+    return new ListConstantValue(type, entries);
+  }
+
+  ConstantValue visitMap(MapConstantValue constant, _) {
+    var type = typeConverter.visit(constant.type);
+    List<ConstantValue> keys = _handleValues(constant.keys);
+    List<ConstantValue> values = _handleValues(constant.values);
+    if (identical(keys, constant.keys) &&
+        identical(values, constant.values) &&
+        type == constant.type) {
+      return constant;
+    }
+    return new MapConstantValue(type, keys, values);
+  }
+
+  ConstantValue visitConstructed(ConstructedConstantValue constant, _) {
+    DartType type = typeConverter.visit(constant.type);
+    Map<FieldEntity, ConstantValue> fields = {};
+    constant.fields.forEach((f, v) {
+      FieldEntity backendField = toBackendEntity(f);
+      assert(backendField != null, "No backend field for $f.");
+      fields[backendField] = v.accept(this, null);
+    });
+    return new ConstructedConstantValue(type, fields);
+  }
+
+  ConstantValue visitType(TypeConstantValue constant, _) {
+    DartType type = typeConverter.visit(constant.type);
+    DartType representedType = typeConverter.visit(constant.representedType);
+    if (type == constant.type && representedType == constant.representedType) {
+      return constant;
+    }
+    return new TypeConstantValue(representedType, type);
+  }
+
+  ConstantValue visitInterceptor(InterceptorConstantValue constant, _) {
+    // Interceptor constants are only created in the SSA graph builder.
+    throw new UnsupportedError(
+        "Unexpected visitInterceptor ${constant.toStructuredText()}");
+  }
+
+  ConstantValue visitDeferredGlobal(DeferredGlobalConstantValue constant, _) {
+    // Deferred global constants are only created in the SSA graph builder.
+    throw new UnsupportedError(
+        "Unexpected DeferredGlobalConstantValue ${constant.toStructuredText()}");
+  }
+
+  ConstantValue visitInstantiation(InstantiationConstantValue constant, _) {
+    ConstantValue function = constant.function.accept(this, null);
+    List<DartType> typeArguments =
+        typeConverter.convertTypes(constant.typeArguments);
+    return new InstantiationConstantValue(typeArguments, function);
+  }
+
+  List<ConstantValue> _handleValues(List<ConstantValue> values) {
+    List<ConstantValue> result;
+    for (int i = 0; i < values.length; i++) {
+      var value = values[i];
+      var newValue = value.accept(this, null);
+      if (newValue != value && result == null) {
+        result = values.sublist(0, i).toList();
+      }
+      result?.add(newValue);
+    }
+    return result ?? values;
+  }
+}
+
+class TypeConverter implements DartTypeVisitor<DartType, Null> {
+  final Entity Function(Entity) toBackendEntity;
+
+  TypeConverter(this.toBackendEntity);
+
+  Map<FunctionTypeVariable, FunctionTypeVariable> _functionTypeVariables =
+      <FunctionTypeVariable, FunctionTypeVariable>{};
+
+  DartType visit(DartType type, [_]) => type.accept(this, null);
+
+  List<DartType> convertTypes(List<DartType> types) => _visitList(types);
+
+  DartType visitVoidType(VoidType type, _) => type;
+  DartType visitDynamicType(DynamicType type, _) => type;
+
+  DartType visitTypeVariableType(TypeVariableType type, _) {
+    return new TypeVariableType(toBackendEntity(type.element));
+  }
+
+  DartType visitFunctionTypeVariable(FunctionTypeVariable type, _) {
+    DartType result = _functionTypeVariables[type];
+    assert(result != null,
+        "Function type variable $type not found in $_functionTypeVariables");
+    return result;
+  }
+
+  DartType visitFunctionType(FunctionType type, _) {
+    List<FunctionTypeVariable> typeVariables = <FunctionTypeVariable>[];
+    for (FunctionTypeVariable typeVariable in type.typeVariables) {
+      typeVariables.add(_functionTypeVariables[typeVariable] =
+          new FunctionTypeVariable(typeVariable.index));
+    }
+    for (FunctionTypeVariable typeVariable in type.typeVariables) {
+      _functionTypeVariables[typeVariable].bound =
+          typeVariable.bound?.accept(this, null);
+    }
+    DartType returnType = type.returnType.accept(this, null);
+    List<DartType> parameterTypes = _visitList(type.parameterTypes);
+    List<DartType> optionalParameterTypes =
+        _visitList(type.optionalParameterTypes);
+    List<DartType> namedParameterTypes = _visitList(type.namedParameterTypes);
+    for (FunctionTypeVariable typeVariable in type.typeVariables) {
+      _functionTypeVariables.remove(typeVariable);
+    }
+    return new FunctionType(returnType, parameterTypes, optionalParameterTypes,
+        type.namedParameters, namedParameterTypes, typeVariables);
+  }
+
+  DartType visitInterfaceType(InterfaceType type, _) {
+    ClassEntity element = toBackendEntity(type.element);
+    List<DartType> args = _visitList(type.typeArguments);
+    return new InterfaceType(element, args);
+  }
+
+  DartType visitTypedefType(TypedefType type, _) {
+    TypedefEntity element = toBackendEntity(type.element);
+    List<DartType> args = _visitList(type.typeArguments);
+    DartType unaliased = visit(type.unaliased);
+    return new TypedefType(element, args, unaliased);
+  }
+
+  @override
+  DartType visitFutureOrType(FutureOrType type, _) {
+    return new FutureOrType(visit(type.typeArgument));
+  }
+
+  List<DartType> _visitList(List<DartType> list) =>
+      list.map<DartType>((t) => t.accept(this, null)).toList();
+}
diff --git a/pkg/compiler/lib/src/js_model/locals.dart b/pkg/compiler/lib/src/js_model/locals.dart
index 6f66920..cfeede7 100644
--- a/pkg/compiler/lib/src/js_model/locals.dart
+++ b/pkg/compiler/lib/src/js_model/locals.dart
@@ -456,9 +456,14 @@
   List<LabelDefinition> _labels;
   final bool isSwitch;
   final bool isSwitchCase;
+  bool isBreakTarget;
+  bool isContinueTarget;
 
   JJumpTarget(this.memberContext, this.nestingLevel,
-      {this.isSwitch: false, this.isSwitchCase: false});
+      {this.isSwitch: false,
+      this.isSwitchCase: false,
+      this.isBreakTarget: false,
+      this.isContinueTarget: false});
 
   /// Deserializes a [JJumpTarget] object from [source].
   factory JJumpTarget.readFromDataSource(DataSource source) {
@@ -467,8 +472,13 @@
     int nestingLevel = source.readInt();
     bool isSwitch = source.readBool();
     bool isSwitchCase = source.readBool();
+    bool isBreakTarget = source.readBool();
+    bool isContinueTarget = source.readBool();
     JJumpTarget target = new JJumpTarget(memberContext, nestingLevel,
-        isSwitch: isSwitch, isSwitchCase: isSwitchCase);
+        isSwitch: isSwitch,
+        isSwitchCase: isSwitchCase,
+        isBreakTarget: isBreakTarget,
+        isContinueTarget: isContinueTarget);
     int labelCount = source.readInt();
     for (int i = 0; i < labelCount; i++) {
       String labelName = source.readString();
@@ -488,6 +498,8 @@
     sink.writeInt(nestingLevel);
     sink.writeBool(isSwitch);
     sink.writeBool(isSwitchCase);
+    sink.writeBool(isBreakTarget);
+    sink.writeBool(isContinueTarget);
     if (_labels != null) {
       sink.writeInt(_labels.length);
       for (LabelDefinition definition in _labels) {
@@ -501,9 +513,6 @@
     sink.end(tag);
   }
 
-  bool isBreakTarget = false;
-  bool isContinueTarget = false;
-
   @override
   LabelDefinition addLabel(String labelName,
       {bool isBreakTarget: false, bool isContinueTarget: false}) {
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 2187722..9ab34db 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -2,15 +2,44 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// TODO(johnniwinther): Add a test that ensure that this library doesn't depend
+// on the dart2js internals.
 library compiler.src.kernel.dart2js_target;
 
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/core_types.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/target/targets.dart';
+import 'invocation_mirror_constants.dart';
 
-import '../native/native.dart' show maybeEnableNative;
-import '../universe/selector.dart';
+const Iterable<String> _allowedDartSchemePaths = const <String>[
+  'async',
+  'html',
+  'html_common',
+  'indexed_db',
+  'js',
+  'js_util',
+  'svg',
+  '_native_typed_data',
+  'web_audio',
+  'web_gl',
+  'web_sql'
+];
+
+bool maybeEnableNative(Uri uri) {
+  bool allowedTestLibrary() {
+    String scriptName = uri.path;
+    return scriptName.contains('tests/compiler/dart2js_native') ||
+        scriptName.contains('tests/compiler/dart2js_extra');
+  }
+
+  bool allowedDartLibrary() {
+    if (uri.scheme != 'dart') return false;
+    return _allowedDartSchemePaths.contains(uri.path);
+  }
+
+  return allowedTestLibrary() || allowedDartLibrary();
+}
 
 /// A kernel [Target] to configure the Dart Front End for dart2js.
 class Dart2jsTarget extends Target {
@@ -59,13 +88,13 @@
       bool isSuper) {
     int kind;
     if (name.startsWith('get:')) {
-      kind = Selector.invocationMirrorGetterKind;
+      kind = invocationMirrorGetterKind;
       name = name.substring(4);
     } else if (name.startsWith('set:')) {
-      kind = Selector.invocationMirrorSetterKind;
+      kind = invocationMirrorSetterKind;
       name = name.substring(4);
     } else {
-      kind = Selector.invocationMirrorMethodKind;
+      kind = invocationMirrorMethodKind;
     }
     return new ir.StaticInvocation(
         coreTypes.index
diff --git a/pkg/compiler/lib/src/kernel/deferred_load.dart b/pkg/compiler/lib/src/kernel/deferred_load.dart
index 4310396..ecdbd9f 100644
--- a/pkg/compiler/lib/src/kernel/deferred_load.dart
+++ b/pkg/compiler/lib/src/kernel/deferred_load.dart
@@ -8,9 +8,10 @@
 
 import '../common_elements.dart';
 import '../compiler.dart' show Compiler;
-import '../constants/values.dart' show ConstantValue;
+import '../constants/values.dart';
 import '../deferred_load.dart';
 import '../elements/entities.dart';
+import '../ir/util.dart';
 import 'element_map.dart';
 
 class KernelDeferredLoadTask extends DeferredLoadTask {
@@ -22,17 +23,20 @@
 
   Iterable<ImportEntity> _findImportsTo(ir.NamedNode node, String nodeName,
       ir.Library enclosingLibrary, LibraryEntity library) {
-    List<ImportEntity> imports = [];
-    ir.Library source = _elementMap.getLibraryNode(library);
-    for (ir.LibraryDependency dependency in source.dependencies) {
-      if (dependency.isExport) continue;
-      if (!_isVisible(dependency.combinators, nodeName)) continue;
-      if (enclosingLibrary == dependency.targetLibrary ||
-          additionalExports(dependency.targetLibrary).contains(node)) {
-        imports.add(_elementMap.getImport(dependency));
+    return measureSubtask('find-imports', () {
+      List<ImportEntity> imports = [];
+      ir.Library source = _elementMap.getLibraryNode(library);
+      if (!source.dependencies.any((d) => d.isDeferred)) return const [];
+      for (ir.LibraryDependency dependency in source.dependencies) {
+        if (dependency.isExport) continue;
+        if (!_isVisible(dependency.combinators, nodeName)) continue;
+        if (enclosingLibrary == dependency.targetLibrary ||
+            additionalExports(dependency.targetLibrary).contains(node)) {
+          imports.add(_elementMap.getImport(dependency));
+        }
       }
-    }
-    return imports;
+      return imports;
+    });
   }
 
   @override
@@ -53,7 +57,11 @@
   Iterable<ImportEntity> memberImportsTo(
       Entity element, LibraryEntity library) {
     ir.Member node = _elementMap.getMemberNode(element);
-    return _findImportsTo(node, node.name.name, node.enclosingLibrary, library);
+    return _findImportsTo(
+        node is ir.Constructor ? node.enclosingClass : node,
+        node is ir.Constructor ? node.enclosingClass.name : node.name.name,
+        node.enclosingLibrary,
+        library);
   }
 
   @override
@@ -136,7 +144,8 @@
     ConstantValue constant =
         elementMap.getConstantValue(node, requireConstant: required);
     if (constant != null) {
-      dependencies.constants.add(constant);
+      dependencies.addConstant(
+          constant, elementMap.getImport(getDeferredImport(node)));
     }
   }
 
@@ -186,6 +195,20 @@
   }
 
   @override
+  void visitTypeParameter(ir.TypeParameter node) {
+    // We avoid visiting metadata on the type parameter declaration. The bound
+    // cannot hold constants so we skip that as well.
+  }
+
+  @override
+  void visitVariableDeclaration(ir.VariableDeclaration node) {
+    // We avoid visiting metadata on the parameter declaration by only visiting
+    // the initializer. The type cannot hold constants so can kan skip that
+    // as well.
+    node.initializer?.accept(this);
+  }
+
+  @override
   void visitTypeLiteral(ir.TypeLiteral node) {
     if (node.type is! ir.TypeParameterType) add(node);
   }
diff --git a/pkg/compiler/lib/src/kernel/element_map.dart b/pkg/compiler/lib/src/kernel/element_map.dart
index 5edfd7d..b6fe609 100644
--- a/pkg/compiler/lib/src/kernel/element_map.dart
+++ b/pkg/compiler/lib/src/kernel/element_map.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
 import '../constants/values.dart';
@@ -13,7 +14,7 @@
 import '../js/js.dart' as js;
 import '../js_backend/namer.dart';
 import '../js_backend/native_data.dart';
-import '../native/native.dart' as native;
+import '../native/behavior.dart';
 import '../universe/call_structure.dart';
 import '../universe/selector.dart';
 
@@ -29,8 +30,12 @@
   /// Access to the [DartTypes] object.
   DartTypes get types;
 
+  /// Returns the type environment for the underlying kernel model.
   ir.TypeEnvironment get typeEnvironment;
 
+  /// Returns the class hierarchy for the underlying kernel model.
+  ir.ClassHierarchy get classHierarchy;
+
   /// Returns the [DartType] corresponding to [type].
   DartType getDartType(ir.DartType type);
 
@@ -55,6 +60,10 @@
   /// access of [node].
   Selector getSelector(ir.Expression node);
 
+  /// Returns the [Selector] corresponding to the invocation of [name] with
+  /// [arguments].
+  Selector getInvocationSelector(ir.Name name, ir.Arguments arguments);
+
   /// Returns the [MemberEntity] corresponding to the member [node].
   MemberEntity getMember(ir.Member node);
 
@@ -86,17 +95,16 @@
   /// Returns the [Name] corresponding to [name].
   Name getName(ir.Name name);
 
-  /// Computes the [native.NativeBehavior] for a call to the [JS] function.
-  native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
+  /// Computes the [NativeBehavior] for a call to the [JS] function.
+  NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node);
 
-  /// Computes the [native.NativeBehavior] for a call to the [JS_BUILTIN]
+  /// Computes the [NativeBehavior] for a call to the [JS_BUILTIN]
   /// function.
-  native.NativeBehavior getNativeBehaviorForJsBuiltinCall(
-      ir.StaticInvocation node);
+  NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node);
 
-  /// Computes the [native.NativeBehavior] for a call to the
+  /// Computes the [NativeBehavior] for a call to the
   /// [JS_EMBEDDED_GLOBAL] function.
-  native.NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
+  NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
       ir.StaticInvocation node);
 
   /// Returns the [js.Name] for the `JsGetName` [constant] value.
@@ -114,10 +122,6 @@
   /// Returns the defining node for [cls].
   ir.Class getClassNode(covariant ClassEntity cls);
 
-  /// Returns the static type of [node].
-  // TODO(johnniwinther): This should be provided directly from kernel.
-  DartType getStaticType(ir.Expression node);
-
   /// Adds libraries in [component] to the set of libraries.
   ///
   /// The main method of the first component is used as the main method for the
@@ -147,15 +151,15 @@
   bool isNativeClass(ir.Class node);
 
   /// Computes the native behavior for reading the native [field].
-  native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
+  NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
       {bool isJsInterop});
 
   /// Computes the native behavior for writing to the native [field].
-  native.NativeBehavior getNativeBehaviorForFieldStore(ir.Field field);
+  NativeBehavior getNativeBehaviorForFieldStore(ir.Field field);
 
   /// Computes the native behavior for calling the function or constructor
   /// [member].
-  native.NativeBehavior getNativeBehaviorForMethod(ir.Member member,
+  NativeBehavior getNativeBehaviorForMethod(ir.Member member,
       {bool isJsInterop});
 
   /// Compute the kind of foreign helper function called by [node], if any.
@@ -177,9 +181,6 @@
 
   /// Returns the defining node for [member].
   ir.Member getMemberNode(covariant MemberEntity member);
-
-  /// Returns the element type of a async/sync*/async* function.
-  DartType getFunctionAsyncOrSyncStarElementType(ir.FunctionNode functionNode);
 }
 
 /// Kinds of foreign functions.
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index aeee682..9a8c1d1 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -30,32 +30,27 @@
 import '../frontend_strategy.dart';
 import '../ir/debug.dart';
 import '../ir/element_map.dart';
+import '../ir/static_type.dart';
+import '../ir/scope.dart';
 import '../ir/types.dart';
 import '../ir/visitors.dart';
 import '../ir/util.dart';
 import '../js/js.dart' as js;
 import '../js_backend/annotations.dart';
-import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
 import '../js_backend/backend.dart' show JavaScriptBackend;
-import '../js_backend/backend_usage.dart';
 import '../js_backend/constant_system_javascript.dart';
-import '../js_backend/interceptor_data.dart';
 import '../js_backend/namer.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
-import '../js_backend/runtime_types.dart';
-import '../js_model/closure.dart';
 import '../js_model/locals.dart';
-import '../native/native.dart' as native;
+import '../kernel/dart2js_target.dart';
+import '../native/behavior.dart';
 import '../native/resolver.dart';
 import '../options.dart';
 import '../ordered_typeset.dart';
 import '../universe/call_structure.dart';
 import '../universe/class_hierarchy.dart';
-import '../universe/class_set.dart';
 import '../universe/selector.dart';
-import '../universe/world_builder.dart';
-import '../world.dart';
 
 import 'element_map.dart';
 import 'env.dart';
@@ -65,7 +60,9 @@
 part 'native_basic_data.dart';
 part 'no_such_method_resolver.dart';
 
-abstract class KernelToElementMapBase implements IrToElementMap {
+/// Implementation of [KernelToElementMap] that only supports world
+/// impact computation.
+class KernelToElementMapImpl implements KernelToElementMap, IrToElementMap {
   final CompilerOptions options;
   final DiagnosticReporter reporter;
   CommonElementsImpl _commonElements;
@@ -74,6 +71,7 @@
   KernelConstantEnvironment _constantEnvironment;
   KernelDartTypes _types;
   ir.TypeEnvironment _typeEnvironment;
+  ir.ClassHierarchy _classHierarchy;
 
   /// Library environment. Used for fast lookup.
   KProgramEnv env = new KProgramEnv();
@@ -89,7 +87,34 @@
   final EntityDataMap<IndexedTypedef, KTypedefData> typedefs =
       new EntityDataMap<IndexedTypedef, KTypedefData>();
 
-  KernelToElementMapBase(this.options, this.reporter, Environment environment) {
+  /// Set to `true` before creating the J-World from the K-World to assert that
+  /// no entities are created late.
+  bool envIsClosed = false;
+
+  final Map<ir.Library, IndexedLibrary> libraryMap = {};
+  final Map<ir.Class, IndexedClass> classMap = {};
+  final Map<ir.Typedef, IndexedTypedef> typedefMap = {};
+
+  /// Map from [ir.TypeParameter] nodes to the corresponding
+  /// [TypeVariableEntity].
+  ///
+  /// Normally the type variables are [IndexedTypeVariable]s, but for type
+  /// parameters on local function (in the frontend) these are _not_ since
+  /// their type declaration is neither a class nor a member. In the backend,
+  /// these type parameters belong to the call-method and are therefore indexed.
+  final Map<ir.TypeParameter, TypeVariableEntity> typeVariableMap = {};
+  final Map<ir.Member, IndexedConstructor> constructorMap = {};
+  final Map<ir.Procedure, IndexedFunction> methodMap = {};
+  final Map<ir.Field, IndexedField> fieldMap = {};
+  final Map<ir.TreeNode, Local> localFunctionMap = {};
+
+  BehaviorBuilder _nativeBehaviorBuilder;
+  FrontendStrategy _frontendStrategy;
+
+  Map<KMember, Map<ir.Expression, TypeMap>> typeMapsForTesting;
+
+  KernelToElementMapImpl(this.reporter, Environment environment,
+      this._frontendStrategy, this.options) {
     _elementEnvironment = new KernelElementEnvironment(this);
     _commonElements = new CommonElementsImpl(_elementEnvironment);
     _constantEnvironment = new KernelConstantEnvironment(this, environment);
@@ -97,8 +122,6 @@
     _types = new KernelDartTypes(this);
   }
 
-  bool checkFamily(Entity entity);
-
   DartTypes get types => _types;
 
   KernelElementEnvironment get elementEnvironment => _elementEnvironment;
@@ -106,9 +129,6 @@
   @override
   CommonElementsImpl get commonElements => _commonElements;
 
-  /// NativeBasicData is need for computation of the default super class.
-  NativeBasicData get nativeBasicData;
-
   FunctionEntity get _mainFunction {
     return env.mainMethod != null ? getMethodInternal(env.mainMethod) : null;
   }
@@ -119,8 +139,6 @@
         : null;
   }
 
-  Iterable<LibraryEntity> get libraryListInternal;
-
   SourceSpan getSourceSpan(Spannable spannable, Entity currentElement) {
     SourceSpan fromSpannable(Spannable spannable) {
       if (spannable is IndexedLibrary &&
@@ -224,13 +242,9 @@
 
   LibraryEntity getLibrary(ir.Library node) => getLibraryInternal(node);
 
-  LibraryEntity getLibraryInternal(ir.Library node, [KLibraryEnv libraryEnv]);
-
   @override
   ClassEntity getClass(ir.Class node) => getClassInternal(node);
 
-  ClassEntity getClassInternal(ir.Class node, [KClassEnv classEnv]);
-
   InterfaceType getSuperType(IndexedClass cls) {
     assert(checkFamily(cls));
     KClassData data = classes.getData(cls);
@@ -264,8 +278,6 @@
   TypeVariableEntity getTypeVariable(ir.TypeParameter node) =>
       getTypeVariableInternal(node);
 
-  TypeVariableEntity getTypeVariableInternal(ir.TypeParameter node);
-
   void _ensureSupertypes(ClassEntity cls, KClassData data) {
     assert(checkFamily(cls));
     if (data is KClassDataImpl && data.orderedTypeSet == null) {
@@ -347,8 +359,6 @@
     return typedefs.getData(typedef).rawType;
   }
 
-  TypedefEntity getTypedefInternal(ir.Typedef node);
-
   @override
   MemberEntity getMember(ir.Member node) {
     if (node is ir.Field) {
@@ -394,8 +404,6 @@
   ConstructorEntity getConstructor(ir.Member node) =>
       getConstructorInternal(node);
 
-  ConstructorEntity getConstructorInternal(ir.Member node);
-
   ConstructorEntity getSuperConstructor(
       ir.Constructor sourceNode, ir.Member targetNode) {
     ConstructorEntity source = getConstructor(sourceNode);
@@ -406,6 +414,9 @@
     if (superClass == targetClass) {
       return target;
     }
+
+    /// This path is needed for synthetically injected superclasses like
+    /// `Interceptor` and `JavaScriptObject`.
     KClassEnv env = classes.getEnv(superClass);
     ConstructorEntity constructor = env.lookupConstructor(this, target.name);
     if (constructor != null) {
@@ -417,13 +428,9 @@
   @override
   FunctionEntity getMethod(ir.Procedure node) => getMethodInternal(node);
 
-  FunctionEntity getMethodInternal(ir.Procedure node);
-
   @override
   FieldEntity getField(ir.Field node) => getFieldInternal(node);
 
-  FieldEntity getFieldInternal(ir.Field node);
-
   @override
   DartType getDartType(ir.DartType type) => _typeConverter.convert(type);
 
@@ -510,9 +517,9 @@
 
   ConstantValue computeConstantValue(
       Spannable spannable, ConstantExpression constant,
-      {bool requireConstant: true}) {
+      {bool requireConstant: true, bool checkCasts: true}) {
     return _constantEnvironment._getConstantValue(spannable, constant,
-        constantRequired: requireConstant);
+        constantRequired: requireConstant, checkCasts: checkCasts);
   }
 
   DartType substByContext(DartType type, InterfaceType context) {
@@ -573,12 +580,6 @@
     return data.getBound(this);
   }
 
-  DartType _getTypeVariableDefaultType(IndexedTypeVariable typeVariable) {
-    assert(checkFamily(typeVariable));
-    KTypeVariableData data = typeVariables.getData(typeVariable);
-    return data.getDefaultType(this);
-  }
-
   ClassEntity getAppliedMixin(IndexedClass cls) {
     assert(checkFamily(cls));
     KClassData data = classes.getData(cls);
@@ -624,15 +625,6 @@
     env.forEachConstructor(this, f);
   }
 
-  void forEachConstructorBody(
-      IndexedClass cls, void f(ConstructorBodyEntity member)) {
-    throw new UnsupportedError(
-        'KernelToElementMapBase._forEachConstructorBody');
-  }
-
-  void forEachNestedClosure(
-      MemberEntity member, void f(FunctionEntity closure));
-
   void _forEachLocalClassMember(IndexedClass cls, void f(MemberEntity member)) {
     assert(checkFamily(cls));
     KClassEnv env = classes.getEnv(cls);
@@ -721,6 +713,7 @@
   }
 
   ImportEntity getImport(ir.LibraryDependency node) {
+    if (node == null) return null;
     ir.Library library = node.parent;
     KLibraryData data = libraries.getData(getLibraryInternal(library));
     return data.imports[node];
@@ -729,26 +722,16 @@
   ir.TypeEnvironment get typeEnvironment {
     if (_typeEnvironment == null) {
       _typeEnvironment ??= new ir.TypeEnvironment(
-          new ir.CoreTypes(env.mainComponent),
-          new ir.ClassHierarchy(env.mainComponent));
+          new ir.CoreTypes(env.mainComponent), classHierarchy);
     }
     return _typeEnvironment;
   }
 
-  DartType getStaticType(ir.Expression node) {
-    ir.TreeNode enclosingClass = node;
-    while (enclosingClass != null && enclosingClass is! ir.Class) {
-      enclosingClass = enclosingClass.parent;
+  ir.ClassHierarchy get classHierarchy {
+    if (_classHierarchy == null) {
+      _classHierarchy ??= new ir.ClassHierarchy(env.mainComponent);
     }
-    try {
-      typeEnvironment.thisType =
-          enclosingClass is ir.Class ? enclosingClass.thisType : null;
-      return getDartType(node.getStaticType(typeEnvironment));
-    } catch (e) {
-      // The static type computation crashes on type errors. Use `dynamic`
-      // as static type.
-      return commonElements.dynamicType;
-    }
+    return _classHierarchy;
   }
 
   Name getName(ir.Name name) {
@@ -794,7 +777,7 @@
       return getSetterSelector(node.name);
     }
     if (node is ir.InvocationExpression) {
-      return getInvocationSelector(node);
+      return getInvocationSelector(node.name, node.arguments);
     }
     throw failedAt(
         CURRENT_ELEMENT_SPANNABLE,
@@ -802,8 +785,8 @@
         "${node}");
   }
 
-  Selector getInvocationSelector(ir.InvocationExpression invocation) {
-    Name name = getName(invocation.name);
+  Selector getInvocationSelector(ir.Name irName, ir.Arguments arguments) {
+    Name name = getName(irName);
     SelectorKind kind;
     if (Selector.isOperatorName(name.text)) {
       if (name == Names.INDEX_NAME || name == Names.INDEX_SET_NAME) {
@@ -815,7 +798,7 @@
       kind = SelectorKind.CALL;
     }
 
-    CallStructure callStructure = getCallStructure(invocation.arguments);
+    CallStructure callStructure = getCallStructure(arguments);
     return new Selector(kind, name, callStructure);
   }
 
@@ -832,18 +815,18 @@
   }
 
   /// Looks up [typeName] for use in the spec-string of a `JS` call.
-  // TODO(johnniwinther): Use this in [native.NativeBehavior] instead of calling
+  // TODO(johnniwinther): Use this in [NativeBehavior] instead of calling
   // the `ForeignResolver`.
-  native.TypeLookup typeLookup({bool resolveAsRaw: true}) {
+  TypeLookup typeLookup({bool resolveAsRaw: true}) {
     return resolveAsRaw
         ? (_cachedTypeLookupRaw ??= _typeLookup(resolveAsRaw: true))
         : (_cachedTypeLookupFull ??= _typeLookup(resolveAsRaw: false));
   }
 
-  native.TypeLookup _cachedTypeLookupRaw;
-  native.TypeLookup _cachedTypeLookupFull;
+  TypeLookup _cachedTypeLookupRaw;
+  TypeLookup _cachedTypeLookupFull;
 
-  native.TypeLookup _typeLookup({bool resolveAsRaw: true}) {
+  TypeLookup _typeLookup({bool resolveAsRaw: true}) {
     bool cachedMayLookupInMain;
     bool mayLookupInMain() {
       var mainUri = elementEnvironment.mainLibrary.canonicalUri;
@@ -906,30 +889,30 @@
     return node.arguments.positional[index].accept(new Stringifier());
   }
 
-  /// Computes the [native.NativeBehavior] for a call to the [JS] function.
+  /// Computes the [NativeBehavior] for a call to the [JS] function.
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
+  NativeBehavior getNativeBehaviorForJsCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length < 2 ||
         node.arguments.named.isNotEmpty) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS);
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_FIRST);
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
 
     String codeString = _getStringArgument(node, 1);
     if (codeString == null) {
       reporter.reportErrorMessage(
           CURRENT_ELEMENT_SPANNABLE, MessageKind.WRONG_ARGUMENT_FOR_JS_SECOND);
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
 
-    return native.NativeBehavior.ofJsCall(
+    return NativeBehavior.ofJsCall(
         specString,
         codeString,
         typeLookup(resolveAsRaw: true),
@@ -938,28 +921,27 @@
         commonElements);
   }
 
-  /// Computes the [native.NativeBehavior] for a call to the [JS_BUILTIN]
+  /// Computes the [NativeBehavior] for a call to the [JS_BUILTIN]
   /// function.
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForJsBuiltinCall(
-      ir.StaticInvocation node) {
+  NativeBehavior getNativeBehaviorForJsBuiltinCall(ir.StaticInvocation node) {
     if (node.arguments.positional.length < 1) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS builtin expression has no type.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     if (node.arguments.positional.length < 2) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS builtin is missing name.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
-    return native.NativeBehavior.ofJsBuiltinCall(
+    return NativeBehavior.ofJsBuiltinCall(
         specString,
         typeLookup(resolveAsRaw: true),
         CURRENT_ELEMENT_SPANNABLE,
@@ -967,34 +949,34 @@
         commonElements);
   }
 
-  /// Computes the [native.NativeBehavior] for a call to the
+  /// Computes the [NativeBehavior] for a call to the
   /// [JS_EMBEDDED_GLOBAL] function.
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
+  NativeBehavior getNativeBehaviorForJsEmbeddedGlobalCall(
       ir.StaticInvocation node) {
     if (node.arguments.positional.length < 1) {
       reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
           "JS embedded global expression has no type.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     if (node.arguments.positional.length < 2) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "JS embedded global is missing name.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     if (node.arguments.positional.length > 2 ||
         node.arguments.named.isNotEmpty) {
       reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
           "JS embedded global has more than 2 arguments.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
     String specString = _getStringArgument(node, 0);
     if (specString == null) {
       reporter.internalError(
           CURRENT_ELEMENT_SPANNABLE, "Unexpected first argument.");
-      return new native.NativeBehavior();
+      return new NativeBehavior();
     }
-    return native.NativeBehavior.ofJsEmbeddedGlobalCall(
+    return NativeBehavior.ofJsEmbeddedGlobalCall(
         specString,
         typeLookup(resolveAsRaw: true),
         CURRENT_ELEMENT_SPANNABLE,
@@ -1025,7 +1007,9 @@
   }
 
   ConstantValue getConstantValue(ir.Expression node,
-      {bool requireConstant: true, bool implicitNull: false}) {
+      {bool requireConstant: true,
+      bool implicitNull: false,
+      bool checkCasts: true}) {
     ConstantExpression constant;
     if (node == null) {
       if (!implicitNull) {
@@ -1046,7 +1030,7 @@
     }
     ConstantValue value = computeConstantValue(
         computeSourceSpanFromTreeNode(node), constant,
-        requireConstant: requireConstant);
+        requireConstant: requireConstant, checkCasts: checkCasts);
     if (!value.isConstant && !requireConstant) {
       return null;
     }
@@ -1058,7 +1042,9 @@
     if (annotations.isEmpty) return const <ConstantValue>[];
     List<ConstantValue> metadata = <ConstantValue>[];
     annotations.forEach((ir.Expression node) {
-      metadata.add(getConstantValue(node));
+      // We skip the implicit cast checks for metadata to avoid circular
+      // dependencies in the js-interop class registration.
+      metadata.add(getConstantValue(node, checkCasts: false));
     });
     return metadata;
   }
@@ -1086,41 +1072,6 @@
         failedAt(cls, "No super noSuchMethod found for class $cls."));
     return function;
   }
-}
-
-/// Mixin that implements the abstract methods in [KernelToElementMapBase].
-abstract class ElementCreatorMixin implements KernelToElementMapBase {
-  /// Set to `true` before creating the J-World from the K-World to assert that
-  /// no entities are created late.
-  bool envIsClosed = false;
-  KProgramEnv get env;
-  EntityDataEnvMap<IndexedLibrary, KLibraryData, KLibraryEnv> get libraries;
-  EntityDataEnvMap<IndexedClass, KClassData, KClassEnv> get classes;
-  EntityDataMap<IndexedMember, KMemberData> get members;
-  EntityDataMap<IndexedTypeVariable, KTypeVariableData> get typeVariables;
-  EntityDataMap<IndexedTypedef, KTypedefData> get typedefs;
-
-  final Map<ir.Library, IndexedLibrary> libraryMap = {};
-  final Map<ir.Class, IndexedClass> classMap = {};
-  final Map<ir.Typedef, IndexedTypedef> typedefMap = {};
-
-  /// Map from [ir.TypeParameter] nodes to the corresponding
-  /// [TypeVariableEntity].
-  ///
-  /// Normally the type variables are [IndexedTypeVariable]s, but for type
-  /// parameters on local function (in the frontend) these are _not_ since
-  /// their type declaration is neither a class nor a member. In the backend,
-  /// these type parameters belong to the call-method and are therefore indexed.
-  final Map<ir.TypeParameter, TypeVariableEntity> typeVariableMap = {};
-  final Map<ir.Member, IndexedConstructor> constructorMap = {};
-  final Map<ir.Procedure, IndexedFunction> methodMap = {};
-  final Map<ir.Field, IndexedField> fieldMap = {};
-  final Map<ir.TreeNode, Local> localFunctionMap = {};
-
-  Name getName(ir.Name node);
-  FunctionType getFunctionType(ir.FunctionNode node);
-  MemberEntity getMember(ir.Member node);
-  Entity getClosure(ir.FunctionDeclaration node);
 
   Iterable<LibraryEntity> get libraryListInternal {
     if (env.length != libraryMap.length) {
@@ -1225,6 +1176,11 @@
                   getMethodInternal(procedure), node.name, index),
               new KTypeVariableData(node));
         }
+      } else if (func.parent is ir.FunctionDeclaration ||
+          func.parent is ir.FunctionExpression) {
+        // Ensure that local function type variables have been created.
+        getLocalFunction(func.parent);
+        return typeVariableMap[node];
       } else {
         throw new UnsupportedError('Unsupported function type parameter parent '
             'node ${func.parent}.');
@@ -1354,60 +1310,6 @@
         field, new KFieldDataImpl(node));
   }
 
-  IndexedLibrary createLibrary(String name, Uri canonicalUri);
-
-  IndexedClass createClass(LibraryEntity library, String name,
-      {bool isAbstract});
-
-  IndexedTypedef createTypedef(LibraryEntity library, String name);
-
-  TypeVariableEntity createTypeVariable(
-      Entity typeDeclaration, String name, int index);
-
-  IndexedConstructor createGenerativeConstructor(ClassEntity enclosingClass,
-      Name name, ParameterStructure parameterStructure,
-      {bool isExternal, bool isConst});
-
-  IndexedConstructor createFactoryConstructor(ClassEntity enclosingClass,
-      Name name, ParameterStructure parameterStructure,
-      {bool isExternal, bool isConst, bool isFromEnvironmentConstructor});
-
-  IndexedFunction createGetter(LibraryEntity library,
-      ClassEntity enclosingClass, Name name, AsyncMarker asyncMarker,
-      {bool isStatic, bool isExternal, bool isAbstract});
-
-  IndexedFunction createMethod(
-      LibraryEntity library,
-      ClassEntity enclosingClass,
-      Name name,
-      ParameterStructure parameterStructure,
-      AsyncMarker asyncMarker,
-      {bool isStatic,
-      bool isExternal,
-      bool isAbstract});
-
-  IndexedFunction createSetter(
-      LibraryEntity library, ClassEntity enclosingClass, Name name,
-      {bool isStatic, bool isExternal, bool isAbstract});
-
-  IndexedField createField(
-      LibraryEntity library, ClassEntity enclosingClass, Name name,
-      {bool isStatic, bool isAssignable, bool isConst});
-}
-
-/// Implementation of [KernelToElementMap] that only supports world
-/// impact computation.
-class KernelToElementMapImpl extends KernelToElementMapBase
-    with ElementCreatorMixin
-    implements KernelToElementMap {
-  native.BehaviorBuilder _nativeBehaviorBuilder;
-  FrontendStrategy _frontendStrategy;
-
-  KernelToElementMapImpl(DiagnosticReporter reporter, Environment environment,
-      this._frontendStrategy, CompilerOptions options)
-      : super(options, reporter, environment);
-
-  @override
   bool checkFamily(Entity entity) {
     assert(
         '$entity'.startsWith(kElementPrefix),
@@ -1416,24 +1318,7 @@
     return true;
   }
 
-  DartType getTypeVariableBound(TypeVariableEntity typeVariable) {
-    if (typeVariable is KLocalTypeVariable) return typeVariable.bound;
-    return super.getTypeVariableBound(typeVariable);
-  }
-
-  DartType _getTypeVariableDefaultType(TypeVariableEntity typeVariable) {
-    if (typeVariable is KLocalTypeVariable) return typeVariable.defaultType;
-    return super._getTypeVariableDefaultType(typeVariable);
-  }
-
-  @override
-  void forEachNestedClosure(
-      MemberEntity member, void f(FunctionEntity closure)) {
-    throw new UnsupportedError(
-        "KernelToElementMapForImpactImpl._forEachNestedClosure");
-  }
-
-  @override
+  /// NativeBasicData is need for computation of the default super class.
   NativeBasicData get nativeBasicData => _frontendStrategy.nativeBasicData;
 
   /// Adds libraries in [component] to the set of libraries.
@@ -1444,18 +1329,41 @@
     env.addComponent(component);
   }
 
-  native.BehaviorBuilder get nativeBehaviorBuilder =>
+  BehaviorBuilder get nativeBehaviorBuilder =>
       _nativeBehaviorBuilder ??= new KernelBehaviorBuilder(elementEnvironment,
           commonElements, nativeBasicData, reporter, options);
 
-  ResolutionImpact computeWorldImpact(KMember member) {
-    return buildKernelImpact(
-        members.getData(member).node, this, reporter, options);
+  ResolutionImpact computeWorldImpact(
+      KMember member,
+      VariableScopeModel variableScopeModel,
+      Set<PragmaAnnotation> annotations) {
+    KMemberData memberData = members.getData(member);
+    ir.Member node = memberData.node;
+    KernelImpactBuilder builder = new KernelImpactBuilder(
+        this, member, reporter, options, variableScopeModel, annotations);
+    if (retainDataForTesting) {
+      typeMapsForTesting ??= {};
+      typeMapsForTesting[member] = builder.typeMapsForTesting = {};
+    }
+    node.accept(builder);
+    memberData.staticTypes = builder.cachedStaticTypes;
+    return builder.impactBuilder;
   }
 
   ScopeModel computeScopeModel(KMember member) {
     ir.Member node = members.getData(member).node;
-    return KernelClosureAnalysis.computeScopeModel(member, node);
+    return ScopeModel.computeScopeModel(node);
+  }
+
+  Map<ir.Expression, ir.DartType> getCachedStaticTypes(KMember member) {
+    Map<ir.Expression, ir.DartType> staticTypes =
+        members.getData(member).staticTypes;
+    assert(staticTypes != null, "No static types cached for $member.");
+    return staticTypes;
+  }
+
+  Map<ir.Expression, TypeMap> getTypeMapsForTesting(KMember member) {
+    return typeMapsForTesting[member];
   }
 
   /// Returns the kernel [ir.Procedure] node for the [method].
@@ -1469,11 +1377,6 @@
   }
 
   @override
-  Entity getClosure(ir.FunctionDeclaration node) {
-    return getLocalFunction(node);
-  }
-
-  @override
   Local getLocalFunction(ir.TreeNode node) {
     assert(
         node is ir.FunctionDeclaration || node is ir.FunctionExpression,
@@ -1545,27 +1448,6 @@
     return _getTypedefNode(typedef);
   }
 
-  /// Returns the element type of a async/sync*/async* function.
-  @override
-  DartType getFunctionAsyncOrSyncStarElementType(ir.FunctionNode functionNode) {
-    DartType returnType = getDartType(functionNode.returnType);
-    switch (functionNode.asyncMarker) {
-      case ir.AsyncMarker.SyncStar:
-        return elementEnvironment.getAsyncOrSyncStarElementType(
-            AsyncMarker.SYNC_STAR, returnType);
-      case ir.AsyncMarker.Async:
-        return elementEnvironment.getAsyncOrSyncStarElementType(
-            AsyncMarker.ASYNC, returnType);
-      case ir.AsyncMarker.AsyncStar:
-        return elementEnvironment.getAsyncOrSyncStarElementType(
-            AsyncMarker.ASYNC_STAR, returnType);
-      default:
-        failedAt(CURRENT_ELEMENT_SPANNABLE,
-            "Unexpected ir.AsyncMarker: ${functionNode.asyncMarker}");
-    }
-    return null;
-  }
-
   /// Returns `true` is [node] has a `@Native(...)` annotation.
   // TODO(johnniwinther): Cache this for later use.
   bool isNativeClass(ir.Class node) {
@@ -1614,7 +1496,7 @@
 
   /// Computes the native behavior for reading the native [field].
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
+  NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field,
       {bool isJsInterop}) {
     DartType type = getDartType(field.type);
     List<ConstantValue> metadata = getMetadata(field.annotations);
@@ -1625,14 +1507,14 @@
 
   /// Computes the native behavior for writing to the native [field].
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) {
+  NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) {
     DartType type = getDartType(field.type);
     return nativeBehaviorBuilder.buildFieldStoreBehavior(type);
   }
 
   /// Computes the native behavior for calling [member].
   // TODO(johnniwinther): Cache this for later use.
-  native.NativeBehavior getNativeBehaviorForMethod(ir.Member member,
+  NativeBehavior getNativeBehaviorForMethod(ir.Member member,
       {bool isJsInterop}) {
     DartType type;
     if (member is ir.Procedure) {
@@ -1657,7 +1539,6 @@
     return new KClass(library, name, isAbstract: isAbstract);
   }
 
-  @override
   IndexedTypedef createTypedef(LibraryEntity library, String name) {
     return new KTypedef(library, name);
   }
@@ -1721,7 +1602,7 @@
 
 class KernelElementEnvironment extends ElementEnvironment
     implements KElementEnvironment {
-  final KernelToElementMapBase elementMap;
+  final KernelToElementMapImpl elementMap;
 
   KernelElementEnvironment(this.elementMap);
 
@@ -1769,6 +1650,7 @@
 
   @override
   DartType getTypeVariableBound(TypeVariableEntity typeVariable) {
+    if (typeVariable is KLocalTypeVariable) return typeVariable.bound;
     return elementMap.getTypeVariableBound(typeVariable);
   }
 
@@ -1789,46 +1671,6 @@
   }
 
   @override
-  DartType getFunctionAsyncOrSyncStarElementType(FunctionEntity function) {
-    // TODO(sra): Should be getting the DartType from the node.
-    DartType returnType = getFunctionType(function).returnType;
-    return getAsyncOrSyncStarElementType(function.asyncMarker, returnType);
-  }
-
-  @override
-  DartType getAsyncOrSyncStarElementType(
-      AsyncMarker asyncMarker, DartType returnType) {
-    switch (asyncMarker) {
-      case AsyncMarker.SYNC:
-        return returnType;
-      case AsyncMarker.SYNC_STAR:
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.iterableClass) {
-            return returnType.typeArguments.first;
-          }
-        }
-        return dynamicType;
-      case AsyncMarker.ASYNC:
-        if (returnType is FutureOrType) return returnType.typeArgument;
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.futureClass) {
-            return returnType.typeArguments.first;
-          }
-        }
-        return dynamicType;
-      case AsyncMarker.ASYNC_STAR:
-        if (returnType is InterfaceType) {
-          if (returnType.element == elementMap.commonElements.streamClass) {
-            return returnType.typeArguments.first;
-          }
-        }
-        return dynamicType;
-    }
-    assert(false, 'Unexpected marker ${asyncMarker}');
-    return null;
-  }
-
-  @override
   DartType getFieldType(FieldEntity field) {
     return elementMap._getFieldType(field);
   }
@@ -2000,8 +1842,8 @@
   }
 }
 
-/// [native.BehaviorBuilder] for kernel based elements.
-class KernelBehaviorBuilder extends native.BehaviorBuilder {
+/// [BehaviorBuilder] for kernel based elements.
+class KernelBehaviorBuilder extends BehaviorBuilder {
   final ElementEnvironment elementEnvironment;
   final CommonElements commonElements;
   final DiagnosticReporter reporter;
@@ -2019,7 +1861,7 @@
 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using
 /// [_EvaluationEnvironment] for the evaluation.
 class KernelConstantEnvironment implements ConstantEnvironment {
-  final KernelToElementMapBase _elementMap;
+  final KernelToElementMapImpl _elementMap;
   final Environment _environment;
 
   Map<ConstantExpression, ConstantValue> _valueMap =
@@ -2032,11 +1874,11 @@
 
   ConstantValue _getConstantValue(
       Spannable spannable, ConstantExpression expression,
-      {bool constantRequired}) {
+      {bool constantRequired, bool checkCasts: true}) {
     return _valueMap.putIfAbsent(expression, () {
       return expression.evaluate(
           new KernelEvaluationEnvironment(_elementMap, _environment, spannable,
-              constantRequired: constantRequired),
+              constantRequired: constantRequired, checkCasts: checkCasts),
           constantSystem);
     });
   }
@@ -2045,12 +1887,13 @@
 /// Evaluation environment used for computing [ConstantValue]s for
 /// kernel based [ConstantExpression]s.
 class KernelEvaluationEnvironment extends EvaluationEnvironmentBase {
-  final KernelToElementMapBase _elementMap;
+  final KernelToElementMapImpl _elementMap;
   final Environment _environment;
+  final bool checkCasts;
 
   KernelEvaluationEnvironment(
       this._elementMap, this._environment, Spannable spannable,
-      {bool constantRequired})
+      {bool constantRequired, this.checkCasts: true})
       : super(spannable, constantRequired: constantRequired);
 
   @override
@@ -2091,71 +1934,6 @@
   bool get enableAssertions => _elementMap.options.enableUserAssertions;
 }
 
-class KClosedWorldImpl extends ClosedWorldRtiNeedMixin implements KClosedWorld {
-  final KernelToElementMapImpl elementMap;
-  final KElementEnvironment elementEnvironment;
-  final DartTypes dartTypes;
-  final KCommonElements commonElements;
-  final NativeData nativeData;
-  final InterceptorData interceptorData;
-  final BackendUsage backendUsage;
-  final NoSuchMethodData noSuchMethodData;
-
-  final Map<ClassEntity, Set<ClassEntity>> mixinUses;
-
-  final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
-
-  // TODO(johnniwinther): Can this be derived from [ClassSet]s?
-  final Set<ClassEntity> _implementedClasses;
-
-  final Iterable<MemberEntity> liveInstanceMembers;
-
-  /// Members that are written either directly or through a setter selector.
-  final Iterable<MemberEntity> assignedInstanceMembers;
-  final KAllocatorAnalysis allocatorAnalysis;
-
-  final Iterable<ClassEntity> liveNativeClasses;
-
-  final Iterable<MemberEntity> processedMembers;
-
-  final ClassHierarchy classHierarchy;
-
-  final AnnotationsData annotationsData;
-
-  KClosedWorldImpl(this.elementMap,
-      {CompilerOptions options,
-      this.elementEnvironment,
-      this.dartTypes,
-      this.commonElements,
-      this.nativeData,
-      this.interceptorData,
-      this.backendUsage,
-      this.noSuchMethodData,
-      ResolutionWorldBuilder resolutionWorldBuilder,
-      RuntimeTypesNeedBuilder rtiNeedBuilder,
-      this.allocatorAnalysis,
-      Set<ClassEntity> implementedClasses,
-      this.liveNativeClasses,
-      this.liveInstanceMembers,
-      this.assignedInstanceMembers,
-      this.processedMembers,
-      this.mixinUses,
-      this.typesImplementedBySubclasses,
-      Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
-      Map<ClassEntity, ClassSet> classSets,
-      this.annotationsData})
-      : _implementedClasses = implementedClasses,
-        classHierarchy = new ClassHierarchyImpl(
-            commonElements, classHierarchyNodes, classSets) {
-    computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, options);
-  }
-
-  /// Returns `true` if [cls] is implemented by an instantiated class.
-  bool isImplemented(ClassEntity cls) {
-    return _implementedClasses.contains(cls);
-  }
-}
-
 class KernelNativeMemberResolver extends NativeMemberResolverBase {
   final KernelToElementMap elementMap;
   final NativeBasicData nativeBasicData;
@@ -2171,14 +1949,13 @@
   CommonElements get commonElements => elementMap.commonElements;
 
   @override
-  native.NativeBehavior computeNativeFieldStoreBehavior(
-      covariant KField field) {
+  NativeBehavior computeNativeFieldStoreBehavior(covariant KField field) {
     ir.Field node = elementMap.getMemberNode(field);
     return elementMap.getNativeBehaviorForFieldStore(node);
   }
 
   @override
-  native.NativeBehavior computeNativeFieldLoadBehavior(covariant KField field,
+  NativeBehavior computeNativeFieldLoadBehavior(covariant KField field,
       {bool isJsInterop}) {
     ir.Field node = elementMap.getMemberNode(field);
     return elementMap.getNativeBehaviorForFieldLoad(node,
@@ -2186,8 +1963,7 @@
   }
 
   @override
-  native.NativeBehavior computeNativeMethodBehavior(
-      covariant KFunction function,
+  NativeBehavior computeNativeMethodBehavior(covariant KFunction function,
       {bool isJsInterop}) {
     ir.Member node = elementMap.getMemberNode(function);
     return elementMap.getNativeBehaviorForMethod(node,
@@ -2196,7 +1972,7 @@
 
   @override
   bool isNativeMethod(covariant KFunction function) {
-    if (!native.maybeEnableNative(function.library.canonicalUri)) return false;
+    if (!maybeEnableNative(function.library.canonicalUri)) return false;
     ir.Member node = elementMap.getMemberNode(function);
     return node.annotations.any((ir.Expression expression) {
       return expression is ir.ConstructorInvocation &&
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index e82ef91..f313e3a 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -10,7 +10,7 @@
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/clone.dart';
 import 'package:kernel/type_algebra.dart';
-import 'package:collection/algorithms.dart' show mergeSort; // a stable sort.
+import 'package:collection/collection.dart' show mergeSort; // a stable sort.
 
 import '../common.dart';
 import '../constants/constructors.dart';
@@ -200,11 +200,11 @@
 
   KLibraryData(this.library);
 
-  Iterable<ConstantValue> getMetadata(KernelToElementMapBase elementMap) {
+  Iterable<ConstantValue> getMetadata(KernelToElementMapImpl elementMap) {
     return _metadata ??= elementMap.getMetadata(library.annotations);
   }
 
-  Iterable<ImportEntity> getImports(KernelToElementMapBase elementMap) {
+  Iterable<ImportEntity> getImports(KernelToElementMapImpl elementMap) {
     if (imports == null) {
       List<ir.LibraryDependency> dependencies = library.dependencies;
       if (dependencies.isEmpty) {
@@ -244,7 +244,7 @@
   bool get isSuperMixinApplication;
 
   /// Ensures that all members have been computed for [cls].
-  void ensureMembers(KernelToElementMapBase elementMap);
+  void ensureMembers(KernelToElementMapImpl elementMap);
 
   /// Return the [MemberEntity] for the member [name] in the class. If [setter]
   /// is `true`, the setter or assignable field corresponding to [name] is
@@ -353,11 +353,11 @@
         initializers: <ir.Initializer>[superInitializer]);
   }
 
-  void ensureMembers(KernelToElementMapBase elementMap) {
+  void ensureMembers(KernelToElementMapImpl elementMap) {
     _ensureMaps(elementMap);
   }
 
-  void _ensureMaps(KernelToElementMapBase elementMap) {
+  void _ensureMaps(KernelToElementMapImpl elementMap) {
     if (_memberMap != null) return;
 
     _memberMap = <String, ir.Member>{};
@@ -640,7 +640,7 @@
   DartType get callType => null;
 
   Iterable<ConstantValue> getMetadata(
-      covariant KernelToElementMapBase elementMap) {
+      covariant KernelToElementMapImpl elementMap) {
     return _metadata ??= elementMap.getMetadata(node.annotations);
   }
 
@@ -652,6 +652,8 @@
 abstract class KMemberData {
   ir.Member get node;
 
+  Map<ir.Expression, ir.DartType> staticTypes;
+
   Iterable<ConstantValue> getMetadata(IrToElementMap elementMap);
 
   InterfaceType getMemberThisType(JsToElementMap elementMap);
@@ -667,10 +669,12 @@
 
   Iterable<ConstantValue> _metadata;
 
+  Map<ir.Expression, ir.DartType> staticTypes;
+
   KMemberDataImpl(this.node);
 
   Iterable<ConstantValue> getMetadata(
-      covariant KernelToElementMapBase elementMap) {
+      covariant KernelToElementMapImpl elementMap) {
     return _metadata ??= elementMap.getMetadata(node.annotations);
   }
 
@@ -698,7 +702,7 @@
   List<TypeVariableType> _typeVariables;
 
   List<TypeVariableType> getFunctionTypeVariables(
-      covariant KernelToElementMapBase elementMap) {
+      covariant KernelToElementMapImpl elementMap) {
     if (_typeVariables == null) {
       if (functionNode.typeParameters.isEmpty) {
         _typeVariables = const <TypeVariableType>[];
@@ -729,7 +733,7 @@
 
   KFunctionDataImpl(ir.Member node, this.functionNode) : super(node);
 
-  FunctionType getFunctionType(covariant KernelToElementMapBase elementMap) {
+  FunctionType getFunctionType(covariant KernelToElementMapImpl elementMap) {
     return _type ??= elementMap.getFunctionType(functionNode);
   }
 
@@ -761,7 +765,7 @@
   @override
   FunctionData convert() {
     return new FunctionDataImpl(
-        node, functionNode, new RegularMemberDefinition(node));
+        node, functionNode, new RegularMemberDefinition(node), staticTypes);
   }
 
   @override
@@ -773,7 +777,7 @@
 
 abstract class KConstructorData extends KFunctionData {
   ConstantConstructor getConstructorConstant(
-      KernelToElementMapBase elementMap, ConstructorEntity constructor);
+      KernelToElementMapImpl elementMap, ConstructorEntity constructor);
 }
 
 class KConstructorDataImpl extends KFunctionDataImpl
@@ -785,7 +789,7 @@
       : super(node, functionNode);
 
   ConstantConstructor getConstructorConstant(
-      KernelToElementMapBase elementMap, ConstructorEntity constructor) {
+      KernelToElementMapImpl elementMap, ConstructorEntity constructor) {
     if (_constantConstructor == null) {
       if (node is ir.Constructor && constructor.isConst) {
         _constantConstructor =
@@ -808,7 +812,8 @@
     } else {
       definition = new RegularMemberDefinition(node);
     }
-    return new JConstructorDataImpl(node, functionNode, definition);
+    return new JConstructorDataImpl(
+        node, functionNode, definition, staticTypes);
   }
 
   @override
@@ -820,15 +825,15 @@
   DartType getFieldType(IrToElementMap elementMap);
 
   ConstantExpression getFieldConstantExpression(
-      KernelToElementMapBase elementMap);
+      KernelToElementMapImpl elementMap);
 
   /// Return the [ConstantValue] the initial value of [field] or `null` if
   /// the initializer is not a constant expression.
-  ConstantValue getFieldConstantValue(KernelToElementMapBase elementMap);
+  ConstantValue getFieldConstantValue(KernelToElementMapImpl elementMap);
 
-  bool hasConstantFieldInitializer(KernelToElementMapBase elementMap);
+  bool hasConstantFieldInitializer(KernelToElementMapImpl elementMap);
 
-  ConstantValue getConstantFieldInitializer(KernelToElementMapBase elementMap);
+  ConstantValue getConstantFieldInitializer(KernelToElementMapImpl elementMap);
 }
 
 class KFieldDataImpl extends KMemberDataImpl implements KFieldData {
@@ -841,12 +846,12 @@
 
   ir.Field get node => super.node;
 
-  DartType getFieldType(covariant KernelToElementMapBase elementMap) {
+  DartType getFieldType(covariant KernelToElementMapImpl elementMap) {
     return _type ??= elementMap.getDartType(node.type);
   }
 
   ConstantExpression getFieldConstantExpression(
-      KernelToElementMapBase elementMap) {
+      KernelToElementMapImpl elementMap) {
     if (_constantExpression == null) {
       if (node.isConst) {
         _constantExpression =
@@ -862,7 +867,7 @@
   }
 
   @override
-  ConstantValue getFieldConstantValue(KernelToElementMapBase elementMap) {
+  ConstantValue getFieldConstantValue(KernelToElementMapImpl elementMap) {
     if (!_isConstantComputed) {
       _constantValue = elementMap.getConstantValue(node.initializer,
           requireConstant: node.isConst, implicitNull: !node.isConst);
@@ -872,12 +877,12 @@
   }
 
   @override
-  bool hasConstantFieldInitializer(KernelToElementMapBase elementMap) {
+  bool hasConstantFieldInitializer(KernelToElementMapImpl elementMap) {
     return getFieldConstantValue(elementMap) != null;
   }
 
   @override
-  ConstantValue getConstantFieldInitializer(KernelToElementMapBase elementMap) {
+  ConstantValue getConstantFieldInitializer(KernelToElementMapImpl elementMap) {
     ConstantValue value = getFieldConstantValue(elementMap);
     assert(
         value != null,
@@ -896,7 +901,8 @@
 
   @override
   JFieldData convert() {
-    return new JFieldDataImpl(node, new RegularMemberDefinition(node));
+    return new JFieldDataImpl(
+        node, new RegularMemberDefinition(node), staticTypes);
   }
 }
 
diff --git a/pkg/compiler/lib/src/kernel/invocation_mirror_constants.dart b/pkg/compiler/lib/src/kernel/invocation_mirror_constants.dart
new file mode 100644
index 0000000..246429e
--- /dev/null
+++ b/pkg/compiler/lib/src/kernel/invocation_mirror_constants.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const int invocationMirrorMethodKind = 0;
+const int invocationMirrorGetterKind = 1;
+const int invocationMirrorSetterKind = 2;
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 7aa7324..c3b4306 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -2,21 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:front_end/src/api_unstable/dart2js.dart'
-    show operatorFromString;
-
 import 'package:kernel/ast.dart' as ir;
 
 import '../common.dart';
 import '../common/names.dart';
-import '../common/resolution.dart';
 import '../common_elements.dart';
 import '../constants/expressions.dart';
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../ir/runtime_type_analysis.dart';
+import '../ir/scope.dart';
 import '../ir/static_type.dart';
+import '../ir/impact.dart';
 import '../ir/util.dart';
+import '../js_backend/annotations.dart';
 import '../js_backend/native_data.dart';
 import '../options.dart';
 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder;
@@ -26,90 +26,65 @@
 import '../universe/use.dart';
 import '../universe/world_builder.dart';
 import 'element_map.dart';
-import 'runtime_type_analysis.dart';
 
-ResolutionImpact buildKernelImpact(
-    ir.Member member,
-    KernelToElementMap elementMap,
-    DiagnosticReporter reporter,
-    CompilerOptions options) {
-  KernelImpactBuilder builder = new KernelImpactBuilder(
-      elementMap, elementMap.getMember(member), reporter, options);
-  if (member is ir.Procedure) {
-    return builder.buildProcedure(member);
-  } else if (member is ir.Constructor) {
-    return builder.buildConstructor(member);
-  } else if (member is ir.Field) {
-    return builder.buildField(member);
-  }
-  throw new UnsupportedError("Unsupported member: $member");
-}
-
-class KernelImpactBuilder extends StaticTypeVisitor {
+class KernelImpactBuilder extends ImpactBuilder {
   final ResolutionWorldImpactBuilder impactBuilder;
   final KernelToElementMap elementMap;
   final DiagnosticReporter reporter;
   final CompilerOptions _options;
   final MemberEntity currentMember;
+  final Set<PragmaAnnotation> _annotations;
 
-  KernelImpactBuilder(
-      this.elementMap, this.currentMember, this.reporter, this._options)
+  KernelImpactBuilder(this.elementMap, this.currentMember, this.reporter,
+      this._options, VariableScopeModel variableScopeModel, this._annotations)
       : this.impactBuilder =
             new ResolutionWorldImpactBuilder('${currentMember}'),
-        super(elementMap.typeEnvironment);
+        super(elementMap.typeEnvironment, elementMap.classHierarchy,
+            variableScopeModel);
 
   CommonElements get commonElements => elementMap.commonElements;
 
   NativeBasicData get _nativeBasicData => elementMap.nativeBasicData;
 
-  /// Add a checked-mode type use of [type] if it is not `dynamic`.
-  DartType checkType(ir.DartType irType, TypeUseKind kind) {
+  bool get useAsserts => _options.enableUserAssertions;
+
+  bool get inferEffectivelyFinalVariableTypes =>
+      !_annotations.contains(PragmaAnnotation.disableFinal);
+
+  Object _computeReceiverConstraint(
+      ir.DartType receiverType, ClassRelation relation) {
+    if (receiverType is ir.InterfaceType) {
+      if (receiverType.classNode == typeEnvironment.futureOrClass) {
+        // CFE encodes FutureOr as an interface type!
+        return null;
+      }
+      return new StrongModeConstraint(commonElements, _nativeBasicData,
+          elementMap.getClass(receiverType.classNode), relation);
+    }
+    return null;
+  }
+
+  @override
+  void registerParameterCheck(ir.DartType irType) {
     DartType type = elementMap.getDartType(irType);
-    if (kind != null && !type.isDynamic) {
-      switch (kind) {
-        case TypeUseKind.PARAMETER_CHECK:
-          impactBuilder.registerTypeUse(new TypeUse.parameterCheck(type));
-          break;
-        case TypeUseKind.IMPLICIT_CAST:
-          impactBuilder.registerTypeUse(new TypeUse.implicitCast(type));
-          break;
-        default:
-          throw new UnsupportedError("Unexpected type check kind: $kind");
-      }
-    }
-    return type;
-  }
-
-  /// Add checked-mode type use for the parameter type and constant for the
-  /// default value of [parameter].
-  void handleParameter(ir.VariableDeclaration parameter) {
-    checkType(parameter.type, TypeUseKind.PARAMETER_CHECK);
-    visitNode(parameter.initializer);
-  }
-
-  /// Add checked-mode type use for parameter and return types, and add
-  /// constants for default values.
-  void handleSignature(ir.FunctionNode node) {
-    node.positionalParameters.forEach(handleParameter);
-    node.namedParameters.forEach(handleParameter);
-    for (ir.TypeParameter parameter in node.typeParameters) {
-      checkType(parameter.bound, TypeUseKind.PARAMETER_CHECK);
+    if (!type.isDynamic) {
+      impactBuilder.registerTypeUse(new TypeUse.parameterCheck(type));
     }
   }
 
-  ResolutionImpact buildField(ir.Field field) {
-    typeEnvironment.thisType = field.enclosingClass?.thisType;
-    checkType(field.type, TypeUseKind.PARAMETER_CHECK);
-    if (field.initializer != null) {
-      visitNode(field.initializer);
-      if (!field.isInstanceMember &&
-          !field.isConst &&
-          field.initializer is! ir.NullLiteral) {
-        impactBuilder.registerFeature(Feature.LAZY_FIELD);
-      }
-    } else {
-      impactBuilder.registerConstantLiteral(new NullConstantExpression());
-    }
+  List<DartType> _getTypeArguments(ir.Arguments arguments) {
+    if (arguments.types.isEmpty) return null;
+    return arguments.types.map(elementMap.getDartType).toList();
+  }
+
+  @override
+  void registerLazyField() {
+    impactBuilder.registerFeature(Feature.LAZY_FIELD);
+  }
+
+  @override
+  void handleField(ir.Field field) {
+    super.handleField(field);
 
     if (field.isInstanceMember &&
         elementMap.isNativeClass(field.enclosingClass)) {
@@ -120,197 +95,123 @@
       impactBuilder
           .registerNativeData(elementMap.getNativeBehaviorForFieldStore(field));
     }
-    typeEnvironment.thisType = null;
-    return impactBuilder;
   }
 
-  ResolutionImpact buildConstructor(ir.Constructor constructor) {
-    typeEnvironment.thisType = constructor.enclosingClass.thisType;
-    handleSignature(constructor.function);
-    visitNodes(constructor.initializers);
-    visitNode(constructor.function.body);
+  @override
+  void handleConstructor(ir.Constructor constructor) {
     MemberEntity member = elementMap.getMember(constructor);
     if (constructor.isExternal && !commonElements.isForeignHelper(member)) {
       bool isJsInterop = _nativeBasicData.isJsInteropMember(member);
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(constructor, isJsInterop: isJsInterop));
     }
-    typeEnvironment.thisType = null;
-    return impactBuilder;
   }
 
-  void handleAsyncMarker(ir.FunctionNode function) {
-    ir.AsyncMarker asyncMarker = function.asyncMarker;
-    if (asyncMarker == ir.AsyncMarker.Sync) return;
-
-    DartType elementType =
-        elementMap.getFunctionAsyncOrSyncStarElementType(function);
-
-    switch (asyncMarker) {
-      case ir.AsyncMarker.SyncStar:
-        impactBuilder.registerFeature(Feature.SYNC_STAR);
-        impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
-            commonElements.syncStarIterableFactory,
-            const CallStructure.unnamed(1, 1),
-            <DartType>[elementType]));
-        break;
-
-      case ir.AsyncMarker.Async:
-        impactBuilder.registerFeature(Feature.ASYNC);
-        var completerFactory = _options.startAsyncSynchronously
-            ? commonElements.asyncAwaitCompleterFactory
-            : commonElements.syncCompleterFactory;
-        impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
-            completerFactory,
-            const CallStructure.unnamed(0, 1),
-            <DartType>[elementType]));
-        break;
-
-      case ir.AsyncMarker.AsyncStar:
-        impactBuilder.registerFeature(Feature.ASYNC_STAR);
-        impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
-            commonElements.asyncStarStreamControllerFactory,
-            const CallStructure.unnamed(1, 1),
-            <DartType>[elementType]));
-        break;
-
-      case ir.AsyncMarker.Sync:
-      case ir.AsyncMarker.SyncYielding:
-        failedAt(CURRENT_ELEMENT_SPANNABLE,
-            "Unexpected async marker: ${asyncMarker}");
-    }
+  @override
+  void registerSyncStar(ir.DartType elementType) {
+    impactBuilder.registerFeature(Feature.SYNC_STAR);
+    impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+        commonElements.syncStarIterableFactory,
+        const CallStructure.unnamed(1, 1),
+        <DartType>[elementMap.getDartType(elementType)]));
   }
 
-  ResolutionImpact buildProcedure(ir.Procedure procedure) {
-    typeEnvironment.thisType = procedure.enclosingClass?.thisType;
-    handleSignature(procedure.function);
-    visitNode(procedure.function.body);
-    handleAsyncMarker(procedure.function);
+  @override
+  void registerAsync(ir.DartType elementType) {
+    impactBuilder.registerFeature(Feature.ASYNC);
+    impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+        commonElements.asyncAwaitCompleterFactory,
+        const CallStructure.unnamed(0, 1),
+        <DartType>[elementMap.getDartType(elementType)]));
+  }
+
+  @override
+  void registerAsyncStar(ir.DartType elementType) {
+    impactBuilder.registerFeature(Feature.ASYNC_STAR);
+    impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
+        commonElements.asyncStarStreamControllerFactory,
+        const CallStructure.unnamed(1, 1),
+        <DartType>[elementMap.getDartType(elementType)]));
+  }
+
+  @override
+  void handleProcedure(ir.Procedure procedure) {
+    super.handleProcedure(procedure);
+
     MemberEntity member = elementMap.getMember(procedure);
     if (procedure.isExternal && !commonElements.isForeignHelper(member)) {
       bool isJsInterop = _nativeBasicData.isJsInteropMember(member);
       impactBuilder.registerNativeData(elementMap
           .getNativeBehaviorForMethod(procedure, isJsInterop: isJsInterop));
     }
-    typeEnvironment.thisType = null;
-    return impactBuilder;
   }
 
   @override
-  Null visitBlock(ir.Block node) => visitNodes(node.statements);
-
-  @override
-  Null visitExpressionStatement(ir.ExpressionStatement node) {
-    visitNode(node.expression);
-  }
-
-  @override
-  Null visitReturnStatement(ir.ReturnStatement node) {
-    visitNode(node.expression);
-  }
-
-  @override
-  Null visitIfStatement(ir.IfStatement node) {
-    visitNode(node.condition);
-    visitNode(node.then);
-    visitNode(node.otherwise);
-  }
-
-  @override
-  ir.DartType visitIntLiteral(ir.IntLiteral node) {
+  void registerIntLiteral(int value) {
     impactBuilder.registerConstantLiteral(
-        new IntConstantExpression(new BigInt.from(node.value).toUnsigned(64)));
-    return super.visitIntLiteral(node);
+        new IntConstantExpression(new BigInt.from(value).toUnsigned(64)));
   }
 
   @override
-  ir.DartType visitDoubleLiteral(ir.DoubleLiteral node) {
-    impactBuilder
-        .registerConstantLiteral(new DoubleConstantExpression(node.value));
-    return super.visitDoubleLiteral(node);
+  void registerDoubleLiteral(double value) {
+    impactBuilder.registerConstantLiteral(new DoubleConstantExpression(value));
   }
 
   @override
-  ir.DartType visitBoolLiteral(ir.BoolLiteral node) {
-    impactBuilder
-        .registerConstantLiteral(new BoolConstantExpression(node.value));
-    return super.visitBoolLiteral(node);
+  void registerBoolLiteral(bool value) {
+    impactBuilder.registerConstantLiteral(new BoolConstantExpression(value));
   }
 
   @override
-  ir.DartType visitStringLiteral(ir.StringLiteral node) {
-    impactBuilder
-        .registerConstantLiteral(new StringConstantExpression(node.value));
-    return super.visitStringLiteral(node);
+  void registerStringLiteral(String value) {
+    impactBuilder.registerConstantLiteral(new StringConstantExpression(value));
   }
 
   @override
-  ir.DartType visitSymbolLiteral(ir.SymbolLiteral node) {
-    impactBuilder.registerConstSymbolName(node.value);
-    return super.visitSymbolLiteral(node);
+  void registerSymbolLiteral(String value) {
+    impactBuilder.registerConstSymbolName(value);
   }
 
   @override
-  ir.DartType visitNullLiteral(ir.NullLiteral node) {
+  void registerNullLiteral() {
     impactBuilder.registerConstantLiteral(new NullConstantExpression());
-    return super.visitNullLiteral(node);
   }
 
   @override
-  ir.DartType visitListLiteral(ir.ListLiteral node) {
-    visitNodes(node.expressions);
-    DartType elementType = elementMap.getDartType(node.typeArgument);
-
+  void registerListLiteral(ir.DartType elementType,
+      {bool isConstant, bool isEmpty}) {
     impactBuilder.registerListLiteral(new ListLiteralUse(
-        commonElements.listType(elementType),
-        isConstant: node.isConst,
-        isEmpty: node.expressions.isEmpty));
-    return super.visitListLiteral(node);
+        commonElements.listType(elementMap.getDartType(elementType)),
+        isConstant: isConstant,
+        isEmpty: isEmpty));
   }
 
   @override
-  ir.DartType visitMapLiteral(ir.MapLiteral node) {
-    visitNodes(node.entries);
-    DartType keyType = elementMap.getDartType(node.keyType);
-    DartType valueType = elementMap.getDartType(node.valueType);
+  void registerMapLiteral(ir.DartType keyType, ir.DartType valueType,
+      {bool isConstant, bool isEmpty}) {
     impactBuilder.registerMapLiteral(new MapLiteralUse(
-        commonElements.mapType(keyType, valueType),
-        isConstant: node.isConst,
-        isEmpty: node.entries.isEmpty));
-    return super.visitMapLiteral(node);
+        commonElements.mapType(
+            elementMap.getDartType(keyType), elementMap.getDartType(valueType)),
+        isConstant: isConstant,
+        isEmpty: isEmpty));
   }
 
   @override
-  Null visitMapEntry(ir.MapEntry entry) {
-    visitNode(entry.key);
-    visitNode(entry.value);
-  }
-
-  @override
-  ir.DartType visitConditionalExpression(ir.ConditionalExpression node) {
-    visitNode(node.condition);
-    visitNode(node.then);
-    visitNode(node.otherwise);
-    return super.visitConditionalExpression(node);
-  }
-
-  List<DartType> _visitArguments(ir.Arguments arguments) {
-    visitNodes(arguments.positional);
-    visitNodes(arguments.named);
-    if (arguments.types.isEmpty) return null;
-    return arguments.types.map(elementMap.getDartType).toList();
-  }
-
-  @override
-  ir.DartType visitConstructorInvocation(ir.ConstructorInvocation node) {
-    handleNew(node, node.target, isConst: node.isConst);
-    return super.visitConstructorInvocation(node);
-  }
-
-  void handleNew(ir.InvocationExpression node, ir.Member target,
-      {bool isConst: false}) {
-    _visitArguments(node.arguments);
+  void registerNew(ir.Member target, ir.InterfaceType type,
+      ir.Arguments arguments, ir.LibraryDependency import,
+      {bool isConst}) {
     ConstructorEntity constructor = elementMap.getConstructor(target);
+    CallStructure callStructure = elementMap.getCallStructure(arguments);
+    ImportEntity deferredImport = elementMap.getImport(import);
+    impactBuilder.registerStaticUse(isConst
+        ? new StaticUse.constConstructorInvoke(constructor, callStructure,
+            elementMap.getDartType(type), deferredImport)
+        : new StaticUse.typedConstructorInvoke(constructor, callStructure,
+            elementMap.getDartType(type), deferredImport));
+    if (type.typeArguments.any((ir.DartType type) => type is! ir.DynamicType)) {
+      impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK);
+    }
+
     if (commonElements.isSymbolConstructor(constructor)) {
       impactBuilder.registerFeature(Feature.SYMBOL_CONSTRUCTOR);
     }
@@ -323,19 +224,9 @@
       // return here.
     }
 
-    InterfaceType type = elementMap.createInterfaceType(
-        target.enclosingClass, node.arguments.types);
-    CallStructure callStructure = elementMap.getCallStructure(node.arguments);
-    impactBuilder.registerStaticUse(isConst
-        ? new StaticUse.constConstructorInvoke(constructor, callStructure, type)
-        : new StaticUse.typedConstructorInvoke(
-            constructor, callStructure, type));
-    if (type.typeArguments.any((DartType type) => !type.isDynamic)) {
-      impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK);
-    }
     if (isConst && commonElements.isSymbolConstructor(constructor)) {
       ConstantValue value =
-          elementMap.getConstantValue(node.arguments.positional.first);
+          elementMap.getConstantValue(arguments.positional.first);
       if (!value.isString) {
         // TODO(het): Get the actual span for the Symbol constructor argument
         reporter.reportErrorMessage(
@@ -350,54 +241,38 @@
   }
 
   @override
-  Null visitSuperInitializer(ir.SuperInitializer node) {
+  void registerSuperInitializer(
+      ir.Constructor source, ir.Constructor target, ir.Arguments arguments) {
     // TODO(johnniwinther): Maybe rewrite `node.target` to point to a
     // synthesized unnamed mixin constructor when needed. This would require us
     // to consider impact building a required pre-step for inference and
     // ssa-building.
-    ConstructorEntity target =
-        elementMap.getSuperConstructor(node.parent, node.target);
-    _visitArguments(node.arguments);
+    ConstructorEntity constructor =
+        elementMap.getSuperConstructor(source, target);
     impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
-        target, elementMap.getCallStructure(node.arguments)));
+        constructor, elementMap.getCallStructure(arguments)));
   }
 
   @override
-  ir.DartType visitStaticInvocation(ir.StaticInvocation node) {
-    if (node.target.kind == ir.ProcedureKind.Factory) {
-      // TODO(johnniwinther): We should not mark the type as instantiated but
-      // rather follow the type arguments directly.
-      //
-      // Consider this:
-      //
-      //    abstract class A<T> {
-      //      factory A.regular() => new B<T>();
-      //      factory A.redirect() = B<T>;
-      //    }
-      //
-      //    class B<T> implements A<T> {}
-      //
-      //    main() {
-      //      print(new A<int>.regular() is B<int>);
-      //      print(new A<String>.redirect() is B<String>);
-      //    }
-      //
-      // To track that B is actually instantiated as B<int> and B<String> we
-      // need to follow the type arguments passed to A.regular and A.redirect
-      // to B. Currently, we only do this soundly if we register A<int> and
-      // A<String> as instantiated. We should instead register that A.T is
-      // instantiated as int and String.
-      handleNew(node, node.target, isConst: node.isConst);
+  void registerStaticInvocation(ir.Procedure procedure, ir.Arguments arguments,
+      ir.LibraryDependency import) {
+    FunctionEntity target = elementMap.getMethod(procedure);
+    CallStructure callStructure = elementMap.getCallStructure(arguments);
+    List<DartType> typeArguments = _getTypeArguments(arguments);
+    if (commonElements.isExtractTypeArguments(target)) {
+      _handleExtractTypeArguments(target, typeArguments, callStructure);
+      return;
     } else {
-      FunctionEntity target = elementMap.getMethod(node.target);
-      List<DartType> typeArguments = _visitArguments(node.arguments);
-      if (commonElements.isExtractTypeArguments(target)) {
-        _handleExtractTypeArguments(node, target, typeArguments);
-        return super.visitStaticInvocation(node);
-      }
+      ImportEntity deferredImport = elementMap.getImport(import);
       impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
-          target, elementMap.getCallStructure(node.arguments), typeArguments));
+          target, callStructure, typeArguments, deferredImport));
     }
+  }
+
+  void handleStaticInvocation(ir.StaticInvocation node,
+      ArgumentTypes argumentTypes, ir.DartType returnType) {
+    super.handleStaticInvocation(node, argumentTypes, returnType);
+
     switch (elementMap.getForeignKind(node)) {
       case ForeignKind.JS:
         impactBuilder
@@ -421,11 +296,10 @@
       case ForeignKind.NONE:
         break;
     }
-    return super.visitStaticInvocation(node);
   }
 
-  void _handleExtractTypeArguments(ir.StaticInvocation node,
-      FunctionEntity target, List<DartType> typeArguments) {
+  void _handleExtractTypeArguments(FunctionEntity target,
+      List<DartType> typeArguments, CallStructure callStructure) {
     // extractTypeArguments<Map>(obj, fn) has additional impacts:
     //
     //   1. All classes implementing Map need to carry type arguments (similar
@@ -433,8 +307,8 @@
     //
     //   2. There is an invocation of fn with some number of type arguments.
     //
-    impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
-        target, elementMap.getCallStructure(node.arguments), typeArguments));
+    impactBuilder.registerStaticUse(
+        new StaticUse.staticInvoke(target, callStructure, typeArguments));
 
     if (typeArguments.length != 1) return;
     DartType matchedType = typeArguments.first;
@@ -453,29 +327,29 @@
   }
 
   @override
-  ir.DartType visitStaticGet(ir.StaticGet node) {
-    ir.Member target = node.target;
-    if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
-      FunctionEntity method = elementMap.getMethod(target);
-      impactBuilder.registerStaticUse(new StaticUse.staticTearOff(method));
-    } else {
-      MemberEntity member = elementMap.getMember(target);
-      impactBuilder.registerStaticUse(new StaticUse.staticGet(member));
-    }
-    return super.visitStaticGet(node);
+  void registerStaticTearOff(
+      ir.Procedure procedure, ir.LibraryDependency import) {
+    impactBuilder.registerStaticUse(new StaticUse.staticTearOff(
+        elementMap.getMethod(procedure), elementMap.getImport(import)));
   }
 
   @override
-  ir.DartType visitStaticSet(ir.StaticSet node) {
-    MemberEntity member = elementMap.getMember(node.target);
-    impactBuilder.registerStaticUse(new StaticUse.staticSet(member));
-    return super.visitStaticSet(node);
+  void registerStaticGet(ir.Member member, ir.LibraryDependency import) {
+    impactBuilder.registerStaticUse(new StaticUse.staticGet(
+        elementMap.getMember(member), elementMap.getImport(import)));
   }
 
-  void handleSuperInvocation(ir.Name name, ir.Node arguments) {
+  @override
+  void registerStaticSet(ir.Member member, ir.LibraryDependency import) {
+    impactBuilder.registerStaticUse(new StaticUse.staticSet(
+        elementMap.getMember(member), elementMap.getImport(import)));
+  }
+
+  @override
+  void registerSuperInvocation(ir.Name name, ir.Arguments arguments) {
     FunctionEntity method =
         elementMap.getSuperMember(currentMember, name, setter: false);
-    List<DartType> typeArguments = _visitArguments(arguments);
+    List<DartType> typeArguments = _getTypeArguments(arguments);
     if (method != null) {
       impactBuilder.registerStaticUse(new StaticUse.superInvoke(
           method, elementMap.getCallStructure(arguments), typeArguments));
@@ -488,31 +362,7 @@
   }
 
   @override
-  ir.DartType visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
-    List<DartType> typeArguments = _visitArguments(node.arguments);
-    MemberEntity member = elementMap.getMember(node.target);
-    // TODO(johnniwinther): Restrict the dynamic use to only match the known
-    // target.
-    // TODO(johnniwinther): Restrict this to subclasses?
-    Object constraint = new StrongModeConstraint(
-        commonElements, _nativeBasicData, member.enclosingClass);
-    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
-        new Selector.call(
-            member.memberName, elementMap.getCallStructure(node.arguments)),
-        constraint,
-        typeArguments));
-    return super.visitDirectMethodInvocation(node);
-  }
-
-  @override
-  ir.DartType visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
-    // TODO(johnniwinther): Should we support this or always use the
-    // [MixinFullResolution] transformer?
-    handleSuperInvocation(node.name, node.arguments);
-    return super.visitSuperMethodInvocation(node);
-  }
-
-  void handleSuperGet(ir.Name name, ir.Member target) {
+  void registerSuperGet(ir.Name name) {
     MemberEntity member =
         elementMap.getSuperMember(currentMember, name, setter: false);
     if (member != null) {
@@ -530,21 +380,7 @@
   }
 
   @override
-  ir.DartType visitDirectPropertyGet(ir.DirectPropertyGet node) {
-    // TODO(johnniwinther): Restrict the dynamic use to only match the known
-    // target.
-    impactBuilder.registerDynamicUse(new DynamicUse(
-        new Selector.getter(elementMap.getMember(node.target).memberName)));
-    return super.visitDirectPropertyGet(node);
-  }
-
-  @override
-  ir.DartType visitSuperPropertyGet(ir.SuperPropertyGet node) {
-    handleSuperGet(node.name, node.interfaceTarget);
-    return super.visitSuperPropertyGet(node);
-  }
-
-  void handleSuperSet(ir.Name name, ir.Node target, ir.Node value) {
+  void registerSuperSet(ir.Name name) {
     MemberEntity member =
         elementMap.getSuperMember(currentMember, name, setter: true);
     if (member != null) {
@@ -562,355 +398,242 @@
   }
 
   @override
-  ir.DartType visitDirectPropertySet(ir.DirectPropertySet node) {
-    // TODO(johnniwinther): Restrict the dynamic use to only match the known
-    // target.
-    impactBuilder.registerDynamicUse(new DynamicUse(
-        new Selector.setter(elementMap.getMember(node.target).memberName)));
-    return super.visitDirectPropertySet(node);
+  void registerLocalFunctionInvocation(
+      ir.FunctionDeclaration localFunction, ir.Arguments arguments) {
+    CallStructure callStructure = elementMap.getCallStructure(arguments);
+    List<DartType> typeArguments = _getTypeArguments(arguments);
+    // Invocation of a local function. No need for dynamic use, but
+    // we need to track the type arguments.
+    impactBuilder.registerStaticUse(new StaticUse.closureCall(
+        elementMap.getLocalFunction(localFunction),
+        callStructure,
+        typeArguments));
+    // TODO(johnniwinther): Yet, alas, we need the dynamic use for now. Remove
+    // this when kernel adds an `isFunctionCall` flag to
+    // [ir.MethodInvocation].
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        callStructure.callSelector, null, typeArguments));
   }
 
   @override
-  ir.DartType visitSuperPropertySet(ir.SuperPropertySet node) {
-    handleSuperSet(node.name, node.interfaceTarget, node.value);
-    return super.visitSuperPropertySet(node);
+  void registerDynamicInvocation(ir.DartType receiverType,
+      ClassRelation relation, ir.Name name, ir.Arguments arguments) {
+    Selector selector = elementMap.getInvocationSelector(name, arguments);
+    List<DartType> typeArguments = _getTypeArguments(arguments);
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(selector,
+        _computeReceiverConstraint(receiverType, relation), typeArguments));
   }
 
   @override
-  ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
-    Selector selector = elementMap.getSelector(node);
-    List<DartType> typeArguments;
-    if (isSpecialCasedBinaryOperator(node.interfaceTarget)) {
-      typeArguments = <DartType>[];
-    } else {
-      typeArguments = _visitArguments(node.arguments);
-    }
-    ir.DartType receiverType = visitNode(node.receiver);
-    ir.DartType returnType = computeMethodInvocationType(node, receiverType);
-    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
-    var receiver = node.receiver;
-    if (receiver is ir.VariableGet &&
-        receiver.variable.isFinal &&
-        receiver.variable.parent is ir.FunctionDeclaration) {
-      Local localFunction =
-          elementMap.getLocalFunction(receiver.variable.parent);
-      // Invocation of a local function. No need for dynamic use, but
-      // we need to track the type arguments.
-      impactBuilder.registerStaticUse(new StaticUse.closureCall(
-          localFunction, selector.callStructure, typeArguments));
-      // TODO(johnniwinther): Yet, alas, we need the dynamic use for now. Remove
-      // this when kernel adds an `isFunctionCall` flag to
-      // [ir.MethodInvocation].
-      impactBuilder.registerDynamicUse(
-          new ConstrainedDynamicUse(selector, null, typeArguments));
-    } else {
-      DartType receiverDartType = elementMap.getDartType(receiverType);
+  void registerFunctionInvocation(
+      ir.DartType receiverType, ir.Arguments arguments) {
+    CallStructure callStructure = elementMap.getCallStructure(arguments);
+    List<DartType> typeArguments = _getTypeArguments(arguments);
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        callStructure.callSelector,
+        _computeReceiverConstraint(receiverType, ClassRelation.subtype),
+        typeArguments));
+  }
 
-      ir.Member interfaceTarget = node.interfaceTarget;
-      if (interfaceTarget == null) {
-        // TODO(johnniwinther): Avoid treating a known function call as a
-        // dynamic call when CFE provides a way to distinguish the two.
-        impactBuilder.registerDynamicUse(
-            new ConstrainedDynamicUse(selector, null, typeArguments));
-        if (operatorFromString(node.name.name) == null) {
-          impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
-              selector.toCallSelector(), null, typeArguments));
-        }
-      } else {
-        Object constraint;
-        if (receiverDartType is InterfaceType) {
-          constraint = new StrongModeConstraint(
-              commonElements, _nativeBasicData, receiverDartType.element);
-        }
+  @override
+  void registerInstanceInvocation(ir.DartType receiverType,
+      ClassRelation relation, ir.Member target, ir.Arguments arguments) {
+    List<DartType> typeArguments = _getTypeArguments(arguments);
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        elementMap.getInvocationSelector(target.name, arguments),
+        _computeReceiverConstraint(receiverType, relation),
+        typeArguments));
+  }
 
-        if (interfaceTarget is ir.Field ||
-            interfaceTarget is ir.Procedure &&
-                interfaceTarget.kind == ir.ProcedureKind.Getter) {
-          impactBuilder.registerDynamicUse(
-              new ConstrainedDynamicUse(selector, constraint, typeArguments));
-          // An `o.foo()` invocation is (potentially) an `o.foo.call()`
-          // invocation.
-          Object getterConstraint;
-          if (interfaceTarget != null) {
-            DartType receiverType =
-                elementMap.getDartType(interfaceTarget.getterType);
-            if (receiverType is InterfaceType) {
-              getterConstraint = new StrongModeConstraint(
-                  commonElements, _nativeBasicData, receiverType.element);
+  @override
+  void registerDynamicGet(
+      ir.DartType receiverType, ClassRelation relation, ir.Name name) {
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        new Selector.getter(elementMap.getName(name)),
+        _computeReceiverConstraint(receiverType, relation),
+        const <DartType>[]));
+  }
+
+  @override
+  void registerInstanceGet(
+      ir.DartType receiverType, ClassRelation relation, ir.Member target) {
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        new Selector.getter(elementMap.getName(target.name)),
+        _computeReceiverConstraint(receiverType, relation),
+        const <DartType>[]));
+  }
+
+  @override
+  void registerDynamicSet(
+      ir.DartType receiverType, ClassRelation relation, ir.Name name) {
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        new Selector.setter(elementMap.getName(name)),
+        _computeReceiverConstraint(receiverType, relation),
+        const <DartType>[]));
+  }
+
+  @override
+  void registerInstanceSet(
+      ir.DartType receiverType, ClassRelation relation, ir.Member target) {
+    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
+        new Selector.setter(elementMap.getName(target.name)),
+        _computeReceiverConstraint(receiverType, relation),
+        const <DartType>[]));
+  }
+
+  void handleRuntimeTypeUse(ir.PropertyGet node, RuntimeTypeUseKind kind,
+      ir.DartType receiverType, ir.DartType argumentType) {
+    DartType receiverDartType = elementMap.getDartType(receiverType);
+    DartType argumentDartType =
+        argumentType == null ? null : elementMap.getDartType(argumentType);
+
+    if (_options.omitImplicitChecks) {
+      switch (kind) {
+        case RuntimeTypeUseKind.string:
+          if (!_options.laxRuntimeTypeToString) {
+            if (receiverDartType == commonElements.objectType) {
+              reporter.reportHintMessage(computeSourceSpanFromTreeNode(node),
+                  MessageKind.RUNTIME_TYPE_TO_STRING_OBJECT);
+            } else {
+              reporter.reportHintMessage(
+                  computeSourceSpanFromTreeNode(node),
+                  MessageKind.RUNTIME_TYPE_TO_STRING_SUBTYPE,
+                  {'receiverType': '${receiverDartType}.'});
             }
           }
-
-          impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
-              selector.toCallSelector(), getterConstraint, typeArguments));
-        } else {
-          impactBuilder.registerDynamicUse(
-              new ConstrainedDynamicUse(selector, constraint, typeArguments));
-        }
+          break;
+        case RuntimeTypeUseKind.equals:
+        case RuntimeTypeUseKind.unknown:
+          break;
       }
     }
-    return returnType;
+    impactBuilder.registerRuntimeTypeUse(
+        new RuntimeTypeUse(kind, receiverDartType, argumentDartType));
   }
 
   @override
-  ir.DartType visitPropertyGet(ir.PropertyGet node) {
-    Object constraint;
-    ir.DartType receiverType = visitNode(node.receiver);
-    ir.DartType resultType = computePropertyGetType(node, receiverType);
-    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
-
-    DartType receiverDartType = elementMap.getDartType(receiverType);
-    if (receiverDartType is InterfaceType) {
-      constraint = new StrongModeConstraint(
-          commonElements, _nativeBasicData, receiverDartType.element);
-    }
-    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
-        new Selector.getter(elementMap.getName(node.name)),
-        constraint, const <DartType>[]));
-
-    if (node.name.name == Identifiers.runtimeType_) {
-      RuntimeTypeUse runtimeTypeUse = computeRuntimeTypeUse(elementMap, node);
-      if (_options.omitImplicitChecks) {
-        switch (runtimeTypeUse.kind) {
-          case RuntimeTypeUseKind.string:
-            if (!_options.laxRuntimeTypeToString) {
-              if (runtimeTypeUse.receiverType == commonElements.objectType) {
-                reporter.reportHintMessage(computeSourceSpanFromTreeNode(node),
-                    MessageKind.RUNTIME_TYPE_TO_STRING_OBJECT);
-              } else {
-                reporter.reportHintMessage(
-                    computeSourceSpanFromTreeNode(node),
-                    MessageKind.RUNTIME_TYPE_TO_STRING_SUBTYPE,
-                    {'receiverType': '${runtimeTypeUse.receiverType}.'});
-              }
-            }
-            break;
-          case RuntimeTypeUseKind.equals:
-          case RuntimeTypeUseKind.unknown:
-            break;
-        }
-      }
-      impactBuilder.registerRuntimeTypeUse(runtimeTypeUse);
-    }
-    return resultType;
-  }
-
-  @override
-  ir.DartType visitPropertySet(ir.PropertySet node) {
-    Object constraint;
-    ir.DartType receiverType = visitNode(node.receiver);
-    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
-    DartType receiverDartType = elementMap.getDartType(receiverType);
-    if (receiverDartType is InterfaceType) {
-      constraint = new StrongModeConstraint(
-          commonElements, _nativeBasicData, receiverDartType.element);
-    }
-    impactBuilder.registerDynamicUse(new ConstrainedDynamicUse(
-        new Selector.setter(elementMap.getName(node.name)),
-        constraint, const <DartType>[]));
-    return super.visitPropertySet(node);
-  }
-
-  @override
-  Null visitAssertStatement(ir.AssertStatement node) {
+  void registerAssert({bool withMessage}) {
     impactBuilder.registerFeature(
-        node.message != null ? Feature.ASSERT_WITH_MESSAGE : Feature.ASSERT);
-    visitNode(node.condition);
-    visitNode(node.message);
+        withMessage ? Feature.ASSERT_WITH_MESSAGE : Feature.ASSERT);
   }
 
   @override
-  ir.DartType visitInstantiation(ir.Instantiation node) {
+  void registerGenericInstantiation(
+      ir.FunctionType expressionType, List<ir.DartType> typeArguments) {
     // TODO(johnniwinther): Track which arities are used in instantiation.
-    ir.FunctionType expressionType = visitNode(node.expression);
     impactBuilder.registerInstantiation(new GenericInstantiation(
         elementMap.getDartType(expressionType),
-        node.typeArguments.map(elementMap.getDartType).toList()));
-    return computeInstantiationType(node, expressionType);
+        typeArguments.map(elementMap.getDartType).toList()));
   }
 
   @override
-  ir.DartType visitStringConcatenation(ir.StringConcatenation node) {
+  void registerStringConcatenation() {
     impactBuilder.registerFeature(Feature.STRING_INTERPOLATION);
     impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION);
-    visitNodes(node.expressions);
-    return super.visitStringConcatenation(node);
   }
 
   @override
-  Null visitFunctionDeclaration(ir.FunctionDeclaration node) {
+  void registerLocalFunction(ir.TreeNode node) {
     Local function = elementMap.getLocalFunction(node);
     impactBuilder.registerStaticUse(new StaticUse.closure(function));
-    handleSignature(node.function);
-    handleAsyncMarker(node.function);
-    visitNode(node.function.body);
   }
 
   @override
-  ir.DartType visitFunctionExpression(ir.FunctionExpression node) {
-    Local function = elementMap.getLocalFunction(node);
-    impactBuilder.registerStaticUse(new StaticUse.closure(function));
-    handleSignature(node.function);
-    handleAsyncMarker(node.function);
-    visitNode(node.function.body);
-    return super.visitFunctionExpression(node);
+  void registerLocalWithoutInitializer() {
+    impactBuilder.registerFeature(Feature.LOCAL_WITHOUT_INITIALIZER);
   }
 
   @override
-  Null visitVariableDeclaration(ir.VariableDeclaration node) {
-    if (node.initializer != null) {
-      visitNode(node.initializer);
-    } else {
-      impactBuilder.registerFeature(Feature.LOCAL_WITHOUT_INITIALIZER);
-    }
+  void registerIsCheck(ir.DartType type) {
+    impactBuilder
+        .registerTypeUse(new TypeUse.isCheck(elementMap.getDartType(type)));
   }
 
   @override
-  ir.DartType visitIsExpression(ir.IsExpression node) {
+  void registerImplicitCast(ir.DartType type) {
     impactBuilder.registerTypeUse(
-        new TypeUse.isCheck(elementMap.getDartType(node.type)));
-    visitNode(node.operand);
-    return super.visitIsExpression(node);
+        new TypeUse.implicitCast(elementMap.getDartType(type)));
   }
 
   @override
-  ir.DartType visitAsExpression(ir.AsExpression node) {
-    DartType type = elementMap.getDartType(node.type);
-    if (node.isTypeError) {
-      impactBuilder.registerTypeUse(new TypeUse.implicitCast(type));
-    } else {
-      impactBuilder.registerTypeUse(new TypeUse.asCast(type));
-    }
-    visitNode(node.operand);
-    return super.visitAsExpression(node);
+  void registerAsCast(ir.DartType type) {
+    impactBuilder
+        .registerTypeUse(new TypeUse.asCast(elementMap.getDartType(type)));
   }
 
   @override
-  ir.DartType visitThrow(ir.Throw node) {
+  @override
+  void registerThrow() {
     impactBuilder.registerFeature(Feature.THROW_EXPRESSION);
-    visitNode(node.expression);
-    return super.visitThrow(node);
   }
 
-  @override
-  Null visitForInStatement(ir.ForInStatement node) {
-    visitNode(node.variable);
-    visitNode(node.iterable);
-    visitNode(node.body);
+  void registerSyncForIn(ir.DartType iterableType) {
     // TODO(johnniwinther): Use receiver constraints for the dynamic uses in
     // strong mode.
-    if (node.isAsync) {
-      impactBuilder.registerFeature(Feature.ASYNC_FOR_IN);
-      impactBuilder.registerDynamicUse(new DynamicUse(Selectors.cancel));
-    } else {
-      impactBuilder.registerFeature(Feature.SYNC_FOR_IN);
-      impactBuilder.registerDynamicUse(new DynamicUse(Selectors.iterator));
-    }
+    impactBuilder.registerFeature(Feature.SYNC_FOR_IN);
+    impactBuilder.registerDynamicUse(new DynamicUse(Selectors.iterator));
     impactBuilder.registerDynamicUse(new DynamicUse(Selectors.current));
     impactBuilder.registerDynamicUse(new DynamicUse(Selectors.moveNext));
   }
 
-  @override
-  Null visitTryCatch(ir.TryCatch node) {
-    visitNode(node.body);
-    visitNodes(node.catches);
+  void registerAsyncForIn(ir.DartType iterableType) {
+    // TODO(johnniwinther): Use receiver constraints for the dynamic uses in
+    // strong mode.
+    impactBuilder.registerFeature(Feature.ASYNC_FOR_IN);
+    impactBuilder.registerDynamicUse(new DynamicUse(Selectors.cancel));
+    impactBuilder.registerDynamicUse(new DynamicUse(Selectors.current));
+    impactBuilder.registerDynamicUse(new DynamicUse(Selectors.moveNext));
   }
 
-  @override
-  Null visitCatch(ir.Catch node) {
+  void registerCatch() {
     impactBuilder.registerFeature(Feature.CATCH_STATEMENT);
-    if (node.stackTrace != null) {
-      impactBuilder.registerFeature(Feature.STACK_TRACE_IN_CATCH);
-    }
-    if (node.guard is! ir.DynamicType) {
-      impactBuilder.registerTypeUse(
-          new TypeUse.catchType(elementMap.getDartType(node.guard)));
-    }
-    visitNode(node.body);
+  }
+
+  void registerStackTrace() {
+    impactBuilder.registerFeature(Feature.STACK_TRACE_IN_CATCH);
+  }
+
+  void registerCatchType(ir.DartType type) {
+    impactBuilder
+        .registerTypeUse(new TypeUse.catchType(elementMap.getDartType(type)));
   }
 
   @override
-  Null visitTryFinally(ir.TryFinally node) {
-    visitNode(node.body);
-    visitNode(node.finalizer);
-  }
-
-  @override
-  ir.DartType visitTypeLiteral(ir.TypeLiteral node) {
+  void registerTypeLiteral(ir.DartType type, ir.LibraryDependency import) {
+    ImportEntity deferredImport = elementMap.getImport(import);
     impactBuilder.registerTypeUse(
-        new TypeUse.typeLiteral(elementMap.getDartType(node.type)));
-    if (node.type is ir.FunctionType) {
-      ir.FunctionType functionType = node.type;
-      assert(functionType.typedef != null);
+        new TypeUse.typeLiteral(elementMap.getDartType(type), deferredImport));
+    if (type is ir.FunctionType) {
+      assert(type.typedef != null);
       // TODO(johnniwinther): Can we avoid the typedef type altogether?
       // We need to ensure that the typedef is live.
-      elementMap.getTypedefType(functionType.typedef);
+      elementMap.getTypedefType(type.typedef);
     }
-    return super.visitTypeLiteral(node);
   }
 
   @override
-  Null visitFieldInitializer(ir.FieldInitializer node) {
-    impactBuilder.registerStaticUse(
-        new StaticUse.fieldInit(elementMap.getField(node.field)));
-    visitNode(node.value);
+  void registerFieldInitializer(ir.Field node) {
+    impactBuilder
+        .registerStaticUse(new StaticUse.fieldInit(elementMap.getField(node)));
   }
 
   @override
-  Null visitRedirectingInitializer(ir.RedirectingInitializer node) {
-    _visitArguments(node.arguments);
-    ConstructorEntity target = elementMap.getConstructor(node.target);
+  void registerRedirectingInitializer(
+      ir.Constructor constructor, ir.Arguments arguments) {
+    ConstructorEntity target = elementMap.getConstructor(constructor);
     impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
-        target, elementMap.getCallStructure(node.arguments)));
+        target, elementMap.getCallStructure(arguments)));
   }
 
   @override
-  ir.DartType visitLogicalExpression(ir.LogicalExpression node) {
-    visitNode(node.left);
-    visitNode(node.right);
-    return super.visitLogicalExpression(node);
-  }
-
-  ir.DartType visitNot(ir.Not node) {
-    visitNode(node.operand);
-    return super.visitNot(node);
-  }
-
-  @override
-  ir.DartType visitLoadLibrary(ir.LoadLibrary node) {
+  void registerLoadLibrary() {
     impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
         commonElements.loadDeferredLibrary, CallStructure.ONE_ARG));
     impactBuilder.registerFeature(Feature.LOAD_LIBRARY);
-    return super.visitLoadLibrary(node);
   }
 
   @override
-  Null visitEmptyStatement(ir.EmptyStatement node) {}
-
-  @override
-  Null visitForStatement(ir.ForStatement node) {
-    visitNodes(node.variables);
-    visitNode(node.condition);
-    visitNodes(node.updates);
-    visitNode(node.body);
-  }
-
-  @override
-  Null visitDoStatement(ir.DoStatement node) {
-    visitNode(node.body);
-    visitNode(node.condition);
-  }
-
-  @override
-  Null visitWhileStatement(ir.WhileStatement node) {
-    visitNode(node.condition);
-    visitNode(node.body);
-  }
-
-  @override
-  Null visitSwitchStatement(ir.SwitchStatement node) {
-    visitNode(node.expression);
-    visitNodes(node.cases);
-
+  void handleSwitchStatement(ir.SwitchStatement node) {
     // TODO(32557): Remove this when issue 32557 is fixed.
     ir.TreeNode firstCase;
     DartType firstCaseType;
@@ -985,47 +708,4 @@
       reporter.reportError(error, infos);
     }
   }
-
-  @override
-  Null visitSwitchCase(ir.SwitchCase node) {
-    visitNodes(node.expressions);
-    visitNode(node.body);
-  }
-
-  @override
-  Null visitContinueSwitchStatement(ir.ContinueSwitchStatement node) {}
-
-  @override
-  Null visitLabeledStatement(ir.LabeledStatement node) {
-    visitNode(node.body);
-  }
-
-  @override
-  Null visitBreakStatement(ir.BreakStatement node) {}
-
-  @override
-  Null visitYieldStatement(ir.YieldStatement node) {
-    visitNode(node.expression);
-  }
-
-  @override
-  ir.DartType visitLet(ir.Let node) {
-    visitNode(node.variable);
-    return super.visitLet(node);
-  }
-
-  @override
-  Null visitAssertInitializer(ir.AssertInitializer node) {
-    visitNode(node.statement);
-  }
-
-  @override
-  ir.DartType visitNamedExpression(ir.NamedExpression node) =>
-      visitNode(node.value);
-
-  // TODO(johnniwinther): Make this throw and visit child nodes explicitly
-  // instead to ensure that we don't visit unwanted parts of the ir.
-  @override
-  ir.DartType defaultNode(ir.Node node) =>
-      throw UnsupportedError('Unhandled node $node (${node.runtimeType})');
 }
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 6eca5ad..32d2c7a 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -17,23 +17,26 @@
 import '../enqueue.dart';
 import '../environment.dart' as env;
 import '../frontend_strategy.dart';
+import '../ir/closure.dart' show ClosureScopeModel;
+import '../ir/scope.dart' show ScopeModel;
+import '../js_backend/annotations.dart';
 import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
 import '../js_backend/backend_usage.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
 import '../js_backend/runtime_types.dart';
-import '../js_model/closure.dart' show ScopeModel;
-import '../library_loader.dart';
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../native/resolver.dart';
 import '../options.dart';
 import '../universe/class_hierarchy.dart';
+import '../universe/resolution_world_builder.dart';
 import '../universe/world_builder.dart';
 import '../universe/world_impact.dart';
 import 'deferred_load.dart';
 import 'element_map.dart';
 import 'element_map_impl.dart';
+import 'loader.dart';
 
 /// Front end strategy that loads '.dill' files and builds a resolved element
 /// model from kernel IR nodes.
@@ -45,8 +48,7 @@
 
   KernelAnnotationProcessor _annotationProcesser;
 
-  final Map<MemberEntity, ScopeModel> closureModels =
-      <MemberEntity, ScopeModel>{};
+  final Map<MemberEntity, ClosureScopeModel> closureModels = {};
 
   KernelFrontEndStrategy(this._compilerTask, this._options,
       DiagnosticReporter reporter, env.Environment environment) {
@@ -56,8 +58,8 @@
   }
 
   @override
-  void registerLoadedLibraries(LoadedLibraries loadedLibraries) {
-    _elementMap.addComponent(loadedLibraries.component);
+  void registerLoadedLibraries(KernelResult kernelResult) {
+    _elementMap.addComponent(kernelResult.component);
   }
 
   @override
@@ -113,6 +115,7 @@
       KAllocatorAnalysis allocatorAnalysis,
       NativeResolutionEnqueuer nativeResolutionEnqueuer,
       NoSuchMethodRegistry noSuchMethodRegistry,
+      AnnotationsDataBuilder annotationsDataBuilder,
       SelectorConstraintsStrategy selectorConstraintsStrategy,
       ClassHierarchyBuilder classHierarchyBuilder,
       ClassQueries classQueries) {
@@ -130,6 +133,7 @@
         allocatorAnalysis,
         nativeResolutionEnqueuer,
         noSuchMethodRegistry,
+        annotationsDataBuilder,
         selectorConstraintsStrategy,
         classHierarchyBuilder,
         classQueries);
@@ -139,10 +143,18 @@
   WorkItemBuilder createResolutionWorkItemBuilder(
       NativeBasicData nativeBasicData,
       NativeDataBuilder nativeDataBuilder,
+      AnnotationsDataBuilder annotationsDataBuilder,
       ImpactTransformer impactTransformer,
       Map<Entity, WorldImpact> impactCache) {
-    return new KernelWorkItemBuilder(_compilerTask, elementMap, nativeBasicData,
-        nativeDataBuilder, impactTransformer, closureModels, impactCache);
+    return new KernelWorkItemBuilder(
+        _compilerTask,
+        elementMap,
+        nativeBasicData,
+        nativeDataBuilder,
+        annotationsDataBuilder,
+        impactTransformer,
+        closureModels,
+        impactCache);
   }
 
   ClassQueries createClassQueries() {
@@ -160,7 +172,8 @@
   final KernelToElementMapImpl _elementMap;
   final ImpactTransformer _impactTransformer;
   final NativeMemberResolver _nativeMemberResolver;
-  final Map<MemberEntity, ScopeModel> closureModels;
+  final AnnotationsDataBuilder _annotationsDataBuilder;
+  final Map<MemberEntity, ClosureScopeModel> closureModels;
   final Map<Entity, WorldImpact> impactCache;
 
   KernelWorkItemBuilder(
@@ -168,6 +181,7 @@
       this._elementMap,
       NativeBasicData nativeBasicData,
       NativeDataBuilder nativeDataBuilder,
+      this._annotationsDataBuilder,
       this._impactTransformer,
       this.closureModels,
       this.impactCache)
@@ -176,8 +190,15 @@
 
   @override
   WorkItem createWorkItem(MemberEntity entity) {
-    return new KernelWorkItem(_compilerTask, _elementMap, _impactTransformer,
-        _nativeMemberResolver, entity, closureModels, impactCache);
+    return new KernelWorkItem(
+        _compilerTask,
+        _elementMap,
+        _impactTransformer,
+        _nativeMemberResolver,
+        _annotationsDataBuilder,
+        entity,
+        closureModels,
+        impactCache);
   }
 }
 
@@ -186,8 +207,9 @@
   final KernelToElementMapImpl _elementMap;
   final ImpactTransformer _impactTransformer;
   final NativeMemberResolver _nativeMemberResolver;
+  final AnnotationsDataBuilder _annotationsDataBuilder;
   final MemberEntity element;
-  final Map<MemberEntity, ScopeModel> closureModels;
+  final Map<MemberEntity, ClosureScopeModel> closureModels;
   final Map<Entity, WorldImpact> impactCache;
 
   KernelWorkItem(
@@ -195,6 +217,7 @@
       this._elementMap,
       this._impactTransformer,
       this._nativeMemberResolver,
+      this._annotationsDataBuilder,
       this.element,
       this.closureModels,
       this.impactCache);
@@ -203,14 +226,22 @@
   WorldImpact run() {
     return _compilerTask.measure(() {
       _nativeMemberResolver.resolveNativeMember(element);
-      _compilerTask.measureSubtask('closures', () {
-        ScopeModel closureModel = _elementMap.computeScopeModel(element);
-        if (closureModel != null) {
-          closureModels[element] = closureModel;
+      Set<PragmaAnnotation> annotations = processMemberAnnotations(
+          _elementMap.reporter,
+          _elementMap.commonElements,
+          _elementMap.elementEnvironment,
+          _annotationsDataBuilder,
+          element);
+      ScopeModel scopeModel = _compilerTask.measureSubtask('closures', () {
+        ScopeModel scopeModel = _elementMap.computeScopeModel(element);
+        if (scopeModel?.closureScopeModel != null) {
+          closureModels[element] = scopeModel.closureScopeModel;
         }
+        return scopeModel;
       });
       return _compilerTask.measureSubtask('worldImpact', () {
-        ResolutionImpact impact = _elementMap.computeWorldImpact(element);
+        ResolutionImpact impact = _elementMap.computeWorldImpact(
+            element, scopeModel?.variableScopeModel, annotations);
         WorldImpact worldImpact =
             _impactTransformer.transformResolutionImpact(impact);
         if (impactCache != null) {
diff --git a/pkg/compiler/lib/src/kernel/kernel_world.dart b/pkg/compiler/lib/src/kernel/kernel_world.dart
new file mode 100644
index 0000000..af7cde7
--- /dev/null
+++ b/pkg/compiler/lib/src/kernel/kernel_world.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../common_elements.dart';
+
+import '../elements/entities.dart';
+
+import '../elements/types.dart';
+import '../js_backend/annotations.dart';
+import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
+import '../js_backend/backend_usage.dart';
+import '../js_backend/interceptor_data.dart';
+import '../js_backend/native_data.dart';
+import '../js_backend/no_such_method_registry.dart';
+import '../js_backend/runtime_types.dart';
+import '../options.dart';
+import '../universe/class_hierarchy.dart';
+import '../universe/resolution_world_builder.dart';
+import '../world.dart';
+
+import 'element_map_impl.dart';
+
+class KClosedWorldImpl implements KClosedWorld {
+  final KernelToElementMapImpl elementMap;
+  final KElementEnvironment elementEnvironment;
+  final DartTypes dartTypes;
+  final KCommonElements commonElements;
+  final NativeData nativeData;
+  final InterceptorData interceptorData;
+  final BackendUsage backendUsage;
+  final NoSuchMethodData noSuchMethodData;
+
+  final Map<ClassEntity, Set<ClassEntity>> mixinUses;
+
+  final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
+
+  // TODO(johnniwinther): Can this be derived from [ClassSet]s?
+  final Set<ClassEntity> _implementedClasses;
+
+  final Iterable<MemberEntity> liveInstanceMembers;
+
+  /// Members that are written either directly or through a setter selector.
+  final Iterable<MemberEntity> assignedInstanceMembers;
+  final KAllocatorAnalysis allocatorAnalysis;
+
+  final Iterable<ClassEntity> liveNativeClasses;
+
+  final Iterable<MemberEntity> processedMembers;
+
+  final ClassHierarchy classHierarchy;
+
+  final AnnotationsData annotationsData;
+
+  RuntimeTypesNeed _rtiNeed;
+
+  KClosedWorldImpl(this.elementMap,
+      {CompilerOptions options,
+      this.elementEnvironment,
+      this.dartTypes,
+      this.commonElements,
+      this.nativeData,
+      this.interceptorData,
+      this.backendUsage,
+      this.noSuchMethodData,
+      ResolutionWorldBuilder resolutionWorldBuilder,
+      RuntimeTypesNeedBuilder rtiNeedBuilder,
+      this.allocatorAnalysis,
+      Set<ClassEntity> implementedClasses,
+      this.liveNativeClasses,
+      this.liveInstanceMembers,
+      this.assignedInstanceMembers,
+      this.processedMembers,
+      this.mixinUses,
+      this.typesImplementedBySubclasses,
+      this.classHierarchy,
+      this.annotationsData})
+      : _implementedClasses = implementedClasses {
+    _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed(
+        resolutionWorldBuilder, this, options);
+  }
+
+  RuntimeTypesNeed get rtiNeed => _rtiNeed;
+
+  /// Returns `true` if [cls] is implemented by an instantiated class.
+  bool isImplemented(ClassEntity cls) {
+    return _implementedClasses.contains(cls);
+  }
+}
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
new file mode 100644
index 0000000..19891b3
--- /dev/null
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -0,0 +1,161 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.library_loader;
+
+import 'dart:async';
+
+import 'package:front_end/src/fasta/kernel/utils.dart';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
+import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
+
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
+import 'package:kernel/kernel.dart' hide LibraryDependency, Combinator;
+import 'package:kernel/target/targets.dart';
+
+import '../../compiler_new.dart' as api;
+import '../common/tasks.dart' show CompilerTask, Measurer;
+import '../common.dart';
+import '../options.dart';
+import '../util/sink_adapter.dart';
+
+import 'front_end_adapter.dart';
+import 'dart2js_target.dart' show Dart2jsTarget;
+
+/// A task that produces the kernel IR representation of the application.
+///
+/// It supports loading both .dart source files or pre-compiled .dill files.
+/// When given .dart source files, it invokes the common front-end (CFE)
+/// to produce the corresponding kernel IR representation.
+class KernelLoaderTask extends CompilerTask {
+  final DiagnosticReporter _reporter;
+
+  final api.CompilerInput _compilerInput;
+  final api.CompilerOutput _compilerOutput;
+
+  final CompilerOptions _options;
+
+  /// Shared state between compilations.
+  fe.InitializedCompilerState initializedCompilerState;
+
+  // TODO(johnniwinther): Remove this when #34942 is fixed.
+  /// Force in-memory serialization/deserialization of the loaded component.
+  ///
+  /// This is used for testing.
+  bool forceSerialization = false;
+
+  KernelLoaderTask(this._options, this._compilerInput, this._compilerOutput,
+      this._reporter, Measurer measurer)
+      : initializedCompilerState = _options.kernelInitializedCompilerState,
+        super(measurer);
+
+  String get name => 'kernel loader';
+
+  /// Loads an entire Kernel [Component] from a file on disk.
+  Future<KernelResult> load(Uri resolvedUri) {
+    return measure(() async {
+      var isDill = resolvedUri.path.endsWith('.dill');
+      ir.Component component;
+      if (isDill) {
+        api.Input input = await _compilerInput.readFromUri(resolvedUri,
+            inputKind: api.InputKind.binary);
+        component = new ir.Component();
+        new BinaryBuilder(input.data).readComponent(component);
+      } else {
+        String targetName =
+            _options.compileForServer ? "dart2js_server" : "dart2js";
+        String platform = '${targetName}_platform.dill';
+        initializedCompilerState = fe.initializeCompiler(
+            initializedCompilerState,
+            new Dart2jsTarget(targetName, new TargetFlags()),
+            _options.librariesSpecificationUri,
+            _options.platformBinaries.resolve(platform),
+            _options.packageConfig,
+            experimentalFlags: _options.languageExperiments);
+        component = await fe.compile(
+            initializedCompilerState,
+            false,
+            new CompilerFileSystem(_compilerInput),
+            (e) => reportFrontEndMessage(_reporter, e),
+            resolvedUri);
+      }
+      if (component == null) return null;
+
+      if (_options.cfeOnly) {
+        measureSubtask('serialize dill', () {
+          _reporter.log('Writing dill to ${_options.outputUri}');
+          api.BinaryOutputSink dillOutput =
+              _compilerOutput.createBinarySink(_options.outputUri);
+          BinaryOutputSinkAdapter irSink =
+              new BinaryOutputSinkAdapter(dillOutput);
+          BinaryPrinter printer = new BinaryPrinter(irSink);
+          printer.writeComponentFile(component);
+          irSink.close();
+        });
+      }
+
+      if (forceSerialization) {
+        // TODO(johnniwinther): Remove this when #34942 is fixed.
+        List<int> data = serializeComponent(component);
+        component = new ir.Component();
+        new BinaryBuilder(data).readComponent(component);
+      }
+      return _toResult(component);
+    });
+  }
+
+  KernelResult _toResult(ir.Component component) {
+    Uri rootLibraryUri = null;
+    Iterable<ir.Library> libraries = component.libraries;
+    if (component.mainMethod != null) {
+      var root = component.mainMethod.enclosingLibrary;
+      rootLibraryUri = root.importUri;
+
+      // Filter unreachable libraries: [Component] was built by linking in the
+      // entire SDK libraries, not all of them are used. We include anything
+      // that is reachable from `main`. Note that all internal libraries that
+      // the compiler relies on are reachable from `dart:core`.
+      var seen = new Set<Library>();
+      search(ir.Library current) {
+        if (!seen.add(current)) return;
+        for (ir.LibraryDependency dep in current.dependencies) {
+          search(dep.targetLibrary);
+        }
+      }
+
+      search(root);
+
+      // Libraries dependencies do not show implicit imports to `dart:core`.
+      var dartCore = component.libraries.firstWhere((lib) {
+        return lib.importUri.scheme == 'dart' && lib.importUri.path == 'core';
+      });
+      search(dartCore);
+
+      libraries = libraries.where(seen.contains);
+    }
+    return new KernelResult(component, rootLibraryUri,
+        libraries.map((lib) => lib.importUri).toList());
+  }
+}
+
+/// Result of invoking the CFE to produce the kernel IR.
+class KernelResult {
+  final ir.Component component;
+
+  /// The [Uri] of the root library containing main.
+  final Uri rootLibraryUri;
+
+  /// Returns the [Uri]s of all libraries that have been loaded that are
+  /// reachable from the [rootLibraryUri].
+  ///
+  /// Note that [component] may contain some libraries that are excluded here.
+  final Iterable<Uri> libraries;
+
+  KernelResult(this.component, this.rootLibraryUri, this.libraries) {
+    assert(rootLibraryUri != null);
+  }
+
+  String toString() => 'root=$rootLibraryUri,libraries=${libraries}';
+}
diff --git a/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart b/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
deleted file mode 100644
index b5da035..0000000
--- a/pkg/compiler/lib/src/kernel/runtime_type_analysis.dart
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/ast.dart' as ir;
-
-import '../common/names.dart';
-import '../elements/types.dart';
-import '../ir/util.dart';
-import '../universe/feature.dart';
-import 'element_map.dart';
-
-/// Computes the [RuntimeTypeUse] corresponding to the `e.runtimeType` [node].
-RuntimeTypeUse computeRuntimeTypeUse(
-    KernelToElementMap elementMap, ir.PropertyGet node) {
-  /// Returns `true` if [node] is of the form `e.runtimeType`.
-  bool isGetRuntimeType(ir.TreeNode node) {
-    return node is ir.PropertyGet && node.name.name == Identifiers.runtimeType_;
-  }
-
-  /// Returns [node] if [node] is of the form `e.runtimeType` and `null`
-  /// otherwise.
-  ir.PropertyGet asGetRuntimeType(ir.TreeNode node) {
-    return isGetRuntimeType(node) ? node : null;
-  }
-
-  /// Returns `true` if [node] is of the form `e.toString()`.
-  bool isInvokeToString(ir.TreeNode node) {
-    return node is ir.MethodInvocation && node.name.name == 'toString';
-  }
-
-  assert(isGetRuntimeType(node));
-
-  // TODO(johnniwinther): Special-case `this.runtimeType`.
-  ir.Expression receiver;
-  ir.Expression argument;
-  RuntimeTypeUseKind kind;
-
-  if (node.receiver is ir.VariableGet &&
-      node.parent is ir.ConditionalExpression &&
-      node.parent.parent is ir.Let) {
-    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
-    if (nullAware != null) {
-      // The node is of the form:
-      //
-      //     let #t1 = e in #t1 == null ? null : #t1.runtimeType
-      //                                             ^
-
-      if (nullAware.parent is ir.VariableDeclaration &&
-          nullAware.parent.parent is ir.Let) {
-        NullAwareExpression outer =
-            getNullAwareExpression(nullAware.parent.parent);
-        if (outer != null &&
-            outer.receiver == nullAware.let &&
-            isInvokeToString(outer.expression)) {
-          // Detected
-          //
-          //     e?.runtimeType?.toString()
-          //        ^
-          // encoded as
-          //
-          //     let #t2 = (let #t1 = e in #t1 == null ? null : #t1.runtimeType)
-          //                                                        ^
-          //        in #t2 == null ? null : #t2.toString()
-          //
-          kind = RuntimeTypeUseKind.string;
-          receiver = nullAware.receiver;
-        }
-      } else if (nullAware.parent is ir.MethodInvocation) {
-        ir.MethodInvocation methodInvocation = nullAware.parent;
-        if (methodInvocation.receiver == nullAware.let &&
-            methodInvocation.name.name == '==') {
-          // Detected
-          //
-          //  e0?.runtimeType == other
-          ir.PropertyGet otherGetRuntimeType =
-              asGetRuntimeType(methodInvocation.arguments.positional.first);
-          if (otherGetRuntimeType != null) {
-            // Detected
-            //
-            //     e0?.runtimeType == e1.runtimeType
-            //         ^
-            // encoded as
-            //
-            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
-            //                                               ^
-            //        .==(e1.runtimeType)
-            kind = RuntimeTypeUseKind.equals;
-            receiver = nullAware.receiver;
-            argument = otherGetRuntimeType.receiver;
-          }
-
-          NullAwareExpression otherNullAware = getNullAwareExpression(
-              methodInvocation.arguments.positional.first);
-          if (otherNullAware != null &&
-              isGetRuntimeType(otherNullAware.expression)) {
-            // Detected
-            //
-            //     e0?.runtimeType == e1?.runtimeType
-            //         ^
-            // encoded as
-            //
-            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
-            //                                               ^
-            //         .==(let #t2 = e1 in #t2 == null ? null : #t2.runtimeType)
-            //
-            kind = RuntimeTypeUseKind.equals;
-            receiver = nullAware.receiver;
-            argument = otherNullAware.receiver;
-          }
-        } else if (isInvokeToString(nullAware.parent)) {
-          // Detected
-          //
-          //     e?.runtimeType.toString()
-          //        ^
-          // encoded as
-          //
-          //     (let #t1 = e in #t1 == null ? null : #t1.runtimeType)
-          //                                          ^
-          //         .toString()
-          //
-          kind = RuntimeTypeUseKind.string;
-          receiver = nullAware.receiver;
-        }
-      } else if (nullAware.parent is ir.Arguments &&
-          nullAware.parent.parent is ir.MethodInvocation) {
-        ir.MethodInvocation methodInvocation = nullAware.parent.parent;
-        if (methodInvocation.name.name == '==' &&
-            methodInvocation.arguments.positional.first == nullAware.let) {
-          // [nullAware] is the right hand side of ==.
-
-          ir.PropertyGet otherGetRuntimeType =
-              asGetRuntimeType(methodInvocation.receiver);
-          NullAwareExpression otherNullAware =
-              getNullAwareExpression(methodInvocation.receiver);
-
-          if (otherGetRuntimeType != null) {
-            // Detected
-            //
-            //     e0.runtimeType == e1?.runtimeType
-            //                           ^
-            // encoded as
-            //
-            //     e0.runtimeType.==(
-            //         let #t1 = e1 in #t1 == null ? null : #t1.runtimeType)
-            //                                                  ^
-            kind = RuntimeTypeUseKind.equals;
-            receiver = otherGetRuntimeType.receiver;
-            argument = nullAware.receiver;
-          }
-
-          if (otherNullAware != null &&
-              isGetRuntimeType(otherNullAware.expression)) {
-            // Detected
-            //
-            //     e0?.runtimeType == e1?.runtimeType
-            //                            ^
-            // encoded as
-            //
-            //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
-            //         .==(let #t2 = e1 in #t2 == null ? null : #t2.runtimeType)
-            //                                                      ^
-            kind = RuntimeTypeUseKind.equals;
-            receiver = otherNullAware.receiver;
-            argument = nullAware.receiver;
-          }
-        }
-      } else if (nullAware.parent is ir.StringConcatenation) {
-        // Detected
-        //
-        //     '${e?.runtimeType}'
-        //           ^
-        // encoded as
-        //
-        //     '${let #t1 = e in #t1 == null ? null : #t1.runtimeType}'
-        //                                                ^
-        kind = RuntimeTypeUseKind.string;
-        receiver = nullAware.receiver;
-      } else {
-        // Default to unknown
-        //
-        //     e?.runtimeType
-        //        ^
-        // encoded as
-        //
-        //     let #t1 = e in #t1 == null ? null : #t1.runtimeType
-        //                                         ^
-        kind = RuntimeTypeUseKind.unknown;
-        receiver = nullAware.receiver;
-      }
-    }
-  } else if (node.parent is ir.VariableDeclaration &&
-      node.parent.parent is ir.Let) {
-    NullAwareExpression nullAware = getNullAwareExpression(node.parent.parent);
-    if (nullAware != null && isInvokeToString(nullAware.expression)) {
-      // Detected
-      //
-      //     e.runtimeType?.toString()
-      //       ^
-      // encoded as
-      //
-      //     let #t1 = e.runtimeType in #t1 == null ? null : #t1.toString()
-      //                 ^
-      kind = RuntimeTypeUseKind.string;
-      receiver = node.receiver;
-    }
-  } else if (node.parent is ir.MethodInvocation) {
-    ir.MethodInvocation methodInvocation = node.parent;
-    if (methodInvocation.name.name == '==' &&
-        methodInvocation.receiver == node) {
-      // [node] is the left hand side of ==.
-
-      ir.PropertyGet otherGetRuntimeType =
-          asGetRuntimeType(methodInvocation.arguments.positional.first);
-      NullAwareExpression nullAware =
-          getNullAwareExpression(methodInvocation.arguments.positional.first);
-      if (otherGetRuntimeType != null) {
-        // Detected
-        //
-        //     e0.runtimeType == e1.runtimeType
-        //        ^
-        // encoded as
-        //
-        //     e0.runtimeType.==(e1.runtimeType)
-        //        ^
-        kind = RuntimeTypeUseKind.equals;
-        receiver = node.receiver;
-        argument = otherGetRuntimeType.receiver;
-      } else if (nullAware != null && isGetRuntimeType(nullAware.expression)) {
-        // Detected
-        //
-        //     e0.runtimeType == e1?.runtimeType
-        //        ^
-        // encoded as
-        //
-        //     e0.runtimeType.==(
-        //        ^
-        //         let #t1 = e1 in #t1 == null ? null : #t1.runtimeType)
-        kind = RuntimeTypeUseKind.equals;
-        receiver = node.receiver;
-        argument = nullAware.receiver;
-      }
-    } else if (isInvokeToString(node.parent)) {
-      // Detected
-      //
-      //     e.runtimeType.toString()
-      //       ^
-      kind = RuntimeTypeUseKind.string;
-      receiver = node.receiver;
-    }
-  } else if (node.parent is ir.Arguments &&
-      node.parent.parent is ir.MethodInvocation) {
-    ir.MethodInvocation methodInvocation = node.parent.parent;
-    if (methodInvocation.name.name == '==' &&
-        methodInvocation.arguments.positional.first == node) {
-      // [node] is the right hand side of ==.
-      ir.PropertyGet otherGetRuntimeType =
-          asGetRuntimeType(methodInvocation.receiver);
-      NullAwareExpression nullAware =
-          getNullAwareExpression(methodInvocation.receiver);
-
-      if (otherGetRuntimeType != null) {
-        // Detected
-        //
-        //     e0.runtimeType == e1.runtimeType
-        //                          ^
-        // encoded as
-        //
-        //     e0.runtimeType.==(e1.runtimeType)
-        //                          ^
-        kind = RuntimeTypeUseKind.equals;
-        receiver = otherGetRuntimeType.receiver;
-        argument = node.receiver;
-      } else if (nullAware != null && isGetRuntimeType(nullAware.expression)) {
-        // Detected
-        //
-        //     e0?.runtimeType == e1.runtimeType
-        //                           ^
-        // encoded as
-        //
-        //     (let #t1 = e0 in #t1 == null ? null : #t1.runtimeType)
-        //         .==(e1.runtimeType)
-        //                ^
-        kind = RuntimeTypeUseKind.equals;
-        receiver = nullAware.receiver;
-        argument = node.receiver;
-      }
-    }
-  } else if (node.parent is ir.StringConcatenation) {
-    // Detected
-    //
-    //     '${e.runtimeType}'
-    //          ^
-    kind = RuntimeTypeUseKind.string;
-    receiver = node.receiver;
-  }
-
-  if (kind == null) {
-    // Default to unknown
-    //
-    //     e.runtimeType
-    //       ^
-    kind = RuntimeTypeUseKind.unknown;
-    receiver = node.receiver;
-  }
-
-  DartType receiverType = elementMap.getStaticType(receiver);
-  DartType argumentType =
-      argument == null ? null : elementMap.getStaticType(argument);
-  return new RuntimeTypeUse(kind, receiverType, argumentType);
-}
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
deleted file mode 100644
index b7ab8cc..0000000
--- a/pkg/compiler/lib/src/library_loader.dart
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.library_loader;
-
-import 'dart:async';
-
-import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
-import 'package:kernel/ast.dart' as ir;
-import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
-import 'package:kernel/kernel.dart' hide LibraryDependency, Combinator;
-import 'package:kernel/target/targets.dart';
-
-import '../compiler_new.dart' as api;
-import 'kernel/front_end_adapter.dart';
-import 'kernel/dart2js_target.dart' show Dart2jsTarget;
-
-import 'common/tasks.dart' show CompilerTask, Measurer;
-import 'common.dart';
-import 'options.dart';
-
-/// A loader that builds a kernel IR representation of the component.
-///
-/// It supports loading both .dart source files or pre-compiled .dill files.
-/// When given .dart source files, it invokes the shared frontend
-/// (`package:front_end`) to produce the corresponding kernel IR representation.
-// TODO(sigmund): move this class to a new file under src/kernel/.
-class LibraryLoaderTask extends CompilerTask {
-  final DiagnosticReporter _reporter;
-
-  final api.CompilerInput _compilerInput;
-
-  final CompilerOptions _options;
-
-  /// Shared state between compilations.
-  fe.InitializedCompilerState initializedCompilerState;
-
-  LibraryLoaderTask(
-      this._options, this._compilerInput, this._reporter, Measurer measurer)
-      : initializedCompilerState = _options.kernelInitializedCompilerState,
-        super(measurer);
-
-  String get name => 'Library loader';
-
-  /// Loads an entire Kernel [Component] from a file on disk.
-  Future<LoadedLibraries> loadLibraries(Uri resolvedUri) {
-    return measure(() async {
-      var isDill = resolvedUri.path.endsWith('.dill');
-      ir.Component component;
-      if (isDill) {
-        api.Input input = await _compilerInput.readFromUri(resolvedUri,
-            inputKind: api.InputKind.binary);
-        component = new ir.Component();
-        new BinaryBuilder(input.data).readComponent(component);
-      } else {
-        String targetName =
-            _options.compileForServer ? "dart2js_server" : "dart2js";
-        String platform = '${targetName}_platform.dill';
-        initializedCompilerState = fe.initializeCompiler(
-            initializedCompilerState,
-            new Dart2jsTarget(targetName, new TargetFlags()),
-            _options.librariesSpecificationUri,
-            _options.platformBinaries.resolve(platform),
-            _options.packageConfig);
-        component = await fe.compile(
-            initializedCompilerState,
-            _options.verbose,
-            new CompilerFileSystem(_compilerInput),
-            (e) => reportFrontEndMessage(_reporter, e),
-            resolvedUri);
-      }
-      if (component == null) return null;
-      return _createLoadedLibraries(component);
-    });
-  }
-
-  // Only visible for unit testing.
-  LoadedLibraries _createLoadedLibraries(ir.Component component) {
-    Uri rootLibraryUri = null;
-    Iterable<ir.Library> libraries = component.libraries;
-    if (component.mainMethod != null) {
-      var root = component.mainMethod.enclosingLibrary;
-      rootLibraryUri = root.importUri;
-
-      // Filter unreachable libraries: [Component] was built by linking in the
-      // entire SDK libraries, not all of them are used. We include anything
-      // that is reachable from `main`. Note that all internal libraries that
-      // the compiler relies on are reachable from `dart:core`.
-      var seen = new Set<Library>();
-      search(ir.Library current) {
-        if (!seen.add(current)) return;
-        for (ir.LibraryDependency dep in current.dependencies) {
-          search(dep.targetLibrary);
-        }
-      }
-
-      search(root);
-
-      // Libraries dependencies do not show implicit imports to `dart:core`.
-      var dartCore = component.libraries.firstWhere((lib) {
-        return lib.importUri.scheme == 'dart' && lib.importUri.path == 'core';
-      });
-      search(dartCore);
-
-      libraries = libraries.where(seen.contains);
-    }
-    return new LoadedLibraries(component, rootLibraryUri,
-        libraries.map((lib) => lib.importUri).toList());
-  }
-}
-
-/// Information on the set libraries loaded as a result of a call to
-/// [LibraryLoader.loadLibrary].
-class LoadedLibraries {
-  final ir.Component _component;
-  final Uri _rootLibraryUri;
-  final List<Uri> _libraries;
-
-  LoadedLibraries(this._component, this._rootLibraryUri, this._libraries) {
-    assert(rootLibraryUri != null);
-  }
-
-  /// Returns the root component for the loaded libraries.
-  ir.Component get component => _component;
-
-  /// The [Uri] of the root library.
-  Uri get rootLibraryUri => _rootLibraryUri;
-
-  /// Returns the [Uri]s of all libraries that have been loaded.
-  Iterable<Uri> get libraries => _libraries;
-
-  /// Returns `true` if a library with canonical [uri] was loaded in this bulk.
-  bool containsLibrary(Uri uri) {
-    return _libraries.contains(uri);
-  }
-
-  /// Applies all library [Uri]s in this bulk to [f].
-  void forEachLibrary(f(Uri Uri)) => _libraries.forEach(f);
-
-  String toString() => 'root=$_rootLibraryUri,libraries=${_libraries}';
-}
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index a437151..61900e4 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -94,36 +94,34 @@
   int get index => values.indexOf(this);
 }
 
-/**
- * A summary of the behavior of a native element.
- *
- * Native code can return values of one type and cause native subtypes of
- * another type to be instantiated.  By default, we compute both from the
- * declared type.
- *
- * A field might yield any native type that 'is' the field type.
- *
- * A method might create and return instances of native subclasses of its
- * declared return type, and a callback argument may be called with instances of
- * the callback parameter type (e.g. Event).
- *
- * If there is one or more `@Creates` annotations, the union of the named types
- * replaces the inferred instantiated type, and the return type is ignored for
- * the purpose of inferring instantiated types.
- *
- *     @Creates('IDBCursor')    // Created asynchronously.
- *     @Creates('IDBRequest')   // Created synchronously (for return value).
- *     IDBRequest openCursor();
- *
- * If there is one or more `@Returns` annotations, the union of the named types
- * replaces the declared return type.
- *
- *     @Returns('IDBRequest')
- *     IDBRequest openCursor();
- *
- * Types in annotations are non-nullable, so include `@Returns('Null')` if
- * `null` may be returned.
- */
+/// A summary of the behavior of a native element.
+///
+/// Native code can return values of one type and cause native subtypes of
+/// another type to be instantiated.  By default, we compute both from the
+/// declared type.
+///
+/// A field might yield any native type that 'is' the field type.
+///
+/// A method might create and return instances of native subclasses of its
+/// declared return type, and a callback argument may be called with instances
+/// of the callback parameter type (e.g. Event).
+///
+/// If there is one or more `@Creates` annotations, the union of the named types
+/// replaces the inferred instantiated type, and the return type is ignored for
+/// the purpose of inferring instantiated types.
+///
+///     @Creates('IDBCursor')    // Created asynchronously.
+///     @Creates('IDBRequest')   // Created synchronously (for return value).
+///     IDBRequest openCursor();
+///
+/// If there is one or more `@Returns` annotations, the union of the named types
+/// replaces the declared return type.
+///
+///     @Returns('IDBRequest')
+///     IDBRequest openCursor();
+///
+/// Types in annotations are non-nullable, so include `@Returns('Null')` if
+/// `null` may be returned.
 class NativeBehavior {
   /// Tag used for identifying serialized [NativeBehavior] objects in a
   /// debugging data stream.
@@ -742,11 +740,9 @@
     }
   }
 
-  /**
-   * Returns a list of type constraints from the annotations of
-   * [annotationClass].
-   * Returns `null` if no constraints.
-   */
+  /// Returns a list of type constraints from the annotations of
+  /// [annotationClass].
+  /// Returns `null` if no constraints.
   List _collect(Iterable<ConstantValue> metadata, ClassEntity annotationClass,
       TypeLookup lookupType) {
     var types = null;
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index a3a1dd2..dfd4b8f 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -14,9 +14,8 @@
 import 'behavior.dart';
 import 'resolver.dart' show NativeClassFinder;
 
-/**
- * This could be an abstract class but we use it as a stub for the dart_backend.
- */
+/// This could be an abstract class but we use it as a stub for the
+/// dart_backend.
 class NativeEnqueuer {
   /// Called when a [type] has been instantiated natively.
   void onInstantiatedType(InterfaceType type) {}
diff --git a/pkg/compiler/lib/src/native/native.dart b/pkg/compiler/lib/src/native/native.dart
deleted file mode 100644
index ae0ce99..0000000
--- a/pkg/compiler/lib/src/native/native.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library native;
-
-export 'behavior.dart';
-export 'enqueue.dart';
-export 'js.dart';
-
-const Iterable<String> _allowedDartSchemePaths = const <String>[
-  'async',
-  'html',
-  'html_common',
-  'indexed_db',
-  'js',
-  'js_util',
-  'svg',
-  '_native_typed_data',
-  'web_audio',
-  'web_gl',
-  'web_sql'
-];
-
-bool maybeEnableNative(Uri uri) {
-  bool allowedTestLibrary() {
-    String scriptName = uri.path;
-    return scriptName.contains('tests/compiler/dart2js_native') ||
-        scriptName.contains('tests/compiler/dart2js_extra');
-  }
-
-  bool allowedDartLibary() {
-    if (uri.scheme != 'dart') return false;
-    return _allowedDartSchemePaths.contains(uri.path);
-  }
-
-  return allowedTestLibrary() || allowedDartLibary();
-}
diff --git a/pkg/compiler/lib/src/null_compiler_output.dart b/pkg/compiler/lib/src/null_compiler_output.dart
index 0b71a1ac..95206bb 100644
--- a/pkg/compiler/lib/src/null_compiler_output.dart
+++ b/pkg/compiler/lib/src/null_compiler_output.dart
@@ -16,6 +16,11 @@
   OutputSink createOutputSink(String name, String extension, OutputType type) {
     return NullSink.outputProvider(name, extension, type);
   }
+
+  @override
+  BinaryOutputSink createBinarySink(Uri uri) {
+    return new NullBinarySink(uri);
+  }
 }
 
 /// A sink that drains into /dev/null.
@@ -24,11 +29,11 @@
 
   NullSink(this.name);
 
-  add(String value) {}
+  void add(String value) {}
 
   void close() {}
 
-  toString() => name;
+  String toString() => name;
 
   /// Convenience method for getting an [api.CompilerOutputProvider].
   static NullSink outputProvider(
@@ -36,3 +41,17 @@
     return new NullSink('$name.$extension.$type');
   }
 }
+
+class NullBinarySink implements BinaryOutputSink {
+  final Uri uri;
+
+  NullBinarySink(this.uri);
+
+  @override
+  void write(List<int> buffer, [int start = 0, int end]) {}
+
+  @override
+  void close() {}
+
+  String toString() => 'NullBinarySink($uri)';
+}
diff --git a/pkg/compiler/lib/src/old_to_new_api.dart b/pkg/compiler/lib/src/old_to_new_api.dart
index 0363419..808e242 100644
--- a/pkg/compiler/lib/src/old_to_new_api.dart
+++ b/pkg/compiler/lib/src/old_to_new_api.dart
@@ -71,7 +71,8 @@
   OutputSink createOutputSink(String name, String extension, OutputType type) {
     if (_outputProvider != null) {
       switch (type) {
-        case OutputType.info:
+        case OutputType.dumpInfo:
+        case OutputType.deferredMap:
           if (extension == '') {
             // Needed to make Pub generate the same output name.
             extension = 'deferred_map';
@@ -83,6 +84,11 @@
     }
     return NullSink.outputProvider(name, extension, type);
   }
+
+  @override
+  BinaryOutputSink createBinarySink(Uri uri) {
+    throw new UnsupportedError("LegacyCompilerOutput.createBinarySink");
+  }
 }
 
 class LegacyOutputSink implements OutputSink {
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 586171e..89e4c55 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -6,7 +6,6 @@
 
 import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
 
-import '../compiler.dart' show PackagesDiscoveryProvider;
 import 'commandline_options.dart' show Flags;
 
 /// Options used for controlling diagnostic messages.
@@ -42,9 +41,6 @@
   /// The entry point of the application that is being compiled.
   Uri entryPoint;
 
-  /// Root location where SDK libraries are found.
-  Uri libraryRoot;
-
   /// Package root location.
   ///
   /// If not null then [packageConfig] should be null.
@@ -55,14 +51,28 @@
   /// If not null then [packageRoot] should be null.
   Uri packageConfig;
 
-  // TODO(sigmund): Move out of here, maybe to CompilerInput. Options should not
-  // hold code, just configuration options.
-  PackagesDiscoveryProvider packagesDiscoveryProvider;
+  /// Location from which serialized inference data is read.
+  ///
+  /// If this is set, the [entryPoint] is expected to be a .dill file and the
+  /// frontend work is skipped.
+  Uri readDataUri;
+
+  /// Location to which inference data is serialized.
+  ///
+  /// If this is set, the compilation stops after type inference.
+  Uri writeDataUri;
+
+  /// Whether to run only the CFE and emit the generated kernel file in
+  /// [outputUri].
+  bool cfeOnly = false;
 
   /// Resolved constant "environment" values passed to the compiler via the `-D`
   /// flags.
   Map<String, String> environment = const <String, String>{};
 
+  /// Flags enabling language experiments.
+  Map<fe.ExperimentalFlag, bool> languageExperiments = {};
+
   /// A possibly null state object for kernel compilation.
   fe.InitializedCompilerState kernelInitializedCompilerState;
 
@@ -88,6 +98,25 @@
   /// libraries are subdivided.
   Uri deferredMapUri;
 
+  /// Whether to apply the new deferred split fixes. The fixes improve on
+  /// performance and fix a soundness issue with inferred types. The latter will
+  /// move more code to the main output unit, because of that we are not
+  /// enabling the feature by default right away.
+  ///
+  /// When [reportInvalidInferredDeferredTypes] shows no errors, we expect this
+  /// flag to produce the same or better results than the current unsound
+  /// implementation.
+  bool newDeferredSplit = false;
+
+  /// Show errors when a deferred type is inferred as a return type of a closure
+  /// or in a type parameter. Those cases cause the compiler today to behave
+  /// unsoundly by putting the code in a deferred output unit. In the future
+  /// when [newDeferredSplit] is on by default, those cases will be treated
+  /// soundly and will cause more code to be moved to the main output unit.
+  ///
+  /// This flag is presented to help developers find and fix the affected code.
+  bool reportInvalidInferredDeferredTypes = false;
+
   /// Whether to disable inlining during the backend optimizations.
   // TODO(sigmund): negate, so all flags are positive
   bool disableInlining = false;
@@ -117,6 +146,9 @@
   /// Whether to disable global type inference.
   bool disableTypeInference = false;
 
+  /// Whether to use the trivial abstract value domain.
+  bool useTrivialAbstractValueDomain = false;
+
   /// Whether to disable optimization for need runtime type information.
   bool disableRtiOptimization = false;
 
@@ -141,6 +173,11 @@
   // TODO(sigmund): rename to minify
   bool enableMinification = false;
 
+  /// Flag to turn off minification even if enabled elsewhere, e.g. via
+  /// -O2. Both [enableMinification] and [_disableMinification] can be true, in
+  /// which case [_disableMinification] wins.
+  bool _disableMinification = false;
+
   /// Whether to model which native classes are live based on annotations on the
   /// core libraries. If false, all native classes will be included by default.
   bool enableNativeLiveTypeAnalysis = true;
@@ -157,10 +194,6 @@
   /// URI of the main output if the compiler is generating source maps.
   Uri outputUri;
 
-  /// Location of the platform configuration file.
-  // TODO(sigmund): deprecate and remove, use only [librariesSpecificationUri]
-  Uri platformConfigUri;
-
   /// Location of the libraries specification file.
   Uri librariesSpecificationUri;
 
@@ -219,14 +252,14 @@
   /// (experimental)
   bool useNewSourceInfo = false;
 
-  /// Whether the user requested to use the fast startup emitter. The full
-  /// emitter might still be used if the program uses dart:mirrors.
-  bool useStartupEmitter = false;
-
-  /// Enable verbose printing during compilation. Includes progress messages
-  /// during each phase and a time-breakdown between phases at the end.
+  /// Enable verbose printing during compilation. Includes a time-breakdown
+  /// between phases at the end.
   bool verbose = false;
 
+  /// On top of --verbose, enable more verbose printing, like progress messages
+  /// during each phase of compilation.
+  bool showInternalProgress = false;
+
   /// Track allocations in the JS output.
   ///
   /// This is an experimental feature.
@@ -235,6 +268,18 @@
   /// Expermental optimization.
   bool experimentLocalNames = false;
 
+  /// Experimental part file function generation.
+  bool experimentStartupFunctions = false;
+
+  /// Experimental reliance on JavaScript ToBoolean conversions.
+  bool experimentToBoolean = false;
+
+  /// Experimental instrumentation to investigate code bloat.
+  ///
+  /// If [true], the compiler will emit code that logs whenever a method is
+  /// called.
+  bool experimentCallInstrumentation = false;
+
   /// The path to the file that contains the profiled allocations.
   ///
   /// The file must contain the Map that was produced by using
@@ -243,44 +288,47 @@
   /// This is an experimental feature.
   String experimentalAllocationsPath;
 
-  // -------------------------------------------------
-  // Options for deprecated features
-  // -------------------------------------------------
-  // TODO(sigmund): delete these as we delete the underlying features
-
-  /// Whether to start `async` functions synchronously.
-  bool startAsyncSynchronously = false;
-
   /// If specified, a bundle of optimizations to enable (or disable).
   int optimizationLevel = null;
 
+  // -------------------------------------------------
+  // Options for deprecated features
+  // -------------------------------------------------
+
   /// Create an options object by parsing flags from [options].
   static CompilerOptions parse(List<String> options,
-      {Uri libraryRoot, Uri platformBinaries}) {
+      {Uri librariesSpecificationUri, Uri platformBinaries}) {
     return new CompilerOptions()
-      ..libraryRoot = libraryRoot
+      ..librariesSpecificationUri = librariesSpecificationUri
       ..allowMockCompilation = _hasOption(options, Flags.allowMockCompilation)
       ..benchmarkingProduction =
           _hasOption(options, Flags.benchmarkingProduction)
       ..buildId =
           _extractStringOption(options, '--build-id=', _UNDETERMINED_BUILD_ID)
-      ..compileForServer = _resolveCompileForServerFromOptions(options)
+      ..compileForServer = _hasOption(options, Flags.serverMode)
       ..deferredMapUri = _extractUriOption(options, '--deferred-map=')
+      ..newDeferredSplit = _hasOption(options, Flags.newDeferredSplit)
+      ..reportInvalidInferredDeferredTypes =
+          _hasOption(options, Flags.reportInvalidInferredDeferredTypes)
       ..fatalWarnings = _hasOption(options, Flags.fatalWarnings)
       ..terseDiagnostics = _hasOption(options, Flags.terse)
       ..suppressWarnings = _hasOption(options, Flags.suppressWarnings)
       ..suppressHints = _hasOption(options, Flags.suppressHints)
       ..shownPackageWarnings =
           _extractOptionalCsvOption(options, Flags.showPackageWarnings)
+      ..languageExperiments = _extractExperiments(options)
       ..disableInlining = _hasOption(options, Flags.disableInlining)
       ..disableProgramSplit = _hasOption(options, Flags.disableProgramSplit)
       ..disableTypeInference = _hasOption(options, Flags.disableTypeInference)
+      ..useTrivialAbstractValueDomain =
+          _hasOption(options, Flags.useTrivialAbstractValueDomain)
       ..disableRtiOptimization =
           _hasOption(options, Flags.disableRtiOptimization)
       ..dumpInfo = _hasOption(options, Flags.dumpInfo)
       ..enableExperimentalMirrors =
           _hasOption(options, Flags.enableExperimentalMirrors)
       ..enableMinification = _hasOption(options, Flags.minify)
+      .._disableMinification = _hasOption(options, Flags.noMinify)
       ..enableNativeLiveTypeAnalysis =
           !_hasOption(options, Flags.disableNativeLiveTypeAnalysis)
       ..enableUserAssertions = _hasOption(options, Flags.enableCheckedMode) ||
@@ -290,13 +338,15 @@
       ..experimentalAllocationsPath = _extractStringOption(
           options, "${Flags.experimentalAllocationsPath}=", null)
       ..experimentLocalNames = _hasOption(options, Flags.experimentLocalNames)
+      ..experimentStartupFunctions =
+          _hasOption(options, Flags.experimentStartupFunctions)
+      ..experimentToBoolean = _hasOption(options, Flags.experimentToBoolean)
+      ..experimentCallInstrumentation =
+          _hasOption(options, Flags.experimentCallInstrumentation)
       ..generateCodeWithCompileTimeErrors =
           _hasOption(options, Flags.generateCodeWithCompileTimeErrors)
       ..generateSourceMap = !_hasOption(options, Flags.noSourceMaps)
       ..outputUri = _extractUriOption(options, '--out=')
-      ..platformConfigUri =
-          _resolvePlatformConfigFromOptions(libraryRoot, options)
-      ..librariesSpecificationUri = _resolveLibrariesSpecification(libraryRoot)
       ..platformBinaries =
           platformBinaries ?? _extractUriOption(options, '--platform-binaries=')
       ..sourceMapUri = _extractUriOption(options, '--source-map=')
@@ -314,20 +364,23 @@
           !_hasOption(options, Flags.noFrequencyBasedMinification)
       ..useMultiSourceInfo = _hasOption(options, Flags.useMultiSourceInfo)
       ..useNewSourceInfo = _hasOption(options, Flags.useNewSourceInfo)
-      ..useStartupEmitter = _hasOption(options, Flags.fastStartup)
-      ..startAsyncSynchronously = !_hasOption(options, Flags.noSyncAsync)
-      ..verbose = _hasOption(options, Flags.verbose);
+      ..verbose = _hasOption(options, Flags.verbose)
+      ..showInternalProgress = _hasOption(options, Flags.progress)
+      ..readDataUri = _extractUriOption(options, '${Flags.readData}=')
+      ..writeDataUri = _extractUriOption(options, '${Flags.writeData}=')
+      ..cfeOnly = _hasOption(options, Flags.cfeOnly);
   }
 
   void validate() {
     // TODO(sigmund): should entrypoint be here? should we validate it is not
     // null? In unittests we use the same compiler to analyze or build multiple
     // entrypoints.
-    if (libraryRoot == null) {
-      throw new ArgumentError("[libraryRoot] is null.");
+    if (librariesSpecificationUri == null) {
+      throw new ArgumentError("[librariesSpecificationUri] is null.");
     }
-    if (!libraryRoot.path.endsWith("/")) {
-      throw new ArgumentError("[libraryRoot] must end with a /");
+    if (librariesSpecificationUri.path.endsWith('/')) {
+      throw new ArgumentError(
+          "[librariesSpecificationUri] should be a file: $librariesSpecificationUri");
     }
     if (packageRoot != null && packageConfig != null) {
       throw new ArgumentError("Only one of [packageRoot] or [packageConfig] "
@@ -343,7 +396,6 @@
 
   void deriveOptions() {
     if (benchmarkingProduction) {
-      useStartupEmitter = true;
       trustPrimitives = true;
       omitImplicitChecks = true;
     }
@@ -368,10 +420,6 @@
 
     // TODO(johnniwinther): Should we support this in the future?
     generateCodeWithCompileTimeErrors = false;
-    if (platformConfigUri == null) {
-      platformConfigUri = _resolvePlatformConfig(libraryRoot, null, const []);
-    }
-    librariesSpecificationUri = _resolveLibrariesSpecification(libraryRoot);
 
     // Strong mode always trusts type annotations (inferred or explicit), so
     // assignments checks should be trusted.
@@ -383,6 +431,10 @@
       parameterCheckPolicy = CheckPolicy.checked;
       implicitDowncastCheckPolicy = CheckPolicy.checked;
     }
+
+    if (_disableMinification) {
+      enableMinification = false;
+    }
   }
 
   /// Returns `true` if warnings and hints are shown for all packages.
@@ -417,18 +469,13 @@
   /// Whether the type assertion should be emitted and checked.
   final bool isEmitted;
 
-  /// Whether the type assertion should be ignored.
-  final bool isIgnored;
-
-  const CheckPolicy(
-      {this.isTrusted: false, this.isEmitted: false, this.isIgnored: false});
+  const CheckPolicy({this.isTrusted: false, this.isEmitted: false});
 
   static const trusted = const CheckPolicy(isTrusted: true);
   static const checked = const CheckPolicy(isEmitted: true);
-  static const ignored = const CheckPolicy(isIgnored: true);
 
   String toString() => 'CheckPolicy(isTrusted=$isTrusted,'
-      'isEmitted=$isEmitted,isIgnored=$isIgnored)';
+      'isEmitted=$isEmitted)';
 }
 
 String _extractStringOption(
@@ -446,16 +493,6 @@
   return (option == null) ? null : Uri.parse(option);
 }
 
-// CSV: Comma separated values.
-List<String> _extractCsvOption(List<String> options, String prefix) {
-  for (String option in options) {
-    if (option.startsWith(prefix)) {
-      return option.substring(prefix.length).split(',');
-    }
-  }
-  return const <String>[];
-}
-
 bool _hasOption(List<String> options, String option) {
   return options.indexOf(option) >= 0;
 }
@@ -476,44 +513,11 @@
   return null;
 }
 
-Uri _resolvePlatformConfig(
-    Uri libraryRoot, String platformConfigPath, Iterable<String> categories) {
-  if (platformConfigPath != null) {
-    return libraryRoot.resolve(platformConfigPath);
-  } else {
-    if (categories.length == 0) {
-      return libraryRoot.resolve(_clientPlatform);
-    }
-    assert(categories.length <= 2);
-    if (categories.contains("Client")) {
-      if (categories.contains("Server")) {
-        return libraryRoot.resolve(_sharedPlatform);
-      }
-      return libraryRoot.resolve(_clientPlatform);
-    }
-    assert(categories.contains("Server"));
-    return libraryRoot.resolve(_serverPlatform);
-  }
+Map<fe.ExperimentalFlag, bool> _extractExperiments(List<String> options) {
+  List<String> experiments =
+      _extractOptionalCsvOption(options, Flags.enableLanguageExperiments);
+  return fe.parseExperimentalFlags(
+      experiments, (String error) => throw new ArgumentError(error));
 }
 
-bool _resolveCompileForServerFromOptions(List<String> options) {
-  var categories = _extractCsvOption(options, '--categories=');
-  return categories.length == 1 && categories.single == 'Server';
-}
-
-Uri _resolvePlatformConfigFromOptions(Uri libraryRoot, List<String> options) {
-  return _resolvePlatformConfig(
-      libraryRoot,
-      _extractStringOption(options, "--platform-config=", null),
-      _extractCsvOption(options, '--categories='));
-}
-
-Uri _resolveLibrariesSpecification(Uri libraryRoot) =>
-    libraryRoot.resolve('lib/libraries.json');
-
-/// Locations of the platform descriptor files relative to the library root.
-const String _clientPlatform = "lib/dart_client.platform";
-const String _serverPlatform = "lib/dart_server.platform";
-const String _sharedPlatform = "lib/dart_shared.platform";
-
 const String _UNDETERMINED_BUILD_ID = "build number could not be determined";
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index 57ed4cb..e3b4f3e 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.dart
@@ -13,23 +13,21 @@
 import 'elements/types.dart';
 import 'serialization/serialization.dart';
 
-/**
- * An ordered set of the supertypes of a class. The supertypes of a class are
- * ordered by decreasing hierarchy depth and by the order they are extended,
- * mixed in, or implemented.
- *
- * For these classes
- *
- *     class A {} // Depth = 1.
- *     class B {} // Depth = 1.
- *     class C extends B implements A {} // Depth 2.
- *
- * the ordered supertypes are
- *
- *     A: [A, Object]
- *     B: [B, Object]
- *     C: [C, B, A, Object]
- */
+/// An ordered set of the supertypes of a class. The supertypes of a class are
+/// ordered by decreasing hierarchy depth and by the order they are extended,
+/// mixed in, or implemented.
+///
+/// For these classes
+///
+///     class A {} // Depth = 1.
+///     class B {} // Depth = 1.
+///     class C extends B implements A {} // Depth 2.
+///
+/// the ordered supertypes are
+///
+///     A: [A, Object]
+///     B: [B, Object]
+///     C: [C, B, A, Object]
 class OrderedTypeSet {
   /// Tag used for identifying serialized [OrderedTypeSet] objects in a
   /// debugging data stream.
@@ -198,23 +196,21 @@
   String toString() => types.toString();
 }
 
-/**
- * Builder for creation an ordered set of the supertypes of a class. The
- * supertypes are ordered by decreasing hierarchy depth and by the order they
- * are extended, mixed in, or implemented.
- *
- * For these classes
- *
- *     class A {} // Depth = 1.
- *     class B {} // Depth = 1.
- *     class C extends B implements A {} // Depth 2.
- *
- * the ordered supertypes are
- *
- *     A: [A, Object]
- *     B: [B, Object]
- *     C: [C, B, A, Object]
- */
+/// Builder for creation an ordered set of the supertypes of a class. The
+/// supertypes are ordered by decreasing hierarchy depth and by the order they
+/// are extended, mixed in, or implemented.
+///
+/// For these classes
+///
+///     class A {} // Depth = 1.
+///     class B {} // Depth = 1.
+///     class C extends B implements A {} // Depth 2.
+///
+/// the ordered supertypes are
+///
+///     A: [A, Object]
+///     B: [B, Object]
+///     C: [C, B, A, Object]
 abstract class OrderedTypeSetBuilder {
   OrderedTypeSet createOrderedTypeSet(
       InterfaceType supertype, Link<DartType> interfaces);
@@ -257,10 +253,8 @@
     return toTypeSet();
   }
 
-  /**
-   * Adds [type] and all supertypes of [type] to [allSupertypes] while
-   * substituting type variables.
-   */
+  /// Adds [type] and all supertypes of [type] to [allSupertypes] while
+  /// substituting type variables.
   void _addAllSupertypes(InterfaceType type) {
     ClassEntity classElement = type.element;
     Link<InterfaceType> supertypes = getOrderedTypeSet(classElement).supertypes;
diff --git a/pkg/compiler/lib/src/platform_configuration.dart b/pkg/compiler/lib/src/platform_configuration.dart
deleted file mode 100644
index 0f61ca4..0000000
--- a/pkg/compiler/lib/src/platform_configuration.dart
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright (c) 2015, the Fletch project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE.md file.
-
-/// Tools for loading and parsing platform-configuration files.
-library platform_configuration;
-
-import "dart:async";
-
-import "package:charcode/ascii.dart";
-
-import "../compiler_new.dart" as api;
-
-/// Parses an Ini-like format.
-///
-/// Sections are initialized with a name enclosed in brackets.
-/// Each section contain zero or more properties of the form "name:value".
-/// Empty lines are ignored.
-/// Lines starting with # are ignored.
-/// Duplicate names are not allowed.
-/// All keys and values will be passed through [String.trim].
-///
-/// If an error is found, a [FormatException] is thrown, using [sourceUri] in
-/// the error message.
-///
-/// Example
-/// ```
-/// [a]
-/// b:c
-///
-/// [d]
-/// e:file:///tmp/bla
-/// ```
-/// Will parse to {"a": {"b":"c"}, "d": {"e": "file:///tmp/bla"}}.
-
-Map<String, Map<String, String>> parseIni(List<int> source,
-    {Set<String> allowedSections, Uri sourceUri}) {
-  int startOfLine = 0;
-  int currentLine = 0;
-
-  error(String message, int index) {
-    int column = index - startOfLine + 1;
-    throw new FormatException(
-        "$sourceUri:$currentLine:$column: $message", sourceUri, index);
-  }
-
-  Map<String, Map<String, String>> result =
-      new Map<String, Map<String, String>>();
-  Map<String, String> currentSection = null;
-
-  if (source.length == 0) return result;
-  bool endOfFile = false;
-
-  // Iterate once per $lf in file.
-  while (!endOfFile) {
-    currentLine += 1;
-    int endOfLine = source.indexOf($lf, startOfLine);
-    if (endOfLine == -1) {
-      // The dart2js provider adds a final 0 to the file.
-      endOfLine = source.last == 0 ? source.length - 1 : source.length;
-      endOfFile = true;
-    }
-    if (startOfLine != endOfLine) {
-      int firstChar = source[startOfLine];
-      if (firstChar == $hash) {
-        // Comment, do nothing.
-      } else if (firstChar == $open_bracket) {
-        // Section header
-        int endOfHeader = source.indexOf($close_bracket, startOfLine);
-        if (endOfHeader == -1) {
-          error("'[' must be matched by ']' on the same line.", startOfLine);
-        }
-        if (endOfHeader == startOfLine + 1) {
-          error("Empty header name", startOfLine + 1);
-        }
-        if (endOfHeader != endOfLine - 1) {
-          error("Section heading lines must end with ']'", endOfHeader + 1);
-        }
-        int startOfSectionName = startOfLine + 1;
-        String sectionName =
-            new String.fromCharCodes(source, startOfSectionName, endOfHeader)
-                .trim();
-        currentSection = new Map<String, String>();
-        if (result.containsKey(sectionName)) {
-          error("Duplicate section name '$sectionName'", startOfSectionName);
-        }
-        if (allowedSections != null && !allowedSections.contains(sectionName)) {
-          error("Unrecognized section name '$sectionName'", startOfSectionName);
-        }
-        result[sectionName] = currentSection;
-      } else {
-        // Property line
-        if (currentSection == null) {
-          error("Property outside section", startOfLine);
-        }
-        int separator = source.indexOf($colon, startOfLine);
-        if (separator == startOfLine) {
-          error("Empty property name", startOfLine);
-        }
-        if (separator == -1 || separator > endOfLine) {
-          error("Property line without ':'", startOfLine);
-        }
-        String propertyName =
-            new String.fromCharCodes(source, startOfLine, separator).trim();
-        if (currentSection.containsKey(propertyName)) {
-          error("Duplicate property name '$propertyName'", startOfLine);
-        }
-        String propertyValue =
-            new String.fromCharCodes(source, separator + 1, endOfLine).trim();
-        currentSection[propertyName] = propertyValue;
-      }
-    }
-    startOfLine = endOfLine + 1;
-  }
-  return result;
-}
-
-const String librariesSection = "libraries";
-const String dartSpecSection = "dart-spec";
-const String featuresSection = "features";
-
-Map<String, Uri> libraryMappings(
-    Map<String, Map<String, String>> sections, Uri baseLocation) {
-  assert(sections.containsKey(librariesSection));
-  Map<String, Uri> result = new Map<String, Uri>();
-  sections[librariesSection].forEach((String name, String value) {
-    result[name] = baseLocation.resolve(value);
-  });
-  return result;
-}
-
-final Set<String> allowedSections =
-    new Set.from([librariesSection, dartSpecSection, featuresSection]);
-
-Future<Map<String, Uri>> load(Uri location, api.CompilerInput provider) {
-  return provider
-      .readFromUri(location, inputKind: api.InputKind.binary)
-      .then((api.Input input) {
-    return libraryMappings(
-        parseIni(input.data,
-            allowedSections: allowedSections, sourceUri: location),
-        location);
-  });
-}
diff --git a/pkg/compiler/lib/src/resolved_uri_translator.dart b/pkg/compiler/lib/src/resolved_uri_translator.dart
deleted file mode 100644
index ded9161..0000000
--- a/pkg/compiler/lib/src/resolved_uri_translator.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// API used by the library loader to translate internal SDK URIs into file
-/// system readable URIs.
-abstract class ResolvedUriTranslator {
-  factory ResolvedUriTranslator(Map<String, Uri> sdkLibraries) =
-      _ResolvedUriTranslator;
-
-  /// A mapping from dart: library names to their location.
-  Map<String, Uri> get sdkLibraries;
-}
-
-/// A translator that forwards all methods to an internal
-/// [ResolvedUriTranslator].
-///
-/// The translator to forward to may be set after the instance is constructed.
-/// This is useful for the compiler because some tasks that are instantiated at
-/// compiler construction time need a [ResolvedUriTranslator], but the data
-/// required to instantiate it cannot be obtained at construction time. So a
-/// [ForwardingResolvedUriTranslator] may be passed instead, and the translator
-/// to forward to can be set once the required data has been retrieved.
-class ForwardingResolvedUriTranslator implements ResolvedUriTranslator {
-  ResolvedUriTranslator resolvedUriTranslator;
-
-  /// Returns `true` if [resolvedUriTranslator] is not `null`.
-  bool get isSet => resolvedUriTranslator != null;
-
-  /// The opposite of [isSet].
-  bool get isNotSet => resolvedUriTranslator == null;
-
-  @override
-  Map<String, Uri> get sdkLibraries => resolvedUriTranslator.sdkLibraries;
-}
-
-class _ResolvedUriTranslator implements ResolvedUriTranslator {
-  final Map<String, Uri> _sdkLibraries;
-
-  _ResolvedUriTranslator(this._sdkLibraries);
-
-  Map<String, Uri> get sdkLibraries => _sdkLibraries;
-}
diff --git a/pkg/compiler/lib/src/script.dart b/pkg/compiler/lib/src/script.dart
index 403776b..5adbdae 100644
--- a/pkg/compiler/lib/src/script.dart
+++ b/pkg/compiler/lib/src/script.dart
@@ -9,18 +9,14 @@
 class Script {
   final SourceFile file;
 
-  /**
-   * The readable URI from which this script was loaded.
-   *
-   * See [LibraryLoader] for terminology on URIs.
-   */
+  /// The readable URI from which this script was loaded.
+  ///
+  /// See [LibraryLoader] for terminology on URIs.
   final Uri readableUri;
 
-  /**
-   * The resource URI from which this script was loaded.
-   *
-   * See [LibraryLoader] for terminology on URIs.
-   */
+  /// The resource URI from which this script was loaded.
+  ///
+  /// See [LibraryLoader] for terminology on URIs.
   final Uri resourceUri;
 
   /// This script was synthesized.
diff --git a/pkg/compiler/lib/src/serialization/abstract_sink.dart b/pkg/compiler/lib/src/serialization/abstract_sink.dart
index b63b9a2..07116be 100644
--- a/pkg/compiler/lib/src/serialization/abstract_sink.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_sink.dart
@@ -17,6 +17,9 @@
   /// Visitor used for serializing [DartType]s.
   DartTypeWriter _dartTypeWriter;
 
+  /// Visitor used for serializing [ir.DartType]s.
+  DartTypeNodeWriter _dartTypeNodeWriter;
+
   /// Stack of tags used when [useDataKinds] is `true` to help debugging section
   /// inconsistencies between serialization and deserialization.
   List<String> _tags;
@@ -24,8 +27,20 @@
   /// Map of [_MemberData] object for serialized kernel member nodes.
   Map<ir.Member, _MemberData> _memberData = {};
 
+  IndexedSink<String> _stringIndex;
+  IndexedSink<Uri> _uriIndex;
+  IndexedSink<ir.Member> _memberNodeIndex;
+  IndexedSink<ImportEntity> _importIndex;
+
+  Map<Type, IndexedSink> _generalCaches = {};
+
   AbstractDataSink({this.useDataKinds: false}) {
     _dartTypeWriter = new DartTypeWriter(this);
+    _dartTypeNodeWriter = new DartTypeNodeWriter(this);
+    _stringIndex = new IndexedSink<String>(this);
+    _uriIndex = new IndexedSink<Uri>(this);
+    _memberNodeIndex = new IndexedSink<ir.Member>(this);
+    _importIndex = new IndexedSink<ImportEntity>(this);
   }
 
   void begin(String tag) {
@@ -47,11 +62,17 @@
   }
 
   @override
+  void writeCached<E>(E value, void f(E value)) {
+    IndexedSink sink = _generalCaches[E] ??= new IndexedSink<E>(this);
+    sink.write(value, (v) => f(v));
+  }
+
+  @override
   void writeSourceSpan(SourceSpan value) {
     _writeDataKind(DataKind.sourceSpan);
     _writeUri(value.uri);
-    _writeInt(value.begin);
-    _writeInt(value.end);
+    _writeIntInternal(value.begin);
+    _writeIntInternal(value.end);
   }
 
   @override
@@ -74,19 +95,42 @@
   }
 
   @override
+  void writeDartTypeNode(ir.DartType value, {bool allowNull: false}) {
+    _writeDataKind(DataKind.dartTypeNode);
+    _writeDartTypeNode(value, [], allowNull: allowNull);
+  }
+
+  void _writeDartTypeNode(
+      ir.DartType value, List<ir.TypeParameter> functionTypeVariables,
+      {bool allowNull: false}) {
+    if (value == null) {
+      if (!allowNull) {
+        throw new UnsupportedError("Missing ir.DartType node is not allowed.");
+      }
+      writeEnum(DartTypeNodeKind.none);
+    } else {
+      value.accept1(_dartTypeNodeWriter, functionTypeVariables);
+    }
+  }
+
+  @override
   void writeMemberNode(ir.Member value) {
     _writeDataKind(DataKind.memberNode);
     _writeMemberNode(value);
   }
 
   void _writeMemberNode(ir.Member value) {
+    _memberNodeIndex.write(value, _writeMemberNodeInternal);
+  }
+
+  void _writeMemberNodeInternal(ir.Member value) {
     ir.Class cls = value.enclosingClass;
     if (cls != null) {
-      _writeEnum(MemberContextKind.cls);
+      _writeEnumInternal(MemberContextKind.cls);
       _writeClassNode(cls);
       _writeString(_computeMemberName(value));
     } else {
-      _writeEnum(MemberContextKind.library);
+      _writeEnumInternal(MemberContextKind.library);
       _writeLibraryNode(value.enclosingLibrary);
       _writeString(_computeMemberName(value));
     }
@@ -104,6 +148,17 @@
   }
 
   @override
+  void writeTypedefNode(ir.Typedef value) {
+    _writeDataKind(DataKind.typedefNode);
+    _writeTypedefNode(value);
+  }
+
+  void _writeTypedefNode(ir.Typedef value) {
+    _writeLibraryNode(value.enclosingLibrary);
+    _writeString(value.name);
+  }
+
+  @override
   void writeLibraryNode(ir.Library value) {
     _writeDataKind(DataKind.libraryNode);
     _writeLibraryNode(value);
@@ -116,14 +171,18 @@
   @override
   void writeEnum(dynamic value) {
     _writeDataKind(DataKind.enumValue);
-    _writeEnum(value);
+    _writeEnumInternal(value);
   }
 
   @override
   void writeBool(bool value) {
     assert(value != null);
     _writeDataKind(DataKind.bool);
-    _writeInt(value ? 1 : 0);
+    _writeBool(value);
+  }
+
+  void _writeBool(bool value) {
+    _writeIntInternal(value ? 1 : 0);
   }
 
   @override
@@ -145,7 +204,7 @@
     assert(value != null);
     assert(value >= 0 && value >> 30 == 0);
     _writeDataKind(DataKind.int);
-    _writeInt(value);
+    _writeIntInternal(value);
   }
 
   void writeTreeNode(ir.TreeNode value) {
@@ -155,23 +214,23 @@
 
   void _writeTreeNode(ir.TreeNode value) {
     if (value is ir.Class) {
-      _writeEnum(_TreeNodeKind.cls);
+      _writeEnumInternal(_TreeNodeKind.cls);
       _writeClassNode(value);
     } else if (value is ir.Member) {
-      _writeEnum(_TreeNodeKind.member);
+      _writeEnumInternal(_TreeNodeKind.member);
       _writeMemberNode(value);
     } else if (value is ir.VariableDeclaration &&
         value.parent is ir.FunctionDeclaration) {
-      _writeEnum(_TreeNodeKind.functionDeclarationVariable);
+      _writeEnumInternal(_TreeNodeKind.functionDeclarationVariable);
       _writeTreeNode(value.parent);
     } else if (value is ir.FunctionNode) {
-      _writeEnum(_TreeNodeKind.functionNode);
+      _writeEnumInternal(_TreeNodeKind.functionNode);
       _writeFunctionNode(value);
     } else if (value is ir.TypeParameter) {
-      _writeEnum(_TreeNodeKind.typeParameter);
+      _writeEnumInternal(_TreeNodeKind.typeParameter);
       _writeTypeParameter(value);
     } else {
-      _writeEnum(_TreeNodeKind.node);
+      _writeEnumInternal(_TreeNodeKind.node);
       ir.TreeNode member = value;
       while (member is! ir.Member) {
         if (member == null) {
@@ -183,24 +242,25 @@
       _writeMemberNode(member);
       _MemberData memberData = _memberData[member] ??= new _MemberData(member);
       int index = memberData.getIndexByTreeNode(value);
-      assert(index != null, "No index found for ${value.runtimeType}.");
-      _writeInt(index);
+      assert(
+          index != null, "No TreeNode index found for ${value.runtimeType}.");
+      _writeIntInternal(index);
     }
   }
 
   void _writeFunctionNode(ir.FunctionNode value) {
     ir.TreeNode parent = value.parent;
     if (parent is ir.Procedure) {
-      _writeEnum(_FunctionNodeKind.procedure);
+      _writeEnumInternal(_FunctionNodeKind.procedure);
       _writeMemberNode(parent);
     } else if (parent is ir.Constructor) {
-      _writeEnum(_FunctionNodeKind.constructor);
+      _writeEnumInternal(_FunctionNodeKind.constructor);
       _writeMemberNode(parent);
     } else if (parent is ir.FunctionExpression) {
-      _writeEnum(_FunctionNodeKind.functionExpression);
+      _writeEnumInternal(_FunctionNodeKind.functionExpression);
       _writeTreeNode(parent);
     } else if (parent is ir.FunctionDeclaration) {
-      _writeEnum(_FunctionNodeKind.functionDeclaration);
+      _writeEnumInternal(_FunctionNodeKind.functionDeclaration);
       _writeTreeNode(parent);
     } else {
       throw new UnsupportedError(
@@ -217,13 +277,13 @@
   void _writeTypeParameter(ir.TypeParameter value) {
     ir.TreeNode parent = value.parent;
     if (parent is ir.Class) {
-      _writeEnum(_TypeParameterKind.cls);
+      _writeEnumInternal(_TypeParameterKind.cls);
       _writeClassNode(parent);
-      _writeInt(parent.typeParameters.indexOf(value));
+      _writeIntInternal(parent.typeParameters.indexOf(value));
     } else if (parent is ir.FunctionNode) {
-      _writeEnum(_TypeParameterKind.functionNode);
+      _writeEnumInternal(_TypeParameterKind.functionNode);
       _writeFunctionNode(parent);
-      _writeInt(parent.typeParameters.indexOf(value));
+      _writeIntInternal(parent.typeParameters.indexOf(value));
     } else {
       throw new UnsupportedError(
           "Unsupported TypeParameter parent ${parent.runtimeType}");
@@ -231,7 +291,7 @@
   }
 
   void _writeDataKind(DataKind kind) {
-    if (useDataKinds) _writeEnum(kind);
+    if (useDataKinds) _writeEnumInternal(kind);
   }
 
   void writeLibrary(IndexedLibrary value) {
@@ -279,7 +339,7 @@
   }
 
   void _writeConstant(ConstantValue value) {
-    _writeEnum(value.kind);
+    _writeEnumInternal(value.kind);
     switch (value.kind) {
       case ConstantValueKind.BOOL:
         BoolConstantValue constant = value;
@@ -304,13 +364,75 @@
         break;
       case ConstantValueKind.NULL:
         break;
-      default:
-        // TODO(johnniwinther): Support remaining constant values.
+      case ConstantValueKind.FUNCTION:
+        FunctionConstantValue constant = value;
+        IndexedFunction function = constant.element;
+        writeMember(function);
+        writeDartType(constant.type);
+        break;
+      case ConstantValueKind.LIST:
+        ListConstantValue constant = value;
+        writeDartType(constant.type);
+        writeConstants(constant.entries);
+        break;
+      case ConstantValueKind.MAP:
+        MapConstantValue constant = value;
+        writeDartType(constant.type);
+        writeConstants(constant.keys);
+        writeConstants(constant.values);
+        break;
+      case ConstantValueKind.CONSTRUCTED:
+        ConstructedConstantValue constant = value;
+        writeDartType(constant.type);
+        writeMemberMap(constant.fields, writeConstant);
+        break;
+      case ConstantValueKind.TYPE:
+        TypeConstantValue constant = value;
+        writeDartType(constant.representedType);
+        writeDartType(constant.type);
+        break;
+      case ConstantValueKind.INSTANTIATION:
+        InstantiationConstantValue constant = value;
+        writeDartTypes(constant.typeArguments);
+        writeConstant(constant.function);
+        break;
+      case ConstantValueKind.NON_CONSTANT:
+        break;
+      case ConstantValueKind.DEFERRED_GLOBAL:
+      case ConstantValueKind.INTERCEPTOR:
+      case ConstantValueKind.SYNTHETIC:
+        // These are only created in the SSA graph builder.
         throw new UnsupportedError(
-            "Unexpected constant value kind ${value.kind}.");
+            "Unsupported constant value kind ${value.kind}.");
     }
   }
 
+  void _writeString(String value) {
+    _stringIndex.write(value, _writeStringInternal);
+  }
+
+  void _writeUri(Uri value) {
+    _uriIndex.write(value, _writeUriInternal);
+  }
+
+  @override
+  void writeImport(ImportEntity value) {
+    _writeDataKind(DataKind.import);
+    _writeImport(value);
+  }
+
+  void _writeImport(ImportEntity value) {
+    _importIndex.write(value, _writeImportInternal);
+  }
+
+  void _writeImportInternal(ImportEntity value) {
+    // TODO(johnniwinther): Do we need to serialize non-deferred imports?
+    writeStringOrNull(value.name);
+    _writeUri(value.uri);
+    _writeUri(value.enclosingLibraryUri);
+    _writeBool(value.isDeferred);
+  }
+
   /// Actual serialization of a section begin tag, implemented by subclasses.
   void _begin(String tag);
 
@@ -318,15 +440,15 @@
   void _end(String tag);
 
   /// Actual serialization of a URI value, implemented by subclasses.
-  void _writeUri(Uri value);
+  void _writeUriInternal(Uri value);
 
   /// Actual serialization of a String value, implemented by subclasses.
-  void _writeString(String value);
+  void _writeStringInternal(String value);
 
   /// Actual serialization of a non-negative integer value, implemented by
   /// subclasses.
-  void _writeInt(int value);
+  void _writeIntInternal(int value);
 
   /// Actual serialization of an enum value, implemented by subclasses.
-  void _writeEnum(dynamic value);
+  void _writeEnumInternal(dynamic value);
 }
diff --git a/pkg/compiler/lib/src/serialization/abstract_source.dart b/pkg/compiler/lib/src/serialization/abstract_source.dart
index f258917..28fdf8a 100644
--- a/pkg/compiler/lib/src/serialization/abstract_source.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_source.dart
@@ -13,7 +13,19 @@
   EntityLookup _entityLookup;
   LocalLookup _localLookup;
 
-  AbstractDataSource({this.useDataKinds: false});
+  IndexedSource<String> _stringIndex;
+  IndexedSource<Uri> _uriIndex;
+  IndexedSource<_MemberData> _memberNodeIndex;
+  IndexedSource<ImportEntity> _importIndex;
+
+  Map<Type, IndexedSource> _generalCaches = {};
+
+  AbstractDataSource({this.useDataKinds: false}) {
+    _stringIndex = new IndexedSource<String>(this);
+    _uriIndex = new IndexedSource<Uri>(this);
+    _memberNodeIndex = new IndexedSource<_MemberData>(this);
+    _importIndex = new IndexedSource<ImportEntity>(this);
+  }
 
   void begin(String tag) {
     if (useDataKinds) _begin(tag);
@@ -53,6 +65,12 @@
     return _localLookup;
   }
 
+  @override
+  E readCached<E>(E f()) {
+    IndexedSource source = _generalCaches[E] ??= new IndexedSource<E>(this);
+    return source.read(f);
+  }
+
   IndexedLibrary readLibrary() {
     return getIndexedLibrary(readInt());
   }
@@ -94,12 +112,22 @@
     return types;
   }
 
+  List<ir.DartType> _readDartTypeNodes(
+      List<ir.TypeParameter> functionTypeVariables) {
+    int count = readInt();
+    List<ir.DartType> types = new List<ir.DartType>(count);
+    for (int index = 0; index < count; index++) {
+      types[index] = _readDartTypeNode(functionTypeVariables);
+    }
+    return types;
+  }
+
   @override
   SourceSpan readSourceSpan() {
     _checkDataKind(DataKind.sourceSpan);
     Uri uri = _readUri();
-    int begin = _readInt();
-    int end = _readInt();
+    int begin = _readIntInternal();
+    int end = _readIntInternal();
     return new SourceSpan(uri, begin, end);
   }
 
@@ -172,8 +200,105 @@
     throw new UnsupportedError("Unexpected DartTypeKind $kind");
   }
 
+  @override
+  ir.DartType readDartTypeNode({bool allowNull: false}) {
+    _checkDataKind(DataKind.dartTypeNode);
+    ir.DartType type = _readDartTypeNode([]);
+    assert(type != null || allowNull);
+    return type;
+  }
+
+  ir.DartType _readDartTypeNode(List<ir.TypeParameter> functionTypeVariables) {
+    DartTypeNodeKind kind = readEnum(DartTypeNodeKind.values);
+    switch (kind) {
+      case DartTypeNodeKind.none:
+        return null;
+      case DartTypeNodeKind.voidType:
+        return const ir.VoidType();
+      case DartTypeNodeKind.invalidType:
+        return const ir.InvalidType();
+      case DartTypeNodeKind.bottomType:
+        return const ir.BottomType();
+      case DartTypeNodeKind.doesNotComplete:
+        return const DoesNotCompleteType();
+      case DartTypeNodeKind.typeParameterType:
+        ir.TypeParameter typeParameter = readTypeParameterNode();
+        ir.DartType promotedBound = _readDartTypeNode(functionTypeVariables);
+        return new ir.TypeParameterType(typeParameter, promotedBound);
+      case DartTypeNodeKind.functionTypeVariable:
+        int index = readInt();
+        assert(0 <= index && index < functionTypeVariables.length);
+        ir.DartType promotedBound = _readDartTypeNode(functionTypeVariables);
+        return new ir.TypeParameterType(
+            functionTypeVariables[index], promotedBound);
+      case DartTypeNodeKind.functionType:
+        begin(functionTypeNodeTag);
+        int typeParameterCount = readInt();
+        List<ir.TypeParameter> typeParameters =
+            new List<ir.TypeParameter>.generate(
+                typeParameterCount, (int index) => new ir.TypeParameter());
+        functionTypeVariables =
+            new List<ir.TypeParameter>.from(functionTypeVariables)
+              ..addAll(typeParameters);
+        for (int index = 0; index < typeParameterCount; index++) {
+          typeParameters[index].name = readString();
+          typeParameters[index].bound =
+              _readDartTypeNode(functionTypeVariables);
+          typeParameters[index].defaultType =
+              _readDartTypeNode(functionTypeVariables);
+        }
+        ir.DartType returnType = _readDartTypeNode(functionTypeVariables);
+        int requiredParameterCount = readInt();
+        List<ir.DartType> positionalParameters =
+            _readDartTypeNodes(functionTypeVariables);
+        int namedParameterCount = readInt();
+        List<ir.NamedType> namedParameters =
+            new List<ir.NamedType>(namedParameterCount);
+        for (int index = 0; index < namedParameterCount; index++) {
+          String name = readString();
+          ir.DartType type = _readDartTypeNode(functionTypeVariables);
+          namedParameters[index] = new ir.NamedType(name, type);
+        }
+        ir.TypedefType typedefType = _readDartTypeNode(functionTypeVariables);
+        end(functionTypeNodeTag);
+        return new ir.FunctionType(positionalParameters, returnType,
+            namedParameters: namedParameters,
+            typeParameters: typeParameters,
+            requiredParameterCount: requiredParameterCount,
+            typedefType: typedefType);
+
+      case DartTypeNodeKind.interfaceType:
+        ir.Class cls = readClassNode();
+        List<ir.DartType> typeArguments =
+            _readDartTypeNodes(functionTypeVariables);
+        return new ir.InterfaceType(cls, typeArguments);
+      case DartTypeNodeKind.thisInterfaceType:
+        ir.Class cls = readClassNode();
+        List<ir.DartType> typeArguments =
+            _readDartTypeNodes(functionTypeVariables);
+        return new ThisInterfaceType(cls, typeArguments);
+      case DartTypeNodeKind.exactInterfaceType:
+        ir.Class cls = readClassNode();
+        List<ir.DartType> typeArguments =
+            _readDartTypeNodes(functionTypeVariables);
+        return new ExactInterfaceType(cls, typeArguments);
+      case DartTypeNodeKind.typedef:
+        ir.Typedef typedef = readTypedefNode();
+        List<ir.DartType> typeArguments =
+            _readDartTypeNodes(functionTypeVariables);
+        return new ir.TypedefType(typedef, typeArguments);
+      case DartTypeNodeKind.dynamicType:
+        return const ir.DynamicType();
+    }
+    throw new UnsupportedError("Unexpected DartTypeKind $kind");
+  }
+
   _MemberData _readMemberData() {
-    MemberContextKind kind = _readEnum(MemberContextKind.values);
+    return _memberNodeIndex.read(_readMemberDataInternal);
+  }
+
+  _MemberData _readMemberDataInternal() {
+    MemberContextKind kind = _readEnumInternal(MemberContextKind.values);
     switch (kind) {
       case MemberContextKind.cls:
         _ClassData cls = _readClassData();
@@ -205,6 +330,18 @@
     return _readClassData().node;
   }
 
+  ir.Typedef _readTypedefNode() {
+    _LibraryData library = _readLibraryData();
+    String name = _readString();
+    return library.lookupTypedef(name);
+  }
+
+  @override
+  ir.Typedef readTypedefNode() {
+    _checkDataKind(DataKind.typedefNode);
+    return _readTypedefNode();
+  }
+
   _LibraryData _readLibraryData() {
     Uri canonicalUri = _readUri();
     return componentLookup.getLibraryDataByUri(canonicalUri);
@@ -219,7 +356,7 @@
   @override
   E readEnum<E>(List<E> values) {
     _checkDataKind(DataKind.enumValue);
-    return _readEnum(values);
+    return _readEnumInternal(values);
   }
 
   @override
@@ -228,10 +365,18 @@
     return _readUri();
   }
 
+  Uri _readUri() {
+    return _uriIndex.read(_readUriInternal);
+  }
+
   @override
   bool readBool() {
     _checkDataKind(DataKind.bool);
-    int value = _readInt();
+    return _readBool();
+  }
+
+  bool _readBool() {
+    int value = _readIntInternal();
     assert(value == 0 || value == 1);
     return value == 1;
   }
@@ -242,10 +387,14 @@
     return _readString();
   }
 
+  String _readString() {
+    return _stringIndex.read(_readStringInternal);
+  }
+
   @override
   int readInt() {
     _checkDataKind(DataKind.int);
-    return _readInt();
+    return _readIntInternal();
   }
 
   @override
@@ -261,17 +410,14 @@
   }
 
   ConstantValue _readConstant() {
-    ConstantValueKind kind = _readEnum(ConstantValueKind.values);
-    ConstantValue constant;
+    ConstantValueKind kind = _readEnumInternal(ConstantValueKind.values);
     switch (kind) {
       case ConstantValueKind.BOOL:
         bool value = readBool();
-        constant = new BoolConstantValue(value);
-        break;
+        return new BoolConstantValue(value);
       case ConstantValueKind.INT:
         BigInt value = BigInt.parse(readString());
-        constant = new IntConstantValue(value);
-        break;
+        return new IntConstantValue(value);
       case ConstantValueKind.DOUBLE:
         ByteData data = new ByteData(8);
         data.setUint16(0, readInt());
@@ -279,24 +425,51 @@
         data.setUint16(4, readInt());
         data.setUint16(6, readInt());
         double value = data.getFloat64(0);
-        constant = new DoubleConstantValue(value);
-        break;
+        return new DoubleConstantValue(value);
       case ConstantValueKind.STRING:
         String value = readString();
-        constant = new StringConstantValue(value);
-        break;
+        return new StringConstantValue(value);
       case ConstantValueKind.NULL:
-        constant = const NullConstantValue();
-        break;
-      default:
-        // TODO(johnniwinther): Support remaining constant values.
-        throw new UnsupportedError("Unexpected constant value kind ${kind}.");
+        return const NullConstantValue();
+      case ConstantValueKind.FUNCTION:
+        IndexedFunction function = readMember();
+        DartType type = readDartType();
+        return new FunctionConstantValue(function, type);
+      case ConstantValueKind.LIST:
+        DartType type = readDartType();
+        List<ConstantValue> entries = readConstants();
+        return new ListConstantValue(type, entries);
+      case ConstantValueKind.MAP:
+        DartType type = readDartType();
+        List<ConstantValue> keys = readConstants();
+        List<ConstantValue> values = readConstants();
+        return new MapConstantValue(type, keys, values);
+      case ConstantValueKind.CONSTRUCTED:
+        InterfaceType type = readDartType();
+        Map<FieldEntity, ConstantValue> fields =
+            readMemberMap<FieldEntity, ConstantValue>(() => readConstant());
+        return new ConstructedConstantValue(type, fields);
+      case ConstantValueKind.TYPE:
+        DartType representedType = readDartType();
+        DartType type = readDartType();
+        return new TypeConstantValue(representedType, type);
+      case ConstantValueKind.INSTANTIATION:
+        List<DartType> typeArguments = readDartTypes();
+        ConstantValue function = readConstant();
+        return new InstantiationConstantValue(typeArguments, function);
+      case ConstantValueKind.NON_CONSTANT:
+        return new NonConstantValue();
+      case ConstantValueKind.DEFERRED_GLOBAL:
+      case ConstantValueKind.INTERCEPTOR:
+      case ConstantValueKind.SYNTHETIC:
+        // These are only created in the SSA graph builder.
+        throw new UnsupportedError("Unsupported constant value kind ${kind}.");
     }
-    return constant;
+    throw new UnsupportedError("Unexpexted constant value kind ${kind}.");
   }
 
   ir.TreeNode _readTreeNode() {
-    _TreeNodeKind kind = _readEnum(_TreeNodeKind.values);
+    _TreeNodeKind kind = _readEnumInternal(_TreeNodeKind.values);
     switch (kind) {
       case _TreeNodeKind.cls:
         return _readClassData().node;
@@ -311,7 +484,7 @@
         return _readTypeParameter();
       case _TreeNodeKind.node:
         _MemberData data = _readMemberData();
-        int index = _readInt();
+        int index = _readIntInternal();
         ir.TreeNode treeNode = data.getTreeNodeByIndex(index);
         assert(treeNode != null,
             "No TreeNode found for index $index in ${data.node}.$_errorContext");
@@ -321,7 +494,7 @@
   }
 
   ir.FunctionNode _readFunctionNode() {
-    _FunctionNodeKind kind = _readEnum(_FunctionNodeKind.values);
+    _FunctionNodeKind kind = _readEnumInternal(_FunctionNodeKind.values);
     switch (kind) {
       case _FunctionNodeKind.procedure:
         ir.Procedure procedure = _readMemberData().node;
@@ -346,21 +519,21 @@
   }
 
   ir.TypeParameter _readTypeParameter() {
-    _TypeParameterKind kind = _readEnum(_TypeParameterKind.values);
+    _TypeParameterKind kind = _readEnumInternal(_TypeParameterKind.values);
     switch (kind) {
       case _TypeParameterKind.cls:
         ir.Class cls = _readClassData().node;
-        return cls.typeParameters[_readInt()];
+        return cls.typeParameters[_readIntInternal()];
       case _TypeParameterKind.functionNode:
         ir.FunctionNode functionNode = _readFunctionNode();
-        return functionNode.typeParameters[_readInt()];
+        return functionNode.typeParameters[_readIntInternal()];
     }
     throw new UnsupportedError("Unexpected _TypeParameterKind kind $kind");
   }
 
   void _checkDataKind(DataKind expectedKind) {
     if (!useDataKinds) return;
-    DataKind actualKind = _readEnum(DataKind.values);
+    DataKind actualKind = _readEnumInternal(DataKind.values);
     assert(
         actualKind == expectedKind,
         "Invalid data kind. "
@@ -391,6 +564,24 @@
     throw new UnsupportedError("Unexpected local kind $kind");
   }
 
+  @override
+  ImportEntity readImport() {
+    _checkDataKind(DataKind.import);
+    return _readImport();
+  }
+
+  ImportEntity _readImport() {
+    return _importIndex.read(_readImportInternal);
+  }
+
+  ImportEntity _readImportInternal() {
+    String name = readStringOrNull();
+    Uri uri = _readUri();
+    Uri enclosingLibraryUri = _readUri();
+    bool isDeferred = _readBool();
+    return new ImportEntity(isDeferred, name, uri, enclosingLibraryUri);
+  }
+
   /// Actual deserialization of a section begin tag, implemented by subclasses.
   void _begin(String tag);
 
@@ -398,18 +589,18 @@
   void _end(String tag);
 
   /// Actual deserialization of a string value, implemented by subclasses.
-  String _readString();
+  String _readStringInternal();
 
   /// Actual deserialization of a non-negative integer value, implemented by
   /// subclasses.
-  int _readInt();
+  int _readIntInternal();
 
   /// Actual deserialization of a URI value, implemented by subclasses.
-  Uri _readUri();
+  Uri _readUriInternal();
 
   /// Actual deserialization of an enum value in [values], implemented by
   /// subclasses.
-  E _readEnum<E>(List<E> values);
+  E _readEnumInternal<E>(List<E> values);
 
   /// Returns a string representation of the current state of the data source
   /// useful for debugging in consistencies between serialization and
diff --git a/pkg/compiler/lib/src/serialization/binary_sink.dart b/pkg/compiler/lib/src/serialization/binary_sink.dart
index e7c2114..ae11f9b 100644
--- a/pkg/compiler/lib/src/serialization/binary_sink.dart
+++ b/pkg/compiler/lib/src/serialization/binary_sink.dart
@@ -10,6 +10,7 @@
 class BinarySink extends AbstractDataSink {
   final Sink<List<int>> sink;
   BufferedSink _bufferedSink;
+  int _length = 0;
 
   BinarySink(this.sink, {bool useDataKinds: false})
       : _bufferedSink = new BufferedSink(sink),
@@ -23,33 +24,37 @@
   }
 
   @override
-  void _writeUri(Uri value) {
+  void _writeUriInternal(Uri value) {
     _writeString(value.toString());
   }
 
   @override
-  void _writeString(String value) {
+  void _writeStringInternal(String value) {
     List<int> bytes = utf8.encode(value);
-    _writeInt(bytes.length);
+    _writeIntInternal(bytes.length);
     _bufferedSink.addBytes(bytes);
+    _length += bytes.length;
   }
 
   @override
-  void _writeInt(int value) {
+  void _writeIntInternal(int value) {
     assert(value >= 0 && value >> 30 == 0);
     if (value < 0x80) {
       _bufferedSink.addByte(value);
+      _length += 1;
     } else if (value < 0x4000) {
       _bufferedSink.addByte2((value >> 8) | 0x80, value & 0xFF);
+      _length += 2;
     } else {
       _bufferedSink.addByte4((value >> 24) | 0xC0, (value >> 16) & 0xFF,
           (value >> 8) & 0xFF, value & 0xFF);
+      _length += 4;
     }
   }
 
   @override
-  void _writeEnum(dynamic value) {
-    _writeInt(value.index);
+  void _writeEnumInternal(dynamic value) {
+    _writeIntInternal(value.index);
   }
 
   void close() {
@@ -57,4 +62,7 @@
     _bufferedSink = null;
     sink.close();
   }
+
+  /// Returns the number of bytes written to this data sink.
+  int get length => _length;
 }
diff --git a/pkg/compiler/lib/src/serialization/binary_source.dart b/pkg/compiler/lib/src/serialization/binary_source.dart
index 0836209..c68e4c9 100644
--- a/pkg/compiler/lib/src/serialization/binary_source.dart
+++ b/pkg/compiler/lib/src/serialization/binary_source.dart
@@ -20,8 +20,8 @@
   int _readByte() => _bytes[_byteOffset++];
 
   @override
-  String _readString() {
-    int length = _readInt();
+  String _readStringInternal() {
+    int length = _readIntInternal();
     List<int> bytes = new Uint8List(length);
     bytes.setRange(0, bytes.length, _bytes, _byteOffset);
     _byteOffset += bytes.length;
@@ -29,7 +29,7 @@
   }
 
   @override
-  int _readInt() {
+  int _readIntInternal() {
     var byte = _readByte();
     if (byte & 0x80 == 0) {
       // 0xxxxxxx
@@ -47,14 +47,14 @@
   }
 
   @override
-  Uri _readUri() {
+  Uri _readUriInternal() {
     String text = _readString();
     return Uri.parse(text);
   }
 
   @override
-  E _readEnum<E>(List<E> values) {
-    int index = _readInt();
+  E _readEnumInternal<E>(List<E> values) {
+    int index = _readIntInternal();
     assert(
         0 <= index && index < values.length,
         "Invalid data kind index. "
diff --git a/pkg/compiler/lib/src/serialization/helpers.dart b/pkg/compiler/lib/src/serialization/helpers.dart
index 14446a1..a75b7e3 100644
--- a/pkg/compiler/lib/src/serialization/helpers.dart
+++ b/pkg/compiler/lib/src/serialization/helpers.dart
@@ -16,12 +16,15 @@
   uri,
   libraryNode,
   classNode,
+  typedefNode,
   memberNode,
   treeNode,
   typeParameterNode,
   dartType,
+  dartTypeNode,
   sourceSpan,
   constant,
+  import,
 }
 
 /// Enum used for identifying the enclosing entity of a member in serialization.
@@ -87,7 +90,7 @@
   interfaceType,
   typedef,
   dynamicType,
-  futureOr
+  futureOr,
 }
 
 /// Visitor that serializes [DartType] object together with [AbstractDataSink].
@@ -123,10 +126,14 @@
 
   void visitFunctionTypeVariable(covariant FunctionTypeVariable type,
       List<FunctionTypeVariable> functionTypeVariables) {
-    _sink.writeEnum(DartTypeKind.functionTypeVariable);
     int index = functionTypeVariables.indexOf(type);
-    assert(index != -1);
-    _sink.writeInt(index);
+    if (index == -1) {
+      // TODO(johnniwinther): Avoid free variables.
+      _sink._writeDartType(const DynamicType(), functionTypeVariables);
+    } else {
+      _sink.writeEnum(DartTypeKind.functionTypeVariable);
+      _sink.writeInt(index);
+    }
   }
 
   void visitFunctionType(covariant FunctionType type,
@@ -174,3 +181,176 @@
     _sink._writeDartType(type.typeArgument, functionTypeVariables);
   }
 }
+
+/// Enum used for identifying [ir.DartType] subclasses in serialization.
+enum DartTypeNodeKind {
+  none,
+  voidType,
+  typeParameterType,
+  functionType,
+  functionTypeVariable,
+  interfaceType,
+  typedef,
+  dynamicType,
+  bottomType,
+  invalidType,
+  thisInterfaceType,
+  exactInterfaceType,
+  doesNotComplete,
+}
+
+const String functionTypeNodeTag = 'function-type-node';
+
+class DartTypeNodeWriter
+    extends ir.DartTypeVisitor1<void, List<ir.TypeParameter>> {
+  final AbstractDataSink _sink;
+
+  DartTypeNodeWriter(this._sink);
+
+  void visitTypes(
+      List<ir.DartType> types, List<ir.TypeParameter> functionTypeVariables) {
+    _sink.writeInt(types.length);
+    for (ir.DartType type in types) {
+      _sink._writeDartTypeNode(type, functionTypeVariables);
+    }
+  }
+
+  void defaultDartType(
+      ir.DartType node, List<ir.TypeParameter> functionTypeVariables) {
+    throw new UnsupportedError(
+        "Unexpected ir.DartType $node (${node.runtimeType}).");
+  }
+
+  void visitInvalidType(
+      ir.InvalidType node, List<ir.TypeParameter> functionTypeVariables) {
+    _sink.writeEnum(DartTypeNodeKind.invalidType);
+  }
+
+  void visitDynamicType(
+      ir.DynamicType node, List<ir.TypeParameter> functionTypeVariables) {
+    _sink.writeEnum(DartTypeNodeKind.dynamicType);
+  }
+
+  void visitVoidType(
+      ir.VoidType node, List<ir.TypeParameter> functionTypeVariables) {
+    _sink.writeEnum(DartTypeNodeKind.voidType);
+  }
+
+  void visitBottomType(
+      ir.BottomType node, List<ir.TypeParameter> functionTypeVariables) {
+    if (node == const DoesNotCompleteType()) {
+      _sink.writeEnum(DartTypeNodeKind.doesNotComplete);
+    } else {
+      _sink.writeEnum(DartTypeNodeKind.bottomType);
+    }
+  }
+
+  void visitInterfaceType(
+      ir.InterfaceType node, List<ir.TypeParameter> functionTypeVariables) {
+    if (node is ThisInterfaceType) {
+      _sink.writeEnum(DartTypeNodeKind.thisInterfaceType);
+    } else if (node is ExactInterfaceType) {
+      _sink.writeEnum(DartTypeNodeKind.exactInterfaceType);
+    } else {
+      _sink.writeEnum(DartTypeNodeKind.interfaceType);
+    }
+    _sink.writeClassNode(node.classNode);
+    visitTypes(node.typeArguments, functionTypeVariables);
+  }
+
+  void visitFunctionType(
+      ir.FunctionType node, List<ir.TypeParameter> functionTypeVariables) {
+    _sink.writeEnum(DartTypeNodeKind.functionType);
+    _sink.begin(functionTypeNodeTag);
+    functionTypeVariables =
+        new List<ir.TypeParameter>.from(functionTypeVariables)
+          ..addAll(node.typeParameters);
+    _sink.writeInt(node.typeParameters.length);
+    for (ir.TypeParameter parameter in node.typeParameters) {
+      _sink.writeString(parameter.name);
+      _sink._writeDartTypeNode(parameter.bound, functionTypeVariables);
+      _sink._writeDartTypeNode(parameter.defaultType, functionTypeVariables);
+    }
+    _sink._writeDartTypeNode(node.returnType, functionTypeVariables);
+    _sink.writeInt(node.requiredParameterCount);
+    visitTypes(node.positionalParameters, functionTypeVariables);
+    _sink.writeInt(node.namedParameters.length);
+    for (ir.NamedType parameter in node.namedParameters) {
+      _sink.writeString(parameter.name);
+      _sink._writeDartTypeNode(parameter.type, functionTypeVariables);
+    }
+    _sink._writeDartTypeNode(node.typedefType, functionTypeVariables,
+        allowNull: true);
+    _sink.end(functionTypeNodeTag);
+  }
+
+  void visitTypeParameterType(
+      ir.TypeParameterType node, List<ir.TypeParameter> functionTypeVariables) {
+    int index = functionTypeVariables.indexOf(node.parameter);
+    if (index != -1) {
+      _sink.writeEnum(DartTypeNodeKind.functionTypeVariable);
+      _sink.writeInt(index);
+      _sink._writeDartTypeNode(node.promotedBound, functionTypeVariables,
+          allowNull: true);
+    } else {
+      _sink.writeEnum(DartTypeNodeKind.typeParameterType);
+      _sink.writeTypeParameterNode(node.parameter);
+      _sink._writeDartTypeNode(node.promotedBound, functionTypeVariables,
+          allowNull: true);
+    }
+  }
+
+  void visitTypedefType(
+      ir.TypedefType node, List<ir.TypeParameter> functionTypeVariables) {
+    _sink.writeEnum(DartTypeNodeKind.typedef);
+    _sink.writeTypedefNode(node.typedefNode);
+    visitTypes(node.typeArguments, functionTypeVariables);
+  }
+}
+
+/// Data sink helper that canonicalizes [E] values using indices.
+class IndexedSink<E> {
+  final AbstractDataSink _sink;
+  final Map<E, int> _cache = {};
+
+  IndexedSink(this._sink);
+
+  /// Write a reference to [value] to the data sink.
+  ///
+  /// If [value] has not been canonicalized yet, [writeValue] is called to
+  /// serialize the [value] itself.
+  void write(E value, void writeValue(E value)) {
+    int index = _cache[value];
+    if (index == null) {
+      index = _cache.length;
+      _cache[value] = index;
+      _sink._writeIntInternal(index);
+      writeValue(value);
+    } else {
+      _sink._writeIntInternal(index);
+    }
+  }
+}
+
+/// Data source helper reads canonicalized [E] values through indices.
+class IndexedSource<E> {
+  final AbstractDataSource _source;
+  final List<E> _cache = [];
+
+  IndexedSource(this._source);
+
+  /// Reads a reference to an [E] value from the data source.
+  ///
+  /// If the value hasn't yet been read, [readValue] is called to deserialize
+  /// the value itself.
+  E read(E readValue()) {
+    int index = _source._readIntInternal();
+    if (index >= _cache.length) {
+      E value = readValue();
+      _cache.add(value);
+      return value;
+    } else {
+      return _cache[index];
+    }
+  }
+}
diff --git a/pkg/compiler/lib/src/serialization/member_data.dart b/pkg/compiler/lib/src/serialization/member_data.dart
index 08fa9a3..b4aeee12 100644
--- a/pkg/compiler/lib/src/serialization/member_data.dart
+++ b/pkg/compiler/lib/src/serialization/member_data.dart
@@ -21,7 +21,9 @@
         _libraryMap[library.importUri] = new _LibraryData(library);
       }
     }
-    return _libraryMap[canonicalUri];
+    _LibraryData data = _libraryMap[canonicalUri];
+    assert(data != null, "No library found for $canonicalUri.");
+    return data;
   }
 }
 
@@ -35,8 +37,14 @@
     return null;
   }
   String name = member.name.name;
-  if (member is ir.Procedure && member.kind == ir.ProcedureKind.Setter) {
-    name += "=";
+  if (member is ir.Constructor) {
+    name = '.$name';
+  } else if (member is ir.Procedure) {
+    if (member.kind == ir.ProcedureKind.Factory) {
+      name = '.$name';
+    } else if (member.kind == ir.ProcedureKind.Setter) {
+      name += "=";
+    }
   }
   return name;
 }
@@ -49,6 +57,9 @@
   /// Cache of [_ClassData] for classes in this library.
   Map<String, _ClassData> _classes;
 
+  /// Cache of [ir.Typedef] nodes for typedefs in this library.
+  Map<String, ir.Typedef> _typedefs;
+
   /// Cache of [_MemberData] for members in this library.
   Map<String, _MemberData> _members;
 
@@ -67,6 +78,20 @@
     return _classes[name];
   }
 
+  ir.Typedef lookupTypedef(String name) {
+    if (_typedefs == null) {
+      _typedefs = {};
+      for (ir.Typedef typedef in node.typedefs) {
+        assert(
+            !_typedefs.containsKey(typedef.name),
+            "Duplicate typedef '${typedef.name}' in $_typedefs "
+            "trying to add $typedef.");
+        _typedefs[typedef.name] = typedef;
+      }
+    }
+    return _typedefs[name];
+  }
+
   /// Returns the [_MemberData] for the member uniquely identified by [name] in
   /// this library.
   _MemberData lookupMember(String name) {
diff --git a/pkg/compiler/lib/src/serialization/mixins.dart b/pkg/compiler/lib/src/serialization/mixins.dart
index e5b009f..eb86a2a 100644
--- a/pkg/compiler/lib/src/serialization/mixins.dart
+++ b/pkg/compiler/lib/src/serialization/mixins.dart
@@ -256,6 +256,18 @@
   }
 
   @override
+  List<E> readConstants<E extends ConstantValue>({bool emptyAsNull: false}) {
+    int count = readInt();
+    if (count == 0 && emptyAsNull) return null;
+    List<E> list = new List<E>(count);
+    for (int i = 0; i < count; i++) {
+      ConstantValue value = readConstant();
+      list[i] = value;
+    }
+    return list;
+  }
+
+  @override
   Map<K, V> readConstantMap<K extends ConstantValue, V>(V f(),
       {bool emptyAsNull: false}) {
     int count = readInt();
@@ -277,6 +289,30 @@
     }
     return null;
   }
+
+  @override
+  List<ImportEntity> readImports({bool emptyAsNull: false}) {
+    int count = readInt();
+    if (count == 0 && emptyAsNull) return null;
+    List<ImportEntity> list = new List<ImportEntity>(count);
+    for (int i = 0; i < count; i++) {
+      list[i] = readImport();
+    }
+    return list;
+  }
+
+  @override
+  Map<ImportEntity, V> readImportMap<V>(V f(), {bool emptyAsNull: false}) {
+    int count = readInt();
+    if (count == 0 && emptyAsNull) return null;
+    Map<ImportEntity, V> map = {};
+    for (int i = 0; i < count; i++) {
+      ImportEntity key = readImport();
+      V value = f();
+      map[key] = value;
+    }
+    return map;
+  }
 }
 
 /// Mixin that implements all convenience methods of [DataSink].
@@ -545,6 +581,19 @@
   }
 
   @override
+  void writeConstants(Iterable<ConstantValue> values, {bool allowNull: false}) {
+    if (values == null) {
+      assert(allowNull);
+      writeInt(0);
+    } else {
+      writeInt(values.length);
+      for (ConstantValue value in values) {
+        writeConstant(value);
+      }
+    }
+  }
+
+  @override
   void writeConstantMap<V>(Map<ConstantValue, V> map, void f(V value),
       {bool allowNull: false}) {
     if (map == null) {
@@ -566,4 +615,32 @@
       writeLibrary(value);
     }
   }
+
+  @override
+  void writeImports(Iterable<ImportEntity> values, {bool allowNull: false}) {
+    if (values == null) {
+      assert(allowNull);
+      writeInt(0);
+    } else {
+      writeInt(values.length);
+      for (ImportEntity value in values) {
+        writeImport(value);
+      }
+    }
+  }
+
+  @override
+  void writeImportMap<V>(Map<ImportEntity, V> map, void f(V value),
+      {bool allowNull: false}) {
+    if (map == null) {
+      assert(allowNull);
+      writeInt(0);
+    } else {
+      writeInt(map.length);
+      map.forEach((ImportEntity key, V value) {
+        writeImport(key);
+        f(value);
+      });
+    }
+  }
 }
diff --git a/pkg/compiler/lib/src/serialization/node_indexer.dart b/pkg/compiler/lib/src/serialization/node_indexer.dart
index c9370f1..7087849 100644
--- a/pkg/compiler/lib/src/serialization/node_indexer.dart
+++ b/pkg/compiler/lib/src/serialization/node_indexer.dart
@@ -139,4 +139,52 @@
     registerNode(node);
     super.visitStaticInvocation(node);
   }
+
+  @override
+  void visitLabeledStatement(ir.LabeledStatement node) {
+    registerNode(node);
+    super.visitLabeledStatement(node);
+  }
+
+  @override
+  void visitSwitchCase(ir.SwitchCase node) {
+    registerNode(node);
+    super.visitSwitchCase(node);
+  }
+
+  @override
+  void visitContinueSwitchStatement(ir.ContinueSwitchStatement node) {
+    registerNode(node);
+    super.visitContinueSwitchStatement(node);
+  }
+
+  @override
+  void visitConstructorInvocation(ir.ConstructorInvocation node) {
+    registerNode(node);
+    super.visitConstructorInvocation(node);
+  }
+
+  @override
+  void visitVariableGet(ir.VariableGet node) {
+    registerNode(node);
+    super.visitVariableGet(node);
+  }
+
+  @override
+  void visitInstantiation(ir.Instantiation node) {
+    registerNode(node);
+    super.visitInstantiation(node);
+  }
+
+  @override
+  void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
+    registerNode(node);
+    super.visitSuperMethodInvocation(node);
+  }
+
+  @override
+  void visitSuperPropertyGet(ir.SuperPropertyGet node) {
+    registerNode(node);
+    super.visitSuperPropertyGet(node);
+  }
 }
diff --git a/pkg/compiler/lib/src/serialization/object_sink.dart b/pkg/compiler/lib/src/serialization/object_sink.dart
index 195db2a..3246b9f 100644
--- a/pkg/compiler/lib/src/serialization/object_sink.dart
+++ b/pkg/compiler/lib/src/serialization/object_sink.dart
@@ -23,25 +23,25 @@
   }
 
   @override
-  void _writeEnum(dynamic value) {
+  void _writeEnumInternal(dynamic value) {
     assert(value != null);
     _data.add(value);
   }
 
   @override
-  void _writeInt(int value) {
+  void _writeIntInternal(int value) {
     assert(value != null);
     _data.add(value);
   }
 
   @override
-  void _writeString(String value) {
+  void _writeStringInternal(String value) {
     assert(value != null);
     _data.add(value);
   }
 
   @override
-  void _writeUri(Uri value) {
+  void _writeUriInternal(Uri value) {
     assert(value != null);
     _data.add(value);
   }
@@ -50,4 +50,8 @@
   void close() {
     _data = null;
   }
+
+  /// Returns the number of objects written to this data sink.
+  @override
+  int get length => _data.length;
 }
diff --git a/pkg/compiler/lib/src/serialization/object_source.dart b/pkg/compiler/lib/src/serialization/object_source.dart
index cae965b..4ce571e 100644
--- a/pkg/compiler/lib/src/serialization/object_source.dart
+++ b/pkg/compiler/lib/src/serialization/object_source.dart
@@ -40,16 +40,16 @@
   }
 
   @override
-  String _readString() => _read();
+  String _readStringInternal() => _read();
 
   @override
-  E _readEnum<E>(List<E> values) => _read();
+  E _readEnumInternal<E>(List<E> values) => _read();
 
   @override
-  Uri _readUri() => _read();
+  Uri _readUriInternal() => _read();
 
   @override
-  int _readInt() => _read();
+  int _readIntInternal() => _read();
 
   @override
   String get _errorContext {
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index a5b738a..3348edd 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -6,12 +6,15 @@
 import 'dart:typed_data';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/binary/ast_to_binary.dart';
+import 'package:kernel/binary/ast_from_binary.dart' as ir;
+import 'package:kernel/binary/ast_to_binary.dart' as ir;
 import '../closure.dart';
 import '../constants/values.dart';
 import '../diagnostics/source_span.dart';
 import '../elements/entities.dart';
 import '../elements/indexed.dart';
 import '../elements/types.dart';
+import '../ir/static_type_base.dart';
 import '../js_model/closure.dart';
 import '../js_model/locals.dart';
 
@@ -28,6 +31,11 @@
 
 /// Interface for serialization.
 abstract class DataSink {
+  /// The amount of data written to this data sink.
+  ///
+  /// The units is based on the underlying data structure for this data sink.
+  int get length;
+
   /// Flushes any pending data and closes this data sink.
   ///
   /// The data sink can no longer be written to after closing.
@@ -45,6 +53,10 @@
   /// between serialization and deserialization.
   void end(String tag);
 
+  /// Writes a reference to [value] to this data sink. If [value] has not yet
+  /// been serialized, [f] is called to serialize the value itself.
+  void writeCached<E>(E value, void f(E value));
+
   /// Writes the potentially `null` [value] to this data sink. If [value] is
   /// non-null [f] is called to write the non-null value to the data sink.
   ///
@@ -112,6 +124,9 @@
   /// Writes a reference to the kernel class node [value] to this data sink.
   void writeClassNode(ir.Class value);
 
+  /// Writes a reference to the kernel typedef node [value] to this data sink.
+  void writeTypedefNode(ir.Typedef value);
+
   /// Writes a reference to the kernel member node [value] to this data sink.
   void writeMemberNode(ir.Member value);
 
@@ -172,6 +187,10 @@
   /// [DataSource.readDartTypes].
   void writeDartTypes(Iterable<DartType> values, {bool allowNull: false});
 
+  /// Writes the kernel type node [value] to this data sink. If [allowNull] is
+  /// `true`, [value] is allowed to be `null`.
+  void writeDartTypeNode(ir.DartType value, {bool allowNull: false});
+
   /// Writes the source span [value] to this data sink.
   void writeSourceSpan(SourceSpan value);
 
@@ -264,7 +283,7 @@
   ///
   /// This is a convenience method to be used together with
   /// [DataSource.readLocals].
-  void writeLocals(Iterable<Local> locals, {bool allowNull: false});
+  void writeLocals(Iterable<Local> values, {bool allowNull: false});
 
   /// Writes the [map] from references to locals to [V] values to this data
   /// sink, calling [f] to write each value to the data sink. If [allowNull] is
@@ -278,6 +297,13 @@
   /// Writes the constant [value] to this data sink.
   void writeConstant(ConstantValue value);
 
+  /// Writes constant [values] to this data sink. If [allowNull] is `true`,
+  /// [values] is allowed to be `null`.
+  ///
+  /// This is a convenience method to be used together with
+  /// [DataSource.readConstants].
+  void writeConstants(Iterable<ConstantValue> values, {bool allowNull: false});
+
   /// Writes the [map] from constant values to [V] values to this data sink,
   /// calling [f] to write each value to the data sink. If [allowNull] is
   /// `true`, [map] is allowed to be `null`.
@@ -286,6 +312,25 @@
   /// [DataSource.readConstantMap].
   void writeConstantMap<V>(Map<ConstantValue, V> map, void f(V value),
       {bool allowNull: false});
+
+  /// Writes the import [value] to this data sink.
+  void writeImport(ImportEntity value);
+
+  /// Writes import [values] to this data sink. If [allowNull] is `true`,
+  /// [values] is allowed to be `null`.
+  ///
+  /// This is a convenience method to be used together with
+  /// [DataSource.readImports].
+  void writeImports(Iterable<ImportEntity> values, {bool allowNull: false});
+
+  /// Writes the [map] from imports to [V] values to this data sink,
+  /// calling [f] to write each value to the data sink. If [allowNull] is
+  /// `true`, [map] is allowed to be `null`.
+  ///
+  /// This is a convenience method to be used together with
+  /// [DataSource.readImportMap].
+  void writeImportMap<V>(Map<ImportEntity, V> map, void f(V value),
+      {bool allowNull: false});
 }
 
 /// Interface for deserialization.
@@ -314,6 +359,10 @@
   /// deserialization of references to locals.
   void registerLocalLookup(LocalLookup localLookup);
 
+  /// Reads a reference to an [E] value from this data source. If the value has
+  /// not yet been deserialized, [f] is called to deserialize the value itself.
+  E readCached<E>(E f());
+
   /// Reads a potentially `null` [E] value from this data source, calling [f] to
   /// read the non-null value from the data source.
   ///
@@ -385,6 +434,9 @@
   /// Reads a reference to a kernel class node from this data source.
   ir.Class readClassNode();
 
+  /// Reads a reference to a kernel class node from this data source.
+  ir.Typedef readTypedefNode();
+
   /// Reads a reference to a kernel member node from this data source.
   ir.Member readMemberNode();
 
@@ -441,6 +493,10 @@
   /// [DataSink.writeDartTypes].
   List<DartType> readDartTypes({bool emptyAsNull: false});
 
+  /// Reads a kernel type node from this data source. If [allowNull], the
+  /// returned type is allowed to be `null`.
+  ir.DartType readDartTypeNode({bool allowNull: false});
+
   /// Reads a source span from this data source.
   SourceSpan readSourceSpan();
 
@@ -526,6 +582,13 @@
   /// Reads a constant value from this data source.
   ConstantValue readConstant();
 
+  /// Reads a list of constant values from this data source. If [emptyAsNull] is
+  /// `true`, `null` is returned instead of an empty list.
+  ///
+  /// This is a convenience method to be used together with
+  /// [DataSink.writeConstants].
+  List<E> readConstants<E extends ConstantValue>({bool emptyAsNull: false});
+
   /// Reads a map from constant values to [V] values from this data source,
   /// calling [f] to read each value from the data source. If [emptyAsNull] is
   /// `true`, `null` is returned instead of an empty map.
@@ -534,6 +597,24 @@
   /// [DataSink.writeConstantMap].
   Map<K, V> readConstantMap<K extends ConstantValue, V>(V f(),
       {bool emptyAsNull: false});
+
+  /// Reads a import from this data source.
+  ImportEntity readImport();
+
+  /// Reads a list of imports from this data source. If [emptyAsNull] is
+  /// `true`, `null` is returned instead of an empty list.
+  ///
+  /// This is a convenience method to be used together with
+  /// [DataSink.writeImports].
+  List<ImportEntity> readImports({bool emptyAsNull: false});
+
+  /// Reads a map from imports to [V] values from this data source,
+  /// calling [f] to read each value from the data source. If [emptyAsNull] is
+  /// `true`, `null` is returned instead of an empty map.
+  ///
+  /// This is a convenience method to be used together with
+  /// [DataSink.writeImportMap].
+  Map<ImportEntity, V> readImportMap<V>(V f(), {bool emptyAsNull: false});
 }
 
 /// Interface used for looking up entities by index during deserialization.
diff --git a/pkg/compiler/lib/src/serialization/strategies.dart b/pkg/compiler/lib/src/serialization/strategies.dart
new file mode 100644
index 0000000..0c159f9
--- /dev/null
+++ b/pkg/compiler/lib/src/serialization/strategies.dart
@@ -0,0 +1,132 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:front_end/src/fasta/kernel/utils.dart' as ir
+    show serializeComponent;
+import 'package:front_end/src/fasta/kernel/utils.dart';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
+
+import '../diagnostics/diagnostic_listener.dart';
+import '../environment.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
+import '../js_model/js_world.dart';
+import '../options.dart';
+import '../source_file_provider.dart';
+import '../util/sink_adapter.dart';
+import 'serialization.dart';
+import 'task.dart';
+
+abstract class SerializationStrategy<T> {
+  const SerializationStrategy();
+
+  List<int> serializeComponent(GlobalTypeInferenceResults results) {
+    JsClosedWorld closedWorld = results.closedWorld;
+    ir.Component component = closedWorld.elementMap.programEnv.mainComponent;
+    return ir.serializeComponent(component);
+  }
+
+  List<T> serializeData(GlobalTypeInferenceResults results);
+
+  ir.Component deserializeComponent(List<int> data) {
+    ir.Component component = new ir.Component();
+    new BinaryBuilder(data).readComponent(component);
+    return component;
+  }
+
+  GlobalTypeInferenceResults deserializeData(
+      CompilerOptions options,
+      DiagnosticReporter reporter,
+      Environment environment,
+      AbstractValueStrategy abstractValueStrategy,
+      ir.Component component,
+      List<T> data);
+}
+
+class BytesInMemorySerializationStrategy extends SerializationStrategy<int> {
+  final bool useDataKinds;
+
+  const BytesInMemorySerializationStrategy({this.useDataKinds: false});
+
+  @override
+  List<int> serializeData(GlobalTypeInferenceResults results) {
+    ByteSink byteSink = new ByteSink();
+    DataSink sink = new BinarySink(byteSink, useDataKinds: useDataKinds);
+    serializeGlobalTypeInferenceResults(results, sink);
+    return byteSink.builder.takeBytes();
+  }
+
+  @override
+  GlobalTypeInferenceResults deserializeData(
+      CompilerOptions options,
+      DiagnosticReporter reporter,
+      Environment environment,
+      AbstractValueStrategy abstractValueStrategy,
+      ir.Component component,
+      List<int> data) {
+    DataSource source = new BinarySourceImpl(data, useDataKinds: useDataKinds);
+    return deserializeGlobalTypeInferenceResults(options, reporter, environment,
+        abstractValueStrategy, component, source);
+  }
+}
+
+class BytesOnDiskSerializationStrategy extends SerializationStrategy<int> {
+  final bool useDataKinds;
+
+  const BytesOnDiskSerializationStrategy({this.useDataKinds: false});
+
+  @override
+  List<int> serializeData(GlobalTypeInferenceResults results) {
+    Uri uri = Uri.base.resolve('world.data');
+    DataSink sink = new BinarySink(
+        new BinaryOutputSinkAdapter(new RandomAccessBinaryOutputSink(uri)),
+        useDataKinds: useDataKinds);
+    serializeGlobalTypeInferenceResults(results, sink);
+    return new File.fromUri(uri).readAsBytesSync();
+  }
+
+  @override
+  GlobalTypeInferenceResults deserializeData(
+      CompilerOptions options,
+      DiagnosticReporter reporter,
+      Environment environment,
+      AbstractValueStrategy abstractValueStrategy,
+      ir.Component component,
+      List<int> data) {
+    DataSource source = new BinarySourceImpl(data, useDataKinds: useDataKinds);
+    return deserializeGlobalTypeInferenceResults(options, reporter, environment,
+        abstractValueStrategy, component, source);
+  }
+}
+
+class ObjectsInMemorySerializationStrategy
+    extends SerializationStrategy<Object> {
+  final bool useDataKinds;
+
+  const ObjectsInMemorySerializationStrategy({this.useDataKinds: true});
+
+  @override
+  List<Object> serializeData(GlobalTypeInferenceResults results) {
+    List<Object> data = [];
+    DataSink sink = new ObjectSink(data, useDataKinds: useDataKinds);
+    serializeGlobalTypeInferenceResults(results, sink);
+    return data;
+  }
+
+  @override
+  GlobalTypeInferenceResults deserializeData(
+      CompilerOptions options,
+      DiagnosticReporter reporter,
+      Environment environment,
+      AbstractValueStrategy abstractValueStrategy,
+      ir.Component component,
+      List<Object> data) {
+    DataSource source = new ObjectSource(data, useDataKinds: useDataKinds);
+    return deserializeGlobalTypeInferenceResults(options, reporter, environment,
+        abstractValueStrategy, component, source);
+  }
+}
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
new file mode 100644
index 0000000..3aac9f3
--- /dev/null
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/binary/ast_from_binary.dart' as ir;
+import 'package:kernel/binary/ast_to_binary.dart' as ir;
+import '../../compiler_new.dart' as api;
+import '../common/tasks.dart';
+import '../compiler.dart';
+import '../diagnostics/diagnostic_listener.dart';
+import '../environment.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
+import '../js_backend/inferred_data.dart';
+import '../js_model/js_world.dart';
+import '../options.dart';
+import '../util/sink_adapter.dart';
+import 'serialization.dart';
+
+void serializeGlobalTypeInferenceResults(
+    GlobalTypeInferenceResults results, DataSink sink) {
+  JsClosedWorld closedWorld = results.closedWorld;
+  InferredData inferredData = results.inferredData;
+  closedWorld.writeToDataSink(sink);
+  inferredData.writeToDataSink(sink);
+  results.writeToDataSink(sink);
+  sink.close();
+}
+
+GlobalTypeInferenceResults deserializeGlobalTypeInferenceResults(
+    CompilerOptions options,
+    DiagnosticReporter reporter,
+    Environment environment,
+    AbstractValueStrategy abstractValueStrategy,
+    ir.Component component,
+    DataSource source) {
+  JsClosedWorld newClosedWorld = new JsClosedWorld.readFromDataSource(
+      options, reporter, environment, abstractValueStrategy, component, source);
+  InferredData newInferredData =
+      new InferredData.readFromDataSource(source, newClosedWorld);
+  return new GlobalTypeInferenceResults.readFromDataSource(
+      source, newClosedWorld, newInferredData);
+}
+
+class SerializationTask extends CompilerTask {
+  final Compiler compiler;
+
+  SerializationTask(this.compiler, Measurer measurer) : super(measurer);
+
+  String get name => 'Serialization';
+
+  void serialize(GlobalTypeInferenceResults results) {
+    measureSubtask('serialize dill', () {
+      // TODO(sigmund): remove entirely: we will do this immediately as soon as
+      // we get the component in the kernel/loader.dart task once we refactor
+      // how we apply our modular kernel transformation for super mixin calls.
+      compiler.reporter.log('Writing dill to ${compiler.options.outputUri}');
+      api.BinaryOutputSink dillOutput =
+          compiler.outputProvider.createBinarySink(compiler.options.outputUri);
+      JsClosedWorld closedWorld = results.closedWorld;
+      ir.Component component = closedWorld.elementMap.programEnv.mainComponent;
+      BinaryOutputSinkAdapter irSink = new BinaryOutputSinkAdapter(dillOutput);
+      ir.BinaryPrinter printer = new ir.BinaryPrinter(irSink);
+      printer.writeComponentFile(component);
+      irSink.close();
+    });
+
+    measureSubtask('serialize data', () {
+      compiler.reporter.log('Writing data to ${compiler.options.writeDataUri}');
+      api.BinaryOutputSink dataOutput = compiler.outputProvider
+          .createBinarySink(compiler.options.writeDataUri);
+      DataSink sink = new BinarySink(new BinaryOutputSinkAdapter(dataOutput));
+      serializeGlobalTypeInferenceResults(results, sink);
+    });
+  }
+
+  Future<GlobalTypeInferenceResults> deserialize() async {
+    ir.Component component =
+        await measureIoSubtask('deserialize dill', () async {
+      compiler.reporter.log('Reading dill from ${compiler.options.entryPoint}');
+      api.Input<List<int>> dillInput = await compiler.provider.readFromUri(
+          compiler.options.entryPoint,
+          inputKind: api.InputKind.binary);
+      ir.Component component = new ir.Component();
+      new ir.BinaryBuilder(dillInput.data).readComponent(component);
+      return component;
+    });
+
+    return await measureIoSubtask('deserialize data', () async {
+      compiler.reporter
+          .log('Reading data from ${compiler.options.readDataUri}');
+      api.Input<List<int>> dataInput = await compiler.provider.readFromUri(
+          compiler.options.readDataUri,
+          inputKind: api.InputKind.binary);
+      DataSource source = new BinarySourceImpl(dataInput.data);
+      return deserializeGlobalTypeInferenceResults(
+          compiler.options,
+          compiler.reporter,
+          compiler.environment,
+          compiler.abstractValueStrategy,
+          component,
+          source);
+    });
+  }
+}
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index c2d2fd0..f6551af 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -27,6 +27,9 @@
 
   Future<api.Input<List<int>>> readBytesFromUri(
       Uri resourceUri, api.InputKind inputKind) {
+    if (!resourceUri.isAbsolute) {
+      resourceUri = cwd.resolveUri(resourceUri);
+    }
     api.Input<List<int>> input;
     switch (inputKind) {
       case api.InputKind.UTF8:
@@ -320,6 +323,7 @@
   int totalCharactersWritten = 0;
   int totalCharactersWrittenPrimary = 0;
   int totalCharactersWrittenJavaScript = 0;
+  int totalDataWritten = 0;
 
   List<String> allOutputFiles = <String>[];
 
@@ -348,7 +352,8 @@
       case OutputType.jsPart:
         uri = out.resolve('$name.$extension');
         break;
-      case OutputType.info:
+      case OutputType.dumpInfo:
+      case OutputType.deferredMap:
         if (name == '') {
           name = out.pathSegments.last;
         }
@@ -386,7 +391,7 @@
 
     int charactersWritten = 0;
 
-    writeStringSync(String data) {
+    void writeStringSync(String data) {
       // Write the data in chunks of 8kb, otherwise we risk running OOM.
       int chunkSize = 8 * 1024;
 
@@ -399,7 +404,7 @@
       charactersWritten += data.length;
     }
 
-    onDone() {
+    void onDone() {
       output.closeSync();
       totalCharactersWritten += charactersWritten;
       if (isPrimaryOutput) {
@@ -412,10 +417,60 @@
 
     return new _OutputSinkWrapper(writeStringSync, onDone);
   }
+
+  @override
+  BinaryOutputSink createBinarySink(Uri uri) {
+    uri = currentDirectory.resolveUri(uri);
+
+    allOutputFiles.add(relativize(currentDirectory, uri, Platform.isWindows));
+
+    if (uri.scheme != 'file') {
+      onFailure('Unhandled scheme ${uri.scheme} in $uri.');
+    }
+
+    RandomAccessFile output;
+    try {
+      output = new File(uri.toFilePath()).openSync(mode: FileMode.WRITE);
+    } on FileSystemException catch (e) {
+      onFailure('$e');
+    }
+
+    int bytesWritten = 0;
+
+    void writeBytesSync(List<int> data, [int start = 0, int end]) {
+      output.writeFromSync(data, start, end);
+      bytesWritten += (end ?? data.length) - start;
+    }
+
+    void onDone() {
+      output.closeSync();
+      totalDataWritten += bytesWritten;
+    }
+
+    return new _BinaryOutputSinkWrapper(writeBytesSync, onDone);
+  }
+}
+
+class RandomAccessBinaryOutputSink implements api.BinaryOutputSink {
+  final RandomAccessFile output;
+
+  RandomAccessBinaryOutputSink(Uri uri)
+      : output = new File.fromUri(uri).openSync(mode: FileMode.write);
+
+  @override
+  void write(List<int> buffer, [int start = 0, int end]) {
+    output.writeFromSync(buffer, start, end);
+  }
+
+  @override
+  void close() {
+    output.closeSync();
+  }
 }
 
 class _OutputSinkWrapper extends OutputSink {
-  var onAdd, onClose;
+  void Function(String) onAdd;
+  void Function() onClose;
 
   _OutputSinkWrapper(this.onAdd, this.onClose);
 
@@ -424,6 +479,18 @@
   void close() => onClose();
 }
 
+class _BinaryOutputSinkWrapper extends BinaryOutputSink {
+  void Function(List<int>, [int, int]) onWrite;
+  void Function() onClose;
+
+  _BinaryOutputSinkWrapper(this.onWrite, this.onClose);
+
+  void write(List<int> data, [int start = 0, int end]) =>
+      onWrite(data, start, end);
+
+  void close() => onClose();
+}
+
 /// Adapter to integrate dart2js in bazel.
 ///
 /// To handle bazel's special layout:
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 262a7ea..1674df2 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -21,8 +21,11 @@
 import '../elements/jumps.dart';
 import '../elements/names.dart';
 import '../elements/types.dart';
-import '../ir/util.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
 import '../io/source_information.dart';
+import '../ir/static_type_provider.dart';
+import '../ir/util.dart';
 import '../js/js.dart' as js;
 import '../js_backend/allocator_analysis.dart' show JAllocatorAnalysis;
 import '../js_backend/backend.dart' show FunctionInlineCache, JavaScriptBackend;
@@ -32,16 +35,16 @@
 import '../js_model/elements.dart' show JGeneratorBody;
 import '../js_model/element_map.dart';
 import '../js_model/js_strategy.dart';
-import '../native/native.dart' as native;
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
+import '../kernel/invocation_mirror_constants.dart';
+import '../native/behavior.dart';
+import '../native/js.dart';
 import '../universe/call_structure.dart';
+import '../universe/codegen_world_builder.dart';
 import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/side_effects.dart' show SideEffects;
 import '../universe/target_checks.dart' show TargetChecks;
 import '../universe/use.dart' show ConstantUse, StaticUse;
-import '../universe/world_builder.dart' show CodegenWorldBuilder;
 import '../world.dart';
 import 'graph_builder.dart';
 import 'jump_handler.dart';
@@ -62,9 +65,16 @@
   final KernelToLocalsMap localsMap;
   final KernelToTypeInferenceMap typeInferenceMap;
   final SourceInformationBuilder sourceInformationBuilder;
+  final StaticTypeProvider staticTypeProvider;
 
-  StackFrame(this.parent, this.member, this.asyncMarker, this.localsMap,
-      this.typeInferenceMap, this.sourceInformationBuilder);
+  StackFrame(
+      this.parent,
+      this.member,
+      this.asyncMarker,
+      this.localsMap,
+      this.typeInferenceMap,
+      this.sourceInformationBuilder,
+      this.staticTypeProvider);
 }
 
 class KernelSsaGraphBuilder extends ir.Visitor
@@ -158,6 +168,13 @@
   SourceInformationBuilder get _sourceInformationBuilder =>
       _currentFrame.sourceInformationBuilder;
 
+  DartType _getStaticType(ir.Expression node) {
+    // TODO(johnniwinther): Substitute the type by the this type and type
+    // arguments of the current frame.
+    return _elementMap
+        .getDartType(_currentFrame.staticTypeProvider.getStaticType(node));
+  }
+
   static MemberEntity _effectiveTargetElementFor(MemberEntity member) {
     if (member is JGeneratorBody) return member.function;
     return member;
@@ -179,7 +196,8 @@
         _currentFrame != null
             ? _currentFrame.sourceInformationBuilder
                 .forContext(member, callSourceInformation)
-            : _sourceInformationStrategy.createBuilderForContext(member));
+            : _sourceInformationStrategy.createBuilderForContext(member),
+        _elementMap.getStaticTypeProvider(member));
   }
 
   void _leaveFrame() {
@@ -260,7 +278,7 @@
               initialTargetElement, _functionNodeOf(definition.node));
           break;
       }
-      assert(graph.isValid());
+      assert(graph.isValid(), "Invalid graph for $initialTargetElement.");
 
       if (backend.tracer.isEnabled) {
         MemberEntity member = initialTargetElement;
@@ -480,9 +498,9 @@
           functionNode: node.function, checks: TargetChecks.none);
     }
 
-    // [fieldValues] accumulates the field initializer values, which may be
-    // overwritten by initializer-list initializers.
-    ConstructorData constructorData = new ConstructorData();
+    // [constructorData.fieldValues] accumulates the field initializer values,
+    // which may be overwritten by initializer-list initializers.
+    ConstructorData constructorData = ConstructorData();
     _buildInitializers(node, constructorData);
 
     List<HInstruction> constructorArguments = <HInstruction>[];
@@ -713,22 +731,28 @@
           failedAt(field, "Unexpected member definition $definition.");
       }
 
+      bool ignoreAllocatorAnalysis = false;
+      if (nativeData.isNativeOrExtendsNative(cls)) {
+        // @Native classes have 'fields' which are really getters/setter.  Do
+        // not try to initialize e.g. 'tagName'.
+        if (nativeData.isNativeClass(cls)) return;
+        // Fields that survive this test are fields of custom elements.
+        ignoreAllocatorAnalysis = true;
+      }
+
       if (node.initializer == null) {
-        // Unassigned fields of native classes are not initialized to
-        // prevent overwriting pre-initialized native properties.
-        if (!nativeData.isNativeOrExtendsNative(cls)) {
-          if (!_allocatorAnalysis.isInitializedInAllocator(field)) {
-            constructorData.fieldValues[field] =
-                graph.addConstantNull(closedWorld);
-          }
+        if (ignoreAllocatorAnalysis ||
+            !_allocatorAnalysis.isInitializedInAllocator(field)) {
+          constructorData.fieldValues[field] =
+              graph.addConstantNull(closedWorld);
         }
-      } else if (node.initializer is! ir.NullLiteral ||
-          !nativeData.isNativeClass(cls)) {
+      } else {
         // Compile the initializer in the context of the field so we know that
         // class type parameters are accessed as values.
         // TODO(sra): It would be sufficient to know the context was a field
         // initializer.
-        if (!_allocatorAnalysis.isInitializedInAllocator(field)) {
+        if (ignoreAllocatorAnalysis ||
+            !_allocatorAnalysis.isInitializedInAllocator(field)) {
           inlinedFrom(field,
               _sourceInformationBuilder.buildAssignment(node.initializer), () {
             node.initializer.accept(this);
@@ -876,10 +900,6 @@
     ir.Class callerClass = caller.enclosingClass;
     ir.Supertype supertype = callerClass.supertype;
 
-    if (callerClass.mixedInType != null) {
-      _collectFieldValues(callerClass.mixedInType.classNode, constructorData);
-    }
-
     // The class of the super-constructor may not be the supertype class. In
     // this case, we must go up the class hierarchy until we reach the class
     // containing the super-constructor.
@@ -1013,8 +1033,8 @@
       }
     }
     if (const bool.fromEnvironment('unreachable-throw')) {
-      var emptyParameters = parameters.values
-          .where((p) => abstractValueDomain.isEmpty(p.instructionType));
+      var emptyParameters = parameters.values.where((p) =>
+          abstractValueDomain.isEmpty(p.instructionType).isDefinitelyTrue);
       if (emptyParameters.length > 0) {
         addComment('${emptyParameters} inferred as [empty]');
         add(new HInvokeStatic(
@@ -1149,7 +1169,9 @@
     void _handleParameter(ir.VariableDeclaration variable) {
       Local local = localsMap.getLocalVariable(variable);
       if (nodeIsConstructorBody &&
-          closureDataLookup.getCapturedScope(targetElement).isBoxed(local)) {
+          closureDataLookup
+              .getCapturedScope(targetElement)
+              .isBoxedVariable(local)) {
         // If local is boxed, then `variable` will be a field inside the box
         // passed as the last parameter, so no need to update our locals
         // handler or check types at this point.
@@ -1324,7 +1346,6 @@
     if (functionNode != null) {
       _potentiallyAddFunctionParameterTypeChecks(functionNode, checks);
     }
-    _insertTraceCall(member);
     _insertCoverageCall(member);
   }
 
@@ -1370,7 +1391,7 @@
   @override
   void visitCheckLibraryIsLoaded(ir.CheckLibraryIsLoaded checkLoad) {
     ImportEntity import = _elementMap.getImport(checkLoad.import);
-    String loadId = deferredLoadTask.getImportDeferName(
+    String loadId = closedWorld.outputUnitData.getImportDeferName(
         _elementMap.getSpannable(targetElement, checkLoad), import);
     HInstruction prefixConstant = graph.addConstantString(loadId, closedWorld);
     HInstruction uriConstant =
@@ -1386,7 +1407,7 @@
 
   @override
   void visitLoadLibrary(ir.LoadLibrary loadLibrary) {
-    String loadId = deferredLoadTask.getImportDeferName(
+    String loadId = closedWorld.outputUnitData.getImportDeferName(
         _elementMap.getSpannable(targetElement, loadLibrary),
         _elementMap.getImport(loadLibrary.import));
     // TODO(efortuna): Source information!
@@ -1608,8 +1629,9 @@
 
       node.iterable.accept(this);
       array = pop();
-      isFixed =
-          abstractValueDomain.isFixedLengthJsIndexable(array.instructionType);
+      isFixed = abstractValueDomain
+          .isFixedLengthJsIndexable(array.instructionType)
+          .isDefinitelyTrue;
       localsHandler.updateLocal(
           indexVariable, graph.addConstantInt(0, closedWorld),
           sourceInformation: sourceInformation);
@@ -2051,9 +2073,25 @@
 
   @override
   void visitAsExpression(ir.AsExpression node) {
+    ir.Expression operand = node.operand;
+    operand.accept(this);
+
+    DartType operandType = _getStaticType(operand);
+    DartType type = _elementMap.getDartType(node.type);
+    if (_elementMap.types.isSubtype(operandType, type)) {
+      // Skip unneeded casts.
+      if (operand is! ir.PropertyGet) {
+        // TODO(johnniwinther): Support property get. Currently CFE inserts
+        // a seemingly unnecessary cast on tearoffs that contain type variables
+        // in contravariant positions. Since these casts are not marked we
+        // cannot easily detect when we actually need the cast. See test
+        // `language_2/instantiate_tearoff_after_contravariance_check_test`.
+        return;
+      }
+    }
+
     SourceInformation sourceInformation =
         _sourceInformationBuilder.buildAs(node);
-    node.operand.accept(this);
     HInstruction expressionInstruction = pop();
 
     if (node.type is ir.InvalidType) {
@@ -2061,7 +2099,6 @@
       return;
     }
 
-    DartType type = _elementMap.getDartType(node.type);
     if ((!node.isTypeError && !options.omitAsCasts) ||
         options.implicitDowncastCheckPolicy.isEmitted) {
       HInstruction converted = typeBuilder.buildTypeConversion(
@@ -2483,7 +2520,7 @@
         js.Template code = js.js.parseForeignJS('#');
         push(new HForeignCode(code, abstractValueDomain.boolType,
             [localsHandler.readLocal(switchTarget)],
-            nativeBehavior: native.NativeBehavior.PURE));
+            nativeBehavior: NativeBehavior.PURE));
       }
 
       handleIf(
@@ -2594,7 +2631,7 @@
           new SubGraph(defaultCase, defaultCase)));
     }
     assert(caseHandlers.length == joinBlock.predecessors.length);
-    if (caseHandlers.length != 0) {
+    if (caseHandlers.isNotEmpty) {
       graph.addBlock(joinBlock);
       open(joinBlock);
       if (caseHandlers.length == 1) {
@@ -2738,9 +2775,9 @@
           listInstruction, type, sourceInformation);
     }
 
-    AbstractValue type = _typeInferenceMap.typeOfListLiteral(
-        targetElement, node, abstractValueDomain);
-    if (!abstractValueDomain.containsAll(type)) {
+    AbstractValue type =
+        _typeInferenceMap.typeOfListLiteral(node, abstractValueDomain);
+    if (abstractValueDomain.containsAll(type).isDefinitelyFalse) {
       listInstruction.instructionType = type;
     }
     stack.add(listInstruction);
@@ -2792,8 +2829,8 @@
 
       // We lift this common call pattern into a helper function to save space
       // in the output.
-      if (typeInputs
-          .every((HInstruction input) => input.isNull(abstractValueDomain))) {
+      if (typeInputs.every((HInstruction input) =>
+          input.isNull(abstractValueDomain).isDefinitelyTrue)) {
         if (constructorArgs.isEmpty) {
           constructor = _commonElements.mapLiteralUntypedEmptyMaker;
         } else {
@@ -3369,13 +3406,7 @@
         function == commonElements.jsArrayTypedConstructor;
 
     _inferredTypeOfNewList(ir.StaticInvocation node) {
-      MemberEntity element = sourceElement is ConstructorBodyEntity
-          ? (sourceElement as ConstructorBodyEntity).constructor
-          : sourceElement;
-
-      return globalInferenceResults
-              .resultOfMember(element)
-              .typeOfNewList(node) ??
+      return globalInferenceResults.typeOfNewList(node) ??
           abstractValueDomain.dynamicType;
     }
 
@@ -3388,9 +3419,9 @@
               "Unexpected arguments. "
               "Expected 1-2 argument, actual: $arguments."));
       HInstruction lengthInput = arguments.first;
-      if (!lengthInput.isNumber(abstractValueDomain)) {
+      if (lengthInput.isNumber(abstractValueDomain).isPotentiallyFalse) {
         HTypeConversion conversion = new HTypeConversion(
-            null,
+            commonElements.numType,
             HTypeConversion.ARGUMENT_TYPE_CHECK,
             abstractValueDomain.numType,
             lengthInput,
@@ -3399,7 +3430,7 @@
         lengthInput = conversion;
       }
       js.Template code = js.js.parseForeignJS('new Array(#)');
-      var behavior = new native.NativeBehavior();
+      var behavior = new NativeBehavior();
 
       var expectedType =
           _elementMap.getDartType(invocation.getStaticType(null));
@@ -3411,20 +3442,20 @@
       // TODO(sra): Array allocation should be an instruction so that canThrow
       // can depend on a length type discovered in optimization.
       bool canThrow = true;
-      if (lengthInput.isUInt32(abstractValueDomain)) {
+      if (lengthInput.isUInt32(abstractValueDomain).isDefinitelyTrue) {
         canThrow = false;
       }
 
       var inferredType = _inferredTypeOfNewList(invocation);
-      resultType = abstractValueDomain.containsAll(inferredType)
-          ? abstractValueDomain.fixedListType
-          : inferredType;
+      resultType =
+          abstractValueDomain.containsAll(inferredType).isPotentiallyTrue
+              ? abstractValueDomain.fixedListType
+              : inferredType;
       HForeignCode foreign = new HForeignCode(
           code, resultType, <HInstruction>[lengthInput],
           nativeBehavior: behavior,
-          throwBehavior: canThrow
-              ? native.NativeThrowBehavior.MAY
-              : native.NativeThrowBehavior.NEVER)
+          throwBehavior:
+              canThrow ? NativeThrowBehavior.MAY : NativeThrowBehavior.NEVER)
         ..sourceInformation = sourceInformation;
       push(foreign);
       // TODO(redemption): Global type analysis tracing may have determined that
@@ -3435,14 +3466,15 @@
         // We set the instruction as [canThrow] to avoid it being dead code.
         // We need a finer grained side effect.
         add(new HForeignCode(code, abstractValueDomain.nullType, [stack.last],
-            throwBehavior: native.NativeThrowBehavior.MAY));
+            throwBehavior: NativeThrowBehavior.MAY));
       }
     } else if (isGrowableListConstructorCall) {
       push(buildLiteralList(<HInstruction>[]));
       var inferredType = _inferredTypeOfNewList(invocation);
-      resultType = abstractValueDomain.containsAll(inferredType)
-          ? abstractValueDomain.growableListType
-          : inferredType;
+      resultType =
+          abstractValueDomain.containsAll(inferredType).isPotentiallyTrue
+              ? abstractValueDomain.growableListType
+              : inferredType;
       stack.last.instructionType = resultType;
     } else if (isJSArrayTypedConstructor) {
       // TODO(sra): Instead of calling the identity-like factory constructor,
@@ -3617,13 +3649,13 @@
     Name memberName = new Name(name, _currentFrame.member.library);
     Selector selector;
     switch (kindLiteral.value) {
-      case Selector.invocationMirrorGetterKind:
+      case invocationMirrorGetterKind:
         selector = new Selector.getter(memberName);
         break;
-      case Selector.invocationMirrorSetterKind:
+      case invocationMirrorSetterKind:
         selector = new Selector.setter(memberName);
         break;
-      case Selector.invocationMirrorMethodKind:
+      case invocationMirrorMethodKind:
         if (memberName == Names.INDEX_NAME) {
           selector = new Selector.index();
         } else if (memberName == Names.INDEX_SET_NAME) {
@@ -3816,7 +3848,7 @@
                     .staticFunctionAccess(_elementMap.getMethod(staticTarget))),
                 abstractValueDomain.dynamicType,
                 <HInstruction>[],
-                nativeBehavior: native.NativeBehavior.PURE,
+                nativeBehavior: NativeBehavior.PURE,
                 foreignFunction: _elementMap.getMethod(staticTarget)));
             return;
           }
@@ -3848,8 +3880,7 @@
     sideEffects.setAllSideEffects();
     push(new HForeignCode(js.js.parseForeignJS("$isolateName = #"),
         abstractValueDomain.dynamicType, inputs,
-        nativeBehavior: native.NativeBehavior.CHANGES_OTHER,
-        effects: sideEffects));
+        nativeBehavior: NativeBehavior.CHANGES_OTHER, effects: sideEffects));
   }
 
   void handleForeignJsGetStaticState(ir.StaticInvocation invocation) {
@@ -3862,7 +3893,7 @@
 
     push(new HForeignCode(js.js.parseForeignJS(namer.staticStateHolder),
         abstractValueDomain.dynamicType, <HInstruction>[],
-        nativeBehavior: native.NativeBehavior.DEPENDS_OTHER));
+        nativeBehavior: NativeBehavior.DEPENDS_OTHER));
   }
 
   void handleForeignJsGetName(ir.StaticInvocation invocation) {
@@ -3904,7 +3935,7 @@
     js.Template expr = js.js.expressionTemplateYielding(
         emitter.generateEmbeddedGlobalAccess(globalName));
 
-    native.NativeBehavior nativeBehavior =
+    NativeBehavior nativeBehavior =
         _elementMap.getNativeBehaviorForJsEmbeddedGlobalCall(invocation);
     assert(
         nativeBehavior != null,
@@ -3951,7 +3982,7 @@
       inputs.add(pop());
     }
 
-    native.NativeBehavior nativeBehavior =
+    NativeBehavior nativeBehavior =
         _elementMap.getNativeBehaviorForJsBuiltinCall(invocation);
     assert(
         nativeBehavior != null,
@@ -4042,7 +4073,7 @@
       return;
     }
 
-    native.NativeBehavior nativeBehavior =
+    NativeBehavior nativeBehavior =
         _elementMap.getNativeBehaviorForJsCall(invocation);
     assert(
         nativeBehavior != null,
@@ -4067,7 +4098,7 @@
       return;
     }
 
-    if (native.HasCapturedPlaceholders.check(nativeBehavior.codeTemplate.ast)) {
+    if (HasCapturedPlaceholders.check(nativeBehavior.codeTemplate.ast)) {
       reporter.reportErrorMessage(
           _elementMap.getSpannable(targetElement, invocation),
           MessageKind.JS_PLACEHOLDER_CAPTURE);
@@ -4091,11 +4122,14 @@
     if (trustedMask != null) {
       // We only allow the type argument to narrow `dynamic`, which probably
       // comes from an unspecified return type in the NativeBehavior.
-      if (abstractValueDomain.containsAll(code.instructionType)) {
+      if (abstractValueDomain
+          .containsAll(code.instructionType)
+          .isPotentiallyTrue) {
         // Overwrite the type with the narrower type.
         code.instructionType = trustedMask;
-      } else if (abstractValueDomain.contains(
-          trustedMask, code.instructionType)) {
+      } else if (abstractValueDomain
+          .contains(trustedMask, code.instructionType)
+          .isPotentiallyTrue) {
         // It is acceptable for the type parameter to be broader than the
         // specified type.
       } else {
@@ -4219,11 +4253,15 @@
 
     AbstractValue type = _typeInferenceMap.selectorTypeOf(selector, mask);
     if (selector.isGetter) {
-      push(new HInvokeDynamicGetter(selector, mask, null, inputs, isIntercepted,
-          type, sourceInformation));
+      push(new HInvokeDynamicGetter(selector, mask, element, inputs,
+          isIntercepted, type, sourceInformation));
     } else if (selector.isSetter) {
-      push(new HInvokeDynamicSetter(selector, mask, null, inputs, isIntercepted,
-          type, sourceInformation));
+      push(new HInvokeDynamicSetter(selector, mask, element, inputs,
+          isIntercepted, type, sourceInformation));
+    } else if (selector.isClosureCall) {
+      assert(!isIntercepted);
+      push(new HInvokeClosure(selector, inputs, type, typeArguments)
+        ..sourceInformation = sourceInformation);
     } else {
       push(new HInvokeDynamicMethod(
           selector, mask, inputs, type, typeArguments, sourceInformation,
@@ -4261,8 +4299,7 @@
       var codeTemplate =
           new js.Template(null, js.objectLiteral(parameterNameMap));
 
-      var nativeBehavior = new native.NativeBehavior()
-        ..codeTemplate = codeTemplate;
+      var nativeBehavior = new NativeBehavior()..codeTemplate = codeTemplate;
       if (options.trustJSInteropTypeAnnotations) {
         InterfaceType thisType = _elementMap.elementEnvironment
             .getThisType(constructor.enclosingClass);
@@ -4287,8 +4324,7 @@
     arguments = arguments.where((arg) => arg != null).toList();
     var inputs = <HInstruction>[target]..addAll(arguments);
 
-    var nativeBehavior = new native.NativeBehavior()
-      ..sideEffects.setAllSideEffects();
+    var nativeBehavior = new NativeBehavior()..sideEffects.setAllSideEffects();
 
     DartType type = element is ConstructorEntity
         ? _elementMap.elementEnvironment.getThisType(element.enclosingClass)
@@ -4897,10 +4933,8 @@
       ..cleanUp();
   }
 
-  /**
-   * Try to inline [element] within the correct context of the builder. The
-   * insertion point is the state of the builder.
-   */
+  /// Try to inline [element] within the correct context of the builder. The
+  /// insertion point is the state of the builder.
   bool _tryInlineMethod(
       FunctionEntity function,
       Selector selector,
@@ -4944,7 +4978,9 @@
       if (selector != null) {
         if (!selector.applies(function)) return false;
         if (mask != null &&
-            !abstractValueDomain.canHit(mask, function, selector)) {
+            abstractValueDomain
+                .isTargetingMember(mask, function, selector.memberName)
+                .isDefinitelyFalse) {
           return false;
         }
       }
@@ -4954,7 +4990,9 @@
       // Don't inline operator== methods if the parameter can be null.
       if (function.name == '==') {
         if (function.enclosingClass != commonElements.objectClass &&
-            providedArguments[1].canBeNull(abstractValueDomain)) {
+            providedArguments[1]
+                .isNull(abstractValueDomain)
+                .isPotentiallyTrue) {
           return false;
         }
       }
@@ -5103,7 +5141,8 @@
       // NoSuchMethodError message as if we had called it.
       if (function.isInstanceMember &&
           function is! ConstructorBodyEntity &&
-          (mask == null || abstractValueDomain.canBeNull(mask))) {
+          (mask == null ||
+              abstractValueDomain.isNull(mask).isPotentiallyTrue)) {
         add(new HFieldGet(
             null, providedArguments[0], abstractValueDomain.dynamicType,
             isAssignable: false)
@@ -5325,7 +5364,8 @@
     bool hasBox = false;
     forEachOrderedParameter(closedWorld.globalLocalsMap, _elementMap, function,
         (Local parameter) {
-      if (forGenerativeConstructorBody && scopeData.isBoxed(parameter)) {
+      if (forGenerativeConstructorBody &&
+          scopeData.isBoxedVariable(parameter)) {
         // The parameter will be a field in the box passed as the last
         // parameter. So no need to have it.
         hasBox = true;
@@ -5380,7 +5420,6 @@
         _elementMap.elementEnvironment.getFunctionType(function).returnType;
     stack = <HInstruction>[];
 
-    _insertTraceCall(function);
     _insertCoverageCall(function);
   }
 
@@ -5524,35 +5563,20 @@
     return _allInlinedFunctionsCalledOnce && _isFunctionCalledOnce(element);
   }
 
-  void _insertTraceCall(MemberEntity element) {
-    if (JavaScriptBackend.TRACE_METHOD == 'console') {
-      if (element == commonElements.traceHelper) return;
-      n(e) => e == null ? '' : e.name;
-      String name = "${n(element.library)}:${n(element.enclosingClass)}."
-          "${n(element)}";
-      HConstant nameConstant = graph.addConstantString(name, closedWorld);
-      add(new HInvokeStatic(
-          commonElements.traceHelper,
-          <HInstruction>[nameConstant],
-          abstractValueDomain.dynamicType,
-          const <DartType>[]));
-    }
-  }
-
   void _insertCoverageCall(MemberEntity element) {
-    if (JavaScriptBackend.TRACE_METHOD == 'post') {
-      if (element == commonElements.traceHelper) return;
-      // TODO(sigmund): create a better uuid for elements.
-      HConstant idConstant =
-          graph.addConstantInt(element.hashCode, closedWorld);
-      HConstant nameConstant =
-          graph.addConstantString(element.name, closedWorld);
-      add(new HInvokeStatic(
-          commonElements.traceHelper,
-          <HInstruction>[idConstant, nameConstant],
-          abstractValueDomain.dynamicType,
-          const <DartType>[]));
-    }
+    if (!options.experimentCallInstrumentation) return;
+    if (element == commonElements.traceHelper) return;
+    // TODO(sigmund): create a better uuid for elements.
+    HConstant idConstant = graph.addConstantInt(element.hashCode, closedWorld);
+    n(e) => e == null ? '' : e.name;
+    String name = "${n(element.library)}:${n(element.enclosingClass)}."
+        "${n(element)}";
+    HConstant nameConstant = graph.addConstantString(name, closedWorld);
+    add(new HInvokeStatic(
+        commonElements.traceHelper,
+        <HInstruction>[idConstant, nameConstant],
+        abstractValueDomain.dynamicType,
+        const <DartType>[]));
   }
 }
 
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 83d7920..dc941f4 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -17,6 +17,7 @@
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
 import '../js_backend/interceptor_data.dart';
@@ -27,9 +28,9 @@
 import '../js_backend/runtime_types.dart';
 import '../js_emitter/code_emitter_task.dart';
 import '../js_model/elements.dart' show JGeneratorBody;
-import '../native/native.dart' as native;
+import '../native/behavior.dart';
+import '../native/enqueue.dart';
 import '../options.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/selector.dart' show Selector;
 import '../universe/use.dart'
@@ -133,31 +134,27 @@
 }
 
 class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor {
-  /**
-   * Returned by [expressionType] to tell how code can be generated for
-   * a subgraph.
-   * - [TYPE_STATEMENT] means that the graph must be generated as a statement,
-   * which is always possible.
-   * - [TYPE_EXPRESSION] means that the graph can be generated as an expression,
-   * or possibly several comma-separated expressions.
-   * - [TYPE_DECLARATION] means that the graph can be generated as an
-   * expression, and that it only generates expressions of the form
-   *   variable = expression
-   * which are also valid as parts of a "var" declaration.
-   */
+  /// Returned by [expressionType] to tell how code can be generated for
+  /// a subgraph.
+  /// - [TYPE_STATEMENT] means that the graph must be generated as a statement,
+  /// which is always possible.
+  /// - [TYPE_EXPRESSION] means that the graph can be generated as an expression,
+  /// or possibly several comma-separated expressions.
+  /// - [TYPE_DECLARATION] means that the graph can be generated as an
+  /// expression, and that it only generates expressions of the form
+  ///   variable = expression
+  /// which are also valid as parts of a "var" declaration.
   static const int TYPE_STATEMENT = 0;
   static const int TYPE_EXPRESSION = 1;
   static const int TYPE_DECLARATION = 2;
 
-  /**
-   * Whether we are currently generating expressions instead of statements.
-   * This includes declarations, which are generated as expressions.
-   */
+  /// Whether we are currently generating expressions instead of statements.
+  /// This includes declarations, which are generated as expressions.
   bool isGeneratingExpression = false;
 
   final CompilerOptions _options;
   final CodeEmitterTask _emitter;
-  final native.NativeCodegenEnqueuer _nativeEnqueuer;
+  final NativeCodegenEnqueuer _nativeEnqueuer;
   final CheckedModeHelpers _checkedModeHelpers;
   final OneShotInterceptorData _oneShotInterceptorData;
   final RuntimeTypesSubstitutions _rtiSubstitutions;
@@ -179,10 +176,8 @@
   List<js.Expression> expressionStack;
   List<js.Block> oldContainerStack;
 
-  /**
-   * Contains the names of the instructions, as well as the parallel
-   * copies to perform on block transitioning.
-   */
+  /// Contains the names of the instructions, as well as the parallel
+  /// copies to perform on block transitioning.
   VariableNames variableNames;
 
   /// `true` when we need to generate a `var` declaration at function entry,
@@ -190,17 +185,13 @@
   /// middle of the function.
   bool shouldGroupVarDeclarations = false;
 
-  /**
-   * While generating expressions, we can't insert variable declarations.
-   * Instead we declare them at the start of the function.  When minifying
-   * we do this most of the time, because it reduces the size unless there
-   * is only one variable.
-   */
+  /// While generating expressions, we can't insert variable declarations.
+  /// Instead we declare them at the start of the function.  When minifying
+  /// we do this most of the time, because it reduces the size unless there
+  /// is only one variable.
   final Set<String> collectedVariableDeclarations;
 
-  /**
-   * Set of variables and parameters that have already been declared.
-   */
+  /// Set of variables and parameters that have already been declared.
   final Set<String> declaredLocals;
 
   HGraph currentGraph;
@@ -322,17 +313,17 @@
   }
 
   bool requiresUintConversion(HInstruction instruction) {
-    if (instruction.isUInt31(_abstractValueDomain)) return false;
+    if (instruction.isUInt31(_abstractValueDomain).isDefinitelyTrue) {
+      return false;
+    }
     if (bitWidth(instruction) <= 31) return false;
     // If the result of a bit-operation is only used by other bit
     // operations, we do not have to convert to an unsigned integer.
     return hasNonBitOpUser(instruction, new Set<HPhi>());
   }
 
-  /**
-   * If the [instruction] is not `null` it will be used to attach the position
-   * to the [statement].
-   */
+  /// If the [instruction] is not `null` it will be used to attach the position
+  /// to the [statement].
   void pushStatement(js.Statement statement) {
     assert(expressionStack.isEmpty);
     currentContainer.statements.add(statement);
@@ -342,20 +333,16 @@
     currentContainer.statements.insert(0, statement);
   }
 
-  /**
-   * If the [instruction] is not `null` it will be used to attach the position
-   * to the [expression].
-   */
+  /// If the [instruction] is not `null` it will be used to attach the position
+  /// to the [expression].
   pushExpressionAsStatement(
       js.Expression expression, SourceInformation sourceInformation) {
     pushStatement(new js.ExpressionStatement(expression)
         .withSourceInformation(sourceInformation));
   }
 
-  /**
-   * If the [instruction] is not `null` it will be used to attach the position
-   * to the [expression].
-   */
+  /// If the [instruction] is not `null` it will be used to attach the position
+  /// to the [expression].
   push(js.Expression expression) {
     expressionStack.add(expression);
   }
@@ -365,7 +352,7 @@
   }
 
   void preGenerateMethod(HGraph graph) {
-    new SsaInstructionSelection(_closedWorld, _interceptorData)
+    new SsaInstructionSelection(_options, _closedWorld, _interceptorData)
         .visitGraph(graph);
     new SsaTypeKnownRemover().visitGraph(graph);
     new SsaTrustedCheckRemover(_options).visitGraph(graph);
@@ -504,15 +491,13 @@
     subGraph = oldSubGraph;
   }
 
-  /**
-   * Check whether a sub-graph can be generated as an expression, or even
-   * as a declaration, or if it has to fall back to being generated as
-   * a statement.
-   * Expressions are anything that doesn't generate control flow constructs.
-   * Declarations must only generate assignments on the form "id = expression",
-   * and not, e.g., expressions where the value isn't assigned, or where it's
-   * assigned to something that's not a simple variable.
-   */
+  /// Check whether a sub-graph can be generated as an expression, or even
+  /// as a declaration, or if it has to fall back to being generated as
+  /// a statement.
+  /// Expressions are anything that doesn't generate control flow constructs.
+  /// Declarations must only generate assignments on the form "id = expression",
+  /// and not, e.g., expressions where the value isn't assigned, or where it's
+  /// assigned to something that's not a simple variable.
   int expressionType(HExpressionInformation info) {
     // The only HExpressionInformation used as part of a HBlockInformation is
     // current HSubExpressionBlockInformation, so it's the only one reaching
@@ -577,12 +562,10 @@
         (limits.end.last is HConditionalBranch);
   }
 
-  /**
-   * Generate statements from block information.
-   * If the block information contains expressions, generate only
-   * assignments, and if it ends in a conditional branch, don't generate
-   * the condition.
-   */
+  /// Generate statements from block information.
+  /// If the block information contains expressions, generate only
+  /// assignments, and if it ends in a conditional branch, don't generate
+  /// the condition.
   void generateStatements(HBlockInformation block) {
     if (block is HStatementInformation) {
       block.accept(this);
@@ -601,12 +584,10 @@
     return result;
   }
 
-  /**
-   * If the [block] only contains one statement returns that statement. If the
-   * that statement itself is a block, recursively calls this method.
-   *
-   * If the block is empty, returns a new instance of [js.NOP].
-   */
+  /// If the [block] only contains one statement returns that statement. If the
+  /// that statement itself is a block, recursively calls this method.
+  ///
+  /// If the block is empty, returns a new instance of [js.NOP].
   js.Statement unwrapStatement(js.Block block) {
     int len = block.statements.length;
     if (len == 0) return new js.EmptyStatement();
@@ -618,9 +599,7 @@
     return block;
   }
 
-  /**
-   * Generate expressions from block information.
-   */
+  /// Generate expressions from block information.
   js.Expression generateExpression(HExpressionInformation expression) {
     // Currently we only handle sub-expression graphs.
     assert(expression is HSubExpressionBlockInformation);
@@ -648,9 +627,7 @@
     }
   }
 
-  /**
-    * Only visits the arguments starting at inputs[HInvoke.ARGUMENTS_OFFSET].
-    */
+  /// Only visits the arguments starting at inputs[HInvoke.ARGUMENTS_OFFSET].
   List<js.Expression> visitArguments(List<HInstruction> inputs,
       {int start: HInvoke.ARGUMENTS_OFFSET}) {
     assert(inputs.length >= start);
@@ -1328,10 +1305,8 @@
     assignVariable(destination, new js.VariableUse(source), sourceInformation);
   }
 
-  /**
-   * Sequentialize a list of conceptually parallel copies. Parallel
-   * copies may contain cycles, that this method breaks.
-   */
+  /// Sequentialize a list of conceptually parallel copies. Parallel
+  /// copies may contain cycles, that this method breaks.
   void sequentializeCopies(
       Iterable<Copy<HInstruction>> instructionCopies,
       String tempName,
@@ -1545,11 +1520,11 @@
   visitShiftRight(HShiftRight node) => visitBitInvokeBinary(node, '>>>');
 
   visitTruncatingDivide(HTruncatingDivide node) {
-    assert(node.isUInt31(_abstractValueDomain));
+    assert(node.isUInt31(_abstractValueDomain).isDefinitelyTrue);
     // TODO(karlklose): Enable this assertion again when type propagation is
     // fixed. Issue 23555.
 //    assert(node.left.isUInt32(compiler));
-    assert(node.right.isPositiveInteger(_abstractValueDomain));
+    assert(node.right.isPositiveInteger(_abstractValueDomain).isDefinitelyTrue);
     use(node.left);
     js.Expression jsLeft = pop();
     use(node.right);
@@ -1710,35 +1685,76 @@
   }
 
   void generateIf(HIf node, HIfBlockInformation info) {
-    use(node.inputs[0]);
-    js.Expression test = pop();
-
     HStatementInformation thenGraph = info.thenGraph;
     HStatementInformation elseGraph = info.elseGraph;
-    js.Statement thenPart =
-        unwrapStatement(generateStatementsInNewBlock(thenGraph));
-    js.Statement elsePart =
-        unwrapStatement(generateStatementsInNewBlock(elseGraph));
+    HInstruction condition = node.inputs.single;
 
-    js.Statement code;
+    js.Expression test;
+    js.Statement thenPart;
+    js.Statement elsePart;
+
+    HBasicBlock thenBlock = node.block.successors[0];
+    // If we believe we will generate S1 as empty, instead of
+    //
+    //     if (e) S1; else S2;
+    //
+    // try to generate
+    //
+    //     if (!e) S2; else S1;
+    //
+    // It is better to generate `!e` rather than try and negate it later.
+    // Recognize a single then-block with no code and no controlled phis.
+    if (isGenerateAtUseSite(condition) &&
+        thenBlock.successors.length == 1 &&
+        thenBlock.successors.single == node.joinBlock &&
+        node.joinBlock.phis.isEmpty &&
+        thenBlock.first is HGoto) {
+      generateNot(condition, condition.sourceInformation);
+      test = pop();
+      // Swap branches but visit in same order as register allocator.
+      elsePart = unwrapStatement(generateStatementsInNewBlock(thenGraph));
+      thenPart = unwrapStatement(generateStatementsInNewBlock(elseGraph));
+      assert(elsePart is js.EmptyStatement);
+    } else {
+      use(condition);
+      test = pop();
+      thenPart = unwrapStatement(generateStatementsInNewBlock(thenGraph));
+      elsePart = unwrapStatement(generateStatementsInNewBlock(elseGraph));
+    }
+
+    js.Statement code = _assembleIfThenElse(test, thenPart, elsePart);
+    pushStatement(code.withSourceInformation(node.sourceInformation));
+  }
+
+  js.Statement _assembleIfThenElse(
+      js.Expression test, js.Statement thenPart, js.Statement elsePart) {
     // Peephole rewrites:
     //
-    //     if (e); else S;   -->   if(!e) S;
+    //     if (e); else S;   -->   if (!e) S;
     //
     //     if (e);   -->   e;
     //
-    // TODO(sra): This peephole optimization would be better done as an SSA
-    // optimization.
+    // TODO(sra): We might be able to do better with reshaping the CFG.
     if (thenPart is js.EmptyStatement) {
       if (elsePart is js.EmptyStatement) {
-        code = new js.ExpressionStatement(test);
-      } else {
-        code = new js.If.noElse(new js.Prefix('!', test), elsePart);
+        return js.ExpressionStatement(test);
       }
-    } else {
-      code = new js.If(test, thenPart, elsePart);
+      test = js.Prefix('!', test);
+      var temp = thenPart;
+      thenPart = elsePart;
+      elsePart = temp;
     }
-    pushStatement(code.withSourceInformation(node.sourceInformation));
+
+    if (_options.experimentToBoolean) {
+      if (elsePart is js.EmptyStatement &&
+          thenPart is js.ExpressionStatement &&
+          thenPart.expression is js.Call) {
+        return js.ExpressionStatement(
+            js.Binary('&&', test, thenPart.expression));
+      }
+    }
+
+    return js.If(test, thenPart, elsePart);
   }
 
   visitIf(HIf node) {
@@ -1954,8 +1970,8 @@
     }
   }
 
-  void registerSetter(HInvokeDynamic node) {
-    if (node.element != null) {
+  void registerSetter(HInvokeDynamic node, {bool needsCheck: false}) {
+    if (node.element is FieldEntity && !needsCheck) {
       // This is a dynamic update which we have found to have a single
       // target but for some reason haven't inlined. We are _still_ accessing
       // the target dynamically but we don't need to enqueue more than target
@@ -1992,7 +2008,7 @@
     push(js
         .propertyCall(pop(), name, visitArguments(node.inputs))
         .withSourceInformation(node.sourceInformation));
-    registerSetter(node);
+    registerSetter(node, needsCheck: node.needsCheck);
   }
 
   visitInvokeDynamicGetter(HInvokeDynamicGetter node) {
@@ -2150,7 +2166,10 @@
     use(node.receiver);
     js.Expression receiver = pop();
     use(node.value);
-    push(new js.Assignment(new js.PropertyAccess(receiver, name), pop())
+    push(new js.Assignment(
+            new js.PropertyAccess(receiver, name)
+                .withSourceInformation(node.sourceInformation),
+            pop())
         .withSourceInformation(node.sourceInformation));
   }
 
@@ -2191,7 +2210,7 @@
   }
 
   void registerForeignTypes(HForeign node) {
-    native.NativeBehavior nativeBehavior = node.nativeBehavior;
+    NativeBehavior nativeBehavior = node.nativeBehavior;
     if (nativeBehavior == null) return;
     _nativeEnqueuer.registerNativeBehavior(
         _registry.worldImpact, nativeBehavior, node);
@@ -2311,15 +2330,15 @@
 
       HInstruction left = relational.left;
       HInstruction right = relational.right;
-      if (left.isStringOrNull(_abstractValueDomain) &&
-          right.isStringOrNull(_abstractValueDomain)) {
+      if (left.isStringOrNull(_abstractValueDomain).isDefinitelyTrue &&
+          right.isStringOrNull(_abstractValueDomain).isDefinitelyTrue) {
         return true;
       }
 
       // This optimization doesn't work for NaN, so we only do it if the
       // type is known to be an integer.
-      return left.isInteger(_abstractValueDomain) &&
-          right.isInteger(_abstractValueDomain);
+      return left.isInteger(_abstractValueDomain).isDefinitelyTrue &&
+          right.isInteger(_abstractValueDomain).isDefinitelyTrue;
     }
 
     bool handledBySpecialCase = false;
@@ -2455,13 +2474,15 @@
       js.Expression over;
       if (node.staticChecks != HBoundsCheck.ALWAYS_ABOVE_ZERO) {
         use(node.index);
-        if (node.index.isInteger(_abstractValueDomain)) {
+        if (node.index.isInteger(_abstractValueDomain).isDefinitelyTrue) {
           under = js.js("# < 0", pop());
         } else {
           js.Expression jsIndex = pop();
           under = js.js("# >>> 0 !== #", [jsIndex, jsIndex]);
         }
-      } else if (!node.index.isInteger(_abstractValueDomain)) {
+      } else if (node.index
+          .isInteger(_abstractValueDomain)
+          .isPotentiallyFalse) {
         checkInt(node.index, '!==');
         under = pop();
       }
@@ -2582,10 +2603,10 @@
 
   void visitStringify(HStringify node) {
     HInstruction input = node.inputs.first;
-    if (input.isString(_abstractValueDomain)) {
+    if (input.isString(_abstractValueDomain).isDefinitelyTrue) {
       use(input);
-    } else if (input.isInteger(_abstractValueDomain) ||
-        input.isBoolean(_abstractValueDomain)) {
+    } else if (input.isInteger(_abstractValueDomain).isDefinitelyTrue ||
+        input.isBoolean(_abstractValueDomain).isDefinitelyTrue) {
       // JavaScript's + operator with a string for the left operand will convert
       // the right operand to a string, and the conversion result is correct.
       use(input);
@@ -2975,9 +2996,9 @@
       } else if (type.isFunctionType) {
         checkType(input, interceptor, type, sourceInformation,
             negative: negative);
-      } else if ((input.canBePrimitive(_abstractValueDomain) &&
-              !input.canBePrimitiveArray(_abstractValueDomain)) ||
-          input.canBeNull(_abstractValueDomain)) {
+      } else if ((input.isPrimitive(_abstractValueDomain).isPotentiallyTrue &&
+              input.isPrimitiveArray(_abstractValueDomain).isDefinitelyFalse) ||
+          input.isNull(_abstractValueDomain).isPotentiallyTrue) {
         checkObject(input, relation, node.sourceInformation);
         js.Expression objectTest = pop();
         checkType(input, interceptor, type, sourceInformation,
@@ -3000,44 +3021,24 @@
   }
 
   js.Expression generateReceiverOrArgumentTypeTest(HTypeConversion node) {
+    DartType type = node.typeExpression;
     HInstruction input = node.checkedInput;
-    AbstractValue inputType = node.inputType ?? input.instructionType;
     AbstractValue checkedType = node.checkedType;
     // This path is no longer used for indexable primitive types.
-    assert(!_abstractValueDomain.isJsIndexable(checkedType));
+    assert(_abstractValueDomain.isJsIndexable(checkedType).isPotentiallyFalse);
     // Figure out if it is beneficial to use a null check.  V8 generally prefers
     // 'typeof' checks, but for integers we cannot compile this test into a
     // single typeof check so the null check is cheaper.
-    bool isIntCheck = _abstractValueDomain.isIntegerOrNull(checkedType);
-    bool turnIntoNumCheck =
-        isIntCheck && _abstractValueDomain.isIntegerOrNull(inputType);
-    bool turnIntoNullCheck = !turnIntoNumCheck &&
-        (_abstractValueDomain.includeNull(checkedType) == inputType) &&
-        isIntCheck;
-
-    if (turnIntoNullCheck) {
-      use(input);
-      return new js.Binary("==", pop(), new js.LiteralNull())
-          .withSourceInformation(input.sourceInformation);
-    } else if (isIntCheck && !turnIntoNumCheck) {
-      // input is !int
-      checkBigInt(input, '!==', input.sourceInformation);
-      return pop();
-    } else if (turnIntoNumCheck ||
-        _abstractValueDomain.isNumberOrNull(checkedType)) {
+    if (type == _commonElements.numType) {
       // input is !num
       checkNum(input, '!==', input.sourceInformation);
       return pop();
-    } else if (_abstractValueDomain.isBooleanOrNull(checkedType)) {
+    } else if (type == _commonElements.boolType) {
       // input is !bool
       checkBool(input, '!==', input.sourceInformation);
       return pop();
-    } else if (_abstractValueDomain.isStringOrNull(checkedType)) {
-      // input is !string
-      checkString(input, '!==', input.sourceInformation);
-      return pop();
     }
-    throw failedAt(input, 'Unexpected check: $checkedType.');
+    throw failedAt(input, 'Unexpected check: $type.');
   }
 
   void visitTypeConversion(HTypeConversion node) {
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index 8c86276..78ddc04 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -4,24 +4,24 @@
 
 import '../constants/values.dart';
 import '../elements/entities.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../js_backend/js_backend.dart';
 import '../js_backend/interceptor_data.dart';
 import '../options.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
 import 'nodes.dart';
 
-/**
- * Replaces some instructions with specialized versions to make codegen easier.
- * Caches codegen information on nodes.
- */
+/// Replaces some instructions with specialized versions to make codegen easier.
+/// Caches codegen information on nodes.
 class SsaInstructionSelection extends HBaseVisitor {
   final JClosedWorld _closedWorld;
   final InterceptorData _interceptorData;
+  final CompilerOptions _options;
   HGraph graph;
 
-  SsaInstructionSelection(this._closedWorld, this._interceptorData);
+  SsaInstructionSelection(
+      this._options, this._closedWorld, this._interceptorData);
 
   AbstractValueDomain get _abstractValueDomain =>
       _closedWorld.abstractValueDomain;
@@ -83,40 +83,50 @@
   }
 
   /// Returns the single JavaScript comparison (`==` or `===`) if that
-  /// implements `identical(left, right)`, or returns `null` if a more complex
-  /// expression is needed.
+  /// implements `identical(left, right)`, or returns `null` if the more complex
+  /// ternary `left == null ? right == null : left === right` is required.
   String simpleOp(HInstruction left, HInstruction right) {
     AbstractValue leftType = left.instructionType;
     AbstractValue rightType = right.instructionType;
-    if (_abstractValueDomain.canBeNull(leftType) &&
-        _abstractValueDomain.canBeNull(rightType)) {
-      // Can't use `===` on Dart `null` since it is implemented by JavaScript
-      // `null` and `undefined`.
-      if (left.isConstantNull() || right.isConstantNull()) {
-        return '==';
-      }
-      if (_abstractValueDomain.isNumberOrNull(leftType) &&
-          _abstractValueDomain.isNumberOrNull(rightType)) {
-        return '==';
-      }
-      if (_abstractValueDomain.isStringOrNull(leftType) &&
-          _abstractValueDomain.isStringOrNull(rightType)) {
-        return '==';
-      }
-      if (_abstractValueDomain.isBooleanOrNull(leftType) &&
-          _abstractValueDomain.isBooleanOrNull(rightType)) {
-        return '==';
-      }
-
-      // TODO(34439): There are more cases that can compile to `==` without
-      // triggering a conversion in the JavaScript evaluation. `==` will work
-      // for most Dart objects, but we have to ensure neither side can be a
-      // JavaScript Number, String, Symbol or Boolean.
-      return null;
+    if (_abstractValueDomain.isNull(leftType).isDefinitelyFalse) {
+      return '===';
     }
-    return '===';
+    if (_abstractValueDomain.isNull(rightType).isDefinitelyFalse) {
+      return '===';
+    }
+
+    // Dart `null` is implemented by JavaScript `null` and `undefined` which are
+    // not strict-equals, so we can't use `===`. We would like to use `==` but
+    // need to avoid any cases from ES6 7.2.14 that involve conversions.
+    if (left.isConstantNull() || right.isConstantNull()) {
+      return '==';
+    }
+
+    if (_abstractValueDomain.isNumberOrNull(leftType).isDefinitelyTrue &&
+        _abstractValueDomain.isNumberOrNull(rightType).isDefinitelyTrue) {
+      return '==';
+    }
+    if (_abstractValueDomain.isStringOrNull(leftType).isDefinitelyTrue &&
+        _abstractValueDomain.isStringOrNull(rightType).isDefinitelyTrue) {
+      return '==';
+    }
+    if (_abstractValueDomain.isBooleanOrNull(leftType).isDefinitelyTrue &&
+        _abstractValueDomain.isBooleanOrNull(rightType).isDefinitelyTrue) {
+      return '==';
+    }
+
+    if (_intercepted(leftType)) return null;
+    if (_intercepted(rightType)) return null;
+    return '==';
   }
 
+  // ToPrimitive conversions of an object occur when the other operand is a
+  // primitive (Number, String, Symbol and, indirectly, Boolean). We use
+  // 'intercepted' types as a proxy for all the primitive types.
+  bool _intercepted(AbstractValue type) => _abstractValueDomain
+      .isInterceptor(_abstractValueDomain.excludeNull(type))
+      .isPotentiallyTrue;
+
   HInstruction visitInvokeDynamic(HInvokeDynamic node) {
     if (node.isInterceptedCall) {
       tryReplaceInterceptorWithDummy(node, node.selector, node.mask);
@@ -132,7 +142,12 @@
     return node;
   }
 
-  void tryReplaceInterceptorWithDummy(
+  HInstruction visitOneShotInterceptor(HOneShotInterceptor node) {
+    // The receiver parameter should never be replaced with a dummy constant.
+    return node;
+  }
+
+  bool tryReplaceInterceptorWithDummy(
       HInvoke node, Selector selector, AbstractValue mask) {
     // Calls of the form
     //
@@ -156,7 +171,7 @@
 
     // TODO(15933): Make automatically generated property extraction closures
     // work with the dummy receiver optimization.
-    if (selector.isGetter) return;
+    if (selector.isGetter) return false;
 
     // This assignment of inputs is uniform for HInvokeDynamic and HInvokeSuper.
     HInstruction interceptor = node.inputs[0];
@@ -173,8 +188,10 @@
         receiverArgument.usedBy.remove(node);
         node.inputs[1] = dummy;
         dummy.usedBy.add(node);
+        return true;
       }
     }
+    return false;
   }
 
   HInstruction visitFieldSet(HFieldSet setter) {
@@ -266,7 +283,9 @@
     HInstruction bitop(String assignOp) {
       // HBitAnd, HBitOr etc. are more difficult because HBitAnd(a.x, y)
       // sometimes needs to be forced to unsigned: a.x = (a.x & y) >>> 0.
-      if (op.isUInt31(_abstractValueDomain)) return simpleBinary(assignOp);
+      if (op.isUInt31(_abstractValueDomain).isDefinitelyTrue) {
+        return simpleBinary(assignOp);
+      }
       return noMatchingRead();
     }
 
@@ -284,12 +303,44 @@
 
     return noMatchingRead();
   }
+
+  visitIf(HIf node) {
+    if (!_options.experimentToBoolean) return node;
+    HInstruction condition = node.inputs.single;
+    // if (x != null) --> if (x)
+    if (condition is HNot) {
+      HInstruction test = condition.inputs.single;
+      if (test is HIdentity) {
+        HInstruction operand1 = test.inputs[0];
+        HInstruction operand2 = test.inputs[1];
+        if (operand2.isNull(_abstractValueDomain).isDefinitelyTrue &&
+            !_intercepted(operand1.instructionType)) {
+          if (test.usedBy.length == 1 && condition.usedBy.length == 1) {
+            node.changeUse(condition, operand1);
+            condition.block.remove(condition);
+            test.block.remove(test);
+          }
+        }
+      }
+    }
+    // if (x == null) => if (!x)
+    if (condition is HIdentity && condition.usedBy.length == 1) {
+      HInstruction operand1 = condition.inputs[0];
+      HInstruction operand2 = condition.inputs[1];
+      if (operand2.isNull(_abstractValueDomain).isDefinitelyTrue &&
+          !_intercepted(operand1.instructionType)) {
+        var not = HNot(operand1, _abstractValueDomain.boolType);
+        node.block.addBefore(node, not);
+        node.changeUse(condition, not);
+        condition.block.remove(condition);
+      }
+    }
+    return node;
+  }
 }
 
-/**
- * Remove [HTypeKnown] instructions from the graph, to make codegen
- * analysis easier.
- */
+/// Remove [HTypeKnown] instructions from the graph, to make codegen
+/// analysis easier.
 class SsaTypeKnownRemover extends HBaseVisitor {
   void visitGraph(HGraph graph) {
     visitDominatorTree(graph);
@@ -315,10 +366,8 @@
   }
 }
 
-/**
- * Remove [HTypeConversion] instructions from the graph in '--trust-primitives'
- * mode.
- */
+/// Remove [HTypeConversion] instructions from the graph in '--trust-primitives'
+/// mode.
 class SsaTrustedCheckRemover extends HBaseVisitor {
   final CompilerOptions _options;
 
@@ -346,29 +395,25 @@
   }
 }
 
-/**
- * Instead of emitting each SSA instruction with a temporary variable
- * mark instructions that can be emitted at their use-site.
- * For example, in:
- *   t0 = 4;
- *   t1 = 3;
- *   t2 = add(t0, t1);
- * t0 and t1 would be marked and the resulting code would then be:
- *   t2 = add(4, 3);
- */
+/// Instead of emitting each SSA instruction with a temporary variable
+/// mark instructions that can be emitted at their use-site.
+/// For example, in:
+///   t0 = 4;
+///   t1 = 3;
+///   t2 = add(t0, t1);
+/// t0 and t1 would be marked and the resulting code would then be:
+///   t2 = add(4, 3);
 class SsaInstructionMerger extends HBaseVisitor {
   final AbstractValueDomain _abstractValueDomain;
   final SuperMemberData _superMemberData;
-  /**
-   * List of [HInstruction] that the instruction merger expects in
-   * order when visiting the inputs of an instruction.
-   */
+
+  /// List of [HInstruction] that the instruction merger expects in
+  /// order when visiting the inputs of an instruction.
   List<HInstruction> expectedInputs;
-  /**
-   * Set of pure [HInstruction] that the instruction merger expects to
-   * find. The order of pure instructions do not matter, as they will
-   * not be affected by side effects.
-   */
+
+  /// Set of pure [HInstruction] that the instruction merger expects to
+  /// find. The order of pure instructions do not matter, as they will
+  /// not be affected by side effects.
   Set<HInstruction> pureInputs;
   Set<HInstruction> generateAtUseSite;
 
@@ -655,11 +700,9 @@
   }
 }
 
-/**
- *  Detect control flow arising from short-circuit logical and
- *  conditional operators, and prepare the program to be generated
- *  using these operators instead of nested ifs and boolean variables.
- */
+///  Detect control flow arising from short-circuit logical and
+///  conditional operators, and prepare the program to be generated
+///  using these operators instead of nested ifs and boolean variables.
 class SsaConditionMerger extends HGraphVisitor {
   Set<HInstruction> generateAtUseSite;
   Set<HInstruction> controlFlowOperators;
@@ -675,10 +718,8 @@
     visitPostDominatorTree(graph);
   }
 
-  /**
-   * Check if a block has at least one statement other than
-   * [instruction].
-   */
+  /// Check if a block has at least one statement other than
+  /// [instruction].
   bool hasAnyStatement(HBasicBlock block, HInstruction instruction) {
     // If [instruction] is not in [block], then if the block is not
     // empty, we know there will be a statement to emit.
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index 8bafdc8..7b78b8c 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -11,20 +11,19 @@
 import '../elements/entities.dart' show Entity, Local, MemberEntity;
 import '../elements/jumps.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
 import '../io/source_information.dart';
 import '../js_backend/backend.dart';
 import '../js_backend/backend_usage.dart';
 import '../js_backend/constant_handler_javascript.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/inferred_data.dart';
-import '../js_backend/js_interop_analysis.dart';
 import '../js_backend/namer.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/runtime_types.dart';
 import '../js_emitter/code_emitter_task.dart';
 import '../options.dart';
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
 import '../world.dart' show JClosedWorld;
 import 'jump_handler.dart';
 import 'locals_handler.dart';
@@ -84,8 +83,6 @@
 
   RuntimeTypesEncoder get rtiEncoder => backend.rtiEncoder;
 
-  JsInteropAnalysis get jsInteropAnalysis => backend.jsInteropAnalysis;
-
   InferredData get inferredData => globalInferenceResults.inferredData;
 
   DeferredLoadTask get deferredLoadTask => compiler.deferredLoadTask;
@@ -284,8 +281,6 @@
   /// concrete SSA builder reports an error.
   bool getFlagValue(String flagName) {
     switch (flagName) {
-      case 'IS_FULL_EMITTER':
-        return !options.useStartupEmitter;
       case 'MINIFIED':
         return options.enableMinification;
       case 'MUST_RETAIN_METADATA':
diff --git a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
index c32428c..3f5d89b 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
@@ -5,33 +5,31 @@
 import '../common_elements.dart' show CommonElements;
 import '../constants/values.dart';
 import '../elements/entities.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../js_backend/interceptor_data.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
 import 'nodes.dart';
 import 'optimize.dart';
 
-/**
- * This phase simplifies interceptors in multiple ways:
- *
- * 1) If the interceptor is for an object whose type is known, it
- * tries to use a constant interceptor instead.
- *
- * 2) Interceptors are specialized based on the selector it is used with.
- *
- * 3) If we know the object is not intercepted, we just use the object
- * instead.
- *
- * 4) Single use interceptors at dynamic invoke sites are replaced with 'one
- * shot interceptors' which are synthesized static helper functions that fetch
- * the interceptor and then call the method.  This saves code size and makes the
- * receiver of an intercepted call a candidate for being generated at use site.
- *
- * 5) Some HIs operations on an interceptor are replaced with a HIs version that
- * uses 'instanceof' rather than testing a type flag.
- *
- */
+/// This phase simplifies interceptors in multiple ways:
+///
+/// 1) If the interceptor is for an object whose type is known, it
+/// tries to use a constant interceptor instead.
+///
+/// 2) Interceptors are specialized based on the selector it is used with.
+///
+/// 3) If we know the object is not intercepted, we just use the object
+/// instead.
+///
+/// 4) Single use interceptors at dynamic invoke sites are replaced with 'one
+/// shot interceptors' which are synthesized static helper functions that fetch
+/// the interceptor and then call the method.  This saves code size and makes the
+/// receiver of an intercepted call a candidate for being generated at use site.
+///
+/// 5) Some HIs operations on an interceptor are replaced with a HIs version that
+/// uses 'instanceof' rather than testing a type flag.
+///
 class SsaSimplifyInterceptors extends HBaseVisitor
     implements OptimizationPhase {
   final String name = "SsaSimplifyInterceptors";
@@ -92,11 +90,11 @@
 
   bool canUseSelfForInterceptor(HInstruction receiver,
       {Set<ClassEntity> interceptedClasses}) {
-    if (receiver.canBePrimitive(_abstractValueDomain)) {
+    if (receiver.isPrimitive(_abstractValueDomain).isPotentiallyTrue) {
       // Primitives always need interceptors.
       return false;
     }
-    if (receiver.canBeNull(_abstractValueDomain)) {
+    if (receiver.isNull(_abstractValueDomain).isPotentiallyTrue) {
       if (interceptedClasses == null ||
           interceptedClasses.contains(_commonElements.jsNullClass)) {
         // Need the JSNull interceptor.
@@ -106,7 +104,9 @@
 
     // All intercepted classes extend `Interceptor`, so if the receiver can't be
     // a class extending `Interceptor` then it can be called directly.
-    return !_abstractValueDomain.canBeInterceptor(receiver.instructionType);
+    return _abstractValueDomain
+        .isInterceptor(receiver.instructionType)
+        .isDefinitelyFalse;
   }
 
   HInstruction tryComputeConstantInterceptor(
@@ -129,21 +129,21 @@
 
   ClassEntity tryComputeConstantInterceptorFromType(
       AbstractValue type, Set<ClassEntity> interceptedClasses) {
-    if (_abstractValueDomain.canBeNull(type)) {
-      if (_abstractValueDomain.isNull(type)) {
+    if (_abstractValueDomain.isNull(type).isPotentiallyTrue) {
+      if (_abstractValueDomain.isNull(type).isDefinitelyTrue) {
         return _commonElements.jsNullClass;
       }
-    } else if (_abstractValueDomain.isIntegerOrNull(type)) {
+    } else if (_abstractValueDomain.isIntegerOrNull(type).isDefinitelyTrue) {
       return _commonElements.jsIntClass;
-    } else if (_abstractValueDomain.isDoubleOrNull(type)) {
+    } else if (_abstractValueDomain.isDoubleOrNull(type).isDefinitelyTrue) {
       return _commonElements.jsDoubleClass;
-    } else if (_abstractValueDomain.isBooleanOrNull(type)) {
+    } else if (_abstractValueDomain.isBooleanOrNull(type).isDefinitelyTrue) {
       return _commonElements.jsBoolClass;
-    } else if (_abstractValueDomain.isStringOrNull(type)) {
+    } else if (_abstractValueDomain.isStringOrNull(type).isDefinitelyTrue) {
       return _commonElements.jsStringClass;
-    } else if (_abstractValueDomain.isArray(type)) {
+    } else if (_abstractValueDomain.isArray(type).isDefinitelyTrue) {
       return _commonElements.jsArrayClass;
-    } else if (_abstractValueDomain.isNumberOrNull(type) &&
+    } else if (_abstractValueDomain.isNumberOrNull(type).isDefinitelyTrue &&
         !interceptedClasses.contains(_commonElements.jsIntClass) &&
         !interceptedClasses.contains(_commonElements.jsDoubleClass)) {
       // If the method being intercepted is not defined in [int] or [double] we
@@ -302,12 +302,18 @@
     // `NoSuchMethodError`s, and if the receiver was not null we would have a
     // constant interceptor `C`.  Then we can use `(receiver && C)` for the
     // interceptor.
-    if (receiver.canBeNull(_abstractValueDomain)) {
+    if (receiver.isNull(_abstractValueDomain).isPotentiallyTrue) {
       if (!interceptedClasses.contains(_commonElements.jsNullClass)) {
         // Can use `(receiver && C)` only if receiver is either null or truthy.
-        if (!(receiver.canBePrimitiveNumber(_abstractValueDomain) ||
-            receiver.canBePrimitiveBoolean(_abstractValueDomain) ||
-            receiver.canBePrimitiveString(_abstractValueDomain))) {
+        if (!(receiver
+                .isPrimitiveNumber(_abstractValueDomain)
+                .isPotentiallyTrue ||
+            receiver
+                .isPrimitiveBoolean(_abstractValueDomain)
+                .isPotentiallyTrue ||
+            receiver
+                .isPrimitiveString(_abstractValueDomain)
+                .isPotentiallyTrue)) {
           ClassEntity interceptorClass = tryComputeConstantInterceptorFromType(
               _abstractValueDomain.excludeNull(receiver.instructionType),
               interceptedClasses);
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 2128638..18f2ce2 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -7,21 +7,19 @@
 import '../constants/values.dart';
 import '../elements/entities.dart';
 import '../elements/names.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
 import '../options.dart';
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
 import '../universe/call_structure.dart';
 import '../universe/selector.dart';
 import '../world.dart' show JClosedWorld;
 import 'nodes.dart';
 import 'types.dart';
 
-/**
- * [InvokeDynamicSpecializer] and its subclasses are helpers to
- * optimize intercepted dynamic calls. It knows what input types
- * would be beneficial for performance, and how to change a invoke
- * dynamic to a builtin instruction (e.g. HIndex, HBitNot).
- */
+/// [InvokeDynamicSpecializer] and its subclasses are helpers to
+/// optimize intercepted dynamic calls. It knows what input types
+/// would be beneficial for performance, and how to change a invoke
+/// dynamic to a builtin instruction (e.g. HIndex, HBitNot).
 class InvokeDynamicSpecializer {
   const InvokeDynamicSpecializer();
 
@@ -125,11 +123,13 @@
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.inputs[1];
     HInstruction index = instruction.inputs[2];
-    if (!receiver.isMutableIndexable(closedWorld.abstractValueDomain)) {
+    if (receiver
+        .isMutableIndexable(closedWorld.abstractValueDomain)
+        .isPotentiallyFalse) {
       return null;
     }
     // TODO(johnniwinther): Merge this and the following if statement.
-    if (!index.isInteger(closedWorld.abstractValueDomain) &&
+    if (index.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse &&
         options.parameterCheckPolicy.isEmitted) {
       // We want the right checked mode error.
       return null;
@@ -159,9 +159,11 @@
     if (instruction.element != null) {
       ClassEntity cls = instruction.element.enclosingClass;
       if (cls == commonElements.typedArrayOfIntClass) {
-        return value.isInteger(closedWorld.abstractValueDomain);
+        return value
+            .isInteger(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue;
       } else if (cls == commonElements.typedArrayOfDoubleClass) {
-        return value.isNumber(closedWorld.abstractValueDomain);
+        return value.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue;
       }
     }
 
@@ -187,12 +189,15 @@
       CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld) {
-    if (!instruction.inputs[1]
-        .isIndexablePrimitive(closedWorld.abstractValueDomain)) {
+    if (instruction.inputs[1]
+        .isIndexablePrimitive(closedWorld.abstractValueDomain)
+        .isPotentiallyFalse) {
       return null;
     }
     // TODO(johnniwinther): Merge this and the following if statement.
-    if (!instruction.inputs[2].isInteger(closedWorld.abstractValueDomain) &&
+    if (instruction.inputs[2]
+            .isInteger(closedWorld.abstractValueDomain)
+            .isPotentiallyFalse &&
         options.parameterCheckPolicy.isEmitted) {
       // We want the right checked mode error.
       return null;
@@ -221,7 +226,8 @@
     // All bitwise operations on primitive types either produce an
     // integer or throw an error.
     if (instruction.inputs[1]
-        .isPrimitiveOrNull(closedWorld.abstractValueDomain)) {
+        .isPrimitiveOrNull(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.uint32Type;
     }
     return super
@@ -236,7 +242,7 @@
       JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
-    if (input.isNumber(closedWorld.abstractValueDomain)) {
+    if (input.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return new HBitNot(
           input,
           instruction.selector,
@@ -260,13 +266,19 @@
       CompilerOptions options,
       JClosedWorld closedWorld) {
     HInstruction operand = instruction.inputs[1];
-    if (operand.isNumberOrNull(closedWorld.abstractValueDomain)) {
+    if (operand
+        .isNumberOrNull(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       // We have integer subclasses that represent ranges, so widen any int
       // subclass to full integer.
-      if (operand.isIntegerOrNull(closedWorld.abstractValueDomain)) {
+      if (operand
+          .isIntegerOrNull(closedWorld.abstractValueDomain)
+          .isDefinitelyTrue) {
         return closedWorld.abstractValueDomain.intType;
       }
-      if (operand.isDoubleOrNull(closedWorld.abstractValueDomain)) {
+      if (operand
+          .isDoubleOrNull(closedWorld.abstractValueDomain)
+          .isDefinitelyTrue) {
         return closedWorld.abstractValueDomain.doubleType;
       }
       return closedWorld.abstractValueDomain.numType;
@@ -283,7 +295,7 @@
       JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
-    if (input.isNumber(closedWorld.abstractValueDomain)) {
+    if (input.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return new HNegate(
           input,
           instruction.selector,
@@ -307,7 +319,9 @@
       CompilerOptions options,
       JClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
-    if (input.isNumberOrNull(closedWorld.abstractValueDomain)) {
+    if (input
+        .isNumberOrNull(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.excludeNull(input.instructionType);
     }
     return super
@@ -322,7 +336,7 @@
       JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
-    if (input.isNumber(closedWorld.abstractValueDomain)) {
+    if (input.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return new HAbs(
           input,
           instruction.selector,
@@ -343,13 +357,21 @@
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isIntegerOrNull(closedWorld.abstractValueDomain) &&
-        right.isIntegerOrNull(closedWorld.abstractValueDomain)) {
+    if (left
+            .isIntegerOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue &&
+        right
+            .isIntegerOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.intType;
     }
-    if (left.isNumberOrNull(closedWorld.abstractValueDomain)) {
-      if (left.isDoubleOrNull(closedWorld.abstractValueDomain) ||
-          right.isDoubleOrNull(closedWorld.abstractValueDomain)) {
+    if (left.isNumberOrNull(closedWorld.abstractValueDomain).isDefinitelyTrue) {
+      if (left
+              .isDoubleOrNull(closedWorld.abstractValueDomain)
+              .isDefinitelyTrue ||
+          right
+              .isDoubleOrNull(closedWorld.abstractValueDomain)
+              .isDefinitelyTrue) {
         return closedWorld.abstractValueDomain.doubleType;
       }
       return closedWorld.abstractValueDomain.numType;
@@ -359,8 +381,12 @@
   }
 
   bool isBuiltin(HInvokeDynamic instruction, JClosedWorld closedWorld) {
-    return instruction.inputs[1].isNumber(closedWorld.abstractValueDomain) &&
-        instruction.inputs[2].isNumber(closedWorld.abstractValueDomain);
+    return instruction.inputs[1]
+            .isNumber(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue &&
+        instruction.inputs[2]
+            .isNumber(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue;
   }
 
   HInstruction tryConvertToBuiltin(
@@ -386,15 +412,19 @@
       HInstruction instruction, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    return left.isPositiveIntegerOrNull(closedWorld.abstractValueDomain) &&
-        right.isPositiveIntegerOrNull(closedWorld.abstractValueDomain);
+    return left
+            .isPositiveIntegerOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue &&
+        right
+            .isPositiveIntegerOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue;
   }
 
   bool inputsAreUInt31(HInstruction instruction, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    return left.isUInt31(closedWorld.abstractValueDomain) &&
-        right.isUInt31(closedWorld.abstractValueDomain);
+    return left.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue &&
+        right.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue;
   }
 
   HInstruction newBuiltinVariant(
@@ -452,7 +482,7 @@
       CompilerOptions options,
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
-    if (left.isNumberOrNull(closedWorld.abstractValueDomain)) {
+    if (left.isNumberOrNull(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.doubleType;
     }
     return super
@@ -680,11 +710,14 @@
   bool hasUint31Result(HInstruction instruction, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (right.isPositiveInteger(closedWorld.abstractValueDomain)) {
-      if (left.isUInt31(closedWorld.abstractValueDomain) && isNotZero(right)) {
+    if (right
+        .isPositiveInteger(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
+      if (left.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue &&
+          isNotZero(right)) {
         return true;
       }
-      if (left.isUInt32(closedWorld.abstractValueDomain) &&
+      if (left.isUInt32(closedWorld.abstractValueDomain).isDefinitelyTrue &&
           isTwoOrGreater(right)) {
         return true;
       }
@@ -701,7 +734,9 @@
       JClosedWorld closedWorld) {
     HInstruction right = instruction.inputs[2];
     if (isBuiltin(instruction, closedWorld)) {
-      if (right.isPositiveInteger(closedWorld.abstractValueDomain) &&
+      if (right
+              .isPositiveInteger(closedWorld.abstractValueDomain)
+              .isDefinitelyTrue &&
           isNotZero(right)) {
         if (hasUint31Result(instruction, closedWorld)) {
           return newBuiltinVariant(instruction, results, options, closedWorld);
@@ -737,10 +772,10 @@
       GlobalTypeInferenceResults results,
       CompilerOptions options,
       JClosedWorld closedWorld) {
-    // All bitwise operations on primitive types either produce an
+    // All bitwise operations on number types either produce an unsigned 32-bit
     // integer or throw an error.
     HInstruction left = instruction.inputs[1];
-    if (left.isPrimitiveOrNull(closedWorld.abstractValueDomain)) {
+    if (left.isNumberOrNull(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.uint32Type;
     }
     return super
@@ -772,7 +807,9 @@
   bool isPositive(HInstruction instruction, JClosedWorld closedWorld) {
     // TODO: We should use the value range analysis. Currently, ranges
     // are discarded just after the analysis.
-    return instruction.isPositiveInteger(closedWorld.abstractValueDomain);
+    return instruction
+        .isPositiveInteger(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue;
   }
 }
 
@@ -792,7 +829,7 @@
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isNumber(closedWorld.abstractValueDomain)) {
+    if (left.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       if (argumentLessThan32(right)) {
         return newBuiltinVariant(instruction, results, options, closedWorld);
       }
@@ -830,8 +867,9 @@
       CompilerOptions options,
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
-    if (left.isUInt32(closedWorld.abstractValueDomain))
+    if (left.isUInt32(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return left.instructionType;
+    }
     return super
         .computeTypeFromInputTypes(instruction, results, options, closedWorld);
   }
@@ -845,7 +883,7 @@
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isNumber(closedWorld.abstractValueDomain)) {
+    if (left.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       if (argumentLessThan32(right) && isPositive(left, closedWorld)) {
         return newBuiltinVariant(instruction, results, options, closedWorld);
       }
@@ -857,7 +895,7 @@
         instruction.selector = renameToOptimizedSelector(
             '_shrBothPositive', instruction.selector, commonElements);
       } else if (isPositive(left, closedWorld) &&
-          right.isNumber(closedWorld.abstractValueDomain)) {
+          right.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
         instruction.selector = renameToOptimizedSelector(
             '_shrReceiverPositive', instruction.selector, commonElements);
       } else if (isPositive(right, closedWorld)) {
@@ -899,8 +937,8 @@
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isUInt31(closedWorld.abstractValueDomain) &&
-        right.isUInt31(closedWorld.abstractValueDomain)) {
+    if (left.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue &&
+        right.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.uint31Type;
     }
     return super
@@ -934,9 +972,11 @@
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isPrimitiveOrNull(closedWorld.abstractValueDomain) &&
-        (left.isUInt31(closedWorld.abstractValueDomain) ||
-            right.isUInt31(closedWorld.abstractValueDomain))) {
+    if (left
+            .isPrimitiveOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue &&
+        (left.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue ||
+            right.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue)) {
       return closedWorld.abstractValueDomain.uint31Type;
     }
     return super
@@ -970,8 +1010,8 @@
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isUInt31(closedWorld.abstractValueDomain) &&
-        right.isUInt31(closedWorld.abstractValueDomain)) {
+    if (left.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue &&
+        right.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.uint31Type;
     }
     return super
@@ -1000,7 +1040,8 @@
       CompilerOptions options,
       JClosedWorld closedWorld) {
     if (instruction.inputs[1]
-        .isPrimitiveOrNull(closedWorld.abstractValueDomain)) {
+        .isPrimitiveOrNull(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.boolType;
     }
     return super
@@ -1016,8 +1057,8 @@
       JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
-    if (left.isNumber(closedWorld.abstractValueDomain) &&
-        right.isNumber(closedWorld.abstractValueDomain)) {
+    if (left.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue &&
+        right.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return newBuiltinVariant(instruction, closedWorld);
     }
     return null;
@@ -1041,7 +1082,9 @@
     HInstruction right = instruction.inputs[2];
     AbstractValue instructionType = left.instructionType;
     if (right.isConstantNull() ||
-        left.isPrimitiveOrNull(closedWorld.abstractValueDomain)) {
+        left
+            .isPrimitiveOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue) {
       return newBuiltinVariant(instruction, closedWorld);
     }
     if (closedWorld.includesClosureCall(
@@ -1144,13 +1187,16 @@
     // TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index
     // bounds checking optimizations as for HIndex.
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
-    if (receiver.isStringOrNull(closedWorld.abstractValueDomain)) {
+    if (receiver
+        .isStringOrNull(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       // Even if there is no builtin equivalent instruction, we know
       // String.codeUnitAt does not have any side effect (other than throwing),
       // and that it can be GVN'ed.
       clearAllSideEffects(instruction);
       if (instruction.inputs.last
-          .isPositiveInteger(closedWorld.abstractValueDomain)) {
+          .isPositiveInteger(closedWorld.abstractValueDomain)
+          .isDefinitelyTrue) {
         instruction.selector = renameToOptimizedSelector(
             '_codeUnitAt', instruction.selector, commonElements);
       }
@@ -1172,15 +1218,27 @@
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
     // `compareTo` has no side-effect (other than throwing) and can be GVN'ed
     // for some known types.
-    if (receiver.isStringOrNull(closedWorld.abstractValueDomain) ||
-        receiver.isNumberOrNull(closedWorld.abstractValueDomain)) {
+    if (receiver
+            .isStringOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue ||
+        receiver
+            .isNumberOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue) {
       // Replace `a.compareTo(a)` with `0`, but only if receiver and argument
       // are such that no exceptions can be thrown.
       HInstruction argument = instruction.inputs.last;
-      if ((receiver.isNumber(closedWorld.abstractValueDomain) &&
-              argument.isNumber(closedWorld.abstractValueDomain)) ||
-          (receiver.isString(closedWorld.abstractValueDomain) &&
-              argument.isString(closedWorld.abstractValueDomain))) {
+      if ((receiver
+                  .isNumber(closedWorld.abstractValueDomain)
+                  .isDefinitelyTrue &&
+              argument
+                  .isNumber(closedWorld.abstractValueDomain)
+                  .isDefinitelyTrue) ||
+          (receiver
+                  .isString(closedWorld.abstractValueDomain)
+                  .isDefinitelyTrue &&
+              argument
+                  .isString(closedWorld.abstractValueDomain)
+                  .isDefinitelyTrue)) {
         if (identical(receiver.nonCheck(), argument.nonCheck())) {
           return graph.addConstantInt(0, closedWorld);
         }
@@ -1202,7 +1260,9 @@
       JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
-    if (receiver.isStringOrNull(closedWorld.abstractValueDomain)) {
+    if (receiver
+        .isStringOrNull(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       // String.xxx does not have any side effect (other than throwing), and it
       // can be GVN'ed.
       clearAllSideEffects(instruction);
@@ -1231,8 +1291,12 @@
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
     HInstruction pattern = instruction.inputs[2];
-    if (receiver.isStringOrNull(closedWorld.abstractValueDomain) &&
-        pattern.isStringOrNull(closedWorld.abstractValueDomain)) {
+    if (receiver
+            .isStringOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue &&
+        pattern
+            .isStringOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue) {
       // String.contains(String s) does not have any side effect (other than
       // throwing), and it can be GVN'ed.
       clearAllSideEffects(instruction);
@@ -1256,7 +1320,9 @@
       JCommonElements commonElements,
       JClosedWorld closedWorld) {
     HInstruction receiver = instruction.getDartReceiver(closedWorld);
-    if (receiver.isNumberOrNull(closedWorld.abstractValueDomain)) {
+    if (receiver
+        .isNumberOrNull(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       // Even if there is no builtin equivalent instruction, we know the
       // instruction does not have any side effect, and that it can be GVN'ed.
       clearAllSideEffects(instruction);
diff --git a/pkg/compiler/lib/src/ssa/kernel_string_builder.dart b/pkg/compiler/lib/src/ssa/kernel_string_builder.dart
index 3b52451..e30817c 100644
--- a/pkg/compiler/lib/src/ssa/kernel_string_builder.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_string_builder.dart
@@ -33,7 +33,7 @@
     //      conversions.
     //   2. The value can be primitive, because the library stringifier has
     //      fast-path code for most primitives.
-    if (expression.canBePrimitive(builder.abstractValueDomain)) {
+    if (expression.isPrimitive(builder.abstractValueDomain).isPotentiallyTrue) {
       append(stringify(expression));
       return;
     }
diff --git a/pkg/compiler/lib/src/ssa/locals_handler.dart b/pkg/compiler/lib/src/ssa/locals_handler.dart
index 57f2d1d..ff3ec93 100644
--- a/pkg/compiler/lib/src/ssa/locals_handler.dart
+++ b/pkg/compiler/lib/src/ssa/locals_handler.dart
@@ -6,13 +6,13 @@
 import '../common.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
 import '../io/source_information.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_model/closure.dart' show JRecordField, JClosureField;
 import '../js_model/locals.dart' show JLocal;
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
 import '../world.dart' show JClosedWorld;
 
 import 'graph_builder.dart';
@@ -202,7 +202,7 @@
 
     parameters.forEach((Local local, AbstractValue typeMask) {
       if (isGenerativeConstructorBody) {
-        if (scopeData.isBoxed(local)) {
+        if (scopeData.isBoxedVariable(local)) {
           // The parameter will be a field in the box passed as the
           // last parameter. So no need to have it.
           return;
diff --git a/pkg/compiler/lib/src/ssa/logging.dart b/pkg/compiler/lib/src/ssa/logging.dart
new file mode 100644
index 0000000..c213791
--- /dev/null
+++ b/pkg/compiler/lib/src/ssa/logging.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'nodes.dart';
+import '../util/features.dart';
+
+/// Log used for unit testing optimizations.
+class OptimizationLog {
+  List<OptimizationLogEntry> entries = [];
+
+  void registerFieldGet(HInvokeDynamicGetter node, HFieldGet fieldGet) {
+    Features features = new Features();
+    features['name'] =
+        '${fieldGet.element.enclosingClass.name}.${fieldGet.element.name}';
+    entries.add(new OptimizationLogEntry('FieldGet', features));
+  }
+
+  void registerFieldSet(HInvokeDynamicSetter node, HFieldSet fieldSet) {
+    Features features = new Features();
+    features['name'] =
+        '${fieldSet.element.enclosingClass.name}.${fieldSet.element.name}';
+    entries.add(new OptimizationLogEntry('FieldSet', features));
+  }
+
+  String getText() {
+    return entries.join(',\n');
+  }
+}
+
+/// A registered optimization.
+class OptimizationLogEntry {
+  /// String that uniquely identifies the optimization kind.
+  final String tag;
+
+  /// Additional data for this optimization.
+  final Features features;
+
+  OptimizationLogEntry(this.tag, this.features);
+
+  String toString() => '$tag(${features.getText()})';
+}
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index b3c93c2..dc693ef 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -13,11 +13,11 @@
 import '../elements/entities.dart';
 import '../elements/jumps.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
 import '../js_backend/js_backend.dart';
-import '../native/native.dart' as native;
-import '../types/abstract_value_domain.dart';
+import '../native/behavior.dart';
 import '../universe/selector.dart' show Selector;
 import '../universe/side_effects.dart' show SideEffects;
 import '../util/util.dart';
@@ -510,7 +510,7 @@
 class SubExpression extends SubGraph {
   const SubExpression(HBasicBlock start, HBasicBlock end) : super(start, end);
 
-  /** Find the condition expression if this sub-expression is a condition. */
+  /// Find the condition expression if this sub-expression is a condition.
   HInstruction get conditionExpression {
     HInstruction last = end.last;
     if (last is HConditionalBranch || last is HSwitch) return last.inputs[0];
@@ -580,7 +580,7 @@
     detach(instruction);
   }
 
-  /** Linear search for [instruction]. */
+  /// Linear search for [instruction].
   bool contains(HInstruction instruction) {
     HInstruction cursor = first;
     while (cursor != null) {
@@ -760,10 +760,8 @@
     }
   }
 
-  /**
-   * Rewrites all uses of the [from] instruction to using the [to]
-   * instruction instead.
-   */
+  /// Rewrites all uses of the [from] instruction to using the [to]
+  /// instruction instead.
   void rewrite(HInstruction from, HInstruction to) {
     for (HInstruction use in from.usedBy) {
       use.rewriteInput(from, to);
@@ -772,11 +770,9 @@
     from.usedBy.clear();
   }
 
-  /**
-   * Rewrites all uses of the [from] instruction to using either the
-   * [to] instruction, or a [HCheck] instruction that has better type
-   * information on [to], and that dominates the user.
-   */
+  /// Rewrites all uses of the [from] instruction to using either the
+  /// [to] instruction, or a [HCheck] instruction that has better type
+  /// information on [to], and that dominates the user.
   void rewriteWithBetterUser(HInstruction from, HInstruction to) {
     // BUG(11841): Turn this method into a phase to be run after GVN phases.
     Link<HCheck> better = const Link<HCheck>();
@@ -992,11 +988,9 @@
 
   bool get isMovable => useGvn();
 
-  /**
-   * A pure instruction is an instruction that does not have any side
-   * effect, nor any dependency. They can be moved anywhere in the
-   * graph.
-   */
+  /// A pure instruction is an instruction that does not have any side
+  /// effect, nor any dependency. They can be moved anywhere in the
+  /// graph.
   bool isPure(AbstractValueDomain domain) {
     return !sideEffects.hasSideEffects() &&
         !sideEffects.dependsOnSomething() &&
@@ -1021,92 +1015,91 @@
   bool isValue(AbstractValueDomain domain) =>
       domain.isPrimitiveValue(instructionType);
 
-  bool canBeNull(AbstractValueDomain domain) =>
-      domain.canBeNull(instructionType);
+  AbstractBool isNull(AbstractValueDomain domain) =>
+      domain.isNull(instructionType);
 
-  bool isNull(AbstractValueDomain domain) => domain.isNull(instructionType);
-
-  bool isConflicting(AbstractValueDomain domain) =>
+  AbstractBool isConflicting(AbstractValueDomain domain) =>
       domain.isEmpty(instructionType);
 
-  bool canBePrimitive(AbstractValueDomain domain) =>
-      domain.canBePrimitive(instructionType);
-
-  bool canBePrimitiveNumber(AbstractValueDomain domain) =>
-      domain.canBePrimitiveNumber(instructionType);
-
-  bool canBePrimitiveBoolean(AbstractValueDomain domain) =>
-      domain.canBePrimitiveBoolean(instructionType);
-
-  bool canBePrimitiveArray(AbstractValueDomain domain) =>
-      domain.canBePrimitiveArray(instructionType);
-
-  bool isIndexablePrimitive(AbstractValueDomain domain) =>
-      domain.isIndexablePrimitive(instructionType);
-
-  bool isFixedArray(AbstractValueDomain domain) =>
-      domain.isFixedArray(instructionType);
-
-  bool isExtendableArray(AbstractValueDomain domain) =>
-      domain.isExtendableArray(instructionType);
-
-  bool isMutableArray(AbstractValueDomain domain) =>
-      domain.isMutableArray(instructionType);
-
-  bool isMutableIndexable(AbstractValueDomain domain) =>
-      domain.isMutableIndexable(instructionType);
-
-  bool isArray(AbstractValueDomain domain) => domain.isArray(instructionType);
-
-  bool canBePrimitiveString(AbstractValueDomain domain) =>
-      domain.canBePrimitiveString(instructionType);
-
-  bool isInteger(AbstractValueDomain domain) =>
-      domain.isInteger(instructionType);
-
-  bool isUInt32(AbstractValueDomain domain) => domain.isUInt32(instructionType);
-
-  bool isUInt31(AbstractValueDomain domain) => domain.isUInt31(instructionType);
-
-  bool isPositiveInteger(AbstractValueDomain domain) =>
-      domain.isPositiveInteger(instructionType);
-
-  bool isPositiveIntegerOrNull(AbstractValueDomain domain) =>
-      domain.isPositiveIntegerOrNull(instructionType);
-
-  bool isIntegerOrNull(AbstractValueDomain domain) =>
-      domain.isIntegerOrNull(instructionType);
-
-  bool isNumber(AbstractValueDomain domain) => domain.isNumber(instructionType);
-
-  bool isNumberOrNull(AbstractValueDomain domain) =>
-      domain.isNumberOrNull(instructionType);
-
-  bool isDouble(AbstractValueDomain domain) => domain.isDouble(instructionType);
-
-  bool isDoubleOrNull(AbstractValueDomain domain) =>
-      domain.isDoubleOrNull(instructionType);
-
-  bool isBoolean(AbstractValueDomain domain) =>
-      domain.isBoolean(instructionType);
-
-  bool isBooleanOrNull(AbstractValueDomain domain) =>
-      domain.isBooleanOrNull(instructionType);
-
-  bool isString(AbstractValueDomain domain) => domain.isString(instructionType);
-
-  bool isStringOrNull(AbstractValueDomain domain) =>
-      domain.isStringOrNull(instructionType);
-
-  bool isPrimitive(AbstractValueDomain domain) =>
+  AbstractBool isPrimitive(AbstractValueDomain domain) =>
       domain.isPrimitive(instructionType);
 
-  bool isPrimitiveOrNull(AbstractValueDomain domain) =>
+  AbstractBool isPrimitiveNumber(AbstractValueDomain domain) =>
+      domain.isPrimitiveNumber(instructionType);
+
+  AbstractBool isPrimitiveBoolean(AbstractValueDomain domain) =>
+      domain.isPrimitiveBoolean(instructionType);
+
+  AbstractBool isPrimitiveArray(AbstractValueDomain domain) =>
+      domain.isPrimitiveArray(instructionType);
+
+  AbstractBool isIndexablePrimitive(AbstractValueDomain domain) =>
+      domain.isIndexablePrimitive(instructionType);
+
+  AbstractBool isFixedArray(AbstractValueDomain domain) =>
+      domain.isFixedArray(instructionType);
+
+  AbstractBool isExtendableArray(AbstractValueDomain domain) =>
+      domain.isExtendableArray(instructionType);
+
+  AbstractBool isMutableArray(AbstractValueDomain domain) =>
+      domain.isMutableArray(instructionType);
+
+  AbstractBool isMutableIndexable(AbstractValueDomain domain) =>
+      domain.isMutableIndexable(instructionType);
+
+  AbstractBool isArray(AbstractValueDomain domain) =>
+      domain.isArray(instructionType);
+
+  AbstractBool isPrimitiveString(AbstractValueDomain domain) =>
+      domain.isPrimitiveString(instructionType);
+
+  AbstractBool isInteger(AbstractValueDomain domain) =>
+      domain.isInteger(instructionType);
+
+  AbstractBool isUInt32(AbstractValueDomain domain) =>
+      domain.isUInt32(instructionType);
+
+  AbstractBool isUInt31(AbstractValueDomain domain) =>
+      domain.isUInt31(instructionType);
+
+  AbstractBool isPositiveInteger(AbstractValueDomain domain) =>
+      domain.isPositiveInteger(instructionType);
+
+  AbstractBool isPositiveIntegerOrNull(AbstractValueDomain domain) =>
+      domain.isPositiveIntegerOrNull(instructionType);
+
+  AbstractBool isIntegerOrNull(AbstractValueDomain domain) =>
+      domain.isIntegerOrNull(instructionType);
+
+  AbstractBool isNumber(AbstractValueDomain domain) =>
+      domain.isNumber(instructionType);
+
+  AbstractBool isNumberOrNull(AbstractValueDomain domain) =>
+      domain.isNumberOrNull(instructionType);
+
+  AbstractBool isDouble(AbstractValueDomain domain) =>
+      domain.isDouble(instructionType);
+
+  AbstractBool isDoubleOrNull(AbstractValueDomain domain) =>
+      domain.isDoubleOrNull(instructionType);
+
+  AbstractBool isBoolean(AbstractValueDomain domain) =>
+      domain.isBoolean(instructionType);
+
+  AbstractBool isBooleanOrNull(AbstractValueDomain domain) =>
+      domain.isBooleanOrNull(instructionType);
+
+  AbstractBool isString(AbstractValueDomain domain) =>
+      domain.isString(instructionType);
+
+  AbstractBool isStringOrNull(AbstractValueDomain domain) =>
+      domain.isStringOrNull(instructionType);
+
+  AbstractBool isPrimitiveOrNull(AbstractValueDomain domain) =>
       domain.isPrimitiveOrNull(instructionType);
 
-  /**
-   * Type of the instruction.
-   */
+  /// Type of the instruction.
   AbstractValue instructionType;
 
   Selector get selector => null;
@@ -1184,7 +1177,7 @@
     }
   }
 
-  /** Removes all occurrences of [instruction] from [list]. */
+  /// Removes all occurrences of [instruction] from [list].
   void removeFromList(List<HInstruction> list, HInstruction instruction) {
     int length = list.length;
     int i = 0;
@@ -1199,7 +1192,7 @@
     list.length = length;
   }
 
-  /** Removes all occurrences of [user] from [usedBy]. */
+  /// Removes all occurrences of [user] from [usedBy].
   void removeUser(HInstruction user) {
     removeFromList(usedBy, user);
   }
@@ -1279,7 +1272,7 @@
     if (type.isDynamic) return this;
     if (type.isVoid) return this;
     if (type == closedWorld.commonElements.objectType) return this;
-    if (type.isFunctionType || type.isMalformed || type.isFutureOr) {
+    if (type.isFunctionType || type.isFutureOr) {
       return new HTypeConversion(type, kind,
           closedWorld.abstractValueDomain.dynamicType, this, sourceInformation);
     }
@@ -1298,10 +1291,8 @@
     }
   }
 
-  /**
-   * Return whether the instructions do not belong to a loop or
-   * belong to the same loop.
-   */
+  /// Return whether the instructions do not belong to a loop or
+  /// belong to the same loop.
   bool hasSameLoopHeaderAs(HInstruction other) {
     return block.enclosingLoopHeader == other.block.enclosingLoopHeader;
   }
@@ -1328,7 +1319,7 @@
   /// dominated block. (There can be many such edges on a single phi at the exit
   /// of a loop with many break statements).  If [excludePhiOutEdges] is `true`
   /// then these edge uses are not included.
-  static of(HInstruction source, HInstruction dominator,
+  static DominatedUses of(HInstruction source, HInstruction dominator,
       {bool excludeDominator: false, bool excludePhiOutEdges: false}) {
     return new DominatedUses._(source)
       .._compute(source, dominator, excludeDominator, excludePhiOutEdges);
@@ -1465,10 +1456,8 @@
   String toString() => 'HRef(${value})';
 }
 
-/**
- * Late instructions are used after the main optimization phases.  They capture
- * codegen decisions just prior to generating JavaScript.
- */
+/// Late instructions are used after the main optimization phases.  They capture
+/// codegen decisions just prior to generating JavaScript.
 abstract class HLateInstruction extends HInstruction {
   HLateInstruction(List<HInstruction> inputs, AbstractValue type)
       : super(inputs, type);
@@ -1487,13 +1476,11 @@
   bool dataEquals(HInstruction other) => true;
 }
 
-/**
- * A [HCheck] instruction is an instruction that might do a dynamic
- * check at runtime on another instruction. To have proper instruction
- * dependencies in the graph, instructions that depend on the check
- * being done reference the [HCheck] instruction instead of the
- * instruction itself.
- */
+/// A [HCheck] instruction is an instruction that might do a dynamic
+/// check at runtime on another instruction. To have proper instruction
+/// dependencies in the graph, instructions that depend on the check
+/// being done reference the [HCheck] instruction instead of the
+/// instruction itself.
 abstract class HCheck extends HInstruction {
   HCheck(inputs, type) : super(inputs, type) {
     setUseGvn();
@@ -1511,10 +1498,9 @@
   static const int ALWAYS_ABOVE_ZERO = 2;
   static const int ALWAYS_BELOW_LENGTH = 3;
   static const int ALWAYS_TRUE = 4;
-  /**
-   * Details which tests have been done statically during compilation.
-   * Default is that all checks must be performed dynamically.
-   */
+
+  /// Details which tests have been done statically during compilation.
+  /// Default is that all checks must be performed dynamically.
   int staticChecks = FULL_CHECK;
 
   HBoundsCheck(length, index, array, type)
@@ -1643,9 +1629,7 @@
   /// The type arguments passed in this dynamic invocation.
   List<DartType> get typeArguments;
 
-  /**
-   * Returns whether this call is on an interceptor object.
-   */
+  /// Returns whether this call is on an interceptor object.
   bool isCallOnInterceptor(JClosedWorld closedWorld) {
     return isInterceptedCall && receiver.isInterceptor(closedWorld);
   }
@@ -1727,13 +1711,18 @@
   List<DartType> get typeArguments => const <DartType>[];
 
   // There might be an interceptor input, so `inputs.last` is the dart receiver.
-  bool canThrow(AbstractValueDomain domain) =>
-      isTearOff ? inputs.last.canBeNull(domain) : super.canThrow(domain);
+  bool canThrow(AbstractValueDomain domain) => isTearOff
+      ? inputs.last.isNull(domain).isPotentiallyTrue
+      : super.canThrow(domain);
 
   String toString() => 'invoke dynamic getter: selector=$selector, mask=$mask';
 }
 
 class HInvokeDynamicSetter extends HInvokeDynamicField {
+  /// If `true` a call to the setter is needed for checking the type even
+  /// though the target field is known.
+  bool needsCheck = false;
+
   HInvokeDynamicSetter(
       Selector selector,
       AbstractValue mask,
@@ -1750,7 +1739,8 @@
 
   List<DartType> get typeArguments => const <DartType>[];
 
-  String toString() => 'invoke dynamic setter: selector=$selector, mask=$mask';
+  String toString() =>
+      'invoke dynamic setter: selector=$selector, mask=$mask, element=$element';
 }
 
 class HInvokeStatic extends HInvoke {
@@ -1769,7 +1759,7 @@
   /// type arguments. See also [SsaFromAstMixin.currentInlinedInstantiations].
   List<InterfaceType> instantiatedTypes;
 
-  /** The first input must be the target. */
+  /// The first input must be the target.
   HInvokeStatic(this.element, inputs, AbstractValue type, this.typeArguments,
       {this.targetCanThrow: true, bool isIntercepted: false})
       : super(inputs, type) {
@@ -1784,7 +1774,7 @@
 }
 
 class HInvokeSuper extends HInvokeStatic {
-  /** The class where the call to super is being done. */
+  /// The class where the call to super is being done.
   final ClassEntity caller;
   final bool isSetter;
   final Selector selector;
@@ -1809,9 +1799,7 @@
     return isCallOnInterceptor(closedWorld) ? inputs[1] : inputs[0];
   }
 
-  /**
-   * Returns whether this call is on an interceptor object.
-   */
+  /// Returns whether this call is on an interceptor object.
   bool isCallOnInterceptor(JClosedWorld closedWorld) {
     return isInterceptedCall && receiver.isInterceptor(closedWorld);
   }
@@ -1900,7 +1888,8 @@
     return false;
   }
 
-  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
+  bool canThrow(AbstractValueDomain domain) =>
+      receiver.isNull(domain).isPotentiallyTrue;
 
   HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
@@ -1911,7 +1900,7 @@
   int typeCode() => HInstruction.FIELD_GET_TYPECODE;
   bool typeEquals(other) => other is HFieldGet;
   bool dataEquals(HFieldGet other) => element == other.element;
-  String toString() => "FieldGet $element";
+  String toString() => "FieldGet(element=$element,type=$instructionType)";
 }
 
 class HFieldSet extends HFieldAccess {
@@ -1923,7 +1912,8 @@
     sideEffects.setChangesInstanceProperty();
   }
 
-  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
+  bool canThrow(AbstractValueDomain domain) =>
+      receiver.isNull(domain).isPotentiallyTrue;
 
   HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
@@ -1932,7 +1922,7 @@
   accept(HVisitor visitor) => visitor.visitFieldSet(this);
 
   bool isJsStatement() => true;
-  String toString() => "FieldSet $element";
+  String toString() => "FieldSet(element=$element,type=$instructionType)";
 }
 
 class HGetLength extends HInstruction {
@@ -1951,7 +1941,8 @@
 
   HInstruction get receiver => inputs.single;
 
-  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
+  bool canThrow(AbstractValueDomain domain) =>
+      receiver.isNull(domain).isPotentiallyTrue;
 
   HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
@@ -1964,10 +1955,8 @@
   String toString() => "GetLength()";
 }
 
-/**
- * HReadModifyWrite is a late stage instruction for a field (property) update
- * via an assignment operation or pre- or post-increment.
- */
+/// HReadModifyWrite is a late stage instruction for a field (property) update
+/// via an assignment operation or pre- or post-increment.
 class HReadModifyWrite extends HLateInstruction {
   static const ASSIGN_OP = 0;
   static const PRE_OP = 1;
@@ -2004,7 +1993,8 @@
   bool get isPostOp => opKind == POST_OP;
   bool get isAssignOp => opKind == ASSIGN_OP;
 
-  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
+  bool canThrow(AbstractValueDomain domain) =>
+      receiver.isNull(domain).isPotentiallyTrue;
 
   HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
@@ -2055,7 +2045,7 @@
   HForeign(AbstractValue type, List<HInstruction> inputs) : super(inputs, type);
 
   bool get isStatement => false;
-  native.NativeBehavior get nativeBehavior => null;
+  NativeBehavior get nativeBehavior => null;
 
   bool canThrow(AbstractValueDomain domain) {
     return sideEffects.hasSideEffects() || sideEffects.dependsOnSomething();
@@ -2065,15 +2055,15 @@
 class HForeignCode extends HForeign {
   final js.Template codeTemplate;
   final bool isStatement;
-  final native.NativeBehavior nativeBehavior;
-  native.NativeThrowBehavior throwBehavior;
+  final NativeBehavior nativeBehavior;
+  NativeThrowBehavior throwBehavior;
   final FunctionEntity foreignFunction;
 
   HForeignCode(this.codeTemplate, AbstractValue type, List<HInstruction> inputs,
       {this.isStatement: false,
       SideEffects effects,
-      native.NativeBehavior nativeBehavior,
-      native.NativeThrowBehavior throwBehavior,
+      NativeBehavior nativeBehavior,
+      NativeThrowBehavior throwBehavior,
       this.foreignFunction})
       : this.nativeBehavior = nativeBehavior,
         this.throwBehavior = throwBehavior,
@@ -2084,7 +2074,7 @@
     }
     if (this.throwBehavior == null) {
       this.throwBehavior = (nativeBehavior == null)
-          ? native.NativeThrowBehavior.MAY
+          ? NativeThrowBehavior.MAY
           : nativeBehavior.throwBehavior;
     }
     assert(this.throwBehavior != null);
@@ -2095,12 +2085,8 @@
     }
   }
 
-  HForeignCode.statement(
-      js.Template codeTemplate,
-      List<HInstruction> inputs,
-      SideEffects effects,
-      native.NativeBehavior nativeBehavior,
-      AbstractValue type)
+  HForeignCode.statement(js.Template codeTemplate, List<HInstruction> inputs,
+      SideEffects effects, NativeBehavior nativeBehavior, AbstractValue type)
       : this(codeTemplate, type, inputs,
             isStatement: true,
             effects: effects,
@@ -2111,7 +2097,7 @@
   bool isJsStatement() => isStatement;
   bool canThrow(AbstractValueDomain domain) {
     if (inputs.length > 0) {
-      return inputs.first.canBeNull(domain)
+      return inputs.first.isNull(domain).isPotentiallyTrue
           ? throwBehavior.canThrow
           : throwBehavior.onNonNull.canThrow;
     }
@@ -2123,7 +2109,7 @@
   bool isAllocation(AbstractValueDomain domain) =>
       nativeBehavior != null &&
       nativeBehavior.isAllocation &&
-      !canBeNull(domain);
+      isNull(domain).isDefinitelyFalse;
 
   int typeCode() => HInstruction.FOREIGN_CODE_TYPECODE;
   bool typeEquals(other) => other is HForeignCode;
@@ -2235,11 +2221,9 @@
   bool dataEquals(HInstruction other) => true;
 }
 
-/**
- * An [HSwitch] instruction has one input for the incoming
- * value, and one input per constant that it can switch on.
- * Its block has one successor per constant, and one for the default.
- */
+/// An [HSwitch] instruction has one input for the incoming
+/// value, and one input per constant that it can switch on.
+/// Its block has one successor per constant, and one for the default.
 class HSwitch extends HControlFlow {
   HSwitch(AbstractValueDomain domain, List<HInstruction> inputs)
       : super(domain, inputs);
@@ -2247,11 +2231,9 @@
   HConstant constant(int index) => inputs[index + 1];
   HInstruction get expression => inputs[0];
 
-  /**
-   * Provides the target to jump to if none of the constants match
-   * the expression. If the switch had no default case, this is the
-   * following join-block.
-   */
+  /// Provides the target to jump to if none of the constants match
+  /// the expression. If the switch had no default case, this is the
+  /// following join-block.
   HBasicBlock get defaultTarget => block.successors.last;
 
   accept(HVisitor visitor) => visitor.visitSwitch(this);
@@ -2544,11 +2526,9 @@
   bool dataEquals(HInstruction other) => true;
 }
 
-/**
-  * An [HLocalValue] represents a local. Unlike [HParameterValue]s its
-  * first use must be in an HLocalSet. That is, [HParameterValue]s have a
-  * value from the start, whereas [HLocalValue]s need to be initialized first.
-  */
+/// An [HLocalValue] represents a local. Unlike [HParameterValue]s its
+/// first use must be in an HLocalSet. That is, [HParameterValue]s have a
+/// value from the start, whereas [HLocalValue]s need to be initialized first.
 class HLocalValue extends HInstruction {
   HLocalValue(Entity variable, AbstractValue type)
       : super(<HInstruction>[], type) {
@@ -2816,18 +2796,17 @@
   }
 }
 
-/**
- * A "one-shot" interceptor is a call to a synthetized method that
- * will fetch the interceptor of its first parameter, and make a call
- * on a given selector with the remaining parameters.
- *
- * In order to share the same optimizations with regular interceptor
- * calls, this class extends [HInvokeDynamic] and also has the null
- * constant as the first input.
- */
+/// A "one-shot" interceptor is a call to a synthetized method that
+/// will fetch the interceptor of its first parameter, and make a call
+/// on a given selector with the remaining parameters.
+///
+/// In order to share the same optimizations with regular interceptor
+/// calls, this class extends [HInvokeDynamic] and also has the null
+/// constant as the first input.
 class HOneShotInterceptor extends HInvokeDynamic {
   List<DartType> typeArguments;
   Set<ClassEntity> interceptedClasses;
+
   HOneShotInterceptor(
       AbstractValueDomain domain,
       Selector selector,
@@ -2838,7 +2817,7 @@
       this.interceptedClasses)
       : super(selector, mask, null, inputs, true, type) {
     assert(inputs[0] is HConstant);
-    assert(inputs[0].isNull(domain));
+    assert(inputs[0].instructionType == domain.nullType);
     assert(selector.callStructure.typeArgumentCount == typeArguments.length);
   }
   bool isCallOnInterceptor(JClosedWorld closedWorld) => true;
@@ -2847,7 +2826,7 @@
   accept(HVisitor visitor) => visitor.visitOneShotInterceptor(this);
 }
 
-/** An [HLazyStatic] is a static that is initialized lazily at first read. */
+/// An [HLazyStatic] is a static that is initialized lazily at first read.
 class HLazyStatic extends HInstruction {
   final FieldEntity element;
 
@@ -2896,10 +2875,8 @@
   bool isAllocation(AbstractValueDomain domain) => true;
 }
 
-/**
- * The primitive array indexing operation. Note that this instruction
- * does not throw because we generate the checks explicitly.
- */
+/// The primitive array indexing operation. Note that this instruction
+/// does not throw because we generate the checks explicitly.
 class HIndex extends HInstruction {
   final Selector selector;
   HIndex(HInstruction receiver, HInstruction index, this.selector,
@@ -2923,17 +2900,16 @@
 
   HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
-  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
+  bool canThrow(AbstractValueDomain domain) =>
+      receiver.isNull(domain).isPotentiallyTrue;
 
   int typeCode() => HInstruction.INDEX_TYPECODE;
   bool typeEquals(HInstruction other) => other is HIndex;
   bool dataEquals(HIndex other) => true;
 }
 
-/**
- * The primitive array assignment operation. Note that this instruction
- * does not throw because we generate the checks explicitly.
- */
+/// The primitive array assignment operation. Note that this instruction
+/// does not throw because we generate the checks explicitly.
 class HIndexAssign extends HInstruction {
   final Selector selector;
   HIndexAssign(AbstractValueDomain domain, HInstruction receiver,
@@ -2956,7 +2932,8 @@
 
   HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
   bool onlyThrowsNSM() => true;
-  bool canThrow(AbstractValueDomain domain) => receiver.canBeNull(domain);
+  bool canThrow(AbstractValueDomain domain) =>
+      receiver.isNull(domain).isPotentiallyTrue;
 }
 
 class HIs extends HInstruction {
@@ -3055,11 +3032,9 @@
   }
 }
 
-/**
- * HIsViaInterceptor is a late-stage instruction for a type test that can be
- * done entirely on an interceptor.  It is not a HCheck because the checked
- * input is not one of the inputs.
- */
+/// HIsViaInterceptor is a late-stage instruction for a type test that can be
+/// done entirely on an interceptor.  It is not a HCheck because the checked
+/// input is not one of the inputs.
 class HIsViaInterceptor extends HLateInstruction {
   final DartType typeExpression;
   HIsViaInterceptor(
@@ -3124,6 +3099,7 @@
         super(<HInstruction>[input], type) {
     assert(!isReceiverTypeCheck || receiverTypeCheckSelector != null);
     assert(typeExpression == null || !typeExpression.isTypedef);
+    assert(!isControlFlow() || typeExpression != null);
     sourceElement = input.sourceElement;
     this.sourceInformation = sourceInformation;
   }
@@ -3198,36 +3174,39 @@
     AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
     DartType type = typeExpression;
     if (type != null) {
-      if (type.isMalformed) {
-        // Malformed types are treated as dynamic statically, but should
-        // throw a type error at runtime.
-        return false;
-      }
       if (type.isTypeVariable) {
         return false;
       }
       if (type.isFutureOr) {
         // `null` always passes type conversion.
-        if (checkedInput.isNull(abstractValueDomain)) return true;
+        if (checkedInput.isNull(abstractValueDomain).isDefinitelyTrue) {
+          return true;
+        }
         // TODO(johnniwinther): Optimize FutureOr type conversions.
         return false;
       }
       if (!type.treatAsRaw) {
         // `null` always passes type conversion.
-        if (checkedInput.isNull(abstractValueDomain)) return true;
+        if (checkedInput.isNull(abstractValueDomain).isDefinitelyTrue) {
+          return true;
+        }
         return false;
       }
       if (type.isFunctionType) {
         // `null` always passes type conversion.
-        if (checkedInput.isNull(abstractValueDomain)) return true;
+        if (checkedInput.isNull(abstractValueDomain).isDefinitelyTrue) {
+          return true;
+        }
         // TODO(johnniwinther): Optimize function type conversions.
         return false;
       }
     }
     // Type is refined from `dynamic`, so it might become non-redundant.
-    if (abstractValueDomain.containsAll(checkedType)) return false;
+    if (abstractValueDomain.containsAll(checkedType).isPotentiallyTrue) {
+      return false;
+    }
     AbstractValue inputType = checkedInput.instructionType;
-    return abstractValueDomain.isIn(inputType, checkedType);
+    return abstractValueDomain.isIn(inputType, checkedType).isDefinitelyTrue;
   }
 
   String toString() => 'HTypeConversion(type=$typeExpression, kind=$kind, '
@@ -3274,9 +3253,11 @@
 
   bool isRedundant(JClosedWorld closedWorld) {
     AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
-    if (abstractValueDomain.containsAll(knownType)) return false;
+    if (abstractValueDomain.containsAll(knownType).isPotentiallyTrue) {
+      return false;
+    }
     AbstractValue inputType = checkedInput.instructionType;
-    return abstractValueDomain.isIn(inputType, knownType);
+    return abstractValueDomain.isIn(inputType, knownType).isDefinitelyTrue;
   }
 }
 
@@ -3307,10 +3288,8 @@
   toString() => "string concat";
 }
 
-/**
- * The part of string interpolation which converts and interpolated expression
- * into a String value.
- */
+/// The part of string interpolation which converts and interpolated expression
+/// into a String value.
 class HStringify extends HInstruction {
   HStringify(HInstruction input, AbstractValue type)
       : super(<HInstruction>[input], type) {
@@ -3322,7 +3301,7 @@
   toString() => "stringify";
 }
 
-/** Non-block-based (aka. traditional) loop information. */
+/// Non-block-based (aka. traditional) loop information.
 class HLoopInformation {
   final HBasicBlock header;
   final List<HBasicBlock> blocks;
@@ -3330,7 +3309,7 @@
   final List<LabelDefinition> labels;
   final JumpTarget target;
 
-  /** Corresponding block information for the loop. */
+  /// Corresponding block information for the loop.
   HLoopBlockInformation loopBlockInformation;
 
   HLoopInformation(this.header, this.target, this.labels)
@@ -3363,37 +3342,29 @@
   }
 }
 
-/**
- * Embedding of a [HBlockInformation] for block-structure based traversal
- * in a dominator based flow traversal by attaching it to a basic block.
- * To go back to dominator-based traversal, a [HSubGraphBlockInformation]
- * structure can be added in the block structure.
- */
+/// Embedding of a [HBlockInformation] for block-structure based traversal
+/// in a dominator based flow traversal by attaching it to a basic block.
+/// To go back to dominator-based traversal, a [HSubGraphBlockInformation]
+/// structure can be added in the block structure.
 class HBlockFlow {
   final HBlockInformation body;
   final HBasicBlock continuation;
   HBlockFlow(this.body, this.continuation);
 }
 
-/**
- * Information about a syntactic-like structure.
- */
+/// Information about a syntactic-like structure.
 abstract class HBlockInformation {
   HBasicBlock get start;
   HBasicBlock get end;
   bool accept(HBlockInformationVisitor visitor);
 }
 
-/**
- * Information about a statement-like structure.
- */
+/// Information about a statement-like structure.
 abstract class HStatementInformation extends HBlockInformation {
   bool accept(HStatementInformationVisitor visitor);
 }
 
-/**
- * Information about an expression-like structure.
- */
+/// Information about an expression-like structure.
 abstract class HExpressionInformation extends HBlockInformation {
   bool accept(HExpressionInformationVisitor visitor);
   HInstruction get conditionExpression;
@@ -3419,10 +3390,8 @@
 abstract class HBlockInformationVisitor
     implements HStatementInformationVisitor, HExpressionInformationVisitor {}
 
-/**
- * Generic class wrapping a [SubGraph] as a block-information until
- * all structures are handled properly.
- */
+/// Generic class wrapping a [SubGraph] as a block-information until
+/// all structures are handled properly.
 class HSubGraphBlockInformation implements HStatementInformation {
   final SubGraph subGraph;
   HSubGraphBlockInformation(this.subGraph);
@@ -3434,10 +3403,8 @@
       visitor.visitSubGraphInfo(this);
 }
 
-/**
- * Generic class wrapping a [SubExpression] as a block-information until
- * expressions structures are handled properly.
- */
+/// Generic class wrapping a [SubExpression] as a block-information until
+/// expressions structures are handled properly.
 class HSubExpressionBlockInformation implements HExpressionInformation {
   final SubExpression subExpression;
   HSubExpressionBlockInformation(this.subExpression);
@@ -3451,7 +3418,7 @@
       visitor.visitSubExpressionInfo(this);
 }
 
-/** A sequence of separate statements. */
+/// A sequence of separate statements.
 class HStatementSequenceInformation implements HStatementInformation {
   final List<HStatementInformation> statements;
   HStatementSequenceInformation(this.statements);
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 104c919..40917cf 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import '../common.dart';
 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
 import '../common/names.dart' show Selectors;
 import '../common/tasks.dart' show CompilerTask;
@@ -11,21 +12,22 @@
 import '../common_elements.dart' show JCommonElements;
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
 import '../js/js.dart' as js;
 import '../js_backend/allocator_analysis.dart' show JAllocatorAnalysis;
 import '../js_backend/backend.dart';
 import '../js_backend/native_data.dart' show NativeData;
 import '../js_backend/runtime_types.dart';
-import '../native/native.dart' as native;
+import '../native/behavior.dart';
 import '../options.dart';
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
 import '../universe/selector.dart' show Selector;
 import '../universe/side_effects.dart' show SideEffects;
 import '../universe/use.dart' show StaticUse;
 import '../util/util.dart';
 import '../world.dart' show JClosedWorld;
 import 'interceptor_simplifier.dart';
+import 'logging.dart';
 import 'nodes.dart';
 import 'types.dart';
 import 'types_propagation.dart';
@@ -42,6 +44,8 @@
 
   Map<HInstruction, Range> ranges = <HInstruction, Range>{};
 
+  Map<MemberEntity, OptimizationLog> loggersForTesting;
+
   SsaOptimizerTask(this._backend) : super(_backend.compiler.measurer);
 
   String get name => 'SSA optimizer';
@@ -65,12 +69,19 @@
     Set<HInstruction> boundsChecked = new Set<HInstruction>();
     SsaCodeMotion codeMotion;
     SsaLoadElimination loadElimination;
+
+    OptimizationLog log;
+    if (retainDataForTesting) {
+      loggersForTesting ??= {};
+      loggersForTesting[work.element] = log = new OptimizationLog();
+    }
+
     measure(() {
       List<OptimizationPhase> phases = <OptimizationPhase>[
         // Run trivial instruction simplification first to optimize
         // some patterns useful for type conversion.
         new SsaInstructionSimplifier(globalInferenceResults, _options,
-            _rtiSubstitutions, closedWorld, registry),
+            _rtiSubstitutions, closedWorld, registry, log),
         new SsaTypeConversionInserter(closedWorld),
         new SsaRedundantPhiEliminator(),
         new SsaDeadPhiEliminator(),
@@ -79,10 +90,10 @@
         // After type propagation, more instructions can be
         // simplified.
         new SsaInstructionSimplifier(globalInferenceResults, _options,
-            _rtiSubstitutions, closedWorld, registry),
+            _rtiSubstitutions, closedWorld, registry, log),
         new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
         new SsaInstructionSimplifier(globalInferenceResults, _options,
-            _rtiSubstitutions, closedWorld, registry),
+            _rtiSubstitutions, closedWorld, registry, log),
         new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
         new SsaTypePropagator(globalInferenceResults, _options,
             closedWorld.commonElements, closedWorld),
@@ -108,7 +119,7 @@
         // Previous optimizations may have generated new
         // opportunities for instruction simplification.
         new SsaInstructionSimplifier(globalInferenceResults, _options,
-            _rtiSubstitutions, closedWorld, registry),
+            _rtiSubstitutions, closedWorld, registry, log),
         new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
       ];
       phases.forEach(runPhase);
@@ -131,7 +142,7 @@
           new SsaCodeMotion(closedWorld.abstractValueDomain),
           new SsaValueRangeAnalyzer(closedWorld, this),
           new SsaInstructionSimplifier(globalInferenceResults, _options,
-              _rtiSubstitutions, closedWorld, registry),
+              _rtiSubstitutions, closedWorld, registry, log),
           new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
           new SsaSimplifyInterceptors(closedWorld, work.element.enclosingClass),
           new SsaDeadCodeEliminator(closedWorld, this),
@@ -143,7 +154,7 @@
           // Run the simplifier to remove unneeded type checks inserted by
           // type propagation.
           new SsaInstructionSimplifier(globalInferenceResults, _options,
-              _rtiSubstitutions, closedWorld, registry),
+              _rtiSubstitutions, closedWorld, registry, log),
         ];
       }
       phases.forEach(runPhase);
@@ -155,25 +166,24 @@
 /// cannot change.  The current implementation is conservative for the purpose
 /// of identifying gvn-able lengths and mis-identifies some unions of fixed
 /// length indexables (see TODO) as not fixed length.
-bool isFixedLength(mask, JClosedWorld closedWorld) {
-  if (mask.isContainer && mask.length != null) {
+bool isFixedLength(AbstractValue mask, JClosedWorld closedWorld) {
+  AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+  if (abstractValueDomain.isContainer(mask) &&
+      abstractValueDomain.getContainerLength(mask) != null) {
     // A container on which we have inferred the length.
     return true;
   }
   // TODO(sra): Recognize any combination of fixed length indexables.
-  if (mask.containsOnly(closedWorld.commonElements.jsFixedArrayClass) ||
-      mask.containsOnly(closedWorld.commonElements.jsUnmodifiableArrayClass) ||
-      mask.containsOnlyString(closedWorld) ||
-      closedWorld.abstractValueDomain.isTypedArray(mask)) {
+  if (abstractValueDomain.isFixedArray(mask).isDefinitelyTrue ||
+      abstractValueDomain.isStringOrNull(mask).isDefinitelyTrue ||
+      abstractValueDomain.isTypedArray(mask).isDefinitelyTrue) {
     return true;
   }
   return false;
 }
 
-/**
- * If both inputs to known operations are available execute the operation at
- * compile-time.
- */
+/// If both inputs to known operations are available execute the operation at
+/// compile-time.
 class SsaInstructionSimplifier extends HBaseVisitor
     implements OptimizationPhase {
   // We don't produce constant-folded strings longer than this unless they have
@@ -187,10 +197,11 @@
   final RuntimeTypesSubstitutions _rtiSubstitutions;
   final JClosedWorld _closedWorld;
   final CodegenRegistry _registry;
+  final OptimizationLog _log;
   HGraph _graph;
 
   SsaInstructionSimplifier(this._globalInferenceResults, this._options,
-      this._rtiSubstitutions, this._closedWorld, this._registry);
+      this._rtiSubstitutions, this._closedWorld, this._registry, this._log);
 
   JCommonElements get commonElements => _closedWorld.commonElements;
 
@@ -207,6 +218,7 @@
   }
 
   visitBasicBlock(HBasicBlock block) {
+    simplifyPhis(block);
     HInstruction instruction = block.first;
     while (instruction != null) {
       HInstruction next = instruction.next;
@@ -219,8 +231,12 @@
         // might be that an operation thought to return double, can be
         // simplified to an int. For example:
         // `2.5 * 10`.
-        if (!(replacement.isNumberOrNull(_abstractValueDomain) &&
-            instruction.isNumberOrNull(_abstractValueDomain))) {
+        if (!(replacement
+                .isNumberOrNull(_abstractValueDomain)
+                .isDefinitelyTrue &&
+            instruction
+                .isNumberOrNull(_abstractValueDomain)
+                .isDefinitelyTrue)) {
           // If we can replace [instruction] with [replacement], then
           // [replacement]'s type can be narrowed.
           AbstractValue newType = _abstractValueDomain.intersection(
@@ -248,13 +264,134 @@
     }
   }
 
+  // Simplify some CFG diamonds to equivalent expressions.
+  simplifyPhis(HBasicBlock block) {
+    // Is [block] the join point for a simple diamond that generates a single
+    // phi node?
+    if (block.phis.isEmpty) return;
+    HPhi phi = block.phis.first;
+    if (phi.next != null) return;
+    if (block.predecessors.length != 2) return;
+    assert(phi.inputs.length == 2);
+    HBasicBlock b1 = block.predecessors[0];
+    HBasicBlock b2 = block.predecessors[1];
+    HBasicBlock dominator = block.dominator;
+    if (!(b1.dominator == dominator && b2.dominator == dominator)) return;
+
+    // Extract the controlling condition.
+    HInstruction controlFlow = dominator.last;
+    if (controlFlow is! HIf) return;
+    HInstruction test = controlFlow.inputs.single;
+    if (test.usedBy.length > 1) return;
+
+    bool negated = false;
+    while (test is HNot) {
+      test = test.inputs.single;
+      if (test.usedBy.length > 1) return;
+      negated = !negated;
+    }
+
+    if (test is! HIdentity) return;
+    HInstruction tested;
+    if (test.inputs[0].isNull(_abstractValueDomain).isDefinitelyTrue) {
+      tested = test.inputs[1];
+    } else if (test.inputs[1].isNull(_abstractValueDomain).isDefinitelyTrue) {
+      tested = test.inputs[0];
+    } else {
+      return;
+    }
+
+    HInstruction whenNullValue = phi.inputs[negated ? 1 : 0];
+    HInstruction whenNotNullValue = phi.inputs[negated ? 0 : 1];
+    HBasicBlock whenNullBlock = block.predecessors[negated ? 1 : 0];
+    HBasicBlock whenNotNullBlock = block.predecessors[negated ? 0 : 1];
+
+    // If 'x' is nullable boolean,
+    //
+    //     x == null ? false : x  --->  x == true
+    //
+    // This ofen comes from the dart code `x ?? false`.
+    if (_sameOrRefinementOf(tested, whenNotNullValue) &&
+        _isBoolConstant(whenNullValue, false) &&
+        whenNotNullValue
+            .isBooleanOrNull(_abstractValueDomain)
+            .isDefinitelyTrue &&
+        _mostlyEmpty(whenNullBlock) &&
+        _mostlyEmpty(whenNotNullBlock)) {
+      HInstruction trueConstant = _graph.addConstantBool(true, _closedWorld);
+      HInstruction replacement = new HIdentity(
+          tested, trueConstant, null, _abstractValueDomain.boolType)
+        ..sourceElement = phi.sourceElement
+        ..sourceInformation = phi.sourceInformation;
+      block.rewrite(phi, replacement);
+      block.addAtEntry(replacement);
+      block.removePhi(phi);
+      return;
+    }
+    // If 'x'is nullable boolean,
+    //
+    //     x == null ? true : x  --->  !(x == false)
+    //
+    // This ofen comes from the dart code `x ?? true`.
+    if (_sameOrRefinementOf(tested, whenNotNullValue) &&
+        _isBoolConstant(whenNullValue, true) &&
+        whenNotNullValue
+            .isBooleanOrNull(_abstractValueDomain)
+            .isDefinitelyTrue &&
+        _mostlyEmpty(whenNullBlock) &&
+        _mostlyEmpty(whenNotNullBlock)) {
+      HInstruction falseConstant = _graph.addConstantBool(false, _closedWorld);
+      HInstruction compare = new HIdentity(
+          tested, falseConstant, null, _abstractValueDomain.boolType);
+      block.addAtEntry(compare);
+      HInstruction replacement =
+          new HNot(compare, _abstractValueDomain.boolType)
+            ..sourceElement = phi.sourceElement
+            ..sourceInformation = phi.sourceInformation;
+      block.rewrite(phi, replacement);
+      block.addAfter(compare, replacement);
+      block.removePhi(phi);
+      return;
+    }
+
+    // TODO(sra): Consider other simple diamonds, e.g. with the addition of a special instruction,
+    //
+    //     s == null ? "" : s  --->  s || "".
+    return;
+  }
+
+  bool _isBoolConstant(HInstruction node, bool value) {
+    if (node is HConstant) {
+      ConstantValue c = node.constant;
+      if (c is BoolConstantValue) {
+        return c.boolValue == value;
+      }
+    }
+    return false;
+  }
+
+  bool _sameOrRefinementOf(HInstruction base, HInstruction insn) {
+    if (base == insn) return true;
+    if (insn is HTypeKnown) return _sameOrRefinementOf(base, insn.checkedInput);
+    return false;
+  }
+
+  bool _mostlyEmpty(HBasicBlock block) {
+    for (HInstruction insn = block.first; insn != null; insn = insn.next) {
+      if (insn is HTypeKnown) continue;
+      if (insn is HGoto) return true;
+      return false;
+    }
+    return true;
+  }
+
   HInstruction visitInstruction(HInstruction node) {
     return node;
   }
 
   ConstantValue getConstantFromType(HInstruction node) {
     if (node.isValue(_abstractValueDomain) &&
-        !node.canBeNull(_abstractValueDomain)) {
+        node.isNull(_abstractValueDomain).isDefinitelyFalse) {
       ConstantValue value =
           _abstractValueDomain.getPrimitiveValue(node.instructionType);
       if (value.isBool) {
@@ -305,17 +442,23 @@
     List<HInstruction> inputs = node.inputs;
     assert(inputs.length == 1);
     HInstruction input = inputs[0];
-    if (input.isBoolean(_abstractValueDomain)) return input;
+    if (input.isBoolean(_abstractValueDomain).isDefinitelyTrue) {
+      return input;
+    }
 
     // If the code is unreachable, remove the HBoolify.  This can happen when
     // there is a throw expression in a short-circuit conditional.  Removing the
     // unreachable HBoolify makes it easier to reconstruct the short-circuit
     // operation.
-    if (_abstractValueDomain.isEmpty(input.instructionType)) return input;
+    if (_abstractValueDomain.isEmpty(input.instructionType).isDefinitelyTrue) {
+      return input;
+    }
 
     // All values that cannot be 'true' are boolified to false.
     AbstractValue mask = input.instructionType;
-    if (!_abstractValueDomain.containsType(mask, commonElements.jsBoolClass)) {
+    if (_abstractValueDomain
+        .containsType(mask, commonElements.jsBoolClass)
+        .isPotentiallyFalse) {
       return _graph.addConstantBool(false, _closedWorld);
     }
     return node;
@@ -352,7 +495,9 @@
 
   HInstruction tryOptimizeLengthInterceptedGetter(HInvokeDynamic node) {
     HInstruction actualReceiver = node.inputs[1];
-    if (actualReceiver.isIndexablePrimitive(_abstractValueDomain)) {
+    if (actualReceiver
+        .isIndexablePrimitive(_abstractValueDomain)
+        .isDefinitelyTrue) {
       if (actualReceiver.isConstantString()) {
         HConstant constantInput = actualReceiver;
         StringConstantValue constant = constantInput.constant;
@@ -367,11 +512,13 @@
       AbstractValue actualType = node.instructionType;
       AbstractValue resultType = _abstractValueDomain.positiveIntType;
       // If we already have computed a more specific type, keep that type.
-      if (_abstractValueDomain.isInstanceOfOrNull(
-          actualType, commonElements.jsUInt31Class)) {
+      if (_abstractValueDomain
+          .isInstanceOfOrNull(actualType, commonElements.jsUInt31Class)
+          .isDefinitelyTrue) {
         resultType = _abstractValueDomain.uint31Type;
-      } else if (_abstractValueDomain.isInstanceOfOrNull(
-          actualType, commonElements.jsUInt32Class)) {
+      } else if (_abstractValueDomain
+          .isInstanceOfOrNull(actualType, commonElements.jsUInt32Class)
+          .isDefinitelyTrue) {
         resultType = _abstractValueDomain.uint32Type;
       }
       HGetLength result =
@@ -412,12 +559,14 @@
     bool applies(MemberEntity element) {
       return selector.applies(element) &&
           (mask == null ||
-              _abstractValueDomain.canHit(mask, element, selector));
+              _abstractValueDomain
+                  .isTargetingMember(mask, element, selector.memberName)
+                  .isPotentiallyTrue);
     }
 
     if (selector.isCall || selector.isOperator) {
       FunctionEntity target;
-      if (input.isExtendableArray(_abstractValueDomain)) {
+      if (input.isExtendableArray(_abstractValueDomain).isDefinitelyTrue) {
         if (applies(commonElements.jsArrayRemoveLast)) {
           target = commonElements.jsArrayRemoveLast;
         } else if (applies(commonElements.jsArrayAdd)) {
@@ -428,7 +577,7 @@
             target = commonElements.jsArrayAdd;
           }
         }
-      } else if (input.isStringOrNull(_abstractValueDomain)) {
+      } else if (input.isStringOrNull(_abstractValueDomain).isDefinitelyTrue) {
         if (commonElements.appliesToJsStringSplit(
             selector, mask, _abstractValueDomain)) {
           return handleStringSplit(node);
@@ -437,12 +586,12 @@
           // make sure the receiver and the argument are not null.
           // TODO(sra): Do this via [node.specializer].
           HInstruction argument = node.inputs[2];
-          if (argument.isString(_abstractValueDomain) &&
-              !input.canBeNull(_abstractValueDomain)) {
+          if (argument.isString(_abstractValueDomain).isDefinitelyTrue &&
+              input.isNull(_abstractValueDomain).isDefinitelyFalse) {
             return new HStringConcat(input, argument, node.instructionType);
           }
         } else if (applies(commonElements.jsStringToString) &&
-            !input.canBeNull(_abstractValueDomain)) {
+            input.isNull(_abstractValueDomain).isDefinitelyFalse) {
           return input;
         }
       }
@@ -478,7 +627,9 @@
 
   HInstruction handleStringSplit(HInvokeDynamic node) {
     HInstruction argument = node.inputs[2];
-    if (!argument.isString(_abstractValueDomain)) return node;
+    if (!argument.isString(_abstractValueDomain).isDefinitelyTrue) {
+      return node;
+    }
 
     // Replace `s.split$1(pattern)` with
     //
@@ -652,8 +803,7 @@
 
     // Strengthen instruction type from annotations to help optimize
     // dependent instructions.
-    native.NativeBehavior nativeBehavior =
-        _nativeData.getNativeMethodBehavior(method);
+    NativeBehavior nativeBehavior = _nativeData.getNativeMethodBehavior(method);
     AbstractValue returnType =
         AbstractValueFactory.fromNativeBehavior(nativeBehavior, _closedWorld);
     HInvokeDynamicMethod result = new HInvokeDynamicMethod(
@@ -670,7 +820,9 @@
 
   HInstruction visitBoundsCheck(HBoundsCheck node) {
     HInstruction index = node.index;
-    if (index.isInteger(_abstractValueDomain)) return node;
+    if (index.isInteger(_abstractValueDomain).isDefinitelyTrue) {
+      return node;
+    }
     if (index.isConstant()) {
       HConstant constantInstruction = index;
       assert(!constantInstruction.constant.isInt);
@@ -698,8 +850,8 @@
     HInstruction right = node.right;
     // We can only perform this rewriting on Integer, as it is not
     // valid for -0.0.
-    if (left.isInteger(_abstractValueDomain) &&
-        right.isInteger(_abstractValueDomain)) {
+    if (left.isInteger(_abstractValueDomain).isDefinitelyTrue &&
+        right.isInteger(_abstractValueDomain).isDefinitelyTrue) {
       if (left is HConstant && left.constant.isZero) return right;
       if (right is HConstant && right.constant.isZero) return left;
     }
@@ -709,8 +861,8 @@
   HInstruction visitMultiply(HMultiply node) {
     HInstruction left = node.left;
     HInstruction right = node.right;
-    if (left.isNumber(_abstractValueDomain) &&
-        right.isNumber(_abstractValueDomain)) {
+    if (left.isNumber(_abstractValueDomain).isDefinitelyTrue &&
+        right.isNumber(_abstractValueDomain).isDefinitelyTrue) {
       if (left is HConstant && left.constant.isOne) return right;
       if (right is HConstant && right.constant.isOne) return left;
     }
@@ -756,15 +908,17 @@
 
     // Intersection of int and double return conflicting, so
     // we don't optimize on numbers to preserve the runtime semantics.
-    if (!(left.isNumberOrNull(_abstractValueDomain) &&
-        right.isNumberOrNull(_abstractValueDomain))) {
-      if (_abstractValueDomain.areDisjoint(leftType, rightType)) {
+    if (!(left.isNumberOrNull(_abstractValueDomain).isDefinitelyTrue &&
+        right.isNumberOrNull(_abstractValueDomain).isDefinitelyTrue)) {
+      if (_abstractValueDomain
+          .areDisjoint(leftType, rightType)
+          .isDefinitelyTrue) {
         return makeFalse();
       }
     }
 
-    if (left.isNull(_abstractValueDomain) &&
-        right.isNull(_abstractValueDomain)) {
+    if (left.isNull(_abstractValueDomain).isDefinitelyTrue &&
+        right.isNull(_abstractValueDomain).isDefinitelyTrue) {
       return makeTrue();
     }
 
@@ -776,11 +930,13 @@
       }
     }
 
-    if (left.isConstantBoolean() && right.isBoolean(_abstractValueDomain)) {
+    if (left.isConstantBoolean() &&
+        right.isBoolean(_abstractValueDomain).isDefinitelyTrue) {
       return compareConstant(left, right);
     }
 
-    if (right.isConstantBoolean() && left.isBoolean(_abstractValueDomain)) {
+    if (right.isConstantBoolean() &&
+        left.isBoolean(_abstractValueDomain).isDefinitelyTrue) {
       return compareConstant(right, left);
     }
 
@@ -789,8 +945,12 @@
       // dart2js runtime has not always been consistent with the Dart
       // specification (section 16.0.1), which makes distinctions on NaNs and
       // -0.0 that are hard to implement efficiently.
-      if (left.isIntegerOrNull(_abstractValueDomain)) return makeTrue();
-      if (!left.canBePrimitiveNumber(_abstractValueDomain)) return makeTrue();
+      if (left.isIntegerOrNull(_abstractValueDomain).isDefinitelyTrue) {
+        return makeTrue();
+      }
+      if (left.isPrimitiveNumber(_abstractValueDomain).isDefinitelyFalse) {
+        return makeTrue();
+      }
     }
 
     return null;
@@ -822,7 +982,7 @@
     // This is mostly harmless (if a little confusing) but does cause a lot of
     // `x = false;` copies to be inserted when a loop body has many continue
     // statements or ends with a switch.
-    var uses =
+    DominatedUses uses =
         DominatedUses.of(condition, block.first, excludePhiOutEdges: true);
     if (uses.isEmpty) return;
     uses.replaceWith(_graph.addConstantBool(value, _closedWorld));
@@ -872,7 +1032,7 @@
     InterfaceType interfaceType = type;
     ClassEntity element = interfaceType.element;
     HInstruction expression = node.expression;
-    if (expression.isInteger(_abstractValueDomain)) {
+    if (expression.isInteger(_abstractValueDomain).isDefinitelyTrue) {
       if (element == commonElements.intClass ||
           element == commonElements.numClass ||
           commonElements.isNumberOrStringSupertype(element)) {
@@ -884,7 +1044,7 @@
       } else {
         return _graph.addConstantBool(false, _closedWorld);
       }
-    } else if (expression.isDouble(_abstractValueDomain)) {
+    } else if (expression.isDouble(_abstractValueDomain).isDefinitelyTrue) {
       if (element == commonElements.doubleClass ||
           element == commonElements.numClass ||
           commonElements.isNumberOrStringSupertype(element)) {
@@ -897,14 +1057,16 @@
       } else {
         return _graph.addConstantBool(false, _closedWorld);
       }
-    } else if (expression.isNumber(_abstractValueDomain)) {
+    } else if (expression.isNumber(_abstractValueDomain).isDefinitelyTrue) {
       if (element == commonElements.numClass) {
         return _graph.addConstantBool(true, _closedWorld);
       } else {
         // We cannot just return false, because the expression may be of
         // type int or double.
       }
-    } else if (expression.canBePrimitiveNumber(_abstractValueDomain) &&
+    } else if (expression
+            .isPrimitiveNumber(_abstractValueDomain)
+            .isPotentiallyTrue &&
         element == commonElements.intClass) {
       // We let the JS semantics decide for that check.
       return node;
@@ -916,9 +1078,9 @@
       AbstractValue expressionMask = expression.instructionType;
       AbstractBool isInstanceOf =
           _abstractValueDomain.isInstanceOf(expressionMask, element);
-      if (isInstanceOf == AbstractBool.True) {
+      if (isInstanceOf.isDefinitelyTrue) {
         return _graph.addConstantBool(true, _closedWorld);
-      } else if (isInstanceOf == AbstractBool.False) {
+      } else if (isInstanceOf.isDefinitelyFalse) {
         return _graph.addConstantBool(false, _closedWorld);
       }
     }
@@ -951,9 +1113,12 @@
   }
 
   FieldEntity findConcreteFieldForDynamicAccess(
-      HInstruction receiver, Selector selector) {
+      HInvokeDynamicField node, HInstruction receiver) {
     AbstractValue receiverType = receiver.instructionType;
-    return _closedWorld.locateSingleField(selector, receiverType);
+    MemberEntity member = node.element is FieldEntity
+        ? node.element
+        : _closedWorld.locateSingleMember(node.selector, receiverType);
+    return member is FieldEntity ? member : null;
   }
 
   HInstruction visitFieldGet(HFieldGet node) {
@@ -978,23 +1143,30 @@
   }
 
   HInstruction visitGetLength(HGetLength node) {
-    dynamic receiver = node.receiver;
+    HInstruction receiver = node.receiver;
     if (_graph.allocatedFixedLists.contains(receiver)) {
       // TODO(ngeoffray): checking if the second input is an integer
       // should not be necessary but it currently makes it easier for
       // other optimizations to reason about a fixed length constructor
       // that we know takes an int.
-      if (receiver.inputs[0].isInteger(_abstractValueDomain)) {
+      if (receiver.inputs[0].isInteger(_abstractValueDomain).isDefinitelyTrue) {
         return receiver.inputs[0];
       }
-    } else if (receiver.isConstantList() || receiver.isConstantString()) {
-      return _graph.addConstantInt(receiver.constant.length, _closedWorld);
+    } else if (receiver.isConstantList()) {
+      HConstant constantReceiver = receiver;
+      ListConstantValue constant = constantReceiver.constant;
+      return _graph.addConstantInt(constant.length, _closedWorld);
+    } else if (receiver.isConstantString()) {
+      HConstant constantReceiver = receiver;
+      StringConstantValue constant = constantReceiver.constant;
+      return _graph.addConstantInt(constant.length, _closedWorld);
     } else {
-      dynamic type = receiver.instructionType;
-      if (type.isContainer && type.length != null) {
-        HInstruction constant =
-            _graph.addConstantInt(type.length, _closedWorld);
-        if (type.isNullable) {
+      AbstractValue type = receiver.instructionType;
+      if (_abstractValueDomain.isContainer(type) &&
+          _abstractValueDomain.getContainerLength(type) != null) {
+        HInstruction constant = _graph.addConstantInt(
+            _abstractValueDomain.getContainerLength(type), _closedWorld);
+        if (_abstractValueDomain.isNull(type).isPotentiallyTrue) {
           // If the container can be null, we update all uses of the length
           // access to use the constant instead, but keep the length access in
           // the graph, to ensure we still have a null check.
@@ -1038,27 +1210,30 @@
       if (folded != node) return folded;
     }
     HInstruction receiver = node.getDartReceiver(_closedWorld);
-    FieldEntity field =
-        findConcreteFieldForDynamicAccess(receiver, node.selector);
-    if (field != null) return directFieldGet(receiver, field);
+    FieldEntity field = node.element is FieldEntity
+        ? node.element
+        : findConcreteFieldForDynamicAccess(node, receiver);
+    if (field != null) {
+      HFieldGet result = _directFieldGet(receiver, field, node);
+      _log?.registerFieldGet(node, result);
+      return result;
+    }
 
-    if (node.element == null) {
-      MemberEntity element = _closedWorld.locateSingleMember(
-          node.selector, receiver.instructionType);
-      if (element != null && element.name == node.selector.name) {
-        node.element = element;
-        if (element.isFunction) {
-          // A property extraction getter, aka a tear-off.
-          node.sideEffects.clearAllDependencies();
-          node.sideEffects.clearAllSideEffects();
-          node.setUseGvn(); // We don't care about identity of tear-offs.
-        }
-      }
+    node.element ??= _closedWorld.locateSingleMember(
+        node.selector, receiver.instructionType);
+    if (node.element != null &&
+        node.element.name == node.selector.name &&
+        node.element.isFunction) {
+      // A property extraction getter, aka a tear-off.
+      node.sideEffects.clearAllDependencies();
+      node.sideEffects.clearAllSideEffects();
+      node.setUseGvn(); // We don't care about identity of tear-offs.
     }
     return node;
   }
 
-  HInstruction directFieldGet(HInstruction receiver, FieldEntity field) {
+  HInstruction _directFieldGet(
+      HInstruction receiver, FieldEntity field, HInstruction node) {
     bool isAssignable = !_closedWorld.fieldNeverChanges(field);
 
     AbstractValue type;
@@ -1066,13 +1241,18 @@
       type = AbstractValueFactory.fromNativeBehavior(
           _nativeData.getNativeFieldLoadBehavior(field), _closedWorld);
     } else {
+      // TODO(johnniwinther): Use the potentially more precise type of the
+      // node + find a test that shows its usefulness.
+      // type = _abstractValueDomain.intersection(
+      //     node.instructionType,
+      //     AbstractValueFactory.inferredTypeForMember(
+      //         field, _globalInferenceResults));
       type = AbstractValueFactory.inferredTypeForMember(
-          // ignore: UNNECESSARY_CAST
-          field as Entity,
-          _globalInferenceResults);
+          field, _globalInferenceResults);
     }
 
-    return new HFieldGet(field, receiver, type, isAssignable: isAssignable);
+    return new HFieldGet(field, receiver, type, isAssignable: isAssignable)
+      ..sourceInformation = node.sourceInformation;
   }
 
   HInstruction visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
@@ -1082,8 +1262,7 @@
     }
 
     HInstruction receiver = node.getDartReceiver(_closedWorld);
-    FieldEntity field =
-        findConcreteFieldForDynamicAccess(receiver, node.selector);
+    FieldEntity field = findConcreteFieldForDynamicAccess(node, receiver);
     if (field == null || !field.isAssignable) return node;
     // Use `node.inputs.last` in case the call follows the interceptor calling
     // convention, but is not a call on an interceptor.
@@ -1098,6 +1277,7 @@
         // inline this access.
         // TODO(sra): If the input is such that we don't need a type check, we
         // can skip the test an generate the HFieldSet.
+        node.needsCheck = true;
         return node;
       }
       HInstruction other = value.convertType(
@@ -1107,7 +1287,11 @@
         value = other;
       }
     }
-    return new HFieldSet(_abstractValueDomain, field, receiver, value);
+    HFieldSet result =
+        new HFieldSet(_abstractValueDomain, field, receiver, value)
+          ..sourceInformation = node.sourceInformation;
+    _log?.registerFieldSet(node, result);
+    return result;
   }
 
   HInstruction visitInvokeClosure(HInvokeClosure node) {
@@ -1124,7 +1308,8 @@
           // TODO(sra): Handle adding optional arguments default values.
           assert(!node.isInterceptedCall);
           return new HInvokeStatic(target, node.inputs.skip(1).toList(),
-              node.instructionType, node.typeArguments);
+              node.instructionType, node.typeArguments)
+            ..sourceInformation = node.sourceInformation;
         }
       }
     }
@@ -1156,17 +1341,23 @@
     } else if (commonElements.isCheckInt(element)) {
       if (node.inputs.length == 1) {
         HInstruction argument = node.inputs[0];
-        if (argument.isInteger(_abstractValueDomain)) return argument;
+        if (argument.isInteger(_abstractValueDomain).isDefinitelyTrue) {
+          return argument;
+        }
       }
     } else if (commonElements.isCheckNum(element)) {
       if (node.inputs.length == 1) {
         HInstruction argument = node.inputs[0];
-        if (argument.isNumber(_abstractValueDomain)) return argument;
+        if (argument.isNumber(_abstractValueDomain).isDefinitelyTrue) {
+          return argument;
+        }
       }
     } else if (commonElements.isCheckString(element)) {
       if (node.inputs.length == 1) {
         HInstruction argument = node.inputs[0];
-        if (argument.isString(_abstractValueDomain)) return argument;
+        if (argument.isString(_abstractValueDomain).isDefinitelyTrue) {
+          return argument;
+        }
       }
     }
     return node;
@@ -1176,7 +1367,9 @@
     // If type information is not needed, use the raw Array.
     HInstruction source = node.inputs[0];
     if (source.usedBy.length != 1) return node;
-    if (!source.isArray(_abstractValueDomain)) return node;
+    if (source.isArray(_abstractValueDomain).isPotentiallyFalse) {
+      return node;
+    }
     for (HInstruction user in node.usedBy) {
       if (user is HGetLength) continue;
       if (user is HIndex) continue;
@@ -1254,7 +1447,9 @@
 
   HInstruction visitStringify(HStringify node) {
     HInstruction input = node.inputs[0];
-    if (input.isString(_abstractValueDomain)) return input;
+    if (input.isString(_abstractValueDomain).isDefinitelyTrue) {
+      return input;
+    }
 
     HInstruction asString(String string) =>
         _graph.addConstant(constantSystem.createString(string), _closedWorld);
@@ -1290,18 +1485,26 @@
       // it directly. Keep the stringifier for primitives (since they have fast
       // path code in the stringifier) and for classes requiring interceptors
       // (since SsaInstructionSimplifier runs after SsaSimplifyInterceptors).
-      if (input.canBePrimitive(_abstractValueDomain)) return null;
-      if (input.canBeNull(_abstractValueDomain)) return null;
+      if (input.isPrimitive(_abstractValueDomain).isPotentiallyTrue) {
+        return null;
+      }
+      if (input.isNull(_abstractValueDomain).isPotentiallyTrue) {
+        return null;
+      }
       Selector selector = Selectors.toString_;
       AbstractValue toStringType = AbstractValueFactory.inferredTypeForSelector(
           selector, input.instructionType, _globalInferenceResults);
-      if (!_abstractValueDomain.containsOnlyType(
-          toStringType, _closedWorld.commonElements.jsStringClass)) {
+      if (_abstractValueDomain
+          .containsOnlyType(
+              toStringType, _closedWorld.commonElements.jsStringClass)
+          .isPotentiallyFalse) {
         return null;
       }
       // All intercepted classes extend `Interceptor`, so if the receiver can't
       // be a class extending `Interceptor` then it can be called directly.
-      if (!_abstractValueDomain.canBeInterceptor(input.instructionType)) {
+      if (_abstractValueDomain
+          .isInterceptor(input.instructionType)
+          .isDefinitelyFalse) {
         var inputs = <HInstruction>[input, input]; // [interceptor, receiver].
         HInstruction result = new HInvokeDynamicMethod(
             selector,
@@ -1511,7 +1714,9 @@
       // be a class extending `Interceptor` then the substitution methods can be
       // called directly. (We don't care about Null since contexts reading class
       // type variables originate from instance methods.)
-      if (!_abstractValueDomain.canBeInterceptor(object.instructionType)) {
+      if (_abstractValueDomain
+          .isInterceptor(object.instructionType)
+          .isDefinitelyFalse) {
         return new HTypeInfoReadVariable.noInterceptor(
             variable, object, node.instructionType);
       }
@@ -1560,9 +1765,10 @@
         isAssignable: !isFixedLength(array.instructionType, closedWorld));
     indexNode.block.addBefore(indexNode, length);
 
-    AbstractValue type = indexArgument.isPositiveInteger(_abstractValueDomain)
-        ? indexArgument.instructionType
-        : closedWorld.abstractValueDomain.positiveIntType;
+    AbstractValue type =
+        indexArgument.isPositiveInteger(_abstractValueDomain).isDefinitelyTrue
+            ? indexArgument.instructionType
+            : closedWorld.abstractValueDomain.positiveIntType;
     HBoundsCheck check = new HBoundsCheck(indexArgument, length, array, type)
       ..sourceInformation = indexNode.sourceInformation;
     indexNode.block.addBefore(indexNode, check);
@@ -1573,7 +1779,7 @@
     // the index eg. if it is a constant.  The range information from the
     // BoundsCheck instruction is attached to the input directly by
     // visitBoundsCheck in the SsaValueRangeAnalyzer.
-    if (!indexArgument.isInteger(_abstractValueDomain)) {
+    if (indexArgument.isInteger(_abstractValueDomain).isPotentiallyFalse) {
       indexArgument.replaceAllUsersDominatedBy(indexNode, check);
     }
     boundsChecked.add(indexNode);
@@ -2000,7 +2206,7 @@
   }
 
   void visitSwitch(HSwitch node) {
-    if (node.expression.isInteger(_abstractValueDomain)) {
+    if (node.expression.isInteger(_abstractValueDomain).isDefinitelyTrue) {
       Range switchRange = ranges[node.expression];
       if (switchRange != null &&
           switchRange.lower is IntValue &&
@@ -2555,7 +2761,9 @@
       return;
     }
 
-    if (!_abstractValueDomain.canBeNull(input.instructionType)) return;
+    if (_abstractValueDomain.isNull(input.instructionType).isDefinitelyFalse) {
+      return;
+    }
 
     List<HBasicBlock> trueTargets = <HBasicBlock>[];
     List<HBasicBlock> falseTargets = <HBasicBlock>[];
@@ -2611,11 +2819,9 @@
   }
 }
 
-/**
- * Optimization phase that tries to eliminate memory loads (for example
- * [HFieldGet]), when it knows the value stored in that memory location, and
- * stores that overwrite with the same value.
- */
+/// Optimization phase that tries to eliminate memory loads (for example
+/// [HFieldGet]), when it knows the value stored in that memory location, and
+/// stores that overwrite with the same value.
 class SsaLoadElimination extends HBaseVisitor implements OptimizationPhase {
   final Compiler compiler;
   final JClosedWorld closedWorld;
@@ -2926,8 +3132,9 @@
     if (nonEscapingReceivers.contains(second)) return false;
     // Typed arrays of different types might have a shared buffer.
     if (couldBeTypedArray(first) && couldBeTypedArray(second)) return true;
-    return !_abstractValueDomain.areDisjoint(
-        first.instructionType, second.instructionType);
+    return _abstractValueDomain
+        .areDisjoint(first.instructionType, second.instructionType)
+        .isPotentiallyFalse;
   }
 
   bool isFinal(Object element) {
@@ -2942,7 +3149,8 @@
 
   bool couldBeTypedArray(HInstruction receiver) {
     return closedWorld.abstractValueDomain
-        .couldBeTypedArray(receiver.instructionType);
+        .couldBeTypedArray(receiver.instructionType)
+        .isPotentiallyTrue;
   }
 
   /// Returns whether [receiver] escapes the current function.
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 7ed9f68..08cda42 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -8,10 +8,10 @@
 import '../common/tasks.dart' show CompilerTask, Measurer;
 import '../constants/values.dart';
 import '../elements/entities.dart' show FieldEntity, MemberEntity;
+import '../inferrer/types.dart';
 import '../io/source_information.dart';
 import '../js/js.dart' as js;
 import '../js_backend/backend.dart' show JavaScriptBackend, FunctionCompiler;
-import '../types/types.dart';
 import '../universe/call_structure.dart';
 import '../universe/use.dart';
 import '../world.dart' show JClosedWorld;
diff --git a/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart b/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart
index f6bfb90..5f2e064 100644
--- a/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_branch_builder.dart
@@ -58,10 +58,8 @@
         new SubExpression(conditionBranch.block, conditionExitBlock);
   }
 
-  /**
-   * Returns true if the locals of the [fromBranch] may be reused. A [:true:]
-   * return value implies that [mayReuseFromLocals] was set to [:true:].
-   */
+  /// Returns true if the locals of the [fromBranch] may be reused. A [:true:]
+  /// return value implies that [mayReuseFromLocals] was set to [:true:].
   bool mergeLocals(SsaBranch fromBranch, SsaBranch toBranch,
       {bool mayReuseFromLocals}) {
     LocalsHandler fromLocals = fromBranch.exitLocals;
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 61a56cd..ee7bc98 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -6,17 +6,15 @@
 
 import '../../compiler_new.dart' show OutputSink;
 import '../diagnostics/invariant.dart' show DEBUG_MODE;
+import '../inferrer/abstract_value_domain.dart';
 import '../js_backend/namer.dart' show Namer;
-import '../types/abstract_value_domain.dart';
 import '../tracer.dart';
 import '../world.dart' show JClosedWorld;
 import 'nodes.dart';
 
-/**
- * Outputs SSA code in a format readable by Hydra IR.
- * Tracing is disabled by default, see ../tracer.dart for how
- * to enable it.
- */
+/// Outputs SSA code in a format readable by Hydra IR.
+/// Tracing is disabled by default, see ../tracer.dart for how
+/// to enable it.
 class HTracer extends HGraphVisitor with TracerUtil {
   final JClosedWorld closedWorld;
   final Namer namer;
@@ -126,31 +124,43 @@
 
   String temporaryId(HInstruction instruction) {
     String prefix;
-    if (instruction.isNull(_abstractValueDomain)) {
+    if (instruction.isNull(_abstractValueDomain).isDefinitelyTrue) {
       prefix = 'u';
-    } else if (instruction.isConflicting(_abstractValueDomain)) {
+    } else if (instruction
+        .isConflicting(_abstractValueDomain)
+        .isDefinitelyTrue) {
       prefix = 'c';
-    } else if (instruction.isExtendableArray(_abstractValueDomain)) {
+    } else if (instruction
+        .isExtendableArray(_abstractValueDomain)
+        .isDefinitelyTrue) {
       prefix = 'e';
-    } else if (instruction.isFixedArray(_abstractValueDomain)) {
+    } else if (instruction
+        .isFixedArray(_abstractValueDomain)
+        .isDefinitelyTrue) {
       prefix = 'f';
-    } else if (instruction.isMutableArray(_abstractValueDomain)) {
+    } else if (instruction
+        .isMutableArray(_abstractValueDomain)
+        .isDefinitelyTrue) {
       prefix = 'm';
-    } else if (instruction.isArray(_abstractValueDomain)) {
+    } else if (instruction.isArray(_abstractValueDomain).isDefinitelyTrue) {
       prefix = 'a';
-    } else if (instruction.isString(_abstractValueDomain)) {
+    } else if (instruction.isString(_abstractValueDomain).isDefinitelyTrue) {
       prefix = 's';
-    } else if (instruction.isIndexablePrimitive(_abstractValueDomain)) {
+    } else if (instruction
+        .isIndexablePrimitive(_abstractValueDomain)
+        .isDefinitelyTrue) {
       prefix = 'r';
-    } else if (instruction.isBoolean(_abstractValueDomain)) {
+    } else if (instruction.isBoolean(_abstractValueDomain).isDefinitelyTrue) {
       prefix = 'b';
-    } else if (instruction.isInteger(_abstractValueDomain)) {
+    } else if (instruction.isInteger(_abstractValueDomain).isDefinitelyTrue) {
       prefix = 'i';
-    } else if (instruction.isDouble(_abstractValueDomain)) {
+    } else if (instruction.isDouble(_abstractValueDomain).isDefinitelyTrue) {
       prefix = 'd';
-    } else if (instruction.isNumber(_abstractValueDomain)) {
+    } else if (instruction.isNumber(_abstractValueDomain).isDefinitelyTrue) {
       prefix = 'n';
-    } else if (_abstractValueDomain.containsAll(instruction.instructionType)) {
+    } else if (_abstractValueDomain
+        .containsAll(instruction.instructionType)
+        .isPotentiallyTrue) {
       prefix = 'v';
     } else {
       prefix = 'U';
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index c882028..9ba2e51 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -6,8 +6,8 @@
 import 'nodes.dart';
 import '../elements/entities.dart';
 import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../io/source_information.dart';
-import '../types/abstract_value_domain.dart';
 import '../universe/use.dart' show TypeUse;
 
 /// Enum that defines how a member has access to the current type variables.
diff --git a/pkg/compiler/lib/src/ssa/types.dart b/pkg/compiler/lib/src/ssa/types.dart
index 39fd61c..4fa5ee5 100644
--- a/pkg/compiler/lib/src/ssa/types.dart
+++ b/pkg/compiler/lib/src/ssa/types.dart
@@ -4,9 +4,9 @@
 
 import '../common_elements.dart' show CommonElements;
 import '../elements/entities.dart';
-import '../native/native.dart' as native;
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
+import '../native/behavior.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
 
@@ -36,7 +36,7 @@
   }
 
   static AbstractValue fromNativeBehavior(
-      native.NativeBehavior nativeBehavior, JClosedWorld closedWorld) {
+      NativeBehavior nativeBehavior, JClosedWorld closedWorld) {
     AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
     var typesReturned = nativeBehavior.typesReturned;
     if (typesReturned.isEmpty) return abstractValueDomain.dynamicType;
@@ -46,7 +46,7 @@
     // [type] is either an instance of [DartType] or special objects
     // like [native.SpecialType.JsObject].
     AbstractValue fromNativeType(dynamic type) {
-      if (type == native.SpecialType.JsObject) {
+      if (type == SpecialType.JsObject) {
         return abstractValueDomain
             .createNonNullExact(commonElements.objectClass);
       } else if (type.isVoid) {
@@ -64,7 +64,7 @@
 
     AbstractValue result =
         abstractValueDomain.unionOfMany(typesReturned.map(fromNativeType));
-    assert(!abstractValueDomain.isEmpty(result),
+    assert(abstractValueDomain.isEmpty(result).isPotentiallyFalse,
         "Unexpected empty return value for $nativeBehavior.");
     return result;
   }
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index b034bbd..492e6ea 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -4,9 +4,10 @@
 
 import '../common_elements.dart' show CommonElements;
 import '../elements/entities.dart';
+import '../elements/types.dart';
+import '../inferrer/abstract_value_domain.dart';
+import '../inferrer/types.dart';
 import '../options.dart';
-import '../types/abstract_value_domain.dart';
-import '../types/types.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
 import 'nodes.dart';
@@ -129,11 +130,11 @@
   AbstractValue visitBinaryArithmetic(HBinaryArithmetic instruction) {
     HInstruction left = instruction.left;
     HInstruction right = instruction.right;
-    if (left.isInteger(abstractValueDomain) &&
-        right.isInteger(abstractValueDomain)) {
+    if (left.isInteger(abstractValueDomain).isDefinitelyTrue &&
+        right.isInteger(abstractValueDomain).isDefinitelyTrue) {
       return abstractValueDomain.intType;
     }
-    if (left.isDouble(abstractValueDomain)) {
+    if (left.isDouble(abstractValueDomain).isDefinitelyTrue) {
       return abstractValueDomain.doubleType;
     }
     return abstractValueDomain.numType;
@@ -142,8 +143,8 @@
   AbstractValue checkPositiveInteger(HBinaryArithmetic instruction) {
     HInstruction left = instruction.left;
     HInstruction right = instruction.right;
-    if (left.isPositiveInteger(abstractValueDomain) &&
-        right.isPositiveInteger(abstractValueDomain)) {
+    if (left.isPositiveInteger(abstractValueDomain).isDefinitelyTrue &&
+        right.isPositiveInteger(abstractValueDomain).isDefinitelyTrue) {
       return abstractValueDomain.positiveIntType;
     }
     return visitBinaryArithmetic(instruction);
@@ -176,7 +177,7 @@
     HInstruction operand = instruction.operand;
     // We have integer subclasses that represent ranges, so widen any int
     // subclass to full integer.
-    if (operand.isInteger(abstractValueDomain)) {
+    if (operand.isInteger(abstractValueDomain).isDefinitelyTrue) {
       return abstractValueDomain.intType;
     }
     return instruction.operand.instructionType;
@@ -209,28 +210,30 @@
       // We must make sure a type conversion for receiver or argument check
       // does not try to do an int check, because an int check is not enough.
       // We only do an int check if the input is integer or null.
-      if (abstractValueDomain.isNumberOrNull(checkedType) &&
-          !abstractValueDomain.isDoubleOrNull(checkedType) &&
-          input.isIntegerOrNull(abstractValueDomain)) {
+      if (abstractValueDomain.isNumberOrNull(checkedType).isDefinitelyTrue &&
+          abstractValueDomain.isDoubleOrNull(checkedType).isDefinitelyFalse &&
+          input.isIntegerOrNull(abstractValueDomain).isDefinitelyTrue) {
         instruction.checkedType = abstractValueDomain.intType;
-      } else if (abstractValueDomain.isIntegerOrNull(checkedType) &&
-          !input.isIntegerOrNull(abstractValueDomain)) {
+      } else if (abstractValueDomain
+              .isIntegerOrNull(checkedType)
+              .isDefinitelyTrue &&
+          input.isIntegerOrNull(abstractValueDomain).isPotentiallyFalse) {
         instruction.checkedType = abstractValueDomain.numType;
       }
     }
 
     AbstractValue outputType =
         abstractValueDomain.intersection(checkedType, inputType);
-    if (abstractValueDomain.isEmpty(outputType)) {
+    if (abstractValueDomain.isEmpty(outputType).isDefinitelyTrue) {
       // Intersection of double and integer conflicts (is empty), but JS numbers
       // can be both int and double at the same time.  For example, the input
       // can be a literal double '8.0' that is marked as an integer (because 'is
       // int' will return 'true').  What we really need to do is make the
       // overlap between int and double values explicit in the TypeMask system.
-      if (abstractValueDomain.isIntegerOrNull(inputType) &&
-          abstractValueDomain.isDoubleOrNull(checkedType)) {
-        if (abstractValueDomain.canBeNull(inputType) &&
-            abstractValueDomain.canBeNull(checkedType)) {
+      if (abstractValueDomain.isIntegerOrNull(inputType).isDefinitelyTrue &&
+          abstractValueDomain.isDoubleOrNull(checkedType).isDefinitelyTrue) {
+        if (abstractValueDomain.isNull(inputType).isPotentiallyTrue &&
+            abstractValueDomain.isNull(checkedType).isPotentiallyTrue) {
           outputType =
               abstractValueDomain.includeNull(abstractValueDomain.doubleType);
         } else {
@@ -268,12 +271,12 @@
   }
 
   void convertInput(HInvokeDynamic instruction, HInstruction input,
-      AbstractValue type, int kind) {
+      AbstractValue type, int kind, DartType typeExpression) {
     Selector selector = (kind == HTypeConversion.RECEIVER_TYPE_CHECK)
         ? instruction.selector
         : null;
     HTypeConversion converted = new HTypeConversion(
-        null, kind, type, input, instruction.sourceInformation,
+        typeExpression, kind, type, input, instruction.sourceInformation,
         receiverTypeCheckSelector: selector);
     instruction.block.addBefore(instruction, converted);
     input.replaceAllUsersDominatedBy(instruction, converted);
@@ -283,11 +286,11 @@
     // In some cases, we want the receiver to be an integer,
     // but that does not mean we will get a NoSuchMethodError
     // if it's not: the receiver could be a double.
-    if (abstractValueDomain.isIntegerOrNull(type)) {
+    if (abstractValueDomain.isIntegerOrNull(type).isDefinitelyTrue) {
       // If the instruction's type is integer or null, the codegen
       // will emit a null check, which is enough to know if it will
       // hit a noSuchMethod.
-      return instruction.isIntegerOrNull(abstractValueDomain);
+      return instruction.isIntegerOrNull(abstractValueDomain).isDefinitelyTrue;
     }
     return true;
   }
@@ -298,13 +301,16 @@
   bool checkReceiver(HInvokeDynamic instruction) {
     assert(instruction.isInterceptedCall);
     HInstruction receiver = instruction.inputs[1];
-    if (receiver.isNumber(abstractValueDomain)) return false;
-    if (receiver.isNumberOrNull(abstractValueDomain)) {
+    if (receiver.isNumber(abstractValueDomain).isDefinitelyTrue) {
+      return false;
+    }
+    if (receiver.isNumberOrNull(abstractValueDomain).isDefinitelyTrue) {
       convertInput(
           instruction,
           receiver,
           abstractValueDomain.excludeNull(receiver.instructionType),
-          HTypeConversion.RECEIVER_TYPE_CHECK);
+          HTypeConversion.RECEIVER_TYPE_CHECK,
+          commonElements.numType);
       return true;
     } else if (instruction.element == null) {
       if (closedWorld.includesClosureCall(
@@ -318,14 +324,18 @@
         ClassEntity cls = target.enclosingClass;
         AbstractValue type = abstractValueDomain.createNonNullSubclass(cls);
         // We currently only optimize on some primitive types.
-        if (!abstractValueDomain.isNumberOrNull(type) &&
-            !abstractValueDomain.isBooleanOrNull(type)) {
+        DartType typeExpression;
+        if (abstractValueDomain.isNumberOrNull(type).isDefinitelyTrue) {
+          typeExpression = commonElements.numType;
+        } else if (abstractValueDomain.isBooleanOrNull(type).isDefinitelyTrue) {
+          typeExpression = commonElements.boolType;
+        } else {
           return false;
         }
         if (!isCheckEnoughForNsmOrAe(receiver, type)) return false;
         instruction.element = target;
-        convertInput(
-            instruction, receiver, type, HTypeConversion.RECEIVER_TYPE_CHECK);
+        convertInput(instruction, receiver, type,
+            HTypeConversion.RECEIVER_TYPE_CHECK, typeExpression);
         return true;
       }
     }
@@ -340,17 +350,21 @@
     HInstruction right = instruction.inputs[2];
 
     Selector selector = instruction.selector;
-    if (selector.isOperator && left.isNumber(abstractValueDomain)) {
-      if (right.isNumber(abstractValueDomain)) return false;
-      AbstractValue type = right.isIntegerOrNull(abstractValueDomain)
-          ? abstractValueDomain.excludeNull(right.instructionType)
-          : abstractValueDomain.numType;
+    if (selector.isOperator &&
+        left.isNumber(abstractValueDomain).isDefinitelyTrue) {
+      if (right.isNumber(abstractValueDomain).isDefinitelyTrue) {
+        return false;
+      }
+      AbstractValue type =
+          right.isIntegerOrNull(abstractValueDomain).isDefinitelyTrue
+              ? abstractValueDomain.excludeNull(right.instructionType)
+              : abstractValueDomain.numType;
       // TODO(ngeoffray): Some number operations don't have a builtin
       // variant and will do the check in their method anyway. We
       // still add a check because it allows to GVN these operations,
       // but we should find a better way.
-      convertInput(
-          instruction, right, type, HTypeConversion.ARGUMENT_TYPE_CHECK);
+      convertInput(instruction, right, type,
+          HTypeConversion.ARGUMENT_TYPE_CHECK, commonElements.numType);
       return true;
     }
     return false;
diff --git a/pkg/compiler/lib/src/ssa/validate.dart b/pkg/compiler/lib/src/ssa/validate.dart
index 31e9125..1f93b4e 100644
--- a/pkg/compiler/lib/src/ssa/validate.dart
+++ b/pkg/compiler/lib/src/ssa/validate.dart
@@ -132,7 +132,7 @@
     super.visitBasicBlock(block);
   }
 
-  /** Returns how often [instruction] is contained in [instructions]. */
+  /// Returns how often [instruction] is contained in [instructions].
   static int countInstruction(
       List<HInstruction> instructions, HInstruction instruction) {
     int result = 0;
@@ -142,11 +142,9 @@
     return result;
   }
 
-  /**
-   * Returns true if the predicate returns true for every instruction in the
-   * list. The argument to [f] is an instruction with the count of how often
-   * it appeared in the list [instructions].
-   */
+  /// Returns true if the predicate returns true for every instruction in the
+  /// list. The argument to [f] is an instruction with the count of how often
+  /// it appeared in the list [instructions].
   static bool everyInstruction(List<HInstruction> instructions, Function f) {
     var copy = new List<HInstruction>.from(instructions);
     // TODO(floitsch): there is currently no way to sort HInstructions before
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index 0038d5b..a4bfd96 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -58,11 +58,9 @@
   }
 }
 
-/**
- * A [Value] represents both symbolic values like the value of a
- * parameter, or the length of an array, and concrete values, like
- * constants.
- */
+/// A [Value] represents both symbolic values like the value of a
+/// parameter, or the length of an array, and concrete values, like
+/// constants.
 abstract class Value {
   final ValueRangeInfo info;
   const Value(this.info);
@@ -97,10 +95,8 @@
   bool get isZero => false;
 }
 
-/**
- * The [MarkerValue] class is used to recognize ranges of loop
- * updates.
- */
+/// The [MarkerValue] class is used to recognize ranges of loop
+/// updates.
 class MarkerValue extends Value {
   /// If [positive] is true (respectively false), the marker goes
   /// to [MaxIntValue] (respectively [MinIntValue]) when being added
@@ -124,9 +120,7 @@
   }
 }
 
-/**
- * An [IntValue] contains a constant integer value.
- */
+/// An [IntValue] contains a constant integer value.
 class IntValue extends Value {
   final BigInt value;
 
@@ -192,10 +186,8 @@
   bool get isZero => value == BigInt.zero;
 }
 
-/**
- * The [MaxIntValue] represents the maximum value an integer can have,
- * which is currently +infinity.
- */
+/// The [MaxIntValue] represents the maximum value an integer can have,
+/// which is currently +infinity.
 class MaxIntValue extends Value {
   const MaxIntValue() : super(null);
   Value operator +(Value other) => this;
@@ -208,10 +200,8 @@
   bool get isPositive => true;
 }
 
-/**
- * The [MinIntValue] represents the minimum value an integer can have,
- * which is currently -infinity.
- */
+/// The [MinIntValue] represents the minimum value an integer can have,
+/// which is currently -infinity.
 class MinIntValue extends Value {
   const MinIntValue() : super(null);
   Value operator +(Value other) => this;
@@ -224,10 +214,8 @@
   bool get isPositive => false;
 }
 
-/**
- * The [UnknownValue] is the sentinel in our analysis to mark an
- * operation that could not be done because of too much complexity.
- */
+/// The [UnknownValue] is the sentinel in our analysis to mark an
+/// operation that could not be done because of too much complexity.
 class UnknownValue extends Value {
   const UnknownValue() : super(null);
   Value operator +(Value other) => const UnknownValue();
@@ -240,9 +228,7 @@
   String toString() => 'Unknown';
 }
 
-/**
- * A symbolic value representing an [HInstruction].
- */
+/// A symbolic value representing an [HInstruction].
 class InstructionValue extends Value {
   final HInstruction instruction;
   InstructionValue(this.instruction, info) : super(info);
@@ -293,18 +279,14 @@
   String toString() => 'Instruction: $instruction';
 }
 
-/**
- * Special value for instructions whose type is a positive integer.
- */
+/// Special value for instructions whose type is a positive integer.
 class PositiveValue extends InstructionValue {
   PositiveValue(HInstruction instruction, info) : super(instruction, info);
   bool get isPositive => true;
 }
 
-/**
- * Represents a binary operation on two [Value], where the operation
- * did not yield a canonical value.
- */
+/// Represents a binary operation on two [Value], where the operation
+/// did not yield a canonical value.
 class BinaryOperationValue extends Value {
   final Value left;
   final Value right;
@@ -457,11 +439,9 @@
   String toString() => '-$value';
 }
 
-/**
- * A [Range] represents the possible integer values an instruction
- * can have, from its [lower] bound to its [upper] bound, both
- * included.
- */
+/// A [Range] represents the possible integer values an instruction
+/// can have, from its [lower] bound to its [upper] bound, both
+/// included.
 class Range {
   final Value lower;
   final Value upper;
@@ -473,10 +453,8 @@
 
   Range.unbound(info) : this(const MinIntValue(), const MaxIntValue(), info);
 
-  /**
-   * Checks if the given values are unknown, and creates a
-   * range that does not have any unknown values.
-   */
+  /// Checks if the given values are unknown, and creates a
+  /// range that does not have any unknown values.
   Range.normalize(Value low, Value up, info)
       : this(low == const UnknownValue() ? const MinIntValue() : low,
             up == const UnknownValue() ? const MaxIntValue() : up, info);
@@ -579,25 +557,19 @@
   String toString() => '[$lower, $upper]';
 }
 
-/**
- * Visits the graph in dominator order, and computes value ranges for
- * integer instructions. While visiting the graph, this phase also
- * removes unnecessary bounds checks, and comparisons that are proven
- * to be true or false.
- */
+/// Visits the graph in dominator order, and computes value ranges for
+/// integer instructions. While visiting the graph, this phase also
+/// removes unnecessary bounds checks, and comparisons that are proven
+/// to be true or false.
 class SsaValueRangeAnalyzer extends HBaseVisitor implements OptimizationPhase {
   String get name => 'SSA value range builder';
 
-  /**
-   * List of [HRangeConversion] instructions created by the phase. We
-   * save them here in order to remove them once the phase is done.
-   */
+  /// List of [HRangeConversion] instructions created by the phase. We
+  /// save them here in order to remove them once the phase is done.
   final List<HRangeConversion> conversions = <HRangeConversion>[];
 
-  /**
-   * Value ranges for integer instructions. This map gets populated by
-   * the dominator tree visit.
-   */
+  /// Value ranges for integer instructions. This map gets populated by
+  /// the dominator tree visit.
   final Map<HInstruction, Range> ranges = new Map<HInstruction, Range>();
 
   final JClosedWorld closedWorld;
@@ -633,7 +605,9 @@
   void visitBasicBlock(HBasicBlock block) {
     void visit(HInstruction instruction) {
       Range range = instruction.accept(this);
-      if (instruction.isInteger(closedWorld.abstractValueDomain)) {
+      if (instruction
+          .isInteger(closedWorld.abstractValueDomain)
+          .isDefinitelyTrue) {
         assert(range != null);
         ranges[instruction] = range;
       }
@@ -644,10 +618,14 @@
   }
 
   Range visitInstruction(HInstruction instruction) {
-    if (instruction.isPositiveInteger(closedWorld.abstractValueDomain)) {
+    if (instruction
+        .isPositiveInteger(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       return info.newNormalizedRange(
           info.intZero, info.newPositiveValue(instruction));
-    } else if (instruction.isInteger(closedWorld.abstractValueDomain)) {
+    } else if (instruction
+        .isInteger(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       InstructionValue value = info.newInstructionValue(instruction);
       return info.newNormalizedRange(value, value);
     } else {
@@ -656,13 +634,14 @@
   }
 
   Range visitPhi(HPhi phi) {
-    if (!phi.isInteger(closedWorld.abstractValueDomain))
+    if (phi.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse)
       return info.newUnboundRange();
     // Some phases may replace instructions that change the inputs of
     // this phi. Only the [SsaTypesPropagation] phase will update the
     // phi type. Play it safe by assuming the [SsaTypesPropagation]
     // phase is not necessarily run before the [ValueRangeAnalyzer].
-    if (phi.inputs.any((i) => !i.isInteger(closedWorld.abstractValueDomain))) {
+    if (phi.inputs.any((i) =>
+        i.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse)) {
       return info.newUnboundRange();
     }
     if (phi.block.isLoopHeader()) {
@@ -680,13 +659,14 @@
   }
 
   Range visitConstant(HConstant hConstant) {
-    if (!hConstant.isInteger(closedWorld.abstractValueDomain))
+    if (hConstant
+        .isInteger(closedWorld.abstractValueDomain)
+        .isPotentiallyFalse) {
       return info.newUnboundRange();
+    }
     ConstantValue constant = hConstant.constant;
     NumConstantValue constantNum;
-    if (constant is DeferredConstantValue) {
-      constantNum = constant.referenced;
-    } else if (constant is DeferredGlobalConstantValue) {
+    if (constant is DeferredGlobalConstantValue) {
       constantNum = constant.referenced;
     } else {
       constantNum = constant;
@@ -725,7 +705,9 @@
     Range lengthRange = ranges[check.length];
     if (indexRange == null) {
       indexRange = info.newUnboundRange();
-      assert(!check.index.isInteger(closedWorld.abstractValueDomain));
+      assert(check.index
+          .isInteger(closedWorld.abstractValueDomain)
+          .isPotentiallyFalse);
     }
     if (lengthRange == null) {
       // We might have lost the length range due to a type conversion that
@@ -733,7 +715,9 @@
       // get to this point anyway, so no need to try and refine ranges.
       return indexRange;
     }
-    assert(check.length.isInteger(closedWorld.abstractValueDomain));
+    assert(check.length
+        .isInteger(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue);
 
     // Check if the index is strictly below the upper bound of the length
     // range.
@@ -786,10 +770,12 @@
   Range visitRelational(HRelational relational) {
     HInstruction right = relational.right;
     HInstruction left = relational.left;
-    if (!left.isInteger(closedWorld.abstractValueDomain))
+    if (left.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse) {
       return info.newUnboundRange();
-    if (!right.isInteger(closedWorld.abstractValueDomain))
+    }
+    if (right.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse) {
       return info.newUnboundRange();
+    }
     BinaryOperation operation = relational.operation(constantSystem);
     Range rightRange = ranges[relational.right];
     Range leftRange = ranges[relational.left];
@@ -824,8 +810,8 @@
     if (divisor != null) {
       // For Integer values we can be precise in the upper bound, so special
       // case those.
-      if (left.isInteger(closedWorld.abstractValueDomain) &&
-          right.isInteger(closedWorld.abstractValueDomain)) {
+      if (left.isInteger(closedWorld.abstractValueDomain).isDefinitelyTrue &&
+          right.isInteger(closedWorld.abstractValueDomain).isDefinitelyTrue) {
         if (divisor.isPositive) {
           return info.newNormalizedRange(
               info.intZero, divisor.upper - info.intOne);
@@ -833,8 +819,10 @@
           return info.newNormalizedRange(
               info.intZero, info.newNegateValue(divisor.lower) - info.intOne);
         }
-      } else if (left.isNumber(closedWorld.abstractValueDomain) &&
-          right.isNumber(closedWorld.abstractValueDomain)) {
+      } else if (left
+              .isNumber(closedWorld.abstractValueDomain)
+              .isDefinitelyTrue &&
+          right.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
         if (divisor.isPositive) {
           return info.newNormalizedRange(info.intZero, divisor.upper);
         } else if (divisor.isNegative) {
@@ -852,18 +840,26 @@
     Range dividend = ranges[left];
     // If both operands are >=0, the result is >= 0 and bounded by the divisor.
     if ((dividend != null && dividend.isPositive) ||
-        left.isPositiveInteger(closedWorld.abstractValueDomain)) {
+        left
+            .isPositiveInteger(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue) {
       Range divisor = ranges[right];
       if (divisor != null) {
         if (divisor.isPositive) {
           // For Integer values we can be precise in the upper bound.
-          if (left.isInteger(closedWorld.abstractValueDomain) &&
-              right.isInteger(closedWorld.abstractValueDomain)) {
+          if (left
+                  .isInteger(closedWorld.abstractValueDomain)
+                  .isDefinitelyTrue &&
+              right
+                  .isInteger(closedWorld.abstractValueDomain)
+                  .isDefinitelyTrue) {
             return info.newNormalizedRange(
                 info.intZero, divisor.upper - info.intOne);
           }
-          if (left.isNumber(closedWorld.abstractValueDomain) &&
-              right.isNumber(closedWorld.abstractValueDomain)) {
+          if (left.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue &&
+              right
+                  .isNumber(closedWorld.abstractValueDomain)
+                  .isDefinitelyTrue) {
             return info.newNormalizedRange(info.intZero, divisor.upper);
           }
         }
@@ -879,7 +875,9 @@
   }
 
   Range handleBinaryOperation(HBinaryArithmetic instruction) {
-    if (!instruction.isInteger(closedWorld.abstractValueDomain)) {
+    if (instruction
+        .isInteger(closedWorld.abstractValueDomain)
+        .isPotentiallyFalse) {
       return info.newUnboundRange();
     }
     return instruction
@@ -896,13 +894,13 @@
   }
 
   Range visitBitAnd(HBitAnd node) {
-    if (!node.isInteger(closedWorld.abstractValueDomain)) {
+    if (node.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse) {
       return info.newUnboundRange();
     }
     HInstruction right = node.right;
     HInstruction left = node.left;
-    if (left.isInteger(closedWorld.abstractValueDomain) &&
-        right.isInteger(closedWorld.abstractValueDomain)) {
+    if (left.isInteger(closedWorld.abstractValueDomain).isDefinitelyTrue &&
+        right.isInteger(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return ranges[left] & ranges[right];
     }
 
@@ -916,9 +914,11 @@
       return info.newUnboundRange();
     }
 
-    if (left.isInteger(closedWorld.abstractValueDomain)) {
+    if (left.isInteger(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return tryComputeRange(left);
-    } else if (right.isInteger(closedWorld.abstractValueDomain)) {
+    } else if (right
+        .isInteger(closedWorld.abstractValueDomain)
+        .isDefinitelyTrue) {
       return tryComputeRange(right);
     }
     return info.newUnboundRange();
@@ -997,10 +997,10 @@
     if (condition is HIdentity) return info.newUnboundRange();
     HInstruction right = condition.right;
     HInstruction left = condition.left;
-    if (!left.isInteger(closedWorld.abstractValueDomain)) {
+    if (left.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse) {
       return info.newUnboundRange();
     }
-    if (!right.isInteger(closedWorld.abstractValueDomain)) {
+    if (right.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse) {
       return info.newUnboundRange();
     }
 
@@ -1060,9 +1060,7 @@
   }
 }
 
-/**
- * Tries to find a range for the update instruction of a loop phi.
- */
+/// Tries to find a range for the update instruction of a loop phi.
 class LoopUpdateRecognizer extends HBaseVisitor {
   final JClosedWorld closedWorld;
   final Map<HInstruction, Range> ranges;
@@ -1092,7 +1090,11 @@
   }
 
   Range visit(HInstruction instruction) {
-    if (!instruction.isInteger(closedWorld.abstractValueDomain)) return null;
+    if (instruction
+        .isInteger(closedWorld.abstractValueDomain)
+        .isPotentiallyFalse) {
+      return null;
+    }
     if (ranges[instruction] != null) return ranges[instruction];
     return instruction.accept(this);
   }
diff --git a/pkg/compiler/lib/src/ssa/variable_allocator.dart b/pkg/compiler/lib/src/ssa/variable_allocator.dart
index 3bb3c85..6837537 100644
--- a/pkg/compiler/lib/src/ssa/variable_allocator.dart
+++ b/pkg/compiler/lib/src/ssa/variable_allocator.dart
@@ -6,9 +6,7 @@
 import '../js_backend/js_backend.dart';
 import 'nodes.dart';
 
-/**
- * The [LiveRange] class covers a range where an instruction is live.
- */
+/// The [LiveRange] class covers a range where an instruction is live.
 class LiveRange {
   final int start;
   // [end] is not final because it can be updated due to loops.
@@ -20,14 +18,10 @@
   String toString() => '[$start $end[';
 }
 
-/**
- * The [LiveInterval] class contains the list of ranges where an
- * instruction is live.
- */
+/// The [LiveInterval] class contains the list of ranges where an
+/// instruction is live.
 class LiveInterval {
-  /**
-   * The id where the instruction is defined.
-   */
+  /// The id where the instruction is defined.
   int start;
   final List<LiveRange> ranges;
   LiveInterval() : ranges = <LiveRange>[];
@@ -38,10 +32,8 @@
   LiveInterval.forCheck(this.start, LiveInterval checkedInterval)
       : ranges = checkedInterval.ranges;
 
-  /**
-   * Update all ranges that are contained in [from, to[ to
-   * die at [to].
-   */
+  /// Update all ranges that are contained in [from, to[ to
+  /// die at [to].
   void loopUpdate(int from, int to) {
     for (LiveRange range in ranges) {
       if (from <= range.start && range.end < to) {
@@ -50,16 +42,12 @@
     }
   }
 
-  /**
-   * Add a new range to this interval.
-   */
+  /// Add a new range to this interval.
   void add(LiveRange interval) {
     ranges.add(interval);
   }
 
-  /**
-   * Returns true if one of the ranges of this interval dies at [at].
-   */
+  /// Returns true if one of the ranges of this interval dies at [at].
   bool diesAt(int at) {
     for (LiveRange range in ranges) {
       if (range.end == at) return true;
@@ -74,53 +62,39 @@
   }
 }
 
-/**
- * The [LiveEnvironment] class contains the liveIn set of a basic
- * block. A liveIn set of a block contains the instructions that are
- * live when entering that block.
- */
+/// The [LiveEnvironment] class contains the liveIn set of a basic
+/// block. A liveIn set of a block contains the instructions that are
+/// live when entering that block.
 class LiveEnvironment {
-  /**
-   * The instruction id where the basic block starts. See
-   * [SsaLiveIntervalBuilder.instructionId].
-   */
+  /// The instruction id where the basic block starts. See
+  /// [SsaLiveIntervalBuilder.instructionId].
   int startId;
 
-  /**
-   * The instruction id where the basic block ends.
-   */
+  /// The instruction id where the basic block ends.
   final int endId;
 
-  /**
-   * Loop markers that will be updated once the loop header is
-   * visited. The liveIn set of the loop header will be merged into this
-   * environment. [loopMarkers] is a mapping from block header to the
-   * end instruction id of the loop exit block.
-   */
+  /// Loop markers that will be updated once the loop header is
+  /// visited. The liveIn set of the loop header will be merged into this
+  /// environment. [loopMarkers] is a mapping from block header to the
+  /// end instruction id of the loop exit block.
   final Map<HBasicBlock, int> loopMarkers;
 
-  /**
-   * The instructions that are live in this basic block. The values of
-   * the map contain the instruction ids where the instructions die.
-   * It will be used when adding a range to the live interval of an
-   * instruction.
-   */
+  /// The instructions that are live in this basic block. The values of
+  /// the map contain the instruction ids where the instructions die.
+  /// It will be used when adding a range to the live interval of an
+  /// instruction.
   final Map<HInstruction, int> liveInstructions;
 
-  /**
-   * Map containing the live intervals of instructions.
-   */
+  /// Map containing the live intervals of instructions.
   final Map<HInstruction, LiveInterval> liveIntervals;
 
   LiveEnvironment(this.liveIntervals, this.endId)
       : liveInstructions = new Map<HInstruction, int>(),
         loopMarkers = new Map<HBasicBlock, int>();
 
-  /**
-   * Remove an instruction from the liveIn set. This method also
-   * updates the live interval of [instruction] to contain the new
-   * range: [id, / id contained in [liveInstructions] /].
-   */
+  /// Remove an instruction from the liveIn set. This method also
+  /// updates the live interval of [instruction] to contain the new
+  /// range: [id, / id contained in [liveInstructions] /].
   void remove(HInstruction instruction, int id) {
     LiveInterval interval =
         liveIntervals.putIfAbsent(instruction, () => new LiveInterval());
@@ -132,20 +106,16 @@
     liveInstructions.remove(instruction);
   }
 
-  /**
-   * Add [instruction] to the liveIn set. If the instruction is not
-   * already in the set, we save the id where it dies.
-   */
+  /// Add [instruction] to the liveIn set. If the instruction is not
+  /// already in the set, we save the id where it dies.
   void add(HInstruction instruction, int userId) {
     // Note that we are visiting the graph in post-dominator order, so
     // the first time we see a variable is when it dies.
     liveInstructions.putIfAbsent(instruction, () => userId);
   }
 
-  /**
-   * Merge this environment with [other]. Update the end id of
-   * instructions in case they are different between this and [other].
-   */
+  /// Merge this environment with [other]. Update the end id of
+  /// instructions in case they are different between this and [other].
   void mergeWith(LiveEnvironment other) {
     other.liveInstructions.forEach((HInstruction instruction, int existingId) {
       // If both environments have the same instruction id of where
@@ -180,31 +150,23 @@
   String toString() => liveInstructions.toString();
 }
 
-/**
- * Builds the live intervals of each instruction. The algorithm visits
- * the graph post-dominator tree to find the last uses of an
- * instruction, and computes the liveIns of each basic block.
- */
+/// Builds the live intervals of each instruction. The algorithm visits
+/// the graph post-dominator tree to find the last uses of an
+/// instruction, and computes the liveIns of each basic block.
 class SsaLiveIntervalBuilder extends HBaseVisitor {
   final Set<HInstruction> generateAtUseSite;
   final Set<HInstruction> controlFlowOperators;
 
-  /**
-   * A counter to assign start and end ids to live ranges. The initial
-   * value is not relevant. Note that instructionId goes downward to ease
-   * reasoning about live ranges (the first instruction of a graph has
-   * the lowest id).
-   */
+  /// A counter to assign start and end ids to live ranges. The initial
+  /// value is not relevant. Note that instructionId goes downward to ease
+  /// reasoning about live ranges (the first instruction of a graph has
+  /// the lowest id).
   int instructionId = 0;
 
-  /**
-   * The liveIns of basic blocks.
-   */
+  /// The liveIns of basic blocks.
   final Map<HBasicBlock, LiveEnvironment> liveInstructions;
 
-  /**
-   * The live intervals of instructions.
-   */
+  /// The live intervals of instructions.
   final Map<HInstruction, LiveInterval> liveIntervals;
 
   SsaLiveIntervalBuilder(this.generateAtUseSite, this.controlFlowOperators)
@@ -384,11 +346,9 @@
   }
 }
 
-/**
- * Represents a copy from one instruction to another. The codegen
- * also uses this class to represent a copy from one variable to
- * another.
- */
+/// Represents a copy from one instruction to another. The codegen
+/// also uses this class to represent a copy from one variable to
+/// another.
 class Copy<T> {
   final T source;
   final T destination;
@@ -398,20 +358,14 @@
   String toString() => '$destination <- $source';
 }
 
-/**
- * A copy handler contains the copies that a basic block needs to do
- * after executing all its instructions.
- */
+/// A copy handler contains the copies that a basic block needs to do
+/// after executing all its instructions.
 class CopyHandler {
-  /**
-   * The copies from an instruction to a phi of the successor.
-   */
+  /// The copies from an instruction to a phi of the successor.
   final List<Copy<HInstruction>> copies;
 
-  /**
-   * Assignments from an instruction that does not need a name (e.g. a
-   * constant) to the phi of a successor.
-   */
+  /// Assignments from an instruction that does not need a name (e.g. a
+  /// constant) to the phi of a successor.
   final List<Copy<HInstruction>> assignments;
 
   CopyHandler()
@@ -431,21 +385,18 @@
   bool get isEmpty => copies.isEmpty && assignments.isEmpty;
 }
 
-/**
- * Contains the mapping between instructions and their names for code
- * generation, as well as the [CopyHandler] for each basic block.
- */
+/// Contains the mapping between instructions and their names for code
+/// generation, as well as the [CopyHandler] for each basic block.
 class VariableNames {
   final Map<HInstruction, String> ownName;
   final Map<HBasicBlock, CopyHandler> copyHandlers;
 
   // Used to control heuristic that determines how local variables are declared.
   final Set<String> allUsedNames;
-  /**
-   * Name that is used as a temporary to break cycles in
-   * parallel copies. We make sure this name is not being used
-   * anywhere by reserving it when we allocate names for instructions.
-   */
+
+  /// Name that is used as a temporary to break cycles in
+  /// parallel copies. We make sure this name is not being used
+  /// anywhere by reserving it when we allocate names for instructions.
   final String swapTemp;
 
   String getSwapTemp() {
@@ -488,9 +439,7 @@
   }
 }
 
-/**
- * Allocates variable names for instructions, making sure they don't collide.
- */
+/// Allocates variable names for instructions, making sure they don't collide.
 class VariableNamer {
   final VariableNames names;
   final Namer _namer;
@@ -586,9 +535,7 @@
     return name;
   }
 
-  /**
-   * Frees [instruction]'s name so it can be used for other instructions.
-   */
+  /// Frees [instruction]'s name so it can be used for other instructions.
   void freeName(HInstruction instruction) {
     String ownName = names.ownName[instruction];
     if (ownName != null) {
@@ -604,18 +551,16 @@
   }
 }
 
-/**
- * Visits all blocks in the graph, sets names to instructions, and
- * creates the [CopyHandler] for each block. This class needs to have
- * the liveIns set as well as all the live intervals of instructions.
- * It visits the graph in dominator order, so that at each entry of a
- * block, the instructions in its liveIns set have names.
- *
- * When visiting a block, it goes through all instructions. For each
- * instruction, it frees the names of the inputs that die at that
- * instruction, and allocates a name to the instruction. For each phi,
- * it adds a copy to the CopyHandler of the corresponding predecessor.
- */
+/// Visits all blocks in the graph, sets names to instructions, and
+/// creates the [CopyHandler] for each block. This class needs to have
+/// the liveIns set as well as all the live intervals of instructions.
+/// It visits the graph in dominator order, so that at each entry of a
+/// block, the instructions in its liveIns set have names.
+///
+/// When visiting a block, it goes through all instructions. For each
+/// instruction, it frees the names of the inputs that die at that
+/// instruction, and allocates a name to the instruction. For each phi,
+/// it adds a copy to the CopyHandler of the corresponding predecessor.
 class SsaVariableAllocator extends HBaseVisitor {
   final Namer _namer;
   final Map<HBasicBlock, LiveEnvironment> liveInstructions;
@@ -645,10 +590,8 @@
     });
   }
 
-  /**
-   * Returns whether [instruction] needs a name. Instructions that
-   * have no users or that are generated at use site do not need a name.
-   */
+  /// Returns whether [instruction] needs a name. Instructions that
+  /// have no users or that are generated at use site do not need a name.
   bool needsName(instruction) {
     if (instruction is HThis) return false;
     if (instruction is HParameterValue) return true;
@@ -657,9 +600,7 @@
     return !instruction.nonCheck().isCodeMotionInvariant();
   }
 
-  /**
-   * Returns whether [instruction] dies at the instruction [at].
-   */
+  /// Returns whether [instruction] dies at the instruction [at].
   bool diesAt(HInstruction instruction, HInstruction at) {
     LiveInterval atInterval = liveIntervals[at];
     LiveInterval instructionInterval = liveIntervals[instruction];
diff --git a/pkg/compiler/lib/src/tracer.dart b/pkg/compiler/lib/src/tracer.dart
index 9a8f51c..f4e7870 100644
--- a/pkg/compiler/lib/src/tracer.dart
+++ b/pkg/compiler/lib/src/tracer.dart
@@ -11,10 +11,8 @@
 import 'util/util.dart' show Indentation;
 import 'world.dart' show JClosedWorld;
 
-/**
- * If non-null, we only trace methods whose name match the regexp defined by the
- * given pattern.
- */
+/// If non-null, we only trace methods whose name match the regexp defined by
+/// the given pattern.
 String get TRACE_FILTER_PATTERN =>
     TRACE_FILTER_PATTERN_FROM_ENVIRONMENT ?? TRACE_FILTER_PATTERN_FOR_TEST;
 
@@ -22,10 +20,8 @@
     const String.fromEnvironment("DUMP_IR");
 String TRACE_FILTER_PATTERN_FOR_TEST;
 
-/**
- * Dumps the intermediate representation after each phase in a format
- * readable by IR Hydra.
- */
+/// Dumps the intermediate representation after each phase in a format
+/// readable by IR Hydra.
 class Tracer extends TracerUtil {
   final JClosedWorld closedWorld;
   final Namer namer;
diff --git a/pkg/compiler/lib/src/types/abstract_value_domain.dart b/pkg/compiler/lib/src/types/abstract_value_domain.dart
deleted file mode 100644
index d6cd5d0..0000000
--- a/pkg/compiler/lib/src/types/abstract_value_domain.dart
+++ /dev/null
@@ -1,466 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.abstract_value_domain;
-
-import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
-import '../elements/entities.dart';
-import '../serialization/serialization.dart';
-import '../universe/selector.dart';
-import '../universe/world_builder.dart';
-import '../world.dart';
-
-enum AbstractBool { True, False, Maybe }
-
-/// Strategy for the abstraction of runtime values used by the global type
-/// inference.
-abstract class AbstractValueStrategy {
-  /// Creates the abstract value domain for [closedWorld].
-  AbstractValueDomain createDomain(JClosedWorld closedWorld);
-
-  /// Creates the [SelectorConstraintsStrategy] used by the backend enqueuer.
-  SelectorConstraintsStrategy createSelectorStrategy();
-}
-
-/// A value in an abstraction of runtime values.
-abstract class AbstractValue {}
-
-/// A system that implements an abstraction over runtime values.
-abstract class AbstractValueDomain {
-  /// The [AbstractValue] that represents an unknown runtime value.
-  AbstractValue get dynamicType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `Type` at
-  /// runtime.
-  AbstractValue get typeType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `Function` at
-  /// runtime.
-  AbstractValue get functionType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `bool` at
-  /// runtime.
-  AbstractValue get boolType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `int` at
-  /// runtime.
-  AbstractValue get intType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `double` at
-  /// runtime.
-  AbstractValue get doubleType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `num` at
-  /// runtime.
-  AbstractValue get numType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `String` at
-  /// runtime.
-  AbstractValue get stringType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `List` at
-  /// runtime.
-  AbstractValue get listType;
-
-  /// The [AbstractValue] that represents a non-null subtype of `Map` at
-  /// runtime.
-  AbstractValue get mapType;
-
-  /// The [AbstractValue] that represents a non-null value at runtime.
-  AbstractValue get nonNullType;
-
-  /// The [AbstractValue] that represents the `null` at runtime.
-  AbstractValue get nullType;
-
-  /// The [AbstractValue] that represents a non-null growable JavaScript array
-  /// at runtime.
-  AbstractValue get growableListType;
-
-  /// The [AbstractValue] that represents a non-null fixed size JavaScript array
-  /// at runtime.
-  AbstractValue get fixedListType;
-
-  /// The [AbstractValue] that represents a non-null 31-bit unsigned integer at
-  /// runtime.
-  AbstractValue get uint31Type;
-
-  /// The [AbstractValue] that represents a non-null 32-bit unsigned integer at
-  /// runtime.
-  AbstractValue get uint32Type;
-
-  /// The [AbstractValue] that represents a non-null unsigned integer at
-  /// runtime.
-  AbstractValue get positiveIntType;
-
-  /// The [AbstractValue] that represents a non-null constant list literal at
-  /// runtime.
-  AbstractValue get constListType;
-
-  /// The [AbstractValue] that represents a non-null constant map literal at
-  /// runtime.
-  AbstractValue get constMapType;
-
-  /// The [AbstractValue] that represents the empty set of runtime values.
-  AbstractValue get emptyType;
-
-  /// The [AbstractValue] that represents a non-null instance at runtime of the
-  /// `Iterable` class used for the `sync*` implementation.
-  AbstractValue get syncStarIterableType;
-
-  /// The [AbstractValue] that represents a non-null instance at runtime of the
-  /// `Future` class used for the `async` implementation.
-  AbstractValue get asyncFutureType;
-
-  /// The [AbstractValue] that represents a non-null instance at runtime of the
-  /// `Stream` class used for the `async*` implementation.
-  AbstractValue get asyncStarStreamType;
-
-  /// Creates an [AbstractValue] for a non-null exact instance of [cls].
-  AbstractValue createNonNullExact(ClassEntity cls);
-
-  /// Creates an [AbstractValue] for a potentially null exact instance of [cls].
-  AbstractValue createNullableExact(ClassEntity cls);
-
-  /// Creates an [AbstractValue] for a non-null instance that extends [cls].
-  AbstractValue createNonNullSubclass(ClassEntity cls);
-
-  /// Creates an [AbstractValue] for a non-null instance that implements [cls].
-  AbstractValue createNonNullSubtype(ClassEntity cls);
-
-  /// Creates an [AbstractValue] for a potentially null instance that implements
-  /// [cls].
-  AbstractValue createNullableSubtype(ClassEntity cls);
-
-  /// Returns `true` if [value] is a native typed array or `null` at runtime.
-  bool isTypedArray(covariant AbstractValue value);
-
-  /// Returns `true` if [value] could be a native typed array at runtime.
-  bool couldBeTypedArray(covariant AbstractValue value);
-
-  /// Returns the version of the abstract [value] that excludes `null`.
-  AbstractValue excludeNull(covariant AbstractValue value);
-
-  /// Returns the version of the abstract [value] that includes `null`.
-  AbstractValue includeNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] contains instances of [cls] at runtime.
-  bool containsType(covariant AbstractValue value, ClassEntity cls);
-
-  /// Returns `true` if [value] only contains subtypes of [cls] or `null` at
-  /// runtime.
-  bool containsOnlyType(covariant AbstractValue value, ClassEntity cls);
-
-  /// Returns `true` if [value] is an instance of [cls] or `null` at runtime.
-  // TODO(johnniwinther): Merge this with [isInstanceOf].
-  bool isInstanceOfOrNull(covariant AbstractValue value, ClassEntity cls);
-
-  /// Returns an [AbstractBool] that describes how [value] is known to be an
-  /// instance of [cls] at runtime.
-  ///
-  /// If the returned value is `Abstract.True`, [value] is known _always_ to be
-  /// an instance of [cls]. If the returned value is `Abstract.False`, [value]
-  /// is known _never_ to be an instance of [cls]. If the returned value is
-  /// `Abstract.Maybe` [value] might or might not be an instance of [cls] at
-  /// runtime.
-  AbstractBool isInstanceOf(AbstractValue value, ClassEntity cls);
-
-  /// Returns `true` if [value] is empty set of runtime values.
-  bool isEmpty(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a non-null exact class at runtime.
-  bool isExact(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is an exact class or `null` at runtime.
-  bool isExactOrNull(covariant AbstractValue value);
-
-  /// Returns the [ClassEntity] if this [value] is a non-null instance of an
-  /// exact class at runtime, and `null` otherwise.
-  ClassEntity getExactClass(covariant AbstractValue value);
-
-  /// Returns `true` if [value] can be `null` at runtime.
-  bool canBeNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is `null` at runtime.
-  bool isNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] could be a JavaScript bool, number, string,
-  /// array or `null` at runtime.
-  bool canBePrimitive(covariant AbstractValue value);
-
-  /// Returns `true` if [value] could be a JavaScript number at runtime.
-  bool canBePrimitiveNumber(covariant AbstractValue value);
-
-  /// Returns `true` if [value] could be a JavaScript bool at runtime.
-  bool canBePrimitiveBoolean(covariant AbstractValue value);
-
-  /// Returns `true` if [value] could be a JavaScript array at runtime.
-  bool canBePrimitiveArray(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a JavaScript string, array, native HTML list
-  /// or `null` at runtime.
-  bool isIndexablePrimitive(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a fixed-size or constant JavaScript array or
-  /// `null` at
-  /// runtime.
-  bool isFixedArray(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a growable JavaScript array or `null` at
-  /// runtime.
-  bool isExtendableArray(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a mutable JavaScript array or `null` at
-  /// runtime.
-  bool isMutableArray(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a mutable JavaScript array, native HTML list
-  /// or `null` at runtime.
-  bool isMutableIndexable(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a JavaScript array or `null` at runtime.
-  bool isArray(covariant AbstractValue value);
-
-  /// Returns `true` if [value] could be a JavaScript string at runtime.
-  bool canBePrimitiveString(covariant AbstractValue value);
-
-  /// Return `true` if [value] could be an interceptor at runtime.
-  bool canBeInterceptor(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a non-null integer value at runtime.
-  bool isInteger(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a non-null 32 bit unsigned integer value at
-  /// runtime.
-  bool isUInt32(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a non-null 31 bit unsigned integer value at
-  /// runtime.
-  bool isUInt31(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a non-null unsigned integer value at runtime.
-  bool isPositiveInteger(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is an unsigned integer value or `null` at
-  /// runtime.
-  bool isPositiveIntegerOrNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is an integer value or `null` at runtime.
-  bool isIntegerOrNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a non-null JavaScript number at runtime.
-  bool isNumber(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a JavaScript number or `null` at runtime.
-  bool isNumberOrNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a non-integer number at runtime.
-  bool isDouble(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a non-integer number or `null` at runtime.
-  bool isDoubleOrNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a JavaScript bool at runtime.
-  bool isBoolean(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a JavaScript bool or `null` at runtime.
-  bool isBooleanOrNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a JavaScript string at runtime.
-  bool isString(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is a JavaScript string or `null` at runtime.
-  bool isStringOrNull(covariant AbstractValue value);
-
-  /// Returns `true` if [value] a non-null JavaScript primitive or `null`?
-  // TODO(johnniwinther): This should probably not return true on `null`,
-  // investigate.
-  bool isPrimitive(covariant AbstractValue value);
-
-  /// Returns `true` if [value] a JavaScript primitive, possible `null`.
-  bool isPrimitiveOrNull(covariant AbstractValue value);
-
-  /// Returns [AbstractValue] for the runtime values contained in either [a] or
-  /// [b].
-  AbstractValue union(covariant AbstractValue a, covariant AbstractValue b);
-
-  /// Returns [AbstractValue] for the runtime values contained in at least one
-  /// of [values].
-  AbstractValue unionOfMany(Iterable<AbstractValue> values);
-
-  /// Returns [AbstractValue] for the runtime values that [a] and [b] have in
-  /// common.
-  AbstractValue intersection(
-      covariant AbstractValue a, covariant AbstractValue b);
-
-  /// Returns `true` if [a] and [b] have no runtime values in common.
-  bool areDisjoint(covariant AbstractValue a, covariant AbstractValue b);
-
-  /// Returns `true` if [a] contains all non-null runtime values.
-  bool containsAll(covariant AbstractValue a);
-
-  /// Computes the [AbstractValue] corresponding to the constant [value].
-  AbstractValue computeAbstractValueForConstant(ConstantValue value);
-
-  /// Returns `true` if [value] represents a container value at runtime.
-  bool isContainer(covariant AbstractValue value);
-
-  /// Creates a container value specialization of [originalValue] with the
-  /// inferred [element] runtime value and inferred runtime [length].
-  ///
-  /// The [allocationNode] is used to identify this particular map allocation.
-  /// The [allocationElement] is used only for debugging.
-  AbstractValue createContainerValue(
-      AbstractValue originalValue,
-      Object allocationNode,
-      MemberEntity allocationElement,
-      AbstractValue elementType,
-      int length);
-
-  /// Returns the element type of [value] if it represents a container value
-  /// at runtime. Returns [dynamicType] otherwise.
-  AbstractValue getContainerElementType(AbstractValue value);
-
-  /// Return the known length of [value] if it represents a container value
-  /// at runtime. Returns `null` if the length is unknown or if [value] doesn't
-  /// represent a container value at runtime.
-  int getContainerLength(AbstractValue value);
-
-  /// Returns `true` if [value] represents a map value at runtime.
-  bool isMap(covariant AbstractValue value);
-
-  /// Creates a map value specialization of [originalValue] with the inferred
-  /// [key] and [value] runtime values.
-  ///
-  /// The [allocationNode] is used to identify this particular map allocation.
-  /// The [allocationElement] is used only for debugging.
-  AbstractValue createMapValue(
-      AbstractValue originalValue,
-      Object allocationNode,
-      MemberEntity allocationElement,
-      AbstractValue key,
-      AbstractValue value);
-
-  /// Returns the key type of [value] if it represents a map value at runtime.
-  /// Returns [dynamicType] otherwise.
-  AbstractValue getMapKeyType(AbstractValue value);
-
-  /// Returns the value type of [value] if it represents a map value at runtime.
-  /// Returns [dynamicType] otherwise.
-  AbstractValue getMapValueType(AbstractValue value);
-
-  /// Returns `true` if [value] represents a dictionary value, that is, a map
-  /// with strings as keys, at runtime.
-  bool isDictionary(covariant AbstractValue value);
-
-  /// Creates a dictionary value specialization of [originalValue] with the
-  /// inferred [key] and [value] runtime values.
-  ///
-  /// The [allocationNode] is used to identify this particular map allocation.
-  /// The [allocationElement] is used only for debugging.
-  AbstractValue createDictionaryValue(
-      AbstractValue originalValue,
-      Object allocationNode,
-      MemberEntity allocationElement,
-      AbstractValue key,
-      AbstractValue value,
-      Map<String, AbstractValue> mappings);
-
-  /// Returns `true` if [value] is a dictionary value which contains [key] as
-  /// a key.
-  bool containsDictionaryKey(AbstractValue value, String key);
-
-  /// Returns the value type for [key] in [value] if it represents a dictionary
-  /// value at runtime. Returns [dynamicType] otherwise.
-  AbstractValue getDictionaryValueForKey(AbstractValue value, String key);
-
-  /// Returns `true` if [specialization] is a specialization of
-  /// [generalization].
-  ///
-  /// Specializations are created through [createPrimitiveValue],
-  /// [createMapValue], [createDictionaryValue] and [createContainerValue].
-  bool isSpecializationOf(
-      AbstractValue specialization, AbstractValue generalization);
-
-  /// Returns the value of which [value] is a specialization. Return `null` if
-  /// [value] is not a specialization.
-  ///
-  /// Specializations are created through [createPrimitiveValue],
-  /// [createMapValue], [createDictionaryValue] and [createContainerValue].
-  AbstractValue getGeneralization(AbstractValue value);
-
-  /// Return the object identifying the allocation of [value] if it is an
-  /// allocation based specialization. Otherwise returns `null`.
-  ///
-  /// Allocation based specializations are created through [createMapValue],
-  /// [createDictionaryValue] and [createContainerValue]
-  Object getAllocationNode(AbstractValue value);
-
-  /// Return the allocation element of [value] if it is an allocation based
-  /// specialization. Otherwise returns `null`.
-  ///
-  /// Allocation based specializations are created through [createMapValue],
-  /// [createDictionaryValue] and [createContainerValue]
-  MemberEntity getAllocationElement(AbstractValue value);
-
-  /// Returns `true` if [value] a known primitive JavaScript value at runtime.
-  bool isPrimitiveValue(covariant AbstractValue value);
-
-  /// Creates a primitive value specialization of [originalValue] with the
-  /// inferred primitive constant [value].
-  AbstractValue createPrimitiveValue(
-      AbstractValue originalValue, PrimitiveConstantValue value);
-
-  /// Returns the primitive JavaScript value of [value] if it represents a
-  /// primitive JavaScript value at runtime, value at runtime. Returns `null`
-  /// otherwise.
-  PrimitiveConstantValue getPrimitiveValue(covariant AbstractValue value);
-
-  /// Compute the type of all potential receivers of the set of live [members].
-  AbstractValue computeReceiver(Iterable<MemberEntity> members);
-
-  /// Returns whether [member] is a potential target when being
-  /// invoked on a [receiver]. [selector] is used to ensure library privacy is
-  /// taken into account.
-  bool canHit(AbstractValue receiver, MemberEntity member, Selector selector);
-
-  /// Returns whether [selector] invoked on a [receiver] can hit a
-  /// [noSuchMethod].
-  bool needsNoSuchMethodHandling(AbstractValue receiver, Selector selector);
-
-  /// Returns `true` if the set of runtime values of [subset] are all in the set
-  /// of runtime values of [superset].
-  bool contains(AbstractValue superset, AbstractValue subset);
-
-  /// Returns `true` if the set of runtime values of [subset] are all in the set
-  /// of runtime values of [superset].
-  bool isIn(AbstractValue subset, AbstractValue superset);
-
-  /// Returns the [MemberEntity] that is known to always be hit at runtime
-  /// [receiver].
-  ///
-  /// Returns `null` if 0 or more than 1 member can be hit at runtime.
-  MemberEntity locateSingleMember(AbstractValue receiver, Selector selector);
-
-  /// Returns `true` if [value] is an indexable JavaScript value at runtime.
-  bool isJsIndexable(covariant AbstractValue value);
-
-  /// Returns `true` if [value] is an indexable and iterable JavaScript value at
-  /// runtime.
-  ///
-  /// JavaScript arrays are both indexable and iterable whereas JavaScript
-  /// strings are indexable but not iterable.
-  bool isJsIndexableAndIterable(AbstractValue value);
-
-  /// Returns `true` if [value] is an JavaScript indexable of fixed length.
-  bool isFixedLengthJsIndexable(AbstractValue value);
-
-  /// Returns compact a textual representation for [value] used for debugging.
-  String getCompactText(AbstractValue value);
-
-  /// Deserializes an [AbstractValue] for this domain from [source].
-  AbstractValue readAbstractValueFromDataSource(DataSource source);
-
-  /// Serializes this [value] for this domain to [sink].
-  void writeAbstractValueToDataSink(DataSink sink, AbstractValue value);
-}
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart
deleted file mode 100644
index 03ed29e5..0000000
--- a/pkg/compiler/lib/src/types/types.dart
+++ /dev/null
@@ -1,606 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library types;
-
-import 'package:kernel/ast.dart' as ir;
-import '../common.dart' show failedAt, retainDataForTesting;
-import '../common/names.dart';
-import '../common/tasks.dart' show CompilerTask;
-import '../compiler.dart' show Compiler;
-import '../elements/entities.dart';
-import '../js_backend/inferred_data.dart';
-import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
-import '../serialization/serialization.dart';
-import '../universe/selector.dart' show Selector;
-import '../world.dart' show JClosedWorld;
-import 'abstract_value_domain.dart';
-import '../inferrer/inferrer_engine.dart';
-
-/// Results about a single element (e.g. a method, parameter, or field)
-/// produced by the global type-inference algorithm.
-///
-/// All queries in this class may contain results that assume whole-program
-/// closed-world semantics. Any [TypeMask] for an element or node that we return
-/// was inferred to be a "guaranteed type", that means, it is a type that we
-/// can prove to be correct for all executions of the program.  A trivial
-/// implementation would return false on all boolean properties (giving no
-/// guarantees) and the `subclass of Object or null` type mask for the type
-/// based queries (the runtime value could be anything).
-abstract class GlobalTypeInferenceMemberResult {
-  /// Deserializes a [GlobalTypeInferenceMemberResult] object from [source].
-  factory GlobalTypeInferenceMemberResult.readFromDataSource(
-          DataSource source, AbstractValueDomain abstractValueDomain) =
-      GlobalTypeInferenceMemberResultImpl.readFromDataSource;
-
-  /// Serializes this [GlobalTypeInferenceMemberResult] to [sink].
-  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain);
-
-  /// The inferred type when this result belongs to a field, null otherwise.
-  AbstractValue get type;
-
-  /// Whether the member associated with this result is only called once in one
-  /// location in the entire program.
-  bool get isCalledOnce;
-
-  /// Whether the method element associated with this result always throws.
-  bool get throwsAlways;
-
-  /// The inferred return type when this result belongs to a function element.
-  AbstractValue get returnType;
-
-  /// Returns the type of a list new expression [node].
-  AbstractValue typeOfNewList(ir.Node node);
-
-  /// Returns the type of a list literal [node].
-  AbstractValue typeOfListLiteral(ir.Node node);
-
-  /// Returns the type of a send [node].
-  // TODO(johnniwinther): Rename this.
-  AbstractValue typeOfSend(ir.Node node);
-
-  /// Returns the type of the getter in a complex send-set [node], for example,
-  /// the type of the `a.f` getter in `a.f += b`.
-  AbstractValue typeOfGetter(ir.Node node);
-
-  /// Returns the type of the iterator in a [loop].
-  AbstractValue typeOfIterator(ir.Node node);
-
-  /// Returns the type of the `moveNext` call of an iterator in a [loop].
-  AbstractValue typeOfIteratorMoveNext(ir.Node node);
-
-  /// Returns the type of the `current` getter of an iterator in a [loop].
-  AbstractValue typeOfIteratorCurrent(ir.Node node);
-}
-
-/// Internal data used during type-inference to store intermediate results about
-/// a single element.
-abstract class GlobalTypeInferenceElementData {
-  /// Deserializes a [GlobalTypeInferenceElementData] object from [source].
-  factory GlobalTypeInferenceElementData.readFromDataSource(
-          DataSource source, AbstractValueDomain abstractValueDomain) =
-      KernelGlobalTypeInferenceElementData.readFromDataSource;
-
-  /// Serializes this [GlobalTypeInferenceElementData] to [sink].
-  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain);
-
-  /// Compresses the inner representation by removing [AbstractValue] mappings
-  /// to `null`.
-  void compress();
-
-  // TODO(johnniwinther): Remove this. Maybe split by access/invoke.
-  AbstractValue typeOfSend(ir.TreeNode node);
-  AbstractValue typeOfGetter(ir.TreeNode node);
-
-  void setTypeMask(ir.TreeNode node, AbstractValue mask);
-
-  AbstractValue typeOfIterator(ir.TreeNode node);
-
-  AbstractValue typeOfIteratorMoveNext(ir.TreeNode node);
-
-  AbstractValue typeOfIteratorCurrent(ir.TreeNode node);
-
-  void setIteratorTypeMask(ir.TreeNode node, AbstractValue mask);
-
-  void setMoveNextTypeMask(ir.TreeNode node, AbstractValue mask);
-
-  void setCurrentTypeMask(ir.TreeNode node, AbstractValue mask);
-}
-
-/// API to interact with the global type-inference engine.
-abstract class TypesInferrer {
-  GlobalTypeInferenceResults analyzeMain(FunctionEntity element);
-}
-
-/// Results produced by the global type-inference algorithm.
-///
-/// All queries in this class may contain results that assume whole-program
-/// closed-world semantics. Any [AbstractValue] for an element or node that we
-/// return was inferred to be a "guaranteed type", that means, it is a type that
-/// we can prove to be correct for all executions of the program.
-abstract class GlobalTypeInferenceResults {
-  /// Deserializes a [GlobalTypeInferenceResults] object from [source].
-  factory GlobalTypeInferenceResults.readFromDataSource(
-      DataSource source, JClosedWorld closedWorld, InferredData inferredData) {
-    bool isTrivial = source.readBool();
-    if (isTrivial) {
-      return new TrivialGlobalTypeInferenceResults(closedWorld);
-    }
-    return new GlobalTypeInferenceResultsImpl.readFromDataSource(
-        source, closedWorld, inferredData);
-  }
-
-  /// Serializes this [GlobalTypeInferenceResults] to [sink].
-  void writeToDataSink(DataSink sink);
-
-  JClosedWorld get closedWorld;
-
-  InferredData get inferredData;
-
-  GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member);
-
-  AbstractValue resultOfParameter(Local parameter);
-
-  /// Returns the type of a [selector] when applied to a receiver with the given
-  /// type [mask].
-  AbstractValue typeOfSelector(Selector selector, AbstractValue mask);
-
-  /// Returns whether a fixed-length constructor call goes through a growable
-  /// check.
-  bool isFixedArrayCheckedForGrowable(ir.Node node);
-}
-
-/// Global analysis that infers concrete types.
-class GlobalTypeInferenceTask extends CompilerTask {
-  // TODO(sigmund): rename at the same time as our benchmarking tools.
-  final String name = 'Type inference';
-
-  final Compiler compiler;
-
-  /// The [TypeGraphInferrer] used by the global type inference. This should by
-  /// accessed from outside this class for testing only.
-  TypeGraphInferrer typesInferrerInternal;
-
-  GlobalTypeInferenceResults resultsForTesting;
-
-  GlobalTypeInferenceTask(Compiler compiler)
-      : compiler = compiler,
-        super(compiler.measurer);
-
-  /// Runs the global type-inference algorithm once.
-  GlobalTypeInferenceResults runGlobalTypeInference(FunctionEntity mainElement,
-      JClosedWorld closedWorld, InferredDataBuilder inferredDataBuilder) {
-    return measure(() {
-      GlobalTypeInferenceResults results;
-      if (compiler.disableTypeInference) {
-        results = new TrivialGlobalTypeInferenceResults(closedWorld);
-      } else {
-        typesInferrerInternal ??= compiler.backendStrategy
-            .createTypesInferrer(closedWorld, inferredDataBuilder);
-        results = typesInferrerInternal.analyzeMain(mainElement);
-      }
-      closedWorld.noSuchMethodData.categorizeComplexImplementations(results);
-      if (retainDataForTesting) {
-        resultsForTesting = results;
-      }
-      return results;
-    });
-  }
-}
-
-class GlobalTypeInferenceResultsImpl implements GlobalTypeInferenceResults {
-  /// Tag used for identifying serialized [GlobalTypeInferenceResults] objects
-  /// in a debugging data stream.
-  static const String tag = 'global-type-inference-results';
-
-  final JClosedWorld closedWorld;
-  final InferredData inferredData;
-  final GlobalTypeInferenceMemberResult _deadFieldResult;
-  final GlobalTypeInferenceMemberResult _deadMethodResult;
-  final AbstractValue _trivialParameterResult;
-
-  final Map<MemberEntity, GlobalTypeInferenceMemberResult> memberResults;
-  final Map<Local, AbstractValue> parameterResults;
-  final Set<ir.TreeNode> checkedForGrowableLists;
-  final Set<Selector> returnsListElementTypeSet;
-
-  GlobalTypeInferenceResultsImpl(
-      this.closedWorld,
-      this.inferredData,
-      this.memberResults,
-      this.parameterResults,
-      this.checkedForGrowableLists,
-      this.returnsListElementTypeSet)
-      : _deadFieldResult = new DeadFieldGlobalTypeInferenceResult(
-            closedWorld.abstractValueDomain),
-        _deadMethodResult = new DeadMethodGlobalTypeInferenceResult(
-            closedWorld.abstractValueDomain),
-        _trivialParameterResult = closedWorld.abstractValueDomain.dynamicType;
-
-  factory GlobalTypeInferenceResultsImpl.readFromDataSource(
-      DataSource source, JClosedWorld closedWorld, InferredData inferredData) {
-    source.begin(tag);
-    Map<MemberEntity, GlobalTypeInferenceMemberResult> memberResults =
-        source.readMemberMap(() =>
-            new GlobalTypeInferenceMemberResult.readFromDataSource(
-                source, closedWorld.abstractValueDomain));
-    Map<Local, AbstractValue> parameterResults = source.readLocalMap(() =>
-        closedWorld.abstractValueDomain
-            .readAbstractValueFromDataSource(source));
-    Set<ir.TreeNode> checkedForGrowableLists = source.readTreeNodes().toSet();
-    Set<Selector> returnsListElementTypeSet =
-        source.readList(() => new Selector.readFromDataSource(source)).toSet();
-    source.end(tag);
-    return new GlobalTypeInferenceResultsImpl(
-        closedWorld,
-        inferredData,
-        memberResults,
-        parameterResults,
-        checkedForGrowableLists,
-        returnsListElementTypeSet);
-  }
-
-  void writeToDataSink(DataSink sink) {
-    sink.writeBool(false); // Is _not_ trivial.
-    sink.begin(tag);
-    sink.writeMemberMap(
-        memberResults,
-        (GlobalTypeInferenceMemberResult result) =>
-            result.writeToDataSink(sink, closedWorld.abstractValueDomain));
-    sink.writeLocalMap(
-        parameterResults,
-        (AbstractValue value) => closedWorld.abstractValueDomain
-            .writeAbstractValueToDataSink(sink, value));
-    sink.writeTreeNodes(checkedForGrowableLists);
-    sink.writeList(returnsListElementTypeSet,
-        (Selector selector) => selector.writeToDataSink(sink));
-    sink.end(tag);
-  }
-
-  @override
-  GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member) {
-    assert(
-        member is! ConstructorBodyEntity,
-        failedAt(
-            member,
-            "unexpected input: ConstructorBodyElements are created"
-            " after global type inference, no data is avaiable for them."));
-    // TODO(sigmund,johnniwinther): Make it an error to query for results that
-    // don't exist..
-    /*assert(memberResults.containsKey(member) || member is JSignatureMethod,
-        "No inference result for member $member");*/
-    return memberResults[member] ??
-        (member is FunctionEntity ? _deadMethodResult : _deadFieldResult);
-  }
-
-  @override
-  AbstractValue resultOfParameter(Local parameter) {
-    // TODO(sigmund,johnniwinther): Make it an error to query for results that
-    // don't exist.
-    /*assert(parameterResults.containsKey(parameter),
-        "No inference result for parameter $parameter");*/
-    return parameterResults[parameter] ?? _trivialParameterResult;
-  }
-
-  /// Returns the type of a [selector] when applied to a receiver with the given
-  /// [receiver] type.
-  @override
-  AbstractValue typeOfSelector(Selector selector, AbstractValue receiver) {
-    // Bailout for closure calls. We're not tracking types of
-    // closures.
-    if (selector.isClosureCall)
-      return closedWorld.abstractValueDomain.dynamicType;
-    if (selector.isSetter || selector.isIndexSet) {
-      return closedWorld.abstractValueDomain.dynamicType;
-    }
-    if (returnsListElementType(selector, receiver)) {
-      return closedWorld.abstractValueDomain.getContainerElementType(receiver);
-    }
-    if (returnsMapValueType(selector, receiver)) {
-      return closedWorld.abstractValueDomain.getMapValueType(receiver);
-    }
-
-    if (closedWorld.includesClosureCall(selector, receiver)) {
-      return closedWorld.abstractValueDomain.dynamicType;
-    } else {
-      Iterable<MemberEntity> elements =
-          closedWorld.locateMembers(selector, receiver);
-      List<AbstractValue> types = <AbstractValue>[];
-      for (MemberEntity element in elements) {
-        AbstractValue type = typeOfMemberWithSelector(element, selector);
-        types.add(type);
-      }
-      return closedWorld.abstractValueDomain.unionOfMany(types);
-    }
-  }
-
-  bool returnsListElementType(Selector selector, AbstractValue mask) {
-    return mask != null &&
-        closedWorld.abstractValueDomain.isContainer(mask) &&
-        returnsListElementTypeSet.contains(selector);
-  }
-
-  bool returnsMapValueType(Selector selector, AbstractValue mask) {
-    return mask != null &&
-        closedWorld.abstractValueDomain.isMap(mask) &&
-        selector.isIndex;
-  }
-
-  AbstractValue typeOfMemberWithSelector(
-      MemberEntity element, Selector selector) {
-    if (element.name == Identifiers.noSuchMethod_ &&
-        selector.name != element.name) {
-      // An invocation can resolve to a [noSuchMethod], in which case
-      // we get the return type of [noSuchMethod].
-      return resultOfMember(element).returnType;
-    } else if (selector.isGetter) {
-      if (element.isFunction) {
-        // [functionType] is null if the inferrer did not run.
-        return closedWorld.abstractValueDomain.functionType;
-      } else if (element.isField) {
-        return resultOfMember(element).type;
-      } else if (element.isGetter) {
-        return resultOfMember(element).returnType;
-      } else {
-        assert(false, failedAt(element, "Unexpected member $element"));
-        return closedWorld.abstractValueDomain.dynamicType;
-      }
-    } else if (element.isGetter || element.isField) {
-      assert(selector.isCall || selector.isSetter);
-      return closedWorld.abstractValueDomain.dynamicType;
-    } else {
-      return resultOfMember(element).returnType;
-    }
-  }
-
-  /// Returns whether a fixed-length constructor call goes through a growable
-  /// check.
-  // TODO(sigmund): move into the result of the element containing such
-  // constructor call.
-  @override
-  bool isFixedArrayCheckedForGrowable(ir.Node ctorCall) =>
-      checkedForGrowableLists.contains(ctorCall);
-}
-
-class GlobalTypeInferenceMemberResultImpl
-    implements GlobalTypeInferenceMemberResult {
-  /// Tag used for identifying serialized [GlobalTypeInferenceMemberResult]
-  /// objects in a debugging data stream.
-  static const String tag = 'global-type-inference-mebmer-result';
-
-  final GlobalTypeInferenceElementData _data;
-  final Map<ir.TreeNode, AbstractValue> _allocatedLists;
-  final AbstractValue returnType;
-  final AbstractValue type;
-  final bool throwsAlways;
-  final bool isCalledOnce;
-
-  GlobalTypeInferenceMemberResultImpl(
-      this._data, this._allocatedLists, this.returnType, this.type,
-      {this.throwsAlways, this.isCalledOnce});
-
-  factory GlobalTypeInferenceMemberResultImpl.readFromDataSource(
-      DataSource source, AbstractValueDomain abstractValueDomain) {
-    source.begin(tag);
-    GlobalTypeInferenceElementData data = source.readValueOrNull(() {
-      return new GlobalTypeInferenceElementData.readFromDataSource(
-          source, abstractValueDomain);
-    });
-    Map<ir.TreeNode, AbstractValue> allocatedLists = source.readTreeNodeMap(
-        () => abstractValueDomain.readAbstractValueFromDataSource(source));
-    AbstractValue returnType =
-        abstractValueDomain.readAbstractValueFromDataSource(source);
-    AbstractValue type =
-        abstractValueDomain.readAbstractValueFromDataSource(source);
-    bool throwsAlways = source.readBool();
-    bool isCalledOnce = source.readBool();
-    source.end(tag);
-    return new GlobalTypeInferenceMemberResultImpl(
-        data, allocatedLists, returnType, type,
-        throwsAlways: throwsAlways, isCalledOnce: isCalledOnce);
-  }
-
-  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain) {
-    sink.begin(tag);
-    sink.writeValueOrNull(_data, (GlobalTypeInferenceElementData data) {
-      data.writeToDataSink(sink, abstractValueDomain);
-    });
-    sink.writeTreeNodeMap(
-        _allocatedLists,
-        (AbstractValue value) =>
-            abstractValueDomain.writeAbstractValueToDataSink(sink, value));
-    abstractValueDomain.writeAbstractValueToDataSink(sink, returnType);
-    abstractValueDomain.writeAbstractValueToDataSink(sink, type);
-    sink.writeBool(throwsAlways);
-    sink.writeBool(isCalledOnce);
-    sink.end(tag);
-  }
-
-  AbstractValue typeOfSend(ir.Node node) => _data?.typeOfSend(node);
-  AbstractValue typeOfGetter(ir.Node node) => _data?.typeOfGetter(node);
-  AbstractValue typeOfIterator(ir.Node node) => _data?.typeOfIterator(node);
-  AbstractValue typeOfIteratorMoveNext(ir.Node node) =>
-      _data?.typeOfIteratorMoveNext(node);
-  AbstractValue typeOfIteratorCurrent(ir.Node node) =>
-      _data?.typeOfIteratorCurrent(node);
-
-  AbstractValue typeOfNewList(ir.Node node) => _allocatedLists[node];
-
-  AbstractValue typeOfListLiteral(ir.Node node) => _allocatedLists[node];
-}
-
-class TrivialGlobalTypeInferenceResults implements GlobalTypeInferenceResults {
-  final JClosedWorld closedWorld;
-  final TrivialGlobalTypeInferenceMemberResult _trivialMemberResult;
-  final AbstractValue _trivialParameterResult;
-  final InferredData inferredData = new TrivialInferredData();
-
-  TrivialGlobalTypeInferenceResults(this.closedWorld)
-      : _trivialMemberResult = new TrivialGlobalTypeInferenceMemberResult(
-            closedWorld.abstractValueDomain.dynamicType),
-        _trivialParameterResult = closedWorld.abstractValueDomain.dynamicType;
-
-  void writeToDataSink(DataSink sink) {
-    sink.writeBool(true); // Is trivial.
-  }
-
-  @override
-  bool isFixedArrayCheckedForGrowable(ir.Node node) => false;
-
-  @override
-  AbstractValue typeOfSelector(Selector selector, AbstractValue mask) {
-    return closedWorld.abstractValueDomain.dynamicType;
-  }
-
-  @override
-  AbstractValue resultOfParameter(Local parameter) {
-    return _trivialParameterResult;
-  }
-
-  @override
-  GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member) {
-    return _trivialMemberResult;
-  }
-}
-
-class TrivialGlobalTypeInferenceMemberResult
-    implements GlobalTypeInferenceMemberResult {
-  final AbstractValue dynamicType;
-
-  TrivialGlobalTypeInferenceMemberResult(this.dynamicType);
-
-  @override
-  AbstractValue get type => dynamicType;
-
-  @override
-  AbstractValue get returnType => dynamicType;
-
-  @override
-  bool get throwsAlways => false;
-
-  @override
-  AbstractValue typeOfIteratorCurrent(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfIteratorMoveNext(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfIterator(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfGetter(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfSend(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfListLiteral(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfNewList(ir.Node node) => null;
-
-  @override
-  bool get isCalledOnce => false;
-
-  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain) {
-    throw new UnsupportedError(
-        "TrivialGlobalTypeInferenceMemberResult.writeToDataSink");
-  }
-}
-
-class DeadFieldGlobalTypeInferenceResult
-    implements GlobalTypeInferenceMemberResult {
-  final AbstractValue dynamicType;
-  final AbstractValue emptyType;
-
-  DeadFieldGlobalTypeInferenceResult(AbstractValueDomain domain)
-      : this.dynamicType = domain.dynamicType,
-        this.emptyType = domain.emptyType;
-
-  @override
-  AbstractValue get type => emptyType;
-
-  @override
-  AbstractValue get returnType => dynamicType;
-
-  @override
-  bool get throwsAlways => false;
-
-  @override
-  AbstractValue typeOfIteratorCurrent(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfIteratorMoveNext(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfIterator(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfGetter(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfSend(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfListLiteral(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfNewList(ir.Node node) => null;
-
-  @override
-  bool get isCalledOnce => false;
-
-  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain) {
-    throw new UnsupportedError(
-        "DeadFieldGlobalTypeInferenceResult.writeToDataSink");
-  }
-}
-
-class DeadMethodGlobalTypeInferenceResult
-    implements GlobalTypeInferenceMemberResult {
-  final AbstractValue emptyType;
-  final AbstractValue functionType;
-
-  DeadMethodGlobalTypeInferenceResult(AbstractValueDomain domain)
-      : this.functionType = domain.functionType,
-        this.emptyType = domain.emptyType;
-
-  @override
-  AbstractValue get type => functionType;
-
-  @override
-  AbstractValue get returnType => emptyType;
-
-  @override
-  bool get throwsAlways => false;
-
-  @override
-  AbstractValue typeOfIteratorCurrent(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfIteratorMoveNext(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfIterator(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfGetter(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfSend(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfListLiteral(ir.Node node) => null;
-
-  @override
-  AbstractValue typeOfNewList(ir.Node node) => null;
-
-  @override
-  bool get isCalledOnce => false;
-
-  void writeToDataSink(DataSink sink, AbstractValueDomain abstractValueDomain) {
-    throw new UnsupportedError(
-        "DeadFieldGlobalTypeInferenceResult.writeToDataSink");
-  }
-}
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy.dart b/pkg/compiler/lib/src/universe/class_hierarchy.dart
index 7032550..e5707ad 100644
--- a/pkg/compiler/lib/src/universe/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/universe/class_hierarchy.dart
@@ -150,8 +150,8 @@
 }
 
 class ClassHierarchyImpl implements ClassHierarchy {
-  /// Tag used for identifying serialized [ClassHierarchy] objects in a debugging
-  /// data stream.
+  /// Tag used for identifying serialized [ClassHierarchy] objects in a
+  /// debugging data stream.
   static const String tag = 'class-hierarchy';
 
   final CommonElements _commonElements;
@@ -571,9 +571,9 @@
 class ClassHierarchyBuilder {
   // We keep track of subtype and subclass relationships in four
   // distinct sets to make class hierarchy analysis faster.
-  final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
+  final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes =
       <ClassEntity, ClassHierarchyNode>{};
-  final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
+  final Map<ClassEntity, ClassSet> _classSets = <ClassEntity, ClassSet>{};
   final Map<ClassEntity, Set<ClassEntity>> mixinUses =
       new Map<ClassEntity, Set<ClassEntity>>();
 
@@ -582,12 +582,22 @@
 
   ClassHierarchyBuilder(this._commonElements, this._classQueries);
 
+  ClassHierarchy close() {
+    assert(
+        _classHierarchyNodes.length == _classSets.length,
+        "ClassHierarchyNode/ClassSet mismatch: "
+        "${_classHierarchyNodes} vs "
+        "${_classSets}");
+    return new ClassHierarchyImpl(
+        _commonElements, _classHierarchyNodes, _classSets);
+  }
+
   void registerClass(ClassEntity cls) {
     _ensureClassSet(_classQueries.getDeclaration(cls));
   }
 
   ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
-    return classHierarchyNodes.putIfAbsent(cls, () {
+    return _classHierarchyNodes.putIfAbsent(cls, () {
       ClassHierarchyNode parentNode;
       ClassEntity superclass = _classQueries.getSuperClass(cls);
       if (superclass != null) {
@@ -599,7 +609,7 @@
   }
 
   ClassSet _ensureClassSet(ClassEntity cls) {
-    return classSets.putIfAbsent(cls, () {
+    return _classSets.putIfAbsent(cls, () {
       ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
       ClassSet classSet = new ClassSet(node);
 
@@ -665,55 +675,170 @@
   }
 
   bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
-    assert(
-        classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
-    ClassSet classSet = classSets[y];
+    assert(_classSets.containsKey(x),
+        "ClassSet for $x has not been computed yet.");
+    ClassSet classSet = _classSets[y];
     assert(classSet != null,
-        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${classSets}"));
-    ClassHierarchyNode classHierarchyNode = classHierarchyNodes[x];
+        failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${_classSets}"));
+    ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
     assert(classHierarchyNode != null,
         failedAt(x, "No ClassHierarchyNode for $x"));
     return classSet.hasSubtype(classHierarchyNode);
   }
 
-  Map<ClassEntity, _InheritedCache> _inheritedCacheMap = {};
+  /// Returns `true` if a dynamic access on an instance of [exactClass] can
+  /// target a member declared in [memberHoldingClass].
+  bool isInheritedInExactClass(
+      ClassEntity memberHoldingClass, ClassEntity exactClass) {
+    ClassHierarchyNode exactClassNode = _classHierarchyNodes[exactClass];
+    if (!exactClassNode.isAbstractlyInstantiated &&
+        !exactClassNode.isDirectlyInstantiated) {
+      // No instances of [thisClass] are live.
+      return false;
+    }
+    ClassSet memberHoldingClassSet = _classSets[memberHoldingClass];
+    if (memberHoldingClassSet.hasSubclass(exactClassNode)) {
+      /// A member from a super class can be accessed.
+      return true;
+    }
+    for (ClassHierarchyNode mixinApplication
+        in memberHoldingClassSet.mixinApplicationNodes) {
+      if (mixinApplication.hasSubclass(exactClassNode)) {
+        /// A member from a mixed in class can be accessed.
+        return true;
+      }
+    }
+    return false;
+  }
+
+  Map<ClassEntity, _InheritedInThisClassCache> _inheritedInThisClassCacheMap =
+      {};
+
+  /// Returns `true` if a `this` expression in [thisClass] can target a member
+  /// declared in [memberHoldingClass].
+  bool isInheritedInThisClass(
+      ClassEntity memberHoldingClass, ClassEntity thisClass) {
+    _InheritedInThisClassCache cache =
+        _inheritedInThisClassCacheMap[memberHoldingClass] ??=
+            new _InheritedInThisClassCache();
+    return cache.isInheritedInThisClassOf(this, memberHoldingClass, thisClass);
+  }
+
+  Map<ClassEntity, _InheritedInSubtypeCache> _inheritedInSubtypeCacheMap = {};
 
   bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
-    _InheritedCache cache = _inheritedCacheMap[x] ??= new _InheritedCache();
+    _InheritedInSubtypeCache cache =
+        _inheritedInSubtypeCacheMap[x] ??= new _InheritedInSubtypeCache();
     return cache.isInheritedInSubtypeOf(this, x, y);
   }
 }
 
+/// Cache used for computing when a member of a given class, the so-called
+/// member holding class, can be inherited into a live class.
+class _InheritedInThisClassCache {
+  /// Set of classes that inherits members from the member holding class.
+  Set<ClassEntity> _inheritingClasses;
+
+  /// Cache for liveness computation for a `this` expressions of a given class.
+  Map<ClassEntity, _LiveSet> _map;
+
+  /// Returns `true` if members of [memberHoldingClass] can be inherited into
+  /// a live class that can be the target of a `this` expression in [thisClass].
+  bool isInheritedInThisClassOf(ClassHierarchyBuilder builder,
+      ClassEntity memberHoldingClass, ClassEntity thisClass) {
+    _LiveSet set;
+    if (_map == null) {
+      _map = {};
+    } else {
+      set = _map[thisClass];
+    }
+    if (set == null) {
+      set = _map[thisClass] = _computeInheritingInThisClassSet(
+          builder, memberHoldingClass, thisClass);
+    }
+    return set.hasLiveClass(builder);
+  }
+
+  _LiveSet _computeInheritingInThisClassSet(ClassHierarchyBuilder builder,
+      ClassEntity memberHoldingClass, ClassEntity thisClass) {
+    ClassHierarchyNode memberHoldingClassNode =
+        builder._classHierarchyNodes[memberHoldingClass];
+
+    if (_inheritingClasses == null) {
+      _inheritingClasses = new Set<ClassEntity>();
+      _inheritingClasses.addAll(memberHoldingClassNode
+          .subclassesByMask(ClassHierarchyNode.ALL, strict: false));
+      for (ClassHierarchyNode mixinApplication
+          in builder._classSets[memberHoldingClass].mixinApplicationNodes) {
+        _inheritingClasses.addAll(mixinApplication
+            .subclassesByMask(ClassHierarchyNode.ALL, strict: false));
+      }
+    }
+
+    Set<ClassEntity> validatingSet = new Set<ClassEntity>();
+
+    void processHierarchy(ClassHierarchyNode mixerNode) {
+      for (ClassEntity inheritingClass in _inheritingClasses) {
+        ClassHierarchyNode inheritingClassNode =
+            builder._classHierarchyNodes[inheritingClass];
+        if (!validatingSet.contains(mixerNode.cls) &&
+            inheritingClassNode.hasSubclass(mixerNode)) {
+          // If [mixerNode.cls] is live then a `this` expression can target
+          // members inherited from [memberHoldingClass] into [inheritingClass].
+          validatingSet.add(mixerNode.cls);
+        }
+        if (mixerNode.hasSubclass(inheritingClassNode)) {
+          // If [inheritingClass] is live then a `this` expression can target
+          // members inherited from [memberHoldingClass] into `inheritingClass`
+          // into a subclass of [mixerNode.cls].
+          validatingSet.add(inheritingClass);
+        }
+      }
+    }
+
+    ClassSet thisClassSet = builder._classSets[thisClass];
+
+    processHierarchy(thisClassSet.node);
+
+    for (ClassHierarchyNode mixinApplication
+        in thisClassSet.mixinApplicationNodes) {
+      processHierarchy(mixinApplication);
+    }
+
+    return new _LiveSet(validatingSet);
+  }
+}
+
 /// A cache object used for [ClassHierarchyBuilder.isInheritedInSubtypeOf].
-class _InheritedCache {
-  Map<ClassEntity, _InheritingSet> _map;
+class _InheritedInSubtypeCache {
+  Map<ClassEntity, _LiveSet> _map;
 
   /// Returns whether a live class currently known to inherit from [x] and
   /// implement [y].
   bool isInheritedInSubtypeOf(
       ClassHierarchyBuilder builder, ClassEntity x, ClassEntity y) {
-    _InheritingSet set;
+    _LiveSet set;
     if (_map == null) {
       _map = {};
     } else {
       set = _map[y];
     }
     if (set == null) {
-      set = _map[y] = _computeInheritingSet(builder, x, y);
+      set = _map[y] = _computeInheritingInSubtypeSet(builder, x, y);
     }
     return set.hasLiveClass(builder);
   }
 
-  /// Creates an [_InheritingSet] of classes that inherit members of a class [x]
+  /// Creates an [_LiveSet] of classes that inherit members of a class [x]
   /// while implementing class [y].
-  _InheritingSet _computeInheritingSet(
+  _LiveSet _computeInheritingInSubtypeSet(
       ClassHierarchyBuilder builder, ClassEntity x, ClassEntity y) {
-    ClassSet classSet = builder.classSets[x];
+    ClassSet classSet = builder._classSets[x];
 
     assert(
         classSet != null,
         failedAt(
-            x, "No ClassSet for $x (${x.runtimeType}): ${builder.classSets}"));
+            x, "No ClassSet for $x (${x.runtimeType}): ${builder._classSets}"));
 
     Set<ClassEntity> classes = new Set<ClassEntity>();
 
@@ -740,16 +865,16 @@
       subclassImplements(mixinApplication, strict: false);
     }
 
-    return new _InheritingSet(classes);
+    return new _LiveSet(classes);
   }
 }
 
-/// A set of classes that inherit members of a class 'x' while implementing
-/// class 'y'.
+/// A set of potentially live classes.
 ///
-/// The set is used [ClassHierarchyBuilder.isInheritedInSubtypeOf] to determine
+/// The set is used [ClassHierarchyBuilder.isInheritedInSubtypeOf] and
+/// [ClassHierarchyBuilder.isInheritedInThisClassOf] to determine
 /// when members of a class is live.
-class _InheritingSet {
+class _LiveSet {
   /// If `true` the set of classes is known to contain a live class. In this
   /// case [_classes] is `null`. If `false` the set of classes is empty and
   /// therefore known never to contain live classes. In this case [_classes]
@@ -758,7 +883,7 @@
   bool _result;
   Set<ClassEntity> _classes;
 
-  _InheritingSet(Set<ClassEntity> classes)
+  _LiveSet(Set<ClassEntity> classes)
       : _result = classes.isEmpty ? false : null,
         _classes = classes.isNotEmpty ? classes : null;
 
@@ -777,7 +902,7 @@
   bool hasLiveClass(ClassHierarchyBuilder builder) {
     if (_result != null) return _result;
     for (ClassEntity cls in _classes) {
-      if (builder.classHierarchyNodes[cls].isInstantiated) {
+      if (builder._classHierarchyNodes[cls].isInstantiated) {
         // We now know this set contains a live class and done need to remember
         // that set of classes anymore.
         _result = true;
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index 6431ab6..fa29bf7 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.dart
@@ -6,8 +6,6 @@
 
 import 'dart:collection' show IterableBase, MapBase;
 
-import 'package:front_end/src/api_unstable/dart2js.dart' show Link;
-
 import '../elements/entities.dart' show ClassEntity;
 import '../elements/indexed.dart' show IndexedClass;
 import '../serialization/serialization.dart';
@@ -206,7 +204,7 @@
   }
 
   /// The nodes for the direct subclasses of [cls].
-  Link<ClassHierarchyNode> _directSubclasses = const Link<ClassHierarchyNode>();
+  List<ClassHierarchyNode> _directSubclasses = <ClassHierarchyNode>[];
 
   ClassHierarchyNode(this.parentNode, this.cls, this.hierarchyDepth) {
     if (parentNode != null) {
@@ -249,7 +247,7 @@
   /// Adds [subclass] as a direct subclass of [cls].
   void addDirectSubclass(ClassHierarchyNode subclass) {
     assert(!_directSubclasses.contains(subclass));
-    _directSubclasses = _directSubclasses.prepend(subclass);
+    _directSubclasses.add(subclass);
   }
 
   Iterable<ClassHierarchyNode> get directSubclasses => _directSubclasses;
@@ -360,12 +358,10 @@
       return null;
     }
     ClassHierarchyNode subclass;
-    for (Link<ClassHierarchyNode> link = _directSubclasses;
-        !link.isEmpty;
-        link = link.tail) {
-      if (link.head.isInstantiated) {
+    for (ClassHierarchyNode node in _directSubclasses) {
+      if (node.isInstantiated) {
         if (subclass == null) {
-          subclass = link.head;
+          subclass = node;
         } else {
           return cls;
         }
@@ -616,10 +612,16 @@
     return true;
   }
 
+  /// Returns an [Iterable] of the classes that implement [cls] directly or
+  /// through supertypes.
+  ///
+  /// A class that implements [cls] through its superclasses is not included in
+  /// the iterable.
   Iterable<ClassHierarchyNode> get subtypeNodes {
     return _subtypes ?? const <ClassHierarchyNode>[];
   }
 
+  /// Returns an [Iterable] of the classes that mix in [cls] directly.
   Iterable<ClassHierarchyNode> get mixinApplicationNodes {
     return _mixinApplications ?? const <ClassHierarchyNode>[];
   }
@@ -894,7 +896,7 @@
   /// Stack of pending class nodes.
   ///
   /// This is `null` before the first call to [moveNext].
-  Link<ClassHierarchyNode> stack;
+  List<ClassHierarchyNode> stack;
 
   ClassHierarchyNodeIterator(this.iterable);
 
@@ -917,7 +919,7 @@
   bool moveNext() {
     if (stack == null) {
       // First call to moveNext
-      stack = const Link<ClassHierarchyNode>().prepend(root);
+      stack = [root];
       return _findNext();
     } else {
       // Initialized state.
@@ -935,17 +937,16 @@
         currentNode = null;
         return false;
       }
-      currentNode = stack.head;
-      stack = stack.tail;
+      currentNode = stack.removeLast();
       if (!includeUninstantiated && !currentNode.isInstantiated) {
         // We're only iterating instantiated classes so there is no use in
         // visiting the current node and its subtree.
         continue;
       }
-      for (Link<ClassHierarchyNode> link = currentNode._directSubclasses;
-          !link.isEmpty;
-          link = link.tail) {
-        stack = stack.prepend(link.head);
+      // Add direct subclasses in reverse order so will visit them in the list
+      // order.
+      for (int i = currentNode._directSubclasses.length - 1; i >= 0; i--) {
+        stack.add(currentNode._directSubclasses[i]);
       }
       if (_isValid(currentNode)) {
         return true;
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index 5869501..2c9980d 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -2,7 +2,30 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of world_builder;
+import 'dart:collection';
+
+import '../common/names.dart' show Identifiers;
+import '../common_elements.dart';
+import '../constants/values.dart';
+import '../elements/entities.dart';
+import '../elements/types.dart';
+import '../js_backend/native_data.dart' show NativeBasicData;
+import '../js_model/locals.dart';
+import '../js_model/element_map_impl.dart';
+import '../util/enumset.dart';
+import '../util/util.dart';
+import '../world.dart' show JClosedWorld;
+import 'member_usage.dart';
+import 'selector.dart' show Selector;
+import 'use.dart'
+    show
+        ConstantUse,
+        ConstantUseKind,
+        DynamicUse,
+        DynamicUseKind,
+        StaticUse,
+        StaticUseKind;
+import 'world_builder.dart';
 
 /// World builder specific to codegen.
 ///
@@ -48,9 +71,9 @@
   ConstantValue getConstantFieldInitializer(covariant FieldEntity field);
 
   /// Returns `true` if [member] is invoked as a setter.
-  bool hasInvokedSetter(MemberEntity member, JClosedWorld world);
+  bool hasInvokedSetter(MemberEntity member);
 
-  bool hasInvokedGetter(MemberEntity member, JClosedWorld world);
+  bool hasInvokedGetter(MemberEntity member);
 
   Map<Selector, SelectorConstraints> invocationsByName(String name);
 
@@ -115,11 +138,9 @@
   /// Invariant: Elements are declaration elements.
   final Set<FieldEntity> allReferencedStaticFields = new Set<FieldEntity>();
 
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: Elements are declaration elements.
-   */
+  /// Documentation wanted -- johnniwinther
+  ///
+  /// Invariant: Elements are declaration elements.
   final Set<FunctionEntity> staticFunctionsNeedingGetter =
       new Set<FunctionEntity>();
   final Set<FunctionEntity> methodsNeedingSuperGetter =
@@ -131,34 +152,34 @@
   final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
       <String, Map<Selector, SelectorConstraints>>{};
 
-  final Map<ClassEntity, _ClassUsage> _processedClasses =
-      <ClassEntity, _ClassUsage>{};
+  final Map<ClassEntity, ClassUsage> _processedClasses =
+      <ClassEntity, ClassUsage>{};
 
-  Map<ClassEntity, _ClassUsage> get classUsageForTesting => _processedClasses;
+  Map<ClassEntity, ClassUsage> get classUsageForTesting => _processedClasses;
 
   /// Map of registered usage of static members of live classes.
-  final Map<Entity, _StaticMemberUsage> _staticMemberUsage =
-      <Entity, _StaticMemberUsage>{};
+  final Map<Entity, StaticMemberUsage> _staticMemberUsage =
+      <Entity, StaticMemberUsage>{};
 
-  Map<Entity, _StaticMemberUsage> get staticMemberUsageForTesting =>
+  Map<Entity, StaticMemberUsage> get staticMemberUsageForTesting =>
       _staticMemberUsage;
 
   /// Map of registered usage of instance members of live classes.
-  final Map<MemberEntity, _MemberUsage> _instanceMemberUsage =
-      <MemberEntity, _MemberUsage>{};
+  final Map<MemberEntity, MemberUsage> _instanceMemberUsage =
+      <MemberEntity, MemberUsage>{};
 
-  Map<MemberEntity, _MemberUsage> get instanceMemberUsageForTesting =>
+  Map<MemberEntity, MemberUsage> get instanceMemberUsageForTesting =>
       _instanceMemberUsage;
 
   /// Map containing instance members of live classes that are not yet live
   /// themselves.
-  final Map<String, Set<_MemberUsage>> _instanceMembersByName =
-      <String, Set<_MemberUsage>>{};
+  final Map<String, Set<MemberUsage>> _instanceMembersByName =
+      <String, Set<MemberUsage>>{};
 
   /// Map containing instance methods of live classes that are not yet
   /// closurized.
-  final Map<String, Set<_MemberUsage>> _instanceFunctionsByName =
-      <String, Set<_MemberUsage>>{};
+  final Map<String, Set<MemberUsage>> _instanceFunctionsByName =
+      <String, Set<MemberUsage>>{};
 
   final Set<DartType> isChecks = new Set<DartType>();
 
@@ -237,7 +258,7 @@
     for (Selector selector in selectors.keys) {
       if (selector.appliesUnnamed(member)) {
         SelectorConstraints masks = selectors[selector];
-        if (masks.applies(member, selector, world)) {
+        if (masks.canHit(member, selector.memberName, world)) {
           return true;
         }
       }
@@ -245,17 +266,17 @@
     return false;
   }
 
-  bool hasInvocation(MemberEntity member, JClosedWorld world) {
-    return _hasMatchingSelector(_invokedNames[member.name], member, world);
+  bool hasInvocation(MemberEntity member) {
+    return _hasMatchingSelector(_invokedNames[member.name], member, _world);
   }
 
-  bool hasInvokedGetter(MemberEntity member, JClosedWorld world) {
-    return _hasMatchingSelector(_invokedGetters[member.name], member, world) ||
+  bool hasInvokedGetter(MemberEntity member) {
+    return _hasMatchingSelector(_invokedGetters[member.name], member, _world) ||
         member.isFunction && methodsNeedingSuperGetter.contains(member);
   }
 
-  bool hasInvokedSetter(MemberEntity member, JClosedWorld world) {
-    return _hasMatchingSelector(_invokedSetters[member.name], member, world);
+  bool hasInvokedSetter(MemberEntity member) {
+    return _hasMatchingSelector(_invokedSetters[member.name], member, _world);
   }
 
   bool registerDynamicUse(
@@ -263,11 +284,12 @@
     Selector selector = dynamicUse.selector;
     String methodName = selector.name;
 
-    void _process(Map<String, Set<_MemberUsage>> memberMap,
-        EnumSet<MemberUse> action(_MemberUsage usage)) {
-      _processSet(memberMap, methodName, (_MemberUsage usage) {
-        if (selectorConstraintsStrategy.appliedUnnamed(
-            dynamicUse, usage.entity, _world)) {
+    void _process(Map<String, Set<MemberUsage>> memberMap,
+        EnumSet<MemberUse> action(MemberUsage usage)) {
+      _processSet(memberMap, methodName, (MemberUsage usage) {
+        if (selector.appliesUnnamed(usage.entity) &&
+            selectorConstraintsStrategy.appliedUnnamed(
+                dynamicUse, usage.entity, _world)) {
           memberUsed(usage.entity, action(usage));
           return true;
         }
@@ -308,8 +330,12 @@
     Object constraint = dynamicUse.receiverConstraint;
     Map<Selector, SelectorConstraints> selectors =
         selectorMap[name] ??= new Maplet<Selector, SelectorConstraints>();
-    UniverseSelectorConstraints constraints = selectors[selector] ??=
-        selectorConstraintsStrategy.createSelectorConstraints(selector);
+    UniverseSelectorConstraints constraints = selectors[selector];
+    if (constraints == null) {
+      selectors[selector] = selectorConstraintsStrategy
+          .createSelectorConstraints(selector, constraint);
+      return true;
+    }
     return constraints.addReceiverConstraint(constraint);
   }
 
@@ -387,13 +413,13 @@
   void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
     Entity element = staticUse.element;
     _registerStaticUse(staticUse);
-    _StaticMemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
+    StaticMemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
       if (element is MemberEntity &&
           (element.isStatic || element.isTopLevel) &&
           element.isFunction) {
-        return new _StaticFunctionUsage(element);
+        return new StaticFunctionUsage(element);
       } else {
-        return new _GeneralStaticMemberUsage(element);
+        return new GeneralStaticMemberUsage(element);
       }
     });
     EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
@@ -431,7 +457,7 @@
         break;
       case StaticUseKind.DIRECT_INVOKE:
         MemberEntity member = staticUse.element;
-        _MemberUsage instanceUsage = _getMemberUsage(member, memberUsed);
+        MemberUsage instanceUsage = _getMemberUsage(member, memberUsed);
         memberUsed(instanceUsage.entity, instanceUsage.invoke());
         _instanceMembersByName[instanceUsage.entity.name]
             ?.remove(instanceUsage);
@@ -469,7 +495,7 @@
     _getMemberUsage(member, memberUsed);
   }
 
-  _MemberUsage _getMemberUsage(
+  MemberUsage _getMemberUsage(
       covariant MemberEntity member, MemberUsedCallback memberUsed) {
     // TODO(johnniwinther): Change [TypeMask] to not apply to a superclass
     // member unless the class has been instantiated. Similar to
@@ -478,16 +504,16 @@
       String memberName = member.name;
       ClassEntity cls = member.enclosingClass;
       bool isNative = _nativeBasicData.isNativeClass(cls);
-      _MemberUsage usage = new _MemberUsage(member, isNative: isNative);
+      MemberUsage usage = new MemberUsage(member, isNative: isNative);
       EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
       useSet.addAll(usage.appliedUse);
-      if (!usage.hasRead && hasInvokedGetter(member, _world)) {
+      if (!usage.hasRead && hasInvokedGetter(member)) {
         useSet.addAll(usage.read());
       }
-      if (!usage.hasWrite && hasInvokedSetter(member, _world)) {
+      if (!usage.hasWrite && hasInvokedSetter(member)) {
         useSet.addAll(usage.write());
       }
-      if (!usage.hasInvoke && hasInvocation(member, _world)) {
+      if (!usage.hasInvoke && hasInvocation(member)) {
         useSet.addAll(usage.invoke());
       }
 
@@ -495,14 +521,14 @@
         // Store the member in [instanceFunctionsByName] to catch
         // getters on the function.
         _instanceFunctionsByName
-            .putIfAbsent(usage.entity.name, () => new Set<_MemberUsage>())
+            .putIfAbsent(usage.entity.name, () => new Set<MemberUsage>())
             .add(usage);
       }
       if (usage.pendingUse.contains(MemberUse.NORMAL)) {
         // The element is not yet used. Add it to the list of instance
         // members to still be processed.
         _instanceMembersByName
-            .putIfAbsent(memberName, () => new Set<_MemberUsage>())
+            .putIfAbsent(memberName, () => new Set<MemberUsage>())
             .add(usage);
       }
       memberUsed(member, useSet);
@@ -510,24 +536,24 @@
     });
   }
 
-  void _processSet(Map<String, Set<_MemberUsage>> map, String memberName,
-      bool f(_MemberUsage e)) {
-    Set<_MemberUsage> members = map[memberName];
+  void _processSet(Map<String, Set<MemberUsage>> map, String memberName,
+      bool f(MemberUsage e)) {
+    Set<MemberUsage> members = map[memberName];
     if (members == null) return;
     // [f] might add elements to [: map[memberName] :] during the loop below
     // so we create a new list for [: map[memberName] :] and prepend the
     // [remaining] members after the loop.
-    map[memberName] = new Set<_MemberUsage>();
-    Set<_MemberUsage> remaining = new Set<_MemberUsage>();
-    for (_MemberUsage member in members) {
+    map[memberName] = new Set<MemberUsage>();
+    Set<MemberUsage> remaining = new Set<MemberUsage>();
+    for (MemberUsage member in members) {
       if (!f(member)) remaining.add(member);
     }
     map[memberName].addAll(remaining);
   }
 
-  /// Return the canonical [_ClassUsage] for [cls].
-  _ClassUsage _getClassUsage(ClassEntity cls) {
-    return _processedClasses.putIfAbsent(cls, () => new _ClassUsage(cls));
+  /// Return the canonical [ClassUsage] for [cls].
+  ClassUsage _getClassUsage(ClassEntity cls) {
+    return _processedClasses.putIfAbsent(cls, () => new ClassUsage(cls));
   }
 
   void _processInstantiatedClass(ClassEntity cls, ClassUsedCallback classUsed) {
@@ -535,7 +561,7 @@
     // already instantiated and we therefore have to process its superclass as
     // well.
     bool processClass(ClassEntity superclass) {
-      _ClassUsage usage = _getClassUsage(superclass);
+      ClassUsage usage = _getClassUsage(superclass);
       if (!usage.isInstantiated) {
         classUsed(usage.cls, usage.instantiate());
         return true;
@@ -596,7 +622,7 @@
   Iterable<FunctionEntity> get genericInstanceMethods {
     List<FunctionEntity> functions = <FunctionEntity>[];
 
-    void processMemberUse(MemberEntity member, _MemberUsage memberUsage) {
+    void processMemberUse(MemberEntity member, MemberUsage memberUsage) {
       if (member.isInstanceMember &&
           member is FunctionEntity &&
           memberUsage.hasUse &&
@@ -613,7 +639,7 @@
   Iterable<FunctionEntity> get userNoSuchMethods {
     List<FunctionEntity> functions = <FunctionEntity>[];
 
-    void processMemberUse(MemberEntity member, _MemberUsage memberUsage) {
+    void processMemberUse(MemberEntity member, MemberUsage memberUsage) {
       if (member.isInstanceMember &&
           member is FunctionEntity &&
           memberUsage.hasUse &&
diff --git a/pkg/compiler/lib/src/universe/feature.dart b/pkg/compiler/lib/src/universe/feature.dart
index f854843..1367e6d 100644
--- a/pkg/compiler/lib/src/universe/feature.dart
+++ b/pkg/compiler/lib/src/universe/feature.dart
@@ -9,6 +9,7 @@
 library compiler.universe.feature;
 
 import '../elements/types.dart';
+import '../ir/runtime_type_analysis.dart';
 import '../util/util.dart';
 
 /// A language feature that may be seen in the program.
@@ -148,21 +149,6 @@
   }
 }
 
-/// Enum for recognized use kinds of `Object.runtimeType`.
-enum RuntimeTypeUseKind {
-  /// Unknown use of `Object.runtimeType`. This is the fallback value if the
-  /// usage didn't match any of the recogized patterns.
-  unknown,
-
-  /// `Object.runtimeType` used in a pattern like
-  /// `a.runtimeType == b.runtimeType`.
-  equals,
-
-  /// `Object.runtimeType` used in a pattern like `'${e.runtimeType}'` or
-  /// `e.runtimeType.toString()`.
-  string,
-}
-
 /// A use of `Object.runtimeType`.
 class RuntimeTypeUse {
   /// The use kind of `Object.runtimeType`.
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index 5f78a8e..e8edd4b 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.dart
@@ -6,7 +6,7 @@
 
 import '../common/names.dart' show Identifiers, Selectors;
 import '../elements/entities.dart';
-import '../types/abstract_value_domain.dart';
+import '../inferrer/abstract_value_domain.dart';
 import '../util/util.dart' show Hashing, Setlet;
 import 'selector.dart' show Selector;
 
@@ -108,11 +108,15 @@
 
   bool applies(MemberEntity element, AbstractValueDomain domain) {
     if (!selector.appliesUnnamed(element)) return false;
-    return domain.canHit(receiver, element, selector);
+    return domain
+        .isTargetingMember(receiver, element, selector.memberName)
+        .isPotentiallyTrue;
   }
 
   bool needsNoSuchMethodHandling(AbstractValueDomain domain) {
-    return domain.needsNoSuchMethodHandling(receiver, selector);
+    return domain
+        .needsNoSuchMethodHandling(receiver, selector)
+        .isPotentiallyTrue;
   }
 
   bool operator ==(other) {
diff --git a/pkg/compiler/lib/src/universe/member_usage.dart b/pkg/compiler/lib/src/universe/member_usage.dart
index de15737..6b166f8 100644
--- a/pkg/compiler/lib/src/universe/member_usage.dart
+++ b/pkg/compiler/lib/src/universe/member_usage.dart
@@ -2,7 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of world_builder;
+import '../common.dart';
+import '../elements/entities.dart';
+import '../js_model/elements.dart' show JSignatureMethod;
+import '../util/enumset.dart';
 
 abstract class AbstractUsage<T> {
   final EnumSet<T> _pendingUse = new EnumSet<T>();
@@ -31,27 +34,27 @@
 }
 
 /// Registry for the observed use of a member [entity] in the open world.
-abstract class _MemberUsage extends AbstractUsage<MemberUse> {
+abstract class MemberUsage extends AbstractUsage<MemberUse> {
   final MemberEntity entity;
 
-  _MemberUsage.internal(this.entity);
+  MemberUsage.internal(this.entity);
 
-  factory _MemberUsage(MemberEntity member, {bool isNative: false}) {
+  factory MemberUsage(MemberEntity member, {bool isNative: false}) {
     if (member.isField) {
       if (member.isAssignable) {
-        return new _FieldUsage(member, isNative: isNative);
+        return new FieldUsage(member, isNative: isNative);
       } else {
-        return new _FinalFieldUsage(member, isNative: isNative);
+        return new FinalFieldUsage(member, isNative: isNative);
       }
     } else if (member.isGetter) {
-      return new _GetterUsage(member);
+      return new GetterUsage(member);
     } else if (member.isSetter) {
-      return new _SetterUsage(member);
+      return new SetterUsage(member);
     } else if (member.isConstructor) {
-      return new _ConstructorUsage(member);
+      return new ConstructorUsage(member);
     } else {
       assert(member.isFunction, failedAt(member, "Unexpected member: $member"));
-      return new _FunctionUsage(member);
+      return new FunctionUsage(member);
     }
   }
 
@@ -106,18 +109,18 @@
 
   bool operator ==(other) {
     if (identical(this, other)) return true;
-    if (other is! _MemberUsage) return false;
+    if (other is! MemberUsage) return false;
     return entity == other.entity;
   }
 
   String toString() => '$entity:${appliedUse.iterable(MemberUse.values)}';
 }
 
-class _FieldUsage extends _MemberUsage {
+class FieldUsage extends MemberUsage {
   bool hasRead = false;
   bool hasWrite = false;
 
-  _FieldUsage(FieldEntity field, {bool isNative: false})
+  FieldUsage(FieldEntity field, {bool isNative: false})
       : super.internal(field) {
     if (!isNative) {
       // All field initializers must be resolved as they could
@@ -164,10 +167,10 @@
   }
 }
 
-class _FinalFieldUsage extends _MemberUsage {
+class FinalFieldUsage extends MemberUsage {
   bool hasRead = false;
 
-  _FinalFieldUsage(FieldEntity field, {bool isNative: false})
+  FinalFieldUsage(FieldEntity field, {bool isNative: false})
       : super.internal(field) {
     if (!isNative) {
       // All field initializers must be resolved as they could
@@ -199,11 +202,11 @@
   EnumSet<MemberUse> fullyUse() => read();
 }
 
-class _FunctionUsage extends _MemberUsage {
+class FunctionUsage extends MemberUsage {
   bool hasInvoke = false;
   bool hasRead = false;
 
-  _FunctionUsage(FunctionEntity function) : super.internal(function) {
+  FunctionUsage(FunctionEntity function) : super.internal(function) {
     if (function is JSignatureMethod) {
       // We mark signature methods as "always used" to prevent them from being
       // optimized away.
@@ -253,10 +256,10 @@
   bool get fullyUsed => hasInvoke && hasRead;
 }
 
-class _GetterUsage extends _MemberUsage {
+class GetterUsage extends MemberUsage {
   bool hasRead = false;
 
-  _GetterUsage(FunctionEntity getter) : super.internal(getter);
+  GetterUsage(FunctionEntity getter) : super.internal(getter);
 
   @override
   bool get fullyUsed => hasRead;
@@ -277,10 +280,10 @@
   EnumSet<MemberUse> fullyUse() => read();
 }
 
-class _SetterUsage extends _MemberUsage {
+class SetterUsage extends MemberUsage {
   bool hasWrite = false;
 
-  _SetterUsage(FunctionEntity setter) : super.internal(setter);
+  SetterUsage(FunctionEntity setter) : super.internal(setter);
 
   @override
   bool get fullyUsed => hasWrite;
@@ -298,11 +301,10 @@
   EnumSet<MemberUse> fullyUse() => write();
 }
 
-class _ConstructorUsage extends _MemberUsage {
+class ConstructorUsage extends MemberUsage {
   bool hasInvoke = false;
 
-  _ConstructorUsage(ConstructorEntity constructor)
-      : super.internal(constructor);
+  ConstructorUsage(ConstructorEntity constructor) : super.internal(constructor);
 
   EnumSet<MemberUse> get _originalUse => MemberUses.NORMAL_ONLY;
 
@@ -345,13 +347,13 @@
 
 /// Registry for the observed use of a class [entity] in the open world.
 // TODO(johnniwinther): Merge this with [InstantiationInfo].
-class _ClassUsage extends AbstractUsage<ClassUse> {
+class ClassUsage extends AbstractUsage<ClassUse> {
   bool isInstantiated = false;
   bool isImplemented = false;
 
   final ClassEntity cls;
 
-  _ClassUsage(this.cls);
+  ClassUsage(this.cls);
 
   EnumSet<ClassUse> instantiate() {
     if (isInstantiated) {
@@ -390,15 +392,15 @@
 
 typedef void ClassUsedCallback(ClassEntity cls, EnumSet<ClassUse> useSet);
 
-// TODO(johnniwinther): Merge this with [_MemberUsage].
-abstract class _StaticMemberUsage extends AbstractUsage<MemberUse>
-    implements _MemberUsage {
+// TODO(johnniwinther): Merge this with [MemberUsage].
+abstract class StaticMemberUsage extends AbstractUsage<MemberUse>
+    implements MemberUsage {
   final MemberEntity entity;
 
   bool hasNormalUse = false;
   bool get hasClosurization => false;
 
-  _StaticMemberUsage.internal(this.entity);
+  StaticMemberUsage.internal(this.entity);
 
   EnumSet<MemberUse> normalUse() {
     if (hasNormalUse) {
@@ -426,8 +428,8 @@
   String toString() => '$entity:${appliedUse.iterable(MemberUse.values)}';
 }
 
-class _GeneralStaticMemberUsage extends _StaticMemberUsage {
-  _GeneralStaticMemberUsage(MemberEntity entity) : super.internal(entity);
+class GeneralStaticMemberUsage extends StaticMemberUsage {
+  GeneralStaticMemberUsage(MemberEntity entity) : super.internal(entity);
 
   EnumSet<MemberUse> tearOff() => normalUse();
 
@@ -444,10 +446,10 @@
   bool get hasRead => hasNormalUse;
 }
 
-class _StaticFunctionUsage extends _StaticMemberUsage {
+class StaticFunctionUsage extends StaticMemberUsage {
   bool hasClosurization = false;
 
-  _StaticFunctionUsage(MemberEntity entity) : super.internal(entity);
+  StaticFunctionUsage(MemberEntity entity) : super.internal(entity);
 
   EnumSet<MemberUse> tearOff() {
     if (hasClosurization) {
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index b203dc9..fee6d25 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -2,7 +2,36 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of world_builder;
+import '../common.dart';
+import '../common/names.dart' show Identifiers, Names;
+import '../common_elements.dart';
+import '../constants/values.dart';
+import '../elements/entities.dart';
+import '../elements/types.dart';
+import '../ir/static_type.dart';
+import '../js_backend/annotations.dart';
+import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
+import '../js_backend/backend_usage.dart'
+    show BackendUsage, BackendUsageBuilder;
+import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
+import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
+import '../js_backend/no_such_method_registry.dart';
+import '../js_backend/runtime_types.dart';
+import '../kernel/element_map_impl.dart';
+import '../kernel/kelements.dart';
+import '../kernel/kernel_world.dart';
+import '../native/enqueue.dart' show NativeResolutionEnqueuer;
+import '../options.dart';
+import '../universe/class_set.dart';
+import '../util/enumset.dart';
+import '../util/util.dart';
+import '../world.dart' show KClosedWorld, OpenWorld;
+import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
+import 'member_usage.dart';
+import 'selector.dart' show Selector;
+import 'use.dart'
+    show ConstantUse, DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
+import 'world_builder.dart';
 
 abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld {
   /// Calls [f] for all local functions in the program together with the member
@@ -282,11 +311,9 @@
   /// Invariant: Elements are declaration elements.
   final Set<FieldEntity> allReferencedStaticFields = new Set<FieldEntity>();
 
-  /**
-   * Documentation wanted -- johnniwinther
-   *
-   * Invariant: Elements are declaration elements.
-   */
+  /// Documentation wanted -- johnniwinther
+  ///
+  /// Invariant: Elements are declaration elements.
   final Set<FunctionEntity> methodsNeedingSuperGetter =
       new Set<FunctionEntity>();
   final Map<String, Map<Selector, SelectorConstraints>> _invokedNames =
@@ -296,18 +323,18 @@
   final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
       <String, Map<Selector, SelectorConstraints>>{};
 
-  final Map<ClassEntity, _ClassUsage> _processedClasses =
-      <ClassEntity, _ClassUsage>{};
+  final Map<ClassEntity, ClassUsage> _processedClasses =
+      <ClassEntity, ClassUsage>{};
 
-  Map<ClassEntity, _ClassUsage> get classUsageForTesting => _processedClasses;
+  Map<ClassEntity, ClassUsage> get classUsageForTesting => _processedClasses;
 
   /// Map of registered usage of static members of live classes.
-  final Map<MemberEntity, _MemberUsage> _memberUsage =
-      <MemberEntity, _MemberUsage>{};
+  final Map<MemberEntity, MemberUsage> _memberUsage =
+      <MemberEntity, MemberUsage>{};
 
-  Map<MemberEntity, _MemberUsage> get staticMemberUsageForTesting {
-    Map<MemberEntity, _MemberUsage> map = <MemberEntity, _MemberUsage>{};
-    _memberUsage.forEach((MemberEntity member, _MemberUsage usage) {
+  Map<MemberEntity, MemberUsage> get staticMemberUsageForTesting {
+    Map<MemberEntity, MemberUsage> map = <MemberEntity, MemberUsage>{};
+    _memberUsage.forEach((MemberEntity member, MemberUsage usage) {
       if (!member.isInstanceMember) {
         map[member] = usage;
       }
@@ -315,9 +342,9 @@
     return map;
   }
 
-  Map<MemberEntity, _MemberUsage> get instanceMemberUsageForTesting {
-    Map<MemberEntity, _MemberUsage> map = <MemberEntity, _MemberUsage>{};
-    _memberUsage.forEach((MemberEntity member, _MemberUsage usage) {
+  Map<MemberEntity, MemberUsage> get instanceMemberUsageForTesting {
+    Map<MemberEntity, MemberUsage> map = <MemberEntity, MemberUsage>{};
+    _memberUsage.forEach((MemberEntity member, MemberUsage usage) {
       if (member.isInstanceMember) {
         map[member] = usage;
       }
@@ -327,13 +354,13 @@
 
   /// Map containing instance members of live classes that are not yet live
   /// themselves.
-  final Map<String, Set<_MemberUsage>> _instanceMembersByName =
-      <String, Set<_MemberUsage>>{};
+  final Map<String, Set<MemberUsage>> _instanceMembersByName =
+      <String, Set<MemberUsage>>{};
 
   /// Map containing instance methods of live classes that are not yet
   /// closurized.
-  final Map<String, Set<_MemberUsage>> _instanceFunctionsByName =
-      <String, Set<_MemberUsage>>{};
+  final Map<String, Set<MemberUsage>> _instanceFunctionsByName =
+      <String, Set<MemberUsage>>{};
 
   /// Fields set.
   final Set<FieldEntity> fieldSetters = new Set<FieldEntity>();
@@ -370,6 +397,7 @@
   final KAllocatorAnalysis _allocatorAnalysis;
   final NativeResolutionEnqueuer _nativeResolutionEnqueuer;
   final NoSuchMethodRegistry _noSuchMethodRegistry;
+  final AnnotationsDataBuilder _annotationsDataBuilder;
 
   final SelectorConstraintsStrategy _selectorConstraintsStrategy;
   final ClassHierarchyBuilder _classHierarchyBuilder;
@@ -406,6 +434,7 @@
       this._allocatorAnalysis,
       this._nativeResolutionEnqueuer,
       this._noSuchMethodRegistry,
+      this._annotationsDataBuilder,
       this._selectorConstraintsStrategy,
       this._classHierarchyBuilder,
       this._classQueries);
@@ -558,7 +587,7 @@
     for (Selector selector in selectors.keys) {
       if (selector.appliesUnnamed(member)) {
         SelectorConstraints masks = selectors[selector];
-        if (masks.applies(member, selector, this)) {
+        if (masks.canHit(member, selector.memberName, this)) {
           return true;
         }
       }
@@ -589,11 +618,12 @@
     Selector selector = dynamicUse.selector;
     String methodName = selector.name;
 
-    void _process(Map<String, Set<_MemberUsage>> memberMap,
-        EnumSet<MemberUse> action(_MemberUsage usage)) {
-      _processSet(memberMap, methodName, (_MemberUsage usage) {
-        if (_selectorConstraintsStrategy.appliedUnnamed(
-            dynamicUse, usage.entity, this)) {
+    void _process(Map<String, Set<MemberUsage>> memberMap,
+        EnumSet<MemberUse> action(MemberUsage usage)) {
+      _processSet(memberMap, methodName, (MemberUsage usage) {
+        if (selector.appliesUnnamed(usage.entity) &&
+            _selectorConstraintsStrategy.appliedUnnamed(
+                dynamicUse, usage.entity, this)) {
           memberUsed(usage.entity, action(usage));
           return true;
         }
@@ -630,10 +660,12 @@
     Object constraint = dynamicUse.receiverConstraint;
     Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
         name, () => new Maplet<Selector, SelectorConstraints>());
-    UniverseSelectorConstraints constraints =
-        selectors.putIfAbsent(selector, () {
-      return _selectorConstraintsStrategy.createSelectorConstraints(selector);
-    });
+    UniverseSelectorConstraints constraints = selectors[selector];
+    if (constraints == null) {
+      selectors[selector] = _selectorConstraintsStrategy
+          .createSelectorConstraints(selector, constraint);
+      return true;
+    }
     return constraints.addReceiverConstraint(constraint);
   }
 
@@ -669,8 +701,8 @@
 
     MemberEntity element = staticUse.element;
     EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
-    _MemberUsage usage = _memberUsage.putIfAbsent(element, () {
-      _MemberUsage usage = new _MemberUsage(element);
+    MemberUsage usage = _memberUsage.putIfAbsent(element, () {
+      MemberUsage usage = new MemberUsage(element);
       useSet.addAll(usage.appliedUse);
       return usage;
     });
@@ -738,14 +770,14 @@
     }
   }
 
-  /// Called to create a [_ClassUsage] for [cls].
+  /// Called to create a [ClassUsage] for [cls].
   ///
   /// Subclasses override this to ensure needed invariants on [cls].
-  _ClassUsage _createClassUsage(covariant ClassEntity cls) =>
-      new _ClassUsage(cls);
+  ClassUsage _createClassUsage(covariant ClassEntity cls) =>
+      new ClassUsage(cls);
 
-  /// Return the canonical [_ClassUsage] for [cls].
-  _ClassUsage _getClassUsage(ClassEntity cls) {
+  /// Return the canonical [ClassUsage] for [cls].
+  ClassUsage _getClassUsage(ClassEntity cls) {
     return _processedClasses.putIfAbsent(cls, () {
       return _createClassUsage(cls);
     });
@@ -757,7 +789,7 @@
     // already instantiated and we therefore have to process its superclass as
     // well.
     bool processClass(ClassEntity superclass) {
-      _ClassUsage usage = _getClassUsage(superclass);
+      ClassUsage usage = _getClassUsage(superclass);
       if (!usage.isInstantiated) {
         classUsed(usage.cls, usage.instantiate());
         return true;
@@ -779,19 +811,19 @@
     });
   }
 
-  /// Call [updateUsage] on all [_MemberUsage]s in the set in [map] for
+  /// Call [updateUsage] on all [MemberUsage]s in the set in [map] for
   /// [memberName]. If [updateUsage] returns `true` the usage is removed from
   /// the set.
-  void _processSet(Map<String, Set<_MemberUsage>> map, String memberName,
-      bool updateUsage(_MemberUsage e)) {
-    Set<_MemberUsage> members = map[memberName];
+  void _processSet(Map<String, Set<MemberUsage>> map, String memberName,
+      bool updateUsage(MemberUsage e)) {
+    Set<MemberUsage> members = map[memberName];
     if (members == null) return;
     // [f] might add elements to [: map[memberName] :] during the loop below
     // so we create a new list for [: map[memberName] :] and prepend the
     // [remaining] members after the loop.
-    map[memberName] = new Set<_MemberUsage>();
-    Set<_MemberUsage> remaining = new Set<_MemberUsage>();
-    for (_MemberUsage usage in members) {
+    map[memberName] = new Set<MemberUsage>();
+    Set<MemberUsage> remaining = new Set<MemberUsage>();
+    for (MemberUsage usage in members) {
       if (!updateUsage(usage)) remaining.add(usage);
     }
     map[memberName].addAll(remaining);
@@ -809,11 +841,11 @@
     // Note: this assumes that there are no non-native fields on native
     // classes, which may not be the case when a native class is subclassed.
     bool newUsage = false;
-    _MemberUsage usage = _memberUsage.putIfAbsent(member, () {
+    MemberUsage usage = _memberUsage.putIfAbsent(member, () {
       newUsage = true;
       bool isNative = _nativeBasicData.isNativeClass(cls);
       EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
-      _MemberUsage usage = new _MemberUsage(member, isNative: isNative);
+      MemberUsage usage = new MemberUsage(member, isNative: isNative);
       useSet.addAll(usage.appliedUse);
       if (member.isField && isNative) {
         registerUsedElement(member);
@@ -838,14 +870,14 @@
         // The element is not yet used. Add it to the list of instance
         // members to still be processed.
         _instanceMembersByName
-            .putIfAbsent(memberName, () => new Set<_MemberUsage>())
+            .putIfAbsent(memberName, () => new Set<MemberUsage>())
             .add(usage);
       }
       if (usage.pendingUse.contains(MemberUse.CLOSURIZE_INSTANCE)) {
         // Store the member in [instanceFunctionsByName] to catch
         // getters on the function.
         _instanceFunctionsByName
-            .putIfAbsent(memberName, () => new Set<_MemberUsage>())
+            .putIfAbsent(memberName, () => new Set<MemberUsage>())
             .add(usage);
       }
       memberUsed(usage.entity, useSet);
@@ -942,11 +974,33 @@
     _classHierarchyBuilder.registerClass(cls);
   }
 
-  bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type) {
+  @override
+  bool isInheritedIn(
+      MemberEntity member, ClassEntity type, ClassRelation relation) {
     // TODO(johnniwinther): Use the [member] itself to avoid enqueueing members
     // that are overridden.
-    return _classHierarchyBuilder.isInheritedInSubtypeOf(
-        member.enclosingClass, type);
+    return isInheritedInClass(member.enclosingClass, type, relation);
+  }
+
+  bool isInheritedInClass(ClassEntity memberHoldingClass, ClassEntity type,
+      ClassRelation relation) {
+    switch (relation) {
+      case ClassRelation.exact:
+        return _classHierarchyBuilder.isInheritedInExactClass(
+            memberHoldingClass, type);
+      case ClassRelation.thisExpression:
+        return _classHierarchyBuilder.isInheritedInThisClass(
+            memberHoldingClass, type);
+      case ClassRelation.subtype:
+        if (memberHoldingClass == _commonElements.nullClass ||
+            memberHoldingClass == _commonElements.jsNullClass) {
+          // Members of `Null` and `JSNull` are always potential targets.
+          return true;
+        }
+        return _classHierarchyBuilder.isInheritedInSubtypeOf(
+            memberHoldingClass, type);
+    }
+    throw new UnsupportedError("Unexpected ClassRelation $relation.");
   }
 
   @override
@@ -972,15 +1026,6 @@
 
     BackendUsage backendUsage = _backendUsageBuilder.close();
     _closed = true;
-    assert(
-        _classHierarchyBuilder.classHierarchyNodes.length ==
-            _classHierarchyBuilder.classSets.length,
-        "ClassHierarchyNode/ClassSet mismatch: "
-        "${_classHierarchyBuilder.classHierarchyNodes} vs "
-        "${_classHierarchyBuilder.classSets}");
-
-    AnnotationsData annotationsData = processAnnotations(
-        reporter, _commonElements, _elementEnvironment, _processedMembers);
 
     KClosedWorld closedWorld = new KClosedWorldImpl(_elementMap,
         options: _options,
@@ -1001,9 +1046,8 @@
         processedMembers: _processedMembers,
         mixinUses: _classHierarchyBuilder.mixinUses,
         typesImplementedBySubclasses: typesImplementedBySubclasses,
-        classHierarchyNodes: _classHierarchyBuilder.classHierarchyNodes,
-        classSets: _classHierarchyBuilder.classSets,
-        annotationsData: annotationsData);
+        classHierarchy: _classHierarchyBuilder.close(),
+        annotationsData: _annotationsDataBuilder);
     if (retainDataForTesting) {
       _closedWorldCache = closedWorld;
     }
diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart
index acc7100..0696300 100644
--- a/pkg/compiler/lib/src/universe/selector.dart
+++ b/pkg/compiler/lib/src/universe/selector.dart
@@ -10,6 +10,7 @@
 import '../elements/entity_utils.dart' as utils;
 import '../elements/names.dart';
 import '../elements/operators.dart';
+import '../kernel/invocation_mirror_constants.dart';
 import '../serialization/serialization.dart';
 import '../util/util.dart' show Hashing;
 import 'call_structure.dart' show CallStructure;
@@ -232,15 +233,9 @@
   bool get isOperator => kind == SelectorKind.OPERATOR;
   bool get isUnaryOperator => isOperator && argumentCount == 0;
 
-  /**
-   * The member name for invocation mirrors created from this selector.
-   */
+  /// The member name for invocation mirrors created from this selector.
   String get invocationMirrorMemberName => isSetter ? '$name=' : name;
 
-  static const int invocationMirrorMethodKind = 0;
-  static const int invocationMirrorGetterKind = 1;
-  static const int invocationMirrorSetterKind = 2;
-
   int get invocationMirrorKind {
     int kind = invocationMirrorMethodKind;
     if (isGetter) {
@@ -253,11 +248,6 @@
 
   bool appliesUnnamed(MemberEntity element) {
     assert(name == element.name);
-    return appliesUntyped(element);
-  }
-
-  bool appliesUntyped(MemberEntity element) {
-    assert(name == element.name);
     if (memberName.isPrivate && memberName.library != element.library) {
       // TODO(johnniwinther): Maybe this should be
       // `memberName != element.memberName`.
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 5e7b719..9ba793f 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -33,8 +33,8 @@
 }
 
 /// The use of a dynamic property. [selector] defined the name and kind of the
-/// property and [receiverConstraint] defines the known constraint for the object on which
-/// the property is accessed.
+/// property and [receiverConstraint] defines the known constraint for the
+/// object on which the property is accessed.
 class DynamicUse {
   final Selector selector;
 
@@ -46,6 +46,11 @@
     if (receiverConstraint != null) {
       var constraint = receiverConstraint;
       if (constraint is StrongModeConstraint) {
+        if (constraint.isThis) {
+          sb.write('this:');
+        } else if (constraint.isExact) {
+          sb.write('exact:');
+        }
         sb.write(constraint.cls.name);
       } else {
         sb.write(constraint);
@@ -168,12 +173,22 @@
   final int hashCode;
   final InterfaceType type;
   final CallStructure callStructure;
+  final ImportEntity deferredImport;
 
   StaticUse.internal(Entity element, this.kind,
-      {this.type, this.callStructure, typeArgumentsHash: 0})
+      {this.type,
+      this.callStructure,
+      this.deferredImport,
+      typeArgumentsHash: 0})
       : this.element = element,
-        this.hashCode = Hashing.objectsHash(
-            element, kind, type, typeArgumentsHash, callStructure);
+        this.hashCode = Hashing.listHash([
+          element,
+          kind,
+          type,
+          typeArgumentsHash,
+          callStructure,
+          deferredImport
+        ]);
 
   /// Short textual representation use for testing.
   String get shortText {
@@ -227,30 +242,33 @@
   /// [callStructure].
   factory StaticUse.staticInvoke(
       FunctionEntity element, CallStructure callStructure,
-      [List<DartType> typeArguments]) {
+      [List<DartType> typeArguments, ImportEntity deferredImport]) {
     assert(
         element.isStatic || element.isTopLevel,
         failedAt(
             element,
             "Static invoke element $element must be a top-level "
             "or static method."));
-    return new GenericStaticUse(
-        element, StaticUseKind.INVOKE, callStructure, typeArguments);
+    return new GenericStaticUse(element, StaticUseKind.INVOKE, callStructure,
+        typeArguments, deferredImport);
   }
 
   /// Closurization of a static or top-level function [element].
-  factory StaticUse.staticTearOff(FunctionEntity element) {
+  factory StaticUse.staticTearOff(FunctionEntity element,
+      [ImportEntity deferredImport]) {
     assert(
         element.isStatic || element.isTopLevel,
         failedAt(
             element,
             "Static tear-off element $element must be a top-level "
             "or static method."));
-    return new StaticUse.internal(element, StaticUseKind.STATIC_TEAR_OFF);
+    return new StaticUse.internal(element, StaticUseKind.STATIC_TEAR_OFF,
+        deferredImport: deferredImport);
   }
 
   /// Read access of a static or top-level field or getter [element].
-  factory StaticUse.staticGet(MemberEntity element) {
+  factory StaticUse.staticGet(MemberEntity element,
+      [ImportEntity deferredImport]) {
     assert(
         element.isStatic || element.isTopLevel,
         failedAt(
@@ -261,11 +279,13 @@
         element.isField || element.isGetter,
         failedAt(element,
             "Static get element $element must be a field or a getter."));
-    return new StaticUse.internal(element, StaticUseKind.GET);
+    return new StaticUse.internal(element, StaticUseKind.GET,
+        deferredImport: deferredImport);
   }
 
   /// Write access of a static or top-level field or setter [element].
-  factory StaticUse.staticSet(MemberEntity element) {
+  factory StaticUse.staticSet(MemberEntity element,
+      [ImportEntity deferredImport]) {
     assert(
         element.isStatic || element.isTopLevel,
         failedAt(
@@ -276,7 +296,8 @@
         element.isField || element.isSetter,
         failedAt(element,
             "Static set element $element must be a field or a setter."));
-    return new StaticUse.internal(element, StaticUseKind.SET);
+    return new StaticUse.internal(element, StaticUseKind.SET,
+        deferredImport: deferredImport);
   }
 
   /// Invocation of the lazy initializer for a static or top-level field
@@ -427,8 +448,11 @@
 
   /// Constructor invocation of [element] with the given [callStructure] on
   /// [type].
-  factory StaticUse.typedConstructorInvoke(ConstructorEntity element,
-      CallStructure callStructure, InterfaceType type) {
+  factory StaticUse.typedConstructorInvoke(
+      ConstructorEntity element,
+      CallStructure callStructure,
+      InterfaceType type,
+      ImportEntity deferredImport) {
     assert(type != null,
         failedAt(element, "No type provided for constructor invocation."));
     assert(
@@ -438,13 +462,18 @@
             "Typed constructor invocation element $element "
             "must be a constructor."));
     return new StaticUse.internal(element, StaticUseKind.CONSTRUCTOR_INVOKE,
-        type: type, callStructure: callStructure);
+        type: type,
+        callStructure: callStructure,
+        deferredImport: deferredImport);
   }
 
   /// Constant constructor invocation of [element] with the given
   /// [callStructure] on [type].
-  factory StaticUse.constConstructorInvoke(ConstructorEntity element,
-      CallStructure callStructure, InterfaceType type) {
+  factory StaticUse.constConstructorInvoke(
+      ConstructorEntity element,
+      CallStructure callStructure,
+      InterfaceType type,
+      ImportEntity deferredImport) {
     assert(type != null,
         failedAt(element, "No type provided for constructor invocation."));
     assert(
@@ -455,7 +484,9 @@
             "must be a constructor."));
     return new StaticUse.internal(
         element, StaticUseKind.CONST_CONSTRUCTOR_INVOKE,
-        type: type, callStructure: callStructure);
+        type: type,
+        callStructure: callStructure,
+        deferredImport: deferredImport);
   }
 
   /// Constructor redirection to [element] on [type].
@@ -558,9 +589,11 @@
   final List<DartType> typeArguments;
 
   GenericStaticUse(Entity entity, StaticUseKind kind,
-      CallStructure callStructure, this.typeArguments)
+      CallStructure callStructure, this.typeArguments,
+      [ImportEntity deferredImport])
       : super.internal(entity, kind,
             callStructure: callStructure,
+            deferredImport: deferredImport,
             typeArgumentsHash: Hashing.listHash(typeArguments)) {
     assert(
         (callStructure?.typeArgumentCount ?? 0) == (typeArguments?.length ?? 0),
@@ -594,11 +627,12 @@
   final DartType type;
   final TypeUseKind kind;
   final int hashCode;
+  final ImportEntity deferredImport;
 
-  TypeUse.internal(DartType type, TypeUseKind kind)
+  TypeUse.internal(DartType type, TypeUseKind kind, [this.deferredImport])
       : this.type = type,
         this.kind = kind,
-        this.hashCode = Hashing.objectHash(type, Hashing.objectHash(kind));
+        this.hashCode = Hashing.objectsHash(type, kind, deferredImport);
 
   /// Short textual representation use for testing.
   String get shortText {
@@ -673,8 +707,8 @@
   }
 
   /// [type] used as a type literal, like `foo() => T;`.
-  factory TypeUse.typeLiteral(DartType type) {
-    return new TypeUse.internal(type, TypeUseKind.TYPE_LITERAL);
+  factory TypeUse.typeLiteral(DartType type, ImportEntity deferredImport) {
+    return new TypeUse.internal(type, TypeUseKind.TYPE_LITERAL, deferredImport);
   }
 
   /// [type] used in an instantiation, like `new T();`.
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 84aa6d3..e80c180 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -4,47 +4,15 @@
 
 library world_builder;
 
-import 'dart:collection';
-
-import '../common.dart';
-import '../common/names.dart' show Identifiers, Names;
 import '../common_elements.dart';
-import '../constants/values.dart';
 import '../elements/entities.dart';
+import '../elements/names.dart';
 import '../elements/types.dart';
-import '../js_backend/annotations.dart';
-import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
-import '../js_backend/backend_usage.dart'
-    show BackendUsage, BackendUsageBuilder;
-import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
-import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
-import '../js_backend/no_such_method_registry.dart';
-import '../js_backend/runtime_types.dart';
-import '../js_model/locals.dart';
-import '../js_model/element_map_impl.dart';
-import '../js_model/elements.dart' show JSignatureMethod;
-import '../kernel/element_map_impl.dart';
-import '../kernel/kelements.dart';
-import '../native/enqueue.dart' show NativeResolutionEnqueuer;
-import '../options.dart';
-import '../universe/class_set.dart';
-import '../util/enumset.dart';
-import '../util/util.dart';
-import '../world.dart' show World, JClosedWorld, KClosedWorld, OpenWorld;
-import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
+import '../ir/static_type.dart';
+import '../js_backend/native_data.dart' show NativeBasicData;
+import '../world.dart' show World, JClosedWorld, OpenWorld;
 import 'selector.dart' show Selector;
-import 'use.dart'
-    show
-        ConstantUse,
-        ConstantUseKind,
-        DynamicUse,
-        DynamicUseKind,
-        StaticUse,
-        StaticUseKind;
-
-part 'codegen_world_builder.dart';
-part 'member_usage.dart';
-part 'resolution_world_builder.dart';
+import 'use.dart' show DynamicUse, StaticUse;
 
 /// The combined constraints on receivers all the dynamic call sites of the same
 /// selector.
@@ -66,7 +34,7 @@
 /// the selector constraints for dynamic calls to 'foo' with two positional
 /// arguments could be 'receiver of exact instance `A` or `B`'.
 abstract class SelectorConstraints {
-  /// Returns `true` if [selector] applies to [element] under these constraints
+  /// Returns `true` if [name] applies to [element] under these constraints
   /// given the closed [world].
   ///
   /// Consider for instance in this world:
@@ -81,7 +49,7 @@
   ///
   /// Ideally the selector constraints for calls `foo` with two positional
   /// arguments apply to `A.foo` but `B.foo`.
-  bool applies(MemberEntity element, Selector selector, covariant World world);
+  bool canHit(MemberEntity element, Name name, covariant World world);
 
   /// Returns `true` if at least one of the receivers matching these constraints
   /// in the closed [world] have no implementation matching [selector].
@@ -109,7 +77,8 @@
 abstract class SelectorConstraintsStrategy {
   /// Create a [UniverseSelectorConstraints] to represent the global receiver
   /// constraints for dynamic call sites with [selector].
-  UniverseSelectorConstraints createSelectorConstraints(Selector selector);
+  UniverseSelectorConstraints createSelectorConstraints(
+      Selector selector, Object initialConstraint);
 
   /// Returns `true`  if [member] is a potential target of [dynamicUse].
   bool appliedUnnamed(DynamicUse dynamicUse, MemberEntity member, World world);
@@ -122,8 +91,10 @@
 class StrongModeWorldStrategy implements SelectorConstraintsStrategy {
   const StrongModeWorldStrategy();
 
-  StrongModeWorldConstraints createSelectorConstraints(Selector selector) {
-    return new StrongModeWorldConstraints();
+  StrongModeWorldConstraints createSelectorConstraints(
+      Selector selector, Object initialConstraint) {
+    return new StrongModeWorldConstraints()
+      ..addReceiverConstraint(initialConstraint);
   }
 
   @override
@@ -132,7 +103,8 @@
     Selector selector = dynamicUse.selector;
     StrongModeConstraint constraint = dynamicUse.receiverConstraint;
     return selector.appliesUnnamed(member) &&
-        (constraint == null || constraint.canHit(member, selector, world));
+        (constraint == null ||
+            constraint.canHit(member, selector.memberName, world));
   }
 }
 
@@ -141,11 +113,11 @@
   Set<StrongModeConstraint> _constraints;
 
   @override
-  bool applies(MemberEntity element, Selector selector, World world) {
+  bool canHit(MemberEntity element, Name name, World world) {
     if (isAll) return true;
     if (_constraints == null) return false;
     for (StrongModeConstraint constraint in _constraints) {
-      if (constraint.canHit(element, selector, world)) {
+      if (constraint.canHit(element, name, world)) {
         return true;
       }
     }
@@ -192,34 +164,42 @@
 
 class StrongModeConstraint {
   final ClassEntity cls;
+  final ClassRelation relation;
 
   factory StrongModeConstraint(CommonElements commonElements,
-      NativeBasicData nativeBasicData, ClassEntity cls) {
+      NativeBasicData nativeBasicData, ClassEntity cls,
+      [ClassRelation relation = ClassRelation.subtype]) {
     if (nativeBasicData.isJsInteropClass(cls)) {
       // We can not tell js-interop classes apart, so we just assume the
       // receiver could be any js-interop class.
       cls = commonElements.jsJavaScriptObjectClass;
+      relation = ClassRelation.subtype;
     }
-    return new StrongModeConstraint.internal(cls);
+    return new StrongModeConstraint.internal(cls, relation);
   }
 
-  const StrongModeConstraint.internal(this.cls);
+  const StrongModeConstraint.internal(this.cls, this.relation);
 
   bool needsNoSuchMethodHandling(Selector selector, World world) => true;
 
-  bool canHit(MemberEntity element, Selector selector, OpenWorld world) {
-    return world.isInheritedInSubtypeOf(element, cls);
+  bool canHit(MemberEntity element, Name name, OpenWorld world) {
+    return world.isInheritedIn(element, cls, relation);
   }
 
-  bool operator ==(other) {
+  bool get isExact => relation == ClassRelation.exact;
+
+  bool get isThis => relation == ClassRelation.thisExpression;
+
+  bool operator ==(Object other) {
     if (identical(this, other)) return true;
-    if (other is! StrongModeConstraint) return false;
-    return cls == other.cls;
+    return other is StrongModeConstraint &&
+        cls == other.cls &&
+        relation == other.relation;
   }
 
   int get hashCode => cls.hashCode * 13;
 
-  String toString() => 'StrongModeConstraint($cls)';
+  String toString() => 'StrongModeConstraint($cls,$relation)';
 }
 
 /// The [WorldBuilder] is an auxiliary class used in the process of computing
diff --git a/pkg/compiler/lib/src/util/features.dart b/pkg/compiler/lib/src/util/features.dart
new file mode 100644
index 0000000..5263b40
--- /dev/null
+++ b/pkg/compiler/lib/src/util/features.dart
@@ -0,0 +1,154 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Set of features used in annotations.
+class Features {
+  Map<String, Object> _features = {};
+
+  void add(String key, {var value: ''}) {
+    _features[key] = value.toString();
+  }
+
+  void addElement(String key, [var value]) {
+    List<String> list = _features.putIfAbsent(key, () => <String>[]);
+    if (value != null) {
+      list.add(value.toString());
+    }
+  }
+
+  bool containsKey(String key) {
+    return _features.containsKey(key);
+  }
+
+  void operator []=(String key, String value) {
+    _features[key] = value;
+  }
+
+  Object operator [](String key) => _features[key];
+
+  Object remove(String key) => _features.remove(key);
+
+  bool get isEmpty => _features.isEmpty;
+
+  bool get isNotEmpty => _features.isNotEmpty;
+
+  void forEach(void Function(String, Object) f) {
+    _features.forEach(f);
+  }
+
+  /// Returns a string containing all features in a comma-separated list sorted
+  /// by feature names.
+  String getText() {
+    StringBuffer sb = new StringBuffer();
+    bool needsComma = false;
+    for (String name in _features.keys.toList()..sort()) {
+      dynamic value = _features[name];
+      if (value != null) {
+        if (needsComma) {
+          sb.write(',');
+        }
+        sb.write(name);
+        if (value is List<String>) {
+          value = '[${(value..sort()).join(',')}]';
+        }
+        if (value != '') {
+          sb.write('=');
+          sb.write(value);
+        }
+        needsComma = true;
+      }
+    }
+    return sb.toString();
+  }
+
+  /// Creates a [Features] object by parse the [text] encoding.
+  ///
+  /// Single features will be parsed as strings and list features (features
+  /// encoded in `[...]` will be parsed as lists of strings.
+  static Features fromText(String text) {
+    Features features = new Features();
+    int index = 0;
+    while (index < text.length) {
+      int eqPos = text.indexOf('=', index);
+      int commaPos = text.indexOf(',', index);
+      String name;
+      bool hasValue = false;
+      if (eqPos != -1 && commaPos != -1) {
+        if (eqPos < commaPos) {
+          name = text.substring(index, eqPos);
+          hasValue = true;
+          index = eqPos + 1;
+        } else {
+          name = text.substring(index, commaPos);
+          index = commaPos + 1;
+        }
+      } else if (eqPos != -1) {
+        name = text.substring(index, eqPos);
+        hasValue = true;
+        index = eqPos + 1;
+      } else if (commaPos != -1) {
+        name = text.substring(index, commaPos);
+        index = commaPos + 1;
+      } else {
+        name = text.substring(index);
+        index = text.length;
+      }
+      if (hasValue) {
+        const Map<String, String> delimiters = const {
+          '[': ']',
+          '{': '}',
+          '(': ')',
+          '<': '>'
+        };
+        List<String> endDelimiters = <String>[];
+        bool isList = index < text.length && text.startsWith('[', index);
+        if (isList) {
+          features.addElement(name);
+          endDelimiters.add(']');
+          index++;
+        }
+        int valueStart = index;
+        while (index < text.length) {
+          String char = text.substring(index, index + 1);
+          if (endDelimiters.isNotEmpty && endDelimiters.last == char) {
+            endDelimiters.removeLast();
+            index++;
+          } else {
+            String endDelimiter = delimiters[char];
+            if (endDelimiter != null) {
+              endDelimiters.add(endDelimiter);
+              index++;
+            } else if (char == ',') {
+              if (endDelimiters.isEmpty) {
+                break;
+              } else if (endDelimiters.length == 1 && isList) {
+                String value = text.substring(valueStart, index);
+                features.addElement(name, value);
+                index++;
+                valueStart = index;
+              } else {
+                index++;
+              }
+            } else {
+              index++;
+            }
+          }
+        }
+        if (isList) {
+          String value = text.substring(valueStart, index - 1);
+          if (value.isNotEmpty) {
+            features.addElement(name, value);
+          }
+        } else {
+          String value = text.substring(valueStart, index);
+          features.add(name, value: value);
+        }
+        index++;
+      } else {
+        features.add(name);
+      }
+    }
+    return features;
+  }
+}
diff --git a/pkg/compiler/lib/src/util/indentation.dart b/pkg/compiler/lib/src/util/indentation.dart
index 9709f78..fb7cc21 100644
--- a/pkg/compiler/lib/src/util/indentation.dart
+++ b/pkg/compiler/lib/src/util/indentation.dart
@@ -69,9 +69,7 @@
     return tag;
   }
 
-  /**
-   * Adds given string to result string.
-   */
+  /// Adds given string to result string.
   void add(String string) {
     sb.write(string);
   }
@@ -79,12 +77,10 @@
   /// Adds default parameters for [node] into [params].
   void addDefaultParameters(N node, Map params) {}
 
-  /**
-   * Adds given node type to result string.
-   * The method "opens" the node, meaning that all output after calling
-   * this method and before calling closeNode() will represent contents
-   * of given node.
-   */
+  /// Adds given node type to result string.
+  /// The method "opens" the node, meaning that all output after calling
+  /// this method and before calling closeNode() will represent contents
+  /// of given node.
   void openNode(N node, String type, [Map params]) {
     if (params == null) params = new Map();
     addCurrentIndent();
@@ -95,9 +91,7 @@
     pushTag(type);
   }
 
-  /**
-   * Adds given node to result string.
-   */
+  /// Adds given node to result string.
   void openAndCloseNode(N node, String type, [Map params]) {
     if (params == null) params = {};
     addCurrentIndent();
@@ -107,9 +101,7 @@
     sb.write("/>\n");
   }
 
-  /**
-   * Closes current node type.
-   */
+  /// Closes current node type.
   void closeNode() {
     String tag = popTag();
     addCurrentIndent();
diff --git a/pkg/compiler/lib/src/util/sink_adapter.dart b/pkg/compiler/lib/src/util/sink_adapter.dart
new file mode 100644
index 0000000..685d611
--- /dev/null
+++ b/pkg/compiler/lib/src/util/sink_adapter.dart
@@ -0,0 +1,17 @@
+import '../../compiler_new.dart' as api;
+
+class BinaryOutputSinkAdapter implements Sink<List<int>> {
+  api.BinaryOutputSink output;
+
+  BinaryOutputSinkAdapter(this.output);
+
+  @override
+  void add(List<int> data) {
+    output.write(data);
+  }
+
+  @override
+  void close() {
+    output.close();
+  }
+}
diff --git a/pkg/compiler/lib/src/util/util.dart b/pkg/compiler/lib/src/util/util.dart
index df4cfa4..785253d 100644
--- a/pkg/compiler/lib/src/util/util.dart
+++ b/pkg/compiler/lib/src/util/util.dart
@@ -64,6 +64,17 @@
     return h;
   }
 
+  /// Mix the bits of the element hash codes of [iterable] with [existing].
+  static int setHash<E>(Iterable<E> iterable, [int existing = 0]) {
+    int h = existing;
+    if (iterable != null) {
+      for (E e in iterable) {
+        h += objectsHash(e);
+      }
+    }
+    return h & SMI_MASK;
+  }
+
   /// Mix the bits of the hash codes of the unordered key/value from [map] with
   /// [existing].
   static int unorderedMapHash(Map map, [int existing = 0]) {
@@ -97,10 +108,14 @@
   return true;
 }
 
-/**
- * File name prefix used to shorten the file name in stack traces printed by
- * [trace].
- */
+bool equalSets<E>(Set<E> a, Set<E> b) {
+  if (identical(a, b)) return true;
+  if (a == null || b == null) return false;
+  return a.length == b.length && a.containsAll(b) && b.containsAll(a);
+}
+
+/// File name prefix used to shorten the file name in stack traces printed by
+/// [trace].
 String stackTraceFilePrefix = null;
 
 /// Writes the characters of [string] on [buffer].  The characters
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index cb83743..0ed8695 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -4,11 +4,8 @@
 
 library dart2js.world;
 
-import 'package:front_end/src/api_unstable/dart2js.dart' show Link;
-
 import 'closure.dart';
 import 'common.dart';
-import 'common/names.dart';
 import 'common_elements.dart'
     show
         JCommonElements,
@@ -19,7 +16,10 @@
 import 'deferred_load.dart';
 import 'diagnostics/diagnostic_listener.dart';
 import 'elements/entities.dart';
+import 'elements/names.dart';
 import 'elements/types.dart';
+import 'inferrer/abstract_value_domain.dart';
+import 'ir/static_type.dart';
 import 'js_backend/annotations.dart';
 import 'js_backend/allocator_analysis.dart'
     show JAllocatorAnalysis, KAllocatorAnalysis;
@@ -27,18 +27,11 @@
 import 'js_backend/interceptor_data.dart' show InterceptorData;
 import 'js_backend/native_data.dart' show NativeData;
 import 'js_backend/no_such_method_registry.dart' show NoSuchMethodData;
-import 'js_backend/runtime_types.dart'
-    show RuntimeTypesNeed, RuntimeTypesNeedBuilder;
+import 'js_backend/runtime_types.dart' show RuntimeTypesNeed;
 import 'js_model/locals.dart';
-import 'ordered_typeset.dart';
-import 'options.dart';
 import 'js_emitter/sorter.dart';
-import 'types/abstract_value_domain.dart';
 import 'universe/class_hierarchy.dart';
-import 'universe/class_set.dart';
-import 'universe/function_set.dart' show FunctionSet;
 import 'universe/selector.dart' show Selector;
-import 'universe/world_builder.dart';
 
 /// Common superinterface for [OpenWorld] and [JClosedWorld].
 abstract class World {}
@@ -174,10 +167,9 @@
   bool needsNoSuchMethod(ClassEntity cls, Selector selector, ClassQuery query);
 
   /// Returns whether [element] will be the one used at runtime when being
-  /// invoked on an instance of [cls]. [selector] is used to ensure library
+  /// invoked on an instance of [cls]. [name] is used to ensure library
   /// privacy is taken into account.
-  bool hasElementIn(
-      covariant ClassEntity cls, Selector selector, covariant Entity element);
+  bool hasElementIn(ClassEntity cls, Name name, MemberEntity element);
 
   /// Returns `true` if the field [element] is known to be effectively final.
   bool fieldNeverChanges(MemberEntity element);
@@ -209,11 +201,6 @@
   /// Returns the single [MemberEntity] that matches a call to [selector] on the
   /// [receiver]. If multiple targets exist, `null` is returned.
   MemberEntity locateSingleMember(Selector selector, AbstractValue receiver);
-
-  /// Returns the single field that matches a call to [selector] on the
-  /// [receiver]. If multiple targets exist or the single target is not a field,
-  /// `null` is returned.
-  FieldEntity locateSingleField(Selector selector, AbstractValue receiver);
 }
 
 abstract class OpenWorld implements World {
@@ -234,360 +221,11 @@
   ///     abstract class I { m(); }
   ///     abstract class J implements A { }
   ///
-  /// Here `A.m` is inherited into `A`, `B`, and `C`. Becausec `B` and
-  /// `C` implement `I`, `isInheritedInSubtypeOf(A.M, I)` is true, but
-  /// `isInheritedInSubtypeOf(A.M, J)` is false.
-  bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type);
-}
-
-abstract class ClosedWorldBase implements JClosedWorld {
-  final ConstantSystem constantSystem;
-  final NativeData nativeData;
-  final InterceptorData interceptorData;
-  final BackendUsage backendUsage;
-  final NoSuchMethodData noSuchMethodData;
-
-  FunctionSet _allFunctions;
-
-  final Map<ClassEntity, Set<ClassEntity>> mixinUses;
-  Map<ClassEntity, List<ClassEntity>> _liveMixinUses;
-
-  final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
-
-  final Map<ClassEntity, Map<ClassEntity, bool>> _subtypeCoveredByCache =
-      <ClassEntity, Map<ClassEntity, bool>>{};
-
-  final JElementEnvironment elementEnvironment;
-  final DartTypes dartTypes;
-  final JCommonElements commonElements;
-
-  // TODO(johnniwinther): Can this be derived from [ClassSet]s?
-  final Set<ClassEntity> implementedClasses;
-
-  final Iterable<MemberEntity> liveInstanceMembers;
-
-  /// Members that are written either directly or through a setter selector.
-  final Iterable<MemberEntity> assignedInstanceMembers;
-
-  final Iterable<ClassEntity> liveNativeClasses;
-
-  final Iterable<MemberEntity> processedMembers;
-
-  final ClassHierarchy classHierarchy;
-
-  ClosedWorldBase(
-      this.elementEnvironment,
-      this.dartTypes,
-      this.commonElements,
-      this.constantSystem,
-      this.nativeData,
-      this.interceptorData,
-      this.backendUsage,
-      this.noSuchMethodData,
-      this.implementedClasses,
-      this.liveNativeClasses,
-      this.liveInstanceMembers,
-      this.assignedInstanceMembers,
-      this.processedMembers,
-      this.mixinUses,
-      this.typesImplementedBySubclasses,
-      this.classHierarchy);
-
-  OrderedTypeSet getOrderedTypeSet(covariant ClassEntity cls);
-
-  int getHierarchyDepth(covariant ClassEntity cls);
-
-  ClassEntity getSuperClass(covariant ClassEntity cls);
-
-  Iterable<ClassEntity> getInterfaces(covariant ClassEntity cls);
-
-  ClassEntity getAppliedMixin(covariant ClassEntity cls);
-
-  bool isNamedMixinApplication(covariant ClassEntity cls);
-
-  /// Returns `true` if [cls] is implemented by an instantiated class.
-  bool isImplemented(ClassEntity cls) {
-    return implementedClasses.contains(cls);
-  }
-
-  @override
-  ClassEntity getLubOfInstantiatedSubclasses(ClassEntity cls) {
-    if (nativeData.isJsInteropClass(cls)) {
-      return commonElements.jsJavaScriptObjectClass;
-    }
-    ClassHierarchyNode hierarchy = classHierarchy.getClassHierarchyNode(cls);
-    return hierarchy != null
-        ? hierarchy.getLubOfInstantiatedSubclasses()
-        : null;
-  }
-
-  @override
-  ClassEntity getLubOfInstantiatedSubtypes(ClassEntity cls) {
-    if (nativeData.isJsInteropClass(cls)) {
-      return commonElements.jsJavaScriptObjectClass;
-    }
-    ClassSet classSet = classHierarchy.getClassSet(cls);
-    return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null;
-  }
-
-  /// Returns `true` if [cls] is mixed into a live class.
-  bool isUsedAsMixin(ClassEntity cls) {
-    return !mixinUsesOf(cls).isEmpty;
-  }
-
-  /// Returns `true` if any live class that mixes in [cls] implements [type].
-  bool hasAnySubclassOfMixinUseThatImplements(
-      ClassEntity cls, ClassEntity type) {
-    return mixinUsesOf(cls)
-        .any((use) => hasAnySubclassThatImplements(use, type));
-  }
-
-  /// Returns `true` if every subtype of [x] is a subclass of [y] or a subclass
-  /// of a mixin application of [y].
-  bool everySubtypeIsSubclassOfOrMixinUseOf(ClassEntity x, ClassEntity y) {
-    Map<ClassEntity, bool> secondMap =
-        _subtypeCoveredByCache[x] ??= <ClassEntity, bool>{};
-    return secondMap[y] ??= classHierarchy.subtypesOf(x).every(
-        (ClassEntity cls) =>
-            classHierarchy.isSubclassOf(cls, y) ||
-            isSubclassOfMixinUseOf(cls, y));
-  }
-
-  /// Returns `true` if any subclass of [superclass] implements [type].
-  bool hasAnySubclassThatImplements(ClassEntity superclass, ClassEntity type) {
-    Set<ClassEntity> subclasses = typesImplementedBySubclasses[superclass];
-    if (subclasses == null) return false;
-    return subclasses.contains(type);
-  }
-
-  /// Returns whether a [selector] call on an instance of [cls]
-  /// will hit a method at runtime, and not go through [noSuchMethod].
-  bool hasConcreteMatch(covariant ClassEntity cls, Selector selector,
-      {covariant ClassEntity stopAtSuperclass});
-
-  @override
-  bool needsNoSuchMethod(
-      ClassEntity base, Selector selector, ClassQuery query) {
-    /// Returns `true` if subclasses in the [rootNode] tree needs noSuchMethod
-    /// handling.
-    bool subclassesNeedNoSuchMethod(ClassHierarchyNode rootNode) {
-      if (!rootNode.isInstantiated) {
-        // No subclass needs noSuchMethod handling since they are all
-        // uninstantiated.
-        return false;
-      }
-      ClassEntity rootClass = rootNode.cls;
-      if (hasConcreteMatch(rootClass, selector)) {
-        // The root subclass has a concrete implementation so no subclass needs
-        // noSuchMethod handling.
-        return false;
-      } else if (rootNode.isExplicitlyInstantiated) {
-        // The root class need noSuchMethod handling.
-        return true;
-      }
-      IterationStep result = rootNode.forEachSubclass((ClassEntity subclass) {
-        if (hasConcreteMatch(subclass, selector, stopAtSuperclass: rootClass)) {
-          // Found a match - skip all subclasses.
-          return IterationStep.SKIP_SUBCLASSES;
-        } else {
-          // Stop fast - we found a need for noSuchMethod handling.
-          return IterationStep.STOP;
-        }
-      }, ClassHierarchyNode.EXPLICITLY_INSTANTIATED, strict: true);
-      // We stopped fast so we need noSuchMethod handling.
-      return result == IterationStep.STOP;
-    }
-
-    ClassSet classSet = classHierarchy.getClassSet(base);
-    assert(classSet != null, failedAt(base, "No class set for $base."));
-    ClassHierarchyNode node = classSet.node;
-    if (query == ClassQuery.EXACT) {
-      return node.isExplicitlyInstantiated && !hasConcreteMatch(base, selector);
-    } else if (query == ClassQuery.SUBCLASS) {
-      return subclassesNeedNoSuchMethod(node);
-    } else {
-      if (subclassesNeedNoSuchMethod(node)) return true;
-      for (ClassHierarchyNode subtypeNode in classSet.subtypeNodes) {
-        if (subclassesNeedNoSuchMethod(subtypeNode)) return true;
-      }
-      return false;
-    }
-  }
-
-  /// Returns an iterable over the common supertypes of the [classes].
-  Iterable<ClassEntity> commonSupertypesOf(Iterable<ClassEntity> classes) {
-    Iterator<ClassEntity> iterator = classes.iterator;
-    if (!iterator.moveNext()) return const <ClassEntity>[];
-
-    ClassEntity cls = iterator.current;
-    OrderedTypeSet typeSet = getOrderedTypeSet(cls);
-    if (!iterator.moveNext()) return typeSet.types.map((type) => type.element);
-
-    int depth = typeSet.maxDepth;
-    Link<OrderedTypeSet> otherTypeSets = const Link<OrderedTypeSet>();
-    do {
-      ClassEntity otherClass = iterator.current;
-      OrderedTypeSet otherTypeSet = getOrderedTypeSet(otherClass);
-      otherTypeSets = otherTypeSets.prepend(otherTypeSet);
-      if (otherTypeSet.maxDepth < depth) {
-        depth = otherTypeSet.maxDepth;
-      }
-    } while (iterator.moveNext());
-
-    List<ClassEntity> commonSupertypes = <ClassEntity>[];
-    OUTER:
-    for (Link<InterfaceType> link = typeSet[depth];
-        link.head.element != commonElements.objectClass;
-        link = link.tail) {
-      ClassEntity cls = link.head.element;
-      for (Link<OrderedTypeSet> link = otherTypeSets;
-          !link.isEmpty;
-          link = link.tail) {
-        if (link.head.asInstanceOf(cls, getHierarchyDepth(cls)) == null) {
-          continue OUTER;
-        }
-      }
-      commonSupertypes.add(cls);
-    }
-    commonSupertypes.add(commonElements.objectClass);
-    return commonSupertypes;
-  }
-
-  /// Returns an iterable over the live mixin applications that mixin [cls].
-  Iterable<ClassEntity> mixinUsesOf(ClassEntity cls) {
-    if (_liveMixinUses == null) {
-      _liveMixinUses = new Map<ClassEntity, List<ClassEntity>>();
-      for (ClassEntity mixin in mixinUses.keys) {
-        List<ClassEntity> uses = <ClassEntity>[];
-
-        void addLiveUse(ClassEntity mixinApplication) {
-          if (classHierarchy.isInstantiated(mixinApplication)) {
-            uses.add(mixinApplication);
-          } else if (isNamedMixinApplication(mixinApplication)) {
-            Set<ClassEntity> next = mixinUses[mixinApplication];
-            if (next != null) {
-              next.forEach(addLiveUse);
-            }
-          }
-        }
-
-        mixinUses[mixin].forEach(addLiveUse);
-        if (uses.isNotEmpty) {
-          _liveMixinUses[mixin] = uses;
-        }
-      }
-    }
-    Iterable<ClassEntity> uses = _liveMixinUses[cls];
-    return uses != null ? uses : const <ClassEntity>[];
-  }
-
-  /// Returns `true` if any live class that mixes in [mixin] is also a subclass
-  /// of [superclass].
-  bool hasAnySubclassThatMixes(ClassEntity superclass, ClassEntity mixin) {
-    return mixinUsesOf(mixin).any((ClassEntity each) {
-      return classHierarchy.isSubclassOf(each, superclass);
-    });
-  }
-
-  /// Returns `true` if [cls] or any superclass mixes in [mixin].
-  bool isSubclassOfMixinUseOf(ClassEntity cls, ClassEntity mixin) {
-    if (isUsedAsMixin(mixin)) {
-      ClassEntity current = cls;
-      while (current != null) {
-        ClassEntity currentMixin = getAppliedMixin(current);
-        if (currentMixin == mixin) return true;
-        current = getSuperClass(current);
-      }
-    }
-    return false;
-  }
-
-  void _ensureFunctionSet() {
-    if (_allFunctions == null) {
-      // [FunctionSet] is created lazily because it is not used when we switch
-      // from a frontend to a backend model before inference.
-      _allFunctions = new FunctionSet(liveInstanceMembers);
-    }
-  }
-
-  /// Returns `true` if [selector] on [receiver] can hit a `call` method on a
-  /// subclass of `Closure`.
-  ///
-  /// Every implementation of `Closure` has a 'call' method with its own
-  /// signature so it cannot be modelled by a [FunctionEntity]. Also,
-  /// call-methods for tear-off are not part of the element model.
-  bool includesClosureCall(Selector selector, AbstractValue receiver) {
-    return selector.name == Identifiers.call &&
-        (receiver == null ||
-            // TODO(johnniwinther): Should this have been `intersects` instead?
-            abstractValueDomain.contains(
-                receiver, abstractValueDomain.functionType));
-  }
-
-  AbstractValue computeReceiverType(Selector selector, AbstractValue receiver) {
-    _ensureFunctionSet();
-    if (includesClosureCall(selector, receiver)) {
-      return abstractValueDomain.dynamicType;
-    }
-    return _allFunctions.receiverType(selector, receiver, abstractValueDomain);
-  }
-
-  Iterable<MemberEntity> locateMembers(
-      Selector selector, AbstractValue receiver) {
-    _ensureFunctionSet();
-    return _allFunctions.filter(selector, receiver, abstractValueDomain);
-  }
-
-  bool hasAnyUserDefinedGetter(Selector selector, AbstractValue receiver) {
-    _ensureFunctionSet();
-    return _allFunctions
-        .filter(selector, receiver, abstractValueDomain)
-        .any((each) => each.isGetter);
-  }
-
-  FieldEntity locateSingleField(Selector selector, AbstractValue receiver) {
-    MemberEntity result = locateSingleMember(selector, receiver);
-    return (result != null && result.isField) ? result : null;
-  }
-
-  MemberEntity locateSingleMember(Selector selector, AbstractValue receiver) {
-    if (includesClosureCall(selector, receiver)) {
-      return null;
-    }
-    receiver ??= abstractValueDomain.dynamicType;
-    return abstractValueDomain.locateSingleMember(receiver, selector);
-  }
-
-  bool fieldNeverChanges(MemberEntity element) {
-    if (!element.isField) return false;
-    if (nativeData.isNativeMember(element)) {
-      // Some native fields are views of data that may be changed by operations.
-      // E.g. node.firstChild depends on parentNode.removeBefore(n1, n2).
-      // TODO(sra): Refine the effect classification so that native effects are
-      // distinct from ordinary Dart effects.
-      return false;
-    }
-
-    if (!element.isAssignable) {
-      return true;
-    }
-    if (element.isInstanceMember) {
-      return !assignedInstanceMembers.contains(element);
-    }
-    return false;
-  }
-}
-
-abstract class ClosedWorldRtiNeedMixin implements KClosedWorld {
-  RuntimeTypesNeed _rtiNeed;
-
-  void computeRtiNeed(ResolutionWorldBuilder resolutionWorldBuilder,
-      RuntimeTypesNeedBuilder rtiNeedBuilder, CompilerOptions options) {
-    _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed(
-        resolutionWorldBuilder, this, options);
-  }
-
-  RuntimeTypesNeed get rtiNeed => _rtiNeed;
+  /// Here `A.m` is inherited into `A`, `B`, and `C`. Because `B` and
+  /// `C` implement `I`, `isInheritedInSubtypeOf(A.m, I)` is true, but
+  /// `isInheritedInSubtypeOf(A.m, J)` is false.
+  bool isInheritedIn(
+      MemberEntity member, ClassEntity type, ClassRelation relation);
 }
 
 abstract class KClosedWorld {
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index 3cf04df..fed2fe2 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -1,51 +1,85 @@
 # This pubspec is currently mainly used to make it easier to develop on dart2js
 # by making it a standalone package.
 name: compiler
-#version: do-not-upload
+publish_to: none
+environment:
+  sdk: '>=2.1.0 <3.0.0'
+
+# NOTE: `pub get / pub upgrade` are generally not needed when working on this
+# package. The `.packages` file in the repository root will be used by default.
 dependencies:
-  package_config: '>=0.1.1 <2.0.0'
-  pub_semver: ^1.2.1
-  js:
-    path: ../js
+  # Published packages - repo version ensured via dependency_overrides
+  collection: any
+  crypto: any
+  dart2js_info: any
+  front_end: any
+  kernel: any
+
+  # Unpublished packages that can be used via path dependency
   js_ast:
     path: ../js_ast
   js_runtime:
     path: ../../sdk/lib/_internal/js_runtime
-  kernel:
-    path: ../../pkg/kernel
   sdk_library_metadata:
     path: ../../sdk/lib/_internal/sdk_library_metadata
-  dart2js_info:
-    path: ../../third_party/pkg/dart2js_info
-  front_end:
-    path: ../front_end
+
+dev_dependencies:
+  # Published packages - repo version ensured via dependency_overrides
+  args: any
+
 dependency_overrides:
+  # Packages with source in the SDK
   front_end:
     path: ../front_end
-  analyzer:
-    path: ../analyzer
   kernel:
     path: ../../pkg/kernel
+  meta:
+    path: ../meta
 
-# Uncomment if running gclient, so you can depend directly on the downloaded
-# versions of dart2js's transitive dependencies:
-#
-# dependency_overrides:
-#   package_config:
-#     path: ../../third_party/pkg_tested/package_config
-#   path:
-#     path: ../../third_party/pkg/path
-#   charcode:
-#     path: ../../third_party/pkg/charcode
-#   collection:
-#     path: ../../third_party/pkg/collection
-#   crypto:
-#     path: ../../third_party/pkg/crypto
-#   http_parser:
-#     path: ../../third_party/pkg/http_parser
-#   args:
-#     path: ../../third_party/pkg/args
-#   shelf:
-#     path: ../../third_party/pkg/shelf
-#   yaml:
-#     path: ../../third_party/pkg/yaml
+  # Packages brought in via DEPS
+  args:
+    path: ../../third_party/pkg/args
+  async:
+    path: ../../third_party/pkg/async
+  charcode:
+    path: ../../third_party/pkg/charcode
+  collection:
+    path: ../../third_party/pkg/collection
+  convert:
+    path: ../../third_party/pkg/convert
+  crypto:
+    path: ../../third_party/pkg/crypto
+  dart2js_info:
+    path: ../../third_party/pkg/dart2js_info
+  fixnum:
+    path: ../../third_party/pkg/fixnum
+  http_parser:
+    path: ../../third_party/pkg/http_parser
+  matcher:
+    path: ../../third_party/pkg/matcher
+  mime:
+    path: ../../third_party/pkg/mime
+  package_config:
+    path: ../../third_party/pkg_tested/package_config
+  path:
+    path: ../../third_party/pkg/path
+  protobuf:
+    path: ../../third_party/pkg/protobuf
+  quiver:
+    path: ../../third_party/pkg/quiver
+  shelf:
+    path: ../../third_party/pkg/shelf
+  shelf_static:
+    path: ../../third_party/pkg/shelf_static
+  source_span:
+    path: ../../third_party/pkg/source_span
+  stack_trace:
+    path: ../../third_party/pkg/stack_trace
+  stream_channel:
+    path: ../../third_party/pkg/stream_channel
+  string_scanner:
+    path: ../../third_party/pkg/string_scanner
+  typed_data:
+    path: ../../third_party/pkg/typed_data
+  yaml:
+    path: ../../third_party/pkg/yaml
diff --git a/pkg/compiler/tool/dart2js_stress.dart b/pkg/compiler/tool/dart2js_stress.dart
index 8327964..3a458e9 100644
--- a/pkg/compiler/tool/dart2js_stress.dart
+++ b/pkg/compiler/tool/dart2js_stress.dart
@@ -24,8 +24,8 @@
   args = [
     "--suppress-warnings",
     "--suppress-hints",
-    "--library-root="
-        "${Platform.script.resolve('../../../sdk').toFilePath()}"
+    "--libraries-spec="
+        "${Platform.script.resolve('../../../sdk/lib/libraries.json').toFilePath()}"
   ]..addAll(args);
   void iterate() {
     count++;
diff --git a/pkg/compiler/tool/status_files/update_all.dart b/pkg/compiler/tool/status_files/update_all.dart
index cc05227..bf09b28 100644
--- a/pkg/compiler/tool/status_files/update_all.dart
+++ b/pkg/compiler/tool/status_files/update_all.dart
@@ -110,8 +110,8 @@
   }
 
   print('build create_sdk');
-  ProcessResult result = Process
-      .runSync(python, ['./tools/build.py', '-m', 'release', 'create_sdk']);
+  ProcessResult result = Process.runSync(
+      python, ['./tools/build.py', '-m', 'release', 'create_sdk']);
   if (result.exitCode != 0) {
     print(result.stdout);
     print(result.stderr);
diff --git a/pkg/compiler/tool/track_memory.dart b/pkg/compiler/tool/track_memory.dart
index f6ef38d..c5c2d03 100644
--- a/pkg/compiler/tool/track_memory.dart
+++ b/pkg/compiler/tool/track_memory.dart
@@ -172,9 +172,9 @@
   if (now < 1024) {
     string = ' ${now}b';
   } else if (now < mega) {
-    string = ' ${(now/1024).toStringAsFixed(0)}K';
+    string = ' ${(now / 1024).toStringAsFixed(0)}K';
   } else {
-    string = ' ${(now/mega).toStringAsFixed(1)}M';
+    string = ' ${(now / mega).toStringAsFixed(1)}M';
   }
   if (string.length < 10) string = '${' ' * (8 - string.length)}$string';
   sb.write(string);
diff --git a/pkg/dart2js_tools/bin/deobfuscate.dart b/pkg/dart2js_tools/bin/deobfuscate.dart
index 69319ea..df2729f 100644
--- a/pkg/dart2js_tools/bin/deobfuscate.dart
+++ b/pkg/dart2js_tools/bin/deobfuscate.dart
@@ -3,13 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
-import 'package:source_maps/source_maps.dart';
-import 'package:source_maps/src/utils.dart';
+import 'dart:math' show max;
+import 'package:stack_trace/stack_trace.dart';
 import 'package:dart2js_tools/src/trace.dart';
-import 'package:dart2js_tools/src/sourcemap_helper.dart';
 import 'package:dart2js_tools/src/name_decoder.dart';
-import 'package:dart2js_tools/src/dart2js_mapping.dart';
 import 'package:dart2js_tools/src/util.dart';
+import 'package:dart2js_tools/src/trace_decoder.dart';
 
 /// Script that deobuscates a stack-trace given in a text file.
 ///
@@ -47,91 +46,36 @@
   }
   var sb = new StringBuffer();
   try {
-    deobfuscate(new File(args[0]).readAsStringSync(), sb);
+    String obfuscatedTrace = new File(args[0]).readAsStringSync();
+    String error = extractErrorMessage(obfuscatedTrace);
+    var provider = new CachingFileProvider();
+    StackDeobfuscationResult result =
+        deobfuscateStack(obfuscatedTrace, provider);
+    Frame firstFrame = result.original.frames.first;
+    String translatedError =
+        translate(error, provider.mappingFor(firstFrame.uri));
+    if (translatedError == null) translatedError = '<no error message found>';
+    printPadded(translatedError, error, sb);
+    int longest =
+        result.deobfuscated.frames.fold(0, (m, f) => max(f.member.length, m));
+    for (var originalFrame in result.original.frames) {
+      var deobfuscatedFrames = result.frameMap[originalFrame];
+      if (deobfuscatedFrames == null) {
+        printPadded('no mapping', '${originalFrame.location}', sb);
+      } else {
+        for (var frame in deobfuscatedFrames) {
+          printPadded('${frame.member.padRight(longest)} ${frame.location}',
+              '${originalFrame.location}', sb);
+        }
+      }
+    }
   } finally {
     print('$sb');
   }
 }
 
-void deobfuscate(trace, StringBuffer sb) {
-  String error = extractErrorMessage(trace);
-  String translatedError;
-  var provider = new CachingFileProvider();
-
-  List<StackTraceLine> jsStackTrace = parseStackTrace(trace);
-
-  for (StackTraceLine line in jsStackTrace) {
-    var uri = resolveUri(line.fileName);
-    var mapping = provider.mappingFor(uri);
-    if (mapping == null) {
-      printPadded('no mapping', line.inlineString, sb);
-      continue;
-    }
-
-    TargetEntry targetEntry = findColumn(line.lineNo - 1, line.columnNo - 1,
-        findLine(mapping.sourceMap, line.lineNo - 1));
-    if (targetEntry == null) {
-      printPadded('no entry', line.inlineString, sb);
-      continue;
-    }
-
-    if (translatedError == null) {
-      translatedError = translate(error, mapping, line, targetEntry);
-      if (translatedError == null) translatedError = '<no error message found>';
-      printPadded(translatedError, error, sb);
-    }
-
-    int offset =
-        provider.fileFor(uri).getOffset(line.lineNo - 1, line.columnNo - 1);
-
-    String nameOf(id) => id != 0 ? mapping.sourceMap.names[id] : null;
-    String urlOf(id) => id != 0 ? mapping.sourceMap.urls[id] : null;
-
-    String fileName = urlOf(targetEntry.sourceUrlId ?? 0);
-    int targetLine = (targetEntry.sourceLine ?? 0) + 1;
-    int targetColumn = (targetEntry.sourceColumn ?? 0) + 1;
-
-    // Expand inlined frames.
-    Map<int, List<FrameEntry>> frames = mapping.frames;
-    List<int> index = mapping.frameIndex;
-    int key = binarySearch(index, (i) => i > offset) - 1;
-    int depth = 0;
-    outer:
-    while (key >= 0) {
-      for (var frame in frames[index[key]].reversed) {
-        if (frame.isEmpty) break outer;
-        if (frame.isPush) {
-          if (depth <= 0) {
-            var mappedLine = new StackTraceLine(
-                frame.inlinedMethodName + "(inlined)",
-                fileName,
-                targetLine,
-                targetColumn);
-            printPadded(mappedLine.inlineString, "", sb);
-            fileName = frame.callUri;
-            targetLine = (frame.callLine ?? 0) + 1;
-            targetColumn = (frame.callColumn ?? 0) + 1;
-          } else {
-            depth--;
-          }
-        }
-        if (frame.isPop) {
-          depth++;
-        }
-      }
-      key--;
-    }
-
-    var functionEntry = findEnclosingFunction(provider, uri, offset);
-    String methodName = nameOf(functionEntry.sourceNameId ?? 0);
-    var mappedLine =
-        new StackTraceLine(methodName, fileName, targetLine, targetColumn);
-    printPadded(mappedLine.inlineString, line.inlineString, sb);
-  }
-}
-
-final green = stdout.hasTerminal ? '' : '';
-final none = stdout.hasTerminal ? '' : '';
+final green = stdout.hasTerminal ? '\x1b[32m' : '';
+final none = stdout.hasTerminal ? '\x1b[0m' : '';
 
 printPadded(String mapping, String original, sb) {
   var len = mapping.length;
@@ -140,12 +84,3 @@
   var pad = ' ' * (50 - len);
   sb.writeln('$green$mapping$none$pad ... $original');
 }
-
-Uri resolveUri(String filename) {
-  var uri = Uri.base.resolve(filename);
-  if (uri.scheme == 'http' || uri.scheme == 'https') {
-    filename = uri.path.substring(uri.path.lastIndexOf('/') + 1);
-    uri = Uri.base.resolve(filename);
-  }
-  return uri;
-}
diff --git a/pkg/dart2js_tools/bin/lookup_name.dart b/pkg/dart2js_tools/bin/lookup_name.dart
index 744771b..f2d5c1b 100644
--- a/pkg/dart2js_tools/bin/lookup_name.dart
+++ b/pkg/dart2js_tools/bin/lookup_name.dart
@@ -1,33 +1,25 @@
 import 'dart:io';
 import 'dart:convert';
 import 'package:source_maps/source_maps.dart';
+import 'package:dart2js_tools/src/dart2js_mapping.dart';
 
 main(List<String> args) {
   if (args.length < 2) {
     print('usage: read.dart <source-map-file> <name>');
     exit(1);
   }
+  var name = args[1];
+
   var sourcemapFile = new File.fromUri(Uri.base.resolve(args[0]));
   if (!sourcemapFile.existsSync()) {
-    print('no source-map-file in ${args[0]}');
+    print('Error: no such file: $sourcemapFile');
     exit(1);
   }
-  var name = args[1];
   var json = jsonDecode(sourcemapFile.readAsStringSync());
-  SingleMapping mapping = parseJson(json);
-  var extensions = json['x_org_dartlang_dart2js'];
-  if (extensions == null) {
-    print('source-map file has no dart2js extensions');
-    exit(1);
-  }
-  var minifiedNames = extensions['minified_names'];
-  if (minifiedNames == null) {
-    print('source-map file has no minified names in the dart2js extensions');
-    exit(1);
-  }
-  var gid = minifiedNames['global'][name];
-  if (gid != null) print('$name => ${mapping.names[gid]} (a global name)');
-  var iid = minifiedNames['instance'][name];
-  if (iid != null) print('$name => ${mapping.names[iid]} (an instance name)');
-  if (gid == null && iid == null) print('Name \'$name\' not found.');
+  Dart2jsMapping mapping = Dart2jsMapping(parseJson(json), json);
+  var global = mapping.globalNames[name];
+  if (global != null) print('$name => $global (a global name)');
+  var instance = mapping.instanceNames[name];
+  if (instance != null) print('$name => $instance (an instance name)');
+  if (global == null && instance == null) print('Name \'$name\' not found.');
 }
diff --git a/pkg/dart2js_tools/lib/src/name_decoder.dart b/pkg/dart2js_tools/lib/src/name_decoder.dart
index 746c511..306bead 100644
--- a/pkg/dart2js_tools/lib/src/name_decoder.dart
+++ b/pkg/dart2js_tools/lib/src/name_decoder.dart
@@ -9,8 +9,8 @@
 import 'dart2js_mapping.dart';
 import 'trace.dart';
 
-String translate(String error, Dart2jsMapping mapping, StackTraceLine line,
-    TargetEntry entry) {
+String translate(String error, Dart2jsMapping mapping,
+    [StackTraceLine line, TargetEntry entry]) {
   for (var decoder in _errorMapDecoders) {
     var result = decoder.decode(error, mapping, line, entry);
     // More than one decoder might be applied on a single error message. This
@@ -33,12 +33,20 @@
   String decode(String error, Dart2jsMapping mapping, StackTraceLine line,
       TargetEntry entry) {
     if (error == null) return null;
-    var match = _matcher.firstMatch(error);
-    if (match == null) return null;
-    var result = _decodeInternal(match, mapping, line, entry);
-    if (result == null) return null;
-    return '${error.substring(0, match.start)}'
-        '$result${error.substring(match.end, error.length)}';
+    Match lastMatch = null;
+    var result = new StringBuffer();
+    for (var match in _matcher.allMatches(error)) {
+      var decodedMatch = _decodeInternal(match, mapping, line, entry);
+      if (decodedMatch == null) {
+        continue;
+      }
+      result.write(error.substring(lastMatch?.end ?? 0, match.start));
+      result.write(decodedMatch);
+      lastMatch = match;
+    }
+    if (lastMatch == null) return null;
+    result.write(error.substring(lastMatch.end, error.length));
+    return '$result';
   }
 
   String _decodeInternal(Match match, Dart2jsMapping mapping,
@@ -49,14 +57,12 @@
     StackTraceLine line, TargetEntry entry);
 
 class MinifiedNameDecoder extends ErrorMapDecoder {
-  final RegExp _matcher = new RegExp("minified:([a-zA-Z]*)");
+  final RegExp _matcher = new RegExp("minified:([a-zA-Z0-9_\$]*)");
 
   String _decodeInternal(Match match, Dart2jsMapping mapping,
       StackTraceLine line, TargetEntry entry) {
     var minifiedName = match.group(1);
-    var name = mapping.globalNames[minifiedName];
-    if (name == null) return null;
-    return name;
+    return mapping.globalNames[minifiedName];
   }
 }
 
@@ -72,7 +78,103 @@
   }
 }
 
+abstract class NoSuchMethodDecoderBase extends ErrorMapDecoder {
+  String _translateMinifiedName(Dart2jsMapping mapping, String minifiedName) {
+    var name = mapping.instanceNames[minifiedName];
+    if (name != null) return "'$name'";
+    if (minifiedName.startsWith(new RegExp(r'(call)?\$[0-9]'))) {
+      int first$ = minifiedName.indexOf(r'$');
+      return _expandCallSignature(minifiedName.substring(first$));
+    }
+    return null;
+  }
+
+  String _expandCallSignature(String callSignature) {
+    // Minified names are one of these forms:
+    //   $0         // positional arguments only
+    //   $1$2       // type parameters and positional arguments
+    //   $3$name    // positional and named arguments
+    //   $1$3$name  // type parameters and positional and named args
+    var signature = callSignature.split(r'$');
+    var typeArgs = null;
+    var totalArgs = null;
+    var namedArgs = <String>[];
+    for (var arg in signature) {
+      if (arg == "") continue;
+      var count = int.tryParse(arg);
+      if (count != null) {
+        if (totalArgs != null) {
+          if (typeArgs != null) {
+            // unexpected format, leave it unchanged.
+            return null;
+          }
+          typeArgs = totalArgs;
+        }
+        totalArgs = count;
+      } else {
+        namedArgs.add(arg);
+      }
+    }
+    var sb = new StringBuffer();
+    sb.write("'call'");
+    sb.write(" (with ");
+    if (typeArgs != null) {
+      sb.write("$typeArgs type arguments");
+      sb.write(namedArgs.isNotEmpty ? ", " : " and ");
+    }
+    sb.write("${totalArgs - namedArgs.length} positional arguments");
+    if (namedArgs.isNotEmpty) {
+      sb.write(typeArgs != null ? "," : "");
+      sb.write(" and named arguments '${namedArgs.join("', '")}'");
+    }
+    sb.write(')');
+    return "$sb";
+  }
+}
+
+class NoSuchMethodDecoder1 extends NoSuchMethodDecoderBase {
+  final RegExp _matcher = new RegExp(
+      "NoSuchMethodError: method not found: '([^']*)'( on [^\\(]*)? \\(.*\\)");
+
+  String _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine line, TargetEntry entry) {
+    var minifiedName = match.group(1);
+    var suffix = match.group(2) ?? '';
+    var name = _translateMinifiedName(mapping, minifiedName);
+    if (name == null) return null;
+    return "NoSuchMethodError: method not found: $name$suffix";
+  }
+}
+
+class NoSuchMethodDecoder2 extends NoSuchMethodDecoderBase {
+  final RegExp _matcher =
+      new RegExp("NoSuchMethodError: method not found: '([^']*)'");
+
+  String _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine line, TargetEntry entry) {
+    var minifiedName = match.group(1);
+    var name = _translateMinifiedName(mapping, minifiedName);
+    if (name == null) return null;
+    return "NoSuchMethodError: method not found: $name";
+  }
+}
+
+class UnhandledNotAFunctionError extends ErrorMapDecoder {
+  final RegExp _matcher = new RegExp("Error: ([^']*) is not a function");
+
+  String _decodeInternal(Match match, Dart2jsMapping mapping,
+      StackTraceLine line, TargetEntry entry) {
+    var minifiedName = match.group(1);
+    var name = mapping.instanceNames[minifiedName];
+    if (name == null) return null;
+    return "Error: $name is not a function";
+  }
+}
+
 List<ErrorMapDecoder> _errorMapDecoders = [
   new MinifiedNameDecoder(),
-  new CannotReadPropertyDecoder()
+  new CannotReadPropertyDecoder(),
+  new NoSuchMethodDecoder1(),
+  new NoSuchMethodDecoder2(),
+  new UnhandledNotAFunctionError(),
 ];
diff --git a/pkg/dart2js_tools/lib/src/sourcemap_helper.dart b/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
index 7e01953..5b146b8 100644
--- a/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
+++ b/pkg/dart2js_tools/lib/src/sourcemap_helper.dart
@@ -13,15 +13,24 @@
 TargetEntry findEnclosingFunction(FileProvider provider, Uri uri, int start) {
   String sources = provider.sourcesFor(uri);
   if (sources == null) return null;
-  int index = sources.lastIndexOf(': function(', start);
-  if (index < 0) index = sources.lastIndexOf(':function(', start);
-  if (index < 0) return null;
-  index += 2;
   SourceFile file = provider.fileFor(uri);
   SingleMapping mapping = provider.mappingFor(uri).sourceMap;
-  var line = file.getLine(index);
-  var lineEntry = findLine(mapping, line);
-  return findColumn(line, file.getColumn(index), lineEntry);
+  int index = start;
+  while (true) {
+    index = sources.lastIndexOf('function', index);
+    if (index < 0) return null;
+    var line = file.getLine(index);
+    var lineEntry = findLine(mapping, line);
+    var column = file.getColumn(index);
+    TargetEntry result = findColumn(line, column, lineEntry);
+    // If the name entry doesn't start exactly at the column corresponding to
+    // `index`, we must be in the middle of a string or code that uses the word
+    // "function", but that doesn't have a corresponding mapping. In those
+    // cases, we keep searching backwards until we find the actual definition of
+    // a function.
+    if (result?.column == column) return result;
+    index--;
+  }
 }
 
 /// Returns [TargetLineEntry] which includes the location in the target [line]
diff --git a/pkg/dart2js_tools/lib/src/trace_decoder.dart b/pkg/dart2js_tools/lib/src/trace_decoder.dart
new file mode 100644
index 0000000..cae4c22
--- /dev/null
+++ b/pkg/dart2js_tools/lib/src/trace_decoder.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Logic to expand and deobuscate stack traces.
+
+import 'package:stack_trace/stack_trace.dart';
+import 'package:source_span/source_span.dart';
+import 'package:source_maps/src/utils.dart';
+import 'sourcemap_helper.dart';
+import 'dart2js_mapping.dart';
+import 'util.dart';
+
+/// Provides the result of deobfuscating a stack trace.
+class StackDeobfuscationResult {
+  /// Representation of the obfuscated stack trace.
+  final Trace original;
+
+  /// Representation of the deobfsucated stack trace.
+  final Trace deobfuscated;
+
+  /// Details about how one original frame maps to deobfuscated frames. A single
+  /// frame might map to many frames (in the case of inlining), or to a null
+  /// value (when we were unabled to deobfuscate it).
+  final Map<Frame, List<Frame>> frameMap;
+
+  StackDeobfuscationResult(this.original, this.deobfuscated, this.frameMap);
+}
+
+/// Parse [stackTrace] and deobfuscate it using source-map data available from
+/// [provider].
+StackDeobfuscationResult deobfuscateStack(
+    String stackTrace, FileProvider provider) {
+  var trace = Trace.parse(stackTrace.trim());
+  var deobfuscatedFrames = <Frame>[];
+  var frameMap = <Frame, List<Frame>>{};
+  for (var frame in trace.frames) {
+    // If there's no line information, there's no way to translate this frame.
+    // We could return it as-is, but these lines are usually not useful anyways.
+    if (frame.line == null) {
+      continue;
+    }
+
+    // If there's no column, try using the first column of the line.
+    var column = frame.column ?? 0;
+
+    Dart2jsMapping mapping = provider.mappingFor(frame.uri);
+    if (mapping == null) continue;
+
+    // Subtract 1 because stack traces use 1-indexed lines and columns and
+    // source maps uses 0-indexed.
+    SourceSpan span = mapping.sourceMap
+        .spanFor(frame.line - 1, column - 1, uri: frame.uri?.toString());
+
+    // If we can't find a source span, ignore the frame. It's probably something
+    // internal that the user doesn't care about.
+    if (span == null) continue;
+
+    List<Frame> mappedFrames = frameMap[frame] = [];
+
+    SourceFile jsFile = provider.fileFor(frame.uri);
+    int offset = jsFile.getOffset(frame.line - 1, column - 1);
+    String nameOf(id) =>
+        _normalizeName(id >= 0 ? mapping.sourceMap.names[id] : null);
+
+    Uri fileName = span.sourceUrl;
+    int targetLine = span.start.line + 1;
+    int targetColumn = span.start.column + 1;
+
+    // Expand inlining data.  When present, the fileName, line and column above
+    // correspond to the deepest inlined function, as we expand each frame we
+    // consume the location information, and retrieve the location information
+    // of the caller frame until we reach the actual function that dart2js
+    // inlined all the code into.
+    Map<int, List<FrameEntry>> frames = mapping.frames;
+    List<int> index = mapping.frameIndex;
+    int key = binarySearch(index, (i) => i > offset) - 1;
+    int depth = 0;
+    outer:
+    while (key >= 0) {
+      for (var frame in frames[index[key]].reversed) {
+        if (frame.isEmpty) break outer;
+        if (frame.isPush) {
+          if (depth <= 0) {
+            mappedFrames.add(new Frame(fileName, targetLine, targetColumn,
+                _normalizeName(frame.inlinedMethodName) + "(inlined)"));
+            fileName = Uri.parse(frame.callUri);
+            targetLine = (frame.callLine ?? 0) + 1;
+            targetColumn = (frame.callColumn ?? 0) + 1;
+          } else {
+            depth--;
+          }
+        }
+        if (frame.isPop) {
+          depth++;
+        }
+      }
+      key--;
+    }
+
+    var functionEntry = findEnclosingFunction(provider, frame.uri, offset);
+    String methodName = nameOf(functionEntry?.sourceNameId ?? -1);
+    mappedFrames.add(new Frame(fileName, targetLine, targetColumn, methodName));
+    deobfuscatedFrames.addAll(mappedFrames);
+  }
+  return new StackDeobfuscationResult(
+      trace, new Trace(deobfuscatedFrames), frameMap);
+}
+
+/// Ensure we don't use spaces in method names. At this time, they are only
+/// introduced by `<anonymous function>`.
+_normalizeName(String methodName) =>
+    methodName?.replaceAll("<anonymous function>", "<anonymous>") ??
+    '<unknown>';
diff --git a/pkg/dart2js_tools/lib/src/util.dart b/pkg/dart2js_tools/lib/src/util.dart
index 947c4ad..a68cf6e 100644
--- a/pkg/dart2js_tools/lib/src/util.dart
+++ b/pkg/dart2js_tools/lib/src/util.dart
@@ -22,6 +22,27 @@
   Dart2jsMapping mappingFor(Uri uri) => _mappings[uri] ??= parseMappingFor(uri);
 }
 
+/// A provider that converts `http:` URLs to a `file:` URI assuming that all
+/// files were downloaded on the current working directory.
+///
+/// Typically used when downloading the source and source-map files and applying
+/// deobfuscation locally for debugging purposes.
+class DownloadedFileProvider extends CachingFileProvider {
+  _localize(uri) {
+    if (uri.scheme == 'http' || uri.scheme == 'https') {
+      String filename = uri.path.substring(uri.path.lastIndexOf('/') + 1);
+      return Uri.base.resolve(filename);
+    }
+    return uri;
+  }
+
+  String sourcesFor(Uri uri) => super.sourcesFor(_localize(uri));
+
+  SourceFile fileFor(Uri uri) => super.fileFor(_localize(uri));
+
+  Dart2jsMapping mappingFor(Uri uri) => super.mappingFor(_localize(uri));
+}
+
 warn(String message) {
   if (_seenMessages.add(message)) {
     print(message);
diff --git a/pkg/dart2js_tools/pubspec.yaml b/pkg/dart2js_tools/pubspec.yaml
index caf79e9..87290a6 100644
--- a/pkg/dart2js_tools/pubspec.yaml
+++ b/pkg/dart2js_tools/pubspec.yaml
@@ -1,9 +1,10 @@
 name: dart2js_tools
-version: 0.0.1
+publish_to: none
 description: >
   Collection of tools used with dart2js including analyzing compilation
   information, deobfuscation of stack-traces and minified names.
 dependencies:
   source_maps: ^0.10.7
+  stack_trace: ^1.9.3
 environment:
   sdk: '>=2.0.0 <3.0.0'
diff --git a/pkg/dartfix/CHANGELOG.md b/pkg/dartfix/CHANGELOG.md
new file mode 100644
index 0000000..6fcede0
--- /dev/null
+++ b/pkg/dartfix/CHANGELOG.md
@@ -0,0 +1,12 @@
+# 0.1.3
+ * update SDK constraints
+
+# 0.1.2
+ * update SDK constraints
+ * add example.dart showing what can be "fixed"
+
+# 0.1.1
+ * Remove reading dartfix version from pubspec
+
+# 0.1.0
+ * Initial version
diff --git a/pkg/dartfix/LICENSE b/pkg/dartfix/LICENSE
new file mode 100644
index 0000000..a9ab5f8
--- /dev/null
+++ b/pkg/dartfix/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2018, the Dart project authors. 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.
\ No newline at end of file
diff --git a/pkg/dartfix/README.md b/pkg/dartfix/README.md
new file mode 100644
index 0000000..45f61cb
--- /dev/null
+++ b/pkg/dartfix/README.md
@@ -0,0 +1,92 @@
+The `dartfix` tool is a command-line interface
+for making automated updates to your Dart code.
+The tool isn't in the Dart SDK;
+instead, it's distributed in the [`dartfix` package.][dartfix]
+
+
+## Usage
+
+> **Important:**
+> Save a copy of your source code before making changes with `dartfix`.
+> Unlike [dartfmt][], which makes only safe changes (usually to whitespace),
+> `dartfix` can make changes that you might need to undo or modify.
+
+Before you can use the `dartfix` tool, you need to
+[install it](#installing-and-updating-dartfix), as described below.
+Then invoke it with the name of the directory that you want to update.
+When you're ready to make the suggested changes,
+add the `--overwrite` option.
+
+```terminal
+$ dartfix examples/misc
+... summary of recommended changes ...
+$ dartfix examples/misc --overwrite
+```
+
+## Features
+
+As of release 0.1.3, `dartfix` can make the following changes to your code:
+
+* Convert code to use the following [features added to Dart in 2.1][]:
+  * Find classes used as mixins, and convert them to use the `mixin` keyword
+    instead of `class`.
+  * Find `double` literals that end in `.0`, and remove the `.0`.
+* Move named constructor type arguments from the name to the type. <br>
+  For example, given `class A<T> { A.from(Object obj) { } }`,
+  `dartfix` changes constructor invocations in the following way:
+
+  ```
+  Original code:
+  A.from<String>(anObject) // Invokes the `A.from` named constructor.
+
+  Code produced by dartfix:
+  A<String>.from(anObject) // Same, but the type is directly after `A`.
+  ```
+
+## Installing and updating dartfix
+
+The easiest way to use `dartfix` is to [globally install][] it,
+so that it can be [in your path][PATH]:
+
+```terminal
+$ pub global activate dartfix
+```
+
+Use the same command to update `dartfix`.
+We recommend updating `dartfix` whenever you update your Dart SDK
+or when a new feature is released.
+
+## Options
+
+<dl>
+  <dt><code>--[no-]color</code></dt>
+  <dd> Use colors when printing messages. On by default. </dd>
+
+  <dt><code>-f, --force</code></dt>
+  <dd>Apply the recommended changes even if the input code has errors.
+  </dd>
+
+  <dt><code>-h, --help</code></dt>
+  <dd>See a complete list of `dartfix` options.</dd>
+
+  <dt><code>-v, --verbose</code></dt>
+  <dd>Verbose output.</dd>
+
+  <dt><code>-w, --overwrite</code></dt>
+  <dd>Apply the recommended changes.</dd>
+</dl>
+
+
+## Filing issues
+
+If you want a new fix, first look at [dartfix issues][]
+and star the fixes you want.
+If no issue exists for the fix, [create a GitHub issue.][new issue]
+
+[dartfix]: https://pub.dartlang.org/packages/dartfix
+[dartfmt]: https://www.dartlang.org/tools/dartfmt
+[features added to Dart in 2.1]: https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#210---2018-11-15
+[globally install]: https://www.dartlang.org/tools/pub/cmd/pub-global
+[new issue]: https://github.com/dart-lang/sdk/issues/new?title=dartfix%20request%3A%20%3CSUMMARIZE%20REQUEST%20HERE%3E
+[dartfix issues]: https://github.com/dart-lang/sdk/issues?q=is%3Aissue+is%3Aopen+label%3Aanalyzer-dartfix
+[PATH]: https://www.dartlang.org/tools/pub/cmd/pub-global#running-a-script-from-your-path
diff --git a/pkg/dartfix/bin/fix.dart b/pkg/dartfix/bin/fix.dart
index da176a1..0e2a489 100644
--- a/pkg/dartfix/bin/fix.dart
+++ b/pkg/dartfix/bin/fix.dart
@@ -1,5 +1,5 @@
 #!/usr/bin/env dart
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/dartfix/example/example-fixed.dart b/pkg/dartfix/example/example-fixed.dart
new file mode 100644
index 0000000..4f4a314
--- /dev/null
+++ b/pkg/dartfix/example/example-fixed.dart
@@ -0,0 +1,18 @@
+// This file contains code that has been modified by running dartfix.
+// See example.dart for the original unmodified code.
+
+// Dart will automatically convert int literals to doubles.
+// Running dartfix converts this double literal to an int.
+const double myDouble = 4;
+
+// This class is used as a mixin but does not use the new mixin syntax.
+// Running dartfix converts this class to use the new syntax.
+mixin MyMixin {
+  final someValue = myDouble;
+}
+
+class MyClass with MyMixin {}
+
+main() {
+  print('myDouble = ${MyClass().someValue}');
+}
diff --git a/pkg/dartfix/example/example.dart b/pkg/dartfix/example/example.dart
new file mode 100644
index 0000000..53d5292
--- /dev/null
+++ b/pkg/dartfix/example/example.dart
@@ -0,0 +1,18 @@
+// This file contains code that is modified by running dartfix.
+// After running dartfix, the content of this file matches example-fixed.dart.
+
+// Dart will automatically convert int literals to doubles.
+// Running dartfix converts this double literal to an int.
+const double myDouble = 4.0;
+
+// This class is used as a mixin but does not use the new mixin syntax.
+// Running dartfix converts this class to use the new syntax.
+class MyMixin {
+  final someValue = myDouble;
+}
+
+class MyClass with MyMixin {}
+
+main() {
+  print('myDouble = ${MyClass().someValue}');
+}
diff --git a/pkg/dartfix/lib/handler/analysis_complete_handler.dart b/pkg/dartfix/lib/handler/analysis_complete_handler.dart
new file mode 100644
index 0000000..939f703
--- /dev/null
+++ b/pkg/dartfix/lib/handler/analysis_complete_handler.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// This file has been automatically generated. Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analysis_server/tool/spec/generate_files".
+
+import 'dart:async';
+
+import 'package:analysis_server_client/handler/notification_handler.dart';
+import 'package:analysis_server_client/protocol.dart';
+
+/// [AnalysisCompleteHandler] listens to analysis server notifications
+/// and detects when analysis has finished.
+mixin AnalysisCompleteHandler on NotificationHandler {
+  Completer<void> _analysisComplete;
+
+  @override
+  void onServerStatus(ServerStatusParams params) {
+    if (params.analysis != null && !params.analysis.isAnalyzing) {
+      _analysisComplete?.complete();
+      _analysisComplete = null;
+    }
+  }
+
+  Future<void> analysisComplete() {
+    _analysisComplete ??= new Completer<void>();
+    return _analysisComplete.future;
+  }
+}
diff --git a/pkg/dartfix/lib/listener/bad_message_listener.dart b/pkg/dartfix/lib/listener/bad_message_listener.dart
new file mode 100644
index 0000000..fc46ed9
--- /dev/null
+++ b/pkg/dartfix/lib/listener/bad_message_listener.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:analysis_server_client/listener/server_listener.dart';
+
+/// [BadMessageListener] throws an exception if the [Client] receives bad data.
+mixin BadMessageListener on ServerListener {
+  /// True if we've received bad data from the server.
+  bool _receivedBadDataFromServer = false;
+
+  void throwDelayedException(String prefix, String details) {
+    if (!_receivedBadDataFromServer) {
+      _receivedBadDataFromServer = true;
+      // Give the server 1 second to continue outputting bad data
+      // such as outputting a stacktrace.
+      new Future.delayed(new Duration(seconds: 1), () {
+        throw '$prefix $details';
+      });
+    }
+  }
+
+  @override
+  void badMessage(String trimmedLine, exception) {
+    super.badMessage(trimmedLine, exception);
+    throwDelayedException('JSON decode failure', '$exception');
+  }
+
+  @override
+  void errorMessage(String line) {
+    super.errorMessage(line);
+    throwDelayedException('ERR:', line);
+  }
+
+  @override
+  void unexpectedMessage(Map<String, dynamic> message) {
+    super.unexpectedMessage(message);
+    throwDelayedException(
+        'BAD DATA FROM SERVER:', 'Unexpected message from server');
+  }
+
+  @override
+  void unexpectedResponse(Map<String, dynamic> message, id) {
+    super.unexpectedResponse(message, id);
+    throw 'Unexpected response from server: id=$id';
+  }
+
+  @override
+  void unexpectedStop(int exitCode) {
+    super.unexpectedStop(exitCode);
+    throwDelayedException('Server terminated with exit code', '$exitCode');
+  }
+}
diff --git a/pkg/dartfix/lib/listener/recording_listener.dart b/pkg/dartfix/lib/listener/recording_listener.dart
new file mode 100644
index 0000000..7ac4a12
--- /dev/null
+++ b/pkg/dartfix/lib/listener/recording_listener.dart
@@ -0,0 +1,56 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server_client/server.dart';
+import 'package:analysis_server_client/listener/server_listener.dart';
+import 'package:dartfix/listener/bad_message_listener.dart';
+import 'package:dartfix/listener/timed_listener.dart';
+
+/// [RecordingListener] caches all messages exchanged with the server
+/// and print them if a problem occurs.
+///
+/// This is primarily used when testing and debugging the analysis server.
+class RecordingListener with ServerListener, BadMessageListener, TimedListener {
+  /// True if we are currently printing out messages exchanged with the server.
+  bool _echoMessages = false;
+
+  /// Messages which have been exchanged with the server; we buffer these
+  /// up until the test finishes, so that they can be examined in the debugger
+  /// or printed out in response to a call to [echoMessages].
+  final _messages = <String>[];
+
+  /// Print out any messages exchanged with the server.  If some messages have
+  /// already been exchanged with the server, they are printed out immediately.
+  void echoMessages() {
+    if (_echoMessages) {
+      return;
+    }
+    _echoMessages = true;
+    for (String line in _messages) {
+      print(line);
+    }
+  }
+
+  /// Called when the [Server] is terminating the server process
+  /// rather than requesting that the server stop itself.
+  void killingServerProcess(String reason) {
+    echoMessages();
+    super.killingServerProcess(reason);
+  }
+
+  /// Log a timed message about interaction with the server.
+  void logTimed(double elapseTime, String prefix, String details) {
+    String line = '$elapseTime: $prefix $details';
+    if (_echoMessages) {
+      print(line);
+    }
+    _messages.add(line);
+  }
+
+  @override
+  void throwDelayedException(String prefix, String details) {
+    echoMessages();
+    super.throwDelayedException(prefix, details);
+  }
+}
diff --git a/pkg/dartfix/lib/listener/timed_listener.dart b/pkg/dartfix/lib/listener/timed_listener.dart
new file mode 100644
index 0000000..56a6555
--- /dev/null
+++ b/pkg/dartfix/lib/listener/timed_listener.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server_client/listener/server_listener.dart';
+
+/// [TimedListener] appends a timestamp (seconds since server startup)
+/// to each logged interaction with the server.
+mixin TimedListener on ServerListener {
+  /// Stopwatch that we use to generate timing information for debug output.
+  Stopwatch _time = new Stopwatch();
+
+  /// The [currentElapseTime] at which the last communication was received from
+  /// the server or `null` if no communication has been received.
+  double lastCommunicationTime;
+
+  /// The current elapse time (seconds) since the server was started.
+  double get currentElapseTime => _time.elapsedTicks / _time.frequency;
+
+  @override
+  void log(String prefix, String details) {
+    logTimed(currentElapseTime, prefix, details);
+  }
+
+  /// Log a timed message about interaction with the server.
+  void logTimed(double elapseTime, String prefix, String details);
+
+  @override
+  void messageReceived(String json) {
+    lastCommunicationTime = currentElapseTime;
+    super.messageReceived(json);
+  }
+
+  @override
+  void startingServer(String dartBinary, List<String> arguments) {
+    _time.start();
+    super.startingServer(dartBinary, arguments);
+  }
+}
diff --git a/pkg/dartfix/lib/src/context.dart b/pkg/dartfix/lib/src/context.dart
index 0869830..e6bb598 100644
--- a/pkg/dartfix/lib/src/context.dart
+++ b/pkg/dartfix/lib/src/context.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/dartfix/lib/src/driver.dart b/pkg/dartfix/lib/src/driver.dart
index 80e7a05..1ccc556 100644
--- a/pkg/dartfix/lib/src/driver.dart
+++ b/pkg/dartfix/lib/src/driver.dart
@@ -1,85 +1,83 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io' show File, Directory;
+import 'dart:io' show File, Platform;
 
+import 'package:analysis_server_client/handler/connection_handler.dart';
+import 'package:analysis_server_client/handler/notification_handler.dart';
+import 'package:analysis_server_client/listener/server_listener.dart';
 import 'package:analysis_server_client/protocol.dart';
+import 'package:analysis_server_client/server.dart';
 import 'package:cli_util/cli_logging.dart';
+import 'package:dartfix/handler/analysis_complete_handler.dart';
+import 'package:dartfix/listener/bad_message_listener.dart';
 import 'package:dartfix/src/context.dart';
 import 'package:dartfix/src/options.dart';
-import 'package:dartfix/src/server.dart';
-import 'package:path/path.dart' as path;
+import 'package:dartfix/src/util.dart';
+import 'package:pub_semver/pub_semver.dart';
 
 class Driver {
+  static final expectedProtocolVersion = new Version.parse('1.21.1');
+
   Context context;
+  _Handler handler;
   Logger logger;
   Server server;
 
-  Completer serverConnected;
-  Completer analysisComplete;
   bool force;
   bool overwrite;
   List<String> targets;
+  EditDartfixResult result;
 
   Ansi get ansi => logger.ansi;
 
-  bool get runAnalysisServerFromSource {
-    // Automatically run analysis server from source
-    // if this command line tool is being run from source
-    // within the source tree.
-    return Server.findRoot() != null;
-  }
-
-  Future start(List<String> args) async {
+  Future start(List<String> args,
+      {Context testContext, Logger testLogger}) async {
     final Options options = Options.parse(args);
 
     force = options.force;
     overwrite = options.overwrite;
     targets = options.targets;
+    context = testContext ?? options.context;
+    logger = testLogger ?? options.logger;
+    server = new Server(listener: new _Listener(logger));
+    handler = new _Handler(this);
 
-    context = options.context;
-    logger = options.logger;
+    if (!await startServer(options)) {
+      context.exit(15);
+    }
 
-    EditDartfixResult result;
-
-    await startServer(options);
-
-    bool normalShutdown = false;
     try {
       final progress = await setupAnalysis(options);
       result = await requestFixes(options, progress);
-      normalShutdown = true;
     } finally {
-      try {
-        await stopServer(server);
-      } catch (_) {
-        if (normalShutdown) {
-          rethrow;
-        }
-      }
+      await server.stop();
     }
     if (result != null) {
-      applyFixes(result);
+      applyFixes();
     }
   }
 
-  Future startServer(Options options) async {
-    server = new Server(logger);
-    const connectTimeout = const Duration(seconds: 15);
-    serverConnected = new Completer();
+  Future<bool> startServer(Options options) async {
     if (options.verbose) {
-      server.debugStdio();
+      logger.trace('Dart SDK version ${Platform.version}');
+      logger.trace('  ${Platform.resolvedExecutable}');
+      logger.trace('dartfix');
+      logger.trace('  ${Platform.script.toFilePath()}');
     }
-    logger.trace('Starting...');
+    // Automatically run analysis server from source
+    // if this command line tool is being run from source within the SDK repo.
+    String serverPath = findServerPath();
     await server.start(
-        sdkPath: options.sdkPath, useSnapshot: !runAnalysisServerFromSource);
-    server.listenToOutput(dispatchNotification);
-    return serverConnected.future.timeout(connectTimeout, onTimeout: () {
-      logger.stderr('Failed to connect to server');
-      context.exit(15);
-    });
+      clientId: 'dartfix',
+      clientVersion: 'unspecified',
+      sdkPath: options.sdkPath,
+      serverPath: serverPath,
+    );
+    server.listenToOutput(notificationProcessor: handler.handleEvent);
+    return handler.serverConnected(timeLimit: const Duration(seconds: 15));
   }
 
   Future<Progress> setupAnalysis(Options options) async {
@@ -100,28 +98,22 @@
   Future<EditDartfixResult> requestFixes(
       Options options, Progress progress) async {
     logger.trace('Requesting fixes');
-    analysisComplete = new Completer();
+    Future isAnalysisComplete = handler.analysisComplete();
     Map<String, dynamic> json = await server.send(
         EDIT_REQUEST_DARTFIX, new EditDartfixParams(options.targets).toJson());
-    await analysisComplete?.future;
+
+    // TODO(danrubel): This is imprecise signal for determining when all
+    // analysis error notifications have been received. Consider adding a new
+    // notification indicating that the server is idle (all requests processed,
+    // all analysis complete, all notifications sent).
+    await isAnalysisComplete;
+
     progress.finish(showTiming: true);
     ResponseDecoder decoder = new ResponseDecoder(null);
     return EditDartfixResult.fromJson(decoder, 'result', json);
   }
 
-  Future stopServer(Server server) async {
-    logger.trace('Stopping...');
-    const timeout = const Duration(seconds: 5);
-    await server.send(SERVER_REQUEST_SHUTDOWN, null).timeout(timeout,
-        onTimeout: () {
-      // fall through to wait for exit.
-    });
-    await server.exitCode.timeout(timeout, onTimeout: () {
-      return server.kill('server failed to exit');
-    });
-  }
-
-  Future applyFixes(EditDartfixResult result) async {
+  Future applyFixes() async {
     showDescriptions('Recommended changes', result.suggestions);
     showDescriptions('Recommended changes that cannot be automatically applied',
         result.otherSuggestions);
@@ -135,7 +127,7 @@
     logger.stdout('');
     logger.stdout(ansi.emphasized('Files to be changed:'));
     for (SourceFileEdit fileEdit in result.edits) {
-      logger.stdout('  ${_relativePath(fileEdit.file)}');
+      logger.stdout('  ${relativePath(fileEdit.file)}');
     }
     if (shouldApplyChanges(result)) {
       for (SourceFileEdit fileEdit in result.edits) {
@@ -146,7 +138,7 @@
         }
         await file.writeAsString(code);
       }
-      logger.stdout('Changes applied.');
+      logger.stdout(ansi.emphasized('Changes applied.'));
     }
   }
 
@@ -157,9 +149,14 @@
       List<DartFixSuggestion> sorted = new List.from(suggestions)
         ..sort(compareSuggestions);
       for (DartFixSuggestion suggestion in sorted) {
-        Location loc = suggestion.location;
-        logger.stdout('  ${_toSentenceFragment(suggestion.description)}'
-            '${loc == null ? "" : " • ${loc.startLine}:${loc.startColumn}"}');
+        final msg = new StringBuffer();
+        msg.write('  ${toSentenceFragment(suggestion.description)}');
+        final loc = suggestion.location;
+        if (loc != null) {
+          msg.write(' • ${relativePath(loc.file)}');
+          msg.write(' • ${loc.startLine}:${loc.startColumn}');
+        }
+        logger.stdout(msg.toString());
       }
     }
   }
@@ -181,193 +178,102 @@
     return true;
   }
 
-  /// Dispatch the notification named [event], and containing parameters
-  /// [params], to the appropriate stream.
-  void dispatchNotification(String event, params) {
-    ResponseDecoder decoder = new ResponseDecoder(null);
-    switch (event) {
-      case SERVER_NOTIFICATION_CONNECTED:
-        onServerConnected(
-            new ServerConnectedParams.fromJson(decoder, 'params', params));
-        break;
-      case SERVER_NOTIFICATION_ERROR:
-        onServerError(
-            new ServerErrorParams.fromJson(decoder, 'params', params));
-        break;
-      case SERVER_NOTIFICATION_STATUS:
-        onServerStatus(
-            new ServerStatusParams.fromJson(decoder, 'params', params));
-        break;
-//      case ANALYSIS_NOTIFICATION_ANALYZED_FILES:
-//        outOfTestExpect(params, isAnalysisAnalyzedFilesParams);
-//        _onAnalysisAnalyzedFiles.add(new AnalysisAnalyzedFilesParams.fromJson(
-//            decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_CLOSING_LABELS:
-//        outOfTestExpect(params, isAnalysisClosingLabelsParams);
-//        _onAnalysisClosingLabels.add(new AnalysisClosingLabelsParams.fromJson(
-//            decoder, 'params', params));
-//        break;
-      case ANALYSIS_NOTIFICATION_ERRORS:
-        onAnalysisErrors(
-            new AnalysisErrorsParams.fromJson(decoder, 'params', params));
-        break;
-//      case ANALYSIS_NOTIFICATION_FLUSH_RESULTS:
-//        outOfTestExpect(params, isAnalysisFlushResultsParams);
-//        _onAnalysisFlushResults.add(
-//            new AnalysisFlushResultsParams.fromJson(decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_FOLDING:
-//        outOfTestExpect(params, isAnalysisFoldingParams);
-//        _onAnalysisFolding
-//            .add(new AnalysisFoldingParams.fromJson(decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_HIGHLIGHTS:
-//        outOfTestExpect(params, isAnalysisHighlightsParams);
-//        _onAnalysisHighlights.add(
-//            new AnalysisHighlightsParams.fromJson(decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_IMPLEMENTED:
-//        outOfTestExpect(params, isAnalysisImplementedParams);
-//        _onAnalysisImplemented.add(
-//            new AnalysisImplementedParams.fromJson(decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_INVALIDATE:
-//        outOfTestExpect(params, isAnalysisInvalidateParams);
-//        _onAnalysisInvalidate.add(
-//            new AnalysisInvalidateParams.fromJson(decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_NAVIGATION:
-//        outOfTestExpect(params, isAnalysisNavigationParams);
-//        _onAnalysisNavigation.add(
-//            new AnalysisNavigationParams.fromJson(decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_OCCURRENCES:
-//        outOfTestExpect(params, isAnalysisOccurrencesParams);
-//        _onAnalysisOccurrences.add(
-//            new AnalysisOccurrencesParams.fromJson(decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_OUTLINE:
-//        outOfTestExpect(params, isAnalysisOutlineParams);
-//        _onAnalysisOutline
-//            .add(new AnalysisOutlineParams.fromJson(decoder, 'params', params));
-//        break;
-//      case ANALYSIS_NOTIFICATION_OVERRIDES:
-//        outOfTestExpect(params, isAnalysisOverridesParams);
-//        _onAnalysisOverrides.add(
-//            new AnalysisOverridesParams.fromJson(decoder, 'params', params));
-//        break;
-//      case COMPLETION_NOTIFICATION_RESULTS:
-//        outOfTestExpect(params, isCompletionResultsParams);
-//        _onCompletionResults.add(
-//            new CompletionResultsParams.fromJson(decoder, 'params', params));
-//        break;
-//      case SEARCH_NOTIFICATION_RESULTS:
-//        outOfTestExpect(params, isSearchResultsParams);
-//        _onSearchResults
-//            .add(new SearchResultsParams.fromJson(decoder, 'params', params));
-//        break;
-//      case EXECUTION_NOTIFICATION_LAUNCH_DATA:
-//        outOfTestExpect(params, isExecutionLaunchDataParams);
-//        _onExecutionLaunchData.add(
-//            new ExecutionLaunchDataParams.fromJson(decoder, 'params', params));
-//        break;
-//      case FLUTTER_NOTIFICATION_OUTLINE:
-//        outOfTestExpect(params, isFlutterOutlineParams);
-//        _onFlutterOutline
-//            .add(new FlutterOutlineParams.fromJson(decoder, 'params', params));
-//        break;
-//      default:
-//        printAndFail('Unexpected notification: $event');
-//        break;
-    }
-  }
-
-  void onAnalysisErrors(AnalysisErrorsParams params) {
-    List<AnalysisError> errors = params.errors;
-    bool foundAtLeastOneError = false;
-    if (errors.isNotEmpty && isTarget(params.file)) {
-      for (AnalysisError error in errors) {
-        if (!shouldFilterError(error)) {
-          if (!foundAtLeastOneError) {
-            foundAtLeastOneError = true;
-            logger.stdout('${_relativePath(params.file)}:');
-          }
-          Location loc = error.location;
-          logger.stdout('  ${_toSentenceFragment(error.message)}'
-              ' • ${loc.startLine}:${loc.startColumn}');
-        }
-      }
-    }
-  }
-
-  void onServerConnected(ServerConnectedParams params) {
-    logger.trace('Connected to server');
-    serverConnected.complete();
-  }
-
-  void onServerError(ServerErrorParams params) async {
-    try {
-      await stopServer(server);
-    } catch (e) {
-      // ignored
-    }
-    final message = new StringBuffer('Server Error: ')..writeln(params.message);
-    if (params.stackTrace != null) {
-      message.writeln(params.stackTrace);
-    }
-    logger.stderr(message.toString());
-    context.exit(15);
-  }
-
-  void onServerStatus(ServerStatusParams params) {
-    if (params.analysis != null && !params.analysis.isAnalyzing) {
-      logger.trace('Analysis complete');
-      analysisComplete?.complete();
-      analysisComplete = null;
-    }
-  }
-
-  int compareSuggestions(DartFixSuggestion s1, DartFixSuggestion s2) {
-    int result = s1.description.compareTo(s2.description);
-    if (result != 0) {
-      return result;
-    }
-    return (s2.location?.offset ?? 0) - (s1.location?.offset ?? 0);
-  }
-
-  bool shouldFilterError(AnalysisError error) {
-    // Do not show TODOs or errors that will be automatically fixed.
-
-    // TODO(danrubel): Rather than checking the error.code with
-    // specific strings, add something to the error indicating that
-    // it will be automatically fixed by edit.dartfix.
-    return error.type.name == 'TODO' ||
-        error.code == 'wrong_number_of_type_arguments_constructor';
-  }
-
-  bool isTarget(String filePath) {
+  String relativePath(String filePath) {
     for (String target in targets) {
-      if (filePath == target || path.isWithin(target, filePath)) {
-        return true;
+      if (filePath.startsWith(target)) {
+        return filePath.substring(target.length + 1);
       }
     }
-    return false;
-  }
-}
-
-String _relativePath(String filePath) {
-  final String currentPath = Directory.current.absolute.path;
-
-  if (filePath.startsWith(currentPath)) {
-    return filePath.substring(currentPath.length + 1);
-  } else {
     return filePath;
   }
 }
 
-String _toSentenceFragment(String message) {
-  return message.endsWith('.')
-      ? message.substring(0, message.length - 1)
-      : message;
+class _Listener with ServerListener, BadMessageListener {
+  final Logger logger;
+  final bool verbose;
+
+  _Listener(this.logger) : verbose = logger.isVerbose;
+
+  @override
+  void log(String prefix, String details) {
+    if (verbose) {
+      logger.trace('$prefix $details');
+    }
+  }
+}
+
+class _Handler
+    with NotificationHandler, ConnectionHandler, AnalysisCompleteHandler {
+  final Driver driver;
+  final Logger logger;
+  final Server server;
+
+  _Handler(this.driver)
+      : logger = driver.logger,
+        server = driver.server;
+
+  @override
+  void onFailedToConnect() {
+    logger.stderr('Failed to connect to server');
+  }
+
+  @override
+  void onProtocolNotSupported(Version version) {
+    logger.stderr('Expected protocol version ${Driver.expectedProtocolVersion},'
+        ' but found $version');
+    if (version > Driver.expectedProtocolVersion) {
+      logger.stdout('''
+This version of dartfix is incompatible with the current Dart SDK. 
+Try installing a newer version of dartfix by running
+
+    pub global activate dartfix
+''');
+    } else {
+      logger.stdout('''
+This version of dartfix is too new to be used with the current Dart SDK.
+Try upgrading the Dart SDK to a newer version
+or installing an older version of dartfix using
+
+    pub global activate dartfix <version>
+''');
+    }
+  }
+
+  @override
+  bool checkServerProtocolVersion(Version version) {
+    // This overrides the default protocol version check to be more narrow
+    // because the edit.dartfix protocol is experimental
+    // and will continue to evolve.
+    return version == Driver.expectedProtocolVersion;
+  }
+
+  @override
+  void onServerError(ServerErrorParams params) {
+    if (params.isFatal) {
+      logger.stderr('Fatal Server Error: ${params.message}');
+    } else {
+      logger.stderr('Server Error: ${params.message}');
+    }
+    if (params.stackTrace != null) {
+      logger.stderr(params.stackTrace);
+    }
+    super.onServerError(params);
+  }
+
+  @override
+  void onAnalysisErrors(AnalysisErrorsParams params) {
+    List<AnalysisError> errors = params.errors;
+    bool foundAtLeastOneError = false;
+    for (AnalysisError error in errors) {
+      if (shouldShowError(error)) {
+        if (!foundAtLeastOneError) {
+          foundAtLeastOneError = true;
+          logger.stdout('${driver.relativePath(params.file)}:');
+        }
+        Location loc = error.location;
+        logger.stdout('  ${toSentenceFragment(error.message)}'
+            ' • ${loc.startLine}:${loc.startColumn}');
+      }
+    }
+  }
 }
diff --git a/pkg/dartfix/lib/src/options.dart b/pkg/dartfix/lib/src/options.dart
index bd51025..2353b66 100644
--- a/pkg/dartfix/lib/src/options.dart
+++ b/pkg/dartfix/lib/src/options.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/dartfix/lib/src/server.dart b/pkg/dartfix/lib/src/server.dart
deleted file mode 100644
index 525610e..0000000
--- a/pkg/dartfix/lib/src/server.dart
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:cli_util/cli_logging.dart';
-import 'package:path/path.dart';
-
-/**
- * Type of callbacks used to process notifications.
- */
-typedef void NotificationProcessor(String event, params);
-
-/**
- * Instances of the class [Server] manage a connection to a server process, and
- * facilitate communication to and from the server.
- */
-class Server {
-  /**
-   * Server process object, or null if server hasn't been started yet.
-   */
-  Process _process;
-
-  /**
-   * Commands that have been sent to the server but not yet acknowledged, and
-   * the [Completer] objects which should be completed when acknowledgement is
-   * received.
-   */
-  final Map<String, Completer<Map<String, dynamic>>> _pendingCommands =
-      <String, Completer<Map<String, dynamic>>>{};
-
-  /**
-   * Number which should be used to compute the 'id' to send in the next command
-   * sent to the server.
-   */
-  int _nextId = 0;
-
-  /**
-   * Messages which have been exchanged with the server; we buffer these
-   * up until the test finishes, so that they can be examined in the debugger
-   * or printed out in response to a call to [debugStdio].
-   */
-  final List<String> _recordedStdio = <String>[];
-
-  /**
-   * True if we are currently printing out messages exchanged with the server.
-   */
-  bool _debuggingStdio = false;
-
-  /**
-   * True if we've received bad data from the server, and we are aborting the
-   * test.
-   */
-  bool _receivedBadDataFromServer = false;
-
-  /**
-   * Stopwatch that we use to generate timing information for debug output.
-   */
-  Stopwatch _time = new Stopwatch();
-
-  /**
-   * The [currentElapseTime] at which the last communication was received from the server
-   * or `null` if no communication has been received.
-   */
-  double lastCommunicationTime;
-
-  /**
-   * The current elapse time (seconds) since the server was started.
-   */
-  double get currentElapseTime => _time.elapsedTicks / _time.frequency;
-
-  /**
-   * Future that completes when the server process exits.
-   */
-  Future<int> get exitCode => _process.exitCode;
-
-  final Logger logger;
-
-  Server(this.logger);
-
-  /**
-   * Print out any messages exchanged with the server.  If some messages have
-   * already been exchanged with the server, they are printed out immediately.
-   */
-  void debugStdio() {
-    if (_debuggingStdio) {
-      return;
-    }
-    _debuggingStdio = true;
-    for (String line in _recordedStdio) {
-      logger.trace(line);
-    }
-  }
-
-  /**
-   * Find the root directory of the analysis_server package by proceeding
-   * upward until finding the Dart SDK repository root then returning
-   * the analysis_server package root within the repository.
-   * Return `null` if it cannot be found.
-   */
-  static String findRoot([String pathname]) {
-    pathname ??= Platform.script.toFilePath(windows: Platform.isWindows);
-    while (true) {
-      String parent = dirname(pathname);
-      if (parent.length >= pathname.length) {
-        return null;
-      }
-      String root = normalize(join(parent, 'pkg', 'analysis_server'));
-      String server = join(root, 'bin', 'server.dart');
-      if (new File(server).existsSync()) {
-        return root;
-      }
-      pathname = parent;
-    }
-  }
-
-  /**
-   * Return a future that will complete when all commands that have been sent
-   * to the server so far have been flushed to the OS buffer.
-   */
-  Future flushCommands() {
-    return _process.stdin.flush();
-  }
-
-  /**
-   * Stop the server.
-   */
-  Future<int> kill(String reason) {
-    debugStdio();
-    _recordStdio('FORCIBLY TERMINATING PROCESS: $reason');
-    _process.kill();
-    return _process.exitCode;
-  }
-
-  /**
-   * Start listening to output from the server, and deliver notifications to
-   * [notificationProcessor].
-   */
-  void listenToOutput(NotificationProcessor notificationProcessor) {
-    _process.stdout
-        .transform(utf8.decoder)
-        .transform(new LineSplitter())
-        .listen((String line) {
-      lastCommunicationTime = currentElapseTime;
-      String trimmedLine = line.trim();
-
-      // Guard against lines like:
-      //   {"event":"server.connected","params":{...}}Observatory listening on ...
-      final String observatoryMessage = 'Observatory listening on ';
-      if (trimmedLine.contains(observatoryMessage)) {
-        trimmedLine = trimmedLine
-            .substring(0, trimmedLine.indexOf(observatoryMessage))
-            .trim();
-      }
-      if (trimmedLine.isEmpty) {
-        return;
-      }
-
-      _recordStdio('<== $trimmedLine');
-      var message;
-      try {
-        message = json.decoder.convert(trimmedLine);
-      } catch (exception) {
-        _badDataFromServer('JSON decode failure: $exception');
-        return;
-      }
-      Map messageAsMap = message;
-      if (messageAsMap.containsKey('id')) {
-        String id = message['id'];
-        Completer<Map<String, dynamic>> completer = _pendingCommands[id];
-        if (completer == null) {
-          throw 'Unexpected response from server: id=$id';
-        } else {
-          _pendingCommands.remove(id);
-        }
-        if (messageAsMap.containsKey('error')) {
-          completer.completeError(new ServerErrorMessage(messageAsMap));
-        } else {
-          Map<String, dynamic> result = messageAsMap['result'];
-          completer.complete(result);
-        }
-      } else {
-        String event = messageAsMap['event'];
-        notificationProcessor(event, messageAsMap['params']);
-      }
-    });
-    _process.stderr
-        .transform((new Utf8Codec()).decoder)
-        .transform(new LineSplitter())
-        .listen((String line) {
-      String trimmedLine = line.trim();
-      _recordStdio('ERR:  $trimmedLine');
-      _badDataFromServer('Message received on stderr', silent: true);
-    });
-  }
-
-  /**
-   * Send a command to the server.  An 'id' will be automatically assigned.
-   * The returned [Future] will be completed when the server acknowledges the
-   * command with a response.  If the server acknowledges the command with a
-   * normal (non-error) response, the future will be completed with the 'result'
-   * field from the response.  If the server acknowledges the command with an
-   * error response, the future will be completed with an error.
-   */
-  Future<Map<String, dynamic>> send(
-      String method, Map<String, dynamic> params) {
-    String id = '${_nextId++}';
-    Map<String, dynamic> command = <String, dynamic>{
-      'id': id,
-      'method': method
-    };
-    if (params != null) {
-      command['params'] = params;
-    }
-    Completer<Map<String, dynamic>> completer =
-        new Completer<Map<String, dynamic>>();
-    _pendingCommands[id] = completer;
-    String line = json.encode(command);
-    _recordStdio('==> $line');
-    _process.stdin.add(utf8.encoder.convert("$line\n"));
-    return completer.future;
-  }
-
-  /**
-   * Start the server. If [profileServer] is `true`, the server will be started
-   * with "--observe" and "--pause-isolates-on-exit", allowing the observatory
-   * to be used.
-   */
-  Future start({
-    int diagnosticPort,
-    String instrumentationLogFile,
-    bool profileServer: false,
-    String sdkPath,
-    int servicesPort,
-    bool useAnalysisHighlight2: false,
-    bool useSnapshot: true,
-  }) async {
-    if (_process != null) {
-      throw new Exception('Process already started');
-    }
-    _time.start();
-    String dartBinary = Platform.executable;
-
-    String serverPath;
-
-    // The integration tests run 3x faster when run from snapshots (you need to
-    // run test.py with --use-sdk).
-    if (useSnapshot) {
-      // Look for snapshots/analysis_server.dart.snapshot.
-      serverPath = normalize(join(dirname(Platform.resolvedExecutable),
-          'snapshots', 'analysis_server.dart.snapshot'));
-
-      if (!FileSystemEntity.isFileSync(serverPath)) {
-        // Look for dart-sdk/bin/snapshots/analysis_server.dart.snapshot.
-        serverPath = normalize(join(dirname(Platform.resolvedExecutable),
-            'dart-sdk', 'bin', 'snapshots', 'analysis_server.dart.snapshot'));
-      }
-    } else {
-      String rootDir = Server.findRoot();
-      if (rootDir == null) {
-        throw new Exception("Can't find analysis server root directory");
-      }
-      serverPath = normalize(join(rootDir, 'bin', 'server.dart'));
-    }
-
-    List<String> arguments = [];
-    //
-    // Add VM arguments.
-    //
-    if (profileServer) {
-      if (servicesPort == null) {
-        arguments.add('--observe');
-      } else {
-        arguments.add('--observe=$servicesPort');
-      }
-      arguments.add('--pause-isolates-on-exit');
-    } else if (servicesPort != null) {
-      arguments.add('--enable-vm-service=$servicesPort');
-    }
-    if (Platform.packageConfig != null) {
-      arguments.add('--packages=${Platform.packageConfig}');
-    }
-    //
-    // Add the server executable.
-    //
-    arguments.add(serverPath);
-    //
-    // Add server arguments.
-    //
-    arguments.add('--suppress-analytics');
-    if (diagnosticPort != null) {
-      arguments.add('--port');
-      arguments.add(diagnosticPort.toString());
-    }
-    if (instrumentationLogFile != null) {
-      arguments.add('--instrumentation-log-file=$instrumentationLogFile');
-    }
-    if (sdkPath != null) {
-      arguments.add('--sdk=$sdkPath');
-    }
-    if (useAnalysisHighlight2) {
-      arguments.add('--useAnalysisHighlight2');
-    }
-    _process = await Process.start(dartBinary, arguments);
-    _process.exitCode.then((int code) {
-      if (code != 0) {
-        _badDataFromServer('server terminated with exit code $code');
-      }
-    });
-  }
-
-  /**
-   * Deal with bad data received from the server.
-   */
-  void _badDataFromServer(String details, {bool silent: false}) {
-    if (!silent) {
-      _recordStdio('BAD DATA FROM SERVER: $details');
-    }
-    if (_receivedBadDataFromServer) {
-      // We're already dealing with it.
-      return;
-    }
-    _receivedBadDataFromServer = true;
-    debugStdio();
-    // Give the server 1 second to continue outputting bad data
-    // such as outputting a stacktrace.
-    new Future.delayed(new Duration(seconds: 1), () {
-      throw 'Bad data received from server: $details';
-    });
-  }
-
-  /**
-   * Record a message that was exchanged with the server, and print it out if
-   * [debugStdio] has been called.
-   */
-  void _recordStdio(String line) {
-    double elapsedTime = currentElapseTime;
-    line = "$elapsedTime: $line";
-    if (_debuggingStdio) {
-      logger.trace(line);
-    }
-    _recordedStdio.add(line);
-  }
-}
-
-/**
- * An error result from a server request.
- */
-class ServerErrorMessage {
-  final Map message;
-
-  ServerErrorMessage(this.message);
-
-  dynamic get error => message['error'];
-
-  String toString() => message.toString();
-}
diff --git a/pkg/dartfix/lib/src/util.dart b/pkg/dartfix/lib/src/util.dart
new file mode 100644
index 0000000..cdce9f4
--- /dev/null
+++ b/pkg/dartfix/lib/src/util.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' show File, Platform;
+
+import 'package:analysis_server_client/protocol.dart';
+import 'package:path/path.dart' as path;
+
+int compareSuggestions(DartFixSuggestion s1, DartFixSuggestion s2) {
+  int result = s1.description.compareTo(s2.description);
+  if (result != 0) {
+    return result;
+  }
+  return (s2.location?.offset ?? 0) - (s1.location?.offset ?? 0);
+}
+
+/// Return the analysis_server executable by proceeding upward
+/// until finding the Dart SDK repository root then returning
+/// the analysis_server executable within the repository.
+/// Return `null` if it cannot be found.
+String findServerPath() {
+  String pathname = Platform.script.toFilePath();
+  while (true) {
+    String parent = path.dirname(pathname);
+    if (parent.length >= pathname.length) {
+      return null;
+    }
+    String serverPath =
+        path.join(parent, 'pkg', 'analysis_server', 'bin', 'server.dart');
+    if (new File(serverPath).existsSync()) {
+      return serverPath;
+    }
+    pathname = parent;
+  }
+}
+
+bool shouldShowError(AnalysisError error) {
+  // Only show diagnostics that will affect the fixes.
+  return error.type.name != 'HINT' &&
+      error.type.name != 'LINT' &&
+      error.type.name != 'TODO' &&
+      // TODO(danrubel): Rather than checking the error.code with
+      // specific strings, add something to the error indicating that
+      // it will be automatically fixed by edit.dartfix.
+      error.code != 'wrong_number_of_type_arguments_constructor';
+}
+
+String toSentenceFragment(String message) {
+  return message.endsWith('.')
+      ? message.substring(0, message.length - 1)
+      : message;
+}
diff --git a/pkg/dartfix/pubspec.yaml b/pkg/dartfix/pubspec.yaml
index 2349956..dac0629 100644
--- a/pkg/dartfix/pubspec.yaml
+++ b/pkg/dartfix/pubspec.yaml
@@ -1,16 +1,22 @@
 name: dartfix
-version: 0.1.0
+version: 0.1.3
 author: Dart Team <misc@dartlang.org>
 description:
   A tool for migrating Dart source to newer versions of the Dart SDK,
   and fixing common issues.
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/dartfix
+executables:
+  dartfix: fix
 environment:
-  sdk: '>=2.0.0 <3.0.0'
+  sdk: '>=2.1.0 <3.0.0'
 dependencies:
-  analysis_server_client: ^2.0.0
-  args: any
-  cli_util: any
-  path: any
+  # pin to an exact version of analysis_server_client because the edit.dartfix protocol
+  # is experimental and will continue to evolve
+  analysis_server_client: 1.1.1
+  args: ^1.4.0
+  cli_util: ^0.1.3
+  path: ^1.6.0
+  pub_semver: ^1.4.2
 dev_dependencies:
   analyzer: ^0.33.0
   test: ^1.3.0
diff --git a/pkg/dartfix/test/all.dart b/pkg/dartfix/test/all.dart
index c27aa48..8fea855 100644
--- a/pkg/dartfix/test/all.dart
+++ b/pkg/dartfix/test/all.dart
@@ -1,9 +1,13 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:test/test.dart';
+
+import 'src/driver_test.dart' as driver_test;
 import 'src/options_test.dart' as options_test;
 
 main() {
-  options_test.main();
+  group('driver', driver_test.main);
+  group('options', options_test.main);
 }
diff --git a/pkg/dartfix/test/src/driver_test.dart b/pkg/dartfix/test/src/driver_test.dart
new file mode 100644
index 0000000..1aa5493
--- /dev/null
+++ b/pkg/dartfix/test/src/driver_test.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:analysis_server_client/protocol.dart';
+import 'package:dartfix/src/driver.dart';
+import 'package:pub_semver/pub_semver.dart';
+import 'package:test/test.dart';
+
+import 'test_context.dart';
+
+const _debug = true;
+const _updateExample = false;
+
+main() {
+  File exampleFile;
+  File exampleFixedFile;
+  Directory exampleDir;
+
+  setUp(() {
+    exampleFile = findFile('pkg/dartfix/example/example.dart');
+    exampleFixedFile = findFile('pkg/dartfix/example/example-fixed.dart');
+    exampleDir = exampleFile.parent;
+  });
+
+  test('protocol version', () {
+    // The edit.dartfix protocol is experimental and will continue to evolve
+    // an so dartfix will only work with this specific version of the protocol.
+    // If the protocol changes, then a new version of both the
+    // analysis_server_client and dartfix packages must be published.
+    expect(new Version.parse(PROTOCOL_VERSION), Driver.expectedProtocolVersion);
+  });
+
+  test('client version', () {
+    // The edit.dartfix protocol is experimental and will continue to evolve
+    // an so dartfix will only work with this specific version of the
+    // analysis_server_client package.
+    // If the protocol changes, then a new version of both the
+    // analysis_server_client and dartfix packages must be published.
+    expect(clientVersion, clientVersionInDartfixPubspec);
+  });
+
+  test('fix example', () async {
+    final driver = new Driver();
+    final testContext = new TestContext();
+    final testLogger = new TestLogger();
+    String exampleSource = await exampleFile.readAsString();
+
+    await driver.start([exampleDir.path],
+        testContext: testContext, testLogger: testLogger);
+    if (_debug) {
+      print(testLogger.stderrBuffer.toString());
+      print(testLogger.stdoutBuffer.toString());
+      print('--- original example');
+      print(exampleSource);
+    }
+
+    final suggestions = driver.result.suggestions;
+    expect(suggestions, hasLength(2));
+    expectHasSuggestion(suggestions, 'Convert MyMixin to a mixin');
+    expectHasSuggestion(suggestions, 'Replace a double literal');
+
+    expect(driver.result.edits, hasLength(1));
+    for (SourceEdit edit in driver.result.edits[0].edits) {
+      exampleSource = edit.apply(exampleSource);
+    }
+    if (_debug) {
+      print('--- fixed example');
+      print(exampleSource);
+    }
+
+    exampleSource = replaceLeadingComment(exampleSource);
+    if (_updateExample) {
+      await exampleFixedFile.writeAsString(exampleSource);
+    } else {
+      final expectedSource = await exampleFixedFile.readAsString();
+      expect(exampleSource, expectedSource);
+    }
+  });
+
+  test('run example', () async {
+    if (_debug) print('--- launching original example');
+    final futureResult1 =
+        Process.run(Platform.resolvedExecutable, [exampleFile.path]);
+
+    if (_debug) print('--- launching fixed example');
+    final futureResult2 =
+        Process.run(Platform.resolvedExecutable, [exampleFixedFile.path]);
+
+    if (_debug) print('--- waiting for original example');
+    final result1 = await futureResult1;
+
+    if (_debug) print('--- waiting for fixed example');
+    final result2 = await futureResult2;
+
+    final stdout1 = result1.stdout;
+    final stdout2 = result2.stdout;
+    if (_debug) {
+      print('--- original example output');
+      print(stdout1);
+      print('--- fixed example output');
+      print(stdout2);
+    }
+    expect(stdout1, stdout2);
+  });
+}
+
+String get clientVersion =>
+    findValue(findFile('pkg/analysis_server_client/pubspec.yaml'), 'version');
+
+String get clientVersionInDartfixPubspec =>
+    findValue(findFile('pkg/dartfix/pubspec.yaml'), 'analysis_server_client');
+
+File findFile(String relPath) {
+  Directory dir = Directory.current;
+  while (true) {
+    final file = new File.fromUri(dir.uri.resolve(relPath));
+    if (file.existsSync()) {
+      return file;
+    }
+    final parent = dir.parent;
+    if (parent.path == dir.path) {
+      fail('Failed to find $relPath');
+    }
+    dir = parent;
+  }
+}
+
+String findValue(File pubspec, String key) {
+  List<String> lines = pubspec.readAsLinesSync();
+  for (String line in lines) {
+    if (line.trim().startsWith('$key:')) {
+      return line.split(':')[1].trim();
+    }
+  }
+  fail('Failed to find $key in ${pubspec.path}');
+}
+
+void expectHasSuggestion(
+    List<DartFixSuggestion> suggestions, String expectedText) {
+  for (DartFixSuggestion suggestion in suggestions) {
+    if (suggestion.description.contains(expectedText)) {
+      return;
+    }
+  }
+  fail('Failed to find suggestion containing: $expectedText');
+}
+
+String replaceLeadingComment(String source) {
+  final out = new StringBuffer('''
+// This file contains code that has been modified by running dartfix.
+// See example.dart for the original unmodified code.
+  '''
+      .trim());
+  final pattern = 'the content of this file matches example-fixed.dart.';
+  out.write(source.substring(source.indexOf(pattern) + pattern.length));
+  return out.toString();
+}
diff --git a/pkg/dartfix/test/src/options_test.dart b/pkg/dartfix/test/src/options_test.dart
index 269ebff..7ce0e1a 100644
--- a/pkg/dartfix/test/src/options_test.dart
+++ b/pkg/dartfix/test/src/options_test.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -9,103 +9,101 @@
 import 'test_context.dart';
 
 main() {
-  group('Options', () {
-    TestContext context;
-    TestLogger logger;
+  TestContext context;
+  TestLogger logger;
 
-    setUp(() {
-      context = new TestContext();
-      logger = new TestLogger();
-    });
+  setUp(() {
+    context = new TestContext();
+    logger = new TestLogger();
+  });
 
-    String p(String filePath) => context.convertPath(filePath);
+  String p(String filePath) => context.convertPath(filePath);
 
-    Options parse(
-      List<String> args, {
-      String errorOut,
-      int exitCode,
-      bool force = false,
-      String normalOut,
-      bool overwrite = false,
-      List<String> targetSuffixes,
-      bool verbose = false,
-    }) {
-      Options options;
-      int actualExitCode;
-      try {
-        options = Options.parse(args, context: context, logger: logger);
-      } on TestExit catch (e) {
-        actualExitCode = e.code;
-      }
-      expect(logger.stderrBuffer.toString(),
-          errorOut != null ? contains(errorOut) : isEmpty);
-      expect(logger.stdoutBuffer.toString(),
-          normalOut != null ? contains(normalOut) : isEmpty);
-      if (exitCode != null) {
-        expect(actualExitCode, exitCode, reason: 'exit code');
-        return null;
-      } else {
-        expect(actualExitCode, isNull, reason: 'exit code');
-      }
-      expect(options.force, force);
-      expect(options.overwrite, overwrite);
-      expect(options.verbose, verbose);
-      expect(path.isAbsolute(options.sdkPath), isTrue, reason: options.sdkPath);
-      for (String target in options.targets) {
-        expect(target, isNotNull);
-        expect(path.isAbsolute(target), isTrue, reason: '$target');
-      }
-      if (targetSuffixes != null) {
-        for (String suffix in targetSuffixes) {
-          expectContains(options.targets, suffix);
-        }
-      }
-      return options;
+  Options parse(
+    List<String> args, {
+    String errorOut,
+    int exitCode,
+    bool force = false,
+    String normalOut,
+    bool overwrite = false,
+    List<String> targetSuffixes,
+    bool verbose = false,
+  }) {
+    Options options;
+    int actualExitCode;
+    try {
+      options = Options.parse(args, context: context, logger: logger);
+    } on TestExit catch (e) {
+      actualExitCode = e.code;
     }
-
-    test('force', () {
-      parse(['--force', 'foo'], force: true, targetSuffixes: ['foo']);
-    });
-
-    test('help', () {
-      parse(['--help'], errorOut: 'Display this help message', exitCode: 1);
-    });
-
-    test('invalid option', () {
-      parse(['--foo'],
-          errorOut: 'Could not find an option named "foo"', exitCode: 15);
-    });
-
-    test('invalid option no logger', () {
-      try {
-        Options.parse(['--foo'], context: context);
-        fail('Expected exception');
-      } on TestExit catch (e) {
-        expect(e.code, 15, reason: 'exit code');
+    expect(logger.stderrBuffer.toString(),
+        errorOut != null ? contains(errorOut) : isEmpty);
+    expect(logger.stdoutBuffer.toString(),
+        normalOut != null ? contains(normalOut) : isEmpty);
+    if (exitCode != null) {
+      expect(actualExitCode, exitCode, reason: 'exit code');
+      return null;
+    } else {
+      expect(actualExitCode, isNull, reason: 'exit code');
+    }
+    expect(options.force, force);
+    expect(options.overwrite, overwrite);
+    expect(options.verbose, verbose);
+    expect(path.isAbsolute(options.sdkPath), isTrue, reason: options.sdkPath);
+    for (String target in options.targets) {
+      expect(target, isNotNull);
+      expect(path.isAbsolute(target), isTrue, reason: '$target');
+    }
+    if (targetSuffixes != null) {
+      for (String suffix in targetSuffixes) {
+        expectContains(options.targets, suffix);
       }
-    });
+    }
+    return options;
+  }
 
-    test('invalid target', () {
-      parse(['foo.dart'],
-          errorOut: 'Expected directory, but found', exitCode: 15);
-    });
+  test('force', () {
+    parse(['--force', 'foo'], force: true, targetSuffixes: ['foo']);
+  });
 
-    test('overwrite', () {
-      parse(['--overwrite', 'foo'], overwrite: true, targetSuffixes: ['foo']);
-    });
+  test('help', () {
+    parse(['--help'], errorOut: 'Display this help message', exitCode: 1);
+  });
 
-    test('simple', () {
-      parse(['foo'], targetSuffixes: ['foo']);
-    });
+  test('invalid option', () {
+    parse(['--foo'],
+        errorOut: 'Could not find an option named "foo"', exitCode: 15);
+  });
 
-    test('two targets', () {
-      parse([p('one/foo'), p('two/bar')],
-          targetSuffixes: [p('one/foo'), p('two/bar')]);
-    });
+  test('invalid option no logger', () {
+    try {
+      Options.parse(['--foo'], context: context);
+      fail('Expected exception');
+    } on TestExit catch (e) {
+      expect(e.code, 15, reason: 'exit code');
+    }
+  });
 
-    test('verbose', () {
-      parse(['--verbose', 'foo'], verbose: true);
-    });
+  test('invalid target', () {
+    parse(['foo.dart'],
+        errorOut: 'Expected directory, but found', exitCode: 15);
+  });
+
+  test('overwrite', () {
+    parse(['--overwrite', 'foo'], overwrite: true, targetSuffixes: ['foo']);
+  });
+
+  test('simple', () {
+    parse(['foo'], targetSuffixes: ['foo']);
+  });
+
+  test('two targets', () {
+    parse([p('one/foo'), p('two/bar')],
+        targetSuffixes: [p('one/foo'), p('two/bar')]);
+  });
+
+  test('verbose', () {
+    parse(['--verbose', 'foo'], verbose: true);
   });
 }
 
diff --git a/pkg/dartfix/test/src/test_context.dart b/pkg/dartfix/test/src/test_context.dart
index 1298b9a..61faf26 100644
--- a/pkg/dartfix/test/src/test_context.dart
+++ b/pkg/dartfix/test/src/test_context.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
diff --git a/pkg/dev_compiler/README.md b/pkg/dev_compiler/README.md
index 4f6e803..565ac17 100644
--- a/pkg/dev_compiler/README.md
+++ b/pkg/dev_compiler/README.md
@@ -3,7 +3,7 @@
 
 [![Build Status](https://travis-ci.org/dart-lang/sdk.svg?branch=master)](https://travis-ci.org/dart-lang/sdk)
 
-The Dart Dev Compiler (DDC) is a fast, modular compiler that generates modern JavaScript (EcmaScript 6).  Its primary use today is to support fast, iterative development of Dart web applications for Chrome and other modern browers.
+The Dart Dev Compiler (DDC) is a fast, modular compiler that generates modern JavaScript (EcmaScript 6).  Its primary use today is to support fast, iterative development of Dart web applications for Chrome and other modern browsers.
 
 Most users will use DDC via [pub](https://webdev.dartlang.org/tools/pub/pub-serve).  It is supported by pub starting with the Dart 1.24 release.
 
@@ -32,12 +32,12 @@
 
 # Modularity
 
-DDC provides fast, incremental compilation based on standard JavaScript modules.  Unlike Dart2JS, DDC does not require an entire Dart application.  Instead, it operates modularly: it compiles a set of Dart files into a JavaScript module.  A DDC compilation step requires a set of input Dart files and a set of *summaries* of dependencies.  It performs modular type checking as part of this compilation step, and, if the input type checks, it generates a JavaScript module (e.g., [*ES6*](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), [*AMD*](https://github.com/amdjs/amdjs-api/blob/master/AMD.md), or [*CommonJS*](https://nodejs.org/docs/latest/api/modules.html).  The browser (i.e., the JavaScript runtime) loads and links the generated modules when running the application.  
-During development, a compilation step only needs to be rerun if the Dart files or summaries it relies upon change.  For most changes, only a very small part of your code will require recompilation.  Morever, modules that are unchanged can be cached in the browser.
+DDC provides fast, incremental compilation based on standard JavaScript modules.  Unlike Dart2JS, DDC does not require an entire Dart application.  Instead, it operates modularly: it compiles a set of Dart files into a JavaScript module.  A DDC compilation step requires a set of input Dart files and a set of *summaries* of dependencies.  It performs modular type checking as part of this compilation step, and, if the input type checks, it generates a JavaScript module (e.g., [*ES6*](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), [*AMD*](https://github.com/amdjs/amdjs-api/blob/master/AMD.md), or [*CommonJS*](https://nodejs.org/docs/latest/api/modules.html)).  The browser (i.e., the JavaScript runtime) loads and links the generated modules when running the application.
+During development, a compilation step only needs to be rerun if the Dart files or summaries it relies upon change.  For most changes, only a very small part of your code will require recompilation.  Moreover, modules that are unchanged can be cached in the browser.
 
 Most users invoke DDC indirectly via [pub](https://webdev.dartlang.org/tools/pub/pub-serve).  Pub computes module structure and build steps automatically and invoke DDC accordingly.  Pub configures DDC to use AMD modules and uses the standard [AMD `require.js` loader](http://requirejs.org/) to bootstrap and load the application.
 
-More advanced users may want to configure or invoke DDC directly.  In general, the mapping of Dart files to JS modules is flexible.  The key requirement is that module dependences (i.e., `require` in AMD or CommonJS or `import` in ES6) must be acyclic.  In practice, this means that individual Dart libraries cannot each be mapped to a corresponding JS module (as Dart imports can be and often are cyclic).  See the [usage document](USAGE.md) for more details.
+More advanced users may want to configure or invoke DDC directly.  In general, the mapping of Dart files to JS modules is flexible.  The key requirement is that module dependencies (i.e., `require` in AMD or CommonJS or `import` in ES6) must be acyclic.  In practice, this means that individual Dart libraries cannot each be mapped to a corresponding JS module (as Dart imports can be and often are cyclic).  See the [usage document](USAGE.md) for more details.
 
 # EcmaScript 6
 
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index 28b950d..b366550 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -38,7 +38,6 @@
 class _CompilerWorker extends AsyncWorkerLoop {
   /// The original args supplied to the executable.
   final ParsedArguments _startupArgs;
-  CompilerResult _result;
 
   _CompilerWorker(this._startupArgs, AsyncWorkerConnection workerConnection)
       : super(connection: workerConnection);
@@ -47,18 +46,17 @@
   Future<WorkResponse> performRequest(WorkRequest request) async {
     var args = _startupArgs.merge(request.arguments);
     var output = StringBuffer();
-    _result = await runZoned(() => compile(args, previousResult: _result),
-        zoneSpecification:
-            ZoneSpecification(print: (self, parent, zone, message) {
+    var result = await runZoned(() => compile(args), zoneSpecification:
+        ZoneSpecification(print: (self, parent, zone, message) {
       output.writeln(message.toString());
     }));
     return WorkResponse()
-      ..exitCode = _result.success ? 0 : 1
+      ..exitCode = result.success ? 0 : 1
       ..output = output.toString();
   }
 }
 
-/// Runs dartdevk in batch mode for test.dart.
+/// Runs DDC in Kernel batch mode for test.dart.
 Future runBatch(ParsedArguments batchArgs) async {
   var totalTests = 0;
   var failedTests = 0;
diff --git a/pkg/dev_compiler/bin/dartdevk.dart b/pkg/dev_compiler/bin/dartdevk.dart
deleted file mode 100755
index 018464ed..0000000
--- a/pkg/dev_compiler/bin/dartdevk.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env dart
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dartdevc.dart' as dartdevc;
-
-/// Experimental command line entry point for Dart Development Compiler.
-/// Unlike `dartdevc` this version uses the shared front end and IR.
-main(List<String> args) => dartdevc.main(args.toList()..add('--kernel'));
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index e6d3e29..d8063b5 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -5,13 +5,14 @@
 import 'dart:collection' show HashMap, HashSet;
 import 'dart:math' show min, max;
 
-import 'package:analyzer/analyzer.dart' hide ConstantEvaluator;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/dart/ast/token.dart' show StringToken;
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
@@ -20,8 +21,8 @@
     show DartObject, DartObjectImpl;
 import 'package:analyzer/src/generated/resolver.dart'
     show TypeProvider, NamespaceBuilder;
-import 'package:analyzer/src/generated/type_system.dart'
-    show StrongTypeSystemImpl;
+import 'package:analyzer/src/generated/type_system.dart' show Dart2TypeSystem;
+import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/task/strong/ast_properties.dart';
 import 'package:path/path.dart' as path;
@@ -65,15 +66,15 @@
 // expressions (which result in JS.Expression) and statements
 // (which result in (JS.Statement).
 class CodeGenerator extends Object
-    with NullableTypeInference, SharedCompiler<LibraryElement>
+    with NullableTypeInference, SharedCompiler<LibraryElement, ClassElement>
     implements AstVisitor<JS.Node> {
   final SummaryDataStore summaryData;
 
   final CompilerOptions options;
-  final StrongTypeSystemImpl rules;
+  final Dart2TypeSystem rules;
 
   /// Errors that were produced during compilation, if any.
-  final List<AnalysisError> errors;
+  final ErrorCollector errors;
 
   JSTypeRep jsTypeRep;
 
@@ -104,7 +105,7 @@
   Expression _cascadeTarget;
 
   /// The variable for the current catch clause
-  SimpleIdentifier _catchParameter;
+  SimpleIdentifier _rethrowParameter;
 
   /// In an async* function, this represents the stream controller parameter.
   JS.TemporaryId _asyncStarController;
@@ -197,7 +198,7 @@
 
   CodeGenerator(LinkedAnalysisDriver driver, this.types, this.summaryData,
       this.options, this._extensionTypes, this.errors)
-      : rules = StrongTypeSystemImpl(types),
+      : rules = Dart2TypeSystem(types),
         declaredVariables = driver.declaredVariables,
         _asyncStreamIterator =
             driver.getClass('dart:async', 'StreamIterator').type,
@@ -753,11 +754,16 @@
   }
 
   @override
-  visitIsExpression(IsExpression node) {
+  JS.Expression visitIsExpression(IsExpression node) {
+    return _emitIsExpression(
+        node.expression, node.type.type, node.notOperator != null);
+  }
+
+  JS.Expression _emitIsExpression(Expression operand, DartType type,
+      [bool negated = false]) {
     // Generate `is` as `dart.is` or `typeof` depending on the RHS type.
     JS.Expression result;
-    var type = node.type.type;
-    var lhs = _visitExpression(node.expression);
+    var lhs = _visitExpression(operand);
     var typeofName = jsTypeRep.typeFor(type).primitiveTypeOf;
     // Inline primitives other than int (which requires a Math.floor check).
     if (typeofName != null && type != types.intType) {
@@ -766,10 +772,7 @@
       result = js.call('#.is(#)', [_emitType(type), lhs]);
     }
 
-    if (node.notOperator != null) {
-      return js.call('!#', result);
-    }
-    return result;
+    return negated ? js.call('!#', result) : result;
   }
 
   /// No-op, typedefs are emitted as their corresponding function type.
@@ -1296,7 +1299,7 @@
     }
 
     var supertype = classElem.isMixin ? types.objectType : classElem.supertype;
-    var hasUnnamedSuper = _hasUnnamedConstructor(supertype.element);
+    var hasUnnamedSuper = _hasUnnamedInheritedConstructor(supertype.element);
 
     void emitMixinConstructors(JS.Expression className, [InterfaceType mixin]) {
       var supertype = classElem.supertype;
@@ -1318,8 +1321,8 @@
           ctorBody
               .add(_emitSuperConstructorCall(className, ctor.name, jsParams));
         }
-        body.add(_addConstructorToClass(
-            className, ctor.name, JS.Fun(jsParams, JS.Block(ctorBody))));
+        body.add(_addConstructorToClass(classElem, className, ctor.name,
+            JS.Fun(jsParams, JS.Block(ctorBody))));
       }
     }
 
@@ -1756,13 +1759,16 @@
     if (!mocks.containsKey(element.name + '=')) {
       var args = field.isFinal ? [JS.Super(), name] : [JS.This(), virtualField];
 
-      var setter = element.setter;
-      var covariantParams = _classProperties.covariantParameters;
       JS.Expression value = JS.Identifier('value');
-      if (setter != null &&
-          covariantParams != null &&
-          covariantParams.contains(setter.parameters[0])) {
-        value = _emitCast(setter.parameters[0].type, value);
+
+      var setter = element.setter;
+      if (setter != null) {
+        var covariantParams = _classProperties.covariantParameters;
+        var param = setter.parameters[0];
+        if (param.isCovariant ||
+            covariantParams != null && covariantParams.contains(param)) {
+          value = _emitCast(param.type, value);
+        }
       }
       args.add(value);
 
@@ -1876,7 +1882,7 @@
     }
 
     addConstructor(String name, JS.Expression jsCtor) {
-      body.add(_addConstructorToClass(className, name, jsCtor));
+      body.add(_addConstructorToClass(classElem, className, name, jsCtor));
     }
 
     if (classElem.isEnum) {
@@ -1940,12 +1946,31 @@
             c.isSynthetic && c.name != '' || c.isFactory || c.isExternal);
   }
 
-  JS.Statement _addConstructorToClass(
-      JS.Expression className, String name, JS.Expression jsCtor) {
-    jsCtor = defineValueOnClass(className, _constructorName(name), jsCtor);
+  JS.Statement _addConstructorToClass(ClassElement c, JS.Expression className,
+      String name, JS.Expression jsCtor) {
+    jsCtor = defineValueOnClass(c, className, _constructorName(name), jsCtor);
     return js.statement('#.prototype = #.prototype;', [jsCtor, className]);
   }
 
+  @override
+  bool superclassHasStatic(ClassElement c, String name) {
+    // Note: because we're only considering statics, we can ignore mixins.
+    // We're only trying to find conflicts due to JS inheriting statics.
+    var library = c.library;
+    while (true) {
+      var supertype = c.supertype;
+      if (supertype == null) return false;
+      c = supertype.element;
+      for (var members in [c.methods, c.accessors]) {
+        for (var m in members) {
+          if (m.isStatic && m.name == name && m.isAccessibleIn(library)) {
+            return true;
+          }
+        }
+      }
+    }
+  }
+
   /// Emits static fields for a class, and initialize them eagerly if possible,
   /// otherwise define them as lazy properties.
   void _emitStaticFields(ClassElement classElem,
@@ -1954,7 +1979,7 @@
       // Emit enum static fields
       var type = classElem.type;
       void addField(FieldElement e, JS.Expression value) {
-        body.add(defineValueOnClass(_emitStaticClassName(classElem),
+        body.add(defineValueOnClass(classElem, _emitStaticClassName(classElem),
                 _declareMemberName(e.getter), value)
             .toStatement());
       }
@@ -2249,8 +2274,8 @@
     var parameters = element.parameters
         .map((p) => ParameterElementImpl.synthetic(
             p.name,
-            // ignore: deprecated_member_use
             _isCovariant(p) ? objectClass.type : p.type,
+            // ignore: deprecated_member_use
             p.parameterKind))
         .toList();
 
@@ -2359,24 +2384,23 @@
         [className, _constructorName(name), args ?? []]);
   }
 
+  bool _hasUnnamedInheritedConstructor(ClassElement e) {
+    if (e == null) return false;
+    return _hasUnnamedConstructor(e) || _hasUnnamedSuperConstructor(e);
+  }
+
   bool _hasUnnamedSuperConstructor(ClassElement e) {
-    var supertype = e.supertype;
-    // Object or mixin declaration.
-    if (supertype == null) return false;
-    if (_hasUnnamedConstructor(supertype.element)) return true;
     for (var mixin in e.mixins) {
       if (_hasUnnamedConstructor(mixin.element)) return true;
     }
-    return false;
+    return _hasUnnamedInheritedConstructor(e.supertype?.element);
   }
 
   bool _hasUnnamedConstructor(ClassElement e) {
     if (e.type.isObject) return false;
     var ctor = e.unnamedConstructor;
-    if (ctor == null) return false;
-    if (!ctor.isSynthetic) return true;
-    if (e.fields.any((f) => !f.isStatic && !f.isSynthetic)) return true;
-    return _hasUnnamedSuperConstructor(e);
+    if (ctor != null && !ctor.isSynthetic) return true;
+    return e.fields.any((f) => !f.isStatic && !f.isSynthetic);
   }
 
   /// Initialize fields. They follow the sequence:
@@ -2659,11 +2683,14 @@
   }
 
   bool _executesAtTopLevel(AstNode node) {
-    var ancestor = node.getAncestor((n) =>
-        n is FunctionBody ||
-        n is FieldDeclaration && n.staticKeyword == null ||
-        n is ConstructorDeclaration && n.constKeyword == null);
-    return ancestor == null;
+    for (var n = node.parent; n != null; n = n.parent) {
+      if (n is FunctionBody ||
+          n is FieldDeclaration && n.staticKeyword == null ||
+          n is ConstructorDeclaration && n.constKeyword == null) {
+        return false;
+      }
+    }
+    return true;
   }
 
   /// Whether the expression for [type] can be evaluated at this point in the JS
@@ -5364,7 +5391,7 @@
 
   @override
   JS.Expression visitRethrowExpression(RethrowExpression node) {
-    return runtimeCall('rethrow(#)', _visitExpression(_catchParameter));
+    return runtimeCall('rethrow(#)', _emitSimpleIdentifier(_rethrowParameter));
   }
 
   /// Visits a statement, and ensures the resulting AST handles block scope
@@ -5383,7 +5410,7 @@
   }
 
   @override
-  JS.If visitIfStatement(IfStatement node) {
+  JS.Statement visitIfStatement(IfStatement node) {
     return JS.If(_visitTest(node.condition), _visitScope(node.thenStatement),
         _visitScope(node.elseStatement));
   }
@@ -5514,82 +5541,84 @@
   JS.Catch _visitCatch(NodeList<CatchClause> clauses) {
     if (clauses == null || clauses.isEmpty) return null;
 
-    // TODO(jmesserly): need a better way to get a temporary variable.
-    // This could incorrectly shadow a user's name.
-    var savedCatch = _catchParameter;
+    var caughtError = _createTemporary('e', types.dynamicType);
+    var savedRethrow = _rethrowParameter;
+    _rethrowParameter = caughtError;
 
-    var isSingleCatch =
-        clauses.length == 1 && clauses.single.exceptionParameter != null;
-    if (isSingleCatch) {
-      // Special case for a single catch.
-      _catchParameter = clauses.single.exceptionParameter;
-    } else {
-      _catchParameter = _createTemporary('e', types.dynamicType);
-    }
+    // If we have more than one catch clause, always create a temporary so we
+    // don't shadow any names.
+    var exceptionParameter =
+        (clauses.length == 1 ? clauses[0].exceptionParameter : null) ??
+            _createTemporary('ex', types.dynamicType);
 
-    JS.Statement catchBody =
-        js.statement('throw #;', _emitSimpleIdentifier(_catchParameter));
+    var stackTraceParameter =
+        (clauses.length == 1 ? clauses[0].stackTraceParameter : null) ??
+            (clauses.any((c) => c.stackTraceParameter != null)
+                ? _createTemporary('st', types.dynamicType)
+                : null);
+
+    // Rethrow if the exception type didn't match.
+    JS.Statement catchBody = JS.Throw(_emitSimpleIdentifier(caughtError));
     for (var clause in clauses.reversed) {
-      catchBody = _catchClauseGuard(clause, catchBody);
+      catchBody = _catchClauseGuard(
+          clause, catchBody, exceptionParameter, stackTraceParameter);
     }
+    var catchStatements = [
+      js.statement('let # = #.getThrown(#)', [
+        _emitVariableDef(exceptionParameter),
+        runtimeModule,
+        _emitSimpleIdentifier(caughtError)
+      ]),
+    ];
+    if (stackTraceParameter != null) {
+      catchStatements.add(js.statement('let # = #.stackTrace(#)', [
+        _emitVariableDef(stackTraceParameter),
+        runtimeModule,
+        _emitSimpleIdentifier(caughtError)
+      ]));
+    }
+    catchStatements.add(catchBody);
 
-    var catchVarDecl = _emitSimpleIdentifier(_catchParameter) as JS.Identifier;
-    if (isSingleCatch) {
-      catchVarDecl..sourceInformation = _nodeStart(_catchParameter);
-    }
-    _catchParameter = savedCatch;
-    return JS.Catch(catchVarDecl, JS.Block([catchBody]));
+    var catchVarDecl = _emitSimpleIdentifier(caughtError) as JS.Identifier;
+    _rethrowParameter = savedRethrow;
+    return JS.Catch(catchVarDecl, JS.Block(catchStatements));
   }
 
-  JS.Statement _catchClauseGuard(CatchClause clause, JS.Statement otherwise) {
-    var then = visitCatchClause(clause);
-
-    // Discard following clauses, if any, as they are unreachable.
-    if (clause.exceptionType == null) return then;
-
-    // TODO(jmesserly): this is inconsistent with [visitIsExpression], which
-    // has special case for typeof.
-    var castType = _emitType(clause.exceptionType.type);
-
-    return JS.If(
-        js.call('#.is(#)', [castType, _emitSimpleIdentifier(_catchParameter)]),
-        then,
-        otherwise)
-      ..sourceInformation = _nodeStart(clause);
-  }
-
-  /// Visits the catch clause body. This skips the exception type guard, if any.
-  /// That is handled in [_visitCatch].
-  @override
-  JS.Statement visitCatchClause(CatchClause node) {
+  JS.Statement _catchClauseGuard(
+      CatchClause node,
+      JS.Statement otherwise,
+      SimpleIdentifier exceptionParameter,
+      SimpleIdentifier stackTraceParameter) {
     var body = <JS.Statement>[];
-
-    var savedCatch = _catchParameter;
     var vars = HashSet<String>();
+
+    void declareVariable(SimpleIdentifier variable, SimpleIdentifier value) {
+      if (variable == null) return;
+      vars.add(variable.name);
+      if (variable.name != value.name) {
+        body.add(js.statement('let # = #',
+            [visitSimpleIdentifier(variable), _emitSimpleIdentifier(value)]));
+      }
+    }
+
     if (node.catchKeyword != null) {
-      var name = node.exceptionParameter;
-      if (name == _catchParameter) {
-        vars.add(name.name);
-      } else if (name != null) {
-        vars.add(name.name);
-        body.add(js.statement('let # = #;',
-            [_emitVariableDef(name), _emitSimpleIdentifier(_catchParameter)]));
-        _catchParameter = name;
-      }
-      var stackVar = node.stackTraceParameter;
-      if (stackVar != null) {
-        vars.add(stackVar.name);
-        body.add(js.statement('let # = #.stackTrace(#);', [
-          _emitVariableDef(stackVar),
-          runtimeModule,
-          _emitSimpleIdentifier(name)
-        ]));
-      }
+      declareVariable(node.exceptionParameter, exceptionParameter);
+      declareVariable(node.stackTraceParameter, stackTraceParameter);
     }
 
     body.add(_visitStatement(node.body).toScopedBlock(vars));
-    _catchParameter = savedCatch;
-    return JS.Statement.from(body);
+    var then = JS.Statement.from(body);
+
+    // Discard following clauses, if any, as they are unreachable.
+    if (node.exceptionType == null ||
+        rules.isSubtypeOf(types.objectType, node.exceptionType.type)) {
+      return then;
+    }
+
+    var condition =
+        _emitIsExpression(exceptionParameter, node.exceptionType.type);
+    return JS.If(condition, then, otherwise)
+      ..sourceInformation = _nodeStart(node);
   }
 
   @override
@@ -5652,8 +5681,10 @@
       var nearest = (lexeme.startsWith("0x") || lexeme.startsWith("0X"))
           ? '0x${valueInJS.toRadixString(16)}'
           : '$valueInJS';
-      errors.add(AnalysisError(_currentCompilationUnit.source, node.offset,
-          node.length, invalidJSInteger, [lexeme, nearest]));
+      errors.add(
+          _currentCompilationUnit.lineInfo,
+          AnalysisError(_currentCompilationUnit.source, node.offset,
+              node.length, invalidJSInteger, [lexeme, nearest]));
     }
     return JS.LiteralNumber('$valueInJS');
   }
@@ -5696,6 +5727,23 @@
         () => _emitConstList(elementType, _visitExpressionList(node.elements)));
   }
 
+  @override
+  JS.Expression visitSetLiteral(SetLiteral node) {
+    var type = node.staticType as InterfaceType;
+    if (!node.isConst) {
+      var setType = _emitType(type);
+      if (node.elements.isEmpty) {
+        return js.call('#.new()', [setType]);
+      }
+      return js
+          .call('#.from([#])', [setType, _visitExpressionList(node.elements)]);
+    }
+    return _cacheConst(() => runtimeCall('constSet(#, [#])', [
+          _emitType((node.staticType as InterfaceType).typeArguments[0]),
+          _visitExpressionList(node.elements)
+        ]));
+  }
+
   JS.Expression _emitConstList(
       DartType elementType, List<JS.Expression> elements) {
     // dart.constList helper internally depends on _interceptors.JSArray.
@@ -6239,6 +6287,10 @@
   @override
   visitAssertInitializer(node) => _unreachable(node);
 
+  /// Unused, see [_catchClauseGuard].
+  @override
+  visitCatchClause(CatchClause node) => _unreachable(node);
+
   /// Not visited, but maybe they should be?
   /// See <https://github.com/dart-lang/sdk/issues/29347>
   @override
diff --git a/pkg/dev_compiler/lib/src/analyzer/command.dart b/pkg/dev_compiler/lib/src/analyzer/command.dart
index 97188e1..2d32c8d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/command.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/command.dart
@@ -128,11 +128,12 @@
     ArgResults argResults, AnalyzerOptions analyzerOptions,
     {CompilerAnalysisDriver compilerDriver}) {
   var compilerOpts = CompilerOptions.fromArguments(argResults);
+
   var summaryPaths = compilerOpts.summaryModules.keys.toList();
   if (compilerDriver == null ||
       !compilerDriver.isCompatibleWith(analyzerOptions, summaryPaths)) {
-    compilerDriver =
-        CompilerAnalysisDriver(analyzerOptions, summaryPaths: summaryPaths);
+    compilerDriver = CompilerAnalysisDriver(analyzerOptions,
+        summaryPaths: summaryPaths, experiments: compilerOpts.experiments);
   }
   var outPaths = argResults['out'] as List<String>;
   var moduleFormats = compilerOpts.moduleFormats;
diff --git a/pkg/dev_compiler/lib/src/analyzer/driver.dart b/pkg/dev_compiler/lib/src/analyzer/driver.dart
index bce3e8e..cec419b 100644
--- a/pkg/dev_compiler/lib/src/analyzer/driver.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/driver.dart
@@ -9,13 +9,15 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart' show ResourceProvider;
-import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' show AnalysisDriver;
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/library_analyzer.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/restricted_analysis_context.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/idl.dart';
@@ -72,7 +74,9 @@
   ExtensionTypeSet get extensionTypes => _extensionTypes;
 
   factory CompilerAnalysisDriver(AnalyzerOptions options,
-      {SummaryDataStore summaryData, List<String> summaryPaths = const []}) {
+      {SummaryDataStore summaryData,
+      List<String> summaryPaths = const [],
+      Map<String, bool> experiments = const {}}) {
     AnalysisEngine.instance.processRequiredPlugins();
 
     var resourceProvider = options.resourceProvider;
@@ -80,6 +84,10 @@
 
     var analysisOptions =
         contextBuilder.getAnalysisOptions(options.analysisRoot);
+
+    (analysisOptions as AnalysisOptionsImpl).enabledExperiments =
+        experiments.entries.where((e) => e.value).map((e) => e.key).toList();
+
     var dartSdk = contextBuilder.findSdk(null, analysisOptions);
 
     // Read the summaries.
@@ -216,14 +224,6 @@
       prepareUnlinkedUnit(sourcesToProcess.removeFirst());
     }
 
-    /// Gets the URIs to link.
-    ///
-    /// Unlike analyzer_cli, this only includes library URIs, not all
-    /// compilation units. This appears to be what [summary_link.link] wants as
-    /// input. If all units are passed in, the resulting summary has extra data
-    /// in the linkedLibraries list, which appears to be unnecessary.
-    var unlinkedUris = Set<String>.from(summaryData.uriToSummaryPath.keys)
-      ..addAll(libraryUris);
     var declaredVariables = DeclaredVariables.fromMap(
         Map.of(options.declaredVariables)..addAll(sdkLibraryVariables));
 
@@ -232,7 +232,7 @@
     /// TODO(jmesserly): can we pass in `getAst` to reuse existing ASTs we
     /// created when we did `file.parse()` in [prepareUnlinkedUnit]?
     var linkResult = summary_link.link(
-        unlinkedUris,
+        libraryUris.toSet(),
         (uri) => summaryData.linkedMap[uri],
         (uri) => summaryData.unlinkedMap[uri] ?? uriToUnit[uri],
         declaredVariables.get);
@@ -242,22 +242,26 @@
     var bundle = PackageBundle.fromBuffer(summaryBytes);
 
     /// Create an analysis context to contain the state for this build unit.
-    var context =
-        AnalysisEngine.instance.createAnalysisContext() as AnalysisContextImpl;
-    context.sourceFactory = sourceFactory;
+    var context = RestrictedAnalysisContext(
+        analysisOptions, declaredVariables, sourceFactory);
     var resultProvider = InputPackagesResultProvider(
         context,
         SummaryDataStore([])
           ..addStore(summaryData)
           ..addBundle(null, bundle));
-    context.resultProvider = resultProvider;
-    context.contentCache = _ContentCacheWrapper(fsState);
 
     var resynthesizer = resultProvider.resynthesizer;
     _extensionTypes ??= ExtensionTypeSet(context.typeProvider, resynthesizer);
 
-    return LinkedAnalysisDriver(analysisOptions, resynthesizer, sourceFactory,
-        libraryUris, declaredVariables, summaryBytes, fsState);
+    return LinkedAnalysisDriver(
+        analysisOptions,
+        resynthesizer,
+        sourceFactory,
+        libraryUris,
+        declaredVariables,
+        summaryBytes,
+        fsState,
+        _resourceProvider);
   }
 
   FileSystemState _createFileSystemState(SourceFactory sourceFactory) {
@@ -297,6 +301,8 @@
 
   final FileSystemState _fsState;
 
+  final ResourceProvider _resourceProvider;
+
   LinkedAnalysisDriver(
       this.analysisOptions,
       this.resynthesizer,
@@ -304,12 +310,10 @@
       this.libraryUris,
       this.declaredVariables,
       this.summaryBytes,
-      this._fsState);
+      this._fsState,
+      this._resourceProvider);
 
-  AnalysisContextImpl get context => resynthesizer.context;
-
-  /// Clean up any state used by this driver.
-  void dispose() => context.dispose();
+  TypeProvider get typeProvider => resynthesizer.typeProvider;
 
   /// True if [uri] refers to a Dart library (i.e. a Dart source file exists
   /// with this uri, and it is not a part file).
@@ -330,9 +334,11 @@
         declaredVariables,
         resynthesizer.sourceFactory,
         (uri) => _isLibraryUri('$uri'),
-        context,
+        resynthesizer.context,
         resynthesizer,
-        libraryFile);
+        InheritanceManager2(resynthesizer.typeSystem),
+        libraryFile,
+        _resourceProvider);
     // TODO(jmesserly): ideally we'd use the existing public `analyze()` method,
     // but it's async. We can't use `async` here because it would break our
     // developer tools extension (see web/web_command.dart). We should be able
@@ -349,51 +355,3 @@
     return resynthesizer.getLibraryElement(uri);
   }
 }
-
-/// [ContentCache] wrapper around [FileSystemState].
-class _ContentCacheWrapper implements ContentCache {
-  final FileSystemState fsState;
-
-  _ContentCacheWrapper(this.fsState);
-
-  @override
-  void accept(ContentCacheVisitor visitor) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  String getContents(Source source) {
-    return _getFileForSource(source).content;
-  }
-
-  @override
-  bool getExists(Source source) {
-    if (source.isInSystemLibrary) {
-      return true;
-    }
-    String uriStr = source.uri.toString();
-    if (fsState.externalSummaries != null &&
-        fsState.externalSummaries.hasUnlinkedUnit(uriStr)) {
-      return true;
-    }
-    return _getFileForSource(source).exists;
-  }
-
-  @override
-  int getModificationStamp(Source source) {
-    if (source.isInSystemLibrary) {
-      return 0;
-    }
-    return _getFileForSource(source).exists ? 0 : -1;
-  }
-
-  @override
-  String setContents(Source source, String contents) {
-    throw new UnimplementedError();
-  }
-
-  FileState _getFileForSource(Source source) {
-    String path = source.fullName;
-    return fsState.getFileForPath(path);
-  }
-}
diff --git a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
index 2d2480c..f9d836d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
@@ -4,11 +4,10 @@
 
 import 'dart:collection';
 
-import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart'
-    show DartType, InterfaceType, ParameterizedType, FunctionType;
+    show DartType, InterfaceType, FunctionType;
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/constant.dart'
diff --git a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
index 0e640ef..1528546 100644
--- a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
@@ -2,38 +2,87 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart'
-    show
-        AnalysisError,
-        ErrorSeverity,
-        ErrorType,
-        StrongModeCode,
-        StaticTypeWarningCode;
+import 'dart:collection';
+
+import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/error_processor.dart' show ErrorProcessor;
-import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
+import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisOptions;
 import 'package:path/path.dart' as path;
 
-/// Sorts and formats errors, returning the error messages.
-List<String> formatErrors(AnalysisContext context, List<AnalysisError> errors) {
-  sortErrors(context, errors);
-  var result = <String>[];
-  for (var e in errors) {
-    var m = formatError(context, e);
-    if (m != null) result.add(m);
-  }
-  return result;
-}
+class ErrorCollector {
+  final bool _replCompile;
+  final AnalysisOptions _options;
+  SplayTreeMap<AnalysisError, String> _errors;
 
-// TODO(jmesserly): this code was taken from analyzer_cli.
-// It really should be in some common place so we can share it.
-// TODO(jmesserly): this shouldn't depend on `context` but we need it to compute
-// `errorSeverity` due to some APIs that need fixing.
-void sortErrors(AnalysisContext context, List<AnalysisError> errors) {
-  errors.sort((AnalysisError error1, AnalysisError error2) {
+  ErrorCollector(this._options, this._replCompile) {
+    _errors = SplayTreeMap<AnalysisError, String>(_compareErrors);
+  }
+
+  bool get hasFatalErrors => _errors.keys.any(_isFatalError);
+
+  Iterable<String> get formattedErrors => _errors.values;
+
+  void add(LineInfo lineInfo, AnalysisError error) {
+    if (_shouldIgnoreError(error)) return;
+
+    // Skip hints, some like TODOs are not useful.
+    if (_errorSeverity(error).ordinal <= ErrorSeverity.INFO.ordinal) return;
+
+    _errors[error] = _formatError(lineInfo, error);
+  }
+
+  void addAll(LineInfo lineInfo, Iterable<AnalysisError> errors) {
+    for (var e in errors) add(lineInfo, e);
+  }
+
+  ErrorSeverity _errorSeverity(AnalysisError error) {
+    var errorCode = error.errorCode;
+    if (errorCode == StrongModeCode.TOP_LEVEL_FUNCTION_LITERAL_BLOCK ||
+        errorCode == StrongModeCode.TOP_LEVEL_INSTANCE_GETTER ||
+        errorCode == StrongModeCode.TOP_LEVEL_INSTANCE_METHOD) {
+      // These are normally hints, but they should be errors when running DDC, so
+      // that users won't be surprised by behavioral differences between DDC and
+      // dart2js.
+      return ErrorSeverity.ERROR;
+    }
+
+    // TODO(jmesserly): remove support for customizing error levels via
+    // analysis_options from DDC. (it won't work with --kernel).
+    return ErrorProcessor.getProcessor(_options, error)?.severity ??
+        errorCode.errorSeverity;
+  }
+
+  String _formatError(LineInfo lineInfo, AnalysisError error) {
+    var location = lineInfo.getLocation(error.offset);
+
+    // [warning] 'foo' is not a... (/Users/.../tmp/foo.dart, line 1, col 2)
+    return (StringBuffer()
+          ..write('[${_errorSeverity(error).displayName}] ')
+          ..write(error.message)
+          ..write(' (${path.prettyUri(error.source.uri)}')
+          ..write(
+              ', line ${location.lineNumber}, col ${location.columnNumber})'))
+        .toString();
+  }
+
+  bool _shouldIgnoreError(AnalysisError error) {
+    var uri = error.source.uri;
+    if (uri.scheme != 'dart') return false;
+    var sdkLib = uri.pathSegments[0];
+    if (sdkLib == 'html' || sdkLib == 'svg' || sdkLib == '_interceptors') {
+      var c = error.errorCode;
+      return c == StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 ||
+          c == StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2 ||
+          c == StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS;
+    }
+    return false;
+  }
+
+  int _compareErrors(AnalysisError error1, AnalysisError error2) {
     // severity
-    var severity1 = errorSeverity(context, error1);
-    var severity2 = errorSeverity(context, error2);
-    int compare = severity2.compareTo(severity1);
+    int compare = _errorSeverity(error2).compareTo(_errorSeverity(error1));
     if (compare != 0) return compare;
 
     // path
@@ -47,64 +96,22 @@
 
     // compare message, in worst case.
     return error1.message.compareTo(error2.message);
-  });
-}
-
-// TODO(jmesserly): this was from analyzer_cli, we should factor it differently.
-String formatError(AnalysisContext context, AnalysisError error) {
-  var severity = errorSeverity(context, error);
-  // Skip hints, some like TODOs are not useful.
-  if (severity.ordinal <= ErrorSeverity.INFO.ordinal) return null;
-
-  var lineInfo = context.computeLineInfo(error.source);
-  var location = lineInfo.getLocation(error.offset);
-
-  // [warning] 'foo' is not a... (/Users/.../tmp/foo.dart, line 1, col 2)
-  return (StringBuffer()
-        ..write('[${severity.displayName}] ')
-        ..write(error.message)
-        ..write(' (${path.prettyUri(error.source.uri)}')
-        ..write(', line ${location.lineNumber}, col ${location.columnNumber})'))
-      .toString();
-}
-
-ErrorSeverity errorSeverity(AnalysisContext context, AnalysisError error) {
-  var errorCode = error.errorCode;
-  if (errorCode == StrongModeCode.TOP_LEVEL_FUNCTION_LITERAL_BLOCK ||
-      errorCode == StrongModeCode.TOP_LEVEL_INSTANCE_GETTER ||
-      errorCode == StrongModeCode.TOP_LEVEL_INSTANCE_METHOD) {
-    // These are normally hints, but they should be errors when running DDC, so
-    // that users won't be surprised by behavioral differences between DDC and
-    // dart2js.
-    return ErrorSeverity.ERROR;
   }
 
-  // TODO(jmesserly): this Analyzer API totally bonkers, but it's what
-  // analyzer_cli and server use.
-  //
-  // Among the issues with ErrorProcessor.getProcessor:
-  // * it needs to be called per-error, so it's a performance trap.
-  // * it can return null
-  // * using AnalysisError directly is now suspect, it's a correctness trap
-  // * it requires an AnalysisContext
-  return ErrorProcessor.getProcessor(context.analysisOptions, error)
-          ?.severity ??
-      errorCode.errorSeverity;
-}
+  bool _isFatalError(AnalysisError e) {
+    if (_errorSeverity(e) != ErrorSeverity.ERROR) return false;
 
-bool isFatalError(AnalysisContext context, AnalysisError e, bool replCompile) {
-  if (errorSeverity(context, e) != ErrorSeverity.ERROR) return false;
-
-  // These errors are not fatal in the REPL compile mode as we
-  // allow access to private members across library boundaries
-  // and those accesses will show up as undefined members unless
-  // additional analyzer changes are made to support them.
-  // TODO(jacobr): consider checking that the identifier name
-  // referenced by the error is private.
-  return !replCompile ||
-      (e.errorCode != StaticTypeWarningCode.UNDEFINED_GETTER &&
-          e.errorCode != StaticTypeWarningCode.UNDEFINED_SETTER &&
-          e.errorCode != StaticTypeWarningCode.UNDEFINED_METHOD);
+    // These errors are not fatal in the REPL compile mode as we
+    // allow access to private members across library boundaries
+    // and those accesses will show up as undefined members unless
+    // additional analyzer changes are made to support them.
+    // TODO(jacobr): consider checking that the identifier name
+    // referenced by the error is private.
+    return !_replCompile ||
+        (e.errorCode != StaticTypeWarningCode.UNDEFINED_GETTER &&
+            e.errorCode != StaticTypeWarningCode.UNDEFINED_SETTER &&
+            e.errorCode != StaticTypeWarningCode.UNDEFINED_METHOD);
+  }
 }
 
 const invalidImportDartMirrors = StrongModeCode(
diff --git a/pkg/dev_compiler/lib/src/analyzer/js_typerep.dart b/pkg/dev_compiler/lib/src/analyzer/js_typerep.dart
index 67a3b9b..851d47b 100644
--- a/pkg/dev_compiler/lib/src/analyzer/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/js_typerep.dart
@@ -5,13 +5,12 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/element.dart' show ClassElement;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-import 'package:analyzer/src/generated/type_system.dart'
-    show StrongTypeSystemImpl;
+import 'package:analyzer/src/generated/type_system.dart' show Dart2TypeSystem;
 import '../compiler/js_typerep.dart';
 import 'driver.dart';
 
 class JSTypeRep extends SharedJSTypeRep<DartType> {
-  final StrongTypeSystemImpl rules;
+  final Dart2TypeSystem rules;
   final TypeProvider types;
 
   final ClassElement _jsBool;
@@ -19,7 +18,7 @@
   final ClassElement _jsString;
 
   JSTypeRep(this.rules, LinkedAnalysisDriver driver)
-      : types = driver.context.typeProvider,
+      : types = driver.typeProvider,
         _jsBool = driver.getClass('dart:_interceptors', 'JSBool'),
         _jsString = driver.getClass('dart:_interceptors', 'JSString'),
         _jsNumber = driver.getClass('dart:_interceptors', 'JSNumber');
diff --git a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
index 3b09257..179dbb1 100644
--- a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
@@ -5,10 +5,10 @@
 import 'dart:convert' show json;
 import 'dart:io' show File;
 
-import 'package:analyzer/analyzer.dart'
-    show AnalysisError, CompilationUnit, StaticWarningCode;
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart'
     show LibraryElement, UriReferencedElement;
+import 'package:analyzer/error/error.dart';
 
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:args/args.dart' show ArgParser, ArgResults;
@@ -56,7 +56,6 @@
     AnalyzerOptions analyzerOptions,
     CompilerOptions options) {
   var trees = <CompilationUnit>[];
-  var errors = <AnalysisError>[];
 
   var explicitSources = <Uri>[];
   var compilingSdk = false;
@@ -67,10 +66,19 @@
     }
     explicitSources.add(sourceUri);
   }
-
   var driver = compilerDriver.linkLibraries(explicitSources, analyzerOptions);
 
+  var errors = ErrorCollector(driver.analysisOptions, options.replCompile);
   for (var libraryUri in driver.libraryUris) {
+    var analysisResults = driver.analyzeLibrary(libraryUri);
+
+    CompilationUnit definingUnit;
+    for (var result in analysisResults.values) {
+      if (result.file.uriStr == libraryUri) definingUnit = result.unit;
+      errors.addAll(result.unit.lineInfo, result.errors);
+      trees.add(result.unit);
+    }
+
     var library = driver.getLibrary(libraryUri);
 
     // TODO(jmesserly): remove "dart:mirrors" from DDC's SDK, and then remove
@@ -78,29 +86,19 @@
     if (!compilingSdk && !options.emitMetadata) {
       var node = _getDartMirrorsImport(library);
       if (node != null) {
-        errors.add(AnalysisError(library.source, node.uriOffset, node.uriEnd,
-            invalidImportDartMirrors));
+        errors.add(
+            definingUnit.lineInfo,
+            AnalysisError(library.source, node.uriOffset, node.uriEnd,
+                invalidImportDartMirrors));
       }
     }
-
-    var analysisResults = driver.analyzeLibrary(libraryUri);
-    for (var result in analysisResults.values) {
-      errors.addAll(_filterJsErrors(libraryUri, result.errors));
-      trees.add(result.unit);
-    }
-  }
-
-  var context = driver.context;
-
-  bool anyFatalErrors() {
-    return errors.any((e) => isFatalError(context, e, options.replCompile));
   }
 
   JS.Program jsProgram;
-  if (options.unsafeForceCompile || !anyFatalErrors()) {
+  if (options.unsafeForceCompile || !errors.hasFatalErrors) {
     var codeGenerator = CodeGenerator(
         driver,
-        driver.context.typeProvider,
+        driver.typeProvider,
         compilerDriver.summaryData,
         options,
         compilerDriver.extensionTypes,
@@ -110,37 +108,19 @@
     } catch (e) {
       // If force compilation failed, suppress the exception and report the
       // static errors instead. Otherwise, rethrow an internal compiler error.
-      if (!anyFatalErrors()) rethrow;
+      if (!errors.hasFatalErrors) rethrow;
     }
 
-    if (!options.unsafeForceCompile && anyFatalErrors()) {
+    if (!options.unsafeForceCompile && errors.hasFatalErrors) {
       jsProgram = null;
     }
   }
 
   var jsModule = JSModuleFile(
-      formatErrors(context, errors), options, jsProgram, driver.summaryBytes);
-  driver.dispose();
+      errors.formattedErrors.toList(), options, jsProgram, driver.summaryBytes);
   return jsModule;
 }
 
-Iterable<AnalysisError> _filterJsErrors(
-    String libraryUriStr, Iterable<AnalysisError> errors) {
-  if (libraryUriStr == 'dart:html' ||
-      libraryUriStr == 'dart:svg' ||
-      libraryUriStr == 'dart:_interceptors') {
-    return errors.where((error) {
-      return error.errorCode !=
-              StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 &&
-          error.errorCode !=
-              StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2 &&
-          error.errorCode !=
-              StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS;
-    });
-  }
-  return errors;
-}
-
 UriReferencedElement _getDartMirrorsImport(LibraryElement library) {
   return library.imports.firstWhere(_isDartMirrorsImort, orElse: () => null) ??
       library.exports.firstWhere(_isDartMirrorsImort, orElse: () => null);
diff --git a/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart b/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
index 8e3f0ab..5c5ff36 100644
--- a/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/reify_coercions.dart
@@ -2,12 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/analyzer.dart' as analyzer;
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
+import 'package:analyzer/dart/ast/visitor.dart' show GeneralizingAstVisitor;
 import 'package:analyzer/dart/element/type.dart' show DartType;
 import 'package:analyzer/src/dart/ast/ast.dart' show FunctionBodyImpl;
-import 'package:analyzer/src/dart/ast/utilities.dart' show NodeReplacer;
+import 'package:analyzer/src/dart/ast/utilities.dart'
+    show AstCloner, NodeReplacer;
 import 'package:analyzer/src/dart/element/type.dart' show DynamicTypeImpl;
 import 'package:analyzer/src/generated/parser.dart' show ResolutionCopier;
 import 'package:analyzer/src/task/strong/ast_properties.dart' as ast_properties;
@@ -17,7 +18,7 @@
 
 // This class implements a pass which modifies (in place) the ast replacing
 // abstract coercion nodes with their dart implementations.
-class CoercionReifier extends analyzer.GeneralizingAstVisitor<void> {
+class CoercionReifier extends GeneralizingAstVisitor<void> {
   final cloner = _TreeCloner();
 
   CoercionReifier._();
@@ -123,7 +124,7 @@
   }
 }
 
-class _TreeCloner extends analyzer.AstCloner {
+class _TreeCloner extends AstCloner {
   void _cloneProperties(AstNode clone, AstNode node) {
     if (clone is Expression && node is Expression) {
       ast_properties.setImplicitCast(
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index ddb903c..39c4759 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -48,7 +48,7 @@
   'dart.library.web_sql': 'true',
 };
 
-/// Shared compiler options between `dartdevc` and `dartdevk`.
+/// Shared compiler options between `dartdevc` kernel and analyzer backends.
 class SharedCompilerOptions {
   /// Whether to emit the source mapping file.
   ///
@@ -81,6 +81,11 @@
 
   final List<ModuleFormat> moduleFormats;
 
+  /// Experimental language features that are enabled/disabled, see
+  /// [the spec](https://github.com/dart-lang/sdk/blob/master/docs/process/experimental-flags.md)
+  /// for more details.
+  final Map<String, bool> experiments;
+
   /// The name of the module.
   ///
   /// This used when to support file concatenation. The JS module will contain
@@ -97,6 +102,7 @@
       this.bazelMapping = const {},
       this.summaryModules = const {},
       this.moduleFormats = const [],
+      this.experiments = const {},
       this.moduleName});
 
   SharedCompilerOptions.fromArguments(ArgResults args,
@@ -106,6 +112,8 @@
             summarizeApi: args['summarize'] as bool,
             emitMetadata: args['emit-metadata'] as bool,
             enableAsserts: args['enable-asserts'] as bool,
+            experiments:
+                _parseExperiments(args['enable-experiment'] as List<String>),
             bazelMapping:
                 _parseBazelMappings(args['bazel-mapping'] as List<String>),
             summaryModules: _parseCustomSummaryModules(
@@ -121,6 +129,9 @@
           abbr: 's',
           help: 'summary file(s) of imported libraries, optionally\n'
               'with module import path: -s path.sum=js/import/path')
+      ..addMultiOption('enable-experiment',
+          help: 'used to enable/disable experimental language features',
+          hide: hide)
       ..addFlag('summarize',
           help: 'emit an API summary file', defaultsTo: true, hide: hide)
       ..addFlag('source-map',
@@ -204,6 +215,20 @@
   return pathToModule;
 }
 
+Map<String, bool> _parseExperiments(List<String> arguments) {
+  var result = <String, bool>{};
+  for (var argument in arguments) {
+    for (var feature in argument.split(',')) {
+      if (feature.startsWith('no-')) {
+        result[feature.substring(3)] = false;
+      } else {
+        result[feature] = true;
+      }
+    }
+  }
+  return result;
+}
+
 Map<String, String> _parseBazelMappings(List<String> argument) {
   var mappings = <String, String>{};
   for (var mapping in argument) {
@@ -466,7 +491,11 @@
       var arg = args[i];
       var isLastArg = i == len - 1;
       if (isLastArg && arg.startsWith('@')) {
-        newArgs.addAll(_readLines(arg.substring(1)));
+        var extra = _readLines(arg.substring(1)).toList();
+        if (extra.remove('--kernel') || extra.remove('-k')) {
+          isKernel = true;
+        }
+        newArgs.addAll(extra);
       } else if (arg == '--persistent_worker') {
         isWorker = true;
       } else if (isLastArg && arg == '--batch') {
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index f9b5c0c..a39888c 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -13,7 +13,7 @@
 ///
 /// This class should only implement functionality that depends purely on JS
 /// classes, rather than on Analyzer/Kernel types.
-abstract class SharedCompiler<Library> {
+abstract class SharedCompiler<Library, Class> {
   /// When inside a `[]=` operator, this will be a non-null value that should be
   /// returned by any `return;` statement.
   ///
@@ -141,21 +141,26 @@
     });
   }
 
-  /// Emits an expression to set the property [name] on the class [className],
+  /// Emits an expression to set the property [nameExpr] on the class [className],
   /// with [value].
   ///
   /// This will use `className.name = value` if possible, otherwise it will use
   /// `dart.defineValue(className, name, value)`. This is required when
   /// `Function.prototype` already defins a getters with the same name.
-  JS.Expression defineValueOnClass(
-      JS.Expression className, JS.Expression name, JS.Expression value) {
-    var args = [className, name, value];
-    if (name is JS.LiteralString &&
-        JS.isFunctionPrototypeGetter(name.valueWithoutQuotes)) {
-      return runtimeCall('defineValue(#, #, #)', args);
+  JS.Expression defineValueOnClass(Class c, JS.Expression className,
+      JS.Expression nameExpr, JS.Expression value) {
+    var args = [className, nameExpr, value];
+    if (nameExpr is JS.LiteralString) {
+      var name = nameExpr.valueWithoutQuotes;
+      if (JS.isFunctionPrototypeGetter(name) || superclassHasStatic(c, name)) {
+        return runtimeCall('defineValue(#, #, #)', args);
+      }
     }
     return js.call('#.# = #', args);
   }
+
+  /// Whether any superclass of [c] defines a static [name].
+  bool superclassHasStatic(Class c, String name);
 }
 
 /// Whether a variable with [name] is referenced in the [node].
diff --git a/pkg/dev_compiler/lib/src/js_ast/builder.dart b/pkg/dev_compiler/lib/src/js_ast/builder.dart
index 6520afc..d81f7e3 100644
--- a/pkg/dev_compiler/lib/src/js_ast/builder.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/builder.dart
@@ -663,7 +663,7 @@
 
   void getToken() {
     skippedNewline = false;
-    for (;;) {
+    while (true) {
       if (position >= src.length) break;
       int code = src.codeUnitAt(position);
       //  Skip '//' and '/*' style comments.
@@ -990,7 +990,7 @@
 
     expectCategory(LPAREN);
     if (!acceptCategory(RPAREN)) {
-      for (;;) {
+      while (true) {
         if (acceptCategory(ELLIPSIS)) {
           params.add(RestParameter(parseParameter()));
           expectCategory(RPAREN);
@@ -1039,7 +1039,7 @@
 
   Expression parseObjectInitializer() {
     List<Property> properties = <Property>[];
-    for (;;) {
+    while (true) {
       if (acceptCategory(RBRACE)) break;
       // Limited subset of ES6 object initializers.
       //
diff --git a/pkg/dev_compiler/lib/src/js_ast/printer.dart b/pkg/dev_compiler/lib/src/js_ast/printer.dart
index 56f032c..bdd29bd 100644
--- a/pkg/dev_compiler/lib/src/js_ast/printer.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/printer.dart
@@ -402,7 +402,7 @@
         newInForInit: true, newAtStatementBegin: false);
     out(" of");
     pendingSpace = true;
-    visitNestedExpression(loop.iterable, EXPRESSION,
+    visitNestedExpression(loop.iterable, ASSIGNMENT,
         newInForInit: false, newAtStatementBegin: false);
     out(")");
     blockBody(loop.body, needsSeparation: false, needsNewline: true);
diff --git a/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart b/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart
index b51b297..5c91caa 100644
--- a/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart
+++ b/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart
@@ -1,10 +1,9 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHO@override S file
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:core' hide MapEntry;
 import 'dart:collection';
-import 'package:analyzer/analyzer.dart' as a;
 import 'package:analyzer/dart/element/element.dart' as a;
 import 'package:analyzer/dart/element/type.dart' as a;
 import 'package:analyzer/file_system/physical_file_system.dart' as a;
@@ -74,7 +73,7 @@
   final a.StoreBasedSummaryResynthesizer _resynth;
   final a.SummaryDataStore _summaryData;
   final a.TypeProvider types;
-  final a.StrongTypeSystemImpl rules;
+  final a.Dart2TypeSystem rules;
 
   final _references = HashMap<a.Element, Reference>();
   final _typeParams = HashMap<a.TypeParameterElement, TypeParameter>();
@@ -84,7 +83,7 @@
       : _resynth = (context.resultProvider as a.InputPackagesResultProvider)
             .resynthesizer,
         types = context.typeProvider,
-        rules = context.typeSystem as a.StrongTypeSystemImpl;
+        rules = context.typeSystem as a.Dart2TypeSystem;
 
   /// Create an Analyzer summary to Kernel tree converter, using the provided
   /// [analyzerSdkSummary] and [summaryPaths].
@@ -478,7 +477,7 @@
     }
     t.typeParameters.addAll(typeParams.map(visitTypeParameterElement));
     setParents(t.typeParameters, t);
-    t.type = _visitDartType(type);
+    t.type = _visitDartType(type, originTypedef: t.thisType);
     _visitAnnotations(e.metadata, t.addAnnotation);
     return t;
   }
@@ -616,7 +615,8 @@
   /// populated with the node (creating it if needed). Many members on
   /// [InterfaceType] and [TypedefType] rely on having a node present, so this
   /// enables the use of those members if they're needed by the converter.
-  DartType _visitDartType(a.DartType type, {bool ensureNode = false}) {
+  DartType _visitDartType(a.DartType type,
+      {bool ensureNode = false, TypedefType originTypedef}) {
     if (type.isVoid) {
       return const VoidType();
     } else if (type.isDynamic) {
@@ -659,7 +659,8 @@
     return FunctionType(positional, visit(f.returnType),
         typeParameters: f.typeFormals.map(visitTypeParameterElement).toList(),
         namedParameters: named,
-        requiredParameterCount: params.where((p) => !p.isOptional).length);
+        requiredParameterCount: params.where((p) => !p.isOptional).length,
+        typedefType: originTypedef);
   }
 
   Supertype _typeToSupertype(a.InterfaceType t) {
@@ -867,7 +868,7 @@
     a.SummaryDataStore summaryData, String dartSdkPath) {
   var context = _createContextForSummaries(summaryData, dartSdkPath);
   return a.StoreBasedSummaryResynthesizer(
-      context, context.sourceFactory, /*strongMode*/ true, summaryData);
+      context, null, context.sourceFactory, /*strongMode*/ true, summaryData);
 }
 
 /// Creates a dummy Analyzer context so we can use summary resynthesizer.
@@ -882,8 +883,7 @@
     summaryData.addBundle(null, sdkSummaryBundle);
   }
 
-  // TODO(jmesserly): can we avoid creating an analysis context entirely?
-  // It doesn't look like StoreBasedSummaryResynthesizer uses much of it.
+  // TODO(jmesserly): use RestrictedAnalysisContext.
   var context = a.AnalysisEngine.instance.createAnalysisContext()
       as a.AnalysisContextImpl;
   context.sourceFactory = a.SourceFactory(
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 0d0dfa9..15dd91c 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -10,7 +10,7 @@
 import 'package:build_integration/file_system/multi_root.dart';
 import 'package:cli_util/cli_util.dart' show getSdkPath;
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
-import 'package:kernel/kernel.dart';
+import 'package:kernel/kernel.dart' hide MapEntry;
 import 'package:kernel/text/ast_to_text.dart' as kernel show Printer;
 import 'package:kernel/binary/ast_to_binary.dart' as kernel show BinaryPrinter;
 import 'package:path/path.dart' as path;
@@ -49,7 +49,7 @@
 $error
 $stackTrace
 ''');
-    rethrow;
+    return CompilerResult(70);
   }
 }
 
@@ -80,7 +80,9 @@
     ..addMultiOption('multi-root',
         help: 'The directories to search when encountering uris with the '
             'specified multi-root scheme.',
-        defaultsTo: [Uri.base.path]);
+        defaultsTo: [Uri.base.path])
+    ..addOption('dart-sdk',
+        help: '(unsupported with --kernel) path to the Dart SDK.', hide: true);
   SharedCompilerOptions.addArguments(argParser);
 
   var declaredVariables = parseAndRemoveDeclaredVariables(args);
@@ -125,8 +127,30 @@
   var summaryModules = Map.fromIterables(
       summaryPaths.map(sourcePathToUri), options.summaryModules.values);
   var useAnalyzer = summaryPaths.any((s) => !s.endsWith('.dill'));
-  var sdkSummaryPath = argResults['dart-sdk-summary'] as String ??
-      (useAnalyzer ? defaultAnalyzerSdkSummaryPath : defaultSdkSummaryPath);
+  var sdkSummaryPath = argResults['dart-sdk-summary'] as String;
+  String librarySpecPath;
+  if (sdkSummaryPath == null) {
+    sdkSummaryPath =
+        useAnalyzer ? defaultAnalyzerSdkSummaryPath : defaultSdkSummaryPath;
+    librarySpecPath = defaultLibrarySpecPath;
+  } else {
+    // TODO(jmesserly): the `isSupported` bit should be included in the SDK
+    // summary, but front_end requires a separate file, so we have to work
+    // around that, while avoiding yet another command line option.
+    //
+    // Right now we search two locations: one level above the SDK summary
+    // (this works for the build and SDK layouts) or next to the SDK summary
+    // (if the user is doing something custom).
+    //
+    // Another option: we could make an in-memory file with the relevant info.
+    librarySpecPath =
+        path.join(path.dirname(path.dirname(sdkSummaryPath)), "libraries.json");
+    if (!File(librarySpecPath).existsSync()) {
+      librarySpecPath =
+          path.join(path.dirname(sdkSummaryPath), "libraries.json");
+    }
+  }
+
   useAnalyzer = useAnalyzer || !sdkSummaryPath.endsWith('.dill');
 
   /// The .packages file path provided by the user.
@@ -153,14 +177,26 @@
     fe.printDiagnosticMessage(message, print);
   }
 
+  var experiments = <fe.ExperimentalFlag, bool>{};
+  for (var name in options.experiments.keys) {
+    var flag = fe.parseExperimentalFlag(name);
+    if (flag != null) {
+      experiments[flag] = options.experiments[name];
+    } else {
+      stderr.writeln("Unknown experiment flag '$name'.");
+    }
+  }
+
   var oldCompilerState = compilerState;
   compilerState = await fe.initializeCompiler(
       oldCompilerState,
       sourcePathToUri(sdkSummaryPath),
       sourcePathToUri(packageFile),
+      sourcePathToUri(librarySpecPath),
       summaryModules.keys.toList(),
       DevCompilerTarget(),
-      fileSystem: fileSystem);
+      fileSystem: fileSystem,
+      experiments: experiments);
 
   var output = argResults['out'] as String;
   // TODO(jmesserly): is there a cleaner way to do this?
@@ -217,8 +253,9 @@
   var target = compilerState.options.target as DevCompilerTarget;
   var compiler =
       ProgramCompiler(component, target.hierarchy, options, declaredVariables);
-  var jsModule =
-      compiler.emitModule(component, result.inputSummaries, summaryModules);
+
+  var jsModule = compiler.emitModule(component, result.inputSummaries,
+      compilerState.options.inputSummaries, summaryModules);
 
   // TODO(jmesserly): support for multiple output formats?
   //
@@ -331,6 +368,8 @@
 final defaultSdkSummaryPath =
     path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.dill');
 
+final defaultLibrarySpecPath = path.join(getSdkPath(), 'lib', 'libraries.json');
+
 final defaultAnalyzerSdkSummaryPath =
     path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.sum');
 
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 5f5d60d..035611f 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -32,7 +32,7 @@
 import 'type_table.dart';
 
 class ProgramCompiler extends Object
-    with SharedCompiler<Library>
+    with SharedCompiler<Library, Class>
     implements
         StatementVisitor<JS.Statement>,
         ExpressionVisitor<JS.Expression>,
@@ -58,7 +58,7 @@
   final _imports = Map<Library, JS.TemporaryId>();
 
   /// The variable for the current catch clause
-  VariableDeclaration _catchParameter;
+  VariableDeclaration _rethrowParameter;
 
   /// In an async* function, this represents the stream controller parameter.
   JS.TemporaryId _asyncStarController;
@@ -116,6 +116,8 @@
 
   final TypeEnvironment types;
 
+  final ClassHierarchy hierarchy;
+
   /// Information about virtual and overridden fields/getters/setters in the
   /// class we're currently compiling, or `null` if we aren't compiling a class.
   ClassPropertyModel _classProperties;
@@ -183,6 +185,7 @@
   final Class privateSymbolClass;
   final Class linkedHashMapImplClass;
   final Class identityHashMapImplClass;
+  final Class linkedHashSetClass;
   final Class linkedHashSetImplClass;
   final Class identityHashSetImplClass;
   final Class syncIterableClass;
@@ -198,12 +201,12 @@
   factory ProgramCompiler(Component component, ClassHierarchy hierarchy,
       SharedCompilerOptions options, Map<String, String> declaredVariables) {
     var coreTypes = CoreTypes(component);
-    var types = TypeSchemaEnvironment(coreTypes, hierarchy, true);
+    var types = TypeSchemaEnvironment(coreTypes, hierarchy);
     var constants = DevCompilerConstants(types, declaredVariables);
     var nativeTypes = NativeTypeSet(coreTypes, constants);
-    var jsTypeRep = JSTypeRep(types);
+    var jsTypeRep = JSTypeRep(types, hierarchy);
     return ProgramCompiler._(coreTypes, coreTypes.index, nativeTypes, constants,
-        types, jsTypeRep, NullableInference(jsTypeRep), options);
+        types, hierarchy, jsTypeRep, NullableInference(jsTypeRep), options);
   }
 
   ProgramCompiler._(
@@ -212,6 +215,7 @@
       this._extensionTypes,
       this._constants,
       this.types,
+      this.hierarchy,
       this._typeRep,
       this._nullableInference,
       this.options)
@@ -222,29 +226,27 @@
         linkedHashMapImplClass = sdk.getClass('dart:_js_helper', 'LinkedMap'),
         identityHashMapImplClass =
             sdk.getClass('dart:_js_helper', 'IdentityMap'),
+        linkedHashSetClass = sdk.getClass('dart:collection', 'LinkedHashSet'),
         linkedHashSetImplClass = sdk.getClass('dart:collection', '_HashSet'),
         identityHashSetImplClass =
             sdk.getClass('dart:collection', '_IdentityHashSet'),
         syncIterableClass = sdk.getClass('dart:_js_helper', 'SyncIterable'),
         asyncStarImplClass = sdk.getClass('dart:async', '_AsyncStarImpl');
 
-  ClassHierarchy get hierarchy => types.hierarchy;
-
   Uri get currentLibraryUri => _currentLibrary.importUri;
 
   bool get emitMetadata => options.emitMetadata;
 
   JS.Program emitModule(Component component, List<Component> summaries,
-      Map<Uri, String> summaryModules) {
+      List<Uri> summaryUris, Map<Uri, String> moduleImportForSummary) {
     if (moduleItems.isNotEmpty) {
       throw StateError('Can only call emitModule once.');
     }
     _component = component;
 
-    var moduleImports = summaryModules.values.toList();
     for (var i = 0; i < summaries.length; i++) {
       var summary = summaries[i];
-      var moduleImport = moduleImports[i];
+      var moduleImport = moduleImportForSummary[summaryUris[i]];
       for (var l in summary.libraries) {
         assert(!_importToSummary.containsKey(l));
         _importToSummary[l] = summary;
@@ -749,7 +751,7 @@
         .map((m) => hierarchy.getClassAsInstanceOf(c, m).asInterfaceType)
         .toList();
 
-    var hasUnnamedSuper = _hasUnnamedConstructor(superclass);
+    var hasUnnamedSuper = _hasUnnamedInheritedConstructor(superclass);
 
     void emitMixinConstructors(JS.Expression className, InterfaceType mixin) {
       JS.Statement mixinCtor;
@@ -774,7 +776,7 @@
           ctorBody.add(_emitSuperConstructorCall(className, name, jsParams));
         }
         body.add(_addConstructorToClass(
-            className, name, JS.Fun(jsParams, JS.Block(ctorBody))));
+            c, className, name, JS.Fun(jsParams, JS.Block(ctorBody))));
       }
     }
 
@@ -878,7 +880,7 @@
     }
 
     addConstructor(String name, JS.Expression jsCtor) {
-      body.add(_addConstructorToClass(className, name, jsCtor));
+      body.add(_addConstructorToClass(c, className, name, jsCtor));
     }
 
     var fields = c.fields;
@@ -1142,6 +1144,7 @@
       for (var f in fields) {
         assert(f.isConst);
         body.add(defineValueOnClass(
+                c,
                 classRef,
                 _emitStaticMemberName(f.name.name),
                 _visitInitializer(f.initializer, f.annotations))
@@ -1370,12 +1373,12 @@
       return (member as Field).type;
     }
     FunctionType result;
-    if (!f.positionalParameters.any(isCovariant) &&
-        !f.namedParameters.any(isCovariant)) {
+    if (!f.positionalParameters.any(isCovariantParameter) &&
+        !f.namedParameters.any(isCovariantParameter)) {
       result = f.functionType;
     } else {
       reifyParameter(VariableDeclaration p) =>
-          isCovariant(p) ? coreTypes.objectClass.thisType : p.type;
+          isCovariantParameter(p) ? coreTypes.objectClass.thisType : p.type;
       reifyNamedParameter(VariableDeclaration p) =>
           NamedType(p.name, reifyParameter(p));
 
@@ -1508,18 +1511,21 @@
         [className, _constructorName(name), args ?? []]);
   }
 
-  bool _hasUnnamedSuperConstructor(Class c) {
+  bool _hasUnnamedInheritedConstructor(Class c) {
     if (c == null) return false;
-    return _hasUnnamedConstructor(c.superclass) ||
-        _hasUnnamedConstructor(c.mixedInClass);
+    return _hasUnnamedConstructor(c) || _hasUnnamedSuperConstructor(c);
+  }
+
+  bool _hasUnnamedSuperConstructor(Class c) {
+    return _hasUnnamedConstructor(c.mixedInClass) ||
+        _hasUnnamedInheritedConstructor(c.superclass);
   }
 
   bool _hasUnnamedConstructor(Class c) {
     if (c == null || c == coreTypes.objectClass) return false;
     var ctor = unnamedConstructor(c);
     if (ctor != null && !ctor.isSynthetic) return true;
-    if (c.fields.any((f) => !f.isStatic)) return true;
-    return _hasUnnamedSuperConstructor(c);
+    return c.fields.any((f) => !f.isStatic);
   }
 
   /// Initialize fields. They follow the sequence:
@@ -1596,16 +1602,36 @@
   /// then we need to emit a special hidden default constructor for use by
   /// mixins.
   bool _usesMixinNew(Class mixin) {
-    return mixin.superclass?.superclass == null &&
-        mixin.constructors.every((c) => c.isExternal);
+    // TODO(jmesserly): mixin declarations don't get implicit constructor nodes,
+    // even if they have fields, so we need to ensure they're getting generated.
+    return mixin.isMixinDeclaration && _hasUnnamedConstructor(mixin) ||
+        mixin.superclass?.superclass == null &&
+            mixin.constructors.every((c) => c.isExternal);
   }
 
   JS.Statement _addConstructorToClass(
-      JS.Expression className, String name, JS.Expression jsCtor) {
-    jsCtor = defineValueOnClass(className, _constructorName(name), jsCtor);
+      Class c, JS.Expression className, String name, JS.Expression jsCtor) {
+    jsCtor = defineValueOnClass(c, className, _constructorName(name), jsCtor);
     return js.statement('#.prototype = #.prototype;', [jsCtor, className]);
   }
 
+  @override
+  bool superclassHasStatic(Class c, String memberName) {
+    // Note: because we're only considering statics, we can ignore mixins.
+    // We're only trying to find conflicts due to JS inheriting statics.
+    var name = Name(memberName, c.enclosingLibrary);
+    while (true) {
+      c = c.superclass;
+      if (c == null) return false;
+      for (var m in c.members) {
+        if (m.name == name &&
+            (m is Procedure && m.isStatic || m is Field && m.isStatic)) {
+          return true;
+        }
+      }
+    }
+  }
+
   List<JS.Method> _emitClassMethods(Class c) {
     var virtualFields = _classProperties.virtualFields;
 
@@ -1772,9 +1798,10 @@
 
     var name = _declareMemberName(member);
     if (member.isSetter) {
-      if (superMember is Field && superMember.isGenericCovariantImpl ||
+      if (superMember is Field && isCovariantField(superMember) ||
           superMember is Procedure &&
-              isCovariant(superMember.function.positionalParameters[0])) {
+              isCovariantParameter(
+                  superMember.function.positionalParameters[0])) {
         return const [];
       }
       var setterType = substituteType(superMember.setterType);
@@ -1807,8 +1834,8 @@
       var jsParam = JS.Identifier(param.name);
       jsParams.add(jsParam);
 
-      if (isCovariant(param) &&
-          !isCovariant(superMember.function.positionalParameters[i])) {
+      if (isCovariantParameter(param) &&
+          !isCovariantParameter(superMember.function.positionalParameters[i])) {
         var check = _emitCast(jsParam, superMethodType.positionalParameters[i]);
         if (i >= function.requiredParameterCount) {
           body.add(js.statement('if (# !== void 0) #;', [jsParam, check]));
@@ -1819,8 +1846,8 @@
     }
     var namedParameters = function.namedParameters;
     for (var param in namedParameters) {
-      if (isCovariant(param) &&
-          !isCovariant(superMember.function.namedParameters
+      if (isCovariantParameter(param) &&
+          !isCovariantParameter(superMember.function.namedParameters
               .firstWhere((n) => n.name == param.name))) {
         var name = _propertyName(param.name);
         var paramType = superMethodType.namedParameters
@@ -1874,7 +1901,7 @@
     var args = field.isFinal ? [JS.Super(), name] : [JS.This(), virtualField];
 
     JS.Expression value = JS.Identifier('value');
-    if (!field.isFinal && field.isGenericCovariantImpl) {
+    if (!field.isFinal && isCovariantField(field)) {
       value = _emitCast(value, field.type);
     }
     args.add(value);
@@ -2884,7 +2911,7 @@
     _emitCovarianceBoundsCheck(f.typeParameters, body);
 
     initParameter(VariableDeclaration p, JS.Identifier jsParam) {
-      if (isCovariant(p)) {
+      if (isCovariantParameter(p)) {
         var castExpr = _emitCast(jsParam, p.type);
         if (!identical(castExpr, jsParam)) body.add(castExpr.toStatement());
       }
@@ -3088,10 +3115,16 @@
     if (offset == -1) return null;
     var fileUri = _currentUri;
     if (fileUri == null) return null;
-    var loc = _component.getLocation(fileUri, offset);
-    if (loc == null) return null;
-    return SourceLocation(offset,
-        sourceUrl: fileUri, line: loc.line - 1, column: loc.column - 1);
+    try {
+      var loc = _component.getLocation(fileUri, offset);
+      if (loc == null) return null;
+      return SourceLocation(offset,
+          sourceUrl: fileUri, line: loc.line - 1, column: loc.column - 1);
+    } on StateError catch (_) {
+      // TODO(jmesserly): figure out why this is throwing. Perhaps the file URI
+      // and offset are mismatched and don't correspond to the same source?
+      return null;
+    }
   }
 
   /// Adds a hover comment for Dart node using JS expression [expr], where
@@ -3478,65 +3511,76 @@
   JS.Catch _visitCatch(List<Catch> clauses) {
     if (clauses.isEmpty) return null;
 
-    var savedCatch = _catchParameter;
+    var caughtError = VariableDeclaration('#e');
+    var savedRethrow = _rethrowParameter;
+    _rethrowParameter = caughtError;
 
-    if (clauses.length == 1 && clauses.single.exception != null) {
-      // Special case for a single catch.
-      _catchParameter = clauses.single.exception;
-    } else {
-      _catchParameter = VariableDeclaration('#e');
-    }
+    // If we have more than one catch clause, always create a temporary so we
+    // don't shadow any names.
+    var exceptionParameter =
+        (clauses.length == 1 ? clauses[0].exception : null) ??
+            VariableDeclaration('#ex');
 
-    JS.Statement catchBody =
-        js.statement('throw #;', _emitVariableRef(_catchParameter));
+    var stackTraceParameter =
+        (clauses.length == 1 ? clauses[0].stackTrace : null) ??
+            (clauses.any((c) => c.stackTrace != null)
+                ? VariableDeclaration('#st')
+                : null);
+
+    JS.Statement catchBody = JS.Throw(_emitVariableRef(caughtError));
     for (var clause in clauses.reversed) {
-      catchBody = _catchClauseGuard(clause, catchBody);
+      catchBody = _catchClauseGuard(
+          clause, catchBody, exceptionParameter, stackTraceParameter);
     }
-
-    var catchVarDecl = _emitVariableRef(_catchParameter);
-    _catchParameter = savedCatch;
-    return JS.Catch(catchVarDecl, catchBody.toBlock());
+    var catchStatements = [
+      js.statement('let # = #.getThrown(#)', [
+        _emitVariableDef(exceptionParameter),
+        runtimeModule,
+        _emitVariableRef(caughtError)
+      ]),
+    ];
+    if (stackTraceParameter != null) {
+      catchStatements.add(js.statement('let # = #.stackTrace(#)', [
+        _emitVariableDef(stackTraceParameter),
+        runtimeModule,
+        _emitVariableRef(caughtError)
+      ]));
+    }
+    catchStatements.add(catchBody);
+    _rethrowParameter = savedRethrow;
+    return JS.Catch(_emitVariableDef(caughtError), JS.Block(catchStatements));
   }
 
-  JS.Statement _catchClauseGuard(Catch node, JS.Statement otherwise) {
+  JS.Statement _catchClauseGuard(
+      Catch node,
+      JS.Statement otherwise,
+      VariableDeclaration exceptionParameter,
+      VariableDeclaration stackTraceParameter) {
     var body = <JS.Statement>[];
-
-    var savedCatch = _catchParameter;
     var vars = HashSet<String>();
-    if (node.exception != null) {
-      var name = node.exception;
-      if (name == _catchParameter) {
-        vars.add(name.name);
-      } else if (name != null) {
-        vars.add(name.name);
-        body.add(js.statement('let # = #;',
-            [_emitVariableDef(name), _emitVariableRef(_catchParameter)]));
-        _catchParameter = name;
-      }
-      var stackTrace = node.stackTrace;
-      if (stackTrace != null) {
-        vars.add(stackTrace.name);
-        body.add(js.statement('let # = #.stackTrace(#);', [
-          _emitVariableDef(stackTrace),
-          runtimeModule,
-          _emitVariableRef(name)
-        ]));
+
+    void declareVariable(
+        VariableDeclaration variable, VariableDeclaration value) {
+      if (variable == null) return;
+      vars.add(variable.name);
+      if (variable.name != value.name) {
+        body.add(js.statement('let # = #',
+            [_emitVariableDef(variable), _emitVariableRef(value)]));
       }
     }
 
+    declareVariable(node.exception, exceptionParameter);
+    declareVariable(node.stackTrace, stackTraceParameter);
+
     body.add(_visitStatement(node.body).toScopedBlock(vars));
-    _catchParameter = savedCatch;
     var then = JS.Block(body);
 
+    // Discard following clauses, if any, as they are unreachable.
     if (types.isTop(node.guard)) return then;
 
-    // TODO(jmesserly): this is inconsistent with [visitIsExpression], which
-    // has special case for typeof.
-    return JS.If(
-        js.call('#.is(#)',
-            [_emitType(node.guard), _emitVariableRef(_catchParameter)]),
-        then,
-        otherwise)
+    var condition =
+        _emitIsExpression(VariableGet(exceptionParameter), node.guard);
+    return JS.If(condition, then, otherwise)
       ..sourceInformation = _nodeStart(node);
   }
 
@@ -4706,20 +4750,19 @@
 
   @override
   visitIsExpression(IsExpression node) {
+    return _emitIsExpression(node.operand, node.type);
+  }
+
+  JS.Expression _emitIsExpression(Expression operand, DartType type) {
     // Generate `is` as `dart.is` or `typeof` depending on the RHS type.
-    JS.Expression result;
-    var type = node.type;
-    var lhs = _visitExpression(node.operand);
+    var lhs = _visitExpression(operand);
     var typeofName = _typeRep.typeFor(type).primitiveTypeOf;
     // Inline primitives other than int (which requires a Math.floor check).
-    if (typeofName != null && type != coreTypes.intClass.rawType) {
-      result = js.call('typeof # == #', [lhs, js.string(typeofName, "'")]);
+    if (typeofName != null && type != types.intType) {
+      return js.call('typeof # == #', [lhs, js.string(typeofName, "'")]);
     } else {
-      // Always go through a runtime helper, because implicit interfaces.
-      var castType = _emitType(type);
-      result = js.call('#.is(#)', [castType, lhs]);
+      return js.call('#.is(#)', [_emitType(type), lhs]);
     }
-    return result;
   }
 
   @override
@@ -4834,7 +4877,7 @@
 
   @override
   visitRethrow(Rethrow node) {
-    return runtimeCall('rethrow(#)', _emitVariableRef(_catchParameter));
+    return runtimeCall('rethrow(#)', _emitVariableRef(_rethrowParameter));
   }
 
   @override
@@ -4851,6 +4894,23 @@
         _emitConstList(elementType, _visitExpressionList(node.expressions)));
   }
 
+  @override
+  visitSetLiteral(SetLiteral node) {
+    if (!node.isConst) {
+      var setType = visitInterfaceType(
+          InterfaceType(linkedHashSetClass, [node.typeArgument]));
+      if (node.expressions.isEmpty) {
+        return js.call('#.new()', [setType]);
+      }
+      return js.call(
+          '#.from([#])', [setType, _visitExpressionList(node.expressions)]);
+    }
+    return _cacheConst(() => runtimeCall('constSet(#, [#])', [
+          _emitType(node.typeArgument),
+          _visitExpressionList(node.expressions)
+        ]));
+  }
+
   JS.Expression _emitConstList(
       DartType elementType, List<JS.Expression> elements) {
     // dart.constList helper internally depends on _interceptors.JSArray.
@@ -5059,6 +5119,14 @@
   visitTypeLiteralConstant(node) => defaultConstant(node);
   @override
   visitPartialInstantiationConstant(node) => defaultConstant(node);
+  @override
+  visitEnvironmentBoolConstant(node) => defaultConstant(node);
+  @override
+  visitEnvironmentIntConstant(node) => defaultConstant(node);
+  @override
+  visitEnvironmentStringConstant(node) => defaultConstant(node);
+  @override
+  visitUnevaluatedConstant(node) => defaultConstant(node);
 }
 
 bool isSdkInternalRuntime(Library l) =>
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 4fc8891..b05b840 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -44,6 +44,10 @@
       // It can also be caused by methods in the evaluator that don't understand
       // unavailable constants.
       return null;
+    } on NoSuchMethodError {
+      // TODO(jmesserly): this is probably the same issue as above, but verify
+      // that it's fixed once Kernel does constant evaluation.
+      return null;
     }
   }
 
@@ -180,11 +184,10 @@
   final Constant unavailableConstant;
 
   _ConstantEvaluator(TypeEnvironment types, this.declaredVariables,
-      {bool enableAsserts})
+      {bool enableAsserts: false})
       : unavailableConstant = InstanceConstant(null, [], {}),
         super(_ConstantsBackend(types.coreTypes), types, types.coreTypes,
-            enableAsserts,
-            errorReporter: const _ErrorReporter()) {
+            enableAsserts, const _ErrorReporter()) {
     env = EvaluationEnvironment();
   }
 
@@ -307,7 +310,7 @@
   lowerListConstant(constant) => constant;
 }
 
-class _ErrorReporter extends ErrorReporterBase {
+class _ErrorReporter extends SimpleErrorReporter {
   const _ErrorReporter();
 
   @override
diff --git a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
index b43b1b0..7c4cba7 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:kernel/type_environment.dart';
@@ -9,13 +10,14 @@
 
 class JSTypeRep extends SharedJSTypeRep<DartType> {
   final TypeEnvironment types;
+  final ClassHierarchy hierarchy;
   final CoreTypes coreTypes;
 
   final Class _jsBool;
   final Class _jsNumber;
   final Class _jsString;
 
-  JSTypeRep(this.types)
+  JSTypeRep(this.types, this.hierarchy)
       : coreTypes = types.coreTypes,
         _jsBool =
             types.coreTypes.index.getClass('dart:_interceptors', 'JSBool'),
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index 945e41a..498bf51 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -170,10 +170,17 @@
     e.name.name == 'JS' &&
     e.enclosingLibrary.importUri.toString() == 'dart:_foreign_helper';
 
-// Check whether we have any covariant parameters.
-// Usually we don't, so we can use the same type.
-bool isCovariant(VariableDeclaration p) =>
-    p.isCovariant || p.isGenericCovariantImpl;
+/// Whether the parameter [p] is covariant (either explicitly `covariant` or
+/// implicitly due to generics) and needs a check for soundness.
+bool isCovariantParameter(VariableDeclaration p) {
+  return p.isCovariant || p.isGenericCovariantImpl;
+}
+
+/// Whether the field [p] is covariant (either explicitly `covariant` or
+/// implicitly due to generics) and needs a check for soundness.
+bool isCovariantField(Field f) {
+  return f.isCovariant || f.isGenericCovariantImpl;
+}
 
 /// Returns true iff this factory constructor just throws [UnsupportedError]/
 ///
diff --git a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
index 8e212cf..76b6570 100644
--- a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
+++ b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
@@ -146,7 +146,8 @@
       // This allows us to find the `@notNull` annotation if it exists.
       var implClass = jsTypeRep.getImplementationClass(targetClass.rawType);
       if (implClass != null) {
-        var member = types.hierarchy.getDispatchTarget(implClass, target.name);
+        var member =
+            jsTypeRep.hierarchy.getDispatchTarget(implClass, target.name);
         if (member != null) target = member;
       }
     }
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index f215ae7..8652983 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:collection';
 import 'dart:core' hide MapEntry;
 import 'package:kernel/kernel.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/target/targets.dart';
+import 'kernel_helpers.dart';
 
 /// A kernel [Target] to configure the Dart Front End for dartdevc.
 class DevCompilerTarget extends Target {
@@ -72,6 +74,9 @@
       CoreTypes coreTypes, ClassHierarchy hierarchy, List<Library> libraries,
       {void logger(String msg)}) {
     this.hierarchy = hierarchy;
+    for (var library in libraries) {
+      _CovarianceTransformer(library).transform();
+    }
   }
 
   @override
@@ -138,3 +143,184 @@
     return InvalidExpression(null);
   }
 }
+
+/// Analyzes a component to determine if any covariance checks in private
+/// members can be eliminated, and adjusts the flags to remove those checks.
+///
+/// See [_CovarianceTransformer.transform].
+class _CovarianceTransformer extends RecursiveVisitor<void> {
+  /// The set of private instance members in [_library] that (potentially) need
+  /// covariance checks.
+  ///
+  /// Members need checks if they are accessed through a receiver whose type is
+  /// not exactly known (i.e. the actual receiver could be a subtype of its
+  /// static type). If the receiver expression is `this`, `super` or non-factory
+  /// instance creation, it is known to have an exact type.
+  final _checkedMembers = HashSet<Member>();
+
+  /// List of private instance procedures.
+  ///
+  /// [transform] uses this list to eliminate covariance flags for members that
+  /// aren't in [_checkedMembers].
+  final _privateProcedures = List<Procedure>();
+
+  /// List of private instance fields.
+  ///
+  /// [transform] uses this list to eliminate covariance flags for members that
+  /// aren't in [_checkedMembers].
+  final _privateFields = List<Field>();
+
+  final Library _library;
+
+  _CovarianceTransformer(this._library);
+
+  /// Transforms [_library], eliminating unncessary checks for private members.
+  ///
+  /// Kernel will mark covariance checks on members, for example:
+  /// - a field with [Field.isGenericCovariantImpl] or [Field.isCovariant].
+  /// - a method/setter with parameter(s) or type parameter(s) that have
+  ///   `isGenericCovariantImpl` or `isCovariant` set.
+  ///
+  /// If the check can be safely eliminanted, those properties will be set to
+  /// false so the JS compiler does not emit checks.
+  ///
+  /// Public members always need covariance checks (we cannot see all potential
+  /// call sites), but in some cases we can eliminate these checks for private
+  /// members.
+  ///
+  /// Private members only need covariance checks if they are accessed through a
+  /// receiver whose type is not exactly known (i.e. the actual receiver could
+  /// be a subtype of its static type). If the receiver expression is `this`,
+  /// `super` or non-factory instance creation, it is known to have an exact
+  /// type, so no callee check is necessary to ensure soundness (normal
+  /// subtyping checks at the call site are sufficient).
+  ///
+  /// However to eliminate a check, we must know that all call sites are safe.
+  /// So the first pass is to collect any potentially-unsafe call sites, this
+  /// is done by [_checkTarget] and [_checkTearoff].
+  ///
+  /// Method tearoffs must also be marked potentially-unsafe, regardless of
+  /// whether the receiver type is known, because they could escape. Also their
+  /// runtime type must store `Object` in for covariant parameters (this
+  /// affects `is`, casts, and the `.runtimeType` property).
+  ///
+  /// Note 1: dynamic calls do not need to be considered here, because they
+  /// will be checked based on runtime type information.
+  ///
+  /// Node 2: public members in private classes cannot be treated as private
+  /// unless we know that the member is not exposed via some public interface
+  /// (implemented by their class or a subclass) that needs a covariance check.
+  /// That is somewhat complex to analyze, so for now we ignore it.
+  void transform() {
+    _library.visitChildren(this);
+
+    // Update the tree based on the methods that need checks.
+    for (var field in _privateFields) {
+      if (!_checkedMembers.contains(field)) {
+        field.isCovariant = false;
+        field.isGenericCovariantImpl = false;
+      }
+    }
+    void clearCovariant(VariableDeclaration parameter) {
+      parameter.isCovariant = false;
+      parameter.isGenericCovariantImpl = false;
+    }
+
+    for (var member in _privateProcedures) {
+      if (!_checkedMembers.contains(member)) {
+        var function = member.function;
+        function.positionalParameters.forEach(clearCovariant);
+        function.namedParameters.forEach(clearCovariant);
+        for (var t in function.typeParameters) {
+          t.isGenericCovariantImpl = false;
+        }
+      }
+    }
+  }
+
+  /// Checks if [target] is a private member called through a [receiver] that
+  /// will potentially need a covariance check.
+  ///
+  /// If the member needs a check it will be stored in [_checkedMembers].
+  ///
+  /// See [transform] for more information.
+  void _checkTarget(Expression receiver, Member target) {
+    if (target != null &&
+        target.name.isPrivate &&
+        target.isInstanceMember &&
+        receiver is! ThisExpression &&
+        receiver is! ConstructorInvocation) {
+      assert(target.enclosingLibrary == _library,
+          'call to private member must be in same library');
+      _checkedMembers.add(target);
+    }
+  }
+
+  /// Checks if [target] is a tearoff of a private member.
+  ///
+  /// In this case we will need a covariance check, because the method could
+  /// escape, and it also has a different runtime type.
+  ///
+  /// See [transform] for more information.
+  void _checkTearoff(Member target) {
+    if (target != null &&
+        target.name.isPrivate &&
+        target.isInstanceMember &&
+        target is Procedure &&
+        !target.isAccessor) {
+      assert(target.enclosingLibrary == _library,
+          'tearoff of private member must be in same library');
+      _checkedMembers.add(target);
+    }
+  }
+
+  @override
+  void visitProcedure(Procedure node) {
+    if (node.name.isPrivate && node.isInstanceMember && node.function != null) {
+      _privateProcedures.add(node);
+    }
+    super.visitProcedure(node);
+  }
+
+  @override
+  void visitField(Field node) {
+    if (node.name.isPrivate && isCovariantField(node)) _privateFields.add(node);
+    super.visitField(node);
+  }
+
+  @override
+  void visitPropertyGet(PropertyGet node) {
+    _checkTearoff(node.interfaceTarget);
+    super.visitPropertyGet(node);
+  }
+
+  @override
+  void visitDirectPropertyGet(DirectPropertyGet node) {
+    _checkTearoff(node.target);
+    super.visitDirectPropertyGet(node);
+  }
+
+  @override
+  void visitPropertySet(PropertySet node) {
+    _checkTarget(node.receiver, node.interfaceTarget);
+    super.visitPropertySet(node);
+  }
+
+  @override
+  void visitDirectPropertySet(DirectPropertySet node) {
+    _checkTarget(node.receiver, node.target);
+    super.visitDirectPropertySet(node);
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    _checkTarget(node.receiver, node.interfaceTarget);
+    super.visitMethodInvocation(node);
+  }
+
+  @override
+  void visitDirectMethodInvocation(DirectMethodInvocation node) {
+    _checkTarget(node.receiver, node.target);
+    super.visitDirectMethodInvocation(node);
+  }
+}
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index f096c90..e7cb728 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -487,8 +487,10 @@
 
   @override
   visitComponent(Component node) {
+    var hierarchy = ClassHierarchy(node);
     inference ??= NullableInference(JSTypeRep(
-      fe.TypeSchemaEnvironment(CoreTypes(node), ClassHierarchy(node), true),
+      fe.TypeSchemaEnvironment(CoreTypes(node), hierarchy),
+      hierarchy,
     ));
 
     if (useAnnotations) {
@@ -572,9 +574,11 @@
 
   var mainUri = Uri.file('/memory/test.dart');
   _fileSystem.entityForUri(mainUri).writeAsStringSync(code);
+  var oldCompilerState = _compilerState;
   _compilerState = await fe.initializeCompiler(
-      _compilerState, sdkUri, packagesUri, [], DevCompilerTarget(),
-      fileSystem: _fileSystem);
+      oldCompilerState, sdkUri, packagesUri, null, [], DevCompilerTarget(),
+      fileSystem: _fileSystem, experiments: const {});
+  if (!identical(oldCompilerState, _compilerState)) inference = null;
   fe.DdcResult result =
       await fe.compile(_compilerState, [mainUri], diagnosticMessageHandler);
   expect(succeeded, true);
diff --git a/pkg/dev_compiler/test/options/options_test.dart b/pkg/dev_compiler/test/options/options_test.dart
index 994bc65..3f5b3b1 100644
--- a/pkg/dev_compiler/test/options/options_test.dart
+++ b/pkg/dev_compiler/test/options/options_test.dart
@@ -3,8 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
-import 'package:analyzer/analyzer.dart';
+
 import 'package:analyzer/src/command_line/arguments.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index 7dbf654..3d187dd 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -139,7 +139,10 @@
     try {
       dartMainRunner(main, []);
     } catch(e) {
-      console.error(e.toString(), dart.stackTrace(e).toString());
+      console.error(e);
+      // d8 does not seem to print the `.stack` property like
+      // node.js and browsers do.
+      console.error(e.stack);
     }
     """;
 }
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index bb23866..b275906 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -54,8 +54,6 @@
 
     File ddcSdkSummary = findInOutDir("gen/utils/dartdevc/kernel/ddc_sdk.dill");
 
-    var ddc = getDdcDir().uri.resolve("bin/dartdevk.dart");
-
     List<String> args = <String>[
       "--packages=${sdkRoot.uri.resolve(".packages").toFilePath()}",
       "--modules=es6",
@@ -77,8 +75,10 @@
     }
 
     if (!succeeded) {
+      var ddc = getDdcDir().uri.resolve("bin/dartdevc.dart");
+
       throw "Error from ddc when executing with something like "
-          "$dartExecutable ${ddc.toFilePath()} "
+          "$dartExecutable ${ddc.toFilePath()} --kernel "
           "${args.reduce((value, element) => '$value "$element"')}";
     }
 
diff --git a/pkg/dev_compiler/tool/build_pkgs.dart b/pkg/dev_compiler/tool/build_pkgs.dart
index 9b003a6..5e8fc50 100755
--- a/pkg/dev_compiler/tool/build_pkgs.dart
+++ b/pkg/dev_compiler/tool/build_pkgs.dart
@@ -71,9 +71,6 @@
   await compileModule('expect', libs: ['minitest']);
   await compileModule('js', libs: ['js_util']);
   await compileModule('meta');
-  if (isTravis) {
-    await compileModule('microlytics', libs: ['html_channels']);
-  }
 
   // Under third_party/pkg.
   await compileModule('collection');
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 52fe107..98f39aa 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -112,7 +112,8 @@
   }
   ProcessResult result;
   if (kernel) {
-    result = runDdc('dartdevk', [
+    result = runDdc('dartdevc', [
+      '--kernel',
       '--modules=$mod',
       '--dart-sdk-summary=$ddcSdk',
       '-o',
@@ -194,7 +195,7 @@
       if (!source_maps) {
         console.log('For Dart source maps: npm install source-map-support');
       }
-      console.error(e.toString(), sdk.dart.stackTrace(e).toString());
+      console.error(e);
       process.exit(1);
     }
     ''';
@@ -216,7 +217,7 @@
       _isolate_helper.startRootIsolate(() => {}, []);
       main();
     } catch(e) {
-      console.error(e.toString(), dart.stackTrace(e).toString());
+      console.error(e);
     }
     ''';
     var d8File = '$libRoot/$basename.d8.js';
diff --git a/pkg/dev_compiler/tool/ddc b/pkg/dev_compiler/tool/ddc
index bacfff7..e8d4ad0 100755
--- a/pkg/dev_compiler/tool/ddc
+++ b/pkg/dev_compiler/tool/ddc
@@ -68,13 +68,13 @@
   if [ ! -e $GEN_DIR/kernel/ddc_sdk.dill ]; then
     echo "DDC SDK must be built first, please run:"
     echo "    pushd $SDKDIR"
-    echo "    ./tools/build.py -m release dartdevk_sdk"
+    echo "    ./tools/build.py -m release dartdevc_kernel_sdk"
     exit 1
   fi
 
   NODE_PATH=$GEN_DIR/kernel/common:$LIBROOT:$NODE_PATH
 
-  $SDK_DIR/sdk/bin/dartdevk --modules=node \
+  $SDK_DIR/sdk/bin/dartdevc --kernel --modules=node \
       --dart-sdk-summary=$GEN_DIR/ddc_sdk.sum \
       -o $LIBROOT/$BASENAME.js $*
 else
@@ -113,8 +113,7 @@
       if (!source_maps) {
         console.log('For Dart source maps: npm install source-map-support');
       }
-      let toString = sdk.dart.toString;
-      console.error(toString(e), toString(sdk.dart.stackTrace(e)));
+      console.error(e);
       process.exit(1);
     }" \
     > $LIBROOT/$BASENAME.run.js
diff --git a/pkg/dev_compiler/tool/ddw b/pkg/dev_compiler/tool/ddw
index 86ecf9b..c35b2ca 100755
--- a/pkg/dev_compiler/tool/ddw
+++ b/pkg/dev_compiler/tool/ddw
@@ -68,13 +68,13 @@
   if [ ! -e $GEN_DIR/kernel/ddc_sdk.dill ]; then
     echo "DDC SDK must be built first, please run:"
     echo "    pushd $SDKDIR"
-    echo "    ./tools/build.py -m release dartdevk_sdk"
+    echo "    ./tools/build.py -m release dartdevc_kernel_sdk"
     exit 1
   fi
 
   NODE_PATH=$GEN_DIR/kernel/common:$LIBROOT:$NODE_PATH
 
-  dart -c $SDK_DIR/pkg/dev_compiler/bin/dartdevk.dart --modules=node \
+  dart -c $SDK_DIR/pkg/dev_compiler/bin/dartdevc.dart --kernel --modules=node \
       --dart-sdk-summary=$GEN_DIR/kernel/ddc_sdk.dill \
       -o $LIBROOT/$BASENAME.js $*
 else
diff --git a/pkg/dev_compiler/tool/global_compile.dart b/pkg/dev_compiler/tool/global_compile.dart
index d3090ae..de1bb64 100644
--- a/pkg/dev_compiler/tool/global_compile.dart
+++ b/pkg/dev_compiler/tool/global_compile.dart
@@ -6,7 +6,8 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:analyzer/analyzer.dart' show StringLiteral, parseDirectives;
+import 'package:analyzer/analyzer.dart' show parseDirectives;
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:args/args.dart' show ArgParser;
 import 'package:path/path.dart' as path;
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/libraries.json b/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
deleted file mode 100644
index 49b904f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/libraries.json
+++ /dev/null
@@ -1,110 +0,0 @@
-{
-  "dartdevc": {
-    "libraries": {
-      "_runtime": {
-        "uri": "../private/ddc_runtime/runtime.dart"
-      },
-      "_debugger": {
-        "uri": "../private/debugger.dart"
-      },
-      "_foreign_helper": {
-        "uri": "../private/foreign_helper.dart"
-      },
-      "_http": {
-        "uri": "../../../../../sdk/lib/_http/http.dart"
-      },
-      "_interceptors": {
-        "uri": "../private/interceptors.dart"
-      },
-      "_internal": {
-        "uri": "../../../../../sdk/lib/internal/internal.dart",
-        "patches": "../patch/internal_patch.dart"
-      },
-      "_isolate_helper": {
-        "uri": "../private/isolate_helper.dart"
-      },
-      "_js_helper": {
-        "uri": "../private/js_helper.dart"
-      },
-      "_js_mirrors": {
-        "uri": "../private/js_mirrors.dart"
-      },
-      "_js_primitives": {
-        "uri": "../private/js_primitives.dart"
-      },
-      "_metadata": {
-        "uri": "../../../../../sdk/lib/html/html_common/metadata.dart"
-      },
-      "_native_typed_data": {
-        "uri": "../private/native_typed_data.dart"
-      },
-      "async": {
-        "uri": "../../../../../sdk/lib/async/async.dart",
-        "patches": "../patch/async_patch.dart"
-      },
-      "collection": {
-        "uri": "../../../../../sdk/lib/collection/collection.dart",
-        "patches": "../patch/collection_patch.dart"
-      },
-      "convert": {
-        "uri": "../../../../../sdk/lib/convert/convert.dart",
-        "patches": "../patch/convert_patch.dart"
-      },
-      "core": {
-        "uri": "../../../../../sdk/lib/core/core.dart",
-        "patches": "../patch/core_patch.dart"
-      },
-      "developer": {
-        "uri": "../../../../../sdk/lib/developer/developer.dart",
-        "patches": "../patch/developer_patch.dart"
-      },
-      "io": {
-        "uri": "../../../../../sdk/lib/io/io.dart",
-        "patches": "../patch/io_patch.dart"
-      },
-      "isolate": {
-        "uri": "../../../../../sdk/lib/isolate/isolate.dart",
-        "patches": "../patch/isolate_patch.dart"
-      },
-      "mirrors": {
-        "uri": "../../../../../sdk/lib/mirrors/mirrors.dart",
-        "patches": "../patch/mirrors_patch.dart"
-      },
-      "math": {
-        "uri": "../../../../../sdk/lib/math/math.dart",
-        "patches": "../patch/math_patch.dart"
-      },
-      "typed_data": {
-        "uri": "../../../../../sdk/lib/typed_data/typed_data.dart",
-        "patches": "../patch/typed_data_patch.dart"
-      },
-      "html": {
-        "uri": "../../../../../sdk/lib/html/dart2js/html_dart2js.dart"
-      },
-      "html_common": {
-        "uri": "../../../../../sdk/lib/html/html_common/html_common_dart2js.dart"
-      },
-      "indexed_db": {
-        "uri": "../../../../../sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart"
-      },
-      "js": {
-        "uri": "js/dart2js/js_dart2js.dart"
-      },
-      "js_util": {
-        "uri": "js_util/dart2js/js_util_dart2js.dart"
-      },
-      "svg": {
-        "uri": "../../../../../sdk/lib/svg/dart2js/svg_dart2js.dart"
-      },
-      "web_audio": {
-        "uri": "../../../../../sdk/lib/web_audio/dart2js/web_audio_dart2js.dart"
-      },
-      "web_gl": {
-        "uri": "../../../../../sdk/lib/web_gl/dart2js/web_gl_dart2js.dart"
-      },
-      "web_sql": {
-        "uri": "../../../../../sdk/lib/web_sql/dart2js/web_sql_dart2js.dart"
-      }
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
index ae23c11..983bbcd 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/async_patch.dart
@@ -4,8 +4,7 @@
 
 // Patch file for the dart:async library.
 
-import 'dart:_js_helper'
-    show notNull, patch, setTraceForException, ReifyFunctionTypes;
+import 'dart:_js_helper' show notNull, patch, ReifyFunctionTypes;
 import 'dart:_isolate_helper'
     show TimerImpl, global, leaveJsAsync, enterJsAsync;
 import 'dart:_foreign_helper' show JS, JSExportName;
@@ -30,7 +29,7 @@
 _async<T>(Function() initGenerator) {
   var iter;
   Object Function(Object) onValue;
-  Object Function(Object) onError;
+  Object Function(Object, StackTrace) onError;
 
   onAwait(Object value) {
     _Future f;
@@ -60,8 +59,9 @@
   //
   // In essence, we are giving the code inside the generator a chance to
   // use try-catch-finally.
-  onError = (value) {
-    var iteratorResult = JS('', '#.throw(#)', iter, value);
+  onError = (value, stackTrace) {
+    var iteratorResult = JS(
+        '', '#.throw(#)', iter, dart.createErrorWithStack(value, stackTrace));
     value = JS('', '#.value', iteratorResult);
     return JS('bool', '#.done', iteratorResult) ? value : onAwait(value);
   };
@@ -69,7 +69,7 @@
   var zone = Zone.current;
   if (!identical(zone, _rootZone)) {
     onValue = zone.registerUnaryCallback(onValue);
-    onError = zone.registerUnaryCallback(onError);
+    onError = zone.registerBinaryCallback(onError);
   }
 
   var asyncFuture = _Future<T>();
@@ -243,8 +243,7 @@
 
 @patch
 void _rethrow(Object error, StackTrace stackTrace) {
-  setTraceForException(error, stackTrace);
-  dart.throw_(error);
+  JS('', 'throw #', dart.createErrorWithStack(error, stackTrace));
 }
 
 /// Used by the compiler to implement `async*` functions.
@@ -328,9 +327,12 @@
     if (_handleErrorCallback == null) {
       _handleErrorCallback = (error, StackTrace stackTrace) {
         try {
-          JS('', '#.throw(#)', jsIterator, error);
-        } catch (e) {
-          addError(e, stackTrace);
+          JS('', '#.throw(#)', jsIterator,
+              dart.createErrorWithStack(error, stackTrace));
+        } catch (e, newStack) {
+          // The generator didn't catch the error, or it threw a new one.
+          // Make sure to propagate the new error.
+          addError(e, newStack);
         }
       };
       var zone = Zone.current;
@@ -377,7 +379,6 @@
       iterResult = JS('', '#.next(#)', jsIterator, awaitValue);
     } catch (e, s) {
       addError(e, s);
-      close();
       return null;
     }
 
@@ -466,18 +467,17 @@
       // If the stream has been cancelled, complete the cancellation future
       // with the error.
       cancellationCompleter.completeError(error, stackTrace);
-      return;
+    } else if (controller.hasListener) {
+      controller.addError(error, stackTrace);
     }
-    // If stream is cancelled, tell caller to exit the async generator.
-    if (!controller.hasListener) return;
-    controller.addError(error, stackTrace);
     // No need to schedule the generator body here. This code is only
     // called from the catch clause of the implicit try-catch-finally
     // around the generator body. That is, we are on the error path out
     // of the generator and do not need to run the generator again.
+    close();
   }
 
-  close() {
+  void close() {
     if (cancellationCompleter != null && !cancellationCompleter.isCompleted) {
       // If the stream has been cancelled, complete the cancellation future
       // with the error.
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
index ae91eda..781a0c9 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
@@ -5,6 +5,7 @@
 // Patch file for dart:collection classes.
 import 'dart:_foreign_helper' show JS, JSExportName;
 import 'dart:_runtime' as dart;
+import 'dart:_interceptors' show JSArray;
 import 'dart:_js_helper'
     show
         NoInline,
@@ -248,7 +249,7 @@
     int length = JS('', '#.size', map);
     for (E key in objects) {
       if (key == null) {
-        key = null;
+        key = null; // converts undefined to null, if needed.
       } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
           dart.identityEquals)) {
         key = putLinkedMapKey(key, _keyMap);
@@ -302,6 +303,29 @@
   }
 }
 
+class ImmutableSet<E> extends _HashSet<E> {
+  ImmutableSet.from(JSArray entries) {
+    var map = _map;
+    for (Object key in entries) {
+      if (key == null) {
+        key = null; // converts undefined to null, if needed.
+      } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+          dart.identityEquals)) {
+        key = putLinkedMapKey(key, _keyMap);
+      }
+      JS('', '#.add(#)', map, key);
+    }
+  }
+
+  bool add(Object other) => throw _unsupported();
+  void addAll(Object other) => throw _unsupported();
+  void clear() => throw _unsupported();
+  bool remove(Object key) => throw _unsupported();
+
+  static Error _unsupported() =>
+      UnsupportedError("Cannot modify unmodifiable map");
+}
+
 class _IdentityHashSet<E> extends _InternalSet<E>
     implements HashSet<E>, LinkedHashSet<E> {
   /// The backing store for this set.
@@ -509,7 +533,7 @@
 /// Base class for our internal [LinkedHashSet]/[HashSet] implementations.
 ///
 /// This implements the common functionality.
-abstract class _InternalSet<E> extends _HashSetBase<E> {
+abstract class _InternalSet<E> extends _SetBase<E> {
   @notNull
   get _map;
 
@@ -548,3 +572,30 @@
         iterator);
   }
 }
+
+@patch
+abstract class _SplayTree<K, Node extends _SplayTreeNode<K>> {
+  @patch
+  Node _splayMin(Node node) {
+    Node current = node;
+    while (current.left != null) {
+      Node left = current.left;
+      current.left = left.right;
+      left.right = current;
+      current = left;
+    }
+    return current;
+  }
+
+  @patch
+  Node _splayMax(Node node) {
+    Node current = node;
+    while (current.right != null) {
+      Node right = current.right;
+      current.right = right.left;
+      right.left = current;
+      current = right;
+    }
+    return current;
+  }
+}
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
index cfaa3fc..787c677 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/convert_patch.dart
@@ -495,3 +495,13 @@
     return null;
   }();
 }
+
+@patch
+int _scanOneByteCharacters(List<int> units, int from, int endIndex) {
+  final to = endIndex;
+  for (var i = from; i < to; i++) {
+    final unit = units[i];
+    if ((unit & _ONE_BYTE_LIMIT) != unit) return i - from;
+  }
+  return to - from;
+}
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
index f506a42..581bc3f 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -10,7 +10,6 @@
         patch,
         checkInt,
         getRuntimeType,
-        getTraceFromException,
         LinkedMap,
         JSSyntaxRegExp,
         NoInline,
@@ -207,7 +206,7 @@
   }
 
   @patch
-  StackTrace get stackTrace => getTraceFromException(this);
+  StackTrace get stackTrace => dart.stackTraceForError(this);
 }
 
 @patch
@@ -342,6 +341,26 @@
 
   @patch
   int get weekday => Primitives.getWeekday(this);
+
+  @patch
+  bool operator ==(dynamic other) =>
+      other is DateTime &&
+      _value == other.millisecondsSinceEpoch &&
+      isUtc == other.isUtc;
+
+  @patch
+  bool isBefore(DateTime other) => _value < other.millisecondsSinceEpoch;
+
+  @patch
+  bool isAfter(DateTime other) => _value > other.millisecondsSinceEpoch;
+
+  @patch
+  bool isAtSameMomentAs(DateTime other) =>
+      _value == other.millisecondsSinceEpoch;
+
+  @patch
+  int compareTo(DateTime other) =>
+      _value.compareTo(other.millisecondsSinceEpoch);
 }
 
 // Patch for Stopwatch implementation.
@@ -725,7 +744,7 @@
   @patch
   @NoInline()
   static StackTrace get current {
-    return getTraceFromException(JS('', 'new Error()'));
+    return dart.stackTrace(JS('', 'Error()'));
   }
 }
 
diff --git a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
index a885aae..7d28269 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
@@ -20,6 +20,9 @@
 
 @patch
 Object inspect(Object object) {
+  // Note: this log level does not show up by default in Chrome.
+  // This is used for communication with the debugger service.
+  JS('', 'console.debug("dart.developer.inspect", #)', object);
   return object;
 }
 
@@ -32,7 +35,17 @@
     Zone zone,
     Object error,
     StackTrace stackTrace}) {
-  // TODO.
+  Object items =
+      JS('!', '{ message: #, name: #, level: # }', message, name, level);
+  if (time != null) JS('', '#.time = #', items, time);
+  if (sequenceNumber != null) {
+    JS('', '#.sequenceNumber = #', items, sequenceNumber);
+  }
+  if (zone != null) JS('', '#.zone = #', items, zone);
+  if (error != null) JS('', '#.error = #', items, error);
+  if (stackTrace != null) JS('', '#.stackTrace = #', items, stackTrace);
+
+  JS('', 'console.debug("dart.developer.log", #)', items);
 }
 
 final _extensions = Map<String, ServiceExtensionHandler>();
@@ -45,11 +58,13 @@
 @patch
 _registerExtension(String method, ServiceExtensionHandler handler) {
   _extensions[method] = handler;
+  JS('', 'console.debug("dart.developer.registerExtension", #)', method);
 }
 
 @patch
 void _postEvent(String eventKind, String eventData) {
-  // TODO.
+  JS('', 'console.debug("dart.developer.postEvent", #, #)', eventKind,
+      eventData);
 }
 
 @patch
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
index a7606a4..70ccace 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
@@ -81,6 +81,210 @@
       }
     }
   }
-  return "Type '${typeName(from)}' is not a subtype of "
-      "expected type '${typeName(to)}'.";
+  return "Expected a value of type '${typeName(to)}', "
+      "but got one of type '${typeName(from)}'";
+}
+
+/// The symbol that references the thrown Dart Object (typically but not
+/// necessarily an [Error] or [Exception]), used by the [exception] function.
+final Object _thrownValue = JS('', 'Symbol("_thrownValue")');
+
+/// For a Dart [Error], this provides access to the JS Error object that
+/// contains the stack trace if the error was thrown.
+final Object _jsError = JS('', 'Symbol("_jsError")');
+
+/// Gets the thrown Dart Object from an [error] caught by a JS catch.
+///
+/// If the throw originated in Dart, the result will typically be an [Error]
+/// or [Exception], but it could be any Dart object.
+///
+/// If the throw originated in JavaScript, then there is not a corresponding
+/// Dart value, so we just return the error object.
+Object getThrown(Object error) {
+  if (error != null) {
+    // Get the Dart thrown value, if any.
+    var value = JS('', '#[#]', error, _thrownValue);
+    if (value != null) return value;
+  }
+  // Otherwise return the original object.
+  return error;
+}
+
+final _stackTrace = JS('', 'Symbol("_stackTrace")');
+
+/// Returns the stack trace from an [error] caught by a JS catch.
+///
+/// If the throw originated in Dart, we should always have JS Error
+/// (see [throw_]) so we can create a Dart [StackTrace] from that (or return a
+/// previously created instance).
+///
+/// If the throw originated in JavaScript and was an `Error`, then we can get
+/// the corresponding stack trace the same way we do for Dart throws. If the
+/// throw object was not an Error, then we don't have a JS trace, so we create
+/// one here.
+StackTrace stackTrace(Object error) {
+  if (JS<bool>('!', '!(# instanceof Error)', error)) {
+    // We caught something that isn't a JS Error.
+    //
+    // We should only hit this path when a non-Error was thrown from JS. In
+    // case, there is no stack trace available, so create one here.
+    return _StackTrace.missing(error);
+  }
+
+  // If we've already created the Dart stack trace object, return it.
+  StackTrace trace = JS('', '#[#]', error, _stackTrace);
+  if (trace != null) return trace;
+
+  // Otherwise create the Dart stack trace (by parsing the JS stack), and
+  // cache it so we don't repeat the parsing/allocation.
+  return JS('', '#[#] = #', error, _stackTrace, _StackTrace(error));
+}
+
+StackTrace stackTraceForError(Error error) {
+  return stackTrace(JS('', '#[#]', error, _jsError));
+}
+
+/// Implements `rethrow` of [error], allowing rethrow in an expression context.
+///
+/// Note: [error] must be the raw JS error caught in the JS catch, not the
+/// unwrapped value returned by [getThrown].
+@JSExportName('rethrow')
+void rethrow_(Object error) {
+  JS('', 'throw #', error);
+}
+
+/// Subclass of JS `Error` that wraps a thrown Dart object, and evaluates the
+/// message lazily by calling `toString()` on the wrapped Dart object.
+///
+/// Also creates a pointer from the thrown Dart object to the JS Error
+/// (via [_jsError]). This is used to implement [Error.stackTrace], but also
+/// provides a way to recover the stack trace if we lose track of it.
+/// [Error] requires preserving the original stack trace if an error is
+/// rethrown, so we only update the pointer if it wasn't already set.
+///
+/// TODO(jmesserly): Dart Errors should simply be JS Errors.
+final Object DartError = JS(
+    '!',
+    '''class DartError extends Error {
+      constructor(error) {
+        super();
+        this[#] = error;
+        if (error != null && typeof error == "object" && error[#] == null) {
+          error[#] = this;
+        }
+      }
+      get message() {
+        return #(this[#]);
+      }
+    }''',
+    _thrownValue,
+    _jsError,
+    _jsError,
+    _toString,
+    _thrownValue);
+
+/// Subclass of [DartError] for cases where we're rethrowing with a different,
+/// original Dart StackTrace object.
+///
+/// This includes the original stack trace in the JS Error message so it doesn't
+/// get lost if the exception reaches JS.
+final Object RethrownDartError = JS(
+    '!',
+    '''class RethrownDartError extends # {
+      constructor(error, stackTrace) {
+        super(error);
+        this[#] = stackTrace;
+      }
+      get message() {
+        return super.message + "\\n    " + #(this[#]) + "\\n";
+      }
+    }''',
+    DartError,
+    _stackTrace,
+    _toString,
+    _stackTrace);
+
+/// Implements `throw` of [exception], allowing for throw in an expression
+/// context, and capturing the current stack trace.
+@JSExportName('throw')
+void throw_(Object exception) {
+  /// Wrap the object so we capture a new stack trace, and so it will print
+  /// nicely from JS, as if it were a normal JS error.
+  JS('', 'throw new #(#)', DartError, exception);
+}
+
+/// Returns a JS error for throwing the Dart [exception] Object and using the
+/// provided stack [trace].
+///
+/// This is used by dart:async to rethrow unhandled errors in [Zone]s, and by
+/// `async`/`async*` to rethrow errors from Futures/Streams into the generator
+/// (so a try/catch in there can catch it).
+///
+/// If the exception and trace originated from the same Dart throw, then we can
+/// simply return the original JS Error. Otherwise, we have to create a new JS
+/// Error. The new error will have the correct Dart trace, but it will not have
+/// the correct JS stack trace (visible if JavaScript ends up handling it). To
+/// fix that, we use [RethrownDartError] to preserve the Dart trace and make
+/// sure it gets displayed in the JS error message.
+///
+/// If the stack trace is null, this will preserve the original stack trace
+/// on the exception, if available, otherwise it will capture the current stack
+/// trace.
+Object createErrorWithStack(Object exception, StackTrace trace) {
+  if (trace == null) {
+    var error = JS('', '#[#]', exception, _jsError);
+    return error != null ? error : JS('', 'new #(#)', DartError, exception);
+  }
+  if (trace is _StackTrace) {
+    /// Optimization: if this stack trace and exception already have a matching
+    /// Error, we can just rethrow it.
+    var originalError = trace._jsError;
+    if (identical(exception, getThrown(originalError))) {
+      return originalError;
+    }
+  }
+  return JS('', 'new #(#, #)', RethrownDartError, exception, trace);
+}
+
+// This is a utility function: it is only intended to be called from dev
+// tools.
+void stackPrint(Object error) {
+  JS('', 'console.log(#.stack ? #.stack : "No stack trace for: " + #)', error,
+      error, error);
+}
+
+class _StackTrace implements StackTrace {
+  final Object _jsError;
+  final Object _jsObjectMissingTrace;
+  String _trace;
+
+  _StackTrace(this._jsError) : _jsObjectMissingTrace = null;
+
+  _StackTrace.missing(Object caughtObj)
+      : _jsObjectMissingTrace = caughtObj != null ? caughtObj : 'null',
+        _jsError = JS('', 'Error()');
+
+  String toString() {
+    if (_trace != null) return _trace;
+
+    var e = _jsError;
+    String trace = '';
+    if (e != null && JS('bool', 'typeof # === "object"', e)) {
+      trace = e is NativeError ? e.dartStack() : JS<String>('', '#.stack', e);
+      if (trace != null && stackTraceMapper != null) {
+        trace = stackTraceMapper(trace);
+      }
+    }
+    if (trace.isEmpty || _jsObjectMissingTrace != null) {
+      String jsToString;
+      try {
+        jsToString = JS('', '"" + #', _jsObjectMissingTrace);
+      } catch (_) {
+        jsToString = '<error converting JS object to string>';
+      }
+      trace = 'Non-error `$jsToString` thrown by JS does not have stack trace.'
+          '\nCaught in Dart at:\n\n$trace';
+    }
+    return _trace = trace;
+  }
 }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index 46eb700..b3865c1 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -432,9 +432,7 @@
   } else {
     result = t1 is FunctionType && t2 is FunctionType ||
         isSubtypeOf(t2, unwrapType(Iterable)) &&
-            isSubtypeOf(t1, unwrapType(Iterable)) ||
-        isSubtypeOf(t2, unwrapType(Future)) &&
-            isSubtypeOf(t1, unwrapType(Future));
+            isSubtypeOf(t1, unwrapType(Iterable));
     if (result) {
       _warn('Ignoring cast fail from ${typeName(t1)} to ${typeName(t2)}');
     }
@@ -504,19 +502,24 @@
 /// The global constant map table.
 final constantMaps = JS('', 'new Map()');
 
-constMap<K, V>(JSArray elements) {
-  Function(Object, Object) lookupNonTerminal = JS('', '''function(map, key) {
-    let result = map.get(key);
-    if (result != null) return result;
-    map.set(key, result = new Map());
-    return result;
-  }''');
+// TODO(leafp): This table gets quite large in apps.
+// Keeping the paths is probably expensive.  It would probably
+// be more space efficient to just use a direct hash table with
+// an appropriately defined structural equality function.
+Object _lookupNonTerminal(Object map, Object key) {
+  var result = JS('', '#.get(#)', map, key);
+  if (result != null) return result;
+  JS('', '#.set(#, # = new Map())', map, key, result);
+  return result;
+}
+
+Map<K, V> constMap<K, V>(JSArray elements) {
   var count = elements.length;
-  var map = lookupNonTerminal(constantMaps, count);
+  var map = _lookupNonTerminal(constantMaps, count);
   for (var i = 0; i < count; i++) {
-    map = lookupNonTerminal(map, JS('', '#[#]', elements, i));
+    map = _lookupNonTerminal(map, JS('', '#[#]', elements, i));
   }
-  map = lookupNonTerminal(map, K);
+  map = _lookupNonTerminal(map, K);
   var result = JS('', '#.get(#)', map, V);
   if (result != null) return result;
   result = ImmutableMap<K, V>.from(elements);
@@ -524,6 +527,21 @@
   return result;
 }
 
+final constantSets = JS('', 'new Map()');
+
+Set<E> constSet<E>(JSArray<E> elements) {
+  var count = elements.length;
+  var map = _lookupNonTerminal(constantSets, count);
+  for (var i = 0; i < count; i++) {
+    map = _lookupNonTerminal(map, JS('', '#[#]', elements, i));
+  }
+  var result = JS('', '#.get(#)', map, E);
+  if (result != null) return result;
+  result = ImmutableSet<E>.from(elements);
+  JS('', '#.set(#, #)', map, E, result);
+  return result;
+}
+
 bool dassert(value) {
   if (JS('!', '# != null && #[#] instanceof #', value, value, _runtimeType,
       AbstractFunctionType)) {
@@ -532,76 +550,6 @@
   return dtest(value);
 }
 
-/// Store a JS error for an exception.  For non-primitives, we store as an
-/// expando.  For primitive, we use a side cache.  To limit memory leakage, we
-/// only keep the last [_maxTraceCache] entries.
-final _error = JS('', 'Symbol("_error")');
-Map _primitiveErrorCache;
-const _maxErrorCache = 10;
-
-bool _isJsError(exception) {
-  return JS('!', '#.Error != null && # instanceof #.Error', global_, exception,
-      global_);
-}
-
-// Record/return the JS error for an exception.  If an error was already
-// recorded, prefer that to [newError].
-recordJsError(exception, [newError]) {
-  if (_isJsError(exception)) return exception;
-
-  var useExpando =
-      exception != null && JS<bool>('!', 'typeof # == "object"', exception);
-  var error;
-  if (useExpando) {
-    error = JS('', '#[#]', exception, _error);
-  } else {
-    if (_primitiveErrorCache == null) _primitiveErrorCache = {};
-    error = _primitiveErrorCache[exception];
-  }
-  if (error != null) return error;
-  if (newError != null) {
-    error = newError;
-  } else {
-    // We should only hit this path when a non-Error was thrown from JS.  In
-    // case, there is no stack trace on the exception, so we create one:
-    error = JS('', 'new Error()');
-  }
-  if (useExpando) {
-    JS('', '#[#] = #', exception, _error, error);
-  } else {
-    _primitiveErrorCache[exception] = error;
-    if (_primitiveErrorCache.length > _maxErrorCache) {
-      _primitiveErrorCache.remove(_primitiveErrorCache.keys.first);
-    }
-  }
-  return error;
-}
-
-@JSExportName('throw')
-throw_(obj) {
-  // Note, we create the error here to avoid the extra frame.
-  // package:stack_trace and tests appear to assume this.  We could fix use
-  // cases instead, but we're already on the exceptional path here.
-  recordJsError(obj, JS('', 'new Error()'));
-  JS('', 'throw #', obj);
-}
-
-@JSExportName('rethrow')
-rethrow_(obj) {
-  JS('', 'throw #', obj);
-}
-
-// This is a utility function: it is only intended to be called from dev
-// tools.
-stackPrint(exception) {
-  var error = recordJsError(exception);
-  JS('', 'console.log(#.stack ? #.stack : "No stack trace for: " + #)', error,
-      error, error);
-}
-
-// Forward to dart:_js_helper to create a _StackTrace object.
-stackTrace(exception) => getTraceFromException(exception);
-
 final _value = JS('', 'Symbol("_value")');
 
 ///
@@ -648,22 +596,12 @@
 /// - nested values of the object are themselves already canonicalized.
 ///
 @JSExportName('const')
-const_(obj) => JS('', '''(() => {
-  // TODO(leafp): This table gets quite large in apps.
-  // Keeping the paths is probably expensive.  It would probably
-  // be more space efficient to just use a direct hash table with
-  // an appropriately defined structural equality function.
-  function lookupNonTerminal(map, key) {
-    let result = map.get(key);
-    if (result !== void 0) return result;
-    map.set(key, result = new Map());
-    return result;
-  };
+const_(obj) => JS('', '''(() => {  
   let names = $getOwnNamesAndSymbols($obj);
   let count = names.length;
   // Index by count.  All of the paths through this map
   // will have 2*count length.
-  let map = lookupNonTerminal($constants, count);
+  let map = $_lookupNonTerminal($constants, count);
   // TODO(jmesserly): there's no guarantee in JS that names/symbols are
   // returned in the same order.
   //
@@ -678,8 +616,8 @@
   // See issue https://github.com/dart-lang/sdk/issues/30876
   for (let i = 0; i < count; i++) {
     let name = names[i];
-    map = lookupNonTerminal(map, name);
-    map = lookupNonTerminal(map, $obj[name]);
+    map = $_lookupNonTerminal(map, name);
+    map = $_lookupNonTerminal(map, $obj[name]);
   }
   // TODO(leafp): It may be the case that the reified type
   // is always one of the keys already used above?
@@ -699,16 +637,10 @@
 
 /// Canonicalize a constant list
 constList(elements, elementType) => JS('', '''(() => {
-  function lookupNonTerminal(map, key) {
-    let result = map.get(key);
-    if (result !== void 0) return result;
-    map.set(key, result = new Map());
-    return result;
-  };
   let count = $elements.length;
-  let map = lookupNonTerminal($constantLists, count);
+  let map = $_lookupNonTerminal($constantLists, count);
   for (let i = 0; i < count; i++) {
-    map = lookupNonTerminal(map, elements[i]);
+    map = $_lookupNonTerminal(map, elements[i]);
   }
   let value = map.get($elementType);
   if (value) return value;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index 82289ddd..116464a 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -8,8 +8,9 @@
 import 'dart:async';
 import 'dart:collection';
 
+import 'dart:_debugger' show stackTraceMapper, trackCall;
 import 'dart:_foreign_helper' show JS, JSExportName, rest, spread;
-import 'dart:_interceptors' show JSArray, jsNull, JSFunction;
+import 'dart:_interceptors' show JSArray, jsNull, JSFunction, NativeError;
 import 'dart:_internal' as internal show Symbol;
 import 'dart:_js_helper'
     show
@@ -17,7 +18,6 @@
         BooleanConversionAssertionError,
         CastErrorImpl,
         DartIterator,
-        getTraceFromException,
         TypeErrorImpl,
         JsLinkedHashMap,
         ImmutableMap,
@@ -25,7 +25,6 @@
         ReifyFunctionTypes,
         NoReifyGeneric,
         notNull;
-import 'dart:_debugger' show trackCall;
 
 export 'dart:_debugger' show getDynamicStats, clearDynamicStats, trackCall;
 
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index 4602bc2..13d6f88 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -306,13 +306,6 @@
   return $_memoizeArray($map, key, () => $named);
 })()''');
 
-_lookupNonTerminal(map, key) => JS('', '''(() => {
-  let result = $map.get($key);
-  if (result !== void 0) return result;
-  $map.set($key, result = new Map());
-  return result;
-})()''');
-
 // TODO(leafp): This handles some low hanging fruit, but
 // really we should make all of this faster, and also
 // handle more cases here.
diff --git a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
index de5ca6e..445f0cb 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/interceptors.dart
@@ -8,7 +8,7 @@
 import 'dart:_internal' hide Symbol;
 import 'dart:_js_helper';
 import 'dart:_foreign_helper' show JS, JSExportName;
-import 'dart:math' show Random;
+import 'dart:math' show Random, ln2;
 import 'dart:_runtime' as dart;
 
 part 'js_array.dart';
@@ -138,7 +138,7 @@
     return stack;
   }
 
-  StackTrace get stackTrace => getTraceFromException(this);
+  StackTrace get stackTrace => dart.stackTrace(this);
 
   String toString() {
     String message = JS('!', '#.message', this);
@@ -211,7 +211,7 @@
 // it to be picked up as an extension type.
 @JsPeerInterface(name: 'RangeError')
 class JSRangeError extends Interceptor implements ArgumentError {
-  StackTrace get stackTrace => getTraceFromException(this);
+  StackTrace get stackTrace => dart.stackTrace(this);
 
   get invalidValue => null;
   get name => null;
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
index c9533c2..a8672f1 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
@@ -6,8 +6,6 @@
 
 import 'dart:collection';
 
-import 'dart:_debugger' show stackTraceMapper;
-
 import 'dart:_foreign_helper' show JS, JS_STRING_CONCAT, JSExportName;
 
 import 'dart:_interceptors';
@@ -579,53 +577,6 @@
 }
 
 /**
- * Called by generated code to fetch the stack trace from a Dart
- * exception. Should never return null.
- */
-final _stackTrace = JS('', 'Symbol("_stackTrace")');
-StackTrace getTraceFromException(exception) {
-  var error = dart.recordJsError(exception);
-  StackTrace trace = JS('', '#[#]', error, _stackTrace);
-  if (trace != null) return trace;
-  trace = _StackTrace(error);
-  JS('', '#[#] = #', error, _stackTrace, trace);
-  return trace;
-}
-
-/**
- * Called on rethrow to (potentially) set a different trace.
- */
-void setTraceForException(exception, StackTrace trace) {
-  var error = dart.recordJsError(exception);
-  JS('', '#[#] = #', error, _stackTrace, trace);
-}
-
-class _StackTrace implements StackTrace {
-  var _exception;
-  String _trace;
-
-  _StackTrace(this._exception);
-
-  String toString() {
-    if (_trace != null) return _trace;
-
-    String trace;
-    if (JS('bool', '# !== null', _exception) &&
-        JS('bool', 'typeof # === "object"', _exception)) {
-      if (_exception is NativeError) {
-        trace = _exception.dartStack();
-      } else {
-        trace = JS("", r"#.stack", _exception);
-      }
-      if (trace != null && stackTraceMapper != null) {
-        trace = stackTraceMapper(trace);
-      }
-    }
-    return _trace = (trace == null) ? '' : trace;
-  }
-}
-
-/**
  * Called by generated code to build a map literal. [keyValuePairs] is
  * a list of key, value, key, value, ..., etc.
  */
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_number.dart b/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
index f539a10..2a1fb74 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_number.dart
@@ -218,7 +218,40 @@
   }
 
   @notNull
-  int get hashCode => JS('int', '# & 0x1FFFFFFF', this);
+  int get hashCode {
+    int intValue = JS('int', '# | 0', this);
+    // Fast exit for integers in signed 32-bit range. Masking converts -0.0 to 0
+    // and ensures that result fits in JavaScript engine's Smi range.
+    if (this == intValue) return 0x1FFFFFFF & intValue;
+
+    // We would like to access the exponent and mantissa as integers but there
+    // are no JavaScript operations that do this, so use log2-floor-pow-divide
+    // to extract the values.
+    num absolute = JS('num', 'Math.abs(#)', this);
+    num lnAbsolute = JS('num', 'Math.log(#)', absolute);
+    num log2 = lnAbsolute / ln2;
+    // Floor via '# | 0' converts NaN to zero so the final result is not NaN.
+    int floorLog2 = JS('int', '# | 0', log2);
+    num factor = JS('num', 'Math.pow(2, #)', floorLog2);
+    num scaled = absolute < 1 ? absolute / factor : factor / absolute;
+    // [scaled] is in the range [0.5, 1].
+
+    // Multiply and truncate to pick up all the mantissa bits. Multiplying by
+    // 0x20000000000000 (which has 53 zero bits) converts the mantissa into an
+    // integer. There are interesting subsets where all the bit variance is in
+    // the most significant bits of the mantissa (e.g. 0.5, 0.625, 0.75), so we
+    // need to mix in the most significant bits. We do this by scaling with a
+    // constant that has many bits set to use the multiplier to mix in bits from
+    // all over the mantissa into low positions.
+    num rescaled1 = scaled * 0x20000000000000;
+    num rescaled2 = scaled * 0x0C95A6C285A6C9;
+    int d1 = JS('int', '# | 0', rescaled1);
+    int d2 = JS('int', '# | 0', rescaled2);
+    // Mix in exponent to distinguish e.g. 1.25 from 2.5.
+    int d3 = floorLog2;
+    int h = 0x1FFFFFFF & ((d1 + d2) * (601 * 997) + d3 * (1259));
+    return h;
+  }
 
   @notNull
   JSNumber operator -() => JS('num', r'-#', this);
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index bd401c2..2827fbe 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -36,13 +36,14 @@
     outputPath = path.join(genDir, 'kernel', 'ddc_sdk.dill');
   }
 
+  var librarySpecPath = parserOptions['libraries'] as String;
+
   var target = DevCompilerTarget();
   var options = CompilerOptions()
     ..compileSdk = true
     // TODO(sigmund): remove this unnecessary option when possible.
     ..sdkRoot = Uri.base
-    ..librariesSpecificationUri =
-        Uri.base.resolveUri(Uri.file(parserOptions['libraries']))
+    ..librariesSpecificationUri = Uri.base.resolveUri(Uri.file(librarySpecPath))
     ..target = target;
 
   var inputs = target.extraRequiredLibraries.map(Uri.parse).toList();
@@ -51,12 +52,14 @@
   var outputDir = path.dirname(outputPath);
   await Directory(outputDir).create(recursive: true);
   await writeComponentToBinary(component, outputPath);
+  File(librarySpecPath).copySync(
+      path.join(path.dirname(outputDir), path.basename(librarySpecPath)));
 
   var jsModule = ProgramCompiler(
       component,
       target.hierarchy,
       SharedCompilerOptions(moduleName: 'dart_sdk'),
-      {}).emitModule(component, [], {});
+      {}).emitModule(component, [], [], {});
   var moduleFormats = {
     'amd': ModuleFormat.amd,
     'common': ModuleFormat.common,
diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
index 4159cb5..e6d123b 100755
--- a/pkg/dev_compiler/tool/patch_sdk.dart
+++ b/pkg/dev_compiler/tool/patch_sdk.dart
@@ -9,8 +9,11 @@
 import 'dart:io';
 import 'dart:math' as math;
 
-import 'package:analyzer/analyzer.dart';
+import 'package:analyzer/analyzer.dart'
+    show parseCompilationUnit, parseDirectives;
+import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:path/path.dart' as path;
 
diff --git a/pkg/diagnostic/pubspec.yaml b/pkg/diagnostic/pubspec.yaml
index 1ab1973..98411d4 100644
--- a/pkg/diagnostic/pubspec.yaml
+++ b/pkg/diagnostic/pubspec.yaml
@@ -1,5 +1,5 @@
 name: diagnostic
-version: 0.1.0
+publish_to: none
 author: Dart Team <misc@dartlang.org>
 description: Diagnostics for Dart
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/diagnostic
diff --git a/pkg/expect/lib/expect.dart b/pkg/expect/lib/expect.dart
index eff873d..9a59d3d 100644
--- a/pkg/expect/lib/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -8,6 +8,8 @@
  */
 library expect;
 
+import 'package:meta/meta.dart';
+
 /**
  * Expect is used for tests that do not want to make use of the
  * Dart unit test library - for example, the core language tests.
@@ -265,6 +267,7 @@
   }
 
   // Unconditional failure.
+  @alwaysThrows
   static void fail(String msg) {
     _fail("Expect.fail('$msg')");
   }
@@ -647,6 +650,7 @@
   static String _getMessage(String reason) =>
       (reason == null) ? "" : ", '$reason'";
 
+  @alwaysThrows
   static void _fail(String message) {
     throw new ExpectException(message);
   }
@@ -671,20 +675,6 @@
 }
 
 /// Annotation class for testing of dart2js. Use this as metadata on method
-/// declarations to make the type inferrer trust the parameter and return types,
-/// effectively asserting the runtime values will (at least) be subtypes of the
-/// annotated types.
-///
-/// While the actually inferred type is guaranteed to be a subtype of the
-/// annotation, it often is more precise. In particular, if a method is only
-/// called with `null`, the inferrer will still infer null. To ensure that
-/// the annotated type is also the inferred type, additionally use
-/// [AssumeDynamic].
-class TrustTypeAnnotations {
-  const TrustTypeAnnotations();
-}
-
-/// Annotation class for testing of dart2js. Use this as metadata on method
 /// declarations to disable closed world assumptions on parameters, effectively
 /// assuming that the runtime arguments could be any value. Note that the
 /// constraints due to [TrustTypeAnnotations] still apply.
diff --git a/pkg/expect/pubspec.yaml b/pkg/expect/pubspec.yaml
index 21ab22d..2a7405d 100644
--- a/pkg/expect/pubspec.yaml
+++ b/pkg/expect/pubspec.yaml
@@ -1,6 +1,5 @@
 name: expect
-author: "Dart Team <misc@dartlang.org>"
-homepage: http://www.dartlang.org
+publish_to: none
 description: >
  Expect is used for tests that do not want to make use of the
  Dart unit test library - for example, the core language tests.
@@ -8,4 +7,7 @@
  the expect() function in the unit test library instead for
  test assertions.
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  sdk: ">=0.8.10+6 <3.0.0"
+
+dependencies:
+  meta: any
diff --git a/pkg/front_end/analysis_options.yaml b/pkg/front_end/analysis_options.yaml
index 39409d5..ae13d06 100644
--- a/pkg/front_end/analysis_options.yaml
+++ b/pkg/front_end/analysis_options.yaml
@@ -3,14 +3,14 @@
 # BSD-style license that can be found in the LICENSE file.
 
 analyzer:
-  language:
-    enableSuperMixins: false
   exclude:
     - testcases/**
   errors:
     # Allow having TODOs in the code
     todo: ignore
 
-    # Allow deprecated calls (although it would be nice to have a distinction
-    # between internal and external deprecated calls).
+    # Allow cross-package deprecated calls
+    # TODO(srawlins): clean these up and remove this "ignore."
     deprecated_member_use: ignore
+    # Allow deprecated calls from within the same package
+    deprecated_member_use_from_same_package: ignore
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index fcc9865..85222be 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -8,6 +8,8 @@
 
 import 'diagnostic_message.dart' show DiagnosticMessageHandler;
 
+import 'experimental_flags.dart' show ExperimentalFlag, parseExperimentalFlag;
+
 import 'file_system.dart' show FileSystem;
 
 import 'standard_file_system.dart' show StandardFileSystem;
@@ -118,7 +120,12 @@
   /// directly, while relative URIs are resolved from the [sdkRoot].
   // TODO(sigmund): provide also a flag to load this data from a file (like
   // libraries.json)
-  Map<String, List<Uri>> targetPatches = {};
+  Map<String, List<Uri>> targetPatches = <String, List<Uri>>{};
+
+  /// Enable or disable experimental features. Features mapping to `true` are
+  /// explicitly enabled. Features mapping to `false` are explicitly disabled.
+  /// Features not mentioned in the map will have their default value.
+  Map<ExperimentalFlag, bool> experimentalFlags = <ExperimentalFlag, bool>{};
 
   /// The target platform that will consume the compiled code.
   ///
@@ -154,6 +161,10 @@
   /// Dumped data is printed in stdout.
   bool debugDump = false;
 
+  /// Whether to exclode the platform when serializing the result from a
+  /// 'fasta compile' run.
+  bool omitPlatform = false;
+
   /// Whether to set the exit code to non-zero if any problem (including
   /// warning, etc.) is encountered during compilation.
   bool setExitCodeOnProblem = false;
@@ -181,4 +192,35 @@
 
   /// Whether to generate bytecode.
   bool bytecode = false;
+
+  /// Whether to write a file (e.g. a dill file) when reporting a crash.
+  bool writeFileOnCrashReport = true;
+}
+
+/// Parse experimental flags from a list of strings, each of which is either a
+/// flag name or a flag name prefixed by 'no-'. Return a map of flags to their
+/// values that can be passed to [experimentalFlags].
+///
+/// If an unknown flag is mentioned, or a flag is mentioned more than once,
+/// the supplied error handler is called with an error message.
+Map<ExperimentalFlag, bool> parseExperimentalFlags(
+    Iterable<String> experiments, void onError(String message)) {
+  Map<ExperimentalFlag, bool> flags = <ExperimentalFlag, bool>{};
+  if (experiments == null) return flags;
+  for (String experiment in experiments) {
+    bool value = true;
+    if (experiment.startsWith("no-")) {
+      value = false;
+      experiment = experiment.substring(3);
+    }
+    ExperimentalFlag flag = parseExperimentalFlag(experiment);
+    if (flag == null) {
+      onError("Unknown experiment: " + experiment);
+    } else if (flags.containsKey(flag)) {
+      onError("Experiment mentioned more than once: " + experiment);
+    } else {
+      flags[flag] = value;
+    }
+  }
+  return flags;
 }
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
new file mode 100644
index 0000000..1441108
--- /dev/null
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// TODO(askesc): Generate this file from a flag specification.
+
+enum ExperimentalFlag {
+  setLiterals,
+  constantUpdate2018,
+}
+
+ExperimentalFlag parseExperimentalFlag(String flag) {
+  switch (flag) {
+    case "set-literals":
+      return ExperimentalFlag.setLiterals;
+    case "constant-update-2018":
+      return ExperimentalFlag.constantUpdate2018;
+  }
+  return null;
+}
diff --git a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
index 5be815e..bdd78ad 100644
--- a/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/standard_file_system.dart
@@ -63,7 +63,7 @@
   Future<List<int>> readAsBytes() async {
     try {
       CompilerContext.recordDependency(uri);
-      return await new io.File.fromUri(uri).readAsBytes();
+      return new io.File.fromUri(uri).readAsBytesSync();
     } on io.FileSystemException catch (exception) {
       throw _toFileSystemException(exception);
     }
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 5f2036e..188c88b 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -12,10 +12,14 @@
 
 import '../api_prototype/diagnostic_message.dart' show DiagnosticMessageHandler;
 
+import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+
 import '../api_prototype/file_system.dart' show FileSystem;
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
+import '../base/libraries_specification.dart' show LibrariesSpecification;
+
 import '../fasta/compiler_context.dart' show CompilerContext;
 
 import '../fasta/fasta_codes.dart' show messageMissingMain;
@@ -28,10 +32,13 @@
 
 import 'compiler_state.dart' show InitializedCompilerState;
 
-export '../api_prototype/compiler_options.dart' show CompilerOptions;
+export '../api_prototype/compiler_options.dart'
+    show CompilerOptions, parseExperimentalFlags;
 
 export '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
 
+export '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+
 export '../api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
@@ -96,11 +103,22 @@
     Target target,
     Uri librariesSpecificationUri,
     Uri sdkPlatformUri,
-    Uri packagesFileUri) {
+    Uri packagesFileUri,
+    {Map<ExperimentalFlag, bool> experimentalFlags}) {
+  bool mapEqual(Map<ExperimentalFlag, bool> a, Map<ExperimentalFlag, bool> b) {
+    if (a == null || b == null) return a == b;
+    if (a.length != b.length) return false;
+    for (var flag in a.keys) {
+      if (!b.containsKey(flag) || a[flag] != b[flag]) return false;
+    }
+    return true;
+  }
+
   if (oldState != null &&
       oldState.options.packagesFileUri == packagesFileUri &&
       oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
-      oldState.options.linkedDependencies[0] == sdkPlatformUri) {
+      oldState.options.linkedDependencies[0] == sdkPlatformUri &&
+      mapEqual(oldState.options.experimentalFlags, experimentalFlags)) {
     return oldState;
   }
 
@@ -109,7 +127,8 @@
     ..legacyMode = target.legacyMode
     ..linkedDependencies = [sdkPlatformUri]
     ..librariesSpecificationUri = librariesSpecificationUri
-    ..packagesFileUri = packagesFileUri;
+    ..packagesFileUri = packagesFileUri
+    ..experimentalFlags = experimentalFlags;
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
@@ -165,3 +184,23 @@
     return value;
   }
 }
+
+/// Retrieve the name of the libraries that are supported by [target] according
+/// to the libraries specification [json] file.
+///
+/// Dart2js uses these names to determine the value of library environment
+/// constants, such as `const bool.fromEnvironment("dart.library.io")`.
+// TODO(sigmund): refactor dart2js so that we can retrieve this data later in
+// the compilation pipeline. At that point we can get it from the CFE
+// results directly and completely hide the libraries specification file from
+// dart2js.
+// TODO(sigmund): delete after all constant evaluation is done in the CFE, as
+// this data will no longer be needed on the dart2js side.
+Iterable<String> getSupportedLibraryNames(
+    Uri librariesSpecificationUri, String json, String target) {
+  return LibrariesSpecification.parse(librariesSpecificationUri, json)
+      .specificationFor(target)
+      .allLibraries
+      .where((l) => l.isSupported)
+      .map((l) => l.name);
+}
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index dcc4c43..0a129d8 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -12,6 +12,8 @@
 
 import '../api_prototype/diagnostic_message.dart' show DiagnosticMessageHandler;
 
+import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+
 import '../api_prototype/file_system.dart' show FileSystem;
 
 import '../api_prototype/standard_file_system.dart' show StandardFileSystem;
@@ -26,6 +28,9 @@
 
 export '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
 
+export '../api_prototype/experimental_flags.dart'
+    show ExperimentalFlag, parseExperimentalFlag;
+
 export '../api_prototype/kernel_generator.dart' show kernelForComponent;
 
 export '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
@@ -56,9 +61,11 @@
     InitializedCompilerState oldState,
     Uri sdkSummary,
     Uri packagesFile,
+    Uri librariesSpecificationUri,
     List<Uri> inputSummaries,
     Target target,
-    {FileSystem fileSystem}) async {
+    {FileSystem fileSystem,
+    Map<ExperimentalFlag, bool> experiments}) async {
   inputSummaries.sort((a, b) => a.toString().compareTo(b.toString()));
   bool listEqual(List<Uri> a, List<Uri> b) {
     if (a.length != b.length) return false;
@@ -68,10 +75,21 @@
     return true;
   }
 
+  bool mapEqual(Map<ExperimentalFlag, bool> a, Map<ExperimentalFlag, bool> b) {
+    if (a == null || b == null) return a == b;
+    if (a.length != b.length) return false;
+    for (var flag in a.keys) {
+      if (!b.containsKey(flag) || a[flag] != b[flag]) return false;
+    }
+    return true;
+  }
+
   if (oldState != null &&
       oldState.options.sdkSummary == sdkSummary &&
       oldState.options.packagesFileUri == packagesFile &&
-      listEqual(oldState.options.inputSummaries, inputSummaries)) {
+      oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
+      listEqual(oldState.options.inputSummaries, inputSummaries) &&
+      mapEqual(oldState.options.experimentalFlags, experiments)) {
     // Reuse old state.
 
     // These libraries are marked external when compiling. If not un-marking
@@ -91,8 +109,10 @@
     ..sdkSummary = sdkSummary
     ..packagesFileUri = packagesFile
     ..inputSummaries = inputSummaries
+    ..librariesSpecificationUri = librariesSpecificationUri
     ..target = target
     ..fileSystem = fileSystem ?? StandardFileSystem.instance;
+  if (experiments != null) options.experimentalFlags = experiments;
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
index 710b58a..e9c843d 100644
--- a/pkg/front_end/lib/src/api_unstable/vm.dart
+++ b/pkg/front_end/lib/src/api_unstable/vm.dart
@@ -37,6 +37,7 @@
         messageConstEvalContext,
         messageConstEvalFailedAssertion,
         noLength,
+        templateConstEvalFreeTypeParameter,
         templateConstEvalDeferredLibrary,
         templateConstEvalDuplicateKey,
         templateConstEvalFailedAssertionWithMessage,
@@ -44,6 +45,7 @@
         templateConstEvalInvalidMethodInvocation,
         templateConstEvalInvalidStaticInvocation,
         templateConstEvalInvalidStringInterpolationOperand,
+        templateConstEvalInvalidSymbolName,
         templateConstEvalInvalidType,
         templateConstEvalNegativeShift,
         templateConstEvalNonConstantLiteral,
diff --git a/pkg/front_end/lib/src/base/libraries_specification.dart b/pkg/front_end/lib/src/base/libraries_specification.dart
index 2a25b30..7838eda 100644
--- a/pkg/front_end/lib/src/base/libraries_specification.dart
+++ b/pkg/front_end/lib/src/base/libraries_specification.dart
@@ -232,6 +232,8 @@
 
   /// Details about a library whose import is `dart:$name`.
   LibraryInfo libraryInfoFor(String name) => _libraries[name];
+
+  Iterable<LibraryInfo> get allLibraries => _libraries.values;
 }
 
 /// Information about a `dart:` library in a specific target platform.
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 9858ea16..4ef234d 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -24,6 +24,8 @@
 import '../api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 
+import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+
 import '../api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
@@ -103,16 +105,16 @@
   ///
   /// A summary, also referred to as "outline" internally, is a [Component]
   /// where all method bodies are left out. In essence, it contains just API
-  /// signatures and constants. When strong-mode is enabled, the summary
-  /// already includes inferred types.
+  /// signatures and constants. The summary should include inferred top-level
+  /// types unless legacy mode is enabled.
   Component _sdkSummaryComponent;
 
   /// The summary for each uri in `options.inputSummaries`.
   ///
   /// A summary, also referred to as "outline" internally, is a [Component]
   /// where all method bodies are left out. In essence, it contains just API
-  /// signatures and constants. When strong-mode is enabled, the summary
-  /// already includes inferred types.
+  /// signatures and constants. The summaries should include inferred top-level
+  /// types unless legacy mode is enabled.
   List<Component> _inputSummariesComponents;
 
   /// Other components that are meant to be linked and compiled with the input
@@ -159,6 +161,8 @@
 
   bool get debugDump => _raw.debugDump;
 
+  bool get omitPlatform => _raw.omitPlatform;
+
   bool get setExitCodeOnProblem => _raw.setExitCodeOnProblem;
 
   bool get embedSourceText => _raw.embedSourceText;
@@ -287,10 +291,18 @@
   /// Whether to generate bytecode.
   bool get bytecode => _raw.bytecode;
 
+  /// Whether to write a file (e.g. a dill file) when reporting a crash.
+  bool get writeFileOnCrashReport => _raw.writeFileOnCrashReport;
+
   Target _target;
   Target get target => _target ??=
       _raw.target ?? new NoneTarget(new TargetFlags(legacyMode: legacyMode));
 
+  bool isExperimentEnabled(ExperimentalFlag flag) {
+    // TODO(askesc): Determine default flag value from specification file.
+    return _raw.experimentalFlags[flag] ?? false;
+  }
+
   /// Get an outline component that summarizes the SDK, if any.
   // TODO(sigmund): move, this doesn't feel like an "option".
   Future<Component> loadSdkSummary(CanonicalName nameRoot) async {
diff --git a/pkg/front_end/lib/src/fasta/blacklisted_classes.dart b/pkg/front_end/lib/src/fasta/blacklisted_classes.dart
new file mode 100644
index 0000000..37dc7a7
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/blacklisted_classes.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// List of special classes in dart:core that can't be subclassed.
+const List<String> blacklistedCoreClasses = [
+  "bool",
+  "int",
+  "num",
+  "double",
+  "String",
+  "Null"
+];
diff --git a/pkg/front_end/lib/src/fasta/builder/builder.dart b/pkg/front_end/lib/src/fasta/builder/builder.dart
index 5abea63..70b361c 100644
--- a/pkg/front_end/lib/src/fasta/builder/builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builder.dart
@@ -46,6 +46,8 @@
 
 export 'modifier_builder.dart' show ModifierBuilder;
 
+export 'name_iterator.dart' show NameIterator;
+
 export 'named_type_builder.dart' show NamedTypeBuilder;
 
 export 'prefix_builder.dart' show PrefixBuilder;
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 8414d55..3c4f54a 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -61,6 +61,7 @@
   /// superclass.
   bool get isMixinApplication => mixedInType != null;
 
+  @override
   bool get isNamedMixinApplication {
     return isMixinApplication && super.isNamedMixinApplication;
   }
@@ -145,8 +146,6 @@
         wasHandled: wasHandled, context: context);
   }
 
-  void prepareTopLevelInference() {}
-
   /// Find the first member of this class with [name]. This method isn't
   /// suitable for scope lookups as it will throw an error if the name isn't
   /// declared. The [scope] should be used for that. This method is used to
diff --git a/pkg/front_end/lib/src/fasta/builder/declaration.dart b/pkg/front_end/lib/src/fasta/builder/declaration.dart
index d340033..1584102 100644
--- a/pkg/front_end/lib/src/fasta/builder/declaration.dart
+++ b/pkg/front_end/lib/src/fasta/builder/declaration.dart
@@ -60,6 +60,10 @@
 
   bool get isTypeVariable => false;
 
+  bool get isMixinApplication => false;
+
+  bool get isNamedMixinApplication => false;
+
   /// Applies [patch] to this declaration.
   void applyPatch(Declaration patch) {
     unsupported("${runtimeType}.applyPatch", charOffset, fileUri);
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index 8e780a5..fed33cf 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -26,8 +26,4 @@
   bool get hasInitializer;
 
   bool get isField => true;
-
-  bool get hasTypeInferredFromInitializer;
-
-  void prepareTopLevelInference() {}
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
index 033904e..587a7df 100644
--- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
@@ -25,13 +25,10 @@
 
   final String name;
 
-  /// True if this parameter is on the form `this.name`.
-  final bool hasThis;
-
   FormalParameterKind kind = FormalParameterKind.mandatory;
 
   FormalParameterBuilder(this.metadata, this.modifiers, this.type, this.name,
-      this.hasThis, LibraryBuilder compilationUnit, int charOffset)
+      LibraryBuilder compilationUnit, int charOffset)
       : super(compilationUnit, charOffset);
 
   String get debugName => "FormalParameterBuilder";
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index c631b0e..75fd906 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -27,6 +27,7 @@
         ClassBuilder,
         Declaration,
         ModifierBuilder,
+        NameIterator,
         PrefixBuilder,
         Scope,
         ScopeBuilder,
@@ -53,6 +54,8 @@
         exportScopeBuilder = new ScopeBuilder(exportScope),
         super(null, -1, fileUri);
 
+  bool get legacyMode => false;
+
   bool get isSynthetic => false;
 
   @override
@@ -71,10 +74,16 @@
   @override
   R get target;
 
-  bool get disableTypeInference => true;
-
   Uri get uri;
 
+  Iterator<Declaration> get iterator {
+    return LibraryLocalDeclarationIterator(this);
+  }
+
+  NameIterator get nameIterator {
+    return new LibraryLocalDeclarationNameIterator(this);
+  }
+
   Declaration addBuilder(String name, Declaration declaration, int charOffset);
 
   void addExporter(
@@ -174,7 +183,7 @@
     }
     throw internalProblem(
         templateInternalProblemConstructorNotFound.withArguments(
-            "$className::$constructorName", uri),
+            "$className.$constructorName", uri),
         -1,
         null);
   }
@@ -198,14 +207,6 @@
 
   void addSyntheticDeclarationOfDynamic();
 
-  void forEach(void f(String name, Declaration declaration)) {
-    scope.forEach((String name, Declaration declaration) {
-      if (declaration.parent == this) {
-        f(name, declaration);
-      }
-    });
-  }
-
   /// Don't use for scope lookup. Only use when an element is known to exist
   /// (and not a setter).
   Declaration operator [](String name) {
@@ -228,3 +229,39 @@
 
   void recordAccess(int charOffset, int length, Uri fileUri) {}
 }
+
+class LibraryLocalDeclarationIterator implements Iterator<Declaration> {
+  final LibraryBuilder library;
+  final Iterator<Declaration> iterator;
+
+  LibraryLocalDeclarationIterator(this.library)
+      : iterator = library.scope.iterator;
+
+  Declaration get current => iterator.current;
+
+  bool moveNext() {
+    while (iterator.moveNext()) {
+      if (current.parent == library) return true;
+    }
+    return false;
+  }
+}
+
+class LibraryLocalDeclarationNameIterator implements NameIterator {
+  final LibraryBuilder library;
+  final NameIterator iterator;
+
+  LibraryLocalDeclarationNameIterator(this.library)
+      : iterator = library.scope.nameIterator;
+
+  Declaration get current => iterator.current;
+
+  String get name => iterator.name;
+
+  bool moveNext() {
+    while (iterator.moveNext()) {
+      if (current.parent == library) return true;
+    }
+    return false;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
index c229560..0556c747 100644
--- a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
@@ -11,13 +11,15 @@
         covariantMask,
         externalMask,
         finalMask,
+        hasInitializerMask,
+        initializingFormalMask,
         namedMixinApplicationMask,
         staticMask;
 
 import 'builder.dart' show Declaration;
 
 abstract class ModifierBuilder extends Declaration {
-  final Declaration parent;
+  Declaration parent;
 
   final int charOffset;
 
@@ -44,6 +46,10 @@
     return (modifiers & namedMixinApplicationMask) != 0;
   }
 
+  bool get hasInitializer => (modifiers & hasInitializerMask) != 0;
+
+  bool get isInitializingFormal => (modifiers & initializingFormalMask) != 0;
+
   bool get isClassMember => false;
 
   String get name;
diff --git a/pkg/front_end/lib/src/fasta/builder/name_iterator.dart b/pkg/front_end/lib/src/fasta/builder/name_iterator.dart
new file mode 100644
index 0000000..9a93124
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/builder/name_iterator.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.name_iterator;
+
+import 'builder.dart' show Declaration;
+
+abstract class NameIterator implements Iterator<Declaration> {
+  String get name;
+}
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index aeb7fd1..e720b31 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -70,7 +70,7 @@
     if (formals == null) return parent;
     Map<String, Declaration> local = <String, Declaration>{};
     for (FormalParameterBuilder formal in formals) {
-      if (!isConstructor || !formal.hasThis) {
+      if (!isConstructor || !formal.isInitializingFormal) {
         local[formal.name] = formal;
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
index a7a9771..e4f8c41 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
@@ -29,8 +29,6 @@
 
   bool get isTypeDeclaration => true;
 
-  bool get isMixinApplication => false;
-
   @override
   String get fullNameForErrors => name;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index 4f3acc7..7d8cea1 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -14,7 +14,7 @@
 
   TypeVariableBuilder(
       String name, this.bound, LibraryBuilder compilationUnit, int charOffset)
-      : super(null, null, name, compilationUnit, charOffset);
+      : super(null, 0, name, compilationUnit, charOffset);
 
   bool get isTypeVariable => true;
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 5febe96..bba4295 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -4,7 +4,7 @@
 
 library fasta.dill_class_builder;
 
-import 'package:kernel/ast.dart' show Class, DartType, Member;
+import 'package:kernel/ast.dart' show Class, DartType, Member, Supertype;
 
 import '../problems.dart' show unimplemented;
 
@@ -18,10 +18,10 @@
 
 import '../modifier.dart' show abstractMask;
 
-import 'dill_member_builder.dart' show DillMemberBuilder;
-
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
+import 'dill_member_builder.dart' show DillMemberBuilder;
+
 class DillClassBuilder extends KernelClassBuilder {
   final Class cls;
 
@@ -36,11 +36,22 @@
             null,
             new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
                 parent.scope, "class ${cls.name}", isModifiable: false),
-            new Scope(<String, MemberBuilder>{}, null, null, "constructors",
+            new Scope(<String, MemberBuilder>{}, null, null, cls.name,
                 isModifiable: false),
             parent,
             cls.fileOffset);
 
+  KernelTypeBuilder get supertype {
+    KernelTypeBuilder supertype = super.supertype;
+    if (supertype == null) {
+      Supertype targetSupertype = cls.supertype;
+      if (targetSupertype == null) return null;
+      super.supertype =
+          supertype = computeTypeBuilder(library, targetSupertype);
+    }
+    return supertype;
+  }
+
   @override
   Class get actualCls => cls;
 
@@ -88,7 +99,9 @@
   /// superclass.
   bool get isMixinApplication => cls.isMixinApplication;
 
-  KernelTypeBuilder get mixedInType => unimplemented("mixedInType", -1, null);
+  KernelTypeBuilder get mixedInType {
+    return computeTypeBuilder(library, cls.mixedInType);
+  }
 
   void set mixedInType(KernelTypeBuilder mixin) {
     unimplemented("mixedInType=", -1, null);
@@ -98,3 +111,10 @@
 int computeModifiers(Class cls) {
   return cls.isAbstract ? abstractMask : 0;
 }
+
+KernelTypeBuilder computeTypeBuilder(
+    DillLibraryBuilder library, Supertype supertype) {
+  return supertype == null
+      ? null
+      : library.loader.computeTypeBuilder(supertype.asInterfaceType);
+}
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index 355da1a..4671069 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -12,6 +12,7 @@
         DartType,
         DynamicType,
         Field,
+        FunctionType,
         Library,
         ListLiteral,
         Member,
@@ -131,8 +132,17 @@
   }
 
   void addTypedef(Typedef typedef) {
-    var typedefBuilder = new DillFunctionTypeAliasBuilder(typedef, this);
-    addBuilder(typedef.name, typedefBuilder, typedef.fileOffset);
+    DartType alias = typedef.type;
+    if (alias is FunctionType) {
+      if (alias.typedefType == null) {
+        unhandled("null", "addTypedef", typedef.fileOffset, typedef.fileUri);
+      }
+      addBuilder(typedef.name, new DillFunctionTypeAliasBuilder(typedef, this),
+          typedef.fileOffset);
+    } else {
+      unhandled("${alias.runtimeType}", "addTypedef", typedef.fileOffset,
+          typedef.fileUri);
+    }
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index d033d7d..026c070 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -6,12 +6,37 @@
 
 import 'dart:async' show Future;
 
-import 'package:kernel/ast.dart' show Library, Component, Source;
+import 'package:kernel/ast.dart'
+    show
+        BottomType,
+        Class,
+        Component,
+        DartType,
+        DartTypeVisitor,
+        DynamicType,
+        FunctionType,
+        InterfaceType,
+        InvalidType,
+        Library,
+        Source,
+        TypeParameter,
+        TypeParameterType,
+        TypedefType,
+        VoidType;
 
 import '../fasta_codes.dart'
     show SummaryTemplate, Template, templateDillOutlineSummary;
 
-import '../kernel/kernel_builder.dart' show LibraryBuilder;
+import '../compiler_context.dart' show CompilerContext;
+
+import '../kernel/kernel_builder.dart'
+    show
+        DynamicTypeBuilder,
+        KernelNamedTypeBuilder,
+        KernelTypeBuilder,
+        KernelTypeVariableBuilder,
+        LibraryBuilder,
+        VoidTypeBuilder;
 
 import '../loader.dart' show Loader;
 
@@ -19,6 +44,8 @@
 
 import '../target_implementation.dart' show TargetImplementation;
 
+import 'dill_class_builder.dart' show DillClassBuilder;
+
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
 class DillLoader extends Loader<Library> {
@@ -26,9 +53,11 @@
   final libraries = <Library>[];
 
   /// Sources for all appended components.
-  final Map<Uri, Source> uriToSource = <Uri, Source>{};
+  final Map<Uri, Source> uriToSource;
 
-  DillLoader(TargetImplementation target) : super(target);
+  DillLoader(TargetImplementation target)
+      : uriToSource = CompilerContext.current.uriToSource,
+        super(target);
 
   Template<SummaryTemplate> get outlineSummaryTemplate =>
       templateDillOutlineSummary;
@@ -71,4 +100,72 @@
       library.finalizeExports();
     });
   }
+
+  KernelTypeBuilder computeTypeBuilder(DartType type) {
+    return type.accept(new TypeBuilderComputer(this));
+  }
+}
+
+class TypeBuilderComputer implements DartTypeVisitor<KernelTypeBuilder> {
+  final DillLoader loader;
+
+  const TypeBuilderComputer(this.loader);
+
+  KernelTypeBuilder defaultDartType(DartType node) {
+    throw "Unsupported";
+  }
+
+  KernelTypeBuilder visitInvalidType(InvalidType node) {
+    throw "Not implemented";
+  }
+
+  KernelTypeBuilder visitDynamicType(DynamicType node) {
+    return new KernelNamedTypeBuilder("dynamic", null)
+      ..bind(new DynamicTypeBuilder<KernelTypeBuilder, DartType>(
+          const DynamicType(), loader.coreLibrary, -1));
+  }
+
+  KernelTypeBuilder visitVoidType(VoidType node) {
+    return new KernelNamedTypeBuilder("dynamic", null)
+      ..bind(new VoidTypeBuilder<KernelTypeBuilder, VoidType>(
+          const VoidType(), loader.coreLibrary, -1));
+  }
+
+  KernelTypeBuilder visitBottomType(BottomType node) {
+    throw "Not implemented";
+  }
+
+  KernelTypeBuilder visitInterfaceType(InterfaceType node) {
+    Class kernelClass = node.classNode;
+    Library kernelLibrary = kernelClass.enclosingLibrary;
+    DillLibraryBuilder library = loader.builders[kernelLibrary.importUri];
+    String name = kernelClass.name;
+    DillClassBuilder cls = library[name];
+    List<KernelTypeBuilder> arguments;
+    List<DartType> kernelArguments = node.typeArguments;
+    if (kernelArguments.isNotEmpty) {
+      arguments = new List<KernelTypeBuilder>(kernelArguments.length);
+      for (int i = 0; i < kernelArguments.length; i++) {
+        arguments[i] = kernelArguments[i].accept(this);
+      }
+    }
+    return new KernelNamedTypeBuilder(name, arguments)..bind(cls);
+  }
+
+  KernelTypeBuilder visitFunctionType(FunctionType node) {
+    throw "Not implemented";
+  }
+
+  KernelTypeBuilder visitTypeParameterType(TypeParameterType node) {
+    TypeParameter parameter = node.parameter;
+    Class kernelClass = parameter.parent;
+    Library kernelLibrary = kernelClass.enclosingLibrary;
+    DillLibraryBuilder library = loader.builders[kernelLibrary.importUri];
+    return new KernelNamedTypeBuilder(parameter.name, null)
+      ..bind(new KernelTypeVariableBuilder.fromKernel(parameter, library));
+  }
+
+  KernelTypeBuilder visitTypedefType(TypedefType node) {
+    throw "Not implemented";
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
index 7b54cd3..cfd35fb 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_member_builder.dart
@@ -62,6 +62,8 @@
         name == "" &&
         (charOffset == parent.charOffset || charOffset == -1);
   }
+
+  bool get isField => member is Field;
 }
 
 int computeModifiers(Member member) {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_target.dart b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
index bae16f6..63348b0 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_target.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
@@ -58,8 +58,5 @@
   }
 
   @override
-  void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) {}
-
-  @override
   void breakCycle(ClassBuilder cls) {}
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
index 63616f8..a395dca 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_typedef_builder.dart
@@ -4,7 +4,7 @@
 
 library fasta.dill_typedef_builder;
 
-import 'package:kernel/ast.dart' show DartType, FunctionType, Typedef;
+import 'package:kernel/ast.dart' show DartType, Typedef;
 
 import '../kernel/kernel_builder.dart'
     show
@@ -36,17 +36,7 @@
   }
 
   @override
-  DartType buildThisType(LibraryBuilder library) {
-    if (thisType != null) return thisType;
-
-    DartType targetType = target.type;
-    if (targetType is FunctionType) {
-      // TODO(34655):  The line below is a workaround.  Find the place where the
-      // reference is lost and fix it.
-      targetType.typedefReference = target.reference;
-    }
-    return thisType = targetType;
-  }
+  DartType buildThisType(LibraryBuilder library) => thisType ??= target.type;
 
   @override
   List<DartType> buildTypeArguments(
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes.dart b/pkg/front_end/lib/src/fasta/fasta_codes.dart
index a3dcb56..2fe4551 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes.dart
@@ -7,12 +7,12 @@
 import 'package:kernel/ast.dart'
     show Constant, DartType, demangleMixinApplicationName;
 
-import 'package:kernel/text/ast_to_text.dart' show NameSystem, Printer;
-
 import '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
 
 import '../scanner/token.dart' show Token;
 
+import 'kernel/type_labeler.dart';
+
 import 'severity.dart' show Severity;
 
 import 'util/relativize.dart' as util show relativizeUri;
@@ -194,3 +194,14 @@
 }
 
 typedef SummaryTemplate = Message Function(int, int, num, num, num);
+
+String itemizeNames(List<String> names) {
+  StringBuffer buffer = new StringBuffer();
+  for (int i = 0; i < names.length - 1; i++) {
+    buffer.write(" - ");
+    buffer.writeln(names[i]);
+  }
+  buffer.write(" - ");
+  buffer.write(names.last);
+  return "$buffer";
+}
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index 6769e5c..3712941 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -122,18 +122,14 @@
     String name, DartType _type, DartType _type2) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeAmbiguousSupertypes,
-      message: """'${name}' can't implement both '${type}' and '${type2}'""",
+      message: """'${name}' can't implement both '${type}' and '${type2}'""" +
+          labeler.originMessages,
       arguments: {'name': name, 'type': _type, 'type2': _type2});
 }
 
@@ -181,19 +177,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsArgumentTypeNotAssignable(
     DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeArgumentTypeNotAssignable,
       message:
-          """The argument type '${type}' can't be assigned to the parameter type '${type2}'.""",
+          """The argument type '${type}' can't be assigned to the parameter type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Try changing the type of the parameter, or casting the argument to '${type2}'.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -679,7 +671,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCatchSyntax = const MessageCode("CatchSyntax",
-    analyzerCodes: <String>["CATCH_SYNTAX"],
+    index: 84,
     message:
         r"""'catch' must be followed by '(identifier)' or '(identifier, identifier)'.""",
     tip:
@@ -692,7 +684,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageCatchSyntaxExtraParameters = const MessageCode(
     "CatchSyntaxExtraParameters",
-    analyzerCodes: <String>["CATCH_SYNTAX"],
+    index: 83,
     message:
         r"""'catch' must be followed by '(identifier)' or '(identifier, identifier)'.""",
     tip:
@@ -931,18 +923,6 @@
         r"""Try removing the 'const' keyword. If you're trying to indicate that instances of the class can be constants, place the 'const' keyword on  the class' constructor(s).""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeConstConstructorInSubclassOfMixinApplication =
-    messageConstConstructorInSubclassOfMixinApplication;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageConstConstructorInSubclassOfMixinApplication =
-    const MessageCode("ConstConstructorInSubclassOfMixinApplication",
-        analyzerCodes: <String>[
-      "CONST_CONSTRUCTOR_IN_SUBCLASS_OF_MIXIN_APPLICATION"
-    ],
-        message: r"""Can't extend a mixin application and be 'const'.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeConstConstructorNonFinalField =
     messageConstConstructorNonFinalField;
 
@@ -1051,15 +1031,13 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalDuplicateKey(Constant _constant) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_constant);
-  String constant = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  String constant = constantParts.join();
   return new Message(codeConstEvalDuplicateKey,
       message:
-          """The key '${constant}' conflicts with another existing key in the map.""",
+          """The key '${constant}' conflicts with another existing key in the map.""" +
+              labeler.originMessages,
       arguments: {'constant': _constant});
 }
 
@@ -1098,6 +1076,35 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
+        DartType
+            _type)> templateConstEvalFreeTypeParameter = const Template<
+        Message Function(DartType _type)>(
+    messageTemplate:
+        r"""The type '#type' is not a constant because it depends on a type parameter, only instantiated types are allowed.""",
+    withArguments: _withArgumentsConstEvalFreeTypeParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(DartType _type)> codeConstEvalFreeTypeParameter =
+    const Code<Message Function(DartType _type)>(
+  "ConstEvalFreeTypeParameter",
+  templateConstEvalFreeTypeParameter,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalFreeTypeParameter(DartType _type) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
+  return new Message(codeConstEvalFreeTypeParameter,
+      message:
+          """The type '${type}' is not a constant because it depends on a type parameter, only instantiated types are allowed.""" +
+              labeler.originMessages,
+      arguments: {'type': _type});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
         String string,
         Constant _constant,
         DartType _type,
@@ -1123,23 +1130,17 @@
 Message _withArgumentsConstEvalInvalidBinaryOperandType(
     String string, Constant _constant, DartType _type, DartType _type2) {
   if (string.isEmpty) throw 'No string provided';
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_constant);
-  String constant = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String constant = constantParts.join();
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeConstEvalInvalidBinaryOperandType,
       message:
-          """Binary operator '${string}' on '${constant}' requires operand of type '${type}', but was of type '${type2}'.""",
+          """Binary operator '${string}' on '${constant}' requires operand of type '${type}', but was of type '${type2}'.""" +
+              labeler.originMessages,
       arguments: {
         'string': string,
         'constant': _constant,
@@ -1171,15 +1172,13 @@
 Message _withArgumentsConstEvalInvalidMethodInvocation(
     String string, Constant _constant) {
   if (string.isEmpty) throw 'No string provided';
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_constant);
-  String constant = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  String constant = constantParts.join();
   return new Message(codeConstEvalInvalidMethodInvocation,
       message:
-          """The method '${string}' can't be invoked on '${constant}' within a const context.""",
+          """The method '${string}' can't be invoked on '${constant}' within a const context.""" +
+              labeler.originMessages,
       arguments: {'string': string, 'constant': _constant});
 }
 
@@ -1230,15 +1229,42 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidStringInterpolationOperand(
     Constant _constant) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_constant);
-  String constant = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  String constant = constantParts.join();
   return new Message(codeConstEvalInvalidStringInterpolationOperand,
       message:
-          """The '${constant}' can't be used as part of a string interpolation within a const context, only values of type 'null', 'bool', 'int', 'double', or 'String' can be used.""",
+          """The '${constant}' can't be used as part of a string interpolation within a const context, only values of type 'null', 'bool', 'int', 'double', or 'String' can be used.""" +
+              labeler.originMessages,
+      arguments: {'constant': _constant});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        Constant
+            _constant)> templateConstEvalInvalidSymbolName = const Template<
+        Message Function(Constant _constant)>(
+    messageTemplate:
+        r"""The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '#constant'.""",
+    withArguments: _withArgumentsConstEvalInvalidSymbolName);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(Constant _constant)>
+    codeConstEvalInvalidSymbolName =
+    const Code<Message Function(Constant _constant)>(
+        "ConstEvalInvalidSymbolName", templateConstEvalInvalidSymbolName,
+        analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalInvalidSymbolName(Constant _constant) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  String constant = constantParts.join();
+  return new Message(codeConstEvalInvalidSymbolName,
+      message:
+          """The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '${constant}'.""" +
+              labeler.originMessages,
       arguments: {'constant': _constant});
 }
 
@@ -1266,23 +1292,17 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsConstEvalInvalidType(
     Constant _constant, DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_constant);
-  String constant = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> constantParts = labeler.labelConstant(_constant);
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String constant = constantParts.join();
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeConstEvalInvalidType,
       message:
-          """Expected constant '${constant}' to be of type '${type}', but was of type '${type2}'.""",
+          """Expected constant '${constant}' to be of type '${type}', but was of type '${type2}'.""" +
+              labeler.originMessages,
       arguments: {'constant': _constant, 'type': _type, 'type2': _type2});
 }
 
@@ -1734,27 +1754,24 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name, String string)>
-    templateCyclicClassHierarchy =
-    const Template<Message Function(String name, String string)>(
-        messageTemplate: r"""'#name' is a supertype of itself via '#string'.""",
+const Template<Message Function(String name)> templateCyclicClassHierarchy =
+    const Template<Message Function(String name)>(
+        messageTemplate: r"""'#name' is a supertype of itself.""",
         withArguments: _withArgumentsCyclicClassHierarchy);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, String string)>
-    codeCyclicClassHierarchy =
-    const Code<Message Function(String name, String string)>(
+const Code<Message Function(String name)> codeCyclicClassHierarchy =
+    const Code<Message Function(String name)>(
         "CyclicClassHierarchy", templateCyclicClassHierarchy,
         analyzerCodes: <String>["RECURSIVE_INTERFACE_INHERITANCE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsCyclicClassHierarchy(String name, String string) {
+Message _withArgumentsCyclicClassHierarchy(String name) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
-  if (string.isEmpty) throw 'No string provided';
   return new Message(codeCyclicClassHierarchy,
-      message: """'${name}' is a supertype of itself via '${string}'.""",
-      arguments: {'name': name, 'string': string});
+      message: """'${name}' is a supertype of itself.""",
+      arguments: {'name': name});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1935,17 +1952,15 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsDeferredTypeAnnotation(DartType _type, String name) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
+  String type = typeParts.join();
   return new Message(codeDeferredTypeAnnotation,
       message:
-          """The type '${type}' is deferred loaded via prefix '${name}' and can't be used as a type annotation.""",
+          """The type '${type}' is deferred loaded via prefix '${name}' and can't be used as a type annotation.""" +
+              labeler.originMessages,
       tip: """Try removing 'deferred' from the import of '${name}' or use a supertype of '${type}' that isn't deferred.""",
       arguments: {'type': _type, 'name': name});
 }
@@ -2026,28 +2041,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name)>
-    templateDirectCyclicClassHierarchy =
-    const Template<Message Function(String name)>(
-        messageTemplate: r"""'#name' can't use itself as a supertype.""",
-        withArguments: _withArgumentsDirectCyclicClassHierarchy);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeDirectCyclicClassHierarchy =
-    const Code<Message Function(String name)>(
-        "DirectCyclicClassHierarchy", templateDirectCyclicClassHierarchy,
-        analyzerCodes: <String>["RECURSIVE_INTERFACE_INHERITANCE"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsDirectCyclicClassHierarchy(String name) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeDirectCyclicClassHierarchy,
-      message: """'${name}' can't use itself as a supertype.""",
-      arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeDirectiveAfterDeclaration =
     messageDirectiveAfterDeclaration;
 
@@ -3111,7 +3104,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalConstructorWithBody = const MessageCode(
     "ExternalConstructorWithBody",
-    analyzerCodes: <String>["EXTERNAL_CONSTRUCTOR_WITH_BODY"],
+    index: 87,
     message: r"""External constructors can't have a body.""",
     tip:
         r"""Try removing the body of the constructor, or removing the keyword 'external'.""");
@@ -3144,7 +3137,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalFactoryRedirection = const MessageCode(
     "ExternalFactoryRedirection",
-    analyzerCodes: <String>["EXTERNAL_CONSTRUCTOR_WITH_BODY"],
+    index: 85,
     message: r"""A redirecting factory can't be external.""",
     tip: r"""Try removing the 'external' modifier.""");
 
@@ -3154,7 +3147,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageExternalFactoryWithBody = const MessageCode(
     "ExternalFactoryWithBody",
-    analyzerCodes: <String>["EXTERNAL_CONSTRUCTOR_WITH_BODY"],
+    index: 86,
     message: r"""External factories can't have a body.""",
     tip:
         r"""Try removing the body of the factory, or removing the keyword 'external'.""");
@@ -3217,80 +3210,6 @@
     message: r"""Factory bodies can't use 'async', 'async*', or 'sync*'.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name, int count)>
-    templateFactoryRedirecteeHasTooFewPositionalParameters =
-    const Template<Message Function(String name, int count)>(
-        messageTemplate:
-            r"""Redirection target '#name' accepts fewer arguments ('#count') than the redirecting factory can provide.""",
-        tipTemplate: r"""Try redirecting to a different constructor.""",
-        withArguments:
-            _withArgumentsFactoryRedirecteeHasTooFewPositionalParameters);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, int count)>
-    codeFactoryRedirecteeHasTooFewPositionalParameters =
-    const Code<Message Function(String name, int count)>(
-        "FactoryRedirecteeHasTooFewPositionalParameters",
-        templateFactoryRedirecteeHasTooFewPositionalParameters,
-        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFactoryRedirecteeHasTooFewPositionalParameters(
-    String name, int count) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (count == null) throw 'No count provided';
-  return new Message(codeFactoryRedirecteeHasTooFewPositionalParameters,
-      message:
-          """Redirection target '${name}' accepts fewer arguments ('${count}') than the redirecting factory can provide.""",
-      tip: """Try redirecting to a different constructor.""",
-      arguments: {'name': name, 'count': count});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-    Message Function(
-        DartType _type,
-        String name,
-        DartType
-            _type2)> templateFactoryRedirecteeInvalidReturnType = const Template<
-        Message Function(DartType _type, String name, DartType _type2)>(
-    messageTemplate:
-        r"""The return type '#type' of the constructor '#name' isn't a subtype of '#type2'.""",
-    tipTemplate: r"""Try redirecting to a different constructor.""",
-    withArguments: _withArgumentsFactoryRedirecteeInvalidReturnType);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, String name, DartType _type2)>
-    codeFactoryRedirecteeInvalidReturnType =
-    const Code<Message Function(DartType _type, String name, DartType _type2)>(
-        "FactoryRedirecteeInvalidReturnType",
-        templateFactoryRedirecteeInvalidReturnType,
-        analyzerCodes: <String>["REDIRECT_TO_INVALID_RETURN_TYPE"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFactoryRedirecteeInvalidReturnType(
-    DartType _type, String name, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
-  return new Message(codeFactoryRedirecteeInvalidReturnType,
-      message:
-          """The return type '${type}' of the constructor '${name}' isn't a subtype of '${type2}'.""",
-      tip: """Try redirecting to a different constructor.""",
-      arguments: {'type': _type, 'name': name, 'type2': _type2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFactoryTopLevelDeclaration =
     messageFactoryTopLevelDeclaration;
 
@@ -3365,6 +3284,9 @@
   --dump-ir
     Print compiled libraries in Kernel source notation.
 
+  --omit-platform
+    Exclude the platform from the serialized dill file.
+
   --bytecode
     Generate bytecode. Supported only for SDK platform compilation.
 
@@ -3398,7 +3320,12 @@
     Makes messages of the given kinds fatal, that is, immediately stop the
     compiler with a non-zero exit-code. In --verbose mode, also display an
     internal stack trace from the compiler. Multiple kinds can be separated by
-    commas, for example, --fatal=errors,warnings.""");
+    commas, for example, --fatal=errors,warnings.
+
+  --enable-experiment=<flag>
+    Enable or disable an experimental flag, used to guard features currently
+    in development. Prefix an experiment name with 'no-' to disable it.
+    Multiple experiments can be separated by commas.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFastaUsageShort = messageFastaUsageShort;
@@ -3411,6 +3338,18 @@
   -h        Display this message (add -v for information about all options).""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeFieldInitializedOutsideDeclaringClass =
+    messageFieldInitializedOutsideDeclaringClass;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageFieldInitializedOutsideDeclaringClass = const MessageCode(
+    "FieldInitializedOutsideDeclaringClass",
+    index: 88,
+    message: r"""A field can only be initialized in it's declaring class""",
+    tip:
+        r"""Try passing a value into the superclass constructor, or moving the initialization into the constructor body.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeFieldInitializerOutsideConstructor =
     messageFieldInitializerOutsideConstructor;
 
@@ -3437,7 +3376,7 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageFinalAndVar = const MessageCode("FinalAndVar",
-    analyzerCodes: <String>["FINAL_AND_VAR"],
+    index: 81,
     message: r"""Members can't be declared to be both 'final' and 'var'.""",
     tip: r"""Try removing the keyword 'var'.""");
 
@@ -3605,19 +3544,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsForInLoopElementTypeNotAssignable(
     DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeForInLoopElementTypeNotAssignable,
       message:
-          """A value of type '${type}' can't be assigned to a variable of type '${type2}'.""",
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Try changing the type of the variable.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -3661,19 +3596,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsForInLoopTypeNotIterable(
     DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeForInLoopTypeNotIterable,
       message:
-          """The type '${type}' used in the 'for' loop must implement '${type2}'.""",
+          """The type '${type}' used in the 'for' loop must implement '${type2}'.""" +
+              labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -3751,15 +3682,13 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsGenericFunctionTypeInferredAsActualTypeArgument(
     DartType _type) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
   return new Message(codeGenericFunctionTypeInferredAsActualTypeArgument,
       message:
-          """Unexpected generic function type '${type}' inferred as a type argument.""",
+          """Unexpected generic function type '${type}' inferred as a type argument.""" +
+              labeler.originMessages,
       tip: """Try providing a non-generic function type explicitly.""",
       arguments: {'type': _type});
 }
@@ -4049,15 +3978,13 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsImplicitCallOfNonMethod(DartType _type) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
   return new Message(codeImplicitCallOfNonMethod,
       message:
-          """Cannot invoke an instance of '${type}' because it declares 'call' to be something other than a method.""",
+          """Cannot invoke an instance of '${type}' because it declares 'call' to be something other than a method.""" +
+              labeler.originMessages,
       tip: """Try changing 'call' to a method or explicitly invoke 'call'.""",
       arguments: {'type': _type});
 }
@@ -4132,213 +4059,433 @@
 const Template<
     Message Function(
         DartType _type,
-        String
-            name)> templateIncorrectTypeArgument = const Template<
-        Message Function(DartType _type, String name)>(
+        DartType
+            _type2)> templateIncompatibleRedirecteeFunctionType = const Template<
+        Message Function(DartType _type, DartType _type2)>(
     messageTemplate:
-        r"""Type argument '#type' violates the corresponding type variable bound of '#name'.""",
-    tipTemplate:
-        r"""Try changing type arguments so that they conform to the bounds.""",
-    withArguments: _withArgumentsIncorrectTypeArgument);
+        r"""The constructor function type '#type' isn't a subtype of '#type2'.""",
+    withArguments: _withArgumentsIncompatibleRedirecteeFunctionType);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, String name)>
-    codeIncorrectTypeArgument =
-    const Code<Message Function(DartType _type, String name)>(
-        "IncorrectTypeArgument", templateIncorrectTypeArgument,
-        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
+const Code<Message Function(DartType _type, DartType _type2)>
+    codeIncompatibleRedirecteeFunctionType =
+    const Code<Message Function(DartType _type, DartType _type2)>(
+        "IncompatibleRedirecteeFunctionType",
+        templateIncompatibleRedirecteeFunctionType,
+        analyzerCodes: <String>["REDIRECT_TO_INVALID_TYPE"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgument(DartType _type, String name) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  return new Message(codeIncorrectTypeArgument,
+Message _withArgumentsIncompatibleRedirecteeFunctionType(
+    DartType _type, DartType _type2) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeIncompatibleRedirecteeFunctionType,
       message:
-          """Type argument '${type}' violates the corresponding type variable bound of '${name}'.""",
-      tip: """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {'type': _type, 'name': name});
+          """The constructor function type '${type}' isn't a subtype of '${type2}'.""" +
+              labeler.originMessages,
+      arguments: {'type': _type, 'type2': _type2});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         DartType _type,
+        DartType _type2,
+        String name,
         String
-            name)> templateIncorrectTypeArgumentInReturnType = const Template<
-        Message Function(DartType _type, String name)>(
+            name2)> templateIncorrectTypeArgument = const Template<
+        Message Function(
+            DartType _type, DartType _type2, String name, String name2)>(
     messageTemplate:
-        r"""Type argument '#type' violates the corresponding type variable bound of '#name' in the return type.""",
+        r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
+    tipTemplate:
+        r"""Try changing type arguments so that they conform to the bounds.""",
+    withArguments: _withArgumentsIncorrectTypeArgument);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, String name, String name2)>
+    codeIncorrectTypeArgument = const Code<
+            Message Function(
+                DartType _type, DartType _type2, String name, String name2)>(
+        "IncorrectTypeArgument", templateIncorrectTypeArgument,
+        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsIncorrectTypeArgument(
+    DartType _type, DartType _type2, String name, String name2) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  return new Message(codeIncorrectTypeArgument,
+      message:
+          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}'.""" +
+              labeler.originMessages,
+      tip: """Try changing type arguments so that they conform to the bounds.""",
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'name': name,
+        'name2': name2
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        DartType _type,
+        DartType _type2,
+        String name,
+        String
+            name2)> templateIncorrectTypeArgumentInReturnType = const Template<
+        Message Function(
+            DartType _type, DartType _type2, String name, String name2)>(
+    messageTemplate:
+        r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type.""",
     tipTemplate:
         r"""Try changing type arguments so that they conform to the bounds.""",
     withArguments: _withArgumentsIncorrectTypeArgumentInReturnType);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, String name)>
-    codeIncorrectTypeArgumentInReturnType =
-    const Code<Message Function(DartType _type, String name)>(
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, String name, String name2)>
+    codeIncorrectTypeArgumentInReturnType = const Code<
+            Message Function(
+                DartType _type, DartType _type2, String name, String name2)>(
         "IncorrectTypeArgumentInReturnType",
         templateIncorrectTypeArgumentInReturnType,
         analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsIncorrectTypeArgumentInReturnType(
-    DartType _type, String name) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+    DartType _type, DartType _type2, String name, String name2) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgumentInReturnType,
       message:
-          """Type argument '${type}' violates the corresponding type variable bound of '${name}' in the return type.""",
+          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the return type.""" +
+              labeler.originMessages,
       tip: """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {'type': _type, 'name': name});
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'name': name,
+        'name2': name2
+      });
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         DartType _type,
+        DartType _type2,
         String name,
         String name2,
+        String name3,
         String
-            name3)> templateIncorrectTypeArgumentInSupertype = const Template<
-        Message Function(
-            DartType _type, String name, String name2, String name3)>(
+            name4)> templateIncorrectTypeArgumentInSupertype = const Template<
+        Message Function(DartType _type, DartType _type2, String name,
+            String name2, String name3, String name4)>(
     messageTemplate:
-        r"""Type argument '#type' violates the corresponding type variable bound of '#name' in the supertype '#name2' of class '#name3'.""",
+        r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
     tipTemplate:
         r"""Try changing type arguments so that they conform to the bounds.""",
     withArguments: _withArgumentsIncorrectTypeArgumentInSupertype);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<
-        Message Function(
-            DartType _type, String name, String name2, String name3)>
+        Message Function(DartType _type, DartType _type2, String name,
+            String name2, String name3, String name4)>
     codeIncorrectTypeArgumentInSupertype = const Code<
-            Message Function(
-                DartType _type, String name, String name2, String name3)>(
+            Message Function(DartType _type, DartType _type2, String name,
+                String name2, String name3, String name4)>(
         "IncorrectTypeArgumentInSupertype",
         templateIncorrectTypeArgumentInSupertype,
         analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInSupertype(
-    DartType _type, String name, String name2, String name3) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+Message _withArgumentsIncorrectTypeArgumentInSupertype(DartType _type,
+    DartType _type2, String name, String name2, String name3, String name4) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   if (name3.isEmpty) throw 'No name provided';
   name3 = demangleMixinApplicationName(name3);
+  if (name4.isEmpty) throw 'No name provided';
+  name4 = demangleMixinApplicationName(name4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgumentInSupertype,
       message:
-          """Type argument '${type}' violates the corresponding type variable bound of '${name}' in the supertype '${name2}' of class '${name3}'.""",
-      tip: """Try changing type arguments so that they conform to the bounds.""",
-      arguments: {'type': _type, 'name': name, 'name2': name2, 'name3': name3});
+          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
+              labeler.originMessages,
+      tip:
+          """Try changing type arguments so that they conform to the bounds.""",
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'name': name,
+        'name2': name2,
+        'name3': name3,
+        'name4': name4
+      });
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         DartType _type,
+        DartType _type2,
         String name,
         String name2,
+        String name3,
         String
-            name3)> templateIncorrectTypeArgumentInSupertypeInferred = const Template<
-        Message Function(DartType _type, String name, String name2,
-            String name3)>(
+            name4)> templateIncorrectTypeArgumentInSupertypeInferred = const Template<
+        Message Function(
+            DartType _type,
+            DartType _type2,
+            String name,
+            String name2,
+            String name3,
+            String
+                name4)>(
     messageTemplate:
-        r"""Inferred type argument '#type' violates the corresponding type variable bound of '#name' in the supertype '#name2' of class '#name3'.""",
+        r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'.""",
     tipTemplate:
         r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
     withArguments: _withArgumentsIncorrectTypeArgumentInSupertypeInferred);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<
-        Message Function(
-            DartType _type, String name, String name2, String name3)>
+        Message Function(DartType _type, DartType _type2, String name,
+            String name2, String name3, String name4)>
     codeIncorrectTypeArgumentInSupertypeInferred = const Code<
-            Message Function(
-                DartType _type, String name, String name2, String name3)>(
+            Message Function(DartType _type, DartType _type2, String name,
+                String name2, String name3, String name4)>(
         "IncorrectTypeArgumentInSupertypeInferred",
         templateIncorrectTypeArgumentInSupertypeInferred,
         analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsIncorrectTypeArgumentInSupertypeInferred(
-    DartType _type, String name, String name2, String name3) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+Message _withArgumentsIncorrectTypeArgumentInSupertypeInferred(DartType _type,
+    DartType _type2, String name, String name2, String name3, String name4) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
   if (name3.isEmpty) throw 'No name provided';
   name3 = demangleMixinApplicationName(name3);
+  if (name4.isEmpty) throw 'No name provided';
+  name4 = demangleMixinApplicationName(name4);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgumentInSupertypeInferred,
       message:
-          """Inferred type argument '${type}' violates the corresponding type variable bound of '${name}' in the supertype '${name2}' of class '${name3}'.""",
-      tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
-      arguments: {'type': _type, 'name': name, 'name2': name2, 'name3': name3});
+          """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}' in the supertype '${name3}' of class '${name4}'.""" +
+              labeler.originMessages,
+      tip:
+          """Try specifying type arguments explicitly so that they conform to the bounds.""",
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'name': name,
+        'name2': name2,
+        'name3': name3,
+        'name4': name4
+      });
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
         DartType _type,
+        DartType _type2,
+        String name,
         String
-            name)> templateIncorrectTypeArgumentInferred = const Template<
-        Message Function(DartType _type,
-            String name)>(
+            name2)> templateIncorrectTypeArgumentInferred = const Template<
+        Message Function(
+            DartType _type, DartType _type2, String name, String name2)>(
     messageTemplate:
-        r"""Inferred type argument '#type' violates the corresponding type variable bound of '#name'.""",
+        r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'.""",
     tipTemplate:
         r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
     withArguments: _withArgumentsIncorrectTypeArgumentInferred);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(DartType _type, String name)>
-    codeIncorrectTypeArgumentInferred =
-    const Code<Message Function(DartType _type, String name)>(
+const Code<
+        Message Function(
+            DartType _type, DartType _type2, String name, String name2)>
+    codeIncorrectTypeArgumentInferred = const Code<
+            Message Function(
+                DartType _type, DartType _type2, String name, String name2)>(
         "IncorrectTypeArgumentInferred", templateIncorrectTypeArgumentInferred,
         analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsIncorrectTypeArgumentInferred(
-    DartType _type, String name) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+    DartType _type, DartType _type2, String name, String name2) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeIncorrectTypeArgumentInferred,
       message:
-          """Inferred type argument '${type}' violates the corresponding type variable bound of '${name}'.""",
+          """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${name2}'.""" +
+              labeler.originMessages,
       tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
-      arguments: {'type': _type, 'name': name});
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'name': name,
+        'name2': name2
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        DartType _type,
+        DartType _type2,
+        String name,
+        DartType _type3,
+        String
+            name2)> templateIncorrectTypeArgumentQualified = const Template<
+        Message Function(
+            DartType _type,
+            DartType _type2,
+            String name,
+            DartType _type3,
+            String
+                name2)>(
+    messageTemplate:
+        r"""Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'.""",
+    tipTemplate:
+        r"""Try changing type arguments so that they conform to the bounds.""",
+    withArguments: _withArgumentsIncorrectTypeArgumentQualified);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, String name,
+            DartType _type3, String name2)> codeIncorrectTypeArgumentQualified =
+    const Code<
+            Message Function(DartType _type, DartType _type2, String name,
+                DartType _type3, String name2)>(
+        "IncorrectTypeArgumentQualified",
+        templateIncorrectTypeArgumentQualified,
+        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsIncorrectTypeArgumentQualified(DartType _type,
+    DartType _type2, String name, DartType _type3, String name2) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  return new Message(codeIncorrectTypeArgumentQualified,
+      message:
+          """Type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}.${name2}'.""" +
+              labeler.originMessages,
+      tip: """Try changing type arguments so that they conform to the bounds.""",
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'name': name,
+        'type3': _type3,
+        'name2': name2
+      });
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        DartType _type,
+        DartType _type2,
+        String name,
+        DartType _type3,
+        String
+            name2)> templateIncorrectTypeArgumentQualifiedInferred = const Template<
+        Message Function(DartType _type, DartType _type2, String name,
+            DartType _type3, String name2)>(
+    messageTemplate:
+        r"""Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'.""",
+    tipTemplate:
+        r"""Try specifying type arguments explicitly so that they conform to the bounds.""",
+    withArguments: _withArgumentsIncorrectTypeArgumentQualifiedInferred);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<
+        Message Function(DartType _type, DartType _type2, String name,
+            DartType _type3, String name2)>
+    codeIncorrectTypeArgumentQualifiedInferred = const Code<
+            Message Function(DartType _type, DartType _type2, String name,
+                DartType _type3, String name2)>(
+        "IncorrectTypeArgumentQualifiedInferred",
+        templateIncorrectTypeArgumentQualifiedInferred,
+        analyzerCodes: <String>["TYPE_ARGUMENT_NOT_MATCHING_BOUNDS"]);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsIncorrectTypeArgumentQualifiedInferred(DartType _type,
+    DartType _type2, String name, DartType _type3, String name2) {
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  if (name2.isEmpty) throw 'No name provided';
+  name2 = demangleMixinApplicationName(name2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
+  return new Message(codeIncorrectTypeArgumentQualifiedInferred,
+      message:
+          """Inferred type argument '${type}' doesn't conform to the bound '${type2}' of the type variable '${name}' on '${type3}.${name2}'.""" +
+              labeler.originMessages,
+      tip: """Try specifying type arguments explicitly so that they conform to the bounds.""",
+      arguments: {
+        'type': _type,
+        'type2': _type2,
+        'name': name,
+        'type3': _type3,
+        'name2': name2
+      });
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4349,7 +4496,7 @@
 const MessageCode messageIncorrectTypeArgumentVariable = const MessageCode(
     "IncorrectTypeArgumentVariable",
     severity: Severity.context,
-    message: r"""Bound of this variable is violated.""");
+    message: r"""This is the type variable whose bound isn't conformed to.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(Uri uri_)> templateInferredPackageUri =
@@ -4378,7 +4525,6 @@
 const MessageCode messageInheritedMembersConflict = const MessageCode(
     "InheritedMembersConflict",
     analyzerCodes: <String>["CONFLICTS_WITH_INHERITED_MEMBER"],
-    severity: Severity.errorLegacyWarning,
     message: r"""Can't inherit members that conflict with each other.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4404,27 +4550,67 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
     Message Function(
-        String
-            string)> templateInitializeFromDillNotSelfContained = const Template<
-        Message Function(String string)>(
+        String string,
+        Uri
+            uri_)> templateInitializeFromDillNotSelfContained = const Template<
+        Message Function(String string, Uri uri_)>(
     messageTemplate:
-        r"""Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
+        r"""Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug.
+
+The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
+If you are comfortable with it, it would improve the chances of fixing any bug if you included the file #uri in your error report, but be aware that this file includes your source code.
+Either way, you should probably delete the file so it doesn't use unnecessary disk space.""",
     withArguments: _withArgumentsInitializeFromDillNotSelfContained);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String string)>
+const Code<Message Function(String string, Uri uri_)>
     codeInitializeFromDillNotSelfContained =
-    const Code<Message Function(String string)>(
+    const Code<Message Function(String string, Uri uri_)>(
         "InitializeFromDillNotSelfContained",
         templateInitializeFromDillNotSelfContained,
         severity: Severity.warning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsInitializeFromDillNotSelfContained(String string) {
+Message _withArgumentsInitializeFromDillNotSelfContained(
+    String string, Uri uri_) {
   if (string.isEmpty) throw 'No string provided';
+  String uri = relativizeUri(uri_);
   return new Message(codeInitializeFromDillNotSelfContained,
       message:
-          """Tried to initialize from a previous compilation (${string}), but the file was not self-contained. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
+          """Tried to initialize from a previous compilation (${string}), but the file was not self-contained. This might be a bug.
+
+The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
+If you are comfortable with it, it would improve the chances of fixing any bug if you included the file ${uri} in your error report, but be aware that this file includes your source code.
+Either way, you should probably delete the file so it doesn't use unnecessary disk space.""",
+      arguments: {'string': string, 'uri': uri_});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string)>
+    templateInitializeFromDillNotSelfContainedNoDump =
+    const Template<Message Function(String string)>(
+        messageTemplate:
+            r"""Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug.
+
+The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.""",
+        withArguments: _withArgumentsInitializeFromDillNotSelfContainedNoDump);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)>
+    codeInitializeFromDillNotSelfContainedNoDump =
+    const Code<Message Function(String string)>(
+        "InitializeFromDillNotSelfContainedNoDump",
+        templateInitializeFromDillNotSelfContainedNoDump,
+        severity: Severity.warning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInitializeFromDillNotSelfContainedNoDump(String string) {
+  if (string.isEmpty) throw 'No string provided';
+  return new Message(codeInitializeFromDillNotSelfContainedNoDump,
+      message:
+          """Tried to initialize from a previous compilation (${string}), but the file was not self-contained. This might be a bug.
+
+The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.""",
       arguments: {'string': string});
 }
 
@@ -4432,29 +4618,74 @@
 const Template<
     Message Function(
         String string,
-        String
-            string2)> templateInitializeFromDillUnknownProblem = const Template<
-        Message Function(String string, String string2)>(
+        String string2,
+        Uri
+            uri_)> templateInitializeFromDillUnknownProblem = const Template<
+        Message Function(String string, String string2, Uri uri_)>(
     messageTemplate:
-        r"""Tried to initialize from a previous compilation (#string), but couldn't. Error message was '#string2'. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
+        r"""Tried to initialize from a previous compilation (#string), but couldn't.
+Error message was '#string2'. This might be a bug.
+
+The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
+If you are comfortable with it, it would improve the chances of fixing any bug if you included the file #uri in your error report, but be aware that this file includes your source code.
+Either way, you should probably delete the file so it doesn't use unnecessary disk space.""",
     withArguments: _withArgumentsInitializeFromDillUnknownProblem);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String string, String string2)>
+const Code<Message Function(String string, String string2, Uri uri_)>
     codeInitializeFromDillUnknownProblem =
-    const Code<Message Function(String string, String string2)>(
+    const Code<Message Function(String string, String string2, Uri uri_)>(
         "InitializeFromDillUnknownProblem",
         templateInitializeFromDillUnknownProblem,
         severity: Severity.warning);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInitializeFromDillUnknownProblem(
+    String string, String string2, Uri uri_) {
+  if (string.isEmpty) throw 'No string provided';
+  if (string2.isEmpty) throw 'No string provided';
+  String uri = relativizeUri(uri_);
+  return new Message(codeInitializeFromDillUnknownProblem,
+      message:
+          """Tried to initialize from a previous compilation (${string}), but couldn't.
+Error message was '${string2}'. This might be a bug.
+
+The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
+If you are comfortable with it, it would improve the chances of fixing any bug if you included the file ${uri} in your error report, but be aware that this file includes your source code.
+Either way, you should probably delete the file so it doesn't use unnecessary disk space.""",
+      arguments: {'string': string, 'string2': string2, 'uri': uri_});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String string, String string2)>
+    templateInitializeFromDillUnknownProblemNoDump =
+    const Template<Message Function(String string, String string2)>(
+        messageTemplate:
+            r"""Tried to initialize from a previous compilation (#string), but couldn't.
+Error message was '#string2'. This might be a bug.
+
+The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.""",
+        withArguments: _withArgumentsInitializeFromDillUnknownProblemNoDump);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, String string2)>
+    codeInitializeFromDillUnknownProblemNoDump =
+    const Code<Message Function(String string, String string2)>(
+        "InitializeFromDillUnknownProblemNoDump",
+        templateInitializeFromDillUnknownProblemNoDump,
+        severity: Severity.warning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsInitializeFromDillUnknownProblemNoDump(
     String string, String string2) {
   if (string.isEmpty) throw 'No string provided';
   if (string2.isEmpty) throw 'No string provided';
-  return new Message(codeInitializeFromDillUnknownProblem,
+  return new Message(codeInitializeFromDillUnknownProblemNoDump,
       message:
-          """Tried to initialize from a previous compilation (${string}), but couldn't. Error message was '${string2}'. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new.""",
+          """Tried to initialize from a previous compilation (${string}), but couldn't.
+Error message was '${string2}'. This might be a bug.
+
+The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.""",
       arguments: {'string': string, 'string2': string2});
 }
 
@@ -4465,7 +4696,7 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInitializedVariableInForEach = const MessageCode(
     "InitializedVariableInForEach",
-    analyzerCodes: <String>["INITIALIZED_VARIABLE_IN_FOR_EACH"],
+    index: 82,
     message: r"""The loop variable in a for-each loop can't be initialized.""",
     tip:
         r"""Try removing the initializer, or using a different kind of loop.""");
@@ -4527,9 +4758,9 @@
             _type2)> templateInitializingFormalTypeMismatch = const Template<
         Message Function(String name, DartType _type, DartType _type2)>(
     messageTemplate:
-        r"""The type of parameter '#name' (#type) is not a subtype of the corresponding field's type (#type2).""",
+        r"""The type of parameter '#name', '#type' is not a subtype of the corresponding field's type, '#type2'.""",
     tipTemplate:
-        r"""Try changing the type of parameter '#name' to a subtype of #type2.""",
+        r"""Try changing the type of parameter '#name' to a subtype of '#type2'.""",
     withArguments: _withArgumentsInitializingFormalTypeMismatch);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4546,20 +4777,16 @@
     String name, DartType _type, DartType _type2) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInitializingFormalTypeMismatch,
       message:
-          """The type of parameter '${name}' (${type}) is not a subtype of the corresponding field's type (${type2}).""",
-      tip: """Try changing the type of parameter '${name}' to a subtype of ${type2}.""",
+          """The type of parameter '${name}', '${type}' is not a subtype of the corresponding field's type, '${type2}'.""" +
+              labeler.originMessages,
+      tip: """Try changing the type of parameter '${name}' to a subtype of '${type2}'.""",
       arguments: {'name': name, 'type': _type, 'type2': _type2});
 }
 
@@ -4752,6 +4979,17 @@
         message: r"""Can't extend an unmodifiable scope.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeInternalProblemLabelUsageInVariablesDeclaration =
+    messageInternalProblemLabelUsageInVariablesDeclaration;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageInternalProblemLabelUsageInVariablesDeclaration =
+    const MessageCode("InternalProblemLabelUsageInVariablesDeclaration",
+        severity: Severity.internalProblem,
+        message:
+            r"""Unexpected usage of label inside declaration of variables.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeInternalProblemMissingContext =
     messageInternalProblemMissingContext;
 
@@ -4906,7 +5144,7 @@
     templateInternalProblemStoringMultipleInferredTypes =
     const Template<Message Function(DartType _type, String name)>(
         messageTemplate:
-            r"""There's already an inferred type (#type) for '#name'.""",
+            r"""There's already an inferred type, '#type', for '#name'.""",
         withArguments:
             _withArgumentsInternalProblemStoringMultipleInferredTypes);
 
@@ -4921,16 +5159,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInternalProblemStoringMultipleInferredTypes(
     DartType _type, String name) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
+  String type = typeParts.join();
   return new Message(codeInternalProblemStoringMultipleInferredTypes,
-      message: """There's already an inferred type (${type}) for '${name}'.""",
+      message:
+          """There's already an inferred type, '${type}', for '${name}'.""" +
+              labeler.originMessages,
       arguments: {'type': _type, 'name': name});
 }
 
@@ -5096,19 +5333,15 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidAssignment(DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInvalidAssignment,
       message:
-          """A value of type '${type}' can't be assigned to a variable of type '${type2}'.""",
+          """A value of type '${type}' can't be assigned to a variable of type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Try changing the type of the left hand side, or casting the right hand side to '${type2}'.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -5166,19 +5399,15 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastFunctionExpr(DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInvalidCastFunctionExpr,
       message:
-          """The function expression type '${type}' isn't of expected type '${type2}'.""",
+          """The function expression type '${type}' isn't of expected type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Change the type of the function expression or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -5205,19 +5434,15 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastLiteralList(DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInvalidCastLiteralList,
       message:
-          """The list literal type '${type}' isn't of expected type '${type2}'.""",
+          """The list literal type '${type}' isn't of expected type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Change the type of the list literal or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -5244,19 +5469,15 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastLiteralMap(DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInvalidCastLiteralMap,
       message:
-          """The map literal type '${type}' isn't of expected type '${type2}'.""",
+          """The map literal type '${type}' isn't of expected type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Change the type of the map literal or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -5284,19 +5505,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastLocalFunction(
     DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInvalidCastLocalFunction,
       message:
-          """The local function has type '${type}' that isn't of expected type '${type2}'.""",
+          """The local function has type '${type}' that isn't of expected type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Change the type of the function or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -5323,19 +5540,15 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastNewExpr(DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInvalidCastNewExpr,
       message:
-          """The constructor returns type '${type}' that isn't of expected type '${type2}'.""",
+          """The constructor returns type '${type}' that isn't of expected type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Change the type of the object being constructed or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -5362,19 +5575,15 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastStaticMethod(DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInvalidCastStaticMethod,
       message:
-          """The static method has type '${type}' that isn't of expected type '${type2}'.""",
+          """The static method has type '${type}' that isn't of expected type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Change the type of the method or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -5402,19 +5611,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsInvalidCastTopLevelFunction(
     DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeInvalidCastTopLevelFunction,
       message:
-          """The top level function has type '${type}' that isn't of expected type '${type2}'.""",
+          """The top level function has type '${type}' that isn't of expected type '${type2}'.""" +
+              labeler.originMessages,
       tip: """Change the type of the function or the context in which it is used.""",
       arguments: {'type': _type, 'type2': _type2});
 }
@@ -5475,7 +5680,6 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageInvalidInitializer = const MessageCode(
     "InvalidInitializer",
-    analyzerCodes: <String>["INVALID_INITIALIZER"],
     message: r"""Not a valid initializer.""",
     tip: r"""To initialize a field, use the syntax 'name = value'.""");
 
@@ -5743,7 +5947,7 @@
     "MapLiteralTypeArgumentMismatch",
     analyzerCodes: <String>["EXPECTED_TWO_MAP_TYPE_ARGUMENTS"],
     severity: Severity.errorLegacyWarning,
-    message: r"""Map literal requires exactly two type arguments.""");
+    message: r"""A map literal requires exactly two type arguments.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeMemberWithSameNameAsClass =
@@ -5908,12 +6112,12 @@
 const Template<
     Message Function(
         String name,
-        String
-            string)> templateMissingImplementationNotAbstract = const Template<
-        Message Function(String name, String string)>(
+        List<String>
+            _names)> templateMissingImplementationNotAbstract = const Template<
+        Message Function(String name, List<String> _names)>(
     messageTemplate:
         r"""The non-abstract class '#name' is missing implementations for these members:
-  #string.""",
+#names""",
     tipTemplate: r"""Try to either
  - provide an implementation,
  - inherit an implementation from a superclass or mixin,
@@ -5923,31 +6127,31 @@
     withArguments: _withArgumentsMissingImplementationNotAbstract);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, String string)>
+const Code<Message Function(String name, List<String> _names)>
     codeMissingImplementationNotAbstract =
-    const Code<Message Function(String name, String string)>(
+    const Code<Message Function(String name, List<String> _names)>(
         "MissingImplementationNotAbstract",
         templateMissingImplementationNotAbstract,
-        analyzerCodes: <String>["CONCRETE_CLASS_WITH_ABSTRACT_MEMBER"],
-        severity: Severity.errorLegacyWarning);
+        analyzerCodes: <String>["CONCRETE_CLASS_WITH_ABSTRACT_MEMBER"]);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMissingImplementationNotAbstract(
-    String name, String string) {
+    String name, List<String> _names) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
-  if (string.isEmpty) throw 'No string provided';
+  if (_names.isEmpty) throw 'No names provided';
+  String names = itemizeNames(_names);
   return new Message(codeMissingImplementationNotAbstract,
       message:
           """The non-abstract class '${name}' is missing implementations for these members:
-  ${string}.""",
+${names}""",
       tip: """Try to either
  - provide an implementation,
  - inherit an implementation from a superclass or mixin,
  - mark the class as abstract, or
  - provide a 'noSuchMethod' implementation.
 """,
-      arguments: {'name': name, 'string': string});
+      arguments: {'name': name, 'names': _names});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6050,23 +6254,17 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsMixinApplicationIncompatibleSupertype(
     DartType _type, DartType _type2, DartType _type3) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type3);
-  String type3 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  List<Object> type3Parts = labeler.labelType(_type3);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
+  String type3 = type3Parts.join();
   return new Message(codeMixinApplicationIncompatibleSupertype,
       message:
-          """'${type}' doesn't implement '${type2}' so it can't be used with '${type3}'.""",
+          """'${type}' doesn't implement '${type2}' so it can't be used with '${type3}'.""" +
+              labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2, 'type3': _type3});
 }
 
@@ -6096,15 +6294,13 @@
   name = demangleMixinApplicationName(name);
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
   return new Message(codeMixinInferenceNoMatchingClass,
       message:
-          """Type parameters could not be inferred for the mixin '${name}' because '${name2}' does not implement the mixin's supertype constraint '${type}'.""",
+          """Type parameters could not be inferred for the mixin '${name}' because '${name2}' does not implement the mixin's supertype constraint '${type}'.""" +
+              labeler.originMessages,
       arguments: {'name': name, 'name2': name2, 'type': _type});
 }
 
@@ -6518,14 +6714,37 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeObjectExtends = messageObjectExtends;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageObjectExtends = const MessageCode("ObjectExtends",
+    message: r"""The class 'Object' can't have a superclass.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeObjectImplements = messageObjectImplements;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageObjectImplements = const MessageCode(
+    "ObjectImplements",
+    message: r"""The class 'Object' can't implement anything.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeObjectMixesIn = messageObjectMixesIn;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageObjectMixesIn = const MessageCode("ObjectMixesIn",
+    message: r"""The class 'Object' can't use mixins.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeOnlyTry = messageOnlyTry;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageOnlyTry = const MessageCode("OnlyTry",
-    analyzerCodes: <String>["MISSING_CATCH_OR_FINALLY"],
+    index: 92,
     message:
-        r"""Try block should be followed by 'on', 'catch', or 'finally' block.""",
-    tip: r"""Did you forget to add a 'finally' block?""");
+        r"""A try block must be followed by an 'on', 'catch', or 'finally' clause.""",
+    tip:
+        r"""Try adding either a catch or finally clause, or remove the try statement.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
@@ -6797,9 +7016,9 @@
         Message Function(String name, String name2, DartType _type,
             DartType _type2)>(
     messageTemplate:
-        r"""The parameter '#name' of the method '#name2' has type #type, which does not match the corresponding type in the overridden method (#type2).""",
+        r"""The parameter '#name' of the method '#name2' has type '#type', which does not match the corresponding type in the overridden method, '#type2'.""",
     tipTemplate:
-        r"""Change to a supertype of #type2 (or, for a covariant parameter, a subtype).""",
+        r"""Change to a supertype of '#type2', or, for a covariant parameter, a subtype.""",
     withArguments: _withArgumentsOverrideTypeMismatchParameter);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6819,20 +7038,16 @@
   name = demangleMixinApplicationName(name);
   if (name2.isEmpty) throw 'No name provided';
   name2 = demangleMixinApplicationName(name2);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeOverrideTypeMismatchParameter,
       message:
-          """The parameter '${name}' of the method '${name2}' has type ${type}, which does not match the corresponding type in the overridden method (${type2}).""",
-      tip: """Change to a supertype of ${type2} (or, for a covariant parameter, a subtype).""",
+          """The parameter '${name}' of the method '${name2}' has type '${type}', which does not match the corresponding type in the overridden method, '${type2}'.""" +
+              labeler.originMessages,
+      tip: """Change to a supertype of '${type2}', or, for a covariant parameter, a subtype.""",
       arguments: {
         'name': name,
         'name2': name2,
@@ -6850,8 +7065,8 @@
             _type2)> templateOverrideTypeMismatchReturnType = const Template<
         Message Function(String name, DartType _type, DartType _type2)>(
     messageTemplate:
-        r"""The return type of the method '#name' is #type, which does not match the return type of the overridden method (#type2).""",
-    tipTemplate: r"""Change to a subtype of #type2.""",
+        r"""The return type of the method '#name' is '#type', which does not match the return type of the overridden method, '#type2'.""",
+    tipTemplate: r"""Change to a subtype of '#type2'.""",
     withArguments: _withArgumentsOverrideTypeMismatchReturnType);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6867,20 +7082,16 @@
     String name, DartType _type, DartType _type2) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeOverrideTypeMismatchReturnType,
       message:
-          """The return type of the method '${name}' is ${type}, which does not match the return type of the overridden method (${type2}).""",
-      tip: """Change to a subtype of ${type2}.""",
+          """The return type of the method '${name}' is '${type}', which does not match the return type of the overridden method, '${type2}'.""" +
+              labeler.originMessages,
+      tip: """Change to a subtype of '${type2}'.""",
       arguments: {'name': name, 'type': _type, 'type2': _type2});
 }
 
@@ -7347,177 +7558,19 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsRedirectingFactoryIncompatibleTypeArgument(
     DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeRedirectingFactoryIncompatibleTypeArgument,
-      message: """The type '${type}' doesn't extend '${type2}'.""",
+      message: """The type '${type}' doesn't extend '${type2}'.""" +
+          labeler.originMessages,
       tip: """Try using a different type as argument.""",
       arguments: {'type': _type, 'type2': _type2});
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name, DartType _type, DartType _type2)>
-    templateRedirectingFactoryInvalidNamedParameterType = const Template<
-            Message Function(String name, DartType _type, DartType _type2)>(
-        messageTemplate:
-            r"""The type of the named parameter '#name' (#type) is not a subtype of the redirection target's corresponding named parameter type (#type2).""",
-        tipTemplate:
-            r"""Try changing either the type of the parameter or the redirection target.""",
-        withArguments:
-            _withArgumentsRedirectingFactoryInvalidNamedParameterType);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, DartType _type, DartType _type2)>
-    codeRedirectingFactoryInvalidNamedParameterType =
-    const Code<Message Function(String name, DartType _type, DartType _type2)>(
-        "RedirectingFactoryInvalidNamedParameterType",
-        templateRedirectingFactoryInvalidNamedParameterType,
-        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsRedirectingFactoryInvalidNamedParameterType(
-    String name, DartType _type, DartType _type2) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
-  return new Message(codeRedirectingFactoryInvalidNamedParameterType,
-      message:
-          """The type of the named parameter '${name}' (${type}) is not a subtype of the redirection target's corresponding named parameter type (${type2}).""",
-      tip: """Try changing either the type of the parameter or the redirection target.""",
-      arguments: {'name': name, 'type': _type, 'type2': _type2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name, DartType _type, DartType _type2)>
-    templateRedirectingFactoryInvalidPositionalParameterType = const Template<
-            Message Function(String name, DartType _type, DartType _type2)>(
-        messageTemplate:
-            r"""The type of parameter '#name' (#type) is not a subtype of the redirection target's corresponding parameter type (#type2).""",
-        tipTemplate:
-            r"""Try changing either the type of the parameter or the redirection target.""",
-        withArguments:
-            _withArgumentsRedirectingFactoryInvalidPositionalParameterType);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, DartType _type, DartType _type2)>
-    codeRedirectingFactoryInvalidPositionalParameterType =
-    const Code<Message Function(String name, DartType _type, DartType _type2)>(
-        "RedirectingFactoryInvalidPositionalParameterType",
-        templateRedirectingFactoryInvalidPositionalParameterType,
-        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsRedirectingFactoryInvalidPositionalParameterType(
-    String name, DartType _type, DartType _type2) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
-  return new Message(codeRedirectingFactoryInvalidPositionalParameterType,
-      message:
-          """The type of parameter '${name}' (${type}) is not a subtype of the redirection target's corresponding parameter type (${type2}).""",
-      tip: """Try changing either the type of the parameter or the redirection target.""",
-      arguments: {'name': name, 'type': _type, 'type2': _type2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<Message Function(String name, String name2)>
-    templateRedirectingFactoryMissingNamedParameter =
-    const Template<Message Function(String name, String name2)>(
-        messageTemplate:
-            r"""The constructor '#name' does not have a named parameter '#name2'.""",
-        tipTemplate:
-            r"""Try adding '#name2' as a named parameter to '#name'.""",
-        withArguments: _withArgumentsRedirectingFactoryMissingNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, String name2)>
-    codeRedirectingFactoryMissingNamedParameter =
-    const Code<Message Function(String name, String name2)>(
-        "RedirectingFactoryMissingNamedParameter",
-        templateRedirectingFactoryMissingNamedParameter,
-        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsRedirectingFactoryMissingNamedParameter(
-    String name, String name2) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  return new Message(codeRedirectingFactoryMissingNamedParameter,
-      message:
-          """The constructor '${name}' does not have a named parameter '${name2}'.""",
-      tip: """Try adding '${name2}' as a named parameter to '${name}'.""",
-      arguments: {'name': name, 'name2': name2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
-        Message Function(String name, int count, String name2, int count2)>
-    templateRedirectingFactoryProvidesTooFewRequiredParameters = const Template<
-            Message Function(String name, int count, String name2, int count2)>(
-        messageTemplate:
-            r"""Redirecting factory '#name' can provide less arguments ('#count') than required by the redirection target '#name2' ('#count2').""",
-        tipTemplate: r"""Try redirecting to a different constructor.""",
-        withArguments:
-            _withArgumentsRedirectingFactoryProvidesTooFewRequiredParameters);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name, int count, String name2, int count2)>
-    codeRedirectingFactoryProvidesTooFewRequiredParameters = const Code<
-            Message Function(String name, int count, String name2, int count2)>(
-        "RedirectingFactoryProvidesTooFewRequiredParameters",
-        templateRedirectingFactoryProvidesTooFewRequiredParameters,
-        analyzerCodes: <String>["REDIRECT_TO_INVALID_FUNCTION_TYPE"]);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsRedirectingFactoryProvidesTooFewRequiredParameters(
-    String name, int count, String name2, int count2) {
-  if (name.isEmpty) throw 'No name provided';
-  name = demangleMixinApplicationName(name);
-  if (count == null) throw 'No count provided';
-  if (name2.isEmpty) throw 'No name provided';
-  name2 = demangleMixinApplicationName(name2);
-  if (count2 == null) throw 'No count provided';
-  return new Message(codeRedirectingFactoryProvidesTooFewRequiredParameters,
-      message:
-          """Redirecting factory '${name}' can provide less arguments ('${count}') than required by the redirection target '${name2}' ('${count2}').""",
-      tip: """Try redirecting to a different constructor.""",
-      arguments: {
-        'name': name,
-        'count': count,
-        'name2': name2,
-        'count2': count2
-      });
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeRedirectionInNonFactory = messageRedirectionInNonFactory;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7671,6 +7724,35 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSetLiteralTooManyTypeArguments =
+    messageSetLiteralTooManyTypeArguments;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSetLiteralTooManyTypeArguments = const MessageCode(
+    "SetLiteralTooManyTypeArguments",
+    severity: Severity.errorLegacyWarning,
+    message: r"""A set literal requires exactly one type argument.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSetLiteralsNotSupported = messageSetLiteralsNotSupported;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSetLiteralsNotSupported = const MessageCode(
+    "SetLiteralsNotSupported",
+    message: r"""Set literals are not supported yet.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeSetOrMapLiteralTooManyTypeArguments =
+    messageSetOrMapLiteralTooManyTypeArguments;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageSetOrMapLiteralTooManyTypeArguments = const MessageCode(
+    "SetOrMapLiteralTooManyTypeArguments",
+    severity: Severity.errorLegacyWarning,
+    message:
+        r"""A set or map literal requires exactly one or two type arguments, respectively.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<Message Function(String name)> templateSetterNotFound =
     const Template<Message Function(String name)>(
         messageTemplate: r"""Setter not found: '#name'.""",
@@ -7816,7 +7898,9 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageStackOverflow = const MessageCode("StackOverflow",
-    analyzerCodes: <String>["STACK_OVERFLOW"], message: r"""Stack overflow.""");
+    index: 91,
+    message: r"""The file has too many nested expressions or statements.""",
+    tip: r"""Try simplifying the code.""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeStaticAfterConst = messageStaticAfterConst;
@@ -7902,8 +7986,9 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageSuperNullAware = const MessageCode("SuperNullAware",
-    analyzerCodes: <String>["INVALID_OPERATOR_FOR_SUPER"],
-    message: r"""'super' can't be null.""",
+    index: 90,
+    message:
+        r"""The operator '?.' cannot be used with 'super' because 'super' cannot be null.""",
     tip: r"""Try replacing '?.' with '.'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8135,19 +8220,15 @@
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 Message _withArgumentsSwitchExpressionNotAssignable(
     DartType _type, DartType _type2) {
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type2);
-  String type2 = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  List<Object> type2Parts = labeler.labelType(_type2);
+  String type = typeParts.join();
+  String type2 = type2Parts.join();
   return new Message(codeSwitchExpressionNotAssignable,
       message:
-          """Type '${type}' of the switch expression isn't assignable to the type '${type2}' of this case expression.""",
+          """Type '${type}' of the switch expression isn't assignable to the type '${type2}' of this case expression.""" +
+              labeler.originMessages,
       arguments: {'type': _type, 'type2': _type2});
 }
 
@@ -8330,8 +8411,9 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const MessageCode messageTypeAfterVar = const MessageCode("TypeAfterVar",
-    analyzerCodes: <String>["VAR_AND_TYPE"],
-    message: r"""Can't have both a type and 'var'.""",
+    index: 89,
+    message:
+        r"""Variables can't be declared using both 'var' and a type name.""",
     tip: r"""Try removing 'var.'""");
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -8402,6 +8484,55 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, Uri uri_)> templateTypeOrigin =
+    const Template<Message Function(String name, Uri uri_)>(
+        messageTemplate: r"""'#name' is from '#uri'.""",
+        withArguments: _withArgumentsTypeOrigin);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, Uri uri_)> codeTypeOrigin =
+    const Code<Message Function(String name, Uri uri_)>(
+  "TypeOrigin",
+  templateTypeOrigin,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsTypeOrigin(String name, Uri uri_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  String uri = relativizeUri(uri_);
+  return new Message(codeTypeOrigin,
+      message: """'${name}' is from '${uri}'.""",
+      arguments: {'name': name, 'uri': uri_});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name, Uri uri_, Uri uri2_)>
+    templateTypeOriginWithFileUri =
+    const Template<Message Function(String name, Uri uri_, Uri uri2_)>(
+        messageTemplate: r"""'#name' is from '#uri' ('#uri2').""",
+        withArguments: _withArgumentsTypeOriginWithFileUri);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, Uri uri_, Uri uri2_)>
+    codeTypeOriginWithFileUri =
+    const Code<Message Function(String name, Uri uri_, Uri uri2_)>(
+  "TypeOriginWithFileUri",
+  templateTypeOriginWithFileUri,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsTypeOriginWithFileUri(String name, Uri uri_, Uri uri2_) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  String uri = relativizeUri(uri_);
+  String uri2 = relativizeUri(uri2_);
+  return new Message(codeTypeOriginWithFileUri,
+      message: """'${name}' is from '${uri}' ('${uri2}').""",
+      arguments: {'name': name, 'uri': uri_, 'uri2': uri2_});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeTypeVariableDuplicatedName =
     messageTypeVariableDuplicatedName;
 
@@ -8506,15 +8637,13 @@
 Message _withArgumentsUndefinedGetter(String name, DartType _type) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
   return new Message(codeUndefinedGetter,
       message:
-          """The getter '${name}' isn't defined for the class '${type}'.""",
+          """The getter '${name}' isn't defined for the class '${type}'.""" +
+              labeler.originMessages,
       tip:
           """Try correcting the name to the name of an existing getter, or defining a getter or field named '${name}'.""",
       arguments: {'name': name, 'type': _type});
@@ -8543,15 +8672,13 @@
 Message _withArgumentsUndefinedMethod(String name, DartType _type) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
   return new Message(codeUndefinedMethod,
       message:
-          """The method '${name}' isn't defined for the class '${type}'.""",
+          """The method '${name}' isn't defined for the class '${type}'.""" +
+              labeler.originMessages,
       tip:
           """Try correcting the name to the name of an existing method, or defining a method named '${name}'.""",
       arguments: {'name': name, 'type': _type});
@@ -8580,15 +8707,13 @@
 Message _withArgumentsUndefinedSetter(String name, DartType _type) {
   if (name.isEmpty) throw 'No name provided';
   name = demangleMixinApplicationName(name);
-  NameSystem nameSystem = new NameSystem();
-  StringBuffer buffer;
-  buffer = new StringBuffer();
-  new Printer(buffer, syntheticNames: nameSystem).writeNode(_type);
-  String type = '$buffer';
-
+  TypeLabeler labeler = new TypeLabeler();
+  List<Object> typeParts = labeler.labelType(_type);
+  String type = typeParts.join();
   return new Message(codeUndefinedSetter,
       message:
-          """The setter '${name}' isn't defined for the class '${type}'.""",
+          """The setter '${name}' isn't defined for the class '${type}'.""" +
+              labeler.originMessages,
       tip:
           """Try correcting the name to the name of an existing setter, or defining a setter or field named '${name}'.""",
       arguments: {'name': name, 'type': _type});
diff --git a/pkg/front_end/lib/src/fasta/get_dependencies.dart b/pkg/front_end/lib/src/fasta/get_dependencies.dart
index e4aacb2..abd9879 100644
--- a/pkg/front_end/lib/src/fasta/get_dependencies.dart
+++ b/pkg/front_end/lib/src/fasta/get_dependencies.dart
@@ -49,9 +49,8 @@
       var platformComponent = loadComponentFromBytes(bytes);
       dillTarget.loader.appendLibraries(platformComponent);
     }
-    KernelTarget kernelTarget = new KernelTarget(
-        fileSystem, false, dillTarget, uriTranslator,
-        uriToSource: c.uriToSource);
+    KernelTarget kernelTarget =
+        new KernelTarget(fileSystem, false, dillTarget, uriTranslator);
 
     kernelTarget.setEntryPoints(<Uri>[script]);
     await dillTarget.buildOutlines();
diff --git a/pkg/front_end/lib/src/fasta/import.dart b/pkg/front_end/lib/src/fasta/import.dart
index b484601..b15bce3 100644
--- a/pkg/front_end/lib/src/fasta/import.dart
+++ b/pkg/front_end/lib/src/fasta/import.dart
@@ -80,7 +80,7 @@
     });
     if (prefixBuilder != null) {
       Declaration existing =
-          importer.addBuilder(prefix, prefixBuilder, charOffset);
+          importer.addBuilder(prefix, prefixBuilder, prefixCharOffset);
       if (existing == prefixBuilder) {
         importer.addToScope(prefix, prefixBuilder, prefixCharOffset, true);
       }
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 2565d7e..795a5d9 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -52,10 +52,14 @@
 
 import 'dill/dill_target.dart' show DillTarget;
 
+import 'util/error_reporter_file_copier.dart' show saveAsGzip;
+
 import 'fasta_codes.dart'
     show
         templateInitializeFromDillNotSelfContained,
-        templateInitializeFromDillUnknownProblem;
+        templateInitializeFromDillNotSelfContainedNoDump,
+        templateInitializeFromDillUnknownProblem,
+        templateInitializeFromDillUnknownProblemNoDump;
 
 import 'hybrid_file_system.dart' show HybridFileSystem;
 
@@ -67,6 +71,8 @@
 
 import 'library_graph.dart' show LibraryGraph;
 
+import 'messages.dart' show Message;
+
 import 'source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'ticker.dart' show Ticker;
@@ -81,7 +87,6 @@
   Set<Uri> invalidatedUris = new Set<Uri>();
 
   DillTarget dillLoadedData;
-  Map<Uri, Source> dillLoadedDataUriToSource = <Uri, Source>{};
   List<LibraryBuilder> platformBuilders;
   Map<Uri, LibraryBuilder> userBuilders;
   final Uri initializeFromDillUri;
@@ -122,8 +127,7 @@
         int bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
         if (initializeFromDillUri != null) {
           try {
-            bytesLength +=
-                await initializeFromDill(summaryBytes, uriTranslator, c, data);
+            bytesLength += await initializeFromDill(uriTranslator, c, data);
           } catch (e) {
             // We might have loaded x out of y libraries into the component.
             // To avoid any unforeseen problems start over.
@@ -131,40 +135,41 @@
 
             if (e is InvalidKernelVersionError || e is PackageChangedError) {
               // Don't report any warning.
-            } else if (e is CanonicalNameError) {
-              dillLoadedData.loader.addProblem(
-                  templateInitializeFromDillNotSelfContained
-                      .withArguments(initializeFromDillUri.toString()),
-                  TreeNode.noOffset,
-                  1,
-                  null);
             } else {
-              // Unknown error: Report problem as such.
-              dillLoadedData.loader.addProblem(
-                  templateInitializeFromDillUnknownProblem.withArguments(
-                      initializeFromDillUri.toString(), "$e"),
-                  TreeNode.noOffset,
-                  1,
-                  null);
+              Uri gzInitializedFrom;
+              if (c.options.writeFileOnCrashReport) {
+                gzInitializedFrom = saveAsGzip(
+                    data.initializationBytes, "initialize_from.dill");
+                recordTemporaryFileForTesting(gzInitializedFrom);
+              }
+              if (e is CanonicalNameError) {
+                Message message = gzInitializedFrom != null
+                    ? templateInitializeFromDillNotSelfContained.withArguments(
+                        initializeFromDillUri.toString(), gzInitializedFrom)
+                    : templateInitializeFromDillNotSelfContainedNoDump
+                        .withArguments(initializeFromDillUri.toString());
+                dillLoadedData.loader
+                    .addProblem(message, TreeNode.noOffset, 1, null);
+              } else {
+                // Unknown error: Report problem as such.
+                Message message = gzInitializedFrom != null
+                    ? templateInitializeFromDillUnknownProblem.withArguments(
+                        initializeFromDillUri.toString(),
+                        "$e",
+                        gzInitializedFrom)
+                    : templateInitializeFromDillUnknownProblemNoDump
+                        .withArguments(initializeFromDillUri.toString(), "$e");
+                dillLoadedData.loader
+                    .addProblem(message, TreeNode.noOffset, 1, null);
+              }
             }
           }
         } else if (componentToInitializeFrom != null) {
-          initializeFromComponent(summaryBytes, uriTranslator, c, data);
+          initializeFromComponent(uriTranslator, c, data);
         }
         appendLibraries(data, bytesLength);
 
-        try {
-          await dillLoadedData.buildOutlines();
-        } catch (e) {
-          if (!initializedFromDill) rethrow;
-
-          // Retry without initializing from dill.
-          initializedFromDill = false;
-          data.reset();
-          bytesLength = prepareSummary(summaryBytes, uriTranslator, c, data);
-          appendLibraries(data, bytesLength);
-          await dillLoadedData.buildOutlines();
-        }
+        await dillLoadedData.buildOutlines();
         summaryBytes = null;
         userBuilders = <Uri, LibraryBuilder>{};
         platformBuilders = <LibraryBuilder>[];
@@ -177,6 +182,7 @@
         });
         if (userBuilders.isEmpty) userBuilders = null;
       }
+      data.initializationBytes = null;
 
       Set<Uri> invalidatedUris = this.invalidatedUris.toSet();
       if ((data.includeUserLoadedLibraries &&
@@ -206,7 +212,6 @@
       for (Uri uri in new Set<Uri>.from(dillLoadedData.loader.builders.keys)
         ..removeAll(reusedLibraryUris)) {
         dillLoadedData.loader.builders.remove(uri);
-        dillLoadedDataUriToSource.remove(uri);
         userBuilders?.remove(uri);
       }
 
@@ -224,8 +229,6 @@
             " of ${userCode.loader.builders.length} libraries");
       }
 
-      reusedLibraries.addAll(platformBuilders);
-
       KernelTarget userCodeOld = userCode;
       userCode = new KernelTarget(
           new HybridFileSystem(
@@ -234,8 +237,7 @@
               c.fileSystem),
           false,
           dillLoadedData,
-          uriTranslator,
-          uriToSource: c.uriToSource);
+          uriTranslator);
       userCode.loader.hierarchy = hierarchy;
 
       for (LibraryBuilder library in reusedLibraries) {
@@ -265,9 +267,6 @@
 
       List<Library> compiledLibraries =
           new List<Library>.from(userCode.loader.libraries);
-      Map<Uri, Source> uriToSource =
-          new Map<Uri, Source>.from(dillLoadedDataUriToSource);
-      uriToSource.addAll(userCode.uriToSource);
       Procedure mainMethod = componentWithDill == null
           ? data.userLoadedUriMain
           : componentWithDill.mainMethod;
@@ -275,10 +274,10 @@
       List<Library> outputLibraries;
       if (data.includeUserLoadedLibraries || fullComponent) {
         outputLibraries = computeTransitiveClosure(compiledLibraries,
-            mainMethod, entryPoint, reusedLibraries, data, hierarchy);
+            mainMethod, entryPoint, reusedLibraries, hierarchy);
       } else {
         computeTransitiveClosure(compiledLibraries, mainMethod, entryPoint,
-            reusedLibraries, data, hierarchy);
+            reusedLibraries, hierarchy);
         outputLibraries = compiledLibraries;
       }
 
@@ -287,13 +286,10 @@
         userCode = userCodeOld;
       }
 
-      Map<Uri, Source> optionalUriToSource = context.options.embedSourceText
-          ? uriToSource
-          : uriToSource.map((uri, source) => MapEntry<Uri, Source>(
-              uri, new Source(source.lineStarts, const <int>[])));
       // This is the incremental component.
       return context.options.target.configureComponent(new Component(
-          libraries: outputLibraries, uriToSource: optionalUriToSource))
+          libraries: outputLibraries,
+          uriToSource: componentWithDill.uriToSource))
         ..mainMethod = mainMethod;
     });
   }
@@ -303,7 +299,6 @@
       Procedure mainMethod,
       Uri entry,
       List<LibraryBuilder> reusedLibraries,
-      IncrementalCompilerData data,
       ClassHierarchy hierarchy) {
     List<Library> result = new List<Library>.from(inputLibraries);
     Map<Uri, Library> libraryMap = <Uri, Library>{};
@@ -347,7 +342,6 @@
         Library lib = builder.target;
         removedLibraries.add(lib);
         dillLoadedData.loader.builders.remove(uri);
-        dillLoadedDataUriToSource.remove(uri);
         userBuilders?.remove(uri);
       }
     }
@@ -374,10 +368,7 @@
   }
 
   // This procedure will try to load the dill file and will crash if it cannot.
-  Future<int> initializeFromDill(
-      List<int> summaryBytes,
-      UriTranslator uriTranslator,
-      CompilerContext c,
+  Future<int> initializeFromDill(UriTranslator uriTranslator, CompilerContext c,
       IncrementalCompilerData data) async {
     int bytesLength = 0;
     FileSystemEntity entity =
@@ -386,8 +377,7 @@
       List<int> initializationBytes = await entity.readAsBytes();
       if (initializationBytes != null) {
         ticker.logMs("Read $initializeFromDillUri");
-
-        Set<Uri> sdkUris = data.component.uriToSource.keys.toSet();
+        data.initializationBytes = initializationBytes;
 
         // We're going to output all we read here so lazy loading it
         // doesn't make sense.
@@ -412,20 +402,13 @@
         bytesLength += initializationBytes.length;
         data.userLoadedUriMain = data.component.mainMethod;
         data.includeUserLoadedLibraries = true;
-        for (Uri uri in data.component.uriToSource.keys) {
-          if (sdkUris.contains(uri)) continue;
-          dillLoadedDataUriToSource[uri] = data.component.uriToSource[uri];
-        }
       }
     }
     return bytesLength;
   }
 
   // This procedure will set up compiler from [componentToInitializeFrom].
-  void initializeFromComponent(
-      List<int> summaryBytes,
-      UriTranslator uriTranslator,
-      CompilerContext c,
+  void initializeFromComponent(UriTranslator uriTranslator, CompilerContext c,
       IncrementalCompilerData data) {
     ticker.logMs("Read initializeFromComponent");
 
@@ -575,11 +558,11 @@
   List<LibraryBuilder> computeReusedLibraries(
       Set<Uri> invalidatedUris, UriTranslator uriTranslator,
       {Set<LibraryBuilder> notReused}) {
-    if (userCode == null && userBuilders == null) {
-      return <LibraryBuilder>[];
-    }
-
     List<LibraryBuilder> result = <LibraryBuilder>[];
+    result.addAll(platformBuilders);
+    if (userCode == null && userBuilders == null) {
+      return result;
+    }
 
     // Maps all non-platform LibraryBuilders from their import URI.
     Map<Uri, LibraryBuilder> builders = <Uri, LibraryBuilder>{};
@@ -622,6 +605,12 @@
         for (LibraryPart part in library.target.parts) {
           Uri partUri = library.uri.resolve(part.partUri);
           Uri fileUri = library.library.fileUri.resolve(part.partUri);
+          if (fileUri.scheme == "package") {
+            // Part was specified via package URI and the resolve above thus
+            // did not go as expected. Translate the package URI to get the
+            // actual file URI.
+            fileUri = uriTranslator.translate(partUri, false);
+          }
           if (isInvalidated(partUri, fileUri)) {
             invalidatedImportUris.add(partUri);
             builders[partUri] = library;
@@ -694,6 +683,7 @@
   }
 
   void recordInvalidatedImportUrisForTesting(List<Uri> uris) {}
+  void recordTemporaryFileForTesting(Uri uri) {}
 }
 
 class PackageChangedError {
@@ -701,17 +691,8 @@
 }
 
 class IncrementalCompilerData {
-  bool includeUserLoadedLibraries;
-  Procedure userLoadedUriMain;
-  Component component;
-
-  IncrementalCompilerData() {
-    reset();
-  }
-
-  reset() {
-    includeUserLoadedLibraries = false;
-    userLoadedUriMain = null;
-    component = null;
-  }
+  bool includeUserLoadedLibraries = false;
+  Procedure userLoadedUriMain = null;
+  Component component = null;
+  List<int> initializationBytes = null;
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 090af34..d023620 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -31,7 +31,8 @@
         offsetForToken,
         optional;
 
-import '../problems.dart' show unexpected, unhandled, unsupported;
+import '../problems.dart'
+    show internalProblem, unexpected, unhandled, unsupported;
 
 import '../quote.dart'
     show
@@ -95,6 +96,11 @@
 
 import 'forest.dart' show Forest;
 
+import 'implicit_type_argument.dart' show ImplicitTypeArgument;
+
+import 'kernel_shadow_ast.dart' as shadow
+    show SyntheticExpressionJudgment, SyntheticWrapper;
+
 import 'redirecting_factory_body.dart'
     show
         RedirectingFactoryBody,
@@ -103,14 +109,16 @@
         getRedirectionTarget,
         isRedirectingFactory;
 
+import 'transform_set_literals.dart' show SetLiteralTransformer;
+
+import 'type_algorithms.dart' show calculateBounds;
+
 import 'kernel_api.dart';
 
 import 'kernel_ast_api.dart';
 
 import 'kernel_builder.dart';
 
-import 'type_algorithms.dart' show calculateBounds;
-
 // TODO(ahe): Remove this and ensure all nodes have a location.
 const noLocation = null;
 
@@ -158,6 +166,9 @@
   @override
   final TypePromoter typePromoter;
 
+  @override
+  final bool legacyMode;
+
   /// Only used when [member] is a constructor. It tracks if an implicit super
   /// initializer is needed.
   ///
@@ -193,6 +204,10 @@
 
   int functionNestingLevel = 0;
 
+  // Set by type inference when a set literal is encountered that needs to be
+  // transformed because the backend target does not support set literals.
+  bool transformSetLiterals = false;
+
   Statement problemInLoopOrSwitch;
 
   Scope switchScope;
@@ -215,6 +230,14 @@
   /// invocations are to be resolved in a separate step.
   final List<Expression> redirectingFactoryInvocations = <Expression>[];
 
+  /// Variables with metadata.  Their types need to be inferred late, for
+  /// example, in [finishFunction].
+  List<VariableDeclaration> variablesWithMetadata;
+
+  /// More than one variable declared in a single statement that has metadata.
+  /// Their types need to be inferred late, for example, in [finishFunction].
+  List<List<VariableDeclaration>> multiVariablesWithMetadata;
+
   BodyBuilder(
       this.library,
       this.member,
@@ -235,6 +258,7 @@
         needsImplicitSuperInitializer =
             coreTypes?.objectClass != classBuilder?.cls,
         typePromoter = _typeInferrer?.typePromoter,
+        legacyMode = library.legacyMode,
         super(enclosingScope);
 
   BodyBuilder.withParents(KernelFieldBuilder field, KernelLibraryBuilder part,
@@ -270,6 +294,9 @@
 
   TypeEnvironment get typeEnvironment => _typeInferrer?.typeSchemaEnvironment;
 
+  DartType get implicitTypeArgument =>
+      legacyMode ? const DynamicType() : const ImplicitTypeArgument();
+
   @override
   void push(Object node) {
     if (node is DartType) {
@@ -499,7 +526,7 @@
   void finishFields() {
     debugEvent("finishFields");
     int count = pop();
-    List<FieldBuilder<Object>> fields = <FieldBuilder<Object>>[];
+    List<KernelFieldBuilder> fields = <KernelFieldBuilder>[];
     for (int i = 0; i < count; i++) {
       Expression initializer = pop();
       Identifier identifier = pop();
@@ -510,7 +537,7 @@
       } else {
         declaration = library[name];
       }
-      FieldBuilder<Object> field;
+      KernelFieldBuilder field;
       if (declaration.isField && declaration.next == null) {
         field = declaration;
       } else {
@@ -524,10 +551,14 @@
           // Error reporting and recovery is handled elsewhere.
         } else {
           field.initializer = initializer;
-          _typeInferrer.inferFieldInitializer(
-              this,
-              field.hasTypeInferredFromInitializer ? null : field.builtType,
-              initializer);
+          _typeInferrer?.inferFieldInitializer(
+              this, field.builtType, initializer);
+
+          if (transformSetLiterals) {
+            library.loader.setLiteralTransformer ??=
+                new SetLiteralTransformer(library.loader);
+            field.target.accept(library.loader.setLiteralTransformer);
+          }
         }
       }
     }
@@ -543,10 +574,12 @@
     }
     List<Expression> annotations = pop();
     if (annotations != null) {
-      _typeInferrer.inferMetadata(this, annotations);
+      _typeInferrer?.inferMetadata(this, annotations);
       Field field = fields.first.target;
       // The first (and often only field) will not get a clone.
-      annotations.forEach((annotation) => field.addAnnotation(annotation));
+      for (int i = 0; i < annotations.length; i++) {
+        field.addAnnotation(annotations[i]);
+      }
       for (int i = 1; i < fields.length; i++) {
         // We have to clone the annotations on the remaining fields.
         field = fields[i].target;
@@ -558,6 +591,7 @@
     }
 
     resolveRedirectingFactoryTargets();
+    finishVariableMetadata();
   }
 
   @override
@@ -582,26 +616,24 @@
     ProcedureBuilder<TypeBuilder> member = this.member;
     scope = member.computeFormalParameterInitializerScope(scope);
     if (member is KernelConstructorBuilder) {
-      if (member.isConst &&
-          (classBuilder.cls.superclass?.isMixinApplication ?? false)) {
-        addProblem(fasta.messageConstConstructorInSubclassOfMixinApplication,
-            member.charOffset, member.name.length);
-      }
       if (member.formals != null) {
         for (KernelFormalParameterBuilder formal in member.formals) {
-          if (formal.hasThis) {
+          if (formal.isInitializingFormal) {
             Initializer initializer;
             if (member.isExternal) {
               initializer = buildInvalidInitializer(
-                  buildProblem(
-                          fasta.messageExternalConstructorWithFieldInitializers,
-                          formal.charOffset,
-                          formal.name.length)
-                      .desugared,
+                  desugarSyntheticExpression(buildProblem(
+                      fasta.messageExternalConstructorWithFieldInitializers,
+                      formal.charOffset,
+                      formal.name.length)),
                   formal.charOffset);
             } else {
-              initializer = buildFieldInitializer(true, formal.name,
-                  formal.charOffset, new VariableGet(formal.declaration),
+              initializer = buildFieldInitializer(
+                  true,
+                  formal.name,
+                  formal.charOffset,
+                  formal.charOffset,
+                  new VariableGet(formal.declaration),
                   formalType: formal.declaration.type);
             }
             member.addInitializer(initializer, this);
@@ -666,7 +698,7 @@
       }
       initializer = buildInvalidInitializer(node, token.charOffset);
     }
-    _typeInferrer.inferInitializer(this, initializer);
+    _typeInferrer?.inferInitializer(this, initializer);
     if (member is KernelConstructorBuilder && !member.isExternal) {
       member.addInitializer(initializer, this);
     } else {
@@ -691,40 +723,48 @@
   void finishFunction(List<Expression> annotations, FormalParameters formals,
       AsyncMarker asyncModifier, Statement body) {
     debugEvent("finishFunction");
-    typePromoter.finished();
+    typePromoter?.finished();
 
     KernelFunctionBuilder builder = member;
     if (formals?.parameters != null) {
       for (int i = 0; i < formals.parameters.length; i++) {
         KernelFormalParameterBuilder parameter = formals.parameters[i];
-        if (parameter.isOptional) {
+        Expression initializer = parameter.target.initializer;
+        if (parameter.isOptional || initializer != null) {
           VariableDeclaration realParameter = builder.formals[i].target;
-          Expression initializer =
-              parameter.target.initializer ?? forest.literalNull(
-                  // TODO(ahe): Should store: realParameter.fileOffset
-                  // https://github.com/dart-lang/sdk/issues/32289
-                  null);
+          if (parameter.isOptional) {
+            initializer ??= forest.literalNull(
+                // TODO(ahe): Should store: realParameter.fileOffset
+                // https://github.com/dart-lang/sdk/issues/32289
+                null);
+          }
           realParameter.initializer = initializer..parent = realParameter;
-          _typeInferrer.inferParameterInitializer(
+          _typeInferrer?.inferParameterInitializer(
               this, initializer, realParameter.type);
         }
       }
     }
 
-    _typeInferrer.inferFunctionBody(
+    _typeInferrer?.inferFunctionBody(
         this, _computeReturnTypeContext(member), asyncModifier, body);
 
-    // For async, async*, and sync* functions with declared return types, we need
-    // to determine whether those types are valid.
-    // TODO(hillerstrom): currently, we need to check whether [strongMode] is
+    if (transformSetLiterals) {
+      library.loader.setLiteralTransformer ??=
+          new SetLiteralTransformer(library.loader);
+      body.accept(library.loader.setLiteralTransformer);
+    }
+
+    // For async, async*, and sync* functions with declared return types, we
+    // need to determine whether those types are valid.
+    // TODO(hillerstrom): currently, we need to check whether [legacyMode] is
     // enabled for two reasons:
-    // 1) the [isSubtypeOf] predicate produces false-negatives when [strongMode]
-    // is false.
-    // 2) the member [typeEnvironment] might be null when [strongMode] is false.
+    // 1) the [isSubtypeOf] predicate produces false-negatives when
+    // [legacyMode] is enabled.
+    // 2) the member [typeEnvironment] might be null when [legacyMode] is
+    // enabled.
     // This particular behaviour can be observed when running the fasta perf
     // benchmarks.
-    bool strongMode = library.loader.target.strongMode;
-    if (strongMode && builder.returnType != null) {
+    if (!legacyMode && builder.returnType != null) {
       DartType returnType = builder.function.returnType;
       // We use the same trick in each case below. For example to decide whether
       // Future<T> <: [returnType] for every T, we rely on Future<Bot> and
@@ -797,8 +837,21 @@
           statements.add(body);
           body = forest.block(null, statements, null)..fileOffset = charOffset;
         }
-        body = wrapInProblemStatement(
-            body, fasta.messageSetterWithWrongNumberOfFormals);
+        body = forest.block(
+            null,
+            <Statement>[
+              forest.expressionStatement(
+                  // This error is added after type inference is done, so we
+                  // don't need to wrap errors in SyntheticExpressionJudgment.
+                  desugarSyntheticExpression(buildProblem(
+                      fasta.messageSetterWithWrongNumberOfFormals,
+                      charOffset,
+                      noLength)),
+                  null),
+              body,
+            ],
+            null)
+          ..fileOffset = charOffset;
       }
     }
     // No-such-method forwarders get their bodies injected during outline
@@ -814,7 +867,7 @@
       }
     }
     Member target = builder.target;
-    _typeInferrer.inferMetadata(this, annotations);
+    _typeInferrer?.inferMetadata(this, annotations);
     for (Expression annotation in annotations ?? const []) {
       target.addAnnotation(annotation);
     }
@@ -828,6 +881,7 @@
     }
 
     resolveRedirectingFactoryTargets();
+    finishVariableMetadata();
   }
 
   void resolveRedirectingFactoryTargets() {
@@ -841,20 +895,19 @@
       Procedure initialTarget = invocation.target;
       Expression replacementNode;
 
-      RedirectionTarget redirectionTarget = getRedirectionTarget(initialTarget,
-          strongMode: library.loader.target.strongMode);
+      RedirectionTarget redirectionTarget =
+          getRedirectionTarget(initialTarget, legacyMode: legacyMode);
       Member resolvedTarget = redirectionTarget?.target;
 
       if (resolvedTarget == null) {
         String name = constructorNameForDiagnostics(initialTarget.name.name,
             className: initialTarget.enclosingClass.name);
         // TODO(dmitryas): Report this error earlier.
-        replacementNode = buildProblem(
-                fasta.templateCyclicRedirectingFactoryConstructors
-                    .withArguments(name),
-                initialTarget.fileOffset,
-                name.length)
-            .desugared;
+        replacementNode = desugarSyntheticExpression(buildProblem(
+            fasta.templateCyclicRedirectingFactoryConstructors
+                .withArguments(name),
+            initialTarget.fileOffset,
+            name.length));
       } else if (resolvedTarget is Constructor &&
           resolvedTarget.enclosingClass.isAbstract) {
         replacementNode = evaluateArgumentsBefore(
@@ -875,14 +928,13 @@
           assert(redirectingFactoryBody.isUnresolved);
           String errorName = redirectingFactoryBody.unresolvedName;
 
-          replacementNode = new SyntheticExpressionJudgment(
-              throwNoSuchMethodError(
-                  forest.literalNull(null)..fileOffset = invocation.fileOffset,
-                  errorName,
-                  forest.arguments(invocation.arguments.positional, null,
-                      types: invocation.arguments.types,
-                      named: invocation.arguments.named),
-                  initialTarget.fileOffset));
+          replacementNode = throwNoSuchMethodError(
+              forest.literalNull(null)..fileOffset = invocation.fileOffset,
+              errorName,
+              forest.arguments(invocation.arguments.positional, null,
+                  types: invocation.arguments.types,
+                  named: invocation.arguments.named),
+              initialTarget.fileOffset);
         } else {
           Substitution substitution = Substitution.fromPairs(
               initialTarget.function.typeParameters,
@@ -907,9 +959,8 @@
           // TODO(dmitryas): Find a better way to unwrap
           // [SyntheticExpressionJudgment] or not to build it in the first place
           // when it's not needed.
-          if (replacementNode is SyntheticExpressionJudgment) {
-            replacementNode =
-                (replacementNode as SyntheticExpressionJudgment).desugared;
+          if (replacementNode is shadow.SyntheticExpressionJudgment) {
+            replacementNode = desugarSyntheticExpression(replacementNode);
           }
         }
       }
@@ -919,10 +970,40 @@
     redirectingFactoryInvocations.clear();
   }
 
+  void finishVariableMetadata() {
+    List<VariableDeclaration> variablesWithMetadata =
+        this.variablesWithMetadata;
+    this.variablesWithMetadata = null;
+    List<List<VariableDeclaration>> multiVariablesWithMetadata =
+        this.multiVariablesWithMetadata;
+    this.multiVariablesWithMetadata = null;
+
+    if (variablesWithMetadata != null) {
+      for (int i = 0; i < variablesWithMetadata.length; i++) {
+        _typeInferrer?.inferMetadata(
+            this, variablesWithMetadata[i].annotations);
+      }
+    }
+    if (multiVariablesWithMetadata != null) {
+      for (int i = 0; i < multiVariablesWithMetadata.length; i++) {
+        List<VariableDeclaration> variables = multiVariablesWithMetadata[i];
+        List<Expression> annotations = variables.first.annotations;
+        _typeInferrer?.inferMetadata(this, annotations);
+        for (int i = 1; i < variables.length; i++) {
+          cloner ??= new CloneVisitor();
+          VariableDeclaration variable = variables[i];
+          for (int i = 0; i < annotations.length; i++) {
+            variable.addAnnotation(cloner.clone(annotations[i]));
+          }
+        }
+      }
+    }
+  }
+
   @override
   List<Expression> finishMetadata(TreeNode parent) {
     List<Expression> expressions = pop();
-    _typeInferrer.inferMetadata(this, expressions);
+    _typeInferrer?.inferMetadata(this, expressions);
 
     // The invocation of [resolveRedirectingFactoryTargets] below may change the
     // root nodes of the annotation expressions.  We need to have a parent of
@@ -967,6 +1048,7 @@
       temporaryParent = new ListLiteral(expressions);
     }
     resolveRedirectingFactoryTargets();
+    finishVariableMetadata();
     return temporaryParent != null ? temporaryParent.expressions : expressions;
   }
 
@@ -989,7 +1071,7 @@
     for (int i = 0; i < parameters.positionalParameters.length; i++) {
       VariableDeclaration formal = parameters.positionalParameters[i];
       formals[i] = new KernelFormalParameterBuilder(
-          null, 0, null, formal.name, false, library, formal.fileOffset)
+          null, 0, null, formal.name, library, formal.fileOffset)
         ..declaration = formal;
     }
     enterLocalScope(
@@ -1011,7 +1093,7 @@
 
     ReturnJudgment fakeReturn = new ReturnJudgment(null, expression);
 
-    _typeInferrer.inferFunctionBody(
+    _typeInferrer?.inferFunctionBody(
         this, const DynamicType(), AsyncMarker.Sync, fakeReturn);
 
     return fakeReturn.expression;
@@ -1056,12 +1138,11 @@
           length = (constructor.parent as Class).name.length;
         }
         initializer = buildInvalidInitializer(
-            buildProblem(
-                    fasta.templateSuperclassHasNoDefaultConstructor
-                        .withArguments(superclass),
-                    builder.charOffset,
-                    length)
-                .desugared,
+            desugarSyntheticExpression(buildProblem(
+                fasta.templateSuperclassHasNoDefaultConstructor
+                    .withArguments(superclass),
+                builder.charOffset,
+                length)),
             builder.charOffset);
       } else {
         initializer = buildSuperInitializer(
@@ -1080,7 +1161,7 @@
   }
 
   @override
-  void endExpressionStatement(Token token) {
+  void handleExpressionStatement(Token token) {
     debugEvent("ExpressionStatement");
     push(forest.expressionStatement(popForEffect(), token));
   }
@@ -1237,7 +1318,7 @@
   void beginBinaryExpression(Token token) {
     if (optional("&&", token) || optional("||", token)) {
       Expression lhs = popForValue();
-      typePromoter.enterLogicalExpression(lhs, token.stringValue);
+      typePromoter?.enterLogicalExpression(lhs, token.stringValue);
       push(lhs);
     }
   }
@@ -1291,7 +1372,7 @@
     Expression receiver = pop();
     Expression logicalExpression =
         forest.logicalExpression(receiver, token, argument);
-    typePromoter.exitLogicalExpression(argument, logicalExpression);
+    typePromoter?.exitLogicalExpression(argument, logicalExpression);
     push(logicalExpression);
   }
 
@@ -1388,27 +1469,23 @@
             .withLocation(uri, charOffset, length);
       }
     }
-    if (!library.loader.target.strongMode &&
-        constantContext == ConstantContext.none) {
+    if (legacyMode && constantContext == ConstantContext.none) {
       addProblem(message.messageObject, message.charOffset, message.length,
           wasHandled: true, context: context);
-      return new SyntheticExpressionJudgment(
-          forest.throwExpression(
-              null,
-              library.loader.instantiateNoSuchMethodError(
-                  receiver, name, forest.castArguments(arguments), charOffset,
-                  isMethod: !isGetter && !isSetter,
-                  isGetter: isGetter,
-                  isSetter: isSetter,
-                  isStatic: isStatic,
-                  isTopLevel: !isStatic && !isSuper))
-            ..fileOffset = charOffset)
+      return forest.throwExpression(
+          null,
+          library.loader.instantiateNoSuchMethodError(
+              receiver, name, forest.castArguments(arguments), charOffset,
+              isMethod: !isGetter && !isSetter,
+              isGetter: isGetter,
+              isSetter: isSetter,
+              isStatic: isStatic,
+              isTopLevel: !isStatic && !isSuper))
         ..fileOffset = charOffset;
     }
-    return buildProblem(
-            message.messageObject, message.charOffset, message.length,
-            context: context)
-        .desugared;
+    return desugarSyntheticExpression(buildProblem(
+        message.messageObject, message.charOffset, message.length,
+        context: context));
   }
 
   @override
@@ -1517,9 +1594,6 @@
     Class cls = classBuilder.cls;
     if (isSuper) {
       cls = cls.superclass;
-      while (cls.isMixinApplication) {
-        cls = cls.superclass;
-      }
     }
     if (cls != null) {
       for (Constructor constructor in cls.constructors) {
@@ -1546,9 +1620,6 @@
 
       if (isSuper) {
         builder = getSuperclass(builder)?.origin;
-        while (builder?.isMixinApplication ?? false) {
-          builder = getSuperclass(builder)?.origin;
-        }
       }
       if (builder != null) {
         Class target = builder.target;
@@ -1660,9 +1731,9 @@
       // [ProcedureBuilder.computeFormalParameterInitializerScope]. If that
       // wasn't the case, we could always use [VariableUseGenerator].
       if (declaration.isFinal) {
-        Object fact = typePromoter.getFactForAccess(
+        Object fact = typePromoter?.getFactForAccess(
             declaration.target, functionNestingLevel);
-        Object scope = typePromoter.currentScope;
+        Object scope = typePromoter?.currentScope;
         return new ReadOnlyAccessGenerator(
             this,
             token,
@@ -1844,7 +1915,7 @@
   void handleLiteralInt(Token token) {
     debugEvent("LiteralInt");
     int value = int.tryParse(token.lexeme);
-    if (!library.loader.target.strongMode) {
+    if (legacyMode) {
       if (value == null) {
         push(unhandled(
             'large integer', 'handleLiteralInt', token.charOffset, uri));
@@ -1897,7 +1968,7 @@
 
   @override
   void endThenStatement(Token token) {
-    typePromoter.enterElse();
+    typePromoter?.enterElse();
     super.endThenStatement(token);
   }
 
@@ -1906,7 +1977,7 @@
     Statement elsePart = popStatementIfNotNull(elseToken);
     Statement thenPart = popStatement();
     Expression condition = pop();
-    typePromoter.exitConditional();
+    typePromoter?.exitConditional();
     push(forest.ifStatement(ifToken, condition, thenPart, elseToken, elsePart));
   }
 
@@ -2037,9 +2108,10 @@
       }
       VariableDeclaration variable = node;
       if (annotations != null) {
-        for (Expression annotation in annotations) {
-          variable.addAnnotation(annotation);
+        for (int i = 0; i < annotations.length; i++) {
+          variable.addAnnotation(annotations[i]);
         }
+        (variablesWithMetadata ??= <VariableDeclaration>[]).add(variable);
       }
       push(variable);
     } else {
@@ -2054,17 +2126,12 @@
         return;
       }
       if (annotations != null) {
-        bool isFirstVariable = true;
-        for (VariableDeclarationJudgment variable in variables) {
-          for (Expression annotation in annotations) {
-            variable.addAnnotation(annotation);
-          }
-          if (isFirstVariable) {
-            isFirstVariable = false;
-          } else {
-            variable.infersAnnotations = false;
-          }
+        VariableDeclaration first = variables.first;
+        for (int i = 0; i < annotations.length; i++) {
+          first.addAnnotation(annotations[i]);
         }
+        (multiVariablesWithMetadata ??= <List<VariableDeclaration>>[])
+            .add(variables);
       }
       push(forest.variablesDeclaration(variables, uri));
     }
@@ -2119,17 +2186,29 @@
     }
   }
 
-  List<VariableDeclaration> buildForInitVariableDeclarations(
-      variableOrExpression) {
+  List<VariableDeclaration> buildVariableDeclarations(variableOrExpression) {
+    // TODO(ahe): This can be simplified now that we have the events
+    // `handleForInitializer...` events.
+    if (variableOrExpression is Generator) {
+      variableOrExpression = variableOrExpression.buildForEffect();
+    }
     if (variableOrExpression is VariableDeclaration) {
       return <VariableDeclaration>[variableOrExpression];
+    } else if (variableOrExpression is Expression) {
+      VariableDeclaration variable = new VariableDeclarationJudgment.forEffect(
+          variableOrExpression, functionNestingLevel);
+      return <VariableDeclaration>[variable];
+    } else if (variableOrExpression is ExpressionStatement) {
+      VariableDeclaration variable = new VariableDeclarationJudgment.forEffect(
+          variableOrExpression.expression, functionNestingLevel);
+      return <VariableDeclaration>[variable];
     } else if (forest.isVariablesDeclaration(variableOrExpression)) {
       return forest
           .variablesDeclarationExtractDeclarations(variableOrExpression);
     } else if (variableOrExpression is List<Object>) {
       List<VariableDeclaration> variables = <VariableDeclaration>[];
       for (Object v in variableOrExpression) {
-        variables.addAll(buildForInitVariableDeclarations(v));
+        variables.addAll(buildVariableDeclarations(v));
       }
       return variables;
     } else if (variableOrExpression == null) {
@@ -2138,13 +2217,20 @@
     return null;
   }
 
-  List<Expression> buildForInitExpressions(variableOrExpression) {
-    if (variableOrExpression is Expression) {
-      return <Expression>[variableOrExpression];
-    } else if (variableOrExpression is ExpressionStatementJudgment) {
-      return <Expression>[variableOrExpression.expression];
-    }
-    return null;
+  @override
+  void handleForInitializerEmptyStatement(Token token) {
+    debugEvent("ForInitializerEmptyStatement");
+    push(NullValue.Expression);
+  }
+
+  @override
+  void handleForInitializerExpressionStatement(Token token) {
+    debugEvent("ForInitializerExpressionStatement");
+  }
+
+  @override
+  void handleForInitializerLocalVariableDeclaration(Token token) {
+    debugEvent("ForInitializerLocalVariableDeclaration");
   }
 
   @override
@@ -2155,16 +2241,8 @@
     List<Expression> updates = popListForEffect(updateExpressionCount);
     Statement conditionStatement = popStatement();
     Object variableOrExpression = pop();
-
-    variableOrExpression = variableOrExpression is Generator
-        ? variableOrExpression.buildForEffect()
-        : variableOrExpression;
-    List<Expression> initializers =
-        buildForInitExpressions(variableOrExpression);
-    List<VariableDeclaration> variableList = initializers == null
-        ? buildForInitVariableDeclarations(variableOrExpression)
-        : null;
-
+    List<VariableDeclaration> variables =
+        buildVariableDeclarations(variableOrExpression);
     exitLocalScope();
     JumpTarget continueTarget = exitContinueTarget();
     JumpTarget breakTarget = exitBreakTarget();
@@ -2182,8 +2260,7 @@
     Statement result = forest.forStatement(
         forKeyword,
         leftParen,
-        variableList,
-        initializers,
+        variables,
         leftSeparator,
         condition,
         conditionStatement,
@@ -2227,13 +2304,16 @@
             fasta.messageListLiteralTooManyTypeArguments,
             offsetForToken(leftBracket),
             lengthOfSpan(leftBracket, leftBracket.endGroup));
+        typeArgument = const InvalidType();
       } else {
         typeArgument = buildDartType(typeArguments.single);
-        if (library.loader.target.strongMode) {
+        if (!legacyMode) {
           typeArgument =
               instantiateToBounds(typeArgument, coreTypes.objectClass);
         }
       }
+    } else {
+      typeArgument = implicitTypeArgument;
     }
     Expression node = forest.literalList(
         constKeyword,
@@ -2248,6 +2328,78 @@
   }
 
   @override
+  void handleLiteralSet(
+      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
+    debugEvent("LiteralSet");
+    List<Expression> expressions = popListForValue(count);
+    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+    DartType typeArgument;
+    if (typeArguments != null) {
+      if (typeArguments.length > 1) {
+        addProblem(
+            fasta.messageSetLiteralTooManyTypeArguments,
+            offsetForToken(leftBrace),
+            lengthOfSpan(leftBrace, leftBrace.endGroup));
+        typeArgument = const InvalidType();
+      } else {
+        typeArgument = buildDartType(typeArguments.single);
+        if (!library.loader.target.legacyMode) {
+          typeArgument =
+              instantiateToBounds(typeArgument, coreTypes.objectClass);
+        }
+      }
+    } else {
+      typeArgument = implicitTypeArgument;
+    }
+    Expression node = forest.literalSet(
+        constKeyword,
+        constKeyword != null || constantContext == ConstantContext.inferred,
+        typeArgument,
+        typeArguments,
+        leftBrace,
+        expressions,
+        rightBrace);
+    library.checkBoundsInSetLiteral(node, typeEnvironment);
+    if (!library.loader.target.enableSetLiterals) {
+      node = wrapInProblem(node, fasta.messageSetLiteralsNotSupported,
+          lengthOfSpan(leftBrace, leftBrace.endGroup));
+    }
+    push(node);
+  }
+
+  @override
+  void handleEmptyLiteralSetOrMap(
+      Token leftBrace, Token constKeyword, Token rightBrace) {
+    debugEvent("EmptyLiteralSetOrMap");
+    // Treat as map literal - type inference will find the right type.
+    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+    assert(typeArguments == null || typeArguments.length > 2);
+    if (typeArguments != null && typeArguments.length > 2) {
+      if (library.loader.target.enableSetLiterals) {
+        addProblem(
+            fasta.messageSetOrMapLiteralTooManyTypeArguments,
+            offsetForToken(leftBrace),
+            lengthOfSpan(leftBrace, leftBrace.endGroup));
+      } else {
+        addProblem(
+            fasta.messageMapLiteralTypeArgumentMismatch,
+            offsetForToken(leftBrace),
+            lengthOfSpan(leftBrace, leftBrace.endGroup));
+      }
+    }
+    DartType implicitTypeArgument = this.implicitTypeArgument;
+    push(forest.literalMap(
+        constKeyword,
+        constKeyword != null || constantContext == ConstantContext.inferred,
+        implicitTypeArgument,
+        implicitTypeArgument,
+        null,
+        leftBrace,
+        <MapEntry>[],
+        rightBrace));
+  }
+
+  @override
   void handleLiteralBool(Token token) {
     debugEvent("LiteralBool");
     bool value = optional("true", token);
@@ -2282,14 +2434,20 @@
             fasta.messageMapLiteralTypeArgumentMismatch,
             offsetForToken(leftBrace),
             lengthOfSpan(leftBrace, leftBrace.endGroup));
+        keyType = const InvalidType();
+        valueType = const InvalidType();
       } else {
         keyType = buildDartType(typeArguments[0]);
         valueType = buildDartType(typeArguments[1]);
-        if (library.loader.target.strongMode) {
+        if (!legacyMode) {
           keyType = instantiateToBounds(keyType, coreTypes.objectClass);
           valueType = instantiateToBounds(valueType, coreTypes.objectClass);
         }
       }
+    } else {
+      DartType implicitTypeArgument = this.implicitTypeArgument;
+      keyType = implicitTypeArgument;
+      valueType = implicitTypeArgument;
     }
     Expression node = forest.literalMap(
         constKeyword,
@@ -2305,7 +2463,7 @@
   }
 
   @override
-  void endLiteralMapEntry(Token colon, Token endToken) {
+  void handleLiteralMapEntry(Token colon, Token endToken) {
     debugEvent("LiteralMapEntry");
     Expression value = popForValue();
     Expression key = popForValue();
@@ -2351,9 +2509,10 @@
   }
 
   @override
-  void handleType(Token beginToken) {
+  void handleType(Token beginToken, Token questionMark) {
     // TODO(ahe): The scope is wrong for return types of generic functions.
     debugEvent("Type");
+    reportErrorIfNullableType(questionMark);
     List<UnresolvedType<KernelTypeBuilder>> arguments = pop();
     Object name = pop();
     if (name is QualifiedName) {
@@ -2429,8 +2588,9 @@
   }
 
   @override
-  void endFunctionType(Token functionToken) {
+  void endFunctionType(Token functionToken, Token questionMark) {
     debugEvent("FunctionType");
+    reportErrorIfNullableType(questionMark);
     FormalParameters formals = pop();
     UnresolvedType<KernelTypeBuilder> returnType = pop();
     List<KernelTypeVariableBuilder> typeVariables = pop();
@@ -2459,12 +2619,10 @@
     library.checkBoundsInType(type, typeEnvironment, operator.charOffset);
     Expression expression = popForValue();
     if (constantContext != ConstantContext.none) {
-      push(buildProblem(
-              fasta.templateNotConstantExpression
-                  .withArguments('As expression'),
-              operator.charOffset,
-              operator.length)
-          .desugared);
+      push(desugarSyntheticExpression(buildProblem(
+          fasta.templateNotConstantExpression.withArguments('As expression'),
+          operator.charOffset,
+          operator.length)));
     } else {
       Expression node = forest.asExpression(expression, type, operator);
       push(node);
@@ -2481,16 +2639,14 @@
         forest.isExpression(operand, isOperator, not, type);
     library.checkBoundsInType(type, typeEnvironment, isOperator.charOffset);
     if (operand is VariableGet) {
-      typePromoter.handleIsCheck(isExpression, isInverted, operand.variable,
+      typePromoter?.handleIsCheck(isExpression, isInverted, operand.variable,
           type, functionNestingLevel);
     }
     if (constantContext != ConstantContext.none) {
-      push(buildProblem(
-              fasta.templateNotConstantExpression
-                  .withArguments('Is expression'),
-              isOperator.charOffset,
-              isOperator.length)
-          .desugared);
+      push(desugarSyntheticExpression(buildProblem(
+          fasta.templateNotConstantExpression.withArguments('Is expression'),
+          isOperator.charOffset,
+          isOperator.length)));
     } else {
       push(isExpression);
     }
@@ -2499,7 +2655,7 @@
   @override
   void beginConditionalExpression(Token question) {
     Expression condition = popForValue();
-    typePromoter.enterThen(condition);
+    typePromoter?.enterThen(condition);
     push(condition);
     super.beginConditionalExpression(question);
   }
@@ -2507,7 +2663,7 @@
   @override
   void handleConditionalExpressionColon() {
     Expression then = popForValue();
-    typePromoter.enterElse();
+    typePromoter?.enterElse();
     push(then);
     super.handleConditionalExpressionColon();
   }
@@ -2518,7 +2674,7 @@
     Expression elseExpression = popForValue();
     Expression thenExpression = pop();
     Expression condition = pop();
-    typePromoter.exitConditional();
+    typePromoter?.exitConditional();
     push(forest.conditionalExpression(
         condition, question, thenExpression, colon, elseExpression));
   }
@@ -2589,7 +2745,7 @@
       }
     } else {
       parameter = new KernelFormalParameterBuilder(null, modifiers,
-          type?.builder, name?.name, false, library, offsetForToken(nameToken));
+          type?.builder, name?.name, library, offsetForToken(nameToken));
     }
     VariableDeclaration variable =
         parameter.build(library, functionNestingLevel);
@@ -2605,10 +2761,12 @@
       } else {
         variable.initializer = initializer..parent = variable;
       }
+    } else if (kind != FormalParameterKind.mandatory) {
+      variable.initializer ??= forest.literalNull(null)..parent = variable;
     }
     if (annotations != null) {
       if (functionNestingLevel == 0) {
-        _typeInferrer.inferMetadata(this, annotations);
+        _typeInferrer?.inferMetadata(this, annotations);
       }
       for (Expression annotation in annotations) {
         variable.addAnnotation(annotation);
@@ -2829,12 +2987,6 @@
   }
 
   @override
-  void handleNoExpression(Token token) {
-    debugEvent("NoExpression");
-    push(NullValue.Expression);
-  }
-
-  @override
   void handleIndexedExpression(
       Token openSquareBracket, Token closeSquareBracket) {
     debugEvent("IndexedExpression");
@@ -3000,7 +3152,7 @@
       int charLength: noLength}) {
     // The argument checks for the initial target of redirecting factories
     // invocations are skipped in Dart 1.
-    if (library.loader.target.strongMode || !isRedirectingFactory(target)) {
+    if (!legacyMode || !isRedirectingFactory(target)) {
       List<TypeParameter> typeParameters = target.function.typeParameters;
       if (target is Constructor) {
         assert(!target.enclosingClass.isAbstract);
@@ -3009,13 +3161,15 @@
       LocatedMessage argMessage = checkArgumentsForFunction(
           target.function, arguments, charOffset, typeParameters);
       if (argMessage != null) {
-        return throwNoSuchMethodError(
-            forest.literalNull(null)..fileOffset = charOffset,
-            target.name.name,
-            arguments,
-            charOffset,
-            candidate: target,
-            message: argMessage);
+        return wrapSyntheticExpression(
+            throwNoSuchMethodError(
+                forest.literalNull(null)..fileOffset = charOffset,
+                target.name.name,
+                arguments,
+                charOffset,
+                candidate: target,
+                message: argMessage),
+            charOffset);
       }
     }
 
@@ -3025,12 +3179,12 @@
           isConst || constantContext != ConstantContext.none && target.isConst;
       if ((isConst || constantContext == ConstantContext.inferred) &&
           !target.isConst) {
-        return new InvalidConstructorInvocationJudgment(
-            buildProblem(
-                    fasta.messageNonConstConstructor, charOffset, charLength)
-                .desugared,
+        return wrapInvalidConstructorInvocation(
+            desugarSyntheticExpression(buildProblem(
+                fasta.messageNonConstConstructor, charOffset, charLength)),
             target,
-            arguments);
+            arguments,
+            charOffset);
       }
       ConstructorInvocation node = new ConstructorInvocation(
           target, forest.castArguments(arguments),
@@ -3045,11 +3199,12 @@
             constantContext != ConstantContext.none && procedure.isConst;
         if ((isConst || constantContext == ConstantContext.inferred) &&
             !procedure.isConst) {
-          return new InvalidConstructorInvocationJudgment(
-              buildProblem(fasta.messageNonConstFactory, charOffset, charLength)
-                  .desugared,
+          return wrapInvalidConstructorInvocation(
+              desugarSyntheticExpression(buildProblem(
+                  fasta.messageNonConstFactory, charOffset, charLength)),
               target,
-              arguments);
+              arguments,
+              charOffset);
         }
         StaticInvocation node = FactoryConstructorInvocationJudgment(
             target, forest.castArguments(arguments),
@@ -3102,9 +3257,8 @@
     if (typeParameters.length != types.length) {
       if (types.length == 0) {
         // Expected `typeParameters.length` type arguments, but none given, so
-        // we fill in dynamic in legacy mode, and use type inference in strong
-        // mode.
-        if (!library.loader.target.strongMode) {
+        // we fill in dynamic in legacy mode, and use type inference otherwise.
+        if (legacyMode) {
           for (int i = 0; i < typeParameters.length; i++) {
             types.add(const DynamicType());
           }
@@ -3230,11 +3384,13 @@
       push(new ParserErrorGenerator(
           this, nameToken, fasta.messageSyntheticToken));
     } else {
-      push(new SyntheticExpressionJudgment(throwNoSuchMethodError(
-          forest.literalNull(null)..fileOffset = offset,
-          debugName(getNodeName(type), name),
-          arguments,
-          nameToken.charOffset)));
+      push(wrapSyntheticExpression(
+          throwNoSuchMethodError(
+              forest.literalNull(null)..fileOffset = offset,
+              debugName(getNodeName(type), name),
+              arguments,
+              nameToken.charOffset),
+          offset));
     }
     constantContext = savedConstantContext;
   }
@@ -3273,6 +3429,7 @@
     }
 
     String errorName;
+    LocatedMessage message;
     if (type is ClassBuilder<TypeBuilder, Object>) {
       if (type is EnumBuilder<TypeBuilder, Object>) {
         return buildProblem(fasta.messageEnumInstantiation,
@@ -3283,9 +3440,11 @@
       Member target = b?.target;
       if (b == null) {
         // Not found. Reported below.
+      } else if (b is ProblemBuilder) {
+        message = b.message.withLocation(uri, charOffset, noLength);
       } else if (b.isConstructor) {
         if (type.isAbstract) {
-          return new InvalidConstructorInvocationJudgment(
+          return wrapInvalidConstructorInvocation(
               evaluateArgumentsBefore(
                   arguments,
                   buildAbstractClassInstantiationError(
@@ -3294,19 +3453,19 @@
                       type.name,
                       nameToken.charOffset)),
               target,
-              arguments)
-            ..fileOffset = charOffset;
+              arguments,
+              charOffset);
         }
       }
       if (target is Constructor ||
           (target is Procedure && target.kind == ProcedureKind.Factory)) {
         Expression invocation;
 
-        if (!library.loader.target.strongMode && isRedirectingFactory(target)) {
-          // In non-strong mode the checks that are done in
-          // [buildStaticInvocation] on the initial target of a redirecting
-          // factory invocation should be skipped.  So, we build the invocation
-          // nodes directly here without doing any checks.
+        if (legacyMode && isRedirectingFactory(target)) {
+          // In legacy mode the checks that are done in [buildStaticInvocation]
+          // on the initial target of a redirecting factory invocation should
+          // be skipped. So we build the invocation nodes directly here without
+          // doing any checks.
           if (target.function.typeParameters != null &&
               target.function.typeParameters.length !=
                   forest.argumentsTypeArguments(arguments).length) {
@@ -3341,14 +3500,15 @@
     }
     errorName ??= name;
 
-    return new UnresolvedTargetInvocationJudgment(
+    return wrapUnresolvedTargetInvocation(
         throwNoSuchMethodError(
             forest.literalNull(null)..fileOffset = charOffset,
             errorName,
             arguments,
-            nameLastToken.charOffset),
-        arguments)
-      ..fileOffset = arguments.fileOffset;
+            nameLastToken.charOffset,
+            message: message),
+        arguments,
+        arguments.fileOffset);
   }
 
   @override
@@ -3512,13 +3672,15 @@
         Expression expression = new NamedFunctionExpressionJudgment(variable);
         if (oldInitializer != null) {
           // This must have been a compile-time error.
-          assert(isErroneousNode(oldInitializer));
-
-          push(new SyntheticExpressionJudgment(new Let(
-              new VariableDeclaration.forValue(oldInitializer)
-                ..fileOffset = forest.readOffset(expression),
-              expression)
-            ..fileOffset = forest.readOffset(expression)));
+          Expression error = desugarSyntheticExpression(oldInitializer);
+          assert(isErroneousNode(error));
+          int offset = forest.readOffset(expression);
+          push(wrapSyntheticExpression(
+              new Let(
+                  new VariableDeclaration.forValue(error)..fileOffset = offset,
+                  expression)
+                ..fileOffset = offset,
+              offset));
         } else {
           push(expression);
         }
@@ -3572,6 +3734,25 @@
     FunctionNode function = formals.buildFunctionNode(
         library, null, typeParameters, asyncModifier, body, token.charOffset)
       ..fileOffset = beginToken.charOffset;
+
+    if (library.legacyMode && asyncModifier != AsyncMarker.Sync) {
+      DartType returnType;
+      switch (asyncModifier) {
+        case AsyncMarker.Async:
+          returnType = coreTypes.futureClass.rawType;
+          break;
+        case AsyncMarker.AsyncStar:
+          returnType = coreTypes.streamClass.rawType;
+          break;
+        case AsyncMarker.SyncStar:
+          returnType = coreTypes.iterableClass.rawType;
+          break;
+        default:
+          returnType = const DynamicType();
+          break;
+      }
+      function.returnType = returnType;
+    }
     if (constantContext != ConstantContext.none) {
       push(buildProblem(fasta.messageNotAConstantExpression, formals.charOffset,
           formals.length));
@@ -3625,20 +3806,17 @@
     exitLocalScope();
     JumpTarget continueTarget = exitContinueTarget();
     JumpTarget breakTarget = exitBreakTarget();
-    Statement kernelBody = body;
     if (continueTarget.hasUsers) {
-      kernelBody = new LabeledStatementJudgment(kernelBody);
-      continueTarget.resolveContinues(forest, kernelBody);
+      body = forest.syntheticLabeledStatement(body);
+      continueTarget.resolveContinues(forest, body);
     }
     VariableDeclaration variable;
-    bool declaresVariable = false;
-    SyntheticExpressionJudgment syntheticAssignment;
+    Expression problem;
     if (lvalue is VariableDeclaration) {
-      declaresVariable = true;
       variable = lvalue;
       if (variable.isConst) {
-        addProblem(fasta.messageForInLoopWithConstVariable, variable.fileOffset,
-            variable.name.length);
+        problem = buildProblem(fasta.messageForInLoopWithConstVariable,
+            variable.fileOffset, variable.name.length);
       }
     } else if (lvalue is Generator) {
       /// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
@@ -3654,29 +3832,58 @@
       variable =
           new VariableDeclarationJudgment.forValue(null, functionNestingLevel);
       TypePromotionFact fact =
-          typePromoter.getFactForAccess(variable, functionNestingLevel);
-      TypePromotionScope scope = typePromoter.currentScope;
-      syntheticAssignment = lvalue.buildAssignment(
+          typePromoter?.getFactForAccess(variable, functionNestingLevel);
+      TypePromotionScope scope = typePromoter?.currentScope;
+      Expression syntheticAssignment = lvalue.buildAssignment(
           new VariableGetJudgment(variable, fact, scope)
             ..fileOffset = inKeyword.offset,
           voidContext: true);
+      if (syntheticAssignment is shadow.SyntheticExpressionJudgment) {
+        syntheticAssignment = wrapSyntheticExpression(
+            desugarSyntheticExpression(syntheticAssignment),
+            offsetForToken(lvalue.token));
+      }
+      body = combineStatements(
+          forest.expressionStatement(syntheticAssignment, null), body);
     } else {
       Message message = forest.isVariablesDeclaration(lvalue)
           ? fasta.messageForInLoopExactlyOneVariable
           : fasta.messageForInLoopNotAssignable;
       Token token = forToken.next.next;
-      variable = new VariableDeclaration.forValue(
-          buildProblem(message, offsetForToken(token), lengthForToken(token)));
+      variable =
+          new VariableDeclarationJudgment.forValue(null, functionNestingLevel);
+      problem =
+          buildProblem(message, offsetForToken(token), lengthForToken(token));
+      if (forest.isVariablesDeclaration(lvalue)) {
+        body = forest.block(
+            null,
+            <Statement>[]
+              ..addAll(forest.variablesDeclarationExtractDeclarations(lvalue))
+              ..add(body),
+            null);
+      } else {
+        body =
+            combineStatements(forest.expressionStatement(lvalue, null), body);
+      }
+      body = combineStatements(
+          forest.expressionStatement(
+              buildProblem(
+                  message, offsetForToken(token), lengthForToken(token)),
+              null),
+          body);
     }
-    Statement result = new ForInJudgment(
-        variable, expression, kernelBody, declaresVariable, syntheticAssignment,
+    Statement result = new ForInStatement(variable, expression, body,
         isAsync: awaitToken != null)
       ..fileOffset = awaitToken?.charOffset ?? forToken.charOffset
-      ..bodyOffset = kernelBody.fileOffset;
+      ..bodyOffset = body.fileOffset; // TODO(ahe): Isn't this redundant?
     if (breakTarget.hasUsers) {
-      result = new LabeledStatementJudgment(result);
+      result = forest.syntheticLabeledStatement(result);
       breakTarget.resolveBreaks(forest, result);
     }
+    if (problem != null) {
+      result =
+          combineStatements(forest.expressionStatement(problem, null), result);
+    }
     exitLoopOrSwitch(result);
   }
 
@@ -3706,20 +3913,20 @@
   @override
   void endLabeledStatement(int labelCount) {
     debugEvent("LabeledStatement");
-    Statement statement = popStatement();
+    Statement statement = pop();
     LabelTarget target = pop();
     exitLocalScope();
-    if (target.breakTarget.hasUsers) {
+    if (target.breakTarget.hasUsers || target.continueTarget.hasUsers) {
+      if (forest.isVariablesDeclaration(statement)) {
+        internalProblem(
+            fasta.messageInternalProblemLabelUsageInVariablesDeclaration,
+            statement.fileOffset,
+            uri);
+      }
       if (statement is! LabeledStatement) {
         statement = forest.syntheticLabeledStatement(statement);
       }
       target.breakTarget.resolveBreaks(forest, statement);
-    }
-    statement = forest.labeledStatement(target, statement);
-    if (target.continueTarget.hasUsers) {
-      if (statement is! LabeledStatement) {
-        statement = forest.syntheticLabeledStatement(statement);
-      }
       target.continueTarget.resolveContinues(forest, statement);
     }
     push(statement);
@@ -3903,7 +4110,7 @@
     Statement result = new SwitchStatementJudgment(expression, cases)
       ..fileOffset = switchKeyword.charOffset;
     if (target.hasUsers) {
-      result = new LabeledStatementJudgment(result);
+      result = forest.syntheticLabeledStatement(result);
       target.resolveBreaks(forest, result);
     }
     exitLoopOrSwitch(result);
@@ -4081,7 +4288,7 @@
     KernelTypeVariableBuilder variable = new KernelTypeVariableBuilder(
         name.name, library, name.charOffset, null);
     if (annotations != null) {
-      _typeInferrer.inferMetadata(this, annotations);
+      _typeInferrer?.inferMetadata(this, annotations);
       for (Expression annotation in annotations) {
         variable.parameter.addAnnotation(annotation);
       }
@@ -4116,7 +4323,7 @@
     // Peek to leave type parameters on top of stack.
     List<KernelTypeVariableBuilder> typeVariables = peek();
 
-    if (library.loader.target.strongMode) {
+    if (!legacyMode) {
       List<KernelTypeBuilder> calculatedBounds = calculateBounds(
           typeVariables,
           library.loader.target.dynamicType,
@@ -4165,13 +4372,12 @@
   @override
   void handleInvalidStatement(Token token, Message message) {
     Statement statement = pop();
-    push(new ExpressionStatement(
-        buildProblem(message, statement.fileOffset, noLength).desugared));
+    push(new ExpressionStatement(desugarSyntheticExpression(
+        buildProblem(message, statement.fileOffset, noLength))));
   }
 
   @override
-  SyntheticExpressionJudgment buildProblem(
-      Message message, int charOffset, int length,
+  Expression buildProblem(Message message, int charOffset, int length,
       {List<LocatedMessage> context, bool suppressMessage: false}) {
     if (!suppressMessage) {
       addProblem(message, charOffset, length,
@@ -4179,8 +4385,8 @@
     }
     String text = library.loader.target.context
         .format(message.withLocation(uri, charOffset, length), Severity.error);
-    return new SyntheticExpressionJudgment(
-        new InvalidExpression(text)..fileOffset = charOffset);
+    return wrapSyntheticExpression(
+        new InvalidExpression(text)..fileOffset = charOffset, charOffset);
   }
 
   @override
@@ -4189,8 +4395,7 @@
     int charOffset = forest.readOffset(expression);
     Severity severity = message.code.severity;
     if (severity == Severity.error ||
-        severity == Severity.errorLegacyWarning &&
-            library.loader.target.strongMode) {
+        severity == Severity.errorLegacyWarning && !legacyMode) {
       return wrapInLocatedProblem(
           expression, message.withLocation(uri, charOffset, length),
           context: context);
@@ -4211,10 +4416,9 @@
     }
     return new Let(
         new VariableDeclaration.forValue(
-            buildProblem(
-                    message.messageObject, message.charOffset, message.length,
-                    context: context)
-                .desugared,
+            desugarSyntheticExpression(buildProblem(
+                message.messageObject, message.charOffset, message.length,
+                context: context)),
             type: const BottomType())
           ..fileOffset = offset,
         expression);
@@ -4299,12 +4503,12 @@
     return new ShadowInvalidFieldInitializer(
         field,
         value,
-        new VariableDeclaration.forValue(buildProblem(
+        new VariableDeclaration.forValue(desugarSyntheticExpression(
+            buildProblem(
                 fasta.templateFinalInstanceVariableAlreadyInitialized
                     .withArguments(name),
                 offset,
-                noLength)
-            .desugared))
+                noLength))))
       ..fileOffset = offset;
   }
 
@@ -4318,30 +4522,39 @@
   /// immediately enclosing class.  It is a static warning if the static type of
   /// _id_ is not a subtype of _Tid_."
   @override
-  Initializer buildFieldInitializer(
-      bool isSynthetic, String name, int offset, Expression expression,
+  Initializer buildFieldInitializer(bool isSynthetic, String name,
+      int fieldNameOffset, int assignmentOffset, Expression expression,
       {DartType formalType}) {
     Declaration builder =
         classBuilder.scope.local[name] ?? classBuilder.origin.scope.local[name];
-    if (builder is KernelFieldBuilder && builder.isInstanceMember) {
+    if (builder?.next != null) {
+      // Duplicated name, already reported.
+      return new LocalInitializer(
+          new VariableDeclaration.forValue(
+              desugarSyntheticExpression(buildProblem(
+                  fasta.templateDuplicatedDeclarationUse.withArguments(name),
+                  fieldNameOffset,
+                  name.length))
+                ..fileOffset = fieldNameOffset)
+            ..fileOffset = fieldNameOffset)
+        ..fileOffset = fieldNameOffset;
+    } else if (builder is KernelFieldBuilder && builder.isInstanceMember) {
       initializedFields ??= <String, int>{};
       if (initializedFields.containsKey(name)) {
-        return buildDuplicatedInitializer(
-            builder.field, expression, name, offset, initializedFields[name]);
+        return buildDuplicatedInitializer(builder.field, expression, name,
+            assignmentOffset, initializedFields[name]);
       }
-      initializedFields[name] = offset;
+      initializedFields[name] = assignmentOffset;
       if (builder.isFinal && builder.hasInitializer) {
-        // TODO(ahe): If CL 2843733002 is landed, this becomes a compile-time
-        // error. Also, this is a compile-time error in strong mode.
         addProblem(
             fasta.templateFinalInstanceVariableAlreadyInitialized
                 .withArguments(name),
-            offset,
+            assignmentOffset,
             noLength,
             context: [
               fasta.templateFinalInstanceVariableAlreadyInitializedCause
                   .withArguments(name)
-                  .withLocation(uri, builder.charOffset, noLength)
+                  .withLocation(uri, builder.charOffset, name.length)
             ]);
         Declaration constructor =
             library.loader.getDuplicatedFieldInitializerError();
@@ -4353,20 +4566,21 @@
                 buildStaticInvocation(
                     constructor.target,
                     forest.arguments(<Expression>[
-                      forest.literalString(name, null)..fileOffset = offset
+                      forest.literalString(name, null)
+                        ..fileOffset = assignmentOffset
                     ], noLocation)
-                      ..fileOffset = offset,
-                    charOffset: offset))
-              ..fileOffset = offset))
-          ..fileOffset = offset;
+                      ..fileOffset = assignmentOffset,
+                    charOffset: assignmentOffset))
+              ..fileOffset = assignmentOffset))
+          ..fileOffset = assignmentOffset;
       } else {
-        if (library.loader.target.strongMode &&
+        if (!legacyMode &&
             formalType != null &&
             !typeEnvironment.isSubtypeOf(formalType, builder.field.type)) {
           library.addProblem(
               fasta.templateInitializingFormalTypeMismatch
                   .withArguments(name, formalType, builder.field.type),
-              offset,
+              assignmentOffset,
               noLength,
               uri,
               context: [
@@ -4375,17 +4589,16 @@
               ]);
         }
         return new ShadowFieldInitializer(builder.field, expression)
-          ..fileOffset = offset
+          ..fileOffset = assignmentOffset
           ..isSynthetic = isSynthetic;
       }
     } else {
       return buildInvalidInitializer(
-          buildProblem(
-                  fasta.templateInitializerForStaticField.withArguments(name),
-                  offset,
-                  name.length)
-              .desugared,
-          offset);
+          desugarSyntheticExpression(buildProblem(
+              fasta.templateInitializerForStaticField.withArguments(name),
+              fieldNameOffset,
+              name.length)),
+          fieldNameOffset);
     }
   }
 
@@ -4397,9 +4610,10 @@
       return buildInvalidSuperInitializer(
           constructor,
           forest.castArguments(arguments),
-          buildProblem(fasta.messageConstConstructorWithNonConstSuper,
-                  charOffset, constructor.name.name.length)
-              .desugared,
+          desugarSyntheticExpression(buildProblem(
+              fasta.messageConstConstructorWithNonConstSuper,
+              charOffset,
+              constructor.name.name.length)),
           charOffset);
     }
     needsImplicitSuperInitializer = false;
@@ -4471,9 +4685,7 @@
             unresolved.fileUri,
             unresolved.charOffset,
             typeParameter.name.length);
-        if (!nonInstanceAccessIsError &&
-            !isConstant &&
-            !library.loader.target.strongMode) {
+        if (!nonInstanceAccessIsError && !isConstant && legacyMode) {
           // This is a warning in legacy mode.
           addProblem(message.messageObject, message.charOffset, message.length);
           suppressMessage = true;
@@ -4689,6 +4901,55 @@
     }
     return name.isEmpty ? className : "$className.$name";
   }
+
+  @override
+  Expression wrapSyntheticExpression(Expression desugared, int charOffset) {
+    if (legacyMode) return desugared;
+    return shadow.SyntheticWrapper.wrapSyntheticExpression(desugared)
+      ..fileOffset = charOffset;
+  }
+
+  @override
+  Expression desugarSyntheticExpression(Expression node) {
+    if (legacyMode) return node;
+    shadow.SyntheticExpressionJudgment shadowNode = node;
+    return shadowNode.desugared;
+  }
+
+  @override
+  Expression wrapInvalidConstructorInvocation(Expression desugared,
+      Member constructor, Arguments arguments, int charOffset) {
+    if (legacyMode) return desugared;
+    return shadow.SyntheticWrapper.wrapInvalidConstructorInvocation(
+        desugared, constructor, arguments)
+      ..fileOffset = charOffset;
+  }
+
+  @override
+  Expression wrapInvalidWrite(
+      Expression desugared, Expression expression, int charOffset) {
+    if (legacyMode) return desugared;
+    return shadow.SyntheticWrapper.wrapInvalidWrite(desugared, expression)
+      ..fileOffset = charOffset;
+  }
+
+  @override
+  Expression wrapUnresolvedTargetInvocation(
+      Expression desugared, Arguments arguments, int charOffset) {
+    if (legacyMode) return desugared;
+    return shadow.SyntheticWrapper.wrapUnresolvedTargetInvocation(
+        desugared, arguments)
+      ..fileOffset = charOffset;
+  }
+
+  @override
+  Expression wrapUnresolvedVariableAssignment(
+      Expression desugared, bool isCompound, Expression rhs, int charOffset) {
+    if (legacyMode) return desugared;
+    return shadow.SyntheticWrapper.wrapUnresolvedVariableAssignment(
+        desugared, isCompound, rhs)
+      ..fileOffset = charOffset;
+  }
 }
 
 class Operator {
@@ -4927,7 +5188,7 @@
     statement.parent = body;
     return body;
   } else {
-    return new Block(<Statement>[statement, body])
+    return new BlockJudgment(<Statement>[statement, body])
       ..fileOffset = statement.fileOffset;
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
new file mode 100644
index 0000000..505559d
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -0,0 +1,539 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.class_hierarchy_builder;
+
+import 'package:kernel/ast.dart'
+    show Library, Member, Name, Procedure, ProcedureKind;
+
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+
+import '../messages.dart'
+    show
+        LocatedMessage,
+        messageDeclaredMemberConflictsWithInheritedMember,
+        messageDeclaredMemberConflictsWithInheritedMemberCause,
+        messageInheritedMembersConflict,
+        messageInheritedMembersConflictCause1,
+        messageInheritedMembersConflictCause2,
+        templateDuplicatedDeclaration,
+        templateDuplicatedDeclarationCause,
+        templateMissingImplementationCause,
+        templateMissingImplementationNotAbstract;
+
+import '../names.dart' show noSuchMethodName;
+
+import '../scope.dart' show Scope;
+
+import 'kernel_builder.dart'
+    show
+        Declaration,
+        LibraryBuilder,
+        KernelClassBuilder,
+        KernelNamedTypeBuilder,
+        KernelTypeBuilder;
+
+int compareDeclarations(Declaration a, Declaration b) {
+  return ClassHierarchy.compareMembers(a.target, b.target);
+}
+
+ProcedureKind memberKind(Member member) {
+  return member is Procedure ? member.kind : null;
+}
+
+bool isNameVisibleIn(
+    Name name, LibraryBuilder<KernelTypeBuilder, Library> library) {
+  return !name.isPrivate || name.library == library.target;
+}
+
+/// Returns true if [a] is a class member conflict with [b].  [a] is assumed to
+/// be declared in the class, [b] is assumed to be inherited.
+///
+/// See the section named "Class Member Conflicts" in [Dart Programming
+/// Language Specification](
+/// ../../../../../../docs/language/dartLangSpec.tex#classMemberConflicts).
+bool isInheritanceConflict(Declaration a, Declaration b) {
+  if (a.isField) return !(b.isField || b.isGetter || b.isSetter);
+  if (b.isField) return !(a.isField || a.isGetter || a.isSetter);
+  return memberKind(a.target) != memberKind(b.target);
+}
+
+bool impliesSetter(Declaration declaration) {
+  return declaration.isField && !(declaration.isFinal || declaration.isConst);
+}
+
+class ClassHierarchyBuilder {
+  final Map<KernelClassBuilder, ClassHierarchyNode> nodes =
+      <KernelClassBuilder, ClassHierarchyNode>{};
+
+  final KernelClassBuilder objectClass;
+
+  bool hasNoSuchMethod = false;
+
+  List<Declaration> abstractMembers = null;
+
+  ClassHierarchyBuilder(this.objectClass);
+
+  /// A merge conflict arises when merging two lists that each have an element
+  /// with the same name.
+  ///
+  /// If [mergeKind] is `MergeKind.superclass`, [a] should override [b].
+  ///
+  /// If [mergeKind] is `MergeKind.interfaces`, we need to record them and
+  /// solve the conflict later.
+  ///
+  /// If [mergeKind] is `MergeKind.supertypes`, [a] should implement [b], and
+  /// [b] is implicitly abstract.
+  Declaration handleMergeConflict(KernelClassBuilder cls, Declaration a,
+      Declaration b, MergeKind mergeKind) {
+    if (a == b) return a;
+    if (a.next != null || b.next != null) {
+      // Don't check overrides involving duplicated members.
+      return a;
+    }
+    if (isInheritanceConflict(a, b)) {
+      reportInheritanceConflict(cls, a, b, mergeKind);
+    }
+    Declaration result = a;
+    if (mergeKind == MergeKind.interfaces) {
+      // TODO(ahe): Combine the signatures of a and b.  See the section named
+      // "Combined Member Signatures" in [Dart Programming Language
+      // Specification](
+      // ../../../../../../docs/language/dartLangSpec.tex#combinedMemberSignatures).
+    } else if (a.target.isAbstract) {
+      if (mergeKind == MergeKind.superclass && !b.target.isAbstract) {
+        // An abstract method doesn't override an implemention inherited from a
+        // superclass.
+        result = b;
+      } else {
+        (abstractMembers ??= <Declaration>[]).add(a);
+      }
+    }
+
+    if (mergeKind == MergeKind.superclass &&
+        result.fullNameForErrors == noSuchMethodName.name &&
+        result.parent != objectClass) {
+      hasNoSuchMethod = true;
+    }
+
+    return result;
+  }
+
+  void reportInheritanceConflict(KernelClassBuilder cls, Declaration a,
+      Declaration b, MergeKind mergeKind) {
+    String name = a.fullNameForErrors;
+    if (mergeKind == MergeKind.interfaces) {
+      cls.addProblem(messageInheritedMembersConflict, cls.charOffset,
+          cls.fullNameForErrors.length,
+          context: <LocatedMessage>[
+            messageInheritedMembersConflictCause1.withLocation(
+                a.fileUri, a.charOffset, name.length),
+            messageInheritedMembersConflictCause2.withLocation(
+                b.fileUri, b.charOffset, name.length),
+          ]);
+    } else {
+      cls.addProblem(messageDeclaredMemberConflictsWithInheritedMember,
+          a.charOffset, name.length,
+          context: <LocatedMessage>[
+            messageDeclaredMemberConflictsWithInheritedMemberCause.withLocation(
+                b.fileUri, b.charOffset, name.length)
+          ]);
+    }
+  }
+
+  /// If [mergeKind] is `MergeKind.superclass` [member] is declared in current
+  /// class, and isn't overriding a method from the superclass.
+  ///
+  /// If [mergeKind] is `MergeKind.interfaces`, [member] is ignored for now.
+  ///
+  /// If [mergeKind] is `MergeKind.supertypes`, [member] isn't
+  /// implementing/overriding anything.
+  void handleOnlyA(Declaration member, MergeKind mergeKind) {
+    Member target = member.target;
+    if (mergeKind == MergeKind.superclass && target.isAbstract) {
+      (abstractMembers ??= <Declaration>[]).add(member);
+    }
+  }
+
+  /// If [mergeKind] is `MergeKind.superclass` [member] is being inherited from
+  /// a superclass.
+  ///
+  /// If [mergeKind] is `MergeKind.interfaces`, [member] is ignored for now.
+  ///
+  /// If [mergeKind] is `MergeKind.supertypes`, [member] is implicitly
+  /// abstract, and not implemented.
+  void handleOnlyB(
+      KernelClassBuilder cls, Declaration member, MergeKind mergeKind) {
+    Member target = member.target;
+    if (mergeKind == MergeKind.supertypes ||
+        (mergeKind == MergeKind.superclass && target.isAbstract)) {
+      if (isNameVisibleIn(target.name, cls.library)) {
+        (abstractMembers ??= <Declaration>[]).add(member);
+      }
+    }
+    if (member.parent != objectClass &&
+        target.name == noSuchMethodName &&
+        !target.isAbstract) {
+      hasNoSuchMethod = true;
+    }
+  }
+
+  void add(KernelClassBuilder cls) {
+    assert(!hasNoSuchMethod);
+    assert(abstractMembers == null);
+    if (cls.isPatch) {
+      // TODO(ahe): What about patch classes. Have we injected patched members
+      // into the class-builder's scope?
+      return;
+    }
+    ClassHierarchyNode supernode;
+    if (objectClass != cls) {
+      supernode = getNode(cls.supertype);
+      if (supernode == null) {
+        supernode = nodes[objectClass];
+        if (supernode == null) {
+          add(objectClass);
+          supernode = nodes[objectClass];
+        }
+      }
+      assert(supernode != null);
+    }
+
+    Scope scope = cls.scope;
+    if (cls.isMixinApplication) {
+      Declaration mixin = getDeclaration(cls.mixedInType);
+      if (mixin is KernelClassBuilder) {
+        scope = mixin.scope;
+      }
+    }
+    // TODO(ahe): Consider if removing static members from [localMembers] and
+    // [localSetters] makes sense. It depends on what semantic checks we need
+    // to perform with respect to static members and inherited members with the
+    // same name.
+    List<Declaration> localMembers =
+        new List<Declaration>.from(scope.local.values)
+          ..sort(compareDeclarations);
+    List<Declaration> localSetters =
+        new List<Declaration>.from(scope.setters.values)
+          ..sort(compareDeclarations);
+    localSetters = mergeAccessors(cls, localMembers, localSetters);
+    List<Declaration> classMembers;
+    List<Declaration> classSetters;
+    List<Declaration> interfaceMembers;
+    List<Declaration> interfaceSetters;
+    if (supernode == null) {
+      // This should be Object.
+      classMembers = localMembers;
+      classSetters = localSetters;
+    } else {
+      classMembers = merge(
+          cls, localMembers, supernode.classMembers, MergeKind.superclass);
+      classSetters = merge(
+          cls, localSetters, supernode.classSetters, MergeKind.superclass);
+      List<KernelTypeBuilder> interfaces = cls.interfaces;
+      if (interfaces != null) {
+        MergeResult result = mergeInterfaces(cls, supernode, interfaces);
+        interfaceMembers = result.mergedMembers;
+        interfaceSetters = result.mergedSetters;
+      } else {
+        interfaceMembers = supernode.interfaceMembers;
+        interfaceSetters = supernode.interfaceSetters;
+      }
+      if (interfaceMembers != null) {
+        interfaceMembers =
+            merge(cls, classMembers, interfaceMembers, MergeKind.supertypes);
+      }
+      if (interfaceMembers != null) {
+        interfaceSetters =
+            merge(cls, classSetters, interfaceSetters, MergeKind.supertypes);
+      }
+    }
+    nodes[cls] = new ClassHierarchyNode(cls, scope, classMembers, classSetters,
+        interfaceMembers, interfaceSetters);
+
+    if (abstractMembers != null && !cls.isAbstract) {
+      if (!hasNoSuchMethod) {
+        reportMissingMembers(cls);
+      } else {
+        installNsmHandlers(cls);
+      }
+    }
+    hasNoSuchMethod = false;
+    abstractMembers = null;
+  }
+
+  MergeResult mergeInterfaces(KernelClassBuilder cls,
+      ClassHierarchyNode supernode, List<KernelTypeBuilder> interfaces) {
+    List<List<Declaration>> memberLists =
+        new List<List<Declaration>>(interfaces.length + 1);
+    List<List<Declaration>> setterLists =
+        new List<List<Declaration>>(interfaces.length + 1);
+    memberLists[0] = supernode.interfaceMembers;
+    setterLists[0] = supernode.interfaceSetters;
+    for (int i = 0; i < interfaces.length; i++) {
+      ClassHierarchyNode interfaceNode = getNode(interfaces[i]);
+      if (interfaceNode == null) {
+        memberLists[i + 1] = null;
+        setterLists[i + 1] = null;
+      } else {
+        memberLists[i + 1] =
+            interfaceNode.interfaceMembers ?? interfaceNode.classMembers;
+        setterLists[i + 1] =
+            interfaceNode.interfaceSetters ?? interfaceNode.classSetters;
+      }
+    }
+    return new MergeResult(
+        mergeLists(cls, memberLists), mergeLists(cls, setterLists));
+  }
+
+  List<Declaration> mergeLists(
+      KernelClassBuilder cls, List<List<Declaration>> input) {
+    // This is a k-way merge sort (where k is `input.length + 1`). We merge the
+    // lists pairwise, which reduces the number of lists to merge by half on
+    // each iteration. Consequently, we perform O(log k) merges.
+    while (input.length > 1) {
+      List<List<Declaration>> output = <List<Declaration>>[];
+      for (int i = 0; i < input.length - 1; i += 2) {
+        List<Declaration> first = input[i];
+        List<Declaration> second = input[i + 1];
+        if (first == null) {
+          output.add(second);
+        } else if (second == null) {
+          output.add(first);
+        } else {
+          output.add(merge(cls, first, second, MergeKind.interfaces));
+        }
+      }
+      if (input.length.isOdd) {
+        output.add(input.last);
+      }
+      input = output;
+    }
+    return input.single;
+  }
+
+  /// Merge [and check] accessors. This entails copying mutable fields to
+  /// setters to simulate implied setters, and checking that setters don't
+  /// override regular methods.
+  List<Declaration> mergeAccessors(KernelClassBuilder cls,
+      List<Declaration> members, List<Declaration> setters) {
+    final List<Declaration> mergedSetters = new List<Declaration>.filled(
+        members.length + setters.length, null,
+        growable: true);
+    int storeIndex = 0;
+    int i = 0;
+    int j = 0;
+    while (i < members.length && j < setters.length) {
+      final Declaration member = members[i];
+      final Declaration setter = setters[j];
+      final int compare = compareDeclarations(member, setter);
+      if (compare == 0) {
+        if (member.isField ? impliesSetter(member) : !member.isGetter) {
+          // [member] conflicts with [setter].
+          final String name = member.fullNameForErrors;
+          cls.library.addProblem(
+              templateDuplicatedDeclaration.withArguments(name),
+              setter.charOffset,
+              name.length,
+              setter.fileUri,
+              context: <LocatedMessage>[
+                templateDuplicatedDeclarationCause
+                    .withArguments(name)
+                    .withLocation(
+                        member.fileUri, member.charOffset, name.length)
+              ]);
+        }
+        mergedSetters[storeIndex++] = setter;
+        i++;
+        j++;
+      } else if (compare < 0) {
+        if (impliesSetter(member)) {
+          mergedSetters[storeIndex++] = member;
+        }
+        i++;
+      } else {
+        mergedSetters[storeIndex++] = setters[j];
+        j++;
+      }
+    }
+    while (i < members.length) {
+      final Declaration member = members[i];
+      if (impliesSetter(member)) {
+        mergedSetters[storeIndex++] = member;
+      }
+      i++;
+    }
+    while (j < setters.length) {
+      mergedSetters[storeIndex++] = setters[j];
+      j++;
+    }
+
+    if (storeIndex == j) {
+      return setters;
+    } else {
+      return mergedSetters..length = storeIndex;
+    }
+  }
+
+  void reportMissingMembers(KernelClassBuilder cls) {
+    Map<String, LocatedMessage> contextMap = <String, LocatedMessage>{};
+    for (int i = 0; i < abstractMembers.length; i++) {
+      Declaration declaration = abstractMembers[i];
+      Member target = declaration.target;
+      if (isNameVisibleIn(target.name, cls.library)) {
+        String name = declaration.fullNameForErrors;
+        String parentName = declaration.parent.fullNameForErrors;
+        String displayName =
+            declaration.isSetter ? "$parentName.$name=" : "$parentName.$name";
+        contextMap[displayName] = templateMissingImplementationCause
+            .withArguments(displayName)
+            .withLocation(
+                declaration.fileUri, declaration.charOffset, name.length);
+      }
+    }
+    if (contextMap.isEmpty) return;
+    List<String> names = new List<String>.from(contextMap.keys)..sort();
+    List<LocatedMessage> context = <LocatedMessage>[];
+    for (int i = 0; i < names.length; i++) {
+      context.add(contextMap[names[i]]);
+    }
+    cls.addProblem(
+        templateMissingImplementationNotAbstract.withArguments(
+            cls.fullNameForErrors, names),
+        cls.charOffset,
+        cls.fullNameForErrors.length,
+        context: context);
+  }
+
+  void installNsmHandlers(KernelClassBuilder cls) {
+    // TOOD(ahe): Implement this.
+  }
+
+  ClassHierarchyNode getNode(KernelTypeBuilder type) {
+    Declaration declaration = getDeclaration(type);
+    if (declaration is KernelClassBuilder) {
+      ClassHierarchyNode node = nodes[declaration];
+      if (node == null) {
+        bool savedHasNoSuchMethod = hasNoSuchMethod;
+        hasNoSuchMethod = false;
+        List<Declaration> savedAbstractMembers = abstractMembers;
+        abstractMembers = null;
+        add(declaration);
+        hasNoSuchMethod = savedHasNoSuchMethod;
+        abstractMembers = savedAbstractMembers;
+        node = nodes[declaration];
+      }
+      return node;
+    }
+    return null;
+  }
+
+  Declaration getDeclaration(KernelTypeBuilder type) {
+    return type is KernelNamedTypeBuilder ? type.declaration : null;
+  }
+
+  List<Declaration> merge(KernelClassBuilder cls, List<Declaration> aList,
+      List<Declaration> bList, MergeKind mergeKind) {
+    final List<Declaration> result = new List<Declaration>.filled(
+        aList.length + bList.length, null,
+        growable: true);
+    int storeIndex = 0;
+    int i = 0;
+    int j = 0;
+    while (i < aList.length && j < bList.length) {
+      final Declaration a = aList[i];
+      final Declaration b = bList[j];
+      if (a.isStatic) {
+        i++;
+        continue;
+      }
+      if (b.isStatic) {
+        j++;
+        continue;
+      }
+      final int compare = compareDeclarations(a, b);
+      if (compare == 0) {
+        result[storeIndex++] = handleMergeConflict(cls, a, b, mergeKind);
+        i++;
+        j++;
+      } else if (compare < 0) {
+        handleOnlyA(a, mergeKind);
+        result[storeIndex++] = a;
+        i++;
+      } else {
+        handleOnlyB(cls, b, mergeKind);
+        result[storeIndex++] = b;
+        j++;
+      }
+    }
+    while (i < aList.length) {
+      final Declaration a = aList[i];
+      if (!a.isStatic) {
+        handleOnlyA(a, mergeKind);
+        result[storeIndex++] = a;
+      }
+      i++;
+    }
+    while (j < bList.length) {
+      final Declaration b = bList[j];
+      if (!b.isStatic) {
+        handleOnlyB(cls, b, mergeKind);
+        result[storeIndex++] = b;
+      }
+      j++;
+    }
+    return result..length = storeIndex;
+  }
+}
+
+class ClassHierarchyNode {
+  /// The class corresponding to this hierarchy node.
+  final KernelClassBuilder cls;
+
+  /// The local members of [cls]. For regular classes, this is simply
+  /// `cls.scope`, but for mixin-applications this is the mixed-in type's
+  /// scope. The members are sorted in order of declaration.
+  // TODO(ahe): Do we need to copy the scope from the mixed-in type to remove
+  // static members?
+  final Scope localMembers;
+
+  /// All the members of this class including [classMembers] of its
+  /// superclasses. The members are sorted by [compareDeclarations].
+  final List<Declaration> classMembers;
+
+  /// Similar to [classMembers] but for setters.
+  final List<Declaration> classSetters;
+
+  /// All the interface members of this class including [interfaceMembers] of
+  /// its supertypes. The members are sorted by [compareDeclarations].
+  ///
+  /// In addition to the members of [classMembers] this also contains members
+  /// from interfaces.
+  final List<Declaration> interfaceMembers;
+
+  /// Similar to [interfaceMembers] but for setters.
+  final List<Declaration> interfaceSetters;
+
+  ClassHierarchyNode(this.cls, this.localMembers, this.classMembers,
+      this.classSetters, this.interfaceMembers, this.interfaceSetters);
+}
+
+class MergeResult {
+  final List<Declaration> mergedMembers;
+
+  final List<Declaration> mergedSetters;
+
+  MergeResult(this.mergedMembers, this.mergedSetters);
+}
+
+enum MergeKind {
+  /// Merging superclass members with the current class.
+  superclass,
+
+  /// Merging two interfaces.
+  interfaces,
+
+  /// Merging class members with interface members.
+  supertypes,
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 3621504..2a65568 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -67,12 +67,9 @@
         DynamicType,
         Expression,
         Initializer,
-        InvalidConstructorInvocationJudgment,
         Member,
         Name,
         Procedure,
-        SyntheticExpressionJudgment,
-        UnresolvedTargetInvocationJudgment,
         VariableDeclaration;
 
 import 'kernel_builder.dart'
@@ -185,10 +182,8 @@
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
     int offset = offsetForToken(token);
     return helper.buildInvalidInitializer(
-        helper
-            .buildProblem(
-                messageInvalidInitializer, offset, lengthForToken(token))
-            .desugared,
+        helper.desugarSyntheticExpression(helper.buildProblem(
+            messageInvalidInitializer, offset, lengthForToken(token))),
         offset);
   }
 
@@ -241,7 +236,7 @@
       forest.argumentsSetTypeArguments(
           arguments, helper.buildDartTypeArguments(typeArguments));
     }
-    return new InvalidConstructorInvocationJudgment(
+    return helper.wrapInvalidConstructorInvocation(
         helper.throwNoSuchMethodError(
             forest.literalNull(token),
             helper.constructorNameForDiagnostics(name,
@@ -249,7 +244,8 @@
             arguments,
             nameToken.charOffset),
         null,
-        arguments);
+        arguments,
+        offsetForToken(token));
   }
 
   bool get isThisPropertyAccess => false;
@@ -668,7 +664,7 @@
   /// Pass [arguments] that must be evaluated before throwing an error.  At
   /// most one of [isGetter] and [isSetter] should be true and they're passed
   /// to [ExpressionGeneratorHelper.throwNoSuchMethodError] if it is used.
-  SyntheticExpressionJudgment buildError(Arguments arguments,
+  Expression buildError(Arguments arguments,
       {bool isGetter: false, bool isSetter: false, int offset});
 
   Name get name => unsupported("name", offsetForToken(token), uri);
@@ -680,8 +676,8 @@
 
   @override
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    return helper.buildInvalidInitializer(
-        buildError(forest.argumentsEmpty(token), isSetter: true).desugared);
+    return helper.buildInvalidInitializer(helper.desugarSyntheticExpression(
+        buildError(forest.argumentsEmpty(token), isSetter: true)));
   }
 
   @override
@@ -772,8 +768,11 @@
       forest.argumentsSetTypeArguments(
           arguments, helper.buildDartTypeArguments(typeArguments));
     }
-    return new InvalidConstructorInvocationJudgment(
-        buildError(arguments).desugared, null, arguments);
+    return helper.wrapInvalidConstructorInvocation(
+        helper.desugarSyntheticExpression(buildError(arguments)),
+        null,
+        arguments,
+        offsetForToken(token));
   }
 }
 
@@ -791,23 +790,26 @@
 
   @override
   Expression doInvocation(int charOffset, Arguments arguments) {
-    return new UnresolvedTargetInvocationJudgment(
-        buildError(arguments, offset: charOffset).desugared, arguments)
-      ..fileOffset = arguments.fileOffset;
+    return helper.wrapUnresolvedTargetInvocation(
+        helper.desugarSyntheticExpression(
+            buildError(arguments, offset: charOffset)),
+        arguments,
+        arguments.fileOffset);
   }
 
   @override
-  SyntheticExpressionJudgment buildError(Arguments arguments,
+  Expression buildError(Arguments arguments,
       {bool isGetter: false, bool isSetter: false, int offset}) {
     offset ??= offsetForToken(this.token);
-    return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
-        forest.literalNull(null)..fileOffset = offset,
-        plainNameForRead,
-        arguments,
-        offset,
-        isGetter: isGetter,
-        isSetter: isSetter))
-      ..fileOffset = offset;
+    return helper.wrapSyntheticExpression(
+        helper.throwNoSuchMethodError(
+            forest.literalNull(null)..fileOffset = offset,
+            plainNameForRead,
+            arguments,
+            offset,
+            isGetter: isGetter,
+            isSetter: isSetter),
+        offset);
   }
 
   @override
@@ -976,8 +978,8 @@
         !generator.isThisPropertyAccess) {
       return generator.buildFieldInitializer(initializedFields);
     }
-    return helper.buildFieldInitializer(
-        false, generator.plainNameForRead, offsetForToken(token), value);
+    return helper.buildFieldInitializer(false, generator.plainNameForRead,
+        offsetForToken(generator.token), offsetForToken(token), value);
   }
 }
 
@@ -1135,11 +1137,13 @@
 
   @override
   Expression doInvocation(int offset, Arguments arguments) {
-    return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
-        forest.literalNull(null)..fileOffset = offset,
-        plainNameForRead,
-        arguments,
-        offsetForToken(token)));
+    return helper.wrapSyntheticExpression(
+        helper.throwNoSuchMethodError(
+            forest.literalNull(null)..fileOffset = offset,
+            plainNameForRead,
+            arguments,
+            offsetForToken(token)),
+        offsetForToken(token));
   }
 
   @override
@@ -1181,7 +1185,7 @@
   @override
   void printOn(StringSink sink) {}
 
-  SyntheticExpressionJudgment buildProblem() {
+  Expression buildProblem() {
     return helper.buildProblem(message, offsetForToken(token), noLength,
         suppressMessage: true);
   }
@@ -1222,7 +1226,8 @@
   Expression makeInvalidWrite(Expression value) => buildProblem();
 
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    return helper.buildInvalidInitializer(buildProblem().desugared);
+    return helper.buildInvalidInitializer(
+        helper.desugarSyntheticExpression(buildProblem()));
   }
 
   Expression doInvocation(int offset, Arguments arguments) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 095ae58..8c28085 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -57,6 +57,8 @@
 
   Forest get forest;
 
+  bool get legacyMode;
+
   Constructor lookupConstructor(Name name, {bool isSuper});
 
   Expression toValue(node);
@@ -70,8 +72,8 @@
 
   Initializer buildInvalidInitializer(Expression expression, [int offset]);
 
-  Initializer buildFieldInitializer(
-      bool isSynthetic, String name, int offset, Expression expression,
+  Initializer buildFieldInitializer(bool isSynthetic, String name,
+      int fieldNameOffset, int assignmentOffset, Expression expression,
       {DartType formalType});
 
   Initializer buildSuperInitializer(
@@ -150,4 +152,18 @@
 
   void reportDuplicatedDeclaration(
       Declaration existing, String name, int charOffset);
+
+  Expression wrapSyntheticExpression(Expression node, int charOffset);
+
+  Expression wrapInvalidConstructorInvocation(Expression desugared,
+      Member constructor, Arguments arguments, int charOffset);
+
+  Expression wrapInvalidWrite(
+      Expression desugared, Expression expression, int charOffset);
+
+  Expression wrapUnresolvedTargetInvocation(
+      Expression desugared, Arguments arguments, int charOffset);
+
+  Expression wrapUnresolvedVariableAssignment(
+      Expression desugared, bool isCompound, Expression rhs, int charOffset);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index dc3d66a..412bc68 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -14,6 +14,7 @@
         AwaitExpression,
         Block,
         BoolLiteral,
+        BreakStatement,
         Catch,
         CheckLibraryIsLoaded,
         ConditionalExpression,
@@ -23,6 +24,7 @@
         ExpressionStatement,
         InvalidExpression,
         IsExpression,
+        LabeledStatement,
         Let,
         LibraryDependency,
         LogicalExpression,
@@ -80,9 +82,7 @@
         AssertInitializerJudgment,
         AssertStatementJudgment,
         BlockJudgment,
-        BreakJudgment,
         CatchJudgment,
-        ContinueJudgment,
         DoJudgment,
         DoubleJudgment,
         EmptyStatementJudgment,
@@ -90,12 +90,11 @@
         ForJudgment,
         IfJudgment,
         IntJudgment,
-        LabeledStatementJudgment,
         ListLiteralJudgment,
         LoadLibraryJudgment,
-        MapEntryJudgment,
         MapLiteralJudgment,
         ReturnJudgment,
+        SetLiteralJudgment,
         ShadowLargeIntLiteral,
         SymbolLiteralJudgment,
         SyntheticExpressionJudgment,
@@ -194,20 +193,36 @@
   }
 
   @override
+  SetLiteralJudgment literalSet(
+      Token constKeyword,
+      bool isConst,
+      Object typeArgument,
+      Object typeArguments,
+      Token leftBrace,
+      List<Expression> expressions,
+      Token rightBrace) {
+    // TODO(brianwilkerson): The file offset computed below will not be correct
+    // if there are type arguments but no `const` keyword.
+    return new SetLiteralJudgment(expressions,
+        typeArgument: typeArgument, isConst: isConst)
+      ..fileOffset = offsetForToken(constKeyword ?? leftBrace);
+  }
+
+  @override
   MapLiteralJudgment literalMap(
       Token constKeyword,
       bool isConst,
       DartType keyType,
       DartType valueType,
       Object typeArguments,
-      Token leftBracket,
+      Token leftBrace,
       List<MapEntry> entries,
-      Token rightBracket) {
+      Token rightBrace) {
     // TODO(brianwilkerson): The file offset computed below will not be correct
     // if there are type arguments but no `const` keyword.
     return new MapLiteralJudgment(entries,
         keyType: keyType, valueType: valueType, isConst: isConst)
-      ..fileOffset = offsetForToken(constKeyword ?? leftBracket);
+      ..fileOffset = offsetForToken(constKeyword ?? leftBrace);
   }
 
   @override
@@ -237,7 +252,7 @@
 
   @override
   MapEntry mapEntry(Expression key, Token colon, Expression value) {
-    return new MapEntryJudgment(key, value)..fileOffset = offsetForToken(colon);
+    return new MapEntry(key, value)..fileOffset = offsetForToken(colon);
   }
 
   @override
@@ -336,7 +351,7 @@
 
   @override
   Statement breakStatement(Token breakKeyword, Object label, Token semicolon) {
-    return new BreakJudgment(null)..fileOffset = breakKeyword.charOffset;
+    return new BreakStatement(null)..fileOffset = breakKeyword.charOffset;
   }
 
   @override
@@ -364,7 +379,7 @@
   @override
   Statement continueStatement(
       Token continueKeyword, Object label, Token semicolon) {
-    return new ContinueJudgment(null)..fileOffset = continueKeyword.charOffset;
+    return new BreakStatement(null)..fileOffset = continueKeyword.charOffset;
   }
 
   @override
@@ -386,16 +401,14 @@
   Statement forStatement(
       Token forKeyword,
       Token leftParenthesis,
-      List<VariableDeclaration> variableList,
-      List<Expression> initializers,
+      List<VariableDeclaration> variables,
       Token leftSeparator,
       Expression condition,
       Statement conditionStatement,
       List<Expression> updaters,
       Token rightParenthesis,
       Statement body) {
-    return new ForJudgment(
-        variableList, initializers, condition, updaters, body)
+    return new ForJudgment(variables, condition, updaters, body)
       ..fileOffset = forKeyword.charOffset;
   }
 
@@ -462,7 +475,7 @@
 
   @override
   Statement syntheticLabeledStatement(Statement statement) {
-    return new LabeledStatementJudgment(statement);
+    return new LabeledStatement(statement);
   }
 
   @override
@@ -481,10 +494,14 @@
   @override
   Statement tryStatement(Token tryKeyword, Statement body,
       List<Catch> catchClauses, Token finallyKeyword, Statement finallyBlock) {
-    if (finallyBlock != null) {
-      return new TryFinallyJudgment(body, catchClauses, finallyBlock);
+    Statement result = body;
+    if (catchClauses != null) {
+      result = new TryCatchJudgment(result, catchClauses);
     }
-    return new TryCatchJudgment(body, catchClauses ?? const <CatchJudgment>[]);
+    if (finallyBlock != null) {
+      result = new TryFinallyJudgment(result, finallyBlock);
+    }
+    return result;
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index a7ab83b..2ec0e2c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -111,6 +111,26 @@
       List<Expression> expressions,
       Token rightBracket);
 
+  /// Return a representation of a set literal. The [constKeyword] is the
+  /// location of the `const` keyword, or `null` if there is no keyword. The
+  /// [isConst] is `true` if the literal is either explicitly or implicitly a
+  /// constant. The [typeArgument] is the representation of the single valid
+  /// type argument preceding the set literal, or `null` if there is no type
+  /// argument, there is more than one type argument, or if the type argument
+  /// cannot be resolved. The [typeArguments] is the representation of all of
+  /// the type arguments preceding the set literal, or `null` if there are no
+  /// type arguments. The [leftBrace] is the location of the `{`. The list of
+  /// [expressions] is a list of the representations of the set elements. The
+  /// [rightBrace] is the location of the `}`.
+  Expression literalSet(
+      Token constKeyword,
+      bool isConst,
+      Object typeArgument,
+      Object typeArguments,
+      Token leftBrace,
+      List<Expression> expressions,
+      Token rightBrace);
+
   /// Return a representation of a map literal. The [constKeyword] is the
   /// location of the `const` keyword, or `null` if there is no keyword. The
   /// [isConst] is `true` if the literal is either explicitly or implicitly a
@@ -121,18 +141,18 @@
   /// the map literal, or `null` if there are not exactly two type arguments or
   /// if the second type argument cannot be resolved. The [typeArguments] is the
   /// representation of all of the type arguments preceding the map literal, or
-  /// `null` if there are no type arguments. The [leftBracket] is the location
+  /// `null` if there are no type arguments. The [leftBrace] is the location
   /// of the `{`. The list of [entries] is a list of the representations of the
-  /// map entries. The [rightBracket] is the location of the `}`.
+  /// map entries. The [rightBrace] is the location of the `}`.
   Expression literalMap(
       Token constKeyword,
       bool isConst,
       DartType keyType,
       DartType valueType,
       Object typeArguments,
-      Token leftBracket,
+      Token leftBrace,
       List<MapEntry> entries,
-      Token rightBracket);
+      Token rightBrace);
 
   /// Return a representation of a null literal at the given [location].
   Expression literalNull(Token location);
@@ -226,8 +246,7 @@
   Statement forStatement(
       Token forKeyword,
       Token leftParenthesis,
-      List<VariableDeclaration> variableList,
-      List<Expression> initializers,
+      List<VariableDeclaration> variables,
       Token leftSeparator,
       Expression condition,
       Statement conditionStatement,
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_type.dart
new file mode 100644
index 0000000..218438d
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_type.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.implicit_type;
+
+import 'package:kernel/ast.dart'
+    show DartType, DartTypeVisitor, DartTypeVisitor1, Visitor;
+
+import '../../scanner/token.dart' show Token;
+
+import '../problems.dart' show unsupported;
+
+import 'kernel_builder.dart' show MemberBuilder;
+
+class ImplicitType extends DartType {
+  final MemberBuilder member;
+  final Token initializerToken;
+
+  const ImplicitType(this.member, this.initializerToken);
+
+  accept(DartTypeVisitor<Object> v) {
+    unsupported("accept", member.charOffset, member.fileUri);
+  }
+
+  accept1(DartTypeVisitor1<Object, Object> v, arg) {
+    unsupported("accept1", member.charOffset, member.fileUri);
+  }
+
+  visitChildren(Visitor<Object> v) {
+    unsupported("visitChildren", member.charOffset, member.fileUri);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
new file mode 100644
index 0000000..7195bac
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library fasta.implicit_type_argument;
+
+import 'package:kernel/ast.dart'
+    show DartType, DartTypeVisitor, DartTypeVisitor1, Visitor;
+
+import '../problems.dart' show unhandled;
+
+/// Marker type used as type argument on list, set and map literals whenever
+/// type arguments are omitted in the source.
+///
+/// All of these types are replaced by the type inference. It is an internal
+/// error if one survives to the final output.
+class ImplicitTypeArgument extends DartType {
+  const ImplicitTypeArgument();
+
+  @override
+  accept(DartTypeVisitor<Object> v) {
+    unhandled("$runtimeType", "${v.runtimeType}", -1, null);
+  }
+
+  @override
+  accept1(DartTypeVisitor1<Object, Object> v, arg) {
+    unhandled("$runtimeType", "${v.runtimeType}", -1, null);
+  }
+
+  @override
+  visitChildren(Visitor<Object> v) {
+    unhandled("$runtimeType", "${v.runtimeType}", -1, null);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 7aaef01..7d20b9c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -16,7 +16,7 @@
   }
 
   @override
-  void defaultStatement(Statement node, DartType _) {
+  void defaultStatement(Statement node, _) {
     unhandled("${node.runtimeType}", "InferenceVistor", node.fileOffset,
         inferrer.helper.uri);
   }
@@ -80,20 +80,15 @@
   @override
   void visitBoolLiteral(BoolLiteral node, DartType typeContext) {}
 
-  void visitBreakJudgment(BreakJudgment node) {
-    // No inference needs to be done.
-  }
-
-  void visitContinueJudgment(ContinueJudgment node) {
+  @override
+  void visitBreakStatement(BreakStatement node, _) {
     // No inference needs to be done.
   }
 
   void visitCascadeJudgment(CascadeJudgment node, DartType typeContext) {
     node.inferredType =
         inferrer.inferExpression(node.targetJudgment, typeContext, true);
-    if (inferrer.strongMode) {
-      node.variable.type = getInferredType(node, inferrer);
-    }
+    node.variable.type = getInferredType(node, inferrer);
     for (var judgment in node.cascadeJudgments) {
       inferrer.inferExpression(
           judgment, const UnknownType(), !inferrer.isTopLevel,
@@ -120,9 +115,7 @@
     DartType inferredType = inferrer.typeSchemaEnvironment
         .getStandardUpperBound(getInferredType(then, inferrer),
             getInferredType(otherwise, inferrer));
-    if (inferrer.strongMode) {
-      node.staticType = inferredType;
-    }
+    node.staticType = inferredType;
   }
 
   @override
@@ -195,7 +188,7 @@
 
   void visitDoJudgment(DoJudgment node) {
     var conditionJudgment = node.conditionJudgment;
-    inferrer.inferStatement(node.bodyJudgment);
+    inferrer.inferStatement(node.body);
     var boolType = inferrer.coreTypes.boolClass.rawType;
     inferrer.inferExpression(conditionJudgment, boolType, !inferrer.isTopLevel);
     inferrer.ensureAssignable(
@@ -247,46 +240,60 @@
         node.field.type, initializerType, node.value, node.fileOffset);
   }
 
-  void visitForInJudgment(ForInJudgment node) {
-    var iterableClass = node.isAsync
-        ? inferrer.coreTypes.streamClass
-        : inferrer.coreTypes.iterableClass;
-    DartType context;
+  void handleForInStatementDeclaringVariable(ForInStatement node) {
+    DartType elementType;
     bool typeNeeded = false;
     bool typeChecksNeeded = !inferrer.isTopLevel;
-    VariableDeclarationJudgment variable;
-    var syntheticAssignment = node._syntheticAssignment;
-    DartType syntheticWriteType;
-    if (node._declaresVariable) {
-      variable = node.variableJudgment;
-      if (inferrer.strongMode && variable._implicitlyTyped) {
-        typeNeeded = true;
-        context = const UnknownType();
-      } else {
-        context = variable.type;
-      }
-    } else if (syntheticAssignment is ComplexAssignmentJudgment) {
-      syntheticWriteType =
-          context = syntheticAssignment._getWriteType(inferrer);
+    final VariableDeclaration variable = node.variable;
+    if (VariableDeclarationJudgment.isImplicitlyTyped(variable)) {
+      typeNeeded = true;
+      elementType = const UnknownType();
     } else {
-      context = const UnknownType();
+      elementType = variable.type;
     }
-    context = inferrer.wrapType(context, iterableClass);
 
-    var iterableJudgment = node.iterableJudgment;
-    inferrer.inferExpression(
-        iterableJudgment, context, typeNeeded || typeChecksNeeded);
-    var inferredExpressionType = inferrer
-        .resolveTypeParameter(getInferredType(iterableJudgment, inferrer));
+    DartType inferredType =
+        inferForInIterable(node, elementType, typeNeeded || typeChecksNeeded);
+    if (typeNeeded) {
+      inferrer.instrumentation?.record(inferrer.uri, variable.fileOffset,
+          'type', new InstrumentationValueForType(inferredType));
+      variable.type = inferredType;
+    }
+
+    inferrer.inferStatement(node.body);
+
+    VariableDeclaration tempVar =
+        new VariableDeclaration(null, type: inferredType, isFinal: true);
+    VariableGet variableGet = new VariableGet(tempVar)
+      ..fileOffset = variable.fileOffset;
+    Expression implicitDowncast = inferrer.ensureAssignable(
+        variable.type, inferredType, variableGet, node.fileOffset,
+        template: templateForInLoopElementTypeNotAssignable);
+    if (implicitDowncast != null) {
+      node.variable = tempVar..parent = node;
+      variable.initializer = implicitDowncast..parent = variable;
+      node.body = combineStatements(variable, node.body)..parent = node;
+    }
+  }
+
+  DartType inferForInIterable(
+      ForInStatement node, DartType elementType, bool typeNeeded) {
+    Class iterableClass = node.isAsync
+        ? inferrer.coreTypes.streamClass
+        : inferrer.coreTypes.iterableClass;
+    DartType context = inferrer.wrapType(elementType, iterableClass);
+    Expression iterable = node.iterable;
+    inferrer.inferExpression(iterable, context, typeNeeded);
+    DartType inferredExpressionType =
+        inferrer.resolveTypeParameter(getInferredType(iterable, inferrer));
     inferrer.ensureAssignable(
         inferrer.wrapType(const DynamicType(), iterableClass),
         inferredExpressionType,
         node.iterable,
         node.iterable.fileOffset,
         template: templateForInLoopTypeNotIterable);
-
     DartType inferredType;
-    if (typeNeeded || typeChecksNeeded) {
+    if (typeNeeded) {
       inferredType = const DynamicType();
       if (inferredExpressionType is InterfaceType) {
         InterfaceType supertype = inferrer.classHierarchy
@@ -295,67 +302,87 @@
           inferredType = supertype.typeArguments[0];
         }
       }
-      if (typeNeeded) {
-        inferrer.instrumentation?.record(inferrer.uri, variable.fileOffset,
-            'type', new InstrumentationValueForType(inferredType));
-        variable.type = inferredType;
+    }
+    return inferredType;
+  }
+
+  void handleForInStatementWithoutVariable(ForInStatement node) {
+    DartType elementType;
+    bool typeChecksNeeded = !inferrer.isTopLevel;
+    DartType syntheticWriteType;
+    Expression syntheticAssignment;
+    Block block = node.body;
+    ExpressionStatement statement = block.statements[0];
+    SyntheticExpressionJudgment judgment = statement.expression;
+    Expression rhs;
+    syntheticAssignment = judgment.desugared;
+    if (syntheticAssignment is VariableSet) {
+      syntheticWriteType = elementType = syntheticAssignment.variable.type;
+      rhs = syntheticAssignment.value;
+    } else if (syntheticAssignment is PropertySet ||
+        syntheticAssignment is SuperPropertySet) {
+      DartType receiverType = inferrer.thisType;
+      Object writeMember =
+          inferrer.findPropertySetMember(receiverType, syntheticAssignment);
+      syntheticWriteType =
+          elementType = inferrer.getSetterType(writeMember, receiverType);
+      if (syntheticAssignment is PropertySet) {
+        rhs = syntheticAssignment.value;
+      } else if (syntheticAssignment is SuperPropertySet) {
+        rhs = syntheticAssignment.value;
       }
-      if (!node._declaresVariable) {
-        node.variable.type = inferredType;
-      }
+    } else if (syntheticAssignment is StaticSet) {
+      syntheticWriteType = elementType = syntheticAssignment.target.setterType;
+      rhs = syntheticAssignment.value;
+    } else if (syntheticAssignment is InvalidExpression) {
+      elementType = const UnknownType();
+    } else {
+      unhandled(
+          "${syntheticAssignment.runtimeType}",
+          "handleForInStatementWithoutVariable",
+          syntheticAssignment.fileOffset,
+          inferrer.helper.uri);
     }
 
-    inferrer.inferStatement(node.bodyJudgment);
-    if (syntheticAssignment != null) {
-      var syntheticStatement = new ExpressionStatement(syntheticAssignment);
-      node.body = combineStatements(syntheticStatement, node.body)
-        ..parent = node;
+    DartType inferredType =
+        inferForInIterable(node, elementType, typeChecksNeeded);
+    if (typeChecksNeeded) {
+      node.variable.type = inferredType;
     }
-    if (node._declaresVariable) {
-      inferrer.inferMetadataKeepingHelper(variable.annotations);
-      var tempVar =
-          new VariableDeclaration(null, type: inferredType, isFinal: true);
-      var variableGet = new VariableGet(tempVar)
-        ..fileOffset = node.variable.fileOffset;
-      var implicitDowncast = inferrer.ensureAssignable(
-          variable.type, inferredType, variableGet, node.fileOffset,
-          template: templateForInLoopElementTypeNotAssignable);
-      if (implicitDowncast != null) {
-        node.variable = tempVar..parent = node;
-        variable.initializer = implicitDowncast..parent = variable;
-        node.body = combineStatements(variable, node.body)..parent = node;
-      }
-    } else if (syntheticAssignment is SyntheticExpressionJudgment) {
-      if (syntheticAssignment is ComplexAssignmentJudgment) {
-        inferrer.ensureAssignable(
-            greatestClosure(inferrer.coreTypes, syntheticWriteType),
-            node.variable.type,
-            syntheticAssignment.rhs,
-            syntheticAssignment.rhs.fileOffset,
-            template: templateForInLoopElementTypeNotAssignable,
-            isVoidAllowed: true);
-        if (syntheticAssignment is PropertyAssignmentJudgment) {
-          syntheticAssignment._handleWriteContravariance(
-              inferrer, inferrer.thisType);
-        }
-      }
-      syntheticAssignment._replaceWithDesugared();
+
+    inferrer.inferStatement(node.body);
+
+    if (syntheticWriteType != null) {
+      inferrer.ensureAssignable(
+          greatestClosure(inferrer.coreTypes, syntheticWriteType),
+          node.variable.type,
+          rhs,
+          rhs.fileOffset,
+          template: templateForInLoopElementTypeNotAssignable,
+          isVoidAllowed: true);
+    }
+  }
+
+  @override
+  void visitForInStatement(ForInStatement node, _) {
+    if (node.variable.name == null) {
+      handleForInStatementWithoutVariable(node);
+    } else {
+      handleForInStatementDeclaringVariable(node);
     }
   }
 
   void visitForJudgment(ForJudgment node) {
-    var initializers = node.initializers;
     var conditionJudgment = node.conditionJudgment;
-    if (initializers != null) {
-      for (var initializer in initializers) {
-        node.variables
-            .add(new VariableDeclaration.forValue(initializer)..parent = node);
-        inferrer.inferExpression(
-            initializer, const UnknownType(), !inferrer.isTopLevel,
-            isVoidAllowed: true);
-      }
-    } else {
-      for (var variable in node.variableJudgments) {
+    for (VariableDeclaration variable in node.variables) {
+      if (variable.name == null) {
+        Expression initializer = variable.initializer;
+        if (initializer != null) {
+          variable.type = inferrer.inferExpression(
+              initializer, const UnknownType(), true,
+              isVoidAllowed: true);
+        }
+      } else {
         inferrer.inferStatement(variable);
       }
     }
@@ -374,7 +401,7 @@
           update, const UnknownType(), !inferrer.isTopLevel,
           isVoidAllowed: true);
     }
-    inferrer.inferStatement(node.bodyJudgment);
+    inferrer.inferStatement(node.body);
   }
 
   ExpressionInferenceResult visitFunctionNodeJudgment(
@@ -388,9 +415,8 @@
 
   void visitFunctionDeclarationJudgment(FunctionDeclarationJudgment node) {
     inferrer.inferMetadataKeepingHelper(node.variable.annotations);
-    DartType returnContext = node._hasImplicitReturnType
-        ? (inferrer.strongMode ? null : const DynamicType())
-        : node.function.returnType;
+    DartType returnContext =
+        node._hasImplicitReturnType ? null : node.function.returnType;
     var inferenceResult = visitFunctionNodeJudgment(
         node.functionJudgment, null, returnContext, node.fileOffset);
     node.variable.type = inferenceResult.type;
@@ -425,9 +451,7 @@
     // - Infer e0 in context K to get T0
     inferrer.inferExpression(leftJudgment, typeContext, true);
     var lhsType = getInferredType(leftJudgment, inferrer);
-    if (inferrer.strongMode) {
-      node.variable.type = lhsType;
-    }
+    node.variable.type = lhsType;
     // - Let J = T0 if K is `?` else K.
     // - Infer e1 in context J to get T1
     if (typeContext is UnknownType) {
@@ -443,9 +467,7 @@
     // - Then the inferred type is T.
     node.inferredType =
         inferrer.typeSchemaEnvironment.getStandardUpperBound(lhsType, rhsType);
-    if (inferrer.strongMode) {
-      node.body.staticType = getInferredType(node, inferrer);
-    }
+    node.body.staticType = getInferredType(node, inferrer);
     return null;
   }
 
@@ -459,9 +481,9 @@
         getInferredType(conditionJudgment, inferrer),
         node.condition,
         node.condition.fileOffset);
-    inferrer.inferStatement(node.thenJudgment);
-    if (node.otherwiseJudgment != null) {
-      inferrer.inferStatement(node.otherwiseJudgment);
+    inferrer.inferStatement(node.then);
+    if (node.otherwise != null) {
+      inferrer.inferStatement(node.otherwise);
     }
   }
 
@@ -574,12 +596,11 @@
 
     int intValue = node.asInt64();
     if (intValue == null) {
-      Expression replacement = inferrer.helper
-          .buildProblem(
+      Expression replacement = inferrer.helper.desugarSyntheticExpression(
+          inferrer.helper.buildProblem(
               templateIntegerLiteralIsOutOfRange.withArguments(node.literal),
               node.fileOffset,
-              node.literal.length)
-          .desugared;
+              node.literal.length));
       node.parent.replaceChild(node, replacement);
       node.inferredType = const BottomType();
       return null;
@@ -612,8 +633,9 @@
         node.operand, const UnknownType(), !inferrer.isTopLevel);
   }
 
-  void visitLabeledStatementJudgment(LabeledStatementJudgment node) {
-    inferrer.inferStatement(node.judgment);
+  @override
+  void visitLabeledStatement(LabeledStatement node, _) {
+    inferrer.inferStatement(node.body);
   }
 
   void visitListLiteralJudgment(
@@ -624,8 +646,7 @@
     DartType inferredTypeArgument;
     List<DartType> formalTypes;
     List<DartType> actualTypes;
-    bool inferenceNeeded =
-        node._declaredTypeArgument == null && inferrer.strongMode;
+    bool inferenceNeeded = node.typeArgument is ImplicitTypeArgument;
     bool typeChecksNeeded = !inferrer.isTopLevel;
     if (inferenceNeeded || typeChecksNeeded) {
       formalTypes = [];
@@ -638,11 +659,11 @@
           isConst: node.isConst);
       inferredTypeArgument = inferredTypes[0];
     } else {
-      inferredTypeArgument = node._declaredTypeArgument ?? const DynamicType();
+      inferredTypeArgument = node.typeArgument;
     }
     if (inferenceNeeded || typeChecksNeeded) {
-      for (int i = 0; i < node.judgments.length; ++i) {
-        Expression judgment = node.judgments[i];
+      for (int i = 0; i < node.expressions.length; ++i) {
+        Expression judgment = node.expressions[i];
         inferrer.inferExpression(
             judgment, inferredTypeArgument, inferenceNeeded || typeChecksNeeded,
             isVoidAllowed: true);
@@ -669,16 +690,15 @@
       node.typeArgument = inferredTypeArgument;
     }
     if (typeChecksNeeded) {
-      for (int i = 0; i < node.judgments.length; i++) {
+      for (int i = 0; i < node.expressions.length; i++) {
         inferrer.ensureAssignable(node.typeArgument, actualTypes[i],
-            node.judgments[i], node.judgments[i].fileOffset,
+            node.expressions[i], node.expressions[i].fileOffset,
             isVoidAllowed: node.typeArgument is VoidType);
       }
     }
     node.inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
     KernelLibraryBuilder inferrerLibrary = inferrer.library;
-    if (node._declaredTypeArgument == null &&
-        inferrerLibrary is KernelLibraryBuilder) {
+    if (inferenceNeeded && inferrerLibrary is KernelLibraryBuilder) {
       inferrerLibrary.checkBoundsInListLiteral(
           node, inferrer.typeSchemaEnvironment,
           inferred: true);
@@ -700,21 +720,6 @@
     return null;
   }
 
-  void visitMapEntryJudgment(MapEntryJudgment node, DartType keyTypeContext,
-      DartType valueTypeContext) {
-    Expression keyJudgment = node.keyJudgment;
-    inferrer.inferExpression(keyJudgment, keyTypeContext, true,
-        isVoidAllowed: true);
-    node.inferredKeyType = getInferredType(keyJudgment, inferrer);
-
-    Expression valueJudgment = node.valueJudgment;
-    inferrer.inferExpression(valueJudgment, valueTypeContext, true,
-        isVoidAllowed: true);
-    node.inferredValueType = getInferredType(valueJudgment, inferrer);
-
-    return null;
-  }
-
   void visitMapLiteralJudgment(MapLiteralJudgment node, DartType typeContext) {
     var mapClass = inferrer.coreTypes.mapClass;
     var mapType = mapClass.thisType;
@@ -723,9 +728,33 @@
     DartType inferredValueType;
     List<DartType> formalTypes;
     List<DartType> actualTypes;
-    assert(
-        (node._declaredKeyType == null) == (node._declaredValueType == null));
-    bool inferenceNeeded = node._declaredKeyType == null && inferrer.strongMode;
+    assert((node.keyType is ImplicitTypeArgument) ==
+        (node.valueType is ImplicitTypeArgument));
+    bool inferenceNeeded = node.keyType is ImplicitTypeArgument;
+    KernelLibraryBuilder library = inferrer.library;
+    if (library != null &&
+        library.loader.target.enableSetLiterals &&
+        inferenceNeeded &&
+        node.entries.isEmpty) {
+      // Ambiguous set/map literal
+      DartType context =
+          inferrer.typeSchemaEnvironment.unfutureType(typeContext);
+      if (context is InterfaceType) {
+        if (inferrer.classHierarchy.isSubtypeOf(
+                context.classNode, inferrer.coreTypes.iterableClass) &&
+            !inferrer.classHierarchy
+                .isSubtypeOf(context.classNode, inferrer.coreTypes.mapClass)) {
+          // Set literal
+          SetLiteralJudgment setLiteral = new SetLiteralJudgment([],
+              typeArgument: const ImplicitTypeArgument(), isConst: node.isConst)
+            ..fileOffset = node.fileOffset;
+          node.parent.replaceChild(node, setLiteral);
+          visitSetLiteralJudgment(setLiteral, typeContext);
+          node.inferredType = setLiteral.inferredType;
+          return;
+        }
+      }
+    }
     bool typeChecksNeeded = !inferrer.isTopLevel;
     if (inferenceNeeded || typeChecksNeeded) {
       formalTypes = [];
@@ -739,22 +768,28 @@
       inferredKeyType = inferredTypes[0];
       inferredValueType = inferredTypes[1];
     } else {
-      inferredKeyType = node._declaredKeyType ?? const DynamicType();
-      inferredValueType = node._declaredValueType ?? const DynamicType();
+      inferredKeyType = node.keyType;
+      inferredValueType = node.valueType;
     }
-    List<Expression> cachedKeyJudgments =
-        node.judgments.map((j) => (j as MapEntryJudgment).keyJudgment).toList();
-    List<Expression> cachedValueJudgments = node.judgments
-        .map((j) => (j as MapEntryJudgment).valueJudgment)
-        .toList();
+    List<Expression> cachedKeys = new List(node.entries.length);
+    List<Expression> cachedValues = new List(node.entries.length);
+    for (int i = 0; i < node.entries.length; i++) {
+      cachedKeys[i] = node.entries[i].key;
+      cachedValues[i] = node.entries[i].value;
+    }
     if (inferenceNeeded || typeChecksNeeded) {
-      for (MapEntryJudgment judgment in node.judgments) {
-        visitMapEntryJudgment(judgment, inferredKeyType, inferredValueType);
+      for (MapEntry entry in node.entries) {
+        Expression key = entry.key;
+        inferrer.inferExpression(key, inferredKeyType, true,
+            isVoidAllowed: true);
+        actualTypes.add(getInferredType(key, inferrer));
+        Expression value = entry.value;
+        inferrer.inferExpression(value, inferredValueType, true,
+            isVoidAllowed: true);
+        actualTypes.add(getInferredType(value, inferrer));
         if (inferenceNeeded) {
           formalTypes.addAll(mapType.typeArguments);
         }
-        actualTypes.add(judgment.inferredKeyType);
-        actualTypes.add(judgment.inferredValueType);
       }
     }
     if (inferenceNeeded) {
@@ -777,13 +812,13 @@
       node.valueType = inferredValueType;
     }
     if (typeChecksNeeded) {
-      for (int i = 0; i < node.judgments.length; ++i) {
-        Expression keyJudgment = cachedKeyJudgments[i];
+      for (int i = 0; i < node.entries.length; ++i) {
+        Expression keyJudgment = cachedKeys[i];
         inferrer.ensureAssignable(node.keyType, actualTypes[2 * i], keyJudgment,
             keyJudgment.fileOffset,
             isVoidAllowed: node.keyType is VoidType);
 
-        Expression valueJudgment = cachedValueJudgments[i];
+        Expression valueJudgment = cachedValues[i];
         inferrer.ensureAssignable(node.valueType, actualTypes[2 * i + 1],
             valueJudgment, valueJudgment.fileOffset,
             isVoidAllowed: node.valueType is VoidType);
@@ -794,13 +829,11 @@
     KernelLibraryBuilder inferrerLibrary = inferrer.library;
     // Either both [_declaredKeyType] and [_declaredValueType] are omitted or
     // none of them, so we may just check one.
-    if (node._declaredKeyType == null &&
-        inferrerLibrary is KernelLibraryBuilder) {
+    if (inferenceNeeded && inferrerLibrary is KernelLibraryBuilder) {
       inferrerLibrary.checkBoundsInMapLiteral(
           node, inferrer.typeSchemaEnvironment,
           inferred: true);
     }
-    return null;
   }
 
   void visitMethodInvocationJudgment(
@@ -850,13 +883,12 @@
           }
           int intValue = receiver.asInt64(negated: true);
           if (intValue == null) {
-            Expression error = inferrer.helper
-                .buildProblem(
+            Expression error = inferrer.helper.desugarSyntheticExpression(
+                inferrer.helper.buildProblem(
                     templateIntegerLiteralIsOutOfRange
                         .withArguments(receiver.literal),
                     receiver.fileOffset,
-                    receiver.literal.length)
-                .desugared;
+                    receiver.literal.length));
             node.parent.replaceChild(node, error);
             node.inferredType = const BottomType();
             return null;
@@ -887,7 +919,7 @@
     Expression initializer = node.variableJudgment.initializer;
     inferrer.inferExpression(initializer, typeContext, true);
     node.inferredType = getInferredType(initializer, inferrer);
-    if (inferrer.strongMode) node.variable.type = node.inferredType;
+    node.variable.type = node.inferredType;
     return null;
   }
 
@@ -907,9 +939,7 @@
         receiverVariable: node.variable,
         desugaredInvocation: node._desugaredInvocation);
     node.inferredType = inferenceResult.type;
-    if (inferrer.strongMode) {
-      node.body.staticType = node.inferredType;
-    }
+    node.body.staticType = node.inferredType;
     return null;
   }
 
@@ -918,9 +948,7 @@
     inferrer.inferPropertyGet(
         node, node.receiverJudgment, node.fileOffset, typeContext,
         receiverVariable: node.variable, desugaredGet: node._desugaredGet);
-    if (inferrer.strongMode) {
-      node.body.staticType = node.inferredType;
-    }
+    node.body.staticType = node.inferredType;
     return null;
   }
 
@@ -969,8 +997,7 @@
     // doing compound assignment?
     var writeContext = inferrer.getSetterType(writeMember, receiverType);
     node._inferRhs(inferrer, readType, writeContext);
-    if (inferrer.strongMode)
-      node.nullAwareGuard?.staticType = node.inferredType;
+    node.nullAwareGuard?.staticType = node.inferredType;
     node._replaceWithDesugared();
     return null;
   }
@@ -1023,6 +1050,78 @@
         !identical(node.returnKeywordLexeme, "return"));
   }
 
+  void visitSetLiteralJudgment(SetLiteralJudgment node, DartType typeContext) {
+    var setClass = inferrer.coreTypes.setClass;
+    var setType = setClass.thisType;
+    List<DartType> inferredTypes;
+    DartType inferredTypeArgument;
+    List<DartType> formalTypes;
+    List<DartType> actualTypes;
+    bool inferenceNeeded = node.typeArgument is ImplicitTypeArgument;
+    bool typeChecksNeeded = !inferrer.isTopLevel;
+    if (inferenceNeeded || typeChecksNeeded) {
+      formalTypes = [];
+      actualTypes = [];
+    }
+    if (inferenceNeeded) {
+      inferredTypes = [const UnknownType()];
+      inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(setType,
+          setClass.typeParameters, null, null, typeContext, inferredTypes,
+          isConst: node.isConst);
+      inferredTypeArgument = inferredTypes[0];
+    } else {
+      inferredTypeArgument = node.typeArgument;
+    }
+    if (inferenceNeeded || typeChecksNeeded) {
+      for (int i = 0; i < node.expressions.length; ++i) {
+        Expression judgment = node.expressions[i];
+        inferrer.inferExpression(
+            judgment, inferredTypeArgument, inferenceNeeded || typeChecksNeeded,
+            isVoidAllowed: true);
+        if (inferenceNeeded) {
+          formalTypes.add(setType.typeArguments[0]);
+        }
+        actualTypes.add(getInferredType(judgment, inferrer));
+      }
+    }
+    if (inferenceNeeded) {
+      inferrer.typeSchemaEnvironment.inferGenericFunctionOrType(
+          setType,
+          setClass.typeParameters,
+          formalTypes,
+          actualTypes,
+          typeContext,
+          inferredTypes);
+      inferredTypeArgument = inferredTypes[0];
+      inferrer.instrumentation?.record(
+          inferrer.uri,
+          node.fileOffset,
+          'typeArgs',
+          new InstrumentationValueForTypeArgs([inferredTypeArgument]));
+      node.typeArgument = inferredTypeArgument;
+    }
+    if (typeChecksNeeded) {
+      for (int i = 0; i < node.expressions.length; i++) {
+        inferrer.ensureAssignable(node.typeArgument, actualTypes[i],
+            node.expressions[i], node.expressions[i].fileOffset,
+            isVoidAllowed: node.typeArgument is VoidType);
+      }
+    }
+    node.inferredType = new InterfaceType(setClass, [inferredTypeArgument]);
+    KernelLibraryBuilder inferrerLibrary = inferrer.library;
+    if (inferenceNeeded && inferrerLibrary is KernelLibraryBuilder) {
+      inferrerLibrary.checkBoundsInSetLiteral(
+          node, inferrer.typeSchemaEnvironment,
+          inferred: true);
+    }
+
+    KernelLibraryBuilder library = inferrer.library;
+    if (library != null &&
+        !library.loader.target.backendTarget.supportsSetLiterals) {
+      inferrer.helper.transformSetLiterals = true;
+    }
+  }
+
   void visitStaticAssignmentJudgment(
       StaticAssignmentJudgment node, DartType typeContext) {
     DartType readType = const DynamicType(); // Only used in error recovery
@@ -1153,7 +1252,7 @@
               ]);
         }
       }
-      inferrer.inferStatement(switchCase.bodyJudgment);
+      inferrer.inferStatement(switchCase.body);
     }
   }
 
@@ -1212,11 +1311,11 @@
   }
 
   void visitCatchJudgment(CatchJudgment node) {
-    inferrer.inferStatement(node.bodyJudgment);
+    inferrer.inferStatement(node.body);
   }
 
   void visitTryCatchJudgment(TryCatchJudgment node) {
-    inferrer.inferStatement(node.bodyJudgment);
+    inferrer.inferStatement(node.body);
     for (var catch_ in node.catchJudgments) {
       visitCatchJudgment(catch_);
     }
@@ -1224,13 +1323,7 @@
 
   void visitTryFinallyJudgment(TryFinallyJudgment node) {
     inferrer.inferStatement(node.body);
-    if (node.catchJudgments != null) {
-      for (var catch_ in node.catchJudgments) {
-        visitCatchJudgment(catch_);
-      }
-      node.body = new TryCatch(node.body, node.catches)..parent = node;
-    }
-    inferrer.inferStatement(node.finalizerJudgment);
+    inferrer.inferStatement(node.finalizer);
   }
 
   void visitTypeLiteralJudgment(
@@ -1260,30 +1353,6 @@
   }
 
   void visitVariableDeclarationJudgment(VariableDeclarationJudgment node) {
-    if (node.annotationJudgments.isNotEmpty) {
-      if (node.infersAnnotations) {
-        inferrer.inferMetadataKeepingHelper(node.annotationJudgments);
-      }
-
-      // After the inference was done on the annotations, we may clone them for
-      // this instance of VariableDeclaration in order to avoid having the same
-      // annotation node for two VariableDeclaration nodes in a situation like
-      // the following:
-      //
-      //     class Foo { const Foo(List<String> list); }
-      //
-      //     @Foo(const [])
-      //     var x, y;
-      CloneVisitor cloner = new CloneVisitor();
-      for (int i = 0; i < node.annotations.length; ++i) {
-        kernel.Expression annotation = node.annotations[i];
-        if (annotation.parent != node) {
-          node.annotations[i] = cloner.clone(annotation);
-          node.annotations[i].parent = node;
-        }
-      }
-    }
-
     var initializerJudgment = node.initializerJudgment;
     var declaredType = node._implicitlyTyped ? const UnknownType() : node.type;
     DartType inferredType;
@@ -1297,7 +1366,7 @@
     } else {
       inferredType = const DynamicType();
     }
-    if (inferrer.strongMode && node._implicitlyTyped) {
+    if (node._implicitlyTyped) {
       inferrer.instrumentation?.record(inferrer.uri, node.fileOffset, 'type',
           new InstrumentationValueForType(inferredType));
       node.type = inferredType;
@@ -1370,7 +1439,7 @@
         getInferredType(conditionJudgment, inferrer),
         node.condition,
         node.condition.fileOffset);
-    inferrer.inferStatement(node.bodyJudgment);
+    inferrer.inferStatement(node.body);
   }
 
   void visitYieldJudgment(YieldJudgment node) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/inferred_type_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inferred_type_visitor.dart
index 2c23370..05513ad 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inferred_type_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inferred_type_visitor.dart
@@ -73,7 +73,7 @@
   @override
   DartType visitConditionalExpression(
       ConditionalExpression node, TypeInferrerImpl inferrer) {
-    return inferrer.strongMode ? node.staticType : const DynamicType();
+    return node.staticType;
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
index fd26c01..87fbc5b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_api.dart
@@ -5,8 +5,7 @@
 /// This library exports all API from Kernel that can be used throughout fasta.
 library fasta.kernel_api;
 
-export 'package:kernel/type_algebra.dart'
-    show Substitution, instantiateToBounds, substitute;
+export 'package:kernel/type_algebra.dart' show Substitution, substitute;
 
 export 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
@@ -20,6 +19,8 @@
 
 export 'package:kernel/type_environment.dart' show TypeEnvironment;
 
+export 'package:kernel/src/bounds_checks.dart' show instantiateToBounds;
+
 import 'package:kernel/text/ast_to_text.dart' show NameSystem, Printer;
 
 import 'package:kernel/ast.dart' show Class, Member, Node;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index c66a5e6..cded049 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -27,6 +27,7 @@
         Expression,
         ExpressionStatement,
         Field,
+        ForInStatement,
         FunctionDeclaration,
         FunctionExpression,
         FunctionNode,
@@ -42,6 +43,7 @@
         LibraryDependency,
         LibraryPart,
         ListLiteral,
+        LocalInitializer,
         Location,
         MapEntry,
         MapLiteral,
@@ -83,46 +85,34 @@
         ArgumentsJudgment,
         AssertInitializerJudgment,
         AssertStatementJudgment,
-        BreakJudgment,
+        BlockJudgment,
         CascadeJudgment,
         ComplexAssignmentJudgment,
         ContinueSwitchJudgment,
         DeferredCheckJudgment,
         ExpressionStatementJudgment,
         FactoryConstructorInvocationJudgment,
-        ShadowFieldInitializer,
-        ForInJudgment,
         FunctionDeclarationJudgment,
         FunctionNodeJudgment,
-        IfNullJudgment,
         IfJudgment,
-        IllegalAssignmentJudgment,
-        IndexAssignmentJudgment,
-        InvalidConstructorInvocationJudgment,
+        IfNullJudgment,
         InvalidSuperInitializerJudgment,
-        InvalidWriteJudgment,
-        ShadowInvalidFieldInitializer,
-        ShadowInvalidInitializer,
-        LabeledStatementJudgment,
         LoadLibraryTearOffJudgment,
         MethodInvocationJudgment,
         NamedFunctionExpressionJudgment,
         NullAwareMethodInvocationJudgment,
         NullAwarePropertyGetJudgment,
-        PropertyAssignmentJudgment,
         RedirectingInitializerJudgment,
         ReturnJudgment,
+        ShadowFieldInitializer,
+        ShadowInvalidFieldInitializer,
+        ShadowInvalidInitializer,
         ShadowLargeIntLiteral,
-        StaticAssignmentJudgment,
         SuperInitializerJudgment,
         SuperMethodInvocationJudgment,
         SuperPropertyGetJudgment,
         SwitchCaseJudgment,
         SwitchStatementJudgment,
-        SyntheticExpressionJudgment,
-        UnresolvedTargetInvocationJudgment,
-        UnresolvedVariableAssignmentJudgment,
-        VariableAssignmentJudgment,
         VariableDeclarationJudgment,
         VariableGetJudgment,
         YieldJudgment;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
index 5c83989..1886808 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
@@ -44,6 +44,6 @@
 
   @override
   void enterThenForTypePromotion(Expression condition) {
-    typePromoter.enterThen(condition);
+    typePromoter?.enterThen(condition);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
index a2fbeca..e81a108 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
@@ -16,6 +16,10 @@
 
 export '../builder/builder.dart';
 
+export 'class_hierarchy_builder.dart' show ClassHierarchyBuilder;
+
+export 'implicit_type.dart' show ImplicitType;
+
 export 'kernel_class_builder.dart' show KernelClassBuilder;
 
 export 'kernel_enum_builder.dart' show KernelEnumBuilder;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index 56bc3b2..77098cf 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -32,8 +32,7 @@
         Arguments,
         VariableDeclaration;
 
-import 'package:kernel/ast.dart'
-    show FunctionType, NamedType, TypeParameterType;
+import 'package:kernel/ast.dart' show FunctionType, TypeParameterType;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
@@ -41,6 +40,9 @@
 
 import 'package:kernel/core_types.dart' show CoreTypes;
 
+import 'package:kernel/src/bounds_checks.dart'
+    show TypeArgumentIssue, findTypeArgumentIssues, getGenericTypeName;
+
 import 'package:kernel/type_algebra.dart' show Substitution, substitute;
 
 import 'package:kernel/type_algebra.dart' as type_algebra
@@ -61,14 +63,14 @@
         messagePatchDeclarationMismatch,
         messagePatchDeclarationOrigin,
         noLength,
-        templateFactoryRedirecteeHasTooFewPositionalParameters,
-        templateFactoryRedirecteeInvalidReturnType,
+        templateDuplicatedDeclarationUse,
         templateGenericFunctionTypeInferredAsActualTypeArgument,
         templateIllegalMixinDueToConstructors,
         templateIllegalMixinDueToConstructorsCause,
         templateImplementsRepeated,
         templateImplementsSuperClass,
         templateImplicitMixinOverrideContext,
+        templateIncompatibleRedirecteeFunctionType,
         templateIncorrectTypeArgument,
         templateIncorrectTypeArgumentInSupertype,
         templateIncorrectTypeArgumentInSupertypeInferred,
@@ -86,10 +88,6 @@
         templateOverrideTypeMismatchReturnType,
         templateOverrideTypeVariablesMismatch,
         templateRedirectingFactoryIncompatibleTypeArgument,
-        templateRedirectingFactoryInvalidNamedParameterType,
-        templateRedirectingFactoryInvalidPositionalParameterType,
-        templateRedirectingFactoryMissingNamedParameter,
-        templateRedirectingFactoryProvidesTooFewRequiredParameters,
         templateRedirectionTargetNotFound,
         templateTypeArgumentMismatch;
 
@@ -97,6 +95,8 @@
 
 import '../problems.dart' show unexpected, unhandled, unimplemented;
 
+import '../scope.dart' show AmbiguousBuilder;
+
 import '../type_inference/type_schema.dart' show UnknownType;
 
 import 'kernel_builder.dart'
@@ -288,17 +288,15 @@
       Supertype supertype, TypeEnvironment typeEnvironment) {
     KernelLibraryBuilder library = this.library;
 
-    List<Object> boundViolations = typeEnvironment.findBoundViolations(
+    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
         new InterfaceType(supertype.classNode, supertype.typeArguments),
-        allowSuperBounded: false,
-        typedefInstantiations: library.typedefInstantiations);
-    if (boundViolations != null) {
-      for (int i = 0; i < boundViolations.length; i += 3) {
-        DartType argument = boundViolations[i];
-        TypeParameter variable = boundViolations[i + 1];
-        DartType enclosingType = boundViolations[i + 2];
-
+        typeEnvironment,
+        allowSuperBounded: false);
+    if (issues != null) {
+      for (TypeArgumentIssue issue in issues) {
         Message message;
+        DartType argument = issue.argument;
+        TypeParameter typeParameter = issue.typeParameter;
         bool inferred = library.inferredTypes.contains(argument);
         if (argument is FunctionType && argument.typeParameters.length > 0) {
           if (inferred) {
@@ -307,25 +305,29 @@
           } else {
             message = messageGenericFunctionTypeUsedAsActualTypeArgument;
           }
-          variable = null;
+          typeParameter = null;
         } else {
           if (inferred) {
             message =
                 templateIncorrectTypeArgumentInSupertypeInferred.withArguments(
                     argument,
-                    typeEnvironment.getGenericTypeName(enclosingType),
+                    typeParameter.bound,
+                    typeParameter.name,
+                    getGenericTypeName(issue.enclosingType),
                     supertype.classNode.name,
                     name);
           } else {
             message = templateIncorrectTypeArgumentInSupertype.withArguments(
                 argument,
-                typeEnvironment.getGenericTypeName(enclosingType),
+                typeParameter.bound,
+                typeParameter.name,
+                getGenericTypeName(issue.enclosingType),
                 supertype.classNode.name,
                 name);
           }
         }
 
-        library.reportBoundViolation(message, charOffset, variable);
+        library.reportTypeArgumentIssue(message, charOffset, typeParameter);
       }
     }
   }
@@ -335,15 +337,13 @@
 
     // Check in bounds of own type variables.
     for (TypeParameter parameter in cls.typeParameters) {
-      List<Object> violations = typeEnvironment.findBoundViolations(
-          parameter.bound,
-          allowSuperBounded: false,
-          typedefInstantiations: library.typedefInstantiations);
-      if (violations != null) {
-        for (int i = 0; i < violations.length; i += 3) {
-          DartType argument = violations[i];
-          TypeParameter variable = violations[i + 1];
-          DartType enclosingType = violations[i + 2];
+      List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+          parameter.bound, typeEnvironment,
+          allowSuperBounded: false);
+      if (issues != null) {
+        for (TypeArgumentIssue issue in issues) {
+          DartType argument = issue.argument;
+          TypeParameter typeParameter = issue.typeParameter;
           if (library.inferredTypes.contains(argument)) {
             // Inference in type expressions in the supertypes boils down to
             // instantiate-to-bound which shouldn't produce anything that breaks
@@ -356,13 +356,17 @@
           Message message;
           if (argument is FunctionType && argument.typeParameters.length > 0) {
             message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-            variable = null;
+            typeParameter = null;
           } else {
             message = templateIncorrectTypeArgument.withArguments(
-                argument, typeEnvironment.getGenericTypeName(enclosingType));
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                getGenericTypeName(issue.enclosingType));
           }
 
-          library.reportBoundViolation(message, parameter.fileOffset, variable);
+          library.reportTypeArgumentIssue(
+              message, parameter.fileOffset, typeParameter);
         }
       }
     }
@@ -409,58 +413,79 @@
       List<String> names = constructors.keys.toList();
       for (String name in names) {
         Declaration declaration = constructors[name];
-        if (declaration.parent != this) {
-          unexpected(
-              "$fileUri", "${declaration.parent.fileUri}", charOffset, fileUri);
-        }
-        if (declaration is KernelRedirectingFactoryBuilder) {
-          // Compute the immediate redirection target, not the effective.
-          ConstructorReferenceBuilder redirectionTarget =
-              declaration.redirectionTarget;
-          if (redirectionTarget != null) {
-            Declaration targetBuilder = redirectionTarget.target;
-            addRedirectingConstructor(declaration, library);
-            if (targetBuilder is ProcedureBuilder) {
-              List<DartType> typeArguments = declaration.typeArguments;
-              if (typeArguments == null) {
-                // TODO(32049) If type arguments aren't specified, they should
-                // be inferred.  Currently, the inference is not performed.
-                // The code below is a workaround.
-                typeArguments = new List<DartType>.filled(
-                    targetBuilder.target.enclosingClass.typeParameters.length,
-                    const DynamicType(),
-                    growable: true);
+        do {
+          if (declaration.parent != this) {
+            unexpected("$fileUri", "${declaration.parent.fileUri}", charOffset,
+                fileUri);
+          }
+          if (declaration is KernelRedirectingFactoryBuilder) {
+            // Compute the immediate redirection target, not the effective.
+            ConstructorReferenceBuilder redirectionTarget =
+                declaration.redirectionTarget;
+            if (redirectionTarget != null) {
+              Declaration targetBuilder = redirectionTarget.target;
+              if (declaration.next == null) {
+                // Only the first one (that is, the last on in the linked list)
+                // is actually in the kernel tree. This call creates a StaticGet
+                // to [declaration.target] in a field `_redirecting#` which is
+                // only legal to do to things in the kernel tree.
+                addRedirectingConstructor(declaration, library);
               }
-              declaration.setRedirectingFactoryBody(
-                  targetBuilder.target, typeArguments);
-            } else if (targetBuilder is DillMemberBuilder) {
-              List<DartType> typeArguments = declaration.typeArguments;
-              if (typeArguments == null) {
-                // TODO(32049) If type arguments aren't specified, they should
-                // be inferred.  Currently, the inference is not performed.
-                // The code below is a workaround.
-                typeArguments = new List<DartType>.filled(
-                    targetBuilder.target.enclosingClass.typeParameters.length,
-                    const DynamicType(),
-                    growable: true);
-              }
-              declaration.setRedirectingFactoryBody(
-                  targetBuilder.member, typeArguments);
-            } else {
-              Message message = templateRedirectionTargetNotFound
-                  .withArguments(redirectionTarget.fullNameForErrors);
-              if (declaration.isConst) {
-                addProblem(message, declaration.charOffset, noLength);
+              if (targetBuilder is ProcedureBuilder) {
+                List<DartType> typeArguments = declaration.typeArguments;
+                if (typeArguments == null) {
+                  // TODO(32049) If type arguments aren't specified, they should
+                  // be inferred.  Currently, the inference is not performed.
+                  // The code below is a workaround.
+                  typeArguments = new List<DartType>.filled(
+                      targetBuilder.target.enclosingClass.typeParameters.length,
+                      const DynamicType(),
+                      growable: true);
+                }
+                declaration.setRedirectingFactoryBody(
+                    targetBuilder.target, typeArguments);
+              } else if (targetBuilder is DillMemberBuilder) {
+                List<DartType> typeArguments = declaration.typeArguments;
+                if (typeArguments == null) {
+                  // TODO(32049) If type arguments aren't specified, they should
+                  // be inferred.  Currently, the inference is not performed.
+                  // The code below is a workaround.
+                  typeArguments = new List<DartType>.filled(
+                      targetBuilder.target.enclosingClass.typeParameters.length,
+                      const DynamicType(),
+                      growable: true);
+                }
+                declaration.setRedirectingFactoryBody(
+                    targetBuilder.member, typeArguments);
+              } else if (targetBuilder is AmbiguousBuilder) {
+                Message message = templateDuplicatedDeclarationUse
+                    .withArguments(redirectionTarget.fullNameForErrors);
+                if (declaration.isConst) {
+                  addProblem(message, declaration.charOffset, noLength);
+                } else {
+                  addProblem(message, declaration.charOffset, noLength);
+                }
+                // CoreTypes aren't computed yet, and this is the outline
+                // phase. So we can't and shouldn't create a method body.
+                declaration.body = new RedirectingFactoryBody.unresolved(
+                    redirectionTarget.fullNameForErrors);
               } else {
-                addProblem(message, declaration.charOffset, noLength);
+                Message message = templateRedirectionTargetNotFound
+                    .withArguments(redirectionTarget.fullNameForErrors);
+                if (declaration.isConst) {
+                  addProblem(message, declaration.charOffset, noLength);
+                } else {
+                  addProblem(message, declaration.charOffset, noLength);
+                }
+                // CoreTypes aren't computed yet, and this is the outline
+                // phase. So we can't and shouldn't create a method body.
+                declaration.body = new RedirectingFactoryBody.unresolved(
+                    redirectionTarget.fullNameForErrors);
               }
-              // CoreTypes aren't computed yet, and this is the outline
-              // phase. So we can't and shouldn't create a method body.
-              declaration.body = new RedirectingFactoryBody.unresolved(
-                  redirectionTarget.fullNameForErrors);
             }
           }
-        }
+          declaration = declaration.next;
+        } while (declaration != null);
       }
     }
     return count;
@@ -615,9 +640,9 @@
           isInterfaceCheck: true);
     }
 
-    bool hasNoSuchMethod =
-        hierarchy.getDispatchTarget(cls, noSuchMethodName).enclosingClass !=
-            coreTypes.objectClass;
+    Member noSuchMethod = hierarchy.getDispatchTarget(cls, noSuchMethodName);
+    bool hasNoSuchMethod = noSuchMethod != null &&
+        noSuchMethod.enclosingClass != coreTypes.objectClass;
 
     void findMissingImplementations({bool setters}) {
       List<Member> dispatchTargets =
@@ -676,11 +701,11 @@
     findMissingImplementations(setters: true);
 
     if (context?.isNotEmpty ?? false) {
-      String memberString =
-          context.map((message) => "'${message.arguments["name"]}'").join(", ");
+      List<String> memberNames = new List<String>.from(
+          context.map((message) => "'${message.arguments["name"]}'"));
       library.addProblem(
           templateMissingImplementationNotAbstract.withArguments(
-              cls.name, memberString),
+              cls.name, memberNames),
           cls.fileOffset,
           cls.name.length,
           cls.fileUri,
@@ -928,9 +953,9 @@
         interfaceFunction?.typeParameters?.length) {
       library.addProblem(
           templateOverrideTypeVariablesMismatch.withArguments(
-              "${declaredMember.enclosingClass.name}::"
+              "${declaredMember.enclosingClass.name}."
               "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}::"
+              "${interfaceMember.enclosingClass.name}."
               "${interfaceMember.name.name}"),
           declaredMember.fileOffset,
           noLength,
@@ -965,9 +990,9 @@
           if (declaredBound != substitution.substituteType(interfaceBound)) {
             library.addProblem(
                 templateOverrideTypeVariablesMismatch.withArguments(
-                    "${declaredMember.enclosingClass.name}::"
+                    "${declaredMember.enclosingClass.name}."
                     "${declaredMember.name.name}",
-                    "${interfaceMember.enclosingClass.name}::"
+                    "${interfaceMember.enclosingClass.name}."
                     "${interfaceMember.name.name}"),
                 declaredMember.fileOffset,
                 noLength,
@@ -1030,10 +1055,8 @@
       // a type which is a subtype of the parameter it overrides.
     } else {
       // Report an error.
-      // TODO(ahe): The double-colon notation shouldn't be used in error
-      // messages.
       String declaredMemberName =
-          '${declaredMember.enclosingClass.name}::${declaredMember.name.name}';
+          '${declaredMember.enclosingClass.name}.${declaredMember.name.name}';
       Message message;
       int fileOffset;
       if (declaredParameter == null) {
@@ -1101,9 +1124,9 @@
         interfaceFunction.positionalParameters.length) {
       library.addProblem(
           templateOverrideFewerPositionalArguments.withArguments(
-              "${declaredMember.enclosingClass.name}::"
+              "${declaredMember.enclosingClass.name}."
               "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}::"
+              "${interfaceMember.enclosingClass.name}."
               "${interfaceMember.name.name}"),
           declaredMember.fileOffset,
           noLength,
@@ -1120,9 +1143,9 @@
         declaredFunction.requiredParameterCount) {
       library.addProblem(
           templateOverrideMoreRequiredArguments.withArguments(
-              "${declaredMember.enclosingClass.name}::"
+              "${declaredMember.enclosingClass.name}."
               "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}::"
+              "${interfaceMember.enclosingClass.name}."
               "${interfaceMember.name.name}"),
           declaredMember.fileOffset,
           noLength,
@@ -1162,9 +1185,9 @@
         interfaceFunction.namedParameters.length) {
       library.addProblem(
           templateOverrideFewerNamedArguments.withArguments(
-              "${declaredMember.enclosingClass.name}::"
+              "${declaredMember.enclosingClass.name}."
               "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}::"
+              "${interfaceMember.enclosingClass.name}."
               "${interfaceMember.name.name}"),
           declaredMember.fileOffset,
           noLength,
@@ -1199,10 +1222,10 @@
         if (!declaredNamedParameters.moveNext()) {
           library.addProblem(
               templateOverrideMismatchNamedParameter.withArguments(
-                  "${declaredMember.enclosingClass.name}::"
+                  "${declaredMember.enclosingClass.name}."
                   "${declaredMember.name.name}",
                   interfaceNamedParameters.current.name,
-                  "${interfaceMember.enclosingClass.name}::"
+                  "${interfaceMember.enclosingClass.name}."
                   "${interfaceMember.name.name}"),
               declaredMember.fileOffset,
               noLength,
@@ -1481,6 +1504,12 @@
       //   class B implements A {}
       //
       target = targetBuilder.member.function;
+    } else if (redirectionTarget.target is AmbiguousBuilder) {
+      // Multiple definitions with the same name: An error has already been
+      // issued.
+      // TODO(http://dartbug.com/35294): Unfortunate error; see also
+      // https://dart-review.googlesource.com/c/sdk/+/85390/.
+      return null;
     } else {
       unhandled("${redirectionTarget.target}", "computeRedirecteeType",
           charOffset, fileUri);
@@ -1569,144 +1598,14 @@
     // happened during [_computeRedirecteeType].
     if (redirecteeType == null) return;
 
-    // Check whether [redirecteeType] <: [factoryType]. In the following let
-    //     [factoryType    = (S_1, ..., S_i, {S_(i+1), ..., S_n}) -> S']
-    //     [redirecteeType = (T_1, ..., T_j, {T_(j+1), ..., T_m}) -> T'].
-
-    // Ensure that any extra parameters that [redirecteeType] might have are
-    // optional.
-    if (redirecteeType.requiredParameterCount >
-        factoryType.requiredParameterCount) {
+    // Check whether [redirecteeType] <: [factoryType].
+    if (!typeEnvironment.isSubtypeOf(redirecteeType, factoryType)) {
       addProblem(
-          templateRedirectingFactoryProvidesTooFewRequiredParameters
-              .withArguments(
-                  factory.fullNameForErrors,
-                  factoryType.requiredParameterCount,
-                  computeRedirecteeName(factory.redirectionTarget),
-                  redirecteeType.requiredParameterCount),
-          factory.charOffset,
-          noLength);
-      return;
-    }
-    if (redirecteeType.positionalParameters.length <
-        factoryType.positionalParameters.length) {
-      String targetName = computeRedirecteeName(factory.redirectionTarget);
-      addProblem(
-          templateFactoryRedirecteeHasTooFewPositionalParameters.withArguments(
-              targetName, redirecteeType.positionalParameters.length),
+          templateIncompatibleRedirecteeFunctionType.withArguments(
+              redirecteeType, factoryType),
           factory.redirectionTarget.charOffset,
           noLength);
-      return;
     }
-
-    // For each 0 < k < i check S_k <: T_k.
-    for (int i = 0; i < factoryType.positionalParameters.length; ++i) {
-      var factoryParameterType = factoryType.positionalParameters[i];
-      var redirecteeParameterType = redirecteeType.positionalParameters[i];
-      if (!typeEnvironment.isSubtypeOf(
-          factoryParameterType, redirecteeParameterType)) {
-        final factoryParameter =
-            factory.target.function.positionalParameters[i];
-        addProblem(
-            templateRedirectingFactoryInvalidPositionalParameterType
-                .withArguments(factoryParameter.name, factoryParameterType,
-                    redirecteeParameterType),
-            factoryParameter.fileOffset,
-            factoryParameter.name.length);
-        return;
-      }
-    }
-
-    // For each i < k < n check that the named parameter S_k has a corresponding
-    // named parameter T_l in [redirecteeType] for some j < l < m.
-    int factoryTypeNameIndex = 0; // k.
-    int redirecteeTypeNameIndex = 0; // l.
-
-    // The following code makes use of the invariant that [namedParameters] are
-    // already sorted (i.e. it's a monotonic sequence) to determine in a linear
-    // pass whether [factory.namedParameters] is a subset of
-    // [redirectee.namedParameters]. In the comments below the symbol <= stands
-    // for the usual lexicographic relation on strings.
-    while (factoryTypeNameIndex < factoryType.namedParameters.length) {
-      // If we have gone beyond the bound of redirectee's named parameters, then
-      // signal a missing named parameter error.
-      if (redirecteeTypeNameIndex == redirecteeType.namedParameters.length) {
-        reportRedirectingFactoryMissingNamedParameter(
-            factory, factoryType.namedParameters[factoryTypeNameIndex]);
-        break;
-      }
-
-      int result = redirecteeType.namedParameters[redirecteeTypeNameIndex].name
-          .compareTo(factoryType.namedParameters[factoryTypeNameIndex].name);
-      if (result < 0) {
-        // T_l.name <= S_k.name.
-        redirecteeTypeNameIndex++;
-      } else if (result == 0) {
-        // S_k.name <= T_l.name.
-        NamedType factoryParameterType =
-            factoryType.namedParameters[factoryTypeNameIndex];
-        NamedType redirecteeParameterType =
-            redirecteeType.namedParameters[redirecteeTypeNameIndex];
-        // Check S_k <: T_l.
-        if (!typeEnvironment.isSubtypeOf(
-            factoryParameterType.type, redirecteeParameterType.type)) {
-          var factoryFormal =
-              factory.target.function.namedParameters[redirecteeTypeNameIndex];
-          addProblem(
-              templateRedirectingFactoryInvalidNamedParameterType.withArguments(
-                  factoryParameterType.name,
-                  factoryParameterType.type,
-                  redirecteeParameterType.type),
-              factoryFormal.fileOffset,
-              factoryFormal.name.length);
-          return;
-        }
-        redirecteeTypeNameIndex++;
-        factoryTypeNameIndex++;
-      } else {
-        // S_k.name <= T_l.name. By appealing to the monotinicity of
-        // [namedParameters] and the transivity of <= it follows that for any
-        // l', such that l < l', it must be the case that S_k <= T_l'. Thus the
-        // named parameter is missing from the redirectee's parameter list.
-        reportRedirectingFactoryMissingNamedParameter(
-            factory, factoryType.namedParameters[factoryTypeNameIndex]);
-
-        // Continue with the next factory named parameter.
-        factoryTypeNameIndex++;
-      }
-    }
-
-    // Report any unprocessed factory named parameters as missing.
-    if (factoryTypeNameIndex < factoryType.namedParameters.length) {
-      for (int i = factoryTypeNameIndex;
-          i < factoryType.namedParameters.length;
-          i++) {
-        reportRedirectingFactoryMissingNamedParameter(
-            factory, factoryType.namedParameters[factoryTypeNameIndex]);
-      }
-    }
-
-    // Check that T' <: S'.
-    if (!typeEnvironment.isSubtypeOf(
-        redirecteeType.returnType, factoryType.returnType)) {
-      String targetName = computeRedirecteeName(factory.redirectionTarget);
-      addProblem(
-          templateFactoryRedirecteeInvalidReturnType.withArguments(
-              redirecteeType.returnType, targetName, factoryType.returnType),
-          factory.redirectionTarget.charOffset,
-          noLength);
-      return;
-    }
-  }
-
-  void reportRedirectingFactoryMissingNamedParameter(
-      KernelRedirectingFactoryBuilder factory, NamedType missingParameter) {
-    addProblem(
-        templateRedirectingFactoryMissingNamedParameter.withArguments(
-            computeRedirecteeName(factory.redirectionTarget),
-            missingParameter.name),
-        factory.redirectionTarget.charOffset,
-        noLength);
   }
 
   void checkRedirectingFactories(TypeEnvironment typeEnvironment) {
@@ -1714,9 +1613,12 @@
     Iterable<String> names = constructors.keys;
     for (String name in names) {
       Declaration constructor = constructors[name];
-      if (constructor is KernelRedirectingFactoryBuilder) {
-        checkRedirectingFactory(constructor, typeEnvironment);
-      }
+      do {
+        if (constructor is KernelRedirectingFactoryBuilder) {
+          checkRedirectingFactory(constructor, typeEnvironment);
+        }
+        constructor = constructor.next;
+      } while (constructor != null);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
new file mode 100644
index 0000000..06cdc67
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.kernel_constants;
+
+import 'package:kernel/ast.dart'
+    show
+        Constant,
+        DartType,
+        EnvironmentBoolConstant,
+        EnvironmentIntConstant,
+        EnvironmentStringConstant,
+        ListConstant,
+        MapConstant,
+        NullConstant,
+        StaticInvocation,
+        StringConstant,
+        TreeNode;
+
+import 'package:kernel/transformations/constants.dart'
+    show ConstantsBackend, ErrorReporter;
+
+import '../problems.dart' show unexpected, unimplemented;
+
+class KernelConstantsBackend extends ConstantsBackend {
+  @override
+  Constant lowerListConstant(ListConstant constant) => constant;
+
+  @override
+  Constant lowerMapConstant(MapConstant constant) => constant;
+
+  @override
+  Constant buildConstantForNative(
+      String nativeName,
+      List<DartType> typeArguments,
+      List<Constant> positionalArguments,
+      Map<String, Constant> namedArguments,
+      List<TreeNode> context,
+      StaticInvocation node,
+      ErrorReporter errorReporter,
+      void abortEvaluation()) {
+    // VM-specific names of the fromEnvironment factory constructors.
+    if (nativeName == 'Bool_fromEnvironment' ||
+        nativeName == 'Integer_fromEnvironment' ||
+        nativeName == 'String_fromEnvironment') {
+      if (positionalArguments.length == 1 &&
+          positionalArguments.first is StringConstant &&
+          (namedArguments.length == 0 ||
+              (namedArguments.length == 1 &&
+                  namedArguments.containsKey('defaultValue')))) {
+        StringConstant name = positionalArguments.first;
+        Constant defaultValue =
+            namedArguments['defaultValue'] ?? new NullConstant();
+        if (nativeName == 'Bool_fromEnvironment') {
+          return new EnvironmentBoolConstant(name.value, defaultValue);
+        }
+        if (nativeName == 'Integer_fromEnvironment') {
+          return new EnvironmentIntConstant(name.value, defaultValue);
+        }
+        return new EnvironmentStringConstant(name.value, defaultValue);
+      }
+      return unexpected('valid constructor invocation', node.toString(),
+          node.fileOffset, node.location.file);
+    }
+    return unimplemented('constant evaluation of ${nativeName}',
+        node.fileOffset, node.location.file);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index ba576ed..d34ba34 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -37,7 +37,13 @@
         templateDuplicatedDeclarationSyntheticCause,
         templateEnumConstantSameNameAsEnclosing;
 
-import '../modifier.dart' show constMask, finalMask, staticMask;
+import '../modifier.dart'
+    show
+        constMask,
+        finalMask,
+        hasInitializerMask,
+        initializingFormalMask,
+        staticMask;
 
 import '../source/source_class_builder.dart' show SourceClassBuilder;
 
@@ -126,10 +132,10 @@
     ///   String toString() => _name;
     /// }
 
-    members["index"] = new KernelFieldBuilder(
-        null, intType, "index", finalMask, parent, charOffset, null, true);
-    members["_name"] = new KernelFieldBuilder(
-        null, stringType, "_name", finalMask, parent, charOffset, null, true);
+    members["index"] = new KernelFieldBuilder(null, intType, "index",
+        finalMask | hasInitializerMask, parent, charOffset, charOffset);
+    members["_name"] = new KernelFieldBuilder(null, stringType, "_name",
+        finalMask | hasInitializerMask, parent, charOffset, charOffset);
     KernelConstructorBuilder constructorBuilder = new KernelConstructorBuilder(
         null,
         constMask,
@@ -137,10 +143,10 @@
         "",
         null,
         <FormalParameterBuilder>[
-          new KernelFormalParameterBuilder(
-              null, 0, intType, "index", true, parent, charOffset),
-          new KernelFormalParameterBuilder(
-              null, 0, stringType, "_name", true, parent, charOffset)
+          new KernelFormalParameterBuilder(null, initializingFormalMask,
+              intType, "index", parent, charOffset),
+          new KernelFormalParameterBuilder(null, initializingFormalMask,
+              stringType, "_name", parent, charOffset)
         ],
         parent,
         charOffset,
@@ -148,8 +154,14 @@
         charOffset,
         charEndOffset);
     constructors[""] = constructorBuilder;
-    KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(null, listType,
-        "values", constMask | staticMask, parent, charOffset, null, true);
+    KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(
+        null,
+        listType,
+        "values",
+        constMask | staticMask | hasInitializerMask,
+        parent,
+        charOffset,
+        charOffset);
     members["values"] = valuesBuilder;
     KernelProcedureBuilder toStringBuilder = new KernelProcedureBuilder(
         null,
@@ -205,11 +217,10 @@
             metadata,
             selfType,
             name,
-            constMask | staticMask,
+            constMask | staticMask | hasInitializerMask,
             parent,
             enumConstantInfo.charOffset,
-            null,
-            true);
+            enumConstantInfo.charOffset);
         metadataCollector?.setDocumentationComment(
             fieldBuilder.target, documentationComment);
         members[name] = fieldBuilder..next = existing;
@@ -222,8 +233,7 @@
         name,
         new Scope(members, null, parent.scope, "enum $name",
             isModifiable: false),
-        new Scope(constructors, null, null, "constructors",
-            isModifiable: false),
+        new Scope(constructors, null, null, name, isModifiable: false),
         cls,
         enumConstantInfos,
         intType,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
index 5aec155..38f029e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -86,10 +86,7 @@
         Constructor,
         DartType,
         Field,
-        IllegalAssignmentJudgment,
-        IndexAssignmentJudgment,
         Initializer,
-        InvalidWriteJudgment,
         Let,
         LoadLibraryTearOffJudgment,
         Member,
@@ -97,20 +94,15 @@
         Name,
         NullAwarePropertyGetJudgment,
         Procedure,
-        PropertyAssignmentJudgment,
         PropertyGet,
         PropertySet,
-        StaticAssignmentJudgment,
         StaticSet,
         SuperMethodInvocation,
         SuperMethodInvocationJudgment,
         SuperPropertyGetJudgment,
         SuperPropertySet,
-        SyntheticExpressionJudgment,
         TreeNode,
         TypeParameter,
-        UnresolvedVariableAssignmentJudgment,
-        VariableAssignmentJudgment,
         VariableDeclaration,
         VariableDeclarationJudgment,
         VariableGet,
@@ -126,6 +118,9 @@
         PrefixBuilder,
         TypeDeclarationBuilder;
 
+import 'kernel_shadow_ast.dart' as shadow
+    show PropertyAssignmentJudgment, SyntheticWrapper;
+
 part 'kernel_expression_generator_impl.dart';
 
 abstract class KernelExpressionGenerator implements ExpressionGenerator {
@@ -239,22 +234,26 @@
 
   @override
   Expression makeInvalidRead() {
-    return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
-        forest.literalNull(token),
-        plainNameForRead,
-        forest.argumentsEmpty(noLocation),
-        offsetForToken(token),
-        isGetter: true));
+    return helper.wrapSyntheticExpression(
+        helper.throwNoSuchMethodError(
+            forest.literalNull(token),
+            plainNameForRead,
+            forest.argumentsEmpty(noLocation),
+            offsetForToken(token),
+            isGetter: true),
+        offsetForToken(token));
   }
 
   @override
   Expression makeInvalidWrite(Expression value) {
-    return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
-        forest.literalNull(token),
-        plainNameForRead,
-        forest.arguments(<Expression>[value], noLocation),
-        offsetForToken(token),
-        isSetter: true));
+    return helper.wrapSyntheticExpression(
+        helper.throwNoSuchMethodError(
+            forest.literalNull(token),
+            plainNameForRead,
+            forest.arguments(<Expression>[value], noLocation),
+            offsetForToken(token),
+            isSetter: true),
+        offsetForToken(token));
   }
 
   Expression _makeSimpleRead() => _makeRead(null);
@@ -266,20 +265,26 @@
 
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     Expression read = makeInvalidRead();
-    complexAssignment?.read = read;
+    if (complexAssignment != null) {
+      read = helper.desugarSyntheticExpression(read);
+      complexAssignment.read = read;
+    }
     return read;
   }
 
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
     Expression write = makeInvalidWrite(value);
-    complexAssignment?.write = write;
+    if (complexAssignment != null) {
+      write = helper.desugarSyntheticExpression(write);
+      complexAssignment.write = write;
+    }
     return write;
   }
 
   Expression _finish(
       Expression body, ComplexAssignmentJudgment complexAssignment) {
-    if (complexAssignment != null) {
+    if (!helper.legacyMode && complexAssignment != null) {
       complexAssignment.desugared = body;
       return complexAssignment;
     } else {
@@ -290,7 +295,7 @@
   /// Creates a data structure for tracking the desugaring of a complex
   /// assignment expression whose right hand side is [rhs].
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new IllegalAssignmentJudgment(rhs);
+      shadow.SyntheticWrapper.wrapIllegalAssignment(rhs);
 }
 
 abstract class KernelGenerator = Generator with KernelExpressionGenerator;
@@ -311,8 +316,8 @@
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
     var fact = helper.typePromoter
-        .getFactForAccess(variable, helper.functionNestingLevel);
-    var scope = helper.typePromoter.currentScope;
+        ?.getFactForAccess(variable, helper.functionNestingLevel);
+    var scope = helper.typePromoter?.currentScope;
     var read = new VariableGetJudgment(variable, fact, scope)
       ..fileOffset = offsetForToken(token);
     complexAssignment?.read = read;
@@ -322,7 +327,7 @@
   @override
   Expression _makeWrite(Expression value, bool voidContext,
       ComplexAssignmentJudgment complexAssignment) {
-    helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel);
+    helper.typePromoter?.mutateVariable(variable, helper.functionNestingLevel);
     var write = variable.isFinal || variable.isConst
         ? makeInvalidWrite(value)
         : new VariableSet(variable, value)
@@ -339,8 +344,10 @@
   }
 
   @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new VariableAssignmentJudgment(rhs);
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) {
+    return shadow.SyntheticWrapper.wrapVariableAssignment(rhs)
+      ..fileOffset = offsetForToken(token);
+  }
 
   @override
   void printOn(StringSink sink) {
@@ -384,7 +391,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new PropertyAssignmentJudgment(receiver, rhs);
+      shadow.SyntheticWrapper.wrapPropertyAssignment(receiver, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -497,7 +504,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new PropertyAssignmentJudgment(null, rhs);
+      shadow.SyntheticWrapper.wrapPropertyAssignment(null, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -571,7 +578,9 @@
       ..fileOffset = offset;
     if (complexAssignment != null) {
       body = makeLet(receiver, nullAwareGuard);
-      PropertyAssignmentJudgment kernelPropertyAssign = complexAssignment;
+      if (helper.legacyMode) return body;
+      shadow.PropertyAssignmentJudgment kernelPropertyAssign =
+          complexAssignment;
       kernelPropertyAssign.nullAwareGuard = nullAwareGuard;
       kernelPropertyAssign.desugared = body;
       return kernelPropertyAssign;
@@ -588,7 +597,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new PropertyAssignmentJudgment(receiverExpression, rhs);
+      shadow.SyntheticWrapper.wrapPropertyAssignment(receiverExpression, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -670,7 +679,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new PropertyAssignmentJudgment(null, rhs, isSuper: true);
+      shadow.SyntheticWrapper.wrapPropertyAssignment(null, rhs, isSuper: true);
 
   @override
   void printOn(StringSink sink) {
@@ -809,7 +818,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new IndexAssignmentJudgment(receiver, index, rhs);
+      shadow.SyntheticWrapper.wrapIndexAssignment(receiver, index, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -933,7 +942,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new IndexAssignmentJudgment(null, index, rhs);
+      shadow.SyntheticWrapper.wrapIndexAssignment(null, index, rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -1070,7 +1079,8 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new IndexAssignmentJudgment(null, index, rhs, isSuper: true);
+      shadow.SyntheticWrapper.wrapIndexAssignment(null, index, rhs,
+          isSuper: true);
 
   @override
   void printOn(StringSink sink) {
@@ -1103,13 +1113,17 @@
 
   @override
   Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    Expression read;
     if (readTarget == null) {
-      return makeInvalidRead();
+      read = makeInvalidRead();
+      if (complexAssignment != null) {
+        read = helper.desugarSyntheticExpression(read);
+      }
     } else {
-      var read = helper.makeStaticGet(readTarget, token);
-      complexAssignment?.read = read;
-      return read;
+      read = helper.makeStaticGet(readTarget, token);
     }
+    complexAssignment?.read = read;
+    return read;
   }
 
   @override
@@ -1118,6 +1132,9 @@
     Expression write;
     if (writeTarget == null) {
       write = makeInvalidWrite(value);
+      if (complexAssignment != null) {
+        write = helper.desugarSyntheticExpression(write);
+      }
     } else {
       write = new StaticSet(writeTarget, value);
     }
@@ -1150,7 +1167,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new StaticAssignmentJudgment(rhs);
+      shadow.SyntheticWrapper.wrapStaticAssignment(rhs);
 
   @override
   void printOn(StringSink sink) {
@@ -1234,7 +1251,7 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      new StaticAssignmentJudgment(rhs);
+      shadow.SyntheticWrapper.wrapStaticAssignment(rhs);
 }
 
 class KernelTypeUseGenerator extends KernelReadOnlyAccessGenerator
@@ -1254,10 +1271,11 @@
         KernelInvalidTypeBuilder declaration = this.declaration;
         helper.addProblemErrorIfConst(
             declaration.message.messageObject, offset, token.length);
-        super.expression = new SyntheticExpressionJudgment(
+        super.expression = helper.wrapSyntheticExpression(
             forest.throwExpression(
                 null, forest.literalString(declaration.message.message, token))
-              ..fileOffset = offset);
+              ..fileOffset = offset,
+            offset);
       } else {
         super.expression = forest.literalType(
             helper.buildDartType(
@@ -1272,13 +1290,15 @@
 
   @override
   Expression makeInvalidWrite(Expression value) {
-    return new SyntheticExpressionJudgment(helper.throwNoSuchMethodError(
-        forest.literalNull(token),
-        plainNameForRead,
-        forest.arguments(<Expression>[value], null)
-          ..fileOffset = value.fileOffset,
-        offsetForToken(token),
-        isSetter: true));
+    return helper.wrapSyntheticExpression(
+        helper.throwNoSuchMethodError(
+            forest.literalNull(token),
+            plainNameForRead,
+            forest.arguments(<Expression>[value], null)
+              ..fileOffset = value.fileOffset,
+            offsetForToken(token),
+            isSetter: true),
+        offsetForToken(token));
   }
 
   @override
@@ -1427,14 +1447,15 @@
     sink.write(name.name);
   }
 
-  UnresolvedVariableAssignmentJudgment _buildUnresolvedVariableAssignment(
+  Expression _buildUnresolvedVariableAssignment(
       bool isCompound, Expression value) {
-    return new UnresolvedVariableAssignmentJudgment(
-      buildError(forest.arguments(<Expression>[value], token), isSetter: true)
-          .desugared,
-      isCompound,
-      value,
-    )..fileOffset = token.charOffset;
+    return helper.wrapUnresolvedVariableAssignment(
+        helper.desugarSyntheticExpression(buildError(
+            forest.arguments(<Expression>[value], token),
+            isSetter: true)),
+        isCompound,
+        value,
+        token.charOffset);
   }
 }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
index 009288ffe..f67e700 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
@@ -46,8 +46,7 @@
     }
   }
 
-  SyntheticExpressionJudgment buildFieldInitializerError(
-      Map<String, int> initializedFields) {
+  Expression buildFieldInitializerError(Map<String, int> initializedFields) {
     String keyword = isSuper ? "super" : "this";
     return helper.buildProblem(
         templateThisOrSuperAccessInFieldInitializer.withArguments(keyword),
@@ -57,7 +56,8 @@
 
   @override
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    Expression error = buildFieldInitializerError(initializedFields).desugared;
+    Expression error = helper.desugarSyntheticExpression(
+        buildFieldInitializerError(initializedFields));
     return helper.buildInvalidInitializer(error, error.fileOffset);
   }
 
@@ -139,14 +139,15 @@
           .withLocation(uri, offsetForToken(token), lengthForToken(token));
     }
     if (message != null) {
-      return helper.buildInvalidInitializer(new SyntheticExpressionJudgment(
+      return helper.buildInvalidInitializer(helper.wrapSyntheticExpression(
           helper.throwNoSuchMethodError(
               forest.literalNull(null)..fileOffset = offset,
               helper.constructorNameForDiagnostics(name.name, isSuper: isSuper),
               arguments,
               offset,
               isSuper: isSuper,
-              message: message)));
+              message: message),
+          offset));
     } else if (isSuper) {
       return helper.buildSuperInitializer(
           false, constructor, arguments, offset);
@@ -189,10 +190,10 @@
   }
 
   Expression buildAssignmentError() {
-    return helper
-        .buildProblem(isSuper ? messageCannotAssignToSuper : messageNotAnLvalue,
-            offsetForToken(token), token.length)
-        .desugared;
+    return helper.desugarSyntheticExpression(helper.buildProblem(
+        isSuper ? messageCannotAssignToSuper : messageNotAnLvalue,
+        offsetForToken(token),
+        token.length));
   }
 
   @override
@@ -236,7 +237,7 @@
   String get debugName => "IncompleteErrorGenerator";
 
   @override
-  SyntheticExpressionJudgment buildError(Arguments arguments,
+  Expression buildError(Arguments arguments,
       {bool isGetter: false, bool isSetter: false, int offset}) {
     int length = noLength;
     if (offset == null) {
@@ -406,16 +407,17 @@
 
   @override
   ComplexAssignmentJudgment startComplexAssignment(Expression rhs) {
-    return new IllegalAssignmentJudgment(rhs,
+    return shadow.SyntheticWrapper.wrapIllegalAssignment(rhs,
         assignmentOffset: offsetForToken(token));
   }
 
   Expression makeInvalidWrite(Expression value) {
-    return new InvalidWriteJudgment(
-        helper
-            .buildProblem(messageCannotAssignToParenthesizedExpression,
-                offsetForToken(token), lengthForToken(token))
-            .desugared,
-        expression);
+    return helper.wrapInvalidWrite(
+        helper.desugarSyntheticExpression(helper.buildProblem(
+            messageCannotAssignToParenthesizedExpression,
+            offsetForToken(token),
+            lengthForToken(token))),
+        expression,
+        offsetForToken(token));
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index 18a8aee..adf0f98 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -5,25 +5,24 @@
 library fasta.kernel_field_builder;
 
 import 'package:kernel/ast.dart'
-    show DartType, Expression, Field, Name, NullLiteral;
+    show DartType, DynamicType, Expression, Field, Name, NullLiteral;
 
 import '../../base/instrumentation.dart'
     show Instrumentation, InstrumentationValueForType;
 
-import '../../scanner/token.dart' show Token;
-
 import '../fasta_codes.dart' show messageInternalProblemAlreadyInitialized;
 
-import '../problems.dart' show internalProblem;
+import '../problems.dart' show internalProblem, unsupported;
 
 import 'kernel_body_builder.dart' show KernelBodyBuilder;
 
 import 'kernel_builder.dart'
     show
         Declaration,
+        ImplicitType,
         FieldBuilder,
+        KernelLibraryBuilder,
         KernelTypeBuilder,
-        LibraryBuilder,
         MetadataBuilder;
 
 import 'kernel_shadow_ast.dart' show ShadowField;
@@ -32,21 +31,13 @@
   final ShadowField field;
   final List<MetadataBuilder> metadata;
   final KernelTypeBuilder type;
-  Token initializerTokenForInference;
-  final bool hasInitializer;
 
-  KernelFieldBuilder(
-      this.metadata,
-      this.type,
-      String name,
-      int modifiers,
-      Declaration compilationUnit,
-      int charOffset,
-      this.initializerTokenForInference,
-      this.hasInitializer)
+  KernelFieldBuilder(this.metadata, this.type, String name, int modifiers,
+      Declaration compilationUnit, int charOffset, int charEndOffset)
       : field = new ShadowField(null, type == null,
             fileUri: compilationUnit?.fileUri)
-          ..fileOffset = charOffset,
+          ..fileOffset = charOffset
+          ..fileEndOffset = charEndOffset,
         super(name, modifiers, compilationUnit, charOffset);
 
   void set initializer(Expression value) {
@@ -57,10 +48,13 @@
     field.initializer = value..parent = field;
   }
 
-  bool get isEligibleForInference =>
-      type == null && (hasInitializer || isInstanceMember);
+  bool get isEligibleForInference {
+    return !library.legacyMode &&
+        type == null &&
+        (hasInitializer || isInstanceMember);
+  }
 
-  Field build(LibraryBuilder library) {
+  Field build(KernelLibraryBuilder library) {
     field.name ??= new Name(name, library.target);
     if (type != null) {
       field.type = type.build(library);
@@ -73,9 +67,7 @@
       ..hasImplicitGetter = isInstanceMember
       ..hasImplicitSetter = isInstanceMember && !isConst && !isFinal
       ..isStatic = !isInstanceMember;
-    if (!library.disableTypeInference &&
-        isEligibleForInference &&
-        !isInstanceMember) {
+    if (isEligibleForInference && !isInstanceMember) {
       library.loader.typeInferenceEngine
           .recordStaticFieldInferenceCandidate(field, library);
     }
@@ -84,17 +76,23 @@
 
   Field get target => field;
 
-  @override
   void prepareTopLevelInference() {
     if (!isEligibleForInference) return;
+    KernelLibraryBuilder library = this.library;
     var typeInferrer = library.loader.typeInferenceEngine
         .createTopLevelTypeInferrer(
             field.enclosingClass?.thisType, field, null);
     if (hasInitializer) {
+      if (field.type is! ImplicitType) {
+        unsupported(
+            "$name has unexpected type ${field.type}", charOffset, fileUri);
+        return;
+      }
+      ImplicitType type = field.type;
+      field.type = const DynamicType();
       initializer = new KernelBodyBuilder.forField(this, typeInferrer)
-          .parseFieldInitializer(initializerTokenForInference);
+          .parseFieldInitializer(type.initializerToken);
     }
-    initializerTokenForInference = null;
   }
 
   @override
@@ -107,8 +105,4 @@
 
   @override
   DartType get builtType => field.type;
-
-  @override
-  bool get hasTypeInferredFromInitializer =>
-      ShadowField.hasTypeInferredFromInitializer(field);
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
index b76dbae..ec775ef 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
@@ -6,14 +6,18 @@
 
 import 'package:kernel/ast.dart' show VariableDeclaration;
 
-import '../modifier.dart' show finalMask;
+import '../modifier.dart' show finalMask, initializingFormalMask;
 
 import 'kernel_builder.dart'
     show
+        ClassBuilder,
+        Declaration,
         FormalParameterBuilder,
+        KernelFieldBuilder,
         KernelLibraryBuilder,
         KernelTypeBuilder,
-        MetadataBuilder;
+        MetadataBuilder,
+        TypeBuilder;
 
 import 'kernel_shadow_ast.dart' show VariableDeclarationJudgment;
 
@@ -26,11 +30,9 @@
       int modifiers,
       KernelTypeBuilder type,
       String name,
-      bool hasThis,
       KernelLibraryBuilder compilationUnit,
       int charOffset)
-      : super(metadata, modifiers, type, name, hasThis, compilationUnit,
-            charOffset);
+      : super(metadata, modifiers, type, name, compilationUnit, charOffset);
 
   VariableDeclaration get target => declaration;
 
@@ -41,20 +43,44 @@
           type: type?.build(library),
           isFinal: isFinal,
           isConst: isConst,
-          isFieldFormal: hasThis,
+          isFieldFormal: isInitializingFormal,
           isCovariant: isCovariant)
         ..fileOffset = charOffset;
     }
     return declaration;
   }
 
+  KernelFormalParameterBuilder clone(List<TypeBuilder> newTypes) {
+    // TODO(dmitryas):  It's not clear how [metadata] is used currently, and
+    // how it should be cloned.  Consider cloning it instead of reusing it.
+    return new KernelFormalParameterBuilder(
+        metadata, modifiers, type?.clone(newTypes), name, parent, charOffset)
+      ..kind = kind;
+  }
+
   @override
   FormalParameterBuilder forFormalParameterInitializerScope() {
     assert(declaration != null);
-    return !hasThis
+    return !isInitializingFormal
         ? this
-        : (new KernelFormalParameterBuilder(metadata, modifiers | finalMask,
-            type, name, hasThis, parent, charOffset)
+        : (new KernelFormalParameterBuilder(
+            metadata,
+            modifiers | finalMask | initializingFormalMask,
+            type,
+            name,
+            null,
+            charOffset)
+          ..parent = parent
           ..declaration = declaration);
   }
+
+  void finalizeInitializingFormal() {
+    Object cls = parent.parent;
+    if (cls is ClassBuilder) {
+      Declaration field = cls.scope.lookup(name, charOffset, fileUri);
+      if (field is KernelFieldBuilder) {
+        target.type = field.target.type;
+      }
+    }
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
index de60d54..1e174f4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_alias_builder.dart
@@ -34,6 +34,8 @@
         MetadataBuilder,
         TypeVariableBuilder;
 
+final InvalidType cyclicTypeAliasMarker = new InvalidType();
+
 class KernelFunctionTypeAliasBuilder
     extends FunctionTypeAliasBuilder<KernelFunctionTypeBuilder, DartType> {
   final Typedef target;
@@ -49,7 +51,11 @@
       int charOffset,
       [Typedef target])
       : target = target ??
-            (new Typedef(name, null, fileUri: parent.target.fileUri)
+            (new Typedef(name, null,
+                typeParameters:
+                    KernelTypeVariableBuilder.kernelTypeParametersFromBuilders(
+                        typeVariables),
+                fileUri: parent.target.fileUri)
               ..fileOffset = charOffset),
         super(metadata, name, typeVariables, type, parent, charOffset);
 
@@ -86,27 +92,28 @@
 
   DartType buildThisType(LibraryBuilder library) {
     if (thisType != null) {
-      if (const InvalidType() == thisType) {
+      if (identical(thisType, cyclicTypeAliasMarker)) {
         library.addProblem(templateCyclicTypedef.withArguments(name),
             charOffset, noLength, fileUri);
-        return const DynamicType();
+        return const InvalidType();
       }
       return thisType;
     }
-    thisType = const InvalidType();
-    FunctionType builtType = type?.build(library);
+    // It is a compile-time error for an alias (typedef) to refer to itself. We
+    // detect cycles by detecting recursive calls to this method using an
+    // instance of InvalidType that isn't identical to `const InvalidType()`.
+    thisType = cyclicTypeAliasMarker;
+    FunctionType builtType = type?.build(library, target.thisType);
     if (builtType != null) {
-      builtType.typedefReference = target.reference;
       if (typeVariables != null) {
         for (KernelTypeVariableBuilder tv in typeVariables) {
           // Follow bound in order to find all cycles
           tv.bound?.build(library);
-          target.typeParameters.add(tv.parameter..parent = target);
         }
       }
       return thisType = builtType;
     } else {
-      return thisType = const DynamicType();
+      return thisType = const InvalidType();
     }
   }
 
@@ -121,11 +128,7 @@
     for (int i = 0; i < target.typeParameters.length; i++) {
       substitution[target.typeParameters[i]] = arguments[i];
     }
-    result = substitute(result, substitution);
-    if (library is KernelLibraryBuilder) {
-      library.typedefInstantiations[result] = arguments;
-    }
-    return result;
+    return substitute(result, substitution);
   }
 
   List<DartType> buildTypeArguments(
@@ -174,7 +177,7 @@
   DartType buildType(
       LibraryBuilder library, List<KernelTypeBuilder> arguments) {
     var thisType = buildThisType(library);
-    if (thisType is DynamicType) return thisType;
+    if (thisType is InvalidType) return thisType;
     FunctionType result = thisType;
     if (target.typeParameters.isEmpty && arguments == null) return result;
     // Otherwise, substitute.
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
index 5b67a52..916dc20d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
@@ -11,7 +11,8 @@
         FunctionType,
         NamedType,
         Supertype,
-        TypeParameter;
+        TypeParameter,
+        TypedefType;
 
 import '../fasta_codes.dart'
     show LocatedMessage, messageSupertypeIsFunction, noLength;
@@ -37,7 +38,7 @@
       List<FormalParameterBuilder> formals)
       : super(returnType, typeVariables, formals);
 
-  FunctionType build(LibraryBuilder library) {
+  FunctionType build(LibraryBuilder library, [TypedefType origin]) {
     DartType builtReturnType =
         returnType?.build(library) ?? const DynamicType();
     List<DartType> positionalParameters = <DartType>[];
@@ -68,7 +69,8 @@
     return new FunctionType(positionalParameters, builtReturnType,
         namedParameters: namedParameters ?? const <NamedType>[],
         typeParameters: typeParameters ?? const <TypeParameter>[],
-        requiredParameterCount: requiredParameterCount);
+        requiredParameterCount: requiredParameterCount,
+        typedefType: origin);
   }
 
   Supertype buildSupertype(
@@ -89,18 +91,23 @@
   }
 
   KernelFunctionTypeBuilder clone(List<TypeBuilder> newTypes) {
-    List<TypeVariableBuilder> clonedTypeVariables =
-        new List<TypeVariableBuilder>(typeVariables.length);
-    for (int i = 0; i < clonedTypeVariables.length; i++) {
-      clonedTypeVariables[i] = typeVariables[i].clone(newTypes);
+    List<TypeVariableBuilder> clonedTypeVariables;
+    if (typeVariables != null) {
+      clonedTypeVariables = new List<TypeVariableBuilder>(typeVariables.length);
+      for (int i = 0; i < clonedTypeVariables.length; i++) {
+        clonedTypeVariables[i] = typeVariables[i].clone(newTypes);
+      }
     }
-    List<FormalParameterBuilder> clonedFormals =
-        new List<FormalParameterBuilder>(formals.length);
-    for (int i = 0; i < clonedFormals.length; i++) {
-      clonedFormals[i] = formals[i].clone(newTypes);
+    List<FormalParameterBuilder> clonedFormals;
+    if (formals != null) {
+      clonedFormals = new List<FormalParameterBuilder>(formals.length);
+      for (int i = 0; i < clonedFormals.length; i++) {
+        KernelFormalParameterBuilder formal = formals[i];
+        clonedFormals[i] = formal.clone(newTypes);
+      }
     }
     KernelFunctionTypeBuilder newType = new KernelFunctionTypeBuilder(
-        returnType.clone(newTypes), clonedTypeVariables, clonedFormals);
+        returnType?.clone(newTypes), clonedTypeVariables, clonedFormals);
     newTypes.add(newType);
     return newType;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 982bed4..96f2460 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -28,8 +28,10 @@
         Name,
         Procedure,
         ProcedureKind,
+        SetLiteral,
         StaticInvocation,
         StringLiteral,
+        Supertype,
         TreeNode,
         Typedef,
         TypeParameter,
@@ -37,8 +39,17 @@
         VariableDeclaration,
         VoidType;
 
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+
 import 'package:kernel/clone.dart' show CloneVisitor;
 
+import 'package:kernel/src/bounds_checks.dart'
+    show
+        TypeArgumentIssue,
+        findTypeArgumentIssues,
+        findTypeArgumentIssuesForInvocation,
+        getGenericTypeName;
+
 import 'package:kernel/type_algebra.dart' show substitute;
 
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
@@ -69,6 +80,8 @@
         templateIncorrectTypeArgument,
         templateIncorrectTypeArgumentInReturnType,
         templateIncorrectTypeArgumentInferred,
+        templateIncorrectTypeArgumentQualified,
+        templateIncorrectTypeArgumentQualifiedInferred,
         templateLoadLibraryHidesMember,
         templateLocalDefinitionHidesExport,
         templateLocalDefinitionHidesImport,
@@ -82,6 +95,8 @@
 import '../modifier.dart'
     show
         abstractMask,
+        hasInitializerMask,
+        initializingFormalMask,
         mixinDeclarationMask,
         namedMixinApplicationMask,
         staticMask;
@@ -105,6 +120,7 @@
         DynamicTypeBuilder,
         EnumConstantInfo,
         FormalParameterBuilder,
+        ImplicitType,
         InvalidTypeBuilder,
         KernelClassBuilder,
         KernelConstructorBuilder,
@@ -125,6 +141,7 @@
         LoadLibraryBuilder,
         MemberBuilder,
         MetadataBuilder,
+        NameIterator,
         PrefixBuilder,
         ProcedureBuilder,
         QualifiedName,
@@ -168,12 +185,6 @@
   // TODO(dmitryas):  Find a way to mark inferred types.
   final Set<DartType> inferredTypes = new Set<DartType>.identity();
 
-  // List of typedef instantiations built for this library.  They are needed to
-  // perform type argument checks.
-  // TODO(dmitryas):  Find a way to keep type arguments of typedefs around.
-  final Map<FunctionType, List<DartType>> typedefInstantiations =
-      new Map<FunctionType, List<DartType>>.identity();
-
   /// Exports that can't be serialized.
   ///
   /// The key is the name of the exported member.
@@ -185,6 +196,8 @@
   /// the error message is the corresponding value in the map.
   Map<String, String> unserializableExports;
 
+  List<KernelFormalParameterBuilder> untypedInitializingFormals;
+
   KernelLibraryBuilder(Uri uri, Uri fileUri, Loader loader, this.actualOrigin,
       [Scope scope, Library target])
       : library = target ??
@@ -250,8 +263,8 @@
 
     // When looking up a constructor, we don't consider type variables or the
     // library scope.
-    Scope constructorScope = new Scope(constructors, null, null, "constructors",
-        isModifiable: false);
+    Scope constructorScope =
+        new Scope(constructors, null, null, className, isModifiable: false);
     bool isMixinDeclaration = false;
     if (modifiers & mixinDeclarationMask != 0) {
       isMixinDeclaration = true;
@@ -419,16 +432,29 @@
 
       /// Helper function that returns `true` if a type variable with a name
       /// from [typeVariableNames] is referenced in [type].
-      bool usesTypeVariables(KernelNamedTypeBuilder type) {
-        List<KernelTypeBuilder> typeArguments = type.arguments;
-        if (typeArguments != null && typeVariables != null) {
-          for (KernelTypeBuilder argument in typeArguments) {
-            if (typeVariableNames.contains(argument.name)) {
-              return true;
-            } else if (argument is KernelNamedTypeBuilder) {
-              if (usesTypeVariables(argument)) return true;
+      bool usesTypeVariables(KernelTypeBuilder type) {
+        if (type is KernelNamedTypeBuilder) {
+          if (type.declaration is KernelTypeVariableBuilder) {
+            return typeVariableNames.contains(type.declaration.name);
+          }
+
+          List<KernelTypeBuilder> typeArguments = type.arguments;
+          if (typeArguments != null && typeVariables != null) {
+            for (KernelTypeBuilder argument in typeArguments) {
+              if (usesTypeVariables(argument)) {
+                return true;
+              }
             }
           }
+        } else if (type is KernelFunctionTypeBuilder) {
+          if (type.formals != null) {
+            for (FormalParameterBuilder formal in type.formals) {
+              if (usesTypeVariables(formal.type)) {
+                return true;
+              }
+            }
+          }
+          return usesTypeVariables(type.returnType);
         }
         return false;
       }
@@ -517,7 +543,7 @@
             new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
                 scope.withTypeVariables(typeVariables),
                 "mixin $fullname ", isModifiable: false),
-            new Scope(<String, MemberBuilder>{}, null, null, "constructors",
+            new Scope(<String, MemberBuilder>{}, null, null, fullname,
                 isModifiable: false),
             this,
             <ConstructorReferenceBuilder>[],
@@ -573,13 +599,21 @@
       KernelTypeBuilder type,
       String name,
       int charOffset,
+      int charEndOffset,
       Token initializerTokenForInference,
       bool hasInitializer) {
-    var builder = new KernelFieldBuilder(metadata, type, name, modifiers, this,
-        charOffset, initializerTokenForInference, hasInitializer);
-    addBuilder(name, builder, charOffset);
+    if (hasInitializer) {
+      modifiers |= hasInitializerMask;
+    }
+    KernelFieldBuilder field = new KernelFieldBuilder(
+        metadata, type, name, modifiers, this, charOffset, charEndOffset);
+    addBuilder(name, field, charOffset);
+    if (initializerTokenForInference != null) {
+      assert(type == null);
+      field.target.type = new ImplicitType(field, initializerTokenForInference);
+    }
     loader.target.metadataCollector
-        ?.setDocumentationComment(builder.target, documentationComment);
+        ?.setDocumentationComment(field.target, documentationComment);
   }
 
   void addConstructor(
@@ -610,6 +644,11 @@
         charOpenParenOffset,
         charEndOffset,
         nativeMethodName);
+    if (formals != null) {
+      for (int i = 0; i < formals.length; i++) {
+        formals[i].parent = procedure;
+      }
+    }
     metadataCollector?.setDocumentationComment(
         procedure.target, documentationComment);
     metadataCollector?.setConstructorNameOffset(procedure.target, name);
@@ -798,8 +837,16 @@
       String name,
       bool hasThis,
       int charOffset) {
-    return new KernelFormalParameterBuilder(
-        metadata, modifiers, type, name, hasThis, this, charOffset);
+    if (hasThis) {
+      modifiers |= initializingFormalMask;
+    }
+    KernelFormalParameterBuilder formal = new KernelFormalParameterBuilder(
+        metadata, modifiers, type, name, this, charOffset);
+    if (legacyMode && hasThis && type == null) {
+      (untypedInitializingFormals ??= <KernelFormalParameterBuilder>[])
+          .add(formal);
+    }
+    return formal;
   }
 
   KernelTypeVariableBuilder addTypeVariable(
@@ -1109,6 +1156,7 @@
           return unhandled(
               "null", forwarder.name.name, origin.fileOffset, origin.fileUri);
         }
+        if (originNamed.initializer == null) continue;
         forwarderNamed.initializer = cloner.clone(originNamed.initializer);
         forwarderNamed.initializer.parent = forwarderNamed;
       }
@@ -1162,11 +1210,11 @@
 
     int computeDefaultTypesForVariables(
         List<TypeVariableBuilder<TypeBuilder, Object>> variables,
-        bool strongMode) {
+        bool legacyMode) {
       if (variables == null) return 0;
 
       bool haveErroneousBounds = false;
-      if (strongMode) {
+      if (!legacyMode) {
         for (int i = 0; i < variables.length; ++i) {
           TypeVariableBuilder<TypeBuilder, Object> variable = variables[i];
           List<TypeBuilder> genericFunctionTypes = <TypeBuilder>[];
@@ -1188,7 +1236,7 @@
         }
       }
 
-      if (!strongMode || haveErroneousBounds) {
+      if (legacyMode || haveErroneousBounds) {
         // In Dart 1, put `dynamic` everywhere.
         for (int i = 0; i < variables.length; ++i) {
           variables[i].defaultType = dynamicType;
@@ -1210,47 +1258,47 @@
       }
     }
 
-    bool strongMode = loader.target.strongMode;
+    bool legacyMode = loader.target.legacyMode;
     for (var declaration in libraryDeclaration.members.values) {
       if (declaration is KernelClassBuilder) {
         {
-          List<Object> issues = strongMode
-              ? getNonSimplicityIssuesForDeclaration(declaration,
-                  performErrorRecovery: true)
-              : const <Object>[];
+          List<Object> issues = legacyMode
+              ? const <Object>[]
+              : getNonSimplicityIssuesForDeclaration(declaration,
+                  performErrorRecovery: true);
           reportIssues(issues);
-          // In case of issues, use non-strong mode for error recovery.
+          // In case of issues, use legacy mode for error recovery.
           count += computeDefaultTypesForVariables(
-              declaration.typeVariables, strongMode && issues.length == 0);
+              declaration.typeVariables, legacyMode || issues.isNotEmpty);
         }
         declaration.forEach((String name, Declaration member) {
           if (member is KernelProcedureBuilder) {
-            List<Object> issues = strongMode
-                ? getNonSimplicityIssuesForTypeVariables(member.typeVariables)
-                : const <Object>[];
+            List<Object> issues = legacyMode
+                ? const <Object>[]
+                : getNonSimplicityIssuesForTypeVariables(member.typeVariables);
             reportIssues(issues);
-            // In case of issues, use non-strong mode for error recovery.
+            // In case of issues, use legacy mode for error recovery.
             count += computeDefaultTypesForVariables(
-                member.typeVariables, strongMode && issues.length == 0);
+                member.typeVariables, legacyMode || issues.isNotEmpty);
           }
         });
       } else if (declaration is KernelFunctionTypeAliasBuilder) {
-        List<Object> issues = strongMode
-            ? getNonSimplicityIssuesForDeclaration(declaration,
-                performErrorRecovery: true)
-            : const <Object>[];
+        List<Object> issues = legacyMode
+            ? const <Object>[]
+            : getNonSimplicityIssuesForDeclaration(declaration,
+                performErrorRecovery: true);
         reportIssues(issues);
-        // In case of issues, use non-strong mode for error recovery.
+        // In case of issues, use legacy mode for error recovery.
         count += computeDefaultTypesForVariables(
-            declaration.typeVariables, strongMode && issues.length == 0);
+            declaration.typeVariables, legacyMode || issues.isNotEmpty);
       } else if (declaration is KernelFunctionBuilder) {
-        List<Object> issues = strongMode
-            ? getNonSimplicityIssuesForTypeVariables(declaration.typeVariables)
-            : const <Object>[];
+        List<Object> issues = legacyMode
+            ? const <Object>[]
+            : getNonSimplicityIssuesForTypeVariables(declaration.typeVariables);
         reportIssues(issues);
-        // In case of issues, use non-strong mode for error recovery.
+        // In case of issues, use legacy mode for error recovery.
         count += computeDefaultTypesForVariables(
-            declaration.typeVariables, strongMode && issues.length == 0);
+            declaration.typeVariables, legacyMode || issues.isNotEmpty);
       }
     }
 
@@ -1291,7 +1339,10 @@
   @override
   void applyPatches() {
     if (!isPatch) return;
-    origin.forEach((String name, Declaration member) {
+    NameIterator originDeclarations = origin.nameIterator;
+    while (originDeclarations.moveNext()) {
+      String name = originDeclarations.name;
+      Declaration member = originDeclarations.current;
       bool isSetter = member.isSetter;
       Declaration patch = isSetter ? scope.setters[name] : scope.local[name];
       if (patch != null) {
@@ -1309,8 +1360,11 @@
           scopeBuilder.addMember(name, member);
         }
       }
-    });
-    forEach((String name, Declaration member) {
+    }
+    NameIterator patchDeclarations = nameIterator;
+    while (patchDeclarations.moveNext()) {
+      String name = patchDeclarations.name;
+      Declaration member = patchDeclarations.current;
       // We need to inject all non-patch members into the origin library. This
       // should only apply to private members.
       if (member.isPatch) {
@@ -1320,15 +1374,16 @@
       } else {
         origin.exportMemberFromPatch(name, member);
       }
-    });
+    }
   }
 
   int finishPatchMethods() {
     if (!isPatch) return 0;
     int count = 0;
-    forEach((String name, Declaration member) {
-      count += member.finishPatch();
-    });
+    Iterator<Declaration> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      count += iterator.current.finishPatch();
+    }
     return count;
   }
 
@@ -1358,55 +1413,80 @@
     addToExportScope(name, member);
   }
 
-  void reportBoundViolation(
-      Message message, int fileOffset, TypeParameter violated) {
+  void reportTypeArgumentIssues(List<TypeArgumentIssue> issues, int offset,
+      {bool inferred, DartType targetReceiver, String targetName}) {
+    for (TypeArgumentIssue issue in issues) {
+      DartType argument = issue.argument;
+      TypeParameter typeParameter = issue.typeParameter;
+
+      Message message;
+      bool issueInferred = inferred ?? inferredTypes.contains(argument);
+      if (argument is FunctionType && argument.typeParameters.length > 0) {
+        if (issueInferred) {
+          message = templateGenericFunctionTypeInferredAsActualTypeArgument
+              .withArguments(argument);
+        } else {
+          message = messageGenericFunctionTypeUsedAsActualTypeArgument;
+        }
+        typeParameter = null;
+      } else {
+        if (issue.enclosingType == null && targetReceiver != null) {
+          if (issueInferred) {
+            message =
+                templateIncorrectTypeArgumentQualifiedInferred.withArguments(
+                    argument,
+                    typeParameter.bound,
+                    typeParameter.name,
+                    targetReceiver,
+                    targetName);
+          } else {
+            message = templateIncorrectTypeArgumentQualified.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                targetReceiver,
+                targetName);
+          }
+        } else {
+          String enclosingName = issue.enclosingType == null
+              ? targetName
+              : getGenericTypeName(issue.enclosingType);
+          assert(enclosingName != null);
+          if (issueInferred) {
+            message = templateIncorrectTypeArgumentInferred.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                enclosingName);
+          } else {
+            message = templateIncorrectTypeArgument.withArguments(argument,
+                typeParameter.bound, typeParameter.name, enclosingName);
+          }
+        }
+      }
+
+      reportTypeArgumentIssue(message, offset, typeParameter);
+    }
+  }
+
+  void reportTypeArgumentIssue(
+      Message message, int fileOffset, TypeParameter typeParameter) {
     List<LocatedMessage> context;
-    if (violated != null && violated.fileOffset != -1) {
+    if (typeParameter != null && typeParameter.fileOffset != -1) {
       // It looks like when parameters come from patch files, they don't
       // have a reportable location.
       context = <LocatedMessage>[
         messageIncorrectTypeArgumentVariable.withLocation(
-            violated.location.file, violated.fileOffset, noLength)
+            typeParameter.location.file, typeParameter.fileOffset, noLength)
       ];
     }
     addProblem(message, fileOffset, noLength, fileUri, context: context);
   }
 
   void checkBoundsInField(Field field, TypeEnvironment typeEnvironment) {
-    if (!loader.target.strongMode) return;
-    List<Object> boundViolations = typeEnvironment.findBoundViolations(
-        field.type,
-        allowSuperBounded: true,
-        typedefInstantiations: typedefInstantiations);
-    if (boundViolations != null) {
-      for (int i = 0; i < boundViolations.length; i += 3) {
-        DartType argument = boundViolations[i];
-        TypeParameter variable = boundViolations[i + 1];
-        DartType enclosingType = boundViolations[i + 2];
-
-        Message message;
-        bool inferred = inferredTypes.contains(argument);
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          variable = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, typeEnvironment.getGenericTypeName(enclosingType));
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, typeEnvironment.getGenericTypeName(enclosingType));
-          }
-        }
-
-        reportBoundViolation(message, field.fileOffset, variable);
-      }
-    }
+    if (loader.target.legacyMode) return;
+    checkBoundsInType(field.type, typeEnvironment, field.fileOffset,
+        allowSuperBounded: true);
   }
 
   void checkBoundsInFunctionNodeParts(
@@ -1415,140 +1495,35 @@
       List<VariableDeclaration> positionalParameters,
       List<VariableDeclaration> namedParameters,
       DartType returnType}) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
     if (typeParameters != null) {
       for (TypeParameter parameter in typeParameters) {
-        List<Object> violations = typeEnvironment.findBoundViolations(
-            parameter.bound,
-            allowSuperBounded: false,
-            typedefInstantiations: typedefInstantiations);
-        if (violations != null) {
-          int offset = parameter.fileOffset;
-          for (int i = 0; i < violations.length; i += 3) {
-            DartType argument = violations[i];
-            TypeParameter variable = violations[i + 1];
-            DartType enclosingType = violations[i + 2];
-
-            Message message;
-            bool inferred = inferredTypes.contains(argument);
-            if (argument is FunctionType &&
-                argument.typeParameters.length > 0) {
-              if (inferred) {
-                message =
-                    templateGenericFunctionTypeInferredAsActualTypeArgument
-                        .withArguments(argument);
-              } else {
-                message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-              }
-              variable = null;
-            } else {
-              if (inferred) {
-                message = templateIncorrectTypeArgumentInferred.withArguments(
-                    argument,
-                    typeEnvironment.getGenericTypeName(enclosingType));
-              } else {
-                message = templateIncorrectTypeArgument.withArguments(argument,
-                    typeEnvironment.getGenericTypeName(enclosingType));
-              }
-            }
-
-            reportBoundViolation(message, offset, variable);
-          }
-        }
+        checkBoundsInType(
+            parameter.bound, typeEnvironment, parameter.fileOffset,
+            allowSuperBounded: false);
       }
     }
     if (positionalParameters != null) {
       for (VariableDeclaration formal in positionalParameters) {
-        List<Object> violations = typeEnvironment.findBoundViolations(
-            formal.type,
-            allowSuperBounded: true,
-            typedefInstantiations: typedefInstantiations);
-        if (violations != null) {
-          int offset = formal.fileOffset;
-          for (int i = 0; i < violations.length; i += 3) {
-            DartType argument = violations[i];
-            TypeParameter variable = violations[i + 1];
-            DartType enclosingType = violations[i + 2];
-
-            Message message;
-            bool inferred = inferredTypes.contains(argument);
-            if (argument is FunctionType &&
-                argument.typeParameters.length > 0) {
-              if (inferred) {
-                message =
-                    templateGenericFunctionTypeInferredAsActualTypeArgument
-                        .withArguments(argument);
-              } else {
-                message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-              }
-              variable = null;
-            } else {
-              if (inferred) {
-                message = templateIncorrectTypeArgumentInferred.withArguments(
-                    argument,
-                    typeEnvironment.getGenericTypeName(enclosingType));
-              } else {
-                message = templateIncorrectTypeArgument.withArguments(argument,
-                    typeEnvironment.getGenericTypeName(enclosingType));
-              }
-            }
-
-            reportBoundViolation(message, offset, variable);
-          }
-        }
+        checkBoundsInType(formal.type, typeEnvironment, formal.fileOffset,
+            allowSuperBounded: true);
       }
     }
     if (namedParameters != null) {
       for (VariableDeclaration named in namedParameters) {
-        List<Object> violations = typeEnvironment.findBoundViolations(
-            named.type,
-            allowSuperBounded: true,
-            typedefInstantiations: typedefInstantiations);
-        if (violations != null) {
-          int offset = named.fileOffset;
-          for (int i = 0; i < violations.length; i += 3) {
-            DartType argument = violations[i];
-            TypeParameter variable = violations[i + 1];
-            DartType enclosingType = violations[i + 2];
-
-            Message message;
-            bool inferred = inferredTypes.contains(argument);
-            if (argument is FunctionType &&
-                argument.typeParameters.length > 0) {
-              if (inferred) {
-                message =
-                    templateGenericFunctionTypeInferredAsActualTypeArgument
-                        .withArguments(argument);
-              } else {
-                message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-              }
-              variable = null;
-            } else {
-              if (inferred) {
-                message = templateIncorrectTypeArgumentInferred.withArguments(
-                    argument,
-                    typeEnvironment.getGenericTypeName(enclosingType));
-              } else {
-                message = templateIncorrectTypeArgument.withArguments(argument,
-                    typeEnvironment.getGenericTypeName(enclosingType));
-              }
-            }
-
-            reportBoundViolation(message, offset, variable);
-          }
-        }
+        checkBoundsInType(named.type, typeEnvironment, named.fileOffset,
+            allowSuperBounded: true);
       }
     }
     if (returnType != null) {
-      List<Object> violations = typeEnvironment.findBoundViolations(returnType,
-          allowSuperBounded: true,
-          typedefInstantiations: typedefInstantiations);
-      if (violations != null) {
+      List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+          returnType, typeEnvironment,
+          allowSuperBounded: true);
+      if (issues != null) {
         int offset = fileOffset;
-        for (int i = 0; i < violations.length; i += 3) {
-          DartType argument = violations[i];
-          TypeParameter variable = violations[i + 1];
-          DartType enclosingType = violations[i + 2];
+        for (TypeArgumentIssue issue in issues) {
+          DartType argument = issue.argument;
+          TypeParameter typeParameter = issue.typeParameter;
 
           // We don't need to check if [argument] was inferred or specified
           // here, because inference in return types boils down to instantiate-
@@ -1556,13 +1531,16 @@
           Message message;
           if (argument is FunctionType && argument.typeParameters.length > 0) {
             message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-            variable = null;
+            typeParameter = null;
           } else {
             message = templateIncorrectTypeArgumentInReturnType.withArguments(
-                argument, typeEnvironment.getGenericTypeName(enclosingType));
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                getGenericTypeName(issue.enclosingType));
           }
 
-          reportBoundViolation(message, offset, variable);
+          reportTypeArgumentIssue(message, offset, typeParameter);
         }
       }
     }
@@ -1570,7 +1548,7 @@
 
   void checkBoundsInFunctionNode(
       FunctionNode function, TypeEnvironment typeEnvironment) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
     checkBoundsInFunctionNodeParts(typeEnvironment, function.fileOffset,
         typeParameters: function.typeParameters,
         positionalParameters: function.positionalParameters,
@@ -1581,14 +1559,21 @@
   void checkBoundsInListLiteral(
       ListLiteral node, TypeEnvironment typeEnvironment,
       {bool inferred = false}) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
+    checkBoundsInType(node.typeArgument, typeEnvironment, node.fileOffset,
+        inferred: inferred, allowSuperBounded: true);
+  }
+
+  void checkBoundsInSetLiteral(SetLiteral node, TypeEnvironment typeEnvironment,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
     checkBoundsInType(node.typeArgument, typeEnvironment, node.fileOffset,
         inferred: inferred, allowSuperBounded: true);
   }
 
   void checkBoundsInMapLiteral(MapLiteral node, TypeEnvironment typeEnvironment,
       {bool inferred = false}) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
     checkBoundsInType(node.keyType, typeEnvironment, node.fileOffset,
         inferred: inferred, allowSuperBounded: true);
     checkBoundsInType(node.valueType, typeEnvironment, node.fileOffset,
@@ -1597,252 +1582,110 @@
 
   void checkBoundsInType(
       DartType type, TypeEnvironment typeEnvironment, int offset,
-      {bool inferred = false, bool allowSuperBounded = true}) {
-    if (!loader.target.strongMode) return;
-    List<Object> violations = typeEnvironment.findBoundViolations(type,
-        allowSuperBounded: allowSuperBounded,
-        typedefInstantiations: typedefInstantiations);
-    if (violations != null) {
-      for (int i = 0; i < violations.length; i += 3) {
-        DartType argument = violations[i];
-        TypeParameter variable = violations[i + 1];
-        DartType enclosingType = violations[i + 2];
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          variable = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, typeEnvironment.getGenericTypeName(enclosingType));
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, typeEnvironment.getGenericTypeName(enclosingType));
-          }
-        }
-
-        reportBoundViolation(message, offset, variable);
-      }
+      {bool inferred, bool allowSuperBounded = true}) {
+    if (loader.target.legacyMode) return;
+    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+        type, typeEnvironment,
+        allowSuperBounded: allowSuperBounded);
+    if (issues != null) {
+      reportTypeArgumentIssues(issues, offset, inferred: inferred);
     }
   }
 
   void checkBoundsInVariableDeclaration(
       VariableDeclaration node, TypeEnvironment typeEnvironment,
       {bool inferred = false}) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
     if (node.type == null) return;
-    List<Object> violations = typeEnvironment.findBoundViolations(node.type,
-        allowSuperBounded: true, typedefInstantiations: typedefInstantiations);
-    if (violations != null) {
-      for (int i = 0; i < violations.length; i += 3) {
-        DartType argument = violations[i];
-        TypeParameter variable = violations[i + 1];
-        DartType enclosingType = violations[i + 2];
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          variable = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, typeEnvironment.getGenericTypeName(enclosingType));
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, typeEnvironment.getGenericTypeName(enclosingType));
-          }
-        }
-
-        reportBoundViolation(message, node.fileOffset, variable);
-      }
-    }
+    checkBoundsInType(node.type, typeEnvironment, node.fileOffset,
+        inferred: inferred, allowSuperBounded: true);
   }
 
   void checkBoundsInConstructorInvocation(
       ConstructorInvocation node, TypeEnvironment typeEnvironment,
       {bool inferred = false}) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
     if (node.arguments.types.isEmpty) return;
     Constructor constructor = node.target;
     Class klass = constructor.enclosingClass;
     DartType constructedType = new InterfaceType(klass, node.arguments.types);
-    List<Object> violations = typeEnvironment.findBoundViolations(
-        constructedType,
-        allowSuperBounded: false,
-        typedefInstantiations: typedefInstantiations);
-    if (violations != null) {
-      String constructedTypeName = "${klass.name}::${constructor.name.name}";
-      for (int i = 0; i < violations.length; i += 3) {
-        DartType argument = violations[i];
-        TypeParameter variable = violations[i + 1];
-        DartType enclosingType = violations[i + 2];
-        String enclosingName = enclosingType == constructedType
-            ? constructedTypeName
-            : typeEnvironment.getGenericTypeName(enclosingType);
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          variable = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, enclosingName);
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, enclosingName);
-          }
-        }
-
-        reportBoundViolation(message, node.fileOffset, variable);
-      }
-    }
+    checkBoundsInType(constructedType, typeEnvironment, node.fileOffset,
+        inferred: inferred, allowSuperBounded: false);
   }
 
   void checkBoundsInFactoryInvocation(
       StaticInvocation node, TypeEnvironment typeEnvironment,
       {bool inferred = false}) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
     if (node.arguments.types.isEmpty) return;
     Procedure factory = node.target;
     assert(factory.isFactory);
     Class klass = factory.enclosingClass;
     DartType constructedType = new InterfaceType(klass, node.arguments.types);
-    List<Object> violations = typeEnvironment.findBoundViolations(
-        constructedType,
-        allowSuperBounded: false,
-        typedefInstantiations: typedefInstantiations);
-    if (violations != null) {
-      String constructedTypeName = "${klass.name}::${factory.name.name}";
-      for (int i = 0; i < violations.length; i += 3) {
-        DartType argument = violations[i];
-        TypeParameter variable = violations[i + 1];
-        DartType enclosingType = violations[i + 2];
-        String enclosingName = enclosingType == constructedType
-            ? constructedTypeName
-            : typeEnvironment.getGenericTypeName(enclosingType);
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          variable = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, enclosingName);
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, enclosingName);
-          }
-        }
-
-        reportBoundViolation(message, node.fileOffset, variable);
-      }
-    }
+    checkBoundsInType(constructedType, typeEnvironment, node.fileOffset,
+        inferred: inferred, allowSuperBounded: false);
   }
 
   void checkBoundsInStaticInvocation(
       StaticInvocation node, TypeEnvironment typeEnvironment,
       {bool inferred = false}) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
     if (node.arguments.types.isEmpty) return;
     Class klass = node.target.enclosingClass;
     List<TypeParameter> parameters = node.target.function.typeParameters;
     List<DartType> arguments = node.arguments.types;
     // The following error is to be reported elsewhere.
     if (parameters.length != arguments.length) return;
-    List<Object> violations = typeEnvironment.findBoundViolationsElementwise(
-        parameters, arguments,
-        typedefInstantiations: typedefInstantiations);
-    if (violations != null) {
-      String targetName;
-      if (klass == null) {
-        targetName = "${node.target.name.name}";
-      } else {
-        targetName = "${klass.name}::${node.target.name.name}";
+    List<TypeArgumentIssue> issues = findTypeArgumentIssuesForInvocation(
+        parameters, arguments, typeEnvironment);
+    if (issues != null) {
+      DartType targetReceiver;
+      if (klass != null) {
+        targetReceiver = new InterfaceType(klass);
       }
-      for (int i = 0; i < violations.length; i += 3) {
-        DartType argument = violations[i];
-        TypeParameter variable = violations[i + 1];
-        DartType enclosingType = violations[i + 2];
-        String enclosingName = enclosingType == null
-            ? targetName
-            : typeEnvironment.getGenericTypeName(enclosingType);
-
-        Message message;
-        if (argument is FunctionType) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          variable = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, enclosingName);
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, enclosingName);
-          }
-        }
-
-        reportBoundViolation(message, node.fileOffset, variable);
-      }
+      String targetName = node.target.name.name;
+      reportTypeArgumentIssues(issues, node.fileOffset,
+          inferred: inferred,
+          targetReceiver: targetReceiver,
+          targetName: targetName);
     }
   }
 
   void checkBoundsInMethodInvocation(
       DartType receiverType,
       TypeEnvironment typeEnvironment,
+      ClassHierarchy hierarchy,
       TypeInferrerImpl typeInferrer,
       Name name,
       Member interfaceTarget,
       Arguments arguments,
       int offset,
       {bool inferred = false}) {
-    if (!loader.target.strongMode) return;
+    if (loader.target.legacyMode) return;
     if (arguments.types.isEmpty) return;
     Class klass;
-    List<DartType> klassArguments;
+    List<DartType> receiverTypeArguments;
     if (receiverType is InterfaceType) {
       klass = receiverType.classNode;
-      klassArguments = receiverType.typeArguments;
+      receiverTypeArguments = receiverType.typeArguments;
     } else {
       return;
     }
-    Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
-    for (int i = 0; i < klassArguments.length; ++i) {
-      substitutionMap[klass.typeParameters[i]] = klassArguments[i];
-    }
     // TODO(dmitryas): Find a better way than relying on [interfaceTarget].
-    Member method = typeEnvironment.hierarchy.getDispatchTarget(klass, name) ??
-        interfaceTarget;
+    Member method = hierarchy.getDispatchTarget(klass, name) ?? interfaceTarget;
     if (method == null || method is! Procedure) {
       return;
     }
+    if (klass != method.enclosingClass) {
+      Supertype parent =
+          hierarchy.getClassAsInstanceOf(klass, method.enclosingClass);
+      klass = method.enclosingClass;
+      receiverTypeArguments = parent.typeArguments;
+    }
+    Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
+    for (int i = 0; i < receiverTypeArguments.length; ++i) {
+      substitutionMap[klass.typeParameters[i]] = receiverTypeArguments[i];
+    }
     List<TypeParameter> methodParameters = method.function.typeParameters;
     // The error is to be reported elsewhere.
     if (methodParameters.length != arguments.types.length) return;
@@ -1858,54 +1701,21 @@
       instantiatedMethodParameters[i].bound =
           substitute(methodParameters[i].bound, substitutionMap);
     }
-    List<Object> violations = typeEnvironment.findBoundViolationsElementwise(
-        instantiatedMethodParameters, arguments.types,
-        typedefInstantiations: typedefInstantiations);
-    if (violations != null) {
-      String targetName = "${klass.name}";
-      if (klassArguments.length > 0) {
-        targetName += "<${klassArguments[0]}";
-        for (int i = 1; i < klassArguments.length; ++i) {
-          targetName += ", ${klassArguments[i]}";
-        }
-        targetName += ">";
-      }
-      targetName += "::${name.name}";
-      for (int i = 0; i < violations.length; i += 3) {
-        DartType argument = violations[i];
-        TypeParameter variable = violations[i + 1];
-        DartType enclosingType = violations[i + 2];
-        String enclosingName = enclosingType == null
-            ? targetName
-            : typeEnvironment.getGenericTypeName(enclosingType);
-
-        Message message;
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          variable = null;
-        } else {
-          if (inferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument, enclosingName);
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument, enclosingName);
-          }
-        }
-
-        reportBoundViolation(message, offset, variable);
-      }
+    List<TypeArgumentIssue> issues = findTypeArgumentIssuesForInvocation(
+        instantiatedMethodParameters, arguments.types, typeEnvironment);
+    if (issues != null) {
+      reportTypeArgumentIssues(issues, offset,
+          inferred: inferred,
+          targetReceiver: receiverType,
+          targetName: name.name);
     }
   }
 
   void checkBoundsInOutline(TypeEnvironment typeEnvironment) {
-    if (!loader.target.strongMode) return;
-    forEach((String name, Declaration declaration) {
+    if (loader.target.legacyMode) return;
+    Iterator<Declaration> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      Declaration declaration = iterator.current;
       if (declaration is KernelFieldBuilder) {
         checkBoundsInField(declaration.target, typeEnvironment);
       } else if (declaration is KernelProcedureBuilder) {
@@ -1913,11 +1723,20 @@
       } else if (declaration is KernelClassBuilder) {
         declaration.checkBoundsInOutline(typeEnvironment);
       }
-    });
-
-    typedefInstantiations.clear();
+    }
     inferredTypes.clear();
   }
+
+  @override
+  int finalizeInitializingFormals() {
+    if (!legacyMode || untypedInitializingFormals == null) return 0;
+    for (int i = 0; i < untypedInitializingFormals.length; i++) {
+      untypedInitializingFormals[i].finalizeInitializingFormal();
+    }
+    int count = untypedInitializingFormals.length;
+    untypedInitializingFormals = null;
+    return count;
+  }
 }
 
 Uri computeLibraryUri(Declaration declaration) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index aa98c01..9dec3ab 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -308,6 +308,7 @@
   }
 
   bool get isEligibleForTopLevelInference {
+    if (library.legacyMode) return false;
     if (isInstanceMember) {
       if (returnType == null) return true;
       if (formals != null) {
@@ -332,7 +333,7 @@
       procedure.isConst = isConst;
       procedure.name = new Name(name, library.target);
     }
-    if (library.loader.target.strongMode &&
+    if (!library.loader.target.legacyMode &&
         (isSetter || (isOperator && name == '[]=')) &&
         returnType == null) {
       procedure.function.returnType = const VoidType();
@@ -451,9 +452,10 @@
   }
 
   bool get isEligibleForTopLevelInference {
+    if (library.legacyMode) return false;
     if (formals != null) {
       for (var formal in formals) {
-        if (formal.type == null && formal.hasThis) return true;
+        if (formal.type == null && formal.isInitializingFormal) return true;
       }
     }
     return false;
@@ -470,9 +472,9 @@
       constructor.isExternal = isExternal;
       constructor.name = new Name(name, library.target);
     }
-    if (!library.disableTypeInference && isEligibleForTopLevelInference) {
+    if (isEligibleForTopLevelInference) {
       for (KernelFormalParameterBuilder formal in formals) {
-        if (formal.type == null && formal.hasThis) {
+        if (formal.type == null && formal.isInitializingFormal) {
           formal.declaration.type = null;
         }
       }
@@ -505,7 +507,8 @@
     assert(lastInitializer == superInitializer ||
         lastInitializer == redirectingInitializer);
     Initializer error = helper.buildInvalidInitializer(
-        helper.buildProblem(message, charOffset, noLength).desugared,
+        helper.desugarSyntheticExpression(
+            helper.buildProblem(message, charOffset, noLength)),
         charOffset);
     initializers.add(error..parent = constructor);
     initializers.add(lastInitializer);
@@ -529,10 +532,8 @@
       } else if (constructor.initializers.isNotEmpty) {
         Initializer first = constructor.initializers.first;
         Initializer error = helper.buildInvalidInitializer(
-            helper
-                .buildProblem(
-                    messageThisInitializerNotAlone, first.fileOffset, noLength)
-                .desugared,
+            helper.desugarSyntheticExpression(helper.buildProblem(
+                messageThisInitializerNotAlone, first.fileOffset, noLength)),
             first.fileOffset);
         initializers.add(error..parent = constructor);
       } else {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 80afd41..21ca7db 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -24,8 +24,6 @@
 
 import 'package:kernel/ast.dart';
 
-import 'package:kernel/clone.dart' show CloneVisitor;
-
 import 'package:kernel/type_algebra.dart' show Substitution;
 
 import '../../base/instrumentation.dart'
@@ -56,18 +54,10 @@
 import '../type_inference/interface_resolver.dart' show InterfaceResolver;
 
 import '../type_inference/type_inference_engine.dart'
-    show
-        FieldInitializerInferenceNode,
-        IncludesTypeParametersCovariantly,
-        InferenceNode,
-        TypeInferenceEngine;
+    show IncludesTypeParametersCovariantly, InferenceNode, TypeInferenceEngine;
 
 import '../type_inference/type_inferrer.dart'
-    show
-        ExpressionInferenceResult,
-        TypeInferrer,
-        TypeInferrerDisabled,
-        TypeInferrerImpl;
+    show ExpressionInferenceResult, TypeInferrer, TypeInferrerImpl;
 
 import '../type_inference/type_promotion.dart'
     show TypePromoter, TypePromoterImpl, TypePromotionFact, TypePromotionScope;
@@ -81,6 +71,8 @@
 
 import 'body_builder.dart' show combineStatements;
 
+import 'implicit_type_argument.dart' show ImplicitTypeArgument;
+
 import 'kernel_builder.dart' show KernelLibraryBuilder;
 
 import 'kernel_expression_generator.dart' show makeLet;
@@ -195,30 +187,6 @@
   }
 }
 
-/// Concrete shadow object representing a break statement in kernel form.
-class BreakJudgment extends BreakStatement implements StatementJudgment {
-  BreakJudgment(LabeledStatement target) : super(target);
-
-  LabeledStatementJudgment get targetJudgment => target;
-
-  @override
-  void acceptInference(InferenceVistor visitor) {
-    return visitor.visitBreakJudgment(this);
-  }
-}
-
-/// Concrete shadow object representing a continue statement in kernel form.
-class ContinueJudgment extends BreakStatement implements StatementJudgment {
-  ContinueJudgment(LabeledStatement target) : super(target);
-
-  LabeledStatementJudgment get targetJudgment => target;
-
-  @override
-  void acceptInference(InferenceVistor visitor) {
-    return visitor.visitContinueJudgment(this);
-  }
-}
-
 /// Concrete shadow object representing a cascade expression.
 ///
 /// A cascade expression of the form `a..b()..c()` is represented as the kernel
@@ -387,7 +355,7 @@
   /// pre-decrement.
   bool isPreIncDec = false;
 
-  ComplexAssignmentJudgment(this.rhs) : super(null);
+  ComplexAssignmentJudgment._(this.rhs) : super._(null);
 
   String toString() {
     var parts = _getToStringParts();
@@ -409,9 +377,6 @@
     return parts;
   }
 
-  DartType _getWriteType(ShadowTypeInferrer inferrer) => unhandled(
-      '$runtimeType', 'ShadowComplexAssignment._getWriteType', -1, null);
-
   _ComplexAssignmentInferenceResult _inferRhs(
       ShadowTypeInferrer inferrer, DartType readType, DartType writeContext) {
     assert(writeContext != null);
@@ -491,9 +456,7 @@
             ? rhsType
             : inferrer.typeSchemaEnvironment
                 .getStandardUpperBound(readType, rhsType);
-        if (inferrer.strongMode) {
-          nullAwareCombiner.staticType = combinedType;
-        }
+        nullAwareCombiner.staticType = combinedType;
       } else {
         combinedType = rhsType;
       }
@@ -519,9 +482,9 @@
   /// Indicates whether this assignment uses `super`.
   final bool isSuper;
 
-  ComplexAssignmentJudgmentWithReceiver(
+  ComplexAssignmentJudgmentWithReceiver._(
       this.receiver, Expression rhs, this.isSuper)
-      : super(rhs);
+      : super._(rhs);
 
   @override
   List<String> _getToStringParts() {
@@ -579,8 +542,6 @@
 class DoJudgment extends DoStatement implements StatementJudgment {
   DoJudgment(Statement body, Expression condition) : super(body, condition);
 
-  StatementJudgment get bodyJudgment => body;
-
   Expression get conditionJudgment => condition;
 
   @override
@@ -672,9 +633,6 @@
     type = inferredType;
   }
 
-  static bool hasTypeInferredFromInitializer(ShadowField field) =>
-      field.inferenceNode is FieldInitializerInferenceNode;
-
   static bool isImplicitlyTyped(ShadowField field) => field._isImplicitlyTyped;
 
   static void setInferenceNode(ShadowField field, InferenceNode node) {
@@ -694,45 +652,16 @@
   }
 }
 
-/// Concrete shadow object representing a for-in loop in kernel form.
-class ForInJudgment extends ForInStatement implements StatementJudgment {
-  final bool _declaresVariable;
-
-  final SyntheticExpressionJudgment _syntheticAssignment;
-
-  ForInJudgment(VariableDeclaration variable, Expression iterable,
-      Statement body, this._declaresVariable, this._syntheticAssignment,
-      {bool isAsync: false})
-      : super(variable, iterable, body, isAsync: isAsync);
-
-  VariableDeclarationJudgment get variableJudgment => variable;
-
-  Expression get iterableJudgment => iterable;
-
-  StatementJudgment get bodyJudgment => body;
-
-  @override
-  void acceptInference(InferenceVistor visitor) {
-    return visitor.visitForInJudgment(this);
-  }
-}
-
 /// Concrete shadow object representing a classic for loop in kernel form.
 class ForJudgment extends ForStatement implements StatementJudgment {
-  final List<Expression> initializers;
-
-  ForJudgment(List<VariableDeclaration> variables, this.initializers,
-      Expression condition, List<Expression> updates, Statement body)
+  ForJudgment(List<VariableDeclaration> variables, Expression condition,
+      List<Expression> updates, Statement body)
       : super(variables ?? [], condition, updates, body);
 
-  List<VariableDeclarationJudgment> get variableJudgments => variables.cast();
-
   Expression get conditionJudgment => condition;
 
   List<Expression> get updateJudgments => updates.cast();
 
-  StatementJudgment get bodyJudgment => body;
-
   @override
   void acceptInference(InferenceVistor visitor) {
     return visitor.visitForJudgment(this);
@@ -834,10 +763,6 @@
 
   Expression get conditionJudgment => condition;
 
-  StatementJudgment get thenJudgment => then;
-
-  StatementJudgment get otherwiseJudgment => otherwise;
-
   @override
   void acceptInference(InferenceVistor visitor) {
     return visitor.visitIfJudgment(this);
@@ -851,17 +776,12 @@
   /// If `-1`, then there is no separate location for invalid assignment.
   final int assignmentOffset;
 
-  IllegalAssignmentJudgment(Expression rhs, {this.assignmentOffset: -1})
-      : super(rhs) {
+  IllegalAssignmentJudgment._(Expression rhs, {this.assignmentOffset: -1})
+      : super._(rhs) {
     rhs.parent = this;
   }
 
   @override
-  DartType _getWriteType(ShadowTypeInferrer inferrer) {
-    return const UnknownType();
-  }
-
-  @override
   void acceptInference(InferenceVistor visitor, DartType typeContext) {
     return visitor.visitIllegalAssignmentJudgment(this, typeContext);
   }
@@ -873,9 +793,9 @@
   /// In an assignment to an index expression, the index expression.
   final Expression index;
 
-  IndexAssignmentJudgment(Expression receiver, this.index, Expression rhs,
+  IndexAssignmentJudgment._(Expression receiver, this.index, Expression rhs,
       {bool isSuper: false})
-      : super(receiver, rhs, isSuper);
+      : super._(receiver, rhs, isSuper);
 
   Arguments _getInvocationArguments(
       ShadowTypeInferrer inferrer, Expression invocation) {
@@ -924,13 +844,12 @@
       ? '0x${asDouble.toRadixString(16)}'
       : asDouble.toString();
   int length = literal?.length ?? noLength;
-  return inferrer.helper
+  return inferrer.helper.desugarSyntheticExpression(inferrer.helper
       .buildProblem(
           templateWebLiteralCannotBeRepresentedExactly.withArguments(
               text, nearest),
           charOffset,
-          length)
-      .desugared;
+          length));
 }
 
 /// Concrete shadow object representing an integer literal in kernel form.
@@ -1014,33 +933,14 @@
   }
 }
 
-/// Concrete shadow object representing a labeled statement in kernel form.
-class LabeledStatementJudgment extends LabeledStatement
-    implements StatementJudgment {
-  LabeledStatementJudgment(Statement body) : super(body);
-
-  StatementJudgment get judgment => body;
-
-  @override
-  void acceptInference(InferenceVistor visitor) {
-    return visitor.visitLabeledStatementJudgment(this);
-  }
-}
-
-/// Type inference derivation for [LiteralList].
+/// Type inference derivation for [ListLiteral].
 class ListLiteralJudgment extends ListLiteral implements ExpressionJudgment {
   DartType inferredType;
 
-  List<Expression> get judgments => expressions;
-
-  final DartType _declaredTypeArgument;
-
   ListLiteralJudgment(List<Expression> expressions,
       {DartType typeArgument, bool isConst: false})
-      : _declaredTypeArgument = typeArgument,
-        super(expressions,
-            typeArgument: typeArgument ?? const DynamicType(),
-            isConst: isConst);
+      : assert(typeArgument != null),
+        super(expressions, typeArgument: typeArgument, isConst: isConst);
 
   @override
   void acceptInference(InferenceVistor visitor, DartType typeContext) {
@@ -1048,37 +948,31 @@
   }
 }
 
-/// Type inference derivation for [MapEntry].
-///
-/// This derivation is needed for uniformity.
-class MapEntryJudgment extends MapEntry {
-  DartType inferredKeyType;
-  DartType inferredValueType;
+/// Type inference derivation for [SetLiteral].
+class SetLiteralJudgment extends SetLiteral implements ExpressionJudgment {
+  DartType inferredType;
 
-  Expression get keyJudgment => key;
+  SetLiteralJudgment(List<Expression> expressions,
+      {DartType typeArgument, bool isConst: false})
+      : assert(typeArgument != null),
+        super(expressions, typeArgument: typeArgument, isConst: isConst);
 
-  Expression get valueJudgment => value;
-
-  MapEntryJudgment(Expression key, Expression value) : super(key, value);
+  @override
+  void acceptInference(InferenceVistor visitor, DartType typeContext) {
+    return visitor.visitSetLiteralJudgment(this, typeContext);
+  }
 }
 
 /// Type inference derivation for [MapLiteral].
 class MapLiteralJudgment extends MapLiteral implements ExpressionJudgment {
   DartType inferredType;
 
-  List<MapEntry> get judgments => entries;
-
-  final DartType _declaredKeyType;
-  final DartType _declaredValueType;
-
   MapLiteralJudgment(List<MapEntry> judgments,
       {DartType keyType, DartType valueType, bool isConst: false})
-      : _declaredKeyType = keyType,
-        _declaredValueType = valueType,
+      : assert(keyType != null),
+        assert(valueType != null),
         super(judgments,
-            keyType: keyType ?? const DynamicType(),
-            valueType: valueType ?? const DynamicType(),
-            isConst: isConst);
+            keyType: keyType, valueType: valueType, isConst: isConst);
 
   @override
   void acceptInference(InferenceVistor visitor, DartType typeContext) {
@@ -1242,9 +1136,9 @@
   /// expression that guards the access; otherwise `null`.
   ConditionalExpression nullAwareGuard;
 
-  PropertyAssignmentJudgment(Expression receiver, Expression rhs,
+  PropertyAssignmentJudgment._(Expression receiver, Expression rhs,
       {bool isSuper: false})
-      : super(receiver, rhs, isSuper);
+      : super._(receiver, rhs, isSuper);
 
   @override
   List<String> _getToStringParts() {
@@ -1253,14 +1147,6 @@
     return parts;
   }
 
-  @override
-  DartType _getWriteType(ShadowTypeInferrer inferrer) {
-    assert(receiver == null);
-    var receiverType = inferrer.thisType;
-    var writeMember = inferrer.findPropertySetMember(receiverType, write);
-    return inferrer.getSetterType(writeMember, receiverType);
-  }
-
   Object _handleWriteContravariance(
       ShadowTypeInferrer inferrer, DartType receiverType) {
     return inferrer.findPropertySetMember(receiverType, write);
@@ -1313,13 +1199,7 @@
 
 /// Concrete shadow object representing an assignment to a static variable.
 class StaticAssignmentJudgment extends ComplexAssignmentJudgment {
-  StaticAssignmentJudgment(Expression rhs) : super(rhs);
-
-  @override
-  DartType _getWriteType(ShadowTypeInferrer inferrer) {
-    StaticSet write = this.write;
-    return write.target.setterType;
-  }
+  StaticAssignmentJudgment._(Expression rhs) : super._(rhs);
 
   @override
   void acceptInference(InferenceVistor visitor, DartType typeContext) {
@@ -1384,8 +1264,6 @@
   SwitchCaseJudgment.empty() : super.empty();
 
   List<Expression> get expressionJudgments => expressions.cast();
-
-  StatementJudgment get bodyJudgment => body;
 }
 
 /// Concrete shadow object representing a switch statement in kernel form.
@@ -1425,9 +1303,9 @@
   final Member constructor;
   final Arguments arguments;
 
-  InvalidConstructorInvocationJudgment(
+  InvalidConstructorInvocationJudgment._(
       kernel.Expression desugared, this.constructor, this.arguments)
-      : super(desugared);
+      : super._(desugared);
 
   ArgumentsJudgment get argumentJudgments => arguments;
 
@@ -1442,8 +1320,8 @@
 class InvalidWriteJudgment extends SyntheticExpressionJudgment {
   final Expression expression;
 
-  InvalidWriteJudgment(kernel.Expression desugared, this.expression)
-      : super(desugared);
+  InvalidWriteJudgment._(kernel.Expression desugared, this.expression)
+      : super._(desugared);
 
   @override
   void acceptInference(InferenceVistor visitor, DartType typeContext) {
@@ -1459,7 +1337,7 @@
 class SyntheticExpressionJudgment extends Let implements ExpressionJudgment {
   DartType inferredType;
 
-  SyntheticExpressionJudgment(Expression desugared)
+  SyntheticExpressionJudgment._(Expression desugared)
       : super(new VariableDeclaration('_', initializer: new NullLiteral()),
             desugared);
 
@@ -1487,7 +1365,6 @@
   /// fact that [expression] has the given [type].
   void _storeLetType(
       TypeInferrerImpl inferrer, Expression expression, DartType type) {
-    if (!inferrer.strongMode) return;
     Expression desugared = this.desugared;
     while (true) {
       if (desugared is Let) {
@@ -1524,16 +1401,12 @@
   VariableDeclarationJudgment get exceptionJudgment => exception;
 
   VariableDeclarationJudgment get stackTraceJudgment => stackTrace;
-
-  StatementJudgment get bodyJudgment => body;
 }
 
 /// Concrete shadow object representing a try-catch block in kernel form.
 class TryCatchJudgment extends TryCatch implements StatementJudgment {
   TryCatchJudgment(Statement body, List<Catch> catches) : super(body, catches);
 
-  StatementJudgment get bodyJudgment => body;
-
   List<CatchJudgment> get catchJudgments => catches.cast();
 
   @override
@@ -1544,15 +1417,9 @@
 
 /// Concrete shadow object representing a try-finally block in kernel form.
 class TryFinallyJudgment extends TryFinally implements StatementJudgment {
-  final List<Catch> catches;
-
-  TryFinallyJudgment(Statement body, this.catches, Statement finalizer)
+  TryFinallyJudgment(Statement body, Statement finalizer)
       : super(body, finalizer);
 
-  List<CatchJudgment> get catchJudgments => catches?.cast();
-
-  StatementJudgment get finalizerJudgment => finalizer;
-
   @override
   void acceptInference(InferenceVistor visitor) {
     return visitor.visitTryFinallyJudgment(this);
@@ -1562,24 +1429,20 @@
 /// Concrete implementation of [TypeInferenceEngine] specialized to work with
 /// kernel objects.
 class ShadowTypeInferenceEngine extends TypeInferenceEngine {
-  ShadowTypeInferenceEngine(Instrumentation instrumentation, bool strongMode)
-      : super(instrumentation, strongMode);
-
-  @override
-  TypeInferrer createDisabledTypeInferrer() =>
-      new TypeInferrerDisabled(typeSchemaEnvironment);
+  ShadowTypeInferenceEngine(Instrumentation instrumentation)
+      : super(instrumentation);
 
   @override
   ShadowTypeInferrer createLocalTypeInferrer(
       Uri uri, InterfaceType thisType, KernelLibraryBuilder library) {
-    return new ShadowTypeInferrer._(this, uri, false, thisType, library);
+    return new TypeInferrer(this, uri, false, thisType, library);
   }
 
   @override
   ShadowTypeInferrer createTopLevelTypeInferrer(
       InterfaceType thisType, ShadowField field, KernelLibraryBuilder library) {
     return field._typeInferrer =
-        new ShadowTypeInferrer._(this, field.fileUri, true, thisType, library);
+        new TypeInferrer(this, field.fileUri, true, thisType, library);
   }
 
   @override
@@ -1594,10 +1457,10 @@
   @override
   final typePromoter;
 
-  ShadowTypeInferrer._(ShadowTypeInferenceEngine engine, Uri uri, bool topLevel,
-      InterfaceType thisType, KernelLibraryBuilder library)
-      : typePromoter = new ShadowTypePromoter(engine.typeSchemaEnvironment),
-        super(engine, uri, topLevel, thisType, library);
+  ShadowTypeInferrer.private(ShadowTypeInferenceEngine engine, Uri uri,
+      bool topLevel, InterfaceType thisType, KernelLibraryBuilder library)
+      : typePromoter = new TypePromoter(engine.typeSchemaEnvironment),
+        super.private(engine, uri, topLevel, thisType, library);
 
   @override
   Expression getFieldInitializer(ShadowField field) {
@@ -1677,6 +1540,12 @@
       // so that the type hierarchy will be simpler (which may speed up "is"
       // checks).
       return statement.acceptInference(new InferenceVistor(this));
+    } else if (statement is ForInStatement) {
+      return statement.accept1(new InferenceVistor(this), null);
+    } else if (statement is LabeledStatement) {
+      return statement.accept1(new InferenceVistor(this), null);
+    } else if (statement is BreakStatement) {
+      return statement.accept1(new InferenceVistor(this), null);
     } else {
       // Encountered a statement type for which type inference is not yet
       // implemented, so just skip it for now.
@@ -1700,8 +1569,8 @@
 /// Concrete implementation of [TypePromoter] specialized to work with kernel
 /// objects.
 class ShadowTypePromoter extends TypePromoterImpl {
-  ShadowTypePromoter(TypeSchemaEnvironment typeSchemaEnvironment)
-      : super(typeSchemaEnvironment);
+  ShadowTypePromoter.private(TypeSchemaEnvironment typeSchemaEnvironment)
+      : super.private(typeSchemaEnvironment);
 
   @override
   int getVariableFunctionNestingLevel(VariableDeclaration variable) {
@@ -1767,13 +1636,7 @@
 }
 
 class VariableAssignmentJudgment extends ComplexAssignmentJudgment {
-  VariableAssignmentJudgment(Expression rhs) : super(rhs);
-
-  @override
-  DartType _getWriteType(ShadowTypeInferrer inferrer) {
-    VariableSet write = this.write;
-    return write.variable.type;
-  }
+  VariableAssignmentJudgment._(Expression rhs) : super._(rhs);
 
   @override
   void acceptInference(InferenceVistor visitor, DartType typeContext) {
@@ -1804,12 +1667,6 @@
   // TODO(ahe): Investigate if this can be removed.
   final bool _isLocalFunction;
 
-  /// The same [annotations] list is used for all [VariableDeclarationJudgment]s
-  /// of a variable declaration statement. But we need to perform inference
-  /// only once. So, we set this flag to `false` for the second and subsequent
-  /// judgments.
-  bool infersAnnotations = true;
-
   VariableDeclarationJudgment(String name, this._functionNestingLevel,
       {this.forSyntheticToken: false,
       Expression initializer,
@@ -1843,8 +1700,6 @@
         _isLocalFunction = false,
         super.forValue(initializer);
 
-  List<Expression> get annotationJudgments => annotations;
-
   Expression get initializerJudgment => initializer;
 
   @override
@@ -1874,9 +1729,9 @@
 class UnresolvedTargetInvocationJudgment extends SyntheticExpressionJudgment {
   final ArgumentsJudgment argumentsJudgment;
 
-  UnresolvedTargetInvocationJudgment(
+  UnresolvedTargetInvocationJudgment._(
       kernel.Expression desugared, this.argumentsJudgment)
-      : super(desugared);
+      : super._(desugared);
 
   @override
   void acceptInference(InferenceVistor visitor, DartType typeContext) {
@@ -1890,9 +1745,9 @@
   final bool isCompound;
   final Expression rhs;
 
-  UnresolvedVariableAssignmentJudgment(
+  UnresolvedVariableAssignmentJudgment._(
       kernel.Expression desugared, this.isCompound, this.rhs)
-      : super(desugared);
+      : super._(desugared);
 
   @override
   void acceptInference(InferenceVistor visitor, DartType typeContext) {
@@ -1923,8 +1778,6 @@
 
   Expression get conditionJudgment => condition;
 
-  StatementJudgment get bodyJudgment => body;
-
   @override
   void acceptInference(InferenceVistor visitor) {
     return visitor.visitWhileJudgment(this);
@@ -1995,3 +1848,64 @@
 
   visitChildren(v) => unsupported("visitChildren", -1, null);
 }
+
+class SyntheticWrapper {
+  static Expression wrapIllegalAssignment(Expression rhs,
+      {int assignmentOffset: -1}) {
+    return new IllegalAssignmentJudgment._(rhs,
+        assignmentOffset: assignmentOffset)
+      ..fileOffset = rhs.fileOffset;
+  }
+
+  static Expression wrapIndexAssignment(
+      Expression receiver, Expression index, Expression rhs,
+      {bool isSuper: false}) {
+    return new IndexAssignmentJudgment._(receiver, index, rhs, isSuper: isSuper)
+      ..fileOffset = index.fileOffset;
+  }
+
+  static Expression wrapInvalidConstructorInvocation(
+      kernel.Expression desugared, Member constructor, Arguments arguments) {
+    return new InvalidConstructorInvocationJudgment._(
+        desugared, constructor, arguments)
+      ..fileOffset = desugared.fileOffset;
+  }
+
+  static Expression wrapInvalidWrite(
+      Expression desugared, Expression expression) {
+    return new InvalidWriteJudgment._(desugared, expression)
+      ..fileOffset = desugared.fileOffset;
+  }
+
+  static Expression wrapPropertyAssignment(Expression receiver, Expression rhs,
+      {bool isSuper: false}) {
+    return new PropertyAssignmentJudgment._(receiver, rhs, isSuper: isSuper)
+      ..fileOffset = rhs.fileOffset;
+  }
+
+  static Expression wrapStaticAssignment(Expression rhs) {
+    return new StaticAssignmentJudgment._(rhs)..fileOffset = rhs.fileOffset;
+  }
+
+  static Expression wrapSyntheticExpression(Expression desugared) {
+    return new SyntheticExpressionJudgment._(desugared)
+      ..fileOffset = desugared.fileOffset;
+  }
+
+  static Expression wrapUnresolvedTargetInvocation(
+      Expression desugared, Arguments arguments) {
+    return new UnresolvedTargetInvocationJudgment._(desugared, arguments)
+      ..fileOffset = desugared.fileOffset;
+  }
+
+  static Expression wrapUnresolvedVariableAssignment(
+      Expression desugared, bool isCompound, Expression rhs) {
+    return new UnresolvedVariableAssignmentJudgment._(
+        desugared, isCompound, rhs)
+      ..fileOffset = desugared.fileOffset;
+  }
+
+  static Expression wrapVariableAssignment(Expression rhs) {
+    return new VariableAssignmentJudgment._(rhs)..fileOffset = rhs.fileOffset;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 8354ddb..75f57a8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -41,6 +41,11 @@
 
 import 'package:kernel/type_algebra.dart' show substitute;
 
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
+import 'package:kernel/transformations/constants.dart' as constants
+    show SimpleErrorReporter, transformLibraries;
+
 import '../../api_prototype/file_system.dart' show FileSystem;
 
 import '../compiler_context.dart' show CompilerContext;
@@ -64,7 +69,7 @@
         templateMissingImplementationCause,
         templateSuperclassHasNoDefaultConstructor;
 
-import '../problems.dart' show unhandled;
+import '../problems.dart' show unhandled, unimplemented;
 
 import '../severity.dart' show Severity;
 
@@ -93,6 +98,8 @@
         TypeBuilder,
         TypeDeclarationBuilder;
 
+import 'kernel_constants.dart' show KernelConstantsBackend;
+
 import 'metadata_collector.dart' show MetadataCollector;
 
 import 'verifier.dart' show verifyComponent;
@@ -123,9 +130,7 @@
 
   final TypeBuilder bottomType = new KernelNamedTypeBuilder("Null", null);
 
-  bool get strongMode => !backendTarget.legacyMode;
-
-  bool get disableTypeInference => backendTarget.disableTypeInference;
+  bool get legacyMode => backendTarget.legacyMode;
 
   final bool excludeSource = !CompilerContext.current.options.embedSourceText;
 
@@ -133,9 +138,9 @@
 
   KernelTarget(this.fileSystem, this.includeComments, DillTarget dillTarget,
       UriTranslator uriTranslator,
-      {Map<Uri, Source> uriToSource, MetadataCollector metadataCollector})
+      {MetadataCollector metadataCollector})
       : dillTarget = dillTarget,
-        uriToSource = uriToSource ?? CompilerContext.current.uriToSource,
+        uriToSource = CompilerContext.current.uriToSource,
         metadataCollector = metadataCollector,
         super(dillTarget.ticker, uriTranslator, dillTarget.backendTarget) {
     loader = createLoader();
@@ -197,47 +202,18 @@
     return new KernelLibraryBuilder(uri, fileUri, loader, origin);
   }
 
-  void forEachDirectSupertype(ClassBuilder cls, void f(NamedTypeBuilder type)) {
-    TypeBuilder supertype = cls.supertype;
-    if (supertype is NamedTypeBuilder) {
-      f(supertype);
-    } else if (supertype != null) {
-      unhandled("${supertype.runtimeType}", "forEachDirectSupertype",
-          cls.charOffset, cls.fileUri);
-    }
-    if (cls.interfaces != null) {
-      for (NamedTypeBuilder t in cls.interfaces) {
-        f(t);
-      }
-    }
-    if (cls.library.loader == loader &&
-        // TODO(ahe): Implement DillClassBuilder.mixedInType and remove the
-        // above check.
-        cls.mixedInType != null) {
-      f(cls.mixedInType);
-    }
-  }
-
-  void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set) {
-    if (cls == null) return;
-    forEachDirectSupertype(cls, (NamedTypeBuilder type) {
-      Declaration declaration = type.declaration;
-      if (declaration is ClassBuilder) {
-        set.add(declaration);
-      }
-    });
-  }
-
   /// Returns classes defined in libraries in [loader].
   List<SourceClassBuilder> collectMyClasses() {
     List<SourceClassBuilder> result = <SourceClassBuilder>[];
     loader.builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == loader) {
-        library.forEach((String name, Declaration member) {
+        Iterator<Declaration> iterator = library.iterator;
+        while (iterator.moveNext()) {
+          Declaration member = iterator.current;
           if (member is SourceClassBuilder && !member.isPatch) {
             result.add(member);
           }
-        });
+        }
       }
     });
     return result;
@@ -268,16 +244,18 @@
       bottomType.bind(loader.coreLibrary["Null"]);
       loader.resolveTypes();
       loader.computeDefaultTypes(dynamicType, bottomType, objectClassBuilder);
-      List<SourceClassBuilder> myClasses = collectMyClasses();
-      loader.checkSemantics(myClasses);
+      List<SourceClassBuilder> myClasses =
+          loader.checkSemantics(objectClassBuilder);
       loader.finishTypeVariables(objectClassBuilder, dynamicType);
       loader.buildComponent();
+      loader.finalizeInitializingFormals();
       installDefaultSupertypes();
       installSyntheticConstructors(myClasses);
       loader.resolveConstructors();
       component =
           link(new List<Library>.from(loader.libraries), nameRoot: nameRoot);
       computeCoreTypes();
+      loader.buildClassHierarchy(myClasses, objectClassBuilder);
       loader.computeHierarchy();
       loader.performTopLevelInference(myClasses);
       loader.checkSupertypes(myClasses);
@@ -350,7 +328,6 @@
     }
 
     this.uriToSource.forEach(copySource);
-    dillTarget.loader.uriToSource.forEach(copySource);
 
     Component component = CompilerContext.current.options.target
         .configureComponent(new Component(
@@ -386,24 +363,23 @@
     Class objectClass = this.objectClass;
     loader.builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == loader) {
-        library.forEach((String name, Declaration declaration) {
-          while (declaration != null) {
-            if (declaration is SourceClassBuilder) {
-              Class cls = declaration.target;
-              if (cls != objectClass) {
-                cls.supertype ??= objectClass.asRawSupertype;
-                declaration.supertype ??=
-                    new KernelNamedTypeBuilder("Object", null)
-                      ..bind(objectClassBuilder);
-              }
-              if (declaration.isMixinApplication) {
-                cls.mixedInType = declaration.mixedInType.buildMixedInType(
-                    library, declaration.charOffset, declaration.fileUri);
-              }
+        Iterator<Declaration> iterator = library.iterator;
+        while (iterator.moveNext()) {
+          Declaration declaration = iterator.current;
+          if (declaration is SourceClassBuilder) {
+            Class cls = declaration.target;
+            if (cls != objectClass) {
+              cls.supertype ??= objectClass.asRawSupertype;
+              declaration.supertype ??=
+                  new KernelNamedTypeBuilder("Object", null)
+                    ..bind(objectClassBuilder);
             }
-            declaration = declaration.next;
+            if (declaration.isMixinApplication) {
+              cls.mixedInType = declaration.mixedInType.buildMixedInType(
+                  library, declaration.charOffset, declaration.fileUri);
+            }
           }
-        });
+        }
       }
     });
     ticker.logMs("Installed Object as implicit superclass");
@@ -412,8 +388,8 @@
   void installSyntheticConstructors(List<SourceClassBuilder> builders) {
     Class objectClass = this.objectClass;
     for (SourceClassBuilder builder in builders) {
-      if (builder.target != objectClass) {
-        if (builder.isPatch) continue;
+      if (builder.target != objectClass && !builder.isPatch) {
+        if (builder.isPatch || builder.isMixinDeclaration) continue;
         if (builder.isMixinApplication) {
           installForwardingConstructors(builder);
         } else {
@@ -533,7 +509,8 @@
     return new Constructor(function,
         name: constructor.name,
         initializers: <Initializer>[initializer],
-        isSynthetic: true);
+        isSynthetic: true,
+        isConst: constructor.isConst && mixin.fields.isEmpty);
   }
 
   void finishClonedParameters() {
@@ -727,7 +704,8 @@
     for (Field field in uninitializedFields) {
       if (initializedFields == null || !initializedFields.contains(field)) {
         field.initializer = new NullLiteral()..parent = field;
-        if (field.isFinal && cls.constructors.isNotEmpty) {
+        if (field.isFinal &&
+            (cls.constructors.isNotEmpty || cls.isMixinDeclaration)) {
           builder.library.addProblem(
               templateFinalFieldNotInitialized.withArguments(field.name.name),
               field.fileOffset,
@@ -770,12 +748,26 @@
   /// Run all transformations that are needed when building a bundle of
   /// libraries for the first time.
   void runBuildTransformations() {
+    if (loader.target.enableConstantUpdate2018) {
+      constants.transformLibraries(
+          loader.libraries,
+          new KernelConstantsBackend(),
+          loader.coreTypes,
+          new TypeEnvironment(loader.coreTypes, loader.hierarchy,
+              legacyMode: false),
+          const constants.SimpleErrorReporter());
+      ticker.logMs("Evaluated constants");
+    }
     backendTarget.performModularTransformationsOnLibraries(
         component, loader.coreTypes, loader.hierarchy, loader.libraries,
         logger: (String msg) => ticker.logMs(msg));
   }
 
   void runProcedureTransformations(Procedure procedure) {
+    if (loader.target.enableConstantUpdate2018) {
+      unimplemented('constant evaluation during expression evaluation',
+          procedure.fileOffset, procedure.fileUri);
+    }
     backendTarget.performTransformationsOnProcedure(
         loader.coreTypes, loader.hierarchy, procedure,
         logger: (String msg) => ticker.logMs(msg));
@@ -806,10 +798,10 @@
         } else {
           // If there's more than one patch file, it's interpreted as a part of
           // the patch library.
-          KernelLibraryBuilder part =
-              library.loader.read(patch, -1, fileUri: patch, accessor: first);
+          KernelLibraryBuilder part = library.loader.read(patch, -1,
+              origin: library, fileUri: patch, accessor: library);
           first.parts.add(part);
-          part.addPartOf(null, null, "${first.uri}", -1);
+          part.partOfUri = first.uri;
         }
       }
     }
@@ -821,14 +813,13 @@
 /// arguments.
 Constructor defaultSuperConstructor(Class cls) {
   Class superclass = cls.superclass;
-  while (superclass != null && superclass.isMixinApplication) {
-    superclass = superclass.superclass;
-  }
-  for (Constructor constructor in superclass.constructors) {
-    if (constructor.name.name.isEmpty) {
-      return constructor.function.requiredParameterCount == 0
-          ? constructor
-          : null;
+  if (superclass != null) {
+    for (Constructor constructor in superclass.constructors) {
+      if (constructor.name.name.isEmpty) {
+        return constructor.function.requiredParameterCount == 0
+            ? constructor
+            : null;
+      }
     }
   }
   return null;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
index 6d1bca2..c427799 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
@@ -36,7 +36,7 @@
         super(name, bound, compilationUnit, charOffset);
 
   KernelTypeVariableBuilder.fromKernel(
-      TypeParameter parameter, KernelLibraryBuilder compilationUnit)
+      TypeParameter parameter, LibraryBuilder compilationUnit)
       : actualParameter = parameter,
         super(parameter.name, null, compilationUnit, parameter.fileOffset);
 
@@ -82,10 +82,16 @@
   void finish(LibraryBuilder library, KernelClassBuilder object,
       TypeBuilder dynamicType) {
     if (isPatch) return;
-    parameter.bound ??=
-        bound?.build(library) ?? object.buildType(library, null);
-    parameter.defaultType ??=
-        defaultType?.build(library) ?? dynamicType.build(library);
+    DartType objectType = object.buildType(library, null);
+    parameter.bound ??= bound?.build(library) ?? objectType;
+    // If defaultType is not set, initialize it to dynamic, unless the bound is
+    // explicitly specified as Object, in which case defaultType should also be
+    // Object. This makes sure instantiation of generic function types with an
+    // explicit Object bound results in Object as the instantiated type.
+    parameter.defaultType ??= defaultType?.build(library) ??
+        (bound != null && parameter.bound == objectType
+            ? objectType
+            : dynamicType.build(library));
   }
 
   void applyPatch(covariant KernelTypeVariableBuilder patch) {
@@ -99,4 +105,15 @@
     return new KernelTypeVariableBuilder(
         name, parent, charOffset, bound.clone(newTypes));
   }
+
+  static List<TypeParameter> kernelTypeParametersFromBuilders(
+      List<TypeVariableBuilder> builders) {
+    if (builders == null) return null;
+    List<TypeParameter> result =
+        new List<TypeParameter>.filled(builders.length, null, growable: true);
+    for (int i = 0; i < builders.length; i++) {
+      result[i] = builders[i].target;
+    }
+    return result;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index 62248a4..bcd7cca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -129,7 +129,7 @@
   RedirectionTarget(this.target, this.typeArguments);
 }
 
-RedirectionTarget getRedirectionTarget(Procedure member, {bool strongMode}) {
+RedirectionTarget getRedirectionTarget(Procedure member, {bool legacyMode}) {
   List<DartType> typeArguments = <DartType>[]..length =
       member.function.typeParameters.length;
   for (int i = 0; i < typeArguments.length; i++) {
@@ -148,11 +148,11 @@
       return new RedirectionTarget(tortoise, typeArguments);
     Member nextTortoise = tortoiseBody.target;
     List<DartType> nextTypeArguments = tortoiseBody.typeArguments;
-    if (strongMode && nextTypeArguments == null) {
+    if (!legacyMode && nextTypeArguments == null) {
       nextTypeArguments = <DartType>[];
     }
 
-    if (strongMode || nextTypeArguments != null) {
+    if (!legacyMode || nextTypeArguments != null) {
       Substitution sub = Substitution.fromPairs(
           tortoise.function.typeParameters, typeArguments);
       typeArguments = <DartType>[]..length = nextTypeArguments.length;
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
new file mode 100644
index 0000000..e32f179
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_set_literals.dart
@@ -0,0 +1,122 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.transform_set_literals;
+
+import 'dart:core' hide MapEntry;
+
+import 'package:kernel/ast.dart'
+    show
+        Arguments,
+        Class,
+        Constructor,
+        ConstructorInvocation,
+        DartType,
+        Expression,
+        InterfaceType,
+        Let,
+        Library,
+        MapEntry,
+        MapLiteral,
+        MethodInvocation,
+        Name,
+        NullLiteral,
+        Procedure,
+        SetLiteral,
+        StaticInvocation,
+        TreeNode,
+        VariableDeclaration,
+        VariableGet;
+
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import 'package:kernel/visitor.dart' show Transformer;
+
+import '../source/source_loader.dart' show SourceLoader;
+
+import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
+
+// TODO(askesc): Delete this class when all backends support set literals.
+class SetLiteralTransformer extends Transformer {
+  final CoreTypes coreTypes;
+  final DartType nullType;
+  final Procedure setFactory;
+  final Procedure addMethod;
+  final Constructor unmodifiableSetConstructor;
+
+  static Procedure _findSetFactory(CoreTypes coreTypes) {
+    Procedure factory = coreTypes.index.getMember('dart:core', 'Set', '');
+    RedirectingFactoryBody body = factory?.function?.body;
+    return body?.target;
+  }
+
+  static Procedure _findAddMethod(CoreTypes coreTypes) {
+    return coreTypes.index.getMember('dart:core', 'Set', 'add');
+  }
+
+  static Constructor _findUnmodifiableSetConstructor(
+      SourceLoader<Library> loader) {
+    // We should not generally dig into libraries like this, and we should
+    // avoid dependencies on libraries other than the ones indexed by
+    // CoreTypes. This is a temporary solution until all backends have
+    // implemented support for set literals.
+    Uri collectionUri = Uri.parse("dart:collection");
+    Library collectionLibrary = loader.builders[collectionUri].target;
+    for (int i = 0; i < collectionLibrary.classes.length; i++) {
+      Class classNode = collectionLibrary.classes[i];
+      if (classNode.name == "_UnmodifiableSet") {
+        for (int j = 0; j < collectionLibrary.classes.length; j++) {
+          Constructor constructor = classNode.constructors[j];
+          if (constructor.name.name.isEmpty) {
+            return constructor;
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  SetLiteralTransformer(SourceLoader<Library> loader)
+      : coreTypes = loader.coreTypes,
+        nullType = new InterfaceType(loader.coreTypes.nullClass, []),
+        setFactory = _findSetFactory(loader.coreTypes),
+        addMethod = _findAddMethod(loader.coreTypes),
+        unmodifiableSetConstructor = _findUnmodifiableSetConstructor(loader);
+
+  TreeNode visitSetLiteral(SetLiteral node) {
+    if (node.isConst) {
+      List<MapEntry> entries = new List<MapEntry>(node.expressions.length);
+      for (int i = 0; i < node.expressions.length; i++) {
+        // expression_i: null
+        Expression entry = node.expressions[i].accept(this);
+        entries[i] = new MapEntry(entry, new NullLiteral());
+      }
+      Expression mapExp = new MapLiteral(entries,
+          keyType: node.typeArgument, valueType: nullType, isConst: true);
+      return new ConstructorInvocation(unmodifiableSetConstructor,
+          new Arguments([mapExp], types: [node.typeArgument]),
+          isConst: true);
+    } else {
+      // Outermost declaration of let chain: Set<E> setVar = new Set<E>();
+      VariableDeclaration setVar = new VariableDeclaration.forValue(
+          new StaticInvocation(
+              setFactory, new Arguments([], types: [node.typeArgument])),
+          type: new InterfaceType(coreTypes.setClass, [node.typeArgument]));
+      // Innermost body of let chain: setVar
+      Expression setExp = new VariableGet(setVar);
+      for (int i = node.expressions.length - 1; i >= 0; i--) {
+        // let _ = setVar.add(expression) in rest
+        Expression entry = node.expressions[i].accept(this);
+        setExp = new Let(
+            new VariableDeclaration.forValue(new MethodInvocation(
+                new VariableGet(setVar),
+                new Name("add"),
+                new Arguments([entry]),
+                addMethod)),
+            setExp);
+      }
+      return new Let(setVar, setExp);
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 704126d..eae7bf1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -124,7 +124,6 @@
               formal.modifiers,
               parameterType,
               formal.name,
-              formal.hasThis,
               formal.parent,
               formal.charOffset);
           changed = true;
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
new file mode 100644
index 0000000..38fa92c
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -0,0 +1,367 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert' show json;
+
+import 'package:kernel/ast.dart'
+    show
+        BoolConstant,
+        BottomType,
+        Class,
+        Constant,
+        ConstantMapEntry,
+        DartType,
+        DoubleConstant,
+        DynamicType,
+        EnvironmentBoolConstant,
+        EnvironmentIntConstant,
+        EnvironmentStringConstant,
+        Field,
+        FunctionType,
+        InvalidType,
+        InstanceConstant,
+        IntConstant,
+        InterfaceType,
+        ListConstant,
+        MapConstant,
+        NullConstant,
+        PartialInstantiationConstant,
+        Procedure,
+        StringConstant,
+        SymbolConstant,
+        TearOffConstant,
+        TypedefType,
+        TypeLiteralConstant,
+        TypeParameter,
+        TypeParameterType,
+        UnevaluatedConstant,
+        VoidType;
+
+import 'package:kernel/visitor.dart' show ConstantVisitor, DartTypeVisitor;
+
+import '../blacklisted_classes.dart' show blacklistedCoreClasses;
+
+import '../fasta_codes.dart'
+    show Message, templateTypeOrigin, templateTypeOriginWithFileUri;
+
+import '../problems.dart' show unsupported;
+
+/// A pretty-printer for Kernel types and constants with the ability to label
+/// raw types with numeric markers in Dart comments (e.g. `/*1*/`) to
+/// distinguish different types with the same name. This is used in diagnostic
+/// messages to indicate the origins of types occurring in the message.
+class TypeLabeler implements DartTypeVisitor<void>, ConstantVisitor<void> {
+  List<LabeledClassName> names = <LabeledClassName>[];
+  Map<String, List<LabeledClassName>> nameMap =
+      <String, List<LabeledClassName>>{};
+
+  List<Object> result;
+
+  /// Pretty-print a type.
+  /// When all types and constants appearing in the same message have been
+  /// pretty-printed, the returned list can be converted to its string
+  /// representation (with labels on duplicated names) by the `join()` method.
+  List<Object> labelType(DartType type) {
+    // TODO(askesc): Remove null check when we are completely null clean here.
+    if (type == null) return ["null-type"];
+    result = [];
+    type.accept(this);
+    return result;
+  }
+
+  /// Pretty-print a constant.
+  /// When all types and constants appearing in the same message have been
+  /// pretty-printed, the returned list can be converted to its string
+  /// representation (with labels on duplicated names) by the `join()` method.
+  List<Object> labelConstant(Constant constant) {
+    // TODO(askesc): Remove null check when we are completely null clean here.
+    if (constant == null) return ["null-constant"];
+    result = [];
+    constant.accept(this);
+    return result;
+  }
+
+  /// Get a textual description of the origins of the raw types appearing in
+  /// types and constants that have been pretty-printed using this labeler.
+  String get originMessages {
+    StringBuffer messages = new StringBuffer();
+    for (LabeledClassName name in names) {
+      messages.write(name.originMessage);
+    }
+    return messages.toString();
+  }
+
+  // We don't have access to coreTypes here, so we have our own Object check.
+  static bool isObject(DartType type) {
+    if (type is InterfaceType && type.classNode.name == 'Object') {
+      Uri importUri = type.classNode.enclosingLibrary.importUri;
+      return importUri.scheme == 'dart' && importUri.path == 'core';
+    }
+    return false;
+  }
+
+  LabeledClassName nameForClass(Class classNode) {
+    List<LabeledClassName> classesForName = nameMap[classNode.name];
+    if (classesForName == null) {
+      // First encountered class with this name
+      LabeledClassName name = new LabeledClassName(classNode, this);
+      names.add(name);
+      nameMap[classNode.name] = [name];
+      return name;
+    } else {
+      for (LabeledClassName classForName in classesForName) {
+        if (classForName.classNode == classNode) {
+          // Previously encountered class
+          return classForName;
+        }
+      }
+      // New class with name that was previously encountered
+      LabeledClassName name = new LabeledClassName(classNode, this);
+      names.add(name);
+      classesForName.add(name);
+      return name;
+    }
+  }
+
+  void defaultDartType(DartType type) {}
+  void visitTypedefType(TypedefType node) {}
+
+  void visitInvalidType(InvalidType node) {
+    // TODO(askesc): Throw internal error if InvalidType appears in diagnostics.
+    result.add("invalid-type");
+  }
+
+  void visitBottomType(BottomType node) {
+    // TODO(askesc): Throw internal error if BottomType appears in diagnostics.
+    result.add("bottom-type");
+  }
+
+  void visitDynamicType(DynamicType node) {
+    result.add("dynamic");
+  }
+
+  void visitVoidType(VoidType node) {
+    result.add("void");
+  }
+
+  void visitTypeParameterType(TypeParameterType node) {
+    result.add(node.parameter.name);
+  }
+
+  void visitFunctionType(FunctionType node) {
+    node.returnType.accept(this);
+    result.add(" Function");
+    if (node.typeParameters.isNotEmpty) {
+      result.add("<");
+      bool first = true;
+      for (TypeParameter param in node.typeParameters) {
+        if (!first) result.add(", ");
+        result.add(param.name);
+        if (isObject(param.bound) && param.defaultType is DynamicType) {
+          // Bound was not specified, and therefore should not be printed.
+        } else {
+          result.add(" extends ");
+          param.bound.accept(this);
+        }
+      }
+      result.add(">");
+    }
+    result.add("(");
+    bool first = true;
+    for (int i = 0; i < node.requiredParameterCount; i++) {
+      if (!first) result.add(", ");
+      node.positionalParameters[i].accept(this);
+      first = false;
+    }
+    if (node.positionalParameters.length > node.requiredParameterCount) {
+      if (node.requiredParameterCount > 0) result.add(", ");
+      result.add("[");
+      first = true;
+      for (int i = node.requiredParameterCount;
+          i < node.positionalParameters.length;
+          i++) {
+        if (!first) result.add(", ");
+        node.positionalParameters[i].accept(this);
+        first = false;
+      }
+      result.add("]");
+    }
+    if (node.namedParameters.isNotEmpty) {
+      if (node.positionalParameters.isNotEmpty) result.add(", ");
+      result.add("{");
+      first = true;
+      for (int i = 0; i < node.namedParameters.length; i++) {
+        if (!first) result.add(", ");
+        node.namedParameters[i].type.accept(this);
+        result.add(" ${node.namedParameters[i].name}");
+        first = false;
+      }
+      result.add("}");
+    }
+    result.add(")");
+  }
+
+  void visitInterfaceType(InterfaceType node) {
+    result.add(nameForClass(node.classNode));
+    if (node.typeArguments.isNotEmpty) {
+      result.add("<");
+      bool first = true;
+      for (DartType typeArg in node.typeArguments) {
+        if (!first) result.add(", ");
+        typeArg.accept(this);
+        first = false;
+      }
+      result.add(">");
+    }
+  }
+
+  void defaultConstant(Constant node) {}
+
+  void visitNullConstant(NullConstant node) {
+    result.add(node);
+  }
+
+  void visitBoolConstant(BoolConstant node) {
+    result.add(node);
+  }
+
+  void visitIntConstant(IntConstant node) {
+    result.add(node);
+  }
+
+  void visitDoubleConstant(DoubleConstant node) {
+    result.add(node);
+  }
+
+  void visitSymbolConstant(SymbolConstant node) {
+    result.add(node);
+  }
+
+  void visitStringConstant(StringConstant node) {
+    result.add(json.encode(node.value));
+  }
+
+  void visitInstanceConstant(InstanceConstant node) {
+    new InterfaceType(node.klass, node.typeArguments).accept(this);
+    result.add(" {");
+    bool first = true;
+    for (Field field in node.klass.fields) {
+      if (!first) result.add(", ");
+      result.add("${field.name}: ");
+      node.fieldValues[field.reference].accept(this);
+      first = false;
+    }
+    result.add("}");
+  }
+
+  void visitListConstant(ListConstant node) {
+    result.add("<");
+    node.typeArgument.accept(this);
+    result.add(">[");
+    bool first = true;
+    for (Constant constant in node.entries) {
+      if (!first) result.add(", ");
+      constant.accept(this);
+      first = false;
+    }
+    result.add("]");
+  }
+
+  void visitMapConstant(MapConstant node) {
+    result.add("<");
+    node.keyType.accept(this);
+    result.add(", ");
+    node.valueType.accept(this);
+    result.add(">{");
+    bool first = true;
+    for (ConstantMapEntry entry in node.entries) {
+      if (!first) result.add(", ");
+      entry.key.accept(this);
+      result.add(": ");
+      entry.value.accept(this);
+      first = false;
+    }
+    result.add("}");
+  }
+
+  void visitTearOffConstant(TearOffConstant node) {
+    Procedure procedure = node.procedure;
+    Class classNode = procedure.enclosingClass;
+    if (classNode != null) {
+      result.add(nameForClass(classNode));
+      result.add(".");
+    }
+    result.add(procedure.name.name);
+  }
+
+  void visitPartialInstantiationConstant(PartialInstantiationConstant node) {
+    node.tearOffConstant.accept(this);
+    if (node.types.isNotEmpty) {
+      result.add("<");
+      bool first = true;
+      for (DartType typeArg in node.types) {
+        if (!first) result.add(", ");
+        typeArg.accept(this);
+        first = false;
+      }
+      result.add(">");
+    }
+  }
+
+  void visitTypeLiteralConstant(TypeLiteralConstant node) {
+    node.type.accept(this);
+  }
+
+  void visitEnvironmentBoolConstant(EnvironmentBoolConstant node) {
+    unsupported('printing unevaluated constants', -1, null);
+  }
+
+  void visitEnvironmentIntConstant(EnvironmentIntConstant node) {
+    unsupported('printing unevaluated constants', -1, null);
+  }
+
+  void visitEnvironmentStringConstant(EnvironmentStringConstant node) {
+    unsupported('printing unevaluated constants', -1, null);
+  }
+
+  void visitUnevaluatedConstant(UnevaluatedConstant node) {
+    unsupported('printing unevaluated constants', -1, null);
+  }
+}
+
+class LabeledClassName {
+  Class classNode;
+  TypeLabeler typeLabeler;
+
+  LabeledClassName(this.classNode, this.typeLabeler);
+
+  String toString() {
+    String name = classNode.name;
+    List<LabeledClassName> classesForName = typeLabeler.nameMap[name];
+    if (classesForName.length == 1) {
+      return name;
+    }
+    return "$name/*${classesForName.indexOf(this) + 1}*/";
+  }
+
+  String get originMessage {
+    Uri importUri = classNode.enclosingLibrary.importUri;
+    if (importUri.scheme == 'dart' && importUri.path == 'core') {
+      String name = classNode.name;
+      if (blacklistedCoreClasses.contains(name)) {
+        // Blacklisted core class. Only print if ambiguous.
+        List<LabeledClassName> classesForName = typeLabeler.nameMap[name];
+        if (classesForName.length == 1) {
+          return "";
+        }
+      }
+    }
+    Uri fileUri = classNode.enclosingLibrary.fileUri;
+    Message message = (importUri == fileUri || importUri.scheme == 'dart')
+        ? templateTypeOrigin.withArguments(toString(), importUri)
+        : templateTypeOriginWithFileUri.withArguments(
+            toString(), importUri, fileUri);
+    return "\n - " + message.message;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 547e01f..67ce675 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -8,13 +8,14 @@
     show
         AsExpression,
         Class,
+        Component,
         ExpressionStatement,
         Field,
         InvalidInitializer,
+        Let,
         Library,
         Member,
         Procedure,
-        Component,
         StaticInvocation,
         SuperMethodInvocation,
         SuperPropertyGet,
@@ -34,6 +35,8 @@
 
 import '../type_inference/type_schema.dart' show TypeSchemaVisitor, UnknownType;
 
+import 'kernel_shadow_ast.dart' show SyntheticExpressionJudgment;
+
 import 'redirecting_factory_body.dart'
     show RedirectingFactoryBody, getRedirectingFactoryBody;
 
@@ -136,6 +139,14 @@
   }
 
   @override
+  visitLet(Let node) {
+    if (node is SyntheticExpressionJudgment) {
+      problem(node, "Leaking shadow node: ${node.runtimeType}");
+    }
+    super.visitLet(node);
+  }
+
+  @override
   visitLibrary(Library node) {
     // Issue(http://dartbug.com/32530)
     if (skipPlatform && node.importUri.scheme == 'dart') {
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 3da7e4f..8823bfa 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -33,8 +33,6 @@
 
 import 'ticker.dart' show Ticker;
 
-import 'type_inference/type_inference_engine.dart' show TypeInferenceEngine;
-
 const String untranslatableUriScheme = "org-dartlang-untranslatable-uri";
 
 abstract class Loader<L> {
@@ -78,8 +76,6 @@
 
   Template<SummaryTemplate> get outlineSummaryTemplate;
 
-  TypeInferenceEngine get typeInferenceEngine => null;
-
   bool get isSourceLoader => false;
 
   /// Look up a library builder by the name [uri], or if such doesn't
@@ -157,6 +153,7 @@
     } else {
       builder.recordAccess(charOffset, noLength, accessor.fileUri);
       if (!accessor.isPatch &&
+          !accessor.isPart &&
           !target.backendTarget
               .allowPlatformPrivateLibraryAccess(accessor.uri, uri)) {
         accessor.addProblem(messagePlatformPrivateLibraryAccess, charOffset,
diff --git a/pkg/front_end/lib/src/fasta/modifier.dart b/pkg/front_end/lib/src/fasta/modifier.dart
index 52f7017..4b7ed12 100644
--- a/pkg/front_end/lib/src/fasta/modifier.dart
+++ b/pkg/front_end/lib/src/fasta/modifier.dart
@@ -36,6 +36,12 @@
 /// keyword.
 const int mixinDeclarationMask = namedMixinApplicationMask << 1;
 
+/// Not a modifier, used by fields to track if they have an initializer.
+const int hasInitializerMask = mixinDeclarationMask << 1;
+
+/// Not a modifier, used by formal parameters to track if they are initializing.
+const int initializingFormalMask = hasInitializerMask << 1;
+
 /// Not a real modifier, and by setting it to zero, it is automatically ignored
 /// by [Modifier.validate] below.
 const int varMask = 0;
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 8c3478e..51e3b9e 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -136,11 +136,6 @@
   }
 
   @override
-  void beginExpressionStatement(Token token) {
-    listener?.beginExpressionStatement(token);
-  }
-
-  @override
   void beginFactoryMethod(
       Token lastConsumed, Token externalToken, Token constToken) {
     listener?.beginFactoryMethod(lastConsumed, externalToken, constToken);
@@ -254,11 +249,6 @@
   }
 
   @override
-  void beginLiteralMapEntry(Token token) {
-    listener?.beginLiteralMapEntry(token);
-  }
-
-  @override
   void beginLiteralString(Token token) {
     listener?.beginLiteralString(token);
   }
@@ -551,11 +541,6 @@
   }
 
   @override
-  void endExpressionStatement(Token token) {
-    listener?.endExpressionStatement(token);
-  }
-
-  @override
   void endFactoryMethod(
       Token beginToken, Token factoryKeyword, Token endToken) {
     listener?.endFactoryMethod(beginToken, factoryKeyword, endToken);
@@ -630,8 +615,8 @@
   }
 
   @override
-  void endFunctionType(Token functionToken) {
-    listener?.endFunctionType(functionToken);
+  void endFunctionType(Token functionToken, Token questionMark) {
+    listener?.endFunctionType(functionToken, questionMark);
   }
 
   @override
@@ -686,8 +671,8 @@
   }
 
   @override
-  void endLiteralMapEntry(Token colon, Token endToken) {
-    listener?.endLiteralMapEntry(colon, endToken);
+  void handleLiteralMapEntry(Token colon, Token endToken) {
+    listener?.handleLiteralMapEntry(colon, endToken);
   }
 
   @override
@@ -996,11 +981,22 @@
   }
 
   @override
+  void handleEmptyLiteralSetOrMap(
+      Token leftBrace, Token constKeyword, Token rightBrace) {
+    listener?.handleEmptyLiteralSetOrMap(leftBrace, constKeyword, rightBrace);
+  }
+
+  @override
   void handleExpressionFunctionBody(Token arrowToken, Token endToken) {
     listener?.handleExpressionFunctionBody(arrowToken, endToken);
   }
 
   @override
+  void handleExpressionStatement(Token token) {
+    listener?.handleExpressionStatement(token);
+  }
+
+  @override
   void handleExtraneousExpression(Token token, Message message) {
     listener?.handleExtraneousExpression(token, message);
   }
@@ -1128,6 +1124,12 @@
   }
 
   @override
+  void handleLiteralSet(
+      int count, Token beginToken, Token constKeyword, Token token) {
+    listener?.handleLiteralSet(count, beginToken, constKeyword, token);
+  }
+
+  @override
   void handleMixinHeader(Token mixinKeyword) {
     listener?.handleMixinHeader(mixinKeyword);
   }
@@ -1183,8 +1185,18 @@
   }
 
   @override
-  void handleNoExpression(Token token) {
-    listener?.handleNoExpression(token);
+  void handleForInitializerEmptyStatement(Token token) {
+    listener?.handleForInitializerEmptyStatement(token);
+  }
+
+  @override
+  void handleForInitializerExpressionStatement(Token token) {
+    listener?.handleForInitializerExpressionStatement(token);
+  }
+
+  @override
+  void handleForInitializerLocalVariableDeclaration(Token token) {
+    listener?.handleForInitializerLocalVariableDeclaration(token);
   }
 
   @override
@@ -1332,8 +1344,8 @@
   }
 
   @override
-  void handleType(Token beginToken) {
-    listener?.handleType(beginToken);
+  void handleType(Token beginToken, Token questionMark) {
+    listener?.handleType(beginToken, questionMark);
   }
 
   @override
@@ -1382,6 +1394,11 @@
   }
 
   @override
+  void reportErrorIfNullableType(Token questionMark) {
+    listener?.reportErrorIfNullableType(questionMark);
+  }
+
+  @override
   set suppressParseErrors(bool value) {
     listener?.suppressParseErrors = value;
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index bbdfe7f..d681804 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -6,7 +6,7 @@
 
 import '../../scanner/token.dart' show Token;
 
-import '../fasta_codes.dart' show Message;
+import '../fasta_codes.dart' show Message, templateUnexpectedToken;
 
 import '../quote.dart' show UnescapeErrorListener;
 
@@ -18,6 +18,8 @@
 
 import 'member_kind.dart' show MemberKind;
 
+import 'util.dart' show optional;
+
 /// A parser event listener that does nothing except throw exceptions
 /// on parser errors.
 ///
@@ -249,8 +251,6 @@
     logEvent("Export");
   }
 
-  void beginExpressionStatement(Token token) {}
-
   /// Called by [Parser] after parsing an extraneous expression as error
   /// recovery. For a stack-based listener, the suggested action is to discard
   /// an expression from the stack.
@@ -258,7 +258,7 @@
     logEvent("ExtraneousExpression");
   }
 
-  void endExpressionStatement(Token token) {
+  void handleExpressionStatement(Token token) {
     logEvent("ExpressionStatement");
   }
 
@@ -301,6 +301,24 @@
     logEvent("Fields");
   }
 
+  /// Marks that the grammar term `forInitializerStatement` has been parsed and
+  /// it was an empty statement.
+  void handleForInitializerEmptyStatement(Token token) {
+    logEvent("ForInitializerEmptyStatement");
+  }
+
+  /// Marks that the grammar term `forInitializerStatement` has been parsed and
+  /// it was an expression statement.
+  void handleForInitializerExpressionStatement(Token token) {
+    logEvent("ForInitializerExpressionStatement");
+  }
+
+  /// Marks that the grammar term `forInitializerStatement` has been parsed and
+  /// it was a `localVariableDeclaration`.
+  void handleForInitializerLocalVariableDeclaration(Token token) {
+    logEvent("ForInitializerLocalVariableDeclaration");
+  }
+
   /// Marks the start of a for statement which is ended by either
   /// [endForStatement] or [endForIn].
   void beginForStatement(Token token) {}
@@ -660,9 +678,7 @@
     logEvent("LibraryName");
   }
 
-  void beginLiteralMapEntry(Token token) {}
-
-  void endLiteralMapEntry(Token colon, Token endToken) {
+  void handleLiteralMapEntry(Token colon, Token endToken) {
     logEvent("LiteralMapEntry");
   }
 
@@ -917,10 +933,22 @@
     logEvent("TryStatement");
   }
 
-  void handleType(Token beginToken) {
+  void handleType(Token beginToken, Token questionMark) {
     logEvent("Type");
   }
 
+  // TODO(danrubel): Remove this once all listeners have been updated
+  // to properly handle nullable types
+  void reportErrorIfNullableType(Token questionMark) {
+    if (questionMark != null) {
+      assert(optional('?', questionMark));
+      handleRecoverableError(
+          templateUnexpectedToken.withArguments(questionMark),
+          questionMark,
+          questionMark);
+    }
+  }
+
   void handleNoName(Token token) {
     logEvent("NoName");
   }
@@ -933,7 +961,7 @@
   /// - Type variables
   /// - Return type
   /// - Formal parameters
-  void endFunctionType(Token functionToken) {
+  void endFunctionType(Token functionToken, Token questionMark) {
     logEvent("FunctionType");
   }
 
@@ -1123,6 +1151,16 @@
     logEvent("LiteralMap");
   }
 
+  void handleLiteralSet(
+      int count, Token beginToken, Token constKeyword, Token token) {
+    logEvent("LiteralSet");
+  }
+
+  void handleEmptyLiteralSetOrMap(
+      Token leftBrace, Token constKeyword, Token rightBrace) {
+    logEvent('EmptyLiteralSetOrMap');
+  }
+
   void handleLiteralNull(Token token) {
     logEvent("LiteralNull");
   }
@@ -1145,10 +1183,6 @@
     logEvent("NoArguments");
   }
 
-  void handleNoExpression(Token token) {
-    logEvent("NoExpression");
-  }
-
   void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
     logEvent("NoConstructorReferenceContinuationAfterTypeArguments");
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 7cb645c..a3a59c2 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -100,6 +100,7 @@
         isLetter,
         isLetterOrDigit,
         isOneOf,
+        isOneOfOrEof,
         isWhitespace,
         optional;
 
@@ -261,6 +262,10 @@
 
   bool mayParseFunctionExpressions = true;
 
+  /// Experimental flag for enabling set literal support.
+  /// See https://github.com/dart-lang/sdk/issues/35121
+  bool enableSetLiterals = true;
+
   /// Represents parser state: what asynchronous syntax is allowed in the
   /// function being currently parsed. In rare situations, this can be set by
   /// external clients, for example, to parse an expression outside a function.
@@ -331,6 +336,10 @@
     int count = 0;
     DirectiveContext directiveState = new DirectiveContext();
     token = syntheticPreviousToken(token);
+    if (identical(token.next.type, TokenType.SCRIPT_TAG)) {
+      directiveState?.checkScriptTag(this, token.next);
+      token = parseScript(token);
+    }
     while (!token.next.isEof) {
       final Token start = token.next;
       token = parseTopLevelDeclarationImpl(token, directiveState);
@@ -447,10 +456,6 @@
   /// ```
   Token parseTopLevelDeclarationImpl(
       Token token, DirectiveContext directiveState) {
-    if (identical(token.next.type, TokenType.SCRIPT_TAG)) {
-      directiveState?.checkScriptTag(this, token.next);
-      return parseScript(token);
-    }
     token = parseMetadataStar(token);
     Token next = token.next;
     if (next.isTopLevelKeyword) {
@@ -1122,18 +1127,50 @@
     return token;
   }
 
+  /// Parse the formal parameters of a getter (which shouldn't have parameters)
+  /// or function or method.
+  Token parseGetterOrFormalParameters(
+      Token token, Token name, bool isGetter, MemberKind kind) {
+    Token next = token.next;
+    if (optional("(", next)) {
+      if (isGetter) {
+        reportRecoverableError(next, fasta.messageGetterWithFormals);
+      }
+      token = parseFormalParameters(token, kind);
+    } else if (isGetter) {
+      listener.handleNoFormalParameters(next, kind);
+    } else {
+      // Recovery
+      if (optional('operator', name)) {
+        Token next = name.next;
+        if (next.isOperator) {
+          name = next;
+        } else if (isUnaryMinus(next)) {
+          name = next.next;
+        }
+      }
+      reportRecoverableError(name, missingParameterMessage(kind));
+      token = rewriter.insertParens(token, false);
+      token = parseFormalParametersRest(token, kind);
+    }
+    return token;
+  }
+
   Token parseFormalParametersOpt(Token token, MemberKind kind) {
     Token next = token.next;
     if (optional('(', next)) {
-      return parseFormalParameters(token, kind);
+      token = parseFormalParameters(token, kind);
     } else {
       listener.handleNoFormalParameters(next, kind);
-      return token;
     }
+    return token;
   }
 
   Token skipFormalParameters(Token token, MemberKind kind) {
-    token = token.next;
+    return skipFormalParametersRest(token.next, kind);
+  }
+
+  Token skipFormalParametersRest(Token token, MemberKind kind) {
     assert(optional('(', token));
     // TODO(ahe): Shouldn't this be `beginFormalParameters`?
     listener.beginOptionalFormalParameters(token);
@@ -1151,9 +1188,9 @@
     Token next = token.next;
     if (!optional('(', next)) {
       reportRecoverableError(next, missingParameterMessage(kind));
-      rewriter.insertParens(token, false);
+      next = rewriter.insertParens(token, false);
     }
-    return parseFormalParameters(token, kind);
+    return parseFormalParametersRest(next, kind);
   }
 
   /// Parses the formal parameter list of a function given that the left
@@ -1162,7 +1199,16 @@
   /// If `kind == MemberKind.GeneralizedFunctionType`, then names may be
   /// omitted (except for named arguments). Otherwise, types may be omitted.
   Token parseFormalParameters(Token token, MemberKind kind) {
-    Token begin = token = token.next;
+    return parseFormalParametersRest(token.next, kind);
+  }
+
+  /// Parses the formal parameter list of a function given that the left
+  /// parenthesis passed in as [token].
+  ///
+  /// If `kind == MemberKind.GeneralizedFunctionType`, then names may be
+  /// omitted (except for named arguments). Otherwise, types may be omitted.
+  Token parseFormalParametersRest(Token token, MemberKind kind) {
+    Token begin = token;
     assert(optional('(', token));
     listener.beginFormalParameters(begin, kind);
     int parameterCount = 0;
@@ -1204,8 +1250,10 @@
           } else if (next.kind == IDENTIFIER_TOKEN &&
               next.next.kind == IDENTIFIER_TOKEN) {
             // Looks like a missing comma
-            Token comma = new SyntheticToken(TokenType.COMMA, next.charOffset);
-            token = rewriter.insertToken(token, comma);
+            token = rewriteAndRecover(
+                token,
+                fasta.templateExpectedButGot.withArguments(','),
+                new SyntheticToken(TokenType.COMMA, next.charOffset));
             continue;
           } else {
             token = ensureCloseParen(token, begin);
@@ -2271,8 +2319,8 @@
       token = name;
       listener.handleNoTypeVariables(token.next);
     }
-    checkFormals(token, name, isGetter, MemberKind.TopLevelMethod);
-    token = parseFormalParametersOpt(token, MemberKind.TopLevelMethod);
+    token = parseGetterOrFormalParameters(
+        token, name, isGetter, MemberKind.TopLevelMethod);
     AsyncModifier savedAsyncModifier = asyncState;
     Token asyncToken = token.next;
     token = parseAsyncModifierOpt(token);
@@ -2304,27 +2352,6 @@
     return token;
   }
 
-  void checkFormals(Token token, Token name, bool isGetter, MemberKind kind) {
-    Token next = token.next;
-    if (optional("(", next)) {
-      if (isGetter) {
-        reportRecoverableError(next, fasta.messageGetterWithFormals);
-      }
-    } else if (!isGetter) {
-      if (optional('operator', name)) {
-        Token next = name.next;
-        if (next.isOperator) {
-          name = next;
-        } else if (isUnaryMinus(next)) {
-          name = next.next;
-        }
-      }
-      // Recovery
-      reportRecoverableError(name, missingParameterMessage(kind));
-      rewriter.insertParens(token, false);
-    }
-  }
-
   Token parseFieldInitializerOpt(
       Token token, Token name, Token varFinalOrConst, bool isTopLevel) {
     Token next = token.next;
@@ -2524,7 +2551,14 @@
         token = next;
         next = token.next;
       }
-      if (!optional('(', next)) {
+      if (optional('=', next)) {
+        if (optional('super', token)) {
+          // parseExpression will report error on assignment to super
+        } else {
+          reportRecoverableError(
+              token, fasta.messageFieldInitializedOutsideDeclaringClass);
+        }
+      } else if (!optional('(', next)) {
         reportRecoverableError(
             next, fasta.templateExpectedAfterButGot.withArguments('('));
         rewriter.insertParens(token, false);
@@ -2985,8 +3019,10 @@
       token = parseOperatorName(token);
     } else {
       token = ensureIdentifier(token, IdentifierContext.methodDeclaration);
-      token = parseQualifiedRestOpt(
-          token, IdentifierContext.methodDeclarationContinuation);
+      if (getOrSet == null) {
+        token = parseQualifiedRestOpt(
+            token, IdentifierContext.methodDeclarationContinuation);
+      }
     }
 
     bool isGetter = false;
@@ -3000,11 +3036,8 @@
     MemberKind kind = staticToken != null
         ? MemberKind.StaticMethod
         : MemberKind.NonStaticMethod;
-    checkFormals(token, name, isGetter, kind);
     Token beforeParam = token;
-    token = isGetter
-        ? parseFormalParametersOpt(token, kind)
-        : parseFormalParametersRequiredOpt(token, kind);
+    token = parseGetterOrFormalParameters(token, name, isGetter, kind);
     token = parseInitializersOpt(token);
 
     AsyncModifier savedAsyncModifier = asyncState;
@@ -3640,10 +3673,9 @@
     // TODO(brianwilkerson): If the next token is not the start of a valid
     // expression, then this method shouldn't report that we have an expression
     // statement.
-    listener.beginExpressionStatement(token.next);
     token = parseExpression(token);
     token = ensureSemicolon(token);
-    listener.endExpressionStatement(token);
+    listener.handleExpressionStatement(token);
     return token;
   }
 
@@ -3935,6 +3967,7 @@
           listener.handleNoTypeArguments(next);
         }
         token = parseArguments(token);
+        listener.handleSend(beginToken, token);
         typeArg = computeMethodTypeArguments(token);
         if (typeArg != noTypeParamOrArg) {
           // For example a(b)<T>(c), where token is before '<'.
@@ -3942,7 +3975,6 @@
           assert(optional('(', token.next));
         }
         next = token.next;
-        listener.handleSend(beginToken, next);
       } else {
         break;
       }
@@ -4001,7 +4033,7 @@
       return parseLiteralListSuffix(token, null);
     } else if (kind == OPEN_CURLY_BRACKET_TOKEN) {
       listener.handleNoTypeArguments(token.next);
-      return parseLiteralMapSuffix(token, null);
+      return parseLiteralSetOrMapSuffix(token, null);
     } else if (kind == LT_TOKEN) {
       return parseLiteralListOrMapOrFunction(token, null);
     } else {
@@ -4061,17 +4093,16 @@
     return token;
   }
 
-  Token parseParenthesizedCondition(Token token) {
-    if (!optional('(', token.next)) {
+  Token ensureParenthesizedCondition(Token token) {
+    Token openParen = token.next;
+    if (!optional('(', openParen)) {
       // Recover
-      Token next = token.next;
       reportRecoverableError(
-          next, fasta.templateExpectedToken.withArguments('('));
-      rewriter.insertParens(token, false);
+          openParen, fasta.templateExpectedToken.withArguments('('));
+      openParen = rewriter.insertParens(token, false);
     }
-    Token begin = token.next;
-    token = parseExpressionInParenthesis(token);
-    listener.handleParenthesizedCondition(begin);
+    token = parseExpressionInParenthesisRest(openParen);
+    listener.handleParenthesizedCondition(openParen);
     return token;
   }
 
@@ -4083,7 +4114,10 @@
   }
 
   Token parseExpressionInParenthesis(Token token) {
-    token = token.next;
+    return parseExpressionInParenthesisRest(token.next);
+  }
+
+  Token parseExpressionInParenthesisRest(Token token) {
     assert(optional('(', token));
     BeginToken begin = token;
     token = parseExpression(token);
@@ -4189,12 +4223,54 @@
     return token;
   }
 
+  /// This method parses the portion of a set or map literal that starts with
+  /// the left curly brace when there are no leading type arguments.
+  Token parseLiteralSetOrMapSuffix(final Token start, Token constKeyword) {
+    if (!enableSetLiterals) {
+      // TODO(danrubel): remove this once set literals are permanent
+      return parseLiteralMapSuffix(start, constKeyword);
+    }
+
+    Token leftBrace = start.next;
+    assert(optional('{', leftBrace));
+    if (optional('}', leftBrace.next)) {
+      Token rightBrace = leftBrace.next;
+      listener.handleEmptyLiteralSetOrMap(leftBrace, constKeyword, rightBrace);
+      return rightBrace;
+    }
+
+    bool old = mayParseFunctionExpressions;
+    mayParseFunctionExpressions = true;
+    Token token = parseExpression(leftBrace);
+    mayParseFunctionExpressions = old;
+
+    Token next = token.next;
+    if (optional('}', next)) {
+      listener.handleLiteralSet(1, leftBrace, constKeyword, next);
+      return next;
+    } else if (optional(',', next)) {
+      return parseLiteralSetRest(token, constKeyword, leftBrace);
+    } else {
+      // TODO(danrubel): Consider better recovery
+      // rather than just assuming this is a literal map.
+      Token colon = ensureColon(token);
+
+      final old = mayParseFunctionExpressions;
+      mayParseFunctionExpressions = true;
+      token = parseExpression(colon);
+      mayParseFunctionExpressions = old;
+
+      listener.handleLiteralMapEntry(colon, token.next);
+      return parseLiteralMapRest(token, constKeyword, leftBrace);
+    }
+  }
+
   /// This method parses the portion of a map literal that starts with the left
   /// curly brace.
   ///
   /// ```
   /// mapLiteral:
-  ///   'const'? typeArguments? '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}'
+  ///   'const'? typeArguments? '{' mapLiteralEntry (',' mapLiteralEntry)* ','? '}'
   /// ;
   /// ```
   ///
@@ -4204,27 +4280,42 @@
   Token parseLiteralMapSuffix(Token token, Token constKeyword) {
     Token beginToken = token = token.next;
     assert(optional('{', beginToken));
-    int count = 0;
+    if (optional('}', token.next)) {
+      token = token.next;
+      listener.handleLiteralMap(0, beginToken, constKeyword, token);
+      return token;
+    }
+
+    bool old = mayParseFunctionExpressions;
+    mayParseFunctionExpressions = true;
+    token = parseMapLiteralEntry(token);
+    mayParseFunctionExpressions = old;
+
+    return parseLiteralMapRest(token, constKeyword, beginToken);
+  }
+
+  /// Parse a literal map after the first entry.
+  Token parseLiteralMapRest(Token token, Token constKeyword, Token beginToken) {
+    int count = 1;
     bool old = mayParseFunctionExpressions;
     mayParseFunctionExpressions = true;
     while (true) {
-      if (optional('}', token.next)) {
-        token = token.next;
+      Token next = token.next;
+      Token comma;
+      if (optional(',', next)) {
+        comma = token = next;
+        next = token.next;
+      }
+      if (optional('}', next)) {
+        token = next;
         break;
       }
-      token = parseMapLiteralEntry(token);
-      Token next = token.next;
-      ++count;
-      if (!optional(',', next)) {
-        if (optional('}', next)) {
-          token = next;
-          break;
-        }
+      if (comma == null) {
         // Recovery
         if (looksLikeExpressionStart(next)) {
           // If this looks like the start of an expression,
           // then report an error, insert the comma, and continue parsing.
-          next = rewriteAndRecover(
+          token = rewriteAndRecover(
               token,
               fasta.templateExpectedButGot.withArguments(','),
               new SyntheticToken(TokenType.COMMA, next.offset));
@@ -4236,7 +4327,8 @@
           break;
         }
       }
-      token = next;
+      token = parseMapLiteralEntry(token);
+      ++count;
     }
     assert(optional('}', token));
     mayParseFunctionExpressions = old;
@@ -4244,6 +4336,82 @@
     return token;
   }
 
+  /// This method parses the portion of a set literal that starts with the left
+  /// curly brace.
+  ///
+  /// ```
+  /// setLiteral:
+  ///   'const'?  typeArguments? '{' expression (',' expression)* ','? '}'
+  /// ;
+  /// ```
+  ///
+  /// Provide a [constKeyword] if the literal is preceded by 'const', or `null`
+  /// if not. This is a suffix parser because it is assumed that type arguments
+  /// have been parsed, or `listener.handleNoTypeArguments` has been executed.
+  Token parseLiteralSetSuffix(Token token, Token constKeyword) {
+    if (!enableSetLiterals) {
+      // TODO(danrubel): remove this once set literals are permanent
+      return parseLiteralMapSuffix(token, constKeyword);
+    }
+
+    Token beginToken = token = token.next;
+    assert(optional('{', beginToken));
+    if (optional('}', token.next)) {
+      token = token.next;
+      listener.handleLiteralSet(0, beginToken, constKeyword, token);
+      return token;
+    }
+
+    bool old = mayParseFunctionExpressions;
+    mayParseFunctionExpressions = true;
+    token = parseExpression(token);
+    mayParseFunctionExpressions = old;
+
+    return parseLiteralSetRest(token, constKeyword, beginToken);
+  }
+
+  /// Parse a literal set after the first expression.
+  Token parseLiteralSetRest(Token token, Token constKeyword, Token beginToken) {
+    int count = 1;
+    bool old = mayParseFunctionExpressions;
+    mayParseFunctionExpressions = true;
+    while (true) {
+      Token next = token.next;
+      Token comma;
+      if (optional(',', next)) {
+        comma = token = next;
+        next = token.next;
+      }
+      if (optional('}', next)) {
+        token = next;
+        break;
+      }
+      if (comma == null) {
+        // Recovery
+        if (looksLikeExpressionStart(next)) {
+          // If this looks like the start of an expression,
+          // then report an error, insert the comma, and continue parsing.
+          token = rewriteAndRecover(
+              token,
+              fasta.templateExpectedButGot.withArguments(','),
+              new SyntheticToken(TokenType.COMMA, next.offset));
+        } else {
+          reportRecoverableError(
+              next, fasta.templateExpectedButGot.withArguments('}'));
+          // Scanner guarantees a closing curly bracket
+          token = beginToken.endGroup;
+          break;
+        }
+      }
+      token = parseExpression(token);
+      ++count;
+    }
+    assert(optional('}', token));
+    mayParseFunctionExpressions = old;
+    listener.handleLiteralSet(count, beginToken, constKeyword, token);
+    return token;
+  }
+
   /// formalParameterList functionBody.
   ///
   /// This is a suffix parser because it is assumed that type arguments have
@@ -4286,7 +4454,16 @@
     }
     token = typeParamOrArg.parseArguments(start, this);
     if (optional('{', next)) {
-      return parseLiteralMapSuffix(token, constKeyword);
+      switch (typeParamOrArg.typeArgumentCount) {
+        case 0:
+          return parseLiteralSetOrMapSuffix(token, constKeyword);
+        case 1:
+          return parseLiteralSetSuffix(token, constKeyword);
+        case 2:
+          return parseLiteralMapSuffix(token, constKeyword);
+        default:
+          return parseLiteralSetOrMapSuffix(token, constKeyword);
+      }
     }
     if (!optional('[', next) && !optional('[]', next)) {
       // TODO(danrubel): Improve this error message.
@@ -4304,14 +4481,13 @@
   /// ;
   /// ```
   Token parseMapLiteralEntry(Token token) {
-    listener.beginLiteralMapEntry(token.next);
     // Assume the listener rejects non-string keys.
     // TODO(brianwilkerson): Change the assumption above by moving error
     // checking into the parser, making it possible to recover.
     token = parseExpression(token);
     Token colon = ensureColon(token);
     token = parseExpression(colon);
-    listener.endLiteralMapEntry(colon, token.next);
+    listener.handleLiteralMapEntry(colon, token.next);
     return token;
   }
 
@@ -4324,11 +4500,7 @@
     Token name = beforeName.next;
     if (name.isIdentifier) {
       TypeParamOrArgInfo typeParam = computeTypeParamOrArg(name);
-      Token next = name;
-      if (typeParam != noTypeParamOrArg) {
-        next = typeParam.skip(next);
-      }
-      next = next.next;
+      Token next = typeParam.skip(name).next;
       if (optional('(', next)) {
         if (looksLikeFunctionBody(next.endGroup.next)) {
           return parseFunctionLiteral(
@@ -4339,15 +4511,14 @@
     return parseSend(token, context);
   }
 
-  Token parseRequiredArguments(Token token) {
+  Token ensureArguments(Token token) {
     Token next = token.next;
     if (!optional('(', next)) {
       reportRecoverableError(
-          token, fasta.templateExpectedButGot.withArguments('('));
-      rewriter.insertParens(token, false);
+          token, fasta.templateExpectedAfterButGot.withArguments('('));
+      next = rewriter.insertParens(token, false);
     }
-    token = parseArguments(token);
-    return token;
+    return parseArgumentsRest(next);
   }
 
   Token parseConstructorInvocationArguments(Token token) {
@@ -4357,7 +4528,7 @@
       TypeParamOrArgInfo typeArg = computeTypeParamOrArg(token);
       if (typeArg == noTypeParamOrArg) {
         reportRecoverableError(
-            token, fasta.templateExpectedButGot.withArguments('('));
+            token, fasta.templateExpectedAfterButGot.withArguments('('));
       } else {
         reportRecoverableError(
             token, fasta.messageConstructorWithTypeArguments);
@@ -4366,11 +4537,10 @@
         next = token.next;
       }
       if (!optional('(', next)) {
-        rewriter.insertParens(token, false);
+        next = rewriter.insertParens(token, false);
       }
     }
-    token = parseArguments(token);
-    return token;
+    return parseArgumentsRest(next);
   }
 
   /// ```
@@ -4429,7 +4599,7 @@
     if (identical(value, '{')) {
       listener.beginConstLiteral(next);
       listener.handleNoTypeArguments(next);
-      token = parseLiteralMapSuffix(token, constKeyword);
+      token = parseLiteralSetOrMapSuffix(token, constKeyword);
       listener.endConstLiteral(token.next);
       return token;
     }
@@ -4642,7 +4812,11 @@
   /// ;
   /// ```
   Token parseArguments(Token token) {
-    Token begin = token = token.next;
+    return parseArgumentsRest(token.next);
+  }
+
+  Token parseArgumentsRest(Token token) {
+    Token begin = token;
     assert(optional('(', begin));
     listener.beginArguments(begin);
     int argumentCount = 0;
@@ -4708,11 +4882,26 @@
     if (optional('!', token.next)) {
       not = token = token.next;
     }
-    token = computeType(token, true).ensureTypeNotVoid(token, this);
+    TypeInfo typeInfo = computeTypeAfterIsOrAs(token);
+    token = typeInfo.ensureTypeNotVoid(token, this);
     listener.handleIsOperator(operator, not);
     return skipChainedAsIsOperators(token);
   }
 
+  TypeInfo computeTypeAfterIsOrAs(Token token) {
+    TypeInfo typeInfo = computeType(token, true);
+    if (typeInfo.isNullable) {
+      Token next = typeInfo.skipType(token).next;
+      if (!isOneOfOrEof(next, const [')', '?', ';', 'is', 'as'])) {
+        // TODO(danrubel): investigate other situations
+        // where `?` should be considered part of the type info
+        // rather than the start of a conditional expression.
+        typeInfo = typeInfo.asNonNullable;
+      }
+    }
+    return typeInfo;
+  }
+
   /// ```
   /// typeCast:
   ///   'as' type
@@ -4721,7 +4910,8 @@
   Token parseAsOperatorRest(Token token) {
     Token operator = token = token.next;
     assert(optional('as', operator));
-    token = computeType(token, true).ensureTypeNotVoid(token, this);
+    TypeInfo typeInfo = computeTypeAfterIsOrAs(token);
+    token = typeInfo.ensureTypeNotVoid(token, this);
     listener.handleAsOperator(operator);
     return skipChainedAsIsOperators(token);
   }
@@ -4739,7 +4929,8 @@
       if (optional('!', next.next)) {
         next = next.next;
       }
-      token = computeType(next, true).skipType(next);
+      TypeInfo typeInfo = computeTypeAfterIsOrAs(next);
+      token = typeInfo.skipType(next);
       next = token.next;
       value = next.stringValue;
     }
@@ -4860,6 +5051,7 @@
       TypeInfo typeInfo,
       bool onlyParseVariableDeclarationStart = false]) {
     typeInfo ??= computeType(beforeType, false);
+
     Token token = typeInfo.skipType(beforeType);
     Token next = token.next;
 
@@ -4878,11 +5070,49 @@
             computeTypeParamOrArg(next).parseVariables(next, this);
         listener.beginLocalFunctionDeclaration(start.next);
         token = typeInfo.parseType(beforeType, this);
-        next = token.next;
         return parseNamedFunctionRest(token, start.next, beforeFormals, false);
       }
     }
 
+    if (beforeType == start &&
+        typeInfo.isNullable &&
+        typeInfo.couldBeExpression) {
+      assert(optional('?', token));
+      assert(next.isIdentifier);
+      Token afterIdentifier = next.next;
+      //
+      // found <typeref> `?` <identifier>
+      // with no annotations or modifiers preceeding it
+      //
+      if (optional('=', afterIdentifier)) {
+        //
+        // look past the next expression
+        // to determine if this is part of a conditional expression
+        //
+        final originalListener = listener;
+        listener = new ForwardingListener();
+        // TODO(danrubel): consider using TokenStreamGhostWriter here
+        Token afterExpression =
+            parseExpressionWithoutCascade(afterIdentifier).next;
+        listener = originalListener;
+
+        if (optional(':', afterExpression)) {
+          // Looks like part of a conditional expression.
+          // Drop the type information and reset the last consumed token.
+          typeInfo = noType;
+          token = start;
+          next = token.next;
+        }
+      } else if (!afterIdentifier.isKeyword &&
+          !isOneOfOrEof(afterIdentifier, const [';', ',', ')'])) {
+        // Looks like part of a conditional expression.
+        // Drop the type information and reset the last consumed token.
+        typeInfo = noType;
+        token = start;
+        next = token.next;
+      }
+    }
+
     if (token == start) {
       // If no annotation, modifier, or type, and this is not a local function
       // then this must be an expression statement.
@@ -4892,6 +5122,7 @@
         return parseExpressionStatement(start);
       }
     }
+
     if (next.type.isBuiltIn &&
         beforeType == start &&
         typeInfo.couldBeExpression) {
@@ -4976,7 +5207,7 @@
     Token ifToken = token.next;
     assert(optional('if', ifToken));
     listener.beginIfStatement(ifToken);
-    token = parseParenthesizedCondition(ifToken);
+    token = ensureParenthesizedCondition(ifToken);
     listener.beginThenStatement(token.next);
     token = parseStatement(token);
     listener.endThenStatement(token);
@@ -5062,10 +5293,12 @@
     // or an expression if no local variable declaration was found.
     if (token != leftParenthesis) {
       token = parseVariablesDeclarationRest(token, false);
+      listener.handleForInitializerLocalVariableDeclaration(token);
     } else if (optional(';', token.next)) {
-      listener.handleNoExpression(token.next);
+      listener.handleForInitializerEmptyStatement(token.next);
     } else {
       token = parseExpression(token);
+      listener.handleForInitializerExpressionStatement(token);
     }
 
     Token next = token.next;
@@ -5192,7 +5425,7 @@
     Token whileToken = token.next;
     assert(optional('while', whileToken));
     listener.beginWhileStatement(whileToken);
-    token = parseParenthesizedCondition(whileToken);
+    token = ensureParenthesizedCondition(whileToken);
     listener.beginWhileStatementBody(token.next);
     LoopState savedLoopState = loopState;
     loopState = LoopState.InsideLoop;
@@ -5225,7 +5458,7 @@
       whileToken = rewriter.insertToken(token,
           new SyntheticKeywordToken(Keyword.WHILE, whileToken.charOffset));
     }
-    token = parseParenthesizedCondition(whileToken);
+    token = ensureParenthesizedCondition(whileToken);
     token = ensureSemicolon(token);
     listener.endDoWhileStatement(doToken, whileToken, token);
     return token;
@@ -5482,7 +5715,7 @@
     Token switchKeyword = token.next;
     assert(optional('switch', switchKeyword));
     listener.beginSwitchStatement(switchKeyword);
-    token = parseParenthesizedCondition(switchKeyword);
+    token = ensureParenthesizedCondition(switchKeyword);
     LoopState savedLoopState = loopState;
     if (loopState == LoopState.OutsideLoop) {
       loopState = LoopState.InsideSwitch;
diff --git a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
index 86170d4..9a8b367 100644
--- a/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
+++ b/pkg/front_end/lib/src/fasta/parser/token_stream_rewriter.dart
@@ -37,9 +37,6 @@
   // }
   //
 
-  /// Initialize a newly created re-writer.
-  TokenStreamRewriter();
-
   /// Insert a synthetic open and close parenthesis and return the new synthetic
   /// open parenthesis. If [insertIdentifier] is true, then a synthetic
   /// identifier is included between the open and close parenthesis.
@@ -140,3 +137,70 @@
     return current;
   }
 }
+
+/// Provides the capability of adding tokens that lead into a token stream
+/// without modifying the original token stream and not setting the any token's
+/// `previous` field.
+class TokenStreamGhostWriter implements TokenStreamRewriter {
+  @override
+  Token insertParens(Token token, bool includeIdentifier) {
+    Token next = token.next;
+    int offset = next.charOffset;
+    BeginToken leftParen =
+        next = new SyntheticBeginToken(TokenType.OPEN_PAREN, offset);
+    if (includeIdentifier) {
+      Token identifier =
+          new SyntheticStringToken(TokenType.IDENTIFIER, '', offset, 0);
+      next.next = identifier;
+      next = identifier;
+    }
+    Token rightParen = new SyntheticToken(TokenType.CLOSE_PAREN, offset);
+    next.next = rightParen;
+    rightParen.next = token.next;
+
+    return leftParen;
+  }
+
+  /// Insert a synthetic identifier after [token] and return the new identifier.
+  Token insertSyntheticIdentifier(Token token) {
+    return insertToken(
+        token,
+        new SyntheticStringToken(
+            TokenType.IDENTIFIER, '', token.next.charOffset, 0));
+  }
+
+  @override
+  Token insertToken(Token token, Token newToken) {
+    newToken.next = token.next;
+    return newToken;
+  }
+
+  @override
+  Token moveSynthetic(Token token, Token endGroup) {
+    Token newEndGroup =
+        new SyntheticToken(endGroup.type, token.next.charOffset);
+    newEndGroup.next = token.next;
+    return newEndGroup;
+  }
+
+  @override
+  Token replaceTokenFollowing(Token previousToken, Token replacementToken) {
+    Token replacedToken = previousToken.next;
+
+    (replacementToken as SimpleToken).precedingComments =
+        replacedToken.precedingComments;
+
+    _lastTokenInChain(replacementToken).next = replacedToken.next;
+    return replacementToken;
+  }
+
+  /// Given the [firstToken] in a chain of tokens to be inserted, return the
+  /// last token in the chain.
+  Token _lastTokenInChain(Token firstToken) {
+    Token current = firstToken;
+    while (current.next != null && current.next.type != TokenType.EOF) {
+      current = current.next;
+    }
+    return current;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info.dart b/pkg/front_end/lib/src/fasta/parser/type_info.dart
index b2c407e..8214825 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info.dart
@@ -17,36 +17,43 @@
 /// [TypeInfo] provides information collected by [computeType]
 /// about a particular type reference.
 abstract class TypeInfo {
+  /// Return type info representing the receiver without the trailing `?`
+  /// or the receiver if the receiver does not represent a nullable type.
+  TypeInfo get asNonNullable;
+
   /// Return `true` if the tokens comprising the type represented by the
   /// receiver could be interpreted as a valid standalone expression.
-  /// For example, `A` or `A.b` could be interpreted as a type references
-  /// or as expressions, while `A<T>` only looks like a type reference.
+  /// For example, `A` or `A.b` could be interpreted as type references
+  /// or expressions, while `A<T>` only looks like a type reference.
   bool get couldBeExpression;
 
+  /// Return true if the receiver has a trailing `?`.
+  bool get isNullable;
+
   /// Call this function when the token after [token] must be a type (not void).
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type, inserting a synthetic type reference if
-  /// necessary. This may modify the token stream when parsing `>>` in valid
-  /// code or during recovery.
+  /// necessary. This may modify the token stream when parsing `>>` or `>>>`
+  /// in valid code or during recovery.
   Token ensureTypeNotVoid(Token token, Parser parser);
 
   /// Call this function when the token after [token] must be a type or void.
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type, inserting a synthetic type reference if
-  /// necessary. This may modify the token stream when parsing `>>` in valid
-  /// code or during recovery.
+  /// necessary. This may modify the token stream when parsing `>>` or `>>>`
+  /// in valid code or during recovery.
   Token ensureTypeOrVoid(Token token, Parser parser);
 
   /// Call this function to parse an optional type (not void) after [token].
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type. This may modify the token stream
-  /// when parsing `>>` in valid code or during recovery.
+  /// when parsing `>>` or `>>>` in valid code or during recovery.
   Token parseTypeNotVoid(Token token, Parser parser);
 
   /// Call this function to parse an optional type or void after [token].
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the type. This may modify the token stream
-  /// when parsing `>>` in valid code or during recovery.
+  /// when parsing `>>` or `>>>` in valid code or during recovery.
   Token parseType(Token token, Parser parser);
 
   /// Call this function with the [token] before the type to obtain
@@ -64,6 +71,9 @@
   /// Return `true` if the receiver represents a single type argument
   bool get isSimpleTypeArgument => false;
 
+  /// Return the number of type arguments
+  int get typeArgumentCount;
+
   /// Return the simple type associated with this simple type argument
   /// or throw an exception if this is not a simple type argument.
   TypeInfo get typeInfo {
@@ -73,14 +83,14 @@
   /// Call this function to parse optional type arguments after [token].
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the arguments. This may modify the token stream
-  /// when parsing `>>` in valid code or during recovery.
+  /// when parsing `>>` or `>>>` in valid code or during recovery.
   Token parseArguments(Token token, Parser parser);
 
   /// Call this function to parse optional type parameters
   /// (also known as type variables) after [token].
   /// This function will call the appropriate event methods on the [Parser]'s
   /// listener to handle the parameters. This may modify the token stream
-  /// when parsing `>>` in valid code or during recovery.
+  /// when parsing `>>` or `>>>` in valid code or during recovery.
   Token parseVariables(Token token, Parser parser);
 
   /// Call this function with the [token] before the type var to obtain
@@ -180,7 +190,7 @@
   if (isGeneralizedFunctionType(next)) {
     // `Function` ...
     return new ComplexTypeInfo(token, noTypeParamOrArg)
-        .computeNoTypeGFT(required);
+        .computeNoTypeGFT(token, required);
   }
 
   // We've seen an identifier.
@@ -191,14 +201,24 @@
     if (typeParamOrArg.isSimpleTypeArgument) {
       // We've seen identifier `<` identifier `>`
       next = typeParamOrArg.skip(next).next;
-      if (!isGeneralizedFunctionType(next)) {
+      if (optional('?', next)) {
+        next = next.next;
+        if (!isGeneralizedFunctionType(next)) {
+          if ((required || looksLikeName(next)) &&
+              typeParamOrArg == simpleTypeArgument1) {
+            // identifier `<` identifier `>` `?` identifier
+            return simpleNullableTypeWith1Argument;
+          }
+          // identifier `<` identifier `>` `?` non-identifier
+          return noType;
+        }
+      } else if (!isGeneralizedFunctionType(next)) {
         if (required || looksLikeName(next)) {
           // identifier `<` identifier `>` identifier
           return typeParamOrArg.typeInfo;
-        } else {
-          // identifier `<` identifier `>` non-identifier
-          return noType;
         }
+        // identifier `<` identifier `>` non-identifier
+        return noType;
       }
     }
     // TODO(danrubel): Consider adding a const for
@@ -218,14 +238,29 @@
       // We've seen identifier `.` identifier
       typeParamOrArg = computeTypeParamOrArg(next, inDeclaration);
       next = next.next;
-      if (typeParamOrArg == noTypeParamOrArg &&
-          !isGeneralizedFunctionType(next)) {
-        if (required || looksLikeName(next)) {
-          // identifier `.` identifier identifier
-          return prefixedType;
+      if (typeParamOrArg == noTypeParamOrArg) {
+        if (optional('?', next)) {
+          next = next.next;
+          if (!isGeneralizedFunctionType(next)) {
+            if (required || looksLikeName(next)) {
+              // identifier `.` identifier `?` identifier
+              // TODO(danrubel): consider adding PrefixedNullableType
+              // Fall through to build complex type
+            } else {
+              // identifier `.` identifier `?` non-identifier
+              return noType;
+            }
+          }
         } else {
-          // identifier `.` identifier non-identifier
-          return noType;
+          if (!isGeneralizedFunctionType(next)) {
+            if (required || looksLikeName(next)) {
+              // identifier `.` identifier identifier
+              return prefixedType;
+            } else {
+              // identifier `.` identifier non-identifier
+              return noType;
+            }
+          }
         }
       }
       // identifier `.` identifier
@@ -248,7 +283,17 @@
         .computeIdentifierGFT(required);
   }
 
-  if (required || looksLikeName(next)) {
+  if (optional('?', next)) {
+    next = next.next;
+    if (isGeneralizedFunctionType(next)) {
+      // identifier `?` Function `(`
+      return new ComplexTypeInfo(token, noTypeParamOrArg)
+          .computeIdentifierQuestionGFT(required);
+    } else if (required || looksLikeName(next)) {
+      // identifier `?`
+      return simpleNullableType;
+    }
+  } else if (required || looksLikeName(next)) {
     // identifier identifier
     return simpleType;
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index e76bcff..6d670a1 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -30,6 +30,7 @@
         skipMetadata,
         splitGtEq,
         splitGtFromGtGtEq,
+        splitGtFromGtGtGt,
         splitGtGt,
         syntheticGt;
 
@@ -37,6 +38,10 @@
 /// when there is a single identifier as the type reference.
 const TypeInfo simpleType = const SimpleType();
 
+/// [SimpleNullableType] is a specialized [TypeInfo] returned by [computeType]
+/// when there is a single identifier followed by `?` as the type reference.
+const TypeInfo simpleNullableType = const SimpleNullableType();
+
 /// [PrefixedType] is a specialized [TypeInfo] returned by [computeType]
 /// when the type reference is of the form: identifier `.` identifier.
 const TypeInfo prefixedType = const PrefixedType();
@@ -59,6 +64,12 @@
 const TypeInfo simpleTypeWith1ArgumentGtGt =
     const SimpleTypeWith1Argument(simpleTypeArgument1GtGt);
 
+/// [SimpleNullableTypeWith1Argument] is a specialized [TypeInfo] returned by
+/// [computeType] when the type reference is of the form:
+/// identifier `<` identifier `>` `?`.
+const TypeInfo simpleNullableTypeWith1Argument =
+    const SimpleNullableTypeWith1Argument();
+
 /// [SimpleTypeArgument1] is a specialized [TypeParamOrArgInfo] returned by
 /// [computeTypeParamOrArg] when the type reference is of the form:
 /// `<` identifier `>`.
@@ -81,9 +92,15 @@
   const NoType();
 
   @override
+  TypeInfo get asNonNullable => this;
+
+  @override
   bool get couldBeExpression => false;
 
   @override
+  bool get isNullable => false;
+
+  @override
   Token ensureTypeNotVoid(Token token, Parser parser) {
     parser.reportRecoverableErrorWithToken(
         token.next, fasta.templateExpectedType);
@@ -116,9 +133,15 @@
   const PrefixedType();
 
   @override
+  TypeInfo get asNonNullable => this;
+
+  @override
   bool get couldBeExpression => true;
 
   @override
+  bool get isNullable => false;
+
+  @override
   Token ensureTypeNotVoid(Token token, Parser parser) =>
       parseType(token, parser);
 
@@ -147,7 +170,7 @@
     listener.handleQualified(period);
 
     listener.handleNoTypeArguments(token.next);
-    listener.handleType(start);
+    listener.handleType(start, null);
     return token;
   }
 
@@ -157,6 +180,32 @@
   }
 }
 
+/// See documentation on the [simpleNullableTypeWith1Argument] const.
+class SimpleNullableTypeWith1Argument extends SimpleTypeWith1Argument {
+  const SimpleNullableTypeWith1Argument() : super(simpleTypeArgument1);
+
+  @override
+  TypeInfo get asNonNullable => simpleTypeWith1Argument;
+
+  @override
+  bool get isNullable => true;
+
+  @override
+  Token parseTypeRest(Token start, Token token, Parser parser) {
+    token = token.next;
+    assert(optional('?', token));
+    parser.listener.handleType(start, token);
+    return token;
+  }
+
+  @override
+  Token skipType(Token token) {
+    token = super.skipType(token).next;
+    assert(optional('?', token));
+    return token;
+  }
+}
+
 /// See documentation on the [simpleTypeWith1Argument] const.
 class SimpleTypeWith1Argument implements TypeInfo {
   final TypeParamOrArgInfo typeArg;
@@ -164,9 +213,15 @@
   const SimpleTypeWith1Argument(this.typeArg);
 
   @override
+  TypeInfo get asNonNullable => this;
+
+  @override
   bool get couldBeExpression => false;
 
   @override
+  bool get isNullable => false;
+
+  @override
   Token ensureTypeNotVoid(Token token, Parser parser) =>
       parseType(token, parser);
 
@@ -182,10 +237,13 @@
   Token parseType(Token token, Parser parser) {
     Token start = token = token.next;
     assert(token.isKeywordOrIdentifier);
-    Listener listener = parser.listener;
-    listener.handleIdentifier(token, IdentifierContext.typeReference);
+    parser.listener.handleIdentifier(token, IdentifierContext.typeReference);
     token = typeArg.parseArguments(token, parser);
-    listener.handleType(start);
+    return parseTypeRest(start, token, parser);
+  }
+
+  Token parseTypeRest(Token start, Token token, Parser parser) {
+    parser.listener.handleType(start, null);
     return token;
   }
 
@@ -197,14 +255,44 @@
   }
 }
 
+/// See documentation on the [simpleNullableType] const.
+class SimpleNullableType extends SimpleType {
+  const SimpleNullableType();
+
+  @override
+  TypeInfo get asNonNullable => simpleType;
+
+  @override
+  bool get isNullable => true;
+
+  @override
+  Token parseTypeRest(Token start, Parser parser) {
+    Token token = start.next;
+    assert(optional('?', token));
+    parser.listener.handleType(start, token);
+    return token;
+  }
+
+  @override
+  Token skipType(Token token) {
+    return token.next.next;
+  }
+}
+
 /// See documentation on the [simpleType] const.
 class SimpleType implements TypeInfo {
   const SimpleType();
 
   @override
+  TypeInfo get asNonNullable => this;
+
+  @override
   bool get couldBeExpression => true;
 
   @override
+  bool get isNullable => false;
+
+  @override
   Token ensureTypeNotVoid(Token token, Parser parser) =>
       parseType(token, parser);
 
@@ -220,10 +308,13 @@
   Token parseType(Token token, Parser parser) {
     token = token.next;
     assert(isValidTypeReference(token));
-    Listener listener = parser.listener;
-    listener.handleIdentifier(token, IdentifierContext.typeReference);
+    parser.listener.handleIdentifier(token, IdentifierContext.typeReference);
     token = noTypeParamOrArg.parseArguments(token, parser);
-    listener.handleType(token);
+    return parseTypeRest(token, parser);
+  }
+
+  Token parseTypeRest(Token token, Parser parser) {
+    parser.listener.handleType(token, null);
     return token;
   }
 
@@ -238,9 +329,15 @@
   const VoidType();
 
   @override
+  TypeInfo get asNonNullable => this;
+
+  @override
   bool get couldBeExpression => false;
 
   @override
+  bool get isNullable => false;
+
+  @override
   Token ensureTypeNotVoid(Token token, Parser parser) {
     // Report an error, then parse `void` as if it were a type name.
     parser.reportRecoverableError(token.next, fasta.messageInvalidVoid);
@@ -300,6 +397,11 @@
   /// Type arguments were seen during analysis.
   final TypeParamOrArgInfo typeArguments;
 
+  /// The token before the trailing question mark or `null` if either
+  /// 1) there is no trailing question mark, or
+  /// 2) the trailing question mark is not part of the type reference.
+  Token beforeQuestionMark;
+
   /// The last token in the type reference.
   Token end;
 
@@ -312,10 +414,27 @@
   bool gftHasReturnType;
 
   ComplexTypeInfo(Token beforeStart, this.typeArguments)
-      : this.start = beforeStart.next;
+      : this.start = beforeStart.next {
+    assert(typeArguments != null);
+  }
+
+  ComplexTypeInfo._nonNullable(this.start, this.typeArguments, this.end,
+      this.typeVariableStarters, this.gftHasReturnType);
 
   @override
-  bool get couldBeExpression => false;
+  TypeInfo get asNonNullable {
+    return beforeQuestionMark == null
+        ? this
+        : new ComplexTypeInfo._nonNullable(start, typeArguments,
+            beforeQuestionMark, typeVariableStarters, gftHasReturnType);
+  }
+
+  @override
+  bool get couldBeExpression =>
+      typeArguments == noTypeParamOrArg && typeVariableStarters.isEmpty;
+
+  @override
+  bool get isNullable => beforeQuestionMark != null;
 
   @override
   Token ensureTypeNotVoid(Token token, Parser parser) =>
@@ -371,7 +490,17 @@
           }
         }
         token = typeArguments.parseArguments(token, parser);
-        parser.listener.handleType(typeRefOrPrefix);
+
+        // Only consume the `?` if it is part of the complex type
+        Token questionMark = token.next;
+        if (optional('?', questionMark) &&
+            (typeVariableEndGroups.isNotEmpty || beforeQuestionMark != null)) {
+          token = questionMark;
+        } else {
+          questionMark = null;
+        }
+
+        parser.listener.handleType(typeRefOrPrefix, questionMark);
       }
     }
 
@@ -380,15 +509,26 @@
       token = token.next;
       assert(optional('Function', token));
       Token functionToken = token;
+
       if (optional("<", token.next)) {
         // Skip type parameters, they were parsed above.
         token = typeVariableEndGroups[endGroupIndex];
         assert(optional('>', token));
       }
-      --endGroupIndex;
       token = parser.parseFormalParametersRequiredOpt(
           token, MemberKind.GeneralizedFunctionType);
-      parser.listener.endFunctionType(functionToken);
+
+      // Only consume the `?` if it is part of the complex type
+      Token questionMark = token.next;
+      if (optional('?', questionMark) &&
+          (endGroupIndex > 0 || beforeQuestionMark != null)) {
+        token = questionMark;
+      } else {
+        questionMark = null;
+      }
+
+      --endGroupIndex;
+      parser.listener.endFunctionType(functionToken, questionMark);
     }
 
     // There are two situations in which the [token] != [end]:
@@ -411,10 +551,11 @@
 
   /// Given `Function` non-identifier, compute the type
   /// and return the receiver or one of the [TypeInfo] constants.
-  TypeInfo computeNoTypeGFT(bool required) {
+  TypeInfo computeNoTypeGFT(Token beforeStart, bool required) {
     assert(optional('Function', start));
+    assert(beforeStart.next == start);
 
-    computeRest(start, required);
+    computeRest(beforeStart, required);
     if (gftHasReturnType == null) {
       return required ? simpleType : noType;
     }
@@ -428,7 +569,7 @@
     assert(optional('void', start));
     assert(optional('Function', start.next));
 
-    computeRest(start.next, required);
+    computeRest(start, required);
     if (gftHasReturnType == null) {
       return voidType;
     }
@@ -442,7 +583,7 @@
     assert(isValidTypeReference(start));
     assert(optional('Function', start.next));
 
-    computeRest(start.next, required);
+    computeRest(start, required);
     if (gftHasReturnType == null) {
       return simpleType;
     }
@@ -450,13 +591,28 @@
     return this;
   }
 
+  /// Given identifier `?` `Function` non-identifier, compute the type
+  /// and return the receiver or one of the [TypeInfo] constants.
+  TypeInfo computeIdentifierQuestionGFT(bool required) {
+    assert(isValidTypeReference(start));
+    assert(optional('?', start.next));
+    assert(optional('Function', start.next.next));
+
+    computeRest(start, required);
+    if (gftHasReturnType == null) {
+      return simpleNullableType;
+    }
+    assert(end != null);
+    return this;
+  }
+
   /// Given a builtin, return the receiver so that parseType will report
   /// an error for the builtin used as a type.
   TypeInfo computeBuiltinOrVarAsType(bool required) {
     assert(start.type.isBuiltIn || optional('var', start));
 
     end = typeArguments.skip(start);
-    computeRest(end.next, required);
+    computeRest(end, required);
     assert(end != null);
     return this;
   }
@@ -469,7 +625,7 @@
     assert(typeArguments != noTypeParamOrArg);
 
     end = typeArguments.skip(start);
-    computeRest(end.next, required);
+    computeRest(end, required);
 
     if (!required && !looksLikeName(end.next) && gftHasReturnType == null) {
       return noType;
@@ -493,7 +649,7 @@
     }
 
     end = typeArguments.skip(token);
-    computeRest(end.next, required);
+    computeRest(end, required);
     if (!required && !looksLikeName(end.next) && gftHasReturnType == null) {
       return noType;
     }
@@ -502,6 +658,11 @@
   }
 
   void computeRest(Token token, bool required) {
+    if (optional('?', token.next)) {
+      beforeQuestionMark = token;
+      end = token = token.next;
+    }
+    token = token.next;
     while (optional('Function', token)) {
       Token typeVariableStart = token;
       // TODO(danrubel): Consider caching TypeParamOrArgInfo
@@ -515,15 +676,27 @@
         break; // Not a function type.
       }
       if (!required) {
-        if (!(token.next.isIdentifier || optional('this', token.next))) {
+        Token next = token.next;
+        if (optional('?', next)) {
+          next = next.next;
+        }
+        if (!(next.isIdentifier || optional('this', next))) {
           break; // `Function` used as the name in a function declaration.
         }
       }
       assert(optional(')', token));
       gftHasReturnType ??= typeVariableStart != start;
       typeVariableStarters = typeVariableStarters.prepend(typeVariableStart);
+
+      beforeQuestionMark = null;
       end = token;
       token = token.next;
+
+      if (optional('?', token)) {
+        beforeQuestionMark = end;
+        end = token;
+        token = token.next;
+      }
     }
   }
 }
@@ -533,6 +706,9 @@
   const NoTypeParamOrArg();
 
   @override
+  int get typeArgumentCount => 0;
+
+  @override
   Token parseArguments(Token token, Parser parser) {
     parser.listener.handleNoTypeArguments(token.next);
     return token;
@@ -555,6 +731,9 @@
   bool get isSimpleTypeArgument => true;
 
   @override
+  int get typeArgumentCount => 1;
+
+  @override
   TypeInfo get typeInfo => simpleTypeWith1Argument;
 
   @override
@@ -664,6 +843,9 @@
   /// given unbalanced `<` `>` and invalid parameters or arguments.
   final bool inDeclaration;
 
+  @override
+  int typeArgumentCount;
+
   /// The `>` token which ends the type parameter or argument.
   /// This closer may be synthetic, points to the next token in the stream,
   /// is only used when skipping over the type parameters or arguments,
@@ -681,6 +863,7 @@
   TypeParamOrArgInfo compute() {
     Token token;
     Token next = start;
+    typeArgumentCount = 0;
     while (true) {
       TypeInfo typeInfo = computeType(next, true, inDeclaration);
       if (typeInfo == noType) {
@@ -701,6 +884,7 @@
         assert(typeInfo != noType || optional(',', next.next));
         // Fall through to process type (if any) and consume `,`
       }
+      ++typeArgumentCount;
       token = typeInfo.skipType(next);
       next = token.next;
       if (optional('extends', next)) {
@@ -979,16 +1163,17 @@
   }
 }
 
-/// Return `true` if [token] is one of `>`, `>>`, `>=', or `>>=`.
+/// Return `true` if [token] is one of `>`, `>>`, `>=`, `>>>`, or `>>=`.
 bool isCloser(Token token) {
   final value = token.stringValue;
   return identical(value, '>') ||
       identical(value, '>>') ||
       identical(value, '>=') ||
+      identical(value, '>>>') ||
       identical(value, '>>=');
 }
 
-/// If [beforeCloser].next is one of `>`, `>>`, `>=', or `>>=`,
+/// If [beforeCloser].next is one of `>`, `>>`, `>=`, `>>>`, or `>>=`,
 /// then update the token stream and return `true`.
 bool parseCloser(Token beforeCloser) {
   Token unsplit = beforeCloser.next;
@@ -1004,7 +1189,7 @@
 }
 
 /// If [closer] is `>` then return it.
-/// If [closer] is one of `>>`, `>=', or `>>=` then split then token
+/// If [closer] is one of `>>`, `>=`, `>>>`, or `>>=` then split then token
 /// and return the leading `>` without updating the token stream.
 /// If [closer] is none of the above, then return null;
 Token splitCloser(Token closer) {
@@ -1015,6 +1200,8 @@
     return splitGtGt(closer);
   } else if (identical(value, '>=')) {
     return splitGtEq(closer);
+  } else if (identical(value, '>>>')) {
+    return splitGtFromGtGtGt(closer);
   } else if (identical(value, '>>=')) {
     return splitGtFromGtGtEq(closer);
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/util.dart b/pkg/front_end/lib/src/fasta/parser/util.dart
index 50937cb6..e02385f 100644
--- a/pkg/front_end/lib/src/fasta/parser/util.dart
+++ b/pkg/front_end/lib/src/fasta/parser/util.dart
@@ -178,6 +178,18 @@
       ..next = token.next);
 }
 
+/// Split `>>>` into two separate tokens... `>` followed by `>>`.
+/// Call [Token.setNext] to add the token to the stream.
+Token splitGtFromGtGtGt(Token token) {
+  assert(optional('>>>', token));
+  return new SimpleToken(
+      TokenType.GT, token.charOffset, token.precedingComments)
+    ..setNext(new SimpleToken(TokenType.GT_GT, token.charOffset + 1)
+      // Set next rather than calling Token.setNext
+      // so that the previous token is not set.
+      ..next = token.next);
+}
+
 /// Return a synthetic `<` followed by [next].
 /// Call [Token.setNext] to add the token to the stream.
 Token syntheticGt(Token next) {
diff --git a/pkg/front_end/lib/src/fasta/scanner.dart b/pkg/front_end/lib/src/fasta/scanner.dart
index 8e24f03..f276eda 100644
--- a/pkg/front_end/lib/src/fasta/scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner.dart
@@ -83,12 +83,16 @@
 /// Scan/tokenize the given [source].
 /// If [recover] is null, then the [defaultRecoveryStrategy] is used.
 ScannerResult scanString(String source,
-    {bool includeComments: false,
+    {bool enableGtGtGt: false,
+    bool includeComments: false,
     bool scanLazyAssignmentOperators: false,
     Recover recover}) {
+  // TODO(brianwilkerson): Remove the parameter `enableGtGtGt` after the feature
+  // has been anabled by default.
   assert(source != null, 'source must not be null');
   StringScanner scanner =
       new StringScanner(source, includeComments: includeComments);
+  scanner.enableGtGtGt = enableGtGtGt;
   return _tokenizeAndRecover(scanner, recover, source: source);
 }
 
diff --git a/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
index 55266e8..6ac7640 100644
--- a/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
@@ -44,6 +44,11 @@
 
   final bool includeComments;
 
+  /// Experimental flag for enabling parsing of `>>>`.
+  /// See https://github.com/dart-lang/language/issues/61
+  /// and https://github.com/dart-lang/language/issues/60
+  bool enableGtGtGt = false;
+
   /**
    * The string offset for the next token that will be created.
    *
@@ -638,7 +643,7 @@
   }
 
   int tokenizeGreaterThan(int next) {
-    // > >= >> >>=
+    // > >= >> >>= >>>
     next = advance();
     if (identical($EQ, next)) {
       appendPrecedenceToken(TokenType.GT_EQ);
@@ -648,6 +653,9 @@
       if (identical($EQ, next)) {
         appendPrecedenceToken(TokenType.GT_GT_EQ);
         return advance();
+      } else if (enableGtGtGt && identical($GT, next)) {
+        appendPrecedenceToken(TokenType.GT_GT_GT);
+        return advance();
       } else {
         appendGtGt(TokenType.GT_GT);
         return next;
diff --git a/pkg/front_end/lib/src/fasta/scanner/token_constants.dart b/pkg/front_end/lib/src/fasta/scanner/token_constants.dart
index 14a99e9..6ac1842 100644
--- a/pkg/front_end/lib/src/fasta/scanner/token_constants.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/token_constants.dart
@@ -86,3 +86,4 @@
 const int QUESTION_QUESTION_EQ_TOKEN = QUESTION_QUESTION_TOKEN + 1;
 const int GENERIC_METHOD_TYPE_ASSIGN_TOKEN = QUESTION_QUESTION_EQ_TOKEN + 1;
 const int GENERIC_METHOD_TYPE_LIST_TOKEN = GENERIC_METHOD_TYPE_ASSIGN_TOKEN + 1;
+const int GT_GT_GT_TOKEN = GENERIC_METHOD_TYPE_LIST_TOKEN + 1;
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index a8d2025..b7c8584 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -4,7 +4,8 @@
 
 library fasta.scope;
 
-import 'builder/builder.dart' show Declaration, TypeVariableBuilder;
+import 'builder/builder.dart'
+    show Declaration, NameIterator, TypeVariableBuilder;
 
 import 'fasta_codes.dart'
     show
@@ -28,13 +29,14 @@
   /// level scope.
   Scope parent;
 
-  final String debugName;
+  final String classNameOrDebugName;
 
-  MutableScope(this.local, this.setters, this.parent, this.debugName) {
-    assert(debugName != null);
+  MutableScope(
+      this.local, this.setters, this.parent, this.classNameOrDebugName) {
+    assert(classNameOrDebugName != null);
   }
 
-  String toString() => "Scope($debugName, ${local.keys})";
+  String toString() => "Scope($classNameOrDebugName, ${local.keys})";
 }
 
 class Scope extends MutableScope {
@@ -67,6 +69,14 @@
             <String, Declaration>{}, <String, Declaration>{}, parent, debugName,
             isModifiable: isModifiable);
 
+  Iterator<Declaration> get iterator {
+    return new ScopeLocalDeclarationIterator(this);
+  }
+
+  NameIterator get nameIterator {
+    return new ScopeLocalDeclarationNameIterator(this);
+  }
+
   Scope copyWithParent(Scope parent, String debugName) {
     return new Scope(super.local, super.setters, parent, debugName,
         isModifiable: isModifiable);
@@ -128,7 +138,8 @@
     Declaration builder = map[name];
     if (builder == null) return null;
     if (builder.next != null) {
-      return new AmbiguousBuilder(name, builder, charOffset, fileUri);
+      return new AmbiguousBuilder(name.isEmpty ? classNameOrDebugName : name,
+          builder, charOffset, fileUri);
     } else if (!isInstanceScope && builder.isInstanceMember) {
       return null;
     } else {
@@ -363,3 +374,74 @@
     return declaration;
   }
 }
+
+class ScopeLocalDeclarationIterator implements Iterator<Declaration> {
+  Iterator<Declaration> local;
+  final Iterator<Declaration> setters;
+  Declaration current;
+
+  ScopeLocalDeclarationIterator(Scope scope)
+      : local = scope.local.values.iterator,
+        setters = scope.setters.values.iterator;
+
+  bool moveNext() {
+    Declaration next = current?.next;
+    if (next != null) {
+      current = next;
+      return true;
+    }
+    if (local != null) {
+      if (local.moveNext()) {
+        current = local.current;
+        return true;
+      }
+      local = null;
+    }
+    if (setters.moveNext()) {
+      current = setters.current;
+      return true;
+    } else {
+      current = null;
+      return false;
+    }
+  }
+}
+
+class ScopeLocalDeclarationNameIterator extends ScopeLocalDeclarationIterator
+    implements NameIterator {
+  Iterator<String> localNames;
+  final Iterator<String> setterNames;
+
+  String name;
+
+  ScopeLocalDeclarationNameIterator(Scope scope)
+      : localNames = scope.local.keys.iterator,
+        setterNames = scope.setters.keys.iterator,
+        super(scope);
+
+  bool moveNext() {
+    Declaration next = current?.next;
+    if (next != null) {
+      current = next;
+      return true;
+    }
+    if (local != null) {
+      if (local.moveNext()) {
+        localNames.moveNext();
+        current = local.current;
+        name = localNames.current;
+        return true;
+      }
+      localNames = null;
+    }
+    if (setters.moveNext()) {
+      setterNames.moveNext();
+      current = setters.current;
+      name = setterNames.current;
+      return true;
+    } else {
+      current = null;
+      return false;
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 7d3c35b..276b0c3 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -148,7 +148,7 @@
   }
 
   @override
-  void handleType(Token beginToken) {
+  void handleType(Token beginToken, Token questionMark) {
     debugEvent("Type");
     discard(1);
   }
@@ -223,7 +223,7 @@
   }
 
   @override
-  void endFunctionType(Token functionToken) {
+  void endFunctionType(Token functionToken, Token questionMark) {
     debugEvent("FunctionType");
     discard(1);
   }
@@ -590,9 +590,8 @@
     // Note: we set thisType regardless of whether we are building a static
     // member, since that provides better error recovery.
     InterfaceType thisType = currentClass?.target?.thisType;
-    var typeInferrer = library.disableTypeInference
-        ? typeInferenceEngine.createDisabledTypeInferrer()
-        : typeInferenceEngine.createLocalTypeInferrer(uri, thisType, library);
+    var typeInferrer =
+        typeInferenceEngine?.createLocalTypeInferrer(uri, thisType, library);
     ConstantContext constantContext = builder.isConstructor && builder.isConst
         ? ConstantContext.inferred
         : ConstantContext.none;
@@ -895,16 +894,19 @@
       Declaration nearestDeclaration;
       int minDistance = -1;
       do {
-        // [distance] will always be non-negative as we ensure [token] is
-        // always at the beginning of the declaration. The minimum distance
-        // will often be larger than 0, for example, in a class declaration
-        // where [token] will point to `abstract` or `class`, but the
-        // declaration's offset points to the name of the class.
-        int distance = declaration.charOffset - offset;
-        if (distance >= 0) {
-          if (minDistance == -1 || distance < minDistance) {
-            minDistance = distance;
-            nearestDeclaration = declaration;
+        // Only look at declarations from this file (part).
+        if (uri == declaration.fileUri) {
+          // [distance] will always be non-negative as we ensure [token] is
+          // always at the beginning of the declaration. The minimum distance
+          // will often be larger than 0, for example, in a class declaration
+          // where [token] will point to `abstract` or `class`, but the
+          // declaration's offset points to the name of the class.
+          int distance = declaration.charOffset - offset;
+          if (distance >= 0) {
+            if (minDistance == -1 || distance < minDistance) {
+              minDistance = distance;
+              nearestDeclaration = declaration;
+            }
           }
         }
         declaration = declaration.next;
diff --git a/pkg/front_end/lib/src/fasta/source/diet_parser.dart b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
index 9f1bc91..bc98715 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_parser.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
@@ -12,7 +12,7 @@
 class DietParser extends ClassMemberParser {
   DietParser(Listener listener) : super(listener);
 
-  Token parseFormalParameters(Token token, MemberKind kind) {
-    return skipFormalParameters(token, kind);
+  Token parseFormalParametersRest(Token token, MemberKind kind) {
+    return skipFormalParametersRest(token, kind);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 5b1f67f..d5c1cd8 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -961,8 +961,9 @@
   }
 
   @override
-  void handleType(Token beginToken) {
+  void handleType(Token beginToken, Token questionMark) {
     debugEvent("Type");
+    reportErrorIfNullableType(questionMark);
     List<TypeBuilder> arguments = pop();
     int charOffset = pop();
     Object name = pop();
@@ -1183,8 +1184,9 @@
   }
 
   @override
-  void endFunctionType(Token functionToken) {
+  void endFunctionType(Token functionToken, Token questionMark) {
     debugEvent("FunctionType");
+    reportErrorIfNullableType(questionMark);
     List<FormalParameterBuilder> formals = pop();
     pop(); // formals offset
     TypeBuilder returnType = pop();
@@ -1303,6 +1305,7 @@
     List<FieldInfo> fieldInfos = new List<FieldInfo>(count);
     bool isParserRecovery = false;
     for (int i = count - 1; i != -1; i--) {
+      int charEndOffset = pop();
       Token beforeLast = pop();
       Token initializerTokenForInference = pop();
       int charOffset = pop();
@@ -1310,8 +1313,8 @@
       if (name is ParserRecovery) {
         isParserRecovery = true;
       } else {
-        fieldInfos[i] = new FieldInfo(
-            name, charOffset, initializerTokenForInference, beforeLast);
+        fieldInfos[i] = new FieldInfo(name, charOffset,
+            initializerTokenForInference, beforeLast, charEndOffset);
       }
     }
     return isParserRecovery ? null : fieldInfos;
@@ -1506,11 +1509,14 @@
       // the tokens for the expression.
       // TODO(ahe): Might be clearer if this search was moved to
       // `library.addFields`.
+      // TODO(ahe): I don't even think this is necessary. [token] points to ;
+      // or , and we don't otherwise store tokens.
       beforeLast = next;
       next = next.next;
     }
     push(assignmentOperator.next);
     push(beforeLast);
+    push(token.charOffset);
   }
 
   @override
@@ -1518,6 +1524,7 @@
     debugEvent("NoFieldInitializer");
     push(NullValue.FieldInitializer);
     push(NullValue.FieldInitializer);
+    push(token.charOffset);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index b8e875c..bfcb069 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -5,7 +5,7 @@
 library fasta.source_class_builder;
 
 import 'package:kernel/ast.dart'
-    show Class, Constructor, Member, Supertype, TreeNode, setParents;
+    show Class, Constructor, Member, Supertype, TreeNode;
 
 import '../../base/instrumentation.dart' show Instrumentation;
 
@@ -24,13 +24,14 @@
 
 import '../kernel/kernel_builder.dart'
     show
+        ClassBuilder,
         ConstructorReferenceBuilder,
         Declaration,
-        FieldBuilder,
         KernelClassBuilder,
         KernelFieldBuilder,
         KernelFunctionBuilder,
         KernelLibraryBuilder,
+        KernelNamedTypeBuilder,
         KernelTypeBuilder,
         KernelTypeVariableBuilder,
         LibraryBuilder,
@@ -51,7 +52,11 @@
     int startCharOffset,
     int charOffset,
     int charEndOffset) {
-  cls ??= new ShadowClass(name: name);
+  cls ??= new ShadowClass(
+      name: name,
+      typeParameters:
+          KernelTypeVariableBuilder.kernelTypeParametersFromBuilders(
+              typeVariables));
   cls.fileUri ??= parent.fileUri;
   if (cls.startFileOffset == TreeNode.noOffset) {
     cls.startFileOffset = startCharOffset;
@@ -63,17 +68,11 @@
     cls.fileEndOffset = charEndOffset;
   }
 
-  if (typeVariables != null) {
-    for (KernelTypeVariableBuilder t in typeVariables) {
-      cls.typeParameters.add(t.parameter);
-    }
-    setParents(cls.typeParameters, cls);
-  }
-
   return cls;
 }
 
-class SourceClassBuilder extends KernelClassBuilder {
+class SourceClassBuilder extends KernelClassBuilder
+    implements Comparable<SourceClassBuilder> {
   @override
   final Class actualCls;
 
@@ -133,6 +132,7 @@
           }
         } else if (declaration is KernelFunctionBuilder) {
           Member function = declaration.build(library);
+          function.parent = cls;
           if (!declaration.isPatch && declaration.next == null) {
             cls.addMember(function);
           }
@@ -244,14 +244,18 @@
     constructorScopeBuilder.addMember(name, memberBuilder);
   }
 
-  @override
   void prepareTopLevelInference() {
     scope.forEach((String name, Declaration declaration) {
-      if (declaration is FieldBuilder) {
-        declaration.prepareTopLevelInference();
-      }
+      do {
+        if (declaration is KernelFieldBuilder) {
+          declaration.prepareTopLevelInference();
+        }
+        declaration = declaration.next;
+      } while (declaration != null);
     });
-    cls.setupApiMembers(library.loader.interfaceResolver);
+    if (!isPatch) {
+      cls.setupApiMembers(library.loader.interfaceResolver);
+    }
   }
 
   @override
@@ -278,4 +282,33 @@
     });
     return count;
   }
+
+  List<Declaration> computeDirectSupertypes(ClassBuilder objectClass) {
+    final List<Declaration> result = <Declaration>[];
+    final KernelNamedTypeBuilder supertype = this.supertype;
+    if (supertype != null) {
+      result.add(supertype.declaration);
+    } else if (objectClass != this) {
+      result.add(objectClass);
+    }
+    final List<KernelTypeBuilder> interfaces = this.interfaces;
+    if (interfaces != null) {
+      for (int i = 0; i < interfaces.length; i++) {
+        KernelNamedTypeBuilder interface = interfaces[i];
+        result.add(interface.declaration);
+      }
+    }
+    final KernelNamedTypeBuilder mixedInType = this.mixedInType;
+    if (mixedInType != null) {
+      result.add(mixedInType.declaration);
+    }
+    return result;
+  }
+
+  @override
+  int compareTo(SourceClassBuilder other) {
+    int result = "$fileUri".compareTo("${other.fileUri}");
+    if (result != 0) return result;
+    return charOffset.compareTo(other.charOffset);
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 16a1b45..2fa5d91 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -23,6 +23,7 @@
         LibraryBuilder,
         MemberBuilder,
         MetadataBuilder,
+        NameIterator,
         PrefixBuilder,
         ProcedureBuilder,
         QualifiedName,
@@ -72,7 +73,7 @@
 
 import '../configuration.dart' show Configuration;
 
-import '../problems.dart' show unhandled;
+import '../problems.dart' show unexpected, unhandled;
 
 import 'source_loader.dart' show SourceLoader;
 
@@ -102,13 +103,10 @@
 
   final List<List> implementationBuilders = <List<List>>[];
 
-  /// Indicates whether type inference (and type promotion) should be disabled
-  /// for this library.
-  @override
-  final bool disableTypeInference;
-
   final List<Object> accessors = <Object>[];
 
+  final bool legacyMode;
+
   String documentationComment;
 
   String name;
@@ -137,8 +135,8 @@
 
   SourceLibraryBuilder.fromScopes(
       this.loader, this.fileUri, this.libraryDeclaration, this.importScope)
-      : disableTypeInference = loader.target.disableTypeInference,
-        currentDeclaration = libraryDeclaration,
+      : currentDeclaration = libraryDeclaration,
+        legacyMode = loader.target.legacyMode,
         super(
             fileUri, libraryDeclaration.toScope(importScope), new Scope.top());
 
@@ -350,6 +348,14 @@
     partOfName = name;
     if (uri != null) {
       partOfUri = resolve(this.uri, uri, uriOffset);
+      Uri newFileUri = resolve(fileUri, uri, uriOffset);
+      LibraryBuilder library = loader.read(partOfUri, uriOffset,
+          fileUri: newFileUri, accessor: this);
+      if (loader.first == this) {
+        // This is a part, and it was the first input. Let the loader know
+        // about that.
+        loader.first = library;
+      }
     }
   }
 
@@ -383,6 +389,7 @@
       T type,
       String name,
       int charOffset,
+      int charEndOffset,
       Token initializerTokenForInference,
       bool hasInitializer);
 
@@ -391,15 +398,24 @@
     for (FieldInfo info in fieldInfos) {
       String name = info.name;
       int charOffset = info.charOffset;
+      int charEndOffset = info.charEndOffset;
       bool hasInitializer = info.initializerTokenForInference != null;
       Token initializerTokenForInference =
-          type == null ? info.initializerTokenForInference : null;
+          type != null || legacyMode ? null : info.initializerTokenForInference;
       if (initializerTokenForInference != null) {
         Token beforeLast = info.beforeLast;
         beforeLast.setNext(new Token.eof(beforeLast.next.offset));
       }
-      addField(documentationComment, metadata, modifiers, type, name,
-          charOffset, initializerTokenForInference, hasInitializer);
+      addField(
+          documentationComment,
+          metadata,
+          modifiers,
+          type,
+          name,
+          charOffset,
+          charEndOffset,
+          initializerTokenForInference,
+          hasInitializer);
     }
   }
 
@@ -507,9 +523,16 @@
             ? currentDeclaration.setters
             : currentDeclaration.members);
     Declaration existing = members[name];
+    if (declaration.next != null && declaration.next != existing) {
+      unexpected(
+          "${declaration.next.fileUri}@${declaration.next.charOffset}",
+          "${existing?.fileUri}@${existing?.charOffset}",
+          declaration.charOffset,
+          declaration.fileUri);
+    }
     declaration.next = existing;
     if (declaration is PrefixBuilder && existing is PrefixBuilder) {
-      assert(existing.next == null);
+      assert(existing.next is! PrefixBuilder);
       Declaration deferred;
       Declaration other;
       if (declaration.deferred) {
@@ -544,7 +567,7 @@
         }
       }
       addProblem(templateDuplicatedDeclaration.withArguments(fullName),
-          charOffset, fullName.length, fileUri,
+          charOffset, fullName.length, declaration.fileUri,
           context: <LocatedMessage>[
             templateDuplicatedDeclarationCause
                 .withArguments(fullName)
@@ -579,12 +602,10 @@
   R build(LibraryBuilder coreLibrary) {
     assert(implementationBuilders.isEmpty);
     canAddImplementationBuilders = true;
-    forEach((String name, Declaration declaration) {
-      do {
-        buildBuilder(declaration, coreLibrary);
-        declaration = declaration.next;
-      } while (declaration != null);
-    });
+    Iterator<Declaration> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      buildBuilder(iterator.current, coreLibrary);
+    }
     for (List list in implementationBuilders) {
       String name = list[0];
       Declaration declaration = list[1];
@@ -661,7 +682,11 @@
                     this.fileUri, -1, noLength)
               ]);
         } else {
-          usedParts.add(part.uri);
+          if (isPatch) {
+            usedParts.add(part.fileUri);
+          } else {
+            usedParts.add(part.uri);
+          }
           includePart(part, usedParts);
         }
       } else {
@@ -712,15 +737,47 @@
       }
     }
     part.validatePart(this, usedParts);
-    part.forEach((String name, Declaration declaration) {
+    NameIterator partDeclarations = part.nameIterator;
+    while (partDeclarations.moveNext()) {
+      String name = partDeclarations.name;
+      Declaration declaration = partDeclarations.current;
+
       if (declaration.next != null) {
-        // TODO(ahe): This shouldn't be necessary as setters have been added to
-        // their own scope.
-        assert(declaration.next.next == null);
-        addBuilder(name, declaration.next, declaration.next.charOffset);
+        List<Declaration> duplicated = <Declaration>[];
+        while (declaration.next != null) {
+          duplicated.add(declaration);
+          partDeclarations.moveNext();
+          declaration = partDeclarations.current;
+        }
+        duplicated.add(declaration);
+        // Handle duplicated declarations in the part.
+        //
+        // Duplicated declarations are handled by creating a linked list using
+        // the `next` field. This is preferred over making all scope entries be
+        // a `List<Declaration>`.
+        //
+        // We maintain the linked list so that the last entry is easy to
+        // recognize (it's `next` field is null). This means that it is
+        // reversed with respect to source code order. Since kernel doesn't
+        // allow duplicated declarations, we ensure that we only add the first
+        // declaration to the kernel tree.
+        //
+        // Since the duplicated declarations are stored in reverse order, we
+        // iterate over them in reverse order as this is simpler and normally
+        // not a problem. However, in this case we need to call [addBuilder] in
+        // source order as it would otherwise create cycles.
+        //
+        // We also need to be careful preserving the order of the links. The
+        // part library still keeps these declarations in its scope so that
+        // DietListener can find them.
+        for (int i = duplicated.length; i > 0; i--) {
+          Declaration declaration = duplicated[i - 1];
+          addBuilder(name, declaration, declaration.charOffset);
+        }
+      } else {
+        addBuilder(name, declaration, declaration.charOffset);
       }
-      addBuilder(name, declaration, declaration.charOffset);
-    });
+    }
     types.addAll(part.types);
     constructorReferences.addAll(part.constructorReferences);
     part.partOfLibrary = this;
@@ -729,7 +786,10 @@
   }
 
   void buildInitialScopes() {
-    forEach(addToExportScope);
+    NameIterator iterator = nameIterator;
+    while (iterator.moveNext()) {
+      addToExportScope(iterator.name, iterator.current);
+    }
   }
 
   void addImportsToScope() {
@@ -777,7 +837,7 @@
     int typeCount = types.length;
     for (UnresolvedType<T> t in types) {
       t.resolveIn(scope, this);
-      if (loader.target.strongMode) {
+      if (!loader.target.legacyMode) {
         t.checkType();
       } else {
         t.normalizeType();
@@ -790,9 +850,10 @@
   @override
   int resolveConstructors(_) {
     int count = 0;
-    forEach((String name, Declaration member) {
-      count += member.resolveConstructors(this);
-    });
+    Iterator<Declaration> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      count += iterator.current.resolveConstructors(this);
+    }
     return count;
   }
 
@@ -811,9 +872,10 @@
 
   @override
   void instrumentTopLevelInference(Instrumentation instrumentation) {
-    forEach((String name, Declaration member) {
-      member.instrumentTopLevelInference(instrumentation);
-    });
+    Iterator<Declaration> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      iterator.current.instrumentTopLevelInference(instrumentation);
+    }
   }
 
   @override
@@ -844,6 +906,8 @@
   }
 
   void checkBoundsInOutline(covariant typeEnvironment);
+
+  int finalizeInitializingFormals();
 }
 
 /// Unlike [Scope], this scope is used during construction of builders to
@@ -947,7 +1011,8 @@
   final int charOffset;
   final Token initializerTokenForInference;
   final Token beforeLast;
+  final int charEndOffset;
 
   const FieldInfo(this.name, this.charOffset, this.initializerTokenForInference,
-      this.beforeLast);
+      this.beforeLast, this.charEndOffset);
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index f1f468a..64ee146 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -35,15 +35,7 @@
 import '../../base/instrumentation.dart'
     show Instrumentation, InstrumentationValueLiteral;
 
-import '../builder/builder.dart'
-    show
-        ClassBuilder,
-        Declaration,
-        EnumBuilder,
-        FieldBuilder,
-        LibraryBuilder,
-        NamedTypeBuilder,
-        TypeBuilder;
+import '../blacklisted_classes.dart' show blacklistedCoreClasses;
 
 import '../export.dart' show Export;
 
@@ -55,6 +47,9 @@
         Message,
         SummaryTemplate,
         Template,
+        messageObjectExtends,
+        messageObjectImplements,
+        messageObjectMixesIn,
         messagePartOrphan,
         noLength,
         templateAmbiguousSupertypes,
@@ -71,7 +66,6 @@
         templateIllegalMixinDueToConstructorsCause,
         templateInternalProblemUriMissingScheme,
         templateSourceOutlineSummary,
-        templateDirectCyclicClassHierarchy,
         templateUntranslatableUri;
 
 import '../fasta_codes.dart' as fasta_codes;
@@ -79,19 +73,31 @@
 import '../kernel/kernel_shadow_ast.dart'
     show ShadowClass, ShadowTypeInferenceEngine;
 
-import '../kernel/kernel_builder.dart' show KernelProcedureBuilder;
+import '../kernel/kernel_builder.dart'
+    show
+        ClassBuilder,
+        ClassHierarchyBuilder,
+        Declaration,
+        EnumBuilder,
+        KernelFieldBuilder,
+        KernelProcedureBuilder,
+        LibraryBuilder,
+        NamedTypeBuilder,
+        TypeBuilder;
 
 import '../kernel/kernel_target.dart' show KernelTarget;
 
 import '../kernel/body_builder.dart' show BodyBuilder;
 
+import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
+
 import '../loader.dart' show Loader, untranslatableUriScheme;
 
 import '../parser/class_member_parser.dart' show ClassMemberParser;
 
 import '../parser.dart' show Parser, lengthForToken, offsetForToken;
 
-import '../problems.dart' show internalProblem, unexpected, unhandled;
+import '../problems.dart' show internalProblem, unhandled;
 
 import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan;
 
@@ -99,8 +105,6 @@
 
 import '../type_inference/interface_resolver.dart' show InterfaceResolver;
 
-import '../type_inference/type_inference_engine.dart' show TypeInferenceEngine;
-
 import '../type_inference/type_inferrer.dart'
     show LegacyModeMixinInferrer, StrongModeMixinInferrer;
 
@@ -131,14 +135,13 @@
   DartType iterableOfBottom;
   DartType streamOfBottom;
 
-  @override
-  TypeInferenceEngine typeInferenceEngine;
+  ShadowTypeInferenceEngine typeInferenceEngine;
 
   InterfaceResolver interfaceResolver;
 
   Instrumentation instrumentation;
 
-  List<ClassBuilder> orderedClasses;
+  SetLiteralTransformer setLiteralTransformer;
 
   SourceLoader(this.fileSystem, this.includeComments, KernelTarget target)
       : super(target);
@@ -398,12 +401,10 @@
     builders.forEach((Uri uri, dynamic l) {
       SourceLibraryBuilder library = l;
       Set<Declaration> members = new Set<Declaration>();
-      library.forEach((String name, Declaration member) {
-        while (member != null) {
-          members.add(member);
-          member = member.next;
-        }
-      });
+      Iterator<Declaration> iterator = library.iterator;
+      while (iterator.moveNext()) {
+        members.add(iterator.current);
+      }
       List<String> exports = <String>[];
       library.exportScope.forEach((String name, Declaration member) {
         while (member != null) {
@@ -430,6 +431,17 @@
     ticker.logMs("Resolved $typeCount types");
   }
 
+  void finalizeInitializingFormals() {
+    int formalCount = 0;
+    builders.forEach((Uri uri, LibraryBuilder library) {
+      if (library.loader == this) {
+        SourceLibraryBuilder sourceLibrary = library;
+        formalCount += sourceLibrary.finalizeInitializingFormals();
+      }
+    });
+    ticker.logMs("Finalized $formalCount initializing formals");
+  }
+
   void finishDeferredLoadTearoffs() {
     int count = 0;
     builders.forEach((Uri uri, LibraryBuilder library) {
@@ -502,164 +514,164 @@
     ticker.logMs("Finished $count patch methods");
   }
 
-  /// Returns all the supertypes (including interfaces) of [cls]
-  /// transitively. Includes [cls].
-  Set<ClassBuilder> allSupertypes(ClassBuilder cls) {
-    int length = 0;
-    Set<ClassBuilder> result = new Set<ClassBuilder>()..add(cls);
-    while (length != result.length) {
-      length = result.length;
-      result.addAll(directSupertypes(result));
-    }
-    return result;
-  }
-
-  /// Returns the direct supertypes (including interface) of [classes]. A class
-  /// from [classes] is only included if it is a supertype of one of the other
-  /// classes in [classes].
-  Set<ClassBuilder> directSupertypes(Iterable<ClassBuilder> classes) {
-    Set<ClassBuilder> result = new Set<ClassBuilder>();
-    for (ClassBuilder cls in classes) {
-      target.addDirectSupertype(cls, result);
-    }
-    return result;
-  }
-
-  /// Computes a set of classes that may have cycles. The set is empty if there
-  /// are no cycles. If the set isn't empty, it will include supertypes of
-  /// classes with cycles, as well as the classes with cycles.
-  ///
-  /// It is assumed that [classes] is a transitive closure with respect to
-  /// supertypes.
-  Iterable<ClassBuilder> cyclicCandidates(Iterable<ClassBuilder> classes) {
-    // The candidates are found by a fixed-point computation.
-    //
-    // On each iteration, the classes that have no supertypes in the input set
-    // will be removed.
-    //
-    // If there are no cycles, eventually, the set will converge on Object, and
-    // the next iteration will make the set empty (as Object has no
-    // supertypes).
-    //
-    // On the other hand, if there is a cycle, the cycle will remain in the
-    // set, and so will its supertypes, and eventually the input and output set
-    // will have the same length.
-    Iterable<ClassBuilder> input = const [];
-    Iterable<ClassBuilder> output = classes;
-    while (input.length != output.length) {
-      input = output;
-      output = directSupertypes(input);
-    }
-    return output;
-  }
-
-  void checkSemantics(List<SourceClassBuilder> classes) {
-    Iterable<ClassBuilder> candidates = cyclicCandidates(classes);
-    if (candidates.isNotEmpty) {
-      Map<ClassBuilder, Set<ClassBuilder>> realCycles =
-          <ClassBuilder, Set<ClassBuilder>>{};
-      for (ClassBuilder cls in candidates) {
-        Set<ClassBuilder> cycles = cyclicCandidates(allSupertypes(cls));
-        if (cycles.isNotEmpty) {
-          realCycles[cls] = cycles;
-        }
+  /// Check that [objectClass] has no supertypes. Recover by removing any
+  /// found.
+  void checkObjectClassHierarchy(ClassBuilder objectClass) {
+    if (objectClass is SourceClassBuilder &&
+        objectClass.library.loader == this) {
+      if (objectClass.supertype != null) {
+        objectClass.supertype = null;
+        objectClass.addProblem(
+            messageObjectExtends, objectClass.charOffset, noLength);
       }
-      Map<LocatedMessage, ClassBuilder> messages =
-          <LocatedMessage, ClassBuilder>{};
-      realCycles.forEach((ClassBuilder cls, Set<ClassBuilder> cycles) {
-        target.breakCycle(cls);
-        List<ClassBuilder> involved = <ClassBuilder>[];
-        for (ClassBuilder cls in cycles) {
-          if (realCycles.containsKey(cls)) {
-            involved.add(cls);
+      if (objectClass.interfaces != null) {
+        objectClass.addProblem(
+            messageObjectImplements, objectClass.charOffset, noLength);
+        objectClass.interfaces = null;
+      }
+      if (objectClass.mixedInType != null) {
+        objectClass.addProblem(
+            messageObjectMixesIn, objectClass.charOffset, noLength);
+        objectClass.mixedInType = null;
+      }
+    }
+  }
+
+  /// Returns a list of all class builders declared in this loader.  As the
+  /// classes are sorted, any cycles in the hiearchy are reported as
+  /// errors. Recover by breaking the cycles. This means that the rest of the
+  /// pipeline (including backends) can assume that there are no hierarchy
+  /// cycles.
+  List<SourceClassBuilder> handleHierarchyCycles(ClassBuilder objectClass) {
+    // Compute the initial work list of all classes declared in this loader.
+    List<SourceClassBuilder> workList = <SourceClassBuilder>[];
+    for (LibraryBuilder library in builders.values) {
+      if (library.loader == this) {
+        Iterator<Declaration> members = library.iterator;
+        while (members.moveNext()) {
+          Declaration member = members.current;
+          if (member is SourceClassBuilder) {
+            workList.add(member);
           }
         }
-        // Sort the class names alphabetically to ensure the order is stable.
-        // TODO(ahe): It's possible that a better UX would be to sort the
-        // classes based on walking the class hierarchy in breadth-first order.
-        String involvedString = (involved
-                .where((c) => c != cls)
-                .map((c) => c.fullNameForErrors)
-                .toList()
-                  ..sort())
-            .join("', '");
-        LocatedMessage message = involvedString.isEmpty
-            ? templateDirectCyclicClassHierarchy
-                .withArguments(cls.fullNameForErrors)
-                .withLocation(cls.fileUri, cls.charOffset, noLength)
-            : templateCyclicClassHierarchy
-                .withArguments(cls.fullNameForErrors, involvedString)
-                .withLocation(cls.fileUri, cls.charOffset, noLength);
-        messages[message] = cls;
-      });
-
-      // Report all classes involved in a cycle, sorted to ensure stability as
-      // [cyclicCandidates] is sensitive to if the platform (or other modules)
-      // are included in [classes].
-      for (LocatedMessage message in messages.keys.toList()..sort()) {
-        messages[message].addProblem(
-            message.messageObject, message.charOffset, message.length);
       }
     }
-    ticker.logMs("Found cycles");
-    Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([
-      coreLibrary["bool"],
-      coreLibrary["int"],
-      coreLibrary["num"],
-      coreLibrary["double"],
-      coreLibrary["String"],
-      coreLibrary["Null"],
-    ]);
-    for (ClassBuilder cls in classes) {
-      if (cls.library.loader != this) continue;
-      Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>();
-      target.addDirectSupertype(cls, directSupertypes);
-      for (ClassBuilder supertype in directSupertypes) {
-        if (supertype is EnumBuilder) {
-          cls.addProblem(templateExtendingEnum.withArguments(supertype.name),
-              cls.charOffset, noLength);
-        } else if (!cls.library.mayImplementRestrictedTypes &&
-            blackListedClasses.contains(supertype)) {
-          cls.addProblem(
-              templateExtendingRestricted.withArguments(supertype.name),
-              cls.charOffset,
-              noLength);
+
+    Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>();
+    for (int i = 0; i < blacklistedCoreClasses.length; i++) {
+      blackListedClasses.add(coreLibrary[blacklistedCoreClasses[i]]);
+    }
+
+    // Sort the classes topologically.
+    Set<SourceClassBuilder> topologicallySortedClasses =
+        new Set<SourceClassBuilder>();
+    List<SourceClassBuilder> previousWorkList;
+    do {
+      previousWorkList = workList;
+      workList = <SourceClassBuilder>[];
+      for (int i = 0; i < previousWorkList.length; i++) {
+        SourceClassBuilder cls = previousWorkList[i];
+        List<Declaration> directSupertypes =
+            cls.computeDirectSupertypes(objectClass);
+        bool allSupertypesProcessed = true;
+        for (int i = 0; i < directSupertypes.length; i++) {
+          Declaration supertype = directSupertypes[i];
+          if (supertype is SourceClassBuilder &&
+              supertype.library.loader == this &&
+              !topologicallySortedClasses.contains(supertype)) {
+            allSupertypesProcessed = false;
+            break;
+          }
+        }
+        if (allSupertypesProcessed) {
+          topologicallySortedClasses.add(cls);
+          checkClassSupertypes(cls, directSupertypes, blackListedClasses);
+        } else {
+          workList.add(cls);
         }
       }
-      TypeBuilder mixedInType = cls.mixedInType;
-      if (mixedInType != null) {
-        bool isClassBuilder = false;
-        if (mixedInType is NamedTypeBuilder) {
-          var builder = mixedInType.declaration;
-          if (builder is ClassBuilder) {
-            isClassBuilder = true;
-            for (Declaration constructory
-                in builder.constructors.local.values) {
-              if (constructory.isConstructor && !constructory.isSynthetic) {
-                cls.addProblem(
-                    templateIllegalMixinDueToConstructors
-                        .withArguments(builder.fullNameForErrors),
-                    cls.charOffset,
-                    noLength,
-                    context: [
-                      templateIllegalMixinDueToConstructorsCause
-                          .withArguments(builder.fullNameForErrors)
-                          .withLocation(constructory.fileUri,
-                              constructory.charOffset, noLength)
-                    ]);
-              }
+    } while (previousWorkList.length != workList.length);
+    List<SourceClassBuilder> classes = topologicallySortedClasses.toList();
+    List<SourceClassBuilder> classesWithCycles = previousWorkList;
+
+    // Once the work list doesn't change in size, it's either empty, or
+    // contains all classes with cycles.
+
+    // Sort the classes to ensure consistent output.
+    classesWithCycles.sort();
+    for (int i = 0; i < classesWithCycles.length; i++) {
+      SourceClassBuilder cls = classesWithCycles[i];
+      target.breakCycle(cls);
+      classes.add(cls);
+      cls.addProblem(
+          templateCyclicClassHierarchy.withArguments(cls.fullNameForErrors),
+          cls.charOffset,
+          noLength);
+    }
+
+    ticker.logMs("Checked class hierarchy");
+    return classes;
+  }
+
+  void checkClassSupertypes(
+      SourceClassBuilder cls,
+      List<Declaration> directSupertypes,
+      Set<ClassBuilder> blackListedClasses) {
+    // Check that the direct supertypes aren't black-listed or enums.
+    for (int i = 0; i < directSupertypes.length; i++) {
+      Declaration supertype = directSupertypes[i];
+      if (supertype is EnumBuilder) {
+        cls.addProblem(templateExtendingEnum.withArguments(supertype.name),
+            cls.charOffset, noLength);
+      } else if (!cls.library.mayImplementRestrictedTypes &&
+          blackListedClasses.contains(supertype)) {
+        cls.addProblem(
+            templateExtendingRestricted
+                .withArguments(supertype.fullNameForErrors),
+            cls.charOffset,
+            noLength);
+      }
+    }
+
+    // Check that the mixed-in type can be used as a mixin.
+    final TypeBuilder mixedInType = cls.mixedInType;
+    if (mixedInType != null) {
+      bool isClassBuilder = false;
+      if (mixedInType is NamedTypeBuilder) {
+        var builder = mixedInType.declaration;
+        if (builder is ClassBuilder) {
+          isClassBuilder = true;
+          for (Declaration constructory in builder.constructors.local.values) {
+            if (constructory.isConstructor && !constructory.isSynthetic) {
+              cls.addProblem(
+                  templateIllegalMixinDueToConstructors
+                      .withArguments(builder.fullNameForErrors),
+                  cls.charOffset,
+                  noLength,
+                  context: [
+                    templateIllegalMixinDueToConstructorsCause
+                        .withArguments(builder.fullNameForErrors)
+                        .withLocation(constructory.fileUri,
+                            constructory.charOffset, noLength)
+                  ]);
             }
           }
         }
-        if (!isClassBuilder) {
-          cls.addProblem(
-              templateIllegalMixin.withArguments(mixedInType.fullNameForErrors),
-              cls.charOffset,
-              noLength);
-        }
+      }
+      if (!isClassBuilder) {
+        // TODO(ahe): Either we need to check this for superclass and
+        // interfaces, or this shouldn't be necessary (or handled elsewhere).
+        cls.addProblem(
+            templateIllegalMixin.withArguments(mixedInType.fullNameForErrors),
+            cls.charOffset,
+            noLength);
       }
     }
-    ticker.logMs("Checked restricted supertypes");
+  }
+
+  List<SourceClassBuilder> checkSemantics(ClassBuilder objectClass) {
+    checkObjectClassHierarchy(objectClass);
+    List<SourceClassBuilder> classes = handleHierarchyCycles(objectClass);
 
     // Check imports and exports for duplicate names.
     // This is rather silly, e.g. it makes importing 'foo' and exporting another
@@ -734,6 +746,7 @@
       }
     });
     ticker.logMs("Checked imports and exports for duplicate names");
+    return classes;
   }
 
   void buildComponent() {
@@ -782,9 +795,9 @@
     if (hierarchy == null) {
       hierarchy = new ClassHierarchy(computeFullComponent(),
           onAmbiguousSupertypes: onAmbiguousSupertypes,
-          mixinInferrer: target.strongMode
-              ? new StrongModeMixinInferrer(this)
-              : new LegacyModeMixinInferrer());
+          mixinInferrer: target.legacyMode
+              ? new LegacyModeMixinInferrer()
+              : new StrongModeMixinInferrer(this));
     } else {
       hierarchy.onAmbiguousSupertypes = onAmbiguousSupertypes;
       Component component = computeFullComponent();
@@ -824,19 +837,22 @@
 
   void checkSupertypes(List<SourceClassBuilder> sourceClasses) {
     for (SourceClassBuilder builder in sourceClasses) {
-      if (builder.library.loader == this) {
+      if (builder.library.loader == this && !builder.isPatch) {
         builder.checkSupertypes(coreTypes);
       }
     }
-    ticker.logMs("Checked overrides");
+    ticker.logMs("Checked supertypes");
   }
 
   void checkBounds() {
-    if (!target.strongMode) return;
+    if (target.legacyMode) return;
 
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library is SourceLibraryBuilder) {
-        library.checkBoundsInOutline(typeInferenceEngine.typeSchemaEnvironment);
+        if (library.loader == this) {
+          library
+              .checkBoundsInOutline(typeInferenceEngine.typeSchemaEnvironment);
+        }
       }
     });
     ticker.logMs("Checked type arguments of supers against the bounds");
@@ -845,7 +861,7 @@
   void checkOverrides(List<SourceClassBuilder> sourceClasses) {
     assert(hierarchy != null);
     for (SourceClassBuilder builder in sourceClasses) {
-      if (builder.library.loader == this) {
+      if (builder.library.loader == this && !builder.isPatch) {
         builder.checkOverrides(
             hierarchy, typeInferenceEngine?.typeSchemaEnvironment);
       }
@@ -854,10 +870,11 @@
   }
 
   void checkAbstractMembers(List<SourceClassBuilder> sourceClasses) {
-    if (!target.strongMode) return;
+    // TODO(ahe): Move this to [ClassHierarchyBuilder].
+    if (target.legacyMode) return;
     assert(hierarchy != null);
     for (SourceClassBuilder builder in sourceClasses) {
-      if (builder.library.loader == this) {
+      if (builder.library.loader == this && !builder.isPatch) {
         builder.checkAbstractMembers(
             coreTypes, hierarchy, typeInferenceEngine.typeSchemaEnvironment);
       }
@@ -866,9 +883,10 @@
   }
 
   void checkRedirectingFactories(List<SourceClassBuilder> sourceClasses) {
-    if (!target.strongMode) return;
+    // TODO(ahe): Move this to [ClassHierarchyBuilder].
+    if (target.legacyMode) return;
     for (SourceClassBuilder builder in sourceClasses) {
-      if (builder.library.loader == this) {
+      if (builder.library.loader == this && !builder.isPatch) {
         builder.checkRedirectingFactories(
             typeInferenceEngine.typeSchemaEnvironment);
       }
@@ -877,11 +895,12 @@
   }
 
   void addNoSuchMethodForwarders(List<SourceClassBuilder> sourceClasses) {
+    // TODO(ahe): Move this to [ClassHierarchyBuilder].
     if (!target.backendTarget.enableNoSuchMethodForwarders) return;
 
     List<Class> changedClasses = new List<Class>();
     for (SourceClassBuilder builder in sourceClasses) {
-      if (builder.library.loader == this) {
+      if (builder.library.loader == this && !builder.isPatch) {
         if (builder.addNoSuchMethodForwarders(target, hierarchy)) {
           changedClasses.add(builder.target);
         }
@@ -893,7 +912,7 @@
 
   void checkMixins(List<SourceClassBuilder> sourceClasses) {
     for (SourceClassBuilder builder in sourceClasses) {
-      if (builder.library.loader == this) {
+      if (builder.library.loader == this && !builder.isPatch) {
         if (builder.isMixinDeclaration) {
           builder.checkMixinDeclaration();
         }
@@ -907,54 +926,46 @@
     ticker.logMs("Checked mixin declaration applications");
   }
 
+  void buildClassHierarchy(
+      List<SourceClassBuilder> sourceClasses, ClassBuilder objectClass) {
+    if (!target.legacyMode) return;
+    ticker.logMs("Building class hierarchy");
+    ClassHierarchyBuilder classHierarchyBuilder =
+        new ClassHierarchyBuilder(objectClass);
+    for (int i = 0; i < sourceClasses.length; i++) {
+      classHierarchyBuilder.add(sourceClasses[i]);
+    }
+    ticker.logMs("Built class hierarchy");
+  }
+
   void createTypeInferenceEngine() {
-    typeInferenceEngine =
-        new ShadowTypeInferenceEngine(instrumentation, target.strongMode);
+    if (target.legacyMode) return;
+    typeInferenceEngine = new ShadowTypeInferenceEngine(instrumentation);
   }
 
   void performTopLevelInference(List<SourceClassBuilder> sourceClasses) {
-    if (target.disableTypeInference) return;
+    if (target.legacyMode) return;
 
     /// The first phase of top level initializer inference, which consists of
     /// creating kernel objects for all fields and top level variables that
     /// might be subject to type inference, and records dependencies between
     /// them.
     typeInferenceEngine.prepareTopLevel(coreTypes, hierarchy);
-    interfaceResolver = new InterfaceResolver(
-        typeInferenceEngine,
-        typeInferenceEngine.typeSchemaEnvironment,
-        instrumentation,
-        target.strongMode);
-    builders.forEach((Uri uri, LibraryBuilder library) {
+    interfaceResolver = new InterfaceResolver(typeInferenceEngine,
+        typeInferenceEngine.typeSchemaEnvironment, instrumentation);
+    for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
-        library.forEach((String name, Declaration member) {
-          if (member is FieldBuilder) {
+        Iterator<Declaration> iterator = library.iterator;
+        while (iterator.moveNext()) {
+          Declaration member = iterator.current;
+          if (member is KernelFieldBuilder) {
             member.prepareTopLevelInference();
           }
-        });
+        }
       }
-    });
-    {
-      // Note: we need to create a list before iterating, since calling
-      // builder.prepareTopLevelInference causes further class hierarchy
-      // queries to be made which would otherwise result in a concurrent
-      // modification exception.
-      List<Class> classes = new List<Class>(sourceClasses.length);
-      for (int i = 0; i < sourceClasses.length; i++) {
-        classes[i] = sourceClasses[i].target;
-      }
-      orderedClasses = null;
-      List<ClassBuilder> result = new List<ClassBuilder>(sourceClasses.length);
-      int i = 0;
-      for (Class cls
-          in new List<Class>.from(hierarchy.getOrderedClasses(classes))) {
-        result[i++] = ShadowClass.getClassInferenceInfo(cls).builder
-          ..prepareTopLevelInference();
-      }
-      if (i != result.length) {
-        unexpected("${result.length}", "$i", -1, null);
-      }
-      orderedClasses = result;
+    }
+    for (int i = 0; i < sourceClasses.length; i++) {
+      sourceClasses[i].prepareTopLevelInference();
     }
     typeInferenceEngine.isTypeInferencePrepared = true;
     ticker.logMs("Prepared top level inference");
@@ -964,7 +975,8 @@
     /// their types.
     typeInferenceEngine.finishTopLevelFields();
     List<Class> changedClasses = new List<Class>();
-    for (var builder in orderedClasses) {
+    for (var builder in sourceClasses) {
+      if (builder.isPatch) continue;
       ShadowClass class_ = builder.target;
       int memberCount = class_.fields.length +
           class_.constructors.length +
@@ -984,7 +996,6 @@
       }
     }
 
-    orderedClasses = null;
     typeInferenceEngine.finishTopLevelInitializingFormals();
     if (instrumentation != null) {
       builders.forEach((Uri uri, LibraryBuilder library) {
diff --git a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
new file mode 100644
index 0000000..5ba2c51
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
@@ -0,0 +1,1355 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library fasta.type_promotion_look_ahead_listener;
+
+import '../builder/builder.dart' show Declaration;
+
+import '../messages.dart' show LocatedMessage, Message;
+
+import '../parser.dart'
+    show Assert, IdentifierContext, FormalParameterKind, Listener, MemberKind;
+
+import '../problems.dart' as problems show unhandled;
+
+import '../scanner.dart' show Token;
+
+import '../scope.dart' show Scope;
+
+import '../severity.dart' show Severity;
+
+final NoArguments noArgumentsSentinel = new NoArguments();
+
+abstract class TypePromotionState {
+  final Uri uri;
+
+  final List<Scope> scopes = <Scope>[new Scope.top(isModifiable: true)];
+
+  final List<Declaration> stack = <Declaration>[];
+
+  TypePromotionState(this.uri);
+
+  Scope get currentScope => scopes.last;
+
+  void enterScope(String debugName) {
+    scopes.add(new Scope.nested(currentScope, "block"));
+  }
+
+  Scope exitScope(Token token) {
+    return scopes.removeLast();
+  }
+
+  void declareIdentifier(Token token) {
+    String name = token.lexeme;
+    LocatedMessage error = currentScope.declare(
+        name, new UnspecifiedDeclaration(name, uri, token.charOffset), uri);
+    if (error != null) {
+      report(error, Severity.error);
+    }
+    pushNull(token.lexeme, token);
+  }
+
+  void registerWrite(UnspecifiedDeclaration declaration, Token token) {}
+
+  void registerPromotionCandidate(
+      UnspecifiedDeclaration declaration, Token token) {}
+
+  void pushReference(Token token) {
+    String name = token.lexeme;
+    Declaration declaration = currentScope.lookup(name, token.charOffset, uri);
+    stack.add(declaration);
+  }
+
+  Declaration pop() => stack.removeLast();
+
+  void push(Declaration declaration) {
+    stack.add(declaration);
+  }
+
+  Declaration popPushNull(String name, Token token) {
+    int last = stack.length - 1;
+    Declaration declaration = stack[last];
+    stack[last] = nullValue(name, token);
+    return declaration;
+  }
+
+  void discard(int count) {
+    stack.length = stack.length - count;
+  }
+
+  void pushNull(String name, Token token) {
+    stack.add(nullValue(name, token));
+  }
+
+  Declaration nullValue(String name, Token token) => null;
+
+  void report(LocatedMessage message, Severity severity,
+      {List<LocatedMessage> context});
+
+  void trace(String message, Token token) {}
+
+  void checkEmpty(Token token) {}
+}
+
+class UnspecifiedDeclaration extends Declaration {
+  final String name;
+
+  @override
+  final Uri fileUri;
+
+  @override
+  int charOffset;
+
+  UnspecifiedDeclaration(this.name, this.fileUri, this.charOffset);
+
+  @override
+  Declaration get parent => null;
+
+  @override
+  String get fullNameForErrors => name;
+
+  @override
+  String toString() => "UnspecifiedDeclaration($name)";
+}
+
+class NoArguments extends Declaration {
+  NoArguments();
+
+  @override
+  Uri get fileUri => null;
+
+  @override
+  int get charOffset => -1;
+
+  @override
+  Declaration get parent => null;
+
+  @override
+  String get fullNameForErrors => "<<no arguments>>";
+
+  @override
+  String toString() => fullNameForErrors;
+}
+
+class TypePromotionLookAheadListener extends Listener {
+  final TypePromotionState state;
+
+  TypePromotionLookAheadListener(this.state);
+
+  Uri get uri => state.uri;
+
+  void debugEvent(String name, Token token) {
+    // state.trace(name, token);
+  }
+
+  @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    debugEvent("Arguments", beginToken);
+    state.discard(count);
+    state.pushNull("%Arguments%", endToken);
+  }
+
+  @override
+  void handleNoArguments(Token token) {
+    debugEvent("NoArguments", token);
+    state.push(noArgumentsSentinel);
+  }
+
+  @override
+  void handleAsOperator(Token operator) {
+    debugEvent("AsOperator", operator);
+    state.popPushNull(operator.lexeme, operator);
+  }
+
+  @override
+  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+      Token commaToken, Token semicolonToken) {
+    debugEvent("Assert", assertKeyword);
+    if (commaToken != null) {
+      state.pop(); // Message.
+    }
+    state.pop(); // Condition.
+    switch (kind) {
+      case Assert.Expression:
+        state.pushNull("%AssertExpression%", assertKeyword);
+        break;
+
+      case Assert.Initializer:
+        state.pushNull("%AssertInitializer%", assertKeyword);
+        break;
+
+      case Assert.Statement:
+        break;
+    }
+  }
+
+  @override
+  void handleAssignmentExpression(Token token) {
+    debugEvent("AssignmentExpression", token);
+    state.pop(); // Right-hand side.
+    Declaration lhs = state.popPushNull(token.lexeme, token);
+    if (lhs is UnspecifiedDeclaration) {
+      state.registerWrite(lhs, token);
+    }
+  }
+
+  @override
+  void handleAsyncModifier(Token asyncToken, Token starToken) {
+    debugEvent("AsyncModifier", asyncToken);
+  }
+
+  @override
+  void endAwaitExpression(Token beginToken, Token endToken) {
+    debugEvent("AwaitExpression", beginToken);
+    state.popPushNull(beginToken.lexeme, beginToken); // Expression.
+  }
+
+  @override
+  void endBinaryExpression(Token token) {
+    debugEvent("BinaryExpression", token);
+    state.pop(); // Right-hand side.
+    state.popPushNull(token.lexeme, token); // Left-hand side.
+  }
+
+  @override
+  void beginBlock(Token token) {
+    debugEvent("beginBlock", token);
+    state.enterScope("block");
+  }
+
+  @override
+  void endBlock(int count, Token beginToken, Token endToken) {
+    debugEvent("Block", beginToken);
+    state.exitScope(endToken);
+  }
+
+  @override
+  void beginBlockFunctionBody(Token token) {
+    debugEvent("beginBlockFunctionBody", token);
+    state.enterScope("block-function-body");
+  }
+
+  @override
+  void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
+    debugEvent("BlockFunctionBody", beginToken);
+    state.exitScope(endToken);
+  }
+
+  @override
+  void handleBreakStatement(
+      bool hasTarget, Token breakKeyword, Token endToken) {
+    debugEvent("BreakStatement", breakKeyword);
+    if (hasTarget) {
+      state.pop(); // Target.
+    }
+  }
+
+  @override
+  void endCascade() {
+    debugEvent("Cascade", null);
+    state.popPushNull("%Cascade%", null);
+  }
+
+  @override
+  void endCaseExpression(Token colon) {
+    debugEvent("CaseExpression", colon);
+    state.pop(); // Expression.
+  }
+
+  @override
+  void handleCaseMatch(Token caseKeyword, Token colon) {
+    debugEvent("CaseMatch", caseKeyword);
+  }
+
+  @override
+  void handleCatchBlock(Token onKeyword, Token catchKeyword, Token comma) {
+    debugEvent("CatchBlock", catchKeyword);
+  }
+
+  @override
+  void endCatchClause(Token token) {
+    debugEvent("CatchClause", token);
+  }
+
+  @override
+  void endClassDeclaration(Token beginToken, Token endToken) {
+    debugEvent("ClassDeclaration", beginToken);
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void handleClassExtends(Token extendsKeyword) {
+    debugEvent("ClassExtends", extendsKeyword);
+  }
+
+  @override
+  void handleClassHeader(Token begin, Token classKeyword, Token nativeToken) {
+    debugEvent("ClassHeader", begin);
+    state.pop(); // Class name.
+    state.checkEmpty(classKeyword);
+  }
+
+  @override
+  void handleClassNoWithClause() {
+    debugEvent("ClassNoWithClause", null);
+  }
+
+  @override
+  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+    debugEvent("ClassOrMixinBody", beginToken);
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void handleClassOrMixinImplements(
+      Token implementsKeyword, int interfacesCount) {
+    debugEvent("ClassOrMixinImplements", implementsKeyword);
+  }
+
+  @override
+  void handleClassWithClause(Token withKeyword) {
+    debugEvent("ClassWithClause", withKeyword);
+  }
+
+  @override
+  void endCombinators(int count) {
+    debugEvent("Combinators", null);
+  }
+
+  @override
+  void handleCommentReference(
+      Token newKeyword, Token prefix, Token period, Token token) {
+    debugEvent("CommentReference", newKeyword);
+    unhandled("CommentReference", newKeyword);
+  }
+
+  @override
+  void handleNoCommentReference() {
+    debugEvent("NoCommentReference", null);
+    unhandled("NoCommentReference", null);
+  }
+
+  @override
+  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
+    debugEvent("CommentReferenceText", null);
+    unhandled("CommentReferenceText", null);
+  }
+
+  @override
+  void endCompilationUnit(int count, Token token) {
+    debugEvent("CompilationUnit", token);
+    print(state.stack);
+  }
+
+  @override
+  void endConditionalExpression(Token question, Token colon) {
+    debugEvent("ConditionalExpression", question);
+    state.pop(); // Otherwise expression.
+    state.pop(); // Then expression.
+    state.popPushNull(question.lexeme, question); // Condition.
+  }
+
+  @override
+  void handleConditionalExpressionColon() {
+    debugEvent("ConditionalExpressionColon", null);
+    // TODO(ahe): Rename this event. This is not handling any colons as it
+    // isn't being passed a colon. One alternative is
+    // handleConditionalThenExpression, but check the specification for naming
+    // conventions. Kernel uses "then" and "otherwise".
+  }
+
+  @override
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token equalSign) {
+    debugEvent("ConditionalUri", ifKeyword);
+    unhandled("ConditionalUri", ifKeyword);
+  }
+
+  @override
+  void endConditionalUris(int count) {
+    debugEvent("ConditionalUris", null);
+  }
+
+  @override
+  void endConstExpression(Token token) {
+    debugEvent("ConstExpression", token);
+    doConstuctorInvocation(token, true);
+  }
+
+  void doConstuctorInvocation(Token token, bool isConst) {
+    state.pop(); // Arguments.
+    state.popPushNull(token.lexeme, token); // Constructor reference.
+  }
+
+  @override
+  void endConstLiteral(Token token) {
+    debugEvent("ConstLiteral", token);
+    state.popPushNull("%ConstLiteral%", token);
+  }
+
+  @override
+  void endConstructorReference(
+      Token start, Token periodBeforeName, Token endToken) {
+    debugEvent("ConstructorReference", start);
+    if (periodBeforeName != null) {
+      state.pop(); // Prefix.
+    }
+    state.popPushNull("%ConstructorReference%", start);
+  }
+
+  @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    debugEvent("NoConstructorReferenceContinuationAfterTypeArguments", token);
+  }
+
+  @override
+  void handleContinueStatement(
+      bool hasTarget, Token continueKeyword, Token endToken) {
+    debugEvent("ContinueStatement", continueKeyword);
+    if (hasTarget) {
+      state.pop(); // Target.
+    }
+  }
+
+  @override
+  void handleDirectivesOnly() {
+    debugEvent("DirectivesOnly", null);
+    unhandled("DirectivesOnly", null);
+  }
+
+  @override
+  void endDoWhileStatement(
+      Token doKeyword, Token whileKeyword, Token endToken) {
+    debugEvent("DoWhileStatement", doKeyword);
+    state.pop(); // Condition.
+  }
+
+  @override
+  void endDoWhileStatementBody(Token token) {
+    debugEvent("DoWhileStatementBody", token);
+  }
+
+  @override
+  void handleDottedName(int count, Token firstIdentifier) {
+    debugEvent("DottedName", firstIdentifier);
+    unhandled("DottedName", firstIdentifier);
+  }
+
+  @override
+  void endElseStatement(Token token) {
+    debugEvent("ElseStatement", token);
+  }
+
+  @override
+  void handleEmptyFunctionBody(Token semicolon) {
+    debugEvent("EmptyFunctionBody", semicolon);
+  }
+
+  @override
+  void handleEmptyStatement(Token token) {
+    debugEvent("EmptyStatement", token);
+  }
+
+  @override
+  void beginEnum(Token enumKeyword) {
+    debugEvent("beginEnum", enumKeyword);
+    state.checkEmpty(enumKeyword);
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+    debugEvent("endEnum", enumKeyword);
+    state.discard(count); // Enum values.
+    state.pop(); // Enum name.
+    state.checkEmpty(enumKeyword);
+  }
+
+  @override
+  void endExport(Token exportKeyword, Token semicolon) {
+    debugEvent("Export", exportKeyword);
+    state.pop(); // Export URI.
+    state.checkEmpty(semicolon);
+  }
+
+  @override
+  void handleExpressionFunctionBody(Token arrowToken, Token endToken) {
+    debugEvent("ExpressionFunctionBody", arrowToken);
+    state.pop();
+  }
+
+  @override
+  void handleExpressionStatement(Token token) {
+    debugEvent("ExpressionStatement", token);
+    state.pop();
+  }
+
+  @override
+  void handleExtraneousExpression(Token token, Message message) {
+    debugEvent("ExtraneousExpression", token);
+    unhandled("ExtraneousExpression", token);
+  }
+
+  @override
+  void endFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    debugEvent("FactoryMethod", beginToken);
+    state.pop(); // Name.
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void endFieldInitializer(Token assignment, Token token) {
+    debugEvent("FieldInitializer", assignment);
+    state.pop(); // Initializer.
+  }
+
+  @override
+  void handleNoFieldInitializer(Token token) {
+    debugEvent("NoFieldInitializer", token);
+  }
+
+  @override
+  void endFields(Token staticToken, Token covariantToken, Token varFinalOrConst,
+      int count, Token beginToken, Token endToken) {
+    debugEvent("Fields", staticToken);
+    state.discard(count); // Field names.
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void handleFinallyBlock(Token finallyKeyword) {
+    debugEvent("FinallyBlock", finallyKeyword);
+  }
+
+  @override
+  void endForIn(Token awaitToken, Token forToken, Token leftParenthesis,
+      Token inKeyword, Token endToken) {
+    debugEvent("ForIn", awaitToken);
+  }
+
+  @override
+  void endForInBody(Token token) {
+    debugEvent("ForInBody", token);
+  }
+
+  @override
+  void endForInExpression(Token token) {
+    debugEvent("ForInExpression", token);
+    state.pop(); // Expression.
+  }
+
+  @override
+  void handleForInitializerEmptyStatement(Token token) {
+    debugEvent("ForInitializerEmptyStatement", token);
+  }
+
+  @override
+  void handleForInitializerExpressionStatement(Token token) {
+    debugEvent("ForInitializerExpressionStatement", token);
+    state.pop(); // Expression.
+  }
+
+  @override
+  void handleForInitializerLocalVariableDeclaration(Token token) {
+    debugEvent("ForInitializerLocalVariableDeclaration", token);
+  }
+
+  @override
+  void endForStatement(Token forKeyword, Token leftParen, Token leftSeparator,
+      int updateExpressionCount, Token endToken) {
+    debugEvent("ForStatement", forKeyword);
+    state.discard(updateExpressionCount);
+  }
+
+  @override
+  void endForStatementBody(Token token) {
+    debugEvent("ForStatementBody", token);
+  }
+
+  @override
+  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
+      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+    debugEvent("FormalParameter", thisKeyword);
+    state.pop(); // Parameter name.
+  }
+
+  @override
+  void endFormalParameterDefaultValueExpression() {
+    debugEvent("FormalParameterDefaultValueExpression", null);
+    state.pop();
+  }
+
+  @override
+  void handleFormalParameterWithoutValue(Token token) {
+    debugEvent("FormalParameterWithoutValue", token);
+  }
+
+  @override
+  void endFormalParameters(
+      int count, Token beginToken, Token endToken, MemberKind kind) {
+    debugEvent("FormalParameters", beginToken);
+  }
+
+  @override
+  void handleNoFormalParameters(Token token, MemberKind kind) {
+    debugEvent("NoFormalParameters", token);
+  }
+
+  @override
+  void handleNoFunctionBody(Token token) {
+    debugEvent("NoFunctionBody", token);
+    unhandled("NoFunctionBody", token);
+  }
+
+  @override
+  void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
+    debugEvent("FunctionBodySkipped", token);
+    unhandled("FunctionBodySkipped", token);
+  }
+
+  @override
+  void endFunctionExpression(Token beginToken, Token token) {
+    debugEvent("FunctionExpression", beginToken);
+    state.pushNull("%function%", token);
+  }
+
+  @override
+  void endFunctionName(Token beginToken, Token token) {
+    debugEvent("FunctionName", beginToken);
+  }
+
+  @override
+  void endFunctionType(Token functionToken, Token questionMark) {
+    debugEvent("FunctionType", functionToken);
+  }
+
+  @override
+  void endFunctionTypeAlias(
+      Token typedefKeyword, Token equals, Token endToken) {
+    debugEvent("FunctionTypeAlias", typedefKeyword);
+    state.pop(); // Name.
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void endFunctionTypedFormalParameter(Token nameToken) {
+    debugEvent("FunctionTypedFormalParameter", nameToken);
+  }
+
+  @override
+  void endHide(Token hideKeyword) {
+    debugEvent("Hide", hideKeyword);
+  }
+
+  @override
+  void handleIdentifier(Token token, IdentifierContext context) {
+    debugEvent("Identifier ${context}", token);
+    if (context.inSymbol) {
+      // Do nothing.
+    } else if (context.inDeclaration) {
+      if (identical(IdentifierContext.localVariableDeclaration, context) ||
+          identical(IdentifierContext.formalParameterDeclaration, context)) {
+        state.declareIdentifier(token);
+      } else {
+        state.pushNull(token.lexeme, token);
+      }
+    } else if (context.isContinuation) {
+      state.pushNull(token.lexeme, token);
+    } else if (context.isScopeReference) {
+      state.pushReference(token);
+    } else {
+      state.pushNull(token.lexeme, token);
+    }
+  }
+
+  @override
+  void handleIdentifierList(int count) {
+    debugEvent("IdentifierList", null);
+    state.discard(count);
+  }
+
+  @override
+  void endIfStatement(Token ifToken, Token elseToken) {
+    debugEvent("IfStatement", ifToken);
+    state.pop(); // Condition.
+  }
+
+  @override
+  void endImplicitCreationExpression(Token token) {
+    debugEvent("ImplicitCreationExpression", token);
+    doConstuctorInvocation(token, false);
+  }
+
+  @override
+  void endImport(Token importKeyword, Token semicolon) {
+    debugEvent("Import", importKeyword);
+    state.pop(); // Import URI.
+    state.checkEmpty(semicolon);
+  }
+
+  @override
+  void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
+    debugEvent("ImportPrefix", deferredKeyword);
+    if (asKeyword != null) {
+      state.pop(); // Prefix name.
+    }
+  }
+
+  @override
+  void handleIndexedExpression(
+      Token openSquareBracket, Token closeSquareBracket) {
+    debugEvent("IndexedExpression", openSquareBracket);
+    state.pop(); // Index.
+    state.popPushNull("%indexed%", closeSquareBracket); // Expression.
+  }
+
+  @override
+  void endInitializedIdentifier(Token nameToken) {
+    debugEvent("InitializedIdentifier", nameToken);
+  }
+
+  @override
+  void endInitializer(Token token) {
+    debugEvent("Initializer", token);
+    state.pop(); // Initializer.
+  }
+
+  @override
+  void endInitializers(int count, Token beginToken, Token endToken) {
+    debugEvent("Initializers", beginToken);
+  }
+
+  @override
+  void handleNoInitializers() {
+    debugEvent("NoInitializers", null);
+  }
+
+  @override
+  void handleInterpolationExpression(Token leftBracket, Token rightBracket) {
+    debugEvent("InterpolationExpression", leftBracket);
+    state.popPushNull(r"$", leftBracket);
+  }
+
+  @override
+  void handleInvalidExpression(Token token) {
+    // TODO(ahe): The parser doesn't generate this event anymore.
+    debugEvent("InvalidExpression", token);
+    unhandled("InvalidExpression", token);
+  }
+
+  @override
+  void handleInvalidFunctionBody(Token token) {
+    debugEvent("InvalidFunctionBody", token);
+  }
+
+  @override
+  void handleInvalidMember(Token endToken) {
+    debugEvent("InvalidMember", endToken);
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
+    debugEvent("InvalidOperatorName", operatorKeyword);
+    state.checkEmpty(operatorKeyword);
+  }
+
+  @override
+  void handleInvalidStatement(Token token, Message message) {
+    debugEvent("InvalidStatement", token);
+  }
+
+  @override
+  void handleInvalidTopLevelBlock(Token token) {
+    debugEvent("InvalidTopLevelBlock", token);
+    state.checkEmpty(token);
+  }
+
+  @override
+  void handleInvalidTopLevelDeclaration(Token endToken) {
+    debugEvent("InvalidTopLevelDeclaration", endToken);
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void handleInvalidTypeArguments(Token token) {
+    debugEvent("InvalidTypeArguments", token);
+  }
+
+  @override
+  void handleInvalidTypeReference(Token token) {
+    debugEvent("InvalidTypeReference", token);
+    unhandled("InvalidTypeReference", token);
+  }
+
+  @override
+  void handleIsOperator(Token isOperator, Token not) {
+    debugEvent("IsOperator", isOperator);
+    Declaration lhs = state.popPushNull(isOperator.lexeme, isOperator);
+    if (not == null && lhs is UnspecifiedDeclaration) {
+      state.registerPromotionCandidate(lhs, isOperator);
+    }
+  }
+
+  @override
+  void handleLabel(Token token) {
+    debugEvent("Label", token);
+    state.pop(); // Label.
+  }
+
+  @override
+  void endLabeledStatement(int labelCount) {
+    debugEvent("LabeledStatement", null);
+  }
+
+  @override
+  void endLibraryName(Token libraryKeyword, Token semicolon) {
+    debugEvent("LibraryName", libraryKeyword);
+    state.pop(); // Library name.
+    state.checkEmpty(semicolon);
+  }
+
+  @override
+  void handleLiteralBool(Token token) {
+    debugEvent("LiteralBool", token);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void handleLiteralDouble(Token token) {
+    debugEvent("LiteralDouble", token);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void handleLiteralInt(Token token) {
+    debugEvent("LiteralInt", token);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void handleLiteralList(
+      int count, Token leftBracket, Token constKeyword, Token rightBracket) {
+    debugEvent("LiteralList", leftBracket);
+    state.discard(count);
+    state.pushNull("[]", leftBracket);
+  }
+
+  @override
+  void handleLiteralSet(
+      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
+    debugEvent("LiteralSet", leftBrace);
+    state.discard(count);
+    state.pushNull("{}", leftBrace);
+  }
+
+  @override
+  void handleLiteralMap(
+      int count, Token leftBrace, Token constKeyword, Token rightBrace) {
+    debugEvent("LiteralMap", leftBrace);
+    state.discard(count);
+    state.pushNull("{}", leftBrace);
+  }
+
+  @override
+  void handleEmptyLiteralSetOrMap(
+      Token leftBrace, Token constKeyword, Token rightBrace) {
+    debugEvent("EmptyLiteralSetOrMap", leftBrace);
+    state.pushNull("{}", leftBrace);
+  }
+
+  @override
+  void handleLiteralMapEntry(Token colon, Token endToken) {
+    debugEvent("LiteralMapEntry", colon);
+    state.pop(); // Value.
+    state.popPushNull("%LiteralMapEntry%", colon); // Key.
+  }
+
+  @override
+  void handleLiteralNull(Token token) {
+    debugEvent("LiteralNull", token);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void beginLiteralString(Token token) {
+    debugEvent("beginLiteralString", token);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void endLiteralString(int interpolationCount, Token endToken) {
+    debugEvent("LiteralString", endToken);
+    state.discard(interpolationCount * 2);
+    state.popPushNull("%string%", endToken);
+  }
+
+  @override
+  void endLiteralSymbol(Token hashToken, int identifierCount) {
+    debugEvent("LiteralSymbol", hashToken);
+    state.pushNull(hashToken.lexeme, hashToken);
+  }
+
+  @override
+  void endLocalFunctionDeclaration(Token endToken) {
+    debugEvent("LocalFunctionDeclaration", endToken);
+    state.pop(); // Function name.
+  }
+
+  @override
+  void endMember() {
+    debugEvent("Member", null);
+    state.checkEmpty(null);
+  }
+
+  @override
+  void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
+    debugEvent("Metadata", beginToken);
+    state.pop(); // Arguments.
+    if (periodBeforeName != null) {
+      state.pop(); // Suffix.
+    }
+    state.pop(); // Qualifier.
+  }
+
+  @override
+  void endMetadataStar(int count) {
+    debugEvent("MetadataStar", null);
+  }
+
+  @override
+  void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
+      Token varFinalOrConst, Token getOrSet, Token name) {
+    debugEvent("beginMethod", name);
+    state.checkEmpty(name);
+  }
+
+  @override
+  void endMethod(
+      Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
+    debugEvent("endMethod", endToken);
+    state.pop(); // Method name.
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
+    debugEvent("MixinDeclaration", mixinKeyword);
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void handleMixinHeader(Token mixinKeyword) {
+    debugEvent("MixinHeader", mixinKeyword);
+    state.pop(); // Mixin name.
+    state.checkEmpty(mixinKeyword);
+  }
+
+  @override
+  void handleMixinOn(Token onKeyword, int typeCount) {
+    debugEvent("MixinOn", onKeyword);
+  }
+
+  @override
+  void handleNoName(Token token) {
+    debugEvent("NoName", token);
+    state.pushNull("%NoName%", token);
+  }
+
+  @override
+  void handleNamedArgument(Token colon) {
+    debugEvent("NamedArgument", colon);
+    state.pop(); // Expression.
+    state.popPushNull("%NamedArgument%", colon); // Identifier.
+  }
+
+  @override
+  void endNamedFunctionExpression(Token endToken) {
+    debugEvent("NamedFunctionExpression", endToken);
+    state.popPushNull(
+        "%named function expression%", endToken); // Function name.
+  }
+
+  @override
+  void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
+      Token implementsKeyword, Token endToken) {
+    debugEvent("NamedMixinApplication", begin);
+    state.pop(); // Mixin application name.
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void handleNamedMixinApplicationWithClause(Token withKeyword) {
+    debugEvent("NamedMixinApplicationWithClause", withKeyword);
+  }
+
+  @override
+  void handleNativeClause(Token nativeToken, bool hasName) {
+    debugEvent("NativeClause", nativeToken);
+    if (hasName) {
+      state.pop(); // Name.
+    }
+  }
+
+  @override
+  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
+    debugEvent("NativeFunctionBody", nativeToken);
+  }
+
+  @override
+  void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
+    debugEvent("NativeFunctionBodyIgnored", nativeToken);
+  }
+
+  @override
+  void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
+    debugEvent("NativeFunctionBodySkipped", nativeToken);
+  }
+
+  @override
+  void endNewExpression(Token token) {
+    debugEvent("NewExpression", token);
+    doConstuctorInvocation(token, false);
+  }
+
+  @override
+  void handleOperator(Token token) {
+    debugEvent("Operator", token);
+    unhandled("Operator", token);
+  }
+
+  @override
+  void handleOperatorName(Token operatorKeyword, Token token) {
+    debugEvent("OperatorName", operatorKeyword);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void endOptionalFormalParameters(
+      int count, Token beginToken, Token endToken) {
+    debugEvent("OptionalFormalParameters", beginToken);
+  }
+
+  @override
+  void handleParenthesizedCondition(Token token) {
+    debugEvent("ParenthesizedCondition", token);
+  }
+
+  @override
+  void handleParenthesizedExpression(Token token) {
+    debugEvent("ParenthesizedExpression", token);
+    state.popPushNull("%(expr)%", token);
+  }
+
+  @override
+  void endPart(Token partKeyword, Token semicolon) {
+    debugEvent("Part", partKeyword);
+    state.pop(); // URI.
+    state.checkEmpty(semicolon);
+  }
+
+  @override
+  void endPartOf(
+      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
+    debugEvent("PartOf", partKeyword);
+    state.pop(); // Name or URI.
+    state.checkEmpty(semicolon);
+  }
+
+  @override
+  void handleQualified(Token period) {
+    debugEvent("Qualified", period);
+    state.pop(); // Suffix.
+    state.popPushNull("%Qualified%", period); // Qualifier.
+  }
+
+  @override
+  void handleRecoverClassHeader() {
+    debugEvent("RecoverClassHeader", null);
+    state.checkEmpty(null);
+  }
+
+  @override
+  void handleRecoverImport(Token semicolon) {
+    debugEvent("RecoverImport", semicolon);
+    unhandled("RecoverImport", semicolon);
+  }
+
+  @override
+  void handleRecoverMixinHeader() {
+    debugEvent("RecoverMixinHeader", null);
+    state.checkEmpty(null);
+  }
+
+  @override
+  void handleRecoverableError(
+      Message message, Token startToken, Token endToken) {
+    debugEvent("RecoverableError ${message.message}", startToken);
+  }
+
+  @override
+  void endRedirectingFactoryBody(Token beginToken, Token endToken) {
+    debugEvent("RedirectingFactoryBody", beginToken);
+    state.pop(); // Constructor reference.
+  }
+
+  @override
+  void endRethrowStatement(Token rethrowToken, Token endToken) {
+    debugEvent("RethrowStatement", rethrowToken);
+  }
+
+  @override
+  void endReturnStatement(
+      bool hasExpression, Token beginToken, Token endToken) {
+    debugEvent("ReturnStatement", beginToken);
+    if (hasExpression) {
+      state.pop(); // Expression.
+    }
+  }
+
+  @override
+  void handleScript(Token token) {
+    debugEvent("Script", token);
+    unhandled("Script", token);
+  }
+
+  @override
+  void handleSend(Token beginToken, Token endToken) {
+    debugEvent("Send", beginToken);
+    Declaration arguments = state.pop();
+    if (identical(arguments, noArgumentsSentinel)) {
+      // Leave the receiver on the stack.
+    } else {
+      state.popPushNull("%send%", beginToken);
+    }
+  }
+
+  @override
+  void endShow(Token showKeyword) {
+    debugEvent("Show", showKeyword);
+  }
+
+  @override
+  void handleStringJuxtaposition(int literalCount) {
+    debugEvent("StringJuxtaposition", null);
+    state.discard(literalCount);
+    state.pushNull("%StringJuxtaposition%", null);
+  }
+
+  @override
+  void handleStringPart(Token token) {
+    debugEvent("StringPart", token);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void handleSuperExpression(Token token, IdentifierContext context) {
+    debugEvent("SuperExpression", token);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
+    debugEvent("SwitchBlock", beginToken);
+    state.pop(); // Expression.
+  }
+
+  @override
+  void endSwitchCase(
+      int labelCount,
+      int expressionCount,
+      Token defaultKeyword,
+      Token colonAfterDefault,
+      int statementCount,
+      Token firstToken,
+      Token endToken) {
+    debugEvent("SwitchCase", defaultKeyword);
+  }
+
+  @override
+  void endSwitchStatement(Token switchKeyword, Token endToken) {
+    debugEvent("SwitchStatement", switchKeyword);
+  }
+
+  @override
+  void handleSymbolVoid(Token token) {
+    debugEvent("SymbolVoid", token);
+    unhandled("SymbolVoid", token);
+  }
+
+  @override
+  void endThenStatement(Token token) {
+    debugEvent("ThenStatement", token);
+  }
+
+  @override
+  void handleThisExpression(Token token, IdentifierContext context) {
+    debugEvent("ThisExpression", token);
+    state.pushNull(token.lexeme, token);
+  }
+
+  @override
+  void handleThrowExpression(Token throwToken, Token endToken) {
+    debugEvent("ThrowExpression", throwToken);
+    state.popPushNull(throwToken.lexeme, throwToken);
+  }
+
+  @override
+  void endTopLevelDeclaration(Token token) {
+    debugEvent("TopLevelDeclaration", token);
+    state.checkEmpty(token);
+  }
+
+  @override
+  void endTopLevelFields(Token staticToken, Token covariantToken,
+      Token varFinalOrConst, int count, Token beginToken, Token endToken) {
+    debugEvent("TopLevelFields", staticToken);
+    state.discard(count); // Field names.
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
+    debugEvent("beginTopLevelMethod", lastConsumed.next);
+    state.checkEmpty(lastConsumed.next);
+  }
+
+  @override
+  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+    debugEvent("endTopLevelMethod", beginToken);
+    state.pop(); // Method name.
+    state.checkEmpty(endToken);
+  }
+
+  @override
+  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
+    debugEvent("TryStatement", tryKeyword);
+  }
+
+  @override
+  void handleType(Token beginToken, Token questionMark) {
+    debugEvent("Type", beginToken);
+    state.pop();
+  }
+
+  @override
+  void handleNoType(Token lastConsumed) {
+    debugEvent("NoType", lastConsumed);
+  }
+
+  @override
+  void endTypeArguments(int count, Token beginToken, Token endToken) {
+    debugEvent("TypeArguments", beginToken);
+  }
+
+  @override
+  void handleNoTypeArguments(Token token) {
+    debugEvent("NoTypeArguments", token);
+  }
+
+  @override
+  void endTypeList(int count) {
+    debugEvent("TypeList", null);
+  }
+
+  @override
+  void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+    debugEvent("TypeVariable", token);
+    state.pop(); // Name.
+  }
+
+  @override
+  void endTypeVariables(Token beginToken, Token endToken) {
+    debugEvent("TypeVariables", beginToken);
+  }
+
+  @override
+  void handleNoTypeVariables(Token token) {
+    debugEvent("NoTypeVariables", token);
+  }
+
+  @override
+  void handleTypeVariablesDefined(Token token, int count) {
+    debugEvent("TypeVariablesDefined", token);
+  }
+
+  @override
+  void handleUnaryPostfixAssignmentExpression(Token token) {
+    debugEvent("UnaryPostfixAssignmentExpression", token);
+    Declaration expr = state.popPushNull(token.lexeme, token);
+    if (expr is UnspecifiedDeclaration) {
+      state.registerWrite(expr, token);
+    }
+  }
+
+  @override
+  void handleUnaryPrefixAssignmentExpression(Token token) {
+    debugEvent("UnaryPrefixAssignmentExpression", token);
+    Declaration expr = state.popPushNull(token.lexeme, token);
+    if (expr is UnspecifiedDeclaration) {
+      state.registerWrite(expr, token);
+    }
+  }
+
+  @override
+  void handleUnaryPrefixExpression(Token token) {
+    debugEvent("UnaryPrefixExpression", token);
+    state.popPushNull("%UnaryPrefixExpression%", token);
+  }
+
+  @override
+  void handleUnescapeError(
+      Message message, Token location, int stringOffset, int length) {
+    debugEvent("UnescapeError", location);
+    unhandled("UnescapeError", location);
+  }
+
+  @override
+  void handleValuedFormalParameter(Token equals, Token token) {
+    debugEvent("ValuedFormalParameter", equals);
+  }
+
+  @override
+  void endVariableInitializer(Token assignmentOperator) {
+    debugEvent("VariableInitializer", assignmentOperator);
+    state.pop(); // Initializer.
+  }
+
+  @override
+  void handleNoVariableInitializer(Token token) {
+    debugEvent("NoVariableInitializer", token);
+  }
+
+  @override
+  void endVariablesDeclaration(int count, Token endToken) {
+    debugEvent("VariablesDeclaration", endToken);
+    state.discard(count); // Variable names.
+  }
+
+  @override
+  void handleVoidKeyword(Token token) {
+    debugEvent("VoidKeyword", token);
+  }
+
+  @override
+  void endWhileStatement(Token whileKeyword, Token endToken) {
+    debugEvent("WhileStatement", whileKeyword);
+    state.pop(); // Condition.
+  }
+
+  @override
+  void endWhileStatementBody(Token token) {
+    debugEvent("WhileStatementBody", token);
+  }
+
+  @override
+  void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
+    debugEvent("YieldStatement", yieldToken);
+    state.pop(); // Expression.
+  }
+
+  void unhandled(String event, Token token) {
+    problems.unhandled(
+        event, "TypePromotionLookAheadListener", token?.charOffset ?? -1, uri);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/target_implementation.dart b/pkg/front_end/lib/src/fasta/target_implementation.dart
index 08581aa..2705f16 100644
--- a/pkg/front_end/lib/src/fasta/target_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/target_implementation.dart
@@ -18,6 +18,8 @@
 
 import 'uri_translator.dart' show UriTranslator;
 
+import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+
 /// Provides the implementation details used by a loader for a target.
 abstract class TargetImplementation extends Target {
   final UriTranslator uriTranslator;
@@ -33,8 +35,15 @@
   Declaration cachedNativeAnnotation;
   Declaration cachedNativeExtensionAnnotation;
 
+  bool enableSetLiterals;
+  bool enableConstantUpdate2018;
+
   TargetImplementation(Ticker ticker, this.uriTranslator, this.backendTarget)
-      : super(ticker);
+      : enableSetLiterals = CompilerContext.current.options
+            .isExperimentEnabled(ExperimentalFlag.setLiterals),
+        enableConstantUpdate2018 = CompilerContext.current.options
+            .isExperimentEnabled(ExperimentalFlag.constantUpdate2018),
+        super(ticker);
 
   /// Creates a [LibraryBuilder] corresponding to [uri], if one doesn't exist
   /// already.
@@ -46,9 +55,6 @@
   LibraryBuilder createLibraryBuilder(
       Uri uri, Uri fileUri, covariant LibraryBuilder origin);
 
-  /// Add the classes extended or implemented directly by [cls] to [set].
-  void addDirectSupertype(ClassBuilder cls, Set<ClassBuilder> set);
-
   /// The class [cls] is involved in a cyclic definition. This method should
   /// ensure that the cycle is broken, for example, by removing superclass and
   /// implemented interfaces.
diff --git a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
index 608b2bc..0533d88 100644
--- a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
@@ -21,10 +21,18 @@
 
 import 'package:kernel/kernel.dart' show loadComponentFromBinary;
 
-import 'package:kernel/naive_type_checker.dart' show StrongModeTypeChecker;
+import 'package:kernel/naive_type_checker.dart' show NaiveTypeChecker;
 
 import 'package:kernel/text/ast_to_text.dart' show Printer;
 
+import 'package:kernel/text/text_serialization_verifier.dart'
+    show
+        TextDeserializationFailure,
+        TextRoundTripFailure,
+        TextSerializationFailure,
+        TextSerializationVerificationFailure,
+        TextSerializationVerifier;
+
 import 'package:testing/testing.dart'
     show ChainContext, Result, StdioProcess, Step;
 
@@ -39,6 +47,9 @@
 
 import '../messages.dart' show LocatedMessage;
 
+import '../fasta_codes.dart'
+    show templateInternalProblemUnhandled, templateUnspecified;
+
 class Print extends Step<Component, Component, ChainContext> {
   const Print();
 
@@ -46,13 +57,17 @@
 
   Future<Result<Component>> run(Component component, _) async {
     StringBuffer sb = new StringBuffer();
-    for (Library library in component.libraries) {
-      Printer printer = new Printer(sb);
-      if (library.importUri.scheme != "dart" &&
-          library.importUri.scheme != "package") {
-        printer.writeLibraryFile(library);
+    await CompilerContext.runWithDefaultOptions((compilerContext) async {
+      compilerContext.uriToSource.addAll(component.uriToSource);
+
+      for (Library library in component.libraries) {
+        Printer printer = new Printer(sb);
+        if (library.importUri.scheme != "dart" &&
+            library.importUri.scheme != "package") {
+          printer.writeLibraryFile(library);
+        }
       }
-    }
+    });
     print("$sb");
     return pass(component);
   }
@@ -76,7 +91,9 @@
             }
             messages.writeAll(message.plainTextFormatted, "\n");
           });
-    return await CompilerContext.runWithOptions(options, (_) async {
+    return await CompilerContext.runWithOptions(options,
+        (compilerContext) async {
+      compilerContext.uriToSource.addAll(component.uriToSource);
       List<LocatedMessage> verificationErrors = verifyComponent(component,
           isOutline: !fullCompile, skipPlatform: true);
       assert(verificationErrors.isEmpty || messages.isNotEmpty);
@@ -99,7 +116,7 @@
       Component component, ChainContext context) async {
     var errorFormatter = new ErrorFormatter();
     var checker =
-        new StrongModeTypeChecker(errorFormatter, component, ignoreSdk: true);
+        new NaiveTypeChecker(errorFormatter, component, ignoreSdk: true);
     checker.checkComponent(component);
     if (errorFormatter.numberOfFailures == 0) {
       return pass(component);
@@ -128,9 +145,10 @@
 
   Future<Result<Component>> run(Component component, dynamic context) async {
     StringBuffer messages = context.componentToDiagnostics[component];
+    Uri uri = component.uriToSource.keys
+        .firstWhere((uri) => uri != null && uri.scheme == "file");
     Library library = component.libraries
         .firstWhere((Library library) => library.importUri.scheme != "dart");
-    Uri uri = library.importUri;
     Uri base = uri.resolve(".");
     Uri dartBase = Uri.base;
     StringBuffer buffer = new StringBuffer();
@@ -164,7 +182,11 @@
       if (expected.trim() != actual.trim()) {
         if (!updateExpectations) {
           String diff = await runDiff(expectedFile.uri, actual);
-          return fail(null, "$uri doesn't match ${expectedFile.uri}\n$diff");
+          return new Result<Component>(
+              component,
+              context.expectationSet["ExpectationFileMismatch"],
+              "$uri doesn't match ${expectedFile.uri}\n$diff",
+              null);
         }
       } else {
         return pass(component);
@@ -176,13 +198,87 @@
       });
       return pass(component);
     } else {
-      return fail(component, """
+      return new Result<Component>(
+          component,
+          context.expectationSet["ExpectationFileMissing"],
+          """
 Please create file ${expectedFile.path} with this content:
-$actual""");
+$actual""",
+          null);
     }
   }
 }
 
+class KernelTextSerialization extends Step<Component, Component, ChainContext> {
+  const KernelTextSerialization();
+
+  String get name => "kernel text serialization";
+
+  Future<Result<Component>> run(
+      Component component, ChainContext context) async {
+    StringBuffer messages = new StringBuffer();
+    ProcessedOptions options = new ProcessedOptions(
+        options: new CompilerOptions()
+          ..onDiagnostic = (DiagnosticMessage message) {
+            if (messages.isNotEmpty) {
+              messages.write("\n");
+            }
+            messages.writeAll(message.plainTextFormatted, "\n");
+          });
+    return await CompilerContext.runWithOptions(options,
+        (compilerContext) async {
+      compilerContext.uriToSource.addAll(component.uriToSource);
+      TextSerializationVerifier verifier = new TextSerializationVerifier();
+      for (Library library in component.libraries) {
+        if (library.importUri.scheme != "dart" &&
+            library.importUri.scheme != "package") {
+          library.accept(verifier);
+        }
+      }
+      for (TextSerializationVerificationFailure failure in verifier.failures) {
+        LocatedMessage message;
+        if (failure is TextSerializationFailure) {
+          message = templateUnspecified
+              .withArguments(
+                  "Failed to serialize a node: ${failure.message.isNotEmpty}")
+              .withLocation(failure.uri, failure.offset, 1);
+        } else if (failure is TextDeserializationFailure) {
+          message = templateUnspecified
+              .withArguments(
+                  "Failed to deserialize a node: ${failure.message.isNotEmpty}")
+              .withLocation(failure.uri, failure.offset, 1);
+        } else if (failure is TextRoundTripFailure) {
+          String formattedInitial =
+              failure.initial.isNotEmpty ? failure.initial : "<empty>";
+          String formattedSerialized =
+              failure.serialized.isNotEmpty ? failure.serialized : "<empty>";
+          message = templateUnspecified
+              .withArguments(
+                  "Round trip failure: initial doesn't match serialized.\n"
+                  "  Initial    : $formattedInitial\n"
+                  "  Serialized : $formattedSerialized")
+              .withLocation(failure.uri, failure.offset, 1);
+        } else {
+          message = templateInternalProblemUnhandled
+              .withArguments(
+                  "${failure.runtimeType}", "KernelTextSerialization.run")
+              .withLocation(failure.uri, failure.offset, 1);
+        }
+        options.report(message, message.code.severity);
+      }
+
+      if (verifier.failures.isNotEmpty) {
+        return new Result<Component>(
+            null,
+            context.expectationSet["TextSerializationFailure"],
+            "$messages",
+            null);
+      }
+      return pass(component);
+    });
+  }
+}
+
 class WriteDill extends Step<Component, Uri, ChainContext> {
   const WriteDill();
 
diff --git a/pkg/front_end/lib/src/fasta/testing/scanner_chain.dart b/pkg/front_end/lib/src/fasta/testing/scanner_chain.dart
index 277697e..151291f 100644
--- a/pkg/front_end/lib/src/fasta/testing/scanner_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/scanner_chain.dart
@@ -10,24 +10,39 @@
 
 import '../scanner/io.dart';
 
-class Read extends Step<TestDescription, List<int>, ChainContext> {
+class ReadFile {
+  final Uri uri;
+
+  final List<int> bytes;
+
+  const ReadFile(this.uri, this.bytes);
+}
+
+class ScannedFile {
+  final ReadFile file;
+
+  final ScannerResult result;
+
+  const ScannedFile(this.file, this.result);
+}
+
+class Read extends Step<TestDescription, ReadFile, ChainContext> {
   const Read();
 
   String get name => "read";
 
-  Future<Result<List<int>>> run(
+  Future<Result<ReadFile>> run(
       TestDescription input, ChainContext context) async {
-    return pass(await readBytesFromFile(input.uri));
+    return pass(new ReadFile(input.uri, await readBytesFromFile(input.uri)));
   }
 }
 
-class Scan extends Step<List<int>, ScannerResult, ChainContext> {
+class Scan extends Step<ReadFile, ScannedFile, ChainContext> {
   const Scan();
 
   String get name => "scan";
 
-  Future<Result<ScannerResult>> run(
-      List<int> bytes, ChainContext context) async {
-    return pass(scan(bytes));
+  Future<Result<ScannedFile>> run(ReadFile file, ChainContext context) async {
+    return pass(new ScannedFile(file, scan(file.bytes)));
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
index 3c704fe..c690103 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
@@ -8,15 +8,14 @@
 
 import '../fasta_codes.dart' show LocatedMessage, Message;
 
-import '../kernel/kernel_shadow_ast.dart' show SyntheticExpressionJudgment;
-
 abstract class InferenceHelper {
   CoreTypes get coreTypes;
 
   Uri get uri;
 
-  SyntheticExpressionJudgment buildProblem(
-      Message message, int charOffset, int length,
+  set transformSetLiterals(bool value);
+
+  Expression buildProblem(Message message, int charOffset, int length,
       {List<LocatedMessage> context, bool suppressMessage});
 
   LocatedMessage checkArgumentsForType(
@@ -30,4 +29,6 @@
 
   String constructorNameForDiagnostics(String name,
       {String className, bool isSuper});
+
+  Expression desugarSyntheticExpression(Expression node);
 }
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index 879e18f..3c999dc 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -33,7 +33,8 @@
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
+import 'package:kernel/src/hierarchy_based_type_environment.dart'
+    show HierarchyBasedTypeEnvironment;
 
 import '../../base/instrumentation.dart'
     show
@@ -257,7 +258,6 @@
   /// they would not be checked in an inherited implementation, a forwarding
   /// stub is introduced as a place to put the checks.
   Procedure _computeCovarianceFixes(Procedure interfaceMember) {
-    assert(_interfaceResolver.strongMode);
     var substitution =
         _interfaceResolver._substitutionFor(interfaceMember, enclosingClass);
     // We always create a forwarding stub when we've inherited a member from an
@@ -546,9 +546,7 @@
   /// Creates a forwarding stub for this node if necessary, and propagates
   /// covariance information.
   Procedure _finalize() {
-    return _interfaceResolver.strongMode
-        ? _computeCovarianceFixes(resolve())
-        : resolve();
+    return _computeCovarianceFixes(resolve());
   }
 
   /// Returns the [i]th element of [_candidates], finalizing it if necessary.
@@ -678,14 +676,12 @@
 class InterfaceResolver {
   final TypeInferenceEngine _typeInferenceEngine;
 
-  final TypeEnvironment _typeEnvironment;
+  final HierarchyBasedTypeEnvironment _typeEnvironment;
 
   final Instrumentation _instrumentation;
 
-  final bool strongMode;
-
-  InterfaceResolver(this._typeInferenceEngine, this._typeEnvironment,
-      this._instrumentation, this.strongMode);
+  InterfaceResolver(
+      this._typeInferenceEngine, this._typeEnvironment, this._instrumentation);
 
   /// Indicates whether the "prepare" phase of type inference is complete.
   bool get isTypeInferencePrepared =>
@@ -839,7 +835,7 @@
     // getter and a setter.  We will report both conflicts.
     Map<Name, List<Member>> staticMembers = {};
     for (var procedure in class_.procedures) {
-      if (procedure.isStatic) {
+      if (procedure.isStatic && !procedure.isFactory) {
         staticMembers.putIfAbsent(procedure.name, () => []).add(procedure);
       }
     }
@@ -924,9 +920,7 @@
             return;
           }
         }
-        if (strongMode &&
-            member.enclosingClass == class_ &&
-            _requiresTypeInference(member)) {
+        if (member.enclosingClass == class_ && _requiresTypeInference(member)) {
           inferMethodType(library, class_, member, candidates, start + 1, end);
         }
         var forwardingNode = new ForwardingNode(
@@ -1067,7 +1061,7 @@
       if (resolution is Procedure &&
           resolution.isSyntheticForwarder &&
           identical(resolution.enclosingClass, class_)) {
-        if (strongMode) class_.addMember(resolution);
+        class_.addMember(resolution);
         _instrumentation?.record(
             class_.location.file,
             class_.fileOffset,
@@ -1128,10 +1122,10 @@
       Uri fileUri) {
     InferenceNode node;
     if (procedure.isAccessor && _requiresTypeInference(procedure)) {
-      if (strongMode && start < end) {
+      if (start < end) {
         node = new AccessorInferenceNode(
             this, procedure, candidates, start, end, library, fileUri);
-      } else if (strongMode && crossStart < crossEnd) {
+      } else if (crossStart < crossEnd) {
         node = new AccessorInferenceNode(this, procedure, candidates,
             crossStart, crossEnd, library, fileUri);
       } else if (procedure is SyntheticAccessor &&
@@ -1251,8 +1245,8 @@
   /// Determines the appropriate substitution to translate type parameters
   /// mentioned in the given [candidate] to type parameters on [class_].
   Substitution _substitutionFor(Procedure candidate, Class class_) {
-    return Substitution.fromInterfaceType(_typeEnvironment.hierarchy
-        .getTypeAsInstanceOf(class_.thisType, candidate.enclosingClass));
+    return Substitution.fromInterfaceType(_typeEnvironment.getTypeAsInstanceOf(
+        class_.thisType, candidate.enclosingClass));
   }
 
   /// Executes [callback] once for each uniquely named member of [candidates].
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index 23402c5..91df6f16 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -181,7 +181,7 @@
     // above is irrelevant; we just need to find the matched superclass,
     // substitute, and then iterate through type variables.
     var matchingSupertypeOfSubtype =
-        environment.hierarchy.getTypeAsInstanceOf(subtype, supertype.classNode);
+        environment.getTypeAsInstanceOf(subtype, supertype.classNode);
     if (matchingSupertypeOfSubtype == null) return false;
     for (int i = 0; i < supertype.classNode.typeParameters.length; i++) {
       if (!_isSubtypeMatch(matchingSupertypeOfSubtype.typeArguments[i],
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index c5ebbb1..94cff43 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -48,29 +48,27 @@
 
   @override
   void resolveInternal() {
-    if (_typeInferenceEngine.strongMode) {
-      var typeInferrer = _typeInferenceEngine.getFieldTypeInferrer(field);
-      // Note: in the event that there is erroneous code, it's possible for
-      // typeInferrer to be null.  If this happens, just skip type inference for
-      // this field.
-      if (typeInferrer != null) {
-        var inferredType = typeInferrer
-            .inferDeclarationType(typeInferrer.inferFieldTopLevel(field));
-        if (isCircular) {
-          // Report the appropriate error.
-          _library.addProblem(
-              templateCantInferTypeDueToCircularity
-                  .withArguments(field.name.name),
-              field.fileOffset,
-              noLength,
-              field.fileUri);
-          inferredType = const DynamicType();
-        }
-        field.setInferredType(
-            _typeInferenceEngine, typeInferrer.uri, inferredType);
-        // TODO(paulberry): if type != null, then check that the type of the
-        // initializer is assignable to it.
+    var typeInferrer = _typeInferenceEngine.getFieldTypeInferrer(field);
+    // Note: in the event that there is erroneous code, it's possible for
+    // typeInferrer to be null.  If this happens, just skip type inference for
+    // this field.
+    if (typeInferrer != null) {
+      var inferredType = typeInferrer
+          .inferDeclarationType(typeInferrer.inferFieldTopLevel(field));
+      if (isCircular) {
+        // Report the appropriate error.
+        _library.addProblem(
+            templateCantInferTypeDueToCircularity
+                .withArguments(field.name.name),
+            field.fileOffset,
+            noLength,
+            field.fileUri);
+        inferredType = const DynamicType();
       }
+      field.setInferredType(
+          _typeInferenceEngine, typeInferrer.uri, inferredType);
+      // TODO(paulberry): if type != null, then check that the type of the
+      // initializer is assignable to it.
     }
     // TODO(paulberry): the following is a hack so that outlines don't contain
     // initializers.  But it means that we rebuild the initializers when doing
@@ -227,13 +225,7 @@
 
   final Instrumentation instrumentation;
 
-  final bool strongMode;
-
-  TypeInferenceEngine(this.instrumentation, this.strongMode);
-
-  /// Creates a disabled type inferrer (intended for debugging and profiling
-  /// only).
-  TypeInferrer createDisabledTypeInferrer();
+  TypeInferenceEngine(this.instrumentation);
 
   /// Creates a type inferrer for use inside of a method body declared in a file
   /// with the given [uri].
@@ -300,7 +292,7 @@
     this.coreTypes = coreTypes;
     this.classHierarchy = hierarchy;
     this.typeSchemaEnvironment =
-        new TypeSchemaEnvironment(coreTypes, hierarchy, strongMode);
+        new TypeSchemaEnvironment(coreTypes, hierarchy);
   }
 
   /// Records that the given static [field] will need top level type inference.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 6c4a2c6..393c70b 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -54,7 +54,9 @@
 import 'package:kernel/core_types.dart' show CoreTypes;
 
 import 'package:kernel/type_algebra.dart'
-    show calculateBounds, getFreshTypeParameters, Substitution;
+    show getFreshTypeParameters, Substitution;
+
+import 'package:kernel/src/bounds_checks.dart' show calculateBounds;
 
 import '../../base/instrumentation.dart'
     show
@@ -101,6 +103,8 @@
         ShadowClass,
         ShadowField,
         ShadowMember,
+        ShadowTypeInferenceEngine,
+        ShadowTypeInferrer,
         VariableDeclarationJudgment,
         getExplicitTypeArguments,
         getInferredType;
@@ -122,7 +126,7 @@
 import 'type_inference_engine.dart'
     show IncludesTypeParametersCovariantly, TypeInferenceEngine;
 
-import 'type_promotion.dart' show TypePromoter, TypePromoterDisabled;
+import 'type_promotion.dart' show TypePromoter;
 
 import 'type_schema.dart' show isKnown, UnknownType;
 
@@ -444,7 +448,14 @@
 abstract class TypeInferrer {
   final CoreTypes coreTypes;
 
-  TypeInferrer(this.coreTypes);
+  TypeInferrer.private(this.coreTypes);
+
+  factory TypeInferrer(
+      ShadowTypeInferenceEngine engine,
+      Uri uri,
+      bool topLevel,
+      InterfaceType thisType,
+      KernelLibraryBuilder library) = ShadowTypeInferrer.private;
 
   KernelLibraryBuilder get library;
 
@@ -484,49 +495,6 @@
       kernel.Expression initializer, DartType declaredType);
 }
 
-/// Implementation of [TypeInferrer] which doesn't do any type inference.
-///
-/// This is intended for profiling, to ensure that type inference and type
-/// promotion do not slow down compilation too much.
-class TypeInferrerDisabled extends TypeInferrer {
-  @override
-  final typePromoter = new TypePromoterDisabled();
-
-  @override
-  final TypeSchemaEnvironment typeSchemaEnvironment;
-
-  TypeInferrerDisabled(this.typeSchemaEnvironment) : super(null);
-
-  @override
-  KernelLibraryBuilder get library => null;
-
-  @override
-  Uri get uri => null;
-
-  @override
-  void inferFieldInitializer(InferenceHelper helper, DartType declaredType,
-      kernel.Expression initializer) {}
-
-  @override
-  void inferFunctionBody(InferenceHelper helper, DartType returnType,
-      AsyncMarker asyncMarker, Statement body) {}
-
-  @override
-  void inferInitializer(
-      InferenceHelper helper, kernel.Initializer initializer) {}
-
-  @override
-  void inferMetadata(
-      InferenceHelper helper, List<kernel.Expression> annotations) {}
-
-  @override
-  void inferMetadataKeepingHelper(List<kernel.Expression> annotations) {}
-
-  @override
-  void inferParameterInitializer(InferenceHelper helper,
-      kernel.Expression initializer, DartType declaredType) {}
-}
-
 /// Derived class containing generic implementations of [TypeInferrer].
 ///
 /// This class contains as much of the implementation of type inference as
@@ -548,8 +516,6 @@
   /// should apply.
   final bool isTopLevel;
 
-  final bool strongMode;
-
   final ClassHierarchy classHierarchy;
 
   final Instrumentation instrumentation;
@@ -577,14 +543,13 @@
   /// if the last invocation didn't require any inference.
   FunctionType lastCalleeType;
 
-  TypeInferrerImpl(
+  TypeInferrerImpl.private(
       this.engine, this.uri, bool topLevel, this.thisType, this.library)
-      : strongMode = engine.strongMode,
-        classHierarchy = engine.classHierarchy,
+      : classHierarchy = engine.classHierarchy,
         instrumentation = topLevel ? null : engine.instrumentation,
         typeSchemaEnvironment = engine.typeSchemaEnvironment,
         isTopLevel = topLevel,
-        super(engine.coreTypes);
+        super.private(engine.coreTypes);
 
   DartType storeInferredType(TreeNode node, DartType type) {
     if (node is ExpressionJudgment) {
@@ -667,9 +632,6 @@
     // is inferred (the kernel code is discarded).
     if (isTopLevel) return null;
 
-    // This logic is strong mode only; in legacy mode anything goes.
-    if (!strongMode) return null;
-
     // If an interface type is being assigned to a function type, see if we
     // should tear off `.call`.
     // TODO(paulberry): use resolveTypeParameter.  See findInterfaceMember.
@@ -777,11 +739,6 @@
       bool instrumented: true}) {
     assert(receiverType != null && isKnown(receiverType));
 
-    // Our non-strong golden files currently don't include interface
-    // targets, so we can't store the interface target without causing tests
-    // to fail.  TODO(paulberry): fix this.
-    if (!strongMode) return null;
-
     receiverType = resolveTypeParameter(receiverType);
 
     if (receiverType is FunctionType && name.name == 'call') {
@@ -815,12 +772,10 @@
           new Let(
               new VariableDeclaration.forValue(receiver)
                 ..fileOffset = receiver.fileOffset,
-              helper
-                  .buildProblem(
-                      errorTemplate.withArguments(name.name, receiverType),
-                      fileOffset,
-                      length)
-                  .desugared)
+              helper.desugarSyntheticExpression(helper.buildProblem(
+                  errorTemplate.withArguments(name.name, receiverType),
+                  fileOffset,
+                  length)))
             ..fileOffset = fileOffset);
     }
     return interfaceMember;
@@ -859,7 +814,7 @@
               new InstrumentationValueForMember(interfaceMember));
         }
         methodInvocation.interfaceTarget = interfaceMember;
-      } else if (strongMode && interfaceMember is Member) {
+      } else if (interfaceMember is Member) {
         methodInvocation.interfaceTarget = interfaceMember;
       }
       return interfaceMember;
@@ -868,7 +823,7 @@
       var interfaceMember = findInterfaceMember(
           receiverType, methodInvocation.name, methodInvocation.fileOffset,
           instrumented: instrumented);
-      if (strongMode && interfaceMember is Member) {
+      if (interfaceMember is Member) {
         methodInvocation.interfaceTarget = interfaceMember;
       }
       return interfaceMember;
@@ -891,7 +846,7 @@
           expression: propertyGet,
           receiver: propertyGet.receiver,
           instrumented: instrumented);
-      if (strongMode && interfaceMember is Member) {
+      if (interfaceMember is Member) {
         if (instrumented &&
             instrumentation != null &&
             receiverType == const DynamicType()) {
@@ -906,7 +861,7 @@
       var interfaceMember = findInterfaceMember(
           receiverType, propertyGet.name, propertyGet.fileOffset,
           instrumented: instrumented);
-      if (strongMode && interfaceMember is Member) {
+      if (interfaceMember is Member) {
         propertyGet.interfaceTarget = interfaceMember;
       }
       return interfaceMember;
@@ -928,7 +883,7 @@
           receiver: propertySet.receiver,
           setter: true,
           instrumented: instrumented);
-      if (strongMode && interfaceMember is Member) {
+      if (interfaceMember is Member) {
         if (instrumented &&
             instrumentation != null &&
             receiverType == const DynamicType()) {
@@ -943,7 +898,7 @@
       var interfaceMember = findInterfaceMember(
           receiverType, propertySet.name, propertySet.fileOffset,
           setter: true, instrumented: instrumented);
-      if (strongMode && interfaceMember is Member) {
+      if (interfaceMember is Member) {
         propertySet.interfaceTarget = interfaceMember;
       }
       return interfaceMember;
@@ -1191,20 +1146,18 @@
       {bool isVoidAllowed});
 
   @override
-  void inferFieldInitializer(InferenceHelper helper, DartType declaredType,
-      kernel.Expression initializer) {
+  void inferFieldInitializer(
+    InferenceHelper helper,
+    DartType context,
+    kernel.Expression initializer,
+  ) {
     assert(closureContext == null);
+    assert(!isTopLevel);
     this.helper = helper;
-    var actualType = inferExpression(
-        initializer,
-        declaredType ?? const UnknownType(),
-        !isTopLevel || declaredType != null,
-        isVoidAllowed: true);
-    if (declaredType != null) {
-      ensureAssignable(
-          declaredType, actualType, initializer, initializer.fileOffset,
-          isVoidAllowed: declaredType is VoidType);
-    }
+    var actualType =
+        inferExpression(initializer, context, true, isVoidAllowed: true);
+    ensureAssignable(context, actualType, initializer, initializer.fileOffset,
+        isVoidAllowed: context is VoidType);
     this.helper = null;
   }
 
@@ -1254,7 +1207,6 @@
     List<DartType> explicitTypeArguments = getExplicitTypeArguments(arguments);
     bool inferenceNeeded = !skipTypeArgumentInference &&
         explicitTypeArguments == null &&
-        strongMode &&
         calleeTypeParameters.isNotEmpty;
     bool typeChecksNeeded = !isTopLevel;
     List<DartType> inferredTypes;
@@ -1317,10 +1269,10 @@
     if (named.length == 2) {
       if (named[0].name == named[1].name) {
         var name = named[1].name;
-        var error = helper
-            .buildProblem(templateDuplicatedNamedArgument.withArguments(name),
-                named[1].fileOffset, name.length)
-            .desugared;
+        var error = helper.desugarSyntheticExpression(helper.buildProblem(
+            templateDuplicatedNamedArgument.withArguments(name),
+            named[1].fileOffset,
+            name.length));
         arguments.named = [new kernel.NamedExpression(named[1].name, error)];
         formalTypes.removeLast();
         actualTypes.removeLast();
@@ -1335,10 +1287,11 @@
         if (seenNames.containsKey(name)) {
           hasProblem = true;
           var prevNamedExpression = seenNames[name];
-          prevNamedExpression.value = helper
-              .buildProblem(templateDuplicatedNamedArgument.withArguments(name),
-                  expression.fileOffset, name.length)
-              .desugared
+          prevNamedExpression.value = helper.desugarSyntheticExpression(
+              helper.buildProblem(
+                  templateDuplicatedNamedArgument.withArguments(name),
+                  expression.fileOffset,
+                  name.length))
             ..parent = prevNamedExpression;
           formalTypes.removeAt(namedTypeIndex);
           actualTypes.removeAt(namedTypeIndex);
@@ -1414,19 +1367,12 @@
       for (var i = 0; i < positionalParameters.length; i++) {
         var parameter = positionalParameters[i];
         inferMetadataKeepingHelper(parameter.annotations);
-        if (i >= function.requiredParameterCount &&
-            parameter.initializer == null) {
-          parameter.initializer = new NullLiteral()..parent = parameter;
-        }
         if (parameter.initializer != null) {
           inferExpression(parameter.initializer, parameter.type, !isTopLevel);
         }
       }
       for (var parameter in function.namedParameters) {
         inferMetadataKeepingHelper(parameter.annotations);
-        if (parameter.initializer == null) {
-          parameter.initializer = new NullLiteral()..parent = parameter;
-        }
         inferExpression(parameter.initializer, parameter.type, !isTopLevel);
       }
     }
@@ -1453,7 +1399,7 @@
     Substitution substitution;
     List<DartType> formalTypesFromContext =
         new List<DartType>.filled(formals.length, null);
-    if (strongMode && typeContext is FunctionType) {
+    if (typeContext is FunctionType) {
       for (int i = 0; i < formals.length; i++) {
         if (i < function.positionalParameters.length) {
           formalTypesFromContext[i] =
@@ -1513,7 +1459,7 @@
 
     // Apply type inference to `B` in return context `N’`, with any references
     // to `xi` in `B` having type `Pi`.  This produces `B’`.
-    bool needToSetReturnType = hasImplicitReturnType && strongMode;
+    bool needToSetReturnType = hasImplicitReturnType;
     ClosureContext oldClosureContext = this.closureContext;
     ClosureContext closureContext = new ClosureContext(
         this, function.asyncMarker, returnContext, needToSetReturnType);
@@ -1537,9 +1483,6 @@
       instrumentation?.record(uri, fileOffset, 'returnType',
           new InstrumentationValueForType(inferredReturnType));
       function.returnType = inferredReturnType;
-    } else if (!strongMode && hasImplicitReturnType) {
-      function.returnType =
-          closureContext._wrapAsyncOrGenerator(this, const DynamicType());
     }
     this.closureContext = oldClosureContext;
     return new ExpressionInferenceResult(null, function.functionType);
@@ -1589,9 +1532,7 @@
     var receiverType = receiver == null
         ? thisType
         : inferExpression(receiver, const UnknownType(), true);
-    if (strongMode) {
-      receiverVariable?.type = receiverType;
-    }
+    receiverVariable?.type = receiverType;
     if (desugaredInvocation != null) {
       interfaceMember =
           findMethodInvocationMember(receiverType, desugaredInvocation);
@@ -1627,8 +1568,7 @@
     handleInvocationContravariance(checkKind, desugaredInvocation, arguments,
         expression, inferredType, functionType, fileOffset);
     if (!identical(interfaceMember, 'call')) {
-      if (strongMode &&
-          isImplicitCall &&
+      if (isImplicitCall &&
           interfaceMember != null &&
           !(interfaceMember is Procedure &&
               interfaceMember.kind == ProcedureKind.Method) &&
@@ -1667,6 +1607,7 @@
       library.checkBoundsInMethodInvocation(
           actualReceiverType,
           typeSchemaEnvironment,
+          classHierarchy,
           this,
           actualMethodName,
           interfaceTarget,
@@ -1706,9 +1647,7 @@
       inferExpression(receiver, const UnknownType(), true);
       receiverType = getInferredType(receiver, this);
     }
-    if (strongMode) {
-      receiverVariable?.type = receiverType;
-    }
+    receiverVariable?.type = receiverType;
     propertyName ??= desugaredGet.name;
     if (desugaredGet != null) {
       interfaceMember = findInterfaceMember(
@@ -1716,7 +1655,7 @@
           errorTemplate: templateUndefinedGetter,
           expression: expression,
           receiver: receiver);
-      if (strongMode && interfaceMember is Member) {
+      if (interfaceMember is Member) {
         if (instrumentation != null && receiverType == const DynamicType()) {
           instrumentation.record(uri, desugaredGet.fileOffset, 'target',
               new InstrumentationValueForMember(interfaceMember));
@@ -1755,8 +1694,7 @@
   /// (if necessary).
   DartType instantiateTearOff(
       DartType tearoffType, DartType context, Expression expression) {
-    if (strongMode &&
-        tearoffType is FunctionType &&
+    if (tearoffType is FunctionType &&
         context is FunctionType &&
         context.typeParameters.isEmpty) {
       var typeParameters = tearoffType.typeParameters;
@@ -2092,7 +2030,7 @@
       Class mixinClass = mixedInType.classNode;
       Supertype mixinSupertype = mixinClass.supertype;
       gatherer = new TypeConstraintGatherer(
-          new TypeSchemaEnvironment(loader.coreTypes, hierarchy, true),
+          new TypeSchemaEnvironment(loader.coreTypes, hierarchy),
           mixinClass.typeParameters);
       // Generate constraints based on the mixin's supertype.
       generateConstraints(hierarchy, mixinClass, baseType, mixinSupertype);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
index 791a584..80c10e5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
@@ -9,6 +9,8 @@
 
 import '../problems.dart' show internalProblem;
 
+import '../kernel/kernel_shadow_ast.dart' show ShadowTypePromoter;
+
 import 'type_schema_environment.dart' show TypeSchemaEnvironment;
 
 /// Keeps track of the state necessary to perform type promotion.
@@ -31,6 +33,13 @@
 /// generic parameters.  Derived classes should set E and V to the class they
 /// use to represent expressions and variable declarations, respectively.
 abstract class TypePromoter {
+  TypePromoter.private();
+
+  factory TypePromoter(TypeSchemaEnvironment typeSchemaEnvironment) =
+      ShadowTypePromoter.private;
+
+  factory TypePromoter.disabled() = TypePromoterDisabled.private;
+
   /// Returns the current type promotion scope.
   TypePromotionScope get currentScope;
 
@@ -90,6 +99,8 @@
 /// This is intended for profiling, to ensure that type inference and type
 /// promotion do not slow down compilation too much.
 class TypePromoterDisabled extends TypePromoter {
+  TypePromoterDisabled.private() : super.private();
+
   @override
   TypePromotionScope get currentScope => null;
 
@@ -177,12 +188,13 @@
   /// created.
   int _lastFactSequenceNumber = 0;
 
-  TypePromoterImpl(TypeSchemaEnvironment typeSchemaEnvironment)
+  TypePromoterImpl.private(TypeSchemaEnvironment typeSchemaEnvironment)
       : this._(typeSchemaEnvironment, new _NullFact());
 
   TypePromoterImpl._(this.typeSchemaEnvironment, _NullFact this._nullFacts)
       : _factCacheState = _nullFacts,
-        _currentFacts = _nullFacts {
+        _currentFacts = _nullFacts,
+        super.private() {
     _factCache[null] = _nullFacts;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
index 060aad1..e742fd0 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
@@ -6,6 +6,7 @@
     show
         DartType,
         DartTypeVisitor,
+        DartTypeVisitor1,
         FunctionType,
         InterfaceType,
         TypedefType,
@@ -84,6 +85,9 @@
   }
 
   @override
+  accept1(DartTypeVisitor1 v, arg) => v.defaultDartType(this, arg);
+
+  @override
   visitChildren(Visitor v) {}
 }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
index 519c3df..cf4c6bf 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
@@ -77,9 +77,11 @@
       }
     }
     isLeastClosure = !isLeastClosure;
+    DartType typedefType = node.typedefType?.accept(this);
     if (newReturnType == null &&
         newPositionalParameters == null &&
-        newNamedParameters == null) {
+        newNamedParameters == null &&
+        typedefType == null) {
       // No types had to be substituted.
       return null;
     } else {
@@ -89,7 +91,7 @@
           namedParameters: newNamedParameters ?? node.namedParameters,
           typeParameters: node.typeParameters,
           requiredParameterCount: node.requiredParameterCount,
-          typedefReference: node.typedefReference);
+          typedefType: typedefType);
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index 8b5aac7..3aa0279 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -23,7 +23,8 @@
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
+import 'package:kernel/src/hierarchy_based_type_environment.dart'
+    show HierarchyBasedTypeEnvironment;
 
 import 'type_constraint_gatherer.dart' show TypeConstraintGatherer;
 
@@ -46,7 +47,9 @@
           .toList(),
       typeParameters: newTypeParameters,
       requiredParameterCount: type.requiredParameterCount,
-      typedefReference: type.typedefReference);
+      typedefType: type.typedefType == null
+          ? null
+          : substitution.substituteType(type.typedefType));
 }
 
 /// Given a [FunctionType], gets the type of the named parameter with the given
@@ -87,10 +90,9 @@
       '${typeSchemaToString(lower)} <: <type> <: ${typeSchemaToString(upper)}';
 }
 
-class TypeSchemaEnvironment extends TypeEnvironment {
-  TypeSchemaEnvironment(
-      CoreTypes coreTypes, ClassHierarchy hierarchy, bool strongMode)
-      : super(coreTypes, hierarchy, strongMode: strongMode);
+class TypeSchemaEnvironment extends HierarchyBasedTypeEnvironment {
+  TypeSchemaEnvironment(CoreTypes coreTypes, ClassHierarchy hierarchy)
+      : super(coreTypes, hierarchy);
 
   /// Modify the given [constraint]'s lower bound to include [lower].
   void addLowerBound(TypeConstraint constraint, DartType lower) {
@@ -743,7 +745,7 @@
       }
       return new InterfaceType(type1.classNode, tArgs);
     }
-    return hierarchy.getClassicLeastUpperBound(type1, type2);
+    return hierarchy.getLegacyLeastUpperBound(type1, type2);
   }
 
   DartType _typeParameterStandardUpperBound(DartType type1, DartType type2) {
diff --git a/pkg/front_end/lib/src/fasta/util/error_reporter_file_copier.dart b/pkg/front_end/lib/src/fasta/util/error_reporter_file_copier.dart
new file mode 100644
index 0000000..4cddf72
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/error_reporter_file_copier.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' show Directory, File, GZipCodec;
+
+Uri saveAsGzip(List<int> data, String filename) {
+  // TODO(jensj): This should be done via the FileSystem instead, but it
+  // currently doesn't support writing.
+  GZipCodec gZipCodec = new GZipCodec();
+  List<int> gzippedInitializedFromData = gZipCodec.encode(data);
+  Directory tempDir = Directory.systemTemp.createTempSync("$filename");
+  File file = new File("${tempDir.path}/${filename}.gz");
+  file.writeAsBytesSync(gzippedInitializedFromData);
+  return file.uri;
+}
diff --git a/pkg/front_end/lib/src/scanner/token.dart b/pkg/front_end/lib/src/scanner/token.dart
index 4d07967..119006f 100644
--- a/pkg/front_end/lib/src/scanner/token.dart
+++ b/pkg/front_end/lib/src/scanner/token.dart
@@ -1275,6 +1275,10 @@
       '>>=', 'GT_GT_EQ', ASSIGNMENT_PRECEDENCE, GT_GT_EQ_TOKEN,
       isOperator: true);
 
+  static const TokenType GT_GT_GT = const TokenType(
+      '>>>', 'GT_GT_GT', SHIFT_PRECEDENCE, GT_GT_GT_TOKEN,
+      isOperator: true, isUserDefinableOperator: true);
+
   static const TokenType HASH =
       const TokenType('#', 'HASH', NO_PRECEDENCE, HASH_TOKEN);
 
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index be04c73..20e3338 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -62,11 +62,14 @@
 ConstEvalDuplicateKey/example: Fail
 ConstEvalFailedAssertion/example: Fail
 ConstEvalFailedAssertionWithMessage/example: Fail
+ConstEvalFreeTypeParameter/analyzerCode: Fail
+ConstEvalFreeTypeParameter/example: Fail
 ConstEvalInvalidBinaryOperandType/analyzerCode: Fail # CONST_EVAL_TYPE_NUM / CONST_EVAL_TYPE_BOOL
 ConstEvalInvalidBinaryOperandType/example: Fail
 ConstEvalInvalidMethodInvocation/example: Fail
 ConstEvalInvalidStaticInvocation/example: Fail
 ConstEvalInvalidStringInterpolationOperand/example: Fail
+ConstEvalInvalidSymbolName/example: Fail
 ConstEvalInvalidType/analyzerCode: Fail # CONST_CONSTRUCTOR_FIELD_TYPE_MISMATCH / CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH / CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH / ...
 ConstEvalInvalidType/example: Fail
 ConstEvalNegativeShift/analyzerCode: Fail # http://dartbug.com/33481
@@ -169,6 +172,7 @@
 FastaUsageLong/example: Fail
 FastaUsageShort/analyzerCode: Fail
 FastaUsageShort/example: Fail
+FieldInitializedOutsideDeclaringClass/script1: Fail
 FieldInitializerOutsideConstructor/script1: Fail
 FinalAndCovariant/script2: Fail
 FinalFieldWithoutInitializer/example: Fail
@@ -196,6 +200,7 @@
 ImplementsFutureOr/analyzerCode: Fail # The analyzer doesn't report this error.
 ImplicitCallOfNonMethod/example: Fail
 ImportAfterPart/script1: Fail
+IncompatibleRedirecteeFunctionType/script6: Fail # Triggers multiple errors.
 InitializerForStaticField/example: Fail
 InitializerOutsideConstructor/example: Fail
 InputFileNotFound/analyzerCode: Fail
@@ -214,6 +219,7 @@
 InvalidCatchArguments/example: Fail
 InvalidContinueTarget/analyzerCode: Fail
 InvalidContinueTarget/example: Fail
+InvalidInitializer/analyzerCode: Fail # The analyzer reports a different error
 InvalidInitializer/example: Fail
 InvalidPackageUri/analyzerCode: Fail
 InvalidPackageUri/example: Fail
@@ -277,7 +283,6 @@
 PackageNotFound/example: Fail
 PackagesFileFormat/analyzerCode: Fail # Analyzer crashes when .packages file has format error
 PartOfLibraryNameMismatch/example: Fail
-PartOfTwice/script2: Fail # TODO(ahe): Investigate why this fails.
 PartOfUriMismatch/example: Fail
 PartOfUseUri/example: Fail
 PartOrphan/analyzerCode: Fail # Analyzer can't handle this situation
@@ -307,6 +312,11 @@
 SdkSpecificationNotFound/example: Fail
 SdkSummaryNotFound/analyzerCode: Fail
 SdkSummaryNotFound/example: Fail
+SetLiteralTooManyTypeArguments/analyzerCode: Fail
+SetLiteralTooManyTypeArguments/example: Fail
+SetLiteralsNotSupported/analyzerCode: Fail
+SetOrMapLiteralTooManyTypeArguments/analyzerCode: Fail
+SetOrMapLiteralTooManyTypeArguments/example: Fail
 SetterNotFound/example: Fail
 SetterNotSync/example: Fail
 SetterWithWrongNumberOfFormals/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 60bb455..a885932 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -55,7 +55,9 @@
 # `#unicode` a Unicode short identifier (U+xxxx). We use this to represent code
 #  units or code points.
 #
-# `#name`, `#name2`, `#name3`: names (as strings).
+# `#name`, `#name2`, `#name3`, `#name4`: names (as strings).
+#
+# `#names`: A list of names (strings).
 #
 # `#lexeme` a token. The token's `lexeme` property is used.
 #
@@ -64,7 +66,7 @@
 #    do not use them for composing error messages, see [diagnostics.md](
 #    lib/src/fasta/diagnostics.md#avoid-composing-messages-programmatically).
 #
-# `#type`, #type2`: Kernel types.
+# `#type`, #type2`, `#type3`: Kernel types.
 #
 # `#uri`, `#uri2`, `#uri3`: URIs.
 #
@@ -116,6 +118,10 @@
   template: "The invocation of '#name' is not allowed within a const context."
   analyzerCode: CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
 
+ConstEvalInvalidSymbolName:
+  template: "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '#constant'."
+  analyzerCode: CONST_EVAL_THROWS_EXCEPTION
+
 ConstEvalFailedAssertion:
   template: "This assertion failed."
   analyzerCode: CONST_EVAL_THROWS_EXCEPTION
@@ -137,6 +143,9 @@
     from the import.
   analyzerCode: NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY
 
+ConstEvalFreeTypeParameter:
+  template: "The type '#type' is not a constant because it depends on a type parameter, only instantiated types are allowed."
+
 NotConstantExpression:
   template: "#string is not a constant expression."
   analyzerCode: NOT_CONSTANT_EXPRESSION
@@ -647,9 +656,10 @@
     - "class C { static external f(); }"
 
 ExternalConstructorWithBody:
+  index: 87
   template: "External constructors can't have a body."
   tip: "Try removing the body of the constructor, or removing the keyword 'external'."
-  analyzerCode: EXTERNAL_CONSTRUCTOR_WITH_BODY
+  analyzerCode: ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY
   script:
     - "class C { external C() {} }"
 
@@ -659,9 +669,10 @@
   analyzerCode: EXTERNAL_CONSTRUCTOR_WITH_FIELD_INITIALIZERS
 
 ExternalFactoryWithBody:
+  index: 86
   template: "External factories can't have a body."
   tip: "Try removing the body of the factory, or removing the keyword 'external'."
-  analyzerCode: EXTERNAL_CONSTRUCTOR_WITH_BODY
+  analyzerCode: ParserErrorCode.EXTERNAL_FACTORY_WITH_BODY
   script:
     - "class C { external factory C() {} }"
 
@@ -750,9 +761,10 @@
     - "class C { final covariant f = 5; }"
 
 FinalAndVar:
+  index: 81
   template: "Members can't be declared to be both 'final' and 'var'."
   tip: "Try removing the keyword 'var'."
-  analyzerCode: FINAL_AND_VAR
+  analyzerCode: ParserErrorCode.FINAL_AND_VAR
   script:
     - "class C { final var x = 5; }"
     - "class C { var final x = 5; }"
@@ -892,9 +904,10 @@
     - "switch (0) {case 0: continue L;}"
 
 InitializedVariableInForEach:
+  index: 82
   template: "The loop variable in a for-each loop can't be initialized."
   tip: "Try removing the initializer, or using a different kind of loop."
-  analyzerCode: INITIALIZED_VARIABLE_IN_FOR_EACH
+  analyzerCode: ParserErrorCode.INITIALIZED_VARIABLE_IN_FOR_EACH
   statement:
     - "for (int a = 0 in <int>[10]) {}"
 
@@ -920,10 +933,19 @@
     - "void x; main() {}"
     - "foo(void x) {} main() { foo(null); }"
 
+# TODO(danrubel): Review where this error is generated and consider generating
+# FieldInitializedOutsideDeclaringClass instead of this in some situations.
 InvalidInitializer:
   template: "Not a valid initializer."
   tip: "To initialize a field, use the syntax 'name = value'."
-  analyzerCode: INVALID_INITIALIZER
+
+FieldInitializedOutsideDeclaringClass:
+  index: 88
+  template: "A field can only be initialized in it's declaring class"
+  tip: "Try passing a value into the superclass constructor, or moving the initialization into the constructor body."
+  analyzerCode: ParserErrorCode.FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS
+  script:
+    - "class A { int a; } class C extends A { C() : super.a = 42; }"
 
 FinalFieldNotInitialized:
   template: "Final field '#name' is not initialized."
@@ -981,8 +1003,10 @@
       }
 
 StackOverflow:
-  template: "Stack overflow."
-  analyzerCode: STACK_OVERFLOW
+  index: 91
+  template: "The file has too many nested expressions or statements."
+  tip: "Try simplifying the code."
+  analyzerCode: ParserErrorCode.STACK_OVERFLOW
 
 InvalidCodePoint:
   template: "The escape sequence starting with '\\u' isn't a valid code point."
@@ -1162,15 +1186,17 @@
   analyzerCode: YIELD_IN_NON_GENERATOR
 
 OnlyTry:
-  template: "Try block should be followed by 'on', 'catch', or 'finally' block."
-  tip: "Did you forget to add a 'finally' block?"
-  analyzerCode: MISSING_CATCH_OR_FINALLY
+  index: 92
+  template: "A try block must be followed by an 'on', 'catch', or 'finally' clause."
+  tip: "Try adding either a catch or finally clause, or remove the try statement."
+  analyzerCode: ParserErrorCode.MISSING_CATCH_OR_FINALLY
   statement: "try {}"
 
 TypeAfterVar:
-  template: "Can't have both a type and 'var'."
+  index: 89
+  template: "Variables can't be declared using both 'var' and a type name."
   tip: "Try removing 'var.'"
-  analyzerCode: VAR_AND_TYPE
+  analyzerCode: ParserErrorCode.VAR_AND_TYPE
 
 AssertExtraneousArgument:
   template: "`assert` can't have more than two arguments."
@@ -1210,25 +1236,28 @@
   analyzerCode: WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER
 
 CatchSyntax:
+  index: 84
   template: "'catch' must be followed by '(identifier)' or '(identifier, identifier)'."
   tip: "No types are needed, the first is given by 'on', the second is always 'StackTrace'."
-  analyzerCode: CATCH_SYNTAX
+  analyzerCode: ParserErrorCode.CATCH_SYNTAX
   statement:
     - "try {} catch {}"
     - "try {} catch () {}"
     - "try {} catch (e,) {}"
 
 CatchSyntaxExtraParameters:
+  index: 83
   template: "'catch' must be followed by '(identifier)' or '(identifier, identifier)'."
   tip: "No types are needed, the first is given by 'on', the second is always 'StackTrace'."
-  analyzerCode: CATCH_SYNTAX
+  analyzerCode: ParserErrorCode.CATCH_SYNTAX_EXTRA_PARAMETERS
   statement:
     - "try {} catch (e, s, x) {}"
 
 SuperNullAware:
-  template: "'super' can't be null."
+  index: 90
+  template: "The operator '?.' cannot be used with 'super' because 'super' cannot be null."
   tip: "Try replacing '?.' with '.'"
-  analyzerCode: INVALID_OPERATOR_FOR_SUPER
+  analyzerCode: ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER
 
 ConstFieldWithoutInitializer:
   template: "The const variable '#name' must be initialized."
@@ -1379,14 +1408,13 @@
 MissingImplementationNotAbstract:
   template: |
     The non-abstract class '#name' is missing implementations for these members:
-      #string.
+    #names
   tip: |
     Try to either
      - provide an implementation,
      - inherit an implementation from a superclass or mixin,
      - mark the class as abstract, or
      - provide a 'noSuchMethod' implementation.
-  severity: ERROR_LEGACY_WARNING
   analyzerCode: CONCRETE_CLASS_WITH_ABSTRACT_MEMBER
   script:
     - "class C {foo();}"
@@ -1412,11 +1440,23 @@
   severity: ERROR_LEGACY_WARNING
   analyzerCode: EXPECTED_ONE_LIST_TYPE_ARGUMENTS
 
+SetLiteralTooManyTypeArguments:
+  template: "A set literal requires exactly one type argument."
+  severity: ERROR_LEGACY_WARNING
+
 MapLiteralTypeArgumentMismatch:
-  template: "Map literal requires exactly two type arguments."
+  template: "A map literal requires exactly two type arguments."
   severity: ERROR_LEGACY_WARNING
   analyzerCode: EXPECTED_TWO_MAP_TYPE_ARGUMENTS
 
+SetOrMapLiteralTooManyTypeArguments:
+  template: "A set or map literal requires exactly one or two type arguments, respectively."
+  severity: ERROR_LEGACY_WARNING
+
+SetLiteralsNotSupported:
+  template: "Set literals are not supported yet."
+  script: "var s = { 24 };"
+
 LoadLibraryTakesNoArguments:
   template: "'loadLibrary' takes no arguments."
   severity: ERROR_LEGACY_WARNING
@@ -1508,6 +1548,9 @@
       --dump-ir
         Print compiled libraries in Kernel source notation.
 
+      --omit-platform
+        Exclude the platform from the serialized dill file.
+
       --bytecode
         Generate bytecode. Supported only for SDK platform compilation.
 
@@ -1543,6 +1586,11 @@
         internal stack trace from the compiler. Multiple kinds can be separated by
         commas, for example, --fatal=errors,warnings.
 
+      --enable-experiment=<flag>
+        Enable or disable an experimental flag, used to guard features currently
+        in development. Prefix an experiment name with 'no-' to disable it.
+        Multiple experiments can be separated by commas.
+
 FastaCLIArgumentRequired:
   template: "Expected value after '#name'."
 
@@ -1644,7 +1692,11 @@
   severity: INTERNAL_PROBLEM
 
 InternalProblemStoringMultipleInferredTypes:
-  template: "There's already an inferred type (#type) for '#name'."
+  template: "There's already an inferred type, '#type', for '#name'."
+  severity: INTERNAL_PROBLEM
+
+InternalProblemLabelUsageInVariablesDeclaration:
+  template: "Unexpected usage of label inside declaration of variables."
   severity: INTERNAL_PROBLEM
 
 LocalDefinitionHidesExport:
@@ -1750,7 +1802,7 @@
     main.dart: "import 'lib1.dart'; import 'lib2.dart'; A a;"
 
 CyclicClassHierarchy:
-  template: "'#name' is a supertype of itself via '#string'."
+  template: "'#name' is a supertype of itself."
   analyzerCode: RECURSIVE_INTERFACE_INHERITANCE
   script:
     - |
@@ -1759,11 +1811,6 @@
     - |
       class A implements B {}
       class B implements A {}
-
-DirectCyclicClassHierarchy:
-  template: "'#name' can't use itself as a supertype."
-  analyzerCode: RECURSIVE_INTERFACE_INHERITANCE
-  script:
     - "class C = Object with C;"
     - "class C extends C {}"
     - "class C implements C {}"
@@ -1900,7 +1947,6 @@
 
 InheritedMembersConflict:
   template: "Can't inherit members that conflict with each other."
-  severity: ERROR_LEGACY_WARNING
   analyzerCode: CONFLICTS_WITH_INHERITED_MEMBER
   script:
     - >-
@@ -1970,13 +2016,13 @@
   analyzerCode: INVALID_OVERRIDE_REQUIRED
 
 OverrideTypeMismatchParameter:
-  template: "The parameter '#name' of the method '#name2' has type #type, which does not match the corresponding type in the overridden method (#type2)."
-  tip: "Change to a supertype of #type2 (or, for a covariant parameter, a subtype)."
+  template: "The parameter '#name' of the method '#name2' has type '#type', which does not match the corresponding type in the overridden method, '#type2'."
+  tip: "Change to a supertype of '#type2', or, for a covariant parameter, a subtype."
   analyzerCode: INVALID_METHOD_OVERRIDE
 
 OverrideTypeMismatchReturnType:
-  template: "The return type of the method '#name' is #type, which does not match the return type of the overridden method (#type2)."
-  tip: "Change to a subtype of #type2."
+  template: "The return type of the method '#name' is '#type', which does not match the return type of the overridden method, '#type2'."
+  tip: "Change to a subtype of '#type2'."
   analyzerCode: INVALID_METHOD_OVERRIDE
 
 PartOfSelf:
@@ -2499,6 +2545,9 @@
 
 FinalInstanceVariableAlreadyInitialized:
   template: "'#name' is a final instance variable that has already been initialized."
+  # TODO(ahe): Strictly speaking, as of
+  # 3b5874a332b24f326775b3520f32b9a818731aca, this is a compile-time error in
+  # legacy mode.
   severity: ERROR_LEGACY_WARNING
   analyzerCode: FINAL_INITIALIZED_MULTIPLE_TIMES
 
@@ -2620,10 +2669,6 @@
   template: "Field isn't final, but constructor is 'const'."
   severity: CONTEXT
 
-ConstConstructorInSubclassOfMixinApplication:
-  template: "Can't extend a mixin application and be 'const'."
-  analyzerCode: CONST_CONSTRUCTOR_IN_SUBCLASS_OF_MIXIN_APPLICATION
-
 ConstConstructorRedirectionToNonConst:
   template: "A constant constructor can't call a non-constant constructor."
   script:
@@ -2728,9 +2773,10 @@
   analyzerCode: ParserErrorCode.COLON_IN_PLACE_OF_IN
 
 ExternalFactoryRedirection:
+  index: 85
   template: "A redirecting factory can't be external."
   tip: "Try removing the 'external' modifier."
-  analyzerCode: EXTERNAL_CONSTRUCTOR_WITH_BODY
+  analyzerCode: ParserErrorCode.EXTERNAL_FACTORY_REDIRECTION
 
 ArgumentTypeNotAssignable:
   template: "The argument type '#type' can't be assigned to the parameter type '#type2'."
@@ -2913,8 +2959,8 @@
   analyzerCode: FOR_IN_OF_INVALID_TYPE
 
 InitializingFormalTypeMismatch:
-  template: "The type of parameter '#name' (#type) is not a subtype of the corresponding field's type (#type2)."
-  tip: "Try changing the type of parameter '#name' to a subtype of #type2."
+  template: "The type of parameter '#name', '#type' is not a subtype of the corresponding field's type, '#type2'."
+  tip: "Try changing the type of parameter '#name' to a subtype of '#type2'."
   severity: ERROR_LEGACY_WARNING
   analyzerCode: INVALID_PARAMETER_DECLARATION
   script: >
@@ -2932,13 +2978,47 @@
   severity: IGNORED
 
 InitializeFromDillNotSelfContained:
-  template: "Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new."
+  template: |
+    Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug.
+
+    The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
+    If you are comfortable with it, it would improve the chances of fixing any bug if you included the file #uri in your error report, but be aware that this file includes your source code.
+    Either way, you should probably delete the file so it doesn't use unnecessary disk space.
+
+  severity: WARNING
+  frontendInternal: true
+  external: test/incremental_load_from_invalid_dill_test.dart
+
+InitializeFromDillNotSelfContainedNoDump:
+  template: |
+    Tried to initialize from a previous compilation (#string), but the file was not self-contained. This might be a bug.
+
+    The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
+
   severity: WARNING
   frontendInternal: true
   external: test/incremental_load_from_invalid_dill_test.dart
 
 InitializeFromDillUnknownProblem:
-  template: "Tried to initialize from a previous compilation (#string), but couldn't. Error message was '#string2'. This might be a bug. The Dart team would greatly appreciate if you would take a moment to report this problem at http://dartbug.com/new."
+  template: |
+    Tried to initialize from a previous compilation (#string), but couldn't.
+    Error message was '#string2'. This might be a bug.
+
+    The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
+    If you are comfortable with it, it would improve the chances of fixing any bug if you included the file #uri in your error report, but be aware that this file includes your source code.
+    Either way, you should probably delete the file so it doesn't use unnecessary disk space.
+
+  severity: WARNING
+  frontendInternal: true
+  external: test/incremental_load_from_invalid_dill_test.dart
+
+InitializeFromDillUnknownProblemNoDump:
+  template: |
+    Tried to initialize from a previous compilation (#string), but couldn't.
+    Error message was '#string2'. This might be a bug.
+
+    The Dart team would greatly appreciate it if you would take a moment to report this problem at http://dartbug.com/new.
+
   severity: WARNING
   frontendInternal: true
   external: test/incremental_load_from_invalid_dill_test.dart
@@ -3125,10 +3205,9 @@
   template: "Problem in packages configuration file: #string"
   external: test/packages_format_error_test.dart
 
-FactoryRedirecteeInvalidReturnType:
-  template: "The return type '#type' of the constructor '#name' isn't a subtype of '#type2'."
-  tip: "Try redirecting to a different constructor."
-  analyzerCode: REDIRECT_TO_INVALID_RETURN_TYPE
+IncompatibleRedirecteeFunctionType:
+  template: "The constructor function type '#type' isn't a subtype of '#type2'."
+  analyzerCode: REDIRECT_TO_INVALID_TYPE
   script:
     - >-
       class A {
@@ -3137,61 +3216,31 @@
       class B {
         B();
       }
-
-FactoryRedirecteeHasTooFewPositionalParameters:
-  template: "Redirection target '#name' accepts fewer arguments ('#count') than the redirecting factory can provide."
-  tip: "Try redirecting to a different constructor."
-  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
-  script:
     - >-
       class A {
         factory A.one(int x) = A.zero;
         A.zero() {}
       }
-
-RedirectingFactoryInvalidPositionalParameterType:
-  template: "The type of parameter '#name' (#type) is not a subtype of the redirection target's corresponding parameter type (#type2)."
-  tip: "Try changing either the type of the parameter or the redirection target."
-  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
-  script:
     - >-
       class A {
         factory A.i(int x) = A.s;
         A.s(String x) { }
       }
-
-RedirectingFactoryMissingNamedParameter:
-  template: "The constructor '#name' does not have a named parameter '#name2'."
-  tip: "Try adding '#name2' as a named parameter to '#name'."
-  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
-  script:
     - >-
       class A {
         factory A.f({int x}) = A.g;
         A.g({int y}) { }
       }
-
-RedirectingFactoryInvalidNamedParameterType:
-  template: "The type of the named parameter '#name' (#type) is not a subtype of the redirection target's corresponding named parameter type (#type2)."
-  tip: "Try changing either the type of the parameter or the redirection target."
-  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
-  script:
-    - >-
-      class A {
-        factory A.f({int x}) = A.g;
-        A.g({String x}) { }
-      }
-
-RedirectingFactoryProvidesTooFewRequiredParameters:
-  template: "Redirecting factory '#name' can provide less arguments ('#count') than required by the redirection target '#name2' ('#count2')."
-  tip: "Try redirecting to a different constructor."
-  analyzerCode: REDIRECT_TO_INVALID_FUNCTION_TYPE
-  script:
     - >-
       class A {
         factory A.f(int x) = A.g;
         A.g(int x, int y) {}
       }
+    - >-
+      class A<T extends int> {
+         factory A() = B<T, int>;
+      }
+      class B<T extends int, S extends String> implements A<T> {}
 
 RedirectingFactoryIncompatibleTypeArgument:
   template: "The type '#type' doesn't extend '#type2'."
@@ -3209,15 +3258,23 @@
   frontendInternal: true
 
 IncorrectTypeArgument:
-  template: "Type argument '#type' violates the corresponding type variable bound of '#name'."
+  template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
   tip: "Try changing type arguments so that they conform to the bounds."
   analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   script: >
     class C<T extends num> {}
     main() { new C<String>(); }
 
+IncorrectTypeArgumentQualified:
+  template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
+  tip: "Try changing type arguments so that they conform to the bounds."
+  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+  script: >
+    class C<T> { foo<U extends num>() {} }
+    main() { new C<String>().foo<String>(); }
+
 IncorrectTypeArgumentInSupertype:
-  template: "Type argument '#type' violates the corresponding type variable bound of '#name' in the supertype '#name2' of class '#name3'."
+  template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
   tip: "Try changing type arguments so that they conform to the bounds."
   analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   script: >
@@ -3225,7 +3282,7 @@
     class B extends A<String> {}
 
 IncorrectTypeArgumentInReturnType:
-  template: "Type argument '#type' violates the corresponding type variable bound of '#name' in the return type."
+  template: "Type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the return type."
   tip: "Try changing type arguments so that they conform to the bounds."
   analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   script: >
@@ -3233,15 +3290,23 @@
     A<String> foo() => null;
 
 IncorrectTypeArgumentInferred:
-  template: "Inferred type argument '#type' violates the corresponding type variable bound of '#name'."
+  template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2'."
   tip: "Try specifying type arguments explicitly so that they conform to the bounds."
   analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   script: >
     void foo<T extends num>(T t) {}
     main() { foo("bar"); }
 
+IncorrectTypeArgumentQualifiedInferred:
+  template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#type3.#name2'."
+  tip: "Try specifying type arguments explicitly so that they conform to the bounds."
+  analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
+  script: >
+    class C<T> { foo<U extends num>(U u) {} }
+    main() { new C<String>().foo(""); }
+
 IncorrectTypeArgumentInSupertypeInferred:
-  template: "Inferred type argument '#type' violates the corresponding type variable bound of '#name' in the supertype '#name2' of class '#name3'."
+  template: "Inferred type argument '#type' doesn't conform to the bound '#type2' of the type variable '#name' on '#name2' in the supertype '#name3' of class '#name4'."
   tip: "Try specifying type arguments explicitly so that they conform to the bounds."
   analyzerCode: TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
   script: >
@@ -3249,7 +3314,7 @@
     class B extends A {}
 
 IncorrectTypeArgumentVariable:
-  template: "Bound of this variable is violated."
+  template: "This is the type variable whose bound isn't conformed to."
   severity: CONTEXT
 
 InferredPackageUri:
@@ -3271,8 +3336,8 @@
     class C = Object with M;
 
 GenericFunctionTypeUsedAsActualTypeArgument:
-  template: Unexpected generic function type found in a type argument.
-  tip: Try using a non-generic function type.
+  template: "Unexpected generic function type found in a type argument."
+  tip: "Try using a non-generic function type."
   analyzerCode: GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT
   script:
     - >-
@@ -3287,10 +3352,37 @@
       }
 
 GenericFunctionTypeInferredAsActualTypeArgument:
-  template: Unexpected generic function type '#type' inferred as a type argument.
-  tip: Try providing a non-generic function type explicitly.
+  template: "Unexpected generic function type '#type' inferred as a type argument."
+  tip: "Try providing a non-generic function type explicitly."
   analyzerCode: GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT
   script:
     foo<X>(X x) => null;
     bar<Y>(Y y) => null;
     main() { foo(bar); }
+
+# These two message templates are used for constructing supplemental text
+# about the origins of raw interface types in error messages containing types.
+TypeOrigin:
+  template: "'#name' is from '#uri'."
+  frontendInternal: true
+  external: test/type_labeler_test.dart
+
+TypeOriginWithFileUri:
+  template: "'#name' is from '#uri' ('#uri2')."
+  frontendInternal: true
+  external: test/type_labeler_test.dart
+
+ObjectExtends:
+  template: "The class 'Object' can't have a superclass."
+  frontendInternal: true
+  external: test/fasta/object_supertype_test.dart
+
+ObjectImplements:
+  template: "The class 'Object' can't implement anything."
+  frontendInternal: true
+  external: test/fasta/object_supertype_test.dart
+
+ObjectMixesIn:
+  template: "The class 'Object' can't use mixins."
+  frontendInternal: true
+  external: test/fasta/object_supertype_test.dart
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 478a4d8..86cecb5 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -1,24 +1,24 @@
 name: front_end
 # Currently, front_end API is not stable and users should not
 # depend on semver semantics when depending on this package.
-version: 0.1.6
+version: 0.1.8
 author: Dart Team <misc@dartlang.org>
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
 environment:
-  sdk: '>=2.0.0-dev.48.0 <3.0.0'
+  sdk: '>=2.1.0-dev.5.0 <3.0.0'
 dependencies:
   charcode: '^1.1.1'
   convert: '^2.0.1'
   crypto: '^2.0.2'
-  kernel: 0.3.6
+  kernel: 0.3.8
   meta: '^1.1.1'
   package_config: '^1.0.1'
   path: '^1.3.9'
   source_span: '^1.2.3'
   yaml: '^2.1.12'
 dev_dependencies:
-  analyzer: '^0.33.0'
+  analyzer: 0.34.1
   args: '>=0.13.0 <2.0.0'
   build_integration:
     path: ../build_integration
diff --git a/pkg/front_end/test/fasta/compile_test.dart b/pkg/front_end/test/fasta/compile_test.dart
deleted file mode 100644
index e56e918..0000000
--- a/pkg/front_end/test/fasta/compile_test.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE.md file.
-
-library fasta.test.compile_test;
-
-import 'dart:async' show Future;
-
-import 'testing/suite.dart';
-
-Future<FastaContext> createContext(
-    Chain suite, Map<String, String> environment) {
-  environment[ENABLE_FULL_COMPILE] = "";
-  return FastaContext.create(suite, environment);
-}
-
-main([List<String> arguments = const []]) =>
-    runMe(arguments, createContext, "../../testing.json");
diff --git a/pkg/front_end/test/fasta/incremental_test.dart b/pkg/front_end/test/fasta/incremental_test.dart
index 3a6bc70..5324602 100644
--- a/pkg/front_end/test/fasta/incremental_test.dart
+++ b/pkg/front_end/test/fasta/incremental_test.dart
@@ -15,6 +15,8 @@
 import "package:testing/testing.dart"
     show Chain, ChainContext, Result, Step, TestDescription, runMe;
 
+import "package:testing/src/log.dart" show splitLines;
+
 import "package:yaml/yaml.dart" show YamlMap, loadYamlNode;
 
 import "package:front_end/src/api_prototype/compiler_options.dart"
@@ -158,8 +160,10 @@
           return fail(test, "Compile-time error expected, but none reported");
         }
       } else if (errors.isNotEmpty) {
-        return fail(
-            test, "Unexpected compile-time errors:\n  ${errors.join('\n  ')}");
+        String indentedErrors =
+            splitLines(errors.map((e) => e.ansiFormatted.join("\n")).join("\n"))
+                .join("  ");
+        return fail(test, "Unexpected compile-time errors:\n  $indentedErrors");
       } else if (component.libraries.length < 1) {
         return fail(test, "The compiler detected no changes");
       }
diff --git a/pkg/front_end/test/fasta/legacy_test.dart b/pkg/front_end/test/fasta/legacy_test.dart
new file mode 100644
index 0000000..ff28e5b
--- /dev/null
+++ b/pkg/front_end/test/fasta/legacy_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library fasta.test.legacy_test;
+
+import 'dart:async' show Future;
+
+import 'testing/suite.dart';
+
+Future<FastaContext> createContext(
+    Chain suite, Map<String, String> environment) {
+  environment[ENABLE_FULL_COMPILE] = "";
+  environment[LEGACY_MODE] = "";
+  return FastaContext.create(suite, environment);
+}
+
+main([List<String> arguments = const []]) =>
+    runMe(arguments, createContext, "../../testing.json");
diff --git a/pkg/front_end/test/fasta/object_supertype_test.dart b/pkg/front_end/test/fasta/object_supertype_test.dart
new file mode 100644
index 0000000..fd00300
--- /dev/null
+++ b/pkg/front_end/test/fasta/object_supertype_test.dart
@@ -0,0 +1,101 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:convert" show json;
+
+import "package:async_helper/async_helper.dart" show asyncTest;
+
+import "package:expect/expect.dart" show Expect;
+
+import "package:front_end/src/api_prototype/compiler_options.dart"
+    show CompilerOptions;
+
+import "package:front_end/src/api_prototype/diagnostic_message.dart"
+    show DiagnosticMessage, getMessageCodeObject;
+
+import "package:front_end/src/api_prototype/memory_file_system.dart"
+    show MemoryFileSystem;
+
+import "package:front_end/src/base/processed_options.dart"
+    show ProcessedOptions;
+
+import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext;
+
+import "package:front_end/src/fasta/messages.dart"
+    show Code, codeObjectExtends, codeObjectImplements, codeObjectMixesIn;
+
+import "package:front_end/src/fasta/source/source_loader.dart"
+    show defaultDartCoreSource;
+
+import "package:front_end/src/fasta/ticker.dart" show Ticker;
+
+import "../../tool/_fasta/entry_points.dart" show CompileTask;
+
+Future<List<DiagnosticMessage>> outline(String objectHeader) async {
+  final Ticker ticker = new Ticker(isVerbose: false);
+  final Uri base = Uri.parse("org-dartlang-test:///");
+
+  final MemoryFileSystem fs = new MemoryFileSystem(base);
+
+  final Uri librariesSpecificationUri = base.resolve("sdk/libraries.json");
+
+  fs.entityForUri(librariesSpecificationUri).writeAsStringSync(json.encode({
+        "none": {
+          "libraries": {
+            "core": {
+              "uri": "lib/core/core.dart",
+            },
+          },
+        },
+      }));
+
+  fs.entityForUri(base.resolve("sdk/lib/core/core.dart")).writeAsStringSync(
+      defaultDartCoreSource.replaceAll("class Object {", "$objectHeader"));
+
+  final List<DiagnosticMessage> messages = <DiagnosticMessage>[];
+
+  CompilerContext context = new CompilerContext(new ProcessedOptions(
+      options: new CompilerOptions()
+        ..onDiagnostic = messages.add
+        ..sdkRoot = base.resolve("sdk/")
+        ..fileSystem = fs
+        ..compileSdk = true
+        ..librariesSpecificationUri = librariesSpecificationUri,
+      inputs: [Uri.parse("dart:core")]));
+
+  await context.runInContext<void>((_) async {
+    CompileTask task = new CompileTask(context, ticker);
+    await task.buildOutline();
+  });
+  return messages;
+}
+
+test() async {
+  Set<String> normalErrors = (await outline("class Object {"))
+      .map((DiagnosticMessage message) => getMessageCodeObject(message).name)
+      .toSet();
+
+  check(String objectHeader, List<Code> expectedCodes) async {
+    List<DiagnosticMessage> messages = (await outline(objectHeader))
+        .where((DiagnosticMessage message) =>
+            !normalErrors.contains(getMessageCodeObject(message).name))
+        .toList();
+    Expect.setEquals(
+        expectedCodes,
+        messages.map((DiagnosticMessage m) => getMessageCodeObject(m)),
+        objectHeader);
+  }
+
+  await check("class Object extends String {", <Code>[codeObjectExtends]);
+
+  await check(
+      "class Object implements String, bool {", <Code>[codeObjectImplements]);
+
+  await check("class Object = Object with bool ; class Blah {",
+      <Code>[codeObjectExtends, codeObjectMixesIn]);
+}
+
+main() {
+  asyncTest(test);
+}
diff --git a/pkg/front_end/test/fasta/outline_test.dart b/pkg/front_end/test/fasta/outline_test.dart
index 43e9cc9..3551732 100644
--- a/pkg/front_end/test/fasta/outline_test.dart
+++ b/pkg/front_end/test/fasta/outline_test.dart
@@ -10,6 +10,7 @@
 
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
+  environment[LEGACY_MODE] = "";
   return FastaContext.create(suite, environment);
 }
 
diff --git a/pkg/front_end/test/fasta/parser/parser_suite.dart b/pkg/front_end/test/fasta/parser/parser_suite.dart
index f922086..ad15a8f 100644
--- a/pkg/front_end/test/fasta/parser/parser_suite.dart
+++ b/pkg/front_end/test/fasta/parser/parser_suite.dart
@@ -4,8 +4,6 @@
 
 import 'package:testing/testing.dart';
 
-import 'package:front_end/src/fasta/scanner.dart';
-
 import 'package:front_end/src/fasta/testing/scanner_chain.dart';
 
 import 'package:front_end/src/fasta/parser.dart';
@@ -23,14 +21,14 @@
   ];
 }
 
-class Parse extends Step<ScannerResult, Null, ChainContext> {
+class Parse extends Step<ScannedFile, Null, ChainContext> {
   const Parse();
 
   String get name => "parse";
 
-  Future<Result<Null>> run(ScannerResult result, ChainContext context) async {
+  Future<Result<Null>> run(ScannedFile file, ChainContext context) async {
     try {
-      List<ParserError> errors = parse(result.tokens);
+      List<ParserError> errors = parse(file.result.tokens);
       if (errors.isNotEmpty) {
         return fail(null, errors.join("\n"));
       }
diff --git a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
index f47b461..a4f4aa5 100644
--- a/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
+++ b/pkg/front_end/test/fasta/parser/token_stream_rewriter_test.dart
@@ -12,6 +12,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(TokenStreamGhostWriterTest);
     defineReflectiveTests(TokenStreamRewriterTest_NoPrevious);
     defineReflectiveTests(TokenStreamRewriterTest_UsingPrevious);
   });
@@ -22,6 +23,71 @@
   /// Indicates whether the tests should set up [Token.previous].
   bool get setPrevious;
 
+  void test_insertParens() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var eof = _link([a, b]);
+    var rewriter = new TokenStreamRewriter();
+    var openParen = rewriter.insertParens(a, false);
+    var closeParen = openParen.next;
+
+    expect(openParen.lexeme, '(');
+    expect(closeParen.lexeme, ')');
+
+    expect(a.next, same(openParen));
+    expect(openParen.next, same(closeParen));
+    expect(closeParen.next, same(b));
+    expect(b.next, same(eof));
+
+    expect(b.previous, same(closeParen));
+    expect(closeParen.previous, same(openParen));
+    expect(openParen.previous, same(a));
+  }
+
+  void test_insertParensWithIdentifier() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var eof = _link([a, b]);
+    var rewriter = new TokenStreamRewriter();
+    var openParen = rewriter.insertParens(a, true);
+    var identifier = openParen.next;
+    var closeParen = identifier.next;
+
+    expect(openParen.lexeme, '(');
+    expect(identifier.lexeme, '');
+    expect(identifier.isSynthetic, isTrue);
+    expect(closeParen.lexeme, ')');
+
+    expect(a.next, same(openParen));
+    expect(openParen.next, same(identifier));
+    expect(identifier.next, same(closeParen));
+    expect(closeParen.next, same(b));
+    expect(b.next, same(eof));
+
+    expect(b.previous, same(closeParen));
+    expect(closeParen.previous, same(identifier));
+    expect(identifier.previous, same(openParen));
+    expect(openParen.previous, same(a));
+  }
+
+  void test_insertSyntheticIdentifier() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var eof = _link([a, b]);
+    var rewriter = new TokenStreamRewriter();
+    var identifier = rewriter.insertSyntheticIdentifier(a);
+
+    expect(identifier.lexeme, '');
+    expect(identifier.isSynthetic, isTrue);
+
+    expect(a.next, same(identifier));
+    expect(identifier.next, same(b));
+    expect(b.next, same(eof));
+
+    expect(b.previous, same(identifier));
+    expect(identifier.previous, same(a));
+  }
+
   void test_insertToken_end() {
     var a = _makeToken(0, 'a');
     var b = _makeToken(1, 'b');
@@ -142,9 +208,6 @@
 /// finding previous tokens.
 @reflectiveTest
 class TokenStreamRewriterTest_NoPrevious extends TokenStreamRewriterTest {
-  // These tests are failing because the re-writer currently depends on the
-  // previous pointer.
-
   @override
   bool get setPrevious => false;
 }
@@ -160,3 +223,201 @@
   @override
   bool get setPrevious => true;
 }
+
+@reflectiveTest
+class TokenStreamGhostWriterTest extends TokenStreamRewriterTest {
+  @override
+  bool get setPrevious => false;
+
+  void test_insertParens() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var eof = _link([a, b]);
+    var rewriter = new TokenStreamGhostWriter();
+    var openParen = rewriter.insertParens(a, false);
+    var closeParen = openParen.next;
+
+    expect(openParen.lexeme, '(');
+    expect(closeParen.lexeme, ')');
+
+    expect(a.next, same(b));
+    expect(openParen.next, same(closeParen));
+    expect(closeParen.next, same(b));
+    expect(b.next, same(eof));
+
+    expect(b.previous, isNull);
+    expect(closeParen.previous, isNull);
+    expect(openParen.previous, isNull);
+  }
+
+  void test_insertParensWithIdentifier() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var eof = _link([a, b]);
+    var rewriter = new TokenStreamGhostWriter();
+    var openParen = rewriter.insertParens(a, true);
+    var identifier = openParen.next;
+    var closeParen = identifier.next;
+
+    expect(openParen.lexeme, '(');
+    expect(identifier.lexeme, '');
+    expect(identifier.isSynthetic, isTrue);
+    expect(closeParen.lexeme, ')');
+
+    expect(a.next, same(b));
+    expect(openParen.next, same(identifier));
+    expect(identifier.next, same(closeParen));
+    expect(closeParen.next, same(b));
+    expect(b.next, same(eof));
+
+    expect(b.previous, isNull);
+    expect(closeParen.previous, isNull);
+    expect(identifier.previous, isNull);
+    expect(openParen.previous, isNull);
+  }
+
+  void test_insertSyntheticIdentifier() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var eof = _link([a, b]);
+    var rewriter = new TokenStreamGhostWriter();
+    var identifier = rewriter.insertSyntheticIdentifier(a);
+
+    expect(identifier.lexeme, '');
+    expect(identifier.isSynthetic, isTrue);
+
+    expect(a.next, same(b));
+    expect(identifier.next, same(b));
+    expect(b.next, same(eof));
+
+    expect(b.previous, isNull);
+    expect(identifier.previous, isNull);
+  }
+
+  void test_insertToken_end() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var eof = _link([a]);
+    var rewriter = new TokenStreamGhostWriter();
+
+    expect(rewriter.insertToken(a, b), same(b));
+    expect(a.next, same(eof));
+    expect(b.next, same(eof));
+
+    expect(eof.previous, isNull);
+    expect(b.previous, isNull);
+  }
+
+  void test_insertToken_middle() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var c = _makeToken(2, 'c');
+    _link([a, c]);
+
+    var rewriter = new TokenStreamGhostWriter();
+    rewriter.insertToken(a, b);
+    expect(a.next, same(c));
+    expect(b.next, same(c));
+
+    expect(a.previous, isNull);
+    expect(b.previous, isNull);
+    expect(c.previous, isNull);
+  }
+
+  void test_insertToken_second_insertion_earlier_in_stream() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var c = _makeToken(2, 'c');
+    var d = _makeToken(3, 'd');
+    var e = _makeToken(4, 'e');
+    _link([a, c, e]);
+    var rewriter = new TokenStreamGhostWriter();
+
+    rewriter.insertToken(c, d);
+    expect(c.next, same(e));
+    expect(d.next, same(e));
+
+    // The next call to rewriter should be able to find the insertion point
+    // even though it is before the insertion point used above.
+    rewriter.insertToken(a, b);
+    expect(a.next, same(c));
+    expect(b.next, same(c));
+
+    expect(a.previous, isNull);
+    expect(b.previous, isNull);
+    expect(c.previous, isNull);
+    expect(d.previous, isNull);
+    expect(e.previous, isNull);
+  }
+
+  void test_moveSynthetic() {
+    ScannerResult scanResult = scanString('Foo(bar; baz=0;');
+    expect(scanResult.hasErrors, isTrue);
+    Token open = scanResult.tokens.next.next;
+    expect(open.lexeme, '(');
+    Token semicolon = open.next.next;
+    expect(semicolon.lexeme, ';');
+    Token close = open.endGroup;
+    expect(close.isSynthetic, isTrue);
+    expect(close.next.isEof, isTrue);
+    Token semicolon2 = close.previous;
+    expect(semicolon2.lexeme, ';');
+    var rewriter = new TokenStreamGhostWriter();
+
+    Token newClose = rewriter.moveSynthetic(open.next, close);
+    expect(newClose, isNot(same(close)));
+    expect(newClose.next, same(semicolon));
+    expect(open.endGroup, close);
+    expect(open.next.next, semicolon);
+    expect(close.next.isEof, isTrue);
+
+    expect(newClose.previous, isNull);
+    expect(close.next.previous, close);
+    expect(close.previous, semicolon2);
+  }
+
+  void test_replaceTokenFollowing_multiple() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var c = _makeToken(2, 'c');
+    var d = _makeToken(3, 'd');
+    var e = _makeToken(4, 'e');
+    var f = _makeToken(5, 'f');
+    _link([a, b, e, f]);
+    _link([c, d]);
+    var rewriter = new TokenStreamGhostWriter();
+    Token result = rewriter.replaceTokenFollowing(b, c);
+
+    expect(result, same(c));
+    expect(a.next, same(b));
+    expect(b.next, same(e));
+    expect(e.next, same(f));
+    expect(c.next, same(d));
+    expect(d.next, same(f));
+
+    expect(a.previous, isNull);
+    expect(b.previous, isNull);
+    expect(c.previous, isNull);
+    expect(d.previous, isNull);
+    expect(e.previous, isNull);
+  }
+
+  void test_replaceTokenFollowing_single() {
+    var a = _makeToken(0, 'a');
+    var b = _makeToken(1, 'b');
+    var c = _makeToken(2, 'c');
+    var d = _makeToken(3, 'd');
+    _link([a, b, d]);
+    var rewriter = new TokenStreamGhostWriter();
+    Token result = rewriter.replaceTokenFollowing(a, c);
+
+    expect(result, same(c));
+    expect(a.next, same(b));
+    expect(b.next, same(d));
+    expect(c.next, same(d));
+
+    expect(a.previous, isNull);
+    expect(b.previous, isNull);
+    expect(c.previous, isNull);
+  }
+}
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index d50b840..2f13cfe 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -2,11 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:convert';
+
 import 'package:front_end/src/fasta/messages.dart';
 import 'package:front_end/src/fasta/parser.dart';
 import 'package:front_end/src/fasta/parser/type_info.dart';
 import 'package:front_end/src/fasta/parser/type_info_impl.dart';
-import 'package:front_end/src/fasta/scanner.dart';
+import 'package:front_end/src/fasta/scanner.dart' hide scanString;
+import 'package:front_end/src/fasta/scanner/recover.dart'
+    show defaultRecoveryStrategy;
 import 'package:front_end/src/scanner/token.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -15,7 +19,9 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NoTypeInfoTest);
     defineReflectiveTests(PrefixedTypeInfoTest);
-    defineReflectiveTests(SimpleTypeInfoTest);
+    defineReflectiveTests(SimpleNullableTypeTest);
+    defineReflectiveTests(SimpleNullableTypeWith1ArgumentTest);
+    defineReflectiveTests(SimpleTypeTest);
     defineReflectiveTests(SimpleTypeWith1ArgumentTest);
     defineReflectiveTests(TypeInfoTest);
     defineReflectiveTests(VoidTypeInfoTest);
@@ -23,9 +29,39 @@
     defineReflectiveTests(NoTypeParamOrArgTest);
     defineReflectiveTests(SimpleTypeParamOrArgTest);
     defineReflectiveTests(TypeParamOrArgInfoTest);
+    defineReflectiveTests(CouldBeExpressionTest);
   });
 }
 
+/// TODO(danrubel): Remove this and use scanner.dart scanString
+/// once support for `>>>` is permanently enabled.
+///
+/// Scan/tokenize the given [source].
+/// If [recover] is null, then the [defaultRecoveryStrategy] is used.
+ScannerResult scanString(String source,
+    {bool includeComments: false,
+    bool scanLazyAssignmentOperators: false,
+    Recover recover}) {
+  assert(source != null, 'source must not be null');
+  StringScanner scanner =
+      new StringScanner(source, includeComments: includeComments)
+        ..enableGtGtGt = true;
+  return _tokenizeAndRecover(scanner, recover, source: source);
+}
+
+/// TODO(danrubel): Remove this once support for `>>>` is permanently enabled.
+ScannerResult _tokenizeAndRecover(Scanner scanner, Recover recover,
+    {List<int> bytes, String source}) {
+  Token tokens = scanner.tokenize();
+  if (scanner.hasErrors) {
+    if (bytes == null) bytes = utf8.encode(source);
+    recover ??= defaultRecoveryStrategy;
+    tokens = recover(bytes, tokens, scanner.lineStarts);
+  }
+  return new ScannerResult(
+      tokens, scanner.lineStarts, scanner.hasErrors, scanner.errors);
+}
+
 @reflectiveTest
 class NoTypeInfoTest {
   void test_basic() {
@@ -108,7 +144,7 @@
     expect(listener.calls, [
       'handleIdentifier  typeReference',
       'handleNoTypeArguments ;',
-      'handleType ',
+      'handleType  null',
     ]);
     expect(listener.errors, [new ExpectedError(codeExpectedType, 7, 1)]);
   }
@@ -122,7 +158,7 @@
     expect(listener.calls, [
       'handleIdentifier  typeReference',
       'handleNoTypeArguments ;',
-      'handleType ',
+      'handleType  null',
     ]);
     expect(listener.errors, [new ExpectedError(codeExpectedType, 7, 1)]);
   }
@@ -186,7 +222,7 @@
     expect(listener.calls, [
       'handleIdentifier void typeReference',
       'handleNoTypeArguments ;',
-      'handleType void',
+      'handleType void null',
     ]);
     expect(listener.errors, [new ExpectedError(codeInvalidVoid, 7, 4)]);
   }
@@ -217,7 +253,7 @@
     expect(listener.calls, [
       'handleIdentifier void typeReference',
       'handleNoTypeArguments ;',
-      'handleType void',
+      'handleType void null',
     ]);
     expect(listener.errors, [new ExpectedError(codeInvalidVoid, 7, 4)]);
   }
@@ -256,7 +292,7 @@
         'handleIdentifier a typeReferenceContinuation',
         'handleQualified .',
         'handleNoTypeArguments ;',
-        'handleType C',
+        'handleType C null',
       ]);
       expect(listener.errors, isNull);
     }
@@ -276,14 +312,133 @@
 }
 
 @reflectiveTest
-class SimpleTypeInfoTest {
+class SimpleNullableTypeTest {
+  void test_compute() {
+    expectInfo(simpleNullableType, 'C?', required: true);
+    expectInfo(simpleNullableType, 'C?;', required: true);
+    expectInfo(simpleNullableType, 'C?(', required: true);
+    expectInfo(simpleNullableType, 'C?<', required: true);
+    expectInfo(simpleNullableType, 'C?=', required: true);
+    expectInfo(simpleNullableType, 'C?*', required: true);
+    expectInfo(simpleNullableType, 'C? do', required: true);
+
+    expectInfo(simpleNullableType, 'C? foo');
+    expectInfo(simpleNullableType, 'C? get');
+    expectInfo(simpleNullableType, 'C? set');
+    expectInfo(simpleNullableType, 'C? operator');
+    expectInfo(simpleNullableType, 'C? this');
+    expectInfo(simpleNullableType, 'C? Function');
+
+    expectInfo(simpleNullableType, 'C? Function()', required: false);
+    expectInfo(simpleNullableType, 'C? Function<T>()', required: false);
+    expectInfo(simpleNullableType, 'C? Function(int)', required: false);
+    expectInfo(simpleNullableType, 'C? Function<T>(int)', required: false);
+    expectInfo(simpleNullableType, 'C? Function(int x)', required: false);
+    expectInfo(simpleNullableType, 'C? Function<T>(int x)', required: false);
+  }
+
+  void test_simpleNullableType() {
+    final Token start = scanString('before C? ;').tokens;
+    final Token expectedEnd = start.next.next;
+
+    expect(simpleNullableType.skipType(start), expectedEnd);
+    expect(simpleNullableType.couldBeExpression, isTrue);
+
+    TypeInfoListener listener;
+    assertResult(Token actualEnd) {
+      expect(actualEnd, expectedEnd);
+      expect(listener.calls, [
+        'handleIdentifier C typeReference',
+        'handleNoTypeArguments ?',
+        'handleType C ?',
+      ]);
+      expect(listener.errors, isNull);
+    }
+
+    listener = new TypeInfoListener();
+    assertResult(
+        simpleNullableType.ensureTypeNotVoid(start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(
+        simpleNullableType.ensureTypeOrVoid(start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(
+        simpleNullableType.parseTypeNotVoid(start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(simpleNullableType.parseType(start, new Parser(listener)));
+  }
+}
+
+@reflectiveTest
+class SimpleNullableTypeWith1ArgumentTest {
+  void test_compute() {
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>?', required: true);
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>?;', required: true);
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>?(', required: true);
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>? do', required: true);
+
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>? foo');
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>? get');
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>? set');
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>? operator');
+    expectInfo(simpleNullableTypeWith1Argument, 'C<T>? Function');
+  }
+
+  void test_gt_questionMark() {
+    final Token start = scanString('before C<T>? ;').tokens;
+    final Token expectedEnd = start.next.next.next.next.next;
+    expect(expectedEnd.lexeme, '?');
+
+    expect(simpleNullableTypeWith1Argument.skipType(start), expectedEnd);
+    expect(simpleNullableTypeWith1Argument.couldBeExpression, isFalse);
+
+    TypeInfoListener listener;
+    assertResult(Token actualEnd) {
+      expect(actualEnd, expectedEnd);
+      expect(listener.calls, [
+        'handleIdentifier C typeReference',
+        'beginTypeArguments <',
+        'handleIdentifier T typeReference',
+        'handleNoTypeArguments >',
+        'handleType T null',
+        'endTypeArguments 1 < >',
+        'handleType C ?',
+      ]);
+      expect(listener.errors, isNull);
+    }
+
+    listener = new TypeInfoListener();
+    assertResult(simpleNullableTypeWith1Argument.ensureTypeNotVoid(
+        start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(simpleNullableTypeWith1Argument.ensureTypeOrVoid(
+        start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(simpleNullableTypeWith1Argument.parseTypeNotVoid(
+        start, new Parser(listener)));
+
+    listener = new TypeInfoListener();
+    assertResult(
+        simpleNullableTypeWith1Argument.parseType(start, new Parser(listener)));
+  }
+}
+
+@reflectiveTest
+class SimpleTypeTest {
   void test_compute() {
     expectInfo(simpleType, 'C', required: true);
     expectInfo(simpleType, 'C;', required: true);
     expectInfo(simpleType, 'C(', required: true);
     expectInfo(simpleType, 'C<', required: true);
     expectComplexInfo('C.',
-        required: true, expectedErrors: [error(codeExpectedType, 2, 0)]);
+        required: true,
+        couldBeExpression: true,
+        expectedErrors: [error(codeExpectedType, 2, 0)]);
     expectInfo(simpleType, 'C=', required: true);
     expectInfo(simpleType, 'C*', required: true);
     expectInfo(simpleType, 'C do', required: true);
@@ -303,7 +458,7 @@
     expectInfo(simpleType, 'C Function<T>(int x)', required: false);
   }
 
-  void test_simpleTypeInfo() {
+  void test_simpleType() {
     final Token start = scanString('before C ;').tokens;
     final Token expectedEnd = start.next;
 
@@ -316,7 +471,7 @@
       expect(listener.calls, [
         'handleIdentifier C typeReference',
         'handleNoTypeArguments ;',
-        'handleType C',
+        'handleType C null',
       ]);
       expect(listener.errors, isNull);
     }
@@ -392,9 +547,9 @@
         'beginTypeArguments <',
         'handleIdentifier T typeReference',
         'handleNoTypeArguments >',
-        'handleType T',
+        'handleType T null',
         'endTypeArguments 1 < >',
-        'handleType C',
+        'handleType C null',
       ]);
       expect(listener.errors, isNull);
     }
@@ -438,9 +593,9 @@
         'beginTypeArguments <',
         'handleIdentifier T typeReference',
         'handleNoTypeArguments >',
-        'handleType T',
+        'handleType T null',
         'endTypeArguments 1 < >',
-        'handleType C',
+        'handleType C null',
       ]);
       expect(listener.errors, isNull);
     }
@@ -483,9 +638,9 @@
         'beginTypeArguments <',
         'handleIdentifier T typeReference',
         'handleNoTypeArguments >',
-        'handleType T',
+        'handleType T null',
         'endTypeArguments 1 < >',
-        'handleType C',
+        'handleType C null',
       ]);
       expect(listener.errors, isNull);
     }
@@ -512,14 +667,19 @@
 class TypeInfoTest {
   void test_computeType_basic() {
     expectInfo(noType, '.', required: false);
-    expectComplexInfo('.', required: true, expectedErrors: [
-      error(codeExpectedType, 0, 1),
-      error(codeExpectedType, 1, 0)
-    ]);
+    expectComplexInfo('.',
+        required: true,
+        couldBeExpression: true,
+        expectedErrors: [
+          error(codeExpectedType, 0, 1),
+          error(codeExpectedType, 1, 0)
+        ]);
 
     expectInfo(noType, '.Foo', required: false);
     expectComplexInfo('.Foo',
-        required: true, expectedErrors: [error(codeExpectedType, 0, 1)]);
+        required: true,
+        couldBeExpression: true,
+        expectedErrors: [error(codeExpectedType, 0, 1)]);
   }
 
   void test_computeType_builtin() {
@@ -527,16 +687,20 @@
     // an error for the builtin used as a type.
     expectComplexInfo('abstract',
         required: true,
+        couldBeExpression: true,
         expectedErrors: [error(codeBuiltInIdentifierAsType, 0, 8)]);
     expectComplexInfo('export',
         required: true,
+        couldBeExpression: true,
         expectedErrors: [error(codeBuiltInIdentifierAsType, 0, 6)]);
     expectComplexInfo('abstract Function()',
         required: false,
+        couldBeExpression: true,
         expectedAfter: 'Function',
         expectedErrors: [error(codeBuiltInIdentifierAsType, 0, 8)]);
     expectComplexInfo('export Function()',
         required: false,
+        couldBeExpression: true,
         expectedAfter: 'Function',
         expectedErrors: [error(codeBuiltInIdentifierAsType, 0, 6)]);
   }
@@ -548,7 +712,7 @@
       'handleNoType ',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
+      'endFunctionType Function null',
     ]);
     expectComplexInfo('Function<T>() m', expectedAfter: 'm', expectedCalls: [
       'beginTypeVariables <',
@@ -564,7 +728,7 @@
       'handleNoType ',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
+      'endFunctionType Function null',
     ]);
     expectComplexInfo('Function(int) m', expectedAfter: 'm', expectedCalls: [
       'handleNoTypeVariables (',
@@ -576,13 +740,13 @@
       'beginFormalParameter int MemberKind.GeneralizedFunctionType',
       'handleIdentifier int typeReference',
       'handleNoTypeArguments )',
-      'handleType int',
+      'handleType int null',
       'handleNoName )',
       'handleFormalParameterWithoutValue )',
       'endFormalParameter null null ) FormalParameterKind.mandatory '
           'MemberKind.GeneralizedFunctionType',
       'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
+      'endFunctionType Function null',
     ]);
     expectComplexInfo('Function<T>(int) m', expectedAfter: 'm', expectedCalls: [
       'beginTypeVariables <',
@@ -602,13 +766,13 @@
       'beginFormalParameter int MemberKind.GeneralizedFunctionType',
       'handleIdentifier int typeReference',
       'handleNoTypeArguments )',
-      'handleType int',
+      'handleType int null',
       'handleNoName )',
       'handleFormalParameterWithoutValue )',
       'endFormalParameter null null ) FormalParameterKind.mandatory'
           ' MemberKind.GeneralizedFunctionType',
       'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
+      'endFunctionType Function null',
     ]);
 
     expectComplexInfo('Function(int x)', required: true);
@@ -641,10 +805,173 @@
           'beginFunctionType C',
           'handleIdentifier C typeReference',
           'handleNoTypeArguments Function',
-          'handleType C',
+          'handleType C null',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-          'endFunctionType Function',
+          'endFunctionType Function null',
+        ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark() {
+    expectComplexInfo('C? Function()', required: true, expectedCalls: [
+      'handleNoTypeVariables (',
+      'beginFunctionType C',
+      'handleIdentifier C typeReference',
+      'handleNoTypeArguments ?',
+      'handleType C ?',
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function null',
+    ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark2() {
+    expectComplexInfo('C Function()?', required: true, expectedCalls: [
+      'handleNoTypeVariables (',
+      'beginFunctionType C',
+      'handleIdentifier C typeReference',
+      'handleNoTypeArguments Function',
+      'handleType C null',
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function ?',
+    ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark3() {
+    expectComplexInfo('C<T>? Function()', required: true, expectedCalls: [
+      'handleNoTypeVariables (',
+      'beginFunctionType C',
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T null',
+      'endTypeArguments 1 < >',
+      'handleType C ?',
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function null',
+    ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark4() {
+    expectComplexInfo('C<S,T>? Function()', required: true, expectedCalls: [
+      'handleNoTypeVariables (',
+      'beginFunctionType C',
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ,',
+      'handleType S null',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T null',
+      'endTypeArguments 2 < >',
+      'handleType C ?',
+      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+      'endFunctionType Function null',
+    ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark5() {
+    expectComplexInfo('C Function()? Function()',
+        required: true,
+        expectedCalls: [
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleIdentifier C typeReference',
+          'handleNoTypeArguments Function',
+          'handleType C null',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function ?',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+        ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark6() {
+    expectComplexInfo('C Function() Function()?',
+        required: true,
+        expectedCalls: [
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleIdentifier C typeReference',
+          'handleNoTypeArguments Function',
+          'handleType C null',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function ?',
+        ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark7() {
+    expectComplexInfo('C? Function() Function()?',
+        required: true,
+        expectedCalls: [
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleIdentifier C typeReference',
+          'handleNoTypeArguments ?',
+          'handleType C ?',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function ?',
+        ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark8() {
+    expectComplexInfo('C Function()? Function()?',
+        required: true,
+        expectedCalls: [
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleIdentifier C typeReference',
+          'handleNoTypeArguments Function',
+          'handleType C null',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function ?',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function ?',
+        ]);
+  }
+
+  void test_computeType_identifierComplex_questionMark9() {
+    expectComplexInfo('C? Function()? Function()?',
+        required: true,
+        expectedCalls: [
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleIdentifier C typeReference',
+          'handleNoTypeArguments ?',
+          'handleType C ?',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function ?',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function ?',
         ]);
   }
 
@@ -654,7 +981,17 @@
       'beginTypeArguments <',
       'handleVoidKeyword void',
       'endTypeArguments 1 < >',
-      'handleType C',
+      'handleType C null',
+    ]);
+  }
+
+  void test_computeType_identifierTypeArg_questionMark() {
+    expectComplexInfo('C<void>?', required: true, expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleVoidKeyword void',
+      'endTypeArguments 1 < >',
+      'handleType C ?',
     ]);
   }
 
@@ -664,12 +1001,12 @@
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
       'handleNoTypeArguments ,',
-      'handleType S',
+      'handleType S null',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 2 < >',
-      'handleType C',
+      'handleType C null',
     ]);
     expectComplexInfo('C<S<T>>', required: true, expectedCalls: [
       'handleIdentifier C typeReference',
@@ -678,23 +1015,23 @@
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 1 < >',
-      'handleType S',
+      'handleType S null',
       'endTypeArguments 1 < >',
-      'handleType C',
+      'handleType C null',
     ]);
     expectComplexInfo('C<S,T> f', expectedAfter: 'f', expectedCalls: [
       'handleIdentifier C typeReference',
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
       'handleNoTypeArguments ,',
-      'handleType S',
+      'handleType S null',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 2 < >',
-      'handleType C',
+      'handleType C null',
     ]);
     expectComplexInfo('C<S<T>> f', expectedAfter: 'f', expectedCalls: [
       'handleIdentifier C typeReference',
@@ -703,11 +1040,162 @@
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 1 < >',
-      'handleType S',
+      'handleType S null',
       'endTypeArguments 1 < >',
-      'handleType C',
+      'handleType C null',
+    ]);
+  }
+
+  void test_computeType_identifierTypeArgComplex_questionMark() {
+    expectComplexInfo('C<S,T>?', required: true, expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ,',
+      'handleType S null',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T null',
+      'endTypeArguments 2 < >',
+      'handleType C ?',
+    ]);
+    expectComplexInfo('C<S,T?>', required: true, expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ,',
+      'handleType S null',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments ?',
+      'handleType T ?',
+      'endTypeArguments 2 < >',
+      'handleType C null',
+    ]);
+    expectComplexInfo('C<S,T?>>',
+        expectedAfter: '>',
+        required: true,
+        expectedCalls: [
+          'handleIdentifier C typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments ,',
+          'handleType S null',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments ?',
+          'handleType T ?',
+          'endTypeArguments 2 < >',
+          'handleType C null',
+        ]);
+    expectComplexInfo('C<S,T?>=',
+        expectedAfter: '=',
+        required: true,
+        expectedCalls: [
+          'handleIdentifier C typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments ,',
+          'handleType S null',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments ?',
+          'handleType T ?',
+          'endTypeArguments 2 < >',
+          'handleType C null',
+        ]);
+    expectComplexInfo('C<S,T?>>>',
+        expectedAfter: '>>',
+        required: true,
+        expectedCalls: [
+          'handleIdentifier C typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments ,',
+          'handleType S null',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments ?',
+          'handleType T ?',
+          'endTypeArguments 2 < >',
+          'handleType C null',
+        ]);
+    expectComplexInfo('C<S?,T>', required: true, expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ?',
+      'handleType S ?',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T null',
+      'endTypeArguments 2 < >',
+      'handleType C null',
+    ]);
+    expectComplexInfo('C<S<T>>?', required: true, expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T null',
+      'endTypeArguments 1 < >',
+      'handleType S null',
+      'endTypeArguments 1 < >',
+      'handleType C ?',
+    ]);
+    expectComplexInfo('C<S<T?>>', required: true, expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments ?',
+      'handleType T ?',
+      'endTypeArguments 1 < >',
+      'handleType S null',
+      'endTypeArguments 1 < >',
+      'handleType C null',
+    ]);
+    expectComplexInfo('C<S<T?>>>',
+        expectedAfter: '>',
+        required: true,
+        expectedCalls: [
+          'handleIdentifier C typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments ?',
+          'handleType T ?',
+          'endTypeArguments 1 < >',
+          'handleType S null',
+          'endTypeArguments 1 < >',
+          'handleType C null',
+        ]);
+    expectComplexInfo('C<S,T>? f', expectedAfter: 'f', expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'handleNoTypeArguments ,',
+      'handleType S null',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T null',
+      'endTypeArguments 2 < >',
+      'handleType C ?',
+    ]);
+    expectComplexInfo('C<S<T>>? f', expectedAfter: 'f', expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier S typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier T typeReference',
+      'handleNoTypeArguments >',
+      'handleType T null',
+      'endTypeArguments 1 < >',
+      'handleType S null',
+      'endTypeArguments 1 < >',
+      'handleType C ?',
     ]);
   }
 
@@ -721,12 +1209,12 @@
           'beginTypeArguments <',
           'handleIdentifier T typeReference',
           'handleNoTypeArguments >',
-          'handleType T',
+          'handleType T null',
           'endTypeArguments 1 < >',
-          'handleType C',
+          'handleType C null',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-          'endFunctionType Function',
+          'endFunctionType Function null',
         ]);
     expectComplexInfo('C<T> Function<T>(int x) Function<T>(int x)',
         required: false, expectedAfter: 'Function');
@@ -747,12 +1235,12 @@
           'beginTypeArguments <',
           'handleIdentifier int typeReference',
           'handleNoTypeArguments double' /* was , */,
-          'handleType int' /* was , */,
+          'handleType int null' /* was , */,
           'handleIdentifier double typeReference',
           'handleNoTypeArguments >',
-          'handleType double',
+          'handleType double null',
           'endTypeArguments 2 < >',
-          'handleType G',
+          'handleType G null',
         ],
         expectedErrors: [
           error(codeExpectedButGot, 6, 6)
@@ -764,9 +1252,9 @@
       'beginTypeArguments <',
       'handleIdentifier  typeReference',
       'handleNoTypeArguments >',
-      'handleType ',
+      'handleType  null',
       'endTypeArguments 1 < >',
-      'handleType C',
+      'handleType C null',
     ], expectedErrors: [
       error(codeExpectedType, 2, 1)
     ]);
@@ -778,14 +1266,16 @@
           'beginTypeArguments <',
           'handleIdentifier  typeReference',
           'handleNoTypeArguments >',
-          'handleType ',
+          'handleType  null',
           'endTypeArguments 1 < >',
-          'handleType C',
+          'handleType C null',
         ],
         expectedErrors: [
           error(codeExpectedType, 2, 1)
         ]);
+  }
 
+  void test_computeType_statements() {
     // Statements that should not have a type
     expectInfo(noType, 'C<T ; T>U;', required: false);
     expectInfo(noType, 'C<T && T>U;', required: false);
@@ -832,10 +1322,10 @@
           'handleIdentifier a typeReferenceContinuation',
           'handleQualified .',
           'handleNoTypeArguments Function',
-          'handleType C',
+          'handleType C null',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-          'endFunctionType Function',
+          'endFunctionType Function null',
         ]);
     expectComplexInfo('C.a Function<T>(int x) Function<T>(int x)',
         required: false, expectedAfter: 'Function');
@@ -843,6 +1333,40 @@
         required: true);
   }
 
+  void test_computeType_prefixedGFT_questionMark() {
+    expectComplexInfo('C.a? Function(', // Scanner inserts synthetic ')'.
+        required: true,
+        expectedCalls: [
+          'handleNoTypeVariables (',
+          'beginFunctionType C',
+          'handleIdentifier C prefixedTypeReference',
+          'handleIdentifier a typeReferenceContinuation',
+          'handleQualified .',
+          'handleNoTypeArguments ?',
+          'handleType C ?',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+        ]);
+    expectComplexInfo('C.a? Function<T>(int x) Function<T>(int x)',
+        required: false, expectedAfter: 'Function');
+    expectComplexInfo('C.a? Function<T>(int x) Function<T>(int x)',
+        required: true);
+  }
+
+  void test_computeType_prefixedQuestionMark() {
+    expectComplexInfo('C.a? Function',
+        couldBeExpression: true,
+        expectedAfter: 'Function',
+        expectedCalls: [
+          'handleIdentifier C prefixedTypeReference',
+          'handleIdentifier a typeReferenceContinuation',
+          'handleQualified .',
+          'handleNoTypeArguments ?',
+          'handleType C ?',
+        ]);
+  }
+
   void test_computeType_prefixedTypeArg() {
     expectComplexInfo('C.a<T>', required: true, expectedCalls: [
       'handleIdentifier C prefixedTypeReference',
@@ -851,9 +1375,9 @@
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 1 < >',
-      'handleType C',
+      'handleType C null',
     ]);
 
     expectComplexInfo('C.a<T> f', expectedAfter: 'f', expectedCalls: [
@@ -863,9 +1387,9 @@
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 1 < >',
-      'handleType C',
+      'handleType C null',
     ]);
   }
 
@@ -899,35 +1423,35 @@
           'beginTypeArguments <',
           'handleIdentifier T typeReference',
           'handleNoTypeArguments >',
-          'handleType T',
+          'handleType T null',
           'endTypeArguments 1 < >',
-          'handleType C',
+          'handleType C null',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'beginMetadataStar int',
           'endMetadataStar 0',
           'beginFormalParameter int MemberKind.GeneralizedFunctionType',
           'handleIdentifier int typeReference',
           'handleNoTypeArguments x',
-          'handleType int',
+          'handleType int null',
           'handleIdentifier x formalParameterDeclaration',
           'handleFormalParameterWithoutValue )',
           'endFormalParameter null null x FormalParameterKind.mandatory '
               'MemberKind.GeneralizedFunctionType',
           'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
-          'endFunctionType Function',
+          'endFunctionType Function null',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'beginMetadataStar int',
           'endMetadataStar 0',
           'beginFormalParameter int MemberKind.GeneralizedFunctionType',
           'handleIdentifier int typeReference',
           'handleNoTypeArguments x',
-          'handleType int',
+          'handleType int null',
           'handleIdentifier x formalParameterDeclaration',
           'handleFormalParameterWithoutValue )',
           'endFormalParameter null null x FormalParameterKind.mandatory '
               'MemberKind.GeneralizedFunctionType',
           'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
-          'endFunctionType Function',
+          'endFunctionType Function null',
         ]);
   }
 
@@ -940,7 +1464,7 @@
           'handleVoidKeyword void',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-          'endFunctionType Function',
+          'endFunctionType Function null',
         ]);
   }
 
@@ -951,7 +1475,7 @@
       'handleVoidKeyword void',
       'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
       'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
+      'endFunctionType Function null',
     ]);
 
     expectComplexInfo('void Function<T>()', required: true);
@@ -971,6 +1495,7 @@
 class NoTypeParamOrArgTest {
   void test_basic() {
     expect(noTypeParamOrArg.isSimpleTypeArgument, isFalse);
+    expect(noTypeParamOrArg.typeArgumentCount, 0);
 
     final Token start = scanString('before after').tokens;
     expect(noTypeParamOrArg.skip(start), start);
@@ -1013,6 +1538,7 @@
 class SimpleTypeParamOrArgTest {
   void test_basic_gt() {
     expect(simpleTypeArgument1.isSimpleTypeArgument, isTrue);
+    expect(simpleTypeArgument1.typeArgumentCount, 1);
     expect(simpleTypeArgument1.typeInfo, simpleTypeWith1Argument);
 
     final Token start = scanString('before <T> after').tokens;
@@ -1026,6 +1552,7 @@
 
   void test_basic_gt_eq() {
     expect(simpleTypeArgument1GtEq.isSimpleTypeArgument, isTrue);
+    expect(simpleTypeArgument1GtEq.typeArgumentCount, 1);
     expect(simpleTypeArgument1GtEq.typeInfo, simpleTypeWith1ArgumentGtEq);
 
     final Token start = scanString('before <T>= after').tokens;
@@ -1041,6 +1568,7 @@
 
   void test_basic_gt_gt() {
     expect(simpleTypeArgument1GtGt.isSimpleTypeArgument, isTrue);
+    expect(simpleTypeArgument1GtGt.typeArgumentCount, 1);
     expect(simpleTypeArgument1GtGt.typeInfo, simpleTypeWith1ArgumentGtGt);
 
     final Token start = scanString('before <S<T>> after').tokens.next.next;
@@ -1095,7 +1623,7 @@
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 1 < >'
     ]);
     expect(listener.errors, isNull);
@@ -1159,95 +1687,144 @@
 @reflectiveTest
 class TypeParamOrArgInfoTest {
   void test_computeTypeArg_complex() {
-    expectComplexTypeArg('<S,T>', expectedCalls: [
+    expectComplexTypeArg('<S,T>', typeArgumentCount: 2, expectedCalls: [
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
       'handleNoTypeArguments ,',
-      'handleType S',
+      'handleType S null',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 2 < >'
     ]);
-    expectComplexTypeArg('<S,T>=', expectedAfter: '=', expectedCalls: [
-      'beginTypeArguments <',
-      'handleIdentifier S typeReference',
-      'handleNoTypeArguments ,',
-      'handleType S',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments >=',
-      'handleType T',
-      'endTypeArguments 2 < >'
-    ]);
-    expectComplexTypeArg('<S,T>>=', expectedAfter: '>=', expectedCalls: [
-      'beginTypeArguments <',
-      'handleIdentifier S typeReference',
-      'handleNoTypeArguments ,',
-      'handleType S',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments >>=',
-      'handleType T',
-      'endTypeArguments 2 < >'
-    ]);
-    expectComplexTypeArg('<S Function()>', expectedCalls: [
-      'beginTypeArguments <',
-      'handleNoTypeVariables (',
-      'beginFunctionType S',
-      'handleIdentifier S typeReference',
-      'handleNoTypeArguments Function',
-      'handleType S',
-      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
-      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
-      'endTypeArguments 1 < >'
-    ]);
-    expectComplexTypeArg('<void Function()>', expectedCalls: [
-      'beginTypeArguments <',
-      'handleNoTypeVariables (',
-      'beginFunctionType void',
-      'handleVoidKeyword void',
-      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
-      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
-      'endTypeArguments 1 < >'
-    ]);
-    expectComplexTypeArg('<S<T>>', expectedCalls: [
+    expectComplexTypeArg('<S,T>=',
+        typeArgumentCount: 2,
+        expectedAfter: '=',
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments ,',
+          'handleType S null',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >=',
+          'handleType T null',
+          'endTypeArguments 2 < >'
+        ]);
+    expectComplexTypeArg('<S,T>>=',
+        typeArgumentCount: 2,
+        expectedAfter: '>=',
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments ,',
+          'handleType S null',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >>=',
+          'handleType T null',
+          'endTypeArguments 2 < >'
+        ]);
+    expectComplexTypeArg('<S Function()>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleNoTypeVariables (',
+          'beginFunctionType S',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments Function',
+          'handleType S null',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'endTypeArguments 1 < >'
+        ]);
+    expectComplexTypeArg('<void Function()>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleNoTypeVariables (',
+          'beginFunctionType void',
+          'handleVoidKeyword void',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'endTypeArguments 1 < >'
+        ]);
+    expectComplexTypeArg('<S<T>>', typeArgumentCount: 1, expectedCalls: [
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 1 < >',
-      'handleType S',
+      'handleType S null',
       'endTypeArguments 1 < >'
     ]);
-    expectComplexTypeArg('<S<T>>=', expectedAfter: '=', expectedCalls: [
+    expectComplexTypeArg('<S<T>>=',
+        typeArgumentCount: 1,
+        expectedAfter: '=',
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >>=',
+          'handleType T null',
+          'endTypeArguments 1 < >',
+          'handleType S null',
+          'endTypeArguments 1 < >'
+        ]);
+    expectComplexTypeArg('<S<T<U>>>', typeArgumentCount: 1, expectedCalls: [
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
       'beginTypeArguments <',
       'handleIdentifier T typeReference',
-      'handleNoTypeArguments >>=',
-      'handleType T',
+      'beginTypeArguments <',
+      'handleIdentifier U typeReference',
+      'handleNoTypeArguments >>>',
+      'handleType U null',
       'endTypeArguments 1 < >',
-      'handleType S',
+      'handleType T null',
+      'endTypeArguments 1 < >',
+      'handleType S null',
       'endTypeArguments 1 < >'
     ]);
-    expectComplexTypeArg('<S<Function()>>', expectedCalls: [
+    expectComplexTypeArg('<S<T<U,V>>>', typeArgumentCount: 1, expectedCalls: [
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
       'beginTypeArguments <',
-      'handleNoTypeVariables (',
-      'beginFunctionType Function',
-      'handleNoType <',
-      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
-      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
+      'handleIdentifier T typeReference',
+      'beginTypeArguments <',
+      'handleIdentifier U typeReference',
+      'handleNoTypeArguments ,',
+      'handleType U null',
+      'handleIdentifier V typeReference',
+      'handleNoTypeArguments >>>',
+      'handleType V null',
+      'endTypeArguments 2 < >',
+      'handleType T null',
       'endTypeArguments 1 < >',
-      'handleType S',
+      'handleType S null',
       'endTypeArguments 1 < >'
     ]);
+    expectComplexTypeArg('<S<Function()>>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'beginTypeArguments <',
+          'handleNoTypeVariables (',
+          'beginFunctionType Function',
+          'handleNoType <',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'endTypeArguments 1 < >',
+          'handleType S null',
+          'endTypeArguments 1 < >'
+        ]);
     expectComplexTypeArg('<S<Function()>>=',
+        typeArgumentCount: 1,
         expectedAfter: '=',
         expectedCalls: [
           'beginTypeArguments <',
@@ -1258,109 +1835,150 @@
           'handleNoType <',
           'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
           'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-          'endFunctionType Function',
+          'endFunctionType Function null',
           'endTypeArguments 1 < >',
-          'handleType S',
+          'handleType S null',
           'endTypeArguments 1 < >'
         ]);
-    expectComplexTypeArg('<S<void Function()>>', expectedCalls: [
-      'beginTypeArguments <',
-      'handleIdentifier S typeReference',
-      'beginTypeArguments <',
-      'handleNoTypeVariables (',
-      'beginFunctionType void', // was 'beginFunctionType Function'
-      'handleVoidKeyword void', // was 'handleNoType <'
-      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
-      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
-      'endTypeArguments 1 < >',
-      'handleType S',
-      'endTypeArguments 1 < >'
-    ]);
+    expectComplexTypeArg('<S<void Function()>>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'beginTypeArguments <',
+          'handleNoTypeVariables (',
+          'beginFunctionType void', // was 'beginFunctionType Function'
+          'handleVoidKeyword void', // was 'handleNoType <'
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'endTypeArguments 1 < >',
+          'handleType S null',
+          'endTypeArguments 1 < >'
+        ]);
+    expectComplexTypeArg('<S<T<void Function()>>>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier T typeReference',
+          'beginTypeArguments <',
+          'handleNoTypeVariables (',
+          'beginFunctionType void', // was 'beginFunctionType Function'
+          'handleVoidKeyword void', // was 'handleNoType <'
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'endTypeArguments 1 < >',
+          'handleType T null',
+          'endTypeArguments 1 < >',
+          'handleType S null',
+          'endTypeArguments 1 < >'
+        ]);
   }
 
   void test_computeTypeArg_complex_recovery() {
-    expectComplexTypeArg('<S extends T>', expectedErrors: [
-      error(codeExpectedAfterButGot, 1, 1)
-    ], expectedCalls: [
-      'beginTypeArguments <',
-      'handleIdentifier S typeReference',
-      'handleNoTypeArguments extends',
-      'handleType S',
-      'endTypeArguments 1 < >',
-    ]);
-    expectComplexTypeArg('<S extends List<T>>', expectedErrors: [
-      error(codeExpectedAfterButGot, 1, 1)
-    ], expectedCalls: [
-      'beginTypeArguments <',
-      'handleIdentifier S typeReference',
-      'handleNoTypeArguments extends',
-      'handleType S',
-      'endTypeArguments 1 < >',
-    ]);
-    expectComplexTypeArg('<@A S,T>', expectedErrors: [
+    expectComplexTypeArg('<S extends T>',
+        typeArgumentCount: 1,
+        expectedErrors: [
+          error(codeExpectedAfterButGot, 1, 1)
+        ],
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments extends',
+          'handleType S null',
+          'endTypeArguments 1 < >',
+        ]);
+    expectComplexTypeArg('<S extends List<T>>',
+        typeArgumentCount: 1,
+        expectedErrors: [
+          error(codeExpectedAfterButGot, 1, 1)
+        ],
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments extends',
+          'handleType S null',
+          'endTypeArguments 1 < >',
+        ]);
+    expectComplexTypeArg('<@A S,T>', typeArgumentCount: 2, expectedErrors: [
       error(codeUnexpectedToken, 1, 1)
     ], expectedCalls: [
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
       'handleNoTypeArguments ,',
-      'handleType S',
+      'handleType S null',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 2 < >'
     ]);
-    expectComplexTypeArg('<@A() S,T>', expectedErrors: [
+    expectComplexTypeArg('<@A() S,T>', typeArgumentCount: 2, expectedErrors: [
       error(codeUnexpectedToken, 1, 1)
     ], expectedCalls: [
       'beginTypeArguments <',
       'handleIdentifier S typeReference',
       'handleNoTypeArguments ,',
-      'handleType S',
+      'handleType S null',
       'handleIdentifier T typeReference',
       'handleNoTypeArguments >',
-      'handleType T',
+      'handleType T null',
       'endTypeArguments 2 < >'
     ]);
-    expectComplexTypeArg('<@A() @B S,T>', expectedErrors: [
-      error(codeUnexpectedToken, 1, 1),
-      error(codeUnexpectedToken, 6, 1),
-    ], expectedCalls: [
-      'beginTypeArguments <',
-      'handleIdentifier S typeReference',
-      'handleNoTypeArguments ,',
-      'handleType S',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments >',
-      'handleType T',
-      'endTypeArguments 2 < >'
-    ]);
+    expectComplexTypeArg('<@A() @B S,T>',
+        typeArgumentCount: 2,
+        expectedErrors: [
+          error(codeUnexpectedToken, 1, 1),
+          error(codeUnexpectedToken, 6, 1),
+        ],
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments ,',
+          'handleType S null',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >',
+          'handleType T null',
+          'endTypeArguments 2 < >'
+        ]);
     expectComplexTypeArg('<S T>',
-        inDeclaration: true, expectedErrors: [error(codeExpectedButGot, 3, 1)]);
+        inDeclaration: true,
+        typeArgumentCount: 2,
+        expectedErrors: [error(codeExpectedButGot, 3, 1)]);
     expectComplexTypeArg('<S',
         inDeclaration: true,
+        typeArgumentCount: 1,
         expectedErrors: [error(codeExpectedAfterButGot, 1, 1)]);
-    expectComplexTypeArg('<@Foo S', inDeclaration: true, expectedErrors: [
-      error(codeUnexpectedToken, 1, 1),
-      error(codeExpectedAfterButGot, 6, 1)
-    ]);
-    expectComplexTypeArg('<S<T', inDeclaration: true, expectedErrors: [
-      error(codeExpectedAfterButGot, 3, 1)
-    ], expectedCalls: [
-      'beginTypeArguments <',
-      'handleIdentifier S typeReference',
-      'beginTypeArguments <',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments ',
-      'handleType T',
-      'endTypeArguments 1 < >',
-      'handleType S',
-      'endTypeArguments 1 < >'
-    ]);
+    expectComplexTypeArg('<@Foo S',
+        inDeclaration: true,
+        typeArgumentCount: 1,
+        expectedErrors: [
+          error(codeUnexpectedToken, 1, 1),
+          error(codeExpectedAfterButGot, 6, 1)
+        ]);
+    expectComplexTypeArg('<S<T',
+        inDeclaration: true,
+        typeArgumentCount: 1,
+        expectedErrors: [
+          error(codeExpectedAfterButGot, 3, 1)
+        ],
+        expectedCalls: [
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments ',
+          'handleType T null',
+          'endTypeArguments 1 < >',
+          'handleType S null',
+          'endTypeArguments 1 < >'
+        ]);
   }
 
   void test_computeTypeParam_complex() {
-    expectComplexTypeParam('<S,T>', expectedCalls: [
+    expectComplexTypeParam('<S,T>', typeArgumentCount: 2, expectedCalls: [
       'beginTypeVariables <',
       'beginMetadataStar S',
       'endMetadataStar 0',
@@ -1377,59 +1995,65 @@
       'endTypeVariable , 0 null',
       'endTypeVariables < >',
     ]);
-    expectComplexTypeParam('<S extends T>', expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar S',
-      'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
-      'beginTypeVariable S',
-      'handleTypeVariablesDefined T 1',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments >',
-      'handleType T',
-      'endTypeVariable > 0 extends',
-      'endTypeVariables < >',
-    ]);
-    expectComplexTypeParam('<S extends List<T>>', expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar S',
-      'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
-      'beginTypeVariable S',
-      'handleTypeVariablesDefined > 1',
-      'handleIdentifier List typeReference',
-      'beginTypeArguments <',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments >',
-      'handleType T',
-      'endTypeArguments 1 < >',
-      'handleType List',
-      'endTypeVariable > 0 extends',
-      'endTypeVariables < >',
-    ]);
-    expectComplexTypeParam('<R, S extends void Function()>', expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar R',
-      'endMetadataStar 0',
-      'handleIdentifier R typeVariableDeclaration',
-      'beginTypeVariable R',
-      'beginMetadataStar S',
-      'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
-      'beginTypeVariable S',
-      'handleTypeVariablesDefined ) 2',
-      'handleNoTypeVariables (',
-      'beginFunctionType void',
-      'handleVoidKeyword void',
-      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
-      'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
-      'endTypeVariable > 1 extends',
-      'handleNoType R',
-      'endTypeVariable , 0 null',
-      'endTypeVariables < >',
-    ]);
-    expectComplexTypeParam('<@A S,T>', expectedCalls: [
+    expectComplexTypeParam('<S extends T>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar S',
+          'endMetadataStar 0',
+          'handleIdentifier S typeVariableDeclaration',
+          'beginTypeVariable S',
+          'handleTypeVariablesDefined T 1',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >',
+          'handleType T null',
+          'endTypeVariable > 0 extends',
+          'endTypeVariables < >',
+        ]);
+    expectComplexTypeParam('<S extends List<T>>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar S',
+          'endMetadataStar 0',
+          'handleIdentifier S typeVariableDeclaration',
+          'beginTypeVariable S',
+          'handleTypeVariablesDefined > 1',
+          'handleIdentifier List typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >',
+          'handleType T null',
+          'endTypeArguments 1 < >',
+          'handleType List null',
+          'endTypeVariable > 0 extends',
+          'endTypeVariables < >',
+        ]);
+    expectComplexTypeParam('<R, S extends void Function()>',
+        typeArgumentCount: 2,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar R',
+          'endMetadataStar 0',
+          'handleIdentifier R typeVariableDeclaration',
+          'beginTypeVariable R',
+          'beginMetadataStar S',
+          'endMetadataStar 0',
+          'handleIdentifier S typeVariableDeclaration',
+          'beginTypeVariable S',
+          'handleTypeVariablesDefined ) 2',
+          'handleNoTypeVariables (',
+          'beginFunctionType void',
+          'handleVoidKeyword void',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'endTypeVariable > 1 extends',
+          'handleNoType R',
+          'endTypeVariable , 0 null',
+          'endTypeVariables < >',
+        ]);
+    expectComplexTypeParam('<@A S,T>', typeArgumentCount: 2, expectedCalls: [
       'beginTypeVariables <',
       'beginMetadataStar @',
       'beginMetadata @',
@@ -1451,7 +2075,7 @@
       'endTypeVariable , 0 null',
       'endTypeVariables < >',
     ]);
-    expectComplexTypeParam('<@A() S,T>', expectedCalls: [
+    expectComplexTypeParam('<@A() S,T>', typeArgumentCount: 2, expectedCalls: [
       'beginTypeVariables <',
       'beginMetadataStar @',
       'beginMetadata @',
@@ -1474,82 +2098,93 @@
       'endTypeVariable , 0 null',
       'endTypeVariables < >',
     ]);
-    expectComplexTypeParam('<@A() @B S,T>', expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar @',
-      'beginMetadata @',
-      'handleIdentifier A metadataReference',
-      'handleNoTypeArguments (',
-      'beginArguments (',
-      'endArguments 0 ( )',
-      'endMetadata @ null @',
-      'beginMetadata @',
-      'handleIdentifier B metadataReference',
-      'handleNoTypeArguments S',
-      'handleNoArguments S',
-      'endMetadata @ null S',
-      'endMetadataStar 2',
-      'handleIdentifier S typeVariableDeclaration',
-      'beginTypeVariable S',
-      'beginMetadataStar T',
-      'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
-      'beginTypeVariable T',
-      'handleTypeVariablesDefined T 2',
-      'handleNoType T',
-      'endTypeVariable > 1 null',
-      'handleNoType S',
-      'endTypeVariable , 0 null',
-      'endTypeVariables < >',
-    ]);
+    expectComplexTypeParam('<@A() @B S,T>',
+        typeArgumentCount: 2,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar @',
+          'beginMetadata @',
+          'handleIdentifier A metadataReference',
+          'handleNoTypeArguments (',
+          'beginArguments (',
+          'endArguments 0 ( )',
+          'endMetadata @ null @',
+          'beginMetadata @',
+          'handleIdentifier B metadataReference',
+          'handleNoTypeArguments S',
+          'handleNoArguments S',
+          'endMetadata @ null S',
+          'endMetadataStar 2',
+          'handleIdentifier S typeVariableDeclaration',
+          'beginTypeVariable S',
+          'beginMetadataStar T',
+          'endMetadataStar 0',
+          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
+          'handleTypeVariablesDefined T 2',
+          'handleNoType T',
+          'endTypeVariable > 1 null',
+          'handleNoType S',
+          'endTypeVariable , 0 null',
+          'endTypeVariables < >',
+        ]);
   }
 
   void test_computeTypeParam_complex_extends_void() {
-    expectComplexTypeParam('<T extends void>', expectedErrors: [
-      error(codeInvalidVoid, 11, 4),
-    ], expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar T',
-      'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
-      'beginTypeVariable T',
-      'handleTypeVariablesDefined void 1',
-      'handleIdentifier void typeReference',
-      'handleNoTypeArguments >',
-      'handleType void',
-      'endTypeVariable > 0 extends',
-      'endTypeVariables < >'
-    ]);
+    expectComplexTypeParam('<T extends void>',
+        typeArgumentCount: 1,
+        expectedErrors: [
+          error(codeInvalidVoid, 11, 4),
+        ],
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar T',
+          'endMetadataStar 0',
+          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
+          'handleTypeVariablesDefined void 1',
+          'handleIdentifier void typeReference',
+          'handleNoTypeArguments >',
+          'handleType void null',
+          'endTypeVariable > 0 extends',
+          'endTypeVariables < >'
+        ]);
   }
 
   void test_computeTypeParam_complex_recovery() {
-    expectComplexTypeParam('<S Function()>', expectedErrors: [
-      error(codeExpectedAfterButGot, 1, 1),
-    ], expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar S',
-      'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
-      'beginTypeVariable S',
-      'handleTypeVariablesDefined S 1',
-      'handleNoType S',
-      'endTypeVariable Function 0 null',
-      'endTypeVariables < >',
-    ]);
-    expectComplexTypeParam('<void Function()>', expectedErrors: [
-      error(codeExpectedIdentifier, 1, 4),
-    ], expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar void',
-      'endMetadataStar 0',
-      'handleIdentifier  typeVariableDeclaration',
-      'beginTypeVariable ',
-      'handleTypeVariablesDefined  1',
-      'handleNoType ',
-      'endTypeVariable void 0 null',
-      'endTypeVariables < >',
-    ]);
-    expectComplexTypeParam('<S<T>>', expectedErrors: [
+    expectComplexTypeParam('<S Function()>',
+        typeArgumentCount: 1,
+        expectedErrors: [
+          error(codeExpectedAfterButGot, 1, 1),
+        ],
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar S',
+          'endMetadataStar 0',
+          'handleIdentifier S typeVariableDeclaration',
+          'beginTypeVariable S',
+          'handleTypeVariablesDefined S 1',
+          'handleNoType S',
+          'endTypeVariable Function 0 null',
+          'endTypeVariables < >',
+        ]);
+    expectComplexTypeParam('<void Function()>',
+        typeArgumentCount: 1,
+        expectedErrors: [
+          error(codeExpectedIdentifier, 1, 4),
+        ],
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar void',
+          'endMetadataStar 0',
+          'handleIdentifier  typeVariableDeclaration',
+          'beginTypeVariable ',
+          'handleTypeVariablesDefined  1',
+          'handleNoType ',
+          'endTypeVariable void 0 null',
+          'endTypeVariables < >',
+        ]);
+    expectComplexTypeParam('<S<T>>', typeArgumentCount: 1, expectedErrors: [
       error(codeExpectedAfterButGot, 1, 1),
     ], expectedCalls: [
       'beginTypeVariables <',
@@ -1562,21 +2197,30 @@
       'endTypeVariable < 0 null',
       'endTypeVariables < >',
     ]);
-    expectComplexTypeParam('<S T>', inDeclaration: true, expectedErrors: [
-      error(codeExpectedButGot, 3, 1),
-    ]);
-    expectComplexTypeParam('<S', inDeclaration: true, expectedErrors: [
-      error(codeExpectedAfterButGot, 1, 1),
-    ]);
+    expectComplexTypeParam('<S T>',
+        inDeclaration: true,
+        typeArgumentCount: 2,
+        expectedErrors: [
+          error(codeExpectedButGot, 3, 1),
+        ]);
+    expectComplexTypeParam('<S',
+        inDeclaration: true,
+        typeArgumentCount: 1,
+        expectedErrors: [
+          error(codeExpectedAfterButGot, 1, 1),
+        ]);
     expectComplexTypeParam('<@Foo S',
         inDeclaration: true,
+        typeArgumentCount: 1,
         expectedErrors: [error(codeExpectedAfterButGot, 6, 1)]);
     expectComplexTypeParam('<@Foo }',
         inDeclaration: true,
+        typeArgumentCount: 0,
         expectedAfter: '}',
         expectedErrors: [error(codeExpectedIdentifier, 6, 1)]);
     expectComplexTypeParam('<S extends List<T fieldName;',
         inDeclaration: true,
+        typeArgumentCount: 1,
         expectedErrors: [error(codeExpectedAfterButGot, 16, 1)],
         expectedAfter: 'fieldName',
         expectedCalls: [
@@ -1590,119 +2234,158 @@
           'beginTypeArguments <',
           'handleIdentifier T typeReference',
           'handleNoTypeArguments fieldName',
-          'handleType T',
+          'handleType T null',
           'endTypeArguments 1 < >',
-          'handleType List',
+          'handleType List null',
           'endTypeVariable fieldName 0 extends',
           'endTypeVariables < >',
         ]);
   }
 
   void test_computeTypeParam_31846() {
-    expectComplexTypeParam('<T extends Comparable<T>>', expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar T',
-      'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
-      'beginTypeVariable T',
-      'handleTypeVariablesDefined > 1',
-      'handleIdentifier Comparable typeReference',
-      'beginTypeArguments <',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments >',
-      'handleType T',
-      'endTypeArguments 1 < >',
-      'handleType Comparable',
-      'endTypeVariable > 0 extends',
-      'endTypeVariables < >',
-    ]);
-    expectComplexTypeParam('<T extends Comparable<S>, S>', expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar T',
-      'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
-      'beginTypeVariable T',
-      'beginMetadataStar S',
-      'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
-      'beginTypeVariable S',
-      'handleTypeVariablesDefined S 2',
-      'handleNoType S',
-      'endTypeVariable > 1 null',
-      'handleIdentifier Comparable typeReference',
-      'beginTypeArguments <',
-      'handleIdentifier S typeReference',
-      'handleNoTypeArguments >',
-      'handleType S',
-      'endTypeArguments 1 < >',
-      'handleType Comparable',
-      'endTypeVariable , 0 extends',
-      'endTypeVariables < >'
-    ]);
-    expectComplexTypeParam('<T extends Function(T)>', expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar T',
-      'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
-      'beginTypeVariable T',
-      'handleTypeVariablesDefined ) 1',
-      'handleNoTypeVariables (',
-      'beginFunctionType Function',
-      'handleNoType extends',
-      'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
-      'beginMetadataStar T',
-      'endMetadataStar 0',
-      'beginFormalParameter T MemberKind.GeneralizedFunctionType',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments )',
-      'handleType T',
-      'handleNoName )',
-      'handleFormalParameterWithoutValue )',
-      'endFormalParameter null null ) FormalParameterKind.mandatory MemberKind.GeneralizedFunctionType',
-      'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
-      'endFunctionType Function',
-      'endTypeVariable > 0 extends',
-      'endTypeVariables < >'
-    ]);
-    expectComplexTypeParam('<T extends List<List<T>>>', expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar T',
-      'endMetadataStar 0',
-      'handleIdentifier T typeVariableDeclaration',
-      'beginTypeVariable T',
-      'handleTypeVariablesDefined > 1',
-      'handleIdentifier List typeReference',
-      'beginTypeArguments <',
-      'handleIdentifier List typeReference',
-      'beginTypeArguments <',
-      'handleIdentifier T typeReference',
-      'handleNoTypeArguments >',
-      'handleType T',
-      'endTypeArguments 1 < >',
-      'handleType List',
-      'endTypeArguments 1 < >',
-      'handleType List',
-      'endTypeVariable > 0 extends',
-      'endTypeVariables < >'
-    ]);
+    expectComplexTypeParam('<T extends Comparable<T>>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar T',
+          'endMetadataStar 0',
+          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
+          'handleTypeVariablesDefined > 1',
+          'handleIdentifier Comparable typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >',
+          'handleType T null',
+          'endTypeArguments 1 < >',
+          'handleType Comparable null',
+          'endTypeVariable > 0 extends',
+          'endTypeVariables < >',
+        ]);
+    expectComplexTypeParam('<T extends Comparable<S>, S>',
+        typeArgumentCount: 2,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar T',
+          'endMetadataStar 0',
+          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
+          'beginMetadataStar S',
+          'endMetadataStar 0',
+          'handleIdentifier S typeVariableDeclaration',
+          'beginTypeVariable S',
+          'handleTypeVariablesDefined S 2',
+          'handleNoType S',
+          'endTypeVariable > 1 null',
+          'handleIdentifier Comparable typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments >',
+          'handleType S null',
+          'endTypeArguments 1 < >',
+          'handleType Comparable null',
+          'endTypeVariable , 0 extends',
+          'endTypeVariables < >'
+        ]);
+    expectComplexTypeParam('<T extends Function(T)>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar T',
+          'endMetadataStar 0',
+          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
+          'handleTypeVariablesDefined ) 1',
+          'handleNoTypeVariables (',
+          'beginFunctionType Function',
+          'handleNoType extends',
+          'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+          'beginMetadataStar T',
+          'endMetadataStar 0',
+          'beginFormalParameter T MemberKind.GeneralizedFunctionType',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments )',
+          'handleType T null',
+          'handleNoName )',
+          'handleFormalParameterWithoutValue )',
+          'endFormalParameter null null ) FormalParameterKind.mandatory MemberKind.GeneralizedFunctionType',
+          'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
+          'endFunctionType Function null',
+          'endTypeVariable > 0 extends',
+          'endTypeVariables < >'
+        ]);
+    expectComplexTypeParam('<T extends List<List<T>>>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar T',
+          'endMetadataStar 0',
+          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
+          'handleTypeVariablesDefined > 1',
+          'handleIdentifier List typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier List typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >>>',
+          'handleType T null',
+          'endTypeArguments 1 < >',
+          'handleType List null',
+          'endTypeArguments 1 < >',
+          'handleType List null',
+          'endTypeVariable > 0 extends',
+          'endTypeVariables < >'
+        ]);
+    expectComplexTypeParam('<T extends List<Map<S, T>>>',
+        typeArgumentCount: 1,
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar T',
+          'endMetadataStar 0',
+          'handleIdentifier T typeVariableDeclaration',
+          'beginTypeVariable T',
+          'handleTypeVariablesDefined > 1',
+          'handleIdentifier List typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier Map typeReference',
+          'beginTypeArguments <',
+          'handleIdentifier S typeReference',
+          'handleNoTypeArguments ,',
+          'handleType S null',
+          'handleIdentifier T typeReference',
+          'handleNoTypeArguments >>>',
+          'handleType T null',
+          'endTypeArguments 2 < >',
+          'handleType Map null',
+          'endTypeArguments 1 < >',
+          'handleType List null',
+          'endTypeVariable > 0 extends',
+          'endTypeVariables < >'
+        ]);
   }
 
   void test_computeTypeParam_34850() {
-    expectComplexTypeParam('<S<T>> A', expectedAfter: 'A', expectedErrors: [
-      error(codeExpectedAfterButGot, 1, 1),
-    ], expectedCalls: [
-      'beginTypeVariables <',
-      'beginMetadataStar S',
-      'endMetadataStar 0',
-      'handleIdentifier S typeVariableDeclaration',
-      'beginTypeVariable S',
-      'handleTypeVariablesDefined S 1',
-      'handleNoType S',
-      'endTypeVariable < 0 null',
-      'endTypeVariables < >',
-    ]);
+    expectComplexTypeParam('<S<T>> A',
+        typeArgumentCount: 1,
+        expectedAfter: 'A',
+        expectedErrors: [
+          error(codeExpectedAfterButGot, 1, 1),
+        ],
+        expectedCalls: [
+          'beginTypeVariables <',
+          'beginMetadataStar S',
+          'endMetadataStar 0',
+          'handleIdentifier S typeVariableDeclaration',
+          'beginTypeVariable S',
+          'handleTypeVariablesDefined S 1',
+          'handleNoType S',
+          'endTypeVariable < 0 null',
+          'endTypeVariables < >',
+        ]);
     expectComplexTypeParam('<S();> A',
         inDeclaration: true,
+        typeArgumentCount: 1,
         expectedAfter: 'A',
         expectedErrors: [
           error(codeExpectedAfterButGot, 1, 1),
@@ -1721,6 +2404,46 @@
   }
 }
 
+@reflectiveTest
+class CouldBeExpressionTest {
+  void couldBeExpression(String code, bool expected) {
+    final typeInfo = computeType(scan(code), true);
+    expect(typeInfo.couldBeExpression, expected);
+  }
+
+  void test_simple() {
+    couldBeExpression('S', true);
+  }
+
+  void test_simple_nullable() {
+    couldBeExpression('S?', true);
+  }
+
+  void test_partial() {
+    couldBeExpression('.S', true);
+  }
+
+  void test_partial_nullable() {
+    couldBeExpression('.S?', true);
+  }
+
+  void test_prefixed() {
+    couldBeExpression('p.S', true);
+  }
+
+  void test_prefixed_nullable() {
+    couldBeExpression('p.S?', true);
+  }
+
+  void test_typeArg() {
+    couldBeExpression('S<T>', false);
+  }
+
+  void test_typeArg_nullable() {
+    couldBeExpression('S<T>?', false);
+  }
+}
+
 void expectInfo(expectedInfo, String source, {bool required}) {
   if (required == null) {
     compute(expectedInfo, source, scan(source), true);
@@ -1733,17 +2456,18 @@
 void expectComplexInfo(String source,
     {bool required,
     bool inDeclaration = false,
+    bool couldBeExpression = false,
     String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors}) {
   if (required == null) {
-    computeComplex(source, scan(source), true, inDeclaration, expectedAfter,
-        expectedCalls, expectedErrors);
-    computeComplex(source, scan(source), false, inDeclaration, expectedAfter,
-        expectedCalls, expectedErrors);
+    computeComplex(source, scan(source), true, inDeclaration, couldBeExpression,
+        expectedAfter, expectedCalls, expectedErrors);
+    computeComplex(source, scan(source), false, inDeclaration,
+        couldBeExpression, expectedAfter, expectedCalls, expectedErrors);
   } else {
-    computeComplex(source, scan(source), required, inDeclaration, expectedAfter,
-        expectedCalls, expectedErrors);
+    computeComplex(source, scan(source), required, inDeclaration,
+        couldBeExpression, expectedAfter, expectedCalls, expectedErrors);
   }
 }
 
@@ -1772,6 +2496,7 @@
     Token start,
     bool required,
     bool inDeclaration,
+    bool couldBeExpression,
     String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors) {
@@ -1780,7 +2505,7 @@
       const isInstanceOf<ComplexTypeInfo>(), source, start, required,
       inDeclaration: inDeclaration);
   expect(typeInfo.start, start.next, reason: source);
-  expect(typeInfo.couldBeExpression, isFalse);
+  expect(typeInfo.couldBeExpression, couldBeExpression);
   expectEnd(expectedAfter, typeInfo.skipType(start));
   expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
       reason: 'TypeInfo.skipType should not modify the token stream');
@@ -1798,6 +2523,7 @@
 
 void expectComplexTypeArg(String source,
     {bool inDeclaration = false,
+    int typeArgumentCount = -1,
     String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors}) {
@@ -1815,6 +2541,7 @@
   expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
       reason: 'TypeParamOrArgInfo.skipType'
           ' should not modify the token stream');
+  expect(typeVarInfo.typeArgumentCount, typeArgumentCount);
 
   TypeInfoListener listener = new TypeInfoListener();
   Parser parser = new Parser(listener);
@@ -1830,6 +2557,7 @@
 
 void expectComplexTypeParam(String source,
     {bool inDeclaration = false,
+    int typeArgumentCount = -1,
     String expectedAfter,
     List<String> expectedCalls,
     List<ExpectedError> expectedErrors}) {
@@ -1847,6 +2575,7 @@
   expect(countGtGtAndNullEnd(start), expectedGtGtAndNullEndCount,
       reason: 'TypeParamOrArgInfo.skipType'
           ' should not modify the token stream');
+  expect(typeVarInfo.typeArgumentCount, typeArgumentCount);
 
   TypeInfoListener listener =
       new TypeInfoListener(firstToken: start, metadataAllowed: true);
@@ -2019,8 +2748,8 @@
   }
 
   @override
-  void endFunctionType(Token functionToken) {
-    calls.add('endFunctionType $functionToken');
+  void endFunctionType(Token functionToken, Token questionMark) {
+    calls.add('endFunctionType $functionToken $questionMark');
   }
 
   @override
@@ -2111,8 +2840,8 @@
   }
 
   @override
-  void handleType(Token beginToken) {
-    calls.add('handleType $beginToken');
+  void handleType(Token beginToken, Token questionMark) {
+    calls.add('handleType $beginToken $questionMark');
   }
 
   @override
diff --git a/pkg/front_end/test/fasta/sdk_test.dart b/pkg/front_end/test/fasta/sdk_test.dart
index 90c2a5f..515a243 100644
--- a/pkg/front_end/test/fasta/sdk_test.dart
+++ b/pkg/front_end/test/fasta/sdk_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-library fasta.test.compile_test;
+library fasta.test.sdk_test;
 
 import 'dart:async' show Future;
 
@@ -11,6 +11,7 @@
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) async {
   environment[ENABLE_FULL_COMPILE] = "";
+  environment[LEGACY_MODE] = "";
   environment["skipVm"] ??= "true";
   environment["onlyCrashes"] ??= "true";
   environment["ignoreExpectations"] ??= "true";
diff --git a/pkg/front_end/test/fasta/strong_test.dart b/pkg/front_end/test/fasta/strong_test.dart
index 9adc4aa..e8e430d 100644
--- a/pkg/front_end/test/fasta/strong_test.dart
+++ b/pkg/front_end/test/fasta/strong_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-library fasta.test.compile_test;
+library fasta.test.strong_test;
 
 import 'dart:async' show Future;
 
@@ -11,7 +11,6 @@
 Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
   environment[ENABLE_FULL_COMPILE] = "";
-  environment[STRONG_MODE] = "";
   return FastaContext.create(suite, environment);
 }
 
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 659fb1b..2934b93 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -36,6 +36,9 @@
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, DiagnosticMessage;
 
+import 'package:front_end/src/api_prototype/experimental_flags.dart'
+    show ExperimentalFlag;
+
 import 'package:front_end/src/api_prototype/standard_file_system.dart'
     show StandardFileSystem;
 
@@ -56,7 +59,13 @@
     show KernelTarget;
 
 import 'package:front_end/src/fasta/testing/kernel_chain.dart'
-    show MatchExpectation, Print, TypeCheck, Verify, WriteDill;
+    show
+        KernelTextSerialization,
+        MatchExpectation,
+        Print,
+        TypeCheck,
+        Verify,
+        WriteDill;
 
 import 'package:front_end/src/fasta/testing/validating_instrumentation.dart'
     show ValidatingInstrumentation;
@@ -67,33 +76,52 @@
 
 export 'package:testing/testing.dart' show Chain, runMe;
 
-const String STRONG_MODE = " strong mode ";
+const String LEGACY_MODE = " legacy mode ";
 
 const String ENABLE_FULL_COMPILE = " full compile ";
 
 const String EXPECTATIONS = '''
 [
   {
-    "name": "VerificationError",
+    "name": "ExpectationFileMismatch",
+    "group": "Fail"
+  },
+  {
+    "name": "ExpectationFileMissing",
+    "group": "Fail"
+  },
+  {
+    "name": "InstrumentationMismatch",
     "group": "Fail"
   },
   {
     "name": "TypeCheckError",
     "group": "Fail"
+  },
+  {
+    "name": "VerificationError",
+    "group": "Fail"
+  },
+  {
+    "name": "TextSerializationFailure",
+    "group": "Fail"
   }
 ]
 ''';
 
-String generateExpectationName(bool strongMode) {
-  return strongMode ? "strong" : "direct";
+const String KERNEL_TEXT_SERIALIZATION = " kernel text serialization ";
+
+String generateExpectationName(bool legacyMode) {
+  return legacyMode ? "legacy" : "strong";
 }
 
 class FastaContext extends ChainContext {
   final UriTranslator uriTranslator;
   final List<Step> steps;
   final Uri vm;
-  final bool strongMode;
+  final bool legacyMode;
   final bool onlyCrashes;
+  final bool enableSetLiterals;
   final Map<Component, KernelTarget> componentToTarget =
       <Component, KernelTarget>{};
   final Map<Component, StringBuffer> componentToDiagnostics =
@@ -108,17 +136,19 @@
 
   FastaContext(
       this.vm,
-      this.strongMode,
+      this.legacyMode,
       this.platformBinaries,
       this.onlyCrashes,
+      this.enableSetLiterals,
       bool ignoreExpectations,
       bool updateExpectations,
       bool updateComments,
       bool skipVm,
+      bool kernelTextSerialization,
       this.uriTranslator,
       bool fullCompile)
       : steps = <Step>[
-          new Outline(fullCompile, strongMode, updateComments: updateComments),
+          new Outline(fullCompile, legacyMode, updateComments: updateComments),
           const Print(),
           new Verify(fullCompile)
         ] {
@@ -126,20 +156,23 @@
     if (!ignoreExpectations) {
       steps.add(new MatchExpectation(
           fullCompile
-              ? ".${generateExpectationName(strongMode)}.expect"
+              ? ".${generateExpectationName(legacyMode)}.expect"
               : ".outline.expect",
           updateExpectations: updateExpectations));
     }
-    if (strongMode) {
+    if (!legacyMode) {
       steps.add(const TypeCheck());
     }
     steps.add(const EnsureNoErrors());
+    if (kernelTextSerialization) {
+      steps.add(const KernelTextSerialization());
+    }
     if (fullCompile && !skipVm) {
       steps.add(const Transform());
       if (!ignoreExpectations) {
         steps.add(new MatchExpectation(
             fullCompile
-                ? ".${generateExpectationName(strongMode)}.transformed.expect"
+                ? ".${generateExpectationName(legacyMode)}.transformed.expect"
                 : ".outline.transformed.expect",
             updateExpectations: updateExpectations));
       }
@@ -152,7 +185,7 @@
   Future ensurePlatformUris() async {
     if (platformUri == null) {
       platformUri = platformBinaries
-          .resolve(strongMode ? "vm_platform_strong.dill" : "vm_platform.dill");
+          .resolve(legacyMode ? "vm_platform.dill" : "vm_platform_strong.dill");
     }
   }
 
@@ -183,35 +216,43 @@
     Uri sdk = Uri.base.resolve("sdk/");
     Uri vm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
     Uri packages = Uri.base.resolve(".packages");
+    bool enableSetLiterals = environment["enableSetLiterals"] != "false";
     var options = new ProcessedOptions(
         options: new CompilerOptions()
           ..onDiagnostic = (DiagnosticMessage message) {
             throw message.plainTextFormatted.join("\n");
           }
           ..sdkRoot = sdk
-          ..packagesFileUri = packages);
+          ..packagesFileUri = packages
+          ..experimentalFlags = <ExperimentalFlag, bool>{
+            ExperimentalFlag.setLiterals: enableSetLiterals
+          });
     UriTranslator uriTranslator = await options.getUriTranslator();
-    bool strongMode = environment.containsKey(STRONG_MODE);
+    bool legacyMode = environment.containsKey(LEGACY_MODE);
     bool onlyCrashes = environment["onlyCrashes"] == "true";
     bool ignoreExpectations = environment["ignoreExpectations"] == "true";
     bool updateExpectations = environment["updateExpectations"] == "true";
     bool updateComments = environment["updateComments"] == "true";
     bool skipVm = environment["skipVm"] == "true";
+    bool kernelTextSerialization =
+        environment.containsKey(KERNEL_TEXT_SERIALIZATION);
     String platformBinaries = environment["platformBinaries"];
     if (platformBinaries != null && !platformBinaries.endsWith('/')) {
       platformBinaries = '$platformBinaries/';
     }
     return new FastaContext(
         vm,
-        strongMode,
+        legacyMode,
         platformBinaries == null
             ? computePlatformBinariesLocation(forceBuildDir: true)
             : Uri.base.resolve(platformBinaries),
         onlyCrashes,
+        enableSetLiterals,
         ignoreExpectations,
         updateExpectations,
         updateComments,
         skipVm,
+        kernelTextSerialization,
         uriTranslator,
         environment.containsKey(ENABLE_FULL_COMPILE));
   }
@@ -234,12 +275,6 @@
     StdioProcess process;
     try {
       var args = <String>[];
-      if (context.strongMode) {
-        // TODO(ahe): This argument is probably ignored by the VM.
-        args.add('--strong');
-        // TODO(ahe): This argument is probably ignored by the VM.
-        args.add('--reify-generic-functions');
-      }
       args.add(generated.path);
       process = await StdioProcess.run(context.vm.toFilePath(), args);
       print(process.output);
@@ -253,9 +288,9 @@
 class Outline extends Step<TestDescription, Component, FastaContext> {
   final bool fullCompile;
 
-  final bool strongMode;
+  final bool legacyMode;
 
-  const Outline(this.fullCompile, this.strongMode,
+  const Outline(this.fullCompile, this.legacyMode,
       {this.updateComments: false});
 
   final bool updateComments;
@@ -271,12 +306,15 @@
     StringBuffer errors = new StringBuffer();
     ProcessedOptions options = new ProcessedOptions(
         options: new CompilerOptions()
-          ..legacyMode = !strongMode
+          ..legacyMode = legacyMode
           ..onDiagnostic = (DiagnosticMessage message) {
             if (errors.isNotEmpty) {
               errors.write("\n\n");
             }
             errors.writeAll(message.plainTextFormatted, "\n");
+          }
+          ..experimentalFlags = <ExperimentalFlag, bool>{
+            ExperimentalFlag.setLiterals: context.enableSetLiterals
           },
         inputs: <Uri>[description.uri]);
     return await CompilerContext.runWithOptions(options, (_) async {
@@ -286,7 +324,7 @@
       Component platform = await context.loadPlatform();
       Ticker ticker = new Ticker();
       DillTarget dillTarget = new DillTarget(ticker, context.uriTranslator,
-          new TestVmTarget(new TargetFlags(legacyMode: !strongMode)));
+          new TestVmTarget(new TargetFlags(legacyMode: legacyMode)));
       dillTarget.loader.appendLibraries(platform);
       // We create a new URI translator to avoid reading platform libraries from
       // file system.
@@ -299,12 +337,16 @@
       sourceTarget.setEntryPoints(<Uri>[description.uri]);
       await dillTarget.buildOutlines();
       ValidatingInstrumentation instrumentation;
-      if (strongMode) {
+      if (!legacyMode) {
         instrumentation = new ValidatingInstrumentation();
         await instrumentation.loadExpectations(description.uri);
         sourceTarget.loader.instrumentation = instrumentation;
       }
       Component p = await sourceTarget.buildOutlines();
+      context.componentToTarget.clear();
+      context.componentToTarget[p] = sourceTarget;
+      context.componentToDiagnostics.clear();
+      context.componentToDiagnostics[p] = errors;
       if (fullCompile) {
         p = await sourceTarget.buildComponent();
         instrumentation?.finish();
@@ -312,14 +354,14 @@
           if (updateComments) {
             await instrumentation.fixSource(description.uri, false);
           } else {
-            return fail(null, instrumentation.problemsAsString);
+            return new Result<Component>(
+                p,
+                context.expectationSet["InstrumentationMismatch"],
+                instrumentation.problemsAsString,
+                null);
           }
         }
       }
-      context.componentToTarget.clear();
-      context.componentToTarget[p] = sourceTarget;
-      context.componentToDiagnostics.clear();
-      context.componentToDiagnostics[p] = errors;
       return pass(p);
     });
   }
diff --git a/pkg/front_end/test/fasta/text_serialization_test.dart b/pkg/front_end/test/fasta/text_serialization_test.dart
new file mode 100644
index 0000000..07ecb85
--- /dev/null
+++ b/pkg/front_end/test/fasta/text_serialization_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library fasta.test.text_serialization_test;
+
+import 'dart:async' show Future;
+
+import 'testing/suite.dart';
+
+Future<FastaContext> createContext(
+    Chain suite, Map<String, String> environment) {
+  environment[ENABLE_FULL_COMPILE] = "";
+  environment[KERNEL_TEXT_SERIALIZATION] = "";
+  return FastaContext.create(suite, environment);
+}
+
+main([List<String> arguments = const []]) =>
+    runMe(arguments, createContext, "../../testing.json");
diff --git a/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart b/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
index 97a1d64..d34cb01 100644
--- a/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/interface_resolver_test.dart
@@ -47,12 +47,12 @@
 
   TypeSchemaEnvironment get typeEnvironment {
     return cachedTypeEnvironment ??=
-        new TypeSchemaEnvironment(coreTypes, classHierarchy, true);
+        new TypeSchemaEnvironment(coreTypes, classHierarchy);
   }
 
   InterfaceResolver get interfaceResolver {
     return cachedInterfaceResolver ??=
-        new InterfaceResolver(null, typeEnvironment, null, true);
+        new InterfaceResolver(null, typeEnvironment, null);
   }
 
   InterfaceType get intType => coreTypes.intClass.rawType;
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
index dddce21..b323164 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
@@ -209,8 +209,8 @@
 
   void _checkConstraints(
       DartType a, DartType b, List<String> expectedConstraints) {
-    var typeSchemaEnvironment = new TypeSchemaEnvironment(
-        coreTypes, new ClassHierarchy(component), true);
+    var typeSchemaEnvironment =
+        new TypeSchemaEnvironment(coreTypes, new ClassHierarchy(component));
     var typeConstraintGatherer = new TypeConstraintGatherer(
         typeSchemaEnvironment, [T1.parameter, T2.parameter]);
     var constraints = typeConstraintGatherer.trySubtypeMatch(a, b)
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
index cddd384..101fb7f 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
@@ -714,8 +714,7 @@
   }
 
   TypeSchemaEnvironment _makeEnv() {
-    return new TypeSchemaEnvironment(
-        coreTypes, new ClassHierarchy(component), true);
+    return new TypeSchemaEnvironment(coreTypes, new ClassHierarchy(component));
   }
 
   DartType _map(DartType key, DartType value) =>
diff --git a/pkg/front_end/test/fasta/type_promotion_look_ahead_test.dart b/pkg/front_end/test/fasta/type_promotion_look_ahead_test.dart
new file mode 100644
index 0000000..9fe6f56
--- /dev/null
+++ b/pkg/front_end/test/fasta/type_promotion_look_ahead_test.dart
@@ -0,0 +1,277 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert' show jsonDecode;
+
+import 'dart:io' show File, IOSink;
+
+import 'package:front_end/src/base/processed_options.dart'
+    show ProcessedOptions;
+
+import 'package:front_end/src/fasta/builder/builder.dart' show Declaration;
+
+import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
+
+import 'package:front_end/src/fasta/messages.dart'
+    show LocatedMessage, templateUnspecified;
+
+import 'package:front_end/src/fasta/parser.dart' show Parser;
+
+import 'package:front_end/src/fasta/scanner.dart' show Token;
+
+import 'package:front_end/src/fasta/severity.dart' show Severity;
+
+import 'package:front_end/src/fasta/source/type_promotion_look_ahead_listener.dart'
+    show
+        TypePromotionLookAheadListener,
+        TypePromotionState,
+        UnspecifiedDeclaration;
+
+import 'package:front_end/src/fasta/testing/kernel_chain.dart'
+    show openWrite, runDiff;
+
+import 'package:front_end/src/fasta/testing/scanner_chain.dart'
+    show Read, Scan, ScannedFile;
+
+import 'package:kernel/ast.dart' show Source;
+
+import 'package:testing/testing.dart';
+
+const String EXPECTATIONS = '''
+[
+  {
+    "name": "ExpectationFileMismatch",
+    "group": "Fail"
+  },
+  {
+    "name": "ExpectationFileMissing",
+    "group": "Fail"
+  }
+]
+''';
+
+Future<ChainContext> createContext(
+    Chain suite, Map<String, String> environment) async {
+  CompilerContext context =
+      await CompilerContext.runWithOptions<CompilerContext>(
+          new ProcessedOptions(),
+          (CompilerContext context) =>
+              new Future<CompilerContext>.value(context),
+          errorOnMissingInput: false);
+  context.disableColors();
+  return new TypePromotionLookAheadContext(
+      context, environment["updateExpectations"] == "true");
+}
+
+class TypePromotionLookAheadContext extends ChainContext {
+  final CompilerContext context;
+
+  final List<Step> steps = const <Step>[
+    const Read(),
+    const Scan(),
+    const TypePromotionLookAheadStep(),
+    const CheckTypePromotionResult(),
+  ];
+
+  final bool updateExpectations;
+
+  final ExpectationSet expectationSet =
+      new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
+
+  TypePromotionLookAheadContext(this.context, this.updateExpectations);
+
+  Expectation get expectationFileMismatch =>
+      expectationSet["ExpectationFileMismatch"];
+
+  Expectation get expectationFileMissing =>
+      expectationSet["ExpectationFileMissing"];
+}
+
+class TypePromotionLookAheadStep extends Step<ScannedFile, TypePromotionResult,
+    TypePromotionLookAheadContext> {
+  const TypePromotionLookAheadStep();
+
+  String get name => "Type Promotion Look Ahead";
+
+  Future<Result<TypePromotionResult>> run(
+      ScannedFile file, TypePromotionLookAheadContext context) async {
+    return context.context
+        .runInContext<Result<TypePromotionResult>>((CompilerContext c) async {
+      Uri uri = file.file.uri;
+      c.uriToSource[uri] = new Source(file.result.lineStarts, file.file.bytes);
+      StringBuffer buffer = new StringBuffer();
+      Parser parser = new Parser(new TestListener(uri, buffer));
+      try {
+        parser.parseUnit(file.result.tokens);
+      } finally {
+        c.uriToSource.remove(uri);
+      }
+      return pass(new TypePromotionResult(uri, "$buffer"));
+    });
+  }
+}
+
+class TestState extends TypePromotionState {
+  final StringBuffer buffer;
+
+  TestState(Uri uri, this.buffer) : super(uri);
+
+  void note(String message, Token token) {
+    buffer.writeln(CompilerContext.current.format(
+        debugMessage(message, uri, token.charOffset, token.lexeme.length),
+        Severity.context));
+  }
+
+  @override
+  void checkEmpty(Token token) {
+    if (stack.isNotEmpty) {
+      throw CompilerContext.current.format(
+          debugMessage("Stack not empty", uri, token?.charOffset ?? -1,
+              token?.length ?? 1),
+          Severity.internalProblem);
+    }
+  }
+
+  @override
+  void declareIdentifier(Token token) {
+    super.declareIdentifier(token);
+    trace("Declared ${token.lexeme}", token);
+  }
+
+  @override
+  Declaration nullValue(String name, Token token) {
+    return new DebugDeclaration(name, uri, token?.charOffset ?? -1);
+  }
+
+  @override
+  void registerWrite(UnspecifiedDeclaration declaration, Token token) {
+    note("Write to ${declaration.name}@${declaration.charOffset}", token);
+  }
+
+  @override
+  void registerPromotionCandidate(
+      UnspecifiedDeclaration declaration, Token token) {
+    note("Possible promotion of ${declaration.name}@${declaration.charOffset}",
+        token);
+  }
+
+  @override
+  void report(LocatedMessage message, Severity severity,
+      {List<LocatedMessage> context}) {
+    CompilerContext.current.report(message, severity, context: context);
+  }
+
+  @override
+  void trace(String message, Token token) {
+    report(
+        debugMessage(message, uri, token?.charOffset ?? -1, token?.length ?? 1),
+        Severity.warning);
+    for (Object o in stack) {
+      String s = "  $o";
+      int index = s.indexOf("\n");
+      if (index != -1) {
+        s = s.substring(0, index) + "...";
+      }
+      print(s);
+    }
+    print('------------------\n');
+  }
+}
+
+LocatedMessage debugMessage(String text, Uri uri, int offset, int length) {
+  return templateUnspecified
+      .withArguments(text)
+      .withLocation(uri, offset, length);
+}
+
+class TestListener extends TypePromotionLookAheadListener {
+  TestListener(Uri uri, StringBuffer buffer)
+      : super(new TestState(uri, buffer));
+
+  @override
+  void debugEvent(String name, Token token) {
+    state.trace(name, token);
+  }
+}
+
+class DebugDeclaration extends Declaration {
+  final String name;
+
+  @override
+  final Uri fileUri;
+
+  @override
+  int charOffset;
+
+  DebugDeclaration(this.name, this.fileUri, this.charOffset);
+
+  Declaration get parent => null;
+
+  String get fullNameForErrors => name;
+
+  String toString() => "<<$name@$charOffset>>";
+}
+
+class TypePromotionResult {
+  final Uri uri;
+
+  final String trace;
+
+  const TypePromotionResult(this.uri, this.trace);
+}
+
+class CheckTypePromotionResult
+    extends Step<TypePromotionResult, Null, TypePromotionLookAheadContext> {
+  const CheckTypePromotionResult();
+
+  String get name => "Check Type Promotion Result";
+
+  Future<Result<Null>> run(
+      TypePromotionResult result, TypePromotionLookAheadContext context) async {
+    Uri uri = result.uri;
+    String actual = result.trace.trim();
+    if (actual.isNotEmpty) {
+      actual += "\n";
+    }
+    File expectedFile = new File("${uri.toFilePath()}.type_promotion.expect");
+    if (await expectedFile.exists()) {
+      String expected = await expectedFile.readAsString();
+      if (expected != actual) {
+        if (context.updateExpectations) {
+          return updateExpectationFile(expectedFile.uri, actual);
+        }
+        String diff = await runDiff(expectedFile.uri, actual);
+        return new Result<Null>(null, context.expectationFileMismatch,
+            "$uri doesn't match ${expectedFile.uri}\n$diff", null);
+      }
+      return pass(null);
+    } else {
+      if (actual.isEmpty) return pass(null);
+      if (context.updateExpectations) {
+        return updateExpectationFile(expectedFile.uri, actual);
+      }
+      return new Result<Null>(
+          null,
+          context.expectationFileMissing,
+          """
+Please create file ${expectedFile.path} with this content:
+$actual""",
+          null);
+    }
+  }
+
+  Future<Result<Null>> updateExpectationFile(Uri uri, String actual) async {
+    if (actual.isEmpty) {
+      await new File.fromUri(uri).delete();
+    } else {
+      await openWrite(uri, (IOSink sink) {
+        sink.write(actual);
+      });
+    }
+    return pass(null);
+  }
+}
+
+main([List<String> arguments = const []]) =>
+    runMe(arguments, createContext, "../../testing.json");
diff --git a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
index ea0190d..cf270cb 100644
--- a/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart
@@ -6,6 +6,10 @@
 import 'dart:io' show Directory, File;
 
 import 'package:expect/expect.dart' show Expect;
+import 'package:front_end/src/compute_platform_binaries_location.dart'
+    show computePlatformBinariesLocation;
+import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
+import 'package:kernel/kernel.dart' show Component;
 
 import 'incremental_load_from_dill_test.dart'
     show normalCompile, initializedCompile, checkIsEqual;
@@ -35,6 +39,30 @@
   Stopwatch stopwatch = new Stopwatch()..start();
   await normalCompile(dart2jsUrl, normalDill);
   print("Normal compile took ${stopwatch.elapsedMilliseconds} ms");
+  {
+    // Check that we don't include the source from files from the sdk.
+    final Uri sdkRoot = computePlatformBinariesLocation(forceBuildDir: true);
+    Uri platformUri = sdkRoot.resolve("vm_platform.dill");
+    Component cSdk = new Component();
+    new BinaryBuilder(new File.fromUri(platformUri).readAsBytesSync(),
+            disableLazyReading: false)
+        .readComponent(cSdk);
+
+    Component c = new Component();
+    new BinaryBuilder(new File.fromUri(normalDill).readAsBytesSync(),
+            disableLazyReading: false)
+        .readComponent(c);
+    for (Uri uri in c.uriToSource.keys) {
+      if (cSdk.uriToSource.containsKey(uri)) {
+        if ((c.uriToSource[uri].source?.length ?? 0) != 0) {
+          throw "Compile contained sources for the sdk $uri";
+        }
+        if ((c.uriToSource[uri].lineStarts?.length ?? 0) != 0) {
+          throw "Compile contained line starts for the sdk $uri";
+        }
+      }
+    }
+  }
 
   // Compile dart2js, initializing from the just-compiled dill,
   // a nonexisting file and a dill file that isn't valid.
@@ -47,7 +75,7 @@
     stopwatch.reset();
     bool initializeResult = await initializedCompile(
         dart2jsUrl, fullDillFromInitialized, initializeWith, [invalidateUri]);
-    Expect.equals(initializeExpect, initializeResult);
+    Expect.equals(initializeResult, initializeExpect);
     print("Initialized compile(s) from ${initializeWith.pathSegments.last} "
         "took ${stopwatch.elapsedMilliseconds} ms");
 
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index 8a1495d4..0e1d3a8 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -484,4 +484,20 @@
   void recordInvalidatedImportUrisForTesting(List<Uri> uris) {
     invalidatedImportUrisForTesting = uris.isEmpty ? null : uris.toSet();
   }
+
+  @override
+  Future<Component> computeDelta(
+      {Uri entryPoint, bool fullComponent = false}) async {
+    Component result = await super
+        .computeDelta(entryPoint: entryPoint, fullComponent: fullComponent);
+
+    // We should at least have the SDK builders available. Slight smoke test.
+    if (!dillLoadedData.loader.builders.keys
+        .map((uri) => uri.toString())
+        .contains("dart:core")) {
+      throw "Loaders builder should contain the sdk, "
+          "but didn't even contain dart:core.";
+    }
+    return result;
+  }
 }
diff --git a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
index 8167690..9dc2941 100644
--- a/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_invalid_dill_test.dart
@@ -29,7 +29,9 @@
     show
         Code,
         codeInitializeFromDillNotSelfContained,
-        codeInitializeFromDillUnknownProblem;
+        codeInitializeFromDillNotSelfContainedNoDump,
+        codeInitializeFromDillUnknownProblem,
+        codeInitializeFromDillUnknownProblemNoDump;
 
 import 'package:front_end/src/fasta/incremental_compiler.dart'
     show IncrementalCompiler;
@@ -63,13 +65,15 @@
   CompilerOptions options;
 
   compileExpectInitializeFailAndSpecificWarning(
-      Code expectedWarningCode) async {
+      Code expectedWarningCode, bool writeFileOnCrashReport) async {
     errorMessages.clear();
     warningMessages.clear();
-    IncrementalCompiler compiler = new IncrementalCompiler(
-        new CompilerContext(
-            new ProcessedOptions(options: options, inputs: [entryPoint])),
-        initializeFrom);
+    options.writeFileOnCrashReport = writeFileOnCrashReport;
+    DeleteTempFilesIncrementalCompiler compiler =
+        new DeleteTempFilesIncrementalCompiler(
+            new CompilerContext(
+                new ProcessedOptions(options: options, inputs: [entryPoint])),
+            initializeFrom);
     await compiler.computeDelta();
     if (compiler.initializedFromDill) {
       Expect.fail("Expected to not be able to initialized from dill, but did.");
@@ -166,13 +170,28 @@
 
     // Initializing from partial dill should not be ok.
     await compileExpectInitializeFailAndSpecificWarning(
-        codeInitializeFromDillNotSelfContained);
+        codeInitializeFromDillNotSelfContained, true);
+    await compileExpectInitializeFailAndSpecificWarning(
+        codeInitializeFromDillNotSelfContainedNoDump, false);
 
     // Create a invalid dill file to load from: Should not be ok.
     data = new List<int>.filled(42, 42);
     fs.entityForUri(initializeFrom).writeAsBytesSync(data);
     await compileExpectInitializeFailAndSpecificWarning(
-        codeInitializeFromDillUnknownProblem);
+        codeInitializeFromDillUnknownProblem, true);
+    await compileExpectInitializeFailAndSpecificWarning(
+        codeInitializeFromDillUnknownProblemNoDump, false);
+  }
+}
+
+class DeleteTempFilesIncrementalCompiler extends IncrementalCompiler {
+  DeleteTempFilesIncrementalCompiler(CompilerContext context,
+      [Uri initializeFromDillUri])
+      : super(context, initializeFromDillUri);
+
+  void recordTemporaryFileForTesting(Uri uri) {
+    File f = new File.fromUri(uri);
+    if (f.existsSync()) f.deleteSync();
   }
 }
 
diff --git a/pkg/front_end/test/tool/reload.dart b/pkg/front_end/test/tool/reload.dart
index 31e10a1..78d669e 100644
--- a/pkg/front_end/test/tool/reload.dart
+++ b/pkg/front_end/test/tool/reload.dart
@@ -75,7 +75,7 @@
     var id = await mainId;
     var result = await rpc.sendRequest('reloadSources', {
       'isolateId': id,
-      'rootLibUri': entryUri.path,
+      'rootLibUri': entryUri.toFilePath(),
     });
     return result;
   }
diff --git a/pkg/front_end/test/type_labeler_test.dart b/pkg/front_end/test/type_labeler_test.dart
new file mode 100644
index 0000000..f24c86d
--- /dev/null
+++ b/pkg/front_end/test/type_labeler_test.dart
@@ -0,0 +1,248 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart';
+
+import 'package:front_end/src/fasta/kernel/type_labeler.dart';
+
+import 'package:expect/expect.dart';
+
+main() {
+  void check(Map<Node, String> expectations, int bulletCount) {
+    TypeLabeler labeler = new TypeLabeler();
+    Map<Node, List<Object>> conversions = {};
+    expectations.forEach((Node node, String expected) {
+      if (node is DartType) {
+        conversions[node] = labeler.labelType(node);
+      } else if (node is Constant) {
+        conversions[node] = labeler.labelConstant(node);
+      } else {
+        Expect.fail("Neither type nor constant");
+      }
+    });
+    expectations.forEach((Node node, String expected) {
+      Expect.stringEquals(expected, conversions[node].join());
+    });
+    int newlines = "\n".allMatches(labeler.originMessages).length;
+    Expect.equals(bulletCount, newlines);
+  }
+
+  // Library mocks
+  Library dartCoreLib = new Library(new Uri(scheme: 'dart', path: 'core'));
+  Library myLib = new Library(Uri.parse("org-dartlang-testcase:///mylib.dart"));
+
+  // Set up some classes
+  Class objectClass = new Class(name: "Object")..parent = dartCoreLib;
+  Supertype objectSuper = new Supertype(objectClass, []);
+  Class boolClass = new Class(name: "bool", supertype: objectSuper)
+    ..parent = dartCoreLib;
+  Class numClass = new Class(name: "num", supertype: objectSuper)
+    ..parent = dartCoreLib;
+  Supertype numSuper = new Supertype(numClass, []);
+  Class intClass = new Class(name: "int", supertype: numSuper)
+    ..parent = dartCoreLib;
+  Class fooClass = new Class(name: "Foo", supertype: objectSuper)
+    ..parent = myLib;
+  Class foo2Class = new Class(name: "Foo", supertype: objectSuper)
+    ..parent = myLib;
+  Class barClass = new Class(
+      name: "Bar",
+      supertype: objectSuper,
+      typeParameters: [new TypeParameter("X")])
+    ..parent = myLib;
+  Class bazClass = new Class(
+      name: "Baz",
+      supertype: objectSuper,
+      typeParameters: [new TypeParameter("X"), new TypeParameter("Y")])
+    ..parent = myLib;
+
+  // Test types
+  DartType voidType = const VoidType();
+  check({voidType: "void"}, 0);
+
+  DartType dynamicType = const DynamicType();
+  check({dynamicType: "dynamic"}, 0);
+
+  DartType boolType = new InterfaceType(boolClass);
+  check({boolType: "bool"}, 0);
+
+  DartType numType = new InterfaceType(numClass);
+  check({numType: "num"}, 0);
+
+  DartType intType = new InterfaceType(intClass);
+  check({intType: "int"}, 0);
+
+  DartType object = new InterfaceType(objectClass);
+  check({object: "Object"}, 1);
+
+  DartType foo = new InterfaceType(fooClass);
+  check({foo: "Foo"}, 1);
+
+  DartType foo2 = new InterfaceType(foo2Class);
+  check({foo2: "Foo"}, 1);
+  check({foo: "Foo/*1*/", foo2: "Foo/*2*/"}, 2);
+
+  DartType barVoid = new InterfaceType(barClass, [voidType]);
+  check({barVoid: "Bar<void>"}, 1);
+
+  DartType barObject = new InterfaceType(barClass, [object]);
+  check({barObject: "Bar<Object>"}, 2);
+
+  DartType barBarDynamic = new InterfaceType(barClass, [
+    new InterfaceType(barClass, [dynamicType])
+  ]);
+  check({barBarDynamic: "Bar<Bar<dynamic>>"}, 1);
+
+  DartType parameterY = new TypeParameterType(new TypeParameter("Y"));
+  DartType barY = new InterfaceType(barClass, [parameterY]);
+  check({parameterY: "Y", barY: "Bar<Y>"}, 1);
+
+  DartType bazFooBarBazDynamicVoid = new InterfaceType(bazClass, [
+    foo,
+    new InterfaceType(barClass, [
+      new InterfaceType(bazClass, [dynamicType, voidType])
+    ])
+  ]);
+  check({bazFooBarBazDynamicVoid: "Baz<Foo, Bar<Baz<dynamic, void>>>"}, 3);
+
+  DartType bazFooFoo2 = new InterfaceType(bazClass, [foo, foo2]);
+  check({bazFooFoo2: "Baz<Foo/*1*/, Foo/*2*/>"}, 3);
+
+  DartType funVoid = new FunctionType([], voidType);
+  check({funVoid: "void Function()"}, 0);
+
+  DartType funFooBarVoid = new FunctionType([foo], barVoid);
+  check({funFooBarVoid: "Bar<void> Function(Foo)"}, 2);
+
+  DartType funFooFoo2 = new FunctionType([foo], foo2);
+  check({funFooFoo2: "Foo/*1*/ Function(Foo/*2*/)"}, 2);
+
+  DartType funOptFooVoid =
+      new FunctionType([foo], voidType, requiredParameterCount: 0);
+  check({funOptFooVoid: "void Function([Foo])"}, 1);
+
+  DartType funFooOptIntVoid =
+      new FunctionType([foo, intType], voidType, requiredParameterCount: 1);
+  check({funFooOptIntVoid: "void Function(Foo, [int])"}, 1);
+
+  DartType funOptFooOptIntVoid =
+      new FunctionType([foo, intType], voidType, requiredParameterCount: 0);
+  check({funOptFooOptIntVoid: "void Function([Foo, int])"}, 1);
+
+  DartType funNamedObjectVoid = new FunctionType([], voidType,
+      namedParameters: [new NamedType("obj", object)]);
+  check({funNamedObjectVoid: "void Function({Object obj})"}, 1);
+
+  DartType funFooNamedObjectVoid = new FunctionType([foo], voidType,
+      namedParameters: [new NamedType("obj", object)]);
+  check({funFooNamedObjectVoid: "void Function(Foo, {Object obj})"}, 2);
+
+  TypeParameter t = new TypeParameter("T", object, dynamicType);
+  DartType funGeneric = new FunctionType(
+      [new TypeParameterType(t)], new TypeParameterType(t),
+      typeParameters: [t]);
+  check({funGeneric: "T Function<T>(T)"}, 0);
+
+  TypeParameter tObject = new TypeParameter("T", object, object);
+  DartType funGenericObject = new FunctionType(
+      [new TypeParameterType(tObject)], new TypeParameterType(tObject),
+      typeParameters: [tObject]);
+  check({funGenericObject: "T Function<T extends Object>(T)"}, 1);
+
+  TypeParameter tFoo = new TypeParameter("T", foo, dynamicType);
+  DartType funGenericFoo = new FunctionType(
+      [new TypeParameterType(tFoo)], new TypeParameterType(tFoo),
+      typeParameters: [tFoo]);
+  check({funGenericFoo: "T Function<T extends Foo>(T)"}, 1);
+
+  TypeParameter tBar = new TypeParameter("T", dynamicType, dynamicType);
+  tBar.bound = new InterfaceType(barClass, [new TypeParameterType(tBar)]);
+  DartType funGenericBar = new FunctionType(
+      [new TypeParameterType(tBar)], new TypeParameterType(tBar),
+      typeParameters: [tBar]);
+  check({funGenericBar: "T Function<T extends Bar<T>>(T)"}, 1);
+
+  // Add some members for testing instance constants
+  Field booField = new Field(new Name("boo"), type: boolType);
+  fooClass.fields.add(booField);
+  Field valueField = new Field(new Name("value"), type: intType);
+  foo2Class.fields.add(valueField);
+  Field nextField = new Field(new Name("next"), type: foo2);
+  foo2Class.fields.add(nextField);
+  Field xField = new Field(new Name("x"),
+      type: new TypeParameterType(bazClass.typeParameters[0]));
+  bazClass.fields.add(xField);
+  Field yField = new Field(new Name("y"),
+      type: new TypeParameterType(bazClass.typeParameters[1]));
+  bazClass.fields.add(yField);
+  FunctionNode gooFunction = new FunctionNode(new EmptyStatement(),
+      typeParameters: [new TypeParameter("V")]);
+  Procedure gooMethod = new Procedure(
+      new Name("goo"), ProcedureKind.Method, gooFunction,
+      isStatic: true)
+    ..parent = fooClass;
+
+  // Test constants
+  Constant nullConst = new NullConstant();
+  check({nullConst: "null"}, 0);
+
+  Constant trueConst = new BoolConstant(true);
+  Constant falseConst = new BoolConstant(false);
+  check({trueConst: "true", falseConst: "false"}, 0);
+
+  Constant intConst = new IntConstant(2);
+  Constant doubleConst = new DoubleConstant(2.5);
+  check({intConst: "2", doubleConst: "2.5"}, 0);
+
+  Constant stringConst = new StringConstant("Don't \"quote\" me on that!");
+  check({stringConst: "\"Don't \\\"quote\\\" me on that!\""}, 0);
+
+  Constant symConst = new SymbolConstant("foo", null);
+  Constant symLibConst = new SymbolConstant("bar", dartCoreLib.reference);
+  check({symConst: "#foo", symLibConst: "#dart:core::bar"}, 0);
+
+  Constant fooConst = new InstanceConstant(
+      fooClass.reference, [], {booField.reference: trueConst});
+  check({fooConst: "Foo {boo: true}"}, 1);
+
+  Constant foo2Const = new InstanceConstant(foo2Class.reference, [],
+      {nextField.reference: nullConst, valueField.reference: intConst});
+  check({foo2Const: "Foo {value: 2, next: null}"}, 1);
+
+  Constant foo2nConst = new InstanceConstant(foo2Class.reference, [], {
+    valueField.reference: intConst,
+    nextField.reference: new InstanceConstant(foo2Class.reference, [],
+        {valueField.reference: intConst, nextField.reference: nullConst}),
+  });
+  check({foo2nConst: "Foo {value: 2, next: Foo {value: 2, next: null}}"}, 1);
+
+  Constant bazFooFoo2Const = new InstanceConstant(bazClass.reference,
+      [foo, foo2], {xField.reference: fooConst, yField.reference: foo2Const});
+  check({
+    bazFooFoo2Const: "Baz<Foo/*1*/, Foo/*2*/> " +
+        "{x: Foo/*1*/ {boo: true}, y: Foo/*2*/ {value: 2, next: null}}"
+  }, 3);
+
+  Constant listConst = new ListConstant(dynamicType, [intConst, doubleConst]);
+  check({listConst: "<dynamic>[2, 2.5]"}, 0);
+
+  Constant listBoolConst = new ListConstant(boolType, [falseConst, trueConst]);
+  check({listBoolConst: "<bool>[false, true]"}, 0);
+
+  Constant mapConst = new MapConstant(boolType, numType, [
+    new ConstantMapEntry(trueConst, intConst),
+    new ConstantMapEntry(falseConst, doubleConst)
+  ]);
+  check({mapConst: "<bool, num>{true: 2, false: 2.5}"}, 0);
+
+  Constant tearOffConst = new TearOffConstant(gooMethod);
+  check({tearOffConst: "Foo.goo"}, 1);
+
+  Constant partialInstantiationConst =
+      new PartialInstantiationConstant(tearOffConst, [intType]);
+  check({partialInstantiationConst: "Foo.goo<int>"}, 1);
+
+  Constant typeLiteralConst = new TypeLiteralConstant(foo);
+  check({typeLiteralConst: "Foo"}, 1);
+}
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.direct.expect b/pkg/front_end/testcases/DeltaBlue.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/DeltaBlue.dart.direct.expect
rename to pkg/front_end/testcases/DeltaBlue.dart.legacy.expect
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.strong.expect b/pkg/front_end/testcases/DeltaBlue.dart.strong.expect
index 2579576..78e2440 100644
--- a/pkg/front_end/testcases/DeltaBlue.dart.strong.expect
+++ b/pkg/front_end/testcases/DeltaBlue.dart.strong.expect
@@ -1,10 +1,9 @@
-// dynamic is not a subtype of dart.core::int (DeltaBlue.dart:139:16)
 library;
 import self as self;
 import "dart:core" as core;
 
 class DeltaBlue extends core::Object {
-  constructor •() → void
+  synthetic constructor •() → self::DeltaBlue
     : super core::Object::•()
     ;
   method run() → void {
@@ -15,7 +14,7 @@
 class Strength extends core::Object {
   final field core::int value;
   final field core::String name;
-  const constructor •(core::int value, core::String name) → void
+  const constructor •(core::int value, core::String name) → self::Strength
     : self::Strength::value = value, self::Strength::name = name, super core::Object::•()
     ;
   method nextWeaker() → self::Strength
@@ -27,12 +26,15 @@
     return s1.{self::Strength::value}.{core::num::>}(s2.{self::Strength::value});
   }
   static method weakest(self::Strength s1, self::Strength s2) → self::Strength {
-    return self::Strength::weaker(s1, s2) ? s1 : s2;
+    return self::Strength::weaker(s1, s2) ?{self::Strength} s1 : s2;
+  }
+  static method strongest(self::Strength s1, self::Strength s2) → self::Strength {
+    return self::Strength::stronger(s1, s2) ?{self::Strength} s1 : s2;
   }
 }
 abstract class Constraint extends core::Object {
   final field self::Strength strength;
-  const constructor •(self::Strength strength) → void
+  const constructor •(self::Strength strength) → self::Constraint
     : self::Constraint::strength = strength, super core::Object::•()
     ;
   abstract method isSatisfied() → core::bool;
@@ -50,22 +52,22 @@
     self::planner.{self::Planner::incrementalAdd}(this);
   }
   method satisfy(dynamic mark) → self::Constraint {
-    this.{self::Constraint::chooseMethod}(mark as core::int);
+    this.{self::Constraint::chooseMethod}(mark as{TypeError} core::int);
     if(!this.{self::Constraint::isSatisfied}()) {
       if(this.{self::Constraint::strength}.{core::Object::==}(self::REQUIRED)) {
         core::print("Could not satisfy a required constraint!");
       }
       return null;
     }
-    this.{self::Constraint::markInputs}(mark as core::int);
+    this.{self::Constraint::markInputs}(mark as{TypeError} core::int);
     self::Variable out = this.{self::Constraint::output}();
     self::Constraint overridden = out.{self::Variable::determinedBy};
     if(!overridden.{core::Object::==}(null))
       overridden.{self::Constraint::markUnsatisfied}();
     out.{self::Variable::determinedBy} = this;
-    if(!self::planner.{self::Planner::addPropagate}(this, mark as core::int))
+    if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError} core::int))
       core::print("Cycle encountered");
-    out.{self::Variable::mark} = mark;
+    out.{self::Variable::mark} = mark as{TypeError} core::int;
     return overridden;
   }
   method destroyConstraint() → void {
@@ -79,7 +81,7 @@
 abstract class UnaryConstraint extends self::Constraint {
   final field self::Variable myOutput;
   field core::bool satisfied = false;
-  constructor •(self::Variable myOutput, self::Strength strength) → void
+  constructor •(self::Variable myOutput, self::Strength strength) → self::UnaryConstraint
     : self::UnaryConstraint::myOutput = myOutput, super self::Constraint::•(strength) {
     this.{self::Constraint::addConstraint}();
   }
@@ -113,13 +115,13 @@
   }
 }
 class StayConstraint extends self::UnaryConstraint {
-  constructor •(self::Variable v, self::Strength str) → void
+  constructor •(self::Variable v, self::Strength str) → self::StayConstraint
     : super self::UnaryConstraint::•(v, str)
     ;
   method execute() → void {}
 }
 class EditConstraint extends self::UnaryConstraint {
-  constructor •(self::Variable v, self::Strength str) → void
+  constructor •(self::Variable v, self::Strength str) → self::EditConstraint
     : super self::UnaryConstraint::•(v, str)
     ;
   method isInput() → core::bool
@@ -130,22 +132,22 @@
   field self::Variable v1;
   field self::Variable v2;
   field core::int direction = self::NONE;
-  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → void
+  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::BinaryConstraint
     : self::BinaryConstraint::v1 = v1, self::BinaryConstraint::v2 = v2, super self::Constraint::•(strength) {
     this.{self::Constraint::addConstraint}();
   }
   method chooseMethod(core::int mark) → void {
     if(this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark)) {
-      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ? self::FORWARD : self::NONE;
+      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int} self::FORWARD : self::NONE;
     }
     if(this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark)) {
-      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ? self::BACKWARD : self::NONE;
+      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int} self::BACKWARD : self::NONE;
     }
     if(self::Strength::weaker(this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength})) {
-      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ? self::BACKWARD : self::NONE;
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int} self::BACKWARD : self::NONE;
     }
     else {
-      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ? self::FORWARD : self::BACKWARD;
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int} self::FORWARD : self::BACKWARD;
     }
   }
   method addToGraph() → void {
@@ -159,9 +161,9 @@
     this.{self::BinaryConstraint::input}().{self::Variable::mark} = mark;
   }
   method input() → self::Variable
-    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ? this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
+    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ?{self::Variable} this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
   method output() → self::Variable
-    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ? this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
+    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ?{self::Variable} this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
   method recalculate() → void {
     self::Variable ihn = this.{self::BinaryConstraint::input}();
     self::Variable out = this.{self::BinaryConstraint::output}();
@@ -188,23 +190,23 @@
 class ScaleConstraint extends self::BinaryConstraint {
   final field self::Variable scale;
   final field self::Variable offset;
-  constructor •(self::Variable src, self::Variable scale, self::Variable offset, self::Variable dest, self::Strength strength) → void
+  constructor •(self::Variable src, self::Variable scale, self::Variable offset, self::Variable dest, self::Strength strength) → self::ScaleConstraint
     : self::ScaleConstraint::scale = scale, self::ScaleConstraint::offset = offset, super self::BinaryConstraint::•(src, dest, strength)
     ;
   method addToGraph() → void {
-    this.{=self::BinaryConstraint::addToGraph}();
+    super.{self::BinaryConstraint::addToGraph}();
     this.{self::ScaleConstraint::scale}.{self::Variable::addConstraint}(this);
     this.{self::ScaleConstraint::offset}.{self::Variable::addConstraint}(this);
   }
   method removeFromGraph() → void {
-    this.{=self::BinaryConstraint::removeFromGraph}();
+    super.{self::BinaryConstraint::removeFromGraph}();
     if(!this.{self::ScaleConstraint::scale}.{core::Object::==}(null))
       this.{self::ScaleConstraint::scale}.{self::Variable::removeConstraint}(this);
     if(!this.{self::ScaleConstraint::offset}.{core::Object::==}(null))
       this.{self::ScaleConstraint::offset}.{self::Variable::removeConstraint}(this);
   }
   method markInputs(core::int mark) → void {
-    this.{=self::BinaryConstraint::markInputs}(mark);
+    super.{self::BinaryConstraint::markInputs}(mark);
     this.{self::ScaleConstraint::scale}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}.{self::Variable::mark} = mark;
   }
   method execute() → void {
@@ -225,7 +227,7 @@
   }
 }
 class EqualityConstraint extends self::BinaryConstraint {
-  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → void
+  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::EqualityConstraint
     : super self::BinaryConstraint::•(v1, v2, strength)
     ;
   method execute() → void {
@@ -240,11 +242,11 @@
   field core::bool stay = true;
   field core::int value;
   final field core::String name;
-  constructor •(core::String name, core::int value) → void
+  constructor •(core::String name, core::int value) → self::Variable
     : self::Variable::name = name, self::Variable::value = value, super core::Object::•()
     ;
   method addConstraint(self::Constraint c) → void {
-    this.{self::Variable::constraints}.{core::List::add$cc}(c);
+    this.{self::Variable::constraints}.{core::List::add}(c);
   }
   method removeConstraint(self::Constraint c) → void {
     this.{self::Variable::constraints}.{core::List::remove}(c);
@@ -254,7 +256,7 @@
 }
 class Planner extends core::Object {
   field core::int currentMark = 0;
-  constructor •() → void
+  synthetic constructor •() → self::Planner
     : super core::Object::•()
     ;
   method incrementalAdd(self::Constraint c) → void {
@@ -299,7 +301,7 @@
     for (core::int i = 0; i.{core::num::<}(constraints.{core::List::length}); i = i.{core::num::+}(1)) {
       self::Constraint c = constraints.{core::List::[]}(i);
       if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
-        sources.{core::List::add$cc}(c);
+        sources.{core::List::add}(c);
     }
     return this.{self::Planner::makePlan}(sources);
   }
@@ -327,7 +329,7 @@
       for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
         self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
         if(!c.{self::Constraint::isSatisfied}())
-          unsatisfied.{core::List::add$cc}(c);
+          unsatisfied.{core::List::add}(c);
       }
       self::Constraint determining = v.{self::Variable::determinedBy};
       for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
@@ -345,18 +347,20 @@
     for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
       self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
       if(!c.{core::Object::==}(determining) && c.{self::Constraint::isSatisfied}())
-        coll.{core::List::add$cc}(c);
+        coll.{core::List::add}(c);
     }
   }
 }
 class Plan extends core::Object {
   field core::List<self::Constraint> list = <self::Constraint>[];
-  constructor •() → void
+  synthetic constructor •() → self::Plan
     : super core::Object::•()
     ;
   method addConstraint(self::Constraint c) → void {
-    this.{self::Plan::list}.{core::List::add$cc}(c);
+    this.{self::Plan::list}.{core::List::add}(c);
   }
+  method size() → core::int
+    return this.{self::Plan::list}.{core::List::length};
   method execute() → void {
     for (core::int i = 0; i.{core::num::<}(this.{self::Plan::list}.{core::List::length}); i = i.{core::num::+}(1)) {
       this.{self::Plan::list}.{core::List::[]}(i).{self::Constraint::execute}();
@@ -373,7 +377,7 @@
 static const field core::int NONE = 1;
 static const field core::int FORWARD = 2;
 static const field core::int BACKWARD = 0;
-static field self::Planner planner = null;
+static field self::Planner planner;
 static method main() → dynamic {
   new self::DeltaBlue::•().{self::DeltaBlue::run}();
 }
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.strong.transformed.expect b/pkg/front_end/testcases/DeltaBlue.dart.strong.transformed.expect
new file mode 100644
index 0000000..78e2440
--- /dev/null
+++ b/pkg/front_end/testcases/DeltaBlue.dart.strong.transformed.expect
@@ -0,0 +1,450 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class DeltaBlue extends core::Object {
+  synthetic constructor •() → self::DeltaBlue
+    : super core::Object::•()
+    ;
+  method run() → void {
+    self::chainTest(100);
+    self::projectionTest(100);
+  }
+}
+class Strength extends core::Object {
+  final field core::int value;
+  final field core::String name;
+  const constructor •(core::int value, core::String name) → self::Strength
+    : self::Strength::value = value, self::Strength::name = name, super core::Object::•()
+    ;
+  method nextWeaker() → self::Strength
+    return const <self::Strength>[self::STRONG_PREFERRED, self::PREFERRED, self::STRONG_DEFAULT, self::NORMAL, self::WEAK_DEFAULT, self::WEAKEST].{core::List::[]}(this.{self::Strength::value});
+  static method stronger(self::Strength s1, self::Strength s2) → core::bool {
+    return s1.{self::Strength::value}.{core::num::<}(s2.{self::Strength::value});
+  }
+  static method weaker(self::Strength s1, self::Strength s2) → core::bool {
+    return s1.{self::Strength::value}.{core::num::>}(s2.{self::Strength::value});
+  }
+  static method weakest(self::Strength s1, self::Strength s2) → self::Strength {
+    return self::Strength::weaker(s1, s2) ?{self::Strength} s1 : s2;
+  }
+  static method strongest(self::Strength s1, self::Strength s2) → self::Strength {
+    return self::Strength::stronger(s1, s2) ?{self::Strength} s1 : s2;
+  }
+}
+abstract class Constraint extends core::Object {
+  final field self::Strength strength;
+  const constructor •(self::Strength strength) → self::Constraint
+    : self::Constraint::strength = strength, super core::Object::•()
+    ;
+  abstract method isSatisfied() → core::bool;
+  abstract method markUnsatisfied() → void;
+  abstract method addToGraph() → void;
+  abstract method removeFromGraph() → void;
+  abstract method chooseMethod(core::int mark) → void;
+  abstract method markInputs(core::int mark) → void;
+  abstract method inputsKnown(core::int mark) → core::bool;
+  abstract method output() → self::Variable;
+  abstract method execute() → void;
+  abstract method recalculate() → void;
+  method addConstraint() → void {
+    this.{self::Constraint::addToGraph}();
+    self::planner.{self::Planner::incrementalAdd}(this);
+  }
+  method satisfy(dynamic mark) → self::Constraint {
+    this.{self::Constraint::chooseMethod}(mark as{TypeError} core::int);
+    if(!this.{self::Constraint::isSatisfied}()) {
+      if(this.{self::Constraint::strength}.{core::Object::==}(self::REQUIRED)) {
+        core::print("Could not satisfy a required constraint!");
+      }
+      return null;
+    }
+    this.{self::Constraint::markInputs}(mark as{TypeError} core::int);
+    self::Variable out = this.{self::Constraint::output}();
+    self::Constraint overridden = out.{self::Variable::determinedBy};
+    if(!overridden.{core::Object::==}(null))
+      overridden.{self::Constraint::markUnsatisfied}();
+    out.{self::Variable::determinedBy} = this;
+    if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError} core::int))
+      core::print("Cycle encountered");
+    out.{self::Variable::mark} = mark as{TypeError} core::int;
+    return overridden;
+  }
+  method destroyConstraint() → void {
+    if(this.{self::Constraint::isSatisfied}())
+      self::planner.{self::Planner::incrementalRemove}(this);
+    this.{self::Constraint::removeFromGraph}();
+  }
+  method isInput() → core::bool
+    return false;
+}
+abstract class UnaryConstraint extends self::Constraint {
+  final field self::Variable myOutput;
+  field core::bool satisfied = false;
+  constructor •(self::Variable myOutput, self::Strength strength) → self::UnaryConstraint
+    : self::UnaryConstraint::myOutput = myOutput, super self::Constraint::•(strength) {
+    this.{self::Constraint::addConstraint}();
+  }
+  method addToGraph() → void {
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::addConstraint}(this);
+    this.{self::UnaryConstraint::satisfied} = false;
+  }
+  method chooseMethod(core::int mark) → void {
+    this.{self::UnaryConstraint::satisfied} = !this.{self::UnaryConstraint::myOutput}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength});
+  }
+  method isSatisfied() → core::bool
+    return this.{self::UnaryConstraint::satisfied};
+  method markInputs(core::int mark) → void {}
+  method output() → self::Variable
+    return this.{self::UnaryConstraint::myOutput};
+  method recalculate() → void {
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength} = this.{self::Constraint::strength};
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::stay} = !this.{self::Constraint::isInput}();
+    if(this.{self::UnaryConstraint::myOutput}.{self::Variable::stay})
+      this.{self::Constraint::execute}();
+  }
+  method markUnsatisfied() → void {
+    this.{self::UnaryConstraint::satisfied} = false;
+  }
+  method inputsKnown(core::int mark) → core::bool
+    return true;
+  method removeFromGraph() → void {
+    if(!this.{self::UnaryConstraint::myOutput}.{core::Object::==}(null))
+      this.{self::UnaryConstraint::myOutput}.{self::Variable::removeConstraint}(this);
+    this.{self::UnaryConstraint::satisfied} = false;
+  }
+}
+class StayConstraint extends self::UnaryConstraint {
+  constructor •(self::Variable v, self::Strength str) → self::StayConstraint
+    : super self::UnaryConstraint::•(v, str)
+    ;
+  method execute() → void {}
+}
+class EditConstraint extends self::UnaryConstraint {
+  constructor •(self::Variable v, self::Strength str) → self::EditConstraint
+    : super self::UnaryConstraint::•(v, str)
+    ;
+  method isInput() → core::bool
+    return true;
+  method execute() → void {}
+}
+abstract class BinaryConstraint extends self::Constraint {
+  field self::Variable v1;
+  field self::Variable v2;
+  field core::int direction = self::NONE;
+  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::BinaryConstraint
+    : self::BinaryConstraint::v1 = v1, self::BinaryConstraint::v2 = v2, super self::Constraint::•(strength) {
+    this.{self::Constraint::addConstraint}();
+  }
+  method chooseMethod(core::int mark) → void {
+    if(this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark)) {
+      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int} self::FORWARD : self::NONE;
+    }
+    if(this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark)) {
+      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int} self::BACKWARD : self::NONE;
+    }
+    if(self::Strength::weaker(this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength})) {
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int} self::BACKWARD : self::NONE;
+    }
+    else {
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int} self::FORWARD : self::BACKWARD;
+    }
+  }
+  method addToGraph() → void {
+    this.{self::BinaryConstraint::v1}.{self::Variable::addConstraint}(this);
+    this.{self::BinaryConstraint::v2}.{self::Variable::addConstraint}(this);
+    this.{self::BinaryConstraint::direction} = self::NONE;
+  }
+  method isSatisfied() → core::bool
+    return !this.{self::BinaryConstraint::direction}.{core::num::==}(self::NONE);
+  method markInputs(core::int mark) → void {
+    this.{self::BinaryConstraint::input}().{self::Variable::mark} = mark;
+  }
+  method input() → self::Variable
+    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ?{self::Variable} this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
+  method output() → self::Variable
+    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ?{self::Variable} this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
+  method recalculate() → void {
+    self::Variable ihn = this.{self::BinaryConstraint::input}();
+    self::Variable out = this.{self::BinaryConstraint::output}();
+    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
+    out.{self::Variable::stay} = ihn.{self::Variable::stay};
+    if(out.{self::Variable::stay})
+      this.{self::Constraint::execute}();
+  }
+  method markUnsatisfied() → void {
+    this.{self::BinaryConstraint::direction} = self::NONE;
+  }
+  method inputsKnown(core::int mark) → core::bool {
+    self::Variable i = this.{self::BinaryConstraint::input}();
+    return i.{self::Variable::mark}.{core::num::==}(mark) || i.{self::Variable::stay} || i.{self::Variable::determinedBy}.{core::Object::==}(null);
+  }
+  method removeFromGraph() → void {
+    if(!this.{self::BinaryConstraint::v1}.{core::Object::==}(null))
+      this.{self::BinaryConstraint::v1}.{self::Variable::removeConstraint}(this);
+    if(!this.{self::BinaryConstraint::v2}.{core::Object::==}(null))
+      this.{self::BinaryConstraint::v2}.{self::Variable::removeConstraint}(this);
+    this.{self::BinaryConstraint::direction} = self::NONE;
+  }
+}
+class ScaleConstraint extends self::BinaryConstraint {
+  final field self::Variable scale;
+  final field self::Variable offset;
+  constructor •(self::Variable src, self::Variable scale, self::Variable offset, self::Variable dest, self::Strength strength) → self::ScaleConstraint
+    : self::ScaleConstraint::scale = scale, self::ScaleConstraint::offset = offset, super self::BinaryConstraint::•(src, dest, strength)
+    ;
+  method addToGraph() → void {
+    super.{self::BinaryConstraint::addToGraph}();
+    this.{self::ScaleConstraint::scale}.{self::Variable::addConstraint}(this);
+    this.{self::ScaleConstraint::offset}.{self::Variable::addConstraint}(this);
+  }
+  method removeFromGraph() → void {
+    super.{self::BinaryConstraint::removeFromGraph}();
+    if(!this.{self::ScaleConstraint::scale}.{core::Object::==}(null))
+      this.{self::ScaleConstraint::scale}.{self::Variable::removeConstraint}(this);
+    if(!this.{self::ScaleConstraint::offset}.{core::Object::==}(null))
+      this.{self::ScaleConstraint::offset}.{self::Variable::removeConstraint}(this);
+  }
+  method markInputs(core::int mark) → void {
+    super.{self::BinaryConstraint::markInputs}(mark);
+    this.{self::ScaleConstraint::scale}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}.{self::Variable::mark} = mark;
+  }
+  method execute() → void {
+    if(this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD)) {
+      this.{self::BinaryConstraint::v2}.{self::Variable::value} = this.{self::BinaryConstraint::v1}.{self::Variable::value}.{core::num::*}(this.{self::ScaleConstraint::scale}.{self::Variable::value}).{core::num::+}(this.{self::ScaleConstraint::offset}.{self::Variable::value});
+    }
+    else {
+      this.{self::BinaryConstraint::v1}.{self::Variable::value} = this.{self::BinaryConstraint::v2}.{self::Variable::value}.{core::num::-}(this.{self::ScaleConstraint::offset}.{self::Variable::value}).{core::num::~/}(this.{self::ScaleConstraint::scale}.{self::Variable::value});
+    }
+  }
+  method recalculate() → void {
+    self::Variable ihn = this.{self::BinaryConstraint::input}();
+    self::Variable out = this.{self::BinaryConstraint::output}();
+    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
+    out.{self::Variable::stay} = ihn.{self::Variable::stay} && this.{self::ScaleConstraint::scale}.{self::Variable::stay} && this.{self::ScaleConstraint::offset}.{self::Variable::stay};
+    if(out.{self::Variable::stay})
+      this.{self::ScaleConstraint::execute}();
+  }
+}
+class EqualityConstraint extends self::BinaryConstraint {
+  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::EqualityConstraint
+    : super self::BinaryConstraint::•(v1, v2, strength)
+    ;
+  method execute() → void {
+    this.{self::BinaryConstraint::output}().{self::Variable::value} = this.{self::BinaryConstraint::input}().{self::Variable::value};
+  }
+}
+class Variable extends core::Object {
+  field core::List<self::Constraint> constraints = <self::Constraint>[];
+  field self::Constraint determinedBy = null;
+  field core::int mark = 0;
+  field self::Strength walkStrength = self::WEAKEST;
+  field core::bool stay = true;
+  field core::int value;
+  final field core::String name;
+  constructor •(core::String name, core::int value) → self::Variable
+    : self::Variable::name = name, self::Variable::value = value, super core::Object::•()
+    ;
+  method addConstraint(self::Constraint c) → void {
+    this.{self::Variable::constraints}.{core::List::add}(c);
+  }
+  method removeConstraint(self::Constraint c) → void {
+    this.{self::Variable::constraints}.{core::List::remove}(c);
+    if(this.{self::Variable::determinedBy}.{core::Object::==}(c))
+      this.{self::Variable::determinedBy} = null;
+  }
+}
+class Planner extends core::Object {
+  field core::int currentMark = 0;
+  synthetic constructor •() → self::Planner
+    : super core::Object::•()
+    ;
+  method incrementalAdd(self::Constraint c) → void {
+    core::int mark = this.{self::Planner::newMark}();
+    for (self::Constraint overridden = c.{self::Constraint::satisfy}(mark); !overridden.{core::Object::==}(null); overridden = overridden.{self::Constraint::satisfy}(mark))
+      ;
+  }
+  method incrementalRemove(self::Constraint c) → void {
+    self::Variable out = c.{self::Constraint::output}();
+    c.{self::Constraint::markUnsatisfied}();
+    c.{self::Constraint::removeFromGraph}();
+    core::List<self::Constraint> unsatisfied = this.{self::Planner::removePropagateFrom}(out);
+    self::Strength strength = self::REQUIRED;
+    do {
+      for (core::int i = 0; i.{core::num::<}(unsatisfied.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint u = unsatisfied.{core::List::[]}(i);
+        if(u.{self::Constraint::strength}.{core::Object::==}(strength))
+          this.{self::Planner::incrementalAdd}(u);
+      }
+      strength = strength.{self::Strength::nextWeaker}();
+    }
+    while (!strength.{core::Object::==}(self::WEAKEST))
+  }
+  method newMark() → core::int
+    return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}.{core::num::+}(1);
+  method makePlan(core::List<self::Constraint> sources) → self::Plan {
+    core::int mark = this.{self::Planner::newMark}();
+    self::Plan plan = new self::Plan::•();
+    core::List<self::Constraint> todo = sources;
+    while (todo.{core::List::length}.{core::num::>}(0)) {
+      self::Constraint c = todo.{core::List::removeLast}();
+      if(!c.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark) && c.{self::Constraint::inputsKnown}(mark)) {
+        plan.{self::Plan::addConstraint}(c);
+        c.{self::Constraint::output}().{self::Variable::mark} = mark;
+        this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(), todo);
+      }
+    }
+    return plan;
+  }
+  method extractPlanFromConstraints(core::List<self::Constraint> constraints) → self::Plan {
+    core::List<self::Constraint> sources = <self::Constraint>[];
+    for (core::int i = 0; i.{core::num::<}(constraints.{core::List::length}); i = i.{core::num::+}(1)) {
+      self::Constraint c = constraints.{core::List::[]}(i);
+      if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
+        sources.{core::List::add}(c);
+    }
+    return this.{self::Planner::makePlan}(sources);
+  }
+  method addPropagate(self::Constraint c, core::int mark) → core::bool {
+    core::List<self::Constraint> todo = <self::Constraint>[c];
+    while (todo.{core::List::length}.{core::num::>}(0)) {
+      self::Constraint d = todo.{core::List::removeLast}();
+      if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
+        this.{self::Planner::incrementalRemove}(c);
+        return false;
+      }
+      d.{self::Constraint::recalculate}();
+      this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(), todo);
+    }
+    return true;
+  }
+  method removePropagateFrom(self::Variable out) → core::List<self::Constraint> {
+    out.{self::Variable::determinedBy} = null;
+    out.{self::Variable::walkStrength} = self::WEAKEST;
+    out.{self::Variable::stay} = true;
+    core::List<self::Constraint> unsatisfied = <self::Constraint>[];
+    core::List<self::Variable> todo = <self::Variable>[out];
+    while (todo.{core::List::length}.{core::num::>}(0)) {
+      self::Variable v = todo.{core::List::removeLast}();
+      for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
+        if(!c.{self::Constraint::isSatisfied}())
+          unsatisfied.{core::List::add}(c);
+      }
+      self::Constraint determining = v.{self::Variable::determinedBy};
+      for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint next = v.{self::Variable::constraints}.{core::List::[]}(i);
+        if(!next.{core::Object::==}(determining) && next.{self::Constraint::isSatisfied}()) {
+          next.{self::Constraint::recalculate}();
+          todo.{core::List::add}(next.{self::Constraint::output}());
+        }
+      }
+    }
+    return unsatisfied;
+  }
+  method addConstraintsConsumingTo(self::Variable v, core::List<self::Constraint> coll) → void {
+    self::Constraint determining = v.{self::Variable::determinedBy};
+    for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+      self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
+      if(!c.{core::Object::==}(determining) && c.{self::Constraint::isSatisfied}())
+        coll.{core::List::add}(c);
+    }
+  }
+}
+class Plan extends core::Object {
+  field core::List<self::Constraint> list = <self::Constraint>[];
+  synthetic constructor •() → self::Plan
+    : super core::Object::•()
+    ;
+  method addConstraint(self::Constraint c) → void {
+    this.{self::Plan::list}.{core::List::add}(c);
+  }
+  method size() → core::int
+    return this.{self::Plan::list}.{core::List::length};
+  method execute() → void {
+    for (core::int i = 0; i.{core::num::<}(this.{self::Plan::list}.{core::List::length}); i = i.{core::num::+}(1)) {
+      this.{self::Plan::list}.{core::List::[]}(i).{self::Constraint::execute}();
+    }
+  }
+}
+static const field self::Strength REQUIRED = const self::Strength::•(0, "required");
+static const field self::Strength STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
+static const field self::Strength PREFERRED = const self::Strength::•(2, "preferred");
+static const field self::Strength STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
+static const field self::Strength NORMAL = const self::Strength::•(4, "normal");
+static const field self::Strength WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
+static const field self::Strength WEAKEST = const self::Strength::•(6, "weakest");
+static const field core::int NONE = 1;
+static const field core::int FORWARD = 2;
+static const field core::int BACKWARD = 0;
+static field self::Planner planner;
+static method main() → dynamic {
+  new self::DeltaBlue::•().{self::DeltaBlue::run}();
+}
+static method chainTest(core::int n) → void {
+  self::planner = new self::Planner::•();
+  self::Variable prev = null;
+  self::Variable first = null;
+  self::Variable last = null;
+  for (core::int i = 0; i.{core::num::<=}(n); i = i.{core::num::+}(1)) {
+    self::Variable v = new self::Variable::•("v${i}", 0);
+    if(!prev.{core::Object::==}(null))
+      new self::EqualityConstraint::•(prev, v, self::REQUIRED);
+    if(i.{core::num::==}(0))
+      first = v;
+    if(i.{core::num::==}(n))
+      last = v;
+    prev = v;
+  }
+  new self::StayConstraint::•(last, self::STRONG_DEFAULT);
+  self::EditConstraint edit = new self::EditConstraint::•(first, self::PREFERRED);
+  self::Plan plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint>[edit]);
+  for (core::int i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
+    first.{self::Variable::value} = i;
+    plan.{self::Plan::execute}();
+    if(!last.{self::Variable::value}.{core::num::==}(i)) {
+      core::print("Chain test failed:");
+      core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}}.");
+    }
+  }
+}
+static method projectionTest(core::int n) → void {
+  self::planner = new self::Planner::•();
+  self::Variable scale = new self::Variable::•("scale", 10);
+  self::Variable offset = new self::Variable::•("offset", 1000);
+  self::Variable src = null;
+  self::Variable dst = null;
+  core::List<self::Variable> dests = <self::Variable>[];
+  for (core::int i = 0; i.{core::num::<}(n); i = i.{core::num::+}(1)) {
+    src = new self::Variable::•("src", i);
+    dst = new self::Variable::•("dst", i);
+    dests.{core::List::add}(dst);
+    new self::StayConstraint::•(src, self::NORMAL);
+    new self::ScaleConstraint::•(src, scale, offset, dst, self::REQUIRED);
+  }
+  self::change(src, 17);
+  if(!dst.{self::Variable::value}.{core::num::==}(1170))
+    core::print("Projection 1 failed");
+  self::change(dst, 1050);
+  if(!src.{self::Variable::value}.{core::num::==}(5))
+    core::print("Projection 2 failed");
+  self::change(scale, 5);
+  for (core::int i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
+    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(1000)))
+      core::print("Projection 3 failed");
+  }
+  self::change(offset, 2000);
+  for (core::int i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
+    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(2000)))
+      core::print("Projection 4 failed");
+  }
+}
+static method change(self::Variable v, core::int newValue) → void {
+  self::EditConstraint edit = new self::EditConstraint::•(v, self::PREFERRED);
+  self::Plan plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint>[edit]);
+  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    v.{self::Variable::value} = newValue;
+    plan.{self::Plan::execute}();
+  }
+  edit.{self::Constraint::destroyConstraint}();
+}
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.type_promotion.expect b/pkg/front_end/testcases/DeltaBlue.dart.type_promotion.expect
new file mode 100644
index 0000000..d99f933
--- /dev/null
+++ b/pkg/front_end/testcases/DeltaBlue.dart.type_promotion.expect
@@ -0,0 +1,57 @@
+pkg/front_end/testcases/DeltaBlue.dart:458:20: Context: Write to overridden@13138
+        overridden = overridden.satisfy(mark));
+                   ^
+pkg/front_end/testcases/DeltaBlue.dart:479:48: Context: Write to i@14064
+      for (int i = 0; i < unsatisfied.length; i++) {
+                                               ^^
+pkg/front_end/testcases/DeltaBlue.dart:483:16: Context: Write to strength@14019
+      strength = strength.nextWeaker();
+               ^
+pkg/front_end/testcases/DeltaBlue.dart:530:46: Context: Write to i@16107
+    for (int i = 0; i < constraints.length; i++) {
+                                             ^^
+pkg/front_end/testcases/DeltaBlue.dart:578:50: Context: Write to i@17907
+      for (int i = 0; i < v.constraints.length; i++) {
+                                                 ^^
+pkg/front_end/testcases/DeltaBlue.dart:583:50: Context: Write to i@17907
+      for (int i = 0; i < v.constraints.length; i++) {
+                                                 ^^
+pkg/front_end/testcases/DeltaBlue.dart:596:48: Context: Write to i@18495
+    for (int i = 0; i < v.constraints.length; i++) {
+                                               ^^
+pkg/front_end/testcases/DeltaBlue.dart:618:39: Context: Write to i@19004
+    for (int i = 0; i < list.length; i++) {
+                                      ^^
+pkg/front_end/testcases/DeltaBlue.dart:641:28: Context: Write to i@19938
+  for (int i = 0; i <= n; i++) {
+                           ^^
+pkg/front_end/testcases/DeltaBlue.dart:644:23: Context: Write to first@19856
+    if (i == 0) first = v;
+                      ^
+pkg/front_end/testcases/DeltaBlue.dart:645:22: Context: Write to last@19870
+    if (i == n) last = v;
+                     ^
+pkg/front_end/testcases/DeltaBlue.dart:646:10: Context: Write to prev@19843
+    prev = v;
+         ^
+pkg/front_end/testcases/DeltaBlue.dart:651:29: Context: Write to i@19938
+  for (int i = 0; i < 100; i++) {
+                            ^^
+pkg/front_end/testcases/DeltaBlue.dart:674:27: Context: Write to i@21029
+  for (int i = 0; i < n; i++) {
+                          ^^
+pkg/front_end/testcases/DeltaBlue.dart:675:9: Context: Write to src@20954
+    src = new Variable("src", i);
+        ^
+pkg/front_end/testcases/DeltaBlue.dart:676:9: Context: Write to dst@20966
+    dst = new Variable("dst", i);
+        ^
+pkg/front_end/testcases/DeltaBlue.dart:686:31: Context: Write to i@21029
+  for (int i = 0; i < n - 1; i++) {
+                              ^^
+pkg/front_end/testcases/DeltaBlue.dart:690:31: Context: Write to i@21029
+  for (int i = 0; i < n - 1; i++) {
+                              ^^
+pkg/front_end/testcases/DeltaBlue.dart:698:28: Context: Write to i@21836
+  for (int i = 0; i < 10; i++) {
+                           ^^
diff --git a/pkg/front_end/testcases/README.md b/pkg/front_end/testcases/README.md
index a7d4fb1..143a0df 100644
--- a/pkg/front_end/testcases/README.md
+++ b/pkg/front_end/testcases/README.md
@@ -13,8 +13,8 @@
 
 ## Dart 1.0 Compilation
 
-* Status file: [compile.status](compile.status)
-* Standalone test: [pkg/front_end/test/fasta/compile_test.dart](../test/fasta/compile_test.dart)
+* Status file: [legacy.status](legacy.status)
+* Standalone test: [pkg/front_end/test/fasta/legacy_test.dart](../test/fasta/legacy_test.dart)
 * Expectation prefix: `.direct.expect`
 * How to update expectations:
 
diff --git a/pkg/front_end/testcases/abstract_members.dart b/pkg/front_end/testcases/abstract_members.dart
new file mode 100644
index 0000000..058cbe9
--- /dev/null
+++ b/pkg/front_end/testcases/abstract_members.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Interface1 {
+  void interfaceMethod1() {}
+}
+
+class Interface2 {
+  void interfaceMethod2() {}
+
+  var interfaceMethod1;
+}
+
+class Interface3 {
+  void interfaceMethod3() {}
+}
+
+abstract class A implements Interface1, Interface2, Interface3 {
+  aMethod() {}
+  abstractMethod();
+  void set property1(_);
+  void set property2(_);
+  void set property3(_);
+}
+
+abstract class B extends A {
+  final property1 = null;
+  aMethod() {}
+  bMethod() {}
+}
+
+class MyClass extends B {
+  var property2;
+  aaMethod() {}
+  aMethod() {}
+  bMethod() {}
+  cMethod() {}
+}
+
+// This class should have no errors, as it has a non-trivial noSuchMethod.
+class MyMock1 extends B {
+  noSuchMethod(_) => null;
+}
+
+// This class should have no errors, as the abstract method doesn't override
+// the non-trivial noSuchMethod inherited from MyMock1.
+class MyMock2 extends MyMock1 {
+  noSuchMethod(_);
+}
+
+// This class should have an error, the abstract method isn't considered
+// non-trivial.
+class MyMock3 extends B {
+  noSuchMethod(_);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/abstract_members.dart.legacy.expect b/pkg/front_end/testcases/abstract_members.dart.legacy.expect
new file mode 100644
index 0000000..0c85dd2
--- /dev/null
+++ b/pkg/front_end/testcases/abstract_members.dart.legacy.expect
@@ -0,0 +1,238 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
+// abstract class A implements Interface1, Interface2, Interface3 {
+//                ^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class MyClass extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property2=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class MyMock3 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
+//   void set property2(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
+// abstract class A implements Interface1, Interface2, Interface3 {
+//                ^
+//
+// pkg/front_end/testcases/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class MyClass extends B {
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property2=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class MyMock3 extends B {
+//       ^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  method interfaceMethod1() → void {}
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1 = null;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  method interfaceMethod2() → void {}
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3
+    : super core::Object::•()
+    ;
+  method interfaceMethod3() → void {}
+}
+abstract class A extends core::Object implements self::Interface1, self::Interface2, self::Interface3 {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method aMethod() → dynamic {}
+  abstract method abstractMethod() → dynamic;
+  abstract set property1(dynamic _) → void;
+  abstract set property2(dynamic _) → void;
+  abstract set property3(dynamic _) → void;
+}
+abstract class B extends self::A {
+  final field dynamic property1 = null;
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+}
+class MyClass extends self::B {
+  field dynamic property2 = null;
+  synthetic constructor •() → self::MyClass
+    : super self::B::•()
+    ;
+  method aaMethod() → dynamic {}
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+  method cMethod() → dynamic {}
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class MyMock1 extends self::B {
+  synthetic constructor •() → self::MyMock1
+    : super self::B::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return null;
+  no-such-method-forwarder method interfaceMethod2() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod2, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class MyMock2 extends self::MyMock1 {
+  synthetic constructor •() → self::MyMock2
+    : super self::MyMock1::•()
+    ;
+  abstract method noSuchMethod(dynamic _) → dynamic;
+}
+class MyMock3 extends self::B {
+  synthetic constructor •() → self::MyMock3
+    : super self::B::•()
+    ;
+  abstract method noSuchMethod(dynamic _) → dynamic;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_members.dart.legacy.transformed.expect b/pkg/front_end/testcases/abstract_members.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7e489f3
--- /dev/null
+++ b/pkg/front_end/testcases/abstract_members.dart.legacy.transformed.expect
@@ -0,0 +1,146 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
+// abstract class A implements Interface1, Interface2, Interface3 {
+//                ^
+//
+// pkg/front_end/testcases/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class MyClass extends B {
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property2=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class MyMock3 extends B {
+//       ^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  method interfaceMethod1() → void {}
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1 = null;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  method interfaceMethod2() → void {}
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3
+    : super core::Object::•()
+    ;
+  method interfaceMethod3() → void {}
+}
+abstract class A extends core::Object implements self::Interface1, self::Interface2, self::Interface3 {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method aMethod() → dynamic {}
+  abstract method abstractMethod() → dynamic;
+  abstract set property1(dynamic _) → void;
+  abstract set property2(dynamic _) → void;
+  abstract set property3(dynamic _) → void;
+}
+abstract class B extends self::A {
+  final field dynamic property1 = null;
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+}
+class MyClass extends self::B {
+  field dynamic property2 = null;
+  synthetic constructor •() → self::MyClass
+    : super self::B::•()
+    ;
+  method aaMethod() → dynamic {}
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+  method cMethod() → dynamic {}
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class MyMock1 extends self::B {
+  synthetic constructor •() → self::MyMock1
+    : super self::B::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return null;
+  no-such-method-forwarder method interfaceMethod2() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod2, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class MyMock2 extends self::MyMock1 {
+  synthetic constructor •() → self::MyMock2
+    : super self::MyMock1::•()
+    ;
+  abstract method noSuchMethod(dynamic _) → dynamic;
+}
+class MyMock3 extends self::B {
+  synthetic constructor •() → self::MyMock3
+    : super self::B::•()
+    ;
+  abstract method noSuchMethod(dynamic _) → dynamic;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_members.dart.outline.expect b/pkg/front_end/testcases/abstract_members.dart.outline.expect
new file mode 100644
index 0000000..e2bf105
--- /dev/null
+++ b/pkg/front_end/testcases/abstract_members.dart.outline.expect
@@ -0,0 +1,199 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
+// abstract class A implements Interface1, Interface2, Interface3 {
+//                ^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class MyClass extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
+//  - A.abstractMethod
+//  - A.property1=
+//  - A.property2=
+//  - A.property3=
+//  - Interface1.interfaceMethod1
+//  - Interface2.interfaceMethod1
+//  - Interface2.interfaceMethod2
+//  - Interface3.interfaceMethod3
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class MyMock3 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
+//   void set property2(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    ;
+  method interfaceMethod1() → void
+    ;
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1;
+  synthetic constructor •() → self::Interface2
+    ;
+  method interfaceMethod2() → void
+    ;
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3
+    ;
+  method interfaceMethod3() → void
+    ;
+}
+abstract class A extends core::Object implements self::Interface1, self::Interface2, self::Interface3 {
+  synthetic constructor •() → self::A
+    ;
+  method aMethod() → dynamic
+    ;
+  abstract method abstractMethod() → dynamic;
+  abstract set property1(dynamic _) → void;
+  abstract set property2(dynamic _) → void;
+  abstract set property3(dynamic _) → void;
+}
+abstract class B extends self::A {
+  final field dynamic property1;
+  synthetic constructor •() → self::B
+    ;
+  method aMethod() → dynamic
+    ;
+  method bMethod() → dynamic
+    ;
+}
+class MyClass extends self::B {
+  field dynamic property2;
+  synthetic constructor •() → self::MyClass
+    ;
+  method aaMethod() → dynamic
+    ;
+  method aMethod() → dynamic
+    ;
+  method bMethod() → dynamic
+    ;
+  method cMethod() → dynamic
+    ;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class MyMock1 extends self::B {
+  synthetic constructor •() → self::MyMock1
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    ;
+  no-such-method-forwarder method interfaceMethod2() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod2, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class MyMock2 extends self::MyMock1 {
+  synthetic constructor •() → self::MyMock2
+    ;
+  abstract method noSuchMethod(dynamic _) → dynamic;
+}
+class MyMock3 extends self::B {
+  synthetic constructor •() → self::MyMock3
+    ;
+  abstract method noSuchMethod(dynamic _) → dynamic;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/abstract_members.dart.strong.expect b/pkg/front_end/testcases/abstract_members.dart.strong.expect
new file mode 100644
index 0000000..c568386
--- /dev/null
+++ b/pkg/front_end/testcases/abstract_members.dart.strong.expect
@@ -0,0 +1,248 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
+// abstract class A implements Interface1, Interface2, Interface3 {
+//                ^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^
+//
+// pkg/front_end/testcases/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
+//  - 'interfaceMethod2'
+//  - 'abstractMethod'
+//  - 'interfaceMethod1'
+//  - 'interfaceMethod1'
+//  - 'interfaceMethod3'
+//  - 'property3='
+//  - 'interfaceMethod1='
+//  - 'property1='
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class MyClass extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:21:3: Context: 'abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'interfaceMethod1=' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+//
+// pkg/front_end/testcases/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
+//  - 'interfaceMethod2'
+//  - 'abstractMethod'
+//  - 'interfaceMethod1'
+//  - 'interfaceMethod1'
+//  - 'interfaceMethod3'
+//  - 'property3='
+//  - 'interfaceMethod1='
+//  - 'property1='
+//  - 'property2='
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class MyMock3 extends B {
+//       ^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:21:3: Context: 'abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'interfaceMethod1=' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/abstract_members.dart:23:12: Context: 'property2=' is defined here.
+//   void set property2(_);
+//            ^^^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
+// abstract class A implements Interface1, Interface2, Interface3 {
+//                ^
+//
+// pkg/front_end/testcases/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
+//  - 'interfaceMethod2'
+//  - 'abstractMethod'
+//  - 'interfaceMethod1'
+//  - 'interfaceMethod1'
+//  - 'interfaceMethod3'
+//  - 'property3='
+//  - 'interfaceMethod1='
+//  - 'property1='
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class MyClass extends B {
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
+//  - 'interfaceMethod2'
+//  - 'abstractMethod'
+//  - 'interfaceMethod1'
+//  - 'interfaceMethod1'
+//  - 'interfaceMethod3'
+//  - 'property3='
+//  - 'interfaceMethod1='
+//  - 'property1='
+//  - 'property2='
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class MyMock3 extends B {
+//       ^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Interface1 extends core::Object {
+  synthetic constructor •() → self::Interface1
+    : super core::Object::•()
+    ;
+  method interfaceMethod1() → void {}
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1 = null;
+  synthetic constructor •() → self::Interface2
+    : super core::Object::•()
+    ;
+  method interfaceMethod2() → void {}
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3
+    : super core::Object::•()
+    ;
+  method interfaceMethod3() → void {}
+}
+abstract class A extends core::Object implements self::Interface1, self::Interface2, self::Interface3 {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method aMethod() → dynamic {}
+  abstract method abstractMethod() → dynamic;
+  abstract set property1(dynamic _) → void;
+  abstract set property2(dynamic _) → void;
+  abstract set property3(dynamic _) → void;
+}
+abstract class B extends self::A {
+  final field dynamic property1 = null;
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+}
+class MyClass extends self::B {
+  field dynamic property2 = null;
+  synthetic constructor •() → self::MyClass
+    : super self::B::•()
+    ;
+  method aaMethod() → dynamic {}
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+  method cMethod() → dynamic {}
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class MyMock1 extends self::B {
+  synthetic constructor •() → self::MyMock1
+    : super self::B::•()
+    ;
+  method noSuchMethod(core::Invocation _) → dynamic
+    return null;
+  no-such-method-forwarder method interfaceMethod2() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod2, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class MyMock2 extends self::MyMock1 {
+  synthetic constructor •() → self::MyMock2
+    : super self::MyMock1::•()
+    ;
+  abstract method noSuchMethod(core::Invocation _) → dynamic;
+}
+class MyMock3 extends self::B {
+  synthetic constructor •() → self::MyMock3
+    : super self::B::•()
+    ;
+  abstract method noSuchMethod(core::Invocation _) → dynamic;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_members.dart.strong.transformed.expect b/pkg/front_end/testcases/abstract_members.dart.strong.transformed.expect
new file mode 100644
index 0000000..a76d03a
--- /dev/null
+++ b/pkg/front_end/testcases/abstract_members.dart.strong.transformed.expect
@@ -0,0 +1,52 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/abstract_members.dart:19:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
+//  - 'abstractMethod'
+//  - 'property3='
+//  - 'property1='
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class MyClass extends B {
+//       ^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method aMethod() → dynamic {}
+  abstract method abstractMethod() → dynamic;
+  abstract set property1(dynamic _) → void;
+  abstract set property2(dynamic _) → void;
+  abstract set property3(dynamic _) → void;
+}
+abstract class B extends self::A {
+  final field dynamic property1 = null;
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+}
+class MyClass extends self::B {
+  field dynamic property2 = null;
+  synthetic constructor •() → self::MyClass
+    : super self::B::•()
+    ;
+  method aaMethod() → dynamic {}
+  method aMethod() → dynamic {}
+  method bMethod() → dynamic {}
+  method cMethod() → dynamic {}
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/accessors.dart.direct.expect b/pkg/front_end/testcases/accessors.dart.direct.expect
deleted file mode 100644
index a9452ce..0000000
--- a/pkg/front_end/testcases/accessors.dart.direct.expect
+++ /dev/null
@@ -1,65 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
-//       print(onlySetter);
-//             ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
-//     print(onlySetter);
-//           ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:40:11: Warning: Getter not found: 'onlySetter'.
-//     print(onlySetter);
-//           ^^^^^^^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  set onlySetter(dynamic value) → void {
-    core::print("C.onlySetter called with ${value}.");
-  }
-  method testC() → dynamic {
-    try {
-      core::print(this.onlySetter);
-      throw "No error thrown";
-    }
-    on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-      core::print("Expected error: ${e}");
-    }
-    this.{self::C::onlySetter} = "hest";
-  }
-  method testD() → dynamic {
-    core::print(this.onlySetter);
-    this.{self::C::onlySetter} = "hest";
-  }
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  get onlySetter() → core::String
-    return "D.onlySetter called.";
-  set onlySetter(dynamic value) → void {
-    core::print("D.onlySetter called with ${value}.");
-  }
-}
-static set onlySetter(dynamic value) → void {
-  core::print("onlySetter called with ${value}.");
-}
-static method main() → dynamic {
-  try {
-    core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw "No error thrown";
-  }
-  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-    core::print("Expected error: ${e}");
-  }
-  self::onlySetter = "fisk";
-  new self::C::•().testC();
-  new self::D::•().testD();
-}
diff --git a/pkg/front_end/testcases/accessors.dart.direct.transformed.expect b/pkg/front_end/testcases/accessors.dart.direct.transformed.expect
deleted file mode 100644
index 762a85e..0000000
--- a/pkg/front_end/testcases/accessors.dart.direct.transformed.expect
+++ /dev/null
@@ -1,51 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  set onlySetter(dynamic value) → void {
-    core::print("C.onlySetter called with ${value}.");
-  }
-  method testC() → dynamic {
-    try {
-      core::print(this.onlySetter);
-      throw "No error thrown";
-    }
-    on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-      core::print("Expected error: ${e}");
-    }
-    this.{self::C::onlySetter} = "hest";
-  }
-  method testD() → dynamic {
-    core::print(this.onlySetter);
-    this.{self::C::onlySetter} = "hest";
-  }
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  get onlySetter() → core::String
-    return "D.onlySetter called.";
-  set onlySetter(dynamic value) → void {
-    core::print("D.onlySetter called with ${value}.");
-  }
-}
-static set onlySetter(dynamic value) → void {
-  core::print("onlySetter called with ${value}.");
-}
-static method main() → dynamic {
-  try {
-    core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw "No error thrown";
-  }
-  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-    core::print("Expected error: ${e}");
-  }
-  self::onlySetter = "fisk";
-  new self::C::•().testC();
-  new self::D::•().testD();
-}
diff --git a/pkg/front_end/testcases/accessors.dart.legacy.expect b/pkg/front_end/testcases/accessors.dart.legacy.expect
new file mode 100644
index 0000000..9d3bdd4
--- /dev/null
+++ b/pkg/front_end/testcases/accessors.dart.legacy.expect
@@ -0,0 +1,65 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:40:11: Warning: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  set onlySetter(dynamic value) → void {
+    core::print("C.onlySetter called with ${value}.");
+  }
+  method testC() → dynamic {
+    try {
+      core::print(this.onlySetter);
+      throw "No error thrown";
+    }
+    on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+      core::print("Expected error: ${e}");
+    }
+    this.{self::C::onlySetter} = "hest";
+  }
+  method testD() → dynamic {
+    core::print(this.onlySetter);
+    this.{self::C::onlySetter} = "hest";
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  get onlySetter() → core::String
+    return "D.onlySetter called.";
+  set onlySetter(dynamic value) → void {
+    core::print("D.onlySetter called with ${value}.");
+  }
+}
+static set onlySetter(dynamic value) → void {
+  core::print("onlySetter called with ${value}.");
+}
+static method main() → dynamic {
+  try {
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw "No error thrown";
+  }
+  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+    core::print("Expected error: ${e}");
+  }
+  self::onlySetter = "fisk";
+  new self::C::•().testC();
+  new self::D::•().testD();
+}
diff --git a/pkg/front_end/testcases/accessors.dart.legacy.transformed.expect b/pkg/front_end/testcases/accessors.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c6c025f
--- /dev/null
+++ b/pkg/front_end/testcases/accessors.dart.legacy.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  set onlySetter(dynamic value) → void {
+    core::print("C.onlySetter called with ${value}.");
+  }
+  method testC() → dynamic {
+    try {
+      core::print(this.onlySetter);
+      throw "No error thrown";
+    }
+    on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+      core::print("Expected error: ${e}");
+    }
+    this.{self::C::onlySetter} = "hest";
+  }
+  method testD() → dynamic {
+    core::print(this.onlySetter);
+    this.{self::C::onlySetter} = "hest";
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  get onlySetter() → core::String
+    return "D.onlySetter called.";
+  set onlySetter(dynamic value) → void {
+    core::print("D.onlySetter called with ${value}.");
+  }
+}
+static set onlySetter(dynamic value) → void {
+  core::print("onlySetter called with ${value}.");
+}
+static method main() → dynamic {
+  try {
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw "No error thrown";
+  }
+  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+    core::print("Expected error: ${e}");
+  }
+  self::onlySetter = "fisk";
+  new self::C::•().testC();
+  new self::D::•().testD();
+}
diff --git a/pkg/front_end/testcases/accessors.dart.strong.expect b/pkg/front_end/testcases/accessors.dart.strong.expect
new file mode 100644
index 0000000..866b083
--- /dev/null
+++ b/pkg/front_end/testcases/accessors.dart.strong.expect
@@ -0,0 +1,97 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/accessors.dart:16:13: Error: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:25:11: Error: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:40:11: Error: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/accessors.dart:16:13: Error: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:25:11: Error: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  set onlySetter(dynamic value) → void {
+    core::print("C.onlySetter called with ${value}.");
+  }
+  method testC() → dynamic {
+    try {
+      core::print(let final dynamic #t1 = this in invalid-expression "pkg/front_end/testcases/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+      print(onlySetter);
+            ^^^^^^^^^^");
+      throw "No error thrown";
+    }
+    on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+      core::print("Expected error: ${e}");
+    }
+    this.{self::C::onlySetter} = "hest";
+  }
+  method testD() → dynamic {
+    core::print(let final dynamic #t2 = this in invalid-expression "pkg/front_end/testcases/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+    print(onlySetter);
+          ^^^^^^^^^^");
+    this.{self::C::onlySetter} = "hest";
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  get onlySetter() → core::String
+    return "D.onlySetter called.";
+  set onlySetter(dynamic value) → void {
+    core::print("D.onlySetter called with ${value}.");
+  }
+}
+static set onlySetter(dynamic value) → void {
+  core::print("onlySetter called with ${value}.");
+}
+static method main() → dynamic {
+  try {
+    core::print(invalid-expression "pkg/front_end/testcases/accessors.dart:40:11: Error: Getter not found: 'onlySetter'.
+    print(onlySetter);
+          ^^^^^^^^^^");
+    throw "No error thrown";
+  }
+  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+    core::print("Expected error: ${e}");
+  }
+  self::onlySetter = "fisk";
+  new self::C::•().{self::C::testC}();
+  new self::D::•().{self::C::testD}();
+}
diff --git a/pkg/front_end/testcases/accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/accessors.dart.strong.transformed.expect
new file mode 100644
index 0000000..69ee9a5
--- /dev/null
+++ b/pkg/front_end/testcases/accessors.dart.strong.transformed.expect
@@ -0,0 +1,71 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/accessors.dart:16:13: Error: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/accessors.dart:25:11: Error: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  set onlySetter(dynamic value) → void {
+    core::print("C.onlySetter called with ${value}.");
+  }
+  method testC() → dynamic {
+    try {
+      core::print(let final self::C #t1 = this in invalid-expression "pkg/front_end/testcases/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+      print(onlySetter);
+            ^^^^^^^^^^");
+      throw "No error thrown";
+    }
+    on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+      core::print("Expected error: ${e}");
+    }
+    this.{self::C::onlySetter} = "hest";
+  }
+  method testD() → dynamic {
+    core::print(let final self::C #t2 = this in invalid-expression "pkg/front_end/testcases/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
+    print(onlySetter);
+          ^^^^^^^^^^");
+    this.{self::C::onlySetter} = "hest";
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  get onlySetter() → core::String
+    return "D.onlySetter called.";
+  set onlySetter(dynamic value) → void {
+    core::print("D.onlySetter called with ${value}.");
+  }
+}
+static set onlySetter(dynamic value) → void {
+  core::print("onlySetter called with ${value}.");
+}
+static method main() → dynamic {
+  try {
+    core::print(invalid-expression "pkg/front_end/testcases/accessors.dart:40:11: Error: Getter not found: 'onlySetter'.
+    print(onlySetter);
+          ^^^^^^^^^^");
+    throw "No error thrown";
+  }
+  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+    core::print("Expected error: ${e}");
+  }
+  self::onlySetter = "fisk";
+  new self::C::•().{self::C::testC}();
+  new self::D::•().{self::C::testD}();
+}
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.direct.expect b/pkg/front_end/testcases/ambiguous_exports.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/ambiguous_exports.dart.direct.expect
rename to pkg/front_end/testcases/ambiguous_exports.dart.legacy.expect
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.direct.transformed.expect b/pkg/front_end/testcases/ambiguous_exports.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/ambiguous_exports.dart.direct.transformed.expect
rename to pkg/front_end/testcases/ambiguous_exports.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/annotation_eof.dart.direct.expect b/pkg/front_end/testcases/annotation_eof.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_eof.dart.direct.expect
rename to pkg/front_end/testcases/annotation_eof.dart.legacy.expect
diff --git a/pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_eof.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_eof.dart.direct.transformed.expect
rename to pkg/front_end/testcases/annotation_eof.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_on_enum_values.dart.direct.expect
rename to pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.expect
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_on_enum_values.dart.direct.transformed.expect
rename to pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/annotation_top.dart.direct.expect b/pkg/front_end/testcases/annotation_top.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_top.dart.direct.expect
rename to pkg/front_end/testcases/annotation_top.dart.legacy.expect
diff --git a/pkg/front_end/testcases/annotation_top.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_top.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_top.dart.direct.transformed.expect
rename to pkg/front_end/testcases/annotation_top.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart.direct.expect b/pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_typedef_formals.dart.direct.expect
rename to pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_typedef_formals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.direct.expect b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.direct.expect
rename to pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_variable_declaration.dart.direct.expect
rename to pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.expect
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.direct.transformed.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_variable_declaration.dart.direct.transformed.expect
rename to pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/argument.dart.direct.expect b/pkg/front_end/testcases/argument.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/argument.dart.direct.expect
rename to pkg/front_end/testcases/argument.dart.legacy.expect
diff --git a/pkg/front_end/testcases/argument.dart.direct.transformed.expect b/pkg/front_end/testcases/argument.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/argument.dart.direct.transformed.expect
rename to pkg/front_end/testcases/argument.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.direct.expect b/pkg/front_end/testcases/argument_mismatch.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/argument_mismatch.dart.direct.expect
rename to pkg/front_end/testcases/argument_mismatch.dart.legacy.expect
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.direct.transformed.expect b/pkg/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/argument_mismatch.dart.direct.transformed.expect
rename to pkg/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/arithmetic.dart.direct.expect b/pkg/front_end/testcases/arithmetic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/arithmetic.dart.direct.expect
rename to pkg/front_end/testcases/arithmetic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/arithmetic.dart.direct.transformed.expect b/pkg/front_end/testcases/arithmetic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/arithmetic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/arithmetic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/arithmetic.dart.type_promotion.expect b/pkg/front_end/testcases/arithmetic.dart.type_promotion.expect
new file mode 100644
index 0000000..8a5a7db
--- /dev/null
+++ b/pkg/front_end/testcases/arithmetic.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/arithmetic.dart:11:35: Context: Write to i@330
+  for (int i = 0; i < xs.length; i++) {}
+                                  ^^
diff --git a/pkg/front_end/testcases/arrow_function.dart.direct.expect b/pkg/front_end/testcases/arrow_function.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/arrow_function.dart.direct.expect
rename to pkg/front_end/testcases/arrow_function.dart.legacy.expect
diff --git a/pkg/front_end/testcases/arrow_function.dart.direct.transformed.expect b/pkg/front_end/testcases/arrow_function.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/arrow_function.dart.direct.transformed.expect
rename to pkg/front_end/testcases/arrow_function.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
deleted file mode 100644
index d09ecec..0000000
--- a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
+++ /dev/null
@@ -1,203 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static field core::List<core::String> stringList = <dynamic>["bar"];
-static method asyncString() → asy::Future<core::String> /* originally async */ {
-  final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = "foo";
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method asyncString2() → asy::Future<core::String> /* originally async */ {
-  final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = self::asyncString();
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_current} = "foo";
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::syncStarString2();
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::stringList;
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<core::String>(:sync_op);
-}
-static method syncStarString2() → core::Iterable<core::String> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_current} = "foo";
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<core::String>(:sync_op);
-}
-static method asyncStarString() → asy::Stream<core::String> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::String> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L3:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::add}("foo"))
-            return null;
-          else
-            [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::asyncStarString2()))
-            return null;
-          else
-            [yield] null;
-          [yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
-          if(:controller.{asy::_AsyncStarStreamController::add}(:result))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method asyncStarString2() → asy::Stream<core::String> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::String> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L4:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::add}("bar"))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L5:
-      {
-        [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String str = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/async_function.dart.direct.expect b/pkg/front_end/testcases/async_function.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/async_function.dart.direct.expect
rename to pkg/front_end/testcases/async_function.dart.legacy.expect
diff --git a/pkg/front_end/testcases/async_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/async_function.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c4a5b51
--- /dev/null
+++ b/pkg/front_end/testcases/async_function.dart.legacy.transformed.expect
@@ -0,0 +1,203 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static field core::List<core::String> stringList = <dynamic>["bar"];
+static method asyncString() → asy::Future<core::String> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+  asy::FutureOr<core::String> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = "foo";
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method asyncString2() → asy::Future<core::String> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+  asy::FutureOr<core::String> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = self::asyncString();
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = "foo";
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::syncStarString2();
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::stringList;
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::String>(:sync_op);
+}
+static method syncStarString2() → core::Iterable<core::String> /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = "foo";
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::String>(:sync_op);
+}
+static method asyncStarString() → asy::Stream<core::String> /* originally async* */ {
+  asy::_AsyncStarStreamController<core::String> :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L3:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}("foo"))
+            return null;
+          else
+            [yield] null;
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::asyncStarString2()))
+            return null;
+          else
+            [yield] null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
+          if(:controller.{asy::_AsyncStarStreamController::add}(:result))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method asyncStarString2() → asy::Stream<core::String> /* originally async* */ {
+  asy::_AsyncStarStreamController<core::String> :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L4:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}("bar"))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L5:
+      {
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
+        core::String str = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/async_function.dart.strong.expect b/pkg/front_end/testcases/async_function.dart.strong.expect
index d498bf6..4cbc5e0 100644
--- a/pkg/front_end/testcases/async_function.dart.strong.expect
+++ b/pkg/front_end/testcases/async_function.dart.strong.expect
@@ -3,9 +3,29 @@
 import "dart:async" as asy;
 import "dart:core" as core;
 
+static field core::List<core::String> stringList = <core::String>["bar"];
 static method asyncString() → asy::Future<core::String> async {
   return "foo";
 }
+static method asyncString2() → asy::Future<core::String> async {
+  return self::asyncString();
+}
+static method syncStarString() → core::Iterable<core::String> sync* {
+  yield "foo";
+  yield* self::syncStarString2();
+  yield* self::stringList;
+}
+static method syncStarString2() → core::Iterable<core::String> sync* {
+  yield "foo";
+}
+static method asyncStarString() → asy::Stream<core::String> async* {
+  yield "foo";
+  yield* self::asyncStarString2();
+  yield await self::asyncString();
+}
+static method asyncStarString2() → asy::Stream<core::String> async* {
+  yield "bar";
+}
 static method main() → dynamic async {
   core::String str = await self::asyncString();
 }
diff --git a/pkg/front_end/testcases/async_function.dart.strong.transformed.expect b/pkg/front_end/testcases/async_function.dart.strong.transformed.expect
new file mode 100644
index 0000000..a57a753
--- /dev/null
+++ b/pkg/front_end/testcases/async_function.dart.strong.transformed.expect
@@ -0,0 +1,203 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static field core::List<core::String> stringList = <core::String>["bar"];
+static method asyncString() → asy::Future<core::String> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+  asy::FutureOr<core::String> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = "foo";
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method asyncString2() → asy::Future<core::String> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+  asy::FutureOr<core::String> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = self::asyncString();
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = "foo";
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::syncStarString2();
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::stringList;
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::String>(:sync_op);
+}
+static method syncStarString2() → core::Iterable<core::String> /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = "foo";
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::String>(:sync_op);
+}
+static method asyncStarString() → asy::Stream<core::String> /* originally async* */ {
+  asy::_AsyncStarStreamController<core::String> :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L3:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}("foo"))
+            return null;
+          else
+            [yield] null;
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::asyncStarString2()))
+            return null;
+          else
+            [yield] null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
+          if(:controller.{asy::_AsyncStarStreamController::add}(:result))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method asyncStarString2() → asy::Stream<core::String> /* originally async* */ {
+  asy::_AsyncStarStreamController<core::String> :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L4:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}("bar"))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L5:
+      {
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
+        core::String str = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect b/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
deleted file mode 100644
index 0dc1f7d..0000000
--- a/pkg/front_end/testcases/async_nested.dart.direct.transformed.expect
+++ /dev/null
@@ -1,64 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class Node extends core::Object {
-  final field core::List<self::Node> nested;
-  final field core::String name;
-  constructor •(core::String name, [core::List<self::Node> nested = null]) → self::Node
-    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
-  method toString() → core::String
-    return "<${this.{self::Node::name}}:[${let final dynamic #t1 = this.{self::Node::nested} in #t1.==(null) ? null : #t1.join(", ")}]>";
-  method toSimpleString() → dynamic {
-    dynamic tmp = let final dynamic #t2 = this.{self::Node::nested} in #t2.==(null) ? null : #t2.map((dynamic child) → dynamic => child.toSimpleString());
-    return "${this.{self::Node::name}} ${let final dynamic #t3 = tmp in #t3.==(null) ? null : #t3.join(" ")}".trim();
-  }
-}
-static method main() → void /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :async_temporary_0;
-  dynamic :async_temporary_1;
-  dynamic :async_temporary_2;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        core::String expected = "1 2 3 4 5 6 7 8 9 10";
-        :async_temporary_2 = new self::Node::•("2", <dynamic>[]);
-        [yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("7", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("6", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_1 = :result;
-        [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("8", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = :result;
-        [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("9", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("4", <dynamic>[new self::Node::•("5", <dynamic>[:async_temporary_1, :async_temporary_0, :result])])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = :result;
-        [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        self::Node node = new self::Node::•("1", <dynamic>[:async_temporary_2, :async_temporary_0, :result]);
-        core::String actual = node.toSimpleString();
-        core::print(actual);
-        if(!actual.==(expected)) {
-          throw "Expected '${expected}' but got '${actual}'";
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/async_nested.dart.direct.expect b/pkg/front_end/testcases/async_nested.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/async_nested.dart.direct.expect
rename to pkg/front_end/testcases/async_nested.dart.legacy.expect
diff --git a/pkg/front_end/testcases/async_nested.dart.legacy.transformed.expect b/pkg/front_end/testcases/async_nested.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ad071a1
--- /dev/null
+++ b/pkg/front_end/testcases/async_nested.dart.legacy.transformed.expect
@@ -0,0 +1,64 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class Node extends core::Object {
+  final field core::List<self::Node> nested;
+  final field core::String name;
+  constructor •(core::String name, [core::List<self::Node> nested = null]) → self::Node
+    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
+  method toString() → core::String
+    return "<${this.{self::Node::name}}:[${let final dynamic #t1 = this.{self::Node::nested} in #t1.==(null) ? null : #t1.join(", ")}]>";
+  method toSimpleString() → dynamic {
+    dynamic tmp = let final dynamic #t2 = this.{self::Node::nested} in #t2.==(null) ? null : #t2.map((dynamic child) → dynamic => child.toSimpleString());
+    return "${this.{self::Node::name}} ${let final dynamic #t3 = tmp in #t3.==(null) ? null : #t3.join(" ")}".trim();
+  }
+}
+static method main() → void /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::String expected = "1 2 3 4 5 6 7 8 9 10";
+        :async_temporary_2 = new self::Node::•("2", <dynamic>[]);
+        [yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("7", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("6", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_1 = :result;
+        [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("8", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("9", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("4", <dynamic>[new self::Node::•("5", <dynamic>[:async_temporary_1, :async_temporary_0, :result])])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        self::Node node = new self::Node::•("1", <dynamic>[:async_temporary_2, :async_temporary_0, :result]);
+        core::String actual = node.toSimpleString();
+        core::print(actual);
+        if(!actual.==(expected)) {
+          throw "Expected '${expected}' but got '${actual}'";
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect b/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
index f173dfc7..b5b0c4b 100644
--- a/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
   }
 }
 static method main() → void /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -59,6 +59,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/await.dart.direct.transformed.expect b/pkg/front_end/testcases/await.dart.direct.transformed.expect
deleted file mode 100644
index 7693f8c..0000000
--- a/pkg/front_end/testcases/await.dart.direct.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
-        core::print(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/await.dart.direct.expect b/pkg/front_end/testcases/await.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/await.dart.direct.expect
rename to pkg/front_end/testcases/await.dart.legacy.expect
diff --git a/pkg/front_end/testcases/await.dart.legacy.transformed.expect b/pkg/front_end/testcases/await.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6a66550
--- /dev/null
+++ b/pkg/front_end/testcases/await.dart.legacy.transformed.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/await.dart.direct.expect b/pkg/front_end/testcases/await.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/await.dart.direct.expect
copy to pkg/front_end/testcases/await.dart.strong.expect
diff --git a/pkg/front_end/testcases/await.dart.strong.transformed.expect b/pkg/front_end/testcases/await.dart.strong.transformed.expect
new file mode 100644
index 0000000..6a66550
--- /dev/null
+++ b/pkg/front_end/testcases/await.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
deleted file mode 100644
index 218527b..0000000
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.expect
+++ /dev/null
@@ -1,146 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set b();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set c(x, y);
-//            ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
-// set b();
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
-// set c(x, y);
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Warning: The class 'B' is abstract and can't be instantiated.
-//     new B();
-//         ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set b();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set c(x, y);
-//            ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  set a(dynamic #synthetic) → dynamic
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
-  set a();
-       ^";
-  set d(dynamic #synthetic) → dynamic
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  set a(dynamic #synthetic) → dynamic
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
-  set a();
-       ^";
-  set d(dynamic #synthetic) → dynamic
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-}
-static set b(dynamic #synthetic) → dynamic
-  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
-set b();
-     ^";
-static set c(dynamic #synthetic) → dynamic
-  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
-set c(x, y);
-     ^";
-static method main() → dynamic {
-  core::bool threw;
-  try {
-    threw = true;
-    new self::A::•().a = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    new self::A::•().d = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    self::b = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    self::c = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    throw new core::AbstractClassInstantiationError::•("B");
-    threw = false;
-  }
-  on core::AbstractClassInstantiationError catch(final core::AbstractClassInstantiationError _) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-}
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect
deleted file mode 100644
index 074ed34..0000000
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.direct.transformed.expect
+++ /dev/null
@@ -1,106 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set b();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set c(x, y);
-//            ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  set a(dynamic #synthetic) → dynamic
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
-  set a();
-       ^";
-  set d(dynamic #synthetic) → dynamic
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  set a(dynamic #synthetic) → dynamic
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
-  set a();
-       ^";
-  set d(dynamic #synthetic) → dynamic
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-}
-static set b(dynamic #synthetic) → dynamic
-  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
-set b();
-     ^";
-static set c(dynamic #synthetic) → dynamic
-  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
-set c(x, y);
-     ^";
-static method main() → dynamic {
-  core::bool threw;
-  try {
-    threw = true;
-    new self::A::•().a = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    new self::A::•().d = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    self::b = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    self::c = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    throw new core::AbstractClassInstantiationError::•("B");
-    threw = false;
-  }
-  on core::AbstractClassInstantiationError catch(final core::AbstractClassInstantiationError _) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-}
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.expect
new file mode 100644
index 0000000..80e3471
--- /dev/null
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.expect
@@ -0,0 +1,170 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+// set b();
+//      ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+// set c(x, y);
+//      ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+//   set a();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+//   set d(x, y);
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+//   set a();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+//   set d(x, y);
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Warning: The class 'B' is abstract and can't be instantiated.
+//     new B();
+//         ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  set a(dynamic #synthetic) → dynamic {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+  set a();
+       ^";
+    ;
+  }
+  set d(dynamic #synthetic) → dynamic {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+  set d(x, y);
+       ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  set a(dynamic #synthetic) → dynamic {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+  set a();
+       ^";
+    ;
+  }
+  set d(dynamic #synthetic) → dynamic {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+  set d(x, y);
+       ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
+}
+static set b(dynamic #synthetic) → dynamic {
+  invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+set b();
+     ^";
+  ;
+}
+static set c(dynamic #synthetic) → dynamic {
+  invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+set c(x, y);
+     ^";
+  {
+    dynamic x;
+    dynamic y;
+    ;
+  }
+}
+static method main() → dynamic {
+  core::bool threw;
+  try {
+    threw = true;
+    new self::A::•().a = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    new self::A::•().d = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    self::b = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    self::c = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    throw new core::AbstractClassInstantiationError::•("B");
+    threw = false;
+  }
+  on core::AbstractClassInstantiationError catch(final core::AbstractClassInstantiationError _) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+}
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.transformed.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.transformed.expect
new file mode 100644
index 0000000..cd9945f
--- /dev/null
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.transformed.expect
@@ -0,0 +1,130 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set b();
+//        ^
+//
+// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
+// Try adding {}.
+// set c(x, y);
+//            ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  set a(dynamic #synthetic) → dynamic {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+  set a();
+       ^";
+    ;
+  }
+  set d(dynamic #synthetic) → dynamic {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+  set d(x, y);
+       ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  set a(dynamic #synthetic) → dynamic {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+  set a();
+       ^";
+    ;
+  }
+  set d(dynamic #synthetic) → dynamic {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+  set d(x, y);
+       ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
+}
+static set b(dynamic #synthetic) → dynamic {
+  invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+set b();
+     ^";
+  ;
+}
+static set c(dynamic #synthetic) → dynamic {
+  invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+set c(x, y);
+     ^";
+  {
+    dynamic x;
+    dynamic y;
+    ;
+  }
+}
+static method main() → dynamic {
+  core::bool threw;
+  try {
+    threw = true;
+    new self::A::•().a = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    new self::A::•().d = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    self::b = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    self::c = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    throw new core::AbstractClassInstantiationError::•("B");
+    threw = false;
+  }
+  on core::AbstractClassInstantiationError catch(final core::AbstractClassInstantiationError _) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+}
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
index 67c1c60..0334820 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
@@ -62,36 +62,60 @@
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  set a(dynamic #synthetic) → void
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+  set a(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
   set a();
        ^";
-  set d(dynamic #synthetic) → void
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+    ;
+  }
+  set d(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
   set d(x, y);
        ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
 }
 abstract class B extends core::Object {
   synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  set a(dynamic #synthetic) → void
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+  set a(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
   set a();
        ^";
-  set d(dynamic #synthetic) → void
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+    ;
+  }
+  set d(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
   set d(x, y);
        ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
 }
-static set b(dynamic #synthetic) → void
-  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+static set b(dynamic #synthetic) → void {
+  invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
 set b();
      ^";
-static set c(dynamic #synthetic) → void
-  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+  ;
+}
+static set c(dynamic #synthetic) → void {
+  invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
 set c(x, y);
      ^";
+  {
+    dynamic x;
+    dynamic y;
+    ;
+  }
+}
 static method main() → dynamic {
   core::bool threw;
   try {
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
index 2e2e6ab..a9335aa 100644
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
@@ -22,36 +22,60 @@
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  set a(dynamic #synthetic) → void
-    let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
+  set a(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
   set a();
        ^";
-  set d(dynamic #synthetic) → void
-    let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
+    ;
+  }
+  set d(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
   set d(x, y);
        ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
 }
 abstract class B extends core::Object {
   synthetic constructor •() → self::B
     : super core::Object::•()
     ;
-  set a(dynamic #synthetic) → void
-    let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
+  set a(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
   set a();
        ^";
-  set d(dynamic #synthetic) → void
-    let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
+    ;
+  }
+  set d(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
   set d(x, y);
        ^";
+    {
+      dynamic x;
+      dynamic y;
+      ;
+    }
+  }
 }
-static set b(dynamic #synthetic) → void
-  let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
+static set b(dynamic #synthetic) → void {
+  invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
 set b();
      ^";
-static set c(dynamic #synthetic) → void
-  let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
+  ;
+}
+static set c(dynamic #synthetic) → void {
+  invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
 set c(x, y);
      ^";
+  {
+    dynamic x;
+    dynamic y;
+    ;
+  }
+}
 static method main() → dynamic {
   core::bool threw;
   try {
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.type_promotion.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.type_promotion.expect
new file mode 100644
index 0000000..adc877f
--- /dev/null
+++ b/pkg/front_end/testcases/bad_setter_abstract.dart.type_promotion.expect
@@ -0,0 +1,30 @@
+pkg/front_end/testcases/bad_setter_abstract.dart:22:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:24:11: Context: Write to threw@344
+    threw = false;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:32:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:34:11: Context: Write to threw@344
+    threw = false;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:42:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:44:11: Context: Write to threw@344
+    threw = false;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:55:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:57:11: Context: Write to threw@344
+    threw = false;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:65:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/bad_setter_abstract.dart:67:11: Context: Write to threw@344
+    threw = false;
+          ^
diff --git a/pkg/front_end/testcases/bad_store.dart.direct.expect b/pkg/front_end/testcases/bad_store.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bad_store.dart.direct.expect
rename to pkg/front_end/testcases/bad_store.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bad_store.dart.direct.transformed.expect b/pkg/front_end/testcases/bad_store.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bad_store.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bad_store.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.direct.expect b/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bounds_check_depends_on_inference.dart.direct.expect
rename to pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bounds_check_depends_on_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug21938.dart.direct.expect b/pkg/front_end/testcases/bug21938.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug21938.dart.direct.expect
rename to pkg/front_end/testcases/bug21938.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug21938.dart.direct.transformed.expect b/pkg/front_end/testcases/bug21938.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug21938.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug21938.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug21938.dart.strong.expect b/pkg/front_end/testcases/bug21938.dart.strong.expect
index 08cc80d..5e1d794 100644
--- a/pkg/front_end/testcases/bug21938.dart.strong.expect
+++ b/pkg/front_end/testcases/bug21938.dart.strong.expect
@@ -1,16 +1,19 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+// pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
 //   x /*@error=UndefinedMethod*/ ();
 //    ^
 //
-// pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+// pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
 //   x /*@error=UndefinedMethod*/ (3);
 //    ^
 //
-// pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+// pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'Object'.
+//  - 'Object' is from 'dart:core'.
 // Try correcting the name to the name of an existing method, or defining a method named 'call'.
 //   x. /*@error=UndefinedMethod*/ call();
 //                                 ^^^^
@@ -22,16 +25,19 @@
 static method test() → dynamic {
   core::Object x;
   core::Function f;
-  let final dynamic #t1 = x in invalid-expression "pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+  let final dynamic #t1 = x in invalid-expression "pkg/front_end/testcases/bug21938.dart:10:4: Error: The method 'call' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   x /*@error=UndefinedMethod*/ ();
    ^";
-  let final dynamic #t2 = x in invalid-expression "pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+  let final dynamic #t2 = x in invalid-expression "pkg/front_end/testcases/bug21938.dart:11:4: Error: The method 'call' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   x /*@error=UndefinedMethod*/ (3);
    ^";
   f.call(5, 2);
-  let final dynamic #t3 = x in invalid-expression "pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'dart.core::Object'.
+  let final dynamic #t3 = x in invalid-expression "pkg/front_end/testcases/bug21938.dart:13:33: Error: The method 'call' isn't defined for the class 'Object'.
+ - 'Object' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named 'call'.
   x. /*@error=UndefinedMethod*/ call();
                                 ^^^^";
diff --git a/pkg/front_end/testcases/bug30695.dart.direct.expect b/pkg/front_end/testcases/bug30695.dart.direct.expect
deleted file mode 100644
index 63df473..0000000
--- a/pkg/front_end/testcases/bug30695.dart.direct.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
-//   foo() => 42;
-//   ^
-// pkg/front_end/testcases/bug30695.dart:6:7: Context: This is the inherited member.
-//   var foo = 42;
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
-//   foo() => 42;
-//   ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic foo = 42;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method foo() → dynamic
-    return 42;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug30695.dart.direct.transformed.expect b/pkg/front_end/testcases/bug30695.dart.direct.transformed.expect
deleted file mode 100644
index 8836357..0000000
--- a/pkg/front_end/testcases/bug30695.dart.direct.transformed.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
-//   foo() => 42;
-//   ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic foo = 42;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method foo() → dynamic
-    return 42;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug30695.dart.legacy.expect b/pkg/front_end/testcases/bug30695.dart.legacy.expect
new file mode 100644
index 0000000..d1a2129
--- /dev/null
+++ b/pkg/front_end/testcases/bug30695.dart.legacy.expect
@@ -0,0 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
+//   foo() => 42;
+//   ^^^
+// pkg/front_end/testcases/bug30695.dart:6:7: Context: This is the inherited member.
+//   var foo = 42;
+//       ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
+//   foo() => 42;
+//   ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic foo = 42;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method foo() → dynamic
+    return 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug30695.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug30695.dart.legacy.transformed.expect
new file mode 100644
index 0000000..998f289
--- /dev/null
+++ b/pkg/front_end/testcases/bug30695.dart.legacy.transformed.expect
@@ -0,0 +1,24 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
+//   foo() => 42;
+//   ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic foo = 42;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method foo() → dynamic
+    return 42;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug30695.dart.outline.expect b/pkg/front_end/testcases/bug30695.dart.outline.expect
index e65b195..a4ad123 100644
--- a/pkg/front_end/testcases/bug30695.dart.outline.expect
+++ b/pkg/front_end/testcases/bug30695.dart.outline.expect
@@ -2,10 +2,10 @@
 //
 // pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
 //   foo() => 42;
-//   ^
+//   ^^^
 // pkg/front_end/testcases/bug30695.dart:6:7: Context: This is the inherited member.
 //   var foo = 42;
-//       ^
+//       ^^^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/bug31124.dart.direct.expect b/pkg/front_end/testcases/bug31124.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug31124.dart.direct.expect
rename to pkg/front_end/testcases/bug31124.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug31124.dart.direct.transformed.expect b/pkg/front_end/testcases/bug31124.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug31124.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug31124.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug31124.dart.strong.expect b/pkg/front_end/testcases/bug31124.dart.strong.expect
index 90dd470..71f519f 100644
--- a/pkg/front_end/testcases/bug31124.dart.strong.expect
+++ b/pkg/front_end/testcases/bug31124.dart.strong.expect
@@ -25,5 +25,6 @@
 
 library;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field () → core::String a;
diff --git a/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect b/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect
index b75686c..90fd8c8 100644
--- a/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect
@@ -11,5 +11,6 @@
 
 library;
 import self as self;
+import "dart:core" as core;
 
-static field dynamic a;
+static field () → core::String a;
diff --git a/pkg/front_end/testcases/bug32414a.dart.direct.expect b/pkg/front_end/testcases/bug32414a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32414a.dart.direct.expect
rename to pkg/front_end/testcases/bug32414a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug32414a.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32414a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32414a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug32414a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug32414a.dart.strong.expect b/pkg/front_end/testcases/bug32414a.dart.strong.expect
index 8e0e0b72..5b9c638 100644
--- a/pkg/front_end/testcases/bug32414a.dart.strong.expect
+++ b/pkg/front_end/testcases/bug32414a.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   b = 42;
 //       ^
 
@@ -12,8 +12,8 @@
 static method test() → void {
   dynamic a = 5;
   core::String b = a.{core::Object::toString}();
-  b = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  b = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   b = 42;
       ^" in 42 as{TypeError} core::String;
 }
diff --git a/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect b/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect
index 3fdd972..13b27e0 100644
--- a/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect
@@ -5,8 +5,8 @@
 static method test() → void {
   dynamic a = 5;
   core::String b = a.{core::Object::toString}();
-  b = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  b = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   b = 42;
       ^" in 42 as{TypeError} core::String;
 }
diff --git a/pkg/front_end/testcases/bug32414a.dart.type_promotion.expect b/pkg/front_end/testcases/bug32414a.dart.type_promotion.expect
new file mode 100644
index 0000000..6f70c2d
--- /dev/null
+++ b/pkg/front_end/testcases/bug32414a.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/bug32414a.dart:10:5: Context: Write to b@302
+  b = 42;
+    ^
diff --git a/pkg/front_end/testcases/bug32414b.dart.direct.expect b/pkg/front_end/testcases/bug32414b.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32414b.dart.direct.expect
rename to pkg/front_end/testcases/bug32414b.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug32414b.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32414b.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32414b.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug32414b.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug32426.dart.direct.expect b/pkg/front_end/testcases/bug32426.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32426.dart.direct.expect
rename to pkg/front_end/testcases/bug32426.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug32426.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32426.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32426.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug32426.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug32629.dart.direct.expect b/pkg/front_end/testcases/bug32629.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32629.dart.direct.expect
rename to pkg/front_end/testcases/bug32629.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug32629.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32629.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32629.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug32629.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug32866.dart.direct.expect b/pkg/front_end/testcases/bug32866.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32866.dart.direct.expect
rename to pkg/front_end/testcases/bug32866.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug32866.dart.direct.transformed.expect b/pkg/front_end/testcases/bug32866.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32866.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug32866.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug33099.dart.direct.expect b/pkg/front_end/testcases/bug33099.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33099.dart.direct.expect
rename to pkg/front_end/testcases/bug33099.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug33099.dart.direct.transformed.expect b/pkg/front_end/testcases/bug33099.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33099.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug33099.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug33099.dart.outline.expect b/pkg/front_end/testcases/bug33099.dart.outline.expect
index 176f728..94c81bb 100644
--- a/pkg/front_end/testcases/bug33099.dart.outline.expect
+++ b/pkg/front_end/testcases/bug33099.dart.outline.expect
@@ -14,7 +14,7 @@
     ;
 }
 abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
-  synthetic constructor •() → self::_MyTest2&Object&MyTest
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/bug33099.dart.strong.expect b/pkg/front_end/testcases/bug33099.dart.strong.expect
index 4293417..4fb89b3 100644
--- a/pkg/front_end/testcases/bug33099.dart.strong.expect
+++ b/pkg/front_end/testcases/bug33099.dart.strong.expect
@@ -16,13 +16,13 @@
   method foo() → void {}
 }
 abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
-  synthetic constructor •() → self::_MyTest2&Object&MyTest
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest
     : super core::Object::•()
     ;
 }
 class MyTest2 extends self::_MyTest2&Object&MyTest {
   synthetic constructor •() → self::MyTest2
-    : super core::Object::•()
+    : super self::_MyTest2&Object&MyTest::•()
     ;
 }
 static const field self::_FailingTest failingTest = const self::_FailingTest::•();
diff --git a/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect
index a8c371a..5ad81b8 100644
--- a/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
   method foo() → void {}
 }
 abstract class _MyTest2&Object&MyTest extends core::Object implements self::MyTest {
-  synthetic constructor •() → self::_MyTest2&Object&MyTest
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest
     : super core::Object::•()
     ;
   @self::failingTest
@@ -24,7 +24,7 @@
 }
 class MyTest2 extends self::_MyTest2&Object&MyTest {
   synthetic constructor •() → self::MyTest2
-    : super core::Object::•()
+    : super self::_MyTest2&Object&MyTest::•()
     ;
 }
 static const field self::_FailingTest failingTest = const self::_FailingTest::•();
diff --git a/pkg/front_end/testcases/bug33196.dart.direct.transformed.expect b/pkg/front_end/testcases/bug33196.dart.direct.transformed.expect
deleted file mode 100644
index cc0de23..0000000
--- a/pkg/front_end/testcases/bug33196.dart.direct.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-static method main() → dynamic {
-  dynamic result = self::returnsString();
-  core::print(result.runtimeType);
-}
-static method returnsString() → asy::FutureOr<core::String> /* originally async */ {
-  final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = "oh no";
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/bug33196.dart.direct.expect b/pkg/front_end/testcases/bug33196.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33196.dart.direct.expect
rename to pkg/front_end/testcases/bug33196.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug33196.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug33196.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8f79612
--- /dev/null
+++ b/pkg/front_end/testcases/bug33196.dart.legacy.transformed.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method main() → dynamic {
+  dynamic result = self::returnsString();
+  core::print(result.runtimeType);
+}
+static method returnsString() → asy::FutureOr<core::String> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
+  asy::FutureOr<core::String> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = "oh no";
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/bug33196.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33196.dart.strong.transformed.expect
index 94661f3..1b395b7 100644
--- a/pkg/front_end/testcases/bug33196.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug33196.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
   core::print(result.{core::Object::runtimeType});
 }
 static method returnsString() → asy::FutureOr<core::String> /* originally async */ {
-  final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
+  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
   asy::FutureOr<core::String> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -31,6 +31,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect b/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect
deleted file mode 100644
index 94af5a5..0000000
--- a/pkg/front_end/testcases/bug33206.dart.direct.transformed.expect
+++ /dev/null
@@ -1,137 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class X extends core::Object {
-  final field dynamic x;
-  final field dynamic y;
-  constructor •(dynamic x, dynamic y) → self::X
-    : self::X::x = x, self::X::y = y, super core::Object::•()
-    ;
-  method toString() → dynamic
-    return "X(${this.{self::X::x}}, ${this.{self::X::y}})";
-}
-class Y extends core::Object {
-  synthetic constructor •() → self::Y
-    : super core::Object::•()
-    ;
-  method f(dynamic _) → dynamic {}
-}
-static method f1() → asy::Future<core::List<core::Object>> /* originally async */ {
-  final asy::Completer<core::List<core::Object>> :async_completer = asy::Completer::sync<core::List<core::Object>>();
-  asy::FutureOr<core::List<core::Object>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = <dynamic>[1];
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method f2() → core::List<core::Object>
-  return <dynamic>[2];
-static method f3() → asy::Future<core::Object> /* originally async */ {
-  final asy::Completer<core::Object> :async_completer = asy::Completer::sync<core::Object>();
-  asy::FutureOr<core::Object> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = 3;
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method foo() → asy::Future<self::X> /* originally async */ {
-  final asy::Completer<self::X> :async_completer = asy::Completer::sync<self::X>();
-  asy::FutureOr<self::X> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L3:
-      {
-        final dynamic #t1 = new self::Y::•();
-        [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
-        final dynamic #t3 = #t1.f(:result);
-        final dynamic #t4 = #t1.f(self::f2());
-        [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
-        :return_value = new self::X::•(#t1, :result);
-        break #L3;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → asy::Future<void> /* originally async */ {
-  final asy::Completer<void> :async_completer = asy::Completer::sync<void>();
-  asy::FutureOr<void> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L4:
-      {
-        [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
-        core::print(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/bug33206.dart.direct.expect b/pkg/front_end/testcases/bug33206.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33206.dart.direct.expect
rename to pkg/front_end/testcases/bug33206.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug33206.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug33206.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e19e82a
--- /dev/null
+++ b/pkg/front_end/testcases/bug33206.dart.legacy.transformed.expect
@@ -0,0 +1,137 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class X extends core::Object {
+  final field dynamic x;
+  final field dynamic y;
+  constructor •(dynamic x, dynamic y) → self::X
+    : self::X::x = x, self::X::y = y, super core::Object::•()
+    ;
+  method toString() → dynamic
+    return "X(${this.{self::X::x}}, ${this.{self::X::y}})";
+}
+class Y extends core::Object {
+  synthetic constructor •() → self::Y
+    : super core::Object::•()
+    ;
+  method f(dynamic _) → dynamic {}
+}
+static method f1() → asy::Future<core::List<core::Object>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::Object>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::Object>>();
+  asy::FutureOr<core::List<core::Object>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = <dynamic>[1];
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method f2() → core::List<core::Object>
+  return <dynamic>[2];
+static method f3() → asy::Future<core::Object> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Object> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object>();
+  asy::FutureOr<core::Object> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = 3;
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method foo() → asy::Future<self::X> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<self::X> :async_completer = new asy::_AsyncAwaitCompleter::•<self::X>();
+  asy::FutureOr<self::X> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        final dynamic #t1 = new self::Y::•();
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
+        final dynamic #t3 = #t1.f(:result);
+        final dynamic #t4 = #t1.f(self::f2());
+        [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
+        :return_value = new self::X::•(#t1, :result);
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → asy::Future<void> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  asy::FutureOr<void> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L4:
+      {
+        [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect
index 62903f9..217f7b0 100644
--- a/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
   method f(dynamic _) → dynamic {}
 }
 static method f1() → asy::Future<core::List<core::Object>> /* originally async */ {
-  final asy::Completer<core::List<core::Object>> :async_completer = asy::Completer::sync<core::List<core::Object>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::Object>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::Object>>();
   asy::FutureOr<core::List<core::Object>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -42,13 +42,13 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method f2() → core::List<core::Object>
   return <core::Object>[2];
 static method f3() → asy::Future<core::Object> /* originally async */ {
-  final asy::Completer<core::Object> :async_completer = asy::Completer::sync<core::Object>();
+  final asy::_AsyncAwaitCompleter<core::Object> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object>();
   asy::FutureOr<core::Object> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -71,11 +71,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method foo() → asy::Future<self::X> /* originally async */ {
-  final asy::Completer<self::X> :async_completer = asy::Completer::sync<self::X>();
+  final asy::_AsyncAwaitCompleter<self::X> :async_completer = new asy::_AsyncAwaitCompleter::•<self::X>();
   asy::FutureOr<self::X> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -104,11 +104,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → asy::Future<void> /* originally async */ {
-  final asy::Completer<void> :async_completer = asy::Completer::sync<void>();
+  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
   asy::FutureOr<void> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -132,6 +132,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/bug33298.dart.direct.expect b/pkg/front_end/testcases/bug33298.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33298.dart.direct.expect
rename to pkg/front_end/testcases/bug33298.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug33298.dart.direct.transformed.expect b/pkg/front_end/testcases/bug33298.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33298.dart.direct.transformed.expect
rename to pkg/front_end/testcases/bug33298.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.expect b/pkg/front_end/testcases/bug33298.dart.strong.expect
index 6e3697a..ec9f90e 100644
--- a/pkg/front_end/testcases/bug33298.dart.strong.expect
+++ b/pkg/front_end/testcases/bug33298.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) → #lib1::C::call::T' can't be assigned to the parameter type '(dart.core::String) → dynamic'.
-// Try changing the type of the parameter, or casting the argument to '(dart.core::String) → dynamic'.
+// pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
+// Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
 //   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
 //                                            ^
 
@@ -39,8 +39,8 @@
   core::List<core::String> list4 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(let final self::B<core::String> #t2 = b in #t2.==(null) ?{(core::String) → core::String} null : #t2.{self::B::call}).{core::Iterable::toList}();
   self::C c = new self::C::•();
   core::List<core::String> list5 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(c.{self::C::call}<core::String>).{core::Iterable::toList}();
-  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) \u8594 #lib1::C::call::T' can't be assigned to the parameter type '(dart.core::String) \u8594 dynamic'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::String) \u8594 dynamic'.
+  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
+Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
                                            ^" in (let final self::C #t4 = c in #t4.==(null) ?{<T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T} null : #t4.{self::C::call}) as{TypeError} (core::String) → dynamic).{core::Iterable::toList}() as{TypeError} core::List<core::String>;
 }
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
index 03d367a..dd96420 100644
--- a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
@@ -32,8 +32,8 @@
   core::List<core::String> list4 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(let final self::B<core::String> #t2 = b in #t2.==(null) ?{(core::String) → core::String} null : #t2.{self::B::call}).{core::Iterable::toList}();
   self::C c = new self::C::•();
   core::List<core::String> list5 = <core::String>["a", "b", "c"].{core::Iterable::map}<core::String>(c.{self::C::call}<core::String>).{core::Iterable::toList}();
-  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type '<T extends dart.core::Object = dynamic>(#lib1::C::call::T) \u8594 #lib1::C::call::T' can't be assigned to the parameter type '(dart.core::String) \u8594 dynamic'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::String) \u8594 dynamic'.
+  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
+Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
   List<String> list6 = ['a', 'b', 'c'].map(c).toList();
                                            ^" in (let final self::C #t4 = c in #t4.==(null) ?{<T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T} null : #t4.{self::C::call}) as{TypeError} (core::String) → dynamic).{core::Iterable::toList}() as{TypeError} core::List<core::String>;
 }
diff --git a/pkg/front_end/testcases/bug34511.dart b/pkg/front_end/testcases/bug34511.dart
new file mode 100644
index 0000000..d8ad848
--- /dev/null
+++ b/pkg/front_end/testcases/bug34511.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// See http://dartbug.com/34511 for details.
+
+class A<X> {}
+
+class B<Z> extends Object with A<Z Function()> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/bug34511.dart.legacy.expect b/pkg/front_end/testcases/bug34511.dart.legacy.expect
new file mode 100644
index 0000000..4ba96c3
--- /dev/null
+++ b/pkg/front_end/testcases/bug34511.dart.legacy.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+abstract class _B&Object&A<Z extends core::Object = dynamic> = core::Object with self::A<() → self::_B&Object&A::Z> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
+    : super core::Object::•()
+    ;
+}
+class B<Z extends core::Object = dynamic> extends self::_B&Object&A<self::B::Z> {
+  synthetic constructor •() → self::B<self::B::Z>
+    : super self::_B&Object&A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug34511.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug34511.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fe93483
--- /dev/null
+++ b/pkg/front_end/testcases/bug34511.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+abstract class _B&Object&A<Z extends core::Object = dynamic> extends core::Object implements self::A<() → self::_B&Object&A::Z> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
+    : super core::Object::•()
+    ;
+}
+class B<Z extends core::Object = dynamic> extends self::_B&Object&A<self::B::Z> {
+  synthetic constructor •() → self::B<self::B::Z>
+    : super self::_B&Object&A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug34511.dart.outline.expect b/pkg/front_end/testcases/bug34511.dart.outline.expect
new file mode 100644
index 0000000..1d6dbda
--- /dev/null
+++ b/pkg/front_end/testcases/bug34511.dart.outline.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    ;
+}
+abstract class _B&Object&A<Z extends core::Object = dynamic> = core::Object with self::A<() → self::_B&Object&A::Z> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
+    : super core::Object::•()
+    ;
+}
+class B<Z extends core::Object = dynamic> extends self::_B&Object&A<self::B::Z> {
+  synthetic constructor •() → self::B<self::B::Z>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/bug34511.dart.strong.expect b/pkg/front_end/testcases/bug34511.dart.strong.expect
new file mode 100644
index 0000000..4ba96c3
--- /dev/null
+++ b/pkg/front_end/testcases/bug34511.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+abstract class _B&Object&A<Z extends core::Object = dynamic> = core::Object with self::A<() → self::_B&Object&A::Z> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
+    : super core::Object::•()
+    ;
+}
+class B<Z extends core::Object = dynamic> extends self::_B&Object&A<self::B::Z> {
+  synthetic constructor •() → self::B<self::B::Z>
+    : super self::_B&Object&A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug34511.dart.strong.transformed.expect b/pkg/front_end/testcases/bug34511.dart.strong.transformed.expect
new file mode 100644
index 0000000..fe93483
--- /dev/null
+++ b/pkg/front_end/testcases/bug34511.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+}
+abstract class _B&Object&A<Z extends core::Object = dynamic> extends core::Object implements self::A<() → self::_B&Object&A::Z> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
+    : super core::Object::•()
+    ;
+}
+class B<Z extends core::Object = dynamic> extends self::_B&Object&A<self::B::Z> {
+  synthetic constructor •() → self::B<self::B::Z>
+    : super self::_B&Object&A::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug35470.dart b/pkg/front_end/testcases/bug35470.dart
new file mode 100644
index 0000000..9d8d9d9
--- /dev/null
+++ b/pkg/front_end/testcases/bug35470.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A<X> {
+  foo<Y extends X>() {}
+}
+
+class B extends A<dynamic> {}
+
+bar(B b) {
+  b.foo();
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/bug35470.dart.legacy.expect b/pkg/front_end/testcases/bug35470.dart.legacy.expect
new file mode 100644
index 0000000..7f2ad6a
--- /dev/null
+++ b/pkg/front_end/testcases/bug35470.dart.legacy.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+  method foo<Y extends self::A::X = dynamic>() → dynamic {}
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method bar(self::B b) → dynamic {
+  b.foo();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug35470.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug35470.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7f2ad6a
--- /dev/null
+++ b/pkg/front_end/testcases/bug35470.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+  method foo<Y extends self::A::X = dynamic>() → dynamic {}
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method bar(self::B b) → dynamic {
+  b.foo();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug35470.dart.outline.expect b/pkg/front_end/testcases/bug35470.dart.outline.expect
new file mode 100644
index 0000000..26320fb
--- /dev/null
+++ b/pkg/front_end/testcases/bug35470.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    ;
+  method foo<Y extends self::A::X = dynamic>() → dynamic
+    ;
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B
+    ;
+}
+static method bar(self::B b) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/bug35470.dart.strong.expect b/pkg/front_end/testcases/bug35470.dart.strong.expect
new file mode 100644
index 0000000..53cb0c8
--- /dev/null
+++ b/pkg/front_end/testcases/bug35470.dart.strong.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+  method foo<generic-covariant-impl Y extends self::A::X = self::A::X>() → dynamic {}
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method bar(self::B b) → dynamic {
+  b.{self::A::foo}<dynamic>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug35470.dart.strong.transformed.expect b/pkg/front_end/testcases/bug35470.dart.strong.transformed.expect
new file mode 100644
index 0000000..53cb0c8
--- /dev/null
+++ b/pkg/front_end/testcases/bug35470.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X>
+    : super core::Object::•()
+    ;
+  method foo<generic-covariant-impl Y extends self::A::X = self::A::X>() → dynamic {}
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method bar(self::B b) → dynamic {
+  b.{self::A::foo}<dynamic>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/call.dart.direct.expect b/pkg/front_end/testcases/call.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/call.dart.direct.expect
rename to pkg/front_end/testcases/call.dart.legacy.expect
diff --git a/pkg/front_end/testcases/call.dart.strong.expect b/pkg/front_end/testcases/call.dart.strong.expect
index 8f91575..03a252d 100644
--- a/pkg/front_end/testcases/call.dart.strong.expect
+++ b/pkg/front_end/testcases/call.dart.strong.expect
@@ -1,9 +1,89 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+//  - 'CallableGetter' is from 'pkg/front_end/testcases/call.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   var string5 = callableGetter(1);
+//                               ^
+//
+// pkg/front_end/testcases/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing1 = closure();
+//                         ^
+//
+// pkg/front_end/testcases/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing2 = closure.call();
+//                              ^
+//
+// pkg/front_end/testcases/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing3 = closure.call.call();
+//                                   ^
+//
+// pkg/front_end/testcases/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing4 = closure.call.call.call();
+//                                        ^
+//
+// pkg/front_end/testcases/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing5 = callable();
+//                          ^
+//
+// pkg/front_end/testcases/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing6 = callable.call();
+//                               ^
+//
+// pkg/front_end/testcases/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing7 = callable.call.call();
+//                                    ^
+//
+// pkg/front_end/testcases/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing8 = callable.call.call.call();
+//                                         ^
+//
+// pkg/front_end/testcases/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+//  - 'CallableGetter' is from 'pkg/front_end/testcases/call.dart'.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//   var nothing9 = callableGetter();
+//                                ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing1 = closure();
+//                         ^
+//
+// pkg/front_end/testcases/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing2 = closure.call();
+//                              ^
+//
+// pkg/front_end/testcases/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing3 = closure.call.call();
+//                                   ^
+//
+// pkg/front_end/testcases/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing4 = closure.call.call.call();
+//                                        ^
+//
+// pkg/front_end/testcases/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing5 = callable();
+//                          ^
+//
+// pkg/front_end/testcases/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing6 = callable.call();
+//                               ^
+//
+// pkg/front_end/testcases/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing7 = callable.call.call();
+//                                    ^
+//
+// pkg/front_end/testcases/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing8 = callable.call.call.call();
+//                                         ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class Callable extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Callable
     : super core::Object::•()
     ;
   method call(dynamic x) → dynamic {
@@ -11,7 +91,7 @@
   }
 }
 class CallableGetter extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::CallableGetter
     : super core::Object::•()
     ;
   get call() → dynamic
@@ -29,7 +109,11 @@
   dynamic string3 = callable.{self::Callable::call}.call(1);
   dynamic string4 = callable.{self::Callable::call}.call.call(1);
   self::CallableGetter callableGetter = new self::CallableGetter::•();
-  dynamic string5 = callableGetter.{self::CallableGetter::call}(1);
+  dynamic string5 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/call.dart:29:31: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+ - 'CallableGetter' is from 'pkg/front_end/testcases/call.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  var string5 = callableGetter(1);
+                              ^" in callableGetter.{self::CallableGetter::call}(1);
   dynamic string6 = callableGetter.{self::CallableGetter::call}(1);
   dynamic string7 = callableGetter.{self::CallableGetter::call}.call(1);
   dynamic string8 = callableGetter.{self::CallableGetter::call}.call.call(1);
@@ -41,7 +125,11 @@
   dynamic nothing6 = callable.{self::Callable::call}();
   dynamic nothing7 = callable.{self::Callable::call}.call();
   dynamic nothing8 = callable.{self::Callable::call}.call.call();
-  dynamic nothing9 = callableGetter.{self::CallableGetter::call}();
+  dynamic nothing9 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/call.dart:44:32: Error: Cannot invoke an instance of 'CallableGetter' because it declares 'call' to be something other than a method.
+ - 'CallableGetter' is from 'pkg/front_end/testcases/call.dart'.
+Try changing 'call' to a method or explicitly invoke 'call'.
+  var nothing9 = callableGetter();
+                               ^" in callableGetter.{self::CallableGetter::call}();
   dynamic nothing10 = callableGetter.{self::CallableGetter::call}();
   dynamic nothing11 = callableGetter.{self::CallableGetter::call}.call();
   dynamic nothing12 = callableGetter.{self::CallableGetter::call}.call.call();
diff --git a/pkg/front_end/testcases/cascade.dart.direct.expect b/pkg/front_end/testcases/cascade.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/cascade.dart.direct.expect
rename to pkg/front_end/testcases/cascade.dart.legacy.expect
diff --git a/pkg/front_end/testcases/cascade.dart.direct.transformed.expect b/pkg/front_end/testcases/cascade.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/cascade.dart.direct.transformed.expect
rename to pkg/front_end/testcases/cascade.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/cascade.dart.strong.expect b/pkg/front_end/testcases/cascade.dart.strong.expect
new file mode 100644
index 0000000..9595c80
--- /dev/null
+++ b/pkg/front_end/testcases/cascade.dart.strong.expect
@@ -0,0 +1,50 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     [1]
+//     ^
+//
+// pkg/front_end/testcases/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+//     ..first.last.toString()
+//             ^^^^
+//
+// pkg/front_end/testcases/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+//     ..first[0].toString()
+//            ^^
+//
+// pkg/front_end/testcases/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+//     ..[0].last.toString();
+//           ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<core::int> list = let final core::List<core::int> #t1 = <core::int>[1] in let final dynamic #t2 = #t1.{core::List::add}(2) in let final dynamic #t3 = #t1.{core::List::add}(3) in let final dynamic #t4 = #t1.{core::List::addAll}(<core::int>[4, 5]) in #t1;
+  core::print(list);
+  let final core::List<core::int> #t5 = list in let final dynamic #t6 = #t5.{core::List::add}(2) in let final dynamic #t7 = #t5.{core::List::length} in let final dynamic #t8 = #t5.{core::List::length} = 0 in #t5;
+  core::print(list);
+  let final core::List<core::int> #t9 = list in let final dynamic #t10 = #t9.{core::List::add}(2) in let final dynamic #t11 = #t9.{core::List::[]}(0) in let final dynamic #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
+  core::print(list);
+  list = let final core::List<core::int> #t13 = <core::int>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+    [1]
+    ^" in <core::int>[1] as{TypeError} core::int] in let final dynamic #t15 = (let final dynamic #t16 = #t13.{core::Iterable::first} in invalid-expression "pkg/front_end/testcases/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+    ..first.last.toString()
+            ^^^^").{core::Object::toString}() in let final dynamic #t17 = (let final dynamic #t18 = #t13.{core::Iterable::first} in invalid-expression "pkg/front_end/testcases/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named '[]'.
+    ..first[0].toString()
+           ^^").{core::Object::toString}() in let final dynamic #t19 = (let final dynamic #t20 = #t13.{core::List::[]}(0) in invalid-expression "pkg/front_end/testcases/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+    ..[0].last.toString();
+          ^^^^").{core::Object::toString}() in #t13;
+  core::print(list);
+}
diff --git a/pkg/front_end/testcases/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/cascade.dart.strong.transformed.expect
new file mode 100644
index 0000000..896f686
--- /dev/null
+++ b/pkg/front_end/testcases/cascade.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::List<core::int> list = let final core::List<core::int> #t1 = <core::int>[1] in let final void #t2 = #t1.{core::List::add}(2) in let final void #t3 = #t1.{core::List::add}(3) in let final void #t4 = #t1.{core::List::addAll}(<core::int>[4, 5]) in #t1;
+  core::print(list);
+  let final core::List<core::int> #t5 = list in let final void #t6 = #t5.{core::List::add}(2) in let final core::int #t7 = #t5.{core::List::length} in let final core::int #t8 = #t5.{core::List::length} = 0 in #t5;
+  core::print(list);
+  let final core::List<core::int> #t9 = list in let final void #t10 = #t9.{core::List::add}(2) in let final core::int #t11 = #t9.{core::List::[]}(0) in let final void #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
+  core::print(list);
+  list = let final core::List<core::int> #t13 = <core::int>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+    [1]
+    ^" in <core::int>[1] as{TypeError} core::int] in let final core::String #t15 = (let final core::int #t16 = #t13.{core::Iterable::first} in invalid-expression "pkg/front_end/testcases/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+    ..first.last.toString()
+            ^^^^").{core::Object::toString}() in let final core::String #t17 = (let final core::int #t18 = #t13.{core::Iterable::first} in invalid-expression "pkg/front_end/testcases/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named '[]'.
+    ..first[0].toString()
+           ^^").{core::Object::toString}() in let final core::String #t19 = (let final core::int #t20 = #t13.{core::List::[]}(0) in invalid-expression "pkg/front_end/testcases/cascade.dart:30:11: Error: The getter 'last' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
+    ..[0].last.toString();
+          ^^^^").{core::Object::toString}() in #t13;
+  core::print(list);
+}
diff --git a/pkg/front_end/testcases/cascade.dart.type_promotion.expect b/pkg/front_end/testcases/cascade.dart.type_promotion.expect
new file mode 100644
index 0000000..3d3e899
--- /dev/null
+++ b/pkg/front_end/testcases/cascade.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/cascade.dart:25:8: Context: Write to list@232
+  list = [
+       ^
diff --git a/pkg/front_end/testcases/casts.dart.direct.expect b/pkg/front_end/testcases/casts.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/casts.dart.direct.expect
rename to pkg/front_end/testcases/casts.dart.legacy.expect
diff --git a/pkg/front_end/testcases/casts.dart.direct.transformed.expect b/pkg/front_end/testcases/casts.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/casts.dart.direct.transformed.expect
rename to pkg/front_end/testcases/casts.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/casts.dart.direct.expect b/pkg/front_end/testcases/casts.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/casts.dart.direct.expect
copy to pkg/front_end/testcases/casts.dart.strong.expect
diff --git a/pkg/front_end/testcases/casts.dart.direct.transformed.expect b/pkg/front_end/testcases/casts.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/casts.dart.direct.transformed.expect
copy to pkg/front_end/testcases/casts.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.direct.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_allocation.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_allocation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_allocation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect
deleted file mode 100644
index 199b7b0..0000000
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.direct.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Warning: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-//   x as lib.C;
-//        ^^^^^
-
-library;
-import self as self;
-
-static method main() → dynamic {}
-static method test(dynamic x) → dynamic {
-  x as invalid-type;
-}
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.expect
new file mode 100644
index 0000000..e585f88
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.expect
@@ -0,0 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Warning: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
+//   x as lib.C;
+//        ^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {}
+static method test(dynamic x) → dynamic {
+  x as invalid-type;
+}
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_as_check.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_as_check.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
index 8ec92a4..36f0884 100644
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
@@ -1,14 +1,16 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   x as lib.C;
 //        ^^^^^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   x as lib.C;
 //        ^^^^^
 
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
index 102d021..0535600 100644
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
@@ -1,7 +1,8 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   x as lib.C;
 //        ^^^^^
 
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.direct.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_args.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_args.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
deleted file mode 100644
index c4b209d..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "./deferred_lib.dart" as def;
-
-static method main() → dynamic {}
-static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        final dynamic #t1 = CheckLibraryIsLoaded(lib);
-        [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
-        def::m(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_args2.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f04ef3d
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "./deferred_lib.dart" as def;
+
+static method main() → dynamic {}
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        final dynamic #t1 = CheckLibraryIsLoaded(lib);
+        [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
+        def::m(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
index 8155d6a..6821c33 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method main() → dynamic {}
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -31,6 +31,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.direct.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_call.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_call.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.direct.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_write.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_write.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect
deleted file mode 100644
index c56363b..0000000
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.direct.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Warning: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-//   print(x is lib.C);
-//              ^^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {}
-static method test(dynamic x) → dynamic {
-  core::print(x is invalid-type);
-}
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.expect
new file mode 100644
index 0000000..05661c8
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.expect
@@ -0,0 +1,16 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Warning: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
+//   print(x is lib.C);
+//              ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {}
+static method test(dynamic x) → dynamic {
+  core::print(x is invalid-type);
+}
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_is_check.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_is_check.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
index 03bc9f5..1daf3c3 100644
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
@@ -1,14 +1,16 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   print(x is lib.C);
 //              ^^^^^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   print(x is lib.C);
 //              ^^^^^
 
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
index 1d4f45e..8065802 100644
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
@@ -1,7 +1,8 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   print(x is lib.C);
 //              ^^^^^
 
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.type_promotion.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.type_promotion.expect
new file mode 100644
index 0000000..fbbe754
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_is_check.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/check_deferred_is_check.dart:9:11: Context: Possible promotion of x@279
+  print(x is lib.C);
+          ^^
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.direct.expect b/pkg/front_end/testcases/check_deferred_read.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_read.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.direct.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read_static_field.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read_static_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.direct.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read_type.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.direct.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_static_method_call.dart.direct.expect
rename to pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_static_method_call.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect
deleted file mode 100644
index 23dbb5f..0000000
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Warning: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
-//   lib.C x = null;
-//   ^^^^^
-
-library;
-import self as self;
-
-static method main() → dynamic
-  return self::test();
-static method test() → dynamic {
-  invalid-type x = null;
-}
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.expect
new file mode 100644
index 0000000..a97b88b
--- /dev/null
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.expect
@@ -0,0 +1,16 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Warning: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
+//   lib.C x = null;
+//   ^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic
+  return self::test();
+static method test() → dynamic {
+  invalid-type x = null;
+}
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_type_declaration.dart.direct.transformed.expect
rename to pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
index f05771b..f52f89c 100644
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
@@ -1,14 +1,16 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   lib.C x = null;
 //   ^^^^^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   lib.C x = null;
 //   ^^^^^
 
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
index a29a189..71debcb 100644
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
@@ -1,7 +1,8 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type '#lib1::C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'lib' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Error: The type 'C' is deferred loaded via prefix 'lib' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'lib' or use a supertype of 'C' that isn't deferred.
 //   lib.C x = null;
 //   ^^^^^
 
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.expect
rename to pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.expect
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.transformed.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/circularity-via-initializing-formal.dart.direct.transformed.expect
rename to pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/classes.dart.direct.expect b/pkg/front_end/testcases/classes.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/classes.dart.direct.expect
rename to pkg/front_end/testcases/classes.dart.legacy.expect
diff --git a/pkg/front_end/testcases/classes.dart.direct.transformed.expect b/pkg/front_end/testcases/classes.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/classes.dart.direct.transformed.expect
rename to pkg/front_end/testcases/classes.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/classes.dart.strong.expect b/pkg/front_end/testcases/classes.dart.strong.expect
new file mode 100644
index 0000000..05cade4
--- /dev/null
+++ b/pkg/front_end/testcases/classes.dart.strong.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int x;
+  final field core::int y;
+  constructor •(core::int y) → self::A
+    : self::A::y = y, self::A::x = 42, super core::Object::•()
+    ;
+  method method() → dynamic {
+    core::print("A.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
+    core::print(this);
+    core::print(this.{core::Object::runtimeType});
+  }
+}
+class B extends self::A {
+  constructor •(dynamic x) → self::B
+    : super self::A::•(x as{TypeError} core::int)
+    ;
+  method method() → dynamic {
+    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
+    super.{self::A::method}();
+  }
+}
+static method main() → dynamic {
+  self::A a = new self::A::•(87);
+  self::B b = new self::B::•(117);
+  a.{self::A::method}();
+  b.{self::B::method}();
+}
diff --git a/pkg/front_end/testcases/classes.dart.strong.transformed.expect b/pkg/front_end/testcases/classes.dart.strong.transformed.expect
new file mode 100644
index 0000000..05cade4
--- /dev/null
+++ b/pkg/front_end/testcases/classes.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int x;
+  final field core::int y;
+  constructor •(core::int y) → self::A
+    : self::A::y = y, self::A::x = 42, super core::Object::•()
+    ;
+  method method() → dynamic {
+    core::print("A.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
+    core::print(this);
+    core::print(this.{core::Object::runtimeType});
+  }
+}
+class B extends self::A {
+  constructor •(dynamic x) → self::B
+    : super self::A::•(x as{TypeError} core::int)
+    ;
+  method method() → dynamic {
+    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
+    super.{self::A::method}();
+  }
+}
+static method main() → dynamic {
+  self::A a = new self::A::•(87);
+  self::B b = new self::B::•(117);
+  a.{self::A::method}();
+  b.{self::B::method}();
+}
diff --git a/pkg/front_end/testcases/clone_function_type.dart b/pkg/front_end/testcases/clone_function_type.dart
new file mode 100644
index 0000000..fd1d81e
--- /dev/null
+++ b/pkg/front_end/testcases/clone_function_type.dart
@@ -0,0 +1,258 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// In the classes below the function type is cloned when the anonymous mixin
+// application is desugared into a named mixin application, in order to re-bind
+// the type builders for its subterms.
+
+// The case 'm1' covers function types with some missing parts.
+
+class Am1<X, Y> {}
+
+class Bm1<Z> extends Object with Am1<Function(int), Z> {}
+
+class Cm1<Z> extends Object with Am1<Function(int x), Z> {}
+
+class Dm1<Z> extends Object with Am1<int Function(), Z> {}
+
+class Em1<Z> extends Object with Am1<Function(), Z> {}
+
+// Compile-time error: Named parameters should have names.
+class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+
+class Gm1<Z> extends Object with Am1<Function({int x}), Z> {}
+
+class Hm1<Z> extends Object with Am1<Function([int]), Z> {}
+
+class Im1<Z> extends Object with Am1<Function([int x]), Z> {}
+
+class Jm1<Z> extends Object with Am1<Function, Z> {}
+
+class Km1<Z> extends Object with Am1<Function(Function Function), Z> {}
+
+class Lm1<Z> extends Object
+    with Am1<Function(Function Function() Function) Function(), Z> {}
+
+class Mm1<Z> = Object with Am1<Function(int), Z>;
+
+class Nm1<Z> = Object with Am1<Function(int x), Z>;
+
+class Om1<Z> = Object with Am1<int Function(), Z>;
+
+class Pm1<Z> = Object with Am1<Function(), Z>;
+
+// Compile-time error: Named parameters should have names.
+class Qm1<Z> = Object with Am1<Function({int}), Z>;
+
+class Rm1<Z> = Object with Am1<Function({int x}), Z>;
+
+class Sm1<Z> = Object with Am1<Function([int]), Z>;
+
+class Tm1<Z> = Object with Am1<Function([int x]), Z>;
+
+class Um1<Z> = Object with Am1<Function, Z>;
+
+class Vm1<Z> = Object with Am1<Function(Function Function), Z>;
+
+class Wm1<Z> = Object
+    with Am1<Function(Function Function() Function) Function(), Z>;
+
+// The case 'm2' covers function types with some missing parts that should be
+// checked against a bound.
+
+class Am2<X extends Function(), Y> {}
+
+// Compile-time error: type argument is not a subtype.
+class Bm2<Z> extends Object with Am2<Function(int), Z> {}
+
+// Compile-time error: type argument is not a subtype.
+class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
+
+class Dm2<Z> extends Object with Am2<int Function(), Z> {}
+
+class Em2<Z> extends Object with Am2<Function(), Z> {}
+
+// Compile-time error: Named parameters should have names.
+class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+
+class Gm2<Z> extends Object with Am2<Function({int x}), Z> {}
+
+class Hm2<Z> extends Object with Am2<Function([int]), Z> {}
+
+class Im2<Z> extends Object with Am2<Function([int x]), Z> {}
+
+// Compile-time error: type argument is not a subtype.
+class Jm2<Z> extends Object with Am2<Function, Z> {}
+
+// Compile-time error: type argument is not a subtype.
+class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
+
+class Lm2<Z> extends Object
+    with Am2<Function(Function Function() Function) Function(), Z> {}
+
+// Compile-time error: type argument is not a subtype.
+class Mm2<Z> = Object with Am2<Function(int), Z>;
+
+// Compile-time error: type argument is not a subtype.
+class Nm2<Z> = Object with Am2<Function(int x), Z>;
+
+class Om2<Z> = Object with Am2<int Function(), Z>;
+
+class Pm2<Z> = Object with Am2<Function(), Z>;
+
+// Compile-time error: Named parameters should have names.
+class Qm2<Z> = Object with Am2<Function({int}), Z>;
+
+class Rm2<Z> = Object with Am2<Function({int x}), Z>;
+
+class Sm2<Z> = Object with Am2<Function([int]), Z>;
+
+class Tm2<Z> = Object with Am2<Function([int x]), Z>;
+
+// Compile-time error: type argument is not a subtype.
+class Um2<Z> = Object with Am2<Function, Z>;
+
+// Compile-time error: type argument is not a subtype.
+class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
+
+class Wm2<Z> = Object
+    with Am2<Function(Function Function() Function) Function(), Z>;
+
+// The case 'm3' covers function types with some missing parts defined via
+// typedefs.
+
+typedef TdB = Function(int);
+
+typedef TdC = Function(int x);
+
+typedef TdD = int Function();
+
+typedef TdE = Function();
+
+// Compile-time error: Named parameters should have names.
+typedef TdF = Function({int});
+
+typedef TdG = Function({int x});
+
+typedef TdH = Function([int]);
+
+typedef TdI = Function([int x]);
+
+typedef TdJ = Function(Function Function);
+
+typedef TdK = Function(Function Function() Function) Function();
+
+class Am3<L, Y> {}
+
+class Bm3<Z> extends Object with Am3<TdB, Z> {}
+
+class Cm3<Z> extends Object with Am3<TdC, Z> {}
+
+class Dm3<Z> extends Object with Am3<TdD, Z> {}
+
+class Em3<Z> extends Object with Am3<TdE, Z> {}
+
+class Fm3<Z> extends Object with Am3<TdF, Z> {}
+
+class Gm3<Z> extends Object with Am3<TdG, Z> {}
+
+class Hm3<Z> extends Object with Am3<TdH, Z> {}
+
+class Im3<Z> extends Object with Am3<TdI, Z> {}
+
+class Jm3<Z> extends Object with Am3<TdJ, Z> {}
+
+class Km3<Z> extends Object with Am3<TdK, Z> {}
+
+// In case cloning will not be used in the examples above, here are some
+// examples that should utilize cloning of type builders and that should cover
+// some of the cases above.  Here, type variables of the class are cloned for
+// its factories, including the bounds that are type builders.
+
+class Af1<X extends Function(int)> {
+  factory Af1.foo() => null;
+}
+
+class Bf1<X extends Function(int x)> {
+  factory Bf1.foo() => null;
+}
+
+class Cf1<X extends int Function()> {
+  factory Cf1.foo() => null;
+}
+
+class Df1<X extends Function()> {
+  factory Df1.foo() => null;
+}
+
+// Compile-time error: Named parameters should have names.
+class Ef1<X extends Function({int})> {
+  factory Ef1.foo() => null;
+}
+
+class Ff1<X extends Function({int x})> {
+  factory Ff1.foo() => null;
+}
+
+class Gf1<X extends Function([int])> {
+  factory Gf1.foo() => null;
+}
+
+class Hf1<X extends Function([int x])> {
+  factory Hf1.foo() => null;
+}
+
+class If1<X extends Function> {
+  factory If1.foo() => null;
+}
+
+class Jf1<X extends Function(Function Function)> {
+  factory Jf1.foo() => null;
+}
+
+class Kf1<X extends Function(Function Function() Function) Function()> {
+  factory Kf1.foo() => null;
+}
+
+class Bf2<X extends TdB> {
+  factory Bf2.foo() => null;
+}
+
+class Cf2<X extends TdC> {
+  factory Cf2.foo() => null;
+}
+
+class Df2<X extends TdD> {
+  factory Df2.foo() => null;
+}
+
+class Ef2<X extends TdE> {
+  factory Ef2.foo() => null;
+}
+
+class Ff2<X extends TdF> {
+  factory Ff2.foo() => null;
+}
+
+class Gf2<X extends TdG> {
+  factory Gf2.foo() => null;
+}
+
+class Hf2<X extends TdH> {
+  factory Hf2.foo() => null;
+}
+
+class If2<X extends TdI> {
+  factory If2.foo() => null;
+}
+
+class Jf2<X extends TdJ> {
+  factory Jf2.foo() => null;
+}
+
+class Kf2<X extends TdK> {
+  factory Kf2.foo() => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/clone_function_type.dart.legacy.expect b/pkg/front_end/testcases/clone_function_type.dart.legacy.expect
new file mode 100644
index 0000000..ef2a4c6
--- /dev/null
+++ b/pkg/front_end/testcases/clone_function_type.dart.legacy.expect
@@ -0,0 +1,596 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
+// class Qm1<Z> = Object with Am1<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
+// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
+// class Qm2<Z> = Object with Am2<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
+// class Qm1<Z> = Object with Am1<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
+// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
+// class Qm2<Z> = Object with Am2<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef TdB = (core::int) → dynamic;
+typedef TdC = (core::int) → dynamic;
+typedef TdD = () → core::int;
+typedef TdE = () → dynamic;
+typedef TdF = () → dynamic;
+typedef TdG = ({x: core::int}) → dynamic;
+typedef TdH = ([core::int]) → dynamic;
+typedef TdI = ([core::int]) → dynamic;
+typedef TdJ = (core::Function) → dynamic;
+typedef TdK = () → (() → core::Function) → dynamic;
+class Am1<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am1<self::Am1::X, self::Am1::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm1<Z extends core::Object = dynamic> extends self::_Bm1&Object&Am1<self::Bm1::Z> {
+  synthetic constructor •() → self::Bm1<self::Bm1::Z>
+    : super self::_Bm1&Object&Am1::•()
+    ;
+}
+abstract class _Cm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Cm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm1<Z extends core::Object = dynamic> extends self::_Cm1&Object&Am1<self::Cm1::Z> {
+  synthetic constructor •() → self::Cm1<self::Cm1::Z>
+    : super self::_Cm1&Object&Am1::•()
+    ;
+}
+abstract class _Dm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::_Dm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm1<Z extends core::Object = dynamic> extends self::_Dm1&Object&Am1<self::Dm1::Z> {
+  synthetic constructor •() → self::Dm1<self::Dm1::Z>
+    : super self::_Dm1&Object&Am1::•()
+    ;
+}
+abstract class _Em1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::_Em1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Em1<Z extends core::Object = dynamic> extends self::_Em1&Object&Am1<self::Em1::Z> {
+  synthetic constructor •() → self::Em1<self::Em1::Z>
+    : super self::_Em1&Object&Am1::•()
+    ;
+}
+abstract class _Fm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::_Fm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm1<Z extends core::Object = dynamic> extends self::_Fm1&Object&Am1<self::Fm1::Z> {
+  synthetic constructor •() → self::Fm1<self::Fm1::Z>
+    : super self::_Fm1&Object&Am1::•()
+    ;
+}
+abstract class _Gm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::_Gm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm1<Z extends core::Object = dynamic> extends self::_Gm1&Object&Am1<self::Gm1::Z> {
+  synthetic constructor •() → self::Gm1<self::Gm1::Z>
+    : super self::_Gm1&Object&Am1::•()
+    ;
+}
+abstract class _Hm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::_Hm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm1<Z extends core::Object = dynamic> extends self::_Hm1&Object&Am1<self::Hm1::Z> {
+  synthetic constructor •() → self::Hm1<self::Hm1::Z>
+    : super self::_Hm1&Object&Am1::•()
+    ;
+}
+abstract class _Im1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::_Im1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Im1<Z extends core::Object = dynamic> extends self::_Im1&Object&Am1<self::Im1::Z> {
+  synthetic constructor •() → self::Im1<self::Im1::Z>
+    : super self::_Im1&Object&Am1::•()
+    ;
+}
+abstract class _Jm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::_Jm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm1<Z extends core::Object = dynamic> extends self::_Jm1&Object&Am1<self::Jm1::Z> {
+  synthetic constructor •() → self::Jm1<self::Jm1::Z>
+    : super self::_Jm1&Object&Am1::•()
+    ;
+}
+abstract class _Km1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::_Km1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Km1<Z extends core::Object = dynamic> extends self::_Km1&Object&Am1<self::Km1::Z> {
+  synthetic constructor •() → self::Km1<self::Km1::Z>
+    : super self::_Km1&Object&Am1::•()
+    ;
+}
+abstract class _Lm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::_Lm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm1<Z extends core::Object = dynamic> extends self::_Lm1&Object&Am1<self::Lm1::Z> {
+  synthetic constructor •() → self::Lm1<self::Lm1::Z>
+    : super self::_Lm1&Object&Am1::•()
+    ;
+}
+class Mm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Mm1::Z> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Nm1::Z> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::Om1::Z> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Pm1::Z> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Qm1::Z> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::Um1::Z> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () → dynamic = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm2<Z extends core::Object = dynamic> extends self::_Bm2&Object&Am2<self::Bm2::Z> {
+  synthetic constructor •() → self::Bm2<self::Bm2::Z>
+    : super self::_Bm2&Object&Am2::•()
+    ;
+}
+abstract class _Cm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Cm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm2<Z extends core::Object = dynamic> extends self::_Cm2&Object&Am2<self::Cm2::Z> {
+  synthetic constructor •() → self::Cm2<self::Cm2::Z>
+    : super self::_Cm2&Object&Am2::•()
+    ;
+}
+abstract class _Dm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::_Dm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm2<Z extends core::Object = dynamic> extends self::_Dm2&Object&Am2<self::Dm2::Z> {
+  synthetic constructor •() → self::Dm2<self::Dm2::Z>
+    : super self::_Dm2&Object&Am2::•()
+    ;
+}
+abstract class _Em2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::_Em2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Em2<Z extends core::Object = dynamic> extends self::_Em2&Object&Am2<self::Em2::Z> {
+  synthetic constructor •() → self::Em2<self::Em2::Z>
+    : super self::_Em2&Object&Am2::•()
+    ;
+}
+abstract class _Fm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::_Fm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm2<Z extends core::Object = dynamic> extends self::_Fm2&Object&Am2<self::Fm2::Z> {
+  synthetic constructor •() → self::Fm2<self::Fm2::Z>
+    : super self::_Fm2&Object&Am2::•()
+    ;
+}
+abstract class _Gm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::_Gm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm2<Z extends core::Object = dynamic> extends self::_Gm2&Object&Am2<self::Gm2::Z> {
+  synthetic constructor •() → self::Gm2<self::Gm2::Z>
+    : super self::_Gm2&Object&Am2::•()
+    ;
+}
+abstract class _Hm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::_Hm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm2<Z extends core::Object = dynamic> extends self::_Hm2&Object&Am2<self::Hm2::Z> {
+  synthetic constructor •() → self::Hm2<self::Hm2::Z>
+    : super self::_Hm2&Object&Am2::•()
+    ;
+}
+abstract class _Im2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::_Im2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Im2<Z extends core::Object = dynamic> extends self::_Im2&Object&Am2<self::Im2::Z> {
+  synthetic constructor •() → self::Im2<self::Im2::Z>
+    : super self::_Im2&Object&Am2::•()
+    ;
+}
+abstract class _Jm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::_Jm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm2<Z extends core::Object = dynamic> extends self::_Jm2&Object&Am2<self::Jm2::Z> {
+  synthetic constructor •() → self::Jm2<self::Jm2::Z>
+    : super self::_Jm2&Object&Am2::•()
+    ;
+}
+abstract class _Km2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::_Km2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Km2<Z extends core::Object = dynamic> extends self::_Km2&Object&Am2<self::Km2::Z> {
+  synthetic constructor •() → self::Km2<self::Km2::Z>
+    : super self::_Km2&Object&Am2::•()
+    ;
+}
+abstract class _Lm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::_Lm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm2<Z extends core::Object = dynamic> extends self::_Lm2&Object&Am2<self::Lm2::Z> {
+  synthetic constructor •() → self::Lm2<self::Lm2::Z>
+    : super self::_Lm2&Object&Am2::•()
+    ;
+}
+class Mm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Mm2::Z> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Nm2::Z> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::Om2::Z> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Pm2::Z> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Qm2::Z> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::Um2::Z> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Am3<L extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am3<self::Am3::L, self::Am3::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm3<Z extends core::Object = dynamic> extends self::_Bm3&Object&Am3<self::Bm3::Z> {
+  synthetic constructor •() → self::Bm3<self::Bm3::Z>
+    : super self::_Bm3&Object&Am3::•()
+    ;
+}
+abstract class _Cm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Cm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm3<Z extends core::Object = dynamic> extends self::_Cm3&Object&Am3<self::Cm3::Z> {
+  synthetic constructor •() → self::Cm3<self::Cm3::Z>
+    : super self::_Cm3&Object&Am3::•()
+    ;
+}
+abstract class _Dm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → core::int, self::_Dm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm3<Z extends core::Object = dynamic> extends self::_Dm3&Object&Am3<self::Dm3::Z> {
+  synthetic constructor •() → self::Dm3<self::Dm3::Z>
+    : super self::_Dm3&Object&Am3::•()
+    ;
+}
+abstract class _Em3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → dynamic, self::_Em3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Em3<Z extends core::Object = dynamic> extends self::_Em3&Object&Am3<self::Em3::Z> {
+  synthetic constructor •() → self::Em3<self::Em3::Z>
+    : super self::_Em3&Object&Am3::•()
+    ;
+}
+abstract class _Fm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → dynamic, self::_Fm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm3<Z extends core::Object = dynamic> extends self::_Fm3&Object&Am3<self::Fm3::Z> {
+  synthetic constructor •() → self::Fm3<self::Fm3::Z>
+    : super self::_Fm3&Object&Am3::•()
+    ;
+}
+abstract class _Gm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<({x: core::int}) → dynamic, self::_Gm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm3<Z extends core::Object = dynamic> extends self::_Gm3&Object&Am3<self::Gm3::Z> {
+  synthetic constructor •() → self::Gm3<self::Gm3::Z>
+    : super self::_Gm3&Object&Am3::•()
+    ;
+}
+abstract class _Hm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<([core::int]) → dynamic, self::_Hm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm3<Z extends core::Object = dynamic> extends self::_Hm3&Object&Am3<self::Hm3::Z> {
+  synthetic constructor •() → self::Hm3<self::Hm3::Z>
+    : super self::_Hm3&Object&Am3::•()
+    ;
+}
+abstract class _Im3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<([core::int]) → dynamic, self::_Im3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Im3<Z extends core::Object = dynamic> extends self::_Im3&Object&Am3<self::Im3::Z> {
+  synthetic constructor •() → self::Im3<self::Im3::Z>
+    : super self::_Im3&Object&Am3::•()
+    ;
+}
+abstract class _Jm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::Function) → dynamic, self::_Jm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm3<Z extends core::Object = dynamic> extends self::_Jm3&Object&Am3<self::Jm3::Z> {
+  synthetic constructor •() → self::Jm3<self::Jm3::Z>
+    : super self::_Jm3&Object&Am3::•()
+    ;
+}
+abstract class _Km3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → (() → core::Function) → dynamic, self::_Km3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Km3<Z extends core::Object = dynamic> extends self::_Km3&Object&Am3<self::Km3::Z> {
+  synthetic constructor •() → self::Km3<self::Km3::Z>
+    : super self::_Km3&Object&Am3::•()
+    ;
+}
+class Af1<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
+    return null;
+}
+class Bf1<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
+    return null;
+}
+class Cf1<X extends () → core::int = dynamic> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
+    return null;
+}
+class Df1<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
+    return null;
+}
+class Ef1<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
+    return null;
+}
+class Ff1<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
+    return null;
+}
+class Gf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
+    return null;
+}
+class Hf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
+    return null;
+}
+class If1<X extends core::Function = dynamic> extends core::Object {
+  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
+    return null;
+}
+class Jf1<X extends (core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
+    return null;
+}
+class Kf1<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
+    return null;
+}
+class Bf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
+    return null;
+}
+class Cf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
+    return null;
+}
+class Df2<X extends () → core::int = dynamic> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
+    return null;
+}
+class Ef2<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
+    return null;
+}
+class Ff2<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
+    return null;
+}
+class Gf2<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
+    return null;
+}
+class Hf2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
+    return null;
+}
+class If2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
+    return null;
+}
+class Jf2<X extends (core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
+    return null;
+}
+class Kf2<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/clone_function_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/clone_function_type.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5523c08
--- /dev/null
+++ b/pkg/front_end/testcases/clone_function_type.dart.legacy.transformed.expect
@@ -0,0 +1,570 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
+// class Qm1<Z> = Object with Am1<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
+// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
+// class Qm2<Z> = Object with Am2<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef TdB = (core::int) → dynamic;
+typedef TdC = (core::int) → dynamic;
+typedef TdD = () → core::int;
+typedef TdE = () → dynamic;
+typedef TdF = () → dynamic;
+typedef TdG = ({x: core::int}) → dynamic;
+typedef TdH = ([core::int]) → dynamic;
+typedef TdI = ([core::int]) → dynamic;
+typedef TdJ = (core::Function) → dynamic;
+typedef TdK = () → (() → core::Function) → dynamic;
+class Am1<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am1<self::Am1::X, self::Am1::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm1<Z extends core::Object = dynamic> extends self::_Bm1&Object&Am1<self::Bm1::Z> {
+  synthetic constructor •() → self::Bm1<self::Bm1::Z>
+    : super self::_Bm1&Object&Am1::•()
+    ;
+}
+abstract class _Cm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::_Cm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm1<Z extends core::Object = dynamic> extends self::_Cm1&Object&Am1<self::Cm1::Z> {
+  synthetic constructor •() → self::Cm1<self::Cm1::Z>
+    : super self::_Cm1&Object&Am1::•()
+    ;
+}
+abstract class _Dm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → core::int, self::_Dm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm1<Z extends core::Object = dynamic> extends self::_Dm1&Object&Am1<self::Dm1::Z> {
+  synthetic constructor •() → self::Dm1<self::Dm1::Z>
+    : super self::_Dm1&Object&Am1::•()
+    ;
+}
+abstract class _Em1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::_Em1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Em1<Z extends core::Object = dynamic> extends self::_Em1&Object&Am1<self::Em1::Z> {
+  synthetic constructor •() → self::Em1<self::Em1::Z>
+    : super self::_Em1&Object&Am1::•()
+    ;
+}
+abstract class _Fm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::_Fm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm1<Z extends core::Object = dynamic> extends self::_Fm1&Object&Am1<self::Fm1::Z> {
+  synthetic constructor •() → self::Fm1<self::Fm1::Z>
+    : super self::_Fm1&Object&Am1::•()
+    ;
+}
+abstract class _Gm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<({x: core::int}) → dynamic, self::_Gm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm1<Z extends core::Object = dynamic> extends self::_Gm1&Object&Am1<self::Gm1::Z> {
+  synthetic constructor •() → self::Gm1<self::Gm1::Z>
+    : super self::_Gm1&Object&Am1::•()
+    ;
+}
+abstract class _Hm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::_Hm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm1<Z extends core::Object = dynamic> extends self::_Hm1&Object&Am1<self::Hm1::Z> {
+  synthetic constructor •() → self::Hm1<self::Hm1::Z>
+    : super self::_Hm1&Object&Am1::•()
+    ;
+}
+abstract class _Im1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::_Im1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Im1<Z extends core::Object = dynamic> extends self::_Im1&Object&Am1<self::Im1::Z> {
+  synthetic constructor •() → self::Im1<self::Im1::Z>
+    : super self::_Im1&Object&Am1::•()
+    ;
+}
+abstract class _Jm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<core::Function, self::_Jm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm1<Z extends core::Object = dynamic> extends self::_Jm1&Object&Am1<self::Jm1::Z> {
+  synthetic constructor •() → self::Jm1<self::Jm1::Z>
+    : super self::_Jm1&Object&Am1::•()
+    ;
+}
+abstract class _Km1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::Function) → dynamic, self::_Km1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Km1<Z extends core::Object = dynamic> extends self::_Km1&Object&Am1<self::Km1::Z> {
+  synthetic constructor •() → self::Km1<self::Km1::Z>
+    : super self::_Km1&Object&Am1::•()
+    ;
+}
+abstract class _Lm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → (() → core::Function) → dynamic, self::_Lm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm1<Z extends core::Object = dynamic> extends self::_Lm1&Object&Am1<self::Lm1::Z> {
+  synthetic constructor •() → self::Lm1<self::Lm1::Z>
+    : super self::_Lm1&Object&Am1::•()
+    ;
+}
+class Mm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::Mm1::Z> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::Nm1::Z> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → core::int, self::Om1::Z> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::Pm1::Z> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::Qm1::Z> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<core::Function, self::Um1::Z> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () → dynamic = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm2<Z extends core::Object = dynamic> extends self::_Bm2&Object&Am2<self::Bm2::Z> {
+  synthetic constructor •() → self::Bm2<self::Bm2::Z>
+    : super self::_Bm2&Object&Am2::•()
+    ;
+}
+abstract class _Cm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::_Cm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm2<Z extends core::Object = dynamic> extends self::_Cm2&Object&Am2<self::Cm2::Z> {
+  synthetic constructor •() → self::Cm2<self::Cm2::Z>
+    : super self::_Cm2&Object&Am2::•()
+    ;
+}
+abstract class _Dm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → core::int, self::_Dm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm2<Z extends core::Object = dynamic> extends self::_Dm2&Object&Am2<self::Dm2::Z> {
+  synthetic constructor •() → self::Dm2<self::Dm2::Z>
+    : super self::_Dm2&Object&Am2::•()
+    ;
+}
+abstract class _Em2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::_Em2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Em2<Z extends core::Object = dynamic> extends self::_Em2&Object&Am2<self::Em2::Z> {
+  synthetic constructor •() → self::Em2<self::Em2::Z>
+    : super self::_Em2&Object&Am2::•()
+    ;
+}
+abstract class _Fm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::_Fm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm2<Z extends core::Object = dynamic> extends self::_Fm2&Object&Am2<self::Fm2::Z> {
+  synthetic constructor •() → self::Fm2<self::Fm2::Z>
+    : super self::_Fm2&Object&Am2::•()
+    ;
+}
+abstract class _Gm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<({x: core::int}) → dynamic, self::_Gm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm2<Z extends core::Object = dynamic> extends self::_Gm2&Object&Am2<self::Gm2::Z> {
+  synthetic constructor •() → self::Gm2<self::Gm2::Z>
+    : super self::_Gm2&Object&Am2::•()
+    ;
+}
+abstract class _Hm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::_Hm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm2<Z extends core::Object = dynamic> extends self::_Hm2&Object&Am2<self::Hm2::Z> {
+  synthetic constructor •() → self::Hm2<self::Hm2::Z>
+    : super self::_Hm2&Object&Am2::•()
+    ;
+}
+abstract class _Im2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::_Im2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Im2<Z extends core::Object = dynamic> extends self::_Im2&Object&Am2<self::Im2::Z> {
+  synthetic constructor •() → self::Im2<self::Im2::Z>
+    : super self::_Im2&Object&Am2::•()
+    ;
+}
+abstract class _Jm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<core::Function, self::_Jm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm2<Z extends core::Object = dynamic> extends self::_Jm2&Object&Am2<self::Jm2::Z> {
+  synthetic constructor •() → self::Jm2<self::Jm2::Z>
+    : super self::_Jm2&Object&Am2::•()
+    ;
+}
+abstract class _Km2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::Function) → dynamic, self::_Km2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Km2<Z extends core::Object = dynamic> extends self::_Km2&Object&Am2<self::Km2::Z> {
+  synthetic constructor •() → self::Km2<self::Km2::Z>
+    : super self::_Km2&Object&Am2::•()
+    ;
+}
+abstract class _Lm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → (() → core::Function) → dynamic, self::_Lm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm2<Z extends core::Object = dynamic> extends self::_Lm2&Object&Am2<self::Lm2::Z> {
+  synthetic constructor •() → self::Lm2<self::Lm2::Z>
+    : super self::_Lm2&Object&Am2::•()
+    ;
+}
+class Mm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::Mm2::Z> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::Nm2::Z> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → core::int, self::Om2::Z> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::Pm2::Z> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::Qm2::Z> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<core::Function, self::Um2::Z> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Am3<L extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am3<self::Am3::L, self::Am3::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm3<Z extends core::Object = dynamic> extends self::_Bm3&Object&Am3<self::Bm3::Z> {
+  synthetic constructor •() → self::Bm3<self::Bm3::Z>
+    : super self::_Bm3&Object&Am3::•()
+    ;
+}
+abstract class _Cm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<(core::int) → dynamic, self::_Cm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm3<Z extends core::Object = dynamic> extends self::_Cm3&Object&Am3<self::Cm3::Z> {
+  synthetic constructor •() → self::Cm3<self::Cm3::Z>
+    : super self::_Cm3&Object&Am3::•()
+    ;
+}
+abstract class _Dm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<() → core::int, self::_Dm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm3<Z extends core::Object = dynamic> extends self::_Dm3&Object&Am3<self::Dm3::Z> {
+  synthetic constructor •() → self::Dm3<self::Dm3::Z>
+    : super self::_Dm3&Object&Am3::•()
+    ;
+}
+abstract class _Em3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<() → dynamic, self::_Em3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Em3<Z extends core::Object = dynamic> extends self::_Em3&Object&Am3<self::Em3::Z> {
+  synthetic constructor •() → self::Em3<self::Em3::Z>
+    : super self::_Em3&Object&Am3::•()
+    ;
+}
+abstract class _Fm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<() → dynamic, self::_Fm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm3<Z extends core::Object = dynamic> extends self::_Fm3&Object&Am3<self::Fm3::Z> {
+  synthetic constructor •() → self::Fm3<self::Fm3::Z>
+    : super self::_Fm3&Object&Am3::•()
+    ;
+}
+abstract class _Gm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<({x: core::int}) → dynamic, self::_Gm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm3<Z extends core::Object = dynamic> extends self::_Gm3&Object&Am3<self::Gm3::Z> {
+  synthetic constructor •() → self::Gm3<self::Gm3::Z>
+    : super self::_Gm3&Object&Am3::•()
+    ;
+}
+abstract class _Hm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<([core::int]) → dynamic, self::_Hm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm3<Z extends core::Object = dynamic> extends self::_Hm3&Object&Am3<self::Hm3::Z> {
+  synthetic constructor •() → self::Hm3<self::Hm3::Z>
+    : super self::_Hm3&Object&Am3::•()
+    ;
+}
+abstract class _Im3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<([core::int]) → dynamic, self::_Im3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Im3<Z extends core::Object = dynamic> extends self::_Im3&Object&Am3<self::Im3::Z> {
+  synthetic constructor •() → self::Im3<self::Im3::Z>
+    : super self::_Im3&Object&Am3::•()
+    ;
+}
+abstract class _Jm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<(core::Function) → dynamic, self::_Jm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm3<Z extends core::Object = dynamic> extends self::_Jm3&Object&Am3<self::Jm3::Z> {
+  synthetic constructor •() → self::Jm3<self::Jm3::Z>
+    : super self::_Jm3&Object&Am3::•()
+    ;
+}
+abstract class _Km3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<() → (() → core::Function) → dynamic, self::_Km3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Km3<Z extends core::Object = dynamic> extends self::_Km3&Object&Am3<self::Km3::Z> {
+  synthetic constructor •() → self::Km3<self::Km3::Z>
+    : super self::_Km3&Object&Am3::•()
+    ;
+}
+class Af1<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
+    return null;
+}
+class Bf1<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
+    return null;
+}
+class Cf1<X extends () → core::int = dynamic> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
+    return null;
+}
+class Df1<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
+    return null;
+}
+class Ef1<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
+    return null;
+}
+class Ff1<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
+    return null;
+}
+class Gf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
+    return null;
+}
+class Hf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
+    return null;
+}
+class If1<X extends core::Function = dynamic> extends core::Object {
+  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
+    return null;
+}
+class Jf1<X extends (core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
+    return null;
+}
+class Kf1<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
+    return null;
+}
+class Bf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
+    return null;
+}
+class Cf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
+    return null;
+}
+class Df2<X extends () → core::int = dynamic> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
+    return null;
+}
+class Ef2<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
+    return null;
+}
+class Ff2<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
+    return null;
+}
+class Gf2<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
+    return null;
+}
+class Hf2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
+    return null;
+}
+class If2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
+    return null;
+}
+class Jf2<X extends (core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
+    return null;
+}
+class Kf2<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/clone_function_type.dart.outline.expect b/pkg/front_end/testcases/clone_function_type.dart.outline.expect
new file mode 100644
index 0000000..6d46fb3
--- /dev/null
+++ b/pkg/front_end/testcases/clone_function_type.dart.outline.expect
@@ -0,0 +1,536 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
+// class Qm1<Z> = Object with Am1<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
+// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
+// class Qm2<Z> = Object with Am2<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef TdB = (core::int) → dynamic;
+typedef TdC = (core::int) → dynamic;
+typedef TdD = () → core::int;
+typedef TdE = () → dynamic;
+typedef TdF = () → dynamic;
+typedef TdG = ({x: core::int}) → dynamic;
+typedef TdH = ([core::int]) → dynamic;
+typedef TdI = ([core::int]) → dynamic;
+typedef TdJ = (core::Function) → dynamic;
+typedef TdK = () → (() → core::Function) → dynamic;
+class Am1<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am1<self::Am1::X, self::Am1::Y>
+    ;
+}
+abstract class _Bm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm1<Z extends core::Object = dynamic> extends self::_Bm1&Object&Am1<self::Bm1::Z> {
+  synthetic constructor •() → self::Bm1<self::Bm1::Z>
+    ;
+}
+abstract class _Cm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Cm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm1<Z extends core::Object = dynamic> extends self::_Cm1&Object&Am1<self::Cm1::Z> {
+  synthetic constructor •() → self::Cm1<self::Cm1::Z>
+    ;
+}
+abstract class _Dm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::_Dm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm1<Z extends core::Object = dynamic> extends self::_Dm1&Object&Am1<self::Dm1::Z> {
+  synthetic constructor •() → self::Dm1<self::Dm1::Z>
+    ;
+}
+abstract class _Em1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::_Em1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Em1<Z extends core::Object = dynamic> extends self::_Em1&Object&Am1<self::Em1::Z> {
+  synthetic constructor •() → self::Em1<self::Em1::Z>
+    ;
+}
+abstract class _Fm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::_Fm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm1<Z extends core::Object = dynamic> extends self::_Fm1&Object&Am1<self::Fm1::Z> {
+  synthetic constructor •() → self::Fm1<self::Fm1::Z>
+    ;
+}
+abstract class _Gm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::_Gm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm1<Z extends core::Object = dynamic> extends self::_Gm1&Object&Am1<self::Gm1::Z> {
+  synthetic constructor •() → self::Gm1<self::Gm1::Z>
+    ;
+}
+abstract class _Hm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::_Hm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm1<Z extends core::Object = dynamic> extends self::_Hm1&Object&Am1<self::Hm1::Z> {
+  synthetic constructor •() → self::Hm1<self::Hm1::Z>
+    ;
+}
+abstract class _Im1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::_Im1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Im1<Z extends core::Object = dynamic> extends self::_Im1&Object&Am1<self::Im1::Z> {
+  synthetic constructor •() → self::Im1<self::Im1::Z>
+    ;
+}
+abstract class _Jm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::_Jm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm1<Z extends core::Object = dynamic> extends self::_Jm1&Object&Am1<self::Jm1::Z> {
+  synthetic constructor •() → self::Jm1<self::Jm1::Z>
+    ;
+}
+abstract class _Km1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::_Km1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Km1<Z extends core::Object = dynamic> extends self::_Km1&Object&Am1<self::Km1::Z> {
+  synthetic constructor •() → self::Km1<self::Km1::Z>
+    ;
+}
+abstract class _Lm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::_Lm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm1<Z extends core::Object = dynamic> extends self::_Lm1&Object&Am1<self::Lm1::Z> {
+  synthetic constructor •() → self::Lm1<self::Lm1::Z>
+    ;
+}
+class Mm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Mm1::Z> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Nm1::Z> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::Om1::Z> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Pm1::Z> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Qm1::Z> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::Um1::Z> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () → dynamic = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm2<Z extends core::Object = dynamic> extends self::_Bm2&Object&Am2<self::Bm2::Z> {
+  synthetic constructor •() → self::Bm2<self::Bm2::Z>
+    ;
+}
+abstract class _Cm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Cm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm2<Z extends core::Object = dynamic> extends self::_Cm2&Object&Am2<self::Cm2::Z> {
+  synthetic constructor •() → self::Cm2<self::Cm2::Z>
+    ;
+}
+abstract class _Dm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::_Dm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm2<Z extends core::Object = dynamic> extends self::_Dm2&Object&Am2<self::Dm2::Z> {
+  synthetic constructor •() → self::Dm2<self::Dm2::Z>
+    ;
+}
+abstract class _Em2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::_Em2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Em2<Z extends core::Object = dynamic> extends self::_Em2&Object&Am2<self::Em2::Z> {
+  synthetic constructor •() → self::Em2<self::Em2::Z>
+    ;
+}
+abstract class _Fm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::_Fm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm2<Z extends core::Object = dynamic> extends self::_Fm2&Object&Am2<self::Fm2::Z> {
+  synthetic constructor •() → self::Fm2<self::Fm2::Z>
+    ;
+}
+abstract class _Gm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::_Gm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm2<Z extends core::Object = dynamic> extends self::_Gm2&Object&Am2<self::Gm2::Z> {
+  synthetic constructor •() → self::Gm2<self::Gm2::Z>
+    ;
+}
+abstract class _Hm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::_Hm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm2<Z extends core::Object = dynamic> extends self::_Hm2&Object&Am2<self::Hm2::Z> {
+  synthetic constructor •() → self::Hm2<self::Hm2::Z>
+    ;
+}
+abstract class _Im2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::_Im2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Im2<Z extends core::Object = dynamic> extends self::_Im2&Object&Am2<self::Im2::Z> {
+  synthetic constructor •() → self::Im2<self::Im2::Z>
+    ;
+}
+abstract class _Jm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::_Jm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm2<Z extends core::Object = dynamic> extends self::_Jm2&Object&Am2<self::Jm2::Z> {
+  synthetic constructor •() → self::Jm2<self::Jm2::Z>
+    ;
+}
+abstract class _Km2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::_Km2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Km2<Z extends core::Object = dynamic> extends self::_Km2&Object&Am2<self::Km2::Z> {
+  synthetic constructor •() → self::Km2<self::Km2::Z>
+    ;
+}
+abstract class _Lm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::_Lm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm2<Z extends core::Object = dynamic> extends self::_Lm2&Object&Am2<self::Lm2::Z> {
+  synthetic constructor •() → self::Lm2<self::Lm2::Z>
+    ;
+}
+class Mm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Mm2::Z> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Nm2::Z> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::Om2::Z> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Pm2::Z> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Qm2::Z> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::Um2::Z> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Am3<L extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am3<self::Am3::L, self::Am3::Y>
+    ;
+}
+abstract class _Bm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm3<Z extends core::Object = dynamic> extends self::_Bm3&Object&Am3<self::Bm3::Z> {
+  synthetic constructor •() → self::Bm3<self::Bm3::Z>
+    ;
+}
+abstract class _Cm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Cm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm3<Z extends core::Object = dynamic> extends self::_Cm3&Object&Am3<self::Cm3::Z> {
+  synthetic constructor •() → self::Cm3<self::Cm3::Z>
+    ;
+}
+abstract class _Dm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → core::int, self::_Dm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm3<Z extends core::Object = dynamic> extends self::_Dm3&Object&Am3<self::Dm3::Z> {
+  synthetic constructor •() → self::Dm3<self::Dm3::Z>
+    ;
+}
+abstract class _Em3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → dynamic, self::_Em3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Em3<Z extends core::Object = dynamic> extends self::_Em3&Object&Am3<self::Em3::Z> {
+  synthetic constructor •() → self::Em3<self::Em3::Z>
+    ;
+}
+abstract class _Fm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → dynamic, self::_Fm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm3<Z extends core::Object = dynamic> extends self::_Fm3&Object&Am3<self::Fm3::Z> {
+  synthetic constructor •() → self::Fm3<self::Fm3::Z>
+    ;
+}
+abstract class _Gm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<({x: core::int}) → dynamic, self::_Gm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm3<Z extends core::Object = dynamic> extends self::_Gm3&Object&Am3<self::Gm3::Z> {
+  synthetic constructor •() → self::Gm3<self::Gm3::Z>
+    ;
+}
+abstract class _Hm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<([core::int]) → dynamic, self::_Hm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm3<Z extends core::Object = dynamic> extends self::_Hm3&Object&Am3<self::Hm3::Z> {
+  synthetic constructor •() → self::Hm3<self::Hm3::Z>
+    ;
+}
+abstract class _Im3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<([core::int]) → dynamic, self::_Im3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Im3<Z extends core::Object = dynamic> extends self::_Im3&Object&Am3<self::Im3::Z> {
+  synthetic constructor •() → self::Im3<self::Im3::Z>
+    ;
+}
+abstract class _Jm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::Function) → dynamic, self::_Jm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm3<Z extends core::Object = dynamic> extends self::_Jm3&Object&Am3<self::Jm3::Z> {
+  synthetic constructor •() → self::Jm3<self::Jm3::Z>
+    ;
+}
+abstract class _Km3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → (() → core::Function) → dynamic, self::_Km3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Km3<Z extends core::Object = dynamic> extends self::_Km3&Object&Am3<self::Km3::Z> {
+  synthetic constructor •() → self::Km3<self::Km3::Z>
+    ;
+}
+class Af1<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
+    ;
+}
+class Bf1<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
+    ;
+}
+class Cf1<X extends () → core::int = dynamic> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
+    ;
+}
+class Df1<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
+    ;
+}
+class Ef1<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
+    ;
+}
+class Ff1<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
+    ;
+}
+class Gf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
+    ;
+}
+class Hf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
+    ;
+}
+class If1<X extends core::Function = dynamic> extends core::Object {
+  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
+    ;
+}
+class Jf1<X extends (core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
+    ;
+}
+class Kf1<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
+    ;
+}
+class Bf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
+    ;
+}
+class Cf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
+    ;
+}
+class Df2<X extends () → core::int = dynamic> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
+    ;
+}
+class Ef2<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
+    ;
+}
+class Ff2<X extends () → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
+    ;
+}
+class Gf2<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
+    ;
+}
+class Hf2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
+    ;
+}
+class If2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
+    ;
+}
+class Jf2<X extends (core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
+    ;
+}
+class Kf2<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/clone_function_type.dart.strong.expect b/pkg/front_end/testcases/clone_function_type.dart.strong.expect
new file mode 100644
index 0000000..993f5a8
--- /dev/null
+++ b/pkg/front_end/testcases/clone_function_type.dart.strong.expect
@@ -0,0 +1,708 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
+// class Qm1<Z> = Object with Am1<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
+// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
+// class Qm2<Z> = Object with Am2<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bm2<Z> extends Object with Am2<Function(int), Z> {}
+//       ^
+// pkg/front_end/testcases/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
+//       ^
+// pkg/front_end/testcases/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Jm2<Z> extends Object with Am2<Function, Z> {}
+//       ^
+// pkg/front_end/testcases/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
+//       ^
+// pkg/front_end/testcases/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Mm2<Z> = Object with Am2<Function(int), Z>;
+//       ^
+// pkg/front_end/testcases/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Nm2<Z> = Object with Am2<Function(int x), Z>;
+//       ^
+// pkg/front_end/testcases/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Um2<Z> = Object with Am2<Function, Z>;
+//       ^
+// pkg/front_end/testcases/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
+//       ^
+// pkg/front_end/testcases/clone_function_type.dart:64:11: Context: This is the type variable whose bound isn't conformed to.
+// class Am2<X extends Function(), Y> {}
+//           ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
+// class Qm1<Z> = Object with Am1<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
+// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
+// class Qm2<Z> = Object with Am2<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bm2<Z> extends Object with Am2<Function(int), Z> {}
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Jm2<Z> extends Object with Am2<Function, Z> {}
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Mm2<Z> = Object with Am2<Function(int), Z>;
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Nm2<Z> = Object with Am2<Function(int x), Z>;
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Um2<Z> = Object with Am2<Function, Z>;
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef TdB = (core::int) → dynamic;
+typedef TdC = (core::int) → dynamic;
+typedef TdD = () → core::int;
+typedef TdE = () → dynamic;
+typedef TdF = () → dynamic;
+typedef TdG = ({x: core::int}) → dynamic;
+typedef TdH = ([core::int]) → dynamic;
+typedef TdI = ([core::int]) → dynamic;
+typedef TdJ = (core::Function) → dynamic;
+typedef TdK = () → (() → core::Function) → dynamic;
+class Am1<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am1<self::Am1::X, self::Am1::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm1<Z extends core::Object = dynamic> extends self::_Bm1&Object&Am1<self::Bm1::Z> {
+  synthetic constructor •() → self::Bm1<self::Bm1::Z>
+    : super self::_Bm1&Object&Am1::•()
+    ;
+}
+abstract class _Cm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Cm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm1<Z extends core::Object = dynamic> extends self::_Cm1&Object&Am1<self::Cm1::Z> {
+  synthetic constructor •() → self::Cm1<self::Cm1::Z>
+    : super self::_Cm1&Object&Am1::•()
+    ;
+}
+abstract class _Dm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::_Dm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm1<Z extends core::Object = dynamic> extends self::_Dm1&Object&Am1<self::Dm1::Z> {
+  synthetic constructor •() → self::Dm1<self::Dm1::Z>
+    : super self::_Dm1&Object&Am1::•()
+    ;
+}
+abstract class _Em1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::_Em1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Em1<Z extends core::Object = dynamic> extends self::_Em1&Object&Am1<self::Em1::Z> {
+  synthetic constructor •() → self::Em1<self::Em1::Z>
+    : super self::_Em1&Object&Am1::•()
+    ;
+}
+abstract class _Fm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::_Fm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm1<Z extends core::Object = dynamic> extends self::_Fm1&Object&Am1<self::Fm1::Z> {
+  synthetic constructor •() → self::Fm1<self::Fm1::Z>
+    : super self::_Fm1&Object&Am1::•()
+    ;
+}
+abstract class _Gm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::_Gm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm1<Z extends core::Object = dynamic> extends self::_Gm1&Object&Am1<self::Gm1::Z> {
+  synthetic constructor •() → self::Gm1<self::Gm1::Z>
+    : super self::_Gm1&Object&Am1::•()
+    ;
+}
+abstract class _Hm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::_Hm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm1<Z extends core::Object = dynamic> extends self::_Hm1&Object&Am1<self::Hm1::Z> {
+  synthetic constructor •() → self::Hm1<self::Hm1::Z>
+    : super self::_Hm1&Object&Am1::•()
+    ;
+}
+abstract class _Im1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::_Im1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Im1<Z extends core::Object = dynamic> extends self::_Im1&Object&Am1<self::Im1::Z> {
+  synthetic constructor •() → self::Im1<self::Im1::Z>
+    : super self::_Im1&Object&Am1::•()
+    ;
+}
+abstract class _Jm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::_Jm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm1<Z extends core::Object = dynamic> extends self::_Jm1&Object&Am1<self::Jm1::Z> {
+  synthetic constructor •() → self::Jm1<self::Jm1::Z>
+    : super self::_Jm1&Object&Am1::•()
+    ;
+}
+abstract class _Km1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::_Km1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Km1<Z extends core::Object = dynamic> extends self::_Km1&Object&Am1<self::Km1::Z> {
+  synthetic constructor •() → self::Km1<self::Km1::Z>
+    : super self::_Km1&Object&Am1::•()
+    ;
+}
+abstract class _Lm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::_Lm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm1<Z extends core::Object = dynamic> extends self::_Lm1&Object&Am1<self::Lm1::Z> {
+  synthetic constructor •() → self::Lm1<self::Lm1::Z>
+    : super self::_Lm1&Object&Am1::•()
+    ;
+}
+class Mm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Mm1::Z> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Nm1::Z> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::Om1::Z> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Pm1::Z> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Qm1::Z> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::Um1::Z> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () → dynamic = () → dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm2<Z extends core::Object = dynamic> extends self::_Bm2&Object&Am2<self::Bm2::Z> {
+  synthetic constructor •() → self::Bm2<self::Bm2::Z>
+    : super self::_Bm2&Object&Am2::•()
+    ;
+}
+abstract class _Cm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Cm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm2<Z extends core::Object = dynamic> extends self::_Cm2&Object&Am2<self::Cm2::Z> {
+  synthetic constructor •() → self::Cm2<self::Cm2::Z>
+    : super self::_Cm2&Object&Am2::•()
+    ;
+}
+abstract class _Dm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::_Dm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm2<Z extends core::Object = dynamic> extends self::_Dm2&Object&Am2<self::Dm2::Z> {
+  synthetic constructor •() → self::Dm2<self::Dm2::Z>
+    : super self::_Dm2&Object&Am2::•()
+    ;
+}
+abstract class _Em2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::_Em2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Em2<Z extends core::Object = dynamic> extends self::_Em2&Object&Am2<self::Em2::Z> {
+  synthetic constructor •() → self::Em2<self::Em2::Z>
+    : super self::_Em2&Object&Am2::•()
+    ;
+}
+abstract class _Fm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::_Fm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm2<Z extends core::Object = dynamic> extends self::_Fm2&Object&Am2<self::Fm2::Z> {
+  synthetic constructor •() → self::Fm2<self::Fm2::Z>
+    : super self::_Fm2&Object&Am2::•()
+    ;
+}
+abstract class _Gm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::_Gm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm2<Z extends core::Object = dynamic> extends self::_Gm2&Object&Am2<self::Gm2::Z> {
+  synthetic constructor •() → self::Gm2<self::Gm2::Z>
+    : super self::_Gm2&Object&Am2::•()
+    ;
+}
+abstract class _Hm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::_Hm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm2<Z extends core::Object = dynamic> extends self::_Hm2&Object&Am2<self::Hm2::Z> {
+  synthetic constructor •() → self::Hm2<self::Hm2::Z>
+    : super self::_Hm2&Object&Am2::•()
+    ;
+}
+abstract class _Im2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::_Im2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Im2<Z extends core::Object = dynamic> extends self::_Im2&Object&Am2<self::Im2::Z> {
+  synthetic constructor •() → self::Im2<self::Im2::Z>
+    : super self::_Im2&Object&Am2::•()
+    ;
+}
+abstract class _Jm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::_Jm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm2<Z extends core::Object = dynamic> extends self::_Jm2&Object&Am2<self::Jm2::Z> {
+  synthetic constructor •() → self::Jm2<self::Jm2::Z>
+    : super self::_Jm2&Object&Am2::•()
+    ;
+}
+abstract class _Km2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::_Km2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Km2<Z extends core::Object = dynamic> extends self::_Km2&Object&Am2<self::Km2::Z> {
+  synthetic constructor •() → self::Km2<self::Km2::Z>
+    : super self::_Km2&Object&Am2::•()
+    ;
+}
+abstract class _Lm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::_Lm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm2<Z extends core::Object = dynamic> extends self::_Lm2&Object&Am2<self::Lm2::Z> {
+  synthetic constructor •() → self::Lm2<self::Lm2::Z>
+    : super self::_Lm2&Object&Am2::•()
+    ;
+}
+class Mm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Mm2::Z> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Nm2::Z> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::Om2::Z> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Pm2::Z> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Qm2::Z> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::Um2::Z> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Am3<L extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am3<self::Am3::L, self::Am3::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm3<Z extends core::Object = dynamic> extends self::_Bm3&Object&Am3<self::Bm3::Z> {
+  synthetic constructor •() → self::Bm3<self::Bm3::Z>
+    : super self::_Bm3&Object&Am3::•()
+    ;
+}
+abstract class _Cm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Cm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm3<Z extends core::Object = dynamic> extends self::_Cm3&Object&Am3<self::Cm3::Z> {
+  synthetic constructor •() → self::Cm3<self::Cm3::Z>
+    : super self::_Cm3&Object&Am3::•()
+    ;
+}
+abstract class _Dm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → core::int, self::_Dm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm3<Z extends core::Object = dynamic> extends self::_Dm3&Object&Am3<self::Dm3::Z> {
+  synthetic constructor •() → self::Dm3<self::Dm3::Z>
+    : super self::_Dm3&Object&Am3::•()
+    ;
+}
+abstract class _Em3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → dynamic, self::_Em3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Em3<Z extends core::Object = dynamic> extends self::_Em3&Object&Am3<self::Em3::Z> {
+  synthetic constructor •() → self::Em3<self::Em3::Z>
+    : super self::_Em3&Object&Am3::•()
+    ;
+}
+abstract class _Fm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → dynamic, self::_Fm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm3<Z extends core::Object = dynamic> extends self::_Fm3&Object&Am3<self::Fm3::Z> {
+  synthetic constructor •() → self::Fm3<self::Fm3::Z>
+    : super self::_Fm3&Object&Am3::•()
+    ;
+}
+abstract class _Gm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<({x: core::int}) → dynamic, self::_Gm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm3<Z extends core::Object = dynamic> extends self::_Gm3&Object&Am3<self::Gm3::Z> {
+  synthetic constructor •() → self::Gm3<self::Gm3::Z>
+    : super self::_Gm3&Object&Am3::•()
+    ;
+}
+abstract class _Hm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<([core::int]) → dynamic, self::_Hm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm3<Z extends core::Object = dynamic> extends self::_Hm3&Object&Am3<self::Hm3::Z> {
+  synthetic constructor •() → self::Hm3<self::Hm3::Z>
+    : super self::_Hm3&Object&Am3::•()
+    ;
+}
+abstract class _Im3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<([core::int]) → dynamic, self::_Im3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Im3<Z extends core::Object = dynamic> extends self::_Im3&Object&Am3<self::Im3::Z> {
+  synthetic constructor •() → self::Im3<self::Im3::Z>
+    : super self::_Im3&Object&Am3::•()
+    ;
+}
+abstract class _Jm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::Function) → dynamic, self::_Jm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm3<Z extends core::Object = dynamic> extends self::_Jm3&Object&Am3<self::Jm3::Z> {
+  synthetic constructor •() → self::Jm3<self::Jm3::Z>
+    : super self::_Jm3&Object&Am3::•()
+    ;
+}
+abstract class _Km3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → (() → core::Function) → dynamic, self::_Km3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Km3<Z extends core::Object = dynamic> extends self::_Km3&Object&Am3<self::Km3::Z> {
+  synthetic constructor •() → self::Km3<self::Km3::Z>
+    : super self::_Km3&Object&Am3::•()
+    ;
+}
+class Af1<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
+    return null;
+}
+class Bf1<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
+    return null;
+}
+class Cf1<X extends () → core::int = () → core::int> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
+    return null;
+}
+class Df1<X extends () → dynamic = () → dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
+    return null;
+}
+class Ef1<X extends () → dynamic = () → dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
+    return null;
+}
+class Ff1<X extends ({x: core::int}) → dynamic = ({x: core::int}) → dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
+    return null;
+}
+class Gf1<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
+    return null;
+}
+class Hf1<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
+    return null;
+}
+class If1<X extends core::Function = core::Function> extends core::Object {
+  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
+    return null;
+}
+class Jf1<X extends (core::Function) → dynamic = (core::Function) → dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
+    return null;
+}
+class Kf1<X extends () → (() → core::Function) → dynamic = () → (() → core::Function) → dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
+    return null;
+}
+class Bf2<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
+    return null;
+}
+class Cf2<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
+    return null;
+}
+class Df2<X extends () → core::int = () → core::int> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
+    return null;
+}
+class Ef2<X extends () → dynamic = () → dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
+    return null;
+}
+class Ff2<X extends () → dynamic = () → dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
+    return null;
+}
+class Gf2<X extends ({x: core::int}) → dynamic = ({x: core::int}) → dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
+    return null;
+}
+class Hf2<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
+    return null;
+}
+class If2<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
+    return null;
+}
+class Jf2<X extends (core::Function) → dynamic = (core::Function) → dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
+    return null;
+}
+class Kf2<X extends () → (() → core::Function) → dynamic = () → (() → core::Function) → dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/clone_function_type.dart.strong.transformed.expect b/pkg/front_end/testcases/clone_function_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..6c6a057
--- /dev/null
+++ b/pkg/front_end/testcases/clone_function_type.dart.strong.transformed.expect
@@ -0,0 +1,614 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
+// class Qm1<Z> = Object with Am1<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
+// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
+//                                                   ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
+// class Qm2<Z> = Object with Am2<Function({int}), Z>;
+//                                             ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:67:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Bm2<Z> extends Object with Am2<Function(int), Z> {}
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:70:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Cm2<Z> extends Object with Am2<Function(int x), Z> {}
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:86:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Jm2<Z> extends Object with Am2<Function, Z> {}
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:89:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Object with Am2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Km2<Z> extends Object with Am2<Function(Function Function), Z> {}
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:95:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Mm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Mm2<Z> = Object with Am2<Function(int), Z>;
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:98:7: Error: Type argument 'dynamic Function(int)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Nm2'.
+// Try changing type arguments so that they conform to the bounds.
+// class Nm2<Z> = Object with Am2<Function(int x), Z>;
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:114:7: Error: Type argument 'Function' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Um2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Um2<Z> = Object with Am2<Function, Z>;
+//       ^
+//
+// pkg/front_end/testcases/clone_function_type.dart:117:7: Error: Type argument 'dynamic Function(Function)' doesn't conform to the bound 'dynamic Function()' of the type variable 'X' on 'Am2' in the supertype 'Am2' of class 'Vm2'.
+//  - 'Function' is from 'dart:core'.
+// Try changing type arguments so that they conform to the bounds.
+// class Vm2<Z> = Object with Am2<Function(Function Function), Z>;
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef TdB = (core::int) → dynamic;
+typedef TdC = (core::int) → dynamic;
+typedef TdD = () → core::int;
+typedef TdE = () → dynamic;
+typedef TdF = () → dynamic;
+typedef TdG = ({x: core::int}) → dynamic;
+typedef TdH = ([core::int]) → dynamic;
+typedef TdI = ([core::int]) → dynamic;
+typedef TdJ = (core::Function) → dynamic;
+typedef TdK = () → (() → core::Function) → dynamic;
+class Am1<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am1<self::Am1::X, self::Am1::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm1<Z extends core::Object = dynamic> extends self::_Bm1&Object&Am1<self::Bm1::Z> {
+  synthetic constructor •() → self::Bm1<self::Bm1::Z>
+    : super self::_Bm1&Object&Am1::•()
+    ;
+}
+abstract class _Cm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::_Cm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm1<Z extends core::Object = dynamic> extends self::_Cm1&Object&Am1<self::Cm1::Z> {
+  synthetic constructor •() → self::Cm1<self::Cm1::Z>
+    : super self::_Cm1&Object&Am1::•()
+    ;
+}
+abstract class _Dm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → core::int, self::_Dm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm1<Z extends core::Object = dynamic> extends self::_Dm1&Object&Am1<self::Dm1::Z> {
+  synthetic constructor •() → self::Dm1<self::Dm1::Z>
+    : super self::_Dm1&Object&Am1::•()
+    ;
+}
+abstract class _Em1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::_Em1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Em1<Z extends core::Object = dynamic> extends self::_Em1&Object&Am1<self::Em1::Z> {
+  synthetic constructor •() → self::Em1<self::Em1::Z>
+    : super self::_Em1&Object&Am1::•()
+    ;
+}
+abstract class _Fm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::_Fm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm1<Z extends core::Object = dynamic> extends self::_Fm1&Object&Am1<self::Fm1::Z> {
+  synthetic constructor •() → self::Fm1<self::Fm1::Z>
+    : super self::_Fm1&Object&Am1::•()
+    ;
+}
+abstract class _Gm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<({x: core::int}) → dynamic, self::_Gm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm1<Z extends core::Object = dynamic> extends self::_Gm1&Object&Am1<self::Gm1::Z> {
+  synthetic constructor •() → self::Gm1<self::Gm1::Z>
+    : super self::_Gm1&Object&Am1::•()
+    ;
+}
+abstract class _Hm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::_Hm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm1<Z extends core::Object = dynamic> extends self::_Hm1&Object&Am1<self::Hm1::Z> {
+  synthetic constructor •() → self::Hm1<self::Hm1::Z>
+    : super self::_Hm1&Object&Am1::•()
+    ;
+}
+abstract class _Im1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::_Im1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Im1<Z extends core::Object = dynamic> extends self::_Im1&Object&Am1<self::Im1::Z> {
+  synthetic constructor •() → self::Im1<self::Im1::Z>
+    : super self::_Im1&Object&Am1::•()
+    ;
+}
+abstract class _Jm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<core::Function, self::_Jm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm1<Z extends core::Object = dynamic> extends self::_Jm1&Object&Am1<self::Jm1::Z> {
+  synthetic constructor •() → self::Jm1<self::Jm1::Z>
+    : super self::_Jm1&Object&Am1::•()
+    ;
+}
+abstract class _Km1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::Function) → dynamic, self::_Km1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Km1<Z extends core::Object = dynamic> extends self::_Km1&Object&Am1<self::Km1::Z> {
+  synthetic constructor •() → self::Km1<self::Km1::Z>
+    : super self::_Km1&Object&Am1::•()
+    ;
+}
+abstract class _Lm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → (() → core::Function) → dynamic, self::_Lm1&Object&Am1::Z> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm1<Z extends core::Object = dynamic> extends self::_Lm1&Object&Am1<self::Lm1::Z> {
+  synthetic constructor •() → self::Lm1<self::Lm1::Z>
+    : super self::_Lm1&Object&Am1::•()
+    ;
+}
+class Mm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::Mm1::Z> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::Nm1::Z> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → core::int, self::Om1::Z> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::Pm1::Z> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::Qm1::Z> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<core::Function, self::Um1::Z> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () → dynamic = () → dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm2<Z extends core::Object = dynamic> extends self::_Bm2&Object&Am2<self::Bm2::Z> {
+  synthetic constructor •() → self::Bm2<self::Bm2::Z>
+    : super self::_Bm2&Object&Am2::•()
+    ;
+}
+abstract class _Cm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::_Cm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm2<Z extends core::Object = dynamic> extends self::_Cm2&Object&Am2<self::Cm2::Z> {
+  synthetic constructor •() → self::Cm2<self::Cm2::Z>
+    : super self::_Cm2&Object&Am2::•()
+    ;
+}
+abstract class _Dm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → core::int, self::_Dm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm2<Z extends core::Object = dynamic> extends self::_Dm2&Object&Am2<self::Dm2::Z> {
+  synthetic constructor •() → self::Dm2<self::Dm2::Z>
+    : super self::_Dm2&Object&Am2::•()
+    ;
+}
+abstract class _Em2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::_Em2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Em2<Z extends core::Object = dynamic> extends self::_Em2&Object&Am2<self::Em2::Z> {
+  synthetic constructor •() → self::Em2<self::Em2::Z>
+    : super self::_Em2&Object&Am2::•()
+    ;
+}
+abstract class _Fm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::_Fm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm2<Z extends core::Object = dynamic> extends self::_Fm2&Object&Am2<self::Fm2::Z> {
+  synthetic constructor •() → self::Fm2<self::Fm2::Z>
+    : super self::_Fm2&Object&Am2::•()
+    ;
+}
+abstract class _Gm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<({x: core::int}) → dynamic, self::_Gm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm2<Z extends core::Object = dynamic> extends self::_Gm2&Object&Am2<self::Gm2::Z> {
+  synthetic constructor •() → self::Gm2<self::Gm2::Z>
+    : super self::_Gm2&Object&Am2::•()
+    ;
+}
+abstract class _Hm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::_Hm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm2<Z extends core::Object = dynamic> extends self::_Hm2&Object&Am2<self::Hm2::Z> {
+  synthetic constructor •() → self::Hm2<self::Hm2::Z>
+    : super self::_Hm2&Object&Am2::•()
+    ;
+}
+abstract class _Im2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::_Im2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Im2<Z extends core::Object = dynamic> extends self::_Im2&Object&Am2<self::Im2::Z> {
+  synthetic constructor •() → self::Im2<self::Im2::Z>
+    : super self::_Im2&Object&Am2::•()
+    ;
+}
+abstract class _Jm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<core::Function, self::_Jm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm2<Z extends core::Object = dynamic> extends self::_Jm2&Object&Am2<self::Jm2::Z> {
+  synthetic constructor •() → self::Jm2<self::Jm2::Z>
+    : super self::_Jm2&Object&Am2::•()
+    ;
+}
+abstract class _Km2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::Function) → dynamic, self::_Km2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Km2<Z extends core::Object = dynamic> extends self::_Km2&Object&Am2<self::Km2::Z> {
+  synthetic constructor •() → self::Km2<self::Km2::Z>
+    : super self::_Km2&Object&Am2::•()
+    ;
+}
+abstract class _Lm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → (() → core::Function) → dynamic, self::_Lm2&Object&Am2::Z> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
+    : super core::Object::•()
+    ;
+}
+class Lm2<Z extends core::Object = dynamic> extends self::_Lm2&Object&Am2<self::Lm2::Z> {
+  synthetic constructor •() → self::Lm2<self::Lm2::Z>
+    : super self::_Lm2&Object&Am2::•()
+    ;
+}
+class Mm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::Mm2::Z> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::Nm2::Z> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → core::int, self::Om2::Z> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z>
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::Pm2::Z> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::Qm2::Z> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<core::Function, self::Um2::Z> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z>
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
+    : super core::Object::•()
+    ;
+}
+class Am3<L extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am3<self::Am3::L, self::Am3::Y>
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Bm3<Z extends core::Object = dynamic> extends self::_Bm3&Object&Am3<self::Bm3::Z> {
+  synthetic constructor •() → self::Bm3<self::Bm3::Z>
+    : super self::_Bm3&Object&Am3::•()
+    ;
+}
+abstract class _Cm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<(core::int) → dynamic, self::_Cm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Cm3<Z extends core::Object = dynamic> extends self::_Cm3&Object&Am3<self::Cm3::Z> {
+  synthetic constructor •() → self::Cm3<self::Cm3::Z>
+    : super self::_Cm3&Object&Am3::•()
+    ;
+}
+abstract class _Dm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<() → core::int, self::_Dm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Dm3<Z extends core::Object = dynamic> extends self::_Dm3&Object&Am3<self::Dm3::Z> {
+  synthetic constructor •() → self::Dm3<self::Dm3::Z>
+    : super self::_Dm3&Object&Am3::•()
+    ;
+}
+abstract class _Em3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<() → dynamic, self::_Em3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Em3<Z extends core::Object = dynamic> extends self::_Em3&Object&Am3<self::Em3::Z> {
+  synthetic constructor •() → self::Em3<self::Em3::Z>
+    : super self::_Em3&Object&Am3::•()
+    ;
+}
+abstract class _Fm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<() → dynamic, self::_Fm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Fm3<Z extends core::Object = dynamic> extends self::_Fm3&Object&Am3<self::Fm3::Z> {
+  synthetic constructor •() → self::Fm3<self::Fm3::Z>
+    : super self::_Fm3&Object&Am3::•()
+    ;
+}
+abstract class _Gm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<({x: core::int}) → dynamic, self::_Gm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Gm3<Z extends core::Object = dynamic> extends self::_Gm3&Object&Am3<self::Gm3::Z> {
+  synthetic constructor •() → self::Gm3<self::Gm3::Z>
+    : super self::_Gm3&Object&Am3::•()
+    ;
+}
+abstract class _Hm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<([core::int]) → dynamic, self::_Hm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Hm3<Z extends core::Object = dynamic> extends self::_Hm3&Object&Am3<self::Hm3::Z> {
+  synthetic constructor •() → self::Hm3<self::Hm3::Z>
+    : super self::_Hm3&Object&Am3::•()
+    ;
+}
+abstract class _Im3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<([core::int]) → dynamic, self::_Im3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Im3<Z extends core::Object = dynamic> extends self::_Im3&Object&Am3<self::Im3::Z> {
+  synthetic constructor •() → self::Im3<self::Im3::Z>
+    : super self::_Im3&Object&Am3::•()
+    ;
+}
+abstract class _Jm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<(core::Function) → dynamic, self::_Jm3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Jm3<Z extends core::Object = dynamic> extends self::_Jm3&Object&Am3<self::Jm3::Z> {
+  synthetic constructor •() → self::Jm3<self::Jm3::Z>
+    : super self::_Jm3&Object&Am3::•()
+    ;
+}
+abstract class _Km3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<() → (() → core::Function) → dynamic, self::_Km3&Object&Am3::Z> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
+    : super core::Object::•()
+    ;
+}
+class Km3<Z extends core::Object = dynamic> extends self::_Km3&Object&Am3<self::Km3::Z> {
+  synthetic constructor •() → self::Km3<self::Km3::Z>
+    : super self::_Km3&Object&Am3::•()
+    ;
+}
+class Af1<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
+    return null;
+}
+class Bf1<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
+    return null;
+}
+class Cf1<X extends () → core::int = () → core::int> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
+    return null;
+}
+class Df1<X extends () → dynamic = () → dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
+    return null;
+}
+class Ef1<X extends () → dynamic = () → dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
+    return null;
+}
+class Ff1<X extends ({x: core::int}) → dynamic = ({x: core::int}) → dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
+    return null;
+}
+class Gf1<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
+    return null;
+}
+class Hf1<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
+    return null;
+}
+class If1<X extends core::Function = core::Function> extends core::Object {
+  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
+    return null;
+}
+class Jf1<X extends (core::Function) → dynamic = (core::Function) → dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
+    return null;
+}
+class Kf1<X extends () → (() → core::Function) → dynamic = () → (() → core::Function) → dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
+    return null;
+}
+class Bf2<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
+    return null;
+}
+class Cf2<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
+  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
+    return null;
+}
+class Df2<X extends () → core::int = () → core::int> extends core::Object {
+  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
+    return null;
+}
+class Ef2<X extends () → dynamic = () → dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
+    return null;
+}
+class Ff2<X extends () → dynamic = () → dynamic> extends core::Object {
+  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
+    return null;
+}
+class Gf2<X extends ({x: core::int}) → dynamic = ({x: core::int}) → dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
+    return null;
+}
+class Hf2<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
+    return null;
+}
+class If2<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
+  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
+    return null;
+}
+class Jf2<X extends (core::Function) → dynamic = (core::Function) → dynamic> extends core::Object {
+  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
+    return null;
+}
+class Kf2<X extends () → (() → core::Function) → dynamic = () → (() → core::Function) → dynamic> extends core::Object {
+  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/closure.dart.direct.expect b/pkg/front_end/testcases/closure.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/closure.dart.direct.expect
rename to pkg/front_end/testcases/closure.dart.legacy.expect
diff --git a/pkg/front_end/testcases/closure.dart.direct.transformed.expect b/pkg/front_end/testcases/closure.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/closure.dart.direct.transformed.expect
rename to pkg/front_end/testcases/closure.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/closure.dart.strong.expect b/pkg/front_end/testcases/closure.dart.strong.expect
index 936ac03..0f3d05d 100644
--- a/pkg/front_end/testcases/closure.dart.strong.expect
+++ b/pkg/front_end/testcases/closure.dart.strong.expect
@@ -4,12 +4,12 @@
 
 class Foo extends core::Object {
   field self::Bar _field = new self::Bar::•();
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
 }
@@ -18,7 +18,7 @@
 }
 static method main() → dynamic {
   dynamic x;
-  function inner() → dynamic {
+  function inner() → self::Foo {
     x = new self::Foo::•();
     return new self::Foo::•();
   }
diff --git a/pkg/front_end/testcases/closure.dart.strong.transformed.expect b/pkg/front_end/testcases/closure.dart.strong.transformed.expect
new file mode 100644
index 0000000..0f3d05d
--- /dev/null
+++ b/pkg/front_end/testcases/closure.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field self::Bar _field = new self::Bar::•();
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar
+    : super core::Object::•()
+    ;
+}
+static method useCallback(dynamic callback) → dynamic {
+  dynamic _ = callback.call();
+}
+static method main() → dynamic {
+  dynamic x;
+  function inner() → self::Foo {
+    x = new self::Foo::•();
+    return new self::Foo::•();
+  }
+  self::useCallback(inner);
+  self::Bar _ = inner.call().{self::Foo::_field};
+}
diff --git a/pkg/front_end/testcases/closure.dart.type_promotion.expect b/pkg/front_end/testcases/closure.dart.type_promotion.expect
new file mode 100644
index 0000000..a0203a7
--- /dev/null
+++ b/pkg/front_end/testcases/closure.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/closure.dart:18:7: Context: Write to x@336
+    x = new Foo();
+      ^
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.expect
rename to pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.expect
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.direct.transformed.expect
rename to pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
deleted file mode 100644
index 5fef26a..0000000
--- a/pkg/front_end/testcases/compile.status
+++ /dev/null
@@ -1,124 +0,0 @@
-# Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE.md file.
-
-# Status file for the compile_test.dart (notice c, not k) test suite. This is
-# testing generating Kernel ASTs directly, that is, code in
-# pkg/fasta/lib/src/kernel/.
-
-DeltaBlue: Fail # Fasta and dartk disagree on static initializers
-ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
-bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
-call: Fail # Test can't run.
-constructor_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
-constructor_initializer_invalid: RuntimeError # Fails execution after recovery
-external_import: RuntimeError # Expected -- test uses import which doesn't exist.
-fallthrough: Fail # Missing FallThroughError.
-function_type_recovery: Fail
-incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
-inference/bug31436: RuntimeError # Test exercises Dart 2.0 semantics
-inference/constructors_too_many_positional_arguments: Fail
-inference/downwards_inference_annotations_locals: Fail # Issue #30031
-inference/future_then_explicit_future: Fail
-inference/generic_methods_infer_js_builtin: RuntimeError # Test attempts to access platform-private library leading to NSM.
-inference/infer_assign_to_index: Fail
-inference/infer_assign_to_property: Fail
-inference/infer_assign_to_property_custom: Fail
-inference/infer_type_cast: Fail
-inference/infer_typed_list_literal: Fail
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: RuntimeError
-instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
-instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # May be related to Issue 33479
-instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
-invocations: Fail
-micro: Fail # External method marked abstract.
-minimum_int: Crash # Min int literal not supported in non-strong mode.
-named_parameters: Fail # Missing types and unnecessary default values.
-optional: Fail # Unnecessary default values.
-rasta/abstract_constructor: Fail
-rasta/bad_constructor_redirection: Fail
-rasta/bad_continue: Fail
-rasta/bad_default_constructor: Fail # Compile-time error destroys program.
-rasta/bad_explicit_super_constructor: RuntimeError
-rasta/bad_implicit_super_constructor: Fail
-rasta/bad_interpolation: Fail
-rasta/bad_redirection: Fail
-rasta/bad_setter_initializer: Fail
-rasta/bad_unicode: Fail
-rasta/breaking_bad: Fail
-rasta/class_hierarchy: Fail
-rasta/class_member: Fail
-rasta/constant_get_and_invoke: Fail
-rasta/deferred_lib: Fail
-rasta/deferred_load: Fail
-rasta/duplicated_mixin: RuntimeError # Expected, this file has no main method.
-rasta/export: RuntimeError # Expected, this file has no main method.
-rasta/external_factory_redirection: Fail
-rasta/foo: RuntimeError # Expected, this file has no main method.
-rasta/for_loop: Fail
-rasta/generic_factory: Fail
-rasta/issue_000001: Fail
-rasta/issue_000031: Fail
-rasta/issue_000032: Fail
-rasta/issue_000034: RuntimeError
-rasta/issue_000035: Fail
-rasta/issue_000035a: Fail
-rasta/issue_000036: Fail
-rasta/issue_000039: Fail
-rasta/issue_000041: RuntimeError
-rasta/issue_000042: Fail
-rasta/issue_000043: Fail
-rasta/issue_000044: Fail
-rasta/issue_000045: Fail
-rasta/issue_000046: Fail
-rasta/issue_000047: Fail
-rasta/issue_000081: Fail
-rasta/malformed_const_constructor: Fail
-rasta/malformed_function: Fail
-rasta/mandatory_parameter_initializer: Fail
-rasta/mixin_library: Fail
-rasta/native_is_illegal: Fail
-rasta/parser_error: Fail
-rasta/super: RuntimeError
-rasta/super_initializer: Fail
-rasta/super_operator: Fail
-rasta/try_label: Fail
-rasta/type_literals: Fail
-rasta/type_with_parse_error: Fail
-rasta/typedef: Fail
-rasta/unresolved: Fail
-rasta/unresolved_constructor: Fail
-rasta/unresolved_for_in: RuntimeError # Test contains a compile-time error, signaled at run time in the JIT VM
-rasta/unresolved_recovery: Fail
-redirecting_factory: Fail # Missing types on constructor parameters.
-redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
-redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
-regress/issue_29975: Fail # Issue 29975.
-regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
-regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
-regress/issue_30836: RuntimeError # Issue 30836.
-regress/issue_32200: RuntimeError # Invalid type.
-regress/issue_32972: RuntimeError
-regress/issue_33452: RuntimeError # Test has an intentional error
-regress/issue_34225: RuntimeError
-regress/issue_34563: RuntimeError # Test execution after recovery
-runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
-runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
-runtime_checks/implicit_downcast_for_condition: RuntimeError # Test exercises strong mode semantics
-runtime_checks/implicit_downcast_if: RuntimeError # Test exercises strong mode semantics
-runtime_checks/implicit_downcast_not: RuntimeError # Test exercises strong mode semantics
-runtime_checks/implicit_downcast_while: RuntimeError # Test exercises strong mode semantics
-runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError # Test exercises strong mode semantics
-runtime_checks_new/implicit_downcast_field: RuntimeError # Test exercises strong mode semantics
-runtime_checks_new/mixin_forwarding_stub_field: RuntimeError # Test exercises strong mode semantics
-runtime_checks_new/mixin_forwarding_stub_getter: RuntimeError # Test exercises strong mode semantics
-runtime_checks_new/mixin_forwarding_stub_setter: RuntimeError # Test exercises strong mode semantics
-runtime_checks_new/stub_checked_via_target: RuntimeError # Test exercises strong mode semantics
-statements: Fail # Make async tranformer optional for golden file testing.
-type_variable_as_super: Fail
-uninitialized_fields: Fail # Fasta and dartk disagree on static initializers
-void_methods: Fail # Bad return from setters.
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.direct.expect b/pkg/front_end/testcases/constructor_const_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_const_inference.dart.direct.expect
rename to pkg/front_end/testcases/constructor_const_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_const_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.direct.expect b/pkg/front_end/testcases/constructor_cycle.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_cycle.dart.direct.expect
rename to pkg/front_end/testcases/constructor_cycle.dart.legacy.expect
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_cycle.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_cycle.dart.direct.transformed.expect
rename to pkg/front_end/testcases/constructor_cycle.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/constructor_function_types.dart.direct.expect b/pkg/front_end/testcases/constructor_function_types.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_function_types.dart.direct.expect
rename to pkg/front_end/testcases/constructor_function_types.dart.legacy.expect
diff --git a/pkg/front_end/testcases/constructor_function_types.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_function_types.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_function_types.dart.direct.transformed.expect
rename to pkg/front_end/testcases/constructor_function_types.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.expect
rename to pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.expect
diff --git a/pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.transformed.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_initializer_invalid.dart.direct.transformed.expect
rename to pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.direct.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/continue_inference_after_error.dart.direct.expect
rename to pkg/front_end/testcases/continue_inference_after_error.dart.legacy.expect
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.direct.transformed.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/continue_inference_after_error.dart.direct.transformed.expect
rename to pkg/front_end/testcases/continue_inference_after_error.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.strong.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.strong.expect
index b8eb6f4..861dd2f 100644
--- a/pkg/front_end/testcases/continue_inference_after_error.dart.strong.expect
+++ b/pkg/front_end/testcases/continue_inference_after_error.dart.strong.expect
@@ -4,7 +4,8 @@
 //   lib(new C().missing());
 //   ^^^
 //
-// pkg/front_end/testcases/continue_inference_after_error.dart:10:15: Error: The method 'missing' isn't defined for the class '#lib1::C'.
+// pkg/front_end/testcases/continue_inference_after_error.dart:10:15: Error: The method 'missing' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/continue_inference_after_error.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'missing'.
 //   lib(new C().missing());
 //               ^^^^^^^
@@ -21,7 +22,8 @@
 static method test() → dynamic {
   let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/continue_inference_after_error.dart:10:3: Error: A prefix can't be used as an expression.
   lib(new C().missing());
-  ^^^" in let final core::Object #t2 = let final dynamic #t3 = new self::C::•() in invalid-expression "pkg/front_end/testcases/continue_inference_after_error.dart:10:15: Error: The method 'missing' isn't defined for the class '#lib1::C'.
+  ^^^" in let final core::Object #t2 = let final dynamic #t3 = new self::C::•() in invalid-expression "pkg/front_end/testcases/continue_inference_after_error.dart:10:15: Error: The method 'missing' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/continue_inference_after_error.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'missing'.
   lib(new C().missing());
               ^^^^^^^" in null;
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.strong.transformed.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.strong.transformed.expect
index 5a51aa3..80d02fa 100644
--- a/pkg/front_end/testcases/continue_inference_after_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/continue_inference_after_error.dart.strong.transformed.expect
@@ -10,7 +10,8 @@
 static method test() → dynamic {
   let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/continue_inference_after_error.dart:10:3: Error: A prefix can't be used as an expression.
   lib(new C().missing());
-  ^^^" in let final core::Object #t2 = let final self::C #t3 = new self::C::•() in invalid-expression "pkg/front_end/testcases/continue_inference_after_error.dart:10:15: Error: The method 'missing' isn't defined for the class '#lib1::C'.
+  ^^^" in let final core::Object #t2 = let final self::C #t3 = new self::C::•() in invalid-expression "pkg/front_end/testcases/continue_inference_after_error.dart:10:15: Error: The method 'missing' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/continue_inference_after_error.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'missing'.
   lib(new C().missing());
               ^^^^^^^" in null;
diff --git a/pkg/front_end/testcases/covariant_generic.dart.direct.expect b/pkg/front_end/testcases/covariant_generic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/covariant_generic.dart.direct.expect
rename to pkg/front_end/testcases/covariant_generic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/covariant_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/covariant_generic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/covariant_generic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/covariant_generic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/covariant_generic.dart.strong.expect b/pkg/front_end/testcases/covariant_generic.dart.strong.expect
index 1e99fae..fdbee87 100644
--- a/pkg/front_end/testcases/covariant_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/covariant_generic.dart.strong.expect
@@ -2,25 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Object> extends core::Object {
+typedef Callback<T extends core::Object = dynamic> = (T) → void;
+class Foo<T extends core::Object = dynamic> extends core::Object {
   final field self::Foo::T finalField;
   final field (self::Foo::T) → void callbackField;
-  field self::Foo::T mutableField = null;
+  generic-covariant-impl field self::Foo::T mutableField = null;
   field (self::Foo::T) → void mutableCallbackField = null;
-  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → void
+  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → self::Foo<self::Foo::T>
     : self::Foo::finalField = finalField, self::Foo::callbackField = callbackField, super core::Object::•()
     ;
-  method method(self::Foo::T x) → void {}
-  set setter(self::Foo::T x) → void {}
+  method method(generic-covariant-impl self::Foo::T x) → void {}
+  set setter(generic-covariant-impl self::Foo::T x) → void {}
   method withCallback((self::Foo::T) → void callback) → void {
     callback.call(this.{self::Foo::finalField});
   }
-  set mutableField$cc(core::Object mutableField_) → dynamic
-    this.{=self::Foo::mutableField} = mutableField_ as self::Foo::T;
-  method method$cc(core::Object x) → void
-    this.{=self::Foo::method}(x as self::Foo::T);
-  set setter$cc(core::Object x) → void
-    this.{=self::Foo::setter} = x as self::Foo::T;
 }
 static method main() → dynamic {
   self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → core::Null {});
@@ -31,14 +26,14 @@
   fooInt.{self::Foo::mutableField} = 3;
   fooInt.{self::Foo::mutableCallbackField} = (core::int x) → core::Null {};
   self::Foo<core::num> fooNum = fooInt;
-  fooNum.{self::Foo::method$cc}(3);
-  fooNum.{self::Foo::method$cc}(2.5);
-  fooNum.{self::Foo::setter$cc} = 3;
-  fooNum.{self::Foo::setter$cc} = 2.5;
+  fooNum.{self::Foo::method}(3);
+  fooNum.{self::Foo::method}(2.5);
+  fooNum.{self::Foo::setter} = 3;
+  fooNum.{self::Foo::setter} = 2.5;
   fooNum.{self::Foo::withCallback}((core::num x) → core::Null {});
-  fooNum.{self::Foo::mutableField$cc} = 3;
-  fooNum.{self::Foo::mutableField$cc} = 2.5;
-  fooNum.{self::Foo::mutableCallbackField}.call(3);
-  fooNum.{self::Foo::mutableCallbackField}.call(2.5);
+  fooNum.{self::Foo::mutableField} = 3;
+  fooNum.{self::Foo::mutableField} = 2.5;
+  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(3);
+  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(2.5);
   fooNum.{self::Foo::mutableCallbackField} = (core::num x) → core::Null {};
 }
diff --git a/pkg/front_end/testcases/covariant_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/covariant_generic.dart.strong.transformed.expect
new file mode 100644
index 0000000..fdbee87
--- /dev/null
+++ b/pkg/front_end/testcases/covariant_generic.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Callback<T extends core::Object = dynamic> = (T) → void;
+class Foo<T extends core::Object = dynamic> extends core::Object {
+  final field self::Foo::T finalField;
+  final field (self::Foo::T) → void callbackField;
+  generic-covariant-impl field self::Foo::T mutableField = null;
+  field (self::Foo::T) → void mutableCallbackField = null;
+  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → self::Foo<self::Foo::T>
+    : self::Foo::finalField = finalField, self::Foo::callbackField = callbackField, super core::Object::•()
+    ;
+  method method(generic-covariant-impl self::Foo::T x) → void {}
+  set setter(generic-covariant-impl self::Foo::T x) → void {}
+  method withCallback((self::Foo::T) → void callback) → void {
+    callback.call(this.{self::Foo::finalField});
+  }
+}
+static method main() → dynamic {
+  self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → core::Null {});
+  fooInt.{self::Foo::method}(3);
+  fooInt.{self::Foo::setter} = 3;
+  fooInt.{self::Foo::withCallback}((core::int x) → core::Null {});
+  fooInt.{self::Foo::withCallback}((core::num x) → core::Null {});
+  fooInt.{self::Foo::mutableField} = 3;
+  fooInt.{self::Foo::mutableCallbackField} = (core::int x) → core::Null {};
+  self::Foo<core::num> fooNum = fooInt;
+  fooNum.{self::Foo::method}(3);
+  fooNum.{self::Foo::method}(2.5);
+  fooNum.{self::Foo::setter} = 3;
+  fooNum.{self::Foo::setter} = 2.5;
+  fooNum.{self::Foo::withCallback}((core::num x) → core::Null {});
+  fooNum.{self::Foo::mutableField} = 3;
+  fooNum.{self::Foo::mutableField} = 2.5;
+  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(3);
+  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(2.5);
+  fooNum.{self::Foo::mutableCallbackField} = (core::num x) → core::Null {};
+}
diff --git a/pkg/front_end/testcases/cycles.dart.direct.expect b/pkg/front_end/testcases/cycles.dart.direct.expect
deleted file mode 100644
index d2e8cdf..0000000
--- a/pkg/front_end/testcases/cycles.dart.direct.expect
+++ /dev/null
@@ -1,58 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
-// class A implements C {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
-// class B extends A {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
-// class C extends B implements D {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
-// class A implements C {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
-// class B extends A {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
-// class C extends B implements D {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  core::print(new self::A::•());
-  core::print(new self::B::•());
-  core::print(new self::C::•());
-  core::print(new self::D::•());
-}
diff --git a/pkg/front_end/testcases/cycles.dart.direct.transformed.expect b/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
deleted file mode 100644
index 435c417..0000000
--- a/pkg/front_end/testcases/cycles.dart.direct.transformed.expect
+++ /dev/null
@@ -1,44 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
-// class A implements C {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
-// class B extends A {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
-// class C extends B implements D {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  core::print(new self::A::•());
-  core::print(new self::B::•());
-  core::print(new self::C::•());
-  core::print(new self::D::•());
-}
diff --git a/pkg/front_end/testcases/cycles.dart.legacy.expect b/pkg/front_end/testcases/cycles.dart.legacy.expect
new file mode 100644
index 0000000..4ee0331
--- /dev/null
+++ b/pkg/front_end/testcases/cycles.dart.legacy.expect
@@ -0,0 +1,58 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself.
+// class C extends B implements D {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself.
+// class C extends B implements D {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::A::•());
+  core::print(new self::B::•());
+  core::print(new self::C::•());
+  core::print(new self::D::•());
+}
diff --git a/pkg/front_end/testcases/cycles.dart.legacy.transformed.expect b/pkg/front_end/testcases/cycles.dart.legacy.transformed.expect
new file mode 100644
index 0000000..08a24b3
--- /dev/null
+++ b/pkg/front_end/testcases/cycles.dart.legacy.transformed.expect
@@ -0,0 +1,44 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself.
+// class C extends B implements D {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::A::•());
+  core::print(new self::B::•());
+  core::print(new self::C::•());
+  core::print(new self::D::•());
+}
diff --git a/pkg/front_end/testcases/cycles.dart.outline.expect b/pkg/front_end/testcases/cycles.dart.outline.expect
index 3aaceb9..b1b0614 100644
--- a/pkg/front_end/testcases/cycles.dart.outline.expect
+++ b/pkg/front_end/testcases/cycles.dart.outline.expect
@@ -1,14 +1,14 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself via 'B', 'C'.
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
 // class A implements C {}
 //       ^
 //
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself via 'A', 'C'.
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
 // class B extends A {}
 //       ^
 //
-// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself via 'A', 'B'.
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself.
 // class C extends B implements D {}
 //       ^
 
diff --git a/pkg/front_end/testcases/cycles.dart.strong.expect b/pkg/front_end/testcases/cycles.dart.strong.expect
new file mode 100644
index 0000000..4ee0331
--- /dev/null
+++ b/pkg/front_end/testcases/cycles.dart.strong.expect
@@ -0,0 +1,58 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself.
+// class C extends B implements D {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself.
+// class C extends B implements D {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::A::•());
+  core::print(new self::B::•());
+  core::print(new self::C::•());
+  core::print(new self::D::•());
+}
diff --git a/pkg/front_end/testcases/cycles.dart.strong.transformed.expect b/pkg/front_end/testcases/cycles.dart.strong.transformed.expect
new file mode 100644
index 0000000..08a24b3
--- /dev/null
+++ b/pkg/front_end/testcases/cycles.dart.strong.transformed.expect
@@ -0,0 +1,44 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
+// class A implements C {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
+// class B extends A {}
+//       ^
+//
+// pkg/front_end/testcases/cycles.dart:9:7: Error: 'C' is a supertype of itself.
+// class C extends B implements D {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::A::•());
+  core::print(new self::B::•());
+  core::print(new self::C::•());
+  core::print(new self::D::•());
+}
diff --git a/pkg/front_end/testcases/dartino/compile_time_error_field_becomes_removed_function.incremental.yaml b/pkg/front_end/testcases/dartino/compile_time_error_field_becomes_removed_function.incremental.yaml
index 59d245c..2dd840c 100644
--- a/pkg/front_end/testcases/dartino/compile_time_error_field_becomes_removed_function.incremental.yaml
+++ b/pkg/front_end/testcases/dartino/compile_time_error_field_becomes_removed_function.incremental.yaml
@@ -9,7 +9,7 @@
   <<<< {"messages":[],"hasCompileTimeError":1}
     int sync*;
   ==== []
-    sync();
+    sync() => null;
   ==== []
   >>>>
   }
diff --git a/pkg/front_end/testcases/default_values.dart.direct.expect b/pkg/front_end/testcases/default_values.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/default_values.dart.direct.expect
rename to pkg/front_end/testcases/default_values.dart.legacy.expect
diff --git a/pkg/front_end/testcases/default_values.dart.direct.transformed.expect b/pkg/front_end/testcases/default_values.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/default_values.dart.direct.transformed.expect
rename to pkg/front_end/testcases/default_values.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/default_values.dart.direct.expect b/pkg/front_end/testcases/default_values.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/default_values.dart.direct.expect
copy to pkg/front_end/testcases/default_values.dart.strong.expect
diff --git a/pkg/front_end/testcases/default_values.dart.direct.transformed.expect b/pkg/front_end/testcases/default_values.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/default_values.dart.direct.transformed.expect
copy to pkg/front_end/testcases/default_values.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.direct.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.direct.expect
deleted file mode 100644
index 1f6def8..0000000
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.direct.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Warning: The type '#lib1::C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'd' or use a supertype of '#lib1::C' that isn't deferred.
-// bad(d.C x) {}
-//     ^^^
-
-library;
-import self as self;
-import "./deferred_lib.dart" as def;
-
-static method bad(def::C x) → dynamic {}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect
new file mode 100644
index 0000000..a826409
--- /dev/null
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect
@@ -0,0 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Warning: The type 'C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'd' or use a supertype of 'C' that isn't deferred.
+// bad(d.C x) {}
+//     ^^^
+
+library;
+import self as self;
+import "./deferred_lib.dart" as def;
+
+static method bad(def::C x) → dynamic {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.direct.transformed.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/deferred_type_annotation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
index 8a311e1..f58ad49 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
@@ -1,14 +1,16 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type '#lib1::C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'd' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type 'C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'd' or use a supertype of 'C' that isn't deferred.
 // bad(d.C x) {}
 //     ^^^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type '#lib1::C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'd' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type 'C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'd' or use a supertype of 'C' that isn't deferred.
 // bad(d.C x) {}
 //     ^^^
 
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
index 61ff935..6bfd545 100644
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
@@ -1,7 +1,8 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type '#lib1::C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
-// Try removing 'deferred' from the import of 'd' or use a supertype of '#lib1::C' that isn't deferred.
+// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Error: The type 'C' is deferred loaded via prefix 'd' and can't be used as a type annotation.
+//  - 'C' is from 'pkg/front_end/testcases/deferred_lib.dart'.
+// Try removing 'deferred' from the import of 'd' or use a supertype of 'C' that isn't deferred.
 // bad(d.C x) {}
 //     ^^^
 
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.expect
deleted file mode 100644
index 157828e..0000000
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
-// class Dupe {}
-//       ^^^^
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
-// class Dupe {}
-//       ^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
-//   Dupe.a b;
-//   ^^^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:1: Warning: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
-// import 'duplicated_bad_prefix_lib2.dart' as dupe;
-// ^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: 'Dupe.a' isn't a type.
-//   Dupe.a b;
-//   ^^^^^^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
-// class Dupe {}
-//       ^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class Dupe#1 extends core::Object {
-  synthetic constructor •() → self::Dupe#1
-    : super core::Object::•()
-    ;
-}
-class Dupe extends core::Object {
-}
-class C extends core::Object {
-  field invalid-type b = null;
-  field invalid-type d = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.transformed.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.transformed.expect
deleted file mode 100644
index 7d25f05..0000000
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.direct.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
-// class Dupe {}
-//       ^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class Dupe#1 extends core::Object {
-  synthetic constructor •() → self::Dupe#1
-    : super core::Object::•()
-    ;
-}
-class Dupe extends core::Object {
-}
-class C extends core::Object {
-  field invalid-type b = null;
-  field invalid-type d = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.expect
new file mode 100644
index 0000000..bb80ade
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.expect
@@ -0,0 +1,49 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
+// class Dupe {}
+//       ^^^^
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Warning: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
+// import 'duplicated_bad_prefix_lib2.dart' as dupe;
+//                                             ^
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: 'Dupe.a' isn't a type.
+//   Dupe.a b;
+//   ^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Dupe#1 extends core::Object {
+  synthetic constructor •() → self::Dupe#1
+    : super core::Object::•()
+    ;
+}
+class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field invalid-type b = null;
+  field invalid-type d = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.transformed.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c095d13
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.transformed.expect
@@ -0,0 +1,28 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Dupe#1 extends core::Object {
+  synthetic constructor •() → self::Dupe#1
+    : super core::Object::•()
+    ;
+}
+class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field invalid-type b = null;
+  field invalid-type d = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect
index 4917a59..28dac21 100644
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect
@@ -11,9 +11,9 @@
 //   Dupe.a b;
 //   ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:1: Warning: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Warning: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
 // import 'duplicated_bad_prefix_lib2.dart' as dupe;
-// ^
+//                                             ^
 
 library;
 import self as self;
@@ -24,6 +24,8 @@
     ;
 }
 class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe
+    ;
 }
 class C extends core::Object {
   field invalid-type b;
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect
index 9da6855..a2b97c5 100644
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect
@@ -11,9 +11,9 @@
 //   Dupe.a b;
 //   ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:1: Error: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Error: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
 // import 'duplicated_bad_prefix_lib2.dart' as dupe;
-// ^
+//                                             ^
 //
 // pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Error: 'Dupe.a' isn't a type.
 //   Dupe.a b;
@@ -29,9 +29,9 @@
 //   Dupe.a b;
 //   ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:1: Error: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Error: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
 // import 'duplicated_bad_prefix_lib2.dart' as dupe;
-// ^
+//                                             ^
 //
 // pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Error: 'Dupe.a' isn't a type.
 //   Dupe.a b;
@@ -47,6 +47,9 @@
     ;
 }
 class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe
+    : super core::Object::•()
+    ;
 }
 class C extends core::Object {
   field invalid-type b = null;
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.transformed.expect
index b6f3b03..ff27603 100644
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.transformed.expect
@@ -8,9 +8,9 @@
 //   Dupe.a b;
 //   ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:1: Error: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
+// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Error: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
 // import 'duplicated_bad_prefix_lib2.dart' as dupe;
-// ^
+//                                             ^
 //
 // pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Error: 'Dupe.a' isn't a type.
 //   Dupe.a b;
@@ -26,6 +26,9 @@
     ;
 }
 class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe
+    : super core::Object::•()
+    ;
 }
 class C extends core::Object {
   field invalid-type b = null;
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart b/pkg/front_end/testcases/duplicated_declarations.dart
index d971623..b0d3787 100644
--- a/pkg/front_end/testcases/duplicated_declarations.dart
+++ b/pkg/front_end/testcases/duplicated_declarations.dart
@@ -2,10 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+part "duplicated_declarations_part.dart";
+
+import 'duplicated_declarations_lib.dart' as Typedef;
+
+import 'duplicated_declarations_lib.dart' as Typedef;
+
 typedef Typedef = void Function();
 
 typedef Typedef = Object Function();
 
+import 'duplicated_declarations_lib.dart' as Typedef;
+
 typedef void OldTypedef();
 
 typedef Object OldTypedef();
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect b/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect
deleted file mode 100644
index bdfb562..0000000
--- a/pkg/front_end/testcases/duplicated_declarations.dart.direct.expect
+++ /dev/null
@@ -1,325 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
-// var field = "2nd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Context: Previous declaration of 'field'.
-// var field = "1st";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
-//   Enum,
-//   ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
-//   _name,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of '_name' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
-//   index,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'index' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
-//   toString,
-//   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'toString' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
-//   values,
-//   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'values' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
-//   main();
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
-//   print(field);
-//         ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
-//   C.s();
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
-//   static f() => s;
-//                 ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:58:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//   Sub() : super(null);
-//                ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:59:16: Warning: Superclass has no method named 'm'.
-//   m() => super.m();
-//                ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
-//     "AnotherEnum._name": AnotherEnum._name,
-//                                      ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
-//     "AnotherEnum.index": AnotherEnum.index,
-//                                      ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
-//     "AnotherEnum.toString": AnotherEnum.toString,
-//                                         ^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
-//     "AnotherEnum.values": AnotherEnum.values,
-//                                       ^^^^^^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
-// var field = "2nd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
-//   Enum,
-//   ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
-//   _name,
-//   ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
-//   index,
-//   ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
-//   toString,
-//   ^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
-//   values,
-//   ^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Typedef = () → void;
-typedef OldTypedef = () → void;
-class C#1 extends core::Object {
-  constructor _() → self::C#1
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field dynamic field;
-  constructor •(dynamic a) → self::C
-    : super core::Object::•()
-    ;
-  method m() → dynamic {
-    "1st";
-  }
-  static method s() → dynamic {
-    "1st";
-  }
-  static method f() → dynamic
-    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
-  static f() => s;
-                ^";
-}
-class Sub extends core::Object {
-  constructor •() → self::Sub
-    : final dynamic #t1 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Object, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  method m() → dynamic
-    return super.m();
-}
-class Enum#1 extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
-  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
-  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
-  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#1
-    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#1::_name};
-}
-class Enum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
-  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
-  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
-  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum
-    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum::_name};
-}
-class AnotherEnum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
-  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
-  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
-  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
-  const constructor •(core::int index, core::String _name) → self::AnotherEnum
-    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::AnotherEnum::_name};
-}
-static field dynamic field;
-static method main() → dynamic {
-  "1st";
-}
-static method foo() → dynamic {
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
-  main();
-  ^".call();
-  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
-  print(field);
-        ^");
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
-  C.s();
-  ^".s();
-}
-static method useAnotherEnum() → dynamic {
-  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
-    \"AnotherEnum._name\": AnotherEnum._name,
-                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
-    \"AnotherEnum.index\": AnotherEnum.index,
-                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
-    \"AnotherEnum.toString\": AnotherEnum.toString,
-                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
-    \"AnotherEnum.values\": AnotherEnum.values,
-                                      ^^^^^^"};
-}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect b/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect
deleted file mode 100644
index 9782b0f..0000000
--- a/pkg/front_end/testcases/duplicated_declarations.dart.direct.transformed.expect
+++ /dev/null
@@ -1,169 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
-// var field = "2nd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
-//   Enum,
-//   ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
-//   _name,
-//   ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
-//   index,
-//   ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
-//   toString,
-//   ^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
-//   values,
-//   ^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Typedef = () → void;
-typedef OldTypedef = () → void;
-class C#1 extends core::Object {
-  constructor _() → self::C#1
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field dynamic field;
-  constructor •(dynamic a) → self::C
-    : super core::Object::•()
-    ;
-  method m() → dynamic {
-    "1st";
-  }
-  static method s() → dynamic {
-    "1st";
-  }
-  static method f() → dynamic
-    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
-  static f() => s;
-                ^";
-}
-class Sub extends core::Object {
-  constructor •() → self::Sub
-    : final dynamic #t1 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Object, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  method m() → dynamic
-    return super.m();
-}
-class Enum#1 extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
-  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
-  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
-  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#1
-    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#1::_name};
-}
-class Enum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
-  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
-  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
-  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum
-    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum::_name};
-}
-class AnotherEnum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
-  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
-  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
-  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
-  const constructor •(core::int index, core::String _name) → self::AnotherEnum
-    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::AnotherEnum::_name};
-}
-static field dynamic field;
-static method main() → dynamic {
-  "1st";
-}
-static method foo() → dynamic {
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
-  main();
-  ^".call();
-  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
-  print(field);
-        ^");
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
-  C.s();
-  ^".s();
-}
-static method useAnotherEnum() → dynamic {
-  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
-    \"AnotherEnum._name\": AnotherEnum._name,
-                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
-    \"AnotherEnum.index\": AnotherEnum.index,
-                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
-    \"AnotherEnum.toString\": AnotherEnum.toString,
-                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
-    \"AnotherEnum.values\": AnotherEnum.values,
-                                      ^^^^^^"};
-}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.legacy.expect b/pkg/front_end/testcases/duplicated_declarations.dart.legacy.expect
new file mode 100644
index 0000000..f387607
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.legacy.expect
@@ -0,0 +1,702 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:11:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:1: Error: Directives must appear before any declarations.
+// Try moving the directive before any declarations.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:17:14: Context: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:21:5: Context: Previous declaration of 'field'.
+// var field = "1st";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:25:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'values' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:7:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:9:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:15:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Context: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = 4;
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Context: Previous declaration of 'field'.
+// var field = "3rd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
+// var field = 5.0;
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Context: Previous declaration of 'field'.
+// var field = 4;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:74:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:75:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Context: Previous declaration of 'OldTypedef'.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
+// var field = "3rd";
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Context: Previous declaration of 'field'.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+//                                              ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
+//   main();
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
+//   print(field);
+//         ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
+//   C.s();
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:66:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   Sub() : super(null);
+//                ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:67:16: Warning: Superclass has no method named 'm'.
+//   m() => super.m();
+//                ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+//     "AnotherEnum._name": AnotherEnum._name,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+//     "AnotherEnum.index": AnotherEnum.index,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:104:41: Error: Can't use 'toString' because it is declared more than once.
+//     "AnotherEnum.toString": AnotherEnum.toString,
+//                                         ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
+//     "AnotherEnum.values": AnotherEnum.values,
+//                                       ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:1: Error: Directives must appear before any declarations.
+// Try moving the directive before any declarations.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:7:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:9:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:15:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = 4;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
+// var field = 5.0;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:74:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
+// var field = "3rd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+//                                              ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Typedef = () → void;
+typedef OldTypedef = () → void;
+class C#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#4
+    : super core::Object::•()
+    ;
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3
+    : super core::Object::•()
+    ;
+}
+class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  field dynamic field = null;
+  constructor •(dynamic a) → self::C#2
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class C#1 extends core::Object {
+  constructor _() → self::C#1
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic field = null;
+  constructor •(dynamic a) → self::C
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class Sub extends core::Object {
+  constructor •() → self::Sub
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Object, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  method m() → dynamic
+    return super.m();
+}
+class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#4> values = const <self::Enum#4>[self::Enum#4::a];
+  static const field self::Enum#4 a = const self::Enum#4::•(0, "Enum.a");
+  const constructor •(core::int index, core::String _name) → self::Enum#4
+    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#4::_name};
+}
+class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#3> values = const <self::Enum#3>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
+  static const field self::Enum#3 a = const self::Enum#3::•(0, "Enum.a");
+  static const field self::Enum#3 b = const self::Enum#3::•(1, "Enum.b");
+  static const field self::Enum#3 c = const self::Enum#3::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → self::Enum#3
+    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#3::_name};
+}
+class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#2> values = const <self::Enum#2>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
+  static const field self::Enum#2 Enum = const self::Enum#2::•(0, "Enum.Enum");
+  static const field self::Enum#2 a = const self::Enum#2::•(1, "Enum.a");
+  static const field self::Enum#2 b = const self::Enum#2::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → self::Enum#2
+    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#2::_name};
+}
+class Enum#1 extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
+  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
+  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
+  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → self::Enum#1
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
+  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
+  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
+  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → self::Enum
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
+  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
+  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
+  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
+  const constructor •(core::int index, core::String _name) → self::AnotherEnum
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic field;
+static method main() → dynamic {
+  "1st";
+}
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
+  main();
+  ^".call();
+  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
+  print(field);
+        ^");
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
+  C.s();
+  ^".s();
+}
+static method useAnotherEnum() → dynamic {
+  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+    \"AnotherEnum._name\": AnotherEnum._name,
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+    \"AnotherEnum.index\": AnotherEnum.index,
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:104:41: Error: Can't use 'toString' because it is declared more than once.
+    \"AnotherEnum.toString\": AnotherEnum.toString,
+                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
+    \"AnotherEnum.values\": AnotherEnum.values,
+                                      ^^^^^^"};
+}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect b/pkg/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect
new file mode 100644
index 0000000..50cee56
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect
@@ -0,0 +1,354 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:15:1: Error: Directives must appear before any declarations.
+// Try moving the directive before any declarations.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:7:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:9:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:15:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = 4;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
+// var field = 5.0;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:74:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
+// var field = "3rd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+//                                              ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Typedef = () → void;
+typedef OldTypedef = () → void;
+class C#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#4
+    : super core::Object::•()
+    ;
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3
+    : super core::Object::•()
+    ;
+}
+class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  field dynamic field = null;
+  constructor •(dynamic a) → self::C#2
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class C#1 extends core::Object {
+  constructor _() → self::C#1
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic field = null;
+  constructor •(dynamic a) → self::C
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class Sub extends core::Object {
+  constructor •() → self::Sub
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Object, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  method m() → dynamic
+    return super.m();
+}
+class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#4> values = const <self::Enum#4>[self::Enum#4::a];
+  static const field self::Enum#4 a = const self::Enum#4::•(0, "Enum.a");
+  const constructor •(core::int index, core::String _name) → self::Enum#4
+    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#4::_name};
+}
+class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#3> values = const <self::Enum#3>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
+  static const field self::Enum#3 a = const self::Enum#3::•(0, "Enum.a");
+  static const field self::Enum#3 b = const self::Enum#3::•(1, "Enum.b");
+  static const field self::Enum#3 c = const self::Enum#3::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → self::Enum#3
+    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#3::_name};
+}
+class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#2> values = const <self::Enum#2>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
+  static const field self::Enum#2 Enum = const self::Enum#2::•(0, "Enum.Enum");
+  static const field self::Enum#2 a = const self::Enum#2::•(1, "Enum.a");
+  static const field self::Enum#2 b = const self::Enum#2::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → self::Enum#2
+    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#2::_name};
+}
+class Enum#1 extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
+  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
+  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
+  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → self::Enum#1
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
+  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
+  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
+  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → self::Enum
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
+  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
+  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
+  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
+  const constructor •(core::int index, core::String _name) → self::AnotherEnum
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic field;
+static method main() → dynamic {
+  "1st";
+}
+static method foo() → dynamic {
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
+  main();
+  ^".call();
+  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
+  print(field);
+        ^");
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
+  C.s();
+  ^".s();
+}
+static method useAnotherEnum() → dynamic {
+  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+    \"AnotherEnum._name\": AnotherEnum._name,
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+    \"AnotherEnum.index\": AnotherEnum.index,
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:104:41: Error: Can't use 'toString' because it is declared more than once.
+    \"AnotherEnum.toString\": AnotherEnum.toString,
+                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
+    \"AnotherEnum.values\": AnotherEnum.values,
+                                      ^^^^^^"};
+}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
index b143219..4aebbb6 100644
--- a/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
@@ -1,115 +1,303 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
 // typedef Typedef = Object Function();
 //         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Context: Previous declaration of 'Typedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:11:9: Context: Previous declaration of 'Typedef'.
 // typedef Typedef = void Function();
 //         ^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:15:1: Error: Directives must appear before any declarations.
+// Try moving the directive before any declarations.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
 // typedef Object OldTypedef();
 //                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Context: Previous declaration of 'OldTypedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:17:14: Context: Previous declaration of 'OldTypedef'.
 // typedef void OldTypedef();
 //              ^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
 // var field = "2nd";
 //     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Context: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:21:5: Context: Previous declaration of 'field'.
 // var field = "1st";
 //     ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
 // main() {
 // ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Context: Previous declaration of 'main'.
+// pkg/front_end/testcases/duplicated_declarations.dart:25:1: Context: Previous declaration of 'main'.
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Context: Previous declaration of 'C'.
+// pkg/front_end/testcases/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
 //   C(a);
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
 //   var field = "2nd";
 //       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Context: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
 //   var field = "1st";
 //       ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
 //   m() {
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Context: Previous declaration of 'm'.
+// pkg/front_end/testcases/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
 //   m() {
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
 //   static s() {
 //          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Context: Previous declaration of 's'.
+// pkg/front_end/testcases/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
 //   static s() {
 //          ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
 // class C {
 //       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Context: Previous declaration of 'C'.
+// pkg/front_end/testcases/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
 // class C {
 //       ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
 //   Enum,
 //   ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
 //   a,
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Context: Previous declaration of 'a'.
+// pkg/front_end/testcases/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
 //   a,
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
 // enum Enum {
 //      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Context: Previous declaration of 'Enum'.
+// pkg/front_end/testcases/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
 // enum Enum {
 //      ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
 //   _name,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of '_name' is implied by this definition.
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
 // enum AnotherEnum {
 //      ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
 //   index,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'index' is implied by this definition.
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
 // enum AnotherEnum {
 //      ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
 //   toString,
 //   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'toString' is implied by this definition.
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
 // enum AnotherEnum {
 //      ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
 //   values,
 //   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'values' is implied by this definition.
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'values' is implied by this definition.
 // enum AnotherEnum {
 //      ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: 'C' isn't a type.
+// pkg/front_end/testcases/duplicated_declarations_part.dart:7:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:9:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:15:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Context: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = 4;
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Context: Previous declaration of 'field'.
+// var field = "3rd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
+// var field = 5.0;
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Context: Previous declaration of 'field'.
+// var field = 4;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:74:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:75:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Context: Previous declaration of 'OldTypedef'.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
+// var field = "3rd";
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Context: Previous declaration of 'field'.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+//                                              ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
 // class Sub extends C {
 //                   ^
 
@@ -119,6 +307,25 @@
 
 typedef Typedef = () → void;
 typedef OldTypedef = () → void;
+class C#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#4
+    ;
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3
+    ;
+}
+class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  field dynamic field;
+  constructor •(dynamic a) → self::C#2
+    ;
+  method m() → dynamic
+    ;
+  static method s() → dynamic
+    ;
+  static method f() → dynamic
+    ;
+}
 class C#1 extends core::Object {
   constructor _() → self::C#1
     ;
@@ -140,6 +347,43 @@
   method m() → dynamic
     ;
 }
+class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#4> values = const <self::Enum#4>[self::Enum#4::a];
+  static const field self::Enum#4 a = const self::Enum#4::•(0, "Enum.a");
+  const constructor •(core::int index, core::String _name) → self::Enum#4
+    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#4::_name};
+}
+class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#3> values = const <self::Enum#3>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
+  static const field self::Enum#3 a = const self::Enum#3::•(0, "Enum.a");
+  static const field self::Enum#3 b = const self::Enum#3::•(1, "Enum.b");
+  static const field self::Enum#3 c = const self::Enum#3::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → self::Enum#3
+    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#3::_name};
+}
+class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#2> values = const <self::Enum#2>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
+  static const field self::Enum#2 Enum = const self::Enum#2::•(0, "Enum.Enum");
+  static const field self::Enum#2 a = const self::Enum#2::•(1, "Enum.a");
+  static const field self::Enum#2 b = const self::Enum#2::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → self::Enum#2
+    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#2::_name};
+}
 class Enum#1 extends core::Object {
   final field core::int index;
   final field core::String _name;
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect b/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
index 0efb977..99a1f04 100644
--- a/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
+++ b/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
@@ -1,230 +1,544 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
 // typedef Typedef = Object Function();
 //         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:5:9: Context: Previous declaration of 'Typedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:11:9: Context: Previous declaration of 'Typedef'.
 // typedef Typedef = void Function();
 //         ^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:15:1: Error: Directives must appear before any declarations.
+// Try moving the directive before any declarations.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
 // typedef Object OldTypedef();
 //                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:9:14: Context: Previous declaration of 'OldTypedef'.
+// pkg/front_end/testcases/duplicated_declarations.dart:17:14: Context: Previous declaration of 'OldTypedef'.
 // typedef void OldTypedef();
 //              ^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
 // var field = "2nd";
 //     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:5: Context: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:21:5: Context: Previous declaration of 'field'.
 // var field = "1st";
 //     ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
 // main() {
 // ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:1: Context: Previous declaration of 'main'.
+// pkg/front_end/testcases/duplicated_declarations.dart:25:1: Context: Previous declaration of 'main'.
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:32:3: Context: Previous declaration of 'C'.
+// pkg/front_end/testcases/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
 //   C(a);
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
 //   var field = "2nd";
 //       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:34:7: Context: Previous declaration of 'field'.
+// pkg/front_end/testcases/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
 //   var field = "1st";
 //       ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
 //   m() {
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:38:3: Context: Previous declaration of 'm'.
+// pkg/front_end/testcases/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
 //   m() {
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
 //   static s() {
 //          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:10: Context: Previous declaration of 's'.
+// pkg/front_end/testcases/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
 //   static s() {
 //          ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
 // class C {
 //       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:31:7: Context: Previous declaration of 'C'.
+// pkg/front_end/testcases/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
 // class C {
 //       ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
 //   Enum,
 //   ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
 //   a,
 //   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:68:3: Context: Previous declaration of 'a'.
+// pkg/front_end/testcases/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
 //   a,
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
 // enum Enum {
 //      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:66:6: Context: Previous declaration of 'Enum'.
+// pkg/front_end/testcases/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
 // enum Enum {
 //      ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
 //   _name,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of '_name' is implied by this definition.
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
 // enum AnotherEnum {
 //      ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
 //   index,
 //   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'index' is implied by this definition.
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
 // enum AnotherEnum {
 //      ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
 //   toString,
 //   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'toString' is implied by this definition.
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
 // enum AnotherEnum {
 //      ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
 //   values,
 //   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:79:6: Context: Previous declaration of 'values' is implied by this definition.
+// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'values' is implied by this definition.
 // enum AnotherEnum {
 //      ^^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: 'C' isn't a type.
+// pkg/front_end/testcases/duplicated_declarations_part.dart:7:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:9:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:15:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Context: Previous declaration of 'OldTypedef'.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = 4;
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Context: Previous declaration of 'field'.
+// var field = "3rd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
+// var field = 5.0;
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Context: Previous declaration of 'field'.
+// var field = 4;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:74:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:75:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Context: Previous declaration of 'OldTypedef'.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
+// var field = "3rd";
+//     ^^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Context: Previous declaration of 'field'.
+// var field = "2nd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Context: Previous declaration of 'main'.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+//                                              ^^^^^^^
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Context: Previous declaration of 'Typedef'.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
 // class Sub extends C {
 //                   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
+// pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
 //   main();
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
+// pkg/front_end/testcases/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
 //   print(field);
 //         ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
+// pkg/front_end/testcases/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
 //   C.s();
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
+// pkg/front_end/testcases/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
 //   static f() => s;
 //                 ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:58:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+// pkg/front_end/testcases/duplicated_declarations.dart:66:16: Error: Too many positional arguments: 0 allowed, but 1 found.
 // Try removing the extra positional arguments.
 //   Sub() : super(null);
 //                ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:59:16: Error: Superclass has no method named 'm'.
+// pkg/front_end/testcases/duplicated_declarations.dart:67:16: Error: Superclass has no method named 'm'.
 //   m() => super.m();
 //                ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
+// pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
 //     "AnotherEnum._name": AnotherEnum._name,
 //                                      ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
+// pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
 //     "AnotherEnum.index": AnotherEnum.index,
 //                                      ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
+// pkg/front_end/testcases/duplicated_declarations.dart:104:41: Error: Can't use 'toString' because it is declared more than once.
 //     "AnotherEnum.toString": AnotherEnum.toString,
 //                                         ^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
+// pkg/front_end/testcases/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
 //     "AnotherEnum.values": AnotherEnum.values,
 //                                       ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:7:9: Error: 'Typedef' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:7:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:9:1: Error: Import directives must preceed part directives.
+// Try moving the import directives before the part directives.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
 // typedef Typedef = Object Function();
 //         ^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:11:16: Error: 'OldTypedef' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:15:1: Error: Directives must appear before any declarations.
+// Try moving the directive before any declarations.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
 // typedef Object OldTypedef();
 //                ^^^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:15:5: Error: 'field' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
 // var field = "2nd";
 //     ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:21:1: Error: 'main' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
 // main() {
 // ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:33:3: Error: 'C' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
 //   C(a, b);
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:36:7: Error: 'field' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
 //   var field = "2nd";
 //       ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:42:3: Error: 'm' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
 //   m() {
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:50:10: Error: 's' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
 //   static s() {
 //          ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:62:7: Error: 'C' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
 // class C {
 //       ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:67:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
 //   Enum,
 //   ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:69:3: Error: 'a' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
 //   a,
 //   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:73:6: Error: 'Enum' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
 // enum Enum {
 //      ^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:83:3: Error: '_name' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
 //   _name,
 //   ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:84:3: Error: 'index' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
 //   index,
 //   ^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:85:3: Error: 'toString' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
 //   toString,
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:86:3: Error: 'values' is already declared in this scope.
+// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
 //   values,
 //   ^^^^^^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:57:19: Error: 'C' isn't a type.
+// pkg/front_end/testcases/duplicated_declarations_part.dart:7:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:9:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = Object Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:15:1: Error: The part-of directive must be the only directive in a part.
+// Try removing the other directives, or moving them to the library for which this is a part.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+// ^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
+// typedef Object OldTypedef();
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
+// var field = 4;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
+// var field = 5.0;
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:74:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
+//   Enum,
+//   ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
+// typedef Typedef = void Function();
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
+// typedef void OldTypedef();
+//              ^^^^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
+// var field = "3rd";
+//     ^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
+// main() {
+// ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
+// import 'duplicated_declarations_lib.dart' as Typedef;
+//                                              ^^^^^^^
+//
+// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
 // class Sub extends C {
 //                   ^
 //
-// pkg/front_end/testcases/duplicated_declarations.dart:59:16: Error: Superclass has no method named 'm'.
+// pkg/front_end/testcases/duplicated_declarations.dart:67:16: Error: Superclass has no method named 'm'.
 //   m() => super.m();
 //                ^
 
@@ -234,13 +548,39 @@
 
 typedef Typedef = () → void;
 typedef OldTypedef = () → void;
+class C#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#4
+    : super core::Object::•()
+    ;
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3
+    : super core::Object::•()
+    ;
+}
+class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  field core::String field = null;
+  constructor •(dynamic a) → self::C#2
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    "1st";
+  }
+  static method s() → dynamic {
+    "1st";
+  }
+  static method f() → dynamic
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
 class C#1 extends core::Object {
   constructor _() → self::C#1
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field dynamic field;
+  field core::String field = null;
   constructor •(dynamic a) → self::C
     : super core::Object::•()
     ;
@@ -251,13 +591,13 @@
     "1st";
   }
   static method f() → dynamic
-    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:54:17: Error: Can't use 's' because it is declared more than once.
+    return invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
   static f() => s;
                 ^";
 }
 class Sub extends core::Object {
   constructor •() → self::Sub
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:58:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:66:16: Error: Too many positional arguments: 0 allowed, but 1 found.
 Try removing the extra positional arguments.
   Sub() : super(null);
                ^"
@@ -265,6 +605,43 @@
   method m() → dynamic
     return super.m();
 }
+class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#4> values = const <self::Enum#4>[self::Enum#4::a];
+  static const field self::Enum#4 a = const self::Enum#4::•(0, "Enum.a");
+  const constructor •(core::int index, core::String _name) → self::Enum#4
+    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#4::_name};
+}
+class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#3> values = const <self::Enum#3>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
+  static const field self::Enum#3 a = const self::Enum#3::•(0, "Enum.a");
+  static const field self::Enum#3 b = const self::Enum#3::•(1, "Enum.b");
+  static const field self::Enum#3 c = const self::Enum#3::•(2, "Enum.c");
+  const constructor •(core::int index, core::String _name) → self::Enum#3
+    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#3::_name};
+}
+class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int index;
+  final field core::String _name;
+  static const field core::List<self::Enum#2> values = const <self::Enum#2>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
+  static const field self::Enum#2 Enum = const self::Enum#2::•(0, "Enum.Enum");
+  static const field self::Enum#2 a = const self::Enum#2::•(1, "Enum.a");
+  static const field self::Enum#2 b = const self::Enum#2::•(2, "Enum.b");
+  const constructor •(core::int index, core::String _name) → self::Enum#2
+    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String
+    return this.{=self::Enum#2::_name};
+}
 class Enum#1 extends core::Object {
   final field core::int index;
   final field core::String _name;
@@ -304,29 +681,29 @@
   method toString() → core::String
     return this.{=self::AnotherEnum::_name};
 }
-static field dynamic field;
+static field core::String field;
 static method main() → dynamic {
   "1st";
 }
 static method foo() → dynamic {
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:26:3: Error: Can't use 'main' because it is declared more than once.
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
   main();
   ^".call();
-  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:27:9: Error: Can't use 'field' because it is declared more than once.
+  core::print(invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
   print(field);
         ^");
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:28:3: Error: Can't use 'C' because it is declared more than once.
+  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
   C.s();
   ^".s();
 }
 static method useAnotherEnum() → dynamic {
-  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:94:38: Error: Can't use '_name' because it is declared more than once.
+  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
     \"AnotherEnum._name\": AnotherEnum._name,
-                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:95:38: Error: Can't use 'index' because it is declared more than once.
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
     \"AnotherEnum.index\": AnotherEnum.index,
-                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:96:41: Error: Can't use 'toString' because it is declared more than once.
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:104:41: Error: Can't use 'toString' because it is declared more than once.
     \"AnotherEnum.toString\": AnotherEnum.toString,
-                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:97:39: Error: Can't use 'values' because it is declared more than once.
+                                        ^^^^^^^^", "AnotherEnum.values": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
     \"AnotherEnum.values\": AnotherEnum.values,
                                       ^^^^^^"};
 }
diff --git a/pkg/front_end/testcases/duplicated_declarations_lib.dart b/pkg/front_end/testcases/duplicated_declarations_lib.dart
new file mode 100644
index 0000000..87869b0
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations_lib.dart
@@ -0,0 +1,3 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
diff --git a/pkg/front_end/testcases/duplicated_declarations_part.dart b/pkg/front_end/testcases/duplicated_declarations_part.dart
new file mode 100644
index 0000000..a31f772
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_declarations_part.dart
@@ -0,0 +1,88 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of "duplicated_declarations.dart";
+
+import 'duplicated_declarations_lib.dart' as Typedef;
+
+import 'duplicated_declarations_lib.dart' as Typedef;
+
+typedef Typedef = void Function();
+
+typedef Typedef = Object Function();
+
+import 'duplicated_declarations_lib.dart' as Typedef;
+
+typedef void OldTypedef();
+
+typedef Object OldTypedef();
+
+var field = "3rd";
+
+var field = 4;
+
+var field = 5.0;
+
+main() {
+  "3rd";
+}
+
+main() {
+  "4th";
+}
+
+main() {
+  "5th";
+}
+
+class C {
+  C(a);
+  C(a, b);
+  var field = "1st";
+
+  var field = "2nd";
+
+  m() {
+    "1st";
+  }
+
+  m() {
+    "2nd";
+  }
+
+  static s() {
+    "1st";
+  }
+
+  static s() {
+    "2nd";
+  }
+
+  static f() => s;
+}
+
+class C {
+  C._();
+}
+
+class C {
+  C._();
+}
+
+enum Enum {
+  Enum,
+  a,
+  a,
+  b,
+}
+
+enum Enum {
+  a,
+  b,
+  c,
+}
+
+enum Enum {
+  a,
+}
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart b/pkg/front_end/testcases/duplicated_field_initializer.dart
new file mode 100644
index 0000000..fac68e9
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_field_initializer.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  int a;
+  int a;
+  A(this.a);
+}
+
+void main() {
+  A(1);
+}
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.expect
new file mode 100644
index 0000000..a61a36d
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.expect
@@ -0,0 +1,34 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
+//   int a;
+//       ^
+// pkg/front_end/testcases/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
+//   int a;
+//       ^
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
+//   A(this.a);
+//          ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
+//   int a;
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a = null;
+  constructor •(dynamic a) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
+  A(this.a);
+         ^", super core::Object::•()
+    ;
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.transformed.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.transformed.expect
new file mode 100644
index 0000000..97c35dc
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
+//   int a;
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a = null;
+  constructor •(dynamic a) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
+  A(this.a);
+         ^", super core::Object::•()
+    ;
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.outline.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.outline.expect
new file mode 100644
index 0000000..230dc5e
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_field_initializer.dart.outline.expect
@@ -0,0 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
+//   int a;
+//       ^
+// pkg/front_end/testcases/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
+//   int a;
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a;
+  constructor •(dynamic a) → self::A
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.expect
new file mode 100644
index 0000000..2c39c5e
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.expect
@@ -0,0 +1,34 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
+//   int a;
+//       ^
+// pkg/front_end/testcases/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
+//   int a;
+//       ^
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
+//   A(this.a);
+//          ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
+//   int a;
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a = null;
+  constructor •(core::int a) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
+  A(this.a);
+         ^", super core::Object::•()
+    ;
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.transformed.expect
new file mode 100644
index 0000000..b3fa279
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
+//   int a;
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a = null;
+  constructor •(core::int a) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
+  A(this.a);
+         ^", super core::Object::•()
+    ;
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
deleted file mode 100644
index 6ff96e9..0000000
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/duplicated_named_args_3.dart:13:13: Error: Duplicated named argument 'a'.
-//   C.m(a: 1, a: 2, a: 3);
-//             ^
-//
-// pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
-//   C.m(a: 1, a: 2, a: 3);
-//                   ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  static method m({core::int a = 0}) → dynamic {}
-}
-static method test() → void {
-  self::C::m(a: invalid-expression "pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
-  C.m(a: 1, a: 2, a: 3);
-                  ^");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.transformed.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.transformed.expect
deleted file mode 100644
index e65bd84..0000000
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.direct.transformed.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  static method m({core::int a = 0}) → dynamic {}
-}
-static method test() → void {
-  self::C::m(a: invalid-expression "pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
-  C.m(a: 1, a: 2, a: 3);
-                  ^");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.expect
new file mode 100644
index 0000000..2baebe3
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method m({core::int a = 0}) → dynamic {}
+}
+static method test() → void {
+  self::C::m(a: 1, a: 2, a: 3);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2baebe3
--- /dev/null
+++ b/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.transformed.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  static method m({core::int a = 0}) → dynamic {}
+}
+static method test() → void {
+  self::C::m(a: 1, a: 2, a: 3);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.direct.expect b/pkg/front_end/testcases/dynamic_and_void.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/dynamic_and_void.dart.direct.expect
rename to pkg/front_end/testcases/dynamic_and_void.dart.legacy.expect
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.direct.transformed.expect b/pkg/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/dynamic_and_void.dart.direct.transformed.expect
rename to pkg/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/escape.dart.direct.expect b/pkg/front_end/testcases/escape.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/escape.dart.direct.expect
rename to pkg/front_end/testcases/escape.dart.legacy.expect
diff --git a/pkg/front_end/testcases/escape.dart.direct.transformed.expect b/pkg/front_end/testcases/escape.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/escape.dart.direct.transformed.expect
rename to pkg/front_end/testcases/escape.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/escape.dart.strong.expect b/pkg/front_end/testcases/escape.dart.strong.expect
index 4dfacb5..2a1b03e 100644
--- a/pkg/front_end/testcases/escape.dart.strong.expect
+++ b/pkg/front_end/testcases/escape.dart.strong.expect
@@ -4,19 +4,26 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator ==(dynamic x) → core::bool
+    return false;
+}
 class X extends core::Object implements self::A, self::B {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
@@ -28,8 +35,8 @@
   self::escape(object);
 }
 static method escape(dynamic x) → void {
-  x.==(null) ? x = "" : null;
-  x.==(null) ? x = 45 : null;
+  x.{core::Object::==}(null) ?{dynamic} x = "" : null;
+  x.{core::Object::==}(null) ?{dynamic} x = 45 : null;
   if(!(x is core::int) && !(x is core::String)) {
     x.field = 45;
   }
diff --git a/pkg/front_end/testcases/escape.dart.strong.transformed.expect b/pkg/front_end/testcases/escape.dart.strong.transformed.expect
new file mode 100644
index 0000000..2a1b03e
--- /dev/null
+++ b/pkg/front_end/testcases/escape.dart.strong.transformed.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator ==(dynamic x) → core::bool
+    return false;
+}
+class X extends core::Object implements self::A, self::B {
+  field dynamic field = null;
+  synthetic constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method useAsA(self::A object) → void {
+  dynamic _ = object.{self::A::field};
+}
+static method useAsB(self::B object) → void {
+  dynamic _ = object.{self::B::field};
+  self::escape(object);
+}
+static method escape(dynamic x) → void {
+  x.{core::Object::==}(null) ?{dynamic} x = "" : null;
+  x.{core::Object::==}(null) ?{dynamic} x = 45 : null;
+  if(!(x is core::int) && !(x is core::String)) {
+    x.field = 45;
+  }
+}
+static method main() → dynamic {
+  self::X object = new self::X::•();
+  self::useAsA(new self::A::•());
+  self::useAsA(object);
+  self::useAsB(new self::B::•());
+  self::useAsB(object);
+}
diff --git a/pkg/front_end/testcases/escape.dart.type_promotion.expect b/pkg/front_end/testcases/escape.dart.type_promotion.expect
new file mode 100644
index 0000000..ff163e6
--- /dev/null
+++ b/pkg/front_end/testcases/escape.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/escape.dart:31:5: Context: Write to x@483
+  x ??= "";
+    ^^^
+pkg/front_end/testcases/escape.dart:32:5: Context: Write to x@483
+  x ??= 45;
+    ^^^
diff --git a/pkg/front_end/testcases/export_main.dart.direct.expect b/pkg/front_end/testcases/export_main.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/export_main.dart.direct.expect
rename to pkg/front_end/testcases/export_main.dart.legacy.expect
diff --git a/pkg/front_end/testcases/export_main.dart.direct.transformed.expect b/pkg/front_end/testcases/export_main.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/export_main.dart.direct.transformed.expect
rename to pkg/front_end/testcases/export_main.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/export_test.dart.direct.expect b/pkg/front_end/testcases/export_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/export_test.dart.direct.expect
rename to pkg/front_end/testcases/export_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/export_test.dart.direct.transformed.expect b/pkg/front_end/testcases/export_test.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/export_test.dart.direct.transformed.expect
rename to pkg/front_end/testcases/export_test.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
index 83986a9..b75af9f 100644
--- a/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
@@ -1,9 +1,10 @@
 Errors: {
-  org-dartlang-debug:synthetic_debug_expression:1:1: Error: Type argument 'main::A::T' violates the corresponding type variable bound of 'hasBound'.
+  org-dartlang-debug:synthetic_debug_expression:1:1: Error: Type argument 'T' doesn't conform to the bound 'Bound' of the type variable 'T' on 'hasBound'.
+   - 'Bound' is from 'pkg/front_end/testcases/expression/main.dart'.
   Try changing type arguments so that they conform to the bounds.
   hasBound<T>()
   ^
-  pkg/front_end/testcases/expression/main.dart:36:15: Context: Bound of this variable is violated.
+  pkg/front_end/testcases/expression/main.dart:36:15: Context: This is the type variable whose bound isn't conformed to.
   void hasBound<T extends Bound>() {}
                 ^
 }
diff --git a/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
index e2e460d..bb5b00a 100644
--- a/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_bound.expression.yaml.expect
@@ -1,9 +1,10 @@
 Errors: {
-  org-dartlang-debug:synthetic_debug_expression:1:1: Error: Type argument 'T' violates the corresponding type variable bound of 'hasBound'.
+  org-dartlang-debug:synthetic_debug_expression:1:1: Error: Type argument 'T' doesn't conform to the bound 'Bound' of the type variable 'T' on 'hasBound'.
+   - 'Bound' is from 'pkg/front_end/testcases/expression/main.dart'.
   Try changing type arguments so that they conform to the bounds.
   hasBound<T>()
   ^
-  pkg/front_end/testcases/expression/main.dart:36:15: Context: Bound of this variable is violated.
+  pkg/front_end/testcases/expression/main.dart:36:15: Context: This is the type variable whose bound isn't conformed to.
   void hasBound<T extends Bound>() {}
                 ^
 }
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
index 5697f43..865f21c 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
@@ -1,10 +1,11 @@
 Errors: {
-  org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'T'.
+  org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'A<dynamic>' can't be assigned to a variable of type 'T'.
+   - 'A' is from 'pkg/front_end/testcases/expression/main.dart'.
   Try changing the type of the left hand side, or casting the right hand side to 'T'.
     T k = new A();
               ^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
   return () → dart.core::Null {
-    main::A::debugExpr::T k = let final<BottomType> #t1 = invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'main::A<dynamic>' can't be assigned to a variable of type 'T'.\nTry changing the type of the left hand side, or casting the right hand side to 'T'.\n  T k = new A();\n            ^" in new main::A::•<dynamic>() as{TypeError} <BottomType>;
+    main::A::debugExpr::T k = let final<BottomType> #t1 = invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'A<dynamic>' can't be assigned to a variable of type 'T'.\n - 'A' is from 'pkg/front_end/testcases/expression/main.dart'.\nTry changing the type of the left hand side, or casting the right hand side to 'T'.\n  T k = new A();\n            ^" in new main::A::•<dynamic>() as{TypeError} <BottomType>;
   };
diff --git a/pkg/front_end/testcases/expressions.dart.direct.expect b/pkg/front_end/testcases/expressions.dart.direct.expect
deleted file mode 100644
index d171a65..0000000
--- a/pkg/front_end/testcases/expressions.dart.direct.expect
+++ /dev/null
@@ -1,85 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/expressions.dart:74:16: Warning: Method not found: 'int.toString'.
-//     print(int?.toString());
-//                ^^^^^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo({dynamic fisk = null}) → dynamic {
-  core::print(fisk);
-}
-static method caller(dynamic f) → dynamic {
-  f.call();
-}
-static method main() → dynamic {
-  core::int i = 0;
-  core::print(i.==(1) ? "bad" : "good");
-  core::print("${i}");
-  core::print("'${i}'");
-  core::print(" '${i}' ");
-  core::print(" '${i}' '${i}'");
-  core::print(" '${i}' '${i}'");
-  core::print("foobar");
-  core::print(" '${i}' '${i}' '${i}' '${i}'");
-  try {
-    throw "fisk";
-  }
-  on core::String catch(final core::String e, final core::StackTrace s) {
-    core::print(e);
-    if(!s.==(null))
-      core::print(s);
-  }
-  for (; false; ) {
-  }
-  dynamic list = <dynamic>["Hello, World!"];
-  core::print(list.[](i));
-  list.[]=(i, "Hello, Brave New World!");
-  core::print(list.[](i));
-  i = 87;
-  core::print(i.unary-());
-  core::print(i.~());
-  core::print(!i.==(42));
-  core::print(i = i.-(1));
-  core::print(i = i.+(1));
-  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
-  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
-  core::print(new core::Object::•());
-  core::print(const core::Object::•());
-  core::print(core::List::•<core::String>(2).runtimeType);
-  self::foo(fisk: "Blorp gulp");
-  function f() → dynamic {
-    core::print("f was called");
-  }
-  self::caller(f);
-  self::caller(() → dynamic {
-    core::print("<anon> was called");
-  });
-  function g([dynamic message = null]) → dynamic {
-    core::print(message);
-  }
-  g.call("Hello, World");
-  self::caller(([dynamic x = null]) → dynamic {
-    core::print("<anon> was called with ${x}");
-  });
-  function h({dynamic message = null}) → dynamic {
-    core::print(message);
-  }
-  h.call(message: "Hello, World");
-  self::caller(({dynamic x = null}) → dynamic {
-    core::print("<anon> was called with ${x}");
-  });
-  core::print(core::int.toString());
-  core::print(core::int);
-  core::print(let final dynamic #t5 = core::int in let final dynamic #t6 = #t5.toString() in #t5);
-  try {
-    core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#int.toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw "Shouldn't work";
-  }
-  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-    core::print("As expected: ${e}");
-  }
-  core::print(core::int::parse("42"));
-}
diff --git a/pkg/front_end/testcases/expressions.dart.direct.transformed.expect b/pkg/front_end/testcases/expressions.dart.direct.transformed.expect
deleted file mode 100644
index 50a474a..0000000
--- a/pkg/front_end/testcases/expressions.dart.direct.transformed.expect
+++ /dev/null
@@ -1,79 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo({dynamic fisk = null}) → dynamic {
-  core::print(fisk);
-}
-static method caller(dynamic f) → dynamic {
-  f.call();
-}
-static method main() → dynamic {
-  core::int i = 0;
-  core::print(i.==(1) ? "bad" : "good");
-  core::print("${i}");
-  core::print("'${i}'");
-  core::print(" '${i}' ");
-  core::print(" '${i}' '${i}'");
-  core::print(" '${i}' '${i}'");
-  core::print("foobar");
-  core::print(" '${i}' '${i}' '${i}' '${i}'");
-  try {
-    throw "fisk";
-  }
-  on core::String catch(final core::String e, final core::StackTrace s) {
-    core::print(e);
-    if(!s.==(null))
-      core::print(s);
-  }
-  for (; false; ) {
-  }
-  dynamic list = <dynamic>["Hello, World!"];
-  core::print(list.[](i));
-  list.[]=(i, "Hello, Brave New World!");
-  core::print(list.[](i));
-  i = 87;
-  core::print(i.unary-());
-  core::print(i.~());
-  core::print(!i.==(42));
-  core::print(i = i.-(1));
-  core::print(i = i.+(1));
-  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
-  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
-  core::print(new core::Object::•());
-  core::print(const core::Object::•());
-  core::print(core::_List::•<core::String>(2).runtimeType);
-  self::foo(fisk: "Blorp gulp");
-  function f() → dynamic {
-    core::print("f was called");
-  }
-  self::caller(f);
-  self::caller(() → dynamic {
-    core::print("<anon> was called");
-  });
-  function g([dynamic message = null]) → dynamic {
-    core::print(message);
-  }
-  g.call("Hello, World");
-  self::caller(([dynamic x = null]) → dynamic {
-    core::print("<anon> was called with ${x}");
-  });
-  function h({dynamic message = null}) → dynamic {
-    core::print(message);
-  }
-  h.call(message: "Hello, World");
-  self::caller(({dynamic x = null}) → dynamic {
-    core::print("<anon> was called with ${x}");
-  });
-  core::print(core::int.toString());
-  core::print(core::int);
-  core::print(let final dynamic #t5 = core::int in let final dynamic #t6 = #t5.toString() in #t5);
-  try {
-    core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#int.toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw "Shouldn't work";
-  }
-  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-    core::print("As expected: ${e}");
-  }
-  core::print(core::int::parse("42"));
-}
diff --git a/pkg/front_end/testcases/expressions.dart.legacy.expect b/pkg/front_end/testcases/expressions.dart.legacy.expect
new file mode 100644
index 0000000..158f1ec
--- /dev/null
+++ b/pkg/front_end/testcases/expressions.dart.legacy.expect
@@ -0,0 +1,85 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/expressions.dart:74:16: Warning: Method not found: 'int.toString'.
+//     print(int?.toString());
+//                ^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo({dynamic fisk = null}) → dynamic {
+  core::print(fisk);
+}
+static method caller(dynamic f) → dynamic {
+  f.call();
+}
+static method main() → dynamic {
+  core::int i = 0;
+  core::print(i.==(1) ? "bad" : "good");
+  core::print("${i}");
+  core::print("'${i}'");
+  core::print(" '${i}' ");
+  core::print(" '${i}' '${i}'");
+  core::print(" '${i}' '${i}'");
+  core::print("foobar");
+  core::print(" '${i}' '${i}' '${i}' '${i}'");
+  try {
+    throw "fisk";
+  }
+  on core::String catch(final core::String e, final core::StackTrace s) {
+    core::print(e);
+    if(!s.==(null))
+      core::print(s);
+  }
+  for (; false; ) {
+  }
+  dynamic list = <dynamic>["Hello, World!"];
+  core::print(list.[](i));
+  list.[]=(i, "Hello, Brave New World!");
+  core::print(list.[](i));
+  i = 87;
+  core::print(i.unary-());
+  core::print(i.~());
+  core::print(!i.==(42));
+  core::print(i = i.-(1));
+  core::print(i = i.+(1));
+  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
+  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
+  core::print(new core::Object::•());
+  core::print(const core::Object::•());
+  core::print(core::List::•<core::String>(2).runtimeType);
+  self::foo(fisk: "Blorp gulp");
+  function f() → dynamic {
+    core::print("f was called");
+  }
+  self::caller(f);
+  self::caller(() → dynamic {
+    core::print("<anon> was called");
+  });
+  function g([dynamic message = null]) → dynamic {
+    core::print(message);
+  }
+  g.call("Hello, World");
+  self::caller(([dynamic x = null]) → dynamic {
+    core::print("<anon> was called with ${x}");
+  });
+  function h({dynamic message = null}) → dynamic {
+    core::print(message);
+  }
+  h.call(message: "Hello, World");
+  self::caller(({dynamic x = null}) → dynamic {
+    core::print("<anon> was called with ${x}");
+  });
+  core::print(core::int.toString());
+  core::print(core::int);
+  core::print(let final dynamic #t5 = core::int in let final dynamic #t6 = #t5.toString() in #t5);
+  try {
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#int.toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw "Shouldn't work";
+  }
+  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+    core::print("As expected: ${e}");
+  }
+  core::print(core::int::parse("42"));
+}
diff --git a/pkg/front_end/testcases/expressions.dart.legacy.transformed.expect b/pkg/front_end/testcases/expressions.dart.legacy.transformed.expect
new file mode 100644
index 0000000..04022a3
--- /dev/null
+++ b/pkg/front_end/testcases/expressions.dart.legacy.transformed.expect
@@ -0,0 +1,79 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo({dynamic fisk = null}) → dynamic {
+  core::print(fisk);
+}
+static method caller(dynamic f) → dynamic {
+  f.call();
+}
+static method main() → dynamic {
+  core::int i = 0;
+  core::print(i.==(1) ? "bad" : "good");
+  core::print("${i}");
+  core::print("'${i}'");
+  core::print(" '${i}' ");
+  core::print(" '${i}' '${i}'");
+  core::print(" '${i}' '${i}'");
+  core::print("foobar");
+  core::print(" '${i}' '${i}' '${i}' '${i}'");
+  try {
+    throw "fisk";
+  }
+  on core::String catch(final core::String e, final core::StackTrace s) {
+    core::print(e);
+    if(!s.==(null))
+      core::print(s);
+  }
+  for (; false; ) {
+  }
+  dynamic list = <dynamic>["Hello, World!"];
+  core::print(list.[](i));
+  list.[]=(i, "Hello, Brave New World!");
+  core::print(list.[](i));
+  i = 87;
+  core::print(i.unary-());
+  core::print(i.~());
+  core::print(!i.==(42));
+  core::print(i = i.-(1));
+  core::print(i = i.+(1));
+  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
+  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
+  core::print(new core::Object::•());
+  core::print(const core::Object::•());
+  core::print(core::_List::•<core::String>(2).runtimeType);
+  self::foo(fisk: "Blorp gulp");
+  function f() → dynamic {
+    core::print("f was called");
+  }
+  self::caller(f);
+  self::caller(() → dynamic {
+    core::print("<anon> was called");
+  });
+  function g([dynamic message = null]) → dynamic {
+    core::print(message);
+  }
+  g.call("Hello, World");
+  self::caller(([dynamic x = null]) → dynamic {
+    core::print("<anon> was called with ${x}");
+  });
+  function h({dynamic message = null}) → dynamic {
+    core::print(message);
+  }
+  h.call(message: "Hello, World");
+  self::caller(({dynamic x = null}) → dynamic {
+    core::print("<anon> was called with ${x}");
+  });
+  core::print(core::int.toString());
+  core::print(core::int);
+  core::print(let final dynamic #t5 = core::int in let final dynamic #t6 = #t5.toString() in #t5);
+  try {
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#int.toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw "Shouldn't work";
+  }
+  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
+    core::print("As expected: ${e}");
+  }
+  core::print(core::int::parse("42"));
+}
diff --git a/pkg/front_end/testcases/expressions.dart.type_promotion.expect b/pkg/front_end/testcases/expressions.dart.type_promotion.expect
new file mode 100644
index 0000000..3692c63
--- /dev/null
+++ b/pkg/front_end/testcases/expressions.dart.type_promotion.expect
@@ -0,0 +1,15 @@
+pkg/front_end/testcases/expressions.dart:34:5: Context: Write to i@286
+  i = 87;
+    ^
+pkg/front_end/testcases/expressions.dart:38:9: Context: Write to i@286
+  print(--i);
+        ^^
+pkg/front_end/testcases/expressions.dart:39:9: Context: Write to i@286
+  print(++i);
+        ^^
+pkg/front_end/testcases/expressions.dart:40:10: Context: Write to i@286
+  print(i--);
+         ^^
+pkg/front_end/testcases/expressions.dart:41:10: Context: Write to i@286
+  print(i++);
+         ^^
diff --git a/pkg/front_end/testcases/external.dart.direct.expect b/pkg/front_end/testcases/external.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/external.dart.direct.expect
rename to pkg/front_end/testcases/external.dart.legacy.expect
diff --git a/pkg/front_end/testcases/external.dart.direct.transformed.expect b/pkg/front_end/testcases/external.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/external.dart.direct.transformed.expect
rename to pkg/front_end/testcases/external.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/external.dart.strong.expect b/pkg/front_end/testcases/external.dart.strong.expect
index e4d6f84..e4daff6 100644
--- a/pkg/front_end/testcases/external.dart.strong.expect
+++ b/pkg/front_end/testcases/external.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 import "dart:isolate" as iso;
 
-static field dynamic subscription = null;
+static field dynamic subscription;
 static method onData(dynamic x) → void {
   core::print(x);
   self::subscription.cancel();
diff --git a/pkg/front_end/testcases/external.dart.strong.transformed.expect b/pkg/front_end/testcases/external.dart.strong.transformed.expect
new file mode 100644
index 0000000..e4daff6
--- /dev/null
+++ b/pkg/front_end/testcases/external.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:isolate" as iso;
+
+static field dynamic subscription;
+static method onData(dynamic x) → void {
+  core::print(x);
+  self::subscription.cancel();
+}
+static method main() → dynamic {
+  core::String string = core::String::fromCharCode(65);
+  iso::ReceivePort port = iso::ReceivePort::•();
+  self::subscription = port.{iso::ReceivePort::listen}(self::onData);
+  port.{iso::ReceivePort::sendPort}.{iso::SendPort::send}(string);
+}
diff --git a/pkg/front_end/testcases/external_import.dart.direct.expect b/pkg/front_end/testcases/external_import.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/external_import.dart.direct.expect
rename to pkg/front_end/testcases/external_import.dart.legacy.expect
diff --git a/pkg/front_end/testcases/external_import.dart.direct.transformed.expect b/pkg/front_end/testcases/external_import.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/external_import.dart.direct.transformed.expect
rename to pkg/front_end/testcases/external_import.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/fallthrough.dart.direct.expect b/pkg/front_end/testcases/fallthrough.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/fallthrough.dart.direct.expect
rename to pkg/front_end/testcases/fallthrough.dart.legacy.expect
diff --git a/pkg/front_end/testcases/fallthrough.dart.strong.expect b/pkg/front_end/testcases/fallthrough.dart.strong.expect
index 8c544b3..b4eb852 100644
--- a/pkg/front_end/testcases/fallthrough.dart.strong.expect
+++ b/pkg/front_end/testcases/fallthrough.dart.strong.expect
@@ -1,3 +1,23 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/fallthrough.dart:8:5: Error: Switch case may fall through to the next case.
+//     case 3:
+//     ^
+//
+// pkg/front_end/testcases/fallthrough.dart:12:5: Error: Switch case may fall through to the next case.
+//     case 6:
+//     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/fallthrough.dart:8:5: Error: Switch case may fall through to the next case.
+//     case 3:
+//     ^
+//
+// pkg/front_end/testcases/fallthrough.dart:12:5: Error: Switch case may fall through to the next case.
+//     case 6:
+//     ^
+
 library;
 import self as self;
 import "dart:core" as core;
@@ -10,7 +30,7 @@
     case 3:
       {
         x = 4;
-        throw new core::FallThroughError::•();
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///fallthrough.dart", 8);
       }
     #L3:
     case 5:
@@ -27,7 +47,7 @@
         else {
           return;
         }
-        throw new core::FallThroughError::•();
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///fallthrough.dart", 12);
       }
     #L5:
     case 4:
diff --git a/pkg/front_end/testcases/fallthrough.dart.type_promotion.expect b/pkg/front_end/testcases/fallthrough.dart.type_promotion.expect
new file mode 100644
index 0000000..a753f8b
--- /dev/null
+++ b/pkg/front_end/testcases/fallthrough.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/fallthrough.dart:9:9: Context: Write to x@254
+      x = 4;
+        ^
diff --git a/pkg/front_end/testcases/fibonacci.dart.direct.expect b/pkg/front_end/testcases/fibonacci.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/fibonacci.dart.direct.expect
rename to pkg/front_end/testcases/fibonacci.dart.legacy.expect
diff --git a/pkg/front_end/testcases/fibonacci.dart.direct.transformed.expect b/pkg/front_end/testcases/fibonacci.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/fibonacci.dart.direct.transformed.expect
rename to pkg/front_end/testcases/fibonacci.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/fibonacci.dart.strong.expect b/pkg/front_end/testcases/fibonacci.dart.strong.expect
new file mode 100644
index 0000000..6b654e5
--- /dev/null
+++ b/pkg/front_end/testcases/fibonacci.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method fibonacci(core::int n) → core::int {
+  if(n.{core::num::<}(2))
+    return n;
+  return self::fibonacci(n.{core::num::-}(1)).{core::num::+}(self::fibonacci(n.{core::num::-}(2)));
+}
+static method main() → dynamic {
+  for (core::int i = 0; i.{core::num::<}(20); i = i.{core::num::+}(1)) {
+    core::print(self::fibonacci(i));
+  }
+}
diff --git a/pkg/front_end/testcases/fibonacci.dart.strong.transformed.expect b/pkg/front_end/testcases/fibonacci.dart.strong.transformed.expect
new file mode 100644
index 0000000..6b654e5
--- /dev/null
+++ b/pkg/front_end/testcases/fibonacci.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method fibonacci(core::int n) → core::int {
+  if(n.{core::num::<}(2))
+    return n;
+  return self::fibonacci(n.{core::num::-}(1)).{core::num::+}(self::fibonacci(n.{core::num::-}(2)));
+}
+static method main() → dynamic {
+  for (core::int i = 0; i.{core::num::<}(20); i = i.{core::num::+}(1)) {
+    core::print(self::fibonacci(i));
+  }
+}
diff --git a/pkg/front_end/testcases/fibonacci.dart.type_promotion.expect b/pkg/front_end/testcases/fibonacci.dart.type_promotion.expect
new file mode 100644
index 0000000..42ffb08
--- /dev/null
+++ b/pkg/front_end/testcases/fibonacci.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/fibonacci.dart:11:28: Context: Write to i@332
+  for (int i = 0; i < 20; i++) {
+                           ^^
diff --git a/pkg/front_end/testcases/for_in_scope.dart.direct.expect b/pkg/front_end/testcases/for_in_scope.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/for_in_scope.dart.direct.expect
rename to pkg/front_end/testcases/for_in_scope.dart.legacy.expect
diff --git a/pkg/front_end/testcases/for_in_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/for_in_scope.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/for_in_scope.dart.direct.transformed.expect
rename to pkg/front_end/testcases/for_in_scope.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/for_in_scope.dart.direct.expect b/pkg/front_end/testcases/for_in_scope.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/for_in_scope.dart.direct.expect
copy to pkg/front_end/testcases/for_in_scope.dart.strong.expect
diff --git a/pkg/front_end/testcases/for_in_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/for_in_scope.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/for_in_scope.dart.direct.transformed.expect
copy to pkg/front_end/testcases/for_in_scope.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart b/pkg/front_end/testcases/for_in_without_declaration.dart
new file mode 100644
index 0000000..2e0951b
--- /dev/null
+++ b/pkg/front_end/testcases/for_in_without_declaration.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+bool topLevelField;
+var untypedTopLevelField;
+
+class Super {
+  int superInstanceField;
+  var untypedSuperInstanceField;
+}
+
+class C extends Super {
+  int instanceField;
+  var untypedInstanceField;
+
+  static double staticField;
+
+  static var untypedStaticField;
+
+  m() {
+    String local;
+    var untypedLocal;
+    for (local in []) {}
+    for (untypedLocal in []) {}
+    for (instanceField in []) {}
+    for (untypedInstanceField in []) {}
+    for (staticField in []) {}
+    for (untypedStaticField in []) {}
+    for (topLevelField in []) {}
+    for (untypedTopLevelField in []) {}
+    for (super.superInstanceField in []) {}
+    for (super.untypedSuperInstanceField in []) {}
+    C c = new C();
+    for (c.instanceField in []) {}
+    for (c.untypedSuperInstanceField in []) {}
+    for (unresolved in []) {}
+    for (unresolved.foo in []) {}
+    for (c.unresolved in []) {}
+    for (main() in []) {}
+    for (var x, y in <int>[]) {
+      print(x);
+      print(y);
+    }
+  }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.expect
new file mode 100644
index 0000000..2aab6ce
--- /dev/null
+++ b/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.expect
@@ -0,0 +1,184 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
+//     for (super.untypedSuperInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
+//     for (c.instanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
+//     for (c.untypedSuperInstanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Warning: Setter not found: 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:10: Warning: Getter not found: 'unresolved'.
+//     for (unresolved.foo in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
+//     for (unresolved.foo in []) {}
+//                    ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
+//     for (c.unresolved in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
+//     for (main() in []) {}
+//              ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+//     for (main() in []) {}
+//          ^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
+//     for (var x, y in <int>[]) {
+//               ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+//     for (var x, y in <int>[]) {
+//          ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
+//     for (super.untypedSuperInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
+//     for (c.instanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
+//     for (c.untypedSuperInstanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
+//     for (unresolved.foo in []) {}
+//                    ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
+//     for (c.unresolved in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
+//     for (main() in []) {}
+//              ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
+//     for (var x, y in <int>[]) {
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int superInstanceField = null;
+  field dynamic untypedSuperInstanceField = null;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+class C extends self::Super {
+  field core::int instanceField = null;
+  field dynamic untypedInstanceField = null;
+  static field core::double staticField = null;
+  static field dynamic untypedStaticField = null;
+  synthetic constructor •() → self::C
+    : super self::Super::•()
+    ;
+  method m() → dynamic {
+    core::String local;
+    dynamic untypedLocal;
+    for (final dynamic #t1 in <dynamic>[]) {
+      local = #t1;
+    }
+    for (final dynamic #t2 in <dynamic>[]) {
+      untypedLocal = #t2;
+    }
+    for (final dynamic #t3 in <dynamic>[]) {
+      this.{self::C::instanceField} = #t3;
+    }
+    for (final dynamic #t4 in <dynamic>[]) {
+      this.{self::C::untypedInstanceField} = #t4;
+    }
+    for (final dynamic #t5 in <dynamic>[]) {
+      self::C::staticField = #t5;
+    }
+    for (final dynamic #t6 in <dynamic>[]) {
+      self::C::untypedStaticField = #t6;
+    }
+    for (final dynamic #t7 in <dynamic>[]) {
+      self::topLevelField = #t7;
+    }
+    for (final dynamic #t8 in <dynamic>[]) {
+      self::untypedTopLevelField = #t8;
+    }
+    for (final dynamic #t9 in <dynamic>[]) {
+      super.{self::Super::superInstanceField} = #t9;
+    }
+    for (final dynamic #t10 in <dynamic>[]) {
+      super.{self::Super::untypedSuperInstanceField} = #t10;
+    }
+    self::C c = new self::C::•();
+    for (final dynamic #t11 in <dynamic>[]) {
+      c.instanceField = #t11;
+    }
+    for (final dynamic #t12 in <dynamic>[]) {
+      c.untypedSuperInstanceField = #t12;
+    }
+    for (final dynamic #t13 in <dynamic>[]) {
+      this.unresolved = #t13;
+    }
+    for (final dynamic #t14 in <dynamic>[]) {
+      this.unresolved.foo = #t14;
+    }
+    for (final dynamic #t15 in <dynamic>[]) {
+      c.unresolved = #t15;
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (main() in []) {}
+         ^^^^";
+      for (final dynamic #t16 in <dynamic>[]) {
+        invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (main() in []) {}
+         ^^^^";
+        self::main();
+      }
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+    for (var x, y in <int>[]) {
+         ^^^";
+      for (final dynamic #t17 in <core::int>[]) {
+        invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+    for (var x, y in <int>[]) {
+         ^^^";
+        dynamic x;
+        dynamic y;
+        {
+          core::print(x);
+          core::print(y);
+        }
+      }
+    }
+  }
+}
+static field core::bool topLevelField;
+static field dynamic untypedTopLevelField;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect
new file mode 100644
index 0000000..88f2996
--- /dev/null
+++ b/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect
@@ -0,0 +1,134 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
+//     for (super.untypedSuperInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
+//     for (c.instanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
+//     for (c.untypedSuperInstanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
+//     for (unresolved.foo in []) {}
+//                    ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
+//     for (c.unresolved in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
+//     for (main() in []) {}
+//              ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
+//     for (var x, y in <int>[]) {
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int superInstanceField = null;
+  field dynamic untypedSuperInstanceField = null;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+class C extends self::Super {
+  field core::int instanceField = null;
+  field dynamic untypedInstanceField = null;
+  static field core::double staticField = null;
+  static field dynamic untypedStaticField = null;
+  synthetic constructor •() → self::C
+    : super self::Super::•()
+    ;
+  method m() → dynamic {
+    core::String local;
+    dynamic untypedLocal;
+    for (final dynamic #t1 in <dynamic>[]) {
+      local = #t1;
+    }
+    for (final dynamic #t2 in <dynamic>[]) {
+      untypedLocal = #t2;
+    }
+    for (final dynamic #t3 in <dynamic>[]) {
+      this.{self::C::instanceField} = #t3;
+    }
+    for (final dynamic #t4 in <dynamic>[]) {
+      this.{self::C::untypedInstanceField} = #t4;
+    }
+    for (final dynamic #t5 in <dynamic>[]) {
+      self::C::staticField = #t5;
+    }
+    for (final dynamic #t6 in <dynamic>[]) {
+      self::C::untypedStaticField = #t6;
+    }
+    for (final dynamic #t7 in <dynamic>[]) {
+      self::topLevelField = #t7;
+    }
+    for (final dynamic #t8 in <dynamic>[]) {
+      self::untypedTopLevelField = #t8;
+    }
+    for (final dynamic #t9 in <dynamic>[]) {
+      super.{self::Super::superInstanceField} = #t9;
+    }
+    for (final dynamic #t10 in <dynamic>[]) {
+      super.{self::Super::untypedSuperInstanceField} = #t10;
+    }
+    self::C c = new self::C::•();
+    for (final dynamic #t11 in <dynamic>[]) {
+      c.instanceField = #t11;
+    }
+    for (final dynamic #t12 in <dynamic>[]) {
+      c.untypedSuperInstanceField = #t12;
+    }
+    for (final dynamic #t13 in <dynamic>[]) {
+      this.unresolved = #t13;
+    }
+    for (final dynamic #t14 in <dynamic>[]) {
+      this.unresolved.foo = #t14;
+    }
+    for (final dynamic #t15 in <dynamic>[]) {
+      c.unresolved = #t15;
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (main() in []) {}
+         ^^^^";
+      for (final dynamic #t16 in <dynamic>[]) {
+        invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (main() in []) {}
+         ^^^^";
+        self::main();
+      }
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+    for (var x, y in <int>[]) {
+         ^^^";
+      for (final dynamic #t17 in <core::int>[]) {
+        invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+    for (var x, y in <int>[]) {
+         ^^^";
+        dynamic x;
+        dynamic y;
+        {
+          core::print(x);
+          core::print(y);
+        }
+      }
+    }
+  }
+}
+static field core::bool topLevelField;
+static field dynamic untypedTopLevelField;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.outline.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.outline.expect
new file mode 100644
index 0000000..c168ef6
--- /dev/null
+++ b/pkg/front_end/testcases/for_in_without_declaration.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int superInstanceField;
+  field dynamic untypedSuperInstanceField;
+  synthetic constructor •() → self::Super
+    ;
+}
+class C extends self::Super {
+  field core::int instanceField;
+  field dynamic untypedInstanceField;
+  static field core::double staticField;
+  static field dynamic untypedStaticField;
+  synthetic constructor •() → self::C
+    ;
+  method m() → dynamic
+    ;
+}
+static field core::bool topLevelField;
+static field dynamic untypedTopLevelField;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.strong.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.strong.expect
new file mode 100644
index 0000000..e672743
--- /dev/null
+++ b/pkg/front_end/testcases/for_in_without_declaration.dart.strong.expect
@@ -0,0 +1,222 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
+//     for (super.untypedSuperInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
+//     for (c.instanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
+//     for (c.untypedSuperInstanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Error: Setter not found: 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:10: Error: Getter not found: 'unresolved'.
+//     for (unresolved.foo in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
+//     for (unresolved.foo in []) {}
+//                    ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
+//     for (c.unresolved in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
+//     for (main() in []) {}
+//              ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+//     for (main() in []) {}
+//          ^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
+//     for (var x, y in <int>[]) {
+//               ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+//     for (var x, y in <int>[]) {
+//          ^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:21: Error: The setter 'foo' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
+//     for (unresolved.foo in []) {}
+//                     ^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+//     for (c.unresolved in []) {}
+//            ^^^^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
+//     for (super.untypedSuperInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
+//     for (c.instanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
+//     for (c.untypedSuperInstanceField in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Error: Setter not found: 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:10: Error: Getter not found: 'unresolved'.
+//     for (unresolved.foo in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
+//     for (unresolved.foo in []) {}
+//                    ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
+//     for (c.unresolved in []) {}
+//           ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
+//     for (main() in []) {}
+//              ^
+//
+// pkg/front_end/testcases/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
+//     for (var x, y in <int>[]) {
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int superInstanceField = null;
+  field dynamic untypedSuperInstanceField = null;
+  synthetic constructor •() → self::Super
+    : super core::Object::•()
+    ;
+}
+class C extends self::Super {
+  field core::int instanceField = null;
+  field dynamic untypedInstanceField = null;
+  static field core::double staticField = null;
+  static field dynamic untypedStaticField = null;
+  synthetic constructor •() → self::C
+    : super self::Super::•()
+    ;
+  method m() → dynamic {
+    core::String local;
+    dynamic untypedLocal;
+    for (final core::String #t1 in <core::String>[]) {
+      local = #t1;
+    }
+    for (final dynamic #t2 in <dynamic>[]) {
+      untypedLocal = #t2;
+    }
+    for (final core::int #t3 in <core::int>[]) {
+      this.{self::C::instanceField} = #t3;
+    }
+    for (final dynamic #t4 in <dynamic>[]) {
+      this.{self::C::untypedInstanceField} = #t4;
+    }
+    for (final core::double #t5 in <core::double>[]) {
+      self::C::staticField = #t5;
+    }
+    for (final dynamic #t6 in <dynamic>[]) {
+      self::C::untypedStaticField = #t6;
+    }
+    for (final core::bool #t7 in <core::bool>[]) {
+      self::topLevelField = #t7;
+    }
+    for (final dynamic #t8 in <dynamic>[]) {
+      self::untypedTopLevelField = #t8;
+    }
+    for (final core::int #t9 in <core::int>[]) {
+      super.{self::Super::superInstanceField} = #t9;
+    }
+    for (final dynamic #t10 in <dynamic>[]) {
+      super.{self::Super::untypedSuperInstanceField} = #t10;
+    }
+    self::C c = new self::C::•();
+    for (final core::int #t11 in <core::int>[]) {
+      c.{self::C::instanceField} = #t11;
+    }
+    for (final dynamic #t12 in <dynamic>[]) {
+      c.{self::Super::untypedSuperInstanceField} = #t12;
+    }
+    for (final dynamic #t13 in <dynamic>[]) {
+      let final dynamic #t14 = this in invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+    for (unresolved in []) {}
+         ^^^^^^^^^^";
+    }
+    for (final dynamic #t15 in <dynamic>[]) {
+      let final dynamic #t16 = this.unresolved in invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:38:21: Error: The setter 'foo' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
+    for (unresolved.foo in []) {}
+                    ^^^";
+    }
+    for (final dynamic #t17 in <dynamic>[]) {
+      let final dynamic #t18 = c in invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
+    for (c.unresolved in []) {}
+           ^^^^^^^^^^";
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (main() in []) {}
+         ^^^^";
+      for (final dynamic #t19 in <dynamic>[]) {
+        invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (main() in []) {}
+         ^^^^";
+        self::main();
+      }
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+    for (var x, y in <int>[]) {
+         ^^^";
+      for (final core::int #t20 in <core::int>[]) {
+        invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
+    for (var x, y in <int>[]) {
+         ^^^";
+        dynamic x;
+        dynamic y;
+        {
+          core::print(x);
+          core::print(y);
+        }
+      }
+    }
+  }
+}
+static field core::bool topLevelField;
+static field dynamic untypedTopLevelField;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_in_field.dart.direct.expect b/pkg/front_end/testcases/function_in_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/function_in_field.dart.direct.expect
rename to pkg/front_end/testcases/function_in_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/function_in_field.dart.direct.transformed.expect b/pkg/front_end/testcases/function_in_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/function_in_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/function_in_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/function_in_field.dart.strong.expect b/pkg/front_end/testcases/function_in_field.dart.strong.expect
new file mode 100644
index 0000000..4cbb448
--- /dev/null
+++ b/pkg/front_end/testcases/function_in_field.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field () → core::int x = () → core::int {
+  core::int y = 42;
+  return y;
+};
+static method main() → dynamic {
+  core::print(self::x.call());
+}
diff --git a/pkg/front_end/testcases/function_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/function_in_field.dart.strong.transformed.expect
new file mode 100644
index 0000000..4cbb448
--- /dev/null
+++ b/pkg/front_end/testcases/function_in_field.dart.strong.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field () → core::int x = () → core::int {
+  core::int y = 42;
+  return y;
+};
+static method main() → dynamic {
+  core::print(self::x.call());
+}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart b/pkg/front_end/testcases/function_type_assignments.dart
new file mode 100644
index 0000000..f6249ea
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_assignments.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+T identity<T>(T t) => t;
+T identityObject<T extends Object>(T t) => t;
+T identityList<T extends List<T>>(T t) => t;
+
+// Test that error messages involving generic function types
+// print the type variable bounds correctly.
+String x = identity; // No bound
+String y = identityObject; // Object bound
+String z = identityList; // List<T> bound
+
+main() {}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.legacy.expect b/pkg/front_end/testcases/function_type_assignments.dart.legacy.expect
new file mode 100644
index 0000000..fa72575
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_assignments.dart.legacy.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String x = self::identity;
+static field core::String y = self::identityObject;
+static field core::String z = self::identityList;
+static method identity<T extends core::Object = dynamic>(self::identity::T t) → self::identity::T
+  return t;
+static method identityObject<T extends core::Object = dynamic>(self::identityObject::T t) → self::identityObject::T
+  return t;
+static method identityList<T extends core::List<self::identityList::T> = dynamic>(self::identityList::T t) → self::identityList::T
+  return t;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.legacy.transformed.expect b/pkg/front_end/testcases/function_type_assignments.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fa72575
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_assignments.dart.legacy.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String x = self::identity;
+static field core::String y = self::identityObject;
+static field core::String z = self::identityList;
+static method identity<T extends core::Object = dynamic>(self::identity::T t) → self::identity::T
+  return t;
+static method identityObject<T extends core::Object = dynamic>(self::identityObject::T t) → self::identityObject::T
+  return t;
+static method identityList<T extends core::List<self::identityList::T> = dynamic>(self::identityList::T t) → self::identityList::T
+  return t;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.outline.expect b/pkg/front_end/testcases/function_type_assignments.dart.outline.expect
new file mode 100644
index 0000000..deb3a40
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_assignments.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String x;
+static field core::String y;
+static field core::String z;
+static method identity<T extends core::Object = dynamic>(self::identity::T t) → self::identity::T
+  ;
+static method identityObject<T extends core::Object = dynamic>(self::identityObject::T t) → self::identityObject::T
+  ;
+static method identityList<T extends core::List<self::identityList::T> = dynamic>(self::identityList::T t) → self::identityList::T
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.strong.expect b/pkg/front_end/testcases/function_type_assignments.dart.strong.expect
new file mode 100644
index 0000000..a7d04c0
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_assignments.dart.strong.expect
@@ -0,0 +1,44 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+// String x = identity; // No bound
+//            ^
+//
+// pkg/front_end/testcases/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
+//  - 'Object' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+// String y = identityObject; // Object bound
+//            ^
+//
+// pkg/front_end/testcases/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+// String z = identityList; // List<T> bound
+//            ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String x = identity; // No bound
+           ^" in self::identity as{TypeError} core::String;
+static field core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
+ - 'Object' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String y = identityObject; // Object bound
+           ^" in self::identityObject as{TypeError} core::String;
+static field core::String z = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String z = identityList; // List<T> bound
+           ^" in self::identityList as{TypeError} core::String;
+static method identity<T extends core::Object = dynamic>(self::identity::T t) → self::identity::T
+  return t;
+static method identityObject<T extends core::Object = core::Object>(self::identityObject::T t) → self::identityObject::T
+  return t;
+static method identityList<T extends core::List<self::identityList::T> = core::List<dynamic>>(self::identityList::T t) → self::identityList::T
+  return t;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.strong.transformed.expect b/pkg/front_end/testcases/function_type_assignments.dart.strong.transformed.expect
new file mode 100644
index 0000000..f945f65
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_assignments.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String x = identity; // No bound
+           ^" in self::identity as{TypeError} core::String;
+static field core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
+ - 'Object' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String y = identityObject; // Object bound
+           ^" in self::identityObject as{TypeError} core::String;
+static field core::String z = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String z = identityList; // List<T> bound
+           ^" in self::identityList as{TypeError} core::String;
+static method identity<T extends core::Object = dynamic>(self::identity::T t) → self::identity::T
+  return t;
+static method identityObject<T extends core::Object = core::Object>(self::identityObject::T t) → self::identityObject::T
+  return t;
+static method identityList<T extends core::List<self::identityList::T> = core::List<dynamic>>(self::identityList::T t) → self::identityList::T
+  return t;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_type_default_value.dart.direct.expect b/pkg/front_end/testcases/function_type_default_value.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/function_type_default_value.dart.direct.expect
rename to pkg/front_end/testcases/function_type_default_value.dart.legacy.expect
diff --git a/pkg/front_end/testcases/function_type_default_value.dart.direct.transformed.expect b/pkg/front_end/testcases/function_type_default_value.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/function_type_default_value.dart.direct.transformed.expect
rename to pkg/front_end/testcases/function_type_default_value.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.direct.expect b/pkg/front_end/testcases/function_type_is_check.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/function_type_is_check.dart.direct.expect
rename to pkg/front_end/testcases/function_type_is_check.dart.legacy.expect
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.direct.transformed.expect b/pkg/front_end/testcases/function_type_is_check.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/function_type_is_check.dart.direct.transformed.expect
rename to pkg/front_end/testcases/function_type_is_check.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.type_promotion.expect b/pkg/front_end/testcases/function_type_is_check.dart.type_promotion.expect
new file mode 100644
index 0000000..9ad971a
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_is_check.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/function_type_is_check.dart:8:9: Context: Possible promotion of f@272
+  if (f is void Function(Object, StackTrace)) return 1;
+        ^^
+pkg/front_end/testcases/function_type_is_check.dart:9:9: Context: Possible promotion of f@272
+  if (f is void Function(Object)) return 10;
+        ^^
+pkg/front_end/testcases/function_type_is_check.dart:10:9: Context: Possible promotion of f@272
+  if (f is void Function()) return 100;
+        ^^
diff --git a/pkg/front_end/testcases/function_type_recovery.dart.strong.expect b/pkg/front_end/testcases/function_type_recovery.dart.strong.expect
new file mode 100644
index 0000000..ff7a407
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_recovery.dart.strong.expect
@@ -0,0 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/function_type_recovery.dart:8:31: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+// typedef F = int Function(int f(String x));
+//                               ^
+//
+// pkg/front_end/testcases/function_type_recovery.dart:12:27: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+//   String Function(String g(int y)) g = null;
+//                           ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/function_type_recovery.dart:8:31: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+// typedef F = int Function(int f(String x));
+//                               ^
+//
+// pkg/front_end/testcases/function_type_recovery.dart:12:27: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+//   String Function(String g(int y)) g = null;
+//                           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F = ((core::String) → core::int) → core::int;
+static method main() → dynamic {
+  ((core::String) → core::int) → core::int f = null;
+  ((core::int) → core::String) → core::String g = null;
+}
diff --git a/pkg/front_end/testcases/function_type_recovery.dart.strong.transformed.expect b/pkg/front_end/testcases/function_type_recovery.dart.strong.transformed.expect
new file mode 100644
index 0000000..cc3bac0
--- /dev/null
+++ b/pkg/front_end/testcases/function_type_recovery.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/function_type_recovery.dart:8:31: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+// typedef F = int Function(int f(String x));
+//                               ^
+//
+// pkg/front_end/testcases/function_type_recovery.dart:12:27: Error: Inline function types cannot be used for parameters in a generic function type.
+// Try changing the inline function type (as in 'int f()') to a prefixed function type using the `Function` keyword (as in 'int Function() f').
+//   String Function(String g(int y)) g = null;
+//                           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F = ((core::String) → core::int) → core::int;
+static method main() → dynamic {
+  ((core::String) → core::int) → core::int f = null;
+  ((core::int) → core::String) → core::String g = null;
+}
diff --git a/pkg/front_end/testcases/functions.dart.direct.expect b/pkg/front_end/testcases/functions.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/functions.dart.direct.expect
rename to pkg/front_end/testcases/functions.dart.legacy.expect
diff --git a/pkg/front_end/testcases/functions.dart.direct.transformed.expect b/pkg/front_end/testcases/functions.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/functions.dart.direct.transformed.expect
rename to pkg/front_end/testcases/functions.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/functions.dart.strong.expect b/pkg/front_end/testcases/functions.dart.strong.expect
new file mode 100644
index 0000000..500ef71
--- /dev/null
+++ b/pkg/front_end/testcases/functions.dart.strong.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function local(({a: dynamic}) → void f) → void {
+    f.call(a: "Hello, World");
+    f.call();
+  }
+  local.call(({dynamic a = "Default greeting!"}) → core::Null {
+    core::print(a);
+  });
+}
diff --git a/pkg/front_end/testcases/functions.dart.strong.transformed.expect b/pkg/front_end/testcases/functions.dart.strong.transformed.expect
new file mode 100644
index 0000000..500ef71
--- /dev/null
+++ b/pkg/front_end/testcases/functions.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function local(({a: dynamic}) → void f) → void {
+    f.call(a: "Hello, World");
+    f.call();
+  }
+  local.call(({dynamic a = "Default greeting!"}) → core::Null {
+    core::print(a);
+  });
+}
diff --git a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
deleted file mode 100644
index 1461a82..0000000
--- a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
+++ /dev/null
@@ -1,79 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return null;
-}
-class B extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method bar() → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          :return_value = this.{self::B::a}.foo();
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-}
-class C extends core::Object {
-  field self::B b = new self::B::•();
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method baz() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
-    asy::FutureOr<core::int> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          :return_value = this.{self::C::b}.bar();
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/future_or_test.dart.direct.expect b/pkg/front_end/testcases/future_or_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/future_or_test.dart.direct.expect
rename to pkg/front_end/testcases/future_or_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/future_or_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e7939ce
--- /dev/null
+++ b/pkg/front_end/testcases/future_or_test.dart.legacy.transformed.expect
@@ -0,0 +1,79 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return null;
+}
+class B extends core::Object {
+  field self::A a = null;
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method bar() → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          :return_value = this.{self::B::a}.foo();
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+}
+class C extends core::Object {
+  field self::B b = new self::B::•();
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method baz() → asy::Future<core::int> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+    asy::FutureOr<core::int> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          :return_value = this.{self::C::b}.bar();
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
index 5ee7d6b..91c8f82 100644
--- a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
     : super core::Object::•()
     ;
   method bar() → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -39,7 +39,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
 }
@@ -49,7 +49,7 @@
     : super core::Object::•()
     ;
   method baz() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -72,7 +72,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
 }
diff --git a/pkg/front_end/testcases/hello.dart.direct.expect b/pkg/front_end/testcases/hello.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/hello.dart.direct.expect
rename to pkg/front_end/testcases/hello.dart.legacy.expect
diff --git a/pkg/front_end/testcases/hello.dart.direct.transformed.expect b/pkg/front_end/testcases/hello.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/hello.dart.direct.transformed.expect
rename to pkg/front_end/testcases/hello.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/hello.dart.direct.expect b/pkg/front_end/testcases/hello.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/hello.dart.direct.expect
copy to pkg/front_end/testcases/hello.dart.strong.expect
diff --git a/pkg/front_end/testcases/hello.dart.direct.transformed.expect b/pkg/front_end/testcases/hello.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/hello.dart.direct.transformed.expect
copy to pkg/front_end/testcases/hello.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
deleted file mode 100644
index 1364b6c..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
-//   var x = void f<T>(T t) {};
-//                ^
-//
-// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
-//   print(void g<T>(T t) {});
-//              ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
-//   var x = void f<T>(T t) {};
-//                ^
-//
-// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
-//   print(void g<T>(T t) {});
-//              ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → dynamic {} in f;
-  core::print(x.runtimeType);
-  core::print(let final <T extends core::Object = dynamic>(T) → void g = <T extends core::Object = dynamic>(T t) → dynamic {} in g);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
deleted file mode 100644
index 72e3e66..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.direct.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
-//   var x = void f<T>(T t) {};
-//                ^
-//
-// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
-//   print(void g<T>(T t) {});
-//              ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → dynamic {} in f;
-  core::print(x.runtimeType);
-  core::print(let final <T extends core::Object = dynamic>(T) → void g = <T extends core::Object = dynamic>(T t) → dynamic {} in g);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.expect
new file mode 100644
index 0000000..79cb600
--- /dev/null
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.expect
@@ -0,0 +1,29 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → void {} in f;
+  core::print(x.runtimeType);
+  core::print(let final <T extends core::Object = dynamic>(T) → void g = <T extends core::Object = dynamic>(T t) → void {} in g);
+}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9627a6e8
--- /dev/null
+++ b/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:6:16: Error: A function expression can't have a name.
+//   var x = void f<T>(T t) {};
+//                ^
+//
+// pkg/front_end/testcases/illegal_named_function_expression.dart:8:14: Error: A function expression can't have a name.
+//   print(void g<T>(T t) {});
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → void {} in f;
+  core::print(x.runtimeType);
+  core::print(let final <T extends core::Object = dynamic>(T) → void g = <T extends core::Object = dynamic>(T t) → void {} in g);
+}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect
deleted file mode 100644
index 246c806..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
-//   print(void f() {});
-//              ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
-//   print(void f() {});
-//              ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  function f() → void {}
-  core::print(let final () → void f = () → dynamic {} in f);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect
deleted file mode 100644
index 1cf55b6..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.direct.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
-//   print(void f() {});
-//              ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  function f() → void {}
-  core::print(let final () → void f = () → dynamic {} in f);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.expect
new file mode 100644
index 0000000..a8247f6
--- /dev/null
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.expect
@@ -0,0 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function f() → void {}
+  core::print(let final () → void f = () → void {} in f);
+}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9df8705
--- /dev/null
+++ b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.transformed.expect
@@ -0,0 +1,14 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/illegal_named_function_expression_scope.dart:7:14: Error: A function expression can't have a name.
+//   print(void f() {});
+//              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function f() → void {}
+  core::print(let final () → void f = () → void {} in f);
+}
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.expect
rename to pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.expect
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.transformed.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_const_with_static_fields.dart.direct.transformed.expect
rename to pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/implicit_new.dart.direct.expect b/pkg/front_end/testcases/implicit_new.dart.direct.expect
deleted file mode 100644
index a61a281..0000000
--- a/pkg/front_end/testcases/implicit_new.dart.direct.expect
+++ /dev/null
@@ -1,69 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/implicit_new.dart:18:18: Warning: Method not found: 'Bar'.
-//   var y = prefix.Bar();
-//                  ^^^
-//
-// pkg/front_end/testcases/implicit_new.dart:19:10: Warning: Method not found: 'Bar'.
-//   prefix.Bar();
-//          ^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → dynamic
-    return null;
-}
-class Bar extends core::Object {
-  constructor named() → self::Bar
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → dynamic
-    return null;
-}
-class IndexTester extends core::Object {
-  synthetic constructor •() → self::IndexTester
-    : super core::Object::•()
-    ;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic _a, dynamic _b) → void {}
-}
-static method testNSM() → dynamic {
-  dynamic y = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method f(dynamic x) → dynamic
-  return x;
-static method main() → dynamic {
-  dynamic x = new self::Foo::•();
-  x = new self::Foo::•();
-  dynamic z = new self::Bar::named();
-  z = new self::Bar::named();
-  self::f(new self::Foo::•());
-  self::f(new self::Foo::•());
-  self::f(new self::Bar::named());
-  self::f(new self::Bar::named());
-  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
-  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
-  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
-  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
-  dynamic i = new self::IndexTester::•();
-  i.[](new self::Foo::•());
-  i.[](new self::Foo::•());
-  i.[](new self::Bar::named());
-  i.[](new self::Bar::named());
-  i.[]=(new self::Foo::•(), null);
-  i.[]=(new self::Foo::•(), null);
-  i.[]=(new self::Bar::named(), null);
-  i.[]=(new self::Bar::named(), null);
-  new self::Foo::•().+(new self::Bar::named());
-  new self::Foo::•().+(new self::Bar::named());
-  new self::Bar::named().+(new self::Foo::•());
-  new self::Bar::named().+(new self::Foo::•());
-}
diff --git a/pkg/front_end/testcases/implicit_new.dart.direct.transformed.expect b/pkg/front_end/testcases/implicit_new.dart.direct.transformed.expect
deleted file mode 100644
index 3c0f68f..0000000
--- a/pkg/front_end/testcases/implicit_new.dart.direct.transformed.expect
+++ /dev/null
@@ -1,59 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → dynamic
-    return null;
-}
-class Bar extends core::Object {
-  constructor named() → self::Bar
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → dynamic
-    return null;
-}
-class IndexTester extends core::Object {
-  synthetic constructor •() → self::IndexTester
-    : super core::Object::•()
-    ;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic _a, dynamic _b) → void {}
-}
-static method testNSM() → dynamic {
-  dynamic y = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method f(dynamic x) → dynamic
-  return x;
-static method main() → dynamic {
-  dynamic x = new self::Foo::•();
-  x = new self::Foo::•();
-  dynamic z = new self::Bar::named();
-  z = new self::Bar::named();
-  self::f(new self::Foo::•());
-  self::f(new self::Foo::•());
-  self::f(new self::Bar::named());
-  self::f(new self::Bar::named());
-  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
-  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
-  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
-  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
-  dynamic i = new self::IndexTester::•();
-  i.[](new self::Foo::•());
-  i.[](new self::Foo::•());
-  i.[](new self::Bar::named());
-  i.[](new self::Bar::named());
-  i.[]=(new self::Foo::•(), null);
-  i.[]=(new self::Foo::•(), null);
-  i.[]=(new self::Bar::named(), null);
-  i.[]=(new self::Bar::named(), null);
-  new self::Foo::•().+(new self::Bar::named());
-  new self::Foo::•().+(new self::Bar::named());
-  new self::Bar::named().+(new self::Foo::•());
-  new self::Bar::named().+(new self::Foo::•());
-}
diff --git a/pkg/front_end/testcases/implicit_new.dart.legacy.expect b/pkg/front_end/testcases/implicit_new.dart.legacy.expect
new file mode 100644
index 0000000..d2fd4b41
--- /dev/null
+++ b/pkg/front_end/testcases/implicit_new.dart.legacy.expect
@@ -0,0 +1,69 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/implicit_new.dart:18:18: Warning: Method not found: 'Bar'.
+//   var y = prefix.Bar();
+//                  ^^^
+//
+// pkg/front_end/testcases/implicit_new.dart:19:10: Warning: Method not found: 'Bar'.
+//   prefix.Bar();
+//          ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+}
+class Bar extends core::Object {
+  constructor named() → self::Bar
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+}
+class IndexTester extends core::Object {
+  synthetic constructor •() → self::IndexTester
+    : super core::Object::•()
+    ;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic _a, dynamic _b) → void {}
+}
+static method testNSM() → dynamic {
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method f(dynamic x) → dynamic
+  return x;
+static method main() → dynamic {
+  dynamic x = new self::Foo::•();
+  x = new self::Foo::•();
+  dynamic z = new self::Bar::named();
+  z = new self::Bar::named();
+  self::f(new self::Foo::•());
+  self::f(new self::Foo::•());
+  self::f(new self::Bar::named());
+  self::f(new self::Bar::named());
+  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
+  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
+  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  dynamic i = new self::IndexTester::•();
+  i.[](new self::Foo::•());
+  i.[](new self::Foo::•());
+  i.[](new self::Bar::named());
+  i.[](new self::Bar::named());
+  i.[]=(new self::Foo::•(), null);
+  i.[]=(new self::Foo::•(), null);
+  i.[]=(new self::Bar::named(), null);
+  i.[]=(new self::Bar::named(), null);
+  new self::Foo::•().+(new self::Bar::named());
+  new self::Foo::•().+(new self::Bar::named());
+  new self::Bar::named().+(new self::Foo::•());
+  new self::Bar::named().+(new self::Foo::•());
+}
diff --git a/pkg/front_end/testcases/implicit_new.dart.legacy.transformed.expect b/pkg/front_end/testcases/implicit_new.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5a42d71
--- /dev/null
+++ b/pkg/front_end/testcases/implicit_new.dart.legacy.transformed.expect
@@ -0,0 +1,59 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+}
+class Bar extends core::Object {
+  constructor named() → self::Bar
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+}
+class IndexTester extends core::Object {
+  synthetic constructor •() → self::IndexTester
+    : super core::Object::•()
+    ;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic _a, dynamic _b) → void {}
+}
+static method testNSM() → dynamic {
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method f(dynamic x) → dynamic
+  return x;
+static method main() → dynamic {
+  dynamic x = new self::Foo::•();
+  x = new self::Foo::•();
+  dynamic z = new self::Bar::named();
+  z = new self::Bar::named();
+  self::f(new self::Foo::•());
+  self::f(new self::Foo::•());
+  self::f(new self::Bar::named());
+  self::f(new self::Bar::named());
+  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
+  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
+  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  dynamic i = new self::IndexTester::•();
+  i.[](new self::Foo::•());
+  i.[](new self::Foo::•());
+  i.[](new self::Bar::named());
+  i.[](new self::Bar::named());
+  i.[]=(new self::Foo::•(), null);
+  i.[]=(new self::Foo::•(), null);
+  i.[]=(new self::Bar::named(), null);
+  i.[]=(new self::Bar::named(), null);
+  new self::Foo::•().+(new self::Bar::named());
+  new self::Foo::•().+(new self::Bar::named());
+  new self::Bar::named().+(new self::Foo::•());
+  new self::Bar::named().+(new self::Foo::•());
+}
diff --git a/pkg/front_end/testcases/implicit_new.dart.type_promotion.expect b/pkg/front_end/testcases/implicit_new.dart.type_promotion.expect
new file mode 100644
index 0000000..33f7ebc
--- /dev/null
+++ b/pkg/front_end/testcases/implicit_new.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/implicit_new.dart:31:5: Context: Write to x@522
+  x = prefix.Foo();
+    ^
+pkg/front_end/testcases/implicit_new.dart:33:5: Context: Write to z@559
+  z = prefix.Bar.named();
+    ^
+pkg/front_end/testcases/implicit_new.dart:39:5: Context: Write to l@682
+  l = [prefix.Foo(), prefix.Bar.named()];
+    ^
+pkg/front_end/testcases/implicit_new.dart:41:5: Context: Write to m@756
+  m = {"foo": prefix.Foo(), "bar": prefix.Bar.named()};
+    ^
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.direct.expect b/pkg/front_end/testcases/implicit_scope_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_scope_test.dart.direct.expect
rename to pkg/front_end/testcases/implicit_scope_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.direct.transformed.expect b/pkg/front_end/testcases/implicit_scope_test.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_scope_test.dart.direct.transformed.expect
rename to pkg/front_end/testcases/implicit_scope_test.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.type_promotion.expect b/pkg/front_end/testcases/implicit_scope_test.dart.type_promotion.expect
new file mode 100644
index 0000000..cf8d11a
--- /dev/null
+++ b/pkg/front_end/testcases/implicit_scope_test.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/implicit_scope_test.dart:28:30: Context: Write to i@736
+    for (int i = 0; i < 10; i++) var a = "bar", b = "baz";
+                             ^^
diff --git a/pkg/front_end/testcases/implicit_this.dart.direct.expect b/pkg/front_end/testcases/implicit_this.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_this.dart.direct.expect
rename to pkg/front_end/testcases/implicit_this.dart.legacy.expect
diff --git a/pkg/front_end/testcases/implicit_this.dart.direct.transformed.expect b/pkg/front_end/testcases/implicit_this.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_this.dart.direct.transformed.expect
rename to pkg/front_end/testcases/implicit_this.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/implicit_this.dart.strong.expect b/pkg/front_end/testcases/implicit_this.dart.strong.expect
new file mode 100644
index 0000000..fca414d
--- /dev/null
+++ b/pkg/front_end/testcases/implicit_this.dart.strong.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    core::print("Called m");
+  }
+  method testC() → dynamic {
+    this.{self::C::m}();
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method testD() → dynamic {
+    this.{self::C::m}();
+  }
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::testC}();
+  new self::D::•().{self::D::testD}();
+}
diff --git a/pkg/front_end/testcases/implicit_this.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_this.dart.strong.transformed.expect
new file mode 100644
index 0000000..fca414d
--- /dev/null
+++ b/pkg/front_end/testcases/implicit_this.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method m() → dynamic {
+    core::print("Called m");
+  }
+  method testC() → dynamic {
+    this.{self::C::m}();
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method testD() → dynamic {
+    this.{self::C::m}();
+  }
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::testC}();
+  new self::D::•().{self::D::testD}();
+}
diff --git a/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.expect b/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.expect
new file mode 100644
index 0000000..9b7ba9d
--- /dev/null
+++ b/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.expect
@@ -0,0 +1,70 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
+//   C.b(this.);
+//            ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
+//   C.d(this., p);
+//            ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
+//   C.b(this.);
+//            ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
+//   C.d(this., p);
+//            ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor a() → self::C
+    : super core::Object::•()
+    ;
+  constructor b() → self::C
+    : super core::Object::•()
+    ;
+  constructor c() → self::C
+    : super core::Object::•()
+    ;
+  constructor d() → self::C
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.transformed.expect
new file mode 100644
index 0000000..6bcd2e6
--- /dev/null
+++ b/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.transformed.expect
@@ -0,0 +1,44 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
+//   C.b(this.);
+//            ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
+//   C.d(this., p);
+//            ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor a() → self::C
+    : super core::Object::•()
+    ;
+  constructor b() → self::C
+    : super core::Object::•()
+    ;
+  constructor c() → self::C
+    : super core::Object::•()
+    ;
+  constructor d() → self::C
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/incremental_bulk_compiler_full.status b/pkg/front_end/testcases/incremental_bulk_compiler_full.status
index d5e7324..9ceffba 100644
--- a/pkg/front_end/testcases/incremental_bulk_compiler_full.status
+++ b/pkg/front_end/testcases/incremental_bulk_compiler_full.status
@@ -2,8 +2,12 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE.md file.
 language_2/deferred_super_dependency_test: Crash # missing "#errors"
+language_2/duplicate_export_collision_test: Crash # missing '#errors'
+language_2/import_nonexisting_dart_uri_test: Crash # missing '#errors'
+language_2/internal_library_test: Crash # non-identical '#errors'
 language_2/missing_part_of_tag_test: Crash # missing empty library that shouldn't have been there in the first place
+language_2/mixin_type_parameter_inference_error_test: Crash # non-identical '#errors'
 language_2/part_of_multiple_libs_test: Crash # missing "#errors"
-language_2/regress_27957_test: Crash # isSynthetic becomes false on C1 SuperInitializer.
+language_2/part_refers_to_core_library_test: Crash # non-identical '#errors'
 language_2/script1_negative_test: Crash # missing "#errors", missing empty library that shouldn't have been there in the first place
 language_2/script2_negative_test: Crash # missing "#errors", missing empty library that shouldn't have been there in the first place
diff --git a/pkg/front_end/testcases/incremental_bulk_compiler_smoke.status b/pkg/front_end/testcases/incremental_bulk_compiler_smoke.status
index 4240855..959cc51 100644
--- a/pkg/front_end/testcases/incremental_bulk_compiler_smoke.status
+++ b/pkg/front_end/testcases/incremental_bulk_compiler_smoke.status
@@ -1,9 +1,8 @@
 # Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE.md file.
+
 language_2/deferred_super_dependency_test: Crash # missing "#errors"
 language_2/missing_part_of_tag_test: Crash # missing empty library that shouldn't have been there in the first place
-language_2/regress_27957_test: Crash # isSynthetic becomes false on C1 SuperInitializer.
 language_2/script1_negative_test: Crash # missing "#errors", missing empty library that shouldn't have been there in the first place
 language_2/script2_negative_test: Crash # missing "#errors", missing empty library that shouldn't have been there in the first place
-
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_from_package_url_as_file.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_from_package_url_as_file.yaml
new file mode 100644
index 0000000..d5a757b
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_from_package_url_as_file.yaml
@@ -0,0 +1,25 @@
+# Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Test that invalidating a part of a package works with package URI when the
+# part file was referenced via a package URI
+
+type: basic
+entry: "package:example/main.dart"
+strong: false
+invalidate:
+  - pkg/example/b.dart
+sources:
+  pkg/example/main.dart: |
+    part "package:example/b.dart";
+    main() {
+      print("hello");
+      b();
+    }
+  pkg/example/b.dart: |
+    part of "package:example/main.dart";
+    b() {
+      print("b1");
+    }
+  .packages: example:pkg/example
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_from_package_url_as_package.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_from_package_url_as_package.yaml
new file mode 100644
index 0000000..149b1ae
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_from_package_url_as_package.yaml
@@ -0,0 +1,25 @@
+# Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Test that invalidating a part of a package works with package URI when the
+# part file was referenced via a package URI
+
+type: basic
+entry: "package:example/main.dart"
+strong: false
+invalidate:
+  - "package:example/b.dart"
+sources:
+  pkg/example/main.dart: |
+    part "package:example/b.dart";
+    main() {
+      print("hello");
+      b();
+    }
+  pkg/example/b.dart: |
+    part of "package:example/main.dart";
+    b() {
+      print("b1");
+    }
+  .packages: example:pkg/example
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml
new file mode 100644
index 0000000..5fd397a
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/regress_35215.yaml
@@ -0,0 +1,44 @@
+# Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Load from a dill file, update a file in the dill that is the context of an
+# error in such a way that the position in the newly compiled procedure doesn't
+# exist in the old library.
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        import "b.dart";
+        main() {
+          b(42);
+        }
+      b.dart: |
+        b({int named}) {
+          print("b");
+        }
+    expectedLibraryCount: 2
+    errors: true
+  - entry: main.dart
+    worldTypex: updated
+    invalidate:
+      - b.dart
+    sources:
+      main.dart: |
+        import "b.dart";
+        main() {
+          b(42);
+        }
+      b.dart: |
+        // lots of comments
+        // forcing offsets down
+        // and also adding more lines
+        // and whatnot
+        b({int named}) {
+          print("b");
+        }
+    expectedLibraryCount: 2
+    errors: true
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.expect
rename to pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/abstract_class_instantiation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/assert.dart.direct.expect b/pkg/front_end/testcases/inference/assert.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/assert.dart.direct.expect
rename to pkg/front_end/testcases/inference/assert.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/assert.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/assert.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/assert.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/assert.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/assert_initializer.dart.direct.expect
rename to pkg/front_end/testcases/inference/assert_initializer.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/assert_initializer.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/assert_initializer.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.direct.expect b/pkg/front_end/testcases/inference/assign_local.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/assign_local.dart.direct.expect
rename to pkg/front_end/testcases/inference/assign_local.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/assign_local.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/assign_local.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/assign_local.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect
new file mode 100644
index 0000000..f49cffea
--- /dev/null
+++ b/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/inference/assign_local.dart:14:29: Context: Write to x@320
+  var /*@type=int*/ x1 = (x = 1);
+                            ^
+pkg/front_end/testcases/inference/assign_local.dart:15:32: Context: Write to x@320
+  var /*@type=double*/ x2 = (x = 1.0);
+                               ^
+pkg/front_end/testcases/inference/assign_local.dart:18:32: Context: Write to y@406
+  var /*@type=A<int>*/ y1 = (y = new /*@typeArgs=int*/ A());
+                               ^
+pkg/front_end/testcases/inference/assign_local.dart:19:32: Context: Write to y@406
+  var /*@type=B<int>*/ y2 = (y = new /*@typeArgs=int*/ B());
+                               ^
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
deleted file mode 100644
index 7e5db5d..0000000
--- a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
+++ /dev/null
@@ -1,337 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → self::MyFuture
-    : super core::Object::•()
-    ;
-}
-static method test() → void /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        core::int x0;
-        asy::Future<core::int> x1;
-        asy::Future<asy::Future<core::int>> x2;
-        asy::Future<asy::FutureOr<core::int>> x3;
-        asy::Future<self::MyFuture> x4;
-        asy::FutureOr<core::int> x5;
-        asy::FutureOr<asy::Future<core::int>> x6;
-        asy::FutureOr<asy::FutureOr<core::int>> x7;
-        asy::FutureOr<self::MyFuture> x8;
-        self::MyFuture x9;
-        function test0() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L2:
-              {
-                :return_value = x0;
-                break #L2;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test1() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L3:
-              {
-                :return_value = x1;
-                break #L3;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test2() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L4:
-              {
-                :return_value = x2;
-                break #L4;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test3() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L5:
-              {
-                :return_value = x3;
-                break #L5;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test4() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L6:
-              {
-                :return_value = x4;
-                break #L6;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test5() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L7:
-              {
-                :return_value = x5;
-                break #L7;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test6() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L8:
-              {
-                :return_value = x6;
-                break #L8;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test7() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L9:
-              {
-                :return_value = x7;
-                break #L9;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test8() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L10:
-              {
-                :return_value = x8;
-                break #L10;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        function test9() → dynamic /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L11:
-              {
-                :return_value = x9;
-                break #L11;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        }
-        [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y0 = :result;
-        [yield] let dynamic #t2 = asy::_awaitHelper(x1, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y1 = :result;
-        [yield] let dynamic #t3 = asy::_awaitHelper(x2, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y2 = :result;
-        [yield] let dynamic #t4 = asy::_awaitHelper(x3, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y3 = :result;
-        [yield] let dynamic #t5 = asy::_awaitHelper(x4, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y4 = :result;
-        [yield] let dynamic #t6 = asy::_awaitHelper(x5, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y5 = :result;
-        [yield] let dynamic #t7 = asy::_awaitHelper(x6, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y6 = :result;
-        [yield] let dynamic #t8 = asy::_awaitHelper(x7, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y7 = :result;
-        [yield] let dynamic #t9 = asy::_awaitHelper(x8, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y8 = :result;
-        [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
-        dynamic y9 = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.expect b/pkg/front_end/testcases/inference/async_await.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/async_await.dart.direct.expect
rename to pkg/front_end/testcases/inference/async_await.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/async_await.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.legacy.transformed.expect
new file mode 100644
index 0000000..939d401
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_await.dart.legacy.transformed.expect
@@ -0,0 +1,337 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class MyFuture extends core::Object implements asy::Future<core::int> {
+  synthetic constructor •() → self::MyFuture
+    : super core::Object::•()
+    ;
+}
+static method test() → void /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::int x0;
+        asy::Future<core::int> x1;
+        asy::Future<asy::Future<core::int>> x2;
+        asy::Future<asy::FutureOr<core::int>> x3;
+        asy::Future<self::MyFuture> x4;
+        asy::FutureOr<core::int> x5;
+        asy::FutureOr<asy::Future<core::int>> x6;
+        asy::FutureOr<asy::FutureOr<core::int>> x7;
+        asy::FutureOr<self::MyFuture> x8;
+        self::MyFuture x9;
+        function test0() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L2:
+              {
+                :return_value = x0;
+                break #L2;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test1() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L3:
+              {
+                :return_value = x1;
+                break #L3;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test2() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L4:
+              {
+                :return_value = x2;
+                break #L4;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test3() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L5:
+              {
+                :return_value = x3;
+                break #L5;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test4() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L6:
+              {
+                :return_value = x4;
+                break #L6;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test5() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L7:
+              {
+                :return_value = x5;
+                break #L7;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test6() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L8:
+              {
+                :return_value = x6;
+                break #L8;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test7() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L9:
+              {
+                :return_value = x7;
+                break #L9;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test8() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L10:
+              {
+                :return_value = x8;
+                break #L10;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        function test9() → dynamic /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L11:
+              {
+                :return_value = x9;
+                break #L11;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        }
+        [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y0 = :result;
+        [yield] let dynamic #t2 = asy::_awaitHelper(x1, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y1 = :result;
+        [yield] let dynamic #t3 = asy::_awaitHelper(x2, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y2 = :result;
+        [yield] let dynamic #t4 = asy::_awaitHelper(x3, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y3 = :result;
+        [yield] let dynamic #t5 = asy::_awaitHelper(x4, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y4 = :result;
+        [yield] let dynamic #t6 = asy::_awaitHelper(x5, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y5 = :result;
+        [yield] let dynamic #t7 = asy::_awaitHelper(x6, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y6 = :result;
+        [yield] let dynamic #t8 = asy::_awaitHelper(x7, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y7 = :result;
+        [yield] let dynamic #t9 = asy::_awaitHelper(x8, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y8 = :result;
+        [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
+        dynamic y9 = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
index beac918..a6dc499 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method test() → void /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -32,7 +32,7 @@
         asy::FutureOr<self::MyFuture> x8;
         self::MyFuture x9;
         function test0() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+          final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -55,11 +55,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test1() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+          final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -82,11 +82,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test2() → asy::Future<asy::Future<core::int>> /* originally async */ {
-          final asy::Completer<asy::Future<core::int>> :async_completer = asy::Completer::sync<asy::Future<core::int>>();
+          final asy::_AsyncAwaitCompleter<asy::Future<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<asy::Future<core::int>>();
           asy::FutureOr<asy::Future<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -109,11 +109,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test3() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
-          final asy::Completer<asy::FutureOr<core::int>> :async_completer = asy::Completer::sync<asy::FutureOr<core::int>>();
+          final asy::_AsyncAwaitCompleter<asy::FutureOr<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<asy::FutureOr<core::int>>();
           asy::FutureOr<asy::FutureOr<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -136,11 +136,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test4() → asy::Future<self::MyFuture> /* originally async */ {
-          final asy::Completer<self::MyFuture> :async_completer = asy::Completer::sync<self::MyFuture>();
+          final asy::_AsyncAwaitCompleter<self::MyFuture> :async_completer = new asy::_AsyncAwaitCompleter::•<self::MyFuture>();
           asy::FutureOr<self::MyFuture> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -163,11 +163,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test5() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+          final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -190,11 +190,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test6() → asy::Future<asy::Future<core::int>> /* originally async */ {
-          final asy::Completer<asy::Future<core::int>> :async_completer = asy::Completer::sync<asy::Future<core::int>>();
+          final asy::_AsyncAwaitCompleter<asy::Future<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<asy::Future<core::int>>();
           asy::FutureOr<asy::Future<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -217,11 +217,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test7() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
-          final asy::Completer<asy::FutureOr<core::int>> :async_completer = asy::Completer::sync<asy::FutureOr<core::int>>();
+          final asy::_AsyncAwaitCompleter<asy::FutureOr<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<asy::FutureOr<core::int>>();
           asy::FutureOr<asy::FutureOr<core::int>> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -244,11 +244,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test8() → asy::Future<self::MyFuture> /* originally async */ {
-          final asy::Completer<self::MyFuture> :async_completer = asy::Completer::sync<self::MyFuture>();
+          final asy::_AsyncAwaitCompleter<self::MyFuture> :async_completer = new asy::_AsyncAwaitCompleter::•<self::MyFuture>();
           asy::FutureOr<self::MyFuture> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -271,11 +271,11 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         function test9() → asy::Future<core::int> /* originally async */ {
-          final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+          final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
           asy::FutureOr<core::int> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -298,7 +298,7 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
@@ -331,7 +331,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
deleted file mode 100644
index 0f3c9ac..0000000
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static field asy::Future<core::int> futureInt = null;
-static field dynamic f = () → dynamic => self::futureInt;
-static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = self::futureInt;
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-};
-static method main() → dynamic {
-  self::f;
-  self::g;
-}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.expect
rename to pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.transformed.expect
new file mode 100644
index 0000000..32f482b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.transformed.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static field asy::Future<core::int> futureInt = null;
+static field dynamic f = () → dynamic => self::futureInt;
+static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = self::futureInt;
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+};
+static method main() → dynamic {
+  self::f;
+  self::g;
+}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
index 1959108..f94e9db 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::Future<core::int> futureInt = null;
 static field () → asy::Future<core::int> f = () → asy::Future<core::int> => self::futureInt;
 static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -29,7 +29,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
deleted file mode 100644
index a45113d..0000000
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-
-static field dynamic f = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = 0;
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-};
-static method main() → dynamic {
-  self::f;
-}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.expect
rename to pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3f444b6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+
+static field dynamic f = () → asy::Future<dynamic> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = 0;
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+};
+static method main() → dynamic {
+  self::f;
+}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
index 2c350bc..fb23adf 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static field () → asy::Future<core::int> f = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -27,7 +27,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
deleted file mode 100644
index 1c04583..0000000
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static field asy::FutureOr<core::int> futureOrInt = null;
-static field dynamic f = () → dynamic => self::futureOrInt;
-static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = self::futureOrInt;
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-};
-static method main() → dynamic {
-  self::f;
-  self::g;
-}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.expect
rename to pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.transformed.expect
new file mode 100644
index 0000000..694b2f2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.transformed.expect
@@ -0,0 +1,38 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static field asy::FutureOr<core::int> futureOrInt = null;
+static field dynamic f = () → dynamic => self::futureOrInt;
+static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = self::futureOrInt;
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+};
+static method main() → dynamic {
+  self::f;
+  self::g;
+}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
index 5cc8ee5..b6536b0 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static field asy::FutureOr<core::int> futureOrInt = null;
 static field () → asy::FutureOr<core::int> f = () → asy::FutureOr<core::int> => self::futureOrInt;
 static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -29,7 +29,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 };
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
deleted file mode 100644
index eeada89..0000000
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
+++ /dev/null
@@ -1,44 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:math" as math;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(math::Random::•().nextBool()) {
-            :return_value = asy::Future::value<core::int>(1);
-            break #L1;
-          }
-          else {
-            :return_value = asy::Future::value<core::double>(2.0);
-            break #L1;
-          }
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.transformed.expect
new file mode 100644
index 0000000..298fc06
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.transformed.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:math" as math;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  dynamic f = () → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(math::Random::•().nextBool()) {
+            :return_value = asy::Future::value<core::int>(1);
+            break #L1;
+          }
+          else {
+            :return_value = asy::Future::value<core::double>(2.0);
+            break #L1;
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  };
+  asy::Future<core::num> g = f.call();
+  asy::Future<core::int> h = f.call();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
index 1325622..28def78 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
+    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -35,7 +35,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
deleted file mode 100644
index e651a4a..0000000
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
+++ /dev/null
@@ -1,44 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:math" as math;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(math::Random::•().nextBool()) {
-            :return_value = 1;
-            break #L1;
-          }
-          else {
-            :return_value = 2.0;
-            break #L1;
-          }
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.transformed.expect
new file mode 100644
index 0000000..860e645
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.transformed.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:math" as math;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  dynamic f = () → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(math::Random::•().nextBool()) {
+            :return_value = 1;
+            break #L1;
+          }
+          else {
+            :return_value = 2.0;
+            break #L1;
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  };
+  asy::Future<core::num> g = f.call();
+  asy::Future<core::int> h = f.call();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
index 4d101fa..3a4d495 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
+    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -35,7 +35,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
deleted file mode 100644
index d306ab4..0000000
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
+++ /dev/null
@@ -1,44 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:math" as math;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(math::Random::•().nextBool()) {
-            :return_value = asy::Future::value<core::int>(1);
-            break #L1;
-          }
-          else {
-            :return_value = 2.0;
-            break #L1;
-          }
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.transformed.expect
new file mode 100644
index 0000000..128abb0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.transformed.expect
@@ -0,0 +1,44 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:math" as math;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  dynamic f = () → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(math::Random::•().nextBool()) {
+            :return_value = asy::Future::value<core::int>(1);
+            break #L1;
+          }
+          else {
+            :return_value = 2.0;
+            break #L1;
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  };
+  asy::Future<core::num> g = f.call();
+  asy::Future<core::int> h = f.call();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
index be516f9..85a11ea 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 
 static method test() → dynamic {
   () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
+    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
     asy::FutureOr<core::num> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -35,7 +35,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
   asy::Future<core::num> g = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
index ae3db91..664ce90 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
 //                                             ^
 
@@ -14,8 +14,8 @@
     return null;
   () → core::String g = f;
   g = () → core::String {
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
                                             ^" in 1 as{TypeError} core::String;
   };
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
index f57fa87..373dc38 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
@@ -7,8 +7,8 @@
     return null;
   () → core::String g = f;
   g = () → core::String {
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
                                             ^" in 1 as{TypeError} core::String;
   };
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect
new file mode 100644
index 0000000..d05a1c0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:11:5: Context: Write to g@322
+  g = /*@returnType=String*/ () {
+    ^
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
deleted file mode 100644
index 7eafe2e..0000000
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
+++ /dev/null
@@ -1,62 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        dynamic f = () → asy::Future<dynamic> /* originally async */ {
-          final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try {
-              #L2:
-              {
-                :return_value = null;
-                break #L2;
-              }
-              asy::_completeOnAsyncReturn(:async_completer, :return_value);
-              return;
-            }
-            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
-          return :async_completer.{asy::Completer::future};
-        };
-        asy::Future<dynamic> y = f.call();
-        asy::Future<core::String> z = f.call();
-        [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3ebd45f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.transformed.expect
@@ -0,0 +1,62 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        dynamic f = () → asy::Future<dynamic> /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic> :return_value;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try {
+              #L2:
+              {
+                :return_value = null;
+                break #L2;
+              }
+              asy::_completeOnAsyncReturn(:async_completer, :return_value);
+              return;
+            }
+            on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+              :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :async_completer.start(:async_op);
+          return :async_completer.{asy::Completer::future};
+        };
+        asy::Future<dynamic> y = f.call();
+        asy::Future<core::String> z = f.call();
+        [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
+        core::String s = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
index 510f5e8..aab7652 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -17,7 +17,7 @@
       #L1:
       {
         () → asy::Future<core::Null> f = () → asy::Future<core::Null> /* originally async */ {
-          final asy::Completer<core::Null> :async_completer = asy::Completer::sync<core::Null>();
+          final asy::_AsyncAwaitCompleter<core::Null> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null>();
           asy::FutureOr<core::Null> :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -40,7 +40,7 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          asy::Future::microtask<dynamic>(:async_op);
+          :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         };
         asy::Future<dynamic> y = f.call();
@@ -57,6 +57,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
deleted file mode 100644
index 74093d5..0000000
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
+++ /dev/null
@@ -1,70 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        dynamic f = () → asy::Stream<dynamic> /* originally async* */ {
-          asy::_AsyncStarStreamController<dynamic> :controller;
-          dynamic :controller_stream;
-          dynamic :async_stack_trace;
-          dynamic :async_op_then;
-          dynamic :async_op_error;
-          dynamic :await_jump_var = 0;
-          dynamic :await_ctx_var;
-          dynamic :saved_try_context_var0;
-          dynamic :saved_try_context_var1;
-          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-            try
-              try {
-                #L2:
-                {
-                  if(:controller.{asy::_AsyncStarStreamController::add}(null))
-                    return null;
-                  else
-                    [yield] null;
-                }
-                return;
-              }
-              on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-                :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-              }
-            finally {
-              :controller.{asy::_AsyncStarStreamController::close}();
-            }
-          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
-          :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-          return :controller_stream;
-        };
-        asy::Stream<dynamic> y = f.call();
-        asy::Stream<core::String> z = f.call();
-        [yield] let dynamic #t1 = asy::_awaitHelper(f.call().first, :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.transformed.expect
new file mode 100644
index 0000000..35c6546
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.transformed.expect
@@ -0,0 +1,70 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        dynamic f = () → asy::Stream<dynamic> /* originally async* */ {
+          asy::_AsyncStarStreamController<dynamic> :controller;
+          dynamic :controller_stream;
+          dynamic :async_stack_trace;
+          dynamic :async_op_then;
+          dynamic :async_op_error;
+          dynamic :await_jump_var = 0;
+          dynamic :await_ctx_var;
+          dynamic :saved_try_context_var0;
+          dynamic :saved_try_context_var1;
+          function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+            try
+              try {
+                #L2:
+                {
+                  if(:controller.{asy::_AsyncStarStreamController::add}(null))
+                    return null;
+                  else
+                    [yield] null;
+                }
+                return;
+              }
+              on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+                :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+              }
+            finally {
+              :controller.{asy::_AsyncStarStreamController::close}();
+            }
+          :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+          :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+          :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+          :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
+          :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+          return :controller_stream;
+        };
+        asy::Stream<dynamic> y = f.call();
+        asy::Stream<core::String> z = f.call();
+        [yield] let dynamic #t1 = asy::_awaitHelper(f.call().first, :async_op_then, :async_op_error, :async_op) in null;
+        core::String s = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
index 3b73b9c..bb70985 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -65,6 +65,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
new file mode 100644
index 0000000..2c4de0d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart:17:5: Context: Write to f@369
+  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@returnType=Null*/ (/*@type=Object*/ x) =>
+    ^
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.direct.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.direct.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/bottom.dart.direct.expect b/pkg/front_end/testcases/inference/bottom.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bottom.dart.direct.expect
rename to pkg/front_end/testcases/inference/bottom.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/bottom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bottom.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bottom.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/bottom.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.direct.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bottom_in_closure.dart.direct.expect
rename to pkg/front_end/testcases/inference/bottom_in_closure.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bottom_in_closure.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/bottom_in_closure.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.direct.expect b/pkg/front_end/testcases/inference/bug30251.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug30251.dart.direct.expect
rename to pkg/front_end/testcases/inference/bug30251.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30251.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug30251.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/bug30251.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.direct.expect b/pkg/front_end/testcases/inference/bug30620.dart.direct.expect
deleted file mode 100644
index acfcfa6..0000000
--- a/pkg/front_end/testcases/inference/bug30620.dart.direct.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool
-    return other is self::A && other{self::A}.foo.==(this.{self::A::foo});
-}
-static method main() → dynamic {
-  core::print(new self::A::•("hello").==(new self::A::•("hello")));
-}
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30620.dart.direct.transformed.expect
deleted file mode 100644
index acfcfa6..0000000
--- a/pkg/front_end/testcases/inference/bug30620.dart.direct.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool
-    return other is self::A && other{self::A}.foo.==(this.{self::A::foo});
-}
-static method main() → dynamic {
-  core::print(new self::A::•("hello").==(new self::A::•("hello")));
-}
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30620.dart.legacy.expect
new file mode 100644
index 0000000..d7c749f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620.dart.legacy.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool
+    return other is self::A && other.foo.==(this.{self::A::foo});
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello").==(new self::A::•("hello")));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30620.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d7c749f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620.dart.legacy.transformed.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool
+    return other is self::A && other.foo.==(this.{self::A::foo});
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello").==(new self::A::•("hello")));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect
new file mode 100644
index 0000000..f995931
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/bug30620.dart:14:13: Context: Possible promotion of other@335
+      other is A && /*@promotedType=A*/ other
+            ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.direct.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.direct.expect
deleted file mode 100644
index 738dc94..0000000
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.direct.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool
-    return other is self::A && other{self::A}.foo.==(this.{self::A::foo}) && other{self::A}.foo.==(this.{self::A::foo});
-}
-static method main() → dynamic {
-  core::print(new self::A::•("hello").==(new self::A::•("hello")));
-}
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.direct.transformed.expect
deleted file mode 100644
index 738dc94..0000000
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.direct.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool
-    return other is self::A && other{self::A}.foo.==(this.{self::A::foo}) && other{self::A}.foo.==(this.{self::A::foo});
-}
-static method main() → dynamic {
-  core::print(new self::A::•("hello").==(new self::A::•("hello")));
-}
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.expect
new file mode 100644
index 0000000..db3e6ea
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool
+    return other is self::A && other.foo.==(this.{self::A::foo}) && other.foo.==(this.{self::A::foo});
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello").==(new self::A::•("hello")));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.transformed.expect
new file mode 100644
index 0000000..db3e6ea
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.transformed.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool
+    return other is self::A && other.foo.==(this.{self::A::foo}) && other.foo.==(this.{self::A::foo});
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello").==(new self::A::•("hello")));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect
new file mode 100644
index 0000000..85cca67
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/bug30620_b.dart:14:13: Context: Possible promotion of other@335
+      other is A && /*@promotedType=A*/ other
+            ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.direct.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.direct.expect
deleted file mode 100644
index ca08463..0000000
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.direct.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool {
-    if(other is self::A && other{self::A}.foo.==(this.{self::A::foo})) {
-      if(other{self::A}.foo.==(this.{self::A::foo})) {
-      }
-    }
-    return true;
-  }
-}
-static method main() → dynamic {
-  core::print(new self::A::•("hello").==(new self::A::•("hello")));
-}
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.direct.transformed.expect
deleted file mode 100644
index ca08463..0000000
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.direct.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
-    : self::A::foo = foo, super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool {
-    if(other is self::A && other{self::A}.foo.==(this.{self::A::foo})) {
-      if(other{self::A}.foo.==(this.{self::A::foo})) {
-      }
-    }
-    return true;
-  }
-}
-static method main() → dynamic {
-  core::print(new self::A::•("hello").==(new self::A::•("hello")));
-}
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.expect
new file mode 100644
index 0000000..6ddfcf5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool {
+    if(other is self::A && other.foo.==(this.{self::A::foo})) {
+      if(other.foo.==(this.{self::A::foo})) {
+      }
+    }
+    return true;
+  }
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello").==(new self::A::•("hello")));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6ddfcf5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::String foo;
+  constructor •(core::String foo) → self::A
+    : self::A::foo = foo, super core::Object::•()
+    ;
+  operator ==(core::Object other) → core::bool {
+    if(other is self::A && other.foo.==(this.{self::A::foo})) {
+      if(other.foo.==(this.{self::A::foo})) {
+      }
+    }
+    return true;
+  }
+}
+static method main() → dynamic {
+  core::print(new self::A::•("hello").==(new self::A::•("hello")));
+}
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect
new file mode 100644
index 0000000..3a22ae1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/bug30620_c.dart:14:15: Context: Possible promotion of other@335
+    if (other is A && /*@promotedType=A*/ other
+              ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.direct.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.direct.expect
deleted file mode 100644
index 1149d5f..0000000
--- a/pkg/front_end/testcases/inference/bug30620_d.dart.direct.expect
+++ /dev/null
@@ -1,7 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method foo(dynamic obj) → core::String
-  return obj is core::String ? obj{core::String}.toUpperCase() : null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.direct.transformed.expect
deleted file mode 100644
index 1149d5f..0000000
--- a/pkg/front_end/testcases/inference/bug30620_d.dart.direct.transformed.expect
+++ /dev/null
@@ -1,7 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method foo(dynamic obj) → core::String
-  return obj is core::String ? obj{core::String}.toUpperCase() : null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.expect
new file mode 100644
index 0000000..c5cd413
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method foo(dynamic obj) → core::String
+  return obj is core::String ? obj.toUpperCase() : null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c5cd413
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.transformed.expect
@@ -0,0 +1,7 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method foo(dynamic obj) → core::String
+  return obj is core::String ? obj.toUpperCase() : null;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.type_promotion.expect
new file mode 100644
index 0000000..bdbeb50
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/bug30620_d.dart:8:24: Context: Possible promotion of obj@273
+String foo(obj) => obj is String
+                       ^^
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.direct.expect b/pkg/front_end/testcases/inference/bug30624.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug30624.dart.direct.expect
rename to pkg/front_end/testcases/inference/bug30624.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug30624.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug30624.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/bug30624.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.direct.expect b/pkg/front_end/testcases/inference/bug31132.dart.direct.expect
deleted file mode 100644
index 31ec243..0000000
--- a/pkg/front_end/testcases/inference/bug31132.dart.direct.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends self::B {
-  field dynamic z = null;
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-}
-static method test(self::B x) → void {
-  dynamic y = x is self::C ? x{self::C} : new self::C::•();
-  core::print(y.z);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug31132.dart.direct.transformed.expect
deleted file mode 100644
index 31ec243..0000000
--- a/pkg/front_end/testcases/inference/bug31132.dart.direct.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends self::B {
-  field dynamic z = null;
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-}
-static method test(self::B x) → void {
-  dynamic y = x is self::C ? x{self::C} : new self::C::•();
-  core::print(y.z);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.legacy.expect b/pkg/front_end/testcases/inference/bug31132.dart.legacy.expect
new file mode 100644
index 0000000..abedb00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug31132.dart.legacy.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends self::B {
+  field dynamic z = null;
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+static method test(self::B x) → void {
+  dynamic y = x is self::C ? x : new self::C::•();
+  core::print(y.z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug31132.dart.legacy.transformed.expect
new file mode 100644
index 0000000..abedb00
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug31132.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends self::B {
+  field dynamic z = null;
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+}
+static method test(self::B x) → void {
+  dynamic y = x is self::C ? x : new self::C::•();
+  core::print(y.z);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect
new file mode 100644
index 0000000..101f24d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/bug31132.dart:15:25: Context: Possible promotion of x@339
+  var /*@type=C*/ y = x is C ? /*@promotedType=C*/ x : new C();
+                        ^^
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.direct.expect b/pkg/front_end/testcases/inference/bug31133.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug31133.dart.direct.expect
rename to pkg/front_end/testcases/inference/bug31133.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug31133.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug31133.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/bug31133.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.strong.expect b/pkg/front_end/testcases/inference/bug31133.dart.strong.expect
index e333816..f363308 100644
--- a/pkg/front_end/testcases/inference/bug31133.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug31133.dart.strong.expect
@@ -4,13 +4,13 @@
 
 static method test() → void {
   core::int i = 0;
-  for (final dynamic #t1 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (final core::int #t1 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
   }
-  for (final dynamic #t2 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (final core::int #t2 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
   }
-  for (final dynamic #t3 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
+  for (final core::int #t3 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
   }
-  for (final dynamic #t4 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
+  for (final core::int #t4 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug31133.dart.strong.transformed.expect
index e333816..f363308 100644
--- a/pkg/front_end/testcases/inference/bug31133.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug31133.dart.strong.transformed.expect
@@ -4,13 +4,13 @@
 
 static method test() → void {
   core::int i = 0;
-  for (final dynamic #t1 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (final core::int #t1 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
   }
-  for (final dynamic #t2 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (final core::int #t2 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
   }
-  for (final dynamic #t3 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
+  for (final core::int #t3 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
   }
-  for (final dynamic #t4 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
+  for (final core::int #t4 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect
new file mode 100644
index 0000000..51f05ad
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect
@@ -0,0 +1,24 @@
+pkg/front_end/testcases/inference/bug31133.dart:10:9: Context: Write to i@296
+  for (i++; i /*@target=num::<*/ < 10; i++) {}
+        ^^
+pkg/front_end/testcases/inference/bug31133.dart:10:41: Context: Write to i@296
+  for (i++; i /*@target=num::<*/ < 10; i++) {}
+                                        ^^
+pkg/front_end/testcases/inference/bug31133.dart:11:8: Context: Write to i@296
+  for (++i; i /*@target=num::<*/ < 10; i++) {}
+       ^^
+pkg/front_end/testcases/inference/bug31133.dart:11:41: Context: Write to i@296
+  for (++i; i /*@target=num::<*/ < 10; i++) {}
+                                        ^^
+pkg/front_end/testcases/inference/bug31133.dart:12:9: Context: Write to i@296
+  for (i--; i /*@target=num::>=*/ >= 0; i--) {}
+        ^^
+pkg/front_end/testcases/inference/bug31133.dart:12:42: Context: Write to i@296
+  for (i--; i /*@target=num::>=*/ >= 0; i--) {}
+                                         ^^
+pkg/front_end/testcases/inference/bug31133.dart:13:8: Context: Write to i@296
+  for (--i; i /*@target=num::>=*/ >= 0; i--) {}
+       ^^
+pkg/front_end/testcases/inference/bug31133.dart:13:42: Context: Write to i@296
+  for (--i; i /*@target=num::>=*/ >= 0; i--) {}
+                                         ^^
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.direct.expect b/pkg/front_end/testcases/inference/bug31436.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug31436.dart.direct.expect
rename to pkg/front_end/testcases/inference/bug31436.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug31436.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug31436.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/bug31436.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect
new file mode 100644
index 0000000..c01ee24
--- /dev/null
+++ b/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect
@@ -0,0 +1,48 @@
+pkg/front_end/testcases/inference/bug31436.dart:10:5: Context: Write to g@308
+  g = /*@returnType=List<Object>*/ () {
+    ^
+pkg/front_end/testcases/inference/bug31436.dart:13:12: Context: Possible promotion of g@308
+  assert(g is List<Object> Function());
+           ^^
+pkg/front_end/testcases/inference/bug31436.dart:17:5: Context: Write to g@308
+  g = /*@returnType=List<int>*/ () {
+    ^
+pkg/front_end/testcases/inference/bug31436.dart:20:12: Context: Possible promotion of g@308
+  assert(g is List<Object> Function());
+           ^^
+pkg/front_end/testcases/inference/bug31436.dart:21:12: Context: Possible promotion of g@308
+  assert(g is List<int> Function());
+           ^^
+pkg/front_end/testcases/inference/bug31436.dart:27:5: Context: Write to g@308
+  g = /*@returnType=List<Object>*/ () {
+    ^
+pkg/front_end/testcases/inference/bug31436.dart:30:12: Context: Possible promotion of g@308
+  assert(g is List<Object> Function());
+           ^^
+pkg/front_end/testcases/inference/bug31436.dart:34:5: Context: Write to o@843
+  o = 3;
+    ^
+pkg/front_end/testcases/inference/bug31436.dart:43:5: Context: Write to g@1305
+  g = /*@returnType=List<Object>*/ () => /*@typeArgs=Object*/ [3];
+    ^
+pkg/front_end/testcases/inference/bug31436.dart:44:12: Context: Possible promotion of g@1305
+  assert(g is List<Object> Function());
+           ^^
+pkg/front_end/testcases/inference/bug31436.dart:48:5: Context: Write to g@1305
+  g = /*@returnType=List<int>*/ () => l;
+    ^
+pkg/front_end/testcases/inference/bug31436.dart:49:12: Context: Possible promotion of g@1305
+  assert(g is List<Object> Function());
+           ^^
+pkg/front_end/testcases/inference/bug31436.dart:50:12: Context: Possible promotion of g@1305
+  assert(g is List<int> Function());
+           ^^
+pkg/front_end/testcases/inference/bug31436.dart:56:5: Context: Write to g@1305
+  g = /*@returnType=List<Object>*/ () =>
+    ^
+pkg/front_end/testcases/inference/bug31436.dart:58:12: Context: Possible promotion of g@1305
+  assert(g is List<Object> Function());
+           ^^
+pkg/front_end/testcases/inference/bug31436.dart:62:5: Context: Write to o@1810
+  o = 3;
+    ^
diff --git a/pkg/front_end/testcases/inference/bug32291.dart.direct.expect b/pkg/front_end/testcases/inference/bug32291.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug32291.dart.direct.expect
rename to pkg/front_end/testcases/inference/bug32291.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/bug32291.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug32291.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug32291.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/bug32291.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.direct.expect b/pkg/front_end/testcases/inference/bug33324.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug33324.dart.direct.expect
rename to pkg/front_end/testcases/inference/bug33324.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/bug33324.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/bug33324.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/bug33324.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/call_corner_cases.dart.direct.expect
rename to pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/call_corner_cases.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/callable_generic_class.dart.direct.expect
rename to pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/callable_generic_class.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
deleted file mode 100644
index d03e49e..0000000
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
-// abstract class A extends B {
-//                ^
-//
-// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
-// abstract class B extends A {
-//                ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
-// abstract class A extends B {
-//                ^
-//
-// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
-// abstract class B extends A {
-//                ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  abstract method f(dynamic x) → dynamic;
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method f(dynamic x) → dynamic;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect
deleted file mode 100644
index 8f3be84..0000000
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.direct.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
-// abstract class A extends B {
-//                ^
-//
-// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
-// abstract class B extends A {
-//                ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  abstract method f(dynamic x) → dynamic;
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method f(dynamic x) → dynamic;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.expect
new file mode 100644
index 0000000..658bd51
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.expect
@@ -0,0 +1,37 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself.
+// abstract class B extends A {
+//                ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself.
+// abstract class B extends A {
+//                ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract method f(dynamic x) → dynamic;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract method f(dynamic x) → dynamic;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fa9873c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself.
+// abstract class A extends B {
+//                ^
+//
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself.
+// abstract class B extends A {
+//                ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract method f(dynamic x) → dynamic;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract method f(dynamic x) → dynamic;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
index 1cb6512..bd72e73 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
@@ -1,10 +1,10 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself.
 // abstract class A extends B {
 //                ^
 //
-// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself.
 // abstract class B extends A {
 //                ^
 
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
index d03e49e..658bd51 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
@@ -1,20 +1,20 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself.
 // abstract class A extends B {
 //                ^
 //
-// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself.
 // abstract class B extends A {
 //                ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself.
 // abstract class A extends B {
 //                ^
 //
-// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself.
 // abstract class B extends A {
 //                ^
 
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
index 8f3be84..fa9873c 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
@@ -1,10 +1,10 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself via 'B'.
+// pkg/front_end/testcases/inference/circular_method_inference.dart:12:16: Error: 'A' is a supertype of itself.
 // abstract class A extends B {
 //                ^
 //
-// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself via 'A'.
+// pkg/front_end/testcases/inference/circular_method_inference.dart:16:16: Error: 'B' is a supertype of itself.
 // abstract class B extends A {
 //                ^
 
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.direct.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/circular_reference_via_closures.dart.direct.expect
rename to pkg/front_end/testcases/inference/circular_reference_via_closures.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/circular_reference_via_closures.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/circular_reference_via_closures.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.direct.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.direct.expect
deleted file mode 100644
index fd3ef5e..0000000
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.direct.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-library test;
-import self as self;
-
-static field dynamic x = () → dynamic => self::y;
-static field dynamic y = () → dynamic => self::x;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.direct.transformed.expect
deleted file mode 100644
index fd3ef5e..0000000
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.direct.transformed.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-library test;
-import self as self;
-
-static field dynamic x = () → dynamic => self::y;
-static field dynamic y = () → dynamic => self::x;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.direct.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/circular_reference_via_closures.dart.direct.expect
copy to pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.legacy.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/circular_reference_via_closures.dart.direct.transformed.expect
copy to pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.direct.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/closure_param_null_to_object.dart.direct.expect
rename to pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/closure_param_null_to_object.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.direct.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.direct.expect
rename to pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/complex_predecrement.dart.direct.expect b/pkg/front_end/testcases/inference/complex_predecrement.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/complex_predecrement.dart.direct.expect
rename to pkg/front_end/testcases/inference/complex_predecrement.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/complex_predecrement.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/complex_predecrement.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/complex_predecrement.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/complex_predecrement.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.direct.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/conditional_lub.dart.direct.expect
rename to pkg/front_end/testcases/inference/conditional_lub.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/conditional_lub.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/conditional_lub.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.expect
rename to pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/conditional_upwards_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.expect
rename to pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/conflicts_can_happen.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index 55ed953..94fb0d1 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -10,32 +10,36 @@
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1::a' is dynamic, which does not match the return type of the overridden method (test::I1).
-// Change to a subtype of test::I1.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1.a' is 'dynamic', which does not match the return type of the overridden method, 'I1'.
+//  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
+// Change to a subtype of 'I1'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is the overridden method ('a').
 //   final I1 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1::a' is dynamic, which does not match the return type of the overridden method (test::I2).
-// Change to a subtype of test::I2.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1.a' is 'dynamic', which does not match the return type of the overridden method, 'I2'.
+//  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
+// Change to a subtype of 'I2'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is the overridden method ('a').
 //   final I2 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I2).
-// Change to a subtype of test::I2.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type of the overridden method, 'I2'.
+//  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
+// Change to a subtype of 'I2'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:21:12: Context: This is the overridden method ('a').
 //   final I2 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I1).
-// Change to a subtype of test::I1.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type of the overridden method, 'I1'.
+//  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
+// Change to a subtype of 'I1'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/conflicts_can_happen.dart:17:12: Context: This is the overridden method ('a').
@@ -54,23 +58,27 @@
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1::a' is dynamic, which does not match the return type of the overridden method (test::I1).
-// Change to a subtype of test::I1.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1.a' is 'dynamic', which does not match the return type of the overridden method, 'I1'.
+//  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
+// Change to a subtype of 'I1'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1::a' is dynamic, which does not match the return type of the overridden method (test::I2).
-// Change to a subtype of test::I2.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:25:163: Error: The return type of the method 'C1.a' is 'dynamic', which does not match the return type of the overridden method, 'I2'.
+//  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
+// Change to a subtype of 'I2'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I2).
-// Change to a subtype of test::I2.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type of the overridden method, 'I2'.
+//  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
+// Change to a subtype of 'I2'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I1).
-// Change to a subtype of test::I1.
+// pkg/front_end/testcases/inference/conflicts_can_happen.dart:31:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type of the overridden method, 'I1'.
+//  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen.dart'.
+// Change to a subtype of 'I1'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.expect
rename to pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/conflicts_can_happen2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index d347006..1231802 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -5,16 +5,18 @@
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I1).
-// Change to a subtype of test::I1.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type of the overridden method, 'I1'.
+//  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen2.dart'.
+// Change to a subtype of 'I1'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/conflicts_can_happen2.dart:22:12: Context: This is the overridden method ('a').
 //   final I1 a = null;
 //            ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I2).
-// Change to a subtype of test::I2.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type of the overridden method, 'I2'.
+//  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen2.dart'.
+// Change to a subtype of 'I2'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/conflicts_can_happen2.dart:26:12: Context: This is the overridden method ('a').
@@ -28,13 +30,15 @@
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I1).
-// Change to a subtype of test::I1.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type of the overridden method, 'I1'.
+//  - 'I1' is from 'pkg/front_end/testcases/inference/conflicts_can_happen2.dart'.
+// Change to a subtype of 'I1'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2::a' is dynamic, which does not match the return type of the overridden method (test::I2).
-// Change to a subtype of test::I2.
+// pkg/front_end/testcases/inference/conflicts_can_happen2.dart:34:163: Error: The return type of the method 'C2.a' is 'dynamic', which does not match the return type of the overridden method, 'I2'.
+//  - 'I2' is from 'pkg/front_end/testcases/inference/conflicts_can_happen2.dart'.
+// Change to a subtype of 'I2'.
 //   get /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ a =>
 //                                                                                                                                                                   ^
 
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
index 76bc230..511aafd 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
 //                                                        ^
 
@@ -22,8 +22,8 @@
   self::C<core::num> c_num = new self::C::•<core::num>(123);
   self::C<core::num> c_num2 = let final self::C<core::num> #t1 = new self::C::•<core::num>(456) in let final dynamic #t2 = #t1.{self::C::t} = 1.0 in #t1;
   self::C<dynamic> c_dynamic = new self::C::•<dynamic>(42);
-  x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                        ^" in "hello" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
index 53affbe..67464db 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
@@ -15,8 +15,8 @@
   self::C<core::num> c_num = new self::C::•<core::num>(123);
   self::C<core::num> c_num2 = let final self::C<core::num> #t1 = new self::C::•<core::num>(456) in let final core::double #t2 = #t1.{self::C::t} = 1.0 in #t1;
   self::C<dynamic> c_dynamic = new self::C::•<dynamic>(42);
-  x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                        ^" in "hello" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
index 7baa4a1..be82a2e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
@@ -1,29 +1,37 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:22:56: Error: Inferred type argument 'test::NotA' violates the corresponding type variable bound of 'C::'.
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:22:56: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
+//  - 'NotA' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       new /*error:COULD_NOT_INFER*/ /*@typeArgs=NotA*/ C(myF);
 //                                                        ^
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:12:9: Context: Bound of this variable is violated.
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:12:9: Context: This is the type variable whose bound isn't conformed to.
 // class C<T extends A> {
 //         ^
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:21:25: Error: Inferred type argument 'test::NotA' violates the corresponding type variable bound of 'C'.
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:21:25: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
+//  - 'NotA' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   var /*@type=C<NotA>*/ x =
 //                         ^
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:12:9: Context: Bound of this variable is violated.
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:12:9: Context: This is the type variable whose bound isn't conformed to.
 // class C<T extends A> {
 //         ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:22:56: Error: Inferred type argument 'test::NotA' violates the corresponding type variable bound of 'C::'.
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:22:56: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
+//  - 'NotA' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       new /*error:COULD_NOT_INFER*/ /*@typeArgs=NotA*/ C(myF);
 //                                                        ^
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:21:25: Error: Inferred type argument 'test::NotA' violates the corresponding type variable bound of 'C'.
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:21:25: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
+//  - 'NotA' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   var /*@type=C<NotA>*/ x =
 //                         ^
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
index e6a731e..db3029e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
 //                                                        ^
 
@@ -22,8 +22,8 @@
 }
 static method test() → dynamic {
   self::C<core::int> x = self::C::•<core::int>(42);
-  x.{self::C::t} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x.{self::C::t} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                        ^" in "hello" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
index 032989a..203627e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
@@ -15,8 +15,8 @@
 }
 static method test() → dynamic {
   self::C<core::int> x = self::C::•<core::int>(42);
-  x.{self::C::t} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x.{self::C::t} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
                                                        ^" in "hello" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
index 60f56e5..ae1f9cc 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
@@ -1,29 +1,33 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'test::Clonable<dynamic>' violates the corresponding type variable bound of 'Pair::_'.
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<T>' of the type variable 'T' on 'Pair'.
+//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
 //                                                                                                              ^
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:10:12: Context: Bound of this variable is violated.
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:10:12: Context: This is the type variable whose bound isn't conformed to.
 // class Pair<T extends Clonable<T>, U extends Clonable<U>> {
 //            ^
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'test::Clonable<dynamic>' violates the corresponding type variable bound of 'Pair::_'.
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<U>' of the type variable 'U' on 'Pair'.
+//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
 //                                                                                                              ^
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:10:35: Context: Bound of this variable is violated.
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:10:35: Context: This is the type variable whose bound isn't conformed to.
 // class Pair<T extends Clonable<T>, U extends Clonable<U>> {
 //                                   ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'test::Clonable<dynamic>' violates the corresponding type variable bound of 'Pair::_'.
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<T>' of the type variable 'T' on 'Pair'.
+//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
 //                                                                                                              ^
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'test::Clonable<dynamic>' violates the corresponding type variable bound of 'Pair::_'.
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<U>' of the type variable 'U' on 'Pair'.
+//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
 //                                                                                                              ^
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
index f618f37..b56a3a6 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
@@ -1,11 +1,13 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'test::Clonable<dynamic>' violates the corresponding type variable bound of 'Pair::_'.
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<T>' of the type variable 'T' on 'Pair'.
+//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
 //                                                                                                              ^
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'test::Clonable<dynamic>' violates the corresponding type variable bound of 'Pair::_'.
+// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<U>' of the type variable 'U' on 'Pair'.
+//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
 //                                                                                                              ^
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.direct.expect
rename to pkg/front_end/testcases/inference/constructors_too_many_positional_arguments.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.expect
rename to pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
index 4e0da98..50b1b8c 100644
--- a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:13:49: Error: The return type of the method 'B::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
-// Change to a subtype of dart.core::int.
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:13:49: Error: The return type of the method 'B.x' is 'dynamic', which does not match the return type of the overridden method, 'int'.
+// Change to a subtype of 'int'.
 //   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
 //                                                 ^
 // pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:9:13: Context: This is the overridden method ('x').
@@ -10,8 +10,8 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:13:49: Error: The return type of the method 'B::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
-// Change to a subtype of dart.core::int.
+// pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart:13:49: Error: The return type of the method 'B.x' is 'dynamic', which does not match the return type of the overridden method, 'int'.
+// Change to a subtype of 'int'.
 //   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
 //                                                 ^
 
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.expect
rename to pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.direct.expect b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.direct.expect
rename to pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.type_promotion.expect b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.type_promotion.expect
new file mode 100644
index 0000000..1d0fb56
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/dont_infer_type_on_dynamic.dart:10:5: Context: Write to x@281
+  x = "hi";
+    ^
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.direct.expect b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.direct.expect
rename to pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.type_promotion.expect b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.type_promotion.expect
new file mode 100644
index 0000000..e2bfbdc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart:10:5: Context: Write to x@295
+  x = "hi";
+    ^
+pkg/front_end/testcases/inference/dont_infer_type_when_initializer_is_null.dart:11:5: Context: Write to x@295
+  x = 3;
+    ^
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.direct.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.direct.expect
rename to pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.expect
index 089353f..1a9cd62 100644
--- a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.expect
@@ -1,23 +1,23 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:63: Error: Inferred type argument 'dynamic' violates the corresponding type variable bound of 'max'.
+// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:63: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   dynamic c = /*error:COULD_NOT_INFER*/ /*@typeArgs=dynamic*/ max(x, y);
 //                                                               ^
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:77: Error: Inferred type argument 'dynamic' violates the corresponding type variable bound of 'max'.
+// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:77: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   var /*@type=dynamic*/ d = /*error:COULD_NOT_INFER*/ /*@typeArgs=dynamic*/ max(
 //                                                                             ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:63: Error: Inferred type argument 'dynamic' violates the corresponding type variable bound of 'max'.
+// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:63: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   dynamic c = /*error:COULD_NOT_INFER*/ /*@typeArgs=dynamic*/ max(x, y);
 //                                                               ^
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:77: Error: Inferred type argument 'dynamic' violates the corresponding type variable bound of 'max'.
+// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:77: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   var /*@type=dynamic*/ d = /*error:COULD_NOT_INFER*/ /*@typeArgs=dynamic*/ max(
 //                                                                             ^
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.transformed.expect
index b259dbf..77c4e5f 100644
--- a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.transformed.expect
@@ -1,11 +1,11 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:63: Error: Inferred type argument 'dynamic' violates the corresponding type variable bound of 'max'.
+// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:63: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   dynamic c = /*error:COULD_NOT_INFER*/ /*@typeArgs=dynamic*/ max(x, y);
 //                                                               ^
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:77: Error: Inferred type argument 'dynamic' violates the corresponding type variable bound of 'max'.
+// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:77: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //   var /*@type=dynamic*/ d = /*error:COULD_NOT_INFER*/ /*@typeArgs=dynamic*/ max(
 //                                                                             ^
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.expect
rename to pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect
new file mode 100644
index 0000000..6b72671
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart:14:34: Context: Write to i@367
+       i /*@target=num::<*/< 1; i++) {}
+                                 ^^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
index c6f4fea..32b1bb8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
 //                                                                     ^
 
@@ -11,8 +11,8 @@
 
 static method test() → void {
   core::List<core::int> l;
-  l = <core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  l = <core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
                                                                     ^" in "hello" as{TypeError} core::int];
   l = l = <core::int>[1];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
index 48f872c..4acd615 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
@@ -4,8 +4,8 @@
 
 static method test() → void {
   core::List<core::int> l;
-  l = <core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  l = <core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
                                                                     ^" in "hello" as{TypeError} core::int];
   l = l = <core::int>[1];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect
new file mode 100644
index 0000000..c96c4a6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:5: Context: Write to l@288
+  l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
+    ^
+pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:11:10: Context: Write to l@288
+  l = (l = /*@typeArgs=int*/ [1]);
+         ^
+pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:11:5: Context: Write to l@288
+  l = (l = /*@typeArgs=int*/ [1]);
+    ^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
deleted file mode 100644
index af02e87..0000000
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        dynamic d;
-        [yield] let dynamic #t1 = asy::_awaitHelper(<dynamic>[d], :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::int> l0 = :result;
-        [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<dynamic>(<dynamic>[d]), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::int> l1 = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b10f37a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.transformed.expect
@@ -0,0 +1,36 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → asy::Future<dynamic> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        dynamic d;
+        [yield] let dynamic #t1 = asy::_awaitHelper(<dynamic>[d], :async_op_then, :async_op_error, :async_op) in null;
+        core::List<core::int> l0 = :result;
+        [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<dynamic>(<dynamic>[d]), :async_op_then, :async_op_error, :async_op) in null;
+        core::List<core::int> l1 = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
index fdda593..64565b5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -31,6 +31,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
deleted file mode 100644
index c6a2b38..0000000
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
+++ /dev/null
@@ -1,254 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
-    return null;
-}
-static method F<T extends core::Object = dynamic>() → self::F::T
-  return null;
-static method f() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  dynamic :exception0;
-  dynamic :stack_trace0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        dynamic d;
-        core::Object o;
-        for (dynamic x in self::F<dynamic>()) {
-        }
-        for (dynamic x in self::F<dynamic>()) {
-        }
-        for (core::Object x in self::F<dynamic>()) {
-        }
-        for (final dynamic #t1 in self::F<dynamic>()) {
-          d = #t1;
-        }
-        for (final dynamic #t2 in self::F<dynamic>()) {
-          o = #t2;
-        }
-        {
-          dynamic :stream = self::F<dynamic>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L2:
-            while (true) {
-              dynamic #t3 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic x = :for-iterator.{asy::_StreamIterator::current};
-                {}
-              }
-              else
-                break #L2;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        {
-          dynamic :stream = self::F<dynamic>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L3:
-            while (true) {
-              dynamic #t6 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t7 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic x = :for-iterator.{asy::_StreamIterator::current};
-                {}
-              }
-              else
-                break #L3;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        {
-          dynamic :stream = self::F<dynamic>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::Object> :for-iterator = new asy::_StreamIterator::•<core::Object>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L4:
-            while (true) {
-              dynamic #t9 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                core::Object x = :for-iterator.{asy::_StreamIterator::current};
-                {}
-              }
-              else
-                break #L4;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t11 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        {
-          dynamic :stream = self::F<dynamic>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L5:
-            while (true) {
-              dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final dynamic #t14 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  d = #t14;
-                }
-              }
-              else
-                break #L5;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t15 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        {
-          dynamic :stream = self::F<dynamic>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L6:
-            while (true) {
-              dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final dynamic #t18 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  o = #t18;
-                }
-              }
-              else
-                break #L6;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t19 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  dynamic :exception0;
-  dynamic :stack_trace0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L7:
-      {
-        for (core::int x in <dynamic>[1, 2, 3]) {
-        }
-        for (core::num x in <dynamic>[1, 2, 3]) {
-        }
-        for (dynamic x in <dynamic>[1, 2, 3]) {
-        }
-        {
-          dynamic :stream = self::MyStream::•<dynamic>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L8:
-            while (true) {
-              dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                core::int x = :for-iterator.{asy::_StreamIterator::current};
-                {}
-              }
-              else
-                break #L8;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t22 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        {
-          dynamic :stream = self::MyStream::•<core::int>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L9:
-            while (true) {
-              dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic x = :for-iterator.{asy::_StreamIterator::current};
-                {}
-              }
-              else
-                break #L9;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t25 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4c365f3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.transformed.expect
@@ -0,0 +1,254 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
+    return null;
+}
+static method F<T extends core::Object = dynamic>() → self::F::T
+  return null;
+static method f() → asy::Future<dynamic> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        dynamic d;
+        core::Object o;
+        for (dynamic x in self::F<dynamic>()) {
+        }
+        for (dynamic x in self::F<dynamic>()) {
+        }
+        for (core::Object x in self::F<dynamic>()) {
+        }
+        for (final dynamic #t1 in self::F<dynamic>()) {
+          d = #t1;
+        }
+        for (final dynamic #t2 in self::F<dynamic>()) {
+          o = #t2;
+        }
+        {
+          dynamic :stream = self::F<dynamic>();
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L2:
+            while (true) {
+              dynamic #t3 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {}
+              }
+              else
+                break #L2;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        {
+          dynamic :stream = self::F<dynamic>();
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L3:
+            while (true) {
+              dynamic #t6 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t7 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {}
+              }
+              else
+                break #L3;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        {
+          dynamic :stream = self::F<dynamic>();
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::Object> :for-iterator = new asy::_StreamIterator::•<core::Object>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L4:
+            while (true) {
+              dynamic #t9 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::Object x = :for-iterator.{asy::_StreamIterator::current};
+                {}
+              }
+              else
+                break #L4;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t11 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        {
+          dynamic :stream = self::F<dynamic>();
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L5:
+            while (true) {
+              dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t14 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  d = #t14;
+                }
+              }
+              else
+                break #L5;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t15 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        {
+          dynamic :stream = self::F<dynamic>();
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L6:
+            while (true) {
+              dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t18 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  o = #t18;
+                }
+              }
+              else
+                break #L6;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t19 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → asy::Future<dynamic> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L7:
+      {
+        for (core::int x in <dynamic>[1, 2, 3]) {
+        }
+        for (core::num x in <dynamic>[1, 2, 3]) {
+        }
+        for (dynamic x in <dynamic>[1, 2, 3]) {
+        }
+        {
+          dynamic :stream = self::MyStream::•<dynamic>();
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L8:
+            while (true) {
+              dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::int x = :for-iterator.{asy::_StreamIterator::current};
+                {}
+              }
+              else
+                break #L8;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t22 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        {
+          dynamic :stream = self::MyStream::•<core::int>();
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L9:
+            while (true) {
+              dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {}
+              }
+              else
+                break #L9;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t25 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 60d8dbb..852887c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 static method F<T extends core::Object = dynamic>() → self::F::T
   return null;
 static method f() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -168,11 +168,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -249,6 +249,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
index 6ee0824..2e45dc8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
@@ -1,52 +1,52 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
 //                                                                   ^
 
@@ -77,52 +77,52 @@
 static method test() → void {
   new self::F0::•(<core::int>[]);
   new self::F0::•(<core::int>[3]);
-  new self::F0::•(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F0::•(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in "hello" as{TypeError} core::int]);
-  new self::F0::•(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F0::•(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F1::•(a: <core::int>[]);
   new self::F1::•(a: <core::int>[3]);
-  new self::F1::•(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F1::•(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                ^" in "hello" as{TypeError} core::int]);
-  new self::F1::•(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F1::•(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F2::•(<core::int>[]);
   new self::F2::•(<core::int>[3]);
-  new self::F2::•(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F2::•(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in "hello" as{TypeError} core::int]);
-  new self::F2::•(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F2::•(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F3::•(<core::Iterable<core::int>>[]);
   new self::F3::•(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
   new self::F4::•(a: <core::Iterable<core::int>>[]);
   new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index b8671a5..7a852a4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -25,52 +25,52 @@
 static method test() → void {
   new self::F0::•(<core::int>[]);
   new self::F0::•(<core::int>[3]);
-  new self::F0::•(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F0::•(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in "hello" as{TypeError} core::int]);
-  new self::F0::•(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F0::•(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F1::•(a: <core::int>[]);
   new self::F1::•(a: <core::int>[3]);
-  new self::F1::•(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F1::•(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                ^" in "hello" as{TypeError} core::int]);
-  new self::F1::•(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F1::•(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F2::•(<core::int>[]);
   new self::F2::•(<core::int>[3]);
-  new self::F2::•(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F2::•(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in "hello" as{TypeError} core::int]);
-  new self::F2::•(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F2::•(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F3::•(<core::Iterable<core::int>>[]);
   new self::F3::•(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F3::•(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
   new self::F4::•(a: <core::Iterable<core::int>>[]);
   new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F4::•(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
index 63f9eb3..c4111f5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
@@ -1,52 +1,52 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
 //                                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
 //                                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
 //                                                                       ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
 //                                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
 //                                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
 //                                                                   ^
 
@@ -62,52 +62,52 @@
 static method test() → void {
   self::f0(<core::int>[]);
   self::f0(<core::int>[3]);
-  self::f0(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f0(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                    ^" in "hello" as{TypeError} core::int]);
-  self::f0(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f0(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
                                                                    ^" in "hello" as{TypeError} core::int, 3]);
   self::f1(a: <core::int>[]);
   self::f1(a: <core::int>[3]);
-  self::f1(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f1(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                       ^" in "hello" as{TypeError} core::int]);
-  self::f1(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f1(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   self::f2(<core::int>[]);
   self::f2(<core::int>[3]);
-  self::f2(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f2(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                    ^" in "hello" as{TypeError} core::int]);
-  self::f2(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f2(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
                                                                    ^" in "hello" as{TypeError} core::int, 3]);
   self::f3(<core::Iterable<core::int>>[]);
   self::f3(<core::Iterable<core::int>>[<core::int>[3]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
   self::f4(a: <core::Iterable<core::int>>[]);
   self::f4(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
index a9d8585..fbf4cc4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
@@ -10,52 +10,52 @@
 static method test() → void {
   self::f0(<core::int>[]);
   self::f0(<core::int>[3]);
-  self::f0(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f0(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                    ^" in "hello" as{TypeError} core::int]);
-  self::f0(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f0(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
                                                                    ^" in "hello" as{TypeError} core::int, 3]);
   self::f1(a: <core::int>[]);
   self::f1(a: <core::int>[3]);
-  self::f1(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f1(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                       ^" in "hello" as{TypeError} core::int]);
-  self::f1(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f1(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   self::f2(<core::int>[]);
   self::f2(<core::int>[3]);
-  self::f2(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f2(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                    ^" in "hello" as{TypeError} core::int]);
-  self::f2(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f2(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
                                                                    ^" in "hello" as{TypeError} core::int, 3]);
   self::f3(<core::Iterable<core::int>>[]);
   self::f3(<core::Iterable<core::int>>[<core::int>[3]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
   self::f4(a: <core::Iterable<core::int>>[]);
   self::f4(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f4(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
index 8ad660f..979504b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
@@ -1,56 +1,57 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) → dart.core::String' can't be assigned to a variable of type '(dart.core::int) → dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) → dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
 //         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
 //                                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //         l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
 //                                                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //             3;
 //             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       return /*error:RETURN_OF_INVALID_TYPE*/ x;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) → dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) → dart.core::List<dart.core::String>'.
-// Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) → dart.core::List<dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
 //         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
 //                                                                        ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //               /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                          ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //             x;
 //             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'int'.
 // Try correcting the name to the name of an existing method, or defining a method named 'substring'.
 //             .substring(3);
 //              ^^^^^^^^^
@@ -64,17 +65,17 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::String'.
+    (core::int) → core::String l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
                                                                  ^" in ((core::String x) → core::String => "hello") as{TypeError} (core::int) → core::String;
-    (core::int) → core::String l3 = (core::int x) → core::String => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    (core::int) → core::String l3 = (core::int x) → core::String => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
                                                                             ^" in 3 as{TypeError} core::String;
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in 3 as{TypeError} core::String;
     };
@@ -82,19 +83,19 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
             3;
             ^" in 3 as{TypeError} core::String;
     (core::int) → core::String l3 = (core::int x) → core::String {
-      return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in 3 as{TypeError} core::String;
     };
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
                                               ^" in x as{TypeError} core::String;
     };
@@ -102,17 +103,18 @@
   {
     (core::int) → core::List<core::String> l0 = (core::int x) → core::Null => null;
     (core::int) → core::List<core::String> l1 = (core::int x) → core::List<core::String> => <core::String>["hello"];
-    (core::int) → core::List<core::String> l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+    (core::int) → core::List<core::String> l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
                                                                        ^" in ((core::String x) → core::List<core::String> => <core::String>["hello"]) as{TypeError} (core::int) → core::List<core::String>;
-    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
               /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                          ^" in 3 as{TypeError} core::String];
     (core::int) → core::List<core::String> l4 = (core::int x) → core::List<core::String> {
-      return <core::String>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return <core::String>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                    ^" in 3 as{TypeError} core::String];
     };
@@ -120,11 +122,11 @@
   {
     (core::int) → core::int l0 = (core::int x) → core::int => x;
     (core::int) → core::int l1 = (core::int x) → core::int => x.{core::num::+}(1);
-    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
             x;
             ^" in x as{TypeError} core::String;
-    (core::int) → core::String l3 = (core::int x) → core::String => (let final dynamic #t11 = x in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'dart.core::int'.
+    (core::int) → core::String l3 = (core::int x) → core::String => (let final dynamic #t11 = x in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing method, or defining a method named 'substring'.
             .substring(3);
              ^^^^^^^^^") as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
index 9b02a81..3d5f44a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
@@ -7,17 +7,17 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type '(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::String'.
+    (core::int) → core::String l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
                                                                  ^" in ((core::String x) → core::String => "hello") as{TypeError} (core::int) → core::String;
-    (core::int) → core::String l3 = (core::int x) → core::String => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    (core::int) → core::String l3 = (core::int x) → core::String => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
                                                                             ^" in 3 as{TypeError} core::String;
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in 3 as{TypeError} core::String;
     };
@@ -25,19 +25,19 @@
   {
     (core::int) → core::String l0 = (core::int x) → core::Null => null;
     (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
             3;
             ^" in 3 as{TypeError} core::String;
     (core::int) → core::String l3 = (core::int x) → core::String {
-      return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in 3 as{TypeError} core::String;
     };
     (core::int) → core::String l4 = (core::int x) → core::String {
-      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
                                               ^" in x as{TypeError} core::String;
     };
@@ -45,17 +45,18 @@
   {
     (core::int) → core::List<core::String> l0 = (core::int x) → core::Null => null;
     (core::int) → core::List<core::String> l1 = (core::int x) → core::List<core::String> => <core::String>["hello"];
-    (core::int) → core::List<core::String> l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type '(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+    (core::int) → core::List<core::String> l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
                                                                        ^" in ((core::String x) → core::List<core::String> => <core::String>["hello"]) as{TypeError} (core::int) → core::List<core::String>;
-    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    (core::int) → core::List<core::String> l3 = (core::int x) → core::List<core::String> => <core::String>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
               /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                          ^" in 3 as{TypeError} core::String];
     (core::int) → core::List<core::String> l4 = (core::int x) → core::List<core::String> {
-      return <core::String>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return <core::String>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                    ^" in 3 as{TypeError} core::String];
     };
@@ -63,11 +64,11 @@
   {
     (core::int) → core::int l0 = (core::int x) → core::int => x;
     (core::int) → core::int l1 = (core::int x) → core::int => x.{core::num::+}(1);
-    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
             x;
             ^" in x as{TypeError} core::String;
-    (core::int) → core::String l3 = (core::int x) → core::String => (let final core::int #t11 = x in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'dart.core::int'.
+    (core::int) → core::String l3 = (core::int x) → core::String => (let final core::int #t11 = x in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing method, or defining a method named 'substring'.
             .substring(3);
              ^^^^^^^^^") as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.type_promotion.expect
new file mode 100644
index 0000000..d06c6eb
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart:12:8: Context: Write to v1@368
+    v1 = <S> /*@returnType=main::::S*/ (/*@type=main::::S*/ x) => x;
+       ^
+pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart:17:8: Context: Write to v2@553
+    v2 = <S> /*@returnType=List<main::::S>*/
+       ^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
index 795566c..1098360 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
@@ -1,52 +1,52 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
 //                                                                   ^
 
@@ -77,52 +77,52 @@
 static method test() → void {
   new self::F0::•<core::int>(<core::int>[]);
   new self::F0::•<core::int>(<core::int>[3]);
-  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in "hello" as{TypeError} core::int]);
-  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F1::•<core::int>(a: <core::int>[]);
   new self::F1::•<core::int>(a: <core::int>[3]);
-  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                ^" in "hello" as{TypeError} core::int]);
-  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F2::•<core::int>(<core::int>[]);
   new self::F2::•<core::int>(<core::int>[3]);
-  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in "hello" as{TypeError} core::int]);
-  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
   new self::F3::•<dynamic>(<core::Iterable<dynamic>>[]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index f64de44..6578cb4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -25,52 +25,52 @@
 static method test() → void {
   new self::F0::•<core::int>(<core::int>[]);
   new self::F0::•<core::int>(<core::int>[3]);
-  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in "hello" as{TypeError} core::int]);
-  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F1::•<core::int>(a: <core::int>[]);
   new self::F1::•<core::int>(a: <core::int>[3]);
-  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                ^" in "hello" as{TypeError} core::int]);
-  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F2::•<core::int>(<core::int>[]);
   new self::F2::•<core::int>(<core::int>[3]);
-  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
                                                                     ^" in "hello" as{TypeError} core::int]);
-  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                ^" in "hello" as{TypeError} core::int, 3]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[]);
   new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F3::•<core::int>(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[]);
   new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[3]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
                                                                   ^" in "hello" as{TypeError} core::int]]);
-  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  new self::F4::•<core::int>(a: <core::Iterable<core::int>>[<core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
                                                                   ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
   new self::F3::•<dynamic>(<core::Iterable<dynamic>>[]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
index 90925fc..734c5ca 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
@@ -1,56 +1,57 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) → dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) → dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) → dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
 //     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
 //                                                                 ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
 //                                                                            ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //         3;
 //         ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       return /*error:RETURN_OF_INVALID_TYPE*/ x;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) → dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) → dart.core::List<dart.core::String>'.
-// Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) → dart.core::List<dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
 //     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
 //                                                                       ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //         x;
 //         ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'int'.
 // Try correcting the name to the name of an existing method, or defining a method named 'substring'.
 //         .substring(3);
 //          ^^^^^^^^^
@@ -66,17 +67,17 @@
     <S extends core::Object = dynamic>(core::int) → core::String v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
+    v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
                                                                 ^" in (<T extends core::Object = dynamic>(core::String x) → core::String => "hello") as{TypeError} <S extends core::Object = dynamic>(core::int) → core::String;
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
                                                                            ^" in 3 as{TypeError} core::String;
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in 3 as{TypeError} core::String;
     };
@@ -87,19 +88,19 @@
     <S extends core::Object = dynamic>(core::int) → core::String v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         3;
         ^" in 3 as{TypeError} core::String;
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in 3 as{TypeError} core::String;
     };
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
                                               ^" in x as{TypeError} core::String;
     };
@@ -110,17 +111,18 @@
     <S extends core::Object = dynamic>(core::int) → core::List<core::String> v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>["hello"];
-    v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+    v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
                                                                       ^" in (<T extends core::Object = dynamic>(core::String x) → core::List<core::String> => <core::String>["hello"]) as{TypeError} <S extends core::Object = dynamic>(core::int) → core::List<core::String>;
-    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in 3 as{TypeError} core::String];
     v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> {
-      return <core::String>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return <core::String>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                    ^" in 3 as{TypeError} core::String];
     };
@@ -136,11 +138,11 @@
     x = <T extends core::Object = dynamic>(core::int x) → core::int => x;
     x = <T extends core::Object = dynamic>(core::int x) → core::int => x.{core::num::+}(1);
     <T extends core::Object = dynamic>(core::int) → core::String y = int2String;
-    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         x;
         ^" in x as{TypeError} core::String;
-    y = <T extends core::Object = dynamic>(core::int x) → core::String => (let final dynamic #t11 = x in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'dart.core::int'.
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => (let final dynamic #t11 = x in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing method, or defining a method named 'substring'.
         .substring(3);
          ^^^^^^^^^") as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
index 00cb91c..0df8be8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
@@ -9,17 +9,17 @@
     <S extends core::Object = dynamic>(core::int) → core::String v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::String' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::String'.
+    v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
                                                                 ^" in (<T extends core::Object = dynamic>(core::String x) → core::String => "hello") as{TypeError} <S extends core::Object = dynamic>(core::int) → core::String;
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
                                                                            ^" in 3 as{TypeError} core::String;
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in 3 as{TypeError} core::String;
     };
@@ -30,19 +30,19 @@
     <S extends core::Object = dynamic>(core::int) → core::String v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         3;
         ^" in 3 as{TypeError} core::String;
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
                                               ^" in 3 as{TypeError} core::String;
     };
     v = <T extends core::Object = dynamic>(core::int x) → core::String {
-      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
                                               ^" in x as{TypeError} core::String;
     };
@@ -53,17 +53,18 @@
     <S extends core::Object = dynamic>(core::int) → core::List<core::String> v = f;
     v = <T extends core::Object = dynamic>(core::int x) → core::Null => null;
     v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>["hello"];
-    v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type '<T extends dart.core::Object = dynamic>(dart.core::String) \u8594 dart.core::List<dart.core::String>' can't be assigned to a variable of type '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to '<S extends dart.core::Object = dynamic>(dart.core::int) \u8594 dart.core::List<dart.core::String>'.
+    v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
                                                                       ^" in (<T extends core::Object = dynamic>(core::String x) → core::List<core::String> => <core::String>["hello"]) as{TypeError} <S extends core::Object = dynamic>(core::int) → core::List<core::String>;
-    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in 3 as{TypeError} core::String];
     v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> {
-      return <core::String>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+      return <core::String>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                    ^" in 3 as{TypeError} core::String];
     };
@@ -79,11 +80,11 @@
     x = <T extends core::Object = dynamic>(core::int x) → core::int => x;
     x = <T extends core::Object = dynamic>(core::int x) → core::int => x.{core::num::+}(1);
     <T extends core::Object = dynamic>(core::int) → core::String y = int2String;
-    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
         x;
         ^" in x as{TypeError} core::String;
-    y = <T extends core::Object = dynamic>(core::int x) → core::String => (let final core::int #t11 = x in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'dart.core::int'.
+    y = <T extends core::Object = dynamic>(core::int x) → core::String => (let final core::int #t11 = x in invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'int'.
 Try correcting the name to the name of an existing method, or defining a method named 'substring'.
         .substring(3);
          ^^^^^^^^^") as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect
new file mode 100644
index 0000000..419aa7c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect
@@ -0,0 +1,60 @@
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:12:7: Context: Write to v@374
+    v = <T> /*@returnType=Null*/ (int x) => null;
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:13:7: Context: Write to v@374
+    v = <T> /*@returnType=String*/ (int x) => "hello";
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:7: Context: Write to v@374
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:7: Context: Write to v@374
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:17:7: Context: Write to v@374
+    v = <T> /*@returnType=String*/ (int x) {
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:24:7: Context: Write to v@862
+    v = <T> /*@returnType=Null*/ (/*@type=int*/ x) => null;
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:25:7: Context: Write to v@862
+    v = <T> /*@returnType=String*/ (/*@type=int*/ x) => "hello";
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:26:7: Context: Write to v@862
+    v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:29:7: Context: Write to v@862
+    v = <T> /*@returnType=String*/ (/*@type=int*/ x) {
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:32:7: Context: Write to v@862
+    v = <T> /*@returnType=String*/ (/*@type=int*/ x) {
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:39:7: Context: Write to v@1467
+    v = <T> /*@returnType=Null*/ (int x) => null;
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:40:7: Context: Write to v@1467
+    v = <T> /*@returnType=List<String>*/ (int x) => /*@typeArgs=String*/ [
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:7: Context: Write to v@1467
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:45:7: Context: Write to v@1467
+    v = <T> /*@returnType=List<String>*/ (int x) => /*@typeArgs=String*/ [
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:48:7: Context: Write to v@1467
+    v = <T> /*@returnType=List<String>*/ (int x) {
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:59:7: Context: Write to x@2239
+    x = <T> /*@returnType=int*/ (/*@type=int*/ x) => x;
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:60:7: Context: Write to x@2239
+    x = <T> /*@returnType=int*/ (/*@type=int*/ x) => x /*@target=num::+*/ + 1;
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:62:7: Context: Write to y@2449
+    y = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:65:7: Context: Write to y@2449
+    y = <T> /*@returnType=String*/ (/*@type=int*/ x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/ x
+      ^
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:69:7: Context: Write to z@2791
+    z = <T> /*@returnType=String*/ (/*@type=String*/ x) =>
+      ^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
index 6415a50..722f65a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
@@ -1,127 +1,141 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'A<int, dynamic>' that isn't of expected type 'A<int, String>'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
 // Change the type of the object being constructed or the context in which it is used.
 //         a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, "hello");
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'A<dynamic, dynamic>' that isn't of expected type 'A<int, String>'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
 // Change the type of the object being constructed or the context in which it is used.
 //         a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// Try changing the type of the parameter, or casting the argument to 'String'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// Try changing the type of the parameter, or casting the argument to 'String'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
 //         a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>("hello", 3);
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
 //         a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// Try changing the type of the parameter, or casting the argument to 'String'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// Try changing the type of the parameter, or casting the argument to 'String'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+//  - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
 //     A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
 //                                                       ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+//  - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
 //     A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
 //                                                       ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+//  - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
 //         a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>("hello");
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+//  - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
 //         a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// Try changing the type of the parameter, or casting the argument to 'String'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// Try changing the type of the parameter, or casting the argument to 'String'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
 //                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+// Try changing the type of the parameter, or casting the argument to 'String'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
 //                                                ^
 
@@ -182,28 +196,30 @@
     self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a2 = new self::A::•<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a3 = new self::A::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'A<int, dynamic>' that isn't of expected type 'A<int, String>'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
 Change the type of the object being constructed or the context in which it is used.
         a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, \"hello\");
                                                  ^" in new self::A::•<core::int, dynamic>(3, "hello");
-    self::A<core::int, core::String> a5 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'A<dynamic, dynamic>' that isn't of expected type 'A<int, String>'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
 Change the type of the object being constructed or the context in which it is used.
         a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(
                                                  ^" in new self::A::named<dynamic, dynamic>(3, "hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
-    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
   }
@@ -212,28 +228,32 @@
     self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a2 = new self::B::•<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a3 = new self::B::named<core::String, core::int>("hello", 3);
-    self::A<core::int, core::String> a4 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);
                                               ^" in new self::B::•<core::String, dynamic>("hello", 3) as{TypeError} self::A<core::int, core::String>;
-    self::A<core::int, core::String> a5 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
                                               ^" in new self::B::named<dynamic, dynamic>("hello", 3) as{TypeError} self::A<core::int, core::String>;
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
-    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
   }
@@ -242,22 +262,26 @@
     self::A<core::int, core::int> a1 = new self::C::named<core::int>(3);
     self::A<core::int, core::int> a2 = new self::C::•<core::int>(3);
     self::A<core::int, core::int> a3 = new self::C::named<core::int>(3);
-    self::A<core::int, core::int> a4 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
+    self::A<core::int, core::int> a4 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+ - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
     A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
                                                       ^" in new self::C::•<dynamic>(3) as{TypeError} self::A<core::int, core::int>;
-    self::A<core::int, core::int> a5 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
+    self::A<core::int, core::int> a5 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+ - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
     A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
                                                       ^" in new self::C::named<dynamic>(3) as{TypeError} self::A<core::int, core::int>;
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
-    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
   }
@@ -266,22 +290,26 @@
     self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>("hello");
     self::A<core::int, core::String> a2 = new self::D::•<core::int, core::String>("hello");
     self::A<core::int, core::String> a3 = new self::D::named<core::String, core::String>("hello");
-    self::A<core::int, core::String> a4 = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");
                                               ^" in new self::D::•<core::num, dynamic>("hello") as{TypeError} self::A<core::int, core::String>;
-    self::A<core::int, core::String> a5 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
                                               ^" in new self::D::named<dynamic, dynamic>("hello") as{TypeError} self::A<core::int, core::String>;
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
   }
@@ -290,24 +318,24 @@
   }
   {
     self::A<core::int, core::String> a0 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[3], b: <core::String>["hello"]);
-    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                     ^" in "hello" as{TypeError} core::int], b: <core::String>[let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                                     ^" in "hello" as{TypeError} core::int], b: <core::String>[let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in 3 as{TypeError} core::String]);
     self::A<core::int, core::String> a2 = new self::F::named<core::int, core::String>(3, "hello", 3, "hello");
     self::A<core::int, core::String> a3 = new self::F::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
-    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
index c2e4a2b..39595b3 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
@@ -55,28 +55,30 @@
     self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a2 = new self::A::•<core::int, core::String>(3, "hello");
     self::A<core::int, core::String> a3 = new self::A::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'test::A<dart.core::int, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:46:50: Error: The constructor returns type 'A<int, dynamic>' that isn't of expected type 'A<int, String>'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
 Change the type of the object being constructed or the context in which it is used.
         a4 = /*error:INVALID_CAST_NEW_EXPR*/ new A<int, dynamic>(3, \"hello\");
                                                  ^" in new self::A::•<core::int, dynamic>(3, "hello");
-    self::A<core::int, core::String> a5 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'test::A<dynamic, dynamic>' that isn't of expected type 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:48:50: Error: The constructor returns type 'A<dynamic, dynamic>' that isn't of expected type 'A<int, String>'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
 Change the type of the object being constructed or the context in which it is used.
         a5 = /*error:INVALID_CAST_NEW_EXPR*/ new A<dynamic, dynamic>.named(
                                                  ^" in new self::A::named<dynamic, dynamic>(3, "hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::String> a0 = new self::A::•<core::int, core::String>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
-    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::String> a1 = new self::A::named<core::int, core::String>(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
   }
@@ -85,28 +87,32 @@
     self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a2 = new self::B::•<core::String, core::int>("hello", 3);
     self::A<core::int, core::String> a3 = new self::B::named<core::String, core::int>("hello", 3);
-    self::A<core::int, core::String> a4 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'test::B<dart.core::String, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);
                                               ^" in new self::B::•<core::String, dynamic>("hello", 3) as{TypeError} self::A<core::int, core::String>;
-    self::A<core::int, core::String> a5 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'test::B<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
                                               ^" in new self::B::named<dynamic, dynamic>("hello", 3) as{TypeError} self::A<core::int, core::String>;
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::B::•<core::String, core::int>(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
-    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::B::named<core::String, core::int>(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
   }
@@ -115,22 +121,26 @@
     self::A<core::int, core::int> a1 = new self::C::named<core::int>(3);
     self::A<core::int, core::int> a2 = new self::C::•<core::int>(3);
     self::A<core::int, core::int> a3 = new self::C::named<core::int>(3);
-    self::A<core::int, core::int> a4 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
+    self::A<core::int, core::int> a4 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+ - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
     A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
                                                       ^" in new self::C::•<dynamic>(3) as{TypeError} self::A<core::int, core::int>;
-    self::A<core::int, core::int> a5 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'test::C<dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::int>'.
+    self::A<core::int, core::int> a5 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
+ - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
     A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
                                                       ^" in new self::C::named<dynamic>(3) as{TypeError} self::A<core::int, core::int>;
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::int> a0 = new self::C::•<core::int>(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
-    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::int> a1 = new self::C::named<core::int>(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
   }
@@ -139,22 +149,26 @@
     self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>("hello");
     self::A<core::int, core::String> a2 = new self::D::•<core::int, core::String>("hello");
     self::A<core::int, core::String> a3 = new self::D::named<core::String, core::String>("hello");
-    self::A<core::int, core::String> a4 = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'test::D<dart.core::num, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a4 = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");
                                               ^" in new self::D::•<core::num, dynamic>("hello") as{TypeError} self::A<core::int, core::String>;
-    self::A<core::int, core::String> a5 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'test::D<dynamic, dynamic>' can't be assigned to a variable of type 'test::A<dart.core::int, dart.core::String>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A<dart.core::int, dart.core::String>'.
+    self::A<core::int, core::String> a5 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
+ - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+ - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
                                               ^" in new self::D::named<dynamic, dynamic>("hello") as{TypeError} self::A<core::int, core::String>;
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+    self::A<core::int, core::String> a0 = new self::D::•<dynamic, core::String>(let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+    self::A<core::int, core::String> a1 = new self::D::named<dynamic, core::String>(let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
   }
@@ -163,24 +177,24 @@
   }
   {
     self::A<core::int, core::String> a0 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[3], b: <core::String>["hello"]);
-    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    self::A<core::int, core::String> a1 = new self::F::•<core::int, core::String>(3, "hello", a: <core::int>[let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                     ^" in "hello" as{TypeError} core::int], b: <core::String>[let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                                     ^" in "hello" as{TypeError} core::int], b: <core::String>[let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
                                                      ^" in 3 as{TypeError} core::String]);
     self::A<core::int, core::String> a2 = new self::F::named<core::int, core::String>(3, "hello", 3, "hello");
     self::A<core::int, core::String> a3 = new self::F::named<core::int, core::String>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::String> a4 = new self::F::named<core::int, core::String>(3, "hello", let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'dart.core::int' can't be assigned to the parameter type 'dart.core::String'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::String'.
+                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
+Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
                                                ^" in 3 as{TypeError} core::String);
-    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+    self::A<core::int, core::String> a5 = new self::F::named<core::int, core::String>(3, "hello", let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
                                                ^" in "hello" as{TypeError} core::int);
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
index a41f60c..16af88a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
@@ -1,67 +1,71 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
 //                                                                                         ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
 // Change the type of the list literal or the context in which it is used.
 //     List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
 //                                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
 // Change the type of the list literal or the context in which it is used.
 //     List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];
 //                                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+// Try changing the type of the left hand side, or casting the right hand side to 'num'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
 // Change the type of the list literal or the context in which it is used.
 //     List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
 //                                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+// Try changing the type of the left hand side, or casting the right hand side to 'num'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
 // Change the type of the list literal or the context in which it is used.
 //     List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
 //                                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
 //                                                                                         ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                                                         ^
 
@@ -69,20 +73,20 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
                                                                                         ^" in 42 as{TypeError} core::String]]) → void {}
 static method main() → void {
   {
     core::List<core::int> l0 = <core::int>[];
     core::List<core::int> l1 = <core::int>[3];
-    core::List<core::int> l2 = <core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::List<core::int> l2 = <core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in "hello" as{TypeError} core::int];
-    core::List<core::int> l3 = <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::List<core::int> l3 = <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in "hello" as{TypeError} core::int, 3];
   }
@@ -93,50 +97,54 @@
     core::List<dynamic> l3 = <dynamic>["hello", 3];
   }
   {
-    core::List<core::int> l0 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l0 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
     List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
                                                             ^" in <core::num>[];
-    core::List<core::int> l1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
     List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];
                                                             ^" in <core::num>[3];
-    core::List<core::int> l2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
     List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
-                                                            ^" in <core::num>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+                                                            ^" in <core::num>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in "hello" as{TypeError} core::num];
-    core::List<core::int> l3 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l3 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
     List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
-                                                            ^" in <core::num>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+                                                            ^" in <core::num>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in "hello" as{TypeError} core::num, 3];
   }
   {
     core::Iterable<core::int> i0 = <core::int>[];
     core::Iterable<core::int> i1 = <core::int>[3];
-    core::Iterable<core::int> i2 = <core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Iterable<core::int> i2 = <core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in "hello" as{TypeError} core::int];
-    core::Iterable<core::int> i3 = <core::int>[let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Iterable<core::int> i3 = <core::int>[let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in "hello" as{TypeError} core::int, 3];
   }
   {
     const core::List<core::int> c0 = const <core::int>[];
     const core::List<core::int> c1 = const <core::int>[3];
-    const core::List<core::int> c2 = const <core::int>[let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    const core::List<core::int> c2 = const <core::int>[let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                                                         ^" in "hello" as{TypeError} core::int];
-    const core::List<core::int> c3 = const <core::int>[let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    const core::List<core::int> c3 = const <core::int>[let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                                                         ^" in "hello" as{TypeError} core::int, 3];
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
index 2b4c187..99954ce 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
                                                                                         ^" in 42 as{TypeError} core::String]]) → void {}
 static method main() → void {
   {
     core::List<core::int> l0 = <core::int>[];
     core::List<core::int> l1 = <core::int>[3];
-    core::List<core::int> l2 = <core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::List<core::int> l2 = <core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in "hello" as{TypeError} core::int];
-    core::List<core::int> l3 = <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::List<core::int> l3 = <core::int>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in "hello" as{TypeError} core::int, 3];
   }
@@ -26,50 +26,54 @@
     core::List<dynamic> l3 = <dynamic>["hello", 3];
   }
   {
-    core::List<core::int> l0 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l0 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:33:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
     List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
                                                             ^" in <core::num>[];
-    core::List<core::int> l1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:34:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
     List<int> l1 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[3];
                                                             ^" in <core::num>[3];
-    core::List<core::int> l2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:35:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
     List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
-                                                            ^" in <core::num>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+                                                            ^" in <core::num>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in "hello" as{TypeError} core::num];
-    core::List<core::int> l3 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'dart.core::List<dart.core::num>' isn't of expected type 'dart.core::List<dart.core::int>'.
+    core::List<core::int> l3 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
     List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
-                                                            ^" in <core::num>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+                                                            ^" in <core::num>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in "hello" as{TypeError} core::num, 3];
   }
   {
     core::Iterable<core::int> i0 = <core::int>[];
     core::Iterable<core::int> i1 = <core::int>[3];
-    core::Iterable<core::int> i2 = <core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Iterable<core::int> i2 = <core::int>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                  ^" in "hello" as{TypeError} core::int];
-    core::Iterable<core::int> i3 = <core::int>[let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Iterable<core::int> i3 = <core::int>[let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                  ^" in "hello" as{TypeError} core::int, 3];
   }
   {
     const core::List<core::int> c0 = const <core::int>[];
     const core::List<core::int> c1 = const <core::int>[3];
-    const core::List<core::int> c2 = const <core::int>[let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    const core::List<core::int> c2 = const <core::int>[let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
                                                                                         ^" in "hello" as{TypeError} core::int];
-    const core::List<core::int> c3 = const <core::int>[let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    const core::List<core::int> c3 = const <core::int>[let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
                                                                                         ^" in "hello" as{TypeError} core::int, 3];
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.direct.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
index 10afb3c..6a9da87 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
@@ -1,82 +1,85 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
 //                                                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
 //                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
 //                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                  ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       "hello": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                        ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
 //                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": 3
 //                                             ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
 //     Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};
 //                                                                            ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
 //     Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
 //                                                                            ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
 //     Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
 //                                                                            ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
 //                                                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
 //                                                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
 //                                                                                       ^
 
@@ -84,27 +87,27 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
                                                                               ^" in "hello" as{TypeError} core::int: "world"}]) → void {}
 static method test() → void {
   {
     core::Map<core::int, core::String> l0 = <core::int, core::String>{};
     core::Map<core::int, core::String> l1 = <core::int, core::String>{3: "hello"};
-    core::Map<core::int, core::String> l2 = <core::int, core::String>{let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Map<core::int, core::String> l2 = <core::int, core::String>{let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
                                             ^" in "hello" as{TypeError} core::int: "hello"};
-    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                  ^" in 3 as{TypeError} core::String};
-    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                            ^" in "hello" as{TypeError} core::int: let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                            ^" in "hello" as{TypeError} core::int: let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                   ^" in 3 as{TypeError} core::String};
   }
@@ -119,38 +122,41 @@
     core::Map<dynamic, core::String> l0 = <dynamic, core::String>{};
     core::Map<dynamic, core::String> l1 = <dynamic, core::String>{3: "hello"};
     core::Map<dynamic, core::String> l2 = <dynamic, core::String>{"hello": "hello"};
-    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                  ^" in 3 as{TypeError} core::String};
-    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                        ^" in 3 as{TypeError} core::String};
   }
   {
     core::Map<core::int, dynamic> l0 = <core::int, dynamic>{};
     core::Map<core::int, dynamic> l1 = <core::int, dynamic>{3: "hello"};
-    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
                                             ^" in "hello" as{TypeError} core::int: "hello"};
     core::Map<core::int, dynamic> l3 = <core::int, dynamic>{3: 3};
-    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
                                             ^" in "hello" as{TypeError} core::int: 3};
   }
   {
-    core::Map<core::int, core::String> l0 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l0 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};
                                                                            ^" in <core::num, dynamic>{};
-    core::Map<core::int, core::String> l1 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l1 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
                                                                            ^" in <core::num, dynamic>{3: "hello"};
-    core::Map<core::int, core::String> l3 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l3 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
                                                                            ^" in <core::num, dynamic>{3: 3};
@@ -158,19 +164,19 @@
   {
     const core::Map<core::int, core::String> l0 = const <core::int, core::String>{};
     const core::Map<core::int, core::String> l1 = const <core::int, core::String>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
                                                                               ^" in "hello" as{TypeError} core::int: "hello"};
-    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                                                      ^" in 3 as{TypeError} core::String};
-    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in "hello" as{TypeError} core::int: let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                                                              ^" in "hello" as{TypeError} core::int: let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                                                       ^" in 3 as{TypeError} core::String};
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
index c9507e6..08e5b5e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
                                                                               ^" in "hello" as{TypeError} core::int: "world"}]) → void {}
 static method test() → void {
   {
     core::Map<core::int, core::String> l0 = <core::int, core::String>{};
     core::Map<core::int, core::String> l1 = <core::int, core::String>{3: "hello"};
-    core::Map<core::int, core::String> l2 = <core::int, core::String>{let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Map<core::int, core::String> l2 = <core::int, core::String>{let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
                                             ^" in "hello" as{TypeError} core::int: "hello"};
-    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::Map<core::int, core::String> l3 = <core::int, core::String>{3: let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                  ^" in 3 as{TypeError} core::String};
-    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Map<core::int, core::String> l4 = <core::int, core::String>{3: "hello", let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                            ^" in "hello" as{TypeError} core::int: let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                            ^" in "hello" as{TypeError} core::int: let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                   ^" in 3 as{TypeError} core::String};
   }
@@ -37,38 +37,41 @@
     core::Map<dynamic, core::String> l0 = <dynamic, core::String>{};
     core::Map<dynamic, core::String> l1 = <dynamic, core::String>{3: "hello"};
     core::Map<dynamic, core::String> l2 = <dynamic, core::String>{"hello": "hello"};
-    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::Map<dynamic, core::String> l3 = <dynamic, core::String>{3: let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                  ^" in 3 as{TypeError} core::String};
-    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::Map<dynamic, core::String> l4 = <dynamic, core::String>{3: "hello", "hello": let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                        ^" in 3 as{TypeError} core::String};
   }
   {
     core::Map<core::int, dynamic> l0 = <core::int, dynamic>{};
     core::Map<core::int, dynamic> l1 = <core::int, dynamic>{3: "hello"};
-    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Map<core::int, dynamic> l2 = <core::int, dynamic>{let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
                                             ^" in "hello" as{TypeError} core::int: "hello"};
     core::Map<core::int, dynamic> l3 = <core::int, dynamic>{3: 3};
-    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::Map<core::int, dynamic> l4 = <core::int, dynamic>{3: "hello", let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
                                             ^" in "hello" as{TypeError} core::int: 3};
   }
   {
-    core::Map<core::int, core::String> l0 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l0 = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:68:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l0 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{};
                                                                            ^" in <core::num, dynamic>{};
-    core::Map<core::int, core::String> l1 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l1 = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:69:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l1 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
                                                                            ^" in <core::num, dynamic>{3: "hello"};
-    core::Map<core::int, core::String> l3 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'dart.core::Map<dart.core::num, dynamic>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+    core::Map<core::int, core::String> l3 = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:72:76: Error: The map literal type 'Map<num, dynamic>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
     Map<int, String> l3 = /*error:INVALID_CAST_LITERAL_MAP*/ <num, dynamic>{
                                                                            ^" in <core::num, dynamic>{3: 3};
@@ -76,19 +79,19 @@
   {
     const core::Map<core::int, core::String> l0 = const <core::int, core::String>{};
     const core::Map<core::int, core::String> l1 = const <core::int, core::String>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
                                                                               ^" in "hello" as{TypeError} core::int: "hello"};
-    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                                                      ^" in 3 as{TypeError} core::String};
-    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in "hello" as{TypeError} core::int: let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                                                                              ^" in "hello" as{TypeError} core::int: let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
                                                                                       ^" in 3 as{TypeError} core::String};
   }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart
index 3796335..aafc9ff 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart
@@ -12,16 +12,16 @@
 }
 
 Stream<List<int>> foo() async* {
-  yield /*@typeArgs=int*/ [];
+  yield new /*@typeArgs=int*/ List();
   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
   yield* new /*@typeArgs=List<int>*/ MyStream();
 }
 
 Iterable<Map<int, int>> bar() sync* {
-  yield /*@typeArgs=int, int*/ {};
+  yield new /*@typeArgs=int, int*/ Map();
   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic, dynamic*/ {};
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic, dynamic*/ Map();
   yield* new /*@typeArgs=Map<int, int>*/ List();
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.expect
deleted file mode 100644
index bbe604f..0000000
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
-    return null;
-}
-static method foo() → asy::Stream<core::List<core::int>> async* {
-  yield<dynamic>[];
-  yield self::MyStream::•<dynamic>();
-  yield*<dynamic>[];
-  yield* self::MyStream::•<dynamic>();
-}
-static method bar() → core::Iterable<core::Map<core::int, core::int>> sync* {
-  yield<dynamic, dynamic>{};
-  yield core::List::•<dynamic>();
-  yield*<dynamic, dynamic>{};
-  yield* core::List::•<dynamic>();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect
deleted file mode 100644
index 3c303a7..0000000
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.direct.transformed.expect
+++ /dev/null
@@ -1,83 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
-    return null;
-}
-static method foo() → asy::Stream<core::List<core::int>> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::List<core::int>> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L1:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::add}(<dynamic>[]))
-            return null;
-          else
-            [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::add}(self::MyStream::•<dynamic>()))
-            return null;
-          else
-            [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(<dynamic>[]))
-            return null;
-          else
-            [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::MyStream::•<dynamic>()))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::List<core::int>>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method bar() → core::Iterable<core::Map<core::int, core::int>> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::Map<core::int, core::int>> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_current} = <dynamic, dynamic>{};
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_current} = core::_GrowableList::•<dynamic>(0);
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = <dynamic, dynamic>{};
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::•<dynamic>(0);
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<core::Map<core::int, core::int>>(:sync_op);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.expect
new file mode 100644
index 0000000..4a22da5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.expect
@@ -0,0 +1,22 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
+    return null;
+}
+static method foo() → asy::Stream<core::List<core::int>> async* {
+  yield core::List::•<dynamic>();
+  yield self::MyStream::•<dynamic>();
+  yield* core::List::•<dynamic>();
+  yield* self::MyStream::•<dynamic>();
+}
+static method bar() → core::Iterable<core::Map<core::int, core::int>> sync* {
+  yield core::Map::•<dynamic, dynamic>();
+  yield core::List::•<dynamic>();
+  yield* core::Map::•<dynamic, dynamic>();
+  yield* core::List::•<dynamic>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4d12a56
--- /dev/null
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.transformed.expect
@@ -0,0 +1,83 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
+    return null;
+}
+static method foo() → asy::Stream<core::List<core::int>> /* originally async* */ {
+  asy::_AsyncStarStreamController<core::List<core::int>> :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L1:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}(core::_GrowableList::•<dynamic>(0)))
+            return null;
+          else
+            [yield] null;
+          if(:controller.{asy::_AsyncStarStreamController::add}(self::MyStream::•<dynamic>()))
+            return null;
+          else
+            [yield] null;
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(core::_GrowableList::•<dynamic>(0)))
+            return null;
+          else
+            [yield] null;
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::MyStream::•<dynamic>()))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::List<core::int>>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method bar() → core::Iterable<core::Map<core::int, core::int>> /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::Map<core::int, core::int>> :iterator) → core::bool yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = core::Map::•<dynamic, dynamic>();
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_current} = core::_GrowableList::•<dynamic>(0);
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = core::Map::•<dynamic, dynamic>();
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::•<dynamic>(0);
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::Map<core::int, core::int>>(:sync_op);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
index d629560..5504acd 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
@@ -1,24 +1,32 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'test::MyStream<dynamic>' can't be assigned to a variable of type 'dart.core::List<dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dart.core::int>'.
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+//  - 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
 //   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.async::Stream<dart.core::List<dart.core::int>>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dart.core::List<dart.core::int>>'.
-//   yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
-//                                                                ^
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:68: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Stream' is from 'dart:async'.
+// Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
+//                                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.core::Map<dart.core::int, dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dart.core::int, dart.core::int>'.
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
 //   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:73: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
-//   yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic, dynamic*/ {};
-//                                                                         ^
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:77: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Iterable' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic, dynamic*/ Map();
+//                                                                             ^
 
 library test;
 import self as self;
@@ -30,27 +38,35 @@
     return null;
 }
 static method foo() → asy::Stream<core::List<core::int>> async* {
-  yield<core::int>[];
-  yield let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'test::MyStream<dynamic>' can't be assigned to a variable of type 'dart.core::List<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dart.core::int>'.
+  yield core::List::•<core::int>();
+  yield let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+ - 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
                                                                   ^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int>;
-  yield* let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.async::Stream<dart.core::List<dart.core::int>>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dart.core::List<dart.core::int>>'.
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
-                                                               ^" in <dynamic>[] as{TypeError} asy::Stream<core::List<core::int>>;
+  yield* let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:68: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+ - 'List' is from 'dart:core'.
+ - 'Stream' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
+                                                                   ^" in core::List::•<dynamic>() as{TypeError} asy::Stream<core::List<core::int>>;
   yield* self::MyStream::•<core::List<core::int>>();
 }
 static method bar() → core::Iterable<core::Map<core::int, core::int>> sync* {
-  yield<core::int, core::int>{};
-  yield let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.core::Map<dart.core::int, dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dart.core::int, dart.core::int>'.
+  yield core::Map::•<core::int, core::int>();
+  yield let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+ - 'List' is from 'dart:core'.
+ - 'Map' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
                                                                   ^" in core::List::•<dynamic>() as{TypeError} core::Map<core::int, core::int>;
-  yield* let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:73: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic, dynamic*/ {};
-                                                                        ^" in <dynamic, dynamic>{} as{TypeError} core::Iterable<core::Map<core::int, core::int>>;
+  yield* let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:77: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+ - 'Map' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic, dynamic*/ Map();
+                                                                            ^" in core::Map::•<dynamic, dynamic>() as{TypeError} core::Iterable<core::Map<core::int, core::int>>;
   yield* core::List::•<core::Map<core::int, core::int>>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
index 304f6a2..4ff259f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
@@ -22,21 +22,25 @@
       try {
         #L1:
         {
-          if(:controller.{asy::_AsyncStarStreamController::add}(<core::int>[]))
+          if(:controller.{asy::_AsyncStarStreamController::add}(core::_GrowableList::•<core::int>(0)))
             return null;
           else
             [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'test::MyStream<dynamic>' can't be assigned to a variable of type 'dart.core::List<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dart.core::int>'.
+          if(:controller.{asy::_AsyncStarStreamController::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+ - 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
                                                                   ^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int>))
             return null;
           else
             [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:64: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.async::Stream<dart.core::List<dart.core::int>>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Stream<dart.core::List<dart.core::int>>'.
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic*/ [];
-                                                               ^" in <dynamic>[] as{TypeError} asy::Stream<core::List<core::int>>))
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:68: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+ - 'List' is from 'dart:core'.
+ - 'Stream' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
+                                                                   ^" in core::_GrowableList::•<dynamic>(0) as{TypeError} asy::Stream<core::List<core::int>>))
             return null;
           else
             [yield] null;
@@ -66,21 +70,25 @@
   function :sync_op(core::_SyncIterator<core::Map<core::int, core::int>> :iterator) → core::bool yielding {
     {
       {
-        :iterator.{core::_SyncIterator::_current} = <core::int, core::int>{};
+        :iterator.{core::_SyncIterator::_current} = core::Map::•<core::int, core::int>();
         [yield] true;
       }
       {
-        :iterator.{core::_SyncIterator::_current} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'dart.core::Map<dart.core::int, dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dart.core::int, dart.core::int>'.
+        :iterator.{core::_SyncIterator::_current} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+ - 'List' is from 'dart:core'.
+ - 'Map' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
                                                                   ^" in core::_GrowableList::•<dynamic>(0) as{TypeError} core::Map<core::int, core::int>;
         [yield] true;
       }
       {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:73: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Iterable<dart.core::Map<dart.core::int, dart.core::int>>'.
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ /*@typeArgs=dynamic, dynamic*/ {};
-                                                                        ^" in <dynamic, dynamic>{} as{TypeError} core::Iterable<core::Map<core::int, core::int>>;
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:77: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+ - 'Map' is from 'dart:core'.
+ - 'Iterable' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic, dynamic*/ Map();
+                                                                            ^" in core::Map::•<dynamic, dynamic>() as{TypeError} core::Iterable<core::Map<core::int, core::int>>;
         [yield] true;
       }
       {
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/dynamic_methods.dart.direct.expect
rename to pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/dynamic_methods.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.expect
rename to pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.expect
rename to pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.expect
rename to pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_initializer_context_this.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.expect
rename to pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_initializer_parameter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.expect
rename to pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.expect
rename to pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
deleted file mode 100644
index 46d4a06..0000000
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
+++ /dev/null
@@ -1,90 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  dynamic :exception0;
-  dynamic :stack_trace0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        core::Object o;
-        for (dynamic x in o) {
-        }
-        {
-          dynamic :stream = o;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L2:
-            while (true) {
-              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic x = :for-iterator.{asy::_StreamIterator::current};
-                {}
-              }
-              else
-                break #L2;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        core::int y;
-        for (final dynamic #t4 in o) {
-          y = #t4;
-        }
-        {
-          dynamic :stream = o;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L3:
-            while (true) {
-              dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  y = #t7;
-                }
-              }
-              else
-                break #L3;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.expect
rename to pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.transformed.expect
new file mode 100644
index 0000000..70c1eb6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.transformed.expect
@@ -0,0 +1,90 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::Object o;
+        for (dynamic x in o) {
+        }
+        {
+          dynamic :stream = o;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L2:
+            while (true) {
+              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {}
+              }
+              else
+                break #L2;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::int y;
+        for (final dynamic #t4 in o) {
+          y = #t4;
+        }
+        {
+          dynamic :stream = o;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L3:
+            while (true) {
+              dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  y = #t7;
+                }
+              }
+              else
+                break #L3;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
index abfce65..9572d11 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -84,7 +84,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.direct.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.direct.expect
deleted file mode 100644
index 666cfba..0000000
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.direct.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test(core::List<core::num> nums) → void {
-  for (dynamic x in nums) {
-    if(x is core::int) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.direct.transformed.expect
deleted file mode 100644
index 666cfba..0000000
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.direct.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test(core::List<core::num> nums) → void {
-  for (dynamic x in nums) {
-    if(x is core::int) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.expect
new file mode 100644
index 0000000..6633f20
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::List<core::num> nums) → void {
+  for (dynamic x in nums) {
+    if(x is core::int) {
+      dynamic y = x;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6633f20
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.transformed.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::List<core::num> nums) → void {
+  for (dynamic x in nums) {
+    if(x is core::int) {
+      dynamic y = x;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect
new file mode 100644
index 0000000..b5fe65a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/for_in_loop_promotion.dart:10:11: Context: Possible promotion of x@315
+    if (x is int) {
+          ^^
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.direct.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.direct.expect
deleted file mode 100644
index 9f73c0c..0000000
--- a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.direct.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test() → void {
-  #L1:
-  for (core::num x = 0; ; x = x.+(1)) {
-    if(x.>=(10))
-      break #L1;
-    if(x is core::int) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.direct.transformed.expect
deleted file mode 100644
index 9f73c0c..0000000
--- a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.direct.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test() → void {
-  #L1:
-  for (core::num x = 0; ; x = x.+(1)) {
-    if(x.>=(10))
-      break #L1;
-    if(x is core::int) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.expect
new file mode 100644
index 0000000..bf17438
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  #L1:
+  for (core::num x = 0; ; x = x.+(1)) {
+    if(x.>=(10))
+      break #L1;
+    if(x is core::int) {
+      dynamic y = x;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.transformed.expect
new file mode 100644
index 0000000..bf17438
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.transformed.expect
@@ -0,0 +1,15 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  #L1:
+  for (core::num x = 0; ; x = x.+(1)) {
+    if(x.>=(10))
+      break #L1;
+    if(x is core::int) {
+      dynamic y = x;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.type_promotion.expect
new file mode 100644
index 0000000..8598d0c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/for_loop_empty_condition.dart:9:21: Context: Write to x@287
+  for (num x = 0;; x++) {
+                    ^^
+pkg/front_end/testcases/inference/for_loop_empty_condition.dart:11:11: Context: Possible promotion of x@287
+    if (x is int) {
+          ^^
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.direct.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.direct.expect
deleted file mode 100644
index 2ae6220..0000000
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.direct.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test() → void {
-  core::num x;
-  for (final dynamic #t1 = x = 0; x.<(10); x = x.+(1)) {
-    if(x is core::int) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.direct.transformed.expect
deleted file mode 100644
index 2ae6220..0000000
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.direct.transformed.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test() → void {
-  core::num x;
-  for (final dynamic #t1 = x = 0; x.<(10); x = x.+(1)) {
-    if(x is core::int) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.expect
new file mode 100644
index 0000000..3b7e21a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::num x;
+  for (final dynamic #t1 = x = 0; x.<(10); x = x.+(1)) {
+    if(x is core::int) {
+      dynamic y = x;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3b7e21a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.transformed.expect
@@ -0,0 +1,13 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  core::num x;
+  for (final dynamic #t1 = x = 0; x.<(10); x = x.+(1)) {
+    if(x is core::int) {
+      dynamic y = x;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.expect
index dd4258d..0c93fcd 100644
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method test() → void {
   core::num x;
-  for (final dynamic #t1 = x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
+  for (final core::int #t1 = x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
     if(x is core::int) {
       core::int y = x{core::int};
     }
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.transformed.expect
index dd4258d..0c93fcd 100644
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static method test() → void {
   core::num x;
-  for (final dynamic #t1 = x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
+  for (final core::int #t1 = x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
     if(x is core::int) {
       core::int y = x{core::int};
     }
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.type_promotion.expect
new file mode 100644
index 0000000..84d17d3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/inference/for_loop_initializer_expression.dart:10:10: Context: Write to x@282
+  for (x = 0; x /*@target=num::<*/ < 10; x++) {
+         ^
+pkg/front_end/testcases/inference/for_loop_initializer_expression.dart:10:43: Context: Write to x@282
+  for (x = 0; x /*@target=num::<*/ < 10; x++) {
+                                          ^^
+pkg/front_end/testcases/inference/for_loop_initializer_expression.dart:11:11: Context: Possible promotion of x@282
+    if (x is int) {
+          ^^
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.direct.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.direct.expect
deleted file mode 100644
index 8edae6d..0000000
--- a/pkg/front_end/testcases/inference/for_loop_promotion.dart.direct.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test() → void {
-  for (core::num x = 0; x.<(10); x = x.+(1)) {
-    if(x is core::int) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.direct.transformed.expect
deleted file mode 100644
index 8edae6d..0000000
--- a/pkg/front_end/testcases/inference/for_loop_promotion.dart.direct.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test() → void {
-  for (core::num x = 0; x.<(10); x = x.+(1)) {
-    if(x is core::int) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.expect
new file mode 100644
index 0000000..7f01ee0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  for (core::num x = 0; x.<(10); x = x.+(1)) {
+    if(x is core::int) {
+      dynamic y = x;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7f01ee0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.transformed.expect
@@ -0,0 +1,12 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → void {
+  for (core::num x = 0; x.<(10); x = x.+(1)) {
+    if(x is core::int) {
+      dynamic y = x;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.type_promotion.expect
new file mode 100644
index 0000000..5cf87fe
--- /dev/null
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/for_loop_promotion.dart:9:47: Context: Write to x@287
+  for (num x = 0; x /*@target=num::<*/ < 10; x++) {
+                                              ^^
+pkg/front_end/testcases/inference/for_loop_promotion.dart:10:11: Context: Possible promotion of x@287
+    if (x is int) {
+          ^^
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.direct.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_or_subtyping.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_or_subtyping.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
deleted file mode 100644
index 0011b02..0000000
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
+++ /dev/null
@@ -1,197 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L3:
-        {
-          :return_value = 3;
-          break #L3;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L4:
-        {
-          :return_value = 3;
-          break #L4;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
-  });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L5:
-        {
-          :return_value = asy::Future::value<core::int>(3);
-          break #L5;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L6:
-        {
-          :return_value = asy::Future::value<core::int>(3);
-          break #L6;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.expect b/pkg/front_end/testcases/inference/future_then.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2523367
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then.dart.legacy.transformed.expect
@@ -0,0 +1,197 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<dynamic> f;
+  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L3:
+        {
+          :return_value = 3;
+          break #L3;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L4:
+        {
+          :return_value = 3;
+          break #L4;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
+  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int>(3);
+  });
+  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L5:
+        {
+          :return_value = asy::Future::value<core::int>(3);
+          break #L5;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L6:
+        {
+          :return_value = asy::Future::value<core::int>(3);
+          break #L6;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
index 804cb3b..cfca0bf 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -49,11 +49,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -78,11 +78,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -105,11 +105,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -132,7 +132,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
@@ -140,7 +140,7 @@
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -163,11 +163,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -190,7 +190,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
deleted file mode 100644
index b7670ca..0000000
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
+++ /dev/null
@@ -1,197 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L3:
-        {
-          :return_value = 3;
-          break #L3;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L4:
-        {
-          :return_value = 3;
-          break #L4;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
-  });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L5:
-        {
-          :return_value = new self::MyFuture::value<core::int>(3);
-          break #L5;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L6:
-        {
-          :return_value = new self::MyFuture::value<core::int>(3);
-          break #L6;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5305928
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect
@@ -0,0 +1,197 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<dynamic> f;
+  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L3:
+        {
+          :return_value = 3;
+          break #L3;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L4:
+        {
+          :return_value = 3;
+          break #L4;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
+  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int>(3);
+  });
+  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L5:
+        {
+          :return_value = new self::MyFuture::value<core::int>(3);
+          break #L5;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L6:
+        {
+          :return_value = new self::MyFuture::value<core::int>(3);
+          break #L6;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
index 0af6f19..16a1cda 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -49,11 +49,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -78,11 +78,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -105,11 +105,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -132,7 +132,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
@@ -140,7 +140,7 @@
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -163,11 +163,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -190,7 +190,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
deleted file mode 100644
index 27b7116..0000000
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
+++ /dev/null
@@ -1,197 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<dynamic> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L3:
-        {
-          :return_value = 3;
-          break #L3;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L4:
-        {
-          :return_value = 3;
-          break #L4;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
-  });
-  self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L5:
-        {
-          :return_value = asy::Future::value<core::int>(3);
-          break #L5;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L6:
-        {
-          :return_value = asy::Future::value<core::int>(3);
-          break #L6;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_3.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_3.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_3.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a8a5bcf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect
@@ -0,0 +1,197 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<dynamic> f;
+  self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L3:
+        {
+          :return_value = 3;
+          break #L3;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L4:
+        {
+          :return_value = 3;
+          break #L4;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
+  self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int>(3);
+  });
+  self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L5:
+        {
+          :return_value = asy::Future::value<core::int>(3);
+          break #L5;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L6:
+        {
+          :return_value = asy::Future::value<core::int>(3);
+          break #L6;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
index 4893183..ebec13e 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -49,11 +49,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -78,11 +78,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -105,11 +105,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -132,7 +132,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
@@ -140,7 +140,7 @@
     return asy::Future::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -163,11 +163,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -190,7 +190,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
deleted file mode 100644
index 6429f8a..0000000
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
+++ /dev/null
@@ -1,197 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<dynamic> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L3:
-        {
-          :return_value = 3;
-          break #L3;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L4:
-        {
-          :return_value = 3;
-          break #L4;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
-  });
-  self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L5:
-        {
-          :return_value = new self::MyFuture::value<core::int>(3);
-          break #L5;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L6:
-        {
-          :return_value = new self::MyFuture::value<core::int>(3);
-          break #L6;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_4.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_4.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_4.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ec60686
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect
@@ -0,0 +1,197 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<dynamic> f;
+  self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L3:
+        {
+          :return_value = 3;
+          break #L3;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L4:
+        {
+          :return_value = 3;
+          break #L4;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
+  self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int>(3);
+  });
+  self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L5:
+        {
+          :return_value = new self::MyFuture::value<core::int>(3);
+          break #L5;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L6:
+        {
+          :return_value = new self::MyFuture::value<core::int>(3);
+          break #L6;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
index b063fca..b9f26c5 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<dynamic> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -49,11 +49,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -78,11 +78,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -105,11 +105,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -132,7 +132,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
@@ -140,7 +140,7 @@
     return new self::MyFuture::value<core::int>(3);
   });
   self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -163,11 +163,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -190,7 +190,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
deleted file mode 100644
index 3d8e9145..0000000
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
+++ /dev/null
@@ -1,197 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  asy::Future<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L3:
-        {
-          :return_value = 3;
-          break #L3;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L4:
-        {
-          :return_value = 3;
-          break #L4;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
-  });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L5:
-        {
-          :return_value = new self::MyFuture::value<core::int>(3);
-          break #L5;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L6:
-        {
-          :return_value = new self::MyFuture::value<core::int>(3);
-          break #L6;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_5.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_5.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_5.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3652669
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect
@@ -0,0 +1,197 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  asy::Future<dynamic> f;
+  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L3:
+        {
+          :return_value = 3;
+          break #L3;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L4:
+        {
+          :return_value = 3;
+          break #L4;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
+  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int>(3);
+  });
+  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L5:
+        {
+          :return_value = new self::MyFuture::value<core::int>(3);
+          break #L5;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L6:
+        {
+          :return_value = new self::MyFuture::value<core::int>(3);
+          break #L6;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
index 84c5216..aa2b0b1 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -49,11 +49,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -78,11 +78,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -105,11 +105,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -132,7 +132,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
@@ -140,7 +140,7 @@
     return new self::MyFuture::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -163,11 +163,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -190,7 +190,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
deleted file mode 100644
index 62b8c37..0000000
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
+++ /dev/null
@@ -1,197 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  asy::Future<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L3:
-        {
-          :return_value = 3;
-          break #L3;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L4:
-        {
-          :return_value = 3;
-          break #L4;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
-  });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L5:
-        {
-          :return_value = asy::Future::value<core::int>(3);
-          break #L5;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L6:
-        {
-          :return_value = asy::Future::value<core::int>(3);
-          break #L6;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_6.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_6.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_6.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect
new file mode 100644
index 0000000..df4e351
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect
@@ -0,0 +1,197 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  asy::Future<dynamic> f;
+  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L3:
+        {
+          :return_value = 3;
+          break #L3;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L4:
+        {
+          :return_value = 3;
+          break #L4;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
+  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int>(3);
+  });
+  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L5:
+        {
+          :return_value = asy::Future::value<core::int>(3);
+          break #L5;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L6:
+        {
+          :return_value = asy::Future::value<core::int>(3);
+          break #L6;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
index 22c3d9c..3895fa1 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<dynamic> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -49,11 +49,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -78,11 +78,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -105,11 +105,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -132,7 +132,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
@@ -140,7 +140,7 @@
     return asy::Future::value<core::int>(3);
   });
   asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -163,11 +163,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -190,7 +190,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
deleted file mode 100644
index 1886dfc..0000000
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
+++ /dev/null
@@ -1,96 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(x) {
-            :async_temporary_0 = 2;
-          }
-          else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-            :async_temporary_0 = :result;
-          }
-          :return_value = :async_temporary_0;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_conditional.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d665857
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect
@@ -0,0 +1,96 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<core::bool> f;
+  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :async_temporary_0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(x) {
+            :async_temporary_0 = 2;
+          }
+          else {
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            :async_temporary_0 = :result;
+          }
+          :return_value = :async_temporary_0;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
+  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int>(3);
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
index ba028aa..acbce4c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -56,11 +56,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -85,7 +85,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
deleted file mode 100644
index 85a1122..0000000
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
+++ /dev/null
@@ -1,96 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(x) {
-            :async_temporary_0 = 2;
-          }
-          else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-            :async_temporary_0 = :result;
-          }
-          :return_value = :async_temporary_0;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..cae1f2d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect
@@ -0,0 +1,96 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<core::bool> f;
+  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :async_temporary_0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(x) {
+            :async_temporary_0 = 2;
+          }
+          else {
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            :async_temporary_0 = :result;
+          }
+          :return_value = :async_temporary_0;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
+  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
index a7e329f..3f3e26c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -56,11 +56,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -85,7 +85,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
deleted file mode 100644
index 75321b8..0000000
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
+++ /dev/null
@@ -1,96 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<core::bool> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(x) {
-            :async_temporary_0 = 2;
-          }
-          else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-            :async_temporary_0 = :result;
-          }
-          :return_value = :async_temporary_0;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2288861
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect
@@ -0,0 +1,96 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<core::bool> f;
+  self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :async_temporary_0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(x) {
+            :async_temporary_0 = 2;
+          }
+          else {
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            :async_temporary_0 = :result;
+          }
+          :return_value = :async_temporary_0;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
+  self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int>(3);
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
index 7471d69..6e76891 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -56,11 +56,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -85,7 +85,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
deleted file mode 100644
index 9b1a087..0000000
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
+++ /dev/null
@@ -1,96 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<core::bool> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(x) {
-            :async_temporary_0 = 2;
-          }
-          else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-            :async_temporary_0 = :result;
-          }
-          :return_value = :async_temporary_0;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect
new file mode 100644
index 0000000..97a50ab
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect
@@ -0,0 +1,96 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<core::bool> f;
+  self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :async_temporary_0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(x) {
+            :async_temporary_0 = 2;
+          }
+          else {
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            :async_temporary_0 = :result;
+          }
+          :return_value = :async_temporary_0;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
+  self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
index 6c13a80..c07cdcb 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::bool> f;
   self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -56,11 +56,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -85,7 +85,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
deleted file mode 100644
index 2c23aa4..0000000
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
+++ /dev/null
@@ -1,96 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  asy::Future<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(x) {
-            :async_temporary_0 = 2;
-          }
-          else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-            :async_temporary_0 = :result;
-          }
-          :return_value = :async_temporary_0;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c58e4b1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect
@@ -0,0 +1,96 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  asy::Future<core::bool> f;
+  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :async_temporary_0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(x) {
+            :async_temporary_0 = 2;
+          }
+          else {
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            :async_temporary_0 = :result;
+          }
+          :return_value = :async_temporary_0;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
+  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
index a937bf0..a74751a 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -56,11 +56,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -85,7 +85,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
deleted file mode 100644
index 7e89366..0000000
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
+++ /dev/null
@@ -1,96 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  asy::Future<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          if(x) {
-            :async_temporary_0 = 2;
-          }
-          else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-            :async_temporary_0 = :result;
-          }
-          :return_value = :async_temporary_0;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect
new file mode 100644
index 0000000..69471c1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect
@@ -0,0 +1,96 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  asy::Future<core::bool> f;
+  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :async_temporary_0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          if(x) {
+            :async_temporary_0 = 2;
+          }
+          else {
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            :async_temporary_0 = :result;
+          }
+          :return_value = :async_temporary_0;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
+  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int>(3);
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
index 1f05b11..16db4a6 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   asy::Future<core::bool> f;
   asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -56,11 +56,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -85,7 +85,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect
new file mode 100644
index 0000000..e254cf4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/future_then_downwards_method_target.dart:17:5: Context: Write to b@330
+  b = f. /*@typeArgs=List<int>*/ /*@target=Future::then*/ then(
+    ^
diff --git a/pkg/front_end/testcases/inference/future_then_explicit_future.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_explicit_future.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
deleted file mode 100644
index 204e5f2..0000000
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
+++ /dev/null
@@ -1,97 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method test() → void {
-  self::MyFuture<core::int> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :async_temporary_0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          final dynamic #t1 = x;
-          if(#t1.==(null)) {
-            [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
-            :async_temporary_0 = :result;
-          }
-          else {
-            :async_temporary_0 = #t1;
-          }
-          :return_value = :async_temporary_0;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          [yield] let dynamic #t3 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = let final dynamic #t4 = :result in #t4.==(null) ? asy::Future::value<core::int>(3) : #t4;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => let final dynamic #t5 = x in #t5.==(null) ? asy::Future::value<core::int>(3) : #t5);
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return let final dynamic #t6 = x in #t6.==(null) ? asy::Future::value<core::int>(3) : #t6;
-  });
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect
new file mode 100644
index 0000000..816cc71
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect
@@ -0,0 +1,97 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method test() → void {
+  self::MyFuture<core::int> f;
+  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :async_temporary_0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          final dynamic #t1 = x;
+          if(#t1.==(null)) {
+            [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            :async_temporary_0 = :result;
+          }
+          else {
+            :async_temporary_0 = #t1;
+          }
+          :return_value = :async_temporary_0;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          [yield] let dynamic #t3 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
+          :return_value = let final dynamic #t4 = :result in #t4.==(null) ? asy::Future::value<core::int>(3) : #t4;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  });
+  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => let final dynamic #t5 = x in #t5.==(null) ? asy::Future::value<core::int>(3) : #t5);
+  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
+    return let final dynamic #t6 = x in #t6.==(null) ? asy::Future::value<core::int>(3) : #t6;
+  });
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
index d5c32ce..aa278ac 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method test() → void {
   self::MyFuture<core::int> f;
   asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -57,11 +57,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -86,7 +86,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
   asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> => (let final core::int #t5 = x in #t5.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t5) as{TypeError} asy::FutureOr<core::int>);
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
index af837d0..577085e 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
@@ -1,7 +1,9 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
+// pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
+//  - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
+//  - 'Future' is from 'dart:async'.
+// Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
 //   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
 //                                                 ^
 
@@ -30,8 +32,10 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
+  asy::Future<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
+ - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
+ - 'Future' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                 ^" in f as{TypeError} asy::Future<core::int>;
   asy::Future<core::num> f3 = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3) as asy::Future<core::double>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
index 7cb039a..cbcb2db 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
@@ -23,8 +23,10 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
+  asy::Future<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
+ - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
+ - 'Future' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                 ^" in f as{TypeError} asy::Future<core::int>;
   asy::Future<core::num> f3 = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3) as asy::Future<core::double>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_upwards_2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
index 6496957..30b1ac3 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
@@ -1,7 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::MyFuture<dart.core::int>'.
+// pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
+//  - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
 //   MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
 //                                                   ^
 
@@ -30,8 +31,9 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  self::MyFuture<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::MyFuture<dart.core::int>'.
+  self::MyFuture<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
+ - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
   MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                   ^" in f as{TypeError} self::MyFuture<core::int>;
   self::MyFuture<core::num> f3 = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3) as self::MyFuture<core::double>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
index e6b2e4b..064084c 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
@@ -23,8 +23,9 @@
 }
 static method main() → void {
   self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  self::MyFuture<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'test::MyFuture<dart.core::double>' can't be assigned to a variable of type 'test::MyFuture<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::MyFuture<dart.core::int>'.
+  self::MyFuture<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
+ - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
   MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                   ^" in f as{TypeError} self::MyFuture<core::int>;
   self::MyFuture<core::num> f3 = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3) as self::MyFuture<core::double>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_upwards_3.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
index ca7dcab..a20ab5b 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
@@ -1,7 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
+// pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
+//  - 'Future' is from 'dart:async'.
+// Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
 //   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
 //                                                 ^
 
@@ -30,8 +31,9 @@
 }
 static method test() → void {
   asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
+  asy::Future<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
+ - 'Future' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                 ^" in f as{TypeError} asy::Future<core::int>;
   asy::Future<core::num> f3 = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3) as asy::Future<core::double>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
index c5e9458..32706f4 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
@@ -23,8 +23,9 @@
 }
 static method test() → void {
   asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'dart.async::Future<dart.core::double>' can't be assigned to a variable of type 'dart.async::Future<dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::Future<dart.core::int>'.
+  asy::Future<core::int> f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
+ - 'Future' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
                                                 ^" in f as{TypeError} asy::Future<core::int>;
   asy::Future<core::num> f3 = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3) as asy::Future<core::double>;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.direct.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect
new file mode 100644
index 0000000..b9275fa64
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/future_then_upwards_from_block.dart:21:5: Context: Write to b@695
+  b = g;
+    ^
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
deleted file mode 100644
index 52f6962..0000000
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
+++ /dev/null
@@ -1,106 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
-  asy::FutureOr<core::int> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = x ? 42 : asy::Future::value<dynamic>(42);
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
-  asy::FutureOr<core::int> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = x ? 42 : asy::Future::value<dynamic>(42);
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
-  asy::FutureOr<core::int> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L3:
-      {
-        dynamic y = x ? 42 : asy::Future::value<dynamic>(42);
-        :return_value = y;
-        break #L3;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect
new file mode 100644
index 0000000..23aa903
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect
@@ -0,0 +1,106 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  asy::FutureOr<core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = x ? 42 : asy::Future::value<dynamic>(42);
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  asy::FutureOr<core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = x ? 42 : asy::Future::value<dynamic>(42);
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  asy::FutureOr<core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        dynamic y = x ? 42 : asy::Future::value<dynamic>(42);
+        :return_value = y;
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
index d27c725..a0d28bb1 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -45,11 +45,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -72,11 +72,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -100,7 +100,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
deleted file mode 100644
index f82b48c..0000000
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
+++ /dev/null
@@ -1,106 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
-  asy::FutureOr<core::int> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
-  asy::FutureOr<core::int> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
-  asy::FutureOr<core::int> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L3:
-      {
-        dynamic y = x ? 42 : new self::MyFuture::value<dynamic>(42);
-        :return_value = y;
-        break #L3;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f292acd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect
@@ -0,0 +1,106 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  asy::FutureOr<core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  asy::FutureOr<core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
+  asy::FutureOr<core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        dynamic y = x ? 42 : new self::MyFuture::value<dynamic>(42);
+        :return_value = y;
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
index 0d01746..84da7bd 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -45,11 +45,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -72,11 +72,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -100,7 +100,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
deleted file mode 100644
index c60fde1..0000000
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = <dynamic>[3];
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = asy::Future::value<dynamic>(<dynamic>[3]);
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect
new file mode 100644
index 0000000..62fcaa6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect
@@ -0,0 +1,81 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static field self::MyFuture<dynamic> f;
+static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
+  asy::FutureOr<core::List<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = <dynamic>[3];
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
+  asy::FutureOr<core::List<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = asy::Future::value<dynamic>(<dynamic>[3]);
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
index 706228d..ee2dc78 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
@@ -1,7 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
-// Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
+// pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+//  - 'FutureOr' is from 'dart:async'.
+// Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
 //         new /*@typeArgs=int*/ Future.value('hi'));
 //                                            ^
 
@@ -29,8 +30,9 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
-Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in "hi" as{TypeError} asy::FutureOr<core::int>));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
index 2ab8ba5..53247c8 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
@@ -22,13 +22,14 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
-Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in "hi" as{TypeError} asy::FutureOr<core::int>));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -51,11 +52,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -78,7 +79,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
deleted file mode 100644
index b4d3d28..0000000
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = <dynamic>[3];
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a332fc2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect
@@ -0,0 +1,81 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static field self::MyFuture<dynamic> f;
+static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
+  asy::FutureOr<core::List<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = <dynamic>[3];
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
+  asy::FutureOr<core::List<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
index e2b3327..1e11465 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -48,11 +48,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -75,7 +75,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
deleted file mode 100644
index 125fd56..0000000
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = <dynamic>[3];
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = asy::Future::value<dynamic>(<dynamic>[3]);
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect
new file mode 100644
index 0000000..704909d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect
@@ -0,0 +1,81 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static field asy::Future<dynamic> f;
+static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
+  asy::FutureOr<core::List<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = <dynamic>[3];
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
+  asy::FutureOr<core::List<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = asy::Future::value<dynamic>(<dynamic>[3]);
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
index c769a2a..82b86ca 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
@@ -1,7 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
-// Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
+// pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+//  - 'FutureOr' is from 'dart:async'.
+// Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
 //         new /*@typeArgs=int*/ Future.value('hi'));
 //                                            ^
 
@@ -29,8 +30,9 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
-Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in "hi" as{TypeError} asy::FutureOr<core::int>));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
index c187964..3e0356f 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
@@ -22,13 +22,14 @@
     return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
 }
 static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.async::FutureOr<dart.core::int>'.
-Try changing the type of the parameter, or casting the argument to 'dart.async::FutureOr<dart.core::int>'.
+static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
         new /*@typeArgs=int*/ Future.value('hi'));
                                            ^" in "hi" as{TypeError} asy::FutureOr<core::int>));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -51,11 +52,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -78,7 +79,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
deleted file mode 100644
index 50b3bb1..0000000
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
-  constructor •() → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
-    : super core::Object::•() {}
-  method noSuchMethod(dynamic invocation) → dynamic
-    return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
-    return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
-}
-static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = <dynamic>[3];
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect
new file mode 100644
index 0000000..598ecd1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect
@@ -0,0 +1,81 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class MyFuture<T extends core::Object = dynamic> extends core::Object implements asy::Future<self::MyFuture::T> {
+  constructor •() → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  constructor value([dynamic x = null]) → self::MyFuture<self::MyFuture::T>
+    : super core::Object::•() {}
+  method noSuchMethod(dynamic invocation) → dynamic
+    return null;
+  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+    return null;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {() → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+}
+static field asy::Future<dynamic> f;
+static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
+  asy::FutureOr<core::List<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = <dynamic>[3];
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
+  asy::FutureOr<core::List<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
index 918aaab..4232dc3 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
 static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>("hi"));
 static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
 static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -48,11 +48,11 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
+  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
   asy::FutureOr<core::List<core::int>> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -75,7 +75,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
deleted file mode 100644
index 58c7e21..0000000
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method foo() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        asy::Future<core::List<self::A>> f1 = null;
-        asy::Future<core::List<self::A>> f2 = null;
-        [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::List<self::A>> merged = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c0244b3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.transformed.expect
@@ -0,0 +1,41 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+static method foo() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        asy::Future<core::List<self::A>> f1 = null;
+        asy::Future<core::List<self::A>> f2 = null;
+        [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
+        core::List<core::List<self::A>> merged = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
index dd2c304..45afa71 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     ;
 }
 static method foo() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -35,7 +35,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
deleted file mode 100644
index 6b4820f..0000000
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
-  return x;
-static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        asy::Future<core::String> f;
-        [yield] let dynamic #t1 = asy::_awaitHelper(self::id<dynamic>(f), :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fc9ead3
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.transformed.expect
@@ -0,0 +1,37 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
+  return x;
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        asy::Future<core::String> f;
+        [yield] let dynamic #t1 = asy::_awaitHelper(self::id<dynamic>(f), :async_op_then, :async_op_error, :async_op) in null;
+        core::String s = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
index 8a4ec7e..8e23bd8 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
 static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
   return x;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -31,7 +31,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
deleted file mode 100644
index a8cd981..0000000
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
+++ /dev/null
@@ -1,55 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-class C extends self::A {
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        dynamic b = asy::Future::value<self::B>(new self::B::•());
-        dynamic c = asy::Future::value<self::C>(new self::C::•());
-        dynamic lll = <dynamic>[b, c];
-        [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(lll), :async_op_then, :async_op_error, :async_op) in null;
-        dynamic result = :result;
-        [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[b, c]), :async_op_then, :async_op_error, :async_op) in null;
-        dynamic result2 = :result;
-        core::List<self::A> list = result;
-        list = result2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.expect
rename to pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f6baa93
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.transformed.expect
@@ -0,0 +1,55 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+class C extends self::A {
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        dynamic b = asy::Future::value<self::B>(new self::B::•());
+        dynamic c = asy::Future::value<self::C>(new self::C::•());
+        dynamic lll = <dynamic>[b, c];
+        [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(lll), :async_op_then, :async_op_error, :async_op) in null;
+        dynamic result = :result;
+        [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[b, c]), :async_op_then, :async_op_error, :async_op) in null;
+        dynamic result2 = :result;
+        core::List<self::A> list = result;
+        list = result2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
index 160256c..e55e2bc 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
     ;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -50,6 +50,6 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect
new file mode 100644
index 0000000..8c6d411
--- /dev/null
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart:18:8: Context: Write to list@682
+  list = result2;
+       ^
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart.direct.expect b/pkg/front_end/testcases/inference/generator_closure.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generator_closure.dart.direct.expect
rename to pkg/front_end/testcases/inference/generator_closure.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generator_closure.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generator_closure.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generator_closure.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.type_promotion.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.type_promotion.expect
new file mode 100644
index 0000000..b9f3609
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/generic_functions_return_typedef.dart:15:12: Context: Write to takesInt@458
+  takesInt = y;
+           ^
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
index f83187e..2fec18a 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
@@ -1,13 +1,15 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart:26:77: Error: Inferred type argument 'dart.core::int' violates the corresponding type variable bound of 'Foo<dart.core::String>::method'.
+// pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart:26:77: Error: Inferred type argument 'int' doesn't conform to the bound 'String' of the type variable 'U' on 'Foo<String>.method'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       . /*error:COULD_NOT_INFER*/ /*@typeArgs=int*/ /*@target=Foo::method*/ method(
 //                                                                             ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart:26:77: Error: Inferred type argument 'dart.core::int' violates the corresponding type variable bound of 'Foo<dart.core::String>::method'.
+// pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart:26:77: Error: Inferred type argument 'int' doesn't conform to the bound 'String' of the type variable 'U' on 'Foo<String>.method'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 //       . /*error:COULD_NOT_INFER*/ /*@typeArgs=int*/ /*@target=Foo::method*/ method(
 //                                                                             ^
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
index 88d3f6c..d2c81cf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
@@ -1,22 +1,22 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //       /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //       /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //       /*@error=ArgumentTypeNotAssignable*/ "hi",
 //                                            ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //       /*@error=ArgumentTypeNotAssignable*/ "there"));
 //                                            ^
 
@@ -38,21 +38,21 @@
   self::printDouble(math::min<core::double>(1.0, 2.0));
   self::printInt(self::myMax(1, 2) as{TypeError} core::int);
   self::printInt(self::myMax(1, 2) as core::int);
-  self::printInt(math::max<core::int>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::printInt(math::max<core::int>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
       /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
                                                                     ^" in 2.0 as{TypeError} core::int));
-  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
       /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
                                                                     ^" in 2.0 as{TypeError} core::int));
   self::printDouble(math::max<core::double>(1.0, 2.0));
   self::printDouble(math::min<core::double>(1.0, 2.0));
-  self::printInt(math::min<core::int>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::printInt(math::min<core::int>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
       /*@error=ArgumentTypeNotAssignable*/ \"hi\",
-                                           ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+                                           ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
       /*@error=ArgumentTypeNotAssignable*/ \"there\"));
                                            ^" in "there" as{TypeError} core::int));
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
index 471d44c..c7f9ea6 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
@@ -16,21 +16,21 @@
   self::printDouble(math::min<core::double>(1.0, 2.0));
   self::printInt(self::myMax(1, 2) as{TypeError} core::int);
   self::printInt(self::myMax(1, 2) as core::int);
-  self::printInt(math::max<core::int>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::printInt(math::max<core::int>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
       /*@typeArgs=int*/ max(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
                                                                     ^" in 2.0 as{TypeError} core::int));
-  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:69: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
       /*@typeArgs=int*/ min(1, /*@error=ArgumentTypeNotAssignable*/ 2.0));
                                                                     ^" in 2.0 as{TypeError} core::int));
   self::printDouble(math::max<core::double>(1.0, 2.0));
   self::printDouble(math::min<core::double>(1.0, 2.0));
-  self::printInt(math::min<core::int>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::printInt(math::min<core::int>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:38:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
       /*@error=ArgumentTypeNotAssignable*/ \"hi\",
-                                           ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+                                           ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:39:44: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
       /*@error=ArgumentTypeNotAssignable*/ \"there\"));
                                            ^" in "there" as{TypeError} core::int));
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
index cc08449..a4f9811 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
@@ -1,14 +1,14 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
 // /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
 //                                                                ^
 // pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
 //   T m<T>(T x) => x;
 //     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: The return type of the method 'D::m' is dynamic, which does not match the return type of the overridden method (test::C::m::T).
-// Change to a subtype of test::C::m::T.
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: The return type of the method 'D.m' is 'dynamic', which does not match the return type of the overridden method, 'T'.
+// Change to a subtype of 'T'.
 // /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
 //                                                                ^
 // pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:9:5: Context: This is the overridden method ('m').
@@ -21,12 +21,12 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
 // /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
 //                                                                ^
 //
-// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: The return type of the method 'D::m' is dynamic, which does not match the return type of the overridden method (test::C::m::T).
-// Change to a subtype of test::C::m::T.
+// pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart:14:64: Error: The return type of the method 'D.m' is 'dynamic', which does not match the return type of the overridden method, 'T'.
+// Change to a subtype of 'T'.
 // /*@error=OverrideTypeMismatchReturnType*/ /*@topType=dynamic*/ m(
 //                                                                ^
 //
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
index 4033a7c..36362be 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //           /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
 //                                                                            ^
 
@@ -13,8 +13,8 @@
   return null;
 static method test() → dynamic {
   core::String x = self::f<core::String>(<core::String>["hi"]);
-  core::String y = self::f<core::String>(<core::String>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String y = self::f<core::String>(<core::String>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
                                                                            ^" in 42 as{TypeError} core::String]);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
index 3ce2207..a0de68d 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
@@ -6,8 +6,8 @@
   return null;
 static method test() → dynamic {
   core::String x = self::f<core::String>(<core::String>["hi"]);
-  core::String y = self::f<core::String>(<core::String>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String y = self::f<core::String>(<core::String>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
                                                                            ^" in 42 as{TypeError} core::String]);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect
new file mode 100644
index 0000000..6793864
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart:20:5: Context: Write to y@436
+  y = /*info:DYNAMIC_CAST*/ z;
+    ^
+pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart:35:5: Context: Write to y@941
+  y = /*info:DYNAMIC_CAST*/ z;
+    ^
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
deleted file mode 100644
index d819cdc..0000000
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Warning: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
-//   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
-//                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
-//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
-//                        ^
-//
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Warning: Declared type variables of 'D::g' doesn't match those on overridden method 'C::g'.
-//   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
-//                                              ^
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
-//   dynamic g(int x) => x;
-//           ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method m(dynamic x) → dynamic
-    return x;
-  method g(core::int x) → dynamic
-    return x;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
-    return x;
-  method g<T extends core::Object = dynamic>(self::D::g::T x) → self::D::g::T
-    return x;
-}
-static method main() → dynamic {
-  core::int y = (new self::D::•() as self::C).m(42);
-  core::print(y);
-}
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect
new file mode 100644
index 0000000..44e5758
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect
@@ -0,0 +1,42 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Warning: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
+//   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
+//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
+//   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
+//                        ^
+//
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Warning: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
+//   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
+//                                              ^
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
+//   dynamic g(int x) => x;
+//           ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method m(dynamic x) → dynamic
+    return x;
+  method g(core::int x) → dynamic
+    return x;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
+    return x;
+  method g<T extends core::Object = dynamic>(self::D::g::T x) → self::D::g::T
+    return x;
+}
+static method main() → dynamic {
+  core::int y = (new self::D::•() as self::C).m(42);
+  core::print(y);
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
index a010490..7df8c64 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
@@ -1,29 +1,29 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
 //                                              ^
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
 //   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
 //                        ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:54: Error: The parameter 'x' of the method 'D::m' has type test::D::m::T, which does not match the corresponding type in the overridden method (dynamic).
-// Change to a supertype of dynamic (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:54: Error: The parameter 'x' of the method 'D.m' has type 'T', which does not match the corresponding type in the overridden method, 'dynamic'.
+// Change to a supertype of 'dynamic', or, for a covariant parameter, a subtype.
 //           T /*@error=OverrideTypeMismatchParameter*/ x) =>
 //                                                      ^
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:9:24: Context: This is the overridden method ('m').
 //   /*@topType=dynamic*/ m(/*@topType=dynamic*/ x) => x;
 //                        ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Error: Declared type variables of 'D::g' doesn't match those on overridden method 'C::g'.
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Error: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
 //                                              ^
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
 //   dynamic g(int x) => x;
 //           ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:18:54: Error: The parameter 'x' of the method 'D::g' has type test::D::g::T, which does not match the corresponding type in the overridden method (dart.core::int).
-// Change to a supertype of dart.core::int (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:18:54: Error: The parameter 'x' of the method 'D.g' has type 'T', which does not match the corresponding type in the overridden method, 'int'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
 //           T /*@error=OverrideTypeMismatchParameter*/ x) =>
 //                                                      ^
 // pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:10:11: Context: This is the overridden method ('g').
@@ -32,21 +32,21 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D::m' doesn't match those on overridden method 'C::m'.
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:14:46: Error: Declared type variables of 'D.m' doesn't match those on overridden method 'C.m'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ m<T>(
 //                                              ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:54: Error: The parameter 'x' of the method 'D::m' has type test::D::m::T, which does not match the corresponding type in the overridden method (dynamic).
-// Change to a supertype of dynamic (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:15:54: Error: The parameter 'x' of the method 'D.m' has type 'T', which does not match the corresponding type in the overridden method, 'dynamic'.
+// Change to a supertype of 'dynamic', or, for a covariant parameter, a subtype.
 //           T /*@error=OverrideTypeMismatchParameter*/ x) =>
 //                                                      ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Error: Declared type variables of 'D::g' doesn't match those on overridden method 'C::g'.
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:17:46: Error: Declared type variables of 'D.g' doesn't match those on overridden method 'C.g'.
 //   T /*@error=OverrideTypeVariablesMismatch*/ g<T>(
 //                                              ^
 //
-// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:18:54: Error: The parameter 'x' of the method 'D::g' has type test::D::g::T, which does not match the corresponding type in the overridden method (dart.core::int).
-// Change to a supertype of dart.core::int (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart:18:54: Error: The parameter 'x' of the method 'D.g' has type 'T', which does not match the corresponding type in the overridden method, 'int'.
+// Change to a supertype of 'int', or, for a covariant parameter, a subtype.
 //           T /*@error=OverrideTypeMismatchParameter*/ x) =>
 //                                                      ^
 
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
index 9e2f29f..688f2c8 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
@@ -1,32 +1,32 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) → dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) → dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
 //       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
 //                                                                         ^
 //
-// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) → dart.core::double'.
-// Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) → dart.core::double'.
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
 //       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
 //                                                                         ^
 //
-// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) → dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) → dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
 //   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
 //                                                                        ^
 //
-// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) → dart.core::double'.
-// Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) → dart.core::double'.
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
 //   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
 //                                                                        ^
 //
-// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) → dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) → dart.core::int'.
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
 //           . /*@target=C::m*/ m);
 //                              ^
 //
-// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type '(dart.core::num, dart.core::num) → dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) → dart.core::double'.
-// Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) → dart.core::double'.
+// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
 //           . /*@target=C::m*/ m);
 //                              ^
 
@@ -53,12 +53,12 @@
   self::takeIIO(math::max<core::int>);
   self::takeDDO(math::max<core::double>);
   self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in (math::max<core::num>) as{TypeError} (core::double, core::int) → core::int);
-  self::takeDID(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in (math::max<core::num>) as{TypeError} (core::int, core::double) → core::double);
   self::takeOON((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
@@ -73,12 +73,12 @@
   self::takeIIO(math::min<core::int>);
   self::takeDDO(math::min<core::double>);
   self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in (math::min<core::num>) as{TypeError} (core::double, core::int) → core::int);
-  self::takeDID(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in (math::min<core::num>) as{TypeError} (core::int, core::double) → core::double);
   self::takeOON((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
@@ -95,12 +95,12 @@
   self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
           . /*@target=C::m*/ m);
                              ^" in (new self::C::•().{self::C::m}<core::num>) as{TypeError} (core::double, core::int) → core::int);
-  self::takeDID(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
           . /*@target=C::m*/ m);
                              ^" in (new self::C::•().{self::C::m}<core::num>) as{TypeError} (core::int, core::double) → core::double);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
index 6dde83c..8aea3c4 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
@@ -21,12 +21,12 @@
   self::takeIIO(math::max<core::int>);
   self::takeDDO(math::max<core::double>);
   self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in (math::max<core::num>) as{TypeError} (core::double, core::int) → core::int);
-  self::takeDID(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
                                                                         ^" in (math::max<core::num>) as{TypeError} (core::int, core::double) → core::double);
   self::takeOON((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
@@ -41,12 +41,12 @@
   self::takeIIO(math::min<core::int>);
   self::takeDDO(math::min<core::double>);
   self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in (math::min<core::num>) as{TypeError} (core::double, core::int) → core::int);
-  self::takeDID(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
                                                                        ^" in (math::min<core::num>) as{TypeError} (core::int, core::double) → core::double);
   self::takeOON((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
@@ -63,12 +63,12 @@
   self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
   self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
-  self::takeIDI(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::double, dart.core::int) \u8594 dart.core::int'.
+  self::takeIDI(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
+Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
           . /*@target=C::m*/ m);
                              ^" in (new self::C::•().{self::C::m}<core::num>) as{TypeError} (core::double, core::int) → core::int);
-  self::takeDID(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type '(dart.core::num, dart.core::num) \u8594 dart.core::num' can't be assigned to the parameter type '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
-Try changing the type of the parameter, or casting the argument to '(dart.core::int, dart.core::double) \u8594 dart.core::double'.
+  self::takeDID(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
+Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
           . /*@target=C::m*/ m);
                              ^" in (new self::C::•().{self::C::m}<core::num>) as{TypeError} (core::int, core::double) → core::double);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.expect
deleted file mode 100644
index 4d18a21..0000000
--- a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
-// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
-//                                          ^
-//
-// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
-// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
-//                                          ^
-//
-// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:11:43: Warning: Method not found: 'JS'.
-//   String x = /*error:INVALID_ASSIGNMENT*/ JS('int', '42');
-//                                           ^^
-//
-// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:12:28: Warning: Method not found: 'JS'.
-//   var /*@type=String*/ y = JS('String', '"hello"');
-//                            ^^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
-// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
-//                                          ^
-//
-// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
-// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
-//                                          ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  core::String x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  dynamic y = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  y = "world";
-  y = 42;
-}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.transformed.expect
deleted file mode 100644
index 38e8d5b1..0000000
--- a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.direct.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
-// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
-//                                          ^
-//
-// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
-// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
-//                                          ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  core::String x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  dynamic y = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  y = "world";
-  y = 42;
-}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.expect
new file mode 100644
index 0000000..5b0e517
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.expect
@@ -0,0 +1,38 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:11:43: Warning: Method not found: 'JS'.
+//   String x = /*error:INVALID_ASSIGNMENT*/ JS('int', '42');
+//                                           ^^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:12:28: Warning: Method not found: 'JS'.
+//   var /*@type=String*/ y = JS('String', '"hello"');
+//                            ^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::String x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  y = "world";
+  y = 42;
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.transformed.expect
new file mode 100644
index 0000000..89adde8
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Can't access platform private library.
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+//
+// pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:8:42: Error: Not found: 'dart:_foreign_helper'
+// /*error:IMPORT_INTERNAL_LIBRARY*/ import 'dart:_foreign_helper' show JS;
+//                                          ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::String x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  y = "world";
+  y = 42;
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.type_promotion.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.type_promotion.expect
new file mode 100644
index 0000000..7e3d35f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:13:5: Context: Write to y@427
+  y = "world";
+    ^
+pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart:14:5: Context: Write to y@427
+  y = /*error:INVALID_ASSIGNMENT*/ 42;
+    ^
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_inference_error.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_inference_error.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
index b21df2e..d2d0114 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //           1.0);
 //           ^
 
@@ -11,8 +11,8 @@
 
 static method f() → void {
   core::List<core::String> y;
-  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           1.0);
           ^" in 1.0 as{TypeError} core::String);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
index 1e283f0..fed97ff 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
@@ -4,8 +4,8 @@
 
 static method f() → void {
   core::List<core::String> y;
-  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::Iterable<core::String> x = y.{core::Iterable::map}<core::String>((core::String z) → core::String => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
           1.0);
           ^" in 1.0 as{TypeError} core::String);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index 64d369e..292cf85 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -1,12 +1,14 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'dart.async::FutureOr<dart.core::String>'.
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+//  - 'FutureOr' is from 'dart:async'.
 // Try correcting the name to the name of an existing method, or defining a method named '+'.
 //                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
 //                                                                                                                        ^
 //
-// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type '(dart.core::String, dart.core::int) → dart.core::String' can't be assigned to the parameter type '(dart.async::FutureOr<dart.core::String>, dart.core::int) → dart.async::FutureOr<dart.core::String>'.
-// Try changing the type of the parameter, or casting the argument to '(dart.async::FutureOr<dart.core::String>, dart.core::int) → dart.async::FutureOr<dart.core::String>'.
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+//  - 'FutureOr' is from 'dart:async'.
+// Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
 //                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
 //                                                                                                            ^
 
@@ -20,12 +22,14 @@
 static method test() → dynamic {
   core::Iterable<asy::Future<core::int>> list = <core::int>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int>>(self::make);
   asy::Future<core::List<core::int>> results = asy::Future::wait<core::int>(list);
-  asy::Future<core::String> results2 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", (asy::FutureOr<core::String> x, core::int y) → asy::FutureOr<core::String> => (let final dynamic #t1 = x in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'dart.async::FutureOr<dart.core::String>'.
+  asy::Future<core::String> results2 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", (asy::FutureOr<core::String> x, core::int y) → asy::FutureOr<core::String> => (let final dynamic #t1 = x in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+ - 'FutureOr' is from 'dart:async'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                        ^") as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to the parameter type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
-Try changing the type of the parameter, or casting the argument to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
+  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
                                                                                                            ^" in ((core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}())) as{TypeError} (asy::FutureOr<core::String>, core::int) → asy::FutureOr<core::String>));
   asy::Future<core::String> results4 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → core::String => list.{core::Iterable::fold}<core::String>("", (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}())));
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
index 6bd4abe..10a7227 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
@@ -8,12 +8,14 @@
 static method test() → dynamic {
   core::Iterable<asy::Future<core::int>> list = <core::int>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int>>(self::make);
   asy::Future<core::List<core::int>> results = asy::Future::wait<core::int>(list);
-  asy::Future<core::String> results2 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", (asy::FutureOr<core::String> x, core::int y) → asy::FutureOr<core::String> => (let final asy::FutureOr<core::String> #t1 = x in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'dart.async::FutureOr<dart.core::String>'.
+  asy::Future<core::String> results2 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", (asy::FutureOr<core::String> x, core::int y) → asy::FutureOr<core::String> => (let final asy::FutureOr<core::String> #t1 = x in invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+ - 'FutureOr' is from 'dart:async'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                                                                                                                        ^") as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type '(dart.core::String, dart.core::int) \u8594 dart.core::String' can't be assigned to the parameter type '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
-Try changing the type of the parameter, or casting the argument to '(dart.async::FutureOr<dart.core::String>, dart.core::int) \u8594 dart.async::FutureOr<dart.core::String>'.
+  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
                                                                                                            ^" in ((core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}())) as{TypeError} (asy::FutureOr<core::String>, core::int) → asy::FutureOr<core::String>));
   asy::Future<core::String> results4 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → core::String => list.{core::Iterable::fold}<core::String>("", (core::String x, core::int y) → core::String => x.{core::String::+}(y.{core::int::toString}())));
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.expect
rename to pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.expect
rename to pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_local.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect
new file mode 100644
index 0000000..b6004bf
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect
@@ -0,0 +1,39 @@
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:23:9: Context: Write to local@474
+  local = /*@typeArgs=B*/ f();
+        ^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:24:9: Context: Write to local@474
+  local ??= /*@typeArgs=B*/ f();
+        ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:25:9: Context: Write to local@474
+  local += /*@typeArgs=dynamic*/ f();
+        ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:26:9: Context: Write to local@474
+  local *= /*@typeArgs=dynamic*/ f();
+        ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:27:9: Context: Write to local@474
+  local &= /*@typeArgs=dynamic*/ f();
+        ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:28:3: Context: Write to local@474
+  --local;
+  ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:29:8: Context: Write to local@474
+  local--;
+       ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:30:30: Context: Write to local@474
+  var /*@type=B*/ v1 = local = /*@typeArgs=B*/ f();
+                             ^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:31:30: Context: Write to local@474
+  var /*@type=B*/ v2 = local ??= /*@typeArgs=B*/ f();
+                             ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:32:30: Context: Write to local@474
+  var /*@type=B*/ v4 = local *= /*@typeArgs=dynamic*/ f();
+                             ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:33:30: Context: Write to local@474
+  var /*@type=C*/ v5 = local &= /*@typeArgs=dynamic*/ f();
+                             ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:34:24: Context: Write to local@474
+  var /*@type=B*/ v6 = --local;
+                       ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:35:29: Context: Write to local@474
+  var /*@type=B*/ v7 = local--;
+                            ^^
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect
new file mode 100644
index 0000000..0bddfc5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect
@@ -0,0 +1,69 @@
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:13:28: Context: Write to t@343
+  var /*@type=int*/ v1 = t = getInt();
+                           ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:14:28: Context: Write to t@343
+  var /*@type=int*/ v4 = t ??= getInt();
+                           ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:15:28: Context: Write to t@343
+  var /*@type=int*/ v7 = t += getInt();
+                           ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:16:27: Context: Write to t@343
+  var /*@type=int*/ v10 = ++t;
+                          ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:17:28: Context: Write to t@343
+  var /*@type=int*/ v11 = t++;
+                           ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:21:28: Context: Write to t@343
+  var /*@type=int*/ v1 = t = getInt();
+                           ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:22:28: Context: Write to t@343
+  var /*@type=num*/ v2 = t = getNum();
+                           ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:23:31: Context: Write to t@343
+  var /*@type=double*/ v3 = t = getDouble();
+                              ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:24:28: Context: Write to t@343
+  var /*@type=num*/ v4 = t ??= getInt();
+                           ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:25:28: Context: Write to t@343
+  var /*@type=num*/ v5 = t ??= getNum();
+                           ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:26:28: Context: Write to t@343
+  var /*@type=num*/ v6 = t ??= getDouble();
+                           ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:27:28: Context: Write to t@343
+  var /*@type=num*/ v7 = t += getInt();
+                           ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:28:28: Context: Write to t@343
+  var /*@type=num*/ v8 = t += getNum();
+                           ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:29:28: Context: Write to t@343
+  var /*@type=num*/ v9 = t += getDouble();
+                           ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:30:27: Context: Write to t@343
+  var /*@type=num*/ v10 = ++t;
+                          ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:31:28: Context: Write to t@343
+  var /*@type=num*/ v11 = t++;
+                           ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:35:31: Context: Write to t@343
+  var /*@type=double*/ v3 = t = getDouble();
+                              ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:36:31: Context: Write to t@343
+  var /*@type=double*/ v6 = t ??= getDouble();
+                              ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:37:31: Context: Write to t@343
+  var /*@type=double*/ v7 = t += getInt();
+                              ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:38:31: Context: Write to t@343
+  var /*@type=double*/ v8 = t += getNum();
+                              ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:39:31: Context: Write to t@343
+  var /*@type=double*/ v9 = t += getDouble();
+                              ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:40:30: Context: Write to t@343
+  var /*@type=double*/ v10 = ++t;
+                             ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:41:31: Context: Write to t@343
+  var /*@type=double*/ v11 = t++;
+                              ^^
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_ref.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_static.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_custom.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.direct.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_double_double.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_binary_double_double.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_double_double.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_binary_double_double.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.direct.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_double_int.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_binary_double_int.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_double_int.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_binary_double_int.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.direct.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_int_double.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_binary_int_double.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_int_double.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_binary_int_double.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.direct.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_int_int.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_binary_int_int.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_binary_int_int.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_binary_int_int.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.direct.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_conditional.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_conditional.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_conditional.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_conditional.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect
new file mode 100644
index 0000000..3628855
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/infer_consts_transitively_2.dart:15:5: Context: Write to i@387
+  i = m1;
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.direct.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.direct.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.direct.expect
deleted file mode 100644
index 335fe8e..0000000
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.direct.expect
+++ /dev/null
@@ -1,7 +0,0 @@
-library;
-import self as self;
-
-static const field dynamic b1 = 2;
-static method main() → dynamic {
-  self::b1;
-}
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.direct.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.direct.expect
copy to pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
index ac98055..f159ba8 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
@@ -1,17 +1,17 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
 //                                                              ^
 
@@ -40,19 +40,19 @@
   core::String s;
   core::int i;
   s = new self::B::•().{self::B::x} as{TypeError} core::String;
-  s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
                                                              ^" in new self::B::•().{self::B::y} as{TypeError} core::String;
   s = new self::B::•().{self::B::z};
-  s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
                                                              ^" in new self::B::•().{self::B::w} as{TypeError} core::String;
   i = new self::B::•().{self::B::x} as{TypeError} core::int;
   i = new self::B::•().{self::B::y};
-  i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
                                                              ^" in new self::B::•().{self::B::z} as{TypeError} core::int;
   i = new self::B::•().{self::B::w};
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
index 6337119..3972ad0 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
@@ -23,19 +23,19 @@
   core::String s;
   core::int i;
   s = new self::B::•().{self::B::x} as{TypeError} core::String;
-  s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
                                                              ^" in new self::B::•().{self::B::y} as{TypeError} core::String;
   s = new self::B::•().{self::B::z};
-  s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
                                                              ^" in new self::B::•().{self::B::w} as{TypeError} core::String;
   i = new self::B::•().{self::B::x} as{TypeError} core::int;
   i = new self::B::•().{self::B::y};
-  i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
                                                              ^" in new self::B::•().{self::B::z} as{TypeError} core::int;
   i = new self::B::•().{self::B::w};
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect
new file mode 100644
index 0000000..7c9fd70
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.type_promotion.expect
@@ -0,0 +1,24 @@
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:25:5: Context: Write to s@537
+  s = /*info:DYNAMIC_CAST*/ new B(). /*@target=B::x*/ x;
+    ^
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:26:5: Context: Write to s@537
+  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
+    ^
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:5: Context: Write to s@537
+  s = new B(). /*@target=B::z*/ z;
+    ^
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:28:5: Context: Write to s@537
+  s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
+    ^
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:30:5: Context: Write to i@546
+  i = /*info:DYNAMIC_CAST*/ new B(). /*@target=B::x*/ x;
+    ^
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:31:5: Context: Write to i@546
+  i = new B(). /*@target=B::y*/ y;
+    ^
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:32:5: Context: Write to i@546
+  i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
+    ^
+pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:33:5: Context: Write to i@546
+  i = new B(). /*@target=B::w*/ w;
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_override_multiple.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index ea30e70..3f402e0 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -15,48 +15,48 @@
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
-// Change to a subtype of dart.core::int.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F.x' is 'dynamic', which does not match the return type of the overridden method, 'int'.
+// Change to a subtype of 'int'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is the overridden method ('x').
 //   int get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F::x' is dynamic, which does not match the return type of the overridden method (dart.core::num).
-// Change to a subtype of dart.core::num.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F.x' is 'dynamic', which does not match the return type of the overridden method, 'num'.
+// Change to a subtype of 'num'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is the overridden method ('x').
 //   num get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
-// Change to a subtype of dart.core::int.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G.x' is 'dynamic', which does not match the return type of the overridden method, 'int'.
+// Change to a subtype of 'int'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:9:11: Context: This is the overridden method ('x').
 //   int get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G::x' is dynamic, which does not match the return type of the overridden method (dart.core::double).
-// Change to a subtype of dart.core::double.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G.x' is 'dynamic', which does not match the return type of the overridden method, 'double'.
+// Change to a subtype of 'double'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is the overridden method ('x').
 //   double get x;
 //              ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H::x' is dynamic, which does not match the return type of the overridden method (dart.core::num).
-// Change to a subtype of dart.core::num.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H.x' is 'dynamic', which does not match the return type of the overridden method, 'num'.
+// Change to a subtype of 'num'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:17:11: Context: This is the overridden method ('x').
 //   num get x;
 //           ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H::x' is dynamic, which does not match the return type of the overridden method (dart.core::double).
-// Change to a subtype of dart.core::double.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H.x' is 'dynamic', which does not match the return type of the overridden method, 'double'.
+// Change to a subtype of 'double'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 // pkg/front_end/testcases/inference/infer_field_override_multiple.dart:21:14: Context: This is the overridden method ('x').
@@ -80,33 +80,33 @@
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
-// Change to a subtype of dart.core::int.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F.x' is 'dynamic', which does not match the return type of the overridden method, 'int'.
+// Change to a subtype of 'int'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F::x' is dynamic, which does not match the return type of the overridden method (dart.core::num).
-// Change to a subtype of dart.core::num.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:163: Error: The return type of the method 'F.x' is 'dynamic', which does not match the return type of the overridden method, 'num'.
+// Change to a subtype of 'num'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
-// Change to a subtype of dart.core::int.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G.x' is 'dynamic', which does not match the return type of the overridden method, 'int'.
+// Change to a subtype of 'int'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G::x' is dynamic, which does not match the return type of the overridden method (dart.core::double).
-// Change to a subtype of dart.core::double.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:163: Error: The return type of the method 'G.x' is 'dynamic', which does not match the return type of the overridden method, 'double'.
+// Change to a subtype of 'double'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H::x' is dynamic, which does not match the return type of the overridden method (dart.core::num).
-// Change to a subtype of dart.core::num.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H.x' is 'dynamic', which does not match the return type of the overridden method, 'num'.
+// Change to a subtype of 'num'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H::x' is dynamic, which does not match the return type of the overridden method (dart.core::double).
-// Change to a subtype of dart.core::double.
+// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:163: Error: The return type of the method 'H.x' is 'dynamic', which does not match the return type of the overridden method, 'double'.
+// Change to a subtype of 'double'.
 //   var /*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ /*@error=OverrideTypeMismatchReturnType*/ /*@error=OverrideTypeMismatchReturnType*/ x;
 //                                                                                                                                                                   ^
 
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_override_of_override.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.expect
deleted file mode 100644
index cb3988f..0000000
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.expect
+++ /dev/null
@@ -1,53 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  abstract get x() → core::int;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  get x() → core::int
-    return 0;
-}
-class C extends self::A {
-  field dynamic x = null;
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-class D extends self::B {
-  field dynamic x = null;
-  synthetic constructor •() → self::D
-    : super self::B::•()
-    ;
-}
-class E extends core::Object implements self::A {
-  field dynamic x = null;
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-}
-class F extends core::Object implements self::B {
-  field dynamic x = null;
-  synthetic constructor •() → self::F
-    : super core::Object::•()
-    ;
-}
-abstract class _G&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_G&Object&B
-    : super core::Object::•()
-    ;
-}
-class G extends self::_G&Object&B {
-  field dynamic x = null;
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.transformed.expect
deleted file mode 100644
index c1822ed..0000000
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.direct.transformed.expect
+++ /dev/null
@@ -1,55 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  abstract get x() → core::int;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  get x() → core::int
-    return 0;
-}
-class C extends self::A {
-  field dynamic x = null;
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-class D extends self::B {
-  field dynamic x = null;
-  synthetic constructor •() → self::D
-    : super self::B::•()
-    ;
-}
-class E extends core::Object implements self::A {
-  field dynamic x = null;
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-}
-class F extends core::Object implements self::B {
-  field dynamic x = null;
-  synthetic constructor •() → self::F
-    : super core::Object::•()
-    ;
-}
-abstract class _G&Object&B extends core::Object implements self::B {
-  synthetic constructor •() → self::_G&Object&B
-    : super core::Object::•()
-    ;
-  get x() → core::int
-    return 0;
-}
-class G extends self::_G&Object&B {
-  field dynamic x = null;
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.expect
new file mode 100644
index 0000000..72b90ee
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return 0;
+}
+class C extends self::A {
+  field dynamic x = null;
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+}
+class D extends self::B {
+  field dynamic x = null;
+  synthetic constructor •() → self::D
+    : super self::B::•()
+    ;
+}
+class E extends core::Object implements self::A {
+  field dynamic x = null;
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+}
+class F extends core::Object implements self::B {
+  field dynamic x = null;
+  synthetic constructor •() → self::F
+    : super core::Object::•()
+    ;
+}
+abstract class _G&Object&B = core::Object with self::B {
+  const synthetic constructor •() → self::_G&Object&B
+    : super core::Object::•()
+    ;
+}
+class G extends self::_G&Object&B {
+  field dynamic x = null;
+  synthetic constructor •() → self::G
+    : super self::_G&Object&B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.transformed.expect
new file mode 100644
index 0000000..31c9fee
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.transformed.expect
@@ -0,0 +1,55 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract get x() → core::int;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return 0;
+}
+class C extends self::A {
+  field dynamic x = null;
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+}
+class D extends self::B {
+  field dynamic x = null;
+  synthetic constructor •() → self::D
+    : super self::B::•()
+    ;
+}
+class E extends core::Object implements self::A {
+  field dynamic x = null;
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+}
+class F extends core::Object implements self::B {
+  field dynamic x = null;
+  synthetic constructor •() → self::F
+    : super core::Object::•()
+    ;
+}
+abstract class _G&Object&B extends core::Object implements self::B {
+  const synthetic constructor •() → self::_G&Object&B
+    : super core::Object::•()
+    ;
+  get x() → core::int
+    return 0;
+}
+class G extends self::_G&Object&B {
+  field dynamic x = null;
+  synthetic constructor •() → self::G
+    : super self::_G&Object&B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.outline.expect
index 56851ab..b627b29 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.outline.expect
@@ -34,7 +34,7 @@
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.expect
index fa8f9e8..9f9de47 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.expect
@@ -40,14 +40,14 @@
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B
     : super core::Object::•()
     ;
 }
 class G extends self::_G&Object&B {
   field core::int x = null;
   synthetic constructor •() → self::G
-    : super core::Object::•()
+    : super self::_G&Object&B::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.transformed.expect
index 427dbc2..9f7817b 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.transformed.expect
@@ -40,7 +40,7 @@
     ;
 }
 abstract class _G&Object&B extends core::Object implements self::B {
-  synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B
     : super core::Object::•()
     ;
   get x() → core::int
@@ -49,7 +49,7 @@
 class G extends self::_G&Object&B {
   field core::int x = null;
   synthetic constructor •() → self::G
-    : super core::Object::•()
+    : super self::_G&Object&B::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.expect
deleted file mode 100644
index 33c6ea7..0000000
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.expect
+++ /dev/null
@@ -1,52 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  abstract set x(core::int value) → void;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  set x(core::int value) → void {}
-}
-class C extends self::A {
-  field dynamic x = null;
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-class D extends self::B {
-  field dynamic x = null;
-  synthetic constructor •() → self::D
-    : super self::B::•()
-    ;
-}
-class E extends core::Object implements self::A {
-  field dynamic x = null;
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-}
-class F extends core::Object implements self::B {
-  field dynamic x = null;
-  synthetic constructor •() → self::F
-    : super core::Object::•()
-    ;
-}
-abstract class _G&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_G&Object&B
-    : super core::Object::•()
-    ;
-}
-class G extends self::_G&Object&B {
-  field dynamic x = null;
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.transformed.expect
deleted file mode 100644
index bf18d3f..0000000
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.direct.transformed.expect
+++ /dev/null
@@ -1,53 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  abstract set x(core::int value) → void;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  set x(core::int value) → void {}
-}
-class C extends self::A {
-  field dynamic x = null;
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-class D extends self::B {
-  field dynamic x = null;
-  synthetic constructor •() → self::D
-    : super self::B::•()
-    ;
-}
-class E extends core::Object implements self::A {
-  field dynamic x = null;
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-}
-class F extends core::Object implements self::B {
-  field dynamic x = null;
-  synthetic constructor •() → self::F
-    : super core::Object::•()
-    ;
-}
-abstract class _G&Object&B extends core::Object implements self::B {
-  synthetic constructor •() → self::_G&Object&B
-    : super core::Object::•()
-    ;
-  set x(core::int value) → void {}
-}
-class G extends self::_G&Object&B {
-  field dynamic x = null;
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.expect
new file mode 100644
index 0000000..8baaa28
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.expect
@@ -0,0 +1,52 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract set x(core::int value) → void;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  set x(core::int value) → void {}
+}
+class C extends self::A {
+  field dynamic x = null;
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+}
+class D extends self::B {
+  field dynamic x = null;
+  synthetic constructor •() → self::D
+    : super self::B::•()
+    ;
+}
+class E extends core::Object implements self::A {
+  field dynamic x = null;
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+}
+class F extends core::Object implements self::B {
+  field dynamic x = null;
+  synthetic constructor •() → self::F
+    : super core::Object::•()
+    ;
+}
+abstract class _G&Object&B = core::Object with self::B {
+  const synthetic constructor •() → self::_G&Object&B
+    : super core::Object::•()
+    ;
+}
+class G extends self::_G&Object&B {
+  field dynamic x = null;
+  synthetic constructor •() → self::G
+    : super self::_G&Object&B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1a36773
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.transformed.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract set x(core::int value) → void;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  set x(core::int value) → void {}
+}
+class C extends self::A {
+  field dynamic x = null;
+  synthetic constructor •() → self::C
+    : super self::A::•()
+    ;
+}
+class D extends self::B {
+  field dynamic x = null;
+  synthetic constructor •() → self::D
+    : super self::B::•()
+    ;
+}
+class E extends core::Object implements self::A {
+  field dynamic x = null;
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+}
+class F extends core::Object implements self::B {
+  field dynamic x = null;
+  synthetic constructor •() → self::F
+    : super core::Object::•()
+    ;
+}
+abstract class _G&Object&B extends core::Object implements self::B {
+  const synthetic constructor •() → self::_G&Object&B
+    : super core::Object::•()
+    ;
+  set x(core::int value) → void {}
+}
+class G extends self::_G&Object&B {
+  field dynamic x = null;
+  synthetic constructor •() → self::G
+    : super self::_G&Object&B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.outline.expect
index f5711a5..02e0c2b 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.outline.expect
@@ -34,7 +34,7 @@
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.expect
index 2b77c7f..3c16ce0 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.expect
@@ -39,14 +39,14 @@
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B
     : super core::Object::•()
     ;
 }
 class G extends self::_G&Object&B {
   field core::int x = null;
   synthetic constructor •() → self::G
-    : super core::Object::•()
+    : super self::_G&Object&B::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.transformed.expect
index d81e504..e3da27e 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.transformed.expect
@@ -39,7 +39,7 @@
     ;
 }
 abstract class _G&Object&B extends core::Object implements self::B {
-  synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B
     : super core::Object::•()
     ;
   set x(core::int value) → void {}
@@ -47,7 +47,7 @@
 class G extends self::_G&Object&B {
   field core::int x = null;
   synthetic constructor •() → self::G
-    : super core::Object::•()
+    : super self::_G&Object&B::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.direct.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_static.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_field_static.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_field_static.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_field_static.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
index 03941bd..3b9b207 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
@@ -40,9 +40,9 @@
   b = /*error:INVALID_ASSIGNMENT*/ "hi";
   b = new B(3);
   c1 = /*@typeArgs=dynamic*/ [];
-  c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
+  c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
   c2 = /*@typeArgs=dynamic*/ [];
-  c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
+  c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
   d = /*@typeArgs=dynamic, dynamic*/ {};
   d = /*error:INVALID_ASSIGNMENT*/ 3;
   e = new A();
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
deleted file mode 100644
index 2e6223f..0000000
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.expect
+++ /dev/null
@@ -1,63 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Warning: Getter not found: 'x'.
-// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
-//                                                             ^
-//
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Warning: Getter not found: 'x'.
-//   /*error:UNDEFINED_IDENTIFIER*/ x
-//                                  ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → self::B
-    return null;
-}
-class B extends self::A {
-  constructor •(dynamic ignore) → self::B
-    : super self::A::•()
-    ;
-}
-static field dynamic a = new self::A::•();
-static field dynamic b = new self::B::•(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-static field dynamic c1 = <dynamic>[let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))];
-static field dynamic c2 = const <dynamic>[];
-static field dynamic d = <dynamic, dynamic>{"a": "b"};
-static field dynamic e = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.x = 3 in #t1;
-static field dynamic f = 2.+(3);
-static field dynamic g = 3.unary-();
-static field dynamic h = new self::A::•().+(3);
-static field dynamic i = new self::A::•().unary-();
-static field dynamic j = null as self::B;
-static method test1() → dynamic {
-  self::a = "hi";
-  self::a = new self::B::•(3);
-  self::b = "hi";
-  self::b = new self::B::•(3);
-  self::c1 = <dynamic>[];
-  self::c1 = <dynamic, dynamic>{};
-  self::c2 = <dynamic>[];
-  self::c2 = <dynamic, dynamic>{};
-  self::d = <dynamic, dynamic>{};
-  self::d = 3;
-  self::e = new self::A::•();
-  self::e = <dynamic, dynamic>{};
-  self::f = 3;
-  self::f = false;
-  self::g = 1;
-  self::g = false;
-  self::h = false;
-  self::h = new self::B::•("b");
-  self::i = false;
-  self::j = new self::B::•("b");
-  self::j = false;
-  self::j = <dynamic>[];
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.transformed.expect
deleted file mode 100644
index 5140db2..0000000
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.direct.transformed.expect
+++ /dev/null
@@ -1,53 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → self::B
-    return null;
-}
-class B extends self::A {
-  constructor •(dynamic ignore) → self::B
-    : super self::A::•()
-    ;
-}
-static field dynamic a = new self::A::•();
-static field dynamic b = new self::B::•(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-static field dynamic c1 = <dynamic>[let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))];
-static field dynamic c2 = const <dynamic>[];
-static field dynamic d = <dynamic, dynamic>{"a": "b"};
-static field dynamic e = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.x = 3 in #t1;
-static field dynamic f = 2.+(3);
-static field dynamic g = 3.unary-();
-static field dynamic h = new self::A::•().+(3);
-static field dynamic i = new self::A::•().unary-();
-static field dynamic j = null as self::B;
-static method test1() → dynamic {
-  self::a = "hi";
-  self::a = new self::B::•(3);
-  self::b = "hi";
-  self::b = new self::B::•(3);
-  self::c1 = <dynamic>[];
-  self::c1 = <dynamic, dynamic>{};
-  self::c2 = <dynamic>[];
-  self::c2 = <dynamic, dynamic>{};
-  self::d = <dynamic, dynamic>{};
-  self::d = 3;
-  self::e = new self::A::•();
-  self::e = <dynamic, dynamic>{};
-  self::f = 3;
-  self::f = false;
-  self::g = 1;
-  self::g = false;
-  self::h = false;
-  self::h = new self::B::•("b");
-  self::i = false;
-  self::j = new self::B::•("b");
-  self::j = false;
-  self::j = <dynamic>[];
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect
new file mode 100644
index 0000000..c1990f1
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect
@@ -0,0 +1,63 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:19:61: Warning: Getter not found: 'x'.
+// var /*@topType=B*/ b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
+//                                                             ^
+//
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Warning: Getter not found: 'x'.
+//   /*error:UNDEFINED_IDENTIFIER*/ x
+//                                  ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int x = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → self::B
+    return null;
+}
+class B extends self::A {
+  constructor •(dynamic ignore) → self::B
+    : super self::A::•()
+    ;
+}
+static field dynamic a = new self::A::•();
+static field dynamic b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field dynamic c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))];
+static field dynamic c2 = const <dynamic>[];
+static field dynamic d = <dynamic, dynamic>{"a": "b"};
+static field dynamic e = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.x = 3 in #t1;
+static field dynamic f = 2.+(3);
+static field dynamic g = 3.unary-();
+static field dynamic h = new self::A::•().+(3);
+static field dynamic i = new self::A::•().unary-();
+static field dynamic j = null as self::B;
+static method test1() → dynamic {
+  self::a = "hi";
+  self::a = new self::B::•(3);
+  self::b = "hi";
+  self::b = new self::B::•(3);
+  self::c1 = <dynamic>[];
+  self::c1 = <dynamic, dynamic>{};
+  self::c2 = <dynamic>[];
+  self::c2 = <dynamic, dynamic>{};
+  self::d = <dynamic, dynamic>{};
+  self::d = 3;
+  self::e = new self::A::•();
+  self::e = <dynamic, dynamic>{};
+  self::f = 3;
+  self::f = false;
+  self::g = 1;
+  self::g = false;
+  self::h = false;
+  self::h = new self::B::•("b");
+  self::i = false;
+  self::j = new self::B::•("b");
+  self::j = false;
+  self::j = <dynamic>[];
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9c6ee49
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect
@@ -0,0 +1,53 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int x = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → self::B
+    return null;
+}
+class B extends self::A {
+  constructor •(dynamic ignore) → self::B
+    : super self::A::•()
+    ;
+}
+static field dynamic a = new self::A::•();
+static field dynamic b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field dynamic c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))];
+static field dynamic c2 = const <dynamic>[];
+static field dynamic d = <dynamic, dynamic>{"a": "b"};
+static field dynamic e = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.x = 3 in #t1;
+static field dynamic f = 2.+(3);
+static field dynamic g = 3.unary-();
+static field dynamic h = new self::A::•().+(3);
+static field dynamic i = new self::A::•().unary-();
+static field dynamic j = null as self::B;
+static method test1() → dynamic {
+  self::a = "hi";
+  self::a = new self::B::•(3);
+  self::b = "hi";
+  self::b = new self::B::•(3);
+  self::c1 = <dynamic>[];
+  self::c1 = <dynamic, dynamic>{};
+  self::c2 = <dynamic>[];
+  self::c2 = <dynamic, dynamic>{};
+  self::d = <dynamic, dynamic>{};
+  self::d = 3;
+  self::e = new self::A::•();
+  self::e = <dynamic, dynamic>{};
+  self::f = 3;
+  self::f = false;
+  self::g = 1;
+  self::g = false;
+  self::h = false;
+  self::h = new self::B::•("b");
+  self::i = false;
+  self::j = new self::B::•("b");
+  self::j = false;
+  self::j = <dynamic>[];
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index f779922..9075c6f 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -8,69 +8,84 @@
 //   /*error:UNDEFINED_IDENTIFIER*/ x
 //                                  ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'test::A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
 // var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
 //                                                                               ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
 //   a = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'B'.
 //   b = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
-//   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
-//                                                                    ^
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
+//   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
+//                                                           ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
-//   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
-//                                                                    ^
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'List' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
+//   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
+//                                                           ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dynamic, dynamic>'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+//  - 'Map' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
 //   d = /*error:INVALID_ASSIGNMENT*/ 3;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+//  - 'Map' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
 //   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   f = /*error:INVALID_ASSIGNMENT*/ false;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   g = /*error:INVALID_ASSIGNMENT*/ false;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'B'.
 //   h = /*error:INVALID_ASSIGNMENT*/ false;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'B'.
 //   j = /*error:INVALID_ASSIGNMENT*/ false;
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+//  - 'List' is from 'dart:core'.
+//  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'B'.
 //   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
 //                                                          ^
 
 library test;
 import self as self;
 import "dart:core" as core;
+import "dart:collection" as col;
 
 class A extends core::Object {
   field core::int x = null;
@@ -98,65 +113,69 @@
 static field core::int f = 2.{core::num::+}(3);
 static field core::int g = 3.{core::int::unary-}();
 static field self::B h = new self::A::•().{self::A::+}(3);
-static field dynamic i = let final dynamic #t3 = new self::A::•() in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'test::A'.
+static field dynamic i = let final dynamic #t3 = new self::A::•() in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
 var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
                                                                               ^";
 static field self::B j = null as self::B;
 static method test1() → dynamic {
-  self::a = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+  self::a = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::A;
   self::a = new self::B::•(3);
-  self::b = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+  self::b = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::B;
   self::b = new self::B::•(3);
   self::c1 = <dynamic>[];
-  self::c1 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
-  c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
-                                                                   ^" in <dynamic, dynamic>{} as{TypeError} core::List<dynamic>;
+  self::c1 = let final core::Set<dynamic> #t6 = col::LinkedHashSet::•<dynamic>() in #t6;
   self::c2 = <dynamic>[];
-  self::c2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
-  c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
-                                                                   ^" in <dynamic, dynamic>{} as{TypeError} core::List<dynamic>;
+  self::c2 = let final core::Set<dynamic> #t7 = col::LinkedHashSet::•<dynamic>() in #t7;
   self::d = <dynamic, dynamic>{};
-  self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dynamic, dynamic>'.
+  self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+ - 'Map' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
   d = /*error:INVALID_ASSIGNMENT*/ 3;
                                    ^" in 3 as{TypeError} core::Map<dynamic, dynamic>;
   self::e = new self::A::•();
-  self::e = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+  self::e = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+ - 'Map' is from 'dart:core'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                   ^" in <dynamic, dynamic>{} as{TypeError} self::A;
   self::f = 3;
-  self::f = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int;
   self::g = 1;
-  self::g = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::g = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   g = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int;
-  self::h = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+  self::h = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B'.
   h = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B;
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
-  self::j = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+  self::j = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B'.
   j = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B;
-  self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+  self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B'.
   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
                                                          ^" in <dynamic>[] as{TypeError} self::B;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 6987569..f0a746a 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -28,65 +28,79 @@
 static field core::int f = 2.{core::num::+}(3);
 static field core::int g = 3.{core::int::unary-}();
 static field self::B h = new self::A::•().{self::A::+}(3);
-static field dynamic i = let final self::A #t3 = new self::A::•() in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'test::A'.
+static field dynamic i = let final self::A #t3 = new self::A::•() in invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:34:79: Error: The method 'unary-' isn't defined for the class 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
 var /*@topType=dynamic*/ i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
                                                                               ^";
 static field self::B j = null as self::B;
 static method test1() → dynamic {
-  self::a = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::A'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+  self::a = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::A;
   self::a = new self::B::•(3);
-  self::b = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'test::B'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+  self::b = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:40:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} self::B;
   self::b = new self::B::•(3);
   self::c1 = <dynamic>[];
-  self::c1 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
+  self::c1 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:68: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'Map' is from 'dart:core'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                    ^" in <dynamic, dynamic>{} as{TypeError} core::List<dynamic>;
   self::c2 = <dynamic>[];
-  self::c2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'dart.core::List<dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::List<dynamic>'.
+  self::c2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:68: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
+ - 'Map' is from 'dart:core'.
+ - 'List' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                    ^" in <dynamic, dynamic>{} as{TypeError} core::List<dynamic>;
   self::d = <dynamic, dynamic>{};
-  self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Map<dynamic, dynamic>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Map<dynamic, dynamic>'.
+  self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
+ - 'Map' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
   d = /*error:INVALID_ASSIGNMENT*/ 3;
                                    ^" in 3 as{TypeError} core::Map<dynamic, dynamic>;
   self::e = new self::A::•();
-  self::e = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'dart.core::Map<dynamic, dynamic>' can't be assigned to a variable of type 'test::A'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+  self::e = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
+ - 'Map' is from 'dart:core'.
+ - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
                                                                   ^" in <dynamic, dynamic>{} as{TypeError} self::A;
   self::f = 3;
-  self::f = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::f = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int;
   self::g = 1;
-  self::g = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::g = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:53:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   g = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} core::int;
-  self::h = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+  self::h = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:54:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B'.
   h = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B;
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
-  self::j = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'dart.core::bool' can't be assigned to a variable of type 'test::B'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+  self::j = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:58:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B'.
   j = /*error:INVALID_ASSIGNMENT*/ false;
                                    ^" in false as{TypeError} self::B;
-  self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'dart.core::List<dynamic>' can't be assigned to a variable of type 'test::B'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B'.
+  self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:59:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
+ - 'List' is from 'dart:core'.
+ - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B'.
   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
                                                          ^" in <dynamic>[] as{TypeError} self::B;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect
new file mode 100644
index 0000000..f71d77a
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart:14:5: Context: Write to t@389
+  t = x;
+    ^
+pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart:15:5: Context: Write to t@389
+  t = y;
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect
new file mode 100644
index 0000000..5b8cb3d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart:16:5: Context: Write to t@400
+  t = A.x;
+    ^
+pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart:17:5: Context: Write to t@400
+  t = B.y;
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
index a43d328..e47986c 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
@@ -1,12 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   y = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 
@@ -17,12 +17,12 @@
 
 static field core::int y = inf::x;
 static method test1() → dynamic {
-  inf::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  inf::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
-  self::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
index 3f2a51c4..bc3de58 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
@@ -5,12 +5,12 @@
 
 static field core::int y = inf::x;
 static method test1() → dynamic {
-  inf::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  inf::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
-  self::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
index 0e683ae..8ab19bb 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
@@ -1,12 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   A.x = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                      ^
 //
-// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   B.y = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                      ^
 
@@ -22,12 +22,12 @@
     ;
 }
 static method test1() → dynamic {
-  inf::A::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  inf::A::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
-  self::B::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::B::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
index 2faada5..0f7d3b6 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
@@ -10,12 +10,12 @@
     ;
 }
 static method test1() → dynamic {
-  inf::A::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  inf::A::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
-  self::B::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::B::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.expect
deleted file mode 100644
index b2d87e2..0000000
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic x = 2;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.transformed.expect
deleted file mode 100644
index b2d87e2..0000000
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.direct.transformed.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic x = 2;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.expect
copy to pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.direct.transformed.expect
copy to pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
deleted file mode 100644
index 22fa159..0000000
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Warning: Method not found: 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
-//
-// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
-//   g() => 0;
-//   ^
-// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Context: Previous use of 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  function f() → dynamic
-    return let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  {
-    invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
-  g() => 0;
-  ^";
-    function g() → dynamic
-      return 0;
-  }
-  dynamic v = f;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.transformed.expect
deleted file mode 100644
index 7a403de..0000000
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.direct.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  function f() → dynamic
-    return let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  {
-    invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
-  g() => 0;
-  ^";
-    function g() → dynamic
-      return 0;
-  }
-  dynamic v = f;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.expect
new file mode 100644
index 0000000..45294a7
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.expect
@@ -0,0 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Warning: Method not found: 'g'.
+//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                          ^
+//
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
+//   g() => 0;
+//   ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Context: Previous use of 'g'.
+//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                          ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function f() → dynamic
+    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  {
+    invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
+  g() => 0;
+  ^";
+    function g() → dynamic
+      return 0;
+  }
+  dynamic v = f;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9071805
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.transformed.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function f() → dynamic
+    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  {
+    invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:14:3: Error: Can't declare 'g' because it was already used in this scope.
+  g() => 0;
+  ^";
+    function g() → dynamic
+      return 0;
+  }
+  dynamic v = f;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
deleted file mode 100644
index 7e23d3a..0000000
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
+++ /dev/null
@@ -1,131 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  function f0() → dynamic
-    return 42;
-  function f1() → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          :return_value = 42;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-  function f2() → dynamic {
-    return 42;
-  }
-  function f3() → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          :return_value = 42;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-  function f4() → dynamic /* originally sync* */ {
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
-      {
-        {
-          :iterator.{core::_SyncIterator::_current} = 42;
-          [yield] true;
-        }
-      }
-      return false;
-    }
-    return new core::_SyncIterable::•<dynamic>(:sync_op);
-  }
-  function f5() → dynamic /* originally async* */ {
-    asy::_AsyncStarStreamController<dynamic> :controller;
-    dynamic :controller_stream;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :saved_try_context_var1;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try
-        try {
-          #L3:
-          {
-            if(:controller.{asy::_AsyncStarStreamController::add}(42))
-              return null;
-            else
-              [yield] null;
-          }
-          return;
-        }
-        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-          :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-        }
-      finally {
-        :controller.{asy::_AsyncStarStreamController::close}();
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
-    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-    return :controller_stream;
-  }
-  function f6() → core::num
-    return 42;
-  function f7() → dynamic
-    return f7.call();
-  function f8() → dynamic
-    return f5.call();
-  dynamic v0 = f0;
-  dynamic v1 = f1;
-  dynamic v2 = f2;
-  dynamic v3 = f3;
-  dynamic v4 = f4;
-  dynamic v5 = f5;
-  dynamic v6 = f6;
-  dynamic v7 = f7;
-  dynamic v8 = f8;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.transformed.expect
new file mode 100644
index 0000000..256e504
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.transformed.expect
@@ -0,0 +1,131 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  function f0() → dynamic
+    return 42;
+  function f1() → dynamic /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          :return_value = 42;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function f2() → dynamic {
+    return 42;
+  }
+  function f3() → dynamic /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          :return_value = 42;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function f4() → dynamic /* originally sync* */ {
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+      {
+        {
+          :iterator.{core::_SyncIterator::_current} = 42;
+          [yield] true;
+        }
+      }
+      return false;
+    }
+    return new core::_SyncIterable::•<dynamic>(:sync_op);
+  }
+  function f5() → dynamic /* originally async* */ {
+    asy::_AsyncStarStreamController<dynamic> :controller;
+    dynamic :controller_stream;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :saved_try_context_var1;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try
+        try {
+          #L3:
+          {
+            if(:controller.{asy::_AsyncStarStreamController::add}(42))
+              return null;
+            else
+              [yield] null;
+          }
+          return;
+        }
+        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+          :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+        }
+      finally {
+        :controller.{asy::_AsyncStarStreamController::close}();
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
+    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+    return :controller_stream;
+  }
+  function f6() → core::num
+    return 42;
+  function f7() → dynamic
+    return f7.call();
+  function f8() → dynamic
+    return f5.call();
+  dynamic v0 = f0;
+  dynamic v1 = f1;
+  dynamic v2 = f2;
+  dynamic v3 = f3;
+  dynamic v4 = f4;
+  dynamic v5 = f5;
+  dynamic v6 = f6;
+  dynamic v7 = f7;
+  dynamic v8 = f8;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
index 7946c1c..a6f275f 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   function f0() → core::int
     return 42;
   function f1() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -30,14 +30,14 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
   function f2() → core::int {
     return 42;
   }
   function f3() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -60,7 +60,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
   function f4() → core::Iterable<core::int> /* originally sync* */ {
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_method_function_typed.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect
deleted file mode 100644
index eb809e8..0000000
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
-//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
-//                                                             ^
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
-//   int f(int x);
-//       ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  abstract method f(core::int x, core::int y) → core::int;
-  abstract method g(core::int x, [core::int y = null]) → core::int;
-  abstract method h(core::int x, {core::int y = null}) → core::int;
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method f(core::int x) → core::int;
-  abstract method g(core::int x) → core::int;
-  abstract method h(core::int x) → core::int;
-}
-abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract method f(dynamic x, dynamic y) → dynamic;
-  abstract method g(dynamic x, [dynamic y = null]) → dynamic;
-  abstract method h(dynamic x, {dynamic y = null}) → dynamic;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect
new file mode 100644
index 0000000..8d85497
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect
@@ -0,0 +1,38 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
+//   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
+//                                                             ^
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
+//   int f(int x);
+//       ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  abstract method f(core::int x, core::int y) → core::int;
+  abstract method g(core::int x, [core::int y = null]) → core::int;
+  abstract method h(core::int x, {core::int y = null}) → core::int;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract method f(core::int x) → core::int;
+  abstract method g(core::int x) → core::int;
+  abstract method h(core::int x) → core::int;
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method f(dynamic x, dynamic y) → dynamic;
+  abstract method g(dynamic x, [dynamic y = null]) → dynamic;
+  abstract method h(dynamic x, {dynamic y = null}) → dynamic;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_method_missing_params.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
index 68ab1aa..4768ea2 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
@@ -1,6 +1,6 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Warning: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
 //   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
 //                                                             ^
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
index 27e8464..24fae77 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
@@ -15,7 +15,7 @@
 //       [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
 //                                                                                ^
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
 //   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
 //                                                             ^
 // pkg/front_end/testcases/inference/infer_method_missing_params.dart:17:7: Context: This is the overridden method ('f').
@@ -39,7 +39,7 @@
 //       [/*@topType=dynamic*/ /*@error=CantInferTypeDueToInconsistentOverrides*/ y]);
 //                                                                                ^
 //
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C::f' has more required arguments than those of overridden method 'B::f'.
+// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:61: Error: The method 'C.f' has more required arguments than those of overridden method 'B.f'.
 //   /*@topType=int*/ /*@error=OverrideMoreRequiredArguments*/ f(
 //                                                             ^
 
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.direct.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_prefix_expression.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_prefix_expression.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_prefix_expression.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_prefix_expression.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_rethrow.dart.direct.expect b/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_rethrow.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_rethrow.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_rethrow.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.direct.expect b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_setter_function_typed.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect
new file mode 100644
index 0000000..2bf9cee
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/infer_statics_transitively.dart:15:5: Context: Write to i@388
+  i = m1;
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively2.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect
new file mode 100644
index 0000000..bd3b23fe
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/infer_statics_transitively2.dart:15:5: Context: Write to i@403
+  i = y1;
+    ^
+pkg/front_end/testcases/inference/infer_statics_transitively2.dart:16:5: Context: Write to i@403
+  i = y2;
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively3.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively3.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect
new file mode 100644
index 0000000..2d28253
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/inference/infer_statics_transitively3.dart:20:5: Context: Write to i@602
+  i = t1;
+    ^
+pkg/front_end/testcases/inference/infer_statics_transitively3.dart:21:5: Context: Write to i@602
+  i = t2;
+    ^
+pkg/front_end/testcases/inference/infer_statics_transitively3.dart:22:5: Context: Write to i@602
+  i = t3;
+    ^
+pkg/front_end/testcases/inference/infer_statics_transitively3.dart:23:5: Context: Write to i@602
+  i = t4;
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_throw.dart.direct.expect b/pkg/front_end/testcases/inference/infer_throw.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_throw.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_throw.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_throw.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_throw.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_throw.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_throw.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_throw_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
index ee619f7..fbd3aab 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
 //                                                                     ^
 
@@ -23,8 +23,8 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
   core::int z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
index 876c070..61b9117 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
@@ -16,8 +16,8 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
   core::int z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
index 54c5948..74cff0d 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
 //                                                                     ^
 
@@ -23,8 +23,8 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
   core::int z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
index 146b3b8..3bd82ef 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
@@ -16,8 +16,8 @@
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
   core::int z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_var.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_var.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
index 87bfaa8..14b8127 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 
@@ -11,8 +11,8 @@
 
 static method test1() → dynamic {
   core::int x = 3;
-  x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
index 76e056d..a1f848e 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
@@ -4,8 +4,8 @@
 
 static method test1() → dynamic {
   core::int x = 3;
-  x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.type_promotion.expect
new file mode 100644
index 0000000..f8cd812
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/infer_type_on_var.dart:10:5: Context: Write to x@278
+  x = /*error:INVALID_ASSIGNMENT*/ "hi";
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_var2.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_type_on_var2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_var2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_type_on_var2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
index 4bcb3e9..dfcda1a 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 
@@ -11,8 +11,8 @@
 
 static method test2() → dynamic {
   core::int x = 3;
-  x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
index 326869e..f7b38a9 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
@@ -4,8 +4,8 @@
 
 static method test2() → dynamic {
   core::int x = 3;
-  x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect
new file mode 100644
index 0000000..23f8fc0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:5: Context: Write to x@292
+  x = /*error:INVALID_ASSIGNMENT*/ "hi";
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
index 07ab628..da23c2d 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
@@ -1,17 +1,17 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     a = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                      ^
 //
-// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     b = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                      ^
 //
-// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     c = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                      ^
 
@@ -28,20 +28,20 @@
     ;
   method test1() → dynamic {
     core::int a = this.{self::A::x};
-    a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
     a = 3;
     core::int b = this.{self::A::y};
-    b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
     b = 4;
     core::int c = this.{self::A::z};
-    c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
     c = 4;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
index 1c23586..550faa1 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
@@ -11,20 +11,20 @@
     ;
   method test1() → dynamic {
     core::int a = this.{self::A::x};
-    a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
     a = 3;
     core::int b = this.{self::A::y};
-    b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
     b = 4;
     core::int c = this.{self::A::z};
-    c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                      ^" in "hi" as{TypeError} core::int;
     c = 4;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
new file mode 100644
index 0000000..e745ffe
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
@@ -0,0 +1,18 @@
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:7: Context: Write to a@341
+    a = /*error:INVALID_ASSIGNMENT*/ "hi";
+      ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:14:7: Context: Write to a@341
+    a = 3;
+      ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:7: Context: Write to b@441
+    b = /*error:INVALID_ASSIGNMENT*/ "hi";
+      ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:17:7: Context: Write to b@441
+    b = 4;
+      ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:7: Context: Write to c@541
+    c = /*error:INVALID_ASSIGNMENT*/ "hi";
+      ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:20:7: Context: Write to c@541
+    c = 4;
+      ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
index cdf82c5..552c53a 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
@@ -1,17 +1,17 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   a = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   b = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 //
-// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   c = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                    ^
 
@@ -24,20 +24,20 @@
 static final field core::int z = 42;
 static method test1() → dynamic {
   core::int a = self::x;
-  a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
   a = 3;
   core::int b = self::y;
-  b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
   b = 4;
   core::int c = self::z;
-  c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
   c = 4;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
index 36eda3f..129fcba 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
@@ -7,20 +7,20 @@
 static final field core::int z = 42;
 static method test1() → dynamic {
   core::int a = self::x;
-  a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
   a = 3;
   core::int b = self::y;
-  b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
   b = 4;
   core::int c = self::z;
-  c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                    ^" in "hi" as{TypeError} core::int;
   c = 4;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect
new file mode 100644
index 0000000..771ee3c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect
@@ -0,0 +1,18 @@
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:5: Context: Write to a@304
+  a = /*error:INVALID_ASSIGNMENT*/ "hi";
+    ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:13:5: Context: Write to a@304
+  a = 3;
+    ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:5: Context: Write to b@381
+  b = /*error:INVALID_ASSIGNMENT*/ "hi";
+    ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:16:5: Context: Write to b@381
+  b = 4;
+    ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:5: Context: Write to c@458
+  c = /*error:INVALID_ASSIGNMENT*/ "hi";
+    ^
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:19:5: Context: Write to c@458
+  c = 4;
+    ^
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
index 006b968..1d5ecf9 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
 //                                                                     ^
 
@@ -26,8 +26,8 @@
 }
 static method foo() → dynamic {
   core::int y = new self::C::•().{self::C::x};
-  core::String z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
                                                                     ^" in new self::C::•().{self::C::x} as{TypeError} core::String;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
index 16a77f1..39f4588 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
@@ -19,8 +19,8 @@
 }
 static method foo() → dynamic {
   core::int y = new self::C::•().{self::C::x};
-  core::String z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
                                                                     ^" in new self::C::•().{self::C::x} as{TypeError} core::String;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
index 8fd31d9..5e99efe 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
 //                                                                     ^
 
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.direct.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_typed_map_literal.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_typed_map_literal.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
index 1b089f4..86d529f 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
@@ -1,12 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
 //                                                                     ^
 
@@ -28,14 +28,14 @@
   get x() → core::int
     return 3;
   get w() → core::int
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
                                                              ^" in "hello" as{TypeError} core::int;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
   core::int z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
index 15ab94b..f668981 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
@@ -16,14 +16,14 @@
   get x() → core::int
     return 3;
   get w() → core::int
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   get /*@topType=int*/ w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
                                                              ^" in "hello" as{TypeError} core::int;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
                                                                     ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
   core::int z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
index 7e26f47..0fcc9ad 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
 //                                                                          ^
 
@@ -24,8 +24,8 @@
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
                                                                          ^" in new self::B::•<core::String>().{self::B::x} as{TypeError} core::int;
   core::String z = new self::B::•<core::String>().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
index 8e951e7..52feedf 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
@@ -17,8 +17,8 @@
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
                                                                          ^" in new self::B::•<core::String>().{self::B::x} as{TypeError} core::int;
   core::String z = new self::B::•<core::String>().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
index 102ec33..eeb1a65 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       . /*@target=B::m*/ m(null, null);
 //                          ^
 
@@ -36,8 +36,8 @@
   method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=B::m*/ m(null, null);
                          ^" in new self::B::•<dynamic>().{self::B::m}(null, null) as{TypeError} core::int;
   core::String z = new self::B::•<dynamic>().{self::B::m}(null, null);
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
index 2ca699b..3f8ac59 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
@@ -29,8 +29,8 @@
   method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=B::m*/ m(null, null);
                          ^" in new self::B::•<dynamic>().{self::B::m}(null, null) as{TypeError} core::int;
   core::String z = new self::B::•<dynamic>().{self::B::m}(null, null);
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
index 9c11d3e..e65ce67 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       . /*@target=A::value*/ value;
 //                              ^
 
@@ -31,8 +31,8 @@
   method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=A::value*/ value;
                              ^" in new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value} as{TypeError} core::int;
   core::String z = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
index 49312eb..d770c53 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
@@ -24,8 +24,8 @@
   method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=A::value*/ value;
                              ^" in new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value} as{TypeError} core::int;
   core::String z = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
index f4868a4..314ae7f 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       . /*@target=A::value*/ value;
 //                              ^
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
index 8751e0d..2583a3f 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:13:49: Error: The return type of the method 'B::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
-// Change to a subtype of dart.core::int.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:13:49: Error: The return type of the method 'B.x' is 'dynamic', which does not match the return type of the overridden method, 'int'.
+// Change to a subtype of 'int'.
 //   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
 //                                                 ^
 // pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:9:11: Context: This is the overridden method ('x').
@@ -10,8 +10,8 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:13:49: Error: The return type of the method 'B::x' is dynamic, which does not match the return type of the overridden method (dart.core::int).
-// Change to a subtype of dart.core::int.
+// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart:13:49: Error: The return type of the method 'B.x' is 'dynamic', which does not match the return type of the overridden method, 'int'.
+// Change to a subtype of 'int'.
 //   /*error:INVALID_METHOD_OVERRIDE*/ dynamic get x => 3;
 //                                                 ^
 
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
index 112fadb..2adcee0 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
@@ -1,26 +1,31 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       int x = /*error:INVALID_ASSIGNMENT*/ i;
 //                                            ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       int x = /*error:INVALID_ASSIGNMENT*/ i;
 //                                            ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //     String y = /*error:INVALID_ASSIGNMENT*/ x;
 //                                             ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
 // Try changing the type of the variable.
 //   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
 //               ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+//  - 'Iterable' is from 'dart:core'.
 //   for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
 //                                                                    ^
 
@@ -40,8 +45,8 @@
     ;
   method foo(generic-covariant-impl self::Bar::T t) → void {
     for (core::String i in t) {
-      core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+      core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int;
     }
@@ -53,8 +58,8 @@
     ;
   method foo(generic-covariant-impl self::Baz::S t) → void {
     for (self::Baz::T i in t) {
-      core::int x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+      core::int x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int;
       self::Baz::T y = i;
@@ -64,8 +69,9 @@
 static method test() → dynamic {
   core::List<self::Foo> list = <self::Foo>[];
   for (self::Foo x in list) {
-    core::String y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::String y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in x as{TypeError} core::String;
   }
@@ -73,7 +79,8 @@
     core::String y = x as{TypeError} core::String;
   }
   for (final self::Foo #t4 in list) {
-    core::String x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
 Try changing the type of the variable.
   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
               ^" in #t4 as{TypeError} core::String;
@@ -95,7 +102,10 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+  for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Map' is from 'dart:core'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+ - 'Iterable' is from 'dart:core'.
   for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                    ^" in map as{TypeError} core::Iterable<dynamic>) {
     core::String y = x as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
index 83284f9..b0fe058 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
@@ -14,8 +14,8 @@
     ;
   method foo(generic-covariant-impl self::Bar::T t) → void {
     for (core::String i in t) {
-      core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+      core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int;
     }
@@ -27,8 +27,8 @@
     ;
   method foo(generic-covariant-impl self::Baz::S t) → void {
     for (self::Baz::T i in t) {
-      core::int x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+      core::int x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int;
       self::Baz::T y = i;
@@ -38,8 +38,9 @@
 static method test() → dynamic {
   core::List<self::Foo> list = <self::Foo>[];
   for (self::Foo x in list) {
-    core::String y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::String y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in x as{TypeError} core::String;
   }
@@ -47,7 +48,8 @@
     core::String y = x as{TypeError} core::String;
   }
   for (final self::Foo #t4 in list) {
-    core::String x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:39:15: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
 Try changing the type of the variable.
   for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ list) {
               ^" in #t4 as{TypeError} core::String;
@@ -69,7 +71,10 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+  for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Map' is from 'dart:core'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
+ - 'Iterable' is from 'dart:core'.
   for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                    ^" in map as{TypeError} core::Iterable<dynamic>) {
     core::String y = x as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
deleted file mode 100644
index 0893769..0000000
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
+++ /dev/null
@@ -1,345 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class Foo extends core::Object {
-  field core::int bar = 42;
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
-    : super core::Object::•()
-    ;
-  method foo(self::Bar::T t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :saved_try_context_var1;
-    dynamic :exception0;
-    dynamic :stack_trace0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          {
-            dynamic :stream = t;
-            asy::_asyncStarListenHelper(:stream, :async_op);
-            asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-            const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-            try
-              #L2:
-              while (true) {
-                dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-                [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-                if(:result) {
-                  dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                  {
-                    core::int x = i;
-                  }
-                }
-                else
-                  break #L2;
-              }
-            finally
-              if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-                [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-                :result;
-              }
-          }
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-}
-class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
-  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
-    : super core::Object::•()
-    ;
-  method foo(self::Baz::S t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :saved_try_context_var1;
-    dynamic :exception0;
-    dynamic :stack_trace0;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L3:
-        {
-          {
-            dynamic :stream = t;
-            asy::_asyncStarListenHelper(:stream, :async_op);
-            asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-            const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-            try
-              #L4:
-              while (true) {
-                dynamic #t4 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-                [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-                if(:result) {
-                  dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                  {
-                    core::int x = i;
-                    self::Baz::T y = i;
-                  }
-                }
-                else
-                  break #L4;
-              }
-            finally
-              if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-                [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-                :result;
-              }
-          }
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-}
-abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
-  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
-    return null;
-}
-static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  dynamic :exception0;
-  dynamic :stack_trace0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L5:
-      {
-        dynamic myStream = self::MyStream::•<self::Foo>();
-        {
-          dynamic :stream = myStream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L6:
-            while (true) {
-              dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic x = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  core::String y = x;
-                }
-              }
-              else
-                break #L6;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t9 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        {
-          dynamic :stream = myStream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L7:
-            while (true) {
-              dynamic #t10 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t11 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic x = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  core::String y = x;
-                }
-              }
-              else
-                break #L7;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t12 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        {
-          dynamic :stream = myStream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::String> :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L8:
-            while (true) {
-              dynamic #t13 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t14 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                core::String x = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  core::String y = x;
-                }
-              }
-              else
-                break #L8;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t15 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        dynamic z;
-        {
-          dynamic :stream = myStream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L9:
-            while (true) {
-              dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final dynamic #t18 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  z = #t18;
-                  core::String y = z;
-                }
-              }
-              else
-                break #L9;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t19 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        asy::Stream<dynamic> stream = myStream;
-        {
-          dynamic :stream = stream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L10:
-            while (true) {
-              dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                self::Foo x = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  dynamic y = x;
-                }
-              }
-              else
-                break #L10;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t22 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        dynamic stream2 = myStream;
-        {
-          dynamic :stream = stream2;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L11:
-            while (true) {
-              dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                self::Foo x = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  dynamic y = x;
-                }
-              }
-              else
-                break #L11;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t25 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        dynamic map = <core::String, self::Foo>{};
-        {
-          dynamic :stream = map;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L12:
-            while (true) {
-              dynamic #t26 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t27 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic x = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  core::String y = x;
-                }
-              }
-              else
-                break #L12;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t28 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect
new file mode 100644
index 0000000..22b3803
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect
@@ -0,0 +1,345 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class Foo extends core::Object {
+  field core::int bar = 42;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T>
+    : super core::Object::•()
+    ;
+  method foo(self::Bar::T t) → dynamic /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :saved_try_context_var1;
+    dynamic :exception0;
+    dynamic :stack_trace0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          {
+            dynamic :stream = t;
+            asy::_asyncStarListenHelper(:stream, :async_op);
+            asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+            const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+            try
+              #L2:
+              while (true) {
+                dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+                [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+                if(:result) {
+                  dynamic i = :for-iterator.{asy::_StreamIterator::current};
+                  {
+                    core::int x = i;
+                  }
+                }
+                else
+                  break #L2;
+              }
+            finally
+              if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+                [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+                :result;
+              }
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+}
+class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
+    : super core::Object::•()
+    ;
+  method foo(self::Baz::S t) → dynamic /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :saved_try_context_var1;
+    dynamic :exception0;
+    dynamic :stack_trace0;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L3:
+        {
+          {
+            dynamic :stream = t;
+            asy::_asyncStarListenHelper(:stream, :async_op);
+            asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+            const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+            try
+              #L4:
+              while (true) {
+                dynamic #t4 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+                [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+                if(:result) {
+                  dynamic i = :for-iterator.{asy::_StreamIterator::current};
+                  {
+                    core::int x = i;
+                    self::Baz::T y = i;
+                  }
+                }
+                else
+                  break #L4;
+              }
+            finally
+              if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+                [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+                :result;
+              }
+          }
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+}
+abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
+  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
+    return null;
+}
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L5:
+      {
+        dynamic myStream = self::MyStream::•<self::Foo>();
+        {
+          dynamic :stream = myStream;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L6:
+            while (true) {
+              dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  core::String y = x;
+                }
+              }
+              else
+                break #L6;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t9 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        {
+          dynamic :stream = myStream;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L7:
+            while (true) {
+              dynamic #t10 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t11 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  core::String y = x;
+                }
+              }
+              else
+                break #L7;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t12 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        {
+          dynamic :stream = myStream;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::String> :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L8:
+            while (true) {
+              dynamic #t13 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t14 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::String x = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  core::String y = x;
+                }
+              }
+              else
+                break #L8;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t15 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        dynamic z;
+        {
+          dynamic :stream = myStream;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L9:
+            while (true) {
+              dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t18 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  z = #t18;
+                  core::String y = z;
+                }
+              }
+              else
+                break #L9;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t19 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        asy::Stream<dynamic> stream = myStream;
+        {
+          dynamic :stream = stream;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L10:
+            while (true) {
+              dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                self::Foo x = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  dynamic y = x;
+                }
+              }
+              else
+                break #L10;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t22 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        dynamic stream2 = myStream;
+        {
+          dynamic :stream = stream2;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L11:
+            while (true) {
+              dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                self::Foo x = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  dynamic y = x;
+                }
+              }
+              else
+                break #L11;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t25 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        dynamic map = <core::String, self::Foo>{};
+        {
+          dynamic :stream = map;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L12:
+            while (true) {
+              dynamic #t26 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t27 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  core::String y = x;
+                }
+              }
+              else
+                break #L12;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t28 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index 6da61a8c..2a2bfbc 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
@@ -1,26 +1,31 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       int x = /*error:INVALID_ASSIGNMENT*/ i;
 //                                            ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       int x = /*error:INVALID_ASSIGNMENT*/ i;
 //                                            ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //     String y = /*error:INVALID_ASSIGNMENT*/ x;
 //                                             ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
 // Try changing the type of the variable.
 //   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
 //                     ^
 //
-// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+//  - 'Stream' is from 'dart:async'.
 //   await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
 //                                                                          ^
 
@@ -41,8 +46,8 @@
     ;
   method foo(generic-covariant-impl self::Bar::T t) → dynamic async {
     await for (core::String i in t) {
-      core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+      core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int;
     }
@@ -54,8 +59,8 @@
     ;
   method foo(generic-covariant-impl self::Baz::S t) → dynamic async {
     await for (self::Baz::T i in t) {
-      core::int x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+      core::int x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int;
       self::Baz::T y = i;
@@ -69,8 +74,9 @@
 static method test() → dynamic async {
   self::MyStream<self::Foo> myStream = self::MyStream::•<self::Foo>();
   await for (self::Foo x in myStream) {
-    core::String y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+    core::String y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in x as{TypeError} core::String;
   }
@@ -78,7 +84,8 @@
     core::String y = x as{TypeError} core::String;
   }
   await for (final self::Foo #t4 in myStream) {
-    core::String x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+    core::String x = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
 Try changing the type of the variable.
   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
                     ^" in #t4 as{TypeError} core::String;
@@ -100,7 +107,10 @@
     self::Foo y = x;
   }
   core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  await for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+  await for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Map' is from 'dart:core'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+ - 'Stream' is from 'dart:async'.
   await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                          ^" in map as{TypeError} asy::Stream<dynamic>) {
     core::String y = x as{TypeError} core::String;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index 9fb1a36..d01610c 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Bar::T t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -42,8 +42,8 @@
                 if(:result) {
                   core::String i = :for-iterator.{asy::_StreamIterator::current};
                   {
-                    core::int x = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+                    core::int x = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int;
                   }
@@ -67,7 +67,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
 }
@@ -76,7 +76,7 @@
     : super core::Object::•()
     ;
   method foo(generic-covariant-impl self::Baz::S t) → dynamic /* originally async */ {
-    final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
     asy::FutureOr<dynamic> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -104,8 +104,8 @@
                 if(:result) {
                   self::Baz::T i = :for-iterator.{asy::_StreamIterator::current};
                   {
-                    core::int x = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'test::Baz::T' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+                    core::int x = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
                                            ^" in i as{TypeError} core::int;
                     self::Baz::T y = i;
@@ -130,7 +130,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
 }
@@ -139,7 +139,7 @@
     return null;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -168,8 +168,9 @@
               if(:result) {
                 self::Foo x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+                  core::String y = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
                                             ^" in x as{TypeError} core::String;
                 }
@@ -221,7 +222,8 @@
               if(:result) {
                 final self::Foo #t18 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String x = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'test::Foo' can't be assigned to a variable of type 'dart.core::String'.
+                  core::String x = let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
 Try changing the type of the variable.
   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
                     ^" in #t18 as{TypeError} core::String;
@@ -320,7 +322,10 @@
         }
         core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
         {
-          dynamic :stream = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'dart.core::Map<dart.core::String, test::Foo>' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+          dynamic :stream = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Map' is from 'dart:core'.
+ - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
+ - 'Stream' is from 'dart:async'.
   await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                          ^" in map as{TypeError} asy::Stream<dynamic>;
           asy::_asyncStarListenHelper(:stream, :async_op);
@@ -356,7 +361,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.direct.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect
new file mode 100644
index 0000000..ab77237
--- /dev/null
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart:9:61: Context: Write to i@296
+  for (var /*@type=int*/ i = 0; i /*@target=num::<*/ < 10; i++) {
+                                                            ^^
diff --git a/pkg/front_end/testcases/inference/infer_use_of_void_local.dart.direct.expect b/pkg/front_end/testcases/inference/infer_use_of_void_local.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_use_of_void_local.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_use_of_void_local.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_use_of_void_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_use_of_void_local.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_use_of_void_local.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_use_of_void_local.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/infer_variable_void.dart.direct.expect b/pkg/front_end/testcases/inference/infer_variable_void.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_variable_void.dart.direct.expect
rename to pkg/front_end/testcases/inference/infer_variable_void.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/infer_variable_void.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_variable_void.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/infer_variable_void.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/infer_variable_void.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
index 490375b..3918cc1 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ "1"]);
 //                                              ^
 
@@ -11,8 +11,8 @@
 
 class Foo extends core::Object {
   field core::int x = 1;
-  constructor •([core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  constructor •([core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
                                              ^" in "1" as{TypeError} core::int]) → self::Foo
     : self::Foo::x = x, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
index 8e2e655..a634ff2 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
@@ -4,8 +4,8 @@
 
 class Foo extends core::Object {
   field core::int x = 1;
-  constructor •([core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  constructor •([core::int x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
                                              ^" in "1" as{TypeError} core::int]) → self::Foo
     : self::Foo::x = x, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_cascade.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_is_enum.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.direct.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.expect
rename to pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instance_creation_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_tearoff.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.type_promotion.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.type_promotion.expect
new file mode 100644
index 0000000..b81ec02
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.type_promotion.expect
@@ -0,0 +1,15 @@
+pkg/front_end/testcases/inference/instantiate_tearoff.dart:18:10: Context: Write to func@399
+    func = super. /*@target=C::f*/ f;
+         ^
+pkg/front_end/testcases/inference/instantiate_tearoff.dart:25:8: Context: Write to func@504
+  func = f;
+       ^
+pkg/front_end/testcases/inference/instantiate_tearoff.dart:26:8: Context: Write to func@504
+  func = new C(). /*@target=C::f*/ f;
+       ^
+pkg/front_end/testcases/inference/instantiate_tearoff.dart:27:8: Context: Write to func@504
+  func = C.g;
+       ^
+pkg/front_end/testcases/inference/instantiate_tearoff.dart:28:8: Context: Write to func@504
+  func = h;
+       ^
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
index c944bdb..4c1044d 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
@@ -1,9 +1,19 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:10:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
+//   func = f.call;
+//            ^
+
 library test;
 import self as self;
 import "dart:core" as core;
 
-static method test(<T extends core::Object>(T) → T f) → void {
+static method test(<T extends core::Object = dynamic>(T) → T f) → void {
   (core::int) → core::int func;
-  func = f.call<core::int>;
+  func = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:10:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
+  func = f.call;
+           ^" in f.call as{TypeError} (core::int) → core::int;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.type_promotion.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.type_promotion.expect
new file mode 100644
index 0000000..b654339
--- /dev/null
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:10:8: Context: Write to func@314
+  func = f.call;
+       ^
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect
deleted file mode 100644
index d772694..0000000
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-}
-static field self::A<dynamic> v = null;
-static method main() → dynamic {
-  self::v;
-}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect
deleted file mode 100644
index d772694..0000000
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.direct.transformed.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-}
-static field self::A<dynamic> v = null;
-static method main() → dynamic {
-  self::v;
-}
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.expect
copy to pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.direct.transformed.expect
copy to pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/int_upwards_local.dart.direct.expect b/pkg/front_end/testcases/inference/int_upwards_local.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/int_upwards_local.dart.direct.expect
rename to pkg/front_end/testcases/inference/int_upwards_local.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/int_upwards_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/int_upwards_local.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/int_upwards_local.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/int_upwards_local.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.direct.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.direct.expect
rename to pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect
new file mode 100644
index 0000000..10fcaec
--- /dev/null
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart:19:10: Context: Write to list@521
+    list = <String>[];
+         ^
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/lambda_return_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/lambda_return_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/lambda_void_context.dart.direct.expect b/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/lambda_void_context.dart.direct.expect
rename to pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/lambda_void_context.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/lambda_void_context.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart.direct.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/list_literal_typed.dart.direct.expect
rename to pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/list_literal_typed.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.direct.expect b/pkg/front_end/testcases/inference/list_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/list_literals.dart.direct.expect
rename to pkg/front_end/testcases/inference/list_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/list_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/list_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/list_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
index a8da79f..a6e5a15 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
@@ -1,17 +1,17 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
 //                                                                       ^
 //
-// pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
 //                                                                       ^
 //
-// pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
+// pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+// Try changing the type of the parameter, or casting the argument to 'num'.
 //   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
 //                                                                       ^
 
@@ -21,12 +21,12 @@
 
 static method test1() → dynamic {
   core::List<core::int> x = <core::int>[1, 2, 3];
-  x.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  x.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in "hi" as{TypeError} core::int);
-  x.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  x.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                       ^" in 4.0 as{TypeError} core::int);
   x.{core::List::add}(4);
@@ -34,8 +34,8 @@
 }
 static method test2() → dynamic {
   core::List<core::num> x = <core::num>[1, 2.0, 3];
-  x.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
+  x.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+Try changing the type of the parameter, or casting the argument to 'num'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in "hi" as{TypeError} core::num);
   x.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
index e30fbb0..b8c82a7 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
@@ -4,12 +4,12 @@
 
 static method test1() → dynamic {
   core::List<core::int> x = <core::int>[1, 2, 3];
-  x.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  x.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in "hi" as{TypeError} core::int);
-  x.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  x.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                       ^" in 4.0 as{TypeError} core::int);
   x.{core::List::add}(4);
@@ -17,8 +17,8 @@
 }
 static method test2() → dynamic {
   core::List<core::num> x = <core::num>[1, 2.0, 3];
-  x.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
+  x.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+Try changing the type of the parameter, or casting the argument to 'num'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                       ^" in "hi" as{TypeError} core::num);
   x.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.direct.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.direct.expect
rename to pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.direct.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/list_literals_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/list_literals_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
index 270ead7..e251619 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
@@ -1,17 +1,17 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
 //                                                                        ^
 //
-// pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// Try changing the type of the parameter, or casting the argument to 'int'.
 //   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
 //                                                                        ^
 //
-// pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
-// Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
+// pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+// Try changing the type of the parameter, or casting the argument to 'num'.
 //   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
 //                                                                        ^
 
@@ -22,20 +22,20 @@
 static field core::List<core::int> x1 = <core::int>[1, 2, 3];
 static field core::List<core::num> x2 = <core::num>[1, 2.0, 3];
 static method test1() → dynamic {
-  self::x1.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::x1.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in "hi" as{TypeError} core::int);
-  self::x1.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::x1.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                        ^" in 4.0 as{TypeError} core::int);
   self::x1.{core::List::add}(4);
   core::List<core::num> y = self::x1;
 }
 static method test2() → dynamic {
-  self::x2.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
+  self::x2.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+Try changing the type of the parameter, or casting the argument to 'num'.
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in "hi" as{TypeError} core::num);
   self::x2.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
index c6f9e28..1079583 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
@@ -5,20 +5,20 @@
 static field core::List<core::int> x1 = <core::int>[1, 2, 3];
 static field core::List<core::num> x2 = <core::num>[1, 2.0, 3];
 static method test1() → dynamic {
-  self::x1.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::x1.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in "hi" as{TypeError} core::int);
-  self::x1.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'dart.core::int'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::int'.
+  self::x1.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+Try changing the type of the parameter, or casting the argument to 'int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
                                                                        ^" in 4.0 as{TypeError} core::int);
   self::x1.{core::List::add}(4);
   core::List<core::num> y = self::x1;
 }
 static method test2() → dynamic {
-  self::x2.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'dart.core::String' can't be assigned to the parameter type 'dart.core::num'.
-Try changing the type of the parameter, or casting the argument to 'dart.core::num'.
+  self::x2.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
+Try changing the type of the parameter, or casting the argument to 'num'.
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
                                                                        ^" in "hi" as{TypeError} core::num);
   self::x2.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.expect
rename to pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.direct.expect b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/local_reference_upwards_local.dart.direct.expect
rename to pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/local_reference_upwards_local.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
deleted file mode 100644
index 0460a17..0000000
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
+++ /dev/null
@@ -1,136 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-typedef IntToInt = (core::int) → core::int;
-static method main() → dynamic {
-  function a() → (core::int) → core::int {
-    return (dynamic x) → dynamic => x;
-  }
-  function b() → asy::Future<(core::int) → core::int> /* originally async */ {
-    final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
-    asy::FutureOr<(core::int) → core::int> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          :return_value = (dynamic x) → dynamic => x;
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-  function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
-      {
-        {
-          :iterator.{core::_SyncIterator::_current} = (dynamic x) → dynamic => x;
-          [yield] true;
-        }
-      }
-      return false;
-    }
-    return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
-  }
-  function d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
-      {
-        {
-          :iterator.{core::_SyncIterator::_yieldEachIterable} = <dynamic>[(dynamic x) → dynamic => x];
-          [yield] true;
-        }
-      }
-      return false;
-    }
-    return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
-  }
-  function e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-    asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
-    dynamic :controller_stream;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :saved_try_context_var1;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try
-        try {
-          #L2:
-          {
-            if(:controller.{asy::_AsyncStarStreamController::add}((dynamic x) → dynamic => x))
-              return null;
-            else
-              [yield] null;
-          }
-          return;
-        }
-        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-          :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-        }
-      finally {
-        :controller.{asy::_AsyncStarStreamController::close}();
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
-    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-    return :controller_stream;
-  }
-  function f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-    asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
-    dynamic :controller_stream;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    dynamic :saved_try_context_var0;
-    dynamic :saved_try_context_var1;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try
-        try {
-          #L3:
-          {
-            if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<dynamic>(<dynamic>[(dynamic x) → dynamic => x])))
-              return null;
-            else
-              [yield] null;
-          }
-          return;
-        }
-        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-          :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-        }
-      finally {
-        :controller.{asy::_AsyncStarStreamController::close}();
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
-    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-    return :controller_stream;
-  }
-}
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.expect
rename to pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a138755
--- /dev/null
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.transformed.expect
@@ -0,0 +1,136 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+typedef IntToInt = (core::int) → core::int;
+static method main() → dynamic {
+  function a() → (core::int) → core::int {
+    return (dynamic x) → dynamic => x;
+  }
+  function b() → asy::Future<(core::int) → core::int> /* originally async */ {
+    final asy::_AsyncAwaitCompleter<(core::int) → core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int) → core::int>();
+    asy::FutureOr<(core::int) → core::int> :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          :return_value = (dynamic x) → dynamic => x;
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+  function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+      {
+        {
+          :iterator.{core::_SyncIterator::_current} = (dynamic x) → dynamic => x;
+          [yield] true;
+        }
+      }
+      return false;
+    }
+    return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+  }
+  function d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+      {
+        {
+          :iterator.{core::_SyncIterator::_yieldEachIterable} = <dynamic>[(dynamic x) → dynamic => x];
+          [yield] true;
+        }
+      }
+      return false;
+    }
+    return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+  }
+  function e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
+    asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+    dynamic :controller_stream;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :saved_try_context_var1;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try
+        try {
+          #L2:
+          {
+            if(:controller.{asy::_AsyncStarStreamController::add}((dynamic x) → dynamic => x))
+              return null;
+            else
+              [yield] null;
+          }
+          return;
+        }
+        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+          :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+        }
+      finally {
+        :controller.{asy::_AsyncStarStreamController::close}();
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+    return :controller_stream;
+  }
+  function f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
+    asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+    dynamic :controller_stream;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    dynamic :saved_try_context_var0;
+    dynamic :saved_try_context_var1;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try
+        try {
+          #L3:
+          {
+            if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<dynamic>(<dynamic>[(dynamic x) → dynamic => x])))
+              return null;
+            else
+              [yield] null;
+          }
+          return;
+        }
+        on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+          :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+        }
+      finally {
+        :controller.{asy::_AsyncStarStreamController::close}();
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+    :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+    return :controller_stream;
+  }
+}
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
index 01ba56b..056c9cb 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
@@ -1,7 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) → dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) → dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) → dart.core::int>'.
+// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+//  - 'FutureOr' is from 'dart:async'.
+// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
 //     return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
 //                                    ^
 
@@ -16,8 +17,9 @@
     return (core::int x) → core::int => x;
   }
   function b() → asy::Future<(core::int) → core::int> async {
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
     return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
                                    ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int) → core::int>;
   }
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
index f6fc957..bba0bec 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
     return (core::int x) → core::int => x;
   }
   function b() → asy::Future<(core::int) → core::int> /* originally async */ {
-    final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
+    final asy::_AsyncAwaitCompleter<(core::int) → core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int) → core::int>();
     asy::FutureOr<(core::int) → core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -20,8 +20,9 @@
       try {
         #L1:
         {
-          :return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
+          :return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
     return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
                                    ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int) → core::int>;
           break #L1;
@@ -35,7 +36,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
   function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.expect
deleted file mode 100644
index 9740119..0000000
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method f(core::Object o) → void {
-    if(o is self::A || o is self::B) {
-      if(o is self::A) {
-        this.{self::C::a} = o{self::A};
-      }
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.transformed.expect
deleted file mode 100644
index 9740119..0000000
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.direct.transformed.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method f(core::Object o) → void {
-    if(o is self::A || o is self::B) {
-      if(o is self::A) {
-        this.{self::C::a} = o{self::A};
-      }
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.expect
new file mode 100644
index 0000000..8ab3b1c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field self::A a = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method f(core::Object o) → void {
+    if(o is self::A || o is self::B) {
+      if(o is self::A) {
+        this.{self::C::a} = o;
+      }
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8ab3b1c
--- /dev/null
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.transformed.expect
@@ -0,0 +1,28 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field self::A a = null;
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method f(core::Object o) → void {
+    if(o is self::A || o is self::B) {
+      if(o is self::A) {
+        this.{self::C::a} = o;
+      }
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.type_promotion.expect
new file mode 100644
index 0000000..88430c6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/inference/logical_or_promotion.dart:16:11: Context: Possible promotion of o@338
+    if (o is A || o is B) {
+          ^^
+pkg/front_end/testcases/inference/logical_or_promotion.dart:16:21: Context: Possible promotion of o@338
+    if (o is A || o is B) {
+                    ^^
+pkg/front_end/testcases/inference/logical_or_promotion.dart:17:13: Context: Possible promotion of o@338
+      if (o is A) {
+            ^^
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.direct.expect b/pkg/front_end/testcases/inference/map_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/map_literals.dart.direct.expect
rename to pkg/front_end/testcases/inference/map_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/map_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/map_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/map_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
index 9fa1326..bed99dc 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
@@ -1,27 +1,28 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                             ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+// Try changing the type of the left hand side, or casting the right hand side to 'num'.
 //       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
+// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+//  - 'Pattern' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
 //   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                             ^
 
@@ -32,16 +33,16 @@
 static method test1() → dynamic {
   core::Map<core::int, core::String> x = <core::int, core::String>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in "hi" as{TypeError} core::int, "w");
-  x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                              ^" in 4.0 as{TypeError} core::int, "u");
-  x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in 42 as{TypeError} core::String);
   core::Map<core::num, core::String> y = x;
@@ -49,13 +50,14 @@
 static method test2() → dynamic {
   core::Map<core::num, core::Pattern> x = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+  x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in "hi" as{TypeError} core::num, "w");
   x.{core::Map::[]=}(4.0, "u");
-  x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
+  x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+ - 'Pattern' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in 42 as{TypeError} core::Pattern);
   core::Pattern p = null;
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
index bdf50a5..8ecf212 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
@@ -5,16 +5,16 @@
 static method test1() → dynamic {
   core::Map<core::int, core::String> x = <core::int, core::String>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in "hi" as{TypeError} core::int, "w");
-  x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                              ^" in 4.0 as{TypeError} core::int, "u");
-  x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in 42 as{TypeError} core::String);
   core::Map<core::num, core::String> y = x;
@@ -22,13 +22,14 @@
 static method test2() → dynamic {
   core::Map<core::num, core::Pattern> x = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
-  x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+  x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                              ^" in "hi" as{TypeError} core::num, "w");
   x.{core::Map::[]=}(4.0, "u");
-  x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
+  x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+ - 'Pattern' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                             ^" in 42 as{TypeError} core::Pattern);
   core::Pattern p = null;
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.direct.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.direct.expect
rename to pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.direct.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/map_literals_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/map_literals_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
index a1067c9..ee5e9fd 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
@@ -1,27 +1,28 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+// Try changing the type of the left hand side, or casting the right hand side to 'num'.
 //   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
 //                                                                   ^
 //
-// pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
+// pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+//  - 'Pattern' is from 'dart:core'.
+// Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
 //   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
 //                                                              ^
 
@@ -33,29 +34,30 @@
 static field core::Map<core::num, core::Pattern> x2 = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::int, "w");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                                                   ^" in 4.0 as{TypeError} core::int, "u");
-  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::String);
   core::Map<core::num, core::String> y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+Try changing the type of the left hand side, or casting the right hand side to 'num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::num, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
+  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+ - 'Pattern' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::Pattern);
   core::Pattern p = null;
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
index a53ccf0..ffd8868 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
@@ -6,29 +6,30 @@
 static field core::Map<core::num, core::Pattern> x2 = <core::num, core::Pattern>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
 static method test1() → dynamic {
   self::x1.{core::Map::[]=}(3, "z");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:14:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::int, "w");
-  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:15:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
                                                                   ^" in 4.0 as{TypeError} core::int, "u");
-  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:16:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::String);
   core::Map<core::num, core::String> y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
-  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::num'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::num'.
+  self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:27:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
+Try changing the type of the left hand side, or casting the right hand side to 'num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
                                                                   ^" in "hi" as{TypeError} core::num, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
-  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::Pattern'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::Pattern'.
+  self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:29:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
+ - 'Pattern' is from 'dart:core'.
+Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
                                                              ^" in 42 as{TypeError} core::Pattern);
   core::Pattern p = null;
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.expect
rename to pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.expect
rename to pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.expect
rename to pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.expect
rename to pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect
deleted file mode 100644
index 13a4a95..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
-    ;
-}
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
-  synthetic constructor •() → self::_A&M1&M0
-    : super self::M1::•()
-    ;
-}
-class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
-    : super self::M1::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect
deleted file mode 100644
index cdf8dcc..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.direct.transformed.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
-    ;
-}
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-abstract class _A&M1&M0 extends self::M1 implements self::M0<dynamic, dynamic> {
-  synthetic constructor •() → self::_A&M1&M0
-    : super self::M1::•()
-    ;
-}
-class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
-    : super self::M1::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.expect
new file mode 100644
index 0000000..68141d0
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.expect
@@ -0,0 +1,54 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int> {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
+  synthetic constructor •() → self::_A&M1&M0
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d53ce70
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int> {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+abstract class _A&M1&M0 extends self::M1 implements self::M0<dynamic, dynamic> {
+  synthetic constructor •() → self::_A&M1&M0
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
index a95d76f..47cf040 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
@@ -1,10 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart'.
 // class A extends M1 with M0 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart'.
 // class A extends M1 with M0 {}
 //       ^
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
index 1faa3db..bfb7b01 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
@@ -24,7 +24,7 @@
 }
 class A extends self::_A&M1&M0 {
   synthetic constructor •() → self::A
-    : super self::M1::•()
+    : super self::_A&M1&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
index 7a5e6b5..dfd7d1e 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 }
 class A extends self::_A&M1&M0 {
   synthetic constructor •() → self::A
-    : super self::M1::•()
+    : super self::_A&M1&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect
deleted file mode 100644
index 7782a14..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
-    ;
-}
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
-  synthetic constructor •() → self::_A&M1&M0
-    : super self::M1::•()
-    ;
-}
-class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
-    : super self::M1::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect
deleted file mode 100644
index ad97954..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.direct.transformed.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
-    ;
-}
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-abstract class _A&M1&M0 extends self::M1 implements self::M0<dynamic, dynamic> {
-  synthetic constructor •() → self::_A&M1&M0
-    : super self::M1::•()
-    ;
-}
-class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
-    : super self::M1::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.expect
new file mode 100644
index 0000000..b7e2c17
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.expect
@@ -0,0 +1,54 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int> {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
+  synthetic constructor •() → self::_A&M1&M0
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..353900f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<X extends core::Object = dynamic, Y extends self::M0::X = dynamic> extends self::I<self::M0::X> {
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int> {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+abstract class _A&M1&M0 extends self::M1 implements self::M0<dynamic, dynamic> {
+  synthetic constructor •() → self::_A&M1&M0
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
index d1aa843..490e127f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
@@ -1,10 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart'.
 // class A extends M1 with M0 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart'.
 // class A extends M1 with M0 {}
 //       ^
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
index 69818ca..db552ee 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
@@ -24,7 +24,7 @@
 }
 class A extends self::_A&M1&M0 {
   synthetic constructor •() → self::A
-    : super self::M1::•()
+    : super self::_A&M1&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
index 8e64db9..6459244 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 }
 class A extends self::_A&M1&M0 {
   synthetic constructor •() → self::A
-    : super self::M1::•()
+    : super self::_A&M1&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect
deleted file mode 100644
index d623d11..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
-    ;
-}
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
-  synthetic constructor •() → self::_A&M1&M0
-    : super self::M1::•()
-    ;
-}
-class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
-    : super self::M1::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect
deleted file mode 100644
index 8b9b41a..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.direct.transformed.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M1 with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
-    ;
-}
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-abstract class _A&M1&M0 extends self::M1 implements self::M0<dynamic, dynamic> {
-  synthetic constructor •() → self::_A&M1&M0
-    : super self::M1::•()
-    ;
-}
-class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
-    : super self::M1::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.expect
new file mode 100644
index 0000000..751f33d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.expect
@@ -0,0 +1,54 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int> {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+abstract class _A&M1&M0 = self::M1 with self::M0<dynamic, dynamic> {
+  synthetic constructor •() → self::_A&M1&M0
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e98e8f6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart'.
+// class A extends M1 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart'.
+// class A extends M1 with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+    : super self::I::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int> {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+abstract class _A&M1&M0 extends self::M1 implements self::M0<dynamic, dynamic> {
+  synthetic constructor •() → self::_A&M1&M0
+    : super self::M1::•()
+    ;
+}
+class A extends self::_A&M1&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M1&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
index c4772fe9..9ec413d 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
@@ -1,10 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'M1 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart'.
 // class A extends M1 with M0 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart'.
 // class A extends M1 with M0 {}
 //       ^
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
index 9f72d38..7d0cb03 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
@@ -1,16 +1,18 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'dart.core::Comparable<dynamic>' violates the corresponding type variable bound of 'M0' in the supertype 'M0' of class 'M1 with M0'.
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+//  - 'Comparable' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class A extends M1 with M0 {}
 //       ^
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: Bound of this variable is violated.
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:7:13: Context: This is the type variable whose bound isn't conformed to.
 // class M0<X, Y extends Comparable<Y>> extends I<X> {}
 //             ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'dart.core::Comparable<dynamic>' violates the corresponding type variable bound of 'M0' in the supertype 'M0' of class 'M1 with M0'.
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+//  - 'Comparable' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class A extends M1 with M0 {}
 //       ^
@@ -41,7 +43,7 @@
 }
 class A extends self::_A&M1&M0 {
   synthetic constructor •() → self::A
-    : super self::M1::•()
+    : super self::_A&M1&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
index 0016e86d..fe9fd8d 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'dart.core::Comparable<dynamic>' violates the corresponding type variable bound of 'M0' in the supertype 'M0' of class 'M1 with M0'.
+// pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart:13:7: Error: Type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<Y>' of the type variable 'Y' on 'M0' in the supertype 'M0' of class 'M1 with M0'.
+//  - 'Comparable' is from 'dart:core'.
 // Try changing type arguments so that they conform to the bounds.
 // class A extends M1 with M0 {}
 //       ^
@@ -31,7 +32,7 @@
 }
 class A extends self::_A&M1&M0 {
   synthetic constructor •() → self::A
-    : super self::M1::•()
+    : super self::_A&M1&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect
deleted file mode 100644
index c20c7df..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::J<self::J::X>
-    : super core::Object::•()
-    ;
-}
-abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> = self::I<self::_M0&I&J::X> with self::J<self::_M0&I&J::Y> {
-  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
-    : super self::I::•()
-    ;
-}
-class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
-    ;
-}
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → self::M2
-    : super self::M1::•()
-    ;
-}
-abstract class _A&M2&M0 = self::M2 with self::M0<dynamic, dynamic> {
-  synthetic constructor •() → self::_A&M2&M0
-    : super self::M2::•()
-    ;
-}
-class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
-    : super self::M2::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect
deleted file mode 100644
index 75ca4bd..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.direct.transformed.expect
+++ /dev/null
@@ -1,63 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
-// class A extends M2 with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::J<self::J::X>
-    : super core::Object::•()
-    ;
-}
-abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::I<self::_M0&I&J::X> implements self::J<self::_M0&I&J::Y> {
-  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
-    : super self::I::•()
-    ;
-}
-class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
-    ;
-}
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → self::M2
-    : super self::M1::•()
-    ;
-}
-abstract class _A&M2&M0 extends self::M2 implements self::M0<dynamic, dynamic> {
-  synthetic constructor •() → self::_A&M2&M0
-    : super self::M2::•()
-    ;
-}
-class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
-    : super self::M2::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.expect
new file mode 100644
index 0000000..1066a51
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.expect
@@ -0,0 +1,89 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both 'J<double>' and 'J<dynamic>'
+//  - 'J' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both 'J<double>' and 'J<dynamic>'
+//  - 'J' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both 'J<double>' and 'J<dynamic>'
+//  - 'J' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both 'J<double>' and 'J<dynamic>'
+//  - 'J' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class J<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::X>
+    : super core::Object::•()
+    ;
+}
+abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> = self::I<self::_M0&I&J::X> with self::J<self::_M0&I&J::Y> {
+  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
+    : super self::I::•()
+    ;
+}
+class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+    : super self::_M0&I&J::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int> {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+class M2 extends self::M1 implements self::J<core::double> {
+  synthetic constructor •() → self::M2
+    : super self::M1::•()
+    ;
+}
+abstract class _A&M2&M0 = self::M2 with self::M0<dynamic, dynamic> {
+  synthetic constructor •() → self::_A&M2&M0
+    : super self::M2::•()
+    ;
+}
+class A extends self::_A&M2&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M2&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ed90883
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.transformed.expect
@@ -0,0 +1,67 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both 'J<double>' and 'J<dynamic>'
+//  - 'J' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both 'J<double>' and 'J<dynamic>'
+//  - 'J' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
+// class A extends M2 with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class J<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::X>
+    : super core::Object::•()
+    ;
+}
+abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::I<self::_M0&I&J::X> implements self::J<self::_M0&I&J::Y> {
+  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
+    : super self::I::•()
+    ;
+}
+class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
+  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+    : super self::_M0&I&J::•()
+    ;
+}
+class M1 extends core::Object implements self::I<core::int> {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+class M2 extends self::M1 implements self::J<core::double> {
+  synthetic constructor •() → self::M2
+    : super self::M1::•()
+    ;
+}
+abstract class _A&M2&M0 extends self::M2 implements self::M0<dynamic, dynamic> {
+  synthetic constructor •() → self::_A&M2&M0
+    : super self::M2::•()
+    ;
+}
+class A extends self::_A&M2&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M2&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
index d73dd41..d265daa 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
@@ -1,18 +1,22 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
 // class A extends M2 with M0 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'M2 with M0' can't implement both 'J<double>' and 'J<dynamic>'
+//  - 'J' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
 // class A extends M2 with M0 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
 // class A extends M2 with M0 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both '#lib1::J<dart.core::double>' and '#lib1::J<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart:16:7: Error: 'A' can't implement both 'J<double>' and 'J<dynamic>'
+//  - 'J' is from 'pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart'.
 // class A extends M2 with M0 {}
 //       ^
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
index 517eca6..9fe7a0a 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
@@ -19,7 +19,7 @@
 }
 class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
   synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
+    : super self::_M0&I&J::•()
     ;
 }
 class M1 extends core::Object implements self::I<core::int> {
@@ -39,7 +39,7 @@
 }
 class A extends self::_A&M2&M0 {
   synthetic constructor •() → self::A
-    : super self::M2::•()
+    : super self::_A&M2&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
index ac1a5bb..435ce3b 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 }
 class M0<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::_M0&I&J<self::M0::X, self::M0::Y> {
   synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
-    : super self::I::•()
+    : super self::_M0&I&J::•()
     ;
 }
 class M1 extends core::Object implements self::I<core::int> {
@@ -39,7 +39,7 @@
 }
 class A extends self::_A&M2&M0 {
   synthetic constructor •() → self::A
-    : super self::M2::•()
+    : super self::_A&M2&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect
deleted file mode 100644
index 6cfde52..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.expect
+++ /dev/null
@@ -1,55 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
-// class A extends M2<int> with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
-// class A extends M2<int> with M0 {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
-// class A extends M2<int> with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
-// class A extends M2<int> with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super self::I::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
-  synthetic constructor •() → self::M2<self::M2::T>
-    : super self::M1::•()
-    ;
-}
-abstract class _A&M2&M0 = self::M2<core::int> with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&M2&M0
-    : super self::M2::•()
-    ;
-}
-class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
-    : super self::M2::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect
deleted file mode 100644
index 275fc2f..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.direct.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
-// class A extends M2<int> with M0 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
-// class A extends M2<int> with M0 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super self::I::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
-  synthetic constructor •() → self::M2<self::M2::T>
-    : super self::M1::•()
-    ;
-}
-abstract class _A&M2&M0 extends self::M2<core::int> implements self::M0<dynamic> {
-  synthetic constructor •() → self::_A&M2&M0
-    : super self::M2::•()
-    ;
-}
-class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
-    : super self::M2::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.expect
new file mode 100644
index 0000000..1886407
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.expect
@@ -0,0 +1,67 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both 'I<List<Map<int, int>>>' and 'I<List<dynamic>>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
+// class A extends M2<int> with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both 'I<List<Map<int, int>>>' and 'I<List<dynamic>>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
+// class A extends M2<int> with M0 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both 'I<List<Map<int, int>>>' and 'I<List<dynamic>>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
+// class A extends M2<int> with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both 'I<List<Map<int, int>>>' and 'I<List<dynamic>>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
+// class A extends M2<int> with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
+  synthetic constructor •() → self::M2<self::M2::T>
+    : super self::M1::•()
+    ;
+}
+abstract class _A&M2&M0 = self::M2<core::int> with self::M0<dynamic> {
+  synthetic constructor •() → self::_A&M2&M0
+    : super self::M2::•()
+    ;
+}
+class A extends self::_A&M2&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M2&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.transformed.expect
new file mode 100644
index 0000000..41fb098
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.transformed.expect
@@ -0,0 +1,51 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both 'I<List<Map<int, int>>>' and 'I<List<dynamic>>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
+// class A extends M2<int> with M0 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both 'I<List<Map<int, int>>>' and 'I<List<dynamic>>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
+// class A extends M2<int> with M0 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+class M2<T extends core::Object = dynamic> extends self::M1<core::Map<self::M2::T, self::M2::T>> {
+  synthetic constructor •() → self::M2<self::M2::T>
+    : super self::M1::•()
+    ;
+}
+abstract class _A&M2&M0 extends self::M2<core::int> implements self::M0<dynamic> {
+  synthetic constructor •() → self::_A&M2&M0
+    : super self::M2::•()
+    ;
+}
+class A extends self::_A&M2&M0 {
+  synthetic constructor •() → self::A
+    : super self::_A&M2&M0::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
index a8bfed1..8a0d0f9 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
@@ -1,10 +1,16 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'M2 with M0' can't implement both 'I<List<Map<int, int>>>' and 'I<List<dynamic>>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
 // class A extends M2<int> with M0 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both '#lib1::I<dart.core::List<dart.core::Map<dart.core::int, dart.core::int>>>' and '#lib1::I<dart.core::List<dynamic>>'
+// pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart:14:7: Error: 'A' can't implement both 'I<List<Map<int, int>>>' and 'I<List<dynamic>>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart'.
+//  - 'List' is from 'dart:core'.
+//  - 'Map' is from 'dart:core'.
 // class A extends M2<int> with M0 {}
 //       ^
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
index 36da7e3..1030f6b 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
@@ -29,7 +29,7 @@
 }
 class A extends self::_A&M2&M0 {
   synthetic constructor •() → self::A
-    : super self::M2::•()
+    : super self::_A&M2&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
index 6199c28..3eabc8f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
@@ -29,7 +29,7 @@
 }
 class A extends self::_A&M2&M0 {
   synthetic constructor •() → self::A
-    : super self::M2::•()
+    : super self::_A&M2&M0::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect
deleted file mode 100644
index 1d8e105..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1 {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super self::I::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-abstract class _A&M0&M1 = self::M0<core::int> with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&M0&M1
-    : super self::M0::•()
-    ;
-}
-class A extends self::_A&M0&M1 {
-  synthetic constructor •() → self::A
-    : super self::M0::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect
deleted file mode 100644
index 5d10926..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.direct.transformed.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super self::I::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-abstract class _A&M0&M1 extends self::M0<core::int> implements self::M1<dynamic> {
-  synthetic constructor •() → self::_A&M0&M1
-    : super self::M0::•()
-    ;
-}
-class A extends self::_A&M0&M1 {
-  synthetic constructor •() → self::A
-    : super self::M0::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.expect
new file mode 100644
index 0000000..bf40fc9
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.expect
@@ -0,0 +1,54 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart'.
+// class A extends M0<int> with M1 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart'.
+// class A extends M0<int> with M1 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart'.
+// class A extends M0<int> with M1 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart'.
+// class A extends M0<int> with M1 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+abstract class _A&M0&M1 = self::M0<core::int> with self::M1<dynamic> {
+  synthetic constructor •() → self::_A&M0&M1
+    : super self::M0::•()
+    ;
+}
+class A extends self::_A&M0&M1 {
+  synthetic constructor •() → self::A
+    : super self::_A&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7a1c8c2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart'.
+// class A extends M0<int> with M1 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart'.
+// class A extends M0<int> with M1 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+abstract class _A&M0&M1 extends self::M0<core::int> implements self::M1<dynamic> {
+  synthetic constructor •() → self::_A&M0&M1
+    : super self::M0::•()
+    ;
+}
+class A extends self::_A&M0&M1 {
+  synthetic constructor •() → self::A
+    : super self::_A&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
index eb96768..3378125 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
@@ -1,10 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'M0 with M1' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart'.
 // class A extends M0<int> with M1 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart:12:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart'.
 // class A extends M0<int> with M1 {}
 //       ^
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
index 128fa4a..b336c68 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
@@ -24,7 +24,7 @@
 }
 class A extends self::_A&M0&M1 {
   synthetic constructor •() → self::A
-    : super self::M0::•()
+    : super self::_A&M0&M1::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
index ec46a13..75ebf9d 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 }
 class A extends self::_A&M0&M1 {
   synthetic constructor •() → self::A
-    : super self::M0::•()
+    : super self::_A&M0&M1::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect
deleted file mode 100644
index 2f63c87..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.expect
+++ /dev/null
@@ -1,68 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super self::I::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
-  synthetic constructor •() → self::M2<self::M2::T>
-    : super self::I::•()
-    ;
-}
-abstract class _A&M0&M1 = self::M0<core::int> with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&M0&M1
-    : super self::M0::•()
-    ;
-}
-abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<dynamic> {
-  synthetic constructor •() → self::_A&M0&M1&M2
-    : super self::_A&M0&M1::•()
-    ;
-}
-class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → self::A
-    : super self::M0::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect
deleted file mode 100644
index 9dbae73..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.direct.transformed.expect
+++ /dev/null
@@ -1,54 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
-// class A extends M0<int> with M1, M2 {}
-//       ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super self::I::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
-  synthetic constructor •() → self::M2<self::M2::T>
-    : super self::I::•()
-    ;
-}
-abstract class _A&M0&M1 extends self::M0<core::int> implements self::M1<dynamic> {
-  synthetic constructor •() → self::_A&M0&M1
-    : super self::M0::•()
-    ;
-}
-abstract class _A&M0&M1&M2 extends self::_A&M0&M1 implements self::M2<dynamic> {
-  synthetic constructor •() → self::_A&M0&M1&M2
-    : super self::_A&M0&M1::•()
-    ;
-}
-class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → self::A
-    : super self::M0::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.expect
new file mode 100644
index 0000000..231fbf6d
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.expect
@@ -0,0 +1,74 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
+  synthetic constructor •() → self::M2<self::M2::T>
+    : super self::I::•()
+    ;
+}
+abstract class _A&M0&M1 = self::M0<core::int> with self::M1<dynamic> {
+  synthetic constructor •() → self::_A&M0&M1
+    : super self::M0::•()
+    ;
+}
+abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<dynamic> {
+  synthetic constructor •() → self::_A&M0&M1&M2
+    : super self::_A&M0&M1::•()
+    ;
+}
+class A extends self::_A&M0&M1&M2 {
+  synthetic constructor •() → self::A
+    : super self::_A&M0&M1&M2::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6079249
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.transformed.expect
@@ -0,0 +1,57 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
+// class A extends M0<int> with M1, M2 {}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super self::I::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
+  synthetic constructor •() → self::M2<self::M2::T>
+    : super self::I::•()
+    ;
+}
+abstract class _A&M0&M1 extends self::M0<core::int> implements self::M1<dynamic> {
+  synthetic constructor •() → self::_A&M0&M1
+    : super self::M0::•()
+    ;
+}
+abstract class _A&M0&M1&M2 extends self::_A&M0&M1 implements self::M2<dynamic> {
+  synthetic constructor •() → self::_A&M0&M1&M2
+    : super self::_A&M0&M1::•()
+    ;
+}
+class A extends self::_A&M0&M1&M2 {
+  synthetic constructor •() → self::A
+    : super self::_A&M0&M1&M2::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
index 89fbf6a..491fd65 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
@@ -1,14 +1,17 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
 // class A extends M0<int> with M1, M2 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'M0 with M1, M2' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
 // class A extends M0<int> with M1, M2 {}
 //       ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both '#lib1::I<dart.core::int>' and '#lib1::I<dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart:15:7: Error: 'A' can't implement both 'I<int>' and 'I<dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart'.
 // class A extends M0<int> with M1, M2 {}
 //       ^
 
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
index e17639c..d133391 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
@@ -34,7 +34,7 @@
 }
 class A extends self::_A&M0&M1&M2 {
   synthetic constructor •() → self::A
-    : super self::M0::•()
+    : super self::_A&M0&M1&M2::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
index 37d01dc..d4edaee 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
@@ -34,7 +34,7 @@
 }
 class A extends self::_A&M0&M1&M2 {
   synthetic constructor •() → self::A
-    : super self::M0::•()
+    : super self::_A&M0&M1&M2::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
deleted file mode 100644
index fc6a66ac..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.expect
+++ /dev/null
@@ -1,55 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super core::Object::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
-  synthetic constructor •() → self::_A&Object&M0&M1
-    : super self::_A&Object&M0::•()
-    ;
-}
-class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
deleted file mode 100644
index 58b221a..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.direct.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super core::Object::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<core::int> {
-  synthetic constructor •() → self::_A&Object&M0&M1
-    : super self::_A&Object&M0::•()
-    ;
-}
-class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect
new file mode 100644
index 0000000..397be08
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect
@@ -0,0 +1,59 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super core::Object::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
+  const synthetic constructor •() → self::_A&Object&M0&M1
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2c73250
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect
@@ -0,0 +1,47 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super core::Object::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<core::int> {
+  const synthetic constructor •() → self::_A&Object&M0&M1
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
index 60c2734..51eab20 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
@@ -1,10 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
@@ -25,12 +27,12 @@
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
-  synthetic constructor •() → self::_A&Object&M0&M1
+  const synthetic constructor •() → self::_A&Object&M0&M1
     : super self::_A&Object&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
index fc6a66ac..397be08 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
@@ -1,20 +1,24 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart:15:69: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
@@ -38,18 +42,18 @@
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
-  synthetic constructor •() → self::_A&Object&M0&M1
+  const synthetic constructor •() → self::_A&Object&M0&M1
     : super self::_A&Object&M0::•()
     ;
 }
 class A extends self::_A&Object&M0&M1 {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&M0&M1::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
deleted file mode 100644
index 45fecf6..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object
-//                                      ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object
-//                                      ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super core::Object::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
-    : super self::_A&Object&M0::•()
-    ;
-}
-class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
deleted file mode 100644
index 803ae84..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.direct.transformed.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
-// class /*@error=AmbiguousSupertypes*/ A extends Object
-//                                      ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super core::Object::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super self::I::•()
-    ;
-}
-abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
-    : super self::_A&Object&M0::•()
-    ;
-}
-class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect
new file mode 100644
index 0000000..31db2ea
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect
@@ -0,0 +1,49 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super core::Object::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0&M1
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6042159
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
+// class /*@error=AmbiguousSupertypes*/ A extends Object
+//                                      ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super core::Object::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super self::I::•()
+    ;
+}
+abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0&M1
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
index a8c84a6..b9461de 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
@@ -1,6 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
 // class /*@error=AmbiguousSupertypes*/ A extends Object
 //                                      ^
 
@@ -21,12 +22,12 @@
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
+  const synthetic constructor •() → self::_A&Object&M0&M1
     : super self::_A&Object&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
index 45fecf6..31db2ea 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
@@ -1,12 +1,14 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
 // class /*@error=AmbiguousSupertypes*/ A extends Object
 //                                      ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both '#lib1::I<dynamic>' and '#lib1::I<dart.core::int>'
+// pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart:16:38: Error: 'A' can't implement both 'I<dynamic>' and 'I<int>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart'.
 // class /*@error=AmbiguousSupertypes*/ A extends Object
 //                                      ^
 
@@ -30,18 +32,18 @@
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
+  const synthetic constructor •() → self::_A&Object&M0&M1
     : super self::_A&Object&M0::•()
     ;
 }
 class A extends self::_A&Object&M0&M1 implements self::I<core::int> {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&M0&M1::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
deleted file mode 100644
index 72c26175..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.expect
+++ /dev/null
@@ -1,55 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X, self::I::Y>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::int> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super core::Object::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::String, self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
-    : super self::_A&Object&M0::•()
-    ;
-}
-class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
deleted file mode 100644
index 657e348..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.direct.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X, self::I::Y>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::int> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super core::Object::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::String, self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
-    : super self::_A&Object&M0::•()
-    ;
-}
-class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect
new file mode 100644
index 0000000..7583b60
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect
@@ -0,0 +1,59 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X, self::I::Y>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::int> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super core::Object::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::String, self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0&M1
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect
new file mode 100644
index 0000000..30ac8b5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect
@@ -0,0 +1,47 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X, self::I::Y>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::int> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super core::Object::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::String, self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0&M1
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
index 293d160..365b0b9 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
@@ -1,10 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
@@ -25,12 +27,12 @@
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
+  const synthetic constructor •() → self::_A&Object&M0&M1
     : super self::_A&Object&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
index 72c26175..7583b60 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
@@ -1,20 +1,24 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::int>' and '#lib1::I<dart.core::String, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_1.dart:15:69: Error: 'A' can't implement both 'I<dynamic, int>' and 'I<String, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_1.dart'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
@@ -38,18 +42,18 @@
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
+  const synthetic constructor •() → self::_A&Object&M0&M1
     : super self::_A&Object&M0::•()
     ;
 }
 class A extends self::_A&Object&M0&M1 {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&M0&M1::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
deleted file mode 100644
index b8875c5..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.expect
+++ /dev/null
@@ -1,55 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X, self::I::Y>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super core::Object::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
-    : super self::_A&Object&M0::•()
-    ;
-}
-class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
deleted file mode 100644
index 33c1c8e..0000000
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.direct.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-//
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
-// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
-//                                                                     ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::X, self::I::Y>
-    : super core::Object::•()
-    ;
-}
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
-    : super core::Object::•()
-    ;
-}
-class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
-    : super self::_A&Object&M0::•()
-    ;
-}
-class A extends self::_A&Object&M0&M1 {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect
new file mode 100644
index 0000000..2da56f2
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect
@@ -0,0 +1,63 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X, self::I::Y>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super core::Object::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0&M1
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..04b8a12
--- /dev/null
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect
@@ -0,0 +1,49 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+//
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
+// class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
+//                                                                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class I<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X, self::I::Y>
+    : super core::Object::•()
+    ;
+}
+class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T, core::List<self::M0::T>> {
+  synthetic constructor •() → self::M0<self::M0::T>
+    : super core::Object::•()
+    ;
+}
+class M1<T extends core::Object = dynamic> extends core::Object implements self::I<core::List<self::M1::T>, self::M1::T> {
+  synthetic constructor •() → self::M1<self::M1::T>
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
+  const synthetic constructor •() → self::_A&Object&M0&M1
+    : super self::_A&Object&M0::•()
+    ;
+}
+class A extends self::_A&Object&M0&M1 {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M0&M1::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
index afdf716..738f378 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
@@ -1,10 +1,14 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
@@ -25,12 +29,12 @@
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
+  const synthetic constructor •() → self::_A&Object&M0&M1
     : super self::_A&Object&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
index b8875c5..2da56f2 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
@@ -1,20 +1,28 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'Object with M0, M1' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 //
-// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both '#lib1::I<dynamic, dart.core::List<dynamic>>' and '#lib1::I<dart.core::List<dynamic>, dynamic>'
+// pkg/front_end/testcases/inference/mixin_inference_unification_2.dart:19:69: Error: 'A' can't implement both 'I<dynamic, List<dynamic>>' and 'I<List<dynamic>, dynamic>'
+//  - 'I' is from 'pkg/front_end/testcases/inference/mixin_inference_unification_2.dart'.
+//  - 'List' is from 'dart:core'.
 // class /*@error=AmbiguousSupertypes*/ /*@error=AmbiguousSupertypes*/ A
 //                                                                     ^
 
@@ -38,18 +46,18 @@
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  synthetic constructor •() → self::_A&Object&M0&M1
+  const synthetic constructor •() → self::_A&Object&M0&M1
     : super self::_A&Object&M0::•()
     ;
 }
 class A extends self::_A&Object&M0&M1 {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&M0&M1::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.direct.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.direct.expect
rename to pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.type_promotion.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.type_promotion.expect
new file mode 100644
index 0000000..d405d4e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart:10:5: Context: Write to x@278
+  x = null;
+    ^
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/non_const_invocation.dart.direct.expect
rename to pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/non_const_invocation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.expect
rename to pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.expect
rename to pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_aware_method_invocation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.expect
rename to pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_aware_property_get.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.direct.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_coalescing_operator.dart.direct.expect
rename to pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_coalescing_operator.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.direct.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.direct.expect
rename to pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.direct.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.direct.expect
rename to pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
new file mode 100644
index 0000000..1eed720
--- /dev/null
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:15:5: Context: Write to f@369
+  f = /*@returnType=Null*/ (/*@type=Object*/ x) => 'hello';
+    ^
+pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:18:5: Context: Write to g@542
+  g = 'hello';
+    ^
diff --git a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.direct.expect b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/overloaded_int_operators.dart.direct.expect
rename to pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/overloaded_int_operators.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.direct.expect b/pkg/front_end/testcases/inference/override_equals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/override_equals.dart.direct.expect
rename to pkg/front_end/testcases/inference/override_equals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/override_equals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/override_equals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/override_equals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.direct.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect
deleted file mode 100644
index a252b52..0000000
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-abstract class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  abstract method bar() → void;
-}
-static method f<T extends self::B = dynamic>(self::f::T a) → void {
-  if(a is core::String) {
-    a.foo();
-  }
-  if(a is self::C) {
-    a{self::f::T extends self::C}.bar();
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect
deleted file mode 100644
index a252b52..0000000
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.direct.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-abstract class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  abstract method bar() → void;
-}
-static method f<T extends self::B = dynamic>(self::f::T a) → void {
-  if(a is core::String) {
-    a.foo();
-  }
-  if(a is self::C) {
-    a{self::f::T extends self::C}.bar();
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.expect
new file mode 100644
index 0000000..9d5a74b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+abstract class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  abstract method bar() → void;
+}
+static method f<T extends self::B = dynamic>(self::f::T a) → void {
+  if(a is core::String) {
+    a.foo();
+  }
+  if(a is self::C) {
+    a.bar();
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9d5a74b
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.transformed.expect
@@ -0,0 +1,25 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+abstract class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  abstract method bar() → void;
+}
+static method f<T extends self::B = dynamic>(self::f::T a) → void {
+  if(a is core::String) {
+    a.foo();
+  }
+  if(a is self::C) {
+    a.bar();
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.type_promotion.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.type_promotion.expect
new file mode 100644
index 0000000..90d61ac
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/promote_bounds.dart:17:9: Context: Possible promotion of a@366
+  if (a is String) {
+        ^^
+pkg/front_end/testcases/inference/promote_bounds.dart:21:9: Context: Possible promotion of a@366
+  if (a is C) {
+        ^^
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.direct.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.direct.expect
deleted file mode 100644
index ad926fb..0000000
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.direct.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test(core::Object a, core::bool b) → void {
-  if(b && a is core::int) {
-    core::print(a{core::int});
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.direct.transformed.expect
deleted file mode 100644
index ad926fb..0000000
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.direct.transformed.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method test(core::Object a, core::bool b) → void {
-  if(b && a is core::int) {
-    core::print(a{core::int});
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.expect
new file mode 100644
index 0000000..4e40f86
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::Object a, core::bool b) → void {
+  if(b && a is core::int) {
+    core::print(a);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4e40f86
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.transformed.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method test(core::Object a, core::bool b) → void {
+  if(b && a is core::int) {
+    core::print(a);
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.type_promotion.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.type_promotion.expect
new file mode 100644
index 0000000..dafde1f
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/promote_from_logical_rhs.dart:9:14: Context: Possible promotion of a@279
+  if (b && a is int) {
+             ^^
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.direct.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.direct.expect
deleted file mode 100644
index cd61e5e..0000000
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.direct.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method f(core::Object x) → void {
-  if(x is core::int) {
-    if(x{core::int} is core::String) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method g(core::int x) → void {
-  if(x is core::String) {
-    dynamic y = x;
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.direct.transformed.expect
deleted file mode 100644
index cd61e5e..0000000
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.direct.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method f(core::Object x) → void {
-  if(x is core::int) {
-    if(x{core::int} is core::String) {
-      dynamic y = x{core::int};
-    }
-  }
-}
-static method g(core::int x) → void {
-  if(x is core::String) {
-    dynamic y = x;
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.expect
new file mode 100644
index 0000000..3c04046
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::Object x) → void {
+  if(x is core::int) {
+    if(x is core::String) {
+      dynamic y = x;
+    }
+  }
+}
+static method g(core::int x) → void {
+  if(x is core::String) {
+    dynamic y = x;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3c04046
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.transformed.expect
@@ -0,0 +1,17 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::Object x) → void {
+  if(x is core::int) {
+    if(x is core::String) {
+      dynamic y = x;
+    }
+  }
+}
+static method g(core::int x) → void {
+  if(x is core::String) {
+    dynamic y = x;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect
new file mode 100644
index 0000000..93c14dd
--- /dev/null
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/inference/promotion_subtype_check.dart:9:9: Context: Possible promotion of x@276
+  if (x is int) {
+        ^^
+pkg/front_end/testcases/inference/promotion_subtype_check.dart:10:33: Context: Possible promotion of x@276
+    if (/*@promotedType=int*/ x is String) {
+                                ^^
+pkg/front_end/testcases/inference/promotion_subtype_check.dart:18:9: Context: Possible promotion of x@276
+  if (x is String) {
+        ^^
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.expect
rename to pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.expect
deleted file mode 100644
index 2b18c7f..0000000
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic a = new self::A::•();
-  self::A b = a;
-  core::print(a.x);
-  core::print(a.x.+(2));
-}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.transformed.expect
deleted file mode 100644
index 2b18c7f..0000000
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.direct.transformed.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic a = new self::A::•();
-  self::A b = a;
-  core::print(a.x);
-  core::print(a.x.+(2));
-}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.expect
copy to pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.direct.transformed.expect
copy to pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.expect
rename to pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/propagate_inference_transitively.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
index a52d4f9..d448f5a7 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
@@ -1,12 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                                         ^
 //
-// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
 //                                                         ^
 
@@ -22,13 +22,13 @@
 }
 static method test5() → dynamic {
   self::A a1 = new self::A::•();
-  a1.{self::A::x} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  a1.{self::A::x} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                                         ^" in "hi" as{TypeError} core::int;
   self::A a2 = new self::A::•();
-  a2.{self::A::x} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  a2.{self::A::x} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                                         ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
index a70683b..275dfa6 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
@@ -10,13 +10,13 @@
 }
 static method test5() → dynamic {
   self::A a1 = new self::A::•();
-  a1.{self::A::x} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  a1.{self::A::x} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                                         ^" in "hi" as{TypeError} core::int;
   self::A a2 = new self::A::•();
-  a2.{self::A::x} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  a2.{self::A::x} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
                                                         ^" in "hi" as{TypeError} core::int;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.expect
rename to pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/propagate_variable_get.dart.direct.expect b/pkg/front_end/testcases/inference/propagate_variable_get.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/propagate_variable_get.dart.direct.expect
rename to pkg/front_end/testcases/inference/propagate_variable_get.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/propagate_variable_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/propagate_variable_get.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/propagate_variable_get.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/propagate_variable_get.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.expect
rename to pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/property_get_toplevel.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/property_set.dart.direct.expect b/pkg/front_end/testcases/inference/property_set.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/property_set.dart.direct.expect
rename to pkg/front_end/testcases/inference/property_set.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/property_set.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/property_set.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/property_set.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
deleted file mode 100644
index 32b943a..0000000
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.
-//   void set x() {}
-//                ^
-
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  set x(dynamic #synthetic) → void
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.
-  void set x() {}
-               ^";
-}
-static method f(self::A a) → void {
-  dynamic x = a.x = 0;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.transformed.expect
deleted file mode 100644
index 6689f51..0000000
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.direct.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  set x(dynamic #synthetic) → void
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.
-  void set x() {}
-               ^";
-}
-static method f(self::A a) → void {
-  dynamic x = a.x = 0;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.expect
new file mode 100644
index 0000000..8eced30
--- /dev/null
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.expect
@@ -0,0 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:13: Error: A setter should have exactly one formal parameter.
+//   void set x() {}
+//             ^
+
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  set x(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:13: Error: A setter should have exactly one formal parameter.
+  void set x() {}
+            ^";
+    {}
+  }
+}
+static method f(self::A a) → void {
+  dynamic x = a.x = 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.transformed.expect
new file mode 100644
index 0000000..55e2dc6
--- /dev/null
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  set x(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:13: Error: A setter should have exactly one formal parameter.
+  void set x() {}
+            ^";
+    {}
+  }
+}
+static method f(self::A a) → void {
+  dynamic x = a.x = 0;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
index 0c7ff74c..b0a4fa1 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
@@ -1,8 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.
+// pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:13: Error: A setter should have exactly one formal parameter.
 //   void set x() {}
-//                ^
+//             ^
 
 library test;
 import self as self;
@@ -12,10 +12,12 @@
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  set x(dynamic #synthetic) → void
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.
+  set x(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:13: Error: A setter should have exactly one formal parameter.
   void set x() {}
-               ^";
+            ^";
+    {}
+  }
 }
 static method f(self::A a) → void {
   core::int x = a.{self::A::x} = 0;
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.transformed.expect
index 1fc67b8..710fdf3 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.transformed.expect
@@ -6,10 +6,12 @@
   synthetic constructor •() → self::A
     : super core::Object::•()
     ;
-  set x(dynamic #synthetic) → void
-    let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:16: Error: A setter should have exactly one formal parameter.
+  set x(dynamic #synthetic) → void {
+    invalid-expression "pkg/front_end/testcases/inference/property_set_bad_setter.dart:9:13: Error: A setter should have exactly one formal parameter.
   void set x() {}
-               ^";
+            ^";
+    {}
+  }
 }
 static method f(self::A a) → void {
   core::int x = a.{self::A::x} = 0;
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.expect
rename to pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/recursive_generic_function.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.direct.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/reference_to_typedef.dart.direct.expect
rename to pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/reference_to_typedef.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.expect
rename to pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.expect
rename to pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.expect
rename to pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.direct.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/setter_return_type.dart.direct.expect
rename to pkg/front_end/testcases/inference/setter_return_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/setter_return_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/setter_return_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/simple_literal_bool.dart.direct.expect b/pkg/front_end/testcases/inference/simple_literal_bool.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/simple_literal_bool.dart.direct.expect
rename to pkg/front_end/testcases/inference/simple_literal_bool.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/simple_literal_bool.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/simple_literal_bool.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/simple_literal_bool.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/simple_literal_bool.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/simple_literal_double.dart.direct.expect b/pkg/front_end/testcases/inference/simple_literal_double.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/simple_literal_double.dart.direct.expect
rename to pkg/front_end/testcases/inference/simple_literal_double.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/simple_literal_double.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/simple_literal_double.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/simple_literal_double.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/simple_literal_double.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/simple_literal_int.dart.direct.expect b/pkg/front_end/testcases/inference/simple_literal_int.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/simple_literal_int.dart.direct.expect
rename to pkg/front_end/testcases/inference/simple_literal_int.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/simple_literal_int.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/simple_literal_int.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/simple_literal_int.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/simple_literal_int.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/simple_literal_null.dart.direct.expect b/pkg/front_end/testcases/inference/simple_literal_null.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/simple_literal_null.dart.direct.expect
rename to pkg/front_end/testcases/inference/simple_literal_null.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/simple_literal_null.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/simple_literal_null.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/simple_literal_null.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/simple_literal_null.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.expect
rename to pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/static_method_tear_off.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/string_literal.dart.direct.expect b/pkg/front_end/testcases/inference/string_literal.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/string_literal.dart.direct.expect
rename to pkg/front_end/testcases/inference/string_literal.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/string_literal.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/string_literal.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/string_literal.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/string_literal.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.expect
rename to pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.direct.expect b/pkg/front_end/testcases/inference/super_index_set.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_index_set.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_index_set.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_index_set.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_index_set.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_index_set.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_index_set_substitution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.direct.expect b/pkg/front_end/testcases/inference/super_initializer.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_initializer.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_initializer.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_initializer.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_initializer.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_initializer.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_initializer_substitution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_method_invocation.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_method_invocation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_property_get.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_property_get.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get_substitution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_get_tearoff.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.expect
rename to pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/super_property_set_substitution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/switch_continue.dart.direct.expect b/pkg/front_end/testcases/inference/switch_continue.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/switch_continue.dart.direct.expect
rename to pkg/front_end/testcases/inference/switch_continue.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/switch_continue.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/switch_continue.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/switch_continue.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/switch_continue.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/symbol_literal.dart.direct.expect b/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/symbol_literal.dart.direct.expect
rename to pkg/front_end/testcases/inference/symbol_literal.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/symbol_literal.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/symbol_literal.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/symbol_literal.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.direct.expect b/pkg/front_end/testcases/inference/this_reference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/this_reference.dart.direct.expect
rename to pkg/front_end/testcases/inference/this_reference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/this_reference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/this_reference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/this_reference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
deleted file mode 100644
index c955da7..0000000
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
+++ /dev/null
@@ -1,135 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-typedef IntToInt = (core::int) → core::int;
-static method a() → (core::int) → core::int {
-  return (dynamic x) → dynamic => x;
-}
-static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
-  final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
-  asy::FutureOr<(core::int) → core::int> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = (dynamic x) → dynamic => x;
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_current} = (dynamic x) → dynamic => x;
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
-}
-static method d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = <dynamic>[(dynamic x) → dynamic => x];
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
-}
-static method e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-  asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L2:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::add}((dynamic x) → dynamic => x))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-  asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L3:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<dynamic>(<dynamic>[(dynamic x) → dynamic => x])))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.expect
rename to pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5058c0e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.transformed.expect
@@ -0,0 +1,135 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+typedef IntToInt = (core::int) → core::int;
+static method a() → (core::int) → core::int {
+  return (dynamic x) → dynamic => x;
+}
+static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<(core::int) → core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int) → core::int>();
+  asy::FutureOr<(core::int) → core::int> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = (dynamic x) → dynamic => x;
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = (dynamic x) → dynamic => x;
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+}
+static method d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = <dynamic>[(dynamic x) → dynamic => x];
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+}
+static method e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
+  asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L2:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}((dynamic x) → dynamic => x))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
+  asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L3:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<dynamic>(<dynamic>[(dynamic x) → dynamic => x])))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
index 0166552..4fced41 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
@@ -1,7 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) → dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) → dart.core::int>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) → dart.core::int>'.
+// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+//  - 'FutureOr' is from 'dart:async'.
+// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
 //   return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
 //                                  ^
 
@@ -15,8 +16,9 @@
   return (core::int x) → core::int => x;
 }
 static method b() → asy::Future<(core::int) → core::int> async {
-  return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
+  return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
   return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
                                  ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int) → core::int>;
 }
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
index 1172594..ae67a0b 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
   return (core::int x) → core::int => x;
 }
 static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
-  final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
+  final asy::_AsyncAwaitCompleter<(core::int) → core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int) → core::int>();
   asy::FutureOr<(core::int) → core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -19,8 +19,9 @@
     try {
       #L1:
       {
-        :return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type '(dynamic) \u8594 dynamic' can't be assigned to a variable of type 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.async::FutureOr<(dart.core::int) \u8594 dart.core::int>'.
+        :return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+ - 'FutureOr' is from 'dart:async'.
+Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
   return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
                                  ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int) → core::int>;
         break #L1;
@@ -34,7 +35,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
diff --git a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.direct.expect b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.direct.expect
rename to pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.direct.expect b/pkg/front_end/testcases/inference/try_catch.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/try_catch.dart.direct.expect
rename to pkg/front_end/testcases/inference/try_catch.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/try_catch.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/try_catch.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/try_catch.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/try_catch_finally.dart.direct.expect
rename to pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/try_catch_finally.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.expect
deleted file mode 100644
index 85ad7c7..0000000
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-class E extends core::StackTrace {
-  synthetic constructor •() → self::E
-    : super core::StackTrace::•()
-    ;
-}
-static method test(() → void f) → void {
-  try {
-    f.call();
-  }
-  on self::C catch(final self::C x, final core::StackTrace y) {
-    dynamic x1 = x;
-    dynamic y1 = y;
-    if(x is self::D) {
-      dynamic x2 = x{self::D};
-    }
-    if(y is self::E) {
-      dynamic y2 = y{self::E};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.transformed.expect
deleted file mode 100644
index 85ad7c7..0000000
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.direct.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-class E extends core::StackTrace {
-  synthetic constructor •() → self::E
-    : super core::StackTrace::•()
-    ;
-}
-static method test(() → void f) → void {
-  try {
-    f.call();
-  }
-  on self::C catch(final self::C x, final core::StackTrace y) {
-    dynamic x1 = x;
-    dynamic y1 = y;
-    if(x is self::D) {
-      dynamic x2 = x{self::D};
-    }
-    if(y is self::E) {
-      dynamic y2 = y{self::E};
-    }
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.expect
new file mode 100644
index 0000000..38d33b5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.expect
@@ -0,0 +1,35 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+}
+class E extends core::StackTrace {
+  synthetic constructor •() → self::E
+    : super core::StackTrace::•()
+    ;
+}
+static method test(() → void f) → void {
+  try {
+    f.call();
+  }
+  on self::C catch(final self::C x, final core::StackTrace y) {
+    dynamic x1 = x;
+    dynamic y1 = y;
+    if(x is self::D) {
+      dynamic x2 = x;
+    }
+    if(y is self::E) {
+      dynamic y2 = y;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.transformed.expect
new file mode 100644
index 0000000..38d33b5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.transformed.expect
@@ -0,0 +1,35 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+}
+class E extends core::StackTrace {
+  synthetic constructor •() → self::E
+    : super core::StackTrace::•()
+    ;
+}
+static method test(() → void f) → void {
+  try {
+    f.call();
+  }
+  on self::C catch(final self::C x, final core::StackTrace y) {
+    dynamic x1 = x;
+    dynamic y1 = y;
+    if(x is self::D) {
+      dynamic x2 = x;
+    }
+    if(y is self::E) {
+      dynamic y2 = y;
+    }
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.type_promotion.expect
new file mode 100644
index 0000000..d34e2ca
--- /dev/null
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/try_catch_promotion.dart:20:11: Context: Possible promotion of x@382
+    if (x is D) {
+          ^^
+pkg/front_end/testcases/inference/try_catch_promotion.dart:23:11: Context: Possible promotion of y@385
+    if (y is E) {
+          ^^
diff --git a/pkg/front_end/testcases/inference/try_finally.dart.direct.expect b/pkg/front_end/testcases/inference/try_finally.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/try_finally.dart.direct.expect
rename to pkg/front_end/testcases/inference/try_finally.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/try_finally.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/try_finally.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/try_finally.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/try_finally.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.direct.expect b/pkg/front_end/testcases/inference/type_cast.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_cast.dart.direct.expect
rename to pkg/front_end/testcases/inference/type_cast.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_cast.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_cast.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/type_cast.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.direct.expect b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.direct.expect
rename to pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.direct.expect b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.direct.expect
rename to pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.direct.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.direct.expect
deleted file mode 100644
index d61ebea..0000000
--- a/pkg/front_end/testcases/inference/type_promotion_simple.dart.direct.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    dynamic i = n{core::int};
-  }
-}
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.direct.transformed.expect
deleted file mode 100644
index d61ebea..0000000
--- a/pkg/front_end/testcases/inference/type_promotion_simple.dart.direct.transformed.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    dynamic i = n{core::int};
-  }
-}
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.expect
new file mode 100644
index 0000000..ac70ded
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::num n = null;
+  if(n is core::int) {
+    dynamic i = n;
+  }
+}
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ac70ded
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.transformed.expect
@@ -0,0 +1,10 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::num n = null;
+  if(n is core::int) {
+    dynamic i = n;
+  }
+}
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.type_promotion.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.type_promotion.expect
new file mode 100644
index 0000000..364cd86
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/inference/type_promotion_simple.dart:10:9: Context: Possible promotion of n@279
+  if (n is int) {
+        ^^
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.direct.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.direct.expect
rename to pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.type_promotion.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.type_promotion.expect
new file mode 100644
index 0000000..d1dd6f5
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart:10:9: Context: Possible promotion of n@279
+  if (n is int) {
+        ^^
+pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart:16:5: Context: Write to n@279
+  n = null;
+    ^
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.direct.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.direct.expect
rename to pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.type_promotion.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.type_promotion.expect
new file mode 100644
index 0000000..3a7414e
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart:10:9: Context: Possible promotion of n@279
+  if (n is int) {
+        ^^
+pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart:12:7: Context: Write to n@279
+    n = null;
+      ^
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.direct.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.direct.expect
rename to pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.type_promotion.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.type_promotion.expect
new file mode 100644
index 0000000..c5a50d4
--- /dev/null
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart:10:9: Context: Possible promotion of n@279
+  if (n is int) {
+        ^^
+pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart:14:7: Context: Write to n@279
+    n = null;
+      ^
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unresolved_super.dart.direct.expect
rename to pkg/front_end/testcases/inference/unresolved_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unresolved_super.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unresolved_super.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.direct.expect
deleted file mode 100644
index 52a9a4a..0000000
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.direct.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library test;
-import self as self;
-
-static method main() → dynamic {
-  dynamic v = <dynamic>[() → dynamic {
-    return 1;
-  }];
-}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.direct.transformed.expect
deleted file mode 100644
index 52a9a4a..0000000
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.direct.transformed.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library test;
-import self as self;
-
-static method main() → dynamic {
-  dynamic v = <dynamic>[() → dynamic {
-    return 1;
-  }];
-}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.direct.expect
copy to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.legacy.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.direct.transformed.expect
copy to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.expect
rename to pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
new file mode 100644
index 0000000..96232fc
--- /dev/null
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:29:5: Context: Write to x@559
+  x = 123;
+    ^
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:30:5: Context: Write to x@559
+  x = 'hi';
+    ^
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:31:5: Context: Write to y@612
+  y = /*error:INVALID_ASSIGNMENT*/ 123;
+    ^
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:32:5: Context: Write to y@612
+  y = /*error:INVALID_ASSIGNMENT*/ 'hi';
+    ^
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/const_invocation.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/const_invocation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.direct.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.direct.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/do_loop.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/do_loop.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/do_loop.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/do_loop.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/field_inference_circularity.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart
index 8b79005..4e96e3e 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart
@@ -18,12 +18,8 @@
   void test() {
     A aLocal;
     for (aLocal in /*@typeArgs=Iterable<A>*/ f()) {}
-    // Note: "/*@target=C::aField*/" appears twice due to dartbug.com/31790.
-    for (/*@target=C::aField*/ /*@target=C::aField*/ aField
-        in /*@typeArgs=Iterable<A>*/ f()) {}
-    // Note: "/*@target=C::aSetter*/" appears twice due to dartbug.com/31790.
-    for (/*@target=C::aSetter*/ /*@target=C::aSetter*/ aSetter
-        in /*@typeArgs=Iterable<A>*/ f()) {}
+    for (/*@target=C::aField*/ aField in /*@typeArgs=Iterable<A>*/ f()) {}
+    for (/*@target=C::aSetter*/ aSetter in /*@typeArgs=Iterable<A>*/ f()) {}
     for (aTopLevel in /*@typeArgs=Iterable<A>*/ f()) {}
     for (aTopLevelSetter in /*@typeArgs=Iterable<A>*/ f()) {}
   }
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
deleted file mode 100644
index 3eefc91..0000000
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
+++ /dev/null
@@ -1,90 +0,0 @@
-library test;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  dynamic :exception0;
-  dynamic :stack_trace0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        core::String s;
-        for (core::int x in s) {
-        }
-        {
-          dynamic :stream = s;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L2:
-            while (true) {
-              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                core::int x = :for-iterator.{asy::_StreamIterator::current};
-                {}
-              }
-              else
-                break #L2;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        core::int y;
-        for (final dynamic #t4 in s) {
-          y = #t4;
-        }
-        {
-          dynamic :stream = s;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L3:
-            while (true) {
-              dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  y = #t7;
-                }
-              }
-              else
-                break #L3;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.transformed.expect
new file mode 100644
index 0000000..0e5e658
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.transformed.expect
@@ -0,0 +1,90 @@
+library test;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::String s;
+        for (core::int x in s) {
+        }
+        {
+          dynamic :stream = s;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L2:
+            while (true) {
+              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::int x = :for-iterator.{asy::_StreamIterator::current};
+                {}
+              }
+              else
+                break #L2;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::int y;
+        for (final dynamic #t4 in s) {
+          y = #t4;
+        }
+        {
+          dynamic :stream = s;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L3:
+            while (true) {
+              dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  y = #t7;
+                }
+              }
+              else
+                break #L3;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
index 8512363..139d9e9 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
@@ -1,18 +1,22 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
 //   for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
 //                                                     ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
 //   await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
 //                                                           ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+//  - 'Iterable' is from 'dart:core'.
 //   for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
 //                                                 ^
 //
-// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+// pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'Stream' is from 'dart:async'.
 //   await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
 //                                                       ^
 
@@ -23,23 +27,27 @@
 
 static method test() → dynamic async {
   core::String s;
-  for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+  for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
   for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
                                                     ^" in s as{TypeError} core::Iterable<dynamic>) {
     core::int x = #t1 as{TypeError} core::int;
   }
-  await for (final dynamic #t3 in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+  await for (final dynamic #t3 in let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
   await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
                                                           ^" in s as{TypeError} asy::Stream<dynamic>) {
     core::int x = #t3 as{TypeError} core::int;
   }
   core::int y;
-  for (final dynamic #t5 in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+  for (final dynamic #t5 in let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
   for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
                                                 ^" in s as{TypeError} core::Iterable<dynamic>) {
     y = #t5 as{TypeError} core::int;
   }
-  await for (final dynamic #t7 in let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+  await for (final dynamic #t7 in let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
   await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
                                                       ^" in s as{TypeError} asy::Stream<dynamic>) {
     y = #t7 as{TypeError} core::int;
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index 7418afc..062ec9e 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -20,13 +20,15 @@
       #L1:
       {
         core::String s;
-        for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+        for (final dynamic #t1 in let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:10:53: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
   for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
                                                     ^" in s as{TypeError} core::Iterable<dynamic>) {
           core::int x = #t1 as{TypeError} core::int;
         }
         {
-          dynamic :stream = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+          dynamic :stream = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:11:59: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
   await for (int x in /*@error=ForInLoopTypeNotIterable*/ s) {}
                                                           ^" in s as{TypeError} asy::Stream<dynamic>;
           asy::_asyncStarListenHelper(:stream, :async_op);
@@ -53,13 +55,15 @@
             }
         }
         core::int y;
-        for (final dynamic #t8 in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.core::Iterable<dynamic>'.
+        for (final dynamic #t8 in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:13:49: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
+ - 'Iterable' is from 'dart:core'.
   for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
                                                 ^" in s as{TypeError} core::Iterable<dynamic>) {
           y = #t8 as{TypeError} core::int;
         }
         {
-          dynamic :stream = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'dart.core::String' used in the 'for' loop must implement 'dart.async::Stream<dynamic>'.
+          dynamic :stream = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart:14:55: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'Stream' is from 'dart:async'.
   await for (y in /*@error=ForInLoopTypeNotIterable*/ s) {}
                                                       ^" in s as{TypeError} asy::Stream<dynamic>;
           asy::_asyncStarListenHelper(:stream, :async_op);
@@ -95,7 +99,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect
deleted file mode 100644
index 91ab457..0000000
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method f<T extends core::Object = dynamic>() → self::f::T
-  return null;
-static method test() → dynamic async {
-  core::Iterable<self::A> iterable;
-  asy::Stream<self::A> stream;
-  self::A a;
-  self::B b;
-  core::int i;
-  for (final self::A #t1 in iterable) {
-    a = #t1;
-  }
-  await for (final self::A #t2 in stream) {
-    a = #t2;
-  }
-  for (final self::A #t3 in iterable) {
-    b = #t3;
-  }
-  await for (final self::A #t4 in stream) {
-    b = #t4;
-  }
-  for (final self::A #t5 in iterable) {
-    i = #t5;
-  }
-  await for (final self::A #t6 in stream) {
-    i = #t6;
-  }
-  for (final dynamic #t7 in self::f<dynamic>()) {
-    a = #t7;
-  }
-  await for (final dynamic #t8 in self::f<dynamic>()) {
-    a = #t8;
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
deleted file mode 100644
index c54ed4e..0000000
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
+++ /dev/null
@@ -1,164 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method f<T extends core::Object = dynamic>() → self::f::T
-  return null;
-static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  dynamic :exception0;
-  dynamic :stack_trace0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        core::Iterable<self::A> iterable;
-        asy::Stream<self::A> stream;
-        self::A a;
-        self::B b;
-        core::int i;
-        for (final self::A #t1 in iterable) {
-          a = #t1;
-        }
-        {
-          dynamic :stream = stream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::A> :for-iterator = new asy::_StreamIterator::•<self::A>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L2:
-            while (true) {
-              dynamic #t2 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final self::A #t4 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  a = #t4;
-                }
-              }
-              else
-                break #L2;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        for (final self::A #t6 in iterable) {
-          b = #t6;
-        }
-        {
-          dynamic :stream = stream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::A> :for-iterator = new asy::_StreamIterator::•<self::A>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L3:
-            while (true) {
-              dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final self::A #t9 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  b = #t9;
-                }
-              }
-              else
-                break #L3;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        for (final self::A #t11 in iterable) {
-          i = #t11;
-        }
-        {
-          dynamic :stream = stream;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::A> :for-iterator = new asy::_StreamIterator::•<self::A>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L4:
-            while (true) {
-              dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final self::A #t14 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  i = #t14;
-                }
-              }
-              else
-                break #L4;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t15 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        for (final dynamic #t16 in self::f<dynamic>()) {
-          a = #t16;
-        }
-        {
-          dynamic :stream = self::f<dynamic>();
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L5:
-            while (true) {
-              dynamic #t17 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t18 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                final dynamic #t19 = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  a = #t19;
-                }
-              }
-              else
-                break #L5;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t20 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.expect
new file mode 100644
index 0000000..8a33d3b
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.expect
@@ -0,0 +1,49 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method f<T extends core::Object = dynamic>() → self::f::T
+  return null;
+static method test() → dynamic async {
+  core::Iterable<self::A> iterable;
+  asy::Stream<self::A> stream;
+  self::A a;
+  self::B b;
+  core::int i;
+  for (final dynamic #t1 in iterable) {
+    a = #t1;
+  }
+  await for (final dynamic #t2 in stream) {
+    a = #t2;
+  }
+  for (final dynamic #t3 in iterable) {
+    b = #t3;
+  }
+  await for (final dynamic #t4 in stream) {
+    b = #t4;
+  }
+  for (final dynamic #t5 in iterable) {
+    i = #t5;
+  }
+  await for (final dynamic #t6 in stream) {
+    i = #t6;
+  }
+  for (final dynamic #t7 in self::f<dynamic>()) {
+    a = #t7;
+  }
+  await for (final dynamic #t8 in self::f<dynamic>()) {
+    a = #t8;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a974308
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.transformed.expect
@@ -0,0 +1,164 @@
+library test;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method f<T extends core::Object = dynamic>() → self::f::T
+  return null;
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::Iterable<self::A> iterable;
+        asy::Stream<self::A> stream;
+        self::A a;
+        self::B b;
+        core::int i;
+        for (final dynamic #t1 in iterable) {
+          a = #t1;
+        }
+        {
+          dynamic :stream = stream;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L2:
+            while (true) {
+              dynamic #t2 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t4 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  a = #t4;
+                }
+              }
+              else
+                break #L2;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        for (final dynamic #t6 in iterable) {
+          b = #t6;
+        }
+        {
+          dynamic :stream = stream;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L3:
+            while (true) {
+              dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t9 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  b = #t9;
+                }
+              }
+              else
+                break #L3;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        for (final dynamic #t11 in iterable) {
+          i = #t11;
+        }
+        {
+          dynamic :stream = stream;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L4:
+            while (true) {
+              dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t14 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  i = #t14;
+                }
+              }
+              else
+                break #L4;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t15 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        for (final dynamic #t16 in self::f<dynamic>()) {
+          a = #t16;
+        }
+        {
+          dynamic :stream = self::f<dynamic>();
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L5:
+            while (true) {
+              dynamic #t17 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t18 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                final dynamic #t19 = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  a = #t19;
+                }
+              }
+              else
+                break #L5;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t20 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
index a98fb44..2662ee0 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
@@ -1,11 +1,13 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 // Try changing the type of the variable.
 //   for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
 //                                                       ^
 //
-// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 // Try changing the type of the variable.
 //   await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
 //                                                             ^
@@ -46,13 +48,15 @@
     b = #t4 as{TypeError} self::B;
   }
   for (final self::A #t5 in iterable) {
-    i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+    i = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
   for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
                                                       ^" in #t5 as{TypeError} core::int;
   }
   await for (final self::A #t7 in stream) {
-    i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+    i = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
   await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
                                                             ^" in #t7 as{TypeError} core::int;
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index b67ada4..b77def2 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
 static method f<T extends core::Object = dynamic>() → self::f::T
   return null;
 static method test() → dynamic /* originally async */ {
-  final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
   asy::FutureOr<dynamic> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -93,7 +93,8 @@
             }
         }
         for (final self::A #t11 in iterable) {
-          i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+          i = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:55: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
   for (i /*@error=ForInLoopElementTypeNotAssignable*/ in iterable) {}
                                                       ^" in #t11 as{TypeError} core::int;
@@ -111,7 +112,8 @@
               if(:result) {
                 final self::A #t15 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  i = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.
+                  i = let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:61: Error: A value of type 'A' can't be assigned to a variable of type 'int'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
 Try changing the type of the variable.
   await for (i /*@error=ForInLoopElementTypeNotAssignable*/ in stream) {}
                                                             ^" in #t15 as{TypeError} core::int;
@@ -164,7 +166,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
index a261e48..d69052b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
@@ -1,37 +1,37 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //     var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
 //                                                              ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //     var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
 //                             ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //     var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
 //                                                                 ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
 //                                                                 ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
 //                                ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
 //                                                                 ^
 
@@ -92,18 +92,18 @@
     core::double v3 = let final core::String #t66 = "x" in let final core::double #t67 = self::getDouble() in let final void #t68 = super.{self::Base::[]=}(#t66, #t67) in #t67;
     core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = super.{self::Base::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() as{TypeError} core::double in let final void #t72 = super.{self::Base::[]=}(#t69, #t71) in #t71 : #t70;
     core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = super.{self::Base::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = super.{self::Base::[]=}(#t73, #t75) in #t75 : #t74;
-    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
     var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
                                                              ^" in super.{self::Base::[]}(#t77).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t80 = super.{self::Base::[]=}(#t77, #t78) in #t78;
     core::num v8 = let final core::String #t81 = "x" in let final core::num #t82 = super.{self::Base::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t83 = super.{self::Base::[]=}(#t81, #t82) in #t82;
     core::double v9 = let final core::String #t84 = "x" in let final core::double #t85 = super.{self::Base::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = super.{self::Base::[]=}(#t84, #t85) in #t85;
-    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
     var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
                             ^" in super.{self::Base::[]}(#t87).{core::num::+}(1) as{TypeError} core::double in let final void #t90 = super.{self::Base::[]=}(#t87, #t88) in #t88;
-    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = super.{self::Base::[]}(#t91) in let final void #t93 = super.{self::Base::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = super.{self::Base::[]}(#t91) in let final void #t93 = super.{self::Base::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
     var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
                                                              ^" in #t92.{core::num::+}(1) as{TypeError} core::double) in #t92;
   }
@@ -166,20 +166,20 @@
     core::num v2 = let final core::String #t189 = "x" in let final core::num #t190 = self::getNum() as{TypeError} core::int in let final void #t191 = super.{self::Base::[]=}(#t189, #t190) in #t190;
     core::num v4 = let final core::String #t192 = "x" in let final core::double #t193 = super.{self::Base::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num} let final core::int #t194 = self::getInt() in let final void #t195 = super.{self::Base::[]=}(#t192, #t194) in #t194 : #t193;
     core::num v5 = let final core::String #t196 = "x" in let final core::double #t197 = super.{self::Base::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num} let final core::num #t198 = self::getNum() as{TypeError} core::int in let final void #t199 = super.{self::Base::[]=}(#t196, #t198) in #t198 : #t197;
-    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
                                                                 ^" in super.{self::Base::[]}(#t200).{core::double::+}(self::getInt()) as{TypeError} core::int in let final void #t203 = super.{self::Base::[]=}(#t200, #t201) in #t201;
-    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
                                                                 ^" in super.{self::Base::[]}(#t204).{core::double::+}(self::getNum()) as{TypeError} core::int in let final void #t207 = super.{self::Base::[]=}(#t204, #t205) in #t205;
-    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
                                ^" in super.{self::Base::[]}(#t208).{core::double::+}(1) as{TypeError} core::int in let final void #t211 = super.{self::Base::[]=}(#t208, #t209) in #t209;
-    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = super.{self::Base::[]}(#t212) in let final void #t214 = super.{self::Base::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = super.{self::Base::[]}(#t212) in let final void #t214 = super.{self::Base::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
                                                                 ^" in #t213.{core::double::+}(1) as{TypeError} core::int) in #t213;
   }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
index 7992f48..53307d7 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
@@ -1,37 +1,37 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //     var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
 //                                                              ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //     var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];
 //                             ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //     var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;
 //                                                              ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
 //                                                                 ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
 //                                                                 ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];
 //                                ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;
 //                                                                 ^
 
@@ -87,18 +87,18 @@
     core::double v3 = let final core::String #t66 = "x" in let final core::double #t67 = self::getDouble() in let final void #t68 = this.{self::Test3::[]=}(#t66, #t67) in #t67;
     core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = this.{self::Test3::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() as{TypeError} core::double in let final void #t72 = this.{self::Test3::[]=}(#t69, #t71) in #t71 : #t70;
     core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = this.{self::Test3::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = this.{self::Test3::[]=}(#t73, #t75) in #t75 : #t74;
-    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
     var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
                                                              ^" in this.{self::Test3::[]}(#t77).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t80 = this.{self::Test3::[]=}(#t77, #t78) in #t78;
     core::num v8 = let final core::String #t81 = "x" in let final core::num #t82 = this.{self::Test3::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t83 = this.{self::Test3::[]=}(#t81, #t82) in #t82;
     core::double v9 = let final core::String #t84 = "x" in let final core::double #t85 = this.{self::Test3::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = this.{self::Test3::[]=}(#t84, #t85) in #t85;
-    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
     var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];
                             ^" in this.{self::Test3::[]}(#t87).{core::num::+}(1) as{TypeError} core::double in let final void #t90 = this.{self::Test3::[]=}(#t87, #t88) in #t88;
-    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = this.{self::Test3::[]}(#t91) in let final void #t93 = this.{self::Test3::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = this.{self::Test3::[]}(#t91) in let final void #t93 = this.{self::Test3::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
     var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;
                                                              ^" in #t92.{core::num::+}(1) as{TypeError} core::double) in #t92;
   }
@@ -169,20 +169,20 @@
     core::num v2 = let final core::String #t189 = "x" in let final core::num #t190 = self::getNum() as{TypeError} core::int in let final void #t191 = this.{self::Test7::[]=}(#t189, #t190) in #t190;
     core::num v4 = let final core::String #t192 = "x" in let final core::double #t193 = this.{self::Test7::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num} let final core::int #t194 = self::getInt() in let final void #t195 = this.{self::Test7::[]=}(#t192, #t194) in #t194 : #t193;
     core::num v5 = let final core::String #t196 = "x" in let final core::double #t197 = this.{self::Test7::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num} let final core::num #t198 = self::getNum() as{TypeError} core::int in let final void #t199 = this.{self::Test7::[]=}(#t196, #t198) in #t198 : #t197;
-    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
                                                                 ^" in this.{self::Test7::[]}(#t200).{core::double::+}(self::getInt()) as{TypeError} core::int in let final void #t203 = this.{self::Test7::[]=}(#t200, #t201) in #t201;
-    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
                                                                 ^" in this.{self::Test7::[]}(#t204).{core::double::+}(self::getNum()) as{TypeError} core::int in let final void #t207 = this.{self::Test7::[]=}(#t204, #t205) in #t205;
-    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];
                                ^" in this.{self::Test7::[]}(#t208).{core::double::+}(1) as{TypeError} core::int in let final void #t211 = this.{self::Test7::[]=}(#t208, #t209) in #t209;
-    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = this.{self::Test7::[]}(#t212) in let final void #t214 = this.{self::Test7::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = this.{self::Test7::[]}(#t212) in let final void #t214 = this.{self::Test7::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
     var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;
                                                                 ^" in #t213.{core::double::+}(1) as{TypeError} core::int) in #t213;
   }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
index afd73c7..eb0925f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
@@ -1,37 +1,37 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //   var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
 //                                                        ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //   var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
 //                           ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
 //   var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
 //                                                        ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
 //                                                           ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
 //                                                           ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
 //                              ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
 //                                                           ^
 
@@ -80,18 +80,18 @@
   core::double v3 = let final self::Test<core::int, core::double> #t86 = t in let final core::String #t87 = "x" in let final core::double #t88 = self::getDouble() in let final void #t89 = #t86.{self::Test::[]=}(#t87, #t88) in #t88;
   core::num v5 = let final self::Test<core::int, core::double> #t90 = t in let final core::String #t91 = "x" in let final core::int #t92 = #t90.{self::Test::[]}(#t91) in #t92.{core::num::==}(null) ?{core::num} let final core::num #t93 = self::getNum() as{TypeError} core::double in let final void #t94 = #t90.{self::Test::[]=}(#t91, #t93) in #t93 : #t92;
   core::num v6 = let final self::Test<core::int, core::double> #t95 = t in let final core::String #t96 = "x" in let final core::int #t97 = #t95.{self::Test::[]}(#t96) in #t97.{core::num::==}(null) ?{core::num} let final core::double #t98 = self::getDouble() in let final void #t99 = #t95.{self::Test::[]=}(#t96, #t98) in #t98 : #t97;
-  core::int v7 = let final self::Test<core::int, core::double> #t100 = t in let final core::String #t101 = "x" in let final core::int #t102 = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+  core::int v7 = let final self::Test<core::int, core::double> #t100 = t in let final core::String #t101 = "x" in let final core::int #t102 = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
   var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
                                                        ^" in #t100.{self::Test::[]}(#t101).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t104 = #t100.{self::Test::[]=}(#t101, #t102) in #t102;
   core::num v8 = let final self::Test<core::int, core::double> #t105 = t in let final core::String #t106 = "x" in let final core::num #t107 = #t105.{self::Test::[]}(#t106).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t108 = #t105.{self::Test::[]=}(#t106, #t107) in #t107;
   core::double v9 = let final self::Test<core::int, core::double> #t109 = t in let final core::String #t110 = "x" in let final core::double #t111 = #t109.{self::Test::[]}(#t110).{core::num::+}(self::getDouble()) in let final void #t112 = #t109.{self::Test::[]=}(#t110, #t111) in #t111;
-  core::int v10 = let final self::Test<core::int, core::double> #t113 = t in let final core::String #t114 = "x" in let final core::int #t115 = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+  core::int v10 = let final self::Test<core::int, core::double> #t113 = t in let final core::String #t114 = "x" in let final core::int #t115 = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
   var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
                           ^" in #t113.{self::Test::[]}(#t114).{core::num::+}(1) as{TypeError} core::double in let final void #t117 = #t113.{self::Test::[]=}(#t114, #t115) in #t115;
-  core::int v11 = let final self::Test<core::int, core::double> #t118 = t in let final core::String #t119 = "x" in let final core::int #t120 = #t118.{self::Test::[]}(#t119) in let final void #t121 = #t118.{self::Test::[]=}(#t119, let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'dart.core::double'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::double'.
+  core::int v11 = let final self::Test<core::int, core::double> #t118 = t in let final core::String #t119 = "x" in let final core::int #t120 = #t118.{self::Test::[]}(#t119) in let final void #t121 = #t118.{self::Test::[]=}(#t119, let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+Try changing the type of the left hand side, or casting the right hand side to 'double'.
   var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
                                                        ^" in #t120.{core::num::+}(1) as{TypeError} core::double) in #t120;
 }
@@ -134,20 +134,20 @@
   core::num v2 = let final self::Test<core::double, core::int> #t246 = t in let final core::String #t247 = "x" in let final core::num #t248 = self::getNum() as{TypeError} core::int in let final void #t249 = #t246.{self::Test::[]=}(#t247, #t248) in #t248;
   core::num v4 = let final self::Test<core::double, core::int> #t250 = t in let final core::String #t251 = "x" in let final core::double #t252 = #t250.{self::Test::[]}(#t251) in #t252.{core::num::==}(null) ?{core::num} let final core::int #t253 = self::getInt() in let final void #t254 = #t250.{self::Test::[]=}(#t251, #t253) in #t253 : #t252;
   core::num v5 = let final self::Test<core::double, core::int> #t255 = t in let final core::String #t256 = "x" in let final core::double #t257 = #t255.{self::Test::[]}(#t256) in #t257.{core::num::==}(null) ?{core::num} let final core::num #t258 = self::getNum() as{TypeError} core::int in let final void #t259 = #t255.{self::Test::[]=}(#t256, #t258) in #t258 : #t257;
-  core::double v7 = let final self::Test<core::double, core::int> #t260 = t in let final core::String #t261 = "x" in let final core::double #t262 = let final<BottomType> #t263 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::double v7 = let final self::Test<core::double, core::int> #t260 = t in let final core::String #t261 = "x" in let final core::double #t262 = let final<BottomType> #t263 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
                                                           ^" in #t260.{self::Test::[]}(#t261).{core::double::+}(self::getInt()) as{TypeError} core::int in let final void #t264 = #t260.{self::Test::[]=}(#t261, #t262) in #t262;
-  core::double v8 = let final self::Test<core::double, core::int> #t265 = t in let final core::String #t266 = "x" in let final core::double #t267 = let final<BottomType> #t268 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::double v8 = let final self::Test<core::double, core::int> #t265 = t in let final core::String #t266 = "x" in let final core::double #t267 = let final<BottomType> #t268 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
                                                           ^" in #t265.{self::Test::[]}(#t266).{core::double::+}(self::getNum()) as{TypeError} core::int in let final void #t269 = #t265.{self::Test::[]=}(#t266, #t267) in #t267;
-  core::double v10 = let final self::Test<core::double, core::int> #t270 = t in let final core::String #t271 = "x" in let final core::double #t272 = let final<BottomType> #t273 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::double v10 = let final self::Test<core::double, core::int> #t270 = t in let final core::String #t271 = "x" in let final core::double #t272 = let final<BottomType> #t273 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
                              ^" in #t270.{self::Test::[]}(#t271).{core::double::+}(1) as{TypeError} core::int in let final void #t274 = #t270.{self::Test::[]=}(#t271, #t272) in #t272;
-  core::double v11 = let final self::Test<core::double, core::int> #t275 = t in let final core::String #t276 = "x" in let final core::double #t277 = #t275.{self::Test::[]}(#t276) in let final void #t278 = #t275.{self::Test::[]=}(#t276, let final<BottomType> #t279 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  core::double v11 = let final self::Test<core::double, core::int> #t275 = t in let final core::String #t276 = "x" in let final core::double #t277 = #t275.{self::Test::[]}(#t276) in let final void #t278 = #t275.{self::Test::[]=}(#t276, let final<BottomType> #t279 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
                                                           ^" in #t277.{core::double::+}(1) as{TypeError} core::int) in #t277;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect
new file mode 100644
index 0000000..ca45342
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect
@@ -0,0 +1,42 @@
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:23:9: Context: Write to local@474
+  local = /*@typeArgs=B*/ f();
+        ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:24:9: Context: Write to local@474
+  local ??= /*@typeArgs=B*/ f();
+        ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:25:9: Context: Write to local@474
+  local += /*@typeArgs=dynamic*/ f();
+        ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:26:9: Context: Write to local@474
+  local *= /*@typeArgs=dynamic*/ f();
+        ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:27:9: Context: Write to local@474
+  local &= /*@typeArgs=dynamic*/ f();
+        ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:28:3: Context: Write to local@474
+  --local;
+  ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:29:8: Context: Write to local@474
+  local--;
+       ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:30:30: Context: Write to local@474
+  var /*@type=B*/ v1 = local = /*@typeArgs=B*/ f();
+                             ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:31:30: Context: Write to local@474
+  var /*@type=B*/ v2 = local ??= /*@typeArgs=B*/ f();
+                             ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:32:30: Context: Write to local@474
+  var /*@type=A*/ v3 = local += /*@typeArgs=dynamic*/ f();
+                             ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:33:30: Context: Write to local@474
+  var /*@type=B*/ v4 = local *= /*@typeArgs=dynamic*/ f();
+                             ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:34:30: Context: Write to local@474
+  var /*@type=C*/ v5 = local &= /*@typeArgs=dynamic*/ f();
+                             ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:35:24: Context: Write to local@474
+  var /*@type=B*/ v6 = --local;
+                       ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:36:29: Context: Write to local@474
+  var /*@type=B*/ v7 = local--;
+                            ^^
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect
new file mode 100644
index 0000000..b6c751d
--- /dev/null
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect
@@ -0,0 +1,84 @@
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:13:28: Context: Write to t@343
+  var /*@type=int*/ v1 = t = getInt();
+                           ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:14:28: Context: Write to t@343
+  var /*@type=num*/ v2 = t = getNum();
+                           ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:15:28: Context: Write to t@343
+  var /*@type=int*/ v4 = t ??= getInt();
+                           ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:16:28: Context: Write to t@343
+  var /*@type=num*/ v5 = t ??= getNum();
+                           ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:17:28: Context: Write to t@343
+  var /*@type=int*/ v7 = t += getInt();
+                           ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:18:28: Context: Write to t@343
+  var /*@type=num*/ v8 = t += getNum();
+                           ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:19:27: Context: Write to t@343
+  var /*@type=int*/ v10 = ++t;
+                          ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:20:28: Context: Write to t@343
+  var /*@type=int*/ v11 = t++;
+                           ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:24:28: Context: Write to t@343
+  var /*@type=int*/ v1 = t = getInt();
+                           ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:25:28: Context: Write to t@343
+  var /*@type=num*/ v2 = t = getNum();
+                           ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:26:31: Context: Write to t@343
+  var /*@type=double*/ v3 = t = getDouble();
+                              ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:27:28: Context: Write to t@343
+  var /*@type=num*/ v4 = t ??= getInt();
+                           ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:28:28: Context: Write to t@343
+  var /*@type=num*/ v5 = t ??= getNum();
+                           ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:29:28: Context: Write to t@343
+  var /*@type=num*/ v6 = t ??= getDouble();
+                           ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:30:28: Context: Write to t@343
+  var /*@type=num*/ v7 = t += getInt();
+                           ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:31:28: Context: Write to t@343
+  var /*@type=num*/ v8 = t += getNum();
+                           ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:32:28: Context: Write to t@343
+  var /*@type=num*/ v9 = t += getDouble();
+                           ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:33:27: Context: Write to t@343
+  var /*@type=num*/ v10 = ++t;
+                          ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:34:28: Context: Write to t@343
+  var /*@type=num*/ v11 = t++;
+                           ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:38:28: Context: Write to t@343
+  var /*@type=num*/ v2 = t = getNum();
+                           ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:39:31: Context: Write to t@343
+  var /*@type=double*/ v3 = t = getDouble();
+                              ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:40:28: Context: Write to t@343
+  var /*@type=num*/ v5 = t ??= getNum();
+                           ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:41:31: Context: Write to t@343
+  var /*@type=double*/ v6 = t ??= getDouble();
+                              ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:42:31: Context: Write to t@343
+  var /*@type=double*/ v7 = t += getInt();
+                              ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:43:31: Context: Write to t@343
+  var /*@type=double*/ v8 = t += getNum();
+                              ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:44:31: Context: Write to t@343
+  var /*@type=double*/ v9 = t += getDouble();
+                              ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:45:30: Context: Write to t@343
+  var /*@type=double*/ v10 = ++t;
+                             ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:46:31: Context: Write to t@343
+  var /*@type=double*/ v11 = t++;
+                              ^^
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
index b7fc239..5b13bca 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
@@ -1,22 +1,26 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
 // var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
 //                                     ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
 // var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
 //                                        ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
 // var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
 //                                                               ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
 // var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
 //                                                               ^
 
@@ -39,20 +43,24 @@
     : super core::Object::•()
     ;
 }
-static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:37: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
 var /*@topType=int*/ v_prefix_pp = (++new B(). /*@target=B::a*/ a);
                                     ^" in #t1.{self::B::a}.{self::A::+}(1) as{TypeError} self::A;
-static field core::double v_prefix_mm = let final self::B #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+static field core::double v_prefix_mm = let final self::B #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:40: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
 var /*@topType=double*/ v_prefix_mm = (--new B(). /*@target=B::a*/ a);
                                        ^" in #t3.{self::B::a}.{self::A::-}(1) as{TypeError} self::A;
-static field self::A v_postfix_pp = let final self::B #t5 = new self::B::•() in let final self::A #t6 = #t5.{self::B::a} in let final core::int #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'dart.core::int' can't be assigned to a variable of type 'test::A'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+static field self::A v_postfix_pp = let final self::B #t5 = new self::B::•() in let final self::A #t6 = #t5.{self::B::a} in let final core::int #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:63: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
 var /*@topType=A*/ v_postfix_pp = (new B(). /*@target=B::a*/ a++);
                                                               ^" in #t6.{self::A::+}(1) as{TypeError} self::A in #t6;
-static field self::A v_postfix_mm = let final self::B #t9 = new self::B::•() in let final self::A #t10 = #t9.{self::B::a} in let final core::double #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'dart.core::double' can't be assigned to a variable of type 'test::A'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::A'.
+static field self::A v_postfix_mm = let final self::B #t9 = new self::B::•() in let final self::A #t10 = #t9.{self::B::a} in let final core::double #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:63: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
 var /*@topType=A*/ v_postfix_mm = (new B(). /*@target=B::a*/ a--);
                                                               ^" in #t10.{self::A::-}(1) as{TypeError} self::A in #t10;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
index 0643685..cd1113c 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:24: Error: The return type of the method 'B::x' is dart.core::int, which does not match the return type of the overridden method (dart.core::double).
-// Change to a subtype of dart.core::double.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:24: Error: The return type of the method 'B.x' is 'int', which does not match the return type of the overridden method, 'double'.
+// Change to a subtype of 'double'.
 //   var /*@topType=int*/ x;
 //                        ^
 // pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:10:12: Context: This is the overridden method ('x').
@@ -10,8 +10,8 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:24: Error: The return type of the method 'B::x' is dart.core::int, which does not match the return type of the overridden method (dart.core::double).
-// Change to a subtype of dart.core::double.
+// pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart:16:24: Error: The return type of the method 'B.x' is 'int', which does not match the return type of the overridden method, 'double'.
+// Change to a subtype of 'double'.
 //   var /*@topType=int*/ x;
 //                        ^
 
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
index 14bfe0d..0dbade9 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:24: Error: The return type of the method 'C::x' is dart.core::int, which does not match the return type of the overridden method (dart.core::num).
-// Change to a subtype of dart.core::num.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:24: Error: The return type of the method 'C.x' is 'int', which does not match the return type of the overridden method, 'num'.
+// Change to a subtype of 'num'.
 //   var /*@topType=int*/ x;
 //                        ^
 // pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:9:12: Context: This is the overridden method ('x').
@@ -10,8 +10,8 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:24: Error: The return type of the method 'C::x' is dart.core::int, which does not match the return type of the overridden method (dart.core::num).
-// Change to a subtype of dart.core::num.
+// pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart:19:24: Error: The return type of the method 'C.x' is 'int', which does not match the return type of the overridden method, 'num'.
+// Change to a subtype of 'num'.
 //   var /*@topType=int*/ x;
 //                        ^
 
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_logical.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_logical.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/infer_use_of_void.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.direct.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
index 3089e9a..ecb2ddf 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 // var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
 //                                                              ^
 
@@ -11,8 +11,8 @@
 
 static field core::int i;
 static field core::String s;
-static field core::String x = self::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+static field core::String x = self::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
 var /*@topType=String*/ x = i = /*@error=InvalidAssignment*/ s;
                                                              ^" in self::s as{TypeError} core::int;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.direct.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.direct.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/property_assign_combiner.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/property_get_toplevel.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/static_assign_combiner.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.direct.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/strongly_connected_component.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/strongly_connected_component.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/super_index_get.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/super_index_get.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.direct.expect b/pkg/front_end/testcases/inference_new/switch.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/switch.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/switch.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/switch.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/switch.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/switch.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
deleted file mode 100644
index 9c67644..0000000
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-static field dynamic v = self::f.call(() → dynamic {
-  return 1;
-});
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
-static method main() → dynamic {
-  self::v;
-}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.direct.expect
copy to pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.direct.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/while_loop.dart.direct.expect
rename to pkg/front_end/testcases/inference_new/while_loop.dart.legacy.expect
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/inference_new/while_loop.dart.direct.transformed.expect
rename to pkg/front_end/testcases/inference_new/while_loop.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
new file mode 100644
index 0000000..1f8d821
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<U extends (U) → dynamic = (dynamic) → dynamic> = (U) → dynamic;
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    ((dynamic) → dynamic) → dynamic b;
+  }
+}
+static method main() → dynamic {
+  ((dynamic) → dynamic) → dynamic b;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..1f8d821
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<U extends (U) → dynamic = (dynamic) → dynamic> = (U) → dynamic;
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    ((dynamic) → dynamic) → dynamic b;
+  }
+}
+static method main() → dynamic {
+  ((dynamic) → dynamic) → dynamic b;
+}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/dependence.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
index f930013..e284a0c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
@@ -1,16 +1,18 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Inferred type argument 'dart.core::Comparable<dynamic>' violates the corresponding type variable bound of 'B::'.
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Inferred type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<T>' of the type variable 'T' on 'B'.
+//  - 'Comparable' is from 'dart:core'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // var y = new B();
 //             ^
-// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:9:9: Context: Bound of this variable is violated.
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:9:9: Context: This is the type variable whose bound isn't conformed to.
 // class B<T extends Comparable<T>> {}
 //         ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Inferred type argument 'dart.core::Comparable<dynamic>' violates the corresponding type variable bound of 'B::'.
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Inferred type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<T>' of the type variable 'T' on 'B'.
+//  - 'Comparable' is from 'dart:core'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // var y = new B();
 //             ^
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
index 2049a0b..59eda90 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Inferred type argument 'dart.core::Comparable<dynamic>' violates the corresponding type variable bound of 'B::'.
+// pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart:11:13: Error: Inferred type argument 'Comparable<dynamic>' doesn't conform to the bound 'Comparable<T>' of the type variable 'T' on 'B'.
+//  - 'Comparable' is from 'dart:core'.
 // Try specifying type arguments explicitly so that they conform to the bounds.
 // var y = new B();
 //             ^
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
index 61da753..4dbf4e5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
@@ -5,7 +5,8 @@
 // class Hest<X extends LinkedListEntry> {}
 //            ^
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Type argument 'dart.collection::LinkedListEntry<dynamic>' violates the corresponding type variable bound of 'LinkedListEntry'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Type argument 'LinkedListEntry<dynamic>' doesn't conform to the bound 'LinkedListEntry<E>' of the type variable 'E' on 'LinkedListEntry'.
+//  - 'LinkedListEntry' is from 'dart:collection'.
 // Try changing type arguments so that they conform to the bounds.
 // class Hest<X extends LinkedListEntry> {}
 //            ^
@@ -17,7 +18,8 @@
 // class Hest<X extends LinkedListEntry> {}
 //            ^
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Type argument 'dart.collection::LinkedListEntry<dynamic>' violates the corresponding type variable bound of 'LinkedListEntry'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Type argument 'LinkedListEntry<dynamic>' doesn't conform to the bound 'LinkedListEntry<E>' of the type variable 'E' on 'LinkedListEntry'.
+//  - 'LinkedListEntry' is from 'dart:collection'.
 // Try changing type arguments so that they conform to the bounds.
 // class Hest<X extends LinkedListEntry> {}
 //            ^
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
index 5f76923..5e791e7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
@@ -5,7 +5,8 @@
 // class Hest<X extends LinkedListEntry> {}
 //            ^
 //
-// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Type argument 'dart.collection::LinkedListEntry<dynamic>' violates the corresponding type variable bound of 'LinkedListEntry'.
+// pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Type argument 'LinkedListEntry<dynamic>' doesn't conform to the bound 'LinkedListEntry<E>' of the type variable 'E' on 'LinkedListEntry'.
+//  - 'LinkedListEntry' is from 'dart:collection'.
 // Try changing type arguments so that they conform to the bounds.
 // class Hest<X extends LinkedListEntry> {}
 //            ^
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.direct.transformed.expect
rename to pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
new file mode 100644
index 0000000..cead8f1
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<S extends (S) → dynamic = (dynamic) → dynamic> = (S) → dynamic;
+static field ((dynamic) → dynamic) → dynamic b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..cead8f1
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.transformed.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef B<S extends (S) → dynamic = (dynamic) → dynamic> = (S) → dynamic;
+static field ((dynamic) → dynamic) → dynamic b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.direct.expect b/pkg/front_end/testcases/invalid_assignment.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_assignment.dart.direct.expect
rename to pkg/front_end/testcases/invalid_assignment.dart.legacy.expect
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.direct.transformed.expect b/pkg/front_end/testcases/invalid_assignment.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_assignment.dart.direct.transformed.expect
rename to pkg/front_end/testcases/invalid_assignment.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
index 980a78b..e32b7ae 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
@@ -1,17 +1,18 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   i = /*@error=InvalidAssignment*/ s;
 //                                    ^
 //
-// pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+// pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //   i ??= /*@error=InvalidAssignment*/ s;
 //                                      ^
 //
-// pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.
-// Try changing the type of the left hand side, or casting the right hand side to '#lib1::A'.
+// pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/invalid_assignment.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
 //   a /*@error=InvalidAssignment*/ += 1;
 //                                  ^
 
@@ -28,18 +29,19 @@
 }
 static method test(core::int i, core::String s, self::A a) → dynamic {
   i = 1;
-  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i = /*@error=InvalidAssignment*/ s;
                                    ^" in s as{TypeError} core::int;
   i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i ??= /*@error=InvalidAssignment*/ s;
                                      ^" in s as{TypeError} core::int : null;
   a = new self::A::•();
-  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.
-Try changing the type of the left hand side, or casting the right hand side to '#lib1::A'.
+  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/invalid_assignment.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
   a /*@error=InvalidAssignment*/ += 1;
                                  ^" in a.{self::A::+}(1) as{TypeError} self::A;
 }
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
index fd3d79d..9ec525b 100644
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
@@ -11,18 +11,19 @@
 }
 static method test(core::int i, core::String s, self::A a) → dynamic {
   i = 1;
-  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i = /*@error=InvalidAssignment*/ s;
                                    ^" in s as{TypeError} core::int;
   i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
+  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i ??= /*@error=InvalidAssignment*/ s;
                                      ^" in s as{TypeError} core::int : null;
   a = new self::A::•();
-  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'dart.core::String' can't be assigned to a variable of type '#lib1::A'.
-Try changing the type of the left hand side, or casting the right hand side to '#lib1::A'.
+  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:17:34: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
+ - 'A' is from 'pkg/front_end/testcases/invalid_assignment.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
   a /*@error=InvalidAssignment*/ += 1;
                                  ^" in a.{self::A::+}(1) as{TypeError} self::A;
 }
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.type_promotion.expect b/pkg/front_end/testcases/invalid_assignment.dart.type_promotion.expect
new file mode 100644
index 0000000..abff5c0e
--- /dev/null
+++ b/pkg/front_end/testcases/invalid_assignment.dart.type_promotion.expect
@@ -0,0 +1,18 @@
+pkg/front_end/testcases/invalid_assignment.dart:12:5: Context: Write to i@300
+  i = 1;
+    ^
+pkg/front_end/testcases/invalid_assignment.dart:13:5: Context: Write to i@300
+  i = /*@error=InvalidAssignment*/ s;
+    ^
+pkg/front_end/testcases/invalid_assignment.dart:14:5: Context: Write to i@300
+  i ??= 1;
+    ^^^
+pkg/front_end/testcases/invalid_assignment.dart:15:5: Context: Write to i@300
+  i ??= /*@error=InvalidAssignment*/ s;
+    ^^^
+pkg/front_end/testcases/invalid_assignment.dart:16:5: Context: Write to a@315
+  a = new A();
+    ^
+pkg/front_end/testcases/invalid_assignment.dart:17:34: Context: Write to a@315
+  a /*@error=InvalidAssignment*/ += 1;
+                                 ^^
diff --git a/pkg/front_end/testcases/invalid_cast.dart.direct.expect b/pkg/front_end/testcases/invalid_cast.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_cast.dart.direct.expect
rename to pkg/front_end/testcases/invalid_cast.dart.legacy.expect
diff --git a/pkg/front_end/testcases/invalid_cast.dart.direct.transformed.expect b/pkg/front_end/testcases/invalid_cast.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_cast.dart.direct.transformed.expect
rename to pkg/front_end/testcases/invalid_cast.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
index e06cf93..9dbe0db 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
@@ -1,46 +1,60 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.
+// pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Object' is from 'dart:core'.
 // Change the type of the list literal or the context in which it is used.
 //   List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
 //                                                            ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Object' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
 //   Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
 //                                                                          ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+// pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'Object' is from 'dart:core'.
 // Change the type of the map literal or the context in which it is used.
 //   Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
 //                                                                       ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) → dart.core::int' isn't of expected type '(dart.core::Object) → dart.core::int'.
+// pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+//  - 'Object' is from 'dart:core'.
 // Change the type of the function expression or the context in which it is used.
 //   int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
 //                                                               ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+// pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+//  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
+//  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 // Change the type of the object being constructed or the context in which it is used.
 //   D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
 //                                           ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+// pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+//  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
+//  - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 // Change the type of the object being constructed or the context in which it is used.
 //   D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
 //                                           ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) → void' that isn't of expected type '(dart.core::Object) → void'.
+// pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+//  - 'Object' is from 'dart:core'.
 // Change the type of the method or the context in which it is used.
 //       C. /*@error=InvalidCastStaticMethod*/ staticFunction;
 //                                             ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) → void' that isn't of expected type '(dart.core::Object) → void'.
+// pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+//  - 'Object' is from 'dart:core'.
 // Change the type of the function or the context in which it is used.
 //       j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
 //                                                  ^
 //
-// pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) → void' that isn't of expected type '(dart.core::Object) → void'.
+// pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+//  - 'Object' is from 'dart:core'.
 // Change the type of the function or the context in which it is used.
 //   void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
 //                                                                 ^
@@ -74,41 +88,55 @@
 static method topLevelFunction(core::int i) → void {}
 static method bad() → dynamic {
   function localFunction(core::int i) → void {}
-  core::List<core::int> a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.
+  core::List<core::int> a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
   List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
                                                            ^" in <core::Object>[];
-  core::Map<core::int, core::String> b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+  core::Map<core::int, core::String> b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
   Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
                                                                          ^" in <core::Object, core::String>{};
-  core::Map<core::int, core::String> c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+  core::Map<core::int, core::String> c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
   Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
                                                                       ^" in <core::int, core::Object>{};
-  (core::Object) → core::int d = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) \u8594 dart.core::int' isn't of expected type '(dart.core::Object) \u8594 dart.core::int'.
+  (core::Object) → core::int d = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+ - 'Object' is from 'dart:core'.
 Change the type of the function expression or the context in which it is used.
   int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
                                                               ^" in (core::int i) → core::int => i;
   self::D e = self::C::fact() as{TypeError} self::D;
   self::D f = new self::D::•() as{TypeError} self::D;
-  self::D g = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+  self::D g = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+ - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
+ - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 Change the type of the object being constructed or the context in which it is used.
   D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
                                           ^" in new self::C::nonFact();
-  self::D h = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+  self::D h = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+ - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
+ - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 Change the type of the object being constructed or the context in which it is used.
   D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
                                           ^" in new self::C::nonFact2();
-  (core::Object) → void i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
 Change the type of the method or the context in which it is used.
       C. /*@error=InvalidCastStaticMethod*/ staticFunction;
                                             ^" in self::C::staticFunction;
-  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
       j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
                                                  ^" in self::topLevelFunction;
-  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
   void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
                                                                 ^" in localFunction;
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
index f35c1f5..acceaa9 100644
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
@@ -27,41 +27,55 @@
 static method topLevelFunction(core::int i) → void {}
 static method bad() → dynamic {
   function localFunction(core::int i) → void {}
-  core::List<core::int> a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'dart.core::List<dart.core::Object>' isn't of expected type 'dart.core::List<dart.core::int>'.
+  core::List<core::int> a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22:60: Error: The list literal type 'List<Object>' isn't of expected type 'List<int>'.
+ - 'List' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
 Change the type of the list literal or the context in which it is used.
   List<int> a = <Object> /*@error=InvalidCastLiteralList*/ [];
                                                            ^" in <core::Object>[];
-  core::Map<core::int, core::String> b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'dart.core::Map<dart.core::Object, dart.core::String>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+  core::Map<core::int, core::String> b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23:74: Error: The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
   Map<int, String> b = <Object, String> /*@error=InvalidCastLiteralMap*/ {};
                                                                          ^" in <core::Object, core::String>{};
-  core::Map<core::int, core::String> c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'dart.core::Map<dart.core::int, dart.core::Object>' isn't of expected type 'dart.core::Map<dart.core::int, dart.core::String>'.
+  core::Map<core::int, core::String> c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:24:71: Error: The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
+ - 'Map' is from 'dart:core'.
+ - 'Object' is from 'dart:core'.
 Change the type of the map literal or the context in which it is used.
   Map<int, String> c = <int, Object> /*@error=InvalidCastLiteralMap*/ {};
                                                                       ^" in <core::int, core::Object>{};
-  (core::Object) → core::int d = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type '(dart.core::int) \u8594 dart.core::int' isn't of expected type '(dart.core::Object) \u8594 dart.core::int'.
+  (core::Object) → core::int d = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:25:63: Error: The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
+ - 'Object' is from 'dart:core'.
 Change the type of the function expression or the context in which it is used.
   int Function(Object) d = /*@error=InvalidCastFunctionExpr*/ (int i) => i;
                                                               ^" in (core::int i) → core::int => i;
   self::D e = self::C::fact() as{TypeError} self::D;
   self::D f = new self::D::•() as{TypeError} self::D;
-  self::D g = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+  self::D g = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+ - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
+ - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 Change the type of the object being constructed or the context in which it is used.
   D g = new /*@error=InvalidCastNewExpr*/ C.nonFact();
                                           ^" in new self::C::nonFact();
-  self::D h = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type '#lib1::C' that isn't of expected type '#lib1::D'.
+  self::D h = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29:43: Error: The constructor returns type 'C' that isn't of expected type 'D'.
+ - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
+ - 'D' is from 'pkg/front_end/testcases/invalid_cast.dart'.
 Change the type of the object being constructed or the context in which it is used.
   D h = new /*@error=InvalidCastNewExpr*/ C.nonFact2();
                                           ^" in new self::C::nonFact2();
-  (core::Object) → void i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void i = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:31:45: Error: The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
 Change the type of the method or the context in which it is used.
       C. /*@error=InvalidCastStaticMethod*/ staticFunction;
                                             ^" in self::C::staticFunction;
-  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:33:50: Error: The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
       j = /*@error=InvalidCastTopLevelFunction*/ topLevelFunction;
                                                  ^" in self::topLevelFunction;
-  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type '(dart.core::int) \u8594 void' that isn't of expected type '(dart.core::Object) \u8594 void'.
+  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:34:65: Error: The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
+ - 'Object' is from 'dart:core'.
 Change the type of the function or the context in which it is used.
   void Function(Object) k = /*@error=InvalidCastLocalFunction*/ localFunction;
                                                                 ^" in localFunction;
diff --git a/pkg/front_end/testcases/invalid_type.dart.direct.expect b/pkg/front_end/testcases/invalid_type.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_type.dart.direct.expect
rename to pkg/front_end/testcases/invalid_type.dart.legacy.expect
diff --git a/pkg/front_end/testcases/invalid_type.dart.direct.transformed.expect b/pkg/front_end/testcases/invalid_type.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_type.dart.direct.transformed.expect
rename to pkg/front_end/testcases/invalid_type.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/invalid_type.dart.strong.expect b/pkg/front_end/testcases/invalid_type.dart.strong.expect
index 3cd8da3..072f0ee 100644
--- a/pkg/front_end/testcases/invalid_type.dart.strong.expect
+++ b/pkg/front_end/testcases/invalid_type.dart.strong.expect
@@ -8,7 +8,7 @@
 //   (null as Missing).bar();
 //            ^^^^^^^
 //
-// pkg/front_end/testcases/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'dart.core::Null'.
+// pkg/front_end/testcases/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'Null'.
 // Try correcting the name to the name of an existing method, or defining a method named 'bar'.
 //   null.bar();
 //        ^^^
@@ -35,7 +35,7 @@
 }
 static method test() → dynamic {
   (null as invalid-type).bar();
-  let final dynamic #t1 = null in invalid-expression "pkg/front_end/testcases/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'dart.core::Null'.
+  let final dynamic #t1 = null in invalid-expression "pkg/front_end/testcases/invalid_type.dart:13:8: Error: The method 'bar' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'bar'.
   null.bar();
        ^^^";
diff --git a/pkg/front_end/testcases/invocations.dart.direct.expect b/pkg/front_end/testcases/invocations.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/invocations.dart.direct.expect
rename to pkg/front_end/testcases/invocations.dart.legacy.expect
diff --git a/pkg/front_end/testcases/invocations.dart.strong.expect b/pkg/front_end/testcases/invocations.dart.strong.expect
new file mode 100644
index 0000000..9bfb838
--- /dev/null
+++ b/pkg/front_end/testcases/invocations.dart.strong.expect
@@ -0,0 +1,68 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/invocations.dart:7:3: Error: Method not found: 'z'.
+//   z("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/invocations.dart:8:3: Error: Getter not found: 'z'.
+//   z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/invocations.dart:9:3: Error: Getter not found: 'y'.
+//   y.z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/invocations.dart:10:3: Error: Getter not found: 'x'.
+//   x.y.z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/invocations.dart:14:7: Error: Method not found: 'z'.
+//       z("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/invocations.dart:15:7: Error: Getter not found: 'z'.
+//       z.print("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/invocations.dart:16:7: Error: Getter not found: 'y'.
+//       y.z.print("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/invocations.dart:17:7: Error: Getter not found: 'x'.
+//       x.y.z.print("Hello, World!");
+//       ^
+//
+// pkg/front_end/testcases/invocations.dart:13:7: Error: This expression has type 'void' and can't be used.
+//       print("Hello, World!") +
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/invocations.dart:7:3: Error: Method not found: 'z'.
+  z(\"Hello, World!\");
+  ^";
+  invalid-expression "pkg/front_end/testcases/invocations.dart:8:3: Error: Getter not found: 'z'.
+  z.print(\"Hello, World!\");
+  ^".print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/invocations.dart:9:3: Error: Getter not found: 'y'.
+  y.z.print(\"Hello, World!\");
+  ^".z.print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/invocations.dart:10:3: Error: Getter not found: 'x'.
+  x.y.z.print(\"Hello, World!\");
+  ^".y.z.print("Hello, World!");
+  1.{core::num::+}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invocations.dart:13:7: Error: This expression has type 'void' and can't be used.
+      print(\"Hello, World!\") +
+      ^" in core::print("Hello, World!")).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:14:7: Error: Method not found: 'z'.
+      z(\"Hello, World!\") +
+      ^" as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:15:7: Error: Getter not found: 'z'.
+      z.print(\"Hello, World!\") +
+      ^".print("Hello, World!") as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:16:7: Error: Getter not found: 'y'.
+      y.z.print(\"Hello, World!\") +
+      ^".z.print("Hello, World!") as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:17:7: Error: Getter not found: 'x'.
+      x.y.z.print(\"Hello, World!\");
+      ^".y.z.print("Hello, World!") as{TypeError} core::num);
+}
diff --git a/pkg/front_end/testcases/invocations.dart.strong.transformed.expect b/pkg/front_end/testcases/invocations.dart.strong.transformed.expect
new file mode 100644
index 0000000..773afe1
--- /dev/null
+++ b/pkg/front_end/testcases/invocations.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/invocations.dart:7:3: Error: Method not found: 'z'.
+  z(\"Hello, World!\");
+  ^";
+  invalid-expression "pkg/front_end/testcases/invocations.dart:8:3: Error: Getter not found: 'z'.
+  z.print(\"Hello, World!\");
+  ^".print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/invocations.dart:9:3: Error: Getter not found: 'y'.
+  y.z.print(\"Hello, World!\");
+  ^".z.print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/invocations.dart:10:3: Error: Getter not found: 'x'.
+  x.y.z.print(\"Hello, World!\");
+  ^".y.z.print("Hello, World!");
+  1.{core::num::+}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invocations.dart:13:7: Error: This expression has type 'void' and can't be used.
+      print(\"Hello, World!\") +
+      ^" in core::print("Hello, World!")).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:14:7: Error: Method not found: 'z'.
+      z(\"Hello, World!\") +
+      ^" as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:15:7: Error: Getter not found: 'z'.
+      z.print(\"Hello, World!\") +
+      ^".print("Hello, World!") as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:16:7: Error: Getter not found: 'y'.
+      y.z.print(\"Hello, World!\") +
+      ^".z.print("Hello, World!") as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:17:7: Error: Getter not found: 'x'.
+      x.y.z.print(\"Hello, World!\");
+      ^".y.z.print("Hello, World!") as{TypeError} core::num);
+}
diff --git a/pkg/front_end/testcases/issue34899.dart.direct.expect b/pkg/front_end/testcases/issue34899.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/issue34899.dart.direct.expect
rename to pkg/front_end/testcases/issue34899.dart.legacy.expect
diff --git a/pkg/front_end/testcases/issue34899.dart.direct.transformed.expect b/pkg/front_end/testcases/issue34899.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/issue34899.dart.direct.transformed.expect
rename to pkg/front_end/testcases/issue34899.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/legacy.status b/pkg/front_end/testcases/legacy.status
new file mode 100644
index 0000000..e603fd2
--- /dev/null
+++ b/pkg/front_end/testcases/legacy.status
@@ -0,0 +1,131 @@
+# Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Status file for the legacy_test.dart test suite. This is testing generating
+# Kernel ASTs in legacy mode (Dart 1.0).
+
+DeltaBlue: Fail # Fasta and dartk disagree on static initializers
+ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
+bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
+call: Fail # Test can't run.
+constructor_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
+constructor_initializer_invalid: RuntimeError # Fails execution after recovery
+duplicated_field_initializer: RuntimeError
+external_import: RuntimeError # Expected -- test uses import which doesn't exist.
+fallthrough: Fail # Missing FallThroughError.
+function_type_recovery: Fail
+incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
+inference/bug31436: RuntimeError # Test exercises Dart 2.0 semantics
+inference/constructors_too_many_positional_arguments: Fail
+inference/downwards_inference_annotations_locals: Fail # Issue #30031
+inference/future_then_explicit_future: Fail
+inference/generic_methods_infer_js_builtin: RuntimeError # Test attempts to access platform-private library leading to NSM.
+inference/infer_assign_to_index: Fail
+inference/infer_assign_to_property: Fail
+inference/infer_assign_to_property_custom: Fail
+inference/infer_type_cast: Fail
+inference/infer_typed_list_literal: Fail
+inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: RuntimeError
+instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
+instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # May be related to Issue 33479
+instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
+instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
+invocations: Fail
+micro: Fail # External method marked abstract.
+minimum_int: Crash # Min int literal not supported in non-strong mode.
+named_parameters: Fail # Missing types and unnecessary default values.
+optional: Fail # Unnecessary default values.
+rasta/abstract_constructor: Fail
+rasta/bad_constructor_redirection: Fail
+rasta/bad_continue: Fail
+rasta/bad_default_constructor: Fail # Compile-time error destroys program.
+rasta/bad_explicit_super_constructor: RuntimeError
+rasta/bad_implicit_super_constructor: RuntimeError
+rasta/bad_interpolation: Fail
+rasta/bad_redirection: Fail
+rasta/bad_setter_initializer: RuntimeError
+rasta/bad_unicode: Fail
+rasta/breaking_bad: Fail
+rasta/class_hierarchy: Fail
+rasta/class_member: Fail
+rasta/constant_get_and_invoke: Fail
+rasta/deferred_lib: Fail
+rasta/deferred_load: Fail
+rasta/duplicated_mixin: RuntimeError # Expected, this file has no main method.
+rasta/export: RuntimeError # Expected, this file has no main method.
+rasta/external_factory_redirection: Fail
+rasta/foo: RuntimeError # Expected, this file has no main method.
+rasta/for_loop: Fail
+rasta/generic_factory: Fail
+rasta/issue_000001: Fail
+rasta/issue_000031: Fail
+rasta/issue_000032: Fail
+rasta/issue_000034: RuntimeError
+rasta/issue_000036: Fail
+rasta/issue_000039: Fail
+rasta/issue_000041: RuntimeError
+rasta/issue_000042: Fail
+rasta/issue_000043: Fail
+rasta/issue_000044: Fail
+rasta/issue_000045: Fail
+rasta/issue_000046: Fail
+rasta/issue_000047: Fail
+rasta/issue_000081: Fail
+rasta/malformed_const_constructor: Fail
+rasta/malformed_function: Fail
+rasta/mandatory_parameter_initializer: Fail
+rasta/mixin_library: Fail
+rasta/native_is_illegal: Fail
+rasta/parser_error: Fail
+rasta/super: RuntimeError
+rasta/super_initializer: Fail
+rasta/super_operator: Fail
+rasta/try_label: Fail
+rasta/type_literals: Crash
+rasta/type_literals: Fail
+rasta/type_with_parse_error: Fail
+rasta/typedef: Crash
+rasta/typedef: Fail
+rasta/unresolved: Fail
+rasta/unresolved_constructor: Fail
+rasta/unresolved_for_in: RuntimeError # Test contains a compile-time error, signaled at run time in the JIT VM
+rasta/unresolved_recovery: Fail
+redirecting_factory: Fail # Missing types on constructor parameters.
+redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
+redirecting_factory_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
+redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
+redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
+redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
+redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
+regress/issue_29975: Fail # Issue 29975.
+regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
+regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
+regress/issue_30836: RuntimeError # Issue 30836.
+regress/issue_32200: Pass # Invalid type mapped to dynamic type in kernel translation helper.
+regress/issue_32972: RuntimeError
+regress/issue_33452: RuntimeError # Test has an intentional error
+regress/issue_34225: RuntimeError
+regress/issue_34563: RuntimeError # Test execution after recovery
+regress/issue_35177: RuntimeError
+regress/issue_35258: RuntimeError # Expected
+regress/issue_35259: RuntimeError # Expected
+regress/issue_35260: RuntimeError # Expected
+regress/issue_35266: RuntimeError # Expected
+reject_generic_function_types_in_bounds: RuntimeError # Expected
+runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
+runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
+runtime_checks/implicit_downcast_for_condition: RuntimeError # Test exercises strong mode semantics
+runtime_checks/implicit_downcast_if: RuntimeError # Test exercises strong mode semantics
+runtime_checks/implicit_downcast_not: RuntimeError # Test exercises strong mode semantics
+runtime_checks/implicit_downcast_while: RuntimeError # Test exercises strong mode semantics
+runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError # Test exercises strong mode semantics
+runtime_checks_new/implicit_downcast_field: RuntimeError # Test exercises strong mode semantics
+runtime_checks_new/mixin_forwarding_stub_field: RuntimeError # Test exercises strong mode semantics
+runtime_checks_new/mixin_forwarding_stub_getter: RuntimeError # Test exercises strong mode semantics
+runtime_checks_new/mixin_forwarding_stub_setter: RuntimeError # Test exercises strong mode semantics
+runtime_checks_new/stub_checked_via_target: RuntimeError # Test exercises strong mode semantics
+set_literals/disambiguation_rule: RuntimeError
+type_variable_as_super: Fail
+uninitialized_fields: Fail # Fasta and dartk disagree on static initializers
+void_methods: Fail # Bad return from setters.
diff --git a/pkg/front_end/testcases/literals.dart.direct.expect b/pkg/front_end/testcases/literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/literals.dart.direct.expect
rename to pkg/front_end/testcases/literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/literals.dart.direct.transformed.expect b/pkg/front_end/testcases/literals.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/literals.dart.direct.transformed.expect
rename to pkg/front_end/testcases/literals.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/literals.dart.strong.expect b/pkg/front_end/testcases/literals.dart.strong.expect
new file mode 100644
index 0000000..8fa18be
--- /dev/null
+++ b/pkg/front_end/testcases/literals.dart.strong.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method testString() → dynamic {
+  core::print("a");
+}
+static method testInt() → dynamic {
+  core::print(1);
+}
+static method testBool() → dynamic {
+  core::print(true);
+  core::print(false);
+}
+static method testDouble() → dynamic {
+  core::print(1.0);
+}
+static method testNull() → dynamic {
+  core::print(null);
+}
+static method testList() → dynamic {
+  core::print(<dynamic>[]);
+  core::print(<core::String>["a", "b"]);
+}
+static method testMap() → dynamic {
+  core::print(<dynamic, dynamic>{});
+  core::print(<core::String, core::String>{"a": "b"});
+}
+static method testSymbol() → dynamic {
+  core::print(#fisk);
+  core::print(#_fisk);
+  core::print(#fisk.hest.ko);
+}
+static method main() → dynamic {
+  self::testString();
+  self::testInt();
+  self::testBool();
+  self::testDouble();
+  self::testNull();
+  self::testList();
+  self::testMap();
+  self::testSymbol();
+}
diff --git a/pkg/front_end/testcases/literals.dart.strong.transformed.expect b/pkg/front_end/testcases/literals.dart.strong.transformed.expect
new file mode 100644
index 0000000..8fa18be
--- /dev/null
+++ b/pkg/front_end/testcases/literals.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method testString() → dynamic {
+  core::print("a");
+}
+static method testInt() → dynamic {
+  core::print(1);
+}
+static method testBool() → dynamic {
+  core::print(true);
+  core::print(false);
+}
+static method testDouble() → dynamic {
+  core::print(1.0);
+}
+static method testNull() → dynamic {
+  core::print(null);
+}
+static method testList() → dynamic {
+  core::print(<dynamic>[]);
+  core::print(<core::String>["a", "b"]);
+}
+static method testMap() → dynamic {
+  core::print(<dynamic, dynamic>{});
+  core::print(<core::String, core::String>{"a": "b"});
+}
+static method testSymbol() → dynamic {
+  core::print(#fisk);
+  core::print(#_fisk);
+  core::print(#fisk.hest.ko);
+}
+static method main() → dynamic {
+  self::testString();
+  self::testInt();
+  self::testBool();
+  self::testDouble();
+  self::testNull();
+  self::testList();
+  self::testMap();
+  self::testSymbol();
+}
diff --git a/pkg/front_end/testcases/local_generic_function.dart.direct.expect b/pkg/front_end/testcases/local_generic_function.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/local_generic_function.dart.direct.expect
rename to pkg/front_end/testcases/local_generic_function.dart.legacy.expect
diff --git a/pkg/front_end/testcases/local_generic_function.dart.direct.transformed.expect b/pkg/front_end/testcases/local_generic_function.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/local_generic_function.dart.direct.transformed.expect
rename to pkg/front_end/testcases/local_generic_function.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/magic_const.dart.direct.expect b/pkg/front_end/testcases/magic_const.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/magic_const.dart.direct.expect
rename to pkg/front_end/testcases/magic_const.dart.legacy.expect
diff --git a/pkg/front_end/testcases/magic_const.dart.direct.transformed.expect b/pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/magic_const.dart.direct.transformed.expect
rename to pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/map.dart.direct.expect b/pkg/front_end/testcases/map.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/map.dart.direct.expect
rename to pkg/front_end/testcases/map.dart.legacy.expect
diff --git a/pkg/front_end/testcases/map.dart.direct.transformed.expect b/pkg/front_end/testcases/map.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/map.dart.direct.transformed.expect
rename to pkg/front_end/testcases/map.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/map.dart.direct.expect b/pkg/front_end/testcases/map.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/map.dart.direct.expect
copy to pkg/front_end/testcases/map.dart.strong.expect
diff --git a/pkg/front_end/testcases/map.dart.direct.transformed.expect b/pkg/front_end/testcases/map.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/map.dart.direct.transformed.expect
copy to pkg/front_end/testcases/map.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/metadata_enum.dart.direct.expect b/pkg/front_end/testcases/metadata_enum.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/metadata_enum.dart.direct.expect
rename to pkg/front_end/testcases/metadata_enum.dart.legacy.expect
diff --git a/pkg/front_end/testcases/metadata_enum.dart.direct.transformed.expect b/pkg/front_end/testcases/metadata_enum.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/metadata_enum.dart.direct.transformed.expect
rename to pkg/front_end/testcases/metadata_enum.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.expect
rename to pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.expect
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.transformed.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/metadata_named_mixin_application.dart.direct.transformed.expect
rename to pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
index 1da773d..cec02ba 100644
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
+++ b/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
@@ -4,6 +4,7 @@
 
 class C = self::D with self::E {
   synthetic constructor •() → self::C
+    : super self::D::•()
     ;
 }
 class D extends core::Object {
diff --git a/pkg/front_end/testcases/micro.dart.direct.expect b/pkg/front_end/testcases/micro.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/micro.dart.direct.expect
rename to pkg/front_end/testcases/micro.dart.legacy.expect
diff --git a/pkg/front_end/testcases/micro.dart.strong.expect b/pkg/front_end/testcases/micro.dart.strong.expect
index c7b1e6d..1acd17c 100644
--- a/pkg/front_end/testcases/micro.dart.strong.expect
+++ b/pkg/front_end/testcases/micro.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method instanceMethod() → dynamic {
@@ -11,41 +11,41 @@
   }
 }
 abstract class ExternalValue extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ExternalValue
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Bar
     : super core::Object::•()
     ;
   abstract method externalInstanceMethod() → self::ExternalValue;
 }
 class Box extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Box
     : super core::Object::•()
     ;
 }
 class FinalBox extends core::Object {
   final field dynamic finalField;
-  constructor •(dynamic finalField) → void
+  constructor •(dynamic finalField) → self::FinalBox
     : self::FinalBox::finalField = finalField, super core::Object::•()
     ;
 }
 class SubFinalBox extends self::FinalBox {
-  constructor •(dynamic value) → void
+  constructor •(dynamic value) → self::SubFinalBox
     : super self::FinalBox::•(value)
     ;
 }
 class DynamicReceiver1 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::DynamicReceiver1
     : super core::Object::•()
     ;
   method dynamicallyCalled(dynamic x) → dynamic {}
 }
 class DynamicReceiver2 extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::DynamicReceiver2
     : super core::Object::•()
     ;
   method dynamicallyCalled(dynamic x) → dynamic {}
diff --git a/pkg/front_end/testcases/micro.dart.strong.transformed.expect b/pkg/front_end/testcases/micro.dart.strong.transformed.expect
new file mode 100644
index 0000000..1acd17c
--- /dev/null
+++ b/pkg/front_end/testcases/micro.dart.strong.transformed.expect
@@ -0,0 +1,81 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  method instanceMethod() → dynamic {
+    return 123;
+  }
+}
+abstract class ExternalValue extends core::Object {
+  synthetic constructor •() → self::ExternalValue
+    : super core::Object::•()
+    ;
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar
+    : super core::Object::•()
+    ;
+  abstract method externalInstanceMethod() → self::ExternalValue;
+}
+class Box extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Box
+    : super core::Object::•()
+    ;
+}
+class FinalBox extends core::Object {
+  final field dynamic finalField;
+  constructor •(dynamic finalField) → self::FinalBox
+    : self::FinalBox::finalField = finalField, super core::Object::•()
+    ;
+}
+class SubFinalBox extends self::FinalBox {
+  constructor •(dynamic value) → self::SubFinalBox
+    : super self::FinalBox::•(value)
+    ;
+}
+class DynamicReceiver1 extends core::Object {
+  synthetic constructor •() → self::DynamicReceiver1
+    : super core::Object::•()
+    ;
+  method dynamicallyCalled(dynamic x) → dynamic {}
+}
+class DynamicReceiver2 extends core::Object {
+  synthetic constructor •() → self::DynamicReceiver2
+    : super core::Object::•()
+    ;
+  method dynamicallyCalled(dynamic x) → dynamic {}
+}
+static method staticMethod() → dynamic {
+  return "sdfg";
+}
+external static abstract method externalStatic() → core::bool;
+external static abstract method createBar() → self::Bar;
+static method stringArgument(dynamic x) → dynamic {}
+static method intArgument(dynamic x) → dynamic {}
+static method makeDynamicCall(dynamic receiver) → void {
+  receiver.dynamicallyCalled("sdfg");
+}
+static method main() → dynamic {
+  dynamic x = self::staticMethod();
+  dynamic y = new self::Foo::•().{self::Foo::instanceMethod}();
+  core::bool z = self::externalStatic();
+  self::ExternalValue w = self::createBar().{self::Bar::externalInstanceMethod}();
+  self::stringArgument("sdfg");
+  self::intArgument(42);
+  self::Box box = new self::Box::•();
+  box.{self::Box::field} = "sdfg";
+  dynamic a = box.{self::Box::field};
+  self::FinalBox finalBox = new self::FinalBox::•("dfg");
+  dynamic b = finalBox.{self::FinalBox::finalField};
+  self::SubFinalBox subBox = new self::SubFinalBox::•("dfg");
+  dynamic c = subBox.{self::FinalBox::finalField};
+  self::makeDynamicCall(new self::DynamicReceiver1::•());
+  self::makeDynamicCall(new self::DynamicReceiver2::•());
+  core::List<core::String> list = <core::String>["string"];
+  core::String d = list.{core::List::[]}(0);
+}
diff --git a/pkg/front_end/testcases/minimum_int.dart.direct.expect b/pkg/front_end/testcases/minimum_int.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/minimum_int.dart.direct.expect
rename to pkg/front_end/testcases/minimum_int.dart.legacy.expect
diff --git a/pkg/front_end/testcases/minimum_int.dart.direct.transformed.expect b/pkg/front_end/testcases/minimum_int.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/minimum_int.dart.direct.transformed.expect
rename to pkg/front_end/testcases/minimum_int.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/missing_constructor.dart.direct.expect b/pkg/front_end/testcases/missing_constructor.dart.direct.expect
deleted file mode 100644
index 5efe451..0000000
--- a/pkg/front_end/testcases/missing_constructor.dart.direct.expect
+++ /dev/null
@@ -1,70 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/missing_constructor.dart:10:11: Warning: Superclass has no constructor named 'Super'.
-//   Sub() : super();
-//           ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:11:15: Warning: Superclass has no constructor named 'Super.foo'.
-//   Sub.foo() : super.foo();
-//               ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:15:15: Warning: Couldn't find constructor 'Bad'.
-//   Bad.foo() : this();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:16:15: Warning: Couldn't find constructor 'Bad.baz'.
-//   Bad.bar() : this.baz();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:22:24: Warning: Superclass has no constructor named 'Super'.
-//   MixinApplication() : super();
-//                        ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:23:28: Warning: Superclass has no constructor named 'Super.foo'.
-//   MixinApplication.foo() : super.foo();
-//                            ^^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  constructor _() → self::Super
-    : super core::Object::•()
-    ;
-}
-class Sub extends self::Super {
-  constructor •() → self::Sub
-    : final dynamic #t1 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor foo() → self::Sub
-    : final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-class Bad extends core::Object {
-  constructor foo() → self::Bad
-    : final dynamic #t3 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor bar() → self::Bad
-    : final dynamic #t4 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad.baz, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-abstract class _MixinApplication&Super&M = self::Super with self::M {
-  synthetic constructor _() → self::_MixinApplication&Super&M
-    : super self::Super::_()
-    ;
-}
-class MixinApplication extends self::_MixinApplication&Super&M {
-  constructor •() → self::MixinApplication
-    : final dynamic #t5 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor foo() → self::MixinApplication
-    : final dynamic #t6 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/missing_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/missing_constructor.dart.direct.transformed.expect
deleted file mode 100644
index 0981c897..0000000
--- a/pkg/front_end/testcases/missing_constructor.dart.direct.transformed.expect
+++ /dev/null
@@ -1,44 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  constructor _() → self::Super
-    : super core::Object::•()
-    ;
-}
-class Sub extends self::Super {
-  constructor •() → self::Sub
-    : final dynamic #t1 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor foo() → self::Sub
-    : final dynamic #t2 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-class Bad extends core::Object {
-  constructor foo() → self::Bad
-    : final dynamic #t3 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor bar() → self::Bad
-    : final dynamic #t4 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad.baz, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-abstract class _MixinApplication&Super&M extends self::Super implements self::M {
-  synthetic constructor _() → self::_MixinApplication&Super&M
-    : super self::Super::_()
-    ;
-}
-class MixinApplication extends self::_MixinApplication&Super&M {
-  constructor •() → self::MixinApplication
-    : final dynamic #t5 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor foo() → self::MixinApplication
-    : final dynamic #t6 = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/missing_constructor.dart.legacy.expect b/pkg/front_end/testcases/missing_constructor.dart.legacy.expect
new file mode 100644
index 0000000..a886bd4
--- /dev/null
+++ b/pkg/front_end/testcases/missing_constructor.dart.legacy.expect
@@ -0,0 +1,70 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/missing_constructor.dart:10:11: Warning: Superclass has no constructor named 'Super'.
+//   Sub() : super();
+//           ^^^^^
+//
+// pkg/front_end/testcases/missing_constructor.dart:11:15: Warning: Superclass has no constructor named 'Super.foo'.
+//   Sub.foo() : super.foo();
+//               ^^^^^
+//
+// pkg/front_end/testcases/missing_constructor.dart:15:15: Warning: Couldn't find constructor 'Bad'.
+//   Bad.foo() : this();
+//               ^^^^
+//
+// pkg/front_end/testcases/missing_constructor.dart:16:15: Warning: Couldn't find constructor 'Bad.baz'.
+//   Bad.bar() : this.baz();
+//               ^^^^
+//
+// pkg/front_end/testcases/missing_constructor.dart:22:24: Warning: Superclass has no constructor named 'Super'.
+//   MixinApplication() : super();
+//                        ^^^^^
+//
+// pkg/front_end/testcases/missing_constructor.dart:23:28: Warning: Superclass has no constructor named 'Super.foo'.
+//   MixinApplication.foo() : super.foo();
+//                            ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor _() → self::Super
+    : super core::Object::•()
+    ;
+}
+class Sub extends self::Super {
+  constructor •() → self::Sub
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  constructor foo() → self::Sub
+    : final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+}
+class Bad extends core::Object {
+  constructor foo() → self::Bad
+    : final dynamic #t3 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  constructor bar() → self::Bad
+    : final dynamic #t4 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad.baz, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+}
+abstract class _MixinApplication&Super&M = self::Super with self::M {
+  synthetic constructor _() → self::_MixinApplication&Super&M
+    : super self::Super::_()
+    ;
+}
+class MixinApplication extends self::_MixinApplication&Super&M {
+  constructor •() → self::MixinApplication
+    : final dynamic #t5 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  constructor foo() → self::MixinApplication
+    : final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/missing_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/missing_constructor.dart.legacy.transformed.expect
new file mode 100644
index 0000000..37a1c85
--- /dev/null
+++ b/pkg/front_end/testcases/missing_constructor.dart.legacy.transformed.expect
@@ -0,0 +1,44 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor _() → self::Super
+    : super core::Object::•()
+    ;
+}
+class Sub extends self::Super {
+  constructor •() → self::Sub
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  constructor foo() → self::Sub
+    : final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+}
+class Bad extends core::Object {
+  constructor foo() → self::Bad
+    : final dynamic #t3 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  constructor bar() → self::Bad
+    : final dynamic #t4 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad.baz, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+}
+abstract class _MixinApplication&Super&M extends self::Super implements self::M {
+  synthetic constructor _() → self::_MixinApplication&Super&M
+    : super self::Super::_()
+    ;
+}
+class MixinApplication extends self::_MixinApplication&Super&M {
+  constructor •() → self::MixinApplication
+    : final dynamic #t5 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+  constructor foo() → self::MixinApplication
+    : final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/mixin.dart.direct.expect b/pkg/front_end/testcases/mixin.dart.direct.expect
deleted file mode 100644
index 6270bd2..0000000
--- a/pkg/front_end/testcases/mixin.dart.direct.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _B&Object&M1 = core::Object with self::M1 {
-  synthetic constructor •() → self::_B&Object&M1
-    : super core::Object::•()
-    ;
-}
-abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
-  synthetic constructor •() → self::_B&Object&M1&M2
-    : super self::_B&Object&M1::•()
-    ;
-}
-class B extends self::_B&Object&M1&M2 {
-  constructor •(dynamic value) → self::B
-    : super core::Object::•()
-    ;
-}
-abstract class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M1");
-}
-abstract class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-abstract class _C&Object&M1 = core::Object with self::M1 {
-  synthetic constructor •() → self::_C&Object&M1
-    : super core::Object::•()
-    ;
-}
-abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
-  synthetic constructor •() → self::_C&Object&M1&M2
-    : super self::_C&Object&M1::•()
-    ;
-}
-class C extends self::_C&Object&M1&M2 {
-  constructor •(dynamic value) → self::C
-    : super core::Object::•()
-    ;
-}
-abstract class G1<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::G1<self::G1::T>
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print(self::G1::T);
-}
-abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
-  synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
-    : super core::Object::•()
-    ;
-}
-class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
-  synthetic constructor •() → self::D<self::D::S>
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  new self::B::•(null).m();
-  new self::C::•(null).m();
-  new self::D::•<dynamic>().m();
-  new self::D::•<core::int>().m();
-  new self::D::•<core::List<core::int>>().m();
-}
diff --git a/pkg/front_end/testcases/mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin.dart.direct.transformed.expect
deleted file mode 100644
index 7152f91..0000000
--- a/pkg/front_end/testcases/mixin.dart.direct.transformed.expect
+++ /dev/null
@@ -1,82 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _B&Object&M1 extends core::Object implements self::M1 {
-  synthetic constructor •() → self::_B&Object&M1
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M1");
-}
-abstract class _B&Object&M1&M2 extends self::_B&Object&M1 implements self::M2 {
-  synthetic constructor •() → self::_B&Object&M1&M2
-    : super self::_B&Object&M1::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-class B extends self::_B&Object&M1&M2 {
-  constructor •(dynamic value) → self::B
-    : super core::Object::•()
-    ;
-}
-abstract class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M1");
-}
-abstract class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-abstract class _C&Object&M1 extends core::Object implements self::M1 {
-  synthetic constructor •() → self::_C&Object&M1
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M1");
-}
-abstract class _C&Object&M1&M2 extends self::_C&Object&M1 implements self::M2 {
-  synthetic constructor •() → self::_C&Object&M1&M2
-    : super self::_C&Object&M1::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-class C extends self::_C&Object&M1&M2 {
-  constructor •(dynamic value) → self::C
-    : super core::Object::•()
-    ;
-}
-abstract class G1<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::G1<self::G1::T>
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print(self::G1::T);
-}
-abstract class _D&Object&G1<S extends core::Object = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S> {
-  synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print(self::_D&Object&G1::S);
-}
-class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
-  synthetic constructor •() → self::D<self::D::S>
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  new self::B::•(null).m();
-  new self::C::•(null).m();
-  new self::D::•<dynamic>().m();
-  new self::D::•<core::int>().m();
-  new self::D::•<core::List<core::int>>().m();
-}
diff --git a/pkg/front_end/testcases/mixin.dart.legacy.expect b/pkg/front_end/testcases/mixin.dart.legacy.expect
new file mode 100644
index 0000000..0213797
--- /dev/null
+++ b/pkg/front_end/testcases/mixin.dart.legacy.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&Object&M1 = core::Object with self::M1 {
+  const synthetic constructor •() → self::_B&Object&M1
+    : super core::Object::•()
+    ;
+}
+abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
+  const synthetic constructor •() → self::_B&Object&M1&M2
+    : super self::_B&Object&M1::•()
+    ;
+}
+class B extends self::_B&Object&M1&M2 {
+  constructor •(dynamic value) → self::B
+    : super self::_B&Object&M1&M2::•()
+    ;
+}
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+abstract class _C&Object&M1 = core::Object with self::M1 {
+  const synthetic constructor •() → self::_C&Object&M1
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
+  const synthetic constructor •() → self::_C&Object&M1&M2
+    : super self::_C&Object&M1::•()
+    ;
+}
+class C extends self::_C&Object&M1&M2 {
+  constructor •(dynamic value) → self::C
+    : super self::_C&Object&M1&M2::•()
+    ;
+}
+abstract class G1<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::G1<self::G1::T>
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print(self::G1::T);
+}
+abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
+    : super core::Object::•()
+    ;
+}
+class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
+  synthetic constructor •() → self::D<self::D::S>
+    : super self::_D&Object&G1::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•(null).m();
+  new self::C::•(null).m();
+  new self::D::•<dynamic>().m();
+  new self::D::•<core::int>().m();
+  new self::D::•<core::List<core::int>>().m();
+}
diff --git a/pkg/front_end/testcases/mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin.dart.legacy.transformed.expect
new file mode 100644
index 0000000..874cadf
--- /dev/null
+++ b/pkg/front_end/testcases/mixin.dart.legacy.transformed.expect
@@ -0,0 +1,82 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&Object&M1 extends core::Object implements self::M1 {
+  const synthetic constructor •() → self::_B&Object&M1
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class _B&Object&M1&M2 extends self::_B&Object&M1 implements self::M2 {
+  const synthetic constructor •() → self::_B&Object&M1&M2
+    : super self::_B&Object&M1::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+class B extends self::_B&Object&M1&M2 {
+  constructor •(dynamic value) → self::B
+    : super self::_B&Object&M1&M2::•()
+    ;
+}
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+abstract class _C&Object&M1 extends core::Object implements self::M1 {
+  const synthetic constructor •() → self::_C&Object&M1
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class _C&Object&M1&M2 extends self::_C&Object&M1 implements self::M2 {
+  const synthetic constructor •() → self::_C&Object&M1&M2
+    : super self::_C&Object&M1::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+class C extends self::_C&Object&M1&M2 {
+  constructor •(dynamic value) → self::C
+    : super self::_C&Object&M1&M2::•()
+    ;
+}
+abstract class G1<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::G1<self::G1::T>
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print(self::G1::T);
+}
+abstract class _D&Object&G1<S extends core::Object = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S> {
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print(self::_D&Object&G1::S);
+}
+class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
+  synthetic constructor •() → self::D<self::D::S>
+    : super self::_D&Object&G1::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•(null).m();
+  new self::C::•(null).m();
+  new self::D::•<dynamic>().m();
+  new self::D::•<core::int>().m();
+  new self::D::•<core::List<core::int>>().m();
+}
diff --git a/pkg/front_end/testcases/mixin.dart.outline.expect b/pkg/front_end/testcases/mixin.dart.outline.expect
index 989554e..2ab6aaa 100644
--- a/pkg/front_end/testcases/mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/mixin.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 abstract class _B&Object&M1 = core::Object with self::M1 {
-  synthetic constructor •() → self::_B&Object&M1
+  const synthetic constructor •() → self::_B&Object&M1
     : super core::Object::•()
     ;
 }
 abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
-  synthetic constructor •() → self::_B&Object&M1&M2
+  const synthetic constructor •() → self::_B&Object&M1&M2
     : super self::_B&Object&M1::•()
     ;
 }
@@ -29,12 +29,12 @@
     ;
 }
 abstract class _C&Object&M1 = core::Object with self::M1 {
-  synthetic constructor •() → self::_C&Object&M1
+  const synthetic constructor •() → self::_C&Object&M1
     : super core::Object::•()
     ;
 }
 abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
-  synthetic constructor •() → self::_C&Object&M1&M2
+  const synthetic constructor •() → self::_C&Object&M1&M2
     : super self::_C&Object&M1::•()
     ;
 }
@@ -49,7 +49,7 @@
     ;
 }
 abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
-  synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/mixin.dart.strong.expect b/pkg/front_end/testcases/mixin.dart.strong.expect
index f3bc002..3325ecd 100644
--- a/pkg/front_end/testcases/mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/mixin.dart.strong.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class _B&Object&M1 = core::Object with self::M1 {
-  synthetic constructor •() → self::_B&Object&M1
+  const synthetic constructor •() → self::_B&Object&M1
     : super core::Object::•()
     ;
 }
 abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
-  synthetic constructor •() → self::_B&Object&M1&M2
+  const synthetic constructor •() → self::_B&Object&M1&M2
     : super self::_B&Object&M1::•()
     ;
 }
 class B extends self::_B&Object&M1&M2 {
   constructor •(dynamic value) → self::B
-    : super core::Object::•()
+    : super self::_B&Object&M1&M2::•()
     ;
 }
 abstract class M1 extends core::Object {
@@ -32,18 +32,18 @@
     return core::print("M2");
 }
 abstract class _C&Object&M1 = core::Object with self::M1 {
-  synthetic constructor •() → self::_C&Object&M1
+  const synthetic constructor •() → self::_C&Object&M1
     : super core::Object::•()
     ;
 }
 abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
-  synthetic constructor •() → self::_C&Object&M1&M2
+  const synthetic constructor •() → self::_C&Object&M1&M2
     : super self::_C&Object&M1::•()
     ;
 }
 class C extends self::_C&Object&M1&M2 {
   constructor •(dynamic value) → self::C
-    : super core::Object::•()
+    : super self::_C&Object&M1&M2::•()
     ;
 }
 abstract class G1<T extends core::Object = dynamic> extends core::Object {
@@ -54,13 +54,13 @@
     return core::print(self::G1::T);
 }
 abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
-  synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
     : super core::Object::•()
     ;
 }
 class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
   synthetic constructor •() → self::D<self::D::S>
-    : super core::Object::•()
+    : super self::_D&Object&G1::•()
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
index 3dff5eb..124f59c 100644
--- a/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class _B&Object&M1 extends core::Object implements self::M1 {
-  synthetic constructor •() → self::_B&Object&M1
+  const synthetic constructor •() → self::_B&Object&M1
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print("M1");
 }
 abstract class _B&Object&M1&M2 extends self::_B&Object&M1 implements self::M2 {
-  synthetic constructor •() → self::_B&Object&M1&M2
+  const synthetic constructor •() → self::_B&Object&M1&M2
     : super self::_B&Object&M1::•()
     ;
   method m() → dynamic
@@ -18,7 +18,7 @@
 }
 class B extends self::_B&Object&M1&M2 {
   constructor •(dynamic value) → self::B
-    : super core::Object::•()
+    : super self::_B&Object&M1&M2::•()
     ;
 }
 abstract class M1 extends core::Object {
@@ -36,14 +36,14 @@
     return core::print("M2");
 }
 abstract class _C&Object&M1 extends core::Object implements self::M1 {
-  synthetic constructor •() → self::_C&Object&M1
+  const synthetic constructor •() → self::_C&Object&M1
     : super core::Object::•()
     ;
   method m() → dynamic
     return core::print("M1");
 }
 abstract class _C&Object&M1&M2 extends self::_C&Object&M1 implements self::M2 {
-  synthetic constructor •() → self::_C&Object&M1&M2
+  const synthetic constructor •() → self::_C&Object&M1&M2
     : super self::_C&Object&M1::•()
     ;
   method m() → dynamic
@@ -51,7 +51,7 @@
 }
 class C extends self::_C&Object&M1&M2 {
   constructor •(dynamic value) → self::C
-    : super core::Object::•()
+    : super self::_C&Object&M1&M2::•()
     ;
 }
 abstract class G1<T extends core::Object = dynamic> extends core::Object {
@@ -62,7 +62,7 @@
     return core::print(self::G1::T);
 }
 abstract class _D&Object&G1<S extends core::Object = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S> {
-  synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
     : super core::Object::•()
     ;
   method m() → dynamic
@@ -70,7 +70,7 @@
 }
 class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
   synthetic constructor •() → self::D<self::D::S>
-    : super core::Object::•()
+    : super self::_D&Object&G1::•()
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.direct.expect b/pkg/front_end/testcases/mixin_application_override.dart.direct.expect
deleted file mode 100644
index d2606bc..0000000
--- a/pkg/front_end/testcases/mixin_application_override.dart.direct.expect
+++ /dev/null
@@ -1,334 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:21:7: Context: Override was introduced in the mixin application class 'A0'.
-// class A0 = S with M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:22:7: Context: Override was introduced in the mixin application class 'A1'.
-// class A1 = S with M1, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:23:7: Context: Override was introduced in the mixin application class 'A2'.
-// class A2 = S with M1, M2, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:25:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class A0X = S with M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:26:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class A1X = S with M1, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:27:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class A2X = S with M1, M2, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:29:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0 extends S with M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:31:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1 extends S with M1, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:33:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2 extends S with M1, M2, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:35:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0X extends S with M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:37:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1X extends S with M1, M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:39:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2X extends S with M1, M2, M, MX {}
-//       ^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class S extends core::Object {
-  synthetic constructor •() → self::S
-    : super core::Object::•()
-    ;
-  method foo([dynamic x = null]) → dynamic {}
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-}
-class MX extends core::Object {
-  synthetic constructor •() → self::MX
-    : super core::Object::•()
-    ;
-}
-class A0 = self::S with self::M {
-  synthetic constructor •() → self::A0
-    : super self::S::•()
-    ;
-}
-abstract class _A1&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_A1&S&M1
-    : super self::S::•()
-    ;
-}
-class A1 = self::_A1&S&M1 with self::M {
-  synthetic constructor •() → self::A1
-    : super self::_A1&S&M1::•()
-    ;
-}
-abstract class _A2&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_A2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
-  synthetic constructor •() → self::_A2&S&M1&M2
-    : super self::_A2&S&M1::•()
-    ;
-}
-class A2 = self::_A2&S&M1&M2 with self::M {
-  synthetic constructor •() → self::A2
-    : super self::_A2&S&M1&M2::•()
-    ;
-}
-abstract class _A0X&S&M = self::S with self::M {
-  synthetic constructor •() → self::_A0X&S&M
-    : super self::S::•()
-    ;
-}
-class A0X = self::_A0X&S&M with self::MX {
-  synthetic constructor •() → self::A0X
-    : super self::_A0X&S&M::•()
-    ;
-}
-abstract class _A1X&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_A1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
-  synthetic constructor •() → self::_A1X&S&M1&M
-    : super self::_A1X&S&M1::•()
-    ;
-}
-class A1X = self::_A1X&S&M1&M with self::MX {
-  synthetic constructor •() → self::A1X
-    : super self::_A1X&S&M1&M::•()
-    ;
-}
-abstract class _A2X&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_A2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
-  synthetic constructor •() → self::_A2X&S&M1&M2
-    : super self::_A2X&S&M1::•()
-    ;
-}
-abstract class _A2X&S&M1&M2&M = self::_A2X&S&M1&M2 with self::M {
-  synthetic constructor •() → self::_A2X&S&M1&M2&M
-    : super self::_A2X&S&M1&M2::•()
-    ;
-}
-class A2X = self::_A2X&S&M1&M2&M with self::MX {
-  synthetic constructor •() → self::A2X
-    : super self::_A2X&S&M1&M2&M::•()
-    ;
-}
-abstract class _B0&S&M = self::S with self::M {
-  synthetic constructor •() → self::_B0&S&M
-    : super self::S::•()
-    ;
-}
-class B0 extends self::_B0&S&M {
-  synthetic constructor •() → self::B0
-    : super self::S::•()
-    ;
-}
-abstract class _B1&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_B1&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
-  synthetic constructor •() → self::_B1&S&M1&M
-    : super self::_B1&S&M1::•()
-    ;
-}
-class B1 extends self::_B1&S&M1&M {
-  synthetic constructor •() → self::B1
-    : super self::S::•()
-    ;
-}
-abstract class _B2&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_B2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
-  synthetic constructor •() → self::_B2&S&M1&M2
-    : super self::_B2&S&M1::•()
-    ;
-}
-abstract class _B2&S&M1&M2&M = self::_B2&S&M1&M2 with self::M {
-  synthetic constructor •() → self::_B2&S&M1&M2&M
-    : super self::_B2&S&M1&M2::•()
-    ;
-}
-class B2 extends self::_B2&S&M1&M2&M {
-  synthetic constructor •() → self::B2
-    : super self::S::•()
-    ;
-}
-abstract class _B0X&S&M = self::S with self::M {
-  synthetic constructor •() → self::_B0X&S&M
-    : super self::S::•()
-    ;
-}
-abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
-  synthetic constructor •() → self::_B0X&S&M&MX
-    : super self::_B0X&S&M::•()
-    ;
-}
-class B0X extends self::_B0X&S&M&MX {
-  synthetic constructor •() → self::B0X
-    : super self::S::•()
-    ;
-}
-abstract class _B1X&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_B1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
-  synthetic constructor •() → self::_B1X&S&M1&M
-    : super self::_B1X&S&M1::•()
-    ;
-}
-abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
-  synthetic constructor •() → self::_B1X&S&M1&M&MX
-    : super self::_B1X&S&M1&M::•()
-    ;
-}
-class B1X extends self::_B1X&S&M1&M&MX {
-  synthetic constructor •() → self::B1X
-    : super self::S::•()
-    ;
-}
-abstract class _B2X&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_B2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
-  synthetic constructor •() → self::_B2X&S&M1&M2
-    : super self::_B2X&S&M1::•()
-    ;
-}
-abstract class _B2X&S&M1&M2&M = self::_B2X&S&M1&M2 with self::M {
-  synthetic constructor •() → self::_B2X&S&M1&M2&M
-    : super self::_B2X&S&M1&M2::•()
-    ;
-}
-abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
-  synthetic constructor •() → self::_B2X&S&M1&M2&M&MX
-    : super self::_B2X&S&M1&M2&M::•()
-    ;
-}
-class B2X extends self::_B2X&S&M1&M2&M&MX {
-  synthetic constructor •() → self::B2X
-    : super self::S::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin_application_override.dart.direct.transformed.expect
deleted file mode 100644
index 94d1bd7..0000000
--- a/pkg/front_end/testcases/mixin_application_override.dart.direct.transformed.expect
+++ /dev/null
@@ -1,224 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class S extends core::Object {
-  synthetic constructor •() → self::S
-    : super core::Object::•()
-    ;
-  method foo([dynamic x = null]) → dynamic {}
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-}
-class MX extends core::Object {
-  synthetic constructor •() → self::MX
-    : super core::Object::•()
-    ;
-}
-class A0 extends self::S implements self::M {
-  synthetic constructor •() → self::A0
-    : super self::S::•()
-    ;
-  method foo() → dynamic {}
-}
-abstract class _A1&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_A1&S&M1
-    : super self::S::•()
-    ;
-}
-class A1 extends self::_A1&S&M1 implements self::M {
-  synthetic constructor •() → self::A1
-    : super self::_A1&S&M1::•()
-    ;
-  method foo() → dynamic {}
-}
-abstract class _A2&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_A2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2&S&M1&M2 extends self::_A2&S&M1 implements self::M2 {
-  synthetic constructor •() → self::_A2&S&M1&M2
-    : super self::_A2&S&M1::•()
-    ;
-}
-class A2 extends self::_A2&S&M1&M2 implements self::M {
-  synthetic constructor •() → self::A2
-    : super self::_A2&S&M1&M2::•()
-    ;
-  method foo() → dynamic {}
-}
-abstract class _A0X&S&M extends self::S implements self::M {
-  synthetic constructor •() → self::_A0X&S&M
-    : super self::S::•()
-    ;
-  method foo() → dynamic {}
-}
-class A0X extends self::_A0X&S&M implements self::MX {
-  synthetic constructor •() → self::A0X
-    : super self::_A0X&S&M::•()
-    ;
-}
-abstract class _A1X&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_A1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A1X&S&M1&M extends self::_A1X&S&M1 implements self::M {
-  synthetic constructor •() → self::_A1X&S&M1&M
-    : super self::_A1X&S&M1::•()
-    ;
-  method foo() → dynamic {}
-}
-class A1X extends self::_A1X&S&M1&M implements self::MX {
-  synthetic constructor •() → self::A1X
-    : super self::_A1X&S&M1&M::•()
-    ;
-}
-abstract class _A2X&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_A2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2X&S&M1&M2 extends self::_A2X&S&M1 implements self::M2 {
-  synthetic constructor •() → self::_A2X&S&M1&M2
-    : super self::_A2X&S&M1::•()
-    ;
-}
-abstract class _A2X&S&M1&M2&M extends self::_A2X&S&M1&M2 implements self::M {
-  synthetic constructor •() → self::_A2X&S&M1&M2&M
-    : super self::_A2X&S&M1&M2::•()
-    ;
-  method foo() → dynamic {}
-}
-class A2X extends self::_A2X&S&M1&M2&M implements self::MX {
-  synthetic constructor •() → self::A2X
-    : super self::_A2X&S&M1&M2&M::•()
-    ;
-}
-abstract class _B0&S&M extends self::S implements self::M {
-  synthetic constructor •() → self::_B0&S&M
-    : super self::S::•()
-    ;
-  method foo() → dynamic {}
-}
-class B0 extends self::_B0&S&M {
-  synthetic constructor •() → self::B0
-    : super self::S::•()
-    ;
-}
-abstract class _B1&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_B1&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1&S&M1&M extends self::_B1&S&M1 implements self::M {
-  synthetic constructor •() → self::_B1&S&M1&M
-    : super self::_B1&S&M1::•()
-    ;
-  method foo() → dynamic {}
-}
-class B1 extends self::_B1&S&M1&M {
-  synthetic constructor •() → self::B1
-    : super self::S::•()
-    ;
-}
-abstract class _B2&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_B2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2&S&M1&M2 extends self::_B2&S&M1 implements self::M2 {
-  synthetic constructor •() → self::_B2&S&M1&M2
-    : super self::_B2&S&M1::•()
-    ;
-}
-abstract class _B2&S&M1&M2&M extends self::_B2&S&M1&M2 implements self::M {
-  synthetic constructor •() → self::_B2&S&M1&M2&M
-    : super self::_B2&S&M1&M2::•()
-    ;
-  method foo() → dynamic {}
-}
-class B2 extends self::_B2&S&M1&M2&M {
-  synthetic constructor •() → self::B2
-    : super self::S::•()
-    ;
-}
-abstract class _B0X&S&M extends self::S implements self::M {
-  synthetic constructor •() → self::_B0X&S&M
-    : super self::S::•()
-    ;
-  method foo() → dynamic {}
-}
-abstract class _B0X&S&M&MX extends self::_B0X&S&M implements self::MX {
-  synthetic constructor •() → self::_B0X&S&M&MX
-    : super self::_B0X&S&M::•()
-    ;
-}
-class B0X extends self::_B0X&S&M&MX {
-  synthetic constructor •() → self::B0X
-    : super self::S::•()
-    ;
-}
-abstract class _B1X&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_B1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1X&S&M1&M extends self::_B1X&S&M1 implements self::M {
-  synthetic constructor •() → self::_B1X&S&M1&M
-    : super self::_B1X&S&M1::•()
-    ;
-  method foo() → dynamic {}
-}
-abstract class _B1X&S&M1&M&MX extends self::_B1X&S&M1&M implements self::MX {
-  synthetic constructor •() → self::_B1X&S&M1&M&MX
-    : super self::_B1X&S&M1&M::•()
-    ;
-}
-class B1X extends self::_B1X&S&M1&M&MX {
-  synthetic constructor •() → self::B1X
-    : super self::S::•()
-    ;
-}
-abstract class _B2X&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_B2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2X&S&M1&M2 extends self::_B2X&S&M1 implements self::M2 {
-  synthetic constructor •() → self::_B2X&S&M1&M2
-    : super self::_B2X&S&M1::•()
-    ;
-}
-abstract class _B2X&S&M1&M2&M extends self::_B2X&S&M1&M2 implements self::M {
-  synthetic constructor •() → self::_B2X&S&M1&M2&M
-    : super self::_B2X&S&M1&M2::•()
-    ;
-  method foo() → dynamic {}
-}
-abstract class _B2X&S&M1&M2&M&MX extends self::_B2X&S&M1&M2&M implements self::MX {
-  synthetic constructor •() → self::_B2X&S&M1&M2&M&MX
-    : super self::_B2X&S&M1&M2&M::•()
-    ;
-}
-class B2X extends self::_B2X&S&M1&M2&M&MX {
-  synthetic constructor •() → self::B2X
-    : super self::S::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.legacy.expect b/pkg/front_end/testcases/mixin_application_override.dart.legacy.expect
new file mode 100644
index 0000000..52129f0
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_application_override.dart.legacy.expect
@@ -0,0 +1,334 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:21:7: Context: Override was introduced in the mixin application class 'A0'.
+// class A0 = S with M;
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:22:7: Context: Override was introduced in the mixin application class 'A1'.
+// class A1 = S with M1, M;
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:23:7: Context: Override was introduced in the mixin application class 'A2'.
+// class A2 = S with M1, M2, M;
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:25:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class A0X = S with M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:26:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class A1X = S with M1, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:27:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class A2X = S with M1, M2, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:29:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0 extends S with M {}
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:31:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1 extends S with M1, M {}
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:33:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2 extends S with M1, M2, M {}
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:35:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0X extends S with M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:37:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1X extends S with M1, M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:39:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2X extends S with M1, M2, M, MX {}
+//       ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class S extends core::Object {
+  synthetic constructor •() → self::S
+    : super core::Object::•()
+    ;
+  method foo([dynamic x = null]) → dynamic {}
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+}
+class MX extends core::Object {
+  synthetic constructor •() → self::MX
+    : super core::Object::•()
+    ;
+}
+class A0 = self::S with self::M {
+  synthetic constructor •() → self::A0
+    : super self::S::•()
+    ;
+}
+abstract class _A1&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_A1&S&M1
+    : super self::S::•()
+    ;
+}
+class A1 = self::_A1&S&M1 with self::M {
+  synthetic constructor •() → self::A1
+    : super self::_A1&S&M1::•()
+    ;
+}
+abstract class _A2&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_A2&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
+  synthetic constructor •() → self::_A2&S&M1&M2
+    : super self::_A2&S&M1::•()
+    ;
+}
+class A2 = self::_A2&S&M1&M2 with self::M {
+  synthetic constructor •() → self::A2
+    : super self::_A2&S&M1&M2::•()
+    ;
+}
+abstract class _A0X&S&M = self::S with self::M {
+  synthetic constructor •() → self::_A0X&S&M
+    : super self::S::•()
+    ;
+}
+class A0X = self::_A0X&S&M with self::MX {
+  synthetic constructor •() → self::A0X
+    : super self::_A0X&S&M::•()
+    ;
+}
+abstract class _A1X&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_A1X&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
+  synthetic constructor •() → self::_A1X&S&M1&M
+    : super self::_A1X&S&M1::•()
+    ;
+}
+class A1X = self::_A1X&S&M1&M with self::MX {
+  synthetic constructor •() → self::A1X
+    : super self::_A1X&S&M1&M::•()
+    ;
+}
+abstract class _A2X&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_A2X&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
+  synthetic constructor •() → self::_A2X&S&M1&M2
+    : super self::_A2X&S&M1::•()
+    ;
+}
+abstract class _A2X&S&M1&M2&M = self::_A2X&S&M1&M2 with self::M {
+  synthetic constructor •() → self::_A2X&S&M1&M2&M
+    : super self::_A2X&S&M1&M2::•()
+    ;
+}
+class A2X = self::_A2X&S&M1&M2&M with self::MX {
+  synthetic constructor •() → self::A2X
+    : super self::_A2X&S&M1&M2&M::•()
+    ;
+}
+abstract class _B0&S&M = self::S with self::M {
+  synthetic constructor •() → self::_B0&S&M
+    : super self::S::•()
+    ;
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0
+    : super self::_B0&S&M::•()
+    ;
+}
+abstract class _B1&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_B1&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
+  synthetic constructor •() → self::_B1&S&M1&M
+    : super self::_B1&S&M1::•()
+    ;
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1
+    : super self::_B1&S&M1&M::•()
+    ;
+}
+abstract class _B2&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_B2&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
+  synthetic constructor •() → self::_B2&S&M1&M2
+    : super self::_B2&S&M1::•()
+    ;
+}
+abstract class _B2&S&M1&M2&M = self::_B2&S&M1&M2 with self::M {
+  synthetic constructor •() → self::_B2&S&M1&M2&M
+    : super self::_B2&S&M1&M2::•()
+    ;
+}
+class B2 extends self::_B2&S&M1&M2&M {
+  synthetic constructor •() → self::B2
+    : super self::_B2&S&M1&M2&M::•()
+    ;
+}
+abstract class _B0X&S&M = self::S with self::M {
+  synthetic constructor •() → self::_B0X&S&M
+    : super self::S::•()
+    ;
+}
+abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
+  synthetic constructor •() → self::_B0X&S&M&MX
+    : super self::_B0X&S&M::•()
+    ;
+}
+class B0X extends self::_B0X&S&M&MX {
+  synthetic constructor •() → self::B0X
+    : super self::_B0X&S&M&MX::•()
+    ;
+}
+abstract class _B1X&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_B1X&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
+  synthetic constructor •() → self::_B1X&S&M1&M
+    : super self::_B1X&S&M1::•()
+    ;
+}
+abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
+  synthetic constructor •() → self::_B1X&S&M1&M&MX
+    : super self::_B1X&S&M1&M::•()
+    ;
+}
+class B1X extends self::_B1X&S&M1&M&MX {
+  synthetic constructor •() → self::B1X
+    : super self::_B1X&S&M1&M&MX::•()
+    ;
+}
+abstract class _B2X&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_B2X&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
+  synthetic constructor •() → self::_B2X&S&M1&M2
+    : super self::_B2X&S&M1::•()
+    ;
+}
+abstract class _B2X&S&M1&M2&M = self::_B2X&S&M1&M2 with self::M {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M
+    : super self::_B2X&S&M1&M2::•()
+    ;
+}
+abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M&MX
+    : super self::_B2X&S&M1&M2&M::•()
+    ;
+}
+class B2X extends self::_B2X&S&M1&M2&M&MX {
+  synthetic constructor •() → self::B2X
+    : super self::_B2X&S&M1&M2&M&MX::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_application_override.dart.legacy.transformed.expect
new file mode 100644
index 0000000..381523a
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_application_override.dart.legacy.transformed.expect
@@ -0,0 +1,224 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class S extends core::Object {
+  synthetic constructor •() → self::S
+    : super core::Object::•()
+    ;
+  method foo([dynamic x = null]) → dynamic {}
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1
+    : super core::Object::•()
+    ;
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2
+    : super core::Object::•()
+    ;
+}
+class MX extends core::Object {
+  synthetic constructor •() → self::MX
+    : super core::Object::•()
+    ;
+}
+class A0 extends self::S implements self::M {
+  synthetic constructor •() → self::A0
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _A1&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_A1&S&M1
+    : super self::S::•()
+    ;
+}
+class A1 extends self::_A1&S&M1 implements self::M {
+  synthetic constructor •() → self::A1
+    : super self::_A1&S&M1::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _A2&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_A2&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1&M2 extends self::_A2&S&M1 implements self::M2 {
+  synthetic constructor •() → self::_A2&S&M1&M2
+    : super self::_A2&S&M1::•()
+    ;
+}
+class A2 extends self::_A2&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::A2
+    : super self::_A2&S&M1&M2::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _A0X&S&M extends self::S implements self::M {
+  synthetic constructor •() → self::_A0X&S&M
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+class A0X extends self::_A0X&S&M implements self::MX {
+  synthetic constructor •() → self::A0X
+    : super self::_A0X&S&M::•()
+    ;
+}
+abstract class _A1X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_A1X&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1&M extends self::_A1X&S&M1 implements self::M {
+  synthetic constructor •() → self::_A1X&S&M1&M
+    : super self::_A1X&S&M1::•()
+    ;
+  method foo() → dynamic {}
+}
+class A1X extends self::_A1X&S&M1&M implements self::MX {
+  synthetic constructor •() → self::A1X
+    : super self::_A1X&S&M1&M::•()
+    ;
+}
+abstract class _A2X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_A2X&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1&M2 extends self::_A2X&S&M1 implements self::M2 {
+  synthetic constructor •() → self::_A2X&S&M1&M2
+    : super self::_A2X&S&M1::•()
+    ;
+}
+abstract class _A2X&S&M1&M2&M extends self::_A2X&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::_A2X&S&M1&M2&M
+    : super self::_A2X&S&M1&M2::•()
+    ;
+  method foo() → dynamic {}
+}
+class A2X extends self::_A2X&S&M1&M2&M implements self::MX {
+  synthetic constructor •() → self::A2X
+    : super self::_A2X&S&M1&M2&M::•()
+    ;
+}
+abstract class _B0&S&M extends self::S implements self::M {
+  synthetic constructor •() → self::_B0&S&M
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0
+    : super self::_B0&S&M::•()
+    ;
+}
+abstract class _B1&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_B1&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1&M extends self::_B1&S&M1 implements self::M {
+  synthetic constructor •() → self::_B1&S&M1&M
+    : super self::_B1&S&M1::•()
+    ;
+  method foo() → dynamic {}
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1
+    : super self::_B1&S&M1&M::•()
+    ;
+}
+abstract class _B2&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_B2&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1&M2 extends self::_B2&S&M1 implements self::M2 {
+  synthetic constructor •() → self::_B2&S&M1&M2
+    : super self::_B2&S&M1::•()
+    ;
+}
+abstract class _B2&S&M1&M2&M extends self::_B2&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::_B2&S&M1&M2&M
+    : super self::_B2&S&M1&M2::•()
+    ;
+  method foo() → dynamic {}
+}
+class B2 extends self::_B2&S&M1&M2&M {
+  synthetic constructor •() → self::B2
+    : super self::_B2&S&M1&M2&M::•()
+    ;
+}
+abstract class _B0X&S&M extends self::S implements self::M {
+  synthetic constructor •() → self::_B0X&S&M
+    : super self::S::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _B0X&S&M&MX extends self::_B0X&S&M implements self::MX {
+  synthetic constructor •() → self::_B0X&S&M&MX
+    : super self::_B0X&S&M::•()
+    ;
+}
+class B0X extends self::_B0X&S&M&MX {
+  synthetic constructor •() → self::B0X
+    : super self::_B0X&S&M&MX::•()
+    ;
+}
+abstract class _B1X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_B1X&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1&M extends self::_B1X&S&M1 implements self::M {
+  synthetic constructor •() → self::_B1X&S&M1&M
+    : super self::_B1X&S&M1::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _B1X&S&M1&M&MX extends self::_B1X&S&M1&M implements self::MX {
+  synthetic constructor •() → self::_B1X&S&M1&M&MX
+    : super self::_B1X&S&M1&M::•()
+    ;
+}
+class B1X extends self::_B1X&S&M1&M&MX {
+  synthetic constructor •() → self::B1X
+    : super self::_B1X&S&M1&M&MX::•()
+    ;
+}
+abstract class _B2X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_B2X&S&M1
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1&M2 extends self::_B2X&S&M1 implements self::M2 {
+  synthetic constructor •() → self::_B2X&S&M1&M2
+    : super self::_B2X&S&M1::•()
+    ;
+}
+abstract class _B2X&S&M1&M2&M extends self::_B2X&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M
+    : super self::_B2X&S&M1&M2::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _B2X&S&M1&M2&M&MX extends self::_B2X&S&M1&M2&M implements self::MX {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M&MX
+    : super self::_B2X&S&M1&M2&M::•()
+    ;
+}
+class B2X extends self::_B2X&S&M1&M2&M&MX {
+  synthetic constructor •() → self::B2X
+    : super self::_B2X&S&M1&M2&M&MX::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.outline.expect b/pkg/front_end/testcases/mixin_application_override.dart.outline.expect
index c54cc03..7d607e6 100644
--- a/pkg/front_end/testcases/mixin_application_override.dart.outline.expect
+++ b/pkg/front_end/testcases/mixin_application_override.dart.outline.expect
@@ -1,6 +1,6 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -10,7 +10,7 @@
 // class A0 = S with M;
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -20,7 +20,7 @@
 // class A1 = S with M1, M;
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -30,7 +30,7 @@
 // class A2 = S with M1, M2, M;
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -40,7 +40,7 @@
 // class A0X = S with M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -50,7 +50,7 @@
 // class A1X = S with M1, M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -60,7 +60,7 @@
 // class A2X = S with M1, M2, M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -70,7 +70,7 @@
 // class B0 extends S with M {}
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -80,7 +80,7 @@
 // class B1 extends S with M1, M {}
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -90,7 +90,7 @@
 // class B2 extends S with M1, M2, M {}
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -100,7 +100,7 @@
 // class B0X extends S with M, MX {}
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -110,7 +110,7 @@
 // class B1X extends S with M1, M, MX {}
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.strong.expect b/pkg/front_end/testcases/mixin_application_override.dart.strong.expect
index 2a70a41..c8c6a90 100644
--- a/pkg/front_end/testcases/mixin_application_override.dart.strong.expect
+++ b/pkg/front_end/testcases/mixin_application_override.dart.strong.expect
@@ -1,6 +1,6 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -10,7 +10,7 @@
 // class A0 = S with M;
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -20,7 +20,7 @@
 // class A1 = S with M1, M;
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -30,7 +30,7 @@
 // class A2 = S with M1, M2, M;
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -40,7 +40,7 @@
 // class A0X = S with M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -50,7 +50,7 @@
 // class A1X = S with M1, M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -60,7 +60,7 @@
 // class A2X = S with M1, M2, M, MX;
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -70,7 +70,7 @@
 // class B0 extends S with M {}
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -80,7 +80,7 @@
 // class B1 extends S with M1, M {}
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -90,7 +90,7 @@
 // class B2 extends S with M1, M2, M {}
 //       ^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -100,7 +100,7 @@
 // class B0X extends S with M, MX {}
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -110,7 +110,7 @@
 // class B1X extends S with M1, M, MX {}
 //       ^^^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 // pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
@@ -122,51 +122,51 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 //
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M::foo' has fewer positional arguments than those of overridden method 'S::foo'.
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
 //   foo() {}
 //   ^
 
@@ -290,7 +290,7 @@
 }
 class B0 extends self::_B0&S&M {
   synthetic constructor •() → self::B0
-    : super self::S::•()
+    : super self::_B0&S&M::•()
     ;
 }
 abstract class _B1&S&M1 = self::S with self::M1 {
@@ -306,7 +306,7 @@
 }
 class B1 extends self::_B1&S&M1&M {
   synthetic constructor •() → self::B1
-    : super self::S::•()
+    : super self::_B1&S&M1&M::•()
     ;
 }
 abstract class _B2&S&M1 = self::S with self::M1 {
@@ -327,7 +327,7 @@
 }
 class B2 extends self::_B2&S&M1&M2&M {
   synthetic constructor •() → self::B2
-    : super self::S::•()
+    : super self::_B2&S&M1&M2&M::•()
     ;
 }
 abstract class _B0X&S&M = self::S with self::M {
@@ -343,7 +343,7 @@
 }
 class B0X extends self::_B0X&S&M&MX {
   synthetic constructor •() → self::B0X
-    : super self::S::•()
+    : super self::_B0X&S&M&MX::•()
     ;
 }
 abstract class _B1X&S&M1 = self::S with self::M1 {
@@ -364,7 +364,7 @@
 }
 class B1X extends self::_B1X&S&M1&M&MX {
   synthetic constructor •() → self::B1X
-    : super self::S::•()
+    : super self::_B1X&S&M1&M&MX::•()
     ;
 }
 abstract class _B2X&S&M1 = self::S with self::M1 {
@@ -390,7 +390,7 @@
 }
 class B2X extends self::_B2X&S&M1&M2&M&MX {
   synthetic constructor •() → self::B2X
-    : super self::S::•()
+    : super self::_B2X&S&M1&M2&M&MX::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.direct.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.direct.expect
deleted file mode 100644
index daec74c..0000000
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.direct.expect
+++ /dev/null
@@ -1,43 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "package:expect/expect.dart" as exp;
-
-class C<T extends core::Object = dynamic> extends core::Object {
-  field core::String trace;
-  constructor •({dynamic a = 0, dynamic b = self::C::T}) → self::C<self::C::T>
-    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-class D = self::C<core::String> with self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::String}) → self::D
-    : super self::C::•(a: a, b: b)
-    ;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    : super self::C::•()
-    ;
-}
-abstract class _F&C&M = self::C<core::int> with self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::int}) → self::_F&C&M
-    : super self::C::•(a: a, b: b)
-    ;
-}
-class F extends self::_F&C&M {
-  synthetic constructor •() → self::F
-    : super self::C::•()
-    ;
-}
-static method main() → dynamic {
-  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<core::Object>().trace);
-  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().trace);
-  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().trace);
-  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().trace);
-  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().trace);
-}
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.direct.transformed.expect
deleted file mode 100644
index ce12709..0000000
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.direct.transformed.expect
+++ /dev/null
@@ -1,43 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "package:expect/expect.dart" as exp;
-
-class C<T extends core::Object = dynamic> extends core::Object {
-  field core::String trace;
-  constructor •({dynamic a = 0, dynamic b = self::C::T}) → self::C<self::C::T>
-    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-class D extends self::C<core::String> implements self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::String}) → self::D
-    : super self::C::•(a: a, b: b)
-    ;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    : super self::C::•()
-    ;
-}
-abstract class _F&C&M extends self::C<core::int> implements self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::int}) → self::_F&C&M
-    : super self::C::•(a: a, b: b)
-    ;
-}
-class F extends self::_F&C&M {
-  synthetic constructor •() → self::F
-    : super self::C::•()
-    ;
-}
-static method main() → dynamic {
-  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<core::Object>().trace);
-  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().trace);
-  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().trace);
-  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().trace);
-  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().trace);
-}
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.expect
new file mode 100644
index 0000000..b9d9373
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+class C<T extends core::Object = dynamic> extends core::Object {
+  field core::String trace;
+  constructor •({dynamic a = 0, dynamic b = self::C::T}) → self::C<self::C::T>
+    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+}
+class D = self::C<core::String> with self::M {
+  synthetic constructor •({dynamic a = 0, dynamic b = core::String}) → self::D
+    : super self::C::•(a: a, b: b)
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E
+    : super self::D::•()
+    ;
+}
+abstract class _F&C&M = self::C<core::int> with self::M {
+  synthetic constructor •({dynamic a = 0, dynamic b = core::int}) → self::_F&C&M
+    : super self::C::•(a: a, b: b)
+    ;
+}
+class F extends self::_F&C&M {
+  synthetic constructor •() → self::F
+    : super self::_F&C&M::•()
+    ;
+}
+static method main() → dynamic {
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<core::Object>().trace);
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().trace);
+  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().trace);
+  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().trace);
+  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().trace);
+}
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3e9f1e9
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.transformed.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+class C<T extends core::Object = dynamic> extends core::Object {
+  field core::String trace;
+  constructor •({dynamic a = 0, dynamic b = self::C::T}) → self::C<self::C::T>
+    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+}
+class D extends self::C<core::String> implements self::M {
+  synthetic constructor •({dynamic a = 0, dynamic b = core::String}) → self::D
+    : super self::C::•(a: a, b: b)
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E
+    : super self::D::•()
+    ;
+}
+abstract class _F&C&M extends self::C<core::int> implements self::M {
+  synthetic constructor •({dynamic a = 0, dynamic b = core::int}) → self::_F&C&M
+    : super self::C::•(a: a, b: b)
+    ;
+}
+class F extends self::_F&C&M {
+  synthetic constructor •() → self::F
+    : super self::_F&C&M::•()
+    ;
+}
+static method main() → dynamic {
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<core::Object>().trace);
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().trace);
+  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().trace);
+  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().trace);
+  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().trace);
+}
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.expect
index c3bb2f6..67701f2 100644
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.expect
@@ -21,7 +21,7 @@
 }
 class E extends self::D {
   synthetic constructor •() → self::E
-    : super self::C::•()
+    : super self::D::•()
     ;
 }
 abstract class _F&C&M = self::C<core::int> with self::M {
@@ -31,7 +31,7 @@
 }
 class F extends self::_F&C&M {
   synthetic constructor •() → self::F
-    : super self::C::•()
+    : super self::_F&C&M::•()
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.transformed.expect
index 97235bc..e52a7ff 100644
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
 }
 class E extends self::D {
   synthetic constructor •() → self::E
-    : super self::C::•()
+    : super self::D::•()
     ;
 }
 abstract class _F&C&M extends self::C<core::int> implements self::M {
@@ -31,7 +31,7 @@
 }
 class F extends self::_F&C&M {
   synthetic constructor •() → self::F
-    : super self::C::•()
+    : super self::_F&C&M::•()
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect
deleted file mode 100644
index 0efea2e..0000000
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class C<T extends self::A = dynamic> extends core::Object {
-  field self::C::T _field = null;
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  method foo(self::C::T x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-class D extends self::C<self::B> {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-abstract class _Foo&Object&C = core::Object with self::C<self::B> {
-  synthetic constructor •() → self::_Foo&Object&C
-    : super core::Object::•()
-    ;
-}
-class Foo extends self::_Foo&Object&C {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic foo = new self::Foo::•();
-  foo.foo(new self::B::•());
-}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect
deleted file mode 100644
index 43b415d..0000000
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.direct.transformed.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class C<T extends self::A = dynamic> extends core::Object {
-  field self::C::T _field = null;
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  method foo(self::C::T x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-class D extends self::C<self::B> {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-abstract class _Foo&Object&C extends core::Object implements self::C<self::B> {
-  field self::B _field = null;
-  synthetic constructor •() → self::_Foo&Object&C
-    : super core::Object::•()
-    ;
-  method foo(self::B x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-class Foo extends self::_Foo&Object&C {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic foo = new self::Foo::•();
-  foo.foo(new self::B::•());
-}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
new file mode 100644
index 0000000..fb518e4
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class C<T extends self::A = dynamic> extends core::Object {
+  field self::C::T _field = null;
+  synthetic constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+  method foo(self::C::T x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+class D extends self::C<self::B> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+}
+abstract class _Foo&Object&C = core::Object with self::C<self::B> {
+  synthetic constructor •() → self::_Foo&Object&C
+    : super core::Object::•()
+    ;
+}
+class Foo extends self::_Foo&Object&C {
+  synthetic constructor •() → self::Foo
+    : super self::_Foo&Object&C::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic foo = new self::Foo::•();
+  foo.foo(new self::B::•());
+}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9db2af2
--- /dev/null
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class C<T extends self::A = dynamic> extends core::Object {
+  field self::C::T _field = null;
+  synthetic constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+  method foo(self::C::T x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+class D extends self::C<self::B> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+}
+abstract class _Foo&Object&C extends core::Object implements self::C<self::B> {
+  field self::B _field = null;
+  synthetic constructor •() → self::_Foo&Object&C
+    : super core::Object::•()
+    ;
+  method foo(self::B x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+class Foo extends self::_Foo&Object&C {
+  synthetic constructor •() → self::Foo
+    : super self::_Foo&Object&C::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic foo = new self::Foo::•();
+  foo.foo(new self::B::•());
+}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
index 0b74544..b73697b 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
@@ -28,7 +28,7 @@
 }
 class Foo extends self::_Foo&Object&C {
   synthetic constructor •() → self::Foo
-    : super core::Object::•()
+    : super self::_Foo&Object&C::•()
     ;
 }
 class B extends self::A {
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
index bab35f4..6b38260 100644
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
@@ -32,7 +32,7 @@
 }
 class Foo extends self::_Foo&Object&C {
   synthetic constructor •() → self::Foo
-    : super core::Object::•()
+    : super self::_Foo&Object&C::•()
     ;
 }
 class B extends self::A {
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.direct.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/mixin_super_repeated.dart.direct.expect
rename to pkg/front_end/testcases/mixin_super_repeated.dart.legacy.expect
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.direct.transformed.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/mixin_super_repeated.dart.direct.transformed.expect
rename to pkg/front_end/testcases/mixin_super_repeated.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/named_function_scope.dart.direct.expect b/pkg/front_end/testcases/named_function_scope.dart.direct.expect
deleted file mode 100644
index f72549c..0000000
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.expect
+++ /dev/null
@@ -1,188 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-//     var x = /*@error=NamedFunctionExpression*/ T() {};
-//                                                ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:31:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-//     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-//                                                 ^
-// pkg/front_end/testcases/named_function_scope.dart:36:52: Context: Previous use of 'V'.
-//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-//         T() {};
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-//         T() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:45:9: Context: Previous use of 'T'.
-//         T
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:54:5: Context: Previous use of 'V'.
-//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//         ^
-// pkg/front_end/testcases/named_function_scope.dart:62:52: Context: Previous declaration of 'T'.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//                                                    ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:71:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:75:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//                                               ^
-// pkg/front_end/testcases/named_function_scope.dart:80:5: Context: Previous use of 'T'.
-//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:83:32: Warning: 'T' isn't a type.
-//     void T(/*@error=NotAType*/ T t) {}
-//                                ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-//     var x = /*@error=NamedFunctionExpression*/ T() {};
-//                                                ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-//         T() {};
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//         ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class T extends core::Object {
-  synthetic constructor •() → self::T
-    : super core::Object::•()
-    ;
-}
-class V extends core::Object {
-  synthetic constructor •() → self::V
-    : super core::Object::•()
-    ;
-}
-static method test() → dynamic {
-  self::T t;
-  self::V v;
-  {
-    function T() → dynamic {}
-  }
-  {
-    dynamic v;
-  }
-  {
-    self::T t;
-    dynamic x = let final () → dynamic T = () → dynamic {} in T;
-  }
-  {
-    self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                                ^";
-  }
-  {
-    self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-                                                ^" in null;
-  }
-  {
-    dynamic x = let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-        T() {};
-        ^" in let final () → self::T T = () → self::T {} in T;
-  }
-  {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                              ^";
-  }
-  {
-    dynamic x = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
-  }
-  {
-    self::T t;
-    {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
-      function T() → self::T {}
-    }
-  }
-  {
-    {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
-      function T() → self::T {}
-    }
-  }
-  {
-    self::T t;
-    {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
-      function T(self::T t) → self::T {}
-    }
-  }
-  {
-    {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
-      function T(self::T t) → self::T {}
-    }
-  }
-  {
-    function T(invalid-type t) → void {}
-  }
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
deleted file mode 100644
index 08b6a24..0000000
--- a/pkg/front_end/testcases/named_function_scope.dart.direct.transformed.expect
+++ /dev/null
@@ -1,107 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
-//     var x = /*@error=NamedFunctionExpression*/ T() {};
-//                                                ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
-//         T() {};
-//         ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
-//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-//         ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class T extends core::Object {
-  synthetic constructor •() → self::T
-    : super core::Object::•()
-    ;
-}
-class V extends core::Object {
-  synthetic constructor •() → self::V
-    : super core::Object::•()
-    ;
-}
-static method test() → dynamic {
-  self::T t;
-  self::V v;
-  {
-    function T() → dynamic {}
-  }
-  {
-    dynamic v;
-  }
-  {
-    self::T t;
-    dynamic x = let final () → dynamic T = () → dynamic {} in T;
-  }
-  {
-    self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                                ^";
-  }
-  {
-    self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
-    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
-                                                ^" in null;
-  }
-  {
-    dynamic x = let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
-        T() {};
-        ^" in let final () → self::T T = () → self::T {} in T;
-  }
-  {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
-    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
-                                              ^";
-  }
-  {
-    dynamic x = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
-        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
-        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
-  }
-  {
-    self::T t;
-    {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
-      function T() → self::T {}
-    }
-  }
-  {
-    {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
-                                              ^";
-      function T() → self::T {}
-    }
-  }
-  {
-    self::T t;
-    {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
-      function T(self::T t) → self::T {}
-    }
-  }
-  {
-    {
-      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
-    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
-                                              ^";
-      function T(self::T t) → self::T {}
-    }
-  }
-  {
-    function T(invalid-type t) → void {}
-  }
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/named_function_scope.dart.legacy.expect b/pkg/front_end/testcases/named_function_scope.dart.legacy.expect
new file mode 100644
index 0000000..434f796
--- /dev/null
+++ b/pkg/front_end/testcases/named_function_scope.dart.legacy.expect
@@ -0,0 +1,188 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
+//     var /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//                                                 ^
+// pkg/front_end/testcases/named_function_scope.dart:31:52: Context: Previous use of 'V'.
+//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
+//     var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
+//                                                 ^
+// pkg/front_end/testcases/named_function_scope.dart:36:52: Context: Previous use of 'V'.
+//     /*@context=DuplicatedNamePreviouslyUsedCause*/ V  v;
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
+//         T() {};
+//         ^
+// pkg/front_end/testcases/named_function_scope.dart:45:9: Context: Previous use of 'T'.
+//         T
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
+//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:54:5: Context: Previous use of 'V'.
+//     V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//         ^
+// pkg/front_end/testcases/named_function_scope.dart:62:52: Context: Previous declaration of 'T'.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//                                                    ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:66:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:71:5: Context: Previous use of 'T'.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:75:5: Context: Previous use of 'T'.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//                                               ^
+// pkg/front_end/testcases/named_function_scope.dart:80:5: Context: Previous use of 'T'.
+//     T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+//     ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:83:32: Warning: 'T' isn't a type.
+//     void T(/*@error=NotAType*/ T t) {}
+//                                ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class T extends core::Object {
+  synthetic constructor •() → self::T
+    : super core::Object::•()
+    ;
+}
+class V extends core::Object {
+  synthetic constructor •() → self::V
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  self::T t;
+  self::V v;
+  {
+    function T() → dynamic {}
+  }
+  {
+    dynamic v;
+  }
+  {
+    self::T t;
+    dynamic x = let final () → dynamic T = () → dynamic {} in T;
+  }
+  {
+    self::V v;
+    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
+    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
+                                                ^";
+  }
+  {
+    self::V v;
+    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
+    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
+                                                ^" in null;
+  }
+  {
+    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
+        T() {};
+        ^" in let final () → self::T T = () → self::T {} in T;
+  }
+  {
+    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
+    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+                                              ^";
+  }
+  {
+    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
+        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
+  }
+  {
+    self::T t;
+    {
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
+    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+                                              ^";
+      function T() → self::T {}
+    }
+  }
+  {
+    {
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
+    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+                                              ^";
+      function T() → self::T {}
+    }
+  }
+  {
+    self::T t;
+    {
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
+    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+                                              ^";
+      function T(self::T t) → self::T {}
+    }
+  }
+  {
+    {
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
+    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+                                              ^";
+      function T(self::T t) → self::T {}
+    }
+  }
+  {
+    function T(invalid-type t) → void {}
+  }
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/named_function_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5a63c13
--- /dev/null
+++ b/pkg/front_end/testcases/named_function_scope.dart.legacy.transformed.expect
@@ -0,0 +1,107 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/named_function_scope.dart:28:48: Error: A function expression can't have a name.
+//     var x = /*@error=NamedFunctionExpression*/ T() {};
+//                                                ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:48:9: Error: A function expression can't have a name.
+//         T() {};
+//         ^
+//
+// pkg/front_end/testcases/named_function_scope.dart:62:9: Error: A function expression can't have a name.
+//         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class T extends core::Object {
+  synthetic constructor •() → self::T
+    : super core::Object::•()
+    ;
+}
+class V extends core::Object {
+  synthetic constructor •() → self::V
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  self::T t;
+  self::V v;
+  {
+    function T() → dynamic {}
+  }
+  {
+    dynamic v;
+  }
+  {
+    self::T t;
+    dynamic x = let final () → dynamic T = () → dynamic {} in T;
+  }
+  {
+    self::V v;
+    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:33:49: Error: Can't declare 'V' because it was already used in this scope.
+    var /*@error=DuplicatedNamePreviouslyUsed*/ V;
+                                                ^";
+  }
+  {
+    self::V v;
+    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:38:49: Error: Can't declare 'V' because it was already used in this scope.
+    var /*@error=DuplicatedNamePreviouslyUsed*/ V = null;
+                                                ^" in null;
+  }
+  {
+    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
+        T() {};
+        ^" in let final () → self::T T = () → self::T {} in T;
+  }
+  {
+    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:54:47: Error: Can't declare 'V' because it was already used in this scope.
+    V /*@error=DuplicatedNamePreviouslyUsed*/ V;
+                                              ^";
+  }
+  {
+    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
+        T< /*@context=DuplicatedDeclarationCause*/ T>() {};
+        ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
+  }
+  {
+    self::T t;
+    {
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:67:47: Error: Can't declare 'T' because it was already used in this scope.
+    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+                                              ^";
+      function T() → self::T {}
+    }
+  }
+  {
+    {
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:71:47: Error: Can't declare 'T' because it was already used in this scope.
+    T /*@error=DuplicatedNamePreviouslyUsed*/ T() {}
+                                              ^";
+      function T() → self::T {}
+    }
+  }
+  {
+    self::T t;
+    {
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:76:47: Error: Can't declare 'T' because it was already used in this scope.
+    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+                                              ^";
+      function T(self::T t) → self::T {}
+    }
+  }
+  {
+    {
+      invalid-expression "pkg/front_end/testcases/named_function_scope.dart:80:47: Error: Can't declare 'T' because it was already used in this scope.
+    T /*@error=DuplicatedNamePreviouslyUsed*/ T(T t) {}
+                                              ^";
+      function T(self::T t) → self::T {}
+    }
+  }
+  {
+    function T(invalid-type t) → void {}
+  }
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/named_function_scope.dart.strong.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
index e178628..4a5f48d 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
@@ -137,7 +137,7 @@
                                                 ^" in null;
   }
   {
-    dynamic x = let final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
+    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
         T() {};
         ^" in let final () → self::T T = () → self::T {} in T;
   }
@@ -147,7 +147,7 @@
                                               ^" as{TypeError} self::V;
   }
   {
-    dynamic x = let final dynamic #t3 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
+    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
         ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
diff --git a/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
index 4405962..d3e6f09 100644
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
@@ -56,7 +56,7 @@
                                                 ^" in null;
   }
   {
-    dynamic x = let final dynamic #t2 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
+    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:48:9: Error: Can't declare 'T' because it was already used in this scope.
         T() {};
         ^" in let final () → self::T T = () → self::T {} in T;
   }
@@ -66,7 +66,7 @@
                                               ^" as{TypeError} self::V;
   }
   {
-    dynamic x = let final dynamic #t3 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
+    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:62:9: Error: 'T' is already declared in this scope.
         T< /*@context=DuplicatedDeclarationCause*/ T>() {};
         ^" in let final <T extends core::Object = dynamic>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
   }
diff --git a/pkg/front_end/testcases/named_parameters.dart.direct.expect b/pkg/front_end/testcases/named_parameters.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/named_parameters.dart.direct.expect
rename to pkg/front_end/testcases/named_parameters.dart.legacy.expect
diff --git a/pkg/front_end/testcases/named_parameters.dart.strong.expect b/pkg/front_end/testcases/named_parameters.dart.strong.expect
index ad415f8..2a59b49 100644
--- a/pkg/front_end/testcases/named_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/named_parameters.dart.strong.expect
@@ -2,19 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class Superclass extends core::Object {
-  constructor •() → void
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass
     : super core::Object::•()
     ;
-  abstract method foo({dynamic alpha, dynamic beta}) → dynamic;
+  method foo({dynamic alpha = null, dynamic beta = null}) → dynamic {}
+  method bar({dynamic beta = null, dynamic alpha = null}) → dynamic {}
+  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {
+    callback.call(alpha: "one", beta: 2);
+    callback.call(beta: 1, alpha: "two");
+  }
 }
 class Subclass extends self::Superclass {
-  constructor •() → void
+  synthetic constructor •() → self::Subclass
     : super self::Superclass::•()
     ;
-  method foo({dynamic beta, dynamic alpha}) → dynamic {}
+  method foo({dynamic beta = null, dynamic alpha = null}) → dynamic {}
+  method bar({dynamic alpha = null, dynamic beta = null}) → dynamic {}
+  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {}
 }
-static method topLevelNamed(dynamic beta, dynamic alpha, {dynamic gamma, dynamic delta}) → dynamic {}
+static method topLevelNamed(dynamic beta, dynamic alpha, {dynamic gamma = null, dynamic delta = null}) → dynamic {}
+static method topLevelOptional(dynamic beta, dynamic alpha, [dynamic gamma = null, dynamic delta = null]) → dynamic {}
 static method main() → dynamic {
   new self::Subclass::•().{self::Subclass::foo}(beta: 1, alpha: 2);
   new self::Subclass::•().{self::Subclass::foo}(alpha: 1, beta: 2);
diff --git a/pkg/front_end/testcases/named_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/named_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..2a59b49
--- /dev/null
+++ b/pkg/front_end/testcases/named_parameters.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass
+    : super core::Object::•()
+    ;
+  method foo({dynamic alpha = null, dynamic beta = null}) → dynamic {}
+  method bar({dynamic beta = null, dynamic alpha = null}) → dynamic {}
+  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {
+    callback.call(alpha: "one", beta: 2);
+    callback.call(beta: 1, alpha: "two");
+  }
+}
+class Subclass extends self::Superclass {
+  synthetic constructor •() → self::Subclass
+    : super self::Superclass::•()
+    ;
+  method foo({dynamic beta = null, dynamic alpha = null}) → dynamic {}
+  method bar({dynamic alpha = null, dynamic beta = null}) → dynamic {}
+  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {}
+}
+static method topLevelNamed(dynamic beta, dynamic alpha, {dynamic gamma = null, dynamic delta = null}) → dynamic {}
+static method topLevelOptional(dynamic beta, dynamic alpha, [dynamic gamma = null, dynamic delta = null]) → dynamic {}
+static method main() → dynamic {
+  new self::Subclass::•().{self::Subclass::foo}(beta: 1, alpha: 2);
+  new self::Subclass::•().{self::Subclass::foo}(alpha: 1, beta: 2);
+  self::topLevelNamed(1, 2, gamma: 3, delta: 4);
+  self::topLevelNamed(1, 2, delta: 3, gamma: 4);
+}
diff --git a/pkg/front_end/testcases/native_as_name.dart.direct.expect b/pkg/front_end/testcases/native_as_name.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/native_as_name.dart.direct.expect
rename to pkg/front_end/testcases/native_as_name.dart.legacy.expect
diff --git a/pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect b/pkg/front_end/testcases/native_as_name.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/native_as_name.dart.direct.transformed.expect
rename to pkg/front_end/testcases/native_as_name.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.expect
rename to pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.expect
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.transformed.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.direct.transformed.expect
rename to pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/new_const_insertion/simple.dart.direct.expect
rename to pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.expect
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.direct.transformed.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/new_const_insertion/simple.dart.direct.transformed.expect
rename to pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
deleted file mode 100644
index ef2820d..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method noSuchMethod(dynamic i) → dynamic {
-    self::count = self::count.+(1);
-    return null;
-  }
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-abstract class _C&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_C&Object&B
-    : super core::Object::•()
-    ;
-}
-class C extends self::_C&Object&B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  get foo() → core::int
-    return 42;
-  set foo(core::int value) → void {}
-}
-static field core::int count = 0;
-static method main() → dynamic {
-  dynamic c = new self::C::•();
-  if(!c.foo.==(42)) {
-    throw "Value mismatch: c.foo != 42.";
-  }
-  c.foo = 43;
-  if(!self::count.==(0)) {
-    throw "Value mismatch: count != 0";
-  }
-}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
deleted file mode 100644
index 6a81396..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.direct.transformed.expect
+++ /dev/null
@@ -1,51 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method noSuchMethod(dynamic i) → dynamic {
-    self::count = self::count.+(1);
-    return null;
-  }
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-abstract class _C&Object&B extends core::Object implements self::B {
-  synthetic constructor •() → self::_C&Object&B
-    : super core::Object::•()
-    ;
-  method noSuchMethod(dynamic i) → dynamic {
-    self::count = self::count.+(1);
-    return null;
-  }
-}
-class C extends self::_C&Object&B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  get foo() → core::int
-    return 42;
-  set foo(core::int value) → void {}
-}
-static field core::int count = 0;
-static method main() → dynamic {
-  dynamic c = new self::C::•();
-  if(!c.foo.==(42)) {
-    throw "Value mismatch: c.foo != 42.";
-  }
-  c.foo = 43;
-  if(!self::count.==(0)) {
-    throw "Value mismatch: count != 0";
-  }
-}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.expect
new file mode 100644
index 0000000..0e0e756
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.expect
@@ -0,0 +1,47 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+abstract class _C&Object&B = core::Object with self::B {
+  const synthetic constructor •() → self::_C&Object&B
+    : super core::Object::•()
+    ;
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → self::C
+    : super self::_C&Object&B::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  if(!c.foo.==(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.foo = 43;
+  if(!self::count.==(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e0f993c
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  field core::int foo = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object implements self::A {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+  no-such-method-forwarder get foo() → core::int
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder set foo(core::int value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+abstract class _C&Object&B extends core::Object implements self::B {
+  const synthetic constructor •() → self::_C&Object&B
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic i) → dynamic {
+    self::count = self::count.+(1);
+    return null;
+  }
+}
+class C extends self::_C&Object&B {
+  synthetic constructor •() → self::C
+    : super self::_C&Object&B::•()
+    ;
+  get foo() → core::int
+    return 42;
+  set foo(core::int value) → void {}
+}
+static field core::int count = 0;
+static method main() → dynamic {
+  dynamic c = new self::C::•();
+  if(!c.foo.==(42)) {
+    throw "Value mismatch: c.foo != 42.";
+  }
+  c.foo = 43;
+  if(!self::count.==(0)) {
+    throw "Value mismatch: count != 0";
+  }
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
index 563fd5e..d92df10 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
@@ -18,7 +18,7 @@
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _C&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_C&Object&B
+  const synthetic constructor •() → self::_C&Object&B
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
index b00b8c0..44c8cbf 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
@@ -22,13 +22,13 @@
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _C&Object&B = core::Object with self::B {
-  synthetic constructor •() → self::_C&Object&B
+  const synthetic constructor •() → self::_C&Object&B
     : super core::Object::•()
     ;
 }
 class C extends self::_C&Object&B {
   synthetic constructor •() → self::C
-    : super core::Object::•()
+    : super self::_C&Object&B::•()
     ;
   get foo() → core::int
     return 42;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
index 72a6cef..0685d8a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _C&Object&B extends core::Object implements self::B {
-  synthetic constructor •() → self::_C&Object&B
+  const synthetic constructor •() → self::_C&Object&B
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -32,7 +32,7 @@
 }
 class C extends self::_C&Object&B {
   synthetic constructor •() → self::C
-    : super core::Object::•()
+    : super self::_C&Object&B::•()
     ;
   get foo() → core::int
     return 42;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect
deleted file mode 100644
index 5881215..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  abstract method foo() → dynamic;
-}
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method noSuchMethod(dynamic _) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → dynamic
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-}
-abstract class _C&A&B = self::A with self::B {
-  synthetic constructor •() → self::_C&A&B
-    : super self::A::•()
-    ;
-}
-class C extends self::_C&A&B {
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect
deleted file mode 100644
index 32a808d..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.direct.transformed.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  abstract method foo() → dynamic;
-}
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method noSuchMethod(dynamic _) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → dynamic
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-}
-abstract class _C&A&B extends self::A implements self::B {
-  synthetic constructor •() → self::_C&A&B
-    : super self::A::•()
-    ;
-  method noSuchMethod(dynamic _) → dynamic
-    return null;
-}
-class C extends self::_C&A&B {
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.expect
new file mode 100644
index 0000000..521bedd
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  abstract method foo() → dynamic;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class B extends core::Object implements self::I {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → dynamic
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+}
+abstract class _C&A&B = self::A with self::B {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → self::C
+    : super self::_C&A&B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.transformed.expect
new file mode 100644
index 0000000..528ca88
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.transformed.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  abstract method foo() → dynamic;
+}
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class B extends core::Object implements self::I {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → dynamic
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+}
+abstract class _C&A&B extends self::A implements self::B {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+  method noSuchMethod(dynamic _) → dynamic
+    return null;
+}
+class C extends self::_C&A&B {
+  synthetic constructor •() → self::C
+    : super self::_C&A&B::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect
index 1418146..b71a516 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect
@@ -30,7 +30,7 @@
 }
 class C extends self::_C&A&B {
   synthetic constructor •() → self::C
-    : super self::A::•()
+    : super self::_C&A&B::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect
index 193af7a..7cd29a7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect
@@ -32,7 +32,7 @@
 }
 class C extends self::_C&A&B {
   synthetic constructor •() → self::C
-    : super self::A::•()
+    : super self::_C&A&B::•()
     ;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.type_promotion.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.type_promotion.expect
new file mode 100644
index 0000000..8dc5a4c
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart:34:14: Context: Write to value@1053
+  if ((value = b.foo()) != "baz") {
+             ^
+pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart:37:14: Context: Write to value@1053
+  if ((value = b.hest()) != 42) {
+             ^
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect
deleted file mode 100644
index a385598..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-abstract class _B&Object&A = core::Object with self::A {
-  synthetic constructor •() → self::_B&Object&A
-    : super core::Object::•()
-    ;
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect
deleted file mode 100644
index eda31a1..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.direct.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  abstract method foo() → void;
-}
-class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-abstract class _B&Object&A extends core::Object implements self::A {
-  synthetic constructor •() → self::_B&Object&A
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.expect
new file mode 100644
index 0000000..d4ed912
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+abstract class _B&Object&A = core::Object with self::A {
+  const synthetic constructor •() → self::_B&Object&A
+    : super core::Object::•()
+    ;
+}
+class B extends self::_B&Object&A {
+  synthetic constructor •() → self::B
+    : super self::_B&Object&A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a14c6c9
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  abstract method foo() → void;
+}
+class A extends core::Object implements self::I {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+abstract class _B&Object&A extends core::Object implements self::A {
+  const synthetic constructor •() → self::_B&Object&A
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+}
+class B extends self::_B&Object&A {
+  synthetic constructor •() → self::B
+    : super self::_B&Object&A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
index a8727f8..93b22a1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
@@ -16,7 +16,7 @@
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _B&Object&A = core::Object with self::A {
-  synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
index a385598..d4ed912 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
@@ -18,13 +18,13 @@
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _B&Object&A = core::Object with self::A {
-  synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&A {
   synthetic constructor •() → self::B
-    : super core::Object::•()
+    : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
index eda31a1..a14c6c9 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
@@ -18,7 +18,7 @@
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _B&Object&A extends core::Object implements self::A {
-  synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -26,7 +26,7 @@
 }
 class B extends self::_B&Object&A {
   synthetic constructor •() → self::B
-    : super core::Object::•()
+    : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.expect
deleted file mode 100644
index a86290b..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-}
-abstract class _A&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_A&Object&M
-    : super core::Object::•()
-    ;
-}
-class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-abstract class _B&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_B&Object&M
-    : super core::Object::•()
-    ;
-}
-class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.transformed.expect
deleted file mode 100644
index 6d9efb3..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.direct.transformed.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-  no-such-method-forwarder method foo() → void
-    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-}
-abstract class _A&Object&M extends core::Object implements self::M {
-  synthetic constructor •() → self::_A&Object&M
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-}
-class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-abstract class _B&Object&M extends core::Object implements self::M {
-  synthetic constructor •() → self::_B&Object&M
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-}
-class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.expect
new file mode 100644
index 0000000..3dfcd26
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → void
+    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+}
+abstract class _A&Object&M = core::Object with self::M {
+  const synthetic constructor •() → self::_A&Object&M
+    : super core::Object::•()
+    ;
+}
+class A extends self::_A&Object&M implements self::I {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+abstract class _B&Object&M = core::Object with self::M {
+  const synthetic constructor •() → self::_B&Object&M
+    : super core::Object::•()
+    ;
+}
+class B extends self::_B&Object&M implements self::I {
+  synthetic constructor •() → self::B
+    : super self::_B&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4fcf0c6
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.transformed.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class I extends core::Object {
+  synthetic constructor •() → self::I
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+  no-such-method-forwarder method foo() → void
+    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+}
+abstract class _A&Object&M extends core::Object implements self::M {
+  const synthetic constructor •() → self::_A&Object&M
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+}
+class A extends self::_A&Object&M implements self::I {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+abstract class _B&Object&M extends core::Object implements self::M {
+  const synthetic constructor •() → self::_B&Object&M
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+}
+class B extends self::_B&Object&M implements self::I {
+  synthetic constructor •() → self::B
+    : super self::_B&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
index bcda192..a887c64 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
@@ -17,7 +17,7 @@
     ;
 }
 abstract class _A&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M
     : super core::Object::•()
     ;
 }
@@ -28,7 +28,7 @@
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _B&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_B&Object&M
+  const synthetic constructor •() → self::_B&Object&M
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.expect
index a86290b..3dfcd26 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.expect
@@ -19,25 +19,25 @@
     return null;
 }
 abstract class _A&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M
     : super core::Object::•()
     ;
 }
 class A extends self::_A&Object&M implements self::I {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _B&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_B&Object&M
+  const synthetic constructor •() → self::_B&Object&M
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&M implements self::I {
   synthetic constructor •() → self::B
-    : super core::Object::•()
+    : super self::_B&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.transformed.expect
index 6d9efb3..4fcf0c6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
     return null;
 }
 abstract class _A&Object&M extends core::Object implements self::M {
-  synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -27,13 +27,13 @@
 }
 class A extends self::_A&Object&M implements self::I {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
 }
 abstract class _B&Object&M extends core::Object implements self::M {
-  synthetic constructor •() → self::_B&Object&M
+  const synthetic constructor •() → self::_B&Object&M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic
@@ -41,7 +41,7 @@
 }
 class B extends self::_B&Object&M implements self::I {
   synthetic constructor •() → self::B
-    : super core::Object::•()
+    : super self::_B&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.expect
deleted file mode 100644
index 3155d8f..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    return null;
-  }
-}
-abstract class _B&Object&A = core::Object with self::A {
-  synthetic constructor •() → self::_B&Object&A
-    : super core::Object::•()
-    ;
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.transformed.expect
deleted file mode 100644
index d91cc25..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.direct.transformed.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    return null;
-  }
-}
-abstract class _B&Object&A extends core::Object implements self::A {
-  synthetic constructor •() → self::_B&Object&A
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    return null;
-  }
-}
-class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.expect
new file mode 100644
index 0000000..3ca45b1
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    return null;
+  }
+}
+abstract class _B&Object&A = core::Object with self::A {
+  const synthetic constructor •() → self::_B&Object&A
+    : super core::Object::•()
+    ;
+}
+class B extends self::_B&Object&A {
+  synthetic constructor •() → self::B
+    : super self::_B&Object&A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f9187d1
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.transformed.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    return null;
+  }
+}
+abstract class _B&Object&A extends core::Object implements self::A {
+  const synthetic constructor •() → self::_B&Object&A
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    return null;
+  }
+}
+class B extends self::_B&Object&A {
+  synthetic constructor •() → self::B
+    : super self::_B&Object&A::•()
+    ;
+  no-such-method-forwarder method foo() → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
index 3ea742b..7cfd576 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
@@ -9,7 +9,7 @@
     ;
 }
 abstract class _B&Object&A = core::Object with self::A {
-  synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.expect
index 3155d8f..3ca45b1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.expect
@@ -11,13 +11,13 @@
   }
 }
 abstract class _B&Object&A = core::Object with self::A {
-  synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&A {
   synthetic constructor •() → self::B
-    : super core::Object::•()
+    : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.transformed.expect
index d91cc25..f9187d1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
   }
 }
 abstract class _B&Object&A extends core::Object implements self::A {
-  synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -20,7 +20,7 @@
 }
 class B extends self::_B&Object&A {
   synthetic constructor •() → self::B
-    : super core::Object::•()
+    : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
     return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/private.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_forwarders/same.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect
deleted file mode 100644
index e055260..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
-//   void foo(int x) {}
-//        ^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Context: This is the inherited member.
-//   void set foo(int x);
-//            ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
-//   void foo(int x) {}
-//        ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method foo(core::int x) → void {}
-  no-such-method-forwarder set foo(core::int x) → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.transformed.expect
deleted file mode 100644
index f8ff1c7..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.direct.transformed.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
-//   void foo(int x) {}
-//        ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  method foo(core::int x) → void {}
-  no-such-method-forwarder set foo(core::int x) → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  method noSuchMethod(core::Invocation i) → dynamic
-    return null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect
new file mode 100644
index 0000000..6742c9b
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect
@@ -0,0 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: 'foo' is already declared in this scope.
+//   void set foo(int x);
+//            ^^^
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Context: Previous declaration of 'foo'.
+//   void foo(int x) {}
+//        ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: 'foo' is already declared in this scope.
+//   void set foo(int x);
+//            ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo(core::int x) → void {}
+  no-such-method-forwarder set foo(core::int x) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e9e7677
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: 'foo' is already declared in this scope.
+//   void set foo(int x);
+//            ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo(core::int x) → void {}
+  no-such-method-forwarder set foo(core::int x) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  method noSuchMethod(core::Invocation i) → dynamic
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
index d3c1457..d8c8b38 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
@@ -1,11 +1,11 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Error: Can't declare a member that conflicts with an inherited one.
-//   void foo(int x) {}
-//        ^
-// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Context: This is the inherited member.
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:12:12: Error: 'foo' is already declared in this scope.
 //   void set foo(int x);
-//            ^
+//            ^^^
+// pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart:10:8: Context: Previous declaration of 'foo'.
+//   void foo(int x) {}
+//        ^^^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
deleted file mode 100644
index 0e43ba4..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
-    : super core::Object::•()
-    ;
-  abstract method foo() → self::I::T;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    return null;
-  }
-}
-abstract class _A&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_A&Object&M
-    : super core::Object::•()
-    ;
-}
-class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → core::int
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
deleted file mode 100644
index 047bcf3..0000000
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.direct.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
-    : super core::Object::•()
-    ;
-  abstract method foo() → self::I::T;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    return null;
-  }
-}
-abstract class _A&Object&M extends core::Object implements self::M {
-  synthetic constructor •() → self::_A&Object&M
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    return null;
-  }
-}
-class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  no-such-method-forwarder method foo() → core::int
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.expect
new file mode 100644
index 0000000..7711967
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T>
+    : super core::Object::•()
+    ;
+  abstract method foo() → self::I::T;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    return null;
+  }
+}
+abstract class _A&Object&M = core::Object with self::M {
+  const synthetic constructor •() → self::_A&Object&M
+    : super core::Object::•()
+    ;
+}
+class A extends self::_A&Object&M implements self::I<core::int> {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → core::int
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.transformed.expect
new file mode 100644
index 0000000..eb168b2
--- /dev/null
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T>
+    : super core::Object::•()
+    ;
+  abstract method foo() → self::I::T;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    return null;
+  }
+}
+abstract class _A&Object&M extends core::Object implements self::M {
+  const synthetic constructor •() → self::_A&Object&M
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation i) → dynamic {
+    return null;
+  }
+}
+class A extends self::_A&Object&M implements self::I<core::int> {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&M::•()
+    ;
+  no-such-method-forwarder method foo() → core::int
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
index 199bd26..d96e5bd 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
@@ -14,7 +14,7 @@
     ;
 }
 abstract class _A&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
index 0e43ba4..7711967 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
@@ -17,13 +17,13 @@
   }
 }
 abstract class _A&Object&M = core::Object with self::M {
-  synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M
     : super core::Object::•()
     ;
 }
 class A extends self::_A&Object&M implements self::I<core::int> {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&M::•()
     ;
   no-such-method-forwarder method foo() → core::int
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
index 047bcf3..eb168b2 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   }
 }
 abstract class _A&Object&M extends core::Object implements self::M {
-  synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M
     : super core::Object::•()
     ;
   method noSuchMethod(core::Invocation i) → dynamic {
@@ -26,7 +26,7 @@
 }
 class A extends self::_A&Object&M implements self::I<core::int> {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&M::•()
     ;
   no-such-method-forwarder method foo() → core::int
     return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.direct.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_private_setter.dart.direct.expect
rename to pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_private_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/null_aware.dart.direct.expect b/pkg/front_end/testcases/null_aware.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/null_aware.dart.direct.expect
rename to pkg/front_end/testcases/null_aware.dart.legacy.expect
diff --git a/pkg/front_end/testcases/null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/null_aware.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/null_aware.dart.direct.transformed.expect
rename to pkg/front_end/testcases/null_aware.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/null_aware.dart.strong.expect b/pkg/front_end/testcases/null_aware.dart.strong.expect
index 0c3d292..3f3d5e0 100644
--- a/pkg/front_end/testcases/null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/null_aware.dart.strong.expect
@@ -5,18 +5,18 @@
 class Foo extends core::Object {
   field core::int field = null;
   static field core::int staticField = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   self::Foo foo = new self::Foo::•();
-  let final self::Foo #t1 = foo in #t1.==(null) ? null : #t1.{self::Foo::field} = 5;
+  let final self::Foo #t1 = foo in #t1.==(null) ?{core::int} null : #t1.{self::Foo::field} = 5;
   self::Foo::staticField = 5;
-  let final self::Foo #t2 = foo in #t2.{self::Foo::field}.==(null) ? #t2.{self::Foo::field} = 5 : null;
-  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
-  let final self::Foo #t3 = foo in #t3.==(null) ? null : #t3.{self::Foo::field}.==(null) ? #t3.{self::Foo::field} = 5 : null;
-  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
-  core::int intValue = let final core::int #t4 = foo.{self::Foo::field} in #t4.==(null) ? 6 : #t4;
-  core::num numValue = let final core::int #t5 = foo.{self::Foo::field} in #t5.==(null) ? 4.5 : #t5;
+  let final self::Foo #t2 = foo in #t2.{self::Foo::field}.{core::num::==}(null) ?{core::int} #t2.{self::Foo::field} = 5 : null;
+  self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 5 : null;
+  let final self::Foo #t3 = foo in #t3.==(null) ?{core::int} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int} #t3.{self::Foo::field} = 5 : null;
+  self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 5 : null;
+  core::int intValue = let final core::int #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int} 6 : #t4;
+  core::num numValue = let final core::int #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num} 4.5 : #t5;
 }
diff --git a/pkg/front_end/testcases/null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/null_aware.dart.strong.transformed.expect
new file mode 100644
index 0000000..3f3d5e0
--- /dev/null
+++ b/pkg/front_end/testcases/null_aware.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int field = null;
+  static field core::int staticField = null;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo foo = new self::Foo::•();
+  let final self::Foo #t1 = foo in #t1.==(null) ?{core::int} null : #t1.{self::Foo::field} = 5;
+  self::Foo::staticField = 5;
+  let final self::Foo #t2 = foo in #t2.{self::Foo::field}.{core::num::==}(null) ?{core::int} #t2.{self::Foo::field} = 5 : null;
+  self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 5 : null;
+  let final self::Foo #t3 = foo in #t3.==(null) ?{core::int} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int} #t3.{self::Foo::field} = 5 : null;
+  self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 5 : null;
+  core::int intValue = let final core::int #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int} 6 : #t4;
+  core::num numValue = let final core::int #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num} 4.5 : #t5;
+}
diff --git a/pkg/front_end/testcases/operators.dart.direct.expect b/pkg/front_end/testcases/operators.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/operators.dart.direct.expect
rename to pkg/front_end/testcases/operators.dart.legacy.expect
diff --git a/pkg/front_end/testcases/operators.dart.direct.transformed.expect b/pkg/front_end/testcases/operators.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/operators.dart.direct.transformed.expect
rename to pkg/front_end/testcases/operators.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/operators.dart.strong.expect b/pkg/front_end/testcases/operators.dart.strong.expect
new file mode 100644
index 0000000..2c8078c
--- /dev/null
+++ b/pkg/front_end/testcases/operators.dart.strong.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Operators extends core::Object {
+  synthetic constructor •() → self::Operators
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+  operator &(dynamic other) → dynamic
+    return null;
+  operator ~() → dynamic
+    return null;
+  operator |(dynamic other) → dynamic
+    return null;
+  operator ^(dynamic other) → dynamic
+    return null;
+  operator /(dynamic other) → dynamic
+    return null;
+  operator ==(dynamic other) → core::bool
+    return null;
+  operator >(dynamic other) → dynamic
+    return null;
+  operator >=(dynamic other) → dynamic
+    return null;
+  operator [](dynamic index) → dynamic
+    return null;
+  operator []=(dynamic index, dynamic value) → void {}
+  operator <<(dynamic other) → dynamic
+    return null;
+  operator <(dynamic other) → dynamic
+    return null;
+  operator <=(dynamic other) → dynamic
+    return null;
+  operator *(dynamic other) → dynamic
+    return null;
+  operator %(dynamic other) → dynamic
+    return null;
+  operator >>(dynamic other) → dynamic
+    return null;
+  operator -(dynamic other) → dynamic
+    return null;
+  operator ~/(dynamic other) → dynamic
+    return null;
+  operator unary-() → dynamic
+    return null;
+}
+static method main(dynamic arguments) → dynamic {
+  self::Operators a = new self::Operators::•();
+  self::Operators b = new self::Operators::•();
+  a.{self::Operators::+}(b);
+  a.{self::Operators::&}(b);
+  a.{self::Operators::~}();
+  a.{self::Operators::|}(b);
+  a.{self::Operators::^}(b);
+  a.{self::Operators::/}(b);
+  a.{self::Operators::==}(b);
+  a.{self::Operators::>}(b);
+  a.{self::Operators::>=}(b);
+  a.{self::Operators::[]}(0);
+  a.{self::Operators::[]=}(0, b);
+  a.{self::Operators::<<}(b);
+  a.{self::Operators::<}(b);
+  a.{self::Operators::<=}(b);
+  a.{self::Operators::*}(b);
+  a.{self::Operators::%}(b);
+  a.{self::Operators::>>}(b);
+  a.{self::Operators::-}(b);
+  a.{self::Operators::~/}(b);
+  a.{self::Operators::unary-}();
+}
diff --git a/pkg/front_end/testcases/operators.dart.strong.transformed.expect b/pkg/front_end/testcases/operators.dart.strong.transformed.expect
new file mode 100644
index 0000000..2c8078c
--- /dev/null
+++ b/pkg/front_end/testcases/operators.dart.strong.transformed.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Operators extends core::Object {
+  synthetic constructor •() → self::Operators
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+  operator &(dynamic other) → dynamic
+    return null;
+  operator ~() → dynamic
+    return null;
+  operator |(dynamic other) → dynamic
+    return null;
+  operator ^(dynamic other) → dynamic
+    return null;
+  operator /(dynamic other) → dynamic
+    return null;
+  operator ==(dynamic other) → core::bool
+    return null;
+  operator >(dynamic other) → dynamic
+    return null;
+  operator >=(dynamic other) → dynamic
+    return null;
+  operator [](dynamic index) → dynamic
+    return null;
+  operator []=(dynamic index, dynamic value) → void {}
+  operator <<(dynamic other) → dynamic
+    return null;
+  operator <(dynamic other) → dynamic
+    return null;
+  operator <=(dynamic other) → dynamic
+    return null;
+  operator *(dynamic other) → dynamic
+    return null;
+  operator %(dynamic other) → dynamic
+    return null;
+  operator >>(dynamic other) → dynamic
+    return null;
+  operator -(dynamic other) → dynamic
+    return null;
+  operator ~/(dynamic other) → dynamic
+    return null;
+  operator unary-() → dynamic
+    return null;
+}
+static method main(dynamic arguments) → dynamic {
+  self::Operators a = new self::Operators::•();
+  self::Operators b = new self::Operators::•();
+  a.{self::Operators::+}(b);
+  a.{self::Operators::&}(b);
+  a.{self::Operators::~}();
+  a.{self::Operators::|}(b);
+  a.{self::Operators::^}(b);
+  a.{self::Operators::/}(b);
+  a.{self::Operators::==}(b);
+  a.{self::Operators::>}(b);
+  a.{self::Operators::>=}(b);
+  a.{self::Operators::[]}(0);
+  a.{self::Operators::[]=}(0, b);
+  a.{self::Operators::<<}(b);
+  a.{self::Operators::<}(b);
+  a.{self::Operators::<=}(b);
+  a.{self::Operators::*}(b);
+  a.{self::Operators::%}(b);
+  a.{self::Operators::>>}(b);
+  a.{self::Operators::-}(b);
+  a.{self::Operators::~/}(b);
+  a.{self::Operators::unary-}();
+}
diff --git a/pkg/front_end/testcases/optional.dart.direct.expect b/pkg/front_end/testcases/optional.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/optional.dart.direct.expect
rename to pkg/front_end/testcases/optional.dart.legacy.expect
diff --git a/pkg/front_end/testcases/optional.dart.strong.expect b/pkg/front_end/testcases/optional.dart.strong.expect
index a741c32..2cb7a7c 100644
--- a/pkg/front_end/testcases/optional.dart.strong.expect
+++ b/pkg/front_end/testcases/optional.dart.strong.expect
@@ -1,9 +1,56 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/optional.dart:47:21: Error: The argument type 'InvalidListener' can't be assigned to the parameter type 'Listener'.
+//  - 'InvalidListener' is from 'pkg/front_end/testcases/optional.dart'.
+//  - 'Listener' is from 'pkg/front_end/testcases/optional.dart'.
+// Try changing the type of the parameter, or casting the argument to 'Listener'.
+//   extern.listen(new InvalidListener());
+//                     ^
+//
+// pkg/front_end/testcases/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing1 = foo.method();
+//                            ^
+//
+// pkg/front_end/testcases/optional.dart:50:28: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   var nothing2 = foo.method(1, 2, 3, 4);
+//                            ^
+//
+// pkg/front_end/testcases/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing3 = extern.externalMethod();
+//                                       ^
+//
+// pkg/front_end/testcases/optional.dart:52:39: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   var nothing4 = extern.externalMethod(1, 2, 3, 4);
+//                                       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing1 = foo.method();
+//                            ^
+//
+// pkg/front_end/testcases/optional.dart:50:28: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   var nothing2 = foo.method(1, 2, 3, 4);
+//                            ^
+//
+// pkg/front_end/testcases/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
+//   var nothing3 = extern.externalMethod();
+//                                       ^
+//
+// pkg/front_end/testcases/optional.dart:52:39: Error: Too many positional arguments: 3 allowed, but 4 found.
+// Try removing the extra positional arguments.
+//   var nothing4 = extern.externalMethod(1, 2, 3, 4);
+//                                       ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   method method(dynamic x, [dynamic y = null, dynamic z = null]) → dynamic {
@@ -11,32 +58,32 @@
   }
 }
 abstract class External extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::External
     : super core::Object::•()
     ;
   abstract method externalMethod(core::int x, [core::int y = null, core::int z = null]) → core::String;
   abstract method listen(self::Listener listener) → void;
 }
 abstract class Listener extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Listener
     : super core::Object::•()
     ;
   abstract method event(core::String input, [core::int x = null, core::int y = null]) → void;
 }
 class TestListener extends self::Listener {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::TestListener
     : super self::Listener::•()
     ;
-  method event(core::String input, [core::int x, core::int y]) → void {}
+  method event(core::String input, [core::int x = null, core::int y = null]) → void {}
 }
 class ExtendedListener extends self::Listener {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ExtendedListener
     : super self::Listener::•()
     ;
-  method event(core::String input, [core::int x, core::int y, dynamic z]) → void {}
+  method event(core::String input, [core::int x = null, core::int y = null, dynamic z = null]) → void {}
 }
 class InvalidListener extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::InvalidListener
     : super core::Object::•()
     ;
   method event(dynamic input, [dynamic x = null]) → void {}
@@ -53,7 +100,12 @@
   core::String string6 = extern.{self::External::externalMethod}(1, 2, 3);
   extern.{self::External::listen}(new self::TestListener::•());
   extern.{self::External::listen}(new self::ExtendedListener::•());
-  extern.{self::External::listen}(new self::InvalidListener::•());
+  extern.{self::External::listen}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/optional.dart:47:21: Error: The argument type 'InvalidListener' can't be assigned to the parameter type 'Listener'.
+ - 'InvalidListener' is from 'pkg/front_end/testcases/optional.dart'.
+ - 'Listener' is from 'pkg/front_end/testcases/optional.dart'.
+Try changing the type of the parameter, or casting the argument to 'Listener'.
+  extern.listen(new InvalidListener());
+                    ^" in new self::InvalidListener::•() as{TypeError} self::Listener);
   dynamic nothing1 = foo.{self::Foo::method}();
   dynamic nothing2 = foo.{self::Foo::method}(1, 2, 3, 4);
   core::String nothing3 = extern.{self::External::externalMethod}();
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 3199cdb..da7ac91 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -241,7 +241,6 @@
 inference/void_return_type_subtypes_dynamic: Fail
 
 rasta/issue_000045: Fail
-rasta/issue_000046: Fail
 rasta/issue_000047: Fail
 rasta/native_is_illegal: Pass # Issue 29763
 rasta/type_with_parse_error: Fail
diff --git a/pkg/front_end/testcases/override.dart.direct.expect b/pkg/front_end/testcases/override.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override.dart.direct.expect
rename to pkg/front_end/testcases/override.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override.dart.direct.transformed.expect b/pkg/front_end/testcases/override.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.expect
rename to pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_after_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
index d6ad025..12a28da 100644
--- a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
@@ -1,15 +1,19 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F::y' is #lib1::A, which does not match the return type of the overridden method (#lib1::B).
-// Change to a subtype of #lib1::B.
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F.y' is 'A', which does not match the return type of the overridden method, 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
+// Change to a subtype of 'B'.
 //   A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
 //                                                   ^
 // pkg/front_end/testcases/override_check_accessor_after_inference.dart:18:7: Context: This is the overridden method ('y').
 //   get y => null; // Inferred type: B
 //       ^
 //
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F.x' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                         ^
 // pkg/front_end/testcases/override_check_accessor_after_inference.dart:17:12: Context: This is the overridden method ('x').
@@ -18,13 +22,17 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F::y' is #lib1::A, which does not match the return type of the overridden method (#lib1::B).
-// Change to a subtype of #lib1::B.
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:28:51: Error: The return type of the method 'F.y' is 'A', which does not match the return type of the overridden method, 'B'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
+// Change to a subtype of 'B'.
 //   A get /*@error=OverrideTypeMismatchReturnType*/ y => null;
 //                                                   ^
 //
-// pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_accessor_after_inference.dart:27:57: Error: The parameter 'value' of the method 'F.x' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                         ^
 
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_basic.dart.direct.expect
rename to pkg/front_end/testcases/override_check_accessor_basic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_basic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override_check_accessor_basic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
index dc4010c..edd9a2f 100644
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
@@ -1,15 +1,19 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E::y' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
-// Change to a subtype of #lib1::A.
+// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E.y' is 'Object', which does not match the return type of the overridden method, 'A'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
+// Change to a subtype of 'A'.
 //   Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
 //                                                        ^
 // pkg/front_end/testcases/override_check_accessor_basic.dart:13:9: Context: This is the overridden method ('y').
 //   A get y => null;
 //         ^
 //
-// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                         ^
 // pkg/front_end/testcases/override_check_accessor_basic.dart:12:12: Context: This is the overridden method ('x').
@@ -18,13 +22,17 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E::y' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
-// Change to a subtype of #lib1::A.
+// pkg/front_end/testcases/override_check_accessor_basic.dart:23:56: Error: The return type of the method 'E.y' is 'Object', which does not match the return type of the overridden method, 'A'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
+// Change to a subtype of 'A'.
 //   Object get /*@error=OverrideTypeMismatchReturnType*/ y => null;
 //                                                        ^
 //
-// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E::x' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_accessor_basic.dart:22:57: Error: The parameter 'value' of the method 'E.x' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void set x(B /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                         ^
 
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.expect
rename to pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
index 8fc4f70..4481746 100644
--- a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
@@ -1,15 +1,18 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D.x4' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //       B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
 //                                                  ^
 // pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:15:12: Context: This is the overridden method ('x4').
 //   void set x4(A value) {}
 //            ^
 //
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D::x5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D.x5' has type 'String', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //       covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                                 ^
 // pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:16:12: Context: This is the overridden method ('x5').
@@ -18,13 +21,16 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D::x4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:25:50: Error: The parameter 'value' of the method 'D.x4' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //       B /*@error=OverrideTypeMismatchParameter*/ value) {} // Not covariant
 //                                                  ^
 //
-// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D::x5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart:27:65: Error: The parameter 'value' of the method 'D.x5' has type 'String', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //       covariant String /*@error=OverrideTypeMismatchParameter*/ value) {}
 //                                                                 ^
 
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.direct.expect b/pkg/front_end/testcases/override_check_after_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_after_inference.dart.direct.expect
rename to pkg/front_end/testcases/override_check_after_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_after_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_after_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override_check_after_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
index 8b8b1b8..d99ce0b 100644
--- a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
@@ -1,7 +1,9 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F::f' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F.f' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                     ^
 // pkg/front_end/testcases/override_check_after_inference.dart:16:8: Context: This is the overridden method ('f').
@@ -10,8 +12,10 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F::f' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_after_inference.dart:24:53: Error: The parameter 'x' of the method 'F.f' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_after_inference.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_after_inference.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f(B /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                     ^
 
diff --git a/pkg/front_end/testcases/override_check_basic.dart.direct.expect b/pkg/front_end/testcases/override_check_basic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_basic.dart.direct.expect
rename to pkg/front_end/testcases/override_check_basic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override_check_basic.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_basic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_basic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override_check_basic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
index 72ccf4c..c30602c 100644
--- a/pkg/front_end/testcases/override_check_basic.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
@@ -1,31 +1,39 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E::f4' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
-// Change to a subtype of #lib1::A.
+// pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E.f4' is 'Object', which does not match the return type of the overridden method, 'A'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+// Change to a subtype of 'A'.
 //   Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
 //                                                    ^
 // pkg/front_end/testcases/override_check_basic.dart:15:5: Context: This is the overridden method ('f4').
 //   A f4() {}
 //     ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E::f3' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E.f3' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f3({B /*@error=OverrideTypeMismatchParameter*/ x}) {}
 //                                                       ^
 // pkg/front_end/testcases/override_check_basic.dart:14:8: Context: This is the overridden method ('f3').
 //   void f3({A x}) {}
 //        ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:26:54: Error: The parameter 'x' of the method 'E::f1' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_basic.dart:26:54: Error: The parameter 'x' of the method 'E.f1' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f1(B /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                      ^
 // pkg/front_end/testcases/override_check_basic.dart:12:8: Context: This is the overridden method ('f1').
 //   void f1(A x) {}
 //        ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:27:55: Error: The parameter 'x' of the method 'E::f2' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_basic.dart:27:55: Error: The parameter 'x' of the method 'E.f2' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
 //                                                       ^
 // pkg/front_end/testcases/override_check_basic.dart:13:8: Context: This is the overridden method ('f2').
@@ -34,23 +42,31 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E::f4' is dart.core::Object, which does not match the return type of the overridden method (#lib1::A).
-// Change to a subtype of #lib1::A.
+// pkg/front_end/testcases/override_check_basic.dart:29:52: Error: The return type of the method 'E.f4' is 'Object', which does not match the return type of the overridden method, 'A'.
+//  - 'Object' is from 'dart:core'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+// Change to a subtype of 'A'.
 //   Object /*@error=OverrideTypeMismatchReturnType*/ f4() {}
 //                                                    ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E::f3' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_basic.dart:28:55: Error: The parameter 'x' of the method 'E.f3' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f3({B /*@error=OverrideTypeMismatchParameter*/ x}) {}
 //                                                       ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:26:54: Error: The parameter 'x' of the method 'E::f1' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_basic.dart:26:54: Error: The parameter 'x' of the method 'E.f1' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f1(B /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                      ^
 //
-// pkg/front_end/testcases/override_check_basic.dart:27:55: Error: The parameter 'x' of the method 'E::f2' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_basic.dart:27:55: Error: The parameter 'x' of the method 'E.f2' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_basic.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f2([B /*@error=OverrideTypeMismatchParameter*/ x]) {}
 //                                                       ^
 
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.expect
rename to pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_two_substitutions.dart.direct.expect
rename to pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_two_substitutions.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.expect
rename to pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.expect
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.transformed.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_with_covariant_modifier.dart.direct.transformed.expect
rename to pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
index 955df32..fc5cda4 100644
--- a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
+++ b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
@@ -1,15 +1,18 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D::f5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D.f5' has type 'String', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f5(covariant String /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                                     ^
 // pkg/front_end/testcases/override_check_with_covariant_modifier.dart:16:8: Context: This is the overridden method ('f5').
 //   void f5(covariant A x) {}
 //        ^
 //
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:24:54: Error: The parameter 'x' of the method 'D::f4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:24:54: Error: The parameter 'x' of the method 'D.f4' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
 //                                                      ^
 // pkg/front_end/testcases/override_check_with_covariant_modifier.dart:15:8: Context: This is the overridden method ('f4').
@@ -18,13 +21,16 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D::f5' has type dart.core::String, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:25:69: Error: The parameter 'x' of the method 'D.f5' has type 'String', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f5(covariant String /*@error=OverrideTypeMismatchParameter*/ x) {}
 //                                                                     ^
 //
-// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:24:54: Error: The parameter 'x' of the method 'D::f4' has type #lib1::B, which does not match the corresponding type in the overridden method (#lib1::A).
-// Change to a supertype of #lib1::A (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/override_check_with_covariant_modifier.dart:24:54: Error: The parameter 'x' of the method 'D.f4' has type 'B', which does not match the corresponding type in the overridden method, 'A'.
+//  - 'B' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/override_check_with_covariant_modifier.dart'.
+// Change to a supertype of 'A', or, for a covariant parameter, a subtype.
 //   void f4(B /*@error=OverrideTypeMismatchParameter*/ x) {} // Not covariant
 //                                                      ^
 
diff --git a/pkg/front_end/testcases/part_as_entry_point.dart b/pkg/front_end/testcases/part_as_entry_point.dart
new file mode 100644
index 0000000..0b9dc66
--- /dev/null
+++ b/pkg/front_end/testcases/part_as_entry_point.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of "part_as_entry_point_lib.dart";
diff --git a/pkg/front_end/testcases/hello.dart.direct.expect b/pkg/front_end/testcases/part_as_entry_point.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/hello.dart.direct.expect
copy to pkg/front_end/testcases/part_as_entry_point.dart.legacy.expect
diff --git a/pkg/front_end/testcases/hello.dart.direct.transformed.expect b/pkg/front_end/testcases/part_as_entry_point.dart.legacy.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/hello.dart.direct.transformed.expect
copy to pkg/front_end/testcases/part_as_entry_point.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/part_as_entry_point.dart.outline.expect b/pkg/front_end/testcases/part_as_entry_point.dart.outline.expect
new file mode 100644
index 0000000..6a28c0d
--- /dev/null
+++ b/pkg/front_end/testcases/part_as_entry_point.dart.outline.expect
@@ -0,0 +1,5 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/hello.dart.direct.expect b/pkg/front_end/testcases/part_as_entry_point.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/hello.dart.direct.expect
copy to pkg/front_end/testcases/part_as_entry_point.dart.strong.expect
diff --git a/pkg/front_end/testcases/hello.dart.direct.transformed.expect b/pkg/front_end/testcases/part_as_entry_point.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/hello.dart.direct.transformed.expect
copy to pkg/front_end/testcases/part_as_entry_point.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/part_as_entry_point_lib.dart b/pkg/front_end/testcases/part_as_entry_point_lib.dart
new file mode 100644
index 0000000..a2f5430
--- /dev/null
+++ b/pkg/front_end/testcases/part_as_entry_point_lib.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part "part_as_entry_point.dart";
+
+main() {
+  print("Hello, World!");
+}
diff --git a/pkg/front_end/testcases/platform.dart.direct.expect b/pkg/front_end/testcases/platform.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/platform.dart.direct.expect
rename to pkg/front_end/testcases/platform.dart.legacy.expect
diff --git a/pkg/front_end/testcases/platform.dart.direct.transformed.expect b/pkg/front_end/testcases/platform.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/platform.dart.direct.transformed.expect
rename to pkg/front_end/testcases/platform.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/platform.dart.direct.expect b/pkg/front_end/testcases/platform.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/platform.dart.direct.expect
copy to pkg/front_end/testcases/platform.dart.strong.expect
diff --git a/pkg/front_end/testcases/platform.dart.direct.transformed.expect b/pkg/front_end/testcases/platform.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/platform.dart.direct.transformed.expect
copy to pkg/front_end/testcases/platform.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.direct.expect b/pkg/front_end/testcases/prefer_baseclass.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/prefer_baseclass.dart.direct.expect
rename to pkg/front_end/testcases/prefer_baseclass.dart.legacy.expect
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.direct.transformed.expect b/pkg/front_end/testcases/prefer_baseclass.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/prefer_baseclass.dart.direct.transformed.expect
rename to pkg/front_end/testcases/prefer_baseclass.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.strong.expect b/pkg/front_end/testcases/prefer_baseclass.dart.strong.expect
index 56e4f44..18f3480 100644
--- a/pkg/front_end/testcases/prefer_baseclass.dart.strong.expect
+++ b/pkg/front_end/testcases/prefer_baseclass.dart.strong.expect
@@ -2,33 +2,33 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A extends core::Object {
-  synthetic constructor •() → void
+class A extends core::Object {
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
 }
-abstract class B extends core::Object {
-  synthetic constructor •() → void
+class B extends core::Object {
+  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 }
 class AB1 extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::AB1
     : super self::A::•()
     ;
 }
 class AB2 extends self::A implements self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::AB2
     : super self::A::•()
     ;
 }
 class BA1 extends self::B implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BA1
     : super self::B::•()
     ;
 }
 class BA2 extends self::B implements self::A {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::BA2
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.direct.transformed.expect b/pkg/front_end/testcases/prefer_baseclass.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/prefer_baseclass.dart.direct.transformed.expect
copy to pkg/front_end/testcases/prefer_baseclass.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.direct.expect b/pkg/front_end/testcases/private_method_tearoff.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/private_method_tearoff.dart.direct.expect
rename to pkg/front_end/testcases/private_method_tearoff.dart.legacy.expect
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.direct.transformed.expect b/pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/private_method_tearoff.dart.direct.transformed.expect
rename to pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.direct.expect b/pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/public_method_tearoff.dart.direct.expect
rename to pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.direct.transformed.expect b/pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/public_method_tearoff.dart.direct.transformed.expect
rename to pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/qualified.dart.direct.expect b/pkg/front_end/testcases/qualified.dart.direct.expect
deleted file mode 100644
index cf5f613..0000000
--- a/pkg/front_end/testcases/qualified.dart.direct.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
-//   factory WrongName() {}
-//           ^^^^^^^^^
-// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
-// class Bad extends lib.Missing {
-//       ^^^
-//
-// pkg/front_end/testcases/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
-//   lib.Missing method() {}
-//   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
-// class IllegalSupertype extends lib.VoidFunction {}
-//       ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
-//   factory WrongName() {}
-//           ^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
-// class IllegalSupertype extends lib.VoidFunction {}
-//       ^
-
-library test.qualified.main;
-import self as self;
-import "dart:core" as core;
-import "./qualified_lib.dart" as lib;
-
-class Bad extends core::Object {
-  method method() → invalid-type {}
-  static factory WrongName() → self::Bad {}
-}
-abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
-  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
-    : super lib::Supertype::•()
-    ;
-}
-class WithMixin extends self::_WithMixin&Supertype&Mixin {
-  synthetic constructor •() → self::WithMixin
-    : super lib::Supertype::•()
-    ;
-}
-class IllegalSupertype extends core::Object {
-  synthetic constructor •() → self::IllegalSupertype
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static field dynamic _redirecting# = <dynamic>[self::C::b];
-  constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  constructor a() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
-    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
-}
-static method main() → dynamic {
-  new self::C::•<core::String>();
-  new self::C::a<core::String>();
-  new lib::C::a<core::String>();
-  new lib::C::•<core::String>();
-  new lib::C::a<core::String>();
-  new lib::C::a<core::String>();
-  new self::WithMixin::•().supertypeMethod();
-  new self::WithMixin::•().foo();
-  new self::IllegalSupertype::•();
-}
diff --git a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect b/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
deleted file mode 100644
index 020e7a3..0000000
--- a/pkg/front_end/testcases/qualified.dart.direct.transformed.expect
+++ /dev/null
@@ -1,63 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
-//   factory WrongName() {}
-//           ^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
-// class IllegalSupertype extends lib.VoidFunction {}
-//       ^
-
-library test.qualified.main;
-import self as self;
-import "dart:core" as core;
-import "./qualified_lib.dart" as lib;
-
-class Bad extends core::Object {
-  method method() → invalid-type {}
-  static factory WrongName() → self::Bad {}
-}
-abstract class _WithMixin&Supertype&Mixin extends lib::Supertype implements lib::Mixin {
-  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
-    : super lib::Supertype::•()
-    ;
-  method /* from org-dartlang-testcase:///qualified_lib.dart */ foo() → dynamic {
-    core::print("I'm Mixin.foo");
-  }
-}
-class WithMixin extends self::_WithMixin&Supertype&Mixin {
-  synthetic constructor •() → self::WithMixin
-    : super lib::Supertype::•()
-    ;
-}
-class IllegalSupertype extends core::Object {
-  synthetic constructor •() → self::IllegalSupertype
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static field dynamic _redirecting# = <dynamic>[self::C::b];
-  constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  constructor a() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
-    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
-}
-static method main() → dynamic {
-  new self::C::•<core::String>();
-  new self::C::a<core::String>();
-  new lib::C::a<core::String>();
-  new lib::C::•<core::String>();
-  new lib::C::a<core::String>();
-  new lib::C::a<core::String>();
-  new self::WithMixin::•().supertypeMethod();
-  new self::WithMixin::•().foo();
-  new self::IllegalSupertype::•();
-}
diff --git a/pkg/front_end/testcases/qualified.dart.legacy.expect b/pkg/front_end/testcases/qualified.dart.legacy.expect
new file mode 100644
index 0000000..a54701c
--- /dev/null
+++ b/pkg/front_end/testcases/qualified.dart.legacy.expect
@@ -0,0 +1,81 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+//   factory WrongName() {}
+//           ^^^^^^^^^
+// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
+// class Bad extends lib.Missing {
+//       ^^^
+//
+// pkg/front_end/testcases/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+//   factory WrongName() {}
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+
+library test.qualified.main;
+import self as self;
+import "dart:core" as core;
+import "./qualified_lib.dart" as lib;
+
+class Bad extends core::Object {
+  method method() → invalid-type {}
+  static factory WrongName() → self::Bad {}
+}
+abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
+  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
+    : super lib::Supertype::•()
+    ;
+}
+class WithMixin extends self::_WithMixin&Supertype&Mixin {
+  synthetic constructor •() → self::WithMixin
+    : super self::_WithMixin&Supertype&Mixin::•()
+    ;
+}
+class IllegalSupertype extends core::Object {
+  synthetic constructor •() → self::IllegalSupertype
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+  static field dynamic _redirecting# = <dynamic>[self::C::b];
+  constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+  constructor a() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
+    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
+}
+static method main() → dynamic {
+  new self::C::•<core::String>();
+  new self::C::a<core::String>();
+  new lib::C::a<core::String>();
+  new lib::C::•<core::String>();
+  new lib::C::a<core::String>();
+  new lib::C::a<core::String>();
+  new self::WithMixin::•().supertypeMethod();
+  new self::WithMixin::•().foo();
+  new self::IllegalSupertype::•();
+}
diff --git a/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect b/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect
new file mode 100644
index 0000000..20d9d18
--- /dev/null
+++ b/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect
@@ -0,0 +1,63 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
+//   factory WrongName() {}
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+
+library test.qualified.main;
+import self as self;
+import "dart:core" as core;
+import "./qualified_lib.dart" as lib;
+
+class Bad extends core::Object {
+  method method() → invalid-type {}
+  static factory WrongName() → self::Bad {}
+}
+abstract class _WithMixin&Supertype&Mixin extends lib::Supertype implements lib::Mixin {
+  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
+    : super lib::Supertype::•()
+    ;
+  method /* from org-dartlang-testcase:///qualified_lib.dart */ foo() → dynamic {
+    core::print("I'm Mixin.foo");
+  }
+}
+class WithMixin extends self::_WithMixin&Supertype&Mixin {
+  synthetic constructor •() → self::WithMixin
+    : super self::_WithMixin&Supertype&Mixin::•()
+    ;
+}
+class IllegalSupertype extends core::Object {
+  synthetic constructor •() → self::IllegalSupertype
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+  static field dynamic _redirecting# = <dynamic>[self::C::b];
+  constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+  constructor a() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
+    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
+}
+static method main() → dynamic {
+  new self::C::•<core::String>();
+  new self::C::a<core::String>();
+  new lib::C::a<core::String>();
+  new lib::C::•<core::String>();
+  new lib::C::a<core::String>();
+  new lib::C::a<core::String>();
+  new self::WithMixin::•().supertypeMethod();
+  new self::WithMixin::•().foo();
+  new self::IllegalSupertype::•();
+}
diff --git a/pkg/front_end/testcases/qualified.dart.outline.expect b/pkg/front_end/testcases/qualified.dart.outline.expect
index 42db141..fb0b74d 100644
--- a/pkg/front_end/testcases/qualified.dart.outline.expect
+++ b/pkg/front_end/testcases/qualified.dart.outline.expect
@@ -32,6 +32,7 @@
 }
 abstract class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
   synthetic constructor •() → self::_WithMixin&Supertype&Mixin
+    : super lib::Supertype::•()
     ;
 }
 class WithMixin extends self::_WithMixin&Supertype&Mixin {
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
index f36c315..4ad22bd 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.expect
@@ -53,7 +53,7 @@
 }
 class WithMixin extends self::_WithMixin&Supertype&Mixin {
   synthetic constructor •() → self::WithMixin
-    : super lib::Supertype::•()
+    : super self::_WithMixin&Supertype&Mixin::•()
     ;
 }
 class IllegalSupertype extends core::Object {
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
index c067a36..937b2a4 100644
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
@@ -35,7 +35,7 @@
 }
 class WithMixin extends self::_WithMixin&Supertype&Mixin {
   synthetic constructor •() → self::WithMixin
-    : super lib::Supertype::•()
+    : super self::_WithMixin&Supertype&Mixin::•()
     ;
 }
 class IllegalSupertype extends core::Object {
diff --git a/pkg/front_end/testcases/rasta/abstract_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/abstract_constructor.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/abstract_constructor.dart.direct.expect
rename to pkg/front_end/testcases/rasta/abstract_constructor.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.expect
new file mode 100644
index 0000000..f288f84
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.expect
@@ -0,0 +1,24 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/abstract_constructor.dart:8:7: Error: The class 'C' is abstract and can't be instantiated.
+//   new C();
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/abstract_constructor.dart:8:7: Error: The class 'C' is abstract and can't be instantiated.
+//   new C();
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  throw new core::AbstractClassInstantiationError::•("C");
+}
diff --git a/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..e2f40b5
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/abstract_constructor.dart:8:7: Error: The class 'C' is abstract and can't be instantiated.
+//   new C();
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  throw new core::AbstractClassInstantiationError::•("C");
+}
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.direct.expect
rename to pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.expect
new file mode 100644
index 0000000..dca2096
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.expect
@@ -0,0 +1,26 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   const C() : this.x(1);
+//                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  const constructor •() → self::C
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  const C() : this.x(1);
+                    ^"
+    ;
+  const constructor x() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•();
+  const self::C::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.transformed.expect
new file mode 100644
index 0000000..34a5b09
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  const constructor •() → self::C
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Error: Too many positional arguments: 0 allowed, but 1 found.
+Try removing the extra positional arguments.
+  const C() : this.x(1);
+                    ^"
+    ;
+  const constructor x() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•();
+  const self::C::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_continue.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_continue.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/bad_continue.dart.direct.expect
rename to pkg/front_end/testcases/rasta/bad_continue.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/bad_continue.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_continue.dart.strong.expect
new file mode 100644
index 0000000..5ceeb3a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_continue.dart.strong.expect
@@ -0,0 +1,40 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:6:3: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   continue here;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:6:12: Error: Can't find label 'here'.
+// Try defining the label, or correcting the name to match an existing label.
+//   continue here;
+//            ^
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:7:10: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   label: continue label;
+//          ^^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:6:3: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   continue here;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:7:10: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   label: continue label;
+//          ^^^^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/bad_continue.dart:6:12: Error: Can't find label 'here'.
+Try defining the label, or correcting the name to match an existing label.
+  continue here;
+           ^";
+  #L1:
+  break #L1;
+}
diff --git a/pkg/front_end/testcases/rasta/bad_continue.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_continue.dart.strong.transformed.expect
new file mode 100644
index 0000000..4d870d0
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_continue.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:6:3: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   continue here;
+//   ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/bad_continue.dart:7:10: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   label: continue label;
+//          ^^^^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/bad_continue.dart:6:12: Error: Can't find label 'here'.
+Try defining the label, or correcting the name to match an existing label.
+  continue here;
+           ^";
+  #L1:
+  break #L1;
+}
diff --git a/pkg/front_end/testcases/rasta/bad_default_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/bad_default_constructor.dart.direct.expect
rename to pkg/front_end/testcases/rasta/bad_default_constructor.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.expect
rename to pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.direct.expect
deleted file mode 100644
index dcdb2f0..0000000
--- a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.direct.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  constructor •(dynamic x) → void
-    : final dynamic #t1 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.\n  A(this.x);\n         ^"
-    ;
-}
-class B extends self::A {
-  const constructor •() → void
-    : final dynamic #t2 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The unnamed constructor in 'A' requires arguments.\n  const B();\n        ^"
-    ;
-}
-static method main() → dynamic {
-  new self::B::•();
-  const self::B::•();
-}
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.expect
new file mode 100644
index 0000000..815d322
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.expect
@@ -0,0 +1,32 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.
+//   A(this.x);
+//          ^
+//
+// pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+//   const B();
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.
+  A(this.x);
+         ^"
+    ;
+}
+class B extends self::A {
+  const constructor •() → self::B
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  const B();
+        ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  const self::B::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e218a4f
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.transformed.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.
+  A(this.x);
+         ^"
+    ;
+}
+class B extends self::A {
+  const constructor •() → self::B
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  const B();
+        ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  const self::B::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.expect
new file mode 100644
index 0000000..815d322
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.expect
@@ -0,0 +1,32 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.
+//   A(this.x);
+//          ^
+//
+// pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+//   const B();
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.
+  A(this.x);
+         ^"
+    ;
+}
+class B extends self::A {
+  const constructor •() → self::B
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  const B();
+        ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  const self::B::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..e218a4f
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •(dynamic x) → self::A
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:6:10: Error: 'x' isn't an instance field of this class.
+  A(this.x);
+         ^"
+    ;
+}
+class B extends self::A {
+  const constructor •() → self::B
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart:10:9: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+  const B();
+        ^"
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+  const self::B::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.expect
new file mode 100644
index 0000000..6d6a791
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.expect
@@ -0,0 +1,41 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: String starting with " must end with ".
+//   print(" $x.);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:8: Error: Can't find ')' to match '('.
+//   print(" $x.);
+//        ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Error: Getter not found: 'x'.
+//   print(" $x.);
+//            ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: Expected ';' after this.
+//   print(" $x.);
+//             ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: String starting with " must end with ".
+//   print(" $x.);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:8: Error: Can't find ')' to match '('.
+//   print(" $x.);
+//        ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: Expected ';' after this.
+//   print(" $x.);
+//             ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(" ${invalid-expression "pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Error: Getter not found: 'x'.
+  print(\" \$x.);
+           ^"}.);");
+}
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.transformed.expect
new file mode 100644
index 0000000..7e1cc73
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: String starting with " must end with ".
+//   print(" $x.);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:8: Error: Can't find ')' to match '('.
+//   print(" $x.);
+//        ^
+//
+// pkg/front_end/testcases/rasta/bad_interpolation.dart:6:13: Error: Expected ';' after this.
+//   print(" $x.);
+//             ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print(" ${invalid-expression "pkg/front_end/testcases/rasta/bad_interpolation.dart:6:12: Error: Getter not found: 'x'.
+  print(\" \$x.);
+           ^"}.);");
+}
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/bad_redirection.dart.direct.expect
rename to pkg/front_end/testcases/rasta/bad_redirection.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.expect
new file mode 100644
index 0000000..b9c7876
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.expect
@@ -0,0 +1,48 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   Foo() = Bar;
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   Foo() = Bar;
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:11: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   Foo() = Bar;
+//           ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   Foo() = Bar;
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   Foo() = Bar;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •() → self::Foo
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/rasta/bad_redirection.dart:6:11: Error: Constructors can't have a return type.
+Try removing the return type.
+  Foo() = Bar;
+          ^";
+}
+class Bar extends self::Foo {
+  static factory •() → self::Bar
+    return null;
+}
+static method main() → dynamic {
+  new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.transformed.expect
new file mode 100644
index 0000000..016f9e1
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   Foo() = Bar;
+//         ^
+//
+// pkg/front_end/testcases/rasta/bad_redirection.dart:6:9: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   Foo() = Bar;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •() → self::Foo
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/rasta/bad_redirection.dart:6:11: Error: Constructors can't have a return type.
+Try removing the return type.
+  Foo() = Bar;
+          ^";
+}
+class Bar extends self::Foo {
+  static factory •() → self::Bar
+    return null;
+}
+static method main() → dynamic {
+  new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.direct.expect
deleted file mode 100644
index 957daf2..0000000
--- a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.direct.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  constructor •() → void
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:15: Error: 'field' isn't an instance field of this class.\n  C() : field = null;\n              ^"
-    ;
-  set field(dynamic value) → dynamic {}
-}
-static method main() → dynamic {
-  new self::C::•();
-}
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.expect
new file mode 100644
index 0000000..9cf944e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.expect
@@ -0,0 +1,21 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:9: Error: 'field' isn't an instance field of this class.
+//   C() : field = null;
+//         ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:9: Error: 'field' isn't an instance field of this class.
+  C() : field = null;
+        ^^^^^"
+    ;
+  set field(dynamic value) → dynamic {}
+}
+static method main() → dynamic {
+  new self::C::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ee2c69c
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:9: Error: 'field' isn't an instance field of this class.
+  C() : field = null;
+        ^^^^^"
+    ;
+  set field(dynamic value) → dynamic {}
+}
+static method main() → dynamic {
+  new self::C::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.expect
new file mode 100644
index 0000000..e77acb3
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.expect
@@ -0,0 +1,21 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:9: Error: 'field' isn't an instance field of this class.
+//   C() : field = null;
+//         ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:9: Error: 'field' isn't an instance field of this class.
+  C() : field = null;
+        ^^^^^"
+    ;
+  set field(dynamic value) → void {}
+}
+static method main() → dynamic {
+  new self::C::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.transformed.expect
new file mode 100644
index 0000000..692c97d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/bad_setter_initializer.dart:6:9: Error: 'field' isn't an instance field of this class.
+  C() : field = null;
+        ^^^^^"
+    ;
+  set field(dynamic value) → void {}
+}
+static method main() → dynamic {
+  new self::C::•();
+}
diff --git a/pkg/front_end/testcases/rasta/bad_unicode.dart.direct.expect b/pkg/front_end/testcases/rasta/bad_unicode.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/bad_unicode.dart.direct.expect
rename to pkg/front_end/testcases/rasta/bad_unicode.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/bad_unicode.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_unicode.dart.strong.expect
new file mode 100644
index 0000000..c35015a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_unicode.dart.strong.expect
@@ -0,0 +1,19 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/bad_unicode.dart:6:10: Error: An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.
+//   print("\u00"); // Bad Unicode escape, must have 4 hex digits.
+//          ^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/bad_unicode.dart:6:10: Error: An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.
+//   print("\u00"); // Bad Unicode escape, must have 4 hex digits.
+//          ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("\\u00");
+}
diff --git a/pkg/front_end/testcases/rasta/bad_unicode.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_unicode.dart.strong.transformed.expect
new file mode 100644
index 0000000..5a2277d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/bad_unicode.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/bad_unicode.dart:6:10: Error: An escape sequence starting with '\u' must be followed by 4 hexadecimal digits or from 1 to 6 digits between '{' and '}'.
+//   print("\u00"); // Bad Unicode escape, must have 4 hex digits.
+//          ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::print("\\u00");
+}
diff --git a/pkg/front_end/testcases/rasta/breaking_bad.dart.direct.expect b/pkg/front_end/testcases/rasta/breaking_bad.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/breaking_bad.dart.direct.expect
rename to pkg/front_end/testcases/rasta/breaking_bad.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/breaking_bad.dart.strong.expect b/pkg/front_end/testcases/rasta/breaking_bad.dart.strong.expect
new file mode 100644
index 0000000..583a90e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/breaking_bad.dart.strong.expect
@@ -0,0 +1,25 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: A break statement can't be used outside of a loop or switch statement.
+// Try removing the break statement.
+//   break;
+//   ^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: A break statement can't be used outside of a loop or switch statement.
+// Try removing the break statement.
+//   break;
+//   ^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: A break statement can't be used outside of a loop or switch statement.
+Try removing the break statement.
+  break;
+  ^";
+  #L1:
+  break #L1;
+}
diff --git a/pkg/front_end/testcases/rasta/breaking_bad.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/breaking_bad.dart.strong.transformed.expect
new file mode 100644
index 0000000..5401bce
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/breaking_bad.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: A break statement can't be used outside of a loop or switch statement.
+// Try removing the break statement.
+//   break;
+//   ^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/breaking_bad.dart:6:3: Error: A break statement can't be used outside of a loop or switch statement.
+Try removing the break statement.
+  break;
+  ^";
+  #L1:
+  break #L1;
+}
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.direct.expect b/pkg/front_end/testcases/rasta/cascades.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/cascades.dart.direct.expect
rename to pkg/front_end/testcases/rasta/cascades.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/cascades.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/cascades.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/cascades.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.strong.expect b/pkg/front_end/testcases/rasta/cascades.dart.strong.expect
new file mode 100644
index 0000000..4cbe618
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/cascades.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method add(dynamic x) → dynamic
+    return x;
+}
+static method main() → dynamic {
+  self::A a = new self::A::•();
+  function f(dynamic x) → dynamic
+    return x;
+  let final self::A #t1 = a in let final dynamic #t2 = #t1.{self::A::add}(f).call("WHAT") in #t1;
+}
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect
new file mode 100644
index 0000000..4cbe618
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method add(dynamic x) → dynamic
+    return x;
+}
+static method main() → dynamic {
+  self::A a = new self::A::•();
+  function f(dynamic x) → dynamic
+    return x;
+  let final self::A #t1 = a in let final dynamic #t2 = #t1.{self::A::add}(f).call("WHAT") in #t1;
+}
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.direct.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.direct.expect
deleted file mode 100644
index 73a23ec..0000000
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.direct.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : invalid-initializer;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : invalid-initializer;
-}
-class C extends core::Object {
-  constructor •() → dynamic
-    : invalid-initializer;
-}
-class D extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::D::•];
-  static factory •() → self::D
-    let dynamic #redirecting_factory = "Missing" in invalid-expression;
-}
-static method main() → void {
-  new self::A::•();
-  new self::B::•();
-  new self::C::•();
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Missing, 32, null, <dynamic>[].toList(growable: false), <dynamic, dynamic>{}));
-}
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.legacy.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.legacy.expect
new file mode 100644
index 0000000..504291a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.legacy.expect
@@ -0,0 +1,78 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:7: Error: The type 'Missing' can't be mixed in.
+// class C = Object with Missing;
+//       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Error: Type 'Missing' not found.
+// class A extends Missing {}
+//                 ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Error: Type 'Missing' not found.
+// class B implements Missing {}
+//                    ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Error: Type 'Missing' not found.
+// class C = Object with Missing;
+//                       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Warning: Couldn't find constructor 'Missing'.
+//   factory D() = Missing;
+//                 ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Warning: Redirection constructor target not found: 'Missing'
+//   factory D() = Missing;
+//           ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Warning: Method not found: 'Missing'.
+//   factory D() = Missing;
+//           ^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:7: Error: The type 'Missing' can't be mixed in.
+// class C = Object with Missing;
+//       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Error: Type 'Missing' not found.
+// class A extends Missing {}
+//                 ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Error: Type 'Missing' not found.
+// class B implements Missing {}
+//                    ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Error: Type 'Missing' not found.
+// class C = Object with Missing;
+//                       ^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  const synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::D::•];
+  static factory •() → self::D
+    let dynamic #redirecting_factory = "Missing" in invalid-expression;
+}
+static method main() → void {
+  new self::A::•();
+  new self::B::•();
+  new self::C::•();
+  let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Missing, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2574251
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.legacy.transformed.expect
@@ -0,0 +1,48 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:7: Error: The type 'Missing' can't be mixed in.
+// class C = Object with Missing;
+//       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Error: Type 'Missing' not found.
+// class A extends Missing {}
+//                 ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Error: Type 'Missing' not found.
+// class B implements Missing {}
+//                    ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Error: Type 'Missing' not found.
+// class C = Object with Missing;
+//                       ^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  const synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::D::•];
+  static factory •() → self::D
+    let dynamic #redirecting_factory = "Missing" in invalid-expression;
+}
+static method main() → void {
+  new self::A::•();
+  new self::B::•();
+  new self::C::•();
+  let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Missing, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
index 85e236b..e9ad29f 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
@@ -37,7 +37,7 @@
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  const synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.expect
new file mode 100644
index 0000000..6ea6019
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.expect
@@ -0,0 +1,88 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:7: Error: The type 'Missing' can't be mixed in.
+// class C = Object with Missing;
+//       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Error: Type 'Missing' not found.
+// class A extends Missing {}
+//                 ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Error: Type 'Missing' not found.
+// class B implements Missing {}
+//                    ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Error: Type 'Missing' not found.
+// class C = Object with Missing;
+//                       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Couldn't find constructor 'Missing'.
+//   factory D() = Missing;
+//                 ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Error: Redirection constructor target not found: 'Missing'
+//   factory D() = Missing;
+//           ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Error: Method not found: 'Missing'.
+//   factory D() = Missing;
+//           ^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:7: Error: The type 'Missing' can't be mixed in.
+// class C = Object with Missing;
+//       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Error: Type 'Missing' not found.
+// class A extends Missing {}
+//                 ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Error: Type 'Missing' not found.
+// class B implements Missing {}
+//                    ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Error: Type 'Missing' not found.
+// class C = Object with Missing;
+//                       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Couldn't find constructor 'Missing'.
+//   factory D() = Missing;
+//                 ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Error: Redirection constructor target not found: 'Missing'
+//   factory D() = Missing;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  const synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::D::•];
+  static factory •() → self::D
+    let dynamic #redirecting_factory = "Missing" in invalid-expression;
+}
+static method main() → void {
+  new self::A::•();
+  new self::B::•();
+  new self::C::•();
+  invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Error: Method not found: 'Missing'.
+  factory D() = Missing;
+          ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.transformed.expect
new file mode 100644
index 0000000..7426197
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.transformed.expect
@@ -0,0 +1,58 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:7: Error: The type 'Missing' can't be mixed in.
+// class C = Object with Missing;
+//       ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:5:17: Error: Type 'Missing' not found.
+// class A extends Missing {}
+//                 ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:7:20: Error: Type 'Missing' not found.
+// class B implements Missing {}
+//                    ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:9:23: Error: Type 'Missing' not found.
+// class C = Object with Missing;
+//                       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:17: Error: Couldn't find constructor 'Missing'.
+//   factory D() = Missing;
+//                 ^
+//
+// pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Error: Redirection constructor target not found: 'Missing'
+//   factory D() = Missing;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  const synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::D::•];
+  static factory •() → self::D
+    let core::String #redirecting_factory = "Missing" in invalid-expression;
+}
+static method main() → void {
+  new self::A::•();
+  new self::B::•();
+  new self::C::•();
+  invalid-expression "pkg/front_end/testcases/rasta/class_hierarchy.dart:12:11: Error: Method not found: 'Missing'.
+  factory D() = Missing;
+          ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/class_member.dart.direct.expect b/pkg/front_end/testcases/rasta/class_member.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/class_member.dart.direct.expect
rename to pkg/front_end/testcases/rasta/class_member.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/class_member.dart.strong.expect b/pkg/front_end/testcases/rasta/class_member.dart.strong.expect
new file mode 100644
index 0000000..5e57d9d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/class_member.dart.strong.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic field1 = null;
+  field dynamic field2 = null;
+  field dynamic field3 = null;
+  constructor constructor1() → self::Foo
+    : super core::Object::•()
+    ;
+  constructor constructor2() → self::Foo
+    : super core::Object::•()
+    ;
+  constructor constructor3() → self::Foo
+    : super core::Object::•()
+    ;
+  method a() → dynamic {}
+  method b() → dynamic {}
+  method c() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/rasta/class_member.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/class_member.dart.strong.transformed.expect
new file mode 100644
index 0000000..5e57d9d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/class_member.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic field1 = null;
+  field dynamic field2 = null;
+  field dynamic field3 = null;
+  constructor constructor1() → self::Foo
+    : super core::Object::•()
+    ;
+  constructor constructor2() → self::Foo
+    : super core::Object::•()
+    ;
+  constructor constructor3() → self::Foo
+    : super core::Object::•()
+    ;
+  method a() → dynamic {}
+  method b() → dynamic {}
+  method c() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.direct.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.direct.expect
rename to pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.expect
new file mode 100644
index 0000000..0176956
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.expect
@@ -0,0 +1,19 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/constant_get_and_invoke.dart:8:4: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//   c();
+//    ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int c = 1;
+static method main() → dynamic {
+  self::c;
+  let final dynamic #t1 = self::c in invalid-expression "pkg/front_end/testcases/rasta/constant_get_and_invoke.dart:8:4: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+  c();
+   ^";
+}
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.transformed.expect
new file mode 100644
index 0000000..ca99349
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static const field core::int c = 1;
+static method main() → dynamic {
+  self::c;
+  let final core::int #t1 = self::c in invalid-expression "pkg/front_end/testcases/rasta/constant_get_and_invoke.dart:8:4: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+  c();
+   ^";
+}
diff --git a/pkg/front_end/testcases/rasta/deferred_lib.dart.direct.expect b/pkg/front_end/testcases/rasta/deferred_lib.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/deferred_lib.dart.direct.expect
rename to pkg/front_end/testcases/rasta/deferred_lib.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/deferred_load.dart.direct.expect b/pkg/front_end/testcases/rasta/deferred_load.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/deferred_load.dart.direct.expect
rename to pkg/front_end/testcases/rasta/deferred_load.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/deferred_load.dart.strong.expect b/pkg/front_end/testcases/rasta/deferred_load.dart.strong.expect
new file mode 100644
index 0000000..f076a51
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/deferred_load.dart.strong.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:async" as asy;
+
+static method main() → dynamic {
+  self::__loadLibrary_lib;
+  LoadLibrary(lib);
+}
+static method __loadLibrary_lib() → asy::Future<dynamic>
+  return LoadLibrary(lib);
diff --git a/pkg/front_end/testcases/rasta/deferred_load.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/deferred_load.dart.strong.transformed.expect
new file mode 100644
index 0000000..f076a51
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/deferred_load.dart.strong.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:async" as asy;
+
+static method main() → dynamic {
+  self::__loadLibrary_lib;
+  LoadLibrary(lib);
+}
+static method __loadLibrary_lib() → asy::Future<dynamic>
+  return LoadLibrary(lib);
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.expect
deleted file mode 100644
index cb6cde6..0000000
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Mixin extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::Mixin
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&Mixin = core::Object with self::Mixin {
-  synthetic constructor •() → self::_A&Object&Mixin
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin {
-  synthetic constructor •() → self::_A&Object&Mixin&Mixin
-    : super self::_A&Object&Mixin::•()
-    ;
-}
-class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.transformed.expect
deleted file mode 100644
index d3c872e..0000000
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.direct.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Mixin extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::Mixin
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&Mixin extends core::Object implements self::Mixin {
-  field dynamic field = null;
-  synthetic constructor •() → self::_A&Object&Mixin
-    : super core::Object::•()
-    ;
-}
-abstract class _A&Object&Mixin&Mixin extends self::_A&Object&Mixin implements self::Mixin {
-  field dynamic field = null;
-  synthetic constructor •() → self::_A&Object&Mixin&Mixin
-    : super self::_A&Object&Mixin::•()
-    ;
-}
-class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.expect
new file mode 100644
index 0000000..7bfef12
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&Mixin = core::Object with self::Mixin {
+  synthetic constructor •() → self::_A&Object&Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin {
+  synthetic constructor •() → self::_A&Object&Mixin&Mixin
+    : super self::_A&Object&Mixin::•()
+    ;
+}
+class A extends self::_A&Object&Mixin&Mixin {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&Mixin&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.transformed.expect
new file mode 100644
index 0000000..25d8b41
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&Mixin extends core::Object implements self::Mixin {
+  field dynamic field = null;
+  synthetic constructor •() → self::_A&Object&Mixin
+    : super core::Object::•()
+    ;
+}
+abstract class _A&Object&Mixin&Mixin extends self::_A&Object&Mixin implements self::Mixin {
+  field dynamic field = null;
+  synthetic constructor •() → self::_A&Object&Mixin&Mixin
+    : super self::_A&Object&Mixin::•()
+    ;
+}
+class A extends self::_A&Object&Mixin&Mixin {
+  synthetic constructor •() → self::A
+    : super self::_A&Object&Mixin&Mixin::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect
index cb6cde6..7bfef12 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect
@@ -20,6 +20,6 @@
 }
 class A extends self::_A&Object&Mixin&Mixin {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&Mixin&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.transformed.expect
index d3c872e..25d8b41 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.transformed.expect
@@ -22,6 +22,6 @@
 }
 class A extends self::_A&Object&Mixin&Mixin {
   synthetic constructor •() → self::A
-    : super core::Object::•()
+    : super self::_A&Object&Mixin&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/enum.dart.direct.expect b/pkg/front_end/testcases/rasta/enum.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/enum.dart.direct.expect
rename to pkg/front_end/testcases/rasta/enum.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/enum.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/enum.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/enum.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/enum.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/enum.dart.direct.expect b/pkg/front_end/testcases/rasta/enum.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/enum.dart.direct.expect
copy to pkg/front_end/testcases/rasta/enum.dart.strong.expect
diff --git a/pkg/front_end/testcases/rasta/enum.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/enum.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/enum.dart.direct.transformed.expect
copy to pkg/front_end/testcases/rasta/enum.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/export.dart.direct.expect b/pkg/front_end/testcases/rasta/export.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/export.dart.direct.expect
rename to pkg/front_end/testcases/rasta/export.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/export.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/export.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/export.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/export.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/external_factory_redirection.dart.direct.expect b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/external_factory_redirection.dart.direct.expect
rename to pkg/front_end/testcases/rasta/external_factory_redirection.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.expect b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.expect
new file mode 100644
index 0000000..acf6687
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  "Should redirect to LinkedHashMap constructor.";
+  core::Map::•<core::Symbol, dynamic>();
+}
diff --git a/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.transformed.expect
new file mode 100644
index 0000000..acf6687
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.transformed.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  "Should redirect to LinkedHashMap constructor.";
+  core::Map::•<core::Symbol, dynamic>();
+}
diff --git a/pkg/front_end/testcases/rasta/foo.dart.direct.expect b/pkg/front_end/testcases/rasta/foo.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/foo.dart.direct.expect
rename to pkg/front_end/testcases/rasta/foo.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/foo.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/foo.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/foo.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/foo.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/for_loop.dart.direct.expect b/pkg/front_end/testcases/rasta/for_loop.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/for_loop.dart.direct.expect
rename to pkg/front_end/testcases/rasta/for_loop.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/for_loop.dart.strong.expect b/pkg/front_end/testcases/rasta/for_loop.dart.strong.expect
new file mode 100644
index 0000000..babb8d3
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/for_loop.dart.strong.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int c = new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch};
+  for (core::int i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
+    core::print(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1) in #t1);
+  }
+  for (core::int i = 0; i.{core::num::<}(100); c.{core::num::<}(42) ?{core::int} throw "fisk" : let final core::int #t3 = i in let final core::int #t4 = i = #t3.{core::num::+}(1) in #t3) {
+    core::print(let final core::int #t5 = i in let final core::int #t6 = i = #t5.{core::num::+}(1) in #t5);
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/for_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/for_loop.dart.strong.transformed.expect
new file mode 100644
index 0000000..babb8d3
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/for_loop.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int c = new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch};
+  for (core::int i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
+    core::print(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1) in #t1);
+  }
+  for (core::int i = 0; i.{core::num::<}(100); c.{core::num::<}(42) ?{core::int} throw "fisk" : let final core::int #t3 = i in let final core::int #t4 = i = #t3.{core::num::+}(1) in #t3) {
+    core::print(let final core::int #t5 = i in let final core::int #t6 = i = #t5.{core::num::+}(1) in #t5);
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/for_loop.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/for_loop.dart.type_promotion.expect
new file mode 100644
index 0000000..2beae6f
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/for_loop.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/rasta/for_loop.dart:7:29: Context: Write to i@292
+  for (int i = 0; i < 100; i++) {
+                            ^^
+pkg/front_end/testcases/rasta/for_loop.dart:8:12: Context: Write to i@292
+    print(i++);
+           ^^
+pkg/front_end/testcases/rasta/for_loop.dart:10:53: Context: Write to i@292
+  for (int i = 0; i < 100; c < 42 ? throw "fisk" : i++) {
+                                                    ^^
+pkg/front_end/testcases/rasta/for_loop.dart:11:12: Context: Write to i@292
+    print(i++);
+           ^^
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.direct.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/generic_factory.dart.direct.expect
rename to pkg/front_end/testcases/rasta/generic_factory.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.strong.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.strong.expect
new file mode 100644
index 0000000..c0465b0
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.strong.expect
@@ -0,0 +1,107 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Couldn't find constructor 'Missing'.
+//   factory A.c() = Missing;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Redirection constructor target not found: 'Missing'
+//   factory A.c() = Missing;
+//           ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory A.b() = B<C1>.a;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory B.b() = C<C2>;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Method not found: 'Missing'.
+//   factory A.c() = Missing;
+//           ^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Couldn't find constructor 'Missing'.
+//   factory A.c() = Missing;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Redirection constructor target not found: 'Missing'
+//   factory A.c() = Missing;
+//           ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory A.b() = B<C1>.a;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory B.b() = C<C2>;
+//                   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
+  constructor internal() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+  static factory a<T extends core::Object = dynamic>() → self::A<self::A::a::T>
+    let dynamic #redirecting_factory = self::B::a in let self::A::a::T #typeArg0 = null in invalid-expression;
+  static factory b<T extends core::Object = dynamic>() → self::A<self::A::b::T>
+    let dynamic #redirecting_factory = self::B::a in let self::C1 #typeArg0 = null in invalid-expression;
+  static factory c<T extends core::Object = dynamic>() → self::A<self::A::c::T>
+    let dynamic #redirecting_factory = "Missing" in invalid-expression;
+}
+class B<S extends core::Object = dynamic> extends self::A<self::B::S> {
+  static field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
+  constructor internal() → self::B<self::B::S>
+    : super self::A::internal()
+    ;
+  static factory a<S extends core::Object = dynamic>() → self::B<self::B::a::S>
+    let dynamic #redirecting_factory = self::C::• in let self::B::a::S #typeArg0 = null in invalid-expression;
+  static factory b<S extends core::Object = dynamic>() → self::B<self::B::b::S>
+    let dynamic #redirecting_factory = self::C::• in let self::C2 #typeArg0 = null in invalid-expression;
+}
+class C<U extends core::Object = dynamic> extends self::B<self::C::U> {
+  constructor •() → self::C<self::C::U>
+    : super self::B::internal()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•<self::C3>();
+  new self::C::•<self::C1>();
+  new self::C::•<self::C3>();
+  new self::C::•<self::C2>();
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Method not found: 'Missing'.
+  factory A.c() = Missing;
+          ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.strong.transformed.expect
new file mode 100644
index 0000000..d931017
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.strong.transformed.expect
@@ -0,0 +1,79 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:19: Error: Couldn't find constructor 'Missing'.
+//   factory A.c() = Missing;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Redirection constructor target not found: 'Missing'
+//   factory A.c() = Missing;
+//           ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:15:19: Error: The constructor function type 'B<C1> Function()' isn't a subtype of 'A<T> Function()'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C1' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'A' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory A.b() = B<C1>.a;
+//                   ^
+//
+// pkg/front_end/testcases/rasta/generic_factory.dart:23:19: Error: The constructor function type 'C<C2> Function()' isn't a subtype of 'B<S> Function()'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'C2' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//  - 'B' is from 'pkg/front_end/testcases/rasta/generic_factory.dart'.
+//   factory B.b() = C<C2>;
+//                   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
+  constructor internal() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+  static factory a<T extends core::Object = dynamic>() → self::A<self::A::a::T>
+    let <S extends core::Object = dynamic>() → self::B<self::B::a::S> #redirecting_factory = self::B::a in let self::A::a::T #typeArg0 = null in invalid-expression;
+  static factory b<T extends core::Object = dynamic>() → self::A<self::A::b::T>
+    let <S extends core::Object = dynamic>() → self::B<self::B::a::S> #redirecting_factory = self::B::a in let self::C1 #typeArg0 = null in invalid-expression;
+  static factory c<T extends core::Object = dynamic>() → self::A<self::A::c::T>
+    let core::String #redirecting_factory = "Missing" in invalid-expression;
+}
+class B<S extends core::Object = dynamic> extends self::A<self::B::S> {
+  static field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
+  constructor internal() → self::B<self::B::S>
+    : super self::A::internal()
+    ;
+  static factory a<S extends core::Object = dynamic>() → self::B<self::B::a::S>
+    let<BottomType> #redirecting_factory = self::C::• in let self::B::a::S #typeArg0 = null in invalid-expression;
+  static factory b<S extends core::Object = dynamic>() → self::B<self::B::b::S>
+    let<BottomType> #redirecting_factory = self::C::• in let self::C2 #typeArg0 = null in invalid-expression;
+}
+class C<U extends core::Object = dynamic> extends self::B<self::C::U> {
+  constructor •() → self::C<self::C::U>
+    : super self::B::internal()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•<self::C3>();
+  new self::C::•<self::C1>();
+  new self::C::•<self::C3>();
+  new self::C::•<self::C2>();
+  invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Method not found: 'Missing'.
+  factory A.c() = Missing;
+          ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/hello.dart.direct.expect b/pkg/front_end/testcases/rasta/hello.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/hello.dart.direct.expect
rename to pkg/front_end/testcases/rasta/hello.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/hello.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/hello.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/hello.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/hello.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/hello.dart.direct.expect b/pkg/front_end/testcases/rasta/hello.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/hello.dart.direct.expect
copy to pkg/front_end/testcases/rasta/hello.dart.strong.expect
diff --git a/pkg/front_end/testcases/rasta/hello.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/hello.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/hello.dart.direct.transformed.expect
copy to pkg/front_end/testcases/rasta/hello.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/import_export.dart.direct.expect b/pkg/front_end/testcases/rasta/import_export.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/import_export.dart.direct.expect
rename to pkg/front_end/testcases/rasta/import_export.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/import_export.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/import_export.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/import_export.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000001.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000001.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000001.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000001.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000001.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000001.dart.strong.expect
new file mode 100644
index 0000000..d435a39
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000001.dart.strong.expect
@@ -0,0 +1,23 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000001.dart:11:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+// Try removing the extra positional arguments.
+//   test0(0, 1);
+//        ^
+// pkg/front_end/testcases/rasta/issue_000001.dart:5:1: Context: Found this candidate, but the arguments don't match.
+// test0(x) {
+// ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test0(dynamic x) → dynamic {
+  core::print("test0");
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000001.dart:11:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  test0(0, 1);
+       ^";
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000001.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000001.dart.strong.transformed.expect
new file mode 100644
index 0000000..0f8dca8
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000001.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test0(dynamic x) → dynamic {
+  core::print("test0");
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000001.dart:11:8: Error: Too many positional arguments: 1 allowed, but 2 found.
+Try removing the extra positional arguments.
+  test0(0, 1);
+       ^";
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000002.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000002.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000002.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000002.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.strong.expect
new file mode 100644
index 0000000..cb9d36e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.strong.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+import "dart:typed_data" as typ;
+
+class Foo extends core::Object {
+  final field dynamic value;
+  constructor •(dynamic value) → self::Foo
+    : self::Foo::value = value, super core::Object::•() {}
+  static factory fac(dynamic value) → self::Foo {
+    return new self::Foo::•(value);
+  }
+}
+static field core::List<core::int> list = <core::int>[1, 2, 3];
+static method main() → dynamic {
+  exp::Expect::isTrue(typ::Uint8List::fromList(self::list).{core::List::[]}(1).{core::num::==}(2));
+  exp::Expect::isTrue(self::Foo::fac(10).{self::Foo::value}.{core::Object::==}(10));
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.strong.transformed.expect
new file mode 100644
index 0000000..cb9d36e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+import "dart:typed_data" as typ;
+
+class Foo extends core::Object {
+  final field dynamic value;
+  constructor •(dynamic value) → self::Foo
+    : self::Foo::value = value, super core::Object::•() {}
+  static factory fac(dynamic value) → self::Foo {
+    return new self::Foo::•(value);
+  }
+}
+static field core::List<core::int> list = <core::int>[1, 2, 3];
+static method main() → dynamic {
+  exp::Expect::isTrue(typ::Uint8List::fromList(self::list).{core::List::[]}(1).{core::num::==}(2));
+  exp::Expect::isTrue(self::Foo::fac(10).{self::Foo::value}.{core::Object::==}(10));
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000004.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000004.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000004.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000004.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.expect
new file mode 100644
index 0000000..faa041e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+static field dynamic global;
+static method fact4() → dynamic {
+  core::int f = 1;
+  for (core::int n in <core::int>[1, 2, 3, 4]) {
+    f = f.{core::num::*}(n);
+  }
+  return f;
+}
+static method fact5() → dynamic {
+  core::int f = 1;
+  dynamic n;
+  for (final dynamic #t1 in <dynamic>[1, 2, 3, 4, 5]) {
+    n = #t1;
+    f = f.{core::num::*}(n as{TypeError} core::num) as{TypeError} core::int;
+  }
+  return f;
+}
+static method fact6() → dynamic {
+  core::int f = 1;
+  for (final dynamic #t2 in <dynamic>[1, 2, 3, 4, 5, 6]) {
+    self::global = #t2;
+    f = f.{core::num::*}(self::global as{TypeError} core::num) as{TypeError} core::int;
+  }
+  return f;
+}
+static method main() → dynamic {
+  exp::Expect::isTrue(self::fact4().{core::Object::==}(24));
+  exp::Expect::isTrue(self::fact5().{core::Object::==}(120));
+  exp::Expect::isTrue(self::fact6().{core::Object::==}(720));
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect
new file mode 100644
index 0000000..faa041e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+static field dynamic global;
+static method fact4() → dynamic {
+  core::int f = 1;
+  for (core::int n in <core::int>[1, 2, 3, 4]) {
+    f = f.{core::num::*}(n);
+  }
+  return f;
+}
+static method fact5() → dynamic {
+  core::int f = 1;
+  dynamic n;
+  for (final dynamic #t1 in <dynamic>[1, 2, 3, 4, 5]) {
+    n = #t1;
+    f = f.{core::num::*}(n as{TypeError} core::num) as{TypeError} core::int;
+  }
+  return f;
+}
+static method fact6() → dynamic {
+  core::int f = 1;
+  for (final dynamic #t2 in <dynamic>[1, 2, 3, 4, 5, 6]) {
+    self::global = #t2;
+    f = f.{core::num::*}(self::global as{TypeError} core::num) as{TypeError} core::int;
+  }
+  return f;
+}
+static method main() → dynamic {
+  exp::Expect::isTrue(self::fact4().{core::Object::==}(24));
+  exp::Expect::isTrue(self::fact5().{core::Object::==}(120));
+  exp::Expect::isTrue(self::fact6().{core::Object::==}(720));
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.type_promotion.expect
new file mode 100644
index 0000000..4904aab
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/rasta/issue_000004.dart:10:7: Context: Write to f@273
+    f *= n;
+      ^^
+pkg/front_end/testcases/rasta/issue_000004.dart:18:7: Context: Write to f@359
+    f *= n;
+      ^^
+pkg/front_end/testcases/rasta/issue_000004.dart:27:7: Context: Write to f@459
+    f *= global;
+      ^^
diff --git a/pkg/front_end/testcases/rasta/issue_000006.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000006.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000006.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000006.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000006.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000006.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000006.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000006.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000006.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000006.dart.strong.expect
new file mode 100644
index 0000000..56bb4a2
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000006.dart.strong.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int> list = <core::int>[1, 2, 3];
+static method main() → dynamic {
+  self::list.{core::List::add}(1);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000006.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000006.dart.strong.transformed.expect
new file mode 100644
index 0000000..56bb4a2
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000006.dart.strong.transformed.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::List<core::int> list = <core::int>[1, 2, 3];
+static method main() → dynamic {
+  self::list.{core::List::add}(1);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.direct.expect
deleted file mode 100644
index a293cd7..0000000
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.direct.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Base extends core::Object {
-  synthetic constructor •() → self::Base
-    : super core::Object::•()
-    ;
-}
-class Mixin extends core::Object {
-  synthetic constructor •() → self::Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return core::print("foo");
-}
-abstract class _Sub&Base&Mixin = self::Base with self::Mixin {
-  synthetic constructor •() → self::_Sub&Base&Mixin
-    : super self::Base::•()
-    ;
-}
-class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → self::Sub
-    : super self::Base::•()
-    ;
-}
-static method main() → dynamic {
-  new self::Sub::•().foo();
-}
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.direct.transformed.expect
deleted file mode 100644
index 7fb2814..0000000
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.direct.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Base extends core::Object {
-  synthetic constructor •() → self::Base
-    : super core::Object::•()
-    ;
-}
-class Mixin extends core::Object {
-  synthetic constructor •() → self::Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return core::print("foo");
-}
-abstract class _Sub&Base&Mixin extends self::Base implements self::Mixin {
-  synthetic constructor •() → self::_Sub&Base&Mixin
-    : super self::Base::•()
-    ;
-  method foo() → dynamic
-    return core::print("foo");
-}
-class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → self::Sub
-    : super self::Base::•()
-    ;
-}
-static method main() → dynamic {
-  new self::Sub::•().foo();
-}
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.expect
new file mode 100644
index 0000000..16d9699
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  synthetic constructor •() → self::Base
+    : super core::Object::•()
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return core::print("foo");
+}
+abstract class _Sub&Base&Mixin = self::Base with self::Mixin {
+  synthetic constructor •() → self::_Sub&Base&Mixin
+    : super self::Base::•()
+    ;
+}
+class Sub extends self::_Sub&Base&Mixin {
+  synthetic constructor •() → self::Sub
+    : super self::_Sub&Base&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  new self::Sub::•().foo();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c528ee0
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  synthetic constructor •() → self::Base
+    : super core::Object::•()
+    ;
+}
+class Mixin extends core::Object {
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return core::print("foo");
+}
+abstract class _Sub&Base&Mixin extends self::Base implements self::Mixin {
+  synthetic constructor •() → self::_Sub&Base&Mixin
+    : super self::Base::•()
+    ;
+  method foo() → dynamic
+    return core::print("foo");
+}
+class Sub extends self::_Sub&Base&Mixin {
+  synthetic constructor •() → self::Sub
+    : super self::_Sub&Base&Mixin::•()
+    ;
+}
+static method main() → dynamic {
+  new self::Sub::•().foo();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect
index 11c3766..2df31da 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect
@@ -21,7 +21,7 @@
 }
 class Sub extends self::_Sub&Base&Mixin {
   synthetic constructor •() → self::Sub
-    : super self::Base::•()
+    : super self::_Sub&Base&Mixin::•()
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.transformed.expect
index 162a19d..70c6e40 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
 }
 class Sub extends self::_Sub&Base&Mixin {
   synthetic constructor •() → self::Sub
-    : super self::Base::•()
+    : super self::_Sub&Base&Mixin::•()
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000008.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000008.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000008.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000008.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000008.dart.direct.expect
copy to pkg/front_end/testcases/rasta/issue_000008.dart.strong.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000008.dart.direct.transformed.expect
copy to pkg/front_end/testcases/rasta/issue_000008.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000011.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000011.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000011.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000011.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000011.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000011.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000011.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000011.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000011.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000011.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000011.dart.direct.expect
copy to pkg/front_end/testcases/rasta/issue_000011.dart.strong.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000011.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000011.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000011.dart.direct.transformed.expect
copy to pkg/front_end/testcases/rasta/issue_000011.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000012.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000012.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000012.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000012.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.strong.expect
new file mode 100644
index 0000000..58026e4
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.strong.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method m() → dynamic {
+    super.{self::A::field} = 42;
+  }
+}
+static method main() → dynamic {
+  new self::B::•().{self::B::m}();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.strong.transformed.expect
new file mode 100644
index 0000000..58026e4
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  method m() → dynamic {
+    super.{self::A::field} = 42;
+  }
+}
+static method main() → dynamic {
+  new self::B::•().{self::B::m}();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000025.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000025.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000025.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000025.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000025.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000025.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000025.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000025.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000025.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000025.dart.strong.expect
new file mode 100644
index 0000000..3be7ccc
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000025.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static get x() → dynamic
+  return 42;
+static set x(dynamic val) → void {}
+static method main() → dynamic {
+  core::print(self::x);
+  core::print(self::x = 87);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000025.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000025.dart.strong.transformed.expect
new file mode 100644
index 0000000..3be7ccc
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000025.dart.strong.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static get x() → dynamic
+  return 42;
+static set x(dynamic val) → void {}
+static method main() → dynamic {
+  core::print(self::x);
+  core::print(self::x = 87);
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000026.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000026.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000026.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000026.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.expect
new file mode 100644
index 0000000..01488e9
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic a = null;
+  field core::int b = 0;
+  field core::int c = 1.{core::num::+}(2);
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  field dynamic a = null;
+  field core::int b = 1;
+  field core::int c = 2.{core::num::-}(3);
+  constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•();
+  new self::D::•();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
new file mode 100644
index 0000000..01488e9
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic a = null;
+  field core::int b = 0;
+  field core::int c = 1.{core::num::+}(2);
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  field dynamic a = null;
+  field core::int b = 1;
+  field core::int c = 2.{core::num::-}(3);
+  constructor •() → self::D
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•();
+  new self::D::•();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000031.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000031.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000031.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000031.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000031.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.expect
new file mode 100644
index 0000000..8894cf7
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.expect
@@ -0,0 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000031.dart:8:3: Error: A prefix can't be used as an expression.
+//   math..toString();
+//   ^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  let final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000031.dart:8:3: Error: A prefix can't be used as an expression.
+  math..toString();
+  ^^^^" in let final dynamic #t2 = #t1.{dart.core::Object::toString}() in #t1;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect
new file mode 100644
index 0000000..3042bd3
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  let final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000031.dart:8:3: Error: A prefix can't be used as an expression.
+  math..toString();
+  ^^^^" in let final core::String #t2 = #t1.{core::Object::toString}() in #t1;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000032.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000032.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
new file mode 100644
index 0000000..6e2309c
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
@@ -0,0 +1,75 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected an identifier, but got '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:4: Error: Constructors can't have type parameters.
+//   C<
+//    ^^...
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:3: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   C<
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected '{' before this.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:11:1: Error: Expected an identifier, but got '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:11:1: Error: Expected ';' after this.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
+// Try correcting the name to the name of an existing method, or defining a method named '<'.
+//   C<
+//    ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected an identifier, but got '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:4: Error: Constructors can't have type parameters.
+//   C<
+//    ^^...
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:3: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   C<
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected '{' before this.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:11:1: Error: Expected an identifier, but got '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:11:1: Error: Expected ';' after this.
+// }
+// ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : super core::Object::•() {}
+}
+static method main() → dynamic {
+  let final dynamic #t1 = self::C in invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  C<
+   ^";
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
new file mode 100644
index 0000000..296395e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected an identifier, but got '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:4: Error: Constructors can't have type parameters.
+//   C<
+//    ^^...
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:6:3: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+//   C<
+//   ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:7:1: Error: Expected '{' before this.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:11:1: Error: Expected an identifier, but got '}'.
+// }
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000032.dart:11:1: Error: Expected ';' after this.
+// }
+// ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : super core::Object::•() {}
+}
+static method main() → dynamic {
+  let final core::Type #t1 = self::C in invalid-expression "pkg/front_end/testcases/rasta/issue_000032.dart:10:4: Error: The method '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  C<
+   ^";
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000033.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000033.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000033.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000033.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.strong.expect
new file mode 100644
index 0000000..894663d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000033.dart.strong.expect
@@ -0,0 +1,13 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Method not found: 'JS'.
+// @JS()
+//  ^^
+
+library;
+import self as self;
+
+@invalid-expression "pkg/front_end/testcases/rasta/issue_000033.dart:5:2: Error: Method not found: 'JS'.
+@JS()
+ ^^"
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000033.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000033.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000033.dart.direct.transformed.expect
copy to pkg/front_end/testcases/rasta/issue_000033.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000034.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000034.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000034.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000034.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart b/pkg/front_end/testcases/rasta/issue_000035.dart
index 62e390e..e3c51c1 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart
@@ -3,3 +3,5 @@
 // BSD-style license that can be found in the LICENSE.md file.
 
 class C {æøC();}
+
+main() {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.direct.expect
deleted file mode 100644
index 2d661c2..0000000
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.direct.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  abstract method æøC() → dynamic;
-}
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.expect
new file mode 100644
index 0000000..50d18b1
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.expect
@@ -0,0 +1,60 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Error: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:11: Error: The non-ASCII character 'ø' (U+00F8) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//           ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - C.æøC
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C {æøC();}
+//       ^
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Context: 'C.æøC' is defined here.
+// class C {æøC();}
+//          ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Error: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:11: Error: The non-ASCII character 'ø' (U+00F8) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//           ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - C.æøC
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class C {æøC();}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method æøC() → dynamic;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.transformed.expect
new file mode 100644
index 0000000..05fecd8
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Error: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:11: Error: The non-ASCII character 'ø' (U+00F8) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//           ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - C.æøC
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class C {æøC();}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method æøC() → dynamic;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
index 1cb4d37..9df0e68 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
@@ -9,6 +9,20 @@
 // Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
 // class C {æøC();}
 //           ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - C.æøC
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C {æøC();}
+//       ^
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Context: 'C.æøC' is defined here.
+// class C {æøC();}
+//          ^^^
 
 library;
 import self as self;
@@ -19,3 +33,5 @@
     ;
   abstract method æøC() → dynamic;
 }
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.strong.expect
new file mode 100644
index 0000000..e30cdd8
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.strong.expect
@@ -0,0 +1,60 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Error: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:11: Error: The non-ASCII character 'ø' (U+00F8) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//           ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - 'æøC'
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+//
+// class C {æøC();}
+//       ^
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Context: 'æøC' is defined here.
+// class C {æøC();}
+//          ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Error: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:11: Error: The non-ASCII character 'ø' (U+00F8) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//           ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - 'æøC'
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class C {æøC();}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method æøC() → dynamic;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.strong.transformed.expect
new file mode 100644
index 0000000..62a78a7
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.strong.transformed.expect
@@ -0,0 +1,34 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:10: Error: The non-ASCII character 'æ' (U+00E6) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:11: Error: The non-ASCII character 'ø' (U+00F8) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+// class C {æøC();}
+//           ^
+//
+// pkg/front_end/testcases/rasta/issue_000035.dart:5:7: Error: The non-abstract class 'C' is missing implementations for these members:
+//  - 'æøC'
+// Try to either
+//  - provide an implementation,
+//  - inherit an implementation from a superclass or mixin,
+//  - mark the class as abstract, or
+//  - provide a 'noSuchMethod' implementation.
+// 
+// class C {æøC();}
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  abstract method æøC() → dynamic;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart b/pkg/front_end/testcases/rasta/issue_000035a.dart
index d7da04e..1e6c8e4 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart
@@ -3,3 +3,5 @@
 // BSD-style license that can be found in the LICENSE.md file.
 
 class C{

C();}
+
+main() {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.direct.expect
deleted file mode 100644
index bfc00968..0000000
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.direct.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  constructor •() → void
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.expect
new file mode 100644
index 0000000..96ddc05
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.expect
@@ -0,0 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:9: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:10: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//          ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:9: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:10: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//          ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5b57ed6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:9: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:10: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//          ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
index 94e5b72..4ad8bee 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
@@ -16,3 +16,5 @@
   constructor •() → self::C
     ;
 }
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.expect
new file mode 100644
index 0000000..96ddc05
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.expect
@@ -0,0 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:9: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:10: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//          ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:9: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:10: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//          ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.transformed.expect
new file mode 100644
index 0000000..5b57ed6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:9: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//         ^
+//
+// pkg/front_end/testcases/rasta/issue_000035a.dart:5:10: Error: The non-ASCII space character U+2028 can only be used in strings and comments.
+// class C{

C();}
+//          ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/issue_000036.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000036.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000036.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000036.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000036.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000036.dart.strong.expect
new file mode 100644
index 0000000..52166ab
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000036.dart.strong.expect
@@ -0,0 +1,23 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got '-'.
+// main() => a. - 5;
+//              ^
+//
+// pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got ''.
+// main() => a. - 5;
+//              ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got '-'.
+// main() => a. - 5;
+//              ^
+
+library;
+import self as self;
+
+static method main() → dynamic
+  return invalid-expression "pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got ''.
+main() => a. - 5;
+             ^".-(5);
diff --git a/pkg/front_end/testcases/rasta/issue_000036.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000036.dart.strong.transformed.expect
new file mode 100644
index 0000000..a3dffd2
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000036.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got '-'.
+// main() => a. - 5;
+//              ^
+
+library;
+import self as self;
+
+static method main() → dynamic
+  return invalid-expression "pkg/front_end/testcases/rasta/issue_000036.dart:5:14: Error: Expected an identifier, but got ''.
+main() => a. - 5;
+             ^".-(5);
diff --git a/pkg/front_end/testcases/rasta/issue_000039.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000039.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000039.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000039.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000041.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000041.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000041.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000041.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000042.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000042.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect
new file mode 100644
index 0000000..ff7ce50
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect
@@ -0,0 +1,80 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:6:13: Error: Unexpected token ','.
+//   for (var x, y in []) {}
+//             ^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+//   for (var x, y in []) {}
+//        ^^^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:7:8: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   L: { continue L; }
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:8:18: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   L: if (true) { continue L; }
+//                  ^^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:6:13: Error: Unexpected token ','.
+//   for (var x, y in []) {}
+//             ^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:7:8: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   L: { continue L; }
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:8:18: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   L: if (true) { continue L; }
+//                  ^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  {
+    invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+  for (var x, y in []) {}
+       ^^^";
+    for (final dynamic #t1 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+  for (var x, y in []) {}
+       ^^^";
+      dynamic x;
+      dynamic y;
+      {}
+    }
+  }
+  #L1:
+  {
+    break #L1;
+  }
+  #L2:
+  if(true) {
+    break #L2;
+  }
+  #L3:
+  switch(1) {
+    #L4:
+    case 1:
+      {
+        break #L3;
+      }
+    #L5:
+    case 2:
+      {
+        break #L3;
+      }
+  }
+  try {
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
new file mode 100644
index 0000000..f64ff50
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
@@ -0,0 +1,60 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:6:13: Error: Unexpected token ','.
+//   for (var x, y in []) {}
+//             ^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:7:8: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   L: { continue L; }
+//        ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000042.dart:8:18: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//   L: if (true) { continue L; }
+//                  ^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  {
+    invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+  for (var x, y in []) {}
+       ^^^";
+    for (final dynamic #t1 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
+  for (var x, y in []) {}
+       ^^^";
+      dynamic x;
+      dynamic y;
+      {}
+    }
+  }
+  #L1:
+  {
+    break #L1;
+  }
+  #L2:
+  if(true) {
+    break #L2;
+  }
+  #L3:
+  switch(1) {
+    #L4:
+    case 1:
+      {
+        break #L3;
+      }
+    #L5:
+    case 2:
+      {
+        break #L3;
+      }
+  }
+  try {
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000043.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000043.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.expect
new file mode 100644
index 0000000..84c90c8
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get x() → dynamic
+    return "${self::C}".{core::String::hashCode};
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
new file mode 100644
index 0000000..84c90c8
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  get x() → dynamic
+    return "${self::C}".{core::String::hashCode};
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000044.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000044.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.strong.expect
new file mode 100644
index 0000000..699adf1
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.strong.expect
@@ -0,0 +1,140 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// a b(c) = d;
+//        ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:1: Error: Type 'a' not found.
+// a b(c) = d;
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Couldn't find constructor 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Getter not found: 'd'.
+// a b(c) = d;
+//          ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:33: Error: Getter not found: 'constant'.
+//   C.missingFactoryKeyword() = C.constant;
+//                                 ^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Constructors can't have a return type.
+// Try removing the return type.
+//   C.missingFactoryKeyword() = C.constant;
+//                               ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Getter not found: 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   print(const C.missingFactoryKeyword());
+//               ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// a b(c) = d;
+//        ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:1: Error: Type 'a' not found.
+// a b(c) = d;
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Couldn't find constructor 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Getter not found: 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::good];
+  const constructor constant() → self::C
+    : super core::Object::•()
+    ;
+  constructor missingFactoryKeyword() → self::C
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Constructors can't have a return type.
+Try removing the return type.
+  C.missingFactoryKeyword() = C.constant;
+                              ^";
+  static factory good() → self::C
+    let dynamic #redirecting_factory = self::C::constant in invalid-expression;
+  method notEvenAConstructor(dynamic a) → self::C
+    return (let final dynamic #t1 = this in invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'h'.
+  C notEvenAConstructor(a) = h;
+                             ^") as{TypeError} self::C;
+}
+static method b(dynamic c) → invalid-type
+  return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Getter not found: 'd'.
+a b(c) = d;
+         ^" as{TypeError} invalid-type;
+static method main() → dynamic {
+  self::C c = null;
+  core::print(const self::C::constant());
+  core::print(invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  print(const C.missingFactoryKeyword());
+              ^");
+  core::print(const self::C::constant());
+  core::print(new self::C::constant().{self::C::notEvenAConstructor}(null));
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.strong.transformed.expect
new file mode 100644
index 0000000..0f4b3f6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.strong.transformed.expect
@@ -0,0 +1,77 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:8: Error: Expected a function body or '=>'.
+// Try adding {}.
+// a b(c) = d;
+//        ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Only factory constructor can specify '=' redirection.
+// Try making this a factory constructor, or remove the redirection.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:7:1: Error: Type 'a' not found.
+// a b(c) = d;
+// ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Couldn't find constructor 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:14:29: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   C.missingFactoryKeyword() = C.constant;
+//                             ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:28: Error: Expected a function body or '=>'.
+// Try adding {}.
+//   C notEvenAConstructor(a) = h;
+//                            ^
+//
+// pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: Getter not found: 'h'.
+//   C notEvenAConstructor(a) = h;
+//                              ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::good];
+  const constructor constant() → self::C
+    : super core::Object::•()
+    ;
+  constructor missingFactoryKeyword() → self::C
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:14:31: Error: Constructors can't have a return type.
+Try removing the return type.
+  C.missingFactoryKeyword() = C.constant;
+                              ^";
+  static factory good() → self::C
+    let<BottomType> #redirecting_factory = self::C::constant in invalid-expression;
+  method notEvenAConstructor(dynamic a) → self::C
+    return (let final self::C #t1 = this in invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:21:30: Error: The getter 'h' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/issue_000044.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'h'.
+  C notEvenAConstructor(a) = h;
+                             ^") as{TypeError} self::C;
+}
+static method b(dynamic c) → invalid-type
+  return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Getter not found: 'd'.
+a b(c) = d;
+         ^" as{TypeError} invalid-type;
+static method main() → dynamic {
+  self::C c = null;
+  core::print(const self::C::constant());
+  core::print(invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:27:15: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  print(const C.missingFactoryKeyword());
+              ^");
+  core::print(const self::C::constant());
+  core::print(new self::C::constant().{self::C::notEvenAConstructor}(null));
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.direct.expect
deleted file mode 100644
index 1cafd63..0000000
--- a/pkg/front_end/testcases/rasta/issue_000045.dart.direct.expect
+++ /dev/null
@@ -1,5 +0,0 @@
-library;
-import self as self;
-
-static method main() → dynamic
-  invalid-statement;
diff --git a/pkg/front_end/testcases/rasta/issue_000036.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.legacy.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000036.dart.direct.expect
copy to pkg/front_end/testcases/rasta/issue_000045.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.expect
new file mode 100644
index 0000000..8540011
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.expect
@@ -0,0 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: String starting with """ must end with """.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: Expected ';' after this.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:6:1: Error: Unexpected token ''.
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: String starting with """ must end with """.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: Expected ';' after this.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:6:1: Error: Unexpected token ''.
+
+library;
+import self as self;
+
+static method main() → dynamic
+  return "${1}
+";
diff --git a/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
new file mode 100644
index 0000000..cfd867a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000045.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: String starting with """ must end with """.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:5:18: Error: Expected ';' after this.
+// main() => """${1}
+//                  ^...
+//
+// pkg/front_end/testcases/rasta/issue_000045.dart:6:1: Error: Unexpected token ''.
+
+library;
+import self as self;
+
+static method main() → dynamic
+  return "${1}
+";
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.direct.expect
deleted file mode 100644
index 2910ee2..0000000
--- a/pkg/front_end/testcases/rasta/issue_000046.dart.direct.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  field invalid-type c;
-  constructor •() → self::C
-    : self::C::c = invalid-expression, super core::Object::•();
-}
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.expect
new file mode 100644
index 0000000..433743b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.expect
@@ -0,0 +1,46 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: Expected '(' after this.
+//   C c = new Object)();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected ';' after this.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected a class member, but got ')'.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:20: Error: Expected an identifier, but got '('.
+//   C c = new Object)();
+//                    ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: Expected '(' after this.
+//   C c = new Object)();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected ';' after this.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected a class member, but got ')'.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:20: Error: Expected an identifier, but got '('.
+//   C c = new Object)();
+//                    ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field self::C c = new core::Object::•();
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f92e78d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.transformed.expect
@@ -0,0 +1,28 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: Expected '(' after this.
+//   C c = new Object)();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected ';' after this.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected a class member, but got ')'.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:20: Error: Expected an identifier, but got '('.
+//   C c = new Object)();
+//                    ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field self::C c = new core::Object::•();
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.outline.expect
index d3f123b..5151357 100644
--- a/pkg/front_end/testcases/rasta/issue_000046.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.outline.expect
@@ -1,9 +1,27 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: Expected '(' after this.
+//   C c = new Object)();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected ';' after this.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected a class member, but got ')'.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:20: Error: Expected an identifier, but got '('.
+//   C c = new Object)();
+//                    ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
 class C extends core::Object {
-  field invalid-type c;
-  constructor •() → void
+  field self::C c;
+  synthetic constructor •() → self::C
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.strong.expect
new file mode 100644
index 0000000..6e4cf81
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.strong.expect
@@ -0,0 +1,58 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: Expected '(' after this.
+//   C c = new Object)();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected ';' after this.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected a class member, but got ')'.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:20: Error: Expected an identifier, but got '('.
+//   C c = new Object)();
+//                    ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: The constructor returns type 'Object' that isn't of expected type 'C'.
+//  - 'Object' is from 'dart:core'.
+//  - 'C' is from 'pkg/front_end/testcases/rasta/issue_000046.dart'.
+// Change the type of the object being constructed or the context in which it is used.
+//   C c = new Object)();
+//             ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: Expected '(' after this.
+//   C c = new Object)();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected ';' after this.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected a class member, but got ')'.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:20: Error: Expected an identifier, but got '('.
+//   C c = new Object)();
+//                    ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field self::C c = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: The constructor returns type 'Object' that isn't of expected type 'C'.
+ - 'Object' is from 'dart:core'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/issue_000046.dart'.
+Change the type of the object being constructed or the context in which it is used.
+  C c = new Object)();
+            ^" in new core::Object::•();
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.strong.transformed.expect
new file mode 100644
index 0000000..bb3c37b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: Expected '(' after this.
+//   C c = new Object)();
+//             ^^^^^^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected ';' after this.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:19: Error: Expected a class member, but got ')'.
+//   C c = new Object)();
+//                   ^
+//
+// pkg/front_end/testcases/rasta/issue_000046.dart:6:20: Error: Expected an identifier, but got '('.
+//   C c = new Object)();
+//                    ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field self::C c = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/rasta/issue_000046.dart:6:13: Error: The constructor returns type 'Object' that isn't of expected type 'C'.
+ - 'Object' is from 'dart:core'.
+ - 'C' is from 'pkg/front_end/testcases/rasta/issue_000046.dart'.
+Change the type of the object being constructed or the context in which it is used.
+  C c = new Object)();
+            ^" in new core::Object::•();
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000047.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000047.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000047.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000047.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000047.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000047.dart.strong.expect
new file mode 100644
index 0000000..0805396
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000047.dart.strong.expect
@@ -0,0 +1,18 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/issue_000047.dart:5:17: Error: Expected ')' before this.
+// typedef void T(C<C>);
+//                 ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000047.dart:5:17: Error: Expected ')' before this.
+// typedef void T(C<C>);
+//                 ^
+
+library;
+import self as self;
+
+typedef T = (dynamic) → void;
+static method main() → (dynamic) → void
+  return null;
diff --git a/pkg/front_end/testcases/rasta/issue_000047.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000047.dart.strong.transformed.expect
new file mode 100644
index 0000000..1209acc
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000047.dart.strong.transformed.expect
@@ -0,0 +1,12 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/issue_000047.dart:5:17: Error: Expected ')' before this.
+// typedef void T(C<C>);
+//                 ^
+
+library;
+import self as self;
+
+typedef T = (dynamic) → void;
+static method main() → (dynamic) → void
+  return null;
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000048.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000048.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000048.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000048.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000048.dart.direct.expect
copy to pkg/front_end/testcases/rasta/issue_000048.dart.strong.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000048.dart.direct.transformed.expect
copy to pkg/front_end/testcases/rasta/issue_000048.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000052.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000052.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000052.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000052.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
new file mode 100644
index 0000000..8b500e6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function f() → core::Null {
+    core::print("hello");
+  }
+  f.call();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
new file mode 100644
index 0000000..8b500e6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  function f() → core::Null {
+    core::print("hello");
+  }
+  f.call();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000053.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000053.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000053.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000053.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.strong.expect
new file mode 100644
index 0000000..c3a0237
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator ==(dynamic other) → core::bool
+    return throw "x";
+  method test() → dynamic {
+    super.{core::Object::==}(null);
+  }
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.strong.transformed.expect
new file mode 100644
index 0000000..c3a0237
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  operator ==(dynamic other) → core::bool
+    return throw "x";
+  method test() → dynamic {
+    super.{core::Object::==}(null);
+  }
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::test}();
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000067.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000067.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000067.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000067.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.strong.expect
new file mode 100644
index 0000000..b685cab
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.strong.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::foo];
+  constructor •() → self::A
+    : super core::Object::•() {}
+  static factory foo() → self::A
+    let dynamic #redirecting_factory = self::C::bar in invalid-expression;
+  method m() → core::int {}
+}
+class C extends self::A {
+  static field dynamic _redirecting# = <dynamic>[self::C::bar];
+  constructor •() → self::C
+    : super self::A::•() {}
+  static factory bar() → self::C
+    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+  method m() → core::int {
+    return 1;
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method m() → core::int {
+    return 2;
+  }
+}
+static method main() → dynamic {
+  self::A a = new self::D::•();
+  exp::Expect::equals(2, a.{self::A::m}());
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.strong.transformed.expect
new file mode 100644
index 0000000..5d95998
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::foo];
+  constructor •() → self::A
+    : super core::Object::•() {}
+  static factory foo() → self::A
+    let () → self::C #redirecting_factory = self::C::bar in invalid-expression;
+  method m() → core::int {}
+}
+class C extends self::A {
+  static field dynamic _redirecting# = <dynamic>[self::C::bar];
+  constructor •() → self::C
+    : super self::A::•() {}
+  static factory bar() → self::C
+    let<BottomType> #redirecting_factory = self::D::• in invalid-expression;
+  method m() → core::int {
+    return 1;
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method m() → core::int {
+    return 2;
+  }
+}
+static method main() → dynamic {
+  self::A a = new self::D::•();
+  exp::Expect::equals(2, a.{self::A::m}());
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000068.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000068.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000068.dart.direct.expect
copy to pkg/front_end/testcases/rasta/issue_000068.dart.strong.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/rasta/issue_000068.dart.direct.transformed.expect
copy to pkg/front_end/testcases/rasta/issue_000068.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000069.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000069.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000069.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000069.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000069.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000069.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000069.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.strong.expect
new file mode 100644
index 0000000..ec1feb2
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000069.dart.strong.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  dynamic x;
+  core::int i = 0;
+  while ((let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1) in #t1).{core::num::<}(5)) {
+    core::int x = i;
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000069.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.strong.transformed.expect
new file mode 100644
index 0000000..ec1feb2
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000069.dart.strong.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  dynamic x;
+  core::int i = 0;
+  while ((let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1) in #t1).{core::num::<}(5)) {
+    core::int x = i;
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000069.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.type_promotion.expect
new file mode 100644
index 0000000..f2b5d7c
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000069.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/rasta/issue_000069.dart:7:11: Context: Write to i@237
+  while (i++ < 5) var x = i;
+          ^^
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000070.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000070.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000070.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
new file mode 100644
index 0000000..0f3241e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+class A<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
+  final field core::List<self::A::U> field;
+  constructor •(self::A::N n, self::A::S s) → self::A<self::A::N, self::A::S, self::A::U>
+    : self::A::field = core::List::•<self::A::U>(), super core::Object::•() {
+    exp::Expect::isTrue(n is self::A::N);
+    exp::Expect::isTrue(s is self::A::S);
+  }
+  constructor empty() → self::A<self::A::N, self::A::S, self::A::U>
+    : self::A::field = null, super core::Object::•() {}
+  const constructor c(self::A::U u, self::A::S s) → self::A<self::A::N, self::A::S, self::A::U>
+    : self::A::field = const <core::Null>[null], super core::Object::•()
+    ;
+  static factory f<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U> {
+    exp::Expect::isTrue(s is self::A::f::S);
+    return new self::A::empty<self::A::f::N, self::A::f::S, self::A::f::U>();
+  }
+  get getter() → core::List<self::A::U> {
+    return this.{self::A::field};
+  }
+  set setter(generic-covariant-impl self::A::S s) → void {}
+}
+abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::Aa, self::J::B>
+    : super core::Object::•()
+    ;
+}
+abstract class I<H extends core::Object = dynamic, C extends core::Object = dynamic, K extends core::Object = dynamic> extends self::J<self::I::C, self::I::K> {
+  synthetic constructor •() → self::I<self::I::H, self::I::C, self::I::K>
+    : super self::J::•()
+    ;
+}
+static method main() → dynamic {
+  new self::A::•<core::num, core::double, core::List<dynamic>>(1, 2.0);
+  self::A<dynamic, dynamic, dynamic> a = self::A::f<core::int, core::int, core::int>(1);
+  const self::A::c<core::int, core::int, core::List<dynamic>>(const <dynamic>[], 1);
+  core::List<dynamic> z = a.{self::A::getter};
+  a.{self::A::setter} = 1;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
new file mode 100644
index 0000000..1fd973c
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+class A<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
+  final field core::List<self::A::U> field;
+  constructor •(self::A::N n, self::A::S s) → self::A<self::A::N, self::A::S, self::A::U>
+    : self::A::field = core::_GrowableList::•<self::A::U>(0), super core::Object::•() {
+    exp::Expect::isTrue(n is self::A::N);
+    exp::Expect::isTrue(s is self::A::S);
+  }
+  constructor empty() → self::A<self::A::N, self::A::S, self::A::U>
+    : self::A::field = null, super core::Object::•() {}
+  const constructor c(self::A::U u, self::A::S s) → self::A<self::A::N, self::A::S, self::A::U>
+    : self::A::field = const <core::Null>[null], super core::Object::•()
+    ;
+  static factory f<N extends core::Object = dynamic, S extends core::Object = dynamic, U extends core::Object = dynamic>(self::A::f::S s) → self::A<self::A::f::N, self::A::f::S, self::A::f::U> {
+    exp::Expect::isTrue(s is self::A::f::S);
+    return new self::A::empty<self::A::f::N, self::A::f::S, self::A::f::U>();
+  }
+  get getter() → core::List<self::A::U> {
+    return this.{self::A::field};
+  }
+  set setter(generic-covariant-impl self::A::S s) → void {}
+}
+abstract class J<Aa extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::Aa, self::J::B>
+    : super core::Object::•()
+    ;
+}
+abstract class I<H extends core::Object = dynamic, C extends core::Object = dynamic, K extends core::Object = dynamic> extends self::J<self::I::C, self::I::K> {
+  synthetic constructor •() → self::I<self::I::H, self::I::C, self::I::K>
+    : super self::J::•()
+    ;
+}
+static method main() → dynamic {
+  new self::A::•<core::num, core::double, core::List<dynamic>>(1, 2.0);
+  self::A<dynamic, dynamic, dynamic> a = self::A::f<core::int, core::int, core::int>(1);
+  const self::A::c<core::int, core::int, core::List<dynamic>>(const <dynamic>[], 1);
+  core::List<dynamic> z = a.{self::A::getter};
+  a.{self::A::setter} = 1;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.type_promotion.expect
new file mode 100644
index 0000000..27f599e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/rasta/issue_000070.dart:11:21: Context: Possible promotion of n@306
+    Expect.isTrue(n is N);
+                    ^^
+pkg/front_end/testcases/rasta/issue_000070.dart:12:21: Context: Possible promotion of s@311
+    Expect.isTrue(s is S);
+                    ^^
+pkg/front_end/testcases/rasta/issue_000070.dart:18:21: Context: Possible promotion of s@311
+    Expect.isTrue(s is S);
+                    ^^
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.direct.expect
deleted file mode 100644
index 5a311d6..0000000
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.direct.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Mixin extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return 87;
-}
-abstract class _Foo&Object&Mixin = core::Object with self::Mixin {
-  synthetic constructor •() → self::_Foo&Object&Mixin
-    : super core::Object::•()
-    ;
-}
-class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return super.{self::Mixin::foo}();
-  method bar() → dynamic
-    return super.{self::Mixin::field};
-}
-static method main() → dynamic {
-  dynamic f = new self::Foo::•();
-  f.field = 42;
-  core::print(f.bar());
-}
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.direct.transformed.expect
deleted file mode 100644
index 8d9ceb4..0000000
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.direct.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Mixin extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return 87;
-}
-abstract class _Foo&Object&Mixin extends core::Object implements self::Mixin {
-  field dynamic field = null;
-  synthetic constructor •() → self::_Foo&Object&Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return 87;
-}
-class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return super.{self::Mixin::foo}();
-  method bar() → dynamic
-    return super.{self::Mixin::field};
-}
-static method main() → dynamic {
-  dynamic f = new self::Foo::•();
-  f.field = 42;
-  core::print(f.bar());
-}
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.expect
new file mode 100644
index 0000000..3a5b253
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return 87;
+}
+abstract class _Foo&Object&Mixin = core::Object with self::Mixin {
+  synthetic constructor •() → self::_Foo&Object&Mixin
+    : super core::Object::•()
+    ;
+}
+class Foo extends self::_Foo&Object&Mixin {
+  synthetic constructor •() → self::Foo
+    : super self::_Foo&Object&Mixin::•()
+    ;
+  method foo() → dynamic
+    return super.{self::Mixin::foo}();
+  method bar() → dynamic
+    return super.{self::Mixin::field};
+}
+static method main() → dynamic {
+  dynamic f = new self::Foo::•();
+  f.field = 42;
+  core::print(f.bar());
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.transformed.expect
new file mode 100644
index 0000000..290a349
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Mixin extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Mixin
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return 87;
+}
+abstract class _Foo&Object&Mixin extends core::Object implements self::Mixin {
+  field dynamic field = null;
+  synthetic constructor •() → self::_Foo&Object&Mixin
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return 87;
+}
+class Foo extends self::_Foo&Object&Mixin {
+  synthetic constructor •() → self::Foo
+    : super self::_Foo&Object&Mixin::•()
+    ;
+  method foo() → dynamic
+    return super.{self::Mixin::foo}();
+  method bar() → dynamic
+    return super.{self::Mixin::field};
+}
+static method main() → dynamic {
+  dynamic f = new self::Foo::•();
+  f.field = 42;
+  core::print(f.bar());
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect
index f37485f..b027643 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect
@@ -17,7 +17,7 @@
 }
 class Foo extends self::_Foo&Object&Mixin {
   synthetic constructor •() → self::Foo
-    : super core::Object::•()
+    : super self::_Foo&Object&Mixin::•()
     ;
   method foo() → dynamic
     return super.{self::Mixin::foo}();
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.transformed.expect
index b2db962..060831f 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.transformed.expect
@@ -20,7 +20,7 @@
 }
 class Foo extends self::_Foo&Object&Mixin {
   synthetic constructor •() → self::Foo
-    : super core::Object::•()
+    : super self::_Foo&Object&Mixin::•()
     ;
   method foo() → dynamic
     return super.{self::Mixin::foo}();
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.direct.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/issue_000081.dart.direct.expect
rename to pkg/front_end/testcases/rasta/issue_000081.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
new file mode 100644
index 0000000..eb53a96
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  field core::int hashCode = 42;
+  synthetic constructor •() → self::Base
+    : super core::Object::•()
+    ;
+}
+class Sub extends self::Base {
+  field core::int _hashCode = null;
+  synthetic constructor •() → self::Sub
+    : super self::Base::•()
+    ;
+  get hashCode() → core::int
+    return let final core::int #t1 = this.{self::Sub::_hashCode} in #t1.{core::num::==}(null) ?{core::int} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : #t1;
+  method foo() → dynamic {
+    this.{self::Sub::_hashCode}.{core::num::==}(null) ?{core::int} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : null;
+  }
+}
+static method main() → dynamic {
+  core::print(new self::Sub::•().{self::Sub::hashCode});
+  core::List<core::Null> l = <core::Null>[null];
+  let final core::List<core::Null> #t2 = l in let final core::int #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String} let final core::String #t4 = "fisk" as{TypeError} core::Null in let final void #t5 = #t2.{core::List::[]=}(#t3, #t4) in #t4 : null;
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
new file mode 100644
index 0000000..eb53a96
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Base extends core::Object {
+  field core::int hashCode = 42;
+  synthetic constructor •() → self::Base
+    : super core::Object::•()
+    ;
+}
+class Sub extends self::Base {
+  field core::int _hashCode = null;
+  synthetic constructor •() → self::Sub
+    : super self::Base::•()
+    ;
+  get hashCode() → core::int
+    return let final core::int #t1 = this.{self::Sub::_hashCode} in #t1.{core::num::==}(null) ?{core::int} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : #t1;
+  method foo() → dynamic {
+    this.{self::Sub::_hashCode}.{core::num::==}(null) ?{core::int} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : null;
+  }
+}
+static method main() → dynamic {
+  core::print(new self::Sub::•().{self::Sub::hashCode});
+  core::List<core::Null> l = <core::Null>[null];
+  let final core::List<core::Null> #t2 = l in let final core::int #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String} let final core::String #t4 = "fisk" as{TypeError} core::Null in let final void #t5 = #t2.{core::List::[]=}(#t3, #t4) in #t4 : null;
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/malformed_const_constructor.dart.direct.expect
rename to pkg/front_end/testcases/rasta/malformed_const_constructor.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.expect
new file mode 100644
index 0000000..28a0ed7
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.expect
@@ -0,0 +1,61 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected '{' before this.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:6:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const A()
+//   ^^^^^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected a class member, but got ':'.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:7: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//     : x = 'foo'
+//       ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+// Try using a constructor or factory that is 'const'.
+//   const A();
+//         ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected '{' before this.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:6:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const A()
+//   ^^^^^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected a class member, but got ':'.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:7: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//     : x = 'foo'
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::String x = "foo";
+  constructor •() → self::A
+    : self::A::x = "foo", super core::Object::•() {}
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/malformed_const_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const A();
+        ^";
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..58f81f6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected '{' before this.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:6:3: Error: A const constructor can't have a body.
+// Try removing either the 'const' keyword or the body.
+//   const A()
+//   ^^^^^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:5: Error: Expected a class member, but got ':'.
+//     : x = 'foo'
+//     ^
+//
+// pkg/front_end/testcases/rasta/malformed_const_constructor.dart:8:7: Error: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
+// Try adding the name of the type of the variable or the keyword 'var'.
+//     : x = 'foo'
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::String x = "foo";
+  constructor •() → self::A
+    : self::A::x = "foo", super core::Object::•() {}
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/malformed_const_constructor.dart:13:9: Error: Cannot invoke a non-'const' constructor where a const expression is expected.
+Try using a constructor or factory that is 'const'.
+  const A();
+        ^";
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/malformed_function.dart.direct.expect
rename to pkg/front_end/testcases/rasta/malformed_function.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.strong.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.strong.expect
new file mode 100644
index 0000000..f964b8b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_function.dart.strong.expect
@@ -0,0 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/malformed_function.dart:7:8: Error: Can't assign to a parenthesized expression.
+//   (null) = null;
+//        ^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:7:8: Error: Can't assign to a parenthesized expression.
+  (null) = null;
+       ^";
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_function.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function.dart.strong.transformed.expect
new file mode 100644
index 0000000..caf6bf2
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_function.dart.strong.transformed.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/malformed_function.dart:7:8: Error: Can't assign to a parenthesized expression.
+  (null) = null;
+       ^";
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect
deleted file mode 100644
index fe2d820..0000000
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
-// typedef Handle Handle(String command);
-//                ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
-// typedef Handle Handle(String command);
-//                ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Handle = (core::String) → dynamic;
-static method main() → dynamic {
-  (core::String) → dynamic h;
-}
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect
deleted file mode 100644
index 88fea44..0000000
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.direct.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
-// typedef Handle Handle(String command);
-//                ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Handle = (core::String) → dynamic;
-static method main() → dynamic {
-  (core::String) → dynamic h;
-}
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.expect
new file mode 100644
index 0000000..ffb842a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.expect
@@ -0,0 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Handle = (core::String) → invalid-type;
+static method main() → dynamic {
+  (core::String) → invalid-type h;
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a51b1d7
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.transformed.expect
@@ -0,0 +1,14 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Handle = (core::String) → invalid-type;
+static method main() → dynamic {
+  (core::String) → invalid-type h;
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
index 2cff7f8..6591886 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
@@ -8,6 +8,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Handle = (core::String) → dynamic;
+typedef Handle = (core::String) → invalid-type;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect
new file mode 100644
index 0000000..ffb842a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect
@@ -0,0 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Handle = (core::String) → invalid-type;
+static method main() → dynamic {
+  (core::String) → invalid-type h;
+}
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..a51b1d7
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/malformed_function_type.dart:5:16: Error: The typedef 'Handle' has a reference to itself.
+// typedef Handle Handle(String command);
+//                ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Handle = (core::String) → invalid-type;
+static method main() → dynamic {
+  (core::String) → invalid-type h;
+}
diff --git a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.direct.expect b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.direct.expect
rename to pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.expect b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.expect
new file mode 100644
index 0000000..16c7815
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.expect
@@ -0,0 +1,24 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:16: Error: Non-optional parameters can't have a default value.
+// Try removing the default value or making the parameter optional.
+// main(arguments = [x]) {
+//                ^
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:19: Error: Getter not found: 'x'.
+// main(arguments = [x]) {
+//                   ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:16: Error: Non-optional parameters can't have a default value.
+// Try removing the default value or making the parameter optional.
+// main(arguments = [x]) {
+//                ^
+
+library;
+import self as self;
+
+static method main(dynamic arguments = <dynamic>[invalid-expression "pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:19: Error: Getter not found: 'x'.
+main(arguments = [x]) {
+                  ^"]) → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.transformed.expect
new file mode 100644
index 0000000..060ab4d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:16: Error: Non-optional parameters can't have a default value.
+// Try removing the default value or making the parameter optional.
+// main(arguments = [x]) {
+//                ^
+
+library;
+import self as self;
+
+static method main(dynamic arguments = <dynamic>[invalid-expression "pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:19: Error: Getter not found: 'x'.
+main(arguments = [x]) {
+                  ^"]) → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/mixin_library.dart.direct.expect b/pkg/front_end/testcases/rasta/mixin_library.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/mixin_library.dart.direct.expect
rename to pkg/front_end/testcases/rasta/mixin_library.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/native_is_illegal.dart.direct.expect b/pkg/front_end/testcases/rasta/native_is_illegal.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/native_is_illegal.dart.direct.expect
rename to pkg/front_end/testcases/rasta/native_is_illegal.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.expect b/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.expect
new file mode 100644
index 0000000..12904aa
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Bar extends core::Object {
+  @_in::ExternalName::•("Bar_get_x")
+  external get x() → self::Bar;
+  @_in::ExternalName::•("Bar_set_x")
+  external set x(self::Bar value) → void;
+  @_in::ExternalName::•("Bar_f")
+  external method f() → dynamic;
+  @_in::ExternalName::•("Bar_constructor")
+  external static factory •() → self::Bar;
+}
+@_in::ExternalName::•("foo")
+external static method foo() → dynamic;
diff --git a/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.transformed.expect
new file mode 100644
index 0000000..12904aa
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:_internal" as _in;
+
+class Bar extends core::Object {
+  @_in::ExternalName::•("Bar_get_x")
+  external get x() → self::Bar;
+  @_in::ExternalName::•("Bar_set_x")
+  external set x(self::Bar value) → void;
+  @_in::ExternalName::•("Bar_f")
+  external method f() → dynamic;
+  @_in::ExternalName::•("Bar_constructor")
+  external static factory •() → self::Bar;
+}
+@_in::ExternalName::•("foo")
+external static method foo() → dynamic;
diff --git a/pkg/front_end/testcases/rasta/parser_error.dart.direct.expect b/pkg/front_end/testcases/rasta/parser_error.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/parser_error.dart.direct.expect
rename to pkg/front_end/testcases/rasta/parser_error.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/parser_error.dart.strong.expect b/pkg/front_end/testcases/rasta/parser_error.dart.strong.expect
new file mode 100644
index 0000000..9b575d7
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/parser_error.dart.strong.expect
@@ -0,0 +1,45 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:7: Error: Expected an identifier, but got '?'.
+//   if (?b) return b;  /// 01: compile-time error
+//       ^
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: Expected ':' before this.
+//   if (?b) return b;  /// 01: compile-time error
+//         ^
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: Expected an identifier, but got ')'.
+//   if (?b) return b;  /// 01: compile-time error
+//         ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:7: Error: Expected an identifier, but got '?'.
+//   if (?b) return b;  /// 01: compile-time error
+//       ^
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: Expected ':' before this.
+//   if (?b) return b;  /// 01: compile-time error
+//         ^
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: Expected an identifier, but got ')'.
+//   if (?b) return b;  /// 01: compile-time error
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+static method test(dynamic a, {dynamic b = null, dynamic c = null}) → core::int {
+  if((invalid-expression "pkg/front_end/testcases/rasta/parser_error.dart:10:7: Error: This couldn't be parsed.
+  if (?b) return b;  /// 01: compile-time error
+      ^" as{TypeError} core::bool ?{dynamic} b : invalid-expression "pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: This couldn't be parsed.
+  if (?b) return b;  /// 01: compile-time error
+        ^") as{TypeError} core::bool)
+    return b as{TypeError} core::int;
+  return a.+(b).+(c) as{TypeError} core::int;
+}
+static method main() → dynamic {
+  exp::Expect::equals(6, self::test(1, b: 2, c: 3));
+}
diff --git a/pkg/front_end/testcases/rasta/parser_error.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/parser_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..1e72f8b
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/parser_error.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:7: Error: Expected an identifier, but got '?'.
+//   if (?b) return b;  /// 01: compile-time error
+//       ^
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: Expected ':' before this.
+//   if (?b) return b;  /// 01: compile-time error
+//         ^
+//
+// pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: Expected an identifier, but got ')'.
+//   if (?b) return b;  /// 01: compile-time error
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+import "package:expect/expect.dart" as exp;
+
+static method test(dynamic a, {dynamic b = null, dynamic c = null}) → core::int {
+  if((invalid-expression "pkg/front_end/testcases/rasta/parser_error.dart:10:7: Error: This couldn't be parsed.
+  if (?b) return b;  /// 01: compile-time error
+      ^" as{TypeError} core::bool ?{dynamic} b : invalid-expression "pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: This couldn't be parsed.
+  if (?b) return b;  /// 01: compile-time error
+        ^") as{TypeError} core::bool)
+    return b as{TypeError} core::int;
+  return a.+(b).+(c) as{TypeError} core::int;
+}
+static method main() → dynamic {
+  exp::Expect::equals(6, self::test(1, b: 2, c: 3));
+}
diff --git a/pkg/front_end/testcases/rasta/previsit_deferred.dart.direct.expect b/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/previsit_deferred.dart.direct.expect
rename to pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/previsit_deferred.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/previsit_deferred.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/previsit_deferred.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/static.dart.direct.expect b/pkg/front_end/testcases/rasta/static.dart.direct.expect
deleted file mode 100644
index 2640eb8..0000000
--- a/pkg/front_end/testcases/rasta/static.dart.direct.expect
+++ /dev/null
@@ -1,223 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/rasta/static.dart:28:9: Warning: Getter not found: 'staticSetter'.
-//     Foo.staticSetter;
-//         ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:29:13: Warning: Getter not found: 'staticSetter'.
-//     use(Foo.staticSetter);
-//             ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:31:9: Warning: Setter not found: 'staticConstant'.
-//     Foo.staticConstant++;
-//         ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:32:13: Warning: Setter not found: 'staticConstant'.
-//     use(Foo.staticConstant++);
-//             ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:35:9: Warning: Setter not found: 'staticFunction'.
-//     Foo.staticFunction++;
-//         ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:36:13: Warning: Setter not found: 'staticFunction'.
-//     use(Foo.staticFunction++);
-//             ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:37:9: Warning: Setter not found: 'staticGetter'.
-//     Foo.staticGetter++;
-//         ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:38:13: Warning: Setter not found: 'staticGetter'.
-//     use(Foo.staticGetter++);
-//             ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:39:9: Warning: Getter not found: 'staticSetter'.
-//     Foo.staticSetter++;
-//         ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:40:13: Warning: Getter not found: 'staticSetter'.
-//     use(Foo.staticSetter++);
-//             ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:42:11: Warning: Setter not found: 'staticConstant'.
-//     ++Foo.staticConstant;
-//           ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:43:15: Warning: Setter not found: 'staticConstant'.
-//     use(++Foo.staticConstant);
-//               ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:46:11: Warning: Setter not found: 'staticFunction'.
-//     ++Foo.staticFunction;
-//           ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:47:15: Warning: Setter not found: 'staticFunction'.
-//     use(++Foo.staticFunction);
-//               ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:48:11: Warning: Setter not found: 'staticGetter'.
-//     ++Foo.staticGetter;
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:49:15: Warning: Setter not found: 'staticGetter'.
-//     use(++Foo.staticGetter);
-//               ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:50:11: Warning: Getter not found: 'staticSetter'.
-//     ++Foo.staticSetter;
-//           ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:51:15: Warning: Getter not found: 'staticSetter'.
-//     use(++Foo.staticSetter);
-//               ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:61:9: Warning: Getter not found: 'staticSetter'.
-//     Foo.staticSetter();
-//         ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:62:13: Warning: Getter not found: 'staticSetter'.
-//     use(Foo.staticSetter());
-//             ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:64:9: Warning: Setter not found: 'staticConstant'.
-//     Foo.staticConstant = 87;
-//         ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:65:13: Warning: Setter not found: 'staticConstant'.
-//     use(Foo.staticConstant = 87);
-//             ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:68:9: Warning: Setter not found: 'staticFunction'.
-//     Foo.staticFunction = 87;
-//         ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:69:13: Warning: Setter not found: 'staticFunction'.
-//     use(Foo.staticFunction = 87);
-//             ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:70:9: Warning: Setter not found: 'staticGetter'.
-//     Foo.staticGetter = 87;
-//         ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:71:13: Warning: Setter not found: 'staticGetter'.
-//     use(Foo.staticGetter = 87);
-//             ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:75:9: Warning: Setter not found: 'staticConstant'.
-//     Foo.staticConstant ??= 87;
-//         ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:76:13: Warning: Setter not found: 'staticConstant'.
-//     use(Foo.staticConstant ??= 87);
-//             ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:79:9: Warning: Setter not found: 'staticFunction'.
-//     Foo.staticFunction ??= 87;
-//         ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:80:13: Warning: Setter not found: 'staticFunction'.
-//     use(Foo.staticFunction ??= 87);
-//             ^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:81:9: Warning: Setter not found: 'staticGetter'.
-//     Foo.staticGetter ??= 87;
-//         ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:82:13: Warning: Setter not found: 'staticGetter'.
-//     use(Foo.staticGetter ??= 87);
-//             ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:83:9: Warning: Getter not found: 'staticSetter'.
-//     Foo.staticSetter ??= 87;
-//         ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/static.dart:84:13: Warning: Getter not found: 'staticSetter'.
-//     use(Foo.staticSetter ??= 87);
-//             ^^^^^^^^^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  static const field dynamic staticConstant = 42;
-  static field dynamic staticField = 42;
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-  static method staticFunction() → dynamic {}
-  static get staticGetter() → dynamic
-    return null;
-  static set staticSetter(dynamic _) → dynamic {}
-}
-static method use(dynamic x) → dynamic {
-  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
-    throw "Shouldn't happen";
-}
-static method main() → dynamic {
-  try {
-    self::Foo::staticConstant;
-    self::use(self::Foo::staticConstant);
-    self::Foo::staticField;
-    self::use(self::Foo::staticField);
-    self::Foo::staticFunction;
-    self::use(self::Foo::staticFunction);
-    self::Foo::staticGetter;
-    self::use(self::Foo::staticGetter);
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t1 = self::Foo::staticConstant in let final dynamic #t2 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t1);
-    self::Foo::staticField = self::Foo::staticField.+(1);
-    self::use(let final dynamic #t3 = self::Foo::staticField in let final dynamic #t4 = self::Foo::staticField = #t3.+(1) in #t3);
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t5);
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t7);
-    self::Foo::staticSetter = (let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
-    self::use(let final dynamic #t9 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticField = self::Foo::staticField.+(1);
-    self::use(self::Foo::staticField = self::Foo::staticField.+(1));
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticSetter = (let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
-    self::use(self::Foo::staticSetter = (let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1));
-    self::Foo::staticConstant.call();
-    self::use(self::Foo::staticConstant.call());
-    self::Foo::staticField.call();
-    self::use(self::Foo::staticField.call());
-    self::Foo::staticFunction();
-    self::use(self::Foo::staticFunction());
-    self::Foo::staticGetter.call();
-    self::use(self::Foo::staticGetter.call());
-    (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call();
-    self::use((let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call());
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticField = 87;
-    self::use(self::Foo::staticField = 87);
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticSetter = 87;
-    self::use(self::Foo::staticSetter = 87);
-    self::Foo::staticConstant.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t11 = self::Foo::staticConstant in #t11.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t11);
-    self::Foo::staticField.==(null) ? self::Foo::staticField = 87 : null;
-    self::use(let final dynamic #t12 = self::Foo::staticField in #t12.==(null) ? self::Foo::staticField = 87 : #t12);
-    self::Foo::staticFunction.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t13 = self::Foo::staticFunction in #t13.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t13);
-    self::Foo::staticGetter.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t14);
-    (let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).==(null) ? self::Foo::staticSetter = 87 : null;
-    self::use(let final dynamic #t15 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
-  }
-  on core::NoSuchMethodError catch(no-exception-var) {
-  }
-}
diff --git a/pkg/front_end/testcases/rasta/static.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/static.dart.direct.transformed.expect
deleted file mode 100644
index 5db4e42..0000000
--- a/pkg/front_end/testcases/rasta/static.dart.direct.transformed.expect
+++ /dev/null
@@ -1,85 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  static const field dynamic staticConstant = 42;
-  static field dynamic staticField = 42;
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-  static method staticFunction() → dynamic {}
-  static get staticGetter() → dynamic
-    return null;
-  static set staticSetter(dynamic _) → dynamic {}
-}
-static method use(dynamic x) → dynamic {
-  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
-    throw "Shouldn't happen";
-}
-static method main() → dynamic {
-  try {
-    self::Foo::staticConstant;
-    self::use(self::Foo::staticConstant);
-    self::Foo::staticField;
-    self::use(self::Foo::staticField);
-    self::Foo::staticFunction;
-    self::use(self::Foo::staticFunction);
-    self::Foo::staticGetter;
-    self::use(self::Foo::staticGetter);
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t1 = self::Foo::staticConstant in let final dynamic #t2 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t1);
-    self::Foo::staticField = self::Foo::staticField.+(1);
-    self::use(let final dynamic #t3 = self::Foo::staticField in let final dynamic #t4 = self::Foo::staticField = #t3.+(1) in #t3);
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t5);
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t7);
-    self::Foo::staticSetter = (let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
-    self::use(let final dynamic #t9 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticField = self::Foo::staticField.+(1);
-    self::use(self::Foo::staticField = self::Foo::staticField.+(1));
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticSetter = (let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
-    self::use(self::Foo::staticSetter = (let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1));
-    self::Foo::staticConstant.call();
-    self::use(self::Foo::staticConstant.call());
-    self::Foo::staticField.call();
-    self::use(self::Foo::staticField.call());
-    self::Foo::staticFunction();
-    self::use(self::Foo::staticFunction());
-    self::Foo::staticGetter.call();
-    self::use(self::Foo::staticGetter.call());
-    (let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call();
-    self::use((let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call());
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticField = 87;
-    self::use(self::Foo::staticField = 87);
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticSetter = 87;
-    self::use(self::Foo::staticSetter = 87);
-    self::Foo::staticConstant.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t11 = self::Foo::staticConstant in #t11.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t11);
-    self::Foo::staticField.==(null) ? self::Foo::staticField = 87 : null;
-    self::use(let final dynamic #t12 = self::Foo::staticField in #t12.==(null) ? self::Foo::staticField = 87 : #t12);
-    self::Foo::staticFunction.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t13 = self::Foo::staticFunction in #t13.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t13);
-    self::Foo::staticGetter.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t14);
-    (let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).==(null) ? self::Foo::staticSetter = 87 : null;
-    self::use(let final dynamic #t15 = let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
-  }
-  on core::NoSuchMethodError catch(no-exception-var) {
-  }
-}
diff --git a/pkg/front_end/testcases/rasta/static.dart.legacy.expect b/pkg/front_end/testcases/rasta/static.dart.legacy.expect
new file mode 100644
index 0000000..202c04a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/static.dart.legacy.expect
@@ -0,0 +1,223 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/static.dart:28:9: Warning: Getter not found: 'staticSetter'.
+//     Foo.staticSetter;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:29:13: Warning: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:31:9: Warning: Setter not found: 'staticConstant'.
+//     Foo.staticConstant++;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:32:13: Warning: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant++);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:35:9: Warning: Setter not found: 'staticFunction'.
+//     Foo.staticFunction++;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:36:13: Warning: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction++);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:37:9: Warning: Setter not found: 'staticGetter'.
+//     Foo.staticGetter++;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:38:13: Warning: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter++);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:39:9: Warning: Getter not found: 'staticSetter'.
+//     Foo.staticSetter++;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:40:13: Warning: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter++);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:42:11: Warning: Setter not found: 'staticConstant'.
+//     ++Foo.staticConstant;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:43:15: Warning: Setter not found: 'staticConstant'.
+//     use(++Foo.staticConstant);
+//               ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:46:11: Warning: Setter not found: 'staticFunction'.
+//     ++Foo.staticFunction;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:47:15: Warning: Setter not found: 'staticFunction'.
+//     use(++Foo.staticFunction);
+//               ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:48:11: Warning: Setter not found: 'staticGetter'.
+//     ++Foo.staticGetter;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:49:15: Warning: Setter not found: 'staticGetter'.
+//     use(++Foo.staticGetter);
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:50:11: Warning: Getter not found: 'staticSetter'.
+//     ++Foo.staticSetter;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:51:15: Warning: Getter not found: 'staticSetter'.
+//     use(++Foo.staticSetter);
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:61:9: Warning: Getter not found: 'staticSetter'.
+//     Foo.staticSetter();
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:62:13: Warning: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter());
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:64:9: Warning: Setter not found: 'staticConstant'.
+//     Foo.staticConstant = 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:65:13: Warning: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant = 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:68:9: Warning: Setter not found: 'staticFunction'.
+//     Foo.staticFunction = 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:69:13: Warning: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction = 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:70:9: Warning: Setter not found: 'staticGetter'.
+//     Foo.staticGetter = 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:71:13: Warning: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter = 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:75:9: Warning: Setter not found: 'staticConstant'.
+//     Foo.staticConstant ??= 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:76:13: Warning: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant ??= 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:79:9: Warning: Setter not found: 'staticFunction'.
+//     Foo.staticFunction ??= 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:80:13: Warning: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction ??= 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:81:9: Warning: Setter not found: 'staticGetter'.
+//     Foo.staticGetter ??= 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:82:13: Warning: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter ??= 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:83:9: Warning: Getter not found: 'staticSetter'.
+//     Foo.staticSetter ??= 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:84:13: Warning: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter ??= 87);
+//             ^^^^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static const field dynamic staticConstant = 42;
+  static field dynamic staticField = 42;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  static method staticFunction() → dynamic {}
+  static get staticGetter() → dynamic
+    return null;
+  static set staticSetter(dynamic _) → dynamic {}
+}
+static method use(dynamic x) → dynamic {
+  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  try {
+    self::Foo::staticConstant;
+    self::use(self::Foo::staticConstant);
+    self::Foo::staticField;
+    self::use(self::Foo::staticField);
+    self::Foo::staticFunction;
+    self::use(self::Foo::staticFunction);
+    self::Foo::staticGetter;
+    self::use(self::Foo::staticGetter);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t1 = self::Foo::staticConstant in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t1);
+    self::Foo::staticField = self::Foo::staticField.+(1);
+    self::use(let final dynamic #t3 = self::Foo::staticField in let final dynamic #t4 = self::Foo::staticField = #t3.+(1) in #t3);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t5);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t7);
+    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
+    self::use(let final dynamic #t9 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticField = self::Foo::staticField.+(1);
+    self::use(self::Foo::staticField = self::Foo::staticField.+(1));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
+    self::use(self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1));
+    self::Foo::staticConstant.call();
+    self::use(self::Foo::staticConstant.call());
+    self::Foo::staticField.call();
+    self::use(self::Foo::staticField.call());
+    self::Foo::staticFunction();
+    self::use(self::Foo::staticFunction());
+    self::Foo::staticGetter.call();
+    self::use(self::Foo::staticGetter.call());
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call();
+    self::use((throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call());
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticField = 87;
+    self::use(self::Foo::staticField = 87);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticSetter = 87;
+    self::use(self::Foo::staticSetter = 87);
+    self::Foo::staticConstant.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t11 = self::Foo::staticConstant in #t11.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t11);
+    self::Foo::staticField.==(null) ? self::Foo::staticField = 87 : null;
+    self::use(let final dynamic #t12 = self::Foo::staticField in #t12.==(null) ? self::Foo::staticField = 87 : #t12);
+    self::Foo::staticFunction.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t13 = self::Foo::staticFunction in #t13.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t13);
+    self::Foo::staticGetter.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t14);
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).==(null) ? self::Foo::staticSetter = 87 : null;
+    self::use(let final dynamic #t15 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/static.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/static.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1147ce7
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/static.dart.legacy.transformed.expect
@@ -0,0 +1,85 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static const field dynamic staticConstant = 42;
+  static field dynamic staticField = 42;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  static method staticFunction() → dynamic {}
+  static get staticGetter() → dynamic
+    return null;
+  static set staticSetter(dynamic _) → dynamic {}
+}
+static method use(dynamic x) → dynamic {
+  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  try {
+    self::Foo::staticConstant;
+    self::use(self::Foo::staticConstant);
+    self::Foo::staticField;
+    self::use(self::Foo::staticField);
+    self::Foo::staticFunction;
+    self::use(self::Foo::staticFunction);
+    self::Foo::staticGetter;
+    self::use(self::Foo::staticGetter);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t1 = self::Foo::staticConstant in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t1);
+    self::Foo::staticField = self::Foo::staticField.+(1);
+    self::use(let final dynamic #t3 = self::Foo::staticField in let final dynamic #t4 = self::Foo::staticField = #t3.+(1) in #t3);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t5);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t7);
+    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
+    self::use(let final dynamic #t9 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticField = self::Foo::staticField.+(1);
+    self::use(self::Foo::staticField = self::Foo::staticField.+(1));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
+    self::use(self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1));
+    self::Foo::staticConstant.call();
+    self::use(self::Foo::staticConstant.call());
+    self::Foo::staticField.call();
+    self::use(self::Foo::staticField.call());
+    self::Foo::staticFunction();
+    self::use(self::Foo::staticFunction());
+    self::Foo::staticGetter.call();
+    self::use(self::Foo::staticGetter.call());
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call();
+    self::use((throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call());
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticField = 87;
+    self::use(self::Foo::staticField = 87);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    self::Foo::staticSetter = 87;
+    self::use(self::Foo::staticSetter = 87);
+    self::Foo::staticConstant.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t11 = self::Foo::staticConstant in #t11.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t11);
+    self::Foo::staticField.==(null) ? self::Foo::staticField = 87 : null;
+    self::use(let final dynamic #t12 = self::Foo::staticField in #t12.==(null) ? self::Foo::staticField = 87 : #t12);
+    self::Foo::staticFunction.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t13 = self::Foo::staticFunction in #t13.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t13);
+    self::Foo::staticGetter.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
+    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t14);
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).==(null) ? self::Foo::staticSetter = 87 : null;
+    self::use(let final dynamic #t15 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/static.dart.strong.expect b/pkg/front_end/testcases/rasta/static.dart.strong.expect
new file mode 100644
index 0000000..5efd7f0
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/static.dart.strong.expect
@@ -0,0 +1,343 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/static.dart:28:9: Error: Getter not found: 'staticSetter'.
+//     Foo.staticSetter;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:29:13: Error: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:31:9: Error: Setter not found: 'staticConstant'.
+//     Foo.staticConstant++;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:32:13: Error: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant++);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:35:9: Error: Setter not found: 'staticFunction'.
+//     Foo.staticFunction++;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:36:13: Error: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction++);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:37:9: Error: Setter not found: 'staticGetter'.
+//     Foo.staticGetter++;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:38:13: Error: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter++);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:39:9: Error: Getter not found: 'staticSetter'.
+//     Foo.staticSetter++;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:40:13: Error: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter++);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:42:11: Error: Setter not found: 'staticConstant'.
+//     ++Foo.staticConstant;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:43:15: Error: Setter not found: 'staticConstant'.
+//     use(++Foo.staticConstant);
+//               ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:46:11: Error: Setter not found: 'staticFunction'.
+//     ++Foo.staticFunction;
+//           ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:47:15: Error: Setter not found: 'staticFunction'.
+//     use(++Foo.staticFunction);
+//               ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:48:11: Error: Setter not found: 'staticGetter'.
+//     ++Foo.staticGetter;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:49:15: Error: Setter not found: 'staticGetter'.
+//     use(++Foo.staticGetter);
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:50:11: Error: Getter not found: 'staticSetter'.
+//     ++Foo.staticSetter;
+//           ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:51:15: Error: Getter not found: 'staticSetter'.
+//     use(++Foo.staticSetter);
+//               ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:61:9: Error: Getter not found: 'staticSetter'.
+//     Foo.staticSetter();
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:62:13: Error: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter());
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:64:9: Error: Setter not found: 'staticConstant'.
+//     Foo.staticConstant = 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:65:13: Error: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant = 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:68:9: Error: Setter not found: 'staticFunction'.
+//     Foo.staticFunction = 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:69:13: Error: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction = 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:70:9: Error: Setter not found: 'staticGetter'.
+//     Foo.staticGetter = 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:71:13: Error: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter = 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:75:9: Error: Setter not found: 'staticConstant'.
+//     Foo.staticConstant ??= 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
+//     use(Foo.staticConstant ??= 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:79:9: Error: Setter not found: 'staticFunction'.
+//     Foo.staticFunction ??= 87;
+//         ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
+//     use(Foo.staticFunction ??= 87);
+//             ^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:81:9: Error: Setter not found: 'staticGetter'.
+//     Foo.staticGetter ??= 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:82:13: Error: Setter not found: 'staticGetter'.
+//     use(Foo.staticGetter ??= 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:83:9: Error: Getter not found: 'staticSetter'.
+//     Foo.staticSetter ??= 87;
+//         ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:84:13: Error: Getter not found: 'staticSetter'.
+//     use(Foo.staticSetter ??= 87);
+//             ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/static.dart:35:23: Error: The method '+' isn't defined for the class 'dynamic Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     Foo.staticFunction++;
+//                       ^
+//
+// pkg/front_end/testcases/rasta/static.dart:36:27: Error: The method '+' isn't defined for the class 'dynamic Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     use(Foo.staticFunction++);
+//                           ^
+//
+// pkg/front_end/testcases/rasta/static.dart:46:5: Error: The method '+' isn't defined for the class 'dynamic Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     ++Foo.staticFunction;
+//     ^
+//
+// pkg/front_end/testcases/rasta/static.dart:47:9: Error: The method '+' isn't defined for the class 'dynamic Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     use(++Foo.staticFunction);
+//         ^
+//
+// pkg/front_end/testcases/rasta/static.dart:53:23: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     Foo.staticConstant();
+//                       ^
+//
+// pkg/front_end/testcases/rasta/static.dart:54:27: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     use(Foo.staticConstant());
+//                           ^
+//
+// pkg/front_end/testcases/rasta/static.dart:55:20: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     Foo.staticField();
+//                    ^
+//
+// pkg/front_end/testcases/rasta/static.dart:56:24: Error: The method 'call' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named 'call'.
+//     use(Foo.staticField());
+//                        ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static const field core::int staticConstant = 42;
+  static field core::int staticField = 42;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  static method staticFunction() → dynamic {}
+  static get staticGetter() → dynamic
+    return null;
+  static set staticSetter(dynamic _) → void {}
+}
+static method use(dynamic x) → dynamic {
+  if(x.{core::Object::==}(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}))
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  try {
+    self::Foo::staticConstant;
+    self::use(self::Foo::staticConstant);
+    self::Foo::staticField;
+    self::use(self::Foo::staticField);
+    self::Foo::staticFunction;
+    self::use(self::Foo::staticFunction);
+    self::Foo::staticGetter;
+    self::use(self::Foo::staticGetter);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:28:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter;
+        ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:29:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter);
+            ^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:31:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant++;
+        ^^^^^^^^^^^^^^";
+    self::use(let final core::int #t1 = self::Foo::staticConstant in let final core::int #t2 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:32:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant++);
+            ^^^^^^^^^^^^^^" in #t1);
+    self::Foo::staticField = self::Foo::staticField.{core::num::+}(1);
+    self::use(let final core::int #t3 = self::Foo::staticField in let final core::int #t4 = self::Foo::staticField = #t3.{core::num::+}(1) in #t3);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:35:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction++;
+        ^^^^^^^^^^^^^^";
+    self::use(let final () → dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:36:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction++);
+            ^^^^^^^^^^^^^^" in #t5);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:37:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter++;
+        ^^^^^^^^^^^^";
+    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:38:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter++);
+            ^^^^^^^^^^^^" in #t7);
+    self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:39:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter++;
+        ^^^^^^^^^^^^".+(1);
+    self::use(let final dynamic #t9 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:40:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter++);
+            ^^^^^^^^^^^^" in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:42:11: Error: Setter not found: 'staticConstant'.
+    ++Foo.staticConstant;
+          ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:43:15: Error: Setter not found: 'staticConstant'.
+    use(++Foo.staticConstant);
+              ^^^^^^^^^^^^^^");
+    self::Foo::staticField = self::Foo::staticField.{core::num::+}(1);
+    self::use(self::Foo::staticField = self::Foo::staticField.{core::num::+}(1));
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:46:11: Error: Setter not found: 'staticFunction'.
+    ++Foo.staticFunction;
+          ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:47:15: Error: Setter not found: 'staticFunction'.
+    use(++Foo.staticFunction);
+              ^^^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:48:11: Error: Setter not found: 'staticGetter'.
+    ++Foo.staticGetter;
+          ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:49:15: Error: Setter not found: 'staticGetter'.
+    use(++Foo.staticGetter);
+              ^^^^^^^^^^^^");
+    self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:50:11: Error: Getter not found: 'staticSetter'.
+    ++Foo.staticSetter;
+          ^^^^^^^^^^^^".+(1);
+    self::use(self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:51:15: Error: Getter not found: 'staticSetter'.
+    use(++Foo.staticSetter);
+              ^^^^^^^^^^^^".+(1));
+    let final dynamic #t11 = self::Foo::staticConstant in invalid-expression "pkg/front_end/testcases/rasta/static.dart:53:23: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    Foo.staticConstant();
+                      ^";
+    self::use(let final dynamic #t12 = self::Foo::staticConstant in invalid-expression "pkg/front_end/testcases/rasta/static.dart:54:27: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    use(Foo.staticConstant());
+                          ^");
+    let final dynamic #t13 = self::Foo::staticField in invalid-expression "pkg/front_end/testcases/rasta/static.dart:55:20: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    Foo.staticField();
+                   ^";
+    self::use(let final dynamic #t14 = self::Foo::staticField in invalid-expression "pkg/front_end/testcases/rasta/static.dart:56:24: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    use(Foo.staticField());
+                       ^");
+    self::Foo::staticFunction();
+    self::use(self::Foo::staticFunction());
+    self::Foo::staticGetter.call();
+    self::use(self::Foo::staticGetter.call());
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:61:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter();
+        ^^^^^^^^^^^^".call();
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:62:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter());
+            ^^^^^^^^^^^^".call());
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:64:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant = 87;
+        ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:65:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant = 87);
+            ^^^^^^^^^^^^^^");
+    self::Foo::staticField = 87;
+    self::use(self::Foo::staticField = 87);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:68:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction = 87;
+        ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:69:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction = 87);
+            ^^^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:70:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter = 87;
+        ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:71:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter = 87);
+            ^^^^^^^^^^^^");
+    self::Foo::staticSetter = 87;
+    self::use(self::Foo::staticSetter = 87);
+    self::Foo::staticConstant.{core::Object::==}(null) ?{core::int} invalid-expression "pkg/front_end/testcases/rasta/static.dart:75:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant ??= 87;
+        ^^^^^^^^^^^^^^" : null;
+    self::use(let final core::int #t15 = self::Foo::staticConstant in #t15.{core::Object::==}(null) ?{core::int} invalid-expression "pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant ??= 87);
+            ^^^^^^^^^^^^^^" : #t15);
+    self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 87 : null;
+    self::use(let final core::int #t16 = self::Foo::staticField in #t16.{core::num::==}(null) ?{core::int} self::Foo::staticField = 87 : #t16);
+    self::Foo::staticFunction.{core::Object::==}(null) ?{core::Object} invalid-expression "pkg/front_end/testcases/rasta/static.dart:79:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction ??= 87;
+        ^^^^^^^^^^^^^^" : null;
+    self::use(let final () → dynamic #t17 = self::Foo::staticFunction in #t17.{core::Object::==}(null) ?{core::Object} invalid-expression "pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction ??= 87);
+            ^^^^^^^^^^^^^^" : #t17);
+    self::Foo::staticGetter.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/static.dart:81:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter ??= 87;
+        ^^^^^^^^^^^^" : null;
+    self::use(let final dynamic #t18 = self::Foo::staticGetter in #t18.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/static.dart:82:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter ??= 87);
+            ^^^^^^^^^^^^" : #t18);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:83:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter ??= 87;
+        ^^^^^^^^^^^^".{core::Object::==}(null) ?{dynamic} self::Foo::staticSetter = 87 : null;
+    self::use(let final dynamic #t19 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:84:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter ??= 87);
+            ^^^^^^^^^^^^" in #t19.{core::Object::==}(null) ?{dynamic} self::Foo::staticSetter = 87 : #t19);
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
new file mode 100644
index 0000000..4ac004a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
@@ -0,0 +1,165 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static const field core::int staticConstant = 42;
+  static field core::int staticField = 42;
+  synthetic constructor •() → self::Foo
+    : super core::Object::•()
+    ;
+  static method staticFunction() → dynamic {}
+  static get staticGetter() → dynamic
+    return null;
+  static set staticSetter(dynamic _) → void {}
+}
+static method use(dynamic x) → dynamic {
+  if(x.{core::Object::==}(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}))
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  try {
+    self::Foo::staticConstant;
+    self::use(self::Foo::staticConstant);
+    self::Foo::staticField;
+    self::use(self::Foo::staticField);
+    self::Foo::staticFunction;
+    self::use(self::Foo::staticFunction);
+    self::Foo::staticGetter;
+    self::use(self::Foo::staticGetter);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:28:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter;
+        ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:29:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter);
+            ^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:31:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant++;
+        ^^^^^^^^^^^^^^";
+    self::use(let final core::int #t1 = self::Foo::staticConstant in let final core::int #t2 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:32:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant++);
+            ^^^^^^^^^^^^^^" in #t1);
+    self::Foo::staticField = self::Foo::staticField.{core::num::+}(1);
+    self::use(let final core::int #t3 = self::Foo::staticField in let final core::int #t4 = self::Foo::staticField = #t3.{core::num::+}(1) in #t3);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:35:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction++;
+        ^^^^^^^^^^^^^^";
+    self::use(let final () → dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:36:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction++);
+            ^^^^^^^^^^^^^^" in #t5);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:37:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter++;
+        ^^^^^^^^^^^^";
+    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:38:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter++);
+            ^^^^^^^^^^^^" in #t7);
+    self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:39:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter++;
+        ^^^^^^^^^^^^".+(1);
+    self::use(let final dynamic #t9 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:40:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter++);
+            ^^^^^^^^^^^^" in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:42:11: Error: Setter not found: 'staticConstant'.
+    ++Foo.staticConstant;
+          ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:43:15: Error: Setter not found: 'staticConstant'.
+    use(++Foo.staticConstant);
+              ^^^^^^^^^^^^^^");
+    self::Foo::staticField = self::Foo::staticField.{core::num::+}(1);
+    self::use(self::Foo::staticField = self::Foo::staticField.{core::num::+}(1));
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:46:11: Error: Setter not found: 'staticFunction'.
+    ++Foo.staticFunction;
+          ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:47:15: Error: Setter not found: 'staticFunction'.
+    use(++Foo.staticFunction);
+              ^^^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:48:11: Error: Setter not found: 'staticGetter'.
+    ++Foo.staticGetter;
+          ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:49:15: Error: Setter not found: 'staticGetter'.
+    use(++Foo.staticGetter);
+              ^^^^^^^^^^^^");
+    self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:50:11: Error: Getter not found: 'staticSetter'.
+    ++Foo.staticSetter;
+          ^^^^^^^^^^^^".+(1);
+    self::use(self::Foo::staticSetter = invalid-expression "pkg/front_end/testcases/rasta/static.dart:51:15: Error: Getter not found: 'staticSetter'.
+    use(++Foo.staticSetter);
+              ^^^^^^^^^^^^".+(1));
+    let final core::int #t11 = self::Foo::staticConstant in invalid-expression "pkg/front_end/testcases/rasta/static.dart:53:23: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    Foo.staticConstant();
+                      ^";
+    self::use(let final core::int #t12 = self::Foo::staticConstant in invalid-expression "pkg/front_end/testcases/rasta/static.dart:54:27: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    use(Foo.staticConstant());
+                          ^");
+    let final core::int #t13 = self::Foo::staticField in invalid-expression "pkg/front_end/testcases/rasta/static.dart:55:20: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    Foo.staticField();
+                   ^";
+    self::use(let final core::int #t14 = self::Foo::staticField in invalid-expression "pkg/front_end/testcases/rasta/static.dart:56:24: Error: The method 'call' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named 'call'.
+    use(Foo.staticField());
+                       ^");
+    self::Foo::staticFunction();
+    self::use(self::Foo::staticFunction());
+    self::Foo::staticGetter.call();
+    self::use(self::Foo::staticGetter.call());
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:61:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter();
+        ^^^^^^^^^^^^".call();
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:62:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter());
+            ^^^^^^^^^^^^".call());
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:64:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant = 87;
+        ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:65:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant = 87);
+            ^^^^^^^^^^^^^^");
+    self::Foo::staticField = 87;
+    self::use(self::Foo::staticField = 87);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:68:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction = 87;
+        ^^^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:69:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction = 87);
+            ^^^^^^^^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:70:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter = 87;
+        ^^^^^^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/static.dart:71:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter = 87);
+            ^^^^^^^^^^^^");
+    self::Foo::staticSetter = 87;
+    self::use(self::Foo::staticSetter = 87);
+    self::Foo::staticConstant.{core::Object::==}(null) ?{core::int} invalid-expression "pkg/front_end/testcases/rasta/static.dart:75:9: Error: Setter not found: 'staticConstant'.
+    Foo.staticConstant ??= 87;
+        ^^^^^^^^^^^^^^" : null;
+    self::use(let final core::int #t15 = self::Foo::staticConstant in #t15.{core::Object::==}(null) ?{core::int} invalid-expression "pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
+    use(Foo.staticConstant ??= 87);
+            ^^^^^^^^^^^^^^" : #t15);
+    self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 87 : null;
+    self::use(let final core::int #t16 = self::Foo::staticField in #t16.{core::num::==}(null) ?{core::int} self::Foo::staticField = 87 : #t16);
+    self::Foo::staticFunction.{core::Object::==}(null) ?{core::Object} invalid-expression "pkg/front_end/testcases/rasta/static.dart:79:9: Error: Setter not found: 'staticFunction'.
+    Foo.staticFunction ??= 87;
+        ^^^^^^^^^^^^^^" : null;
+    self::use(let final () → dynamic #t17 = self::Foo::staticFunction in #t17.{core::Object::==}(null) ?{core::Object} invalid-expression "pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
+    use(Foo.staticFunction ??= 87);
+            ^^^^^^^^^^^^^^" : #t17);
+    self::Foo::staticGetter.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/static.dart:81:9: Error: Setter not found: 'staticGetter'.
+    Foo.staticGetter ??= 87;
+        ^^^^^^^^^^^^" : null;
+    self::use(let final dynamic #t18 = self::Foo::staticGetter in #t18.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/static.dart:82:13: Error: Setter not found: 'staticGetter'.
+    use(Foo.staticGetter ??= 87);
+            ^^^^^^^^^^^^" : #t18);
+    invalid-expression "pkg/front_end/testcases/rasta/static.dart:83:9: Error: Getter not found: 'staticSetter'.
+    Foo.staticSetter ??= 87;
+        ^^^^^^^^^^^^".{core::Object::==}(null) ?{dynamic} self::Foo::staticSetter = 87 : null;
+    self::use(let final dynamic #t19 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:84:13: Error: Getter not found: 'staticSetter'.
+    use(Foo.staticSetter ??= 87);
+            ^^^^^^^^^^^^" in #t19.{core::Object::==}(null) ?{dynamic} self::Foo::staticSetter = 87 : #t19);
+  }
+  on core::NoSuchMethodError catch(no-exception-var) {
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/super.dart.direct.expect b/pkg/front_end/testcases/rasta/super.dart.direct.expect
deleted file mode 100644
index 05cd9a7..0000000
--- a/pkg/front_end/testcases/rasta/super.dart.direct.expect
+++ /dev/null
@@ -1,557 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
-//   void n() {}
-//        ^
-// pkg/front_end/testcases/rasta/super.dart:27:7: Context: This is the inherited member.
-//   set n(_) {}
-//       ^
-//
-// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//     +super;
-//     ^
-//
-// pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
-// To delegate a constructor to a super constructor, put the super call as an initializer.
-//     +super;
-//      ^^^^^
-//
-// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//     use(+super);
-//         ^
-//
-// pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
-// To delegate a constructor to a super constructor, put the super call as an initializer.
-//     use(+super);
-//          ^^^^^
-//
-// pkg/front_end/testcases/rasta/super.dart:62:11: Warning: Superclass has no getter named 'g'.
-//     super.g;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:63:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:83:11: Warning: Superclass has no setter named 'e'.
-//     super.e++;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:84:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e++);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:85:11: Warning: Superclass has no setter named 'f'.
-//     super.f++;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:86:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f++);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:87:11: Warning: Superclass has no getter named 'g'.
-//     super.g++;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:88:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g++);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:95:11: Warning: Superclass has no setter named 'm'.
-//     super.m++;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:96:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m++);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:108:13: Warning: Superclass has no setter named 'e'.
-//     ++super.e;
-//             ^
-//
-// pkg/front_end/testcases/rasta/super.dart:109:17: Warning: Superclass has no setter named 'e'.
-//     use(++super.e);
-//                 ^
-//
-// pkg/front_end/testcases/rasta/super.dart:110:13: Warning: Superclass has no setter named 'f'.
-//     ++super.f;
-//             ^
-//
-// pkg/front_end/testcases/rasta/super.dart:111:17: Warning: Superclass has no setter named 'f'.
-//     use(++super.f);
-//                 ^
-//
-// pkg/front_end/testcases/rasta/super.dart:112:13: Warning: Superclass has no getter named 'g'.
-//     ++super.g;
-//             ^
-//
-// pkg/front_end/testcases/rasta/super.dart:113:17: Warning: Superclass has no getter named 'g'.
-//     use(++super.g);
-//                 ^
-//
-// pkg/front_end/testcases/rasta/super.dart:120:13: Warning: Superclass has no setter named 'm'.
-//     ++super.m;
-//             ^
-//
-// pkg/front_end/testcases/rasta/super.dart:121:17: Warning: Superclass has no setter named 'm'.
-//     use(++super.m);
-//                 ^
-//
-// pkg/front_end/testcases/rasta/super.dart:137:11: Warning: Superclass has no method named 'g'.
-//     super.g();
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:138:15: Warning: Superclass has no method named 'g'.
-//     use(super.g());
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:160:11: Warning: Superclass has no setter named 'e'.
-//     super.e = 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:161:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e = 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:162:11: Warning: Superclass has no setter named 'f'.
-//     super.f = 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:163:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f = 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:172:11: Warning: Superclass has no setter named 'm'.
-//     super.m = 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:173:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m = 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:185:11: Warning: Superclass has no setter named 'e'.
-//     super.e ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:186:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:187:11: Warning: Superclass has no setter named 'f'.
-//     super.f ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:188:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:189:11: Warning: Superclass has no getter named 'g'.
-//     super.g ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:190:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:197:11: Warning: Superclass has no setter named 'm'.
-//     super.m ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:198:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:210:11: Warning: Superclass has no setter named 'e'.
-//     super.e += 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:211:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e += 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:212:11: Warning: Superclass has no setter named 'f'.
-//     super.f += 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:213:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f += 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:214:11: Warning: Superclass has no getter named 'g'.
-//     super.g += 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:215:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g += 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:222:11: Warning: Superclass has no setter named 'm'.
-//     super.m += 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:223:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m += 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:235:11: Warning: Superclass has no setter named 'e'.
-//     super.e -= 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:236:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e -= 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:237:11: Warning: Superclass has no setter named 'f'.
-//     super.f -= 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:238:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f -= 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:239:11: Warning: Superclass has no getter named 'g'.
-//     super.g -= 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:240:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g -= 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:247:11: Warning: Superclass has no setter named 'm'.
-//     super.m -= 42;
-//           ^
-//
-// pkg/front_end/testcases/rasta/super.dart:248:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m -= 42);
-//               ^
-//
-// pkg/front_end/testcases/rasta/super.dart:147:12: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//     super.m(87);
-//            ^
-//
-// pkg/front_end/testcases/rasta/super.dart:148:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//     use(super.m(87));
-//                ^
-//
-// pkg/front_end/testcases/rasta/super.dart:149:12: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//     super.n(87);
-//            ^
-//
-// pkg/front_end/testcases/rasta/super.dart:150:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//     use(super.n(87));
-//                ^
-//
-// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final f;
-//         ^
-//
-// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final d;
-//         ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
-//   void n() {}
-//        ^
-//
-// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//     +super;
-//     ^
-//
-// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//     use(+super);
-//         ^
-//
-// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final f;
-//         ^
-//
-// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final d;
-//         ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic a = null;
-  field dynamic b = null;
-  field dynamic c = null;
-  field dynamic d = null;
-  final field dynamic f = null;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  get e() → dynamic
-    return null;
-  set g(dynamic _) → dynamic {}
-  get h() → dynamic
-    return null;
-  set h(dynamic _) → dynamic {}
-  get i() → dynamic
-    return null;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic a, dynamic b) → dynamic {}
-  operator ~() → dynamic
-    return 117;
-  operator unary-() → dynamic
-    return 117;
-  operator ==(dynamic other) → dynamic
-    return true;
-  method m() → void {}
-  method n() → void {}
-  set n(dynamic _) → dynamic {}
-}
-class B extends self::A {
-  final field dynamic d = null;
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  get b() → dynamic
-    return null;
-  set c(dynamic x) → dynamic {}
-  set i(dynamic x) → dynamic {}
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  method test() → dynamic {
-    super.{self::A::~}();
-    self::use(super.{self::A::~}());
-    super.{self::A::unary-}();
-    self::use(super.{self::A::unary-}());
-    invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:5: Error: This couldn't be parsed.
-    +super;
-    ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    +super;
-     ^^^^^");
-    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:9: Error: This couldn't be parsed.
-    use(+super);
-        ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    use(+super);
-         ^^^^^"));
-    super.{self::A::==}(87);
-    self::use(super.{self::A::==}(87));
-    !super.{self::A::==}(87);
-    self::use(!super.{self::A::==}(87));
-    super.{self::A::a};
-    self::use(super.{self::A::a});
-    super.{self::B::b};
-    self::use(super.{self::B::b});
-    super.{self::A::c};
-    self::use(super.{self::A::c});
-    super.{self::B::d};
-    self::use(super.{self::B::d});
-    super.{self::A::e};
-    self::use(super.{self::A::e});
-    super.{self::A::f};
-    self::use(super.{self::A::f});
-    super.g;
-    self::use(super.g);
-    super.{self::A::h};
-    self::use(super.{self::A::h});
-    super.{self::A::i};
-    self::use(super.{self::A::i});
-    super.{self::A::[]}(87);
-    self::use(super.{self::A::[]}(87));
-    super.{self::A::m};
-    self::use(super.{self::A::m});
-    super.{self::A::n};
-    self::use(super.{self::A::n});
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
-    super.e = super.{self::A::e}.+(1);
-    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
-    super.f = super.{self::A::f}.+(1);
-    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
-    super.{self::A::g} = super.g.+(1);
-    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
-    let final dynamic #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
-    self::use(let final dynamic #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final dynamic #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
-    super.m = super.{self::A::m}.+(1);
-    self::use(let final dynamic #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = #t23.+(1) in #t23);
-    super.{self::A::n} = super.{self::A::n}.+(1);
-    self::use(let final dynamic #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = #t25.+(1) in #t25);
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
-    super.e = super.{self::A::e}.+(1);
-    self::use(super.e = super.{self::A::e}.+(1));
-    super.f = super.{self::A::f}.+(1);
-    self::use(super.f = super.{self::A::f}.+(1));
-    super.{self::A::g} = super.g.+(1);
-    self::use(super.{self::A::g} = super.g.+(1));
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
-    let final dynamic #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final dynamic #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
-    self::use(let final dynamic #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final dynamic #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
-    super.m = super.{self::A::m}.+(1);
-    self::use(super.m = super.{self::A::m}.+(1));
-    super.{self::A::n} = super.{self::A::n}.+(1);
-    self::use(super.{self::A::n} = super.{self::A::n}.+(1));
-    super.{self::A::a}.call();
-    self::use(super.{self::A::a}.call());
-    super.{self::B::b}.call();
-    self::use(super.{self::B::b}.call());
-    super.{self::A::c}.call();
-    self::use(super.{self::A::c}.call());
-    super.{self::B::d}.call();
-    self::use(super.{self::B::d}.call());
-    super.{self::A::e}.call();
-    self::use(super.{self::A::e}.call());
-    super.{self::A::f}.call();
-    self::use(super.{self::A::f}.call());
-    super.g();
-    self::use(super.g());
-    super.{self::A::h}.call();
-    self::use(super.{self::A::h}.call());
-    super.{self::A::i}.call();
-    self::use(super.{self::A::i}.call());
-    super.{self::A::[]}(87).call();
-    self::use(super.{self::A::[]}(87).call());
-    super.{self::A::m}();
-    self::use(super.{self::A::m}());
-    super.{self::A::m}(87);
-    self::use(super.{self::A::m}(87));
-    super.{self::A::n}(87);
-    self::use(super.{self::A::n}(87));
-    super.{self::A::a} = 42;
-    self::use(super.{self::A::a} = 42);
-    super.{self::A::b} = 42;
-    self::use(super.{self::A::b} = 42);
-    super.{self::B::c} = 42;
-    self::use(super.{self::B::c} = 42);
-    super.{self::A::d} = 42;
-    self::use(super.{self::A::d} = 42);
-    super.e = 42;
-    self::use(super.e = 42);
-    super.f = 42;
-    self::use(super.f = 42);
-    super.{self::A::g} = 42;
-    self::use(super.{self::A::g} = 42);
-    super.{self::A::h} = 42;
-    self::use(super.{self::A::h} = 42);
-    super.{self::B::i} = 42;
-    self::use(super.{self::B::i} = 42);
-    super.{self::A::[]=}(87, 42);
-    self::use(let final dynamic #t33 = 87 in let final dynamic #t34 = 42 in let final dynamic #t35 = super.{self::A::[]=}(#t33, #t34) in #t34);
-    super.m = 42;
-    self::use(super.m = 42);
-    super.{self::A::n} = 42;
-    self::use(super.{self::A::n} = 42);
-    super.{self::A::a}.==(null) ? super.{self::A::a} = 42 : null;
-    self::use(let final dynamic #t36 = super.{self::A::a} in #t36.==(null) ? super.{self::A::a} = 42 : #t36);
-    super.{self::B::b}.==(null) ? super.{self::A::b} = 42 : null;
-    self::use(let final dynamic #t37 = super.{self::B::b} in #t37.==(null) ? super.{self::A::b} = 42 : #t37);
-    super.{self::A::c}.==(null) ? super.{self::B::c} = 42 : null;
-    self::use(let final dynamic #t38 = super.{self::A::c} in #t38.==(null) ? super.{self::B::c} = 42 : #t38);
-    super.{self::B::d}.==(null) ? super.{self::A::d} = 42 : null;
-    self::use(let final dynamic #t39 = super.{self::B::d} in #t39.==(null) ? super.{self::A::d} = 42 : #t39);
-    super.{self::A::e}.==(null) ? super.e = 42 : null;
-    self::use(let final dynamic #t40 = super.{self::A::e} in #t40.==(null) ? super.e = 42 : #t40);
-    super.{self::A::f}.==(null) ? super.f = 42 : null;
-    self::use(let final dynamic #t41 = super.{self::A::f} in #t41.==(null) ? super.f = 42 : #t41);
-    super.g.==(null) ? super.{self::A::g} = 42 : null;
-    self::use(let final dynamic #t42 = super.g in #t42.==(null) ? super.{self::A::g} = 42 : #t42);
-    super.{self::A::h}.==(null) ? super.{self::A::h} = 42 : null;
-    self::use(let final dynamic #t43 = super.{self::A::h} in #t43.==(null) ? super.{self::A::h} = 42 : #t43);
-    super.{self::A::i}.==(null) ? super.{self::B::i} = 42 : null;
-    self::use(let final dynamic #t44 = super.{self::A::i} in #t44.==(null) ? super.{self::B::i} = 42 : #t44);
-    let final dynamic #t45 = 87 in super.{self::A::[]}(#t45).==(null) ? let final dynamic #t46 = 42 in let final dynamic #t47 = super.{self::A::[]=}(#t45, #t46) in #t46 : null;
-    self::use(let final dynamic #t48 = 87 in let final dynamic #t49 = super.{self::A::[]}(#t48) in #t49.==(null) ? let final dynamic #t50 = 42 in let final dynamic #t51 = super.{self::A::[]=}(#t48, #t50) in #t50 : #t49);
-    super.{self::A::m}.==(null) ? super.m = 42 : null;
-    self::use(let final dynamic #t52 = super.{self::A::m} in #t52.==(null) ? super.m = 42 : #t52);
-    super.{self::A::n}.==(null) ? super.{self::A::n} = 42 : null;
-    self::use(let final dynamic #t53 = super.{self::A::n} in #t53.==(null) ? super.{self::A::n} = 42 : #t53);
-    super.{self::A::a} = super.{self::A::a}.+(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
-    super.{self::A::b} = super.{self::B::b}.+(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
-    super.{self::B::c} = super.{self::A::c}.+(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
-    super.{self::A::d} = super.{self::B::d}.+(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
-    super.e = super.{self::A::e}.+(42);
-    self::use(super.e = super.{self::A::e}.+(42));
-    super.f = super.{self::A::f}.+(42);
-    self::use(super.f = super.{self::A::f}.+(42));
-    super.{self::A::g} = super.g.+(42);
-    self::use(super.{self::A::g} = super.g.+(42));
-    super.{self::A::h} = super.{self::A::h}.+(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
-    super.{self::B::i} = super.{self::A::i}.+(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
-    let final dynamic #t54 = 87 in super.{self::A::[]=}(#t54, super.{self::A::[]}(#t54).+(42));
-    self::use(let final dynamic #t55 = 87 in let final dynamic #t56 = super.{self::A::[]}(#t55).+(42) in let final dynamic #t57 = super.{self::A::[]=}(#t55, #t56) in #t56);
-    super.m = super.{self::A::m}.+(42);
-    self::use(super.m = super.{self::A::m}.+(42));
-    super.{self::A::n} = super.{self::A::n}.+(42);
-    self::use(super.{self::A::n} = super.{self::A::n}.+(42));
-    super.{self::A::a} = super.{self::A::a}.-(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
-    super.{self::A::b} = super.{self::B::b}.-(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
-    super.{self::B::c} = super.{self::A::c}.-(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
-    super.{self::A::d} = super.{self::B::d}.-(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
-    super.e = super.{self::A::e}.-(42);
-    self::use(super.e = super.{self::A::e}.-(42));
-    super.f = super.{self::A::f}.-(42);
-    self::use(super.f = super.{self::A::f}.-(42));
-    super.{self::A::g} = super.g.-(42);
-    self::use(super.{self::A::g} = super.g.-(42));
-    super.{self::A::h} = super.{self::A::h}.-(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
-    super.{self::B::i} = super.{self::A::i}.-(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
-    let final dynamic #t58 = 87 in super.{self::A::[]=}(#t58, super.{self::A::[]}(#t58).-(42));
-    self::use(let final dynamic #t59 = 87 in let final dynamic #t60 = super.{self::A::[]}(#t59).-(42) in let final dynamic #t61 = super.{self::A::[]=}(#t59, #t60) in #t60);
-    super.m = super.{self::A::m}.-(42);
-    self::use(super.m = super.{self::A::m}.-(42));
-    super.{self::A::n} = super.{self::A::n}.-(42);
-    self::use(super.{self::A::n} = super.{self::A::n}.-(42));
-  }
-}
-static method use(dynamic x) → dynamic {
-  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
-    throw "Shouldn't happen";
-}
-static method main() → dynamic {
-  new self::C::•().test();
-}
diff --git a/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect
deleted file mode 100644
index 3a83d7b..0000000
--- a/pkg/front_end/testcases/rasta/super.dart.direct.transformed.expect
+++ /dev/null
@@ -1,298 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
-//   void n() {}
-//        ^
-//
-// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//     +super;
-//     ^
-//
-// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//     use(+super);
-//         ^
-//
-// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final f;
-//         ^
-//
-// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final d;
-//         ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic a = null;
-  field dynamic b = null;
-  field dynamic c = null;
-  field dynamic d = null;
-  final field dynamic f = null;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  get e() → dynamic
-    return null;
-  set g(dynamic _) → dynamic {}
-  get h() → dynamic
-    return null;
-  set h(dynamic _) → dynamic {}
-  get i() → dynamic
-    return null;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic a, dynamic b) → dynamic {}
-  operator ~() → dynamic
-    return 117;
-  operator unary-() → dynamic
-    return 117;
-  operator ==(dynamic other) → dynamic
-    return true;
-  method m() → void {}
-  method n() → void {}
-  set n(dynamic _) → dynamic {}
-}
-class B extends self::A {
-  final field dynamic d = null;
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  get b() → dynamic
-    return null;
-  set c(dynamic x) → dynamic {}
-  set i(dynamic x) → dynamic {}
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  method test() → dynamic {
-    super.{self::A::~}();
-    self::use(super.{self::A::~}());
-    super.{self::A::unary-}();
-    self::use(super.{self::A::unary-}());
-    invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:5: Error: This couldn't be parsed.
-    +super;
-    ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    +super;
-     ^^^^^");
-    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:9: Error: This couldn't be parsed.
-    use(+super);
-        ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    use(+super);
-         ^^^^^"));
-    super.{self::A::==}(87);
-    self::use(super.{self::A::==}(87));
-    !super.{self::A::==}(87);
-    self::use(!super.{self::A::==}(87));
-    super.{self::A::a};
-    self::use(super.{self::A::a});
-    super.{self::B::b};
-    self::use(super.{self::B::b});
-    super.{self::A::c};
-    self::use(super.{self::A::c});
-    super.{self::B::d};
-    self::use(super.{self::B::d});
-    super.{self::A::e};
-    self::use(super.{self::A::e});
-    super.{self::A::f};
-    self::use(super.{self::A::f});
-    super.g;
-    self::use(super.g);
-    super.{self::A::h};
-    self::use(super.{self::A::h});
-    super.{self::A::i};
-    self::use(super.{self::A::i});
-    super.{self::A::[]}(87);
-    self::use(super.{self::A::[]}(87));
-    super.{self::A::m};
-    self::use(super.{self::A::m});
-    super.{self::A::n};
-    self::use(super.{self::A::n});
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
-    super.e = super.{self::A::e}.+(1);
-    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
-    super.f = super.{self::A::f}.+(1);
-    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
-    super.{self::A::g} = super.g.+(1);
-    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
-    let final dynamic #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
-    self::use(let final dynamic #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final dynamic #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
-    super.m = super.{self::A::m}.+(1);
-    self::use(let final dynamic #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = #t23.+(1) in #t23);
-    super.{self::A::n} = super.{self::A::n}.+(1);
-    self::use(let final dynamic #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = #t25.+(1) in #t25);
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
-    super.e = super.{self::A::e}.+(1);
-    self::use(super.e = super.{self::A::e}.+(1));
-    super.f = super.{self::A::f}.+(1);
-    self::use(super.f = super.{self::A::f}.+(1));
-    super.{self::A::g} = super.g.+(1);
-    self::use(super.{self::A::g} = super.g.+(1));
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
-    let final dynamic #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final dynamic #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
-    self::use(let final dynamic #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final dynamic #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
-    super.m = super.{self::A::m}.+(1);
-    self::use(super.m = super.{self::A::m}.+(1));
-    super.{self::A::n} = super.{self::A::n}.+(1);
-    self::use(super.{self::A::n} = super.{self::A::n}.+(1));
-    super.{self::A::a}.call();
-    self::use(super.{self::A::a}.call());
-    super.{self::B::b}.call();
-    self::use(super.{self::B::b}.call());
-    super.{self::A::c}.call();
-    self::use(super.{self::A::c}.call());
-    super.{self::B::d}.call();
-    self::use(super.{self::B::d}.call());
-    super.{self::A::e}.call();
-    self::use(super.{self::A::e}.call());
-    super.{self::A::f}.call();
-    self::use(super.{self::A::f}.call());
-    super.g();
-    self::use(super.g());
-    super.{self::A::h}.call();
-    self::use(super.{self::A::h}.call());
-    super.{self::A::i}.call();
-    self::use(super.{self::A::i}.call());
-    super.{self::A::[]}(87).call();
-    self::use(super.{self::A::[]}(87).call());
-    super.{self::A::m}();
-    self::use(super.{self::A::m}());
-    super.{self::A::m}(87);
-    self::use(super.{self::A::m}(87));
-    super.{self::A::n}(87);
-    self::use(super.{self::A::n}(87));
-    super.{self::A::a} = 42;
-    self::use(super.{self::A::a} = 42);
-    super.{self::A::b} = 42;
-    self::use(super.{self::A::b} = 42);
-    super.{self::B::c} = 42;
-    self::use(super.{self::B::c} = 42);
-    super.{self::A::d} = 42;
-    self::use(super.{self::A::d} = 42);
-    super.e = 42;
-    self::use(super.e = 42);
-    super.f = 42;
-    self::use(super.f = 42);
-    super.{self::A::g} = 42;
-    self::use(super.{self::A::g} = 42);
-    super.{self::A::h} = 42;
-    self::use(super.{self::A::h} = 42);
-    super.{self::B::i} = 42;
-    self::use(super.{self::B::i} = 42);
-    super.{self::A::[]=}(87, 42);
-    self::use(let final dynamic #t33 = 87 in let final dynamic #t34 = 42 in let final dynamic #t35 = super.{self::A::[]=}(#t33, #t34) in #t34);
-    super.m = 42;
-    self::use(super.m = 42);
-    super.{self::A::n} = 42;
-    self::use(super.{self::A::n} = 42);
-    super.{self::A::a}.==(null) ? super.{self::A::a} = 42 : null;
-    self::use(let final dynamic #t36 = super.{self::A::a} in #t36.==(null) ? super.{self::A::a} = 42 : #t36);
-    super.{self::B::b}.==(null) ? super.{self::A::b} = 42 : null;
-    self::use(let final dynamic #t37 = super.{self::B::b} in #t37.==(null) ? super.{self::A::b} = 42 : #t37);
-    super.{self::A::c}.==(null) ? super.{self::B::c} = 42 : null;
-    self::use(let final dynamic #t38 = super.{self::A::c} in #t38.==(null) ? super.{self::B::c} = 42 : #t38);
-    super.{self::B::d}.==(null) ? super.{self::A::d} = 42 : null;
-    self::use(let final dynamic #t39 = super.{self::B::d} in #t39.==(null) ? super.{self::A::d} = 42 : #t39);
-    super.{self::A::e}.==(null) ? super.e = 42 : null;
-    self::use(let final dynamic #t40 = super.{self::A::e} in #t40.==(null) ? super.e = 42 : #t40);
-    super.{self::A::f}.==(null) ? super.f = 42 : null;
-    self::use(let final dynamic #t41 = super.{self::A::f} in #t41.==(null) ? super.f = 42 : #t41);
-    super.g.==(null) ? super.{self::A::g} = 42 : null;
-    self::use(let final dynamic #t42 = super.g in #t42.==(null) ? super.{self::A::g} = 42 : #t42);
-    super.{self::A::h}.==(null) ? super.{self::A::h} = 42 : null;
-    self::use(let final dynamic #t43 = super.{self::A::h} in #t43.==(null) ? super.{self::A::h} = 42 : #t43);
-    super.{self::A::i}.==(null) ? super.{self::B::i} = 42 : null;
-    self::use(let final dynamic #t44 = super.{self::A::i} in #t44.==(null) ? super.{self::B::i} = 42 : #t44);
-    let final dynamic #t45 = 87 in super.{self::A::[]}(#t45).==(null) ? let final dynamic #t46 = 42 in let final dynamic #t47 = super.{self::A::[]=}(#t45, #t46) in #t46 : null;
-    self::use(let final dynamic #t48 = 87 in let final dynamic #t49 = super.{self::A::[]}(#t48) in #t49.==(null) ? let final dynamic #t50 = 42 in let final dynamic #t51 = super.{self::A::[]=}(#t48, #t50) in #t50 : #t49);
-    super.{self::A::m}.==(null) ? super.m = 42 : null;
-    self::use(let final dynamic #t52 = super.{self::A::m} in #t52.==(null) ? super.m = 42 : #t52);
-    super.{self::A::n}.==(null) ? super.{self::A::n} = 42 : null;
-    self::use(let final dynamic #t53 = super.{self::A::n} in #t53.==(null) ? super.{self::A::n} = 42 : #t53);
-    super.{self::A::a} = super.{self::A::a}.+(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
-    super.{self::A::b} = super.{self::B::b}.+(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
-    super.{self::B::c} = super.{self::A::c}.+(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
-    super.{self::A::d} = super.{self::B::d}.+(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
-    super.e = super.{self::A::e}.+(42);
-    self::use(super.e = super.{self::A::e}.+(42));
-    super.f = super.{self::A::f}.+(42);
-    self::use(super.f = super.{self::A::f}.+(42));
-    super.{self::A::g} = super.g.+(42);
-    self::use(super.{self::A::g} = super.g.+(42));
-    super.{self::A::h} = super.{self::A::h}.+(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
-    super.{self::B::i} = super.{self::A::i}.+(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
-    let final dynamic #t54 = 87 in super.{self::A::[]=}(#t54, super.{self::A::[]}(#t54).+(42));
-    self::use(let final dynamic #t55 = 87 in let final dynamic #t56 = super.{self::A::[]}(#t55).+(42) in let final dynamic #t57 = super.{self::A::[]=}(#t55, #t56) in #t56);
-    super.m = super.{self::A::m}.+(42);
-    self::use(super.m = super.{self::A::m}.+(42));
-    super.{self::A::n} = super.{self::A::n}.+(42);
-    self::use(super.{self::A::n} = super.{self::A::n}.+(42));
-    super.{self::A::a} = super.{self::A::a}.-(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
-    super.{self::A::b} = super.{self::B::b}.-(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
-    super.{self::B::c} = super.{self::A::c}.-(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
-    super.{self::A::d} = super.{self::B::d}.-(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
-    super.e = super.{self::A::e}.-(42);
-    self::use(super.e = super.{self::A::e}.-(42));
-    super.f = super.{self::A::f}.-(42);
-    self::use(super.f = super.{self::A::f}.-(42));
-    super.{self::A::g} = super.g.-(42);
-    self::use(super.{self::A::g} = super.g.-(42));
-    super.{self::A::h} = super.{self::A::h}.-(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
-    super.{self::B::i} = super.{self::A::i}.-(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
-    let final dynamic #t58 = 87 in super.{self::A::[]=}(#t58, super.{self::A::[]}(#t58).-(42));
-    self::use(let final dynamic #t59 = 87 in let final dynamic #t60 = super.{self::A::[]}(#t59).-(42) in let final dynamic #t61 = super.{self::A::[]=}(#t59, #t60) in #t60);
-    super.m = super.{self::A::m}.-(42);
-    self::use(super.m = super.{self::A::m}.-(42));
-    super.{self::A::n} = super.{self::A::n}.-(42);
-    self::use(super.{self::A::n} = super.{self::A::n}.-(42));
-  }
-}
-static method use(dynamic x) → dynamic {
-  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
-    throw "Shouldn't happen";
-}
-static method main() → dynamic {
-  new self::C::•().test();
-}
diff --git a/pkg/front_end/testcases/rasta/super.dart.legacy.expect b/pkg/front_end/testcases/rasta/super.dart.legacy.expect
new file mode 100644
index 0000000..473cece
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super.dart.legacy.expect
@@ -0,0 +1,537 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/super.dart:27:7: Error: 'n' is already declared in this scope.
+//   set n(_) {}
+//       ^
+// pkg/front_end/testcases/rasta/super.dart:26:8: Context: Previous declaration of 'n'.
+//   void n() {}
+//        ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     +super;
+//      ^^^^^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     use(+super);
+//          ^^^^^
+//
+// pkg/front_end/testcases/rasta/super.dart:62:11: Warning: Superclass has no getter named 'g'.
+//     super.g;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:63:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:83:11: Warning: Superclass has no setter named 'e'.
+//     super.e++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:84:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:85:11: Warning: Superclass has no setter named 'f'.
+//     super.f++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:86:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:87:11: Warning: Superclass has no getter named 'g'.
+//     super.g++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:88:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:95:11: Warning: Superclass has no setter named 'm'.
+//     super.m++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:96:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:108:13: Warning: Superclass has no setter named 'e'.
+//     ++super.e;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:109:17: Warning: Superclass has no setter named 'e'.
+//     use(++super.e);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:110:13: Warning: Superclass has no setter named 'f'.
+//     ++super.f;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:111:17: Warning: Superclass has no setter named 'f'.
+//     use(++super.f);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:112:13: Warning: Superclass has no getter named 'g'.
+//     ++super.g;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:113:17: Warning: Superclass has no getter named 'g'.
+//     use(++super.g);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:120:13: Warning: Superclass has no setter named 'm'.
+//     ++super.m;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:121:17: Warning: Superclass has no setter named 'm'.
+//     use(++super.m);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:137:11: Warning: Superclass has no method named 'g'.
+//     super.g();
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:138:15: Warning: Superclass has no method named 'g'.
+//     use(super.g());
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:160:11: Warning: Superclass has no setter named 'e'.
+//     super.e = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:161:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:162:11: Warning: Superclass has no setter named 'f'.
+//     super.f = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:163:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:172:11: Warning: Superclass has no setter named 'm'.
+//     super.m = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:173:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:185:11: Warning: Superclass has no setter named 'e'.
+//     super.e ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:186:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:187:11: Warning: Superclass has no setter named 'f'.
+//     super.f ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:188:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:189:11: Warning: Superclass has no getter named 'g'.
+//     super.g ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:190:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:197:11: Warning: Superclass has no setter named 'm'.
+//     super.m ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:198:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:210:11: Warning: Superclass has no setter named 'e'.
+//     super.e += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:211:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:212:11: Warning: Superclass has no setter named 'f'.
+//     super.f += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:213:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:214:11: Warning: Superclass has no getter named 'g'.
+//     super.g += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:215:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:222:11: Warning: Superclass has no setter named 'm'.
+//     super.m += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:223:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:235:11: Warning: Superclass has no setter named 'e'.
+//     super.e -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:236:15: Warning: Superclass has no setter named 'e'.
+//     use(super.e -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:237:11: Warning: Superclass has no setter named 'f'.
+//     super.f -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:238:15: Warning: Superclass has no setter named 'f'.
+//     use(super.f -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:239:11: Warning: Superclass has no getter named 'g'.
+//     super.g -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:240:15: Warning: Superclass has no getter named 'g'.
+//     use(super.g -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:247:11: Warning: Superclass has no setter named 'm'.
+//     super.m -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:248:15: Warning: Superclass has no setter named 'm'.
+//     use(super.m -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/super.dart:27:7: Error: 'n' is already declared in this scope.
+//   set n(_) {}
+//       ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic a = null;
+  field dynamic b = null;
+  field dynamic c = null;
+  field dynamic d = null;
+  final field dynamic f = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get e() → dynamic
+    return null;
+  set g(dynamic _) → dynamic {}
+  get h() → dynamic
+    return null;
+  set h(dynamic _) → dynamic {}
+  get i() → dynamic
+    return null;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic a, dynamic b) → dynamic {}
+  operator ~() → dynamic
+    return 117;
+  operator unary-() → dynamic
+    return 117;
+  operator ==(dynamic other) → dynamic
+    return true;
+  method m() → void {}
+  method n() → void {}
+  set n(dynamic _) → dynamic {}
+}
+class B extends self::A {
+  final field dynamic d = null;
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  get b() → dynamic
+    return null;
+  set c(dynamic x) → dynamic {}
+  set i(dynamic x) → dynamic {}
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  method test() → dynamic {
+    super.{self::A::~}();
+    self::use(super.{self::A::~}());
+    super.{self::A::unary-}();
+    self::use(super.{self::A::unary-}());
+    invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:5: Error: This couldn't be parsed.
+    +super;
+    ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    +super;
+     ^^^^^");
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:9: Error: This couldn't be parsed.
+    use(+super);
+        ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^"));
+    super.{self::A::==}(87);
+    self::use(super.{self::A::==}(87));
+    !super.{self::A::==}(87);
+    self::use(!super.{self::A::==}(87));
+    super.{self::A::a};
+    self::use(super.{self::A::a});
+    super.{self::B::b};
+    self::use(super.{self::B::b});
+    super.{self::A::c};
+    self::use(super.{self::A::c});
+    super.{self::B::d};
+    self::use(super.{self::B::d});
+    super.{self::A::e};
+    self::use(super.{self::A::e});
+    super.{self::A::f};
+    self::use(super.{self::A::f});
+    super.g;
+    self::use(super.g);
+    super.{self::A::h};
+    self::use(super.{self::A::h});
+    super.{self::A::i};
+    self::use(super.{self::A::i});
+    super.{self::A::[]}(87);
+    self::use(super.{self::A::[]}(87));
+    super.{self::A::m};
+    self::use(super.{self::A::m});
+    super.{self::A::n};
+    self::use(super.{self::A::n});
+    super.{self::A::a} = super.{self::A::a}.+(1);
+    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
+    super.{self::A::b} = super.{self::B::b}.+(1);
+    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
+    super.{self::B::c} = super.{self::A::c}.+(1);
+    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
+    super.{self::A::d} = super.{self::B::d}.+(1);
+    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
+    super.e = super.{self::A::e}.+(1);
+    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
+    super.f = super.{self::A::f}.+(1);
+    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
+    super.{self::A::g} = super.g.+(1);
+    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
+    super.{self::A::h} = super.{self::A::h}.+(1);
+    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
+    super.{self::B::i} = super.{self::A::i}.+(1);
+    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
+    let final dynamic #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
+    self::use(let final dynamic #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final dynamic #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
+    super.m = super.{self::A::m}.+(1);
+    self::use(let final dynamic #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = #t23.+(1) in #t23);
+    super.{self::A::n} = super.{self::A::n}.+(1);
+    self::use(let final dynamic #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = #t25.+(1) in #t25);
+    super.{self::A::a} = super.{self::A::a}.+(1);
+    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
+    super.{self::A::b} = super.{self::B::b}.+(1);
+    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
+    super.{self::B::c} = super.{self::A::c}.+(1);
+    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
+    super.{self::A::d} = super.{self::B::d}.+(1);
+    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
+    super.e = super.{self::A::e}.+(1);
+    self::use(super.e = super.{self::A::e}.+(1));
+    super.f = super.{self::A::f}.+(1);
+    self::use(super.f = super.{self::A::f}.+(1));
+    super.{self::A::g} = super.g.+(1);
+    self::use(super.{self::A::g} = super.g.+(1));
+    super.{self::A::h} = super.{self::A::h}.+(1);
+    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
+    super.{self::B::i} = super.{self::A::i}.+(1);
+    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
+    let final dynamic #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final dynamic #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
+    self::use(let final dynamic #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final dynamic #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
+    super.m = super.{self::A::m}.+(1);
+    self::use(super.m = super.{self::A::m}.+(1));
+    super.{self::A::n} = super.{self::A::n}.+(1);
+    self::use(super.{self::A::n} = super.{self::A::n}.+(1));
+    super.{self::A::a}.call();
+    self::use(super.{self::A::a}.call());
+    super.{self::B::b}.call();
+    self::use(super.{self::B::b}.call());
+    super.{self::A::c}.call();
+    self::use(super.{self::A::c}.call());
+    super.{self::B::d}.call();
+    self::use(super.{self::B::d}.call());
+    super.{self::A::e}.call();
+    self::use(super.{self::A::e}.call());
+    super.{self::A::f}.call();
+    self::use(super.{self::A::f}.call());
+    super.g();
+    self::use(super.g());
+    super.{self::A::h}.call();
+    self::use(super.{self::A::h}.call());
+    super.{self::A::i}.call();
+    self::use(super.{self::A::i}.call());
+    super.{self::A::[]}(87).call();
+    self::use(super.{self::A::[]}(87).call());
+    super.{self::A::m}();
+    self::use(super.{self::A::m}());
+    super.{self::A::m}(87);
+    self::use(super.{self::A::m}(87));
+    super.{self::A::n}(87);
+    self::use(super.{self::A::n}(87));
+    super.{self::A::a} = 42;
+    self::use(super.{self::A::a} = 42);
+    super.{self::A::b} = 42;
+    self::use(super.{self::A::b} = 42);
+    super.{self::B::c} = 42;
+    self::use(super.{self::B::c} = 42);
+    super.{self::A::d} = 42;
+    self::use(super.{self::A::d} = 42);
+    super.e = 42;
+    self::use(super.e = 42);
+    super.f = 42;
+    self::use(super.f = 42);
+    super.{self::A::g} = 42;
+    self::use(super.{self::A::g} = 42);
+    super.{self::A::h} = 42;
+    self::use(super.{self::A::h} = 42);
+    super.{self::B::i} = 42;
+    self::use(super.{self::B::i} = 42);
+    super.{self::A::[]=}(87, 42);
+    self::use(let final dynamic #t33 = 87 in let final dynamic #t34 = 42 in let final dynamic #t35 = super.{self::A::[]=}(#t33, #t34) in #t34);
+    super.m = 42;
+    self::use(super.m = 42);
+    super.{self::A::n} = 42;
+    self::use(super.{self::A::n} = 42);
+    super.{self::A::a}.==(null) ? super.{self::A::a} = 42 : null;
+    self::use(let final dynamic #t36 = super.{self::A::a} in #t36.==(null) ? super.{self::A::a} = 42 : #t36);
+    super.{self::B::b}.==(null) ? super.{self::A::b} = 42 : null;
+    self::use(let final dynamic #t37 = super.{self::B::b} in #t37.==(null) ? super.{self::A::b} = 42 : #t37);
+    super.{self::A::c}.==(null) ? super.{self::B::c} = 42 : null;
+    self::use(let final dynamic #t38 = super.{self::A::c} in #t38.==(null) ? super.{self::B::c} = 42 : #t38);
+    super.{self::B::d}.==(null) ? super.{self::A::d} = 42 : null;
+    self::use(let final dynamic #t39 = super.{self::B::d} in #t39.==(null) ? super.{self::A::d} = 42 : #t39);
+    super.{self::A::e}.==(null) ? super.e = 42 : null;
+    self::use(let final dynamic #t40 = super.{self::A::e} in #t40.==(null) ? super.e = 42 : #t40);
+    super.{self::A::f}.==(null) ? super.f = 42 : null;
+    self::use(let final dynamic #t41 = super.{self::A::f} in #t41.==(null) ? super.f = 42 : #t41);
+    super.g.==(null) ? super.{self::A::g} = 42 : null;
+    self::use(let final dynamic #t42 = super.g in #t42.==(null) ? super.{self::A::g} = 42 : #t42);
+    super.{self::A::h}.==(null) ? super.{self::A::h} = 42 : null;
+    self::use(let final dynamic #t43 = super.{self::A::h} in #t43.==(null) ? super.{self::A::h} = 42 : #t43);
+    super.{self::A::i}.==(null) ? super.{self::B::i} = 42 : null;
+    self::use(let final dynamic #t44 = super.{self::A::i} in #t44.==(null) ? super.{self::B::i} = 42 : #t44);
+    let final dynamic #t45 = 87 in super.{self::A::[]}(#t45).==(null) ? let final dynamic #t46 = 42 in let final dynamic #t47 = super.{self::A::[]=}(#t45, #t46) in #t46 : null;
+    self::use(let final dynamic #t48 = 87 in let final dynamic #t49 = super.{self::A::[]}(#t48) in #t49.==(null) ? let final dynamic #t50 = 42 in let final dynamic #t51 = super.{self::A::[]=}(#t48, #t50) in #t50 : #t49);
+    super.{self::A::m}.==(null) ? super.m = 42 : null;
+    self::use(let final dynamic #t52 = super.{self::A::m} in #t52.==(null) ? super.m = 42 : #t52);
+    super.{self::A::n}.==(null) ? super.{self::A::n} = 42 : null;
+    self::use(let final dynamic #t53 = super.{self::A::n} in #t53.==(null) ? super.{self::A::n} = 42 : #t53);
+    super.{self::A::a} = super.{self::A::a}.+(42);
+    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
+    super.{self::A::b} = super.{self::B::b}.+(42);
+    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
+    super.{self::B::c} = super.{self::A::c}.+(42);
+    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
+    super.{self::A::d} = super.{self::B::d}.+(42);
+    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
+    super.e = super.{self::A::e}.+(42);
+    self::use(super.e = super.{self::A::e}.+(42));
+    super.f = super.{self::A::f}.+(42);
+    self::use(super.f = super.{self::A::f}.+(42));
+    super.{self::A::g} = super.g.+(42);
+    self::use(super.{self::A::g} = super.g.+(42));
+    super.{self::A::h} = super.{self::A::h}.+(42);
+    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
+    super.{self::B::i} = super.{self::A::i}.+(42);
+    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
+    let final dynamic #t54 = 87 in super.{self::A::[]=}(#t54, super.{self::A::[]}(#t54).+(42));
+    self::use(let final dynamic #t55 = 87 in let final dynamic #t56 = super.{self::A::[]}(#t55).+(42) in let final dynamic #t57 = super.{self::A::[]=}(#t55, #t56) in #t56);
+    super.m = super.{self::A::m}.+(42);
+    self::use(super.m = super.{self::A::m}.+(42));
+    super.{self::A::n} = super.{self::A::n}.+(42);
+    self::use(super.{self::A::n} = super.{self::A::n}.+(42));
+    super.{self::A::a} = super.{self::A::a}.-(42);
+    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
+    super.{self::A::b} = super.{self::B::b}.-(42);
+    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
+    super.{self::B::c} = super.{self::A::c}.-(42);
+    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
+    super.{self::A::d} = super.{self::B::d}.-(42);
+    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
+    super.e = super.{self::A::e}.-(42);
+    self::use(super.e = super.{self::A::e}.-(42));
+    super.f = super.{self::A::f}.-(42);
+    self::use(super.f = super.{self::A::f}.-(42));
+    super.{self::A::g} = super.g.-(42);
+    self::use(super.{self::A::g} = super.g.-(42));
+    super.{self::A::h} = super.{self::A::h}.-(42);
+    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
+    super.{self::B::i} = super.{self::A::i}.-(42);
+    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
+    let final dynamic #t58 = 87 in super.{self::A::[]=}(#t58, super.{self::A::[]}(#t58).-(42));
+    self::use(let final dynamic #t59 = 87 in let final dynamic #t60 = super.{self::A::[]}(#t59).-(42) in let final dynamic #t61 = super.{self::A::[]=}(#t59, #t60) in #t60);
+    super.m = super.{self::A::m}.-(42);
+    self::use(super.m = super.{self::A::m}.-(42));
+    super.{self::A::n} = super.{self::A::n}.-(42);
+    self::use(super.{self::A::n} = super.{self::A::n}.-(42));
+  }
+}
+static method use(dynamic x) → dynamic {
+  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  new self::C::•().test();
+}
diff --git a/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f92047d
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect
@@ -0,0 +1,298 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/super.dart:27:7: Error: 'n' is already declared in this scope.
+//   set n(_) {}
+//       ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic a = null;
+  field dynamic b = null;
+  field dynamic c = null;
+  field dynamic d = null;
+  final field dynamic f = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get e() → dynamic
+    return null;
+  set g(dynamic _) → dynamic {}
+  get h() → dynamic
+    return null;
+  set h(dynamic _) → dynamic {}
+  get i() → dynamic
+    return null;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic a, dynamic b) → dynamic {}
+  operator ~() → dynamic
+    return 117;
+  operator unary-() → dynamic
+    return 117;
+  operator ==(dynamic other) → dynamic
+    return true;
+  method m() → void {}
+  method n() → void {}
+  set n(dynamic _) → dynamic {}
+}
+class B extends self::A {
+  final field dynamic d = null;
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  get b() → dynamic
+    return null;
+  set c(dynamic x) → dynamic {}
+  set i(dynamic x) → dynamic {}
+}
+class C extends self::B {
+  synthetic constructor •() → self::C
+    : super self::B::•()
+    ;
+  method test() → dynamic {
+    super.{self::A::~}();
+    self::use(super.{self::A::~}());
+    super.{self::A::unary-}();
+    self::use(super.{self::A::unary-}());
+    invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:5: Error: This couldn't be parsed.
+    +super;
+    ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    +super;
+     ^^^^^");
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:9: Error: This couldn't be parsed.
+    use(+super);
+        ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    use(+super);
+         ^^^^^"));
+    super.{self::A::==}(87);
+    self::use(super.{self::A::==}(87));
+    !super.{self::A::==}(87);
+    self::use(!super.{self::A::==}(87));
+    super.{self::A::a};
+    self::use(super.{self::A::a});
+    super.{self::B::b};
+    self::use(super.{self::B::b});
+    super.{self::A::c};
+    self::use(super.{self::A::c});
+    super.{self::B::d};
+    self::use(super.{self::B::d});
+    super.{self::A::e};
+    self::use(super.{self::A::e});
+    super.{self::A::f};
+    self::use(super.{self::A::f});
+    super.g;
+    self::use(super.g);
+    super.{self::A::h};
+    self::use(super.{self::A::h});
+    super.{self::A::i};
+    self::use(super.{self::A::i});
+    super.{self::A::[]}(87);
+    self::use(super.{self::A::[]}(87));
+    super.{self::A::m};
+    self::use(super.{self::A::m});
+    super.{self::A::n};
+    self::use(super.{self::A::n});
+    super.{self::A::a} = super.{self::A::a}.+(1);
+    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
+    super.{self::A::b} = super.{self::B::b}.+(1);
+    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
+    super.{self::B::c} = super.{self::A::c}.+(1);
+    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
+    super.{self::A::d} = super.{self::B::d}.+(1);
+    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
+    super.e = super.{self::A::e}.+(1);
+    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
+    super.f = super.{self::A::f}.+(1);
+    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
+    super.{self::A::g} = super.g.+(1);
+    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
+    super.{self::A::h} = super.{self::A::h}.+(1);
+    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
+    super.{self::B::i} = super.{self::A::i}.+(1);
+    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
+    let final dynamic #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
+    self::use(let final dynamic #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final dynamic #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
+    super.m = super.{self::A::m}.+(1);
+    self::use(let final dynamic #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = #t23.+(1) in #t23);
+    super.{self::A::n} = super.{self::A::n}.+(1);
+    self::use(let final dynamic #t25 = super.{self::A::n} in let final dynamic #t26 = super.{self::A::n} = #t25.+(1) in #t25);
+    super.{self::A::a} = super.{self::A::a}.+(1);
+    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
+    super.{self::A::b} = super.{self::B::b}.+(1);
+    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
+    super.{self::B::c} = super.{self::A::c}.+(1);
+    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
+    super.{self::A::d} = super.{self::B::d}.+(1);
+    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
+    super.e = super.{self::A::e}.+(1);
+    self::use(super.e = super.{self::A::e}.+(1));
+    super.f = super.{self::A::f}.+(1);
+    self::use(super.f = super.{self::A::f}.+(1));
+    super.{self::A::g} = super.g.+(1);
+    self::use(super.{self::A::g} = super.g.+(1));
+    super.{self::A::h} = super.{self::A::h}.+(1);
+    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
+    super.{self::B::i} = super.{self::A::i}.+(1);
+    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
+    let final dynamic #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final dynamic #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
+    self::use(let final dynamic #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final dynamic #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
+    super.m = super.{self::A::m}.+(1);
+    self::use(super.m = super.{self::A::m}.+(1));
+    super.{self::A::n} = super.{self::A::n}.+(1);
+    self::use(super.{self::A::n} = super.{self::A::n}.+(1));
+    super.{self::A::a}.call();
+    self::use(super.{self::A::a}.call());
+    super.{self::B::b}.call();
+    self::use(super.{self::B::b}.call());
+    super.{self::A::c}.call();
+    self::use(super.{self::A::c}.call());
+    super.{self::B::d}.call();
+    self::use(super.{self::B::d}.call());
+    super.{self::A::e}.call();
+    self::use(super.{self::A::e}.call());
+    super.{self::A::f}.call();
+    self::use(super.{self::A::f}.call());
+    super.g();
+    self::use(super.g());
+    super.{self::A::h}.call();
+    self::use(super.{self::A::h}.call());
+    super.{self::A::i}.call();
+    self::use(super.{self::A::i}.call());
+    super.{self::A::[]}(87).call();
+    self::use(super.{self::A::[]}(87).call());
+    super.{self::A::m}();
+    self::use(super.{self::A::m}());
+    super.{self::A::m}(87);
+    self::use(super.{self::A::m}(87));
+    super.{self::A::n}(87);
+    self::use(super.{self::A::n}(87));
+    super.{self::A::a} = 42;
+    self::use(super.{self::A::a} = 42);
+    super.{self::A::b} = 42;
+    self::use(super.{self::A::b} = 42);
+    super.{self::B::c} = 42;
+    self::use(super.{self::B::c} = 42);
+    super.{self::A::d} = 42;
+    self::use(super.{self::A::d} = 42);
+    super.e = 42;
+    self::use(super.e = 42);
+    super.f = 42;
+    self::use(super.f = 42);
+    super.{self::A::g} = 42;
+    self::use(super.{self::A::g} = 42);
+    super.{self::A::h} = 42;
+    self::use(super.{self::A::h} = 42);
+    super.{self::B::i} = 42;
+    self::use(super.{self::B::i} = 42);
+    super.{self::A::[]=}(87, 42);
+    self::use(let final dynamic #t33 = 87 in let final dynamic #t34 = 42 in let final dynamic #t35 = super.{self::A::[]=}(#t33, #t34) in #t34);
+    super.m = 42;
+    self::use(super.m = 42);
+    super.{self::A::n} = 42;
+    self::use(super.{self::A::n} = 42);
+    super.{self::A::a}.==(null) ? super.{self::A::a} = 42 : null;
+    self::use(let final dynamic #t36 = super.{self::A::a} in #t36.==(null) ? super.{self::A::a} = 42 : #t36);
+    super.{self::B::b}.==(null) ? super.{self::A::b} = 42 : null;
+    self::use(let final dynamic #t37 = super.{self::B::b} in #t37.==(null) ? super.{self::A::b} = 42 : #t37);
+    super.{self::A::c}.==(null) ? super.{self::B::c} = 42 : null;
+    self::use(let final dynamic #t38 = super.{self::A::c} in #t38.==(null) ? super.{self::B::c} = 42 : #t38);
+    super.{self::B::d}.==(null) ? super.{self::A::d} = 42 : null;
+    self::use(let final dynamic #t39 = super.{self::B::d} in #t39.==(null) ? super.{self::A::d} = 42 : #t39);
+    super.{self::A::e}.==(null) ? super.e = 42 : null;
+    self::use(let final dynamic #t40 = super.{self::A::e} in #t40.==(null) ? super.e = 42 : #t40);
+    super.{self::A::f}.==(null) ? super.f = 42 : null;
+    self::use(let final dynamic #t41 = super.{self::A::f} in #t41.==(null) ? super.f = 42 : #t41);
+    super.g.==(null) ? super.{self::A::g} = 42 : null;
+    self::use(let final dynamic #t42 = super.g in #t42.==(null) ? super.{self::A::g} = 42 : #t42);
+    super.{self::A::h}.==(null) ? super.{self::A::h} = 42 : null;
+    self::use(let final dynamic #t43 = super.{self::A::h} in #t43.==(null) ? super.{self::A::h} = 42 : #t43);
+    super.{self::A::i}.==(null) ? super.{self::B::i} = 42 : null;
+    self::use(let final dynamic #t44 = super.{self::A::i} in #t44.==(null) ? super.{self::B::i} = 42 : #t44);
+    let final dynamic #t45 = 87 in super.{self::A::[]}(#t45).==(null) ? let final dynamic #t46 = 42 in let final dynamic #t47 = super.{self::A::[]=}(#t45, #t46) in #t46 : null;
+    self::use(let final dynamic #t48 = 87 in let final dynamic #t49 = super.{self::A::[]}(#t48) in #t49.==(null) ? let final dynamic #t50 = 42 in let final dynamic #t51 = super.{self::A::[]=}(#t48, #t50) in #t50 : #t49);
+    super.{self::A::m}.==(null) ? super.m = 42 : null;
+    self::use(let final dynamic #t52 = super.{self::A::m} in #t52.==(null) ? super.m = 42 : #t52);
+    super.{self::A::n}.==(null) ? super.{self::A::n} = 42 : null;
+    self::use(let final dynamic #t53 = super.{self::A::n} in #t53.==(null) ? super.{self::A::n} = 42 : #t53);
+    super.{self::A::a} = super.{self::A::a}.+(42);
+    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
+    super.{self::A::b} = super.{self::B::b}.+(42);
+    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
+    super.{self::B::c} = super.{self::A::c}.+(42);
+    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
+    super.{self::A::d} = super.{self::B::d}.+(42);
+    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
+    super.e = super.{self::A::e}.+(42);
+    self::use(super.e = super.{self::A::e}.+(42));
+    super.f = super.{self::A::f}.+(42);
+    self::use(super.f = super.{self::A::f}.+(42));
+    super.{self::A::g} = super.g.+(42);
+    self::use(super.{self::A::g} = super.g.+(42));
+    super.{self::A::h} = super.{self::A::h}.+(42);
+    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
+    super.{self::B::i} = super.{self::A::i}.+(42);
+    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
+    let final dynamic #t54 = 87 in super.{self::A::[]=}(#t54, super.{self::A::[]}(#t54).+(42));
+    self::use(let final dynamic #t55 = 87 in let final dynamic #t56 = super.{self::A::[]}(#t55).+(42) in let final dynamic #t57 = super.{self::A::[]=}(#t55, #t56) in #t56);
+    super.m = super.{self::A::m}.+(42);
+    self::use(super.m = super.{self::A::m}.+(42));
+    super.{self::A::n} = super.{self::A::n}.+(42);
+    self::use(super.{self::A::n} = super.{self::A::n}.+(42));
+    super.{self::A::a} = super.{self::A::a}.-(42);
+    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
+    super.{self::A::b} = super.{self::B::b}.-(42);
+    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
+    super.{self::B::c} = super.{self::A::c}.-(42);
+    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
+    super.{self::A::d} = super.{self::B::d}.-(42);
+    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
+    super.e = super.{self::A::e}.-(42);
+    self::use(super.e = super.{self::A::e}.-(42));
+    super.f = super.{self::A::f}.-(42);
+    self::use(super.f = super.{self::A::f}.-(42));
+    super.{self::A::g} = super.g.-(42);
+    self::use(super.{self::A::g} = super.g.-(42));
+    super.{self::A::h} = super.{self::A::h}.-(42);
+    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
+    super.{self::B::i} = super.{self::A::i}.-(42);
+    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
+    let final dynamic #t58 = 87 in super.{self::A::[]=}(#t58, super.{self::A::[]}(#t58).-(42));
+    self::use(let final dynamic #t59 = 87 in let final dynamic #t60 = super.{self::A::[]}(#t59).-(42) in let final dynamic #t61 = super.{self::A::[]=}(#t59, #t60) in #t60);
+    super.m = super.{self::A::m}.-(42);
+    self::use(super.m = super.{self::A::m}.-(42));
+    super.{self::A::n} = super.{self::A::n}.-(42);
+    self::use(super.{self::A::n} = super.{self::A::n}.-(42));
+  }
+}
+static method use(dynamic x) → dynamic {
+  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  new self::C::•().test();
+}
diff --git a/pkg/front_end/testcases/rasta/super.dart.outline.expect b/pkg/front_end/testcases/rasta/super.dart.outline.expect
index 8798c49..c3496aa 100644
--- a/pkg/front_end/testcases/rasta/super.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.outline.expect
@@ -1,11 +1,11 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
-//   void n() {}
-//        ^
-// pkg/front_end/testcases/rasta/super.dart:27:7: Context: This is the inherited member.
+// pkg/front_end/testcases/rasta/super.dart:27:7: Error: 'n' is already declared in this scope.
 //   set n(_) {}
 //       ^
+// pkg/front_end/testcases/rasta/super.dart:26:8: Context: Previous declaration of 'n'.
+//   void n() {}
+//        ^
 
 library;
 import self as self;
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index db43639..ade1e132 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -1,3 +1,354 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
+//   void n() {}
+//        ^
+// pkg/front_end/testcases/rasta/super.dart:27:7: Context: This is the inherited member.
+//   set n(_) {}
+//       ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:5: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     +super;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     +super;
+//      ^^^^^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
+// Try removing '+'.
+//     use(+super);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     use(+super);
+//          ^^^^^
+//
+// pkg/front_end/testcases/rasta/super.dart:62:11: Error: Superclass has no getter named 'g'.
+//     super.g;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:63:15: Error: Superclass has no getter named 'g'.
+//     use(super.g);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:83:11: Error: Superclass has no setter named 'e'.
+//     super.e++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:84:15: Error: Superclass has no setter named 'e'.
+//     use(super.e++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:85:11: Error: Superclass has no setter named 'f'.
+//     super.f++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:86:15: Error: Superclass has no setter named 'f'.
+//     use(super.f++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:87:11: Error: Superclass has no getter named 'g'.
+//     super.g++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:88:15: Error: Superclass has no getter named 'g'.
+//     use(super.g++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:95:11: Error: Superclass has no setter named 'm'.
+//     super.m++;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:96:15: Error: Superclass has no setter named 'm'.
+//     use(super.m++);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:108:13: Error: Superclass has no setter named 'e'.
+//     ++super.e;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:109:17: Error: Superclass has no setter named 'e'.
+//     use(++super.e);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:110:13: Error: Superclass has no setter named 'f'.
+//     ++super.f;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:111:17: Error: Superclass has no setter named 'f'.
+//     use(++super.f);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:112:13: Error: Superclass has no getter named 'g'.
+//     ++super.g;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:113:17: Error: Superclass has no getter named 'g'.
+//     use(++super.g);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:120:13: Error: Superclass has no setter named 'm'.
+//     ++super.m;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:121:17: Error: Superclass has no setter named 'm'.
+//     use(++super.m);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:137:11: Error: Superclass has no method named 'g'.
+//     super.g();
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:138:15: Error: Superclass has no method named 'g'.
+//     use(super.g());
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:160:11: Error: Superclass has no setter named 'e'.
+//     super.e = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:161:15: Error: Superclass has no setter named 'e'.
+//     use(super.e = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:162:11: Error: Superclass has no setter named 'f'.
+//     super.f = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:163:15: Error: Superclass has no setter named 'f'.
+//     use(super.f = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:172:11: Error: Superclass has no setter named 'm'.
+//     super.m = 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:173:15: Error: Superclass has no setter named 'm'.
+//     use(super.m = 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:185:11: Error: Superclass has no setter named 'e'.
+//     super.e ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:186:15: Error: Superclass has no setter named 'e'.
+//     use(super.e ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:187:11: Error: Superclass has no setter named 'f'.
+//     super.f ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:188:15: Error: Superclass has no setter named 'f'.
+//     use(super.f ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:189:11: Error: Superclass has no getter named 'g'.
+//     super.g ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:190:15: Error: Superclass has no getter named 'g'.
+//     use(super.g ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:197:11: Error: Superclass has no setter named 'm'.
+//     super.m ??= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:198:15: Error: Superclass has no setter named 'm'.
+//     use(super.m ??= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:210:11: Error: Superclass has no setter named 'e'.
+//     super.e += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:211:15: Error: Superclass has no setter named 'e'.
+//     use(super.e += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:212:11: Error: Superclass has no setter named 'f'.
+//     super.f += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:213:15: Error: Superclass has no setter named 'f'.
+//     use(super.f += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:214:11: Error: Superclass has no getter named 'g'.
+//     super.g += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:215:15: Error: Superclass has no getter named 'g'.
+//     use(super.g += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:222:11: Error: Superclass has no setter named 'm'.
+//     super.m += 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:223:15: Error: Superclass has no setter named 'm'.
+//     use(super.m += 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:235:11: Error: Superclass has no setter named 'e'.
+//     super.e -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:236:15: Error: Superclass has no setter named 'e'.
+//     use(super.e -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:237:11: Error: Superclass has no setter named 'f'.
+//     super.f -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:238:15: Error: Superclass has no setter named 'f'.
+//     use(super.f -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:239:11: Error: Superclass has no getter named 'g'.
+//     super.g -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:240:15: Error: Superclass has no getter named 'g'.
+//     use(super.g -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:247:11: Error: Superclass has no setter named 'm'.
+//     super.m -= 42;
+//           ^
+//
+// pkg/front_end/testcases/rasta/super.dart:248:15: Error: Superclass has no setter named 'm'.
+//     use(super.m -= 42);
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     super.m++;
+//            ^
+//
+// pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     use(super.m++);
+//                ^
+//
+// pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     super.n++;
+//            ^
+//
+// pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     use(super.n++);
+//                ^
+//
+// pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     ++super.m;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     use(++super.m);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     ++super.n;
+//     ^
+//
+// pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     use(++super.n);
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:146:15: Error: This expression has type 'void' and can't be used.
+//     use(super.m());
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:147:12: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     super.m(87);
+//            ^
+//
+// pkg/front_end/testcases/rasta/super.dart:148:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     use(super.m(87));
+//                ^
+//
+// pkg/front_end/testcases/rasta/super.dart:148:15: Error: This expression has type 'void' and can't be used.
+//     use(super.m(87));
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:149:12: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     super.n(87);
+//            ^
+//
+// pkg/front_end/testcases/rasta/super.dart:150:16: Error: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//     use(super.n(87));
+//                ^
+//
+// pkg/front_end/testcases/rasta/super.dart:150:15: Error: This expression has type 'void' and can't be used.
+//     use(super.n(87));
+//               ^
+//
+// pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     super.m += 42;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     use(super.m += 42);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     super.n += 42;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//     use(super.n += 42);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '-'.
+//     super.m -= 42;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '-'.
+//     use(super.m -= 42);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '-'.
+//     super.n -= 42;
+//             ^
+//
+// pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class 'void Function()'.
+// Try correcting the name to the name of an existing method, or defining a method named '-'.
+//     use(super.n -= 42);
+//                 ^
+//
+// pkg/front_end/testcases/rasta/super.dart:11:9: Error: Final field 'f' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final f;
+//         ^
+//
+// pkg/front_end/testcases/rasta/super.dart:33:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
 // Unhandled errors:
 //
 // pkg/front_end/testcases/rasta/super.dart:26:8: Error: Can't declare a member that conflicts with an inherited one.
@@ -9,19 +360,11 @@
 //     +super;
 //     ^
 //
-// pkg/front_end/testcases/rasta/super.dart:43:5: Error: Getter not found: ''.
-//     +super;
-//     ^
-//
 // pkg/front_end/testcases/rasta/super.dart:44:9: Error: '+' is not a prefix operator.
 // Try removing '+'.
 //     use(+super);
 //         ^
 //
-// pkg/front_end/testcases/rasta/super.dart:44:9: Error: Getter not found: ''.
-//     use(+super);
-//         ^
-//
 // pkg/front_end/testcases/rasta/super.dart:62:11: Error: Superclass has no getter named 'g'.
 //     super.g;
 //           ^
@@ -262,7 +605,7 @@
   field dynamic c = null;
   field dynamic d = null;
   final field dynamic f = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::A
     : super core::Object::•()
     ;
   get e() → dynamic
@@ -288,7 +631,7 @@
 }
 class B extends self::A {
   final field dynamic d = null;
-  synthetic constructor •() → void
+  synthetic constructor •() → self::B
     : super self::A::•()
     ;
   get b() → dynamic
@@ -297,7 +640,7 @@
   set i(dynamic x) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::C
     : super self::B::•()
     ;
   method test() → dynamic {
@@ -305,17 +648,15 @@
     self::use(super.{self::A::~}());
     super.{self::A::unary-}();
     self::use(super.{self::A::unary-}());
-    (let final dynamic #t1 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:5: Error: The getter '' isn't defined for the class '#lib1::C'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named ''.
+    invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:5: Error: This couldn't be parsed.
     +super;
-    ^").+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
+    ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:43:6: Error: Can't use 'super' as an expression.
 To delegate a constructor to a super constructor, put the super call as an initializer.
     +super;
      ^^^^^");
-    self::use((let final dynamic #t2 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:9: Error: The getter '' isn't defined for the class '#lib1::C'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named ''.
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:9: Error: This couldn't be parsed.
     use(+super);
-        ^").+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
+        ^".+(invalid-expression "pkg/front_end/testcases/rasta/super.dart:44:10: Error: Can't use 'super' as an expression.
 To delegate a constructor to a super constructor, put the super call as an initializer.
     use(+super);
          ^^^^^"));
@@ -348,41 +689,41 @@
     super.{self::A::n};
     self::use(super.{self::A::n});
     super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(let final dynamic #t3 = super.{self::A::a} in let final dynamic #t4 = super.{self::A::a} = #t3.+(1) in #t3);
+    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
     super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(let final dynamic #t5 = super.{self::B::b} in let final dynamic #t6 = super.{self::A::b} = #t5.+(1) in #t5);
+    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
     super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(let final dynamic #t7 = super.{self::A::c} in let final dynamic #t8 = super.{self::B::c} = #t7.+(1) in #t7);
+    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
     super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(let final dynamic #t9 = super.{self::B::d} in let final dynamic #t10 = super.{self::A::d} = #t9.+(1) in #t9);
+    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
     super.e = super.{self::A::e}.+(1);
-    self::use(let final dynamic #t11 = super.{self::A::e} in let final dynamic #t12 = super.e = #t11.+(1) in #t11);
+    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
     super.f = super.{self::A::f}.+(1);
-    self::use(let final dynamic #t13 = super.{self::A::f} in let final dynamic #t14 = super.f = #t13.+(1) in #t13);
+    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
     super.{self::A::g} = super.g.+(1);
-    self::use(let final dynamic #t15 = super.g in let final dynamic #t16 = super.{self::A::g} = #t15.+(1) in #t15);
+    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
     super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(let final dynamic #t17 = super.{self::A::h} in let final dynamic #t18 = super.{self::A::h} = #t17.+(1) in #t17);
+    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
     super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(let final dynamic #t19 = super.{self::A::i} in let final dynamic #t20 = super.{self::B::i} = #t19.+(1) in #t19);
-    let final core::int #t21 = 87 in super.{self::A::[]=}(#t21, super.{self::A::[]}(#t21).+(1));
-    self::use(let final core::int #t22 = 87 in let final dynamic #t23 = super.{self::A::[]}(#t22) in let final void #t24 = super.{self::A::[]=}(#t22, #t23.+(1)) in #t23);
-    super.m = let final dynamic #t25 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
+    let final core::int #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
+    self::use(let final core::int #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final void #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
+    super.m = let final dynamic #t23 = super.{self::A::m} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     super.m++;
            ^";
-    self::use(let final () → void #t26 = super.{self::A::m} in let final dynamic #t27 = super.m = let final dynamic #t28 = #t26 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    self::use(let final () → void #t24 = super.{self::A::m} in let final dynamic #t25 = super.m = let final dynamic #t26 = #t24 in invalid-expression "pkg/front_end/testcases/rasta/super.dart:96:16: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     use(super.m++);
-               ^" in #t26);
-    super.{self::A::n} = let final dynamic #t29 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class '() \u8594 void'.
+               ^" in #t24);
+    super.{self::A::n} = let final dynamic #t27 = super.{self::A::n} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:97:12: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     super.n++;
            ^";
-    self::use(let final () → void #t30 = super.{self::A::n} in let final dynamic #t31 = super.{self::A::n} = let final dynamic #t32 = #t30 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    self::use(let final () → void #t28 = super.{self::A::n} in let final dynamic #t29 = super.{self::A::n} = let final dynamic #t30 = #t28 in invalid-expression "pkg/front_end/testcases/rasta/super.dart:98:16: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     use(super.n++);
-               ^" in #t30);
+               ^" in #t28);
     super.{self::A::a} = super.{self::A::a}.+(1);
     self::use(super.{self::A::a} = super.{self::A::a}.+(1));
     super.{self::A::b} = super.{self::B::b}.+(1);
@@ -401,21 +742,21 @@
     self::use(super.{self::A::h} = super.{self::A::h}.+(1));
     super.{self::B::i} = super.{self::A::i}.+(1);
     self::use(super.{self::B::i} = super.{self::A::i}.+(1));
-    let final core::int #t33 = 87 in let final dynamic #t34 = super.{self::A::[]}(#t33).+(1) in let final void #t35 = super.{self::A::[]=}(#t33, #t34) in #t34;
-    self::use(let final core::int #t36 = 87 in let final dynamic #t37 = super.{self::A::[]}(#t36).+(1) in let final void #t38 = super.{self::A::[]=}(#t36, #t37) in #t37);
-    super.m = let final dynamic #t39 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    let final core::int #t31 = 87 in let final dynamic #t32 = super.{self::A::[]}(#t31).+(1) in let final void #t33 = super.{self::A::[]=}(#t31, #t32) in #t32;
+    self::use(let final core::int #t34 = 87 in let final dynamic #t35 = super.{self::A::[]}(#t34).+(1) in let final void #t36 = super.{self::A::[]=}(#t34, #t35) in #t35);
+    super.m = let final dynamic #t37 = super.{self::A::m} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:120:5: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     ++super.m;
     ^";
-    self::use(super.m = let final dynamic #t40 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    self::use(super.m = let final dynamic #t38 = super.{self::A::m} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:121:9: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     use(++super.m);
         ^");
-    super.{self::A::n} = let final dynamic #t41 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    super.{self::A::n} = let final dynamic #t39 = super.{self::A::n} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:122:5: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     ++super.n;
     ^";
-    self::use(super.{self::A::n} = let final dynamic #t42 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    self::use(super.{self::A::n} = let final dynamic #t40 = super.{self::A::n} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:123:9: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     use(++super.n);
         ^");
@@ -440,11 +781,17 @@
     super.{self::A::[]}(87).call();
     self::use(super.{self::A::[]}(87).call());
     super.{self::A::m}();
-    self::use(super.{self::A::m}());
+    self::use(let final<BottomType> #t41 = invalid-expression "pkg/front_end/testcases/rasta/super.dart:146:15: Error: This expression has type 'void' and can't be used.
+    use(super.m());
+              ^" in super.{self::A::m}());
     super.{self::A::m}(87);
-    self::use(super.{self::A::m}(87));
+    self::use(let final<BottomType> #t42 = invalid-expression "pkg/front_end/testcases/rasta/super.dart:148:15: Error: This expression has type 'void' and can't be used.
+    use(super.m(87));
+              ^" in super.{self::A::m}(87));
     super.{self::A::n}(87);
-    self::use(super.{self::A::n}(87));
+    self::use(let final<BottomType> #t43 = invalid-expression "pkg/front_end/testcases/rasta/super.dart:150:15: Error: This expression has type 'void' and can't be used.
+    use(super.n(87));
+              ^" in super.{self::A::n}(87));
     super.{self::A::a} = 42;
     self::use(super.{self::A::a} = 42);
     super.{self::A::b} = 42;
@@ -464,35 +811,35 @@
     super.{self::B::i} = 42;
     self::use(super.{self::B::i} = 42);
     super.{self::A::[]=}(87, 42);
-    self::use(let final core::int #t43 = 87 in let final core::int #t44 = 42 in let final void #t45 = super.{self::A::[]=}(#t43, #t44) in #t44);
+    self::use(let final core::int #t44 = 87 in let final core::int #t45 = 42 in let final void #t46 = super.{self::A::[]=}(#t44, #t45) in #t45);
     super.m = 42;
     self::use(super.m = 42);
     super.{self::A::n} = 42;
     self::use(super.{self::A::n} = 42);
     super.{self::A::a}.{core::Object::==}(null) ?{dynamic} super.{self::A::a} = 42 : null;
-    self::use(let final dynamic #t46 = super.{self::A::a} in #t46.{core::Object::==}(null) ?{dynamic} super.{self::A::a} = 42 : #t46);
+    self::use(let final dynamic #t47 = super.{self::A::a} in #t47.{core::Object::==}(null) ?{dynamic} super.{self::A::a} = 42 : #t47);
     super.{self::B::b}.{core::Object::==}(null) ?{dynamic} super.{self::A::b} = 42 : null;
-    self::use(let final dynamic #t47 = super.{self::B::b} in #t47.{core::Object::==}(null) ?{dynamic} super.{self::A::b} = 42 : #t47);
+    self::use(let final dynamic #t48 = super.{self::B::b} in #t48.{core::Object::==}(null) ?{dynamic} super.{self::A::b} = 42 : #t48);
     super.{self::A::c}.{core::Object::==}(null) ?{dynamic} super.{self::B::c} = 42 : null;
-    self::use(let final dynamic #t48 = super.{self::A::c} in #t48.{core::Object::==}(null) ?{dynamic} super.{self::B::c} = 42 : #t48);
+    self::use(let final dynamic #t49 = super.{self::A::c} in #t49.{core::Object::==}(null) ?{dynamic} super.{self::B::c} = 42 : #t49);
     super.{self::B::d}.{core::Object::==}(null) ?{dynamic} super.{self::A::d} = 42 : null;
-    self::use(let final dynamic #t49 = super.{self::B::d} in #t49.{core::Object::==}(null) ?{dynamic} super.{self::A::d} = 42 : #t49);
+    self::use(let final dynamic #t50 = super.{self::B::d} in #t50.{core::Object::==}(null) ?{dynamic} super.{self::A::d} = 42 : #t50);
     super.{self::A::e}.{core::Object::==}(null) ?{dynamic} super.e = 42 : null;
-    self::use(let final dynamic #t50 = super.{self::A::e} in #t50.{core::Object::==}(null) ?{dynamic} super.e = 42 : #t50);
+    self::use(let final dynamic #t51 = super.{self::A::e} in #t51.{core::Object::==}(null) ?{dynamic} super.e = 42 : #t51);
     super.{self::A::f}.{core::Object::==}(null) ?{dynamic} super.f = 42 : null;
-    self::use(let final dynamic #t51 = super.{self::A::f} in #t51.{core::Object::==}(null) ?{dynamic} super.f = 42 : #t51);
+    self::use(let final dynamic #t52 = super.{self::A::f} in #t52.{core::Object::==}(null) ?{dynamic} super.f = 42 : #t52);
     super.g.{core::Object::==}(null) ?{dynamic} super.{self::A::g} = 42 : null;
-    self::use(let final dynamic #t52 = super.g in #t52.{core::Object::==}(null) ?{dynamic} super.{self::A::g} = 42 : #t52);
+    self::use(let final dynamic #t53 = super.g in #t53.{core::Object::==}(null) ?{dynamic} super.{self::A::g} = 42 : #t53);
     super.{self::A::h}.{core::Object::==}(null) ?{dynamic} super.{self::A::h} = 42 : null;
-    self::use(let final dynamic #t53 = super.{self::A::h} in #t53.{core::Object::==}(null) ?{dynamic} super.{self::A::h} = 42 : #t53);
+    self::use(let final dynamic #t54 = super.{self::A::h} in #t54.{core::Object::==}(null) ?{dynamic} super.{self::A::h} = 42 : #t54);
     super.{self::A::i}.{core::Object::==}(null) ?{dynamic} super.{self::B::i} = 42 : null;
-    self::use(let final dynamic #t54 = super.{self::A::i} in #t54.{core::Object::==}(null) ?{dynamic} super.{self::B::i} = 42 : #t54);
-    let final core::int #t55 = 87 in super.{self::A::[]}(#t55).{core::Object::==}(null) ?{dynamic} let final core::int #t56 = 42 in let final void #t57 = super.{self::A::[]=}(#t55, #t56) in #t56 : null;
-    self::use(let final core::int #t58 = 87 in let final dynamic #t59 = super.{self::A::[]}(#t58) in #t59.{core::Object::==}(null) ?{dynamic} let final core::int #t60 = 42 in let final void #t61 = super.{self::A::[]=}(#t58, #t60) in #t60 : #t59);
+    self::use(let final dynamic #t55 = super.{self::A::i} in #t55.{core::Object::==}(null) ?{dynamic} super.{self::B::i} = 42 : #t55);
+    let final core::int #t56 = 87 in super.{self::A::[]}(#t56).{core::Object::==}(null) ?{dynamic} let final core::int #t57 = 42 in let final void #t58 = super.{self::A::[]=}(#t56, #t57) in #t57 : null;
+    self::use(let final core::int #t59 = 87 in let final dynamic #t60 = super.{self::A::[]}(#t59) in #t60.{core::Object::==}(null) ?{dynamic} let final core::int #t61 = 42 in let final void #t62 = super.{self::A::[]=}(#t59, #t61) in #t61 : #t60);
     super.{self::A::m}.{core::Object::==}(null) ?{core::Object} super.m = 42 : null;
-    self::use(let final () → void #t62 = super.{self::A::m} in #t62.{core::Object::==}(null) ?{core::Object} super.m = 42 : #t62);
+    self::use(let final () → void #t63 = super.{self::A::m} in #t63.{core::Object::==}(null) ?{core::Object} super.m = 42 : #t63);
     super.{self::A::n}.{core::Object::==}(null) ?{core::Object} super.{self::A::n} = 42 : null;
-    self::use(let final () → void #t63 = super.{self::A::n} in #t63.{core::Object::==}(null) ?{core::Object} super.{self::A::n} = 42 : #t63);
+    self::use(let final () → void #t64 = super.{self::A::n} in #t64.{core::Object::==}(null) ?{core::Object} super.{self::A::n} = 42 : #t64);
     super.{self::A::a} = super.{self::A::a}.+(42);
     self::use(super.{self::A::a} = super.{self::A::a}.+(42));
     super.{self::A::b} = super.{self::B::b}.+(42);
@@ -511,21 +858,21 @@
     self::use(super.{self::A::h} = super.{self::A::h}.+(42));
     super.{self::B::i} = super.{self::A::i}.+(42);
     self::use(super.{self::B::i} = super.{self::A::i}.+(42));
-    let final core::int #t64 = 87 in super.{self::A::[]=}(#t64, super.{self::A::[]}(#t64).+(42));
-    self::use(let final core::int #t65 = 87 in let final dynamic #t66 = super.{self::A::[]}(#t65).+(42) in let final void #t67 = super.{self::A::[]=}(#t65, #t66) in #t66);
-    super.m = let final dynamic #t68 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    let final core::int #t65 = 87 in super.{self::A::[]=}(#t65, super.{self::A::[]}(#t65).+(42));
+    self::use(let final core::int #t66 = 87 in let final dynamic #t67 = super.{self::A::[]}(#t66).+(42) in let final void #t68 = super.{self::A::[]=}(#t66, #t67) in #t67);
+    super.m = let final dynamic #t69 = super.{self::A::m} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     super.m += 42;
             ^";
-    self::use(super.m = let final dynamic #t69 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    self::use(super.m = let final dynamic #t70 = super.{self::A::m} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:223:17: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     use(super.m += 42);
                 ^");
-    super.{self::A::n} = let final dynamic #t70 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    super.{self::A::n} = let final dynamic #t71 = super.{self::A::n} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:224:13: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     super.n += 42;
             ^";
-    self::use(super.{self::A::n} = let final dynamic #t71 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class '() \u8594 void'.
+    self::use(super.{self::A::n} = let final dynamic #t72 = super.{self::A::n} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:225:17: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     use(super.n += 42);
                 ^");
@@ -547,21 +894,21 @@
     self::use(super.{self::A::h} = super.{self::A::h}.-(42));
     super.{self::B::i} = super.{self::A::i}.-(42);
     self::use(super.{self::B::i} = super.{self::A::i}.-(42));
-    let final core::int #t72 = 87 in super.{self::A::[]=}(#t72, super.{self::A::[]}(#t72).-(42));
-    self::use(let final core::int #t73 = 87 in let final dynamic #t74 = super.{self::A::[]}(#t73).-(42) in let final void #t75 = super.{self::A::[]=}(#t73, #t74) in #t74);
-    super.m = let final dynamic #t76 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class '() \u8594 void'.
+    let final core::int #t73 = 87 in super.{self::A::[]=}(#t73, super.{self::A::[]}(#t73).-(42));
+    self::use(let final core::int #t74 = 87 in let final dynamic #t75 = super.{self::A::[]}(#t74).-(42) in let final void #t76 = super.{self::A::[]=}(#t74, #t75) in #t75);
+    super.m = let final dynamic #t77 = super.{self::A::m} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '-'.
     super.m -= 42;
             ^";
-    self::use(super.m = let final dynamic #t77 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class '() \u8594 void'.
+    self::use(super.m = let final dynamic #t78 = super.{self::A::m} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:248:17: Error: The method '-' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '-'.
     use(super.m -= 42);
                 ^");
-    super.{self::A::n} = let final dynamic #t78 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class '() \u8594 void'.
+    super.{self::A::n} = let final dynamic #t79 = super.{self::A::n} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:249:13: Error: The method '-' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '-'.
     super.n -= 42;
             ^";
-    self::use(super.{self::A::n} = let final dynamic #t79 = super.{self::A::n} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class '() \u8594 void'.
+    self::use(super.{self::A::n} = let final dynamic #t80 = super.{self::A::n} in invalid-expression "pkg/front_end/testcases/rasta/super.dart:250:17: Error: The method '-' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '-'.
     use(super.n -= 42);
                 ^");
diff --git a/pkg/front_end/testcases/rasta/super_initializer.dart.direct.expect b/pkg/front_end/testcases/rasta/super_initializer.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/super_initializer.dart.direct.expect
rename to pkg/front_end/testcases/rasta/super_initializer.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/super_initializer.dart.strong.expect b/pkg/front_end/testcases/rasta/super_initializer.dart.strong.expect
new file mode 100644
index 0000000..04047ee
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_initializer.dart.strong.expect
@@ -0,0 +1,47 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/super_initializer.dart:14:15: Error: Can't have initializers after 'super'.
+//       : super.arg0(),
+//               ^
+//
+// pkg/front_end/testcases/rasta/super_initializer.dart:17:15: Error: Can't have initializers after 'super'.
+//       : super.arg1(a),
+//               ^
+//
+// pkg/front_end/testcases/rasta/super_initializer.dart:20:15: Error: Can't have initializers after 'super'.
+//       : super.arg2(a, b),
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor arg0() → self::Super
+    : super core::Object::•()
+    ;
+  constructor arg1(dynamic a) → self::Super
+    : super core::Object::•()
+    ;
+  constructor arg2(dynamic a, dynamic b) → self::Super
+    : super core::Object::•()
+    ;
+}
+class Sub extends self::Super {
+  field dynamic field = null;
+  constructor arg0() → self::Sub
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:14:15: Error: Can't have initializers after 'super'.
+      : super.arg0(),
+              ^", super self::Super::arg0()
+    ;
+  constructor arg1(dynamic a) → self::Sub
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:17:15: Error: Can't have initializers after 'super'.
+      : super.arg1(a),
+              ^", super self::Super::arg1(a)
+    ;
+  constructor arg2(dynamic a, dynamic b) → self::Sub
+    : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:20:15: Error: Can't have initializers after 'super'.
+      : super.arg2(a, b),
+              ^", super self::Super::arg2(a, b)
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/super_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/super_initializer.dart.strong.transformed.expect
new file mode 100644
index 0000000..ab3a0b9
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_initializer.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor arg0() → self::Super
+    : super core::Object::•()
+    ;
+  constructor arg1(dynamic a) → self::Super
+    : super core::Object::•()
+    ;
+  constructor arg2(dynamic a, dynamic b) → self::Super
+    : super core::Object::•()
+    ;
+}
+class Sub extends self::Super {
+  field dynamic field = null;
+  constructor arg0() → self::Sub
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:14:15: Error: Can't have initializers after 'super'.
+      : super.arg0(),
+              ^", super self::Super::arg0()
+    ;
+  constructor arg1(dynamic a) → self::Sub
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:17:15: Error: Can't have initializers after 'super'.
+      : super.arg1(a),
+              ^", super self::Super::arg1(a)
+    ;
+  constructor arg2(dynamic a, dynamic b) → self::Sub
+    : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:20:15: Error: Can't have initializers after 'super'.
+      : super.arg2(a, b),
+              ^", super self::Super::arg2(a, b)
+    ;
+}
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
deleted file mode 100644
index 8b75a6e..0000000
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.expect
+++ /dev/null
@@ -1,54 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Warning: Superclass has no method named 'foo'.
-//   foo() => super.foo() + f();
-//                  ^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-import "./mixin_library.dart" as mix;
-
-class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Super<self::Super::S>
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return 40;
-  method f() → dynamic
-    return 3;
-}
-abstract class _C&Super&Mixin<V extends core::Object = dynamic> = self::Super<self::_C&Super&Mixin::V> with mix::Mixin<self::_C&Super&Mixin::V> {
-  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
-    : super self::Super::•()
-    ;
-}
-class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → self::C<self::C::V>
-    : super self::Super::•()
-    ;
-}
-abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → self::_D&Super&Mixin
-    : super self::Super::•()
-    ;
-}
-class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → self::D
-    : super self::Super::•()
-    ;
-}
-class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
-  synthetic constructor •() → self::C2<self::C2::V>
-    : super self::Super::•()
-    ;
-}
-class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → self::D2
-    : super self::Super::•()
-    ;
-}
-static method main() → dynamic {
-  core::print(new self::C::•<dynamic>().foo());
-  core::print(new self::C2::•<dynamic>().foo());
-}
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect
deleted file mode 100644
index 2205406..0000000
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.direct.transformed.expect
+++ /dev/null
@@ -1,112 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "./mixin_library.dart" as mix;
-
-class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Super<self::Super::S>
-    : super core::Object::•()
-    ;
-  method foo() → dynamic
-    return 40;
-  method f() → dynamic
-    return 3;
-}
-abstract class _C&Super&Mixin<V extends core::Object = dynamic> extends self::Super<self::_C&Super&Mixin::V> implements mix::Mixin<self::_C&Super&Mixin::V> {
-  field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field self::_C&Super&Mixin::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
-    : super self::Super::•()
-    ;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
-    return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(self::_C&Super&Mixin::V a) → self::_C&Super&Mixin::V
-    return null;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
-    return mix::V();
-  method /* from org-dartlang-testcase:///mixin_library.dart */ l() → dynamic
-    return mix::_private();
-  method /* from org-dartlang-testcase:///mixin_library.dart */ _privateMethod() → dynamic
-    return 49;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
-    return this.{mix::Mixin::_privateMethod}();
-}
-class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → self::C<self::C::V>
-    : super self::Super::•()
-    ;
-}
-abstract class _D&Super&Mixin extends self::Super<dynamic> implements mix::Mixin<dynamic> {
-  field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → self::_D&Super&Mixin
-    : super self::Super::•()
-    ;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
-    return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(dynamic a) → dynamic
-    return null;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
-    return mix::V();
-  method /* from org-dartlang-testcase:///mixin_library.dart */ l() → dynamic
-    return mix::_private();
-  method /* from org-dartlang-testcase:///mixin_library.dart */ _privateMethod() → dynamic
-    return 49;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
-    return this.{mix::Mixin::_privateMethod}();
-}
-class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → self::D
-    : super self::Super::•()
-    ;
-}
-class C2<V extends core::Object = dynamic> extends self::Super<self::C2::V> implements mix::Mixin<self::C2::V> {
-  field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field self::C2::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → self::C2<self::C2::V>
-    : super self::Super::•()
-    ;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
-    return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(self::C2::V a) → self::C2::V
-    return null;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
-    return mix::V();
-  method /* from org-dartlang-testcase:///mixin_library.dart */ l() → dynamic
-    return mix::_private();
-  method /* from org-dartlang-testcase:///mixin_library.dart */ _privateMethod() → dynamic
-    return 49;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
-    return this.{mix::Mixin::_privateMethod}();
-}
-class D2 extends self::Super<dynamic> implements mix::Mixin<dynamic> {
-  field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → self::D2
-    : super self::Super::•()
-    ;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
-    return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(dynamic a) → dynamic
-    return null;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
-    return mix::V();
-  method /* from org-dartlang-testcase:///mixin_library.dart */ l() → dynamic
-    return mix::_private();
-  method /* from org-dartlang-testcase:///mixin_library.dart */ _privateMethod() → dynamic
-    return 49;
-  method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
-    return this.{mix::Mixin::_privateMethod}();
-}
-static method main() → dynamic {
-  core::print(new self::C::•<dynamic>().foo());
-  core::print(new self::C2::•<dynamic>().foo());
-}
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect
new file mode 100644
index 0000000..5aca9d3
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect
@@ -0,0 +1,54 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Warning: Superclass has no method named 'foo'.
+//   foo() => super.foo() + f();
+//                  ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+import "./mixin_library.dart" as mix;
+
+class Super<S extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::S>
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return 40;
+  method f() → dynamic
+    return 3;
+}
+abstract class _C&Super&Mixin<V extends core::Object = dynamic> = self::Super<self::_C&Super&Mixin::V> with mix::Mixin<self::_C&Super&Mixin::V> {
+  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
+    : super self::Super::•()
+    ;
+}
+class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
+  synthetic constructor •() → self::C<self::C::V>
+    : super self::_C&Super&Mixin::•()
+    ;
+}
+abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> {
+  synthetic constructor •() → self::_D&Super&Mixin
+    : super self::Super::•()
+    ;
+}
+class D extends self::_D&Super&Mixin {
+  synthetic constructor •() → self::D
+    : super self::_D&Super&Mixin::•()
+    ;
+}
+class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
+  synthetic constructor •() → self::C2<self::C2::V>
+    : super self::Super::•()
+    ;
+}
+class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
+  synthetic constructor •() → self::D2
+    : super self::Super::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::C::•<dynamic>().foo());
+  core::print(new self::C2::•<dynamic>().foo());
+}
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
new file mode 100644
index 0000000..97f3b5a
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
@@ -0,0 +1,112 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "./mixin_library.dart" as mix;
+
+class Super<S extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::S>
+    : super core::Object::•()
+    ;
+  method foo() → dynamic
+    return 40;
+  method f() → dynamic
+    return 3;
+}
+abstract class _C&Super&Mixin<V extends core::Object = dynamic> extends self::Super<self::_C&Super&Mixin::V> implements mix::Mixin<self::_C&Super&Mixin::V> {
+  field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  field self::_C&Super&Mixin::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
+    : super self::Super::•()
+    ;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
+    return super.foo().+(mix::f());
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(self::_C&Super&Mixin::V a) → self::_C&Super&Mixin::V
+    return null;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
+    return mix::V();
+  method /* from org-dartlang-testcase:///mixin_library.dart */ l() → dynamic
+    return mix::_private();
+  method /* from org-dartlang-testcase:///mixin_library.dart */ _privateMethod() → dynamic
+    return 49;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
+    return this.{mix::Mixin::_privateMethod}();
+}
+class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
+  synthetic constructor •() → self::C<self::C::V>
+    : super self::_C&Super&Mixin::•()
+    ;
+}
+abstract class _D&Super&Mixin extends self::Super<dynamic> implements mix::Mixin<dynamic> {
+  field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  synthetic constructor •() → self::_D&Super&Mixin
+    : super self::Super::•()
+    ;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
+    return super.foo().+(mix::f());
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(dynamic a) → dynamic
+    return null;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
+    return mix::V();
+  method /* from org-dartlang-testcase:///mixin_library.dart */ l() → dynamic
+    return mix::_private();
+  method /* from org-dartlang-testcase:///mixin_library.dart */ _privateMethod() → dynamic
+    return 49;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
+    return this.{mix::Mixin::_privateMethod}();
+}
+class D extends self::_D&Super&Mixin {
+  synthetic constructor •() → self::D
+    : super self::_D&Super&Mixin::•()
+    ;
+}
+class C2<V extends core::Object = dynamic> extends self::Super<self::C2::V> implements mix::Mixin<self::C2::V> {
+  field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  field self::C2::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  synthetic constructor •() → self::C2<self::C2::V>
+    : super self::Super::•()
+    ;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
+    return super.foo().+(mix::f());
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(self::C2::V a) → self::C2::V
+    return null;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
+    return mix::V();
+  method /* from org-dartlang-testcase:///mixin_library.dart */ l() → dynamic
+    return mix::_private();
+  method /* from org-dartlang-testcase:///mixin_library.dart */ _privateMethod() → dynamic
+    return 49;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
+    return this.{mix::Mixin::_privateMethod}();
+}
+class D2 extends self::Super<dynamic> implements mix::Mixin<dynamic> {
+  field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  synthetic constructor •() → self::D2
+    : super self::Super::•()
+    ;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
+    return super.foo().+(mix::f());
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(dynamic a) → dynamic
+    return null;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
+    return mix::V();
+  method /* from org-dartlang-testcase:///mixin_library.dart */ l() → dynamic
+    return mix::_private();
+  method /* from org-dartlang-testcase:///mixin_library.dart */ _privateMethod() → dynamic
+    return 49;
+  method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
+    return this.{mix::Mixin::_privateMethod}();
+}
+static method main() → dynamic {
+  core::print(new self::C::•<dynamic>().foo());
+  core::print(new self::C2::•<dynamic>().foo());
+}
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
index 77780b3..ac00fc5 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
@@ -31,7 +31,7 @@
 }
 class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
   synthetic constructor •() → self::C<self::C::V>
-    : super self::Super::•()
+    : super self::_C&Super&Mixin::•()
     ;
 }
 abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> {
@@ -41,7 +41,7 @@
 }
 class D extends self::_D&Super&Mixin {
   synthetic constructor •() → self::D
-    : super self::Super::•()
+    : super self::_D&Super&Mixin::•()
     ;
 }
 class C2<V extends core::Object = dynamic> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
diff --git a/pkg/front_end/testcases/rasta/super_operator.dart.direct.expect b/pkg/front_end/testcases/rasta/super_operator.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/super_operator.dart.direct.expect
rename to pkg/front_end/testcases/rasta/super_operator.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/super_operator.dart.strong.expect b/pkg/front_end/testcases/rasta/super_operator.dart.strong.expect
new file mode 100644
index 0000000..152b391
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_operator.dart.strong.expect
@@ -0,0 +1,44 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/super_operator.dart:22:15: Error: Superclass has no method named '[]'.
+//   g() => super[0];
+//               ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/super_operator.dart:22:15: Error: Superclass has no method named '[]'.
+//   g() => super[0];
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  operator +(core::String s) → dynamic
+    return null;
+  operator [](dynamic i) → dynamic
+    return null;
+  operator []=(dynamic i, dynamic val) → void {}
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+  operator +(core::String s) → dynamic
+    return super.{self::A::+}("${s}${s}");
+  operator [](dynamic i) → dynamic
+    return super.{self::A::[]}(i);
+  operator []=(dynamic i, dynamic val) → void
+    return let final dynamic #t1 = let final dynamic #t2 = i in let final dynamic #t3 = i = #t2.+(1) in #t2 in let final dynamic #t4 = super.{self::A::[]}(#t1).+(val) in let final void #t5 = super.{self::A::[]=}(#t1, #t4) in #t4;
+}
+class Autobianchi extends core::Object {
+  synthetic constructor •() → self::Autobianchi
+    : super core::Object::•()
+    ;
+  method g() → dynamic
+    return super.[](0);
+}
diff --git a/pkg/front_end/testcases/rasta/super_operator.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/super_operator.dart.type_promotion.expect
new file mode 100644
index 0000000..a1bf30c
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/super_operator.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/rasta/super_operator.dart:18:34: Context: Write to i@401
+  operator []=(i, val) => super[i++] += val;
+                                 ^^
diff --git a/pkg/front_end/testcases/rasta/supports_reflection.dart.direct.expect b/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/supports_reflection.dart.direct.expect
rename to pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/supports_reflection.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/supports_reflection.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.direct.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.direct.expect
rename to pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.expect
new file mode 100644
index 0000000..dd4fb5e
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.expect
@@ -0,0 +1,89 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:5: Error: Switch case may fall through to the next case.
+//     case 2:  result = 2; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:5: Error: Switch case may fall through to the next case.
+//     case 3:  result = 3; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:46:5: Error: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:5: Error: Switch case may fall through to the next case.
+//     case 2:  result = 2; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:5: Error: Switch case may fall through to the next case.
+//     case 3:  result = 3; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:46:5: Error: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test(dynamic value) → dynamic {
+  dynamic result;
+  #L1:
+  switch(value) {
+    #L2:
+    case 1:
+      {
+        result = 1;
+        break #L1;
+      }
+    #L3:
+    case 2:
+      {
+        result = 2;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 35);
+      }
+    #L4:
+    case 3:
+      {
+        result = 3;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 36);
+      }
+    #L5:
+    default:
+      {
+        result = 4;
+      }
+  }
+  return result;
+}
+static method testEmptyCases(dynamic value) → dynamic {
+  dynamic result;
+  #L6:
+  switch(value) {
+    #L7:
+    case 1:
+    case 2:
+      {
+        result = 1;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 46);
+      }
+    #L8:
+    case 3:
+    case 4:
+      {
+        result = 2;
+        break #L6;
+      }
+    #L9:
+    case 5:
+    case 6:
+    default:
+      {}
+  }
+  return result;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.transformed.expect
new file mode 100644
index 0000000..a0e9c4f
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.transformed.expect
@@ -0,0 +1,75 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:5: Error: Switch case may fall through to the next case.
+//     case 2:  result = 2; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:5: Error: Switch case may fall through to the next case.
+//     case 3:  result = 3; /// static warning - case fall-through, see "Switch"
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:46:5: Error: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test(dynamic value) → dynamic {
+  dynamic result;
+  #L1:
+  switch(value) {
+    #L2:
+    case 1:
+      {
+        result = 1;
+        break #L1;
+      }
+    #L3:
+    case 2:
+      {
+        result = 2;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 35);
+      }
+    #L4:
+    case 3:
+      {
+        result = 3;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 36);
+      }
+    #L5:
+    default:
+      {
+        result = 4;
+      }
+  }
+  return result;
+}
+static method testEmptyCases(dynamic value) → dynamic {
+  dynamic result;
+  #L6:
+  switch(value) {
+    #L7:
+    case 1:
+    case 2:
+      {
+        result = 1;
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 46);
+      }
+    #L8:
+    case 3:
+    case 4:
+      {
+        result = 2;
+        break #L6;
+      }
+    #L9:
+    case 5:
+    case 6:
+    default:
+      {}
+  }
+  return result;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.type_promotion.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.type_promotion.expect
new file mode 100644
index 0000000..4aebb51
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.type_promotion.expect
@@ -0,0 +1,18 @@
+pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:33:21: Context: Write to result@1329
+    case 1:  result = 1;
+                    ^
+pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:21: Context: Write to result@1329
+    case 2:  result = 2; /// static warning - case fall-through, see "Switch"
+                    ^
+pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:21: Context: Write to result@1329
+    case 3:  result = 3; /// static warning - case fall-through, see "Switch"
+                    ^
+pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:37:21: Context: Write to result@1329
+    default: result = 4;
+                    ^
+pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:47:20: Context: Write to result@1636
+    case 2: result = 1; /// static warning - case fall-through, see "Switch"
+                   ^
+pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:49:20: Context: Write to result@1636
+    case 4: result = 2;
+                   ^
diff --git a/pkg/front_end/testcases/rasta/switch_fall_through.dart.direct.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/switch_fall_through.dart.direct.expect
rename to pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/switch_fall_through.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/switch_fall_through.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.expect
new file mode 100644
index 0000000..04d25f9
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.expect
@@ -0,0 +1,111 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:7:5: Error: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:13:5: Error: Switch case may fall through to the next case.
+//     case 2:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:20:5: Error: Switch case may fall through to the next case.
+//     case 3:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:26:5: Error: Switch case may fall through to the next case.
+//     case 4:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:31:5: Error: Switch case may fall through to the next case.
+//     case 5:
+//     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:7:5: Error: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:13:5: Error: Switch case may fall through to the next case.
+//     case 2:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:20:5: Error: Switch case may fall through to the next case.
+//     case 3:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:26:5: Error: Switch case may fall through to the next case.
+//     case 4:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:31:5: Error: Switch case may fall through to the next case.
+//     case 5:
+//     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  #L1:
+  switch(1) {
+    #L2:
+    case 1:
+      {
+        {
+          "No fall-through error needed.";
+          break #L1;
+          ;
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 7);
+      }
+    #L3:
+    case 2:
+      {
+        {
+          "Fall-through error needed.";
+          if(true) {
+            break #L1;
+          }
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 13);
+      }
+    #L4:
+    case 3:
+      {
+        try {
+          "No fall-through error needed.";
+        }
+        finally {
+          break #L1;
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 20);
+      }
+    #L5:
+    case 4:
+      {
+        try {
+          "No fall-through error needed.";
+          break #L1;
+        }
+        finally {
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 26);
+      }
+    #L6:
+    case 5:
+      {
+        try {
+          "Fall-through error needed.";
+        }
+        finally {
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 31);
+      }
+    #L7:
+    case 10000:
+      {
+        "Should be last. No fall-through error, falling through allowed here.";
+      }
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.transformed.expect
new file mode 100644
index 0000000..242d0e4
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.transformed.expect
@@ -0,0 +1,89 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:7:5: Error: Switch case may fall through to the next case.
+//     case 1:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:13:5: Error: Switch case may fall through to the next case.
+//     case 2:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:20:5: Error: Switch case may fall through to the next case.
+//     case 3:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:26:5: Error: Switch case may fall through to the next case.
+//     case 4:
+//     ^
+//
+// pkg/front_end/testcases/rasta/switch_fall_through.dart:31:5: Error: Switch case may fall through to the next case.
+//     case 5:
+//     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  #L1:
+  switch(1) {
+    #L2:
+    case 1:
+      {
+        {
+          "No fall-through error needed.";
+          break #L1;
+          ;
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 7);
+      }
+    #L3:
+    case 2:
+      {
+        {
+          "Fall-through error needed.";
+          if(true) {
+            break #L1;
+          }
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 13);
+      }
+    #L4:
+    case 3:
+      {
+        try {
+          "No fall-through error needed.";
+        }
+        finally {
+          break #L1;
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 20);
+      }
+    #L5:
+    case 4:
+      {
+        try {
+          "No fall-through error needed.";
+          break #L1;
+        }
+        finally {
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 26);
+      }
+    #L6:
+    case 5:
+      {
+        try {
+          "Fall-through error needed.";
+        }
+        finally {
+        }
+        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 31);
+      }
+    #L7:
+    case 10000:
+      {
+        "Should be last. No fall-through error, falling through allowed here.";
+      }
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.direct.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/this_invoke.dart.direct.expect
rename to pkg/front_end/testcases/rasta/this_invoke.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/this_invoke.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/this_invoke.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.strong.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.strong.expect
new file mode 100644
index 0000000..e025609
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.strong.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method m(dynamic x) → dynamic
+    return this.{self::C::call}(x);
+  method call(dynamic x) → dynamic
+    return 42;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::C::m}(42));
+}
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.strong.transformed.expect
new file mode 100644
index 0000000..e025609
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.strong.transformed.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+  method m(dynamic x) → dynamic
+    return this.{self::C::call}(x);
+  method call(dynamic x) → dynamic
+    return 42;
+}
+static method main() → dynamic {
+  core::print(new self::C::•().{self::C::m}(42));
+}
diff --git a/pkg/front_end/testcases/rasta/try_label.dart.direct.expect b/pkg/front_end/testcases/rasta/try_label.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/try_label.dart.direct.expect
rename to pkg/front_end/testcases/rasta/try_label.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/try_label.dart.strong.expect b/pkg/front_end/testcases/rasta/try_label.dart.strong.expect
new file mode 100644
index 0000000..0f4e271
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/try_label.dart.strong.expect
@@ -0,0 +1,26 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/try_label.dart:9:5: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//     continue L;
+//     ^^^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/try_label.dart:9:5: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//     continue L;
+//     ^^^^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  #L1:
+  try {
+    break #L1;
+  }
+  finally {
+    break #L1;
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/try_label.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/try_label.dart.strong.transformed.expect
new file mode 100644
index 0000000..8de56dd
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/try_label.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/try_label.dart:9:5: Error: A continue statement can't be used outside of a loop or switch statement.
+// Try removing the continue statement.
+//     continue L;
+//     ^^^^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  #L1:
+  try {
+    break #L1;
+  }
+  finally {
+    break #L1;
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.direct.expect b/pkg/front_end/testcases/rasta/type_literals.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/type_literals.dart.direct.expect
rename to pkg/front_end/testcases/rasta/type_literals.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
new file mode 100644
index 0000000..a0834cd24
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
@@ -0,0 +1,521 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:22:5: Error: Method not found: 'dynamic'.
+//     dynamic();
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:23:9: Error: Method not found: 'dynamic'.
+//     use(dynamic());
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:24:5: Error: Method not found: 'T'.
+//     T();
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:25:9: Error: Method not found: 'T'.
+//     use(T());
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:26:5: Error: Method not found: 'Func'.
+//     Func();
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:27:9: Error: Method not found: 'Func'.
+//     use(Func());
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:29:5: Error: Setter not found: 'C'.
+//     C = 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:30:9: Error: Setter not found: 'C'.
+//     use(C = 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:31:5: Error: Setter not found: 'dynamic'.
+//     dynamic = 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:32:9: Error: Setter not found: 'dynamic'.
+//     use(dynamic = 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:33:5: Error: Setter not found: 'T'.
+//     T = 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:34:9: Error: Setter not found: 'T'.
+//     use(T = 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:35:5: Error: Setter not found: 'Func'.
+//     Func = 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:36:9: Error: Setter not found: 'Func'.
+//     use(Func = 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:38:5: Error: Setter not found: 'C'.
+//     C++;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:39:9: Error: Setter not found: 'C'.
+//     use(C++);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:40:5: Error: Setter not found: 'dynamic'.
+//     dynamic++;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:41:9: Error: Setter not found: 'dynamic'.
+//     use(dynamic++);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:42:5: Error: Setter not found: 'T'.
+//     T++;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:43:9: Error: Setter not found: 'T'.
+//     use(T++);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:44:5: Error: Setter not found: 'Func'.
+//     Func++;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:45:9: Error: Setter not found: 'Func'.
+//     use(Func++);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:47:7: Error: Setter not found: 'C'.
+//     ++C;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:48:11: Error: Setter not found: 'C'.
+//     use(++C);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:49:7: Error: Setter not found: 'dynamic'.
+//     ++dynamic;
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:50:11: Error: Setter not found: 'dynamic'.
+//     use(++dynamic);
+//           ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:51:7: Error: Setter not found: 'T'.
+//     ++T;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:52:11: Error: Setter not found: 'T'.
+//     use(++T);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:53:7: Error: Setter not found: 'Func'.
+//     ++Func;
+//       ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:54:11: Error: Setter not found: 'Func'.
+//     use(++Func);
+//           ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:56:5: Error: Setter not found: 'C'.
+//     C--;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:57:9: Error: Setter not found: 'C'.
+//     use(C--);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:58:5: Error: Setter not found: 'dynamic'.
+//     dynamic--;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:59:9: Error: Setter not found: 'dynamic'.
+//     use(dynamic--);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:60:5: Error: Setter not found: 'T'.
+//     T--;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:61:9: Error: Setter not found: 'T'.
+//     use(T--);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:62:5: Error: Setter not found: 'Func'.
+//     Func--;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:63:9: Error: Setter not found: 'Func'.
+//     use(Func--);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:65:7: Error: Setter not found: 'C'.
+//     --C;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:66:11: Error: Setter not found: 'C'.
+//     use(--C);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:67:7: Error: Setter not found: 'dynamic'.
+//     --dynamic;
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:68:11: Error: Setter not found: 'dynamic'.
+//     use(--dynamic);
+//           ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:69:7: Error: Setter not found: 'T'.
+//     --T;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:70:11: Error: Setter not found: 'T'.
+//     use(--T);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:71:7: Error: Setter not found: 'Func'.
+//     --Func;
+//       ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Setter not found: 'Func'.
+//     use(--Func);
+//           ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Setter not found: 'C'.
+//     C ??= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Setter not found: 'C'.
+//     use(C ??= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Setter not found: 'dynamic'.
+//     dynamic ??= 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Setter not found: 'dynamic'.
+//     use(dynamic ??= 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Setter not found: 'T'.
+//     T ??= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Setter not found: 'T'.
+//     use(T ??= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Setter not found: 'Func'.
+//     Func ??= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Setter not found: 'Func'.
+//     use(Func ??= 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Setter not found: 'C'.
+//     C += 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:84:9: Error: Setter not found: 'C'.
+//     use(C += 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:85:5: Error: Setter not found: 'dynamic'.
+//     dynamic += 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:86:9: Error: Setter not found: 'dynamic'.
+//     use(dynamic += 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:87:5: Error: Setter not found: 'T'.
+//     T += 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:88:9: Error: Setter not found: 'T'.
+//     use(T += 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:89:5: Error: Setter not found: 'Func'.
+//     Func += 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:90:9: Error: Setter not found: 'Func'.
+//     use(Func += 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:92:5: Error: Setter not found: 'C'.
+//     C -= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:93:9: Error: Setter not found: 'C'.
+//     use(C -= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:94:5: Error: Setter not found: 'dynamic'.
+//     dynamic -= 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:95:9: Error: Setter not found: 'dynamic'.
+//     use(dynamic -= 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:96:5: Error: Setter not found: 'T'.
+//     T -= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:97:9: Error: Setter not found: 'T'.
+//     use(T -= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:98:5: Error: Setter not found: 'Func'.
+//     Func -= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:99:9: Error: Setter not found: 'Func'.
+//     use(Func -= 42);
+//         ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Func = () → void;
+class C<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+  method test() → dynamic {
+    self::C<dynamic>;
+    self::use(self::C<dynamic>);
+    dynamic;
+    self::use(dynamic);
+    self::C::T;
+    self::use(self::C::T);
+    () → void;
+    self::use(() → void);
+    new self::C::•<dynamic>();
+    self::use(new self::C::•<dynamic>());
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:22:5: Error: Method not found: 'dynamic'.
+    dynamic();
+    ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:23:9: Error: Method not found: 'dynamic'.
+    use(dynamic());
+        ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:24:5: Error: Method not found: 'T'.
+    T();
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:25:9: Error: Method not found: 'T'.
+    use(T());
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:26:5: Error: Method not found: 'Func'.
+    Func();
+    ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:27:9: Error: Method not found: 'Func'.
+    use(Func());
+        ^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:29:5: Error: Setter not found: 'C'.
+    C = 42;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:30:9: Error: Setter not found: 'C'.
+    use(C = 42);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:31:5: Error: Setter not found: 'dynamic'.
+    dynamic = 42;
+    ^^^^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:32:9: Error: Setter not found: 'dynamic'.
+    use(dynamic = 42);
+        ^^^^^^^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:33:5: Error: Setter not found: 'T'.
+    T = 42;
+    ^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:34:9: Error: Setter not found: 'T'.
+    use(T = 42);
+        ^");
+    invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:35:5: Error: Setter not found: 'Func'.
+    Func = 42;
+    ^^^^";
+    self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:36:9: Error: Setter not found: 'Func'.
+    use(Func = 42);
+        ^^^^");
+    let final dynamic #t1 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:38:5: Error: Setter not found: 'C'.
+    C++;
+    ^";
+    self::use(let final dynamic #t2 = self::C<dynamic> in let final dynamic #t3 = #t2 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:39:9: Error: Setter not found: 'C'.
+    use(C++);
+        ^" in #t3);
+    let final dynamic #t5 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:40:5: Error: Setter not found: 'dynamic'.
+    dynamic++;
+    ^^^^^^^";
+    self::use(let final dynamic #t6 = dynamic in let final dynamic #t7 = #t6 in let final dynamic #t8 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:41:9: Error: Setter not found: 'dynamic'.
+    use(dynamic++);
+        ^^^^^^^" in #t7);
+    let final dynamic #t9 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:42:5: Error: Setter not found: 'T'.
+    T++;
+    ^";
+    self::use(let final dynamic #t10 = self::C::T in let final dynamic #t11 = #t10 in let final dynamic #t12 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:43:9: Error: Setter not found: 'T'.
+    use(T++);
+        ^" in #t11);
+    let final dynamic #t13 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:44:5: Error: Setter not found: 'Func'.
+    Func++;
+    ^^^^";
+    self::use(let final dynamic #t14 = () → void in let final dynamic #t15 = #t14 in let final dynamic #t16 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:45:9: Error: Setter not found: 'Func'.
+    use(Func++);
+        ^^^^" in #t15);
+    let final dynamic #t17 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:47:7: Error: Setter not found: 'C'.
+    ++C;
+      ^";
+    self::use(let final dynamic #t18 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:48:11: Error: Setter not found: 'C'.
+    use(++C);
+          ^");
+    let final dynamic #t19 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:49:7: Error: Setter not found: 'dynamic'.
+    ++dynamic;
+      ^^^^^^^";
+    self::use(let final dynamic #t20 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:50:11: Error: Setter not found: 'dynamic'.
+    use(++dynamic);
+          ^^^^^^^");
+    let final dynamic #t21 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:51:7: Error: Setter not found: 'T'.
+    ++T;
+      ^";
+    self::use(let final dynamic #t22 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:52:11: Error: Setter not found: 'T'.
+    use(++T);
+          ^");
+    let final dynamic #t23 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:53:7: Error: Setter not found: 'Func'.
+    ++Func;
+      ^^^^";
+    self::use(let final dynamic #t24 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:54:11: Error: Setter not found: 'Func'.
+    use(++Func);
+          ^^^^");
+    let final dynamic #t25 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:56:5: Error: Setter not found: 'C'.
+    C--;
+    ^";
+    self::use(let final dynamic #t26 = self::C<dynamic> in let final dynamic #t27 = #t26 in let final dynamic #t28 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:57:9: Error: Setter not found: 'C'.
+    use(C--);
+        ^" in #t27);
+    let final dynamic #t29 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:58:5: Error: Setter not found: 'dynamic'.
+    dynamic--;
+    ^^^^^^^";
+    self::use(let final dynamic #t30 = dynamic in let final dynamic #t31 = #t30 in let final dynamic #t32 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:59:9: Error: Setter not found: 'dynamic'.
+    use(dynamic--);
+        ^^^^^^^" in #t31);
+    let final dynamic #t33 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:60:5: Error: Setter not found: 'T'.
+    T--;
+    ^";
+    self::use(let final dynamic #t34 = self::C::T in let final dynamic #t35 = #t34 in let final dynamic #t36 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:61:9: Error: Setter not found: 'T'.
+    use(T--);
+        ^" in #t35);
+    let final dynamic #t37 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:62:5: Error: Setter not found: 'Func'.
+    Func--;
+    ^^^^";
+    self::use(let final dynamic #t38 = () → void in let final dynamic #t39 = #t38 in let final dynamic #t40 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:63:9: Error: Setter not found: 'Func'.
+    use(Func--);
+        ^^^^" in #t39);
+    let final dynamic #t41 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:65:7: Error: Setter not found: 'C'.
+    --C;
+      ^";
+    self::use(let final dynamic #t42 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:66:11: Error: Setter not found: 'C'.
+    use(--C);
+          ^");
+    let final dynamic #t43 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:67:7: Error: Setter not found: 'dynamic'.
+    --dynamic;
+      ^^^^^^^";
+    self::use(let final dynamic #t44 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:68:11: Error: Setter not found: 'dynamic'.
+    use(--dynamic);
+          ^^^^^^^");
+    let final dynamic #t45 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:69:7: Error: Setter not found: 'T'.
+    --T;
+      ^";
+    self::use(let final dynamic #t46 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:70:11: Error: Setter not found: 'T'.
+    use(--T);
+          ^");
+    let final dynamic #t47 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:71:7: Error: Setter not found: 'Func'.
+    --Func;
+      ^^^^";
+    self::use(let final dynamic #t48 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Setter not found: 'Func'.
+    use(--Func);
+          ^^^^");
+    let final dynamic #t49 = self::C<dynamic> in #t49.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Setter not found: 'C'.
+    C ??= 42;
+    ^" : null;
+    self::use(let final dynamic #t50 = self::C<dynamic> in let final dynamic #t51 = #t50 in #t51.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Setter not found: 'C'.
+    use(C ??= 42);
+        ^" : #t51);
+    let final dynamic #t52 = dynamic in #t52.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Setter not found: 'dynamic'.
+    dynamic ??= 42;
+    ^^^^^^^" : null;
+    self::use(let final dynamic #t53 = dynamic in let final dynamic #t54 = #t53 in #t54.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Setter not found: 'dynamic'.
+    use(dynamic ??= 42);
+        ^^^^^^^" : #t54);
+    let final dynamic #t55 = self::C::T in #t55.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Setter not found: 'T'.
+    T ??= 42;
+    ^" : null;
+    self::use(let final dynamic #t56 = self::C::T in let final dynamic #t57 = #t56 in #t57.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Setter not found: 'T'.
+    use(T ??= 42);
+        ^" : #t57);
+    let final dynamic #t58 = () → void in #t58.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Setter not found: 'Func'.
+    Func ??= 42;
+    ^^^^" : null;
+    self::use(let final dynamic #t59 = () → void in let final dynamic #t60 = #t59 in #t60.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Setter not found: 'Func'.
+    use(Func ??= 42);
+        ^^^^" : #t60);
+    let final dynamic #t61 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Setter not found: 'C'.
+    C += 42;
+    ^";
+    self::use(let final dynamic #t62 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:84:9: Error: Setter not found: 'C'.
+    use(C += 42);
+        ^");
+    let final dynamic #t63 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:85:5: Error: Setter not found: 'dynamic'.
+    dynamic += 42;
+    ^^^^^^^";
+    self::use(let final dynamic #t64 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:86:9: Error: Setter not found: 'dynamic'.
+    use(dynamic += 42);
+        ^^^^^^^");
+    let final dynamic #t65 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:87:5: Error: Setter not found: 'T'.
+    T += 42;
+    ^";
+    self::use(let final dynamic #t66 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:88:9: Error: Setter not found: 'T'.
+    use(T += 42);
+        ^");
+    let final dynamic #t67 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:89:5: Error: Setter not found: 'Func'.
+    Func += 42;
+    ^^^^";
+    self::use(let final dynamic #t68 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:90:9: Error: Setter not found: 'Func'.
+    use(Func += 42);
+        ^^^^");
+    let final dynamic #t69 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:92:5: Error: Setter not found: 'C'.
+    C -= 42;
+    ^";
+    self::use(let final dynamic #t70 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:93:9: Error: Setter not found: 'C'.
+    use(C -= 42);
+        ^");
+    let final dynamic #t71 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:94:5: Error: Setter not found: 'dynamic'.
+    dynamic -= 42;
+    ^^^^^^^";
+    self::use(let final dynamic #t72 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:95:9: Error: Setter not found: 'dynamic'.
+    use(dynamic -= 42);
+        ^^^^^^^");
+    let final dynamic #t73 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:96:5: Error: Setter not found: 'T'.
+    T -= 42;
+    ^";
+    self::use(let final dynamic #t74 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:97:9: Error: Setter not found: 'T'.
+    use(T -= 42);
+        ^");
+    let final dynamic #t75 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:98:5: Error: Setter not found: 'Func'.
+    Func -= 42;
+    ^^^^";
+    self::use(let final dynamic #t76 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:99:9: Error: Setter not found: 'Func'.
+    use(Func -= 42);
+        ^^^^");
+  }
+}
+static method use(dynamic x) → dynamic {
+  if(x.{core::Object::==}(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}))
+    throw "Shouldn't happen";
+}
+static method main() → dynamic {
+  new self::C::•<dynamic>().{self::C::test}();
+}
diff --git a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.direct.expect b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/type_with_parse_error.dart.direct.expect
rename to pkg/front_end/testcases/rasta/type_with_parse_error.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.expect b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.expect
new file mode 100644
index 0000000..fac7d19
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.expect
@@ -0,0 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/type_with_parse_error.dart:21:7: Error: Expected ';' after this.
+//   int i
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/type_with_parse_error.dart:21:7: Error: Expected ';' after this.
+//   int i
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    new self::B::•<self::A>();
+  }
+}
+class B<T extends core::Object = dynamic> extends core::Object {
+  field core::int i = null;
+  synthetic constructor •() → self::B<self::B::T>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•<self::A>();
+}
diff --git a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..b8b11cc
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/type_with_parse_error.dart:21:7: Error: Expected ';' after this.
+//   int i
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    new self::B::•<self::A>();
+  }
+}
+class B<T extends core::Object = dynamic> extends core::Object {
+  field core::int i = null;
+  synthetic constructor •() → self::B<self::B::T>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•<self::A>();
+}
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.direct.expect b/pkg/front_end/testcases/rasta/typedef.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/typedef.dart.direct.expect
rename to pkg/front_end/testcases/rasta/typedef.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
new file mode 100644
index 0000000..6a68f69
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
@@ -0,0 +1,31 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Setter not found: 'Foo'.
+//   Foo = null;
+//   ^^^
+//
+// pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Setter not found: 'Foo'.
+//   Foo ??= null;
+//   ^^^
+//
+// pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
+//   Foo();
+//   ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Foo = () → void;
+static method main() → dynamic {
+  core::print(() → void);
+  invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Setter not found: 'Foo'.
+  Foo = null;
+  ^^^";
+  let final dynamic #t1 = () → void in #t1.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Setter not found: 'Foo'.
+  Foo ??= null;
+  ^^^" : null;
+  invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
+  Foo();
+  ^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved.dart.direct.expect b/pkg/front_end/testcases/rasta/unresolved.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/unresolved.dart.direct.expect
rename to pkg/front_end/testcases/rasta/unresolved.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/unresolved.dart.strong.expect b/pkg/front_end/testcases/rasta/unresolved.dart.strong.expect
new file mode 100644
index 0000000..d596412
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved.dart.strong.expect
@@ -0,0 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unresolved.dart:6:7: Error: Method not found: 'Missing'.
+//   new Missing();
+//       ^^^^^^^
+
+library;
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved.dart:6:7: Error: Method not found: 'Missing'.
+  new Missing();
+      ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved.dart.strong.transformed.expect
new file mode 100644
index 0000000..ffc54e6
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved.dart.strong.transformed.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved.dart:6:7: Error: Method not found: 'Missing'.
+  new Missing();
+      ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.direct.expect b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/unresolved_constructor.dart.direct.expect
rename to pkg/front_end/testcases/rasta/unresolved_constructor.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.expect
new file mode 100644
index 0000000..f97fa23
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.expect
@@ -0,0 +1,30 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unresolved_constructor.dart:10:10: Error: Too few positional arguments: 2 required, 0 given.
+//   new Foo();
+//          ^
+// pkg/front_end/testcases/rasta/unresolved_constructor.dart:6:3: Context: Found this candidate, but the arguments don't match.
+//   Foo(x, y);
+//   ^
+//
+// pkg/front_end/testcases/rasta/unresolved_constructor.dart:11:11: Error: Method not found: 'Foo.notHere'.
+//   new Foo.notHere();
+//           ^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •(dynamic x, dynamic y) → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved_constructor.dart:10:10: Error: Too few positional arguments: 2 required, 0 given.
+  new Foo();
+         ^";
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved_constructor.dart:11:11: Error: Method not found: 'Foo.notHere'.
+  new Foo.notHere();
+          ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..80c63ba
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  constructor •(dynamic x, dynamic y) → self::Foo
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved_constructor.dart:10:10: Error: Too few positional arguments: 2 required, 0 given.
+  new Foo();
+         ^";
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved_constructor.dart:11:11: Error: Method not found: 'Foo.notHere'.
+  new Foo.notHere();
+          ^^^^^^^";
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
deleted file mode 100644
index 6f451c8..0000000
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.expect
+++ /dev/null
@@ -1,149 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Warning: Getter not found: 'key'.
-//       print(key);
-//             ^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Warning: Setter not found: 'key'.
-//     for (key in x) {
-//          ^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Warning: Setter not found: 'Fisk'.
-//     for (Fisk in x) {
-//          ^^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
-//       print(collection);
-//             ^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
-//     for (collection in x) {
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Warning: Setter not found: 'VoidFunction'.
-//     for (VoidFunction in x) {
-//          ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
-//     for (1 in x) {
-//          ^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Warning: Getter not found: 'key'.
-//       print(key);
-//             ^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-//     for (1 in x) {
-//          ^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Warning: Getter not found: 'key'.
-//     print(key);
-//           ^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Warning: Setter not found: 'key'.
-//   for (key in arguments) {
-//        ^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Warning: Setter not found: 'Fisk'.
-//   for (Fisk in arguments) {
-//        ^^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
-//     print(collection);
-//           ^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
-//   for (collection in arguments) {
-//        ^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Warning: Setter not found: 'VoidFunction'.
-//   for (VoidFunction in arguments) {
-//        ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
-//   for (1 in arguments) {
-//        ^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Warning: Getter not found: 'key'.
-//     print(key);
-//           ^^^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
-//   for (1 in arguments) {
-//        ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
-//     for (1 in x) {
-//          ^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
-//   for (1 in arguments) {
-//        ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef VoidFunction = () → void;
-class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
-    : super core::Object::•()
-    ;
-  method it1(dynamic x) → dynamic {
-    for (final dynamic #t1 in x) {
-      this.key = #t1;
-      core::print(this.key);
-    }
-    for (final dynamic #t2 in x) {
-      let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-      core::print(self::Fisk);
-    }
-    for (final dynamic #t3 in x) {
-      let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
-    for (collection in x) {
-         ^^^^^^^^^^";
-      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
-      print(collection);
-            ^^^^^^^^^^");
-    }
-    for (final dynamic #t4 in x) {
-      let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-      core::print(() → void);
-    }
-    for (final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-    for (1 in x) {
-         ^" in x) {
-      core::print(this.key);
-    }
-  }
-}
-static method main(dynamic arguments) → dynamic {
-  new self::Fisk::•();
-  for (final dynamic #t6 in arguments) {
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  }
-  for (final dynamic #t7 in arguments) {
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(self::Fisk);
-  }
-  for (final dynamic #t8 in arguments) {
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
-  for (collection in arguments) {
-       ^^^^^^^^^^";
-    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
-    print(collection);
-          ^^^^^^^^^^");
-  }
-  for (final dynamic #t9 in arguments) {
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(() → void);
-  }
-  for (final dynamic #t10 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
-  for (1 in arguments) {
-       ^" in arguments) {
-    core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  }
-}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect
deleted file mode 100644
index 3957542..0000000
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.direct.transformed.expect
+++ /dev/null
@@ -1,75 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
-//     for (1 in x) {
-//          ^
-//
-// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
-//   for (1 in arguments) {
-//        ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef VoidFunction = () → void;
-class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
-    : super core::Object::•()
-    ;
-  method it1(dynamic x) → dynamic {
-    for (final dynamic #t1 in x) {
-      this.key = #t1;
-      core::print(this.key);
-    }
-    for (final dynamic #t2 in x) {
-      let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-      core::print(self::Fisk);
-    }
-    for (final dynamic #t3 in x) {
-      let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
-    for (collection in x) {
-         ^^^^^^^^^^";
-      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
-      print(collection);
-            ^^^^^^^^^^");
-    }
-    for (final dynamic #t4 in x) {
-      let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-      core::print(() → void);
-    }
-    for (final dynamic #t5 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
-    for (1 in x) {
-         ^" in x) {
-      core::print(this.key);
-    }
-  }
-}
-static method main(dynamic arguments) → dynamic {
-  new self::Fisk::•();
-  for (final dynamic #t6 in arguments) {
-    let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  }
-  for (final dynamic #t7 in arguments) {
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(self::Fisk);
-  }
-  for (final dynamic #t8 in arguments) {
-    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
-  for (collection in arguments) {
-       ^^^^^^^^^^";
-    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
-    print(collection);
-          ^^^^^^^^^^");
-  }
-  for (final dynamic #t9 in arguments) {
-    let dynamic _ = null in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(() → void);
-  }
-  for (final dynamic #t10 = let dynamic _ = null in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
-  for (1 in arguments) {
-       ^" in arguments) {
-    core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  }
-}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.expect
new file mode 100644
index 0000000..907292f
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.expect
@@ -0,0 +1,163 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Warning: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Warning: Setter not found: 'key'.
+//     for (key in x) {
+//          ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Warning: Setter not found: 'Fisk'.
+//     for (Fisk in x) {
+//          ^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+//       print(collection);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+//     for (collection in x) {
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Warning: Setter not found: 'VoidFunction'.
+//     for (VoidFunction in x) {
+//          ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Warning: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Warning: Getter not found: 'key'.
+//     print(key);
+//           ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Warning: Setter not found: 'key'.
+//   for (key in arguments) {
+//        ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Warning: Setter not found: 'Fisk'.
+//   for (Fisk in arguments) {
+//        ^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+//     print(collection);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+//   for (collection in arguments) {
+//        ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Warning: Setter not found: 'VoidFunction'.
+//   for (VoidFunction in arguments) {
+//        ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Warning: Getter not found: 'key'.
+//     print(key);
+//           ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (1 in arguments) {
+//        ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef VoidFunction = () → void;
+class Fisk extends core::Object {
+  synthetic constructor •() → self::Fisk
+    : super core::Object::•()
+    ;
+  method it1(dynamic x) → dynamic {
+    for (final dynamic #t1 in x) {
+      this.key = #t1;
+      core::print(this.key);
+    }
+    for (final dynamic #t2 in x) {
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+      core::print(self::Fisk);
+    }
+    for (final dynamic #t3 in x) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+    for (collection in x) {
+         ^^^^^^^^^^";
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+      print(collection);
+            ^^^^^^^^^^");
+    }
+    for (final dynamic #t4 in x) {
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+      core::print(() → void);
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+      for (final dynamic #t5 in x) {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+        1;
+        core::print(this.key);
+      }
+    }
+  }
+}
+static method main(dynamic arguments) → dynamic {
+  new self::Fisk::•();
+  for (final dynamic #t6 in arguments) {
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  }
+  for (final dynamic #t7 in arguments) {
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    core::print(self::Fisk);
+  }
+  for (final dynamic #t8 in arguments) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+  for (collection in arguments) {
+       ^^^^^^^^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+    print(collection);
+          ^^^^^^^^^^");
+  }
+  for (final dynamic #t9 in arguments) {
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    core::print(() → void);
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+    for (final dynamic #t10 in arguments) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+      1;
+      core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4629221
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.transformed.expect
@@ -0,0 +1,89 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef VoidFunction = () → void;
+class Fisk extends core::Object {
+  synthetic constructor •() → self::Fisk
+    : super core::Object::•()
+    ;
+  method it1(dynamic x) → dynamic {
+    for (final dynamic #t1 in x) {
+      this.key = #t1;
+      core::print(this.key);
+    }
+    for (final dynamic #t2 in x) {
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+      core::print(self::Fisk);
+    }
+    for (final dynamic #t3 in x) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+    for (collection in x) {
+         ^^^^^^^^^^";
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+      print(collection);
+            ^^^^^^^^^^");
+    }
+    for (final dynamic #t4 in x) {
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+      core::print(() → void);
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+      for (final dynamic #t5 in x) {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+        1;
+        core::print(this.key);
+      }
+    }
+  }
+}
+static method main(dynamic arguments) → dynamic {
+  new self::Fisk::•();
+  for (final dynamic #t6 in arguments) {
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  }
+  for (final dynamic #t7 in arguments) {
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    core::print(self::Fisk);
+  }
+  for (final dynamic #t8 in arguments) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+  for (collection in arguments) {
+       ^^^^^^^^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+    print(collection);
+          ^^^^^^^^^^");
+  }
+  for (final dynamic #t9 in arguments) {
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    core::print(() → void);
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+    for (final dynamic #t10 in arguments) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+      1;
+      core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect
new file mode 100644
index 0000000..31ad421
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect
@@ -0,0 +1,219 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: Setter not found: 'key'.
+//     for (key in x) {
+//          ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Setter not found: 'Fisk'.
+//     for (Fisk in x) {
+//          ^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+//       print(collection);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+//     for (collection in x) {
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Setter not found: 'VoidFunction'.
+//     for (VoidFunction in x) {
+//          ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the class 'Fisk'.
+//  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
+//     for (key in x) {
+//          ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+//  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+//  - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Error: Getter not found: 'key'.
+//     print(key);
+//           ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Error: Setter not found: 'key'.
+//   for (key in arguments) {
+//        ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Setter not found: 'Fisk'.
+//   for (Fisk in arguments) {
+//        ^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+//     print(collection);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+//   for (collection in arguments) {
+//        ^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Setter not found: 'VoidFunction'.
+//   for (VoidFunction in arguments) {
+//        ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Getter not found: 'key'.
+//     print(key);
+//           ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+//   for (1 in arguments) {
+//        ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: Setter not found: 'key'.
+//     for (key in x) {
+//          ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef VoidFunction = () → void;
+class Fisk extends core::Object {
+  synthetic constructor •() → self::Fisk
+    : super core::Object::•()
+    ;
+  method it1(dynamic x) → dynamic {
+    for (final dynamic #t1 in x as{TypeError} core::Iterable<dynamic>) {
+      let final dynamic #t2 = this in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
+    for (key in x) {
+         ^^^";
+      core::print(let final dynamic #t3 = this in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+      print(key);
+            ^^^");
+    }
+    for (final dynamic #t4 in x as{TypeError} core::Iterable<dynamic>) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Setter not found: 'Fisk'.
+    for (Fisk in x) {
+         ^^^^";
+      core::print(self::Fisk);
+    }
+    for (final dynamic #t5 in x as{TypeError} core::Iterable<dynamic>) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+    for (collection in x) {
+         ^^^^^^^^^^";
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+      print(collection);
+            ^^^^^^^^^^");
+    }
+    for (final dynamic #t6 in x as{TypeError} core::Iterable<dynamic>) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Setter not found: 'VoidFunction'.
+    for (VoidFunction in x) {
+         ^^^^^^^^^^^^";
+      core::print(() → void);
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+      for (final dynamic #t7 in x as{TypeError} core::Iterable<dynamic>) {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+        1;
+        core::print(let final dynamic #t8 = this in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+      print(key);
+            ^^^");
+      }
+    }
+  }
+}
+static method main(dynamic arguments) → dynamic {
+  new self::Fisk::•();
+  for (final dynamic #t9 in arguments as{TypeError} core::Iterable<dynamic>) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Error: Setter not found: 'key'.
+  for (key in arguments) {
+       ^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Error: Getter not found: 'key'.
+    print(key);
+          ^^^");
+  }
+  for (final dynamic #t10 in arguments as{TypeError} core::Iterable<dynamic>) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Setter not found: 'Fisk'.
+  for (Fisk in arguments) {
+       ^^^^";
+    core::print(self::Fisk);
+  }
+  for (final dynamic #t11 in arguments as{TypeError} core::Iterable<dynamic>) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+  for (collection in arguments) {
+       ^^^^^^^^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+    print(collection);
+          ^^^^^^^^^^");
+  }
+  for (final dynamic #t12 in arguments as{TypeError} core::Iterable<dynamic>) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Setter not found: 'VoidFunction'.
+  for (VoidFunction in arguments) {
+       ^^^^^^^^^^^^";
+    core::print(() → void);
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+    for (final dynamic #t13 in arguments as{TypeError} core::Iterable<dynamic>) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+      1;
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Getter not found: 'key'.
+    print(key);
+          ^^^");
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
new file mode 100644
index 0000000..9316b38
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
@@ -0,0 +1,127 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: Setter not found: 'key'.
+//     for (key in x) {
+//          ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Expected an identifier, but got '1'.
+//     for (1 in x) {
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: Getter not found: 'key'.
+//       print(key);
+//             ^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Expected an identifier, but got '1'.
+//   for (1 in arguments) {
+//        ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef VoidFunction = () → void;
+class Fisk extends core::Object {
+  synthetic constructor •() → self::Fisk
+    : super core::Object::•()
+    ;
+  method it1(dynamic x) → dynamic {
+    for (final dynamic #t1 in x as{TypeError} core::Iterable<dynamic>) {
+      let final self::Fisk #t2 = this in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
+    for (key in x) {
+         ^^^";
+      core::print(let final self::Fisk #t3 = this in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+      print(key);
+            ^^^");
+    }
+    for (final dynamic #t4 in x as{TypeError} core::Iterable<dynamic>) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Setter not found: 'Fisk'.
+    for (Fisk in x) {
+         ^^^^";
+      core::print(self::Fisk);
+    }
+    for (final dynamic #t5 in x as{TypeError} core::Iterable<dynamic>) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
+    for (collection in x) {
+         ^^^^^^^^^^";
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:18:13: Error: A prefix can't be used as an expression.
+      print(collection);
+            ^^^^^^^^^^");
+    }
+    for (final dynamic #t6 in x as{TypeError} core::Iterable<dynamic>) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Setter not found: 'VoidFunction'.
+    for (VoidFunction in x) {
+         ^^^^^^^^^^^^";
+      core::print(() → void);
+    }
+    {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+      for (final dynamic #t7 in x as{TypeError} core::Iterable<dynamic>) {
+        invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
+    for (1 in x) {
+         ^";
+        1;
+        core::print(let final self::Fisk #t8 = this in invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the class 'Fisk'.
+ - 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
+      print(key);
+            ^^^");
+      }
+    }
+  }
+}
+static method main(dynamic arguments) → dynamic {
+  new self::Fisk::•();
+  for (final dynamic #t9 in arguments as{TypeError} core::Iterable<dynamic>) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:31:8: Error: Setter not found: 'key'.
+  for (key in arguments) {
+       ^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:32:11: Error: Getter not found: 'key'.
+    print(key);
+          ^^^");
+  }
+  for (final dynamic #t10 in arguments as{TypeError} core::Iterable<dynamic>) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Setter not found: 'Fisk'.
+  for (Fisk in arguments) {
+       ^^^^";
+    core::print(self::Fisk);
+  }
+  for (final dynamic #t11 in arguments as{TypeError} core::Iterable<dynamic>) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
+  for (collection in arguments) {
+       ^^^^^^^^^^";
+    core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:38:11: Error: A prefix can't be used as an expression.
+    print(collection);
+          ^^^^^^^^^^");
+  }
+  for (final dynamic #t12 in arguments as{TypeError} core::Iterable<dynamic>) {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Setter not found: 'VoidFunction'.
+  for (VoidFunction in arguments) {
+       ^^^^^^^^^^^^";
+    core::print(() → void);
+  }
+  {
+    invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+    for (final dynamic #t13 in arguments as{TypeError} core::Iterable<dynamic>) {
+      invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
+  for (1 in arguments) {
+       ^";
+      1;
+      core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Getter not found: 'key'.
+    print(key);
+          ^^^");
+    }
+  }
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.direct.expect b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/unresolved_recovery.dart.direct.expect
rename to pkg/front_end/testcases/rasta/unresolved_recovery.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.strong.expect b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.strong.expect
new file mode 100644
index 0000000..77aeb40
--- /dev/null
+++ b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.strong.expect
@@ -0,0 +1,101 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:7:10: Error: Superclass has no method named '[]='.
+//     super[4] = 42;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]'.
+//     super[4] += 5;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
+//     super[4] += 5;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
+//     return super[2];
+//                 ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:3: Error: 'on' isn't a type.
+//   on Exception catch (e) { }
+//   ^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:6: Error: Expected ';' after this.
+//   on Exception catch (e) { }
+//      ^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:16: Error: Expected an identifier, but got 'catch'.
+//   on Exception catch (e) { }
+//                ^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:23: Error: Getter not found: 'e'.
+//   on Exception catch (e) { }
+//                       ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:16: Error: Method not found: 'catch'.
+//   on Exception catch (e) { }
+//                ^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:24: Error: Expected ';' after this.
+//   on Exception catch (e) { }
+//                        ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:7:10: Error: Superclass has no method named '[]='.
+//     super[4] = 42;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]'.
+//     super[4] += 5;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:8:10: Error: Superclass has no method named '[]='.
+//     super[4] += 5;
+//          ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:9:17: Error: Superclass has no method named '[]'.
+//     return super[2];
+//                 ^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:3: Error: 'on' isn't a type.
+//   on Exception catch (e) { }
+//   ^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:6: Error: Expected ';' after this.
+//   on Exception catch (e) { }
+//      ^^^^^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:16: Error: Expected an identifier, but got 'catch'.
+//   on Exception catch (e) { }
+//                ^^^^^
+//
+// pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:24: Error: Expected ';' after this.
+//   on Exception catch (e) { }
+//                        ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class E extends core::Object {
+  synthetic constructor •() → self::E
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    super.[]=(4, 42);
+    let final core::int #t1 = 4 in super.[]=(#t1, super.[](#t1).+(5));
+    return super.[](2);
+  }
+}
+static method beforeTestMissingTry() → dynamic {
+  self::testMissingTry();
+}
+static method testMissingTry() → dynamic {
+  invalid-type Exception;
+  invalid-expression "pkg/front_end/testcases/rasta/unresolved_recovery.dart:20:16: Error: Method not found: 'catch'.
+  on Exception catch (e) { }
+               ^^^^^";
+  {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.expect b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.expect
rename to pkg/front_end/testcases/rasta/unsupported_platform_library.dart.legacy.expect
diff --git a/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.transformed.expect b/pkg/front_end/testcases/rasta/unsupported_platform_library.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/rasta/unsupported_platform_library.dart.direct.transformed.expect
rename to pkg/front_end/testcases/rasta/unsupported_platform_library.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.direct.expect b/pkg/front_end/testcases/redirecting_constructor.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_constructor.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_constructor.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_constructor.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_constructor.dart.direct.transformed.expect
rename to pkg/front_end/testcases/redirecting_constructor.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.direct.expect b/pkg/front_end/testcases/redirecting_constructor.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/redirecting_constructor.dart.direct.expect
copy to pkg/front_end/testcases/redirecting_constructor.dart.strong.expect
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..5376db1
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_constructor.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
+  constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static factory fisk() → self::A
+    let<BottomType> #redirecting_factory = self::B::• in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_factory.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory.dart.strong.expect
index 5471c7c..bcf4fb8 100644
--- a/pkg/front_end/testcases/redirecting_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_factory.dart.strong.expect
@@ -1,37 +1,76 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+//  - 'Foo' is from 'pkg/front_end/testcases/redirecting_factory.dart'.
+//  - 'FooBase' is from 'pkg/front_end/testcases/redirecting_factory.dart'.
+//   factory FooBase(int x) = Foo<Tf>;
+//                            ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+//  - 'Foo' is from 'pkg/front_end/testcases/redirecting_factory.dart'.
+//  - 'FooBase' is from 'pkg/front_end/testcases/redirecting_factory.dart'.
+//   factory FooBase(int x) = Foo<Tf>;
+//                            ^
+
 library;
 import self as self;
 import "dart:core" as core;
 
-abstract class FooBase<Tf extends core::Object> extends core::Object {
+abstract class FooBase<Tf extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::FooBase::•];
   abstract get x() → core::int;
+  static factory •<Tf extends core::Object = dynamic>(core::int x) → self::FooBase<self::FooBase::•::Tf>
+    let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf #typeArg0 = null in invalid-expression;
 }
-abstract class Foo<T extends core::Object> extends core::Object implements self::FooBase<dynamic> {
+abstract class Foo<T extends core::Object = dynamic> extends core::Object implements self::FooBase<dynamic> {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static factory •<T extends core::Object = dynamic>(core::int x) → self::Foo<self::Foo::•::T>
+    let dynamic #redirecting_factory = self::Bar::• in let core::String #typeArg0 = null in let self::Foo::•::T #typeArg1 = null in invalid-expression;
 }
-class Bar<Sb extends core::Object, Tb extends core::Object> extends core::Object implements self::Foo<self::Bar::Tb> {
+class Bar<Sb extends core::Object = dynamic, Tb extends core::Object = dynamic> extends core::Object implements self::Foo<self::Bar::Tb> {
   field core::int x;
-  constructor •(core::int x) → void
+  constructor •(core::int x) → self::Bar<self::Bar::Sb, self::Bar::Tb>
     : self::Bar::x = x, super core::Object::•() {
     core::print("Bar<${self::Bar::Sb},${self::Bar::Tb}>");
   }
 }
-abstract class SimpleCase<A extends core::Object, B extends core::Object> extends core::Object {
+class Builder<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Builder<self::Builder::X>
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    return new self::Bar::•<core::String, self::Builder::X>(4);
+  }
 }
-abstract class SimpleCaseImpl<Ai extends core::Object, Bi extends core::Object> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai, self::SimpleCaseImpl::Bi> {
+class SimpleCase<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
+  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
+    let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A #typeArg0 = null in let self::SimpleCase::•::B #typeArg1 = null in invalid-expression;
 }
-class SimpleCaseImpl2<Ai2 extends core::Object, Bi2 extends core::Object> extends core::Object implements self::SimpleCaseImpl<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2> {
-  constructor •() → void
+class SimpleCaseImpl<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai, self::SimpleCaseImpl::Bi> {
+  static field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
+  static factory •<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
+    let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai #typeArg0 = null in let self::SimpleCaseImpl::•::Bi #typeArg1 = null in invalid-expression;
+}
+class SimpleCaseImpl2<Ai2 extends core::Object = dynamic, Bi2 extends core::Object = dynamic> extends core::Object implements self::SimpleCaseImpl<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2> {
+  synthetic constructor •() → self::SimpleCaseImpl2<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2>
     : super core::Object::•()
     ;
 }
-abstract class Base<M extends core::Object> extends core::Object {
-  constructor •() → void
+class Base<M extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Base<self::Base::M>
     : super core::Object::•()
     ;
 }
-abstract class Mixin<M extends core::Object> extends core::Object {
+class Mixin<M extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Mixin<self::Mixin::M>
+    : super core::Object::•()
+    ;
 }
-class Mix<M extends core::Object> extends self::Base<self::Mix::M> implements self::Mixin<self::Mix::M> {
-  constructor •() → void
+class Mix<M extends core::Object = dynamic> = self::Base<self::Mix::M> with self::Mixin<self::Mix::M> {
+  synthetic constructor •() → self::Mix<self::Mix::M>
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory.dart.strong.transformed.expect
new file mode 100644
index 0000000..4885beb
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory.dart.strong.transformed.expect
@@ -0,0 +1,73 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/redirecting_factory.dart:7:28: Error: The constructor function type 'Foo<Tf> Function(int)' isn't a subtype of 'FooBase<Tf> Function(int)'.
+//  - 'Foo' is from 'pkg/front_end/testcases/redirecting_factory.dart'.
+//  - 'FooBase' is from 'pkg/front_end/testcases/redirecting_factory.dart'.
+//   factory FooBase(int x) = Foo<Tf>;
+//                            ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class FooBase<Tf extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::FooBase::•];
+  abstract get x() → core::int;
+  static factory •<Tf extends core::Object = dynamic>(core::int x) → self::FooBase<self::FooBase::•::Tf>
+    let <T extends core::Object = dynamic>(core::int) → self::Foo<self::Foo::•::T> #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf #typeArg0 = null in invalid-expression;
+}
+abstract class Foo<T extends core::Object = dynamic> extends core::Object implements self::FooBase<dynamic> {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static factory •<T extends core::Object = dynamic>(core::int x) → self::Foo<self::Foo::•::T>
+    let<BottomType> #redirecting_factory = self::Bar::• in let core::String #typeArg0 = null in let self::Foo::•::T #typeArg1 = null in invalid-expression;
+}
+class Bar<Sb extends core::Object = dynamic, Tb extends core::Object = dynamic> extends core::Object implements self::Foo<self::Bar::Tb> {
+  field core::int x;
+  constructor •(core::int x) → self::Bar<self::Bar::Sb, self::Bar::Tb>
+    : self::Bar::x = x, super core::Object::•() {
+    core::print("Bar<${self::Bar::Sb},${self::Bar::Tb}>");
+  }
+}
+class Builder<X extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Builder<self::Builder::X>
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    return new self::Bar::•<core::String, self::Builder::X>(4);
+  }
+}
+class SimpleCase<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
+  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
+    let <Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi> #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A #typeArg0 = null in let self::SimpleCase::•::B #typeArg1 = null in invalid-expression;
+}
+class SimpleCaseImpl<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic> extends core::Object implements self::SimpleCase<self::SimpleCaseImpl::Ai, self::SimpleCaseImpl::Bi> {
+  static field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
+  static factory •<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
+    let<BottomType> #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai #typeArg0 = null in let self::SimpleCaseImpl::•::Bi #typeArg1 = null in invalid-expression;
+}
+class SimpleCaseImpl2<Ai2 extends core::Object = dynamic, Bi2 extends core::Object = dynamic> extends core::Object implements self::SimpleCaseImpl<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2> {
+  synthetic constructor •() → self::SimpleCaseImpl2<self::SimpleCaseImpl2::Ai2, self::SimpleCaseImpl2::Bi2>
+    : super core::Object::•()
+    ;
+}
+class Base<M extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Base<self::Base::M>
+    : super core::Object::•()
+    ;
+}
+class Mixin<M extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::Mixin<self::Mixin::M>
+    : super core::Object::•()
+    ;
+}
+class Mix<M extends core::Object = dynamic> extends self::Base<self::Mix::M> implements self::Mixin<self::Mix::M> {
+  synthetic constructor •() → self::Mix<self::Mix::M>
+    : super self::Base::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::Bar::•<core::String, core::double>(4).{self::FooBase::x});
+  new self::SimpleCaseImpl2::•<core::int, core::double>();
+  new self::Mix::•<core::double>();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_chain_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_chain_test.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_factory_chain_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.expect
index fb200fc..1e1549a 100644
--- a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.expect
@@ -3,11 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
+  constructor •() → self::A
     : super core::Object::•()
     ;
-  redirecting_factory first() = self::A::•;
-  redirecting_factory second() = self::A::first;
+  static factory first() → self::A
+    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+  static factory second() → self::A
+    let dynamic #redirecting_factory = self::A::first in invalid-expression;
 }
 static method main() → dynamic {
   new self::A::•();
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..eba9d32
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library redirecting_factory_constructors.chain_test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
+  constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static factory first() → self::A
+    let<BottomType> #redirecting_factory = self::A::• in invalid-expression;
+  static factory second() → self::A
+    let () → self::A #redirecting_factory = self::A::first in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_const_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_metadata.dart.direct.transformed.expect
rename to pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_simple_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_simple_test.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_factory_simple_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.expect
index 2ea9699..45ed39e 100644
--- a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.expect
@@ -3,10 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A
     : super core::Object::•()
     ;
-  redirecting_factory redir() = self::A::•;
+  static factory redir() → self::A
+    let dynamic #redirecting_factory = self::A::• in invalid-expression;
 }
 static method main() → dynamic {
   new self::A::•();
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..f34fced
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library redirecting_factory_constructors.simple_test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static factory redir() → self::A
+    let<BottomType> #redirecting_factory = self::A::• in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.expect
index 9c67c20..3c6fa9b 100644
--- a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.expect
@@ -3,23 +3,25 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     : super self::X::•()
     ;
 }
 class A extends core::Object {
-  constructor •() → void
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A
     : super core::Object::•()
     ;
-  redirecting_factory redir() = self::B::•<self::Y>;
+  static factory redir() → self::A
+    let dynamic #redirecting_factory = self::B::• in let self::Y #typeArg0 = null in invalid-expression;
 }
-class B<T extends self::X> extends self::A {
-  constructor •() → void
+class B<T extends self::X = self::X> extends self::A {
+  constructor •() → self::B<self::B::T>
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..75b7a4f
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library redirecting_factory_constructors.typeargs_test;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+class Y extends self::X {
+  synthetic constructor •() → self::Y
+    : super self::X::•()
+    ;
+}
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A
+    : super core::Object::•()
+    ;
+  static factory redir() → self::A
+    let<BottomType> #redirecting_factory = self::B::• in let self::Y #typeArg0 = null in invalid-expression;
+}
+class B<T extends self::X = self::X> extends self::A {
+  constructor •() → self::B<self::B::T>
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•<self::Y>();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.expect
index 8e10422..e36afbb 100644
--- a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.expect
@@ -2,11 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object, S extends core::Object> extends core::Object {
-  constructor •(self::A::T t, self::A::S s) → void
+class A<T extends core::Object = dynamic, S extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •(self::A::T t, self::A::S s) → self::A<self::A::T, self::A::S>
     : super core::Object::•()
     ;
-  redirecting_factory redir<T extends core::Object, S extends core::Object>(T t, S s) = self::A::•<T, S>;
+  static factory redir<T extends core::Object = dynamic, S extends core::Object = dynamic>(self::A::redir::T t, self::A::redir::S s) → self::A<self::A::redir::T, self::A::redir::S>
+    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T #typeArg0 = null in let self::A::redir::S #typeArg1 = null in invalid-expression;
 }
 static method main() → dynamic {
   new self::A::•<core::int, core::String>(42, "foobar");
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..d9346de
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library redirecting_factory_constructors.typeparam_test;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object = dynamic, S extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •(self::A::T t, self::A::S s) → self::A<self::A::T, self::A::S>
+    : super core::Object::•()
+    ;
+  static factory redir<T extends core::Object = dynamic, S extends core::Object = dynamic>(self::A::redir::T t, self::A::redir::S s) → self::A<self::A::redir::T, self::A::redir::S>
+    let<BottomType> #redirecting_factory = self::A::• in let self::A::redir::T #typeArg0 = null in let self::A::redir::S #typeArg1 = null in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•<core::int, core::String>(42, "foobar");
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.expect
index 278afdd..780300b 100644
--- a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.expect
@@ -3,20 +3,22 @@
 import "dart:core" as core;
 
 class X extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::X
     : super core::Object::•()
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Y
     : super self::X::•()
     ;
 }
-class A<T extends core::Object, S extends self::A::T> extends core::Object {
-  constructor •(self::A::T t, self::A::S s) → void
+class A<T extends core::Object = dynamic, S extends self::A::T = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •(self::A::T t, self::A::S s) → self::A<self::A::T, self::A::S>
     : super core::Object::•()
     ;
-  redirecting_factory redir<T extends core::Object, S extends T>(T t, S s) = self::A::•<T, S>;
+  static factory redir<T extends core::Object = dynamic, S extends self::A::redir::T = dynamic>(self::A::redir::T t, self::A::redir::S s) → self::A<self::A::redir::T, self::A::redir::S>
+    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T #typeArg0 = null in let self::A::redir::S #typeArg1 = null in invalid-expression;
 }
 static method main() → dynamic {
   new self::A::•<self::X, self::Y>(new self::X::•(), new self::Y::•());
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..7d68623
--- /dev/null
+++ b/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library redirecting_factory_constructors.typeparambounds_test;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+class Y extends self::X {
+  synthetic constructor •() → self::Y
+    : super self::X::•()
+    ;
+}
+class A<T extends core::Object = dynamic, S extends self::A::T = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •(self::A::T t, self::A::S s) → self::A<self::A::T, self::A::S>
+    : super core::Object::•()
+    ;
+  static factory redir<T extends core::Object = dynamic, S extends self::A::redir::T = dynamic>(self::A::redir::T t, self::A::redir::S s) → self::A<self::A::redir::T, self::A::redir::S>
+    let<BottomType> #redirecting_factory = self::A::• in let self::A::redir::T #typeArg0 = null in let self::A::redir::S #typeArg1 = null in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•<self::X, self::Y>(new self::X::•(), new self::Y::•());
+}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.direct.transformed.expect
rename to pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.expect
rename to pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.direct.transformed.expect
rename to pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
index 544de0c..3a358ad 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type '#lib1::Foo::T'.
-// Try changing the type of the parameter, or casting the argument to '#lib1::Foo::T'.
+// pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
+// Try changing the type of the parameter, or casting the argument to 'T'.
 //   Foo.from(String _init) : this._internal(x: _init);
 //                                              ^
 
@@ -12,8 +12,8 @@
 class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type '#lib1::Foo::T'.
-Try changing the type of the parameter, or casting the argument to '#lib1::Foo::T'.
+    : this self::Foo::_internal(x: let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
+Try changing the type of the parameter, or casting the argument to 'T'.
   Foo.from(String _init) : this._internal(x: _init);
                                              ^" in _init as{TypeError} <BottomType>)
     ;
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
index cbad080..4a7fde2 100644
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
@@ -5,8 +5,8 @@
 class Foo<T extends core::Object = dynamic> extends core::Object {
   generic-covariant-impl field self::Foo::T x;
   constructor from(core::String _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'dart.core::String' can't be assigned to the parameter type '#lib1::Foo::T'.
-Try changing the type of the parameter, or casting the argument to '#lib1::Foo::T'.
+    : this self::Foo::_internal(x: let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
+Try changing the type of the parameter, or casting the argument to 'T'.
   Foo.from(String _init) : this._internal(x: _init);
                                              ^" in _init as{TypeError} <BottomType>)
     ;
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.expect
rename to pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/redirection_chain_type_arguments.dart.direct.transformed.expect
rename to pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.expect
rename to pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.transformed.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.direct.transformed.expect
rename to pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirection_type_arguments.dart.direct.expect
rename to pkg/front_end/testcases/redirection_type_arguments.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/redirection_type_arguments.dart.direct.transformed.expect
rename to pkg/front_end/testcases/redirection_type_arguments.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29937.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29937.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29937.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29937.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29937.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29940.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29940.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29940.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29940.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29940.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29940.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29941.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29941.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29941.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29941.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29941.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29941.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29942.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29942.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29942.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29942.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29942.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29943.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29943.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29943.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29943.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29943.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29943.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29943.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29943.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29944.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29944.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29944.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29944.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29944.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29944.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29945.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29945.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29945.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29945.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29945.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29945.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29945.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29975.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29975.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29975.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
index 2d292e2..93d444f 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
@@ -1,6 +1,15 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: 'F' is already declared in this scope.
+// typedef void F();
+//              ^
+// pkg/front_end/testcases/regress/issue_29975.dart:5:14: Context: Previous declaration of 'F'.
+// typedef void F();
+//              ^
+
 // Unhandled errors:
 //
-// pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: Duplicated definition of 'F'.
+// pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: 'F' is already declared in this scope.
 // typedef void F();
 //              ^
 
@@ -8,5 +17,4 @@
 import self as self;
 
 typedef F = () → void;
-typedef F = () → void;
 static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29975.dart.strong.transformed.expect
new file mode 100644
index 0000000..6dc716b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.strong.transformed.expect
@@ -0,0 +1,11 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29975.dart:6:14: Error: 'F' is already declared in this scope.
+// typedef void F();
+//              ^
+
+library;
+import self as self;
+
+typedef F = () → void;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
deleted file mode 100644
index 2ed84b8..0000000
--- a/pkg/front_end/testcases/regress/issue_29976.dart.direct.expect
+++ /dev/null
@@ -1,79 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//     "x${x*"'"é'}x
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
-//     "x${x*"'"é'}x
-//               ^^^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
-//     "x${x*"'"é'}x
-//       ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:5: Error: String starting with " must end with ".
-//     "x${x*"'"é'}x
-//     ^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
-//     "x${x*"'"é'}x
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
-//   )
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Warning: Method not found: 'f'.
-//   f(
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
-//   )
-//   ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//     "x${x*"'"é'}x
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
-//     "x${x*"'"é'}x
-//               ^^^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
-//     "x${x*"'"é'}x
-//       ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:5: Error: String starting with " must end with ".
-//     "x${x*"'"é'}x
-//     ^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
-//     "x${x*"'"é'}x
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
-//   )
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
-//   )
-//   ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static get x() → dynamic
-  return null;
-static method main() → void {
-  let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect
deleted file mode 100644
index adcec4e..0000000
--- a/pkg/front_end/testcases/regress/issue_29976.dart.direct.transformed.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//     "x${x*"'"é'}x
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
-//     "x${x*"'"é'}x
-//               ^^^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
-//     "x${x*"'"é'}x
-//       ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:5: Error: String starting with " must end with ".
-//     "x${x*"'"é'}x
-//     ^^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
-//     "x${x*"'"é'}x
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
-//   )
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
-//   )
-//   ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static get x() → dynamic
-  return null;
-static method main() → void {
-  let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29976.dart.legacy.expect
new file mode 100644
index 0000000..f434e4b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.legacy.expect
@@ -0,0 +1,79 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^^^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:5: Error: String starting with " must end with ".
+//     "x${x*"'"é'}x
+//     ^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:8:3: Warning: Method not found: 'f'.
+//   f(
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
+//   )
+//   ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^^^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:5: Error: String starting with " must end with ".
+//     "x${x*"'"é'}x
+//     ^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
+//   )
+//   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static get x() → dynamic
+  return null;
+static method main() → void {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29976.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ea4c4a8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:15: Error: String starting with ' must end with '.
+//     "x${x*"'"é'}x
+//               ^^^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:7: Error: Can't find '}' to match '${'.
+//     "x${x*"'"é'}x
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:5: Error: String starting with " must end with ".
+//     "x${x*"'"é'}x
+//     ^^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:12:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:9:14: Error: Expected '}' before this.
+//     "x${x*"'"é'}x
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected a String, but got ')'.
+//   )
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29976.dart:10:3: Error: Expected ';' after this.
+//   )
+//   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static get x() → dynamic
+  return null;
+static method main() → void {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29977.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29977.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29977.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29977.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29977.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29977.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29978.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29978.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29978.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29978.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29978.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29979.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29979.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29979.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29979.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29979.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29980.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29980.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29980.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29980.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29980.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29980.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29980.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29981.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29981.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29981.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29981.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29981.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29981.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29982.dart.direct.expect
deleted file mode 100644
index 3828528..0000000
--- a/pkg/front_end/testcases/regress/issue_29982.dart.direct.expect
+++ /dev/null
@@ -1,78 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//   print('${eh[éh']}');
-//               ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
-//   print('${eh[éh']}');
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
-//   print('${eh[éh']}');
-//          ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:11: Error: String starting with ' must end with '.
-//   print('${eh[éh']}');
-//           ^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
-//   print('${eh[éh']}');
-//                 ^^^^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Warning: Getter not found: 'éh'.
-//   print('${eh[éh']}');
-//               ^^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
-//   print('${eh[éh']}');
-//                 ^^^^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
-//   print('${eh[éh']}');
-//                     ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//   print('${eh[éh']}');
-//               ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
-//   print('${eh[éh']}');
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
-//   print('${eh[éh']}');
-//          ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:11: Error: String starting with ' must end with '.
-//   print('${eh[éh']}');
-//           ^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
-//   print('${eh[éh']}');
-//                 ^^^^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
-//   print('${eh[éh']}');
-//                 ^^^^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
-//   print('${eh[éh']}');
-//                     ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  dynamic eh = <dynamic, dynamic>{"\u0233h": "\u0233h"};
-  core::print("${eh.[](let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
-}
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29982.dart.direct.transformed.expect
deleted file mode 100644
index 11a5695..0000000
--- a/pkg/front_end/testcases/regress/issue_29982.dart.direct.transformed.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//   print('${eh[éh']}');
-//               ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
-//   print('${eh[éh']}');
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
-//   print('${eh[éh']}');
-//          ^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:11: Error: String starting with ' must end with '.
-//   print('${eh[éh']}');
-//           ^^^^^^^^^^^^^...
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
-//   print('${eh[éh']}');
-//                 ^^^^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
-//   print('${eh[éh']}');
-//                 ^^^^
-//
-// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
-//   print('${eh[éh']}');
-//                     ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  dynamic eh = <dynamic, dynamic>{"\u0233h": "\u0233h"};
-  core::print("${eh.[](let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
-}
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29982.dart.legacy.expect
new file mode 100644
index 0000000..e361b02
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.legacy.expect
@@ -0,0 +1,78 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:11: Error: String starting with ' must end with '.
+//   print('${eh[éh']}');
+//           ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Warning: Getter not found: 'éh'.
+//   print('${eh[éh']}');
+//               ^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:11: Error: String starting with ' must end with '.
+//   print('${eh[éh']}');
+//           ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  dynamic eh = <dynamic, dynamic>{"\u0233h": "\u0233h"};
+  core::print("${eh.[](throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29982.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f419a37
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.legacy.transformed.expect
@@ -0,0 +1,41 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:15: Error: The non-ASCII character 'é' (U+00E9) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   print('${eh[éh']}');
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:14: Error: Can't find ']' to match '['.
+//   print('${eh[éh']}');
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:10: Error: Can't find '}' to match '${'.
+//   print('${eh[éh']}');
+//          ^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:11: Error: String starting with ' must end with '.
+//   print('${eh[éh']}');
+//           ^^^^^^^^^^^^^...
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:9:1: Error: Expected a declaration, but got ''.
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected ']' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:17: Error: Expected '}' before this.
+//   print('${eh[éh']}');
+//                 ^^^^
+//
+// pkg/front_end/testcases/regress/issue_29982.dart:7:21: Error: Expected a String, but got ')'.
+//   print('${eh[éh']}');
+//                     ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  dynamic eh = <dynamic, dynamic>{"\u0233h": "\u0233h"};
+  core::print("${eh.[](throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
+}
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29983.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29983.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29983.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29983.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29983.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29983.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
deleted file mode 100644
index b932140..0000000
--- a/pkg/front_end/testcases/regress/issue_29984.dart.direct.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Warning: Getter not found: 'i'.
-//   for (int i = i;; false) {}
-//                ^
-//
-// pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
-//   for (int i = i;; false) {}
-//            ^
-// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Context: Previous use of 'i'.
-//   for (int i = i;; false) {}
-//                ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method bad() → dynamic {
-  for (core::int i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
-  for (int i = i;; false) {}
-           ^" in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))); ; false) {
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29984.dart.direct.transformed.expect
deleted file mode 100644
index cf64ae4..0000000
--- a/pkg/front_end/testcases/regress/issue_29984.dart.direct.transformed.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method bad() → dynamic {
-  for (core::int i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
-  for (int i = i;; false) {}
-           ^" in let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))); ; false) {
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29984.dart.legacy.expect
new file mode 100644
index 0000000..b8e39cc
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.legacy.expect
@@ -0,0 +1,24 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Warning: Getter not found: 'i'.
+//   for (int i = i;; false) {}
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
+//   for (int i = i;; false) {}
+//            ^
+// pkg/front_end/testcases/regress/issue_29984.dart:6:16: Context: Previous use of 'i'.
+//   for (int i = i;; false) {}
+//                ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method bad() → dynamic {
+  for (core::int i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
+  for (int i = i;; false) {}
+           ^" in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))); ; false) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29984.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8b75d05
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.legacy.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method bad() → dynamic {
+  for (core::int i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_29984.dart:6:12: Error: Can't declare 'i' because it was already used in this scope.
+  for (int i = i;; false) {}
+           ^" in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))); ; false) {
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
deleted file mode 100644
index 1e02c8b..0000000
--- a/pkg/front_end/testcases/regress/issue_29985.dart.direct.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//   🔛
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
-//   🔛
-//   ^^
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Warning: Getter not found: '🔛'.
-//   🔛
-//   ^^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//   🔛
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
-//   🔛
-//   ^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method bad() → dynamic {
-  let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect
deleted file mode 100644
index 0f35dbc..0000000
--- a/pkg/front_end/testcases/regress/issue_29985.dart.direct.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
-// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
-//   🔛
-//   ^
-//
-// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
-//   🔛
-//   ^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method bad() → dynamic {
-  let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29985.dart.legacy.expect
new file mode 100644
index 0000000..d6e6130
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.legacy.expect
@@ -0,0 +1,34 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Warning: Getter not found: '🔛'.
+//   🔛
+//   ^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method bad() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29985.dart.legacy.transformed.expect
new file mode 100644
index 0000000..52f90dd
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: The non-ASCII character '🔛' (U+1F51B) can't be used in identifiers, only in strings and comments.
+// Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign).
+//   🔛
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_29985.dart:6:3: Error: Expected ';' after this.
+//   🔛
+//   ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method bad() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29986.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29986.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29986.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29986.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29986.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29986.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.direct.expect b/pkg/front_end/testcases/regress/issue_29987.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29987.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_29987.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_29987.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_29987.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_29987.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30834.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30834.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_30834.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30834.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30834.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_30834.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30836.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30836.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_30836.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30836.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30836.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_30836.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30838.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30838.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_30838.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30838.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_30838.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30981.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30981.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_30981.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30981.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30981.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_30981.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.direct.expect b/pkg/front_end/testcases/regress/issue_30994.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30994.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_30994.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_30994.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_30994.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_30994.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31155.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31155.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
index a817905..6eb5512 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -22,7 +22,8 @@
 //   var f = Map<A, B> {};
 //                       ^
 //
-// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+// pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
 // Try correcting the name to the name of an existing method, or defining a method named '<'.
 //   var f = Map<A, B> {};
 //              ^
@@ -66,7 +67,8 @@
     ;
 }
 class C extends core::Object {
-  field dynamic f = let final dynamic #t1 = core::Map<dynamic, dynamic> in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+  field dynamic f = let final dynamic #t1 = core::Map<dynamic, dynamic> in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named '<'.
   var f = Map<A, B> {};
              ^";
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
index eaf1b91..acf1ad1 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -37,7 +37,8 @@
     ;
 }
 class C extends core::Object {
-  field dynamic f = let final core::Type #t1 = core::Map<dynamic, dynamic> in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+  field dynamic f = let final core::Type #t1 = core::Map<dynamic, dynamic> in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named '<'.
   var f = Map<A, B> {};
              ^";
diff --git a/pkg/front_end/testcases/regress/issue_31157.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31157.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31157.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31157.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31157.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31157.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31157.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31157.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
deleted file mode 100644
index f3cb890..0000000
--- a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
-// typedef F = Map<String, dynamic> Function();
-// ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
-// typedef F = Map<String, dynamic> Function();
-// ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
-// typedef T =
-//           ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
-// typedef F = Map<String, dynamic> Function();
-// ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
-// typedef F = Map<String, dynamic> Function();
-// ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
-// typedef T = 
-//           ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef T = dynamic;
-typedef F = () → core::Map<core::String, dynamic>;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
deleted file mode 100644
index f86e25c4..0000000
--- a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
-// typedef F = Map<String, dynamic> Function();
-// ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
-// typedef F = Map<String, dynamic> Function();
-// ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
-// typedef T = 
-//           ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef T = dynamic;
-typedef F = () → core::Map<core::String, dynamic>;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31171.dart.legacy.expect
new file mode 100644
index 0000000..54e067f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.legacy.expect
@@ -0,0 +1,35 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T =
+//           ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T = 
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = invalid-type;
+typedef F = () → core::Map<core::String, dynamic>;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ad9b787
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.legacy.transformed.expect
@@ -0,0 +1,21 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' after this.
+// typedef F = Map<String, dynamic> Function();
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// typedef T = 
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = invalid-type;
+typedef F = () → core::Map<core::String, dynamic>;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
index b3c6998..772c92d 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
@@ -16,7 +16,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef T = dynamic;
+typedef T = invalid-type;
 typedef F = () → core::Map<core::String, dynamic>;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
index f3cb890..54e067f 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
@@ -30,6 +30,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef T = dynamic;
+typedef T = invalid-type;
 typedef F = () → core::Map<core::String, dynamic>;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
index f86e25c4..ad9b787 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
@@ -16,6 +16,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef T = dynamic;
+typedef T = invalid-type;
 typedef F = () → core::Map<core::String, dynamic>;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31180.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31180.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31180.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31180.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31180.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31180.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31180.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31181.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31181.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31181.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31181.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31181.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31181.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31183.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31183.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31183.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31183.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31183.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31183.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31184.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31184.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31184.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31184.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31184.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31184.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.type_promotion.expect b/pkg/front_end/testcases/regress/issue_31184.dart.type_promotion.expect
new file mode 100644
index 0000000..9514d8e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/regress/issue_31184.dart:6:28: Context: Write to i@243
+  for (int i = 0, i > 10; i++) {}
+                           ^^
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31185.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31185.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31185.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31185.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31185.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31185.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31186.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31186.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31186.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31186.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31186.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31186.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31186.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31186.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31187.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31187.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31187.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31187.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31187.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31187.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31187.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31187.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
deleted file mode 100644
index dd4cc1d..0000000
--- a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
-// type T = Map<A, B>
-//                 ^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
-// type T = Map<A, B>
-//                  ^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Warning: Type 'type' not found.
-// type T = Map<A, B>
-// ^^^^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Warning: Getter not found: 'A'.
-// type T = Map<A, B>
-//              ^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Warning: 'type' isn't a type.
-// type T = Map<A, B>
-// ^^^^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
-// type T = Map<A, B>
-//                 ^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
-// type T = Map<A, B>
-//                  ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static field invalid-type T = core::Map<dynamic, dynamic>.<(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-static field invalid-type B;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
deleted file mode 100644
index d24fdb3..0000000
--- a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
-// type T = Map<A, B>
-//                 ^
-//
-// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
-// type T = Map<A, B>
-//                  ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static field invalid-type T = core::Map<dynamic, dynamic>.<(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-static field invalid-type B;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31188.dart.legacy.expect
new file mode 100644
index 0000000..b43e742
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.legacy.expect
@@ -0,0 +1,39 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
+// type T = Map<A, B>
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// type T = Map<A, B>
+//                  ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Warning: Type 'type' not found.
+// type T = Map<A, B>
+// ^^^^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:14: Warning: Getter not found: 'A'.
+// type T = Map<A, B>
+//              ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:1: Warning: 'type' isn't a type.
+// type T = Map<A, B>
+// ^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
+// type T = Map<A, B>
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// type T = Map<A, B>
+//                  ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type B;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.legacy.transformed.expect
new file mode 100644
index 0000000..17bbd41
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.legacy.transformed.expect
@@ -0,0 +1,17 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:17: Error: Expected ';' after this.
+// type T = Map<A, B>
+//                 ^
+//
+// pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+// type T = Map<A, B>
+//                  ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type B;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
index 96eebb1..166f5be 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -16,7 +16,8 @@
 // type T = Map<A, B>
 //              ^
 //
-// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+// pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+//  - 'Type' is from 'dart:core'.
 // Try correcting the name to the name of an existing method, or defining a method named '<'.
 // type T = Map<A, B>
 //             ^
@@ -47,7 +48,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field invalid-type T = let final dynamic #t1 = core::Map<dynamic, dynamic> in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+static field invalid-type T = let final dynamic #t1 = core::Map<dynamic, dynamic> in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named '<'.
 type T = Map<A, B>
             ^";
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
index cb85779..780a726 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
@@ -20,7 +20,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field invalid-type T = let final core::Type #t1 = core::Map<dynamic, dynamic> in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+static field invalid-type T = let final core::Type #t1 = core::Map<dynamic, dynamic> in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'Type'.
+ - 'Type' is from 'dart:core'.
 Try correcting the name to the name of an existing method, or defining a method named '<'.
 type T = Map<A, B>
             ^";
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31190.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31190.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31190.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31190.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31190.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31190.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31192.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31192.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31192.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31192.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31192.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31192.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31198.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31198.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31198.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31198.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31198.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31198.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31213.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31213.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31213.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31213.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31213.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31213.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31299.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31299.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31299.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31299.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31299.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31299.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31766.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31766.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31766.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31766.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31766.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31766.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31846.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31846.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31846.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31846.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31846.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31996.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31996.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_31996.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31996.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_31996.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_31996.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect
deleted file mode 100644
index 3f9071f..0000000
--- a/pkg/front_end/testcases/regress/issue_32182.dart.direct.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return 42;
-}
-abstract class _C&A&M = self::A<self::A<dynamic>> with self::M {
-  synthetic constructor •() → self::_C&A&M
-    : super self::A::•()
-    ;
-}
-class C extends self::_C&A&M {
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  new self::C::•().m().+(1);
-}
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect
deleted file mode 100644
index 49ef114..0000000
--- a/pkg/front_end/testcases/regress/issue_32182.dart.direct.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return 42;
-}
-abstract class _C&A&M extends self::A<self::A<dynamic>> implements self::M {
-  synthetic constructor •() → self::_C&A&M
-    : super self::A::•()
-    ;
-  method m() → dynamic
-    return 42;
-}
-class C extends self::_C&A&M {
-  synthetic constructor •() → self::C
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  new self::C::•().m().+(1);
-}
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_32182.dart.legacy.expect
new file mode 100644
index 0000000..2b0e26e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.legacy.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return 42;
+}
+abstract class _C&A&M = self::A<self::A<dynamic>> with self::M {
+  synthetic constructor •() → self::_C&A&M
+    : super self::A::•()
+    ;
+}
+class C extends self::_C&A&M {
+  synthetic constructor •() → self::C
+    : super self::_C&A&M::•()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•().m().+(1);
+}
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_32182.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a9c10f4
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.legacy.transformed.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return 42;
+}
+abstract class _C&A&M extends self::A<self::A<dynamic>> implements self::M {
+  synthetic constructor •() → self::_C&A&M
+    : super self::A::•()
+    ;
+  method m() → dynamic
+    return 42;
+}
+class C extends self::_C&A&M {
+  synthetic constructor •() → self::C
+    : super self::_C&A&M::•()
+    ;
+}
+static method main() → dynamic {
+  new self::C::•().m().+(1);
+}
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
index 369e464..ccec30c 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
@@ -21,7 +21,7 @@
 }
 class C extends self::_C&A&M {
   synthetic constructor •() → self::C
-    : super self::A::•()
+    : super self::_C&A&M::•()
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
index 43a28a0..063d09c 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
 }
 class C extends self::_C&A&M {
   synthetic constructor •() → self::C
-    : super self::A::•()
+    : super self::_C&A&M::•()
     ;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32196.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_32196.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_32196.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32196.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_32196.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_32196.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32200.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_32200.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_32200.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32200.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_32200.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_32200.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
index cb382eb..3eaa5d1 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
@@ -4,7 +4,8 @@
 //   self.Foo self;
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type '#lib1::Foo' can't be assigned to a variable of type 'invalid-type'.
+// pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type 'Foo' can't be assigned to a variable of type 'invalid-type'.
+//  - 'Foo' is from 'pkg/front_end/testcases/regress/issue_32200.dart'.
 // Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
 //   instance.self = instance;
 //                   ^
@@ -27,7 +28,8 @@
 }
 static method main() → dynamic {
   self::Foo instance = new self::Foo::•();
-  instance.{self::Foo::self} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type '#lib1::Foo' can't be assigned to a variable of type 'invalid-type'.
+  instance.{self::Foo::self} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type 'Foo' can't be assigned to a variable of type 'invalid-type'.
+ - 'Foo' is from 'pkg/front_end/testcases/regress/issue_32200.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
   instance.self = instance;
                   ^" in instance as{TypeError} invalid-type;
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
index 6b54632..7e77e11 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
@@ -16,7 +16,8 @@
 }
 static method main() → dynamic {
   self::Foo instance = new self::Foo::•();
-  instance.{self::Foo::self} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type '#lib1::Foo' can't be assigned to a variable of type 'invalid-type'.
+  instance.{self::Foo::self} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_32200.dart:13:19: Error: A value of type 'Foo' can't be assigned to a variable of type 'invalid-type'.
+ - 'Foo' is from 'pkg/front_end/testcases/regress/issue_32200.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
   instance.self = instance;
                   ^" in instance as{TypeError} invalid-type;
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32660.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_32660.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_32660.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_32660.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_32660.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
index a8975fa..4848bf0 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
@@ -1,6 +1,6 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A::foo' has fewer named arguments than those of overridden method 'B::foo'.
+// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A.foo' has fewer named arguments than those of overridden method 'B.foo'.
 //   foo(int x) => x;
 //   ^
 // pkg/front_end/testcases/regress/issue_32660.dart:10:3: Context: This is the overridden method ('foo').
@@ -10,7 +10,7 @@
 // class C extends A implements B {
 //       ^
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D::foo' has fewer named arguments than those of overridden method 'E::foo'.
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
 //   foo(int x) => x;
 //   ^
 // pkg/front_end/testcases/regress/issue_32660.dart:25:3: Context: This is the overridden method ('foo').
@@ -22,11 +22,11 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A::foo' has fewer named arguments than those of overridden method 'B::foo'.
+// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A.foo' has fewer named arguments than those of overridden method 'B.foo'.
 //   foo(int x) => x;
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D::foo' has fewer named arguments than those of overridden method 'E::foo'.
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
 //   foo(int x) => x;
 //   ^
 
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
index 404937a..86d1097 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
@@ -1,10 +1,10 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A::foo' has fewer named arguments than those of overridden method 'B::foo'.
+// pkg/front_end/testcases/regress/issue_32660.dart:6:3: Error: The method 'A.foo' has fewer named arguments than those of overridden method 'B.foo'.
 //   foo(int x) => x;
 //   ^
 //
-// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D::foo' has fewer named arguments than those of overridden method 'E::foo'.
+// pkg/front_end/testcases/regress/issue_32660.dart:21:3: Error: The method 'D.foo' has fewer named arguments than those of overridden method 'E.foo'.
 //   foo(int x) => x;
 //   ^
 
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.direct.expect b/pkg/front_end/testcases/regress/issue_32972.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_32972.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_32972.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_32972.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_32972.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_32972.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
deleted file mode 100644
index a0ff133..0000000
--- a/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
+++ /dev/null
@@ -1,43 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:10:29: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   var x = new ExistingClass.nonExistingConstructor();
-//                             ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:11:11: Warning: Method not found: 'ExistingClass'.
-//   x = new ExistingClass();
-//           ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:12:11: Warning: Method not found: 'ExistingClass'.
-//   x = new ExistingClass<String>();
-//           ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:13:33: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   x = new ExistingClass<String>.nonExistingConstructor();
-//                                 ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:14:41: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
-//   x = new ExistingClass<String, String>.nonExistingConstructor();
-//                                         ^^^^^^^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_33452.dart:15:11: Warning: Method not found: 'NonExistingClass'.
-//   x = new NonExistingClass();
-//           ^^^^^^^^^^^^^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class ExistingClass extends core::Object {
-  constructor existingConstructor() → self::ExistingClass
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String, core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
deleted file mode 100644
index 038ecc7..0000000
--- a/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class ExistingClass extends core::Object {
-  constructor existingConstructor() → self::ExistingClass
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String, core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_33452.dart.legacy.expect
new file mode 100644
index 0000000..1b94419
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.legacy.expect
@@ -0,0 +1,43 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:10:29: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   var x = new ExistingClass.nonExistingConstructor();
+//                             ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:11:11: Warning: Method not found: 'ExistingClass'.
+//   x = new ExistingClass();
+//           ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:12:11: Warning: Method not found: 'ExistingClass'.
+//   x = new ExistingClass<String>();
+//           ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:13:33: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   x = new ExistingClass<String>.nonExistingConstructor();
+//                                 ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:14:41: Warning: Method not found: 'ExistingClass.nonExistingConstructor'.
+//   x = new ExistingClass<String, String>.nonExistingConstructor();
+//                                         ^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_33452.dart:15:11: Warning: Method not found: 'NonExistingClass'.
+//   x = new NonExistingClass();
+//           ^^^^^^^^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+  constructor existingConstructor() → self::ExistingClass
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String, core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.legacy.transformed.expect
new file mode 100644
index 0000000..22a417b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.legacy.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+  constructor existingConstructor() → self::ExistingClass
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String, core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.type_promotion.expect b/pkg/front_end/testcases/regress/issue_33452.dart.type_promotion.expect
new file mode 100644
index 0000000..64406e2
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.type_promotion.expect
@@ -0,0 +1,15 @@
+pkg/front_end/testcases/regress/issue_33452.dart:11:5: Context: Write to x@296
+  x = new ExistingClass();
+    ^
+pkg/front_end/testcases/regress/issue_33452.dart:12:5: Context: Write to x@296
+  x = new ExistingClass<String>();
+    ^
+pkg/front_end/testcases/regress/issue_33452.dart:13:5: Context: Write to x@296
+  x = new ExistingClass<String>.nonExistingConstructor();
+    ^
+pkg/front_end/testcases/regress/issue_33452.dart:14:5: Context: Write to x@296
+  x = new ExistingClass<String, String>.nonExistingConstructor();
+    ^
+pkg/front_end/testcases/regress/issue_33452.dart:15:5: Context: Write to x@296
+  x = new NonExistingClass();
+    ^
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart b/pkg/front_end/testcases/regress/issue_33672.dart
new file mode 100644
index 0000000..f302c8a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33672.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  int count = 0;
+  yield: for (int a = 0; a < 10; ++a) {
+    for (int b = 0; b < 10; ++b) {
+      ++count;
+      if (count == 27) break yield;
+    }
+    ++count;
+  }
+  if (count != 27) throw 'failed: $count';
+}
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_33672.dart.legacy.expect
new file mode 100644
index 0000000..4f58db1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.legacy.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int count = 0;
+  #L1:
+  for (core::int a = 0; a.<(10); a = a.+(1)) {
+    for (core::int b = 0; b.<(10); b = b.+(1)) {
+      count = count.+(1);
+      if(count.==(27))
+        break #L1;
+    }
+    count = count.+(1);
+  }
+  if(!count.==(27))
+    throw "failed: ${count}";
+}
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_33672.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4f58db1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.legacy.transformed.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int count = 0;
+  #L1:
+  for (core::int a = 0; a.<(10); a = a.+(1)) {
+    for (core::int b = 0; b.<(10); b = b.+(1)) {
+      count = count.+(1);
+      if(count.==(27))
+        break #L1;
+    }
+    count = count.+(1);
+  }
+  if(!count.==(27))
+    throw "failed: ${count}";
+}
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.outline.expect b/pkg/front_end/testcases/regress/issue_33672.dart.outline.expect
new file mode 100644
index 0000000..6a28c0d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.outline.expect
@@ -0,0 +1,5 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.strong.expect b/pkg/front_end/testcases/regress/issue_33672.dart.strong.expect
new file mode 100644
index 0000000..2a2bd06
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.strong.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int count = 0;
+  #L1:
+  for (core::int a = 0; a.{core::num::<}(10); a = a.{core::num::+}(1)) {
+    for (core::int b = 0; b.{core::num::<}(10); b = b.{core::num::+}(1)) {
+      count = count.{core::num::+}(1);
+      if(count.{core::num::==}(27))
+        break #L1;
+    }
+    count = count.{core::num::+}(1);
+  }
+  if(!count.{core::num::==}(27))
+    throw "failed: ${count}";
+}
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_33672.dart.strong.transformed.expect
new file mode 100644
index 0000000..2a2bd06
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  core::int count = 0;
+  #L1:
+  for (core::int a = 0; a.{core::num::<}(10); a = a.{core::num::+}(1)) {
+    for (core::int b = 0; b.{core::num::<}(10); b = b.{core::num::+}(1)) {
+      count = count.{core::num::+}(1);
+      if(count.{core::num::==}(27))
+        break #L1;
+    }
+    count = count.{core::num::+}(1);
+  }
+  if(!count.{core::num::==}(27))
+    throw "failed: ${count}";
+}
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.type_promotion.expect b/pkg/front_end/testcases/regress/issue_33672.dart.type_promotion.expect
new file mode 100644
index 0000000..929bc26
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/regress/issue_33672.dart:7:34: Context: Write to a@260
+  yield: for (int a = 0; a < 10; ++a) {
+                                 ^^
+pkg/front_end/testcases/regress/issue_33672.dart:8:29: Context: Write to b@295
+    for (int b = 0; b < 10; ++b) {
+                            ^^
+pkg/front_end/testcases/regress/issue_33672.dart:9:7: Context: Write to count@231
+      ++count;
+      ^^
+pkg/front_end/testcases/regress/issue_33672.dart:12:5: Context: Write to count@231
+    ++count;
+    ^^
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34225.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34225.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_34225.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34225.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_34225.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
index 1e28b8c..2c6e340 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
@@ -8,7 +8,8 @@
 //   set D(v) {} //# 02: compile-time error
 //       ^
 //
-// pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class '#lib1::C'.
+// pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/regress/issue_34225.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'C'.
 //   c.C = 5;
 //     ^
@@ -41,7 +42,8 @@
 }
 static method main() → dynamic {
   self::C c = new self::C::•();
-  let final dynamic #t1 = c in invalid-expression "pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class '#lib1::C'.
+  let final dynamic #t1 = c in invalid-expression "pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/regress/issue_34225.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'C'.
   c.C = 5;
     ^";
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
index 175d30e..d6f9092 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
@@ -26,7 +26,8 @@
 }
 static method main() → dynamic {
   self::C c = new self::C::•();
-  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class '#lib1::C'.
+  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/regress/issue_34225.dart:15:5: Error: The setter 'C' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/regress/issue_34225.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'C'.
   c.C = 5;
     ^";
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34291.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34291.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34403.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34403.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34498.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34498.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_34498.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34498.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34498.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_34498.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34563.dart.direct.expect
deleted file mode 100644
index e878e85..0000000
--- a/pkg/front_end/testcases/regress/issue_34563.dart.direct.expect
+++ /dev/null
@@ -1,80 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
-// mixin M2 extend M1 {}
-//          ^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
-// mixin M3 extends M1 {}
-//          ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
-// class C2 extend C1 with M2 {}
-//          ^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
-// class C3 on C1 with M3 {}
-//          ^^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
-// mixin M2 extend M1 {}
-//          ^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
-// mixin M3 extends M1 {}
-//          ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
-// class C2 extend C1 with M2 {}
-//          ^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
-// class C3 on C1 with M3 {}
-//          ^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-  get m() → core::int
-    return 1;
-}
-abstract class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-}
-abstract class M3 extends core::Object {
-  synthetic constructor •() → self::M3
-    : super core::Object::•()
-    ;
-}
-class C1 extends core::Object {
-  synthetic constructor •() → self::C1
-    : super core::Object::•()
-    ;
-  get c() → core::int
-    return 2;
-}
-class C2 extends core::Object {
-  synthetic constructor •() → self::C2
-    : super core::Object::•()
-    ;
-}
-class C3 extends core::Object {
-  synthetic constructor •() → self::C3
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic c2 = new self::C2::•();
-  c2.m.+(c2.c);
-  dynamic c3 = new self::C3::•();
-  c3.m.+(c3.c);
-}
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34563.dart.direct.transformed.expect
deleted file mode 100644
index 5e662e3..0000000
--- a/pkg/front_end/testcases/regress/issue_34563.dart.direct.transformed.expect
+++ /dev/null
@@ -1,62 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
-// mixin M2 extend M1 {}
-//          ^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
-// mixin M3 extends M1 {}
-//          ^^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
-// class C2 extend C1 with M2 {}
-//          ^^^^^^
-//
-// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
-// class C3 on C1 with M3 {}
-//          ^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-  get m() → core::int
-    return 1;
-}
-abstract class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-}
-abstract class M3 extends core::Object {
-  synthetic constructor •() → self::M3
-    : super core::Object::•()
-    ;
-}
-class C1 extends core::Object {
-  synthetic constructor •() → self::C1
-    : super core::Object::•()
-    ;
-  get c() → core::int
-    return 2;
-}
-class C2 extends core::Object {
-  synthetic constructor •() → self::C2
-    : super core::Object::•()
-    ;
-}
-class C3 extends core::Object {
-  synthetic constructor •() → self::C3
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic c2 = new self::C2::•();
-  c2.m.+(c2.c);
-  dynamic c3 = new self::C3::•();
-  c3.m.+(c3.c);
-}
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34563.dart.legacy.expect
new file mode 100644
index 0000000..5ff2161
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.legacy.expect
@@ -0,0 +1,71 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Object {
+  get m() → core::int
+    return 1;
+}
+abstract class M2 extends core::Object {
+}
+abstract class M3 extends core::Object {
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+  get c() → core::int
+    return 2;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic c2 = new self::C2::•();
+  c2.m.+(c2.c);
+  dynamic c3 = new self::C3::•();
+  c3.m.+(c3.c);
+}
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34563.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3e681c4
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.legacy.transformed.expect
@@ -0,0 +1,53 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:9:10: Error: Expected 'on' instead of this.
+// mixin M2 extend M1 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:11:10: Error: Expected 'on' instead of this.
+// mixin M3 extends M1 {}
+//          ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:17:10: Error: Expected 'extends' instead of this.
+// class C2 extend C1 with M2 {}
+//          ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34563.dart:19:10: Error: Expected 'extends' instead of this.
+// class C3 on C1 with M3 {}
+//          ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M1 extends core::Object {
+  get m() → core::int
+    return 1;
+}
+abstract class M2 extends core::Object {
+}
+abstract class M3 extends core::Object {
+}
+class C1 extends core::Object {
+  synthetic constructor •() → self::C1
+    : super core::Object::•()
+    ;
+  get c() → core::int
+    return 2;
+}
+class C2 extends core::Object {
+  synthetic constructor •() → self::C2
+    : super core::Object::•()
+    ;
+}
+class C3 extends core::Object {
+  synthetic constructor •() → self::C3
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic c2 = new self::C2::•();
+  c2.m.+(c2.c);
+  dynamic c3 = new self::C3::•();
+  c3.m.+(c3.c);
+}
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect
index 8a53597..0b65eb9 100644
--- a/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect
@@ -21,18 +21,12 @@
 import "dart:core" as core;
 
 abstract class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    ;
   get m() → core::int
     ;
 }
 abstract class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    ;
 }
 abstract class M3 extends core::Object {
-  synthetic constructor •() → self::M3
-    ;
 }
 class C1 extends core::Object {
   synthetic constructor •() → self::C1
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect
index 03ab446..add69c6 100644
--- a/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect
@@ -16,22 +16,26 @@
 // class C3 on C1 with M3 {}
 //          ^^
 //
-// pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class '#lib1::C2'.
+// pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class 'C2'.
+//  - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
 //   c2.m + c2.c;
 //      ^
 //
-// pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class '#lib1::C2'.
+// pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class 'C2'.
+//  - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
 //   c2.m + c2.c;
 //             ^
 //
-// pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class '#lib1::C3'.
+// pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class 'C3'.
+//  - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
 //   c3.m + c3.c;
 //      ^
 //
-// pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class '#lib1::C3'.
+// pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class 'C3'.
+//  - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
 //   c3.m + c3.c;
 //             ^
@@ -59,21 +63,12 @@
 import "dart:core" as core;
 
 abstract class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
   get m() → core::int
     return 1;
 }
 abstract class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
 }
 abstract class M3 extends core::Object {
-  synthetic constructor •() → self::M3
-    : super core::Object::•()
-    ;
 }
 class C1 extends core::Object {
   synthetic constructor •() → self::C1
@@ -94,18 +89,22 @@
 }
 static method main() → dynamic {
   self::C2 c2 = new self::C2::•();
-  (let final dynamic #t1 = c2 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class '#lib1::C2'.
+  (let final dynamic #t1 = c2 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class 'C2'.
+ - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
   c2.m + c2.c;
-     ^").+(let final dynamic #t2 = c2 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class '#lib1::C2'.
+     ^").+(let final dynamic #t2 = c2 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class 'C2'.
+ - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
   c2.m + c2.c;
             ^");
   self::C3 c3 = new self::C3::•();
-  (let final dynamic #t3 = c3 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class '#lib1::C3'.
+  (let final dynamic #t3 = c3 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class 'C3'.
+ - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
   c3.m + c3.c;
-     ^").+(let final dynamic #t4 = c3 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class '#lib1::C3'.
+     ^").+(let final dynamic #t4 = c3 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class 'C3'.
+ - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
   c3.m + c3.c;
             ^");
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect
index 697afbc..98e20c3 100644
--- a/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect
@@ -21,21 +21,12 @@
 import "dart:core" as core;
 
 abstract class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
   get m() → core::int
     return 1;
 }
 abstract class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
 }
 abstract class M3 extends core::Object {
-  synthetic constructor •() → self::M3
-    : super core::Object::•()
-    ;
 }
 class C1 extends core::Object {
   synthetic constructor •() → self::C1
@@ -56,18 +47,22 @@
 }
 static method main() → dynamic {
   self::C2 c2 = new self::C2::•();
-  (let final self::C2 #t1 = c2 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class '#lib1::C2'.
+  (let final self::C2 #t1 = c2 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:6: Error: The getter 'm' isn't defined for the class 'C2'.
+ - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
   c2.m + c2.c;
-     ^").+(let final self::C2 #t2 = c2 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class '#lib1::C2'.
+     ^").+(let final self::C2 #t2 = c2 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:23:13: Error: The getter 'c' isn't defined for the class 'C2'.
+ - 'C2' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
   c2.m + c2.c;
             ^");
   self::C3 c3 = new self::C3::•();
-  (let final self::C3 #t3 = c3 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class '#lib1::C3'.
+  (let final self::C3 #t3 = c3 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:6: Error: The getter 'm' isn't defined for the class 'C3'.
+ - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'm'.
   c3.m + c3.c;
-     ^").+(let final self::C3 #t4 = c3 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class '#lib1::C3'.
+     ^").+(let final self::C3 #t4 = c3 in invalid-expression "pkg/front_end/testcases/regress/issue_34563.dart:25:13: Error: The getter 'c' isn't defined for the class 'C3'.
+ - 'C3' is from 'pkg/front_end/testcases/regress/issue_34563.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
   c3.m + c3.c;
             ^");
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart b/pkg/front_end/testcases/regress/issue_34610.dart
new file mode 100644
index 0000000..09f61fa
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34610.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A { get A.named => null; get bar => 1; }
+
+class B { B.named : super(); get bar => 1; }
+
+class C { C.named => null; get bar => 1; }
+
+main() {
+  print(new A().bar);
+  print(new B.named().bar);
+  try {
+    print(new C.named().bar);
+    throw 'expected exception';
+  } catch (e) {
+    // Expected Error: Constructors can't have a return type.
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34610.dart.legacy.expect
new file mode 100644
index 0000000..ceb8d46
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.legacy.expect
@@ -0,0 +1,104 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected '{' before this.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:15: Error: A class member can't have the same name as the enclosing class.
+// class A { get A.named => null; get bar => 1; }
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected a class member, but got '.'.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class A { get A.named => null; get bar => 1; }
+//                 ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:7:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class B { B.named : super(); get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C.named => null; get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:22: Error: Constructors can't have a return type.
+// Try removing the return type.
+// class C { C.named => null; get bar => 1; }
+//                      ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected '{' before this.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:15: Error: A class member can't have the same name as the enclosing class.
+// class A { get A.named => null; get bar => 1; }
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected a class member, but got '.'.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class A { get A.named => null; get bar => 1; }
+//                 ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:7:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class B { B.named : super(); get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C.named => null; get bar => 1; }
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get A() → dynamic {}
+  method named() → dynamic
+    return null;
+  get bar() → dynamic
+    return 1;
+}
+class B extends core::Object {
+  constructor named() → self::B
+    : super core::Object::•()
+    ;
+  get bar() → dynamic
+    return 1;
+}
+class C extends core::Object {
+  constructor named() → self::C
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/regress/issue_34610.dart:9:22: Error: Constructors can't have a return type.
+Try removing the return type.
+class C { C.named => null; get bar => 1; }
+                     ^";
+  get bar() → dynamic
+    return 1;
+}
+static method main() → dynamic {
+  core::print(new self::A::•().bar);
+  core::print(new self::B::named().bar);
+  try {
+    core::print(new self::C::named().bar);
+    throw "expected exception";
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34610.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fb45946
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.legacy.transformed.expect
@@ -0,0 +1,70 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected '{' before this.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:15: Error: A class member can't have the same name as the enclosing class.
+// class A { get A.named => null; get bar => 1; }
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected a class member, but got '.'.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class A { get A.named => null; get bar => 1; }
+//                 ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:7:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class B { B.named : super(); get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C.named => null; get bar => 1; }
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get A() → dynamic {}
+  method named() → dynamic
+    return null;
+  get bar() → dynamic
+    return 1;
+}
+class B extends core::Object {
+  constructor named() → self::B
+    : super core::Object::•()
+    ;
+  get bar() → dynamic
+    return 1;
+}
+class C extends core::Object {
+  constructor named() → self::C
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/regress/issue_34610.dart:9:22: Error: Constructors can't have a return type.
+Try removing the return type.
+class C { C.named => null; get bar => 1; }
+                     ^";
+  get bar() → dynamic
+    return 1;
+}
+static method main() → dynamic {
+  core::print(new self::A::•().bar);
+  core::print(new self::B::named().bar);
+  try {
+    core::print(new self::C::named().bar);
+    throw "expected exception";
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34610.dart.outline.expect
new file mode 100644
index 0000000..7e39069
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.outline.expect
@@ -0,0 +1,57 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected '{' before this.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:15: Error: A class member can't have the same name as the enclosing class.
+// class A { get A.named => null; get bar => 1; }
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected a class member, but got '.'.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class A { get A.named => null; get bar => 1; }
+//                 ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:7:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class B { B.named : super(); get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C.named => null; get bar => 1; }
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+  get A() → dynamic
+    ;
+  method named() → dynamic
+    ;
+  get bar() → dynamic
+    ;
+}
+class B extends core::Object {
+  constructor named() → self::B
+    ;
+  get bar() → dynamic
+    ;
+}
+class C extends core::Object {
+  constructor named() → self::C
+    ;
+  get bar() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34610.dart.strong.expect
new file mode 100644
index 0000000..568654c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.strong.expect
@@ -0,0 +1,104 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected '{' before this.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:15: Error: A class member can't have the same name as the enclosing class.
+// class A { get A.named => null; get bar => 1; }
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected a class member, but got '.'.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class A { get A.named => null; get bar => 1; }
+//                 ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:7:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class B { B.named : super(); get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C.named => null; get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:22: Error: Constructors can't have a return type.
+// Try removing the return type.
+// class C { C.named => null; get bar => 1; }
+//                      ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected '{' before this.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:15: Error: A class member can't have the same name as the enclosing class.
+// class A { get A.named => null; get bar => 1; }
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected a class member, but got '.'.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class A { get A.named => null; get bar => 1; }
+//                 ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:7:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class B { B.named : super(); get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C.named => null; get bar => 1; }
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get A() → dynamic {}
+  method named() → dynamic
+    return null;
+  get bar() → dynamic
+    return 1;
+}
+class B extends core::Object {
+  constructor named() → self::B
+    : super core::Object::•()
+    ;
+  get bar() → dynamic
+    return 1;
+}
+class C extends core::Object {
+  constructor named() → self::C
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/regress/issue_34610.dart:9:22: Error: Constructors can't have a return type.
+Try removing the return type.
+class C { C.named => null; get bar => 1; }
+                     ^";
+  get bar() → dynamic
+    return 1;
+}
+static method main() → dynamic {
+  core::print(new self::A::•().{self::A::bar});
+  core::print(new self::B::named().{self::B::bar});
+  try {
+    core::print(new self::C::named().{self::C::bar});
+    throw "expected exception";
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34610.dart.strong.transformed.expect
new file mode 100644
index 0000000..ca2cebe
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.strong.transformed.expect
@@ -0,0 +1,70 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected '{' before this.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:15: Error: A class member can't have the same name as the enclosing class.
+// class A { get A.named => null; get bar => 1; }
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:16: Error: Expected a class member, but got '.'.
+// class A { get A.named => null; get bar => 1; }
+//                ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:5:17: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class A { get A.named => null; get bar => 1; }
+//                 ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:7:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class B { B.named : super(); get bar => 1; }
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_34610.dart:9:11: Error: A method declaration needs an explicit list of parameters.
+// Try adding a parameter list to the method declaration.
+// class C { C.named => null; get bar => 1; }
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  get A() → dynamic {}
+  method named() → dynamic
+    return null;
+  get bar() → dynamic
+    return 1;
+}
+class B extends core::Object {
+  constructor named() → self::B
+    : super core::Object::•()
+    ;
+  get bar() → dynamic
+    return 1;
+}
+class C extends core::Object {
+  constructor named() → self::C
+    : super core::Object::•()
+    invalid-expression "pkg/front_end/testcases/regress/issue_34610.dart:9:22: Error: Constructors can't have a return type.
+Try removing the return type.
+class C { C.named => null; get bar => 1; }
+                     ^";
+  get bar() → dynamic
+    return 1;
+}
+static method main() → dynamic {
+  core::print(new self::A::•().{self::A::bar});
+  core::print(new self::B::named().{self::B::bar});
+  try {
+    core::print(new self::C::named().{self::C::bar});
+    throw "expected exception";
+  }
+  on dynamic catch(final dynamic e) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.direct.expect b/pkg/front_end/testcases/regress/issue_34614.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34614.dart.direct.expect
rename to pkg/front_end/testcases/regress/issue_34614.dart.legacy.expect
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_34614.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/regress/issue_34614.dart.direct.transformed.expect
rename to pkg/front_end/testcases/regress/issue_34614.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart b/pkg/front_end/testcases/regress/issue_34850.dart
new file mode 100644
index 0000000..052530e
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34850.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+<foo<
+
+int f1() {
+  return null;
+}
+
+foo
+Future<List<int>> f2() async => null;
+
+Future<List<>> f3() async {
+  return null;
+}
+
+main() async {
+  print(f1());
+  print(await f2());
+  print(await f3());
+}
+
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34850.dart.legacy.expect
new file mode 100644
index 0000000..a866654
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.legacy.expect
@@ -0,0 +1,87 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:1: Error: Expected a declaration, but got '<'.
+// <foo<
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:7:1: Error: Expected '>' after this.
+// int f1() {
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:8: Error: Expected '>' after this.
+// Future<List<int>> f2() async => null;
+//        ^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:19: Error: Expected '{' before this.
+// Future<List<int>> f2() async => null;
+//                   ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:13: Error: Expected a type, but got '>>'.
+// Future<List<>> f3() async {
+//             ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Warning: Type 'foo' not found.
+// <foo<
+//  ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:11:1: Warning: Type 'foo' not found.
+// foo
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Warning: 'Future' isn't a type.
+// Future<List<>> f3() async {
+// ^^^^^^
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Context: This isn't a type.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:1: Error: Expected a declaration, but got '<'.
+// <foo<
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:7:1: Error: Expected '>' after this.
+// int f1() {
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:8: Error: Expected '>' after this.
+// Future<List<int>> f2() async => null;
+//        ^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:19: Error: Expected '{' before this.
+// Future<List<int>> f2() async => null;
+//                   ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:13: Error: Expected a type, but got '>>'.
+// Future<List<>> f3() async {
+//             ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f1() → invalid-type {
+  return null;
+}
+static method Future<List extends core::Object = dynamic>() → invalid-type {}
+static method f2() → dynamic async 
+  return null;
+static method f3() → invalid-type async {
+  return null;
+}
+static method main() → dynamic async {
+  core::print(self::f1());
+  core::print(await self::f2());
+  core::print(await self::f3());
+}
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34850.dart.legacy.transformed.expect
new file mode 100644
index 0000000..38947f8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.legacy.transformed.expect
@@ -0,0 +1,121 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:1: Error: Expected a declaration, but got '<'.
+// <foo<
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:7:1: Error: Expected '>' after this.
+// int f1() {
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:8: Error: Expected '>' after this.
+// Future<List<int>> f2() async => null;
+//        ^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:19: Error: Expected '{' before this.
+// Future<List<int>> f2() async => null;
+//                   ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:13: Error: Expected a type, but got '>>'.
+// Future<List<>> f3() async {
+//             ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method f1() → invalid-type {
+  return null;
+}
+static method Future<List extends core::Object = dynamic>() → invalid-type {}
+static method f2() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = null;
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method f3() → invalid-type /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = null;
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        core::print(self::f1());
+        [yield] let dynamic #t1 = asy::_awaitHelper(self::f2(), :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect
new file mode 100644
index 0000000..1bd0032
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect
@@ -0,0 +1,56 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:1: Error: Expected a declaration, but got '<'.
+// <foo<
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:7:1: Error: Expected '>' after this.
+// int f1() {
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:8: Error: Expected '>' after this.
+// Future<List<int>> f2() async => null;
+//        ^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:19: Error: Expected '{' before this.
+// Future<List<int>> f2() async => null;
+//                   ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:13: Error: Expected a type, but got '>>'.
+// Future<List<>> f3() async {
+//             ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Warning: Type 'foo' not found.
+// <foo<
+//  ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:11:1: Warning: Type 'foo' not found.
+// foo
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Warning: 'Future' isn't a type.
+// Future<List<>> f3() async {
+// ^^^^^^
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Context: This isn't a type.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f1() → invalid-type
+  ;
+static method Future<List extends core::Object = dynamic>() → invalid-type
+  ;
+static method f2() → dynamic
+  ;
+static method f3() → invalid-type
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34850.dart.strong.expect
new file mode 100644
index 0000000..1f1bd88
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.strong.expect
@@ -0,0 +1,104 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:1: Error: Expected a declaration, but got '<'.
+// <foo<
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:7:1: Error: Expected '>' after this.
+// int f1() {
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:8: Error: Expected '>' after this.
+// Future<List<int>> f2() async => null;
+//        ^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:19: Error: Expected '{' before this.
+// Future<List<int>> f2() async => null;
+//                   ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:13: Error: Expected a type, but got '>>'.
+// Future<List<>> f3() async {
+//             ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Error: Expected 0 type arguments.
+// <foo<
+//  ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:11:1: Error: Type 'foo' not found.
+// foo
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Error: Expected 0 type arguments.
+// Future<List<>> f3() async {
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:16: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// Future<List<>> f3() async {
+//                ^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:1: Error: Expected a declaration, but got '<'.
+// <foo<
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:7:1: Error: Expected '>' after this.
+// int f1() {
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:8: Error: Expected '>' after this.
+// Future<List<int>> f2() async => null;
+//        ^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:19: Error: Expected '{' before this.
+// Future<List<int>> f2() async => null;
+//                   ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:13: Error: Expected a type, but got '>>'.
+// Future<List<>> f3() async {
+//             ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Error: Expected 0 type arguments.
+// <foo<
+//  ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:11:1: Error: Type 'foo' not found.
+// foo
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Error: Expected 0 type arguments.
+// Future<List<>> f3() async {
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:16: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// Future<List<>> f3() async {
+//                ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f1() → invalid-type {
+  return null;
+}
+static method Future<List extends core::Object = dynamic>() → invalid-type {}
+static method f2() → dynamic async 
+  return null;
+static method f3() → invalid-type async {
+  return null;
+}
+static method main() → dynamic async {
+  core::print(self::f1());
+  core::print(await self::f2());
+  core::print(await self::f3());
+}
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect
new file mode 100644
index 0000000..72bac6c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect
@@ -0,0 +1,137 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:1: Error: Expected a declaration, but got '<'.
+// <foo<
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:7:1: Error: Expected '>' after this.
+// int f1() {
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:8: Error: Expected '>' after this.
+// Future<List<int>> f2() async => null;
+//        ^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:1: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// Future<List<int>> f2() async => null;
+// ^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:12:19: Error: Expected '{' before this.
+// Future<List<int>> f2() async => null;
+//                   ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:13: Error: Expected a type, but got '>>'.
+// Future<List<>> f3() async {
+//             ^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:5:2: Error: Expected 0 type arguments.
+// <foo<
+//  ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:11:1: Error: Type 'foo' not found.
+// foo
+// ^^^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:1: Error: Expected 0 type arguments.
+// Future<List<>> f3() async {
+// ^
+//
+// pkg/front_end/testcases/regress/issue_34850.dart:14:16: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// Future<List<>> f3() async {
+//                ^^
+
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method f1() → invalid-type {
+  return null;
+}
+static method Future<List extends core::Object = dynamic>() → invalid-type {}
+static method f2() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = null;
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method f3() → invalid-type /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = null;
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        core::print(self::f1());
+        [yield] let dynamic #t1 = asy::_awaitHelper(self::f2(), :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart b/pkg/front_end/testcases/regress/issue_35151.dart
new file mode 100644
index 0000000..fedf195
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35151.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  int a;
+}
+
+class B extends A {
+  B() : super.a = 42;
+}
+
+class C {
+  C() : super = 42;
+}
+
+main() {
+  try {
+    var b = new B();
+  } catch (_) {
+    // ignore
+  }
+  try {
+    var c = new C();
+  } catch (_) {
+    // ignore
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35151.dart.legacy.expect
new file mode 100644
index 0000000..de1108c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.legacy.expect
@@ -0,0 +1,60 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
+//   B() : super.a = 42;
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: Not a valid initializer.
+// To initialize a field, use the syntax 'name = value'.
+//   B() : super.a = 42;
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:14:9: Error: Can't access 'super' in a field initializer.
+//   C() : super = 42;
+//         ^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
+//   B() : super.a = 42;
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •() → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: Not a valid initializer.
+To initialize a field, use the syntax 'name = value'.
+  B() : super.a = 42;
+              ^"
+    ;
+}
+class C extends core::Object {
+  constructor •() → self::C
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:14:9: Error: Can't access 'super' in a field initializer.
+  C() : super = 42;
+        ^^^^^"
+    ;
+}
+static method main() → dynamic {
+  try {
+    dynamic b = new self::B::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+  try {
+    dynamic c = new self::C::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35151.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8b2425d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.legacy.transformed.expect
@@ -0,0 +1,44 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
+//   B() : super.a = 42;
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •() → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: Not a valid initializer.
+To initialize a field, use the syntax 'name = value'.
+  B() : super.a = 42;
+              ^"
+    ;
+}
+class C extends core::Object {
+  constructor •() → self::C
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:14:9: Error: Can't access 'super' in a field initializer.
+  C() : super = 42;
+        ^^^^^"
+    ;
+}
+static method main() → dynamic {
+  try {
+    dynamic b = new self::B::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+  try {
+    dynamic c = new self::C::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect
new file mode 100644
index 0000000..0699365
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect
@@ -0,0 +1,26 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
+//   B() : super.a = 42;
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a;
+  synthetic constructor •() → self::A
+    ;
+}
+class B extends self::A {
+  constructor •() → self::B
+    ;
+}
+class C extends core::Object {
+  constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect
new file mode 100644
index 0000000..6f8a3c8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect
@@ -0,0 +1,60 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
+//   B() : super.a = 42;
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: Not a valid initializer.
+// To initialize a field, use the syntax 'name = value'.
+//   B() : super.a = 42;
+//               ^
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:14:9: Error: Can't access 'super' in a field initializer.
+//   C() : super = 42;
+//         ^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
+//   B() : super.a = 42;
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •() → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: Not a valid initializer.
+To initialize a field, use the syntax 'name = value'.
+  B() : super.a = 42;
+              ^"
+    ;
+}
+class C extends core::Object {
+  constructor •() → self::C
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:14:9: Error: Can't access 'super' in a field initializer.
+  C() : super = 42;
+        ^^^^^"
+    ;
+}
+static method main() → dynamic {
+  try {
+    self::B b = new self::B::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+  try {
+    self::C c = new self::C::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect
new file mode 100644
index 0000000..de1b159
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect
@@ -0,0 +1,44 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
+//   B() : super.a = 42;
+//               ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int a = null;
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends self::A {
+  constructor •() → self::B
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: Not a valid initializer.
+To initialize a field, use the syntax 'name = value'.
+  B() : super.a = 42;
+              ^"
+    ;
+}
+class C extends core::Object {
+  constructor •() → self::C
+    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/regress/issue_35151.dart:14:9: Error: Can't access 'super' in a field initializer.
+  C() : super = 42;
+        ^^^^^"
+    ;
+}
+static method main() → dynamic {
+  try {
+    self::B b = new self::B::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+  try {
+    self::C c = new self::C::•();
+  }
+  on dynamic catch(final dynamic _) {
+  }
+}
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart b/pkg/front_end/testcases/regress/issue_35177.dart
new file mode 100644
index 0000000..70ea0be
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35177.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  dynamic Function() f;
+  (f)()<int>();
+}
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35177.dart.legacy.expect
new file mode 100644
index 0000000..67a4d3d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.legacy.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  () → dynamic f;
+  f.call().call<core::int>();
+}
+
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35177.dart.legacy.transformed.expect
new file mode 100644
index 0000000..67a4d3d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.legacy.transformed.expect
@@ -0,0 +1,9 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  () → dynamic f;
+  f.call().call<core::int>();
+}
+
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35177.dart.outline.expect
new file mode 100644
index 0000000..6a28c0d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.outline.expect
@@ -0,0 +1,5 @@
+library;
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35177.dart.strong.expect
new file mode 100644
index 0000000..7e392f3
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.strong.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  () → dynamic f;
+  f.call().call<core::int>();
+}
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35177.dart.strong.transformed.expect
new file mode 100644
index 0000000..7e392f3
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.strong.transformed.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  () → dynamic f;
+  f.call().call<core::int>();
+}
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart b/pkg/front_end/testcases/regress/issue_35213.dart
new file mode 100644
index 0000000..37a9f1c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35213.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+f(int a int b) { }
+
+main() {
+  f(2, 3);
+}
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35213.dart.legacy.expect
new file mode 100644
index 0000000..1280dd9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.legacy.expect
@@ -0,0 +1,21 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35213.dart:5:9: Error: Expected ',' before this.
+// f(int a int b) { }
+//         ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35213.dart:5:9: Error: Expected ',' before this.
+// f(int a int b) { }
+//         ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::int a, core::int b) → dynamic {}
+static method main() → dynamic {
+  self::f(2, 3);
+}
+
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35213.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a66ce9c
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.legacy.transformed.expect
@@ -0,0 +1,15 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35213.dart:5:9: Error: Expected ',' before this.
+// f(int a int b) { }
+//         ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::int a, core::int b) → dynamic {}
+static method main() → dynamic {
+  self::f(2, 3);
+}
+
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35213.dart.outline.expect
new file mode 100644
index 0000000..040a0f3
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.outline.expect
@@ -0,0 +1,14 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35213.dart:5:9: Error: Expected ',' before this.
+// f(int a int b) { }
+//         ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::int a, core::int b) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35213.dart.strong.expect
new file mode 100644
index 0000000..cd5fe47
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.strong.expect
@@ -0,0 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35213.dart:5:9: Error: Expected ',' before this.
+// f(int a int b) { }
+//         ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35213.dart:5:9: Error: Expected ',' before this.
+// f(int a int b) { }
+//         ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::int a, core::int b) → dynamic {}
+static method main() → dynamic {
+  self::f(2, 3);
+}
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35213.dart.strong.transformed.expect
new file mode 100644
index 0000000..1f16d48
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35213.dart:5:9: Error: Expected ',' before this.
+// f(int a int b) { }
+//         ^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::int a, core::int b) → dynamic {}
+static method main() → dynamic {
+  self::f(2, 3);
+}
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart b/pkg/front_end/testcases/regress/issue_35258.dart
new file mode 100644
index 0000000..486fae4
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35258.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  new C(42);
+}
+
+class C {
+  final d;
+
+  C() {}
+  C(this.d) {}
+}
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35258.dart.legacy.expect
new file mode 100644
index 0000000..dd57ef3
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.legacy.expect
@@ -0,0 +1,41 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:13:3: Error: 'C' is already declared in this scope.
+//   C(this.d) {}
+//   ^
+// pkg/front_end/testcases/regress/issue_35258.dart:12:3: Context: Previous declaration of 'C'.
+//   C() {}
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:6:7: Error: Can't use 'C' because it is declared more than once.
+//   new C(42);
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:10:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:13:3: Error: 'C' is already declared in this scope.
+//   C(this.d) {}
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:10:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic d = null;
+  constructor •() → self::C
+    : super core::Object::•() {}
+}
+static method main() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35258.dart.legacy.transformed.expect
new file mode 100644
index 0000000..89e7a08
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.legacy.transformed.expect
@@ -0,0 +1,23 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:13:3: Error: 'C' is already declared in this scope.
+//   C(this.d) {}
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:10:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic d = null;
+  constructor •() → self::C
+    : super core::Object::•() {}
+}
+static method main() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35258.dart.outline.expect
new file mode 100644
index 0000000..6573c01
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.outline.expect
@@ -0,0 +1,20 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:13:3: Error: 'C' is already declared in this scope.
+//   C(this.d) {}
+//   ^
+// pkg/front_end/testcases/regress/issue_35258.dart:12:3: Context: Previous declaration of 'C'.
+//   C() {}
+//   ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic d;
+  constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35258.dart.strong.expect
new file mode 100644
index 0000000..ee9cdb0
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.strong.expect
@@ -0,0 +1,43 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:13:3: Error: 'C' is already declared in this scope.
+//   C(this.d) {}
+//   ^
+// pkg/front_end/testcases/regress/issue_35258.dart:12:3: Context: Previous declaration of 'C'.
+//   C() {}
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:6:7: Error: Can't use 'C' because it is declared more than once.
+//   new C(42);
+//       ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:10:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:13:3: Error: 'C' is already declared in this scope.
+//   C(this.d) {}
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:10:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic d = null;
+  constructor •() → self::C
+    : super core::Object::•() {}
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_35258.dart:6:7: Error: Can't use 'C' because it is declared more than once.
+  new C(42);
+      ^";
+}
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35258.dart.strong.transformed.expect
new file mode 100644
index 0000000..dc46e1b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:13:3: Error: 'C' is already declared in this scope.
+//   C(this.d) {}
+//   ^
+//
+// pkg/front_end/testcases/regress/issue_35258.dart:10:9: Error: Final field 'd' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final d;
+//         ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field dynamic d = null;
+  constructor •() → self::C
+    : super core::Object::•() {}
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_35258.dart:6:7: Error: Can't use 'C' because it is declared more than once.
+  new C(42);
+      ^";
+}
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart b/pkg/front_end/testcases/regress/issue_35259.dart
new file mode 100644
index 0000000..10246aa
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35259.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Supertype {
+  factory Supertype() = Unresolved;
+  factory Supertype() = Unresolved;
+}
+
+main() {
+  print(new Supertype());
+}
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35259.dart.legacy.expect
new file mode 100644
index 0000000..cdee012
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.legacy.expect
@@ -0,0 +1,47 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Context: Previous declaration of 'Supertype'.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Warning: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Warning: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Warning: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Warning: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:11:13: Error: Can't use 'Supertype' because it is declared more than once.
+//   print(new Supertype());
+//             ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
+}
+static method main() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Supertype, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+}
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35259.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b95387a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.legacy.transformed.expect
@@ -0,0 +1,18 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
+}
+static method main() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Supertype, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+}
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect
new file mode 100644
index 0000000..93650ba
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect
@@ -0,0 +1,36 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Context: Previous declaration of 'Supertype'.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Warning: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Warning: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Warning: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Warning: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35259.dart.strong.expect
new file mode 100644
index 0000000..c803a06
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.strong.expect
@@ -0,0 +1,65 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Context: Previous declaration of 'Supertype'.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Error: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Error: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:11:13: Error: Can't use 'Supertype' because it is declared more than once.
+//   print(new Supertype());
+//             ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Error: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Error: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
+}
+static method main() → dynamic {
+  core::print(invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:11:13: Error: Can't use 'Supertype' because it is declared more than once.
+  print(new Supertype());
+            ^");
+}
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35259.dart.strong.transformed.expect
new file mode 100644
index 0000000..ff84c51
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = Unresolved;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:25: Error: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:25: Error: Couldn't find constructor 'Unresolved'.
+//   factory Supertype() = Unresolved;
+//                         ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:7:11: Error: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35259.dart:6:11: Error: Redirection constructor target not found: 'Unresolved'
+//   factory Supertype() = Unresolved;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let core::String #redirecting_factory = "Unresolved" in invalid-expression;
+}
+static method main() → dynamic {
+  core::print(invalid-expression "pkg/front_end/testcases/regress/issue_35259.dart:11:13: Error: Can't use 'Supertype' because it is declared more than once.
+  print(new Supertype());
+            ^");
+}
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart b/pkg/front_end/testcases/regress/issue_35260.dart
new file mode 100644
index 0000000..ab79fbe
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35260.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Supertype {
+  factory Supertype() = X;
+  factory Supertype() = X;
+}
+
+class X implements Supertype {
+  X();
+}
+
+main() {
+  X x = new Supertype();
+}
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35260.dart.legacy.expect
new file mode 100644
index 0000000..37f976f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.legacy.expect
@@ -0,0 +1,36 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/regress/issue_35260.dart:6:11: Context: Previous declaration of 'Supertype'.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:15:13: Error: Can't use 'Supertype' because it is declared more than once.
+//   X x = new Supertype();
+//             ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let dynamic #redirecting_factory = self::X::• in invalid-expression;
+}
+class X extends core::Object implements self::Supertype {
+  constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::X x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Supertype, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35260.dart.legacy.transformed.expect
new file mode 100644
index 0000000..64871ce
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.legacy.transformed.expect
@@ -0,0 +1,23 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let dynamic #redirecting_factory = self::X::• in invalid-expression;
+}
+class X extends core::Object implements self::Supertype {
+  constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::X x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Supertype, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35260.dart.outline.expect
new file mode 100644
index 0000000..4f6b056
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.outline.expect
@@ -0,0 +1,24 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/regress/issue_35260.dart:6:11: Context: Previous declaration of 'Supertype'.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let dynamic #redirecting_factory = self::X::• in invalid-expression;
+}
+class X extends core::Object implements self::Supertype {
+  constructor •() → self::X
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35260.dart.strong.expect
new file mode 100644
index 0000000..25f0614
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.strong.expect
@@ -0,0 +1,38 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+// pkg/front_end/testcases/regress/issue_35260.dart:6:11: Context: Previous declaration of 'Supertype'.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:15:13: Error: Can't use 'Supertype' because it is declared more than once.
+//   X x = new Supertype();
+//             ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let dynamic #redirecting_factory = self::X::• in invalid-expression;
+}
+class X extends core::Object implements self::Supertype {
+  constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::X x = invalid-expression "pkg/front_end/testcases/regress/issue_35260.dart:15:13: Error: Can't use 'Supertype' because it is declared more than once.
+  X x = new Supertype();
+            ^" as{TypeError} self::X;
+}
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35260.dart.strong.transformed.expect
new file mode 100644
index 0000000..42e3f3a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35260.dart:7:11: Error: 'Supertype' is already declared in this scope.
+//   factory Supertype() = X;
+//           ^^^^^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class Supertype extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
+  static factory •() → self::Supertype
+    let<BottomType> #redirecting_factory = self::X::• in invalid-expression;
+}
+class X extends core::Object implements self::Supertype {
+  constructor •() → self::X
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::X x = invalid-expression "pkg/front_end/testcases/regress/issue_35260.dart:15:13: Error: Can't use 'Supertype' because it is declared more than once.
+  X x = new Supertype();
+            ^" as{TypeError} self::X;
+}
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart b/pkg/front_end/testcases/regress/issue_35266.dart
new file mode 100644
index 0000000..8564b50
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35266.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class B<T> extends C<T> {
+  B();
+  factory B.foo() = B<T>;
+  factory B.foo() = B<T>;
+}
+
+class C<K> {
+  C();
+  factory C.bar() = B<K>.foo;
+}
+
+main() {
+  new C.bar();
+}
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35266.dart.legacy.expect
new file mode 100644
index 0000000..aba6888
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.legacy.expect
@@ -0,0 +1,50 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:8:11: Error: 'B.foo' is already declared in this scope.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+// pkg/front_end/testcases/regress/issue_35266.dart:7:11: Context: Previous declaration of 'B.foo'.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Can't use 'B.foo' because it is declared more than once.
+//   factory C.bar() = B<K>.foo;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Warning: Method not found: 'B.foo'.
+//   factory C.bar() = B<K>.foo;
+//           ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:8:11: Error: 'B.foo' is already declared in this scope.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Can't use 'B.foo' because it is declared more than once.
+//   factory C.bar() = B<K>.foo;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+  static field dynamic _redirecting# = <dynamic>[self::B::foo];
+  constructor •() → self::B<self::B::T>
+    : super self::C::•()
+    ;
+  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
+    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+}
+class C<K extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::bar];
+  constructor •() → self::C<self::C::K>
+    : super core::Object::•()
+    ;
+  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+    let dynamic #redirecting_factory = "B.foo" in invalid-expression;
+}
+static method main() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#B.foo, 32, core::List::unmodifiable<dynamic>(<core::Type>[dynamic]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35266.dart.legacy.transformed.expect
new file mode 100644
index 0000000..65c513f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.legacy.transformed.expect
@@ -0,0 +1,33 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:8:11: Error: 'B.foo' is already declared in this scope.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Can't use 'B.foo' because it is declared more than once.
+//   factory C.bar() = B<K>.foo;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+  static field dynamic _redirecting# = <dynamic>[self::B::foo];
+  constructor •() → self::B<self::B::T>
+    : super self::C::•()
+    ;
+  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
+    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+}
+class C<K extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::bar];
+  constructor •() → self::C<self::C::K>
+    : super core::Object::•()
+    ;
+  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+    let dynamic #redirecting_factory = "B.foo" in invalid-expression;
+}
+static method main() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#B.foo, 32, core::List::unmodifiable<dynamic>(<core::Type>[dynamic]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35266.dart.outline.expect
new file mode 100644
index 0000000..c7faea7
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.outline.expect
@@ -0,0 +1,33 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:8:11: Error: 'B.foo' is already declared in this scope.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+// pkg/front_end/testcases/regress/issue_35266.dart:7:11: Context: Previous declaration of 'B.foo'.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Can't use 'B.foo' because it is declared more than once.
+//   factory C.bar() = B<K>.foo;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+  static field dynamic _redirecting# = <dynamic>[self::B::foo];
+  constructor •() → self::B<self::B::T>
+    ;
+  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
+    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+}
+class C<K extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::bar];
+  constructor •() → self::C<self::C::K>
+    ;
+  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+    let dynamic #redirecting_factory = "B.foo" in invalid-expression;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35266.dart.strong.expect
new file mode 100644
index 0000000..7ae1045
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.strong.expect
@@ -0,0 +1,52 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:8:11: Error: 'B.foo' is already declared in this scope.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+// pkg/front_end/testcases/regress/issue_35266.dart:7:11: Context: Previous declaration of 'B.foo'.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Can't use 'B.foo' because it is declared more than once.
+//   factory C.bar() = B<K>.foo;
+//           ^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Method not found: 'B.foo'.
+//   factory C.bar() = B<K>.foo;
+//           ^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:8:11: Error: 'B.foo' is already declared in this scope.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Can't use 'B.foo' because it is declared more than once.
+//   factory C.bar() = B<K>.foo;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+  static field dynamic _redirecting# = <dynamic>[self::B::foo];
+  constructor •() → self::B<self::B::T>
+    : super self::C::•()
+    ;
+  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
+    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+}
+class C<K extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::bar];
+  constructor •() → self::C<self::C::K>
+    : super core::Object::•()
+    ;
+  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+    let dynamic #redirecting_factory = "B.foo" in invalid-expression;
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Method not found: 'B.foo'.
+  factory C.bar() = B<K>.foo;
+          ^^^";
+}
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35266.dart.strong.transformed.expect
new file mode 100644
index 0000000..dbe98fd
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:8:11: Error: 'B.foo' is already declared in this scope.
+//   factory B.foo() = B<T>;
+//           ^^^^^
+//
+// pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Can't use 'B.foo' because it is declared more than once.
+//   factory C.bar() = B<K>.foo;
+//           ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+  static field dynamic _redirecting# = <dynamic>[self::B::foo];
+  constructor •() → self::B<self::B::T>
+    : super self::C::•()
+    ;
+  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
+    let<BottomType> #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+}
+class C<K extends core::Object = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::bar];
+  constructor •() → self::C<self::C::K>
+    : super core::Object::•()
+    ;
+  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+    let core::String #redirecting_factory = "B.foo" in invalid-expression;
+}
+static method main() → dynamic {
+  invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Method not found: 'B.foo'.
+  factory C.bar() = B<K>.foo;
+          ^^^";
+}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.expect
rename to pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.expect
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.direct.transformed.expect
rename to pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.direct.expect b/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/return_with_unknown_type_in_context.dart.direct.expect
rename to pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.expect
diff --git a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.direct.transformed.expect b/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/return_with_unknown_type_in_context.dart.direct.transformed.expect
rename to pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_kinds.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
index baa65fa..ab8ad33 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
@@ -1,18 +1,20 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'test::C::g1::U'.
-// Try changing the type of the parameter, or casting the argument to 'test::C::g1::U'.
+// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
+// Try changing the type of the parameter, or casting the argument to 'U'.
 //     this.f<U>(1.5);
 //               ^
 //
-// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:20:16: Error: Type argument 'dart.core::num' violates the corresponding type variable bound of 'C<dart.core::int>::g1'.
+// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:20:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'U' on 'C<int>.g1'.
+//  - 'C' is from 'pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   new C<int>().g1<num>();
 //                ^
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:20:16: Error: Type argument 'dart.core::num' violates the corresponding type variable bound of 'C<dart.core::int>::g1'.
+// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:20:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'U' on 'C<int>.g1'.
+//  - 'C' is from 'pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   new C<int>().g1<num>();
 //                ^
@@ -27,8 +29,8 @@
     ;
   method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
   method g1<generic-covariant-impl U extends self::C::T = self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'test::C::g1::U'.
-Try changing the type of the parameter, or casting the argument to 'test::C::g1::U'.
+    this.{self::C::f}<self::C::g1::U>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
+Try changing the type of the parameter, or casting the argument to 'U'.
     this.f<U>(1.5);
               ^" in 1.5 as{TypeError} <BottomType>);
   }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
index e1bfe11..fd9ec58 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -1,6 +1,7 @@
 // Unhandled errors:
 //
-// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:20:16: Error: Type argument 'dart.core::num' violates the corresponding type variable bound of 'C<dart.core::int>::g1'.
+// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:20:16: Error: Type argument 'num' doesn't conform to the bound 'int' of the type variable 'U' on 'C<int>.g1'.
+//  - 'C' is from 'pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart'.
 // Try changing type arguments so that they conform to the bounds.
 //   new C<int>().g1<num>();
 //                ^
@@ -15,8 +16,8 @@
     ;
   method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
   method g1<generic-covariant-impl U extends self::C::T = self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'dart.core::double' can't be assigned to the parameter type 'test::C::g1::U'.
-Try changing the type of the parameter, or casting the argument to 'test::C::g1::U'.
+    this.{self::C::f}<self::C::g1::U>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
+Try changing the type of the parameter, or casting the argument to 'U'.
     this.f<U>(1.5);
               ^" in 1.5 as{TypeError} <BottomType>);
   }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/covariant_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.type_promotion.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.type_promotion.expect
new file mode 100644
index 0000000..77d54c8
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart:11:25: Context: Write to i@310
+    for (int i = 0; o; i++) {}
+                        ^^
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.direct.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect
new file mode 100644
index 0000000..d9c1892
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart:22:44: Context: Write to b@535
+  b /*@checkReturn=B<num, (num) -> void>*/ += 1;
+                                           ^^
+pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart:23:52: Context: Write to b@535
+  var x = b /*@checkReturn=B<num, (num) -> void>*/ += 2;
+                                                   ^^
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 2aa0e56..d811656 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -1,12 +1,12 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) → dart.core::num' can't be assigned to a variable of type '(dart.core::int) → dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) → dart.core::int'.
+// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
 //   d.value /*@checkReturn=(num) -> num*/ += 1;
 //                                         ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) → dart.core::num' can't be assigned to a variable of type '(dart.core::int) → dart.core::int'.
-// Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) → dart.core::int'.
+// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
 //     d.value /*@checkReturn=(num) -> num*/ += 1;
 //                                           ^
 
@@ -53,15 +53,15 @@
   return 2;
 static method main() → void {
   self::D d = new self::D::•(new self::C::•<core::num>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
+  let final self::D #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
   d.value /*@checkReturn=(num) -> num*/ += 1;
                                         ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num) as{TypeError} (core::int) → core::int;
   self::expect(d.{self::D::setValue}(0), 1);
   d = new self::D::•(new self::C::•<core::num>(self::numToNum));
   self::expectTypeError(() → core::Null {
-    let final self::D #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
+    let final self::D #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
     d.value /*@checkReturn=(num) -> num*/ += 1;
                                           ^" in (#t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num) as{TypeError} (core::int) → core::int;
   });
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 740f0f4..8b14a49 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -41,15 +41,15 @@
   return 2;
 static method main() → void {
   self::D d = new self::D::•(new self::C::•<core::num>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
+  let final self::D #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
   d.value /*@checkReturn=(num) -> num*/ += 1;
                                         ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num) as{TypeError} (core::int) → core::int;
   self::expect(d.{self::D::setValue}(0), 1);
   d = new self::D::•(new self::C::•<core::num>(self::numToNum));
   self::expectTypeError(() → core::Null {
-    let final self::D #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type '(dart.core::num) \u8594 dart.core::num' can't be assigned to a variable of type '(dart.core::int) \u8594 dart.core::int'.
-Try changing the type of the left hand side, or casting the right hand side to '(dart.core::int) \u8594 dart.core::int'.
+    let final self::D #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
     d.value /*@checkReturn=(num) -> num*/ += 1;
                                           ^" in (#t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num) as{TypeError} (core::int) → core::int;
   });
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.type_promotion.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.type_promotion.expect
new file mode 100644
index 0000000..52a0161
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:51:5: Context: Write to d@1119
+  d = new D(new C(numToNum));
+    ^
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
index 61aebae..1cba00a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
@@ -1,22 +1,26 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) → void>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) → void>'.
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+//  - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
 //   c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
 //                                                 ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) → void>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) → void>'.
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+//  - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
 //   var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
 //                                                         ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) → void>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) → void>'.
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+//  - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
 //   c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
 //                                                  ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) → void>'.
-// Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) → void>'.
+// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+//  - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+// Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
 //   var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
 //                                                          ^
 
@@ -41,20 +45,24 @@
   set x(self::B<(self::C::T) → void> value) → void {}
 }
 static method test(self::C<core::num> c) → void {
-  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
+  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
   c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
                                                 ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void>);
-  self::B<(core::num) → void> y = let final self::C<core::num> #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
+  self::B<(core::num) → void> y = let final self::C<core::num> #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
   var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
                                                         ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void>);
-  let final self::C<core::num> #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t5.{self::C::x} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
+  let final self::C<core::num> #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t5.{self::C::x} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
   c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
                                                  ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void> : null;
-  self::B<core::Object> z = let final self::C<core::num> #t7 = c in let final dynamic #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t8.{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
+  self::B<core::Object> z = let final self::C<core::num> #t7 = c in let final dynamic #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t8.{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
   var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
                                                          ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void> : #t8;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
index d2500ea..b7a05a6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
@@ -19,20 +19,24 @@
   set x(self::B<(self::C::T) → void> value) → void {}
 }
 static method test(self::C<core::num> c) → void {
-  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
+  let final self::C<core::num> #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
   c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
                                                 ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void>);
-  self::B<(core::num) → void> y = let final self::C<core::num> #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
+  self::B<(core::num) → void> y = let final self::C<core::num> #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
   var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
                                                         ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void>);
-  let final self::C<core::num> #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t5.{self::C::x} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
+  let final self::C<core::num> #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t5.{self::C::x} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
   c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
                                                  ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void> : null;
-  self::B<core::Object> z = let final self::C<core::num> #t7 = c in let final self::B<(core::num) → void> #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t8.{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'test::B<dart.core::num>' can't be assigned to a variable of type 'test::B<(dart.core::num) \u8594 void>'.
-Try changing the type of the left hand side, or casting the right hand side to 'test::B<(dart.core::num) \u8594 void>'.
+  self::B<core::Object> z = let final self::C<core::num> #t7 = c in let final self::B<(core::num) → void> #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t8.{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+ - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
+Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
   var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
                                                          ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void> : #t8;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index 4932edda..70f2971 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -1,7 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Error: The return type of the method 'M::y' is dart.core::int, which does not match the return type of the overridden method (dart.core::Object).
-// Change to a subtype of dart.core::Object.
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Error: The return type of the method 'M.y' is 'int', which does not match the return type of the overridden method, 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Change to a subtype of 'Object'.
 //   int y;
 //       ^
 // pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:43:12: Context: This is the overridden method ('y').
@@ -13,8 +14,9 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Error: The return type of the method 'M::y' is dart.core::int, which does not match the return type of the overridden method (dart.core::Object).
-// Change to a subtype of dart.core::Object.
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart:48:7: Error: The return type of the method 'M.y' is 'int', which does not match the return type of the overridden method, 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Change to a subtype of 'Object'.
 //   int y;
 //       ^
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect
deleted file mode 100644
index dc8bb3d..0000000
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  get x() → (core::int) → void {
-    throw "Should not be reached";
-  }
-  set x(core::Object value) → void {
-    throw "Should not be reached";
-  }
-}
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
-    : super core::Object::•()
-    ;
-  abstract get x() → (self::I::T) → void;
-  abstract set x(core::Object value) → void;
-}
-abstract class M<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::M<self::M::T>
-    : super core::Object::•()
-    ;
-  get x() → self::M::T
-    return this.{self::M::f}();
-  set x(core::Object value) → void {
-    throw "Should not be reached";
-  }
-  abstract method f() → self::M::T;
-}
-abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
-  synthetic constructor •() → self::C<self::C::T>
-    : super self::B::•()
-    ;
-}
-class D extends self::C<core::int> {
-  synthetic constructor •() → self::D
-    : super self::B::•()
-    ;
-  method f() → (core::int) → void
-    return (core::int i) → dynamic {
-      self::expect(i, 1);
-    };
-}
-static method expectTypeError(() → void callback) → void {
-  try {
-    callback.call();
-    throw "Expected TypeError, did not occur";
-  }
-  on core::TypeError catch(no-exception-var) {
-  }
-}
-static method expect(core::Object value, core::Object expected) → void {
-  if(!value.==(expected)) {
-    throw "Expected ${expected}, got ${value}";
-  }
-}
-static method test(self::I<core::Object> iObj, self::I<core::int> iInt) → void {
-  self::expectTypeError(() → dynamic {
-    dynamic x = iObj.x;
-  });
-  dynamic x = iInt.x;
-  x.call(1);
-}
-static method main() → void {
-  dynamic d = new self::D::•();
-  self::test(d, d);
-}
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect
deleted file mode 100644
index f47ed24..0000000
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.direct.transformed.expect
+++ /dev/null
@@ -1,78 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  get x() → (core::int) → void {
-    throw "Should not be reached";
-  }
-  set x(core::Object value) → void {
-    throw "Should not be reached";
-  }
-}
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
-    : super core::Object::•()
-    ;
-  abstract get x() → (self::I::T) → void;
-  abstract set x(core::Object value) → void;
-}
-abstract class M<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::M<self::M::T>
-    : super core::Object::•()
-    ;
-  get x() → self::M::T
-    return this.{self::M::f}();
-  set x(core::Object value) → void {
-    throw "Should not be reached";
-  }
-  abstract method f() → self::M::T;
-}
-abstract class C<T extends core::Object = dynamic> extends self::B implements self::I<self::C::T>, self::M<(self::C::T) → void> {
-  synthetic constructor •() → self::C<self::C::T>
-    : super self::B::•()
-    ;
-  get x() → (self::C::T) → void
-    return this.{self::M::f}();
-  set x(core::Object value) → void {
-    throw "Should not be reached";
-  }
-  abstract method f() → (self::C::T) → void;
-}
-class D extends self::C<core::int> {
-  synthetic constructor •() → self::D
-    : super self::B::•()
-    ;
-  method f() → (core::int) → void
-    return (core::int i) → dynamic {
-      self::expect(i, 1);
-    };
-}
-static method expectTypeError(() → void callback) → void {
-  try {
-    callback.call();
-    throw "Expected TypeError, did not occur";
-  }
-  on core::TypeError catch(no-exception-var) {
-  }
-}
-static method expect(core::Object value, core::Object expected) → void {
-  if(!value.==(expected)) {
-    throw "Expected ${expected}, got ${value}";
-  }
-}
-static method test(self::I<core::Object> iObj, self::I<core::int> iInt) → void {
-  self::expectTypeError(() → dynamic {
-    dynamic x = iObj.x;
-  });
-  dynamic x = iInt.x;
-  x.call(1);
-}
-static method main() → void {
-  dynamic d = new self::D::•();
-  self::test(d, d);
-}
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.legacy.expect
new file mode 100644
index 0000000..0546d0e
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.legacy.expect
@@ -0,0 +1,72 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  get x() → (core::int) → void {
+    throw "Should not be reached";
+  }
+  set x(core::Object value) → void {
+    throw "Should not be reached";
+  }
+}
+abstract class I<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T>
+    : super core::Object::•()
+    ;
+  abstract get x() → (self::I::T) → void;
+  abstract set x(core::Object value) → void;
+}
+abstract class M<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::M<self::M::T>
+    : super core::Object::•()
+    ;
+  get x() → self::M::T
+    return this.{self::M::f}();
+  set x(core::Object value) → void {
+    throw "Should not be reached";
+  }
+  abstract method f() → self::M::T;
+}
+abstract class C<T extends core::Object = dynamic> = self::B with self::M<(self::C::T) → void> implements self::I<self::C::T> {
+  synthetic constructor •() → self::C<self::C::T>
+    : super self::B::•()
+    ;
+}
+class D extends self::C<core::int> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method f() → (core::int) → void
+    return (core::int i) → dynamic {
+      self::expect(i, 1);
+    };
+}
+static method expectTypeError(() → void callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method expect(core::Object value, core::Object expected) → void {
+  if(!value.==(expected)) {
+    throw "Expected ${expected}, got ${value}";
+  }
+}
+static method test(self::I<core::Object> iObj, self::I<core::int> iInt) → void {
+  self::expectTypeError(() → dynamic {
+    dynamic x = iObj.x;
+  });
+  dynamic x = iInt.x;
+  x.call(1);
+}
+static method main() → void {
+  dynamic d = new self::D::•();
+  self::test(d, d);
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.legacy.transformed.expect
new file mode 100644
index 0000000..839a7dc
--- /dev/null
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.legacy.transformed.expect
@@ -0,0 +1,78 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F<T extends core::Object = dynamic> = (T) → void;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  get x() → (core::int) → void {
+    throw "Should not be reached";
+  }
+  set x(core::Object value) → void {
+    throw "Should not be reached";
+  }
+}
+abstract class I<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T>
+    : super core::Object::•()
+    ;
+  abstract get x() → (self::I::T) → void;
+  abstract set x(core::Object value) → void;
+}
+abstract class M<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::M<self::M::T>
+    : super core::Object::•()
+    ;
+  get x() → self::M::T
+    return this.{self::M::f}();
+  set x(core::Object value) → void {
+    throw "Should not be reached";
+  }
+  abstract method f() → self::M::T;
+}
+abstract class C<T extends core::Object = dynamic> extends self::B implements self::I<self::C::T>, self::M<(self::C::T) → void> {
+  synthetic constructor •() → self::C<self::C::T>
+    : super self::B::•()
+    ;
+  get x() → (self::C::T) → void
+    return this.{self::M::f}();
+  set x(core::Object value) → void {
+    throw "Should not be reached";
+  }
+  abstract method f() → (self::C::T) → void;
+}
+class D extends self::C<core::int> {
+  synthetic constructor •() → self::D
+    : super self::C::•()
+    ;
+  method f() → (core::int) → void
+    return (core::int i) → dynamic {
+      self::expect(i, 1);
+    };
+}
+static method expectTypeError(() → void callback) → void {
+  try {
+    callback.call();
+    throw "Expected TypeError, did not occur";
+  }
+  on core::TypeError catch(no-exception-var) {
+  }
+}
+static method expect(core::Object value, core::Object expected) → void {
+  if(!value.==(expected)) {
+    throw "Expected ${expected}, got ${value}";
+  }
+}
+static method test(self::I<core::Object> iObj, self::I<core::int> iInt) → void {
+  self::expectTypeError(() → dynamic {
+    dynamic x = iObj.x;
+  });
+  dynamic x = iInt.x;
+  x.call(1);
+}
+static method main() → void {
+  dynamic d = new self::D::•();
+  self::test(d, d);
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
index e47b16c..45084df 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart.strong.expect
@@ -1,7 +1,7 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:39:9: Error: The return type of the method 'M::x' is (test::C::T) → void, which does not match the return type of the overridden method ((dart.core::int) → void).
-// Change to a subtype of (dart.core::int) → void.
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:39:9: Error: The return type of the method 'M.x' is 'void Function(T)', which does not match the return type of the overridden method, 'void Function(int)'.
+// Change to a subtype of 'void Function(int)'.
 //   T get x => f();
 //         ^
 // pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:24:14: Context: This is the overridden method ('x').
@@ -13,8 +13,8 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:39:9: Error: The return type of the method 'M::x' is (test::C::T) → void, which does not match the return type of the overridden method ((dart.core::int) → void).
-// Change to a subtype of (dart.core::int) → void.
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_getter.dart:39:9: Error: The return type of the method 'M.x' is 'void Function(T)', which does not match the return type of the overridden method, 'void Function(int)'.
+// Change to a subtype of 'void Function(int)'.
 //   T get x => f();
 //         ^
 
@@ -59,7 +59,7 @@
 }
 class D extends self::C<core::int> {
   synthetic constructor •() → self::D
-    : super self::B::•()
+    : super self::C::•()
     ;
   method f() → (core::int) → void
     return (core::int i) → core::Null {
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
index 923fd4c..92e6517 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
@@ -1,7 +1,8 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M::y' has type dart.core::int, which does not match the corresponding type in the overridden method (dart.core::Object).
-// Change to a supertype of dart.core::Object (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M.y' has type 'int', which does not match the corresponding type in the overridden method, 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Change to a supertype of 'Object', or, for a covariant parameter, a subtype.
 //   void set y(int value) {
 //                  ^
 // pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:43:12: Context: This is the overridden method ('y').
@@ -13,8 +14,9 @@
 
 // Unhandled errors:
 //
-// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M::y' has type dart.core::int, which does not match the corresponding type in the overridden method (dart.core::Object).
-// Change to a supertype of dart.core::Object (or, for a covariant parameter, a subtype).
+// pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart:53:18: Error: The parameter 'value' of the method 'M.y' has type 'int', which does not match the corresponding type in the overridden method, 'Object'.
+//  - 'Object' is from 'dart:core'.
+// Change to a supertype of 'Object', or, for a covariant parameter, a subtype.
 //   void set y(int value) {
 //                  ^
 
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_contravariant_from_class.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_class.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantInterface_from_class.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.direct.transformed.expect
rename to pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart
new file mode 100644
index 0000000..15f76e8
--- /dev/null
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async' show FutureOr;
+
+import 'dart:collection' show LinkedHashMap, LinkedHashSet;
+
+main() async {
+  Map<int, bool> m = {};
+  Set<int> s = {};
+  Iterable<int> i = {};
+  LinkedHashSet<int> lhs = {};
+  LinkedHashMap<int, bool> lhm = {};
+
+  Map<int, bool> fm = await mapfun();
+  Set<int> fs = await setfun();
+  Iterable<int> fi = await iterablefun();
+  LinkedHashSet<int> flhs = await lhsfun();
+  LinkedHashMap<int, bool> flhm = await lhmfun();
+
+  Map<int, bool> fm2 = await mapfun2();
+  Set<int> fs2 = await setfun2();
+  Iterable<int> fi2 = await iterablefun2();
+  LinkedHashSet<int> flhs2 = await lhsfun2();
+  LinkedHashMap<int, bool> flhm2 = await lhmfun2();
+}
+
+Future<Map<int, bool>> mapfun() async => {};
+Future<Set<int>> setfun() async => {};
+Future<Iterable<int>> iterablefun() async => {};
+Future<LinkedHashSet<int>> lhsfun() async => {};
+Future<LinkedHashMap<int, bool>> lhmfun() async => {};
+
+FutureOr<Map<int, bool>> mapfun2() => {};
+FutureOr<Set<int>> setfun2() => {};
+FutureOr<Iterable<int>> iterablefun2() => {};
+FutureOr<LinkedHashSet<int>> lhsfun2() => {};
+FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.expect
new file mode 100644
index 0000000..932c7ea
--- /dev/null
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.expect
@@ -0,0 +1,43 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+  core::Map<core::int, core::bool> m = <dynamic, dynamic>{};
+  core::Set<core::int> s = <dynamic, dynamic>{};
+  core::Iterable<core::int> i = <dynamic, dynamic>{};
+  col::LinkedHashSet<core::int> lhs = <dynamic, dynamic>{};
+  col::LinkedHashMap<core::int, core::bool> lhm = <dynamic, dynamic>{};
+  core::Map<core::int, core::bool> fm = await self::mapfun();
+  core::Set<core::int> fs = await self::setfun();
+  core::Iterable<core::int> fi = await self::iterablefun();
+  col::LinkedHashSet<core::int> flhs = await self::lhsfun();
+  col::LinkedHashMap<core::int, core::bool> flhm = await self::lhmfun();
+  core::Map<core::int, core::bool> fm2 = await self::mapfun2();
+  core::Set<core::int> fs2 = await self::setfun2();
+  core::Iterable<core::int> fi2 = await self::iterablefun2();
+  col::LinkedHashSet<core::int> flhs2 = await self::lhsfun2();
+  col::LinkedHashMap<core::int, core::bool> flhm2 = await self::lhmfun2();
+}
+static method mapfun() → asy::Future<core::Map<core::int, core::bool>> async 
+  return <dynamic, dynamic>{};
+static method setfun() → asy::Future<core::Set<core::int>> async 
+  return <dynamic, dynamic>{};
+static method iterablefun() → asy::Future<core::Iterable<core::int>> async 
+  return <dynamic, dynamic>{};
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>> async 
+  return <dynamic, dynamic>{};
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>> async 
+  return <dynamic, dynamic>{};
+static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
+  return <dynamic, dynamic>{};
+static method setfun2() → asy::FutureOr<core::Set<core::int>>
+  return <dynamic, dynamic>{};
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
+  return <dynamic, dynamic>{};
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+  return <dynamic, dynamic>{};
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+  return <dynamic, dynamic>{};
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.transformed.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7ed15e3
--- /dev/null
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.transformed.expect
@@ -0,0 +1,202 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::Map<core::int, core::bool> m = <dynamic, dynamic>{};
+        core::Set<core::int> s = <dynamic, dynamic>{};
+        core::Iterable<core::int> i = <dynamic, dynamic>{};
+        col::LinkedHashSet<core::int> lhs = <dynamic, dynamic>{};
+        col::LinkedHashMap<core::int, core::bool> lhm = <dynamic, dynamic>{};
+        [yield] let dynamic #t1 = asy::_awaitHelper(self::mapfun(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Map<core::int, core::bool> fm = :result;
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::setfun(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Set<core::int> fs = :result;
+        [yield] let dynamic #t3 = asy::_awaitHelper(self::iterablefun(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Iterable<core::int> fi = :result;
+        [yield] let dynamic #t4 = asy::_awaitHelper(self::lhsfun(), :async_op_then, :async_op_error, :async_op) in null;
+        col::LinkedHashSet<core::int> flhs = :result;
+        [yield] let dynamic #t5 = asy::_awaitHelper(self::lhmfun(), :async_op_then, :async_op_error, :async_op) in null;
+        col::LinkedHashMap<core::int, core::bool> flhm = :result;
+        [yield] let dynamic #t6 = asy::_awaitHelper(self::mapfun2(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Map<core::int, core::bool> fm2 = :result;
+        [yield] let dynamic #t7 = asy::_awaitHelper(self::setfun2(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Set<core::int> fs2 = :result;
+        [yield] let dynamic #t8 = asy::_awaitHelper(self::iterablefun2(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Iterable<core::int> fi2 = :result;
+        [yield] let dynamic #t9 = asy::_awaitHelper(self::lhsfun2(), :async_op_then, :async_op_error, :async_op) in null;
+        col::LinkedHashSet<core::int> flhs2 = :result;
+        [yield] let dynamic #t10 = asy::_awaitHelper(self::lhmfun2(), :async_op_then, :async_op_error, :async_op) in null;
+        col::LinkedHashMap<core::int, core::bool> flhm2 = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method mapfun() → asy::Future<core::Map<core::int, core::bool>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Map<core::int, core::bool>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Map<core::int, core::bool>>();
+  asy::FutureOr<core::Map<core::int, core::bool>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = <dynamic, dynamic>{};
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method setfun() → asy::Future<core::Set<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Set<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Set<core::int>>();
+  asy::FutureOr<core::Set<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        :return_value = <dynamic, dynamic>{};
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method iterablefun() → asy::Future<core::Iterable<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Iterable<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Iterable<core::int>>();
+  asy::FutureOr<core::Iterable<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L4:
+      {
+        :return_value = <dynamic, dynamic>{};
+        break #L4;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<col::LinkedHashSet<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashSet<core::int>>();
+  asy::FutureOr<col::LinkedHashSet<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L5:
+      {
+        :return_value = <dynamic, dynamic>{};
+        break #L5;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<col::LinkedHashMap<core::int, core::bool>> :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashMap<core::int, core::bool>>();
+  asy::FutureOr<col::LinkedHashMap<core::int, core::bool>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L6:
+      {
+        :return_value = <dynamic, dynamic>{};
+        break #L6;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
+  return <dynamic, dynamic>{};
+static method setfun2() → asy::FutureOr<core::Set<core::int>>
+  return <dynamic, dynamic>{};
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
+  return <dynamic, dynamic>{};
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+  return <dynamic, dynamic>{};
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+  return <dynamic, dynamic>{};
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.outline.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.outline.expect
new file mode 100644
index 0000000..4c67211
--- /dev/null
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.outline.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic
+  ;
+static method mapfun() → asy::Future<core::Map<core::int, core::bool>>
+  ;
+static method setfun() → asy::Future<core::Set<core::int>>
+  ;
+static method iterablefun() → asy::Future<core::Iterable<core::int>>
+  ;
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>>
+  ;
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>>
+  ;
+static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
+  ;
+static method setfun2() → asy::FutureOr<core::Set<core::int>>
+  ;
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
+  ;
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+  ;
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+  ;
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
new file mode 100644
index 0000000..e5e3a65
--- /dev/null
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
@@ -0,0 +1,97 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'LinkedHashMap' is from 'dart:collection'.
+// Change the type of the map literal or the context in which it is used.
+//   LinkedHashMap<int, bool> lhm = {};
+//                                  ^
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:33:52: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'LinkedHashMap' is from 'dart:collection'.
+// Change the type of the map literal or the context in which it is used.
+// Future<LinkedHashMap<int, bool>> lhmfun() async => {};
+//                                                    ^
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
+//  - 'Set' is from 'dart:core'.
+//  - 'FutureOr' is from 'dart:async'.
+//  - 'LinkedHashSet' is from 'dart:collection'.
+// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
+// FutureOr<LinkedHashSet<int>> lhsfun2() => {};
+//                                           ^
+//
+// pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
+//  - 'Map' is from 'dart:core'.
+//  - 'FutureOr' is from 'dart:async'.
+//  - 'LinkedHashMap' is from 'dart:collection'.
+// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
+// FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
+//                                                 ^
+
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+  core::Map<core::int, core::bool> m = <core::int, core::bool>{};
+  core::Set<core::int> s = let final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>() in #t1;
+  core::Iterable<core::int> i = let final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>() in #t2;
+  col::LinkedHashSet<core::int> lhs = (let final core::Set<dynamic> #t3 = col::LinkedHashSet::•<dynamic>() in #t3) as{TypeError} col::LinkedHashSet<core::int>;
+  col::LinkedHashMap<core::int, core::bool> lhm = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
+ - 'Map' is from 'dart:core'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+Change the type of the map literal or the context in which it is used.
+  LinkedHashMap<int, bool> lhm = {};
+                                 ^" in <dynamic, dynamic>{};
+  core::Map<core::int, core::bool> fm = await self::mapfun();
+  core::Set<core::int> fs = await self::setfun();
+  core::Iterable<core::int> fi = await self::iterablefun();
+  col::LinkedHashSet<core::int> flhs = await self::lhsfun();
+  col::LinkedHashMap<core::int, core::bool> flhm = await self::lhmfun();
+  core::Map<core::int, core::bool> fm2 = await self::mapfun2();
+  core::Set<core::int> fs2 = await self::setfun2();
+  core::Iterable<core::int> fi2 = await self::iterablefun2();
+  col::LinkedHashSet<core::int> flhs2 = await self::lhsfun2();
+  col::LinkedHashMap<core::int, core::bool> flhm2 = await self::lhmfun2();
+}
+static method mapfun() → asy::Future<core::Map<core::int, core::bool>> async 
+  return <core::int, core::bool>{};
+static method setfun() → asy::Future<core::Set<core::int>> async 
+  return let final core::Set<core::int> #t5 = col::LinkedHashSet::•<core::int>() in #t5;
+static method iterablefun() → asy::Future<core::Iterable<core::int>> async 
+  return let final core::Set<core::int> #t6 = col::LinkedHashSet::•<core::int>() in #t6;
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>> async 
+  return (let final core::Set<dynamic> #t7 = col::LinkedHashSet::•<dynamic>() in #t7) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int>>;
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>> async 
+  return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:33:52: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
+ - 'Map' is from 'dart:core'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+Change the type of the map literal or the context in which it is used.
+Future<LinkedHashMap<int, bool>> lhmfun() async => {};
+                                                   ^" in <dynamic, dynamic>{};
+static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
+  return <core::int, core::bool>{};
+static method setfun2() → asy::FutureOr<core::Set<core::int>>
+  return let final core::Set<core::int> #t9 = col::LinkedHashSet::•<core::int>() in #t9;
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
+  return let final core::Set<core::int> #t10 = col::LinkedHashSet::•<core::int>() in #t10;
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+  return let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
+ - 'Set' is from 'dart:core'.
+ - 'FutureOr' is from 'dart:async'.
+ - 'LinkedHashSet' is from 'dart:collection'.
+Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
+FutureOr<LinkedHashSet<int>> lhsfun2() => {};
+                                          ^" in (let final core::Set<dynamic> #t12 = col::LinkedHashSet::•<dynamic>() in #t12) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int>>;
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+  return let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
+ - 'Map' is from 'dart:core'.
+ - 'FutureOr' is from 'dart:async'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
+FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
+                                                ^" in <dynamic, dynamic>{} as{TypeError} asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>;
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
new file mode 100644
index 0000000..9b60cf8
--- /dev/null
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
@@ -0,0 +1,224 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::Map<core::int, core::bool> m = <core::int, core::bool>{};
+        core::Set<core::int> s = let final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>() in #t1;
+        core::Iterable<core::int> i = let final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>() in #t2;
+        col::LinkedHashSet<core::int> lhs = (let final core::Set<dynamic> #t3 = col::LinkedHashSet::•<dynamic>() in #t3) as{TypeError} col::LinkedHashSet<core::int>;
+        col::LinkedHashMap<core::int, core::bool> lhm = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
+ - 'Map' is from 'dart:core'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+Change the type of the map literal or the context in which it is used.
+  LinkedHashMap<int, bool> lhm = {};
+                                 ^" in <dynamic, dynamic>{};
+        [yield] let dynamic #t5 = asy::_awaitHelper(self::mapfun(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Map<core::int, core::bool> fm = :result;
+        [yield] let dynamic #t6 = asy::_awaitHelper(self::setfun(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Set<core::int> fs = :result;
+        [yield] let dynamic #t7 = asy::_awaitHelper(self::iterablefun(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Iterable<core::int> fi = :result;
+        [yield] let dynamic #t8 = asy::_awaitHelper(self::lhsfun(), :async_op_then, :async_op_error, :async_op) in null;
+        col::LinkedHashSet<core::int> flhs = :result;
+        [yield] let dynamic #t9 = asy::_awaitHelper(self::lhmfun(), :async_op_then, :async_op_error, :async_op) in null;
+        col::LinkedHashMap<core::int, core::bool> flhm = :result;
+        [yield] let dynamic #t10 = asy::_awaitHelper(self::mapfun2(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Map<core::int, core::bool> fm2 = :result;
+        [yield] let dynamic #t11 = asy::_awaitHelper(self::setfun2(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Set<core::int> fs2 = :result;
+        [yield] let dynamic #t12 = asy::_awaitHelper(self::iterablefun2(), :async_op_then, :async_op_error, :async_op) in null;
+        core::Iterable<core::int> fi2 = :result;
+        [yield] let dynamic #t13 = asy::_awaitHelper(self::lhsfun2(), :async_op_then, :async_op_error, :async_op) in null;
+        col::LinkedHashSet<core::int> flhs2 = :result;
+        [yield] let dynamic #t14 = asy::_awaitHelper(self::lhmfun2(), :async_op_then, :async_op_error, :async_op) in null;
+        col::LinkedHashMap<core::int, core::bool> flhm2 = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method mapfun() → asy::Future<core::Map<core::int, core::bool>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Map<core::int, core::bool>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Map<core::int, core::bool>>();
+  asy::FutureOr<core::Map<core::int, core::bool>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = <core::int, core::bool>{};
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method setfun() → asy::Future<core::Set<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Set<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Set<core::int>>();
+  asy::FutureOr<core::Set<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        :return_value = let final core::Set<core::int> #t15 = col::LinkedHashSet::•<core::int>() in #t15;
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method iterablefun() → asy::Future<core::Iterable<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Iterable<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Iterable<core::int>>();
+  asy::FutureOr<core::Iterable<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L4:
+      {
+        :return_value = let final core::Set<core::int> #t16 = col::LinkedHashSet::•<core::int>() in #t16;
+        break #L4;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<col::LinkedHashSet<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashSet<core::int>>();
+  asy::FutureOr<col::LinkedHashSet<core::int>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L5:
+      {
+        :return_value = (let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in #t17) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int>>;
+        break #L5;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>> /* originally async */ {
+  final asy::_AsyncAwaitCompleter<col::LinkedHashMap<core::int, core::bool>> :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashMap<core::int, core::bool>>();
+  asy::FutureOr<col::LinkedHashMap<core::int, core::bool>> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L6:
+      {
+        :return_value = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:33:52: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
+ - 'Map' is from 'dart:core'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+Change the type of the map literal or the context in which it is used.
+Future<LinkedHashMap<int, bool>> lhmfun() async => {};
+                                                   ^" in <dynamic, dynamic>{};
+        break #L6;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
+  return <core::int, core::bool>{};
+static method setfun2() → asy::FutureOr<core::Set<core::int>>
+  return let final core::Set<core::int> #t19 = col::LinkedHashSet::•<core::int>() in #t19;
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
+  return let final core::Set<core::int> #t20 = col::LinkedHashSet::•<core::int>() in #t20;
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+  return let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
+ - 'Set' is from 'dart:core'.
+ - 'FutureOr' is from 'dart:async'.
+ - 'LinkedHashSet' is from 'dart:collection'.
+Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
+FutureOr<LinkedHashSet<int>> lhsfun2() => {};
+                                          ^" in (let final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>() in #t22) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int>>;
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+  return let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
+ - 'Map' is from 'dart:core'.
+ - 'FutureOr' is from 'dart:async'.
+ - 'LinkedHashMap' is from 'dart:collection'.
+Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
+FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
+                                                ^" in <dynamic, dynamic>{} as{TypeError} asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>;
diff --git a/pkg/front_end/testcases/statements.dart.direct.expect b/pkg/front_end/testcases/statements.dart.direct.expect
deleted file mode 100644
index 440b92a..0000000
--- a/pkg/front_end/testcases/statements.dart.direct.expect
+++ /dev/null
@@ -1,151 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo() → dynamic {
-  try {
-    return;
-  }
-  finally {
-    core::print("Hello from finally block!");
-  }
-}
-static method bar() → dynamic async {
-  await for (dynamic x in <dynamic>[]) {
-    yield x;
-    yield* x;
-  }
-}
-static method main() → dynamic {
-  do {
-    core::print("Hello from do-while!");
-  }
-  while (false)
-  do {
-    dynamic x = core::print("Hello from do-while!");
-  }
-  while (false)
-  for (core::String s in <dynamic>["Hello from for-in!"]) {
-    core::print(s);
-  }
-  for (core::String s in <dynamic>["Hello from for-in without block!"])
-    core::print(s);
-  dynamic s;
-  for (final dynamic #t1 in <dynamic>["Hello from for-in without decl!"]) {
-    s = #t1;
-    core::print(s);
-  }
-  for (final dynamic #t2 in <dynamic>["Hello from for-in without decl and block!"]) {
-    s = #t2;
-    core::print(s);
-  }
-  core::print("Hello from labeled statement!");
-  try {
-    try {
-      throw "Hello from rethrow!";
-    }
-    on dynamic catch(final dynamic e) {
-      rethrow;
-    }
-  }
-  on dynamic catch(final dynamic e) {
-    core::print(e);
-  }
-  self::foo();
-  core::bool done = false;
-  while (!done) {
-    done = true;
-    core::print("Hello from while!");
-  }
-  ;
-  assert(true);
-  assert(true, "Hello from assert!");
-  try {
-    assert(false, "Hello from assert!");
-  }
-  on dynamic catch(final dynamic e) {
-    core::print(e);
-  }
-  #L1:
-  switch(1) {
-    #L2:
-    case 1:
-    case 2:
-      {
-        core::print("Hello from switch case!");
-        break #L1;
-      }
-    #L3:
-    default:
-      {
-        break #L1;
-      }
-  }
-  #L4:
-  switch(4) {
-    #L5:
-    case 2:
-      {
-        core::print("Hello from case 2!");
-        break #L4;
-      }
-    #L6:
-    case 1:
-      {
-        core::print("Hello from case 1!");
-        continue #L5;
-      }
-    #L7:
-    case 0:
-      {
-        core::print("Hello from case 0!");
-        continue #L6;
-      }
-    #L8:
-    case 4:
-      {
-        core::print("Hello from case 4!");
-        continue #L9;
-      }
-    #L9:
-    default:
-      {
-        continue #L7;
-      }
-  }
-  #L10:
-  switch(4) {
-    #L11:
-    case 1:
-      {
-        core::print("Hello from next case 1");
-        break #L10;
-      }
-    #L12:
-    default:
-      {
-        continue #L11;
-      }
-  }
-  core::int i = 0;
-  #L13:
-  do
-    #L14:
-    {
-      core::print("Hello from do-while!");
-      if((i = i.+(1)).<(3))
-        break #L14;
-      break #L13;
-    }
-  while (true)
-  i = 0;
-  #L15:
-  while (true)
-    #L16:
-    {
-      core::print("Hello from while!");
-      if((i = i.+(1)).<(3))
-        break #L16;
-      break #L15;
-    }
-}
diff --git a/pkg/front_end/testcases/statements.dart.legacy.expect b/pkg/front_end/testcases/statements.dart.legacy.expect
new file mode 100644
index 0000000..533d647
--- /dev/null
+++ b/pkg/front_end/testcases/statements.dart.legacy.expect
@@ -0,0 +1,171 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield* x;
+//     ^^^^^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield* x;
+//     ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  try {
+    return;
+  }
+  finally {
+    core::print("Hello from finally block!");
+  }
+}
+static method bar() → dynamic async {
+  await for (dynamic x in <dynamic>[]) {
+    yield x;
+    yield* x;
+  }
+}
+static method main() → dynamic {
+  do {
+    core::print("Hello from do-while!");
+  }
+  while (false)
+  do {
+    dynamic x = core::print("Hello from do-while!");
+  }
+  while (false)
+  for (core::String s in <dynamic>["Hello from for-in!"]) {
+    core::print(s);
+  }
+  for (core::String s in <dynamic>["Hello from for-in without block!"])
+    core::print(s);
+  dynamic s;
+  for (final dynamic #t1 in <dynamic>["Hello from for-in without decl!"]) {
+    s = #t1;
+    core::print(s);
+  }
+  for (final dynamic #t2 in <dynamic>["Hello from for-in without decl and block!"]) {
+    s = #t2;
+    core::print(s);
+  }
+  core::print("Hello from labeled statement!");
+  try {
+    try {
+      throw "Hello from rethrow!";
+    }
+    on dynamic catch(final dynamic e) {
+      rethrow;
+    }
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+  }
+  self::foo();
+  core::bool done = false;
+  while (!done) {
+    done = true;
+    core::print("Hello from while!");
+  }
+  ;
+  assert(true);
+  assert(true, "Hello from assert!");
+  try {
+    assert(false, "Hello from assert!");
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+  }
+  #L1:
+  switch(1) {
+    #L2:
+    case 1:
+    case 2:
+      {
+        core::print("Hello from switch case!");
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  #L4:
+  switch(4) {
+    #L5:
+    case 2:
+      {
+        core::print("Hello from case 2!");
+        break #L4;
+      }
+    #L6:
+    case 1:
+      {
+        core::print("Hello from case 1!");
+        continue #L5;
+      }
+    #L7:
+    case 0:
+      {
+        core::print("Hello from case 0!");
+        continue #L6;
+      }
+    #L8:
+    case 4:
+      {
+        core::print("Hello from case 4!");
+        continue #L9;
+      }
+    #L9:
+    default:
+      {
+        continue #L7;
+      }
+  }
+  #L10:
+  switch(4) {
+    #L11:
+    case 1:
+      {
+        core::print("Hello from next case 1");
+        break #L10;
+      }
+    #L12:
+    default:
+      {
+        continue #L11;
+      }
+  }
+  core::int i = 0;
+  #L13:
+  do
+    #L14:
+    {
+      core::print("Hello from do-while!");
+      if((i = i.+(1)).<(3))
+        break #L14;
+      break #L13;
+    }
+  while (true)
+  i = 0;
+  #L15:
+  while (true)
+    #L16:
+    {
+      core::print("Hello from while!");
+      if((i = i.+(1)).<(3))
+        break #L16;
+      break #L15;
+    }
+}
diff --git a/pkg/front_end/testcases/statements.dart.legacy.transformed.expect b/pkg/front_end/testcases/statements.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2cc8929
--- /dev/null
+++ b/pkg/front_end/testcases/statements.dart.legacy.transformed.expect
@@ -0,0 +1,211 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield* x;
+//     ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method foo() → dynamic {
+  try {
+    return;
+  }
+  finally {
+    core::print("Hello from finally block!");
+  }
+}
+static method bar() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic> :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        {
+          dynamic :stream = <dynamic>[];
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          try
+            #L2:
+            while (true) {
+              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  yield x;
+                  yield* x;
+                }
+              }
+              else
+                break #L2;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {
+  do {
+    core::print("Hello from do-while!");
+  }
+  while (false)
+  do {
+    dynamic x = core::print("Hello from do-while!");
+  }
+  while (false)
+  for (core::String s in <dynamic>["Hello from for-in!"]) {
+    core::print(s);
+  }
+  for (core::String s in <dynamic>["Hello from for-in without block!"])
+    core::print(s);
+  dynamic s;
+  for (final dynamic #t4 in <dynamic>["Hello from for-in without decl!"]) {
+    s = #t4;
+    core::print(s);
+  }
+  for (final dynamic #t5 in <dynamic>["Hello from for-in without decl and block!"]) {
+    s = #t5;
+    core::print(s);
+  }
+  core::print("Hello from labeled statement!");
+  try {
+    try {
+      throw "Hello from rethrow!";
+    }
+    on dynamic catch(final dynamic e) {
+      rethrow;
+    }
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+  }
+  self::foo();
+  core::bool done = false;
+  while (!done) {
+    done = true;
+    core::print("Hello from while!");
+  }
+  ;
+  assert(true);
+  assert(true, "Hello from assert!");
+  try {
+    assert(false, "Hello from assert!");
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+  }
+  #L3:
+  switch(1) {
+    #L4:
+    case 1:
+    case 2:
+      {
+        core::print("Hello from switch case!");
+        break #L3;
+      }
+    #L5:
+    default:
+      {
+        break #L3;
+      }
+  }
+  #L6:
+  switch(4) {
+    #L7:
+    case 2:
+      {
+        core::print("Hello from case 2!");
+        break #L6;
+      }
+    #L8:
+    case 1:
+      {
+        core::print("Hello from case 1!");
+        continue #L7;
+      }
+    #L9:
+    case 0:
+      {
+        core::print("Hello from case 0!");
+        continue #L8;
+      }
+    #L10:
+    case 4:
+      {
+        core::print("Hello from case 4!");
+        continue #L11;
+      }
+    #L11:
+    default:
+      {
+        continue #L9;
+      }
+  }
+  #L12:
+  switch(4) {
+    #L13:
+    case 1:
+      {
+        core::print("Hello from next case 1");
+        break #L12;
+      }
+    #L14:
+    default:
+      {
+        continue #L13;
+      }
+  }
+  core::int i = 0;
+  #L15:
+  do
+    #L16:
+    {
+      core::print("Hello from do-while!");
+      if((i = i.+(1)).<(3))
+        break #L16;
+      break #L15;
+    }
+  while (true)
+  i = 0;
+  #L17:
+  while (true)
+    #L18:
+    {
+      core::print("Hello from while!");
+      if((i = i.+(1)).<(3))
+        break #L18;
+      break #L17;
+    }
+}
diff --git a/pkg/front_end/testcases/statements.dart.strong.expect b/pkg/front_end/testcases/statements.dart.strong.expect
new file mode 100644
index 0000000..8a35aa2
--- /dev/null
+++ b/pkg/front_end/testcases/statements.dart.strong.expect
@@ -0,0 +1,182 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield* x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/statements.dart:14:23: Error: The type 'List<dynamic>' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Stream' is from 'dart:async'.
+//   await for (var x in []) {
+//                       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield* x;
+//     ^^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method foo() → dynamic {
+  try {
+    return;
+  }
+  finally {
+    core::print("Hello from finally block!");
+  }
+}
+static method bar() → dynamic async {
+  await for (dynamic x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/statements.dart:14:23: Error: The type 'List<dynamic>' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'List' is from 'dart:core'.
+ - 'Stream' is from 'dart:async'.
+  await for (var x in []) {
+                      ^" in <dynamic>[] as{TypeError} asy::Stream<dynamic>) {
+    yield x;
+    yield* x;
+  }
+}
+static method main() → dynamic {
+  do {
+    core::print("Hello from do-while!");
+  }
+  while (false)
+  do {
+    void x = core::print("Hello from do-while!");
+  }
+  while (false)
+  for (core::String s in <core::String>["Hello from for-in!"]) {
+    core::print(s);
+  }
+  for (core::String s in <core::String>["Hello from for-in without block!"])
+    core::print(s);
+  dynamic s;
+  for (final dynamic #t2 in <dynamic>["Hello from for-in without decl!"]) {
+    s = #t2;
+    core::print(s);
+  }
+  for (final dynamic #t3 in <dynamic>["Hello from for-in without decl and block!"]) {
+    s = #t3;
+    core::print(s);
+  }
+  core::print("Hello from labeled statement!");
+  try {
+    try {
+      throw "Hello from rethrow!";
+    }
+    on dynamic catch(final dynamic e) {
+      rethrow;
+    }
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+  }
+  self::foo();
+  core::bool done = false;
+  while (!done) {
+    done = true;
+    core::print("Hello from while!");
+  }
+  ;
+  assert(true);
+  assert(true, "Hello from assert!");
+  try {
+    assert(false, "Hello from assert!");
+  }
+  on dynamic catch(final dynamic e) {
+    core::print(e);
+  }
+  #L1:
+  switch(1) {
+    #L2:
+    case 1:
+    case 2:
+      {
+        core::print("Hello from switch case!");
+        break #L1;
+      }
+    #L3:
+    default:
+      {
+        break #L1;
+      }
+  }
+  #L4:
+  switch(4) {
+    #L5:
+    case 2:
+      {
+        core::print("Hello from case 2!");
+        break #L4;
+      }
+    #L6:
+    case 1:
+      {
+        core::print("Hello from case 1!");
+        continue #L5;
+      }
+    #L7:
+    case 0:
+      {
+        core::print("Hello from case 0!");
+        continue #L6;
+      }
+    #L8:
+    case 4:
+      {
+        core::print("Hello from case 4!");
+        continue #L9;
+      }
+    #L9:
+    default:
+      {
+        continue #L7;
+      }
+  }
+  #L10:
+  switch(4) {
+    #L11:
+    case 1:
+      {
+        core::print("Hello from next case 1");
+        break #L10;
+      }
+    #L12:
+    default:
+      {
+        continue #L11;
+      }
+  }
+  core::int i = 0;
+  #L13:
+  do
+    #L14:
+    {
+      core::print("Hello from do-while!");
+      if((i = i.{core::num::+}(1)).{core::num::<}(3))
+        break #L14;
+      break #L13;
+    }
+  while (true)
+  i = 0;
+  #L15:
+  while (true)
+    #L16:
+    {
+      core::print("Hello from while!");
+      if((i = i.{core::num::+}(1)).{core::num::<}(3))
+        break #L16;
+      break #L15;
+    }
+}
diff --git a/pkg/front_end/testcases/statements.dart.type_promotion.expect b/pkg/front_end/testcases/statements.dart.type_promotion.expect
new file mode 100644
index 0000000..f1b6150
--- /dev/null
+++ b/pkg/front_end/testcases/statements.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/statements.dart:50:10: Context: Write to done@988
+    done = true;
+         ^
+pkg/front_end/testcases/statements.dart:95:9: Context: Write to i@1814
+    if (++i < 3) continue;
+        ^^
+pkg/front_end/testcases/statements.dart:98:5: Context: Write to i@1814
+  i = 0;
+    ^
+pkg/front_end/testcases/statements.dart:101:9: Context: Write to i@1814
+    if (++i < 3) continue OUTER;
+        ^^
diff --git a/pkg/front_end/testcases/static_setter.dart.direct.expect b/pkg/front_end/testcases/static_setter.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/static_setter.dart.direct.expect
rename to pkg/front_end/testcases/static_setter.dart.legacy.expect
diff --git a/pkg/front_end/testcases/static_setter.dart.direct.transformed.expect b/pkg/front_end/testcases/static_setter.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/static_setter.dart.direct.transformed.expect
rename to pkg/front_end/testcases/static_setter.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/store_load.dart.direct.expect b/pkg/front_end/testcases/store_load.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/store_load.dart.direct.expect
rename to pkg/front_end/testcases/store_load.dart.legacy.expect
diff --git a/pkg/front_end/testcases/store_load.dart.direct.transformed.expect b/pkg/front_end/testcases/store_load.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/store_load.dart.direct.transformed.expect
rename to pkg/front_end/testcases/store_load.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/stringliteral.dart.direct.expect b/pkg/front_end/testcases/stringliteral.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/stringliteral.dart.direct.expect
rename to pkg/front_end/testcases/stringliteral.dart.legacy.expect
diff --git a/pkg/front_end/testcases/stringliteral.dart.direct.transformed.expect b/pkg/front_end/testcases/stringliteral.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/stringliteral.dart.direct.transformed.expect
rename to pkg/front_end/testcases/stringliteral.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/stringliteral.dart.strong.expect b/pkg/front_end/testcases/stringliteral.dart.strong.expect
index bef6d48..fd90ff9 100644
--- a/pkg/front_end/testcases/stringliteral.dart.strong.expect
+++ b/pkg/front_end/testcases/stringliteral.dart.strong.expect
@@ -1,4 +1,17 @@
 library;
 import self as self;
+import "dart:core" as core;
 
+static field core::String color = "brown";
+static field core::String thing = "lazy dog";
+static field core::String phrase = "The quick ${self::color} fox
+jumped over the ${self::thing}.
+";
+static field core::String adjacent = "${self::color}${self::color}${self::color}";
+static field core::String linebreaks = "${self::color}
+${self::color}
+${self::color}";
+static field core::String other = "${self::color}
+ is 
+${self::color}";
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/stringliteral.dart.strong.transformed.expect b/pkg/front_end/testcases/stringliteral.dart.strong.transformed.expect
new file mode 100644
index 0000000..fd90ff9
--- /dev/null
+++ b/pkg/front_end/testcases/stringliteral.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String color = "brown";
+static field core::String thing = "lazy dog";
+static field core::String phrase = "The quick ${self::color} fox
+jumped over the ${self::thing}.
+";
+static field core::String adjacent = "${self::color}${self::color}${self::color}";
+static field core::String linebreaks = "${self::color}
+${self::color}
+${self::color}";
+static field core::String other = "${self::color}
+ is 
+${self::color}";
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index f42496b..f42074f 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -6,63 +6,50 @@
 # Kernel ASTs directly, that is, code in pkg/fasta/lib/src/kernel/ with
 # strong-mode enabled.
 
-DeltaBlue: Fail
-accessors: Fail
+abstract_members: TypeCheckError
+accessors: RuntimeError
 ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
-argument_mismatch: Fail # Test assumes Dart 1.0 semantics
-async_function: Fail
-await: Fail
+argument_mismatch: InstrumentationMismatch # Test assumes Dart 1.0 semantics
 bug21938: TypeCheckError
 bug30695: TypeCheckError
 bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
-bug32629: Fail # Test has an intentional error
-call: Fail
-cascade: Fail
-casts: Fail
-classes: Fail
-closure: Fail
+bug32629: InstrumentationMismatch # Test has an intentional error
+call: TypeCheckError
+cascade: RuntimeError
 constructor_initializer_invalid: RuntimeError # Fails execution after recovery
-covariant_generic: Fail
-cycles: Fail
-default_values: Fail
+covariant_generic: RuntimeError
 duplicated_declarations: TypeCheckError
-dynamic_and_void: Fail # Test assumes Dart 1.0 semantics
-escape: Fail
+duplicated_field_initializer: RuntimeError
+dynamic_and_void: InstrumentationMismatch # Test assumes Dart 1.0 semantics
 expressions: RuntimeError
-external: Fail
 external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
-fallthrough: Fail
-fibonacci: Fail
-for_in_scope: Fail
-function_in_field: Fail
-function_type_recovery: Fail
-functions: Fail
-hello: Fail
-implicit_this: Fail
-incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
-inference/abstract_class_instantiation: Fail # Issue #30040
+fallthrough: ExpectationFileMismatch
+for_in_without_declaration: TypeCheckError
+incomplete_field_formal_parameter: RuntimeError
+inference/abstract_class_instantiation: InstrumentationMismatch # Issue #30040
 inference/conflicts_can_happen: TypeCheckError
 inference/conflicts_can_happen2: TypeCheckError
 inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
-inference/constructors_too_many_positional_arguments: Fail # Issue #30040
+inference/constructors_too_many_positional_arguments: InstrumentationMismatch # Issue #30040
 inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
-inference/downwards_inference_annotations_type_variable: Fail # Issue 28981
-inference/downwards_inference_on_function_of_t_using_the_t: Fail # Issue #29798
+inference/downwards_inference_annotations_type_variable: InstrumentationMismatch # Issue 28981
+inference/downwards_inference_on_function_of_t_using_the_t: InstrumentationMismatch # Issue #29798
 inference/downwards_inference_on_list_literals_infer_downwards: RuntimeError
-inference/future_then_explicit_future: Fail # Issue #30040
+inference/future_then_explicit_future: InstrumentationMismatch # Issue #30040
 inference/future_then_upwards: RuntimeError
 inference/future_then_upwards_2: RuntimeError
-inference/generic_functions_return_typedef: Fail # Issue #29798
+inference/generic_functions_return_typedef: InstrumentationMismatch # Issue #29798
 inference/generic_methods_correctly_recognize_generic_upper_bound: TypeCheckError
 inference/generic_methods_do_not_infer_invalid_override_of_generic_method: TypeCheckError
 inference/generic_methods_handle_override_of_non_generic_with_generic: TypeCheckError
-inference/generic_methods_infer_js_builtin: Fail # Issue #30029
+inference/generic_methods_infer_js_builtin: InstrumentationMismatch # Issue #30029
 inference/infer_field_override_multiple: TypeCheckError
+inference/infer_from_complex_expressions_if_outer_most_value_is_precise: TypeCheckError # Issue #35630
 inference/infer_method_missing_params: TypeCheckError
 inference/infer_type_regardless_of_declaration_order_or_cycles: RuntimeError
 inference/infer_types_on_generic_instantiations_4: RuntimeError
 inference/infer_types_on_generic_instantiations_infer: TypeCheckError
-inference/instantiate_tearoff_of_call: Fail # Issue #31746
+inference/instantiate_tearoff_of_call: TypeCheckError # Issue #31746
 inference/instantiate_to_bounds_generic_has_bound_defined_after transform: RuntimeError
 inference/mixin_inference_outwards_3: TypeCheckError
 inference/mixin_inference_outwards_4: TypeCheckError
@@ -70,10 +57,10 @@
 inference/mixin_inference_unification_2: TypeCheckError
 inference/override_equals: RuntimeError
 inference/unresolved_super: TypeCheckError
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: Fail # Issue #25824
-inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: Fail # Issue #25824
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: Fail # Issue #25824
-inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Fail # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: InstrumentationMismatch # Issue #25824
 inference_new/infer_assign_to_index_super_upwards: TypeCheckError
 inference_new/infer_assign_to_index_this_upwards: TypeCheckError
 inference_new/infer_assign_to_index_upwards: TypeCheckError
@@ -81,115 +68,65 @@
 inference_new/infer_field_getter_setter_mismatch: TypeCheckError
 inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
 inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
-instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
-instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
+instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
+instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # Expected
 invalid_type: TypeCheckError
-invocations: Fail
+invocations: RuntimeError
 issue34899: TypeCheckError
-literals: Fail
-map: Fail
-micro: Fail
+micro: RuntimeError
 mixin_application_override: TypeCheckError
-named_parameters: Fail
-null_aware: Fail
-operators: Fail
-optional: Fail
+optional: TypeCheckError
 override_check_accessor_after_inference: TypeCheckError # Issue #31620
 override_check_accessor_basic: TypeCheckError # Issue #31620
 override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
 override_check_after_inference: TypeCheckError # Issue #31620
 override_check_basic: TypeCheckError # Issue #31620
 override_check_with_covariant_modifier: TypeCheckError # Issue #31620
-platform: Fail
-prefer_baseclass: Fail
-rasta/abstract_constructor: Fail
-rasta/bad_constructor_redirection: Fail
-rasta/bad_continue: Fail
-rasta/bad_default_constructor: Fail
+rasta/abstract_constructor: RuntimeError
+rasta/bad_constructor_redirection: RuntimeError
+rasta/bad_continue: RuntimeError
+rasta/bad_default_constructor: VerificationError
 rasta/bad_explicit_super_constructor: RuntimeError
-rasta/bad_implicit_super_constructor: Fail
-rasta/bad_interpolation: Fail
-rasta/bad_redirection: Fail
-rasta/bad_setter_initializer: Fail
-rasta/bad_unicode: Fail
-rasta/breaking_bad: Fail
-rasta/cascades: Fail
-rasta/class_hierarchy: Fail
-rasta/class_member: Fail
-rasta/constant_get_and_invoke: Fail
-rasta/deferred_lib: Fail
-rasta/deferred_load: Fail
+rasta/bad_implicit_super_constructor: RuntimeError
+rasta/bad_interpolation: RuntimeError
+rasta/bad_redirection: RuntimeError
+rasta/bad_setter_initializer: RuntimeError
+rasta/breaking_bad: RuntimeError
+rasta/class_hierarchy: RuntimeError
+rasta/class_member: RuntimeError
+rasta/constant_get_and_invoke: RuntimeError
 rasta/duplicated_mixin: RuntimeError # Expected, this file has no main method.
-rasta/enum: Fail
 rasta/export: RuntimeError # Expected, this file has no main method.
-rasta/external_factory_redirection: Fail
 rasta/foo: RuntimeError # Expected, this file has no main method.
-rasta/for_loop: Fail
-rasta/generic_factory: Fail
-rasta/hello: Fail
-rasta/issue_000001: Fail
-rasta/issue_000002: Fail
-rasta/issue_000004: Fail
-rasta/issue_000006: Fail
-rasta/issue_000008: Fail
-rasta/issue_000011: Fail
-rasta/issue_000012: Fail
-rasta/issue_000025: Fail
-rasta/issue_000026: Fail
-rasta/issue_000031: Fail
-rasta/issue_000032: Fail
-rasta/issue_000033: Fail
+rasta/generic_factory: RuntimeError
+rasta/issue_000001: RuntimeError
+rasta/issue_000031: RuntimeError
+rasta/issue_000032: RuntimeError
 rasta/issue_000034: RuntimeError
-rasta/issue_000035: Fail
-rasta/issue_000035a: Fail
-rasta/issue_000036: Fail
-rasta/issue_000039: Fail
+rasta/issue_000036: RuntimeError
+rasta/issue_000039: VerificationError
 rasta/issue_000041: RuntimeError
-rasta/issue_000042: Fail
-rasta/issue_000043: Fail
-rasta/issue_000044: Fail
-rasta/issue_000045: Fail
-rasta/issue_000046: Fail
-rasta/issue_000047: Fail
-rasta/issue_000048: Fail
-rasta/issue_000052: Fail
-rasta/issue_000053: Fail
-rasta/issue_000067: Fail
-rasta/issue_000068: Fail
-rasta/issue_000069: Fail
-rasta/issue_000070: Fail
-rasta/issue_000081: Fail
-rasta/malformed_const_constructor: Fail
-rasta/malformed_function: Fail
-rasta/malformed_function_type: Fail
-rasta/mandatory_parameter_initializer: Fail
+rasta/issue_000042: RuntimeError
+rasta/issue_000043: RuntimeError
+rasta/issue_000044: RuntimeError
+rasta/issue_000046: RuntimeError
+rasta/issue_000081: RuntimeError
+rasta/malformed_const_constructor: RuntimeError
+rasta/malformed_function: RuntimeError
 rasta/mixin_library: TypeCheckError
-rasta/native_is_illegal: Fail
-rasta/parser_error: Fail
-rasta/static: Fail
-rasta/super: Fail
-rasta/super_initializer: Fail
+rasta/native_is_illegal: RuntimeError
+rasta/parser_error: RuntimeError
+rasta/static: RuntimeError
+rasta/super: TypeCheckError
+rasta/super_initializer: RuntimeError
 rasta/super_mixin: TypeCheckError
-rasta/super_operator: Fail
-rasta/switch_execution_case_t02: Fail
-rasta/switch_fall_through: Fail
-rasta/this_invoke: Fail
-rasta/try_label: Fail
-rasta/type_literals: Fail
-rasta/type_with_parse_error: Fail
-rasta/typedef: Fail
-rasta/unresolved: Fail
-rasta/unresolved_constructor: Fail
-rasta/unresolved_for_in: Fail
-rasta/unresolved_recovery: Fail
-redirecting_constructor: Fail
-redirecting_factory: Fail
-redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
-regress/issue_29975: Fail # Issue 29975.
+rasta/super_operator: TypeCheckError
+rasta/type_literals: Crash
+rasta/typedef: Crash
+rasta/unresolved: RuntimeError
+rasta/unresolved_constructor: RuntimeError
+rasta/unresolved_for_in: RuntimeError
+rasta/unresolved_recovery: TypeCheckError
 regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_30836: RuntimeError # Issue 30836.
@@ -199,18 +136,19 @@
 regress/issue_33452: RuntimeError # Test has an intentional error
 regress/issue_34225: RuntimeError
 regress/issue_34563: RuntimeError # Test execution after recovery
+regress/issue_35177: RuntimeError
+regress/issue_35258: RuntimeError # Expected
+regress/issue_35259: RuntimeError # Expected
+regress/issue_35260: RuntimeError # Expected
+regress/issue_35266: RuntimeError # Expected
+reject_generic_function_types_in_bounds: RuntimeError # Expected
 runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
-statements: Fail
-stringliteral: Fail
-super_rasta_copy: Fail
-top_level_accessors: Fail
-type_variable_as_super: Fail
+set_literals/disambiguation_rule: RuntimeError
+statements: Crash
+type_variable_as_super: RuntimeError
 type_variable_prefix: RuntimeError
-typedef: Fail
-uninitialized_fields: Fail
-unused_methods: Fail
-void_methods: Fail
-warn_unresolved_sends: Fail # Test assumes Dart 1.0 semantics
+void_methods: ExpectationFileMismatch
+warn_unresolved_sends: InstrumentationMismatch # Test assumes Dart 1.0 semantics
diff --git a/pkg/front_end/testcases/super_call.dart.direct.expect b/pkg/front_end/testcases/super_call.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/super_call.dart.direct.expect
rename to pkg/front_end/testcases/super_call.dart.legacy.expect
diff --git a/pkg/front_end/testcases/super_call.dart.direct.transformed.expect b/pkg/front_end/testcases/super_call.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/super_call.dart.direct.transformed.expect
rename to pkg/front_end/testcases/super_call.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/super_nsm.dart.direct.expect b/pkg/front_end/testcases/super_nsm.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/super_nsm.dart.direct.expect
rename to pkg/front_end/testcases/super_nsm.dart.legacy.expect
diff --git a/pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect b/pkg/front_end/testcases/super_nsm.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/super_nsm.dart.direct.transformed.expect
rename to pkg/front_end/testcases/super_nsm.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart b/pkg/front_end/testcases/super_rasta_copy.dart
deleted file mode 100644
index cbec94c..0000000
--- a/pkg/front_end/testcases/super_rasta_copy.dart
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE.md file.
-
-// TODO(ahe): This is a copy of [rasta/super.dart] without the `n`
-// property. Remove this once fasta can handle all of the original file.
-
-class A {
-  var a;
-  var b;
-  var c;
-  var d;
-  get e => null;
-  final f;
-  set g(_) {}
-  get h => null;
-  set h(_) {}
-  get i => null;
-
-  operator [](_) => null;
-  operator []=(a, b) {}
-  operator ~() => 117;
-  operator -() => 117;
-
-  operator ==(other) => true;
-
-  void m() {}
-}
-
-class B extends A {
-  get b => null;
-  set c(x) {}
-  final d;
-  set i(x) {}
-}
-
-class C extends B {
-  test() {
-    ~super;
-    use(~super);
-    -super;
-    use(-super);
-    super == 87;
-    use(super == 87);
-    super != 87;
-    use(super != 87);
-
-    super.a;
-    use(super.a);
-    super.b;
-    use(super.b);
-    super.c;
-    use(super.c);
-    super.d;
-    use(super.d);
-    super.e;
-    use(super.e);
-    super.f;
-    use(super.f);
-    super.g;
-    use(super.g);
-    super.h;
-    use(super.h);
-    super.i;
-    use(super.i);
-    super[87];
-    use(super[87]);
-    super.m;
-    use(super.m);
-
-    super.a++;
-    use(super.a++);
-    super.b++;
-    use(super.b++);
-    super.c++;
-    use(super.c++);
-    super.d++;
-    use(super.d++);
-    super.e++;
-    use(super.e++);
-    super.f++;
-    use(super.f++);
-    super.g++;
-    use(super.g++);
-    super.h++;
-    use(super.h++);
-    super.i++;
-    use(super.i++);
-    super[87]++;
-    use(super[87]++);
-    super.m++;
-    use(super.m++);
-
-    ++super.a;
-    use(++super.a);
-    ++super.b;
-    use(++super.b);
-    ++super.c;
-    use(++super.c);
-    ++super.d;
-    use(++super.d);
-    ++super.e;
-    use(++super.e);
-    ++super.f;
-    use(++super.f);
-    ++super.g;
-    use(++super.g);
-    ++super.h;
-    use(++super.h);
-    ++super.i;
-    use(++super.i);
-    ++super[87];
-    use(++super[87]);
-    ++super.m;
-    use(++super.m);
-
-    super.a();
-    use(super.a());
-    super.b();
-    use(super.b());
-    super.c();
-    use(super.c());
-    super.d();
-    use(super.d());
-    super.e();
-    use(super.e());
-    super.f();
-    use(super.f());
-    super.g();
-    use(super.g());
-    super.h();
-    use(super.h());
-    super.i();
-    use(super.i());
-    super[87]();
-    use(super[87]());
-    super.m();
-    use(super.m());
-    super.m(87);
-    use(super.m(87));
-
-    super.a = 42;
-    use(super.a = 42);
-    super.b = 42;
-    use(super.b = 42);
-    super.c = 42;
-    use(super.c = 42);
-    super.d = 42;
-    use(super.d = 42);
-    super.e = 42;
-    use(super.e = 42);
-    super.f = 42;
-    use(super.f = 42);
-    super.g = 42;
-    use(super.g = 42);
-    super.h = 42;
-    use(super.h = 42);
-    super.i = 42;
-    use(super.i = 42);
-    super[87] = 42;
-    use(super[87] = 42);
-    super.m = 42;
-    use(super.m = 42);
-
-    super.a ??= 42;
-    use(super.a ??= 42);
-    super.b ??= 42;
-    use(super.b ??= 42);
-    super.c ??= 42;
-    use(super.c ??= 42);
-    super.d ??= 42;
-    use(super.d ??= 42);
-    super.e ??= 42;
-    use(super.e ??= 42);
-    super.f ??= 42;
-    use(super.f ??= 42);
-    super.g ??= 42;
-    use(super.g ??= 42);
-    super.h ??= 42;
-    use(super.h ??= 42);
-    super.i ??= 42;
-    use(super.i ??= 42);
-    super[87] ??= 42;
-    use(super[87] ??= 42);
-    super.m ??= 42;
-    use(super.m ??= 42);
-
-    super.a += 42;
-    use(super.a += 42);
-    super.b += 42;
-    use(super.b += 42);
-    super.c += 42;
-    use(super.c += 42);
-    super.d += 42;
-    use(super.d += 42);
-    super.e += 42;
-    use(super.e += 42);
-    super.f += 42;
-    use(super.f += 42);
-    super.g += 42;
-    use(super.g += 42);
-    super.h += 42;
-    use(super.h += 42);
-    super.i += 42;
-    use(super.i += 42);
-    super[87] += 42;
-    use(super[87] += 42);
-    super.m += 42;
-    use(super.m += 42);
-
-    super.a -= 42;
-    use(super.a -= 42);
-    super.b -= 42;
-    use(super.b -= 42);
-    super.c -= 42;
-    use(super.c -= 42);
-    super.d -= 42;
-    use(super.d -= 42);
-    super.e -= 42;
-    use(super.e -= 42);
-    super.f -= 42;
-    use(super.f -= 42);
-    super.g -= 42;
-    use(super.g -= 42);
-    super.h -= 42;
-    use(super.h -= 42);
-    super.i -= 42;
-    use(super.i -= 42);
-    super[87] -= 42;
-    use(super[87] -= 42);
-    super.m -= 42;
-    use(super.m -= 42);
-  }
-}
-
-use(x) {
-  if (x == new DateTime.now().millisecondsSinceEpoch) throw "Shouldn't happen";
-}
-
-main() {
-  try {
-    new C().test();
-  } on NoSuchMethodError {
-    return; // Test passed.
-  }
-  throw "Test failed";
-}
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect b/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
deleted file mode 100644
index c262ce9..0000000
--- a/pkg/front_end/testcases/super_rasta_copy.dart.direct.expect
+++ /dev/null
@@ -1,482 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:60:11: Warning: Superclass has no getter named 'g'.
-//     super.g;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:61:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:79:11: Warning: Superclass has no setter named 'e'.
-//     super.e++;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:80:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e++);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:81:11: Warning: Superclass has no setter named 'f'.
-//     super.f++;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:82:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f++);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:83:11: Warning: Superclass has no getter named 'g'.
-//     super.g++;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:84:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g++);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:91:11: Warning: Superclass has no setter named 'm'.
-//     super.m++;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:92:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m++);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:102:13: Warning: Superclass has no setter named 'e'.
-//     ++super.e;
-//             ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:103:17: Warning: Superclass has no setter named 'e'.
-//     use(++super.e);
-//                 ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:104:13: Warning: Superclass has no setter named 'f'.
-//     ++super.f;
-//             ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:105:17: Warning: Superclass has no setter named 'f'.
-//     use(++super.f);
-//                 ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:106:13: Warning: Superclass has no getter named 'g'.
-//     ++super.g;
-//             ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:107:17: Warning: Superclass has no getter named 'g'.
-//     use(++super.g);
-//                 ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:114:13: Warning: Superclass has no setter named 'm'.
-//     ++super.m;
-//             ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:115:17: Warning: Superclass has no setter named 'm'.
-//     use(++super.m);
-//                 ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:129:11: Warning: Superclass has no method named 'g'.
-//     super.g();
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:130:15: Warning: Superclass has no method named 'g'.
-//     use(super.g());
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:150:11: Warning: Superclass has no setter named 'e'.
-//     super.e = 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:151:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e = 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:152:11: Warning: Superclass has no setter named 'f'.
-//     super.f = 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:153:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f = 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:162:11: Warning: Superclass has no setter named 'm'.
-//     super.m = 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:163:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m = 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:173:11: Warning: Superclass has no setter named 'e'.
-//     super.e ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:174:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:175:11: Warning: Superclass has no setter named 'f'.
-//     super.f ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:176:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:177:11: Warning: Superclass has no getter named 'g'.
-//     super.g ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:178:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:185:11: Warning: Superclass has no setter named 'm'.
-//     super.m ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:186:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:196:11: Warning: Superclass has no setter named 'e'.
-//     super.e += 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:197:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e += 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:198:11: Warning: Superclass has no setter named 'f'.
-//     super.f += 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:199:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f += 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:200:11: Warning: Superclass has no getter named 'g'.
-//     super.g += 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:201:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g += 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:208:11: Warning: Superclass has no setter named 'm'.
-//     super.m += 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:209:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m += 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:219:11: Warning: Superclass has no setter named 'e'.
-//     super.e -= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:220:15: Warning: Superclass has no setter named 'e'.
-//     use(super.e -= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:221:11: Warning: Superclass has no setter named 'f'.
-//     super.f -= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:222:15: Warning: Superclass has no setter named 'f'.
-//     use(super.f -= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:223:11: Warning: Superclass has no getter named 'g'.
-//     super.g -= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:224:15: Warning: Superclass has no getter named 'g'.
-//     use(super.g -= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:231:11: Warning: Superclass has no setter named 'm'.
-//     super.m -= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:232:15: Warning: Superclass has no setter named 'm'.
-//     use(super.m -= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:139:12: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//     super.m(87);
-//            ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:140:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//     use(super.m(87));
-//                ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final f;
-//         ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final d;
-//         ^
-
-// Unhandled errors:
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final f;
-//         ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final d;
-//         ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic a = null;
-  field dynamic b = null;
-  field dynamic c = null;
-  field dynamic d = null;
-  final field dynamic f = null;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  get e() → dynamic
-    return null;
-  set g(dynamic _) → dynamic {}
-  get h() → dynamic
-    return null;
-  set h(dynamic _) → dynamic {}
-  get i() → dynamic
-    return null;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic a, dynamic b) → dynamic {}
-  operator ~() → dynamic
-    return 117;
-  operator unary-() → dynamic
-    return 117;
-  operator ==(dynamic other) → dynamic
-    return true;
-  method m() → void {}
-}
-class B extends self::A {
-  final field dynamic d = null;
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  get b() → dynamic
-    return null;
-  set c(dynamic x) → dynamic {}
-  set i(dynamic x) → dynamic {}
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  method test() → dynamic {
-    super.{self::A::~}();
-    self::use(super.{self::A::~}());
-    super.{self::A::unary-}();
-    self::use(super.{self::A::unary-}());
-    super.{self::A::==}(87);
-    self::use(super.{self::A::==}(87));
-    !super.{self::A::==}(87);
-    self::use(!super.{self::A::==}(87));
-    super.{self::A::a};
-    self::use(super.{self::A::a});
-    super.{self::B::b};
-    self::use(super.{self::B::b});
-    super.{self::A::c};
-    self::use(super.{self::A::c});
-    super.{self::B::d};
-    self::use(super.{self::B::d});
-    super.{self::A::e};
-    self::use(super.{self::A::e});
-    super.{self::A::f};
-    self::use(super.{self::A::f});
-    super.g;
-    self::use(super.g);
-    super.{self::A::h};
-    self::use(super.{self::A::h});
-    super.{self::A::i};
-    self::use(super.{self::A::i});
-    super.{self::A::[]}(87);
-    self::use(super.{self::A::[]}(87));
-    super.{self::A::m};
-    self::use(super.{self::A::m});
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
-    super.e = super.{self::A::e}.+(1);
-    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
-    super.f = super.{self::A::f}.+(1);
-    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
-    super.{self::A::g} = super.g.+(1);
-    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
-    let final dynamic #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
-    self::use(let final dynamic #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final dynamic #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
-    super.m = super.{self::A::m}.+(1);
-    self::use(let final dynamic #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = #t23.+(1) in #t23);
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
-    super.e = super.{self::A::e}.+(1);
-    self::use(super.e = super.{self::A::e}.+(1));
-    super.f = super.{self::A::f}.+(1);
-    self::use(super.f = super.{self::A::f}.+(1));
-    super.{self::A::g} = super.g.+(1);
-    self::use(super.{self::A::g} = super.g.+(1));
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
-    let final dynamic #t25 = 87 in let final dynamic #t26 = super.{self::A::[]}(#t25).+(1) in let final dynamic #t27 = super.{self::A::[]=}(#t25, #t26) in #t26;
-    self::use(let final dynamic #t28 = 87 in let final dynamic #t29 = super.{self::A::[]}(#t28).+(1) in let final dynamic #t30 = super.{self::A::[]=}(#t28, #t29) in #t29);
-    super.m = super.{self::A::m}.+(1);
-    self::use(super.m = super.{self::A::m}.+(1));
-    super.{self::A::a}.call();
-    self::use(super.{self::A::a}.call());
-    super.{self::B::b}.call();
-    self::use(super.{self::B::b}.call());
-    super.{self::A::c}.call();
-    self::use(super.{self::A::c}.call());
-    super.{self::B::d}.call();
-    self::use(super.{self::B::d}.call());
-    super.{self::A::e}.call();
-    self::use(super.{self::A::e}.call());
-    super.{self::A::f}.call();
-    self::use(super.{self::A::f}.call());
-    super.g();
-    self::use(super.g());
-    super.{self::A::h}.call();
-    self::use(super.{self::A::h}.call());
-    super.{self::A::i}.call();
-    self::use(super.{self::A::i}.call());
-    super.{self::A::[]}(87).call();
-    self::use(super.{self::A::[]}(87).call());
-    super.{self::A::m}();
-    self::use(super.{self::A::m}());
-    super.{self::A::m}(87);
-    self::use(super.{self::A::m}(87));
-    super.{self::A::a} = 42;
-    self::use(super.{self::A::a} = 42);
-    super.{self::A::b} = 42;
-    self::use(super.{self::A::b} = 42);
-    super.{self::B::c} = 42;
-    self::use(super.{self::B::c} = 42);
-    super.{self::A::d} = 42;
-    self::use(super.{self::A::d} = 42);
-    super.e = 42;
-    self::use(super.e = 42);
-    super.f = 42;
-    self::use(super.f = 42);
-    super.{self::A::g} = 42;
-    self::use(super.{self::A::g} = 42);
-    super.{self::A::h} = 42;
-    self::use(super.{self::A::h} = 42);
-    super.{self::B::i} = 42;
-    self::use(super.{self::B::i} = 42);
-    super.{self::A::[]=}(87, 42);
-    self::use(let final dynamic #t31 = 87 in let final dynamic #t32 = 42 in let final dynamic #t33 = super.{self::A::[]=}(#t31, #t32) in #t32);
-    super.m = 42;
-    self::use(super.m = 42);
-    super.{self::A::a}.==(null) ? super.{self::A::a} = 42 : null;
-    self::use(let final dynamic #t34 = super.{self::A::a} in #t34.==(null) ? super.{self::A::a} = 42 : #t34);
-    super.{self::B::b}.==(null) ? super.{self::A::b} = 42 : null;
-    self::use(let final dynamic #t35 = super.{self::B::b} in #t35.==(null) ? super.{self::A::b} = 42 : #t35);
-    super.{self::A::c}.==(null) ? super.{self::B::c} = 42 : null;
-    self::use(let final dynamic #t36 = super.{self::A::c} in #t36.==(null) ? super.{self::B::c} = 42 : #t36);
-    super.{self::B::d}.==(null) ? super.{self::A::d} = 42 : null;
-    self::use(let final dynamic #t37 = super.{self::B::d} in #t37.==(null) ? super.{self::A::d} = 42 : #t37);
-    super.{self::A::e}.==(null) ? super.e = 42 : null;
-    self::use(let final dynamic #t38 = super.{self::A::e} in #t38.==(null) ? super.e = 42 : #t38);
-    super.{self::A::f}.==(null) ? super.f = 42 : null;
-    self::use(let final dynamic #t39 = super.{self::A::f} in #t39.==(null) ? super.f = 42 : #t39);
-    super.g.==(null) ? super.{self::A::g} = 42 : null;
-    self::use(let final dynamic #t40 = super.g in #t40.==(null) ? super.{self::A::g} = 42 : #t40);
-    super.{self::A::h}.==(null) ? super.{self::A::h} = 42 : null;
-    self::use(let final dynamic #t41 = super.{self::A::h} in #t41.==(null) ? super.{self::A::h} = 42 : #t41);
-    super.{self::A::i}.==(null) ? super.{self::B::i} = 42 : null;
-    self::use(let final dynamic #t42 = super.{self::A::i} in #t42.==(null) ? super.{self::B::i} = 42 : #t42);
-    let final dynamic #t43 = 87 in super.{self::A::[]}(#t43).==(null) ? let final dynamic #t44 = 42 in let final dynamic #t45 = super.{self::A::[]=}(#t43, #t44) in #t44 : null;
-    self::use(let final dynamic #t46 = 87 in let final dynamic #t47 = super.{self::A::[]}(#t46) in #t47.==(null) ? let final dynamic #t48 = 42 in let final dynamic #t49 = super.{self::A::[]=}(#t46, #t48) in #t48 : #t47);
-    super.{self::A::m}.==(null) ? super.m = 42 : null;
-    self::use(let final dynamic #t50 = super.{self::A::m} in #t50.==(null) ? super.m = 42 : #t50);
-    super.{self::A::a} = super.{self::A::a}.+(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
-    super.{self::A::b} = super.{self::B::b}.+(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
-    super.{self::B::c} = super.{self::A::c}.+(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
-    super.{self::A::d} = super.{self::B::d}.+(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
-    super.e = super.{self::A::e}.+(42);
-    self::use(super.e = super.{self::A::e}.+(42));
-    super.f = super.{self::A::f}.+(42);
-    self::use(super.f = super.{self::A::f}.+(42));
-    super.{self::A::g} = super.g.+(42);
-    self::use(super.{self::A::g} = super.g.+(42));
-    super.{self::A::h} = super.{self::A::h}.+(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
-    super.{self::B::i} = super.{self::A::i}.+(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
-    let final dynamic #t51 = 87 in super.{self::A::[]=}(#t51, super.{self::A::[]}(#t51).+(42));
-    self::use(let final dynamic #t52 = 87 in let final dynamic #t53 = super.{self::A::[]}(#t52).+(42) in let final dynamic #t54 = super.{self::A::[]=}(#t52, #t53) in #t53);
-    super.m = super.{self::A::m}.+(42);
-    self::use(super.m = super.{self::A::m}.+(42));
-    super.{self::A::a} = super.{self::A::a}.-(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
-    super.{self::A::b} = super.{self::B::b}.-(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
-    super.{self::B::c} = super.{self::A::c}.-(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
-    super.{self::A::d} = super.{self::B::d}.-(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
-    super.e = super.{self::A::e}.-(42);
-    self::use(super.e = super.{self::A::e}.-(42));
-    super.f = super.{self::A::f}.-(42);
-    self::use(super.f = super.{self::A::f}.-(42));
-    super.{self::A::g} = super.g.-(42);
-    self::use(super.{self::A::g} = super.g.-(42));
-    super.{self::A::h} = super.{self::A::h}.-(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
-    super.{self::B::i} = super.{self::A::i}.-(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
-    let final dynamic #t55 = 87 in super.{self::A::[]=}(#t55, super.{self::A::[]}(#t55).-(42));
-    self::use(let final dynamic #t56 = 87 in let final dynamic #t57 = super.{self::A::[]}(#t56).-(42) in let final dynamic #t58 = super.{self::A::[]=}(#t56, #t57) in #t57);
-    super.m = super.{self::A::m}.-(42);
-    self::use(super.m = super.{self::A::m}.-(42));
-  }
-}
-static method use(dynamic x) → dynamic {
-  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
-    throw "Shouldn't happen";
-}
-static method main() → dynamic {
-  try {
-    new self::C::•().test();
-  }
-  on core::NoSuchMethodError catch(no-exception-var) {
-    return;
-  }
-  throw "Test failed";
-}
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect b/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
deleted file mode 100644
index e99eae0..0000000
--- a/pkg/front_end/testcases/super_rasta_copy.dart.direct.transformed.expect
+++ /dev/null
@@ -1,260 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final f;
-//         ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final d;
-//         ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic a = null;
-  field dynamic b = null;
-  field dynamic c = null;
-  field dynamic d = null;
-  final field dynamic f = null;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  get e() → dynamic
-    return null;
-  set g(dynamic _) → dynamic {}
-  get h() → dynamic
-    return null;
-  set h(dynamic _) → dynamic {}
-  get i() → dynamic
-    return null;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic a, dynamic b) → dynamic {}
-  operator ~() → dynamic
-    return 117;
-  operator unary-() → dynamic
-    return 117;
-  operator ==(dynamic other) → dynamic
-    return true;
-  method m() → void {}
-}
-class B extends self::A {
-  final field dynamic d = null;
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  get b() → dynamic
-    return null;
-  set c(dynamic x) → dynamic {}
-  set i(dynamic x) → dynamic {}
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  method test() → dynamic {
-    super.{self::A::~}();
-    self::use(super.{self::A::~}());
-    super.{self::A::unary-}();
-    self::use(super.{self::A::unary-}());
-    super.{self::A::==}(87);
-    self::use(super.{self::A::==}(87));
-    !super.{self::A::==}(87);
-    self::use(!super.{self::A::==}(87));
-    super.{self::A::a};
-    self::use(super.{self::A::a});
-    super.{self::B::b};
-    self::use(super.{self::B::b});
-    super.{self::A::c};
-    self::use(super.{self::A::c});
-    super.{self::B::d};
-    self::use(super.{self::B::d});
-    super.{self::A::e};
-    self::use(super.{self::A::e});
-    super.{self::A::f};
-    self::use(super.{self::A::f});
-    super.g;
-    self::use(super.g);
-    super.{self::A::h};
-    self::use(super.{self::A::h});
-    super.{self::A::i};
-    self::use(super.{self::A::i});
-    super.{self::A::[]}(87);
-    self::use(super.{self::A::[]}(87));
-    super.{self::A::m};
-    self::use(super.{self::A::m});
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
-    super.e = super.{self::A::e}.+(1);
-    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
-    super.f = super.{self::A::f}.+(1);
-    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
-    super.{self::A::g} = super.g.+(1);
-    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
-    let final dynamic #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
-    self::use(let final dynamic #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final dynamic #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
-    super.m = super.{self::A::m}.+(1);
-    self::use(let final dynamic #t23 = super.{self::A::m} in let final dynamic #t24 = super.m = #t23.+(1) in #t23);
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
-    super.e = super.{self::A::e}.+(1);
-    self::use(super.e = super.{self::A::e}.+(1));
-    super.f = super.{self::A::f}.+(1);
-    self::use(super.f = super.{self::A::f}.+(1));
-    super.{self::A::g} = super.g.+(1);
-    self::use(super.{self::A::g} = super.g.+(1));
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
-    let final dynamic #t25 = 87 in let final dynamic #t26 = super.{self::A::[]}(#t25).+(1) in let final dynamic #t27 = super.{self::A::[]=}(#t25, #t26) in #t26;
-    self::use(let final dynamic #t28 = 87 in let final dynamic #t29 = super.{self::A::[]}(#t28).+(1) in let final dynamic #t30 = super.{self::A::[]=}(#t28, #t29) in #t29);
-    super.m = super.{self::A::m}.+(1);
-    self::use(super.m = super.{self::A::m}.+(1));
-    super.{self::A::a}.call();
-    self::use(super.{self::A::a}.call());
-    super.{self::B::b}.call();
-    self::use(super.{self::B::b}.call());
-    super.{self::A::c}.call();
-    self::use(super.{self::A::c}.call());
-    super.{self::B::d}.call();
-    self::use(super.{self::B::d}.call());
-    super.{self::A::e}.call();
-    self::use(super.{self::A::e}.call());
-    super.{self::A::f}.call();
-    self::use(super.{self::A::f}.call());
-    super.g();
-    self::use(super.g());
-    super.{self::A::h}.call();
-    self::use(super.{self::A::h}.call());
-    super.{self::A::i}.call();
-    self::use(super.{self::A::i}.call());
-    super.{self::A::[]}(87).call();
-    self::use(super.{self::A::[]}(87).call());
-    super.{self::A::m}();
-    self::use(super.{self::A::m}());
-    super.{self::A::m}(87);
-    self::use(super.{self::A::m}(87));
-    super.{self::A::a} = 42;
-    self::use(super.{self::A::a} = 42);
-    super.{self::A::b} = 42;
-    self::use(super.{self::A::b} = 42);
-    super.{self::B::c} = 42;
-    self::use(super.{self::B::c} = 42);
-    super.{self::A::d} = 42;
-    self::use(super.{self::A::d} = 42);
-    super.e = 42;
-    self::use(super.e = 42);
-    super.f = 42;
-    self::use(super.f = 42);
-    super.{self::A::g} = 42;
-    self::use(super.{self::A::g} = 42);
-    super.{self::A::h} = 42;
-    self::use(super.{self::A::h} = 42);
-    super.{self::B::i} = 42;
-    self::use(super.{self::B::i} = 42);
-    super.{self::A::[]=}(87, 42);
-    self::use(let final dynamic #t31 = 87 in let final dynamic #t32 = 42 in let final dynamic #t33 = super.{self::A::[]=}(#t31, #t32) in #t32);
-    super.m = 42;
-    self::use(super.m = 42);
-    super.{self::A::a}.==(null) ? super.{self::A::a} = 42 : null;
-    self::use(let final dynamic #t34 = super.{self::A::a} in #t34.==(null) ? super.{self::A::a} = 42 : #t34);
-    super.{self::B::b}.==(null) ? super.{self::A::b} = 42 : null;
-    self::use(let final dynamic #t35 = super.{self::B::b} in #t35.==(null) ? super.{self::A::b} = 42 : #t35);
-    super.{self::A::c}.==(null) ? super.{self::B::c} = 42 : null;
-    self::use(let final dynamic #t36 = super.{self::A::c} in #t36.==(null) ? super.{self::B::c} = 42 : #t36);
-    super.{self::B::d}.==(null) ? super.{self::A::d} = 42 : null;
-    self::use(let final dynamic #t37 = super.{self::B::d} in #t37.==(null) ? super.{self::A::d} = 42 : #t37);
-    super.{self::A::e}.==(null) ? super.e = 42 : null;
-    self::use(let final dynamic #t38 = super.{self::A::e} in #t38.==(null) ? super.e = 42 : #t38);
-    super.{self::A::f}.==(null) ? super.f = 42 : null;
-    self::use(let final dynamic #t39 = super.{self::A::f} in #t39.==(null) ? super.f = 42 : #t39);
-    super.g.==(null) ? super.{self::A::g} = 42 : null;
-    self::use(let final dynamic #t40 = super.g in #t40.==(null) ? super.{self::A::g} = 42 : #t40);
-    super.{self::A::h}.==(null) ? super.{self::A::h} = 42 : null;
-    self::use(let final dynamic #t41 = super.{self::A::h} in #t41.==(null) ? super.{self::A::h} = 42 : #t41);
-    super.{self::A::i}.==(null) ? super.{self::B::i} = 42 : null;
-    self::use(let final dynamic #t42 = super.{self::A::i} in #t42.==(null) ? super.{self::B::i} = 42 : #t42);
-    let final dynamic #t43 = 87 in super.{self::A::[]}(#t43).==(null) ? let final dynamic #t44 = 42 in let final dynamic #t45 = super.{self::A::[]=}(#t43, #t44) in #t44 : null;
-    self::use(let final dynamic #t46 = 87 in let final dynamic #t47 = super.{self::A::[]}(#t46) in #t47.==(null) ? let final dynamic #t48 = 42 in let final dynamic #t49 = super.{self::A::[]=}(#t46, #t48) in #t48 : #t47);
-    super.{self::A::m}.==(null) ? super.m = 42 : null;
-    self::use(let final dynamic #t50 = super.{self::A::m} in #t50.==(null) ? super.m = 42 : #t50);
-    super.{self::A::a} = super.{self::A::a}.+(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
-    super.{self::A::b} = super.{self::B::b}.+(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
-    super.{self::B::c} = super.{self::A::c}.+(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
-    super.{self::A::d} = super.{self::B::d}.+(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
-    super.e = super.{self::A::e}.+(42);
-    self::use(super.e = super.{self::A::e}.+(42));
-    super.f = super.{self::A::f}.+(42);
-    self::use(super.f = super.{self::A::f}.+(42));
-    super.{self::A::g} = super.g.+(42);
-    self::use(super.{self::A::g} = super.g.+(42));
-    super.{self::A::h} = super.{self::A::h}.+(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
-    super.{self::B::i} = super.{self::A::i}.+(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
-    let final dynamic #t51 = 87 in super.{self::A::[]=}(#t51, super.{self::A::[]}(#t51).+(42));
-    self::use(let final dynamic #t52 = 87 in let final dynamic #t53 = super.{self::A::[]}(#t52).+(42) in let final dynamic #t54 = super.{self::A::[]=}(#t52, #t53) in #t53);
-    super.m = super.{self::A::m}.+(42);
-    self::use(super.m = super.{self::A::m}.+(42));
-    super.{self::A::a} = super.{self::A::a}.-(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
-    super.{self::A::b} = super.{self::B::b}.-(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
-    super.{self::B::c} = super.{self::A::c}.-(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
-    super.{self::A::d} = super.{self::B::d}.-(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
-    super.e = super.{self::A::e}.-(42);
-    self::use(super.e = super.{self::A::e}.-(42));
-    super.f = super.{self::A::f}.-(42);
-    self::use(super.f = super.{self::A::f}.-(42));
-    super.{self::A::g} = super.g.-(42);
-    self::use(super.{self::A::g} = super.g.-(42));
-    super.{self::A::h} = super.{self::A::h}.-(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
-    super.{self::B::i} = super.{self::A::i}.-(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
-    let final dynamic #t55 = 87 in super.{self::A::[]=}(#t55, super.{self::A::[]}(#t55).-(42));
-    self::use(let final dynamic #t56 = 87 in let final dynamic #t57 = super.{self::A::[]}(#t56).-(42) in let final dynamic #t58 = super.{self::A::[]=}(#t56, #t57) in #t57);
-    super.m = super.{self::A::m}.-(42);
-    self::use(super.m = super.{self::A::m}.-(42));
-  }
-}
-static method use(dynamic x) → dynamic {
-  if(x.==(new core::DateTime::now().millisecondsSinceEpoch))
-    throw "Shouldn't happen";
-}
-static method main() → dynamic {
-  try {
-    new self::C::•().test();
-  }
-  on core::NoSuchMethodError catch(no-exception-var) {
-    return;
-  }
-  throw "Test failed";
-}
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.outline.expect b/pkg/front_end/testcases/super_rasta_copy.dart.outline.expect
deleted file mode 100644
index b65a6c3..0000000
--- a/pkg/front_end/testcases/super_rasta_copy.dart.outline.expect
+++ /dev/null
@@ -1,56 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic a;
-  field dynamic b;
-  field dynamic c;
-  field dynamic d;
-  final field dynamic f;
-  synthetic constructor •() → self::A
-    ;
-  get e() → dynamic
-    ;
-  set g(dynamic _) → dynamic
-    ;
-  get h() → dynamic
-    ;
-  set h(dynamic _) → dynamic
-    ;
-  get i() → dynamic
-    ;
-  operator [](dynamic _) → dynamic
-    ;
-  operator []=(dynamic a, dynamic b) → dynamic
-    ;
-  operator ~() → dynamic
-    ;
-  operator unary-() → dynamic
-    ;
-  operator ==(dynamic other) → dynamic
-    ;
-  method m() → void
-    ;
-}
-class B extends self::A {
-  final field dynamic d;
-  synthetic constructor •() → self::B
-    ;
-  get b() → dynamic
-    ;
-  set c(dynamic x) → dynamic
-    ;
-  set i(dynamic x) → dynamic
-    ;
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    ;
-  method test() → dynamic
-    ;
-}
-static method use(dynamic x) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
deleted file mode 100644
index f818b59..0000000
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ /dev/null
@@ -1,494 +0,0 @@
-// Unhandled errors:
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:60:11: Error: Superclass has no getter named 'g'.
-//     super.g;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:61:15: Error: Superclass has no getter named 'g'.
-//     use(super.g);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:79:11: Error: Superclass has no setter named 'e'.
-//     super.e++;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:80:15: Error: Superclass has no setter named 'e'.
-//     use(super.e++);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:81:11: Error: Superclass has no setter named 'f'.
-//     super.f++;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:82:15: Error: Superclass has no setter named 'f'.
-//     use(super.f++);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:83:11: Error: Superclass has no getter named 'g'.
-//     super.g++;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:84:15: Error: Superclass has no getter named 'g'.
-//     use(super.g++);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:91:11: Error: Superclass has no setter named 'm'.
-//     super.m++;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:92:15: Error: Superclass has no setter named 'm'.
-//     use(super.m++);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:102:13: Error: Superclass has no setter named 'e'.
-//     ++super.e;
-//             ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:103:17: Error: Superclass has no setter named 'e'.
-//     use(++super.e);
-//                 ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:104:13: Error: Superclass has no setter named 'f'.
-//     ++super.f;
-//             ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:105:17: Error: Superclass has no setter named 'f'.
-//     use(++super.f);
-//                 ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:106:13: Error: Superclass has no getter named 'g'.
-//     ++super.g;
-//             ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:107:17: Error: Superclass has no getter named 'g'.
-//     use(++super.g);
-//                 ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:114:13: Error: Superclass has no setter named 'm'.
-//     ++super.m;
-//             ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:115:17: Error: Superclass has no setter named 'm'.
-//     use(++super.m);
-//                 ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:129:11: Error: Superclass has no method named 'g'.
-//     super.g();
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:130:15: Error: Superclass has no method named 'g'.
-//     use(super.g());
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:150:11: Error: Superclass has no setter named 'e'.
-//     super.e = 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:151:15: Error: Superclass has no setter named 'e'.
-//     use(super.e = 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:152:11: Error: Superclass has no setter named 'f'.
-//     super.f = 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:153:15: Error: Superclass has no setter named 'f'.
-//     use(super.f = 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:162:11: Error: Superclass has no setter named 'm'.
-//     super.m = 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:163:15: Error: Superclass has no setter named 'm'.
-//     use(super.m = 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:173:11: Error: Superclass has no setter named 'e'.
-//     super.e ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:174:15: Error: Superclass has no setter named 'e'.
-//     use(super.e ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:175:11: Error: Superclass has no setter named 'f'.
-//     super.f ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:176:15: Error: Superclass has no setter named 'f'.
-//     use(super.f ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:177:11: Error: Superclass has no getter named 'g'.
-//     super.g ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:178:15: Error: Superclass has no getter named 'g'.
-//     use(super.g ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:185:11: Error: Superclass has no setter named 'm'.
-//     super.m ??= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:186:15: Error: Superclass has no setter named 'm'.
-//     use(super.m ??= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:196:11: Error: Superclass has no setter named 'e'.
-//     super.e += 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:197:15: Error: Superclass has no setter named 'e'.
-//     use(super.e += 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:198:11: Error: Superclass has no setter named 'f'.
-//     super.f += 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:199:15: Error: Superclass has no setter named 'f'.
-//     use(super.f += 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:200:11: Error: Superclass has no getter named 'g'.
-//     super.g += 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:201:15: Error: Superclass has no getter named 'g'.
-//     use(super.g += 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:208:11: Error: Superclass has no setter named 'm'.
-//     super.m += 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:209:15: Error: Superclass has no setter named 'm'.
-//     use(super.m += 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:219:11: Error: Superclass has no setter named 'e'.
-//     super.e -= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:220:15: Error: Superclass has no setter named 'e'.
-//     use(super.e -= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:221:11: Error: Superclass has no setter named 'f'.
-//     super.f -= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:222:15: Error: Superclass has no setter named 'f'.
-//     use(super.f -= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:223:11: Error: Superclass has no getter named 'g'.
-//     super.g -= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:224:15: Error: Superclass has no getter named 'g'.
-//     use(super.g -= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:231:11: Error: Superclass has no setter named 'm'.
-//     super.m -= 42;
-//           ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:232:15: Error: Superclass has no setter named 'm'.
-//     use(super.m -= 42);
-//               ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:139:12: Error: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//     super.m(87);
-//            ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:140:16: Error: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//     use(super.m(87));
-//                ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:14:9: Error: Final field 'f' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final f;
-//         ^
-//
-// pkg/front_end/testcases/super_rasta_copy.dart:33:9: Error: Final field 'd' is not initialized.
-// Try to initialize the field in the declaration or in every constructor.
-//   final d;
-//         ^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic a = null;
-  field dynamic b = null;
-  field dynamic c = null;
-  field dynamic d = null;
-  final field dynamic f = null;
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  get e() → dynamic
-    return null;
-  set g(dynamic _) → void {}
-  get h() → dynamic
-    return null;
-  set h(dynamic _) → void {}
-  get i() → dynamic
-    return null;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic a, dynamic b) → void {}
-  operator ~() → dynamic
-    return 117;
-  operator unary-() → dynamic
-    return 117;
-  operator ==(dynamic other) → core::bool
-    return true;
-  method m() → void {}
-}
-class B extends self::A {
-  final field dynamic d = null;
-  synthetic constructor •() → void
-    : super self::A::•()
-    ;
-  get b() → dynamic
-    return null;
-  set c(dynamic x) → void {}
-  set i(dynamic x) → void {}
-}
-class C extends self::B {
-  synthetic constructor •() → void
-    : super self::B::•()
-    ;
-  method test() → dynamic {
-    super.{self::A::~}();
-    self::use(super.{self::A::~}());
-    super.{self::A::unary-}();
-    self::use(super.{self::A::unary-}());
-    super.{self::A::==}(87);
-    self::use(super.{self::A::==}(87));
-    !super.{self::A::==}(87);
-    self::use(!super.{self::A::==}(87));
-    super.{self::A::a};
-    self::use(super.{self::A::a});
-    super.{self::B::b};
-    self::use(super.{self::B::b});
-    super.{self::A::c};
-    self::use(super.{self::A::c});
-    super.{self::B::d};
-    self::use(super.{self::B::d});
-    super.{self::A::e};
-    self::use(super.{self::A::e});
-    super.{self::A::f};
-    self::use(super.{self::A::f});
-    super.g;
-    self::use(super.g);
-    super.{self::A::h};
-    self::use(super.{self::A::h});
-    super.{self::A::i};
-    self::use(super.{self::A::i});
-    super.{self::A::[]}(87);
-    self::use(super.{self::A::[]}(87));
-    super.{self::A::m};
-    self::use(super.{self::A::m});
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(let final dynamic #t1 = super.{self::A::a} in let final dynamic #t2 = super.{self::A::a} = #t1.+(1) in #t1);
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(let final dynamic #t3 = super.{self::B::b} in let final dynamic #t4 = super.{self::A::b} = #t3.+(1) in #t3);
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(let final dynamic #t5 = super.{self::A::c} in let final dynamic #t6 = super.{self::B::c} = #t5.+(1) in #t5);
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(let final dynamic #t7 = super.{self::B::d} in let final dynamic #t8 = super.{self::A::d} = #t7.+(1) in #t7);
-    super.e = super.{self::A::e}.+(1);
-    self::use(let final dynamic #t9 = super.{self::A::e} in let final dynamic #t10 = super.e = #t9.+(1) in #t9);
-    super.f = super.{self::A::f}.+(1);
-    self::use(let final dynamic #t11 = super.{self::A::f} in let final dynamic #t12 = super.f = #t11.+(1) in #t11);
-    super.{self::A::g} = super.g.+(1);
-    self::use(let final dynamic #t13 = super.g in let final dynamic #t14 = super.{self::A::g} = #t13.+(1) in #t13);
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
-    let final core::int #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(1));
-    self::use(let final core::int #t20 = 87 in let final dynamic #t21 = super.{self::A::[]}(#t20) in let final void #t22 = super.{self::A::[]=}(#t20, #t21.+(1)) in #t21);
-    super.m = let final dynamic #t23 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:91:12: Error: The method '+' isn't defined for the class '() \u8594 void'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
-    super.m++;
-           ^";
-    self::use(let final () → void #t24 = super.{self::A::m} in let final dynamic #t25 = super.m = let final dynamic #t26 = #t24 in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:92:16: Error: The method '+' isn't defined for the class '() \u8594 void'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
-    use(super.m++);
-               ^" in #t24);
-    super.{self::A::a} = super.{self::A::a}.+(1);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(1));
-    super.{self::A::b} = super.{self::B::b}.+(1);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(1));
-    super.{self::B::c} = super.{self::A::c}.+(1);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(1));
-    super.{self::A::d} = super.{self::B::d}.+(1);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(1));
-    super.e = super.{self::A::e}.+(1);
-    self::use(super.e = super.{self::A::e}.+(1));
-    super.f = super.{self::A::f}.+(1);
-    self::use(super.f = super.{self::A::f}.+(1));
-    super.{self::A::g} = super.g.+(1);
-    self::use(super.{self::A::g} = super.g.+(1));
-    super.{self::A::h} = super.{self::A::h}.+(1);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(1));
-    super.{self::B::i} = super.{self::A::i}.+(1);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(1));
-    let final core::int #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(1) in let final void #t29 = super.{self::A::[]=}(#t27, #t28) in #t28;
-    self::use(let final core::int #t30 = 87 in let final dynamic #t31 = super.{self::A::[]}(#t30).+(1) in let final void #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
-    super.m = let final dynamic #t33 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:114:5: Error: The method '+' isn't defined for the class '() \u8594 void'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
-    ++super.m;
-    ^";
-    self::use(super.m = let final dynamic #t34 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:115:9: Error: The method '+' isn't defined for the class '() \u8594 void'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
-    use(++super.m);
-        ^");
-    super.{self::A::a}.call();
-    self::use(super.{self::A::a}.call());
-    super.{self::B::b}.call();
-    self::use(super.{self::B::b}.call());
-    super.{self::A::c}.call();
-    self::use(super.{self::A::c}.call());
-    super.{self::B::d}.call();
-    self::use(super.{self::B::d}.call());
-    super.{self::A::e}.call();
-    self::use(super.{self::A::e}.call());
-    super.{self::A::f}.call();
-    self::use(super.{self::A::f}.call());
-    super.g();
-    self::use(super.g());
-    super.{self::A::h}.call();
-    self::use(super.{self::A::h}.call());
-    super.{self::A::i}.call();
-    self::use(super.{self::A::i}.call());
-    super.{self::A::[]}(87).call();
-    self::use(super.{self::A::[]}(87).call());
-    super.{self::A::m}();
-    self::use(super.{self::A::m}());
-    super.{self::A::m}(87);
-    self::use(super.{self::A::m}(87));
-    super.{self::A::a} = 42;
-    self::use(super.{self::A::a} = 42);
-    super.{self::A::b} = 42;
-    self::use(super.{self::A::b} = 42);
-    super.{self::B::c} = 42;
-    self::use(super.{self::B::c} = 42);
-    super.{self::A::d} = 42;
-    self::use(super.{self::A::d} = 42);
-    super.e = 42;
-    self::use(super.e = 42);
-    super.f = 42;
-    self::use(super.f = 42);
-    super.{self::A::g} = 42;
-    self::use(super.{self::A::g} = 42);
-    super.{self::A::h} = 42;
-    self::use(super.{self::A::h} = 42);
-    super.{self::B::i} = 42;
-    self::use(super.{self::B::i} = 42);
-    super.{self::A::[]=}(87, 42);
-    self::use(let final core::int #t35 = 87 in let final core::int #t36 = 42 in let final void #t37 = super.{self::A::[]=}(#t35, #t36) in #t36);
-    super.m = 42;
-    self::use(super.m = 42);
-    super.{self::A::a}.{core::Object::==}(null) ?{dynamic} super.{self::A::a} = 42 : null;
-    self::use(let final dynamic #t38 = super.{self::A::a} in #t38.{core::Object::==}(null) ?{dynamic} super.{self::A::a} = 42 : #t38);
-    super.{self::B::b}.{core::Object::==}(null) ?{dynamic} super.{self::A::b} = 42 : null;
-    self::use(let final dynamic #t39 = super.{self::B::b} in #t39.{core::Object::==}(null) ?{dynamic} super.{self::A::b} = 42 : #t39);
-    super.{self::A::c}.{core::Object::==}(null) ?{dynamic} super.{self::B::c} = 42 : null;
-    self::use(let final dynamic #t40 = super.{self::A::c} in #t40.{core::Object::==}(null) ?{dynamic} super.{self::B::c} = 42 : #t40);
-    super.{self::B::d}.{core::Object::==}(null) ?{dynamic} super.{self::A::d} = 42 : null;
-    self::use(let final dynamic #t41 = super.{self::B::d} in #t41.{core::Object::==}(null) ?{dynamic} super.{self::A::d} = 42 : #t41);
-    super.{self::A::e}.{core::Object::==}(null) ?{dynamic} super.e = 42 : null;
-    self::use(let final dynamic #t42 = super.{self::A::e} in #t42.{core::Object::==}(null) ?{dynamic} super.e = 42 : #t42);
-    super.{self::A::f}.{core::Object::==}(null) ?{dynamic} super.f = 42 : null;
-    self::use(let final dynamic #t43 = super.{self::A::f} in #t43.{core::Object::==}(null) ?{dynamic} super.f = 42 : #t43);
-    super.g.{core::Object::==}(null) ?{dynamic} super.{self::A::g} = 42 : null;
-    self::use(let final dynamic #t44 = super.g in #t44.{core::Object::==}(null) ?{dynamic} super.{self::A::g} = 42 : #t44);
-    super.{self::A::h}.{core::Object::==}(null) ?{dynamic} super.{self::A::h} = 42 : null;
-    self::use(let final dynamic #t45 = super.{self::A::h} in #t45.{core::Object::==}(null) ?{dynamic} super.{self::A::h} = 42 : #t45);
-    super.{self::A::i}.{core::Object::==}(null) ?{dynamic} super.{self::B::i} = 42 : null;
-    self::use(let final dynamic #t46 = super.{self::A::i} in #t46.{core::Object::==}(null) ?{dynamic} super.{self::B::i} = 42 : #t46);
-    let final core::int #t47 = 87 in super.{self::A::[]}(#t47).{core::Object::==}(null) ?{dynamic} let final core::int #t48 = 42 in let final void #t49 = super.{self::A::[]=}(#t47, #t48) in #t48 : null;
-    self::use(let final core::int #t50 = 87 in let final dynamic #t51 = super.{self::A::[]}(#t50) in #t51.{core::Object::==}(null) ?{dynamic} let final core::int #t52 = 42 in let final void #t53 = super.{self::A::[]=}(#t50, #t52) in #t52 : #t51);
-    super.{self::A::m}.{core::Object::==}(null) ?{core::Object} super.m = 42 : null;
-    self::use(let final () → void #t54 = super.{self::A::m} in #t54.{core::Object::==}(null) ?{core::Object} super.m = 42 : #t54);
-    super.{self::A::a} = super.{self::A::a}.+(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.+(42));
-    super.{self::A::b} = super.{self::B::b}.+(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.+(42));
-    super.{self::B::c} = super.{self::A::c}.+(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.+(42));
-    super.{self::A::d} = super.{self::B::d}.+(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.+(42));
-    super.e = super.{self::A::e}.+(42);
-    self::use(super.e = super.{self::A::e}.+(42));
-    super.f = super.{self::A::f}.+(42);
-    self::use(super.f = super.{self::A::f}.+(42));
-    super.{self::A::g} = super.g.+(42);
-    self::use(super.{self::A::g} = super.g.+(42));
-    super.{self::A::h} = super.{self::A::h}.+(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.+(42));
-    super.{self::B::i} = super.{self::A::i}.+(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.+(42));
-    let final core::int #t55 = 87 in super.{self::A::[]=}(#t55, super.{self::A::[]}(#t55).+(42));
-    self::use(let final core::int #t56 = 87 in let final dynamic #t57 = super.{self::A::[]}(#t56).+(42) in let final void #t58 = super.{self::A::[]=}(#t56, #t57) in #t57);
-    super.m = let final dynamic #t59 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:208:13: Error: The method '+' isn't defined for the class '() \u8594 void'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
-    super.m += 42;
-            ^";
-    self::use(super.m = let final dynamic #t60 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:209:17: Error: The method '+' isn't defined for the class '() \u8594 void'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
-    use(super.m += 42);
-                ^");
-    super.{self::A::a} = super.{self::A::a}.-(42);
-    self::use(super.{self::A::a} = super.{self::A::a}.-(42));
-    super.{self::A::b} = super.{self::B::b}.-(42);
-    self::use(super.{self::A::b} = super.{self::B::b}.-(42));
-    super.{self::B::c} = super.{self::A::c}.-(42);
-    self::use(super.{self::B::c} = super.{self::A::c}.-(42));
-    super.{self::A::d} = super.{self::B::d}.-(42);
-    self::use(super.{self::A::d} = super.{self::B::d}.-(42));
-    super.e = super.{self::A::e}.-(42);
-    self::use(super.e = super.{self::A::e}.-(42));
-    super.f = super.{self::A::f}.-(42);
-    self::use(super.f = super.{self::A::f}.-(42));
-    super.{self::A::g} = super.g.-(42);
-    self::use(super.{self::A::g} = super.g.-(42));
-    super.{self::A::h} = super.{self::A::h}.-(42);
-    self::use(super.{self::A::h} = super.{self::A::h}.-(42));
-    super.{self::B::i} = super.{self::A::i}.-(42);
-    self::use(super.{self::B::i} = super.{self::A::i}.-(42));
-    let final core::int #t61 = 87 in super.{self::A::[]=}(#t61, super.{self::A::[]}(#t61).-(42));
-    self::use(let final core::int #t62 = 87 in let final dynamic #t63 = super.{self::A::[]}(#t62).-(42) in let final void #t64 = super.{self::A::[]=}(#t62, #t63) in #t63);
-    super.m = let final dynamic #t65 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:231:13: Error: The method '-' isn't defined for the class '() \u8594 void'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
-    super.m -= 42;
-            ^";
-    self::use(super.m = let final dynamic #t66 = super.{self::A::m} in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/super_rasta_copy.dart:232:17: Error: The method '-' isn't defined for the class '() \u8594 void'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
-    use(super.m -= 42);
-                ^");
-  }
-}
-static method use(dynamic x) → dynamic {
-  if(x.{core::Object::==}(new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch}))
-    throw "Shouldn't happen";
-}
-static method main() → dynamic {
-  try {
-    new self::C::•().{self::C::test}();
-  }
-  on core::NoSuchMethodError catch(no-exception-var) {
-    return;
-  }
-  throw "Test failed";
-}
diff --git a/pkg/front_end/testcases/tabs.dart.direct.expect b/pkg/front_end/testcases/tabs.dart.direct.expect
deleted file mode 100644
index 71641b8..0000000
--- a/pkg/front_end/testcases/tabs.dart.direct.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-// Formatted problems:
-//
-// pkg/front_end/testcases/tabs.dart:9:8: Warning: Getter not found: 'one'.
-// 	print(one);
-// 	      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:10:9: Warning: Getter not found: 'two'.
-// 		print(two);
-// 		      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:11:11: Warning: Getter not found: 'three'.
-// 		  print(three);
-// 		        ^^^^^
-//
-// pkg/front_end/testcases/tabs.dart:12:12: Warning: Getter not found: 'four'.
-// 	   	print(four);
-// 	   	      ^^^^
-//
-// pkg/front_end/testcases/tabs.dart:13:14: Warning: Getter not found: 'five'.
-// 	   	  print(five);
-// 	   	        ^^^^
-
-library;
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.direct.transformed.expect b/pkg/front_end/testcases/tabs.dart.direct.transformed.expect
deleted file mode 100644
index e5b77aa..0000000
--- a/pkg/front_end/testcases/tabs.dart.direct.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(let dynamic _ = null in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.legacy.expect b/pkg/front_end/testcases/tabs.dart.legacy.expect
new file mode 100644
index 0000000..a304f47
--- /dev/null
+++ b/pkg/front_end/testcases/tabs.dart.legacy.expect
@@ -0,0 +1,34 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/tabs.dart:9:8: Warning: Getter not found: 'one'.
+// 	print(one);
+// 	      ^^^
+//
+// pkg/front_end/testcases/tabs.dart:10:9: Warning: Getter not found: 'two'.
+// 		print(two);
+// 		      ^^^
+//
+// pkg/front_end/testcases/tabs.dart:11:11: Warning: Getter not found: 'three'.
+// 		  print(three);
+// 		        ^^^^^
+//
+// pkg/front_end/testcases/tabs.dart:12:12: Warning: Getter not found: 'four'.
+// 	   	print(four);
+// 	   	      ^^^^
+//
+// pkg/front_end/testcases/tabs.dart:13:14: Warning: Getter not found: 'five'.
+// 	   	  print(five);
+// 	   	        ^^^^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.legacy.transformed.expect b/pkg/front_end/testcases/tabs.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b542e17
--- /dev/null
+++ b/pkg/front_end/testcases/tabs.dart.legacy.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
new file mode 100644
index 0000000..c4a93e2
--- /dev/null
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -0,0 +1,974 @@
+# Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Status file for the text_serialization_test.dart test suite. This is testing
+# the round trip for Kernel textual serialization where the initial binary
+# Kernel files are produced by compiling Dart code via Fasta.
+
+abstract_members: TypeCheckError
+accessors: TextSerializationFailure # Was: RuntimeError
+ambiguous_exports: TextSerializationFailure # Was: RuntimeError # Expected, this file exports two main methods.
+annotation_eof: TextSerializationFailure # Was: Pass
+annotation_on_enum_values: TextSerializationFailure # Was: Pass
+annotation_top: TextSerializationFailure # Was: Pass
+annotation_typedef_formals_resolution: TextSerializationFailure # Was: Pass
+annotation_typedef_formals: TextSerializationFailure # Was: Pass
+annotation_variable_declaration: TextSerializationFailure # Was: Pass
+argument_mismatch: InstrumentationMismatch # Test assumes Dart 1.0 semantics
+argument: TextSerializationFailure # Was: Pass
+arithmetic: TextSerializationFailure # Was: Pass
+arrow_function: TextSerializationFailure # Was: Pass
+async_function: TextSerializationFailure # Was: Pass
+async_nested: TextSerializationFailure # Was: Pass
+await: TextSerializationFailure # Was: Pass
+bad_setter_abstract: TextSerializationFailure # Was: Pass
+bad_store: TextSerializationFailure # Was: Pass
+bounds_check_depends_on_inference: TextSerializationFailure # Was: Pass
+bug21938: TypeCheckError
+bug30695: TypeCheckError
+bug31124: TextSerializationFailure # Was: RuntimeError # Test has no main method (and we shouldn't add one).
+bug32414a: TextSerializationFailure # Was: Pass
+bug32414b: TextSerializationFailure # Was: Pass
+bug32426: TextSerializationFailure # Was: Pass
+bug32629: InstrumentationMismatch # Test has an intentional error
+bug32866: TextSerializationFailure # Was: Pass
+bug33099: TextSerializationFailure # Was: Pass
+bug33196: TextSerializationFailure # Was: Pass
+bug33206: TextSerializationFailure # Was: Pass
+bug33298: TextSerializationFailure # Was: Pass
+bug34511: TextSerializationFailure # Was: Pass
+bug35470: TextSerializationFailure # Was: Pass
+call: TypeCheckError
+cascade: TextSerializationFailure # Was: RuntimeError
+casts: TextSerializationFailure # Was: Pass
+check_deferred_allocation: TextSerializationFailure # Was: Pass
+check_deferred_as_check: TextSerializationFailure # Was: Pass
+check_deferred_before_args2: TextSerializationFailure # Was: Pass
+check_deferred_before_args: TextSerializationFailure # Was: Pass
+check_deferred_before_call: TextSerializationFailure # Was: Pass
+check_deferred_before_write: TextSerializationFailure # Was: Pass
+check_deferred_is_check: TextSerializationFailure # Was: Pass
+check_deferred_read_static_field: TextSerializationFailure # Was: Pass
+check_deferred_read: TextSerializationFailure # Was: Pass
+check_deferred_read_type: TextSerializationFailure # Was: Pass
+check_deferred_static_method_call: TextSerializationFailure # Was: Pass
+check_deferred_type_declaration: TextSerializationFailure # Was: Pass
+circularity-via-initializing-formal: TextSerializationFailure # Was: Pass
+classes: TextSerializationFailure # Was: Pass
+clone_function_type: TextSerializationFailure # Was: Pass
+closure: TextSerializationFailure # Was: Pass
+co19_language_metadata_syntax_t04: TextSerializationFailure # Was: Pass
+constructor_const_inference: TextSerializationFailure # Was: Pass
+constructor_cycle: TextSerializationFailure # Was: Pass
+constructor_function_types: TextSerializationFailure # Was: Pass
+constructor_initializer_invalid: TextSerializationFailure # Was: RuntimeError # Fails execution after recovery
+continue_inference_after_error_lib: TextSerializationFailure # Was: Pass
+continue_inference_after_error: TextSerializationFailure # Was: Pass
+covariant_generic: TextSerializationFailure # Was: RuntimeError
+cycles: TextSerializationFailure # Was: Pass
+default_values: TextSerializationFailure # Was: Pass
+deferred_lib: TextSerializationFailure # Was: Pass
+deferred_type_annotation: TextSerializationFailure # Was: Pass
+DeltaBlue: TextSerializationFailure # Was: Pass
+duplicated_bad_prefix_lib1: TextSerializationFailure # Was: Pass
+duplicated_bad_prefix_lib2: TextSerializationFailure # Was: Pass
+duplicated_bad_prefix: TextSerializationFailure # Was: Pass
+duplicated_declarations_lib: TextSerializationFailure # Was: Pass
+duplicated_declarations_part: TextSerializationFailure # Was: Pass
+duplicated_declarations: TypeCheckError
+duplicated_field_initializer: TextSerializationFailure # Was: RuntimeError
+duplicated_named_args_3: TextSerializationFailure # Was: Pass
+dynamic_and_void: InstrumentationMismatch # Test assumes Dart 1.0 semantics
+escape: TextSerializationFailure # Was: Pass
+export_main: TextSerializationFailure # Was: Pass
+export_test: TextSerializationFailure # Was: Pass
+expression/eval: TextSerializationFailure # Was: Pass
+expression/main: TextSerializationFailure # Was: Pass
+expressions: TextSerializationFailure # Was: RuntimeError
+external_import: TextSerializationFailure # Was: RuntimeError # The native extension to import doesn't exist. This is ok.
+external: TextSerializationFailure # Was: Pass
+fallthrough: ExpectationFileMismatch
+fibonacci: TextSerializationFailure # Was: Pass
+for_in_scope: TextSerializationFailure # Was: Pass
+for_in_without_declaration: TypeCheckError
+function_in_field: TextSerializationFailure # Was: Pass
+functions: TextSerializationFailure # Was: Pass
+function_type_assignments: TextSerializationFailure # Was: Pass
+function_type_default_value: TextSerializationFailure # Was: Pass
+function_type_is_check: TextSerializationFailure # Was: Pass
+function_type_recovery: TextSerializationFailure # Was: Pass
+future_or_test: TextSerializationFailure # Was: Pass
+hello: TextSerializationFailure # Was: Pass
+illegal_named_function_expression_scope: TextSerializationFailure # Was: Pass
+illegal_named_function_expression: TextSerializationFailure # Was: Pass
+implicit_const_with_static_fields: TextSerializationFailure # Was: Pass
+implicit_new: TextSerializationFailure # Was: Pass
+implicit_scope_test: TextSerializationFailure # Was: Pass
+implicit_this: TextSerializationFailure # Was: Pass
+incomplete_field_formal_parameter: TextSerializationFailure # Was: RuntimeError
+inference/abstract_class_instantiation: InstrumentationMismatch # Issue #30040
+inference/assert_initializer: TextSerializationFailure # Was: Pass
+inference/assert: TextSerializationFailure # Was: Pass
+inference/assign_local: TextSerializationFailure # Was: Pass
+inference/async_await: TextSerializationFailure # Was: Pass
+inference/async_closure_return_type_flatten: TextSerializationFailure # Was: Pass
+inference/async_closure_return_type_future_or: TextSerializationFailure # Was: Pass
+inference/async_closure_return_type_future: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_async_all_returns_are_futures: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_async_all_returns_are_values: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_async_mix_of_values_and_futures: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_async_star: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_basic: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_basic_void: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_infer_bottom_async_star: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_infer_bottom_async: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_infer_bottom_sync_star: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_infer_bottom_sync: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_lub: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_nested_lambdas: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_no_return: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_returns: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_sync_star: TextSerializationFailure # Was: Pass
+inference/block_bodied_lambdas_void_context: TextSerializationFailure # Was: Pass
+inference/bottom_in_closure: TextSerializationFailure # Was: Pass
+inference/bottom: TextSerializationFailure # Was: Pass
+inference/bug30251: TextSerializationFailure # Was: Pass
+inference/bug30620_b: TextSerializationFailure # Was: Pass
+inference/bug30620_c: TextSerializationFailure # Was: Pass
+inference/bug30620_d: TextSerializationFailure # Was: Pass
+inference/bug30620: TextSerializationFailure # Was: Pass
+inference/bug30624: TextSerializationFailure # Was: Pass
+inference/bug31132: TextSerializationFailure # Was: Pass
+inference/bug31133: TextSerializationFailure # Was: Pass
+inference/bug31436: TextSerializationFailure # Was: Pass
+inference/bug32291: TextSerializationFailure # Was: Pass
+inference/bug33324: TextSerializationFailure # Was: Pass
+inference/callable_generic_class: TextSerializationFailure # Was: Pass
+inference/call_corner_cases: TextSerializationFailure # Was: Pass
+inference/circular_method_inference: TextSerializationFailure # Was: Pass
+inference/circular_reference_via_closures_initializer_types: TextSerializationFailure # Was: Pass
+inference/circular_reference_via_closures: TextSerializationFailure # Was: Pass
+inference/closure_param_null_to_object: TextSerializationFailure # Was: Pass
+inference/coerce_bottom_and_null_types: TextSerializationFailure # Was: Pass
+inference/complex_predecrement: TextSerializationFailure # Was: Pass
+inference/conditional_lub: TextSerializationFailure # Was: Pass
+inference/conditional_upwards_inference: TextSerializationFailure # Was: Pass
+inference/conflicts_can_happen2: TypeCheckError
+inference/conflicts_can_happen: TypeCheckError
+inference/constructors_downwards_with_constraint: TextSerializationFailure # Was: Pass
+inference/constructors_inference_f_bounded: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_argument_not_assignable: TypeCheckError
+inference/constructors_infer_from_arguments_const: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_const_with_upper_bound: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_downwards_from_constructor: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_factory_calls_constructor: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_factory: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_named_factory: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_named: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_redirecting_factory: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_redirecting_factory_to_factory: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments_redirecting: TextSerializationFailure # Was: Pass
+inference/constructors_infer_from_arguments: TextSerializationFailure # Was: Pass
+inference/constructors_reverse_type_parameters: TextSerializationFailure # Was: Pass
+inference/constructors_too_many_positional_arguments: InstrumentationMismatch # Issue #30040
+inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer: TypeCheckError
+inference/dont_infer_field_type_when_initializer_is_null: TextSerializationFailure # Was: Pass
+inference/dont_infer_type_on_dynamic: TextSerializationFailure # Was: Pass
+inference/dont_infer_type_when_initializer_is_null: TextSerializationFailure # Was: Pass
+inference/downward_inference_fixes_no_upwards_errors: TextSerializationFailure # Was: Pass
+inference/downward_inference_miscellaneous: TextSerializationFailure # Was: Pass
+inference/downwards_context_from_inferred_field_type: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_class_members: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_for_loop_variable: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_locals_referring_to_locals: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_locals: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_parameter_local: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_parameter: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_typedef: TextSerializationFailure # Was: Pass
+inference/downwards_inference_annotations_type_variable: InstrumentationMismatch # Issue 28981
+inference/downwards_inference_annotations_type_variable_local: TextSerializationFailure # Was: Pass
+inference/downwards_inference_assignment_statements: TextSerializationFailure # Was: Pass
+inference/downwards_inference_async_await: TextSerializationFailure # Was: Pass
+inference/downwards_inference_for_each: TextSerializationFailure # Was: Pass
+inference/downwards_inference_initializing_formal_default_formal: TextSerializationFailure # Was: Pass
+inference/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
+inference/downwards_inference_inside_top_level: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_constructor_arguments_infer_downwards: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_function_arguments_infer_downwards: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_function_expressions: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_function_of_t_using_the_t: InstrumentationMismatch # Issue #29798
+inference/downwards_inference_on_generic_constructor_arguments_empty_list: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_generic_constructor_arguments_infer_downwards: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_generic_function_expressions: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_instance_creations_infer_downwards: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_list_literals_infer_downwards: TextSerializationFailure # Was: RuntimeError
+inference/downwards_inference_on_list_literals_infer_if_value_types_match_context: TextSerializationFailure # Was: Pass
+inference/downwards_inference_on_map_literals: TextSerializationFailure # Was: Pass
+inference/downwards_inference_yield_yield_star: TextSerializationFailure # Was: Pass
+inference/dynamic_methods: TextSerializationFailure # Was: Pass
+inference/field_initializer_context_explicit: TextSerializationFailure # Was: Pass
+inference/field_initializer_context_implicit: TextSerializationFailure # Was: Pass
+inference/field_initializer_context_this: TextSerializationFailure # Was: Pass
+inference/field_initializer_parameter: TextSerializationFailure # Was: Pass
+inference/field_refers_to_static_getter: TextSerializationFailure # Was: Pass
+inference/field_refers_to_top_level_getter: TextSerializationFailure # Was: Pass
+inference/for_each_downcast_iterable: TextSerializationFailure # Was: Pass
+inference/for_in_loop_promotion: TextSerializationFailure # Was: Pass
+inference/for_loop_empty_condition: TextSerializationFailure # Was: Pass
+inference/for_loop_initializer_expression: TextSerializationFailure # Was: Pass
+inference/for_loop_promotion: TextSerializationFailure # Was: Pass
+inference/future_or_subtyping: TextSerializationFailure # Was: Pass
+inference/future_then_2: TextSerializationFailure # Was: Pass
+inference/future_then_3: TextSerializationFailure # Was: Pass
+inference/future_then_4: TextSerializationFailure # Was: Pass
+inference/future_then_5: TextSerializationFailure # Was: Pass
+inference/future_then_6: TextSerializationFailure # Was: Pass
+inference/future_then_conditional_2: TextSerializationFailure # Was: Pass
+inference/future_then_conditional_3: TextSerializationFailure # Was: Pass
+inference/future_then_conditional_4: TextSerializationFailure # Was: Pass
+inference/future_then_conditional_5: TextSerializationFailure # Was: Pass
+inference/future_then_conditional_6: TextSerializationFailure # Was: Pass
+inference/future_then_conditional: TextSerializationFailure # Was: Pass
+inference/future_then_downwards_method_target: TextSerializationFailure # Was: Pass
+inference/future_then_explicit_future: InstrumentationMismatch # Issue #30040
+inference/future_then_ifNull: TextSerializationFailure # Was: Pass
+inference/future_then: TextSerializationFailure # Was: Pass
+inference/future_then_upwards_2: TextSerializationFailure # Was: RuntimeError
+inference/future_then_upwards_3: TextSerializationFailure # Was: Pass
+inference/future_then_upwards_from_block: TextSerializationFailure # Was: Pass
+inference/future_then_upwards: TextSerializationFailure # Was: RuntimeError
+inference/future_union_async_conditional_2: TextSerializationFailure # Was: Pass
+inference/future_union_async_conditional: TextSerializationFailure # Was: Pass
+inference/future_union_downwards_2: TextSerializationFailure # Was: Pass
+inference/future_union_downwards_3: TextSerializationFailure # Was: Pass
+inference/future_union_downwards_4: TextSerializationFailure # Was: Pass
+inference/future_union_downwards_generic_method_with_future_return: TextSerializationFailure # Was: Pass
+inference/future_union_downwards_generic_method_with_generic_return: TextSerializationFailure # Was: Pass
+inference/future_union_downwards: TextSerializationFailure # Was: Pass
+inference/future_union_upwards_generic_methods: TextSerializationFailure # Was: Pass
+inference/generator_closure: TextSerializationFailure # Was: Pass
+inference/generic_functions_return_typedef: InstrumentationMismatch # Issue #29798
+inference/generic_methods_basic_downward_inference: TextSerializationFailure # Was: Pass
+inference/generic_methods_correctly_recognize_generic_upper_bound: TypeCheckError
+inference/generic_methods_dart_math_min_max: TextSerializationFailure # Was: Pass
+inference/generic_methods_do_not_infer_invalid_override_of_generic_method: TypeCheckError
+inference/generic_methods_downwards_inference_affects_arguments: TextSerializationFailure # Was: Pass
+inference/generic_methods_downwards_inference_fold: TextSerializationFailure # Was: Pass
+inference/generic_methods_handle_override_of_non_generic_with_generic: TypeCheckError
+inference/generic_methods_inference_error: TextSerializationFailure # Was: Pass
+inference/generic_methods_infer_generic_function_parameter_type2: TextSerializationFailure # Was: Pass
+inference/generic_methods_infer_generic_function_parameter_type: TextSerializationFailure # Was: Pass
+inference/generic_methods_infer_generic_function_return_type: TextSerializationFailure # Was: Pass
+inference/generic_methods_infer_generic_instantiation: TextSerializationFailure # Was: Pass
+inference/generic_methods_infer_generic_method_type: TextSerializationFailure # Was: Pass
+inference/generic_methods_infer_js_builtin: InstrumentationMismatch # Issue #30029
+inference/generic_methods_iterable_and_future: TextSerializationFailure # Was: Pass
+inference/generic_methods_nested_generic_instantiation: TextSerializationFailure # Was: Pass
+inference/generic_methods_uses_greatest_lower_bound: TextSerializationFailure # Was: Pass
+inference/greatest_closure_multiple_params: TextSerializationFailure # Was: Pass
+inference/index_assign_operator_return_type_2: TextSerializationFailure # Was: Pass
+inference/index_assign_operator_return_type: TextSerializationFailure # Was: Pass
+inference/infer_accessor_from_later_inferred_field: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_implicit_this: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_implicit_this_upwards: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_index_full: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_index_super: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_index_this: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_local: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_local_upwards: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_property_full: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_property_null_aware: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_property_null_aware_upwards: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_property_super: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_property_super_upwards: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_property_upwards: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_ref: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_static: TextSerializationFailure # Was: Pass
+inference/infer_assign_to_static_upwards: TextSerializationFailure # Was: Pass
+inference/infer_binary_custom: TextSerializationFailure # Was: Pass
+inference/infer_binary_double_double: TextSerializationFailure # Was: Pass
+inference/infer_binary_double_int: TextSerializationFailure # Was: Pass
+inference/infer_binary_int_double: TextSerializationFailure # Was: Pass
+inference/infer_binary_int_int: TextSerializationFailure # Was: Pass
+inference/infer_conditional: TextSerializationFailure # Was: Pass
+inference/infer_consts_transitively_2_a: TextSerializationFailure # Was: Pass
+inference/infer_consts_transitively_2_b: TextSerializationFailure # Was: Pass
+inference/infer_consts_transitively_2: TextSerializationFailure # Was: Pass
+inference/infer_consts_transitively_b: TextSerializationFailure # Was: Pass
+inference/infer_correctly_on_multiple_variables_declared_together: TextSerializationFailure # Was: Pass
+inference/infer_field_from_later_inferred_field: TextSerializationFailure # Was: Pass
+inference/infer_field_from_later_inferred_getter: TextSerializationFailure # Was: Pass
+inference/infer_field_from_later_inferred_setter: TextSerializationFailure # Was: Pass
+inference/infer_field_override_multiple: TypeCheckError
+inference/infer_field_override_of_override: TextSerializationFailure # Was: Pass
+inference/infer_field_overrides_getter: TextSerializationFailure # Was: Pass
+inference/infer_field_overrides_setter: TextSerializationFailure # Was: Pass
+inference/infer_field_override_with_substitution: TextSerializationFailure # Was: Pass
+inference/infer_field_static: TextSerializationFailure # Was: Pass
+inference/infer_final_field_getter_and_setter: TextSerializationFailure # Was: Pass
+inference/infer_final_field_getter_only: TextSerializationFailure # Was: Pass
+inference/infer_final_field_setter_only: TextSerializationFailure # Was: Pass
+inference/infer_from_complex_expressions_if_outer_most_value_is_precise: TypeCheckError # Issue #35630
+inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2: TextSerializationFailure # Was: Pass
+inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_cycle_libs_when_flag_is_on2: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_cycle_libs_when_flag_is_on: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_non_cycle_imports_with_flag2_a: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_non_cycle_imports_with_flag2: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_non_cycle_imports_with_flag_a: TextSerializationFailure # Was: Pass
+inference/infer_from_variables_in_non_cycle_imports_with_flag: TextSerializationFailure # Was: Pass
+inference/infer_generic_method_type_named: TextSerializationFailure # Was: Pass
+inference/infer_generic_method_type_positional2: TextSerializationFailure # Was: Pass
+inference/infer_generic_method_type_positional: TextSerializationFailure # Was: Pass
+inference/infer_generic_method_type_required: TextSerializationFailure # Was: Pass
+inference/infer_getter_cross_to_setter: TextSerializationFailure # Was: Pass
+inference/infer_getter_from_later_inferred_getter: TextSerializationFailure # Was: Pass
+inference/infer_list_literal_nested_in_map_literal: TextSerializationFailure # Was: Pass
+inference/infer_local_function_referenced_before_declaration: TextSerializationFailure # Was: Pass
+inference/infer_local_function_return_type: TextSerializationFailure # Was: Pass
+inference/infer_method_function_typed: TextSerializationFailure # Was: Pass
+inference/infer_method_missing_params: TypeCheckError
+inference/infer_parameter_type_setter_from_field: TextSerializationFailure # Was: Pass
+inference/infer_parameter_type_setter_from_setter: TextSerializationFailure # Was: Pass
+inference/infer_prefix_expression_custom: TextSerializationFailure # Was: Pass
+inference/infer_prefix_expression: TextSerializationFailure # Was: Pass
+inference/inferred_initializing_formal_checks_default_value: TextSerializationFailure # Was: Pass
+inference/inferred_nonstatic_field_depends_on_static_field_complex: TextSerializationFailure # Was: Pass
+inference/inferred_nonstatic_field_depends_on_top_level_var_simple: TextSerializationFailure # Was: Pass
+inference/inferred_type_block_closure_no_args_no_return: TextSerializationFailure # Was: Pass
+inference/inferred_type_block_closure_no_args_no_return_void_context: TextSerializationFailure # Was: Pass
+inference/inferred_type_cascade: TextSerializationFailure # Was: Pass
+inference/inferred_type_custom_binary_op: TextSerializationFailure # Was: Pass
+inference/inferred_type_custom_binary_op_via_interface: TextSerializationFailure # Was: Pass
+inference/inferred_type_custom_index_op: TextSerializationFailure # Was: Pass
+inference/inferred_type_custom_index_op_via_interface: TextSerializationFailure # Was: Pass
+inference/inferred_type_custom_unary_op: TextSerializationFailure # Was: Pass
+inference/inferred_type_custom_unary_op_via_interface: TextSerializationFailure # Was: Pass
+inference/inferred_type_extract_method_tear_off: TextSerializationFailure # Was: Pass
+inference/inferred_type_extract_method_tear_off_via_interface: TextSerializationFailure # Was: Pass
+inference/inferred_type_from_top_level_executable_tear_off: TextSerializationFailure # Was: Pass
+inference/inferred_type_invoke_method: TextSerializationFailure # Was: Pass
+inference/inferred_type_invoke_method_via_interface: TextSerializationFailure # Was: Pass
+inference/inferred_type_is_enum: TextSerializationFailure # Was: Pass
+inference/inferred_type_is_enum_values: TextSerializationFailure # Was: Pass
+inference/inferred_type_is_typedef_parameterized: TextSerializationFailure # Was: Pass
+inference/inferred_type_is_typedef: TextSerializationFailure # Was: Pass
+inference/inferred_type_uses_synthetic_function_type_function_typed_param: TextSerializationFailure # Was: Pass
+inference/inferred_type_uses_synthetic_function_type_named_param: TextSerializationFailure # Was: Pass
+inference/inferred_type_uses_synthetic_function_type_positional_param: TextSerializationFailure # Was: Pass
+inference/inferred_type_uses_synthetic_function_type_required_param: TextSerializationFailure # Was: Pass
+inference/inferred_type_uses_synthetic_function_type: TextSerializationFailure # Was: Pass
+inference/inferred_type_via_closure_multiple_levels_of_nesting: TextSerializationFailure # Was: Pass
+inference/inferred_type_via_closure_type_depends_on_args: TextSerializationFailure # Was: Pass
+inference/inferred_type_via_closure_type_independent_of_args_field: TextSerializationFailure # Was: Pass
+inference/inferred_type_via_closure_type_independent_of_args_top_level: TextSerializationFailure # Was: Pass
+inference/infer_rethrow: TextSerializationFailure # Was: Pass
+inference/infer_return_of_statement_lambda: TextSerializationFailure # Was: Pass
+inference/infer_return_type_for_static_setter: TextSerializationFailure # Was: Pass
+inference/infer_setter_cross_to_getter: TextSerializationFailure # Was: Pass
+inference/infer_setter_from_later_inferred_setter: TextSerializationFailure # Was: Pass
+inference/infer_setter_function_typed: TextSerializationFailure # Was: Pass
+inference/infer_setter_return_type_only: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively_2_a: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively2: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively3_a: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively3: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively_a: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively_b: TextSerializationFailure # Was: Pass
+inference/infer_statics_transitively: TextSerializationFailure # Was: Pass
+inference/infer_statics_with_method_invocations_a: TextSerializationFailure # Was: Pass
+inference/infer_statics_with_method_invocations: TextSerializationFailure # Was: Pass
+inference/infer_throw_downwards: TextSerializationFailure # Was: Pass
+inference/infer_throw: TextSerializationFailure # Was: Pass
+inference/infer_typed_map_literal: TextSerializationFailure # Was: Pass
+inference/infer_type_on_overridden_fields2: TextSerializationFailure # Was: Pass
+inference/infer_type_on_overridden_fields4: TextSerializationFailure # Was: Pass
+inference/infer_type_on_var2: TextSerializationFailure # Was: Pass
+inference/infer_type_on_var_from_field: TextSerializationFailure # Was: Pass
+inference/infer_type_on_var_from_top_level: TextSerializationFailure # Was: Pass
+inference/infer_type_on_var: TextSerializationFailure # Was: Pass
+inference/infer_type_regardless_of_declaration_order_or_cycles_b: TextSerializationFailure # Was: Pass
+inference/infer_type_regardless_of_declaration_order_or_cycles: TextSerializationFailure # Was: RuntimeError
+inference/infer_types_on_generic_instantiations_3: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_4: TextSerializationFailure # Was: RuntimeError
+inference/infer_types_on_generic_instantiations_5: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_infer: TypeCheckError
+inference/infer_types_on_generic_instantiations_in_library_cycle_a: TextSerializationFailure # Was: Pass
+inference/infer_types_on_generic_instantiations_in_library_cycle: TextSerializationFailure # Was: Pass
+inference/infer_types_on_loop_indices_for_each_loop_async: TextSerializationFailure # Was: Pass
+inference/infer_types_on_loop_indices_for_each_loop: TextSerializationFailure # Was: Pass
+inference/infer_types_on_loop_indices_for_loop_with_inference: TextSerializationFailure # Was: Pass
+inference/infer_use_of_void_local: TextSerializationFailure # Was: Pass
+inference/infer_variable_void: TextSerializationFailure # Was: Pass
+inference/inheritance_does_not_imply_circularity: TextSerializationFailure # Was: Pass
+inference/instance_creation_downwards: TextSerializationFailure # Was: Pass
+inference/instantiate_tearoff_after_contravariance_check: TextSerializationFailure # Was: Pass
+inference/instantiate_tearoff_of_call: TypeCheckError # Issue #31746
+inference/instantiate_tearoff: TextSerializationFailure # Was: Pass
+inference/instantiate_to_bounds_generic2_has_bound_defined_after: TextSerializationFailure # Was: Pass
+inference/instantiate_to_bounds_generic2_has_bound_defined_before: TextSerializationFailure # Was: Pass
+inference/instantiate_to_bounds_generic2_no_bound: TextSerializationFailure # Was: Pass
+inference/instantiate_to_bounds_generic_has_bound_defined_after: TextSerializationFailure # Was: Pass
+inference/instantiate_to_bounds_generic_has_bound_defined_after transform: RuntimeError
+inference/instantiate_to_bounds_generic_has_bound_defined_before: TextSerializationFailure # Was: Pass
+inference/instantiate_to_bounds_invoke_constructor_no_bound: TextSerializationFailure # Was: Pass
+inference/instantiate_to_bounds_invoke_constructor_type_args_exact: TextSerializationFailure # Was: Pass
+inference/instantiate_to_bounds_not_generic: TextSerializationFailure # Was: Pass
+inference/int_upwards_local: TextSerializationFailure # Was: Pass
+inference/lambda_does_not_have_propagated_type_hint: TextSerializationFailure # Was: Pass
+inference/lambda_return_type: TextSerializationFailure # Was: Pass
+inference/lambda_void_context: TextSerializationFailure # Was: Pass
+inference/list_literals_can_infer_null_bottom: TextSerializationFailure # Was: Pass
+inference/list_literals: TextSerializationFailure # Was: Pass
+inference/list_literals_top_level: TextSerializationFailure # Was: Pass
+inference/list_literal_typed: TextSerializationFailure # Was: Pass
+inference/local_constructor_from_arguments: TextSerializationFailure # Was: Pass
+inference/local_reference_upwards_local: TextSerializationFailure # Was: Pass
+inference/local_return_and_yield: TextSerializationFailure # Was: Pass
+inference/logical_or_promotion: TextSerializationFailure # Was: Pass
+inference/map_literals_can_infer_null: TextSerializationFailure # Was: Pass
+inference/map_literals: TextSerializationFailure # Was: Pass
+inference/map_literals_top_level: TextSerializationFailure # Was: Pass
+inference/method_call_with_type_arguments_instance_method_identifier_sequence: TextSerializationFailure # Was: Pass
+inference/method_call_with_type_arguments_instance_method: TextSerializationFailure # Was: Pass
+inference/method_call_with_type_arguments_static_method: TextSerializationFailure # Was: Pass
+inference/method_call_with_type_arguments_top_level_function: TextSerializationFailure # Was: Pass
+inference/mixin_inference_instantiate_to_bounds_1: TextSerializationFailure # Was: Pass
+inference/mixin_inference_instantiate_to_bounds_2: TextSerializationFailure # Was: Pass
+inference/mixin_inference_instantiate_to_bounds_3: TextSerializationFailure # Was: Pass
+inference/mixin_inference_multiple_constraints: TextSerializationFailure # Was: Pass
+inference/mixin_inference_non_trivial_constraints: TextSerializationFailure # Was: Pass
+inference/mixin_inference_outwards_1: TextSerializationFailure # Was: Pass
+inference/mixin_inference_outwards_2: TextSerializationFailure # Was: Pass
+inference/mixin_inference_outwards_3: TypeCheckError
+inference/mixin_inference_outwards_4: TypeCheckError
+inference/mixin_inference_unification_1: TypeCheckError
+inference/mixin_inference_unification_2: TypeCheckError
+inference_new/const_invocation: TextSerializationFailure # Was: Pass
+inference_new/dependency_only_if_generic_method: TextSerializationFailure # Was: Pass
+inference_new/dependency_only_if_overloaded: TextSerializationFailure # Was: Pass
+inference_new/do_loop: TextSerializationFailure # Was: Pass
+inference_new/downwards_inference_inside_top_level_2: TextSerializationFailure # Was: Pass
+inference_new/downwards_inference_inside_top_level: TextSerializationFailure # Was: Pass
+inference_new/field_inference_circularity: TextSerializationFailure # Was: Pass
+inference_new/for_each_identifier_downwards: TextSerializationFailure # Was: Pass
+inference_new/for_each_invalid_iterable: TextSerializationFailure # Was: Pass
+inference_new/for_each_outer_var_type: TextSerializationFailure # Was: Pass
+inference_new/indexed_assign_combiner: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_implicit_this: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_implicit_this_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_full: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_set_vs_get: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_super: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_super_upwards: TypeCheckError
+inference_new/infer_assign_to_index: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_this: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_index_this_upwards: TypeCheckError
+inference_new/infer_assign_to_index_upwards: TypeCheckError
+inference_new/infer_assign_to_local: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_local_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_custom: TypeCheckError
+inference_new/infer_assign_to_property_full: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_null_aware: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_null_aware_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_super: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_super_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_property_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_ref: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_static: TextSerializationFailure # Was: Pass
+inference_new/infer_assign_to_static_upwards: TextSerializationFailure # Was: Pass
+inference_new/infer_field_getter_setter_mismatch: TypeCheckError
+inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
+inference_new/infer_field_override_setter_overrides_getter: TextSerializationFailure # Was: Pass
+inference_new/infer_instance_accessor_ref: TextSerializationFailure # Was: Pass
+inference_new/infer_instance_field_ref_circular: TextSerializationFailure # Was: Pass
+inference_new/infer_instance_field_ref: TextSerializationFailure # Was: Pass
+inference_new/infer_logical: TextSerializationFailure # Was: Pass
+inference_new/infer_use_of_void: TextSerializationFailure # Was: Pass
+inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
+inference_new/list_literals_can_infer_null_top_level: TextSerializationFailure # Was: Pass
+inference_new/map_literals_can_infer_null_top_level: TextSerializationFailure # Was: Pass
+inference_new/multiple_interface_inheritance: TextSerializationFailure # Was: Pass
+inference_new/property_assign_combiner: TextSerializationFailure # Was: Pass
+inference_new/property_get_toplevel: TextSerializationFailure # Was: Pass
+inference_new/static_assign_combiner: TextSerializationFailure # Was: Pass
+inference_new/strongly_connected_component: TextSerializationFailure # Was: Pass
+inference_new/super_index_get_substitution: TextSerializationFailure # Was: Pass
+inference_new/super_index_get: TextSerializationFailure # Was: Pass
+inference_new/switch: TextSerializationFailure # Was: Pass
+inference_new/top_level_field_depends_on_multiple_inheritance: TextSerializationFailure # Was: Pass
+inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: TextSerializationFailure # Was: Pass
+inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: TextSerializationFailure # Was: Pass
+inference_new/void_return_type_subtypes_dynamic: TextSerializationFailure # Was: Pass
+inference_new/while_loop: TextSerializationFailure # Was: Pass
+inference/no_error_when_declared_type_is_num_and_assigned_null: TextSerializationFailure # Was: Pass
+inference/non_const_invocation: TextSerializationFailure # Was: Pass
+inference/non_inferrable_getter_setter: TextSerializationFailure # Was: Pass
+inference/null_aware_method_invocation: TextSerializationFailure # Was: Pass
+inference/null_aware_property_get: TextSerializationFailure # Was: Pass
+inference/null_coalescing_operator_2: TextSerializationFailure # Was: Pass
+inference/null_coalescing_operator: TextSerializationFailure # Was: Pass
+inference/null_literal_should_not_infer_as_bottom: TextSerializationFailure # Was: Pass
+inference/overloaded_int_operators: TextSerializationFailure # Was: Pass
+inference/override_equals: TextSerializationFailure # Was: RuntimeError
+inference/parameter_defaults_downwards: TextSerializationFailure # Was: Pass
+inference/parameter_defaults_upwards: TextSerializationFailure # Was: Pass
+inference/promote_bounds: TextSerializationFailure # Was: Pass
+inference/promote_from_logical_rhs: TextSerializationFailure # Was: Pass
+inference/promotion_subtype_check: TextSerializationFailure # Was: Pass
+inference/propagate_inference_to_field_in_class_dynamic_warnings: TextSerializationFailure # Was: Pass
+inference/propagate_inference_to_field_in_class: TextSerializationFailure # Was: Pass
+inference/propagate_inference_transitively2: TextSerializationFailure # Was: Pass
+inference/propagate_inference_transitively: TextSerializationFailure # Was: Pass
+inference/propagate_variable_get: TextSerializationFailure # Was: Pass
+inference/property_get_toplevel: TextSerializationFailure # Was: Pass
+inference/property_set_bad_setter: TextSerializationFailure # Was: Pass
+inference/property_set: TextSerializationFailure # Was: Pass
+inference/recursive_generic_function: TextSerializationFailure # Was: Pass
+inference/reference_to_typedef: TextSerializationFailure # Was: Pass
+inference/refine_binary_expression_type_type_parameter_t_double: TextSerializationFailure # Was: Pass
+inference/refine_binary_expression_type_type_parameter_t_int: TextSerializationFailure # Was: Pass
+inference/refine_binary_expression_type_type_parameter_t_t: TextSerializationFailure # Was: Pass
+inference/setter_return_type: TextSerializationFailure # Was: Pass
+inference/simple_literal_bool: TextSerializationFailure # Was: Pass
+inference/simple_literal_double: TextSerializationFailure # Was: Pass
+inference/simple_literal_int: TextSerializationFailure # Was: Pass
+inference/static_method_tear_off: TextSerializationFailure # Was: Pass
+inference/string_literal: TextSerializationFailure # Was: Pass
+inference/subexpressions_of_explicitly_typed_fields: TextSerializationFailure # Was: Pass
+inference/super_index_set_substitution: TextSerializationFailure # Was: Pass
+inference/super_index_set: TextSerializationFailure # Was: Pass
+inference/super_initializer_substitution: TextSerializationFailure # Was: Pass
+inference/super_initializer: TextSerializationFailure # Was: Pass
+inference/super_method_invocation_substitution: TextSerializationFailure # Was: Pass
+inference/super_method_invocation: TextSerializationFailure # Was: Pass
+inference/super_property_get_invoke_function_typed: TextSerializationFailure # Was: Pass
+inference/super_property_get_invoke_implicit_call: TextSerializationFailure # Was: Pass
+inference/super_property_get_substitution: TextSerializationFailure # Was: Pass
+inference/super_property_get_tearoff: TextSerializationFailure # Was: Pass
+inference/super_property_get: TextSerializationFailure # Was: Pass
+inference/super_property_set_substitution: TextSerializationFailure # Was: Pass
+inference/switch_continue: TextSerializationFailure # Was: Pass
+inference/symbol_literal: TextSerializationFailure # Was: Pass
+inference/this_reference: TextSerializationFailure # Was: Pass
+inference/toplevel_inference_toplevel_var: TextSerializationFailure # Was: Pass
+inference/top_level_return_and_yield: TextSerializationFailure # Was: Pass
+inference/try_catch_finally: TextSerializationFailure # Was: Pass
+inference/try_catch_promotion: TextSerializationFailure # Was: Pass
+inference/try_catch: TextSerializationFailure # Was: Pass
+inference/try_finally: TextSerializationFailure # Was: Pass
+inference/type_cast: TextSerializationFailure # Was: Pass
+inference/type_promotion_ignores_local_functions: TextSerializationFailure # Was: Pass
+inference/type_promotion_not_and_not: TextSerializationFailure # Was: Pass
+inference/type_promotion_simple: TextSerializationFailure # Was: Pass
+inference/type_promotion_stopped_by_access_in_a_closure: TextSerializationFailure # Was: Pass
+inference/type_promotion_stopped_by_assignment_in_scope: TextSerializationFailure # Was: Pass
+inference/type_promotion_stopped_by_mutation_in_a_closure: TextSerializationFailure # Was: Pass
+inference/unresolved_super: TypeCheckError
+inference/unsafe_block_closure_inference_closure_call: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_constructor_call_explicit_type_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_constructor_call_implicit_type_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_constructor_call_no_type_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_type_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: InstrumentationMismatch # Issue #25824
+inference/unsafe_block_closure_inference_function_call_implicit_type_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_function_call_no_type_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_in_list_dynamic: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_in_list_typed: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_in_list_untyped: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_in_map_dynamic: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_in_map_typed: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_in_map_untyped: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_method_call_explicit_type_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_method_call_implicit_type_param: TextSerializationFailure # Was: Pass
+inference/unsafe_block_closure_inference_method_call_no_type_param: TextSerializationFailure # Was: Pass
+inference/void_return_type_subtypes_dynamic: TextSerializationFailure # Was: Pass
+instantiate_to_bound/all_steps: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_generic_classes_from_dill: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_literal_list: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_literal_map: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_omitted_bound: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_super_bounded_type: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_typedef_literal_list: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_typedef_literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_typedef_literal_map: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_typedef_omitted_bound: TextSerializationFailure # Was: Pass
+instantiate_to_bound/body_typedef_super_bounded_type: TextSerializationFailure # Was: Pass
+instantiate_to_bound/contravariant_dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/contravariant_dependence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/contravariant_mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/contravariant_mutual_dependence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/covariant_dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/covariant_dependence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/covariant_mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/covariant_mutual_dependence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/dependence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/generic_classes_from_dill: TextSerializationFailure # Was: Pass
+instantiate_to_bound/inference_constrained_by_bound: TextSerializationFailure # Was: Pass
+instantiate_to_bound/inference_defaults_to_bound: TextSerializationFailure # Was: Pass
+instantiate_to_bound/inference_gives_input: TextSerializationFailure # Was: Pass
+instantiate_to_bound/inference_super_bounded_rejected: TextSerializationFailure # Was: Pass
+instantiate_to_bound/instantiated_in_outline: TextSerializationFailure # Was: Pass
+instantiate_to_bound/literal_list: TextSerializationFailure # Was: Pass
+instantiate_to_bound/literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
+instantiate_to_bound/literal_map: TextSerializationFailure # Was: Pass
+instantiate_to_bound/multiple_strongly_connected: TextSerializationFailure # Was: Pass
+instantiate_to_bound/mutual_dependence_in_literals: TextSerializationFailure # Was: Pass
+instantiate_to_bound/mutual_dependence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_bound_due_to_non_simple: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_bound_due_to_variables: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: TextSerializationFailure # Was: RuntimeError # Expected
+instantiate_to_bound/non_simple_class_typedef_cycle: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_co_inductive_for_each: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_co_inductive_no_dup: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_co_inductive: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_folded_regress: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_for_each: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_from_compiled: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_generic_function_in_bound_regress: TextSerializationFailure # Was: RuntimeError # Expected
+instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_many_libs_same_name_cycle: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_many: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_no_dup: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_suppress_consequence: TextSerializationFailure # Was: Pass
+instantiate_to_bound/non_simple_variables_from_same: TextSerializationFailure # Was: Pass
+instantiate_to_bound/omitted_bound: TextSerializationFailure # Was: Pass
+instantiate_to_bound/raw_in_bound: TextSerializationFailure # Was: Pass
+instantiate_to_bound/super_bounded_type: TextSerializationFailure # Was: Pass
+instantiate_to_bound/supertypes: TextSerializationFailure # Was: Pass
+instantiate_to_bound/typedef_instantiated_in_outline: TextSerializationFailure # Was: Pass
+instantiate_to_bound/typedef_literal_list: TextSerializationFailure # Was: Pass
+instantiate_to_bound/typedef_literal_list_with_generic_argument: TextSerializationFailure # Was: Pass
+instantiate_to_bound/typedef_literal_map: TextSerializationFailure # Was: Pass
+instantiate_to_bound/typedef_omitted_bound: TextSerializationFailure # Was: Pass
+instantiate_to_bound/typedef_raw_in_bound: TextSerializationFailure # Was: Pass
+instantiate_to_bound/typedef_super_bounded_type: TextSerializationFailure # Was: Pass
+invalid_assignment: TextSerializationFailure # Was: Pass
+invalid_cast: TextSerializationFailure # Was: Pass
+invalid_type: TypeCheckError
+invocations: TextSerializationFailure # Was: RuntimeError
+issue34899: TypeCheckError
+literals: TextSerializationFailure # Was: Pass
+local_generic_function: TextSerializationFailure # Was: Pass
+magic_const: TextSerializationFailure # Was: Pass
+map: TextSerializationFailure # Was: Pass
+metadata_enum: TextSerializationFailure # Was: Pass
+metadata_named_mixin_application: TextSerializationFailure # Was: Pass
+micro: TextSerializationFailure # Was: RuntimeError
+minimum_int: TextSerializationFailure # Was: Pass
+missing_constructor: TextSerializationFailure # Was: Pass
+mixin_application_override: TypeCheckError
+mixin_constructors_with_default_values: TextSerializationFailure # Was: Pass
+mixin_inherited_setter_for_mixed_in_field: TextSerializationFailure # Was: Pass
+mixin_super_repeated: TextSerializationFailure # Was: Pass
+mixin: TextSerializationFailure # Was: Pass
+named_function_scope: TextSerializationFailure # Was: Pass
+named_parameters: TextSerializationFailure # Was: Pass
+native_as_name: TextSerializationFailure # Was: Pass
+nested_implicit_const_with_env_var: TextSerializationFailure # Was: Pass
+new_const_insertion/simple: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/abstract_accessors_from_field_one_defined: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/abstract_accessors_from_field: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/abstract_accessors_from_field_with_substitution: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/abstract_interface_nsm_inherited: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/default_argument_values: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/duplicated_abstract_method: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/forwarders_not_assumed_from_mixin: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/interface_with_concrete: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/interface_with_nsm: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/no_forwarders_for_abstract_classes_chain: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/no_forwarders_for_abstract_classes: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/nsm_inherited: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/nsm_mixed_in: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/private_module: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/private_same: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/private: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/same: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/setter_not_shadowed_by_method: TextSerializationFailure # Was: Pass
+no_such_method_forwarders/subst_on_forwarder: TextSerializationFailure # Was: Pass
+no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
+no_such_method_private_setter: TextSerializationFailure # Was: Pass
+null_aware: TextSerializationFailure # Was: Pass
+operators: TextSerializationFailure # Was: Pass
+optional: TypeCheckError
+override_check_accessor_after_inference: TypeCheckError # Issue #31620
+override_check_accessor_basic: TypeCheckError # Issue #31620
+override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
+override_check_after_inference: TypeCheckError # Issue #31620
+override_check_basic: TypeCheckError # Issue #31620
+override_check_generic_method_f_bounded: TextSerializationFailure # Was: Pass
+override_check_two_substitutions: TextSerializationFailure # Was: Pass
+override_check_with_covariant_modifier: TypeCheckError # Issue #31620
+override: TextSerializationFailure # Was: Pass
+part_as_entry_point_lib: TextSerializationFailure # Was: Pass
+part_as_entry_point: TextSerializationFailure # Was: Pass
+prefer_baseclass: TextSerializationFailure # Was: Pass
+private_method_tearoff_lib: TextSerializationFailure # Was: Pass
+private_method_tearoff: TextSerializationFailure # Was: Pass
+public_method_tearoff_lib: TextSerializationFailure # Was: Pass
+public_method_tearoff: TextSerializationFailure # Was: Pass
+qualified_lib: TextSerializationFailure # Was: Pass
+qualified_part: TextSerializationFailure # Was: Pass
+qualified: TextSerializationFailure # Was: Pass
+rasta/abstract_constructor: TextSerializationFailure # Was: RuntimeError
+rasta/bad_constructor_redirection: TextSerializationFailure # Was: RuntimeError
+rasta/bad_continue: RuntimeError
+rasta/bad_default_constructor: VerificationError
+rasta/bad_explicit_super_constructor: TextSerializationFailure # Was: RuntimeError
+rasta/bad_implicit_super_constructor: TextSerializationFailure # Was: RuntimeError
+rasta/bad_interpolation: TextSerializationFailure # Was: RuntimeError
+rasta/bad_redirection: TextSerializationFailure # Was: RuntimeError
+rasta/bad_setter_initializer: TextSerializationFailure # Was: RuntimeError
+rasta/bad_unicode: TextSerializationFailure # Was: Pass
+rasta/breaking_bad: RuntimeError
+rasta/cascades: TextSerializationFailure # Was: Pass
+rasta/class_hierarchy: TextSerializationFailure # Was: RuntimeError
+rasta/class_member: TextSerializationFailure # Was: RuntimeError
+rasta/constant_get_and_invoke: TextSerializationFailure # Was: RuntimeError
+rasta/deferred_lib: TextSerializationFailure # Was: Pass
+rasta/deferred_load: TextSerializationFailure # Was: Pass
+rasta/duplicated_mixin: TextSerializationFailure # Was: RuntimeError # Expected, this file has no main method.
+rasta/enum: TextSerializationFailure # Was: Pass
+rasta/export: TextSerializationFailure # Was: RuntimeError # Expected, this file has no main method.
+rasta/external_factory_redirection: TextSerializationFailure # Was: Pass
+rasta/foo: TextSerializationFailure # Was: RuntimeError # Expected, this file has no main method.
+rasta/for_loop: TextSerializationFailure # Was: Pass
+rasta/generic_factory: TextSerializationFailure # Was: RuntimeError
+rasta/hello: TextSerializationFailure # Was: Pass
+rasta/import_export: TextSerializationFailure # Was: Pass
+rasta/issue_000001: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000002: TextSerializationFailure # Was: Pass
+rasta/issue_000004: TextSerializationFailure # Was: Pass
+rasta/issue_000006: TextSerializationFailure # Was: Pass
+rasta/issue_000007: TextSerializationFailure # Was: Pass
+rasta/issue_000008: TextSerializationFailure # Was: Pass
+rasta/issue_000011: TextSerializationFailure # Was: Pass
+rasta/issue_000012: TextSerializationFailure # Was: Pass
+rasta/issue_000025: TextSerializationFailure # Was: Pass
+rasta/issue_000026: TextSerializationFailure # Was: Pass
+rasta/issue_000031: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000032: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000034: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000035a: TextSerializationFailure # Was: Pass
+rasta/issue_000035: TextSerializationFailure # Was: Pass
+rasta/issue_000036: RuntimeError
+rasta/issue_000039: VerificationError
+rasta/issue_000041: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000042: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000043: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000044: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000046: TextSerializationFailure # Was: RuntimeError
+rasta/issue_000047: TextSerializationFailure # Was: Pass
+rasta/issue_000048: TextSerializationFailure # Was: Pass
+rasta/issue_000052: TextSerializationFailure # Was: Pass
+rasta/issue_000053: TextSerializationFailure # Was: Pass
+rasta/issue_000067: TextSerializationFailure # Was: Pass
+rasta/issue_000068: TextSerializationFailure # Was: Pass
+rasta/issue_000069: TextSerializationFailure # Was: Pass
+rasta/issue_000070: TextSerializationFailure # Was: Pass
+rasta/issue_000080: TextSerializationFailure # Was: Pass
+rasta/issue_000081: TextSerializationFailure # Was: RuntimeError
+rasta/malformed_const_constructor: TextSerializationFailure # Was: RuntimeError
+rasta/malformed_function: RuntimeError
+rasta/malformed_function_type: TextSerializationFailure # Was: Pass
+rasta/mixin_library: TypeCheckError
+rasta/native_is_illegal: TextSerializationFailure # Was: RuntimeError
+rasta/parser_error: TextSerializationFailure # Was: RuntimeError
+rasta/previsit_deferred: TextSerializationFailure # Was: Pass
+rasta/static: TextSerializationFailure # Was: RuntimeError
+rasta/super_initializer: TextSerializationFailure # Was: RuntimeError
+rasta/super_mixin: TypeCheckError
+rasta/super_operator: TypeCheckError
+rasta/super: TypeCheckError
+rasta/supports_reflection: TextSerializationFailure # Was: Pass
+rasta/switch_execution_case_t02: TextSerializationFailure # Was: Pass
+rasta/switch_fall_through: TextSerializationFailure # Was: Pass
+rasta/this_invoke: TextSerializationFailure # Was: Pass
+rasta/typedef: Crash
+rasta/type_literals: Crash
+rasta/type_with_parse_error: TextSerializationFailure # Was: Pass
+rasta/unresolved_constructor: TextSerializationFailure # Was: RuntimeError
+rasta/unresolved_for_in: TextSerializationFailure # Was: RuntimeError
+rasta/unresolved_recovery: TypeCheckError
+rasta/unresolved: RuntimeError
+redirecting_constructor: TextSerializationFailure # Was: Pass
+redirecting_factory_chain_test: TextSerializationFailure # Was: Pass
+redirecting_factory_const_inference: TextSerializationFailure # Was: Pass
+redirecting_factory_metadata: TextSerializationFailure # Was: Pass
+redirecting_factory_simple_test: TextSerializationFailure # Was: Pass
+redirecting_factory: TextSerializationFailure # Was: Pass
+redirecting_factory_typeargs_test: TextSerializationFailure # Was: Pass
+redirecting_factory_typeparambounds_test: TextSerializationFailure # Was: Pass
+redirecting_factory_typeparam_test: TextSerializationFailure # Was: Pass
+redirecting_initializer_arguments_assignable_test: TextSerializationFailure # Was: Pass
+redirecting_initializer_arguments_test: TextSerializationFailure # Was: Pass
+redirection_chain_type_arguments_subst: TextSerializationFailure # Was: Pass
+redirection_chain_type_arguments: TextSerializationFailure # Was: Pass
+redirection_type_arguments: TextSerializationFailure # Was: Pass
+regress/issue_29937: TextSerializationFailure # Was: Pass
+regress/issue_29940: TextSerializationFailure # Was: Pass
+regress/issue_29941: TextSerializationFailure # Was: Pass
+regress/issue_29942: TextSerializationFailure # Was: Pass
+regress/issue_29944: TextSerializationFailure # Was: Pass
+regress/issue_29975: TextSerializationFailure # Was: Pass
+regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
+regress/issue_29978: TextSerializationFailure # Was: Pass
+regress/issue_29979: TextSerializationFailure # Was: Pass
+regress/issue_29981: TextSerializationFailure # Was: Pass
+regress/issue_29982: TextSerializationFailure # Was: RuntimeError # Tests runtime behavior of error recovery.
+regress/issue_29983: TextSerializationFailure # Was: Pass
+regress/issue_29984: TextSerializationFailure # Was: Pass
+regress/issue_30834: TextSerializationFailure # Was: Pass
+regress/issue_30836: TextSerializationFailure # Was: RuntimeError # Issue 30836.
+regress/issue_30838: TextSerializationFailure # Was: Pass
+regress/issue_30981: TextSerializationFailure # Was: Pass
+regress/issue_31155: TextSerializationFailure # Was: Pass
+regress/issue_31171: TextSerializationFailure # Was: Pass
+regress/issue_31181: TextSerializationFailure # Was: Pass
+regress/issue_31183: TextSerializationFailure # Was: Pass
+regress/issue_31184: TextSerializationFailure # Was: Pass
+regress/issue_31185: TextSerializationFailure # Was: Pass
+regress/issue_31188: TextSerializationFailure # Was: Pass
+regress/issue_31190: TextSerializationFailure # Was: Pass
+regress/issue_31192: TextSerializationFailure # Was: Pass
+regress/issue_31198: TextSerializationFailure # Was: Pass
+regress/issue_31213: TextSerializationFailure # Was: Pass
+regress/issue_31299: TypeCheckError
+regress/issue_31766: TextSerializationFailure # Was: Pass
+regress/issue_31846: TextSerializationFailure # Was: Pass
+regress/issue_31996: TextSerializationFailure # Was: Pass
+regress/issue_32182: TextSerializationFailure # Was: Pass
+regress/issue_32196: TextSerializationFailure # Was: Pass
+regress/issue_32200: TextSerializationFailure # Was: RuntimeError # Invalid type.
+regress/issue_32660: TextSerializationFailure # Was: Pass
+regress/issue_32972: TypeCheckError
+regress/issue_33452: TextSerializationFailure # Was: RuntimeError # Test has an intentional error
+regress/issue_33672: TextSerializationFailure # Was: Pass
+regress/issue_34225: TextSerializationFailure # Was: RuntimeError
+regress/issue_34291_lib: TextSerializationFailure # Was: Pass
+regress/issue_34291: TextSerializationFailure # Was: Pass
+regress/issue_34403_lib: TextSerializationFailure # Was: Pass
+regress/issue_34403: TextSerializationFailure # Was: Pass
+regress/issue_34498_lib: TextSerializationFailure # Was: Pass
+regress/issue_34498: TextSerializationFailure # Was: Pass
+regress/issue_34563: TextSerializationFailure # Was: RuntimeError # Test execution after recovery
+regress/issue_34610: TextSerializationFailure # Was: Pass
+regress/issue_34614: TextSerializationFailure # Was: Pass
+regress/issue_34850: TextSerializationFailure # Was: Pass
+regress/issue_35151: TextSerializationFailure # Was: Pass
+regress/issue_35177: TextSerializationFailure # Was: RuntimeError
+regress/issue_35213: TextSerializationFailure # Was: Pass
+regress/issue_35258: TextSerializationFailure # Was: RuntimeError # Expected
+regress/issue_35259: TextSerializationFailure # Was: RuntimeError # Expected
+regress/issue_35260: TextSerializationFailure # Was: RuntimeError # Expected
+regress/issue_35266: TextSerializationFailure # Was: RuntimeError # Expected
+reject_generic_function_types_in_bounds: TextSerializationFailure # Was: RuntimeError # Expected
+return_with_unknown_type_in_context: TextSerializationFailure # Was: Pass
+runtime_checks/call_kinds_get: TextSerializationFailure # Was: Pass
+runtime_checks/call_kinds_set: TextSerializationFailure # Was: Pass
+runtime_checks/call_kinds: TextSerializationFailure # Was: Pass
+runtime_checks/call_method_implicit_tear_off_future_or: TextSerializationFailure # Was: Pass
+runtime_checks/call_method_implicit_tear_off: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_field: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_generic_method_type_parameter: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_generic_return_null_aware: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_generic_return_tear_off: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_generic_return: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_getter_return_null_aware: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_getter_return: TextSerializationFailure # Was: Pass
+runtime_checks/contravariant_getter: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_method_type_parameter: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_complex: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_in_interface_mixin: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_in_interface_super_mixin: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_in_interface_super: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_in_interface: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter_tear_off: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_generic_parameter: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword_field_inherited_by_setter: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword_field: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword_setter_inherited_by_field: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword_setter: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_keyword: TextSerializationFailure # Was: Pass
+runtime_checks/covariant_setter: TextSerializationFailure # Was: Pass
+runtime_checks/dynamic_invocation_generic: TextSerializationFailure # Was: Pass
+runtime_checks/dynamic_invocation_of_getter: TextSerializationFailure # Was: Pass
+runtime_checks/dynamic_invocation: TextSerializationFailure # Was: Pass
+runtime_checks/field_forwarding_stub_generic_covariant: TextSerializationFailure # Was: Pass
+runtime_checks/forwarding_stub_with_default_values: TextSerializationFailure # Was: Pass
+runtime_checks/forwarding_stub_with_non_covariant_param: TextSerializationFailure # Was: Pass
+runtime_checks/generic_covariance_inheritance_setter_field: TextSerializationFailure # Was: Pass
+runtime_checks/generic_vs_explicit_covariance: TextSerializationFailure # Was: Pass
+runtime_checks/implicit_downcast_assert_initializer: TextSerializationFailure # Was: Pass
+runtime_checks/implicit_downcast_assert_statement: TextSerializationFailure # Was: Pass
+runtime_checks/implicit_downcast_constructor_initializer: TextSerializationFailure # Was: Pass
+runtime_checks/implicit_downcast_do: TextSerializationFailure # Was: Pass
+runtime_checks/implicit_downcast_for_condition: TextSerializationFailure # Was: Pass
+runtime_checks/implicit_downcast_if: TextSerializationFailure # Was: Pass
+runtime_checks/implicit_downcast_not: TextSerializationFailure # Was: Pass
+runtime_checks/implicit_downcast_while: TextSerializationFailure # Was: Pass
+runtime_checks_new/abstract_override_becomes_forwarding_stub: TextSerializationFailure # Was: Pass
+runtime_checks_new/call_through_this: TextSerializationFailure # Was: Pass
+runtime_checks_new/contravariant_combiner: TextSerializationFailure # Was: Pass
+runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: TextSerializationFailure # Was: RuntimeError
+runtime_checks_new/contravariant_getter_return_compound_assign: TextSerializationFailure # Was: Pass
+runtime_checks_new/contravariant_index_assign: TextSerializationFailure # Was: Pass
+runtime_checks_new/contravariant_index_get: TextSerializationFailure # Was: Pass
+runtime_checks_new/derived_class_typed: TextSerializationFailure # Was: Pass
+runtime_checks_new/field_forwarding_stub_abstract_generic_covariant: TextSerializationFailure # Was: Pass
+runtime_checks_new/field_forwarding_stub_explicit_covariant: TextSerializationFailure # Was: Pass
+runtime_checks_new/for_in_call_kinds: TextSerializationFailure # Was: Pass
+runtime_checks_new/generic_covariance_based_on_inference: TextSerializationFailure # Was: Pass
+runtime_checks_new/implicit_downcast_field: TextSerializationFailure # Was: Pass
+runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
+runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
+runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
+runtime_checks_new/stub_checked_via_target: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_contravariant_from_class: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariant_from_interface: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariant_from_super: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariantImpl_from_class: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariantImpl_from_interface: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariantImpl_from_super: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariantInterface_from_class: TextSerializationFailure # Was: Pass
+set_literals/disambiguation_rule: TextSerializationFailure # Was: RuntimeError
+statements: Crash
+static_setter: TextSerializationFailure # Was: Pass
+store_load: TextSerializationFailure # Was: Pass
+stringliteral: TextSerializationFailure # Was: Pass
+super_call: TextSerializationFailure # Was: Pass
+super_nsm: TextSerializationFailure # Was: Pass
+tabs: TextSerializationFailure # Was: Pass
+top_level_accessors_part: TextSerializationFailure # Was: Pass
+top_level_accessors: TextSerializationFailure # Was: Pass
+top_level_library_method: TextSerializationFailure # Was: Pass
+typedef: TextSerializationFailure # Was: Pass
+type_variable_as_super: TextSerializationFailure # Was: RuntimeError
+type_variable_prefix: TextSerializationFailure # Was: RuntimeError
+type_variable_uses: TextSerializationFailure # Was: Pass
+undefined_getter_in_compound_assignment: TextSerializationFailure # Was: Pass
+undefined: TextSerializationFailure # Was: Pass
+uninitialized_fields: TextSerializationFailure # Was: Pass
+unused_methods: TextSerializationFailure # Was: Pass
+var_as_type_name: TextSerializationFailure # Was: Pass
+void_methods: ExpectationFileMismatch
+warn_unresolved_sends: InstrumentationMismatch # Test assumes Dart 1.0 semantics
diff --git a/pkg/front_end/testcases/top_level_accessors.dart.direct.expect b/pkg/front_end/testcases/top_level_accessors.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_accessors.dart.direct.expect
rename to pkg/front_end/testcases/top_level_accessors.dart.legacy.expect
diff --git a/pkg/front_end/testcases/top_level_accessors.dart.direct.transformed.expect b/pkg/front_end/testcases/top_level_accessors.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_accessors.dart.direct.transformed.expect
rename to pkg/front_end/testcases/top_level_accessors.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/top_level_accessors.dart.direct.expect b/pkg/front_end/testcases/top_level_accessors.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/top_level_accessors.dart.direct.expect
copy to pkg/front_end/testcases/top_level_accessors.dart.strong.expect
diff --git a/pkg/front_end/testcases/top_level_accessors.dart.direct.transformed.expect b/pkg/front_end/testcases/top_level_accessors.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/top_level_accessors.dart.direct.transformed.expect
copy to pkg/front_end/testcases/top_level_accessors.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/top_level_library_method.dart.direct.expect b/pkg/front_end/testcases/top_level_library_method.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_library_method.dart.direct.expect
rename to pkg/front_end/testcases/top_level_library_method.dart.legacy.expect
diff --git a/pkg/front_end/testcases/top_level_library_method.dart.direct.transformed.expect b/pkg/front_end/testcases/top_level_library_method.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_library_method.dart.direct.transformed.expect
rename to pkg/front_end/testcases/top_level_library_method.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/type_promotion_look_ahead.status b/pkg/front_end/testcases/type_promotion_look_ahead.status
new file mode 100644
index 0000000..bee4fdc
--- /dev/null
+++ b/pkg/front_end/testcases/type_promotion_look_ahead.status
@@ -0,0 +1,5 @@
+# Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Status file for the ../test/fasta/type_promotion_look_ahead_test.dart test suite.
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.direct.expect b/pkg/front_end/testcases/type_variable_as_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_as_super.dart.direct.expect
rename to pkg/front_end/testcases/type_variable_as_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.strong.expect b/pkg/front_end/testcases/type_variable_as_super.dart.strong.expect
new file mode 100644
index 0000000..965f277
--- /dev/null
+++ b/pkg/front_end/testcases/type_variable_as_super.dart.strong.expect
@@ -0,0 +1,68 @@
+// Formatted problems:
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:5:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class A<T> extends T {}
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:7:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class B<T> extends T {
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:11:7: Error: The type variable 'T' can't be used as supertype.
+// class C<T> extends T {}
+//       ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:14:7: Error: The class 'A' is abstract and can't be instantiated.
+//   new A();
+//       ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:15:7: Error: The class 'B' is abstract and can't be instantiated.
+//   new B();
+//       ^
+
+// Unhandled errors:
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:5:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class A<T> extends T {}
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:7:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class B<T> extends T {
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:11:7: Error: The type variable 'T' can't be used as supertype.
+// class C<T> extends T {}
+//       ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:14:7: Error: The class 'A' is abstract and can't be instantiated.
+//   new A();
+//       ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:15:7: Error: The class 'B' is abstract and can't be instantiated.
+//   new B();
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends core::Object = dynamic> extends core::Object {
+  constructor •() → self::B<self::B::T>
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  throw new core::AbstractClassInstantiationError::•("A");
+  throw new core::AbstractClassInstantiationError::•("B");
+  new self::C::•<dynamic>();
+}
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_as_super.dart.strong.transformed.expect
new file mode 100644
index 0000000..d58011a
--- /dev/null
+++ b/pkg/front_end/testcases/type_variable_as_super.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+// Unhandled errors:
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:5:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class A<T> extends T {}
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:7:16: Error: The type variable 'T' can't be used as supertype.
+// abstract class B<T> extends T {
+//                ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:11:7: Error: The type variable 'T' can't be used as supertype.
+// class C<T> extends T {}
+//       ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:14:7: Error: The class 'A' is abstract and can't be instantiated.
+//   new A();
+//       ^
+//
+// pkg/front_end/testcases/type_variable_as_super.dart:15:7: Error: The class 'B' is abstract and can't be instantiated.
+//   new B();
+//       ^
+
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T>
+    : super core::Object::•()
+    ;
+}
+abstract class B<T extends core::Object = dynamic> extends core::Object {
+  constructor •() → self::B<self::B::T>
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T>
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  throw new core::AbstractClassInstantiationError::•("A");
+  throw new core::AbstractClassInstantiationError::•("B");
+  new self::C::•<dynamic>();
+}
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.direct.expect b/pkg/front_end/testcases/type_variable_prefix.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_prefix.dart.direct.expect
rename to pkg/front_end/testcases/type_variable_prefix.dart.legacy.expect
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_prefix.dart.direct.transformed.expect
rename to pkg/front_end/testcases/type_variable_prefix.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
index 578f059..af040d1 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
@@ -4,13 +4,13 @@
 //   T.String method() => "Hello, World!";
 //   ^^^^^^^^
 //
-// pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.
+// pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'String' can't be assigned to a variable of type 'invalid-type'.
 // Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
 //   T.String method() => "Hello, World!";
 //                        ^
 //
-// pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+// pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'String'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
 //   T.String s = new C().method();
 //                        ^
 
@@ -29,14 +29,14 @@
     : super core::Object::•()
     ;
   method method() → invalid-type
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'String' can't be assigned to a variable of type 'invalid-type'.
 Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
   T.String method() => \"Hello, World!\";
                        ^" in "Hello, World!" as{TypeError} invalid-type;
 }
 static method main() → dynamic {
-  core::String s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   T.String s = new C().method();
                        ^" in new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String;
   core::print(s);
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
index 040a5d2..01b57d3 100644
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
@@ -13,14 +13,14 @@
     : super core::Object::•()
     ;
   method method() → invalid-type
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'invalid-type'.
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:8:24: Error: A value of type 'String' can't be assigned to a variable of type 'invalid-type'.
 Try changing the type of the left hand side, or casting the right hand side to 'invalid-type'.
   T.String method() => \"Hello, World!\";
                        ^" in "Hello, World!" as{TypeError} invalid-type;
 }
 static method main() → dynamic {
-  core::String s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'dart.core::String'.
-Try changing the type of the left hand side, or casting the right hand side to 'dart.core::String'.
+  core::String s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/type_variable_prefix.dart:12:24: Error: A value of type 'invalid-type' can't be assigned to a variable of type 'String'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
   T.String s = new C().method();
                        ^" in new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String;
   core::print(s);
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.direct.expect b/pkg/front_end/testcases/type_variable_uses.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_uses.dart.direct.expect
rename to pkg/front_end/testcases/type_variable_uses.dart.legacy.expect
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect b/pkg/front_end/testcases/type_variable_uses.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_uses.dart.direct.transformed.expect
rename to pkg/front_end/testcases/type_variable_uses.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/typedef.dart.direct.expect b/pkg/front_end/testcases/typedef.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/typedef.dart.direct.expect
rename to pkg/front_end/testcases/typedef.dart.legacy.expect
diff --git a/pkg/front_end/testcases/typedef.dart.direct.transformed.expect b/pkg/front_end/testcases/typedef.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/typedef.dart.direct.transformed.expect
rename to pkg/front_end/testcases/typedef.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/typedef.dart.direct.expect b/pkg/front_end/testcases/typedef.dart.strong.expect
similarity index 100%
copy from pkg/front_end/testcases/typedef.dart.direct.expect
copy to pkg/front_end/testcases/typedef.dart.strong.expect
diff --git a/pkg/front_end/testcases/typedef.dart.direct.transformed.expect b/pkg/front_end/testcases/typedef.dart.strong.transformed.expect
similarity index 100%
copy from pkg/front_end/testcases/typedef.dart.direct.transformed.expect
copy to pkg/front_end/testcases/typedef.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/undefined.dart.direct.expect b/pkg/front_end/testcases/undefined.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/undefined.dart.direct.expect
rename to pkg/front_end/testcases/undefined.dart.legacy.expect
diff --git a/pkg/front_end/testcases/undefined.dart.direct.transformed.expect b/pkg/front_end/testcases/undefined.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/undefined.dart.direct.transformed.expect
rename to pkg/front_end/testcases/undefined.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/undefined.dart.strong.expect b/pkg/front_end/testcases/undefined.dart.strong.expect
index 039a05f..4dabf97 100644
--- a/pkg/front_end/testcases/undefined.dart.strong.expect
+++ b/pkg/front_end/testcases/undefined.dart.strong.expect
@@ -1,16 +1,19 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class '#lib1::C'.
+// pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
 //   c. /*@error=UndefinedGetter*/ y;
 //                                 ^
 //
-// pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class '#lib1::C'.
+// pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing method, or defining a method named 'g'.
 //   c. /*@error=UndefinedMethod*/ g();
 //                                 ^
 //
-// pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class '#lib1::C'.
+// pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 // Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
 //   c. /*@error=UndefinedSetter*/ y = null;
 //                                 ^
@@ -28,17 +31,20 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x};
-  let final dynamic #t1 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class '#lib1::C'.
+  let final dynamic #t1 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
   c. /*@error=UndefinedGetter*/ y;
                                 ^";
   c.{self::C::f}();
-  let final dynamic #t2 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class '#lib1::C'.
+  let final dynamic #t2 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'g'.
   c. /*@error=UndefinedMethod*/ g();
                                 ^";
   c.{self::C::x} = null;
-  let final dynamic #t3 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class '#lib1::C'.
+  let final dynamic #t3 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
   c. /*@error=UndefinedSetter*/ y = null;
                                 ^";
diff --git a/pkg/front_end/testcases/undefined.dart.strong.transformed.expect b/pkg/front_end/testcases/undefined.dart.strong.transformed.expect
index 46675a7..03483b3 100644
--- a/pkg/front_end/testcases/undefined.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/undefined.dart.strong.transformed.expect
@@ -11,17 +11,20 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x};
-  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class '#lib1::C'.
+  let final self::C #t1 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:14:33: Error: The getter 'y' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
   c. /*@error=UndefinedGetter*/ y;
                                 ^";
   c.{self::C::f}();
-  let final self::C #t2 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class '#lib1::C'.
+  let final self::C #t2 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:16:33: Error: The method 'g' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'g'.
   c. /*@error=UndefinedMethod*/ g();
                                 ^";
   c.{self::C::x} = null;
-  let final self::C #t3 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class '#lib1::C'.
+  let final self::C #t3 = c in invalid-expression "pkg/front_end/testcases/undefined.dart:18:33: Error: The setter 'y' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
 Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
   c. /*@error=UndefinedSetter*/ y = null;
                                 ^";
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.expect
rename to pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.expect
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.direct.transformed.expect
rename to pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
index 859557f..de383ad 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
@@ -1,11 +1,13 @@
 // Formatted problems:
 //
-// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.
+// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
 //   c. /*@error=UndefinedGetter*/ x += 1;
 //                                 ^
 //
-// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.
+// pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 // Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
 //   c. /*@error=UndefinedGetter*/ x ??= 1;
 //                                 ^
@@ -22,11 +24,13 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x} = 1;
-  let final self::C #t1 = c in #t1.{self::C::x} = (let final dynamic #t2 = #t1 in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.
+  let final self::C #t1 = c in #t1.{self::C::x} = (let final dynamic #t2 = #t1 in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
   c. /*@error=UndefinedGetter*/ x += 1;
                                 ^").+(1);
-  let final self::C #t3 = c in (let final dynamic #t4 = #t3 in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.
+  let final self::C #t3 = c in (let final dynamic #t4 = #t3 in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
   c. /*@error=UndefinedGetter*/ x ??= 1;
                                 ^").{core::Object::==}(null) ?{dynamic} #t3.{self::C::x} = 1 : null;
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
index 4bd73f4..db60632 100644
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
@@ -10,11 +10,13 @@
 }
 static method test(self::C c) → void {
   c.{self::C::x} = 1;
-  let final self::C #t1 = c in #t1.{self::C::x} = (let final self::C #t2 = #t1 in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.
+  let final self::C #t1 = c in #t1.{self::C::x} = (let final self::C #t2 = #t1 in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:13:33: Error: The getter 'x' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
   c. /*@error=UndefinedGetter*/ x += 1;
                                 ^").+(1);
-  let final self::C #t3 = c in (let final self::C #t4 = #t3 in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class '#lib1::C'.
+  let final self::C #t3 = c in (let final self::C #t4 = #t3 in invalid-expression "pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart:14:33: Error: The getter 'x' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart'.
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'x'.
   c. /*@error=UndefinedGetter*/ x ??= 1;
                                 ^").{core::Object::==}(null) ?{dynamic} #t3.{self::C::x} = 1 : null;
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.direct.expect b/pkg/front_end/testcases/uninitialized_fields.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/uninitialized_fields.dart.direct.expect
rename to pkg/front_end/testcases/uninitialized_fields.dart.legacy.expect
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.strong.expect b/pkg/front_end/testcases/uninitialized_fields.dart.strong.expect
index bef6d48..843de869 100644
--- a/pkg/front_end/testcases/uninitialized_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/uninitialized_fields.dart.strong.expect
@@ -1,4 +1,37 @@
 library;
 import self as self;
+import "dart:core" as core;
 
+class Uninitialized extends core::Object {
+  field core::int x = null;
+  synthetic constructor •() → self::Uninitialized
+    : super core::Object::•()
+    ;
+}
+class PartiallyInitialized extends core::Object {
+  field core::int x;
+  constructor •(core::int x) → self::PartiallyInitialized
+    : self::PartiallyInitialized::x = x, super core::Object::•()
+    ;
+  constructor noInitializer() → self::PartiallyInitialized
+    : self::PartiallyInitialized::x = null, super core::Object::•()
+    ;
+}
+class Initialized extends core::Object {
+  field core::int x;
+  constructor •(core::int x) → self::Initialized
+    : self::Initialized::x = x, super core::Object::•()
+    ;
+}
+class Forwarding extends core::Object {
+  field core::int x;
+  constructor initialize(core::int x) → self::Forwarding
+    : self::Forwarding::x = x, super core::Object::•()
+    ;
+  constructor •(core::int arg) → self::Forwarding
+    : this self::Forwarding::initialize(arg)
+    ;
+}
+static field core::int uninitializedTopLevel;
+static field core::int initializedTopLevel = 4;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/uninitialized_fields.dart.strong.transformed.expect
new file mode 100644
index 0000000..843de869
--- /dev/null
+++ b/pkg/front_end/testcases/uninitialized_fields.dart.strong.transformed.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Uninitialized extends core::Object {
+  field core::int x = null;
+  synthetic constructor •() → self::Uninitialized
+    : super core::Object::•()
+    ;
+}
+class PartiallyInitialized extends core::Object {
+  field core::int x;
+  constructor •(core::int x) → self::PartiallyInitialized
+    : self::PartiallyInitialized::x = x, super core::Object::•()
+    ;
+  constructor noInitializer() → self::PartiallyInitialized
+    : self::PartiallyInitialized::x = null, super core::Object::•()
+    ;
+}
+class Initialized extends core::Object {
+  field core::int x;
+  constructor •(core::int x) → self::Initialized
+    : self::Initialized::x = x, super core::Object::•()
+    ;
+}
+class Forwarding extends core::Object {
+  field core::int x;
+  constructor initialize(core::int x) → self::Forwarding
+    : self::Forwarding::x = x, super core::Object::•()
+    ;
+  constructor •(core::int arg) → self::Forwarding
+    : this self::Forwarding::initialize(arg)
+    ;
+}
+static field core::int uninitializedTopLevel;
+static field core::int initializedTopLevel = 4;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/unused_methods.dart.direct.expect b/pkg/front_end/testcases/unused_methods.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/unused_methods.dart.direct.expect
rename to pkg/front_end/testcases/unused_methods.dart.legacy.expect
diff --git a/pkg/front_end/testcases/unused_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/unused_methods.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/unused_methods.dart.direct.transformed.expect
rename to pkg/front_end/testcases/unused_methods.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/unused_methods.dart.strong.expect b/pkg/front_end/testcases/unused_methods.dart.strong.expect
index cb22b9b..d57f97d 100644
--- a/pkg/front_end/testcases/unused_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/unused_methods.dart.strong.expect
@@ -2,28 +2,44 @@
 import self as self;
 import "dart:core" as core;
 
+class UnusedClass extends core::Object {
+  constructor •() → self::UnusedClass
+    : super core::Object::•() {
+    core::print("Unused");
+  }
+}
 abstract class UsedAsBaseClass extends core::Object {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::UsedAsBaseClass
     : super core::Object::•()
     ;
-  abstract method usedInSubclass() → void;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
   method calledFromB() → void {
     this.{self::UsedAsBaseClass::calledFromSubclass}();
   }
-  abstract method calledFromSubclass() → void;
+  method calledFromSubclass() → void {
+    core::print("Unused");
+  }
 }
-abstract class UsedAsInterface extends core::Object {
-  abstract method usedInSubclass() → void;
-}
-class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → void
+class UsedAsInterface extends core::Object {
+  synthetic constructor •() → self::UsedAsInterface
     : super core::Object::•()
     ;
-  method usedInSubclass() → void
-    throw "Method removed by tree-shaking";
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+class InstantiatedButMethodsUnused extends core::Object {
+  synthetic constructor •() → self::InstantiatedButMethodsUnused
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
 }
 class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ClassA
     : super self::UsedAsBaseClass::•()
     ;
   method usedInSubclass() → void {
@@ -31,7 +47,7 @@
   }
 }
 class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → void
+  synthetic constructor •() → self::ClassB
     : super self::UsedAsBaseClass::•()
     ;
   method usedInSubclass() → void {
@@ -52,6 +68,9 @@
 static method exactCallB(self::ClassB object) → void {
   object.{self::ClassB::usedInSubclass}();
 }
+static method unusedTopLevel() → dynamic {
+  core::print("Unused");
+}
 static method usedTopLevel() → dynamic {}
 static method main() → dynamic {
   self::usedTopLevel();
diff --git a/pkg/front_end/testcases/unused_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/unused_methods.dart.strong.transformed.expect
new file mode 100644
index 0000000..d57f97d
--- /dev/null
+++ b/pkg/front_end/testcases/unused_methods.dart.strong.transformed.expect
@@ -0,0 +1,86 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class UnusedClass extends core::Object {
+  constructor •() → self::UnusedClass
+    : super core::Object::•() {
+    core::print("Unused");
+  }
+}
+abstract class UsedAsBaseClass extends core::Object {
+  synthetic constructor •() → self::UsedAsBaseClass
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+  method calledFromB() → void {
+    this.{self::UsedAsBaseClass::calledFromSubclass}();
+  }
+  method calledFromSubclass() → void {
+    core::print("Unused");
+  }
+}
+class UsedAsInterface extends core::Object {
+  synthetic constructor •() → self::UsedAsInterface
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+class InstantiatedButMethodsUnused extends core::Object {
+  synthetic constructor •() → self::InstantiatedButMethodsUnused
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
+  synthetic constructor •() → self::ClassA
+    : super self::UsedAsBaseClass::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("A");
+  }
+}
+class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
+  synthetic constructor •() → self::ClassB
+    : super self::UsedAsBaseClass::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("B");
+    this.{self::UsedAsBaseClass::calledFromB}();
+  }
+  method calledFromSubclass() → void {}
+}
+static method baseClassCall(self::UsedAsBaseClass object) → void {
+  object.{self::UsedAsBaseClass::usedInSubclass}();
+}
+static method interfaceCall(self::UsedAsInterface object) → void {
+  object.{self::UsedAsInterface::usedInSubclass}();
+}
+static method exactCallA(self::ClassA object) → void {
+  object.{self::ClassA::usedInSubclass}();
+}
+static method exactCallB(self::ClassB object) → void {
+  object.{self::ClassB::usedInSubclass}();
+}
+static method unusedTopLevel() → dynamic {
+  core::print("Unused");
+}
+static method usedTopLevel() → dynamic {}
+static method main() → dynamic {
+  self::usedTopLevel();
+  self::ClassA a = new self::ClassA::•();
+  self::exactCallA(a);
+  self::baseClassCall(a);
+  self::interfaceCall(a);
+  self::ClassB b = new self::ClassB::•();
+  self::exactCallB(b);
+  self::baseClassCall(b);
+  self::interfaceCall(b);
+  new self::InstantiatedButMethodsUnused::•();
+}
diff --git a/pkg/front_end/testcases/var_as_type_name.dart.direct.expect b/pkg/front_end/testcases/var_as_type_name.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/var_as_type_name.dart.direct.expect
rename to pkg/front_end/testcases/var_as_type_name.dart.legacy.expect
diff --git a/pkg/front_end/testcases/var_as_type_name.dart.direct.transformed.expect b/pkg/front_end/testcases/var_as_type_name.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/var_as_type_name.dart.direct.transformed.expect
rename to pkg/front_end/testcases/var_as_type_name.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/void_methods.dart.direct.expect b/pkg/front_end/testcases/void_methods.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/void_methods.dart.direct.expect
rename to pkg/front_end/testcases/void_methods.dart.legacy.expect
diff --git a/pkg/front_end/testcases/void_methods.dart.strong.expect b/pkg/front_end/testcases/void_methods.dart.strong.expect
index ca84f50..2dd976f 100644
--- a/pkg/front_end/testcases/void_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/void_methods.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class Foo extends core::Object {
   field core::List<dynamic> list = <dynamic>[1, 2, 3];
-  synthetic constructor •() → void
+  synthetic constructor •() → self::Foo
     : super core::Object::•()
     ;
   set first(dynamic x) → void
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/warn_unresolved_sends.dart.direct.expect
rename to pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.expect
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.direct.transformed.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/warn_unresolved_sends.dart.direct.transformed.expect
rename to pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index 10adcb4..6ad3fa1 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -69,11 +69,11 @@
     },
 
     {
-      "name": "compile",
+      "name": "legacy",
       "kind": "Chain",
-      "source": "test/fasta/compile_test.dart",
+      "source": "test/fasta/legacy_test.dart",
       "path": "testcases/",
-      "status": "testcases/compile.status",
+      "status": "testcases/legacy.status",
       "pattern": [
         "\\.dart$"
       ],
@@ -123,6 +123,24 @@
     },
 
     {
+      "name": "text_serialization",
+      "kind": "Chain",
+      "source": "test/fasta/text_serialization_test.dart",
+      "path": "testcases/",
+      "status": "testcases/text_serialization.status",
+      "pattern": [
+        "\\.dart$"
+      ],
+      "exclude": [
+        "/testcases/.*_part[0-9]*\\.dart$",
+        "/testcases/.*_lib[0-9]*\\.dart$",
+        "/testcases/dartino/",
+        "/testcases/shaker/",
+        "/testcases/expression/"
+      ]
+    },
+
+    {
       "name": "incremental",
       "kind": "Chain",
       "source": "test/fasta/incremental_test.dart",
@@ -280,9 +298,28 @@
       "command-lines": [
         "-cdart2js -rd8 --use-sdk --minified --dart2js-with-kernel language language_2 dart2js_extra dart2js_native corelib corelib_2"
       ]
+    },
+
+    {
+      "name": "type_promotion_look_ahead",
+      "kind": "Chain",
+      "source": "test/fasta/type_promotion_look_ahead_test.dart",
+      "path": "testcases/",
+      "status": "testcases/type_promotion_look_ahead.status",
+      "pattern": [
+        "\\.dart$"
+      ],
+      "exclude": [
+        "/testcases/.*_part[0-9]*\\.dart$",
+        "/testcases/.*_lib[0-9]*\\.dart$",
+        "/testcases/dartino/",
+        "/testcases/shaker/",
+        "/testcases/expression/"
+      ]
     }
   ],
 
+
   "analyze": {
 
     "options": "analysis_options.yaml",
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index 6c35efb..d4ccb3a 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -12,7 +12,10 @@
     show SingleRootFileSystem;
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
-    show CompilerOptions;
+    show CompilerOptions, parseExperimentalFlags;
+
+import 'package:front_end/src/api_prototype/experimental_flags.dart'
+    show ExperimentalFlag;
 
 import 'package:front_end/src/api_prototype/file_system.dart' show FileSystem;
 
@@ -238,7 +241,9 @@
   "--bytecode": false,
   "--compile-sdk": Uri,
   "--dump-ir": false,
+  "--enable-experiment": ",",
   "--exclude-source": false,
+  "--omit-platform": false,
   "--fatal": ",",
   "--help": false,
   "--legacy": "--legacy-mode",
@@ -251,7 +256,6 @@
   "--single-root-base": Uri,
   "--single-root-scheme": String,
   "--supermixin": true,
-  "--sync-async": true,
   "--target": String,
   "--verbose": false,
   "--verify": false,
@@ -264,6 +268,10 @@
   "/h": "--help",
 };
 
+void throwCommandLineProblem(String message) {
+  throw new CommandLineProblem.deprecated(message);
+}
+
 ProcessedOptions analyzeCommandLine(
     String programName,
     ParsedArguments parsedArguments,
@@ -288,12 +296,9 @@
 
   final bool legacyMode = options["--legacy-mode"];
 
-  final bool syncAsync = options["--sync-async"];
-
   final String targetName = options["--target"] ?? "vm";
 
-  final TargetFlags flags =
-      new TargetFlags(legacyMode: legacyMode, syncAsync: syncAsync);
+  final TargetFlags flags = new TargetFlags(legacyMode: legacyMode);
 
   final Target target = getTarget(targetName, flags);
   if (target == null) {
@@ -308,6 +313,8 @@
 
   final bool excludeSource = options["--exclude-source"];
 
+  final bool omitPlatform = options["--omit-platform"];
+
   final Uri packages = options["--packages"];
 
   final Set<String> fatal =
@@ -339,6 +346,9 @@
     });
   }
 
+  Map<ExperimentalFlag, bool> experimentalFlags = parseExperimentalFlags(
+      options["--enable-experiment"], throwCommandLineProblem);
+
   if (programName == "compile_platform") {
     if (arguments.length != 5) {
       return throw new CommandLineProblem.deprecated(
@@ -367,9 +377,11 @@
           ..throwOnWarningsForDebugging = warningsAreFatal
           ..embedSourceText = !excludeSource
           ..debugDump = dumpIr
+          ..omitPlatform = omitPlatform
           ..verbose = verbose
           ..verify = verify
-          ..bytecode = bytecode,
+          ..bytecode = bytecode
+          ..experimentalFlags = experimentalFlags,
         inputs: <Uri>[Uri.parse(arguments[0])],
         output: resolveInputUri(arguments[3], extraSchemes: extraSchemes));
   } else if (arguments.isEmpty) {
@@ -401,8 +413,10 @@
     ..throwOnWarningsForDebugging = warningsAreFatal
     ..embedSourceText = !excludeSource
     ..debugDump = dumpIr
+    ..omitPlatform = omitPlatform
     ..verbose = verbose
-    ..verify = verify;
+    ..verify = verify
+    ..experimentalFlags = experimentalFlags;
 
   // TODO(ahe): What about chase dependencies?
 
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index bd473b2..c5dea7c 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -163,7 +163,7 @@
       options.sdkSummaryComponent = platformComponent;
     }
     CompileTask task = new CompileTask(c, ticker);
-    await task.compile(sansPlatform: true);
+    await task.compile(omitPlatform: true);
     CanonicalName root = platformComponent.root;
     for (Library library in platformComponent.libraries) {
       library.parent = platformComponent;
@@ -210,7 +210,7 @@
       }
       CompileTask task =
           new CompileTask(c, new Ticker(isVerbose: c.options.verbose));
-      return await task.compile();
+      return await task.compile(omitPlatform: c.options.omitPlatform);
     });
   });
 }
@@ -227,8 +227,7 @@
 
   KernelTarget createKernelTarget(
       DillTarget dillTarget, UriTranslator uriTranslator) {
-    return new KernelTarget(c.fileSystem, false, dillTarget, uriTranslator,
-        uriToSource: c.uriToSource);
+    return new KernelTarget(c.fileSystem, false, dillTarget, uriTranslator);
   }
 
   Future<KernelTarget> buildOutline([Uri output]) async {
@@ -253,7 +252,7 @@
     return kernelTarget;
   }
 
-  Future<Uri> compile({bool sansPlatform: false}) async {
+  Future<Uri> compile({bool omitPlatform: false}) async {
     KernelTarget kernelTarget = await buildOutline();
     Uri uri = c.options.output;
     Component component =
@@ -262,7 +261,7 @@
       printComponentText(component,
           libraryFilter: kernelTarget.isSourceLibrary);
     }
-    if (sansPlatform) {
+    if (omitPlatform) {
       component.computeCanonicalNames();
       Component userCode = new Component(
           nameRoot: component.root,
diff --git a/pkg/front_end/tool/_fasta/generate_messages.dart b/pkg/front_end/tool/_fasta/generate_messages.dart
index 3512791..1da6852 100644
--- a/pkg/front_end/tool/_fasta/generate_messages.dart
+++ b/pkg/front_end/tool/_fasta/generate_messages.dart
@@ -125,17 +125,17 @@
   template = template.trimRight();
   var parameters = new Set<String>();
   var conversions = new Set<String>();
+  var conversions2 = new Set<String>();
   var arguments = new Set<String>();
-  bool hasNameSystem = false;
-  void ensureNameSystem() {
-    if (hasNameSystem) return;
-    conversions.add(r"""
-NameSystem nameSystem = new NameSystem();
-StringBuffer buffer;""");
-    hasNameSystem = true;
+  bool hasLabeler = false;
+  void ensureLabeler() {
+    if (hasLabeler) return;
+    conversions.add("TypeLabeler labeler = new TypeLabeler();");
+    hasLabeler = true;
   }
 
-  for (Match match in placeholderPattern.allMatches("$template${tip ?? ''}")) {
+  for (Match match
+      in placeholderPattern.allMatches("$template\n${tip ?? ''}")) {
     String name = match[1];
     String padding = match[2];
     String fractionDigits = match[3];
@@ -196,6 +196,20 @@
         conversions.add("name3 = demangleMixinApplicationName(name3);");
         break;
 
+      case "name4":
+        parameters.add("String name4");
+        conversions.add("if (name4.isEmpty) throw 'No name provided';");
+        arguments.add("'name4': name4");
+        conversions.add("name4 = demangleMixinApplicationName(name4);");
+        break;
+
+      case "names":
+        parameters.add("List<String> _names");
+        conversions.add("if (_names.isEmpty) throw 'No names provided';");
+        arguments.add("'names': _names");
+        conversions.add("String names = itemizeNames(_names);");
+        break;
+
       case "lexeme":
         parameters.add("Token token");
         conversions.add("String lexeme = token.lexeme;");
@@ -230,12 +244,10 @@
       case "type2":
       case "type3":
         parameters.add("DartType _${name}");
-        ensureNameSystem();
-        conversions.add("""
-buffer = new StringBuffer();
-new Printer(buffer, syntheticNames: nameSystem).writeNode(_${name});
-String ${name} = '\$buffer';
-""");
+        ensureLabeler();
+        conversions
+            .add("List<Object> ${name}Parts = labeler.labelType(_${name});");
+        conversions2.add("String ${name} = ${name}Parts.join();");
         arguments.add("'${name}': _${name}");
         break;
 
@@ -271,15 +283,11 @@
 
       case "constant":
         parameters.add("Constant _constant");
-        ensureNameSystem();
-        conversions.add(r"""
-buffer = new StringBuffer();
-new Printer(buffer, syntheticNames: nameSystem).writeNode(_constant);
-String constant = '$buffer';
-""");
-
+        ensureLabeler();
+        conversions.add(
+            "List<Object> ${name}Parts = labeler.labelConstant(_${name});");
+        conversions2.add("String ${name} = ${name}Parts.join();");
         arguments.add("'constant': _constant");
-
         break;
 
       case "num1":
@@ -308,11 +316,13 @@
     }
   }
 
-  String interpolate(String name, String text) {
+  conversions.addAll(conversions2);
+
+  String interpolate(String text) {
     text = text
         .replaceAll(r"$", r"\$")
         .replaceAllMapped(placeholderPattern, (Match m) => "\${${m[1]}}");
-    return "$name: \"\"\"$text\"\"\"";
+    return "\"\"\"$text\"\"\"";
   }
 
   List<String> codeArguments = <String>[];
@@ -364,9 +374,13 @@
   templateArguments.add("withArguments: _withArguments$name");
 
   List<String> messageArguments = <String>[];
-  messageArguments.add(interpolate("message", template));
+  String message = interpolate(template);
+  if (hasLabeler) {
+    message += " + labeler.originMessages";
+  }
+  messageArguments.add("message: ${message}");
   if (tip != null) {
-    messageArguments.add(interpolate("tip", tip));
+    messageArguments.add("tip: ${interpolate(tip)}");
   }
   messageArguments.add("arguments: { ${arguments.join(', ')} }");
 
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 56095b6..bd1ed2c 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -35,11 +35,11 @@
     print(argParser.usage);
     exit(1);
   }
-  bool strongMode = !options['legacy'];
+  bool legacyMode = options['legacy'];
   var bench = options.rest[0];
   var entryUri = Uri.base.resolve(options.rest[1]);
 
-  await setup(entryUri, strongMode: strongMode);
+  await setup(entryUri, legacyMode: legacyMode);
 
   Map<Uri, List<int>> files = await scanReachableFiles(entryUri);
   var handlers = {
@@ -47,10 +47,10 @@
     // TODO(sigmund): enable when we can run the ast-builder standalone.
     // 'parse': () async => parseFiles(files),
     'kernel_gen_e2e': () async {
-      await generateKernel(entryUri, strongMode: strongMode);
+      await generateKernel(entryUri, legacyMode: legacyMode);
     },
     'kernel_gen_e2e_sum': () async {
-      await generateKernel(entryUri, compileSdk: false, strongMode: strongMode);
+      await generateKernel(entryUri, compileSdk: false, legacyMode: legacyMode);
     },
   };
 
@@ -89,15 +89,15 @@
 
 /// Preliminary set up to be able to correctly resolve URIs on the given
 /// program.
-Future setup(Uri entryUri, {bool strongMode: false}) async {
+Future setup(Uri entryUri, {bool legacyMode: false}) async {
   var options = new CompilerOptions()
     ..sdkRoot = sdkRoot
     // Because this is only used to create a uriResolver, we don't allow any
     // whitelisting of error messages in the error handler.
-    ..onDiagnostic = onDiagnosticMessageHandler(false)
+    ..onDiagnostic = onDiagnosticMessageHandler(legacyMode: true)
     ..compileSdk = true
     ..packagesFileUri = Uri.base.resolve('.packages')
-    ..target = createTarget(isFlutter: false, strongMode: strongMode);
+    ..target = createTarget(isFlutter: false, legacyMode: legacyMode);
   uriResolver = await new ProcessedOptions(options: options).getUriTranslator();
 }
 
@@ -222,7 +222,7 @@
 
 // Invoke the fasta kernel generator for the program starting in [entryUri]
 generateKernel(Uri entryUri,
-    {bool compileSdk: true, bool strongMode: false}) async {
+    {bool compileSdk: true, bool legacyMode: false}) async {
   // TODO(sigmund): this is here only to compute the input size,
   // we should extract the input size from the frontend instead.
   scanReachableFiles(entryUri);
@@ -230,9 +230,9 @@
   var timer = new Stopwatch()..start();
   var options = new CompilerOptions()
     ..sdkRoot = sdkRoot
-    ..onDiagnostic = onDiagnosticMessageHandler(strongMode)
-    ..legacyMode = !strongMode
-    ..target = createTarget(isFlutter: false, strongMode: strongMode)
+    ..onDiagnostic = onDiagnosticMessageHandler(legacyMode: legacyMode)
+    ..legacyMode = legacyMode
+    ..target = createTarget(isFlutter: false, legacyMode: legacyMode)
     ..packagesFileUri = Uri.base.resolve('.packages')
     ..compileSdk = compileSdk;
   if (!compileSdk) {
diff --git a/pkg/front_end/tool/fasta_perf_test.dart b/pkg/front_end/tool/fasta_perf_test.dart
index 6c174c0..f366e73 100644
--- a/pkg/front_end/tool/fasta_perf_test.dart
+++ b/pkg/front_end/tool/fasta_perf_test.dart
@@ -7,7 +7,7 @@
 library front_end.tool.perf_test;
 
 import 'dart:io' show Platform;
-import 'fasta_perf.dart' as m;
+import 'fasta_perf.dart' as m show main;
 
 main() async {
   var benchIds = [
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index caec1bd..5851526 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -72,7 +72,7 @@
       parse(jsonDecode(new File.fromUri(editsUri).readAsStringSync()));
   bool verbose = options["verbose"];
   bool verboseCompilation = options["verbose-compilation"];
-  bool strongMode = options["mode"] == "strong";
+  bool legacyMode = options["mode"] == "legacy";
   bool isFlutter = options["target"] == "flutter";
   bool useMinimalGenerator = options["implementation"] == "minimal";
   TimingsCollector collector = new TimingsCollector(verbose);
@@ -81,7 +81,7 @@
     await benchmark(
         collector,
         entryUri,
-        strongMode,
+        legacyMode,
         isFlutter,
         useMinimalGenerator,
         verbose,
@@ -98,7 +98,7 @@
 Future benchmark(
     TimingsCollector collector,
     Uri entryUri,
-    bool strongMode,
+    bool legacyMode,
     bool isFlutter,
     bool useMinimalGenerator,
     bool verbose,
@@ -111,9 +111,9 @@
   var compilerOptions = new CompilerOptions()
     ..verbose = verboseCompilation
     ..fileSystem = overlayFs
-    ..legacyMode = !strongMode
-    ..onDiagnostic = onDiagnosticMessageHandler(strongMode)
-    ..target = createTarget(isFlutter: isFlutter, strongMode: strongMode);
+    ..legacyMode = legacyMode
+    ..onDiagnostic = onDiagnosticMessageHandler(legacyMode: legacyMode)
+    ..target = createTarget(isFlutter: isFlutter, legacyMode: legacyMode);
   if (sdkSummary != null) {
     compilerOptions.sdkSummary = _resolveOverlayUri(sdkSummary);
   }
diff --git a/pkg/front_end/tool/incremental_perf_test.dart b/pkg/front_end/tool/incremental_perf_test.dart
index f14b847..5a97ad8 100644
--- a/pkg/front_end/tool/incremental_perf_test.dart
+++ b/pkg/front_end/tool/incremental_perf_test.dart
@@ -7,7 +7,7 @@
 import 'dart:io';
 import 'package:front_end/src/compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
-import 'incremental_perf.dart' as m;
+import 'incremental_perf.dart' as m show main;
 
 main() async {
   var sdkOutline = computePlatformBinariesLocation(forceBuildDir: true).resolve(
diff --git a/pkg/front_end/tool/perf.dart b/pkg/front_end/tool/perf.dart
index 335dcd4..582d65a 100644
--- a/pkg/front_end/tool/perf.dart
+++ b/pkg/front_end/tool/perf.dart
@@ -228,8 +228,7 @@
     path.dirname(executableDir),
     path.join(executableDir, 'dart-sdk')
   ]) {
-    if (new File(path.join(candidate, 'lib', 'dart_server.platform'))
-        .existsSync()) {
+    if (new File(path.join(candidate, 'lib', 'libraries.json')).existsSync()) {
       return candidate;
     }
   }
diff --git a/pkg/front_end/tool/perf_common.dart b/pkg/front_end/tool/perf_common.dart
index 24a4525..67f93a9 100644
--- a/pkg/front_end/tool/perf_common.dart
+++ b/pkg/front_end/tool/perf_common.dart
@@ -48,12 +48,12 @@
   fastaCodes.codeUndefinedMethod,
 ]);
 
-DiagnosticMessageHandler onDiagnosticMessageHandler(bool isStrong) {
+DiagnosticMessageHandler onDiagnosticMessageHandler({bool legacyMode: false}) {
   bool messageReported = false;
   return (DiagnosticMessage m) {
     if (m.severity == Severity.internalProblem ||
         m.severity == Severity.error) {
-      if (!isStrong ||
+      if (legacyMode ||
           !whitelistMessageCode.contains(getMessageCodeObject(m))) {
         printDiagnosticMessage(m, stderr.writeln);
         exitCode = 1;
@@ -65,36 +65,20 @@
   };
 }
 
-/// Creates a [VmTarget] or [FlutterTarget] with strong-mode enabled or
+/// Creates a [VmTarget] or [FlutterTarget] with legacy mode enabled or
 /// disabled.
 // TODO(sigmund): delete as soon as the disableTypeInference flag and the
-// strongMode flag get merged, and we have a single way of specifying the
-// strong-mode flag to the FE.
-Target createTarget({bool isFlutter: false, bool strongMode: true}) {
-  var flags = new TargetFlags(legacyMode: !strongMode);
+// legacyMode flag get merged, and we have a single way of specifying the
+// legacy-mode flag to the FE.
+Target createTarget({bool isFlutter: false, bool legacyMode: false}) {
+  var flags = new TargetFlags(legacyMode: legacyMode);
   if (isFlutter) {
-    return strongMode
-        ? new FlutterTarget(flags)
-        : new LegacyFlutterTarget(flags);
+    return new FlutterTarget(flags);
   } else {
-    return strongMode ? new VmTarget(flags) : new LegacyVmTarget(flags);
+    return new VmTarget(flags);
   }
 }
 
-class LegacyVmTarget extends VmTarget {
-  LegacyVmTarget(TargetFlags flags) : super(flags);
-
-  @override
-  bool get disableTypeInference => true;
-}
-
-class LegacyFlutterTarget extends FlutterTarget {
-  LegacyFlutterTarget(TargetFlags flags) : super(flags);
-
-  @override
-  bool get disableTypeInference => true;
-}
-
 class TimingsCollector {
   final Stopwatch stopwatch = new Stopwatch();
 
@@ -137,10 +121,16 @@
   void printTimings() {
     timings.forEach((String key, List<double> durations) {
       double total = 0.0;
-      for (double duration in durations.skip(3)) {
-        total += duration;
+      int length = durations.length;
+      if (length == 1) {
+        total += durations.single;
+      } else {
+        length -= 3;
+        for (double duration in durations.skip(3)) {
+          total += duration;
+        }
       }
-      print("$key took: ${total / (durations.length - 3)}ms");
+      print("$key took: ${total / length}ms");
     });
   }
 }
diff --git a/pkg/js_ast/lib/src/equivalence_visitor.dart b/pkg/js_ast/lib/src/equivalence_visitor.dart
index a99f6c2..42801c0 100644
--- a/pkg/js_ast/lib/src/equivalence_visitor.dart
+++ b/pkg/js_ast/lib/src/equivalence_visitor.dart
@@ -147,6 +147,13 @@
   }
 
   @override
+  bool visitParentheses(Parentheses node, Node arg) {
+    if (arg is! Parentheses) return failAt(node, arg);
+    Parentheses other = arg;
+    return testValues(node, node.enclosed, other, other.enclosed);
+  }
+
+  @override
   bool visitStringConcatenation(StringConcatenation node, Node arg) {
     if (arg is! StringConcatenation) return failAt(node, arg);
     StringConcatenation other = arg;
diff --git a/pkg/js_ast/lib/src/nodes.dart b/pkg/js_ast/lib/src/nodes.dart
index 2c44a3c..0bec49b 100644
--- a/pkg/js_ast/lib/src/nodes.dart
+++ b/pkg/js_ast/lib/src/nodes.dart
@@ -62,6 +62,8 @@
 
   T visitName(Name node);
 
+  T visitParentheses(Parentheses node);
+
   T visitArrayInitializer(ArrayInitializer node);
   T visitArrayHole(ArrayHole node);
   T visitObjectInitializer(ObjectInitializer node);
@@ -165,6 +167,8 @@
 
   T visitName(Name node) => visitNode(node);
 
+  T visitParentheses(Parentheses node) => visitExpression(node);
+
   T visitArrayInitializer(ArrayInitializer node) => visitExpression(node);
   T visitArrayHole(ArrayHole node) => visitExpression(node);
   T visitObjectInitializer(ObjectInitializer node) => visitExpression(node);
@@ -252,6 +256,8 @@
 
   R visitName(Name node, A arg);
 
+  R visitParentheses(Parentheses node, A arg);
+
   R visitArrayInitializer(ArrayInitializer node, A arg);
   R visitArrayHole(ArrayHole node, A arg);
   R visitObjectInitializer(ObjectInitializer node, A arg);
@@ -366,6 +372,8 @@
 
   R visitName(Name node, A arg) => visitNode(node, arg);
 
+  R visitParentheses(Parentheses node, A arg) => visitExpression(node, arg);
+
   R visitArrayInitializer(ArrayInitializer node, A arg) =>
       visitExpression(node, arg);
   R visitArrayHole(ArrayHole node, A arg) => visitExpression(node, arg);
@@ -1076,6 +1084,31 @@
   int get precedenceLevel => EXPRESSION;
 }
 
+/// Forced parenthesized expression. Pretty-printing will emit parentheses based
+/// on need, so this node is very rarely needed.
+class Parentheses extends Expression {
+  final Expression enclosed;
+
+  Parentheses(this.enclosed);
+
+  T accept<T>(NodeVisitor<T> visitor) => visitor.visitParentheses(this);
+
+  R accept1<R, A>(NodeVisitor1<R, A> visitor, A arg) =>
+      visitor.visitParentheses(this, arg);
+
+  void visitChildren<T>(NodeVisitor<T> visitor) {
+    enclosed.accept(visitor);
+  }
+
+  void visitChildren1<R, A>(NodeVisitor1<R, A> visitor, A arg) {
+    enclosed.accept1(visitor, arg);
+  }
+
+  Parentheses _clone() => new Parentheses(enclosed);
+
+  int get precedenceLevel => PRIMARY;
+}
+
 class Assignment extends Expression {
   final Expression leftHandSide;
   final String op; // Null, if the assignment is not compound.
@@ -1645,7 +1678,7 @@
 class ArrayInitializer extends Expression {
   final List<Expression> elements;
 
-  ArrayInitializer(this.elements);
+  ArrayInitializer(this.elements) : assert(!elements.contains(null));
 
   T accept<T>(NodeVisitor<T> visitor) => visitor.visitArrayInitializer(this);
 
diff --git a/pkg/js_ast/lib/src/printer.dart b/pkg/js_ast/lib/src/printer.dart
index e56cca8..9ff26a6 100644
--- a/pkg/js_ast/lib/src/printer.dart
+++ b/pkg/js_ast/lib/src/printer.dart
@@ -1070,6 +1070,14 @@
   }
 
   @override
+  visitParentheses(Parentheses node) {
+    out("(");
+    visitNestedExpression(node.enclosed, EXPRESSION,
+        newInForInit: false, newAtStatementBegin: false);
+    out(")");
+  }
+
+  @override
   visitLiteralNumber(LiteralNumber node) {
     outputNumberWithRequiredWhitespace(node.value);
   }
diff --git a/pkg/js_ast/lib/src/template.dart b/pkg/js_ast/lib/src/template.dart
index c6a732a..0503e9f 100644
--- a/pkg/js_ast/lib/src/template.dart
+++ b/pkg/js_ast/lib/src/template.dart
@@ -686,6 +686,14 @@
 
   Instantiator visitName(Name node) => same(node);
 
+  Instantiator visitParentheses(Parentheses node) {
+    Instantiator makeEnclosed = visit(node.enclosed);
+    return (arguments) {
+      Expression enclosed = makeEnclosed(arguments);
+      return Parentheses(enclosed);
+    };
+  }
+
   Instantiator visitArrayInitializer(ArrayInitializer node) {
     // TODO(sra): Implement splicing?
     List<Instantiator> elementMakers =
diff --git a/pkg/js_ast/pubspec.yaml b/pkg/js_ast/pubspec.yaml
index 00ce647..8db366a 100644
--- a/pkg/js_ast/pubspec.yaml
+++ b/pkg/js_ast/pubspec.yaml
@@ -1,8 +1,8 @@
 name: js_ast
-author: Dart Team <misc@dartlang.org>
-description: Library creating and printing JavaScript ASTs.
-homepage: http://www.dartlang.org
+publish_to: none
+
+environment:
+  sdk: '>=2.0.0 <3.0.0'
+
 dev_dependencies:
   test: ^1.3.4
-environment:
-  sdk: ">=0.8.10+6 <2.0.0"
diff --git a/pkg/kernel/analysis_options.yaml b/pkg/kernel/analysis_options.yaml
index 79a0819..af1bb97 100644
--- a/pkg/kernel/analysis_options.yaml
+++ b/pkg/kernel/analysis_options.yaml
@@ -1,5 +1,3 @@
 analyzer:
-  language:
-    enableSuperMixins: false
   exclude:
     - testcases/**
diff --git a/pkg/kernel/bin/size_breakdown.dart b/pkg/kernel/bin/size_breakdown.dart
index a99233d..01fec0f 100755
--- a/pkg/kernel/bin/size_breakdown.dart
+++ b/pkg/kernel/bin/size_breakdown.dart
@@ -25,7 +25,9 @@
   List<int> bytes = new File(args[0]).readAsBytesSync();
   try {
     Component p = new Component();
-    new WrappedBinaryBuilder(bytes).readComponent(p);
+    new WrappedBinaryBuilder(bytes)
+      ..readComponent(p)
+      ..report();
   } catch (e) {
     print("Argument given isn't a dill file that can be loaded.");
     usage();
@@ -34,41 +36,50 @@
 
 class WrappedBinaryBuilder extends BinaryBuilder {
   WrappedBinaryBuilder(var _bytes) : super(_bytes, disableLazyReading: true);
+  int offsetsSize = 0;
+  int stringTableSize = 0;
+  int linkTableSize = 0;
+  int uriToSourceSize = 0;
+  int constantTableSize = 0;
+  Map<Uri, int> librarySizes = {};
+
+  int readOffset() {
+    offsetsSize -= byteOffset;
+    int result = super.readOffset();
+    offsetsSize += byteOffset;
+    return result;
+  }
 
   void readStringTable(List<String> table) {
-    int size = -byteOffset;
+    stringTableSize -= byteOffset;
     super.readStringTable(table);
-    size += super.byteOffset;
-    print("String table: ${_bytesToReadable(size)}.");
+    stringTableSize += byteOffset;
   }
 
   void readLinkTable(CanonicalName linkRoot) {
-    int size = -byteOffset;
+    linkTableSize -= byteOffset;
     super.readLinkTable(linkRoot);
-    size += super.byteOffset;
-    print("Link table: ${_bytesToReadable(size)}.");
+    linkTableSize += byteOffset;
   }
 
   Map<Uri, Source> readUriToSource() {
-    int size = -byteOffset;
+    uriToSourceSize -= byteOffset;
     var result = super.readUriToSource();
-    size += super.byteOffset;
-    print("URI to sources map: ${_bytesToReadable(size)}.");
+    uriToSourceSize += byteOffset;
     return result;
   }
 
   void readConstantTable() {
-    int size = -byteOffset;
+    constantTableSize -= byteOffset;
     super.readConstantTable();
-    size += super.byteOffset;
-    print("Constant table: ${_bytesToReadable(size)}.");
+    constantTableSize += byteOffset;
   }
 
   Library readLibrary(Component component, int endOffset) {
     int size = -byteOffset;
     var result = super.readLibrary(component, endOffset);
-    size += super.byteOffset;
-    print("Library '${result.importUri}': ${_bytesToReadable(size)}.");
+    size += byteOffset;
+    librarySizes[result.importUri] = size;
     return result;
   }
 
@@ -82,4 +93,16 @@
     }
     return "${dSize.toStringAsFixed(1)} ${what[idx]} ($size B)";
   }
+
+  void report() {
+    print("Offsets: ${_bytesToReadable(offsetsSize)}");
+    print("String table: ${_bytesToReadable(stringTableSize)}");
+    print("Link table: ${_bytesToReadable(linkTableSize)}");
+    print("URI to source table: ${_bytesToReadable(uriToSourceSize)}");
+    print("Constant table: ${_bytesToReadable(constantTableSize)}");
+    print("");
+    for (Uri uri in librarySizes.keys) {
+      print("Library '$uri': ${_bytesToReadable(librarySizes[uri])}.");
+    }
+  }
 }
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index 9e30c76..157aa9c 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -12,13 +12,15 @@
 import 'package:kernel/kernel.dart';
 import 'package:kernel/src/tool/batch_util.dart';
 import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/constants.dart' as constants;
+
+import 'package:kernel/transformations/constants.dart' as constants
+    show SimpleErrorReporter, transformComponent;
+
 import 'package:kernel/transformations/continuation.dart' as cont;
 import 'package:kernel/transformations/empty.dart' as empty;
 import 'package:kernel/transformations/method_call.dart' as method_call;
 import 'package:kernel/transformations/mixin_full_resolution.dart' as mix;
 import 'package:kernel/transformations/treeshaker.dart' as treeshaker;
-// import 'package:kernel/verifier.dart';
 import 'package:kernel/transformations/coq.dart' as coq;
 import 'package:kernel/vm/constants_native_effects.dart';
 import 'package:kernel/src/tool/command_line_util.dart';
@@ -41,10 +43,7 @@
   ..addOption('transformation',
       abbr: 't',
       help: 'The transformation to apply.',
-      defaultsTo: 'continuation')
-  ..addFlag('sync-async',
-      help: 'Whether `async` functions start synchronously.',
-      defaultsTo: false);
+      defaultsTo: 'continuation');
 
 main(List<String> arguments) async {
   if (arguments.isNotEmpty && arguments[0] == '--batch') {
@@ -69,7 +68,6 @@
   var output = options['out'];
   var format = options['format'];
   var verbose = options['verbose'];
-  var syncAsync = options['sync-async'];
 
   if (output == null) {
     output = '${input.substring(0, input.lastIndexOf('.'))}.transformed.dill';
@@ -86,7 +84,7 @@
   final hierarchy = new ClassHierarchy(component);
   switch (options['transformation']) {
     case 'continuation':
-      component = cont.transformComponent(coreTypes, component, syncAsync);
+      component = cont.transformComponent(coreTypes, component);
       break;
     case 'resolve-mixins':
       mix.transformLibraries(
@@ -101,8 +99,9 @@
       final Map<String, String> defines = null;
       final VmConstantsBackend backend =
           new VmConstantsBackend(defines, coreTypes);
-      component =
-          constants.transformComponent(component, backend, legacyMode: true);
+      component = constants.transformComponent(
+          component, backend, const constants.SimpleErrorReporter(),
+          legacyMode: true);
       break;
     case 'treeshake':
       component = treeshaker.transformComponent(coreTypes, hierarchy, component,
diff --git a/pkg/kernel/bin/type_check.dart b/pkg/kernel/bin/type_check.dart
index 7591ee0..5c3ef65 100755
--- a/pkg/kernel/bin/type_check.dart
+++ b/pkg/kernel/bin/type_check.dart
@@ -10,8 +10,7 @@
 import 'package:kernel/src/tool/command_line_util.dart';
 
 void usage() {
-  print("Type checker that can be used to find strong mode");
-  print("violations in the Kernel files.");
+  print("Type checker that can be used to find type errors in Kernel files.");
   print("");
   print("Usage: dart <script> dillFile.dill");
   print("The given argument should be an existing file");
@@ -24,7 +23,7 @@
       requireFileExists: true);
   final binary = CommandLineHelper.tryLoadDill(args[0]);
   ErrorFormatter errorFormatter = new ErrorFormatter();
-  new StrongModeTypeChecker(errorFormatter, binary)..checkComponent(binary);
+  new NaiveTypeChecker(errorFormatter, binary)..checkComponent(binary);
   if (errorFormatter.numberOfFailures > 0) {
     errorFormatter.failures.forEach(print);
     print('------- Found ${errorFormatter.numberOfFailures} errors -------');
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 97faf8b..9408027 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -131,7 +131,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 12;
+  UInt32 formatVersion = 16;
   Library[] libraries;
   UriSource sourceMap;
   List<CanonicalName> canonicalNames;
@@ -201,6 +201,11 @@
   CanonicalNameReference canonicalName;
 }
 
+type TypedefReference {
+  // Must be populated by a typedef (possibly later in the file).
+  CanonicalNameReference canonicalName;
+}
+
 type Name {
   StringReference name;
   if name begins with '_' {
@@ -368,8 +373,8 @@
   Name name;
   List<Expression> annotations;
   // Only present if the 'isForwardingStub' flag is set.
-  Option<MemberReference> forwardingStubSuperTarget;
-  Option<MemberReference> forwardingStubInterfaceTarget;
+  MemberReference forwardingStubSuperTarget; // May be NullReference.
+  MemberReference forwardingStubInterfaceTarget; // May be NullReference.
   // Can only be absent if abstract, but tag is there anyway.
   Option<FunctionNode> function;
 }
@@ -779,6 +784,20 @@
   List<Expression> values;
 }
 
+type SetLiteral extends Expression {
+  Byte tag = 109; // Note: tag is out of order.
+  FileOffset fileOffset;
+  DartType typeArgument;
+  List<Expression> values;
+}
+
+type ConstSetLiteral extends Expression {
+  Byte tag = 110; // Note: tag is out of order.
+  FileOffset fileOffset;
+  DartType typeArgument;
+  List<Expression> values;
+}
+
 type MapLiteral extends Expression {
   Byte tag = 50;
   FileOffset fileOffset;
@@ -867,7 +886,7 @@
 
 type SymbolConstant extends Constant {
   Byte tag = 5;
-  Option<LibraryReference> library;
+  LibraryReference library; // May be NullReference.
   StringReference name;
 }
 
@@ -907,6 +926,29 @@
   DartType type;
 }
 
+type EnvironmentBoolConstant extends Constant {
+  Byte tag = 12;
+  StringReference name;
+  ConstantReference defaultValue;
+}
+
+type EnvironmentIntConstant extends Constant {
+  Byte tag = 13;
+  StringReference name;
+  ConstantReference defaultValue;
+}
+
+type EnvironmentStringConstant extends Constant {
+  Byte tag = 14;
+  StringReference name;
+  ConstantReference defaultValue;
+}
+
+type UnevaluatedConstant extends Constant {
+  Byte tag = 15;
+  Expression expression;
+}
+
 abstract type Statement extends Node {}
 
 type ExpressionStatement extends Statement {
@@ -1141,7 +1183,7 @@
   UInt totalParameterCount;
   List<DartType> positionalParameters;
   List<NamedDartType> namedParameters;
-  CanonicalNameReference typedefReference;
+  Option<TypedefType> typedef;
   DartType returnType;
 }
 
@@ -1183,6 +1225,12 @@
   Option<DartType> bound;
 }
 
+type TypedefType {
+  Byte tag = 87;
+  TypedefReference typedefReference;
+  List<DartType> typeArguments;
+}
+
 type TypeParameter {
   // Note: there is no tag on TypeParameter
   Byte flags (isGenericCovariantImpl);
diff --git a/pkg/kernel/lib/application_root.dart b/pkg/kernel/lib/application_root.dart
deleted file mode 100644
index a65d8dd..0000000
--- a/pkg/kernel/lib/application_root.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-library kernel.application_root;
-
-import 'package:path/path.dart' as pathlib;
-
-/// Resolves URIs with the `app` scheme.
-///
-/// These are used internally in kernel to represent file paths relative to
-/// some application root. This is done to avoid storing irrelevant paths, such
-/// as the path to the home directory of the user who compiled a given file.
-class ApplicationRoot {
-  static const String scheme = 'app';
-
-  final String path;
-
-  ApplicationRoot(this.path) {
-    assert(path == null || pathlib.isAbsolute(path));
-  }
-
-  ApplicationRoot.none() : path = null;
-
-  /// Converts `app` URIs to absolute `file` URIs.
-  Uri absoluteUri(Uri uri) {
-    if (path == null) return uri;
-    if (uri.scheme == ApplicationRoot.scheme) {
-      return new Uri(scheme: 'file', path: pathlib.join(this.path, uri.path));
-    } else {
-      return uri;
-    }
-  }
-
-  /// Converts `file` URIs to `app` URIs.
-  Uri relativeUri(Uri uri) {
-    if (path == null) return uri;
-    if (uri.scheme == 'file' && pathlib.isWithin(this.path, uri.path)) {
-      return new Uri(
-          scheme: ApplicationRoot.scheme,
-          path: pathlib.relative(uri.path, from: this.path));
-    } else {
-      return uri;
-    }
-  }
-}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 43e3535..2bddaf9 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -83,7 +83,7 @@
   const Node();
 
   accept(Visitor v);
-  visitChildren(Visitor v);
+  void visitChildren(Visitor v);
 
   /// Returns the textual representation of this node for use in debugging.
   ///
@@ -383,16 +383,20 @@
 
   void computeCanonicalNames() {
     assert(canonicalName != null);
-    for (var typedef_ in typedefs) {
+    for (int i = 0; i < typedefs.length; ++i) {
+      Typedef typedef_ = typedefs[i];
       canonicalName.getChildFromTypedef(typedef_).bindTo(typedef_.reference);
     }
-    for (var field in fields) {
+    for (int i = 0; i < fields.length; ++i) {
+      Field field = fields[i];
       canonicalName.getChildFromMember(field).bindTo(field.reference);
     }
-    for (var member in procedures) {
+    for (int i = 0; i < procedures.length; ++i) {
+      Procedure member = procedures[i];
       canonicalName.getChildFromMember(member).bindTo(member.reference);
     }
-    for (var class_ in classes) {
+    for (int i = 0; i < classes.length; ++i) {
+      Class class_ = classes[i];
       canonicalName.getChild(class_.name).bindTo(class_.reference);
       class_.computeCanonicalNames();
     }
@@ -606,6 +610,10 @@
 
   Library get enclosingLibrary => parent;
 
+  TypedefType get thisType {
+    return new TypedefType(this, _getAsTypeArguments(typeParameters));
+  }
+
   accept(TreeVisitor v) {
     return v.visitTypedef(this);
   }
@@ -874,16 +882,20 @@
 
   void computeCanonicalNames() {
     assert(canonicalName != null);
-    for (var member in fields) {
+    for (int i = 0; i < fields.length; ++i) {
+      Field member = fields[i];
       canonicalName.getChildFromMember(member).bindTo(member.reference);
     }
-    for (var member in procedures) {
+    for (int i = 0; i < procedures.length; ++i) {
+      Procedure member = procedures[i];
       canonicalName.getChildFromMember(member).bindTo(member.reference);
     }
-    for (var member in constructors) {
+    for (int i = 0; i < constructors.length; ++i) {
+      Constructor member = constructors[i];
       canonicalName.getChildFromMember(member).bindTo(member.reference);
     }
-    for (var member in redirectingFactoryConstructors) {
+    for (int i = 0; i < redirectingFactoryConstructors.length; ++i) {
+      RedirectingFactoryConstructor member = redirectingFactoryConstructors[i];
       canonicalName.getChildFromMember(member).bindTo(member.reference);
     }
   }
@@ -2149,15 +2161,15 @@
 abstract class Expression extends TreeNode {
   /// Returns the static type of the expression.
   ///
-  /// Should only be used on code compiled in strong mode, as this method
-  /// assumes the IR is strongly typed.
+  /// Shouldn't be used on code compiled in legacy mode, as this method assumes
+  /// the IR is strongly typed.
   DartType getStaticType(TypeEnvironment types);
 
   /// Returns the static type of the expression as an instantiation of
   /// [superclass].
   ///
-  /// Should only be used on code compiled in strong mode, as this method
-  /// assumes the IR is strongly typed.
+  /// Shouldn't be used on code compiled in legacy mode, as this method assumes
+  /// the IR is strongly typed.
   ///
   /// This method furthermore assumes that the type of the expression actually
   /// is a subtype of (some instantiation of) the given [superclass].
@@ -2178,7 +2190,7 @@
       type = (type as TypeParameterType).parameter.bound;
     }
     if (type is InterfaceType) {
-      var upcastType = types.hierarchy.getTypeAsInstanceOf(type, superclass);
+      var upcastType = types.getTypeAsInstanceOf(type, superclass);
       if (upcastType != null) return upcastType;
     } else if (type is BottomType) {
       return superclass.bottomType;
@@ -2546,8 +2558,7 @@
     if (declaringClass.typeParameters.isEmpty) {
       return interfaceTarget.getterType;
     }
-    var receiver =
-        types.hierarchy.getTypeAsInstanceOf(types.thisType, declaringClass);
+    var receiver = types.getTypeAsInstanceOf(types.thisType, declaringClass);
     return Substitution.fromInterfaceType(receiver)
         .substituteType(interfaceTarget.getterType);
   }
@@ -2869,8 +2880,7 @@
   DartType getStaticType(TypeEnvironment types) {
     if (interfaceTarget == null) return const DynamicType();
     Class superclass = interfaceTarget.enclosingClass;
-    var receiverType =
-        types.hierarchy.getTypeAsInstanceOf(types.thisType, superclass);
+    var receiverType = types.getTypeAsInstanceOf(types.thisType, superclass);
     var returnType = Substitution.fromInterfaceType(receiverType)
         .substituteType(interfaceTarget.function.returnType);
     return Substitution.fromPairs(
@@ -3413,6 +3423,35 @@
   }
 }
 
+class SetLiteral extends Expression {
+  bool isConst;
+  DartType typeArgument; // Not null, defaults to DynamicType.
+  final List<Expression> expressions;
+
+  SetLiteral(this.expressions,
+      {this.typeArgument: const DynamicType(), this.isConst: false}) {
+    assert(typeArgument != null);
+    setParents(expressions, this);
+  }
+
+  DartType getStaticType(TypeEnvironment types) {
+    return types.literalSetType(typeArgument);
+  }
+
+  accept(ExpressionVisitor v) => v.visitSetLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitSetLiteral(this, arg);
+
+  visitChildren(Visitor v) {
+    typeArgument?.accept(v);
+    visitList(expressions, v);
+  }
+
+  transformChildren(Transformer v) {
+    typeArgument = v.visitDartType(typeArgument);
+    transformList(expressions, v, this);
+  }
+}
+
 class MapLiteral extends Expression {
   bool isConst;
   DartType keyType; // Not null, defaults to DynamicType.
@@ -4538,6 +4577,7 @@
   const DartType();
 
   accept(DartTypeVisitor v);
+  accept1(DartTypeVisitor1 v, arg);
 
   bool operator ==(Object other);
 
@@ -4562,6 +4602,7 @@
   const InvalidType();
 
   accept(DartTypeVisitor v) => v.visitInvalidType(this);
+  accept1(DartTypeVisitor1 v, arg) => v.visitInvalidType(this, arg);
   visitChildren(Visitor v) {}
 
   bool operator ==(Object other) => other is InvalidType;
@@ -4573,6 +4614,7 @@
   const DynamicType();
 
   accept(DartTypeVisitor v) => v.visitDynamicType(this);
+  accept1(DartTypeVisitor1 v, arg) => v.visitDynamicType(this, arg);
   visitChildren(Visitor v) {}
 
   bool operator ==(Object other) => other is DynamicType;
@@ -4584,6 +4626,7 @@
   const VoidType();
 
   accept(DartTypeVisitor v) => v.visitVoidType(this);
+  accept1(DartTypeVisitor1 v, arg) => v.visitVoidType(this, arg);
   visitChildren(Visitor v) {}
 
   bool operator ==(Object other) => other is VoidType;
@@ -4595,6 +4638,7 @@
   const BottomType();
 
   accept(DartTypeVisitor v) => v.visitBottomType(this);
+  accept1(DartTypeVisitor1 v, arg) => v.visitBottomType(this, arg);
   visitChildren(Visitor v) {}
 
   bool operator ==(Object other) => other is BottomType;
@@ -4627,6 +4671,7 @@
   }
 
   accept(DartTypeVisitor v) => v.visitInterfaceType(this);
+  accept1(DartTypeVisitor1 v, arg) => v.visitInterfaceType(this, arg);
 
   visitChildren(Visitor v) {
     classNode.acceptReference(v);
@@ -4666,8 +4711,7 @@
   final List<NamedType> namedParameters; // Must be sorted.
 
   /// The [Typedef] this function type is created for.
-  @nocoq
-  Reference typedefReference;
+  final TypedefType typedefType;
 
   final DartType returnType;
   int _hashCode;
@@ -4676,20 +4720,24 @@
       {this.namedParameters: const <NamedType>[],
       this.typeParameters: const <TypeParameter>[],
       int requiredParameterCount,
-      this.typedefReference})
+      this.typedefType})
       : this.positionalParameters = positionalParameters,
         this.requiredParameterCount =
             requiredParameterCount ?? positionalParameters.length;
 
-  /// The [Typedef] this function type is created for.
+  @nocoq
+  Reference get typedefReference => typedefType?.typedefReference;
+
   Typedef get typedef => typedefReference?.asTypedef;
 
   accept(DartTypeVisitor v) => v.visitFunctionType(this);
+  accept1(DartTypeVisitor1 v, arg) => v.visitFunctionType(this, arg);
 
   visitChildren(Visitor v) {
     visitList(typeParameters, v);
     visitList(positionalParameters, v);
     visitList(namedParameters, v);
+    typedefType?.accept(v);
     returnType.accept(v);
   }
 
@@ -4735,7 +4783,7 @@
     return new FunctionType(positionalParameters, returnType,
         requiredParameterCount: requiredParameterCount,
         namedParameters: namedParameters,
-        typedefReference: typedefReference);
+        typedefType: typedefType);
   }
 
   /// Looks up the type of the named parameter with the given name.
@@ -4800,6 +4848,7 @@
   Typedef get typedefNode => typedefReference.asTypedef;
 
   accept(DartTypeVisitor v) => v.visitTypedefType(this);
+  accept1(DartTypeVisitor1 v, arg) => v.visitTypedefType(this, arg);
 
   visitChildren(Visitor v) {
     visitList(typeArguments, v);
@@ -4888,6 +4937,7 @@
   TypeParameterType(this.parameter, [this.promotedBound]);
 
   accept(DartTypeVisitor v) => v.visitTypeParameterType(this);
+  accept1(DartTypeVisitor1 v, arg) => v.visitTypeParameterType(this, arg);
 
   visitChildren(Visitor v) {}
 
@@ -5390,6 +5440,67 @@
   DartType getType(TypeEnvironment types) => types.typeType;
 }
 
+abstract class EnvironmentConstant extends Constant {
+  final String name;
+  final Constant defaultValue;
+
+  EnvironmentConstant(this.name, this.defaultValue);
+  visitChildren(Visitor v) {
+    defaultValue.acceptReference(v);
+  }
+}
+
+class EnvironmentBoolConstant extends EnvironmentConstant {
+  EnvironmentBoolConstant(String name, Constant defaultValue)
+      : super(name, defaultValue);
+
+  accept(ConstantVisitor v) => v.visitEnvironmentBoolConstant(this);
+  acceptReference(Visitor v) {
+    return v.visitEnvironmentBoolConstantReference(this);
+  }
+
+  DartType getType(TypeEnvironment types) => types.boolType;
+}
+
+class EnvironmentIntConstant extends EnvironmentConstant {
+  EnvironmentIntConstant(String name, Constant defaultValue)
+      : super(name, defaultValue);
+
+  accept(ConstantVisitor v) => v.visitEnvironmentIntConstant(this);
+  acceptReference(Visitor v) {
+    return v.visitEnvironmentIntConstantReference(this);
+  }
+
+  DartType getType(TypeEnvironment types) => types.intType;
+}
+
+class EnvironmentStringConstant extends EnvironmentConstant {
+  EnvironmentStringConstant(String name, Constant defaultValue)
+      : super(name, defaultValue);
+
+  accept(ConstantVisitor v) => v.visitEnvironmentStringConstant(this);
+  acceptReference(Visitor v) {
+    return v.visitEnvironmentStringConstantReference(this);
+  }
+
+  DartType getType(TypeEnvironment types) => types.stringType;
+}
+
+class UnevaluatedConstant extends Constant {
+  final Expression expression;
+
+  UnevaluatedConstant(this.expression);
+
+  visitChildren(Visitor v) {
+    expression.accept(v);
+  }
+
+  accept(ConstantVisitor v) => v.visitUnevaluatedConstant(this);
+  acceptReference(Visitor v) => v.visitUnevaluatedConstantReference(this);
+
+  DartType getType(TypeEnvironment types) => expression.getStaticType(types);
+}
+
 // ------------------------------------------------------------------------
 //                                COMPONENT
 // ------------------------------------------------------------------------
@@ -5435,8 +5546,8 @@
   }
 
   void computeCanonicalNames() {
-    for (var library in libraries) {
-      computeCanonicalNamesForLibrary(library);
+    for (int i = 0; i < libraries.length; ++i) {
+      computeCanonicalNamesForLibrary(libraries[i]);
     }
   }
 
@@ -5531,6 +5642,8 @@
 }
 
 abstract class BinarySink {
+  int getBufferOffset();
+
   void writeByte(int byte);
   void writeBytes(List<int> bytes);
   void writeUInt32(int value);
@@ -5539,7 +5652,7 @@
   /// Write List<Byte> into the sink.
   void writeByteList(List<int> bytes);
 
-  void writeCanonicalNameReference(CanonicalName name);
+  void writeNullAllowedCanonicalNameReference(CanonicalName name);
   void writeStringReference(String str);
   void writeName(Name node);
   void writeDartType(DartType type);
@@ -5560,6 +5673,7 @@
   List<int> get bytes;
 
   int readByte();
+  List<int> readBytes(int length);
   int readUInt();
   int readUint32();
 
@@ -5677,7 +5791,7 @@
   /// number. The returned line contains no line separators.
   String getTextLine(int line) {
     RangeError.checkValueInInterval(line, 1, lineStarts.length, 'line');
-    if (source == null) return null;
+    if (source == null || source.isEmpty) return null;
 
     cachedText ??= utf8.decode(source, allowMalformed: true);
     // -1 as line numbers start at 1.
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 860489e..59148f3 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -134,13 +134,17 @@
     return _doubleBuffer[0];
   }
 
-  List<int> readByteList() {
-    List<int> bytes = new Uint8List(readUInt());
+  List<int> readBytes(int length) {
+    List<int> bytes = new Uint8List(length);
     bytes.setRange(0, bytes.length, _bytes, _byteOffset);
     _byteOffset += bytes.length;
     return bytes;
   }
 
+  List<int> readByteList() {
+    return readBytes(readUInt());
+  }
+
   String readStringEntry(int numBytes) {
     // Utf8Decoder will skip leading BOM characters, but we must preserve them.
     // Collect leading BOMs before passing the bytes onto Utf8Decoder.
@@ -212,10 +216,7 @@
       case ConstantTag.StringConstant:
         return new StringConstant(readStringReference());
       case ConstantTag.SymbolConstant:
-        Reference libraryReference;
-        if (readAndCheckOptionTag()) {
-          libraryReference = readLibraryReference();
-        }
+        Reference libraryReference = readLibraryReference(allowNull: true);
         return new SymbolConstant(readStringReference(), libraryReference);
       case ConstantTag.MapConstant:
         final DartType keyType = readDartType();
@@ -269,6 +270,21 @@
       case ConstantTag.TypeLiteralConstant:
         final DartType type = readDartType();
         return new TypeLiteralConstant(type);
+      case ConstantTag.EnvironmentBoolConstant:
+        final String name = readStringReference();
+        final Constant defaultValue = readConstantReference();
+        return new EnvironmentBoolConstant(name, defaultValue);
+      case ConstantTag.EnvironmentIntConstant:
+        final String name = readStringReference();
+        final Constant defaultValue = readConstantReference();
+        return new EnvironmentIntConstant(name, defaultValue);
+      case ConstantTag.EnvironmentStringConstant:
+        final String name = readStringReference();
+        final Constant defaultValue = readConstantReference();
+        return new EnvironmentStringConstant(name, defaultValue);
+      case ConstantTag.UnevaluatedConstant:
+        final Expression expression = readExpression();
+        return new UnevaluatedConstant(expression);
     }
 
     throw fail('unexpected constant tag: $constantTag');
@@ -489,40 +505,44 @@
   }
 
   void _checkCanonicalNameChildren(CanonicalName parent) {
-    for (CanonicalName child in parent.children) {
-      if (child.name != '@methods' &&
-          child.name != '@typedefs' &&
-          child.name != '@fields' &&
-          child.name != '@getters' &&
-          child.name != '@setters' &&
-          child.name != '@factories' &&
-          child.name != '@constructors') {
-        bool checkReferenceNode = true;
-        if (child.reference == null) {
-          // OK for "if private: URI of library" part of "Qualified name"...
-          Iterable<CanonicalName> children = child.children;
-          if (parent.parent != null &&
-              children.isNotEmpty &&
-              children.first.name.startsWith("_")) {
-            // OK then.
-            checkReferenceNode = false;
-          } else {
-            throw new CanonicalNameError(
-                "Null reference (${child.name}) ($child).");
+    Iterable<CanonicalName> parentChildren = parent.childrenOrNull;
+    if (parentChildren != null) {
+      for (CanonicalName child in parentChildren) {
+        if (child.name != '@methods' &&
+            child.name != '@typedefs' &&
+            child.name != '@fields' &&
+            child.name != '@getters' &&
+            child.name != '@setters' &&
+            child.name != '@factories' &&
+            child.name != '@constructors') {
+          bool checkReferenceNode = true;
+          if (child.reference == null) {
+            // OK for "if private: URI of library" part of "Qualified name"...
+            Iterable<CanonicalName> children = child.childrenOrNull;
+            if (parent.parent != null &&
+                children != null &&
+                children.isNotEmpty &&
+                children.first.name.startsWith("_")) {
+              // OK then.
+              checkReferenceNode = false;
+            } else {
+              throw new CanonicalNameError(
+                  "Null reference (${child.name}) ($child).");
+            }
+          }
+          if (checkReferenceNode) {
+            if (child.reference.canonicalName != child) {
+              throw new CanonicalNameError(
+                  "Canonical name and reference doesn't agree.");
+            }
+            if (child.reference.node == null) {
+              throw new CanonicalNameError(
+                  "Reference is null (${child.name}) ($child).");
+            }
           }
         }
-        if (checkReferenceNode) {
-          if (child.reference.canonicalName != child) {
-            throw new CanonicalNameError(
-                "Canonical name and reference doesn't agree.");
-          }
-          if (child.reference.node == null) {
-            throw new CanonicalNameError(
-                "Reference is null (${child.name}) ($child).");
-          }
-        }
+        _checkCanonicalNameChildren(child);
       }
-      _checkCanonicalNameChildren(child);
     }
   }
 
@@ -617,6 +637,8 @@
     _byteOffset = index.binaryOffsetForStringTable; // Read backwards.
     _readMetadataMappings(component, index.binaryOffsetForMetadataPayloads);
 
+    _associateMetadata(component, _componentStartOffset);
+
     _byteOffset = index.binaryOffsetForSourceTable;
     Map<Uri, Source> uriToSource = readUriToSource();
     component.uriToSource.addAll(uriToSource);
@@ -634,8 +656,6 @@
         getMemberReferenceFromInt(index.mainMethodReference, allowNull: true);
     component.mainMethodName ??= mainMethod;
 
-    _associateMetadata(component, _componentStartOffset);
-
     _byteOffset = _componentStartOffset + componentFileSize;
   }
 
@@ -681,8 +701,11 @@
     return _linkTable[index - 1];
   }
 
-  Reference readLibraryReference() {
-    return readCanonicalNameReference().getReference();
+  Reference readLibraryReference({bool allowNull: false}) {
+    CanonicalName canonicalName = readCanonicalNameReference();
+    if (canonicalName != null) return canonicalName.getReference();
+    if (allowNull) return null;
+    throw 'Expected a library reference to be valid but was `null`.';
   }
 
   LibraryDependency readLibraryDependencyReference() {
@@ -823,7 +846,7 @@
     var fileOffset = readOffset();
     var flags = readByte();
     var annotations = readExpressionList();
-    var targetLibrary = readLibraryReference();
+    var targetLibrary = readLibraryReference(allowNull: true);
     var prefixName = readStringOrNullIfEmpty();
     var names = readCombinatorList();
     return new LibraryDependency.byReference(
@@ -1102,9 +1125,9 @@
         (kind == ProcedureKind.Factory && functionNodeSize <= 50) ||
             _disableLazyReading;
     var forwardingStubSuperTargetReference =
-        readAndCheckOptionTag() ? readMemberReference() : null;
+        readMemberReference(allowNull: true);
     var forwardingStubInterfaceTargetReference =
-        readAndCheckOptionTag() ? readMemberReference() : null;
+        readMemberReference(allowNull: true);
     var function = readFunctionNodeOption(!readFunctionNodeNow, endOffset);
     var transformerFlags = getAndResetTransformerFlags();
     assert(((_) => true)(debugPath.removeLast()));
@@ -1148,7 +1171,10 @@
     var flags = readByte();
     var name = readName();
     var annotations = readAnnotationList(node);
-    debugPath.add(node.name?.name ?? 'redirecting-factory-constructor');
+    assert(() {
+      debugPath.add(node.name?.name ?? 'redirecting-factory-constructor');
+      return true;
+    }());
     var targetReference = readMemberReference();
     var typeArguments = readDartTypeList();
     int typeParameterStackHeight = typeParameterStack.length;
@@ -1519,6 +1545,18 @@
         return new ListLiteral(readExpressionList(),
             typeArgument: typeArgument, isConst: true)
           ..fileOffset = offset;
+      case Tag.SetLiteral:
+        int offset = readOffset();
+        var typeArgument = readDartType();
+        return new SetLiteral(readExpressionList(),
+            typeArgument: typeArgument, isConst: false)
+          ..fileOffset = offset;
+      case Tag.ConstSetLiteral:
+        int offset = readOffset();
+        var typeArgument = readDartType();
+        return new SetLiteral(readExpressionList(),
+            typeArgument: typeArgument, isConst: true)
+          ..fileOffset = offset;
       case Tag.MapLiteral:
         int offset = readOffset();
         var keyType = readDartType();
@@ -1828,7 +1866,7 @@
         var totalParameterCount = readUInt();
         var positional = readDartTypeList();
         var named = readNamedTypeList();
-        var typedefReference = readTypedefReference();
+        var typedefType = readDartTypeOption();
         assert(positional.length + named.length == totalParameterCount);
         var returnType = readDartType();
         typeParameterStack.length = typeParameterStackHeight;
@@ -1836,7 +1874,7 @@
             typeParameters: typeParameters,
             requiredParameterCount: requiredParameterCount,
             namedParameters: named,
-            typedefReference: typedefReference);
+            typedefType: typedefType);
       case Tag.SimpleFunctionType:
         var positional = readDartTypeList();
         var returnType = readDartType();
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 7c0795a..2e5bb5d 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -4,10 +4,10 @@
 library kernel.ast_to_binary;
 
 import 'dart:core' hide MapEntry;
+import 'dart:convert' show utf8;
 
 import '../ast.dart';
 import 'tag.dart';
-import 'dart:convert';
 import 'dart:io' show BytesBuilder;
 import 'dart:typed_data';
 
@@ -23,7 +23,8 @@
   final StringIndexer stringIndexer;
   ConstantIndexer _constantIndexer;
   final UriIndexer _sourceUriIndexer = new UriIndexer();
-  final Set<Uri> _knownSourceUri = new Set<Uri>();
+  bool _currentlyInNonimplementation = false;
+  final List<bool> _sourcesFromRealImplementation = new List<bool>();
   Map<LibraryDependency, int> _libraryDependencyIndex =
       <LibraryDependency, int>{};
 
@@ -34,6 +35,7 @@
   final BytesSink _constantsBytesSink;
   BufferedSink _constantsSink;
   BufferedSink _sink;
+  bool includeSources;
 
   List<int> libraryOffsets;
   List<int> classOffsets;
@@ -53,7 +55,8 @@
   ///
   /// The BinaryPrinter will use its own buffer, so the [sink] does not need
   /// one.
-  BinaryPrinter(Sink<List<int>> sink, {StringIndexer stringIndexer})
+  BinaryPrinter(Sink<List<int>> sink,
+      {StringIndexer stringIndexer, this.includeSources = true})
       : _mainSink = new BufferedSink(sink),
         _metadataSink = new BufferedSink(new BytesSink()),
         _constantsBytesSink = new BytesSink(),
@@ -104,24 +107,58 @@
   void writeStringTable(StringIndexer indexer) {
     _binaryOffsetForStringTable = getBufferOffset();
 
+    // Containers for the utf8 encoded strings.
+    final List<Uint8List> data = new List<Uint8List>();
+    int totalLength = 0;
+    const int minLength = 1 << 16;
+    Uint8List buffer;
+    int index = 0;
+
     // Write the end offsets.
     writeUInt30(indexer.index.length);
-    int endOffset = 0;
-    List<List<int>> data =
-        new List<List<int>>.filled(indexer.index.length, null);
-    int i = 0;
-    Utf8Encoder utf8Encoder = const Utf8Encoder();
     for (String key in indexer.index.keys) {
-      List<int> utf8Bytes = utf8Encoder.convert(key);
-      data[i] = utf8Bytes;
-      endOffset += utf8Bytes.length;
-      writeUInt30(endOffset);
-      i++;
+      if (key.isNotEmpty) {
+        int requiredMinLength = key.length;
+        int allocateMinLength = requiredMinLength * 3;
+        int newIndex;
+        while (true) {
+          if (buffer == null || index + requiredMinLength >= buffer.length) {
+            int newLength = minLength;
+            if (allocateMinLength > newLength) newLength = allocateMinLength;
+            if (buffer != null && index > 0) {
+              data.add(new Uint8List.view(buffer.buffer, 0, index));
+            }
+            index = 0;
+            buffer = new Uint8List(newLength);
+          }
+          newIndex = NotQuiteString.writeUtf8(buffer, index, key);
+          if (newIndex != -1) break;
+          requiredMinLength = allocateMinLength;
+        }
+        if (newIndex < 0) {
+          // Utf8 encoding failed.
+          if (buffer != null && index > 0) {
+            data.add(new Uint8List.view(buffer.buffer, 0, index));
+            buffer = null;
+            index = 0;
+          }
+          List<int> converted = utf8.encoder.convert(key);
+          data.add(converted);
+          totalLength += converted.length;
+        } else {
+          totalLength += newIndex - index;
+          index = newIndex;
+        }
+      }
+      writeUInt30(totalLength);
+    }
+    if (buffer != null && index > 0) {
+      data.add(Uint8List.view(buffer.buffer, 0, index));
     }
 
     // Write the UTF-8 encoded strings.
-    for (var entry in data) {
-      writeBytes(entry);
+    for (int i = 0; i < data.length; ++i) {
+      writeBytes(data[i]);
     }
   }
 
@@ -166,7 +203,7 @@
       writeStringReference(constant.value);
     } else if (constant is SymbolConstant) {
       writeByte(ConstantTag.SymbolConstant);
-      writeOptionalReference(constant.libraryReference);
+      writeNullAllowedReference(constant.libraryReference);
       writeStringReference(constant.name);
     } else if (constant is MapConstant) {
       writeByte(ConstantTag.MapConstant);
@@ -189,7 +226,7 @@
       constant.typeArguments.forEach(writeDartType);
       writeUInt30(constant.fieldValues.length);
       constant.fieldValues.forEach((Reference fieldRef, Constant value) {
-        writeCanonicalNameReference(fieldRef.canonicalName);
+        writeNonNullCanonicalNameReference(fieldRef.canonicalName);
         writeConstantReference(value);
       });
     } else if (constant is PartialInstantiationConstant) {
@@ -202,12 +239,27 @@
       }
     } else if (constant is TearOffConstant) {
       writeByte(ConstantTag.TearOffConstant);
-      writeCanonicalNameReference(constant.procedure.canonicalName);
+      writeNonNullCanonicalNameReference(constant.procedure.canonicalName);
     } else if (constant is TypeLiteralConstant) {
       writeByte(ConstantTag.TypeLiteralConstant);
       writeDartType(constant.type);
+    } else if (constant is EnvironmentBoolConstant) {
+      writeByte(ConstantTag.EnvironmentBoolConstant);
+      writeStringReference(constant.name);
+      writeConstantReference(constant.defaultValue);
+    } else if (constant is EnvironmentIntConstant) {
+      writeByte(ConstantTag.EnvironmentIntConstant);
+      writeStringReference(constant.name);
+      writeConstantReference(constant.defaultValue);
+    } else if (constant is EnvironmentStringConstant) {
+      writeByte(ConstantTag.EnvironmentStringConstant);
+      writeStringReference(constant.name);
+      writeConstantReference(constant.defaultValue);
+    } else if (constant is UnevaluatedConstant) {
+      writeByte(ConstantTag.UnevaluatedConstant);
+      writeNode(constant.expression);
     } else {
-      throw 'Unsupported constant $constant';
+      throw new ArgumentError('Unsupported constant $constant');
     }
     _sink = oldSink;
     return _constantsSink.offset - initialOffset;
@@ -217,32 +269,108 @@
     type.accept(this);
   }
 
-  // The currently active file uri where we are writing [TreeNode]s from.  If
-  // this is set to `null` we cannot write file offsets.  The [writeOffset]
-  // helper function will ensure this.
-  Uri _activeFileUri;
-
   // Returns the new active file uri.
   Uri writeUriReference(Uri uri) {
     final int index = _sourceUriIndexer.put(uri);
     writeUInt30(index);
+    if (!_currentlyInNonimplementation) {
+      if (_sourcesFromRealImplementation.length <= index) {
+        _sourcesFromRealImplementation.length = index + 1;
+      }
+      _sourcesFromRealImplementation[index] = true;
+    }
     return uri;
   }
 
   void writeList<T>(List<T> items, void writeItem(T x)) {
     writeUInt30(items.length);
-    items.forEach(writeItem);
+    for (int i = 0; i < items.length; ++i) {
+      writeItem(items[i]);
+    }
   }
 
   void writeNodeList(List<Node> nodes) {
     final len = nodes.length;
     writeUInt30(len);
-    for (var i = 0; i < len; i++) {
+    for (int i = 0; i < len; i++) {
       final node = nodes[i];
       writeNode(node);
     }
   }
 
+  void writeProcedureNodeList(List<Procedure> nodes) {
+    final len = nodes.length;
+    writeUInt30(len);
+    for (int i = 0; i < len; i++) {
+      final node = nodes[i];
+      writeProcedureNode(node);
+    }
+  }
+
+  void writeFieldNodeList(List<Field> nodes) {
+    final len = nodes.length;
+    writeUInt30(len);
+    for (int i = 0; i < len; i++) {
+      final node = nodes[i];
+      writeFieldNode(node);
+    }
+  }
+
+  void writeClassNodeList(List<Class> nodes) {
+    final len = nodes.length;
+    writeUInt30(len);
+    for (int i = 0; i < len; i++) {
+      final node = nodes[i];
+      writeClassNode(node);
+    }
+  }
+
+  void writeConstructorNodeList(List<Constructor> nodes) {
+    final len = nodes.length;
+    writeUInt30(len);
+    for (int i = 0; i < len; i++) {
+      final node = nodes[i];
+      writeConstructorNode(node);
+    }
+  }
+
+  void writeRedirectingFactoryConstructorNodeList(
+      List<RedirectingFactoryConstructor> nodes) {
+    final len = nodes.length;
+    writeUInt30(len);
+    for (int i = 0; i < len; i++) {
+      final node = nodes[i];
+      writeRedirectingFactoryConstructorNode(node);
+    }
+  }
+
+  void writeSwitchCaseNodeList(List<SwitchCase> nodes) {
+    final len = nodes.length;
+    writeUInt30(len);
+    for (int i = 0; i < len; i++) {
+      final node = nodes[i];
+      writeSwitchCaseNode(node);
+    }
+  }
+
+  void writeCatchNodeList(List<Catch> nodes) {
+    final len = nodes.length;
+    writeUInt30(len);
+    for (int i = 0; i < len; i++) {
+      final node = nodes[i];
+      writeCatchNode(node);
+    }
+  }
+
+  void writeTypedefNodeList(List<Typedef> nodes) {
+    final len = nodes.length;
+    writeUInt30(len);
+    for (int i = 0; i < len; i++) {
+      final node = nodes[i];
+      writeTypedefNode(node);
+    }
+  }
+
   void writeNode(Node node) {
     if (_metadataSubsections != null) {
       _writeNodeMetadata(node);
@@ -250,6 +378,84 @@
     node.accept(this);
   }
 
+  void writeFunctionNode(FunctionNode node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeArgumentsNode(Arguments node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeLibraryNode(Library node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeProcedureNode(Procedure node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeFieldNode(Field node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeClassNode(Class node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeConstructorNode(Constructor node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeRedirectingFactoryConstructorNode(
+      RedirectingFactoryConstructor node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeSwitchCaseNode(SwitchCase node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeCatchNode(Catch node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
+  void writeTypedefNode(Typedef node) {
+    if (_metadataSubsections != null) {
+      _writeNodeMetadata(node);
+    }
+    node.accept(this);
+  }
+
   void writeOptionalNode(Node node) {
     if (node == null) {
       writeByte(Tag.Nothing);
@@ -259,12 +465,12 @@
     }
   }
 
-  void writeOptionalReference(Reference ref) {
-    if (ref == null) {
+  void writeOptionalFunctionNode(FunctionNode node) {
+    if (node == null) {
       writeByte(Tag.Nothing);
     } else {
       writeByte(Tag.Something);
-      writeReference(ref);
+      writeFunctionNode(node);
     }
   }
 
@@ -275,19 +481,25 @@
 
   void indexLinkTable(Component component) {
     _canonicalNameList = <CanonicalName>[];
-    void visitCanonicalName(CanonicalName node) {
-      node.index = _canonicalNameList.length;
-      _canonicalNameList.add(node);
-      node.children.forEach(visitCanonicalName);
-    }
-
-    for (var library in component.libraries) {
+    for (int i = 0; i < component.libraries.length; ++i) {
+      Library library = component.libraries[i];
       if (!shouldWriteLibraryCanonicalNames(library)) continue;
-      visitCanonicalName(library.canonicalName);
+      _indexLinkTableInternal(library.canonicalName);
       _knownCanonicalNameNonRootTops.add(library.canonicalName);
     }
   }
 
+  void _indexLinkTableInternal(CanonicalName node) {
+    node.index = _canonicalNameList.length;
+    _canonicalNameList.add(node);
+    Iterable<CanonicalName> children = node.childrenOrNull;
+    if (children != null) {
+      for (CanonicalName child in children) {
+        _indexLinkTableInternal(child);
+      }
+    }
+  }
+
   /// Compute canonical names for the whole component or parts of it.
   void computeCanonicalNames(Component component) {
     component.computeCanonicalNames();
@@ -300,7 +512,7 @@
   bool shouldWriteLibraryCanonicalNames(Library library) => true;
 
   void writeCanonicalNameEntry(CanonicalName node) {
-    var parent = node.parent;
+    CanonicalName parent = node.parent;
     if (parent.isRoot) {
       writeUInt30(0);
     } else {
@@ -315,7 +527,6 @@
     writeUInt32(Tag.ComponentFile);
     writeUInt32(Tag.BinaryFormatVersion);
     indexLinkTable(component);
-    indexUris(component);
     _collectMetadata(component);
     if (_metadataSubsections != null) {
       _writeNodeMetadataImpl(component, componentOffset);
@@ -354,7 +565,7 @@
   }
 
   void _writeNodeMetadataImpl(Node node, int nodeOffset) {
-    for (var subsection in _metadataSubsections) {
+    for (_MetadataSubsection subsection in _metadataSubsections) {
       final repository = subsection.repository;
       final value = repository.mapping[node];
       if (value == null) {
@@ -362,12 +573,14 @@
       }
 
       if (!MetadataRepository.isSupported(node)) {
-        throw "Nodes of type ${node.runtimeType} can't have metadata.";
+        throw new ArgumentError(
+            "Nodes of type ${node.runtimeType} can't have metadata.");
       }
 
       if (!identical(_sink, _mainSink)) {
-        throw "Node written into metadata can't have metadata "
-            "(metadata: ${repository.tag}, node: ${node.runtimeType} $node)";
+        throw new ArgumentError(
+            "Node written into metadata can't have metadata "
+            "(metadata: ${repository.tag}, node: ${node.runtimeType} $node)");
       }
 
       _sink = _metadataSink;
@@ -387,9 +600,10 @@
       _typeParameterIndexer.enter(typeParameters);
     }
     if (memberScope) {
-      _variableIndexer = new VariableIndexer();
+      _variableIndexer = null;
     }
     if (variableScope) {
+      _variableIndexer ??= new VariableIndexer();
       _variableIndexer.pushScope();
     }
   }
@@ -411,6 +625,16 @@
   }
 
   void _writeMetadataSection(Component component) {
+    // Make sure metadata payloads section is 8-byte aligned,
+    // so certain kinds of metadata can contain aligned data.
+    const int metadataPayloadsAlignment = 8;
+    int padding = ((getBufferOffset() + metadataPayloadsAlignment - 1) &
+            -metadataPayloadsAlignment) -
+        getBufferOffset();
+    for (int i = 0; i < padding; ++i) {
+      writeByte(0);
+    }
+
     _binaryOffsetForMetadataPayloads = getBufferOffset();
 
     if (_metadataSubsections == null) {
@@ -425,13 +649,13 @@
 
     // RList<MetadataMapping> metadataMappings
     _binaryOffsetForMetadataMappings = getBufferOffset();
-    for (var subsection in _metadataSubsections) {
+    for (_MetadataSubsection subsection in _metadataSubsections) {
       // UInt32 tag
       writeUInt32(stringIndexer.put(subsection.repository.tag));
 
       // RList<Pair<UInt32, UInt32>> nodeOffsetToMetadataOffset
       final mappingLength = subsection.metadataMapping.length;
-      for (var i = 0; i < mappingLength; i += 2) {
+      for (int i = 0; i < mappingLength; i += 2) {
         writeUInt32(subsection.metadataMapping[i]); // node offset
         writeUInt32(subsection.metadataMapping[i + 1]); // metadata offset
       }
@@ -442,10 +666,31 @@
 
   /// Write all of some of the libraries of the [component].
   void writeLibraries(Component component) {
-    component.libraries.forEach(writeNode);
+    for (int i = 0; i < component.libraries.length; ++i) {
+      writeLibraryNode(component.libraries[i]);
+    }
   }
 
   void writeComponentIndex(Component component, List<Library> libraries) {
+    // It is allowed to concatenate several kernel binaries to create a
+    // multi-component kernel file. In order to maintain alignment of
+    // metadata sections within kernel binaries after concatenation,
+    // size of each kernel binary should be aligned.
+    // Component index is located at the end of a kernel binary, so padding
+    // is added before component index.
+    const int kernelFileAlignment = 8;
+
+    // Keep this in sync with number of writeUInt32 below.
+    int numComponentIndexEntries = 7 + libraryOffsets.length + 3;
+
+    int unalignedSize = getBufferOffset() + numComponentIndexEntries * 4;
+    int padding =
+        ((unalignedSize + kernelFileAlignment - 1) & -kernelFileAlignment) -
+            unalignedSize;
+    for (int i = 0; i < padding; ++i) {
+      writeByte(0);
+    }
+
     // Fixed-size ints at the end used as an index.
     assert(_binaryOffsetForSourceTable >= 0);
     writeUInt32(_binaryOffsetForSourceTable);
@@ -477,10 +722,6 @@
     writeUInt32(getBufferOffset() + 4); // total size.
   }
 
-  void indexUris(Component component) {
-    _knownSourceUri.addAll(component.uriToSource.keys);
-  }
-
   void writeUriToSource(Map<Uri, Source> uriToSource) {
     _binaryOffsetForSourceTable = getBufferOffset();
 
@@ -490,22 +731,42 @@
 
     // Write data.
     int i = 0;
-    Utf8Encoder utf8Encoder = const Utf8Encoder();
+    Uint8List buffer = new Uint8List(1 << 16);
     for (Uri uri in _sourceUriIndexer.index.keys) {
       index[i] = getBufferOffset();
-      Source source =
-          (_knownSourceUri.contains(uri) ? uriToSource[uri] : null) ??
-              new Source(<int>[], const <int>[]);
+      Source source = ((includeSources &&
+                  _sourcesFromRealImplementation.length > i &&
+                  _sourcesFromRealImplementation[i] == true)
+              ? uriToSource[uri]
+              : null) ??
+          new Source(<int>[], const <int>[]);
 
-      writeByteList(utf8Encoder.convert(uri == null ? "" : "$uri"));
+      String uriAsString = uri == null ? "" : "$uri";
+      if (uriAsString.length * 3 < buffer.length) {
+        int length = NotQuiteString.writeUtf8(buffer, 0, uriAsString);
+        if (length < 0) {
+          // Utf8 encoding failed.
+          writeByteList(utf8.encoder.convert(uriAsString));
+        } else {
+          writeUInt30(length);
+          for (int j = 0; j < length; j++) {
+            writeByte(buffer[j]);
+          }
+        }
+      } else {
+        // Uncommon case with very long url.
+        writeByteList(utf8.encoder.convert(uriAsString));
+      }
+
       writeByteList(source.source);
       List<int> lineStarts = source.lineStarts;
       writeUInt30(lineStarts.length);
       int previousLineStart = 0;
-      lineStarts.forEach((lineStart) {
+      for (int j = 0; j < lineStarts.length; ++j) {
+        int lineStart = lineStarts[j];
         writeUInt30(lineStart - previousLineStart);
         previousLineStart = lineStart;
-      });
+      }
       i++;
     }
 
@@ -518,18 +779,32 @@
   void writeLibraryDependencyReference(LibraryDependency node) {
     int index = _libraryDependencyIndex[node];
     if (index == null) {
-      throw 'Reference to library dependency $node out of scope';
+      throw new ArgumentError(
+          'Reference to library dependency $node out of scope');
     }
     writeUInt30(index);
   }
 
-  void writeReference(Reference reference) {
+  void writeNullAllowedReference(Reference reference) {
     if (reference == null) {
       writeUInt30(0);
     } else {
       CanonicalName name = reference.canonicalName;
       if (name == null) {
-        throw 'Missing canonical name for $reference';
+        throw new ArgumentError('Missing canonical name for $reference');
+      }
+      checkCanonicalName(name);
+      writeUInt30(name.index + 1);
+    }
+  }
+
+  void writeNonNullReference(Reference reference) {
+    if (reference == null) {
+      throw new ArgumentError('Got null reference');
+    } else {
+      CanonicalName name = reference.canonicalName;
+      if (name == null) {
+        throw new ArgumentError('Missing canonical name for $reference');
       }
       checkCanonicalName(name);
       writeUInt30(name.index + 1);
@@ -547,7 +822,7 @@
     _reindexedCanonicalNames.add(node);
   }
 
-  void writeCanonicalNameReference(CanonicalName name) {
+  void writeNullAllowedCanonicalNameReference(CanonicalName name) {
     if (name == null) {
       writeUInt30(0);
     } else {
@@ -556,33 +831,37 @@
     }
   }
 
-  void writeLibraryReference(Library node) {
-    writeCanonicalNameReference(node.canonicalName);
+  void writeNonNullCanonicalNameReference(CanonicalName name) {
+    if (name == null) {
+      throw new ArgumentError(
+          'Expected a canonical name to be valid but was `null`.');
+    } else {
+      checkCanonicalName(name);
+      writeUInt30(name.index + 1);
+    }
+  }
+
+  void writeLibraryReference(Library node, {bool allowNull: false}) {
+    if (node.canonicalName == null && !allowNull) {
+      throw new ArgumentError(
+          'Expected a library reference to be valid but was `null`.');
+    }
+    writeNullAllowedCanonicalNameReference(node.canonicalName);
   }
 
   writeOffset(int offset) {
-    if (_activeFileUri == null) {
-      offset = TreeNode.noOffset;
-    }
-
     // TODO(jensj): Delta-encoding.
     // File offset ranges from -1 and up,
     // but is here saved as unsigned (thus the +1)
     writeUInt30(offset + 1);
   }
 
-  void writeClassReference(Class class_, {bool allowNull: false}) {
-    if (class_ == null && !allowNull) {
-      throw 'Expected a class reference to be valid but was `null`.';
+  void writeClassReference(Class class_) {
+    if (class_ == null) {
+      throw new ArgumentError(
+          'Expected a class reference to be valid but was `null`.');
     }
-    writeCanonicalNameReference(getCanonicalNameOfClass(class_));
-  }
-
-  void writeMemberReference(Member member, {bool allowNull: false}) {
-    if (member == null && !allowNull) {
-      throw 'Expected a member reference to be valid but was `null`.';
-    }
-    writeCanonicalNameReference(getCanonicalNameOfMember(member));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfClass(class_));
   }
 
   void writeName(Name node) {
@@ -604,37 +883,36 @@
     insideExternalLibrary = node.isExternal;
     libraryOffsets.add(getBufferOffset());
     writeByte(insideExternalLibrary ? 1 : 0);
-    writeCanonicalNameReference(getCanonicalNameOfLibrary(node));
+    writeNonNullCanonicalNameReference(getCanonicalNameOfLibrary(node));
     writeStringReference(node.name ?? '');
-    // TODO(jensj): We save (almost) the same URI twice.
-
-    final Uri activeFileUriSaved = _activeFileUri;
-    _activeFileUri = writeUriReference(node.fileUri);
-
+    writeUriReference(node.fileUri);
+    enterScope(memberScope: true);
     writeAnnotationList(node.annotations);
     writeLibraryDependencies(node);
     writeAdditionalExports(node.additionalExports);
     writeLibraryParts(node);
-    writeNodeList(node.typedefs);
-    classOffsets = <int>[];
-    writeNodeList(node.classes);
-    classOffsets.add(getBufferOffset());
-    writeNodeList(node.fields);
-    procedureOffsets = <int>[];
-    writeNodeList(node.procedures);
-    procedureOffsets.add(getBufferOffset());
+    leaveScope(memberScope: true);
 
-    _activeFileUri = activeFileUriSaved;
+    writeTypedefNodeList(node.typedefs);
+    classOffsets = new List<int>();
+    writeClassNodeList(node.classes);
+    classOffsets.add(getBufferOffset());
+    writeFieldNodeList(node.fields);
+    procedureOffsets = new List<int>();
+    writeProcedureNodeList(node.procedures);
+    procedureOffsets.add(getBufferOffset());
 
     // Fixed-size ints at the end used as an index.
     assert(classOffsets.length > 0);
-    for (int offset in classOffsets) {
+    for (int i = 0; i < classOffsets.length; ++i) {
+      int offset = classOffsets[i];
       writeUInt32(offset);
     }
     writeUInt32(classOffsets.length - 1);
 
     assert(procedureOffsets.length > 0);
-    for (int offset in procedureOffsets) {
+    for (int i = 0; i < procedureOffsets.length; ++i) {
+      int offset = procedureOffsets[i];
       writeUInt32(offset);
     }
     writeUInt32(procedureOffsets.length - 1);
@@ -646,7 +924,7 @@
         : <LibraryDependency, int>{};
     writeUInt30(library.dependencies.length);
     for (int i = 0; i < library.dependencies.length; ++i) {
-      var importNode = library.dependencies[i];
+      LibraryDependency importNode = library.dependencies[i];
       _libraryDependencyIndex[importNode] = i;
       writeLibraryDependency(importNode);
     }
@@ -655,7 +933,7 @@
   void writeAdditionalExports(List<Reference> additionalExports) {
     writeUInt30(additionalExports.length);
     for (Reference ref in additionalExports) {
-      writeReference(ref);
+      writeNonNullReference(ref);
     }
   }
 
@@ -666,7 +944,7 @@
     writeOffset(node.fileOffset);
     writeByte(node.flags);
     writeAnnotationList(node.annotations);
-    writeLibraryReference(node.targetLibrary);
+    writeLibraryReference(node.targetLibrary, allowNull: true);
     writeStringReference(node.name ?? '');
     writeNodeList(node.combinators);
   }
@@ -679,7 +957,7 @@
   void writeLibraryParts(Library library) {
     writeUInt30(library.parts.length);
     for (int i = 0; i < library.parts.length; ++i) {
-      var partNode = library.parts[i];
+      LibraryPart partNode = library.parts[i];
       writeLibraryPart(partNode);
     }
   }
@@ -693,12 +971,9 @@
   }
 
   void visitTypedef(Typedef node) {
-    _variableIndexer ??= new VariableIndexer();
-    writeCanonicalNameReference(getCanonicalNameOfTypedef(node));
-
-    final Uri activeFileUriSaved = _activeFileUri;
-    _activeFileUri = writeUriReference(node.fileUri);
-
+    enterScope(memberScope: true);
+    writeNonNullCanonicalNameReference(getCanonicalNameOfTypedef(node));
+    writeUriReference(node.fileUri);
     writeOffset(node.fileOffset);
     writeStringReference(node.name);
     writeAnnotationList(node.annotations);
@@ -714,19 +989,17 @@
 
     leaveScope(typeParameters: node.typeParametersOfFunctionType);
     leaveScope(typeParameters: node.typeParameters, variableScope: true);
-
-    _activeFileUri = activeFileUriSaved;
+    leaveScope(memberScope: true);
   }
 
   void writeAnnotation(Expression annotation) {
-    _variableIndexer ??= new VariableIndexer();
     writeNode(annotation);
   }
 
   void writeAnnotationList(List<Expression> annotations) {
     final len = annotations.length;
     writeUInt30(len);
-    for (var i = 0; i < len; i++) {
+    for (int i = 0; i < len; i++) {
       final annotation = annotations[i];
       writeAnnotation(annotation);
     }
@@ -743,16 +1016,15 @@
   void visitClass(Class node) {
     classOffsets.add(getBufferOffset());
 
+    if (node.isAnonymousMixin) _currentlyInNonimplementation = true;
+
     int flags = _encodeClassFlags(node.flags, node.level);
     if (node.canonicalName == null) {
-      throw 'Missing canonical name for $node';
+      throw new ArgumentError('Missing canonical name for $node');
     }
     writeByte(Tag.Class);
-    writeCanonicalNameReference(getCanonicalNameOfClass(node));
-
-    final Uri activeFileUriSaved = _activeFileUri;
-    _activeFileUri = writeUriReference(node.fileUri);
-
+    writeNonNullCanonicalNameReference(getCanonicalNameOfClass(node));
+    writeUriReference(node.fileUri);
     writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
@@ -760,27 +1032,30 @@
     writeByte(flags);
     writeStringReference(node.name ?? '');
 
+    enterScope(memberScope: true);
     writeAnnotationList(node.annotations);
+    leaveScope(memberScope: true);
     enterScope(typeParameters: node.typeParameters);
     writeNodeList(node.typeParameters);
     writeOptionalNode(node.supertype);
     writeOptionalNode(node.mixedInType);
     writeNodeList(node.implementedTypes);
-    writeNodeList(node.fields);
-    writeNodeList(node.constructors);
+    writeFieldNodeList(node.fields);
+    writeConstructorNodeList(node.constructors);
     procedureOffsets = <int>[];
-    writeNodeList(node.procedures);
+    writeProcedureNodeList(node.procedures);
     procedureOffsets.add(getBufferOffset());
-    writeNodeList(node.redirectingFactoryConstructors);
+    writeRedirectingFactoryConstructorNodeList(
+        node.redirectingFactoryConstructors);
     leaveScope(typeParameters: node.typeParameters);
 
-    _activeFileUri = activeFileUriSaved;
-
     assert(procedureOffsets.length > 0);
-    for (int offset in procedureOffsets) {
+    for (int i = 0; i < procedureOffsets.length; ++i) {
+      int offset = procedureOffsets[i];
       writeUInt32(offset);
     }
     writeUInt32(procedureOffsets.length - 1);
+    _currentlyInNonimplementation = false;
   }
 
   static final Name _emptyName = new Name('');
@@ -788,15 +1063,12 @@
   @override
   void visitConstructor(Constructor node) {
     if (node.canonicalName == null) {
-      throw 'Missing canonical name for $node';
+      throw new ArgumentError('Missing canonical name for $node');
     }
     enterScope(memberScope: true);
     writeByte(Tag.Constructor);
-    writeCanonicalNameReference(getCanonicalNameOfMember(node));
-
-    final Uri activeFileUriSaved = _activeFileUri;
-    _activeFileUri = writeUriReference(node.fileUri);
-
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeUriReference(node.fileUri);
     writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
@@ -806,14 +1078,13 @@
 
     writeAnnotationList(node.annotations);
     assert(node.function.typeParameters.isEmpty);
-    writeNode(node.function);
+    writeFunctionNode(node.function);
     // Parameters are in scope in the initializers.
+    _variableIndexer ??= new VariableIndexer();
     _variableIndexer.restoreScope(node.function.positionalParameters.length +
         node.function.namedParameters.length);
     writeNodeList(node.initializers);
 
-    _activeFileUri = activeFileUriSaved;
-
     leaveScope(memberScope: true);
   }
 
@@ -822,15 +1093,19 @@
     procedureOffsets.add(getBufferOffset());
 
     if (node.canonicalName == null) {
-      throw 'Missing canonical name for $node';
+      throw new ArgumentError('Missing canonical name for $node');
     }
+
+    final bool currentlyInNonimplementationSaved =
+        _currentlyInNonimplementation;
+    if (node.isNoSuchMethodForwarder || node.isSyntheticForwarder) {
+      _currentlyInNonimplementation = true;
+    }
+
     enterScope(memberScope: true);
     writeByte(Tag.Procedure);
-    writeCanonicalNameReference(getCanonicalNameOfMember(node));
-
-    final Uri activeFileUriSaved = _activeFileUri;
-    _activeFileUri = writeUriReference(node.fileUri);
-
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeUriReference(node.fileUri);
     writeOffset(node.startFileOffset);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
@@ -838,14 +1113,12 @@
     writeByte(node.flags);
     writeName(node.name ?? _emptyName);
     writeAnnotationList(node.annotations);
-    writeOptionalReference(node.forwardingStubSuperTargetReference);
-    writeOptionalReference(node.forwardingStubInterfaceTargetReference);
-    writeOptionalNode(node.function);
-
-    _activeFileUri = activeFileUriSaved;
-
+    writeNullAllowedReference(node.forwardingStubSuperTargetReference);
+    writeNullAllowedReference(node.forwardingStubInterfaceTargetReference);
+    writeOptionalFunctionNode(node.function);
     leaveScope(memberScope: true);
 
+    _currentlyInNonimplementation = currentlyInNonimplementationSaved;
     assert((node.forwardingStubSuperTarget != null) ||
         !(node.isForwardingStub && node.function.body != null));
   }
@@ -853,15 +1126,12 @@
   @override
   void visitField(Field node) {
     if (node.canonicalName == null) {
-      throw 'Missing canonical name for $node';
+      throw new ArgumentError('Missing canonical name for $node');
     }
     enterScope(memberScope: true);
     writeByte(Tag.Field);
-    writeCanonicalNameReference(getCanonicalNameOfMember(node));
-
-    final Uri activeFileUriSaved = _activeFileUri;
-    _activeFileUri = writeUriReference(node.fileUri);
-
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeUriReference(node.fileUri);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
     writeByte(node.flags);
@@ -869,34 +1139,28 @@
     writeAnnotationList(node.annotations);
     writeNode(node.type);
     writeOptionalNode(node.initializer);
-
-    _activeFileUri = activeFileUriSaved;
-
     leaveScope(memberScope: true);
   }
 
   @override
   void visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
     if (node.canonicalName == null) {
-      throw 'Missing canonical name for $node';
+      throw new ArgumentError('Missing canonical name for $node');
     }
     writeByte(Tag.RedirectingFactoryConstructor);
     enterScope(
         typeParameters: node.typeParameters,
         memberScope: true,
         variableScope: true);
-    writeCanonicalNameReference(getCanonicalNameOfMember(node));
-
-    final Uri activeFileUriSaved = _activeFileUri;
-    _activeFileUri = writeUriReference(node.fileUri);
-
+    writeNonNullCanonicalNameReference(getCanonicalNameOfMember(node));
+    writeUriReference(node.fileUri);
     writeOffset(node.fileOffset);
     writeOffset(node.fileEndOffset);
     writeByte(node.flags);
     writeName(node.name);
 
     writeAnnotationList(node.annotations);
-    writeReference(node.targetReference);
+    writeNonNullReference(node.targetReference);
     writeNodeList(node.typeArguments);
     writeNodeList(node.typeParameters);
     writeUInt30(node.positionalParameters.length + node.namedParameters.length);
@@ -904,8 +1168,6 @@
     writeVariableDeclarationList(node.positionalParameters);
     writeVariableDeclarationList(node.namedParameters);
 
-    _activeFileUri = activeFileUriSaved;
-
     leaveScope(
         typeParameters: node.typeParameters,
         memberScope: true,
@@ -922,7 +1184,7 @@
   void visitFieldInitializer(FieldInitializer node) {
     writeByte(Tag.FieldInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
-    writeReference(node.fieldReference);
+    writeNonNullReference(node.fieldReference);
     writeNode(node.value);
   }
 
@@ -931,8 +1193,8 @@
     writeByte(Tag.SuperInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
     writeOffset(node.fileOffset);
-    writeReference(node.targetReference);
-    writeNode(node.arguments);
+    writeNonNullReference(node.targetReference);
+    writeArgumentsNode(node.arguments);
   }
 
   @override
@@ -940,8 +1202,8 @@
     writeByte(Tag.RedirectingInitializer);
     writeByte(node.isSynthetic ? 1 : 0);
     writeOffset(node.fileOffset);
-    writeReference(node.targetReference);
-    writeNode(node.arguments);
+    writeNonNullReference(node.targetReference);
+    writeArgumentsNode(node.arguments);
   }
 
   @override
@@ -962,9 +1224,9 @@
   void visitFunctionNode(FunctionNode node) {
     writeByte(Tag.FunctionNode);
     enterScope(typeParameters: node.typeParameters, variableScope: true);
-    var oldLabels = _labelIndexer;
+    LabelIndexer oldLabels = _labelIndexer;
     _labelIndexer = null;
-    var oldCases = _switchCaseIndexer;
+    SwitchCaseIndexer oldCases = _switchCaseIndexer;
     _switchCaseIndexer = null;
     // Note: FunctionNode has no tag.
     writeOffset(node.fileOffset);
@@ -992,7 +1254,7 @@
 
   @override
   void visitVariableGet(VariableGet node) {
-    assert(_variableIndexer != null);
+    _variableIndexer ??= new VariableIndexer();
     int index = _variableIndexer[node.variable];
     assert(index != null);
     if (index & Tag.SpecializedPayloadMask == index &&
@@ -1004,15 +1266,16 @@
       writeByte(Tag.VariableGet);
       writeOffset(node.fileOffset);
       writeUInt30(node.variable.binaryOffsetNoTag);
-      writeUInt30(_variableIndexer[node.variable]);
+      writeUInt30(index);
       writeOptionalNode(node.promotedType);
     }
   }
 
   @override
   void visitVariableSet(VariableSet node) {
-    assert(_variableIndexer != null);
+    _variableIndexer ??= new VariableIndexer();
     int index = _variableIndexer[node.variable];
+    assert(index != null);
     if (index & Tag.SpecializedPayloadMask == index) {
       writeByte(Tag.SpecializedVariableSet + index);
       writeOffset(node.fileOffset);
@@ -1022,7 +1285,7 @@
       writeByte(Tag.VariableSet);
       writeOffset(node.fileOffset);
       writeUInt30(node.variable.binaryOffsetNoTag);
-      writeUInt30(_variableIndexer[node.variable]);
+      writeUInt30(index);
       writeNode(node.value);
     }
   }
@@ -1033,7 +1296,7 @@
     writeOffset(node.fileOffset);
     writeNode(node.receiver);
     writeName(node.name);
-    writeReference(node.interfaceTargetReference);
+    writeNullAllowedReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1043,7 +1306,7 @@
     writeNode(node.receiver);
     writeName(node.name);
     writeNode(node.value);
-    writeReference(node.interfaceTargetReference);
+    writeNullAllowedReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1051,7 +1314,7 @@
     writeByte(Tag.SuperPropertyGet);
     writeOffset(node.fileOffset);
     writeName(node.name);
-    writeReference(node.interfaceTargetReference);
+    writeNullAllowedReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1060,7 +1323,7 @@
     writeOffset(node.fileOffset);
     writeName(node.name);
     writeNode(node.value);
-    writeReference(node.interfaceTargetReference);
+    writeNullAllowedReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1068,7 +1331,7 @@
     writeByte(Tag.DirectPropertyGet);
     writeOffset(node.fileOffset);
     writeNode(node.receiver);
-    writeReference(node.targetReference);
+    writeNonNullReference(node.targetReference);
   }
 
   @override
@@ -1076,7 +1339,7 @@
     writeByte(Tag.DirectPropertySet);
     writeOffset(node.fileOffset);
     writeNode(node.receiver);
-    writeReference(node.targetReference);
+    writeNonNullReference(node.targetReference);
     writeNode(node.value);
   }
 
@@ -1084,14 +1347,14 @@
   void visitStaticGet(StaticGet node) {
     writeByte(Tag.StaticGet);
     writeOffset(node.fileOffset);
-    writeReference(node.targetReference);
+    writeNonNullReference(node.targetReference);
   }
 
   @override
   void visitStaticSet(StaticSet node) {
     writeByte(Tag.StaticSet);
     writeOffset(node.fileOffset);
-    writeReference(node.targetReference);
+    writeNonNullReference(node.targetReference);
     writeNode(node.value);
   }
 
@@ -1101,8 +1364,8 @@
     writeOffset(node.fileOffset);
     writeNode(node.receiver);
     writeName(node.name);
-    writeNode(node.arguments);
-    writeReference(node.interfaceTargetReference);
+    writeArgumentsNode(node.arguments);
+    writeNullAllowedReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1110,8 +1373,8 @@
     writeByte(Tag.SuperMethodInvocation);
     writeOffset(node.fileOffset);
     writeName(node.name);
-    writeNode(node.arguments);
-    writeReference(node.interfaceTargetReference);
+    writeArgumentsNode(node.arguments);
+    writeNullAllowedReference(node.interfaceTargetReference);
   }
 
   @override
@@ -1119,16 +1382,16 @@
     writeByte(Tag.DirectMethodInvocation);
     writeOffset(node.fileOffset);
     writeNode(node.receiver);
-    writeReference(node.targetReference);
-    writeNode(node.arguments);
+    writeNonNullReference(node.targetReference);
+    writeArgumentsNode(node.arguments);
   }
 
   @override
   void visitStaticInvocation(StaticInvocation node) {
     writeByte(node.isConst ? Tag.ConstStaticInvocation : Tag.StaticInvocation);
     writeOffset(node.fileOffset);
-    writeReference(node.targetReference);
-    writeNode(node.arguments);
+    writeNonNullReference(node.targetReference);
+    writeArgumentsNode(node.arguments);
   }
 
   @override
@@ -1137,8 +1400,8 @@
         ? Tag.ConstConstructorInvocation
         : Tag.ConstructorInvocation);
     writeOffset(node.fileOffset);
-    writeReference(node.targetReference);
-    writeNode(node.arguments);
+    writeNonNullReference(node.targetReference);
+    writeArgumentsNode(node.arguments);
   }
 
   @override
@@ -1168,7 +1431,7 @@
       case '||':
         return 1;
     }
-    throw 'Not a logical operator: $operator';
+    throw new ArgumentError('Not a logical operator: $operator');
   }
 
   @override
@@ -1302,6 +1565,14 @@
   }
 
   @override
+  void visitSetLiteral(SetLiteral node) {
+    writeByte(node.isConst ? Tag.ConstSetLiteral : Tag.SetLiteral);
+    writeOffset(node.fileOffset);
+    writeNode(node.typeArgument);
+    writeNodeList(node.expressions);
+  }
+
+  @override
   void visitMapLiteral(MapLiteral node) {
     writeByte(node.isConst ? Tag.ConstMapLiteral : Tag.MapLiteral);
     writeOffset(node.fileOffset);
@@ -1327,15 +1598,17 @@
   void visitFunctionExpression(FunctionExpression node) {
     writeByte(Tag.FunctionExpression);
     writeOffset(node.fileOffset);
-    writeNode(node.function);
+    writeFunctionNode(node.function);
   }
 
   @override
   void visitLet(Let node) {
     writeByte(Tag.Let);
+    _variableIndexer ??= new VariableIndexer();
+    _variableIndexer.pushScope();
     writeVariableDeclaration(node.variable);
     writeNode(node.body);
-    --_variableIndexer.stackHeight;
+    _variableIndexer.popScope();
   }
 
   @override
@@ -1373,6 +1646,7 @@
 
   @override
   void visitBlock(Block node) {
+    _variableIndexer ??= new VariableIndexer();
     _variableIndexer.pushScope();
     writeByte(Tag.Block);
     writeNodeList(node.statements);
@@ -1381,6 +1655,7 @@
 
   @override
   void visitAssertBlock(AssertBlock node) {
+    _variableIndexer ??= new VariableIndexer();
     _variableIndexer.pushScope();
     writeByte(Tag.AssertBlock);
     writeNodeList(node.statements);
@@ -1443,6 +1718,7 @@
 
   @override
   void visitForStatement(ForStatement node) {
+    _variableIndexer ??= new VariableIndexer();
     _variableIndexer.pushScope();
     writeByte(Tag.ForStatement);
     writeOffset(node.fileOffset);
@@ -1455,6 +1731,7 @@
 
   @override
   void visitForInStatement(ForInStatement node) {
+    _variableIndexer ??= new VariableIndexer();
     _variableIndexer.pushScope();
     writeByte(node.isAsync ? Tag.AsyncForInStatement : Tag.ForInStatement);
     writeOffset(node.fileOffset);
@@ -1474,7 +1751,7 @@
     writeByte(Tag.SwitchStatement);
     writeOffset(node.fileOffset);
     writeNode(node.expression);
-    writeNodeList(node.cases);
+    writeSwitchCaseNodeList(node.cases);
     _switchCaseIndexer.exit(node);
   }
 
@@ -1524,12 +1801,13 @@
     writeNode(node.body);
     bool needsStackTrace = node.catches.any((Catch c) => c.stackTrace != null);
     writeByte(_encodeTryCatchFlags(needsStackTrace, node.isSynthetic));
-    writeNodeList(node.catches);
+    writeCatchNodeList(node.catches);
   }
 
   @override
   void visitCatch(Catch node) {
     // Note: there is no tag on Catch.
+    _variableIndexer ??= new VariableIndexer();
     _variableIndexer.pushScope();
     writeOffset(node.fileOffset);
     writeNode(node.guard);
@@ -1574,6 +1852,7 @@
     writeOptionalNode(node.initializer);
     // Declare the variable after its initializer. It is not in scope in its
     // own initializer.
+    _variableIndexer ??= new VariableIndexer();
     _variableIndexer.declare(node);
   }
 
@@ -1595,7 +1874,7 @@
     writeByte(Tag.FunctionDeclaration);
     writeOffset(node.fileOffset);
     writeVariableDeclaration(node.variable);
-    writeNode(node.function);
+    writeFunctionNode(node.function);
   }
 
   @override
@@ -1622,10 +1901,10 @@
   void visitInterfaceType(InterfaceType node) {
     if (node.typeArguments.isEmpty) {
       writeByte(Tag.SimpleInterfaceType);
-      writeReference(node.className);
+      writeNonNullReference(node.className);
     } else {
       writeByte(Tag.InterfaceType);
-      writeReference(node.className);
+      writeNonNullReference(node.className);
       writeNodeList(node.typeArguments);
     }
   }
@@ -1634,10 +1913,10 @@
   void visitSupertype(Supertype node) {
     if (node.typeArguments.isEmpty) {
       writeByte(Tag.SimpleInterfaceType);
-      writeReference(node.className);
+      writeNonNullReference(node.className);
     } else {
       writeByte(Tag.InterfaceType);
-      writeReference(node.className);
+      writeNonNullReference(node.className);
       writeNodeList(node.typeArguments);
     }
   }
@@ -1647,7 +1926,7 @@
     if (node.requiredParameterCount == node.positionalParameters.length &&
         node.typeParameters.isEmpty &&
         node.namedParameters.isEmpty &&
-        node.typedefReference == null) {
+        node.typedefType == null) {
       writeByte(Tag.SimpleFunctionType);
       writeNodeList(node.positionalParameters);
       writeNode(node.returnType);
@@ -1660,7 +1939,7 @@
           node.positionalParameters.length + node.namedParameters.length);
       writeNodeList(node.positionalParameters);
       writeNodeList(node.namedParameters);
-      writeReference(node.typedefReference);
+      writeOptionalNode(node.typedefType);
       writeNode(node.returnType);
       leaveScope(typeParameters: node.typeParameters);
     }
@@ -1682,7 +1961,7 @@
   @override
   void visitTypedefType(TypedefType node) {
     writeByte(Tag.TypedefType);
-    writeReference(node.typedefReference);
+    writeNullAllowedReference(node.typedefReference);
     writeNodeList(node.typeArguments);
   }
 
@@ -1784,6 +2063,39 @@
   }
 
   @override
+  void visitEnvironmentBoolConstant(EnvironmentBoolConstant node) {
+    throw new UnsupportedError('serialization of EnvironmentBoolConstants');
+  }
+
+  @override
+  void visitEnvironmentBoolConstantReference(EnvironmentBoolConstant node) {
+    throw new UnsupportedError(
+        'serialization of EnvironmentBoolConstant references');
+  }
+
+  @override
+  void visitEnvironmentIntConstant(EnvironmentIntConstant node) {
+    throw new UnsupportedError('serialization of EnvironmentIntConstants');
+  }
+
+  @override
+  void visitEnvironmentIntConstantReference(EnvironmentIntConstant node) {
+    throw new UnsupportedError(
+        'serialization of EnvironmentIntConstant references');
+  }
+
+  @override
+  void visitEnvironmentStringConstant(EnvironmentStringConstant node) {
+    throw new UnsupportedError('serialization of EnvironmentStringConstants');
+  }
+
+  @override
+  void visitEnvironmentStringConstantReference(EnvironmentStringConstant node) {
+    throw new UnsupportedError(
+        'serialization of EnvironmentStringConstant references');
+  }
+
+  @override
   void visitFieldReference(Field node) {
     throw new UnsupportedError('serialization of Field references');
   }
@@ -1928,20 +2240,33 @@
   void visitTypedefReference(Typedef node) {
     throw new UnsupportedError('serialization of Typedef references');
   }
+
+  @override
+  void visitUnevaluatedConstant(UnevaluatedConstant node) {
+    throw new UnsupportedError('serialization of UnevaluatedConstants');
+  }
+
+  @override
+  void visitUnevaluatedConstantReference(UnevaluatedConstant node) {
+    throw new UnsupportedError(
+        'serialization of UnevaluatedConstant references');
+  }
 }
 
 typedef bool LibraryFilter(Library _);
 
 class VariableIndexer {
-  final Map<VariableDeclaration, int> index = <VariableDeclaration, int>{};
-  final List<int> scopes = <int>[];
+  Map<VariableDeclaration, int> index;
+  List<int> scopes;
   int stackHeight = 0;
 
   void declare(VariableDeclaration node) {
+    index ??= <VariableDeclaration, int>{};
     index[node] = stackHeight++;
   }
 
   void pushScope() {
+    scopes ??= new List<int>();
     scopes.add(stackHeight);
   }
 
@@ -1954,7 +2279,7 @@
   }
 
   int operator [](VariableDeclaration node) {
-    return index[node];
+    return index == null ? null : index[node];
   }
 }
 
@@ -1978,7 +2303,7 @@
   int stackHeight = 0;
 
   void enter(SwitchStatement node) {
-    for (var caseNode in node.cases) {
+    for (SwitchCase caseNode in node.cases) {
       index[caseNode] = stackHeight++;
     }
   }
@@ -2040,7 +2365,8 @@
   int stackHeight = 0;
 
   void enter(List<TypeParameter> typeParameters) {
-    for (var parameter in typeParameters) {
+    for (int i = 0; i < typeParameters.length; ++i) {
+      TypeParameter parameter = typeParameters[i];
       index[parameter] = stackHeight;
       ++stackHeight;
     }
@@ -2048,11 +2374,14 @@
 
   void exit(List<TypeParameter> typeParameters) {
     stackHeight -= typeParameters.length;
-    typeParameters.forEach(index.remove);
+    for (int i = 0; i < typeParameters.length; ++i) {
+      index.remove(typeParameters[i]);
+    }
   }
 
   int operator [](TypeParameter parameter) =>
-      index[parameter] ?? (throw 'Type parameter $parameter is not indexed');
+      index[parameter] ??
+      (throw new ArgumentError('Type parameter $parameter is not indexed'));
 }
 
 class StringIndexer {
@@ -2064,7 +2393,7 @@
   }
 
   int put(String string) {
-    var result = index[string];
+    int result = index[string];
     if (result == null) {
       result = index.length;
       index[string] = result;
@@ -2084,7 +2413,7 @@
   }
 
   int put(Uri uri) {
-    var result = index[uri];
+    int result = index[uri];
     if (result == null) {
       result = index.length;
       index[uri] = result;
@@ -2219,3 +2548,64 @@
     // Nothing to do.
   }
 }
+
+class NotQuiteString {
+  /**
+   * Write [source] string into [target] starting at index [index].
+   *
+   * Optionally only write part of the input [source] starting at [start] and
+   * ending at [end].
+   *
+   * The output space needed is at most [source.length] * 3.
+   *
+   * Returns
+   *  * Non-negative on success (the new index in [target]).
+   *  * -1 when [target] doesn't have enough space. Note that [target] can be
+   *    poluted starting at [index].
+   *  * -2 on input error, i.e. an unpaired lead or tail surrogate.
+   */
+  static int writeUtf8(List<int> target, int index, String source,
+      [int start = 0, int end]) {
+    RangeError.checkValidIndex(index, target, null, target.length);
+    end = RangeError.checkValidRange(start, end, source.length);
+    if (start == end) return index;
+    int i = start;
+    int length = target.length;
+    do {
+      int codeUnit = source.codeUnitAt(i++);
+      while (codeUnit < 128) {
+        if (index >= length) return -1;
+        target[index++] = codeUnit;
+        if (i >= end) return index;
+        codeUnit = source.codeUnitAt(i++);
+      }
+      if (codeUnit < 0x800) {
+        index += 2;
+        if (index > length) return -1;
+        target[index - 2] = 0xC0 | (codeUnit >> 6);
+        target[index - 1] = 0x80 | (codeUnit & 0x3f);
+      } else if (codeUnit & 0xF800 != 0xD800) {
+        // Not a surrogate.
+        index += 3;
+        if (index > length) return -1;
+        target[index - 3] = 0xE0 | (codeUnit >> 12);
+        target[index - 2] = 0x80 | ((codeUnit >> 6) & 0x3f);
+        target[index - 1] = 0x80 | (codeUnit & 0x3f);
+      } else {
+        if (codeUnit >= 0xDC00) return -2; // Unpaired tail surrogate.
+        if (i >= end) return -2; // Unpaired lead surrogate.
+        int nextChar = source.codeUnitAt(i++);
+        if (nextChar & 0xFC00 != 0xDC00) return -2; // Unpaired lead surrogate.
+        index += 4;
+        if (index > length) return -1;
+        codeUnit = (codeUnit & 0x3FF) + 0x40;
+        target[index - 4] = 0xF0 | (codeUnit >> 8);
+        target[index - 3] = 0x80 | ((codeUnit >> 2) & 0x3F);
+        target[index - 2] =
+            0x80 | (((codeUnit & 3) << 4) | ((nextChar & 0x3FF) >> 6));
+        target[index - 1] = 0x80 | (nextChar & 0x3f);
+      }
+    } while (i < end);
+    return index;
+  }
+}
diff --git a/pkg/kernel/lib/binary/limited_ast_to_binary.dart b/pkg/kernel/lib/binary/limited_ast_to_binary.dart
index 82fe07d..0cef7c7 100644
--- a/pkg/kernel/lib/binary/limited_ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/limited_ast_to_binary.dart
@@ -24,7 +24,7 @@
 
   LimitedBinaryPrinter(
       Sink<List<int>> sink, this.predicate, this.excludeUriToSource)
-      : super(sink);
+      : super(sink, includeSources: !excludeUriToSource);
 
   @override
   void computeCanonicalNames(Component component) {
@@ -43,10 +43,11 @@
     return predicate(library);
   }
 
-  @override
   void writeLibraries(Component component) {
-    var librariesToWrite = component.libraries.where(predicate).toList();
-    writeList(librariesToWrite, writeNode);
+    for (int i = 0; i < component.libraries.length; ++i) {
+      Library library = component.libraries[i];
+      if (predicate(library)) writeLibraryNode(library);
+    }
   }
 
   @override
@@ -60,13 +61,4 @@
     var librariesToWrite = libraries.where(predicate).toList();
     super.writeComponentIndex(component, librariesToWrite);
   }
-
-  @override
-  void indexUris(Component component) {
-    if (!excludeUriToSource) {
-      super.indexUris(component);
-    } else {
-      // We pretend not to know any uris, thereby excluding all sources.
-    }
-  }
 }
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index aea6b2a..6a34a73 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -11,11 +11,13 @@
 
   static const int FunctionNode = 3;
 
+  // Members
   static const int Field = 4;
   static const int Constructor = 5;
   static const int Procedure = 6;
   static const int RedirectingFactoryConstructor = 108;
 
+  // Initializers
   static const int InvalidInitializer = 7;
   static const int FieldInitializer = 8;
   static const int SuperInitializer = 9;
@@ -23,6 +25,7 @@
   static const int LocalInitializer = 11;
   static const int AssertInitializer = 12;
 
+  // Expressions
   static const int CheckLibraryIsLoaded = 13;
   static const int LoadLibrary = 14;
   static const int DirectPropertyGet = 15;
@@ -70,7 +73,10 @@
   static const int BigIntLiteral = 57;
   static const int ConstListLiteral = 58;
   static const int ConstMapLiteral = 59;
+  static const int SetLiteral = 109;
+  static const int ConstSetLiteral = 110;
 
+  // Statements
   static const int ExpressionStatement = 61;
   static const int Block = 62;
   static const int EmptyStatement = 63;
@@ -93,6 +99,7 @@
   static const int AsyncForInStatement = 80;
   static const int AssertBlock = 81;
 
+  // Types
   static const int TypedefType = 87;
   static const int BottomType = 89;
   static const int InvalidType = 90;
@@ -104,13 +111,16 @@
   static const int SimpleInterfaceType = 96;
   static const int SimpleFunctionType = 97;
 
+  // References
   static const int NullReference = 99;
   static const int ClassReference = 100;
   static const int MemberReference = 101;
 
   static const int ConstantExpression = 107;
 
-  // Note that 108 is occupied by [RedirectingFactoryConstructor] above.
+  /// 108 is occupied by [RedirectingFactoryConstructor] (member).
+  /// 109 is occupied by [SetLiteral] (expression).
+  /// 110 is occupied by [ConstSetLiteral] (expression).
 
   static const int SpecializedTagHighBit = 0x80; // 10000000
   static const int SpecializedTagMask = 0xF8; // 11111000
@@ -127,7 +137,7 @@
   /// Internal version of kernel binary format.
   /// Bump it when making incompatible changes in kernel binaries.
   /// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
-  static const int BinaryFormatVersion = 12;
+  static const int BinaryFormatVersion = 16;
 }
 
 abstract class ConstantTag {
@@ -143,4 +153,8 @@
   static const int PartialInstantiationConstant = 9;
   static const int TearOffConstant = 10;
   static const int TypeLiteralConstant = 11;
+  static const int EnvironmentBoolConstant = 12;
+  static const int EnvironmentIntConstant = 13;
+  static const int EnvironmentStringConstant = 14;
+  static const int UnevaluatedConstant = 15;
 }
diff --git a/pkg/kernel/lib/canonical_name.dart b/pkg/kernel/lib/canonical_name.dart
index 6fbc693..20bf36c 100644
--- a/pkg/kernel/lib/canonical_name.dart
+++ b/pkg/kernel/lib/canonical_name.dart
@@ -94,6 +94,8 @@
   Iterable<CanonicalName> get children =>
       _children?.values ?? const <CanonicalName>[];
 
+  Iterable<CanonicalName> get childrenOrNull => _children?.values;
+
   bool hasChild(String name) {
     return _children != null && _children.containsKey(name);
   }
@@ -175,8 +177,11 @@
 
   void unbindAll() {
     unbind();
-    for (var child in children) {
-      child.unbindAll();
+    Iterable<CanonicalName> children_ = childrenOrNull;
+    if (children_ != null) {
+      for (CanonicalName child in children_) {
+        child.unbindAll();
+      }
     }
   }
 
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 214572a..9fa31ec 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -39,9 +39,6 @@
   /// [unordered], they are not included.
   Iterable<Class> getOrderedClasses(Iterable<Class> unordered);
 
-  /// True if the component contains another class that is a subtype of given one.
-  bool hasProperSubtypes(Class class_);
-
   // Returns the instantition of each generic supertype implemented by this
   // class (e.g. getClassAsInstanceOf applied to all superclasses and
   // interfaces).
@@ -58,11 +55,11 @@
   /// q be the largest number such that S_q has cardinality one.  The least
   /// upper bound of I and J is the sole element of S_q.
   ///
-  /// This is called the "classic" least upper bound to distinguish it from the
-  /// strong mode least upper bound, which has special behaviors in the case
-  /// where one type is a subtype of the other, or where both types are based on
-  /// the same class.
-  InterfaceType getClassicLeastUpperBound(
+  /// This is called the "legacy" least upper bound to distinguish it from the
+  /// Dart 2 least upper bound, which has special behaviors in the case where
+  /// one type is a subtype of the other, or where both types are based on the
+  /// same class.
+  InterfaceType getLegacyLeastUpperBound(
       InterfaceType type1, InterfaceType type2);
 
   /// Returns the instantiation of [superclass] that is implemented by [class_],
@@ -506,7 +503,7 @@
   }
 
   @override
-  InterfaceType getClassicLeastUpperBound(
+  InterfaceType getLegacyLeastUpperBound(
       InterfaceType type1, InterfaceType type2) {
     // The algorithm is: first we compute a list of superclasses for both types,
     // ordered from greatest to least depth, and ordered by topological sort
@@ -609,7 +606,7 @@
       throw "${class_.fileUri}: No class info for ${class_.name}";
     }
     _ClassInfo superInfo = _infoFor[superclass];
-    if (info == null) {
+    if (superInfo == null) {
       throw "${superclass.fileUri}: No class info for ${superclass.name}";
     }
     if (!info.isSubtypeOf(superInfo)) return null;
@@ -697,14 +694,6 @@
   }
 
   @override
-  bool hasProperSubtypes(Class class_) {
-    _ClassInfo info = _infoFor[class_];
-    return info.directExtenders.isNotEmpty ||
-        info.directImplementers.isNotEmpty ||
-        info.directMixers.isNotEmpty;
-  }
-
-  @override
   List<Supertype> genericSupertypesOf(Class class_) {
     final supertypes = _infoFor[class_].genericSuperTypes;
     if (supertypes == null) return const <Supertype>[];
@@ -1405,7 +1394,7 @@
   ClassSet(this._classes);
 
   bool contains(Object class_) {
-    return _classes.contains(_classes);
+    return _classes.contains(class_);
   }
 
   ClassSet union(ClassSet other) {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index c5ea6e3..17ade68 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -224,6 +224,11 @@
         typeArgument: visitType(node.typeArgument), isConst: node.isConst);
   }
 
+  visitSetLiteral(SetLiteral node) {
+    return new SetLiteral(node.expressions.map(clone).toList(),
+        typeArgument: visitType(node.typeArgument), isConst: node.isConst);
+  }
+
   visitMapLiteral(MapLiteral node) {
     return new MapLiteral(node.entries.map(clone).toList(),
         keyType: visitType(node.keyType),
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index f74dc34..9df95ca 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -47,6 +47,7 @@
   Class _doubleClass;
   Class _stringClass;
   Class _listClass;
+  Class _setClass;
   Class _mapClass;
   Class _iterableClass;
   Class _iteratorClass;
@@ -54,19 +55,13 @@
   Class _typeClass;
   Class _functionClass;
   Class _invocationClass;
-  Constructor _externalNameDefaultConstructor;
   Class _invocationMirrorClass;
   Constructor _invocationMirrorWithTypeConstructor;
-  Constructor _invocationMirrorWithoutTypeConstructor;
-  Class _noSuchMethodErrorClass;
   Constructor _noSuchMethodErrorDefaultConstructor;
   Procedure _listFromConstructor;
   Procedure _listUnmodifiableConstructor;
-  Procedure _printProcedure;
   Procedure _identicalProcedure;
-  Constructor _duplicatedFieldInitializerErrorDefaultConstructor;
   Constructor _fallThroughErrorUrlAndLineConstructor;
-  Constructor _compileTimeErrorDefaultConstructor;
   Procedure _objectEquals;
   Procedure _mapUnmodifiable;
 
@@ -76,15 +71,11 @@
   Class _futureClass;
   Class _stackTraceClass;
   Class _streamClass;
-  Class _completerClass;
   Class _asyncAwaitCompleterClass;
   Class _futureOrClass;
   Constructor _asyncAwaitCompleterConstructor;
   Procedure _completeOnAsyncReturnProcedure;
-  Procedure _completerSyncConstructor;
-  Procedure _completerComplete;
   Procedure _completerCompleteError;
-  Procedure _futureMicrotaskConstructor;
   Constructor _syncIterableDefaultConstructor;
   Constructor _streamIteratorDefaultConstructor;
   Constructor _asyncStarStreamControllerDefaultConstructor;
@@ -176,20 +167,11 @@
     return _boolClass ??= index.getClass('dart:core', 'bool');
   }
 
-  Class get completerClass {
-    return _completerClass ??= index.getClass('dart:async', 'Completer');
-  }
-
   Class get asyncAwaitCompleterClass {
     return _asyncAwaitCompleterClass ??=
         index.getClass('dart:async', '_AsyncAwaitCompleter');
   }
 
-  Procedure get completerSyncConstructor {
-    return _completerSyncConstructor ??=
-        index.getMember('dart:async', 'Completer', 'sync');
-  }
-
   Constructor get asyncAwaitCompleterConstructor {
     return _asyncAwaitCompleterConstructor ??=
         index.getMember('dart:async', '_AsyncAwaitCompleter', '');
@@ -200,11 +182,6 @@
         index.getTopLevelMember('dart:async', '_completeOnAsyncReturn');
   }
 
-  Procedure get completerComplete {
-    return _completerComplete ??=
-        index.getMember('dart:async', 'Completer', 'complete');
-  }
-
   Procedure get completerCompleteError {
     return _completerCompleteError ??=
         index.getMember('dart:async', 'Completer', 'completeError');
@@ -222,11 +199,6 @@
     return _doubleClass ??= index.getClass('dart:core', 'double');
   }
 
-  Constructor get externalNameDefaultConstructor {
-    return _externalNameDefaultConstructor ??=
-        index.getMember('dart:_internal', 'ExternalName', '');
-  }
-
   Class get functionClass {
     return _functionClass ??= index.getClass('dart:core', 'Function');
   }
@@ -235,11 +207,6 @@
     return _futureClass ??= index.getClass('dart:async', 'Future');
   }
 
-  Procedure get futureMicrotaskConstructor {
-    return _futureMicrotaskConstructor ??=
-        index.getMember('dart:async', 'Future', 'microtask');
-  }
-
   Class get futureOrClass {
     return _futureOrClass ??= index.getClass('dart:async', 'FutureOr');
   }
@@ -271,11 +238,6 @@
         index.getMember('dart:core', '_InvocationMirror', '_withType');
   }
 
-  Constructor get invocationMirrorWithoutTypeConstructor {
-    return _invocationMirrorWithoutTypeConstructor ??=
-        index.getMember('dart:core', '_InvocationMirror', '_withoutType');
-  }
-
   Class get iterableClass {
     return _iterableClass ??= index.getClass('dart:core', 'Iterable');
   }
@@ -298,6 +260,10 @@
         index.getMember('dart:core', 'List', 'unmodifiable');
   }
 
+  Class get setClass {
+    return _setClass ??= index.getClass('dart:core', 'Set');
+  }
+
   Class get mapClass {
     return _mapClass ??= index.getClass('dart:core', 'Map');
   }
@@ -311,11 +277,6 @@
     return _mirrorsLibrary ??= index.tryGetLibrary('dart:mirrors');
   }
 
-  Class get noSuchMethodErrorClass {
-    return _noSuchMethodErrorClass ??=
-        index.getClass('dart:core', 'NoSuchMethodError');
-  }
-
   Constructor get noSuchMethodErrorDefaultConstructor {
     return _noSuchMethodErrorDefaultConstructor ??=
         // TODO(regis): Replace 'withInvocation' with '' after dart2js is fixed.
@@ -350,10 +311,6 @@
     return _pragmaOptions ??= index.getMember('dart:core', 'pragma', 'options');
   }
 
-  Procedure get printProcedure {
-    return _printProcedure ??= index.getTopLevelMember('dart:core', 'print');
-  }
-
   Class get stackTraceClass {
     return _stackTraceClass ??= index.getClass('dart:core', 'StackTrace');
   }
@@ -416,21 +373,11 @@
     return _typeClass ??= index.getClass('dart:core', 'Type');
   }
 
-  Constructor get duplicatedFieldInitializerErrorDefaultConstructor {
-    return _duplicatedFieldInitializerErrorDefaultConstructor ??=
-        index.getMember('dart:core', '_DuplicatedFieldInitializerError', '');
-  }
-
   Constructor get fallThroughErrorUrlAndLineConstructor {
     return _fallThroughErrorUrlAndLineConstructor ??=
         index.getMember('dart:core', 'FallThroughError', '_create');
   }
 
-  Constructor get compileTimeErrorDefaultConstructor {
-    return _compileTimeErrorDefaultConstructor ??=
-        index.getMember('dart:core', '_CompileTimeError', '');
-  }
-
   Procedure get boolFromEnvironment {
     return _boolFromEnvironment ??=
         index.getMember('dart:core', 'bool', 'fromEnvironment');
diff --git a/pkg/kernel/lib/log.dart b/pkg/kernel/lib/log.dart
deleted file mode 100644
index 9a6d6a2..0000000
--- a/pkg/kernel/lib/log.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-library kernel.log;
-
-import 'package:logging/logging.dart';
-export 'package:logging/logging.dart';
-
-final Logger log = new Logger("dart-kernel");
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index 4a13042..5924ca6 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -14,10 +14,10 @@
   void reportInvalidOverride(Member member, Member inherited, String message);
 }
 
-class StrongModeTypeChecker extends type_checker.TypeChecker {
+class NaiveTypeChecker extends type_checker.TypeChecker {
   final FailureListener failures;
 
-  StrongModeTypeChecker(FailureListener failures, Component component,
+  NaiveTypeChecker(FailureListener failures, Component component,
       {bool ignoreSdk: false})
       : this._(
             failures,
@@ -29,7 +29,7 @@
             }),
             ignoreSdk);
 
-  StrongModeTypeChecker._(this.failures, CoreTypes coreTypes,
+  NaiveTypeChecker._(this.failures, CoreTypes coreTypes,
       ClassHierarchy hierarchy, bool ignoreSdk)
       : super(coreTypes, hierarchy, ignoreSdk: ignoreSdk);
 
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
new file mode 100644
index 0000000..5dc341f
--- /dev/null
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -0,0 +1,453 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../ast.dart'
+    show
+        BottomType,
+        Class,
+        DartType,
+        DynamicType,
+        FunctionType,
+        InterfaceType,
+        InvalidType,
+        NamedType,
+        TypeParameter,
+        TypeParameterType,
+        TypedefType,
+        VoidType;
+
+import '../type_algebra.dart' show Substitution, substitute;
+
+import '../type_environment.dart' show TypeEnvironment;
+
+import '../util/graph.dart' show Graph, computeStrongComponents;
+
+import '../visitor.dart' show DartTypeVisitor;
+
+class TypeVariableGraph extends Graph<int> {
+  List<int> vertices;
+  List<TypeParameter> typeParameters;
+  List<DartType> bounds;
+
+  // `edges[i]` is the list of indices of type variables that reference the type
+  // variable with the index `i` in their bounds.
+  List<List<int>> edges;
+
+  TypeVariableGraph(this.typeParameters, this.bounds) {
+    assert(typeParameters.length == bounds.length);
+
+    vertices = new List<int>(typeParameters.length);
+    Map<TypeParameter, int> typeParameterIndices = <TypeParameter, int>{};
+    edges = new List<List<int>>(typeParameters.length);
+    for (int i = 0; i < vertices.length; i++) {
+      vertices[i] = i;
+      typeParameterIndices[typeParameters[i]] = i;
+      edges[i] = <int>[];
+    }
+
+    for (int i = 0; i < vertices.length; i++) {
+      OccurrenceCollectorVisitor collector =
+          new OccurrenceCollectorVisitor(typeParameters.toSet());
+      collector.visit(bounds[i]);
+      for (TypeParameter typeParameter in collector.occurred) {
+        edges[typeParameterIndices[typeParameter]].add(i);
+      }
+    }
+  }
+
+  Iterable<int> neighborsOf(int index) {
+    return edges[index];
+  }
+}
+
+class OccurrenceCollectorVisitor extends DartTypeVisitor {
+  final Set<TypeParameter> typeParameters;
+  Set<TypeParameter> occurred = new Set<TypeParameter>();
+
+  OccurrenceCollectorVisitor(this.typeParameters);
+
+  visit(DartType node) => node.accept(this);
+
+  visitNamedType(NamedType node) {
+    node.type.accept(this);
+  }
+
+  visitInvalidType(InvalidType node);
+  visitDynamicType(DynamicType node);
+  visitVoidType(VoidType node);
+
+  visitInterfaceType(InterfaceType node) {
+    for (DartType argument in node.typeArguments) {
+      argument.accept(this);
+    }
+  }
+
+  visitTypedefType(TypedefType node) {
+    for (DartType argument in node.typeArguments) {
+      argument.accept(this);
+    }
+  }
+
+  visitFunctionType(FunctionType node) {
+    for (TypeParameter typeParameter in node.typeParameters) {
+      typeParameter.bound.accept(this);
+      typeParameter.defaultType?.accept(this);
+    }
+    for (DartType parameter in node.positionalParameters) {
+      parameter.accept(this);
+    }
+    for (NamedType namedParameter in node.namedParameters) {
+      namedParameter.type.accept(this);
+    }
+    node.returnType.accept(this);
+  }
+
+  visitTypeParameterType(TypeParameterType node) {
+    if (typeParameters.contains(node.parameter)) {
+      occurred.add(node.parameter);
+    }
+  }
+}
+
+DartType instantiateToBounds(DartType type, Class object) {
+  if (type is InterfaceType) {
+    for (var typeArgument in type.typeArguments) {
+      // If at least one of the arguments is not dynamic, we assume that the
+      // type is not raw and does not need instantiation of its type parameters
+      // to their bounds.
+      if (typeArgument is! DynamicType) {
+        return type;
+      }
+    }
+    return new InterfaceType.byReference(
+        type.className, calculateBounds(type.classNode.typeParameters, object));
+  }
+  if (type is TypedefType) {
+    for (var typeArgument in type.typeArguments) {
+      if (typeArgument is! DynamicType) {
+        return type;
+      }
+    }
+    return new TypedefType.byReference(type.typedefReference,
+        calculateBounds(type.typedefNode.typeParameters, object));
+  }
+  return type;
+}
+
+/// Calculates bounds to be provided as type arguments in place of missing type
+/// arguments on raw types with the given type parameters.
+///
+/// See the [description]
+/// (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/instantiate-to-bound.md)
+/// of the algorithm for details.
+List<DartType> calculateBounds(
+    List<TypeParameter> typeParameters, Class object) {
+  List<DartType> bounds = new List<DartType>(typeParameters.length);
+  for (int i = 0; i < typeParameters.length; i++) {
+    DartType bound = typeParameters[i].bound;
+    if (bound == null) {
+      bound = const DynamicType();
+    } else if (bound is InterfaceType && bound.classNode == object) {
+      DartType defaultType = typeParameters[i].defaultType;
+      if (!(defaultType is InterfaceType && defaultType.classNode == object)) {
+        bound = const DynamicType();
+      }
+    }
+    bounds[i] = bound;
+  }
+
+  TypeVariableGraph graph = new TypeVariableGraph(typeParameters, bounds);
+  List<List<int>> stronglyConnected = computeStrongComponents(graph);
+  for (List<int> component in stronglyConnected) {
+    Map<TypeParameter, DartType> upperBounds = <TypeParameter, DartType>{};
+    Map<TypeParameter, DartType> lowerBounds = <TypeParameter, DartType>{};
+    for (int typeParameterIndex in component) {
+      upperBounds[typeParameters[typeParameterIndex]] = const DynamicType();
+      lowerBounds[typeParameters[typeParameterIndex]] = const BottomType();
+    }
+    Substitution substitution =
+        Substitution.fromUpperAndLowerBounds(upperBounds, lowerBounds);
+    for (int typeParameterIndex in component) {
+      bounds[typeParameterIndex] =
+          substitution.substituteType(bounds[typeParameterIndex]);
+    }
+  }
+
+  for (int i = 0; i < typeParameters.length; i++) {
+    Map<TypeParameter, DartType> upperBounds = <TypeParameter, DartType>{};
+    Map<TypeParameter, DartType> lowerBounds = <TypeParameter, DartType>{};
+    upperBounds[typeParameters[i]] = bounds[i];
+    lowerBounds[typeParameters[i]] = const BottomType();
+    Substitution substitution =
+        Substitution.fromUpperAndLowerBounds(upperBounds, lowerBounds);
+    for (int j = 0; j < typeParameters.length; j++) {
+      bounds[j] = substitution.substituteType(bounds[j]);
+    }
+  }
+
+  return bounds;
+}
+
+class TypeArgumentIssue {
+  // The type argument that violated the bound.
+  final DartType argument;
+
+  // The type parameter with the bound that was violated.
+  final TypeParameter typeParameter;
+
+  // The enclosing type of the issue, that is, the one with [typeParameter].
+  final DartType enclosingType;
+
+  TypeArgumentIssue(this.argument, this.typeParameter, this.enclosingType);
+}
+
+// TODO(dmitryas):  Remove [typedefInstantiations] when type arguments passed to
+// typedefs are preserved in the Kernel output.
+List<TypeArgumentIssue> findTypeArgumentIssues(
+    DartType type, TypeEnvironment typeEnvironment,
+    {bool allowSuperBounded = false}) {
+  List<TypeParameter> variables;
+  List<DartType> arguments;
+  List<TypeArgumentIssue> typedefRhsResult;
+
+  if (type is FunctionType && type.typedefType != null) {
+    // [type] is a function type that is an application of a parametrized
+    // typedef.  We need to check both the l.h.s. and the r.h.s. of the
+    // definition in that case.  For details, see [link]
+    // (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/super-bounded-types.md).
+    FunctionType functionType = type;
+    FunctionType cloned = new FunctionType(
+        functionType.positionalParameters, functionType.returnType,
+        namedParameters: functionType.namedParameters,
+        typeParameters: functionType.typeParameters,
+        requiredParameterCount: functionType.requiredParameterCount,
+        typedefType: null);
+    typedefRhsResult = findTypeArgumentIssues(cloned, typeEnvironment,
+        allowSuperBounded: true);
+    type = functionType.typedefType;
+  }
+
+  if (type is InterfaceType) {
+    variables = type.classNode.typeParameters;
+    arguments = type.typeArguments;
+  } else if (type is TypedefType) {
+    variables = type.typedefNode.typeParameters;
+    arguments = type.typeArguments;
+  } else if (type is FunctionType) {
+    List<TypeArgumentIssue> result = <TypeArgumentIssue>[];
+    for (TypeParameter parameter in type.typeParameters) {
+      result.addAll(findTypeArgumentIssues(parameter.bound, typeEnvironment,
+              allowSuperBounded: true) ??
+          const <TypeArgumentIssue>[]);
+    }
+    for (DartType formal in type.positionalParameters) {
+      result.addAll(findTypeArgumentIssues(formal, typeEnvironment,
+              allowSuperBounded: true) ??
+          const <TypeArgumentIssue>[]);
+    }
+    for (NamedType named in type.namedParameters) {
+      result.addAll(findTypeArgumentIssues(named.type, typeEnvironment,
+              allowSuperBounded: true) ??
+          const <TypeArgumentIssue>[]);
+    }
+    result.addAll(findTypeArgumentIssues(type.returnType, typeEnvironment,
+            allowSuperBounded: true) ??
+        const <TypeArgumentIssue>[]);
+    return result.isEmpty ? null : result;
+  } else {
+    return null;
+  }
+
+  if (variables == null) return null;
+
+  List<TypeArgumentIssue> result;
+  List<TypeArgumentIssue> argumentsResult;
+
+  Map<TypeParameter, DartType> substitutionMap =
+      new Map<TypeParameter, DartType>.fromIterables(variables, arguments);
+  for (int i = 0; i < arguments.length; ++i) {
+    DartType argument = arguments[i];
+    if (argument is FunctionType && argument.typeParameters.length > 0) {
+      // Generic function types aren't allowed as type arguments either.
+      result ??= <TypeArgumentIssue>[];
+      result.add(new TypeArgumentIssue(argument, variables[i], type));
+    } else if (!typeEnvironment.isSubtypeOf(
+        argument, substitute(variables[i].bound, substitutionMap))) {
+      result ??= <TypeArgumentIssue>[];
+      result.add(new TypeArgumentIssue(argument, variables[i], type));
+    }
+
+    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+        argument, typeEnvironment,
+        allowSuperBounded: true);
+    if (issues != null) {
+      argumentsResult ??= <TypeArgumentIssue>[];
+      argumentsResult.addAll(issues);
+    }
+  }
+  if (argumentsResult != null) {
+    result ??= <TypeArgumentIssue>[];
+    result.addAll(argumentsResult);
+  }
+  if (typedefRhsResult != null) {
+    result ??= <TypeArgumentIssue>[];
+    result.addAll(typedefRhsResult);
+  }
+
+  // [type] is regular-bounded.
+  if (result == null) return null;
+  if (!allowSuperBounded) return result;
+
+  result = null;
+  type = convertSuperBoundedToRegularBounded(typeEnvironment, type);
+  List<DartType> argumentsToReport = arguments.toList();
+  if (type is InterfaceType) {
+    variables = type.classNode.typeParameters;
+    arguments = type.typeArguments;
+  } else if (type is TypedefType) {
+    variables = type.typedefNode.typeParameters;
+    arguments = type.typeArguments;
+  }
+  substitutionMap =
+      new Map<TypeParameter, DartType>.fromIterables(variables, arguments);
+  for (int i = 0; i < arguments.length; ++i) {
+    DartType argument = arguments[i];
+    if (argument is FunctionType && argument.typeParameters.length > 0) {
+      // Generic function types aren't allowed as type arguments either.
+      result ??= <TypeArgumentIssue>[];
+      result
+          .add(new TypeArgumentIssue(argumentsToReport[i], variables[i], type));
+    } else if (!typeEnvironment.isSubtypeOf(
+        argument, substitute(variables[i].bound, substitutionMap))) {
+      result ??= <TypeArgumentIssue>[];
+      result
+          .add(new TypeArgumentIssue(argumentsToReport[i], variables[i], type));
+    }
+  }
+  if (argumentsResult != null) {
+    result ??= <TypeArgumentIssue>[];
+    result.addAll(argumentsResult);
+  }
+  if (typedefRhsResult != null) {
+    result ??= <TypeArgumentIssue>[];
+    result.addAll(typedefRhsResult);
+  }
+  return result;
+}
+
+// TODO(dmitryas):  Remove [typedefInstantiations] when type arguments passed to
+// typedefs are preserved in the Kernel output.
+List<TypeArgumentIssue> findTypeArgumentIssuesForInvocation(
+    List<TypeParameter> parameters,
+    List<DartType> arguments,
+    TypeEnvironment typeEnvironment,
+    {Map<FunctionType, List<DartType>> typedefInstantiations}) {
+  assert(arguments.length == parameters.length);
+  List<TypeArgumentIssue> result;
+  var substitutionMap = <TypeParameter, DartType>{};
+  for (int i = 0; i < arguments.length; ++i) {
+    substitutionMap[parameters[i]] = arguments[i];
+  }
+  for (int i = 0; i < arguments.length; ++i) {
+    DartType argument = arguments[i];
+    if (argument is FunctionType && argument.typeParameters.length > 0) {
+      // Generic function types aren't allowed as type arguments either.
+      result ??= <TypeArgumentIssue>[];
+      result.add(new TypeArgumentIssue(argument, parameters[i], null));
+    } else if (!typeEnvironment.isSubtypeOf(
+        argument, substitute(parameters[i].bound, substitutionMap))) {
+      result ??= <TypeArgumentIssue>[];
+      result.add(new TypeArgumentIssue(argument, parameters[i], null));
+    }
+
+    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+        argument, typeEnvironment,
+        allowSuperBounded: true);
+    if (issues != null) {
+      result ??= <TypeArgumentIssue>[];
+      result.addAll(issues);
+    }
+  }
+  return result;
+}
+
+String getGenericTypeName(DartType type) {
+  if (type is InterfaceType) {
+    return type.classNode.name;
+  } else if (type is TypedefType) {
+    return type.typedefNode.name;
+  }
+  return type.toString();
+}
+
+/// Replaces all covariant occurrences of `dynamic`, `Object`, and `void` with
+/// [BottomType] and all contravariant occurrences of `Null` and [BottomType]
+/// with `Object`.
+DartType convertSuperBoundedToRegularBounded(
+    TypeEnvironment typeEnvironment, DartType type,
+    {bool isCovariant = true}) {
+  if ((type is DynamicType ||
+          type is VoidType ||
+          isObject(typeEnvironment, type)) &&
+      isCovariant) {
+    return const BottomType();
+  } else if ((type is BottomType || isNull(typeEnvironment, type)) &&
+      !isCovariant) {
+    return typeEnvironment.objectType;
+  } else if (type is InterfaceType && type.classNode.typeParameters != null) {
+    List<DartType> replacedTypeArguments =
+        new List<DartType>(type.typeArguments.length);
+    for (int i = 0; i < replacedTypeArguments.length; i++) {
+      replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
+          typeEnvironment, type.typeArguments[i],
+          isCovariant: isCovariant);
+    }
+    return new InterfaceType(type.classNode, replacedTypeArguments);
+  } else if (type is TypedefType && type.typedefNode.typeParameters != null) {
+    List<DartType> replacedTypeArguments =
+        new List<DartType>(type.typeArguments.length);
+    for (int i = 0; i < replacedTypeArguments.length; i++) {
+      replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
+          typeEnvironment, type.typeArguments[i],
+          isCovariant: isCovariant);
+    }
+    return new TypedefType(type.typedefNode, replacedTypeArguments);
+  } else if (type is FunctionType) {
+    var replacedReturnType = convertSuperBoundedToRegularBounded(
+        typeEnvironment, type.returnType,
+        isCovariant: isCovariant);
+    var replacedPositionalParameters =
+        new List<DartType>(type.positionalParameters.length);
+    for (int i = 0; i < replacedPositionalParameters.length; i++) {
+      replacedPositionalParameters[i] = convertSuperBoundedToRegularBounded(
+          typeEnvironment, type.positionalParameters[i],
+          isCovariant: !isCovariant);
+    }
+    var replacedNamedParameters =
+        new List<NamedType>(type.namedParameters.length);
+    for (int i = 0; i < replacedNamedParameters.length; i++) {
+      replacedNamedParameters[i] = new NamedType(
+          type.namedParameters[i].name,
+          convertSuperBoundedToRegularBounded(
+              typeEnvironment, type.namedParameters[i].type,
+              isCovariant: !isCovariant));
+    }
+    return new FunctionType(replacedPositionalParameters, replacedReturnType,
+        namedParameters: replacedNamedParameters,
+        typeParameters: type.typeParameters,
+        requiredParameterCount: type.requiredParameterCount,
+        typedefType: type.typedefType);
+  }
+  return type;
+}
+
+bool isObject(TypeEnvironment typeEnvironment, DartType type) {
+  return type is InterfaceType &&
+      type.classNode == typeEnvironment.objectType.classNode;
+}
+
+bool isNull(TypeEnvironment typeEnvironment, DartType type) {
+  return type is InterfaceType &&
+      type.classNode == typeEnvironment.nullType.classNode;
+}
diff --git a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
new file mode 100644
index 0000000..beae19b
--- /dev/null
+++ b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.hierarchy_based_type_environment;
+
+import '../ast.dart' show Class, InterfaceType;
+
+import '../class_hierarchy.dart' show ClassHierarchy;
+
+import '../core_types.dart' show CoreTypes;
+
+import '../type_environment.dart' show TypeEnvironment;
+
+class HierarchyBasedTypeEnvironment extends TypeEnvironment {
+  final ClassHierarchy hierarchy;
+
+  HierarchyBasedTypeEnvironment(CoreTypes coreTypes, this.hierarchy,
+      {bool legacyMode: false})
+      : super.fromSubclass(coreTypes, legacyMode: legacyMode);
+
+  @override
+  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass) {
+    return hierarchy.getTypeAsInstanceOf(type, superclass);
+  }
+}
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index c540910..007fc9e 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -14,15 +14,12 @@
   final bool legacyMode;
   final bool treeShake;
 
-  /// Whether `async` functions start synchronously.
-  final bool syncAsync;
   final List<ProgramRoot> programRoots;
   final Uri kernelRuntime;
 
   TargetFlags(
       {this.legacyMode: false,
       this.treeShake: false,
-      this.syncAsync: false,
       this.programRoots: const <ProgramRoot>[],
       this.kernelRuntime});
 }
@@ -61,13 +58,6 @@
 
   bool get legacyMode;
 
-  /// A derived class may change this to `true` to disable type inference and
-  /// type promotion phases of analysis.
-  ///
-  /// This is intended for profiling, to ensure that type inference and type
-  /// promotion do not slow down compilation too much.
-  bool get disableTypeInference => false;
-
   /// A derived class may change this to `true` to enable forwarders to
   /// user-defined `noSuchMethod` that are generated for each abstract member
   /// if such `noSuchMethod` is present.
@@ -158,6 +148,12 @@
   /// `Math.pow(2, 53) = Math.pow(2, 53) + 1`.
   bool get errorOnUnexactWebIntLiterals => false;
 
+  /// Whether set literals are natively supported by this target. If set
+  /// literals are not supported by the target, they will be desugared into
+  /// explicit `Set` creation (for non-const set literals) or wrapped map
+  /// literals (for const set literals).
+  bool get supportsSetLiterals => false;
+
   /// Builds an expression that instantiates an [Invocation] that can be passed
   /// to [noSuchMethod].
   Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index a756595..2f74c96 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -413,6 +413,9 @@
     writeSpaced('=');
     inner.writeMemberReferenceFromReference(component.mainMethodName);
     endLine(';');
+    if (showMetadata) {
+      inner.writeMetadata(component);
+    }
     for (var library in component.libraries) {
       if (library.isExternal) {
         if (!showExternal) {
@@ -1261,6 +1264,21 @@
     writeSymbol(']');
   }
 
+  visitSetLiteral(SetLiteral node) {
+    if (node.isConst) {
+      writeWord('const');
+      writeSpace();
+    }
+    if (node.typeArgument != null) {
+      writeSymbol('<');
+      writeType(node.typeArgument);
+      writeSymbol('>');
+    }
+    writeSymbol('{');
+    writeList(node.expressions, writeNode);
+    writeSymbol('}');
+  }
+
   visitMapLiteral(MapLiteral node) {
     if (node.isConst) {
       writeWord('const');
@@ -1345,10 +1363,10 @@
     writeIndentation();
     writeWord(node.isImport ? 'import' : 'export');
     var uriString;
-    if (node.importedLibraryReference.node != null) {
+    if (node.importedLibraryReference?.node != null) {
       uriString = '${node.targetLibrary.importUri}';
     } else {
-      uriString = '${node.importedLibraryReference.canonicalName.name}';
+      uriString = '${node.importedLibraryReference?.canonicalName?.name}';
     }
     writeWord('"$uriString"');
     if (node.isDeferred) {
@@ -1893,6 +1911,24 @@
     endLine(sb.toString());
   }
 
+  visitEnvironmentBoolConstant(EnvironmentBoolConstant node) {
+    final String name = syntheticNames.nameConstant(node);
+    final String defaultValue = syntheticNames.nameConstant(node.defaultValue);
+    endLine('  $name = bool.fromEnvironment(${node.name}, ${defaultValue})');
+  }
+
+  visitEnvironmentIntConstant(EnvironmentIntConstant node) {
+    final String name = syntheticNames.nameConstant(node);
+    final String defaultValue = syntheticNames.nameConstant(node.defaultValue);
+    endLine('  $name = int.fromEnvironment(${node.name}, ${defaultValue})');
+  }
+
+  visitEnvironmentStringConstant(EnvironmentStringConstant node) {
+    final String name = syntheticNames.nameConstant(node);
+    final String defaultValue = syntheticNames.nameConstant(node.defaultValue);
+    endLine('  $name = String.fromEnvironment(${node.name}, ${defaultValue})');
+  }
+
   defaultNode(Node node) {
     write('<${node.runtimeType}>');
   }
@@ -1970,6 +2006,7 @@
   int visitRethrow(Rethrow node) => PRIMARY;
   int visitThrow(Throw node) => EXPRESSION;
   int visitListLiteral(ListLiteral node) => PRIMARY;
+  int visitSetLiteral(SetLiteral node) => PRIMARY;
   int visitMapLiteral(MapLiteral node) => PRIMARY;
   int visitAwaitExpression(AwaitExpression node) => PREFIX;
   int visitFunctionExpression(FunctionExpression node) => EXPRESSION;
diff --git a/pkg/kernel/lib/text/serializer_combinators.dart b/pkg/kernel/lib/text/serializer_combinators.dart
new file mode 100644
index 0000000..4b34e70
--- /dev/null
+++ b/pkg/kernel/lib/text/serializer_combinators.dart
@@ -0,0 +1,415 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.serializer_combinators;
+
+import 'dart:convert' show json;
+
+import '../ast.dart' show Node;
+import 'text_serializer.dart' show Tagger;
+
+class DeserializationEnvironment<T extends Node> {
+  final Map<String, T> locals = <String, T>{};
+
+  final DeserializationEnvironment<T> parent;
+
+  final Set<String> usedNames = new Set<String>();
+
+  DeserializationEnvironment(this.parent) {
+    if (parent != null) {
+      usedNames.addAll(parent.usedNames);
+    }
+  }
+
+  T lookup(String name) => locals[name] ?? parent?.lookup(name);
+
+  T add(String name, T node) {
+    if (usedNames.contains(name)) {
+      throw StateError("name '$name' is already declared in this scope");
+    }
+    usedNames.add(name);
+    return locals[name] = node;
+  }
+}
+
+class SerializationEnvironment<T extends Node> {
+  final Map<T, String> locals = new Map<T, String>.identity();
+
+  int nameCount;
+
+  final SerializationEnvironment<T> parent;
+
+  static const String separator = "^";
+
+  static final int codeOfZero = "0".codeUnitAt(0);
+
+  static final int codeOfNine = "9".codeUnitAt(0);
+
+  SerializationEnvironment(this.parent) {
+    nameCount = (parent?.nameCount ?? 0);
+  }
+
+  String lookup(T node) => locals[node] ?? parent?.lookup(node);
+
+  String add(T node, String name) {
+    int prefixLength = name.length - 1;
+    bool isOnlyDigits = true;
+    while (prefixLength >= 0 && name[prefixLength] != separator) {
+      int code = name.codeUnitAt(prefixLength);
+      isOnlyDigits = isOnlyDigits && (codeOfZero <= code && code <= codeOfNine);
+      --prefixLength;
+    }
+    if (prefixLength < 0 || !isOnlyDigits) {
+      prefixLength = name.length;
+    }
+    String prefix = name.substring(0, prefixLength);
+    return locals[node] = "$prefix$separator${nameCount++}";
+  }
+}
+
+abstract class TextSerializer<T> {
+  const TextSerializer();
+
+  T readFrom(Iterator<Object> stream, DeserializationEnvironment environment);
+  void writeTo(
+      StringBuffer buffer, T object, SerializationEnvironment environment);
+
+  /// True if this serializer/deserializer writes/reads nothing.  This is true
+  /// for the serializer [Nothing] and also some serializers derived from it.
+  bool get isEmpty => false;
+}
+
+class Nothing extends TextSerializer<void> {
+  const Nothing();
+
+  void readFrom(Iterator<Object> stream, DeserializationEnvironment _) {}
+
+  void writeTo(StringBuffer buffer, void ignored, SerializationEnvironment _) {}
+
+  bool get isEmpty => true;
+}
+
+class DartString extends TextSerializer<String> {
+  const DartString();
+
+  String readFrom(Iterator<Object> stream, DeserializationEnvironment _) {
+    if (stream.current is! String) {
+      throw StateError("expected an atom, found a list");
+    }
+    String result = json.decode(stream.current);
+    stream.moveNext();
+    return result;
+  }
+
+  void writeTo(StringBuffer buffer, String object, SerializationEnvironment _) {
+    buffer.write(json.encode(object));
+  }
+}
+
+class DartInt extends TextSerializer<int> {
+  const DartInt();
+
+  int readFrom(Iterator<Object> stream, DeserializationEnvironment _) {
+    if (stream.current is! String) {
+      throw StateError("expected an atom, found a list");
+    }
+    int result = int.parse(stream.current);
+    stream.moveNext();
+    return result;
+  }
+
+  void writeTo(StringBuffer buffer, int object, SerializationEnvironment _) {
+    buffer.write(object);
+  }
+}
+
+class DartDouble extends TextSerializer<double> {
+  const DartDouble();
+
+  double readFrom(Iterator<Object> stream, DeserializationEnvironment _) {
+    if (stream.current is! String) {
+      throw StateError("expected an atom, found a list");
+    }
+    double result = double.parse(stream.current);
+    stream.moveNext();
+    return result;
+  }
+
+  void writeTo(StringBuffer buffer, double object, SerializationEnvironment _) {
+    buffer.write(object);
+  }
+}
+
+class DartBool extends TextSerializer<bool> {
+  const DartBool();
+
+  bool readFrom(Iterator<Object> stream, DeserializationEnvironment _) {
+    if (stream.current is! String) {
+      throw StateError("expected an atom, found a list");
+    }
+    bool result;
+    if (stream.current == "true") {
+      result = true;
+    } else if (stream.current == "false") {
+      result = false;
+    } else {
+      throw StateError("expected 'true' or 'false', found '${stream.current}'");
+    }
+    stream.moveNext();
+    return result;
+  }
+
+  void writeTo(StringBuffer buffer, bool object, SerializationEnvironment _) {
+    buffer.write(object ? 'true' : 'false');
+  }
+}
+
+// == Serializers for tagged (disjoint) unions.
+//
+// They require a function mapping serializables to a tag string.  This is
+// implemented by Tagger visitors.
+// A tagged union of serializer/deserializers.
+class Case<T extends Node> extends TextSerializer<T> {
+  final Tagger<T> tagger;
+  final List<String> tags;
+  final List<TextSerializer<T>> serializers;
+
+  Case(this.tagger, this.tags, this.serializers);
+
+  Case.uninitialized(this.tagger)
+      : tags = [],
+        serializers = [];
+
+  T readFrom(Iterator<Object> stream, DeserializationEnvironment environment) {
+    if (stream.current is! Iterator) {
+      throw StateError("expected list, found atom");
+    }
+    Iterator nested = stream.current;
+    nested.moveNext();
+    if (nested.current is! String) {
+      throw StateError("expected atom, found list");
+    }
+    String tag = nested.current;
+    for (int i = 0; i < tags.length; ++i) {
+      if (tags[i] == tag) {
+        nested.moveNext();
+        T result = serializers[i].readFrom(nested, environment);
+        if (nested.moveNext()) {
+          throw StateError("extra cruft in tagged '${tag}'");
+        }
+        stream.moveNext();
+        return result;
+      }
+    }
+    throw StateError("unrecognized tag '${tag}'");
+  }
+
+  void writeTo(
+      StringBuffer buffer, T object, SerializationEnvironment environment) {
+    String tag = tagger.tag(object);
+    for (int i = 0; i < tags.length; ++i) {
+      if (tags[i] == tag) {
+        buffer.write("(${tag}");
+        if (!serializers[i].isEmpty) {
+          buffer.write(" ");
+        }
+        serializers[i].writeTo(buffer, object, environment);
+        buffer.write(")");
+        return;
+      }
+    }
+    throw StateError("unrecognized tag '${tag}");
+  }
+}
+
+// A serializer/deserializer that unwraps/wraps nodes before serialization and
+// after deserialization.
+class Wrapped<S, K> extends TextSerializer<K> {
+  final S Function(K) unwrap;
+  final K Function(S) wrap;
+  final TextSerializer<S> contents;
+
+  Wrapped(this.unwrap, this.wrap, this.contents);
+
+  K readFrom(Iterator<Object> stream, DeserializationEnvironment environment) {
+    return wrap(contents.readFrom(stream, environment));
+  }
+
+  void writeTo(
+      StringBuffer buffer, K object, SerializationEnvironment environment) {
+    contents.writeTo(buffer, unwrap(object), environment);
+  }
+
+  bool get isEmpty => contents.isEmpty;
+}
+
+class ScopedReference<T extends Node> extends TextSerializer<T> {
+  final DartString stringSerializer = const DartString();
+
+  const ScopedReference();
+
+  T readFrom(Iterator<Object> stream, DeserializationEnvironment environment) {
+    return environment.lookup(stringSerializer.readFrom(stream, null));
+  }
+
+  void writeTo(
+      StringBuffer buffer, T object, SerializationEnvironment environment) {
+    stringSerializer.writeTo(buffer, environment.lookup(object), null);
+  }
+}
+
+// A serializer/deserializer for pairs.
+class Tuple2Serializer<T1, T2> extends TextSerializer<Tuple2<T1, T2>> {
+  final TextSerializer<T1> first;
+  final TextSerializer<T2> second;
+
+  const Tuple2Serializer(this.first, this.second);
+
+  Tuple2<T1, T2> readFrom(
+      Iterator<Object> stream, DeserializationEnvironment environment) {
+    return new Tuple2(first.readFrom(stream, environment),
+        second.readFrom(stream, environment));
+  }
+
+  void writeTo(StringBuffer buffer, Tuple2<T1, T2> object,
+      SerializationEnvironment environment) {
+    first.writeTo(buffer, object.first, environment);
+    buffer.write(' ');
+    second.writeTo(buffer, object.second, environment);
+  }
+}
+
+class Tuple2<T1, T2> {
+  final T1 first;
+  final T2 second;
+
+  const Tuple2(this.first, this.second);
+}
+
+class Tuple3Serializer<T1, T2, T3> extends TextSerializer<Tuple3<T1, T2, T3>> {
+  final TextSerializer<T1> first;
+  final TextSerializer<T2> second;
+  final TextSerializer<T3> third;
+
+  const Tuple3Serializer(this.first, this.second, this.third);
+
+  Tuple3<T1, T2, T3> readFrom(
+      Iterator<Object> stream, DeserializationEnvironment environment) {
+    return new Tuple3(
+        first.readFrom(stream, environment),
+        second.readFrom(stream, environment),
+        third.readFrom(stream, environment));
+  }
+
+  void writeTo(StringBuffer buffer, Tuple3<T1, T2, T3> object,
+      SerializationEnvironment environment) {
+    first.writeTo(buffer, object.first, environment);
+    buffer.write(' ');
+    second.writeTo(buffer, object.second, environment);
+    buffer.write(' ');
+    third.writeTo(buffer, object.third, environment);
+  }
+}
+
+class Tuple3<T1, T2, T3> {
+  final T1 first;
+  final T2 second;
+  final T3 third;
+
+  const Tuple3(this.first, this.second, this.third);
+}
+
+class Tuple4Serializer<T1, T2, T3, T4>
+    extends TextSerializer<Tuple4<T1, T2, T3, T4>> {
+  final TextSerializer<T1> first;
+  final TextSerializer<T2> second;
+  final TextSerializer<T3> third;
+  final TextSerializer<T4> fourth;
+
+  const Tuple4Serializer(this.first, this.second, this.third, this.fourth);
+
+  Tuple4<T1, T2, T3, T4> readFrom(
+      Iterator<Object> stream, DeserializationEnvironment environment) {
+    return new Tuple4(
+        first.readFrom(stream, environment),
+        second.readFrom(stream, environment),
+        third.readFrom(stream, environment),
+        fourth.readFrom(stream, environment));
+  }
+
+  void writeTo(StringBuffer buffer, Tuple4<T1, T2, T3, T4> object,
+      SerializationEnvironment environment) {
+    first.writeTo(buffer, object.first, environment);
+    buffer.write(' ');
+    second.writeTo(buffer, object.second, environment);
+    buffer.write(' ');
+    third.writeTo(buffer, object.third, environment);
+    buffer.write(' ');
+    fourth.writeTo(buffer, object.fourth, environment);
+  }
+}
+
+class Tuple4<T1, T2, T3, T4> {
+  final T1 first;
+  final T2 second;
+  final T3 third;
+  final T4 fourth;
+
+  const Tuple4(this.first, this.second, this.third, this.fourth);
+}
+
+// A serializer/deserializer for lists.
+class ListSerializer<T> extends TextSerializer<List<T>> {
+  final TextSerializer<T> elements;
+
+  const ListSerializer(this.elements);
+
+  List<T> readFrom(
+      Iterator<Object> stream, DeserializationEnvironment environment) {
+    if (stream.current is! Iterator) {
+      throw StateError("expected a list, found an atom");
+    }
+    Iterator<Object> list = stream.current;
+    list.moveNext();
+    List<T> result = [];
+    while (list.current != null) {
+      result.add(elements.readFrom(list, environment));
+    }
+    stream.moveNext();
+    return result;
+  }
+
+  void writeTo(StringBuffer buffer, List<T> object,
+      SerializationEnvironment environment) {
+    buffer.write('(');
+    for (int i = 0; i < object.length; ++i) {
+      if (i != 0) buffer.write(' ');
+      elements.writeTo(buffer, object[i], environment);
+    }
+    buffer.write(')');
+  }
+}
+
+class Optional<T> extends TextSerializer<T> {
+  final TextSerializer<T> contents;
+
+  const Optional(this.contents);
+
+  T readFrom(Iterator<Object> stream, DeserializationEnvironment environment) {
+    if (stream.current == '_') {
+      stream.moveNext();
+      return null;
+    }
+    return contents.readFrom(stream, environment);
+  }
+
+  void writeTo(
+      StringBuffer buffer, T object, SerializationEnvironment environment) {
+    if (object == null) {
+      buffer.write('_');
+    } else {
+      contents.writeTo(buffer, object, environment);
+    }
+  }
+}
diff --git a/pkg/kernel/lib/text/text_reader.dart b/pkg/kernel/lib/text/text_reader.dart
new file mode 100644
index 0000000..e066fde
--- /dev/null
+++ b/pkg/kernel/lib/text/text_reader.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.text_reader;
+
+// S-expressions
+//
+// An S-expression is an atom or an S-list, an atom is a string that does not
+// contain the delimiters '(', ')', or ' ', and an S-list is a space delimited
+// sequence of S-expressions enclosed in parentheses:
+//
+// <S-expression> ::= <Atom>
+//                  | <S-list>
+// <S-list>       ::= '(' ')'
+//                  | '(' <S-expression> {' ' <S-expression>}* ')'
+//
+// We use an iterator to read S-expressions.  The iterator produces a stream
+// of atoms (strings) and nested iterators (S-lists).
+class TextIterator implements Iterator<Object /* String | TextIterator */ > {
+  static int space = ' '.codeUnitAt(0);
+  static int lparen = '('.codeUnitAt(0);
+  static int rparen = ')'.codeUnitAt(0);
+  static int dquote = '"'.codeUnitAt(0);
+  static int bslash = '\\'.codeUnitAt(0);
+
+  final String input;
+  int index;
+
+  TextIterator(this.input, this.index);
+
+  // Consume spaces.
+  void skipWhitespace() {
+    while (index < input.length && input.codeUnitAt(index) == space) {
+      ++index;
+    }
+  }
+
+  // Consume the rest of a nested S-expression and the closing delimiter.
+  void skipToEndOfNested() {
+    if (current is TextIterator) {
+      TextIterator it = current;
+      while (it.moveNext());
+      index = it.index + 1;
+    }
+  }
+
+  void skipToEndOfAtom() {
+    bool isQuoted = false;
+    if (index < input.length && input.codeUnitAt(index) == dquote) {
+      ++index;
+      isQuoted = true;
+    }
+    do {
+      if (index >= input.length) return;
+      int codeUnit = input.codeUnitAt(index);
+      if (isQuoted) {
+        // Terminator.
+        if (codeUnit == dquote) {
+          ++index;
+          return;
+        }
+        // Escaped double quote.
+        if (codeUnit == bslash &&
+            index < input.length + 1 &&
+            input.codeUnitAt(index + 1) == dquote) {
+          index += 2;
+        } else {
+          ++index;
+        }
+      } else {
+        // Terminator.
+        if (codeUnit == space || codeUnit == rparen) return;
+        ++index;
+      }
+    } while (true);
+  }
+
+  @override
+  Object current = null;
+
+  @override
+  bool moveNext() {
+    skipToEndOfNested();
+    skipWhitespace();
+    if (index >= input.length || input.codeUnitAt(index) == rparen) {
+      current = null;
+      return false;
+    }
+    if (input.codeUnitAt(index) == lparen) {
+      current = new TextIterator(input, index + 1);
+      return true;
+    }
+    int start = index;
+    skipToEndOfAtom();
+    current = input.substring(start, index);
+    return true;
+  }
+}
diff --git a/pkg/kernel/lib/text/text_serialization_verifier.dart b/pkg/kernel/lib/text/text_serialization_verifier.dart
new file mode 100644
index 0000000..644f15a
--- /dev/null
+++ b/pkg/kernel/lib/text/text_serialization_verifier.dart
@@ -0,0 +1,993 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../ast.dart';
+
+import '../text/serializer_combinators.dart' show TextSerializer;
+
+import '../text/text_reader.dart' show TextIterator;
+
+import '../text/text_serializer.dart'
+    show dartTypeSerializer, expressionSerializer, initializeSerializers;
+
+import '../visitor.dart' show Visitor;
+
+const Uri noUri = null;
+
+const int noOffset = -1;
+
+abstract class TextSerializationVerificationFailure {
+  /// [Uri] of the file containing the expression that produced an error during
+  /// the round trip.
+  final Uri uri;
+
+  /// Offset within the file with [uri] of the expression that produced an error
+  /// during the round trip.
+  final int offset;
+
+  TextSerializationVerificationFailure(this.uri, this.offset);
+}
+
+class TextSerializationFailure extends TextSerializationVerificationFailure {
+  final String message;
+
+  TextSerializationFailure(this.message, Uri uri, int offset)
+      : super(uri, offset);
+}
+
+class TextDeserializationFailure extends TextSerializationVerificationFailure {
+  final String message;
+
+  TextDeserializationFailure(this.message, Uri uri, int offset)
+      : super(uri, offset);
+}
+
+class TextRoundTripFailure extends TextSerializationVerificationFailure {
+  final String initial;
+  final String serialized;
+
+  TextRoundTripFailure(this.initial, this.serialized, Uri uri, int offset)
+      : super(uri, offset);
+}
+
+class TextSerializationVerifier implements Visitor<void> {
+  /// List of errors produced during round trips on the visited nodes.
+  final List<TextSerializationVerificationFailure> failures =
+      <TextSerializationVerificationFailure>[];
+
+  Uri lastSeenUri = noUri;
+
+  int lastSeenOffset = noOffset;
+
+  TextSerializationVerifier() {
+    initializeSerializers();
+  }
+
+  void storeLastSeenUriAndOffset(Node node) {
+    if (node is TreeNode) {
+      Location location = node.location;
+      if (location != null) {
+        lastSeenUri = location.file;
+        lastSeenOffset = node.fileOffset;
+      }
+    }
+  }
+
+  T readNode<T extends Node>(
+      String input, TextSerializer<T> serializer, Uri uri, int offset) {
+    TextIterator stream = new TextIterator(input, 0);
+    stream.moveNext();
+    T result;
+    try {
+      result = serializer.readFrom(stream, null);
+    } catch (exception) {
+      failures.add(
+          new TextDeserializationFailure(exception.toString(), uri, offset));
+    }
+    if (stream.moveNext()) {
+      failures.add(new TextDeserializationFailure(
+          "unexpected trailing text", uri, offset));
+    }
+    return result;
+  }
+
+  String writeNode<T extends Node>(
+      T node, TextSerializer<T> serializer, Uri uri, int offset) {
+    StringBuffer buffer = new StringBuffer();
+    try {
+      serializer.writeTo(buffer, node, null);
+    } catch (exception) {
+      failures
+          .add(new TextSerializationFailure(exception.toString(), uri, offset));
+    }
+    return buffer.toString();
+  }
+
+  void makeExpressionRoundTrip(Expression node) {
+    Uri uri = noUri;
+    int offset = noOffset;
+    Location location = node.location;
+    if (location != null) {
+      uri = location.file;
+      offset = node.fileOffset;
+    }
+
+    String initial = writeNode(node, expressionSerializer, uri, offset);
+
+    // Do the round trip.
+    Expression deserialized =
+        readNode(initial, expressionSerializer, uri, offset);
+    String serialized =
+        writeNode(deserialized, expressionSerializer, uri, offset);
+
+    if (initial != serialized) {
+      failures.add(new TextRoundTripFailure(initial, serialized, uri, offset));
+    }
+  }
+
+  void makeDartTypeRoundTrip(DartType node) {
+    Uri uri = lastSeenUri;
+    int offset = lastSeenOffset;
+
+    String initial = writeNode(node, dartTypeSerializer, uri, offset);
+
+    // Do the round trip.
+    DartType deserialized = readNode(initial, dartTypeSerializer, uri, offset);
+    String serialized =
+        writeNode(deserialized, dartTypeSerializer, uri, offset);
+
+    if (initial != serialized) {
+      failures.add(new TextRoundTripFailure(initial, serialized, uri, offset));
+    }
+  }
+
+  @override
+  void defaultExpression(Expression node) {
+    throw new UnsupportedError("defaultExpression");
+  }
+
+  @override
+  void defaultMemberReference(Member node) {
+    throw new UnsupportedError("defaultMemberReference");
+  }
+
+  @override
+  void defaultConstantReference(Constant node) {
+    throw new UnsupportedError("defaultConstantReference");
+  }
+
+  @override
+  void defaultConstant(Constant node) {
+    throw new UnsupportedError("defaultConstant");
+  }
+
+  @override
+  void defaultDartType(DartType node) {
+    throw new UnsupportedError("defaultDartType");
+  }
+
+  @override
+  void defaultTreeNode(TreeNode node) {
+    throw new UnsupportedError("defaultTreeNode");
+  }
+
+  @override
+  void defaultNode(Node node) {
+    throw new UnsupportedError("defaultNode");
+  }
+
+  @override
+  void defaultInitializer(Initializer node) {
+    throw new UnsupportedError("defaultInitializer");
+  }
+
+  @override
+  void defaultMember(Member node) {
+    throw new UnsupportedError("defaultMember");
+  }
+
+  @override
+  void defaultStatement(Statement node) {
+    throw new UnsupportedError("defaultStatement");
+  }
+
+  @override
+  void defaultBasicLiteral(BasicLiteral node) {
+    throw new UnsupportedError("defaultBasicLiteral");
+  }
+
+  @override
+  void visitNamedType(NamedType node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSupertype(Supertype node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitName(Name node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitRedirectingFactoryConstructorReference(
+      RedirectingFactoryConstructor node) {}
+
+  @override
+  void visitProcedureReference(Procedure node) {}
+
+  @override
+  void visitConstructorReference(Constructor node) {}
+
+  @override
+  void visitFieldReference(Field node) {}
+
+  @override
+  void visitTypeLiteralConstantReference(TypeLiteralConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitTearOffConstantReference(TearOffConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitPartialInstantiationConstantReference(
+      PartialInstantiationConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitInstanceConstantReference(InstanceConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitListConstantReference(ListConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitMapConstantReference(MapConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSymbolConstantReference(SymbolConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitStringConstantReference(StringConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitDoubleConstantReference(DoubleConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitIntConstantReference(IntConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitBoolConstantReference(BoolConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitNullConstantReference(NullConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitEnvironmentBoolConstantReference(EnvironmentBoolConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitEnvironmentIntConstantReference(EnvironmentIntConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitEnvironmentStringConstantReference(EnvironmentStringConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitUnevaluatedConstantReference(UnevaluatedConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitTypedefReference(Typedef node) {}
+
+  @override
+  void visitClassReference(Class node) {}
+
+  @override
+  void visitTypeLiteralConstant(TypeLiteralConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitTearOffConstant(TearOffConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitPartialInstantiationConstant(PartialInstantiationConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitInstanceConstant(InstanceConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitListConstant(ListConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitMapConstant(MapConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSymbolConstant(SymbolConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitStringConstant(StringConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitDoubleConstant(DoubleConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitIntConstant(IntConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitBoolConstant(BoolConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitNullConstant(NullConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitEnvironmentBoolConstant(EnvironmentBoolConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitEnvironmentIntConstant(EnvironmentIntConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitEnvironmentStringConstant(EnvironmentStringConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitUnevaluatedConstant(UnevaluatedConstant node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitTypedefType(TypedefType node) {
+    storeLastSeenUriAndOffset(node);
+    makeDartTypeRoundTrip(node);
+  }
+
+  @override
+  void visitTypeParameterType(TypeParameterType node) {
+    storeLastSeenUriAndOffset(node);
+    makeDartTypeRoundTrip(node);
+  }
+
+  @override
+  void visitFunctionType(FunctionType node) {
+    storeLastSeenUriAndOffset(node);
+    makeDartTypeRoundTrip(node);
+  }
+
+  @override
+  void visitInterfaceType(InterfaceType node) {
+    storeLastSeenUriAndOffset(node);
+    makeDartTypeRoundTrip(node);
+  }
+
+  @override
+  void visitBottomType(BottomType node) {
+    storeLastSeenUriAndOffset(node);
+    makeDartTypeRoundTrip(node);
+  }
+
+  @override
+  void visitVoidType(VoidType node) {
+    storeLastSeenUriAndOffset(node);
+    makeDartTypeRoundTrip(node);
+  }
+
+  @override
+  void visitDynamicType(DynamicType node) {
+    storeLastSeenUriAndOffset(node);
+    makeDartTypeRoundTrip(node);
+  }
+
+  @override
+  void visitInvalidType(InvalidType node) {
+    storeLastSeenUriAndOffset(node);
+    makeDartTypeRoundTrip(node);
+  }
+
+  @override
+  void visitComponent(Component node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitMapEntry(MapEntry node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitCatch(Catch node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSwitchCase(SwitchCase node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitNamedExpression(NamedExpression node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitArguments(Arguments node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitFunctionNode(FunctionNode node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitTypeParameter(TypeParameter node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitTypedef(Typedef node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitLibraryPart(LibraryPart node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitCombinator(Combinator node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitLibraryDependency(LibraryDependency node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitLibrary(Library node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitAssertInitializer(AssertInitializer node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitLocalInitializer(LocalInitializer node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitRedirectingInitializer(RedirectingInitializer node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSuperInitializer(SuperInitializer node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitFieldInitializer(FieldInitializer node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitInvalidInitializer(InvalidInitializer node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitClass(Class node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitRedirectingFactoryConstructor(RedirectingFactoryConstructor node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitField(Field node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitProcedure(Procedure node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitConstructor(Constructor node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitFunctionDeclaration(FunctionDeclaration node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitVariableDeclaration(VariableDeclaration node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitYieldStatement(YieldStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitTryFinally(TryFinally node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitTryCatch(TryCatch node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitReturnStatement(ReturnStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitIfStatement(IfStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitContinueSwitchStatement(ContinueSwitchStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitSwitchStatement(SwitchStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitForInStatement(ForInStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitForStatement(ForStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitDoStatement(DoStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitWhileStatement(WhileStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitBreakStatement(BreakStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitLabeledStatement(LabeledStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitAssertStatement(AssertStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitEmptyStatement(EmptyStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitAssertBlock(AssertBlock node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitBlock(Block node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitExpressionStatement(ExpressionStatement node) {
+    storeLastSeenUriAndOffset(node);
+    node.visitChildren(this);
+  }
+
+  @override
+  void visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitLoadLibrary(LoadLibrary node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitInstantiation(Instantiation node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitLet(Let node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitNullLiteral(NullLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitBoolLiteral(BoolLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitDoubleLiteral(DoubleLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitIntLiteral(IntLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitStringLiteral(StringLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitConstantExpression(ConstantExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitAwaitExpression(AwaitExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitMapLiteral(MapLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitSetLiteral(SetLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitListLiteral(ListLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitThrow(Throw node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitRethrow(Rethrow node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitThisExpression(ThisExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitTypeLiteral(TypeLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitSymbolLiteral(SymbolLiteral node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitAsExpression(AsExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitIsExpression(IsExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitStringConcatenation(StringConcatenation node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitConditionalExpression(ConditionalExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitLogicalExpression(LogicalExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitNot(Not node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitConstructorInvocation(ConstructorInvocation node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitStaticInvocation(StaticInvocation node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitSuperMethodInvocation(SuperMethodInvocation node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitDirectMethodInvocation(DirectMethodInvocation node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitStaticSet(StaticSet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitStaticGet(StaticGet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitSuperPropertySet(SuperPropertySet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitSuperPropertyGet(SuperPropertyGet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitDirectPropertySet(DirectPropertySet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitDirectPropertyGet(DirectPropertyGet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitPropertySet(PropertySet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitPropertyGet(PropertyGet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitVariableSet(VariableSet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitVariableGet(VariableGet node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+
+  @override
+  void visitInvalidExpression(InvalidExpression node) {
+    storeLastSeenUriAndOffset(node);
+    makeExpressionRoundTrip(node);
+  }
+}
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
new file mode 100644
index 0000000..06799f1
--- /dev/null
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -0,0 +1,769 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.text_serializer;
+
+import '../ast.dart';
+
+import 'serializer_combinators.dart';
+
+import '../visitor.dart' show ExpressionVisitor;
+
+abstract class Tagger<T extends Node> {
+  String tag(T node);
+}
+
+class NameTagger implements Tagger<Name> {
+  const NameTagger();
+
+  String tag(Name name) => name.isPrivate ? "private" : "public";
+}
+
+TextSerializer<Name> publicName =
+    new Wrapped(unwrapPublicName, wrapPublicName, const DartString());
+
+String unwrapPublicName(Name name) => name.name;
+
+Name wrapPublicName(String name) => new Name(name);
+
+TextSerializer<Name> privateName = new Wrapped(unwrapPrivateName,
+    wrapPrivateName, Tuple2Serializer(const DartString(), const DartString()));
+
+Tuple2<String, String> unwrapPrivateName(Name name) {
+  return new Tuple2(name.library.importUri.toString(), name.name);
+}
+
+Name wrapPrivateName(Tuple2<String, String> tuple) {
+  // We need a map from import URI to libraries.  More generally, we will need
+  // a way to map any 'named' node to the node's reference.
+  throw UnimplementedError('deserialization of private names');
+}
+
+TextSerializer<Name> nameSerializer = new Case(const NameTagger(), [
+  "public",
+  "private",
+], [
+  publicName,
+  privateName
+]);
+
+class ExpressionTagger extends ExpressionVisitor<String>
+    implements Tagger<Expression> {
+  const ExpressionTagger();
+
+  String tag(Expression expression) => expression.accept(this);
+
+  String visitStringLiteral(StringLiteral _) => "string";
+  String visitIntLiteral(IntLiteral _) => "int";
+  String visitDoubleLiteral(DoubleLiteral _) => "double";
+  String visitBoolLiteral(BoolLiteral _) => "bool";
+  String visitNullLiteral(NullLiteral _) => "null";
+  String visitInvalidExpression(InvalidExpression _) => "invalid";
+  String visitNot(Not _) => "not";
+  String visitLogicalExpression(LogicalExpression expression) {
+    return expression.operator;
+  }
+
+  String visitStringConcatenation(StringConcatenation _) => "concat";
+  String visitSymbolLiteral(SymbolLiteral _) => "symbol";
+  String visitThisExpression(ThisExpression _) => "this";
+  String visitRethrow(Rethrow _) => "rethrow";
+  String visitThrow(Throw _) => "throw";
+  String visitAwaitExpression(AwaitExpression _) => "await";
+  String visitConditionalExpression(ConditionalExpression _) => "cond";
+  String visitIsExpression(IsExpression _) => "is";
+  String visitAsExpression(AsExpression _) => "as";
+  String visitTypeLiteral(TypeLiteral _) => "type";
+  String visitListLiteral(ListLiteral expression) {
+    return expression.isConst ? "const-list" : "list";
+  }
+
+  String visitSetLiteral(SetLiteral expression) {
+    return expression.isConst ? "const-set" : "set";
+  }
+
+  String visitMapLiteral(MapLiteral expression) {
+    return expression.isConst ? "const-map" : "map";
+  }
+
+  String visitLet(Let _) => "let";
+
+  String visitPropertyGet(PropertyGet _) => "get-prop";
+  String visitPropertySet(PropertySet _) => "set-prop";
+  String visitSuperPropertyGet(SuperPropertyGet _) => "get-super";
+  String visitSuperPropertySet(SuperPropertySet _) => "set-super";
+  String visitMethodInvocation(MethodInvocation _) => "invoke-method";
+  String visitSuperMethodInvocation(SuperMethodInvocation _) => "invoke-super";
+
+  String visitVariableGet(VariableGet _) => "get-var";
+  String visitVariableSet(VariableSet _) => "set-var";
+}
+
+TextSerializer<InvalidExpression> invalidExpressionSerializer = new Wrapped(
+    unwrapInvalidExpression, wrapInvalidExpression, const DartString());
+
+String unwrapInvalidExpression(InvalidExpression expression) {
+  return expression.message;
+}
+
+InvalidExpression wrapInvalidExpression(String message) {
+  return new InvalidExpression(message);
+}
+
+TextSerializer<Not> notSerializer =
+    new Wrapped(unwrapNot, wrapNot, expressionSerializer);
+
+Expression unwrapNot(Not expression) => expression.operand;
+
+Not wrapNot(Expression operand) => new Not(operand);
+
+TextSerializer<LogicalExpression> logicalAndSerializer = new Wrapped(
+    unwrapLogicalExpression,
+    wrapLogicalAnd,
+    new Tuple2Serializer(expressionSerializer, expressionSerializer));
+
+Tuple2<Expression, Expression> unwrapLogicalExpression(
+    LogicalExpression expression) {
+  return new Tuple2(expression.left, expression.right);
+}
+
+LogicalExpression wrapLogicalAnd(Tuple2<Expression, Expression> tuple) {
+  return new LogicalExpression(tuple.first, '&&', tuple.second);
+}
+
+TextSerializer<LogicalExpression> logicalOrSerializer = new Wrapped(
+    unwrapLogicalExpression,
+    wrapLogicalOr,
+    new Tuple2Serializer(expressionSerializer, expressionSerializer));
+
+LogicalExpression wrapLogicalOr(Tuple2<Expression, Expression> tuple) {
+  return new LogicalExpression(tuple.first, '||', tuple.second);
+}
+
+TextSerializer<StringConcatenation> stringConcatenationSerializer = new Wrapped(
+    unwrapStringConcatenation,
+    wrapStringConcatenation,
+    new ListSerializer(expressionSerializer));
+
+List<Expression> unwrapStringConcatenation(StringConcatenation expression) {
+  return expression.expressions;
+}
+
+StringConcatenation wrapStringConcatenation(List<Expression> expressions) {
+  return new StringConcatenation(expressions);
+}
+
+TextSerializer<StringLiteral> stringLiteralSerializer =
+    new Wrapped(unwrapStringLiteral, wrapStringLiteral, const DartString());
+
+String unwrapStringLiteral(StringLiteral literal) => literal.value;
+
+StringLiteral wrapStringLiteral(String value) => new StringLiteral(value);
+
+TextSerializer<IntLiteral> intLiteralSerializer =
+    new Wrapped(unwrapIntLiteral, wrapIntLiteral, const DartInt());
+
+int unwrapIntLiteral(IntLiteral literal) => literal.value;
+
+IntLiteral wrapIntLiteral(int value) => new IntLiteral(value);
+
+TextSerializer<DoubleLiteral> doubleLiteralSerializer =
+    new Wrapped(unwrapDoubleLiteral, wrapDoubleLiteral, const DartDouble());
+
+double unwrapDoubleLiteral(DoubleLiteral literal) => literal.value;
+
+DoubleLiteral wrapDoubleLiteral(double value) => new DoubleLiteral(value);
+
+TextSerializer<BoolLiteral> boolLiteralSerializer =
+    new Wrapped(unwrapBoolLiteral, wrapBoolLiteral, const DartBool());
+
+bool unwrapBoolLiteral(BoolLiteral literal) => literal.value;
+
+BoolLiteral wrapBoolLiteral(bool value) => new BoolLiteral(value);
+
+TextSerializer<NullLiteral> nullLiteralSerializer =
+    new Wrapped(unwrapNullLiteral, wrapNullLiteral, const Nothing());
+
+void unwrapNullLiteral(NullLiteral literal) {}
+
+NullLiteral wrapNullLiteral(void ignored) => new NullLiteral();
+
+TextSerializer<SymbolLiteral> symbolLiteralSerializer =
+    new Wrapped(unwrapSymbolLiteral, wrapSymbolLiteral, const DartString());
+
+String unwrapSymbolLiteral(SymbolLiteral expression) => expression.value;
+
+SymbolLiteral wrapSymbolLiteral(String value) => new SymbolLiteral(value);
+
+TextSerializer<ThisExpression> thisExpressionSerializer =
+    new Wrapped(unwrapThisExpression, wrapThisExpression, const Nothing());
+
+void unwrapThisExpression(ThisExpression expression) {}
+
+ThisExpression wrapThisExpression(void ignored) => new ThisExpression();
+
+TextSerializer<Rethrow> rethrowSerializer =
+    new Wrapped(unwrapRethrow, wrapRethrow, const Nothing());
+
+void unwrapRethrow(Rethrow expression) {}
+
+Rethrow wrapRethrow(void ignored) => new Rethrow();
+
+TextSerializer<Throw> throwSerializer =
+    new Wrapped(unwrapThrow, wrapThrow, expressionSerializer);
+
+Expression unwrapThrow(Throw expression) => expression.expression;
+
+Throw wrapThrow(Expression expression) => new Throw(expression);
+
+TextSerializer<AwaitExpression> awaitExpressionSerializer = new Wrapped(
+    unwrapAwaitExpression, wrapAwaitExpression, expressionSerializer);
+
+Expression unwrapAwaitExpression(AwaitExpression expression) =>
+    expression.operand;
+
+AwaitExpression wrapAwaitExpression(Expression operand) =>
+    new AwaitExpression(operand);
+
+TextSerializer<ConditionalExpression> conditionalExpressionSerializer =
+    new Wrapped(
+        unwrapConditionalExpression,
+        wrapConditionalExpression,
+        new Tuple4Serializer(expressionSerializer, dartTypeSerializer,
+            expressionSerializer, expressionSerializer));
+
+Tuple4<Expression, DartType, Expression, Expression>
+    unwrapConditionalExpression(ConditionalExpression expression) {
+  return new Tuple4(expression.condition, expression.staticType,
+      expression.then, expression.otherwise);
+}
+
+ConditionalExpression wrapConditionalExpression(
+    Tuple4<Expression, DartType, Expression, Expression> tuple) {
+  return new ConditionalExpression(
+      tuple.first, tuple.third, tuple.fourth, tuple.second);
+}
+
+TextSerializer<IsExpression> isExpressionSerializer = new Wrapped(
+    unwrapIsExpression,
+    wrapIsExpression,
+    new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
+
+Tuple2<Expression, DartType> unwrapIsExpression(IsExpression expression) {
+  return new Tuple2(expression.operand, expression.type);
+}
+
+IsExpression wrapIsExpression(Tuple2<Expression, DartType> tuple) {
+  return new IsExpression(tuple.first, tuple.second);
+}
+
+TextSerializer<AsExpression> asExpressionSerializer = new Wrapped(
+    unwrapAsExpression,
+    wrapAsExpression,
+    new Tuple2Serializer(expressionSerializer, dartTypeSerializer));
+
+Tuple2<Expression, DartType> unwrapAsExpression(AsExpression expression) {
+  return new Tuple2(expression.operand, expression.type);
+}
+
+AsExpression wrapAsExpression(Tuple2<Expression, DartType> tuple) {
+  return new AsExpression(tuple.first, tuple.second);
+}
+
+TextSerializer<TypeLiteral> typeLiteralSerializer =
+    new Wrapped(unwrapTypeLiteral, wrapTypeLiteral, dartTypeSerializer);
+
+DartType unwrapTypeLiteral(TypeLiteral expression) => expression.type;
+
+TypeLiteral wrapTypeLiteral(DartType type) => new TypeLiteral(type);
+
+TextSerializer<ListLiteral> listLiteralSerializer = new Wrapped(
+    unwrapListLiteral,
+    wrapListLiteral,
+    new Tuple2Serializer(
+        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+
+Tuple2<DartType, List<Expression>> unwrapListLiteral(ListLiteral expression) {
+  return new Tuple2(expression.typeArgument, expression.expressions);
+}
+
+ListLiteral wrapListLiteral(Tuple2<DartType, List<Expression>> tuple) {
+  return new ListLiteral(tuple.second,
+      typeArgument: tuple.first, isConst: false);
+}
+
+TextSerializer<ListLiteral> constListLiteralSerializer = new Wrapped(
+    unwrapListLiteral,
+    wrapConstListLiteral,
+    new Tuple2Serializer(
+        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+
+ListLiteral wrapConstListLiteral(Tuple2<DartType, List<Expression>> tuple) {
+  return new ListLiteral(tuple.second,
+      typeArgument: tuple.first, isConst: true);
+}
+
+TextSerializer<SetLiteral> setLiteralSerializer = new Wrapped(
+    unwrapSetLiteral,
+    wrapSetLiteral,
+    new Tuple2Serializer(
+        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+
+Tuple2<DartType, List<Expression>> unwrapSetLiteral(SetLiteral expression) {
+  return new Tuple2(expression.typeArgument, expression.expressions);
+}
+
+SetLiteral wrapSetLiteral(Tuple2<DartType, List<Expression>> tuple) {
+  return new SetLiteral(tuple.second,
+      typeArgument: tuple.first, isConst: false);
+}
+
+TextSerializer<SetLiteral> constSetLiteralSerializer = new Wrapped(
+    unwrapSetLiteral,
+    wrapConstSetLiteral,
+    new Tuple2Serializer(
+        dartTypeSerializer, new ListSerializer(expressionSerializer)));
+
+SetLiteral wrapConstSetLiteral(Tuple2<DartType, List<Expression>> tuple) {
+  return new SetLiteral(tuple.second, typeArgument: tuple.first, isConst: true);
+}
+
+TextSerializer<MapLiteral> mapLiteralSerializer = new Wrapped(
+    unwrapMapLiteral,
+    wrapMapLiteral,
+    new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
+        new ListSerializer(expressionSerializer)));
+
+Tuple3<DartType, DartType, List<Expression>> unwrapMapLiteral(
+    MapLiteral expression) {
+  List<Expression> entries = new List(2 * expression.entries.length);
+  for (int from = 0, to = 0; from < expression.entries.length; ++from) {
+    MapEntry entry = expression.entries[from];
+    entries[to++] = entry.key;
+    entries[to++] = entry.value;
+  }
+  return new Tuple3(expression.keyType, expression.valueType, entries);
+}
+
+MapLiteral wrapMapLiteral(Tuple3<DartType, DartType, List<Expression>> tuple) {
+  List<MapEntry> entries = new List(tuple.third.length ~/ 2);
+  for (int from = 0, to = 0; to < entries.length; ++to) {
+    entries[to] = new MapEntry(tuple.third[from++], tuple.third[from++]);
+  }
+  return new MapLiteral(entries,
+      keyType: tuple.first, valueType: tuple.second, isConst: false);
+}
+
+TextSerializer<MapLiteral> constMapLiteralSerializer = new Wrapped(
+    unwrapMapLiteral,
+    wrapConstMapLiteral,
+    new Tuple3Serializer(dartTypeSerializer, dartTypeSerializer,
+        new ListSerializer(expressionSerializer)));
+
+MapLiteral wrapConstMapLiteral(
+    Tuple3<DartType, DartType, List<Expression>> tuple) {
+  List<MapEntry> entries = new List(tuple.third.length ~/ 2);
+  for (int from = 0, to = 0; to < entries.length; ++to) {
+    entries[to] = new MapEntry(tuple.third[from++], tuple.third[from++]);
+  }
+  return new MapLiteral(entries,
+      keyType: tuple.first, valueType: tuple.second, isConst: true);
+}
+
+class LetSerializer extends TextSerializer<Let> {
+  const LetSerializer();
+
+  Let readFrom(
+      Iterator<Object> stream, DeserializationEnvironment environment) {
+    VariableDeclaration variable =
+        variableDeclarationSerializer.readFrom(stream, environment);
+    Expression body = expressionSerializer.readFrom(
+        stream,
+        new DeserializationEnvironment(environment)
+          ..add(variable.name, variable));
+    return new Let(variable, body);
+  }
+
+  void writeTo(
+      StringBuffer buffer, Let object, SerializationEnvironment environment) {
+    SerializationEnvironment bodyScope =
+        new SerializationEnvironment(environment);
+    VariableDeclaration variable = object.variable;
+    String oldVariableName = variable.name;
+    String newVariableName = bodyScope.add(variable, oldVariableName);
+    variableDeclarationSerializer.writeTo(
+        buffer, variable..name = newVariableName, environment);
+    variable.name = oldVariableName;
+    buffer.write(' ');
+    expressionSerializer.writeTo(buffer, object.body, bodyScope);
+  }
+}
+
+TextSerializer<Let> letSerializer = const LetSerializer();
+
+TextSerializer<PropertyGet> propertyGetSerializer = new Wrapped(
+    unwrapPropertyGet,
+    wrapPropertyGet,
+    new Tuple2Serializer(expressionSerializer, nameSerializer));
+
+Tuple2<Expression, Name> unwrapPropertyGet(PropertyGet expression) {
+  return new Tuple2(expression.receiver, expression.name);
+}
+
+PropertyGet wrapPropertyGet(Tuple2<Expression, Name> tuple) {
+  return new PropertyGet(tuple.first, tuple.second);
+}
+
+TextSerializer<PropertySet> propertySetSerializer = new Wrapped(
+    unwrapPropertySet,
+    wrapPropertySet,
+    new Tuple3Serializer(
+        expressionSerializer, nameSerializer, expressionSerializer));
+
+Tuple3<Expression, Name, Expression> unwrapPropertySet(PropertySet expression) {
+  return new Tuple3(expression.receiver, expression.name, expression.value);
+}
+
+PropertySet wrapPropertySet(Tuple3<Expression, Name, Expression> tuple) {
+  return new PropertySet(tuple.first, tuple.second, tuple.third);
+}
+
+TextSerializer<SuperPropertyGet> superPropertyGetSerializer =
+    new Wrapped(unwrapSuperPropertyGet, wrapSuperPropertyGet, nameSerializer);
+
+Name unwrapSuperPropertyGet(SuperPropertyGet expression) {
+  return expression.name;
+}
+
+SuperPropertyGet wrapSuperPropertyGet(Name name) {
+  return new SuperPropertyGet(name);
+}
+
+TextSerializer<SuperPropertySet> superPropertySetSerializer = new Wrapped(
+    unwrapSuperPropertySet,
+    wrapSuperPropertySet,
+    new Tuple2Serializer(nameSerializer, expressionSerializer));
+
+Tuple2<Name, Expression> unwrapSuperPropertySet(SuperPropertySet expression) {
+  return new Tuple2(expression.name, expression.value);
+}
+
+SuperPropertySet wrapSuperPropertySet(Tuple2<Name, Expression> tuple) {
+  return new SuperPropertySet(tuple.first, tuple.second, null);
+}
+
+TextSerializer<MethodInvocation> methodInvocationSerializer = new Wrapped(
+    unwrapMethodInvocation,
+    wrapMethodInvocation,
+    new Tuple3Serializer(
+        expressionSerializer, nameSerializer, argumentsSerializer));
+
+Tuple3<Expression, Name, Arguments> unwrapMethodInvocation(
+    MethodInvocation expression) {
+  return new Tuple3(expression.receiver, expression.name, expression.arguments);
+}
+
+MethodInvocation wrapMethodInvocation(
+    Tuple3<Expression, Name, Arguments> tuple) {
+  return new MethodInvocation(tuple.first, tuple.second, tuple.third);
+}
+
+TextSerializer<SuperMethodInvocation> superMethodInvocationSerializer =
+    new Wrapped(unwrapSuperMethodInvocation, wrapSuperMethodInvocation,
+        new Tuple2Serializer(nameSerializer, argumentsSerializer));
+
+Tuple2<Name, Arguments> unwrapSuperMethodInvocation(
+    SuperMethodInvocation expression) {
+  return new Tuple2(expression.name, expression.arguments);
+}
+
+SuperMethodInvocation wrapSuperMethodInvocation(Tuple2<Name, Arguments> tuple) {
+  return new SuperMethodInvocation(tuple.first, tuple.second);
+}
+
+TextSerializer<VariableGet> variableGetSerializer = new Wrapped(
+    unwrapVariableGet,
+    wrapVariableGet,
+    new Tuple2Serializer(const ScopedReference<VariableDeclaration>(),
+        new Optional(dartTypeSerializer)));
+
+Tuple2<VariableDeclaration, DartType> unwrapVariableGet(VariableGet node) {
+  return new Tuple2<VariableDeclaration, DartType>(
+      node.variable, node.promotedType);
+}
+
+VariableGet wrapVariableGet(Tuple2<VariableDeclaration, DartType> tuple) {
+  return new VariableGet(tuple.first, tuple.second);
+}
+
+TextSerializer<VariableSet> variableSetSerializer = new Wrapped(
+    unwrapVariableSet,
+    wrapVariableSet,
+    new Tuple2Serializer(
+        const ScopedReference<VariableDeclaration>(), expressionSerializer));
+
+Tuple2<VariableDeclaration, Expression> unwrapVariableSet(VariableSet node) {
+  return new Tuple2<VariableDeclaration, Expression>(node.variable, node.value);
+}
+
+VariableSet wrapVariableSet(Tuple2<VariableDeclaration, Expression> tuple) {
+  return new VariableSet(tuple.first, tuple.second);
+}
+
+Case<Expression> expressionSerializer =
+    new Case.uninitialized(const ExpressionTagger());
+
+TextSerializer<NamedExpression> namedExpressionSerializer = new Wrapped(
+    unwrapNamedExpression,
+    wrapNamedExpression,
+    new Tuple2Serializer(const DartString(), expressionSerializer));
+
+Tuple2<String, Expression> unwrapNamedExpression(NamedExpression expression) {
+  return new Tuple2(expression.name, expression.value);
+}
+
+NamedExpression wrapNamedExpression(Tuple2<String, Expression> tuple) {
+  return new NamedExpression(tuple.first, tuple.second);
+}
+
+TextSerializer<Arguments> argumentsSerializer = new Wrapped(
+    unwrapArguments,
+    wrapArguments,
+    Tuple3Serializer(
+        new ListSerializer(dartTypeSerializer),
+        new ListSerializer(expressionSerializer),
+        new ListSerializer(namedExpressionSerializer)));
+
+Tuple3<List<DartType>, List<Expression>, List<NamedExpression>> unwrapArguments(
+    Arguments arguments) {
+  return new Tuple3(arguments.types, arguments.positional, arguments.named);
+}
+
+Arguments wrapArguments(
+    Tuple3<List<DartType>, List<Expression>, List<NamedExpression>> tuple) {
+  return new Arguments(tuple.second, types: tuple.first, named: tuple.third);
+}
+
+class VariableDeclarationTagger implements Tagger<VariableDeclaration> {
+  const VariableDeclarationTagger();
+
+  String tag(VariableDeclaration decl) {
+    if (decl.isCovariant) throw UnimplementedError("covariant declaration");
+    if (decl.isFieldFormal) throw UnimplementedError("initializing formal");
+    if (decl.isConst) {
+      // It's not clear what invariants we assume about const/final.  For now
+      // throw if we have both.
+      if (decl.isFinal) throw UnimplementedError("const and final");
+      return "const";
+    }
+    if (decl.isFinal) {
+      return "final";
+    }
+    return "var";
+  }
+}
+
+TextSerializer<VariableDeclaration> varDeclarationSerializer = new Wrapped(
+    unwrapVariableDeclaration,
+    wrapVarDeclaration,
+    Tuple4Serializer(
+        const DartString(),
+        dartTypeSerializer,
+        new Optional(expressionSerializer),
+        new ListSerializer(expressionSerializer)));
+
+Tuple4<String, DartType, Expression, List<Expression>>
+    unwrapVariableDeclaration(VariableDeclaration declaration) {
+  return new Tuple4(declaration.name ?? "", declaration.type,
+      declaration.initializer, declaration.annotations);
+}
+
+VariableDeclaration wrapVarDeclaration(
+    Tuple4<String, DartType, Expression, List<Expression>> tuple) {
+  var result = new VariableDeclaration(tuple.first.isEmpty ? null : tuple.first,
+      initializer: tuple.third, type: tuple.second);
+  for (int i = 0; i < tuple.fourth.length; ++i) {
+    result.addAnnotation(tuple.fourth[i]);
+  }
+  return result;
+}
+
+TextSerializer<VariableDeclaration> finalDeclarationSerializer = new Wrapped(
+    unwrapVariableDeclaration,
+    wrapFinalDeclaration,
+    Tuple4Serializer(
+        const DartString(),
+        dartTypeSerializer,
+        new Optional(expressionSerializer),
+        new ListSerializer(expressionSerializer)));
+
+VariableDeclaration wrapFinalDeclaration(
+    Tuple4<String, DartType, Expression, List<Expression>> tuple) {
+  var result = new VariableDeclaration(tuple.first.isEmpty ? null : tuple.first,
+      initializer: tuple.third, type: tuple.second, isFinal: true);
+  for (int i = 0; i < tuple.fourth.length; ++i) {
+    result.addAnnotation(tuple.fourth[i]);
+  }
+  return result;
+}
+
+TextSerializer<VariableDeclaration> constDeclarationSerializer = new Wrapped(
+    unwrapVariableDeclaration,
+    wrapConstDeclaration,
+    Tuple4Serializer(
+        const DartString(),
+        dartTypeSerializer,
+        new Optional(expressionSerializer),
+        new ListSerializer(expressionSerializer)));
+
+VariableDeclaration wrapConstDeclaration(
+    Tuple4<String, DartType, Expression, List<Expression>> tuple) {
+  var result = new VariableDeclaration(tuple.first.isEmpty ? null : tuple.first,
+      initializer: tuple.third, type: tuple.second, isConst: true);
+  for (int i = 0; i < tuple.fourth.length; ++i) {
+    result.addAnnotation(tuple.fourth[i]);
+  }
+  return result;
+}
+
+TextSerializer<VariableDeclaration> variableDeclarationSerializer =
+    new Case(const VariableDeclarationTagger(), [
+  "var",
+  "final",
+  "const",
+], [
+  varDeclarationSerializer,
+  finalDeclarationSerializer,
+  constDeclarationSerializer,
+]);
+
+class DartTypeTagger extends DartTypeVisitor<String>
+    implements Tagger<DartType> {
+  const DartTypeTagger();
+
+  String tag(DartType type) => type.accept(this);
+
+  String visitInvalidType(InvalidType _) => "invalid";
+  String visitDynamicType(DynamicType _) => "dynamic";
+  String visitVoidType(VoidType _) => "void";
+  String visitBottomType(BottomType _) => "bottom";
+}
+
+TextSerializer<InvalidType> invalidTypeSerializer =
+    new Wrapped(unwrapInvalidType, wrapInvalidType, const Nothing());
+
+void unwrapInvalidType(InvalidType type) {}
+
+InvalidType wrapInvalidType(void ignored) => const InvalidType();
+
+TextSerializer<DynamicType> dynamicTypeSerializer =
+    new Wrapped(unwrapDynamicType, wrapDynamicType, const Nothing());
+
+void unwrapDynamicType(DynamicType type) {}
+
+DynamicType wrapDynamicType(void ignored) => const DynamicType();
+
+TextSerializer<VoidType> voidTypeSerializer =
+    new Wrapped(unwrapVoidType, wrapVoidType, const Nothing());
+
+void unwrapVoidType(VoidType type) {}
+
+VoidType wrapVoidType(void ignored) => const VoidType();
+
+TextSerializer<BottomType> bottomTypeSerializer =
+    new Wrapped(unwrapBottomType, wrapBottomType, const Nothing());
+
+void unwrapBottomType(BottomType type) {}
+
+BottomType wrapBottomType(void ignored) => const BottomType();
+
+Case<DartType> dartTypeSerializer =
+    new Case.uninitialized(const DartTypeTagger());
+
+void initializeSerializers() {
+  expressionSerializer.tags.addAll([
+    "string",
+    "int",
+    "double",
+    "bool",
+    "null",
+    "invalid",
+    "not",
+    "&&",
+    "||",
+    "concat",
+    "symbol",
+    "this",
+    "rethrow",
+    "throw",
+    "await",
+    "cond",
+    "is",
+    "as",
+    "type",
+    "list",
+    "const-list",
+    "set",
+    "const-set",
+    "map",
+    "const-map",
+    "let",
+    "get-prop",
+    "set-prop",
+    "get-super",
+    "set-super",
+    "invoke-method",
+    "invoke-super",
+    "get-var",
+    "set-var",
+  ]);
+  expressionSerializer.serializers.addAll([
+    stringLiteralSerializer,
+    intLiteralSerializer,
+    doubleLiteralSerializer,
+    boolLiteralSerializer,
+    nullLiteralSerializer,
+    invalidExpressionSerializer,
+    notSerializer,
+    logicalAndSerializer,
+    logicalOrSerializer,
+    stringConcatenationSerializer,
+    symbolLiteralSerializer,
+    thisExpressionSerializer,
+    rethrowSerializer,
+    throwSerializer,
+    awaitExpressionSerializer,
+    conditionalExpressionSerializer,
+    isExpressionSerializer,
+    asExpressionSerializer,
+    typeLiteralSerializer,
+    listLiteralSerializer,
+    constListLiteralSerializer,
+    setLiteralSerializer,
+    constSetLiteralSerializer,
+    mapLiteralSerializer,
+    constMapLiteralSerializer,
+    letSerializer,
+    propertyGetSerializer,
+    propertySetSerializer,
+    superPropertyGetSerializer,
+    superPropertySetSerializer,
+    methodInvocationSerializer,
+    superMethodInvocationSerializer,
+    variableGetSerializer,
+    variableSetSerializer,
+  ]);
+  dartTypeSerializer.tags.addAll([
+    "invalid",
+    "dynamic",
+    "void",
+    "bottom",
+  ]);
+  dartTypeSerializer.serializers.addAll([
+    invalidTypeSerializer,
+    dynamicTypeSerializer,
+    voidTypeSerializer,
+    bottomTypeSerializer,
+  ]);
+}
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index 7977045..31fe3f3 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -499,8 +499,8 @@
   }
 
   visitFunctionNode(FunctionNode node) {
-    var nestedRewriter = new RecursiveContinuationRewriter(
-        continuationRewriter.helper, continuationRewriter.syncAsync);
+    var nestedRewriter =
+        new RecursiveContinuationRewriter(continuationRewriter.helper);
     return node.accept(nestedRewriter);
   }
 }
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index 49f6eba..17bd047 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -28,37 +28,40 @@
 import '../type_algebra.dart';
 import '../type_environment.dart';
 
-Component transformComponent(Component component, ConstantsBackend backend,
+Component transformComponent(
+    Component component, ConstantsBackend backend, ErrorReporter errorReporter,
     {bool keepFields: false,
     bool legacyMode: false,
     bool enableAsserts: false,
     bool evaluateAnnotations: true,
     CoreTypes coreTypes,
-    ClassHierarchy hierarchy,
-    ErrorReporter errorReporter: const _SimpleErrorReporter()}) {
+    ClassHierarchy hierarchy}) {
   coreTypes ??= new CoreTypes(component);
   hierarchy ??= new ClassHierarchy(component);
 
   final typeEnvironment =
-      new TypeEnvironment(coreTypes, hierarchy, strongMode: !legacyMode);
+      new TypeEnvironment(coreTypes, hierarchy, legacyMode: legacyMode);
 
-  transformLibraries(component.libraries, backend, coreTypes, typeEnvironment,
+  transformLibraries(
+      component.libraries, backend, coreTypes, typeEnvironment, errorReporter,
       keepFields: keepFields,
       legacyMode: legacyMode,
       enableAsserts: enableAsserts,
-      evaluateAnnotations: evaluateAnnotations,
-      errorReporter: errorReporter);
+      evaluateAnnotations: evaluateAnnotations);
   return component;
 }
 
-void transformLibraries(List<Library> libraries, ConstantsBackend backend,
-    CoreTypes coreTypes, TypeEnvironment typeEnvironment,
+void transformLibraries(
+    List<Library> libraries,
+    ConstantsBackend backend,
+    CoreTypes coreTypes,
+    TypeEnvironment typeEnvironment,
+    ErrorReporter errorReporter,
     {bool keepFields: false,
     bool legacyMode: false,
     bool keepVariables: false,
     bool evaluateAnnotations: true,
-    bool enableAsserts: false,
-    ErrorReporter errorReporter: const _SimpleErrorReporter()}) {
+    bool enableAsserts: false}) {
   final ConstantsTransformer constantsTransformer = new ConstantsTransformer(
       backend,
       keepFields,
@@ -95,8 +98,8 @@
       ErrorReporter errorReporter,
       {bool legacyMode: false})
       : constantEvaluator = new ConstantEvaluator(
-            backend, typeEnvironment, coreTypes, enableAsserts,
-            legacyMode: legacyMode, errorReporter: errorReporter);
+            backend, typeEnvironment, coreTypes, enableAsserts, errorReporter,
+            legacyMode: legacyMode);
 
   // Transform the library/class members:
 
@@ -235,32 +238,32 @@
   visitVariableDeclaration(VariableDeclaration node) {
     transformAnnotations(node.annotations, node);
 
-    if (node.isConst) {
-      final Constant constant = tryEvaluateWithContext(node, node.initializer);
-
-      // If there was a constant evaluation error we will not continue and
-      // simply keep the old [node].
-      if (constant == null) {
-        return node;
-      }
-
-      constantEvaluator.env.addVariableValue(node, constant);
-
-      if (keepVariables) {
-        // So the value of the variable is still available for debugging
-        // purposes we convert the constant variable to be a final variable
-        // initialized to the evaluated constant expression.
-        node.initializer = new ConstantExpression(constant)..parent = node;
-        node.isFinal = true;
-        node.isConst = false;
-      } else {
-        // Since we convert all use-sites of constants, the constant
-        // [VariableDeclaration] is unused and we'll therefore remove it.
-        return null;
-      }
-    }
     if (node.initializer != null) {
-      node.initializer = node.initializer.accept(this)..parent = node;
+      if (node.isConst) {
+        final Constant constant =
+            tryEvaluateWithContext(node, node.initializer);
+
+        // If there was a constant evaluation error we will not continue and
+        // simply keep the old [node].
+        if (constant != null) {
+          constantEvaluator.env.addVariableValue(node, constant);
+
+          if (keepVariables) {
+            // So the value of the variable is still available for debugging
+            // purposes we convert the constant variable to be a final variable
+            // initialized to the evaluated constant expression.
+            node.initializer = new ConstantExpression(constant)..parent = node;
+            node.isFinal = true;
+            node.isConst = false;
+          } else {
+            // Since we convert all use-sites of constants, the constant
+            // [VariableDeclaration] is unused and we'll therefore remove it.
+            return null;
+          }
+        }
+      } else {
+        node.initializer = node.initializer.accept(this)..parent = node;
+      }
     }
     return node;
   }
@@ -374,6 +377,8 @@
   final bool enableAsserts;
   final ErrorReporter errorReporter;
 
+  final isInstantiated = new IsInstantiatedVisitor().isInstantiated;
+
   final Map<Constant, Constant> canonicalizationCache;
   final Map<Node, Object> nodeCache;
 
@@ -386,10 +391,9 @@
   InstanceBuilder instanceBuilder;
   EvaluationEnvironment env;
 
-  ConstantEvaluator(
-      this.backend, this.typeEnvironment, this.coreTypes, this.enableAsserts,
-      {this.legacyMode: false,
-      this.errorReporter = const _SimpleErrorReporter()})
+  ConstantEvaluator(this.backend, this.typeEnvironment, this.coreTypes,
+      this.enableAsserts, this.errorReporter,
+      {this.legacyMode: false})
       : canonicalizationCache = <Constant, Constant>{},
         nodeCache = <Node, Constant>{};
 
@@ -461,8 +465,8 @@
   }
 
   visitIntLiteral(IntLiteral node) {
-    // The frontend will ensure the integer literals are in signed 64-bit range
-    // in strong mode.
+    // The frontend will ensure the integer literals are in signed 64-bit
+    // range.
     return canonicalize(new IntConstant(node.value));
   }
 
@@ -475,7 +479,7 @@
   }
 
   visitTypeLiteral(TypeLiteral node) {
-    final DartType type = evaluateDartType(node.type);
+    final DartType type = evaluateDartType(node, node.type);
     return canonicalize(new TypeLiteralConstant(type));
   }
 
@@ -496,7 +500,7 @@
     for (int i = 0; i < node.expressions.length; ++i) {
       entries[i] = node.expressions[i].accept(this);
     }
-    final DartType typeArgument = evaluateDartType(node.typeArgument);
+    final DartType typeArgument = evaluateDartType(node, node.typeArgument);
     final ListConstant listConstant = new ListConstant(typeArgument, entries);
     return canonicalize(backend.lowerListConstant(listConstant));
   }
@@ -521,8 +525,8 @@
       }
       entries[i] = new ConstantMapEntry(key, value);
     }
-    final DartType keyType = evaluateDartType(node.keyType);
-    final DartType valueType = evaluateDartType(node.valueType);
+    final DartType keyType = evaluateDartType(node, node.keyType);
+    final DartType valueType = evaluateDartType(node, node.valueType);
     final MapConstant mapConstant =
         new MapConstant(keyType, valueType, entries);
     return canonicalize(backend.lowerMapConstant(mapConstant));
@@ -548,7 +552,7 @@
       throw 'Constructor "$node" belongs to abstract class "${klass}".';
     }
 
-    final typeArguments = evaluateTypeArguments(node.arguments);
+    final typeArguments = evaluateTypeArguments(node, node.arguments);
     final positionals = evaluatePositionalArguments(node.arguments);
     final named = evaluateNamedArguments(node.arguments);
 
@@ -564,11 +568,156 @@
         // initialize the fields of the new instance.
         handleConstructorInvocation(
             constructor, typeArguments, positionals, named);
-        return canonicalize(instanceBuilder.buildInstance());
+        final InstanceConstant result = instanceBuilder.buildInstance();
+
+        // Special case the dart:core's Symbol class here and convert it to a
+        // [SymbolConstant].  For invalid values we report a compile-time error.
+        if (result.klass == coreTypes.internalSymbolClass) {
+          // The dart:_internal's Symbol class has only the name field.
+          assert(coreTypes.internalSymbolClass.fields
+                  .where((f) => !f.isStatic)
+                  .length ==
+              1);
+          final nameValue = result.fieldValues.values.single;
+
+          if (nameValue is StringConstant &&
+              isValidSymbolName(nameValue.value)) {
+            return canonicalize(new SymbolConstant(nameValue.value, null));
+          }
+          errorReporter.invalidSymbolName(
+              contextChain, node.arguments.positional.first, nameValue);
+          throw const _AbortCurrentEvaluation();
+        }
+
+        return canonicalize(result);
       });
     });
   }
 
+  bool isValidSymbolName(String name) {
+    // See https://api.dartlang.org/stable/2.0.0/dart-core/Symbol/Symbol.html:
+    //
+    //  A qualified name is a valid name preceded by a public identifier name and
+    //  a '.', e.g., foo.bar.baz= is a qualified version of baz=.
+    //
+    //  That means that the content of the name String must be either
+    //     - a valid public Dart identifier (that is, an identifier not
+    //       starting with "_"),
+    //     - such an identifier followed by "=" (a setter name),
+    //     - the name of a declarable operator,
+    //     - any of the above preceded by any number of qualifiers, where a
+    //       qualifier is a non-private identifier followed by '.',
+    //     - or the empty string (the default name of a library with no library
+    //       name declaration).
+
+    const operatorNames = const <String>[
+      '+',
+      '-',
+      '*',
+      '/',
+      '%',
+      '~/',
+      '&',
+      '|',
+      '^',
+      '~',
+      '<<',
+      '>>',
+      '<',
+      '<=',
+      '>',
+      '>=',
+      '==',
+      '[]',
+      '[]=',
+      'unary-'
+    ];
+
+    if (name == null) return false;
+    if (name == '') return true;
+
+    final parts = name.split('.');
+
+    // Each qualifier must be a public identifier.
+    for (int i = 0; i < parts.length - 1; ++i) {
+      if (!isValidPublicIdentifier(parts[i])) return false;
+    }
+
+    String last = parts.last;
+    if (operatorNames.contains(last)) {
+      return true;
+    }
+    if (last.endsWith('=')) {
+      last = last.substring(0, last.length - 1);
+    }
+    if (!isValidPublicIdentifier(last)) return false;
+
+    return true;
+  }
+
+  /// From the Dart Language specification:
+  ///
+  ///   IDENTIFIER:
+  ///     IDENTIFIER_START IDENTIFIER_PART*
+  ///
+  ///   IDENTIFIER_START:
+  ///       IDENTIFIER_START_NO_DOLLAR | ‘$’
+  ///
+  ///   IDENTIFIER_PART:
+  ///       IDENTIFIER_START | DIGIT
+  ///
+  ///   IDENTIFIER_NO_DOLLAR:
+  ///     IDENTIFIER_START_NO_DOLLAR IDENTIFIER_PART_NO_DOLLAR*
+  ///
+  ///   IDENTIFIER_START_NO_DOLLAR:
+  ///       LETTER | '_'
+  ///
+  ///   IDENTIFIER_PART_NO_DOLLAR:
+  ///       IDENTIFIER_START_NO_DOLLAR | DIGIT
+  ///
+  static final publicIdentifierRegExp =
+      new RegExp(r'^[a-zA-Z$][a-zA-Z0-9_$]*$');
+
+  static const nonUsableKeywords = const <String>[
+    'assert',
+    'break',
+    'case',
+    'catch',
+    'class',
+    'const',
+    'continue',
+    'default',
+    'do',
+    'else',
+    'enum',
+    'extends',
+    'false',
+    'final',
+    'finally',
+    'for',
+    'if',
+    'in',
+    'is',
+    'new',
+    'null',
+    'rethrow',
+    'return',
+    'super',
+    'switch',
+    'this',
+    'throw',
+    'true',
+    'try',
+    'var',
+    'while',
+    'with',
+  ];
+
+  bool isValidPublicIdentifier(String name) {
+    return publicIdentifierRegExp.hasMatch(name) &&
+        !nonUsableKeywords.contains(name);
+  }
+
   handleConstructorInvocation(
       Constructor constructor,
       List<DartType> typeArguments,
@@ -618,7 +767,7 @@
             handleConstructorInvocation(
                 init.target,
                 evaluateSuperTypeArguments(
-                    constructor.enclosingClass.supertype),
+                    init, constructor.enclosingClass.supertype),
                 evaluatePositionalArguments(init.arguments),
                 evaluateNamedArguments(init.arguments));
           } else if (init is RedirectingInitializer) {
@@ -670,6 +819,11 @@
     });
   }
 
+  visitInvalidExpression(InvalidExpression node) {
+    // Invalid expressions are always distinct, we do not canonicalize them.
+    return new UnevaluatedConstant(node);
+  }
+
   visitMethodInvocation(MethodInvocation node) {
     // We have no support for generic method invocation atm.
     assert(node.arguments.named.isEmpty);
@@ -1000,7 +1154,7 @@
       if (nativeName != null) {
         final Constant constant = backend.buildConstantForNative(
             nativeName,
-            evaluateTypeArguments(node.arguments),
+            evaluateTypeArguments(node, node.arguments),
             evaluatePositionalArguments(node.arguments),
             evaluateNamedArguments(node.arguments),
             contextChain,
@@ -1029,7 +1183,7 @@
 
   visitAsExpression(AsExpression node) {
     final Constant constant = node.operand.accept(this);
-    ensureIsSubtype(constant, evaluateDartType(node.type), node);
+    ensureIsSubtype(constant, evaluateDartType(node, node.type), node);
     return constant;
   }
 
@@ -1054,8 +1208,9 @@
     if (constant is TearOffConstant) {
       if (node.typeArguments.length ==
           constant.procedure.function.typeParameters.length) {
+        final typeArguments = evaluateDartTypes(node, node.typeArguments);
         return canonicalize(
-            new PartialInstantiationConstant(constant, node.typeArguments));
+            new PartialInstantiationConstant(constant, typeArguments));
       }
       throw new Exception(
           'The number of type arguments supplied in the partial instantiation '
@@ -1107,21 +1262,30 @@
     }
   }
 
-  List<DartType> evaluateTypeArguments(Arguments arguments) {
-    return evaluateDartTypes(arguments.types);
+  List<DartType> evaluateTypeArguments(TreeNode node, Arguments arguments) {
+    return evaluateDartTypes(node, arguments.types);
   }
 
-  List<DartType> evaluateSuperTypeArguments(Supertype type) {
-    return evaluateDartTypes(type.typeArguments);
+  List<DartType> evaluateSuperTypeArguments(TreeNode node, Supertype type) {
+    return evaluateDartTypes(node, type.typeArguments);
   }
 
-  List<DartType> evaluateDartTypes(List<DartType> types) {
-    if (env.isEmpty) return types;
-    return types.map(evaluateDartType).toList();
+  List<DartType> evaluateDartTypes(TreeNode node, List<DartType> types) {
+    // TODO: Once the frontend gurantees that there are no free type variables
+    // left over after stubstitution, we can enable this shortcut again:
+    // if (env.isEmpty) return types;
+    return types.map((t) => evaluateDartType(node, t)).toList();
   }
 
-  DartType evaluateDartType(DartType type) {
-    return env.subsituteType(type);
+  DartType evaluateDartType(TreeNode node, DartType type) {
+    final result = env.subsituteType(type);
+
+    if (!isInstantiated(result)) {
+      errorReporter.freeTypeParameter(contextChain, node, type);
+      throw const _AbortCurrentEvaluation();
+    }
+
+    return result;
   }
 
   List<Constant> evaluatePositionalArguments(Arguments arguments) {
@@ -1315,48 +1479,64 @@
 abstract class ErrorReporter {
   const ErrorReporter();
 
-  invalidDartType(List<TreeNode> context, TreeNode node, Constant receiver,
-      DartType expectedType);
-  invalidBinaryOperandType(List<TreeNode> context, TreeNode node,
-      Constant receiver, String op, DartType expectedType, DartType actualType);
-  invalidMethodInvocation(
-      List<TreeNode> context, TreeNode node, Constant receiver, String op);
-  invalidStaticInvocation(
-      List<TreeNode> context, TreeNode node, Procedure target);
-  invalidStringInterpolationOperand(
-      List<TreeNode> context, TreeNode node, Constant constant);
-  zeroDivisor(
-      List<TreeNode> context, TreeNode node, IntConstant receiver, String op);
-  negativeShift(List<TreeNode> context, TreeNode node, IntConstant receiver,
-      String op, IntConstant argument);
-  nonConstLiteral(List<TreeNode> context, TreeNode node, String klass);
-  duplicateKey(List<TreeNode> context, TreeNode node, Constant key);
-  failedAssertion(List<TreeNode> context, TreeNode node, String message);
-  nonConstantVariableGet(
-      List<TreeNode> context, TreeNode node, String variableName);
-  deferredLibrary(List<TreeNode> context, TreeNode node, String importName);
-}
-
-abstract class ErrorReporterBase implements ErrorReporter {
-  const ErrorReporterBase();
-
-  report(List<TreeNode> context, String message, TreeNode node);
-
-  getFileUri(TreeNode node) {
+  Uri getFileUri(TreeNode node) {
     while (node is! FileUriNode) {
       node = node.parent;
     }
     return (node as FileUriNode).fileUri;
   }
 
-  getFileOffset(TreeNode node) {
+  int getFileOffset(TreeNode node) {
     while (node.fileOffset == TreeNode.noOffset) {
       node = node.parent;
     }
     return node == null ? TreeNode.noOffset : node.fileOffset;
   }
 
-  invalidDartType(List<TreeNode> context, TreeNode node, Constant receiver,
+  void freeTypeParameter(List<TreeNode> context, TreeNode node, DartType type);
+  void invalidDartType(List<TreeNode> context, TreeNode node, Constant receiver,
+      DartType expectedType);
+  void invalidBinaryOperandType(List<TreeNode> context, TreeNode node,
+      Constant receiver, String op, DartType expectedType, DartType actualType);
+  void invalidMethodInvocation(
+      List<TreeNode> context, TreeNode node, Constant receiver, String op);
+  void invalidStaticInvocation(
+      List<TreeNode> context, TreeNode node, Procedure target);
+  void invalidStringInterpolationOperand(
+      List<TreeNode> context, TreeNode node, Constant constant);
+  void invalidSymbolName(
+      List<TreeNode> context, TreeNode node, Constant constant);
+  void zeroDivisor(
+      List<TreeNode> context, TreeNode node, IntConstant receiver, String op);
+  void negativeShift(List<TreeNode> context, TreeNode node,
+      IntConstant receiver, String op, IntConstant argument);
+  void nonConstLiteral(List<TreeNode> context, TreeNode node, String klass);
+  void duplicateKey(List<TreeNode> context, TreeNode node, Constant key);
+  void failedAssertion(List<TreeNode> context, TreeNode node, String message);
+  void nonConstantVariableGet(
+      List<TreeNode> context, TreeNode node, String variableName);
+  void deferredLibrary(
+      List<TreeNode> context, TreeNode node, String importName);
+}
+
+class SimpleErrorReporter extends ErrorReporter {
+  const SimpleErrorReporter();
+
+  void report(List<TreeNode> context, String message, TreeNode node) {
+    io.exitCode = 42;
+    final Uri uri = getFileUri(node);
+    final int fileOffset = getFileOffset(node);
+
+    io.stderr.writeln('$uri:$fileOffset Constant evaluation error: $message');
+  }
+
+  @override
+  void freeTypeParameter(List<TreeNode> context, TreeNode node, DartType type) {
+    report(context, 'Expected type to be instantiated but was ${type}', node);
+  }
+
+  @override
+  void invalidDartType(List<TreeNode> context, TreeNode node, Constant receiver,
       DartType expectedType) {
     report(
         context,
@@ -1364,7 +1544,8 @@
         node);
   }
 
-  invalidBinaryOperandType(
+  @override
+  void invalidBinaryOperandType(
       List<TreeNode> context,
       TreeNode node,
       Constant receiver,
@@ -1378,19 +1559,22 @@
         node);
   }
 
-  invalidMethodInvocation(
+  @override
+  void invalidMethodInvocation(
       List<TreeNode> context, TreeNode node, Constant receiver, String op) {
     report(context, 'Cannot call "$op" on "$receiver" in constant expression',
         node);
   }
 
-  invalidStaticInvocation(
+  @override
+  void invalidStaticInvocation(
       List<TreeNode> context, TreeNode node, Procedure target) {
     report(
         context, 'Cannot invoke "$target" inside a constant expression', node);
   }
 
-  invalidStringInterpolationOperand(
+  @override
+  void invalidStringInterpolationOperand(
       List<TreeNode> context, TreeNode node, Constant constant) {
     report(
         context,
@@ -1399,7 +1583,18 @@
         node);
   }
 
-  zeroDivisor(
+  @override
+  void invalidSymbolName(
+      List<TreeNode> context, TreeNode node, Constant constant) {
+    report(
+        context,
+        'The symbol name must be a valid public Dart member name, public '
+        'constructor name, or library name, optionally qualified.',
+        node);
+  }
+
+  @override
+  void zeroDivisor(
       List<TreeNode> context, TreeNode node, IntConstant receiver, String op) {
     report(
         context,
@@ -1408,8 +1603,9 @@
         node);
   }
 
-  negativeShift(List<TreeNode> context, TreeNode node, IntConstant receiver,
-      String op, IntConstant argument) {
+  @override
+  void negativeShift(List<TreeNode> context, TreeNode node,
+      IntConstant receiver, String op, IntConstant argument) {
     report(
         context,
         "Binary operator '$op' on '${receiver.value}' requires non-negative "
@@ -1417,28 +1613,32 @@
         node);
   }
 
-  nonConstLiteral(List<TreeNode> context, TreeNode node, String klass) {
+  @override
+  void nonConstLiteral(List<TreeNode> context, TreeNode node, String klass) {
     report(
         context,
         'Cannot have a non-constant $klass literal within a const context.',
         node);
   }
 
-  duplicateKey(List<TreeNode> context, TreeNode node, Constant key) {
+  @override
+  void duplicateKey(List<TreeNode> context, TreeNode node, Constant key) {
     report(
         context,
         'Duplicate keys are not allowed in constant maps (found duplicate key "$key")',
         node);
   }
 
-  failedAssertion(List<TreeNode> context, TreeNode node, String message) {
+  @override
+  void failedAssertion(List<TreeNode> context, TreeNode node, String message) {
     report(
         context,
         'The assertion condition evaluated to "false" with message "$message"',
         node);
   }
 
-  nonConstantVariableGet(
+  @override
+  void nonConstantVariableGet(
       List<TreeNode> context, TreeNode node, String variableName) {
     report(
         context,
@@ -1447,7 +1647,9 @@
         node);
   }
 
-  deferredLibrary(List<TreeNode> context, TreeNode node, String importName) {
+  @override
+  void deferredLibrary(
+      List<TreeNode> context, TreeNode node, String importName) {
     report(
         context,
         'Deferred "$importName" cannot be used inside a constant '
@@ -1456,15 +1658,43 @@
   }
 }
 
-class _SimpleErrorReporter extends ErrorReporterBase {
-  const _SimpleErrorReporter();
+class IsInstantiatedVisitor extends DartTypeVisitor<bool> {
+  final _availableVariables = new Set<TypeParameter>();
 
-  report(List<TreeNode> context, String message, TreeNode node) {
-    io.exitCode = 42;
-    final Uri uri = getFileUri(node);
-    final int fileOffset = getFileOffset(node);
+  bool isInstantiated(DartType type) {
+    return type.accept(this);
+  }
 
-    io.stderr.writeln('$uri:$fileOffset Constant evaluation error: $message');
+  bool defaultDartType(DartType node) {
+    throw 'A visitor method seems to be unimplemented!';
+  }
+
+  bool visitInvalidType(InvalidType node) => true;
+  bool visitDynamicType(DynamicType node) => true;
+  bool visitVoidType(VoidType node) => true;
+  bool visitBottomType(BottomType node) => true;
+
+  bool visitTypeParameterType(TypeParameterType node) {
+    return _availableVariables.contains(node.parameter);
+  }
+
+  bool visitInterfaceType(InterfaceType node) {
+    return node.typeArguments
+        .every((DartType typeArgument) => typeArgument.accept(this));
+  }
+
+  bool visitFunctionType(FunctionType node) {
+    final parameters = node.typeParameters;
+    _availableVariables.addAll(parameters);
+    final bool result = node.returnType.accept(this) &&
+        node.positionalParameters.every((p) => p.accept(this)) &&
+        node.namedParameters.every((p) => p.type.accept(this));
+    _availableVariables.removeAll(parameters);
+    return result;
+  }
+
+  bool visitTypedefType(TypedefType node) {
+    return node.unalias.accept(this);
   }
 }
 
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 723c78d..a78a3ab 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -23,42 +23,36 @@
   static String stackTraceVar(int depth) => ':stack_trace$depth';
 }
 
-void transformLibraries(
-    CoreTypes coreTypes, List<Library> libraries, bool syncAsync) {
+void transformLibraries(CoreTypes coreTypes, List<Library> libraries) {
   var helper = new HelperNodes.fromCoreTypes(coreTypes);
-  var rewriter = new RecursiveContinuationRewriter(helper, syncAsync);
+  var rewriter = new RecursiveContinuationRewriter(helper);
   for (var library in libraries) {
     rewriter.rewriteLibrary(library);
   }
 }
 
-Component transformComponent(
-    CoreTypes coreTypes, Component component, bool syncAsync) {
+Component transformComponent(CoreTypes coreTypes, Component component) {
   var helper = new HelperNodes.fromCoreTypes(coreTypes);
-  var rewriter = new RecursiveContinuationRewriter(helper, syncAsync);
+  var rewriter = new RecursiveContinuationRewriter(helper);
   return rewriter.rewriteComponent(component);
 }
 
-Procedure transformProcedure(
-    CoreTypes coreTypes, Procedure procedure, bool syncAsync) {
+Procedure transformProcedure(CoreTypes coreTypes, Procedure procedure) {
   var helper = new HelperNodes.fromCoreTypes(coreTypes);
-  var rewriter = new RecursiveContinuationRewriter(helper, syncAsync);
+  var rewriter = new RecursiveContinuationRewriter(helper);
   return rewriter.visitProcedure(procedure);
 }
 
 class RecursiveContinuationRewriter extends Transformer {
   final HelperNodes helper;
 
-  /// Whether `async` functions should start synchronously.
-  final bool syncAsync;
-
   final VariableDeclaration asyncJumpVariable = new VariableDeclaration(
       ContinuationVariables.awaitJumpVar,
       initializer: new IntLiteral(0));
   final VariableDeclaration asyncContextVariable =
       new VariableDeclaration(ContinuationVariables.awaitContextVar);
 
-  RecursiveContinuationRewriter(this.helper, this.syncAsync);
+  RecursiveContinuationRewriter(this.helper);
 
   Component rewriteComponent(Component node) {
     return node.accept(this);
@@ -76,15 +70,14 @@
     switch (node.asyncMarker) {
       case AsyncMarker.Sync:
       case AsyncMarker.SyncYielding:
-        node.transformChildren(
-            new RecursiveContinuationRewriter(helper, syncAsync));
+        node.transformChildren(new RecursiveContinuationRewriter(helper));
         return node;
       case AsyncMarker.SyncStar:
-        return new SyncStarFunctionRewriter(helper, node, syncAsync).rewrite();
+        return new SyncStarFunctionRewriter(helper, node).rewrite();
       case AsyncMarker.Async:
-        return new AsyncFunctionRewriter(helper, node, syncAsync).rewrite();
+        return new AsyncFunctionRewriter(helper, node).rewrite();
       case AsyncMarker.AsyncStar:
-        return new AsyncStarFunctionRewriter(helper, node, syncAsync).rewrite();
+        return new AsyncStarFunctionRewriter(helper, node).rewrite();
       default:
         return null;
     }
@@ -99,9 +92,8 @@
   int capturedTryDepth = 0; // Deepest yield point within a try-block.
   int capturedCatchDepth = 0; // Deepest yield point within a catch-block.
 
-  ContinuationRewriterBase(
-      HelperNodes helper, this.enclosingFunction, bool syncAsync)
-      : super(helper, syncAsync);
+  ContinuationRewriterBase(HelperNodes helper, this.enclosingFunction)
+      : super(helper);
 
   /// Given a container [type], which is an instantiation of the given
   /// [containerClass] extract its element type.
@@ -187,14 +179,13 @@
 class SyncStarFunctionRewriter extends ContinuationRewriterBase {
   final VariableDeclaration iteratorVariable;
 
-  SyncStarFunctionRewriter(
-      HelperNodes helper, FunctionNode enclosingFunction, syncAsync)
+  SyncStarFunctionRewriter(HelperNodes helper, FunctionNode enclosingFunction)
       : iteratorVariable = new VariableDeclaration(':iterator')
           ..type = new InterfaceType(helper.syncIteratorClass, [
             ContinuationRewriterBase.elementTypeFrom(
                 helper.iterableClass, enclosingFunction.returnType)
           ]),
-        super(helper, enclosingFunction, syncAsync);
+        super(helper, enclosingFunction);
 
   FunctionNode rewrite() {
     // :sync_op(:iterator) {
@@ -289,9 +280,8 @@
 
   ExpressionLifter expressionRewriter;
 
-  AsyncRewriterBase(
-      HelperNodes helper, FunctionNode enclosingFunction, bool syncAsync)
-      : super(helper, enclosingFunction, syncAsync) {}
+  AsyncRewriterBase(HelperNodes helper, FunctionNode enclosingFunction)
+      : super(helper, enclosingFunction) {}
 
   void setupAsyncContinuations(List<Statement> statements) {
     expressionRewriter = new ExpressionLifter(this);
@@ -904,9 +894,8 @@
 class AsyncStarFunctionRewriter extends AsyncRewriterBase {
   VariableDeclaration controllerVariable;
 
-  AsyncStarFunctionRewriter(
-      HelperNodes helper, FunctionNode enclosingFunction, bool syncAsync)
-      : super(helper, enclosingFunction, syncAsync);
+  AsyncStarFunctionRewriter(HelperNodes helper, FunctionNode enclosingFunction)
+      : super(helper, enclosingFunction);
 
   FunctionNode rewrite() {
     var statements = <Statement>[];
@@ -1022,9 +1011,8 @@
   VariableDeclaration completerVariable;
   VariableDeclaration returnVariable;
 
-  AsyncFunctionRewriter(
-      HelperNodes helper, FunctionNode enclosingFunction, bool syncAsync)
-      : super(helper, enclosingFunction, syncAsync);
+  AsyncFunctionRewriter(HelperNodes helper, FunctionNode enclosingFunction)
+      : super(helper, enclosingFunction);
 
   FunctionNode rewrite() {
     var statements = <Statement>[];
@@ -1042,28 +1030,16 @@
         new InterfaceType(helper.futureOrClass, <DartType>[valueType]);
     var completerTypeArguments = <DartType>[valueType];
 
-    if (syncAsync) {
-      final completerType = new InterfaceType(
-          helper.asyncAwaitCompleterClass, completerTypeArguments);
-      // final Completer<T> :async_completer = new _AsyncAwaitCompleter<T>();
-      completerVariable = new VariableDeclaration(":async_completer",
-          initializer: new ConstructorInvocation(
-              helper.asyncAwaitCompleterConstructor,
-              new Arguments([], types: completerTypeArguments))
-            ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
-          isFinal: true,
-          type: completerType);
-    } else {
-      final completerType =
-          new InterfaceType(helper.completerClass, completerTypeArguments);
-      // final Completer<T> :async_completer = new Completer<T>.sync();
-      completerVariable = new VariableDeclaration(":async_completer",
-          initializer: new StaticInvocation(helper.completerConstructor,
-              new Arguments([], types: completerTypeArguments))
-            ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
-          isFinal: true,
-          type: completerType);
-    }
+    final completerType = new InterfaceType(
+        helper.asyncAwaitCompleterClass, completerTypeArguments);
+    // final Completer<T> :async_completer = new _AsyncAwaitCompleter<T>();
+    completerVariable = new VariableDeclaration(":async_completer",
+        initializer: new ConstructorInvocation(
+            helper.asyncAwaitCompleterConstructor,
+            new Arguments([], types: completerTypeArguments))
+          ..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
+        isFinal: true,
+        type: completerType);
     statements.add(completerVariable);
 
     returnVariable = new VariableDeclaration(":return_value", type: returnType);
@@ -1071,23 +1047,13 @@
 
     setupAsyncContinuations(statements);
 
-    if (syncAsync) {
-      // :async_completer.start(:async_op);
-      var startStatement = new ExpressionStatement(new MethodInvocation(
-          new VariableGet(completerVariable),
-          new Name('start'),
-          new Arguments([new VariableGet(nestedClosureVariable)]))
-        ..fileOffset = enclosingFunction.fileOffset);
-      statements.add(startStatement);
-    } else {
-      // new Future.microtask(:async_op);
-      var newMicrotaskStatement = new ExpressionStatement(new StaticInvocation(
-          helper.futureMicrotaskConstructor,
-          new Arguments([new VariableGet(nestedClosureVariable)],
-              types: [const DynamicType()]))
-        ..fileOffset = enclosingFunction.fileOffset);
-      statements.add(newMicrotaskStatement);
-    }
+    // :async_completer.start(:async_op);
+    var startStatement = new ExpressionStatement(new MethodInvocation(
+        new VariableGet(completerVariable),
+        new Name('start'),
+        new Arguments([new VariableGet(nestedClosureVariable)]))
+      ..fileOffset = enclosingFunction.fileOffset);
+    statements.add(startStatement);
     // return :async_completer.future;
     var completerGet = new VariableGet(completerVariable);
     var returnStatement = new ReturnStatement(new PropertyGet(completerGet,
@@ -1152,22 +1118,16 @@
   final Member asyncStarMoveNextHelper;
   final Procedure asyncThenWrapper;
   final Procedure awaitHelper;
-  final Class completerClass;
   final Class asyncAwaitCompleterClass;
-  final Member completerComplete;
   final Member completerCompleteError;
-  final Member completerConstructor;
   final Member asyncAwaitCompleterConstructor;
   final Member completeOnAsyncReturn;
   final Member completerFuture;
   final Library coreLibrary;
   final CoreTypes coreTypes;
   final Class futureClass;
-  final Procedure futureMicrotaskConstructor;
   final Class futureOrClass;
   final Class iterableClass;
-  final Class iteratorClass;
-  final Procedure printProcedure;
   final Class streamClass;
   final Member streamIteratorCancel;
   final Class streamIteratorClass;
@@ -1196,22 +1156,16 @@
       this.asyncStarMoveNextHelper,
       this.asyncThenWrapper,
       this.awaitHelper,
-      this.completerClass,
       this.asyncAwaitCompleterClass,
-      this.completerComplete,
       this.completerCompleteError,
-      this.completerConstructor,
       this.asyncAwaitCompleterConstructor,
       this.completeOnAsyncReturn,
       this.completerFuture,
       this.coreLibrary,
       this.coreTypes,
       this.futureClass,
-      this.futureMicrotaskConstructor,
       this.futureOrClass,
       this.iterableClass,
-      this.iteratorClass,
-      this.printProcedure,
       this.streamClass,
       this.streamIteratorCancel,
       this.streamIteratorClass,
@@ -1241,22 +1195,16 @@
         coreTypes.asyncStarMoveNextHelper,
         coreTypes.asyncThenWrapperHelperProcedure,
         coreTypes.awaitHelperProcedure,
-        coreTypes.completerClass,
         coreTypes.asyncAwaitCompleterClass,
-        coreTypes.completerComplete,
         coreTypes.completerCompleteError,
-        coreTypes.completerSyncConstructor,
         coreTypes.asyncAwaitCompleterConstructor,
         coreTypes.completeOnAsyncReturn,
         coreTypes.completerFuture,
         coreTypes.coreLibrary,
         coreTypes,
         coreTypes.futureClass,
-        coreTypes.futureMicrotaskConstructor,
         coreTypes.futureOrClass,
         coreTypes.iterableClass,
-        coreTypes.iteratorClass,
-        coreTypes.printProcedure,
         coreTypes.streamClass,
         coreTypes.streamIteratorCancel,
         coreTypes.streamIteratorClass,
diff --git a/pkg/kernel/lib/transformations/treeshaker.dart b/pkg/kernel/lib/transformations/treeshaker.dart
index 4ab0c38..07218c9 100644
--- a/pkg/kernel/lib/transformations/treeshaker.dart
+++ b/pkg/kernel/lib/transformations/treeshaker.dart
@@ -663,14 +663,15 @@
   final TreeShaker shaker;
   final CoreTypes coreTypes;
   final TypeEnvironment types;
-  final bool strongMode;
+  final bool legacyMode;
   List<Node> summary;
 
   _TreeShakerVisitor(TreeShaker shaker)
       : this.shaker = shaker,
         this.coreTypes = shaker.coreTypes,
-        this.strongMode = !shaker.legacyMode,
-        this.types = new TypeEnvironment(shaker.coreTypes, shaker.hierarchy) {
+        this.legacyMode = shaker.legacyMode,
+        this.types = new TypeEnvironment(shaker.coreTypes, shaker.hierarchy,
+            legacyMode: true) {
     types.errorHandler = handleError;
   }
 
@@ -795,7 +796,7 @@
   }
 
   Class getStaticType(Expression node) {
-    if (!strongMode) return coreTypes.objectClass;
+    if (legacyMode) return coreTypes.objectClass;
     return getKnownSupertype(node.getStaticType(types));
   }
 
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index 625bc5b..094bd2f 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -5,8 +5,6 @@
 
 import 'ast.dart';
 
-import 'util/graph.dart';
-
 /// Returns a type where all occurrences of the given type parameters have been
 /// replaced with the corresponding types.
 ///
@@ -68,126 +66,6 @@
   return substitutor.isInfinite ? null : result;
 }
 
-/// Calculates bounds to be provided as type arguments in place of missing type
-/// arguments on raw types with the given type parameters.
-///
-/// See the [description]
-/// (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/instantiate-to-bound.md)
-/// of the algorithm for details.
-List<DartType> calculateBounds(
-    List<TypeParameter> typeParameters, Class object) {
-  List<DartType> bounds = new List<DartType>(typeParameters.length);
-  for (int i = 0; i < typeParameters.length; i++) {
-    DartType bound = typeParameters[i].bound;
-    if (bound == null) {
-      bound = const DynamicType();
-    } else if (bound is InterfaceType && bound.classNode == object) {
-      DartType defaultType = typeParameters[i].defaultType;
-      if (!(defaultType is InterfaceType && defaultType.classNode == object)) {
-        bound = const DynamicType();
-      }
-    }
-    bounds[i] = bound;
-  }
-
-  _TypeVariableGraph graph = new _TypeVariableGraph(typeParameters, bounds);
-  List<List<int>> stronglyConnected = computeStrongComponents(graph);
-  for (List<int> component in stronglyConnected) {
-    Map<TypeParameter, DartType> dynamicSubstitution =
-        <TypeParameter, DartType>{};
-    Map<TypeParameter, DartType> nullSubstitution = <TypeParameter, DartType>{};
-    for (int typeParameterIndex in component) {
-      dynamicSubstitution[typeParameters[typeParameterIndex]] =
-          const DynamicType();
-      nullSubstitution[typeParameters[typeParameterIndex]] = const BottomType();
-    }
-    _TopSubstitutor substitutor = new _TopSubstitutor(
-        Substitution.fromUpperAndLowerBounds(
-            dynamicSubstitution, nullSubstitution),
-        false);
-    for (int typeParameterIndex in component) {
-      bounds[typeParameterIndex] =
-          substitutor.visit(bounds[typeParameterIndex]);
-    }
-  }
-
-  for (int i = 0; i < typeParameters.length; i++) {
-    Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
-    Map<TypeParameter, DartType> nullSubstitution = <TypeParameter, DartType>{};
-    substitution[typeParameters[i]] = bounds[i];
-    nullSubstitution[typeParameters[i]] = const BottomType();
-    _TopSubstitutor substitutor = new _TopSubstitutor(
-        Substitution.fromUpperAndLowerBounds(substitution, nullSubstitution),
-        false);
-    for (int j = 0; j < typeParameters.length; j++) {
-      bounds[j] = substitutor.visit(bounds[j]);
-    }
-  }
-
-  return bounds;
-}
-
-class _TypeVariableGraph extends Graph<int> {
-  List<int> vertices;
-  List<TypeParameter> typeParameters;
-  List<DartType> bounds;
-
-  // `edges[i]` is the list of indices of type variables that reference the type
-  // variable with the index `i` in their bounds.
-  List<List<int>> edges;
-
-  _TypeVariableGraph(this.typeParameters, this.bounds) {
-    assert(typeParameters.length == bounds.length);
-
-    vertices = new List<int>(typeParameters.length);
-    Map<TypeParameter, int> typeParameterIndices = <TypeParameter, int>{};
-    edges = new List<List<int>>(typeParameters.length);
-    for (int i = 0; i < vertices.length; i++) {
-      vertices[i] = i;
-      typeParameterIndices[typeParameters[i]] = i;
-      edges[i] = <int>[];
-    }
-
-    for (int i = 0; i < vertices.length; i++) {
-      _OccurrenceCollectorVisitor collector =
-          new _OccurrenceCollectorVisitor(typeParameters.toSet());
-      collector.visit(bounds[i]);
-      for (TypeParameter typeParameter in collector.occurred) {
-        edges[typeParameterIndices[typeParameter]].add(i);
-      }
-    }
-  }
-
-  Iterable<int> neighborsOf(int index) {
-    return edges[index];
-  }
-}
-
-DartType instantiateToBounds(DartType type, Class object) {
-  if (type is InterfaceType) {
-    for (var typeArgument in type.typeArguments) {
-      // If at least one of the arguments is not dynamic, we assume that the
-      // type is not raw and does not need instantiation of its type parameters
-      // to their bounds.
-      if (typeArgument is! DynamicType) {
-        return type;
-      }
-    }
-    return new InterfaceType.byReference(
-        type.className, calculateBounds(type.classNode.typeParameters, object));
-  }
-  if (type is TypedefType) {
-    for (var typeArgument in type.typeArguments) {
-      if (typeArgument is! DynamicType) {
-        return type;
-      }
-    }
-    return new TypedefType.byReference(type.typedefReference,
-        calculateBounds(type.typedefNode.typeParameters, object));
-  }
-  return type;
-}
-
 /// Returns true if [type] contains a reference to any of the given [variables].
 ///
 /// It is an error to call this with a [type] that contains a [FunctionType]
@@ -252,7 +130,8 @@
       namedParameters: type.namedParameters.map(substituteNamed).toList(),
       typeParameters: freshTypeParameters,
       requiredParameterCount: type.requiredParameterCount,
-      typedefReference: type.typedefReference);
+      typedefType:
+          type.typedefType == null ? null : substitute(type.typedefType));
 
   DartType substitute(DartType type) => substitution.substituteType(type);
 
@@ -582,12 +461,14 @@
         : node.namedParameters.map(inner.visitNamedType).toList();
     inner.invertVariance();
     var returnType = inner.visit(node.returnType);
+    DartType typedefType =
+        node.typedefType == null ? null : inner.visit(node.typedefType);
     if (this.useCounter == before) return node;
     return new FunctionType(positionalParameters, returnType,
         namedParameters: namedParameters,
         typeParameters: typeParameters,
         requiredParameterCount: node.requiredParameterCount,
-        typedefReference: node.typedefReference);
+        typedefType: typedefType);
   }
 
   void bumpCountersUntil(_TypeSubstitutor target) {
@@ -851,52 +732,3 @@
     return node.defaultType.accept(this);
   }
 }
-
-class _OccurrenceCollectorVisitor extends DartTypeVisitor {
-  final Set<TypeParameter> typeParameters;
-  Set<TypeParameter> occurred = new Set<TypeParameter>();
-
-  _OccurrenceCollectorVisitor(this.typeParameters);
-
-  visit(DartType node) => node.accept(this);
-
-  visitNamedType(NamedType node) {
-    node.type.accept(this);
-  }
-
-  visitInvalidType(InvalidType node);
-  visitDynamicType(DynamicType node);
-  visitVoidType(VoidType node);
-
-  visitInterfaceType(InterfaceType node) {
-    for (DartType argument in node.typeArguments) {
-      argument.accept(this);
-    }
-  }
-
-  visitTypedefType(TypedefType node) {
-    for (DartType argument in node.typeArguments) {
-      argument.accept(this);
-    }
-  }
-
-  visitFunctionType(FunctionType node) {
-    for (TypeParameter typeParameter in node.typeParameters) {
-      typeParameter.bound.accept(this);
-      typeParameter.defaultType?.accept(this);
-    }
-    for (DartType parameter in node.positionalParameters) {
-      parameter.accept(this);
-    }
-    for (NamedType namedParameter in node.namedParameters) {
-      namedParameter.type.accept(this);
-    }
-    node.returnType.accept(this);
-  }
-
-  visitTypeParameterType(TypeParameterType node) {
-    if (typeParameters.contains(node.parameter)) {
-      occurred.add(node.parameter);
-    }
-  }
-}
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index 850b2dd..11503d0 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -9,7 +9,7 @@
 import 'type_algebra.dart';
 import 'type_environment.dart';
 
-/// Performs strong-mode type checking on the kernel IR.
+/// Performs type checking on the kernel IR.
 ///
 /// A concrete subclass of [TypeChecker] must implement [checkAssignable] and
 /// [fail] in order to deal with subtyping requirements and error handling.
@@ -22,7 +22,7 @@
   TypeChecker(this.coreTypes, this.hierarchy,
       {bool legacyMode: false, this.ignoreSdk: true})
       : environment =
-            new TypeEnvironment(coreTypes, hierarchy, strongMode: !legacyMode);
+            new TypeEnvironment(coreTypes, hierarchy, legacyMode: legacyMode);
 
   void checkComponent(Component component) {
     for (var library in component.libraries) {
@@ -34,7 +34,7 @@
         });
       }
     }
-    var visitor = new TypeCheckingVisitor(this, environment);
+    var visitor = new TypeCheckingVisitor(this, environment, hierarchy);
     for (var library in component.libraries) {
       if (ignoreSdk && library.importUri.scheme == 'dart') continue;
       for (var class_ in library.classes) {
@@ -116,12 +116,12 @@
         InitializerVisitor<Null> {
   final TypeChecker checker;
   final TypeEnvironment environment;
+  final ClassHierarchy hierarchy;
 
   CoreTypes get coreTypes => environment.coreTypes;
-  ClassHierarchy get hierarchy => environment.hierarchy;
   Class get currentClass => environment.thisType.classNode;
 
-  TypeCheckingVisitor(this.checker, this.environment);
+  TypeCheckingVisitor(this.checker, this.environment, this.hierarchy);
 
   void checkAssignable(TreeNode where, DartType from, DartType to) {
     checker.checkAssignable(where, from, to);
@@ -515,6 +515,15 @@
   }
 
   @override
+  DartType visitSetLiteral(SetLiteral node) {
+    for (int i = 0; i < node.expressions.length; ++i) {
+      node.expressions[i] =
+          checkAndDowncastExpression(node.expressions[i], node.typeArgument);
+    }
+    return environment.literalSetType(node.typeArgument);
+  }
+
+  @override
   DartType visitLogicalExpression(LogicalExpression node) {
     node.left = checkAndDowncastExpression(node.left, environment.boolType);
     node.right = checkAndDowncastExpression(node.right, environment.boolType);
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 5e216eb..b532e87 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -8,12 +8,17 @@
 import 'core_types.dart';
 import 'type_algebra.dart';
 
+import 'src/hierarchy_based_type_environment.dart'
+    show HierarchyBasedTypeEnvironment;
+
 typedef void ErrorHandler(TreeNode node, String message);
 
-class TypeEnvironment extends SubtypeTester {
+abstract class TypeEnvironment extends SubtypeTester {
   final CoreTypes coreTypes;
-  final ClassHierarchy hierarchy;
-  final bool strongMode;
+
+  @override
+  final bool legacyMode;
+
   InterfaceType thisType;
 
   DartType returnType;
@@ -24,7 +29,13 @@
   /// be tolerated.  See [typeError].
   ErrorHandler errorHandler;
 
-  TypeEnvironment(this.coreTypes, this.hierarchy, {this.strongMode: false});
+  TypeEnvironment.fromSubclass(this.coreTypes, {this.legacyMode: false});
+
+  factory TypeEnvironment(CoreTypes coreTypes, ClassHierarchy hierarchy,
+      {bool legacyMode: false}) {
+    return new HierarchyBasedTypeEnvironment(coreTypes, hierarchy,
+        legacyMode: legacyMode);
+  }
 
   InterfaceType get objectType => coreTypes.objectClass.rawType;
   InterfaceType get nullType => coreTypes.nullClass.rawType;
@@ -45,6 +56,10 @@
     return new InterfaceType(coreTypes.listClass, <DartType>[elementType]);
   }
 
+  InterfaceType literalSetType(DartType elementType) {
+    return new InterfaceType(coreTypes.setClass, <DartType>[elementType]);
+  }
+
   InterfaceType literalMapType(DartType key, DartType value) {
     return new InterfaceType(coreTypes.mapClass, <DartType>[key, value]);
   }
@@ -75,8 +90,7 @@
       // we aren't concerned with it.  If a class implements multiple
       // instantiations of Future, getTypeAsInstanceOf is responsible for
       // picking the least one in the sense required by the spec.
-      InterfaceType future =
-          hierarchy.getTypeAsInstanceOf(type, coreTypes.futureClass);
+      InterfaceType future = getTypeAsInstanceOf(type, coreTypes.futureClass);
       if (future != null) {
         return future.typeArguments[0];
       }
@@ -136,278 +150,6 @@
     if (type1 == doubleType || type2 == doubleType) return doubleType;
     return numType;
   }
-
-  /// Returns true if [class_] has no proper subtypes that are usable as type
-  /// argument.
-  bool isSealedClass(Class class_) {
-    // The sealed core classes have subtypes in the patched SDK, but those
-    // classes cannot occur as type argument.
-    if (class_ == coreTypes.intClass ||
-        class_ == coreTypes.doubleClass ||
-        class_ == coreTypes.stringClass ||
-        class_ == coreTypes.boolClass ||
-        class_ == coreTypes.nullClass) {
-      return true;
-    }
-    return !hierarchy.hasProperSubtypes(class_);
-  }
-
-  bool isObject(DartType type) {
-    return type is InterfaceType && type.classNode == objectType.classNode;
-  }
-
-  bool isNull(DartType type) {
-    return type is InterfaceType && type.classNode == nullType.classNode;
-  }
-
-  /// Replaces all covariant occurrences of `dynamic`, `Object`, and `void` with
-  /// [BottomType] and all contravariant occurrences of `Null` and [BottomType]
-  /// with `Object`.
-  DartType convertSuperBoundedToRegularBounded(DartType type,
-      {bool isCovariant = true}) {
-    if ((type is DynamicType || type is VoidType || isObject(type)) &&
-        isCovariant) {
-      return const BottomType();
-    } else if ((type is BottomType || isNull(type)) && !isCovariant) {
-      return objectType;
-    } else if (type is InterfaceType && type.classNode.typeParameters != null) {
-      List<DartType> replacedTypeArguments =
-          new List<DartType>(type.typeArguments.length);
-      for (int i = 0; i < replacedTypeArguments.length; i++) {
-        replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
-            type.typeArguments[i],
-            isCovariant: isCovariant);
-      }
-      return new InterfaceType(type.classNode, replacedTypeArguments);
-    } else if (type is TypedefType && type.typedefNode.typeParameters != null) {
-      List<DartType> replacedTypeArguments =
-          new List<DartType>(type.typeArguments.length);
-      for (int i = 0; i < replacedTypeArguments.length; i++) {
-        replacedTypeArguments[i] = convertSuperBoundedToRegularBounded(
-            type.typeArguments[i],
-            isCovariant: isCovariant);
-      }
-      return new TypedefType(type.typedefNode, replacedTypeArguments);
-    } else if (type is FunctionType) {
-      var replacedReturnType = convertSuperBoundedToRegularBounded(
-          type.returnType,
-          isCovariant: isCovariant);
-      var replacedPositionalParameters =
-          new List<DartType>(type.positionalParameters.length);
-      for (int i = 0; i < replacedPositionalParameters.length; i++) {
-        replacedPositionalParameters[i] = convertSuperBoundedToRegularBounded(
-            type.positionalParameters[i],
-            isCovariant: !isCovariant);
-      }
-      var replacedNamedParameters =
-          new List<NamedType>(type.namedParameters.length);
-      for (int i = 0; i < replacedNamedParameters.length; i++) {
-        replacedNamedParameters[i] = new NamedType(
-            type.namedParameters[i].name,
-            convertSuperBoundedToRegularBounded(type.namedParameters[i].type,
-                isCovariant: !isCovariant));
-      }
-      return new FunctionType(replacedPositionalParameters, replacedReturnType,
-          namedParameters: replacedNamedParameters,
-          typeParameters: type.typeParameters,
-          requiredParameterCount: type.requiredParameterCount,
-          typedefReference: type.typedefReference);
-    }
-    return type;
-  }
-
-  // TODO(dmitryas):  Remove [typedefInstantiations] when type arguments passed
-  // to typedefs are preserved in the Kernel output.
-  List<Object> findBoundViolations(DartType type,
-      {bool allowSuperBounded = false,
-      Map<FunctionType, List<DartType>> typedefInstantiations}) {
-    List<TypeParameter> variables;
-    List<DartType> arguments;
-    List<Object> typedefRhsResult;
-
-    if (typedefInstantiations != null &&
-        typedefInstantiations.containsKey(type)) {
-      // [type] is a function type that is an application of a parametrized
-      // typedef.  We need to check both the l.h.s. and the r.h.s. of the
-      // definition in that case.  For details, see [link]
-      // (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/super-bounded-types.md).
-      FunctionType functionType = type;
-      FunctionType cloned = new FunctionType(
-          functionType.positionalParameters, functionType.returnType,
-          namedParameters: functionType.namedParameters,
-          typeParameters: functionType.typeParameters,
-          requiredParameterCount: functionType.requiredParameterCount,
-          typedefReference: null);
-      typedefRhsResult = findBoundViolations(cloned,
-          allowSuperBounded: true,
-          typedefInstantiations: typedefInstantiations);
-      type = new TypedefType(functionType.typedef, typedefInstantiations[type]);
-    }
-
-    if (type is InterfaceType) {
-      variables = type.classNode.typeParameters;
-      arguments = type.typeArguments;
-    } else if (type is TypedefType) {
-      variables = type.typedefNode.typeParameters;
-      arguments = type.typeArguments;
-    } else if (type is FunctionType) {
-      List<Object> result = <Object>[];
-      for (TypeParameter parameter in type.typeParameters) {
-        result.addAll(findBoundViolations(parameter.bound,
-                allowSuperBounded: true,
-                typedefInstantiations: typedefInstantiations) ??
-            const <Object>[]);
-      }
-      for (DartType formal in type.positionalParameters) {
-        result.addAll(findBoundViolations(formal,
-                allowSuperBounded: true,
-                typedefInstantiations: typedefInstantiations) ??
-            const <Object>[]);
-      }
-      for (NamedType named in type.namedParameters) {
-        result.addAll(findBoundViolations(named.type,
-                allowSuperBounded: true,
-                typedefInstantiations: typedefInstantiations) ??
-            const <Object>[]);
-      }
-      result.addAll(findBoundViolations(type.returnType,
-              allowSuperBounded: true,
-              typedefInstantiations: typedefInstantiations) ??
-          const <Object>[]);
-      return result.isEmpty ? null : result;
-    } else {
-      return null;
-    }
-
-    if (variables == null) return null;
-
-    List<Object> result;
-    List<Object> argumentsResult;
-
-    Map<TypeParameter, DartType> substitutionMap =
-        new Map<TypeParameter, DartType>.fromIterables(variables, arguments);
-    for (int i = 0; i < arguments.length; ++i) {
-      DartType argument = arguments[i];
-      if (argument is FunctionType && argument.typeParameters.length > 0) {
-        // Generic function types aren't allowed as type arguments either.
-        result ??= <Object>[];
-        result.add(argument);
-        result.add(variables[i]);
-        result.add(type);
-      } else if (!isSubtypeOf(
-          argument, substitute(variables[i].bound, substitutionMap))) {
-        result ??= <Object>[];
-        result.add(argument);
-        result.add(variables[i]);
-        result.add(type);
-      }
-
-      List<Object> violations = findBoundViolations(argument,
-          allowSuperBounded: true,
-          typedefInstantiations: typedefInstantiations);
-      if (violations != null) {
-        argumentsResult ??= <Object>[];
-        argumentsResult.addAll(violations);
-      }
-    }
-    if (argumentsResult != null) {
-      result ??= <Object>[];
-      result.addAll(argumentsResult);
-    }
-    if (typedefRhsResult != null) {
-      result ??= <Object>[];
-      result.addAll(typedefRhsResult);
-    }
-
-    // [type] is regular-bounded.
-    if (result == null) return null;
-    if (!allowSuperBounded) return result;
-
-    result = null;
-    type = convertSuperBoundedToRegularBounded(type);
-    List<DartType> argumentsToReport = arguments.toList();
-    if (type is InterfaceType) {
-      variables = type.classNode.typeParameters;
-      arguments = type.typeArguments;
-    } else if (type is TypedefType) {
-      variables = type.typedefNode.typeParameters;
-      arguments = type.typeArguments;
-    }
-    substitutionMap =
-        new Map<TypeParameter, DartType>.fromIterables(variables, arguments);
-    for (int i = 0; i < arguments.length; ++i) {
-      DartType argument = arguments[i];
-      if (argument is FunctionType && argument.typeParameters.length > 0) {
-        // Generic function types aren't allowed as type arguments either.
-        result ??= <Object>[];
-        result.add(argumentsToReport[i]);
-        result.add(variables[i]);
-        result.add(type);
-      } else if (!isSubtypeOf(
-          argument, substitute(variables[i].bound, substitutionMap))) {
-        result ??= <Object>[];
-        result.add(argumentsToReport[i]);
-        result.add(variables[i]);
-        result.add(type);
-      }
-    }
-    if (argumentsResult != null) {
-      result ??= <Object>[];
-      result.addAll(argumentsResult);
-    }
-    if (typedefRhsResult != null) {
-      result ??= <Object>[];
-      result.addAll(typedefRhsResult);
-    }
-    return result;
-  }
-
-  // TODO(dmitryas):  Remove [typedefInstantiations] when type arguments passed
-  // to typedefs are preserved in the Kernel output.
-  List<Object> findBoundViolationsElementwise(
-      List<TypeParameter> parameters, List<DartType> arguments,
-      {Map<FunctionType, List<DartType>> typedefInstantiations}) {
-    assert(arguments.length == parameters.length);
-    List<Object> result;
-    var substitutionMap = <TypeParameter, DartType>{};
-    for (int i = 0; i < arguments.length; ++i) {
-      substitutionMap[parameters[i]] = arguments[i];
-    }
-    for (int i = 0; i < arguments.length; ++i) {
-      DartType argument = arguments[i];
-      if (argument is FunctionType && argument.typeParameters.length > 0) {
-        // Generic function types aren't allowed as type arguments either.
-        result ??= <Object>[];
-        result.add(argument);
-        result.add(parameters[i]);
-        result.add(null);
-      } else if (!isSubtypeOf(
-          argument, substitute(parameters[i].bound, substitutionMap))) {
-        result ??= <Object>[];
-        result.add(argument);
-        result.add(parameters[i]);
-        result.add(null);
-      }
-
-      List<Object> violations = findBoundViolations(argument,
-          allowSuperBounded: true,
-          typedefInstantiations: typedefInstantiations);
-      if (violations != null) {
-        result ??= <Object>[];
-        result.addAll(violations);
-      }
-    }
-    return result;
-  }
-
-  String getGenericTypeName(DartType type) {
-    if (type is InterfaceType) {
-      return type.classNode.name;
-    } else if (type is TypedefType) {
-      return type.typedefNode.name;
-    }
-    return type.toString();
-  }
 }
 
 /// The part of [TypeEnvironment] that deals with subtype tests.
@@ -417,15 +159,16 @@
   InterfaceType get objectType;
   InterfaceType get nullType;
   InterfaceType get rawFunctionType;
-  ClassHierarchy get hierarchy;
   Class get futureOrClass;
   InterfaceType futureType(DartType type);
-  bool get strongMode;
+  bool get legacyMode;
+
+  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass);
 
   /// Determines if the given type is at the bottom of the type hierarchy.  May
   /// be overridden in subclasses.
   bool isBottom(DartType type) =>
-      type is BottomType || (strongMode && type == nullType);
+      type is BottomType || (!legacyMode && type == nullType);
 
   /// Determines if the given type is at the top of the type hierarchy.  May be
   /// overridden in subclasses.
@@ -441,7 +184,7 @@
     if (isTop(supertype)) return true;
 
     // Handle FutureOr<T> union type.
-    if (strongMode &&
+    if (!legacyMode &&
         subtype is InterfaceType &&
         identical(subtype.classNode, futureOrClass)) {
       var subtypeArg = subtype.typeArguments[0];
@@ -459,7 +202,7 @@
           isSubtypeOf(subtypeArg, supertype);
     }
 
-    if (strongMode &&
+    if (!legacyMode &&
         supertype is InterfaceType &&
         identical(supertype.classNode, futureOrClass)) {
       // given t2 is Future<A> | A, then:
@@ -471,8 +214,7 @@
     }
 
     if (subtype is InterfaceType && supertype is InterfaceType) {
-      var upcastType =
-          hierarchy.getTypeAsInstanceOf(subtype, supertype.classNode);
+      var upcastType = getTypeAsInstanceOf(subtype, supertype.classNode);
       if (upcastType == null) return false;
       for (int i = 0; i < upcastType.typeArguments.length; ++i) {
         // Termination: the 'supertype' parameter decreases in size.
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 3d8e362..85a8177 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -86,7 +86,8 @@
           node,
           "Incorrect parent pointer on ${node.runtimeType}:"
           " expected '${currentParent.runtimeType}',"
-          " but found: '${node.parent.runtimeType}'.");
+          " but found: '${node.parent.runtimeType}'.",
+          context: currentParent);
     }
     var oldParent = currentParent;
     currentParent = node;
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index ad879a2..79a3be8 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -46,6 +46,7 @@
   R visitRethrow(Rethrow node) => defaultExpression(node);
   R visitThrow(Throw node) => defaultExpression(node);
   R visitListLiteral(ListLiteral node) => defaultExpression(node);
+  R visitSetLiteral(SetLiteral node) => defaultExpression(node);
   R visitMapLiteral(MapLiteral node) => defaultExpression(node);
   R visitAwaitExpression(AwaitExpression node) => defaultExpression(node);
   R visitFunctionExpression(FunctionExpression node) => defaultExpression(node);
@@ -167,6 +168,7 @@
   R visitRethrow(Rethrow node) => defaultExpression(node);
   R visitThrow(Throw node) => defaultExpression(node);
   R visitListLiteral(ListLiteral node) => defaultExpression(node);
+  R visitSetLiteral(SetLiteral node) => defaultExpression(node);
   R visitMapLiteral(MapLiteral node) => defaultExpression(node);
   R visitAwaitExpression(AwaitExpression node) => defaultExpression(node);
   R visitFunctionExpression(FunctionExpression node) => defaultExpression(node);
@@ -249,6 +251,8 @@
 }
 
 class DartTypeVisitor<R> {
+  const DartTypeVisitor();
+
   R defaultDartType(DartType node) => null;
 
   R visitInvalidType(InvalidType node) => defaultDartType(node);
@@ -261,6 +265,20 @@
   R visitTypedefType(TypedefType node) => defaultDartType(node);
 }
 
+class DartTypeVisitor1<R, T> {
+  R defaultDartType(DartType node, T arg) => null;
+
+  R visitInvalidType(InvalidType node, T arg) => defaultDartType(node, arg);
+  R visitDynamicType(DynamicType node, T arg) => defaultDartType(node, arg);
+  R visitVoidType(VoidType node, T arg) => defaultDartType(node, arg);
+  R visitBottomType(BottomType node, T arg) => defaultDartType(node, arg);
+  R visitInterfaceType(InterfaceType node, T arg) => defaultDartType(node, arg);
+  R visitFunctionType(FunctionType node, T arg) => defaultDartType(node, arg);
+  R visitTypeParameterType(TypeParameterType node, T arg) =>
+      defaultDartType(node, arg);
+  R visitTypedefType(TypedefType node, T arg) => defaultDartType(node, arg);
+}
+
 class ConstantVisitor<R> {
   R defaultConstant(Constant node) => null;
 
@@ -277,6 +295,13 @@
       defaultConstant(node);
   R visitTearOffConstant(TearOffConstant node) => defaultConstant(node);
   R visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
+  R visitEnvironmentBoolConstant(EnvironmentBoolConstant node) =>
+      defaultConstant(node);
+  R visitEnvironmentIntConstant(EnvironmentIntConstant node) =>
+      defaultConstant(node);
+  R visitEnvironmentStringConstant(EnvironmentStringConstant node) =>
+      defaultConstant(node);
+  R visitUnevaluatedConstant(UnevaluatedConstant node) => defaultConstant(node);
 }
 
 class MemberReferenceVisitor<R> {
@@ -330,6 +355,13 @@
       defaultConstant(node);
   R visitTearOffConstant(TearOffConstant node) => defaultConstant(node);
   R visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
+  R visitEnvironmentBoolConstant(EnvironmentBoolConstant node) =>
+      defaultConstant(node);
+  R visitEnvironmentIntConstant(EnvironmentIntConstant node) =>
+      defaultConstant(node);
+  R visitEnvironmentStringConstant(EnvironmentStringConstant node) =>
+      defaultConstant(node);
+  R visitUnevaluatedConstant(UnevaluatedConstant node) => defaultConstant(node);
 
   // Class references
   R visitClassReference(Class node) => null;
@@ -362,6 +394,14 @@
       defaultConstantReference(node);
   R visitTypeLiteralConstantReference(TypeLiteralConstant node) =>
       defaultConstantReference(node);
+  R visitEnvironmentBoolConstantReference(EnvironmentBoolConstant node) =>
+      defaultConstantReference(node);
+  R visitEnvironmentIntConstantReference(EnvironmentIntConstant node) =>
+      defaultConstantReference(node);
+  R visitEnvironmentStringConstantReference(EnvironmentStringConstant node) =>
+      defaultConstantReference(node);
+  R visitUnevaluatedConstantReference(UnevaluatedConstant node) =>
+      defaultConstantReference(node);
 
   // Member references
   R defaultMemberReference(Member node) => null;
@@ -480,6 +520,7 @@
   R visitRethrow(Rethrow node, T arg) => defaultExpression(node, arg);
   R visitThrow(Throw node, T arg) => defaultExpression(node, arg);
   R visitListLiteral(ListLiteral node, T arg) => defaultExpression(node, arg);
+  R visitSetLiteral(SetLiteral node, T arg) => defaultExpression(node, arg);
   R visitMapLiteral(MapLiteral node, T arg) => defaultExpression(node, arg);
   R visitAwaitExpression(AwaitExpression node, T arg) =>
       defaultExpression(node, arg);
diff --git a/pkg/kernel/lib/vm/constants_native_effects.dart b/pkg/kernel/lib/vm/constants_native_effects.dart
index 167d82b..e3611d2 100644
--- a/pkg/kernel/lib/vm/constants_native_effects.dart
+++ b/pkg/kernel/lib/vm/constants_native_effects.dart
@@ -137,8 +137,8 @@
       kvListPairs[2 * i] = entry.key;
       kvListPairs[2 * i + 1] = entry.value;
     }
-    // Strong mode is a bit fishy here, since we merge the key and the value
-    // type by putting both into the same list!
+    // This is a bit fishy, since we merge the key and the value type by
+    // putting both into the same list.
     final kvListConstant = new ListConstant(const DynamicType(), kvListPairs);
     assert(immutableMapClass.fields.length == 1);
     final Field kvPairListField = immutableMapClass.fields[0];
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index 0f1e39a..f9ee3da 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -1,7 +1,7 @@
 name: kernel
 # Currently, kernel API is not stable and users should
 # not depend on semver semantics when depending on this package.
-version: 0.3.6
+version: 0.3.8
 author: Dart Team <misc@dartlang.org>
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
@@ -10,10 +10,10 @@
 dependencies:
   path: ^1.3.9
   args: '>=0.13.4 <2.0.0'
-  logging: ^0.11.2
-  package_config: ^1.0.0
 dev_dependencies:
-  front_end: 0.1.6
+  expect:
+    path: ../expect
+  front_end: 0.1.8
   test: ^1.3.4
   stack_trace: ^1.6.6
   test_reflective_loader: ^0.1.0
diff --git a/pkg/kernel/runtime/reify/types.dart b/pkg/kernel/runtime/reify/types.dart
index 96ffcd8..f119342 100644
--- a/pkg/kernel/runtime/reify/types.dart
+++ b/pkg/kernel/runtime/reify/types.dart
@@ -633,7 +633,7 @@
       }
     }
 
-    if (!other.hasNamedParameters) true;
+    if (!other.hasNamedParameters) return true;
 
     int j = positionalParameters;
     for (int i = otherPositionalParameters;
diff --git a/pkg/kernel/test/class_hierarchy_bench.dart b/pkg/kernel/test/class_hierarchy_bench.dart
index cab6148..92ef9cf 100644
--- a/pkg/kernel/test/class_hierarchy_bench.dart
+++ b/pkg/kernel/test/class_hierarchy_bench.dart
@@ -68,15 +68,6 @@
     return hierarchies[currentHierarchy];
   }
 
-  {
-    var classHierarchy = getClassHierarchy();
-    if (classHierarchy is ClosedWorldClassHierarchy) {
-      for (Class class_ in classes) {
-        classHierarchy.hasProperSubtypes(class_);
-      }
-    }
-  }
-
   Random rnd = new Random(12345);
   const int numQueryTrials = 100000;
 
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 10b2ba2..956c0cf 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -45,7 +45,6 @@
 
     // No updated classes, the same hierarchy.
     expect(hierarchy.applyTreeChanges([], []), same(hierarchy));
-    expect(hierarchy.hasProperSubtypes(a), true);
 
     // Has updated classes, still the same hierarchy (instance). Can answer
     // queries about the new classes.
@@ -59,11 +58,9 @@
     expect(hierarchy.applyTreeChanges([libWithB], [libWithC]), same(hierarchy));
     expect(hierarchy.isSubclassOf(a, c), false);
     expect(hierarchy.isSubclassOf(c, a), true);
-    expect(hierarchy.hasProperSubtypes(a), true);
 
     // Remove so A should no longer be a super of anything.
     expect(hierarchy.applyTreeChanges([libWithC], []), same(hierarchy));
-    expect(hierarchy.hasProperSubtypes(a), false);
   }
 
   void test_applyMemberChanges() {
@@ -650,7 +647,7 @@
   }
 
   /// Copy of the tests/language/least_upper_bound_expansive_test.dart test.
-  void test_getClassicLeastUpperBound_expansive() {
+  void test_getLegacyLeastUpperBound_expansive() {
     var int = coreTypes.intClass.rawType;
     var string = coreTypes.stringClass.rawType;
 
@@ -705,7 +702,7 @@
     //     {N<C1<String>>, Object} for N<C1<String>> and
     // Object is the most specific type in the intersection of the supertypes.
     expect(
-        hierarchy.getClassicLeastUpperBound(
+        hierarchy.getLegacyLeastUpperBound(
             new InterfaceType(C1, [int]),
             new InterfaceType(N, [
               new InterfaceType(C1, [string])
@@ -718,7 +715,7 @@
     //     {N<C2<String>>, Object} for N<C2<String>> and
     // Object is the most specific type in the intersection of the supertypes.
     expect(
-        hierarchy.getClassicLeastUpperBound(
+        hierarchy.getLegacyLeastUpperBound(
             new InterfaceType(C2, [int]),
             new InterfaceType(N, [
               new InterfaceType(C2, [string])
@@ -726,7 +723,7 @@
         objectClass.thisType);
   }
 
-  void test_getClassicLeastUpperBound_generic() {
+  void test_getLegacyLeastUpperBound_generic() {
     var int = coreTypes.intClass.rawType;
     var double = coreTypes.doubleClass.rawType;
     var bool = coreTypes.boolClass.rawType;
@@ -763,26 +760,26 @@
 ''');
 
     expect(
-        hierarchy.getClassicLeastUpperBound(new InterfaceType(d, [int, double]),
+        hierarchy.getLegacyLeastUpperBound(new InterfaceType(d, [int, double]),
             new InterfaceType(d, [int, double])),
         new InterfaceType(d, [int, double]));
     expect(
-        hierarchy.getClassicLeastUpperBound(new InterfaceType(d, [int, double]),
+        hierarchy.getLegacyLeastUpperBound(new InterfaceType(d, [int, double]),
             new InterfaceType(d, [int, bool])),
         new InterfaceType(b, [int]));
     expect(
-        hierarchy.getClassicLeastUpperBound(new InterfaceType(d, [int, double]),
+        hierarchy.getLegacyLeastUpperBound(new InterfaceType(d, [int, double]),
             new InterfaceType(d, [bool, double])),
         new InterfaceType(c, [double]));
     expect(
-        hierarchy.getClassicLeastUpperBound(new InterfaceType(d, [int, double]),
+        hierarchy.getLegacyLeastUpperBound(new InterfaceType(d, [int, double]),
             new InterfaceType(d, [bool, int])),
         a.rawType);
-    expect(hierarchy.getClassicLeastUpperBound(e.rawType, f.rawType),
+    expect(hierarchy.getLegacyLeastUpperBound(e.rawType, f.rawType),
         new InterfaceType(b, [int]));
   }
 
-  void test_getClassicLeastUpperBound_nonGeneric() {
+  void test_getLegacyLeastUpperBound_nonGeneric() {
     var a = addImplementsClass('A', []);
     var b = addImplementsClass('B', []);
     var c = addImplementsClass('C', [a]);
@@ -805,22 +802,17 @@
 class I implements self::C, self::D, self::E {}
 ''');
 
-    expect(hierarchy.getClassicLeastUpperBound(a.rawType, b.rawType),
+    expect(hierarchy.getLegacyLeastUpperBound(a.rawType, b.rawType),
         objectClass.rawType);
-    expect(hierarchy.getClassicLeastUpperBound(a.rawType, objectClass.rawType),
+    expect(hierarchy.getLegacyLeastUpperBound(a.rawType, objectClass.rawType),
         objectClass.rawType);
-    expect(hierarchy.getClassicLeastUpperBound(objectClass.rawType, b.rawType),
+    expect(hierarchy.getLegacyLeastUpperBound(objectClass.rawType, b.rawType),
         objectClass.rawType);
-    expect(
-        hierarchy.getClassicLeastUpperBound(c.rawType, d.rawType), a.rawType);
-    expect(
-        hierarchy.getClassicLeastUpperBound(c.rawType, a.rawType), a.rawType);
-    expect(
-        hierarchy.getClassicLeastUpperBound(a.rawType, d.rawType), a.rawType);
-    expect(
-        hierarchy.getClassicLeastUpperBound(f.rawType, g.rawType), a.rawType);
-    expect(
-        hierarchy.getClassicLeastUpperBound(h.rawType, i.rawType), a.rawType);
+    expect(hierarchy.getLegacyLeastUpperBound(c.rawType, d.rawType), a.rawType);
+    expect(hierarchy.getLegacyLeastUpperBound(c.rawType, a.rawType), a.rawType);
+    expect(hierarchy.getLegacyLeastUpperBound(a.rawType, d.rawType), a.rawType);
+    expect(hierarchy.getLegacyLeastUpperBound(f.rawType, g.rawType), a.rawType);
+    expect(hierarchy.getLegacyLeastUpperBound(h.rawType, i.rawType), a.rawType);
   }
 
   void test_getDeclaredMembers() {
diff --git a/pkg/kernel/test/metadata_test.dart b/pkg/kernel/test/metadata_test.dart
index e8f3e1c..d544535 100644
--- a/pkg/kernel/test/metadata_test.dart
+++ b/pkg/kernel/test/metadata_test.dart
@@ -61,7 +61,7 @@
     expect(metadata, equals(mapping[node]));
     sink.writeByteList(utf8.encode(metadata.string));
     sink.writeStringReference(metadata.string);
-    sink.writeCanonicalNameReference(metadata.member?.canonicalName);
+    sink.writeNullAllowedCanonicalNameReference(metadata.member?.canonicalName);
     sink.writeDartType(metadata.type);
   }
 
diff --git a/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
new file mode 100644
index 0000000..f934baa
--- /dev/null
+++ b/pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library kernel.text_serializer_from_kernel_nodes_test;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/text/serializer_combinators.dart';
+import 'package:kernel/text/text_reader.dart';
+import 'package:kernel/text/text_serializer.dart';
+
+void main() {
+  initializeSerializers();
+  test();
+}
+
+// Wrappers for testing.
+Expression readExpression(
+    String input, DeserializationEnvironment environment) {
+  TextIterator stream = new TextIterator(input, 0);
+  stream.moveNext();
+  Expression result = expressionSerializer.readFrom(stream, environment);
+  if (stream.moveNext()) {
+    throw StateError("extra cruft in basic literal");
+  }
+  return result;
+}
+
+String writeExpression(
+    Expression expression, SerializationEnvironment environment) {
+  StringBuffer buffer = new StringBuffer();
+  expressionSerializer.writeTo(buffer, expression, environment);
+  return buffer.toString();
+}
+
+class TestCase {
+  final String name;
+  final Node node;
+  final SerializationEnvironment serializationEnvironment;
+  final DeserializationEnvironment deserializationEnvironment;
+  final String expectation;
+
+  TestCase(
+      {this.name,
+      this.node,
+      this.expectation,
+      this.serializationEnvironment,
+      this.deserializationEnvironment});
+}
+
+void test() {
+  List<String> failures = [];
+  List<TestCase> tests = <TestCase>[
+    new TestCase(
+        name: "let dynamic x = 42 in x",
+        node: () {
+          VariableDeclaration x = new VariableDeclaration("x",
+              type: const DynamicType(), initializer: new IntLiteral(42));
+          return new Let(x, new VariableGet(x));
+        }(),
+        expectation:
+            "(let (var \"x^0\" (dynamic) (int 42) ()) (get-var \"x^0\" _))"),
+    new TestCase(
+        name: "let dynamic x = 42 in let Bottom x^0 = null in x",
+        node: () {
+          VariableDeclaration outterLetVar = new VariableDeclaration("x",
+              type: const DynamicType(), initializer: new IntLiteral(42));
+          VariableDeclaration innerLetVar = new VariableDeclaration("x",
+              type: const BottomType(), initializer: new NullLiteral());
+          return new Let(outterLetVar,
+              new Let(innerLetVar, new VariableGet(outterLetVar)));
+        }(),
+        expectation: ""
+            "(let (var \"x^0\" (dynamic) (int 42) ())"
+            " (let (var \"x^1\" (bottom) (null) ())"
+            " (get-var \"x^0\" _)))"),
+    new TestCase(
+        name: "let dynamic x = 42 in let Bottom x^0 = null in x^0",
+        node: () {
+          VariableDeclaration outterLetVar = new VariableDeclaration("x",
+              type: const DynamicType(), initializer: new IntLiteral(42));
+          VariableDeclaration innerLetVar = new VariableDeclaration("x",
+              type: const BottomType(), initializer: new NullLiteral());
+          return new Let(
+              outterLetVar, new Let(innerLetVar, new VariableGet(innerLetVar)));
+        }(),
+        expectation: ""
+            "(let (var \"x^0\" (dynamic) (int 42) ())"
+            " (let (var \"x^1\" (bottom) (null) ())"
+            " (get-var \"x^1\" _)))"),
+    () {
+      VariableDeclaration x =
+          new VariableDeclaration("x", type: const DynamicType());
+      return new TestCase(
+          name: "/* suppose: dynamic x; */ x = 42",
+          node: () {
+            return new VariableSet(x, new IntLiteral(42));
+          }(),
+          expectation: "(set-var \"x^0\" (int 42))",
+          serializationEnvironment: new SerializationEnvironment(null)
+            ..add(x, "x^0"),
+          deserializationEnvironment: new DeserializationEnvironment(null)
+            ..add("x^0", x));
+    }(),
+  ];
+  for (TestCase testCase in tests) {
+    String roundTripInput =
+        writeExpression(testCase.node, testCase.serializationEnvironment);
+    if (roundTripInput != testCase.expectation) {
+      failures.add(''
+          '* initial serialization for test "${testCase.name}"'
+          ' gave output "${roundTripInput}"');
+    }
+
+    TreeNode deserialized =
+        readExpression(roundTripInput, testCase.deserializationEnvironment);
+    String roundTripOutput =
+        writeExpression(deserialized, testCase.serializationEnvironment);
+    if (roundTripOutput != roundTripInput) {
+      failures.add(''
+          '* input "${testCase.name}" gave output "${roundTripOutput}"');
+    }
+  }
+  if (failures.isNotEmpty) {
+    print('Round trip failures:');
+    failures.forEach(print);
+    throw StateError('Round trip failures');
+  }
+}
diff --git a/pkg/kernel/test/text_serializer_test.dart b/pkg/kernel/test/text_serializer_test.dart
new file mode 100644
index 0000000..029b91b
--- /dev/null
+++ b/pkg/kernel/test/text_serializer_test.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library kernel.text_serializer_test;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/text/text_reader.dart';
+import 'package:kernel/text/text_serializer.dart';
+
+void main() {
+  initializeSerializers();
+  test();
+}
+
+// Wrappers for testing.
+Expression readExpression(String input) {
+  TextIterator stream = new TextIterator(input, 0);
+  stream.moveNext();
+  Expression result = expressionSerializer.readFrom(stream, null);
+  if (stream.moveNext()) {
+    throw StateError("extra cruft in basic literal");
+  }
+  return result;
+}
+
+String writeExpression(Expression expression) {
+  StringBuffer buffer = new StringBuffer();
+  expressionSerializer.writeTo(buffer, expression, null);
+  return buffer.toString();
+}
+
+void test() {
+  List<String> failures = [];
+  List<String> tests = [
+    "(get-prop (int 0) (public \"hashCode\"))",
+    "(get-super (public \"hashCode\"))",
+    "(invoke-method (int 0) (public \"foo\") () ((int 1) (int 2)) ())",
+    "(invoke-method (int 0) (public \"foo\") ((dynamic) (void)) "
+        "((int 1) (int 2)) (\"others\" (list (dynamic) ((int 3) (int 4)))))",
+    "(let (var \"x^0\" (dynamic) (int 0) ()) (null))",
+    "(let (var \"x^0\" (dynamic) _ ()) (null))",
+    "(let (const \"x^0\" (dynamic) (int 0) ()) (null))",
+    "(let (const \"x^0\" (dynamic) _ ()) (null))",
+    "(let (final \"x^0\" (dynamic) (int 0) ()) (null))",
+    "(let (final \"x^0\" (dynamic) _ ()) (null))",
+    "(string \"Hello, 'string'!\")",
+    "(string \"Hello, \\\"string\\\"!\")",
+    "(string \"Yeah nah yeah, here is\\nthis really long string haiku\\n"
+        "blowing in the wind\\n\")",
+    "(int 42)",
+    "(int 0)",
+    "(int -1001)",
+    "(double 3.14159)",
+    "(bool true)",
+    "(bool false)",
+    "(null)",
+    "(invalid \"You can't touch this\")",
+    "(not (bool true))",
+    "(&& (bool true) (bool false))",
+    "(|| (&& (bool true) (not (bool true))) (bool true))",
+    "(concat ((string \"The opposite of \") (int 3) "
+        "(string \" is \") (int 7)))",
+    "(symbol \"unquote-splicing\")",
+    "(this)",
+    "(rethrow)",
+    "(throw (string \"error\"))",
+    "(await (null))",
+    "(cond (bool true) (dynamic) (int 0) (int 1))",
+    "(is (bool true) (invalid))",
+    "(as (bool true) (void))",
+    "(type (bottom))",
+    "(list (dynamic) ((null) (null) (null)))",
+    "(const-list (dynamic) ((int 0) (int 1) (int 2)))",
+    "(set (dynamic) ((bool true) (bool false) (int 0)))",
+    "(const-set (dynamic) ((int 0) (int 1) (int 2)))",
+    "(map (dynamic) (void) ((int 0) (null) (int 1) (null) (int 2) (null)))",
+    "(const-map (dynamic) (void) ((int 0) (null) (int 1) (null) "
+        "(int 2) (null)))",
+  ];
+  for (var test in tests) {
+    var literal = readExpression(test);
+    var output = writeExpression(literal);
+    if (output != test) {
+      failures.add('* input "${test}" gave output "${output}"');
+    }
+  }
+  if (failures.isNotEmpty) {
+    print('Round trip failures:');
+    failures.forEach(print);
+    throw StateError('Round trip failures');
+  }
+}
diff --git a/pkg/kernel/test/treeshaker_bench.dart b/pkg/kernel/test/treeshaker_bench.dart
index c2a6de9..a34ac9e 100644
--- a/pkg/kernel/test/treeshaker_bench.dart
+++ b/pkg/kernel/test/treeshaker_bench.dart
@@ -20,8 +20,8 @@
       help: 'Rebuild class hierarchy for each tree shaking', negatable: false)
   ..addFlag('diagnose',
       abbr: 'd', help: 'Print internal diagnostics', negatable: false)
-  ..addFlag('strong',
-      help: 'Run the tree shaker in strong mode', negatable: false);
+  ..addFlag('legacy-mode',
+      help: 'Run the tree shaker in legacy mode', negatable: false);
 
 String usage = '''
 Usage: treeshaker_bench [options] FILE.dill
@@ -43,7 +43,7 @@
     exit(1);
   }
   String filename = options.rest.single;
-  bool strongMode = options['strong'];
+  bool legacyMode = options['legacy-mode'];
 
   Component component = loadComponentFromBinary(filename);
 
@@ -59,7 +59,7 @@
   ClassHierarchy sharedClassHierarchy = buildClassHierarchy();
   int coldHierarchyTime = watch.elapsedMicroseconds;
   var shaker = new TreeShaker(coreTypes, sharedClassHierarchy, component,
-      legacyMode: !strongMode);
+      legacyMode: legacyMode);
   if (options['diagnose']) {
     print(shaker.getDiagnosticString());
   }
@@ -80,7 +80,7 @@
     watch.reset();
     var hierarchy = getClassHierarchy();
     hotHierarchyTime += watch.elapsedMicroseconds;
-    new TreeShaker(coreTypes, hierarchy, component, legacyMode: !strongMode);
+    new TreeShaker(coreTypes, hierarchy, component, legacyMode: legacyMode);
     hotTreeShakingTime += watch.elapsedMicroseconds;
   }
   hotHierarchyTime ~/= numberOfTrials;
diff --git a/pkg/kernel/test/treeshaker_dump.dart b/pkg/kernel/test/treeshaker_dump.dart
index 2ed4aa8..1073c6d 100644
--- a/pkg/kernel/test/treeshaker_dump.dart
+++ b/pkg/kernel/test/treeshaker_dump.dart
@@ -27,7 +27,7 @@
   ..addOption('output',
       help: 'The --diff files are written to the given directory instead of '
           'the working directory')
-  ..addFlag('strong', help: 'Run the tree shaker in strong mode');
+  ..addFlag('legacy-mode', help: 'Run the tree shaker in legacy mode');
 
 String usage = '''
 Usage: treeshaker_dump [options] FILE.dill
@@ -63,13 +63,13 @@
     exit(1);
   }
 
-  bool strong = options['strong'];
+  bool legacyMode = options['legacy-mode'];
 
   Component component = loadComponentFromBinary(filename);
   CoreTypes coreTypes = new CoreTypes(component);
   ClassHierarchy hierarchy = new ClassHierarchy(component);
   TreeShaker shaker =
-      new TreeShaker(coreTypes, hierarchy, component, legacyMode: !strong);
+      new TreeShaker(coreTypes, hierarchy, component, legacyMode: legacyMode);
   int totalClasses = 0;
   int totalInstantiationCandidates = 0;
   int totalMembers = 0;
@@ -132,7 +132,7 @@
     StringBuffer before = new StringBuffer();
     new Printer(before, syntheticNames: names).writeComponentFile(component);
     new File(beforeFile).writeAsStringSync('$before');
-    new TreeShaker(coreTypes, hierarchy, component, legacyMode: !strong)
+    new TreeShaker(coreTypes, hierarchy, component, legacyMode: legacyMode)
         .transform(component);
     StringBuffer after = new StringBuffer();
     new Printer(after, syntheticNames: names).writeComponentFile(component);
diff --git a/pkg/kernel/test/treeshaker_membench.dart b/pkg/kernel/test/treeshaker_membench.dart
index 537442c..937637d 100644
--- a/pkg/kernel/test/treeshaker_membench.dart
+++ b/pkg/kernel/test/treeshaker_membench.dart
@@ -14,7 +14,7 @@
 ArgParser argParser = new ArgParser(allowTrailingOptions: true)
   ..addOption('count',
       abbr: 'c', help: 'Build N copies of the tree shaker', defaultsTo: '100')
-  ..addFlag('strong', help: 'Run the tree shaker in strong mode');
+  ..addFlag('legacy-mode', help: 'Run the tree shaker in legacy mode');
 
 String usage = """
 Usage: treeshaker_membench [options] FILE.dill
@@ -36,7 +36,7 @@
     exit(1);
   }
   String filename = options.rest.single;
-  bool strongMode = options['strong'];
+  bool legacyMode = options['legacy-mode'];
 
   Component component = loadComponentFromBinary(filename);
   ClassHierarchy hierarchy = new ClassHierarchy(component);
@@ -46,7 +46,7 @@
 
   TreeShaker buildTreeShaker() {
     return new TreeShaker(coreTypes, hierarchy, component,
-        legacyMode: !strongMode);
+        legacyMode: legacyMode);
   }
 
   List<TreeShaker> keepAlive = <TreeShaker>[];
diff --git a/pkg/kernel/test/type_subtype_test.dart b/pkg/kernel/test/type_subtype_test.dart
index e9abd59..753e525 100644
--- a/pkg/kernel/test/type_subtype_test.dart
+++ b/pkg/kernel/test/type_subtype_test.dart
@@ -22,140 +22,151 @@
 };
 
 List<TestCase> testCases = <TestCase>[
-  subtype('int', 'num'),
-  subtype('int', 'Comparable<num>'),
-  subtype('int', 'Comparable<Object>'),
-  subtype('int', 'Object'),
-  subtype('double', 'num'),
+  subtype('int', 'num', legacyMode: true),
+  subtype('int', 'Comparable<num>', legacyMode: true),
+  subtype('int', 'Comparable<Object>', legacyMode: true),
+  subtype('int', 'Object', legacyMode: true),
+  subtype('double', 'num', legacyMode: true),
 
-  notSubtype('int', 'double'),
-  notSubtype('int', 'Comparable<int>'),
-  notSubtype('int', 'Iterable<int>'),
-  notSubtype('Comparable<int>', 'Iterable<int>'),
+  notSubtype('int', 'double', legacyMode: true),
+  notSubtype('int', 'Comparable<int>', legacyMode: true),
+  notSubtype('int', 'Iterable<int>', legacyMode: true),
+  notSubtype('Comparable<int>', 'Iterable<int>', legacyMode: true),
 
-  subtype('List<int>', 'List<int>'),
-  subtype('List<int>', 'Iterable<int>'),
-  subtype('List<int>', 'List<num>'),
-  subtype('List<int>', 'Iterable<num>'),
-  subtype('List<int>', 'List<Object>'),
-  subtype('List<int>', 'Iterable<Object>'),
-  subtype('List<int>', 'Object'),
-  subtype('List<int>', 'List<Comparable<Object>>'),
-  subtype('List<int>', 'List<Comparable<num>>'),
-  subtype('List<int>', 'List<Comparable<Comparable<num>>>'),
+  subtype('List<int>', 'List<int>', legacyMode: true),
+  subtype('List<int>', 'Iterable<int>', legacyMode: true),
+  subtype('List<int>', 'List<num>', legacyMode: true),
+  subtype('List<int>', 'Iterable<num>', legacyMode: true),
+  subtype('List<int>', 'List<Object>', legacyMode: true),
+  subtype('List<int>', 'Iterable<Object>', legacyMode: true),
+  subtype('List<int>', 'Object', legacyMode: true),
+  subtype('List<int>', 'List<Comparable<Object>>', legacyMode: true),
+  subtype('List<int>', 'List<Comparable<num>>', legacyMode: true),
+  subtype('List<int>', 'List<Comparable<Comparable<num>>>', legacyMode: true),
 
-  notSubtype('List<int>', 'List<double>'),
-  notSubtype('List<int>', 'Iterable<double>'),
-  notSubtype('List<int>', 'Comparable<int>'),
-  notSubtype('List<int>', 'List<Comparable<int>>'),
-  notSubtype('List<int>', 'List<Comparable<Comparable<int>>>'),
+  notSubtype('List<int>', 'List<double>', legacyMode: true),
+  notSubtype('List<int>', 'Iterable<double>', legacyMode: true),
+  notSubtype('List<int>', 'Comparable<int>', legacyMode: true),
+  notSubtype('List<int>', 'List<Comparable<int>>', legacyMode: true),
+  notSubtype('List<int>', 'List<Comparable<Comparable<int>>>',
+      legacyMode: true),
 
-  subtype('(num) => num', '(int) => num'),
-  subtype('(num) => int', '(num) => num'),
-  subtype('(num) => int', '(int) => num'),
-  notSubtype('(int) => int', '(num) => num'),
+  subtype('(num) => num', '(int) => num', legacyMode: true),
+  subtype('(num) => int', '(num) => num', legacyMode: true),
+  subtype('(num) => int', '(int) => num', legacyMode: true),
+  notSubtype('(int) => int', '(num) => num', legacyMode: true),
 
-  subtype('(num) => (num) => num', '(num) => (int) => num'),
-  notSubtype('(num) => (int) => int', '(num) => (num) => num'),
+  subtype('(num) => (num) => num', '(num) => (int) => num', legacyMode: true),
+  notSubtype('(num) => (int) => int', '(num) => (num) => num',
+      legacyMode: true),
 
-  subtype('(x:num) => num', '(x:int) => num'), // named parameters
-  subtype('(num,x:num) => num', '(int,x:int) => num'),
-  subtype('(x:num) => int', '(x:num) => num'),
-  notSubtype('(x:int) => int', '(x:num) => num'),
+  subtype('(x:num) => num', '(x:int) => num',
+      legacyMode: true), // named parameters
+  subtype('(num,x:num) => num', '(int,x:int) => num', legacyMode: true),
+  subtype('(x:num) => int', '(x:num) => num', legacyMode: true),
+  notSubtype('(x:int) => int', '(x:num) => num', legacyMode: true),
 
-  subtype('<E>(E) => int', '<E>(E) => num'), // type parameters
-  subtype('<E>(num) => E', '<E>(int) => E'),
-  subtype('<E>(E,num) => E', '<E>(E,int) => E'),
-  notSubtype('<E>(E,num) => E', '<E>(E,E) => E'),
+  subtype('<E>(E) => int', '<E>(E) => num',
+      legacyMode: true), // type parameters
+  subtype('<E>(num) => E', '<E>(int) => E', legacyMode: true),
+  subtype('<E>(E,num) => E', '<E>(E,int) => E', legacyMode: true),
+  notSubtype('<E>(E,num) => E', '<E>(E,E) => E', legacyMode: true),
 
-  subtype('<E>(E) => (E) => E', '<F>(F) => (F) => F'),
-  subtype('<E>(E, (int,E) => E) => E', '<E>(E, (int,E) => E) => E'),
-  subtype('<E>(E, (int,E) => E) => E', '<E>(E, (num,E) => E) => E'),
-  notSubtype('<E,F>(E) => (F) => E', '<E>(E) => <F>(F) => E'),
-  notSubtype('<E,F>(E) => (F) => E', '<F,E>(E) => (F) => E'),
+  subtype('<E>(E) => (E) => E', '<F>(F) => (F) => F', legacyMode: true),
+  subtype('<E>(E, (int,E) => E) => E', '<E>(E, (int,E) => E) => E',
+      legacyMode: true),
+  subtype('<E>(E, (int,E) => E) => E', '<E>(E, (num,E) => E) => E',
+      legacyMode: true),
+  notSubtype('<E,F>(E) => (F) => E', '<E>(E) => <F>(F) => E', legacyMode: true),
+  notSubtype('<E,F>(E) => (F) => E', '<F,E>(E) => (F) => E', legacyMode: true),
 
-  notSubtype('<E>(E,num) => E', '<E:num>(E,E) => E'),
-  notSubtype('<E:num>(E) => int', '<E:int>(E) => int'),
-  notSubtype('<E:num>(E) => E', '<E:int>(E) => E'),
-  notSubtype('<E:num>(int) => E', '<E:int>(int) => E'),
-  subtype('<E:num>(E) => E', '<F:num>(F) => num'),
-  subtype('<E:int>(E) => E', '<F:int>(F) => num'),
-  subtype('<E:int>(E) => E', '<F:int>(F) => int'),
-  notSubtype('<E>(int) => int', '(int) => int'),
-  notSubtype('<E,F>(int) => int', '<E>(int) => int'),
+  notSubtype('<E>(E,num) => E', '<E:num>(E,E) => E', legacyMode: true),
+  notSubtype('<E:num>(E) => int', '<E:int>(E) => int', legacyMode: true),
+  notSubtype('<E:num>(E) => E', '<E:int>(E) => E', legacyMode: true),
+  notSubtype('<E:num>(int) => E', '<E:int>(int) => E', legacyMode: true),
+  subtype('<E:num>(E) => E', '<F:num>(F) => num', legacyMode: true),
+  subtype('<E:int>(E) => E', '<F:int>(F) => num', legacyMode: true),
+  subtype('<E:int>(E) => E', '<F:int>(F) => int', legacyMode: true),
+  notSubtype('<E>(int) => int', '(int) => int', legacyMode: true),
+  notSubtype('<E,F>(int) => int', '<E>(int) => int', legacyMode: true),
 
-  subtype('<E:List<E>>(E) => E', '<F:List<F>>(F) => F'),
-  notSubtype('<E:Iterable<E>>(E) => E', '<F:List<F>>(F) => F'),
-  notSubtype('<E>(E,List<Object>) => E', '<F:List<F>>(F,F) => F'),
-  notSubtype('<E>(E,List<Object>) => List<E>', '<F:List<F>>(F,F) => F'),
-  notSubtype('<E>(E,List<Object>) => int', '<F:List<F>>(F,F) => F'),
-  notSubtype('<E>(E,List<Object>) => E', '<F:List<F>>(F,F) => void'),
+  subtype('<E:List<E>>(E) => E', '<F:List<F>>(F) => F', legacyMode: true),
+  notSubtype('<E:Iterable<E>>(E) => E', '<F:List<F>>(F) => F',
+      legacyMode: true),
+  notSubtype('<E>(E,List<Object>) => E', '<F:List<F>>(F,F) => F',
+      legacyMode: true),
+  notSubtype('<E>(E,List<Object>) => List<E>', '<F:List<F>>(F,F) => F',
+      legacyMode: true),
+  notSubtype('<E>(E,List<Object>) => int', '<F:List<F>>(F,F) => F',
+      legacyMode: true),
+  notSubtype('<E>(E,List<Object>) => E', '<F:List<F>>(F,F) => void',
+      legacyMode: true),
 
-  subtype('int', 'FutureOr<int>', strongMode: true),
-  subtype('int', 'FutureOr<num>', strongMode: true),
-  subtype('Future<int>', 'FutureOr<int>', strongMode: true),
-  subtype('Future<int>', 'FutureOr<num>', strongMode: true),
-  subtype('Future<int>', 'FutureOr<Object>', strongMode: true),
-  subtype('FutureOr<int>', 'FutureOr<int>', strongMode: true),
-  subtype('FutureOr<int>', 'FutureOr<num>', strongMode: true),
-  subtype('FutureOr<int>', 'Object', strongMode: true),
-  notSubtype('int', 'FutureOr<double>', strongMode: true),
-  notSubtype('FutureOr<double>', 'int', strongMode: true),
-  notSubtype('FutureOr<int>', 'Future<num>', strongMode: true),
-  notSubtype('FutureOr<int>', 'num', strongMode: true),
+  subtype('int', 'FutureOr<int>'),
+  subtype('int', 'FutureOr<num>'),
+  subtype('Future<int>', 'FutureOr<int>'),
+  subtype('Future<int>', 'FutureOr<num>'),
+  subtype('Future<int>', 'FutureOr<Object>'),
+  subtype('FutureOr<int>', 'FutureOr<int>'),
+  subtype('FutureOr<int>', 'FutureOr<num>'),
+  subtype('FutureOr<int>', 'Object'),
+  notSubtype('int', 'FutureOr<double>'),
+  notSubtype('FutureOr<double>', 'int'),
+  notSubtype('FutureOr<int>', 'Future<num>'),
+  notSubtype('FutureOr<int>', 'num'),
 
   // T & B <: T & A if B <: A
-  subtype('T & int', 'T & int'),
-  subtype('T & int', 'T & num'),
-  subtype('T & num', 'T & num'),
-  notSubtype('T & num', 'T & int'),
+  subtype('T & int', 'T & int', legacyMode: true),
+  subtype('T & int', 'T & num', legacyMode: true),
+  subtype('T & num', 'T & num', legacyMode: true),
+  notSubtype('T & num', 'T & int', legacyMode: true),
 
   // T & B <: T extends A if B <: A
   // (Trivially satisfied since promoted bounds are always a subtype of the
   // original bound)
-  subtype('T & int', 'T', typeParameters: 'T: int'),
-  subtype('T & int', 'T', typeParameters: 'T: num'),
-  subtype('T & num', 'T', typeParameters: 'T: num'),
+  subtype('T & int', 'T', legacyMode: true, typeParameters: 'T: int'),
+  subtype('T & int', 'T', legacyMode: true, typeParameters: 'T: num'),
+  subtype('T & num', 'T', legacyMode: true, typeParameters: 'T: num'),
 
   // T extends B <: T & A if B <: A
-  subtype('T', 'T & int', typeParameters: 'T: int'),
-  subtype('T', 'T & num', typeParameters: 'T: int'),
-  subtype('T', 'T & num', typeParameters: 'T: num'),
-  notSubtype('T', 'T & int', typeParameters: 'T: num'),
+  subtype('T', 'T & int', legacyMode: true, typeParameters: 'T: int'),
+  subtype('T', 'T & num', legacyMode: true, typeParameters: 'T: int'),
+  subtype('T', 'T & num', legacyMode: true, typeParameters: 'T: num'),
+  notSubtype('T', 'T & int', legacyMode: true, typeParameters: 'T: num'),
 
   // T extends A <: T extends A
-  subtype('T', 'T', typeParameters: 'T: num'),
+  subtype('T', 'T', legacyMode: true, typeParameters: 'T: num'),
 
   // S & B <: A if B <: A, A is not S (or a promotion thereof)
-  subtype('S & int', 'int'),
-  subtype('S & int', 'num'),
-  subtype('S & num', 'num'),
-  notSubtype('S & num', 'int'),
-  notSubtype('S & num', 'T'),
-  notSubtype('S & num', 'T & num'),
+  subtype('S & int', 'int', legacyMode: true),
+  subtype('S & int', 'num', legacyMode: true),
+  subtype('S & num', 'num', legacyMode: true),
+  notSubtype('S & num', 'int', legacyMode: true),
+  notSubtype('S & num', 'T', legacyMode: true),
+  notSubtype('S & num', 'T & num', legacyMode: true),
 
   // S extends B <: A if B <: A, A is not S (or a promotion thereof)
-  subtype('S', 'int', typeParameters: 'S: int'),
-  subtype('S', 'num', typeParameters: 'S: int'),
-  subtype('S', 'num', typeParameters: 'S: num'),
-  notSubtype('S', 'int', typeParameters: 'S: num'),
-  notSubtype('S', 'T', typeParameters: 'S: num'),
-  notSubtype('S', 'T & num', typeParameters: 'S: num'),
+  subtype('S', 'int', legacyMode: true, typeParameters: 'S: int'),
+  subtype('S', 'num', legacyMode: true, typeParameters: 'S: int'),
+  subtype('S', 'num', legacyMode: true, typeParameters: 'S: num'),
+  notSubtype('S', 'int', legacyMode: true, typeParameters: 'S: num'),
+  notSubtype('S', 'T', legacyMode: true, typeParameters: 'S: num'),
+  notSubtype('S', 'T & num', legacyMode: true, typeParameters: 'S: num'),
 ];
 
 /// Assert that [subtype] is a subtype of [supertype], and that [supertype]
 /// is not a subtype of [subtype] (unless the two strings are equal).
 TestCase subtype(String subtype_, String supertype,
-    {bool strongMode: false, String typeParameters}) {
+    {bool legacyMode: false, String typeParameters}) {
   return new TestCase(subtype_, supertype,
-      isSubtype: true, strongMode: strongMode, typeParameters: typeParameters);
+      isSubtype: true, legacyMode: legacyMode, typeParameters: typeParameters);
 }
 
 /// Assert that neither type is a subtype of the other.
 TestCase notSubtype(String subtype_, String supertype,
-    {bool strongMode: false, String typeParameters}) {
+    {bool legacyMode: false, String typeParameters}) {
   return new TestCase(subtype_, supertype,
-      isSubtype: false, strongMode: strongMode, typeParameters: typeParameters);
+      isSubtype: false, legacyMode: legacyMode, typeParameters: typeParameters);
 }
 
 class TestCase {
@@ -163,10 +174,10 @@
   String supertype;
   String typeParameters;
   bool isSubtype;
-  bool strongMode;
+  bool legacyMode;
 
   TestCase(this.subtype, this.supertype,
-      {this.isSubtype, this.strongMode: false, this.typeParameters});
+      {this.isSubtype, this.legacyMode: false, this.typeParameters});
 
   String toString() {
     var description =
@@ -174,8 +185,8 @@
     if (typeParameters != null) {
       description += ' (type parameters: $typeParameters)';
     }
-    if (strongMode) {
-      description += ' (strong mode)';
+    if (legacyMode) {
+      description += ' (legacy mode)';
     }
     return description;
   }
@@ -189,11 +200,16 @@
   Class futureClass;
   Class futureOrClass;
   LazyTypeEnvironment environment;
-  bool strongMode = false;
+  bool legacyMode = false;
 
   InterfaceType futureType(DartType type) =>
       new InterfaceType(futureClass, [type]);
 
+  @override
+  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass) {
+    return hierarchy.getTypeAsInstanceOf(type, superclass);
+  }
+
   MockSubtypeTester(
       this.hierarchy,
       this.objectType,
@@ -242,7 +258,7 @@
   var tester = makeSubtypeTester(classEnvironment);
   for (var testCase in testCases) {
     test('$testCase', () {
-      tester.strongMode = testCase.strongMode;
+      tester.legacyMode = testCase.legacyMode;
       var environment = tester.environment;
       environment.clearTypeParameters();
       if (testCase.typeParameters != null) {
diff --git a/pkg/kernel/test/typecheck.dart b/pkg/kernel/test/typecheck.dart
index 0a6d83b..565892b 100644
--- a/pkg/kernel/test/typecheck.dart
+++ b/pkg/kernel/test/typecheck.dart
@@ -11,7 +11,7 @@
 final String usage = '''
 Usage: typecheck FILE.dill
 
-Runs the strong mode type checker on the given component.
+Runs the type checker on the given component.
 ''';
 
 main(List<String> args) {
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 38a8283..9fd9fca 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -12,7 +12,7 @@
 /// function's name differently.
 ///
 /// For information on installing and importing this library, see the
-/// [meta package on pub.dartlang.org] (http://pub.dartlang.org/packages/meta).
+/// [meta package on pub.dartlang.org] (https://pub.dartlang.org/packages/meta).
 /// For examples of using annotations, see
 /// [Metadata](https://www.dartlang.org/docs/dart-up-and-running/ch02.html#metadata)
 /// in the language tour.
@@ -188,21 +188,25 @@
 ///   corresponding to a named parameter that has this annotation.
 const Required required = const Required();
 
-/// Annotation marking a class or mixin as not allowed as a super-type.
+/// Annotation marking a class as not allowed as a super-type.
 ///
-/// Classes in the same package as the marked class or mixin may extend,
-/// implement or mix-in the annotated class or mixin.
+/// Classes in the same package as the marked class may extend, implement or
+/// mix-in the annotated class.
 ///
-/// Given a class or mixin `C`, which is annotated with this, and a class or
-/// mixin `D`, which extends, implements, or mixes in `C`, then tools, such as
-/// the analyzer, may emit warnings if:
+/// Tools, such as the analyzer, can provide feedback if
 ///
-/// * `C` and `D` are declared in different packages, or
-/// * `C` and `D` are declared in the same package, and `D` is not also
-///   annotated with this.
+/// * the annotation is associated with anything other than a class,
+/// * the annotation is associated with a class `C`, and there is a class or
+///   mixin `D`, which extends, implements, mixes in, or constrains to `C`, and
+///   `C` and `D` are declared in different packages.
 const _Sealed sealed = const _Sealed();
 
 /// Used to annotate a field that is allowed to be overridden in Strong Mode.
+///
+/// Deprecated: Most of strong mode is now the default in 2.0, but the notion of
+/// virtual fields was dropped, so this annotation no longer has any meaning.
+/// Uses of the annotation should be removed.
+@deprecated
 const _Virtual virtual = const _Virtual();
 
 /// Used to annotate an instance member that was made public so that it could be
@@ -302,6 +306,7 @@
   const _Sealed();
 }
 
+@deprecated
 class _Virtual {
   const _Virtual();
 }
diff --git a/pkg/microlytics/example/simple.dart b/pkg/microlytics/example/simple.dart
deleted file mode 100644
index 42b323e..0000000
--- a/pkg/microlytics/example/simple.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:microlytics/channels.dart';
-import 'package:microlytics/io_channels.dart';
-import 'package:microlytics/microlytics.dart';
-
-void main(List<String> arguments) {
-  // Create the channel that will be used to communicate to analytics.
-  var channel = new RateLimitingBufferedChannel(new HttpClientChannel(),
-      packetsPerSecond: 1.0);
-
-  if (arguments.length != 1) {
-    print("usage: dart simple.dart GA-Client-ID");
-    return;
-  }
-  final String clientID = arguments.single;
-
-  // Create the logger.
-  var lg = new AnalyticsLogger(channel, "555", clientID, "test", "1.2");
-
-  // Send some messages.
-  lg.logAnonymousEvent("hello", "world");
-  lg.logAnonymousTiming("loader", "var", 42);
-}
diff --git a/pkg/microlytics/lib/channels.dart b/pkg/microlytics/lib/channels.dart
deleted file mode 100644
index 18f233c..0000000
--- a/pkg/microlytics/lib/channels.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library microlytics.channels;
-
-import 'dart:async';
-
-const String ANALYTICS_URL = "https://ssl.google-analytics.com/collect";
-
-abstract class Channel {
-  void sendData(String data);
-  void shutdown() {}
-}
-
-/// [Channel] that implements a leaky bucket
-/// algorithm to provide rate limiting.
-/// See [http://en.wikipedia.org/wiki/Leaky_bucket].
-class RateLimitingBufferedChannel extends Channel {
-  final List<String> _buffer = <String>[];
-  final Channel _innerChannel;
-  final int _bufferSizeLimit;
-  Timer _timer;
-
-  RateLimitingBufferedChannel(this._innerChannel,
-      {int bufferSizeLimit: 10, double packetsPerSecond: 1.0})
-      : this._bufferSizeLimit = bufferSizeLimit {
-    if (!(packetsPerSecond > 0)) {
-      throw new ArgumentError("packetsPerSecond must be larger than zero.");
-    }
-
-    int transmitDelay = (1000 / packetsPerSecond).floor();
-    _timer = new Timer.periodic(
-        new Duration(milliseconds: transmitDelay), _onTimerTick);
-  }
-
-  void _onTimerTick(_) {
-    if (_buffer.length > 0) {
-      String item = _buffer.removeLast();
-      _innerChannel.sendData(item);
-    }
-  }
-
-  void sendData(String data) {
-    if (_buffer.length >= _bufferSizeLimit) return;
-    _buffer.add(data);
-  }
-
-  void shutdown() {
-    _timer.cancel();
-    _innerChannel.shutdown();
-  }
-}
diff --git a/pkg/microlytics/lib/html_channels.dart b/pkg/microlytics/lib/html_channels.dart
deleted file mode 100644
index b3eef43..0000000
--- a/pkg/microlytics/lib/html_channels.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library microlytics.html_channels;
-
-import 'dart:html';
-import 'channels.dart';
-
-class HttpRequestChannel extends Channel {
-  void sendData(String data) {
-    HttpRequest.request(ANALYTICS_URL, method: "POST", sendData: data);
-  }
-}
diff --git a/pkg/microlytics/lib/io_channels.dart b/pkg/microlytics/lib/io_channels.dart
deleted file mode 100644
index 044005c..0000000
--- a/pkg/microlytics/lib/io_channels.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library microlytics.io_channels;
-
-import 'dart:io';
-import 'channels.dart';
-
-class HttpClientChannel extends Channel {
-  void sendData(String data) {
-    HttpClient client = new HttpClient();
-    client.postUrl(Uri.parse(ANALYTICS_URL)).then((HttpClientRequest req) {
-      req.write(data);
-      return req.close();
-    }).then((HttpClientResponse response) {
-      response.drain();
-    });
-  }
-}
diff --git a/pkg/microlytics/lib/microlytics.dart b/pkg/microlytics/lib/microlytics.dart
deleted file mode 100644
index 509ae26..0000000
--- a/pkg/microlytics/lib/microlytics.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library microlytics;
-
-import 'channels.dart';
-
-/// Very limited implementation of an API to report usage to Google Analytics.
-/// No Personally Identifiable Information must ever be passed to this class.
-class AnalyticsLogger {
-  final Channel _channel;
-  final String _clientID;
-  final String _analyticsID;
-  final String _appName;
-  final String _appVersion;
-  final String _messagePrefix; //Computed prefix for analytics messages
-
-  /// Create a new logger
-  /// [channel] represents how this is going to be sent, this would typically
-  /// be a [RateLimitingBufferedChannel] wrapping either a [HttpRequestChannel]
-  /// or a [HttpClientChannel].
-  /// [clientID] is a version 4 UUID associated with the site or app.
-  /// [appName] is an application name.
-  /// [appVersion] is a verion string.
-  AnalyticsLogger(Channel channel, String clientID, String analyticsID,
-      String appName, String appVersion)
-      : this._channel = channel,
-        this._clientID = clientID,
-        this._analyticsID = analyticsID,
-        this._appName = appName,
-        this._appVersion = appVersion,
-        this._messagePrefix = "v=1"
-            "&tid=$analyticsID"
-            "&cid=$clientID"
-            "&an=$appName"
-            "&av=$appVersion";
-
-  void logAnonymousTiming(String category, String variable, int ms) {
-    category = Uri.encodeComponent(category);
-    variable = Uri.encodeComponent(variable);
-    _channel.sendData("${this._messagePrefix}"
-        "&t=timing"
-        "&utc=$category"
-        "&utv=$variable"
-        "&utt=$ms");
-  }
-
-  void logAnonymousEvent(String category, String event) {
-    category = Uri.encodeComponent(category);
-    event = Uri.encodeComponent(event);
-    _channel.sendData("${this._messagePrefix}"
-        "&t=event"
-        "&ec=$category"
-        "&ea=$event");
-  }
-}
diff --git a/pkg/microlytics/pubspec.yaml b/pkg/microlytics/pubspec.yaml
deleted file mode 100644
index 620b7cb..0000000
--- a/pkg/microlytics/pubspec.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-name: microlytics
-description: A minimal implementation of the Analytics API in pure Dart
-dev_dependencies:
-  unittest: any
diff --git a/pkg/microlytics/test/dart_microlytics_test.dart b/pkg/microlytics/test/dart_microlytics_test.dart
deleted file mode 100644
index ca76b75..0000000
--- a/pkg/microlytics/test/dart_microlytics_test.dart
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library microlytics.test;
-
-import 'package:expect/expect.dart';
-import 'package:microlytics/microlytics.dart';
-
-import 'test_channel.dart';
-
-void main() {
-  testBasicEventRead();
-  testBasicNegativeEventRead();
-  testBasicTimingRead();
-  testBasicTimingMultiread();
-}
-
-void testBasicEventRead() {
-  TestChannel c = new TestChannel();
-  AnalyticsLogger logger = new AnalyticsLogger(
-      c,
-      "2cfac780-31e2-11e4-8c21-0800200c9a66",
-      "UA-53895644-1",
-      "TestApp",
-      "0.42");
-  logger.logAnonymousEvent("video", "play");
-  Expect.isTrue(c.contains("v=1"
-      "&tid=UA-53895644-1"
-      "&cid=2cfac780-31e2-11e4-8c21-0800200c9a66"
-      "&an=TestApp"
-      "&av=0.42"
-      "&t=event"
-      "&ec=video"
-      "&ea=play"));
-}
-
-void testBasicNegativeEventRead() {
-  TestChannel c = new TestChannel();
-  AnalyticsLogger logger = new AnalyticsLogger(
-      c,
-      "2cfac780-31e2-11e4-8c21-0800200c9a66",
-      "UA-53895644-1",
-      "TestApp",
-      "0.42");
-  logger.logAnonymousEvent("video", "play");
-  Expect.isFalse(c.contains("v=1"
-      "&tid=UA-53895644-1"
-      "&cid=2cfac780-31e2-11e4-8c21-0800200c9a66"
-      "&an=TestApp"
-      "&av=XXX"
-      "&t=event"
-      "&ec=video"
-      "&ea=play"));
-}
-
-void testBasicTimingRead() {
-  TestChannel c = new TestChannel();
-  AnalyticsLogger logger = new AnalyticsLogger(
-      c,
-      "2cfac780-31e2-11e4-8c21-0800200c9a66",
-      "UA-53895644-1",
-      "TestApp",
-      "0.42");
-  logger.logAnonymousTiming("video", "delay", 157);
-  Expect.isTrue(c.contains("v=1"
-      "&tid=UA-53895644-1"
-      "&cid=2cfac780-31e2-11e4-8c21-0800200c9a66"
-      "&an=TestApp"
-      "&av=0.42"
-      "&t=timing"
-      "&utc=video"
-      "&utv=delay"
-      "&utt=157"));
-}
-
-void testBasicTimingMultiread() {
-  TestChannel c = new TestChannel();
-  AnalyticsLogger logger = new AnalyticsLogger(
-      c,
-      "2cfac780-31e2-11e4-8c21-0800200c9a66",
-      "UA-53895644-1",
-      "TestApp",
-      "0.42");
-  logger.logAnonymousTiming("video", "delay", 159);
-  logger.logAnonymousTiming("video", "delay", 152);
-  Expect.isTrue(c.contains("v=1"
-      "&tid=UA-53895644-1"
-      "&cid=2cfac780-31e2-11e4-8c21-0800200c9a66"
-      "&an=TestApp"
-      "&av=0.42"
-      "&t=timing"
-      "&utc=video"
-      "&utv=delay"
-      "&utt=152"));
-  Expect.isTrue(c.contains("v=1"
-      "&tid=UA-53895644-1"
-      "&cid=2cfac780-31e2-11e4-8c21-0800200c9a66"
-      "&an=TestApp"
-      "&av=0.42"
-      "&t=timing"
-      "&utc=video"
-      "&utv=delay"
-      "&utt=159"));
-  Expect.isFalse(c.contains("v=1"
-      "&tid=UA-53895644-1"
-      "&cid=2cfac780-31e2-11e4-8c21-0800200c9a66"
-      "&an=TestApp"
-      "&av=0.42"
-      "&t=timing"
-      "&utc=video"
-      "&utv=delay"
-      "&utt=19"));
-}
diff --git a/pkg/microlytics/test/test_channel.dart b/pkg/microlytics/test/test_channel.dart
deleted file mode 100644
index a7f9c8b..0000000
--- a/pkg/microlytics/test/test_channel.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library microlytics.test_channel;
-
-import 'package:microlytics/channels.dart';
-
-class TestChannel extends Channel {
-  List<String> _channelLog = [];
-
-  void sendData(String data) {
-    _channelLog.add(data);
-  }
-
-  bool contains(String data) {
-    return _channelLog.contains(data);
-  }
-}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index e276440..47cc165 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -9,7 +9,6 @@
 */*/*/packages/*/*: Skip
 */*/packages/*/*: Skip
 */packages/*/*: Skip
-analysis_server/tool/spec/check_all_test: Skip # Issue 29133
 analyzer/test/generated/compile_time_error_code_driver_test: Slow, Pass
 analyzer/test/generated/compile_time_error_code_kernel_test: Slow, Pass
 analyzer/test/generated/compile_time_error_code_test: Slow, Pass
@@ -25,7 +24,6 @@
 analyzer/test/src/summary/resynthesize_kernel_test: Slow, Pass
 analyzer/test/src/task/strong/checker_test: Slow, Pass
 analyzer_plugin/test/plugin/folding_mixin_test: Slow, Pass
-analyzer_plugin/tool/spec/check_all_test: Skip # Issue 29133
 dev_compiler/test/options/*: Skip # test needs fixes
 dev_compiler/test/sourcemap/*: SkipByDesign # Skip sourcemap tests
 dev_compiler/test/sourcemap/testfiles/*: SkipByDesign # Skip dev_compiler codegen tests
@@ -33,12 +31,13 @@
 front_end/test/fasta/analyze_test: Pass, Slow
 front_end/test/fasta/ast_builder_test: Pass, Slow
 front_end/test/fasta/bootstrap_test: Pass, Slow
-front_end/test/fasta/compile_test: Pass, ExtraSlow
+front_end/test/fasta/legacy_test: Pass, ExtraSlow
 front_end/test/fasta/outline_test: Pass, Slow
 front_end/test/fasta/rasta/*: SkipByDesign # Anything in rasta is input to fasta unit tests and shouldn't be run as tests.
 front_end/test/fasta/sdk_test: SkipByDesign # sdk_test would take too long to complete, and should be run in a different way.
 front_end/test/fasta/shaker_test: Skip # Issue http://dartbug.com/32531
 front_end/test/fasta/strong_test: Pass, ExtraSlow
+front_end/test/fasta/text_serialization_test: Pass, ExtraSlow
 front_end/test/minimal_incremental_kernel_generator_test: Slow, Pass
 front_end/test/whole_program_test: Slow, Pass
 front_end/testcases/*: Skip # These are not tests but input for tests.
@@ -58,6 +57,8 @@
 
 [ $compiler == dart2js ]
 analysis_server/test/integration: SkipByDesign # Analysis server integration tests don't make sense to run under dart2js, since the code under test always runs in the Dart vm as a subprocess.
+analysis_server/tool/*: SkipByDesign # Only meant to run on vm
+analysis_server_client/test/live_test: SkipByDesign # Only meant to run on vm
 analyzer_cli/test/*: SkipByDesign # Only meant to run on vm
 analyzer_plugin/test/*: SkipByDesign # Only meant to run on vm
 analyzer_plugin/tool/*: SkipByDesign # Only meant to run on vm
@@ -122,6 +123,7 @@
 analyzer/test/src/task/strong/inferred_type_test: Pass, Slow
 analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test: Pass, Slow
 analyzer_plugin/test/src/utilities/completion/optype_test: Pass, Slow
+dartfix/test/src/driver_test: RuntimeError # dartbug.com/35478
 mutation_observer: Skip # Skip tests on the VM if the package depends on dart:html
 
 [ $runtime != vm ]
@@ -137,7 +139,7 @@
 front_end/test/fasta/ast_builder_test: Pass, Slow, Timeout
 front_end/test/fasta/bootstrap_test: Skip # Issue 31902
 front_end/test/fasta/strong_test: Pass, Slow, Timeout
-front_end/test/hot_reload_e2e_test: Skip # Issue 31901
+front_end/test/fasta/text_serialization_test: Pass, Slow, Timeout
 front_end/test/incremental_dart2js_load_from_dill_test: Pass, Slow
 front_end/test/whole_program_test: Skip # Issue 31902
 
diff --git a/pkg/status_file/lib/status_file_linter.dart b/pkg/status_file/lib/status_file_linter.dart
index fa98680..c8e08c6 100644
--- a/pkg/status_file/lib/status_file_linter.dart
+++ b/pkg/status_file/lib/status_file_linter.dart
@@ -61,7 +61,7 @@
     }
     return lintingErrors;
   }
-  return section.entries.where((entry) => entry is CommentEntry).map((entry) =>
+  return section.entries.whereType<CommentEntry>().map((entry) =>
       new LintingError(entry.lineNumber, "Comment is on a line by itself."));
 }
 
@@ -97,7 +97,7 @@
 /// ordered alphabetically.
 Iterable<LintingError> lintAlphabeticalOrderingOfPaths(StatusSection section) {
   var entries = section.entries
-      .where((entry) => entry is StatusEntry)
+      .whereType<StatusEntry>()
       .map((entry) => (entry as StatusEntry).path)
       .toList();
   var sortedList = entries.toList()..sort((a, b) => a.compareTo(b));
@@ -132,10 +132,8 @@
 /// Checks for duplicate section entries in the body of a section.
 Iterable<LintingError> lintSectionEntryDuplicates(StatusSection section) {
   var errors = <LintingError>[];
-  // TODO(whereType): When whereType is supported, use that.
   List<StatusEntry> statusEntries = section.entries
-      .where((entry) => entry is StatusEntry)
-      .cast<StatusEntry>()
+      .whereType<StatusEntry>()
       .toList();
   for (var i = 0; i < statusEntries.length; i++) {
     var entry = statusEntries[i];
diff --git a/pkg/telemetry/pubspec.yaml b/pkg/telemetry/pubspec.yaml
index ecbef8a..15dc588 100644
--- a/pkg/telemetry/pubspec.yaml
+++ b/pkg/telemetry/pubspec.yaml
@@ -1,6 +1,6 @@
 name: telemetry
 description: A library to facilitate reporting analytics and crash reports.
-version: 0.0.1
+publish_to: none
 author: Dart Team <misc@dartlang.org>
 
 environment:
diff --git a/pkg/testing/analysis_options.yaml b/pkg/testing/analysis_options.yaml
index c36c46e..b5516058 100644
--- a/pkg/testing/analysis_options.yaml
+++ b/pkg/testing/analysis_options.yaml
@@ -3,7 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 analyzer:
-  strong-mode: true
   errors:
     # Allow having TODOs in the code
     todo: ignore
diff --git a/pkg/testing/lib/src/run.dart b/pkg/testing/lib/src/run.dart
index a06d328..c93303a 100644
--- a/pkg/testing/lib/src/run.dart
+++ b/pkg/testing/lib/src/run.dart
@@ -23,7 +23,13 @@
 
 import 'analyze.dart' show Analyze;
 
-import 'log.dart' show isVerbose, logMessage, logNumberedLines, splitLines;
+import 'log.dart'
+    show
+        enableVerboseOutput,
+        isVerbose,
+        logMessage,
+        logNumberedLines,
+        splitLines;
 
 import 'suite.dart' show Dart, Suite;
 
@@ -54,6 +60,7 @@
     TestRoot testRoot =
         await computeTestRoot(configurationPath, Platform.script);
     CommandLine cl = CommandLine.parse(arguments);
+    if (cl.verbose) enableVerboseOutput();
     for (Chain suite in testRoot.toolChains) {
       if (Platform.script == suite.source) {
         print("Running suite ${suite.name}...");
diff --git a/pkg/testing/pubspec.yaml b/pkg/testing/pubspec.yaml
index 9c2e635..9811fa7 100644
--- a/pkg/testing/pubspec.yaml
+++ b/pkg/testing/pubspec.yaml
@@ -1,5 +1,6 @@
 # This pubspec is currently mainly used to make it easier to develop by making 
 # it a package.
 name: testing
-#version: do-not-upload
-dependencies:
+publish_to: none
+environment:
+  sdk: '>=2.0.0 <3.0.0'
diff --git a/pkg/vm/analysis_options.yaml b/pkg/vm/analysis_options.yaml
index 27c9e25..76886bd 100644
--- a/pkg/vm/analysis_options.yaml
+++ b/pkg/vm/analysis_options.yaml
@@ -3,9 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 
 analyzer:
-  strong-mode: true
-  language:
-    enableSuperMixins: false
   exclude:
     - testcases/**
     - tool/**
diff --git a/pkg/vm/bin/dump_bytecode_ngrams.dart b/pkg/vm/bin/dump_bytecode_ngrams.dart
new file mode 100644
index 0000000..dead72c
--- /dev/null
+++ b/pkg/vm/bin/dump_bytecode_ngrams.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' as io;
+
+import 'package:args/args.dart' show ArgParser, ArgResults;
+import 'package:vm/bytecode/ngrams.dart';
+
+final ArgParser _argParser = new ArgParser(allowTrailingOptions: true)
+  ..addFlag('basic-blocks',
+      help: 'Only allow control flow as the last instruction in a window',
+      defaultsTo: true)
+  ..addOption('output',
+      abbr: 'o', help: 'Path to output file', defaultsTo: null)
+  ..addFlag('merge-pushes',
+      help: 'Do not distinguish among different kinds of Push opcodes',
+      defaultsTo: false)
+  ..addFlag('sort',
+      abbr: 's', help: 'Sort the output by ngram frequency', defaultsTo: true)
+  ..addOption('threshold',
+      abbr: 't', help: 'Minimum ngram count threshold', defaultsTo: "1")
+  ..addOption('window', abbr: 'w', help: 'Window size', defaultsTo: "3");
+
+final String _usage = '''
+Usage: dump_bytecode_ngrams [options] input.trace
+
+Dumps stats about a dynamic bytecode instruction trace produced with the
+Dart VM option --interpreter-trace-file, e.g.:
+
+\$ dart --enable-interpreter --interpreter-trace-file=trace program.dart
+
+Options:
+${_argParser.usage}
+''';
+
+const int _badUsageExitCode = 1;
+
+int main(List<String> arguments) {
+  final ArgResults options = _argParser.parse(arguments);
+  if ((options.rest.length != 1) || (options['output'] == null)) {
+    print(_usage);
+    return _badUsageExitCode;
+  }
+
+  final basicBlocks = options['basic-blocks'];
+  final input = options.rest.single;
+  final output = options['output'];
+  final mergePushes = options['merge-pushes'];
+  final windowSize = int.parse(options['window']);
+  final sort = options['sort'];
+  final threshold = int.parse(options['threshold']);
+
+  if (!(new io.File(input).existsSync())) {
+    print("The file '$input' does not exist");
+    print(_usage);
+    return _badUsageExitCode;
+  }
+
+  NGramReader nGramReader = new NGramReader(input);
+  nGramReader.readAllNGrams(windowSize,
+      basicBlocks: basicBlocks, mergePushes: mergePushes);
+  nGramReader.writeNGramStats(output, sort: sort, minCount: threshold);
+  return 0;
+}
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index 5acfd26..eefe915 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -3,51 +3,21 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
+import 'dart:io' show exit;
 
-import 'package:args/args.dart' show ArgParser, ArgResults;
-import 'package:front_end/src/api_unstable/vm.dart';
-import 'package:kernel/binary/ast_to_binary.dart';
-import 'package:kernel/src/tool/batch_util.dart' as batch_util;
-import 'package:kernel/target/targets.dart' show TargetFlags;
+import 'package:args/args.dart' show ArgParser;
 import 'package:kernel/text/ast_to_text.dart'
     show globalDebuggingNames, NameSystem;
+import 'package:kernel/src/tool/batch_util.dart' as batch_util;
 import 'package:vm/kernel_front_end.dart'
-    show compileToKernel, ErrorDetector, ErrorPrinter, parseCommandLineDefines;
-import 'package:vm/target/vm.dart' show VmTarget;
+    show
+        createCompilerArgParser,
+        runCompiler,
+        successExitCode,
+        compileTimeErrorExitCode,
+        badUsageExitCode;
 
-final ArgParser _argParser = new ArgParser(allowTrailingOptions: true)
-  ..addOption('platform',
-      help: 'Path to vm_platform_strong.dill file', defaultsTo: null)
-  ..addOption('packages', help: 'Path to .packages file', defaultsTo: null)
-  ..addOption('output',
-      abbr: 'o', help: 'Path to resulting dill file', defaultsTo: null)
-  ..addFlag('aot',
-      help:
-          'Produce kernel file for AOT compilation (enables global transformations).',
-      defaultsTo: false)
-  ..addFlag('sync-async',
-      help: 'Start `async` functions synchronously', defaultsTo: true)
-  ..addFlag('embed-sources',
-      help: 'Embed source files in the generated kernel component',
-      defaultsTo: true)
-  ..addFlag('tfa',
-      help:
-          'Enable global type flow analysis and related transformations in AOT mode.',
-      defaultsTo: true)
-  ..addMultiOption('define',
-      abbr: 'D',
-      help: 'The values for the environment constants (e.g. -Dkey=value).')
-  ..addFlag('enable-asserts',
-      help: 'Whether asserts will be enabled.', defaultsTo: false)
-  ..addFlag('enable-constant-evaluation',
-      help: 'Whether kernel constant evaluation will be enabled.',
-      defaultsTo: true)
-  ..addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: false)
-  ..addFlag('drop-ast',
-      help: 'Drop AST for members with bytecode', defaultsTo: false)
-  ..addFlag('use-future-bytecode-format',
-      help: 'Generate bytecode in the bleeding edge format', defaultsTo: false);
+final ArgParser _argParser = createCompilerArgParser();
 
 final String _usage = '''
 Usage: dart pkg/vm/bin/gen_kernel.dart --platform vm_platform_strong.dill [options] input.dart
@@ -57,9 +27,6 @@
 ${_argParser.usage}
 ''';
 
-const int _badUsageExitCode = 1;
-const int _compileTimeErrorExitCode = 254;
-
 main(List<String> arguments) async {
   if (arguments.isNotEmpty && arguments.last == '--batch') {
     await runBatchModeCompiler();
@@ -69,70 +36,7 @@
 }
 
 Future<int> compile(List<String> arguments) async {
-  final ArgResults options = _argParser.parse(arguments);
-  final String platformKernel = options['platform'];
-
-  if ((options.rest.length != 1) || (platformKernel == null)) {
-    print(_usage);
-    return _badUsageExitCode;
-  }
-
-  final String filename = options.rest.single;
-  final String kernelBinaryFilename = options['output'] ?? "$filename.dill";
-  final String packages = options['packages'];
-  final bool aot = options['aot'];
-  final bool tfa = options['tfa'];
-  final bool genBytecode = options['gen-bytecode'];
-  final bool dropAST = options['drop-ast'];
-  final bool useFutureBytecodeFormat = options['use-future-bytecode-format'];
-  final bool enableAsserts = options['enable-asserts'];
-  final bool enableConstantEvaluation = options['enable-constant-evaluation'];
-  final Map<String, String> environmentDefines = {};
-
-  if (!parseCommandLineDefines(options['define'], environmentDefines, _usage)) {
-    return _badUsageExitCode;
-  }
-
-  final errorPrinter = new ErrorPrinter();
-  final errorDetector = new ErrorDetector(previousErrorHandler: errorPrinter);
-
-  final CompilerOptions compilerOptions = new CompilerOptions()
-    ..target = new VmTarget(new TargetFlags(syncAsync: true))
-    ..linkedDependencies = <Uri>[
-      Uri.base.resolveUri(new Uri.file(platformKernel))
-    ]
-    ..packagesFileUri =
-        packages != null ? Uri.base.resolveUri(new Uri.file(packages)) : null
-    ..onDiagnostic = (DiagnosticMessage m) {
-      printDiagnosticMessage(m, stderr.writeln);
-      errorDetector(m);
-    }
-    ..embedSourceText = options['embed-sources'];
-
-  final inputUri = new Uri.file(filename);
-  final component = await compileToKernel(
-      Uri.base.resolveUri(inputUri), compilerOptions,
-      aot: aot,
-      useGlobalTypeFlowAnalysis: tfa,
-      environmentDefines: environmentDefines,
-      genBytecode: genBytecode,
-      dropAST: dropAST,
-      useFutureBytecodeFormat: useFutureBytecodeFormat,
-      enableAsserts: enableAsserts,
-      enableConstantEvaluation: enableConstantEvaluation);
-
-  errorPrinter.printCompilationMessages(inputUri);
-
-  if (errorDetector.hasCompilationErrors || (component == null)) {
-    return _compileTimeErrorExitCode;
-  }
-
-  final IOSink sink = new File(kernelBinaryFilename).openWrite();
-  final BinaryPrinter printer = new BinaryPrinter(sink);
-  printer.writeComponentFile(component);
-  await sink.close();
-
-  return 0;
+  return runCompiler(_argParser.parse(arguments), _usage);
 }
 
 Future runBatchModeCompiler() async {
@@ -156,10 +60,10 @@
     globalDebuggingNames = new NameSystem();
 
     switch (exitCode) {
-      case 0:
+      case successExitCode:
         return batch_util.CompilerOutcome.Ok;
-      case _compileTimeErrorExitCode:
-      case _badUsageExitCode:
+      case compileTimeErrorExitCode:
+      case badUsageExitCode:
         return batch_util.CompilerOutcome.Fail;
       default:
         throw 'Could not obtain correct exit code from compiler.';
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 01d4c2c..e1e6bc8 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -27,7 +27,9 @@
 import 'dart:typed_data' show Uint8List;
 
 import 'package:build_integration/file_system/multi_root.dart';
+import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/api_unstable/vm.dart';
+import 'package:kernel/binary/ast_to_binary.dart';
 import 'package:kernel/kernel.dart' show Component, Procedure;
 import 'package:kernel/target/targets.dart' show TargetFlags;
 import 'package:vm/bytecode/gen_bytecode.dart' show generateBytecode;
@@ -35,6 +37,8 @@
 import 'package:vm/kernel_front_end.dart' show runWithFrontEndCompilerContext;
 import 'package:vm/http_filesystem.dart';
 import 'package:vm/target/vm.dart' show VmTarget;
+import 'package:front_end/src/api_prototype/compiler_options.dart'
+    show CompilerOptions, parseExperimentalFlags;
 
 final bool verbose = new bool.fromEnvironment('DFE_VERBOSE');
 const String platformKernelFile = 'virtual_platform_kernel.dill';
@@ -63,14 +67,21 @@
 
 abstract class Compiler {
   final FileSystem fileSystem;
+  final Uri platformKernelPath;
+  bool suppressWarnings;
+  List<String> experimentalFlags;
+  bool bytecode;
+  String packageConfig;
+
   final List<String> errors = new List<String>();
 
   CompilerOptions options;
 
-  Compiler(this.fileSystem, Uri platformKernelPath,
-      {bool suppressWarnings: false,
-      bool bytecode: false,
-      String packageConfig: null}) {
+  Compiler(this.fileSystem, this.platformKernelPath,
+      {this.suppressWarnings: false,
+      this.experimentalFlags: null,
+      this.bytecode: false,
+      this.packageConfig: null}) {
     Uri packagesUri = null;
     if (packageConfig != null) {
       packagesUri = Uri.parse(packageConfig);
@@ -85,13 +96,22 @@
       print("DFE: platformKernelPath: ${platformKernelPath}");
     }
 
+    var expFlags = List<String>();
+    if (experimentalFlags != null) {
+      for (String flag in experimentalFlags) {
+        expFlags.addAll(flag.split(","));
+      }
+    }
+
     options = new CompilerOptions()
       ..fileSystem = fileSystem
-      ..target = new VmTarget(new TargetFlags(syncAsync: true))
+      ..target = new VmTarget(new TargetFlags())
       ..packagesFileUri = packagesUri
       ..sdkSummary = platformKernelPath
       ..verbose = verbose
       ..bytecode = bytecode
+      ..experimentalFlags =
+          parseExperimentalFlags(expFlags, (msg) => errors.add(msg))
       ..onDiagnostic = (DiagnosticMessage message) {
         bool printMessage;
         switch (message.severity) {
@@ -134,15 +154,34 @@
   Future<Component> compileInternal(Uri script);
 }
 
+class FileSink implements Sink<List<int>> {
+  MemoryFileSystemEntity entityForUri;
+  List<int> bytes = <int>[];
+
+  FileSink(this.entityForUri);
+
+  @override
+  void add(List<int> data) {
+    bytes.addAll(data);
+  }
+
+  @override
+  void close() {
+    this.entityForUri.writeAsBytesSync(bytes);
+  }
+}
+
 class IncrementalCompilerWrapper extends Compiler {
   IncrementalCompiler generator;
 
   IncrementalCompilerWrapper(FileSystem fileSystem, Uri platformKernelPath,
       {bool suppressWarnings: false,
+      List<String> experimentalFlags: null,
       bool bytecode: false,
       String packageConfig: null})
       : super(fileSystem, platformKernelPath,
             suppressWarnings: suppressWarnings,
+            experimentalFlags: experimentalFlags,
             bytecode: bytecode,
             packageConfig: packageConfig);
 
@@ -157,6 +196,31 @@
 
   void accept() => generator.accept();
   void invalidate(Uri uri) => generator.invalidate(uri);
+
+  Future<IncrementalCompilerWrapper> clone(int isolateId) async {
+    IncrementalCompilerWrapper clone = IncrementalCompilerWrapper(
+        fileSystem, platformKernelPath,
+        suppressWarnings: suppressWarnings,
+        experimentalFlags: experimentalFlags,
+        bytecode: bytecode,
+        packageConfig: packageConfig);
+
+    generator.resetDeltaState();
+    Component fullComponent = await generator.compile();
+
+    // Assume fileSystem is HybridFileSystem because that is the setup where
+    // clone should be used for.
+    MemoryFileSystem memoryFileSystem = (fileSystem as HybridFileSystem).memory;
+
+    String filename = 'full-component-$isolateId.dill';
+    Sink sink = FileSink(memoryFileSystem.entityForUri(Uri.file(filename)));
+    new BinaryPrinter(sink).writeComponentFile(fullComponent);
+    await sink.close();
+
+    clone.generator = new IncrementalCompiler(options, generator.entryPoint,
+        initializeFromDillUri: Uri.file(filename));
+    return clone;
+  }
 }
 
 class SingleShotCompilerWrapper extends Compiler {
@@ -165,10 +229,12 @@
   SingleShotCompilerWrapper(FileSystem fileSystem, Uri platformKernelPath,
       {this.requireMain: false,
       bool suppressWarnings: false,
+      List<String> experimentalFlags: null,
       bool bytecode: false,
       String packageConfig: null})
       : super(fileSystem, platformKernelPath,
             suppressWarnings: suppressWarnings,
+            experimentalFlags: experimentalFlags,
             bytecode: bytecode,
             packageConfig: packageConfig);
 
@@ -192,6 +258,7 @@
 Future<Compiler> lookupOrBuildNewIncrementalCompiler(int isolateId,
     List sourceFiles, Uri platformKernelPath, List<int> platformKernel,
     {bool suppressWarnings: false,
+    List<String> experimentalFlags: null,
     bool bytecode: false,
     String packageConfig: null,
     String multirootFilepaths,
@@ -201,17 +268,29 @@
     updateSources(compiler, sourceFiles);
     invalidateSources(compiler, sourceFiles);
   } else {
-    FileSystem fileSystem = _buildFileSystem(
-        sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
+    // This is how identify scenario where child isolate hot reload requests
+    // requires setting up actual compiler first: non-empty sourceFiles list has
+    // no actual content specified for the source file.
+    if (sourceFiles != null &&
+        sourceFiles.length > 0 &&
+        sourceFiles[1] == null) {
+      // Just use first compiler that should represent main isolate as a source for cloning.
+      var source = isolateCompilers.entries.first;
+      compiler = await source.value.clone(isolateId);
+    } else {
+      FileSystem fileSystem = _buildFileSystem(
+          sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
 
-    // TODO(aam): IncrementalCompilerWrapper instance created below have to be
-    // destroyed when corresponding isolate is shut down. To achieve that kernel
-    // isolate needs to receive a message indicating that particular
-    // isolate was shut down. Message should be handled here in this script.
-    compiler = new IncrementalCompilerWrapper(fileSystem, platformKernelPath,
-        suppressWarnings: suppressWarnings,
-        bytecode: bytecode,
-        packageConfig: packageConfig);
+      // TODO(aam): IncrementalCompilerWrapper instance created below have to be
+      // destroyed when corresponding isolate is shut down. To achieve that kernel
+      // isolate needs to receive a message indicating that particular
+      // isolate was shut down. Message should be handled here in this script.
+      compiler = new IncrementalCompilerWrapper(fileSystem, platformKernelPath,
+          suppressWarnings: suppressWarnings,
+          experimentalFlags: experimentalFlags,
+          bytecode: bytecode,
+          packageConfig: packageConfig);
+    }
     isolateCompilers[isolateId] = compiler;
   }
   return compiler;
@@ -350,7 +429,16 @@
 }
 
 Future _processLoadRequest(request) async {
-  if (verbose) print("DFE: request: $request");
+  if (verbose) {
+    for (int i = 0; i < request.length; i++) {
+      var part = request[i];
+      String partToString = part.toString();
+      if (partToString.length > 256) {
+        partToString = partToString.substring(0, 255) + "...";
+      }
+      print("DFE: request[$i]: $partToString");
+    }
+  }
 
   int tag = request[0];
 
@@ -373,14 +461,24 @@
   final String inputFileUri = request[2];
   final Uri script =
       inputFileUri != null ? Uri.base.resolve(inputFileUri) : null;
-  final bool incremental = request[4];
+  bool incremental = request[4];
   final int isolateId = request[6];
   final List sourceFiles = request[7];
   final bool suppressWarnings = request[8];
-  final bool bytecode = request[9];
-  final String packageConfig = request[10];
-  final String multirootFilepaths = request[11];
-  final String multirootScheme = request[12];
+  final List<String> experimentalFlags =
+      request[9] != null ? request[9].cast<String>() : null;
+  final bool bytecode = request[10];
+  final String packageConfig = request[11];
+  final String multirootFilepaths = request[12];
+  final String multirootScheme = request[13];
+
+  if (bytecode) {
+    // Bytecode generator is hooked into kernel service after kernel component
+    // is produced. In case of incremental compilation resulting component
+    // doesn't have core libraries which are needed for bytecode generation.
+    // TODO(alexmarkov): Support bytecode generation in incremental compiler.
+    incremental = false;
+  }
 
   Uri platformKernelPath = null;
   List<int> platformKernel = null;
@@ -431,6 +529,7 @@
     compiler = await lookupOrBuildNewIncrementalCompiler(
         isolateId, sourceFiles, platformKernelPath, platformKernel,
         suppressWarnings: suppressWarnings,
+        experimentalFlags: experimentalFlags,
         bytecode: bytecode,
         packageConfig: packageConfig,
         multirootFilepaths: multirootFilepaths,
@@ -441,6 +540,7 @@
     compiler = new SingleShotCompilerWrapper(fileSystem, platformKernelPath,
         requireMain: false,
         suppressWarnings: suppressWarnings,
+        experimentalFlags: experimentalFlags,
         bytecode: bytecode,
         packageConfig: packageConfig);
   }
@@ -477,6 +577,13 @@
   if (verbose) print("DFE:> ${result}");
 
   if (tag == kTrainTag) {
+    // In training mode make sure to read the sdk a few more times...
+    ProcessedOptions p = new ProcessedOptions(options: compiler.options);
+    var bytes = await p.loadSdkSummaryBytes();
+    for (int i = 0; i < 100; i++) {
+      p.loadComponent(bytes, null);
+    }
+
     if (result.status != Status.ok) {
       tag = -tag;
     }
@@ -558,7 +665,8 @@
     1 /* isolateId chosen randomly */,
     [] /* source files */,
     false /* suppress warnings */,
-    true /* synchronous async */,
+    null /* experimental_flags */,
+    false /* generate bytecode */,
     null /* package_config */,
     null /* multirootFilepaths */,
     null /* multirootScheme */,
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index b45b4c1..eaab503 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -6,8 +6,11 @@
 
 import 'dart:typed_data';
 
+import 'package:kernel/ast.dart' show TreeNode;
+
 import 'dbc.dart';
 import 'exceptions.dart' show ExceptionsTable;
+import 'source_positions.dart' show SourcePositions;
 
 class Label {
   final bool allowsBackwardJumps;
@@ -48,7 +51,9 @@
   final Uint32List _encodeBufferIn;
   final Uint8List _encodeBufferOut;
   final ExceptionsTable exceptionsTable = new ExceptionsTable();
+  final SourcePositions sourcePositions = new SourcePositions();
   bool isUnreachable = false;
+  int currentSourcePosition = TreeNode.noOffset;
 
   BytecodeAssembler._(this._encodeBufferIn, this._encodeBufferOut);
 
@@ -70,6 +75,12 @@
     }
   }
 
+  void emitSourcePosition() {
+    if (currentSourcePosition != TreeNode.noOffset && !isUnreachable) {
+      sourcePositions.add(offsetInWords, currentSourcePosition);
+    }
+  }
+
   void emitWord(int word) {
     if (isUnreachable) {
       return;
@@ -121,11 +132,8 @@
   int _encodeAD(Opcode opcode, int ra, int rd) =>
       _uint8(opcode.index) | (_uint8(ra) << 8) | (_uint16(rd) << 16);
 
-// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
-// remove it once bytecode instruction set is finalized.
-//
-//  int _encodeAX(Opcode opcode, int ra, int rx) =>
-//      _uint8(opcode.index) | (_uint8(ra) << 8) | (_int16(rx) << 16);
+  int _encodeAX(Opcode opcode, int ra, int rx) =>
+      _uint8(opcode.index) | (_uint8(ra) << 8) | (_int16(rx) << 16);
 
   int _encodeD(Opcode opcode, int rd) =>
       _uint8(opcode.index) | (_uint16(rd) << 16);
@@ -153,6 +161,7 @@
 
   void emitBytecode0(Opcode opcode) {
     assert(BytecodeFormats[opcode].encoding == Encoding.k0);
+    emitSourcePosition();
     emitWord(_encode0(opcode));
   }
 
@@ -258,18 +267,27 @@
   }
 
   void emitIndirectStaticCall(int ra, int rd) {
+    emitSourcePosition();
     emitWord(_encodeAD(Opcode.kIndirectStaticCall, ra, rd));
   }
 
-  void emitInstanceCall(int ra, int rd) {
-    emitWord(_encodeAD(Opcode.kInstanceCall, ra, rd));
+  void emitInterfaceCall(int ra, int rd) {
+    emitSourcePosition();
+    emitWord(_encodeAD(Opcode.kInterfaceCall, ra, rd));
+  }
+
+  void emitDynamicCall(int ra, int rd) {
+    emitSourcePosition();
+    emitWord(_encodeAD(Opcode.kDynamicCall, ra, rd));
   }
 
   void emitNativeCall(int rd) {
+    emitSourcePosition();
     emitWord(_encodeD(Opcode.kNativeCall, rd));
   }
 
   void emitStoreStaticTOS(int rd) {
+    emitSourcePosition();
     emitWord(_encodeD(Opcode.kStoreStaticTOS, rd));
   }
 
@@ -282,10 +300,12 @@
   }
 
   void emitAllocate(int rd) {
+    emitSourcePosition();
     emitWord(_encodeD(Opcode.kAllocate, rd));
   }
 
   void emitAllocateT() {
+    emitSourcePosition();
     emitWord(_encode0(Opcode.kAllocateT));
   }
 
@@ -294,6 +314,7 @@
   }
 
   void emitStoreFieldTOS(int rd) {
+    emitSourcePosition();
     emitWord(_encodeD(Opcode.kStoreFieldTOS, rd));
   }
 
@@ -301,8 +322,8 @@
     emitWord(_encode0(Opcode.kStoreContextParent));
   }
 
-  void emitStoreContextVar(int rd) {
-    emitWord(_encodeD(Opcode.kStoreContextVar, rd));
+  void emitStoreContextVar(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kStoreContextVar, ra, rd));
   }
 
   void emitLoadFieldTOS(int rd) {
@@ -317,8 +338,8 @@
     emitWord(_encode0(Opcode.kLoadContextParent));
   }
 
-  void emitLoadContextVar(int rd) {
-    emitWord(_encodeD(Opcode.kLoadContextVar, rd));
+  void emitLoadContextVar(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kLoadContextVar, ra, rd));
   }
 
   void emitBooleanNegateTOS() {
@@ -326,6 +347,7 @@
   }
 
   void emitThrow(int ra) {
+    emitSourcePosition();
     emitWord(_encodeA(Opcode.kThrow, ra));
     isUnreachable = true;
   }
@@ -342,43 +364,50 @@
     emitWord(_encodeA(Opcode.kSetFrame, ra));
   }
 
-  void emitAllocateContext(int rd) {
-    emitWord(_encodeD(Opcode.kAllocateContext, rd));
+  void emitAllocateContext(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kAllocateContext, ra, rd));
   }
 
-  void emitCloneContext() {
-    emitWord(_encode0(Opcode.kCloneContext));
+  void emitCloneContext(int ra, int rd) {
+    emitWord(_encodeAD(Opcode.kCloneContext, ra, rd));
   }
 
-  void emitMoveSpecial(int ra, SpecialIndex rd) {
-    emitWord(_encodeAD(Opcode.kMoveSpecial, ra, rd.index));
+  void emitMoveSpecial(SpecialIndex ra, int rx) {
+    emitWord(_encodeAX(Opcode.kMoveSpecial, ra.index, rx));
   }
 
   void emitInstantiateType(int rd) {
+    emitSourcePosition();
     emitWord(_encodeD(Opcode.kInstantiateType, rd));
   }
 
   void emitInstantiateTypeArgumentsTOS(int ra, int rd) {
+    emitSourcePosition();
     emitWord(_encodeAD(Opcode.kInstantiateTypeArgumentsTOS, ra, rd));
   }
 
   void emitAssertAssignable(int ra, int rd) {
+    emitSourcePosition();
     emitWord(_encodeAD(Opcode.kAssertAssignable, ra, rd));
   }
 
   void emitAssertSubtype() {
+    emitSourcePosition();
     emitWord(_encode0(Opcode.kAssertSubtype));
   }
 
   void emitAssertBoolean(int ra) {
+    emitSourcePosition();
     emitWord(_encodeA(Opcode.kAssertBoolean, ra));
   }
 
-  void emitCheckStack() {
-    emitWord(_encode0(Opcode.kCheckStack));
+  void emitCheckStack(int ra) {
+    emitSourcePosition();
+    emitWord(_encodeA(Opcode.kCheckStack, ra));
   }
 
   void emitCheckFunctionTypeArgs(int ra, int rd) {
+    emitSourcePosition();
     emitWord(_encodeAD(Opcode.kCheckFunctionTypeArgs, ra, rd));
   }
 
diff --git a/pkg/vm/lib/bytecode/bytecode_serialization.dart b/pkg/vm/lib/bytecode/bytecode_serialization.dart
new file mode 100644
index 0000000..a592981
--- /dev/null
+++ b/pkg/vm/lib/bytecode/bytecode_serialization.dart
@@ -0,0 +1,360 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.bytecode.bytecode_serialization;
+
+import 'dart:io' show BytesBuilder;
+import 'dart:typed_data' show Uint8List, Uint16List;
+
+abstract class StringWriter {
+  int put(String string);
+}
+
+abstract class StringReader {
+  String get(int ref);
+}
+
+abstract class BytecodeObject {}
+
+abstract class ObjectWriter {
+  void writeObject(BytecodeObject object, BufferedWriter writer);
+}
+
+abstract class ObjectReader {
+  BytecodeObject readObject(BufferedReader reader);
+}
+
+class BufferedWriter {
+  final int formatVersion;
+  final StringWriter stringWriter;
+  final ObjectWriter objectWriter;
+  final BytesBuilder bytes = new BytesBuilder();
+  final int baseOffset;
+
+  BufferedWriter(this.formatVersion, this.stringWriter, this.objectWriter,
+      {this.baseOffset: 0});
+
+  factory BufferedWriter.fromWriter(BufferedWriter writer) =>
+      new BufferedWriter(
+          writer.formatVersion, writer.stringWriter, writer.objectWriter);
+
+  List<int> takeBytes() => bytes.takeBytes();
+
+  int get offset => bytes.length;
+
+  void writeByte(int value) {
+    assert((value >> 8) == 0);
+    bytes.addByte(value);
+  }
+
+  void writeBytes(List<int> values) {
+    bytes.add(values);
+  }
+
+  void writeUInt32(int value) {
+    if ((value >> 32) != 0) {
+      throw 'Unable to write $value as 32-bit unsigned integer';
+    }
+    // TODO(alexmarkov): consider using native byte order
+    bytes.addByte((value >> 24) & 0xFF);
+    bytes.addByte((value >> 16) & 0xFF);
+    bytes.addByte((value >> 8) & 0xFF);
+    bytes.addByte(value & 0xFF);
+  }
+
+  void writePackedUInt30(int value) {
+    if ((value >> 30) != 0) {
+      throw 'Unable to write $value as 30-bit unsigned integer';
+    }
+    if (value < 0x80) {
+      bytes.addByte(value);
+    } else if (value < 0x4000) {
+      bytes.addByte((value >> 8) | 0x80);
+      bytes.addByte(value & 0xFF);
+    } else {
+      bytes.addByte((value >> 24) | 0xC0);
+      bytes.addByte((value >> 16) & 0xFF);
+      bytes.addByte((value >> 8) & 0xFF);
+      bytes.addByte(value & 0xFF);
+    }
+  }
+
+  void writeSLEB128(int value) {
+    bool last = false;
+    do {
+      int part = value & 0x7f;
+      value >>= 7;
+      if ((value == 0 && (part & 0x40) == 0) ||
+          (value == -1 && (part & 0x40) != 0)) {
+        last = true;
+      } else {
+        part |= 0x80;
+      }
+      bytes.addByte(part);
+    } while (!last);
+  }
+
+  void writePackedStringReference(String value) {
+    writePackedUInt30(stringWriter.put(value));
+  }
+
+  void writePackedObject(BytecodeObject object) {
+    objectWriter.writeObject(object, this);
+  }
+
+  void writePackedList(List<BytecodeObject> objects) {
+    writePackedUInt30(objects.length);
+    for (var obj in objects) {
+      writePackedObject(obj);
+    }
+  }
+
+  void align(int alignment) {
+    assert(alignment & (alignment - 1) == 0);
+    int offs = baseOffset + offset;
+    int padding = ((offs + alignment - 1) & -alignment) - offs;
+    for (int i = 0; i < padding; ++i) {
+      bytes.addByte(0);
+    }
+  }
+}
+
+class BufferedReader {
+  int formatVersion;
+  StringReader stringReader;
+  ObjectReader objectReader;
+  final List<int> bytes;
+  final int baseOffset;
+
+  /// Position within [bytes], already includes [baseOffset].
+  int _pos;
+
+  BufferedReader(
+      this.formatVersion, this.stringReader, this.objectReader, this.bytes,
+      {this.baseOffset: 0})
+      : _pos = baseOffset {
+    assert((0 <= _pos) && (_pos <= bytes.length));
+  }
+
+  int get offset => _pos - baseOffset;
+
+  set offset(int offs) {
+    _pos = baseOffset + offs;
+    assert((0 <= _pos) && (_pos <= bytes.length));
+  }
+
+  int readByte() => bytes[_pos++];
+
+  int readUInt32() {
+    return (readByte() << 24) |
+        (readByte() << 16) |
+        (readByte() << 8) |
+        readByte();
+  }
+
+  int readPackedUInt30() {
+    var byte = readByte();
+    if (byte & 0x80 == 0) {
+      // 0xxxxxxx
+      return byte;
+    } else if (byte & 0x40 == 0) {
+      // 10xxxxxx
+      return ((byte & 0x3F) << 8) | readByte();
+    } else {
+      // 11xxxxxx
+      return ((byte & 0x3F) << 24) |
+          (readByte() << 16) |
+          (readByte() << 8) |
+          readByte();
+    }
+  }
+
+  int readSLEB128() {
+    int value = 0;
+    int shift = 0;
+    int part = 0;
+    do {
+      part = readByte();
+      value |= (part & 0x7f) << shift;
+      shift += 7;
+    } while ((part & 0x80) != 0);
+    const int kBitsPerInt = 64;
+    if ((shift < kBitsPerInt) && ((part & 0x40) != 0)) {
+      value |= (-1) << shift;
+    }
+    return value;
+  }
+
+  String readPackedStringReference() {
+    return stringReader.get(readPackedUInt30());
+  }
+
+  BytecodeObject readPackedObject() {
+    return objectReader.readObject(this);
+  }
+
+  List<T> readPackedList<T extends BytecodeObject>() {
+    final int len = readPackedUInt30();
+    final list = new List<T>(len);
+    for (int i = 0; i < len; ++i) {
+      list[i] = readPackedObject();
+    }
+    return list;
+  }
+
+  Uint8List readBytesAsUint8List(int count) {
+    final Uint8List result = new Uint8List(count);
+    result.setRange(0, result.length, bytes, _pos);
+    _pos += count;
+    return result;
+  }
+
+  Uint16List readBytesAsUint16List(int count) {
+    final Uint16List result = new Uint16List(count);
+    int pos = _pos;
+    for (int i = 0; i < count; ++i) {
+      result[i] = bytes[pos] | (bytes[pos + 1] << 8);
+      pos += 2;
+    }
+    _pos += count << 1;
+    return result;
+  }
+
+  void align(int alignment) {
+    assert(alignment & (alignment - 1) == 0);
+    _pos = ((_pos + alignment - 1) & -alignment);
+  }
+}
+
+class StringTable implements StringWriter, StringReader {
+  // Bit 0 in string reference is set for two-byte strings.
+  static const int flagTwoByteString = 1;
+
+  Map<String, int> _map = <String, int>{};
+  List<String> _oneByteStrings = <String>[];
+  List<String> _twoByteStrings = <String>[];
+  bool _written = false;
+
+  StringTable();
+
+  @override
+  int put(String string) {
+    int ref = _map[string];
+    if (ref == null) {
+      if (_written) {
+        throw 'Unable to add a string to string table after it was written';
+      }
+      if (isOneByteString(string)) {
+        ref = (_oneByteStrings.length << 1);
+        _oneByteStrings.add(string);
+      } else {
+        ref = (_twoByteStrings.length << 1) | flagTwoByteString;
+        _twoByteStrings.add(string);
+      }
+      _map[string] = ref;
+    }
+    return ref;
+  }
+
+  @override
+  String get(int ref) {
+    if ((ref & flagTwoByteString) == 0) {
+      return _oneByteStrings[ref >> 1];
+    } else {
+      return _twoByteStrings[ref >> 1];
+    }
+  }
+
+  bool isOneByteString(String value) {
+    const int maxLatin1 = 0xff;
+    for (int i = 0; i < value.length; ++i) {
+      if (value.codeUnitAt(i) > maxLatin1) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  void write(BufferedWriter writer) {
+    writer.writeUInt32(_oneByteStrings.length);
+    writer.writeUInt32(_twoByteStrings.length);
+    int endOffset = 0;
+    for (var str in _oneByteStrings) {
+      endOffset += str.length;
+      writer.writeUInt32(endOffset);
+    }
+    for (var str in _twoByteStrings) {
+      endOffset += str.length << 1;
+      writer.writeUInt32(endOffset);
+    }
+    for (var str in _oneByteStrings) {
+      for (int i = 0; i < str.length; ++i) {
+        writer.writeByte(str.codeUnitAt(i));
+      }
+    }
+    for (var str in _twoByteStrings) {
+      for (int i = 0; i < str.length; ++i) {
+        int utf16codeUnit = str.codeUnitAt(i);
+        writer.writeByte(utf16codeUnit & 0xFF);
+        writer.writeByte(utf16codeUnit >> 8);
+      }
+    }
+    _written = true;
+  }
+
+  StringTable.read(BufferedReader reader) {
+    final int numOneByteStrings = reader.readUInt32();
+    final int numTwoByteStrings = reader.readUInt32();
+    final List<int> oneByteEndOffsets = new List<int>(numOneByteStrings);
+    for (int i = 0; i < oneByteEndOffsets.length; ++i) {
+      oneByteEndOffsets[i] = reader.readUInt32();
+    }
+    List<int> twoByteEndOffsets = new List<int>(numTwoByteStrings);
+    for (int i = 0; i < twoByteEndOffsets.length; ++i) {
+      twoByteEndOffsets[i] = reader.readUInt32();
+    }
+    int start = 0;
+    if (numOneByteStrings > 0) {
+      _oneByteStrings = new List<String>(numOneByteStrings);
+      final charCodes = reader.readBytesAsUint8List(oneByteEndOffsets.last);
+      for (int i = 0; i < _oneByteStrings.length; ++i) {
+        final end = oneByteEndOffsets[i];
+        final str = new String.fromCharCodes(charCodes, start, end);
+        _oneByteStrings[i] = str;
+        _map[str] = i << 1;
+        start = end;
+      }
+    }
+    final int twoByteBaseOffset = start;
+    if (numTwoByteStrings > 0) {
+      int start = 0;
+      _twoByteStrings = new List<String>(numTwoByteStrings);
+      final charCodes = reader.readBytesAsUint16List(
+          (twoByteEndOffsets.last - twoByteBaseOffset) >> 1);
+      for (int i = 0; i < _twoByteStrings.length; ++i) {
+        final end = (twoByteEndOffsets[i] - twoByteBaseOffset) >> 1;
+        final str = new String.fromCharCodes(charCodes, start, end);
+        _twoByteStrings[i] = str;
+        _map[str] = (i << 1) | flagTwoByteString;
+        start = end;
+      }
+    }
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.writeln('StringTable {');
+    sb.writeln('  // One Byte Strings');
+    for (String str in _oneByteStrings) {
+      sb.writeln('  "$str"');
+    }
+    sb.writeln('  // Two Byte Strings');
+    for (String str in _twoByteStrings) {
+      sb.writeln('  "$str"');
+    }
+    sb.writeln('}');
+    return sb.toString();
+  }
+}
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index a9233b7..e4c77c1 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -7,9 +7,11 @@
 import 'dart:typed_data';
 
 import 'package:kernel/ast.dart' hide MapEntry;
-import 'package:kernel/text/ast_to_text.dart' show Printer;
 
 import 'dbc.dart' show constantPoolIndexLimit, BytecodeLimitExceededException;
+import 'bytecode_serialization.dart'
+    show BufferedWriter, BufferedReader, StringTable;
+import 'object_table.dart' show ObjectHandle, ObjectTable;
 
 /*
 
@@ -32,7 +34,7 @@
 
 type ConstantString extends ConstantPoolEntry {
   Byte tag = 2;
-  StringReference value;
+  PackedString value;
 }
 
 type ConstantInt extends ConstantPoolEntry {
@@ -49,14 +51,14 @@
 
 type ConstantBool extends ConstantPoolEntry {
   Byte tag = 5;
-  UInt flag;
+  Byte flag;
 }
 
 type ConstantArgDesc extends ConstantPoolEntry {
   Byte tag = 6;
   UInt numArguments;
   UInt numTypeArgs;
-  List<StringReference> names;
+  List<PackedString> names;
 }
 
 enum InvocationKind {
@@ -69,76 +71,74 @@
   Byte tag = 7;
   Byte flags(invocationKindBit0, invocationKindBit1, isDynamic);
              // Where invocationKind is index into InvocationKind.
-  Name targetName;
+  PackedObject targetName;
   ConstantIndex argDesc;
 }
 
 type ConstantStaticICData extends ConstantPoolEntry {
   Byte tag = 8;
-  Byte invocationKind; // Index in InvocationKind enum.
-  CanonicalNameReference target;
+  PackedObject target;
   ConstantIndex argDesc;
 }
 
 type ConstantStaticField extends ConstantPoolEntry {
   Byte tag = 9;
-  CanonicalNameReference field;
+  PackedObject field;
 }
 
 // Occupies 2 entries in the constant pool.
 type ConstantInstanceField extends ConstantPoolEntry {
   Byte tag = 10;
-  CanonicalNameReference field;
+  PackedObject field;
 }
 
 type ConstantClass extends ConstantPoolEntry {
   Byte tag = 11;
-  CanonicalNameReference class;
+  PackedObject class;
 }
 
 type ConstantTypeArgumentsField extends ConstantPoolEntry {
   Byte tag = 12;
-  CanonicalNameReference class;
+  PackedObject class;
 }
 
 type ConstantTearOff extends ConstantPoolEntry {
   Byte tag = 13;
-  CanonicalNameReference target;
+  PackedObject target;
 }
 
 type ConstantType extends ConstantPoolEntry {
   Byte tag = 14;
-  DartType type;
+  PackedObject type;
 }
 
 type ConstantTypeArguments extends ConstantPoolEntry {
   Byte tag = 15;
-  List<DartType> types;
+  List<PackedObject> types;
 }
 
 type ConstantList extends ConstantPoolEntry {
   Byte tag = 16;
-  DartType typeArg;
+  PackedObject typeArg;
   List<ConstantIndex> entries;
 }
 
 type ConstantInstance extends ConstantPoolEntry {
   Byte tag = 17;
-  CanonicalNameReference class;
+  PackedObject class;
   ConstantIndex typeArguments;
-  List<Pair<CanonicalNameReference, ConstantIndex>> fieldValues;
+  List<Pair<PackedObject, ConstantIndex>> fieldValues;
 }
 
 type ConstantTypeArgumentsForInstanceAllocation extends ConstantPoolEntry {
   Byte tag = 18;
-  CanonicalNameReference instantiatingClass;
-  List<DartType> types;
+  PackedObject instantiatingClass;
+  List<PackedObject> types;
 }
 
 type ConstantClosureFunction extends ConstantPoolEntry {
   Byte tag = 19;
-  StringReference name;
-  FunctionNode function; // Doesn't have a body.
+  UInt closureIndex;
 }
 
 type ConstantEndClosureFunctionScope extends ConstantPoolEntry {
@@ -147,7 +147,7 @@
 
 type ConstantNativeEntry extends ConstantPoolEntry {
   Byte tag = 21;
-  StringReference nativeName;
+  PackedString nativeName;
 }
 
 type ConstantSubtypeTestCache extends ConstantPoolEntry {
@@ -166,8 +166,16 @@
 
 type ConstantSymbol extends ConstantPoolEntry {
   Byte tag = 25;
-  Option<LibraryReference> library;
-  StringReference name;
+  PackedObject name;
+}
+
+// Occupies 2 entries in the constant pool.
+type ConstantInterfaceCall extends ConstantPoolEntry {
+  Byte tag = 26;
+  Byte flags(invocationKindBit0, invocationKindBit1);
+             // Where invocationKind is index into InvocationKind.
+  PackedObject targetName;
+  ConstantIndex argDesc;
 }
 
 */
@@ -199,6 +207,7 @@
   kPartialTearOffInstantiation,
   kEmptyTypeArguments,
   kSymbol,
+  kInterfaceCall,
 }
 
 abstract class ConstantPoolEntry {
@@ -210,69 +219,70 @@
   // following this entry.
   int get numReservedEntries => 0;
 
-  void writeToBinary(BinarySink sink) {
-    sink.writeUInt30(tag.index);
-    writeValueToBinary(sink);
+  void write(BufferedWriter writer) {
+    writer.writeByte(tag.index);
+    writeValue(writer);
   }
 
-  void writeValueToBinary(BinarySink sink);
+  void writeValue(BufferedWriter writer);
 
-  factory ConstantPoolEntry.readFromBinary(BinarySource source) {
-    ConstantTag tag = ConstantTag.values[source.readUInt()];
+  factory ConstantPoolEntry.read(BufferedReader reader) {
+    ConstantTag tag = ConstantTag.values[reader.readByte()];
     switch (tag) {
       case ConstantTag.kInvalid:
         break;
       case ConstantTag.kNull:
-        return new ConstantNull.readFromBinary(source);
+        return new ConstantNull.read(reader);
       case ConstantTag.kString:
-        return new ConstantString.readFromBinary(source);
+        return new ConstantString.read(reader);
       case ConstantTag.kInt:
-        return new ConstantInt.readFromBinary(source);
+        return new ConstantInt.read(reader);
       case ConstantTag.kDouble:
-        return new ConstantDouble.readFromBinary(source);
+        return new ConstantDouble.read(reader);
       case ConstantTag.kBool:
-        return new ConstantBool.readFromBinary(source);
+        return new ConstantBool.read(reader);
       case ConstantTag.kICData:
-        return new ConstantICData.readFromBinary(source);
+        return new ConstantICData.read(reader);
       case ConstantTag.kStaticICData:
-        return new ConstantStaticICData.readFromBinary(source);
+        return new ConstantStaticICData.read(reader);
       case ConstantTag.kArgDesc:
-        return new ConstantArgDesc.readFromBinary(source);
+        return new ConstantArgDesc.read(reader);
       case ConstantTag.kStaticField:
-        return new ConstantStaticField.readFromBinary(source);
+        return new ConstantStaticField.read(reader);
       case ConstantTag.kInstanceField:
-        return new ConstantInstanceField.readFromBinary(source);
+        return new ConstantInstanceField.read(reader);
       case ConstantTag.kClass:
-        return new ConstantClass.readFromBinary(source);
+        return new ConstantClass.read(reader);
       case ConstantTag.kTypeArgumentsField:
-        return new ConstantTypeArgumentsField.readFromBinary(source);
+        return new ConstantTypeArgumentsField.read(reader);
       case ConstantTag.kTearOff:
-        return new ConstantTearOff.readFromBinary(source);
+        return new ConstantTearOff.read(reader);
       case ConstantTag.kType:
-        return new ConstantType.readFromBinary(source);
+        return new ConstantType.read(reader);
       case ConstantTag.kTypeArguments:
-        return new ConstantTypeArguments.readFromBinary(source);
+        return new ConstantTypeArguments.read(reader);
       case ConstantTag.kList:
-        return new ConstantList.readFromBinary(source);
+        return new ConstantList.read(reader);
       case ConstantTag.kInstance:
-        return new ConstantInstance.readFromBinary(source);
+        return new ConstantInstance.read(reader);
       case ConstantTag.kTypeArgumentsForInstanceAllocation:
-        return new ConstantTypeArgumentsForInstanceAllocation.readFromBinary(
-            source);
+        return new ConstantTypeArgumentsForInstanceAllocation.read(reader);
       case ConstantTag.kClosureFunction:
-        return new ConstantClosureFunction.readFromBinary(source);
+        return new ConstantClosureFunction.read(reader);
       case ConstantTag.kEndClosureFunctionScope:
-        return new ConstantEndClosureFunctionScope.readFromBinary(source);
+        return new ConstantEndClosureFunctionScope.read(reader);
       case ConstantTag.kNativeEntry:
-        return new ConstantNativeEntry.readFromBinary(source);
+        return new ConstantNativeEntry.read(reader);
       case ConstantTag.kSubtypeTestCache:
-        return new ConstantSubtypeTestCache.readFromBinary(source);
+        return new ConstantSubtypeTestCache.read(reader);
       case ConstantTag.kPartialTearOffInstantiation:
-        return new ConstantPartialTearOffInstantiation.readFromBinary(source);
+        return new ConstantPartialTearOffInstantiation.read(reader);
       case ConstantTag.kEmptyTypeArguments:
-        return new ConstantEmptyTypeArguments.readFromBinary(source);
+        return new ConstantEmptyTypeArguments.read(reader);
       case ConstantTag.kSymbol:
-        return new ConstantSymbol.readFromBinary(source);
+        return new ConstantSymbol.read(reader);
+      case ConstantTag.kInterfaceCall:
+        return new ConstantInterfaceCall.read(reader);
     }
     throw 'Unexpected constant tag $tag';
   }
@@ -285,9 +295,9 @@
   ConstantTag get tag => ConstantTag.kNull;
 
   @override
-  void writeValueToBinary(BinarySink sink) {}
+  void writeValue(BufferedWriter writer) {}
 
-  ConstantNull.readFromBinary(BinarySource source);
+  ConstantNull.read(BufferedReader reader);
 
   @override
   String toString() => 'Null';
@@ -309,12 +319,12 @@
   ConstantTag get tag => ConstantTag.kString;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeStringReference(value);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedStringReference(value);
   }
 
-  ConstantString.readFromBinary(BinarySource source)
-      : value = source.readStringReference();
+  ConstantString.read(BufferedReader reader)
+      : value = reader.readPackedStringReference();
 
   @override
   String toString() => 'String \'$value\'';
@@ -331,20 +341,19 @@
   final int value;
 
   ConstantInt(this.value);
-  ConstantInt.fromLiteral(IntLiteral literal) : this(literal.value);
 
   @override
   ConstantTag get tag => ConstantTag.kInt;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
+  void writeValue(BufferedWriter writer) {
     // TODO(alexmarkov): more efficient encoding
-    sink.writeUInt32(value & 0xffffffff);
-    sink.writeUInt32((value >> 32) & 0xffffffff);
+    writer.writeUInt32(value & 0xffffffff);
+    writer.writeUInt32((value >> 32) & 0xffffffff);
   }
 
-  ConstantInt.readFromBinary(BinarySource source)
-      : value = source.readUint32() | (source.readUint32() << 32);
+  ConstantInt.read(BufferedReader reader)
+      : value = reader.readUInt32() | (reader.readUInt32() << 32);
 
   @override
   String toString() => 'Int $value';
@@ -360,7 +369,6 @@
   final double value;
 
   ConstantDouble(this.value);
-  ConstantDouble.fromLiteral(DoubleLiteral literal) : this(literal.value);
 
   @override
   ConstantTag get tag => ConstantTag.kDouble;
@@ -378,16 +386,16 @@
   }
 
   @override
-  void writeValueToBinary(BinarySink sink) {
+  void writeValue(BufferedWriter writer) {
     // TODO(alexmarkov): more efficient encoding
     int bits = doubleToIntBits(value);
-    sink.writeUInt32(bits & 0xffffffff);
-    sink.writeUInt32((bits >> 32) & 0xffffffff);
+    writer.writeUInt32(bits & 0xffffffff);
+    writer.writeUInt32((bits >> 32) & 0xffffffff);
   }
 
-  ConstantDouble.readFromBinary(BinarySource source)
+  ConstantDouble.read(BufferedReader reader)
       : value =
-            intBitsToDouble(source.readUint32() | (source.readUint32() << 32));
+            intBitsToDouble(reader.readUInt32() | (reader.readUInt32() << 32));
 
   @override
   String toString() => 'Double $value';
@@ -410,12 +418,11 @@
   ConstantTag get tag => ConstantTag.kBool;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeUInt30(value ? 1 : 0);
+  void writeValue(BufferedWriter writer) {
+    writer.writeByte(value ? 1 : 0);
   }
 
-  ConstantBool.readFromBinary(BinarySource source)
-      : value = source.readUInt() != 0;
+  ConstantBool.read(BufferedReader reader) : value = reader.readByte() != 0;
 
   @override
   String toString() => 'Bool $value';
@@ -432,11 +439,10 @@
   final int numTypeArgs;
   final List<String> argNames;
 
-  ConstantArgDesc(this.numArguments,
-      {this.numTypeArgs = 0, this.argNames = const <String>[]});
+  ConstantArgDesc(this.numArguments, this.numTypeArgs, this.argNames);
 
-  ConstantArgDesc.fromArguments(Arguments args,
-      {bool hasReceiver: false, bool isFactory: false})
+  ConstantArgDesc.fromArguments(
+      Arguments args, bool hasReceiver, bool isFactory)
       : this(
             args.positional.length +
                 args.named.length +
@@ -446,25 +452,25 @@
                 // numTypeArgs.
                 // TODO(alexmarkov): Clean this up.
                 (isFactory ? 1 : 0),
-            numTypeArgs: isFactory ? 0 : args.types.length,
-            argNames: new List<String>.from(args.named.map((ne) => ne.name)));
+            isFactory ? 0 : args.types.length,
+            new List<String>.from(args.named.map((ne) => ne.name)));
 
   @override
   ConstantTag get tag => ConstantTag.kArgDesc;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeUInt30(numArguments);
-    sink.writeUInt30(numTypeArgs);
-    sink.writeUInt30(argNames.length);
-    argNames.forEach(sink.writeStringReference);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedUInt30(numArguments);
+    writer.writePackedUInt30(numTypeArgs);
+    writer.writePackedUInt30(argNames.length);
+    argNames.forEach(writer.writePackedStringReference);
   }
 
-  ConstantArgDesc.readFromBinary(BinarySource source)
-      : numArguments = source.readUInt(),
-        numTypeArgs = source.readUInt(),
-        argNames = new List<String>.generate(
-            source.readUInt(), (_) => source.readStringReference());
+  ConstantArgDesc.read(BufferedReader reader)
+      : numArguments = reader.readPackedUInt30(),
+        numTypeArgs = reader.readPackedUInt30(),
+        argNames = new List<String>.generate(reader.readPackedUInt30(),
+            (_) => reader.readPackedStringReference());
 
   @override
   String toString() =>
@@ -501,12 +507,11 @@
   static const int flagDynamic = 1 << 2;
 
   final int _flags;
-  final Name targetName;
+  final ObjectHandle targetName;
   final int argDescConstantIndex;
 
-  ConstantICData(
-      InvocationKind invocationKind, this.targetName, this.argDescConstantIndex,
-      {bool isDynamic: false})
+  ConstantICData(InvocationKind invocationKind, this.targetName,
+      this.argDescConstantIndex, bool isDynamic)
       : assert(invocationKind.index <= invocationKindMask),
         _flags = invocationKind.index | (isDynamic ? flagDynamic : 0);
 
@@ -519,16 +524,16 @@
   ConstantTag get tag => ConstantTag.kICData;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeByte(_flags);
-    sink.writeName(targetName);
-    sink.writeUInt30(argDescConstantIndex);
+  void writeValue(BufferedWriter writer) {
+    writer.writeByte(_flags);
+    writer.writePackedObject(targetName);
+    writer.writePackedUInt30(argDescConstantIndex);
   }
 
-  ConstantICData.readFromBinary(BinarySource source)
-      : _flags = source.readByte(),
-        targetName = source.readName(),
-        argDescConstantIndex = source.readUInt();
+  ConstantICData.read(BufferedReader reader)
+      : _flags = reader.readByte(),
+        targetName = reader.readPackedObject(),
+        argDescConstantIndex = reader.readPackedUInt30();
 
   @override
   String toString() => 'ICData '
@@ -547,37 +552,26 @@
 }
 
 class ConstantStaticICData extends ConstantPoolEntry {
-  final InvocationKind invocationKind;
-  final Reference _reference;
+  final ObjectHandle target;
   final int argDescConstantIndex;
 
-  ConstantStaticICData(
-      InvocationKind invocationKind, Member member, int argDescConstantIndex)
-      : this.byReference(
-            invocationKind, member.reference, argDescConstantIndex);
-
-  ConstantStaticICData.byReference(
-      this.invocationKind, this._reference, this.argDescConstantIndex);
-
-  Member get target => _reference.asMember;
+  ConstantStaticICData(this.target, this.argDescConstantIndex);
 
   @override
   ConstantTag get tag => ConstantTag.kStaticICData;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeByte(invocationKind.index);
-    sink.writeCanonicalNameReference(getCanonicalNameOfMember(target));
-    sink.writeUInt30(argDescConstantIndex);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(target);
+    writer.writePackedUInt30(argDescConstantIndex);
   }
 
-  ConstantStaticICData.readFromBinary(BinarySource source)
-      : invocationKind = InvocationKind.values[source.readByte()],
-        _reference = source.readCanonicalNameReference().getReference(),
-        argDescConstantIndex = source.readUInt();
+  ConstantStaticICData.read(BufferedReader reader)
+      : target = reader.readPackedObject(),
+        argDescConstantIndex = reader.readPackedUInt30();
 
   @override
-  String toString() => 'StaticICData ${_invocationKindToString(invocationKind)}'
+  String toString() => 'StaticICData '
       'target \'$target\', arg-desc CP#$argDescConstantIndex';
 
   // ConstantStaticICData entries are created per call site and should not be
@@ -592,23 +586,20 @@
 }
 
 class ConstantStaticField extends ConstantPoolEntry {
-  final Reference _reference;
+  final ObjectHandle field;
 
-  Field get field => _reference.asField;
-
-  ConstantStaticField(Field field) : this.byReference(field.reference);
-  ConstantStaticField.byReference(this._reference);
+  ConstantStaticField(this.field);
 
   @override
   ConstantTag get tag => ConstantTag.kStaticField;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeCanonicalNameReference(getCanonicalNameOfMember(field));
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(field);
   }
 
-  ConstantStaticField.readFromBinary(BinarySource source)
-      : _reference = source.readCanonicalNameReference().getReference();
+  ConstantStaticField.read(BufferedReader reader)
+      : field = reader.readPackedObject();
 
   @override
   String toString() => 'StaticField $field';
@@ -622,24 +613,22 @@
 }
 
 class ConstantInstanceField extends ConstantPoolEntry {
-  final Reference _reference;
+  final ObjectHandle field;
 
-  Field get field => _reference.asField;
   int get numReservedEntries => 1;
 
-  ConstantInstanceField(Field field) : this.byReference(field.reference);
-  ConstantInstanceField.byReference(this._reference);
+  ConstantInstanceField(this.field);
 
   @override
   ConstantTag get tag => ConstantTag.kInstanceField;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeCanonicalNameReference(getCanonicalNameOfMember(field));
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(field);
   }
 
-  ConstantInstanceField.readFromBinary(BinarySource source)
-      : _reference = source.readCanonicalNameReference().getReference();
+  ConstantInstanceField.read(BufferedReader reader)
+      : field = reader.readPackedObject();
 
   @override
   String toString() => 'InstanceField $field';
@@ -653,83 +642,75 @@
 }
 
 class ConstantClass extends ConstantPoolEntry {
-  final Reference _reference;
+  final ObjectHandle classHandle;
 
-  Class get classNode => _reference.asClass;
-
-  ConstantClass(Class class_) : this.byReference(class_.reference);
-  ConstantClass.byReference(this._reference);
+  ConstantClass(this.classHandle);
 
   @override
   ConstantTag get tag => ConstantTag.kClass;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeCanonicalNameReference(getCanonicalNameOfClass(classNode));
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(classHandle);
   }
 
-  ConstantClass.readFromBinary(BinarySource source)
-      : _reference = source.readCanonicalNameReference().getReference();
+  ConstantClass.read(BufferedReader reader)
+      : classHandle = reader.readPackedObject();
 
   @override
-  String toString() => 'Class $classNode';
+  String toString() => 'Class $classHandle';
 
   @override
-  int get hashCode => classNode.hashCode;
+  int get hashCode => classHandle.hashCode;
 
   @override
   bool operator ==(other) =>
-      other is ConstantClass && this.classNode == other.classNode;
+      other is ConstantClass && this.classHandle == other.classHandle;
 }
 
 class ConstantTypeArgumentsField extends ConstantPoolEntry {
-  final Reference _reference;
+  final ObjectHandle classHandle;
 
-  Class get classNode => _reference.asClass;
-
-  ConstantTypeArgumentsField(Class class_) : this.byReference(class_.reference);
-  ConstantTypeArgumentsField.byReference(this._reference);
+  ConstantTypeArgumentsField(this.classHandle);
 
   @override
   ConstantTag get tag => ConstantTag.kTypeArgumentsField;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeCanonicalNameReference(getCanonicalNameOfClass(classNode));
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(classHandle);
   }
 
-  ConstantTypeArgumentsField.readFromBinary(BinarySource source)
-      : _reference = source.readCanonicalNameReference().getReference();
+  ConstantTypeArgumentsField.read(BufferedReader reader)
+      : classHandle = reader.readPackedObject();
 
   @override
-  String toString() => 'TypeArgumentsField $classNode';
+  String toString() => 'TypeArgumentsField $classHandle';
 
   @override
-  int get hashCode => classNode.hashCode;
+  int get hashCode => classHandle.hashCode;
 
   @override
   bool operator ==(other) =>
-      other is ConstantTypeArgumentsField && this.classNode == other.classNode;
+      other is ConstantTypeArgumentsField &&
+      this.classHandle == other.classHandle;
 }
 
 class ConstantTearOff extends ConstantPoolEntry {
-  final Reference _reference;
+  final ObjectHandle procedure;
 
-  Procedure get procedure => _reference.asProcedure;
-
-  ConstantTearOff(Procedure procedure) : this.byReference(procedure.reference);
-  ConstantTearOff.byReference(this._reference);
+  ConstantTearOff(this.procedure);
 
   @override
   ConstantTag get tag => ConstantTag.kTearOff;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeCanonicalNameReference(getCanonicalNameOfMember(procedure));
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(procedure);
   }
 
-  ConstantTearOff.readFromBinary(BinarySource source)
-      : _reference = source.readCanonicalNameReference().getReference();
+  ConstantTearOff.read(BufferedReader reader)
+      : procedure = reader.readPackedObject();
 
   @override
   String toString() => 'TearOff $procedure';
@@ -743,7 +724,7 @@
 }
 
 class ConstantType extends ConstantPoolEntry {
-  final DartType type;
+  final ObjectHandle type;
 
   ConstantType(this.type);
 
@@ -751,12 +732,11 @@
   ConstantTag get tag => ConstantTag.kType;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeDartType(type);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(type);
   }
 
-  ConstantType.readFromBinary(BinarySource source)
-      : type = source.readDartType();
+  ConstantType.read(BufferedReader reader) : type = reader.readPackedObject();
 
   @override
   String toString() => 'Type $type';
@@ -769,7 +749,7 @@
 }
 
 class ConstantTypeArguments extends ConstantPoolEntry {
-  final List<DartType> typeArgs;
+  final List<ObjectHandle> typeArgs;
 
   ConstantTypeArguments(this.typeArgs);
 
@@ -777,14 +757,12 @@
   ConstantTag get tag => ConstantTag.kTypeArguments;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeUInt30(typeArgs.length);
-    typeArgs.forEach(sink.writeDartType);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedList(typeArgs);
   }
 
-  ConstantTypeArguments.readFromBinary(BinarySource source)
-      : typeArgs = new List<DartType>.generate(
-            source.readUInt(), (_) => source.readDartType());
+  ConstantTypeArguments.read(BufferedReader reader)
+      : typeArgs = reader.readPackedList();
 
   @override
   String toString() => 'TypeArgs $typeArgs';
@@ -799,7 +777,7 @@
 }
 
 class ConstantList extends ConstantPoolEntry {
-  final DartType typeArg;
+  final ObjectHandle typeArg;
   final List<int> entries;
 
   ConstantList(this.typeArg, this.entries);
@@ -808,16 +786,16 @@
   ConstantTag get tag => ConstantTag.kList;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeDartType(typeArg);
-    sink.writeUInt30(entries.length);
-    entries.forEach(sink.writeUInt30);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(typeArg);
+    writer.writePackedUInt30(entries.length);
+    entries.forEach(writer.writePackedUInt30);
   }
 
-  ConstantList.readFromBinary(BinarySource source)
-      : typeArg = source.readDartType(),
-        entries =
-            new List<int>.generate(source.readUInt(), (_) => source.readUInt());
+  ConstantList.read(BufferedReader reader)
+      : typeArg = reader.readPackedObject(),
+        entries = new List<int>.generate(
+            reader.readPackedUInt30(), (_) => reader.readPackedUInt30());
 
   @override
   String toString() => 'List type-arg $typeArg, entries CP# $entries';
@@ -833,96 +811,79 @@
 }
 
 class ConstantInstance extends ConstantPoolEntry {
-  final Reference _classReference;
+  final ObjectHandle classHandle;
   final int _typeArgumentsConstantIndex;
-  final Map<Reference, int> _fieldValues;
+  final Map<ObjectHandle, int> _fieldValues;
 
-  ConstantInstance(Class class_, int typeArgumentsConstantIndex,
-      Map<Reference, int> fieldValues)
-      : this.byReference(
-            class_.reference, typeArgumentsConstantIndex, fieldValues);
-
-  ConstantInstance.byReference(this._classReference,
-      this._typeArgumentsConstantIndex, this._fieldValues);
+  ConstantInstance(
+      this.classHandle, this._typeArgumentsConstantIndex, this._fieldValues);
 
   @override
   ConstantTag get tag => ConstantTag.kInstance;
 
-  Class get classNode => _classReference.asClass;
-
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeCanonicalNameReference(getCanonicalNameOfClass(classNode));
-    sink.writeUInt30(_typeArgumentsConstantIndex);
-    sink.writeUInt30(_fieldValues.length);
-    _fieldValues.forEach((Reference fieldRef, int valueIndex) {
-      sink.writeCanonicalNameReference(
-          getCanonicalNameOfMember(fieldRef.asField));
-      sink.writeUInt30(valueIndex);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(classHandle);
+    writer.writePackedUInt30(_typeArgumentsConstantIndex);
+    writer.writePackedUInt30(_fieldValues.length);
+    _fieldValues.forEach((ObjectHandle field, int valueIndex) {
+      writer.writePackedObject(field);
+      writer.writePackedUInt30(valueIndex);
     });
   }
 
-  ConstantInstance.readFromBinary(BinarySource source)
-      : _classReference = source.readCanonicalNameReference().getReference(),
-        _typeArgumentsConstantIndex = source.readUInt(),
-        _fieldValues = new Map<Reference, int>() {
-    final fieldValuesLen = source.readUInt();
+  ConstantInstance.read(BufferedReader reader)
+      : classHandle = reader.readPackedObject(),
+        _typeArgumentsConstantIndex = reader.readPackedUInt30(),
+        _fieldValues = new Map<ObjectHandle, int>() {
+    final fieldValuesLen = reader.readPackedUInt30();
     for (int i = 0; i < fieldValuesLen; i++) {
-      final fieldRef = source.readCanonicalNameReference().getReference();
-      final valueIndex = source.readUInt();
-      _fieldValues[fieldRef] = valueIndex;
+      final field = reader.readPackedObject();
+      final valueIndex = reader.readPackedUInt30();
+      _fieldValues[field] = valueIndex;
     }
   }
 
   @override
   String toString() {
     final values = _fieldValues.map<String, String>(
-        (Reference fieldRef, int valueIndex) =>
-            new MapEntry(fieldRef.asField.name.name, 'CP#$valueIndex'));
-    return 'Instance $classNode type-args CP#$_typeArgumentsConstantIndex $values';
+        (ObjectHandle field, int valueIndex) =>
+            new MapEntry(field.toString(), 'CP#$valueIndex'));
+    return 'Instance $classHandle type-args CP#$_typeArgumentsConstantIndex $values';
   }
 
   @override
   int get hashCode => _combineHashes(
-      _combineHashes(classNode.hashCode, _typeArgumentsConstantIndex),
+      _combineHashes(classHandle.hashCode, _typeArgumentsConstantIndex),
       mapHashCode(_fieldValues));
 
   @override
   bool operator ==(other) =>
       other is ConstantInstance &&
-      this.classNode == other.classNode &&
+      this.classHandle == other.classHandle &&
       this._typeArgumentsConstantIndex == other._typeArgumentsConstantIndex &&
       mapEquals(this._fieldValues, other._fieldValues);
 }
 
 class ConstantTypeArgumentsForInstanceAllocation extends ConstantPoolEntry {
-  final Reference _instantiatingClassRef;
-  final List<DartType> typeArgs;
-
-  Class get instantiatingClass => _instantiatingClassRef.asClass;
+  final ObjectHandle instantiatingClass;
+  final List<ObjectHandle> typeArgs;
 
   ConstantTypeArgumentsForInstanceAllocation(
-      Class instantiatingClass, List<DartType> typeArgs)
-      : this.byReference(instantiatingClass.reference, typeArgs);
-  ConstantTypeArgumentsForInstanceAllocation.byReference(
-      this._instantiatingClassRef, this.typeArgs);
+      this.instantiatingClass, this.typeArgs);
 
   @override
   ConstantTag get tag => ConstantTag.kTypeArgumentsForInstanceAllocation;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeCanonicalNameReference(
-        getCanonicalNameOfClass(instantiatingClass));
-    sink.writeUInt30(typeArgs.length);
-    typeArgs.forEach(sink.writeDartType);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(instantiatingClass);
+    writer.writePackedList(typeArgs);
   }
 
-  ConstantTypeArgumentsForInstanceAllocation.readFromBinary(BinarySource source)
-      : _instantiatingClassRef =
-            source.readCanonicalNameReference().getReference(),
-        typeArgs = new List<DartType>.generate(
-            source.readUInt(), (_) => source.readDartType());
+  ConstantTypeArgumentsForInstanceAllocation.read(BufferedReader reader)
+      : instantiatingClass = reader.readPackedObject(),
+        typeArgs = reader.readPackedList();
 
   @override
   String toString() =>
@@ -940,47 +901,33 @@
 }
 
 class ConstantClosureFunction extends ConstantPoolEntry {
-  final String name;
-  final FunctionNode function;
+  final int closureIndex;
 
-  ConstantClosureFunction(this.name, this.function);
+  ConstantClosureFunction(this.closureIndex);
 
   @override
   ConstantTag get tag => ConstantTag.kClosureFunction;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeStringReference(name);
-    _withoutFunctionBody(() {
-      sink.writeNode(function);
-    });
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedUInt30(closureIndex);
   }
 
-  ConstantClosureFunction.readFromBinary(BinarySource source)
-      : name = source.readStringReference(),
-        function = source.readFunctionNode() {
-    assert(function.body == null);
-  }
+  ConstantClosureFunction.read(BufferedReader reader)
+      : closureIndex = reader.readPackedUInt30();
 
   @override
   String toString() {
-    StringBuffer buffer = new StringBuffer();
-    _withoutFunctionBody(() {
-      new Printer(buffer).writeFunction(function);
-    });
-    return 'ClosureFunction $name ${buffer.toString().trim()}';
+    return 'ClosureFunction $closureIndex';
   }
 
-  _withoutFunctionBody(action()) {
-    final savedBody = function.body;
-    function.body = null;
-    action();
-    function.body = savedBody;
-  }
+  @override
+  int get hashCode => closureIndex;
 
-  // ConstantClosureFunction entries are created per closure and should not
-  // be merged, so ConstantClosureFunction class uses identity [hashCode] and
-  // [operator ==].
+  @override
+  bool operator ==(other) =>
+      other is ConstantClosureFunction &&
+      this.closureIndex == other.closureIndex;
 }
 
 class ConstantEndClosureFunctionScope extends ConstantPoolEntry {
@@ -990,9 +937,9 @@
   ConstantTag get tag => ConstantTag.kEndClosureFunctionScope;
 
   @override
-  void writeValueToBinary(BinarySink sink) {}
+  void writeValue(BufferedWriter writer) {}
 
-  ConstantEndClosureFunctionScope.readFromBinary(BinarySource source) {}
+  ConstantEndClosureFunctionScope.read(BufferedReader reader) {}
 
   @override
   String toString() => 'EndClosureFunctionScope';
@@ -1011,12 +958,12 @@
   ConstantTag get tag => ConstantTag.kNativeEntry;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeStringReference(nativeName);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedStringReference(nativeName);
   }
 
-  ConstantNativeEntry.readFromBinary(BinarySource source)
-      : nativeName = source.readStringReference();
+  ConstantNativeEntry.read(BufferedReader reader)
+      : nativeName = reader.readPackedStringReference();
 
   @override
   String toString() => 'NativeEntry $nativeName';
@@ -1036,9 +983,9 @@
   ConstantTag get tag => ConstantTag.kSubtypeTestCache;
 
   @override
-  void writeValueToBinary(BinarySink sink) {}
+  void writeValue(BufferedWriter writer) {}
 
-  ConstantSubtypeTestCache.readFromBinary(BinarySource source);
+  ConstantSubtypeTestCache.read(BufferedReader reader);
 
   @override
   String toString() => 'SubtypeTestCache';
@@ -1065,14 +1012,14 @@
   ConstantTag get tag => ConstantTag.kPartialTearOffInstantiation;
 
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeUInt30(tearOffConstantIndex);
-    sink.writeUInt30(typeArgumentsConstantIndex);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedUInt30(tearOffConstantIndex);
+    writer.writePackedUInt30(typeArgumentsConstantIndex);
   }
 
-  ConstantPartialTearOffInstantiation.readFromBinary(BinarySource source)
-      : tearOffConstantIndex = source.readUInt(),
-        typeArgumentsConstantIndex = source.readUInt();
+  ConstantPartialTearOffInstantiation.read(BufferedReader reader)
+      : tearOffConstantIndex = reader.readPackedUInt30(),
+        typeArgumentsConstantIndex = reader.readPackedUInt30();
 
   @override
   String toString() {
@@ -1097,9 +1044,9 @@
   ConstantTag get tag => ConstantTag.kEmptyTypeArguments;
 
   @override
-  void writeValueToBinary(BinarySink sink) {}
+  void writeValue(BufferedWriter writer) {}
 
-  ConstantEmptyTypeArguments.readFromBinary(BinarySource source);
+  ConstantEmptyTypeArguments.read(BufferedReader reader);
 
   @override
   String toString() => 'EmptyTypeArguments';
@@ -1112,38 +1059,72 @@
 }
 
 class ConstantSymbol extends ConstantPoolEntry {
-  final Reference _libraryRef;
-  final String value;
+  final ObjectHandle name;
 
-  ConstantSymbol(this._libraryRef, this.value);
+  ConstantSymbol(this.name);
 
   @override
   ConstantTag get tag => ConstantTag.kSymbol;
 
-  Library get library => _libraryRef?.asLibrary;
-
   @override
-  void writeValueToBinary(BinarySink sink) {
-    sink.writeCanonicalNameReference(library?.canonicalName);
-    sink.writeStringReference(value);
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(name);
   }
 
-  ConstantSymbol.readFromBinary(BinarySource source)
-      : _libraryRef = source.readCanonicalNameReference()?.getReference(),
-        value = source.readStringReference();
+  ConstantSymbol.read(BufferedReader reader) : name = reader.readPackedObject();
 
   @override
-  String toString() => 'Symbol '
-      '${library != null ? '$library::' : ''}\'$value\'';
+  String toString() => 'Symbol $name';
 
   @override
-  int get hashCode => value.hashCode;
+  int get hashCode => name.hashCode;
+
+  @override
+  bool operator ==(other) => other is ConstantSymbol && this.name == other.name;
+}
+
+class ConstantInterfaceCall extends ConstantPoolEntry {
+  final InvocationKind invocationKind;
+  final ObjectHandle targetName;
+  final int argDescConstantIndex;
+
+  ConstantInterfaceCall(
+      this.invocationKind, this.targetName, this.argDescConstantIndex);
+
+  // Reserve 1 extra slot for arguments descriptor, following target name slot.
+  int get numReservedEntries => 1;
+
+  @override
+  ConstantTag get tag => ConstantTag.kInterfaceCall;
+
+  @override
+  void writeValue(BufferedWriter writer) {
+    writer.writeByte(invocationKind.index);
+    writer.writePackedObject(targetName);
+    writer.writePackedUInt30(argDescConstantIndex);
+  }
+
+  ConstantInterfaceCall.read(BufferedReader reader)
+      : invocationKind = InvocationKind.values[reader.readByte()],
+        targetName = reader.readPackedObject(),
+        argDescConstantIndex = reader.readPackedUInt30();
+
+  @override
+  String toString() => 'InterfaceCall '
+      '${_invocationKindToString(invocationKind)}'
+      'target-name \'$targetName\', arg-desc CP#$argDescConstantIndex';
+
+  @override
+  int get hashCode => _combineHashes(
+      _combineHashes(invocationKind.index, targetName.hashCode),
+      argDescConstantIndex);
 
   @override
   bool operator ==(other) =>
-      other is ConstantSymbol &&
-      this.value == other.value &&
-      this.library == other.library;
+      other is ConstantInterfaceCall &&
+      this.invocationKind == other.invocationKind &&
+      this.targetName == other.targetName &&
+      this.argDescConstantIndex == other.argDescConstantIndex;
 }
 
 /// Reserved constant pool entry.
@@ -1151,7 +1132,7 @@
   const _ReservedConstantPoolEntry();
 
   ConstantTag get tag => throw 'This constant pool entry is reserved';
-  void writeValueToBinary(BinarySink sink) =>
+  void writeValue(BufferedWriter writer) =>
       throw 'This constant pool entry is reserved';
 
   @override
@@ -1159,13 +1140,129 @@
 }
 
 class ConstantPool {
+  final StringTable stringTable;
+  final ObjectTable objectTable;
   final List<ConstantPoolEntry> entries = <ConstantPoolEntry>[];
   final Map<ConstantPoolEntry, int> _canonicalizationCache =
       <ConstantPoolEntry, int>{};
 
-  ConstantPool();
+  ConstantPool(this.stringTable, this.objectTable);
 
-  int add(ConstantPoolEntry entry) {
+  int addNull() => _add(const ConstantNull());
+
+  int addString(String value) => _add(new ConstantString(_indexString(value)));
+
+  int addInt(int value) => _add(new ConstantInt(value));
+
+  int addDouble(double value) => _add(new ConstantDouble(value));
+
+  int addBool(bool value) => _add(new ConstantBool(value));
+
+  int addArgDesc(int numArguments,
+          {int numTypeArgs = 0, List<String> argNames = const <String>[]}) =>
+      _add(new ConstantArgDesc(
+          numArguments, numTypeArgs, _indexStrings(argNames)));
+
+  int addArgDescByArguments(Arguments args,
+          {bool hasReceiver: false, bool isFactory: false}) =>
+      _add(new ConstantArgDesc.fromArguments(
+          _indexArgNames(args), hasReceiver, isFactory));
+
+  int addICData(
+          InvocationKind invocationKind, Name targetName, int argDescCpIndex,
+          {bool isDynamic: false}) =>
+      _add(new ConstantICData(
+          invocationKind,
+          objectTable.getSelectorNameHandle(targetName,
+              isGetter: invocationKind == InvocationKind.getter,
+              isSetter: invocationKind == InvocationKind.setter),
+          argDescCpIndex,
+          isDynamic));
+
+  int addStaticICData(
+          InvocationKind invocationKind, Member target, int argDescCpIndex) =>
+      _add(new ConstantStaticICData(
+          objectTable.getMemberHandle(target,
+              isGetter: invocationKind == InvocationKind.getter,
+              isSetter: invocationKind == InvocationKind.setter),
+          argDescCpIndex));
+
+  int addInterfaceCall(
+          InvocationKind invocationKind, Name targetName, int argDescCpIndex) =>
+      _add(new ConstantInterfaceCall(
+          invocationKind,
+          objectTable.getSelectorNameHandle(targetName,
+              isGetter: invocationKind == InvocationKind.getter,
+              isSetter: invocationKind == InvocationKind.setter),
+          argDescCpIndex));
+
+  int addInstanceCall(
+          InvocationKind invocationKind, Name targetName, int argDescCpIndex,
+          {bool isDynamic: false}) =>
+      isDynamic
+          ? addICData(invocationKind, targetName, argDescCpIndex,
+              isDynamic: true)
+          : addInterfaceCall(invocationKind, targetName, argDescCpIndex);
+
+  int addStaticField(Field field) =>
+      _add(new ConstantStaticField(objectTable.getHandle(field)));
+
+  int addInstanceField(Field field) =>
+      _add(new ConstantInstanceField(objectTable.getHandle(field)));
+
+  int addClass(Class node) =>
+      _add(new ConstantClass(objectTable.getHandle(node)));
+
+  int addTypeArgumentsField(Class node) =>
+      _add(new ConstantTypeArgumentsField(objectTable.getHandle(node)));
+
+  int addTearOff(Procedure node) =>
+      _add(new ConstantTearOff(objectTable.getHandle(node)));
+
+  int addType(DartType type) =>
+      _add(new ConstantType(objectTable.getHandle(type)));
+
+  int addTypeArguments(List<DartType> typeArgs) =>
+      _add(new ConstantTypeArguments(objectTable.getHandles(typeArgs)));
+
+  int addList(DartType typeArgument, List<int> entries) =>
+      _add(new ConstantList(objectTable.getHandle(typeArgument), entries));
+
+  int addInstance(
+          Class klass, int typeArgumentsCpIndex, Map<Field, int> fieldValues) =>
+      _add(new ConstantInstance(
+          objectTable.getHandle(klass),
+          typeArgumentsCpIndex,
+          fieldValues.map<ObjectHandle, int>((Field field, int valueCpIndex) =>
+              new MapEntry(objectTable.getHandle(field), valueCpIndex))));
+
+  int addTypeArgumentsForInstanceAllocation(
+          Class classNode, List<DartType> typeArgs) =>
+      _add(new ConstantTypeArgumentsForInstanceAllocation(
+          objectTable.getHandle(classNode), objectTable.getHandles(typeArgs)));
+
+  int addClosureFunction(int closureIndex) =>
+      _add(new ConstantClosureFunction(closureIndex));
+
+  int addEndClosureFunctionScope() =>
+      _add(new ConstantEndClosureFunctionScope());
+
+  int addNativeEntry(String nativeName) =>
+      _add(new ConstantNativeEntry(_indexString(nativeName)));
+
+  int addSubtypeTestCache() => _add(new ConstantSubtypeTestCache());
+
+  int addPartialTearOffInstantiation(
+          int tearOffCpIndex, int typeArgumentsCpIndex) =>
+      _add(new ConstantPartialTearOffInstantiation(
+          tearOffCpIndex, typeArgumentsCpIndex));
+
+  int addEmptyTypeArguments() => _add(const ConstantEmptyTypeArguments());
+
+  int addSymbol(Library library, String name) =>
+      _add(new ConstantSymbol(objectTable.getNameHandle(library, name)));
+
+  int _add(ConstantPoolEntry entry) {
     return _canonicalizationCache.putIfAbsent(entry, () {
       int index = entries.length;
       if (index >= constantPoolIndexLimit) {
@@ -1183,63 +1280,46 @@
     }
   }
 
-  void writeToBinary(Node node, BinarySink sink) {
-    final function = (node as Member).function;
-    sink.enterScope(
-        typeParameters: function?.typeParameters, memberScope: true);
+  // Currently, string table is written as a part of Component's metadata
+  // *before* constant pools are written.
+  // So we need to index all strings when filling up constant pools.
+  String _indexString(String str) {
+    stringTable.put(str);
+    return str;
+  }
 
-    final closureStack = <ConstantClosureFunction>[];
+  List<String> _indexStrings(List<String> strings) {
+    for (var str in strings) {
+      stringTable.put(str);
+    }
+    return strings;
+  }
 
-    sink.writeUInt30(entries.length);
+  Arguments _indexArgNames(Arguments args) {
+    for (var arg in args.named) {
+      stringTable.put(arg.name);
+    }
+    return args;
+  }
+
+  void write(BufferedWriter writer) {
+    writer.writePackedUInt30(entries.length);
     entries.forEach((e) {
       if (e is _ReservedConstantPoolEntry) {
         return;
       }
-
-      e.writeToBinary(sink);
-
-      if (e is ConstantClosureFunction) {
-        sink.enterScope(typeParameters: e.function.typeParameters);
-        closureStack.add(e);
-      } else if (e is ConstantEndClosureFunctionScope) {
-        sink.leaveScope(
-            typeParameters: closureStack.removeLast().function.typeParameters);
-      }
+      e.write(writer);
     });
-
-    assert(closureStack.isEmpty);
-
-    sink.leaveScope(
-        typeParameters: function?.typeParameters, memberScope: true);
   }
 
-  ConstantPool.readFromBinary(Node node, BinarySource source) {
-    final function = (node as Member).function;
-    if (function != null) {
-      source.enterScope(typeParameters: function.typeParameters);
-    }
-
-    final closureStack = <ConstantClosureFunction>[];
-
-    int len = source.readUInt();
+  ConstantPool.read(BufferedReader reader)
+      : stringTable = reader.stringReader,
+        objectTable = reader.objectReader {
+    int len = reader.readPackedUInt30();
     for (int i = 0; i < len; i++) {
-      final e = new ConstantPoolEntry.readFromBinary(source);
+      final e = new ConstantPoolEntry.read(reader);
       _addEntry(e);
       i += e.numReservedEntries;
-
-      if (e is ConstantClosureFunction) {
-        source.enterScope(typeParameters: e.function.typeParameters);
-        closureStack.add(e);
-      } else if (e is ConstantEndClosureFunctionScope) {
-        source.leaveScope(
-            typeParameters: closureStack.removeLast().function.typeParameters);
-      }
-    }
-
-    assert(closureStack.isEmpty);
-
-    if (function != null) {
-      source.leaveScope(typeParameters: function.typeParameters);
     }
   }
 
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index 2a8bbef..6f7923a 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -19,6 +19,9 @@
 /// runtime/vm/constants_kbc.h.
 const int futureBytecodeFormatVersion = stableBytecodeFormatVersion + 1;
 
+/// Alignment of bytecode instructions.
+const int bytecodeInstructionsAlignment = 4;
+
 enum Opcode {
   kTrap,
 
@@ -79,7 +82,8 @@
 
   // Calls.
   kIndirectStaticCall,
-  kInstanceCall,
+  kInterfaceCall,
+  kDynamicCall,
   kNativeCall,
   kReturnTOS,
 
@@ -163,9 +167,9 @@
   Opcode.kFrame: const Format(
       Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
   Opcode.kCheckFunctionTypeArgs: const Format(
-      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
+      Encoding.kAD, const [Operand.imm, Operand.reg, Operand.none]),
   Opcode.kCheckStack: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+      Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
   Opcode.kAllocate: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
   Opcode.kAllocateT: const Format(
@@ -173,17 +177,17 @@
   Opcode.kCreateArrayTOS: const Format(
       Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
   Opcode.kAllocateContext: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
   Opcode.kCloneContext: const Format(
-      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
   Opcode.kLoadContextParent: const Format(
       Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
   Opcode.kStoreContextParent: const Format(
       Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
   Opcode.kLoadContextVar: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
   Opcode.kStoreContextVar: const Format(
-      Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
+      Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
   Opcode.kPushConstant: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
   Opcode.kPushNull: const Format(
@@ -232,7 +236,9 @@
       Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
   Opcode.kIndirectStaticCall: const Format(
       Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
-  Opcode.kInstanceCall: const Format(
+  Opcode.kInterfaceCall: const Format(
+      Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
+  Opcode.kDynamicCall: const Format(
       Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
   Opcode.kNativeCall: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
@@ -253,7 +259,7 @@
   Opcode.kThrow: const Format(
       Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
   Opcode.kMoveSpecial: const Format(
-      Encoding.kAD, const [Operand.reg, Operand.spe, Operand.none]),
+      Encoding.kAX, const [Operand.spe, Operand.xeg, Operand.none]),
   Opcode.kSetFrame: const Format(
       Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
   Opcode.kBooleanNegateTOS: const Format(
@@ -304,6 +310,40 @@
 
 bool isJump(Opcode opcode) => BytecodeFormats[opcode].encoding == Encoding.kT;
 
+bool isThrow(Opcode opcode) => opcode == Opcode.kThrow;
+
+bool isCall(Opcode opcode) {
+  switch (opcode) {
+    case Opcode.kIndirectStaticCall:
+    case Opcode.kInterfaceCall:
+    case Opcode.kDynamicCall:
+    case Opcode.kNativeCall:
+      return true;
+    default:
+      return false;
+  }
+}
+
+bool isReturn(Opcode opcode) => opcode == Opcode.kReturnTOS;
+
+bool isControlFlow(Opcode opcode) =>
+    isJump(opcode) || isThrow(opcode) || isCall(opcode) || isReturn(opcode);
+
+bool isPush(Opcode opcode) {
+  switch (opcode) {
+    case Opcode.kPush:
+    case Opcode.kPushConstant:
+    case Opcode.kPushNull:
+    case Opcode.kPushTrue:
+    case Opcode.kPushFalse:
+    case Opcode.kPushInt:
+    case Opcode.kPushStatic:
+      return true;
+    default:
+      return false;
+  }
+}
+
 // Bytecode instructions reference constant pool indices using
 // unsigned 16-bit operands.
 const int constantPoolIndexLimit = 1 << 16;
@@ -314,6 +354,9 @@
 // Captured variables are referenced using 16-bit unsigned operands.
 const int capturedVariableIndexLimit = 1 << 16;
 
+// Context IDs are referenced using 8-bit unsigned operands.
+const int contextIdLimit = 1 << 8;
+
 // Base class for exceptions thrown when certain limit of bytecode
 // format is exceeded.
 abstract class BytecodeLimitExceededException {}
diff --git a/pkg/vm/lib/bytecode/disassembler.dart b/pkg/vm/lib/bytecode/disassembler.dart
index c9b6e46..153e837 100644
--- a/pkg/vm/lib/bytecode/disassembler.dart
+++ b/pkg/vm/lib/bytecode/disassembler.dart
@@ -6,28 +6,44 @@
 
 import 'dart:typed_data';
 
+import 'package:kernel/ast.dart' show listEquals, listHashCode;
+
 import 'dbc.dart';
 import 'exceptions.dart';
 
-class _Instruction {
+class Instruction {
   final Opcode opcode;
   final List<int> operands;
-  _Instruction(this.opcode, this.operands);
+  Instruction(this.opcode, this.operands);
+
+  @override
+  int get hashCode => opcode.index.hashCode ^ listHashCode(operands);
+
+  @override
+  bool operator ==(other) {
+    return (other is Instruction) &&
+        (opcode == other.opcode) &&
+        listEquals(operands, other.operands);
+  }
 }
 
 class BytecodeDisassembler {
   static const int kOpcodeMask = 0xFF;
   static const int kBitsPerInt = 64;
 
-  List<_Instruction> _instructions;
+  List<Instruction> _instructions;
   int _labelCount;
   Map<int, String> _labels;
   Map<int, List<String>> _markers;
 
-  String disassemble(List<int> bytecode, ExceptionsTable exceptionsTable) {
+  String disassemble(List<int> bytecode, ExceptionsTable exceptionsTable,
+      {List<Map<int, String>> annotations}) {
     _init(bytecode);
     _scanForJumpTargets();
     _markTryBlocks(exceptionsTable);
+    if (annotations != null) {
+      _markAnnotations(annotations);
+    }
     return _disasm();
   }
 
@@ -36,9 +52,9 @@
     // TODO(alexmarkov): endianness?
     Uint32List words = uint8list.buffer.asUint32List();
 
-    _instructions = new List<_Instruction>(words.length);
+    _instructions = new List<Instruction>(words.length);
     for (int i = 0; i < words.length; i++) {
-      _instructions[i] = _decodeInstruction(words[i]);
+      _instructions[i] = decodeInstruction(words[i]);
     }
 
     _labelCount = 0;
@@ -46,10 +62,10 @@
     _markers = <int, List<String>>{};
   }
 
-  _Instruction _decodeInstruction(int word) {
+  Instruction decodeInstruction(int word) {
     final opcode = Opcode.values[word & kOpcodeMask];
     final format = BytecodeFormats[opcode];
-    return new _Instruction(opcode, _decodeOperands(format, word));
+    return new Instruction(opcode, _decodeOperands(format, word));
   }
 
   List<int> _decodeOperands(Format format, int word) {
@@ -116,6 +132,14 @@
     }
   }
 
+  void _markAnnotations(List<Map<int, String>> annotations) {
+    for (var map in annotations) {
+      map.forEach((int pc, String annotation) {
+        _addMarker(pc, '# $annotation');
+      });
+    }
+  }
+
   void _addMarker(int pc, String marker) {
     final markers = (_markers[pc] ??= <String>[]);
     markers.add(marker);
@@ -128,12 +152,12 @@
       if (markers != null) {
         markers.forEach(out.writeln);
       }
-      _writeInstruction(out, i, _instructions[i]);
+      writeInstruction(out, i, _instructions[i]);
     }
     return out.toString();
   }
 
-  void _writeInstruction(StringBuffer out, int bci, _Instruction instr) {
+  void writeInstruction(StringBuffer out, int bci, Instruction instr) {
     final format = BytecodeFormats[instr.opcode];
     assert(format != null);
 
@@ -180,7 +204,9 @@
       case Operand.xeg:
         return (value < 0) ? 'FP[$value]' : 'r$value';
       case Operand.tgt:
-        return _labels[bci + value] ?? (throw 'Label not found');
+        return (_labels == null)
+            ? value.toString()
+            : _labels[bci + value] ?? (throw 'Label not found');
       case Operand.spe:
         return SpecialIndex.values[value]
             .toString()
diff --git a/pkg/vm/lib/bytecode/exceptions.dart b/pkg/vm/lib/bytecode/exceptions.dart
index 7c955a3..2147790 100644
--- a/pkg/vm/lib/bytecode/exceptions.dart
+++ b/pkg/vm/lib/bytecode/exceptions.dart
@@ -4,7 +4,7 @@
 
 library vm.bytecode.exceptions;
 
-import 'package:kernel/ast.dart' show BinarySink, BinarySource;
+import 'bytecode_serialization.dart' show BufferedWriter, BufferedReader;
 
 /*
 
@@ -59,26 +59,26 @@
     flags = (flags & ~flagIsSynthetic) | (value ? flagIsSynthetic : 0);
   }
 
-  void writeToBinary(BinarySink sink) {
-    sink.writeUInt30(outerTryIndex + 1);
-    sink.writeUInt30(startPC);
-    sink.writeUInt30(endPC);
-    sink.writeUInt30(handlerPC);
-    sink.writeByte(flags);
-    sink.writeUInt30(types.length);
-    types.forEach(sink.writeUInt30);
+  void write(BufferedWriter writer) {
+    writer.writePackedUInt30(outerTryIndex + 1);
+    writer.writePackedUInt30(startPC);
+    writer.writePackedUInt30(endPC);
+    writer.writePackedUInt30(handlerPC);
+    writer.writeByte(flags);
+    writer.writePackedUInt30(types.length);
+    types.forEach(writer.writePackedUInt30);
   }
 
-  factory TryBlock.readFromBinary(BinarySource source, int tryIndex) {
-    final outerTryIndex = source.readUInt() - 1;
-    final startPC = source.readUInt();
+  factory TryBlock.read(BufferedReader reader, int tryIndex) {
+    final outerTryIndex = reader.readPackedUInt30() - 1;
+    final startPC = reader.readPackedUInt30();
     final tryBlock = new TryBlock._(tryIndex, outerTryIndex, startPC);
 
-    tryBlock.endPC = source.readUInt();
-    tryBlock.handlerPC = source.readUInt();
-    tryBlock.flags = source.readByte();
-    tryBlock.types =
-        new List<int>.generate(source.readUInt(), (_) => source.readUInt());
+    tryBlock.endPC = reader.readPackedUInt30();
+    tryBlock.handlerPC = reader.readPackedUInt30();
+    tryBlock.flags = reader.readByte();
+    tryBlock.types = new List<int>.generate(
+        reader.readPackedUInt30(), (_) => reader.readPackedUInt30());
 
     return tryBlock;
   }
@@ -114,14 +114,14 @@
     return -1;
   }
 
-  void writeToBinary(BinarySink sink) {
-    sink.writeUInt30(blocks.length);
-    blocks.forEach((b) => b.writeToBinary(sink));
+  void write(BufferedWriter writer) {
+    writer.writePackedUInt30(blocks.length);
+    blocks.forEach((b) => b.write(writer));
   }
 
-  ExceptionsTable.readFromBinary(BinarySource source)
-      : blocks = new List<TryBlock>.generate(source.readUInt(),
-            (int index) => new TryBlock.readFromBinary(source, index));
+  ExceptionsTable.read(BufferedReader reader)
+      : blocks = new List<TryBlock>.generate(reader.readPackedUInt30(),
+            (int index) => new TryBlock.read(reader, index));
 
   @override
   String toString() {
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 06c8592..04a58fb 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -23,10 +23,13 @@
 import 'package:kernel/vm/constants_native_effects.dart'
     show VmConstantsBackend;
 import 'assembler.dart';
+import 'bytecode_serialization.dart' show StringTable;
 import 'constant_pool.dart';
 import 'dbc.dart';
 import 'exceptions.dart';
 import 'local_vars.dart' show LocalVariables;
+import 'nullability_detector.dart' show NullabilityDetector;
+import 'object_table.dart' show ObjectHandle, ObjectTable, NameAndType;
 import 'recognized_methods.dart' show RecognizedMethods;
 import '../constants_error_reporter.dart' show ForwardConstantEvaluationErrors;
 import '../metadata/bytecode.dart';
@@ -36,33 +39,43 @@
 // exception.
 const String symbolForTypeCast = ' in type cast';
 
-void generateBytecode(Component component,
-    {bool dropAST: false,
-    bool omitSourcePositions: false,
-    bool useFutureBytecodeFormat: false,
-    Map<String, String> environmentDefines,
-    ErrorReporter errorReporter}) {
+void generateBytecode(
+  Component component, {
+  bool dropAST: false,
+  bool emitSourcePositions: false,
+  bool omitAssertSourcePositions: false,
+  bool useFutureBytecodeFormat: false,
+  Map<String, String> environmentDefines,
+  ErrorReporter errorReporter,
+  List<Library> libraries,
+}) {
   final coreTypes = new CoreTypes(component);
   void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
   final hierarchy = new ClassHierarchy(component,
       onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
-  final typeEnvironment =
-      new TypeEnvironment(coreTypes, hierarchy, strongMode: true);
+  final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
   final constantsBackend =
       new VmConstantsBackend(environmentDefines, coreTypes);
   final errorReporter = new ForwardConstantEvaluationErrors(typeEnvironment);
-  new BytecodeGenerator(
-          component,
-          coreTypes,
-          hierarchy,
-          typeEnvironment,
-          constantsBackend,
-          omitSourcePositions,
-          useFutureBytecodeFormat,
-          errorReporter)
-      .visitComponent(component);
+  libraries ??= component.libraries;
+  final bytecodeGenerator = new BytecodeGenerator(
+      component,
+      coreTypes,
+      hierarchy,
+      typeEnvironment,
+      constantsBackend,
+      emitSourcePositions,
+      omitAssertSourcePositions,
+      useFutureBytecodeFormat,
+      errorReporter);
+  for (var library in libraries) {
+    bytecodeGenerator.visitLibrary(library);
+  }
   if (dropAST) {
-    new DropAST().visitComponent(component);
+    final astRemover = new DropAST(component);
+    for (var library in libraries) {
+      astRemover.visitLibrary(library);
+    }
   }
 }
 
@@ -72,11 +85,16 @@
   final ClassHierarchy hierarchy;
   final TypeEnvironment typeEnvironment;
   final ConstantsBackend constantsBackend;
-  final bool omitSourcePositions;
+  final bool emitSourcePositions;
+  final bool omitAssertSourcePositions;
   final bool useFutureBytecodeFormat;
   final ErrorReporter errorReporter;
   final BytecodeMetadataRepository metadata = new BytecodeMetadataRepository();
   final RecognizedMethods recognizedMethods;
+  final int formatVersion;
+  StringTable stringTable;
+  ObjectTable objectTable;
+  NullabilityDetector nullabilityDetector;
 
   Class enclosingClass;
   Member enclosingMember;
@@ -84,7 +102,8 @@
   FunctionNode parentFunction;
   bool isClosure;
   Set<TypeParameter> classTypeParameters;
-  Set<TypeParameter> functionTypeParameters;
+  List<TypeParameter> functionTypeParameters;
+  Set<TypeParameter> functionTypeParametersSet;
   List<DartType> instantiatorTypeArguments;
   LocalVariables locals;
   ConstantEvaluator constantEvaluator;
@@ -94,14 +113,15 @@
   Map<TryFinally, List<FinallyBlock>> finallyBlocks;
   List<Label> yieldPoints;
   Map<TreeNode, int> contextLevels;
-  List<ClosureBytecode> closures;
+  List<ClosureDeclaration> closures;
   Set<Field> initializedFields;
-  List<Reference> nullableFields;
+  List<ObjectHandle> nullableFields;
   ConstantPool cp;
   ConstantEmitter constantEmitter;
   BytecodeAssembler asm;
   List<BytecodeAssembler> savedAssemblers;
   bool hasErrors;
+  int currentLoopDepth;
 
   BytecodeGenerator(
       this.component,
@@ -109,15 +129,24 @@
       this.hierarchy,
       this.typeEnvironment,
       this.constantsBackend,
-      this.omitSourcePositions,
+      this.emitSourcePositions,
+      this.omitAssertSourcePositions,
       this.useFutureBytecodeFormat,
       this.errorReporter)
-      : recognizedMethods = new RecognizedMethods(typeEnvironment) {
+      : recognizedMethods = new RecognizedMethods(typeEnvironment),
+        formatVersion = useFutureBytecodeFormat
+            ? futureBytecodeFormatVersion
+            : stableBytecodeFormatVersion {
+    nullabilityDetector = new NullabilityDetector(recognizedMethods);
     component.addMetadataRepository(metadata);
-  }
 
-  @override
-  visitComponent(Component node) => node.visitChildren(this);
+    metadata.bytecodeComponent = new BytecodeComponent(formatVersion);
+    metadata.mapping[component] = metadata.bytecodeComponent;
+
+    stringTable = metadata.bytecodeComponent.stringTable;
+    objectTable = metadata.bytecodeComponent.objectTable;
+    objectTable.coreTypes = coreTypes;
+  }
 
   @override
   visitLibrary(Library node) {
@@ -148,7 +177,7 @@
           if (node.isConst) {
             _genPushConstExpr(node.initializer);
           } else {
-            node.initializer.accept(this);
+            _generateNode(node.initializer);
           }
           _genReturnTOS();
           end(node);
@@ -166,7 +195,7 @@
           }
           _genNativeCall(nativeName);
         } else {
-          node.function?.body?.accept(this);
+          _generateNode(node.function?.body);
           // BytecodeAssembler eliminates this bytecode if it is unreachable.
           asm.emitPushNull();
         }
@@ -202,7 +231,7 @@
       asm.emitPush(locals.getVarIndexInFrame(param));
     }
 
-    final nativeEntryCpIndex = cp.add(new ConstantNativeEntry(nativeName));
+    final nativeEntryCpIndex = cp.addNativeEntry(nativeName);
     asm.emitNativeCall(nativeEntryCpIndex);
   }
 
@@ -285,6 +314,26 @@
   Procedure get unsafeCast => _unsafeCast ??=
       libraryIndex.getTopLevelMember('dart:_internal', 'unsafeCast');
 
+  void _recordSourcePosition(TreeNode node) {
+    if (emitSourcePositions) {
+      asm.currentSourcePosition = node.fileOffset;
+    }
+  }
+
+  void _generateNode(TreeNode node) {
+    if (node == null) {
+      return;
+    }
+    final savedSourcePosition = asm.currentSourcePosition;
+    _recordSourcePosition(node);
+    node.accept(this);
+    asm.currentSourcePosition = savedSourcePosition;
+  }
+
+  void _generateNodeList(List<TreeNode> nodes) {
+    nodes.forEach(_generateNode);
+  }
+
   void _genConstructorInitializers(Constructor node) {
     final bool isRedirecting =
         node.initializers.any((init) => init is RedirectingInitializer);
@@ -298,13 +347,13 @@
       }
     }
 
-    visitList(node.initializers, this);
+    _generateNodeList(node.initializers);
 
     if (!isRedirecting) {
-      nullableFields = <Reference>[];
+      nullableFields = <ObjectHandle>[];
       for (var field in node.enclosingClass.fields) {
         if (!field.isStatic && !initializedFields.contains(field)) {
-          nullableFields.add(field.reference);
+          nullableFields.add(objectTable.getHandle(field));
         }
       }
       initializedFields = null; // No more initialized fields, please.
@@ -319,9 +368,9 @@
     }
 
     _genPushReceiver();
-    initializer.accept(this);
+    _generateNode(initializer);
 
-    final int cpIndex = cp.add(new ConstantInstanceField(field));
+    final int cpIndex = cp.addInstanceField(field);
     asm.emitStoreFieldTOS(cpIndex);
 
     initializedFields.add(field);
@@ -331,9 +380,9 @@
     if (arguments.types.isNotEmpty) {
       _genTypeArguments(arguments.types);
     }
-    receiver?.accept(this);
-    visitList(arguments.positional, this);
-    arguments.named.forEach((NamedExpression ne) => ne.value.accept(this));
+    _generateNode(receiver);
+    _generateNodeList(arguments.positional);
+    arguments.named.forEach((NamedExpression ne) => _generateNode(ne.value));
   }
 
   void _genPushBool(bool value) {
@@ -348,8 +397,7 @@
     if (value.bitLength + 1 <= 16) {
       asm.emitPushInt(value);
     } else {
-      int cpIndex = cp.add(new ConstantInt(value));
-      asm.emitPushConstant(cpIndex);
+      asm.emitPushConstant(cp.addInt(value));
     }
   }
 
@@ -384,15 +432,13 @@
     asm.emitReturnTOS();
   }
 
-  void _genStaticCall(Member target, ConstantArgDesc argDesc, int totalArgCount,
+  void _genStaticCall(Member target, int argDescIndex, int totalArgCount,
       {bool isGet: false, bool isSet: false}) {
     assert(!isGet || !isSet);
-    final argDescIndex = cp.add(argDesc);
     final kind = isGet
         ? InvocationKind.getter
         : (isSet ? InvocationKind.setter : InvocationKind.method);
-    final icdataIndex =
-        cp.add(new ConstantStaticICData(kind, target, argDescIndex));
+    final icdataIndex = cp.addStaticICData(kind, target, argDescIndex);
 
     asm.emitPushConstant(icdataIndex);
     asm.emitIndirectStaticCall(totalArgCount, argDescIndex);
@@ -400,7 +446,7 @@
 
   void _genStaticCallWithArgs(Member target, Arguments args,
       {bool hasReceiver: false, bool isFactory: false}) {
-    final ConstantArgDesc argDesc = new ConstantArgDesc.fromArguments(args,
+    final int argDescIndex = cp.addArgDescByArguments(args,
         hasReceiver: hasReceiver, isFactory: isFactory);
 
     int totalArgCount = args.positional.length + args.named.length;
@@ -413,7 +459,7 @@
       totalArgCount++;
     }
 
-    _genStaticCall(target, argDesc, totalArgCount);
+    _genStaticCall(target, argDescIndex, totalArgCount);
   }
 
   bool hasFreeTypeParameters(List<DartType> typeArgs) {
@@ -424,18 +470,25 @@
   void _genTypeArguments(List<DartType> typeArgs, {Class instantiatingClass}) {
     int typeArgsCPIndex() {
       if (instantiatingClass != null) {
-        return cp.add(new ConstantTypeArgumentsForInstanceAllocation(
-            instantiatingClass, typeArgs));
+        return cp.addTypeArgumentsForInstanceAllocation(
+            instantiatingClass, typeArgs);
       } else {
-        return cp.add(new ConstantTypeArguments(typeArgs));
+        return cp.addTypeArguments(typeArgs);
       }
     }
 
     if (typeArgs.isEmpty || !hasFreeTypeParameters(typeArgs)) {
       asm.emitPushConstant(typeArgsCPIndex());
     } else {
-      if (_canReuseInstantiatorTypeArguments(typeArgs, instantiatingClass)) {
+      final flattenedTypeArgs = (instantiatingClass != null &&
+              (instantiatorTypeArguments != null ||
+                  functionTypeParameters != null))
+          ? _flattenInstantiatorTypeArguments(instantiatingClass, typeArgs)
+          : typeArgs;
+      if (_canReuseInstantiatorTypeArguments(flattenedTypeArgs)) {
         _genPushInstantiatorTypeArguments();
+      } else if (_canReuseFunctionTypeArguments(flattenedTypeArgs)) {
+        _genPushFunctionTypeArguments();
       } else {
         _genPushInstantiatorAndFunctionTypeArguments(typeArgs);
         // TODO(alexmarkov): Optimize type arguments instantiation
@@ -458,8 +511,8 @@
     } else {
       asm.emitPushNull();
     }
-    if (functionTypeParameters != null &&
-        types.any((t) => containsTypeVariable(t, functionTypeParameters))) {
+    if (functionTypeParametersSet != null &&
+        types.any((t) => containsTypeVariable(t, functionTypeParametersSet))) {
       _genPushFunctionTypeArguments();
     } else {
       asm.emitPushNull();
@@ -474,8 +527,7 @@
         _genLoadVar(locals.factoryTypeArgsVar);
       } else {
         _genPushReceiver();
-        final int cpIndex =
-            cp.add(new ConstantTypeArgumentsField(enclosingClass));
+        final int cpIndex = cp.addTypeArgumentsField(enclosingClass);
         asm.emitLoadTypeArgumentsField(cpIndex);
       }
     } else {
@@ -529,17 +581,11 @@
     return flatTypeArgs;
   }
 
-  bool _canReuseInstantiatorTypeArguments(
-      List<DartType> typeArgs, Class instantiatingClass) {
+  bool _canReuseInstantiatorTypeArguments(List<DartType> typeArgs) {
     if (instantiatorTypeArguments == null) {
       return false;
     }
 
-    if (instantiatingClass != null) {
-      typeArgs =
-          _flattenInstantiatorTypeArguments(instantiatingClass, typeArgs);
-    }
-
     if (typeArgs.length > instantiatorTypeArguments.length) {
       return false;
     }
@@ -553,6 +599,26 @@
     return true;
   }
 
+  bool _canReuseFunctionTypeArguments(List<DartType> typeArgs) {
+    if (functionTypeParameters == null) {
+      return false;
+    }
+
+    if (typeArgs.length > functionTypeParameters.length) {
+      return false;
+    }
+
+    for (int i = 0; i < typeArgs.length; ++i) {
+      final typeArg = typeArgs[i];
+      if (!(typeArg is TypeParameterType &&
+          typeArg.parameter == functionTypeParameters[i])) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
   void _genPushFunctionTypeArguments() {
     if (locals.hasFunctionTypeArgsVar) {
       asm.emitPush(locals.functionTypeArgsVarIndexInFrame);
@@ -584,7 +650,8 @@
   void _genLoadVar(VariableDeclaration v, {int currentContextLevel}) {
     if (locals.isCaptured(v)) {
       _genPushContextForVariable(v, currentContextLevel: currentContextLevel);
-      asm.emitLoadContextVar(locals.getVarIndexInContext(v));
+      asm.emitLoadContextVar(
+          locals.getVarContextId(v), locals.getVarIndexInContext(v));
     } else {
       asm.emitPush(locals.getVarIndexInFrame(v));
     }
@@ -600,7 +667,8 @@
   // If variable is captured, context should be pushed before value.
   void _genStoreVar(VariableDeclaration variable) {
     if (locals.isCaptured(variable)) {
-      asm.emitStoreContextVar(locals.getVarIndexInContext(variable));
+      asm.emitStoreContextVar(locals.getVarContextId(variable),
+          locals.getVarIndexInContext(variable));
     } else {
       asm.emitPopLocal(locals.getVarIndexInFrame(variable));
     }
@@ -613,8 +681,10 @@
       condition = (condition as Not).operand;
       negated = true;
     }
-    condition.accept(this);
-    asm.emitAssertBoolean(0);
+    _generateNode(condition);
+    if (nullabilityDetector.isNullable(condition)) {
+      asm.emitAssertBoolean(0);
+    }
     return negated;
   }
 
@@ -674,7 +744,7 @@
 
   int _getDefaultParamConstIndex(VariableDeclaration param) {
     if (param.initializer == null) {
-      return cp.add(const ConstantNull());
+      return cp.addNull();
     }
     final constant = _evaluateConstantExpression(param.initializer);
     return constant.accept(constantEmitter);
@@ -699,11 +769,11 @@
 
     if (type is InterfaceType && type.typeArguments.isEmpty) {
       assert(type.classNode.typeParameters.isEmpty);
-      asm.emitPushConstant(cp.add(new ConstantType(type)));
-      final argDescIndex = cp.add(new ConstantArgDesc(2));
-      final icdataIndex = cp.add(new ConstantICData(
-          InvocationKind.method, objectSimpleInstanceOf.name, argDescIndex));
-      asm.emitInstanceCall(2, icdataIndex);
+      asm.emitPushConstant(cp.addType(type));
+      final argDescIndex = cp.addArgDesc(2);
+      final icdataIndex = cp.addInterfaceCall(
+          InvocationKind.method, objectSimpleInstanceOf.name, argDescIndex);
+      asm.emitInterfaceCall(2, icdataIndex);
       return;
     }
 
@@ -713,11 +783,11 @@
       asm.emitPushNull(); // Instantiator type arguments.
       asm.emitPushNull(); // Function type arguments.
     }
-    asm.emitPushConstant(cp.add(new ConstantType(type)));
-    final argDescIndex = cp.add(new ConstantArgDesc(4));
-    final icdataIndex = cp.add(new ConstantICData(
-        InvocationKind.method, objectInstanceOf.name, argDescIndex));
-    asm.emitInstanceCall(4, icdataIndex);
+    asm.emitPushConstant(cp.addType(type));
+    final argDescIndex = cp.addArgDesc(4);
+    final icdataIndex = cp.addInterfaceCall(
+        InvocationKind.method, objectInstanceOf.name, argDescIndex);
+    asm.emitInterfaceCall(4, icdataIndex);
   }
 
   void start(Member node) {
@@ -754,13 +824,13 @@
     if (enclosingFunction != null &&
         enclosingFunction.typeParameters.isNotEmpty) {
       functionTypeParameters =
-          new Set<TypeParameter>.from(enclosingFunction.typeParameters);
+          new List<TypeParameter>.from(enclosingFunction.typeParameters);
+      functionTypeParametersSet = functionTypeParameters.toSet();
     }
     locals = new LocalVariables(node);
     // TODO(alexmarkov): improve caching in ConstantEvaluator and reuse it
     constantEvaluator = new ConstantEvaluator(constantsBackend, typeEnvironment,
-        coreTypes, /* enableAsserts = */ true,
-        errorReporter: errorReporter)
+        coreTypes, /* enableAsserts = */ true, errorReporter)
       ..env = new EvaluationEnvironment();
     labeledStatements = <LabeledStatement, Label>{};
     switchCases = <SwitchCase, Label>{};
@@ -768,17 +838,19 @@
     finallyBlocks = <TryFinally, List<FinallyBlock>>{};
     yieldPoints = null; // Initialized when entering sync-yielding closure.
     contextLevels = <TreeNode, int>{};
-    closures = <ClosureBytecode>[];
+    closures = <ClosureDeclaration>[];
     initializedFields = null; // Tracked for constructors only.
-    nullableFields = const <Reference>[];
-    cp = new ConstantPool();
+    nullableFields = const <ObjectHandle>[];
+    cp = new ConstantPool(stringTable, objectTable);
     constantEmitter = new ConstantEmitter(cp);
     asm = new BytecodeAssembler();
     savedAssemblers = <BytecodeAssembler>[];
+    currentLoopDepth = 0;
 
     locals.enterScope(node);
     assert(!locals.isSyncYieldingFrame);
 
+    _recordSourcePosition(node);
     _genPrologue(node, node.function);
     _setupInitialContext(node.function);
     if (node is Procedure && node.isInstanceMember) {
@@ -808,11 +880,8 @@
 
   void end(Member node) {
     if (!hasErrors) {
-      final formatVersion = useFutureBytecodeFormat
-          ? futureBytecodeFormatVersion
-          : stableBytecodeFormatVersion;
-      metadata.mapping[node] = new BytecodeMetadata(formatVersion, cp,
-          asm.bytecode, asm.exceptionsTable, nullableFields, closures);
+      metadata.mapping[node] = new MemberBytecode(cp, asm.bytecode,
+          asm.exceptionsTable, asm.sourcePositions, nullableFields, closures);
     }
 
     typeEnvironment.thisType = null;
@@ -823,6 +892,7 @@
     isClosure = null;
     classTypeParameters = null;
     functionTypeParameters = null;
+    functionTypeParametersSet = null;
     instantiatorTypeArguments = null;
     locals = null;
     constantEvaluator = null;
@@ -863,8 +933,7 @@
         assert(numOptionalNamed != 0);
         for (int i = 0; i < numOptionalNamed; i++) {
           final param = locals.sortedNamedParameters[i];
-          asm.emitLoadConstant(
-              numFixed + i, cp.add(new ConstantString(param.name)));
+          asm.emitLoadConstant(numFixed + i, cp.addString(param.name));
           asm.emitLoadConstant(numFixed + i, _getDefaultParamConstIndex(param));
         }
       }
@@ -875,11 +944,11 @@
     } else {
       asm.emitEntry(locals.frameSize);
     }
-    asm.emitCheckStack();
+    asm.emitCheckStack(0);
 
     if (isClosure) {
       asm.emitPush(locals.closureVarIndexInFrame);
-      asm.emitLoadFieldTOS(cp.add(new ConstantInstanceField(closureContext)));
+      asm.emitLoadFieldTOS(cp.addInstanceField(closureContext));
       asm.emitPopLocal(locals.contextVarIndexInFrame);
     }
 
@@ -907,15 +976,15 @@
           asm.emitPush(locals.functionTypeArgsVarIndexInFrame);
           asm.emitPush(locals.closureVarIndexInFrame);
           asm.emitLoadFieldTOS(
-              cp.add(new ConstantInstanceField(closureFunctionTypeArguments)));
+              cp.addInstanceField(closureFunctionTypeArguments));
           _genPushInt(numParentTypeArgs);
           _genPushInt(numParentTypeArgs + function.typeParameters.length);
-          _genStaticCall(prependTypeArguments, new ConstantArgDesc(4), 4);
+          _genStaticCall(prependTypeArguments, cp.addArgDesc(4), 4);
           asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
         } else {
           asm.emitPush(locals.closureVarIndexInFrame);
           asm.emitLoadFieldTOS(
-              cp.add(new ConstantInstanceField(closureFunctionTypeArguments)));
+              cp.addInstanceField(closureFunctionTypeArguments));
           asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
         }
       }
@@ -926,10 +995,9 @@
     Label noDelayedTypeArgs = new Label();
 
     asm.emitPush(locals.closureVarIndexInFrame);
-    asm.emitLoadFieldTOS(
-        cp.add(new ConstantInstanceField(closureDelayedTypeArguments)));
+    asm.emitLoadFieldTOS(cp.addInstanceField(closureDelayedTypeArguments));
     asm.emitStoreLocal(locals.functionTypeArgsVarIndexInFrame);
-    asm.emitPushConstant(cp.add(const ConstantEmptyTypeArguments()));
+    asm.emitPushConstant(cp.addEmptyTypeArguments());
     asm.emitJumpIfEqStrict(noDelayedTypeArgs);
 
     // There are non-empty delayed type arguments, and they are stored
@@ -959,10 +1027,9 @@
     // instantiate default types.
     if (isClosure &&
         defaultTypes
-            .any((t) => containsTypeVariable(t, functionTypeParameters))) {
+            .any((t) => containsTypeVariable(t, functionTypeParametersSet))) {
       asm.emitPush(locals.closureVarIndexInFrame);
-      asm.emitLoadFieldTOS(
-          cp.add(new ConstantInstanceField(closureFunctionTypeArguments)));
+      asm.emitLoadFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
       asm.emitPopLocal(locals.functionTypeArgsVarIndexInFrame);
     }
 
@@ -1143,9 +1210,9 @@
     }
     final DartType type = new TypeParameterType(typeParam);
     _genPushInstantiatorAndFunctionTypeArguments([type, bound]);
-    asm.emitPushConstant(cp.add(new ConstantType(type)));
-    asm.emitPushConstant(cp.add(new ConstantType(bound)));
-    asm.emitPushConstant(cp.add(new ConstantString(typeParam.name)));
+    asm.emitPushConstant(cp.addType(type));
+    asm.emitPushConstant(cp.addType(bound));
+    asm.emitPushConstant(cp.addString(typeParam.name));
     asm.emitAssertSubtype();
   }
 
@@ -1173,11 +1240,11 @@
 
   void _genAssertAssignable(DartType type, {String name = ''}) {
     assert(!typeEnvironment.isTop(type));
-    asm.emitPushConstant(cp.add(new ConstantType(type)));
+    asm.emitPushConstant(cp.addType(type));
     _genPushInstantiatorAndFunctionTypeArguments([type]);
-    asm.emitPushConstant(cp.add(new ConstantString(name)));
+    asm.emitPushConstant(cp.addString(name));
     bool isIntOk = typeEnvironment.isSubtypeOf(typeEnvironment.intType, type);
-    int subtypeTestCacheCpIndex = cp.add(new ConstantSubtypeTestCache());
+    int subtypeTestCacheCpIndex = cp.addSubtypeTestCache();
     asm.emitAssertAssignable(isIntOk ? 1 : 0, subtypeTestCacheCpIndex);
   }
 
@@ -1207,10 +1274,13 @@
     final savedIsClosure = isClosure;
     isClosure = true;
     enclosingFunction = function;
+    final savedLoopDepth = currentLoopDepth;
+    currentLoopDepth = 0;
 
     if (function.typeParameters.isNotEmpty) {
-      functionTypeParameters ??= new Set<TypeParameter>();
+      functionTypeParameters ??= new List<TypeParameter>();
       functionTypeParameters.addAll(function.typeParameters);
+      functionTypeParametersSet = functionTypeParameters.toSet();
     }
 
     List<Label> savedYieldPoints = yieldPoints;
@@ -1222,8 +1292,29 @@
     function.positionalParameters.forEach(_evaluateDefaultParameterValue);
     locals.sortedNamedParameters.forEach(_evaluateDefaultParameterValue);
 
-    final int closureFunctionIndex =
-        cp.add(new ConstantClosureFunction(name, function));
+    final int closureIndex = closures.length;
+    objectTable.declareClosure(function, enclosingMember, closureIndex);
+    final List<NameAndType> parameters = function.positionalParameters
+        .followedBy(function.namedParameters)
+        .map((v) => new NameAndType(objectTable.getNameHandle(null, v.name),
+            objectTable.getHandle(v.type)))
+        .toList();
+    final ClosureDeclaration closure = new ClosureDeclaration(
+        objectTable
+            .getHandle(savedIsClosure ? parentFunction : enclosingMember),
+        objectTable.getNameHandle(null, name),
+        function.typeParameters
+            .map((tp) => new NameAndType(
+                objectTable.getNameHandle(null, tp.name),
+                objectTable.getHandle(tp.bound)))
+            .toList(),
+        function.requiredParameterCount,
+        function.namedParameters.length,
+        parameters,
+        objectTable.getHandle(function.returnType));
+    closures.add(closure);
+
+    final int closureFunctionIndex = cp.addClosureFunction(closureIndex);
 
     _genPrologue(node, function);
 
@@ -1241,7 +1332,7 @@
 
     // TODO(alexmarkov): support --causal_async_stacks.
 
-    function.body.accept(this);
+    _generateNode(function.body);
 
     // BytecodeAssembler eliminates this bytecode if it is unreachable.
     asm.emitPushNull();
@@ -1252,20 +1343,22 @@
           function, continuationSwitchLabel, continuationSwitchVar);
     }
 
-    cp.add(new ConstantEndClosureFunctionScope());
+    cp.addEndClosureFunctionScope();
 
     if (function.typeParameters.isNotEmpty) {
-      functionTypeParameters.removeAll(function.typeParameters);
+      functionTypeParameters.length -= function.typeParameters.length;
+      functionTypeParametersSet = functionTypeParameters.toSet();
     }
 
     enclosingFunction = parentFunction;
     parentFunction = savedParentFunction;
     isClosure = savedIsClosure;
+    currentLoopDepth = savedLoopDepth;
 
     locals.leaveScope();
 
-    closures.add(new ClosureBytecode(
-        closureFunctionIndex, asm.bytecode, asm.exceptionsTable));
+    closure.bytecode = new ClosureBytecode(
+        asm.bytecode, asm.exceptionsTable, asm.sourcePositions);
 
     _popAssemblerState();
     yieldPoints = savedYieldPoints;
@@ -1320,7 +1413,7 @@
     // TODO(alexmarkov): Consider adding a bytecode to allocate closure.
 
     assert(closureClass.typeParameters.isEmpty);
-    asm.emitAllocate(cp.add(new ConstantClass(closureClass)));
+    asm.emitAllocate(cp.addClass(closureClass));
 
     final int temp = locals.tempIndexInFrame(node);
     asm.emitStoreLocal(temp);
@@ -1330,25 +1423,23 @@
     asm.emitPush(temp);
     _genPushInstantiatorTypeArguments();
     asm.emitStoreFieldTOS(
-        cp.add(new ConstantInstanceField(closureInstantiatorTypeArguments)));
+        cp.addInstanceField(closureInstantiatorTypeArguments));
 
     asm.emitPush(temp);
     _genPushFunctionTypeArguments();
-    asm.emitStoreFieldTOS(
-        cp.add(new ConstantInstanceField(closureFunctionTypeArguments)));
+    asm.emitStoreFieldTOS(cp.addInstanceField(closureFunctionTypeArguments));
 
     asm.emitPush(temp);
-    asm.emitPushConstant(cp.add(const ConstantEmptyTypeArguments()));
-    asm.emitStoreFieldTOS(
-        cp.add(new ConstantInstanceField(closureDelayedTypeArguments)));
+    asm.emitPushConstant(cp.addEmptyTypeArguments());
+    asm.emitStoreFieldTOS(cp.addInstanceField(closureDelayedTypeArguments));
 
     asm.emitPush(temp);
     asm.emitPushConstant(closureFunctionIndex);
-    asm.emitStoreFieldTOS(cp.add(new ConstantInstanceField(closureFunction)));
+    asm.emitStoreFieldTOS(cp.addInstanceField(closureFunction));
 
     asm.emitPush(temp);
     asm.emitPush(locals.contextVarIndexInFrame);
-    asm.emitStoreFieldTOS(cp.add(new ConstantInstanceField(closureContext)));
+    asm.emitStoreFieldTOS(cp.addInstanceField(closureContext));
   }
 
   void _genClosure(TreeNode node, String name, FunctionNode function) {
@@ -1359,7 +1450,7 @@
   void _allocateContextIfNeeded() {
     final int contextSize = locals.currentContextSize;
     if (contextSize > 0) {
-      asm.emitAllocateContext(contextSize);
+      asm.emitAllocateContext(locals.currentContextId, contextSize);
 
       if (locals.currentContextLevel > 0) {
         _genDupTOS(locals.scratchVarIndexInFrame);
@@ -1487,7 +1578,7 @@
     for (Expression arg in args) {
       asm.emitPush(temp);
       _genPushInt(index++);
-      arg.accept(this);
+      _generateNode(arg);
       if (storeLastArgumentToTemp && index == totalCount) {
         // Arguments array in 'temp' is replaced with the last argument
         // in order to return result of RHS value in case of setter.
@@ -1497,17 +1588,17 @@
     }
   }
 
-  void _genNoSuchMethodForSuperCall(String name, int temp,
-      ConstantArgDesc argDesc, List<DartType> typeArgs, List<Expression> args,
+  void _genNoSuchMethodForSuperCall(String name, int temp, int argDescCpIndex,
+      List<DartType> typeArgs, List<Expression> args,
       {bool storeLastArgumentToTemp: false}) {
     // Receiver for noSuchMethod() call.
     _genPushReceiver();
 
     // Argument 0 for _allocateInvocationMirror(): function name.
-    asm.emitPushConstant(cp.add(new ConstantString(name)));
+    asm.emitPushConstant(cp.addString(name));
 
     // Argument 1 for _allocateInvocationMirror(): arguments descriptor.
-    asm.emitPushConstant(cp.add(argDesc));
+    asm.emitPushConstant(argDescCpIndex);
 
     // Argument 2 for _allocateInvocationMirror(): list of arguments.
     _createArgumentsArray(temp, typeArgs, args, storeLastArgumentToTemp);
@@ -1515,12 +1606,12 @@
     // Argument 3 for _allocateInvocationMirror(): isSuperInvocation flag.
     asm.emitPushTrue();
 
-    _genStaticCall(allocateInvocationMirror, new ConstantArgDesc(4), 4);
+    _genStaticCall(allocateInvocationMirror, cp.addArgDesc(4), 4);
 
     final Member target = hierarchy.getDispatchTarget(
         enclosingClass.superclass, new Name('noSuchMethod'));
     assert(target != null);
-    _genStaticCall(target, new ConstantArgDesc(2), 2);
+    _genStaticCall(target, cp.addArgDesc(2), 2);
   }
 
   @override
@@ -1529,7 +1620,7 @@
 
   @override
   visitAsExpression(AsExpression node) {
-    node.operand.accept(this);
+    _generateNode(node.operand);
 
     final type = node.type;
     if (typeEnvironment.isTop(type)) {
@@ -1551,7 +1642,7 @@
 
   @override
   visitDoubleLiteral(DoubleLiteral node) {
-    final cpIndex = cp.add(new ConstantDouble.fromLiteral(node));
+    final cpIndex = cp.addDouble(node.value);
     asm.emitPushConstant(cpIndex);
   }
 
@@ -1563,12 +1654,12 @@
 
     _genConditionAndJumpIf(node.condition, false, otherwisePart);
 
-    node.then.accept(this);
+    _generateNode(node.then);
     asm.emitPopLocal(temp);
     asm.emitJump(done);
 
     asm.bind(otherwisePart);
-    node.otherwise.accept(this);
+    _generateNode(node.otherwise);
     asm.emitPopLocal(temp);
 
     asm.bind(done);
@@ -1583,12 +1674,12 @@
     }
 
     final constructedClass = node.constructedType.classNode;
-    final classIndex = cp.add(new ConstantClass(constructedClass));
+    final classIndex = cp.addClass(constructedClass);
 
     if (hasInstantiatorTypeArguments(constructedClass)) {
       _genTypeArguments(node.arguments.types,
           instantiatingClass: constructedClass);
-      asm.emitPushConstant(cp.add(new ConstantClass(constructedClass)));
+      asm.emitPushConstant(cp.addClass(constructedClass));
       asm.emitAllocateT();
     } else {
       assert(node.arguments.types.isEmpty);
@@ -1622,10 +1713,10 @@
 
   @override
   visitDirectPropertyGet(DirectPropertyGet node) {
-    node.receiver.accept(this);
+    _generateNode(node.receiver);
     final target = node.target;
     if (target is Field || (target is Procedure && target.isGetter)) {
-      _genStaticCall(target, new ConstantArgDesc(1), 1, isGet: true);
+      _genStaticCall(target, cp.addArgDesc(1), 1, isGet: true);
     } else {
       throw new UnsupportedOperationError(
           'Unsupported DirectPropertyGet with ${target.runtimeType} $target');
@@ -1637,8 +1728,8 @@
     final int temp = locals.tempIndexInFrame(node);
     final bool hasResult = !isExpressionWithoutResult(node);
 
-    node.receiver.accept(this);
-    node.value.accept(this);
+    _generateNode(node.receiver);
+    _generateNode(node.value);
 
     if (hasResult) {
       asm.emitStoreLocal(temp);
@@ -1646,7 +1737,7 @@
 
     final target = node.target;
     assert(target is Field || (target is Procedure && target.isSetter));
-    _genStaticCall(target, new ConstantArgDesc(2), 2, isSet: true);
+    _genStaticCall(target, cp.addArgDesc(2), 2, isSet: true);
     asm.emitDrop1();
 
     if (hasResult) {
@@ -1665,23 +1756,21 @@
     final int newClosure = locals.tempIndexInFrame(node, tempIndex: 1);
     final int typeArguments = locals.tempIndexInFrame(node, tempIndex: 2);
 
-    node.expression.accept(this);
+    _generateNode(node.expression);
     asm.emitStoreLocal(oldClosure);
 
     _genTypeArguments(node.typeArguments);
     asm.emitStoreLocal(typeArguments);
 
-    _genStaticCall(
-        boundsCheckForPartialInstantiation, new ConstantArgDesc(2), 2);
+    _genStaticCall(boundsCheckForPartialInstantiation, cp.addArgDesc(2), 2);
     asm.emitDrop1();
 
     assert(closureClass.typeParameters.isEmpty);
-    asm.emitAllocate(cp.add(new ConstantClass(closureClass)));
+    asm.emitAllocate(cp.addClass(closureClass));
     asm.emitStoreLocal(newClosure);
 
     asm.emitPush(typeArguments);
-    asm.emitStoreFieldTOS(
-        cp.add(new ConstantInstanceField(closureDelayedTypeArguments)));
+    asm.emitStoreFieldTOS(cp.addInstanceField(closureDelayedTypeArguments));
 
     // Copy the rest of the fields from old closure to a new closure.
     final fieldsToCopy = <Field>[
@@ -1692,7 +1781,7 @@
     ];
 
     for (Field field in fieldsToCopy) {
-      final fieldOffsetCpIndex = cp.add(new ConstantInstanceField(field));
+      final fieldOffsetCpIndex = cp.addInstanceField(field);
       asm.emitPush(newClosure);
       asm.emitPush(oldClosure);
       asm.emitLoadFieldTOS(fieldOffsetCpIndex);
@@ -1704,15 +1793,15 @@
 
   @override
   visitIsExpression(IsExpression node) {
-    node.operand.accept(this);
+    _generateNode(node.operand);
     _genInstanceOf(node.type);
   }
 
   @override
   visitLet(Let node) {
     _enterScope(node);
-    node.variable.accept(this);
-    node.body.accept(this);
+    _generateNode(node.variable);
+    _generateNode(node.body);
     _leaveScope();
   }
 
@@ -1736,7 +1825,7 @@
     for (int i = 0; i < node.expressions.length; i++) {
       asm.emitPush(temp);
       _genPushInt(i);
-      node.expressions[i].accept(this);
+      _generateNode(node.expressions[i]);
       asm.emitStoreIndexedTOS();
     }
 
@@ -1744,7 +1833,7 @@
     // Type arguments passed to a factory constructor are counted as a normal
     // argument and not counted in number of type arguments.
     assert(listFromLiteral.isFactory);
-    _genStaticCall(listFromLiteral, new ConstantArgDesc(2, numTypeArgs: 0), 2);
+    _genStaticCall(listFromLiteral, cp.addArgDesc(2, numTypeArgs: 0), 2);
   }
 
   @override
@@ -1783,8 +1872,7 @@
     _genTypeArguments([node.keyType, node.valueType]);
 
     if (node.entries.isEmpty) {
-      asm.emitPushConstant(
-          cp.add(new ConstantList(const DynamicType(), const [])));
+      asm.emitPushConstant(cp.addList(const DynamicType(), const []));
     } else {
       _genTypeArguments([const DynamicType()]);
       _genPushInt(node.entries.length * 2);
@@ -1797,12 +1885,12 @@
         // key
         asm.emitPush(temp);
         _genPushInt(i * 2);
-        node.entries[i].key.accept(this);
+        _generateNode(node.entries[i].key);
         asm.emitStoreIndexedTOS();
         // value
         asm.emitPush(temp);
         _genPushInt(i * 2 + 1);
-        node.entries[i].value.accept(this);
+        _generateNode(node.entries[i].value);
         asm.emitStoreIndexedTOS();
       }
     }
@@ -1811,7 +1899,7 @@
     // Type arguments passed to a factory constructor are counted as a normal
     // argument and not counted in number of type arguments.
     assert(mapFromLiteral.isFactory);
-    _genStaticCall(mapFromLiteral, new ConstantArgDesc(2, numTypeArgs: 0), 2);
+    _genStaticCall(mapFromLiteral, cp.addArgDesc(2, numTypeArgs: 0), 2);
   }
 
   void _genMethodInvocationUsingSpecializedBytecode(
@@ -1819,14 +1907,14 @@
     switch (opcode) {
       case Opcode.kEqualsNull:
         if (node.receiver is NullLiteral) {
-          node.arguments.positional.single.accept(this);
+          _generateNode(node.arguments.positional.single);
         } else {
-          node.receiver.accept(this);
+          _generateNode(node.receiver);
         }
         break;
 
       case Opcode.kNegateInt:
-        node.receiver.accept(this);
+        _generateNode(node.receiver);
         break;
 
       case Opcode.kAddInt:
@@ -1844,8 +1932,8 @@
       case Opcode.kCompareIntLt:
       case Opcode.kCompareIntGe:
       case Opcode.kCompareIntLe:
-        node.receiver.accept(this);
-        node.arguments.positional.single.accept(this);
+        _generateNode(node.receiver);
+        _generateNode(node.arguments.positional.single);
         break;
 
       default:
@@ -1855,6 +1943,14 @@
     asm.emitBytecode0(opcode);
   }
 
+  void _genInstanceCall(int totalArgCount, int icdataCpIndex, bool isDynamic) {
+    if (isDynamic) {
+      asm.emitDynamicCall(totalArgCount, icdataCpIndex);
+    } else {
+      asm.emitInterfaceCall(totalArgCount, icdataCpIndex);
+    }
+  }
+
   @override
   visitMethodInvocation(MethodInvocation node) {
     final Opcode opcode = recognizedMethods.specializedBytecodeFor(node);
@@ -1863,27 +1959,28 @@
       return;
     }
     final args = node.arguments;
+    final isDynamic = node.interfaceTarget == null;
     _genArguments(node.receiver, args);
-    final argDescIndex =
-        cp.add(new ConstantArgDesc.fromArguments(args, hasReceiver: true));
-    final icdataIndex = cp.add(new ConstantICData(
+    final argDescIndex = cp.addArgDescByArguments(args, hasReceiver: true);
+    final icdataIndex = cp.addInstanceCall(
         InvocationKind.method, node.name, argDescIndex,
-        isDynamic: node.interfaceTarget == null));
+        isDynamic: isDynamic);
     final totalArgCount = args.positional.length +
         args.named.length +
         1 /* receiver */ +
         (args.types.isNotEmpty ? 1 : 0) /* type arguments */;
-    asm.emitInstanceCall(totalArgCount, icdataIndex);
+    _genInstanceCall(totalArgCount, icdataIndex, isDynamic);
   }
 
   @override
   visitPropertyGet(PropertyGet node) {
-    node.receiver.accept(this);
-    final argDescIndex = cp.add(new ConstantArgDesc(1));
-    final icdataIndex = cp.add(new ConstantICData(
+    _generateNode(node.receiver);
+    final isDynamic = node.interfaceTarget == null;
+    final argDescIndex = cp.addArgDesc(1);
+    final icdataIndex = cp.addInstanceCall(
         InvocationKind.getter, node.name, argDescIndex,
-        isDynamic: node.interfaceTarget == null));
-    asm.emitInstanceCall(1, icdataIndex);
+        isDynamic: isDynamic);
+    _genInstanceCall(1, icdataIndex, isDynamic);
   }
 
   @override
@@ -1891,18 +1988,19 @@
     final int temp = locals.tempIndexInFrame(node);
     final bool hasResult = !isExpressionWithoutResult(node);
 
-    node.receiver.accept(this);
-    node.value.accept(this);
+    _generateNode(node.receiver);
+    _generateNode(node.value);
 
     if (hasResult) {
       asm.emitStoreLocal(temp);
     }
 
-    final argDescIndex = cp.add(new ConstantArgDesc(2));
-    final icdataIndex = cp.add(new ConstantICData(
+    final isDynamic = node.interfaceTarget == null;
+    final argDescIndex = cp.addArgDesc(2);
+    final icdataIndex = cp.addInstanceCall(
         InvocationKind.setter, node.name, argDescIndex,
-        isDynamic: node.interfaceTarget == null));
-    asm.emitInstanceCall(2, icdataIndex);
+        isDynamic: isDynamic);
+    _genInstanceCall(2, icdataIndex, isDynamic);
     asm.emitDrop1();
 
     if (hasResult) {
@@ -1920,7 +2018,7 @@
       _genNoSuchMethodForSuperCall(
           node.name.name,
           temp,
-          new ConstantArgDesc.fromArguments(args, hasReceiver: true),
+          cp.addArgDescByArguments(args, hasReceiver: true),
           args.types,
           <Expression>[new ThisExpression()]
             ..addAll(args.positional)
@@ -1937,12 +2035,12 @@
         hierarchy.getDispatchTarget(enclosingClass.superclass, node.name);
     if (target == null) {
       final int temp = locals.tempIndexInFrame(node);
-      _genNoSuchMethodForSuperCall(node.name.name, temp, new ConstantArgDesc(1),
-          [], <Expression>[new ThisExpression()]);
+      _genNoSuchMethodForSuperCall(node.name.name, temp, cp.addArgDesc(1), [],
+          <Expression>[new ThisExpression()]);
       return;
     }
     _genPushReceiver();
-    _genStaticCall(target, new ConstantArgDesc(1), 1, isGet: true);
+    _genStaticCall(target, cp.addArgDesc(1), 1, isGet: true);
   }
 
   @override
@@ -1953,19 +2051,19 @@
     final Member target = hierarchy
         .getDispatchTarget(enclosingClass.superclass, node.name, setter: true);
     if (target == null) {
-      _genNoSuchMethodForSuperCall(node.name.name, temp, new ConstantArgDesc(2),
-          [], <Expression>[new ThisExpression(), node.value],
+      _genNoSuchMethodForSuperCall(node.name.name, temp, cp.addArgDesc(2), [],
+          <Expression>[new ThisExpression(), node.value],
           storeLastArgumentToTemp: hasResult);
     } else {
       _genPushReceiver();
-      node.value.accept(this);
+      _generateNode(node.value);
 
       if (hasResult) {
         asm.emitStoreLocal(temp);
       }
 
       assert(target is Field || (target is Procedure && target.isSetter));
-      _genStaticCall(target, new ConstantArgDesc(2), 2, isSet: true);
+      _genStaticCall(target, cp.addArgDesc(2), 2, isSet: true);
     }
 
     asm.emitDrop1();
@@ -2019,18 +2117,18 @@
       if (target.isConst) {
         _genPushConstExpr(target.initializer);
       } else if (_hasTrivialInitializer(target)) {
-        final fieldIndex = cp.add(new ConstantStaticField(target));
+        final fieldIndex = cp.addStaticField(target);
         asm.emitPushConstant(
             fieldIndex); // TODO(alexmarkov): do we really need this?
         asm.emitPushStatic(fieldIndex);
       } else {
-        _genStaticCall(target, new ConstantArgDesc(0), 0, isGet: true);
+        _genStaticCall(target, cp.addArgDesc(0), 0, isGet: true);
       }
     } else if (target is Procedure) {
       if (target.isGetter) {
-        _genStaticCall(target, new ConstantArgDesc(0), 0, isGet: true);
+        _genStaticCall(target, cp.addArgDesc(0), 0, isGet: true);
       } else {
-        final tearOffIndex = cp.add(new ConstantTearOff(target));
+        final tearOffIndex = cp.addTearOff(target);
         asm.emitPushConstant(tearOffIndex);
       }
     } else {
@@ -2050,7 +2148,7 @@
       // The result of the unsafeCast() intrinsic method is its sole argument,
       // without any additional checks or type casts.
       assert(args.named.isEmpty);
-      args.positional.single.accept(this);
+      _generateNode(args.positional.single);
       return;
     }
     if (target.isFactory) {
@@ -2064,7 +2162,8 @@
         asm.emitPushNull();
       }
       args =
-          new Arguments(node.arguments.positional, named: node.arguments.named);
+          new Arguments(node.arguments.positional, named: node.arguments.named)
+            ..parent = node;
     }
     _genArguments(null, args);
     _genStaticCallWithArgs(target, args, isFactory: target.isFactory);
@@ -2074,7 +2173,7 @@
   visitStaticSet(StaticSet node) {
     final bool hasResult = !isExpressionWithoutResult(node);
 
-    node.value.accept(this);
+    _generateNode(node.value);
 
     if (hasResult) {
       _genDupTOS(locals.tempIndexInFrame(node));
@@ -2082,10 +2181,10 @@
 
     final target = node.target;
     if (target is Field) {
-      int cpIndex = cp.add(new ConstantStaticField(target));
+      int cpIndex = cp.addStaticField(target);
       asm.emitStoreStaticTOS(cpIndex);
     } else {
-      _genStaticCall(target, new ConstantArgDesc(1), 1, isSet: true);
+      _genStaticCall(target, cp.addArgDesc(1), 1, isSet: true);
       asm.emitDrop1();
     }
   }
@@ -2093,8 +2192,8 @@
   @override
   visitStringConcatenation(StringConcatenation node) {
     if (node.expressions.length == 1) {
-      node.expressions.single.accept(this);
-      _genStaticCall(interpolateSingle, new ConstantArgDesc(1), 1);
+      _generateNode(node.expressions.single);
+      _genStaticCall(interpolateSingle, cp.addArgDesc(1), 1);
     } else {
       asm.emitPushNull();
       _genPushInt(node.expressions.length);
@@ -2106,17 +2205,17 @@
       for (int i = 0; i < node.expressions.length; i++) {
         asm.emitPush(temp);
         _genPushInt(i);
-        node.expressions[i].accept(this);
+        _generateNode(node.expressions[i]);
         asm.emitStoreIndexedTOS();
       }
 
-      _genStaticCall(interpolate, new ConstantArgDesc(1), 1);
+      _genStaticCall(interpolate, cp.addArgDesc(1), 1);
     }
   }
 
   @override
   visitStringLiteral(StringLiteral node) {
-    final cpIndex = cp.add(new ConstantString.fromLiteral(node));
+    final cpIndex = cp.addString(node.value);
     asm.emitPushConstant(cpIndex);
   }
 
@@ -2132,14 +2231,14 @@
 
   @override
   visitThrow(Throw node) {
-    node.expression.accept(this);
+    _generateNode(node.expression);
     asm.emitThrow(0);
   }
 
   @override
   visitTypeLiteral(TypeLiteral node) {
     final DartType type = node.type;
-    final int typeCPIndex = cp.add(new ConstantType(type));
+    final int typeCPIndex = cp.addType(type);
     if (!hasFreeTypeParameters([type])) {
       asm.emitPushConstant(typeCPIndex);
     } else {
@@ -2166,7 +2265,7 @@
     if (locals.isCaptured(v)) {
       _genPushContextForVariable(v);
 
-      node.value.accept(this);
+      _generateNode(node.value);
 
       final int temp = locals.tempIndexInFrame(node);
       if (hasResult) {
@@ -2179,7 +2278,7 @@
         asm.emitPush(temp);
       }
     } else {
-      node.value.accept(this);
+      _generateNode(node.value);
 
       final int localIndex = locals.getVarIndexInFrame(v);
       if (hasResult) {
@@ -2192,7 +2291,7 @@
 
   void _genFutureNull() {
     asm.emitPushNull();
-    _genStaticCall(futureValue, new ConstantArgDesc(1), 1);
+    _genStaticCall(futureValue, cp.addArgDesc(1), 1);
   }
 
   @override
@@ -2212,16 +2311,16 @@
 
     _genConditionAndJumpIf(node.condition, true, done);
 
-    _genPushInt(omitSourcePositions ? 0 : node.conditionStartOffset);
-    _genPushInt(omitSourcePositions ? 0 : node.conditionEndOffset);
+    _genPushInt(omitAssertSourcePositions ? 0 : node.conditionStartOffset);
+    _genPushInt(omitAssertSourcePositions ? 0 : node.conditionEndOffset);
 
     if (node.message != null) {
-      node.message.accept(this);
+      _generateNode(node.message);
     } else {
       asm.emitPushNull();
     }
 
-    _genStaticCall(throwNewAssertionError, new ConstantArgDesc(3), 3);
+    _genStaticCall(throwNewAssertionError, cp.addArgDesc(3), 3);
     asm.emitDrop1();
 
     asm.bind(done);
@@ -2230,7 +2329,7 @@
   @override
   visitBlock(Block node) {
     _enterScope(node);
-    visitList(node.statements, this);
+    _generateNodeList(node.statements);
     _leaveScope();
   }
 
@@ -2240,7 +2339,7 @@
     asm.emitJumpIfNoAsserts(done);
 
     _enterScope(node);
-    visitList(node.statements, this);
+    _generateNodeList(node.statements);
     _leaveScope();
 
     asm.bind(done);
@@ -2281,11 +2380,13 @@
     final Label join = new Label(allowsBackwardJumps: true);
     asm.bind(join);
 
-    asm.emitCheckStack();
+    asm.emitCheckStack(++currentLoopDepth);
 
-    node.body.accept(this);
+    _generateNode(node.body);
 
     _genConditionAndJumpIf(node.condition, true, join);
+
+    --currentLoopDepth;
   }
 
   @override
@@ -2296,7 +2397,7 @@
   @override
   visitExpressionStatement(ExpressionStatement node) {
     final expr = node.expression;
-    expr.accept(this);
+    _generateNode(expr);
     if (!isExpressionWithoutResult(expr)) {
       asm.emitDrop1();
     }
@@ -2304,16 +2405,18 @@
 
   @override
   visitForInStatement(ForInStatement node) {
-    node.iterable.accept(this);
+    _generateNode(node.iterable);
 
     const kIterator = 'iterator'; // Iterable.iterator
     const kMoveNext = 'moveNext'; // Iterator.moveNext
     const kCurrent = 'current'; // Iterator.current
 
-    asm.emitInstanceCall(
+    // Front-end inserts implicit cast (type check) which ensures that
+    // result of iterable expression is Iterable<dynamic>.
+    asm.emitInterfaceCall(
         1,
-        cp.add(new ConstantICData(InvocationKind.getter, new Name(kIterator),
-            cp.add(new ConstantArgDesc(1)))));
+        cp.addInterfaceCall(
+            InvocationKind.getter, new Name(kIterator), cp.addArgDesc(1)));
 
     final iteratorTemp = locals.tempIndexInFrame(node);
     asm.emitPopLocal(iteratorTemp);
@@ -2335,7 +2438,7 @@
     final Label join = new Label(allowsBackwardJumps: true);
 
     asm.bind(join);
-    asm.emitCheckStack();
+    asm.emitCheckStack(++currentLoopDepth);
 
     if (capturedIteratorVar != null) {
       _genLoadVar(capturedIteratorVar);
@@ -2344,10 +2447,10 @@
       asm.emitPush(iteratorTemp);
     }
 
-    asm.emitInstanceCall(
+    asm.emitInterfaceCall(
         1,
-        cp.add(new ConstantICData(InvocationKind.method, new Name(kMoveNext),
-            cp.add(new ConstantArgDesc(1)))));
+        cp.addInterfaceCall(
+            InvocationKind.method, new Name(kMoveNext), cp.addArgDesc(1)));
     _genJumpIfFalse(/* negated = */ false, done);
 
     _enterScope(node);
@@ -2355,26 +2458,27 @@
     _genPushContextIfCaptured(node.variable);
 
     asm.emitPush(iteratorTemp);
-    asm.emitInstanceCall(
+    asm.emitInterfaceCall(
         1,
-        cp.add(new ConstantICData(InvocationKind.getter, new Name(kCurrent),
-            cp.add(new ConstantArgDesc(1)))));
+        cp.addInterfaceCall(
+            InvocationKind.getter, new Name(kCurrent), cp.addArgDesc(1)));
 
     _genStoreVar(node.variable);
 
-    node.body.accept(this);
+    _generateNode(node.body);
 
     _leaveScope();
     asm.emitJump(join);
 
     asm.bind(done);
+    --currentLoopDepth;
   }
 
   @override
   visitForStatement(ForStatement node) {
     _enterScope(node);
     try {
-      visitList(node.variables, this);
+      _generateNodeList(node.variables);
 
       if (asm.isUnreachable) {
         // Bail out before binding a label which allows backward jumps,
@@ -2386,28 +2490,30 @@
       final Label join = new Label(allowsBackwardJumps: true);
       asm.bind(join);
 
-      asm.emitCheckStack();
+      asm.emitCheckStack(++currentLoopDepth);
 
       if (node.condition != null) {
         _genConditionAndJumpIf(node.condition, false, done);
       }
 
-      node.body.accept(this);
+      _generateNode(node.body);
 
       if (locals.currentContextSize > 0) {
         asm.emitPush(locals.contextVarIndexInFrame);
-        asm.emitCloneContext();
+        asm.emitCloneContext(
+            locals.currentContextId, locals.currentContextSize);
         asm.emitPopLocal(locals.contextVarIndexInFrame);
       }
 
       for (var update in node.updates) {
-        update.accept(this);
+        _generateNode(update);
         asm.emitDrop1();
       }
 
       asm.emitJump(join);
 
       asm.bind(done);
+      --currentLoopDepth;
     } finally {
       _leaveScope();
     }
@@ -2426,13 +2532,13 @@
 
     _genConditionAndJumpIf(node.condition, false, otherwisePart);
 
-    node.then.accept(this);
+    _generateNode(node.then);
 
     if (node.otherwise != null) {
       final Label done = new Label();
       asm.emitJump(done);
       asm.bind(otherwisePart);
-      node.otherwise.accept(this);
+      _generateNode(node.otherwise);
       asm.bind(done);
     } else {
       asm.bind(otherwisePart);
@@ -2444,7 +2550,7 @@
     final label = new Label();
     labeledStatements[node] = label;
     contextLevels[node] = locals.currentContextLevel;
-    node.body.accept(this);
+    _generateNode(node.body);
     asm.bind(label);
     labeledStatements.remove(node);
     contextLevels.remove(node);
@@ -2457,18 +2563,18 @@
     final List<TryFinally> tryFinallyBlocks =
         _getEnclosingTryFinallyBlocks(node, null);
     if (tryFinallyBlocks.isEmpty) {
-      expr.accept(this);
+      _generateNode(expr);
       asm.emitReturnTOS();
     } else {
       if (expr is BasicLiteral) {
         _addFinallyBlocks(tryFinallyBlocks, () {
-          expr.accept(this);
+          _generateNode(expr);
           asm.emitReturnTOS();
         });
       } else {
         // Keep return value in a variable as try-catch statements
         // inside finally can zap expression stack.
-        node.expression.accept(this);
+        _generateNode(node.expression);
         asm.emitPopLocal(locals.returnVarIndexInFrame);
 
         _addFinallyBlocks(tryFinallyBlocks, () {
@@ -2483,7 +2589,7 @@
   visitSwitchStatement(SwitchStatement node) {
     contextLevels[node] = locals.currentContextLevel;
 
-    node.expression.accept(this);
+    _generateNode(node.expression);
 
     if (asm.isUnreachable) {
       // Bail out before binding labels which allow backward jumps,
@@ -2497,7 +2603,7 @@
     final Label done = new Label();
     final List<Label> caseLabels = new List<Label>.generate(
         node.cases.length, (_) => new Label(allowsBackwardJumps: true));
-    final equalsArgDesc = cp.add(new ConstantArgDesc(2));
+    final equalsArgDesc = cp.addArgDesc(2);
 
     Label defaultLabel = done;
     for (int i = 0; i < node.cases.length; i++) {
@@ -2511,10 +2617,10 @@
         for (var expr in switchCase.expressions) {
           asm.emitPush(temp);
           _genPushConstExpr(expr);
-          asm.emitInstanceCall(
+          asm.emitInterfaceCall(
               2,
-              cp.add(new ConstantICData(
-                  InvocationKind.method, new Name('=='), equalsArgDesc)));
+              cp.addInterfaceCall(
+                  InvocationKind.method, new Name('=='), equalsArgDesc));
           _genJumpIfTrue(/* negated = */ false, caseLabel);
         }
       }
@@ -2527,7 +2633,7 @@
       final Label caseLabel = caseLabels[i];
 
       asm.bind(caseLabel);
-      switchCase.body.accept(this);
+      _generateNode(switchCase.body);
 
       // Front-end issues a compile-time error if there is a fallthrough
       // between cases. Also, default case should be the last one.
@@ -2583,7 +2689,7 @@
       // 1. Restore context from closure var.
       // This context has a context level at frame entry.
       asm.emitPush(locals.closureVarIndexInFrame);
-      asm.emitLoadFieldTOS(cp.add(new ConstantInstanceField(closureContext)));
+      asm.emitLoadFieldTOS(cp.addInstanceField(closureContext));
       asm.emitPopLocal(locals.contextVarIndexInFrame);
 
       // 2. Restore context from captured :saved_try_context_var${depth}.
@@ -2617,8 +2723,8 @@
 
     _restoreContextForTryBlock(node);
 
-    asm.emitMoveSpecial(_exceptionVar(node), SpecialIndex.exception);
-    asm.emitMoveSpecial(_stackTraceVar(node), SpecialIndex.stackTrace);
+    asm.emitMoveSpecial(SpecialIndex.exception, _exceptionVar(node));
+    asm.emitMoveSpecial(SpecialIndex.stackTrace, _stackTraceVar(node));
 
     final capturedExceptionVar = locals.capturedExceptionVar(node);
     if (capturedExceptionVar != null) {
@@ -2667,7 +2773,7 @@
     tryBlock.isSynthetic = node.isSynthetic;
     tryCatches[node] = tryBlock; // Used by rethrow.
 
-    node.body.accept(this);
+    _generateNode(node.body);
     asm.emitJump(done);
 
     _endTryBlock(node, tryBlock);
@@ -2678,7 +2784,7 @@
     bool hasCatchAll = false;
 
     for (Catch catchClause in node.catches) {
-      tryBlock.types.add(cp.add(new ConstantType(catchClause.guard)));
+      tryBlock.types.add(cp.addType(catchClause.guard));
 
       Label skipCatch;
       if (catchClause.guard == const DynamicType()) {
@@ -2706,7 +2812,7 @@
         _genStoreVar(catchClause.stackTrace);
       }
 
-      catchClause.body.accept(this);
+      _generateNode(catchClause.body);
 
       _leaveScope();
       asm.emitJump(done);
@@ -2734,7 +2840,7 @@
     final TryBlock tryBlock = _startTryBlock(node);
     finallyBlocks[node] = <FinallyBlock>[];
 
-    node.body.accept(this);
+    _generateNode(node.body);
 
     if (!asm.isUnreachable) {
       final normalContinuation = new FinallyBlock(() {
@@ -2746,9 +2852,9 @@
 
     _endTryBlock(node, tryBlock);
 
-    tryBlock.types.add(cp.add(new ConstantType(const DynamicType())));
+    tryBlock.types.add(cp.addType(const DynamicType()));
 
-    node.finalizer.accept(this);
+    _generateNode(node.finalizer);
 
     tryBlock.needsStackTrace = true; // For rethrowing.
     _genRethrow(node);
@@ -2756,7 +2862,7 @@
     for (var finallyBlock in finallyBlocks[node]) {
       asm.bind(finallyBlock.entry);
       _restoreContextForTryBlock(node);
-      node.finalizer.accept(this);
+      _generateNode(node.finalizer);
       finallyBlock.generateContinuation();
     }
 
@@ -2774,15 +2880,11 @@
         _genPushContextForVariable(node);
       }
       if (node.initializer != null) {
-        node.initializer.accept(this);
+        _generateNode(node.initializer);
       } else {
         asm.emitPushNull();
       }
-      if (isCaptured) {
-        asm.emitStoreContextVar(locals.getVarIndexInContext(node));
-      } else {
-        asm.emitPopLocal(locals.getVarIndexInFrame(node));
-      }
+      _genStoreVar(node);
     }
   }
 
@@ -2798,13 +2900,14 @@
     final Label join = new Label(allowsBackwardJumps: true);
     asm.bind(join);
 
-    asm.emitCheckStack();
+    asm.emitCheckStack(++currentLoopDepth);
 
     _genConditionAndJumpIf(node.condition, false, done);
 
-    node.body.accept(this);
+    _generateNode(node.body);
 
     asm.emitJump(join);
+    --currentLoopDepth;
 
     asm.bind(done);
   }
@@ -2838,7 +2941,7 @@
 
     // return <expression>
     // Note: finally blocks are *not* executed on the way out.
-    node.expression.accept(this);
+    _generateNode(node.expression);
     asm.emitReturnTOS();
 
     asm.bind(continuationLabel);
@@ -2895,12 +2998,12 @@
 
   @override
   visitLocalInitializer(LocalInitializer node) {
-    node.variable.accept(this);
+    _generateNode(node.variable);
   }
 
   @override
   visitAssertInitializer(AssertInitializer node) {
-    node.statement.accept(this);
+    _generateNode(node.statement);
   }
 
   @override
@@ -2919,57 +3022,50 @@
       'Unsupported constant node ${node.runtimeType}');
 
   @override
-  int visitNullConstant(NullConstant node) => cp.add(const ConstantNull());
+  int visitNullConstant(NullConstant node) => cp.addNull();
 
   @override
-  int visitBoolConstant(BoolConstant node) =>
-      cp.add(new ConstantBool(node.value));
+  int visitBoolConstant(BoolConstant node) => cp.addBool(node.value);
 
   @override
-  int visitIntConstant(IntConstant node) => cp.add(new ConstantInt(node.value));
+  int visitIntConstant(IntConstant node) => cp.addInt(node.value);
 
   @override
-  int visitDoubleConstant(DoubleConstant node) =>
-      cp.add(new ConstantDouble(node.value));
+  int visitDoubleConstant(DoubleConstant node) => cp.addDouble(node.value);
 
   @override
-  int visitStringConstant(StringConstant node) =>
-      cp.add(new ConstantString(node.value));
+  int visitStringConstant(StringConstant node) => cp.addString(node.value);
 
   @override
   int visitSymbolConstant(SymbolConstant node) =>
-      cp.add(new ConstantSymbol(node.libraryReference, node.name));
+      cp.addSymbol(node.libraryReference?.asLibrary, node.name);
 
   @override
-  int visitListConstant(ListConstant node) => cp.add(new ConstantList(
-      node.typeArgument,
-      new List<int>.from(node.entries.map((Constant c) => c.accept(this)))));
+  int visitListConstant(ListConstant node) => cp.addList(node.typeArgument,
+      new List<int>.from(node.entries.map((Constant c) => c.accept(this))));
 
   @override
-  int visitInstanceConstant(InstanceConstant node) =>
-      cp.add(new ConstantInstance(
-          node.klass,
-          cp.add(hasInstantiatorTypeArguments(node.klass)
-              ? new ConstantTypeArgumentsForInstanceAllocation(
-                  node.klass, node.typeArguments)
-              : new ConstantNull()),
-          node.fieldValues.map<Reference, int>(
-              (Reference fieldRef, Constant value) =>
-                  new MapEntry(fieldRef, value.accept(this)))));
+  int visitInstanceConstant(InstanceConstant node) => cp.addInstance(
+      node.klass,
+      hasInstantiatorTypeArguments(node.klass)
+          ? cp.addTypeArgumentsForInstanceAllocation(
+              node.klass, node.typeArguments)
+          : cp.addNull(),
+      node.fieldValues.map<Field, int>((Reference fieldRef, Constant value) =>
+          new MapEntry(fieldRef.asField, value.accept(this))));
 
   @override
   int visitTearOffConstant(TearOffConstant node) =>
-      cp.add(new ConstantTearOff(node.procedure));
+      cp.addTearOff(node.procedure);
 
   @override
   int visitTypeLiteralConstant(TypeLiteralConstant node) =>
-      cp.add(new ConstantType(node.type));
+      cp.addType(node.type);
 
   @override
   int visitPartialInstantiationConstant(PartialInstantiationConstant node) =>
-      cp.add(new ConstantPartialTearOffInstantiation(
-          node.tearOffConstant.accept(this),
-          cp.add(new ConstantTypeArguments(node.types))));
+      cp.addPartialTearOffInstantiation(
+          node.tearOffConstant.accept(this), cp.addTypeArguments(node.types));
 }
 
 class UnsupportedOperationError {
@@ -3037,14 +3133,8 @@
 class DropAST extends Transformer {
   BytecodeMetadataRepository metadata;
 
-  @override
-  TreeNode visitComponent(Component node) {
-    metadata = node.metadata[new BytecodeMetadataRepository().tag];
-    if (metadata != null) {
-      return super.visitComponent(node);
-    }
-    return node;
-  }
+  DropAST(Component component)
+      : metadata = component.metadata[new BytecodeMetadataRepository().tag];
 
   @override
   TreeNode defaultMember(Member node) {
@@ -3073,7 +3163,8 @@
     return node;
   }
 
-  bool _hasBytecode(Member node) => metadata.mapping.containsKey(node);
+  bool _hasBytecode(Member node) =>
+      metadata != null && metadata.mapping.containsKey(node);
 }
 
 typedef void GenerateContinuation();
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 94c3880..b3fac13 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -63,6 +63,7 @@
 
   int get currentContextSize => _currentScope.contextSize;
   int get currentContextLevel => _currentScope.contextLevel;
+  int get currentContextId => _currentScope.contextId;
 
   int get contextLevelAtEntry =>
       _currentFrame.contextLevelAtEntry ??
@@ -74,6 +75,12 @@
     return v.scope.contextLevel;
   }
 
+  int getVarContextId(VariableDeclaration variable) {
+    final v = _getVarDesc(variable);
+    assert(v.isCaptured);
+    return v.scope.contextId;
+  }
+
   int get closureVarIndexInFrame => getVarIndexInFrame(_currentFrame
           .closureVar ??
       (throw 'Closure variable is not declared in ${_currentFrame.function}'));
@@ -257,6 +264,7 @@
   int contextUsed = 0;
   int contextSize = 0;
   int contextLevel;
+  int contextId;
 
   Scope(this.parent, this.frame, this.loopDepth);
 
@@ -699,6 +707,7 @@
 
   Scope _currentScope;
   Frame _currentFrame;
+  int _contextIdCounter = 0;
 
   _Allocator(this.locals);
 
@@ -738,6 +747,7 @@
 
     assert(_currentScope.contextOwner == null);
     assert(_currentScope.contextLevel == null);
+    assert(_currentScope.contextId == null);
 
     final int parentContextLevel =
         _currentScope.parent != null ? _currentScope.parent.contextLevel : -1;
@@ -763,8 +773,13 @@
 
       if (_currentScope.contextOwner == _currentScope) {
         _currentScope.contextLevel = parentContextLevel + 1;
+        _currentScope.contextId = _contextIdCounter++;
+        if (_currentScope.contextId >= contextIdLimit) {
+          throw new ContextIdOverflowException();
+        }
       } else {
         _currentScope.contextLevel = _currentScope.contextOwner.contextLevel;
+        _currentScope.contextId = _currentScope.contextOwner.contextId;
       }
     } else {
       _currentScope.contextLevel = parentContextLevel;
@@ -1126,8 +1141,7 @@
 
   @override
   visitStaticSet(StaticSet node) {
-    _allocateTemp(node);
-    super.visitStaticSet(node);
+    _visit(node, temps: 1);
   }
 
   @override
@@ -1148,3 +1162,5 @@
 
 class LocalVariableIndexOverflowException
     extends BytecodeLimitExceededException {}
+
+class ContextIdOverflowException extends BytecodeLimitExceededException {}
diff --git a/pkg/vm/lib/bytecode/ngrams.dart b/pkg/vm/lib/bytecode/ngrams.dart
new file mode 100644
index 0000000..040b51b
--- /dev/null
+++ b/pkg/vm/lib/bytecode/ngrams.dart
@@ -0,0 +1,147 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.bytecode.ngrams;
+
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:kernel/ast.dart' show listEquals, listHashCode;
+
+import 'dbc.dart';
+import 'disassembler.dart' show Instruction, BytecodeDisassembler;
+
+bool isControlFlowInstr(Instruction instr) => isControlFlow(instr.opcode);
+
+class NGram {
+  List<Instruction> instrs;
+  List<int> _words;
+  BytecodeDisassembler _disassembler;
+
+  NGram(List<int> words, {bool mergePushes = false}) {
+    _disassembler = new BytecodeDisassembler();
+    _words = words;
+    instrs = new List<Instruction>(words.length);
+    for (int i = 0; i < instrs.length; i++) {
+      instrs[i] = _disassembler.decodeInstruction(words[i]);
+    }
+    if (mergePushes) {
+      _mergePushes(instrs);
+    }
+    _canonicalize(instrs);
+  }
+
+  /// Tests if any instructions that are not the last instruction in the window
+  /// are a jump, throw, or call.
+  bool get controlFlowIsNotLast =>
+      instrs.sublist(0, instrs.length - 1).any(isControlFlowInstr);
+
+  @override
+  int get hashCode => listHashCode(instrs);
+
+  @override
+  bool operator ==(other) =>
+      (other is NGram) && listEquals(instrs, other.instrs);
+
+  @override
+  String toString() {
+    StringBuffer out = new StringBuffer();
+    for (var instr in instrs) {
+      _disassembler.writeInstruction(out, 0, instr);
+    }
+    return out.toString();
+  }
+
+  /// Rewrites all Push-like instructions as 'Push r0'.
+  static void _mergePushes(List<Instruction> instrs) {
+    for (int i = 0; i < instrs.length; i++) {
+      if (isPush(instrs[i].opcode)) {
+        instrs[i] = new Instruction(Opcode.kPush, <int>[0]);
+      }
+    }
+  }
+
+  /// Rewrites the operands of instructions so that ngrams that differ only in
+  /// operands can be considered the same.
+  ///
+  /// Each type of operand is considered to come from a different space, and
+  /// each operand is re-indexed in that space starting from 0 such that each
+  /// distinct operand before canonicalization remains distinct afterwords. E.g.
+  ///
+  /// Push r3
+  /// Push r3
+  /// Push r4
+  ///
+  /// Becomes
+  ///
+  /// Push r0
+  /// Push r0
+  /// Push r1
+  static void _canonicalize(List<Instruction> instrs) {
+    Map<Operand, Map<int, int>> operandMaps = <Operand, Map<int, int>>{
+      // No mapping for Operand.none.
+      Operand.imm: <int, int>{},
+      Operand.lit: <int, int>{},
+      Operand.reg: <int, int>{},
+      Operand.xeg: <int, int>{},
+      Operand.tgt: <int, int>{},
+      // No mapping for Operand.spe.
+    };
+    for (Instruction instr in instrs) {
+      Format fmt = BytecodeFormats[instr.opcode];
+      for (int i = 0; i < instr.operands.length; i++) {
+        Operand op = fmt.operands[i];
+        if (!operandMaps.containsKey(op)) {
+          continue;
+        }
+        int newOperand = operandMaps[op]
+            .putIfAbsent(instr.operands[i], () => operandMaps[op].length);
+        instr.operands[i] = newOperand;
+      }
+    }
+  }
+}
+
+class NGramReader {
+  Uint32List _words;
+
+  Map<NGram, int> _ngramCounts = <NGram, int>{};
+
+  NGramReader(String traceFilename) {
+    File traceFile = File(traceFilename);
+    Uint8List data = traceFile.readAsBytesSync();
+    _words = Uint32List.view(data.buffer);
+  }
+
+  Map<NGram, int> get ngramCounts => _ngramCounts;
+
+  void readAllNGrams(int windowSize,
+      {bool basicBlocks: true, bool mergePushes: false}) {
+    int offset = 0;
+    while (offset + windowSize < _words.length) {
+      Uint32List window = _words.sublist(offset, offset + windowSize);
+      offset += 1;
+      NGram ngram = new NGram(window, mergePushes: mergePushes);
+      if (basicBlocks && ngram.controlFlowIsNotLast) {
+        continue;
+      }
+      _ngramCounts.update(ngram, (count) => count + 1, ifAbsent: () => 1);
+    }
+  }
+
+  void writeNGramStats(String outputFilename,
+      {bool sort = true, int minCount = 1000}) {
+    File outputFile = new File(outputFilename);
+    IOSink file = outputFile.openWrite();
+    List<MapEntry<NGram, int>> entries =
+        _ngramCounts.entries.where((e) => e.value > minCount).toList();
+    if (sort) {
+      entries.sort((e1, e2) => e2.value - e1.value);
+    }
+    entries.forEach((e) {
+      file.write("count: ${e.value}\n${e.key}\n");
+    });
+    file.close();
+  }
+}
diff --git a/pkg/vm/lib/bytecode/nullability_detector.dart b/pkg/vm/lib/bytecode/nullability_detector.dart
new file mode 100644
index 0000000..961dfef
--- /dev/null
+++ b/pkg/vm/lib/bytecode/nullability_detector.dart
@@ -0,0 +1,132 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.bytecode.nullability_detector;
+
+import 'package:kernel/ast.dart';
+import 'dbc.dart';
+import 'recognized_methods.dart' show RecognizedMethods;
+
+class NullabilityDetector {
+  final _IsNullableVisitor _isNullableVisitor;
+
+  NullabilityDetector(RecognizedMethods recognizedMethods)
+      : _isNullableVisitor = new _IsNullableVisitor(recognizedMethods);
+
+  bool isNullable(Expression expr) => expr.accept(_isNullableVisitor);
+}
+
+class _IsNullableVisitor extends ExpressionVisitor<bool> {
+  final RecognizedMethods recognizedMethods;
+
+  _IsNullableVisitor(this.recognizedMethods);
+
+  @override
+  bool defaultExpression(Expression node) => true;
+
+  @override
+  bool visitNullLiteral(NullLiteral node) => true;
+
+  // All basic literals except NullLiteral are non-nullable.
+  @override
+  bool defaultBasicLiteral(BasicLiteral node) => false;
+
+  @override
+  bool visitVariableGet(VariableGet node) {
+    final v = node.variable;
+    if ((v.isConst || v.isFinal) && v.initializer != null) {
+      return v.initializer.accept(this);
+    }
+    return true;
+  }
+
+  @override
+  bool visitVariableSet(VariableSet node) => node.value.accept(this);
+
+  @override
+  bool visitMethodInvocation(MethodInvocation node) {
+    final Opcode opcode = recognizedMethods.specializedBytecodeFor(node);
+    if (opcode != null) {
+      return !_nonNullableBytecodeInstructions.contains(opcode);
+    }
+    return true;
+  }
+
+  @override
+  bool visitConstructorInvocation(ConstructorInvocation node) => false;
+
+  @override
+  bool visitNot(Not node) => false;
+
+  @override
+  bool visitLogicalExpression(LogicalExpression node) => false;
+
+  @override
+  bool visitConditionalExpression(ConditionalExpression node) =>
+      node.then.accept(this) || node.otherwise.accept(this);
+
+  @override
+  bool visitStringConcatenation(StringConcatenation node) => false;
+
+  @override
+  bool visitIsExpression(IsExpression node) => false;
+
+  @override
+  bool visitAsExpression(AsExpression node) => node.operand.accept(this);
+
+  @override
+  bool visitSymbolLiteral(SymbolLiteral node) => false;
+
+  @override
+  bool visitTypeLiteral(TypeLiteral node) => false;
+
+  @override
+  bool visitThisExpression(ThisExpression node) => false;
+
+  @override
+  bool visitRethrow(Rethrow node) => false;
+
+  @override
+  bool visitThrow(Throw node) => false;
+
+  @override
+  bool visitListLiteral(ListLiteral node) => false;
+
+  @override
+  bool visitMapLiteral(MapLiteral node) => false;
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) => false;
+
+  @override
+  bool visitConstantExpression(ConstantExpression node) =>
+      node.constant is NullConstant;
+
+  @override
+  bool visitLet(Let node) => node.body.accept(this);
+
+  @override
+  bool visitInstantiation(Instantiation node) => false;
+}
+
+final _nonNullableBytecodeInstructions = new Set<Opcode>.from([
+  Opcode.kBooleanNegateTOS,
+  Opcode.kEqualsNull,
+  Opcode.kNegateInt,
+  Opcode.kAddInt,
+  Opcode.kSubInt,
+  Opcode.kMulInt,
+  Opcode.kTruncDivInt,
+  Opcode.kModInt,
+  Opcode.kBitAndInt,
+  Opcode.kBitOrInt,
+  Opcode.kBitXorInt,
+  Opcode.kShlInt,
+  Opcode.kShrInt,
+  Opcode.kCompareIntEq,
+  Opcode.kCompareIntGt,
+  Opcode.kCompareIntLt,
+  Opcode.kCompareIntGe,
+  Opcode.kCompareIntLe,
+]);
diff --git a/pkg/vm/lib/bytecode/object_table.dart b/pkg/vm/lib/bytecode/object_table.dart
new file mode 100644
index 0000000..4b17c60
--- /dev/null
+++ b/pkg/vm/lib/bytecode/object_table.dart
@@ -0,0 +1,1214 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.bytecode.object_table;
+
+import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import 'bytecode_serialization.dart'
+    show
+        BufferedWriter,
+        BufferedReader,
+        BytecodeObject,
+        ObjectReader,
+        ObjectWriter,
+        StringWriter;
+
+/*
+
+Bytecode object table is encoded in the following way
+(using notation from pkg/kernel/binary.md):
+
+type ObjectTable {
+  UInt numEntries;
+  UInt contentsSize;
+
+  //  Occupies contentsSize bytes.
+  ObjectContents objects[numEntries]
+
+  UInt objectOffsets[numEntries]
+}
+
+// Either reference to an object in object table, or object contents
+// written inline.
+PackedObject = ObjectReference | ObjectContents
+
+type ObjectReference {
+  // Bit 0 (reference bit): 1
+  // Bits 1+: index in object table
+  UInt reference(<index>1)
+}
+
+type ObjectContents {
+  // Bit 0 (reference bit): 0
+  // Bits 1-4: object kind
+  // Bits 5+ object flags
+  UInt header(<flags><kind>0)
+}
+
+// Reference to a string in string table.
+type PackedString {
+  // Bit 0: set for two byte string
+  // Bits 1+: index in string table
+  UInt indexAndKind(<index><kind>)
+}
+
+// Invalid object table entry (at index 0).
+type InvalidObject extends ObjectContents {
+  kind = 0;
+}
+
+type Library extends ObjectContents {
+  kind = 1;
+  PackedString importUri;
+}
+
+type Class extends ObjectContents {
+  kind = 2;
+  PackedObject library;
+  // Empty name is used for artificial class containing top-level
+  // members of a library.
+  PackedObject name;
+}
+
+type Member extends ObjectContents {
+  kind = 3;
+  flags = (isField, isConstructor);
+  PackedObject class;
+  PackedObject name;
+}
+
+type Closure extends ObjectContents {
+  kind = 4;
+  PackedObject enclosingMember;
+  UInt closureIndex;
+}
+
+type SimpleType extends ObjectContents {
+  kind = 5;
+  flags = (isDynamic, isVoid);
+  PackedObject class;
+}
+
+type TypeParameter extends ObjectContents {
+  kind = 6;
+  // Class, Member or Closure declaring this type parameter.
+  // Invalid if declared by function type.
+  PackedObject parent;
+  UInt indexInParent;
+}
+
+type GenericType extends ObjectContents {
+  kind = 7;
+  PackedObject class;
+  List<PackedObject> typeArgs;
+}
+
+type FunctionType extends ObjectContents {
+  kind = 8;
+  flags = (hasOptionalPositionalParams, hasOptionalNamedParams, hasTypeParams)
+
+  if hasTypeParams
+    UInt numTypeParameters
+    PackedObject[numTypeParameters] typeParameterNames
+    PackedObject[numTypeParameters] typeParameterBounds
+
+  UInt numParameters
+
+  if hasOptionalPositionalParams || hasOptionalNamedParams
+    UInt numRequiredParameters
+
+   Type[] positionalParameters
+   NameAndType[] namedParameters
+   PackedObject returnType
+}
+
+type NameAndType {
+  PackedObject name;
+  PackedObject type;
+}
+
+type Name extends ObjectContents {
+  kind = 9;
+
+  // Invalid for public names
+  PackedObject library;
+
+  // Getters are prefixed with 'get:'.
+  // Setters are prefixed with 'set:'.
+  PackedString string;
+}
+
+*/
+
+enum ObjectKind {
+  kInvalid,
+  kLibrary,
+  kClass,
+  kMember,
+  kClosure,
+  kSimpleType,
+  kTypeParameter,
+  kGenericType,
+  kFunctionType,
+  kName,
+}
+
+String objectKindToString(ObjectKind kind) =>
+    kind.toString().substring('ObjectKind.k'.length);
+
+/// Represents object (library, class, member, closure, type or name) in the
+/// object table.
+abstract class ObjectHandle extends BytecodeObject {
+  static const int referenceBit = 1 << 0;
+  static const int indexShift = 1;
+  static const int inlineObject = -1;
+
+  static const int kindShift = 1;
+  static const int kindMask = 0x0F;
+
+  static const int flagBit0 = 1 << 5;
+  static const int flagBit1 = 1 << 6;
+  static const int flagBit2 = 1 << 7;
+  static const int flagsMask = flagBit0 | flagBit1 | flagBit2;
+
+  static int _makeReference(int index) => (index << indexShift) | referenceBit;
+
+  static int _getIndexFromReference(int reference) {
+    assert((reference & referenceBit) != 0);
+    return reference >> indexShift;
+  }
+
+  static int _makeHeader(ObjectKind kind, int flags) {
+    assert((kind.index & kindMask) == kind.index);
+    assert((flags & flagsMask) == flags);
+    return (kind.index << kindShift) | flags;
+  }
+
+  static ObjectKind _getKindFromHeader(int header) {
+    assert((header & referenceBit) == 0);
+    return ObjectKind.values[(header >> kindShift) & kindMask];
+  }
+
+  static int _getFlagsFromHeader(int header) {
+    assert((header & referenceBit) == 0);
+    return header & flagsMask;
+  }
+
+  int _useCount = 0;
+  int _reference;
+
+  ObjectHandle();
+
+  ObjectKind get kind;
+
+  int get flags => 0;
+  set flags(int value) {}
+
+  bool get isCacheable => true;
+
+  factory ObjectHandle._empty(ObjectKind kind) {
+    switch (kind) {
+      case ObjectKind.kInvalid:
+        return new _InvalidHandle();
+      case ObjectKind.kLibrary:
+        return new _LibraryHandle._empty();
+      case ObjectKind.kClass:
+        return new _ClassHandle._empty();
+      case ObjectKind.kMember:
+        return new _MemberHandle._empty();
+      case ObjectKind.kClosure:
+        return new _ClosureHandle._empty();
+      case ObjectKind.kSimpleType:
+        return new _SimpleTypeHandle._empty();
+      case ObjectKind.kGenericType:
+        return new _GenericTypeHandle._empty();
+      case ObjectKind.kTypeParameter:
+        return new _TypeParameterHandle._empty();
+      case ObjectKind.kFunctionType:
+        return new _FunctionTypeHandle._empty();
+      case ObjectKind.kName:
+        return new _NameHandle._empty();
+    }
+    throw 'Unexpected object kind $kind';
+  }
+
+  void _write(BufferedWriter writer) {
+    int header = _makeHeader(kind, flags);
+    assert((header & referenceBit) == 0);
+    writer.writePackedUInt30(header);
+    writeContents(writer);
+  }
+
+  void writeContents(BufferedWriter writer);
+
+  factory ObjectHandle._read(BufferedReader reader, int header) {
+    assert((header & referenceBit) == 0);
+    final ObjectKind kind = _getKindFromHeader(header);
+    final obj = new ObjectHandle._empty(kind);
+    obj.flags = _getFlagsFromHeader(header);
+    obj.readContents(reader);
+    return obj;
+  }
+
+  void readContents(BufferedReader reader);
+
+  void accountUsesForObjectCopies(int numCopies) {}
+
+  void indexStrings(StringWriter strings) {}
+}
+
+class _InvalidHandle extends ObjectHandle {
+  _InvalidHandle();
+
+  @override
+  ObjectKind get kind => ObjectKind.kInvalid;
+
+  @override
+  void writeContents(BufferedWriter writer) {}
+
+  @override
+  void readContents(BufferedReader reader) {}
+
+  @override
+  String toString() => 'Invalid';
+}
+
+class _LibraryHandle extends ObjectHandle {
+  String uri;
+
+  _LibraryHandle._empty();
+
+  _LibraryHandle(this.uri);
+
+  @override
+  ObjectKind get kind => ObjectKind.kLibrary;
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedStringReference(uri);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    uri = reader.readPackedStringReference();
+  }
+
+  @override
+  void indexStrings(StringWriter strings) {
+    strings.put(uri);
+  }
+
+  @override
+  int get hashCode => uri.hashCode + 11;
+
+  @override
+  bool operator ==(other) => other is _LibraryHandle && this.uri == other.uri;
+
+  @override
+  String toString() => uri;
+}
+
+class _ClassHandle extends ObjectHandle {
+  /// Name of artificial class containing top-level members of a library.
+  static const String topLevelClassName = '';
+
+  _LibraryHandle library;
+  _NameHandle name;
+
+  _ClassHandle._empty();
+
+  _ClassHandle(this.library, this.name);
+
+  @override
+  ObjectKind get kind => ObjectKind.kClass;
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedObject(library);
+    writer.writePackedObject(name);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    library = reader.readPackedObject();
+    name = reader.readPackedObject();
+  }
+
+  @override
+  void accountUsesForObjectCopies(int numCopies) {
+    library._useCount += numCopies;
+    name._useCount += numCopies;
+  }
+
+  @override
+  int get hashCode => _combineHashes(library.hashCode, name.hashCode);
+
+  @override
+  bool operator ==(other) =>
+      other is _ClassHandle &&
+      this.library == other.library &&
+      this.name == other.name;
+
+  @override
+  String toString() =>
+      name.name == topLevelClassName ? '$library' : '$library::$name';
+}
+
+class _MemberHandle extends ObjectHandle {
+  static const int flagIsField = ObjectHandle.flagBit0;
+  static const int flagIsConstructor = ObjectHandle.flagBit1;
+
+  int _flags = 0;
+  _ClassHandle parent;
+  _NameHandle name;
+
+  _MemberHandle._empty();
+  _MemberHandle(this.parent, this.name, bool isField, bool isConstructor) {
+    if (isField) {
+      _flags |= flagIsField;
+    }
+    if (isConstructor) {
+      _flags |= flagIsConstructor;
+    }
+  }
+
+  @override
+  ObjectKind get kind => ObjectKind.kMember;
+
+  @override
+  int get flags => _flags;
+
+  @override
+  set flags(int value) {
+    _flags = value;
+  }
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedObject(parent);
+    writer.writePackedObject(name);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    parent = reader.readPackedObject();
+    name = reader.readPackedObject();
+  }
+
+  @override
+  void accountUsesForObjectCopies(int numCopies) {
+    parent._useCount += numCopies;
+    name._useCount += numCopies;
+  }
+
+  @override
+  int get hashCode => _combineHashes(parent.hashCode, name.hashCode);
+
+  @override
+  bool operator ==(other) =>
+      other is _MemberHandle &&
+      this.parent == other.parent &&
+      this.name == other.name &&
+      this.flags == other.flags;
+
+  @override
+  String toString() =>
+      '$parent::$name' +
+      (flags & flagIsField != 0 ? ' (field)' : '') +
+      (flags & flagIsConstructor != 0 ? ' (constructor)' : '');
+}
+
+class _ClosureHandle extends ObjectHandle {
+  _MemberHandle enclosingMember;
+  int closureIndex;
+
+  _ClosureHandle._empty();
+
+  _ClosureHandle(this.enclosingMember, this.closureIndex) {
+    assert(closureIndex >= 0);
+  }
+
+  @override
+  ObjectKind get kind => ObjectKind.kClosure;
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedObject(enclosingMember);
+    writer.writePackedUInt30(closureIndex);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    enclosingMember = reader.readPackedObject();
+    closureIndex = reader.readPackedUInt30();
+  }
+
+  @override
+  void accountUsesForObjectCopies(int numCopies) {
+    enclosingMember._useCount += numCopies;
+  }
+
+  @override
+  int get hashCode => _combineHashes(enclosingMember.hashCode, closureIndex);
+
+  @override
+  bool operator ==(other) =>
+      other is _ClosureHandle &&
+      this.enclosingMember == other.enclosingMember &&
+      this.closureIndex == other.closureIndex;
+
+  @override
+  String toString() => '$enclosingMember::Closure/$closureIndex';
+}
+
+abstract class _TypeHandle extends ObjectHandle {}
+
+class _SimpleTypeHandle extends _TypeHandle {
+  static const int flagIsDynamic = ObjectHandle.flagBit0;
+  static const int flagIsVoid = ObjectHandle.flagBit1;
+
+  _ClassHandle class_;
+  int _flags = 0;
+
+  _SimpleTypeHandle._empty();
+
+  _SimpleTypeHandle(this.class_);
+
+  _SimpleTypeHandle._dynamic() : _flags = flagIsDynamic;
+
+  _SimpleTypeHandle._void() : _flags = flagIsVoid;
+
+  @override
+  ObjectKind get kind => ObjectKind.kSimpleType;
+
+  @override
+  int get flags => _flags;
+
+  @override
+  set flags(int value) {
+    _flags = value;
+  }
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedObject(class_);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    class_ = reader.readPackedObject();
+  }
+
+  @override
+  void accountUsesForObjectCopies(int numCopies) {
+    if (class_ != null) {
+      class_._useCount += numCopies;
+    }
+  }
+
+  @override
+  int get hashCode => class_.hashCode + _flags + 11;
+
+  @override
+  bool operator ==(other) =>
+      other is _SimpleTypeHandle &&
+      this.class_ == other.class_ &&
+      this._flags == other._flags;
+
+  @override
+  String toString() {
+    if ((_flags & flagIsDynamic) != 0) return 'dynamic';
+    if ((_flags & flagIsVoid) != 0) return 'void';
+    return '$class_';
+  }
+}
+
+class _TypeParameterHandle extends _TypeHandle {
+  ObjectHandle parent;
+  int indexInParent;
+
+  _TypeParameterHandle._empty();
+
+  _TypeParameterHandle(this.parent, this.indexInParent) {
+    assert(parent is _ClassHandle ||
+        parent is _MemberHandle ||
+        parent is _ClosureHandle ||
+        parent == null);
+    assert(indexInParent >= 0);
+  }
+
+  @override
+  ObjectKind get kind => ObjectKind.kTypeParameter;
+
+  @override
+  bool get isCacheable => (parent != null);
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedObject(parent);
+    writer.writePackedUInt30(indexInParent);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    parent = reader.readPackedObject();
+    indexInParent = reader.readPackedUInt30();
+  }
+
+  @override
+  void accountUsesForObjectCopies(int numCopies) {
+    if (parent != null) {
+      parent._useCount += numCopies;
+    }
+  }
+
+  @override
+  int get hashCode => _combineHashes(parent.hashCode, indexInParent);
+
+  @override
+  bool operator ==(other) =>
+      other is _TypeParameterHandle &&
+      this.parent == other.parent &&
+      this.indexInParent == other.indexInParent;
+
+  @override
+  String toString() => '$parent::TypeParam/$indexInParent';
+}
+
+class _GenericTypeHandle extends _TypeHandle {
+  _ClassHandle class_;
+  List<_TypeHandle> typeArgs;
+
+  _GenericTypeHandle._empty();
+
+  _GenericTypeHandle(this.class_, this.typeArgs);
+
+  @override
+  ObjectKind get kind => ObjectKind.kGenericType;
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedObject(class_);
+    writer.writePackedList(typeArgs);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    class_ = reader.readPackedObject();
+    typeArgs = reader.readPackedList<_TypeHandle>();
+  }
+
+  @override
+  void accountUsesForObjectCopies(int numCopies) {
+    class_._useCount += numCopies;
+    typeArgs.forEach((t) {
+      t._useCount += numCopies;
+    });
+  }
+
+  @override
+  int get hashCode => _combineHashes(class_.hashCode, listHashCode(typeArgs));
+
+  @override
+  bool operator ==(other) =>
+      other is _GenericTypeHandle &&
+      this.class_ == other.class_ &&
+      listEquals(this.typeArgs, other.typeArgs);
+
+  @override
+  String toString() => '$class_ < ${typeArgs.join(', ')} >';
+}
+
+class NameAndType {
+  _NameHandle name;
+  _TypeHandle type;
+
+  NameAndType(this.name, this.type);
+
+  @override
+  int get hashCode => _combineHashes(name.hashCode, type.hashCode);
+
+  @override
+  bool operator ==(other) =>
+      other is NameAndType &&
+      this.name == other.name &&
+      this.type == other.type;
+
+  @override
+  String toString() => '$type $name';
+}
+
+class _FunctionTypeHandle extends _TypeHandle {
+  static const int flagHasOptionalPositionalParams = ObjectHandle.flagBit0;
+  static const int flagHasOptionalNamedParams = ObjectHandle.flagBit1;
+  static const int flagHasTypeParams = ObjectHandle.flagBit2;
+
+  int _flags = 0;
+  List<NameAndType> typeParams;
+  int numRequiredParams;
+  List<_TypeHandle> positionalParams;
+  List<NameAndType> namedParams;
+  _TypeHandle returnType;
+
+  _FunctionTypeHandle._empty();
+
+  _FunctionTypeHandle(this.typeParams, this.numRequiredParams,
+      this.positionalParams, this.namedParams, this.returnType) {
+    assert(numRequiredParams <= positionalParams.length + namedParams.length);
+    if (numRequiredParams < positionalParams.length) {
+      assert(namedParams.isEmpty);
+      _flags |= flagHasOptionalPositionalParams;
+    }
+    if (namedParams.isNotEmpty) {
+      assert(numRequiredParams == positionalParams.length);
+      _flags |= flagHasOptionalNamedParams;
+    }
+    if (typeParams.isNotEmpty) {
+      _flags |= flagHasTypeParams;
+    }
+  }
+
+  @override
+  int get flags => _flags;
+
+  @override
+  set flags(int value) {
+    _flags = value;
+  }
+
+  ObjectKind get kind => ObjectKind.kFunctionType;
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    if ((_flags & flagHasTypeParams) != 0) {
+      writer.writePackedUInt30(typeParams.length);
+      for (var tp in typeParams) {
+        writer.writePackedObject(tp.name);
+      }
+      for (var tp in typeParams) {
+        writer.writePackedObject(tp.type);
+      }
+    }
+    writer.writePackedUInt30(positionalParams.length + namedParams.length);
+    if (_flags &
+            (flagHasOptionalPositionalParams | flagHasOptionalNamedParams) !=
+        0) {
+      writer.writePackedUInt30(numRequiredParams);
+    }
+    for (var param in positionalParams) {
+      writer.writePackedObject(param);
+    }
+    for (var param in namedParams) {
+      writer.writePackedObject(param.name);
+      writer.writePackedObject(param.type);
+    }
+    writer.writePackedObject(returnType);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    if ((_flags & flagHasTypeParams) != 0) {
+      final int numTypeParams = reader.readPackedUInt30();
+      List<_NameHandle> names = new List<_NameHandle>.generate(
+          numTypeParams, (_) => reader.readPackedObject());
+      List<_TypeHandle> bounds = new List<_TypeHandle>.generate(
+          numTypeParams, (_) => reader.readPackedObject());
+      typeParams = new List<NameAndType>.generate(
+          numTypeParams, (int i) => new NameAndType(names[i], bounds[i]));
+    } else {
+      typeParams = const <NameAndType>[];
+    }
+    final int numParams = reader.readPackedUInt30();
+    numRequiredParams = numParams;
+    if ((_flags &
+            (flagHasOptionalPositionalParams | flagHasOptionalNamedParams)) !=
+        0) {
+      numRequiredParams = reader.readPackedUInt30();
+    }
+    final bool hasNamedParams = (_flags & flagHasOptionalNamedParams) != 0;
+    positionalParams = new List<_TypeHandle>.generate(
+        hasNamedParams ? numRequiredParams : numParams,
+        (_) => reader.readPackedObject());
+    if (hasNamedParams) {
+      namedParams = new List<NameAndType>.generate(
+          reader.readPackedUInt30(),
+          (_) => new NameAndType(
+              reader.readPackedObject(), reader.readPackedObject()));
+    } else {
+      namedParams = const <NameAndType>[];
+    }
+    returnType = reader.readPackedObject();
+  }
+
+  @override
+  void accountUsesForObjectCopies(int numCopies) {
+    positionalParams.forEach((p) {
+      p._useCount += numCopies;
+    });
+    namedParams.forEach((p) {
+      p.name._useCount += numCopies;
+      p.type._useCount += numCopies;
+    });
+  }
+
+  @override
+  int get hashCode {
+    int hash = listHashCode(typeParams);
+    hash = _combineHashes(hash, numRequiredParams);
+    hash = _combineHashes(hash, listHashCode(positionalParams));
+    hash = _combineHashes(hash, listHashCode(namedParams));
+    hash = _combineHashes(hash, returnType.hashCode);
+    return hash;
+  }
+
+  @override
+  bool operator ==(other) =>
+      other is _FunctionTypeHandle &&
+      listEquals(this.typeParams, other.typeParams) &&
+      this.numRequiredParams == other.numRequiredParams &&
+      listEquals(this.positionalParams, other.positionalParams) &&
+      listEquals(this.namedParams, other.namedParams) &&
+      this.returnType == other.returnType;
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('FunctionType');
+    if (typeParams.isNotEmpty) {
+      sb.write(' <${typeParams.join(', ')}>');
+    }
+    sb.write(' (');
+    sb.write(positionalParams.sublist(0, numRequiredParams).join(', '));
+    if (numRequiredParams != positionalParams.length) {
+      if (numRequiredParams > 0) {
+        sb.write(', ');
+      }
+      sb.write('[ ${positionalParams.sublist(numRequiredParams).join(', ')} ]');
+    }
+    if (namedParams.isNotEmpty) {
+      if (numRequiredParams > 0) {
+        sb.write(', ');
+      }
+      sb.write('{ ${namedParams.join(', ')} }');
+    }
+    sb.write(') -> ');
+    sb.write(returnType);
+    return sb.toString();
+  }
+}
+
+class _NameHandle extends ObjectHandle {
+  _LibraryHandle library;
+  String name;
+
+  _NameHandle._empty();
+
+  _NameHandle(this.library, this.name);
+
+  @override
+  ObjectKind get kind => ObjectKind.kName;
+
+  @override
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedObject(library);
+    writer.writePackedStringReference(name);
+  }
+
+  @override
+  void readContents(BufferedReader reader) {
+    library = reader.readPackedObject();
+    name = reader.readPackedStringReference();
+  }
+
+  @override
+  void accountUsesForObjectCopies(int numCopies) {
+    if (library != null) {
+      library._useCount += numCopies;
+    }
+  }
+
+  @override
+  void indexStrings(StringWriter strings) {
+    strings.put(name);
+  }
+
+  @override
+  int get hashCode => _combineHashes(name.hashCode, library.hashCode);
+
+  @override
+  bool operator ==(other) =>
+      other is _NameHandle &&
+      this.name == other.name &&
+      this.library == other.library;
+
+  @override
+  String toString() => name.isEmpty ? "''" : name;
+}
+
+class ObjectTable implements ObjectWriter, ObjectReader {
+  /// Object is added to an index table if it is used more than this
+  /// number of times.
+  static const int indexTableUseCountThreshold = 3;
+
+  final List<ObjectHandle> _objects = new List<ObjectHandle>();
+  final Map<ObjectHandle, ObjectHandle> _canonicalizationCache =
+      <ObjectHandle, ObjectHandle>{};
+  final Map<Node, ObjectHandle> _nodeCache = <Node, ObjectHandle>{};
+  List<ObjectHandle> _indexTable;
+  _TypeHandle _dynamicType;
+  _TypeHandle _voidType;
+  CoreTypes coreTypes;
+  _NodeVisitor _nodeVisitor;
+
+  ObjectTable() {
+    _dynamicType = getOrAddObject(new _SimpleTypeHandle._dynamic());
+    _voidType = getOrAddObject(new _SimpleTypeHandle._void());
+    _nodeVisitor = new _NodeVisitor(this);
+  }
+
+  ObjectHandle getHandle(Node node) {
+    if (node == null) {
+      return null;
+    }
+    ObjectHandle handle = _nodeCache[node];
+    if (handle == null) {
+      handle = node.accept(_nodeVisitor);
+      _nodeCache[node] = handle;
+    } else {
+      ++handle._useCount;
+    }
+    return handle;
+  }
+
+  List<ObjectHandle> getHandles(List<Node> nodes) =>
+      nodes.map((n) => getHandle(n)).toList();
+
+  String mangleGetterName(String name) => 'get:$name';
+
+  String mangleSetterName(String name) => 'set:$name';
+
+  String mangleSelectorName(String name, bool isGetter, bool isSetter) {
+    if (isGetter) {
+      return mangleGetterName(name);
+    } else if (isSetter) {
+      return mangleSetterName(name);
+    } else {
+      return name;
+    }
+  }
+
+  String mangleMemberName(Member member, bool isGetter, bool isSetter) {
+    final name = member.name.name;
+    if (isGetter || (member is Procedure && member.isGetter)) {
+      return mangleGetterName(name);
+    }
+    if (isSetter || (member is Procedure && member.isSetter)) {
+      return mangleSetterName(name);
+    }
+    return name;
+  }
+
+  ObjectHandle getNameHandle(Library library, String name) {
+    final libraryHandle = library != null ? getHandle(library) : null;
+    return getOrAddObject(new _NameHandle(libraryHandle, name));
+  }
+
+  ObjectHandle getSelectorNameHandle(Name name,
+      {bool isGetter: false, bool isSetter: false}) {
+    return getNameHandle(
+        name.library, mangleSelectorName(name.name, isGetter, isSetter));
+  }
+
+  ObjectHandle getMemberHandle(Member member,
+      {bool isGetter: false, bool isSetter: false}) {
+    final parent = member.parent;
+    ObjectHandle classHandle;
+    if (parent is Class) {
+      classHandle = getHandle(parent);
+    } else if (parent is Library) {
+      final library = getHandle(parent);
+      final name = getNameHandle(null, _ClassHandle.topLevelClassName);
+      classHandle = getOrAddObject(new _ClassHandle(library, name));
+    } else {
+      throw "Unexpected Member's parent ${parent.runtimeType} $parent";
+    }
+    if (member is Constructor || member is Procedure && member.isFactory) {}
+    final nameHandle = getNameHandle(
+        member.name.library, mangleMemberName(member, isGetter, isSetter));
+    bool isField = member is Field && !isGetter && !isSetter;
+    bool isConstructor =
+        member is Constructor || (member is Procedure && member.isFactory);
+    return getOrAddObject(
+        new _MemberHandle(classHandle, nameHandle, isField, isConstructor));
+  }
+
+  void declareClosure(
+      FunctionNode function, Member enclosingMember, int closureIndex) {
+    final handle = getOrAddObject(
+        new _ClosureHandle(getHandle(enclosingMember), closureIndex));
+    _nodeCache[function] = handle;
+  }
+
+  ObjectHandle getOrAddObject(ObjectHandle obj) {
+    assert(obj._useCount == 0);
+    ObjectHandle canonical = _canonicalizationCache.putIfAbsent(obj, () {
+      assert(_indexTable == null);
+      _objects.add(obj);
+      return obj;
+    });
+    ++canonical._useCount;
+    return canonical;
+  }
+
+  void allocateIndexTable() {
+    int tableSize = 1; // Reserve invalid entry.
+    for (var obj in _objects.reversed) {
+      assert(obj._reference == null);
+      if (obj._useCount >= indexTableUseCountThreshold && obj.isCacheable) {
+        // This object will be included into index table.
+        ++tableSize;
+      } else {
+        // This object will be copied and written inline. Bump use count for
+        // objects referenced from this one for each copy after the first.
+        obj._reference = ObjectHandle.inlineObject;
+        obj.accountUsesForObjectCopies(obj._useCount - 1);
+      }
+    }
+    _indexTable = new List<ObjectHandle>(tableSize);
+    int count = 0;
+    _indexTable[count++] = new _InvalidHandle()
+      .._reference = ObjectHandle._makeReference(0);
+    for (var obj in _objects) {
+      if (obj._reference == null) {
+        obj._reference = ObjectHandle._makeReference(count);
+        _indexTable[count++] = obj;
+      } else {
+        assert(obj._reference == ObjectHandle.inlineObject);
+      }
+    }
+    assert(count == tableSize);
+  }
+
+  @override
+  void writeObject(BytecodeObject object, BufferedWriter writer) {
+    ObjectHandle handle = object as ObjectHandle;
+    if (handle == null) {
+      writer.writePackedUInt30(ObjectHandle._makeReference(0));
+      return;
+    }
+    if (handle._reference == ObjectHandle.inlineObject) {
+      handle._write(writer);
+    } else {
+      assert(handle._reference >= 0);
+      assert((handle._reference & ObjectHandle.referenceBit) != 0);
+      writer.writePackedUInt30(handle._reference);
+    }
+  }
+
+  @override
+  BytecodeObject readObject(BufferedReader reader) {
+    final int header = reader.readPackedUInt30();
+    if ((header & ObjectHandle.referenceBit) == 0) {
+      return new ObjectHandle._read(reader, header);
+    } else {
+      final int index = ObjectHandle._getIndexFromReference(header);
+      return (index == 0) ? null : _indexTable[index];
+    }
+  }
+
+  void write(BufferedWriter writer) {
+    assert(writer.objectWriter == this);
+    assert(_indexTable != null);
+
+    BufferedWriter contentsWriter = new BufferedWriter.fromWriter(writer);
+    List<int> offsets = new List<int>(_indexTable.length);
+
+    for (int i = 0; i < _indexTable.length; ++i) {
+      offsets[i] = contentsWriter.offset;
+      _indexTable[i]._write(contentsWriter);
+    }
+
+    writer.writePackedUInt30(_indexTable.length);
+    writer.writePackedUInt30(contentsWriter.offset);
+    writer.writeBytes(contentsWriter.takeBytes());
+    for (var offs in offsets) {
+      writer.writePackedUInt30(offs);
+    }
+
+    // Index strings in objects which will be written inline
+    // in constant pool entries.
+    for (var obj in _objects) {
+      if (obj._reference == ObjectHandle.inlineObject) {
+        obj.indexStrings(writer.stringWriter);
+      }
+    }
+  }
+
+  ObjectTable.read(BufferedReader reader) {
+    reader.objectReader = this;
+
+    final int numEntries = reader.readPackedUInt30();
+    reader.readPackedUInt30(); // Contents length
+
+    _indexTable = new List<ObjectHandle>(numEntries);
+    for (int i = 0; i < numEntries; ++i) {
+      final int header = reader.readPackedUInt30();
+      _indexTable[i] = new ObjectHandle._read(reader, header)
+        .._reference = ObjectHandle._makeReference(i);
+    }
+    // Skip index table.
+    for (int i = 0; i < numEntries; ++i) {
+      reader.readPackedUInt30();
+    }
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.writeln('ObjectTable {');
+    for (int i = 0; i < _indexTable.length; ++i) {
+      final obj = _indexTable[i];
+      sb.writeln('  [$i] = ${objectKindToString(obj.kind)} $obj');
+    }
+    sb.writeln('}');
+    return sb.toString();
+  }
+}
+
+class _NodeVisitor extends Visitor<ObjectHandle> {
+  final ObjectTable objectTable;
+  final _typeParameters = <TypeParameter, ObjectHandle>{};
+
+  _NodeVisitor(this.objectTable);
+
+  @override
+  ObjectHandle defaultNode(Node node) =>
+      throw 'Unexpected node ${node.runtimeType} $node';
+
+  @override
+  ObjectHandle visitLibrary(Library node) =>
+      objectTable.getOrAddObject(new _LibraryHandle(node.importUri.toString()));
+
+  @override
+  ObjectHandle visitClass(Class node) {
+    final ObjectHandle library = objectTable.getHandle(node.enclosingLibrary);
+    final name = objectTable.getOrAddObject(
+        new _NameHandle(node.name.startsWith('_') ? library : null, node.name));
+    return objectTable.getOrAddObject(new _ClassHandle(library, name));
+  }
+
+  @override
+  ObjectHandle defaultMember(Member node) => objectTable.getMemberHandle(node);
+
+  @override
+  ObjectHandle visitDynamicType(DynamicType node) => objectTable._dynamicType;
+
+  @override
+  ObjectHandle visitVoidType(VoidType node) => objectTable._voidType;
+
+  @override
+  ObjectHandle visitBottomType(BottomType node) =>
+      objectTable.getHandle(objectTable.coreTypes.nullClass.rawType);
+
+  @override
+  ObjectHandle visitInterfaceType(InterfaceType node) {
+    final classHandle = objectTable.getHandle(node.classNode);
+    if (node.typeArguments.isEmpty) {
+      return objectTable.getOrAddObject(new _SimpleTypeHandle(classHandle));
+    }
+    final List<_TypeHandle> typeArgs = node.typeArguments
+        .map((t) => objectTable.getHandle(t) as _TypeHandle)
+        .toList();
+    return objectTable
+        .getOrAddObject(new _GenericTypeHandle(classHandle, typeArgs));
+  }
+
+  @override
+  ObjectHandle visitTypeParameterType(TypeParameterType node) {
+    final param = node.parameter;
+    final handle = _typeParameters[param];
+    if (handle != null) {
+      return handle;
+    }
+
+    final parent = param.parent;
+    if (parent == null) {
+      throw 'Type parameter $param without parent, but not declared by function type';
+    }
+
+    ObjectHandle parentHandle;
+    int indexInParent;
+    if (parent is Class) {
+      parentHandle = objectTable.getHandle(parent);
+      indexInParent = parent.typeParameters.indexOf(param);
+      if (indexInParent < 0) {
+        throw 'Type parameter $param is not found in its parent class $parent';
+      }
+    } else if (parent is FunctionNode) {
+      final funcParent = parent.parent;
+      if (funcParent is Member) {
+        parentHandle = objectTable.getHandle(funcParent);
+      } else if (funcParent is FunctionExpression ||
+          funcParent is FunctionDeclaration) {
+        parentHandle = objectTable.getHandle(parent);
+      } else {
+        throw 'Unexpected parent of FunctionNode: ${funcParent.runtimeType} $funcParent';
+      }
+      indexInParent = parent.typeParameters.indexOf(node.parameter);
+      if (indexInParent < 0) {
+        throw 'Type parameter $param is not found in its parent function $parent';
+      }
+    } else {
+      throw 'Unexpected parent of TypeParameter: ${parent.runtimeType} $parent';
+    }
+    return objectTable
+        .getOrAddObject(new _TypeParameterHandle(parentHandle, indexInParent));
+  }
+
+  @override
+  ObjectHandle visitFunctionType(FunctionType node) {
+    final typeParameters = new List<_TypeParameterHandle>.generate(
+        node.typeParameters.length,
+        (i) => objectTable.getOrAddObject(new _TypeParameterHandle(null, i)));
+    for (int i = 0; i < node.typeParameters.length; ++i) {
+      _typeParameters[node.typeParameters[i]] = typeParameters[i];
+    }
+
+    final positionalParams = new List<_TypeHandle>();
+    for (var param in node.positionalParameters) {
+      positionalParams.add(objectTable.getHandle(param));
+    }
+    final namedParams = new List<NameAndType>();
+    for (var param in node.namedParameters) {
+      namedParams.add(new NameAndType(
+          objectTable.getNameHandle(null, param.name),
+          objectTable.getHandle(param.type)));
+    }
+    final returnType = objectTable.getHandle(node.returnType);
+
+    for (int i = 0; i < node.typeParameters.length; ++i) {
+      _typeParameters.remove(node.typeParameters[i]);
+    }
+
+    return objectTable.getOrAddObject(new _FunctionTypeHandle(
+        node.typeParameters
+            .map((tp) => new NameAndType(
+                objectTable.getNameHandle(null, tp.name),
+                objectTable.getHandle(tp.bound)))
+            .toList(),
+        node.requiredParameterCount,
+        positionalParams,
+        namedParams,
+        returnType));
+  }
+
+  @override
+  ObjectHandle visitTypedefType(TypedefType node) =>
+      objectTable.getHandle(node.unalias);
+}
+
+int _combineHashes(int hash1, int hash2) =>
+    (((hash1 * 31) & 0x3fffffff) + hash2) & 0x3fffffff;
diff --git a/pkg/vm/lib/bytecode/source_positions.dart b/pkg/vm/lib/bytecode/source_positions.dart
new file mode 100644
index 0000000..ce4bc3a
--- /dev/null
+++ b/pkg/vm/lib/bytecode/source_positions.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library vm.bytecode.source_positions;
+
+import 'bytecode_serialization.dart' show BufferedWriter, BufferedReader;
+
+/// Maintains mapping between bytecode instructions and source positions.
+class SourcePositions {
+  final Map<int, int> mapping = <int, int>{}; // PC -> fileOffset
+  int _lastPc = 0;
+  int _lastOffset = 0;
+
+  SourcePositions();
+
+  void add(int pc, int fileOffset) {
+    assert(pc > _lastPc);
+    assert(fileOffset >= 0);
+    if (fileOffset != _lastOffset) {
+      mapping[pc] = fileOffset;
+      _lastPc = pc;
+      _lastOffset = fileOffset;
+    }
+  }
+
+  void writeContents(BufferedWriter writer) {
+    writer.writePackedUInt30(mapping.length);
+    final encodePC = new PackedUInt30DeltaEncoder();
+    final encodeOffset = new SLEB128DeltaEncoder();
+    mapping.forEach((int pc, int fileOffset) {
+      encodePC.write(writer, pc);
+      encodeOffset.write(writer, fileOffset);
+    });
+  }
+
+  void write(BufferedWriter writer) {
+    // TODO(alexmarkov): write source positions in a separate section
+    BufferedWriter contentsWriter = new BufferedWriter.fromWriter(writer);
+    writeContents(contentsWriter);
+
+    final contents = contentsWriter.takeBytes();
+    writer.writePackedUInt30(contents.length);
+    writer.writeBytes(contents);
+  }
+
+  SourcePositions.read(BufferedReader reader) {
+    reader.readPackedUInt30(); // Contents length in bytes.
+    final int length = reader.readPackedUInt30();
+    final decodePC = new PackedUInt30DeltaDecoder();
+    final decodeOffset = new SLEB128DeltaDecoder();
+    for (int i = 0; i < length; ++i) {
+      int pc = decodePC.read(reader);
+      int fileOffset = decodeOffset.read(reader);
+      add(pc, fileOffset);
+    }
+  }
+
+  @override
+  String toString() => mapping.toString();
+
+  Map<int, String> getBytecodeAnnotations() {
+    return mapping.map((int pc, int fileOffset) =>
+        new MapEntry(pc, 'source position $fileOffset'));
+  }
+}
+
+class PackedUInt30DeltaEncoder {
+  int _last = 0;
+
+  void write(BufferedWriter write, int value) {
+    write.writePackedUInt30(value - _last);
+    _last = value;
+  }
+}
+
+class PackedUInt30DeltaDecoder {
+  int _last = 0;
+
+  int read(BufferedReader reader) {
+    int value = reader.readPackedUInt30() + _last;
+    _last = value;
+    return value;
+  }
+}
+
+class SLEB128DeltaEncoder {
+  int _last = 0;
+
+  void write(BufferedWriter writer, int value) {
+    writer.writeSLEB128(value - _last);
+    _last = value;
+  }
+}
+
+class SLEB128DeltaDecoder {
+  int _last = 0;
+
+  int read(BufferedReader reader) {
+    int value = reader.readSLEB128() + _last;
+    _last = value;
+    return value;
+  }
+}
diff --git a/pkg/vm/lib/constants_error_reporter.dart b/pkg/vm/lib/constants_error_reporter.dart
index b736b22..cadbc0e 100644
--- a/pkg/vm/lib/constants_error_reporter.dart
+++ b/pkg/vm/lib/constants_error_reporter.dart
@@ -12,11 +12,11 @@
 import 'package:front_end/src/api_unstable/vm.dart' as codes;
 
 import 'package:kernel/ast.dart'
-    show Constant, DartType, FileUriNode, IntConstant, Procedure, TreeNode;
+    show Constant, DartType, IntConstant, Procedure, TreeNode;
 import 'package:kernel/transformations/constants.dart' as constants;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
-class ForwardConstantEvaluationErrors implements constants.ErrorReporter {
+class ForwardConstantEvaluationErrors extends constants.ErrorReporter {
   // This will get the currently active [CompilerContext] from a zone variable.
   // If there is no active context, this will throw.
   final CompilerContext compilerContext = CompilerContext.current;
@@ -25,19 +25,29 @@
 
   ForwardConstantEvaluationErrors(this.typeEnvironment);
 
-  duplicateKey(List<TreeNode> context, TreeNode node, Constant key) {
+  @override
+  void freeTypeParameter(List<TreeNode> context, TreeNode node, DartType type) {
+    final message =
+        codes.templateConstEvalFreeTypeParameter.withArguments(type);
+    reportIt(context, message, node);
+  }
+
+  @override
+  void duplicateKey(List<TreeNode> context, TreeNode node, Constant key) {
     final message = codes.templateConstEvalDuplicateKey.withArguments(key);
     reportIt(context, message, node);
   }
 
-  invalidDartType(List<TreeNode> context, TreeNode node, Constant receiver,
+  @override
+  void invalidDartType(List<TreeNode> context, TreeNode node, Constant receiver,
       DartType expectedType) {
     final message = codes.templateConstEvalInvalidType.withArguments(
         receiver, expectedType, receiver.getType(typeEnvironment));
     reportIt(context, message, node);
   }
 
-  invalidBinaryOperandType(
+  @override
+  void invalidBinaryOperandType(
       List<TreeNode> context,
       TreeNode node,
       Constant receiver,
@@ -49,48 +59,63 @@
     reportIt(context, message, node);
   }
 
-  invalidMethodInvocation(
+  @override
+  void invalidMethodInvocation(
       List<TreeNode> context, TreeNode node, Constant receiver, String op) {
     final message = codes.templateConstEvalInvalidMethodInvocation
         .withArguments(op, receiver);
     reportIt(context, message, node);
   }
 
-  invalidStaticInvocation(
+  @override
+  void invalidStaticInvocation(
       List<TreeNode> context, TreeNode node, Procedure target) {
     final message = codes.templateConstEvalInvalidStaticInvocation
         .withArguments(target.name.toString());
     reportIt(context, message, node);
   }
 
-  invalidStringInterpolationOperand(
+  @override
+  void invalidStringInterpolationOperand(
       List<TreeNode> context, TreeNode node, Constant constant) {
     final message = codes.templateConstEvalInvalidStringInterpolationOperand
         .withArguments(constant);
     reportIt(context, message, node);
   }
 
-  zeroDivisor(
+  @override
+  void invalidSymbolName(
+      List<TreeNode> context, TreeNode node, Constant constant) {
+    final message =
+        codes.templateConstEvalInvalidSymbolName.withArguments(constant);
+    reportIt(context, message, node);
+  }
+
+  @override
+  void zeroDivisor(
       List<TreeNode> context, TreeNode node, IntConstant receiver, String op) {
     final message = codes.templateConstEvalZeroDivisor
         .withArguments(op, '${receiver.value}');
     reportIt(context, message, node);
   }
 
-  negativeShift(List<TreeNode> context, TreeNode node, IntConstant receiver,
-      String op, IntConstant argument) {
+  @override
+  void negativeShift(List<TreeNode> context, TreeNode node,
+      IntConstant receiver, String op, IntConstant argument) {
     final message = codes.templateConstEvalNegativeShift
         .withArguments(op, '${receiver.value}', '${argument.value}');
     reportIt(context, message, node);
   }
 
-  nonConstLiteral(List<TreeNode> context, TreeNode node, String klass) {
+  @override
+  void nonConstLiteral(List<TreeNode> context, TreeNode node, String klass) {
     final message =
         codes.templateConstEvalNonConstantLiteral.withArguments(klass);
     reportIt(context, message, node);
   }
 
-  failedAssertion(List<TreeNode> context, TreeNode node, String string) {
+  @override
+  void failedAssertion(List<TreeNode> context, TreeNode node, String string) {
     final message = string == null
         ? codes.messageConstEvalFailedAssertion
         : codes.templateConstEvalFailedAssertionWithMessage
@@ -98,20 +123,23 @@
     reportIt(context, message, node);
   }
 
-  nonConstantVariableGet(
+  @override
+  void nonConstantVariableGet(
       List<TreeNode> context, TreeNode node, String variableName) {
     final message = codes.templateConstEvalNonConstantVariableGet
         .withArguments(variableName);
     reportIt(context, message, node);
   }
 
-  deferredLibrary(List<TreeNode> context, TreeNode node, String importName) {
+  @override
+  void deferredLibrary(
+      List<TreeNode> context, TreeNode node, String importName) {
     final message =
         codes.templateConstEvalDeferredLibrary.withArguments(importName);
     reportIt(context, message, node);
   }
 
-  reportIt(List<TreeNode> context, codes.Message message, TreeNode node) {
+  void reportIt(List<TreeNode> context, codes.Message message, TreeNode node) {
     final Uri uri = getFileUri(node);
     final int fileOffset = getFileOffset(node);
 
@@ -129,18 +157,4 @@
     compilerContext.options
         .report(locatedMessage, Severity.error, context: contextMessages);
   }
-
-  getFileUri(TreeNode node) {
-    while (node is! FileUriNode) {
-      node = node.parent;
-    }
-    return (node as FileUriNode).fileUri;
-  }
-
-  getFileOffset(TreeNode node) {
-    while (node?.fileOffset == TreeNode.noOffset) {
-      node = node.parent;
-    }
-    return node == null ? TreeNode.noOffset : node.fileOffset;
-  }
 }
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 7cbbe56..2d4b546 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -9,7 +9,6 @@
 import 'dart:io' hide FileSystemEntity;
 
 import 'package:args/args.dart';
-import 'package:build_integration/file_system/multi_root.dart';
 // front_end/src imports below that require lint `ignore_for_file`
 // are a temporary state of things until frontend team builds better api
 // that would replace api used below. This api was made private in
@@ -21,14 +20,18 @@
 import 'package:kernel/binary/limited_ast_to_binary.dart';
 import 'package:kernel/kernel.dart'
     show Component, loadComponentSourceFromBytes;
-import 'package:kernel/target/targets.dart';
 import 'package:path/path.dart' as path;
 import 'package:usage/uuid/uuid.dart';
 
 import 'package:vm/incremental_compiler.dart' show IncrementalCompiler;
 import 'package:vm/kernel_front_end.dart'
-    show compileToKernel, parseCommandLineDefines;
-import 'package:vm/target/install.dart' show installAdditionalTargets;
+    show
+        compileToKernel,
+        parseCommandLineDefines,
+        convertFileOrUriArgumentToUri,
+        createFrontEndTarget,
+        createFrontEndFileSystem,
+        writeDepfile;
 
 ArgParser argParser = new ArgParser(allowTrailingOptions: true)
   ..addFlag('train',
@@ -45,7 +48,6 @@
       defaultsTo: false)
   // TODO(alexmarkov): Cleanup uses in Flutter and remove these obsolete flags.
   ..addFlag('strong', help: 'Obsolete', defaultsTo: true)
-  ..addFlag('sync-async', help: 'Obsolete', defaultsTo: true)
   ..addFlag('tfa',
       help:
           'Enable global type flow analysis and related transformations in AOT mode.',
@@ -69,7 +71,7 @@
       help: '.packages file to use for compilation', defaultsTo: null)
   ..addOption('target',
       help: 'Target model that determines what core libraries are available',
-      allowed: <String>['vm', 'flutter'],
+      allowed: <String>['vm', 'flutter', 'flutter_runner', 'dart_runner'],
       defaultsTo: 'vm')
   ..addMultiOption('filesystem-root',
       help: 'File path that is used as a root in virtual filesystem used in'
@@ -223,6 +225,7 @@
   bool unsafePackageSerialization;
 
   CompilerOptions _compilerOptions;
+  FileSystem _fileSystem;
   Uri _mainSource;
   ArgResults _options;
 
@@ -248,6 +251,8 @@
     IncrementalCompiler generator,
   }) async {
     _options = options;
+    _fileSystem = createFrontEndFileSystem(
+        options['filesystem-scheme'], options['filesystem-root']);
     setMainSourceFilename(filename);
     _kernelBinaryFilenameFull = _options['output-dill'] ?? '$filename.dill';
     _kernelBinaryFilenameIncremental = _options['output-incremental-dill'] ??
@@ -264,6 +269,7 @@
         options['platform'] ?? 'platform_strong.dill';
     final CompilerOptions compilerOptions = new CompilerOptions()
       ..sdkRoot = sdkRoot
+      ..fileSystem = _fileSystem
       ..packagesFileUri = _getFileOrUri(_options['packages'])
       ..sdkSummary = sdkRoot.resolve(platformKernelDill)
       ..verbose = options['verbose']
@@ -288,14 +294,8 @@
           printDiagnosticMessage(message, _outputStream.writeln);
         }
       };
-    if (options.wasParsed('filesystem-root')) {
-      List<Uri> rootUris = <Uri>[];
-      for (String root in options['filesystem-root']) {
-        rootUris.add(Uri.base.resolveUri(new Uri.file(root)));
-      }
-      compilerOptions.fileSystem = new MultiRootFileSystem(
-          options['filesystem-scheme'], rootUris, compilerOptions.fileSystem);
 
+    if (options.wasParsed('filesystem-root')) {
       if (_options['output-dill'] == null) {
         print('When --filesystem-root is specified it is required to specify'
             ' --output-dill option that points to physical file system location'
@@ -310,11 +310,7 @@
       return false;
     }
 
-    // Ensure that Flutter and VM targets are added to targets dictionary.
-    installAdditionalTargets();
-
-    final TargetFlags targetFlags = new TargetFlags(syncAsync: true);
-    compilerOptions.target = getTarget(options['target'], targetFlags);
+    compilerOptions.target = createFrontEndTarget(options['target']);
     if (compilerOptions.target == null) {
       print('Failed to create front-end target ${options['target']}.');
       return false;
@@ -360,7 +356,8 @@
           .writeln('$boundaryKey $_kernelBinaryFilename ${errors.length}');
       final String depfile = options['depfile'];
       if (depfile != null) {
-        await _writeDepfile(component, _kernelBinaryFilename, depfile);
+        await writeDepfile(compilerOptions.fileSystem, component,
+            _kernelBinaryFilename, depfile);
       }
 
       _kernelBinaryFilename = _kernelBinaryFilenameIncremental;
@@ -614,23 +611,8 @@
     _kernelBinaryFilename = _kernelBinaryFilenameFull;
   }
 
-  Uri _getFileOrUri(String fileOrUri) {
-    if (fileOrUri == null) {
-      return null;
-    }
-    if (_options.wasParsed('filesystem-root')) {
-      // This is a hack.
-      // Only expect uri when filesystem-root option is specified. It has to
-      // be uri for filesystem-root use case because mapping is done on
-      // scheme-basis.
-      // This is so that we don't deal with Windows files paths that can not
-      // be processed as uris.
-      return Uri.base.resolve(fileOrUri);
-    }
-    Uri uri = Uri.parse(fileOrUri);
-    if (uri.scheme == 'package') return uri;
-    return Uri.base.resolveUri(new Uri.file(fileOrUri));
-  }
+  Uri _getFileOrUri(String fileOrUri) =>
+      convertFileOrUriArgumentToUri(_fileSystem, fileOrUri);
 
   IncrementalCompiler _createGenerator(Uri initializeFromDillUri) {
     return new IncrementalCompiler(_compilerOptions, _mainSource,
@@ -666,25 +648,6 @@
   void close() {}
 }
 
-String _escapePath(String path) {
-  return path.replaceAll(r'\', r'\\').replaceAll(r' ', r'\ ');
-}
-
-// https://ninja-build.org/manual.html#_depfile
-_writeDepfile(Component component, String output, String depfile) async {
-  final IOSink file = new File(depfile).openWrite();
-  file.write(_escapePath(output));
-  file.write(':');
-  for (Uri dep in component.uriToSource.keys) {
-    // Skip empty or corelib dependencies.
-    if (dep == null || dep.scheme == 'org-dartlang-sdk') continue;
-    file.write(' ');
-    file.write(_escapePath(dep.toFilePath()));
-  }
-  file.write('\n');
-  await file.close();
-}
-
 class _CompileExpressionRequest {
   String expression;
   // Note that FE will reject a compileExpression command by returning a null
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index 92136c2..e1715745 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -32,6 +32,8 @@
   Uri initializeFromDillUri;
   Uri _entryPoint;
 
+  Uri get entryPoint => _entryPoint;
+
   IncrementalCompiler(this._compilerOptions, this._entryPoint,
       {this.initializeFromDillUri}) {
     _generator = new IncrementalKernelGenerator(
@@ -44,6 +46,7 @@
   /// If [entryPoint] is specified, that points to new entry point for the
   /// compilation. Otherwise, previously set entryPoint is used.
   Future<Component> compile({Uri entryPoint}) async {
+    _entryPoint = entryPoint ?? _entryPoint;
     Component component = await _generator.computeDelta(
         entryPoint: entryPoint, fullComponent: fullComponent);
     initialized = true;
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 03c4a51..2105181 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -6,6 +6,12 @@
 library vm.kernel_front_end;
 
 import 'dart:async';
+import 'dart:io' show File, IOSink, IOException;
+
+import 'package:args/args.dart' show ArgParser, ArgResults;
+
+import 'package:build_integration/file_system/multi_root.dart'
+    show MultiRootFileSystem, MultiRootFileSystemEntity;
 
 import 'package:front_end/src/api_unstable/vm.dart'
     show
@@ -13,22 +19,32 @@
         CompilerOptions,
         DiagnosticMessage,
         DiagnosticMessageHandler,
+        FileSystem,
+        FileSystemEntity,
+        FileSystemException,
         ProcessedOptions,
         Severity,
+        StandardFileSystem,
         getMessageUri,
         kernelForProgram,
         printDiagnosticMessage;
 
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-import 'package:kernel/ast.dart' show Component, Field, StaticGet;
+import 'package:kernel/ast.dart'
+    show Component, Field, Library, Reference, StaticGet;
+import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
+import 'package:kernel/binary/limited_ast_to_binary.dart'
+    show LimitedBinaryPrinter;
 import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
 import 'package:kernel/transformations/constants.dart' as constants;
 import 'package:kernel/vm/constants_native_effects.dart' as vm_constants;
 
 import 'bytecode/gen_bytecode.dart' show generateBytecode;
 
 import 'constants_error_reporter.dart' show ForwardConstantEvaluationErrors;
+import 'target/install.dart' show installAdditionalTargets;
 import 'transformations/devirtualization.dart' as devirtualization
     show transformComponent;
 import 'transformations/mixin_deduplication.dart' as mixin_deduplication
@@ -39,6 +55,183 @@
     show transformComponent;
 import 'transformations/obfuscation_prohibitions_annotator.dart'
     as obfuscationProhibitions;
+import 'transformations/call_site_annotator.dart' as call_site_annotator;
+
+/// Declare options consumed by [runCompiler].
+void declareCompilerOptions(ArgParser args) {
+  args.addOption('platform',
+      help: 'Path to vm_platform_strong.dill file', defaultsTo: null);
+  args.addOption('packages', help: 'Path to .packages file', defaultsTo: null);
+  args.addOption('output',
+      abbr: 'o', help: 'Path to resulting dill file', defaultsTo: null);
+  args.addFlag('aot',
+      help:
+          'Produce kernel file for AOT compilation (enables global transformations).',
+      defaultsTo: false);
+  args.addOption('depfile', help: 'Path to output Ninja depfile');
+  args.addFlag('link-platform',
+      help: 'Include platform into resulting kernel file.', defaultsTo: true);
+  args.addFlag('embed-sources',
+      help: 'Embed source files in the generated kernel component',
+      defaultsTo: true);
+  args.addMultiOption('filesystem-root',
+      help: 'A base path for the multi-root virtual file system.'
+          ' If multi-root file system is used, the input script and .packages file should be specified using URI.');
+  args.addOption('filesystem-scheme',
+      help: 'The URI scheme for the multi-root virtual filesystem.');
+  args.addOption('target',
+      help: 'Target model that determines what core libraries are available',
+      allowed: <String>['vm', 'flutter', 'flutter_runner', 'dart_runner'],
+      defaultsTo: 'vm');
+  args.addFlag('tfa',
+      help:
+          'Enable global type flow analysis and related transformations in AOT mode.',
+      defaultsTo: true);
+  args.addMultiOption('define',
+      abbr: 'D',
+      help: 'The values for the environment constants (e.g. -Dkey=value).');
+  args.addFlag('enable-asserts',
+      help: 'Whether asserts will be enabled.', defaultsTo: false);
+  args.addFlag('enable-constant-evaluation',
+      help: 'Whether kernel constant evaluation will be enabled.',
+      defaultsTo: true);
+  args.addFlag('split-output-by-packages',
+      help:
+          'Split resulting kernel file into multiple files (one per package).',
+      defaultsTo: false);
+  args.addFlag('gen-bytecode', help: 'Generate bytecode', defaultsTo: false);
+  args.addFlag('emit-bytecode-source-positions',
+      help: 'Emit source positions in bytecode', defaultsTo: false);
+  args.addFlag('drop-ast',
+      help: 'Drop AST for members with bytecode', defaultsTo: false);
+  args.addFlag('use-future-bytecode-format',
+      help: 'Generate bytecode in the bleeding edge format', defaultsTo: false);
+}
+
+/// Create ArgParser and populate it with options consumed by [runCompiler].
+ArgParser createCompilerArgParser() {
+  final ArgParser argParser = new ArgParser(allowTrailingOptions: true);
+  declareCompilerOptions(argParser);
+  return argParser;
+}
+
+const int successExitCode = 0;
+const int badUsageExitCode = 1;
+const int compileTimeErrorExitCode = 254;
+
+/// Run kernel compiler tool with given [options] and [usage]
+/// and return exit code.
+Future<int> runCompiler(ArgResults options, String usage) async {
+  final String platformKernel = options['platform'];
+
+  if ((options.rest.length != 1) || (platformKernel == null)) {
+    print(usage);
+    return badUsageExitCode;
+  }
+
+  final String input = options.rest.single;
+  final String outputFileName = options['output'] ?? "$input.dill";
+  final String packages = options['packages'];
+  final String targetName = options['target'];
+  final String fileSystemScheme = options['filesystem-scheme'];
+  final String depfile = options['depfile'];
+  final List<String> fileSystemRoots = options['filesystem-root'];
+  final bool aot = options['aot'];
+  final bool tfa = options['tfa'];
+  final bool linkPlatform = options['link-platform'];
+  final bool genBytecode = options['gen-bytecode'];
+  final bool emitBytecodeSourcePositions =
+      options['emit-bytecode-source-positions'];
+  final bool dropAST = options['drop-ast'];
+  final bool useFutureBytecodeFormat = options['use-future-bytecode-format'];
+  final bool enableAsserts = options['enable-asserts'];
+  final bool enableConstantEvaluation = options['enable-constant-evaluation'];
+  final bool splitOutputByPackages = options['split-output-by-packages'];
+  final Map<String, String> environmentDefines = {};
+
+  if (!parseCommandLineDefines(options['define'], environmentDefines, usage)) {
+    return badUsageExitCode;
+  }
+
+  final target = createFrontEndTarget(targetName);
+  if (target == null) {
+    print('Failed to create front-end target $targetName.');
+    return badUsageExitCode;
+  }
+
+  final fileSystem =
+      createFrontEndFileSystem(fileSystemScheme, fileSystemRoots);
+
+  final Uri packagesUri = packages != null
+      ? convertFileOrUriArgumentToUri(fileSystem, packages)
+      : null;
+
+  final platformKernelUri = Uri.base.resolveUri(new Uri.file(platformKernel));
+  final List<Uri> linkedDependencies = <Uri>[];
+  if (aot || linkPlatform) {
+    linkedDependencies.add(platformKernelUri);
+  }
+
+  Uri mainUri = convertFileOrUriArgumentToUri(fileSystem, input);
+  if (packagesUri != null) {
+    mainUri = await convertToPackageUri(fileSystem, mainUri, packagesUri);
+  }
+
+  final errorPrinter = new ErrorPrinter();
+  final errorDetector = new ErrorDetector(previousErrorHandler: errorPrinter);
+
+  final CompilerOptions compilerOptions = new CompilerOptions()
+    ..sdkSummary = platformKernelUri
+    ..target = target
+    ..fileSystem = fileSystem
+    ..linkedDependencies = linkedDependencies
+    ..packagesFileUri = packagesUri
+    ..onDiagnostic = (DiagnosticMessage m) {
+      errorDetector(m);
+    }
+    ..embedSourceText = options['embed-sources'];
+
+  final component = await compileToKernel(mainUri, compilerOptions,
+      aot: aot,
+      useGlobalTypeFlowAnalysis: tfa,
+      environmentDefines: environmentDefines,
+      genBytecode: genBytecode,
+      emitBytecodeSourcePositions: emitBytecodeSourcePositions,
+      dropAST: dropAST && !splitOutputByPackages,
+      useFutureBytecodeFormat: useFutureBytecodeFormat,
+      enableAsserts: enableAsserts,
+      enableConstantEvaluation: enableConstantEvaluation);
+
+  errorPrinter.printCompilationMessages();
+
+  if (errorDetector.hasCompilationErrors || (component == null)) {
+    return compileTimeErrorExitCode;
+  }
+
+  final IOSink sink = new File(outputFileName).openWrite();
+  final BinaryPrinter printer = new BinaryPrinter(sink);
+  printer.writeComponentFile(component);
+  await sink.close();
+
+  if (depfile != null) {
+    await writeDepfile(fileSystem, component, outputFileName, depfile);
+  }
+
+  if (splitOutputByPackages) {
+    await writeOutputSplitByPackages(
+      mainUri,
+      compilerOptions,
+      component,
+      outputFileName,
+      environmentDefines: environmentDefines,
+      genBytecode: genBytecode,
+      emitBytecodeSourcePositions: emitBytecodeSourcePositions,
+      dropAST: dropAST,
+    );
+  }
+
+  return successExitCode;
+}
 
 /// Generates a kernel representation of the program whose main library is in
 /// the given [source]. Intended for whole program (non-modular) compilation.
@@ -50,6 +243,7 @@
     bool useGlobalTypeFlowAnalysis: false,
     Map<String, String> environmentDefines,
     bool genBytecode: false,
+    bool emitBytecodeSourcePositions: false,
     bool dropAST: false,
     bool useFutureBytecodeFormat: false,
     bool enableAsserts: false,
@@ -95,6 +289,7 @@
     await runWithFrontEndCompilerContext(source, options, component, () {
       generateBytecode(component,
           dropAST: dropAST,
+          emitSourcePositions: emitBytecodeSourcePositions,
           useFutureBytecodeFormat: useFutureBytecodeFormat,
           environmentDefines: environmentDefines);
     });
@@ -143,6 +338,13 @@
     no_dynamic_invocations_annotator.transformComponent(component);
   }
 
+  // TODO(35069): avoid recomputing CSA by reading it from the platform files.
+  void ignoreAmbiguousSupertypes(cls, a, b) {}
+  final hierarchy = new ClassHierarchy(component,
+      onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
+  call_site_annotator.transformLibraries(
+      component, component.libraries, coreTypes, hierarchy);
+
   // We don't know yet whether gen_snapshot will want to do obfuscation, but if
   // it does it will need the obfuscation prohibitions.
   obfuscationProhibitions.transformComponent(component, coreTypes);
@@ -178,16 +380,15 @@
 
   await runWithFrontEndCompilerContext(source, compilerOptions, component, () {
     final hierarchy = new ClassHierarchy(component);
-    final typeEnvironment =
-        new TypeEnvironment(coreTypes, hierarchy, strongMode: true);
+    final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
 
     // TFA will remove constants fields which are unused (and respects the
     // vm/embedder entrypoints).
     constants.transformComponent(component, vmConstants,
+        new ForwardConstantEvaluationErrors(typeEnvironment),
         keepFields: true,
         evaluateAnnotations: true,
-        enableAsserts: enableAsserts,
-        errorReporter: new ForwardConstantEvaluationErrors(typeEnvironment));
+        enableAsserts: enableAsserts);
   });
 }
 
@@ -233,7 +434,7 @@
     previousErrorHandler?.call(message);
   }
 
-  void printCompilationMessages(Uri baseUri) {
+  void printCompilationMessages() {
     final sortedUris = compilationMessages.keys.toList()
       ..sort((a, b) => '$a'.compareTo('$b'));
     for (final Uri sourceUri in sortedUris) {
@@ -262,3 +463,215 @@
   }
   return true;
 }
+
+/// Create front-end target with given name.
+Target createFrontEndTarget(String targetName) {
+  // Make sure VM-specific targets are available.
+  installAdditionalTargets();
+
+  final TargetFlags targetFlags = new TargetFlags();
+  return getTarget(targetName, targetFlags);
+}
+
+/// Create a front-end file system.
+/// If requested, create a virtual mutli-root file system.
+FileSystem createFrontEndFileSystem(
+    String multiRootFileSystemScheme, List<String> multiRootFileSystemRoots) {
+  FileSystem fileSystem = StandardFileSystem.instance;
+  if (multiRootFileSystemRoots != null &&
+      multiRootFileSystemRoots.isNotEmpty &&
+      multiRootFileSystemScheme != null) {
+    final rootUris = <Uri>[];
+    for (String root in multiRootFileSystemRoots) {
+      rootUris.add(Uri.base.resolveUri(new Uri.file(root)));
+    }
+    fileSystem = new MultiRootFileSystem(
+        multiRootFileSystemScheme, rootUris, fileSystem);
+  }
+  return fileSystem;
+}
+
+/// Convert command line argument [input] which is a file or URI to an
+/// absolute URI.
+///
+/// If virtual multi-root file system is used, or [input] can be parsed to a
+/// URI with 'package' scheme, then [input] is interpreted as URI.
+/// Otherwise [input] is interpreted as a file path.
+Uri convertFileOrUriArgumentToUri(FileSystem fileSystem, String input) {
+  if (input == null) {
+    return null;
+  }
+  // If using virtual multi-root file system, input source argument should be
+  // specified as URI.
+  if (fileSystem is MultiRootFileSystem) {
+    return Uri.base.resolve(input);
+  }
+  try {
+    Uri uri = Uri.parse(input);
+    if (uri.scheme == 'package') {
+      return uri;
+    }
+  } on FormatException {
+    // Ignore, treat input argument as file path.
+  }
+  return Uri.base.resolveUri(new Uri.file(input));
+}
+
+/// Convert a URI which may use virtual file system schema to a real file URI.
+Future<Uri> asFileUri(FileSystem fileSystem, Uri uri) async {
+  FileSystemEntity fse = fileSystem.entityForUri(uri);
+  if (fse is MultiRootFileSystemEntity) {
+    fse = await (fse as MultiRootFileSystemEntity).delegate;
+  }
+  return fse.uri;
+}
+
+/// Convert URI to a package URI if it is inside one of the packages.
+Future<Uri> convertToPackageUri(
+    FileSystem fileSystem, Uri uri, Uri packagesUri) async {
+  // Convert virtual URI to a real file URI.
+  String uriString = (await asFileUri(fileSystem, uri)).toString();
+  List<String> packages;
+  try {
+    packages =
+        await new File((await asFileUri(fileSystem, packagesUri)).toFilePath())
+            .readAsLines();
+  } on IOException {
+    // Can't read packages file - silently give up.
+    return uri;
+  }
+  // file:///a/b/x/y/main.dart -> package:x.y/main.dart
+  for (var line in packages) {
+    final colon = line.indexOf(':');
+    if (colon == -1) {
+      continue;
+    }
+    final packageName = line.substring(0, colon);
+    String packagePath;
+    try {
+      packagePath = (await asFileUri(
+              fileSystem, packagesUri.resolve(line.substring(colon + 1))))
+          .toString();
+    } on FileSystemException {
+      // Can't resolve package path.
+      continue;
+    }
+    if (uriString.startsWith(packagePath)) {
+      return Uri.parse(
+          'package:$packageName/${uriString.substring(packagePath.length)}');
+    }
+  }
+  return uri;
+}
+
+/// Write a separate kernel binary for each package. The name of the
+/// output kernel binary is '[outputFileName]-$package.dilp'.
+/// The list of package names is written into a file '[outputFileName]-packages'.
+///
+/// Generates bytecode for each package if requested.
+Future writeOutputSplitByPackages(
+  Uri source,
+  CompilerOptions compilerOptions,
+  Component component,
+  String outputFileName, {
+  Map<String, String> environmentDefines,
+  bool genBytecode: false,
+  bool emitBytecodeSourcePositions: false,
+  bool dropAST: false,
+  bool useFutureBytecodeFormat: false,
+}) async {
+  // Package sharing: make the encoding not depend on the order in which parts
+  // of a package are loaded.
+  component.libraries.sort((Library a, Library b) {
+    return a.importUri.toString().compareTo(b.importUri.toString());
+  });
+  component.computeCanonicalNames();
+  for (Library lib in component.libraries) {
+    lib.additionalExports.sort((Reference a, Reference b) {
+      return a.canonicalName.toString().compareTo(b.canonicalName.toString());
+    });
+  }
+
+  final packagesSet = new Set<String>();
+  for (Library lib in component.libraries) {
+    packagesSet.add(packageFor(lib));
+  }
+  packagesSet.remove('main');
+  packagesSet.remove(null);
+
+  final List<String> packages = packagesSet.toList();
+  packages.add('main'); // Make sure main package is last.
+
+  await runWithFrontEndCompilerContext(source, compilerOptions, component,
+      () async {
+    for (String package in packages) {
+      final String filename = '$outputFileName-$package.dilp';
+      final IOSink sink = new File(filename).openWrite();
+
+      final main = component.mainMethod;
+      if (package != 'main') {
+        component.mainMethod = null;
+      }
+
+      if (genBytecode) {
+        final List<Library> libraries = component.libraries
+            .where((lib) => packageFor(lib) == package)
+            .toList();
+        generateBytecode(component,
+            libraries: libraries,
+            dropAST: dropAST,
+            emitSourcePositions: emitBytecodeSourcePositions,
+            useFutureBytecodeFormat: useFutureBytecodeFormat,
+            environmentDefines: environmentDefines);
+      }
+
+      final BinaryPrinter printer = new LimitedBinaryPrinter(sink,
+          (lib) => packageFor(lib) == package, false /* excludeUriToSource */);
+      printer.writeComponentFile(component);
+      component.mainMethod = main;
+
+      await sink.close();
+    }
+  });
+
+  final IOSink packagesList = new File('$outputFileName-packages').openWrite();
+  for (String package in packages) {
+    packagesList.writeln(package);
+  }
+  await packagesList.close();
+}
+
+String packageFor(Library lib) {
+  // Core libraries are not written into any package kernel binaries.
+  if (lib.isExternal) return null;
+
+  // Packages are written into their own kernel binaries.
+  Uri uri = lib.importUri;
+  if (uri.scheme == 'package') return uri.pathSegments.first;
+
+  // Everything else (e.g., file: or data: imports) is lumped into the main
+  // kernel binary.
+  return 'main';
+}
+
+String _escapePath(String path) {
+  return path.replaceAll('\\', '\\\\').replaceAll(' ', '\\ ');
+}
+
+/// Create ninja dependencies file, as described in
+/// https://ninja-build.org/manual.html#_depfile
+Future<void> writeDepfile(FileSystem fileSystem, Component component,
+    String output, String depfile) async {
+  final IOSink file = new File(depfile).openWrite();
+  file.write(_escapePath(output));
+  file.write(':');
+  for (Uri dep in component.uriToSource.keys) {
+    // Skip empty or corelib dependencies.
+    if (dep == null || dep.scheme == 'org-dartlang-sdk') continue;
+    Uri uri = await asFileUri(fileSystem, dep);
+    file.write(' ');
+    file.write(_escapePath(uri.toFilePath()));
+  }
+  file.write('\n');
+  await file.close();
+}
diff --git a/pkg/vm/lib/metadata/bytecode.dart b/pkg/vm/lib/metadata/bytecode.dart
index 573bd02..7a86c70 100644
--- a/pkg/vm/lib/metadata/bytecode.dart
+++ b/pkg/vm/lib/metadata/bytecode.dart
@@ -5,37 +5,85 @@
 library vm.metadata.bytecode;
 
 import 'package:kernel/ast.dart';
+import '../bytecode/bytecode_serialization.dart'
+    show BufferedWriter, BufferedReader, StringTable;
 import '../bytecode/constant_pool.dart' show ConstantPool;
 import '../bytecode/dbc.dart'
-    show stableBytecodeFormatVersion, futureBytecodeFormatVersion;
+    show
+        stableBytecodeFormatVersion,
+        futureBytecodeFormatVersion,
+        bytecodeInstructionsAlignment;
 import '../bytecode/disassembler.dart' show BytecodeDisassembler;
 import '../bytecode/exceptions.dart' show ExceptionsTable;
+import '../bytecode/object_table.dart'
+    show ObjectTable, ObjectHandle, NameAndType;
+import '../bytecode/source_positions.dart' show SourcePositions;
 
-/// Metadata containing bytecode.
+abstract class BytecodeMetadata {
+  void write(BufferedWriter writer);
+}
+
+/// Bytecode of a member is encoded in the following way:
 ///
-/// In kernel binary, bytecode metadata is encoded as following:
+/// type MemberBytecode {
+///   UInt flags (HasExceptionsTable, HasSourcePositions, HasNullableFields,
+///               HasClosures)
 ///
-/// type BytecodeMetadata {
-///   UInt bytecodeFormatVersion
-///   UInt flags (HasExceptionsTable, HasNullableFields, HasClosures)
+///   (optional, present if HasClosures)
+///   List<ClosureDeclaration> closureDeclarations
 ///
 ///   ConstantPool constantPool
-///   List<Byte> bytecodes
+///
+///   UInt bytecodeSizeInBytes
+///   Byte[] padding
+///   Byte[bytecodeSizeInBytes] bytecodes
 ///
 ///   (optional, present if HasExceptionsTable)
 ///   ExceptionsTable exceptionsTable
 ///
+///   (optional, present if HasSourcePositions)
+///   SourcePositions sourcePositionsTabe
+///
 ///   (optional, present if HasNullableFields)
-///   List<CanonicalName> nullableFields
+///   List<PackedObject> nullableFields
 ///
 ///   (optional, present if HasClosures)
-///   List<ClosureBytecode> closures
+///   ClosureBytecode[] closures
+/// }
+///
+/// type ClosureDeclaration {
+///   UInt flags (hasOptionalPositionalParams, hasOptionalNamedParams,
+///               hasTypeParams)
+///
+///   PackedObject parent // Member or Closure
+///   PackedObject name
+///
+///   if hasTypeParams
+///     UInt numTypeParameters
+///     PackedObject[numTypeParameters] typeParameterNames
+///     PackedObject[numTypeParameters] typeParameterBounds
+///
+///   UInt numParameters
+///
+///   if hasOptionalPositionalParams || hasOptionalNamedParams
+///     UInt numRequiredParameters
+///
+///   NameAndType[numParameters] parameters
+///   PackedObject returnType
 /// }
 ///
 /// type ClosureBytecode {
-///   ConstantIndex closureFunction
-///   List<Byte> bytecodes
+///   UInt flags (HasExceptionsTable, HasSourcePositions)
+///
+///   UInt bytecodeSizeInBytes
+///   Byte[] padding
+///   Byte[bytecodeSizeInBytes] bytecodes
+///
+///   (optional, present if HasExceptionsTable)
 ///   ExceptionsTable exceptionsTable
+///
+///   (optional, present if HasSourcePositions)
+///   SourcePositions sourcePositionsTabe
 /// }
 ///
 /// Encoding of ExceptionsTable is described in
@@ -44,79 +92,327 @@
 /// Encoding of ConstantPool is described in
 /// pkg/vm/lib/bytecode/constant_pool.dart.
 ///
-class BytecodeMetadata {
+class MemberBytecode extends BytecodeMetadata {
   static const hasExceptionsTableFlag = 1 << 0;
-  static const hasNullableFieldsFlag = 1 << 1;
-  static const hasClosuresFlag = 1 << 2;
+  static const hasSourcePositionsFlag = 1 << 1;
+  static const hasNullableFieldsFlag = 1 << 2;
+  static const hasClosuresFlag = 1 << 3;
 
-  final int version;
   final ConstantPool constantPool;
   final List<int> bytecodes;
   final ExceptionsTable exceptionsTable;
-  final List<Reference> nullableFields;
-  final List<ClosureBytecode> closures;
+  final SourcePositions sourcePositions;
+  final List<ObjectHandle> nullableFields;
+  final List<ClosureDeclaration> closures;
 
   bool get hasExceptionsTable => exceptionsTable.blocks.isNotEmpty;
+  bool get hasSourcePositions => sourcePositions.mapping.isNotEmpty;
   bool get hasNullableFields => nullableFields.isNotEmpty;
   bool get hasClosures => closures.isNotEmpty;
 
   int get flags =>
       (hasExceptionsTable ? hasExceptionsTableFlag : 0) |
+      (hasSourcePositions ? hasSourcePositionsFlag : 0) |
       (hasNullableFields ? hasNullableFieldsFlag : 0) |
       (hasClosures ? hasClosuresFlag : 0);
 
-  BytecodeMetadata(this.version, this.constantPool, this.bytecodes,
-      this.exceptionsTable, this.nullableFields, this.closures);
+  MemberBytecode(this.constantPool, this.bytecodes, this.exceptionsTable,
+      this.sourcePositions, this.nullableFields, this.closures);
+
+  @override
+  void write(BufferedWriter writer) {
+    writer.writePackedUInt30(flags);
+    if (hasClosures) {
+      writer.writePackedUInt30(closures.length);
+      closures.forEach((c) => c.write(writer));
+    }
+    constantPool.write(writer);
+    _writeBytecodeInstructions(writer, bytecodes);
+    if (hasExceptionsTable) {
+      exceptionsTable.write(writer);
+    }
+    if (hasSourcePositions) {
+      sourcePositions.write(writer);
+    }
+    if (hasNullableFields) {
+      writer.writePackedList(nullableFields);
+    }
+    if (hasClosures) {
+      closures.forEach((c) => c.bytecode.write(writer));
+    }
+  }
+
+  factory MemberBytecode.read(BufferedReader reader) {
+    int flags = reader.readPackedUInt30();
+    final List<ClosureDeclaration> closures = ((flags & hasClosuresFlag) != 0)
+        ? new List<ClosureDeclaration>.generate(reader.readPackedUInt30(),
+            (_) => new ClosureDeclaration.read(reader))
+        : const <ClosureDeclaration>[];
+    final ConstantPool constantPool = new ConstantPool.read(reader);
+    final List<int> bytecodes = _readBytecodeInstructions(reader);
+    final exceptionsTable = ((flags & hasExceptionsTableFlag) != 0)
+        ? new ExceptionsTable.read(reader)
+        : new ExceptionsTable();
+    final sourcePositions = ((flags & hasSourcePositionsFlag) != 0)
+        ? new SourcePositions.read(reader)
+        : new SourcePositions();
+    final List<ObjectHandle> nullableFields =
+        ((flags & hasNullableFieldsFlag) != 0)
+            ? reader.readPackedList<ObjectHandle>()
+            : const <ObjectHandle>[];
+    for (var c in closures) {
+      c.bytecode = new ClosureBytecode.read(reader);
+    }
+    return new MemberBytecode(constantPool, bytecodes, exceptionsTable,
+        sourcePositions, nullableFields, closures);
+  }
 
   // TODO(alexmarkov): Consider printing constant pool before bytecode.
   @override
   String toString() => "\n"
-      "Bytecode"
-      " (version: "
-      "${version == stableBytecodeFormatVersion ? 'stable' : version == futureBytecodeFormatVersion ? 'future' : "v$version"}"
-      ") {\n"
-      "${new BytecodeDisassembler().disassemble(bytecodes, exceptionsTable)}}\n"
+      "Bytecode {\n"
+      "${new BytecodeDisassembler().disassemble(bytecodes, exceptionsTable, annotations: [
+        sourcePositions.getBytecodeAnnotations()
+      ])}}\n"
       "$exceptionsTable"
-      "${nullableFields.isEmpty ? '' : 'Nullable fields: ${nullableFields.map((ref) => ref.asField).toList()}\n'}"
+      "${nullableFields.isEmpty ? '' : 'Nullable fields: $nullableFields}\n'}"
       "$constantPool"
       "${closures.join('\n')}";
 }
 
-/// Bytecode of a nested function (closure).
-/// Closures share the constant pool of a top-level member.
-class ClosureBytecode {
-  final int closureFunctionConstantIndex;
-  final List<int> bytecodes;
-  final ExceptionsTable exceptionsTable;
+class ClosureDeclaration {
+  static const int flagHasOptionalPositionalParams = 1 << 0;
+  static const int flagHasOptionalNamedParams = 1 << 1;
+  static const int flagHasTypeParams = 1 << 2;
 
-  ClosureBytecode(
-      this.closureFunctionConstantIndex, this.bytecodes, this.exceptionsTable);
+  final ObjectHandle parent;
+  final ObjectHandle name;
+  final List<NameAndType> typeParams;
+  final int numRequiredParams;
+  final int numNamedParams;
+  final List<NameAndType> parameters;
+  final ObjectHandle returnType;
+  ClosureBytecode bytecode;
 
-  void writeToBinary(BinarySink sink) {
-    sink.writeUInt30(closureFunctionConstantIndex);
-    sink.writeByteList(bytecodes);
-    exceptionsTable.writeToBinary(sink);
+  ClosureDeclaration(
+      this.parent,
+      this.name,
+      this.typeParams,
+      this.numRequiredParams,
+      this.numNamedParams,
+      this.parameters,
+      this.returnType);
+
+  void write(BufferedWriter writer) {
+    int flags = 0;
+    if (numRequiredParams != parameters.length) {
+      if (numNamedParams > 0) {
+        flags |= flagHasOptionalNamedParams;
+      } else {
+        flags |= flagHasOptionalPositionalParams;
+      }
+    }
+    if (typeParams.isNotEmpty) {
+      flags |= flagHasTypeParams;
+    }
+    writer.writePackedUInt30(flags);
+    writer.writePackedObject(parent);
+    writer.writePackedObject(name);
+
+    if (flags & flagHasTypeParams != 0) {
+      writer.writePackedUInt30(typeParams.length);
+      for (var tp in typeParams) {
+        writer.writePackedObject(tp.name);
+      }
+      for (var tp in typeParams) {
+        writer.writePackedObject(tp.type);
+      }
+    }
+    writer.writePackedUInt30(parameters.length);
+    if (flags &
+            (flagHasOptionalPositionalParams | flagHasOptionalNamedParams) !=
+        0) {
+      writer.writePackedUInt30(numRequiredParams);
+    }
+    for (var param in parameters) {
+      writer.writePackedObject(param.name);
+      writer.writePackedObject(param.type);
+    }
+    writer.writePackedObject(returnType);
   }
 
-  factory ClosureBytecode.readFromBinary(BinarySource source) {
-    final closureFunctionConstantIndex = source.readUInt();
-    final List<int> bytecodes = source.readByteList();
-    final exceptionsTable = new ExceptionsTable.readFromBinary(source);
-    return new ClosureBytecode(
-        closureFunctionConstantIndex, bytecodes, exceptionsTable);
+  factory ClosureDeclaration.read(BufferedReader reader) {
+    final int flags = reader.readPackedUInt30();
+    final parent = reader.readPackedObject();
+    final name = reader.readPackedObject();
+    List<NameAndType> typeParams;
+    if ((flags & flagHasTypeParams) != 0) {
+      final int numTypeParams = reader.readPackedUInt30();
+      List<ObjectHandle> names = new List<ObjectHandle>.generate(
+          numTypeParams, (_) => reader.readPackedObject());
+      List<ObjectHandle> bounds = new List<ObjectHandle>.generate(
+          numTypeParams, (_) => reader.readPackedObject());
+      typeParams = new List<NameAndType>.generate(
+          numTypeParams, (int i) => new NameAndType(names[i], bounds[i]));
+    } else {
+      typeParams = const <NameAndType>[];
+    }
+    final numParams = reader.readPackedUInt30();
+    final numRequiredParams = (flags &
+                (flagHasOptionalPositionalParams |
+                    flagHasOptionalNamedParams) !=
+            0)
+        ? reader.readPackedUInt30()
+        : numParams;
+    final numNamedParams = (flags & flagHasOptionalNamedParams != 0)
+        ? (numParams - numRequiredParams)
+        : 0;
+    final List<NameAndType> parameters = new List<NameAndType>.generate(
+        numParams,
+        (_) => new NameAndType(
+            reader.readPackedObject(), reader.readPackedObject()));
+    final returnType = reader.readPackedObject();
+    return new ClosureDeclaration(parent, name, typeParams, numRequiredParams,
+        numNamedParams, parameters, returnType);
   }
 
   @override
   String toString() {
     StringBuffer sb = new StringBuffer();
-    sb.writeln('Closure CP#$closureFunctionConstantIndex {');
-    sb.writeln(
-        new BytecodeDisassembler().disassemble(bytecodes, exceptionsTable));
+    sb.write('Closure $parent::$name');
+    if (typeParams.isNotEmpty) {
+      sb.write(' <${typeParams.join(', ')}>');
+    }
+    sb.write(' (');
+    sb.write(parameters.sublist(0, numRequiredParams).join(', '));
+    if (numRequiredParams != parameters.length) {
+      if (numRequiredParams > 0) {
+        sb.write(', ');
+      }
+      if (numNamedParams > 0) {
+        sb.write('{ ${parameters.sublist(numRequiredParams).join(', ')} }');
+      } else {
+        sb.write('[ ${parameters.sublist(numRequiredParams).join(', ')} ]');
+      }
+    }
+    sb.write(') -> ');
+    sb.writeln(returnType);
+    if (bytecode != null) {
+      sb.write(bytecode.toString());
+    }
+    return sb.toString();
+  }
+}
+
+/// Bytecode of a nested function (closure).
+/// Closures share the constant pool of a top-level member.
+class ClosureBytecode {
+  final List<int> bytecodes;
+  final ExceptionsTable exceptionsTable;
+  final SourcePositions sourcePositions;
+
+  bool get hasExceptionsTable => exceptionsTable.blocks.isNotEmpty;
+  bool get hasSourcePositions => sourcePositions.mapping.isNotEmpty;
+
+  int get flags =>
+      (hasExceptionsTable ? MemberBytecode.hasExceptionsTableFlag : 0) |
+      (hasSourcePositions ? MemberBytecode.hasSourcePositionsFlag : 0);
+
+  ClosureBytecode(this.bytecodes, this.exceptionsTable, this.sourcePositions);
+
+  void write(BufferedWriter writer) {
+    writer.writePackedUInt30(flags);
+    _writeBytecodeInstructions(writer, bytecodes);
+    if (hasExceptionsTable) {
+      exceptionsTable.write(writer);
+    }
+    if (hasSourcePositions) {
+      sourcePositions.write(writer);
+    }
+  }
+
+  factory ClosureBytecode.read(BufferedReader reader) {
+    final int flags = reader.readPackedUInt30();
+    final List<int> bytecodes = _readBytecodeInstructions(reader);
+    final exceptionsTable =
+        ((flags & MemberBytecode.hasExceptionsTableFlag) != 0)
+            ? new ExceptionsTable.read(reader)
+            : new ExceptionsTable();
+    final sourcePositions =
+        ((flags & MemberBytecode.hasSourcePositionsFlag) != 0)
+            ? new SourcePositions.read(reader)
+            : new SourcePositions();
+    return new ClosureBytecode(bytecodes, exceptionsTable, sourcePositions);
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.writeln('ClosureBytecode {');
+    sb.writeln(new BytecodeDisassembler().disassemble(
+        bytecodes, exceptionsTable,
+        annotations: [sourcePositions.getBytecodeAnnotations()]));
     sb.writeln('}');
     return sb.toString();
   }
 }
 
+class BytecodeComponent extends BytecodeMetadata {
+  int version;
+  StringTable stringTable;
+  ObjectTable objectTable;
+
+  BytecodeComponent(this.version)
+      : stringTable = new StringTable(),
+        objectTable = new ObjectTable();
+
+  @override
+  void write(BufferedWriter writer) {
+    objectTable.allocateIndexTable();
+
+    // Writing object table may add new strings to strings table,
+    // so serialize object table first.
+    BufferedWriter objectsWriter = new BufferedWriter.fromWriter(writer);
+    objectTable.write(objectsWriter);
+
+    BufferedWriter stringsWriter = new BufferedWriter.fromWriter(writer);
+    stringTable.write(stringsWriter);
+
+    writer.writePackedUInt30(version);
+    writer.writePackedUInt30(stringsWriter.offset);
+    writer.writePackedUInt30(objectsWriter.offset);
+
+    writer.writeBytes(stringsWriter.takeBytes());
+    writer.writeBytes(objectsWriter.takeBytes());
+  }
+
+  BytecodeComponent.read(BufferedReader reader) {
+    version = reader.readPackedUInt30();
+    if (version != stableBytecodeFormatVersion &&
+        version != futureBytecodeFormatVersion) {
+      throw 'Error: unexpected bytecode version $version';
+    }
+    reader.formatVersion = version;
+    reader.readPackedUInt30(); // Strings size
+    reader.readPackedUInt30(); // Objects size
+
+    stringTable = new StringTable.read(reader);
+    reader.stringReader = stringTable;
+
+    objectTable = new ObjectTable.read(reader);
+    reader.objectReader = objectTable;
+  }
+
+  String toString() => "\n"
+      "Bytecode"
+      " (version: "
+      "${version == stableBytecodeFormatVersion ? 'stable' : version == futureBytecodeFormatVersion ? 'future' : "v$version"}"
+      ")\n"
+//      "$objectTable\n"
+//      "$stringTable\n"
+      ;
+}
+
 /// Repository for [BytecodeMetadata].
 class BytecodeMetadataRepository extends MetadataRepository<BytecodeMetadata> {
   @override
@@ -126,52 +422,49 @@
   final Map<TreeNode, BytecodeMetadata> mapping =
       <TreeNode, BytecodeMetadata>{};
 
+  BytecodeComponent bytecodeComponent;
+
   @override
   void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) {
-    sink.writeUInt30(metadata.version);
-    sink.writeUInt30(metadata.flags);
-    metadata.constantPool.writeToBinary(node, sink);
-    sink.writeByteList(metadata.bytecodes);
-    if (metadata.hasExceptionsTable) {
-      metadata.exceptionsTable.writeToBinary(sink);
+    if (node is Component) {
+      bytecodeComponent = metadata as BytecodeComponent;
+    } else {
+      assert(bytecodeComponent != null);
     }
-    if (metadata.hasNullableFields) {
-      sink.writeUInt30(metadata.nullableFields.length);
-      metadata.nullableFields.forEach((ref) => sink
-          .writeCanonicalNameReference(getCanonicalNameOfMember(ref.asField)));
-    }
-    if (metadata.hasClosures) {
-      sink.writeUInt30(metadata.closures.length);
-      metadata.closures.forEach((c) => c.writeToBinary(sink));
-    }
+    final writer = new BufferedWriter(bytecodeComponent.version,
+        bytecodeComponent.stringTable, bytecodeComponent.objectTable,
+        baseOffset: sink.getBufferOffset());
+    metadata.write(writer);
+    sink.writeBytes(writer.takeBytes());
   }
 
   @override
   BytecodeMetadata readFromBinary(Node node, BinarySource source) {
-    int version = source.readUInt();
-    if (version != stableBytecodeFormatVersion &&
-        version != futureBytecodeFormatVersion) {
-      throw 'Error: unexpected bytecode version $version';
+    if (node is Component) {
+      final reader = new BufferedReader(-1, null, null, source.bytes,
+          baseOffset: source.currentOffset);
+      bytecodeComponent = new BytecodeComponent.read(reader);
+      return bytecodeComponent;
+    } else {
+      final reader = new BufferedReader(
+          bytecodeComponent.version,
+          bytecodeComponent.stringTable,
+          bytecodeComponent.objectTable,
+          source.bytes,
+          baseOffset: source.currentOffset);
+      return new MemberBytecode.read(reader);
     }
-    int flags = source.readUInt();
-    final ConstantPool constantPool =
-        new ConstantPool.readFromBinary(node, source);
-    final List<int> bytecodes = source.readByteList();
-    final exceptionsTable =
-        ((flags & BytecodeMetadata.hasExceptionsTableFlag) != 0)
-            ? new ExceptionsTable.readFromBinary(source)
-            : new ExceptionsTable();
-    final List<Reference> nullableFields =
-        ((flags & BytecodeMetadata.hasNullableFieldsFlag) != 0)
-            ? new List<Reference>.generate(source.readUInt(),
-                (_) => source.readCanonicalNameReference().getReference())
-            : const <Reference>[];
-    final List<ClosureBytecode> closures =
-        ((flags & BytecodeMetadata.hasClosuresFlag) != 0)
-            ? new List<ClosureBytecode>.generate(source.readUInt(),
-                (_) => new ClosureBytecode.readFromBinary(source))
-            : const <ClosureBytecode>[];
-    return new BytecodeMetadata(version, constantPool, bytecodes,
-        exceptionsTable, nullableFields, closures);
   }
 }
+
+void _writeBytecodeInstructions(BufferedWriter writer, List<int> bytecodes) {
+  writer.writePackedUInt30(bytecodes.length);
+  writer.align(bytecodeInstructionsAlignment);
+  writer.writeBytes(bytecodes);
+}
+
+List<int> _readBytecodeInstructions(BufferedReader reader) {
+  int len = reader.readPackedUInt30();
+  reader.align(bytecodeInstructionsAlignment);
+  return reader.readBytesAsUint8List(len);
+}
diff --git a/pkg/vm/lib/metadata/direct_call.dart b/pkg/vm/lib/metadata/direct_call.dart
index dd9348c..9c2594e 100644
--- a/pkg/vm/lib/metadata/direct_call.dart
+++ b/pkg/vm/lib/metadata/direct_call.dart
@@ -35,7 +35,8 @@
 
   @override
   void writeToBinary(DirectCallMetadata metadata, Node node, BinarySink sink) {
-    sink.writeCanonicalNameReference(getCanonicalNameOfMember(metadata.target));
+    sink.writeNullAllowedCanonicalNameReference(
+        getCanonicalNameOfMember(metadata.target));
     sink.writeByte(metadata.checkReceiverForNull ? 1 : 0);
   }
 
diff --git a/pkg/vm/lib/metadata/inferred_type.dart b/pkg/vm/lib/metadata/inferred_type.dart
index 55e9443..c22b155 100644
--- a/pkg/vm/lib/metadata/inferred_type.dart
+++ b/pkg/vm/lib/metadata/inferred_type.dart
@@ -14,8 +14,7 @@
   static const int flagNullable = 1 << 0;
   static const int flagInt = 1 << 1;
 
-  // For Parameters and Fields, whether a type-check is required at assignment
-  // (invocation/setter). Not meaningful on other kernel nodes.
+  // For invocations: whether to use the unchecked entry-point.
   static const int flagSkipCheck = 1 << 2;
 
   // Entire list may be null if no type arguments were inferred.
@@ -76,7 +75,7 @@
   void writeToBinary(InferredType metadata, Node node, BinarySink sink) {
     // TODO(sjindel/tfa): Implement serialization of type arguments when can use
     // them for optimizations.
-    sink.writeCanonicalNameReference(
+    sink.writeNullAllowedCanonicalNameReference(
         getCanonicalNameOfClass(metadata.concreteClass));
     sink.writeByte(metadata._flags);
   }
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 817672e..a43e07c 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -76,7 +76,7 @@
     logger?.call("Transformed mixin applications");
 
     // TODO(kmillikin): Make this run on a per-method basis.
-    transformAsync.transformLibraries(coreTypes, libraries, flags.syncAsync);
+    transformAsync.transformLibraries(coreTypes, libraries);
     logger?.call("Transformed async methods");
 
     listFactorySpecializer.transformLibraries(libraries, coreTypes);
@@ -90,7 +90,7 @@
   void performTransformationsOnProcedure(
       CoreTypes coreTypes, ClassHierarchy hierarchy, Procedure procedure,
       {void logger(String msg)}) {
-    transformAsync.transformProcedure(coreTypes, procedure, flags.syncAsync);
+    transformAsync.transformProcedure(coreTypes, procedure);
     logger?.call("Transformed async functions");
   }
 
diff --git a/pkg/vm/lib/transformations/call_site_annotator.dart b/pkg/vm/lib/transformations/call_site_annotator.dart
index 66f1cfe..7b6b620 100644
--- a/pkg/vm/lib/transformations/call_site_annotator.dart
+++ b/pkg/vm/lib/transformations/call_site_annotator.dart
@@ -36,7 +36,7 @@
   AnnotateWithStaticTypes(
       Component component, CoreTypes coreTypes, ClassHierarchy hierarchy)
       : _metadata = addRepositoryTo(component),
-        env = new TypeEnvironment(coreTypes, hierarchy, strongMode: true);
+        env = new TypeEnvironment(coreTypes, hierarchy);
 
   @override
   visitProcedure(Procedure proc) {
diff --git a/pkg/vm/lib/transformations/mixin_deduplication.dart b/pkg/vm/lib/transformations/mixin_deduplication.dart
index 19375aa..73c7e0b 100644
--- a/pkg/vm/lib/transformations/mixin_deduplication.dart
+++ b/pkg/vm/lib/transformations/mixin_deduplication.dart
@@ -126,26 +126,24 @@
       throw 'Unexpected node ${node.runtimeType}: $node';
 }
 
-/// Corrects synthetic forwarding constructors inserted by mixin resolution
-/// after replacing superclass.
+/// Corrects forwarding constructors inserted by mixin resolution after
+/// replacing superclass.
 void _correctForwardingConstructors(Class c, Class oldSuper, Class newSuper) {
   for (var constructor in c.constructors) {
-    if (constructor.isSynthetic) {
-      for (var initializer in constructor.initializers) {
-        if ((initializer is SuperInitializer) &&
-            initializer.target.enclosingClass == oldSuper) {
-          Constructor replacement = null;
-          for (var c in newSuper.constructors) {
-            if (c.name == initializer.target.name) {
-              replacement = c;
-              break;
-            }
+    for (var initializer in constructor.initializers) {
+      if ((initializer is SuperInitializer) &&
+          initializer.target.enclosingClass == oldSuper) {
+        Constructor replacement = null;
+        for (var c in newSuper.constructors) {
+          if (c.name == initializer.target.name) {
+            replacement = c;
+            break;
           }
-          if (replacement == null) {
-            throw 'Unable to find a replacement for $c in $newSuper';
-          }
-          initializer.target = replacement;
         }
+        if (replacement == null) {
+          throw 'Unable to find a replacement for $c in $newSuper';
+        }
+        initializer.target = replacement;
       }
     }
   }
diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart
index 3252cc3..0ab0b88 100644
--- a/pkg/vm/lib/transformations/pragma.dart
+++ b/pkg/vm/lib/transformations/pragma.dart
@@ -9,6 +9,7 @@
 
 const kEntryPointPragmaName = "vm:entry-point";
 const kExactResultTypePragmaName = "vm:exact-result-type";
+const kNonNullableResultType = "vm:non-nullable-result-type";
 
 abstract class ParsedPragma {}
 
@@ -29,6 +30,10 @@
   ParsedResultTypeByPathPragma(this.path);
 }
 
+class ParsedNonNullableResultType extends ParsedPragma {
+  ParsedNonNullableResultType();
+}
+
 abstract class PragmaAnnotationParser {
   /// May return 'null' if the annotation does not represent a recognized
   /// @pragma.
@@ -91,6 +96,8 @@
         }
         throw "ERROR: Unsupported option to '$kExactResultTypePragmaName' "
             "pragma: $options";
+      case kNonNullableResultType:
+        return new ParsedNonNullableResultType();
       default:
         return null;
     }
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index a7dc830..f403b43 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -90,6 +90,10 @@
   /// Number of times result of this invocation was invalidated.
   int invalidationCounter = 0;
 
+  /// Whether a call-site directed to this invocation can call through the
+  /// unchecked entry-point.
+  bool typeChecksNeeded = false;
+
   /// If an invocation is invalidated more than [invalidationLimit] times,
   /// its result is saturated in order to guarantee convergence.
   static const int invalidationLimit = 1000;
@@ -143,7 +147,17 @@
 
 class _DirectInvocation extends _Invocation {
   _DirectInvocation(DirectSelector selector, Args<Type> args)
-      : super(selector, args);
+      : super(selector, args) {
+    // We don't emit [TypeCheck] statements for bounds checks of type
+    // parameters, so if there are any type parameters, we must assume
+    // they could fail bounds checks.
+    //
+    // TODO(sjindel): Use [TypeCheck] to avoid bounds checks.
+    if (selector.member.function != null) {
+      typeChecksNeeded = selector.member.function.typeParameters
+          .any((t) => t.isGenericCovariantImpl);
+    }
+  }
 
   @override
   Type process(TypeFlowAnalysis typeFlowAnalysis) {
@@ -206,6 +220,7 @@
         }
         fieldValue.setValue(initializerResult, typeFlowAnalysis,
             field.isStatic ? null : args.receiver);
+        fieldValue.isInitialized = true;
         return const EmptyType();
     }
 
@@ -287,6 +302,15 @@
   Set<Call> _callSites; // Populated only if not polymorphic.
   Member _monomorphicTarget;
 
+  @override
+  set typeChecksNeeded(bool value) {
+    if (typeChecksNeeded) return;
+    if (value) {
+      super.typeChecksNeeded = true;
+      _notifyCallSites();
+    }
+  }
+
   /// Marker for noSuchMethod() invocation in the map of invocation targets.
   static final Member kNoSuchMethodMarker =
       new Procedure(new Name('noSuchMethod&&'), ProcedureKind.Method, null);
@@ -329,6 +353,8 @@
         Type type;
 
         if (target == kNoSuchMethodMarker) {
+          // Non-dynamic call-sites must hit NSM-forwarders in Dart 2.
+          assertx(selector is DynamicSelector);
           type = _processNoSuchMethod(receiver, typeFlowAnalysis);
         } else {
           final directSelector =
@@ -360,6 +386,10 @@
               typeFlowAnalysis._calledViaInterfaceSelector.add(target);
             }
           }
+
+          if (directInvocation.typeChecksNeeded) {
+            typeChecksNeeded = true;
+          }
         }
 
         result = result.union(type, typeFlowAnalysis.hierarchyCache);
@@ -515,10 +545,10 @@
     if (!_isPolymorphic) {
       _isPolymorphic = true;
       _monomorphicTarget = null;
+      typeChecksNeeded = true;
 
       _notifyCallSites();
-
-      _callSites = null; // No longer needed.
+      _callSites = null;
     }
   }
 
@@ -536,14 +566,13 @@
     }
 
     _notifyCallSite(callSite);
-
     if (!callSite.isPolymorphic) {
-      assertx(!_isPolymorphic);
       (_callSites ??= new Set<Call>()).add(callSite);
     }
   }
 
-  /// Notify call site about changes in polymorphism of this invocation.
+  /// Notify call site about changes in polymorphism or checkedness of this
+  /// invocation.
   void _notifyCallSite(Call callSite) {
     assert(selector is! DirectSelector);
 
@@ -554,6 +583,10 @@
         callSite.addTarget(_monomorphicTarget);
       }
     }
+
+    if (typeChecksNeeded) {
+      callSite.setUseCheckedEntry();
+    }
   }
 
   /// Notify call sites monitoring this invocation about changes in
@@ -700,6 +733,9 @@
   final Summary typeGuardSummary;
   Type value;
 
+  /// Flag indicating if field initializer was executed.
+  bool isInitialized = false;
+
   _FieldValue(this.field, this.typeGuardSummary)
       : staticType = new Type.fromStatic(field.type) {
     if (field.initializer == null && _isDefaultValueOfFieldObservable()) {
@@ -709,14 +745,6 @@
     }
   }
 
-  bool get staticCallSiteSkipCheck {
-    if (typeGuardSummary != null) {
-      return (typeGuardSummary.result as TypeCheck).canSkipOnStaticCallSite;
-    } else {
-      return false;
-    }
-  }
-
   bool _isDefaultValueOfFieldObservable() {
     if (field.isStatic) {
       return true;
@@ -1024,8 +1052,16 @@
       return true;
     }
 
-    if (superType is DynamicType || superType is VoidType) return true;
-    if (subType is DynamicType || subType is VoidType) return false;
+    if (superType is DynamicType ||
+        superType is VoidType ||
+        subType is BottomType) {
+      return true;
+    }
+    if (subType is DynamicType ||
+        subType is VoidType ||
+        superType is BottomType) {
+      return false;
+    }
 
     // TODO(alexmarkov): handle function types properly
     if (subType is FunctionType) {
@@ -1175,6 +1211,7 @@
 
   Class get futureOrClass => environment.coreTypes.futureOrClass;
   Class get futureClass => environment.coreTypes.futureClass;
+  Class get functionClass => environment.coreTypes.functionClass;
 }
 
 class _WorkList {
@@ -1324,7 +1361,7 @@
     hierarchyCache = new _ClassHierarchyCache(
         this, hierarchy, _genericInterfacesInfo, environment);
     summaryCollector = new SummaryCollector(
-        target, environment, this, nativeCodeOracle, hierarchyCache);
+        target, environment, hierarchy, this, nativeCodeOracle, hierarchyCache);
     _invocationsCache = new _InvocationsCache(this);
     workList = new _WorkList(this);
 
@@ -1352,6 +1389,8 @@
     hierarchyCache.seal();
   }
 
+  /// Returns true if analysis found that given member
+  /// could be executed / field could be accessed.
   bool isMemberUsed(Member member) {
     if (member is Field) {
       return _fieldValues.containsKey(member);
@@ -1360,20 +1399,30 @@
     }
   }
 
+  /// Returns true if analysis found that initializer of the given [field]
+  /// could be executed.
+  bool isFieldInitializerUsed(Field field) {
+    final fieldValue = _fieldValues[field];
+    if (fieldValue != null) {
+      return fieldValue.isInitialized;
+    }
+    return false;
+  }
+
   bool isClassAllocated(Class c) => hierarchyCache.allocatedClasses.contains(c);
 
   Call callSite(TreeNode node) => summaryCollector.callSites[node];
 
+  TypeCheck explicitCast(AsExpression cast) =>
+      summaryCollector.explicitCasts[cast];
+
   Type fieldType(Field field) => _fieldValues[field]?.value;
 
-  // True if a the runtime type-check for this field can be skipped on
-  // statically-typed setter calls. (The type-check is only simulated after
-  // narrowing by the static parameter type.)
-  bool fieldStaticCallSiteSkipCheck(Field field) =>
-      _fieldValues[field]?.staticCallSiteSkipCheck;
-
   Args<Type> argumentTypes(Member member) => _summaries[member]?.argumentTypes;
 
+  List<VariableDeclaration> uncheckedParameters(Member member) =>
+      _summaries[member]?.uncheckedParameters;
+
   bool isTearOffTaken(Member member) => _tearOffTaken.contains(member);
 
   /// Returns true if this member is called dynamically.
@@ -1391,12 +1440,6 @@
       _calledViaDynamicSelector.contains(member) ||
       _calledViaInterfaceSelector.contains(member);
 
-  // Returns parameters for which a runtime type-check can be skipped on
-  // statically-typed call-sites. (The type-check is only simulated after
-  // narrowing by the static parameter type.)
-  List<VariableDeclaration> staticCallSiteSkipCheckParams(Member member) =>
-      _summaries[member]?.staticCallSiteSkipCheckParams;
-
   /// ---- Implementation of [CallHandler] interface. ----
 
   @override
@@ -1434,6 +1477,11 @@
     }
   }
 
+  @override
+  void typeCheckTriggered() {
+    currentInvocation.typeChecksNeeded = true;
+  }
+
   /// ---- Implementation of [EntryPointsListener] interface. ----
 
   @override
diff --git a/pkg/vm/lib/transformations/type_flow/native_code.dart b/pkg/vm/lib/transformations/type_flow/native_code.dart
index cb6b7ce..291237b 100644
--- a/pkg/vm/lib/transformations/type_flow/native_code.dart
+++ b/pkg/vm/lib/transformations/type_flow/native_code.dart
@@ -159,12 +159,14 @@
   Type handleNativeProcedure(
       Member member, EntryPointsListener entryPointsListener) {
     Type returnType = null;
+    bool nullable = null;
 
     for (var annotation in member.annotations) {
       ParsedPragma pragma = _matcher.parsePragma(annotation);
       if (pragma == null) continue;
       if (pragma is ParsedResultTypeByTypePragma ||
-          pragma is ParsedResultTypeByPathPragma) {
+          pragma is ParsedResultTypeByPathPragma ||
+          pragma is ParsedNonNullableResultType) {
         // We can only use the 'vm:exact-result-type' pragma on methods in core
         // libraries for safety reasons. See 'result_type_pragma.md', detail 1.2
         // for explanation.
@@ -177,7 +179,7 @@
         var type = pragma.type;
         if (type is InterfaceType) {
           returnType = entryPointsListener.addAllocatedClass(type.classNode);
-          break;
+          continue;
         }
         throw "ERROR: Invalid return type for native method: ${pragma.type}";
       } else if (pragma is ParsedResultTypeByPathPragma) {
@@ -192,16 +194,22 @@
         // Error is thrown on the next line if the class is not found.
         Class klass = _libraryIndex.getClass(libName, klassName);
         Type concreteClass = entryPointsListener.addAllocatedClass(klass);
-
         returnType = concreteClass;
-        break;
+      } else if (pragma is ParsedNonNullableResultType) {
+        nullable = false;
       }
     }
 
+    if (returnType != null && nullable != null) {
+      throw 'ERROR: Cannot have both, @pragma("$kExactResultTypePragmaName") '
+          'and @pragma("$kNonNullableResultType"), annotating the same member.';
+    }
+
     if (returnType != null) {
       return returnType;
     } else {
-      return new Type.fromStatic(member.function.returnType);
+      final coneType = new Type.cone(member.function.returnType);
+      return nullable == false ? coneType : new Type.nullable(coneType);
     }
   }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index c2e7b40..01529f7 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -16,6 +16,7 @@
 abstract class CallHandler {
   Type applyCall(Call callSite, Selector selector, Args<Type> args,
       {bool isResultUsed});
+  void typeCheckTriggered();
 }
 
 /// Base class for all statements in a summary.
@@ -65,13 +66,15 @@
 class Parameter extends Statement {
   final String name;
 
-  // 'staticType' is null for type parameters to factory constructors.
-  final Type staticType;
+  // [staticType] is null if no narrowing should be performed. This happens for
+  // type parameters and for parameters whose type is narrowed by a [TypeCheck]
+  // statement.
+  final Type staticTypeForNarrowing;
 
   Type defaultValue;
   Type _argumentType = const EmptyType();
 
-  Parameter(this.name, this.staticType);
+  Parameter(this.name, this.staticTypeForNarrowing);
 
   @override
   String get label => "%$name";
@@ -80,7 +83,13 @@
   void accept(StatementVisitor visitor) => visitor.visitParameter(this);
 
   @override
-  String dump() => "$label = _Parameter #$index [$staticType]";
+  String dump() {
+    String text = "$label = _Parameter #$index";
+    if (staticTypeForNarrowing != null) {
+      text += " [$staticTypeForNarrowing]";
+    }
+    return text;
+  }
 
   @override
   Type apply(List<Type> computedTypes, TypeHierarchy typeHierarchy,
@@ -168,7 +177,13 @@
   final Selector selector;
   final Args<TypeExpr> args;
 
-  Call(this.selector, this.args);
+  Call(this.selector, this.args) {
+    // TODO(sjindel/tfa): Support inferring unchecked entry-points for dynamic
+    // and direct calls as well.
+    if (selector is DynamicSelector || selector is DirectSelector) {
+      setUseCheckedEntry();
+    }
+  }
 
   @override
   void accept(StatementVisitor visitor) => visitor.visitCall(this);
@@ -212,6 +227,7 @@
   static const int kNullableReceiver = (1 << 2);
   static const int kResultUsed = (1 << 3);
   static const int kReachable = (1 << 4);
+  static const int kUseCheckedEntry = (1 << 5);
 
   Member _monomorphicTarget;
 
@@ -227,8 +243,14 @@
 
   bool get isReachable => (_flags & kReachable) != 0;
 
+  bool get useCheckedEntry => (_flags & kUseCheckedEntry) != 0;
+
   Type get resultType => _resultType;
 
+  void setUseCheckedEntry() {
+    _flags |= kUseCheckedEntry;
+  }
+
   void setResultUsed() {
     _flags |= kResultUsed;
   }
@@ -391,16 +413,30 @@
   TypeExpr arg;
   TypeExpr type;
 
-  bool _canSkip = true;
+  // The Kernel which this TypeCheck corresponds to. Can be a
+  // VariableDeclaration, AsExpression or Field.
+  //
+  // VariableDeclaration is used for parameter type-checks.
+  // Field is used for type-checks of parameters to implicit setters.
+  final TreeNode node;
 
-  // True if a the runtime type-check for this parameter can be skipped on
-  // statically-typed call-sites. (The type-check is only simulated after
-  // narrowing by the static parameter type.)
-  bool get canSkipOnStaticCallSite => _canSkip;
+  final Type staticType;
 
-  final VariableDeclaration parameter;
+  // 'isTestedOnlyOnCheckedEntryPoint' is whether or not this parameter's type-check will
+  // occur on the "checked" entrypoint in the VM but will be skipped on
+  // "unchecked" entrypoint.
+  bool isTestedOnlyOnCheckedEntryPoint;
 
-  TypeCheck(this.arg, this.type, this.parameter);
+  VariableDeclaration get parameter =>
+      node is VariableDeclaration ? node : null;
+
+  bool canAlwaysSkip = true;
+
+  TypeCheck(this.arg, this.type, this.node, this.staticType) {
+    assertx(node != null);
+    isTestedOnlyOnCheckedEntryPoint =
+        parameter != null && !parameter.isCovariant;
+  }
 
   @override
   void accept(StatementVisitor visitor) => visitor.visitTypeCheck(this);
@@ -408,9 +444,7 @@
   @override
   String dump() {
     String result = "$label = _TypeCheck ($arg against $type)";
-    if (parameter != null) {
-      result += " (for parameter ${parameter.name})";
-    }
+    result += " (for ${node})";
     return result;
   }
 
@@ -421,25 +455,36 @@
     Type checkType = type.getComputedType(computedTypes);
     // TODO(sjindel/tfa): Narrow the result if possible.
     assertx(checkType is AnyType || checkType is RuntimeType);
-    if (_canSkip) {
-      if (checkType is AnyType) {
-        // If we don't know what the RHS of the check is going to be, we can't
-        // guarantee that it will pass.
-        if (kPrintTrace) {
-          tracePrint("TypeCheck failed, type is unknown");
-        }
-        _canSkip = false;
-      } else if (checkType is RuntimeType) {
-        _canSkip = argType.isSubtypeOfRuntimeType(typeHierarchy, checkType);
-        if (kPrintTrace && !_canSkip) {
-          tracePrint("TypeCheck of $argType against $checkType failed.");
-        }
-        argType = argType.intersection(
-            Type.fromStatic(checkType.representedTypeRaw), typeHierarchy);
-      } else {
-        assertx(false, details: "Cannot see $checkType on RHS of TypeCheck.");
+
+    bool canSkip = true; // Can this check be skipped on this invocation.
+
+    if (checkType is AnyType) {
+      // If we don't know what the RHS of the check is going to be, we can't
+      // guarantee that it will pass.
+      canSkip = false;
+    } else if (checkType is RuntimeType) {
+      canSkip = argType.isSubtypeOfRuntimeType(typeHierarchy, checkType);
+      argType = argType.intersection(
+          Type.fromStatic(checkType.representedTypeRaw), typeHierarchy);
+    } else {
+      assertx(false, details: "Cannot see $checkType on RHS of TypeCheck.");
+    }
+
+    // If this check might be skipped on an
+    // unchecked entry-point, we need to signal that the call-site must be
+    // checked.
+    if (!canSkip) {
+      canAlwaysSkip = false;
+      if (isTestedOnlyOnCheckedEntryPoint) {
+        callHandler.typeCheckTriggered();
+      }
+      if (kPrintTrace) {
+        tracePrint("TypeCheck of $argType against $checkType failed.");
       }
     }
+
+    argType = argType.intersection(staticType, typeHierarchy);
+
     return argType;
   }
 }
@@ -501,19 +546,23 @@
 
     for (int i = 0; i < positionalArgCount; i++) {
       final Parameter param = _statements[i] as Parameter;
-      if (param.staticType != null) {
-        final argType = args[i].specialize(typeHierarchy);
-        param._observeArgumentType(argType, typeHierarchy);
-        // TODO(sjindel/tfa): Perform narrowing inside 'TypeCheck'.
-        types[i] = argType.intersection(param.staticType, typeHierarchy);
+      if (args[i] is RuntimeType) {
+        types[i] = args[i];
+        continue;
+      }
+      final argType = args[i].specialize(typeHierarchy);
+      param._observeArgumentType(argType, typeHierarchy);
+      if (param.staticTypeForNarrowing != null) {
+        types[i] =
+            argType.intersection(param.staticTypeForNarrowing, typeHierarchy);
       } else {
+        // TODO(sjindel/tfa): Narrowing is performed inside a [TypeCheck] later.
         types[i] = args[i];
       }
     }
 
     for (int i = positionalArgCount; i < positionalParameterCount; i++) {
       final Parameter param = _statements[i] as Parameter;
-      assertx(param.staticType != null);
       final argType = param.defaultValue.specialize(typeHierarchy);
       param._observeArgumentType(argType, typeHierarchy);
       types[i] = argType;
@@ -529,7 +578,12 @@
             args[positionalArgCount + argIndex].specialize(typeHierarchy);
         argIndex++;
         param._observeArgumentType(argType, typeHierarchy);
-        types[i] = argType.intersection(param.staticType, typeHierarchy);
+        if (param.staticTypeForNarrowing != null) {
+          types[i] =
+              argType.intersection(param.staticTypeForNarrowing, typeHierarchy);
+        } else {
+          types[i] = argType;
+        }
       } else {
         assertx((argIndex == namedArgCount) ||
             (param.name.compareTo(argNames[argIndex]) < 0));
@@ -570,14 +624,15 @@
     return new Args<Type>(argTypes, names: argNames);
   }
 
-  List<VariableDeclaration> get staticCallSiteSkipCheckParams {
-    final vars = <VariableDeclaration>[];
-    for (final statement in _statements) {
-      if (statement is TypeCheck && statement.canSkipOnStaticCallSite) {
-        final decl = statement.parameter;
-        if (decl != null) vars.add(decl);
+  List<VariableDeclaration> get uncheckedParameters {
+    final params = List<VariableDeclaration>();
+    for (Statement statement in _statements) {
+      if (statement is TypeCheck &&
+          statement.canAlwaysSkip &&
+          statement.parameter != null) {
+        params.add(statement.parameter);
       }
     }
-    return vars;
+    return params;
   }
 }
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 9cd99b0..e9d777b 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -10,6 +10,7 @@
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/ast.dart' hide Statement, StatementVisitor;
 import 'package:kernel/ast.dart' as ast show Statement, StatementVisitor;
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
 import 'package:kernel/type_algebra.dart' show Substitution;
 
@@ -61,7 +62,7 @@
     }
 
     for (Statement st in statements) {
-      if (st is Call) {
+      if (st is Call || st is TypeCheck) {
         _normalizeExpr(st, false);
       } else if (st is Use) {
         _normalizeExpr(st.arg, true);
@@ -278,11 +279,14 @@
 class SummaryCollector extends RecursiveVisitor<TypeExpr> {
   final Target target;
   final TypeEnvironment _environment;
+  final ClassHierarchy _hierarchy;
   final EntryPointsListener _entryPointsListener;
   final NativeCodeOracle _nativeCodeOracle;
   final GenericInterfacesInfo _genericInterfacesInfo;
 
   final Map<TreeNode, Call> callSites = <TreeNode, Call>{};
+  final Map<AsExpression, TypeCheck> explicitCasts =
+      <AsExpression, TypeCheck>{};
   final _FallthroughDetector _fallthroughDetector = new _FallthroughDetector();
 
   Summary _summary;
@@ -296,8 +300,13 @@
   // Currently only used for factory constructors.
   Map<TypeParameter, TypeExpr> _fnTypeVariables;
 
-  SummaryCollector(this.target, this._environment, this._entryPointsListener,
-      this._nativeCodeOracle, this._genericInterfacesInfo) {
+  SummaryCollector(
+      this.target,
+      this._environment,
+      this._hierarchy,
+      this._entryPointsListener,
+      this._nativeCodeOracle,
+      this._genericInterfacesInfo) {
     assertx(_genericInterfacesInfo != null);
     constantAllocationCollector = new ConstantAllocationCollector(this);
   }
@@ -329,8 +338,8 @@
         _summary = new Summary();
       }
 
-      _translator = new RuntimeTypeTranslator(member.enclosingClass, _summary,
-          _receiver, null, _genericInterfacesInfo);
+      _translator = new RuntimeTypeTranslator(
+          _summary, _receiver, null, _genericInterfacesInfo);
 
       if (fieldSummaryType == FieldSummaryType.kInitializer) {
         assertx(member.initializer != null);
@@ -338,7 +347,8 @@
       } else {
         Parameter valueParam = _declareParameter("value", member.type, null);
         TypeExpr runtimeType = _translator.translate(member.type);
-        final check = new TypeCheck(valueParam, runtimeType, null);
+        final check = new TypeCheck(
+            valueParam, runtimeType, member, Type.fromStatic(member.type));
         _summary.add(check);
         _summary.result = check;
       }
@@ -373,25 +383,57 @@
         _environment.thisType = member.enclosingClass?.thisType;
       }
 
-      _translator = new RuntimeTypeTranslator(member.enclosingClass, _summary,
-          _receiver, _fnTypeVariables, _genericInterfacesInfo);
+      _translator = new RuntimeTypeTranslator(
+          _summary, _receiver, _fnTypeVariables, _genericInterfacesInfo);
 
-      for (VariableDeclaration param in function.positionalParameters) {
-        _declareParameter(param.name, param.type, param.initializer);
+      // Handle forwarding stubs. We need to check types against the types of
+      // the forwarding stub's target, [member.forwardingStubSuperTarget].
+      FunctionNode useTypesFrom = member.function;
+      if (member is Procedure &&
+          member.isForwardingStub &&
+          member.forwardingStubSuperTarget != null) {
+        final target = member.forwardingStubSuperTarget;
+        if (target is Field) {
+          useTypesFrom = FunctionNode(null, positionalParameters: [
+            VariableDeclaration("value", type: target.type)
+          ]);
+        } else {
+          useTypesFrom = member.forwardingStubSuperTarget.function;
+        }
       }
-      for (VariableDeclaration param in function.namedParameters) {
-        _declareParameter(param.name, param.type, param.initializer);
+
+      for (int i = 0; i < function.positionalParameters.length; ++i) {
+        final decl = function.positionalParameters[i];
+        _declareParameter(
+            decl.name,
+            _useTypeCheckForParameter(decl)
+                ? null
+                : useTypesFrom.positionalParameters[i].type,
+            function.positionalParameters[i].initializer);
+      }
+      for (int i = 0; i < function.namedParameters.length; ++i) {
+        final decl = function.namedParameters[i];
+        _declareParameter(
+            decl.name,
+            _useTypeCheckForParameter(decl)
+                ? null
+                : useTypesFrom.namedParameters[i].type,
+            function.namedParameters[i].initializer);
       }
 
       int count = firstParamIndex;
-      for (VariableDeclaration param in function.positionalParameters) {
-        Join v =
-            _declareVariable(param, useTypeCheck: param.isGenericCovariantImpl);
+      for (int i = 0; i < function.positionalParameters.length; ++i) {
+        final decl = function.positionalParameters[i];
+        Join v = _declareVariable(decl,
+            useTypeCheck: _useTypeCheckForParameter(decl),
+            checkType: useTypesFrom.positionalParameters[i].type);
         v.values.add(_summary.statements[count++]);
       }
-      for (VariableDeclaration param in function.namedParameters) {
-        Join v =
-            _declareVariable(param, useTypeCheck: param.isGenericCovariantImpl);
+      for (int i = 0; i < function.namedParameters.length; ++i) {
+        final decl = function.namedParameters[i];
+        Join v = _declareVariable(decl,
+            useTypeCheck: _useTypeCheckForParameter(decl),
+            checkType: useTypesFrom.namedParameters[i].type);
         v.values.add(_summary.statements[count++]);
       }
       assertx(count == _summary.parameterCount);
@@ -441,6 +483,10 @@
     return _summary;
   }
 
+  bool _useTypeCheckForParameter(VariableDeclaration decl) {
+    return decl.isCovariant || decl.isGenericCovariantImpl;
+  }
+
   Args<Type> rawArguments(Selector selector) {
     final member = selector.member;
     assertx(member != null);
@@ -559,17 +605,20 @@
   }
 
   Join _declareVariable(VariableDeclaration decl,
-      {bool addInitType: false, bool useTypeCheck: false}) {
-    Join join = new Join(decl.name, decl.type);
+      {bool addInitType: false,
+      bool useTypeCheck: false,
+      DartType checkType: null}) {
+    final type = checkType ?? decl.type;
+    Join join = new Join(decl.name, type);
     _summary.add(join);
     _variableJoins[decl] = join;
 
     TypeExpr variable = join;
     if (useTypeCheck) {
-      TypeExpr runtimeType = _translator.translate(decl.type);
-      variable = new TypeCheck(variable, runtimeType, decl);
+      TypeExpr runtimeType = _translator.translate(type);
+      variable = new TypeCheck(
+          variable, runtimeType, decl, Type.fromStatic(decl.type));
       _summary.add(variable);
-      _summary.add(new Use(variable));
     }
 
     _variables[decl] = variable;
@@ -697,15 +746,10 @@
   TypeExpr visitAsExpression(AsExpression node) {
     TypeExpr operand = _visit(node.operand);
     Type type = new Type.fromStatic(node.type);
-
-    TypeExpr result = _makeNarrow(operand, type);
-
     TypeExpr runtimeType = _translator.translate(node.type);
-    if (runtimeType is Statement) {
-      result = new TypeCheck(operand, runtimeType, /*parameter=*/ null);
-      _summary.add(result);
-    }
-
+    TypeExpr result = new TypeCheck(operand, runtimeType, node, type);
+    explicitCasts[node] = result;
+    _summary.add(result);
     return result;
   }
 
@@ -886,16 +930,19 @@
       return _makeCall(
           node, new DynamicSelector(CallKind.Method, node.name), args);
     }
+    // TODO(dartbug.com/34497): Once front-end desugars calls via
+    // fields/getters, handling of field and getter targets here
+    // can be turned into assertions.
     if ((target is Field) || ((target is Procedure) && target.isGetter)) {
-      // Call via field.
-      final fieldValue = _makeCall(
-          node,
+      // Call via field/getter.
+      final value = _makeCall(
+          null,
           (node.receiver is ThisExpression)
               ? new VirtualSelector(target, callKind: CallKind.PropertyGet)
               : new InterfaceSelector(target, callKind: CallKind.PropertyGet),
           new Args<TypeExpr>([receiver]));
       _makeCall(
-          null, DynamicSelector.kCall, new Args.withReceiver(args, fieldValue));
+          null, DynamicSelector.kCall, new Args.withReceiver(args, value));
       return _staticType(node);
     } else {
       // TODO(alexmarkov): overloaded arithmetic operators
@@ -952,8 +999,7 @@
     assertx(_receiver != null, details: node);
     final args = _visitArguments(_receiver, node.arguments);
     // Re-resolve target due to partial mixin resolution.
-    final target =
-        _environment.hierarchy.getDispatchTarget(_superclass, node.name);
+    final target = _hierarchy.getDispatchTarget(_superclass, node.name);
     if (target == null) {
       return new Type.empty();
     } else {
@@ -981,8 +1027,7 @@
     assertx(_receiver != null, details: node);
     final args = new Args<TypeExpr>([_receiver]);
     // Re-resolve target due to partial mixin resolution.
-    final target =
-        _environment.hierarchy.getDispatchTarget(_superclass, node.name);
+    final target = _hierarchy.getDispatchTarget(_superclass, node.name);
     if (target == null) {
       return new Type.empty();
     } else {
@@ -998,8 +1043,8 @@
     final value = _visit(node.value);
     final args = new Args<TypeExpr>([_receiver, value]);
     // Re-resolve target due to partial mixin resolution.
-    final target = _environment.hierarchy
-        .getDispatchTarget(_superclass, node.name, setter: true);
+    final target =
+        _hierarchy.getDispatchTarget(_superclass, node.name, setter: true);
     if (target != null) {
       assertx((target is Field) || ((target is Procedure) && target.isSetter));
       _entryPointsListener.recordMemberCalledViaThis(target);
@@ -1341,21 +1386,19 @@
 }
 
 class RuntimeTypeTranslator extends DartTypeVisitor<TypeExpr> {
-  final Class enclosingClass;
   final Summary summary;
   final Map<TypeParameter, TypeExpr> functionTypeVariables;
   final Map<DartType, TypeExpr> typesCache = <DartType, TypeExpr>{};
   final TypeExpr receiver;
   final GenericInterfacesInfo genericInterfacesInfo;
 
-  RuntimeTypeTranslator(this.enclosingClass, this.summary, this.receiver,
-      this.functionTypeVariables, this.genericInterfacesInfo) {}
+  RuntimeTypeTranslator(this.summary, this.receiver, this.functionTypeVariables,
+      this.genericInterfacesInfo) {}
 
   // Create a type translator which can be used only for types with no free type
   // variables.
   RuntimeTypeTranslator.forClosedTypes(this.genericInterfacesInfo)
-      : enclosingClass = null,
-        summary = null,
+      : summary = null,
         functionTypeVariables = null,
         receiver = null {}
 
@@ -1465,11 +1508,10 @@
       if (result != null) return result;
     }
     if (type.parameter.parent is! Class) return const AnyType();
-    assertx(type.parameter.parent == enclosingClass);
-
+    final interfaceClass = type.parameter.parent as Class;
     assertx(receiver != null);
-    final extract = new Extract(receiver, enclosingClass,
-        enclosingClass.typeParameters.indexOf(type.parameter));
+    final extract = new Extract(receiver, interfaceClass,
+        interfaceClass.typeParameters.indexOf(type.parameter));
     summary.add(extract);
     return extract;
   }
@@ -1502,14 +1544,15 @@
   final TypeEnvironment _environment;
   final SummaryCollector _summaryCollector;
 
-  CreateAllSummariesVisitor(
-      Target target, this._environment, GenericInterfacesInfo hierarchy)
+  CreateAllSummariesVisitor(Target target, this._environment,
+      ClassHierarchy hierarchy, GenericInterfacesInfo genericInterfacesInfo)
       : _summaryCollector = new SummaryCollector(
             target,
             _environment,
+            hierarchy,
             new EmptyEntryPointsListener(),
             new NativeCodeOracle(null, null),
-            hierarchy);
+            genericInterfacesInfo);
 
   @override
   defaultMember(Member m) {
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index 0937ab8..4e3103d 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -16,6 +16,7 @@
 
 import 'analysis.dart';
 import 'calls.dart';
+import 'summary.dart';
 import 'summary_collector.dart';
 import 'types.dart';
 import 'utils.dart';
@@ -39,13 +40,14 @@
   void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
   final hierarchy = new ClassHierarchy(component,
       onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
-  final types = new TypeEnvironment(coreTypes, hierarchy, strongMode: true);
+  final types = new TypeEnvironment(coreTypes, hierarchy);
   final libraryIndex = new LibraryIndex.all(component);
   final genericInterfacesInfo = new GenericInterfacesInfoImpl(hierarchy);
 
   if (kDumpAllSummaries) {
     Statistics.reset();
-    new CreateAllSummariesVisitor(target, types, genericInterfacesInfo)
+    new CreateAllSummariesVisitor(
+            target, types, hierarchy, genericInterfacesInfo)
         .visitComponent(component);
     Statistics.print("All summaries statistics");
   }
@@ -72,7 +74,7 @@
 
   new TreeShaker(component, typeFlowAnalysis).transformComponent(component);
 
-  new TFADevirtualization(component, typeFlowAnalysis)
+  new TFADevirtualization(component, typeFlowAnalysis, hierarchy)
       .visitComponent(component);
 
   new AnnotateKernel(component, typeFlowAnalysis).visitComponent(component);
@@ -91,9 +93,9 @@
 class TFADevirtualization extends Devirtualization {
   final TypeFlowAnalysis _typeFlowAnalysis;
 
-  TFADevirtualization(Component component, this._typeFlowAnalysis)
-      : super(_typeFlowAnalysis.environment.coreTypes, component,
-            _typeFlowAnalysis.environment.hierarchy);
+  TFADevirtualization(
+      Component component, this._typeFlowAnalysis, ClassHierarchy hierarchy)
+      : super(_typeFlowAnalysis.environment.coreTypes, component, hierarchy);
 
   @override
   DirectCallMetadata getDirectCall(TreeNode node, Member interfaceTarget,
@@ -158,7 +160,7 @@
           .toList();
     }
 
-    if ((concreteClass != null) || !nullable || isInt) {
+    if ((concreteClass != null) || !nullable || isInt || skipCheck) {
       return new InferredType(concreteClass, nullable, isInt,
           exactTypeArguments: typeArgs, skipCheck: skipCheck);
     }
@@ -167,7 +169,6 @@
   }
 
   void _setInferredType(TreeNode node, Type type, {bool skipCheck: false}) {
-    assertx(skipCheck == false || node is VariableDeclaration || node is Field);
     final inferredType = _convertType(type, skipCheck: skipCheck);
     if (inferredType != null) {
       _inferredTypeMetadata.mapping[node] = inferredType;
@@ -182,8 +183,20 @@
     final callSite = _typeFlowAnalysis.callSite(node);
     if (callSite != null) {
       if (callSite.isReachable) {
+        bool markSkipCheck = !callSite.useCheckedEntry &&
+            (node is MethodInvocation || node is PropertySet);
         if (callSite.isResultUsed) {
-          _setInferredType(node, callSite.resultType);
+          _setInferredType(node, callSite.resultType, skipCheck: markSkipCheck);
+        } else if (markSkipCheck) {
+          // If the call is not marked as 'isResultUsed', the 'resultType' will
+          // not be observed (i.e., it will always be EmptyType). This is the
+          // case even if the result acutally might be used but is not used by
+          // the summary, e.g. if the result is an argument to a closure call.
+          // Therefore, we need to pass in 'NullableType(AnyType)' as the
+          // inferred result type here (since we don't know what it actually
+          // is).
+          _setInferredType(node, NullableType(const AnyType()),
+              skipCheck: true);
         }
       } else {
         _setUnreachable(node);
@@ -194,15 +207,13 @@
   void _annotateMember(Member member) {
     if (_typeFlowAnalysis.isMemberUsed(member)) {
       if (member is Field) {
-        _setInferredType(member, _typeFlowAnalysis.fieldType(member),
-            skipCheck: _typeFlowAnalysis.fieldStaticCallSiteSkipCheck(member));
+        _setInferredType(member, _typeFlowAnalysis.fieldType(member));
       } else {
         Args<Type> argTypes = _typeFlowAnalysis.argumentTypes(member);
+        final uncheckedParameters =
+            _typeFlowAnalysis.uncheckedParameters(member);
         assertx(argTypes != null);
 
-        final skipCheckParams = new Set<VariableDeclaration>.from(
-            _typeFlowAnalysis.staticCallSiteSkipCheckParams(member));
-
         final int firstParamIndex =
             numTypeParams(member) + (hasReceiverArg(member) ? 1 : 0);
 
@@ -213,7 +224,7 @@
         for (int i = 0; i < positionalParams.length; i++) {
           _setInferredType(
               positionalParams[i], argTypes.values[firstParamIndex + i],
-              skipCheck: skipCheckParams.contains(positionalParams[i]));
+              skipCheck: uncheckedParameters.contains(positionalParams[i]));
         }
 
         // TODO(dartbug.com/32292): make sure parameters are sorted in kernel
@@ -224,7 +235,7 @@
           assertx(param != null);
           _setInferredType(param,
               argTypes.values[firstParamIndex + positionalParams.length + i],
-              skipCheck: skipCheckParams.contains(param));
+              skipCheck: uncheckedParameters.contains(param));
         }
 
         // TODO(alexmarkov): figure out how to pass receiver type.
@@ -356,6 +367,8 @@
   bool isClassAllocated(Class c) => typeFlowAnalysis.isClassAllocated(c);
   bool isMemberUsed(Member m) => _usedMembers.contains(m);
   bool isMemberBodyReachable(Member m) => typeFlowAnalysis.isMemberUsed(m);
+  bool isFieldInitializerReachable(Field f) =>
+      typeFlowAnalysis.isFieldInitializerUsed(f);
   bool isMemberReferencedFromNativeCode(Member m) =>
       typeFlowAnalysis.nativeCodeOracle.isMemberReferencedFromNativeCode(m);
   bool isTypedefUsed(Typedef t) => _usedTypedefs.contains(t);
@@ -452,6 +465,7 @@
   @override
   visitTypedefType(TypedefType node) {
     shaker.addUsedTypedef(node.typedefNode);
+    node.visitChildren(this);
   }
 
   @override
@@ -478,6 +492,7 @@
 /// transforms unreachable calls into 'throw' expressions.
 class _TreeShakerPass1 extends Transformer {
   final TreeShaker shaker;
+  Procedure _unsafeCast;
 
   _TreeShakerPass1(this.shaker);
 
@@ -590,6 +605,30 @@
   }
 
   @override
+  TreeNode visitField(Field node) {
+    if (shaker.isMemberBodyReachable(node)) {
+      if (kPrintTrace) {
+        tracePrint("Visiting $node");
+      }
+      shaker.addUsedMember(node);
+      if (node.initializer != null) {
+        if (shaker.isFieldInitializerReachable(node)) {
+          node.transformChildren(this);
+        } else {
+          node.initializer = _makeUnreachableCall([]);
+        }
+      }
+    } else if (shaker.isMemberReferencedFromNativeCode(node)) {
+      // Preserve members referenced from native code to satisfy lookups, even
+      // if they are not reachable. An instance member could be added via
+      // native code entry point but still unreachable if no instances of
+      // its enclosing class are allocated.
+      shaker.addUsedMember(node);
+    }
+    return node;
+  }
+
+  @override
   TreeNode visitMethodInvocation(MethodInvocation node) {
     node.transformChildren(this);
     if (_isUnreachable(node)) {
@@ -807,6 +846,24 @@
   TreeNode visitAssertInitializer(AssertInitializer node) {
     return _visitAssertNode(node);
   }
+
+  @override
+  TreeNode visitAsExpression(AsExpression node) {
+    node.transformChildren(this);
+    TypeCheck check = shaker.typeFlowAnalysis.explicitCast(node);
+    if (check != null && check.canAlwaysSkip) {
+      return StaticInvocation(
+          unsafeCast, Arguments([node.operand], types: [node.type]));
+    }
+    return node;
+  }
+
+  Procedure get unsafeCast {
+    _unsafeCast ??= shaker.typeFlowAnalysis.environment.coreTypes.index
+        .getTopLevelMember('dart:_internal', 'unsafeCast');
+    assertx(_unsafeCast != null);
+    return _unsafeCast;
+  }
 }
 
 /// The second pass of [TreeShaker]. It is called after set of used
diff --git a/pkg/vm/lib/transformations/type_flow/types.dart b/pkg/vm/lib/transformations/type_flow/types.dart
index 51a0d82..9904fa7 100644
--- a/pkg/vm/lib/transformations/type_flow/types.dart
+++ b/pkg/vm/lib/transformations/type_flow/types.dart
@@ -45,6 +45,7 @@
 
   Class get futureOrClass;
   Class get futureClass;
+  Class get functionClass;
 }
 
 /// Basic normalization of Dart types.
@@ -96,6 +97,8 @@
     dartType = _normalizeDartType(dartType);
     if ((dartType == const DynamicType()) || (dartType == const VoidType())) {
       return const AnyType();
+    } else if (dartType == const BottomType()) {
+      return new Type.empty();
     } else {
       return new ConeType(dartType);
     }
@@ -613,6 +616,15 @@
 
   bool isSubtypeOfRuntimeType(
       TypeHierarchy typeHierarchy, RuntimeType runtimeType) {
+    if (runtimeType._type is InterfaceType &&
+        (runtimeType._type as InterfaceType).classNode ==
+            typeHierarchy.functionClass) {
+      // TODO(35573): "implements/extends Function" is not handled correctly by
+      // the CFE. By returning "false" we force an approximation -- that a type
+      // check against "Function" might fail, whatever the LHS is.
+      return false;
+    }
+
     if (!typeHierarchy.isSubtype(this.classNode.rawType, runtimeType._type)) {
       return false;
     }
diff --git a/pkg/vm/lib/v8_snapshot_profile.dart b/pkg/vm/lib/v8_snapshot_profile.dart
new file mode 100644
index 0000000..ec01774
--- /dev/null
+++ b/pkg/vm/lib/v8_snapshot_profile.dart
@@ -0,0 +1,239 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import "package:dart2js_info/src/graph.dart";
+
+class _NodeInfo {
+  int type;
+  int name;
+  int id;
+  int selfSize;
+  int edgeCount;
+  _NodeInfo(
+    this.type,
+    this.name,
+    this.id,
+    this.selfSize,
+    this.edgeCount,
+  );
+}
+
+const List<String> _kRequiredNodeFields = [
+  "type",
+  "name",
+  "id",
+  "self_size",
+  "edge_count",
+];
+
+class _EdgeInfo {
+  int type;
+  int nameOrIndex;
+  int nodeOffset;
+  _EdgeInfo(
+    this.type,
+    this.nameOrIndex,
+    this.nodeOffset,
+  );
+}
+
+const List<String> _kRequiredEdgeFields = [
+  "type",
+  "name_or_index",
+  "to_node",
+];
+
+class NodeInfo {
+  String type;
+  String name;
+  int id;
+  int selfSize;
+  NodeInfo(
+    this.type,
+    this.name,
+    this.id,
+    this.selfSize,
+  );
+}
+
+class V8SnapshotProfile extends Graph<int> {
+  // Indexed by node offset.
+  final Map<int, _NodeInfo> _nodes = {};
+
+  // Indexed by start node offset.
+  final Map<int, List<_EdgeInfo>> _toEdges = {};
+  final Map<int, List<_EdgeInfo>> _fromEdges = {};
+
+  List<String> _nodeFields = [];
+  List<String> _edgeFields = [];
+
+  List<String> _nodeTypes = [];
+  List<String> _edgeTypes = [];
+
+  List<String> _strings = [];
+
+  // Only used to ensure IDs are unique.
+  Set<int> _ids = Set<int>();
+
+  V8SnapshotProfile.fromJson(Map top) {
+    final Map snapshot = top["snapshot"];
+    _parseMetadata(snapshot["meta"]);
+
+    _parseStrings(top["strings"]);
+    Expect.equals(snapshot["node_count"], _parseNodes(top["nodes"]));
+    Expect.equals(snapshot["edge_count"], _parseEdges(top["edges"]));
+
+    _calculateFromEdges();
+  }
+
+  void _parseMetadata(Map meta) {
+    final List nodeFields = meta["node_fields"];
+    nodeFields.forEach(_nodeFields.add);
+    Expect.isTrue(_kRequiredNodeFields.every(_nodeFields.contains));
+
+    final List edgeFields = meta["edge_fields"];
+    edgeFields.forEach(_edgeFields.add);
+    Expect.isTrue(_kRequiredEdgeFields.every(_edgeFields.contains));
+
+    // First entry of "node_types" is an array with the actual node types. IDK
+    // what the other entries are for.
+    List nodeTypes = meta["node_types"];
+    nodeTypes = nodeTypes[0];
+    nodeTypes.forEach(_nodeTypes.add);
+
+    // Same for edges.
+    List edgeTypes = meta["edge_types"];
+    edgeTypes = edgeTypes[0];
+    edgeTypes.forEach(_edgeTypes.add);
+  }
+
+  int _parseNodes(List nodes) {
+    final int typeIndex = _nodeFields.indexOf("type");
+    final int nameIndex = _nodeFields.indexOf("name");
+    final int idIndex = _nodeFields.indexOf("id");
+    final int selfSizeIndex = _nodeFields.indexOf("self_size");
+    final int edgeCountIndex = _nodeFields.indexOf("edge_count");
+
+    int offset = 0;
+    for (; offset < nodes.length; offset += _nodeFields.length) {
+      final int type = nodes[offset + typeIndex];
+      Expect.isTrue(0 <= type && type < _nodeTypes.length);
+
+      final int name = nodes[offset + nameIndex];
+      Expect.isTrue(0 <= name && name < _strings.length);
+
+      final int id = nodes[offset + idIndex];
+      Expect.isTrue(id >= 0);
+      Expect.isFalse(_ids.contains(id));
+      _ids.add(id);
+
+      final int selfSize = nodes[offset + selfSizeIndex];
+      Expect.isTrue(selfSize >= 0);
+
+      final int edgeCount = nodes[offset + edgeCountIndex];
+      Expect.isTrue(edgeCount >= 0);
+
+      _nodes[offset] = _NodeInfo(type, name, id, selfSize, edgeCount);
+    }
+
+    Expect.equals(offset, nodes.length);
+    return offset ~/ _nodeFields.length;
+  }
+
+  int _parseEdges(List edges) {
+    final int typeIndex = _edgeFields.indexOf("type");
+    final int nameOrIndexIndex = _edgeFields.indexOf("name_or_index");
+    final int toNodeIndex = _edgeFields.indexOf("to_node");
+
+    int edgeOffset = 0;
+    for (int nodeOffset = 0;
+        nodeOffset < _nodes.length * _nodeFields.length;
+        nodeOffset += _nodeFields.length) {
+      final int edgeCount = _nodes[nodeOffset].edgeCount;
+      final List<_EdgeInfo> nodeEdges = List<_EdgeInfo>(edgeCount);
+      for (int i = 0; i < edgeCount; ++i, edgeOffset += _edgeFields.length) {
+        final int type = edges[edgeOffset + typeIndex];
+        Expect.isTrue(0 <= type && type < _edgeTypes.length);
+
+        final int nameOrIndex = edges[edgeOffset + nameOrIndexIndex];
+        if (_edgeTypes[type] == "property") {
+          Expect.isTrue(0 <= nameOrIndex && nameOrIndex < _strings.length);
+        } else if (_edgeTypes[type] == "element") {
+          Expect.isTrue(nameOrIndex >= 0);
+        }
+
+        final int toNode = edges[edgeOffset + toNodeIndex];
+        checkNode(toNode);
+        nodeEdges[i] = _EdgeInfo(type, nameOrIndex, toNode);
+      }
+      _toEdges[nodeOffset] = nodeEdges;
+    }
+
+    Expect.equals(edgeOffset, edges.length);
+    return edgeOffset ~/ _edgeFields.length;
+  }
+
+  void checkNode(int offset) {
+    Expect.isTrue(offset >= 0 &&
+        offset % _nodeFields.length == 0 &&
+        offset ~/ _nodeFields.length < _nodes.length);
+  }
+
+  void _calculateFromEdges() {
+    for (final MapEntry<int, List<_EdgeInfo>> entry in _toEdges.entries) {
+      final int fromNode = entry.key;
+      for (final _EdgeInfo edge in entry.value) {
+        final List<_EdgeInfo> backEdges =
+            _fromEdges.putIfAbsent(edge.nodeOffset, () => <_EdgeInfo>[]);
+        backEdges.add(_EdgeInfo(edge.type, edge.nameOrIndex, fromNode));
+      }
+    }
+  }
+
+  void _parseStrings(List strings) => strings.forEach(_strings.add);
+
+  int get accountedBytes {
+    int sum = 0;
+    for (final _NodeInfo info in _nodes.values) {
+      sum += info.selfSize;
+    }
+    return sum;
+  }
+
+  int get unknownCount {
+    final int unknownType = _nodeTypes.indexOf("Unknown");
+    Expect.isTrue(unknownType >= 0);
+
+    int count = 0;
+    for (final MapEntry<int, _NodeInfo> entry in _nodes.entries) {
+      if (entry.value.type == unknownType) {
+        ++count;
+      }
+    }
+    return count;
+  }
+
+  bool get isEmpty => _nodes.isEmpty;
+  int get nodeCount => _nodes.length;
+
+  Iterable<int> get nodes => _nodes.keys;
+
+  Iterable<int> targetsOf(int source) {
+    return _toEdges[source].map((_EdgeInfo i) => i.nodeOffset);
+  }
+
+  Iterable<int> sourcesOf(int source) {
+    return _fromEdges[source].map((_EdgeInfo i) => i.nodeOffset);
+  }
+
+  int get root => 0;
+
+  NodeInfo operator [](int node) {
+    _NodeInfo info = _nodes[node];
+    final type = info.type != null ? _nodeTypes[info.type] : null;
+    final name = info.name != null ? _strings[info.name] : null;
+    return NodeInfo(type, name, info.id, info.selfSize);
+  }
+}
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index c1ba691..ef74ee0 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -6,8 +6,8 @@
 dependencies:
   build_integration:
     path: ../build_integration
-  front_end: 0.1.6
-  kernel: 0.3.6
+  front_end: ^0.1.6
+  kernel: ^0.3.6
 
 dev_dependencies:
   args: ^1.4.4
diff --git a/pkg/vm/test/bytecode/gen_bytecode_test.dart b/pkg/vm/test/bytecode/gen_bytecode_test.dart
index 758f47f..f821480 100644
--- a/pkg/vm/test/bytecode/gen_bytecode_test.dart
+++ b/pkg/vm/test/bytecode/gen_bytecode_test.dart
@@ -31,10 +31,14 @@
   await runWithFrontEndCompilerContext(source, options, component, () {
     // Need to omit source positions from bytecode as they are different on
     // Linux and Windows (due to differences in newline characters).
-    generateBytecode(component, omitSourcePositions: true);
+    generateBytecode(component, omitAssertSourcePositions: true);
   });
 
-  final actual = kernelLibraryToString(component.mainMethod.enclosingLibrary);
+  String actual = kernelLibraryToString(component.mainMethod.enclosingLibrary);
+
+  // Remove absolute library URIs.
+  actual = actual.replaceAll(new Uri.file(pkgVmDir).toString(), '#pkg/vm');
+
   compareResultWithExpectationsFile(source, actual);
 }
 
diff --git a/pkg/vm/test/common_test_utils.dart b/pkg/vm/test/common_test_utils.dart
index 2e5cbbd..9669536 100644
--- a/pkg/vm/test/common_test_utils.dart
+++ b/pkg/vm/test/common_test_utils.dart
@@ -54,7 +54,9 @@
   final StringBuffer buffer = new StringBuffer();
   new Printer(buffer, showExternal: false, showMetadata: true)
       .writeLibraryFile(library);
-  return buffer.toString();
+  return buffer
+      .toString()
+      .replaceAll(library.importUri.toString(), library.name);
 }
 
 class DevNullSink<T> extends Sink<T> {
diff --git a/pkg/vm/test/kernel_front_end_test.dart b/pkg/vm/test/kernel_front_end_test.dart
new file mode 100644
index 0000000..5a8379c
--- /dev/null
+++ b/pkg/vm/test/kernel_front_end_test.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:front_end/src/api_unstable/vm.dart'
+    show computePlatformBinariesLocation;
+import 'package:test/test.dart';
+import 'package:vm/kernel_front_end.dart';
+
+final String sdkDir = Platform.script.resolve('../../..').toFilePath();
+
+String platformPath() => computePlatformBinariesLocation()
+    .resolve('vm_platform_strong.dill')
+    .toFilePath();
+
+const String mainScript = 'pkg/vm/bin/gen_kernel.dart';
+const String packagesFile = '.packages';
+
+void testCompile(List<String> args) async {
+  final compilerExitCode =
+      await runCompiler(createCompilerArgParser().parse(args), '');
+  expect(compilerExitCode, successExitCode);
+}
+
+main() {
+  Directory tempDir;
+  setUp(() {
+    var systemTempDir = Directory.systemTemp;
+    tempDir = systemTempDir.createTempSync('kernel_front_end_test');
+  });
+
+  tearDown(() {
+    tempDir.delete(recursive: true);
+  });
+
+  String outputDill() => new File('${tempDir.path}/foo.dill').path;
+
+  test('compile-simple', () async {
+    await testCompile([
+      '--platform',
+      platformPath(),
+      '--packages',
+      '$sdkDir/$packagesFile',
+      '--output',
+      outputDill(),
+      '$sdkDir/$mainScript',
+    ]);
+  });
+
+  test('compile-multi-root', () async {
+    await testCompile([
+      '--platform',
+      platformPath(),
+      '--filesystem-scheme',
+      'test-filesystem-scheme',
+      '--filesystem-root',
+      sdkDir,
+      '--packages',
+      'test-filesystem-scheme:///$packagesFile',
+      '--output',
+      outputDill(),
+      'test-filesystem-scheme:///$mainScript',
+    ]);
+  });
+
+  test('compile-package-split', () async {
+    await testCompile([
+      '--platform',
+      platformPath(),
+      '--packages',
+      '$sdkDir/$packagesFile',
+      '--output',
+      outputDill(),
+      '--split-output-by-packages',
+      '$sdkDir/$mainScript',
+    ]);
+  });
+
+  test('compile-bytecode', () async {
+    await testCompile([
+      '--platform',
+      platformPath(),
+      '--packages',
+      '$sdkDir/$packagesFile',
+      '--output',
+      outputDill(),
+      '--gen-bytecode',
+      '--drop-ast',
+      '$sdkDir/$mainScript',
+    ]);
+  });
+
+  test('compile-bytecode-package-split', () async {
+    await testCompile([
+      '--platform',
+      platformPath(),
+      '--packages',
+      '$sdkDir/$packagesFile',
+      '--output',
+      outputDill(),
+      '--gen-bytecode',
+      '--drop-ast',
+      '--split-output-by-packages',
+      '$sdkDir/$mainScript',
+    ]);
+  });
+}
diff --git a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
index 1ec8d87..022c7e1 100644
--- a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
+++ b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
@@ -23,15 +23,16 @@
   final SummaryCollector _summaryCollector;
   final StringBuffer _buf = new StringBuffer();
 
-  PrintSummaries(
-      Target target, TypeEnvironment environment, CoreTypes coreTypes)
+  PrintSummaries(Target target, TypeEnvironment environment,
+      CoreTypes coreTypes, ClassHierarchy hierarchy)
       : _summaryCollector = new SummaryCollector(
             target,
             environment,
+            hierarchy,
             new EmptyEntryPointsListener(),
             new NativeCodeOracle(
                 null, new ExpressionPragmaAnnotationParser(coreTypes)),
-            new GenericInterfacesInfoImpl(environment.hierarchy));
+            new GenericInterfacesInfoImpl(hierarchy));
 
   String print(TreeNode node) {
     visitLibrary(node);
@@ -54,11 +55,12 @@
   final Library library = component.mainMethod.enclosingLibrary;
   final CoreTypes coreTypes = new CoreTypes(component);
 
-  final typeEnvironment =
-      new TypeEnvironment(coreTypes, new ClassHierarchy(component));
+  final ClassHierarchy hierarchy = new ClassHierarchy(component);
+  final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
 
   final actual =
-      new PrintSummaries(target, typeEnvironment, coreTypes).print(library);
+      new PrintSummaries(target, typeEnvironment, coreTypes, hierarchy)
+          .print(library);
 
   compareResultWithExpectationsFile(source, actual);
 }
diff --git a/pkg/vm/test/transformations/type_flow/types_test.dart b/pkg/vm/test/transformations/type_flow/types_test.dart
index 213b6d9..b317843 100644
--- a/pkg/vm/test/transformations/type_flow/types_test.dart
+++ b/pkg/vm/test/transformations/type_flow/types_test.dart
@@ -39,6 +39,8 @@
   Class get futureOrClass =>
       throw "futureOrClass not supported in the types test.";
   Class get futureClass => throw "futureClass not supported in the types test.";
+  Class get functionClass =>
+      throw "functionClass not supported in the types test.";
 }
 
 main() {
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
index 8c9b60b..575ae5f 100644
--- a/pkg/vm/testcases/bytecode/asserts.dart.expect
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   JumpIfNoAsserts      L1
   Push                 FP[-5]
   AssertBoolean        0
@@ -22,24 +22,24 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 3, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::_AssertionError::_throwNew', arg-desc CP#0
 }
 ]static method test1(core::bool condition) → void {
   assert(condition);
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   JumpIfNoAsserts      L1
   Push                 FP[-6]
-  InstanceCall         1, CP#1
+  DynamicCall          1, CP#1
   AssertBoolean        0
   JumpIfTrue           L1
   PushInt              0
   PushInt              0
   Push                 FP[-5]
-  InstanceCall         1, CP#2
+  DynamicCall          1, CP#2
   PushConstant         CP#4
   IndirectStaticCall   3, CP#3
   Drop1
@@ -52,15 +52,15 @@
   [1] = ICData dynamic target-name 'call', arg-desc CP#0
   [2] = ICData dynamic target-name 'call', arg-desc CP#0
   [3] = ArgDesc num-args 3, num-type-args 0, names []
-  [4] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#3
+  [4] = StaticICData target 'dart:core::_AssertionError::_throwNew', arg-desc CP#3
 }
 ]static method test2(() → core::bool condition, () → core::String message) → void {
   assert([@vm.call-site-attributes.metadata=receiverType:() → dart.core::bool] condition.call(), [@vm.call-site-attributes.metadata=receiverType:() → dart.core::String] message.call());
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index 7b37aaa..115e062 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -4,101 +4,202 @@
 import "dart:core" as core;
 
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                3
-  CheckStack
-  Allocate             CP#19
+  CheckStack           0
+  Allocate             CP#21
   StoreLocal           r2
   Push                 r2
   PushNull
-  StoreFieldTOS        CP#20
-  Push                 r2
-  PushNull
   StoreFieldTOS        CP#22
   Push                 r2
-  PushConstant         CP#24
-  StoreFieldTOS        CP#25
+  PushNull
+  StoreFieldTOS        CP#24
+  Push                 r2
+  PushConstant         CP#26
+  StoreFieldTOS        CP#27
   Push                 r2
   PushConstant         CP#0
-  StoreFieldTOS        CP#27
+  StoreFieldTOS        CP#29
   Push                 r2
   Push                 r0
   StoreFieldTOS        CP#1
   ReturnTOS
 }
 ConstantPool {
-  [0] = ClosureFunction <anonymous closure> (dart.async::Future<dart.core::int> x) → dart.async::Future<dart.core::Null> /* originally async */ ;
-  [1] = InstanceField dart.core::_Closure::_context
+  [0] = ClosureFunction 0
+  [1] = InstanceField dart:core::_Closure::_context (field)
   [2] = Reserved
-  [3] = Type dart.async::Future<dart.core::int>
+  [3] = Type dart:async::Future < dart:core::int >
   [4] = String 'x'
   [5] = SubtypeTestCache
-  [6] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::Null]
-  [7] = ArgDesc num-args 1, num-type-args 0, names []
-  [8] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#7
-  [9] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
-  [10] = Null
-  [11] = ArgDesc num-args 4, num-type-args 0, names []
-  [12] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#11
-  [13] = ArgDesc num-args 2, num-type-args 0, names []
-  [14] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#13
-  [15] = Type dynamic
-  [16] = ArgDesc num-args 3, num-type-args 0, names []
-  [17] = ICData target-name 'completeError', arg-desc CP#16
-  [18] = EndClosureFunctionScope
-  [19] = Class dart.core::_Closure
-  [20] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [21] = Reserved
-  [22] = InstanceField dart.core::_Closure::_function_type_arguments
+  [6] = Class dart:async::_AsyncAwaitCompleter
+  [7] = TypeArgumentsForInstanceAllocation dart:async::_AsyncAwaitCompleter [dart:core::Null]
+  [8] = ArgDesc num-args 1, num-type-args 0, names []
+  [9] = StaticICData target 'dart:async::_AsyncAwaitCompleter::'' (constructor)', arg-desc CP#8
+  [10] = ClosureFunction 1
+  [11] = Null
+  [12] = ArgDesc num-args 4, num-type-args 0, names []
+  [13] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#12
+  [14] = ArgDesc num-args 2, num-type-args 0, names []
+  [15] = StaticICData target 'dart:async::_completeOnAsyncReturn', arg-desc CP#14
+  [16] = Type dynamic
+  [17] = ArgDesc num-args 3, num-type-args 0, names []
+  [18] = InterfaceCall target-name 'completeError', arg-desc CP#17
+  [19] = Reserved
+  [20] = EndClosureFunctionScope
+  [21] = Class dart:core::_Closure
+  [22] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [23] = Reserved
-  [24] = EmptyTypeArguments
-  [25] = InstanceField dart.core::_Closure::_delayed_type_arguments
-  [26] = Reserved
-  [27] = InstanceField dart.core::_Closure::_function
+  [24] = InstanceField dart:core::_Closure::_function_type_arguments (field)
+  [25] = Reserved
+  [26] = EmptyTypeArguments
+  [27] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [28] = Reserved
-  [29] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#7
-  [30] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#7
-  [31] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#7
-  [32] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [33] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#13
-  [34] = ICData get target-name 'future', arg-desc CP#7
-  [35] = EndClosureFunctionScope
+  [29] = InstanceField dart:core::_Closure::_function (field)
+  [30] = Reserved
+  [31] = StaticICData target 'dart:async::_asyncStackTraceHelper', arg-desc CP#8
+  [32] = StaticICData target 'dart:async::_asyncThenWrapperHelper', arg-desc CP#8
+  [33] = StaticICData target 'dart:async::_asyncErrorWrapperHelper', arg-desc CP#8
+  [34] = ICData dynamic target-name 'start', arg-desc CP#14
+  [35] = InterfaceCall get target-name 'get:future', arg-desc CP#8
+  [36] = Reserved
+  [37] = EndClosureFunctionScope
 }
-Closure CP#9 {
+Closure #lib::asyncInFieldInitializer (field)::<anonymous closure> (dart:async::Future < dart:core::int > x) -> dart:async::Future < dart:core::Null >
+ClosureBytecode {
+  EntryFixed           2, 4
+  CheckStack           0
+  Push                 FP[-6]
+  LoadFieldTOS         CP#1
+  PopLocal             r0
+  AllocateContext      0, 9
+  PopLocal             r0
+  Push                 r0
+  Push                 FP[-5]
+  StoreContextVar      0, 0
+  Push                 FP[-5]
+  PushConstant         CP#3
+  PushNull
+  PushNull
+  PushConstant         CP#4
+  AssertAssignable     0, CP#5
+  Drop1
+  Push                 r0
+  PushConstant         CP#7
+  PushConstant         CP#6
+  AllocateT
+  StoreLocal           r2
+  Push                 r2
+  PushConstant         CP#9
+  IndirectStaticCall   1, CP#8
+  Drop1
+  StoreContextVar      0, 1
+  Push                 r0
+  PushNull
+  StoreContextVar      0, 2
+  PushNull
+  PopLocal             r3
+  Push                 r0
+  PushNull
+  StoreContextVar      0, 3
+  Push                 r0
+  PushNull
+  StoreContextVar      0, 4
+  Push                 r0
+  PushInt              0
+  StoreContextVar      0, 5
+  Push                 r0
+  PushNull
+  StoreContextVar      0, 6
+  Push                 r0
+  PushNull
+  StoreContextVar      0, 7
+  Push                 r0
+  Allocate             CP#21
+  StoreLocal           r2
+  Push                 r2
+  PushNull
+  StoreFieldTOS        CP#22
+  Push                 r2
+  PushNull
+  StoreFieldTOS        CP#24
+  Push                 r2
+  PushConstant         CP#26
+  StoreFieldTOS        CP#27
+  Push                 r2
+  PushConstant         CP#10
+  StoreFieldTOS        CP#29
+  Push                 r2
+  Push                 r0
+  StoreFieldTOS        CP#1
+  StoreContextVar      0, 8
+  Push                 r0
+  LoadContextVar       0, 8
+  PushConstant         CP#31
+  IndirectStaticCall   1, CP#8
+  PopLocal             r3
+  Push                 r0
+  Push                 r0
+  LoadContextVar       0, 8
+  PushConstant         CP#32
+  IndirectStaticCall   1, CP#8
+  StoreContextVar      0, 3
+  Push                 r0
+  Push                 r0
+  LoadContextVar       0, 8
+  PushConstant         CP#33
+  IndirectStaticCall   1, CP#8
+  StoreContextVar      0, 4
+  Push                 r0
+  LoadContextVar       0, 1
+  Push                 r0
+  LoadContextVar       0, 8
+  DynamicCall          2, CP#34
+  Drop1
+  Push                 r0
+  LoadContextVar       0, 1
+  InterfaceCall        1, CP#35
+  ReturnTOS
+
+}
+
+Closure #lib::asyncInFieldInitializer (field)::Closure/0:::async_op ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
+ClosureBytecode {
   EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#10
-  LoadConstant         r2, CP#10
-  LoadConstant         r3, CP#10
+  LoadConstant         r1, CP#11
+  LoadConstant         r2, CP#11
+  LoadConstant         r3, CP#11
   Frame                6
-  CheckStack
+  CheckStack           0
   Push                 r0
   LoadFieldTOS         CP#1
   PopLocal             r4
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       0, 5
   StoreLocal           r5
   PushInt              0
   JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
-  StoreContextVar      7
+  StoreContextVar      0, 7
 Try #0 start:
   Push                 r4
   PushInt              1
-  StoreContextVar      5
+  StoreContextVar      0, 5
   Push                 r4
   Push                 r4
-  StoreContextVar      6
+  StoreContextVar      0, 6
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       0, 0
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       0, 3
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       0, 4
   Push                 r4
-  LoadContextVar       8
-  PushConstant         CP#12
-  IndirectStaticCall   4, CP#11
+  LoadContextVar       0, 8
+  PushConstant         CP#13
+  IndirectStaticCall   4, CP#12
   PopLocal             r8
   PushNull
   ReturnTOS
@@ -112,11 +213,11 @@
   Push                 r1
   Drop1
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r4
-  LoadContextVar       2
-  PushConstant         CP#14
-  IndirectStaticCall   2, CP#13
+  LoadContextVar       0, 2
+  PushConstant         CP#15
+  IndirectStaticCall   2, CP#14
   Drop1
   PushNull
   ReturnTOS
@@ -127,19 +228,19 @@
   LoadFieldTOS         CP#1
   PopLocal             r4
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       0, 7
   PopLocal             r4
-  MoveSpecial          r6, exception
-  MoveSpecial          r7, stackTrace
+  MoveSpecial          exception, r6
+  MoveSpecial          stackTrace, r7
   Push                 r6
   PopLocal             r8
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#17
+  InterfaceCall        3, CP#18
   Drop1
   Jump                 L3
 L3:
@@ -147,105 +248,13 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       0, 6
   PopLocal             r4
   Jump                 L4
 
 }
-
-Closure CP#0 {
-  EntryFixed           2, 4
-  CheckStack
-  Push                 FP[-6]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  AllocateContext      9
-  PopLocal             r0
-  Push                 r0
-  Push                 FP[-5]
-  StoreContextVar      0
-  Push                 FP[-5]
-  PushConstant         CP#3
-  PushNull
-  PushNull
-  PushConstant         CP#4
-  AssertAssignable     0, CP#5
-  Drop1
-  Push                 r0
-  PushConstant         CP#6
-  PushConstant         CP#8
-  IndirectStaticCall   1, CP#7
-  StoreContextVar      1
-  Push                 r0
-  PushNull
-  StoreContextVar      2
-  PushNull
-  PopLocal             r2
-  Push                 r0
-  PushNull
-  StoreContextVar      3
-  Push                 r0
-  PushNull
-  StoreContextVar      4
-  Push                 r0
-  PushInt              0
-  StoreContextVar      5
-  Push                 r0
-  PushNull
-  StoreContextVar      6
-  Push                 r0
-  PushNull
-  StoreContextVar      7
-  Push                 r0
-  Allocate             CP#19
-  StoreLocal           r3
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#20
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#22
-  Push                 r3
-  PushConstant         CP#24
-  StoreFieldTOS        CP#25
-  Push                 r3
-  PushConstant         CP#9
-  StoreFieldTOS        CP#27
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#1
-  StoreContextVar      8
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#29
-  IndirectStaticCall   1, CP#7
-  PopLocal             r2
-  Push                 r0
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#30
-  IndirectStaticCall   1, CP#7
-  StoreContextVar      3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#31
-  IndirectStaticCall   1, CP#7
-  StoreContextVar      4
-  PushConstant         CP#32
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#33
-  IndirectStaticCall   2, CP#13
-  Drop1
-  Push                 r0
-  LoadContextVar       1
-  InstanceCall         1, CP#34
-  ReturnTOS
-
-}
 ]static field (asy::Future<core::int>) → asy::Future<core::Null> asyncInFieldInitializer = (asy::Future<core::int> x) → asy::Future<core::Null> /* originally async */ {
-  final asy::Completer<core::Null> :async_completer = asy::Completer::sync<core::Null>();
+  final asy::_AsyncAwaitCompleter<core::Null> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null>();
   asy::FutureOr<core::Null> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -269,118 +278,126 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 };
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                7
-  CheckStack
-  AllocateContext      4
+  CheckStack           0
+  AllocateContext      0, 4
   PopLocal             r0
   Push                 r0
+  PushConstant         CP#1
   PushConstant         CP#0
-  PushConstant         CP#2
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      0
+  AllocateT
+  StoreLocal           r2
+  Push                 r2
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
+  Drop1
+  StoreContextVar      0, 0
   Push                 r0
   PushNull
-  StoreContextVar      1
-  PushNull
-  PopLocal             r2
+  StoreContextVar      0, 1
   PushNull
   PopLocal             r3
   PushNull
   PopLocal             r4
+  PushNull
+  PopLocal             r5
   Push                 r0
   PushInt              0
-  StoreContextVar      2
+  StoreContextVar      0, 2
   Push                 r0
   PushNull
-  StoreContextVar      3
-  Allocate             CP#13
-  StoreLocal           r6
-  Push                 r6
-  PushNull
-  StoreFieldTOS        CP#14
-  Push                 r6
+  StoreContextVar      0, 3
+  Allocate             CP#15
+  StoreLocal           r2
+  Push                 r2
   PushNull
   StoreFieldTOS        CP#16
-  Push                 r6
-  PushConstant         CP#18
-  StoreFieldTOS        CP#19
-  Push                 r6
-  PushConstant         CP#3
+  Push                 r2
+  PushNull
+  StoreFieldTOS        CP#18
+  Push                 r2
+  PushConstant         CP#20
   StoreFieldTOS        CP#21
-  Push                 r6
+  Push                 r2
+  PushConstant         CP#4
+  StoreFieldTOS        CP#23
+  Push                 r2
   Push                 r0
-  StoreFieldTOS        CP#5
-  PopLocal             r5
-  Push                 r5
-  PushConstant         CP#23
-  IndirectStaticCall   1, CP#1
-  PopLocal             r2
-  Push                 r5
-  PushConstant         CP#24
-  IndirectStaticCall   1, CP#1
-  PopLocal             r3
-  Push                 r5
+  StoreFieldTOS        CP#6
+  PopLocal             r6
+  Push                 r6
   PushConstant         CP#25
-  IndirectStaticCall   1, CP#1
-  PopLocal             r4
+  IndirectStaticCall   1, CP#2
+  PopLocal             r3
+  Push                 r6
   PushConstant         CP#26
-  Push                 r5
+  IndirectStaticCall   1, CP#2
+  PopLocal             r4
+  Push                 r6
   PushConstant         CP#27
-  IndirectStaticCall   2, CP#7
+  IndirectStaticCall   1, CP#2
+  PopLocal             r5
+  Push                 r0
+  LoadContextVar       0, 0
+  Push                 r6
+  DynamicCall          2, CP#28
   Drop1
   Push                 r0
-  LoadContextVar       0
-  InstanceCall         1, CP#28
+  LoadContextVar       0, 0
+  InterfaceCall        1, CP#29
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::int]
-  [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#1
-  [3] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
-  [4] = Null
-  [5] = InstanceField dart.core::_Closure::_context
-  [6] = Reserved
-  [7] = ArgDesc num-args 2, num-type-args 0, names []
-  [8] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#7
-  [9] = Type dynamic
-  [10] = ArgDesc num-args 3, num-type-args 0, names []
-  [11] = ICData target-name 'completeError', arg-desc CP#10
-  [12] = EndClosureFunctionScope
-  [13] = Class dart.core::_Closure
-  [14] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [15] = Reserved
-  [16] = InstanceField dart.core::_Closure::_function_type_arguments
+  [0] = Class dart:async::_AsyncAwaitCompleter
+  [1] = TypeArgumentsForInstanceAllocation dart:async::_AsyncAwaitCompleter [dart:core::int]
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = StaticICData target 'dart:async::_AsyncAwaitCompleter::'' (constructor)', arg-desc CP#2
+  [4] = ClosureFunction 0
+  [5] = Null
+  [6] = InstanceField dart:core::_Closure::_context (field)
+  [7] = Reserved
+  [8] = ArgDesc num-args 2, num-type-args 0, names []
+  [9] = StaticICData target 'dart:async::_completeOnAsyncReturn', arg-desc CP#8
+  [10] = Type dynamic
+  [11] = ArgDesc num-args 3, num-type-args 0, names []
+  [12] = InterfaceCall target-name 'completeError', arg-desc CP#11
+  [13] = Reserved
+  [14] = EndClosureFunctionScope
+  [15] = Class dart:core::_Closure
+  [16] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [17] = Reserved
-  [18] = EmptyTypeArguments
-  [19] = InstanceField dart.core::_Closure::_delayed_type_arguments
-  [20] = Reserved
-  [21] = InstanceField dart.core::_Closure::_function
+  [18] = InstanceField dart:core::_Closure::_function_type_arguments (field)
+  [19] = Reserved
+  [20] = EmptyTypeArguments
+  [21] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [22] = Reserved
-  [23] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#1
-  [24] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#1
-  [25] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#1
-  [26] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [27] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#7
-  [28] = ICData get target-name 'future', arg-desc CP#1
+  [23] = InstanceField dart:core::_Closure::_function (field)
+  [24] = Reserved
+  [25] = StaticICData target 'dart:async::_asyncStackTraceHelper', arg-desc CP#2
+  [26] = StaticICData target 'dart:async::_asyncThenWrapperHelper', arg-desc CP#2
+  [27] = StaticICData target 'dart:async::_asyncErrorWrapperHelper', arg-desc CP#2
+  [28] = ICData dynamic target-name 'start', arg-desc CP#8
+  [29] = InterfaceCall get target-name 'get:future', arg-desc CP#2
+  [30] = Reserved
 }
-Closure CP#3 {
+Closure #lib::foo:::async_op ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
+ClosureBytecode {
   EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#4
-  LoadConstant         r2, CP#4
-  LoadConstant         r3, CP#4
+  LoadConstant         r1, CP#5
+  LoadConstant         r2, CP#5
+  LoadConstant         r3, CP#5
   Frame                6
-  CheckStack
+  CheckStack           0
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       2
+  LoadContextVar       0, 2
   StoreLocal           r5
   PushInt              0
   JumpIfNeStrict       L1
@@ -389,15 +406,15 @@
 Try #0 start:
   Push                 r4
   PushInt              42
-  StoreContextVar      1
+  StoreContextVar      0, 1
   Jump                 L2
 L2:
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       0, 0
   Push                 r4
-  LoadContextVar       1
-  PushConstant         CP#8
-  IndirectStaticCall   2, CP#7
+  LoadContextVar       0, 1
+  PushConstant         CP#9
+  IndirectStaticCall   2, CP#8
   Drop1
   PushNull
   ReturnTOS
@@ -406,17 +423,17 @@
   SetFrame             10
   Push                 r6
   PopLocal             r4
-  MoveSpecial          r6, exception
-  MoveSpecial          r7, stackTrace
+  MoveSpecial          exception, r6
+  MoveSpecial          stackTrace, r7
   Push                 r6
   PopLocal             r8
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       0, 0
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#11
+  InterfaceCall        3, CP#12
   Drop1
   Jump                 L3
 L3:
@@ -427,7 +444,7 @@
 
 }
 ]static method foo() → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -450,166 +467,175 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
-  AllocateContext      11
+  CheckStack           0
+  AllocateContext      0, 11
   PopLocal             r0
   Push                 r0
   Push                 FP[-6]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      1
+  StoreContextVar      0, 1
   Push                 r0
+  PushConstant         CP#1
   PushConstant         CP#0
-  PushConstant         CP#2
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      2
+  AllocateT
+  StoreLocal           r2
+  Push                 r2
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
+  Drop1
+  StoreContextVar      0, 2
   Push                 r0
   PushNull
-  StoreContextVar      3
+  StoreContextVar      0, 3
   PushNull
-  PopLocal             r2
+  PopLocal             r3
   Push                 r0
   PushNull
-  StoreContextVar      4
+  StoreContextVar      0, 4
   Push                 r0
   PushNull
-  StoreContextVar      5
+  StoreContextVar      0, 5
   Push                 r0
   PushInt              0
-  StoreContextVar      6
+  StoreContextVar      0, 6
   Push                 r0
   PushNull
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r0
   PushNull
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r0
   PushNull
-  StoreContextVar      9
+  StoreContextVar      0, 9
   Push                 r0
-  Allocate             CP#17
-  StoreLocal           r3
-  Push                 r3
+  Allocate             CP#20
+  StoreLocal           r2
+  Push                 r2
   PushNull
-  StoreFieldTOS        CP#18
-  Push                 r3
+  StoreFieldTOS        CP#21
+  Push                 r2
   PushNull
-  StoreFieldTOS        CP#20
-  Push                 r3
-  PushConstant         CP#22
   StoreFieldTOS        CP#23
-  Push                 r3
-  PushConstant         CP#3
-  StoreFieldTOS        CP#25
-  Push                 r3
+  Push                 r2
+  PushConstant         CP#25
+  StoreFieldTOS        CP#26
+  Push                 r2
+  PushConstant         CP#4
+  StoreFieldTOS        CP#28
+  Push                 r2
   Push                 r0
-  StoreFieldTOS        CP#5
-  StoreContextVar      10
+  StoreFieldTOS        CP#6
+  StoreContextVar      0, 10
   Push                 r0
-  LoadContextVar       10
-  PushConstant         CP#27
-  IndirectStaticCall   1, CP#1
-  PopLocal             r2
-  Push                 r0
-  Push                 r0
-  LoadContextVar       10
-  PushConstant         CP#28
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      4
-  Push                 r0
-  Push                 r0
-  LoadContextVar       10
-  PushConstant         CP#29
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      5
+  LoadContextVar       0, 10
   PushConstant         CP#30
+  IndirectStaticCall   1, CP#2
+  PopLocal             r3
   Push                 r0
-  LoadContextVar       10
+  Push                 r0
+  LoadContextVar       0, 10
   PushConstant         CP#31
-  IndirectStaticCall   2, CP#10
+  IndirectStaticCall   1, CP#2
+  StoreContextVar      0, 4
+  Push                 r0
+  Push                 r0
+  LoadContextVar       0, 10
+  PushConstant         CP#32
+  IndirectStaticCall   1, CP#2
+  StoreContextVar      0, 5
+  Push                 r0
+  LoadContextVar       0, 2
+  Push                 r0
+  LoadContextVar       0, 10
+  DynamicCall          2, CP#33
   Drop1
   Push                 r0
-  LoadContextVar       2
-  InstanceCall         1, CP#32
+  LoadContextVar       0, 2
+  InterfaceCall        1, CP#34
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::int]
-  [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#1
-  [3] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
-  [4] = Null
-  [5] = InstanceField dart.core::_Closure::_context
-  [6] = Reserved
-  [7] = ArgDesc num-args 4, num-type-args 0, names []
-  [8] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
-  [9] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
-  [10] = ArgDesc num-args 2, num-type-args 0, names []
-  [11] = ICData target-name '+', arg-desc CP#10
-  [12] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#10
-  [13] = Type dynamic
-  [14] = ArgDesc num-args 3, num-type-args 0, names []
-  [15] = ICData target-name 'completeError', arg-desc CP#14
-  [16] = EndClosureFunctionScope
-  [17] = Class dart.core::_Closure
-  [18] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [19] = Reserved
-  [20] = InstanceField dart.core::_Closure::_function_type_arguments
-  [21] = Reserved
-  [22] = EmptyTypeArguments
-  [23] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [0] = Class dart:async::_AsyncAwaitCompleter
+  [1] = TypeArgumentsForInstanceAllocation dart:async::_AsyncAwaitCompleter [dart:core::int]
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = StaticICData target 'dart:async::_AsyncAwaitCompleter::'' (constructor)', arg-desc CP#2
+  [4] = ClosureFunction 0
+  [5] = Null
+  [6] = InstanceField dart:core::_Closure::_context (field)
+  [7] = Reserved
+  [8] = ArgDesc num-args 4, num-type-args 0, names []
+  [9] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#8
+  [10] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#8
+  [11] = ArgDesc num-args 2, num-type-args 0, names []
+  [12] = InterfaceCall target-name '+', arg-desc CP#11
+  [13] = Reserved
+  [14] = StaticICData target 'dart:async::_completeOnAsyncReturn', arg-desc CP#11
+  [15] = Type dynamic
+  [16] = ArgDesc num-args 3, num-type-args 0, names []
+  [17] = InterfaceCall target-name 'completeError', arg-desc CP#16
+  [18] = Reserved
+  [19] = EndClosureFunctionScope
+  [20] = Class dart:core::_Closure
+  [21] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
+  [22] = Reserved
+  [23] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [24] = Reserved
-  [25] = InstanceField dart.core::_Closure::_function
-  [26] = Reserved
-  [27] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#1
-  [28] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#1
-  [29] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#1
-  [30] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [31] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#10
-  [32] = ICData get target-name 'future', arg-desc CP#1
+  [25] = EmptyTypeArguments
+  [26] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
+  [27] = Reserved
+  [28] = InstanceField dart:core::_Closure::_function (field)
+  [29] = Reserved
+  [30] = StaticICData target 'dart:async::_asyncStackTraceHelper', arg-desc CP#2
+  [31] = StaticICData target 'dart:async::_asyncThenWrapperHelper', arg-desc CP#2
+  [32] = StaticICData target 'dart:async::_asyncErrorWrapperHelper', arg-desc CP#2
+  [33] = ICData dynamic target-name 'start', arg-desc CP#11
+  [34] = InterfaceCall get target-name 'get:future', arg-desc CP#2
+  [35] = Reserved
 }
-Closure CP#3 {
+Closure #lib::simpleAsyncAwait:::async_op ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
+ClosureBytecode {
   EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#4
-  LoadConstant         r2, CP#4
-  LoadConstant         r3, CP#4
+  LoadConstant         r1, CP#5
+  LoadConstant         r2, CP#5
+  LoadConstant         r3, CP#5
   Frame                6
-  CheckStack
+  CheckStack           0
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       0, 6
   StoreLocal           r5
   PushInt              0
   JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
-  StoreContextVar      8
+  StoreContextVar      0, 8
 Try #0 start:
   Push                 r4
   PushInt              1
-  StoreContextVar      6
+  StoreContextVar      0, 6
   Push                 r4
   Push                 r4
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       0, 0
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       0, 4
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       0, 5
   Push                 r4
-  LoadContextVar       10
-  PushConstant         CP#8
-  IndirectStaticCall   4, CP#7
+  LoadContextVar       0, 10
+  PushConstant         CP#9
+  IndirectStaticCall   4, CP#8
   PopLocal             r8
   PushNull
   ReturnTOS
@@ -622,23 +648,23 @@
 L2:
   Push                 r4
   Push                 r1
-  StoreContextVar      9
+  StoreContextVar      0, 9
   Push                 r4
   PushInt              2
-  StoreContextVar      6
+  StoreContextVar      0, 6
   Push                 r4
   Push                 r4
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       0, 4
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       0, 5
   Push                 r4
-  LoadContextVar       10
-  PushConstant         CP#9
-  IndirectStaticCall   4, CP#7
+  LoadContextVar       0, 10
+  PushConstant         CP#10
+  IndirectStaticCall   4, CP#8
   PopLocal             r9
   PushNull
   ReturnTOS
@@ -651,18 +677,18 @@
 L3:
   Push                 r4
   Push                 r4
-  LoadContextVar       9
+  LoadContextVar       0, 9
   Push                 r1
-  InstanceCall         2, CP#11
-  StoreContextVar      3
+  InterfaceCall        2, CP#12
+  StoreContextVar      0, 3
   Jump                 L4
 L4:
   Push                 r4
-  LoadContextVar       2
+  LoadContextVar       0, 2
   Push                 r4
-  LoadContextVar       3
-  PushConstant         CP#12
-  IndirectStaticCall   2, CP#10
+  LoadContextVar       0, 3
+  PushConstant         CP#14
+  IndirectStaticCall   2, CP#11
   Drop1
   PushNull
   ReturnTOS
@@ -670,22 +696,22 @@
 Try #0 handler:
   SetFrame             10
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       8
+  LoadContextVar       0, 8
   PopLocal             r4
-  MoveSpecial          r6, exception
-  MoveSpecial          r7, stackTrace
+  MoveSpecial          exception, r6
+  MoveSpecial          stackTrace, r7
   Push                 r6
   PopLocal             r8
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       2
+  LoadContextVar       0, 2
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#15
+  InterfaceCall        3, CP#17
   Drop1
   Jump                 L5
 L5:
@@ -693,7 +719,7 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       0, 7
   PopLocal             r4
   Push                 r5
   PushInt              1
@@ -702,7 +728,7 @@
 
 }
 ]static method simpleAsyncAwait(asy::Future<core::int> a, asy::Future<core::int> b) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -730,156 +756,167 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
-  AllocateContext      11
+  CheckStack           0
+  AllocateContext      0, 11
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 r0
+  PushConstant         CP#1
   PushConstant         CP#0
-  PushConstant         CP#2
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      1
+  AllocateT
+  StoreLocal           r2
+  Push                 r2
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
+  Drop1
+  StoreContextVar      0, 1
   Push                 r0
   PushNull
-  StoreContextVar      2
+  StoreContextVar      0, 2
   PushNull
-  PopLocal             r2
+  PopLocal             r3
   Push                 r0
   PushNull
-  StoreContextVar      3
+  StoreContextVar      0, 3
   Push                 r0
   PushNull
-  StoreContextVar      4
+  StoreContextVar      0, 4
   Push                 r0
   PushInt              0
-  StoreContextVar      5
+  StoreContextVar      0, 5
   Push                 r0
   PushNull
-  StoreContextVar      6
+  StoreContextVar      0, 6
   Push                 r0
   PushNull
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r0
   PushNull
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r0
   PushNull
-  StoreContextVar      9
+  StoreContextVar      0, 9
   Push                 r0
-  Allocate             CP#22
-  StoreLocal           r3
-  Push                 r3
+  Allocate             CP#27
+  StoreLocal           r2
+  Push                 r2
   PushNull
-  StoreFieldTOS        CP#23
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#25
-  Push                 r3
-  PushConstant         CP#27
   StoreFieldTOS        CP#28
-  Push                 r3
-  PushConstant         CP#3
+  Push                 r2
+  PushNull
   StoreFieldTOS        CP#30
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#5
-  StoreContextVar      10
-  Push                 r0
-  LoadContextVar       10
+  Push                 r2
   PushConstant         CP#32
-  IndirectStaticCall   1, CP#1
-  PopLocal             r2
+  StoreFieldTOS        CP#33
+  Push                 r2
+  PushConstant         CP#4
+  StoreFieldTOS        CP#35
+  Push                 r2
+  Push                 r0
+  StoreFieldTOS        CP#6
+  StoreContextVar      0, 10
+  Push                 r0
+  LoadContextVar       0, 10
+  PushConstant         CP#37
+  IndirectStaticCall   1, CP#2
+  PopLocal             r3
   Push                 r0
   Push                 r0
-  LoadContextVar       10
-  PushConstant         CP#33
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      3
+  LoadContextVar       0, 10
+  PushConstant         CP#38
+  IndirectStaticCall   1, CP#2
+  StoreContextVar      0, 3
   Push                 r0
   Push                 r0
-  LoadContextVar       10
-  PushConstant         CP#34
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      4
-  PushConstant         CP#35
+  LoadContextVar       0, 10
+  PushConstant         CP#39
+  IndirectStaticCall   1, CP#2
+  StoreContextVar      0, 4
   Push                 r0
-  LoadContextVar       10
-  PushConstant         CP#36
-  IndirectStaticCall   2, CP#14
+  LoadContextVar       0, 1
+  Push                 r0
+  LoadContextVar       0, 10
+  DynamicCall          2, CP#40
   Drop1
   Push                 r0
-  LoadContextVar       1
-  InstanceCall         1, CP#37
+  LoadContextVar       0, 1
+  InterfaceCall        1, CP#41
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::int]
-  [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#1
-  [3] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
-  [4] = Null
-  [5] = InstanceField dart.core::_Closure::_context
-  [6] = Reserved
-  [7] = ICData get target-name 'iterator', arg-desc CP#1
-  [8] = ICData target-name 'moveNext', arg-desc CP#1
-  [9] = ICData get target-name 'current', arg-desc CP#1
-  [10] = ArgDesc num-args 0, num-type-args 0, names []
-  [11] = StaticICData target '#lib::foo', arg-desc CP#10
-  [12] = ArgDesc num-args 4, num-type-args 0, names []
-  [13] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#12
-  [14] = ArgDesc num-args 2, num-type-args 0, names []
-  [15] = ICData target-name '+', arg-desc CP#14
-  [16] = ICData target-name '+', arg-desc CP#14
-  [17] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#14
-  [18] = Type dynamic
-  [19] = ArgDesc num-args 3, num-type-args 0, names []
-  [20] = ICData target-name 'completeError', arg-desc CP#19
-  [21] = EndClosureFunctionScope
-  [22] = Class dart.core::_Closure
-  [23] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [24] = Reserved
-  [25] = InstanceField dart.core::_Closure::_function_type_arguments
-  [26] = Reserved
-  [27] = EmptyTypeArguments
-  [28] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [0] = Class dart:async::_AsyncAwaitCompleter
+  [1] = TypeArgumentsForInstanceAllocation dart:async::_AsyncAwaitCompleter [dart:core::int]
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = StaticICData target 'dart:async::_AsyncAwaitCompleter::'' (constructor)', arg-desc CP#2
+  [4] = ClosureFunction 0
+  [5] = Null
+  [6] = InstanceField dart:core::_Closure::_context (field)
+  [7] = Reserved
+  [8] = InterfaceCall get target-name 'get:iterator', arg-desc CP#2
+  [9] = Reserved
+  [10] = InterfaceCall target-name 'moveNext', arg-desc CP#2
+  [11] = Reserved
+  [12] = InterfaceCall get target-name 'get:current', arg-desc CP#2
+  [13] = Reserved
+  [14] = ArgDesc num-args 0, num-type-args 0, names []
+  [15] = StaticICData target '#lib::foo', arg-desc CP#14
+  [16] = ArgDesc num-args 4, num-type-args 0, names []
+  [17] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#16
+  [18] = ArgDesc num-args 2, num-type-args 0, names []
+  [19] = InterfaceCall target-name '+', arg-desc CP#18
+  [20] = Reserved
+  [21] = StaticICData target 'dart:async::_completeOnAsyncReturn', arg-desc CP#18
+  [22] = Type dynamic
+  [23] = ArgDesc num-args 3, num-type-args 0, names []
+  [24] = InterfaceCall target-name 'completeError', arg-desc CP#23
+  [25] = Reserved
+  [26] = EndClosureFunctionScope
+  [27] = Class dart:core::_Closure
+  [28] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [29] = Reserved
-  [30] = InstanceField dart.core::_Closure::_function
+  [30] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [31] = Reserved
-  [32] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#1
-  [33] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#1
-  [34] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#1
-  [35] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [36] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#14
-  [37] = ICData get target-name 'future', arg-desc CP#1
+  [32] = EmptyTypeArguments
+  [33] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
+  [34] = Reserved
+  [35] = InstanceField dart:core::_Closure::_function (field)
+  [36] = Reserved
+  [37] = StaticICData target 'dart:async::_asyncStackTraceHelper', arg-desc CP#2
+  [38] = StaticICData target 'dart:async::_asyncThenWrapperHelper', arg-desc CP#2
+  [39] = StaticICData target 'dart:async::_asyncErrorWrapperHelper', arg-desc CP#2
+  [40] = ICData dynamic target-name 'start', arg-desc CP#18
+  [41] = InterfaceCall get target-name 'get:future', arg-desc CP#2
+  [42] = Reserved
 }
-Closure CP#3 {
+Closure #lib::loops:::async_op ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
+ClosureBytecode {
   EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#4
-  LoadConstant         r2, CP#4
-  LoadConstant         r3, CP#4
+  LoadConstant         r1, CP#5
+  LoadConstant         r2, CP#5
+  LoadConstant         r3, CP#5
   Frame                7
-  CheckStack
+  CheckStack           0
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       0, 5
   StoreLocal           r5
   PushInt              0
   JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
-  StoreContextVar      7
+  StoreContextVar      0, 7
 Try #0 start:
-  AllocateContext      1
+  AllocateContext      1, 1
   StoreLocal           r5
   Push                 r5
   Push                 r4
@@ -887,8 +924,8 @@
   PopLocal             r4
   Push                 r4
   PushInt              0
-  StoreContextVar      0
-  AllocateContext      2
+  StoreContextVar      1, 0
+  AllocateContext      2, 2
   StoreLocal           r5
   Push                 r5
   Push                 r4
@@ -896,32 +933,31 @@
   PopLocal             r4
   Push                 r4
   PushInt              0
-  StoreContextVar      0
+  StoreContextVar      2, 0
 L6:
-  CheckStack
+  CheckStack           1
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       2, 0
   PushInt              10
   CompareIntLt
-  AssertBoolean        0
   JumpIfFalse          L2
   Push                 r4
   LoadContextParent
   LoadContextParent
-  LoadContextVar       0
-  InstanceCall         1, CP#7
+  LoadContextVar       0, 0
+  InterfaceCall        1, CP#8
   PopLocal             r8
   Push                 r4
   Push                 r8
-  StoreContextVar      1
+  StoreContextVar      2, 1
 L5:
-  CheckStack
+  CheckStack           2
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       2, 1
   StoreLocal           r8
-  InstanceCall         1, CP#8
+  InterfaceCall        1, CP#10
   JumpIfFalse          L3
-  AllocateContext      1
+  AllocateContext      3, 1
   StoreLocal           r5
   Push                 r5
   Push                 r4
@@ -929,8 +965,8 @@
   PopLocal             r4
   Push                 r4
   Push                 r8
-  InstanceCall         1, CP#9
-  StoreContextVar      0
+  InterfaceCall        1, CP#12
+  StoreContextVar      3, 0
   Push                 r4
   LoadContextParent
   LoadContextParent
@@ -938,50 +974,50 @@
   Push                 r4
   LoadContextParent
   LoadContextParent
-  LoadContextVar       0
-  StoreContextVar      9
+  LoadContextVar       1, 0
+  StoreContextVar      0, 9
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
   Push                 r4
   LoadContextParent
-  LoadContextVar       0
+  LoadContextVar       2, 0
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       3, 0
   AddInt
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
   PushInt              1
-  StoreContextVar      5
+  StoreContextVar      0, 5
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
   Push                 r4
-  StoreContextVar      6
-  PushConstant         CP#11
-  IndirectStaticCall   0, CP#10
+  StoreContextVar      0, 6
+  PushConstant         CP#15
+  IndirectStaticCall   0, CP#14
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextVar       3
+  LoadContextVar       0, 3
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextVar       4
+  LoadContextVar       0, 4
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextVar       10
-  PushConstant         CP#13
-  IndirectStaticCall   4, CP#12
+  LoadContextVar       0, 10
+  PushConstant         CP#17
+  IndirectStaticCall   4, CP#16
   PopLocal             r10
   PushNull
   ReturnTOS
@@ -999,31 +1035,31 @@
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextVar       9
+  LoadContextVar       0, 9
   Push                 r4
   LoadContextParent
   LoadContextParent
   LoadContextParent
-  LoadContextVar       8
+  LoadContextVar       0, 8
   Push                 r1
-  InstanceCall         2, CP#15
-  InstanceCall         2, CP#16
-  StoreContextVar      0
+  InterfaceCall        2, CP#19
+  InterfaceCall        2, CP#19
+  StoreContextVar      1, 0
   Push                 r4
   LoadContextParent
   PopLocal             r4
   Jump                 L5
 L3:
   Push                 r4
-  CloneContext
+  CloneContext         2, 2
   PopLocal             r4
   Push                 r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       2, 0
   PushInt              1
   AddInt
   StoreLocal           r8
-  StoreContextVar      0
+  StoreContextVar      2, 0
   Push                 r8
   Drop1
   Jump                 L6
@@ -1034,18 +1070,17 @@
   PushInt              0
   PopLocal             r8
 L8:
-  CheckStack
+  CheckStack           1
   Push                 r8
   PushInt              10
   CompareIntLt
-  AssertBoolean        0
   JumpIfFalse          L7
   Push                 r4
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       1, 0
   Push                 r8
   AddInt
-  StoreContextVar      0
+  StoreContextVar      1, 0
   Push                 r8
   PushInt              1
   AddInt
@@ -1056,19 +1091,19 @@
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      2
+  LoadContextVar       1, 0
+  StoreContextVar      0, 2
   Push                 r4
   LoadContextParent
   PopLocal             r4
   Jump                 L9
 L9:
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r4
-  LoadContextVar       2
-  PushConstant         CP#17
-  IndirectStaticCall   2, CP#14
+  LoadContextVar       0, 2
+  PushConstant         CP#21
+  IndirectStaticCall   2, CP#18
   Drop1
   PushNull
   ReturnTOS
@@ -1076,22 +1111,22 @@
 Try #0 handler:
   SetFrame             11
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       0, 7
   PopLocal             r4
-  MoveSpecial          r6, exception
-  MoveSpecial          r7, stackTrace
+  MoveSpecial          exception, r6
+  MoveSpecial          stackTrace, r7
   Push                 r6
   PopLocal             r8
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#20
+  InterfaceCall        3, CP#24
   Drop1
   Jump                 L10
 L10:
@@ -1099,13 +1134,13 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       0, 6
   PopLocal             r4
   Jump                 L11
 
 }
 ]static method loops(core::List<core::int> list) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -1143,179 +1178,185 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
-  AllocateContext      16
+  CheckStack           0
+  AllocateContext      0, 16
   PopLocal             r0
   Push                 r0
   Push                 FP[-7]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 r0
   Push                 FP[-6]
-  StoreContextVar      1
+  StoreContextVar      0, 1
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      2
+  StoreContextVar      0, 2
   Push                 r0
+  PushConstant         CP#1
   PushConstant         CP#0
-  PushConstant         CP#2
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      3
+  AllocateT
+  StoreLocal           r2
+  Push                 r2
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
+  Drop1
+  StoreContextVar      0, 3
   Push                 r0
   PushNull
-  StoreContextVar      4
+  StoreContextVar      0, 4
   PushNull
-  PopLocal             r2
+  PopLocal             r3
   Push                 r0
   PushNull
-  StoreContextVar      5
+  StoreContextVar      0, 5
   Push                 r0
   PushNull
-  StoreContextVar      6
+  StoreContextVar      0, 6
   Push                 r0
   PushInt              0
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r0
   PushNull
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r0
   PushNull
-  StoreContextVar      9
+  StoreContextVar      0, 9
   Push                 r0
   PushNull
-  StoreContextVar      10
+  StoreContextVar      0, 10
   Push                 r0
   PushNull
-  StoreContextVar      11
+  StoreContextVar      0, 11
   Push                 r0
   PushNull
-  StoreContextVar      12
+  StoreContextVar      0, 12
   Push                 r0
   PushNull
-  StoreContextVar      13
+  StoreContextVar      0, 13
   Push                 r0
   PushNull
-  StoreContextVar      14
+  StoreContextVar      0, 14
   Push                 r0
   Allocate             CP#30
-  StoreLocal           r3
-  Push                 r3
+  StoreLocal           r2
+  Push                 r2
   PushNull
   StoreFieldTOS        CP#31
-  Push                 r3
+  Push                 r2
   PushNull
   StoreFieldTOS        CP#33
-  Push                 r3
+  Push                 r2
   PushConstant         CP#35
   StoreFieldTOS        CP#36
-  Push                 r3
-  PushConstant         CP#3
+  Push                 r2
+  PushConstant         CP#4
   StoreFieldTOS        CP#38
-  Push                 r3
+  Push                 r2
   Push                 r0
-  StoreFieldTOS        CP#5
-  StoreContextVar      15
+  StoreFieldTOS        CP#6
+  StoreContextVar      0, 15
   Push                 r0
-  LoadContextVar       15
+  LoadContextVar       0, 15
   PushConstant         CP#40
-  IndirectStaticCall   1, CP#1
-  PopLocal             r2
+  IndirectStaticCall   1, CP#2
+  PopLocal             r3
   Push                 r0
   Push                 r0
-  LoadContextVar       15
+  LoadContextVar       0, 15
   PushConstant         CP#41
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      5
+  IndirectStaticCall   1, CP#2
+  StoreContextVar      0, 5
   Push                 r0
   Push                 r0
-  LoadContextVar       15
+  LoadContextVar       0, 15
   PushConstant         CP#42
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      6
-  PushConstant         CP#43
+  IndirectStaticCall   1, CP#2
+  StoreContextVar      0, 6
   Push                 r0
-  LoadContextVar       15
-  PushConstant         CP#44
-  IndirectStaticCall   2, CP#9
+  LoadContextVar       0, 3
+  Push                 r0
+  LoadContextVar       0, 15
+  DynamicCall          2, CP#43
   Drop1
   Push                 r0
-  LoadContextVar       3
-  InstanceCall         1, CP#45
+  LoadContextVar       0, 3
+  InterfaceCall        1, CP#44
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::int]
-  [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#1
-  [3] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
-  [4] = Null
-  [5] = InstanceField dart.core::_Closure::_context
-  [6] = Reserved
-  [7] = ArgDesc num-args 4, num-type-args 0, names []
-  [8] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
-  [9] = ArgDesc num-args 2, num-type-args 0, names []
-  [10] = ICData target-name '+', arg-desc CP#9
-  [11] = Type dynamic
-  [12] = Type dart.core::Error
-  [13] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#9
-  [14] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
-  [15] = ICData target-name '+', arg-desc CP#9
-  [16] = String 'fin'
-  [17] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [18] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
-  [19] = ICData target-name '+', arg-desc CP#9
-  [20] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [21] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
-  [22] = ICData target-name '+', arg-desc CP#9
-  [23] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [24] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
-  [25] = ICData target-name '+', arg-desc CP#9
-  [26] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#9
-  [27] = ArgDesc num-args 3, num-type-args 0, names []
-  [28] = ICData target-name 'completeError', arg-desc CP#27
+  [0] = Class dart:async::_AsyncAwaitCompleter
+  [1] = TypeArgumentsForInstanceAllocation dart:async::_AsyncAwaitCompleter [dart:core::int]
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = StaticICData target 'dart:async::_AsyncAwaitCompleter::'' (constructor)', arg-desc CP#2
+  [4] = ClosureFunction 0
+  [5] = Null
+  [6] = InstanceField dart:core::_Closure::_context (field)
+  [7] = Reserved
+  [8] = ArgDesc num-args 4, num-type-args 0, names []
+  [9] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#8
+  [10] = ArgDesc num-args 2, num-type-args 0, names []
+  [11] = InterfaceCall target-name '+', arg-desc CP#10
+  [12] = Reserved
+  [13] = Type dynamic
+  [14] = Type dart:core::Error
+  [15] = InterfaceCall target-name '_simpleInstanceOf', arg-desc CP#10
+  [16] = Reserved
+  [17] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#8
+  [18] = String 'fin'
+  [19] = StaticICData target 'dart:core::print', arg-desc CP#2
+  [20] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#8
+  [21] = StaticICData target 'dart:core::print', arg-desc CP#2
+  [22] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#8
+  [23] = StaticICData target 'dart:core::print', arg-desc CP#2
+  [24] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#8
+  [25] = StaticICData target 'dart:async::_completeOnAsyncReturn', arg-desc CP#10
+  [26] = ArgDesc num-args 3, num-type-args 0, names []
+  [27] = InterfaceCall target-name 'completeError', arg-desc CP#26
+  [28] = Reserved
   [29] = EndClosureFunctionScope
-  [30] = Class dart.core::_Closure
-  [31] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [30] = Class dart:core::_Closure
+  [31] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [32] = Reserved
-  [33] = InstanceField dart.core::_Closure::_function_type_arguments
+  [33] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [34] = Reserved
   [35] = EmptyTypeArguments
-  [36] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [36] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [37] = Reserved
-  [38] = InstanceField dart.core::_Closure::_function
+  [38] = InstanceField dart:core::_Closure::_function (field)
   [39] = Reserved
-  [40] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#1
-  [41] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#1
-  [42] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#1
-  [43] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [44] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#9
-  [45] = ICData get target-name 'future', arg-desc CP#1
+  [40] = StaticICData target 'dart:async::_asyncStackTraceHelper', arg-desc CP#2
+  [41] = StaticICData target 'dart:async::_asyncThenWrapperHelper', arg-desc CP#2
+  [42] = StaticICData target 'dart:async::_asyncErrorWrapperHelper', arg-desc CP#2
+  [43] = ICData dynamic target-name 'start', arg-desc CP#10
+  [44] = InterfaceCall get target-name 'get:future', arg-desc CP#2
+  [45] = Reserved
 }
-Closure CP#3 {
+Closure #lib::tryCatchRethrow:::async_op ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
+ClosureBytecode {
   EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#4
-  LoadConstant         r2, CP#4
-  LoadConstant         r3, CP#4
+  LoadConstant         r1, CP#5
+  LoadConstant         r2, CP#5
+  LoadConstant         r3, CP#5
   Frame                10
-  CheckStack
+  CheckStack           0
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       0, 7
   StoreLocal           r5
   PushInt              0
   JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
-  StoreContextVar      9
+  StoreContextVar      0, 9
 Try #0 start:
-  AllocateContext      2
+  AllocateContext      1, 2
   StoreLocal           r5
   Push                 r5
   Push                 r4
@@ -1323,44 +1364,44 @@
   PopLocal             r4
   Push                 r4
   PushInt              1
-  StoreContextVar      0
+  StoreContextVar      1, 0
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      10
+  StoreContextVar      0, 10
 Try #1 start:
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      11
+  StoreContextVar      0, 11
 Try #2 start:
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      14
+  LoadContextVar       1, 0
+  StoreContextVar      0, 14
   Push                 r4
   LoadContextParent
   PushInt              1
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r4
   LoadContextParent
-  LoadContextVar       0
+  LoadContextVar       0, 0
   Push                 r4
   LoadContextParent
-  LoadContextVar       5
+  LoadContextVar       0, 5
   Push                 r4
   LoadContextParent
-  LoadContextVar       6
+  LoadContextVar       0, 6
   Push                 r4
   LoadContextParent
-  LoadContextVar       15
-  PushConstant         CP#8
-  IndirectStaticCall   4, CP#7
+  LoadContextVar       0, 15
+  PushConstant         CP#9
+  IndirectStaticCall   4, CP#8
   PopLocal             r13
   PushNull
   ReturnTOS
@@ -1374,72 +1415,71 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       14
+  LoadContextVar       0, 14
   Push                 r1
-  InstanceCall         2, CP#10
-  StoreContextVar      0
+  InterfaceCall        2, CP#11
+  StoreContextVar      1, 0
   Jump                 L3
 Try #2 end:
 Try #2 handler:
   SetFrame             14
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       11
+  LoadContextVar       0, 11
   PopLocal             r4
-  MoveSpecial          r10, exception
-  MoveSpecial          r11, stackTrace
+  MoveSpecial          exception, r10
+  MoveSpecial          stackTrace, r11
   Push                 r4
   LoadContextParent
   Push                 r10
-  StoreContextVar      12
+  StoreContextVar      0, 12
   Push                 r4
   LoadContextParent
   Push                 r11
-  StoreContextVar      13
+  StoreContextVar      0, 13
   Push                 r4
   Push                 r10
-  StoreContextVar      1
+  StoreContextVar      1, 1
   Push                 r4
-  LoadContextVar       1
-  PushConstant         CP#12
-  InstanceCall         2, CP#13
-  AssertBoolean        0
+  LoadContextVar       1, 1
+  PushConstant         CP#14
+  InterfaceCall        2, CP#15
   JumpIfFalse          L4
   Push                 r4
   LoadContextParent
   PushInt              42
-  StoreContextVar      4
+  StoreContextVar      0, 4
   Jump                 L5
 L4:
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      14
+  LoadContextVar       1, 0
+  StoreContextVar      0, 14
   Push                 r4
   LoadContextParent
   PushInt              2
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r4
   LoadContextParent
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r4
   LoadContextParent
-  LoadContextVar       5
+  LoadContextVar       0, 5
   Push                 r4
   LoadContextParent
-  LoadContextVar       6
+  LoadContextVar       0, 6
   Push                 r4
   LoadContextParent
-  LoadContextVar       15
-  PushConstant         CP#14
-  IndirectStaticCall   4, CP#7
+  LoadContextVar       0, 15
+  PushConstant         CP#17
+  IndirectStaticCall   4, CP#8
   PopLocal             r13
   PushNull
   ReturnTOS
@@ -1453,16 +1493,16 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       14
+  LoadContextVar       0, 14
   Push                 r1
-  InstanceCall         2, CP#15
-  StoreContextVar      0
+  InterfaceCall        2, CP#11
+  StoreContextVar      1, 0
   Push                 r4
   LoadContextParent
-  LoadContextVar       12
+  LoadContextVar       0, 12
   Push                 r4
   LoadContextParent
-  LoadContextVar       13
+  LoadContextVar       0, 13
   Throw                1
 L3:
   Jump                 L7
@@ -1470,52 +1510,52 @@
 Try #1 handler:
   SetFrame             14
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       10
+  LoadContextVar       0, 10
   PopLocal             r4
-  MoveSpecial          r8, exception
-  MoveSpecial          r9, stackTrace
+  MoveSpecial          exception, r8
+  MoveSpecial          stackTrace, r9
   Push                 r4
   LoadContextParent
   Push                 r8
-  StoreContextVar      12
+  StoreContextVar      0, 12
   Push                 r4
   LoadContextParent
   Push                 r9
-  StoreContextVar      13
-  PushConstant         CP#16
-  PushConstant         CP#17
-  IndirectStaticCall   1, CP#1
+  StoreContextVar      0, 13
+  PushConstant         CP#18
+  PushConstant         CP#19
+  IndirectStaticCall   1, CP#2
   Drop1
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      14
+  LoadContextVar       1, 0
+  StoreContextVar      0, 14
   Push                 r4
   LoadContextParent
   PushInt              3
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r4
   LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       0, 2
   Push                 r4
   LoadContextParent
-  LoadContextVar       5
+  LoadContextVar       0, 5
   Push                 r4
   LoadContextParent
-  LoadContextVar       6
+  LoadContextVar       0, 6
   Push                 r4
   LoadContextParent
-  LoadContextVar       15
-  PushConstant         CP#18
-  IndirectStaticCall   4, CP#7
+  LoadContextVar       0, 15
+  PushConstant         CP#20
+  IndirectStaticCall   4, CP#8
   PopLocal             r12
   PushNull
   ReturnTOS
@@ -1529,57 +1569,57 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       14
+  LoadContextVar       0, 14
   Push                 r1
-  InstanceCall         2, CP#19
-  StoreContextVar      0
+  InterfaceCall        2, CP#11
+  StoreContextVar      1, 0
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      4
+  LoadContextVar       1, 0
+  StoreContextVar      0, 4
   Push                 r4
   LoadContextParent
   PopLocal             r4
   Jump                 L9
 L5:
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       10
+  LoadContextVar       0, 10
   PopLocal             r4
-  PushConstant         CP#16
-  PushConstant         CP#20
-  IndirectStaticCall   1, CP#1
+  PushConstant         CP#18
+  PushConstant         CP#21
+  IndirectStaticCall   1, CP#2
   Drop1
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      14
+  LoadContextVar       1, 0
+  StoreContextVar      0, 14
   Push                 r4
   LoadContextParent
   PushInt              4
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r4
   LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       0, 2
   Push                 r4
   LoadContextParent
-  LoadContextVar       5
+  LoadContextVar       0, 5
   Push                 r4
   LoadContextParent
-  LoadContextVar       6
+  LoadContextVar       0, 6
   Push                 r4
   LoadContextParent
-  LoadContextVar       15
-  PushConstant         CP#21
-  IndirectStaticCall   4, CP#7
+  LoadContextVar       0, 15
+  PushConstant         CP#22
+  IndirectStaticCall   4, CP#8
   PopLocal             r12
   PushNull
   ReturnTOS
@@ -1593,57 +1633,57 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       14
+  LoadContextVar       0, 14
   Push                 r1
-  InstanceCall         2, CP#22
-  StoreContextVar      0
+  InterfaceCall        2, CP#11
+  StoreContextVar      1, 0
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      4
+  LoadContextVar       1, 0
+  StoreContextVar      0, 4
   Push                 r4
   LoadContextParent
   PopLocal             r4
   Jump                 L9
 L7:
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       10
+  LoadContextVar       0, 10
   PopLocal             r4
-  PushConstant         CP#16
+  PushConstant         CP#18
   PushConstant         CP#23
-  IndirectStaticCall   1, CP#1
+  IndirectStaticCall   1, CP#2
   Drop1
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      14
+  LoadContextVar       1, 0
+  StoreContextVar      0, 14
   Push                 r4
   LoadContextParent
   PushInt              5
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      8
+  StoreContextVar      0, 8
   Push                 r4
   LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       0, 2
   Push                 r4
   LoadContextParent
-  LoadContextVar       5
+  LoadContextVar       0, 5
   Push                 r4
   LoadContextParent
-  LoadContextVar       6
+  LoadContextVar       0, 6
   Push                 r4
   LoadContextParent
-  LoadContextVar       15
+  LoadContextVar       0, 15
   PushConstant         CP#24
-  IndirectStaticCall   4, CP#7
+  IndirectStaticCall   4, CP#8
   PopLocal             r12
   PushNull
   ReturnTOS
@@ -1657,26 +1697,26 @@
   Push                 r4
   Push                 r4
   LoadContextParent
-  LoadContextVar       14
+  LoadContextVar       0, 14
   Push                 r1
-  InstanceCall         2, CP#25
-  StoreContextVar      0
+  InterfaceCall        2, CP#11
+  StoreContextVar      1, 0
   Push                 r4
   LoadContextParent
   Push                 r4
-  LoadContextVar       0
-  StoreContextVar      4
+  LoadContextVar       1, 0
+  StoreContextVar      0, 4
   Push                 r4
   LoadContextParent
   PopLocal             r4
   Jump                 L9
 L9:
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       0, 3
   Push                 r4
-  LoadContextVar       4
-  PushConstant         CP#26
-  IndirectStaticCall   2, CP#9
+  LoadContextVar       0, 4
+  PushConstant         CP#25
+  IndirectStaticCall   2, CP#10
   Drop1
   PushNull
   ReturnTOS
@@ -1684,22 +1724,22 @@
 Try #0 handler:
   SetFrame             14
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       9
+  LoadContextVar       0, 9
   PopLocal             r4
-  MoveSpecial          r6, exception
-  MoveSpecial          r7, stackTrace
+  MoveSpecial          exception, r6
+  MoveSpecial          stackTrace, r7
   Push                 r6
   PopLocal             r8
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       0, 3
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#28
+  InterfaceCall        3, CP#27
   Drop1
   Jump                 L12
 L12:
@@ -1707,7 +1747,7 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       8
+  LoadContextVar       0, 8
   PopLocal             r4
   Push                 r5
   PushInt              1
@@ -1725,7 +1765,7 @@
 
 }
 ]static method tryCatchRethrow(asy::Future<core::int> a, asy::Future<core::int> b, asy::Future<core::int> c) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -1777,35 +1817,35 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
-  AllocateContext      2
+  CheckStack           0
+  AllocateContext      0, 2
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 r0
   PushInt              3
-  StoreContextVar      1
-  Allocate             CP#19
+  StoreContextVar      0, 1
+  Allocate             CP#21
   StoreLocal           r3
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#20
-  Push                 r3
-  PushNull
   StoreFieldTOS        CP#22
   Push                 r3
-  PushConstant         CP#24
-  StoreFieldTOS        CP#25
+  PushNull
+  StoreFieldTOS        CP#24
+  Push                 r3
+  PushConstant         CP#26
+  StoreFieldTOS        CP#27
   Push                 r3
   PushConstant         CP#0
-  StoreFieldTOS        CP#27
+  StoreFieldTOS        CP#29
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#1
@@ -1814,63 +1854,161 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = ClosureFunction nested () → dart.async::Future<dart.core::int> /* originally async */ ;
-  [1] = InstanceField dart.core::_Closure::_context
+  [0] = ClosureFunction 0
+  [1] = InstanceField dart:core::_Closure::_context (field)
   [2] = Reserved
-  [3] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::int]
-  [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#4
-  [6] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
-  [7] = Null
-  [8] = ArgDesc num-args 4, num-type-args 0, names []
-  [9] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#8
-  [10] = Type dynamic
-  [11] = String 'fin'
-  [12] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [13] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [14] = ArgDesc num-args 2, num-type-args 0, names []
-  [15] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#14
-  [16] = ArgDesc num-args 3, num-type-args 0, names []
-  [17] = ICData target-name 'completeError', arg-desc CP#16
-  [18] = EndClosureFunctionScope
-  [19] = Class dart.core::_Closure
-  [20] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [21] = Reserved
-  [22] = InstanceField dart.core::_Closure::_function_type_arguments
+  [3] = Class dart:async::_AsyncAwaitCompleter
+  [4] = TypeArgumentsForInstanceAllocation dart:async::_AsyncAwaitCompleter [dart:core::int]
+  [5] = ArgDesc num-args 1, num-type-args 0, names []
+  [6] = StaticICData target 'dart:async::_AsyncAwaitCompleter::'' (constructor)', arg-desc CP#5
+  [7] = ClosureFunction 1
+  [8] = Null
+  [9] = ArgDesc num-args 4, num-type-args 0, names []
+  [10] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#9
+  [11] = Type dynamic
+  [12] = String 'fin'
+  [13] = StaticICData target 'dart:core::print', arg-desc CP#5
+  [14] = StaticICData target 'dart:core::print', arg-desc CP#5
+  [15] = ArgDesc num-args 2, num-type-args 0, names []
+  [16] = StaticICData target 'dart:async::_completeOnAsyncReturn', arg-desc CP#15
+  [17] = ArgDesc num-args 3, num-type-args 0, names []
+  [18] = InterfaceCall target-name 'completeError', arg-desc CP#17
+  [19] = Reserved
+  [20] = EndClosureFunctionScope
+  [21] = Class dart:core::_Closure
+  [22] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [23] = Reserved
-  [24] = EmptyTypeArguments
-  [25] = InstanceField dart.core::_Closure::_delayed_type_arguments
-  [26] = Reserved
-  [27] = InstanceField dart.core::_Closure::_function
+  [24] = InstanceField dart:core::_Closure::_function_type_arguments (field)
+  [25] = Reserved
+  [26] = EmptyTypeArguments
+  [27] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [28] = Reserved
-  [29] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#4
-  [30] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#4
-  [31] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#4
-  [32] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [33] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#14
-  [34] = ICData get target-name 'future', arg-desc CP#4
-  [35] = EndClosureFunctionScope
+  [29] = InstanceField dart:core::_Closure::_function (field)
+  [30] = Reserved
+  [31] = StaticICData target 'dart:async::_asyncStackTraceHelper', arg-desc CP#5
+  [32] = StaticICData target 'dart:async::_asyncThenWrapperHelper', arg-desc CP#5
+  [33] = StaticICData target 'dart:async::_asyncErrorWrapperHelper', arg-desc CP#5
+  [34] = ICData dynamic target-name 'start', arg-desc CP#15
+  [35] = InterfaceCall get target-name 'get:future', arg-desc CP#5
+  [36] = Reserved
+  [37] = EndClosureFunctionScope
 }
-Closure CP#6 {
+Closure #lib::closure::nested () -> dart:async::Future < dart:core::int >
+ClosureBytecode {
+  EntryFixed           1, 4
+  CheckStack           0
+  Push                 FP[-5]
+  LoadFieldTOS         CP#1
+  PopLocal             r0
+  AllocateContext      1, 9
+  StoreLocal           r1
+  Push                 r1
+  Push                 r0
+  StoreContextParent
+  PopLocal             r0
+  Push                 r0
+  PushConstant         CP#4
+  PushConstant         CP#3
+  AllocateT
+  StoreLocal           r2
+  Push                 r2
+  PushConstant         CP#6
+  IndirectStaticCall   1, CP#5
+  Drop1
+  StoreContextVar      1, 0
+  Push                 r0
+  PushNull
+  StoreContextVar      1, 1
+  PushNull
+  PopLocal             r3
+  Push                 r0
+  PushNull
+  StoreContextVar      1, 2
+  Push                 r0
+  PushNull
+  StoreContextVar      1, 3
+  Push                 r0
+  PushInt              0
+  StoreContextVar      1, 4
+  Push                 r0
+  PushNull
+  StoreContextVar      1, 5
+  Push                 r0
+  PushNull
+  StoreContextVar      1, 6
+  Push                 r0
+  PushNull
+  StoreContextVar      1, 7
+  Push                 r0
+  Allocate             CP#21
+  StoreLocal           r2
+  Push                 r2
+  PushNull
+  StoreFieldTOS        CP#22
+  Push                 r2
+  PushNull
+  StoreFieldTOS        CP#24
+  Push                 r2
+  PushConstant         CP#26
+  StoreFieldTOS        CP#27
+  Push                 r2
+  PushConstant         CP#7
+  StoreFieldTOS        CP#29
+  Push                 r2
+  Push                 r0
+  StoreFieldTOS        CP#1
+  StoreContextVar      1, 8
+  Push                 r0
+  LoadContextVar       1, 8
+  PushConstant         CP#31
+  IndirectStaticCall   1, CP#5
+  PopLocal             r3
+  Push                 r0
+  Push                 r0
+  LoadContextVar       1, 8
+  PushConstant         CP#32
+  IndirectStaticCall   1, CP#5
+  StoreContextVar      1, 2
+  Push                 r0
+  Push                 r0
+  LoadContextVar       1, 8
+  PushConstant         CP#33
+  IndirectStaticCall   1, CP#5
+  StoreContextVar      1, 3
+  Push                 r0
+  LoadContextVar       1, 0
+  Push                 r0
+  LoadContextVar       1, 8
+  DynamicCall          2, CP#34
+  Drop1
+  Push                 r0
+  LoadContextVar       1, 0
+  InterfaceCall        1, CP#35
+  ReturnTOS
+
+}
+
+Closure #lib::closure::Closure/0:::async_op ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
+ClosureBytecode {
   EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#7
-  LoadConstant         r2, CP#7
-  LoadConstant         r3, CP#7
+  LoadConstant         r1, CP#8
+  LoadConstant         r2, CP#8
+  LoadConstant         r3, CP#8
   Frame                8
-  CheckStack
+  CheckStack           0
   Push                 r0
   LoadFieldTOS         CP#1
   PopLocal             r4
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       1, 4
   StoreLocal           r5
   PushInt              0
   JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
-  StoreContextVar      6
+  StoreContextVar      1, 6
 Try #0 start:
-  AllocateContext      1
+  AllocateContext      2, 1
   StoreLocal           r5
   Push                 r5
   Push                 r4
@@ -1878,40 +2016,40 @@
   PopLocal             r4
   Push                 r4
   PushInt              4
-  StoreContextVar      0
+  StoreContextVar      2, 0
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      7
+  StoreContextVar      1, 7
 Try #1 start:
   Push                 r4
   LoadContextParent
   LoadContextParent
   PushInt              5
-  StoreContextVar      1
+  StoreContextVar      0, 1
   Push                 r4
   LoadContextParent
   PushInt              1
-  StoreContextVar      4
+  StoreContextVar      1, 4
   Push                 r4
   LoadContextParent
   Push                 r4
-  StoreContextVar      5
+  StoreContextVar      1, 5
   Push                 r4
   LoadContextParent
   LoadContextParent
-  LoadContextVar       0
+  LoadContextVar       0, 0
   Push                 r4
   LoadContextParent
-  LoadContextVar       2
+  LoadContextVar       1, 2
   Push                 r4
   LoadContextParent
-  LoadContextVar       3
+  LoadContextVar       1, 3
   Push                 r4
   LoadContextParent
-  LoadContextVar       8
-  PushConstant         CP#9
-  IndirectStaticCall   4, CP#8
+  LoadContextVar       1, 8
+  PushConstant         CP#10
+  IndirectStaticCall   4, CP#9
   PopLocal             r11
   PushNull
   ReturnTOS
@@ -1924,17 +2062,17 @@
 L2:
   Push                 r4
   Push                 r1
-  StoreContextVar      0
+  StoreContextVar      2, 0
   Push                 r4
   LoadContextParent
   Push                 r4
   LoadContextParent
   LoadContextParent
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       2, 0
   AddInt
-  StoreContextVar      1
+  StoreContextVar      1, 1
   Jump                 L3
 Try #1 end:
 Try #1 handler:
@@ -1943,13 +2081,13 @@
   LoadFieldTOS         CP#1
   PopLocal             r4
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       1, 7
   PopLocal             r4
-  MoveSpecial          r8, exception
-  MoveSpecial          r9, stackTrace
-  PushConstant         CP#11
+  MoveSpecial          exception, r8
+  MoveSpecial          stackTrace, r9
   PushConstant         CP#12
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#13
+  IndirectStaticCall   1, CP#5
   Drop1
   Push                 r8
   Push                 r9
@@ -1959,11 +2097,11 @@
   LoadFieldTOS         CP#1
   PopLocal             r4
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       1, 7
   PopLocal             r4
-  PushConstant         CP#11
-  PushConstant         CP#13
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#12
+  PushConstant         CP#14
+  IndirectStaticCall   1, CP#5
   Drop1
   Push                 r4
   LoadContextParent
@@ -1971,11 +2109,11 @@
   Jump                 L4
 L4:
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       1, 0
   Push                 r4
-  LoadContextVar       1
-  PushConstant         CP#15
-  IndirectStaticCall   2, CP#14
+  LoadContextVar       1, 1
+  PushConstant         CP#16
+  IndirectStaticCall   2, CP#15
   Drop1
   PushNull
   ReturnTOS
@@ -1986,19 +2124,19 @@
   LoadFieldTOS         CP#1
   PopLocal             r4
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       1, 6
   PopLocal             r4
-  MoveSpecial          r6, exception
-  MoveSpecial          r7, stackTrace
+  MoveSpecial          exception, r6
+  MoveSpecial          stackTrace, r7
   Push                 r6
   PopLocal             r8
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       1, 0
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#17
+  InterfaceCall        3, CP#18
   Drop1
   Jump                 L5
 L5:
@@ -2006,104 +2144,15 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       1, 5
   PopLocal             r4
   Jump                 L6
 
 }
-
-Closure CP#0 {
-  EntryFixed           1, 4
-  CheckStack
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  AllocateContext      9
-  StoreLocal           r1
-  Push                 r1
-  Push                 r0
-  StoreContextParent
-  PopLocal             r0
-  Push                 r0
-  PushConstant         CP#3
-  PushConstant         CP#5
-  IndirectStaticCall   1, CP#4
-  StoreContextVar      0
-  Push                 r0
-  PushNull
-  StoreContextVar      1
-  PushNull
-  PopLocal             r2
-  Push                 r0
-  PushNull
-  StoreContextVar      2
-  Push                 r0
-  PushNull
-  StoreContextVar      3
-  Push                 r0
-  PushInt              0
-  StoreContextVar      4
-  Push                 r0
-  PushNull
-  StoreContextVar      5
-  Push                 r0
-  PushNull
-  StoreContextVar      6
-  Push                 r0
-  PushNull
-  StoreContextVar      7
-  Push                 r0
-  Allocate             CP#19
-  StoreLocal           r3
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#20
-  Push                 r3
-  PushNull
-  StoreFieldTOS        CP#22
-  Push                 r3
-  PushConstant         CP#24
-  StoreFieldTOS        CP#25
-  Push                 r3
-  PushConstant         CP#6
-  StoreFieldTOS        CP#27
-  Push                 r3
-  Push                 r0
-  StoreFieldTOS        CP#1
-  StoreContextVar      8
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#29
-  IndirectStaticCall   1, CP#4
-  PopLocal             r2
-  Push                 r0
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#30
-  IndirectStaticCall   1, CP#4
-  StoreContextVar      2
-  Push                 r0
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#31
-  IndirectStaticCall   1, CP#4
-  StoreContextVar      3
-  PushConstant         CP#32
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#33
-  IndirectStaticCall   2, CP#14
-  Drop1
-  Push                 r0
-  LoadContextVar       0
-  InstanceCall         1, CP#34
-  ReturnTOS
-
-}
 ]static method closure(asy::Future<core::int> a) → dynamic {
   core::int x = 3;
   function nested() → asy::Future<core::int> /* originally async */ {
-    final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
     asy::FutureOr<core::int> :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -2137,163 +2186,172 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    asy::Future::microtask<dynamic>(:async_op);
+    :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
   return nested;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
-  AllocateContext      9
+  CheckStack           0
+  AllocateContext      0, 9
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 r0
+  PushConstant         CP#1
   PushConstant         CP#0
-  PushConstant         CP#2
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      1
+  AllocateT
+  StoreLocal           r2
+  Push                 r2
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
+  Drop1
+  StoreContextVar      0, 1
   Push                 r0
   PushNull
-  StoreContextVar      2
+  StoreContextVar      0, 2
   PushNull
-  PopLocal             r2
+  PopLocal             r3
   Push                 r0
   PushNull
-  StoreContextVar      3
+  StoreContextVar      0, 3
   Push                 r0
   PushNull
-  StoreContextVar      4
+  StoreContextVar      0, 4
   Push                 r0
   PushInt              0
-  StoreContextVar      5
+  StoreContextVar      0, 5
   Push                 r0
   PushNull
-  StoreContextVar      6
+  StoreContextVar      0, 6
   Push                 r0
   PushNull
-  StoreContextVar      7
+  StoreContextVar      0, 7
   Push                 r0
-  Allocate             CP#17
-  StoreLocal           r3
-  Push                 r3
+  Allocate             CP#20
+  StoreLocal           r2
+  Push                 r2
   PushNull
-  StoreFieldTOS        CP#18
-  Push                 r3
+  StoreFieldTOS        CP#21
+  Push                 r2
   PushNull
-  StoreFieldTOS        CP#20
-  Push                 r3
-  PushConstant         CP#22
   StoreFieldTOS        CP#23
-  Push                 r3
-  PushConstant         CP#3
-  StoreFieldTOS        CP#25
-  Push                 r3
+  Push                 r2
+  PushConstant         CP#25
+  StoreFieldTOS        CP#26
+  Push                 r2
+  PushConstant         CP#4
+  StoreFieldTOS        CP#28
+  Push                 r2
   Push                 r0
-  StoreFieldTOS        CP#5
-  StoreContextVar      8
+  StoreFieldTOS        CP#6
+  StoreContextVar      0, 8
   Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#27
-  IndirectStaticCall   1, CP#1
-  PopLocal             r2
-  Push                 r0
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#28
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      3
-  Push                 r0
-  Push                 r0
-  LoadContextVar       8
-  PushConstant         CP#29
-  IndirectStaticCall   1, CP#1
-  StoreContextVar      4
+  LoadContextVar       0, 8
   PushConstant         CP#30
+  IndirectStaticCall   1, CP#2
+  PopLocal             r3
   Push                 r0
-  LoadContextVar       8
+  Push                 r0
+  LoadContextVar       0, 8
   PushConstant         CP#31
-  IndirectStaticCall   2, CP#9
+  IndirectStaticCall   1, CP#2
+  StoreContextVar      0, 3
+  Push                 r0
+  Push                 r0
+  LoadContextVar       0, 8
+  PushConstant         CP#32
+  IndirectStaticCall   1, CP#2
+  StoreContextVar      0, 4
+  Push                 r0
+  LoadContextVar       0, 1
+  Push                 r0
+  LoadContextVar       0, 8
+  DynamicCall          2, CP#33
   Drop1
   Push                 r0
-  LoadContextVar       1
-  InstanceCall         1, CP#32
+  LoadContextVar       0, 1
+  InterfaceCall        1, CP#34
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation dart.async::Completer [dart.core::int]
-  [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.async::Completer::sync', arg-desc CP#1
-  [3] = ClosureFunction :async_op ([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding ;
-  [4] = Null
-  [5] = InstanceField dart.core::_Closure::_context
-  [6] = Reserved
-  [7] = ArgDesc num-args 4, num-type-args 0, names []
-  [8] = StaticICData target 'dart.async::_awaitHelper', arg-desc CP#7
-  [9] = ArgDesc num-args 2, num-type-args 0, names []
-  [10] = ICData target-name '==', arg-desc CP#9
-  [11] = ArgDesc num-args 3, num-type-args 0, names []
-  [12] = StaticICData target 'dart.core::_AssertionError::_throwNew', arg-desc CP#11
-  [13] = StaticICData target 'dart.async::_completeOnAsyncReturn', arg-desc CP#9
-  [14] = Type dynamic
-  [15] = ICData target-name 'completeError', arg-desc CP#11
-  [16] = EndClosureFunctionScope
-  [17] = Class dart.core::_Closure
-  [18] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [19] = Reserved
-  [20] = InstanceField dart.core::_Closure::_function_type_arguments
-  [21] = Reserved
-  [22] = EmptyTypeArguments
-  [23] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [0] = Class dart:async::_AsyncAwaitCompleter
+  [1] = TypeArgumentsForInstanceAllocation dart:async::_AsyncAwaitCompleter [dart:core::int]
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = StaticICData target 'dart:async::_AsyncAwaitCompleter::'' (constructor)', arg-desc CP#2
+  [4] = ClosureFunction 0
+  [5] = Null
+  [6] = InstanceField dart:core::_Closure::_context (field)
+  [7] = Reserved
+  [8] = ArgDesc num-args 4, num-type-args 0, names []
+  [9] = StaticICData target 'dart:async::_awaitHelper', arg-desc CP#8
+  [10] = ArgDesc num-args 2, num-type-args 0, names []
+  [11] = InterfaceCall target-name '==', arg-desc CP#10
+  [12] = Reserved
+  [13] = ArgDesc num-args 3, num-type-args 0, names []
+  [14] = StaticICData target 'dart:core::_AssertionError::_throwNew', arg-desc CP#13
+  [15] = StaticICData target 'dart:async::_completeOnAsyncReturn', arg-desc CP#10
+  [16] = Type dynamic
+  [17] = InterfaceCall target-name 'completeError', arg-desc CP#13
+  [18] = Reserved
+  [19] = EndClosureFunctionScope
+  [20] = Class dart:core::_Closure
+  [21] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
+  [22] = Reserved
+  [23] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [24] = Reserved
-  [25] = InstanceField dart.core::_Closure::_function
-  [26] = Reserved
-  [27] = StaticICData target 'dart.async::_asyncStackTraceHelper', arg-desc CP#1
-  [28] = StaticICData target 'dart.async::_asyncThenWrapperHelper', arg-desc CP#1
-  [29] = StaticICData target 'dart.async::_asyncErrorWrapperHelper', arg-desc CP#1
-  [30] = TypeArgumentsForInstanceAllocation dart.async::Future [dynamic]
-  [31] = StaticICData target 'dart.async::Future::microtask', arg-desc CP#9
-  [32] = ICData get target-name 'future', arg-desc CP#1
+  [25] = EmptyTypeArguments
+  [26] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
+  [27] = Reserved
+  [28] = InstanceField dart:core::_Closure::_function (field)
+  [29] = Reserved
+  [30] = StaticICData target 'dart:async::_asyncStackTraceHelper', arg-desc CP#2
+  [31] = StaticICData target 'dart:async::_asyncThenWrapperHelper', arg-desc CP#2
+  [32] = StaticICData target 'dart:async::_asyncErrorWrapperHelper', arg-desc CP#2
+  [33] = ICData dynamic target-name 'start', arg-desc CP#10
+  [34] = InterfaceCall get target-name 'get:future', arg-desc CP#2
+  [35] = Reserved
 }
-Closure CP#3 {
+Closure #lib::testAssert:::async_op ([ dynamic :result, dynamic :exception, dynamic :stack_trace ]) -> dynamic
+ClosureBytecode {
   EntryOptional        1, 3, 0
-  LoadConstant         r1, CP#4
-  LoadConstant         r2, CP#4
-  LoadConstant         r3, CP#4
+  LoadConstant         r1, CP#5
+  LoadConstant         r2, CP#5
+  LoadConstant         r3, CP#5
   Frame                6
-  CheckStack
+  CheckStack           0
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       5
+  LoadContextVar       0, 5
   StoreLocal           r5
   PushInt              0
   JumpIfNeStrict       L1
   Push                 r4
   Push                 r4
-  StoreContextVar      7
+  StoreContextVar      0, 7
 Try #0 start:
   JumpIfNoAsserts      L2
   Push                 r4
   PushInt              1
-  StoreContextVar      5
+  StoreContextVar      0, 5
   Push                 r4
   Push                 r4
-  StoreContextVar      6
+  StoreContextVar      0, 6
   Push                 r4
-  LoadContextVar       0
+  LoadContextVar       0, 0
   Push                 r4
-  LoadContextVar       3
+  LoadContextVar       0, 3
   Push                 r4
-  LoadContextVar       4
+  LoadContextVar       0, 4
   Push                 r4
-  LoadContextVar       8
-  PushConstant         CP#8
-  IndirectStaticCall   4, CP#7
+  LoadContextVar       0, 8
+  PushConstant         CP#9
+  IndirectStaticCall   4, CP#8
   PopLocal             r8
   PushNull
   ReturnTOS
@@ -2307,27 +2365,27 @@
   JumpIfNoAsserts      L2
   Push                 r1
   PushInt              42
-  InstanceCall         2, CP#10
+  InterfaceCall        2, CP#11
   AssertBoolean        0
   JumpIfTrue           L2
   PushInt              0
   PushInt              0
   PushNull
-  PushConstant         CP#12
-  IndirectStaticCall   3, CP#11
+  PushConstant         CP#14
+  IndirectStaticCall   3, CP#13
   Drop1
 L2:
   Push                 r4
   PushInt              7
-  StoreContextVar      2
+  StoreContextVar      0, 2
   Jump                 L4
 L4:
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r4
-  LoadContextVar       2
-  PushConstant         CP#13
-  IndirectStaticCall   2, CP#9
+  LoadContextVar       0, 2
+  PushConstant         CP#15
+  IndirectStaticCall   2, CP#10
   Drop1
   PushNull
   ReturnTOS
@@ -2335,22 +2393,22 @@
 Try #0 handler:
   SetFrame             10
   Push                 r0
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#6
   PopLocal             r4
   Push                 r4
-  LoadContextVar       7
+  LoadContextVar       0, 7
   PopLocal             r4
-  MoveSpecial          r6, exception
-  MoveSpecial          r7, stackTrace
+  MoveSpecial          exception, r6
+  MoveSpecial          stackTrace, r7
   Push                 r6
   PopLocal             r8
   Push                 r7
   PopLocal             r9
   Push                 r4
-  LoadContextVar       1
+  LoadContextVar       0, 1
   Push                 r8
   Push                 r9
-  InstanceCall         3, CP#15
+  InterfaceCall        3, CP#17
   Drop1
   Jump                 L5
 L5:
@@ -2358,13 +2416,13 @@
   ReturnTOS
 L1:
   Push                 r4
-  LoadContextVar       6
+  LoadContextVar       0, 6
   PopLocal             r4
   Jump                 L6
 
 }
 ]static method testAssert(asy::Future<core::int> a) → asy::Future<core::int> /* originally async */ {
-  final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
+  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
   asy::FutureOr<core::int> :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -2392,13 +2450,13 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  asy::Future::microtask<dynamic>(:async_op);
+  :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart b/pkg/vm/testcases/bytecode/bootstrapping.dart
index 8f79be8..3f8c850 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart
@@ -137,6 +137,19 @@
   VMLibraryHooks.platformScript = _scriptUri;
 }
 
+class Stdin {}
+
+Stdin _stdin;
+
+class _StdIOUtils {
+  static Stdin _getStdioInputStream(int fd) => null;
+}
+
+Stdin get stdin {
+  _stdin ??= _StdIOUtils._getStdioInputStream(_stdinFD);
+  return _stdin;
+}
+
 // -----------------------------------------------------------------
 
 main() {}
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index c47aadf..ed981f0 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -7,9 +7,9 @@
 class _ScheduleImmediate extends core::Object {
   static field (() → void) → void _closure = null;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -19,7 +19,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::_ScheduleImmediate
     : super core::Object::•()
@@ -28,9 +28,9 @@
 class _NamespaceImpl extends core::Object implements self::_Namespace {
   static field self::_NamespaceImpl _cachedNamespace = null;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -40,15 +40,15 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  constructor _() → self::_NamespaceImpl
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   Push                 FP[-5]
   NativeCall           CP#0
@@ -60,9 +60,9 @@
 ]  @_in::ExternalName::•("Namespace_Create")
   external static method _create(self::_NamespaceImpl namespace, dynamic n) → self::_NamespaceImpl;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   NativeCall           CP#0
   ReturnTOS
@@ -73,9 +73,9 @@
 ]  @_in::ExternalName::•("Namespace_GetPointer")
   external static method _getPointer(self::_NamespaceImpl namespace) → core::int;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   NativeCall           CP#0
   ReturnTOS
 }
@@ -85,9 +85,9 @@
 ]  @_in::ExternalName::•("Namespace_GetDefault")
   external static method _getDefault() → core::int;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   Allocate             CP#0
   StoreLocal           r1
   Push                 r1
@@ -104,22 +104,21 @@
 ConstantPool {
   [0] = Class #lib::_NamespaceImpl
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target '#lib::_NamespaceImpl::_', arg-desc CP#1
+  [2] = StaticICData target '#lib::_NamespaceImpl::_ (constructor)', arg-desc CP#1
   [3] = ArgDesc num-args 2, num-type-args 0, names []
   [4] = StaticICData target '#lib::_NamespaceImpl::_create', arg-desc CP#3
-  [5] = StaticField #lib::_NamespaceImpl::_cachedNamespace
+  [5] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
 }
 ]  static method _setupNamespace(dynamic namespace) → void {
     self::_NamespaceImpl::_cachedNamespace = self::_NamespaceImpl::_create(new self::_NamespaceImpl::_(), namespace);
   }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushStatic           CP#0
   EqualsNull
-  AssertBoolean        0
   JumpIfFalse          L1
   Allocate             CP#1
   StoreLocal           r1
@@ -138,10 +137,10 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = StaticField #lib::_NamespaceImpl::_cachedNamespace
+  [0] = StaticField #lib::_NamespaceImpl::_cachedNamespace (field)
   [1] = Class #lib::_NamespaceImpl
   [2] = ArgDesc num-args 1, num-type-args 0, names []
-  [3] = StaticICData target '#lib::_NamespaceImpl::_', arg-desc CP#2
+  [3] = StaticICData target '#lib::_NamespaceImpl::_ (constructor)', arg-desc CP#2
   [4] = ArgDesc num-args 0, num-type-args 0, names []
   [5] = StaticICData target '#lib::_NamespaceImpl::_getDefault', arg-desc CP#4
   [6] = ArgDesc num-args 2, num-type-args 0, names []
@@ -154,9 +153,9 @@
     return self::_NamespaceImpl::_cachedNamespace;
   }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#1
   IndirectStaticCall   0, CP#0
   PushConstant         CP#3
@@ -165,7 +164,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+  [1] = StaticICData target '#lib::_NamespaceImpl::get:_namespace', arg-desc CP#0
   [2] = ArgDesc num-args 1, num-type-args 0, names []
   [3] = StaticICData target '#lib::_NamespaceImpl::_getPointer', arg-desc CP#2
 }
@@ -174,9 +173,9 @@
 }
 class _Namespace extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -186,15 +185,15 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::_Namespace
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -210,30 +209,30 @@
     self::_NamespaceImpl::_setupNamespace(namespace);
   }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#1
   IndirectStaticCall   0, CP#0
   ReturnTOS
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+  [1] = StaticICData target '#lib::_NamespaceImpl::get:_namespace', arg-desc CP#0
 }
 ]  static get _namespace() → self::_Namespace
     return self::_NamespaceImpl::_namespace;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#1
   IndirectStaticCall   0, CP#0
   ReturnTOS
 }
 ConstantPool {
   [0] = ArgDesc num-args 0, num-type-args 0, names []
-  [1] = StaticICData get target '#lib::_NamespaceImpl::_namespacePointer', arg-desc CP#0
+  [1] = StaticICData target '#lib::_NamespaceImpl::get:_namespacePointer', arg-desc CP#0
 }
 ]  static get _namespacePointer() → core::int
     return self::_NamespaceImpl::_namespacePointer;
@@ -251,9 +250,9 @@
   static field dynamic _computeScriptUri = null;
   static field dynamic _cachedScript = null;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -263,15 +262,15 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::VMLibraryHooks
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
-  Entry                2
-  CheckStack
+Bytecode {
+  Entry                1
+  CheckStack           0
   Push                 FP[-5]
   StoreStaticTOS       CP#0
   PushNull
@@ -280,26 +279,24 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = StaticField #lib::VMLibraryHooks::_computeScriptUri
-  [1] = StaticField #lib::VMLibraryHooks::_cachedScript
+  [0] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
+  [1] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
 }
 ]  static set platformScript(dynamic f) → void {
     self::VMLibraryHooks::_computeScriptUri = f;
     self::VMLibraryHooks::_cachedScript = null;
   }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushStatic           CP#0
   EqualsNull
-  AssertBoolean        0
   JumpIfFalse          L1
   PushConstant         CP#1
   PushStatic           CP#1
   EqualsNull
-  AssertBoolean        0
   BooleanNegateTOS
   PopLocal             r0
   Jump                 L2
@@ -308,11 +305,10 @@
   PopLocal             r0
 L2:
   Push                 r0
-  AssertBoolean        0
   JumpIfFalse          L3
   PushConstant         CP#1
   PushStatic           CP#1
-  InstanceCall         1, CP#3
+  DynamicCall          1, CP#3
   StoreStaticTOS       CP#0
 L3:
   PushConstant         CP#0
@@ -320,8 +316,8 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = StaticField #lib::VMLibraryHooks::_cachedScript
-  [1] = StaticField #lib::VMLibraryHooks::_computeScriptUri
+  [0] = StaticField #lib::VMLibraryHooks::_cachedScript (field)
+  [1] = StaticField #lib::VMLibraryHooks::_computeScriptUri (field)
   [2] = ArgDesc num-args 1, num-type-args 0, names []
   [3] = ICData dynamic target-name 'call', arg-desc CP#2
 }
@@ -332,14 +328,66 @@
     return self::VMLibraryHooks::_cachedScript;
   }
 }
+class Stdin extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack           0
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushNull
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
+}
+]  synthetic constructor •() → self::Stdin
+    : super core::Object::•()
+    ;
+}
+class _StdIOUtils extends core::Object {
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack           0
+  Push                 FP[-5]
+  PushConstant         CP#1
+  IndirectStaticCall   1, CP#0
+  Drop1
+  PushNull
+  ReturnTOS
+}
+ConstantPool {
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
+}
+]  synthetic constructor •() → self::_StdIOUtils
+    : super core::Object::•()
+    ;
+[@vm.bytecode=
+Bytecode {
+  Entry                0
+  CheckStack           0
+  PushNull
+  ReturnTOS
+}
+ConstantPool {
+}
+]  static method _getStdioInputStream(core::int fd) → self::Stdin
+    return null;
+}
 static field core::int _stdinFD = 0;
 static field core::int _stdoutFD = 1;
 static field core::int _stderrFD = 2;
 static field core::String _rawScript;
+static field self::Stdin _stdin;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   NativeCall           CP#0
   ReturnTOS
@@ -350,12 +398,12 @@
 ]@_in::ExternalName::•("Builtin_PrintString")
 external static method _printString(core::String s) → void;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
-  InstanceCall         1, CP#1
-  PushConstant         CP#2
+  InterfaceCall        1, CP#1
+  PushConstant         CP#3
   IndirectStaticCall   1, CP#0
   Drop1
   PushNull
@@ -363,16 +411,17 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData target-name 'toString', arg-desc CP#0
-  [2] = StaticICData target '#lib::_printString', arg-desc CP#0
+  [1] = InterfaceCall target-name 'toString', arg-desc CP#0
+  [2] = Reserved
+  [3] = StaticICData target '#lib::_printString', arg-desc CP#0
 }
 ]static method _print(dynamic arg) → void {
   self::_printString(arg.{core::Object::toString}());
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   ReturnTOS
 }
@@ -382,24 +431,24 @@
 ]static method _getPrintClosure() → dynamic
   return self::_print;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   StoreStaticTOS       CP#0
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = StaticField #lib::_ScheduleImmediate::_closure
+  [0] = StaticField #lib::_ScheduleImmediate::_closure (field)
 }
 ]static method _setScheduleImmediateClosure((() → void) → void closure) → void {
   self::_ScheduleImmediate::_closure = closure;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
-  Entry                3
-  CheckStack
+Bytecode {
+  Entry                1
+  CheckStack           0
   Push                 FP[-7]
   StoreStaticTOS       CP#0
   Push                 FP[-6]
@@ -410,9 +459,9 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = StaticField #lib::_stdinFD
-  [1] = StaticField #lib::_stdoutFD
-  [2] = StaticField #lib::_stderrFD
+  [0] = StaticField #lib::_stdinFD (field)
+  [1] = StaticField #lib::_stdoutFD (field)
+  [2] = StaticField #lib::_stderrFD (field)
 }
 ]static method _setStdioFDs(core::int stdin, core::int stdout, core::int stderr) → void {
   self::_stdinFD = stdin;
@@ -420,19 +469,19 @@
   self::_stderrFD = stderr;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#1
-  InstanceCall         2, CP#3
+  InterfaceCall        2, CP#3
   AssertBoolean        0
   JumpIfTrue           L1
   PushConstant         CP#0
   PushStatic           CP#0
-  PushConstant         CP#4
-  InstanceCall         2, CP#5
+  PushConstant         CP#5
+  InterfaceCall        2, CP#3
   AssertBoolean        0
   PopLocal             r1
   Jump                 L2
@@ -441,12 +490,11 @@
   PopLocal             r1
 L2:
   Push                 r1
-  AssertBoolean        0
   JumpIfTrue           L3
   PushConstant         CP#0
   PushStatic           CP#0
   PushConstant         CP#6
-  InstanceCall         2, CP#7
+  InterfaceCall        2, CP#3
   AssertBoolean        0
   PopLocal             r0
   Jump                 L4
@@ -455,39 +503,38 @@
   PopLocal             r0
 L4:
   Push                 r0
-  AssertBoolean        0
   JumpIfFalse          L5
   PushConstant         CP#0
   PushStatic           CP#0
-  PushConstant         CP#9
-  IndirectStaticCall   1, CP#8
+  PushConstant         CP#8
+  IndirectStaticCall   1, CP#7
   ReturnTOS
 L5:
-  PushConstant         CP#11
-  IndirectStaticCall   0, CP#10
+  PushConstant         CP#10
+  IndirectStaticCall   0, CP#9
   PushNull
   PushConstant         CP#0
   PushStatic           CP#0
-  PushConstant         CP#12
+  PushConstant         CP#11
   IndirectStaticCall   2, CP#2
-  InstanceCall         2, CP#13
+  InterfaceCall        2, CP#12
   ReturnTOS
 }
 ConstantPool {
-  [0] = StaticField #lib::_rawScript
+  [0] = StaticField #lib::_rawScript (field)
   [1] = String 'http:'
   [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = ICData target-name 'startsWith', arg-desc CP#2
-  [4] = String 'https:'
-  [5] = ICData target-name 'startsWith', arg-desc CP#2
+  [3] = InterfaceCall target-name 'startsWith', arg-desc CP#2
+  [4] = Reserved
+  [5] = String 'https:'
   [6] = String 'file:'
-  [7] = ICData target-name 'startsWith', arg-desc CP#2
-  [8] = ArgDesc num-args 1, num-type-args 0, names []
-  [9] = StaticICData target 'dart.core::Uri::parse', arg-desc CP#8
-  [10] = ArgDesc num-args 0, num-type-args 0, names []
-  [11] = StaticICData get target 'dart.core::Uri::base', arg-desc CP#10
-  [12] = StaticICData target 'dart.core::_Uri::file', arg-desc CP#2
-  [13] = ICData target-name 'resolveUri', arg-desc CP#2
+  [7] = ArgDesc num-args 1, num-type-args 0, names []
+  [8] = StaticICData target 'dart:core::Uri::parse', arg-desc CP#7
+  [9] = ArgDesc num-args 0, num-type-args 0, names []
+  [10] = StaticICData target 'dart:core::Uri::get:base', arg-desc CP#9
+  [11] = StaticICData target 'dart:core::_Uri::file (constructor)', arg-desc CP#2
+  [12] = InterfaceCall target-name 'resolveUri', arg-desc CP#2
+  [13] = Reserved
 }
 ]static method _scriptUri() → core::Uri {
   if(self::_rawScript.{core::String::startsWith}("http:") || self::_rawScript.{core::String::startsWith}("https:") || self::_rawScript.{core::String::startsWith}("file:")) {
@@ -498,9 +545,9 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
@@ -511,15 +558,52 @@
 ConstantPool {
   [0] = TearOff #lib::_scriptUri
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData set target '#lib::VMLibraryHooks::platformScript', arg-desc CP#1
+  [2] = StaticICData target '#lib::VMLibraryHooks::set:platformScript', arg-desc CP#1
 }
 ]static method _setupHooks() → dynamic {
   self::VMLibraryHooks::platformScript = self::_scriptUri;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
+  Entry                2
+  CheckStack           0
+  PushConstant         CP#0
+  PushStatic           CP#0
+  EqualsNull
+  JumpIfFalse          L1
+  PushConstant         CP#1
+  PushStatic           CP#1
+  PushConstant         CP#3
+  IndirectStaticCall   1, CP#2
+  StoreLocal           r1
+  Push                 r1
+  StoreStaticTOS       CP#0
+  PopLocal             r0
+  Jump                 L2
+L1:
+  PushNull
+  PopLocal             r0
+L2:
+  Push                 r0
+  Drop1
+  PushConstant         CP#0
+  PushStatic           CP#0
+  ReturnTOS
+}
+ConstantPool {
+  [0] = StaticField #lib::_stdin (field)
+  [1] = StaticField #lib::_stdinFD (field)
+  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [3] = StaticICData target '#lib::_StdIOUtils::_getStdioInputStream', arg-desc CP#2
+}
+]static get stdin() → self::Stdin {
+  self::_stdin.{core::Object::==}(null) ?{self::Stdin} self::_stdin = self::_StdIOUtils::_getStdioInputStream(self::_stdinFD) : null;
+  return self::_stdin;
+}
+[@vm.bytecode=
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index d73647e..f801084 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -5,9 +5,9 @@
 typedef IntFunc = (core::int) → dynamic;
 class C1 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -17,7 +17,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C1
     : super core::Object::•()
@@ -25,9 +25,9 @@
 }
 class C2 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -37,7 +37,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C2
     : super core::Object::•()
@@ -45,9 +45,9 @@
 }
 class C3 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -57,7 +57,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C3
     : super core::Object::•()
@@ -65,9 +65,9 @@
 }
 class C4 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -77,7 +77,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C4
     : super core::Object::•()
@@ -85,9 +85,9 @@
 }
 class C5 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -97,7 +97,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C5
     : super core::Object::•()
@@ -105,9 +105,9 @@
 }
 class C6 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -117,7 +117,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C6
     : super core::Object::•()
@@ -125,9 +125,9 @@
 }
 class C7 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -137,7 +137,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C7
     : super core::Object::•()
@@ -145,9 +145,9 @@
 }
 class C8 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -157,7 +157,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C8
     : super core::Object::•()
@@ -165,9 +165,9 @@
 }
 class A<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic> extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -177,21 +177,21 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::A<self::A::T1, self::A::T2>
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                5
-  CheckStack
-  CheckFunctionTypeArgs 2, 0
-  AllocateContext      1
+  CheckStack           0
+  CheckFunctionTypeArgs 2, r0
+  AllocateContext      0, 1
   PopLocal             r1
   Push                 r1
   Push                 FP[-5]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Allocate             CP#31
   StoreLocal           r4
   Push                 r4
@@ -213,68 +213,180 @@
   PopLocal             r3
   PushConstant         CP#44
   Push                 r3
-  InstanceCall         2, CP#45
+  DynamicCall          2, CP#45
   Drop1
   PushConstant         CP#46
   Push                 r3
-  InstanceCall         2, CP#47
+  DynamicCall          2, CP#47
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = ClosureFunction nested1 <T5 extends dart.core::Object = dynamic, T6 extends dart.core::Object = dynamic>() → void;
-  [1] = InstanceField dart.core::_Closure::_context
+  [0] = ClosureFunction 0
+  [1] = InstanceField dart:core::_Closure::_context (field)
   [2] = Reserved
-  [3] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [3] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [4] = Reserved
   [5] = EmptyTypeArguments
-  [6] = InstanceField dart.core::_Closure::_function_type_arguments
+  [6] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [7] = Reserved
   [8] = ArgDesc num-args 4, num-type-args 0, names []
-  [9] = StaticICData target 'dart._internal::_prependTypeArguments', arg-desc CP#8
-  [10] = ClosureFunction nested2 <T7 extends dart.core::Object = dynamic, T8 extends dart.core::Object = dynamic>() → void;
-  [11] = StaticICData target 'dart._internal::_prependTypeArguments', arg-desc CP#8
-  [12] = ClosureFunction <anonymous closure> () → dart.core::Null;
-  [13] = TypeArgs [dart.core::Type]
-  [14] = Type #lib::A::T1
+  [9] = StaticICData target 'dart:_internal::_prependTypeArguments', arg-desc CP#8
+  [10] = ClosureFunction 1
+  [11] = StaticICData target 'dart:_internal::_prependTypeArguments', arg-desc CP#8
+  [12] = ClosureFunction 2
+  [13] = TypeArgs [dart:core::Type]
+  [14] = Type #lib::A::TypeParam/0
   [15] = TypeArgumentsField #lib::A
-  [16] = Type #lib::A::T2
-  [17] = Type #lib::A::foo::T3
-  [18] = Type #lib::A::foo::T4
-  [19] = Type T5
-  [20] = Type T6
-  [21] = Type T7
-  [22] = Type T8
+  [16] = Type #lib::A::TypeParam/1
+  [17] = Type #lib::A::foo::TypeParam/0
+  [18] = Type #lib::A::foo::TypeParam/1
+  [19] = Type #lib::A::foo::Closure/0::TypeParam/0
+  [20] = Type #lib::A::foo::Closure/0::TypeParam/1
+  [21] = Type #lib::A::foo::Closure/1::TypeParam/0
+  [22] = Type #lib::A::foo::Closure/1::TypeParam/1
   [23] = ArgDesc num-args 2, num-type-args 0, names []
-  [24] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#23
+  [24] = StaticICData target 'dart:core::List::_fromLiteral (constructor)', arg-desc CP#23
   [25] = ArgDesc num-args 1, num-type-args 0, names []
-  [26] = StaticICData target 'dart.core::print', arg-desc CP#25
-  [27] = TypeArgs [#lib::A::T1, #lib::A::T2, #lib::A::foo::T3, #lib::A::foo::T4, T5, T6, T7, T8]
+  [26] = StaticICData target 'dart:core::print', arg-desc CP#25
+  [27] = TypeArgs [#lib::A::TypeParam/0, #lib::A::TypeParam/1, #lib::A::foo::TypeParam/0, #lib::A::foo::TypeParam/1, #lib::A::foo::Closure/0::TypeParam/0, #lib::A::foo::Closure/0::TypeParam/1, #lib::A::foo::Closure/1::TypeParam/0, #lib::A::foo::Closure/1::TypeParam/1]
   [28] = ArgDesc num-args 0, num-type-args 8, names []
   [29] = StaticICData target '#lib::callWithArgs', arg-desc CP#28
   [30] = EndClosureFunctionScope
-  [31] = Class dart.core::_Closure
-  [32] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [31] = Class dart:core::_Closure
+  [32] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [33] = Reserved
-  [34] = InstanceField dart.core::_Closure::_function
+  [34] = InstanceField dart:core::_Closure::_function (field)
   [35] = Reserved
   [36] = ICData dynamic target-name 'call', arg-desc CP#25
   [37] = EndClosureFunctionScope
   [38] = TypeArgs [#lib::C7, #lib::C8]
   [39] = ArgDesc num-args 1, num-type-args 2, names []
   [40] = ICData dynamic target-name 'call', arg-desc CP#39
-  [41] = TypeArgs [dart.core::List<#lib::C7>, dart.core::List<#lib::C8>]
+  [41] = TypeArgs [dart:core::List < #lib::C7 >, dart:core::List < #lib::C8 >]
   [42] = ICData dynamic target-name 'call', arg-desc CP#39
   [43] = EndClosureFunctionScope
   [44] = TypeArgs [#lib::C5, #lib::C6]
   [45] = ICData dynamic target-name 'call', arg-desc CP#39
-  [46] = TypeArgs [dart.core::List<#lib::C5>, dart.core::List<#lib::C6>]
+  [46] = TypeArgs [dart:core::List < #lib::C5 >, dart:core::List < #lib::C6 >]
   [47] = ICData dynamic target-name 'call', arg-desc CP#39
 }
-Closure CP#12 {
+Closure #lib::A::foo::nested1 <dart:core::Object T5, dart:core::Object T6> () -> void
+ClosureBytecode {
+  EntryFixed           1, 5
+  CheckStack           0
+  Push                 FP[-5]
+  LoadFieldTOS         CP#1
+  PopLocal             r1
+  Push                 FP[-5]
+  LoadFieldTOS         CP#3
+  StoreLocal           r0
+  PushConstant         CP#5
+  JumpIfEqStrict       L1
+  CheckFunctionTypeArgs 0, r2
+  Jump                 L2
+L1:
+  CheckFunctionTypeArgs 2, r0
+L2:
+  Push                 r0
+  Push                 FP[-5]
+  LoadFieldTOS         CP#6
+  PushInt              2
+  PushInt              4
+  PushConstant         CP#9
+  IndirectStaticCall   4, CP#8
+  PopLocal             r0
+  Allocate             CP#31
+  StoreLocal           r4
+  Push                 r4
+  Push                 r1
+  LoadContextVar       0, 0
+  LoadTypeArgumentsField CP#15
+  StoreFieldTOS        CP#32
+  Push                 r4
+  Push                 r0
+  StoreFieldTOS        CP#6
+  Push                 r4
+  PushConstant         CP#5
+  StoreFieldTOS        CP#3
+  Push                 r4
+  PushConstant         CP#10
+  StoreFieldTOS        CP#34
+  Push                 r4
+  Push                 r1
+  StoreFieldTOS        CP#1
+  PopLocal             r3
+  PushConstant         CP#38
+  Push                 r3
+  DynamicCall          2, CP#40
+  Drop1
+  PushConstant         CP#41
+  Push                 r3
+  DynamicCall          2, CP#42
+  Drop1
+  PushNull
+  ReturnTOS
+
+}
+
+Closure #lib::A::foo::Closure/0::nested2 <dart:core::Object T7, dart:core::Object T8> () -> void
+ClosureBytecode {
+  EntryFixed           1, 5
+  CheckStack           0
+  Push                 FP[-5]
+  LoadFieldTOS         CP#1
+  PopLocal             r1
+  Push                 FP[-5]
+  LoadFieldTOS         CP#3
+  StoreLocal           r0
+  PushConstant         CP#5
+  JumpIfEqStrict       L1
+  CheckFunctionTypeArgs 0, r2
+  Jump                 L2
+L1:
+  CheckFunctionTypeArgs 2, r0
+L2:
+  Push                 r0
+  Push                 FP[-5]
+  LoadFieldTOS         CP#6
+  PushInt              4
+  PushInt              6
+  PushConstant         CP#11
+  IndirectStaticCall   4, CP#8
+  PopLocal             r0
+  Allocate             CP#31
+  StoreLocal           r4
+  Push                 r4
+  Push                 r1
+  LoadContextVar       0, 0
+  LoadTypeArgumentsField CP#15
+  StoreFieldTOS        CP#32
+  Push                 r4
+  Push                 r0
+  StoreFieldTOS        CP#6
+  Push                 r4
+  PushConstant         CP#5
+  StoreFieldTOS        CP#3
+  Push                 r4
+  PushConstant         CP#12
+  StoreFieldTOS        CP#34
+  Push                 r4
+  Push                 r1
+  StoreFieldTOS        CP#1
+  PopLocal             r3
+  Push                 r3
+  DynamicCall          1, CP#36
+  Drop1
+  PushNull
+  ReturnTOS
+
+}
+
+Closure #lib::A::foo::Closure/1::<anonymous closure> () -> dart:core::Null
+ClosureBytecode {
   EntryFixed           1, 4
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r1
@@ -290,7 +402,7 @@
   Push                 r3
   PushInt              0
   Push                 r1
-  LoadContextVar       0
+  LoadContextVar       0, 0
   LoadTypeArgumentsField CP#15
   PushNull
   InstantiateType      CP#14
@@ -298,7 +410,7 @@
   Push                 r3
   PushInt              1
   Push                 r1
-  LoadContextVar       0
+  LoadContextVar       0, 0
   LoadTypeArgumentsField CP#15
   PushNull
   InstantiateType      CP#16
@@ -345,7 +457,7 @@
   IndirectStaticCall   1, CP#25
   Drop1
   Push                 r1
-  LoadContextVar       0
+  LoadContextVar       0, 0
   LoadTypeArgumentsField CP#15
   Push                 r0
   InstantiateTypeArgumentsTOS 0, CP#27
@@ -356,115 +468,6 @@
   ReturnTOS
 
 }
-
-Closure CP#10 {
-  EntryFixed           1, 5
-  CheckStack
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r1
-  Push                 FP[-5]
-  LoadFieldTOS         CP#3
-  StoreLocal           r0
-  PushConstant         CP#5
-  JumpIfEqStrict       L1
-  CheckFunctionTypeArgs 0, 2
-  Jump                 L2
-L1:
-  CheckFunctionTypeArgs 2, 0
-L2:
-  Push                 r0
-  Push                 FP[-5]
-  LoadFieldTOS         CP#6
-  PushInt              4
-  PushInt              6
-  PushConstant         CP#11
-  IndirectStaticCall   4, CP#8
-  PopLocal             r0
-  Allocate             CP#31
-  StoreLocal           r4
-  Push                 r4
-  Push                 r1
-  LoadContextVar       0
-  LoadTypeArgumentsField CP#15
-  StoreFieldTOS        CP#32
-  Push                 r4
-  Push                 r0
-  StoreFieldTOS        CP#6
-  Push                 r4
-  PushConstant         CP#5
-  StoreFieldTOS        CP#3
-  Push                 r4
-  PushConstant         CP#12
-  StoreFieldTOS        CP#34
-  Push                 r4
-  Push                 r1
-  StoreFieldTOS        CP#1
-  PopLocal             r3
-  Push                 r3
-  InstanceCall         1, CP#36
-  Drop1
-  PushNull
-  ReturnTOS
-
-}
-
-Closure CP#0 {
-  EntryFixed           1, 5
-  CheckStack
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r1
-  Push                 FP[-5]
-  LoadFieldTOS         CP#3
-  StoreLocal           r0
-  PushConstant         CP#5
-  JumpIfEqStrict       L1
-  CheckFunctionTypeArgs 0, 2
-  Jump                 L2
-L1:
-  CheckFunctionTypeArgs 2, 0
-L2:
-  Push                 r0
-  Push                 FP[-5]
-  LoadFieldTOS         CP#6
-  PushInt              2
-  PushInt              4
-  PushConstant         CP#9
-  IndirectStaticCall   4, CP#8
-  PopLocal             r0
-  Allocate             CP#31
-  StoreLocal           r4
-  Push                 r4
-  Push                 r1
-  LoadContextVar       0
-  LoadTypeArgumentsField CP#15
-  StoreFieldTOS        CP#32
-  Push                 r4
-  Push                 r0
-  StoreFieldTOS        CP#6
-  Push                 r4
-  PushConstant         CP#5
-  StoreFieldTOS        CP#3
-  Push                 r4
-  PushConstant         CP#10
-  StoreFieldTOS        CP#34
-  Push                 r4
-  Push                 r1
-  StoreFieldTOS        CP#1
-  PopLocal             r3
-  PushConstant         CP#38
-  Push                 r3
-  InstanceCall         2, CP#40
-  Drop1
-  PushConstant         CP#41
-  Push                 r3
-  InstanceCall         2, CP#42
-  Drop1
-  PushNull
-  ReturnTOS
-
-}
 ]  method foo<T3 extends core::Object = dynamic, T4 extends core::Object = dynamic>() → void {
     function nested1<T5 extends core::Object = dynamic, T6 extends core::Object = dynamic>() → void {
       function nested2<T7 extends core::Object = dynamic, T8 extends core::Object = dynamic>() → void {
@@ -484,9 +487,9 @@
 class B extends core::Object {
   field core::int foo = null;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -494,168 +497,143 @@
   PushNull
   ReturnTOS
 }
-Nullable fields: [#lib::B::foo]
+Nullable fields: [#lib::B::foo (field)]}
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::B
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                5
-  CheckStack
-  AllocateContext      4
+  CheckStack           0
+  AllocateContext      0, 4
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 r0
   PushInt              1
-  StoreContextVar      1
+  StoreContextVar      0, 1
   PushInt              2
   PopLocal             r2
   Push                 r0
   PushInt              3
-  StoreContextVar      2
-  Allocate             CP#10
+  StoreContextVar      0, 2
+  Allocate             CP#11
   StoreLocal           r4
   Push                 r4
   PushNull
-  StoreFieldTOS        CP#11
+  StoreFieldTOS        CP#12
   Push                 r4
   PushNull
-  StoreFieldTOS        CP#13
+  StoreFieldTOS        CP#14
   Push                 r4
-  PushConstant         CP#15
-  StoreFieldTOS        CP#16
+  PushConstant         CP#16
+  StoreFieldTOS        CP#17
   Push                 r4
   PushConstant         CP#0
-  StoreFieldTOS        CP#18
+  StoreFieldTOS        CP#19
   Push                 r4
   Push                 r0
   StoreFieldTOS        CP#1
   PopLocal             r3
   Push                 r3
   PushInt              10
-  InstanceCall         2, CP#24
+  DynamicCall          2, CP#25
   Drop1
   Push                 r3
   PushInt              11
-  InstanceCall         2, CP#25
+  DynamicCall          2, CP#26
   Drop1
   Push                 r2
-  PushConstant         CP#26
-  IndirectStaticCall   1, CP#7
-  Drop1
-  Push                 r0
-  LoadContextVar       2
   PushConstant         CP#27
   IndirectStaticCall   1, CP#7
   Drop1
   Push                 r0
-  LoadContextVar       1
+  LoadContextVar       0, 2
   PushConstant         CP#28
   IndirectStaticCall   1, CP#7
   Drop1
   Push                 r0
+  LoadContextVar       0, 1
+  PushConstant         CP#29
+  IndirectStaticCall   1, CP#7
+  Drop1
+  Push                 r0
   PushInt              42
-  StoreContextVar      3
-  Allocate             CP#10
+  StoreContextVar      0, 3
+  Allocate             CP#11
   StoreLocal           r3
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#11
+  StoreFieldTOS        CP#12
   Push                 r3
   PushNull
-  StoreFieldTOS        CP#13
+  StoreFieldTOS        CP#14
   Push                 r3
-  PushConstant         CP#15
-  StoreFieldTOS        CP#16
+  PushConstant         CP#16
+  StoreFieldTOS        CP#17
   Push                 r3
-  PushConstant         CP#29
-  StoreFieldTOS        CP#18
+  PushConstant         CP#30
+  StoreFieldTOS        CP#19
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#1
   PopLocal             r2
   Push                 r2
-  InstanceCall         1, CP#32
+  DynamicCall          1, CP#34
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = ClosureFunction <anonymous closure> (dart.core::int y) → dart.core::Null;
-  [1] = InstanceField dart.core::_Closure::_context
+  [0] = ClosureFunction 0
+  [1] = InstanceField dart:core::_Closure::_context (field)
   [2] = Reserved
-  [3] = Type dart.core::int
+  [3] = Type dart:core::int
   [4] = String 'y'
   [5] = SubtypeTestCache
-  [6] = ClosureFunction closure2 () → void;
+  [6] = ClosureFunction 1
   [7] = ArgDesc num-args 1, num-type-args 0, names []
-  [8] = ICData get target-name 'foo', arg-desc CP#7
-  [9] = EndClosureFunctionScope
-  [10] = Class dart.core::_Closure
-  [11] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [12] = Reserved
-  [13] = InstanceField dart.core::_Closure::_function_type_arguments
-  [14] = Reserved
-  [15] = EmptyTypeArguments
-  [16] = InstanceField dart.core::_Closure::_delayed_type_arguments
-  [17] = Reserved
-  [18] = InstanceField dart.core::_Closure::_function
-  [19] = Reserved
-  [20] = ICData dynamic target-name 'call', arg-desc CP#7
-  [21] = StaticICData target 'dart.core::print', arg-desc CP#7
-  [22] = EndClosureFunctionScope
-  [23] = ArgDesc num-args 2, num-type-args 0, names []
-  [24] = ICData dynamic target-name 'call', arg-desc CP#23
-  [25] = ICData dynamic target-name 'call', arg-desc CP#23
-  [26] = StaticICData target 'dart.core::print', arg-desc CP#7
-  [27] = StaticICData target 'dart.core::print', arg-desc CP#7
-  [28] = StaticICData target 'dart.core::print', arg-desc CP#7
-  [29] = ClosureFunction <anonymous closure> () → dart.core::Null;
-  [30] = ICData set target-name 'foo', arg-desc CP#23
-  [31] = EndClosureFunctionScope
-  [32] = ICData dynamic target-name 'call', arg-desc CP#7
+  [8] = InterfaceCall get target-name 'get:foo', arg-desc CP#7
+  [9] = Reserved
+  [10] = EndClosureFunctionScope
+  [11] = Class dart:core::_Closure
+  [12] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
+  [13] = Reserved
+  [14] = InstanceField dart:core::_Closure::_function_type_arguments (field)
+  [15] = Reserved
+  [16] = EmptyTypeArguments
+  [17] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
+  [18] = Reserved
+  [19] = InstanceField dart:core::_Closure::_function (field)
+  [20] = Reserved
+  [21] = ICData dynamic target-name 'call', arg-desc CP#7
+  [22] = StaticICData target 'dart:core::print', arg-desc CP#7
+  [23] = EndClosureFunctionScope
+  [24] = ArgDesc num-args 2, num-type-args 0, names []
+  [25] = ICData dynamic target-name 'call', arg-desc CP#24
+  [26] = ICData dynamic target-name 'call', arg-desc CP#24
+  [27] = StaticICData target 'dart:core::print', arg-desc CP#7
+  [28] = StaticICData target 'dart:core::print', arg-desc CP#7
+  [29] = StaticICData target 'dart:core::print', arg-desc CP#7
+  [30] = ClosureFunction 2
+  [31] = InterfaceCall set target-name 'set:foo', arg-desc CP#24
+  [32] = Reserved
+  [33] = EndClosureFunctionScope
+  [34] = ICData dynamic target-name 'call', arg-desc CP#7
 }
-Closure CP#6 {
-  EntryFixed           1, 3
-  CheckStack
-  Push                 FP[-5]
-  LoadFieldTOS         CP#1
-  PopLocal             r0
-  Push                 r0
-  LoadContextParent
-  Push                 r0
-  LoadContextParent
-  LoadContextVar       1
-  PushInt              2
-  AddInt
-  StoreContextVar      2
-  Push                 r0
-  Push                 r0
-  LoadContextParent
-  LoadContextVar       0
-  InstanceCall         1, CP#8
-  Push                 r0
-  LoadContextVar       0
-  AddInt
-  StoreContextVar      1
-  PushNull
-  ReturnTOS
-
-}
-
-Closure CP#0 {
+Closure #lib::B::topLevel::<anonymous closure> (dart:core::int y) -> dart:core::Null
+ClosureBytecode {
   EntryFixed           2, 4
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   LoadFieldTOS         CP#1
   PopLocal             r0
-  AllocateContext      2
+  AllocateContext      1, 2
   StoreLocal           r1
   Push                 r1
   Push                 r0
@@ -663,7 +641,7 @@
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      0
+  StoreContextVar      1, 0
   Push                 FP[-5]
   PushConstant         CP#3
   PushNull
@@ -674,44 +652,43 @@
   Push                 r0
   LoadContextParent
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       1, 0
   PushInt              1
   AddInt
-  StoreContextVar      1
+  StoreContextVar      0, 1
   Push                 r0
   LoadContextParent
-  LoadContextVar       1
+  LoadContextVar       0, 1
   PushInt              5
   CompareIntGt
-  AssertBoolean        0
   JumpIfFalse          L1
   Push                 r0
   PushInt              4
-  StoreContextVar      1
-  Allocate             CP#10
+  StoreContextVar      1, 1
+  Allocate             CP#11
   StoreLocal           r2
   Push                 r2
   PushNull
-  StoreFieldTOS        CP#11
+  StoreFieldTOS        CP#12
   Push                 r2
   PushNull
-  StoreFieldTOS        CP#13
+  StoreFieldTOS        CP#14
   Push                 r2
-  PushConstant         CP#15
-  StoreFieldTOS        CP#16
+  PushConstant         CP#16
+  StoreFieldTOS        CP#17
   Push                 r2
   PushConstant         CP#6
-  StoreFieldTOS        CP#18
+  StoreFieldTOS        CP#19
   Push                 r2
   Push                 r0
   StoreFieldTOS        CP#1
   PopLocal             r3
   Push                 r3
-  InstanceCall         1, CP#20
+  DynamicCall          1, CP#21
   Drop1
   Push                 r0
-  LoadContextVar       1
-  PushConstant         CP#21
+  LoadContextVar       1, 1
+  PushConstant         CP#22
   IndirectStaticCall   1, CP#7
   Drop1
 L1:
@@ -720,17 +697,47 @@
 
 }
 
-Closure CP#29 {
+Closure #lib::B::topLevel::Closure/0::closure2 () -> void
+ClosureBytecode {
   EntryFixed           1, 3
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextParent
   Push                 r0
-  LoadContextVar       3
-  InstanceCall         2, CP#30
+  LoadContextParent
+  LoadContextVar       0, 1
+  PushInt              2
+  AddInt
+  StoreContextVar      0, 2
+  Push                 r0
+  Push                 r0
+  LoadContextParent
+  LoadContextVar       0, 0
+  InterfaceCall        1, CP#8
+  Push                 r0
+  LoadContextVar       1, 0
+  AddInt
+  StoreContextVar      1, 1
+  PushNull
+  ReturnTOS
+
+}
+
+Closure #lib::B::topLevel::<anonymous closure> () -> dart:core::Null
+ClosureBytecode {
+  EntryFixed           1, 3
+  CheckStack           0
+  Push                 FP[-5]
+  LoadFieldTOS         CP#1
+  PopLocal             r0
+  Push                 r0
+  LoadContextVar       0, 0
+  Push                 r0
+  LoadContextVar       0, 3
+  InterfaceCall        2, CP#31
   Drop1
   PushNull
   ReturnTOS
@@ -772,9 +779,9 @@
 }
 class C extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -784,20 +791,20 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                5
-  CheckStack
-  AllocateContext      1
+  CheckStack           0
+  AllocateContext      0, 1
   PopLocal             r0
   Push                 r0
   PushInt              0
-  StoreContextVar      0
+  StoreContextVar      0, 0
   PushConstant         CP#0
   StoreLocal           r3
   Push                 r3
@@ -816,7 +823,7 @@
   PushConstant         CP#3
   IndirectStaticCall   2, CP#1
   PopLocal             r4
-  AllocateContext      1
+  AllocateContext      1, 1
   StoreLocal           r1
   Push                 r1
   Push                 r0
@@ -824,14 +831,13 @@
   PopLocal             r0
   Push                 r0
   PushInt              0
-  StoreContextVar      0
+  StoreContextVar      1, 0
 L2:
-  CheckStack
+  CheckStack           1
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       1, 0
   PushInt              10
   CompareIntLt
-  AssertBoolean        0
   JumpIfFalse          L1
   Push                 r2
   Allocate             CP#8
@@ -851,7 +857,7 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#5
-  InstanceCall         2, CP#18
+  InterfaceCall        2, CP#18
   Drop1
   Push                 r4
   Allocate             CP#8
@@ -866,23 +872,23 @@
   PushConstant         CP#13
   StoreFieldTOS        CP#14
   Push                 r3
-  PushConstant         CP#19
+  PushConstant         CP#20
   StoreFieldTOS        CP#16
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#5
-  InstanceCall         2, CP#24
+  InterfaceCall        2, CP#18
   Drop1
   Push                 r0
-  CloneContext
+  CloneContext         1, 1
   PopLocal             r0
   Push                 r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       1, 0
   PushInt              1
   AddInt
   StoreLocal           r3
-  StoreContextVar      0
+  StoreContextVar      1, 0
   Push                 r3
   Drop1
   Jump                 L2
@@ -897,68 +903,70 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgs [dart.core::Function]
+  [0] = TypeArgs [dart:core::Function]
   [1] = ArgDesc num-args 2, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#1
-  [3] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#1
-  [4] = ClosureFunction <anonymous closure> () → dart.core::int;
-  [5] = InstanceField dart.core::_Closure::_context
+  [2] = StaticICData target 'dart:core::List::_fromLiteral (constructor)', arg-desc CP#1
+  [3] = StaticICData target 'dart:core::List::_fromLiteral (constructor)', arg-desc CP#1
+  [4] = ClosureFunction 0
+  [5] = InstanceField dart:core::_Closure::_context (field)
   [6] = Reserved
   [7] = EndClosureFunctionScope
-  [8] = Class dart.core::_Closure
-  [9] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [8] = Class dart:core::_Closure
+  [9] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [10] = Reserved
-  [11] = InstanceField dart.core::_Closure::_function_type_arguments
+  [11] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [12] = Reserved
   [13] = EmptyTypeArguments
-  [14] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [14] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [15] = Reserved
-  [16] = InstanceField dart.core::_Closure::_function
+  [16] = InstanceField dart:core::_Closure::_function (field)
   [17] = Reserved
-  [18] = ICData target-name 'add', arg-desc CP#1
-  [19] = ClosureFunction <anonymous closure> (dart.core::int ii) → dart.core::Null;
-  [20] = Type dart.core::int
-  [21] = String 'ii'
-  [22] = SubtypeTestCache
-  [23] = EndClosureFunctionScope
-  [24] = ICData target-name 'add', arg-desc CP#1
+  [18] = InterfaceCall target-name 'add', arg-desc CP#1
+  [19] = Reserved
+  [20] = ClosureFunction 1
+  [21] = Type dart:core::int
+  [22] = String 'ii'
+  [23] = SubtypeTestCache
+  [24] = EndClosureFunctionScope
 }
-Closure CP#4 {
+Closure #lib::C::testForLoop::<anonymous closure> () -> dart:core::int
+ClosureBytecode {
   EntryFixed           1, 2
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#5
   PopLocal             r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       1, 0
   Push                 r0
   LoadContextParent
-  LoadContextVar       0
+  LoadContextVar       0, 0
   AddInt
   ReturnTOS
 
 }
 
-Closure CP#19 {
+Closure #lib::C::testForLoop::<anonymous closure> (dart:core::int ii) -> dart:core::Null
+ClosureBytecode {
   EntryFixed           2, 3
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   LoadFieldTOS         CP#5
   PopLocal             r0
   Push                 FP[-5]
-  PushConstant         CP#20
-  PushNull
-  PushNull
   PushConstant         CP#21
-  AssertAssignable     1, CP#22
+  PushNull
+  PushNull
+  PushConstant         CP#22
+  AssertAssignable     1, CP#23
   Drop1
   Push                 r0
   Push                 FP[-5]
   Push                 r0
   LoadContextParent
-  LoadContextVar       0
+  LoadContextVar       0, 0
   AddInt
-  StoreContextVar      0
+  StoreContextVar      1, 0
   PushNull
   ReturnTOS
 
@@ -975,47 +983,47 @@
     }
   }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                5
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
-  InstanceCall         1, CP#1
+  InterfaceCall        1, CP#1
   PopLocal             r2
 L2:
-  CheckStack
+  CheckStack           1
   Push                 r2
-  InstanceCall         1, CP#2
+  InterfaceCall        1, CP#3
   JumpIfFalse          L1
-  AllocateContext      1
+  AllocateContext      0, 1
   PopLocal             r0
   Push                 r0
   Push                 r2
-  InstanceCall         1, CP#3
-  StoreContextVar      0
-  Allocate             CP#8
+  InterfaceCall        1, CP#5
+  StoreContextVar      0, 0
+  Allocate             CP#11
   StoreLocal           r4
   Push                 r4
   PushNull
-  StoreFieldTOS        CP#9
+  StoreFieldTOS        CP#12
   Push                 r4
   PushNull
-  StoreFieldTOS        CP#11
-  Push                 r4
-  PushConstant         CP#13
   StoreFieldTOS        CP#14
   Push                 r4
-  PushConstant         CP#4
-  StoreFieldTOS        CP#16
+  PushConstant         CP#16
+  StoreFieldTOS        CP#17
+  Push                 r4
+  PushConstant         CP#7
+  StoreFieldTOS        CP#19
   Push                 r4
   Push                 r0
-  StoreFieldTOS        CP#5
+  StoreFieldTOS        CP#8
   PopLocal             r3
   Push                 r3
-  InstanceCall         1, CP#18
+  DynamicCall          1, CP#21
   Drop1
   Push                 r0
-  LoadContextVar       0
-  PushConstant         CP#19
+  LoadContextVar       0, 0
+  PushConstant         CP#22
   IndirectStaticCall   1, CP#0
   Drop1
   Push                 r0
@@ -1028,38 +1036,42 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData get target-name 'iterator', arg-desc CP#0
-  [2] = ICData target-name 'moveNext', arg-desc CP#0
-  [3] = ICData get target-name 'current', arg-desc CP#0
-  [4] = ClosureFunction <anonymous closure> () → dart.core::Null;
-  [5] = InstanceField dart.core::_Closure::_context
+  [1] = InterfaceCall get target-name 'get:iterator', arg-desc CP#0
+  [2] = Reserved
+  [3] = InterfaceCall target-name 'moveNext', arg-desc CP#0
+  [4] = Reserved
+  [5] = InterfaceCall get target-name 'get:current', arg-desc CP#0
   [6] = Reserved
-  [7] = EndClosureFunctionScope
-  [8] = Class dart.core::_Closure
-  [9] = InstanceField dart.core::_Closure::_instantiator_type_arguments
-  [10] = Reserved
-  [11] = InstanceField dart.core::_Closure::_function_type_arguments
-  [12] = Reserved
-  [13] = EmptyTypeArguments
-  [14] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [7] = ClosureFunction 0
+  [8] = InstanceField dart:core::_Closure::_context (field)
+  [9] = Reserved
+  [10] = EndClosureFunctionScope
+  [11] = Class dart:core::_Closure
+  [12] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
+  [13] = Reserved
+  [14] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [15] = Reserved
-  [16] = InstanceField dart.core::_Closure::_function
-  [17] = Reserved
-  [18] = ICData dynamic target-name 'call', arg-desc CP#0
-  [19] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [16] = EmptyTypeArguments
+  [17] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
+  [18] = Reserved
+  [19] = InstanceField dart:core::_Closure::_function (field)
+  [20] = Reserved
+  [21] = ICData dynamic target-name 'call', arg-desc CP#0
+  [22] = StaticICData target 'dart:core::print', arg-desc CP#0
 }
-Closure CP#4 {
+Closure #lib::C::testForInLoop::<anonymous closure> () -> dart:core::Null
+ClosureBytecode {
   EntryFixed           1, 3
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
-  LoadFieldTOS         CP#5
+  LoadFieldTOS         CP#8
   PopLocal             r0
   Push                 r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushInt              1
   AddInt
-  StoreContextVar      0
+  StoreContextVar      0, 0
   PushNull
   ReturnTOS
 
@@ -1076,9 +1088,9 @@
 }
 class D<T extends core::Object = dynamic> extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -1088,20 +1100,20 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::D<self::D::T>
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                3
-  CheckStack
-  AllocateContext      1
+  CheckStack           0
+  AllocateContext      0, 1
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 FP[-5]
   PushConstant         CP#0
   Push                 FP[-6]
@@ -1131,33 +1143,34 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = Type #lib::D::T
+  [0] = Type #lib::D::TypeParam/0
   [1] = TypeArgumentsField #lib::D
   [2] = String 't'
   [3] = SubtypeTestCache
-  [4] = ClosureFunction <anonymous closure> () → #lib::D::T;
-  [5] = InstanceField dart.core::_Closure::_context
+  [4] = ClosureFunction 0
+  [5] = InstanceField dart:core::_Closure::_context (field)
   [6] = Reserved
   [7] = EndClosureFunctionScope
-  [8] = Class dart.core::_Closure
-  [9] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [8] = Class dart:core::_Closure
+  [9] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [10] = Reserved
-  [11] = InstanceField dart.core::_Closure::_function_type_arguments
+  [11] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [12] = Reserved
   [13] = EmptyTypeArguments
-  [14] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [14] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [15] = Reserved
-  [16] = InstanceField dart.core::_Closure::_function
+  [16] = InstanceField dart:core::_Closure::_function (field)
   [17] = Reserved
 }
-Closure CP#4 {
+Closure #lib::D::foo::<anonymous closure> () -> #lib::D::TypeParam/0
+ClosureBytecode {
   EntryFixed           1, 2
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#5
   PopLocal             r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   ReturnTOS
 
 }
@@ -1166,14 +1179,14 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
-  AllocateContext      1
+  CheckStack           0
+  AllocateContext      0, 1
   PopLocal             r0
   Push                 r0
   PushInt              5
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Allocate             CP#7
   StoreLocal           r3
   Push                 r3
@@ -1194,36 +1207,37 @@
   PopLocal             r2
   Push                 r2
   PushInt              3
-  InstanceCall         2, CP#18
+  DynamicCall          2, CP#18
   Drop1
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   ReturnTOS
 }
 ConstantPool {
-  [0] = ClosureFunction <anonymous closure> (dart.core::int y) → dart.core::Null;
-  [1] = InstanceField dart.core::_Closure::_context
+  [0] = ClosureFunction 0
+  [1] = InstanceField dart:core::_Closure::_context (field)
   [2] = Reserved
-  [3] = Type dart.core::int
+  [3] = Type dart:core::int
   [4] = String 'y'
   [5] = SubtypeTestCache
   [6] = EndClosureFunctionScope
-  [7] = Class dart.core::_Closure
-  [8] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [7] = Class dart:core::_Closure
+  [8] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [9] = Reserved
-  [10] = InstanceField dart.core::_Closure::_function_type_arguments
+  [10] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [11] = Reserved
   [12] = EmptyTypeArguments
-  [13] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [13] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [14] = Reserved
-  [15] = InstanceField dart.core::_Closure::_function
+  [15] = InstanceField dart:core::_Closure::_function (field)
   [16] = Reserved
   [17] = ArgDesc num-args 2, num-type-args 0, names []
   [18] = ICData dynamic target-name 'call', arg-desc CP#17
 }
-Closure CP#0 {
+Closure #lib::simpleClosure::<anonymous closure> (dart:core::int y) -> dart:core::Null
+ClosureBytecode {
   EntryFixed           2, 3
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   LoadFieldTOS         CP#1
   PopLocal             r0
@@ -1236,10 +1250,10 @@
   Drop1
   Push                 r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   Push                 FP[-5]
   AddInt
-  StoreContextVar      0
+  StoreContextVar      0, 0
   PushNull
   ReturnTOS
 
@@ -1253,10 +1267,10 @@
   return x;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
-  CheckFunctionTypeArgs 8, 0
+  CheckStack           0
+  CheckFunctionTypeArgs 8, r0
   PushConstant         CP#0
   StoreLocal           r1
   Push                 r1
@@ -1320,27 +1334,27 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgs [dart.core::Type]
-  [1] = Type #lib::callWithArgs::T1
-  [2] = Type #lib::callWithArgs::T2
-  [3] = Type #lib::callWithArgs::T3
-  [4] = Type #lib::callWithArgs::T4
-  [5] = Type #lib::callWithArgs::T5
-  [6] = Type #lib::callWithArgs::T6
-  [7] = Type #lib::callWithArgs::T7
-  [8] = Type #lib::callWithArgs::T8
+  [0] = TypeArgs [dart:core::Type]
+  [1] = Type #lib::callWithArgs::TypeParam/0
+  [2] = Type #lib::callWithArgs::TypeParam/1
+  [3] = Type #lib::callWithArgs::TypeParam/2
+  [4] = Type #lib::callWithArgs::TypeParam/3
+  [5] = Type #lib::callWithArgs::TypeParam/4
+  [6] = Type #lib::callWithArgs::TypeParam/5
+  [7] = Type #lib::callWithArgs::TypeParam/6
+  [8] = Type #lib::callWithArgs::TypeParam/7
   [9] = ArgDesc num-args 2, num-type-args 0, names []
-  [10] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#9
+  [10] = StaticICData target 'dart:core::List::_fromLiteral (constructor)', arg-desc CP#9
   [11] = ArgDesc num-args 1, num-type-args 0, names []
-  [12] = StaticICData target 'dart.core::print', arg-desc CP#11
+  [12] = StaticICData target 'dart:core::print', arg-desc CP#11
 }
 ]static method callWithArgs<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic, T3 extends core::Object = dynamic, T4 extends core::Object = dynamic, T5 extends core::Object = dynamic, T6 extends core::Object = dynamic, T7 extends core::Object = dynamic, T8 extends core::Object = dynamic>() → void {
   core::print(<core::Type>[self::callWithArgs::T1, self::callWithArgs::T2, self::callWithArgs::T3, self::callWithArgs::T4, self::callWithArgs::T5, self::callWithArgs::T6, self::callWithArgs::T7, self::callWithArgs::T8]);
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushConstant         CP#2
   PushConstant         CP#1
@@ -1350,20 +1364,20 @@
   PushConstant         CP#4
   IndirectStaticCall   1, CP#3
   Drop1
-  InstanceCall         2, CP#6
+  InterfaceCall        2, CP#6
   Drop1
-  PushConstant         CP#7
+  PushConstant         CP#8
   PushConstant         CP#2
   PushConstant         CP#1
   AllocateT
   StoreLocal           r0
   Push                 r0
-  PushConstant         CP#8
+  PushConstant         CP#9
   IndirectStaticCall   1, CP#3
   Drop1
-  InstanceCall         2, CP#9
+  InterfaceCall        2, CP#6
   Drop1
-  PushConstant         CP#7
+  PushConstant         CP#8
   PushConstant         CP#10
   PushConstant         CP#1
   AllocateT
@@ -1372,7 +1386,7 @@
   PushConstant         CP#11
   IndirectStaticCall   1, CP#3
   Drop1
-  InstanceCall         2, CP#12
+  InterfaceCall        2, CP#6
   Drop1
   PushNull
   ReturnTOS
@@ -1382,15 +1396,14 @@
   [1] = Class #lib::A
   [2] = TypeArgumentsForInstanceAllocation #lib::A [#lib::C1, #lib::C2]
   [3] = ArgDesc num-args 1, num-type-args 0, names []
-  [4] = StaticICData target '#lib::A::', arg-desc CP#3
+  [4] = StaticICData target '#lib::A::'' (constructor)', arg-desc CP#3
   [5] = ArgDesc num-args 1, num-type-args 2, names []
-  [6] = ICData target-name 'foo', arg-desc CP#5
-  [7] = TypeArgs [dart.core::List<#lib::C3>, dart.core::List<#lib::C4>]
-  [8] = StaticICData target '#lib::A::', arg-desc CP#3
-  [9] = ICData target-name 'foo', arg-desc CP#5
-  [10] = TypeArgumentsForInstanceAllocation #lib::A [dart.core::List<#lib::C1>, dart.core::List<#lib::C2>]
-  [11] = StaticICData target '#lib::A::', arg-desc CP#3
-  [12] = ICData target-name 'foo', arg-desc CP#5
+  [6] = InterfaceCall target-name 'foo', arg-desc CP#5
+  [7] = Reserved
+  [8] = TypeArgs [dart:core::List < #lib::C3 >, dart:core::List < #lib::C4 >]
+  [9] = StaticICData target '#lib::A::'' (constructor)', arg-desc CP#3
+  [10] = TypeArgumentsForInstanceAllocation #lib::A [dart:core::List < #lib::C1 >, dart:core::List < #lib::C2 >]
+  [11] = StaticICData target '#lib::A::'' (constructor)', arg-desc CP#3
 }
 ]static method callA() → void {
   new self::A::•<self::C1, self::C2>().{self::A::foo}<self::C3, self::C4>();
@@ -1398,9 +1411,9 @@
   new self::A::•<core::List<self::C1>, core::List<self::C2>>().{self::A::foo}<core::List<self::C3>, core::List<self::C4>>();
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                7
-  CheckStack
+  CheckStack           0
   Allocate             CP#14
   StoreLocal           r3
   Push                 r3
@@ -1452,32 +1465,33 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = ClosureFunction foo <T extends dart.core::Object = dynamic>(T t) → void;
-  [1] = InstanceField dart.core::_Closure::_context
+  [0] = ClosureFunction 0
+  [1] = InstanceField dart:core::_Closure::_context (field)
   [2] = Reserved
-  [3] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [3] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [4] = Reserved
   [5] = EmptyTypeArguments
-  [6] = InstanceField dart.core::_Closure::_function_type_arguments
+  [6] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [7] = Reserved
   [8] = ArgDesc num-args 4, num-type-args 0, names []
-  [9] = StaticICData target 'dart._internal::_prependTypeArguments', arg-desc CP#8
-  [10] = Type T
+  [9] = StaticICData target 'dart:_internal::_prependTypeArguments', arg-desc CP#8
+  [10] = Type #lib::testPartialInstantiation::Closure/0::TypeParam/0
   [11] = String 't'
   [12] = SubtypeTestCache
   [13] = EndClosureFunctionScope
-  [14] = Class dart.core::_Closure
-  [15] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [14] = Class dart:core::_Closure
+  [15] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [16] = Reserved
-  [17] = InstanceField dart.core::_Closure::_function
+  [17] = InstanceField dart:core::_Closure::_function (field)
   [18] = Reserved
-  [19] = TypeArgs [dart.core::int]
+  [19] = TypeArgs [dart:core::int]
   [20] = ArgDesc num-args 2, num-type-args 0, names []
-  [21] = StaticICData target 'dart._internal::_boundsCheckForPartialInstantiation', arg-desc CP#20
+  [21] = StaticICData target 'dart:_internal::_boundsCheckForPartialInstantiation', arg-desc CP#20
 }
-Closure CP#0 {
+Closure #lib::testPartialInstantiation::foo <dart:core::Object T> (#lib::testPartialInstantiation::Closure/0::TypeParam/0 t) -> void
+ClosureBytecode {
   EntryFixed           2, 3
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   LoadFieldTOS         CP#1
   PopLocal             r1
@@ -1486,10 +1500,10 @@
   StoreLocal           r0
   PushConstant         CP#5
   JumpIfEqStrict       L1
-  CheckFunctionTypeArgs 0, 2
+  CheckFunctionTypeArgs 0, r2
   Jump                 L2
 L1:
-  CheckFunctionTypeArgs 1, 0
+  CheckFunctionTypeArgs 1, r0
 L2:
   Push                 r0
   Push                 FP[-6]
@@ -1516,9 +1530,9 @@
   return intFunc;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/deferred_lib.dart.expect b/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
index 67139cb..ec106c3 100644
--- a/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
+++ b/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
@@ -3,9 +3,9 @@
 import "./hello.dart" as hel;
 
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushNull
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -16,16 +16,16 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.async::Future::value', arg-desc CP#0
+  [1] = StaticICData target 'dart:async::Future::value (constructor)', arg-desc CP#0
   [2] = ArgDesc num-args 0, num-type-args 0, names []
-  [3] = StaticICData target '#lib1::main', arg-desc CP#2
+  [3] = StaticICData target '#pkg/vm/testcases/bytecode/hello.dart::main', arg-desc CP#2
 }
 ]static method callDeferred() → dynamic
   return let final dynamic #t1 = CheckLibraryIsLoaded(lib) in hel::main();
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -33,14 +33,14 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.async::Future::value', arg-desc CP#0
+  [1] = StaticICData target 'dart:async::Future::value (constructor)', arg-desc CP#0
 }
 ]static method testLoadLibrary() → dynamic
   return LoadLibrary(lib);
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
index d28770d..695f1a9 100644
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -9,9 +9,9 @@
   field core::int foo4;
   field core::int foo5 = 43;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   PushInt              42
   StoreFieldTOS        CP#0
@@ -31,24 +31,24 @@
   PushNull
   ReturnTOS
 }
-Nullable fields: [#lib::A::foo1, #lib::A::foo2]
+Nullable fields: [#lib::A::foo1 (field), #lib::A::foo2 (field)]}
 ConstantPool {
-  [0] = InstanceField #lib::A::foo3
+  [0] = InstanceField #lib::A::foo3 (field)
   [1] = Reserved
-  [2] = InstanceField #lib::A::foo5
+  [2] = InstanceField #lib::A::foo5 (field)
   [3] = Reserved
-  [4] = InstanceField #lib::A::foo4
+  [4] = InstanceField #lib::A::foo4 (field)
   [5] = Reserved
   [6] = ArgDesc num-args 1, num-type-args 0, names []
-  [7] = StaticICData target 'dart.core::Object::', arg-desc CP#6
+  [7] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#6
 }
 ]  constructor •(core::int foo4) → self::A
     : self::A::foo1 = null, self::A::foo4 = foo4, self::A::foo5 = 44, super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-7]
   PushInt              42
   StoreFieldTOS        CP#0
@@ -70,24 +70,24 @@
   PushNull
   ReturnTOS
 }
-Nullable fields: [#lib::A::foo2, #lib::A::foo4]
+Nullable fields: [#lib::A::foo2 (field), #lib::A::foo4 (field)]}
 ConstantPool {
-  [0] = InstanceField #lib::A::foo3
+  [0] = InstanceField #lib::A::foo3 (field)
   [1] = Reserved
-  [2] = InstanceField #lib::A::foo5
+  [2] = InstanceField #lib::A::foo5 (field)
   [3] = Reserved
-  [4] = InstanceField #lib::A::foo1
+  [4] = InstanceField #lib::A::foo1 (field)
   [5] = Reserved
   [6] = ArgDesc num-args 1, num-type-args 0, names []
-  [7] = StaticICData target 'dart.core::Object::', arg-desc CP#6
+  [7] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#6
 }
 ]  constructor constr2(core::int x, core::int y) → self::A
     : self::A::foo4 = null, self::A::foo1 = x, self::A::foo5 = y.{core::num::+}(1), super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushInt              45
   PushConstant         CP#1
@@ -98,15 +98,15 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = StaticICData target '#lib::A::', arg-desc CP#0
+  [1] = StaticICData target '#lib::A::'' (constructor)', arg-desc CP#0
 }
 ]  constructor redirecting1() → self::A
     : this self::A::•(45)
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-8]
   Push                 FP[-7]
   Push                 FP[-6]
@@ -120,7 +120,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 3, num-type-args 0, names []
-  [1] = StaticICData target '#lib::A::constr2', arg-desc CP#0
+  [1] = StaticICData target '#lib::A::constr2 (constructor)', arg-desc CP#0
 }
 ]  constructor redirecting2(core::int a, core::int b, core::int c) → self::A
     : this self::A::constr2(a, b.{core::num::*}(c))
@@ -131,9 +131,9 @@
   static field core::int foo7 = 47;
   static const field core::int foo8 = 48;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushInt              46
   StoreFieldTOS        CP#0
@@ -146,18 +146,18 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = InstanceField #lib::B::foo6
+  [0] = InstanceField #lib::B::foo6 (field)
   [1] = Reserved
   [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = StaticICData target '#lib::A::', arg-desc CP#2
+  [3] = StaticICData target '#lib::A::'' (constructor)', arg-desc CP#2
 }
 ]  constructor •() → self::B
     : super self::A::•(49)
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-7]
   PushInt              46
   StoreFieldTOS        CP#0
@@ -175,19 +175,19 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = InstanceField #lib::B::foo6
+  [0] = InstanceField #lib::B::foo6 (field)
   [1] = Reserved
   [2] = ArgDesc num-args 4, num-type-args 0, names []
-  [3] = StaticICData target '#lib::A::redirecting2', arg-desc CP#2
+  [3] = StaticICData target '#lib::A::redirecting2 (constructor)', arg-desc CP#2
 }
 ]  constructor c2(core::int i, core::int j) → self::B
     : self::B::foo6 = 50, super self::A::redirecting2(i, j, 51)
     ;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/hello.dart.expect b/pkg/vm/testcases/bytecode/hello.dart.expect
index db4aaaf..0c5c9de 100644
--- a/pkg/vm/testcases/bytecode/hello.dart.expect
+++ b/pkg/vm/testcases/bytecode/hello.dart.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
@@ -16,7 +16,7 @@
 ConstantPool {
   [0] = String 'Hello, Dart Bytecode!'
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::print', arg-desc CP#1
 }
 ]static method main() → dynamic {
   core::print("Hello, Dart Bytecode!");
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
index 1cd0231..1407a9e 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -7,9 +7,9 @@
   generic-covariant-impl field self::Base::T1 t1 = null;
   generic-covariant-impl field self::Base::T2 t2 = null;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -48,17 +48,17 @@
   PushNull
   ReturnTOS
 }
-Nullable fields: [#lib::Base::t1, #lib::Base::t2]
+Nullable fields: [#lib::Base::t1 (field), #lib::Base::t2 (field)]}
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
   [2] = String 'Base: '
-  [3] = Type #lib::Base::T1
+  [3] = Type #lib::Base::TypeParam/0
   [4] = TypeArgumentsField #lib::Base
   [5] = String ', '
-  [6] = Type #lib::Base::T2
-  [7] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
-  [8] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [6] = Type #lib::Base::TypeParam/1
+  [7] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#0
+  [8] = StaticICData target 'dart:core::print', arg-desc CP#0
 }
 ]  constructor •() → self::Base<self::Base::T1, self::Base::T2>
     : super core::Object::•() {
@@ -67,9 +67,9 @@
 }
 class A extends self::Base<core::int, core::String> {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -79,7 +79,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::Base::', arg-desc CP#0
+  [1] = StaticICData target '#lib::Base::'' (constructor)', arg-desc CP#0
 }
 ]  constructor •(core::String s) → self::A
     : super self::Base::•()
@@ -87,9 +87,9 @@
 }
 class B<T extends core::Object = dynamic> extends self::Base<core::List<self::B::T>, core::String> {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -119,12 +119,12 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::Base::', arg-desc CP#0
+  [1] = StaticICData target '#lib::Base::'' (constructor)', arg-desc CP#0
   [2] = String 'B: '
-  [3] = Type #lib::B::T
+  [3] = Type #lib::B::TypeParam/0
   [4] = TypeArgumentsField #lib::B
-  [5] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
-  [6] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [5] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#0
+  [6] = StaticICData target 'dart:core::print', arg-desc CP#0
 }
 ]  constructor •() → self::B<self::B::T>
     : super self::Base::•() {
@@ -133,9 +133,9 @@
 }
 class C extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -162,10 +162,10 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
   [2] = String 'C: '
-  [3] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#0
-  [4] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [3] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#0
+  [4] = StaticICData target 'dart:core::print', arg-desc CP#0
 }
 ]  constructor •(core::String s) → self::C
     : super core::Object::•() {
@@ -174,9 +174,9 @@
 }
 class E<K extends core::Object = dynamic, V extends core::Object = dynamic> extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -186,15 +186,15 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::E<self::E::K, self::E::V>
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadTypeArgumentsField CP#0
   PushConstant         CP#2
@@ -204,16 +204,16 @@
 ConstantPool {
   [0] = TypeArgumentsField #lib::E
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::Map::', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::Map::'' (constructor)', arg-desc CP#1
 }
 ]  method test_reuse1() → dynamic
     return core::Map::•<self::E::K, self::E::V>();
 }
 class F<K extends core::Object = dynamic, V extends core::Object = dynamic> extends self::E<core::String, core::List<self::F::V>> {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -223,15 +223,15 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::E::', arg-desc CP#0
+  [1] = StaticICData target '#lib::E::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::F<self::F::K, self::F::V>
     : super self::E::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadTypeArgumentsField CP#0
   PushConstant         CP#2
@@ -241,16 +241,16 @@
 ConstantPool {
   [0] = TypeArgumentsField #lib::F
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::Map::', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::Map::'' (constructor)', arg-desc CP#1
 }
 ]  method test_reuse2() → dynamic
     return core::Map::•<core::String, core::List<self::F::V>>();
 }
 class G<K extends core::Object = dynamic, V extends core::Object = dynamic> extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -260,15 +260,15 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  constructor •() → self::G<self::G::K, self::G::V>
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushNull
   InstantiateTypeArgumentsTOS 0, CP#1
@@ -283,18 +283,18 @@
 }
 ConstantPool {
   [0] = Class #lib::H
-  [1] = TypeArgumentsForInstanceAllocation #lib::H [dart.core::String, #lib::G::test_factory::K, #lib::G::test_factory::V]
+  [1] = TypeArgumentsForInstanceAllocation #lib::H [dart:core::String, #lib::G::test_factory (constructor)::TypeParam/0, #lib::G::test_factory (constructor)::TypeParam/1]
   [2] = ArgDesc num-args 1, num-type-args 0, names []
-  [3] = StaticICData target '#lib::H::', arg-desc CP#2
+  [3] = StaticICData target '#lib::H::'' (constructor)', arg-desc CP#2
 }
 ]  static factory test_factory<K extends core::Object = dynamic, V extends core::Object = dynamic>() → self::G<self::G::test_factory::K, self::G::test_factory::V>
     return new self::H::•<core::String, self::G::test_factory::K, self::G::test_factory::V>();
 }
 class H<P1 extends core::Object = dynamic, P2 extends core::Object = dynamic, P3 extends core::Object = dynamic> extends self::G<self::H::P2, self::H::P3> {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -304,7 +304,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::G::', arg-desc CP#0
+  [1] = StaticICData target '#lib::G::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::H<self::H::P1, self::H::P2, self::H::P3>
     : super self::G::•()
@@ -312,9 +312,9 @@
 }
 class I extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -324,18 +324,18 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  constructor •(dynamic param) → self::I
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   EntryOptional        1, 0, 1
   LoadConstant         r1, CP#0
   LoadConstant         r1, CP#1
   Frame                1
-  CheckStack
+  CheckStack           0
   Allocate             CP#2
   StoreLocal           r2
   Push                 r2
@@ -350,16 +350,16 @@
   [1] = Null
   [2] = Class #lib::I
   [3] = ArgDesc num-args 2, num-type-args 0, names []
-  [4] = StaticICData target '#lib::I::', arg-desc CP#3
+  [4] = StaticICData target '#lib::I::'' (constructor)', arg-desc CP#3
 }
 ]  static factory test_factory2({dynamic param = null}) → self::I
     return new self::I::•(param);
 }
 class J extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   NativeCall           CP#0
   ReturnTOS
@@ -372,9 +372,9 @@
 }
 abstract class K<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#0
   AllocateT
@@ -388,16 +388,16 @@
 ConstantPool {
   [0] = Class #lib::TestTypeArgReuse
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target '#lib::TestTypeArgReuse::', arg-desc CP#1
+  [2] = StaticICData target '#lib::TestTypeArgReuse::'' (constructor)', arg-desc CP#1
 }
 ]  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::K<self::K::•::A, self::K::•::B>
     return new self::TestTypeArgReuse::•<self::K::•::A, self::K::•::B>();
 }
 class TestTypeArgReuse<P extends core::Object = dynamic, Q extends core::Object = dynamic> extends self::Base<self::TestTypeArgReuse::P, self::TestTypeArgReuse::Q> implements self::K<self::TestTypeArgReuse::P, self::TestTypeArgReuse::Q> {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -407,16 +407,16 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::Base::', arg-desc CP#0
+  [1] = StaticICData target '#lib::Base::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::TestTypeArgReuse<self::TestTypeArgReuse::P, self::TestTypeArgReuse::Q>
     : super self::Base::•()
     ;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Allocate             CP#0
   StoreLocal           r0
   Push                 r0
@@ -430,14 +430,14 @@
   [0] = Class #lib::C
   [1] = String 'hello'
   [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = StaticICData target '#lib::C::', arg-desc CP#2
+  [3] = StaticICData target '#lib::C::'' (constructor)', arg-desc CP#2
 }
 ]static method foo1() → dynamic
   return new self::C::•("hello");
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushConstant         CP#1
   PushConstant         CP#0
   AllocateT
@@ -465,21 +465,21 @@
   [1] = TypeArgumentsForInstanceAllocation #lib::A []
   [2] = String 'hi'
   [3] = ArgDesc num-args 2, num-type-args 0, names []
-  [4] = StaticICData target '#lib::A::', arg-desc CP#3
+  [4] = StaticICData target '#lib::A::'' (constructor)', arg-desc CP#3
   [5] = Class #lib::B
-  [6] = TypeArgumentsForInstanceAllocation #lib::B [dart.core::int]
+  [6] = TypeArgumentsForInstanceAllocation #lib::B [dart:core::int]
   [7] = ArgDesc num-args 1, num-type-args 0, names []
-  [8] = StaticICData target '#lib::B::', arg-desc CP#7
+  [8] = StaticICData target '#lib::B::'' (constructor)', arg-desc CP#7
 }
 ]static method foo2() → void {
   new self::A::•("hi");
   new self::B::•<core::int>();
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
-  CheckFunctionTypeArgs 1, 0
+  CheckStack           0
+  CheckFunctionTypeArgs 1, r0
   PushNull
   Push                 r0
   InstantiateTypeArgumentsTOS 0, CP#1
@@ -496,17 +496,17 @@
 }
 ConstantPool {
   [0] = Class #lib::B
-  [1] = TypeArgumentsForInstanceAllocation #lib::B [dart.core::List<#lib::foo3::T>]
+  [1] = TypeArgumentsForInstanceAllocation #lib::B [dart:core::List < #lib::foo3::TypeParam/0 >]
   [2] = ArgDesc num-args 1, num-type-args 0, names []
-  [3] = StaticICData target '#lib::B::', arg-desc CP#2
+  [3] = StaticICData target '#lib::B::'' (constructor)', arg-desc CP#2
 }
 ]static method foo3<T extends core::Object = dynamic>() → void {
   new self::B::•<core::List<self::foo3::T>>();
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
@@ -515,17 +515,17 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation #lib::G [dart.core::int, dart.core::List<dart.core::String>]
+  [0] = TypeArgumentsForInstanceAllocation #lib::G [dart:core::int, dart:core::List < dart:core::String >]
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target '#lib::G::test_factory', arg-desc CP#1
+  [2] = StaticICData target '#lib::G::test_factory (constructor)', arg-desc CP#1
 }
 ]static method foo4() → void {
   self::G::test_factory<core::int, core::List<core::String>>();
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -540,18 +540,18 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::I::test_factory2', arg-desc CP#0
+  [1] = StaticICData target '#lib::I::test_factory2 (constructor)', arg-desc CP#0
   [2] = ArgDesc num-args 2, num-type-args 0, names [param]
-  [3] = StaticICData target '#lib::I::test_factory2', arg-desc CP#2
+  [3] = StaticICData target '#lib::I::test_factory2 (constructor)', arg-desc CP#2
 }
 ]static method foo5() → void {
   self::I::test_factory2();
   self::I::test_factory2(param: 42);
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushInt              0
   PushConstant         CP#2
@@ -559,16 +559,16 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation dart.core::_GrowableList [dart.core::String]
+  [0] = TypeArgumentsForInstanceAllocation dart:core::_GrowableList [dart:core::String]
   [1] = ArgDesc num-args 2, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::_GrowableList::', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::_GrowableList::'' (constructor)', arg-desc CP#1
 }
 ]static method foo6() → dynamic
   return core::_GrowableList::•<core::String>(0);
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   Push                 FP[-5]
   PushConstant         CP#2
@@ -576,16 +576,16 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation dart.core::_List [dart.core::int]
+  [0] = TypeArgumentsForInstanceAllocation dart:core::_List [dart:core::int]
   [1] = ArgDesc num-args 2, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::_List::', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::_List::'' (constructor)', arg-desc CP#1
 }
 ]static method foo7(core::int n) → dynamic
   return core::_List::•<core::int>(n);
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#1
   IndirectStaticCall   0, CP#0
   Drop1
@@ -603,7 +603,7 @@
   [0] = ArgDesc num-args 0, num-type-args 0, names []
   [1] = StaticICData target '#lib::foo1', arg-desc CP#0
   [2] = StaticICData target '#lib::foo2', arg-desc CP#0
-  [3] = TypeArgs [dart.core::String]
+  [3] = TypeArgs [dart:core::String]
   [4] = ArgDesc num-args 0, num-type-args 1, names []
   [5] = StaticICData target '#lib::foo3', arg-desc CP#4
 }
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index e5ace82..4649642 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -7,9 +7,9 @@
   final field core::int index;
   final field core::String _name;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#13
   ReturnTOS
 }
@@ -17,23 +17,23 @@
   [0] = Null
   [1] = Int 0
   [2] = String 'A.elem1'
-  [3] = Instance #lib::A type-args CP#0 {index: CP#1, _name: CP#2}
+  [3] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#1, #lib::A::_name (field): CP#2}
   [4] = Int 1
   [5] = String 'A.elem2'
-  [6] = Instance #lib::A type-args CP#0 {index: CP#4, _name: CP#5}
+  [6] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#4, #lib::A::_name (field): CP#5}
   [7] = Int 2
   [8] = String 'A.elem3'
-  [9] = Instance #lib::A type-args CP#0 {index: CP#7, _name: CP#8}
+  [9] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#7, #lib::A::_name (field): CP#8}
   [10] = Int 3
   [11] = String 'A.elem4'
-  [12] = Instance #lib::A type-args CP#0 {index: CP#10, _name: CP#11}
+  [12] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#10, #lib::A::_name (field): CP#11}
   [13] = List type-arg #lib::A, entries CP# [3, 6, 9, 12]
 }
 ]  static const field core::List<self::A> values = const <self::A>[self::A::elem1, self::A::elem2, self::A::elem3, self::A::elem4];
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -41,13 +41,13 @@
   [0] = Null
   [1] = Int 0
   [2] = String 'A.elem1'
-  [3] = Instance #lib::A type-args CP#0 {index: CP#1, _name: CP#2}
+  [3] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#1, #lib::A::_name (field): CP#2}
 }
 ]  static const field self::A elem1 = const self::A::•(0, "A.elem1");
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -55,13 +55,13 @@
   [0] = Null
   [1] = Int 1
   [2] = String 'A.elem2'
-  [3] = Instance #lib::A type-args CP#0 {index: CP#1, _name: CP#2}
+  [3] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#1, #lib::A::_name (field): CP#2}
 }
 ]  static const field self::A elem2 = const self::A::•(1, "A.elem2");
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -69,13 +69,13 @@
   [0] = Null
   [1] = Int 2
   [2] = String 'A.elem3'
-  [3] = Instance #lib::A type-args CP#0 {index: CP#1, _name: CP#2}
+  [3] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#1, #lib::A::_name (field): CP#2}
 }
 ]  static const field self::A elem3 = const self::A::•(2, "A.elem3");
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -83,13 +83,13 @@
   [0] = Null
   [1] = Int 3
   [2] = String 'A.elem4'
-  [3] = Instance #lib::A type-args CP#0 {index: CP#1, _name: CP#2}
+  [3] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#1, #lib::A::_name (field): CP#2}
 }
 ]  static const field self::A elem4 = const self::A::•(3, "A.elem4");
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-7]
   Push                 FP[-6]
   StoreFieldTOS        CP#0
@@ -104,20 +104,20 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = InstanceField #lib::A::index
+  [0] = InstanceField #lib::A::index (field)
   [1] = Reserved
-  [2] = InstanceField #lib::A::_name
+  [2] = InstanceField #lib::A::_name (field)
   [3] = Reserved
   [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::Object::', arg-desc CP#4
+  [5] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#4
 }
 ]  const constructor •(core::int index, core::String _name) → self::A
     : self::A::index = index, self::A::_name = _name, super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -125,7 +125,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData get target '#lib::A::_name', arg-desc CP#0
+  [1] = StaticICData target '#lib::A::get:_name', arg-desc CP#0
 }
 ]  method toString() → core::String
     return this.{=self::A::_name};
@@ -133,9 +133,9 @@
 class B extends core::Object {
   final field core::int i;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   Push                 FP[-5]
   StoreFieldTOS        CP#0
@@ -147,10 +147,10 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = InstanceField #lib::B::i
+  [0] = InstanceField #lib::B::i (field)
   [1] = Reserved
   [2] = ArgDesc num-args 1, num-type-args 0, names []
-  [3] = StaticICData target 'dart.core::Object::', arg-desc CP#2
+  [3] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#2
 }
 ]  const constructor •(core::int i) → self::B
     : self::B::i = i, super core::Object::•()
@@ -159,9 +159,9 @@
 class C extends self::B {
   final field core::int j;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-8]
   Push                 FP[-7]
   Push                 FP[-6]
@@ -178,10 +178,10 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = InstanceField #lib::C::j
+  [0] = InstanceField #lib::C::j (field)
   [1] = Reserved
   [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = StaticICData target '#lib::B::', arg-desc CP#2
+  [3] = StaticICData target '#lib::B::'' (constructor)', arg-desc CP#2
 }
 ]  const constructor •(core::int a, core::int b, core::int c) → self::C
     : self::C::j = a.{core::num::+}(b), super self::B::•(c.{core::num::*}(5))
@@ -191,11 +191,11 @@
   final field dynamic x;
   final field dynamic y;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   EntryOptional        2, 1, 0
   LoadConstant         r2, CP#0
   Frame                0
-  CheckStack
+  CheckStack           0
   Push                 r0
   Push                 r1
   StoreFieldTOS        CP#1
@@ -211,12 +211,12 @@
 }
 ConstantPool {
   [0] = Null
-  [1] = InstanceField #lib::D::x
+  [1] = InstanceField #lib::D::x (field)
   [2] = Reserved
-  [3] = InstanceField #lib::D::y
+  [3] = InstanceField #lib::D::y (field)
   [4] = Reserved
   [5] = ArgDesc num-args 1, num-type-args 0, names []
-  [6] = StaticICData target 'dart.core::Object::', arg-desc CP#5
+  [6] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#5
 }
 ]  const constructor •(dynamic x, [dynamic y = null]) → self::D
     : self::D::x = x, self::D::y = y, super core::Object::•()
@@ -224,9 +224,9 @@
 }
 class E<T extends core::Object = dynamic> extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -236,7 +236,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  const constructor •() → self::E<self::E::T>
     : super core::Object::•()
@@ -244,9 +244,9 @@
 }
 class F<P extends core::Object = dynamic, Q extends core::Object = dynamic> extends self::E<core::Map<self::F::P, self::F::Q>> {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -256,16 +256,16 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::E::', arg-desc CP#0
+  [1] = StaticICData target '#lib::E::'' (constructor)', arg-desc CP#0
 }
 ]  const constructor •() → self::F<self::F::P, self::F::Q>
     : super self::E::•()
     ;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -273,14 +273,14 @@
   [0] = Null
   [1] = Int 2
   [2] = String 'A.elem3'
-  [3] = Instance #lib::A type-args CP#0 {index: CP#1, _name: CP#2}
+  [3] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#1, #lib::A::_name (field): CP#2}
 }
 ]static const field self::A c1 = self::A::elem3;
 static const field core::String c2 = "hello!";
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushInt              6
   ReturnTOS
 }
@@ -288,9 +288,9 @@
 }
 ]static const field core::int c3 = self::c2.{core::String::length};
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#3
   ReturnTOS
 }
@@ -298,28 +298,28 @@
   [0] = Null
   [1] = Int 3
   [2] = Int 15
-  [3] = Instance #lib::C type-args CP#0 {j: CP#1, i: CP#2}
+  [3] = Instance #lib::C type-args CP#0 {#lib::C::j (field): CP#1, #lib::B::i (field): CP#2}
 }
 ]static const field self::C c4 = const self::C::•(1, 2, 3);
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#3
   ReturnTOS
 }
 ConstantPool {
   [0] = Null
   [1] = Int 4
-  [2] = Instance #lib::B type-args CP#0 {i: CP#1}
-  [3] = Instance #lib::D type-args CP#0 {x: CP#2, y: CP#0}
+  [2] = Instance #lib::B type-args CP#0 {#lib::B::i (field): CP#1}
+  [3] = Instance #lib::D type-args CP#0 {#lib::D::x (field): CP#2, #lib::D::y (field): CP#0}
 }
 ]static const field self::D c5 = const self::D::•(const self::B::•(4));
 static field core::double fieldWithDoubleLiteralInitializer = 1.0;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#3
   PushConstant         CP#5
   IndirectStaticCall   1, CP#4
@@ -347,20 +347,20 @@
   [0] = Null
   [1] = Int 2
   [2] = String 'A.elem3'
-  [3] = Instance #lib::A type-args CP#0 {index: CP#1, _name: CP#2}
+  [3] = Instance #lib::A type-args CP#0 {#lib::A::index (field): CP#1, #lib::A::_name (field): CP#2}
   [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [5] = StaticICData target 'dart:core::print', arg-desc CP#4
   [6] = String 'hello!'
-  [7] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [8] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [7] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [8] = StaticICData target 'dart:core::print', arg-desc CP#4
   [9] = Int 3
   [10] = Int 15
-  [11] = Instance #lib::C type-args CP#0 {j: CP#9, i: CP#10}
-  [12] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [11] = Instance #lib::C type-args CP#0 {#lib::C::j (field): CP#9, #lib::B::i (field): CP#10}
+  [12] = StaticICData target 'dart:core::print', arg-desc CP#4
   [13] = Int 4
-  [14] = Instance #lib::B type-args CP#0 {i: CP#13}
-  [15] = Instance #lib::D type-args CP#0 {x: CP#14, y: CP#0}
-  [16] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [14] = Instance #lib::B type-args CP#0 {#lib::B::i (field): CP#13}
+  [15] = Instance #lib::D type-args CP#0 {#lib::D::x (field): CP#14, #lib::D::y (field): CP#0}
+  [16] = StaticICData target 'dart:core::print', arg-desc CP#4
 }
 ]static method test_constants1() → void {
   core::print(self::c1);
@@ -370,9 +370,9 @@
   core::print(self::c5);
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushInt              42
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -402,38 +402,38 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::print', arg-desc CP#0
   [2] = String 'foo'
-  [3] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [3] = StaticICData target 'dart:core::print', arg-desc CP#0
   [4] = Null
   [5] = Int 1
   [6] = String 'A.elem2'
-  [7] = Instance #lib::A type-args CP#4 {index: CP#5, _name: CP#6}
-  [8] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [7] = Instance #lib::A type-args CP#4 {#lib::A::index (field): CP#5, #lib::A::_name (field): CP#6}
+  [8] = StaticICData target 'dart:core::print', arg-desc CP#0
   [9] = Int 42
-  [10] = Type dart.core::int
-  [11] = List type-arg dart.core::Object, entries CP# [9, 2, 10]
-  [12] = StaticICData target 'dart.core::print', arg-desc CP#0
-  [13] = TypeArgumentsForInstanceAllocation dart.core::_ImmutableMap [dart.core::String, #lib::A]
+  [10] = Type dart:core::int
+  [11] = List type-arg dart:core::Object, entries CP# [9, 2, 10]
+  [12] = StaticICData target 'dart:core::print', arg-desc CP#0
+  [13] = TypeArgumentsForInstanceAllocation dart:core::_ImmutableMap [dart:core::String, #lib::A]
   [14] = String 'E2'
   [15] = String 'E4'
   [16] = Int 3
   [17] = String 'A.elem4'
-  [18] = Instance #lib::A type-args CP#4 {index: CP#16, _name: CP#17}
+  [18] = Instance #lib::A type-args CP#4 {#lib::A::index (field): CP#16, #lib::A::_name (field): CP#17}
   [19] = List type-arg dynamic, entries CP# [14, 7, 15, 18]
-  [20] = Instance dart.core::_ImmutableMap type-args CP#13 {_kvPairs: CP#19}
-  [21] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [20] = Instance dart:core::_ImmutableMap type-args CP#13 {dart:core::_ImmutableMap::_kvPairs (field): CP#19}
+  [21] = StaticICData target 'dart:core::print', arg-desc CP#0
   [22] = Int 9
   [23] = Int 30
-  [24] = Instance #lib::C type-args CP#4 {j: CP#22, i: CP#23}
-  [25] = TypeArgumentsForInstanceAllocation dart.core::_ImmutableMap [dart.core::String, dart.core::Object]
+  [24] = Instance #lib::C type-args CP#4 {#lib::C::j (field): CP#22, #lib::B::i (field): CP#23}
+  [25] = TypeArgumentsForInstanceAllocation dart:core::_ImmutableMap [dart:core::String, dart:core::Object]
   [26] = String 'bar'
   [27] = Int 6
-  [28] = Instance #lib::B type-args CP#4 {i: CP#27}
+  [28] = Instance #lib::B type-args CP#4 {#lib::B::i (field): CP#27}
   [29] = List type-arg dynamic, entries CP# [2, 9, 26, 28]
-  [30] = Instance dart.core::_ImmutableMap type-args CP#25 {_kvPairs: CP#29}
-  [31] = Instance #lib::D type-args CP#4 {x: CP#24, y: CP#30}
-  [32] = StaticICData target 'dart.core::print', arg-desc CP#0
+  [30] = Instance dart:core::_ImmutableMap type-args CP#25 {dart:core::_ImmutableMap::_kvPairs (field): CP#29}
+  [31] = Instance #lib::D type-args CP#4 {#lib::D::x (field): CP#24, #lib::D::y (field): CP#30}
+  [32] = StaticICData target 'dart:core::print', arg-desc CP#0
 }
 ]static method test_constants2() → void {
   core::print(42);
@@ -444,9 +444,9 @@
   core::print(const self::D::•(const self::C::•(4, 5, 6), const <core::String, core::Object>{"foo": 42, "bar": const self::B::•(self::c2.{core::String::length})}));
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   StoreLocal           r0
   Push                 r0
@@ -483,42 +483,43 @@
   Push                 r0
   PushInt              1
   Push                 FP[-5]
-  InstanceCall         1, CP#7
+  InterfaceCall        1, CP#7
   StoreIndexedTOS
   Push                 r0
   PushInt              2
-  PushConstant         CP#8
-  StoreIndexedTOS
   PushConstant         CP#9
-  IndirectStaticCall   2, CP#1
+  StoreIndexedTOS
   PushConstant         CP#10
+  IndirectStaticCall   2, CP#1
+  PushConstant         CP#11
   IndirectStaticCall   1, CP#3
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgs [dart.core::int]
+  [0] = TypeArgs [dart:core::int]
   [1] = ArgDesc num-args 2, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::List::_fromLiteral (constructor)', arg-desc CP#1
   [3] = ArgDesc num-args 1, num-type-args 0, names []
-  [4] = StaticICData target 'dart.core::print', arg-desc CP#3
-  [5] = TypeArgs [dart.core::String]
+  [4] = StaticICData target 'dart:core::print', arg-desc CP#3
+  [5] = TypeArgs [dart:core::String]
   [6] = String 'a'
-  [7] = ICData target-name 'toString', arg-desc CP#3
-  [8] = String 'b'
-  [9] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#1
-  [10] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [7] = InterfaceCall target-name 'toString', arg-desc CP#3
+  [8] = Reserved
+  [9] = String 'b'
+  [10] = StaticICData target 'dart:core::List::_fromLiteral (constructor)', arg-desc CP#1
+  [11] = StaticICData target 'dart:core::print', arg-desc CP#3
 }
 ]static method test_list_literal(core::int a) → void {
   core::print(<core::int>[1, a, 3]);
   core::print(<core::String>["a", a.{core::int::toString}(), "b"]);
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
-  CheckFunctionTypeArgs 1, 0
+  CheckStack           0
+  CheckFunctionTypeArgs 1, r0
   PushConstant         CP#0
   PushConstant         CP#1
   PushInt              4
@@ -561,29 +562,29 @@
   Push                 r1
   PushInt              2
   Push                 FP[-6]
-  InstanceCall         1, CP#8
+  InterfaceCall        1, CP#8
   StoreIndexedTOS
   Push                 r1
   PushInt              3
   PushInt              3
   StoreIndexedTOS
-  PushConstant         CP#9
-  IndirectStaticCall   2, CP#2
   PushConstant         CP#10
-  IndirectStaticCall   1, CP#4
-  Drop1
-  PushNull
-  Push                 r0
-  InstantiateTypeArgumentsTOS 0, CP#11
-  PushConstant         CP#12
-  PushConstant         CP#13
   IndirectStaticCall   2, CP#2
-  PushConstant         CP#14
+  PushConstant         CP#11
   IndirectStaticCall   1, CP#4
   Drop1
   PushNull
   Push                 r0
-  InstantiateTypeArgumentsTOS 0, CP#15
+  InstantiateTypeArgumentsTOS 0, CP#12
+  PushConstant         CP#13
+  PushConstant         CP#14
+  IndirectStaticCall   2, CP#2
+  PushConstant         CP#15
+  IndirectStaticCall   1, CP#4
+  Drop1
+  PushNull
+  Push                 r0
+  InstantiateTypeArgumentsTOS 0, CP#16
   PushConstant         CP#1
   PushInt              2
   CreateArrayTOS
@@ -596,33 +597,34 @@
   PushInt              1
   PushInt              4
   StoreIndexedTOS
-  PushConstant         CP#16
-  IndirectStaticCall   2, CP#2
   PushConstant         CP#17
+  IndirectStaticCall   2, CP#2
+  PushConstant         CP#18
   IndirectStaticCall   1, CP#4
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgs [dart.core::int, dart.core::int]
+  [0] = TypeArgs [dart:core::int, dart:core::int]
   [1] = TypeArgs [dynamic]
   [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#2
+  [3] = StaticICData target 'dart:core::Map::_fromLiteral (constructor)', arg-desc CP#2
   [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [6] = TypeArgs [dart.core::String, dart.core::int]
+  [5] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [6] = TypeArgs [dart:core::String, dart:core::int]
   [7] = String 'foo'
-  [8] = ICData target-name 'toString', arg-desc CP#4
-  [9] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#2
-  [10] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [11] = TypeArgs [dart.core::String, #lib::test_map_literal::T]
-  [12] = List type-arg dynamic, entries CP# []
-  [13] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#2
-  [14] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [15] = TypeArgs [#lib::test_map_literal::T, dart.core::int]
-  [16] = StaticICData target 'dart.core::Map::_fromLiteral', arg-desc CP#2
-  [17] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [8] = InterfaceCall target-name 'toString', arg-desc CP#4
+  [9] = Reserved
+  [10] = StaticICData target 'dart:core::Map::_fromLiteral (constructor)', arg-desc CP#2
+  [11] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [12] = TypeArgs [dart:core::String, #lib::test_map_literal::TypeParam/0]
+  [13] = List type-arg dynamic, entries CP# []
+  [14] = StaticICData target 'dart:core::Map::_fromLiteral (constructor)', arg-desc CP#2
+  [15] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [16] = TypeArgs [#lib::test_map_literal::TypeParam/0, dart:core::int]
+  [17] = StaticICData target 'dart:core::Map::_fromLiteral (constructor)', arg-desc CP#2
+  [18] = StaticICData target 'dart:core::print', arg-desc CP#4
 }
 ]static method test_map_literal<T extends core::Object = dynamic>(core::int a, core::int b, self::test_map_literal::T c) → void {
   core::print(<core::int, core::int>{1: a, b: 2});
@@ -631,9 +633,9 @@
   core::print(<self::test_map_literal::T, core::int>{c: 4});
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
@@ -646,21 +648,21 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = Symbol 'test_symbol'
+  [0] = Symbol test_symbol
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [3] = Symbol #lib::'_private_symbol'
-  [4] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [3] = Symbol _private_symbol
+  [4] = StaticICData target 'dart:core::print', arg-desc CP#1
 }
 ]static method test_symbol() → void {
   core::print(#test_symbol);
   core::print(#_private_symbol);
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
-  CheckFunctionTypeArgs 1, 0
+  CheckStack           0
+  CheckFunctionTypeArgs 1, r0
   PushConstant         CP#0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
@@ -675,58 +677,58 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = Type dart.core::String
+  [0] = Type dart:core::String
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [3] = Type #lib::test_type_literal::T
-  [4] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [3] = Type #lib::test_type_literal::TypeParam/0
+  [4] = StaticICData target 'dart:core::print', arg-desc CP#1
 }
 ]static method test_type_literal<T extends core::Object = dynamic>() → void {
   core::print(core::String);
   core::print(self::test_type_literal::T);
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#1
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgumentsForInstanceAllocation #lib::F [dart.core::int, dart.core::String]
+  [0] = TypeArgumentsForInstanceAllocation #lib::F [dart:core::int, dart:core::String]
   [1] = Instance #lib::F type-args CP#0 {}
 }
 ]static method testGenericConstInstance() → dynamic
   return const self::F::•<core::int, core::String>();
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   ReturnTOS
 }
 ConstantPool {
-  [0] = Type <X extends dart.core::Object = dynamic>(X) → X
+  [0] = Type FunctionType <dart:core::Object X> (null::TypeParam/0) -> null::TypeParam/0
 }
 ]static method testGenericFunctionTypeLiteral() → dynamic
   return <X extends core::Object = dynamic>(X) → X;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushStatic           CP#0
   ReturnTOS
 }
 ConstantPool {
-  [0] = StaticField #lib::fieldWithDoubleLiteralInitializer
+  [0] = StaticField #lib::fieldWithDoubleLiteralInitializer (field)
 }
 ]static method testFieldWithDoubleLiteralInitializer() → dynamic
   return self::fieldWithDoubleLiteralInitializer;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
index 3c0804e..4fbdb3b 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -3,25 +3,24 @@
 import "dart:core" as core;
 
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushInt              0
   PopLocal             r0
   PushInt              0
   PopLocal             r1
 L2:
-  CheckStack
+  CheckStack           1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall         1, CP#1
+  InterfaceCall        1, CP#1
   CompareIntLt
-  AssertBoolean        0
   JumpIfFalse          L1
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall         2, CP#3
+  InterfaceCall        2, CP#4
   AddInt
   PopLocal             r0
   Push                 r1
@@ -36,9 +35,11 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData get target-name 'length', arg-desc CP#0
-  [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = ICData target-name '[]', arg-desc CP#2
+  [1] = InterfaceCall get target-name 'get:length', arg-desc CP#0
+  [2] = Reserved
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = InterfaceCall target-name '[]', arg-desc CP#3
+  [5] = Reserved
 }
 ]static method test_for(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -48,32 +49,30 @@
   return sum;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushInt              0
   PopLocal             r0
   PushInt              0
   PopLocal             r1
 L3:
-  CheckStack
+  CheckStack           1
   Push                 r1
   PushInt              0
   CompareIntGe
-  AssertBoolean        0
   JumpIfFalse          L1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall         1, CP#1
+  InterfaceCall        1, CP#1
   CompareIntGe
-  AssertBoolean        0
   JumpIfFalse          L2
   Jump                 L1
 L2:
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall         2, CP#3
+  InterfaceCall        2, CP#4
   AddInt
   PopLocal             r0
   Push                 r1
@@ -88,9 +87,11 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData get target-name 'length', arg-desc CP#0
-  [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = ICData target-name '[]', arg-desc CP#2
+  [1] = InterfaceCall get target-name 'get:length', arg-desc CP#0
+  [2] = Reserved
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = InterfaceCall target-name '[]', arg-desc CP#3
+  [5] = Reserved
 }
 ]static method test_for_break(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -104,33 +105,31 @@
   return sum;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushInt              0
   PopLocal             r0
   PushInt              100
   NegateInt
   PopLocal             r1
 L4:
-  CheckStack
+  CheckStack           1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall         1, CP#1
+  InterfaceCall        1, CP#1
   CompareIntLt
-  AssertBoolean        0
   JumpIfFalse          L1
   Push                 r1
   PushInt              0
   CompareIntLt
-  AssertBoolean        0
   JumpIfFalse          L2
   Jump                 L3
 L2:
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall         2, CP#3
+  InterfaceCall        2, CP#4
   AddInt
   PopLocal             r0
 L3:
@@ -146,9 +145,11 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData get target-name 'length', arg-desc CP#0
-  [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = ICData target-name '[]', arg-desc CP#2
+  [1] = InterfaceCall get target-name 'get:length', arg-desc CP#0
+  [2] = Reserved
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = InterfaceCall target-name '[]', arg-desc CP#3
+  [5] = Reserved
 }
 ]static method test_for_continue(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -163,20 +164,19 @@
   return sum;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
+  CheckStack           0
   PushInt              0
   PopLocal             r0
   PushInt              0
   PopLocal             r1
 L2:
-  CheckStack
+  CheckStack           1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall         1, CP#1
+  InterfaceCall        1, CP#1
   CompareIntLt
-  AssertBoolean        0
   JumpIfFalse          L1
   Push                 r0
   Push                 FP[-5]
@@ -188,7 +188,7 @@
   StoreLocal           r1
   PopLocal             r3
   Push                 r2
-  InstanceCall         2, CP#3
+  InterfaceCall        2, CP#4
   AddInt
   PopLocal             r0
   Jump                 L2
@@ -198,9 +198,11 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData get target-name 'length', arg-desc CP#0
-  [2] = ArgDesc num-args 2, num-type-args 0, names []
-  [3] = ICData target-name '[]', arg-desc CP#2
+  [1] = InterfaceCall get target-name 'get:length', arg-desc CP#0
+  [2] = Reserved
+  [3] = ArgDesc num-args 2, num-type-args 0, names []
+  [4] = InterfaceCall target-name '[]', arg-desc CP#3
+  [5] = Reserved
 }
 ]static method test_while(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -211,19 +213,19 @@
   return sum;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushInt              0
   PopLocal             r0
   PushInt              0
   PopLocal             r1
 L1:
-  CheckStack
+  CheckStack           1
   Push                 r0
   Push                 FP[-5]
   Push                 r1
-  InstanceCall         2, CP#1
+  InterfaceCall        2, CP#1
   AddInt
   PopLocal             r0
   Push                 r1
@@ -232,18 +234,19 @@
   PopLocal             r1
   Push                 r1
   Push                 FP[-5]
-  InstanceCall         1, CP#3
+  InterfaceCall        1, CP#4
   CompareIntLt
-  AssertBoolean        0
   JumpIfTrue           L1
   Push                 r0
   ReturnTOS
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '[]', arg-desc CP#0
-  [2] = ArgDesc num-args 1, num-type-args 0, names []
-  [3] = ICData get target-name 'length', arg-desc CP#2
+  [1] = InterfaceCall target-name '[]', arg-desc CP#0
+  [2] = Reserved
+  [3] = ArgDesc num-args 1, num-type-args 0, names []
+  [4] = InterfaceCall get target-name 'get:length', arg-desc CP#3
+  [5] = Reserved
 }
 ]static method test_do_while(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -256,21 +259,21 @@
   return sum;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                3
-  CheckStack
+  CheckStack           0
   PushInt              0
   PopLocal             r0
   Push                 FP[-5]
-  InstanceCall         1, CP#1
+  InterfaceCall        1, CP#1
   PopLocal             r1
 L2:
-  CheckStack
+  CheckStack           1
   Push                 r1
-  InstanceCall         1, CP#2
+  InterfaceCall        1, CP#3
   JumpIfFalse          L1
   Push                 r1
-  InstanceCall         1, CP#3
+  InterfaceCall        1, CP#5
   PopLocal             r2
   Push                 r0
   Push                 r2
@@ -283,9 +286,12 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData get target-name 'iterator', arg-desc CP#0
-  [2] = ICData target-name 'moveNext', arg-desc CP#0
-  [3] = ICData get target-name 'current', arg-desc CP#0
+  [1] = InterfaceCall get target-name 'get:iterator', arg-desc CP#0
+  [2] = Reserved
+  [3] = InterfaceCall target-name 'moveNext', arg-desc CP#0
+  [4] = Reserved
+  [5] = InterfaceCall get target-name 'get:current', arg-desc CP#0
+  [6] = Reserved
 }
 ]static method test_for_in(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -295,23 +301,23 @@
   return sum;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
+  CheckStack           0
   PushInt              0
   PopLocal             r0
   PushInt              42
   PopLocal             r1
   Push                 FP[-5]
-  InstanceCall         1, CP#1
+  InterfaceCall        1, CP#1
   PopLocal             r2
 L2:
-  CheckStack
+  CheckStack           1
   Push                 r2
-  InstanceCall         1, CP#2
+  InterfaceCall        1, CP#3
   JumpIfFalse          L1
   Push                 r2
-  InstanceCall         1, CP#3
+  InterfaceCall        1, CP#5
   PopLocal             r3
   Push                 r3
   PopLocal             r1
@@ -326,9 +332,12 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData get target-name 'iterator', arg-desc CP#0
-  [2] = ICData target-name 'moveNext', arg-desc CP#0
-  [3] = ICData get target-name 'current', arg-desc CP#0
+  [1] = InterfaceCall get target-name 'get:iterator', arg-desc CP#0
+  [2] = Reserved
+  [3] = InterfaceCall target-name 'moveNext', arg-desc CP#0
+  [4] = Reserved
+  [5] = InterfaceCall get target-name 'get:current', arg-desc CP#0
+  [6] = Reserved
 }
 ]static method test_for_in_with_outer_var(core::List<core::int> list) → core::int {
   core::int sum = 0;
@@ -340,9 +349,9 @@
   return sum;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/optional_params.dart.expect b/pkg/vm/testcases/bytecode/optional_params.dart.expect
index bd33fe5..d715039 100644
--- a/pkg/vm/testcases/bytecode/optional_params.dart.expect
+++ b/pkg/vm/testcases/bytecode/optional_params.dart.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   EntryOptional        1, 2, 0
   LoadConstant         r1, CP#0
   LoadConstant         r2, CP#1
   Frame                1
-  CheckStack
+  CheckStack           0
   PushNull
   PushInt              2
   CreateArrayTOS
@@ -68,14 +68,14 @@
   [1] = String 'default_b'
   [2] = String 'x = '
   [3] = ArgDesc num-args 1, num-type-args 0, names []
-  [4] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#3
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [4] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#3
+  [5] = StaticICData target 'dart:core::print', arg-desc CP#3
   [6] = String 'a = '
-  [7] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#3
-  [8] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [7] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#3
+  [8] = StaticICData target 'dart:core::print', arg-desc CP#3
   [9] = String 'b = '
-  [10] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#3
-  [11] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [10] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#3
+  [11] = StaticICData target 'dart:core::print', arg-desc CP#3
 }
 ]static method foo1(dynamic x, [dynamic a = "default_a", dynamic b = "default_b"]) → void {
   core::print("x = ${x}");
@@ -83,7 +83,7 @@
   core::print("b = ${b}");
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   EntryOptional        2, 0, 3
   LoadConstant         r2, CP#0
   LoadConstant         r2, CP#1
@@ -92,7 +92,7 @@
   LoadConstant         r4, CP#5
   LoadConstant         r4, CP#6
   Frame                1
-  CheckStack
+  CheckStack           0
   PushNull
   PushInt              2
   CreateArrayTOS
@@ -186,25 +186,25 @@
   [1] = Int 42
   [2] = String 'b'
   [3] = String 'default_b'
-  [4] = List type-arg dart.core::String, entries CP# [3]
+  [4] = List type-arg dart:core::String, entries CP# [3]
   [5] = String 'c'
   [6] = String 'default_c'
   [7] = String 'y = '
   [8] = ArgDesc num-args 1, num-type-args 0, names []
-  [9] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#8
-  [10] = StaticICData target 'dart.core::print', arg-desc CP#8
+  [9] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#8
+  [10] = StaticICData target 'dart:core::print', arg-desc CP#8
   [11] = String 'z = '
-  [12] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#8
-  [13] = StaticICData target 'dart.core::print', arg-desc CP#8
+  [12] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#8
+  [13] = StaticICData target 'dart:core::print', arg-desc CP#8
   [14] = String 'a = '
-  [15] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#8
-  [16] = StaticICData target 'dart.core::print', arg-desc CP#8
+  [15] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#8
+  [16] = StaticICData target 'dart:core::print', arg-desc CP#8
   [17] = String 'b = '
-  [18] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#8
-  [19] = StaticICData target 'dart.core::print', arg-desc CP#8
+  [18] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#8
+  [19] = StaticICData target 'dart:core::print', arg-desc CP#8
   [20] = String 'c = '
-  [21] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#8
-  [22] = StaticICData target 'dart.core::print', arg-desc CP#8
+  [21] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#8
+  [22] = StaticICData target 'dart:core::print', arg-desc CP#8
 }
 ]static method foo2(dynamic y, dynamic z, {dynamic c = "default_c", dynamic a = 42, dynamic b = const <core::String>["default_b"]}) → void {
   core::print("y = ${y}");
@@ -214,15 +214,15 @@
   core::print("c = ${c}");
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   EntryOptional        2, 0, 2
   LoadConstant         r2, CP#0
   LoadConstant         r2, CP#1
   LoadConstant         r3, CP#2
   LoadConstant         r3, CP#3
   Frame                1
-  CheckStack
-  CheckFunctionTypeArgs 2, 4
+  CheckStack           0
+  CheckFunctionTypeArgs 2, r4
   PushNull
   Push                 r4
   InstantiateType      CP#4
@@ -245,11 +245,11 @@
   [1] = Bool false
   [2] = String 'b'
   [3] = Null
-  [4] = Type #lib::foo3::P
+  [4] = Type #lib::foo3::TypeParam/0
   [5] = ArgDesc num-args 1, num-type-args 0, names []
-  [6] = StaticICData target 'dart.core::print', arg-desc CP#5
-  [7] = StaticICData target 'dart.core::print', arg-desc CP#5
-  [8] = StaticICData target 'dart.core::print', arg-desc CP#5
+  [6] = StaticICData target 'dart:core::print', arg-desc CP#5
+  [7] = StaticICData target 'dart:core::print', arg-desc CP#5
+  [8] = StaticICData target 'dart:core::print', arg-desc CP#5
 }
 ]static method foo3<P extends core::Object = dynamic, Q extends core::Object = dynamic>(dynamic z, dynamic y, {core::bool a = false, core::Map<self::foo3::P, self::foo3::Q> b = null}) → void {
   core::print(self::foo3::P);
@@ -257,9 +257,9 @@
   core::print(b);
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   PushConstant         CP#1
   PushConstant         CP#3
diff --git a/pkg/vm/testcases/bytecode/super_calls.dart.expect b/pkg/vm/testcases/bytecode/super_calls.dart.expect
index f466a6d..346cd8a 100644
--- a/pkg/vm/testcases/bytecode/super_calls.dart.expect
+++ b/pkg/vm/testcases/bytecode/super_calls.dart.expect
@@ -4,9 +4,9 @@
 
 class Base1 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -16,16 +16,16 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::Base1
     : super core::Object::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
-  CheckFunctionTypeArgs 1, 0
+  CheckStack           0
+  CheckFunctionTypeArgs 1, r0
   PushNull
   ReturnTOS
 }
@@ -33,9 +33,9 @@
 }
 ]  method foo<T extends core::Object = dynamic>(self::Base1::foo::T a1, core::int a2) → void {}
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushInt              42
   ReturnTOS
 }
@@ -44,9 +44,9 @@
 ]  get bar() → dynamic
     return 42;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
@@ -56,9 +56,9 @@
 }
 class A extends self::Base1 {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -68,15 +68,15 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::Base1::', arg-desc CP#0
+  [1] = StaticICData target '#lib::Base1::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::A
     : super self::Base1::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   Push                 FP[-6]
   PushConstant         CP#1
@@ -86,7 +86,7 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgs [dart.core::String]
+  [0] = TypeArgs [dart:core::String]
   [1] = String 'a1'
   [2] = ArgDesc num-args 3, num-type-args 1, names []
   [3] = StaticICData target '#lib::Base1::foo', arg-desc CP#2
@@ -94,9 +94,9 @@
 ]  method testSuperCall(core::int x) → dynamic
     return super.{self::Base1::foo}<core::String>("a1", 2);
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -104,14 +104,14 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData get target '#lib::Base1::foo', arg-desc CP#0
+  [1] = StaticICData target '#lib::Base1::get:foo', arg-desc CP#0
 }
 ]  method testSuperTearOff() → dynamic
     return super.{self::Base1::foo};
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -119,26 +119,26 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData get target '#lib::Base1::bar', arg-desc CP#0
+  [1] = StaticICData target '#lib::Base1::get:bar', arg-desc CP#0
 }
 ]  method testSuperGet() → dynamic
     return super.{self::Base1::bar};
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   Push                 FP[-5]
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
   PushConstant         CP#3
-  InstanceCall         3, CP#5
+  DynamicCall          3, CP#5
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgs [dart.core::int]
+  [0] = TypeArgs [dart:core::int]
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData get target '#lib::Base1::bar', arg-desc CP#1
+  [2] = StaticICData target '#lib::Base1::get:bar', arg-desc CP#1
   [3] = String 'param'
   [4] = ArgDesc num-args 2, num-type-args 1, names []
   [5] = ICData dynamic target-name 'call', arg-desc CP#4
@@ -146,9 +146,9 @@
 ]  method testSuperCallViaGetter() → dynamic
     return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{self::Base1::bar}.call<core::int>("param");
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushInt              3
   PushConstant         CP#1
@@ -159,7 +159,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = StaticICData set target '#lib::Base1::bazz', arg-desc CP#0
+  [1] = StaticICData target '#lib::Base1::set:bazz', arg-desc CP#0
 }
 ]  method testSuperSet() → dynamic {
     super.{self::Base1::bazz} = 3;
@@ -167,9 +167,9 @@
 }
 abstract class Base2 extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -179,7 +179,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::Base2
     : super core::Object::•()
@@ -190,9 +190,9 @@
 }
 abstract class B extends self::Base2 {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -202,18 +202,18 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::Base2::', arg-desc CP#0
+  [1] = StaticICData target '#lib::Base2::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::B
     : super self::Base2::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
-  PushConstant         CP#0
   PushConstant         CP#1
+  PushConstant         CP#0
   PushConstant         CP#2
   PushInt              5
   CreateArrayTOS
@@ -246,26 +246,26 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = String 'foo'
-  [1] = ArgDesc num-args 4, num-type-args 1, names []
+  [0] = ArgDesc num-args 4, num-type-args 1, names []
+  [1] = String 'foo'
   [2] = TypeArgs [dynamic]
-  [3] = TypeArgs [dart.core::double]
+  [3] = TypeArgs [dart:core::double]
   [4] = String 'a1'
   [5] = Double 3.14
   [6] = ArgDesc num-args 4, num-type-args 0, names []
-  [7] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#6
+  [7] = StaticICData target 'dart:core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#6
   [8] = ArgDesc num-args 2, num-type-args 0, names []
-  [9] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#8
+  [9] = StaticICData target 'dart:core::Object::noSuchMethod', arg-desc CP#8
 }
 ]  method testSuperCall(core::int x) → dynamic
     return super.{self::Base2::foo}<core::double>("a1", 3.14, 5);
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
-  PushConstant         CP#0
   PushConstant         CP#1
+  PushConstant         CP#0
   PushConstant         CP#2
   PushInt              1
   CreateArrayTOS
@@ -282,23 +282,23 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = String 'foo'
-  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = String 'foo'
   [2] = TypeArgs [dynamic]
   [3] = ArgDesc num-args 4, num-type-args 0, names []
-  [4] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
+  [4] = StaticICData target 'dart:core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
   [5] = ArgDesc num-args 2, num-type-args 0, names []
-  [6] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#5
+  [6] = StaticICData target 'dart:core::Object::noSuchMethod', arg-desc CP#5
 }
 ]  method testSuperTearOff() → dynamic
     return super.{self::Base2::foo};
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
-  PushConstant         CP#0
   PushConstant         CP#1
+  PushConstant         CP#0
   PushConstant         CP#2
   PushInt              1
   CreateArrayTOS
@@ -315,24 +315,24 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = String 'bar'
-  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [0] = ArgDesc num-args 1, num-type-args 0, names []
+  [1] = String 'bar'
   [2] = TypeArgs [dynamic]
   [3] = ArgDesc num-args 4, num-type-args 0, names []
-  [4] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
+  [4] = StaticICData target 'dart:core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
   [5] = ArgDesc num-args 2, num-type-args 0, names []
-  [6] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#5
+  [6] = StaticICData target 'dart:core::Object::noSuchMethod', arg-desc CP#5
 }
 ]  method testSuperGet() → dynamic
     return super.{self::Base2::bar};
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   PushConstant         CP#0
   Push                 FP[-5]
-  PushConstant         CP#1
   PushConstant         CP#2
+  PushConstant         CP#1
   PushConstant         CP#3
   PushInt              1
   CreateArrayTOS
@@ -347,18 +347,18 @@
   PushConstant         CP#7
   IndirectStaticCall   2, CP#6
   PushConstant         CP#8
-  InstanceCall         3, CP#10
+  DynamicCall          3, CP#10
   ReturnTOS
 }
 ConstantPool {
-  [0] = TypeArgs [dart.core::int]
-  [1] = String 'bar'
-  [2] = ArgDesc num-args 1, num-type-args 0, names []
+  [0] = TypeArgs [dart:core::int]
+  [1] = ArgDesc num-args 1, num-type-args 0, names []
+  [2] = String 'bar'
   [3] = TypeArgs [dynamic]
   [4] = ArgDesc num-args 4, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#4
+  [5] = StaticICData target 'dart:core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#4
   [6] = ArgDesc num-args 2, num-type-args 0, names []
-  [7] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#6
+  [7] = StaticICData target 'dart:core::Object::noSuchMethod', arg-desc CP#6
   [8] = String 'param'
   [9] = ArgDesc num-args 2, num-type-args 1, names []
   [10] = ICData dynamic target-name 'call', arg-desc CP#9
@@ -366,12 +366,12 @@
 ]  method testSuperCallViaGetter() → dynamic
     return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{self::Base2::bar}.call<core::int>("param");
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
-  PushConstant         CP#0
   PushConstant         CP#1
+  PushConstant         CP#0
   PushConstant         CP#2
   PushInt              2
   CreateArrayTOS
@@ -388,27 +388,27 @@
   PushConstant         CP#4
   IndirectStaticCall   4, CP#3
   PushConstant         CP#5
-  IndirectStaticCall   2, CP#1
+  IndirectStaticCall   2, CP#0
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
-  [0] = String 'bazz'
-  [1] = ArgDesc num-args 2, num-type-args 0, names []
+  [0] = ArgDesc num-args 2, num-type-args 0, names []
+  [1] = String 'bazz'
   [2] = TypeArgs [dynamic]
   [3] = ArgDesc num-args 4, num-type-args 0, names []
-  [4] = StaticICData target 'dart.core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
-  [5] = StaticICData target 'dart.core::Object::noSuchMethod', arg-desc CP#1
+  [4] = StaticICData target 'dart:core::_InvocationMirror::_allocateInvocationMirror', arg-desc CP#3
+  [5] = StaticICData target 'dart:core::Object::noSuchMethod', arg-desc CP#0
 }
 ]  method testSuperSet() → dynamic {
     super.{self::Base2::bazz} = 3;
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
index bb4fbbb..93301c3 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushNull
   PopLocal             r0
   Push                 FP[-5]
   PopLocal             r1
   Push                 r1
   PushInt              1
-  InstanceCall         2, CP#1
+  InterfaceCall        2, CP#1
   JumpIfTrue           L1
   Push                 r1
   PushInt              2
-  InstanceCall         2, CP#2
+  InterfaceCall        2, CP#1
   JumpIfTrue           L2
   Push                 r1
   PushInt              3
-  InstanceCall         2, CP#3
+  InterfaceCall        2, CP#1
   JumpIfTrue           L3
   Jump                 L4
 L1:
@@ -41,9 +41,8 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '==', arg-desc CP#0
-  [2] = ICData target-name '==', arg-desc CP#0
-  [3] = ICData target-name '==', arg-desc CP#0
+  [1] = InterfaceCall target-name '==', arg-desc CP#0
+  [2] = Reserved
 }
 ]static method foo1(core::int x) → core::int {
   core::int y;
@@ -71,36 +70,36 @@
   return y;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushNull
   PopLocal             r0
   Push                 FP[-5]
   PopLocal             r1
   Push                 r1
   PushInt              1
-  InstanceCall         2, CP#1
+  InterfaceCall        2, CP#1
   JumpIfTrue           L1
   Push                 r1
   PushInt              2
-  InstanceCall         2, CP#2
+  InterfaceCall        2, CP#1
   JumpIfTrue           L1
   Push                 r1
   PushInt              3
-  InstanceCall         2, CP#3
+  InterfaceCall        2, CP#1
   JumpIfTrue           L1
   Push                 r1
   PushInt              4
-  InstanceCall         2, CP#4
+  InterfaceCall        2, CP#1
   JumpIfTrue           L2
   Push                 r1
   PushInt              5
-  InstanceCall         2, CP#5
+  InterfaceCall        2, CP#1
   JumpIfTrue           L2
   Push                 r1
   PushInt              6
-  InstanceCall         2, CP#6
+  InterfaceCall        2, CP#1
   JumpIfTrue           L2
   Jump                 L3
 L1:
@@ -120,12 +119,8 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '==', arg-desc CP#0
-  [2] = ICData target-name '==', arg-desc CP#0
-  [3] = ICData target-name '==', arg-desc CP#0
-  [4] = ICData target-name '==', arg-desc CP#0
-  [5] = ICData target-name '==', arg-desc CP#0
-  [6] = ICData target-name '==', arg-desc CP#0
+  [1] = InterfaceCall target-name '==', arg-desc CP#0
+  [2] = Reserved
 }
 ]static method foo2(core::int x) → core::int {
   core::int y;
@@ -156,36 +151,36 @@
   return y;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   PushNull
   PopLocal             r0
   Push                 FP[-5]
   PopLocal             r1
   Push                 r1
   PushInt              1
-  InstanceCall         2, CP#1
+  InterfaceCall        2, CP#1
   JumpIfTrue           L1
   Push                 r1
   PushInt              2
-  InstanceCall         2, CP#2
+  InterfaceCall        2, CP#1
   JumpIfTrue           L1
   Push                 r1
   PushInt              3
-  InstanceCall         2, CP#3
+  InterfaceCall        2, CP#1
   JumpIfTrue           L1
   Push                 r1
   PushInt              4
-  InstanceCall         2, CP#4
+  InterfaceCall        2, CP#1
   JumpIfTrue           L2
   Push                 r1
   PushInt              5
-  InstanceCall         2, CP#5
+  InterfaceCall        2, CP#1
   JumpIfTrue           L2
   Push                 r1
   PushInt              6
-  InstanceCall         2, CP#6
+  InterfaceCall        2, CP#1
   JumpIfTrue           L2
   Jump                 L3
 L1:
@@ -205,12 +200,8 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '==', arg-desc CP#0
-  [2] = ICData target-name '==', arg-desc CP#0
-  [3] = ICData target-name '==', arg-desc CP#0
-  [4] = ICData target-name '==', arg-desc CP#0
-  [5] = ICData target-name '==', arg-desc CP#0
-  [6] = ICData target-name '==', arg-desc CP#0
+  [1] = InterfaceCall target-name '==', arg-desc CP#0
+  [2] = Reserved
 }
 ]static method foo3(core::int x) → core::int {
   core::int y;
@@ -240,9 +231,9 @@
   return y;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index e513f1e..e946fb1 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                4
-  CheckStack
+  CheckStack           0
 Try #0 start:
   PushConstant         CP#0
   PushConstant         CP#2
@@ -15,8 +15,8 @@
 Try #0 end:
 Try #0 handler:
   SetFrame             4
-  MoveSpecial          r0, exception
-  MoveSpecial          r1, stackTrace
+  MoveSpecial          exception, r0
+  MoveSpecial          stackTrace, r1
   Push                 r0
   PopLocal             r2
   PushNull
@@ -47,11 +47,11 @@
 ConstantPool {
   [0] = String 'danger!'
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::print', arg-desc CP#1
   [3] = Type dynamic
   [4] = String 'caught '
-  [5] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#1
-  [6] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [5] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#1
+  [6] = StaticICData target 'dart:core::print', arg-desc CP#1
 }
 ]static method testTryCatch1() → dynamic {
   try {
@@ -62,9 +62,9 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                5
-  CheckStack
+  CheckStack           0
 Try #0 start:
   PushConstant         CP#0
   PushConstant         CP#2
@@ -74,21 +74,21 @@
 Try #0 end:
 Try #0 handler:
   SetFrame             5
-  MoveSpecial          r0, exception
-  MoveSpecial          r1, stackTrace
+  MoveSpecial          exception, r0
+  MoveSpecial          stackTrace, r1
   Push                 r0
   PushConstant         CP#3
-  InstanceCall         2, CP#5
+  InterfaceCall        2, CP#5
   JumpIfFalse          L2
-  PushConstant         CP#6
   PushConstant         CP#7
+  PushConstant         CP#8
   IndirectStaticCall   1, CP#1
   Drop1
   Jump                 L1
 L2:
   Push                 r0
-  PushConstant         CP#8
-  InstanceCall         2, CP#9
+  PushConstant         CP#9
+  InterfaceCall        2, CP#5
   JumpIfFalse          L3
   Push                 r0
   PopLocal             r2
@@ -113,7 +113,7 @@
 L3:
   Push                 r0
   PushConstant         CP#13
-  InstanceCall         2, CP#14
+  InterfaceCall        2, CP#5
   JumpIfFalse          L4
   Push                 r0
   PopLocal             r2
@@ -125,7 +125,7 @@
   StoreLocal           r4
   Push                 r4
   PushInt              0
-  PushConstant         CP#15
+  PushConstant         CP#14
   StoreIndexedTOS
   Push                 r4
   PushInt              1
@@ -133,15 +133,15 @@
   StoreIndexedTOS
   Push                 r4
   PushInt              2
-  PushConstant         CP#16
+  PushConstant         CP#15
   StoreIndexedTOS
   Push                 r4
   PushInt              3
   Push                 r3
   StoreIndexedTOS
-  PushConstant         CP#17
+  PushConstant         CP#16
   IndirectStaticCall   1, CP#1
-  PushConstant         CP#18
+  PushConstant         CP#17
   IndirectStaticCall   1, CP#1
   Drop1
   Jump                 L1
@@ -156,7 +156,7 @@
   StoreLocal           r4
   Push                 r4
   PushInt              0
-  PushConstant         CP#20
+  PushConstant         CP#19
   StoreIndexedTOS
   Push                 r4
   PushInt              1
@@ -164,15 +164,15 @@
   StoreIndexedTOS
   Push                 r4
   PushInt              2
-  PushConstant         CP#16
+  PushConstant         CP#15
   StoreIndexedTOS
   Push                 r4
   PushInt              3
   Push                 r3
   StoreIndexedTOS
-  PushConstant         CP#21
+  PushConstant         CP#20
   IndirectStaticCall   1, CP#1
-  PushConstant         CP#22
+  PushConstant         CP#21
   IndirectStaticCall   1, CP#1
   Drop1
   Jump                 L1
@@ -181,32 +181,31 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 2, end 7, handler 7, needs-stack-trace, types [CP#3, CP#8, CP#13, CP#19]
+  try-index 0, outer -1, start 2, end 7, handler 7, needs-stack-trace, types [CP#3, CP#9, CP#13, CP#18]
 }
 ConstantPool {
   [0] = String 'danger!'
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [3] = Type dart.core::TypeError
+  [2] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [3] = Type dart:core::TypeError
   [4] = ArgDesc num-args 2, num-type-args 0, names []
-  [5] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#4
-  [6] = String 'caught type error'
-  [7] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [8] = Type dart.core::AssertionError
-  [9] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#4
+  [5] = InterfaceCall target-name '_simpleInstanceOf', arg-desc CP#4
+  [6] = Reserved
+  [7] = String 'caught type error'
+  [8] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [9] = Type dart:core::AssertionError
   [10] = String 'caught assertion error '
-  [11] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#1
-  [12] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [13] = Type dart.core::Error
-  [14] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#4
-  [15] = String 'caught error '
-  [16] = String ' '
-  [17] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#1
-  [18] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [19] = Type dynamic
-  [20] = String 'caught something '
-  [21] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#1
-  [22] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [11] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#1
+  [12] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [13] = Type dart:core::Error
+  [14] = String 'caught error '
+  [15] = String ' '
+  [16] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#1
+  [17] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [18] = Type dynamic
+  [19] = String 'caught something '
+  [20] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#1
+  [21] = StaticICData target 'dart:core::print', arg-desc CP#1
 }
 ]static method testTryCatch2() → dynamic {
   try {
@@ -226,20 +225,20 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                7
-  CheckStack
-  AllocateContext      3
+  CheckStack           0
+  AllocateContext      0, 3
   PopLocal             r0
   Push                 r0
   PushInt              1
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 r0
   PopLocal             r2
 Try #0 start:
   Push                 r0
   PushInt              2
-  StoreContextVar      1
+  StoreContextVar      0, 1
   Allocate             CP#9
   StoreLocal           r5
   Push                 r5
@@ -259,10 +258,10 @@
   StoreFieldTOS        CP#1
   PopLocal             r4
   Push                 r4
-  InstanceCall         1, CP#19
+  DynamicCall          1, CP#19
   Drop1
   Push                 r0
-  LoadContextVar       1
+  LoadContextVar       0, 1
   PushConstant         CP#20
   IndirectStaticCall   1, CP#4
   Drop1
@@ -272,13 +271,13 @@
   SetFrame             7
   Push                 r2
   PopLocal             r0
-  MoveSpecial          r2, exception
-  MoveSpecial          r3, stackTrace
+  MoveSpecial          exception, r2
+  MoveSpecial          stackTrace, r3
   Push                 r2
   PopLocal             r4
   Push                 r0
   Push                 r3
-  StoreContextVar      2
+  StoreContextVar      0, 2
   PushNull
   PushInt              4
   CreateArrayTOS
@@ -298,7 +297,7 @@
   Push                 r5
   PushInt              3
   Push                 r0
-  LoadContextVar       2
+  LoadContextVar       0, 2
   StoreIndexedTOS
   PushConstant         CP#23
   IndirectStaticCall   1, CP#4
@@ -336,46 +335,48 @@
   try-index 0, outer -1, start 9, end 39, handler 39, needs-stack-trace, types [CP#6]
 }
 ConstantPool {
-  [0] = ClosureFunction foo () → void;
-  [1] = InstanceField dart.core::_Closure::_context
+  [0] = ClosureFunction 0
+  [1] = InstanceField dart:core::_Closure::_context (field)
   [2] = Reserved
   [3] = String 'danger foo'
   [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [5] = StaticICData target 'dart:core::print', arg-desc CP#4
   [6] = Type dynamic
-  [7] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [7] = StaticICData target 'dart:core::print', arg-desc CP#4
   [8] = EndClosureFunctionScope
-  [9] = Class dart.core::_Closure
-  [10] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [9] = Class dart:core::_Closure
+  [10] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [11] = Reserved
-  [12] = InstanceField dart.core::_Closure::_function_type_arguments
+  [12] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [13] = Reserved
   [14] = EmptyTypeArguments
-  [15] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [15] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [16] = Reserved
-  [17] = InstanceField dart.core::_Closure::_function
+  [17] = InstanceField dart:core::_Closure::_function (field)
   [18] = Reserved
   [19] = ICData dynamic target-name 'call', arg-desc CP#4
-  [20] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [20] = StaticICData target 'dart:core::print', arg-desc CP#4
   [21] = String 'caught '
   [22] = String ' '
-  [23] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#4
-  [24] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [25] = ClosureFunction bar () → void;
+  [23] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#4
+  [24] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [25] = ClosureFunction 1
   [26] = String 'danger bar'
-  [27] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [28] = Type dart.core::Error
+  [27] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [28] = Type dart:core::Error
   [29] = ArgDesc num-args 2, num-type-args 0, names []
-  [30] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#29
-  [31] = String 'error '
-  [32] = String ', captured stack trace: '
-  [33] = StaticICData target 'dart.core::_StringBase::_interpolate', arg-desc CP#4
-  [34] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [35] = EndClosureFunctionScope
+  [30] = InterfaceCall target-name '_simpleInstanceOf', arg-desc CP#29
+  [31] = Reserved
+  [32] = String 'error '
+  [33] = String ', captured stack trace: '
+  [34] = StaticICData target 'dart:core::_StringBase::_interpolate', arg-desc CP#4
+  [35] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [36] = EndClosureFunctionScope
 }
-Closure CP#0 {
+Closure #lib::testTryCatch3::foo () -> void
+ClosureBytecode {
   EntryFixed           1, 6
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
@@ -392,18 +393,18 @@
   SetFrame             6
   Push                 r2
   PopLocal             r0
-  MoveSpecial          r2, exception
-  MoveSpecial          r3, stackTrace
+  MoveSpecial          exception, r2
+  MoveSpecial          stackTrace, r3
   Push                 r2
   PopLocal             r4
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#7
   IndirectStaticCall   1, CP#4
   Drop1
   Push                 r0
   PushInt              3
-  StoreContextVar      1
+  StoreContextVar      0, 1
   Jump                 L1
 L1:
   PushNull
@@ -411,9 +412,10 @@
 
 }
 
-Closure CP#25 {
+Closure #lib::testTryCatch3::bar () -> void
+ClosureBytecode {
   EntryFixed           1, 6
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
@@ -430,11 +432,11 @@
   SetFrame             6
   Push                 r2
   PopLocal             r0
-  MoveSpecial          r2, exception
-  MoveSpecial          r3, stackTrace
+  MoveSpecial          exception, r2
+  MoveSpecial          stackTrace, r3
   Push                 r2
   PushConstant         CP#28
-  InstanceCall         2, CP#30
+  InterfaceCall        2, CP#30
   JumpIfFalse          L2
   Push                 r2
   PopLocal             r4
@@ -444,7 +446,7 @@
   StoreLocal           r5
   Push                 r5
   PushInt              0
-  PushConstant         CP#31
+  PushConstant         CP#32
   StoreIndexedTOS
   Push                 r5
   PushInt              1
@@ -452,17 +454,17 @@
   StoreIndexedTOS
   Push                 r5
   PushInt              2
-  PushConstant         CP#32
+  PushConstant         CP#33
   StoreIndexedTOS
   Push                 r5
   PushInt              3
   Push                 r0
-  LoadContextVar       2
+  LoadContextVar       0, 2
   StoreIndexedTOS
-  PushConstant         CP#33
-  IndirectStaticCall   1, CP#4
   PushConstant         CP#34
   IndirectStaticCall   1, CP#4
+  PushConstant         CP#35
+  IndirectStaticCall   1, CP#4
   Drop1
   Jump                 L1
 L2:
@@ -504,9 +506,9 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                8
-  CheckStack
+  CheckStack           0
 Try #0 start:
 Try #1 start:
   PushConstant         CP#0
@@ -517,8 +519,8 @@
 Try #1 end:
 Try #1 handler:
   SetFrame             8
-  MoveSpecial          r2, exception
-  MoveSpecial          r3, stackTrace
+  MoveSpecial          exception, r2
+  MoveSpecial          stackTrace, r3
   Push                 r2
   PopLocal             r4
 Try #2 start:
@@ -537,8 +539,8 @@
 Try #2 end:
 Try #2 handler:
   SetFrame             8
-  MoveSpecial          r5, exception
-  MoveSpecial          r6, stackTrace
+  MoveSpecial          exception, r5
+  MoveSpecial          stackTrace, r6
   Push                 r5
   PopLocal             r7
   PushConstant         CP#6
@@ -553,8 +555,8 @@
 Try #0 end:
 Try #0 handler:
   SetFrame             8
-  MoveSpecial          r0, exception
-  MoveSpecial          r1, stackTrace
+  MoveSpecial          exception, r0
+  MoveSpecial          stackTrace, r1
   Push                 r0
   PopLocal             r2
   Push                 r1
@@ -580,15 +582,15 @@
 ConstantPool {
   [0] = String 'try 1 > try 2'
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::print', arg-desc CP#1
   [3] = Type dynamic
   [4] = String 'try 1 > catch 2 > try 3'
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [5] = StaticICData target 'dart:core::print', arg-desc CP#1
   [6] = String 'try 1 > catch 2 > catch 3'
-  [7] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [7] = StaticICData target 'dart:core::print', arg-desc CP#1
   [8] = String 'catch 1'
-  [9] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [10] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [9] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [10] = StaticICData target 'dart:core::print', arg-desc CP#1
 }
 ]static method testRethrow(core::bool cond) → dynamic {
   try {
@@ -613,23 +615,21 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                3
-  CheckStack
+  CheckStack           0
   PushInt              0
   PopLocal             r0
 L5:
-  CheckStack
+  CheckStack           1
   Push                 r0
   PushInt              10
   CompareIntLt
-  AssertBoolean        0
   JumpIfFalse          L1
 Try #0 start:
   Push                 r0
   PushInt              5
   CompareIntGt
-  AssertBoolean        0
   JumpIfFalse          L2
   Jump                 L3
 L2:
@@ -637,8 +637,8 @@
 Try #0 end:
 Try #0 handler:
   SetFrame             3
-  MoveSpecial          r1, exception
-  MoveSpecial          r2, stackTrace
+  MoveSpecial          exception, r1
+  MoveSpecial          stackTrace, r2
   Push                 r0
   PushConstant         CP#2
   IndirectStaticCall   1, CP#1
@@ -668,14 +668,14 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 10, end 17, handler 17, needs-stack-trace, types [CP#0]
+  try-index 0, outer -1, start 9, end 15, handler 15, needs-stack-trace, types [CP#0]
 }
 ConstantPool {
   [0] = Type dynamic
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [3] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [4] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [3] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [4] = StaticICData target 'dart:core::print', arg-desc CP#1
 }
 ]static method testTryFinally1() → dynamic {
   #L1:
@@ -691,24 +691,24 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                9
-  CheckStack
-  AllocateContext      2
+  CheckStack           0
+  AllocateContext      0, 2
   PopLocal             r0
   Push                 r0
   Push                 FP[-5]
-  StoreContextVar      0
+  StoreContextVar      0, 0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PopLocal             r2
   Push                 r2
   PushInt              1
-  InstanceCall         2, CP#1
+  InterfaceCall        2, CP#1
   JumpIfTrue           L1
   Push                 r2
   PushInt              2
-  InstanceCall         2, CP#2
+  InterfaceCall        2, CP#1
   JumpIfTrue           L2
   Jump                 L3
 L1:
@@ -721,7 +721,7 @@
   Drop1
   Push                 r0
   PushInt              3
-  StoreContextVar      1
+  StoreContextVar      0, 1
   Push                 r0
   PopLocal             r5
 Try #1 start:
@@ -748,7 +748,7 @@
   StoreFieldTOS        CP#9
   PopLocal             r7
   Push                 r7
-  InstanceCall         1, CP#24
+  DynamicCall          1, CP#24
   Drop1
   Jump                 L4
 Try #1 end:
@@ -756,8 +756,8 @@
   SetFrame             9
   Push                 r5
   PopLocal             r0
-  MoveSpecial          r5, exception
-  MoveSpecial          r6, stackTrace
+  MoveSpecial          exception, r5
+  MoveSpecial          stackTrace, r6
   PushConstant         CP#26
   PushConstant         CP#27
   IndirectStaticCall   1, CP#4
@@ -778,8 +778,8 @@
   SetFrame             9
   Push                 r3
   PopLocal             r0
-  MoveSpecial          r3, exception
-  MoveSpecial          r4, stackTrace
+  MoveSpecial          exception, r3
+  MoveSpecial          stackTrace, r4
   PushConstant         CP#31
   PushConstant         CP#32
   IndirectStaticCall   1, CP#4
@@ -811,55 +811,56 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 2, num-type-args 0, names []
-  [1] = ICData target-name '==', arg-desc CP#0
-  [2] = ICData target-name '==', arg-desc CP#0
+  [1] = InterfaceCall target-name '==', arg-desc CP#0
+  [2] = Reserved
   [3] = String 'before try 1'
   [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [5] = StaticICData target 'dart:core::print', arg-desc CP#4
   [6] = String 'try'
-  [7] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [8] = ClosureFunction foo () → void;
-  [9] = InstanceField dart.core::_Closure::_context
+  [7] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [8] = ClosureFunction 0
+  [9] = InstanceField dart:core::_Closure::_context (field)
   [10] = Reserved
-  [11] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [12] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [11] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [12] = StaticICData target 'dart:core::print', arg-desc CP#4
   [13] = EndClosureFunctionScope
-  [14] = Class dart.core::_Closure
-  [15] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [14] = Class dart:core::_Closure
+  [15] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [16] = Reserved
-  [17] = InstanceField dart.core::_Closure::_function_type_arguments
+  [17] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [18] = Reserved
   [19] = EmptyTypeArguments
-  [20] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [20] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [21] = Reserved
-  [22] = InstanceField dart.core::_Closure::_function
+  [22] = InstanceField dart:core::_Closure::_function (field)
   [23] = Reserved
   [24] = ICData dynamic target-name 'call', arg-desc CP#4
   [25] = Type dynamic
   [26] = String 'finally 1'
-  [27] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [28] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [27] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [28] = StaticICData target 'dart:core::print', arg-desc CP#4
   [29] = String 'after try 1'
-  [30] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [30] = StaticICData target 'dart:core::print', arg-desc CP#4
   [31] = String 'finally 2'
-  [32] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [33] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [32] = StaticICData target 'dart:core::print', arg-desc CP#4
+  [33] = StaticICData target 'dart:core::print', arg-desc CP#4
   [34] = String 'case 2'
-  [35] = StaticICData target 'dart.core::print', arg-desc CP#4
+  [35] = StaticICData target 'dart:core::print', arg-desc CP#4
 }
-Closure CP#8 {
+Closure #lib::testTryFinally2::foo () -> void
+ClosureBytecode {
   EntryFixed           1, 2
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#9
   PopLocal             r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#11
   IndirectStaticCall   1, CP#4
   Drop1
   Push                 r0
-  LoadContextVar       1
+  LoadContextVar       0, 1
   PushConstant         CP#12
   IndirectStaticCall   1, CP#4
   Drop1
@@ -904,14 +905,14 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                6
-  CheckStack
-  AllocateContext      1
+  CheckStack           0
+  AllocateContext      0, 1
   PopLocal             r0
   Push                 r0
   PushInt              11
-  StoreContextVar      0
+  StoreContextVar      0, 0
   PushNull
   PopLocal             r2
   Push                 r0
@@ -941,15 +942,15 @@
   SetFrame             6
   Push                 r3
   PopLocal             r0
-  MoveSpecial          r3, exception
-  MoveSpecial          r4, stackTrace
+  MoveSpecial          exception, r3
+  MoveSpecial          stackTrace, r4
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#26
   IndirectStaticCall   1, CP#3
   Drop1
   Push                 r2
-  InstanceCall         1, CP#27
+  DynamicCall          1, CP#27
   Drop1
   Push                 r3
   Push                 r4
@@ -958,12 +959,12 @@
   Push                 r3
   PopLocal             r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#28
   IndirectStaticCall   1, CP#3
   Drop1
   Push                 r2
-  InstanceCall         1, CP#29
+  DynamicCall          1, CP#29
   Drop1
   Push                 r0
   LoadContextParent
@@ -975,45 +976,46 @@
   try-index 0, outer -1, start 11, end 30, handler 30, needs-stack-trace, types [CP#7]
 }
 ConstantPool {
-  [0] = ClosureFunction <anonymous closure> () → dart.core::int;
-  [1] = InstanceField dart.core::_Closure::_context
+  [0] = ClosureFunction 0
+  [1] = InstanceField dart:core::_Closure::_context (field)
   [2] = Reserved
   [3] = ArgDesc num-args 1, num-type-args 0, names []
-  [4] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [4] = StaticICData target 'dart:core::print', arg-desc CP#3
   [5] = String 'try 1'
-  [6] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [6] = StaticICData target 'dart:core::print', arg-desc CP#3
   [7] = Type dynamic
   [8] = String 'try 2'
-  [9] = StaticICData target 'dart.core::print', arg-desc CP#3
-  [10] = StaticICData target 'dart.core::print', arg-desc CP#3
-  [11] = StaticICData target 'dart.core::print', arg-desc CP#3
-  [12] = StaticICData target 'dart.core::print', arg-desc CP#3
-  [13] = StaticICData target 'dart.core::print', arg-desc CP#3
-  [14] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [9] = StaticICData target 'dart:core::print', arg-desc CP#3
+  [10] = StaticICData target 'dart:core::print', arg-desc CP#3
+  [11] = StaticICData target 'dart:core::print', arg-desc CP#3
+  [12] = StaticICData target 'dart:core::print', arg-desc CP#3
+  [13] = StaticICData target 'dart:core::print', arg-desc CP#3
+  [14] = StaticICData target 'dart:core::print', arg-desc CP#3
   [15] = EndClosureFunctionScope
-  [16] = Class dart.core::_Closure
-  [17] = InstanceField dart.core::_Closure::_instantiator_type_arguments
+  [16] = Class dart:core::_Closure
+  [17] = InstanceField dart:core::_Closure::_instantiator_type_arguments (field)
   [18] = Reserved
-  [19] = InstanceField dart.core::_Closure::_function_type_arguments
+  [19] = InstanceField dart:core::_Closure::_function_type_arguments (field)
   [20] = Reserved
   [21] = EmptyTypeArguments
-  [22] = InstanceField dart.core::_Closure::_delayed_type_arguments
+  [22] = InstanceField dart:core::_Closure::_delayed_type_arguments (field)
   [23] = Reserved
-  [24] = InstanceField dart.core::_Closure::_function
+  [24] = InstanceField dart:core::_Closure::_function (field)
   [25] = Reserved
-  [26] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [26] = StaticICData target 'dart:core::print', arg-desc CP#3
   [27] = ICData dynamic target-name 'call', arg-desc CP#3
-  [28] = StaticICData target 'dart.core::print', arg-desc CP#3
+  [28] = StaticICData target 'dart:core::print', arg-desc CP#3
   [29] = ICData dynamic target-name 'call', arg-desc CP#3
 }
-Closure CP#0 {
+Closure #lib::testTryFinally3::<anonymous closure> () -> dart:core::int
+ClosureBytecode {
   EntryFixed           1, 6
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   LoadFieldTOS         CP#1
   PopLocal             r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#4
   IndirectStaticCall   1, CP#3
   Drop1
@@ -1030,8 +1032,8 @@
   SetFrame             6
   Push                 r2
   PopLocal             r0
-  MoveSpecial          r2, exception
-  MoveSpecial          r3, stackTrace
+  MoveSpecial          exception, r2
+  MoveSpecial          stackTrace, r3
   Push                 r0
   PopLocal             r4
 Try #1 start:
@@ -1045,10 +1047,10 @@
   SetFrame             6
   Push                 r4
   PopLocal             r0
-  MoveSpecial          r4, exception
-  MoveSpecial          r5, stackTrace
+  MoveSpecial          exception, r4
+  MoveSpecial          stackTrace, r5
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#10
   IndirectStaticCall   1, CP#3
   Drop1
@@ -1059,7 +1061,7 @@
   Push                 r4
   PopLocal             r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#11
   IndirectStaticCall   1, CP#3
   Drop1
@@ -1081,10 +1083,10 @@
   SetFrame             6
   Push                 r4
   PopLocal             r0
-  MoveSpecial          r4, exception
-  MoveSpecial          r5, stackTrace
+  MoveSpecial          exception, r4
+  MoveSpecial          stackTrace, r5
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#13
   IndirectStaticCall   1, CP#3
   Drop1
@@ -1095,7 +1097,7 @@
   Push                 r4
   PopLocal             r0
   Push                 r0
-  LoadContextVar       0
+  LoadContextVar       0, 0
   PushConstant         CP#14
   IndirectStaticCall   1, CP#3
   Drop1
@@ -1130,9 +1132,9 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                5
-  CheckStack
+  CheckStack           0
 Try #0 start:
 Try #1 start:
   PushConstant         CP#0
@@ -1143,8 +1145,8 @@
 Try #1 end:
 Try #1 handler:
   SetFrame             5
-  MoveSpecial          r2, exception
-  MoveSpecial          r3, stackTrace
+  MoveSpecial          exception, r2
+  MoveSpecial          stackTrace, r3
   Push                 r2
   PopLocal             r4
   PushConstant         CP#4
@@ -1157,8 +1159,8 @@
 Try #0 end:
 Try #0 handler:
   SetFrame             5
-  MoveSpecial          r0, exception
-  MoveSpecial          r1, stackTrace
+  MoveSpecial          exception, r0
+  MoveSpecial          stackTrace, r1
   PushConstant         CP#6
   PushConstant         CP#7
   IndirectStaticCall   1, CP#1
@@ -1181,13 +1183,13 @@
 ConstantPool {
   [0] = String 'try'
   [1] = ArgDesc num-args 1, num-type-args 0, names []
-  [2] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [2] = StaticICData target 'dart:core::print', arg-desc CP#1
   [3] = Type dynamic
   [4] = String 'catch'
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [5] = StaticICData target 'dart:core::print', arg-desc CP#1
   [6] = String 'finally'
-  [7] = StaticICData target 'dart.core::print', arg-desc CP#1
-  [8] = StaticICData target 'dart.core::print', arg-desc CP#1
+  [7] = StaticICData target 'dart:core::print', arg-desc CP#1
+  [8] = StaticICData target 'dart:core::print', arg-desc CP#1
 }
 ]static method testTryCatchFinally() → dynamic {
   try
@@ -1202,9 +1204,9 @@
   }
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index ef13709..04a4e32 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -4,9 +4,9 @@
 
 class A<T extends core::Object = dynamic> extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -16,7 +16,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target 'dart.core::Object::', arg-desc CP#0
+  [1] = StaticICData target 'dart:core::Object::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::A<self::A::T>
     : super core::Object::•()
@@ -24,9 +24,9 @@
 }
 class B extends self::A<core::String> {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -36,7 +36,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::A::', arg-desc CP#0
+  [1] = StaticICData target '#lib::A::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::B
     : super self::A::•()
@@ -44,9 +44,9 @@
 }
 class C<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic, T3 extends core::Object = dynamic> extends self::B {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#1
   IndirectStaticCall   1, CP#0
@@ -56,7 +56,7 @@
 }
 ConstantPool {
   [0] = ArgDesc num-args 1, num-type-args 0, names []
-  [1] = StaticICData target '#lib::B::', arg-desc CP#0
+  [1] = StaticICData target '#lib::B::'' (constructor)', arg-desc CP#0
 }
 ]  synthetic constructor •() → self::C<self::C::T1, self::C::T2, self::C::T3>
     : super self::B::•()
@@ -65,9 +65,9 @@
 class D<P extends core::Object = dynamic, Q extends core::Object = dynamic> extends self::C<core::int, self::D::Q, self::D::P> {
   generic-covariant-impl field core::Map<self::D::P, self::D::Q> foo;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   Push                 FP[-5]
   PushConstant         CP#0
@@ -85,46 +85,44 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = Type dart.core::Map<#lib::D::P, #lib::D::Q>
+  [0] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
   [1] = TypeArgumentsField #lib::D
   [2] = String ''
   [3] = SubtypeTestCache
-  [4] = InstanceField #lib::D::foo
+  [4] = InstanceField #lib::D::foo (field)
   [5] = Reserved
   [6] = ArgDesc num-args 1, num-type-args 0, names []
-  [7] = StaticICData target '#lib::C::', arg-desc CP#6
+  [7] = StaticICData target '#lib::C::'' (constructor)', arg-desc CP#6
 }
 ]  constructor •(dynamic tt) → self::D<self::D::P, self::D::Q>
     : self::D::foo = tt as{TypeError} core::Map<self::D::P, self::D::Q>, super self::C::•()
     ;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   Push                 FP[-6]
   LoadTypeArgumentsField CP#0
   PushNull
   PushConstant         CP#1
-  InstanceCall         4, CP#3
-  AssertBoolean        0
+  InterfaceCall        4, CP#3
   JumpIfFalse          L1
-  PushConstant         CP#4
-  PushConstant         CP#6
-  IndirectStaticCall   1, CP#5
+  PushConstant         CP#5
+  PushConstant         CP#7
+  IndirectStaticCall   1, CP#6
   Drop1
 L1:
   Push                 FP[-5]
   Push                 FP[-6]
   LoadTypeArgumentsField CP#0
   PushNull
-  PushConstant         CP#7
-  InstanceCall         4, CP#8
-  AssertBoolean        0
+  PushConstant         CP#8
+  InterfaceCall        4, CP#3
   JumpIfFalse          L2
   PushConstant         CP#9
   PushConstant         CP#10
-  IndirectStaticCall   1, CP#5
+  IndirectStaticCall   1, CP#6
   Drop1
 L2:
   Push                 FP[-6]
@@ -135,28 +133,29 @@
   PushNull
   PushConstant         CP#12
   AssertAssignable     0, CP#13
-  InstanceCall         2, CP#15
+  InterfaceCall        2, CP#15
   Drop1
   PushNull
   ReturnTOS
 }
 ConstantPool {
   [0] = TypeArgumentsField #lib::D
-  [1] = Type #lib::A<#lib::D::P>
+  [1] = Type #lib::A < #lib::D::TypeParam/0 >
   [2] = ArgDesc num-args 4, num-type-args 0, names []
-  [3] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#2
-  [4] = String '21'
-  [5] = ArgDesc num-args 1, num-type-args 0, names []
-  [6] = StaticICData target 'dart.core::print', arg-desc CP#5
-  [7] = Type #lib::C<dynamic, #lib::D::Q, dart.core::List<#lib::D::P>>
-  [8] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#2
+  [3] = InterfaceCall target-name '_instanceOf', arg-desc CP#2
+  [4] = Reserved
+  [5] = String '21'
+  [6] = ArgDesc num-args 1, num-type-args 0, names []
+  [7] = StaticICData target 'dart:core::print', arg-desc CP#6
+  [8] = Type #lib::C < dynamic, #lib::D::TypeParam/1, dart:core::List < #lib::D::TypeParam/0 > >
   [9] = String '22'
-  [10] = StaticICData target 'dart.core::print', arg-desc CP#5
-  [11] = Type dart.core::Map<#lib::D::P, #lib::D::Q>
+  [10] = StaticICData target 'dart:core::print', arg-desc CP#6
+  [11] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
   [12] = String ''
   [13] = SubtypeTestCache
   [14] = ArgDesc num-args 2, num-type-args 0, names []
-  [15] = ICData set target-name 'foo', arg-desc CP#14
+  [15] = InterfaceCall set target-name 'set:foo', arg-desc CP#14
+  [16] = Reserved
 }
 ]  method foo2(dynamic y) → dynamic {
     if(y is self::A<self::D::P>) {
@@ -168,61 +167,60 @@
     [@vm.call-site-attributes.metadata=receiverType:#lib::D<#lib::D::P, #lib::D::Q>] this.{self::D::foo} = y as{TypeError} core::Map<self::D::P, self::D::Q>;
   }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
-  CheckFunctionTypeArgs 2, 0
+  CheckStack           0
+  CheckFunctionTypeArgs 2, r0
   Push                 FP[-5]
   PushNull
   Push                 r0
   PushConstant         CP#0
-  InstanceCall         4, CP#2
-  AssertBoolean        0
+  InterfaceCall        4, CP#2
   JumpIfFalse          L1
-  PushConstant         CP#3
-  PushConstant         CP#5
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#4
+  PushConstant         CP#6
+  IndirectStaticCall   1, CP#5
   Drop1
 L1:
   Push                 FP[-5]
   Push                 FP[-6]
-  LoadTypeArgumentsField CP#6
+  LoadTypeArgumentsField CP#7
   Push                 r0
-  PushConstant         CP#7
-  InstanceCall         4, CP#8
-  AssertBoolean        0
+  PushConstant         CP#8
+  InterfaceCall        4, CP#2
   JumpIfFalse          L2
   PushConstant         CP#9
   PushConstant         CP#10
-  IndirectStaticCall   1, CP#4
+  IndirectStaticCall   1, CP#5
   Drop1
 L2:
   Push                 FP[-5]
   PushConstant         CP#11
   Push                 FP[-6]
-  LoadTypeArgumentsField CP#6
+  LoadTypeArgumentsField CP#7
   Push                 r0
   PushConstant         CP#12
   AssertAssignable     0, CP#13
-  InstanceCall         1, CP#14
+  InterfaceCall        1, CP#14
   ReturnTOS
 }
 ConstantPool {
-  [0] = Type #lib::A<#lib::D::foo3::T1>
+  [0] = Type #lib::A < #lib::D::foo3::TypeParam/0 >
   [1] = ArgDesc num-args 4, num-type-args 0, names []
-  [2] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#1
-  [3] = String '31'
-  [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [6] = TypeArgumentsField #lib::D
-  [7] = Type #lib::C<dart.core::Map<#lib::D::foo3::T1, #lib::D::P>, dart.core::List<#lib::D::foo3::T2>, #lib::D::Q>
-  [8] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#1
+  [2] = InterfaceCall target-name '_instanceOf', arg-desc CP#1
+  [3] = Reserved
+  [4] = String '31'
+  [5] = ArgDesc num-args 1, num-type-args 0, names []
+  [6] = StaticICData target 'dart:core::print', arg-desc CP#5
+  [7] = TypeArgumentsField #lib::D
+  [8] = Type #lib::C < dart:core::Map < #lib::D::foo3::TypeParam/0, #lib::D::TypeParam/0 >, dart:core::List < #lib::D::foo3::TypeParam/1 >, #lib::D::TypeParam/1 >
   [9] = String '32'
-  [10] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [11] = Type dart.core::Map<#lib::D::foo3::T2, #lib::D::Q>
+  [10] = StaticICData target 'dart:core::print', arg-desc CP#5
+  [11] = Type dart:core::Map < #lib::D::foo3::TypeParam/1, #lib::D::TypeParam/1 >
   [12] = String ' in type cast'
   [13] = SubtypeTestCache
-  [14] = ICData get target-name 'values', arg-desc CP#4
+  [14] = InterfaceCall get target-name 'get:values', arg-desc CP#5
+  [15] = Reserved
 }
 ]  method foo3<T1 extends core::Object = dynamic, T2 extends core::Object = dynamic>(dynamic z) → dynamic {
     if(z is self::A<self::D::foo3::T1>) {
@@ -234,9 +232,9 @@
     return (z as core::Map<self::D::foo3::T2, self::D::Q>).{core::Map::values};
   }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                2
-  CheckStack
+  CheckStack           0
   Push                 FP[-6]
   LoadTypeArgumentsField CP#0
   PushNull
@@ -270,12 +268,12 @@
 }
 ConstantPool {
   [0] = TypeArgumentsField #lib::D
-  [1] = TypeArgs [dart.core::Map<#lib::D::P, #lib::D::Q>]
-  [2] = Type dart.core::Map<#lib::D::P, #lib::D::Q>
+  [1] = TypeArgs [dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >]
+  [2] = Type dart:core::Map < #lib::D::TypeParam/0, #lib::D::TypeParam/1 >
   [3] = String ''
   [4] = SubtypeTestCache
   [5] = ArgDesc num-args 2, num-type-args 0, names []
-  [6] = StaticICData target 'dart.core::List::_fromLiteral', arg-desc CP#5
+  [6] = StaticICData target 'dart:core::List::_fromLiteral (constructor)', arg-desc CP#5
   [7] = SubtypeTestCache
 }
 ]  method foo4(dynamic w) → core::Map<self::D::P, self::D::Q> {
@@ -285,9 +283,9 @@
 }
 class E<P extends core::String = core::String> extends core::Object {
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
@@ -296,10 +294,10 @@
 ]  static factory •<P extends core::String = dynamic>() → self::E<self::E::•::P>
     return null;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
-  CheckFunctionTypeArgs 2, 0
+  CheckStack           0
+  CheckFunctionTypeArgs 2, r0
   JumpIfNotZeroTypeArgs L1
   Push                 FP[-6]
   LoadTypeArgumentsField CP#0
@@ -319,63 +317,63 @@
 }
 ConstantPool {
   [0] = TypeArgumentsField #lib::E
-  [1] = TypeArgs [#lib::E::P, dart.core::List<#lib::E::P>]
-  [2] = Type #lib::E::foo6::T
-  [3] = Type #lib::E::P
+  [1] = TypeArgs [#lib::E::TypeParam/0, dart:core::List < #lib::E::TypeParam/0 >]
+  [2] = Type #lib::E::foo6::TypeParam/0
+  [3] = Type #lib::E::TypeParam/0
   [4] = String 'T'
 }
 ]  method foo6<generic-covariant-impl T extends self::E::P = self::E::P, U extends core::List<self::E::foo6::T> = core::List<self::E::P>>(core::Map<self::E::foo6::T, self::E::foo6::U> map) → void {}
 }
 static field core::List<core::Iterable<dynamic>> globalVar;
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#0
-  InstanceCall         2, CP#2
-  AssertBoolean        0
+  InterfaceCall        2, CP#2
   JumpIfFalse          L1
-  PushConstant         CP#3
-  PushConstant         CP#5
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#4
+  PushConstant         CP#6
+  IndirectStaticCall   1, CP#5
   Drop1
 L1:
   Push                 FP[-5]
   PushNull
   PushNull
-  PushConstant         CP#6
-  InstanceCall         4, CP#8
-  AssertBoolean        0
+  PushConstant         CP#7
+  InterfaceCall        4, CP#9
   JumpIfFalse          L2
-  PushConstant         CP#9
-  PushConstant         CP#10
-  IndirectStaticCall   1, CP#4
+  PushConstant         CP#11
+  PushConstant         CP#12
+  IndirectStaticCall   1, CP#5
   Drop1
 L2:
   Push                 FP[-5]
-  PushConstant         CP#11
+  PushConstant         CP#13
   PushNull
   PushNull
-  PushConstant         CP#12
-  AssertAssignable     0, CP#13
+  PushConstant         CP#14
+  AssertAssignable     0, CP#15
   ReturnTOS
 }
 ConstantPool {
   [0] = Type #lib::B
   [1] = ArgDesc num-args 2, num-type-args 0, names []
-  [2] = ICData target-name 'dart.core::_simpleInstanceOf', arg-desc CP#1
-  [3] = String '11'
-  [4] = ArgDesc num-args 1, num-type-args 0, names []
-  [5] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [6] = Type #lib::C<dart.core::int, dart.core::Object, dynamic>
-  [7] = ArgDesc num-args 4, num-type-args 0, names []
-  [8] = ICData target-name 'dart.core::_instanceOf', arg-desc CP#7
-  [9] = String '12'
-  [10] = StaticICData target 'dart.core::print', arg-desc CP#4
-  [11] = Type #lib::A<dart.core::int>
-  [12] = String ' in type cast'
-  [13] = SubtypeTestCache
+  [2] = InterfaceCall target-name '_simpleInstanceOf', arg-desc CP#1
+  [3] = Reserved
+  [4] = String '11'
+  [5] = ArgDesc num-args 1, num-type-args 0, names []
+  [6] = StaticICData target 'dart:core::print', arg-desc CP#5
+  [7] = Type #lib::C < dart:core::int, dart:core::Object, dynamic >
+  [8] = ArgDesc num-args 4, num-type-args 0, names []
+  [9] = InterfaceCall target-name '_instanceOf', arg-desc CP#8
+  [10] = Reserved
+  [11] = String '12'
+  [12] = StaticICData target 'dart:core::print', arg-desc CP#5
+  [13] = Type #lib::A < dart:core::int >
+  [14] = String ' in type cast'
+  [15] = SubtypeTestCache
 }
 ]static method foo1(dynamic x) → dynamic {
   if(x is self::B) {
@@ -387,9 +385,9 @@
   return x as self::A<core::int>;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                1
-  CheckStack
+  CheckStack           0
   Push                 FP[-5]
   PushConstant         CP#0
   PushNull
@@ -401,18 +399,18 @@
   ReturnTOS
 }
 ConstantPool {
-  [0] = Type dart.core::List<dart.core::Iterable<dynamic>>
+  [0] = Type dart:core::List < dart:core::Iterable < dynamic > >
   [1] = String ''
   [2] = SubtypeTestCache
-  [3] = StaticField #lib::globalVar
+  [3] = StaticField #lib::globalVar (field)
 }
 ]static method foo5(dynamic x) → void {
   self::globalVar = x as{TypeError} core::List<core::Iterable<dynamic>>;
 }
 [@vm.bytecode=
-Bytecode (version: stable) {
+Bytecode {
   Entry                0
-  CheckStack
+  CheckStack           0
   PushNull
   ReturnTOS
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
index d4deb68..bf7dfc6 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
@@ -6,21 +6,24 @@
 RESULT: _T {}?
 ------------ #lib::bool_expressions ------------
 t0* = _Call direct [#lib::foo] ()
-t1* = _Call direct [#lib::bar] ()
-t2* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
-i = _Join [dart.core::int] (_T (dart.core::_Smi), t2)
-t4* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi))
-t5* = _Call direct [#lib::bar] ()
-x = _Join [dart.core::bool] (t5, _T (dart.core::bool)+)
-t7* = _Call direct [#lib::foo] ()
-t8* = _Call direct [#lib::bar] ()
-t9* = _Call direct [#lib::bar] ()
-t10* = _Call direct [#lib::foo] ()
-t11* = _Call direct [#lib::foo] ()
-t12 = _Join [dynamic] (_T (dart.core::bool)+, t7)
-t13 = _Narrow (t12 to _T ANY?)
-t14 = _Narrow (t13 to _T (dart.core::bool)+?)
-y = _Join [dart.core::bool] (_T (dart.core::bool)+, t14, _T (dart.core::bool)+, _T (dart.core::bool)+)
+t1 = _TypeCheck (t0 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool)
+t2* = _Call direct [#lib::bar] ()
+t3* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
+i = _Join [dart.core::int] (_T (dart.core::_Smi), t3)
+t5* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi))
+t6* = _Call direct [#lib::bar] ()
+x = _Join [dart.core::bool] (t6, _T (dart.core::bool)+)
+t8* = _Call direct [#lib::foo] ()
+t9 = _Join [dynamic] (_T (dart.core::bool)+, t8)
+t10 = _Narrow (t9 to _T ANY?)
+t11 = _TypeCheck (t10 against dart.core::bool) (for (x{dart.core::bool} ?{dynamic} true : #lib::foo()) as{TypeError} dart.core::bool)
+t12* = _Call direct [#lib::bar] ()
+t13* = _Call direct [#lib::bar] ()
+t14* = _Call direct [#lib::foo] ()
+t15 = _TypeCheck (t14 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool)
+t16* = _Call direct [#lib::foo] ()
+t17 = _TypeCheck (t16 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool)
+y = _Join [dart.core::bool] (_T (dart.core::bool)+, t11, _T (dart.core::bool)+, _T (dart.core::bool)+)
 RESULT: _T {}?
 ------------ #lib::main ------------
 
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
index e5c30ed..9843dc5 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
@@ -37,7 +37,7 @@
 t5 = _Call direct [#lib::B::] (_T (#lib::B))
 t6 = _Call [#lib::A::foo1] (%aa, _T (#lib::B))
 t7* = _Call get [#lib::A::foo2] (%aa)
-t8 = _Narrow (t7 to _T (dart.core::int)+?)
+t8 = _TypeCheck (t7 against dart.core::int) (for aa.{#lib::A::foo2} as{TypeError} dart.core::int)
 t9 = _Call set [#lib::A::foo3] (%aa, t8)
 t10* = _Call get [#lib::A::foo1] (%aa)
 t11* = _Call get [#lib::A::foo2] (%aa)
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
index 9e9fb78..0163697 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
@@ -10,15 +10,15 @@
 RESULT: t2
 ------------ #lib::C::id1 ------------
 %this = _Parameter #0 [_T (#lib::C<dynamic>)+]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%x = _Parameter #1
 t2 = _Extract (%this[#lib::C/0])
-t3 = _TypeCheck (%x against t2) (for parameter x)
+t3 = _TypeCheck (%x against t2) (for x)
 RESULT: t3
 ------------ #lib::C::id2 ------------
 %this = _Parameter #0 [_T (#lib::C<dynamic>)+]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%x = _Parameter #1
 t2 = _Extract (%this[#lib::C/0])
-t3 = _TypeCheck (%x against t2) (for parameter x)
+t3 = _TypeCheck (%x against t2) (for x)
 RESULT: t3
 ------------ #lib::D:: ------------
 %this = _Parameter #0 [_T (#lib::D<dynamic>)+]
@@ -74,18 +74,18 @@
 RESULT: _T {}?
 ------------ #lib::C2::id3 ------------
 %this = _Parameter #0 [_T (#lib::C2<dynamic>)+]
-%x = _Parameter #1 [_T (dart.core::Comparable<dynamic>)+?]
+%x = _Parameter #1
 t2 = _Extract (%this[#lib::C2/0])
 t3 = _CreateRuntimeType (dart.core::Comparable @ (t2))
-t4 = _TypeCheck (%x against t3) (for parameter x)
+t4 = _TypeCheck (%x against t3) (for x)
 RESULT: t4
 ------------ #lib::C2::id4 ------------
 %this = _Parameter #0 [_T (#lib::C2<dynamic>)+]
-%x = _Parameter #1 [_T (#lib::K<dynamic>)+?]
+%x = _Parameter #1
 t2 = _Extract (%this[#lib::C2/0])
 t3 = _CreateRuntimeType (#lib::I @ (t2))
 t4 = _CreateRuntimeType (#lib::K @ (t3))
-t5 = _TypeCheck (%x against t4) (for parameter x)
+t5 = _TypeCheck (%x against t4) (for x)
 RESULT: t5
 ------------ #lib::main ------------
 t0 = _Call direct [#lib::C::] (_T (#lib::C<dart.core::int>))
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart.expect
index fae7252..2095424 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart.expect
@@ -3,8 +3,8 @@
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::MockHashMap:: ------------
-%K = _Parameter #0 [null]
-%V = _Parameter #1 [null]
+%K = _Parameter #0
+%V = _Parameter #1
 t2 = _CreateConcreteType (#lib::_NotRealHashMap @ (%K, %V))
 t3 = _Call direct [#lib::_NotRealHashMap::] (t2)
 RESULT: t2
@@ -14,12 +14,12 @@
 RESULT: _T {}?
 ------------ #lib::_NotRealHashMap::setEntry ------------
 %this = _Parameter #0 [_T (#lib::_NotRealHashMap<dynamic, dynamic>)+]
-%key = _Parameter #1 [_T (dart.core::Object)+?]
-%value = _Parameter #2 [_T (dart.core::Object)+?]
+%key = _Parameter #1
+%value = _Parameter #2
 t3 = _Extract (%this[#lib::_NotRealHashMap/0])
-t4 = _TypeCheck (%key against t3) (for parameter key)
+t4 = _TypeCheck (%key against t3) (for key)
 t5 = _Extract (%this[#lib::_NotRealHashMap/1])
-t6 = _TypeCheck (%value against t5) (for parameter value)
+t6 = _TypeCheck (%value against t5) (for value)
 RESULT: _T {}?
 ------------ #lib::InheritedElement:: ------------
 %this = _Parameter #0 [_T (#lib::InheritedElement)+]
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
index 6e4319f..ea11fc1 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
@@ -37,11 +37,11 @@
 }
 static method foo([@vm.inferred-type.metadata=dart.core::Null?] (core::List<core::int>) → void a) → core::int {
   @self::VarAnnotation::•() core::int x = 2;
-  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] x.{core::num::+}(2);
+  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] x.{core::num::+}(2);
 }
 @self::ParametrizedAnnotation::•<core::Null>(null)
 static method main(core::List<core::String> args) → dynamic {
   self::A::staticMethod();
-  [@vm.direct-call.metadata=#lib::B::instanceMethod] new self::B::•().{self::B::instanceMethod}();
+  [@vm.direct-call.metadata=#lib::B::instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();
   self::foo(null);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
index 8347032..ffdd14f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
@@ -1,11 +1,12 @@
 library #lib;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 static method isPrime([@vm.inferred-type.metadata=int?] dynamic n) → core::bool {
-  if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] n.<(2) as{TypeError} core::bool)
+  if(_in::unsafeCast<core::bool>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
     return false;
-  for (core::int i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<=??] [@vm.inferred-type.metadata=dart.core::bool] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::*??] [@vm.inferred-type.metadata=int?] i.{core::num::*}(i).{core::num::<=}(n as{TypeError} core::num); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1)) {
+  for (core::int i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<=??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::*??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num>(n)); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
     if([@vm.inferred-type.metadata=dart.core::bool] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::%??] [@vm.inferred-type.metadata=int?] n.%(i).{core::Object::==}(0))
       return false;
   }
@@ -13,9 +14,9 @@
 }
 static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi] core::int n) → core::int {
   core::int counter = 0;
-  for (core::int i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1)) {
+  for (core::int i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
     if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
-      counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] counter.{core::num::+}(1);
+      counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] counter.{core::num::+}(1);
     if([@vm.inferred-type.metadata=dart.core::bool] counter.{core::num::==}(n)) {
       return i;
     }
@@ -29,10 +30,10 @@
   }
 }
 static method main(core::List<core::String> args) → dynamic {
-  core::Stopwatch timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in let final dynamic #t2 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] #t1.{core::Stopwatch::start}() in #t1;
-  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1)) {
+  core::Stopwatch timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in let final dynamic #t2 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}() in #t1;
+  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
     self::run();
   }
-  [@vm.direct-call.metadata=dart.core::Stopwatch::stop] timer.{core::Stopwatch::stop}();
+  [@vm.direct-call.metadata=dart.core::Stopwatch::stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
   core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch::elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}}ms");
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index 4fe492d..b2c1ba2 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -11,24 +11,24 @@
     : self::_Vector::_offset = 0, self::_Vector::_length = size, self::_Vector::_elements = [@vm.inferred-type.metadata=dart.typed_data::_Float64List] typ::Float64List::•(size), super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasTearOffUses:false]  operator [](core::int i) → core::double
-    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
+    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
     let dynamic #t1 = [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = i in let dynamic #t3 = [@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
     core::double result = 0.0;
-    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1))
-      result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::_Vector::[]}(i)));
+    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1))
+      result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i)));
     return result;
   }
 }
 [@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector v = new self::_Vector::•(10);
 [@vm.inferred-type.metadata=dart.core::_Double?]static field core::double x = 0.0;
 static method main(core::List<core::String> args) → dynamic {
-  core::Stopwatch timer = let final core::Stopwatch #t4 = new core::Stopwatch::•() in let final dynamic #t5 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] #t4.{core::Stopwatch::start}() in #t4;
-  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int?] i.{core::num::+}(1)) {
-    self::x = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector::*??] [@vm.inferred-type.metadata=dart.core::_Double] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
+  core::Stopwatch timer = let final core::Stopwatch #t4 = new core::Stopwatch::•() in let final dynamic #t5 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t4.{core::Stopwatch::start}() in #t4;
+  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
+    self::x = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector::*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
   }
-  [@vm.direct-call.metadata=dart.core::Stopwatch::stop] timer.{core::Stopwatch::stop}();
+  [@vm.direct-call.metadata=dart.core::Stopwatch::stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
   core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch::elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}}ms, result ${self::x}");
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
index 7f4b4d5..4acf3a3 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
@@ -64,15 +64,15 @@
 }
 static method main() → dynamic {
   dynamic used;
-  used = [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int>] new self::C::•<core::int>().{self::C::foo}();
-  used = [@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String>] new self::E::•<core::int, core::String>().{self::E::foo}();
-  used = [@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int>] new self::E::•<core::int, core::String>().{self::E::bar}();
-  used = [@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String>] new self::E::•<core::int, core::String>().{self::E::baz}();
+  used = [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int> (skip check)] new self::C::•<core::int>().{self::C::foo}();
+  used = [@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String> (skip check)] new self::E::•<core::int, core::String>().{self::E::foo}();
+  used = [@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int> (skip check)] new self::E::•<core::int, core::String>().{self::E::bar}();
+  used = [@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String> (skip check)] new self::E::•<core::int, core::String>().{self::E::baz}();
   self::C<self::X> c = new self::C::•<self::Y>();
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X>] [@vm.direct-call.metadata=#lib::C::id1] c.{self::C::id1}(new self::Y::•());
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X>] [@vm.direct-call.metadata=#lib::C::id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
   [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X>] [@vm.direct-call.metadata=#lib::C::id2] c.{self::C::id2}(new self::Z::•());
   self::C2<core::num> c2 = new self::C2::•<core::num>();
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num>] [@vm.direct-call.metadata=#lib::C2::id3] c2.{self::C2::id3}(3.0);
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num>] [@vm.direct-call.metadata=#lib::C2::id4] c2.{self::C2::id4}(new self::K::•<self::J>());
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num>] [@vm.direct-call.metadata=#lib::C2::id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num>] [@vm.direct-call.metadata=#lib::C2::id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J>());
   return used;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart
index 3b211f3..c211e10 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart
@@ -1,40 +1,16 @@
 // Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-//
-// This test checks that TFA works as expected on an example imitating the
-// InheritedElement.setDependencies hotspot in Flutter. The example is modified
-// to use a custom class 'MockHashMap' rather than the regular 'HashMap' since
-// we want to print out the inferred type of the '_dependents' field, which
-// would be a 'SetType' under the regular 'HashMap' (and set types aren't
-// translated into 'InferredType'). Also, []= is the target of a truly-dynamic
-// call, and we want to make sure there is only one call-site in this example
-// (call-site level info is not available yet).
 
 import 'dart:collection';
 
 class Element {}
 
-abstract class MockHashMap<K, V> {
-  factory MockHashMap() {
-    return _NotRealHashMap<K, V>();
-  }
-
-  void setEntry(K key, V value);
-}
-
-class _NotRealHashMap<K, V> implements MockHashMap<K, V> {
-  void setEntry(K key, V value) {}
-}
-
 class InheritedElement extends Element {
-  // The inferred type for '_dependents' needs to be concrete and have exact
-  // type arguments.
-  final MockHashMap<Element, Object> _dependents =
-      MockHashMap<Element, Object>();
+  final Map<Element, Object> _dependents = <Element, Object>{};
 
   void setDependencies(Element dependent, Object value) {
-    _dependents.setEntry(dependent, value);
+    _dependents[dependent] = value;
   }
 }
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
index bc476af..a84a25f 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
@@ -7,29 +7,17 @@
     : super core::Object::•()
     ;
 }
-abstract class MockHashMap<K extends core::Object = dynamic, V extends core::Object = dynamic> extends core::Object {
-  static factory •<K extends core::Object = dynamic, V extends core::Object = dynamic>() → self::MockHashMap<self::MockHashMap::•::K, self::MockHashMap::•::V> {
-    return new self::_NotRealHashMap::•<self::MockHashMap::•::K, self::MockHashMap::•::V>();
-  }
-  abstract method setEntry(generic-covariant-impl self::MockHashMap::K key, generic-covariant-impl self::MockHashMap::V value) → void;
-}
-class _NotRealHashMap<K extends core::Object = dynamic, V extends core::Object = dynamic> extends core::Object implements self::MockHashMap<self::_NotRealHashMap::K, self::_NotRealHashMap::V> {
-  synthetic constructor •() → self::_NotRealHashMap<self::_NotRealHashMap::K, self::_NotRealHashMap::V>
-    : super core::Object::•()
-    ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method setEntry([@vm.inferred-type.metadata=! (skip check)] generic-covariant-impl self::_NotRealHashMap::K key, [@vm.inferred-type.metadata=dart.core::_Smi? (skip check)] generic-covariant-impl self::_NotRealHashMap::V value) → void {}
-}
 class InheritedElement extends self::Element {
-[@vm.inferred-type.metadata=#lib::_NotRealHashMap<#lib::Element, dart.core::Object>] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field self::MockHashMap<self::Element, core::Object> _dependents = [@vm.inferred-type.metadata=#lib::_NotRealHashMap<#lib::Element, dart.core::Object>] self::MockHashMap::•<self::Element, core::Object>();
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element, dart.core::Object>] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::Map<self::Element, core::Object> _dependents = <self::Element, core::Object>{};
   synthetic constructor •() → self::InheritedElement
     : super self::Element::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method setDependencies([@vm.inferred-type.metadata=!] self::Element dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object value) → void {
-    [@vm.call-site-attributes.metadata=receiverType:#lib::MockHashMap<#lib::Element, dart.core::Object>] [@vm.direct-call.metadata=#lib::_NotRealHashMap::setEntry] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=#lib::_NotRealHashMap<#lib::Element, dart.core::Object>] this.{self::InheritedElement::_dependents}.{self::MockHashMap::setEntry}(dependent, value);
+    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element, dart.core::Object>] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin::[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element, dart.core::Object>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
   }
 }
 static method main() → dynamic {
   self::InheritedElement ie = new self::InheritedElement::•();
-  [@vm.direct-call.metadata=#lib::InheritedElement::setDependencies] ie.{self::InheritedElement::setDependencies}(ie, 0);
-  [@vm.direct-call.metadata=#lib::InheritedElement::setDependencies] ie.{self::InheritedElement::setDependencies}(new self::Element::•(), null);
+  [@vm.direct-call.metadata=#lib::InheritedElement::setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(ie, 0);
+  [@vm.direct-call.metadata=#lib::InheritedElement::setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(new self::Element::•(), null);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
index a64c4af..aee6417 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
@@ -37,19 +37,19 @@
 [@vm.inferred-type.metadata=#lib::D?]static field self::A dd;
 [@vm.inferred-type.metadata=#lib::E?]static field self::E ee = new self::E::•();
 static method callerA1([@vm.inferred-type.metadata=!] self::A aa) → void {
-  aa.{self::A::foo}();
+  [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
 static method callerA2([@vm.inferred-type.metadata=#lib::B] self::A aa) → void {
-  [@vm.direct-call.metadata=#lib::B::foo] aa.{self::A::foo}();
+  [@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
 static method callerA3({[@vm.inferred-type.metadata=#lib::C] self::A aa = null}) → void {
-  [@vm.direct-call.metadata=#lib::C::foo] aa.{self::A::foo}();
+  [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
 static method callerA4([@vm.inferred-type.metadata=#lib::D?] self::A aa) → void {
-  [@vm.direct-call.metadata=#lib::C::foo??] aa.{self::A::foo}();
+  [@vm.direct-call.metadata=#lib::C::foo??] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
 static method callerE1([@vm.inferred-type.metadata=dart.core::_OneByteString] dynamic x) → void {
-  [@vm.direct-call.metadata=dart.core::_StringBase::toString] x.{core::Object::toString}();
+  [@vm.direct-call.metadata=dart.core::_StringBase::toString] [@vm.inferred-type.metadata=!? (skip check)] x.{core::Object::toString}();
 }
 static method callerE2([@vm.inferred-type.metadata=#lib::E?] dynamic x) → void {
   x.{core::Object::toString}();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
index 8c953da..999e779 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
@@ -82,7 +82,7 @@
 }
 static method round1({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null}) → void {
   self::ByteStream x = new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
-  [@vm.direct-call.metadata=#lib::ByteStream::super_foobar1] x.{self::ByteStream::super_foobar1}(onData);
+  [@vm.direct-call.metadata=#lib::ByteStream::super_foobar1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar1}(onData);
 }
 static method round2({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → void {
   new self::_ControllerStream::•();
@@ -100,14 +100,14 @@
   self::ByteStream x = new self::ByteStream::•(new self::_ControllerStream::•());
   self::Stream y = [@vm.direct-call.metadata=#lib::ByteStream::super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
   self::Stream z = [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
-  if([@vm.direct-call.metadata=dart.core::Object::==] [@vm.inferred-type.metadata=dart.core::bool] y.{core::Object::==}(z)) {
-    [@vm.direct-call.metadata=#lib::ByteStream::super_foobar2] x.{self::ByteStream::super_foobar2}(onData);
+  if([@vm.direct-call.metadata=dart.core::Object::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] y.{core::Object::==}(z)) {
+    [@vm.direct-call.metadata=#lib::ByteStream::super_foobar2] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar2}(onData);
   }
 }
 static method round5() → void {
   self::ByteStream x = new self::ByteStream::•(new self::_GeneratedStreamImpl::•());
   new self::_HandleErrorStream::•();
-  [@vm.direct-call.metadata=#lib::ByteStream::super_foobar3] x.{self::ByteStream::super_foobar3}();
+  [@vm.direct-call.metadata=#lib::ByteStream::super_foobar3] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar3}();
 }
 static method main(core::List<core::String> args) → dynamic {
   new self::_GeneratedStreamImpl::•();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
index e1eda81..cdb0b58 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
@@ -34,11 +34,11 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1() → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] this.{self::DeepCaller1::barL2}();
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL2}();
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2() → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] this.{self::DeepCaller1::barL3}();
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL3}();
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3() → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] this.{self::DeepCaller1::barL4}();
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL4}();
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4() → dynamic
     return self::field1;
 }
@@ -53,11 +53,11 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::D] self::D dd) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL2] [@vm.inferred-type.metadata=!] this.{self::DeepCaller2::barL2}(dd);
+    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(dd);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::D] self::D dd) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL3] [@vm.inferred-type.metadata=!] this.{self::DeepCaller2::barL3}(dd);
+    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(dd);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::D] self::D dd) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL4] [@vm.inferred-type.metadata=!] this.{self::DeepCaller2::barL4}(dd);
+    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(dd);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::D] self::D dd) → dynamic
     return [@vm.direct-call.metadata=#lib::D::field2] [@vm.inferred-type.metadata=!] dd.{self::D::field2};
 }
@@ -70,9 +70,9 @@
   return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
 }
 static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1 x) → dynamic
-  return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] x.{self::DeepCaller1::barL1}();
+  return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::DeepCaller1::barL1}();
 static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2 x) → dynamic
-  return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=!] x.{self::DeepCaller2::barL1}(new self::D::•());
+  return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(new self::D::•());
 static method createC() → dynamic {
   new self::C::•();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
index dafde6a..40ad603 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
@@ -25,13 +25,13 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar([@vm.inferred-type.metadata=#lib::B?] self::A aa) → dynamic
-    return [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1] aa.{self::A::foo}();
+    return [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] aa.{self::A::foo}();
 }
 [@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
 static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, [@vm.inferred-type.metadata=#lib::B?] self::A aa) → dynamic
-  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1] i.{self::Intermediate::bar}(aa);
+  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
 static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, [@vm.inferred-type.metadata=#lib::B?] self::A aa) → dynamic
-  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1] i.{self::Intermediate::bar}(aa);
+  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
 static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
 static method allocateB() → dynamic {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
index 6eb8e58..dedf792 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
@@ -39,7 +39,7 @@
 }
 class E extends self::_E&D&C {
   synthetic constructor •() → self::E
-    : super self::D::•()
+    : super self::_E&D&C::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
     return new self::T2::•();
@@ -53,11 +53,11 @@
 }
 [@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
 static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, self::A aa) → dynamic
-  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=!] i.{self::Intermediate::bar}(aa);
+  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
 static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, self::A aa) → dynamic
-  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=!] i.{self::Intermediate::bar}(aa);
+  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
 static method use3([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, self::A aa) → dynamic
-  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=!] i.{self::Intermediate::bar}(aa);
+  return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
 static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
 static method allocateB() → dynamic {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
index 8557ca8..2c40b66 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
@@ -24,11 +24,11 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] [@vm.inferred-type.metadata=#lib::T1] this.{self::DeepCaller1::barL2}(aa);
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL2}(aa);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] [@vm.inferred-type.metadata=#lib::T1] this.{self::DeepCaller1::barL3}(aa);
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL3}(aa);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] [@vm.inferred-type.metadata=#lib::T1] this.{self::DeepCaller1::barL4}(aa);
+    return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL4}(aa);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
     return [@vm.direct-call.metadata=#lib::A::field1??] [@vm.inferred-type.metadata=#lib::T1] aa.{self::A::field1};
 }
@@ -37,19 +37,19 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL2] [@vm.inferred-type.metadata=!] this.{self::DeepCaller2::barL2}(aa);
+    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(aa);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL3] [@vm.inferred-type.metadata=!] this.{self::DeepCaller2::barL3}(aa);
+    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(aa);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
-    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL4] [@vm.inferred-type.metadata=!] this.{self::DeepCaller2::barL4}(aa);
+    return [@vm.direct-call.metadata=#lib::DeepCaller2::barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(aa);
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
     return [@vm.direct-call.metadata=#lib::A::field2??] [@vm.inferred-type.metadata=!] aa.{self::A::field2};
 }
 [@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
 static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1 x, [@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
-  return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] [@vm.inferred-type.metadata=#lib::T1] x.{self::DeepCaller1::barL1}(aa);
+  return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] [@vm.inferred-type.metadata=#lib::T1 (skip check)] x.{self::DeepCaller1::barL1}(aa);
 static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2 x, [@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
-  return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=!] x.{self::DeepCaller2::barL1}(aa);
+  return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(aa);
 static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
 static method setField2([@vm.inferred-type.metadata=#lib::A] self::A aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
index 43d8894..925d3df 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
@@ -29,7 +29,7 @@
     ;
 }
 static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1>] core::List<self::T1> list) → dynamic {
-  [@vm.direct-call.metadata=#lib::T3::run] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1, ?>] list.{core::Iterable::map}<self::Q<self::T1>>((self::T1 t1) → self::Q<self::T1> => new self::Q::•<self::T1>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
+  [@vm.direct-call.metadata=#lib::T3::run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1>>((self::T1 t1) → self::Q<self::T1> => new self::Q::•<self::T1>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
 }
 static method foo2NewValue() → self::Q<dynamic>
   return new self::Q::•<self::T2>(new self::T2::•());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
index 9e1d95e..8099495 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
@@ -35,6 +35,6 @@
   core::print([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] a.{self::Point::x});
   self::Point c = new self::Point::•(new self::T2::•());
   [@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] c.{self::Point::x}.{self::I::foo}();
-  self::getX([@vm.direct-call.metadata=#lib::Point::newPoint1] [@vm.inferred-type.metadata=#lib::Point] a.{self::Point::newPoint1}());
-  self::getX([@vm.direct-call.metadata=#lib::Point::newPoint2] [@vm.inferred-type.metadata=#lib::Point] a.{self::Point::newPoint2}());
+  self::getX([@vm.direct-call.metadata=#lib::Point::newPoint1] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint1}());
+  self::getX([@vm.direct-call.metadata=#lib::Point::newPoint2] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint2}());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
index a29bcf3..5c65020 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/no_such_method.dart.expect
@@ -1,6 +1,7 @@
 library #lib;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 class T1 extends core::Object {
   synthetic constructor •() → self::T1
@@ -48,11 +49,11 @@
     return new self::T1::•();
   }
   no-such-method-forwarder get bar() → dynamic
-    return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method foo() → dynamic
-    return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
-    return [@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#bazz, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#bazz, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 }
 abstract class C extends core::Object {
   synthetic constructor •() → self::C
@@ -67,11 +68,11 @@
     : super self::C::•()
     ;
   no-such-method-forwarder get bar() → dynamic
-    return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method foo() → dynamic
-    return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
-    return [@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#bazz, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#bazz, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 }
 class E extends core::Object implements self::A {
   synthetic constructor •() → self::E
@@ -81,7 +82,7 @@
     return new self::T4::•();
   }
   no-such-method-forwarder get bar() → dynamic
-    return [@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
 }
 class F extends core::Object {
   synthetic constructor •() → self::F
@@ -115,12 +116,12 @@
 static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
 static method main(core::List<core::String> args) → dynamic {
-  core::print([@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
+  core::print([@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
   core::print([@vm.direct-call.metadata=#lib::B::bar??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bar});
-  core::print([@vm.direct-call.metadata=#lib::B::bazz??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bazz}(1, 2, 3, 4));
-  core::print([@vm.direct-call.metadata=#lib::D::foo??] [@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::foo}());
+  core::print([@vm.direct-call.metadata=#lib::B::bazz??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bazz}(1, 2, 3, 4));
+  core::print([@vm.direct-call.metadata=#lib::D::foo??] [@vm.inferred-type.metadata=#lib::T2 (skip check)] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::foo}());
   core::print([@vm.direct-call.metadata=#lib::D::bar??] [@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bar});
-  core::print([@vm.direct-call.metadata=#lib::D::bazz??] [@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bazz}(1, 2, 3, 4));
+  core::print([@vm.direct-call.metadata=#lib::D::bazz??] [@vm.inferred-type.metadata=#lib::T2 (skip check)] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bazz}(1, 2, 3, 4));
   new self::E::•();
   self::A xx = self::getDynamic() as{TypeError} self::A;
   core::print([@vm.inferred-type.metadata=!] xx.{self::A::bar});
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
index f898084..472fbbd 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
@@ -19,7 +19,7 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method method1(self::T0 t0) → void {
-    [@vm.direct-call.metadata=#lib::T2::foo??] t0.{self::T0::foo}();
+    [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
 abstract class B extends core::Object {
@@ -30,7 +30,7 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method method2(covariant self::T0 t0) → void {
-    [@vm.direct-call.metadata=#lib::T2::foo??] t0.{self::T0::foo}();
+    [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
 class D extends core::Object {
@@ -38,15 +38,15 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method method3(self::T0 t0) → void {
-    [@vm.direct-call.metadata=#lib::T2::foo??] t0.{self::T0::foo}();
+    [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
 [@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
 static method func1([@vm.inferred-type.metadata=#lib::T2?] self::T0 t0) → void {
-  [@vm.direct-call.metadata=#lib::T2::foo??] t0.{self::T0::foo}();
+  [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
 }
 static method func2(self::T0 t0) → void {
-  [@vm.direct-call.metadata=#lib::T2::foo??] t0.{self::T0::foo}();
+  [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
 }
 static method getDynamic() → dynamic
   return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
@@ -57,7 +57,7 @@
   self::use(self::func2);
   self::use(new self::A::•().{self::A::method1});
   self::B bb = self::getDynamic() as{TypeError} self::B;
-  [@vm.direct-call.metadata=#lib::C::method2??] bb.{self::B::method2}(self::getDynamic());
+  [@vm.direct-call.metadata=#lib::C::method2??] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B::method2}(self::getDynamic());
   self::getDynamic().method3(self::getDynamic());
   new self::T2::•();
   new self::A::•();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
index 3de865c..feb28eb 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
@@ -1,6 +1,7 @@
 library #lib;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 import "package:expect/expect.dart" as exp;
 
 class T1 extends core::Object {
@@ -17,7 +18,7 @@
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = null]) → void {
-    [@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = a5 as{TypeError} self::T1;
+    [@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = _in::unsafeCast<self::T1>(a5);
   }
 }
 class B1 extends core::Object {
@@ -114,14 +115,14 @@
 [@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function unknown4 = () → dynamic => self::bb4;
 static method test1() → void {
   self::B1 bb = new self::B1::•();
-  [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}(1, 2, 3, 4, new self::T1::•());
+  bb.{self::B1::aa1}(1, 2, 3, 4, new self::T1::•());
   self::ok = false;
-  [@vm.direct-call.metadata=#lib::T1::doTest1??] [@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
+  [@vm.direct-call.metadata=#lib::T1::doTest1??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
 static method test2() → void {
   self::B2 bb = new self::B2::•();
-  [@vm.direct-call.metadata=#lib::B2::doSuperCall] bb.{self::B2::doSuperCall}();
+  [@vm.direct-call.metadata=#lib::B2::doSuperCall] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B2::doSuperCall}();
   self::ok = false;
   [@vm.direct-call.metadata=#lib::T2::doTest2??] [@vm.direct-call.metadata=#lib::A2::foo] [@vm.inferred-type.metadata=#lib::T2?] [@vm.direct-call.metadata=#lib::B2Base::aa2] [@vm.inferred-type.metadata=#lib::A2] bb.{self::B2Base::aa2}.foo.doTest2();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
index 2f8a8ba..2c96882 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
@@ -12,7 +12,7 @@
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false]  method foo() → core::int
-    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=!? (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
 }
 class TearOffDynamicMethod extends core::Object {
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic bazz;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
index f56b7cc..66af620 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
@@ -1,6 +1,7 @@
 library #lib;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 abstract class A extends core::Object {
   synthetic constructor •() → self::A
@@ -13,7 +14,7 @@
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method foo() → core::int
-    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=dart.core::_Smi] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar() as{TypeError} core::num) as{TypeError} core::int;
+    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::bar] [@vm.inferred-type.metadata=dart.core::_Smi] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar())));
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → core::int
     return 3;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
index 1410d58..950a81d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_super_method.dart.expect
@@ -1,6 +1,7 @@
 library #lib;
 import self as self;
 import "dart:core" as core;
+import "dart:_internal" as _in;
 
 abstract class A extends core::Object {
   synthetic constructor •() → self::A
@@ -13,14 +14,14 @@
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → core::int
-    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
 }
 abstract class Base extends core::Object {
   synthetic constructor •() → self::Base
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method foo() → core::int
-    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int?] 3.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] 3.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method doCall(dynamic x) → core::int
     return [@vm.call-site-attributes.metadata=receiverType:dynamic] x.call() as{TypeError} core::int;
 }
@@ -29,12 +30,12 @@
     : super self::Base::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar() → core::int
-    return [@vm.direct-call.metadata=#lib::Base::doCall] [@vm.inferred-type.metadata=int?] this.{self::Base::doCall}(super.{self::Base::foo});
+    return [@vm.direct-call.metadata=#lib::Base::doCall] [@vm.inferred-type.metadata=int? (skip check)] this.{self::Base::doCall}(super.{self::Base::foo});
 }
 [@vm.inferred-type.metadata=#lib::B?]static field self::A aa = new self::B::•();
 static method knownResult() → dynamic
   return new self::B::•();
 static method main(core::List<core::String> args) → dynamic {
-  [@vm.direct-call.metadata=#lib::TearOffSuperMethod::bar] new self::TearOffSuperMethod::•().{self::TearOffSuperMethod::bar}();
-  [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::B?] self::aa.{self::A::foo}();
+  [@vm.direct-call.metadata=#lib::TearOffSuperMethod::bar] [@vm.inferred-type.metadata=!? (skip check)] new self::TearOffSuperMethod::•().{self::TearOffSuperMethod::bar}();
+  [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::aa.{self::A::foo}();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart
new file mode 100644
index 0000000..6abe2d5
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests tree shaking of field initializer for a write-only field.
+// Regression test for https://github.com/dart-lang/sdk/issues/35632.
+
+class A {
+  A() {
+    print('A');
+  }
+}
+
+var field = A();
+
+class B {
+  B() {
+    print('B');
+  }
+}
+
+class C {
+  var instanceField = new B();
+}
+
+void main() {
+  field = null;
+  new C().instanceField = null;
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect
new file mode 100644
index 0000000..d8d8757
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field.dart.expect
@@ -0,0 +1,23 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+}
+class B extends core::Object {
+  constructor •() → self::B
+    : super core::Object::•() {
+    core::print("B");
+  }
+}
+class C extends core::Object {
+[@vm.inferred-type.metadata=#lib::B?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  field self::B instanceField = new self::B::•();
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+[@vm.inferred-type.metadata=dart.core::Null?]static field self::A field = throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
+static method main() → void {
+  self::field = null;
+  [@vm.direct-call.metadata=#lib::C::instanceField] new self::C::•().{self::C::instanceField} = null;
+}
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index 1d49fff..c6f5421 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -13,7 +13,6 @@
 # passed to Fasta.
 
 set -e
-set -x
 
 OPTIONS=()
 GEN_KERNEL_OPTIONS=()
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index ecf8a5d..0e3e2e2 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -7,7 +7,10 @@
 import("runtime_args.gni")
 
 config("dart_public_config") {
-  include_dirs = [ "." ]
+  include_dirs = [
+    ".",
+    "include",
+  ]
 }
 
 # Adds PRODUCT define if Flutter has specified "release" for dart_runtime_mode
@@ -133,7 +136,7 @@
     defines += [ "NDEBUG" ]
   }
 
-  include_dirs = []
+  include_dirs = [ "include" ]
   if (dart_use_tcmalloc) {
     defines += [ "DART_USE_TCMALLOC" ]
     include_dirs += [ "../third_party/tcmalloc/gperftools/src" ]
@@ -188,6 +191,11 @@
     if (defined(is_tsan) && is_tsan) {
       ldflags += [ "-fsanitize=thread" ]
     }
+
+    if (is_fuchsia) {
+      # safe-stack does not work with the interpreter.
+      cflags += [ "-fno-sanitize=safe-stack" ]
+    }
   }
 }
 
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 8689f2c..f220caa 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -89,6 +89,35 @@
   ]
 }
 
+static_library("crashpad") {
+  configs += [
+    "..:dart_arch_config",
+    "..:dart_config",
+    "..:dart_product_config",
+    "..:dart_os_fuchsia_config",
+  ]
+  if (is_fuchsia) {
+    configs -= [ "//build/config:symbol_visibility_hidden" ]
+  }
+  include_dirs = [ ".." ]
+  sources = [
+    "crashpad.cc",
+  ]
+
+  if (dart_use_crashpad) {
+    assert(is_win, "dart_use_crashpad is only supported on Windows")
+    deps = [
+      "//third_party/crashpad/crashpad/client",
+      "//third_party/mini_chromium/mini_chromium/base",
+
+      # This binary is used to handle crashes of the dart binary.
+      "//third_party/crashpad/crashpad/handler:crashpad_handler",
+    ]
+    include_dirs += [ "//third_party/crashpad" ]
+    defines = [ "DART_USE_CRASHPAD" ]
+  }
+}
+
 template("build_gen_snapshot") {
   extra_configs = []
   if (defined(invoker.extra_configs)) {
@@ -311,6 +340,7 @@
                  "..:dart_config",
                  "..:dart_os_config",
                ] + extra_configs
+    public_configs = [ "..:dart_public_config" ]
     if (is_fuchsia) {
       configs -= [ "//build/config:symbol_visibility_hidden" ]
     }
@@ -664,6 +694,7 @@
              ":libdart_builtin",
              "//third_party/boringssl",
              "//third_party/zlib",
+             ":crashpad",
            ] + extra_deps
 
     defines = extra_defines
@@ -680,19 +711,6 @@
       "//third_party",
     ]
 
-    if (dart_use_crashpad) {
-      assert(is_win, "dart_use_crashpad is only supported on Windows")
-      deps += [
-        "//third_party/crashpad/crashpad/client",
-        "//third_party/mini_chromium/mini_chromium/base",
-
-        # This binary is used to handle crashes of the dart binary.
-        "//third_party/crashpad/crashpad/handler:crashpad_handler",
-      ]
-      include_dirs += [ "//third_party/crashpad" ]
-      defines += [ "DART_USE_CRASHPAD" ]
-    }
-
     sources = [
                 "dart_embedder_api_impl.cc",
                 "error_exit.cc",
@@ -882,6 +900,7 @@
   }
 
   deps = [
+    ":crashpad",
     ":dart_kernel_platform_cc",
     ":dart_snapshot_cc",
     ":gen_kernel_bytecode_dill",
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 1c33aeb..2d663e0 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -246,30 +246,6 @@
   return scriptUri.toString();
 }
 
-// Embedder Entrypoint (gen_snapshot):
-// Resolve relative paths relative to working directory.
-@pragma("vm:entry-point")
-String _resolveInWorkingDirectory(String fileName) {
-  if (!_setupCompleted) {
-    _setupHooks();
-  }
-  if (_workingDirectory == null) {
-    throw 'No current working directory set.';
-  }
-  var name = _sanitizeWindowsPath(fileName);
-
-  var uri = Uri.parse(name);
-  if (uri.scheme != '') {
-    throw 'Schemes are not supported when resolving filenames.';
-  }
-  uri = _workingDirectory.resolveUri(uri);
-
-  if (_traceLoading) {
-    _log('Resolved in working directory: $fileName -> $uri');
-  }
-  return uri.toString();
-}
-
 // Only used by vm/cc unit tests.
 Uri _resolvePackageUri(Uri uri) {
   assert(_packageRoot != null);
@@ -304,22 +280,6 @@
   }
 }
 
-// Embedder Entrypoint.
-@pragma("vm:entry-point")
-_libraryFilePath(String libraryUri) {
-  if (!_setupCompleted) {
-    _setupHooks();
-  }
-  int index = libraryUri.lastIndexOf('/');
-  var path;
-  if (index == -1) {
-    path = './';
-  } else {
-    path = libraryUri.substring(0, index + 1);
-  }
-  return _filePathFromUri(path);
-}
-
 // Register callbacks and hooks with the rest of the core libraries.
 @pragma("vm:entry-point")
 _setupHooks() {
diff --git a/runtime/bin/crashpad.cc b/runtime/bin/crashpad.cc
new file mode 100644
index 0000000..184dba1
--- /dev/null
+++ b/runtime/bin/crashpad.cc
@@ -0,0 +1,81 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "bin/crashpad.h"
+
+#if defined(DART_USE_CRASHPAD)
+#include <map>
+#include <string>
+#include <vector>
+
+#include "crashpad/client/crashpad_client.h"
+#include "crashpad/client/crashpad_info.h"
+#endif
+
+#include "bin/error_exit.h"
+#include "bin/log.h"
+#include "bin/platform.h"
+
+namespace dart {
+namespace bin {
+
+#if defined(DART_USE_CRASHPAD)
+#if !defined(HOST_OS_WINDOWS)
+#error "Currently we only support Crashpad on Windows"
+#endif
+
+void InitializeCrashpadClient() {
+  // DART_CRASHPAD_HANDLER and DART_CRASHPAD_CRASHES_DIR are set by the
+  // testing framework.
+  wchar_t* handler = _wgetenv(L"DART_CRASHPAD_HANDLER");
+  wchar_t* crashes_dir = _wgetenv(L"DART_CRASHPAD_CRASHES_DIR");
+  if (handler == nullptr || crashes_dir == nullptr || wcslen(handler) == 0 ||
+      wcslen(crashes_dir) == 0) {
+    return;
+  }
+
+  // Crashpad uses STL so we use it here too even though in general we
+  // avoid it.
+  const base::FilePath handler_path{std::wstring(handler)};
+  const base::FilePath crashes_dir_path{std::wstring(crashes_dir)};
+  const std::string url("");
+  std::map<std::string, std::string> annotations;
+  char* test_name = getenv("DART_TEST_NAME");
+  if (test_name != nullptr) {
+    annotations["dart_test_name"] = test_name;
+  }
+
+  std::vector<std::string> arguments;
+
+  crashpad::CrashpadClient client;
+
+  // Prevent crashpad_handler from inheriting our standard output and error
+  // handles. Otherwise we would not be able to close them ourselves making
+  // tests that rely on that fail.
+  HANDLE original_stdout = GetStdHandle(STD_OUTPUT_HANDLE);
+  HANDLE original_stderr = GetStdHandle(STD_ERROR_HANDLE);
+  SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE);
+  SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE);
+  const bool success =
+      client.StartHandler(handler_path, crashes_dir_path, crashes_dir_path, url,
+                          annotations, arguments,
+                          /*restartable=*/true,
+                          /*asynchronous_start=*/false);
+  SetStdHandle(STD_OUTPUT_HANDLE, original_stdout);
+  SetStdHandle(STD_ERROR_HANDLE, original_stderr);
+
+  if (!success) {
+    Log::PrintErr("Failed to start the crash handler!\n");
+    Platform::Exit(kErrorExitCode);
+  }
+  crashpad::CrashpadInfo::GetCrashpadInfo()
+      ->set_gather_indirectly_referenced_memory(crashpad::TriState::kEnabled,
+                                                /*limit=*/500 * MB);
+}
+#else
+void InitializeCrashpadClient() {}
+#endif  // DART_USE_CRASHPAD
+
+}  // namespace bin
+}  // namespace dart
diff --git a/runtime/bin/crashpad.h b/runtime/bin/crashpad.h
new file mode 100644
index 0000000..2534fd1
--- /dev/null
+++ b/runtime/bin/crashpad.h
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_BIN_CRASHPAD_H_
+#define RUNTIME_BIN_CRASHPAD_H_
+
+namespace dart {
+namespace bin {
+
+void InitializeCrashpadClient();
+
+}  // namespace bin
+}  // namespace dart
+
+#endif  // RUNTIME_BIN_CRASHPAD_H_
diff --git a/runtime/bin/dart_embedder_api_impl.cc b/runtime/bin/dart_embedder_api_impl.cc
index 072a279..ba47d33 100644
--- a/runtime/bin/dart_embedder_api_impl.cc
+++ b/runtime/bin/dart_embedder_api_impl.cc
@@ -36,7 +36,6 @@
                                   err.message());
     return false;
   }
-  bin::Thread::InitOnce();
   bin::TimerUtils::InitOnce();
   bin::EventHandler::Start();
   return true;
diff --git a/runtime/bin/dart_io_api_impl.cc b/runtime/bin/dart_io_api_impl.cc
index 82645e7..e8ab2ad 100644
--- a/runtime/bin/dart_io_api_impl.cc
+++ b/runtime/bin/dart_io_api_impl.cc
@@ -18,7 +18,6 @@
 
 void BootstrapDartIo() {
   // Bootstrap 'dart:io' event handler.
-  Thread::InitOnce();
   TimerUtils::InitOnce();
   EventHandler::Start();
 }
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 6eade2f..9252508 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -35,7 +35,6 @@
 namespace bin {
 
 const char* DartUtils::original_working_directory = NULL;
-CommandLineOptions* DartUtils::url_mapping = NULL;
 const char* const DartUtils::kDartScheme = "dart:";
 const char* const DartUtils::kDartExtensionScheme = "dart-ext:";
 const char* const DartUtils::kAsyncLibURL = "dart:async";
@@ -69,23 +68,6 @@
 #endif  // defined(HOST_OS_WINDOWS)
 }
 
-const char* DartUtils::MapLibraryUrl(const char* url_string) {
-  ASSERT(url_mapping != NULL);
-  // We need to check if the passed in url is found in the url_mapping array,
-  // in that case use the mapped entry.
-  intptr_t len = strlen(url_string);
-  for (intptr_t idx = 0; idx < url_mapping->count(); idx++) {
-    const char* url_name = url_mapping->GetArgument(idx);
-    if (!strncmp(url_string, url_name, len) && (url_name[len] == ',')) {
-      const char* url_mapped_name = url_name + len + 1;
-      if (strlen(url_mapped_name) != 0) {
-        return url_mapped_name;  // Found a mapping for this URL.
-      }
-    }
-  }
-  return NULL;  // Did not find a mapping for this URL.
-}
-
 int64_t DartUtils::GetIntegerValue(Dart_Handle value_obj) {
   int64_t value = 0;
   Dart_Handle result = Dart_IntegerToInt64(value_obj, &value);
@@ -394,23 +376,6 @@
                               directory);
 }
 
-Dart_Handle DartUtils::ResolveUriInWorkingDirectory(Dart_Handle script_uri) {
-  const int kNumArgs = 1;
-  Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = script_uri;
-  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
-                     NewString("_resolveInWorkingDirectory"), kNumArgs,
-                     dart_args);
-}
-
-Dart_Handle DartUtils::LibraryFilePath(Dart_Handle library_uri) {
-  const int kNumArgs = 1;
-  Dart_Handle dart_args[kNumArgs];
-  dart_args[0] = library_uri;
-  return Dart_Invoke(DartUtils::LookupBuiltinLib(),
-                     NewString("_libraryFilePath"), kNumArgs, dart_args);
-}
-
 Dart_Handle DartUtils::ResolveScript(Dart_Handle url) {
   const int kNumArgs = 1;
   Dart_Handle dart_args[kNumArgs];
@@ -783,19 +748,13 @@
 }
 
 bool DartUtils::SetOriginalWorkingDirectory() {
-  original_working_directory = Directory::CurrentNoScope();
-  return original_working_directory != NULL;
-}
-
-Dart_Handle DartUtils::GetCanonicalizableWorkingDirectory() {
-  const char* str = DartUtils::original_working_directory;
-  intptr_t len = strlen(str);
-  if ((str[len] == '/') || (IsWindowsHost() && str[len] == '\\')) {
-    return Dart_NewStringFromCString(str);
+  // If we happen to re-initialize the Dart VM multiple times, make sure to free
+  // the old string (allocated by getcwd()) before setting a new one.
+  if (original_working_directory != nullptr) {
+    free(const_cast<char*>(original_working_directory));
   }
-  char* new_str = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 2));
-  snprintf(new_str, (len + 2), "%s%s", str, File::PathSeparator());
-  return Dart_NewStringFromCString(new_str);
+  original_working_directory = Directory::CurrentNoScope();
+  return original_working_directory != nullptr;
 }
 
 void DartUtils::SetEnvironment(dart::SimpleHashMap* environment) {
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 666d248..6dd1c5b 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -214,11 +214,7 @@
   }
 
   static bool SetOriginalWorkingDirectory();
-  static Dart_Handle GetCanonicalizableWorkingDirectory();
 
-  static const char* MapLibraryUrl(const char* url_string);
-
-  static Dart_Handle ResolveUriInWorkingDirectory(Dart_Handle script_uri);
   static Dart_Handle ResolveScript(Dart_Handle url);
 
   enum MagicNumber {
@@ -239,9 +235,6 @@
   // Global state that stores the original working directory..
   static const char* original_working_directory;
 
-  // Global state that captures the URL mappings specified on the command line.
-  static CommandLineOptions* url_mapping;
-
   static const char* const kDartScheme;
   static const char* const kDartExtensionScheme;
   static const char* const kAsyncLibURL;
@@ -258,8 +251,6 @@
   static const char* const kHttpScheme;
   static const char* const kVMServiceLibURL;
 
-  static Dart_Handle LibraryFilePath(Dart_Handle library_uri);
-
   static void SetEnvironment(dart::SimpleHashMap* environment);
   static Dart_Handle EnvironmentCallback(Dart_Handle name);
 
@@ -585,61 +576,6 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedBlockingCall);
 };
 
-// Where the argument to the constructor is the handle for an object
-// implementing List<int>, this class creates a scope in which the memory
-// backing the list can be accessed.
-//
-// Do not make Dart_ API calls while in a ScopedMemBuffer.
-// Do not call Dart_PropagateError while in a ScopedMemBuffer.
-class ScopedMemBuffer {
- public:
-  explicit ScopedMemBuffer(Dart_Handle object) {
-    if (!Dart_IsTypedData(object) && !Dart_IsList(object)) {
-      Dart_ThrowException(
-          DartUtils::NewDartArgumentError("Argument is not a List<int>"));
-    }
-
-    uint8_t* bytes = NULL;
-    intptr_t bytes_len = 0;
-    bool is_typed_data = false;
-    if (Dart_IsTypedData(object)) {
-      is_typed_data = true;
-      Dart_TypedData_Type typ;
-      ThrowIfError(Dart_TypedDataAcquireData(
-          object, &typ, reinterpret_cast<void**>(&bytes), &bytes_len));
-    } else {
-      ASSERT(Dart_IsList(object));
-      ThrowIfError(Dart_ListLength(object, &bytes_len));
-      bytes = Dart_ScopeAllocate(bytes_len);
-      ASSERT(bytes != NULL);
-      ThrowIfError(Dart_ListGetAsBytes(object, 0, bytes, bytes_len));
-    }
-
-    object_ = object;
-    bytes_ = bytes;
-    bytes_len_ = bytes_len;
-    is_typed_data_ = is_typed_data;
-  }
-
-  ~ScopedMemBuffer() {
-    if (is_typed_data_) {
-      ThrowIfError(Dart_TypedDataReleaseData(object_));
-    }
-  }
-
-  uint8_t* get() const { return bytes_; }
-  intptr_t length() const { return bytes_len_; }
-
- private:
-  Dart_Handle object_;
-  uint8_t* bytes_;
-  intptr_t bytes_len_;
-  bool is_typed_data_;
-
-  DISALLOW_ALLOCATION();
-  DISALLOW_COPY_AND_ASSIGN(ScopedMemBuffer);
-};
-
 struct MagicNumberData {
   static const intptr_t kMaxLength = 8;
 
diff --git a/runtime/bin/extensions_fuchsia.cc b/runtime/bin/extensions_fuchsia.cc
index a177c4c..64df6b6 100644
--- a/runtime/bin/extensions_fuchsia.cc
+++ b/runtime/bin/extensions_fuchsia.cc
@@ -24,17 +24,7 @@
     "_kDartIsolateSnapshotInstructions";
 
 void* Extensions::LoadExtensionLibrary(const char* library_file) {
-  int fd = open(library_file, O_RDONLY);
-  if (fd < 0) {
-    return NULL;
-  }
-  zx_handle_t vmo;
-  zx_status_t status = fdio_get_vmo_clone(fd, &vmo);
-  close(fd);
-  if (status != ZX_OK) {
-    return NULL;
-  }
-  return dlopen_vmo(vmo, RTLD_LAZY);
+  return dlopen(library_file, RTLD_LAZY);
 }
 
 void* Extensions::ResolveSymbol(void* lib_handle, const char* symbol) {
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index 0fd8939..40aaf7d 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -76,12 +76,31 @@
 }
 
 MappedMemory* File::Map(MapType type, int64_t position, int64_t length) {
-  UNIMPLEMENTED();
-  return NULL;
+  ASSERT(handle_->fd() >= 0);
+  ASSERT(length > 0);
+  int prot = PROT_NONE;
+  switch (type) {
+    case kReadOnly:
+      prot = PROT_READ;
+      break;
+    case kReadExecute:
+      prot = PROT_READ | PROT_EXEC;
+      break;
+    default:
+      return NULL;
+  }
+  void* addr = mmap(NULL, length, prot, MAP_PRIVATE, handle_->fd(), position);
+  if (addr == MAP_FAILED) {
+    return NULL;
+  }
+  return new MappedMemory(addr, length);
 }
 
 void MappedMemory::Unmap() {
-  UNIMPLEMENTED();
+  int result = munmap(address_, size_);
+  ASSERT(result == 0);
+  address_ = 0;
+  size_ = 0;
 }
 
 int64_t File::Read(void* buffer, int64_t num_bytes) {
diff --git a/runtime/bin/file_system_watcher_fuchsia.cc b/runtime/bin/file_system_watcher_fuchsia.cc
index aa943eb..d898542 100644
--- a/runtime/bin/file_system_watcher_fuchsia.cc
+++ b/runtime/bin/file_system_watcher_fuchsia.cc
@@ -7,16 +7,18 @@
 
 #include "bin/file_system_watcher.h"
 
+#include <errno.h>
+
 namespace dart {
 namespace bin {
 
 Dart_Handle FileSystemWatcher::ReadEvents(intptr_t id, intptr_t path_id) {
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return DartUtils::NewDartOSError();
 }
 
 intptr_t FileSystemWatcher::GetSocketId(intptr_t id, intptr_t path_id) {
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return -1;
 }
 
@@ -25,7 +27,6 @@
 }
 
 void FileSystemWatcher::UnwatchPath(intptr_t id, intptr_t path_id) {
-  UNIMPLEMENTED();
 }
 
 intptr_t FileSystemWatcher::Init() {
@@ -33,7 +34,6 @@
 }
 
 void FileSystemWatcher::Close(intptr_t id) {
-  UNIMPLEMENTED();
 }
 
 intptr_t FileSystemWatcher::WatchPath(intptr_t id,
@@ -41,7 +41,7 @@
                                       const char* path,
                                       int events,
                                       bool recursive) {
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return -1;
 }
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index db0ef11..3cb0462 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -72,6 +72,7 @@
   kCore,
   kCoreJIT,
   kCoreJITAll,
+  kApp,
   kAppJIT,
   kAppAOTBlobs,
   kAppAOTAssembly,
@@ -99,6 +100,7 @@
     "core",
     "core-jit",
     "core-jit-all",
+    "app",
     "app-jit",
     "app-aot-blobs",
     "app-aot-assembly",
@@ -124,6 +126,7 @@
   V(assembly, assembly_filename)                                               \
   V(dependencies, dependencies_filename)                                       \
   V(load_compilation_trace, load_compilation_trace_filename)                   \
+  V(load_type_feedback, load_type_feedback_filename)                           \
   V(package_root, commandline_package_root)                                    \
   V(packages, commandline_packages_file)                                       \
   V(save_obfuscation_map, obfuscation_map_filename)
@@ -147,14 +150,6 @@
 #undef BOOL_OPTION_DEFINITION
 
 DEFINE_ENUM_OPTION(snapshot_kind, SnapshotKind, snapshot_kind);
-DEFINE_STRING_OPTION_CB(embedder_entry_points_manifest, {
-  Log::PrintErr(
-      "Option --embedder_entry_points_manifest is no longer supported."
-      " Use @pragma(\'vm:entry-point\') instead.\n");
-  exit(kErrorExitCode);
-});
-DEFINE_STRING_OPTION_CB(url_mapping,
-                        { DartUtils::url_mapping->AddArgument(value); });
 DEFINE_CB_OPTION(ProcessEnvironmentOption);
 
 static bool IsSnapshottingForPrecompilation() {
@@ -173,9 +168,6 @@
 "  Where to find packages, that is, package:...  imports.                    \n"
 "--packages=<packages_file>                                                  \n"
 "  Where to find a package spec file                                         \n"
-"--url_mapping=<mapping>                                                     \n"
-"  Uses the URL mapping(s) specified on the command line to load the         \n"
-"  libraries.                                                                \n"
 "--dependencies=<output-file>                                                \n"
 "  Generates a Makefile with snapshot output files as targets and all        \n"
 "  transitive imports as sources.                                            \n"
@@ -308,6 +300,7 @@
       }
       break;
     }
+    case kApp:
     case kAppJIT: {
       if ((load_vm_snapshot_data_filename == NULL) ||
           (isolate_snapshot_data_filename == NULL) ||
@@ -463,6 +456,7 @@
       case kAppAOTAssembly:
         WriteDependenciesWithTarget(assembly_filename);
         break;
+      case kApp:
       case kAppJIT:
         WriteDependenciesWithTarget(isolate_snapshot_data_filename);
         // WriteDependenciesWithTarget(isolate_snapshot_instructions_filename);
@@ -574,6 +568,14 @@
     Dart_Handle result = Dart_LoadCompilationTrace(buffer, size);
     CHECK_RESULT(result);
   }
+  if ((load_type_feedback_filename != NULL) &&
+      ((snapshot_kind == kCoreJIT) || (snapshot_kind == kAppJIT))) {
+    uint8_t* buffer = NULL;
+    intptr_t size = 0;
+    ReadFile(load_type_feedback_filename, &buffer, &size);
+    Dart_Handle result = Dart_LoadTypeFeedback(buffer, size);
+    CHECK_RESULT(result);
+  }
 }
 
 static void CompileAll() {
@@ -605,11 +607,15 @@
   WriteFile(vm_snapshot_data_filename, vm_snapshot_data_buffer,
             vm_snapshot_data_size);
   if (vm_snapshot_instructions_filename != NULL) {
+    // Create empty file for the convenience of build systems. Makes things
+    // polymorphic with generating core-jit snapshots.
     WriteFile(vm_snapshot_instructions_filename, NULL, 0);
   }
   WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
             isolate_snapshot_data_size);
   if (isolate_snapshot_instructions_filename != NULL) {
+    // Create empty file for the convenience of build systems. Makes things
+    // polymorphic with generating core-jit snapshots.
     WriteFile(isolate_snapshot_instructions_filename, NULL, 0);
   }
 }
@@ -677,6 +683,27 @@
             isolate_snapshot_instructions_size);
 }
 
+static void CreateAndWriteAppSnapshot() {
+  ASSERT(snapshot_kind == kApp);
+  ASSERT(isolate_snapshot_data_filename != NULL);
+
+  Dart_Handle result;
+  uint8_t* isolate_snapshot_data_buffer = NULL;
+  intptr_t isolate_snapshot_data_size = 0;
+
+  result = Dart_CreateSnapshot(NULL, NULL, &isolate_snapshot_data_buffer,
+                               &isolate_snapshot_data_size);
+  CHECK_RESULT(result);
+
+  WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
+            isolate_snapshot_data_size);
+  if (isolate_snapshot_instructions_filename != NULL) {
+    // Create empty file for the convenience of build systems. Makes things
+    // polymorphic with generating core-jit snapshots.
+    WriteFile(isolate_snapshot_instructions_filename, NULL, 0);
+  }
+}
+
 static void CreateAndWriteAppJITSnapshot() {
   ASSERT(snapshot_kind == kAppJIT);
   ASSERT(isolate_snapshot_data_filename != NULL);
@@ -909,6 +936,9 @@
       LoadCompilationTrace();
       CreateAndWriteCoreJITSnapshot();
       break;
+    case kApp:
+      CreateAndWriteAppSnapshot();
+      break;
     case kAppJIT:
       LoadBytecode();
       LoadCompilationTrace();
@@ -937,13 +967,9 @@
 }
 
 int main(int argc, char** argv) {
-  const int EXTRA_VM_ARGUMENTS = 4;
+  const int EXTRA_VM_ARGUMENTS = 7;
   CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
 
-  // Initialize the URL mapping array.
-  CommandLineOptions cmdline_url_mapping(argc);
-  DartUtils::url_mapping = &cmdline_url_mapping;
-
   // When running from the command line we assume that we are optimizing for
   // throughput, and therefore use a larger new gen semi space size and a faster
   // new gen growth factor unless others have been specified.
@@ -953,6 +979,7 @@
     vm_options.AddArgument("--new_gen_semi_max_size=32");
   }
   vm_options.AddArgument("--new_gen_growth_factor=4");
+  vm_options.AddArgument("--deterministic");
 
   // Parse command line arguments.
   if (ParseArguments(argc, argv, &vm_options, &app_script_name) < 0) {
@@ -979,7 +1006,6 @@
     return kErrorExitCode;
   }
   Console::SaveConfig();
-  Thread::InitOnce();
   Loader::InitOnce();
   DartUtils::SetOriginalWorkingDirectory();
   // Start event handler.
@@ -993,11 +1019,12 @@
 
   if (IsSnapshottingForPrecompilation()) {
     vm_options.AddArgument("--precompilation");
-  }
-  if ((snapshot_kind == kCoreJITAll) || (snapshot_kind == kCoreJIT) ||
-      (snapshot_kind == kAppJIT)) {
+  } else if ((snapshot_kind == kCoreJITAll) || (snapshot_kind == kCoreJIT) ||
+             (snapshot_kind == kAppJIT)) {
     vm_options.AddArgument("--fields_may_be_reset");
+#if !defined(TARGET_ARCH_IA32)
     vm_options.AddArgument("--link_natives_lazily");
+#endif
 #if !defined(PRODUCT)
     vm_options.AddArgument("--collect_code=false");
 #endif
diff --git a/runtime/bin/isolate_data.cc b/runtime/bin/isolate_data.cc
index 4be4208..54b1050 100644
--- a/runtime/bin/isolate_data.cc
+++ b/runtime/bin/isolate_data.cc
@@ -21,8 +21,7 @@
       dependencies_(NULL),
       resolved_packages_config_(NULL),
       kernel_buffer_(NULL),
-      kernel_buffer_size_(0),
-      owns_kernel_buffer_(false) {
+      kernel_buffer_size_(0) {
   if (package_root != NULL) {
     ASSERT(packages_file == NULL);
     this->package_root = strdup(package_root);
@@ -43,10 +42,6 @@
   packages_file = NULL;
   free(resolved_packages_config_);
   resolved_packages_config_ = NULL;
-  if (owns_kernel_buffer_) {
-    ASSERT(kernel_buffer_ != NULL);
-    free(kernel_buffer_);
-  }
   kernel_buffer_ = NULL;
   kernel_buffer_size_ = 0;
   delete app_snapshot_;
diff --git a/runtime/bin/isolate_data.h b/runtime/bin/isolate_data.h
index ceab601..528f397 100644
--- a/runtime/bin/isolate_data.h
+++ b/runtime/bin/isolate_data.h
@@ -5,6 +5,9 @@
 #ifndef RUNTIME_BIN_ISOLATE_DATA_H_
 #define RUNTIME_BIN_ISOLATE_DATA_H_
 
+#include <memory>
+#include <utility>
+
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "platform/globals.h"
@@ -40,13 +43,37 @@
   char* package_root;
   char* packages_file;
 
-  const uint8_t* kernel_buffer() const { return kernel_buffer_; }
+  const std::shared_ptr<uint8_t>& kernel_buffer() const {
+    return kernel_buffer_;
+  }
+
   intptr_t kernel_buffer_size() const { return kernel_buffer_size_; }
-  void set_kernel_buffer(uint8_t* buffer, intptr_t size, bool take_ownership) {
-    ASSERT(kernel_buffer_ == NULL);
-    kernel_buffer_ = buffer;
+
+  // Associate the given kernel buffer with this IsolateData without giving it
+  // ownership of the buffer.
+  void SetKernelBufferUnowned(uint8_t* buffer, intptr_t size) {
+    ASSERT(kernel_buffer_.get() == NULL);
+    kernel_buffer_ = std::shared_ptr<uint8_t>(buffer, FreeUnownedKernelBuffer);
     kernel_buffer_size_ = size;
-    owns_kernel_buffer_ = take_ownership;
+  }
+
+  // Associate the given kernel buffer with this IsolateData and give it
+  // ownership of the buffer. This IsolateData is the first one to own the
+  // buffer.
+  void SetKernelBufferNewlyOwned(uint8_t* buffer, intptr_t size) {
+    ASSERT(kernel_buffer_.get() == NULL);
+    kernel_buffer_ = std::shared_ptr<uint8_t>(buffer, free);
+    kernel_buffer_size_ = size;
+  }
+
+  // Associate the given kernel buffer with this IsolateData and give it
+  // ownership of the buffer. The buffer is already owned by another
+  // IsolateData.
+  void SetKernelBufferAlreadyOwned(std::shared_ptr<uint8_t> buffer,
+                                   intptr_t size) {
+    ASSERT(kernel_buffer_.get() == NULL);
+    kernel_buffer_ = std::move(buffer);
+    kernel_buffer_size_ = size;
   }
 
   void UpdatePackagesFile(const char* packages_file_) {
@@ -91,9 +118,10 @@
   AppSnapshot* app_snapshot_;
   MallocGrowableArray<char*>* dependencies_;
   char* resolved_packages_config_;
-  uint8_t* kernel_buffer_;
+  std::shared_ptr<uint8_t> kernel_buffer_;
   intptr_t kernel_buffer_size_;
-  bool owns_kernel_buffer_;
+
+  static void FreeUnownedKernelBuffer(uint8_t*) {}
 
   DISALLOW_COPY_AND_ASSIGN(IsolateData);
 };
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 5473185..cb1dd8d 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -5,19 +5,16 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <memory>
 
 #include "include/bin/dart_io_api.h"
 #include "include/dart_api.h"
 #include "include/dart_embedder_api.h"
 #include "include/dart_tools_api.h"
 
-#if defined(DART_USE_CRASHPAD)
-#include "crashpad/client/crashpad_client.h"
-#include "crashpad/client/crashpad_info.h"
-#endif
-
 #include "bin/builtin.h"
 #include "bin/console.h"
+#include "bin/crashpad.h"
 #include "bin/dartutils.h"
 #include "bin/dfe.h"
 #include "bin/directory.h"
@@ -25,6 +22,7 @@
 #include "bin/eventhandler.h"
 #include "bin/extensions.h"
 #include "bin/file.h"
+#include "bin/gzip.h"
 #include "bin/isolate_data.h"
 #include "bin/loader.h"
 #include "bin/log.h"
@@ -39,7 +37,6 @@
 #include "platform/growable_array.h"
 #include "platform/hashmap.h"
 #include "platform/text_buffer.h"
-#include "bin/gzip.h"
 
 #include "vm/flags.h"
 
@@ -217,7 +214,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   IsolateData* isolate_data =
       reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
-  const uint8_t* kernel_buffer = isolate_data->kernel_buffer();
+  const uint8_t* kernel_buffer = isolate_data->kernel_buffer().get();
   intptr_t kernel_buffer_size = isolate_data->kernel_buffer_size();
 #endif
 
@@ -278,9 +275,8 @@
       Dart_ShutdownIsolate();
       return NULL;
     }
-    isolate_data->set_kernel_buffer(application_kernel_buffer,
-                                    application_kernel_buffer_size,
-                                    true /*take ownership*/);
+    isolate_data->SetKernelBufferNewlyOwned(application_kernel_buffer,
+                                            application_kernel_buffer_size);
     kernel_buffer = application_kernel_buffer;
     kernel_buffer_size = application_kernel_buffer_size;
   }
@@ -437,9 +433,9 @@
     dfe.LoadKernelService(&kernel_service_buffer, &kernel_service_buffer_size);
     ASSERT(kernel_service_buffer != NULL);
     isolate_data = new IsolateData(uri, package_root, packages_config, NULL);
-    isolate_data->set_kernel_buffer(const_cast<uint8_t*>(kernel_service_buffer),
-                                    kernel_service_buffer_size,
-                                    false /* take_ownership */);
+    isolate_data->SetKernelBufferUnowned(
+        const_cast<uint8_t*>(kernel_service_buffer),
+        kernel_service_buffer_size);
     isolate = Dart_CreateIsolateFromKernel(
         DART_KERNEL_ISOLATE_NAME, main, kernel_service_buffer,
         kernel_service_buffer_size, flags, isolate_data, error);
@@ -531,11 +527,13 @@
                                                 const char* package_root,
                                                 const char* packages_config,
                                                 Dart_IsolateFlags* flags,
+                                                void* callback_data,
                                                 char** error,
                                                 int* exit_code) {
   int64_t start = Dart_TimelineGetMicros();
   ASSERT(script_uri != NULL);
   uint8_t* kernel_buffer = NULL;
+  std::shared_ptr<uint8_t> parent_kernel_buffer;
   intptr_t kernel_buffer_size = 0;
   AppSnapshot* app_snapshot = NULL;
 
@@ -569,7 +567,16 @@
           &isolate_snapshot_data, &isolate_snapshot_instructions);
     }
   }
-  if (!isolate_run_app_snapshot) {
+
+  if (flags->copy_parent_code && callback_data) {
+    IsolateData* parent_isolate_data =
+        reinterpret_cast<IsolateData*>(callback_data);
+    parent_kernel_buffer = parent_isolate_data->kernel_buffer();
+    kernel_buffer = parent_kernel_buffer.get();
+    kernel_buffer_size = parent_isolate_data->kernel_buffer_size();
+  }
+
+  if (kernel_buffer == NULL && !isolate_run_app_snapshot) {
     dfe.ReadScript(script_uri, &kernel_buffer, &kernel_buffer_size);
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -577,8 +584,13 @@
   IsolateData* isolate_data =
       new IsolateData(script_uri, package_root, packages_config, app_snapshot);
   if (kernel_buffer != NULL) {
-    isolate_data->set_kernel_buffer(kernel_buffer, kernel_buffer_size,
-                                    true /*take ownership*/);
+    if (parent_kernel_buffer) {
+      isolate_data->SetKernelBufferAlreadyOwned(std::move(parent_kernel_buffer),
+                                                kernel_buffer_size);
+    } else {
+      isolate_data->SetKernelBufferNewlyOwned(kernel_buffer,
+                                              kernel_buffer_size);
+    }
   }
   if (is_main_isolate && (Options::depfile() != NULL)) {
     isolate_data->set_dependencies(new MallocGrowableArray<char*>());
@@ -644,7 +656,7 @@
                                           const char* package_root,
                                           const char* package_config,
                                           Dart_IsolateFlags* flags,
-                                          void* data,
+                                          void* callback_data,
                                           char** error) {
   // The VM should never call the isolate helper with a NULL flags.
   ASSERT(flags != NULL);
@@ -671,8 +683,8 @@
   }
   bool is_main_isolate = false;
   return CreateIsolateAndSetupHelper(is_main_isolate, script_uri, main,
-                                     package_root, package_config, flags, error,
-                                     &exit_code);
+                                     package_root, package_config, flags,
+                                     callback_data, error, &exit_code);
 }
 
 char* BuildIsolateName(const char* script_name, const char* func_name) {
@@ -806,7 +818,8 @@
 
   Dart_Isolate isolate = CreateIsolateAndSetupHelper(
       is_main_isolate, script_name, "main", Options::package_root(),
-      Options::packages_file(), &flags, &error, &exit_code);
+      Options::packages_file(), &flags, NULL /* callback_data */, &error,
+      &exit_code);
 
   if (isolate == NULL) {
     delete[] isolate_name;
@@ -866,11 +879,11 @@
       LoadBytecode();
     }
 
-    if (Options::load_compilation_trace_filename() != NULL) {
+    if (Options::load_type_feedback_filename() != NULL) {
       uint8_t* buffer = NULL;
       intptr_t size = 0;
-      ReadFile(Options::load_compilation_trace_filename(), &buffer, &size);
-      result = Dart_LoadCompilationTrace(buffer, size);
+      ReadFile(Options::load_type_feedback_filename(), &buffer, &size);
+      result = Dart_LoadTypeFeedback(buffer, size);
       CHECK_RESULT(result);
     }
 
@@ -909,12 +922,12 @@
     }
     CHECK_RESULT(result);
 
-    if (Options::save_compilation_trace_filename() != NULL) {
+    if (Options::save_type_feedback_filename() != NULL) {
       uint8_t* buffer = NULL;
       intptr_t size = 0;
-      result = Dart_SaveCompilationTrace(&buffer, &size);
+      result = Dart_SaveTypeFeedback(&buffer, &size);
       CHECK_RESULT(result);
-      WriteFile(Options::save_compilation_trace_filename(), buffer, size);
+      WriteFile(Options::save_type_feedback_filename(), buffer, size);
     }
   }
 
@@ -952,45 +965,6 @@
 static Dart_GetVMServiceAssetsArchive GetVMServiceAssetsArchiveCallback = NULL;
 #endif  // !defined(NO_OBSERVATORY)
 
-#if defined(DART_USE_CRASHPAD)
-#if !defined(HOST_OS_WINDOWS)
-#error "Currently we only support Crashpad on Windows"
-#endif
-
-static void ConfigureCrashpadClient(crashpad::CrashpadClient* client) {
-  // DART_CRASHPAD_HANDLER and DART_CRASHPAD_CRASHES_DIR are set by the
-  // testing framework.
-  wchar_t* handler = _wgetenv(L"DART_CRASHPAD_HANDLER");
-  wchar_t* crashes_dir = _wgetenv(L"DART_CRASHPAD_CRASHES_DIR");
-  if (handler == nullptr || crashes_dir == nullptr) {
-    return;
-  }
-
-  // Crashpad uses STL so we use it here too even though in general we
-  // avoid it.
-  const base::FilePath handler_path{std::wstring(handler)};
-  const base::FilePath crashes_dir_path{std::wstring(crashes_dir)};
-  const std::string url("");
-  std::map<std::string, std::string> annotations;
-  char* test_name = getenv("DART_TEST_NAME");
-  if (test_name != nullptr) {
-    annotations["dart_test_name"] = test_name;
-  }
-
-  std::vector<std::string> arguments;
-  if (!client->StartHandler(handler_path, crashes_dir_path, crashes_dir_path,
-                            url, annotations, arguments,
-                            /*restartable=*/true,
-                            /*asynchronous_start=*/false)) {
-    Log::PrintErr("Failed to start the crash handler!\n");
-    Platform::Exit(kErrorExitCode);
-  }
-  crashpad::CrashpadInfo::GetCrashpadInfo()
-      ->set_gather_indirectly_referenced_memory(crashpad::TriState::kEnabled,
-                                                /*limit=*/500 * MB);
-}
-#endif  // DART_USE_CRASHPAD
-
 void main(int argc, char** argv) {
   char* script_name;
   const int EXTRA_VM_ARGUMENTS = 10;
@@ -1054,10 +1028,11 @@
   }
   DartUtils::SetEnvironment(Options::environment());
 
-#if defined(DART_USE_CRASHPAD)
-  crashpad::CrashpadClient crashpad_client;
-  ConfigureCrashpadClient(&crashpad_client);
-#endif
+  if (Options::suppress_core_dump()) {
+    Platform::SetCoreDumpResourceLimit(0);
+  } else {
+    InitializeCrashpadClient();
+  }
 
   Loader::InitOnce();
 
diff --git a/runtime/bin/main_options.h b/runtime/bin/main_options.h
index 1c56d0b..2b668ac 100644
--- a/runtime/bin/main_options.h
+++ b/runtime/bin/main_options.h
@@ -24,8 +24,8 @@
   V(depfile, depfile)                                                          \
   V(depfile_output_filename, depfile_output_filename)                          \
   V(shared_blobs, shared_blobs_filename)                                       \
-  V(save_compilation_trace, save_compilation_trace_filename)                   \
-  V(load_compilation_trace, load_compilation_trace_filename)                   \
+  V(save_type_feedback, save_type_feedback_filename)                           \
+  V(load_type_feedback, load_type_feedback_filename)                           \
   V(root_certs_file, root_certs_file)                                          \
   V(root_certs_cache, root_certs_cache)                                        \
   V(namespace, namespc)
@@ -41,7 +41,8 @@
   V(short_socket_read, short_socket_read)                                      \
   V(short_socket_write, short_socket_write)                                    \
   V(disable_exit, exit_disabled)                                               \
-  V(preview_dart_2, nop_option)
+  V(preview_dart_2, nop_option)                                                \
+  V(suppress_core_dump, suppress_core_dump)
 
 // Boolean flags that have a short form.
 #define SHORT_BOOL_OPTIONS_LIST(V)                                             \
diff --git a/runtime/bin/namespace_patch.dart b/runtime/bin/namespace_patch.dart
index 488aaf5..f28c104 100644
--- a/runtime/bin/namespace_patch.dart
+++ b/runtime/bin/namespace_patch.dart
@@ -32,6 +32,7 @@
 }
 
 @patch
+@pragma("vm:entry-point")
 class _Namespace {
   @patch
   @pragma("vm:entry-point")
diff --git a/runtime/bin/platform.h b/runtime/bin/platform.h
index d174902..30d92ae7 100644
--- a/runtime/bin/platform.h
+++ b/runtime/bin/platform.h
@@ -88,7 +88,9 @@
   static int GetScriptIndex() { return script_index_; }
   static char** GetArgv() { return argv_; }
 
-  static DART_NORETURN void Exit(int exit_code);
+  DART_NORETURN static void Exit(int exit_code);
+
+  static void SetCoreDumpResourceLimit(int value);
 
  private:
   // The path to the executable.
diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc
index a7afafe..cd1efd7 100644
--- a/runtime/bin/platform_android.cc
+++ b/runtime/bin/platform_android.cc
@@ -10,6 +10,7 @@
 #include <errno.h>        // NOLINT
 #include <signal.h>       // NOLINT
 #include <string.h>       // NOLINT
+#include <sys/resource.h>
 #include <sys/utsname.h>  // NOLINT
 #include <unistd.h>       // NOLINT
 
@@ -167,6 +168,11 @@
   exit(exit_code);
 }
 
+void Platform::SetCoreDumpResourceLimit(int value) {
+  rlimit limit = {static_cast<rlim_t>(value), static_cast<rlim_t>(value)};
+  setrlimit(RLIMIT_CORE, &limit);
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/platform_fuchsia.cc b/runtime/bin/platform_fuchsia.cc
index 58aecb1..7893f14 100644
--- a/runtime/bin/platform_fuchsia.cc
+++ b/runtime/bin/platform_fuchsia.cc
@@ -152,6 +152,10 @@
   exit(exit_code);
 }
 
+void Platform::SetCoreDumpResourceLimit(int value) {
+  // Not supported.
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/platform_linux.cc b/runtime/bin/platform_linux.cc
index a8dccc5..260a900 100644
--- a/runtime/bin/platform_linux.cc
+++ b/runtime/bin/platform_linux.cc
@@ -10,6 +10,7 @@
 #include <errno.h>        // NOLINT
 #include <signal.h>       // NOLINT
 #include <string.h>       // NOLINT
+#include <sys/resource.h>  // NOLINT
 #include <sys/utsname.h>  // NOLINT
 #include <unistd.h>       // NOLINT
 
@@ -167,6 +168,11 @@
   exit(exit_code);
 }
 
+void Platform::SetCoreDumpResourceLimit(int value) {
+  rlimit limit = {static_cast<rlim_t>(value), static_cast<rlim_t>(value)};
+  setrlimit(RLIMIT_CORE, &limit);
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index 1cf7f46..c41e8b2 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -16,6 +16,7 @@
 #include <mach-o/dyld.h>
 #include <signal.h>       // NOLINT
 #include <string.h>       // NOLINT
+#include <sys/resource.h>  // NOLINT
 #include <sys/sysctl.h>   // NOLINT
 #include <sys/types.h>    // NOLINT
 #include <sys/utsname.h>  // NOLINT
@@ -256,6 +257,11 @@
   exit(exit_code);
 }
 
+void Platform::SetCoreDumpResourceLimit(int value) {
+  rlimit limit = {static_cast<rlim_t>(value), static_cast<rlim_t>(value)};
+  setrlimit(RLIMIT_CORE, &limit);
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/platform_patch.dart b/runtime/bin/platform_patch.dart
index dd7d88a..99b4e7c 100644
--- a/runtime/bin/platform_patch.dart
+++ b/runtime/bin/platform_patch.dart
@@ -5,6 +5,7 @@
 // part of "common_patch.dart";
 
 @patch
+@pragma("vm:entry-point")
 class _Platform {
   @patch
   static int _numberOfProcessors() native "Platform_NumberOfProcessors";
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index 069b9e5..5cdf6fc 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -43,11 +43,21 @@
     // Disable the message box for assertions in the CRT in Debug builds.
     // See: https://msdn.microsoft.com/en-us/library/1y71x448.aspx
     _CrtSetReportMode(_CRT_ASSERT, 0);
+
     // Disable dialog boxes for "critical" errors or when OpenFile cannot find
-    // the requested file. See:
+    // the requested file. However only disable error boxes for general
+    // protection faults if an environment variable is set. Passing
+    // SEM_NOGPFAULTERRORBOX completely disables WindowsErrorReporting (WER)
+    // for the process, which means users loose ability to enable local dump
+    // archiving to collect minidumps for Dart VM crashes.
+    // Our test runner would set DART_SUPPRESS_WER to suppress WER UI during
+    // test suite execution.
     // See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680621(v=vs.85).aspx
-    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX |
-                 SEM_NOGPFAULTERRORBOX);
+    UINT uMode = SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX;
+    if (getenv("DART_SUPPRESS_WER") != nullptr) {
+      uMode |= SEM_NOGPFAULTERRORBOX;
+    }
+    SetErrorMode(uMode);
 #ifndef PRODUCT
     // Set up global exception handler to be able to dump stack trace on crash.
     SetExceptionHandler();
@@ -71,8 +81,12 @@
           ExceptionInfo->ExceptionRecord->ExceptionFlags,
           ExceptionInfo->ExceptionRecord->ExceptionAddress);
       Dart_DumpNativeStackTrace(ExceptionInfo->ContextRecord);
-      const int kAbortExitCode = 3;
-      Platform::Exit(kAbortExitCode);
+      Console::RestoreConfig();
+      // TODO(zra): Remove once VM shuts down cleanly.
+      ::dart::private_flag_windows_run_tls_destructors = false;
+      // Note: we want to abort(...) here instead of exiting because exiting
+      // would not cause WER to generate a minidump.
+      abort();
     }
     return EXCEPTION_CONTINUE_SEARCH;
   }
@@ -287,6 +301,10 @@
   ::ExitProcess(exit_code);
 }
 
+void Platform::SetCoreDumpResourceLimit(int value) {
+  // Not supported.
+}
+
 }  // namespace bin
 }  // namespace dart
 
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index 08a7dcb..1608bc9 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -176,7 +176,7 @@
 
   static zx_status_t Add(zx_handle_t process) {
     MonitorLocker locker(monitor_);
-    LOG_INFO("ExitCodeHandler Adding Process: %ld\n", process);
+    LOG_INFO("ExitCodeHandler Adding Process: %u\n", process);
     return zx_object_wait_async(process, port_, static_cast<uint64_t>(process),
                                 ZX_TASK_TERMINATED, ZX_WAIT_ASYNC_ONCE);
   }
@@ -230,7 +230,7 @@
       zx_handle_t process = static_cast<zx_handle_t>(pkt.key);
       zx_signals_t observed = pkt.signal.observed;
       if ((observed & ZX_TASK_TERMINATED) == ZX_SIGNAL_NONE) {
-        LOG_ERR("ExitCodeHandler: Unexpected signals, process %ld: %lx\n",
+        LOG_ERR("ExitCodeHandler: Unexpected signals, process %u: %ux\n",
                 process, observed);
       }
       SendProcessStatus(process);
@@ -242,7 +242,7 @@
   }
 
   static void SendProcessStatus(zx_handle_t process) {
-    LOG_INFO("ExitCodeHandler thread getting process status: %ld\n", process);
+    LOG_INFO("ExitCodeHandler thread getting process status: %u\n", process);
     int return_code = -1;
     zx_info_process_t proc_info;
     zx_status_t status = zx_object_get_info(
@@ -254,11 +254,11 @@
       return_code = proc_info.return_code;
     }
     zx_handle_close(process);
-    LOG_INFO("ExitCodeHandler thread process %ld exited with %d\n", process,
+    LOG_INFO("ExitCodeHandler thread process %u exited with %d\n", process,
              return_code);
 
     const intptr_t exit_code_fd = ProcessInfoList::LookupProcessExitFd(process);
-    LOG_INFO("ExitCodeHandler thread sending %ld code %d on fd %ld\n", process,
+    LOG_INFO("ExitCodeHandler thread sending %u code %d on fd %ld\n", process,
              return_code, exit_code_fd);
     if (exit_code_fd != 0) {
       int exit_message[2];
@@ -274,11 +274,11 @@
       }
       LOG_INFO("ExitCodeHandler thread wrote %ld bytes to fd %ld\n", result,
                exit_code_fd);
-      LOG_INFO("ExitCodeHandler thread removing process %ld from list\n",
+      LOG_INFO("ExitCodeHandler thread removing process %u from list\n",
                process);
       ProcessInfoList::RemoveProcess(process);
     } else {
-      LOG_ERR("ExitCodeHandler: Process %ld not found\n", process);
+      LOG_ERR("ExitCodeHandler: Process %u not found\n", process);
     }
   }
 
@@ -615,8 +615,9 @@
     char err_msg[FDIO_SPAWN_ERR_MSG_MAX_LENGTH];
     uint32_t flags = FDIO_SPAWN_CLONE_JOB | FDIO_SPAWN_CLONE_LDSVC |
         FDIO_SPAWN_CLONE_NAMESPACE;
-    status = fdio_spawn_vmo(ZX_HANDLE_INVALID, flags, vmo, program_arguments_,
-                            program_environment_, 4, actions, &process, err_msg);
+    status =
+        fdio_spawn_vmo(ZX_HANDLE_INVALID, flags, vmo, program_arguments_,
+                       program_environment_, 4, actions, &process, err_msg);
 
     if (status != ZX_OK) {
       LOG_ERR("ProcessStarter: Start() fdio_spawn_vmo failed\n");
@@ -626,7 +627,7 @@
       return status;
     }
 
-    LOG_INFO("ProcessStarter: Start() adding %ld to list with exit_pipe %d\n",
+    LOG_INFO("ProcessStarter: Start() adding %u to list with exit_pipe %d\n",
              process, exit_pipe_fds[1]);
     ProcessInfoList::AddProcess(process, exit_pipe_fds[1]);
     ExitCodeHandler::Start();
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 375fb93..373eb7d 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -192,6 +192,7 @@
   static _currentRss() native "ProcessInfo_CurrentRSS";
 }
 
+@pragma("vm:entry-point")
 class _ProcessStartStatus {
   @pragma("vm:entry-point", "set")
   int _errorCode; // Set to OS error code if process start failed.
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 2240355..f024c4d 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "bin/console.h"
+#include "bin/crashpad.h"
 #include "bin/dartutils.h"
 #include "bin/dfe.h"
 #include "bin/eventhandler.h"
@@ -165,9 +166,9 @@
     ASSERT(kernel_service_buffer != NULL);
     isolate_data =
         new bin::IsolateData(script_uri, package_root, packages_config, NULL);
-    isolate_data->set_kernel_buffer(const_cast<uint8_t*>(kernel_service_buffer),
-                                    kernel_service_buffer_size,
-                                    false /* take_ownership */);
+    isolate_data->SetKernelBufferUnowned(
+        const_cast<uint8_t*>(kernel_service_buffer),
+        kernel_service_buffer_size);
     isolate = Dart_CreateIsolateFromKernel(
         script_uri, main, kernel_service_buffer, kernel_service_buffer_size,
         flags, isolate_data, error);
@@ -209,6 +210,15 @@
   delete isolate_data;
 }
 
+void ShiftArgs(int* argc, const char** argv) {
+  // Remove the first flag from the list by shifting all arguments down.
+  for (intptr_t i = 1; i < *argc - 1; i++) {
+    argv[i] = argv[i + 1];
+  }
+  argv[*argc - 1] = nullptr;
+  (*argc)--;
+}
+
 static int Main(int argc, const char** argv) {
   // Flags being passed to the Dart VM.
   int dart_argc = 0;
@@ -244,7 +254,19 @@
 
   int arg_pos = 1;
   bool start_kernel_isolate = false;
-  if (strstr(argv[arg_pos], "--dfe") == argv[arg_pos]) {
+  bool suppress_core_dump = false;
+  if (strcmp(argv[arg_pos], "--suppress-core-dump") == 0) {
+    suppress_core_dump = true;
+    ShiftArgs(&argc, argv);
+  }
+
+  if (suppress_core_dump) {
+    bin::Platform::SetCoreDumpResourceLimit(0);
+  } else {
+    bin::InitializeCrashpadClient();
+  }
+
+  if (strncmp(argv[arg_pos], "--dfe", strlen("--dfe")) == 0) {
     const char* delim = strstr(argv[arg_pos], "=");
     if (delim == NULL || strlen(delim + 1) == 0) {
       bin::Log::PrintErr("Invalid value for the option: %s\n", argv[arg_pos]);
@@ -252,13 +274,8 @@
       return 1;
     }
     kernel_snapshot = strdup(delim + 1);
-    // Remove this flag from the list by shifting all arguments down.
-    for (intptr_t i = arg_pos; i < argc - 1; i++) {
-      argv[i] = argv[i + 1];
-    }
-    argv[argc - 1] = nullptr;
-    argc--;
     start_kernel_isolate = true;
+    ShiftArgs(&argc, argv);
   }
 
   if (arg_pos == argc - 1 && strcmp(argv[arg_pos], "--benchmarks") == 0) {
@@ -273,7 +290,6 @@
     dart_argv = &argv[1];
   }
 
-  bin::Thread::InitOnce();
   bin::TimerUtils::InitOnce();
   bin::EventHandler::Start();
 
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
index 5d61f88..876e789 100644
--- a/runtime/bin/secure_socket_patch.dart
+++ b/runtime/bin/secure_socket_patch.dart
@@ -64,6 +64,7 @@
  * are backed by an external C array of bytes, so that both Dart code and
  * native code can access the same data.
  */
+@pragma("vm:entry-point")
 class _SecureFilterImpl extends NativeFieldWrapperClass1
     implements _SecureFilter {
   // Performance is improved if a full buffer of plaintext fits
diff --git a/runtime/bin/security_context_macos.cc b/runtime/bin/security_context_macos.cc
index 73f0fa8..2964d67 100644
--- a/runtime/bin/security_context_macos.cc
+++ b/runtime/bin/security_context_macos.cc
@@ -62,7 +62,7 @@
   if (length < 0) {
     return 0;
   }
-  auto deb_cert = std::make_unique<unsigned char[]>(length);
+  auto deb_cert = std::unique_ptr<unsigned char[]>(new unsigned char[length]);
   unsigned char* temp = deb_cert.get();
   if (i2d_X509(cert, &temp) != length) {
     return NULL;
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 7af4d65..abcb7ba 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -350,6 +350,7 @@
       ErrorExit(kErrorExitCode, "%s\n", result.error);
     }
     WriteSnapshotFile(snapshot_filename, result.kernel, result.kernel_size);
+    free(result.kernel);
   }
 #else
   UNREACHABLE();
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 7d07146..42fd447 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -110,8 +110,14 @@
         __FILE__, __LINE__);
   }
 
-  VOID_NO_RETRY_EXPECTED(
-      setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)));
+  if (!SocketBase::SetMulticastHops(fd,
+                                    addr.addr.sa_family == AF_INET
+                                        ? SocketAddress::TYPE_IPV4
+                                        : SocketAddress::TYPE_IPV6,
+                                    ttl)) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
diff --git a/runtime/bin/socket_base_fuchsia.cc b/runtime/bin/socket_base_fuchsia.cc
index b89abf2..d6c9495a 100644
--- a/runtime/bin/socket_base_fuchsia.cc
+++ b/runtime/bin/socket_base_fuchsia.cc
@@ -118,8 +118,7 @@
                               intptr_t num_bytes,
                               RawAddr* addr,
                               SocketOpKind sync) {
-  LOG_ERR("SocketBase::RecvFrom is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return -1;
 }
 
@@ -152,8 +151,7 @@
                             intptr_t num_bytes,
                             const RawAddr& addr,
                             SocketOpKind sync) {
-  LOG_ERR("SocketBase::SendTo is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return -1;
 }
 
@@ -182,19 +180,16 @@
 }
 
 void SocketBase::GetError(intptr_t fd, OSError* os_error) {
-  LOG_ERR("SocketBase::GetError is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
+  os_error->SetCodeAndMessage(OSError::kSystem, errno);
 }
 
 int SocketBase::GetType(intptr_t fd) {
-  LOG_ERR("SocketBase::GetType is unimplemented\n");
-  UNIMPLEMENTED();
-  return File::kOther;
+  errno = ENOSYS;
+  return -1;
 }
 
 intptr_t SocketBase::GetStdioHandle(intptr_t num) {
-  LOG_ERR("SocketBase::GetStdioHandle is unimplemented\n");
-  UNIMPLEMENTED();
   return num;
 }
 
@@ -246,8 +241,7 @@
                                char* host,
                                intptr_t host_len,
                                OSError** os_error) {
-  LOG_ERR("SocketBase::ReverseLookup is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
@@ -335,8 +329,7 @@
 }
 
 bool SocketBase::GetNoDelay(intptr_t fd, bool* enabled) {
-  LOG_ERR("SocketBase::GetNoDelay is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
@@ -351,40 +344,34 @@
 bool SocketBase::GetMulticastLoop(intptr_t fd,
                                   intptr_t protocol,
                                   bool* enabled) {
-  LOG_ERR("SocketBase::GetMulticastLoop is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool SocketBase::SetMulticastLoop(intptr_t fd,
                                   intptr_t protocol,
                                   bool enabled) {
-  LOG_ERR("SocketBase::SetMulticastLoop is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool SocketBase::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) {
-  LOG_ERR("SocketBase::GetMulticastHops is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool SocketBase::SetMulticastHops(intptr_t fd, intptr_t protocol, int value) {
-  LOG_ERR("SocketBase::SetMulticastHops is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool SocketBase::GetBroadcast(intptr_t fd, bool* enabled) {
-  LOG_ERR("SocketBase::GetBroadcast is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool SocketBase::SetBroadcast(intptr_t fd, bool enabled) {
-  LOG_ERR("SocketBase::SetBroadcast is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
@@ -392,8 +379,7 @@
                                const RawAddr& addr,
                                const RawAddr&,
                                int interfaceIndex) {
-  LOG_ERR("SocketBase::JoinMulticast is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
@@ -401,8 +387,7 @@
                                 const RawAddr& addr,
                                 const RawAddr&,
                                 int interfaceIndex) {
-  LOG_ERR("SocketBase::LeaveMulticast is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
diff --git a/runtime/bin/socket_fuchsia.cc b/runtime/bin/socket_fuchsia.cc
index 9655e23..d45119d 100644
--- a/runtime/bin/socket_fuchsia.cc
+++ b/runtime/bin/socket_fuchsia.cc
@@ -104,8 +104,7 @@
 
 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
                                    const RawAddr& source_addr) {
-  LOG_ERR("SocketBase::CreateBindConnect is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return -1;
 }
 
@@ -113,8 +112,7 @@
                                     bool reuseAddress,
                                     bool reusePort,
                                     int ttl) {
-  LOG_ERR("SocketBase::CreateBindDatagram is unimplemented\n");
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return -1;
 }
 
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 6d7e874..979db01 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -116,8 +116,14 @@
 #endif  // SO_REUSEPORT
   }
 
-  VOID_NO_RETRY_EXPECTED(
-      setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)));
+  if (!SocketBase::SetMulticastHops(fd,
+                                    addr.addr.sa_family == AF_INET
+                                        ? SocketAddress::TYPE_IPV4
+                                        : SocketAddress::TYPE_IPV6,
+                                    ttl)) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 7e2f8f0..81ede2e 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -107,8 +107,14 @@
         setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)));
   }
 
-  VOID_NO_RETRY_EXPECTED(
-      setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)));
+  if (!SocketBase::SetMulticastHops(fd,
+                                    addr.addr.sa_family == AF_INET
+                                        ? SocketAddress::TYPE_IPV4
+                                        : SocketAddress::TYPE_IPV6,
+                                    ttl)) {
+    FDUtils::SaveErrorAndClose(fd);
+    return -1;
+  }
 
   if (NO_RETRY_EXPECTED(
           bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 9d11929..6b3e495 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -1071,16 +1071,17 @@
   }
 
   getOption(SocketOption option) {
-    if (option is! SocketOption) throw new ArgumentError(option);
+    if (option == null) throw new ArgumentError.notNull("option");
     var result = nativeGetOption(option._value, address.type._value);
     if (result is OSError) throw result;
     return result;
   }
 
   bool setOption(SocketOption option, value) {
-    if (option is! SocketOption) throw new ArgumentError(option);
+    if (option == null) throw new ArgumentError.notNull("option");
     var result = nativeSetOption(option._value, address.type._value, value);
-    if (result is OSError) throw result;
+    if (result != null) throw result;
+    return true;
   }
 
   InternetAddress multicastAddress(
@@ -1145,7 +1146,7 @@
   int nativeGetSocketId() native "Socket_GetSocketId";
   OSError nativeGetError() native "Socket_GetError";
   nativeGetOption(int option, int protocol) native "Socket_GetOption";
-  bool nativeSetOption(int option, int protocol, value)
+  OSError nativeSetOption(int option, int protocol, value)
       native "Socket_SetOption";
   OSError nativeJoinMulticast(List<int> addr, List<int> interfaceAddr,
       int interfaceIndex) native "Socket_JoinMulticast";
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index c02c1bb..957ac92 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -173,13 +173,19 @@
     // ignore reusePort - not supported on this platform.
     Log::PrintErr(
         "Dart Socket ERROR: %s:%d: `reusePort` not supported for "
-        "Windows." __FILE__,
-        __LINE__);
+        "Windows.",
+        __FILE__, __LINE__);
   }
 
-  status = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL,
-                      reinterpret_cast<const char*>(&ttl), sizeof(ttl));
-  if (status == SOCKET_ERROR) {
+  // Can't use SocketBase::SetMulticastHops here - we'd need to create
+  // the DatagramSocket object and reinterpret_cast it here, just for that
+  // method to reinterpret_cast it again.
+  int ttlValue = ttl;
+  int ttlLevel = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6;
+  int ttlOptname =
+      addr.addr.sa_family == AF_INET ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
+  if (setsockopt(s, ttlLevel, ttlOptname, reinterpret_cast<char*>(&ttlValue),
+                 sizeof(ttlValue)) != 0) {
     DWORD rc = WSAGetLastError();
     closesocket(s);
     SetLastError(rc);
@@ -196,6 +202,7 @@
 
   DatagramSocket* datagram_socket = new DatagramSocket(s);
   datagram_socket->EnsureInitialized(EventHandler::delegate());
+
   return reinterpret_cast<intptr_t>(datagram_socket);
 }
 
diff --git a/runtime/bin/stdio_fuchsia.cc b/runtime/bin/stdio_fuchsia.cc
index 65a2918..a626fee 100644
--- a/runtime/bin/stdio_fuchsia.cc
+++ b/runtime/bin/stdio_fuchsia.cc
@@ -7,47 +7,56 @@
 
 #include "bin/stdio.h"
 
+#include <errno.h>
+
+#include "platform/signal_blocker.h"
+
 namespace dart {
 namespace bin {
 
 bool Stdin::ReadByte(intptr_t fd, int* byte) {
-  UNIMPLEMENTED();
-  return false;
+  unsigned char b;
+  ssize_t s = TEMP_FAILURE_RETRY(read(fd, &b, 1));
+  if (s < 0) {
+    return false;
+  }
+  *byte = (s == 0) ? -1 : b;
+  return true;
 }
 
 bool Stdin::GetEchoMode(intptr_t fd, bool* enabled) {
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool Stdin::SetEchoMode(intptr_t fd, bool enabled) {
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool Stdin::GetLineMode(intptr_t fd, bool* enabled) {
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool Stdin::SetLineMode(intptr_t fd, bool enabled) {
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool Stdin::AnsiSupported(intptr_t fd, bool* supported) {
-  UNIMPLEMENTED();
-  return false;
+  *supported = false;
+  return true;
 }
 
 bool Stdout::GetTerminalSize(intptr_t fd, int size[2]) {
-  UNIMPLEMENTED();
+  errno = ENOSYS;
   return false;
 }
 
 bool Stdout::AnsiSupported(intptr_t fd, bool* supported) {
-  UNIMPLEMENTED();
-  return false;
+  *supported = false;
+  return true;
 }
 
 }  // namespace bin
diff --git a/runtime/bin/thread_android.cc b/runtime/bin/thread_android.cc
index ab0d7a2..4970240 100644
--- a/runtime/bin/thread_android.cc
+++ b/runtime/bin/thread_android.cc
@@ -152,10 +152,6 @@
   return (a == b);
 }
 
-void Thread::InitOnce() {
-  // Nothing to be done.
-}
-
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
diff --git a/runtime/bin/thread_fuchsia.cc b/runtime/bin/thread_fuchsia.cc
index 64e7fce..793e9c1 100644
--- a/runtime/bin/thread_fuchsia.cc
+++ b/runtime/bin/thread_fuchsia.cc
@@ -151,10 +151,6 @@
   return (pthread_equal(a, b) != 0);
 }
 
-void Thread::InitOnce() {
-  // Nothing to be done.
-}
-
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
diff --git a/runtime/bin/thread_linux.cc b/runtime/bin/thread_linux.cc
index b30bbf0..1140ed4 100644
--- a/runtime/bin/thread_linux.cc
+++ b/runtime/bin/thread_linux.cc
@@ -152,10 +152,6 @@
   return (pthread_equal(a, b) != 0);
 }
 
-void Thread::InitOnce() {
-  // Nothing to be done.
-}
-
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
diff --git a/runtime/bin/thread_macos.cc b/runtime/bin/thread_macos.cc
index 249a476..6618ba8 100644
--- a/runtime/bin/thread_macos.cc
+++ b/runtime/bin/thread_macos.cc
@@ -146,10 +146,6 @@
   return (pthread_equal(a, b) != 0);
 }
 
-void Thread::InitOnce() {
-  // Nothing to be done.
-}
-
 Mutex::Mutex() {
   pthread_mutexattr_t attr;
   int result = pthread_mutexattr_init(&attr);
diff --git a/runtime/bin/thread_win.cc b/runtime/bin/thread_win.cc
index ab3e9b9..cba3652 100644
--- a/runtime/bin/thread_win.cc
+++ b/runtime/bin/thread_win.cc
@@ -40,14 +40,9 @@
   uword parameter = data->parameter();
   delete data;
 
-  MonitorData::GetMonitorWaitDataForThread();
-
   // Call the supplied thread start function handing it its parameters.
   function(parameter);
 
-  // Clean up the monitor wait data for this thread.
-  MonitorWaitData::ThreadExit();
-
   return 0;
 }
 
@@ -114,63 +109,34 @@
   }
 }
 
-void Thread::InitOnce() {
-  MonitorWaitData::monitor_wait_data_key_ = Thread::CreateThreadLocal();
-  MonitorData::GetMonitorWaitDataForThread();
-}
-
 Mutex::Mutex() {
-  // Allocate unnamed semaphore with initial count 1 and max count 1.
-  data_.semaphore_ = CreateSemaphore(NULL, 1, 1, NULL);
-  if (data_.semaphore_ == NULL) {
-    FATAL1("Mutex allocation failed %d", GetLastError());
-  }
+  InitializeSRWLock(&data_.lock_);
 }
 
-Mutex::~Mutex() {
-  CloseHandle(data_.semaphore_);
-}
+Mutex::~Mutex() {}
 
 void Mutex::Lock() {
-  DWORD result = WaitForSingleObject(data_.semaphore_, INFINITE);
-  if (result != WAIT_OBJECT_0) {
-    FATAL1("Mutex lock failed %d", GetLastError());
-  }
+  AcquireSRWLockExclusive(&data_.lock_);
 }
 
 bool Mutex::TryLock() {
-  // Attempt to pass the semaphore but return immediately.
-  DWORD result = WaitForSingleObject(data_.semaphore_, 0);
-  if (result == WAIT_OBJECT_0) {
+  if (TryAcquireSRWLockExclusive(&data_.lock_) != 0) {
     return true;
   }
-  if ((result == WAIT_ABANDONED) || (result == WAIT_FAILED)) {
-    FATAL1("Mutex try lock failed %d", GetLastError());
-  }
-  ASSERT(result == WAIT_TIMEOUT);
   return false;
 }
 
 void Mutex::Unlock() {
-  BOOL result = ReleaseSemaphore(data_.semaphore_, 1, NULL);
-  if (result == 0) {
-    FATAL1("Mutex unlock failed %d", GetLastError());
-  }
+  ReleaseSRWLockExclusive(&data_.lock_);
 }
 
-ThreadLocalKey MonitorWaitData::monitor_wait_data_key_ =
-    Thread::kUnsetThreadLocalKey;
-
 Monitor::Monitor() {
   InitializeCriticalSection(&data_.cs_);
-  InitializeCriticalSection(&data_.waiters_cs_);
-  data_.waiters_head_ = NULL;
-  data_.waiters_tail_ = NULL;
+  InitializeConditionVariable(&data_.cond_);
 }
 
 Monitor::~Monitor() {
   DeleteCriticalSection(&data_.cs_);
-  DeleteCriticalSection(&data_.waiters_cs_);
 }
 
 void Monitor::Enter() {
@@ -181,188 +147,19 @@
   LeaveCriticalSection(&data_.cs_);
 }
 
-void MonitorWaitData::ThreadExit() {
-  if (MonitorWaitData::monitor_wait_data_key_ != Thread::kUnsetThreadLocalKey) {
-    uword raw_wait_data =
-        Thread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
-    if (raw_wait_data != 0) {
-      MonitorWaitData* wait_data =
-          reinterpret_cast<MonitorWaitData*>(raw_wait_data);
-      delete wait_data;
-    }
-  }
-}
-
-void MonitorData::AddWaiter(MonitorWaitData* wait_data) {
-  // Add the MonitorWaitData object to the list of objects waiting for
-  // this monitor.
-  EnterCriticalSection(&waiters_cs_);
-  if (waiters_tail_ == NULL) {
-    ASSERT(waiters_head_ == NULL);
-    waiters_head_ = wait_data;
-    waiters_tail_ = wait_data;
-  } else {
-    waiters_tail_->next_ = wait_data;
-    waiters_tail_ = wait_data;
-  }
-  LeaveCriticalSection(&waiters_cs_);
-}
-
-void MonitorData::RemoveWaiter(MonitorWaitData* wait_data) {
-  // Remove the MonitorWaitData object from the list of objects
-  // waiting for this monitor.
-  EnterCriticalSection(&waiters_cs_);
-  MonitorWaitData* previous = NULL;
-  MonitorWaitData* current = waiters_head_;
-  while (current != NULL) {
-    if (current == wait_data) {
-      if (waiters_head_ == waiters_tail_) {
-        waiters_head_ = NULL;
-        waiters_tail_ = NULL;
-      } else if (current == waiters_head_) {
-        waiters_head_ = waiters_head_->next_;
-      } else if (current == waiters_tail_) {
-        ASSERT(previous != NULL);
-        waiters_tail_ = previous;
-        previous->next_ = NULL;
-      } else {
-        ASSERT(previous != NULL);
-        previous->next_ = current->next_;
-      }
-      // Clear next.
-      wait_data->next_ = NULL;
-      break;
-    }
-    previous = current;
-    current = current->next_;
-  }
-  LeaveCriticalSection(&waiters_cs_);
-}
-
-void MonitorData::SignalAndRemoveFirstWaiter() {
-  EnterCriticalSection(&waiters_cs_);
-  MonitorWaitData* first = waiters_head_;
-  if (first != NULL) {
-    // Remove from list.
-    if (waiters_head_ == waiters_tail_) {
-      waiters_tail_ = NULL;
-      waiters_head_ = NULL;
-    } else {
-      waiters_head_ = waiters_head_->next_;
-    }
-    // Clear next.
-    first->next_ = NULL;
-    // Signal event.
-    BOOL result = SetEvent(first->event_);
-    if (result == 0) {
-      FATAL1("Monitor::Notify failed to signal event %d", GetLastError());
-    }
-  }
-  LeaveCriticalSection(&waiters_cs_);
-}
-
-void MonitorData::SignalAndRemoveAllWaiters() {
-  EnterCriticalSection(&waiters_cs_);
-  // Extract list to signal.
-  MonitorWaitData* current = waiters_head_;
-  // Clear list.
-  waiters_head_ = NULL;
-  waiters_tail_ = NULL;
-  // Iterate and signal all events.
-  while (current != NULL) {
-    // Copy next.
-    MonitorWaitData* next = current->next_;
-    // Clear next.
-    current->next_ = NULL;
-    // Signal event.
-    BOOL result = SetEvent(current->event_);
-    if (result == 0) {
-      FATAL1("Failed to set event for NotifyAll %d", GetLastError());
-    }
-    current = next;
-  }
-  LeaveCriticalSection(&waiters_cs_);
-}
-
-MonitorWaitData* MonitorData::GetMonitorWaitDataForThread() {
-  // Ensure that the thread local key for monitor wait data objects is
-  // initialized.
-  ASSERT(MonitorWaitData::monitor_wait_data_key_ !=
-         Thread::kUnsetThreadLocalKey);
-
-  // Get the MonitorWaitData object containing the event for this
-  // thread from thread local storage. Create it if it does not exist.
-  uword raw_wait_data =
-      Thread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
-  MonitorWaitData* wait_data = NULL;
-  if (raw_wait_data == 0) {
-    HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
-    wait_data = new MonitorWaitData(event);
-    Thread::SetThreadLocal(MonitorWaitData::monitor_wait_data_key_,
-                           reinterpret_cast<uword>(wait_data));
-  } else {
-    wait_data = reinterpret_cast<MonitorWaitData*>(raw_wait_data);
-    ASSERT(wait_data->next_ == NULL);
-  }
-  return wait_data;
-}
-
 Monitor::WaitResult Monitor::Wait(int64_t millis) {
   Monitor::WaitResult retval = kNotified;
-
-  // Get the wait data object containing the event to wait for.
-  MonitorWaitData* wait_data = MonitorData::GetMonitorWaitDataForThread();
-
-  // Start waiting by adding the MonitorWaitData to the list of
-  // waiters.
-  data_.AddWaiter(wait_data);
-
-  // Leave the monitor critical section while waiting.
-  LeaveCriticalSection(&data_.cs_);
-
-  // Perform the actual wait on the event.
-  DWORD result = WAIT_FAILED;
-  if (millis == 0) {
-    // Wait forever for a Notify or a NotifyAll event.
-    result = WaitForSingleObject(wait_data->event_, INFINITE);
-    if (result == WAIT_FAILED) {
-      FATAL1("Monitor::Wait failed %d", GetLastError());
-    }
+  if (millis == kNoTimeout) {
+    SleepConditionVariableCS(&data_.cond_, &data_.cs_, INFINITE);
   } else {
     // Wait for the given period of time for a Notify or a NotifyAll
     // event.
-    result = WaitForSingleObject(wait_data->event_, millis);
-    if (result == WAIT_FAILED) {
-      FATAL1("Monitor::Wait with timeout failed %d", GetLastError());
-    }
-    if (result == WAIT_TIMEOUT) {
-      // No longer waiting. Remove from the list of waiters.
-      data_.RemoveWaiter(wait_data);
-      // Caveat: wait_data->event_ might have been signaled between
-      // WaitForSingleObject and RemoveWaiter because we are not in any critical
-      // section here. Leaving it in a signaled state would break invariants
-      // that Monitor::Wait code relies on. We assume that when
-      // WaitForSingleObject(wait_data->event_, ...) returns successfully then
-      // corresponding wait_data is not on the waiters list anymore.
-      // This is guaranteed because we only signal these events from
-      // SignalAndRemoveAllWaiters/SignalAndRemoveFirstWaiter which
-      // simultaneously remove MonitorWaitData from the list.
-      // Now imagine that wait_data->event_ is left signaled here. In this case
-      // the next WaitForSingleObject(wait_data->event_, ...) will immediately
-      // return while wait_data is still on the waiters list. This would
-      // leave waiters list in the inconsistent state.
-      // To prevent this from happening simply reset the event.
-      // Note: wait_data is no longer on the waiters list so it can't be
-      // signaled anymore at this point so there is no race possible from
-      // this point onward.
-      ResetEvent(wait_data->event_);
+    if (!SleepConditionVariableCS(&data_.cond_, &data_.cs_, millis)) {
+      ASSERT(GetLastError() == ERROR_TIMEOUT);
       retval = kTimedOut;
     }
   }
 
-  // Reacquire the monitor critical section before continuing.
-  EnterCriticalSection(&data_.cs_);
-
   return retval;
 }
 
@@ -379,16 +176,11 @@
 }
 
 void Monitor::Notify() {
-  data_.SignalAndRemoveFirstWaiter();
+  WakeConditionVariable(&data_.cond_);
 }
 
 void Monitor::NotifyAll() {
-  // If one of the objects in the list of waiters wakes because of a
-  // timeout before we signal it, that object will get an extra
-  // signal. This will be treated as a spurious wake-up and is OK
-  // since all uses of monitors should recheck the condition after a
-  // Wait.
-  data_.SignalAndRemoveAllWaiters();
+  WakeAllConditionVariable(&data_.cond_);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/thread_win.h b/runtime/bin/thread_win.h
index cd14e44..611b06b 100644
--- a/runtime/bin/thread_win.h
+++ b/runtime/bin/thread_win.h
@@ -41,7 +41,7 @@
   MutexData() {}
   ~MutexData() {}
 
-  HANDLE semaphore_;
+  SRWLOCK lock_;
 
   friend class Mutex;
 
@@ -49,64 +49,15 @@
   DISALLOW_COPY_AND_ASSIGN(MutexData);
 };
 
-class MonitorWaitData {
- public:
-  static void ThreadExit();
-
- private:
-  explicit MonitorWaitData(HANDLE event) : event_(event), next_(NULL) {}
-  ~MonitorWaitData() {
-    CloseHandle(event_);
-    ASSERT(next_ == NULL);
-  }
-
-  // ThreadLocalKey used to fetch and store the MonitorWaitData object
-  // for a given thread.
-  static ThreadLocalKey monitor_wait_data_key_;
-
-  // Auto-reset event used for waiting.
-  HANDLE event_;
-  // Link to next element in the singly-linked list of waiters.
-  MonitorWaitData* next_;
-
-  friend class Monitor;
-  friend class MonitorData;
-  friend class Thread;
-
-  DISALLOW_COPY_AND_ASSIGN(MonitorWaitData);
-};
-
 class MonitorData {
  private:
   MonitorData() {}
   ~MonitorData() {}
 
-  // Helper methods to manipulate the list of waiters for this
-  // monitor.
-  void AddWaiter(MonitorWaitData* wait_data);
-  void RemoveWaiter(MonitorWaitData* wait_data);
-  void SignalAndRemoveFirstWaiter();
-  void SignalAndRemoveAllWaiters();
-  static MonitorWaitData* GetMonitorWaitDataForThread();
-
-  // The external critical section for the monitor.
   CRITICAL_SECTION cs_;
-
-  // Condition variables are only available since Windows Vista. To
-  // support at least Windows XP, we implement our own condition
-  // variables using SetEvent on Event objects.
-
-  // Singly-linked list of event objects, one for each thread waiting
-  // on this monitor. New waiters are added at the end of the list.
-  // Notify signals the first element of the list (FIFO
-  // order). NotifyAll, signals all the elements of the list.
-  CRITICAL_SECTION waiters_cs_;
-  MonitorWaitData* waiters_head_;
-  MonitorWaitData* waiters_tail_;
+  CONDITION_VARIABLE cond_;
 
   friend class Monitor;
-  friend class Thread;
-  friend unsigned int __stdcall ThreadEntry(void* data_ptr);
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(MonitorData);
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index a4b8956..f4733ae 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -238,6 +238,8 @@
   Future _requestHandler(HttpRequest request) async {
     if (!_originCheck(request)) {
       // This is a cross origin attempt to connect
+      request.response.statusCode = HttpStatus.forbidden;
+      request.response.write("forbidden origin");
       request.response.close();
       return;
     }
@@ -293,6 +295,8 @@
     }
     if (request.method != 'GET') {
       // Not a GET request. Do nothing.
+      request.response.statusCode = HttpStatus.methodNotAllowed;
+      request.response.write("method not allowed");
       request.response.close();
       return;
     }
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 1ed1327..04a3e89 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -86,6 +86,18 @@
   return NULL;
 }
 
+const uint8_t* VmServiceIONativeSymbol(Dart_NativeFunction nf) {
+  intptr_t n =
+      sizeof(_VmServiceIONativeEntries) / sizeof(_VmServiceIONativeEntries[0]);
+  for (intptr_t i = 0; i < n; i++) {
+    VmServiceIONativeEntry entry = _VmServiceIONativeEntries[i];
+    if (reinterpret_cast<Dart_NativeFunction>(entry.function) == nf) {
+      return reinterpret_cast<const uint8_t*>(entry.name);
+    }
+  }
+  return NULL;
+}
+
 const char* VmService::error_msg_ = NULL;
 char VmService::server_uri_[kServerUriStringBufferSize];
 
@@ -93,7 +105,8 @@
   Dart_Handle url = DartUtils::NewString(kVMServiceIOLibraryUri);
   Dart_Handle library = Dart_LookupLibrary(url);
   if (!Dart_IsError(library)) {
-    Dart_SetNativeResolver(library, VmServiceIONativeResolver, NULL);
+    Dart_SetNativeResolver(library, VmServiceIONativeResolver,
+                           VmServiceIONativeSymbol);
   }
 }
 
@@ -120,7 +133,8 @@
   SHUTDOWN_ON_ERROR(library);
   result = Dart_SetRootLibrary(library);
   SHUTDOWN_ON_ERROR(library);
-  result = Dart_SetNativeResolver(library, VmServiceIONativeResolver, NULL);
+  result = Dart_SetNativeResolver(library, VmServiceIONativeResolver,
+                                  VmServiceIONativeSymbol);
   SHUTDOWN_ON_ERROR(result);
 
   // Make runnable.
diff --git a/runtime/configs.gni b/runtime/configs.gni
index b678f17..a476622 100644
--- a/runtime/configs.gni
+++ b/runtime/configs.gni
@@ -36,16 +36,6 @@
       "$_dart_runtime:dart_product_config",
     ]
 
-_precompiler_config = _base_config + [
-                        "$_dart_runtime:dart_maybe_product_config",
-                        "$_dart_runtime:dart_precompiler_config",
-                      ]
-
-_precompiler_product_config = _base_config + [
-                                "$_dart_runtime:dart_product_config",
-                                "$_dart_runtime:dart_precompiler_config",
-                              ]
-
 _nosnapshot_precompiler_base = [
   "$_dart_runtime:dart_nosnapshot_config",
   "$_dart_runtime:dart_precompiler_config",
@@ -85,16 +75,6 @@
     snapshot = true
   },
   {
-    suffix = "_with_precompiler"
-    configs = _precompiler_config
-    snapshot = true
-  },
-  {
-    suffix = "_with_precompiler_product"
-    configs = _precompiler_product_config
-    snapshot = true
-  },
-  {
     suffix = "_nosnapshot_with_precompiler"
     configs = _nosnapshot_with_precompiler_config
     snapshot = false
diff --git a/runtime/docs/compiler/aot/entry_point_pragma.md b/runtime/docs/compiler/aot/entry_point_pragma.md
new file mode 100644
index 0000000..69cf760
--- /dev/null
+++ b/runtime/docs/compiler/aot/entry_point_pragma.md
@@ -0,0 +1,85 @@
+# `vm:entry-point` pragma
+
+The annotation `@pragma("vm:entry-point", ...)` **must** be placed on a class or
+member to indicate that it may be resolved, allocated or invoked directly from
+native or VM code _in AOT mode_.
+
+## Background
+
+Dart VM precompiler (AOT compiler) performs whole-program optimizations such as
+tree shaking and type flow analysis (TFA) in order to decrease size of the
+resulting compiled apps and improve their performance. Such optimizations
+assume that compiler can see the whole Dart program, and is able to discover
+and analyse all Dart functions and members which can be potentially executed at
+run time. While the Dart code is fully available for precompiler, native code
+of the embedder and native methods are out of reach of the compiler. Such
+native code can call back to Dart via native Dart API.
+
+In order to guide precompiler, programmer **must** explicitly list entry points
+(roots) - Dart classes and members which are accessed from native code. Note
+that listing entry points is not optional: as long as program defines native
+methods which call into Dart, the entry points are required for the correctness
+of compilation.
+
+In addition, when obfuscation is enabled, the precompiler needs to know which
+symbols need to be preserved to ensure they can be resolved from native code.
+
+## Syntax
+
+The allowed uses of the annotation are as follows.
+
+### Classes
+
+Any one of the following forms may be attached to a class:
+
+```dart
+@pragma("vm:entry-point")
+@pragma("vm:entry-point", true/false)
+@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
+class C { ... }
+```
+
+If the second parameter is missing, `null` or `true`, the class will be
+available for allocation directly from native or VM code.
+
+Note that `@pragma("vm:entry-point")` may be added to abstract classes -- in
+this case, their name will survive obfuscation, but they won't have any
+allocation stubs.
+
+### Procedures
+
+Any one of the following forms may be attached to a procedure (including
+getters, setters and constructors):
+
+```dart
+@pragma("vm:entry-point")
+@pragma("vm:entry-point", true/false)
+@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
+void foo() { ... }
+```
+
+If the second parameter is missing, `null` or `true`, the procedure will
+available for lookup and invocation directly from native or VM code. If the
+procedure is a *generative* constructor, the enclosing class will also be marked
+for allocation from native or VM code.
+
+### Fields
+
+Any one of the following forms may be attached to a non-static field. The first
+three forms may be attached to static fields.
+
+```dart
+@pragma("vm:entry-point")
+@pragma("vm:entry-point", null)
+@pragma("vm:entry-point", true/false)
+@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
+@pragma("vm:entry-point", "get"/"set")
+int foo;
+```
+
+If the second parameter is missing, `null` or `true, the field is marked for
+native access and for non-static fields the corresponding getter and setter in
+the interface of the enclosing class are marked for native invocation. If the
+'get'/'set' parameter is used, only the getter/setter is marked. For static
+fields, the implicit getter is always marked. The third form does not make sense
+for static fields because they do not belong to an interface.
diff --git a/runtime/docs/compiler/data_dep_for_control_dep.md b/runtime/docs/compiler/data_dep_for_control_dep.md
new file mode 100644
index 0000000..8d228f6
--- /dev/null
+++ b/runtime/docs/compiler/data_dep_for_control_dep.md
@@ -0,0 +1,95 @@
+## Dart Mini Design Doc
+
+### Using Data Dependence to Preserve Control Dependence
+
+## Introduction
+
+The [DartFuzzer](http://go/dartfuzz) found [bug 34684](https://github.com/dart-lang/sdk/issues/34684) with the current LICM implementation. We need a fix urgently, since this bug may break user code, emerges for pretty much every nightly fuzz test run (making investigating new fuzz test divergences cumbersome; most of the time, it is a "same as"), and blocks moving towards more shards per nightly fuzz test run (the Q4 objective is 100 shards with 8 isolates each). Fixing the LICM bug, however, requires a bit more redesign in the way _control dependence_ is preserved in our IR.
+
+## The Problem
+
+The bug itself consists of an issue with applying LICM to an array bound check with loop invariant values. In its simplest form, LICM should not be applied to the bounds check that belongs to `l[j]` below since the loop condition (for a situation `k <= 0`) could logically protect OOB exceptions for particular values of `n` (for example, calling `foo(2,0)` should not throw).
+
+```
+void foo(int n, int k) {
+  var l = new List<int>(1);
+  var j = n - 1;
+  for (var i = 0; i < k; i++) {
+     l[j] = 10;
+  }
+}
+```
+Hosting the seemingly loop invariant bounds check out of the loop would break the control dependence between the loop condition and potentially move an OOB exception into the always-taken path.
+
+An obvious fix would simply disable hoisting `CheckBound` constructs of out loops, thereby respecting the control dependence between condition and check. However, this exposes another omission in our IR with respect to control dependence. Leaving `CheckBound` in place would not prevent hoisting the IndexLoad that follows, as illustrated below.
+
+```
+              ←-----------------+
+for loop                         |
+    Checkbound (length, index)   |      <- pinned in the loop
+    IndexLoad (base, index)   ---+
+```
+In this case, this problem is caused by the fact that the control dependence from `CheckBound` to `IndexLoad` is not made explicit. Trending on the same path would require us to disable hoisting such instructions as well….
+
+At first glance, it may seem that a `Redefinition` could help here, as in:
+
+```
+for loop
+  v0 = get array
+  v1 = get length of v0
+  v2 = get index
+  CheckBound:id(v1, v2)
+  v3 <- Redefinition(v2)
+  IndexLoad(v0, v3)
+```
+This would indeed keep the index load instruction inside the loop, thereby relying on not-too-well-documented assumptions on unmovable redefinitions and the now explicit data dependence on `v3`. However, this approach would be too prohibitive, since cases that would allow for hoisting or eliminating `CheckBound` from the IR would not break the newly introduced chain on v3 (nothing in the IR expresses the relation between the `Redefinition` and the `CheckBound`).
+
+Alternatively, we could introduce control dependence as an explicit, but orthogonal order in our compiler. However, this would require introducing a new data structure to our IR as well as inspecting all code to ensure that this new order is indeed respected. The next section introduces a simpler solution.
+
+## Proposed Solution
+
+The proposed solution is making the control dependence between any check and all its uses explicit with a data dependence, as shown below.
+
+```
+  v3 <- CheckBound:id(v1, v2)   // returns the index value v2 in v3
+  IndexLoad(v0, v3)
+```
+
+The semantics of the new node is that the returned value (`v3`) is a safe index (viz. checked values `v2`) into any load that uses that value. Any optimization that hoists or removes the `CheckBound` automatically exposes the opportunity for further optimization of the load by hoisting or breaking the dependence on `v3`. Common subexpression elimination can also be applied to equal-valued `CheckBound` nodes.
+
+For completeness, the same approach will be taken for null checks.
+
+The construct
+
+```
+ CheckNull:id(v2)
+ v100 <- LoadField(v2, …)
+```
+will be replaced by
+
+```
+ v3 = CheckNull:id(v2)  // returns the reference value v2 in v3
+ v100 <- LoadField(v3, …)
+```
+Here, the value `v3` denotes a safe, null-checked reference of `v2`.
+
+The explicit data dependence ensures that all passes and transformations automatically preserve the required order, without the need to make adjustments anywhere else. In contrast, introducing an explicit control dependence as a new concept in our compiler would require a careful inspection of all code to make sure the new dependence is respected. A drawback of the new "indirection" through the check is that it may break some optimizations and simplifications that inspect the inputs directly. Although cumbersome, since it also involves looking at a lot of code, this is easily remedied by "looking under the hood" of checks (as is done for redefinitions). Missed opportunities for optimizations are preferable over missed correctness.
+
+The proposed solution will have _no impact_ on the register allocator or any of our backends, since the new data dependence will be removed in the `FinalizeGraph` pass, similar to what is already done now for redefinitions in `RemoveRedefinitions()`, except that this method will only redirect the inputs across checks, but obviously not remove the checks themselves. Nothing that runs after the register allocator should move code around too freely, an assumption that is already made in our current implementation with respect to redefinitions.
+
+This approach was used successfully in [the ART optimization compiler](https://cs.corp.google.com/android/art/compiler/optimizing/nodes.h). Here, check-based control dependence was made explicit with data dependence. All passes and transformations were aware that data dependence should always be satisfied (inter- and intra-basic block), whereas all optimizations that crossed basic blocks were aware of _implicit_ control dependence (e.g. using dominance relation). In combination with the actual LICM fix, the proposed solution will result in a previously proven robust framework for null and bounds checks.
+
+## IR Nodes
+
+Our IR currently has the following "check" instructions. Although potentially others could benefit form this new scheme too, the first CL will focus on the ones marked below only. As the implementation progresses, we may introduce some "object-orientedness" for check instructions that return their safe value.
+
+```
+CheckEitherNonSmiInstr
+CheckClassInstr
+CheckSmiInstr
+CheckNullInstr                 // returns safe non-null reference
+CheckClassIdInstr
+CheckArrayBoundInstr           // returns safe non-OOBE index
+GenericCheckBoundInstr         // returns safe non-OOBE index
+CheckConditionInstr
+
diff --git a/runtime/docs/compiler/frontend/testing_trace_entrypoints_pragma.md b/runtime/docs/compiler/frontend/testing_trace_entrypoints_pragma.md
new file mode 100644
index 0000000..fe4e8b0
--- /dev/null
+++ b/runtime/docs/compiler/frontend/testing_trace_entrypoints_pragma.md
@@ -0,0 +1,31 @@
+# `vm:testing.unsafe.trace-entrypoints-fn` pragma
+
+This pragma is used for testing purposes in the test suite.
+
+Example:
+
+```dart
+void hook(String functionName, int entryPointId) {
+  // ...
+}
+
+class C<T> {
+  @pragma('vm:testing.unsafe.trace-entrypoints-fn', hook)
+  void foo(T x) {
+    // ...
+  }
+}
+```
+
+When `foo` is invoked, `hook` will be called in `foo`'s prologue if `foo` was
+compiled with multiple entry points. `hook` will be passed the name of the
+function it was called for and the ID of the entry point used for the
+invocation:
+
+- 0: Normal entry.
+
+- 1: Unchecked entry: prologue was short so separate prologues for normal and
+  unchecked entry were compiled.
+
+- 2: Unchecked shared entry: prologue was long, so normal and unchecked entry
+  set a temporary and type-checks are predicated on the temporary.
diff --git a/runtime/docs/compiler/pragmas_recognized_by_compiler.md b/runtime/docs/compiler/pragmas_recognized_by_compiler.md
new file mode 100644
index 0000000..21b2d13
--- /dev/null
+++ b/runtime/docs/compiler/pragmas_recognized_by_compiler.md
@@ -0,0 +1,83 @@
+# @pragma annotations recognized by the compiler.
+
+## Annotations for return types and field types.
+
+The VM is not able to see across method calls (apart from inlining) and
+therefore does not know anything about the return'ed values of calls, except for
+the interface type of the signature.
+
+To improve this we have two types of additional information sources the VM
+utilizes to gain knowledge about return types:
+
+   - inferred types (stored in kernel metadata): these are computed by global
+     transformations (e.g. TFA) and are only available in AOT mode
+
+   - @pragma annotations: these are recognized in JIT and AOT mode
+
+This return type information is mainly used in the VM's type propagator.
+
+Since those annotations side-step the normal type system, they are unsafe and we
+therefore restrict those annotations to only have an affect inside dart:
+libraries.
+
+### @pragma("vm:exact-result-type", <type>) annotation
+
+Tells the VM about the exact result type (i.e. the exact class-id) of a function
+or a field load.
+
+There are two limitations on this pragma:
+
+0. The Dart object returned by the method at runtime must have **exactly** the type specified in the annotation (not a subtype).
+
+1. The exact return type declared in the pragma must be a subtype of the interface type declared in the method signature.
+   Note that this restriction is not enforced automatically by the compiler.
+
+If those limitations are violated, undefined behavior may result.
+Note that since `null` is an instance of the `Null` type, which is a subtype of any other, exactness of the annotated result type implies that the result must be non-null.
+
+#### Syntax
+
+```dart
+class A {}
+class B extends A {}
+
+// Reference to type via type literal
+@pragma("vm:exact-result-type", B)
+A foo() native "foo_impl";
+
+// Reference to type via path
+@pragma("vm:exact-result-type", "dart:core#_Smi");
+int foo() native "foo_impl";
+
+class C {
+  // Reference to type via type literal
+  @pragma('vm:exact-result-type', B)
+  final B bValue;
+
+  // Reference to type via path
+  @pragma('vm:exact-result-type', "dart:core#_Smi")
+  final int intValue;
+}
+```
+
+### @pragma("vm:non-nullable-result-type") annotation
+
+Tells the VM that the method/field cannot return `null`.
+
+There is one limitation on this pragma:
+
+0. The Dart object returned by the method at runtime **must not** return `null`.
+
+If this limitation is violated, undefined behavior may result.
+
+#### Syntax
+
+```dart
+@pragma("vm:non-nullable-result-type")
+A foo() native "foo_impl";
+
+class C {
+  @pragma('vm:non-nullable-result-type");
+  final int value;
+}
+```
diff --git a/runtime/docs/infra/coredumps.md b/runtime/docs/infra/coredumps.md
new file mode 100644
index 0000000..e24a3b6
--- /dev/null
+++ b/runtime/docs/infra/coredumps.md
@@ -0,0 +1,208 @@
+# Crash Dumps Archiving
+
+Testing framework and buildbot/LUCI infrastructure have support for archiving
+crash dumps and crashed binaries for unexpected crashes for postmortem
+debugging.
+
+This feature is enabled by passing `--copy-coredumps` to `tools/test.py` and
+is supported on all three major OSes we run our tests on.
+
+Currently crash dump archiving should be enabled on the majority of the VM
+bots, including those running in CQ.
+
+### Known limitations
+
+* We don't archive crash dumps produced by subprocesses (e.g. service tests);
+* We don't produce and archive crash dumps for hanged processes.
+
+### Maintainers
+
+For any questions about this infrastructure contact vegorov@, kustermann@ or
+athom@.
+
+## Downloading dumps
+
+To find if a bot managed to upload any crashdumps open its log and search for
+`Archiving coredumps for crash`. Depending on the bot configuration you
+might need to look for uploaded artifacts in two different locations.
+
+### Isolate Server
+
+Swarming bots upload dumps to the isolate server. In this case you will see
+something like this in the log:
+
+```
+INFO: Core dump archiving is activated
+Archiving coredumps for crash (if possible):
+----> Crash(language_2/call_method_implicit_tear_off_test/02: binary.release_x64_dart.exe 1556)
++++ Copying 6e3e4b40-206e-4ae6-99e8-c2c94cc21a98.dmp.tar.gz to output_directory (C:\b\s\w\ioz_p_ei)
++++ Copying release_x64_dart.exe.tar.gz to output_directory (C:\b\s\w\ioz_p_ei)
+```
+
+If you see `+++ Copying ... to output_directory` this means that the bot
+is using isolate storage. In this case you need to look for
+`shard #... isolated out` link under the failed step.
+
+![shard isolate out](images/isolated-out-link.png)
+
+This link would bring you to isolate server file browser where you will be
+able to download archived artifacts.
+
+![Isolate Server Browser](images/isolated-out-browser.png)
+
+### Cloud Storage
+
+Other bots upload collected artifacts into a `dart-temp-crash-archive` Cloud Storage bucket. In this case you will see
+`+++ Uploaded gs://dart-temp-crash-archive/...` in the output log. For example:
+
+```
+Archiving coredumps for crash (if possible):
+----> Crash(language_2/mixin_interface_check_test/mixin: binary.release_ia32_dart.exe 10620)
+
+--- Uploading into gs://dart-temp-crash-archive/0da77e10-d349-4c45-a146-0ce052972b03/ (https://storage.cloud.google.com/dart-temp-crash-archive/0da77e10-d349-4c45-a146-0ce052972b03/) ---
+Running command:  ['C:\\b\\s\\w\\ir\\cache\\vpython\\2d366b\\Scripts\\python.exe', 'C:\\b\\s\\w\\ir\\cache\\builder\\sdk\\third_party\\gsutil\\gsutil', 'cp', 'release_ia32_dart.exe.tar.gz', 'gs://dart-temp-crash-archive/0da77e10-d349-4c45-a146-0ce052972b03/release_ia32_dart.exe.tar.gz']
++++ Uploaded gs://dart-temp-crash-archive/0da77e10-d349-4c45-a146-0ce052972b03/release_ia32_dart.exe.tar.gz (https://storage.cloud.google.com/dart-temp-crash-archive/0da77e10-d349-4c45-a146-0ce052972b03/release_ia32_dart.exe.tar.gz)
+Running command:  ['C:\\b\\s\\w\\ir\\cache\\vpython\\2d366b\\Scripts\\python.exe', 'C:\\b\\s\\w\\ir\\cache\\builder\\sdk\\third_party\\gsutil\\gsutil', 'cp', 'a92618b1-0f99-4c87-a9fb-adb3e44ad458.dmp.tar.gz', 'gs://dart-temp-crash-archive/0da77e10-d349-4c45-a146-0ce052972b03/a92618b1-0f99-4c87-a9fb-adb3e44ad458.dmp.tar.gz']
++++ Uploaded gs://dart-temp-crash-archive/0da77e10-d349-4c45-a146-0ce052972b03/a92618b1-0f99-4c87-a9fb-adb3e44ad458.dmp.tar.gz (https://storage.cloud.google.com/dart-temp-crash-archive/0da77e10-d349-4c45-a146-0ce052972b03/a92618b1-0f99-4c87-a9fb-adb3e44ad458.dmp.tar.gz)
+--- Done ---
+```
+
+In this case you can use `gsutil.py` from `depot_tools` (or `gsutil` from Cloud
+SDK) to download these artifacts:
+
+```console
+$ gsutil.py cp gs://dart-temp-crash-archive/<src-path> <dst-path>
+```
+
+## Analyzing Dumps
+
+### Linux
+
+```console
+$ gdb <binary> <core>
+```
+
+Because bots are running slightly different Linux versions that what is
+available on development machines `gdb` might not be able to properly
+resolve symbols and unwind the stack by itself.
+
+In this case you can:
+
+* spin up a Cloud Instance with a matching OS version and debug the dump
+on that instance;
+* create a sysroot that matches operating system on the bots and tell gdb to
+use that sysroot with `set sysroot` command.
+
+#### ARM/ARM64
+
+If you have a core produced on ARM or ARM64 bot and you would like to inspect
+it on a non-ARM development machine, then you will need `gdb-multiarch` and
+sysroot that matches OS version on the bot. Then you can use `set sysroot ...`
+and `set architecture ...` to configure `gdb-multiarch` before loading `core`.
+
+### Mac
+
+```console
+$ lldb <binary> -c <core>
+```
+
+### Windows
+
+Googlers can find WinDBG and CDB in `%depot_tools%\win_toolchain\vs_files\%toolchain_version%\win_sdk\Debuggers\x64\`.
+
+For quick investigation you can do
+
+```console
+> cdb.exe -z <coredump.dmp>
+...
+0:000> !uniqstack
+...
+```
+
+## Implementation details
+
+Implementation of crash dump archiving consists of two parts:
+
+* Code in the testing framework (`UnexpectedCrashLogger` in
+`tools/testing/dart/test_progress.dart`) that detects unexpected crashes, that
+is situations when test _unexpectedly_ completes with a `Crash` status. In this
+case it logs a line about this crash into `unexpected-crashes` file in the
+root of the SDK checkout. This line has format `test,pid,binary` and identifies
+which test crashed, what was the process id and which binary crashed.
+* Code in the Python wrapper around testing framework (see `CoreDumpArchiver`
+in `tools/utils.py`) is responsible for
+    * Before tests: configuring OS and/or environment to setup crashdump
+      archiving in the OS specific way (see classes with names ending at
+      `CoreDumpEnabler`);
+    * After tests: trying to locate crashdumps written by OS or crash reporting
+      library and match those to unexpected crashes reporting by testing
+      framework (see classes with names ending at `CoreDumpArchiver`);
+    * Selecting a subset of crashdumps and uploading those into a persistent
+      storage (isolate server or Cloud Storage bucket).
+
+### Linux
+
+We rely on builtin ability of the OS to generate core files (`man core`) when
+the program is terminated abnormally.
+
+We adjust core resource limits to `unlimited` before running tests. See `man setrlimit` for more information (search for `RLIMIT_CORE`).
+
+We verify that `/proc/sys/kernel/core_pattern` is set to `core.%p` which
+means that crash dumps would be produced in the current working directory (root of the SDK checkout for most tests) and mangled with the pid of the crashed
+process.
+
+Core dump archiving code then uses pids to match unexpected crashes with core
+dumps.
+
+See `LinuxCoreDumpArchiver` and `LinuxCoreDumpEnabler` in `tools/utils.py`.
+
+### Mac
+
+Just like on Linux we rely on OS to produce core files (`man core`) and
+similarly set core resource limits to `unlimited`.
+
+Core files are also mangled with PID of the crashing process.
+
+The only difference from Linux is that on Mac core files are written into
+`/cores` directory instead of current working directory.
+
+See `MacOSCoreDumpArchiver` and `PosixCoreDumpEnabler` in `tools/utils.py`.
+
+### Windows
+
+On Windows we rely on [Crashpad](https://chromium.googlesource.com/crashpad/crashpad/+/master/README.md)
+library to produce minidumps of the crashed process, because configuring
+builtin crash reporting functionality requires registry changes that are global,
+impossible without Administrator privileges and are overwritten by buildbot
+fleet management software running in background.
+
+Crashpad integration for `dart.exe` and `run_vm_tests.exe` binaries is
+controlled by `dart_use_crashpad` GN argument.
+
+This argument is set to `true` when `tools/gn.py` is run with `--use-crashpad`
+flag or with `DART_USE_CRASHPAD` environment variable set.
+
+If the binary is built with Crashpad integration it checks two environment
+variables on startup:
+
+* `DART_CRASHPAD_HANDLER` should contain path to `crashpad_handler.exe`
+Crashpad binary that implements out-of-process crash monitoring;
+* `DART_CRASHPAD_CRASHES_DIR` should contain path to a folder, which would be
+used as Crashpad crash database.
+
+If both variables are set then Crashpad handler will be started. If the handler
+catches main binary crashing it would write [minidump](https://docs.microsoft.com/en-us/windows/desktop/debug/minidump-files)
+into `%DART_CRASHPAD_CRASHES_DIR%\crashes` from where it would be picked up
+by crash archiving machinery.
+
+We match crash dumps to unexpected crashes by parsing them and extracting
+process id of the crashed process (see `utils/minidump.py` library).
+
+See `WindowsCoreDumpEnabler` and `WindowsCoreDumpArchiver` in `tools/utils.py`.
+
+**Note: `DART_CRASHPAD_CRASHES_DIR` is set by `WindowsCoreDumpEnabler` in
+`tools/utils.py`, while `DART_CRASHPAD_HANDLER` is set by `TestSuite` in
+`tools/testing/dart/test_suite.dart`.**
+
+**Note: Crashpad is optimized for end-user crash reporting use case and does not write full crash dumps.**
+
diff --git a/runtime/docs/infra/images/isolated-out-browser.png b/runtime/docs/infra/images/isolated-out-browser.png
new file mode 100644
index 0000000..cdf37ab
--- /dev/null
+++ b/runtime/docs/infra/images/isolated-out-browser.png
Binary files differ
diff --git a/runtime/docs/infra/images/isolated-out-link.png b/runtime/docs/infra/images/isolated-out-link.png
new file mode 100644
index 0000000..a996098
--- /dev/null
+++ b/runtime/docs/infra/images/isolated-out-link.png
Binary files differ
diff --git a/runtime/docs/pragmas.md b/runtime/docs/pragmas.md
index c739826..a896592 100644
--- a/runtime/docs/pragmas.md
+++ b/runtime/docs/pragmas.md
@@ -4,19 +4,17 @@
 
 These pragmas are part of the VM's API and are safe for use in external code.
 
-- **vm:entry-point**
-
-  [Defining entry-points into Dart code for an embedder or native methods]
-  (file://../vm/compiler/aot/entry_points_pragma.md)
+| Pragma | Meaning |
+| --- | --- |
+| `vm:entry-point` | [Defining entry-points into Dart code for an embedder or native methods](compiler/aot/entry_point_pragma.md) |
 
 ## Pragmas for internal use
 
 These pragmas can cause unsound behavior if used incorrectly and therefore are only allowed within the core SDK libraries.
 
-- **vm:exact-result-type**
-
-  [Declaring an exact result type of a method]
-  (file://../vm/compiler/result_type_pragma.md)
+| Pragma | Meaning |
+| --- | --- |
+| `vm:exact-result-type` | [Declaring an exact result type of a method](compiler/result_type_pragma.md) |
 
 ## Pragmas for internal testing
 
@@ -25,7 +23,6 @@
 The names of these pragmas are prefixed with "testing".
 Additionally, they are categorized into "safe" and "unsafe" forms: "safe" pragmas should not affect the behavior of the program and can be safely added anywhere, whereas "unsafe" pragmas may change the code's behavior or may cause the VM to crash if used improperly.
 
-- **vm:testing.unsafe.trace-entrypoints-fn**
-
-  [Observing which flow-graph-level entry-point was used when a function was called]
-  (file://../vm/compiler/frontend/entrypoints_pragma.md)
+| Pragma | Meaning |
+| --- | --- |
+| `vm:testing.unsafe.trace-entrypoints-fn` | [Observing which flow-graph-level entry-point was used when a function was called](compiler/frontend/testing_trace_entrypoints_pragma.md) |
diff --git a/runtime/docs/snapshot_profiling.md b/runtime/docs/snapshot_profiling.md
new file mode 100644
index 0000000..596bda2
--- /dev/null
+++ b/runtime/docs/snapshot_profiling.md
@@ -0,0 +1,19 @@
+# AOT Snapshot Size Profiling
+
+The VM supports profiling the size of AOT snapshots by leveraging the object-graph based file format introduced by V8.
+
+## Recording a profile
+
+To generate a snapshot profile, simply pass the `--write-v8-snapshot-profile-to=<filename>` flag to `gen_snapshot`.
+The profile will be written in JSON format to the requested file.
+Make sure to use the ".heapsnaphsot" extension for the file to open it in Chrome DevTools.
+
+## Examining a profile in Chrome
+
+Open Chrome DevTools, navigate to the "Memory" tab, right-click on the "Profiles" panel, click Load..." and select the snapshot profile file.
+See https://developers.google.com/web/tools/chrome-devtools/memory-problems/heap-snapshots for details on how to use the tool.
+
+## Examining a profile programmatically
+
+A Dart library to parse the snapshot profile format is provided in `pkg/vm/lib/v8_snaphsot_profile.dart`.
+The `dart2js_info` package has some useful code for calculating retainers and other graph statistics.
diff --git a/runtime/include/bin/dart_io_api.h b/runtime/include/bin/dart_io_api.h
index 07a384c..e194f7a 100644
--- a/runtime/include/bin/dart_io_api.h
+++ b/runtime/include/bin/dart_io_api.h
@@ -5,7 +5,7 @@
 #ifndef RUNTIME_INCLUDE_BIN_DART_IO_API_H_
 #define RUNTIME_INCLUDE_BIN_DART_IO_API_H_
 
-#include "include/dart_tools_api.h"
+#include "dart_tools_api.h"
 
 namespace dart {
 namespace bin {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index a4261d8..a560eb2 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -553,19 +553,19 @@
  * for each part.
  */
 
-#define DART_FLAGS_CURRENT_VERSION (0x00000009)
+#define DART_FLAGS_CURRENT_VERSION (0x0000000b)
 
 typedef struct {
   int32_t version;
-  bool enable_type_checks;
   bool enable_asserts;
-  bool enable_error_on_bad_type;
   bool use_field_guards;
   bool use_osr;
   bool obfuscate;
   Dart_QualifiedFunctionName* entry_points;
+  bool use_bare_instructions;
   bool load_vmservice_library;
   bool unsafe_trust_strong_mode_types;
+  bool copy_parent_code;
 } Dart_IsolateFlags;
 
 /**
@@ -601,7 +601,7 @@
  *   Isolate.spawn, or the argument to Isolate.spawnUri canonicalized by the
  *   library tag handler of the parent isolate.
  *   The callback is responsible for loading the program by a call to
- *   Dart_LoadScript or Dart_LoadScriptFromKernel.
+ *   Dart_LoadScriptFromKernel.
  * \param main The name of the main entry point this isolate will
  *   eventually run.  This is provided for advisory purposes only to
  *   improve debugging messages.  The main function is not invoked by
@@ -1511,6 +1511,19 @@
                                               bool* is_static);
 
 /**
+ * Is this object a closure resulting from a tear-off (closurized method)?
+ *
+ * Returns true for closures produced when an ordinary method is accessed
+ * through a getter call. Returns false otherwise, in particular for closures
+ * produced from local function declarations.
+ *
+ * \param object Some Object.
+ *
+ * \return true if Object is a tear-off.
+ */
+DART_EXPORT bool Dart_IsTearOff(Dart_Handle object);
+
+/**
  * Retrieves the function of a closure.
  *
  * \return A handle to the function of the closure, or an error handle if the
@@ -2448,15 +2461,6 @@
  */
 
 /**
- * Creates a native wrapper class.
- *
- * TODO(turnidge): Document.
- */
-DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library,
-                                                      Dart_Handle class_name,
-                                                      int field_count);
-
-/**
  * Gets the number of native instance fields in an object.
  */
 DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj,
@@ -2820,26 +2824,18 @@
  *
  * Dart_kScriptTag
  *
- * This tag indicates that the root script should be loaded from
- * 'url'.  If the 'library' parameter is not null, it is the url of the
- * package map that should be used when loading.  Once the root
- * script is loaded, the embedder should call Dart_LoadScript to
- * install the root script in the VM.  The return value should be an
- * error or null.
+ * No longer used.
  *
  * Dart_kSourceTag
  *
- * This tag is used to load a file referenced by Dart language "part
- * of" directive.  Once the file's source is loaded, the embedder
- * should call Dart_LoadSource to provide the file contents to the VM.
- * The return value should be an error or null.
+ * No longer used.
  *
  * Dart_kImportTag
  *
- * This tag is used to load a script referenced by Dart language
- * "import" directive.  Once the script is loaded, the embedder should
- * call Dart_LoadLibrary to provide the script source to the VM.  The
- * return value should be an error or null.
+ * This tag is used to load a library from IsolateMirror.loadUri. The embedder
+ * should call Dart_LoadLibraryFromKernel to provide the library to the VM. The
+ * return value should be an error or library (the result from
+ * Dart_LoadLibraryFromKernel).
  *
  * Dart_kKernelTag
  *
@@ -2848,7 +2844,8 @@
  * of an application is needed and the VM is 'use dart front end' mode.
  * The dart front end typically compiles all the scripts, imports and part
  * files into one intermediate file hence we don't use the source/import or
- * script tags.
+ * script tags. The return value should be an error or a TypedData containing
+ * the kernel bytes.
  *
  * Dart_kImportExtensionTag
  *
@@ -3155,6 +3152,12 @@
  */
 DART_EXPORT Dart_Port Dart_ServiceWaitForLoadPort();
 
+/*
+ * ====================
+ * Compilation Feedback
+ * ====================
+ */
+
 /**
  * Record all functions which have been compiled in the current isolate.
  *
@@ -3178,6 +3181,29 @@
 DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
 Dart_LoadCompilationTrace(uint8_t* buffer, intptr_t buffer_length);
 
+/**
+ * Record runtime feedback for the current isolate, including type feedback
+ * and usage counters.
+ *
+ * \param buffer Returns a pointer to a buffer containing the trace.
+ *   This buffer is scope allocated and is only valid  until the next call to
+ *   Dart_ExitScope.
+ * \param size Returns the size of the buffer.
+ * \return Returns an valid handle upon success.
+ */
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_SaveTypeFeedback(uint8_t** buffer, intptr_t* buffer_length);
+
+/**
+ * Compile functions using data from Dart_SaveTypeFeedback. The data must from a
+ * VM with the same version and compiler flags.
+ *
+ * \return Returns an error handle if a compilation error was encountered or a
+ *   version mismatch is detected.
+ */
+DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle
+Dart_LoadTypeFeedback(uint8_t* buffer, intptr_t buffer_length);
+
 /*
  * ==============
  * Precompilation
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index 5452c25..49b1f19 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -5,7 +5,7 @@
 #ifndef RUNTIME_INCLUDE_DART_TOOLS_API_H_
 #define RUNTIME_INCLUDE_DART_TOOLS_API_H_
 
-#include "include/dart_api.h"
+#include "dart_api.h"
 
 /** \mainpage Dart Tools Embedding API Reference
  *
@@ -222,6 +222,25 @@
     Dart_ServiceStreamCancelCallback cancel_callback);
 
 /**
+ * A callback invoked when the VM service receives an event.
+ */
+typedef void (*Dart_NativeStreamConsumer)(const uint8_t* event_json,
+                                          intptr_t event_json_length);
+
+/**
+ * Sets the native VM service stream callbacks for a particular stream.
+ * Note: The function may be called on multiple threads concurrently.
+ *
+ * \param consumer A function pointer to an event handler callback function.
+ *   A NULL value removes the existing listen callback function if any.
+ *
+ * \param stream_id The ID of the stream on which to set the callback.
+ */
+DART_EXPORT void Dart_SetNativeServiceStreamCallback(
+    Dart_NativeStreamConsumer consumer,
+    const char* stream_id);
+
+/**
  * Sends a data event to clients of the VM Service.
  *
  * A data event is used to pass an array of bytes to subscribed VM
diff --git a/runtime/lib/array.cc b/runtime/lib/array.cc
index e2c0998..d143a98 100644
--- a/runtime/lib/array.cc
+++ b/runtime/lib/array.cc
@@ -10,20 +10,20 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(List_new, 2) {
+DEFINE_NATIVE_ENTRY(List_new, 0, 2) {
   // This function is handled by flow-graph builder.
   UNREACHABLE();
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(List_allocate, 2) {
+DEFINE_NATIVE_ENTRY(List_allocate, 0, 2) {
   // Implemented in FlowGraphBuilder::VisitNativeBody.
   UNREACHABLE();
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(List_getIndexed, 2) {
-  const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(List_getIndexed, 0, 2) {
+  const Array& array = Array::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1));
   if ((index.Value() < 0) || (index.Value() >= array.Length())) {
     Exceptions::ThrowRangeError("index", index, 0, array.Length() - 1);
@@ -31,10 +31,11 @@
   return array.At(index.Value());
 }
 
-DEFINE_NATIVE_ENTRY(List_setIndexed, 3) {
-  const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(List_setIndexed, 0, 3) {
+  const Array& array = Array::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1));
-  const Instance& value = Instance::CheckedHandle(arguments->NativeArgAt(2));
+  const Instance& value =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(2));
   if ((index.Value() < 0) || (index.Value() >= array.Length())) {
     Exceptions::ThrowRangeError("index", index, 0, array.Length() - 1);
   }
@@ -42,14 +43,14 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(List_getLength, 1) {
-  const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(List_getLength, 0, 1) {
+  const Array& array = Array::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Smi::New(array.Length());
 }
 
 // ObjectArray src, int start, int count, bool needTypeArgument.
-DEFINE_NATIVE_ENTRY(List_slice, 4) {
-  const Array& src = Array::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(List_slice, 0, 4) {
+  const Array& src = Array::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, start, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, count, arguments->NativeArgAt(2));
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, needs_type_arg, arguments->NativeArgAt(3));
@@ -69,11 +70,12 @@
 }
 
 // Private factory, expects correct arguments.
-DEFINE_NATIVE_ENTRY(ImmutableList_from, 4) {
+DEFINE_NATIVE_ENTRY(ImmutableList_from, 0, 4) {
   // Ignore first argument of a thsi factory (type argument).
-  const Array& from_array = Array::CheckedHandle(arguments->NativeArgAt(1));
-  const Smi& smi_offset = Smi::CheckedHandle(arguments->NativeArgAt(2));
-  const Smi& smi_length = Smi::CheckedHandle(arguments->NativeArgAt(3));
+  const Array& from_array =
+      Array::CheckedHandle(zone, arguments->NativeArgAt(1));
+  const Smi& smi_offset = Smi::CheckedHandle(zone, arguments->NativeArgAt(2));
+  const Smi& smi_length = Smi::CheckedHandle(zone, arguments->NativeArgAt(3));
   const intptr_t length = smi_length.Value();
   const intptr_t offset = smi_offset.Value();
   const Array& result = Array::Handle(Array::New(length));
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 2e93901..3797c4a 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -65,6 +65,30 @@
     }
   }
 
+  void setAll(int index, Iterable<E> iterable) {
+    if (index < 0 || index > this.length) {
+      throw new RangeError.range(index, 0, this.length, "index");
+    }
+    List<E> iterableAsList;
+    if (identical(this, iterable)) {
+      iterableAsList = this;
+    } else if (ClassID.getID(iterable) == ClassID.cidArray) {
+      iterableAsList = iterable;
+    } else if (iterable is List<E>) {
+      iterableAsList = iterable;
+    } else {
+      for (var value in iterable) {
+        this[index++] = value;
+      }
+      return;
+    }
+    int length = iterableAsList.length;
+    if (index + length > this.length) {
+      throw new RangeError.range(index + length, 0, this.length);
+    }
+    Lists.copy(iterableAsList, 0, this, index, length);
+  }
+
   List<E> sublist(int start, [int end]) {
     end = RangeError.checkValidRange(start, end, this.length);
     int length = end - start;
diff --git a/runtime/lib/array_patch.dart b/runtime/lib/array_patch.dart
index 1ec264d..7bea7c9 100644
--- a/runtime/lib/array_patch.dart
+++ b/runtime/lib/array_patch.dart
@@ -24,7 +24,7 @@
 
   @patch
   factory List.from(Iterable elements, {bool growable: true}) {
-    if (elements is EfficientLengthIterable) {
+    if (elements is EfficientLengthIterable<E>) {
       int length = elements.length;
       var list = growable ? new _GrowableList<E>(length) : new _List<E>(length);
       if (length > 0) {
@@ -36,12 +36,25 @@
       }
       return list;
     }
-    List<E> list = new _GrowableList<E>(0);
-    for (E e in elements) {
-      list.add(e);
+    // If elements is an Iterable<E>, we won't need a type-test for each
+    // element. In the "common case" that elements is an Iterable<E>, this
+    // replaces a type-test on every element with a single type-test before
+    // starting the loop.
+    if (elements is Iterable<E>) {
+      List<E> list = new _GrowableList<E>(0);
+      for (E e in elements) {
+        list.add(e);
+      }
+      if (growable) return list;
+      return makeListFixedLength(list);
+    } else {
+      List<E> list = new _GrowableList<E>(0);
+      for (E e in elements) {
+        list.add(e);
+      }
+      if (growable) return list;
+      return makeListFixedLength(list);
     }
-    if (growable) return list;
-    return makeListFixedLength(list);
   }
 
   @patch
diff --git a/runtime/lib/async.cc b/runtime/lib/async.cc
index 2799419..5a11f34 100644
--- a/runtime/lib/async.cc
+++ b/runtime/lib/async.cc
@@ -11,7 +11,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(AsyncStarMoveNext_debuggerStepCheck, 1) {
+DEFINE_NATIVE_ENTRY(AsyncStarMoveNext_debuggerStepCheck, 0, 1) {
 #if !defined(PRODUCT)
   GET_NON_NULL_NATIVE_ARGUMENT(Closure, async_op, arguments->NativeArgAt(0));
   Debugger* debugger = isolate->debugger();
diff --git a/runtime/lib/async_patch.dart b/runtime/lib/async_patch.dart
index 0cd4bd8..c293221 100644
--- a/runtime/lib/async_patch.dart
+++ b/runtime/lib/async_patch.dart
@@ -200,8 +200,7 @@
     // If stream is cancelled, tell caller to exit the async generator.
     if (!controller.hasListener) return true;
     isAdding = true;
-    var whenDoneAdding =
-        controller.addStream(stream as Stream<T>, cancelOnError: false);
+    var whenDoneAdding = controller.addStream(stream, cancelOnError: false);
     whenDoneAdding.then((_) {
       isAdding = false;
       scheduleGenerator();
diff --git a/runtime/lib/bigint_patch.dart b/runtime/lib/bigint_patch.dart
index 0ae7425..0341923 100644
--- a/runtime/lib/bigint_patch.dart
+++ b/runtime/lib/bigint_patch.dart
@@ -2572,9 +2572,6 @@
   //   args[_rhoDigit.._rhoHighDigit] =
   //     1/args[_xDigit.._xHighDigit] mod _digitBase^2.
   static void _invDigitPair(Uint32List args) {
-    var two = _BigIntImpl.two;
-    var mask32 = _BigIntImpl._oneDigitMask;
-    var mask64 = _BigIntImpl._twoDigitMask;
     var xl = args[_xDigit]; // Lower 32-bit digit of x.
     var y = xl & 3; // y == 1/x mod 2^2
     y = (y * (2 - (xl & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
diff --git a/runtime/lib/bool.cc b/runtime/lib/bool.cc
index dc2b00f..c52fd71 100644
--- a/runtime/lib/bool.cc
+++ b/runtime/lib/bool.cc
@@ -16,7 +16,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Bool_fromEnvironment, 3) {
+DEFINE_NATIVE_ENTRY(Bool_fromEnvironment, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(Bool, default_value, arguments->NativeArgAt(2));
   // Call the embedder to supply us with the environment.
diff --git a/runtime/lib/class_id.cc b/runtime/lib/class_id.cc
index 2d9f67d..c0f5295 100644
--- a/runtime/lib/class_id.cc
+++ b/runtime/lib/class_id.cc
@@ -7,7 +7,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(ClassID_getID, 1) {
+DEFINE_NATIVE_ENTRY(ClassID_getID, 0, 1) {
   const Instance& instance =
       Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Smi::New(instance.GetClassId());
diff --git a/runtime/lib/class_id.dart b/runtime/lib/class_id.dart
index 2260a75..ff9d0b6 100644
--- a/runtime/lib/class_id.dart
+++ b/runtime/lib/class_id.dart
@@ -4,7 +4,9 @@
 
 // part of "internal_patch.dart";
 
+@pragma("vm:entry-point")
 class ClassID {
+  @pragma("vm:entry-point")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   static int getID(Object value) native "ClassID_getID";
 
diff --git a/runtime/lib/class_id_fasta.dart b/runtime/lib/class_id_fasta.dart
index 0a89db4..f8579c0 100644
--- a/runtime/lib/class_id_fasta.dart
+++ b/runtime/lib/class_id_fasta.dart
@@ -4,14 +4,24 @@
 
 // part of "internal_patch.dart";
 
+@pragma("vm:entry-point")
 class ClassID {
+  @pragma("vm:entry-point")
   @pragma("vm:exact-result-type", "dart:core#_Smi")
   static int getID(Object value) native "ClassID_getID";
 
+  @pragma("vm:entry-point")
   static final int cidArray = 0;
+  @pragma("vm:entry-point")
   static final int cidExternalOneByteString = 0;
+  @pragma("vm:entry-point")
   static final int cidGrowableObjectArray = 0;
+  @pragma("vm:entry-point")
   static final int cidImmutableArray = 0;
+  @pragma("vm:entry-point")
   static final int cidOneByteString = 0;
+  @pragma("vm:entry-point")
   static final int cidTwoByteString = 0;
+  @pragma("vm:entry-point")
+  static final int cidUint8ArrayView = 0;
 }
diff --git a/runtime/lib/collection_patch.dart b/runtime/lib/collection_patch.dart
index 05cf6e1..83f12ca 100644
--- a/runtime/lib/collection_patch.dart
+++ b/runtime/lib/collection_patch.dart
@@ -34,17 +34,11 @@
             identical(identical, equals)) {
           return new _IdentityHashMap<K, V>();
         }
-        if (equals == null) {
-          equals = _defaultEquals;
-        }
+        equals ??= _defaultEquals;
       }
     } else {
-      if (hashCode == null) {
-        hashCode = _defaultHashCode;
-      }
-      if (equals == null) {
-        equals = _defaultEquals;
-      }
+      hashCode ??= _defaultHashCode;
+      equals ??= _defaultEquals;
     }
     return new _CustomHashMap<K, V>(equals, hashCode, isValidKey);
   }
@@ -536,17 +530,11 @@
             identical(identical, equals)) {
           return new _IdentityHashSet<E>();
         }
-        if (equals == null) {
-          equals = _defaultEquals;
-        }
+        equals ??= _defaultEquals;
       }
     } else {
-      if (hashCode == null) {
-        hashCode = _defaultHashCode;
-      }
-      if (equals == null) {
-        equals = _defaultEquals;
-      }
+      hashCode ??= _defaultHashCode;
+      equals ??= _defaultEquals;
     }
     return new _CustomHashSet<E>(equals, hashCode, isValidKey);
   }
@@ -555,7 +543,7 @@
   factory HashSet.identity() => new _IdentityHashSet<E>();
 }
 
-class _HashSet<E> extends _HashSetBase<E> implements HashSet<E> {
+class _HashSet<E> extends _SetBase<E> implements HashSet<E> {
   static const int _INITIAL_CAPACITY = 8;
 
   List<_HashSetEntry<E>> _buckets =
@@ -637,9 +625,7 @@
   }
 
   void addAll(Iterable<E> objects) {
-    int ctr = 0;
     for (E object in objects) {
-      ctr++;
       add(object);
     }
   }
@@ -879,17 +865,11 @@
             identical(identical, equals)) {
           return new _CompactLinkedIdentityHashMap<K, V>();
         }
-        if (equals == null) {
-          equals = _defaultEquals;
-        }
+        equals ??= _defaultEquals;
       }
     } else {
-      if (hashCode == null) {
-        hashCode = _defaultHashCode;
-      }
-      if (equals == null) {
-        equals = _defaultEquals;
-      }
+      hashCode ??= _defaultHashCode;
+      equals ??= _defaultEquals;
     }
     return new _CompactLinkedCustomHashMap<K, V>(equals, hashCode, isValidKey);
   }
@@ -916,17 +896,11 @@
             identical(identical, equals)) {
           return new _CompactLinkedIdentityHashSet<E>();
         }
-        if (equals == null) {
-          equals = _defaultEquals;
-        }
+        equals ??= _defaultEquals;
       }
     } else {
-      if (hashCode == null) {
-        hashCode = _defaultHashCode;
-      }
-      if (equals == null) {
-        equals = _defaultEquals;
-      }
+      hashCode ??= _defaultHashCode;
+      equals ??= _defaultEquals;
     }
     return new _CompactLinkedCustomHashSet<E>(equals, hashCode, isValidKey);
   }
@@ -934,3 +908,31 @@
   @patch
   factory LinkedHashSet.identity() => new _CompactLinkedIdentityHashSet<E>();
 }
+
+@patch
+abstract class _SplayTree<K, Node extends _SplayTreeNode<K>> {
+  // We override _splayMin and _splayMax to optimize type-checks.
+  @patch
+  Node _splayMin(Node node) {
+    Node current = node;
+    while (current.left != null) {
+      Node left = internal.unsafeCast<Node>(current.left);
+      current.left = left.right;
+      left.right = current;
+      current = left;
+    }
+    return current;
+  }
+
+  @patch
+  Node _splayMax(Node node) {
+    Node current = node;
+    while (current.right != null) {
+      Node right = internal.unsafeCast<Node>(current.right);
+      current.right = right.left;
+      right.left = current;
+      current = right;
+    }
+    return current;
+  }
+}
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart
index c374ec6..8123b0f 100644
--- a/runtime/lib/compact_hash.dart
+++ b/runtime/lib/compact_hash.dart
@@ -256,7 +256,6 @@
 
   void operator []=(K key, V value) {
     final int size = _index.length;
-    final int sizeMask = size - 1;
     final int fullHash = _hashCode(key);
     final int hashPattern = _HashBase._hashPattern(fullHash, _hashMask, size);
     final int d = _findValueOrInsertPoint(key, fullHash, hashPattern, size);
@@ -270,8 +269,6 @@
 
   V putIfAbsent(K key, V ifAbsent()) {
     final int size = _index.length;
-    final int sizeMask = size - 1;
-    final int maxEntries = size >> 1;
     final int fullHash = _hashCode(key);
     final int hashPattern = _HashBase._hashPattern(fullHash, _hashMask, size);
     final int d = _findValueOrInsertPoint(key, fullHash, hashPattern, size);
@@ -436,7 +433,8 @@
   final int _checkSum;
   E current;
 
-  _CompactIterator(table, this._data, this._len, this._offset, this._step)
+  _CompactIterator(
+      _HashBase table, this._data, this._len, this._offset, this._step)
       : _table = table,
         _checkSum = table._checkSum;
 
@@ -448,7 +446,7 @@
       _offset += _step;
     } while (_offset < _len && _HashBase._isDeleted(_data, _data[_offset]));
     if (_offset < _len) {
-      current = _data[_offset];
+      current = internal.unsafeCast<E>(_data[_offset]);
       return true;
     } else {
       current = null;
diff --git a/runtime/lib/convert_patch.dart b/runtime/lib/convert_patch.dart
index 6ba8444..3d99c0d 100644
--- a/runtime/lib/convert_patch.dart
+++ b/runtime/lib/convert_patch.dart
@@ -7,7 +7,7 @@
 /// used by patches of that library. We plan to change this when we have a
 /// shared front end and simply use parts.
 
-import "dart:_internal" show POWERS_OF_TEN, patch;
+import "dart:_internal" show POWERS_OF_TEN, patch, ClassID;
 
 import "dart:typed_data" show Uint8List, Uint16List;
 
@@ -177,7 +177,6 @@
   }
 
   void arrayElement() {
-    List list = currentContainer;
     currentContainer.add(value);
     value = null;
   }
@@ -1817,3 +1816,27 @@
     _sink.close();
   }
 }
+
+@patch
+int _scanOneByteCharacters(List<int> units, int from, int endIndex) {
+  final to = endIndex;
+
+  // Special case for _Uint8ArrayView.
+  final cid = ClassID.getID(units);
+  if (identical(cid, ClassID.cidUint8ArrayView)) {
+    if (from >= 0 && to >= 0 && to <= units.length) {
+      for (int i = from; i < to; i++) {
+        final unit = units[i];
+        if ((unit & _ONE_BYTE_LIMIT) != unit) return i - from;
+      }
+      return to - from;
+    }
+  }
+
+  // Fall through to normal case.
+  for (var i = from; i < to; i++) {
+    final unit = units[i];
+    if ((unit & _ONE_BYTE_LIMIT) != unit) return i - from;
+  }
+  return to - from;
+}
diff --git a/runtime/lib/core_patch.dart b/runtime/lib/core_patch.dart
index 1b0f849..7b1876d6 100644
--- a/runtime/lib/core_patch.dart
+++ b/runtime/lib/core_patch.dart
@@ -24,7 +24,8 @@
         is64Bit,
         makeFixedListUnmodifiable,
         makeListFixedLength,
-        patch;
+        patch,
+        unsafeCast;
 
 import "dart:async" show Completer, Future, Timer;
 
@@ -116,8 +117,8 @@
   Iterator<T> get iterator {
     // Note: _Closure._clone returns _Closure which is not related to
     // _SyncGeneratorCallback, which means we need explicit cast.
-    return new _SyncIterator<T>(
-        (_moveNextFn as _Closure)._clone() as _SyncGeneratorCallback<T>);
+    return new _SyncIterator<T>(unsafeCast<_SyncGeneratorCallback<T>>(
+        unsafeCast<_Closure>(_moveNextFn)._clone()));
   }
 }
 
diff --git a/runtime/lib/date.cc b/runtime/lib/date.cc
index 3f694d3..e605c05 100644
--- a/runtime/lib/date.cc
+++ b/runtime/lib/date.cc
@@ -14,7 +14,7 @@
 
 static int64_t kMaxAllowedSeconds = kMaxInt32;
 
-DEFINE_NATIVE_ENTRY(DateTime_timeZoneName, 1) {
+DEFINE_NATIVE_ENTRY(DateTime_timeZoneName, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, dart_seconds,
                                arguments->NativeArgAt(0));
   int64_t seconds = dart_seconds.AsInt64Value();
@@ -25,7 +25,7 @@
   return String::New(name);
 }
 
-DEFINE_NATIVE_ENTRY(DateTime_timeZoneOffsetInSeconds, 1) {
+DEFINE_NATIVE_ENTRY(DateTime_timeZoneOffsetInSeconds, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, dart_seconds,
                                arguments->NativeArgAt(0));
   int64_t seconds = dart_seconds.AsInt64Value();
@@ -36,12 +36,12 @@
   return Integer::New(offset);
 }
 
-DEFINE_NATIVE_ENTRY(DateTime_localTimeZoneAdjustmentInSeconds, 0) {
+DEFINE_NATIVE_ENTRY(DateTime_localTimeZoneAdjustmentInSeconds, 0, 0) {
   int adjustment = OS::GetLocalTimeZoneAdjustmentInSeconds();
   return Integer::New(adjustment);
 }
 
-DEFINE_NATIVE_ENTRY(DateTime_currentTimeMicros, 0) {
+DEFINE_NATIVE_ENTRY(DateTime_currentTimeMicros, 0, 0) {
   return Integer::New(OS::GetCurrentTimeMicros());
 }
 
diff --git a/runtime/lib/date_patch.dart b/runtime/lib/date_patch.dart
index 481cb16..1899e0c 100644
--- a/runtime/lib/date_patch.dart
+++ b/runtime/lib/date_patch.dart
@@ -57,7 +57,7 @@
   @patch
   DateTime._now()
       : isUtc = false,
-        _value = _getCurrentMicros() {}
+        _value = _getCurrentMicros();
 
   @patch
   String get timeZoneName {
@@ -72,6 +72,26 @@
     return new Duration(seconds: offsetInSeconds);
   }
 
+  @patch
+  bool operator ==(dynamic other) =>
+      other is DateTime &&
+      _value == other.microsecondsSinceEpoch &&
+      isUtc == other.isUtc;
+
+  @patch
+  bool isBefore(DateTime other) => _value < other.microsecondsSinceEpoch;
+
+  @patch
+  bool isAfter(DateTime other) => _value > other.microsecondsSinceEpoch;
+
+  @patch
+  bool isAtSameMomentAs(DateTime other) =>
+      _value == other.microsecondsSinceEpoch;
+
+  @patch
+  int compareTo(DateTime other) =>
+      _value.compareTo(other.microsecondsSinceEpoch);
+
   /** The first list contains the days until each month in non-leap years. The
     * second list contains the days in leap years. */
   static const List<List<int>> _DAYS_UNTIL_MONTH = const [
@@ -160,9 +180,7 @@
   }
 
   get _parts {
-    if (__parts == null) {
-      __parts = _computeUpperPart(_localDateInUtcMicros);
-    }
+    __parts ??= _computeUpperPart(_localDateInUtcMicros);
     return __parts;
   }
 
diff --git a/runtime/lib/developer.cc b/runtime/lib/developer.cc
index e8056b4..defe884 100644
--- a/runtime/lib/developer.cc
+++ b/runtime/lib/developer.cc
@@ -19,7 +19,7 @@
 namespace dart {
 
 // Native implementations for the dart:developer library.
-DEFINE_NATIVE_ENTRY(Developer_debugger, 2) {
+DEFINE_NATIVE_ENTRY(Developer_debugger, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, when, arguments->NativeArgAt(0));
 #if !defined(PRODUCT)
   GET_NATIVE_ARGUMENT(String, msg, arguments->NativeArgAt(1));
@@ -34,7 +34,7 @@
   return when.raw();
 }
 
-DEFINE_NATIVE_ENTRY(Developer_inspect, 1) {
+DEFINE_NATIVE_ENTRY(Developer_inspect, 0, 1) {
   GET_NATIVE_ARGUMENT(Instance, inspectee, arguments->NativeArgAt(0));
 #ifndef PRODUCT
   if (FLAG_support_service) {
@@ -44,7 +44,7 @@
   return inspectee.raw();
 }
 
-DEFINE_NATIVE_ENTRY(Developer_log, 8) {
+DEFINE_NATIVE_ENTRY(Developer_log, 0, 8) {
 #if defined(PRODUCT)
   return Object::null();
 #else
@@ -66,7 +66,7 @@
 #endif  // PRODUCT
 }
 
-DEFINE_NATIVE_ENTRY(Developer_postEvent, 2) {
+DEFINE_NATIVE_ENTRY(Developer_postEvent, 0, 2) {
 #if defined(PRODUCT)
   return Object::null();
 #else
@@ -80,7 +80,7 @@
 #endif  // PRODUCT
 }
 
-DEFINE_NATIVE_ENTRY(Developer_lookupExtension, 1) {
+DEFINE_NATIVE_ENTRY(Developer_lookupExtension, 0, 1) {
 #if defined(PRODUCT)
   return Object::null();
 #else
@@ -92,7 +92,7 @@
 #endif  // PRODUCT
 }
 
-DEFINE_NATIVE_ENTRY(Developer_registerExtension, 2) {
+DEFINE_NATIVE_ENTRY(Developer_registerExtension, 0, 2) {
 #if defined(PRODUCT)
   return Object::null();
 #else
@@ -112,7 +112,7 @@
 #endif  // PRODUCT
 }
 
-DEFINE_NATIVE_ENTRY(Developer_getServiceMajorVersion, 0) {
+DEFINE_NATIVE_ENTRY(Developer_getServiceMajorVersion, 0, 0) {
 #if defined(PRODUCT)
   return Smi::New(0);
 #else
@@ -120,7 +120,7 @@
 #endif
 }
 
-DEFINE_NATIVE_ENTRY(Developer_getServiceMinorVersion, 0) {
+DEFINE_NATIVE_ENTRY(Developer_getServiceMinorVersion, 0, 0) {
 #if defined(PRODUCT)
   return Smi::New(0);
 #else
@@ -134,7 +134,7 @@
                                    Message::kNormalPriority));
 }
 
-DEFINE_NATIVE_ENTRY(Developer_getServerInfo, 1) {
+DEFINE_NATIVE_ENTRY(Developer_getServerInfo, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
 #if defined(PRODUCT)
   SendNull(port);
@@ -149,7 +149,7 @@
 #endif
 }
 
-DEFINE_NATIVE_ENTRY(Developer_webServerControl, 2) {
+DEFINE_NATIVE_ENTRY(Developer_webServerControl, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
 #if defined(PRODUCT)
   SendNull(port);
@@ -165,7 +165,7 @@
 #endif
 }
 
-DEFINE_NATIVE_ENTRY(Developer_getIsolateIDFromSendPort, 1) {
+DEFINE_NATIVE_ENTRY(Developer_getIsolateIDFromSendPort, 0, 1) {
 #if defined(PRODUCT)
   return Object::null();
 #else
diff --git a/runtime/lib/developer.dart b/runtime/lib/developer.dart
index 96577e1..12ad8b7 100644
--- a/runtime/lib/developer.dart
+++ b/runtime/lib/developer.dart
@@ -35,9 +35,7 @@
   if (message is! String) {
     throw new ArgumentError.value(message, "message", "Must be a String");
   }
-  if (time == null) {
-    time = new DateTime.now();
-  }
+  time ??= new DateTime.now();
   if (time is! DateTime) {
     throw new ArgumentError.value(time, "time", "Must be a DateTime");
   }
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 3aaeaa9..fb2f903 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -17,19 +17,19 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, trace_intrinsified_natives);
-
-DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 2) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
-  const Integer& value = Integer::CheckedHandle(arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 0, 2) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
+  const Integer& value =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(1));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Double_doubleFromInteger %s\n", value.ToCString());
   }
   return Double::New(value.AsDoubleValue());
 }
 
-DEFINE_NATIVE_ENTRY(Double_add, 2) {
-  double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+DEFINE_NATIVE_ENTRY(Double_add, 0, 2) {
+  double left = Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
   if (FLAG_trace_intrinsified_natives) {
@@ -38,8 +38,8 @@
   return Double::New(left + right);
 }
 
-DEFINE_NATIVE_ENTRY(Double_sub, 2) {
-  double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+DEFINE_NATIVE_ENTRY(Double_sub, 0, 2) {
+  double left = Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
   if (FLAG_trace_intrinsified_natives) {
@@ -48,8 +48,8 @@
   return Double::New(left - right);
 }
 
-DEFINE_NATIVE_ENTRY(Double_mul, 2) {
-  double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+DEFINE_NATIVE_ENTRY(Double_mul, 0, 2) {
+  double left = Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
   if (FLAG_trace_intrinsified_natives) {
@@ -58,8 +58,8 @@
   return Double::New(left * right);
 }
 
-DEFINE_NATIVE_ENTRY(Double_div, 2) {
-  double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+DEFINE_NATIVE_ENTRY(Double_div, 0, 2) {
+  double left = Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
   if (FLAG_trace_intrinsified_natives) {
@@ -85,8 +85,8 @@
   return Integer::New(ival);
 }
 
-DEFINE_NATIVE_ENTRY(Double_hashCode, 1) {
-  double val = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+DEFINE_NATIVE_ENTRY(Double_hashCode, 0, 1) {
+  double val = Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Double_hashCode %f\n", val);
   }
@@ -102,8 +102,8 @@
   return Smi::New(((uval >> 32) ^ (uval)) & kSmiMax);
 }
 
-DEFINE_NATIVE_ENTRY(Double_trunc_div, 2) {
-  double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+DEFINE_NATIVE_ENTRY(Double_trunc_div, 0, 2) {
+  double left = Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
   if (FLAG_trace_intrinsified_natives) {
@@ -113,22 +113,22 @@
                          "Result of truncating division is Infinity or NaN");
 }
 
-DEFINE_NATIVE_ENTRY(Double_modulo, 2) {
-  double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+DEFINE_NATIVE_ENTRY(Double_modulo, 0, 2) {
+  double left = Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
   return Double::New(DartModulo(left, right));
 }
 
-DEFINE_NATIVE_ENTRY(Double_remainder, 2) {
-  double left = Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+DEFINE_NATIVE_ENTRY(Double_remainder, 0, 2) {
+  double left = Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right_object, arguments->NativeArgAt(1));
   double right = right_object.value();
   return Double::New(fmod_ieee(left, right));
 }
 
-DEFINE_NATIVE_ENTRY(Double_greaterThan, 2) {
-  const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_greaterThan, 0, 2) {
+  const Double& left = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right, arguments->NativeArgAt(1));
   bool result = right.IsNull() ? false : (left.value() > right.value());
   if (FLAG_trace_intrinsified_natives) {
@@ -138,14 +138,14 @@
   return Bool::Get(result).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Double_greaterThanFromInteger, 2) {
-  const Double& right = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_greaterThanFromInteger, 0, 2) {
+  const Double& right = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
   return Bool::Get(left.AsDoubleValue() > right.value()).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Double_equal, 2) {
-  const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_equal, 0, 2) {
+  const Double& left = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, right, arguments->NativeArgAt(1));
   bool result = right.IsNull() ? false : (left.value() == right.value());
   if (FLAG_trace_intrinsified_natives) {
@@ -155,29 +155,29 @@
   return Bool::Get(result).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Double_equalToInteger, 2) {
-  const Double& left = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_equalToInteger, 0, 2) {
+  const Double& left = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, right, arguments->NativeArgAt(1));
   return Bool::Get(left.value() == right.AsDoubleValue()).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Double_round, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_round, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Double::New(round(arg.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Double_floor, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_floor, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Double::New(floor(arg.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Double_ceil, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_ceil, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Double::New(ceil(arg.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Double_truncate, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_truncate, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Double::New(trunc(arg.value()));
 }
 
@@ -186,12 +186,12 @@
 #pragma GCC diagnostic ignored "-Wold-style-cast"
 #endif
 
-DEFINE_NATIVE_ENTRY(Double_toInt, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_toInt, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   return DoubleToInteger(arg.value(), "Infinity or NaN toInt");
 }
 
-DEFINE_NATIVE_ENTRY(Double_parse, 3) {
+DEFINE_NATIVE_ENTRY(Double_parse, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, startValue, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, endValue, arguments->NativeArgAt(2));
@@ -210,17 +210,17 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Double_toString, 1) {
-  const Number& number = Number::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_toString, 0, 1) {
+  const Number& number = Number::CheckedHandle(zone, arguments->NativeArgAt(0));
   return number.ToString(Heap::kNew);
 }
 
-DEFINE_NATIVE_ENTRY(Double_toStringAsFixed, 2) {
+DEFINE_NATIVE_ENTRY(Double_toStringAsFixed, 0, 2) {
   // The boundaries are exclusive.
   static const double kLowerBoundary = -1e21;
   static const double kUpperBoundary = 1e21;
 
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, fraction_digits, arguments->NativeArgAt(1));
   double d = arg.value();
   intptr_t fraction_digits_value = fraction_digits.Value();
@@ -234,8 +234,8 @@
   }
 }
 
-DEFINE_NATIVE_ENTRY(Double_toStringAsExponential, 2) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_toStringAsExponential, 0, 2) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, fraction_digits, arguments->NativeArgAt(1));
   double d = arg.value();
   intptr_t fraction_digits_value = fraction_digits.Value();
@@ -249,8 +249,8 @@
   }
 }
 
-DEFINE_NATIVE_ENTRY(Double_toStringAsPrecision, 2) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_toStringAsPrecision, 0, 2) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, precision, arguments->NativeArgAt(1));
   double d = arg.value();
   intptr_t precision_value = precision.Value();
@@ -263,25 +263,25 @@
   }
 }
 
-DEFINE_NATIVE_ENTRY(Double_getIsInfinite, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_getIsInfinite, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Bool::Get(isinf(arg.value())).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Double_getIsNaN, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_getIsNaN, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Bool::Get(isnan(arg.value())).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Double_getIsNegative, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_getIsNegative, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   // Include negative zero, infinity.
   double dval = arg.value();
   return Bool::Get(signbit(dval) && !isnan(dval)).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Double_flipSignBit, 1) {
-  const Double& arg = Double::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Double_flipSignBit, 0, 1) {
+  const Double& arg = Double::CheckedHandle(zone, arguments->NativeArgAt(0));
   const double in_val = arg.value();
   const int64_t bits = bit_cast<int64_t, double>(in_val) ^ kSignBitDouble;
   return Double::New(bit_cast<double, int64_t>(bits));
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index f2de9c0..266d433 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.dart
@@ -40,6 +40,7 @@
     return _trunc_div(other.toDouble());
   }
 
+  @pragma("vm:non-nullable-result-type")
   int _trunc_div(double other) native "Double_trunc_div";
 
   @pragma("vm:exact-result-type", _Double)
@@ -71,7 +72,9 @@
     return (other is num) && _equal(other.toDouble());
   }
 
+  @pragma("vm:exact-result-type", bool)
   bool _equal(double other) native "Double_equal";
+  @pragma("vm:exact-result-type", bool)
   bool _equalToInteger(int other) native "Double_equalToInteger";
 
   @pragma("vm:exact-result-type", bool)
@@ -84,6 +87,7 @@
     return _greaterThan(other.toDouble());
   }
 
+  @pragma("vm:exact-result-type", bool)
   bool _greaterThan(double other) native "Double_greaterThan";
 
   @pragma("vm:exact-result-type", bool)
@@ -175,6 +179,7 @@
     return this;
   }
 
+  @pragma("vm:non-nullable-result-type")
   int toInt() native "Double_toInt";
 
   double toDouble() {
diff --git a/runtime/lib/errors.cc b/runtime/lib/errors.cc
index c0dc588..54e61eb 100644
--- a/runtime/lib/errors.cc
+++ b/runtime/lib/errors.cc
@@ -30,29 +30,33 @@
       Class::Handle(Library::LookupCoreClass(Symbols::AssertionError()));
   ASSERT(!assert_error_class.IsNull());
   bool hit_assertion_error = false;
-  while (stack_frame != NULL) {
-    code ^= stack_frame->LookupDartCode();
-    if (code.is_optimized()) {
-      InlinedFunctionsIterator inlined_iterator(code, stack_frame->pc());
-      while (!inlined_iterator.Done()) {
-        func ^= inlined_iterator.function();
-        if (hit_assertion_error) {
-          return func.script();
-        }
-        ASSERT(!hit_assertion_error);
-        hit_assertion_error = (func.Owner() == assert_error_class.raw());
-        inlined_iterator.Advance();
-      }
+  for (; stack_frame != NULL; stack_frame = iterator->NextFrame()) {
+    if (stack_frame->is_interpreted()) {
+      func = stack_frame->LookupDartFunction();
     } else {
-      func ^= code.function();
-      ASSERT(!func.IsNull());
-      if (hit_assertion_error) {
-        return func.script();
+      code ^= stack_frame->LookupDartCode();
+      if (code.is_optimized()) {
+        InlinedFunctionsIterator inlined_iterator(code, stack_frame->pc());
+        while (!inlined_iterator.Done()) {
+          func ^= inlined_iterator.function();
+          if (hit_assertion_error) {
+            return func.script();
+          }
+          ASSERT(!hit_assertion_error);
+          hit_assertion_error = (func.Owner() == assert_error_class.raw());
+          inlined_iterator.Advance();
+        }
+        continue;
+      } else {
+        func = code.function();
       }
-      ASSERT(!hit_assertion_error);
-      hit_assertion_error = (func.Owner() == assert_error_class.raw());
     }
-    stack_frame = iterator->NextFrame();
+    ASSERT(!func.IsNull());
+    if (hit_assertion_error) {
+      return func.script();
+    }
+    ASSERT(!hit_assertion_error);
+    hit_assertion_error = (func.Owner() == assert_error_class.raw());
   }
   UNREACHABLE();
   return Script::null();
@@ -64,16 +68,17 @@
 // Arg1: index of the first token after the failed assertion.
 // Arg2: Message object or null.
 // Return value: none, throws an exception.
-DEFINE_NATIVE_ENTRY(AssertionError_throwNew, 3) {
+DEFINE_NATIVE_ENTRY(AssertionError_throwNew, 0, 3) {
   // No need to type check the arguments. This function can only be called
   // internally from the VM.
-  const TokenPosition assertion_start =
-      TokenPosition(Smi::CheckedHandle(arguments->NativeArgAt(0)).Value());
-  const TokenPosition assertion_end =
-      TokenPosition(Smi::CheckedHandle(arguments->NativeArgAt(1)).Value());
+  const TokenPosition assertion_start = TokenPosition(
+      Smi::CheckedHandle(zone, arguments->NativeArgAt(0)).Value());
+  const TokenPosition assertion_end = TokenPosition(
+      Smi::CheckedHandle(zone, arguments->NativeArgAt(1)).Value());
 
-  const Instance& message = Instance::CheckedHandle(arguments->NativeArgAt(2));
-  const Array& args = Array::Handle(Array::New(5));
+  const Instance& message =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(2));
+  const Array& args = Array::Handle(zone, Array::New(5));
 
   DartFrameIterator iterator(thread,
                              StackFrameIterator::kNoCrossThreadIteration);
@@ -107,23 +112,21 @@
 // Arg1: src value.
 // Arg2: dst type.
 // Arg3: dst name.
-// Arg4: type error message.
 // Return value: none, throws an exception.
-DEFINE_NATIVE_ENTRY(TypeError_throwNew, 5) {
+DEFINE_NATIVE_ENTRY(TypeError_throwNew, 0, 4) {
   // No need to type check the arguments. This function can only be called
   // internally from the VM.
-  const TokenPosition location =
-      TokenPosition(Smi::CheckedHandle(arguments->NativeArgAt(0)).Value());
+  const TokenPosition location = TokenPosition(
+      Smi::CheckedHandle(zone, arguments->NativeArgAt(0)).Value());
   const Instance& src_value =
-      Instance::CheckedHandle(arguments->NativeArgAt(1));
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(1));
   const AbstractType& dst_type =
-      AbstractType::CheckedHandle(arguments->NativeArgAt(2));
-  const String& dst_name = String::CheckedHandle(arguments->NativeArgAt(3));
-  const String& error_msg = String::CheckedHandle(arguments->NativeArgAt(4));
+      AbstractType::CheckedHandle(zone, arguments->NativeArgAt(2));
+  const String& dst_name =
+      String::CheckedHandle(zone, arguments->NativeArgAt(3));
   const AbstractType& src_type =
       AbstractType::Handle(src_value.GetType(Heap::kNew));
-  Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name,
-                                      error_msg);
+  Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name);
   UNREACHABLE();
   return Object::null();
 }
@@ -131,7 +134,7 @@
 // Allocate and throw a new FallThroughError.
 // Arg0: index of the case clause token into which we fall through.
 // Return value: none, throws an exception.
-DEFINE_NATIVE_ENTRY(FallThroughError_throwNew, 1) {
+DEFINE_NATIVE_ENTRY(FallThroughError_throwNew, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, smi_pos, arguments->NativeArgAt(0));
   TokenPosition fallthrough_pos = TokenPosition(smi_pos.Value());
 
@@ -156,7 +159,7 @@
 // Arg0: Token position of allocation statement.
 // Arg1: class name of the abstract class that cannot be instantiated.
 // Return value: none, throws an exception.
-DEFINE_NATIVE_ENTRY(AbstractClassInstantiationError_throwNew, 2) {
+DEFINE_NATIVE_ENTRY(AbstractClassInstantiationError_throwNew, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, smi_pos, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(String, class_name, arguments->NativeArgAt(1));
   TokenPosition error_pos = TokenPosition(smi_pos.Value());
@@ -180,7 +183,7 @@
 }
 
 // Rethrow an error with a stacktrace.
-DEFINE_NATIVE_ENTRY(Async_rethrow, 2) {
+DEFINE_NATIVE_ENTRY(Async_rethrow, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, error, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, stacktrace, arguments->NativeArgAt(1));
   Exceptions::ReThrow(thread, error, stacktrace);
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 4f53173..1fd86bd 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -86,19 +86,7 @@
       : super._create("is assignable", url, line, column, errorMsg);
 
   static _throwNew(int location, Object src_value, _Type dst_type,
-      String dst_name, String bound_error_msg) native "TypeError_throwNew";
-
-  static _throwNewIfNotLoaded(
-      _LibraryPrefix prefix,
-      int location,
-      Object src_value,
-      _Type dst_type,
-      String dst_name,
-      String bound_error_msg) {
-    if (!prefix.isLoaded()) {
-      _throwNew(location, src_value, dst_type, dst_name, bound_error_msg);
-    }
-  }
+      String dst_name) native "TypeError_throwNew";
 
   String toString() => super.message;
 }
diff --git a/runtime/lib/function.cc b/runtime/lib/function.cc
index 0a50260..4311238 100644
--- a/runtime/lib/function.cc
+++ b/runtime/lib/function.cc
@@ -13,7 +13,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Function_apply, 2) {
+DEFINE_NATIVE_ENTRY(Function_apply, 0, 2) {
   const int kTypeArgsLen = 0;  // TODO(regis): Add support for generic function.
   const Array& fun_arguments =
       Array::CheckedHandle(zone, arguments->NativeArgAt(0));
@@ -30,7 +30,7 @@
   return result.raw();
 }
 
-DEFINE_NATIVE_ENTRY(Closure_equals, 2) {
+DEFINE_NATIVE_ENTRY(Closure_equals, 0, 2) {
   const Closure& receiver =
       Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(Instance, other, arguments->NativeArgAt(1));
@@ -65,13 +65,13 @@
   return Bool::False().raw();
 }
 
-DEFINE_NATIVE_ENTRY(Closure_computeHash, 1) {
+DEFINE_NATIVE_ENTRY(Closure_computeHash, 0, 1) {
   const Closure& receiver =
       Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Smi::New(receiver.ComputeHash());
 }
 
-DEFINE_NATIVE_ENTRY(Closure_clone, 1) {
+DEFINE_NATIVE_ENTRY(Closure_clone, 0, 1) {
   const Closure& receiver =
       Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
   const TypeArguments& instantiator_type_arguments =
diff --git a/runtime/lib/function.dart b/runtime/lib/function.dart
index 8a47f00..ae3902a 100644
--- a/runtime/lib/function.dart
+++ b/runtime/lib/function.dart
@@ -9,9 +9,7 @@
   bool operator ==(Object other) native "Closure_equals";
 
   int get hashCode {
-    if (_hash == null) {
-      _hash = _computeHash();
-    }
+    _hash ??= _computeHash();
     return _hash;
   }
 
diff --git a/runtime/lib/growable_array.cc b/runtime/lib/growable_array.cc
index 6f7f254..71d9f2a 100644
--- a/runtime/lib/growable_array.cc
+++ b/runtime/lib/growable_array.cc
@@ -11,9 +11,9 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(GrowableList_allocate, 2) {
+DEFINE_NATIVE_ENTRY(GrowableList_allocate, 0, 2) {
   const TypeArguments& type_arguments =
-      TypeArguments::CheckedHandle(arguments->NativeArgAt(0));
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Array, data, arguments->NativeArgAt(1));
   if (data.Length() < 0) {
     Exceptions::ThrowRangeError("length",
@@ -27,20 +27,20 @@
   return new_array.raw();
 }
 
-DEFINE_NATIVE_ENTRY(GrowableList_getIndexed, 2) {
+DEFINE_NATIVE_ENTRY(GrowableList_getIndexed, 0, 2) {
   const GrowableObjectArray& array =
-      GrowableObjectArray::CheckedHandle(arguments->NativeArgAt(0));
+      GrowableObjectArray::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1));
   if ((index.Value() < 0) || (index.Value() >= array.Length())) {
     Exceptions::ThrowRangeError("index", index, 0, array.Length() - 1);
   }
-  const Instance& obj = Instance::CheckedHandle(array.At(index.Value()));
+  const Instance& obj = Instance::CheckedHandle(zone, array.At(index.Value()));
   return obj.raw();
 }
 
-DEFINE_NATIVE_ENTRY(GrowableList_setIndexed, 3) {
+DEFINE_NATIVE_ENTRY(GrowableList_setIndexed, 0, 3) {
   const GrowableObjectArray& array =
-      GrowableObjectArray::CheckedHandle(arguments->NativeArgAt(0));
+      GrowableObjectArray::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1));
   if ((index.Value() < 0) || (index.Value() >= array.Length())) {
     Exceptions::ThrowRangeError("index", index, 0, array.Length() - 1);
@@ -50,43 +50,43 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(GrowableList_getLength, 1) {
+DEFINE_NATIVE_ENTRY(GrowableList_getLength, 0, 1) {
   const GrowableObjectArray& array =
-      GrowableObjectArray::CheckedHandle(arguments->NativeArgAt(0));
+      GrowableObjectArray::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Smi::New(array.Length());
 }
 
-DEFINE_NATIVE_ENTRY(GrowableList_getCapacity, 1) {
+DEFINE_NATIVE_ENTRY(GrowableList_getCapacity, 0, 1) {
   const GrowableObjectArray& array =
-      GrowableObjectArray::CheckedHandle(arguments->NativeArgAt(0));
+      GrowableObjectArray::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Smi::New(array.Capacity());
 }
 
-DEFINE_NATIVE_ENTRY(GrowableList_setLength, 2) {
+DEFINE_NATIVE_ENTRY(GrowableList_setLength, 0, 2) {
   const GrowableObjectArray& array =
-      GrowableObjectArray::CheckedHandle(arguments->NativeArgAt(0));
+      GrowableObjectArray::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(1));
   ASSERT((length.Value() >= 0) && (length.Value() <= array.Capacity()));
   array.SetLength(length.Value());
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(GrowableList_setData, 2) {
+DEFINE_NATIVE_ENTRY(GrowableList_setData, 0, 2) {
   const GrowableObjectArray& array =
-      GrowableObjectArray::CheckedHandle(arguments->NativeArgAt(0));
+      GrowableObjectArray::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Array, data, arguments->NativeArgAt(1));
   ASSERT(data.Length() >= 0);
   array.SetData(data);
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Internal_makeListFixedLength, 1) {
+DEFINE_NATIVE_ENTRY(Internal_makeListFixedLength, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(GrowableObjectArray, array,
                                arguments->NativeArgAt(0));
   return Array::MakeFixedLength(array, /* unique = */ true);
 }
 
-DEFINE_NATIVE_ENTRY(Internal_makeFixedListUnmodifiable, 1) {
+DEFINE_NATIVE_ENTRY(Internal_makeFixedListUnmodifiable, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Array, array, arguments->NativeArgAt(0));
   array.MakeImmutable();
   return array.raw();
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index d23632f..0dbe008 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -224,7 +224,6 @@
     if (length == 1) return this[0];
     if (length == 0) throw IterableElementError.noElement();
     throw IterableElementError.tooMany();
-    ;
   }
 
   // Shared array used as backing for new empty growable arrays.
diff --git a/runtime/lib/identical.cc b/runtime/lib/identical.cc
index bbb47bd..c0d2b96 100644
--- a/runtime/lib/identical.cc
+++ b/runtime/lib/identical.cc
@@ -8,7 +8,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Identical_comparison, 2) {
+DEFINE_NATIVE_ENTRY(Identical_comparison, 0, 2) {
   GET_NATIVE_ARGUMENT(Instance, a, arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(Instance, b, arguments->NativeArgAt(1));
   const bool is_identical = a.IsIdenticalTo(b);
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index 3f1c653..c66299f 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -16,11 +16,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool,
-            trace_intrinsified_natives,
-            false,
-            "Report if any of the intrinsified natives are called");
-
 // Smi natives.
 
 // Returns false if integer is in wrong representation, e.g., as is a Mint
@@ -33,8 +28,9 @@
   return true;
 }
 
-DEFINE_NATIVE_ENTRY(Integer_bitAndFromInteger, 2) {
-  const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_bitAndFromInteger, 0, 2) {
+  const Integer& right =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right));
   ASSERT(CheckInteger(left));
@@ -45,8 +41,9 @@
   return left.BitOp(Token::kBIT_AND, right);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 2) {
-  const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 0, 2) {
+  const Integer& right =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right));
   ASSERT(CheckInteger(left));
@@ -57,8 +54,9 @@
   return left.BitOp(Token::kBIT_OR, right);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 2) {
-  const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 0, 2) {
+  const Integer& right =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right));
   ASSERT(CheckInteger(left));
@@ -69,8 +67,9 @@
   return left.BitOp(Token::kBIT_XOR, right);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 2) {
-  const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 0, 2) {
+  const Integer& right_int =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right_int));
   ASSERT(CheckInteger(left_int));
@@ -81,8 +80,9 @@
   return left_int.ArithmeticOp(Token::kADD, right_int);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 2) {
-  const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 0, 2) {
+  const Integer& right_int =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right_int));
   ASSERT(CheckInteger(left_int));
@@ -93,8 +93,9 @@
   return left_int.ArithmeticOp(Token::kSUB, right_int);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 2) {
-  const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 0, 2) {
+  const Integer& right_int =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right_int));
   ASSERT(CheckInteger(left_int));
@@ -105,8 +106,9 @@
   return left_int.ArithmeticOp(Token::kMUL, right_int);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_truncDivFromInteger, 2) {
-  const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_truncDivFromInteger, 0, 2) {
+  const Integer& right_int =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right_int));
   ASSERT(CheckInteger(left_int));
@@ -114,8 +116,9 @@
   return left_int.ArithmeticOp(Token::kTRUNCDIV, right_int);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 2) {
-  const Integer& right_int = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 0, 2) {
+  const Integer& right_int =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left_int, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right_int));
   ASSERT(CheckInteger(left_int));
@@ -130,8 +133,9 @@
   return left_int.ArithmeticOp(Token::kMOD, right_int);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_greaterThanFromInteger, 2) {
-  const Integer& right = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_greaterThanFromInteger, 0, 2) {
+  const Integer& right =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, left, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(right));
   ASSERT(CheckInteger(left));
@@ -142,8 +146,8 @@
   return Bool::Get(left.CompareWith(right) == 1).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Integer_equalToInteger, 2) {
-  const Integer& left = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_equalToInteger, 0, 2) {
+  const Integer& left = Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, right, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(left));
   ASSERT(CheckInteger(right));
@@ -172,26 +176,15 @@
     }
   }
 
-  const String* int_string;
-  bool is_positive;
-  if (Scanner::IsValidInteger(value, &is_positive, &int_string)) {
-    if (is_positive) {
-      return Integer::New(*int_string);
-    }
-    String& temp = String::Handle();
-    temp = String::Concat(Symbols::Dash(), *int_string);
-    return Integer::New(temp);
-  }
-
-  return Integer::null();
+  return Integer::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_parse, 1) {
+DEFINE_NATIVE_ENTRY(Integer_parse, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, value, arguments->NativeArgAt(0));
   return ParseInteger(value);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_fromEnvironment, 3) {
+DEFINE_NATIVE_ENTRY(Integer_fromEnvironment, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(Integer, default_value, arguments->NativeArgAt(2));
   // Call the embedder to supply us with the environment.
@@ -218,8 +211,9 @@
   return value.ShiftOp(kind, amount, Heap::kNew);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_shrFromInteger, 2) {
-  const Integer& amount = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_shrFromInteger, 0, 2) {
+  const Integer& amount =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(amount));
   ASSERT(CheckInteger(value));
@@ -230,8 +224,9 @@
   return ShiftOperationHelper(Token::kSHR, value, amount);
 }
 
-DEFINE_NATIVE_ENTRY(Integer_shlFromInteger, 2) {
-  const Integer& amount = Integer::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Integer_shlFromInteger, 0, 2) {
+  const Integer& amount =
+      Integer::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
   ASSERT(CheckInteger(amount));
   ASSERT(CheckInteger(value));
@@ -242,8 +237,8 @@
   return ShiftOperationHelper(Token::kSHL, value, amount);
 }
 
-DEFINE_NATIVE_ENTRY(Smi_bitAndFromSmi, 2) {
-  const Smi& left = Smi::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Smi_bitAndFromSmi, 0, 2) {
+  const Smi& left = Smi::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, right, arguments->NativeArgAt(1));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Smi_bitAndFromSmi %s & %s\n", left.ToCString(),
@@ -254,8 +249,8 @@
   return Smi::New(left_value.Value() & right_value.Value());
 }
 
-DEFINE_NATIVE_ENTRY(Smi_bitNegate, 1) {
-  const Smi& operand = Smi::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Smi_bitNegate, 0, 1) {
+  const Smi& operand = Smi::CheckedHandle(zone, arguments->NativeArgAt(0));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Smi_bitNegate: %s\n", operand.ToCString());
   }
@@ -264,8 +259,8 @@
   return Smi::New(result);
 }
 
-DEFINE_NATIVE_ENTRY(Smi_bitLength, 1) {
-  const Smi& operand = Smi::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Smi_bitLength, 0, 1) {
+  const Smi& operand = Smi::CheckedHandle(zone, arguments->NativeArgAt(0));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Smi_bitLength: %s\n", operand.ToCString());
   }
@@ -277,8 +272,8 @@
 
 // Mint natives.
 
-DEFINE_NATIVE_ENTRY(Mint_bitNegate, 1) {
-  const Mint& operand = Mint::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Mint_bitNegate, 0, 1) {
+  const Mint& operand = Mint::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(CheckInteger(operand));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Mint_bitNegate: %s\n", operand.ToCString());
@@ -287,8 +282,8 @@
   return Integer::New(result);
 }
 
-DEFINE_NATIVE_ENTRY(Mint_bitLength, 1) {
-  const Mint& operand = Mint::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Mint_bitLength, 0, 1) {
+  const Mint& operand = Mint::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(CheckInteger(operand));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Mint_bitLength: %s\n", operand.ToCString());
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index 3e427c4..2289012 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -4,15 +4,15 @@
 
 // part of "core_patch.dart";
 
-// This marker interface represents 64-bit integers in the compiler for type
-// propagation and range analysis.  It is implemented by _Smi and _Mint.
-abstract class _int64 implements int {}
-
 abstract class _IntegerImplementation implements int {
+  @pragma("vm:non-nullable-result-type")
   num operator +(num other) => other._addFromInteger(this);
+  @pragma("vm:non-nullable-result-type")
   num operator -(num other) => other._subFromInteger(this);
+  @pragma("vm:non-nullable-result-type")
   num operator *(num other) => other._mulFromInteger(this);
 
+  @pragma("vm:non-nullable-result-type")
   int operator ~/(num other) {
     if ((other is int) && (other == 0)) {
       throw const IntegerDivisionByZeroException();
@@ -24,6 +24,7 @@
     return this.toDouble() / other.toDouble();
   }
 
+  @pragma("vm:non-nullable-result-type")
   num operator %(num other) {
     if ((other is int) && (other == 0)) {
       throw const IntegerDivisionByZeroException();
@@ -31,34 +32,51 @@
     return other._moduloFromInteger(this);
   }
 
+  @pragma("vm:non-nullable-result-type")
   int operator -() {
     return 0 - this;
   }
 
+  @pragma("vm:non-nullable-result-type")
   int operator &(int other) => other._bitAndFromInteger(this);
+  @pragma("vm:non-nullable-result-type")
   int operator |(int other) => other._bitOrFromInteger(this);
+  @pragma("vm:non-nullable-result-type")
   int operator ^(int other) => other._bitXorFromInteger(this);
 
   num remainder(num other) {
     return other._remainderFromInteger(this);
   }
 
+  @pragma("vm:non-nullable-result-type")
   int _bitAndFromSmi(_Smi other) native "Integer_bitAndFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _bitAndFromInteger(int other) native "Integer_bitAndFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _bitOrFromInteger(int other) native "Integer_bitOrFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _bitXorFromInteger(int other) native "Integer_bitXorFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _shrFromInteger(int other) native "Integer_shrFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _shlFromInteger(int other) native "Integer_shlFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _addFromInteger(int other) native "Integer_addFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _subFromInteger(int other) native "Integer_subFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _mulFromInteger(int other) native "Integer_mulFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _truncDivFromInteger(int other) native "Integer_truncDivFromInteger";
+  @pragma("vm:non-nullable-result-type")
   int _moduloFromInteger(int other) native "Integer_moduloFromInteger";
   int _remainderFromInteger(int other) {
     return other - (other ~/ this) * this;
   }
 
+  @pragma("vm:non-nullable-result-type")
   int operator >>(int other) => other._shrFromInteger(this);
+  @pragma("vm:non-nullable-result-type")
   int operator <<(int other) => other._shlFromInteger(this);
 
   @pragma("vm:exact-result-type", bool)
@@ -460,7 +478,7 @@
 }
 
 @pragma("vm:entry-point")
-class _Smi extends _IntegerImplementation implements _int64 {
+class _Smi extends _IntegerImplementation {
   factory _Smi._uninstantiable() {
     throw new UnsupportedError("_Smi can only be allocated by the VM");
   }
@@ -662,13 +680,15 @@
 
 // Represents integers that cannot be represented by Smi but fit into 64bits.
 @pragma("vm:entry-point")
-class _Mint extends _IntegerImplementation implements _int64 {
+class _Mint extends _IntegerImplementation {
   factory _Mint._uninstantiable() {
     throw new UnsupportedError("_Mint can only be allocated by the VM");
   }
   int get hashCode => this;
   int get _identityHashCode => this;
+  @pragma("vm:non-nullable-result-type")
   int operator ~() native "Mint_bitNegate";
+  @pragma("vm:exact-result-type", "dart:core#_Smi")
   int get bitLength native "Mint_bitLength";
 
   int _bitAndFromSmi(_Smi other) => _bitAndFromInteger(other);
diff --git a/runtime/lib/integers_patch.dart b/runtime/lib/integers_patch.dart
index a871e7c..dc0a20a 100644
--- a/runtime/lib/integers_patch.dart
+++ b/runtime/lib/integers_patch.dart
@@ -49,7 +49,9 @@
   @patch
   static int parse(String source, {int radix, int onError(String source)}) {
     if (source == null) throw new ArgumentError("The source must not be null");
-    if (source.isEmpty) return _throwFormatException(onError, source, 0, radix);
+    if (source.isEmpty) {
+      return _throwFormatException(onError, source, 0, radix, null);
+    }
     if (radix == null || radix == 10) {
       // Try parsing immediately, without trimming whitespace.
       int result = _tryParseSmi(source, 0, source.length - 1);
@@ -64,7 +66,7 @@
   static int _parse(_StringBase source, int radix, onError) {
     int end = source._lastNonWhitespace() + 1;
     if (end == 0) {
-      return _throwFormatException(onError, source, source.length, radix);
+      return _throwFormatException(onError, source, source.length, radix, null);
     }
     int start = source._firstNonWhitespace();
 
@@ -74,7 +76,7 @@
       sign = 0x2c - first; // -1 if '-', +1 if '+'.
       start++;
       if (start == end) {
-        return _throwFormatException(onError, source, end, radix);
+        return _throwFormatException(onError, source, end, radix, null);
       }
       first = source.codeUnitAt(start);
     }
@@ -88,22 +90,14 @@
         if ((first | 0x20) == 0x78 /* x */) {
           index++;
           if (index == end) {
-            return _throwFormatException(onError, source, index, null);
+            return _throwFormatException(onError, source, index, null, null);
           }
-          int result = _parseRadix(source, 16, index, end, sign, sign > 0);
-          if (result == null) {
-            return _throwFormatException(onError, source, null, null);
-          }
-          return result;
+          return _parseRadix(source, 16, index, end, sign, sign > 0, onError);
         }
       }
       radix = 10;
     }
-    int result = _parseRadix(source, radix, start, end, sign, false);
-    if (result == null) {
-      return _throwFormatException(onError, source, null, radix);
-    }
-    return result;
+    return _parseRadix(source, radix, start, end, sign, false, onError);
   }
 
   @patch
@@ -117,28 +111,37 @@
     } else if (radix < 2 || radix > 36) {
       throw new RangeError("Radix $radix not in range 2..36");
     }
-    return _parse(source, radix, _kNull);
+    try {
+      return _parse(source, radix, _kNull);
+    } catch (e) {
+      return null;
+    }
   }
 
   static Null _kNull(_) => null;
 
-  static int _throwFormatException(onError, source, index, radix) {
+  static int _throwFormatException(onError, source, index, radix, message) {
     if (onError != null) return onError(source);
+    if (message != null) {
+      throw new FormatException(message, source, index);
+    }
     if (radix == null) {
       throw new FormatException("Invalid number", source, index);
     }
     throw new FormatException("Invalid radix-$radix number", source, index);
   }
 
-  static int _parseRadix(
-      String source, int radix, int start, int end, int sign, bool allowU64) {
+  static int _parseRadix(String source, int radix, int start, int end, int sign,
+      bool allowU64, onError) {
     int tableIndex = (radix - 2) * 4 + (is64Bit ? 2 : 0);
     int blockSize = _PARSE_LIMITS[tableIndex];
     int length = end - start;
     if (length <= blockSize) {
       _Smi smi = _parseBlock(source, radix, start, end);
-      if (smi != null) return sign * smi;
-      return null;
+      if (smi == null) {
+        return _throwFormatException(onError, source, start, radix, null);
+      }
+      return sign * smi;
     }
 
     // Often cheaper than: int smallBlockSize = length % blockSize;
@@ -150,7 +153,9 @@
     if (smallBlockSize > 0) {
       int blockEnd = start + smallBlockSize;
       _Smi smi = _parseBlock(source, radix, start, blockEnd);
-      if (smi == null) return null;
+      if (smi == null) {
+        return _throwFormatException(onError, source, start, radix, null);
+      }
       result = sign * smi;
       start = blockEnd;
     }
@@ -166,7 +171,9 @@
     int blockEnd = start + blockSize;
     do {
       _Smi smi = _parseBlock(source, radix, start, blockEnd);
-      if (smi == null) return null;
+      if (smi == null) {
+        return _throwFormatException(onError, source, start, radix, null);
+      }
       if (result >= positiveOverflowLimit) {
         if ((result > positiveOverflowLimit) ||
             (smi > _int64OverflowLimits[tableIndex + 2])) {
@@ -181,12 +188,14 @@
               blockEnd + blockSize > end) {
             return (result * multiplier) + smi;
           }
-          return null;
+          return _throwFormatException(onError, source, null, radix,
+              "Positive input exceeds the limit of integer");
         }
       } else if (result <= negativeOverflowLimit) {
         if ((result < negativeOverflowLimit) ||
             (smi > _int64OverflowLimits[tableIndex + 3])) {
-          return null;
+          return _throwFormatException(onError, source, null, radix,
+              "Negative input exceeds the limit of integer");
         }
       }
       result = (result * multiplier) + (sign * smi);
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 261ed5d..b925147 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -25,19 +25,20 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(CapabilityImpl_factory, 1) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(CapabilityImpl_factory, 0, 1) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   uint64_t id = isolate->random()->NextUInt64();
   return Capability::New(id);
 }
 
-DEFINE_NATIVE_ENTRY(CapabilityImpl_equals, 2) {
+DEFINE_NATIVE_ENTRY(CapabilityImpl_equals, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Capability, recv, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Capability, other, arguments->NativeArgAt(1));
   return (recv.Id() == other.Id()) ? Bool::True().raw() : Bool::False().raw();
 }
 
-DEFINE_NATIVE_ENTRY(CapabilityImpl_get_hashcode, 1) {
+DEFINE_NATIVE_ENTRY(CapabilityImpl_get_hashcode, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Capability, cap, arguments->NativeArgAt(0));
   int64_t id = cap.Id();
   int32_t hi = static_cast<int32_t>(id >> 32);
@@ -46,35 +47,36 @@
   return Smi::New(hash);
 }
 
-DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 1) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 1) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   Dart_Port port_id = PortMap::CreatePort(isolate->message_handler());
   return ReceivePort::New(port_id, false /* not control port */);
 }
 
-DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 1) {
+DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(ReceivePort, port, arguments->NativeArgAt(0));
   return Integer::New(port.Id());
 }
 
-DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_sendport, 1) {
+DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_sendport, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(ReceivePort, port, arguments->NativeArgAt(0));
   return port.send_port();
 }
 
-DEFINE_NATIVE_ENTRY(RawReceivePortImpl_closeInternal, 1) {
+DEFINE_NATIVE_ENTRY(RawReceivePortImpl_closeInternal, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(ReceivePort, port, arguments->NativeArgAt(0));
   Dart_Port id = port.Id();
   PortMap::ClosePort(id);
   return Integer::New(id);
 }
 
-DEFINE_NATIVE_ENTRY(SendPortImpl_get_id, 1) {
+DEFINE_NATIVE_ENTRY(SendPortImpl_get_id, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   return Integer::New(port.Id());
 }
 
-DEFINE_NATIVE_ENTRY(SendPortImpl_get_hashcode, 1) {
+DEFINE_NATIVE_ENTRY(SendPortImpl_get_hashcode, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   int64_t id = port.Id();
   int32_t hi = static_cast<int32_t>(id >> 32);
@@ -83,7 +85,7 @@
   return Smi::New(hash);
 }
 
-DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 2) {
+DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   // TODO(iposva): Allow for arbitrary messages to be sent.
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1));
@@ -180,7 +182,7 @@
   return result;
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 10) {
+DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 0, 10) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(String, script_uri, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(2));
@@ -228,6 +230,10 @@
           isolate->spawn_count_monitor(), isolate->spawn_count(),
           utf8_package_root, utf8_package_config, paused.value(), fatal_errors,
           on_exit_port, on_error_port);
+
+      // Since this is a call to Isolate.spawn, copy the parent isolate's code.
+      state->isolate_flags()->copy_parent_code = true;
+
       ThreadPool::Task* spawn_task = new SpawnIsolateTask(state);
 
       isolate->IncrementSpawnCount();
@@ -255,14 +261,9 @@
   const char* result = NULL;
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
-  Dart_LibraryTagHandler handler = isolate->library_tag_handler();
-  if (handler != NULL) {
-    TransitionVMToNative transition(thread);
-    Dart_EnterScope();
-    Dart_Handle handle =
-        handler(Dart_kCanonicalizeUrl, Api::NewHandle(thread, library.raw()),
-                Api::NewHandle(thread, uri.raw()));
-    const Object& obj = Object::Handle(Api::UnwrapHandle(handle));
+  if (isolate->HasTagHandler()) {
+    const Object& obj = Object::Handle(
+        isolate->CallTagHandler(Dart_kCanonicalizeUrl, library, uri));
     if (obj.IsString()) {
       result = String2UTF8(String::Cast(obj));
     } else if (obj.IsError()) {
@@ -276,7 +277,6 @@
           "library tag handler returned wrong type",
           uri.ToCString());
     }
-    Dart_ExitScope();
   } else {
     *error = zone->PrintToString(
         "Unable to canonicalize uri '%s': no library tag handler found.",
@@ -285,7 +285,7 @@
   return result;
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 12) {
+DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 0, 12) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(String, uri, arguments->NativeArgAt(1));
 
@@ -357,13 +357,13 @@
   // If we were passed a value then override the default flags state for
   // checked mode.
   if (!checked.IsNull()) {
-    bool is_checked = checked.value();
     Dart_IsolateFlags* flags = state->isolate_flags();
-    flags->enable_asserts = is_checked;
-    // Do not enable type checks in strong mode.
-    flags->enable_type_checks = is_checked && !FLAG_strong;
+    flags->enable_asserts = checked.value();
   }
 
+  // Since this is a call to Isolate.spawnUri, don't copy the parent's code.
+  state->isolate_flags()->copy_parent_code = false;
+
   ThreadPool::Task* spawn_task = new SpawnIsolateTask(state);
 
   isolate->IncrementSpawnCount();
@@ -378,7 +378,7 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0) {
+DEFINE_NATIVE_ENTRY(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0, 0) {
   const Array& result = Array::Handle(Array::New(3));
   result.SetAt(0, SendPort::Handle(SendPort::New(isolate->main_port())));
   result.SetAt(
@@ -388,13 +388,13 @@
   return result.raw();
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_getCurrentRootUriStr, 0) {
+DEFINE_NATIVE_ENTRY(Isolate_getCurrentRootUriStr, 0, 0) {
   const Library& root_lib =
       Library::Handle(zone, isolate->object_store()->root_library());
   return root_lib.url();
 }
 
-DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 2) {
+DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Array, msg, arguments->NativeArgAt(1));
 
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 0767bb6..972d9af 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -458,7 +458,7 @@
           packageRootString,
           packageConfigString);
       return await _spawnCommon(readyPort);
-    } catch (e, st) {
+    } catch (e) {
       if (readyPort != null) {
         readyPort.close();
       }
@@ -632,7 +632,7 @@
   static Uri _getCurrentRootUri() {
     try {
       return Uri.parse(_getCurrentRootUriStr());
-    } catch (e, s) {
+    } catch (e) {
       return null;
     }
   }
diff --git a/runtime/lib/lib_prefix.dart b/runtime/lib/lib_prefix.dart
index 8b1fed1..c895931 100644
--- a/runtime/lib/lib_prefix.dart
+++ b/runtime/lib/lib_prefix.dart
@@ -54,7 +54,6 @@
   // which have not completed, remember them for next time in
   // stillOutstandingLoadRequests.
   var stillOutstandingLoadRequests = new List<List>();
-  var completedLoadRequests = new List<List>();
 
   // Make a copy of the outstandingRequests because the call to _load below
   // may recursively trigger another call to |_completeDeferredLoads|, which
diff --git a/runtime/lib/linked_hash_map.cc b/runtime/lib/linked_hash_map.cc
index 94f7a27..89ad2bb 100644
--- a/runtime/lib/linked_hash_map.cc
+++ b/runtime/lib/linked_hash_map.cc
@@ -12,72 +12,73 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_getIndex, 1) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_getIndex, 0, 1) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
   return map.index();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_setIndex, 2) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_setIndex, 0, 2) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
-  const TypedData& index = TypedData::CheckedHandle(arguments->NativeArgAt(1));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const TypedData& index =
+      TypedData::CheckedHandle(zone, arguments->NativeArgAt(1));
   map.SetIndex(index);
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_getData, 1) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_getData, 0, 1) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
   return map.data();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_setData, 2) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_setData, 0, 2) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
-  const Array& data = Array::CheckedHandle(arguments->NativeArgAt(1));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Array& data = Array::CheckedHandle(zone, arguments->NativeArgAt(1));
   map.SetData(data);
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_getHashMask, 1) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_getHashMask, 0, 1) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
   return map.hash_mask();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_setHashMask, 2) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_setHashMask, 0, 2) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
-  const Smi& hashMask = Smi::CheckedHandle(arguments->NativeArgAt(1));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Smi& hashMask = Smi::CheckedHandle(zone, arguments->NativeArgAt(1));
   map.SetHashMask(hashMask.Value());
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_getDeletedKeys, 1) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_getDeletedKeys, 0, 1) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
   return map.deleted_keys();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_setDeletedKeys, 2) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_setDeletedKeys, 0, 2) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
-  const Smi& deletedKeys = Smi::CheckedHandle(arguments->NativeArgAt(1));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Smi& deletedKeys = Smi::CheckedHandle(zone, arguments->NativeArgAt(1));
   map.SetDeletedKeys(deletedKeys.Value());
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_getUsedData, 1) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_getUsedData, 0, 1) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
   return map.used_data();
 }
 
-DEFINE_NATIVE_ENTRY(LinkedHashMap_setUsedData, 2) {
+DEFINE_NATIVE_ENTRY(LinkedHashMap_setUsedData, 0, 2) {
   const LinkedHashMap& map =
-      LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
-  const Smi& usedData = Smi::CheckedHandle(arguments->NativeArgAt(1));
+      LinkedHashMap::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Smi& usedData = Smi::CheckedHandle(zone, arguments->NativeArgAt(1));
   map.SetUsedData(usedData.Value());
   return Object::null();
 }
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index 6b6ac56..b4a5bfd 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -9,65 +9,64 @@
 #include "vm/exceptions.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
-#include "vm/scanner.h"
 #include "vm/symbols.h"
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Math_sqrt, 1) {
+DEFINE_NATIVE_ENTRY(Math_sqrt, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(sqrt(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_sin, 1) {
+DEFINE_NATIVE_ENTRY(Math_sin, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(sin(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_cos, 1) {
+DEFINE_NATIVE_ENTRY(Math_cos, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(cos(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_tan, 1) {
+DEFINE_NATIVE_ENTRY(Math_tan, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(tan(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_asin, 1) {
+DEFINE_NATIVE_ENTRY(Math_asin, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(asin(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_acos, 1) {
+DEFINE_NATIVE_ENTRY(Math_acos, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(acos(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_atan, 1) {
+DEFINE_NATIVE_ENTRY(Math_atan, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(atan(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_atan2, 2) {
+DEFINE_NATIVE_ENTRY(Math_atan2, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand1, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand2, arguments->NativeArgAt(1));
   return Double::New(atan2_ieee(operand1.value(), operand2.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_exp, 1) {
+DEFINE_NATIVE_ENTRY(Math_exp, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(exp(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_log, 1) {
+DEFINE_NATIVE_ENTRY(Math_log, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Double, operand, arguments->NativeArgAt(0));
   return Double::New(log(operand.value()));
 }
 
-DEFINE_NATIVE_ENTRY(Math_doublePow, 2) {
+DEFINE_NATIVE_ENTRY(Math_doublePow, 0, 2) {
   const double operand =
-      Double::CheckedHandle(arguments->NativeArgAt(0)).value();
+      Double::CheckedHandle(zone, arguments->NativeArgAt(0)).value();
   GET_NON_NULL_NATIVE_ARGUMENT(Double, exponent_object,
                                arguments->NativeArgAt(1));
   const double exponent = exponent_object.value();
@@ -95,7 +94,7 @@
 //       ((_A * (_state[_kSTATE_LO])) + _state[_kSTATE_HI]) & (1 << 64) - 1);
 //   _state[_kSTATE_LO] = state & (1 << 32) - 1);
 //   _state[_kSTATE_HI] = state >> 32;
-DEFINE_NATIVE_ENTRY(Random_nextState, 1) {
+DEFINE_NATIVE_ENTRY(Random_nextState, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, receiver, arguments->NativeArgAt(0));
   const TypedData& array = TypedData::Handle(GetRandomStateArray(receiver));
   const uint64_t state_lo = array.GetUint32(0);
@@ -144,7 +143,7 @@
 //   result[_kSTATE_LO] = seed & ((1 << 32) - 1);
 //   result[_kSTATE_HI] = seed >> 32;
 //   return result;
-DEFINE_NATIVE_ENTRY(Random_setupSeed, 1) {
+DEFINE_NATIVE_ENTRY(Random_setupSeed, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(0));
   uint64_t seed = mix64(static_cast<uint64_t>(seed_int.AsInt64Value()));
 
@@ -154,14 +153,14 @@
   return CreateRandomState(zone, seed);
 }
 
-DEFINE_NATIVE_ENTRY(Random_initialSeed, 0) {
+DEFINE_NATIVE_ENTRY(Random_initialSeed, 0, 0) {
   Random* rnd = isolate->random();
   uint64_t seed = rnd->NextUInt32();
   seed |= (static_cast<uint64_t>(rnd->NextUInt32()) << 32);
   return CreateRandomState(zone, seed);
 }
 
-DEFINE_NATIVE_ENTRY(SecureRandom_getBytes, 1) {
+DEFINE_NATIVE_ENTRY(SecureRandom_getBytes, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, count, arguments->NativeArgAt(0));
   const intptr_t n = count.Value();
   ASSERT((n > 0) && (n <= 8));
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index 73eb844..fb68674 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -245,7 +245,7 @@
   static const _POW2_27_D = 1.0 * (1 << 27);
 
   // Use a singleton Random object to get a new seed if no seed was passed.
-  static var _prng = new _Random._withState(_initialSeed());
+  static final _prng = new _Random._withState(_initialSeed());
 
   // This is a native to prevent 64-bit operations in Dart, which
   // fail with --throw_on_javascript_int_overflow.
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 5b64e98..d4916d0 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -23,11 +23,6 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
-#define PROPAGATE_IF_MALFORMED(type)                                           \
-  if (type.IsMalformed()) {                                                    \
-    Exceptions::PropagateError(Error::Handle(type.error()));                   \
-  }
-
 #define RETURN_OR_PROPAGATE(expr)                                              \
   RawObject* result = expr;                                                    \
   if (RawObject::IsErrorClassId(result->GetClassIdMayBeSmi())) {               \
@@ -220,7 +215,6 @@
   for (intptr_t i = 0; i < args.Length(); i++) {
     type ^= args.TypeAt(i);
     ASSERT(type.IsTypeParameter());
-    PROPAGATE_IF_MALFORMED(type);
     ASSERT(type.IsFinalized());
     name ^= type.name();
     result.SetAt(2 * i, name);
@@ -322,24 +316,16 @@
     return CreateTypedefMirror(cls, type, is_declaration, owner_mirror);
   }
 
-  const Array& args = Array::Handle(Array::New(10));
+  const Array& args = Array::Handle(Array::New(9));
   args.SetAt(0, MirrorReference::Handle(MirrorReference::New(cls)));
   args.SetAt(1, type);
-  // Note that the VM does not consider mixin application aliases to be mixin
-  // applications, so this only covers anonymous mixin applications. We do not
-  // set the names of anonymous mixin applications here because the mirrors
-  // use a different naming convention than the VM (lib.S with lib.M and S&M
-  // respectively).
-  if (!cls.IsMixinApplication()) {
-    args.SetAt(2, String::Handle(cls.Name()));
-  }
+  args.SetAt(2, String::Handle(cls.Name()));
   args.SetAt(3, owner_mirror);
   args.SetAt(4, Bool::Get(cls.is_abstract()));
   args.SetAt(5, Bool::Get(cls.IsGeneric()));
-  args.SetAt(6, Bool::Get(cls.is_mixin_app_alias()));
-  args.SetAt(7, Bool::Get(cls.is_transformed_mixin_application()));
-  args.SetAt(8, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration);
-  args.SetAt(9, Bool::Get(cls.is_enum_class()));
+  args.SetAt(6, Bool::Get(cls.is_transformed_mixin_application()));
+  args.SetAt(7, cls.NumTypeParameters() == 0 ? Bool::False() : is_declaration);
+  args.SetAt(8, Bool::Get(cls.is_enum_class()));
   return CreateMirror(Symbols::_LocalClassMirror(), args);
 }
 
@@ -433,7 +419,7 @@
   return CreateMirror(Symbols::_LocalLibraryDependencyMirror(), args);
 }
 
-DEFINE_NATIVE_ENTRY(LibraryMirror_fromPrefix, 1) {
+DEFINE_NATIVE_ENTRY(LibraryMirror_fromPrefix, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(LibraryPrefix, prefix,
                                arguments->NativeArgAt(0));
   const Library& deferred_lib = Library::Handle(prefix.GetLibrary(0));
@@ -443,7 +429,7 @@
   return CreateLibraryMirror(thread, deferred_lib);
 }
 
-DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) {
+DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, lib_mirror, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
   const Library& lib = Library::Handle(ref.GetLibraryReferent());
@@ -511,8 +497,7 @@
     return CreateTypeMirror(ref_type);
   }
   ASSERT(type.IsFinalized());
-  PROPAGATE_IF_MALFORMED(type);
-  ASSERT(type.IsCanonical() || type.IsTypeParameter() || type.IsBoundedType());
+  ASSERT(type.IsCanonical() || type.IsTypeParameter());
 
   if (type.IsFunctionType()) {
     const Class& scope_class = Class::Handle(Type::Cast(type).type_class());
@@ -523,7 +508,7 @@
       return CreateFunctionTypeMirror(type);
     }
   }
-  if (type.HasResolvedTypeClass()) {
+  if (type.HasTypeClass()) {
     const Class& cls = Class::Handle(type.type_class());
     // Handle void and dynamic types.
     if (cls.IsVoidClass()) {
@@ -539,10 +524,6 @@
   } else if (type.IsTypeParameter()) {
     return CreateTypeVariableMirror(TypeParameter::Cast(type),
                                     Object::null_instance());
-  } else if (type.IsBoundedType()) {
-    AbstractType& actual_type =
-        AbstractType::Handle(BoundedType::Cast(type).type());
-    return CreateTypeMirror(actual_type);
   }
   UNREACHABLE();
   return Instance::null();
@@ -591,8 +572,7 @@
   // Generic function type parameters are not reified, but mapped to dynamic,
   // i.e. all function type parameters are free with a null vector.
   ASSERT(type.IsFinalized());
-  PROPAGATE_IF_MALFORMED(type);
-  ASSERT(type.IsCanonical() || type.IsTypeParameter() || type.IsBoundedType());
+  ASSERT(type.IsCanonical() || type.IsTypeParameter());
 
   if (type.IsInstantiated()) {
     return type.Canonicalize();
@@ -600,22 +580,16 @@
   TypeArguments& instantiator_type_args = TypeArguments::Handle();
   if (!instantiator.IsNull()) {
     ASSERT(instantiator.IsFinalized());
-    PROPAGATE_IF_MALFORMED(instantiator);
     instantiator_type_args = instantiator.arguments();
   }
-  Error& bound_error = Error::Handle();
   AbstractType& result = AbstractType::Handle(type.InstantiateFrom(
-      instantiator_type_args, Object::null_type_arguments(), kAllFree,
-      &bound_error, NULL, NULL, Heap::kOld));
-  if (!bound_error.IsNull()) {
-    Exceptions::PropagateError(bound_error);
-    UNREACHABLE();
-  }
+      instantiator_type_args, Object::null_type_arguments(), kAllFree, NULL,
+      Heap::kOld));
   ASSERT(result.IsFinalized());
   return result.Canonicalize();
 }
 
-DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0) {
+DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0, 0) {
   const GrowableObjectArray& libraries =
       GrowableObjectArray::Handle(zone, isolate->object_store()->libraries());
 
@@ -635,7 +609,7 @@
   return library_mirrors.raw();
 }
 
-DEFINE_NATIVE_ENTRY(MirrorSystem_isolate, 0) {
+DEFINE_NATIVE_ENTRY(MirrorSystem_isolate, 0, 0) {
   VerifyMethodKindShifts();
 
   return CreateIsolateMirror();
@@ -647,11 +621,10 @@
   Exceptions::PropagateError(error);
 }
 
-DEFINE_NATIVE_ENTRY(IsolateMirror_loadUri, 1) {
+DEFINE_NATIVE_ENTRY(IsolateMirror_loadUri, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, uri, arguments->NativeArgAt(0));
 
-  Dart_LibraryTagHandler handler = isolate->library_tag_handler();
-  if (handler == NULL) {
+  if (!isolate->HasTagHandler()) {
     ThrowLanguageError("no library handler registered");
   }
 
@@ -663,16 +636,12 @@
     canonical_uri = uri.raw();
   } else {
     isolate->BlockClassFinalization();
-    Object& result = Object::Handle(zone);
-    {
-      TransitionVMToNative transition(thread);
-      Api::Scope api_scope(thread);
-      Dart_Handle retval = handler(
-          Dart_kCanonicalizeUrl,
-          Api::NewHandle(thread, isolate->object_store()->root_library()),
-          Api::NewHandle(thread, uri.raw()));
-      result = Api::UnwrapHandle(retval);
-    }
+    const Object& result = Object::Handle(
+        zone,
+        isolate->CallTagHandler(
+            Dart_kCanonicalizeUrl,
+            Library::Handle(zone, isolate->object_store()->root_library()),
+            uri));
     isolate->UnblockClassFinalization();
     if (result.IsError()) {
       if (result.IsLanguageError()) {
@@ -695,16 +664,11 @@
 
   // Request the embedder to load the library.
   isolate->BlockClassFinalization();
-  Object& result = Object::Handle(zone);
-  {
-    TransitionVMToNative transition(thread);
-    Api::Scope api_scope(thread);
-    Dart_Handle retval =
-        handler(Dart_kImportTag,
-                Api::NewHandle(thread, isolate->object_store()->root_library()),
-                Api::NewHandle(thread, canonical_uri.raw()));
-    result = Api::UnwrapHandle(retval);
-  }
+  Object& result = Object::Handle(
+      zone, isolate->CallTagHandler(
+                Dart_kImportTag,
+                Library::Handle(zone, isolate->object_store()->root_library()),
+                canonical_uri));
   isolate->UnblockClassFinalization();
   if (result.IsError()) {
     if (result.IsLanguageError()) {
@@ -736,11 +700,10 @@
   FATAL("Non-library from tag handler");
 }
 
-DEFINE_NATIVE_ENTRY(Mirrors_makeLocalClassMirror, 1) {
+DEFINE_NATIVE_ENTRY(Mirrors_makeLocalClassMirror, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
-  PROPAGATE_IF_MALFORMED(type);
   ASSERT(type.IsFinalized());
-  ASSERT(type.HasResolvedTypeClass());
+  ASSERT(type.HasTypeClass());
   const Class& cls = Class::Handle(type.type_class());
   ASSERT(!cls.IsNull());
   if (cls.IsDynamicClass() || cls.IsVoidClass() || cls.IsTypedefClass()) {
@@ -752,16 +715,16 @@
                            Object::null_instance());
 }
 
-DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 1) {
+DEFINE_NATIVE_ENTRY(Mirrors_makeLocalTypeMirror, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
   return CreateTypeMirror(type);
 }
 
-DEFINE_NATIVE_ENTRY(Mirrors_instantiateGenericType, 2) {
+DEFINE_NATIVE_ENTRY(Mirrors_instantiateGenericType, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(1));
 
-  ASSERT(type.HasResolvedTypeClass());
+  ASSERT(type.HasTypeClass());
   const Class& clz = Class::Handle(type.type_class());
   if (!clz.IsGeneric()) {
     const Array& error_args = Array::Handle(Array::New(3));
@@ -805,34 +768,23 @@
   Type& instantiated_type =
       Type::Handle(Type::New(clz, type_args_obj, TokenPosition::kNoSource));
   instantiated_type ^= ClassFinalizer::FinalizeType(clz, instantiated_type);
-  if (instantiated_type.IsMalbounded()) {
-    const LanguageError& type_error =
-        LanguageError::Handle(instantiated_type.error());
-    const Array& error_args = Array::Handle(Array::New(3));
-    error_args.SetAt(0, args);
-    error_args.SetAt(1, String::Handle(String::New("typeArguments")));
-    error_args.SetAt(2, String::Handle(type_error.FormatMessage()));
-    Exceptions::ThrowByType(Exceptions::kArgumentValue, error_args);
-    UNREACHABLE();
-  }
-
   return instantiated_type.raw();
 }
 
-DEFINE_NATIVE_ENTRY(Mirrors_mangleName, 2) {
+DEFINE_NATIVE_ENTRY(Mirrors_mangleName, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
   const Library& lib = Library::Handle(ref.GetLibraryReferent());
   return lib.IsPrivate(name) ? lib.PrivateName(name) : name.raw();
 }
 
-DEFINE_NATIVE_ENTRY(MirrorReference_equals, 2) {
+DEFINE_NATIVE_ENTRY(MirrorReference_equals, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, a, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, b, arguments->NativeArgAt(1));
   return Bool::Get(a.referent() == b.referent()).raw();
 }
 
-DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) {
+DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(0));
   Object& decl = Object::Handle();
   if (reflectee.IsMirrorReference()) {
@@ -876,7 +828,7 @@
   return metadata.raw();
 }
 
-DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) {
+DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror,
                                arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
@@ -887,14 +839,14 @@
   return CreateMethodMirror(func, owner_mirror, AbstractType::Handle());
 }
 
-DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) {
+DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
   return CreateParameterMirrorList(func, owner);
 }
 
-DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 1) {
+DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
   ASSERT(!func.IsNull());
@@ -903,7 +855,7 @@
   return type.Canonicalize();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_libraryUri, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_libraryUri, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Class& klass = Class::Handle(ref.GetClassReferent());
   const Library& library = Library::Handle(klass.library());
@@ -911,9 +863,8 @@
   return library.url();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_supertype, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_supertype, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
-  PROPAGATE_IF_MALFORMED(type);
   ASSERT(type.IsFinalized());
   const Class& cls = Class::Handle(type.type_class());
   const AbstractType& super_type = AbstractType::Handle(cls.super_type());
@@ -921,18 +872,16 @@
   return super_type.raw();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_supertype_instantiated, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_supertype_instantiated, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
-  PROPAGATE_IF_MALFORMED(type);
   ASSERT(type.IsFinalized());
   const Class& cls = Class::Handle(type.type_class());
   const AbstractType& super_type = AbstractType::Handle(cls.super_type());
   return InstantiateType(super_type, type);
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_interfaces, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_interfaces, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
-  PROPAGATE_IF_MALFORMED(type);
   ASSERT(type.IsFinalized());
   const Class& cls = Class::Handle(type.type_class());
   const Error& error = Error::Handle(cls.EnsureIsFinalized(thread));
@@ -943,9 +892,8 @@
   return cls.interfaces();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_interfaces_instantiated, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_interfaces_instantiated, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
-  PROPAGATE_IF_MALFORMED(type);
   ASSERT(type.IsFinalized());
   const Class& cls = Class::Handle(type.type_class());
   const Error& error = Error::Handle(cls.EnsureIsFinalized(thread));
@@ -966,35 +914,29 @@
   return interfaces_inst.raw();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_mixin, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_mixin, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
-  PROPAGATE_IF_MALFORMED(type);
   ASSERT(type.IsFinalized());
   const Class& cls = Class::Handle(type.type_class());
   AbstractType& mixin_type = AbstractType::Handle();
   if (cls.is_transformed_mixin_application()) {
     const Array& interfaces = Array::Handle(cls.interfaces());
     mixin_type ^= interfaces.At(interfaces.Length() - 1);
-  } else {
-    mixin_type = cls.mixin();
   }
   ASSERT(mixin_type.IsNull() || mixin_type.IsFinalized());
   return mixin_type.raw();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) {
+DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, instantiator,
                                arguments->NativeArgAt(1));
-  PROPAGATE_IF_MALFORMED(type);
   ASSERT(type.IsFinalized());
   const Class& cls = Class::Handle(type.type_class());
   AbstractType& mixin_type = AbstractType::Handle();
   if (cls.is_transformed_mixin_application()) {
     const Array& interfaces = Array::Handle(cls.interfaces());
     mixin_type ^= interfaces.At(interfaces.Length() - 1);
-  } else {
-    mixin_type = cls.mixin();
   }
   if (mixin_type.IsNull()) {
     return mixin_type.raw();
@@ -1003,7 +945,7 @@
   return InstantiateType(mixin_type, instantiator);
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_members, 3) {
+DEFINE_NATIVE_ENTRY(ClassMirror_members, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror,
                                arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(AbstractType, owner_instantiator,
@@ -1051,7 +993,7 @@
   return member_mirrors.raw();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 3) {
+DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror,
                                arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(AbstractType, owner_instantiator,
@@ -1084,7 +1026,7 @@
   return constructor_mirrors.raw();
 }
 
-DEFINE_NATIVE_ENTRY(LibraryMirror_members, 2) {
+DEFINE_NATIVE_ENTRY(LibraryMirror_members, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror,
                                arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
@@ -1103,11 +1045,9 @@
     entry = entries.GetNext();
     if (entry.IsClass()) {
       const Class& klass = Class::Cast(entry);
-      // We filter out mixin application classes and dynamic.
+      // We filter out dynamic.
       // TODO(12478): Should not need to filter out dynamic.
-      // Note that the VM does not consider mixin application aliases to be
-      // mixin applications.
-      if (!klass.IsDynamicClass() && !klass.IsMixinApplication()) {
+      if (!klass.IsDynamicClass()) {
         type = klass.DeclarationType();
         member_mirror = CreateClassMirror(klass, type,
                                           Bool::True(),  // is_declaration
@@ -1136,7 +1076,7 @@
   return member_mirrors.raw();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_type_variables, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_type_variables, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Class& klass = Class::Handle(ref.GetClassReferent());
   const Error& error = Error::Handle(zone, klass.EnsureIsFinalized(thread));
@@ -1147,7 +1087,7 @@
   return CreateTypeVariableList(klass);
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_type_arguments, 1) {
+DEFINE_NATIVE_ENTRY(ClassMirror_type_arguments, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
 
   const Class& cls = Class::Handle(type.type_class());
@@ -1184,7 +1124,7 @@
   return result.raw();
 }
 
-DEFINE_NATIVE_ENTRY(TypeVariableMirror_owner, 1) {
+DEFINE_NATIVE_ENTRY(TypeVariableMirror_owner, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0));
   Class& owner = Class::Handle(param.parameterized_class());
   AbstractType& type = AbstractType::Handle();
@@ -1202,12 +1142,12 @@
                            Instance::null_instance());
 }
 
-DEFINE_NATIVE_ENTRY(TypeVariableMirror_upper_bound, 1) {
+DEFINE_NATIVE_ENTRY(TypeVariableMirror_upper_bound, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0));
   return param.bound();
 }
 
-DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) {
+DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0));
   ASSERT(type.IsFunctionType());
   const Class& cls = Class::Handle(type.type_class());
@@ -1217,7 +1157,7 @@
                              Object::null_instance());
 }
 
-DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) {
+DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 0, 5) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1229,7 +1169,7 @@
   RETURN_OR_PROPAGATE(reflectee.Invoke(function_name, args, arg_names));
 }
 
-DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) {
+DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 0, 3) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1238,7 +1178,7 @@
   RETURN_OR_PROPAGATE(reflectee.InvokeGetter(getter_name));
 }
 
-DEFINE_NATIVE_ENTRY(InstanceMirror_invokeSetter, 4) {
+DEFINE_NATIVE_ENTRY(InstanceMirror_invokeSetter, 0, 4) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1248,7 +1188,7 @@
   RETURN_OR_PROPAGATE(reflectee.InvokeSetter(setter_name, value));
 }
 
-DEFINE_NATIVE_ENTRY(InstanceMirror_computeType, 1) {
+DEFINE_NATIVE_ENTRY(InstanceMirror_computeType, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0));
   const AbstractType& type = AbstractType::Handle(instance.GetType(Heap::kNew));
   // The static type of null is specified to be the bottom type, however, the
@@ -1256,7 +1196,7 @@
   return type.Canonicalize();
 }
 
-DEFINE_NATIVE_ENTRY(ClosureMirror_function, 1) {
+DEFINE_NATIVE_ENTRY(ClosureMirror_function, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, closure, arguments->NativeArgAt(0));
   ASSERT(!closure.IsNull());
 
@@ -1290,7 +1230,7 @@
   return Instance::null();
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 5) {
+DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 0, 5) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1303,7 +1243,7 @@
   RETURN_OR_PROPAGATE(klass.Invoke(function_name, args, arg_names));
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_invokeGetter, 3) {
+DEFINE_NATIVE_ENTRY(ClassMirror_invokeGetter, 0, 3) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1318,7 +1258,7 @@
   RETURN_OR_PROPAGATE(klass.InvokeGetter(getter_name, true));
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_invokeSetter, 4) {
+DEFINE_NATIVE_ENTRY(ClassMirror_invokeSetter, 0, 4) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1329,7 +1269,7 @@
   RETURN_OR_PROPAGATE(klass.InvokeSetter(setter_name, value));
 }
 
-DEFINE_NATIVE_ENTRY(ClassMirror_invokeConstructor, 5) {
+DEFINE_NATIVE_ENTRY(ClassMirror_invokeConstructor, 0, 5) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Class& klass = Class::Handle(ref.GetClassReferent());
   GET_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(1));
@@ -1393,21 +1333,17 @@
   Class& redirected_klass = Class::Handle(klass.raw());
   Function& redirected_constructor = Function::Handle(lookup_constructor.raw());
   if (lookup_constructor.IsRedirectingFactory()) {
-    ClassFinalizer::ResolveRedirectingFactory(klass, lookup_constructor);
+    // Redirecting factory must be resolved.
+    ASSERT(lookup_constructor.RedirectionTarget() != Function::null());
     Type& redirect_type = Type::Handle(lookup_constructor.RedirectionType());
 
     if (!redirect_type.IsInstantiated()) {
       // The type arguments of the redirection type are instantiated from the
       // type arguments of the type reflected by the class mirror.
       ASSERT(redirect_type.IsInstantiated(kFunctions));
-      Error& bound_error = Error::Handle();
       redirect_type ^= redirect_type.InstantiateFrom(
-          type_arguments, Object::null_type_arguments(), kNoneFree,
-          &bound_error, NULL, NULL, Heap::kOld);
-      if (!bound_error.IsNull()) {
-        Exceptions::PropagateError(bound_error);
-        UNREACHABLE();
-      }
+          type_arguments, Object::null_type_arguments(), kNoneFree, NULL,
+          Heap::kOld);
       redirect_type ^= redirect_type.Canonicalize();
     }
 
@@ -1444,6 +1380,13 @@
                       InvocationMirror::kMethod);
     UNREACHABLE();
   }
+  const Object& type_error =
+      Object::Handle(redirected_constructor.DoArgumentTypesMatch(
+          args, args_descriptor, type_arguments));
+  if (!type_error.IsNull()) {
+    Exceptions::PropagateError(Error::Cast(type_error));
+    UNREACHABLE();
+  }
 
   Instance& new_object = Instance::Handle();
   if (redirected_constructor.IsGenerativeConstructor()) {
@@ -1481,7 +1424,7 @@
   }
 }
 
-DEFINE_NATIVE_ENTRY(LibraryMirror_invoke, 5) {
+DEFINE_NATIVE_ENTRY(LibraryMirror_invoke, 0, 5) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1494,7 +1437,7 @@
   RETURN_OR_PROPAGATE(library.Invoke(function_name, args, arg_names));
 }
 
-DEFINE_NATIVE_ENTRY(LibraryMirror_invokeGetter, 3) {
+DEFINE_NATIVE_ENTRY(LibraryMirror_invokeGetter, 0, 3) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1504,7 +1447,7 @@
   RETURN_OR_PROPAGATE(library.InvokeGetter(getter_name, true));
 }
 
-DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) {
+DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 0, 4) {
   // Argument 0 is the mirror, which is unused by the native. It exists
   // because this native is an instance method in order to be polymorphic
   // with its cousins.
@@ -1515,7 +1458,7 @@
   RETURN_OR_PROPAGATE(library.InvokeSetter(setter_name, value));
 }
 
-DEFINE_NATIVE_ENTRY(MethodMirror_owner, 2) {
+DEFINE_NATIVE_ENTRY(MethodMirror_owner, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
@@ -1532,14 +1475,14 @@
   return CreateClassMirror(owner, type, Bool::True(), Object::null_instance());
 }
 
-DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 2) {
+DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
   return CreateParameterMirrorList(func, owner);
 }
 
-DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 2) {
+DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
   GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1));
@@ -1550,7 +1493,7 @@
   return InstantiateType(type, instantiator);
 }
 
-DEFINE_NATIVE_ENTRY(MethodMirror_source, 1) {
+DEFINE_NATIVE_ENTRY(MethodMirror_source, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Function& func = Function::Handle(ref.GetFunctionReferent());
   return func.GetSource();
@@ -1566,7 +1509,7 @@
   return CreateMirror(Symbols::_SourceLocation(), args);
 }
 
-DEFINE_NATIVE_ENTRY(DeclarationMirror_location, 1) {
+DEFINE_NATIVE_ENTRY(DeclarationMirror_location, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(0));
   Object& decl = Object::Handle(zone);
   if (reflectee.IsMirrorReference()) {
@@ -1592,8 +1535,7 @@
   } else if (decl.IsClass()) {
     const Class& cls = Class::Cast(decl);
     const bool is_typedef = cls.IsTypedefClass();
-    if (cls.is_synthesized_class() && !is_typedef &&
-        !cls.is_mixin_app_alias() && !cls.is_enum_class()) {
+    if (cls.is_synthesized_class() && !is_typedef && !cls.is_enum_class()) {
       return Instance::null();  // Synthetic.
     }
     script = cls.script();
@@ -1644,7 +1586,7 @@
   return CreateSourceLocation(uri, from_line, from_col);
 }
 
-DEFINE_NATIVE_ENTRY(TypedefMirror_referent, 1) {
+DEFINE_NATIVE_ENTRY(TypedefMirror_referent, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0));
   ASSERT(type.IsFunctionType());
   const Class& cls = Class::Handle(type.type_class());
@@ -1656,7 +1598,7 @@
   return CreateFunctionTypeMirror(referent_type);
 }
 
-DEFINE_NATIVE_ENTRY(ParameterMirror_type, 3) {
+DEFINE_NATIVE_ENTRY(ParameterMirror_type, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(2));
@@ -1667,7 +1609,7 @@
   return InstantiateType(type, instantiator);
 }
 
-DEFINE_NATIVE_ENTRY(VariableMirror_type, 2) {
+DEFINE_NATIVE_ENTRY(VariableMirror_type, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
   const Field& field = Field::Handle(ref.GetFieldReferent());
   GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1));
@@ -1675,10 +1617,10 @@
   return InstantiateType(type, instantiator);
 }
 
-DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 2) {
+DEFINE_NATIVE_ENTRY(TypeMirror_subtypeTest, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1));
-  return Bool::Get(a.IsSubtypeOf(b, NULL, NULL, Heap::kNew)).raw();
+  return Bool::Get(a.IsSubtypeOf(b, Heap::kNew)).raw();
 }
 
 #endif  // !DART_PRECOMPILED_RUNTIME
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 902e7ff..b11223b 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -368,10 +368,6 @@
   final bool isAbstract;
   final bool _isGeneric;
 
-  // Only used for Dart 1 named mixin applications.
-  // TODO(alexmarkov): Clean up after Dart 1 is gone.
-  final bool _isMixinAlias;
-
   // Since Dart 2, mixins are erased by kernel transformation.
   // Resulting classes have this flag set, and mixed-in type is pulled into
   // the end of interfaces list.
@@ -388,7 +384,6 @@
       this._owner,
       this.isAbstract,
       this._isGeneric,
-      this._isMixinAlias,
       this._isTransformedMixinApplication,
       this._isGenericDeclaration,
       this.isEnum)
@@ -455,7 +450,7 @@
   }
 
   ClassMirror get superclass {
-    return _isMixinAlias ? _trueSuperclass._trueSuperclass : _trueSuperclass;
+    return _trueSuperclass;
   }
 
   var _superinterfaces;
@@ -492,19 +487,13 @@
   var _mixin;
   ClassMirror get mixin {
     if (_mixin == null) {
-      if (_isMixinAlias) {
-        Type mixinType = _nativeMixinInstantiated(
-            _trueSuperclass._reflectedType, _instantiator);
-        _mixin = reflectType(mixinType);
+      Type mixinType =
+          _nativeMixinInstantiated(_reflectedType, _instantiator);
+      if (mixinType == null) {
+        // The reflectee is not a mixin application.
+        _mixin = this;
       } else {
-        Type mixinType =
-            _nativeMixinInstantiated(_reflectedType, _instantiator);
-        if (mixinType == null) {
-          // The reflectee is not a mixin application.
-          _mixin = this;
-        } else {
-          _mixin = reflectType(mixinType);
-        }
+        _mixin = reflectType(mixinType);
       }
     }
     return _mixin;
@@ -572,9 +561,8 @@
 
     var decls = new Map<Symbol, DeclarationMirror>();
 
-    var whoseMembers = _isMixinAlias ? _trueSuperclass : this;
     var members = (mixin as _LocalClassMirror)._computeMembers(
-        _instantiator, (whoseMembers.mixin as _LocalClassMirror)._reflectee);
+        _instantiator, (mixin as _LocalClassMirror)._reflectee);
     for (var member in members) {
       decls[member.simpleName] = member;
     }
@@ -596,7 +584,6 @@
 
   // Note: returns correct result only for Dart 1 anonymous mixin applications.
   bool get _isAnonymousMixinApplication {
-    if (_isMixinAlias) return false; // Named mixin application.
     if (mixin == this) return false; // Not a mixin application.
     return true;
   }
@@ -760,7 +747,7 @@
   final _functionReflectee;
   _LocalFunctionTypeMirror(reflectee, this._functionReflectee, reflectedType)
       : super(reflectee, reflectedType, null, null, false, false, false, false,
-            false, false);
+            false);
 
   bool get _isAnonymousMixinApplication => false;
 
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index b067593..2c5f526 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -15,24 +15,23 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, trace_type_checks);
-
-DEFINE_NATIVE_ENTRY(DartAsync_fatal, 1) {
+DEFINE_NATIVE_ENTRY(DartAsync_fatal, 0, 1) {
   // The dart:async library code entered an unrecoverable state.
-  const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
+  const Instance& instance =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   const char* msg = instance.ToCString();
   OS::PrintErr("Fatal error in dart:async: %s\n", msg);
   FATAL(msg);
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Object_equals, 1) {
+DEFINE_NATIVE_ENTRY(Object_equals, 0, 1) {
   // Implemented in the flow graph builder.
   UNREACHABLE();
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Object_getHash, 1) {
+DEFINE_NATIVE_ENTRY(Object_getHash, 0, 1) {
 // Please note that no handle is created for the argument.
 // This is safe since the argument is only used in a tail call.
 // The performance benefit is more than 5% when using hashCode.
@@ -45,20 +44,22 @@
 #endif
 }
 
-DEFINE_NATIVE_ENTRY(Object_setHash, 2) {
+DEFINE_NATIVE_ENTRY(Object_setHash, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, hash, arguments->NativeArgAt(1));
 #if defined(HASH_IN_OBJECT_HEADER)
   Object::SetCachedHash(arguments->NativeArgAt(0), hash.Value());
 #else
-  const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
+  const Instance& instance =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   Heap* heap = isolate->heap();
   heap->SetHash(instance.raw(), hash.Value());
 #endif
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Object_toString, 1) {
-  const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Object_toString, 0, 1) {
+  const Instance& instance =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   if (instance.IsString()) {
     return instance.raw();
   }
@@ -69,8 +70,9 @@
   return String::New(c_str);
 }
 
-DEFINE_NATIVE_ENTRY(Object_runtimeType, 1) {
-  const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(Object_runtimeType, 0, 1) {
+  const Instance& instance =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   if (instance.IsString()) {
     return Type::StringType();
   } else if (instance.IsInteger()) {
@@ -81,9 +83,11 @@
   return instance.GetType(Heap::kNew);
 }
 
-DEFINE_NATIVE_ENTRY(Object_haveSameRuntimeType, 2) {
-  const Instance& left = Instance::CheckedHandle(arguments->NativeArgAt(0));
-  const Instance& right = Instance::CheckedHandle(arguments->NativeArgAt(1));
+DEFINE_NATIVE_ENTRY(Object_haveSameRuntimeType, 0, 2) {
+  const Instance& left =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Instance& right =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(1));
 
   const intptr_t left_cid = left.GetClassId();
   const intptr_t right_cid = right.GetClassId();
@@ -127,7 +131,7 @@
       .raw();
 }
 
-DEFINE_NATIVE_ENTRY(Object_instanceOf, 4) {
+DEFINE_NATIVE_ENTRY(Object_instanceOf, 0, 4) {
   const Instance& instance =
       Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   const TypeArguments& instantiator_type_arguments =
@@ -137,11 +141,8 @@
   const AbstractType& type =
       AbstractType::CheckedHandle(zone, arguments->NativeArgAt(3));
   ASSERT(type.IsFinalized());
-  ASSERT(!type.IsMalformed());
-  ASSERT(!type.IsMalbounded());
-  Error& bound_error = Error::Handle(zone, Error::null());
   const bool is_instance_of = instance.IsInstanceOf(
-      type, instantiator_type_arguments, function_type_arguments, &bound_error);
+      type, instantiator_type_arguments, function_type_arguments);
   if (FLAG_trace_type_checks) {
     const char* result_str = is_instance_of ? "true" : "false";
     OS::PrintErr("Native Object.instanceOf: result %s\n", result_str);
@@ -151,28 +152,11 @@
                  String::Handle(zone, instance_type.Name()).ToCString());
     OS::PrintErr("  test type: %s\n",
                  String::Handle(zone, type.Name()).ToCString());
-    if (!bound_error.IsNull()) {
-      OS::PrintErr("  bound error: %s\n", bound_error.ToErrorCString());
-    }
-  }
-  if (!is_instance_of && !bound_error.IsNull()) {
-    // Throw a dynamic type error only if the instanceof test fails.
-    DartFrameIterator iterator(thread,
-                               StackFrameIterator::kNoCrossThreadIteration);
-    StackFrame* caller_frame = iterator.NextFrame();
-    ASSERT(caller_frame != NULL);
-    const TokenPosition location = caller_frame->GetTokenPos();
-    String& bound_error_message =
-        String::Handle(zone, String::New(bound_error.ToErrorCString()));
-    Exceptions::CreateAndThrowTypeError(location, AbstractType::Handle(zone),
-                                        AbstractType::Handle(zone),
-                                        Symbols::Empty(), bound_error_message);
-    UNREACHABLE();
   }
   return Bool::Get(is_instance_of).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Object_simpleInstanceOf, 2) {
+DEFINE_NATIVE_ENTRY(Object_simpleInstanceOf, 0, 2) {
   // This native is only called when the right hand side passes
   // SimpleInstanceOfType and it is a non-negative test.
   const Instance& instance =
@@ -180,37 +164,19 @@
   const AbstractType& type =
       AbstractType::CheckedHandle(zone, arguments->NativeArgAt(1));
   ASSERT(type.IsFinalized());
-  ASSERT(!type.IsMalformed());
-  ASSERT(!type.IsMalbounded());
   ASSERT(type.IsInstantiated());
-  Error& bound_error = Error::Handle(zone, Error::null());
-  const bool is_instance_of =
-      instance.IsInstanceOf(type, Object::null_type_arguments(),
-                            Object::null_type_arguments(), &bound_error);
-  if (!is_instance_of && !bound_error.IsNull()) {
-    // Throw a dynamic type error only if the instanceof test fails.
-    DartFrameIterator iterator(thread,
-                               StackFrameIterator::kNoCrossThreadIteration);
-    StackFrame* caller_frame = iterator.NextFrame();
-    ASSERT(caller_frame != NULL);
-    const TokenPosition location = caller_frame->GetTokenPos();
-    String& bound_error_message =
-        String::Handle(zone, String::New(bound_error.ToErrorCString()));
-    Exceptions::CreateAndThrowTypeError(location, AbstractType::Handle(zone),
-                                        AbstractType::Handle(zone),
-                                        Symbols::Empty(), bound_error_message);
-    UNREACHABLE();
-  }
+  const bool is_instance_of = instance.IsInstanceOf(
+      type, Object::null_type_arguments(), Object::null_type_arguments());
   return Bool::Get(is_instance_of).raw();
 }
 
-DEFINE_NATIVE_ENTRY(AbstractType_toString, 1) {
+DEFINE_NATIVE_ENTRY(AbstractType_toString, 0, 1) {
   const AbstractType& type =
       AbstractType::CheckedHandle(zone, arguments->NativeArgAt(0));
   return type.UserVisibleName();
 }
 
-DEFINE_NATIVE_ENTRY(Type_getHashCode, 1) {
+DEFINE_NATIVE_ENTRY(Type_getHashCode, 0, 1) {
   const Type& type = Type::CheckedHandle(zone, arguments->NativeArgAt(0));
   intptr_t hash_val = type.Hash();
   ASSERT(hash_val > 0);
@@ -218,21 +184,21 @@
   return Smi::New(hash_val);
 }
 
-DEFINE_NATIVE_ENTRY(LibraryPrefix_invalidateDependentCode, 1) {
+DEFINE_NATIVE_ENTRY(LibraryPrefix_invalidateDependentCode, 0, 1) {
   const LibraryPrefix& prefix =
       LibraryPrefix::CheckedHandle(zone, arguments->NativeArgAt(0));
   prefix.InvalidateDependentCode();
   return Bool::Get(true).raw();
 }
 
-DEFINE_NATIVE_ENTRY(LibraryPrefix_load, 1) {
+DEFINE_NATIVE_ENTRY(LibraryPrefix_load, 0, 1) {
   const LibraryPrefix& prefix =
       LibraryPrefix::CheckedHandle(zone, arguments->NativeArgAt(0));
   bool hasCompleted = prefix.LoadLibrary();
   return Bool::Get(hasCompleted).raw();
 }
 
-DEFINE_NATIVE_ENTRY(LibraryPrefix_loadError, 1) {
+DEFINE_NATIVE_ENTRY(LibraryPrefix_loadError, 0, 1) {
   const LibraryPrefix& prefix =
       LibraryPrefix::CheckedHandle(zone, arguments->NativeArgAt(0));
   // Currently all errors are Dart instances, e.g. I/O errors
@@ -243,13 +209,13 @@
   return error.raw();
 }
 
-DEFINE_NATIVE_ENTRY(LibraryPrefix_isLoaded, 1) {
+DEFINE_NATIVE_ENTRY(LibraryPrefix_isLoaded, 0, 1) {
   const LibraryPrefix& prefix =
       LibraryPrefix::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Bool::Get(prefix.is_loaded()).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Internal_inquireIs64Bit, 0) {
+DEFINE_NATIVE_ENTRY(Internal_inquireIs64Bit, 0, 0) {
 #if defined(ARCH_IS_64_BIT)
   return Bool::True().raw();
 #else
@@ -257,7 +223,7 @@
 #endif  // defined(ARCH_IS_64_BIT)
 }
 
-DEFINE_NATIVE_ENTRY(Internal_unsafeCast, 1) {
+DEFINE_NATIVE_ENTRY(Internal_unsafeCast, 0, 1) {
   UNREACHABLE();  // Should be erased at Kernel translation time.
   return arguments->NativeArgAt(0);
 }
@@ -268,12 +234,11 @@
                                      const Class& interface_cls,
                                      TypeArguments* interface_type_args) {
   Class& cur_cls = Class::Handle(zone, instance_cls.raw());
-  // The following code is a specialization of Class::TypeTestNonRecursive().
+  // The following code is a specialization of Class::IsSubtypeOf().
   Array& interfaces = Array::Handle(zone);
   AbstractType& interface = AbstractType::Handle(zone);
   Class& cur_interface_cls = Class::Handle(zone);
   TypeArguments& cur_interface_type_args = TypeArguments::Handle(zone);
-  Error& error = Error::Handle(zone);
   while (true) {
     // Additional subtyping rules related to 'FutureOr' are not applied.
     if (cur_cls.raw() == interface_cls.raw()) {
@@ -283,18 +248,14 @@
     interfaces = cur_cls.interfaces();
     for (intptr_t i = 0; i < interfaces.Length(); i++) {
       interface ^= interfaces.At(i);
-      ASSERT(interface.IsFinalized() && !interface.IsMalbounded());
+      ASSERT(interface.IsFinalized());
       cur_interface_cls = interface.type_class();
       cur_interface_type_args = interface.arguments();
       if (!cur_interface_type_args.IsNull() &&
           !cur_interface_type_args.IsInstantiated()) {
-        error = Error::null();
         cur_interface_type_args = cur_interface_type_args.InstantiateFrom(
-            instance_type_args, Object::null_type_arguments(), kNoneFree,
-            &error, NULL, NULL, Heap::kNew);
-        if (!error.IsNull()) {
-          continue;  // Another interface may work better.
-        }
+            instance_type_args, Object::null_type_arguments(), kNoneFree, NULL,
+            Heap::kNew);
       }
       if (ExtractInterfaceTypeArgs(zone, cur_interface_cls,
                                    cur_interface_type_args, interface_cls,
@@ -309,33 +270,29 @@
   }
 }
 
-DEFINE_NATIVE_ENTRY(Internal_extractTypeArguments, 2) {
+// for documentation see pkg/dart_internal/lib/extract_type_arguments.dart
+DEFINE_NATIVE_ENTRY(Internal_extractTypeArguments, 0, 2) {
   const Instance& instance =
       Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   const Instance& extract =
       Instance::CheckedHandle(zone, arguments->NativeArgAt(1));
 
   Class& interface_cls = Class::Handle(zone);
-  intptr_t num_type_args = 0;  // Remains 0 when executing Dart 1.0 code.
-  // TODO(regis): Check for strong mode too?
-  if (FLAG_reify_generic_functions) {
-    const TypeArguments& function_type_args =
-        TypeArguments::Handle(zone, arguments->NativeTypeArgs());
-    if (function_type_args.Length() == 1) {
-      const AbstractType& function_type_arg =
-          AbstractType::Handle(zone, function_type_args.TypeAt(0));
-      if (function_type_arg.IsType() &&
-          (function_type_arg.arguments() == TypeArguments::null())) {
-        interface_cls = function_type_arg.type_class();
-        num_type_args = interface_cls.NumTypeParameters();
-      }
+  intptr_t num_type_args = 0;
+  if (arguments->NativeTypeArgCount() >= 1) {
+    const AbstractType& function_type_arg =
+        AbstractType::Handle(zone, arguments->NativeTypeArgAt(0));
+    if (function_type_arg.IsType() &&
+        (function_type_arg.arguments() == TypeArguments::null())) {
+      interface_cls = function_type_arg.type_class();
+      num_type_args = interface_cls.NumTypeParameters();
     }
-    if (num_type_args == 0) {
-      Exceptions::ThrowArgumentError(String::Handle(
-          zone,
-          String::New(
-              "single function type argument must specify a generic class")));
-    }
+  }
+  if (num_type_args == 0) {
+    Exceptions::ThrowArgumentError(String::Handle(
+        zone,
+        String::New(
+            "single function type argument must specify a generic class")));
   }
   if (instance.IsNull()) {
     Exceptions::ThrowArgumentError(instance);
@@ -400,7 +357,7 @@
   return result.raw();
 }
 
-DEFINE_NATIVE_ENTRY(Internal_prependTypeArguments, 4) {
+DEFINE_NATIVE_ENTRY(Internal_prependTypeArguments, 0, 4) {
   const TypeArguments& function_type_arguments =
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0));
   const TypeArguments& parent_type_arguments =
@@ -415,7 +372,7 @@
 // closure.
 // Arg0: Closure object
 // Arg1: Type arguments to function
-DEFINE_NATIVE_ENTRY(Internal_boundsCheckForPartialInstantiation, 2) {
+DEFINE_NATIVE_ENTRY(Internal_boundsCheckForPartialInstantiation, 0, 2) {
   const Closure& closure =
       Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
   const Function& target = Function::Handle(zone, closure.function());
@@ -441,20 +398,18 @@
   AbstractType& supertype = AbstractType::Handle(zone);
   AbstractType& subtype = AbstractType::Handle(zone);
   TypeParameter& parameter = TypeParameter::Handle(zone);
-  Error& bound_error = Error::Handle(zone);
   for (intptr_t i = 0; i < bounds.Length(); ++i) {
     parameter ^= bounds.TypeAt(i);
     supertype = parameter.bound();
     subtype = type_args_to_check.IsNull() ? Object::dynamic_type().raw()
                                           : type_args_to_check.TypeAt(i);
 
-    ASSERT(!subtype.IsNull() && !subtype.IsMalformedOrMalbounded());
-    ASSERT(!supertype.IsNull() && !supertype.IsMalformedOrMalbounded());
+    ASSERT(!subtype.IsNull());
+    ASSERT(!supertype.IsNull());
 
     // The supertype may not be instantiated.
     if (!AbstractType::InstantiateAndTestSubtype(
-            &subtype, &supertype, &bound_error, instantiator_type_args,
-            function_type_args)) {
+            &subtype, &supertype, instantiator_type_args, function_type_args)) {
       // Throw a dynamic type error.
       TokenPosition location;
       {
@@ -464,13 +419,9 @@
         ASSERT(caller_frame != NULL);
         location = caller_frame->GetTokenPos();
       }
-      String& bound_error_message = String::Handle(zone);
-      if (!bound_error.IsNull()) {
-        bound_error_message = String::New(bound_error.ToErrorCString());
-      }
       String& parameter_name = String::Handle(zone, parameter.Name());
       Exceptions::CreateAndThrowTypeError(location, subtype, supertype,
-                                          parameter_name, bound_error_message);
+                                          parameter_name);
       UNREACHABLE();
     }
   }
@@ -478,7 +429,7 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(InvocationMirror_unpackTypeArguments, 2) {
+DEFINE_NATIVE_ENTRY(InvocationMirror_unpackTypeArguments, 0, 2) {
   const TypeArguments& type_arguments =
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0));
   const Smi& num_type_arguments =
@@ -501,8 +452,9 @@
   return type_list.raw();
 }
 
-DEFINE_NATIVE_ENTRY(NoSuchMethodError_existingMethodSignature, 3) {
-  const Instance& receiver = Instance::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(NoSuchMethodError_existingMethodSignature, 0, 3) {
+  const Instance& receiver =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(String, method_name, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, invocation_type, arguments->NativeArgAt(2));
   InvocationMirror::Level level;
diff --git a/runtime/lib/profiler.cc b/runtime/lib/profiler.cc
index d892a5c..3d6d84e 100644
--- a/runtime/lib/profiler.cc
+++ b/runtime/lib/profiler.cc
@@ -13,39 +13,38 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, trace_intrinsified_natives);
-
 // Native implementations of the profiler parts of the dart:developer library.
 
-DEFINE_NATIVE_ENTRY(UserTag_new, 2) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(UserTag_new, 0, 2) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(String, tag_label, arguments->NativeArgAt(1));
   return UserTag::New(tag_label);
 }
 
-DEFINE_NATIVE_ENTRY(UserTag_label, 1) {
-  const UserTag& self = UserTag::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(UserTag_label, 0, 1) {
+  const UserTag& self = UserTag::CheckedHandle(zone, arguments->NativeArgAt(0));
   return self.label();
 }
 
-DEFINE_NATIVE_ENTRY(UserTag_makeCurrent, 1) {
-  const UserTag& self = UserTag::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(UserTag_makeCurrent, 0, 1) {
+  const UserTag& self = UserTag::CheckedHandle(zone, arguments->NativeArgAt(0));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("UserTag_makeCurrent: %s\n", self.ToCString());
   }
-  const UserTag& old = UserTag::Handle(isolate->current_tag());
+  const UserTag& old = UserTag::Handle(zone, isolate->current_tag());
   self.MakeActive();
   return old.raw();
 }
 
-DEFINE_NATIVE_ENTRY(UserTag_defaultTag, 0) {
+DEFINE_NATIVE_ENTRY(UserTag_defaultTag, 0, 0) {
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("UserTag_defaultTag\n");
   }
   return isolate->default_tag();
 }
 
-DEFINE_NATIVE_ENTRY(Profiler_getCurrentTag, 0) {
+DEFINE_NATIVE_ENTRY(Profiler_getCurrentTag, 0, 0) {
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Profiler_getCurrentTag\n");
   }
diff --git a/runtime/lib/regexp.cc b/runtime/lib/regexp.cc
index 92f411f..aa58c5f 100644
--- a/runtime/lib/regexp.cc
+++ b/runtime/lib/regexp.cc
@@ -14,8 +14,9 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(RegExp_factory, 4) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(RegExp_factory, 0, 4) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(String, pattern, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, handle_multi_line,
                                arguments->NativeArgAt(2));
@@ -27,35 +28,33 @@
   // Parse the pattern once in order to throw any format exceptions within
   // the factory constructor. It is parsed again upon compilation.
   RegExpCompileData compileData;
-  if (!RegExpParser::ParseRegExp(pattern, multi_line, &compileData)) {
-    // Parsing failures throw an exception.
-    UNREACHABLE();
-  }
+  // Throws an exception on parsing failure.
+  RegExpParser::ParseRegExp(pattern, multi_line, &compileData);
 
   // Create a RegExp object containing only the initial parameters.
   return RegExpEngine::CreateRegExp(thread, pattern, multi_line, ignore_case);
 }
 
-DEFINE_NATIVE_ENTRY(RegExp_getPattern, 1) {
-  const RegExp& regexp = RegExp::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(RegExp_getPattern, 0, 1) {
+  const RegExp& regexp = RegExp::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!regexp.IsNull());
   return regexp.pattern();
 }
 
-DEFINE_NATIVE_ENTRY(RegExp_getIsMultiLine, 1) {
-  const RegExp& regexp = RegExp::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(RegExp_getIsMultiLine, 0, 1) {
+  const RegExp& regexp = RegExp::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!regexp.IsNull());
   return Bool::Get(regexp.is_multi_line()).raw();
 }
 
-DEFINE_NATIVE_ENTRY(RegExp_getIsCaseSensitive, 1) {
-  const RegExp& regexp = RegExp::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(RegExp_getIsCaseSensitive, 0, 1) {
+  const RegExp& regexp = RegExp::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!regexp.IsNull());
   return Bool::Get(!regexp.is_ignore_case()).raw();
 }
 
-DEFINE_NATIVE_ENTRY(RegExp_getGroupCount, 1) {
-  const RegExp& regexp = RegExp::CheckedHandle(arguments->NativeArgAt(0));
+DEFINE_NATIVE_ENTRY(RegExp_getGroupCount, 0, 1) {
+  const RegExp& regexp = RegExp::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!regexp.IsNull());
   if (regexp.is_initialized()) {
     return regexp.num_bracket_expressions();
@@ -73,7 +72,7 @@
 static RawObject* ExecuteMatch(Zone* zone,
                                NativeArguments* arguments,
                                bool sticky) {
-  const RegExp& regexp = RegExp::CheckedHandle(arguments->NativeArgAt(0));
+  const RegExp& regexp = RegExp::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!regexp.IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(String, subject, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_index, arguments->NativeArgAt(2));
@@ -88,12 +87,12 @@
                                                  /*sticky=*/sticky, zone);
 }
 
-DEFINE_NATIVE_ENTRY(RegExp_ExecuteMatch, 3) {
+DEFINE_NATIVE_ENTRY(RegExp_ExecuteMatch, 0, 3) {
   // This function is intrinsified. See Intrinsifier::RegExp_ExecuteMatch.
   return ExecuteMatch(zone, arguments, /*sticky=*/false);
 }
 
-DEFINE_NATIVE_ENTRY(RegExp_ExecuteMatchSticky, 3) {
+DEFINE_NATIVE_ENTRY(RegExp_ExecuteMatchSticky, 0, 3) {
   // This function is intrinsified. See Intrinsifier::RegExp_ExecuteMatchSticky.
   return ExecuteMatch(zone, arguments, /*sticky=*/true);
 }
diff --git a/runtime/lib/simd128.cc b/runtime/lib/simd128.cc
index 45c3862..356853b 100644
--- a/runtime/lib/simd128.cc
+++ b/runtime/lib/simd128.cc
@@ -18,8 +18,9 @@
   }
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_fromDoubles, 5) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float32x4_fromDoubles, 0, 5) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(2));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, z, arguments->NativeArgAt(3));
@@ -31,31 +32,33 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_splat, 2) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float32x4_splat, 0, 2) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(Double, v, arguments->NativeArgAt(1));
   float _v = v.value();
   return Float32x4::New(_v, _v, _v, _v);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_zero, 1) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float32x4_zero, 0, 1) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   return Float32x4::New(0.0f, 0.0f, 0.0f, 0.0f);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_fromInt32x4Bits, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_fromInt32x4Bits, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, v, arguments->NativeArgAt(1));
   return Float32x4::New(v.value());
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_fromFloat64x2, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_fromFloat64x2, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, v, arguments->NativeArgAt(1));
   float _x = static_cast<float>(v.x());
   float _y = static_cast<float>(v.y());
   return Float32x4::New(_x, _y, 0.0f, 0.0f);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_add, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_add, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
   float _x = self.x() + other.x();
@@ -65,7 +68,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_negate, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_negate, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   float _x = -self.x();
   float _y = -self.y();
@@ -74,7 +77,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_sub, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_sub, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
   float _x = self.x() - other.x();
@@ -84,7 +87,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_mul, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_mul, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
   float _x = self.x() * other.x();
@@ -94,7 +97,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_div, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_div, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
   float _x = self.x() / other.x();
@@ -104,7 +107,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_cmplt, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_cmplt, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, a, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, b, arguments->NativeArgAt(1));
   uint32_t _x = a.x() < b.x() ? 0xFFFFFFFF : 0x0;
@@ -114,7 +117,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_cmplte, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_cmplte, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, a, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, b, arguments->NativeArgAt(1));
   uint32_t _x = a.x() <= b.x() ? 0xFFFFFFFF : 0x0;
@@ -124,7 +127,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_cmpgt, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_cmpgt, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, a, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, b, arguments->NativeArgAt(1));
   uint32_t _x = a.x() > b.x() ? 0xFFFFFFFF : 0x0;
@@ -134,7 +137,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_cmpgte, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_cmpgte, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, a, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, b, arguments->NativeArgAt(1));
   uint32_t _x = a.x() >= b.x() ? 0xFFFFFFFF : 0x0;
@@ -144,7 +147,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_cmpequal, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_cmpequal, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, a, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, b, arguments->NativeArgAt(1));
   uint32_t _x = a.x() == b.x() ? 0xFFFFFFFF : 0x0;
@@ -154,7 +157,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_cmpnequal, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_cmpnequal, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, a, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, b, arguments->NativeArgAt(1));
   uint32_t _x = a.x() != b.x() ? 0xFFFFFFFF : 0x0;
@@ -164,7 +167,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_scale, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_scale, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, scale, arguments->NativeArgAt(1));
   float _s = static_cast<float>(scale.value());
@@ -175,7 +178,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_abs, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_abs, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   float _x = fabsf(self.x());
   float _y = fabsf(self.y());
@@ -184,7 +187,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_clamp, 3) {
+DEFINE_NATIVE_ENTRY(Float32x4_clamp, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, lo, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, hi, arguments->NativeArgAt(2));
@@ -201,31 +204,31 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_getX, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_getX, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   double value = static_cast<double>(self.x());
   return Double::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_getY, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_getY, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   double value = static_cast<double>(self.y());
   return Double::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_getZ, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_getZ, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   double value = static_cast<double>(self.z());
   return Double::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_getW, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_getW, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   double value = static_cast<double>(self.w());
   return Double::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_getSignMask, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_getSignMask, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   uint32_t mx = (bit_cast<uint32_t>(self.x()) & 0x80000000) >> 31;
   uint32_t my = (bit_cast<uint32_t>(self.y()) & 0x80000000) >> 31;
@@ -235,7 +238,7 @@
   return Integer::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getSignMask, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getSignMask, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   uint32_t mx = (self.x() & 0x80000000) >> 31;
   uint32_t my = (self.y() & 0x80000000) >> 31;
@@ -245,7 +248,7 @@
   return Integer::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_shuffle, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_shuffle, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(1));
   int64_t m = mask.AsInt64Value();
@@ -258,7 +261,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_shuffleMix, 3) {
+DEFINE_NATIVE_ENTRY(Float32x4_shuffleMix, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(2));
@@ -273,7 +276,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_setX, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_setX, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
   float _x = static_cast<float>(x.value());
@@ -283,7 +286,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_setY, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_setY, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(1));
   float _x = self.x();
@@ -293,7 +296,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_setZ, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_setZ, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, z, arguments->NativeArgAt(1));
   float _x = self.x();
@@ -303,7 +306,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_setW, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_setW, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, w, arguments->NativeArgAt(1));
   float _x = self.x();
@@ -313,7 +316,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_min, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_min, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
   float _x = self.x() < other.x() ? self.x() : other.x();
@@ -323,7 +326,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_max, 2) {
+DEFINE_NATIVE_ENTRY(Float32x4_max, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
   float _x = self.x() > other.x() ? self.x() : other.x();
@@ -333,7 +336,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_sqrt, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_sqrt, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   float _x = sqrtf(self.x());
   float _y = sqrtf(self.y());
@@ -342,7 +345,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_reciprocal, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_reciprocal, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   float _x = 1.0f / self.x();
   float _y = 1.0f / self.y();
@@ -351,7 +354,7 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Float32x4_reciprocalSqrt, 1) {
+DEFINE_NATIVE_ENTRY(Float32x4_reciprocalSqrt, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
   float _x = sqrtf(1.0f / self.x());
   float _y = sqrtf(1.0f / self.y());
@@ -360,8 +363,9 @@
   return Float32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_fromInts, 5) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Int32x4_fromInts, 0, 5) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, x, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, y, arguments->NativeArgAt(2));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, z, arguments->NativeArgAt(3));
@@ -373,8 +377,9 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_fromBools, 5) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Int32x4_fromBools, 0, 5) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, x, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, y, arguments->NativeArgAt(2));
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, z, arguments->NativeArgAt(3));
@@ -386,12 +391,12 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_fromFloat32x4Bits, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_fromFloat32x4Bits, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, v, arguments->NativeArgAt(1));
   return Int32x4::New(v.value());
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_or, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_or, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
   int32_t _x = self.x() | other.x();
@@ -401,7 +406,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_and, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_and, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
   int32_t _x = self.x() & other.x();
@@ -411,7 +416,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_xor, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_xor, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
   int32_t _x = self.x() ^ other.x();
@@ -421,7 +426,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_add, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_add, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
   int32_t _x = self.x() + other.x();
@@ -431,7 +436,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_sub, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_sub, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, other, arguments->NativeArgAt(1));
   int32_t _x = self.x() - other.x();
@@ -441,31 +446,31 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getX, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getX, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   int32_t value = self.x();
   return Integer::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getY, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getY, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   int32_t value = self.y();
   return Integer::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getZ, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getZ, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   int32_t value = self.z();
   return Integer::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getW, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getW, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   int32_t value = self.w();
   return Integer::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_shuffle, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_shuffle, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(1));
   int64_t m = mask.AsInt64Value();
@@ -478,7 +483,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_shuffleMix, 3) {
+DEFINE_NATIVE_ENTRY(Int32x4_shuffleMix, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, zw, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(2));
@@ -493,7 +498,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_setX, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_setX, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, x, arguments->NativeArgAt(1));
   int32_t _x = static_cast<int32_t>(x.AsInt64Value() & 0xFFFFFFFF);
@@ -503,7 +508,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_setY, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_setY, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, y, arguments->NativeArgAt(1));
   int32_t _x = self.x();
@@ -513,7 +518,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_setZ, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_setZ, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, z, arguments->NativeArgAt(1));
   int32_t _x = self.x();
@@ -523,7 +528,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_setW, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_setW, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, w, arguments->NativeArgAt(1));
   int32_t _x = self.x();
@@ -533,31 +538,31 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getFlagX, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getFlagX, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   int32_t value = self.x();
   return Bool::Get(value != 0).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getFlagY, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getFlagY, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   int32_t value = self.y();
   return Bool::Get(value != 0).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getFlagZ, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getFlagZ, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   int32_t value = self.z();
   return Bool::Get(value != 0).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_getFlagW, 1) {
+DEFINE_NATIVE_ENTRY(Int32x4_getFlagW, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   int32_t value = self.w();
   return Bool::Get(value != 0).raw();
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_setFlagX, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_setFlagX, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagX, arguments->NativeArgAt(1));
   int32_t _x = self.x();
@@ -568,7 +573,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_setFlagY, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_setFlagY, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagY, arguments->NativeArgAt(1));
   int32_t _x = self.x();
@@ -579,7 +584,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_setFlagZ, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_setFlagZ, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagZ, arguments->NativeArgAt(1));
   int32_t _x = self.x();
@@ -590,7 +595,7 @@
   return Int32x4::New(_x, _y, _z, _w);
 }
 
-DEFINE_NATIVE_ENTRY(Int32x4_setFlagW, 2) {
+DEFINE_NATIVE_ENTRY(Int32x4_setFlagW, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagW, arguments->NativeArgAt(1));
   int32_t _x = self.x();
@@ -610,7 +615,7 @@
   float32_int32(int32_t v) { u = v; }
 };
 
-DEFINE_NATIVE_ENTRY(Int32x4_select, 3) {
+DEFINE_NATIVE_ENTRY(Int32x4_select, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Int32x4, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, tv, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, fv, arguments->NativeArgAt(2));
@@ -635,33 +640,37 @@
   return Float32x4::New(tempX.f, tempY.f, tempZ.f, tempW.f);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_fromDoubles, 3) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float64x2_fromDoubles, 0, 3) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(2));
   return Float64x2::New(x.value(), y.value());
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_splat, 2) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float64x2_splat, 0, 2) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(Double, v, arguments->NativeArgAt(1));
   return Float64x2::New(v.value(), v.value());
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_zero, 1) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float64x2_zero, 0, 1) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   return Float64x2::New(0.0, 0.0);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_fromFloat32x4, 2) {
-  ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
+DEFINE_NATIVE_ENTRY(Float64x2_fromFloat32x4, 0, 2) {
+  ASSERT(
+      TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
   GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, v, arguments->NativeArgAt(1));
   double _x = v.x();
   double _y = v.y();
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_add, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_add, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
   double _x = self.x() + other.x();
@@ -669,14 +678,14 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_negate, 1) {
+DEFINE_NATIVE_ENTRY(Float64x2_negate, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   double _x = -self.x();
   double _y = -self.y();
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_sub, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_sub, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
   double _x = self.x() - other.x();
@@ -684,7 +693,7 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_mul, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_mul, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
   double _x = self.x() * other.x();
@@ -692,7 +701,7 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_div, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_div, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
   double _x = self.x() / other.x();
@@ -700,7 +709,7 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_scale, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_scale, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, scale, arguments->NativeArgAt(1));
   double _s = scale.value();
@@ -709,14 +718,14 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_abs, 1) {
+DEFINE_NATIVE_ENTRY(Float64x2_abs, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   double _x = fabs(self.x());
   double _y = fabs(self.y());
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_clamp, 3) {
+DEFINE_NATIVE_ENTRY(Float64x2_clamp, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, lo, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, hi, arguments->NativeArgAt(2));
@@ -729,17 +738,17 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_getX, 1) {
+DEFINE_NATIVE_ENTRY(Float64x2_getX, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   return Double::New(self.x());
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_getY, 1) {
+DEFINE_NATIVE_ENTRY(Float64x2_getY, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   return Double::New(self.y());
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_getSignMask, 1) {
+DEFINE_NATIVE_ENTRY(Float64x2_getSignMask, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   uint32_t mx = (bit_cast<uint64_t>(self.x()) & 0x8000000000000000LL) >> 63;
   uint32_t my = (bit_cast<uint64_t>(self.y()) & 0x8000000000000000LL) >> 63;
@@ -747,7 +756,7 @@
   return Integer::New(value);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_setX, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_setX, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
   double _x = x.value();
@@ -755,7 +764,7 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_setY, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_setY, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(1));
   double _x = self.x();
@@ -763,7 +772,7 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_min, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_min, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
   double _x = self.x() < other.x() ? self.x() : other.x();
@@ -771,7 +780,7 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_max, 2) {
+DEFINE_NATIVE_ENTRY(Float64x2_max, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
   double _x = self.x() > other.x() ? self.x() : other.x();
@@ -779,7 +788,7 @@
   return Float64x2::New(_x, _y);
 }
 
-DEFINE_NATIVE_ENTRY(Float64x2_sqrt, 1) {
+DEFINE_NATIVE_ENTRY(Float64x2_sqrt, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
   double _x = sqrt(self.x());
   double _y = sqrt(self.y());
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index 28edcf1..0a412f2 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -77,7 +77,7 @@
   intptr_t write_cursor = 0;
   if (for_async_function) {
     // Place the asynchronous gap marker at the top of the stack trace.
-    code = StubCode::AsynchronousGapMarker_entry()->code();
+    code = StubCode::AsynchronousGapMarker().raw();
     ASSERT(!code.IsNull());
     offset = Smi::New(0);
     code_array.SetAt(write_cursor, code);
@@ -102,11 +102,11 @@
   return CurrentStackTrace(thread, false, 0);
 }
 
-DEFINE_NATIVE_ENTRY(StackTrace_current, 0) {
+DEFINE_NATIVE_ENTRY(StackTrace_current, 0, 0) {
   return CurrentStackTrace(thread, false);
 }
 
-DEFINE_NATIVE_ENTRY(StackTrace_asyncStackTraceHelper, 1) {
+DEFINE_NATIVE_ENTRY(StackTrace_asyncStackTraceHelper, 0, 1) {
   if (!FLAG_causal_async_stacks) {
     return Object::null();
   }
@@ -120,12 +120,12 @@
   return CurrentStackTrace(thread, true);
 }
 
-DEFINE_NATIVE_ENTRY(StackTrace_clearAsyncThreadStackTrace, 0) {
+DEFINE_NATIVE_ENTRY(StackTrace_clearAsyncThreadStackTrace, 0, 0) {
   thread->clear_async_stack_trace();
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(StackTrace_setAsyncThreadStackTrace, 1) {
+DEFINE_NATIVE_ENTRY(StackTrace_setAsyncThreadStackTrace, 0, 1) {
   if (!FLAG_causal_async_stacks) {
     return Object::null();
   }
@@ -145,15 +145,22 @@
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Code& code = Code::Handle();
+  Bytecode& bytecode = Bytecode::Handle();
   Smi& offset = Smi::Handle();
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
       if (skip_frames > 0) {
         skip_frames--;
       } else {
-        code = frame->LookupDartCode();
-        offset = Smi::New(frame->pc() - code.PayloadStart());
-        code_list.Add(code);
+        if (frame->is_interpreted()) {
+          bytecode = frame->LookupDartBytecode();
+          offset = Smi::New(frame->pc() - bytecode.PayloadStart());
+          code_list.Add(bytecode);
+        } else {
+          code = frame->LookupDartCode();
+          offset = Smi::New(frame->pc() - code.PayloadStart());
+          code_list.Add(code);
+        }
         pc_offset_list.Add(offset);
       }
     }
diff --git a/runtime/lib/stopwatch.cc b/runtime/lib/stopwatch.cc
index 8adb201..d569cb6 100644
--- a/runtime/lib/stopwatch.cc
+++ b/runtime/lib/stopwatch.cc
@@ -9,11 +9,11 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Stopwatch_now, 0) {
+DEFINE_NATIVE_ENTRY(Stopwatch_now, 0, 0) {
   return Integer::New(OS::GetCurrentMonotonicTicks());
 }
 
-DEFINE_NATIVE_ENTRY(Stopwatch_frequency, 0) {
+DEFINE_NATIVE_ENTRY(Stopwatch_frequency, 0, 0) {
   return Integer::New(OS::GetCurrentMonotonicFrequency());
 }
 
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 2aa299d..5592f20 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -16,7 +16,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(String_fromEnvironment, 3) {
+DEFINE_NATIVE_ENTRY(String_fromEnvironment, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(1));
   GET_NATIVE_ARGUMENT(String, default_value, arguments->NativeArgAt(2));
   // Call the embedder to supply us with the environment.
@@ -28,7 +28,7 @@
   return default_value.raw();
 }
 
-DEFINE_NATIVE_ENTRY(StringBase_createFromCodePoints, 3) {
+DEFINE_NATIVE_ENTRY(StringBase_createFromCodePoints, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, list, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
@@ -89,7 +89,7 @@
   return TwoByteString::New(utf16_len, utf32_array, array_len, Heap::kNew);
 }
 
-DEFINE_NATIVE_ENTRY(StringBase_substringUnchecked, 3) {
+DEFINE_NATIVE_ENTRY(StringBase_substringUnchecked, 0, 3) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
@@ -160,7 +160,7 @@
   return true;
 }
 
-DEFINE_NATIVE_ENTRY(StringBase_joinReplaceAllResult, 4) {
+DEFINE_NATIVE_ENTRY(StringBase_joinReplaceAllResult, 0, 4) {
   const String& base = String::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(GrowableObjectArray, matches_growable,
                                arguments->NativeArgAt(1));
@@ -245,7 +245,7 @@
   return result.raw();
 }
 
-DEFINE_NATIVE_ENTRY(OneByteString_substringUnchecked, 3) {
+DEFINE_NATIVE_ENTRY(OneByteString_substringUnchecked, 0, 3) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(receiver.IsOneByteString());
@@ -258,7 +258,7 @@
 }
 
 // This is high-performance code.
-DEFINE_NATIVE_ENTRY(OneByteString_splitWithCharCode, 2) {
+DEFINE_NATIVE_ENTRY(OneByteString_splitWithCharCode, 0, 2) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(receiver.IsOneByteString());
@@ -286,12 +286,12 @@
   return result.raw();
 }
 
-DEFINE_NATIVE_ENTRY(OneByteString_allocate, 1) {
+DEFINE_NATIVE_ENTRY(OneByteString_allocate, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, length_obj, arguments->NativeArgAt(0));
   return OneByteString::New(length_obj.Value(), Heap::kNew);
 }
 
-DEFINE_NATIVE_ENTRY(OneByteString_allocateFromOneByteList, 3) {
+DEFINE_NATIVE_ENTRY(OneByteString_allocateFromOneByteList, 0, 3) {
   Instance& list = Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
@@ -377,7 +377,7 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(OneByteString_setAt, 3) {
+DEFINE_NATIVE_ENTRY(OneByteString_setAt, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(String, receiver, arguments->NativeArgAt(0));
   ASSERT(receiver.IsOneByteString());
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, index_obj, arguments->NativeArgAt(1));
@@ -387,7 +387,7 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(TwoByteString_allocateFromTwoByteList, 3) {
+DEFINE_NATIVE_ENTRY(TwoByteString_allocateFromTwoByteList, 0, 3) {
   Instance& list = Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
@@ -472,7 +472,7 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(String_getHashCode, 1) {
+DEFINE_NATIVE_ENTRY(String_getHashCode, 0, 1) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   intptr_t hash_val = receiver.Hash();
@@ -481,7 +481,7 @@
   return Smi::New(hash_val);
 }
 
-DEFINE_NATIVE_ENTRY(String_getLength, 1) {
+DEFINE_NATIVE_ENTRY(String_getLength, 0, 1) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   return Smi::New(receiver.Length());
@@ -500,7 +500,7 @@
   return 0;
 }
 
-DEFINE_NATIVE_ENTRY(String_charAt, 2) {
+DEFINE_NATIVE_ENTRY(String_charAt, 0, 2) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
@@ -509,7 +509,7 @@
 }
 
 // Returns the 16-bit UTF-16 code unit at the given index.
-DEFINE_NATIVE_ENTRY(String_codeUnitAt, 2) {
+DEFINE_NATIVE_ENTRY(String_codeUnitAt, 0, 2) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
@@ -517,28 +517,28 @@
   return Smi::New(static_cast<intptr_t>(value));
 }
 
-DEFINE_NATIVE_ENTRY(String_concat, 2) {
+DEFINE_NATIVE_ENTRY(String_concat, 0, 2) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(String, b, arguments->NativeArgAt(1));
   return String::Concat(receiver, b);
 }
 
-DEFINE_NATIVE_ENTRY(String_toLowerCase, 1) {
+DEFINE_NATIVE_ENTRY(String_toLowerCase, 0, 1) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!receiver.IsNull());
   return String::ToLowerCase(receiver);
 }
 
-DEFINE_NATIVE_ENTRY(String_toUpperCase, 1) {
+DEFINE_NATIVE_ENTRY(String_toUpperCase, 0, 1) {
   const String& receiver =
       String::CheckedHandle(zone, arguments->NativeArgAt(0));
   ASSERT(!receiver.IsNull());
   return String::ToUpperCase(receiver);
 }
 
-DEFINE_NATIVE_ENTRY(String_concatRange, 3) {
+DEFINE_NATIVE_ENTRY(String_concatRange, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, argument, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, start, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, end, arguments->NativeArgAt(2));
@@ -573,7 +573,7 @@
   return String::ConcatAllRange(strings, start_ix, end_ix, Heap::kNew);
 }
 
-DEFINE_NATIVE_ENTRY(StringBuffer_createStringFromUint16Array, 3) {
+DEFINE_NATIVE_ENTRY(StringBuffer_createStringFromUint16Array, 0, 3) {
   GET_NON_NULL_NATIVE_ARGUMENT(TypedData, codeUnits, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(1));
   GET_NON_NULL_NATIVE_ARGUMENT(Bool, isLatin1, arguments->NativeArgAt(2));
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index fe749e4..e90667a 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -124,7 +124,6 @@
     if (charCodes == null) throw new ArgumentError(charCodes);
     // TODO(srdjan): Also skip copying of wide typed arrays.
     final ccid = ClassID.getID(charCodes);
-    bool isOneByteString = false;
     if ((ccid != ClassID.cidArray) &&
         (ccid != ClassID.cidGrowableObjectArray) &&
         (ccid != ClassID.cidImmutableArray)) {
@@ -139,9 +138,7 @@
     end = RangeError.checkValidRange(start, end, codeCount);
     final len = end - start;
     if (len == 0) return "";
-    if (limit == null) {
-      limit = _scanCodeUnits(charCodes, start, end);
-    }
+    limit ??= _scanCodeUnits(charCodes, start, end);
     if (limit < 0) {
       throw new ArgumentError(charCodes);
     }
@@ -225,6 +222,19 @@
   static String _createOneByteString(List<int> charCodes, int start, int len) {
     // It's always faster to do this in Dart than to call into the runtime.
     var s = _OneByteString._allocate(len);
+
+    // Special case for _Uint8ArrayView.
+    final cid = ClassID.getID(charCodes);
+    if (identical(cid, ClassID.cidUint8ArrayView)) {
+      if (start >= 0 && len >= 0) {
+        for (int i = 0; i < len; i++) {
+          s._setAt(i, charCodes[start + i]);
+        }
+        return s;
+      }
+    }
+
+    // Fall through to normal case.
     for (int i = 0; i < len; i++) {
       s._setAt(i, charCodes[start + i]);
     }
@@ -368,7 +378,7 @@
   }
 
   String substring(int startIndex, [int endIndex]) {
-    if (endIndex == null) endIndex = this.length;
+    endIndex ??= this.length;
 
     if ((startIndex < 0) || (startIndex > this.length)) {
       throw new RangeError.value(startIndex);
@@ -623,7 +633,6 @@
     int replacementLength = replacement.length;
     int startIndex = 0;
     if (replacementLength == 0) {
-      int count = 0;
       for (Match match in pattern.allMatches(this)) {
         length += _addReplaceSlice(matches, startIndex, match.start);
         startIndex = match.end;
@@ -782,8 +791,8 @@
     if (pattern is! Pattern) {
       throw new ArgumentError("${pattern} is not a Pattern");
     }
-    if (onMatch == null) onMatch = _matchString;
-    if (onNonMatch == null) onNonMatch = _stringIdentity;
+    onMatch ??= _matchString;
+    onNonMatch ??= _stringIdentity;
     if (pattern is String) {
       String stringPattern = pattern;
       if (stringPattern.isEmpty) {
diff --git a/runtime/lib/timeline.cc b/runtime/lib/timeline.cc
index 5fb597bb..3e68d99 100644
--- a/runtime/lib/timeline.cc
+++ b/runtime/lib/timeline.cc
@@ -15,7 +15,7 @@
 
 // Native implementations for the dart:developer library.
 
-DEFINE_NATIVE_ENTRY(Timeline_isDartStreamEnabled, 0) {
+DEFINE_NATIVE_ENTRY(Timeline_isDartStreamEnabled, 0, 0) {
 #ifndef PRODUCT
   if (!FLAG_support_timeline) {
     return Bool::False().raw();
@@ -27,7 +27,7 @@
   return Bool::False().raw();
 }
 
-DEFINE_NATIVE_ENTRY(Timeline_getNextAsyncId, 0) {
+DEFINE_NATIVE_ENTRY(Timeline_getNextAsyncId, 0, 0) {
   if (!FLAG_support_timeline) {
     return Integer::New(0);
   }
@@ -38,15 +38,15 @@
   return Integer::New(recorder->GetNextAsyncId());
 }
 
-DEFINE_NATIVE_ENTRY(Timeline_getTraceClock, 0) {
+DEFINE_NATIVE_ENTRY(Timeline_getTraceClock, 0, 0) {
   return Integer::New(OS::GetCurrentMonotonicMicros(), Heap::kNew);
 }
 
-DEFINE_NATIVE_ENTRY(Timeline_getThreadCpuClock, 0) {
+DEFINE_NATIVE_ENTRY(Timeline_getThreadCpuClock, 0, 0) {
   return Integer::New(OS::GetCurrentThreadCPUMicros(), Heap::kNew);
 }
 
-DEFINE_NATIVE_ENTRY(Timeline_reportTaskEvent, 6) {
+DEFINE_NATIVE_ENTRY(Timeline_reportTaskEvent, 0, 6) {
 #ifndef PRODUCT
   if (!FLAG_support_timeline) {
     return Object::null();
@@ -76,7 +76,7 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Timeline_reportCompleteEvent, 5) {
+DEFINE_NATIVE_ENTRY(Timeline_reportCompleteEvent, 0, 5) {
 #ifndef PRODUCT
   if (!FLAG_support_timeline) {
     return Object::null();
@@ -105,7 +105,7 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Timeline_reportFlowEvent, 7) {
+DEFINE_NATIVE_ENTRY(Timeline_reportFlowEvent, 0, 7) {
 #ifndef PRODUCT
   if (!FLAG_support_timeline) {
     return Object::null();
@@ -137,7 +137,7 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(Timeline_reportInstantEvent, 4) {
+DEFINE_NATIVE_ENTRY(Timeline_reportInstantEvent, 0, 4) {
 #ifndef PRODUCT
   if (!FLAG_support_timeline) {
     return Object::null();
diff --git a/runtime/lib/timer_impl.dart b/runtime/lib/timer_impl.dart
index 89cb6cd..01db53f 100644
--- a/runtime/lib/timer_impl.dart
+++ b/runtime/lib/timer_impl.dart
@@ -124,7 +124,7 @@
 
   // Timers are ordered by wakeup time. Timers with a timeout value of > 0 do
   // end up on the TimerHeap. Timers with a timeout of 0 are queued in a list.
-  static _TimerHeap _heap = new _TimerHeap();
+  static final _heap = new _TimerHeap();
   static _Timer _firstZeroTimer;
   static _Timer _lastZeroTimer;
 
diff --git a/runtime/lib/timer_patch.dart b/runtime/lib/timer_patch.dart
index 3104ecb..88940ff 100644
--- a/runtime/lib/timer_patch.dart
+++ b/runtime/lib/timer_patch.dart
@@ -26,9 +26,7 @@
   static Timer _createPeriodicTimer(
       Duration duration, void callback(Timer timer)) {
     // TODO(iposva): Remove _TimerFactory and use VMLibraryHooks exclusively.
-    if (_TimerFactory._factory == null) {
-      _TimerFactory._factory = VMLibraryHooks.timerFactory;
-    }
+    _TimerFactory._factory ??= VMLibraryHooks.timerFactory;
     if (_TimerFactory._factory == null) {
       throw new UnsupportedError("Timer interface not supported.");
     }
diff --git a/runtime/lib/type_patch.dart b/runtime/lib/type_patch.dart
index 40eff3c..a05ce70 100644
--- a/runtime/lib/type_patch.dart
+++ b/runtime/lib/type_patch.dart
@@ -25,11 +25,3 @@
 // Equivalent of RawTypeParameter.
 @pragma("vm:entry-point")
 class _TypeParameter extends _AbstractType {}
-
-// Equivalent of RawBoundedType.
-@pragma("vm:entry-point")
-class _BoundedType extends _AbstractType {}
-
-// Equivalent of RawMixinAppType.
-@pragma("vm:entry-point")
-class _MixinAppType extends _AbstractType {}
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index 90fed75..4a373fc 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -37,7 +37,7 @@
   }
 }
 
-DEFINE_NATIVE_ENTRY(TypedData_length, 1) {
+DEFINE_NATIVE_ENTRY(TypedData_length, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0));
   if (instance.IsTypedData()) {
     const TypedData& array = TypedData::Cast(instance);
@@ -105,14 +105,16 @@
   }
 }
 
-DEFINE_NATIVE_ENTRY(TypedData_setRange, 7) {
-  const Instance& dst = Instance::CheckedHandle(arguments->NativeArgAt(0));
-  const Smi& dst_start = Smi::CheckedHandle(arguments->NativeArgAt(1));
-  const Smi& length = Smi::CheckedHandle(arguments->NativeArgAt(2));
-  const Instance& src = Instance::CheckedHandle(arguments->NativeArgAt(3));
-  const Smi& src_start = Smi::CheckedHandle(arguments->NativeArgAt(4));
-  const Smi& to_cid_smi = Smi::CheckedHandle(arguments->NativeArgAt(5));
-  const Smi& from_cid_smi = Smi::CheckedHandle(arguments->NativeArgAt(6));
+DEFINE_NATIVE_ENTRY(TypedData_setRange, 0, 7) {
+  const Instance& dst =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Smi& dst_start = Smi::CheckedHandle(zone, arguments->NativeArgAt(1));
+  const Smi& length = Smi::CheckedHandle(zone, arguments->NativeArgAt(2));
+  const Instance& src =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(3));
+  const Smi& src_start = Smi::CheckedHandle(zone, arguments->NativeArgAt(4));
+  const Smi& to_cid_smi = Smi::CheckedHandle(zone, arguments->NativeArgAt(5));
+  const Smi& from_cid_smi = Smi::CheckedHandle(zone, arguments->NativeArgAt(6));
 
   if (length.Value() < 0) {
     const String& error = String::Handle(String::NewFormatted(
@@ -145,12 +147,18 @@
 }
 
 // We check the length parameter against a possible maximum length for the
-// array based on available physical addressable memory on the system. The
-// maximum possible length is a scaled value of kSmiMax which is set up based
-// on whether the underlying architecture is 32-bit or 64-bit.
+// array based on available physical addressable memory on the system.
+//
+// More specifically
+//
+//   TypedData::MaxElements(cid) is equal to (kSmiMax / ElementSizeInBytes(cid))
+//
+// which ensures that the number of bytes the array holds is guaranteed to fit
+// into a _Smi.
+//
 // Argument 0 is type arguments and is ignored.
 #define TYPED_DATA_NEW(name)                                                   \
-  DEFINE_NATIVE_ENTRY(TypedData_##name##_new, 2) {                             \
+  DEFINE_NATIVE_ENTRY(TypedData_##name##_new, 0, 2) {                          \
     GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(1));      \
     intptr_t cid = kTypedData##name##Cid;                                      \
     intptr_t len = length.Value();                                             \
@@ -164,7 +172,7 @@
 CLASS_LIST_TYPED_DATA(TYPED_DATA_NEW_NATIVE)
 
 #define TYPED_DATA_GETTER(getter, object, ctor, access_size)                   \
-  DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) {                                 \
+  DEFINE_NATIVE_ENTRY(TypedData_##getter, 0, 2) {                              \
     GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance,                           \
                                  arguments->NativeArgAt(0));                   \
     GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes,                           \
@@ -189,7 +197,7 @@
 
 #define TYPED_DATA_SETTER(setter, object, get_object_value, access_size,       \
                           access_type)                                         \
-  DEFINE_NATIVE_ENTRY(TypedData_##setter, 3) {                                 \
+  DEFINE_NATIVE_ENTRY(TypedData_##setter, 0, 3) {                              \
     GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance,                           \
                                  arguments->NativeArgAt(0));                   \
     GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes,                           \
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
index 7387c96..91d7efd 100644
--- a/runtime/lib/typed_data_patch.dart
+++ b/runtime/lib/typed_data_patch.dart
@@ -39,12 +39,14 @@
   @pragma("vm:entry-point")
   factory ByteData(int length) {
     final list = new Uint8List(length) as _TypedList;
+    _rangeCheck(list.lengthInBytes, 0, length);
     return new _ByteDataView(list, 0, length);
   }
 
   // Called directly from C code.
   @pragma("vm:entry-point")
   factory ByteData._view(_TypedList typedData, int offsetInBytes, int length) {
+    _rangeCheck(typedData.lengthInBytes, offsetInBytes, length);
     return new _ByteDataView(typedData, offsetInBytes, length);
   }
 }
@@ -165,7 +167,7 @@
   }
 
   void shuffle([Random random]) {
-    if (random == null) random = new Random();
+    random ??= new Random();
     var i = this.length;
     while (i > 1) {
       int pos = random.nextInt(i);
@@ -282,7 +284,6 @@
   int reduce(int combine(int value, int element)) {
     var len = this.length;
     if (len == 0) throw IterableElementError.noElement();
-    var i = 0;
     var value = this[0];
     for (var i = 1; i < len; ++i) {
       value = combine(value, this[i]);
@@ -330,7 +331,6 @@
   }
 
   int lastWhere(bool test(int element), {int orElse()}) {
-    var result = null;
     var len = this.length;
     for (var i = len - 1; i >= 0; --i) {
       var element = this[i];
@@ -518,7 +518,7 @@
   }
 
   void shuffle([Random random]) {
-    if (random == null) random = new Random();
+    random ??= new Random();
     var i = this.length;
     while (i > 1) {
       int pos = random.nextInt(i);
@@ -637,7 +637,6 @@
   double reduce(double combine(double value, double element)) {
     var len = this.length;
     if (len == 0) throw IterableElementError.noElement();
-    var i = 0;
     var value = this[0];
     for (var i = 1; i < len; ++i) {
       value = combine(value, this[i]);
@@ -686,7 +685,6 @@
   }
 
   double lastWhere(bool test(double element), {double orElse()}) {
-    var result = null;
     var len = this.length;
     for (var i = len - 1; i >= 0; --i) {
       var element = this[i];
@@ -874,7 +872,7 @@
   }
 
   void shuffle([Random random]) {
-    if (random == null) random = new Random();
+    random ??= new Random();
     var i = this.length;
     while (i > 1) {
       int pos = random.nextInt(i);
@@ -994,7 +992,6 @@
   Float32x4 reduce(Float32x4 combine(Float32x4 value, Float32x4 element)) {
     var len = this.length;
     if (len == 0) throw IterableElementError.noElement();
-    var i = 0;
     var value = this[0];
     for (var i = 1; i < len; ++i) {
       value = combine(value, this[i]);
@@ -1043,7 +1040,6 @@
   }
 
   Float32x4 lastWhere(bool test(Float32x4 element), {Float32x4 orElse()}) {
-    var result = null;
     var len = this.length;
     for (var i = len - 1; i >= 0; --i) {
       var element = this[i];
@@ -1234,7 +1230,7 @@
   }
 
   void shuffle([Random random]) {
-    if (random == null) random = new Random();
+    random ??= new Random();
     var i = this.length;
     while (i > 1) {
       int pos = random.nextInt(i);
@@ -1353,7 +1349,6 @@
   Int32x4 reduce(Int32x4 combine(Int32x4 value, Int32x4 element)) {
     var len = this.length;
     if (len == 0) throw IterableElementError.noElement();
-    var i = 0;
     var value = this[0];
     for (var i = 1; i < len; ++i) {
       value = combine(value, this[i]);
@@ -1402,7 +1397,6 @@
   }
 
   Int32x4 lastWhere(bool test(Int32x4 element), {Int32x4 orElse()}) {
-    var result = null;
     var len = this.length;
     for (var i = len - 1; i >= 0; --i) {
       var element = this[i];
@@ -1593,7 +1587,7 @@
   }
 
   void shuffle([Random random]) {
-    if (random == null) random = new Random();
+    random ??= new Random();
     var i = this.length;
     while (i > 1) {
       int pos = random.nextInt(i);
@@ -1713,7 +1707,6 @@
   Float64x2 reduce(Float64x2 combine(Float64x2 value, Float64x2 element)) {
     var len = this.length;
     if (len == 0) throw IterableElementError.noElement();
-    var i = 0;
     var value = this[0];
     for (var i = 1; i < len; ++i) {
       value = combine(value, this[i]);
@@ -1762,7 +1755,6 @@
   }
 
   Float64x2 lastWhere(bool test(Float64x2 element), {Float64x2 orElse()}) {
-    var result = null;
     var len = this.length;
     for (var i = len - 1; i >= 0; --i) {
       var element = this[i];
@@ -1913,118 +1905,119 @@
       (other is _ByteBuffer) && identical(_data, other._data);
 
   ByteData asByteData([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = this.lengthInBytes - offsetInBytes;
-    }
+    length ??= this.lengthInBytes - offsetInBytes;
+    _rangeCheck(this._data.lengthInBytes, offsetInBytes, length);
     return new _ByteDataView(this._data, offsetInBytes, length);
   }
 
   Int8List asInt8List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = this.lengthInBytes - offsetInBytes;
-    }
+    length ??= (this.lengthInBytes - offsetInBytes) ~/ Int8List.bytesPerElement;
+    _rangeCheck(
+        this.lengthInBytes, offsetInBytes, length * Int8List.bytesPerElement);
     return new _Int8ArrayView(this, offsetInBytes, length);
   }
 
   Uint8List asUint8List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = this.lengthInBytes - offsetInBytes;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Uint8List.bytesPerElement;
+    _rangeCheck(
+        this.lengthInBytes, offsetInBytes, length * Uint8List.bytesPerElement);
     return new _Uint8ArrayView(this, offsetInBytes, length);
   }
 
   Uint8ClampedList asUint8ClampedList([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length = this.lengthInBytes - offsetInBytes;
-    }
+    length ??= (this.lengthInBytes - offsetInBytes) ~/
+        Uint8ClampedList.bytesPerElement;
+    _rangeCheck(this.lengthInBytes, offsetInBytes,
+        length * Uint8ClampedList.bytesPerElement);
     return new _Uint8ClampedArrayView(this, offsetInBytes, length);
   }
 
   Int16List asInt16List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Int16List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Int16List.bytesPerElement;
+    _rangeCheck(
+        this.lengthInBytes, offsetInBytes, length * Int16List.bytesPerElement);
     return new _Int16ArrayView(this, offsetInBytes, length);
   }
 
   Uint16List asUint16List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Uint16List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Uint16List.bytesPerElement;
+    _rangeCheck(
+        this.lengthInBytes, offsetInBytes, length * Uint16List.bytesPerElement);
     return new _Uint16ArrayView(this, offsetInBytes, length);
   }
 
   Int32List asInt32List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Int32List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Int32List.bytesPerElement;
+    _rangeCheck(
+        this.lengthInBytes, offsetInBytes, length * Int32List.bytesPerElement);
     return new _Int32ArrayView(this, offsetInBytes, length);
   }
 
   Uint32List asUint32List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Uint32List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Uint32List.bytesPerElement;
+    _rangeCheck(
+        this.lengthInBytes, offsetInBytes, length * Uint32List.bytesPerElement);
     return new _Uint32ArrayView(this, offsetInBytes, length);
   }
 
   Int64List asInt64List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Int64List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Int64List.bytesPerElement;
+    _rangeCheck(
+        this.lengthInBytes, offsetInBytes, length * Int64List.bytesPerElement);
     return new _Int64ArrayView(this, offsetInBytes, length);
   }
 
   Uint64List asUint64List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Uint64List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Uint64List.bytesPerElement;
+    _rangeCheck(
+        this.lengthInBytes, offsetInBytes, length * Uint64List.bytesPerElement);
     return new _Uint64ArrayView(this, offsetInBytes, length);
   }
 
   Float32List asFloat32List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Float32List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Float32List.bytesPerElement;
+    _rangeCheck(this.lengthInBytes, offsetInBytes,
+        length * Float32List.bytesPerElement);
     return new _Float32ArrayView(this, offsetInBytes, length);
   }
 
   Float64List asFloat64List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Float64List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Float64List.bytesPerElement;
+    _rangeCheck(this.lengthInBytes, offsetInBytes,
+        length * Float64List.bytesPerElement);
     return new _Float64ArrayView(this, offsetInBytes, length);
   }
 
   Float32x4List asFloat32x4List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Float32x4List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Float32x4List.bytesPerElement;
+    _rangeCheck(this.lengthInBytes, offsetInBytes,
+        length * Float32x4List.bytesPerElement);
     return new _Float32x4ArrayView(this, offsetInBytes, length);
   }
 
   Int32x4List asInt32x4List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Int32x4List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Int32x4List.bytesPerElement;
+    _rangeCheck(this.lengthInBytes, offsetInBytes,
+        length * Int32x4List.bytesPerElement);
     return new _Int32x4ArrayView(this, offsetInBytes, length);
   }
 
   Float64x2List asFloat64x2List([int offsetInBytes = 0, int length]) {
-    if (length == null) {
-      length =
-          (this.lengthInBytes - offsetInBytes) ~/ Float64x2List.bytesPerElement;
-    }
+    length ??=
+        (this.lengthInBytes - offsetInBytes) ~/ Float64x2List.bytesPerElement;
+    _rangeCheck(this.lengthInBytes, offsetInBytes,
+        length * Float64x2List.bytesPerElement);
     return new _Float64x2ArrayView(this, offsetInBytes, length);
   }
 }
@@ -3572,7 +3565,7 @@
   _TypedListView(_ByteBuffer _buffer, int _offset, int _length)
       : _typedData = _buffer._data,
         offsetInBytes = _offset,
-        length = _length {}
+        length = _length;
 
   // Method(s) implementing the TypedData interface.
 
@@ -3584,8 +3577,13 @@
     return _typedData.buffer;
   }
 
+  @pragma("vm:non-nullable-result-type")
   final _TypedList _typedData;
+
+  @pragma("vm:exact-result-type", "dart:core#_Smi")
   final int offsetInBytes;
+
+  @pragma("vm:exact-result-type", "dart:core#_Smi")
   final int length;
 }
 
@@ -3594,17 +3592,8 @@
     with _IntListMixin
     implements Int8List {
   // Constructor.
-  _Int8ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Int8List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, _offsetInBytes,
-        length * Int8List.bytesPerElement);
-  }
+  _Int8ArrayView(_ByteBuffer buffer, int offsetInBytes, int length)
+      : super(buffer, offsetInBytes, length);
 
   // Method(s) implementing List interface.
   int operator [](int index) {
@@ -3639,17 +3628,8 @@
     with _IntListMixin
     implements Uint8List {
   // Constructor.
-  _Uint8ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Uint8List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, _offsetInBytes,
-        length * Uint8List.bytesPerElement);
-  }
+  _Uint8ArrayView(_ByteBuffer buffer, int offsetInBytes, int length)
+      : super(buffer, offsetInBytes, length);
 
   // Method(s) implementing List interface.
   int operator [](int index) {
@@ -3684,18 +3664,8 @@
     with _IntListMixin
     implements Uint8ClampedList {
   // Constructor.
-  _Uint8ClampedArrayView(_ByteBuffer buffer,
-      [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Uint8List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Uint8List.bytesPerElement);
-  }
+  _Uint8ClampedArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length);
 
   // Method(s) implementing List interface.
   int operator [](int index) {
@@ -3730,16 +3700,8 @@
     with _IntListMixin
     implements Int16List {
   // Constructor.
-  _Int16ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Int16List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Int16List.bytesPerElement);
+  _Int16ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Int16List.bytesPerElement);
   }
 
@@ -3788,16 +3750,8 @@
     with _IntListMixin
     implements Uint16List {
   // Constructor.
-  _Uint16ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Uint16List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Uint16List.bytesPerElement);
+  _Uint16ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Uint16List.bytesPerElement);
   }
 
@@ -3847,16 +3801,8 @@
     with _IntListMixin
     implements Int32List {
   // Constructor.
-  _Int32ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Int32List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Int32List.bytesPerElement);
+  _Int32ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Int32List.bytesPerElement);
   }
 
@@ -3893,16 +3839,8 @@
     with _IntListMixin
     implements Uint32List {
   // Constructor.
-  _Uint32ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Uint32List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Uint32List.bytesPerElement);
+  _Uint32ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Uint32List.bytesPerElement);
   }
 
@@ -3939,16 +3877,8 @@
     with _IntListMixin
     implements Int64List {
   // Constructor.
-  _Int64ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Int64List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Int64List.bytesPerElement);
+  _Int64ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Int64List.bytesPerElement);
   }
 
@@ -3985,16 +3915,8 @@
     with _IntListMixin
     implements Uint64List {
   // Constructor.
-  _Uint64ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Uint64List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Uint64List.bytesPerElement);
+  _Uint64ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Uint64List.bytesPerElement);
   }
 
@@ -4031,16 +3953,8 @@
     with _DoubleListMixin
     implements Float32List {
   // Constructor.
-  _Float32ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Float32List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Float32List.bytesPerElement);
+  _Float32ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Float32List.bytesPerElement);
   }
 
@@ -4077,16 +3991,8 @@
     with _DoubleListMixin
     implements Float64List {
   // Constructor.
-  _Float64ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Float64List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Float64List.bytesPerElement);
+  _Float64ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Float64List.bytesPerElement);
   }
 
@@ -4123,16 +4029,8 @@
     with _Float32x4ListMixin
     implements Float32x4List {
   // Constructor.
-  _Float32x4ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Float32x4List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Float32x4List.bytesPerElement);
+  _Float32x4ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Float32x4List.bytesPerElement);
   }
 
@@ -4169,16 +4067,8 @@
     with _Int32x4ListMixin
     implements Int32x4List {
   // Constructor.
-  _Int32x4ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Int32x4List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Int32x4List.bytesPerElement);
+  _Int32x4ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Int32x4List.bytesPerElement);
   }
 
@@ -4215,16 +4105,8 @@
     with _Float64x2ListMixin
     implements Float64x2List {
   // Constructor.
-  _Float64x2ArrayView(_ByteBuffer buffer, [int _offsetInBytes = 0, int _length])
-      : super(
-            buffer,
-            _offsetInBytes,
-            _defaultIfNull(
-                _length,
-                ((buffer.lengthInBytes - _offsetInBytes) ~/
-                    Float64x2List.bytesPerElement))) {
-    _rangeCheck(buffer.lengthInBytes, offsetInBytes,
-        length * Float64x2List.bytesPerElement);
+  _Float64x2ArrayView(_ByteBuffer buffer, int _offsetInBytes, int _length)
+      : super(buffer, _offsetInBytes, _length) {
     _offsetAlignmentCheck(_offsetInBytes, Float64x2List.bytesPerElement);
   }
 
@@ -4258,12 +4140,7 @@
 
 @pragma("vm:entry-point")
 class _ByteDataView implements ByteData {
-  _ByteDataView(_TypedList typedData, int _offsetInBytes, int _lengthInBytes)
-      : _typedData = typedData,
-        _offset = _offsetInBytes,
-        length = _lengthInBytes {
-    _rangeCheck(_typedData.lengthInBytes, _offset, length);
-  }
+  _ByteDataView(this._typedData, this._offset, this.length);
 
   // Method(s) implementing TypedData interface.
   _ByteBuffer get buffer {
@@ -4551,6 +4428,9 @@
   return value & 0xFFFFFFFF;
 }
 
+// In addition to explicitly checking the range, this method implicitly ensures
+// that all arguments are non-null (a no such method error gets thrown
+// otherwise).
 void _rangeCheck(int listLength, int start, int length) {
   if (length < 0) {
     throw new RangeError.value(length);
@@ -4569,10 +4449,3 @@
         'BYTES_PER_ELEMENT ($alignment)');
   }
 }
-
-int _defaultIfNull(object, value) {
-  if (object == null) {
-    return value;
-  }
-  return object;
-}
diff --git a/runtime/lib/uri.cc b/runtime/lib/uri.cc
index 2f5dba1..4f1ef81 100644
--- a/runtime/lib/uri.cc
+++ b/runtime/lib/uri.cc
@@ -8,7 +8,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(Uri_isWindowsPlatform, 0) {
+DEFINE_NATIVE_ENTRY(Uri_isWindowsPlatform, 0, 0) {
 #if defined(HOST_OS_WINDOWS)
   return Bool::True().raw();
 #else
diff --git a/runtime/lib/vmservice.cc b/runtime/lib/vmservice.cc
index 76d5fc9..deec036 100644
--- a/runtime/lib/vmservice.cc
+++ b/runtime/lib/vmservice.cc
@@ -78,7 +78,8 @@
 };
 #endif  // !PRODUCT
 
-DEFINE_NATIVE_ENTRY(VMService_SendIsolateServiceMessage, 2) {
+DEFINE_NATIVE_ENTRY(VMService_SendIsolateServiceMessage, 0, 2) {
+#ifndef PRODUCT
   if (!FLAG_support_service) {
     return Bool::Get(false).raw();
   }
@@ -95,25 +96,33 @@
   bool result = PortMap::PostMessage(
       writer.WriteMessage(message, sp.Id(), Message::kOOBPriority));
   return Bool::Get(result).raw();
+#else
+  return Object::null();
+#endif
 }
 
-DEFINE_NATIVE_ENTRY(VMService_SendRootServiceMessage, 1) {
+DEFINE_NATIVE_ENTRY(VMService_SendRootServiceMessage, 0, 1) {
+#ifndef PRODUCT
   GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(0));
   if (FLAG_support_service) {
     return Service::HandleRootMessage(message);
   }
+#endif
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(VMService_SendObjectRootServiceMessage, 1) {
+DEFINE_NATIVE_ENTRY(VMService_SendObjectRootServiceMessage, 0, 1) {
+#ifndef PRODUCT
   GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(0));
   if (FLAG_support_service) {
     return Service::HandleObjectRootMessage(message);
   }
+#endif
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(VMService_OnStart, 0) {
+DEFINE_NATIVE_ENTRY(VMService_OnStart, 0, 0) {
+#ifndef PRODUCT
   if (FLAG_trace_service) {
     OS::PrintErr("vm-service: Booting dart:vmservice library.\n");
   }
@@ -122,7 +131,6 @@
   if (!FLAG_support_service) {
     return Object::null();
   }
-#ifndef PRODUCT
   // Register running isolates with service.
   RegisterRunningIsolatesVisitor register_isolates(thread);
   if (FLAG_trace_service) {
@@ -133,17 +141,20 @@
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(VMService_OnExit, 0) {
+DEFINE_NATIVE_ENTRY(VMService_OnExit, 0, 0) {
+#ifndef PRODUCT
   if (FLAG_trace_service) {
     OS::PrintErr("vm-service: processed exit message.\n");
     MessageHandler* message_handler = isolate->message_handler();
     OS::PrintErr("vm-service: live ports = %" Pd "\n",
                  message_handler->live_ports());
   }
+#endif
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(VMService_OnServerAddressChange, 1) {
+DEFINE_NATIVE_ENTRY(VMService_OnServerAddressChange, 0, 1) {
+#ifndef PRODUCT
   if (!FLAG_support_service) {
     return Object::null();
   }
@@ -153,31 +164,42 @@
   } else {
     ServiceIsolate::SetServerAddress(address.ToCString());
   }
+#endif
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(VMService_ListenStream, 1) {
+DEFINE_NATIVE_ENTRY(VMService_ListenStream, 0, 1) {
+#ifndef PRODUCT
   GET_NON_NULL_NATIVE_ARGUMENT(String, stream_id, arguments->NativeArgAt(0));
   bool result = false;
   if (FLAG_support_service) {
     result = Service::ListenStream(stream_id.ToCString());
   }
   return Bool::Get(result).raw();
+#else
+  return Object::null();
+#endif
 }
 
-DEFINE_NATIVE_ENTRY(VMService_CancelStream, 1) {
+DEFINE_NATIVE_ENTRY(VMService_CancelStream, 0, 1) {
+#ifndef PRODUCT
   GET_NON_NULL_NATIVE_ARGUMENT(String, stream_id, arguments->NativeArgAt(0));
   if (FLAG_support_service) {
     Service::CancelStream(stream_id.ToCString());
   }
+#endif
   return Object::null();
 }
 
-DEFINE_NATIVE_ENTRY(VMService_RequestAssets, 0) {
+DEFINE_NATIVE_ENTRY(VMService_RequestAssets, 0, 0) {
+#ifndef PRODUCT
   if (!FLAG_support_service) {
     return Object::null();
   }
   return Service::RequestAssets();
+#else
+  return Object::null();
+#endif
 }
 
 #ifndef PRODUCT
@@ -359,55 +381,57 @@
 
 #endif
 
-DEFINE_NATIVE_ENTRY(VMService_DecodeAssets, 1) {
+DEFINE_NATIVE_ENTRY(VMService_DecodeAssets, 0, 1) {
 #ifndef PRODUCT
   if (!FLAG_support_service) {
     return Object::null();
   }
   GET_NON_NULL_NATIVE_ARGUMENT(TypedData, data, arguments->NativeArgAt(0));
-  TransitionVMToNative transition(thread);
   Api::Scope scope(thread);
-
   Dart_Handle data_handle = Api::NewHandle(thread, data.raw());
+  Dart_Handle result_list;
+  {
+    TransitionVMToNative transition(thread);
 
-  Dart_TypedData_Type typ;
-  void* bytes;
-  intptr_t length;
-  Dart_Handle err =
-      Dart_TypedDataAcquireData(data_handle, &typ, &bytes, &length);
-  ASSERT(!Dart_IsError(err));
+    Dart_TypedData_Type typ;
+    void* bytes;
+    intptr_t length;
+    Dart_Handle err =
+        Dart_TypedDataAcquireData(data_handle, &typ, &bytes, &length);
+    ASSERT(!Dart_IsError(err));
 
-  TarArchive archive(reinterpret_cast<uint8_t*>(bytes), length);
-  archive.Read();
+    TarArchive archive(reinterpret_cast<uint8_t*>(bytes), length);
+    archive.Read();
 
-  err = Dart_TypedDataReleaseData(data_handle);
-  ASSERT(!Dart_IsError(err));
+    err = Dart_TypedDataReleaseData(data_handle);
+    ASSERT(!Dart_IsError(err));
 
-  intptr_t archive_size = archive.Length();
+    intptr_t archive_size = archive.Length();
 
-  Dart_Handle result_list = Dart_NewList(2 * archive_size);
-  ASSERT(!Dart_IsError(result_list));
+    result_list = Dart_NewList(2 * archive_size);
+    ASSERT(!Dart_IsError(result_list));
 
-  intptr_t idx = 0;
-  while (archive.HasMore()) {
-    char* filename = archive.NextFilename();
-    intptr_t filename_length = strlen(filename);
-    uint8_t* contents = archive.NextContent();
-    intptr_t contents_length = archive.NextContentLength();
+    intptr_t idx = 0;
+    while (archive.HasMore()) {
+      char* filename = archive.NextFilename();
+      intptr_t filename_length = strlen(filename);
+      uint8_t* contents = archive.NextContent();
+      intptr_t contents_length = archive.NextContentLength();
 
-    Dart_Handle dart_filename = Dart_NewExternalLatin1String(
-        reinterpret_cast<uint8_t*>(filename), filename_length, filename,
-        filename_length, FilenameFinalizer);
-    ASSERT(!Dart_IsError(dart_filename));
+      Dart_Handle dart_filename = Dart_NewExternalLatin1String(
+          reinterpret_cast<uint8_t*>(filename), filename_length, filename,
+          filename_length, FilenameFinalizer);
+      ASSERT(!Dart_IsError(dart_filename));
 
-    Dart_Handle dart_contents = Dart_NewExternalTypedDataWithFinalizer(
-        Dart_TypedData_kUint8, contents, contents_length, contents,
-        contents_length, ContentsFinalizer);
-    ASSERT(!Dart_IsError(dart_contents));
+      Dart_Handle dart_contents = Dart_NewExternalTypedDataWithFinalizer(
+          Dart_TypedData_kUint8, contents, contents_length, contents,
+          contents_length, ContentsFinalizer);
+      ASSERT(!Dart_IsError(dart_contents));
 
-    Dart_ListSetAt(result_list, idx, dart_filename);
-    Dart_ListSetAt(result_list, (idx + 1), dart_contents);
-    idx += 2;
+      Dart_ListSetAt(result_list, idx, dart_filename);
+      Dart_ListSetAt(result_list, (idx + 1), dart_contents);
+      idx += 2;
+    }
   }
   return Api::UnwrapArrayHandle(thread->zone(), result_list).raw();
 #else
@@ -415,7 +439,7 @@
 #endif
 }
 
-DEFINE_NATIVE_ENTRY(VMService_spawnUriNotify, 2) {
+DEFINE_NATIVE_ENTRY(VMService_spawnUriNotify, 0, 2) {
 #ifndef PRODUCT
   if (!FLAG_support_service) {
     return Object::null();
diff --git a/runtime/lib/weak_property.cc b/runtime/lib/weak_property.cc
index 069f77d..8715b6d 100644
--- a/runtime/lib/weak_property.cc
+++ b/runtime/lib/weak_property.cc
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-DEFINE_NATIVE_ENTRY(WeakProperty_new, 2) {
+DEFINE_NATIVE_ENTRY(WeakProperty_new, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, key, arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(1));
   const WeakProperty& weak_property = WeakProperty::Handle(WeakProperty::New());
@@ -19,19 +19,19 @@
   return weak_property.raw();
 }
 
-DEFINE_NATIVE_ENTRY(WeakProperty_getKey, 1) {
+DEFINE_NATIVE_ENTRY(WeakProperty_getKey, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(WeakProperty, weak_property,
                                arguments->NativeArgAt(0));
   return weak_property.key();
 }
 
-DEFINE_NATIVE_ENTRY(WeakProperty_getValue, 1) {
+DEFINE_NATIVE_ENTRY(WeakProperty_getValue, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(WeakProperty, weak_property,
                                arguments->NativeArgAt(0));
   return weak_property.value();
 }
 
-DEFINE_NATIVE_ENTRY(WeakProperty_setValue, 2) {
+DEFINE_NATIVE_ENTRY(WeakProperty_setValue, 0, 2) {
   GET_NON_NULL_NATIVE_ARGUMENT(WeakProperty, weak_property,
                                arguments->NativeArgAt(0));
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(1));
diff --git a/runtime/observatory/lib/sample_profile.dart b/runtime/observatory/lib/sample_profile.dart
index f81f3bd..e755ad3 100644
--- a/runtime/observatory/lib/sample_profile.dart
+++ b/runtime/observatory/lib/sample_profile.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'dart:typed_data';
+import 'package:logging/logging.dart';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service.dart';
 import 'package:observatory/utils.dart';
diff --git a/runtime/observatory/lib/service_io.dart b/runtime/observatory/lib/service_io.dart
index 63857cb..4565d9f 100644
--- a/runtime/observatory/lib/service_io.dart
+++ b/runtime/observatory/lib/service_io.dart
@@ -32,7 +32,7 @@
   }
 
   bool get isOpen =>
-      (_webSocket != null) && (_webSocket.readyState == WebSocket.OPEN);
+      (_webSocket != null) && (_webSocket.readyState == WebSocket.open);
 
   void send(dynamic data) {
     _webSocket.add(data);
diff --git a/runtime/observatory/lib/src/app/page.dart b/runtime/observatory/lib/src/app/page.dart
index 0009df1..9563098 100644
--- a/runtime/observatory/lib/src/app/page.dart
+++ b/runtime/observatory/lib/src/app/page.dart
@@ -15,7 +15,6 @@
 final _heapSnapshotRepository = new HeapSnapshotRepository();
 final _icdataRepository = new ICDataRepository();
 final _inboundReferencesRepository = new InboundReferencesRepository();
-final _instanceRepository = new InstanceRepository();
 final _isolateSampleProfileRepository = new IsolateSampleProfileRepository();
 final _libraryRepository = new LibraryRepository();
 final _megamorphicCacheRepository = new MegamorphicCacheRepository();
diff --git a/runtime/observatory/lib/src/elements/cpu_profile_table.dart b/runtime/observatory/lib/src/elements/cpu_profile_table.dart
index a78e2a4..b1a9160 100644
--- a/runtime/observatory/lib/src/elements/cpu_profile_table.dart
+++ b/runtime/observatory/lib/src/elements/cpu_profile_table.dart
@@ -411,7 +411,7 @@
 
   Future _request({bool clear: false, bool forceFetch: false}) async {
     _progress = null;
-    _progressStream = _profiles.get(isolate, M.SampleProfileTag.none,
+    _progressStream = _profiles.get(isolate, M.SampleProfileTag.vmOnly,
         clear: clear, forceFetch: forceFetch);
     _r.dirty();
     _progress = (await _progressStream.first).progress;
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index 57d775a..3c32189 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -288,6 +288,21 @@
             ]
         ]);
     }
+    if (_function.bytecode != null) {
+      members.add(new DivElement()
+        ..classes = ['memberItem']
+        ..children = <Element>[
+          new DivElement()
+            ..classes = ['memberName']
+            ..text = 'bytecode',
+          new DivElement()
+            ..classes = ['memberName']
+            ..children = <Element>[
+              new CodeRefElement(_isolate, _function.bytecode,
+                  queue: _r.queue),
+            ]
+        ]);
+    }
     members.add(new DivElement()
       ..classes = ['memberItem']
       ..text = ' ');
diff --git a/runtime/observatory/lib/src/elements/instance_ref.dart b/runtime/observatory/lib/src/elements/instance_ref.dart
index 9130e69..6ee4dfd 100644
--- a/runtime/observatory/lib/src/elements/instance_ref.dart
+++ b/runtime/observatory/lib/src/elements/instance_ref.dart
@@ -128,7 +128,6 @@
       case M.InstanceKind.type:
       case M.InstanceKind.typeRef:
       case M.InstanceKind.typeParameter:
-      case M.InstanceKind.boundedType:
         return [
           new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
             ..text = _instance.name
diff --git a/runtime/observatory/lib/src/elements/sample_buffer_control.dart b/runtime/observatory/lib/src/elements/sample_buffer_control.dart
index c9b8452..0d5b38c 100644
--- a/runtime/observatory/lib/src/elements/sample_buffer_control.dart
+++ b/runtime/observatory/lib/src/elements/sample_buffer_control.dart
@@ -220,7 +220,7 @@
   List<Element> _createTagSelect() {
     var values = M.SampleProfileTag.values;
     if (!_profileVM) {
-      values = const [M.SampleProfileTag.userOnly, M.SampleProfileTag.none];
+      values = const [M.SampleProfileTag.userOnly, M.SampleProfileTag.vmOnly, M.SampleProfileTag.none];
     }
     var s;
     return [
diff --git a/runtime/observatory/lib/src/models/objects/field.dart b/runtime/observatory/lib/src/models/objects/field.dart
index d0d1221..ca59328c 100644
--- a/runtime/observatory/lib/src/models/objects/field.dart
+++ b/runtime/observatory/lib/src/models/objects/field.dart
@@ -15,7 +15,7 @@
   /// The declared type of this field.
   ///
   /// The value will always be of one of the kinds:
-  /// Type, TypeRef, TypeParameter, BoundedType.
+  /// Type, TypeRef, TypeParameter.
   InstanceRef get declaredType;
 
   /// Is this field const?
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index e619f5e..541dcad 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -87,6 +87,9 @@
   CodeRef get unoptimizedCode;
 
   /// [optional]
+  CodeRef get bytecode;
+
+  /// [optional]
   FieldRef get field;
   int get usageCounter;
   InstanceRef get icDataArray;
diff --git a/runtime/observatory/lib/src/models/objects/instance.dart b/runtime/observatory/lib/src/models/objects/instance.dart
index 1a1b8d4..66965e9 100644
--- a/runtime/observatory/lib/src/models/objects/instance.dart
+++ b/runtime/observatory/lib/src/models/objects/instance.dart
@@ -120,9 +120,6 @@
 
   /// An instance of the Dart class TypeRef.
   typeRef,
-
-  /// An instance of the Dart class BoundedType.
-  boundedType,
 }
 
 bool isTypedData(InstanceKind kind) {
@@ -163,7 +160,6 @@
     case InstanceKind.type:
     case InstanceKind.typeRef:
     case InstanceKind.typeParameter:
-    case InstanceKind.boundedType:
       return true;
     default:
       return false;
@@ -376,25 +372,21 @@
   ///   TypeParameter
   int get parameterIndex;
 
-  /// [optional] The type bounded by a BoundedType instance
-  /// - or -
-  /// the referent of a TypeRef instance.
+  /// [optional] The referent of a TypeRef instance.
   ///
   /// The value will always be of one of the kinds:
-  /// Type, TypeRef, TypeParameter, BoundedType.
+  /// Type, TypeRef, TypeParameter.
   ///
   /// Provided for instance kinds:
-  ///   BoundedType
   ///   TypeRef
   InstanceRef get targetType;
 
-  /// [optional] The bound of a TypeParameter or BoundedType.
+  /// [optional] The bound of a TypeParameter.
   ///
   /// The value will always be of one of the kinds:
-  /// Type, TypeRef, TypeParameter, BoundedType.
+  /// Type, TypeRef, TypeParameter.
   ///
   /// Provided for instance kinds:
-  ///   BoundedType
   ///   TypeParameter
   InstanceRef get bound;
 
diff --git a/runtime/observatory/lib/src/models/objects/type_arguments.dart b/runtime/observatory/lib/src/models/objects/type_arguments.dart
index 13316af..a3614dd 100644
--- a/runtime/observatory/lib/src/models/objects/type_arguments.dart
+++ b/runtime/observatory/lib/src/models/objects/type_arguments.dart
@@ -13,6 +13,6 @@
   /// A list of types.
   ///
   /// The value will always be one of the kinds:
-  /// Type, TypeRef, TypeParameter, BoundedType.
+  /// Type, TypeRef, TypeParameter.
   Iterable<InstanceRef> get types;
 }
diff --git a/runtime/observatory/lib/src/repositories/eval.dart b/runtime/observatory/lib/src/repositories/eval.dart
index bf423ad..90b8b12 100644
--- a/runtime/observatory/lib/src/repositories/eval.dart
+++ b/runtime/observatory/lib/src/repositories/eval.dart
@@ -11,6 +11,6 @@
     assert(isolate != null);
     assert(object != null);
     assert(e != null);
-    return (await isolate.eval(object, e)) as M.ObjectRef;
+    return await isolate.eval(object, e);
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/heap_snapshot.dart b/runtime/observatory/lib/src/repositories/heap_snapshot.dart
index cea60e2..198af19 100644
--- a/runtime/observatory/lib/src/repositories/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/repositories/heap_snapshot.dart
@@ -90,12 +90,13 @@
   }
 
   void reuse() {
-    _onProgress =
+    final onProgress =
         new StreamController<HeapSnapshotLoadingProgressEvent>.broadcast();
-    (() async {
-      _triggerOnProgress();
-      _onProgress.close();
-    }());
+    Timer.run(() {
+      onProgress.add(new HeapSnapshotLoadingProgressEvent(this));
+      onProgress.close();
+    });
+    _onProgress = onProgress;
   }
 }
 
diff --git a/runtime/observatory/lib/src/repositories/sample_profile.dart b/runtime/observatory/lib/src/repositories/sample_profile.dart
index 3dace5a..27d03c5 100644
--- a/runtime/observatory/lib/src/repositories/sample_profile.dart
+++ b/runtime/observatory/lib/src/repositories/sample_profile.dart
@@ -115,12 +115,13 @@
   }
 
   void reuse() {
-    _onProgress =
+    final onProgress =
         new StreamController<SampleProfileLoadingProgressEvent>.broadcast();
-    (() async {
-      _triggerOnProgress();
-      _onProgress.close();
-    }());
+    Timer.run(() {
+      onProgress.add(new SampleProfileLoadingProgressEvent(this));
+      onProgress.close();
+    });
+    _onProgress = onProgress;
   }
 }
 
diff --git a/runtime/observatory/lib/src/sample_profile/sample_profile.dart b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
index ebc625a..8ff90eb 100644
--- a/runtime/observatory/lib/src/sample_profile/sample_profile.dart
+++ b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
@@ -830,6 +830,8 @@
   }
 
   Stream<double> loadProgress(ServiceObjectOwner owner, ServiceMap profile) {
+    Logger.root.info('sampling counters ${profile['counters']}');
+
     var progress = new StreamController<double>.broadcast();
 
     (() async {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index ab6ec7b..aa59574 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -1990,8 +1990,7 @@
       'address': address,
       'ref': ref,
     };
-    return invokeRpc('_getObjectByAddress', params)
-        .then((result) => result as ServiceObject);
+    return invokeRpc('_getObjectByAddress', params);
   }
 
   final Map<String, ServiceMetric> dartMetrics = <String, ServiceMetric>{};
@@ -2749,8 +2748,6 @@
       return M.InstanceKind.typeParameter;
     case 'TypeRef':
       return M.InstanceKind.typeRef;
-    case 'BoundedType':
-      return M.InstanceKind.boundedType;
   }
   var message = 'Unrecognized instance kind: $s';
   Logger.root.severe(message);
@@ -3136,6 +3133,7 @@
   SourceLocation location;
   Code code;
   Code unoptimizedCode;
+  Code bytecode;
   bool isOptimizable;
   bool isInlinable;
   bool hasIntrinsic;
@@ -3194,6 +3192,7 @@
     isInlinable = map['_inlinable'];
     isRecognized = map['_recognized'];
     unoptimizedCode = map['_unoptimizedCode'];
+    bytecode = map['_bytecode'];
     deoptimizations = map['_deoptimizations'];
     usageCounter = map['_usageCounter'];
     icDataArray = map['_icDataArray'];
@@ -3698,7 +3697,7 @@
     }
     // Line and column numbers start at 1 in the VM.
     column -= 1;
-    String sourceLine = getLine(line).text;
+    String sourceLine = getLine(line)?.text;
     if (sourceLine == null) {
       return null;
     }
@@ -3718,7 +3717,7 @@
       UnresolvedSourceLocation loc = bpt.location;
       line = loc.line;
     }
-    getLine(line).addBreakpoint(bpt);
+    getLine(line)?.addBreakpoint(bpt);
   }
 
   void _removeBreakpoint(Breakpoint bpt) {
@@ -3730,7 +3729,7 @@
       line = loc.line;
     }
     if (line != null) {
-      getLine(line).removeBreakpoint(bpt);
+      getLine(line)?.removeBreakpoint(bpt);
     }
   }
 
diff --git a/runtime/observatory/pubspec.yaml b/runtime/observatory/pubspec.yaml
index c1dcd02..76e6219 100644
--- a/runtime/observatory/pubspec.yaml
+++ b/runtime/observatory/pubspec.yaml
@@ -1 +1,3 @@
 name: observatory
+environment:
+  sdk: '>=2.0.0 <3.0.0'
diff --git a/runtime/observatory/tests/observatory_ui/mocks/objects/function.dart b/runtime/observatory/tests/observatory_ui/mocks/objects/function.dart
index bbe2c28..00f3ca5 100644
--- a/runtime/observatory/tests/observatory_ui/mocks/objects/function.dart
+++ b/runtime/observatory/tests/observatory_ui/mocks/objects/function.dart
@@ -33,6 +33,7 @@
   final M.SourceLocation location;
   final M.CodeRef code;
   final M.CodeRef unoptimizedCode;
+  final M.CodeRef bytecode;
   final M.FieldRef field;
   final int usageCounter;
   final M.InstanceRef icDataArray;
@@ -55,6 +56,7 @@
     this.location,
     this.code,
     this.unoptimizedCode,
+    this.bytecode,
     this.field,
     this.usageCounter: 0,
     this.icDataArray: const InstanceRefMock(),
diff --git a/runtime/observatory/tests/service/async_generator_breakpoint_test.dart b/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
index fdef362..af14028 100644
--- a/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
+++ b/runtime/observatory/tests/service/async_generator_breakpoint_test.dart
@@ -1,8 +1,8 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--verbose-debug --no-sync-async
-// VMOptions=--verbose-debug --stacktrace-every=55 --stress-async-stacks --no-sync-async
+// VMOptions=--verbose-debug
+// VMOptions=--verbose-debug --stacktrace-every=55 --stress-async-stacks
 
 import 'dart:async';
 import 'package:observatory/service_io.dart';
@@ -10,19 +10,21 @@
 import 'test_helper.dart';
 
 printSync() {
-  print('sync'); // Line 12
+  print('sync'); // Line 13
 }
 
 printAsync() async {
-  print('async'); // Line 16
+  await null;
+  print('async'); // Line 18
 }
 
 printAsyncStar() async* {
-  print('async*'); // Line 20
+  await null;
+  print('async*'); // Line 23
 }
 
 printSyncStar() sync* {
-  print('sync*'); // Line 24
+  print('sync*'); // Line 27
 }
 
 var testerReady = false;
@@ -39,7 +41,7 @@
   var stream = printAsyncStar();
   var iterator = printSyncStar();
 
-  print('middle'); // Line 42
+  print('middle'); // Line 44
 
   future.then((v) => print(v));
   stream.toList();
@@ -50,19 +52,19 @@
   await isolate.rootLibrary.load();
   var script = isolate.rootLibrary.scripts[0];
 
-  var bp1 = await isolate.addBreakpoint(script, 12);
+  var bp1 = await isolate.addBreakpoint(script, 13);
   expect(bp1, isNotNull);
   expect(bp1 is Breakpoint, isTrue);
-  var bp2 = await isolate.addBreakpoint(script, 16);
+  var bp2 = await isolate.addBreakpoint(script, 18);
   expect(bp2, isNotNull);
   expect(bp2 is Breakpoint, isTrue);
-  var bp3 = await isolate.addBreakpoint(script, 20);
+  var bp3 = await isolate.addBreakpoint(script, 23);
   expect(bp3, isNotNull);
   expect(bp3 is Breakpoint, isTrue);
-  var bp4 = await isolate.addBreakpoint(script, 24);
+  var bp4 = await isolate.addBreakpoint(script, 27);
   expect(bp4, isNotNull);
   expect(bp4 is Breakpoint, isTrue);
-  var bp5 = await isolate.addBreakpoint(script, 42);
+  var bp5 = await isolate.addBreakpoint(script, 44);
   print("BP5 - $bp5");
   expect(bp5, isNotNull);
   expect(bp5 is Breakpoint, isTrue);
diff --git a/runtime/observatory/tests/service/async_single_step_exception_test.dart b/runtime/observatory/tests/service/async_single_step_exception_test.dart
index cb91485..d269a72 100644
--- a/runtime/observatory/tests/service/async_single_step_exception_test.dart
+++ b/runtime/observatory/tests/service/async_single_step_exception_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--verbose_debug --async_debugger --no-sync-async
+// VMOptions=--verbose_debug --async_debugger
 
 import 'dart:developer';
 import 'service_test_common.dart';
@@ -38,27 +38,41 @@
 
 var tests = <IsolateTest>[
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_C),
-  stepOver, // print.
+  stoppedAtLine(LINE_C), // print mmmm
+  smartNext,
+
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_D),
+  stoppedAtLine(LINE_D), // await helper
   stepInto,
+
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_A),
-  stepOver, // print.
+  stoppedAtLine(LINE_A), // print helper
+  smartNext,
+
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_B), // throw 'a'.
-  stepInto, // exit helper via a throw.
+  stoppedAtLine(LINE_B), // throw a
+  smartNext,
+
   hasStoppedAtBreakpoint,
-  stepInto, // exit helper via a throw.
+  stoppedAtLine(22), // } (weird dispatching)
+  smartNext,
+
   hasStoppedAtBreakpoint,
-  stepInto, // step once from entry to main.
+  stoppedAtLine(LINE_D), // await helper (weird dispatching)
+  smartNext,
+
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_E), // print(error)
-  stepOver,
+  smartNext,
+
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(LINE_E), // print(error) (weird finally dispatching)
+  smartNext,
+
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_F), // print(foo)
-  stepOver,
+  smartNext,
+
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_G), // print(z)
   resumeIsolate
diff --git a/runtime/observatory/tests/service/async_single_step_out_test.dart b/runtime/observatory/tests/service/async_single_step_out_test.dart
index 15661e0..fc38d2f 100644
--- a/runtime/observatory/tests/service/async_single_step_out_test.dart
+++ b/runtime/observatory/tests/service/async_single_step_out_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--verbose_debug --async_debugger --no-sync-async
+// VMOptions=--verbose_debug --async_debugger
 
 import 'dart:developer';
 import 'service_test_common.dart';
@@ -27,18 +27,30 @@
 
 var tests = <IsolateTest>[
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_C),
-  stepOver, // print.
+  stoppedAtLine(LINE_C), // print mmmm
+  stepOver,
+
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_D),
+  stoppedAtLine(LINE_D), // await helper
   stepInto,
+
   hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_A),
-  stepOver, // print.
+  stoppedAtLine(LINE_A), // print.
+  stepOver,
+
   hasStoppedAtBreakpoint,
   stoppedAtLine(LINE_B), // return null.
   stepInto, // exit helper via a single step.
+
   hasStoppedAtBreakpoint,
+  stoppedAtLine(19), // return null (weird dispatching)
+  stepInto, // exit helper via a single step.
+
+  hasStoppedAtBreakpoint,
+  stoppedAtLine(24), // await helper (weird dispatching)
+  smartNext,
+
+  hasStoppedAtBreakpoint, //19
   stoppedAtLine(LINE_E), // arrive after the await.
   resumeIsolate
 ];
diff --git a/runtime/observatory/tests/service/break_on_default_constructor_test.dart b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
index ab5755c..8f5d9e5 100644
--- a/runtime/observatory/tests/service/break_on_default_constructor_test.dart
+++ b/runtime/observatory/tests/service/break_on_default_constructor_test.dart
@@ -3,12 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 
 import 'package:observatory/debugger.dart';
+import 'package:observatory/service.dart' as S;
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
-import 'package:observatory/service.dart' as S;
 
 import 'service_test_common.dart';
 import 'test_helper.dart';
@@ -36,7 +35,7 @@
 
 List<String> stops = [];
 
-var tests = [
+var tests = <IsolateTest>[
   hasPausedAtStart,
   // Load the isolate's libraries
   (Isolate isolate) async {
diff --git a/runtime/observatory/tests/service/dev_fs_http_put_test.dart b/runtime/observatory/tests/service/dev_fs_http_put_test.dart
index f3e78a1..3233420 100644
--- a/runtime/observatory/tests/service/dev_fs_http_put_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_http_put_test.dart
@@ -39,7 +39,7 @@
         await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     request.headers.add('dev_fs_path', filePath);
-    request.add(GZIP.encode([9]));
+    request.add(gzip.encode([9]));
     HttpClientResponse response = await request.close();
     String responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
@@ -49,7 +49,7 @@
     request = await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     // omit the 'dev_fs_path' parameter.
-    request.write(GZIP.encode(fileContents));
+    request.write(gzip.encode(fileContents));
     response = await request.close();
     responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
@@ -62,7 +62,7 @@
     request = await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     request.headers.add('dev_fs_path', filePath);
-    request.add(GZIP.encode(fileContents));
+    request.add(gzip.encode(fileContents));
     response = await request.close();
     responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
diff --git a/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart b/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
index 29aaa37..891a8f7 100644
--- a/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_http_put_weird_char_test.dart
@@ -40,7 +40,7 @@
         await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     request.headers.add('dev_fs_path_b64', filePathBase64);
-    request.add(GZIP.encode([9]));
+    request.add(gzip.encode([9]));
     HttpClientResponse response = await request.close();
     String responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
@@ -50,7 +50,7 @@
     request = await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     // omit the 'dev_fs_path' parameter.
-    request.write(GZIP.encode(fileContents));
+    request.write(gzip.encode(fileContents));
     response = await request.close();
     responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
@@ -63,7 +63,7 @@
     request = await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     request.headers.add('dev_fs_path_b64', filePathBase64);
-    request.add(GZIP.encode(fileContents));
+    request.add(gzip.encode(fileContents));
     response = await request.close();
     responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
diff --git a/runtime/observatory/tests/service/dev_fs_uri_test.dart b/runtime/observatory/tests/service/dev_fs_uri_test.dart
index b00d699..8446316 100644
--- a/runtime/observatory/tests/service/dev_fs_uri_test.dart
+++ b/runtime/observatory/tests/service/dev_fs_uri_test.dart
@@ -45,7 +45,7 @@
         await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     request.headers.add('dev_fs_uri_b64', fileUriBase64);
-    request.add(GZIP.encode([9]));
+    request.add(gzip.encode([9]));
     HttpClientResponse response = await request.close();
     String responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
@@ -56,7 +56,7 @@
     request = await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     // omit the 'dev_fs_path' parameter.
-    request.write(GZIP.encode(fileContents));
+    request.write(gzip.encode(fileContents));
     response = await request.close();
     responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
@@ -69,7 +69,7 @@
     request = await client.putUrl(Uri.parse(serviceHttpAddress));
     request.headers.add('dev_fs_name', fsId);
     request.headers.add('dev_fs_uri_b64', fileUriBase64);
-    request.add(GZIP.encode(fileContents));
+    request.add(gzip.encode(fileContents));
     response = await request.close();
     responseBody = await readResponse(response);
     result = jsonDecode(responseBody);
diff --git a/runtime/observatory/tests/service/dominator_tree_user_test.dart b/runtime/observatory/tests/service/dominator_tree_user_test.dart
index a0e9fd4..d2053d2 100644
--- a/runtime/observatory/tests/service/dominator_tree_user_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_user_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=
 // VMOptions=--use_compactor
+// VMOptions=--use_compactor --force_evacuation
 
 import 'package:observatory/heap_snapshot.dart';
 import 'package:observatory/models.dart' as M;
diff --git a/runtime/observatory/tests/service/dominator_tree_vm_test.dart b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
index 7fa6e9b..6199bf5 100644
--- a/runtime/observatory/tests/service/dominator_tree_vm_test.dart
+++ b/runtime/observatory/tests/service/dominator_tree_vm_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=
 // VMOptions=--use_compactor
+// VMOptions=--use_compactor --force_evacuation
 
 import 'package:observatory/heap_snapshot.dart';
 import 'package:observatory/models.dart' as M;
diff --git a/runtime/observatory/tests/service/eval_test.dart b/runtime/observatory/tests/service/eval_test.dart
index 33e5efe..a83ef37 100644
--- a/runtime/observatory/tests/service/eval_test.dart
+++ b/runtime/observatory/tests/service/eval_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
diff --git a/runtime/observatory/tests/service/file_service_test.dart b/runtime/observatory/tests/service/file_service_test.dart
index fe9dd6f..8eb2dcf 100644
--- a/runtime/observatory/tests/service/file_service_test.dart
+++ b/runtime/observatory/tests/service/file_service_test.dart
@@ -35,7 +35,7 @@
     try {
       var filePath = dir.path + io.Platform.pathSeparator + "file";
       var f = new io.File(filePath);
-      writingFile = await f.open(mode: io.FileMode.WRITE);
+      writingFile = await f.open(mode: io.FileMode.write);
       await writingFile.writeByte(42);
       await writingFile.writeByte(42);
       await writingFile.writeByte(42);
diff --git a/runtime/observatory/tests/service/get_object_rpc_test.dart b/runtime/observatory/tests/service/get_object_rpc_test.dart
index 15ed8df..3f0ff6c 100644
--- a/runtime/observatory/tests/service/get_object_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_object_rpc_test.dart
@@ -952,8 +952,8 @@
     };
     var result = await isolate.invokeRpcNoUpgrade('getObject', params);
     expect(result['type'], equals('Code'));
-    expect(result['name'], equals('_DummyClass.dummyFunction'));
-    expect(result['_vmName'], equals('dummyFunction'));
+    expect(result['name'], endsWith('_DummyClass.dummyFunction'));
+    expect(result['_vmName'], endsWith('dummyFunction'));
     expect(result['kind'], equals('Dart'));
     expect(result['_optimized'], new isInstanceOf<bool>());
     expect(result['function']['type'], equals('@Function'));
diff --git a/runtime/observatory/tests/service/get_scripts_rpc_test.dart b/runtime/observatory/tests/service/get_scripts_rpc_test.dart
new file mode 100644
index 0000000..c22da46
--- /dev/null
+++ b/runtime/observatory/tests/service/get_scripts_rpc_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_helper.dart';
+
+var tests = <VMTest>[
+  (VM vm) async {
+    var params = {
+      'isolateId': vm.isolates.first.id,
+    };
+    var result = await vm.invokeRpcNoUpgrade('getScripts', params);
+    expect(result['type'], equals('ScriptList'));
+    expect(result['scripts'].length, isPositive);
+    expect(result['scripts'][0]['type'], equals('@Script'));
+  },
+
+  (VM vm) async {
+    var params = {
+      'isolateId': 'badid',
+    };
+    bool caughtException;
+    try {
+      await vm.invokeRpcNoUpgrade('getScripts', params);
+      expect(false, isTrue, reason: 'Unreachable');
+    } on ServerRpcException catch (e) {
+      caughtException = true;
+      expect(e.code, equals(ServerRpcException.kInvalidParams));
+      expect(e.message, "getScripts: invalid 'isolateId' parameter: badid");
+    }
+    expect(caughtException, isTrue);
+  },
+
+  // Plausible isolate id, not found.
+  (VM vm) async {
+    var params = {
+      'isolateId': 'isolates/9999999999',
+    };
+    var result = await vm.invokeRpcNoUpgrade('getScripts', params);
+    expect(result['type'], equals('Sentinel'));
+    expect(result['kind'], equals('Collected'));
+    expect(result['valueAsString'], equals('<collected>'));
+  },
+];
+
+main(args) async => runVMTests(args, tests);
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index 411d7a0..ce2fa5b3 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -75,8 +75,12 @@
       'scriptId': func.location.script.id
     };
     var coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
+    final numRanges = coverage['ranges'].length;
     expect(coverage['type'], equals('SourceReport'));
-    expect(coverage['ranges'].length, 6);
+
+    // Running in app_jitk mode will result in the number of ranges being 6
+    // during the training run and 7 when running from the snapshot.
+    expect(((numRanges == 6) || (numRanges == 7)), isTrue);
     expect(coverage['ranges'][0], equals(expectedRange));
     expect(coverage['scripts'].length, 1);
     expect(
@@ -91,7 +95,7 @@
     };
     coverage = await isolate.invokeRpcNoUpgrade('getSourceReport', params);
     expect(coverage['type'], equals('SourceReport'));
-    expect(coverage['ranges'].length, 6);
+    expect(coverage['ranges'].length, numRanges);
     expect(allRangesCompiled(coverage), isTrue);
 
     // One function
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 7ee0bb1..9b1fb1a 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(11));
+    expect(result['minor'], equals(13));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory/tests/service/invoke_test.dart b/runtime/observatory/tests/service/invoke_test.dart
index ace2169..437a86d 100644
--- a/runtime/observatory/tests/service/invoke_test.dart
+++ b/runtime/observatory/tests/service/invoke_test.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:async';
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
diff --git a/runtime/observatory/tests/service/local_variable_declaration_test.dart b/runtime/observatory/tests/service/local_variable_declaration_test.dart
index 3204bb4..2c59824 100644
--- a/runtime/observatory/tests/service/local_variable_declaration_test.dart
+++ b/runtime/observatory/tests/service/local_variable_declaration_test.dart
@@ -47,7 +47,11 @@
       final int declarationTokenPos = variable['declarationTokenPos'];
       final String name = variable['name'];
       final String token = script.getToken(declarationTokenPos);
-      expect(name, token);
+      // When running from an appjit snapshot, sources aren't available so the returned token will
+      // be null.
+      if (token != null) {
+        expect(name, token);
+      }
     }
   },
   resumeIsolate,
@@ -69,7 +73,11 @@
       final int declarationTokenPos = variable['declarationTokenPos'];
       final String name = variable['name'];
       final String token = script.getToken(declarationTokenPos);
-      expect(name, token);
+      // When running from an appjit snapshot, sources aren't available so the returned token will
+      // be null.
+      if (token != null) {
+        expect(name, token);
+      }
     }
   },
   resumeIsolate,
@@ -92,7 +100,11 @@
       final int declarationTokenPos = variable['declarationTokenPos'];
       final String name = variable['name'];
       final String token = script.getToken(declarationTokenPos);
-      expect(name, token);
+      // When running from an appjit snapshot, sources aren't available so the returned token will
+      // be null.
+      if (token != null) {
+        expect(name, token);
+      }
     }
   }
 ];
diff --git a/runtime/observatory/tests/service/next_through_is_and_as_test.dart b/runtime/observatory/tests/service/next_through_is_and_as_test.dart
index b22110d..886be73 100644
--- a/runtime/observatory/tests/service/next_through_is_and_as_test.dart
+++ b/runtime/observatory/tests/service/next_through_is_and_as_test.dart
@@ -25,7 +25,7 @@
   }
   if (hex is int) {
     print("hex is int");
-    int x = hex as int;
+    int x = hex as dynamic;
     if (x.isEven) {
       print("it's even even!");
     } else {
diff --git a/runtime/observatory/tests/service/positive_token_pos_test.dart b/runtime/observatory/tests/service/positive_token_pos_test.dart
index 6257882..5bf9cb2 100644
--- a/runtime/observatory/tests/service/positive_token_pos_test.dart
+++ b/runtime/observatory/tests/service/positive_token_pos_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--verbose_debug --no-sync-async
+// VMOptions=--verbose_debug
 
 import 'dart:developer';
 import 'package:observatory/service_io.dart';
@@ -28,7 +28,7 @@
     expect(stack['frames'].length, greaterThan(3));
 
     var frame = stack['frames'][0];
-    expect(frame.function.name, equals('Completer.sync'));
+    expect(frame.function.name, equals('_AsyncAwaitCompleter'));
     expect(await frame.location.getLine(), greaterThan(0));
     expect(await frame.location.getColumn(), greaterThan(0));
 
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index 8fb2b1d..2340759 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -50,11 +50,6 @@
 [ $compiler == precompiler ]
 *: Skip # Issue 24651
 
-# Debugger location tests are slow in debug mode.
-[ $mode == debug ]
-debugger_location_second_test: Pass, Slow
-debugger_location_test: Pass, Slow
-
 # Service protocol is not supported in product mode.
 [ $mode == product ]
 *: SkipByDesign
@@ -99,6 +94,11 @@
 step_through_function_test: RuntimeError # Debugging StringConcatenation doesn't work the same on simdbc as on other platforms (bug #28975).
 step_through_getter_test: RuntimeError # Debugging StringConcatenation doesn't work the same on simdbc as on other platforms (bug #28975).
 
+[ $arch == simdbc || $arch == simdbc64 || $mode == debug ]
+break_on_default_constructor_test: Pass, Slow
+debugger_location_second_test: Pass, Slow
+debugger_location_test: Pass, Slow
+
 # All tests use dart:io
 [ $compiler == dart2js || $browser ]
 *: SkipByDesign
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 514119c..3b35e4f 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -3,126 +3,53 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == app_jitk ]
-add_breakpoint_rpc_test: RuntimeError
-async_generator_breakpoint_test: Skip # No incremental compiler available.
-async_next_regession_18877_test: RuntimeError
-async_next_test: RuntimeError
-async_scope_test: RuntimeError
-async_single_step_exception_test: RuntimeError
-async_single_step_into_test: RuntimeError
-async_single_step_out_test: RuntimeError
-async_star_single_step_into_test: RuntimeError
-async_star_step_out_test: RuntimeError
-async_step_out_test: RuntimeError
+add_breakpoint_rpc_test: SkipByDesign # non-kernel specific version of add_breakpoint_rpc_kernel_test.
+async_generator_breakpoint_test: SkipByDesign # No incremental compiler available.
 bad_reload_test: RuntimeError
-break_on_activation_test: Skip # No incremental compiler available.
-break_on_function_test: RuntimeError
-breakpoint_in_parts_class_test: RuntimeError
-breakpoint_two_args_checked_test: RuntimeError
-code_test: RuntimeError # Issue 34143
+break_on_activation_test: SkipByDesign # No incremental compiler available.
 complex_reload_test: RuntimeError
-debugger_inspect_test: Skip # No incremental compiler available.
+debugger_inspect_test: SkipByDesign # No incremental compiler available.
 debugger_location_second_test: RuntimeError
-debugging_inlined_finally_test: RuntimeError
-debugging_test: RuntimeError
-developer_service_get_isolate_id_test: Skip #  No incremental compiler available.
-eval_internal_class_test: Skip # No incremental compiler available.
-eval_regression_flutter20255_test: Skip # No incremental compiler available.
-eval_test: Skip # No incremental compiler available.
-evaluate_activation_in_method_class_test: RuntimeError
-evaluate_activation_test: Skip # No incremental compiler available.
-evaluate_async_closure_test: Skip # No incremental compiler available.
-evaluate_class_type_parameters_test: RuntimeError
-evaluate_in_async_activation_test: RuntimeError
-evaluate_in_async_star_activation_test: RuntimeError
-evaluate_in_frame_rpc_test: RuntimeError
-evaluate_in_frame_with_scope_test: Skip # No incremental compiler available.
-evaluate_in_sync_star_activation_test: RuntimeError
-evaluate_with_scope_test: Skip # No incremental compiler available.
-get_instances_rpc_test: Skip # No incremental compiler available.
-get_object_rpc_test: Skip # No incremental compiler available.
-get_retained_size_rpc_test: Skip # No incremental compiler available.
-get_retaining_path_rpc_test: Skip # No incremental compiler available.
-get_source_report_test: RuntimeError
-get_user_level_retaining_path_rpc_test: Skip # No incremental compiler available.
-get_vm_rpc_test: RuntimeError
-get_vm_timeline_rpc_test: RuntimeError
-instance_field_order_rpc_test: Skip # No incremental compiler available.
-issue_25465_test: RuntimeError
-issue_27238_test: RuntimeError
-local_variable_declaration_test: RuntimeError
-mixin_break_test: RuntimeError
-next_through_assign_call_test: RuntimeError
-next_through_assign_int_test: RuntimeError
-next_through_call_on_field_in_class_test: RuntimeError
-next_through_call_on_field_test: RuntimeError
-next_through_call_on_static_field_in_class_test: RuntimeError
-next_through_catch_test: RuntimeError
-next_through_closure_test: RuntimeError
-next_through_create_list_and_map_test: RuntimeError
-next_through_for_each_loop_test: RuntimeError
-next_through_for_loop_with_break_and_continue_test: RuntimeError
-next_through_function_expression_test: RuntimeError
-next_through_implicit_call_test: RuntimeError
-next_through_is_and_as_test: RuntimeError
-next_through_multi_catch_test: RuntimeError
-next_through_new_test: RuntimeError
-next_through_operator_bracket_on_super_test: RuntimeError
-next_through_operator_bracket_on_this_test: RuntimeError
-next_through_operator_bracket_test: RuntimeError
-next_through_simple_async_test: RuntimeError
-next_through_simple_async_with_returns_test: RuntimeError
-next_through_simple_linear_2_test: RuntimeError
-next_through_simple_linear_test: RuntimeError
-pause_on_exceptions_test: Skip # No incremental compiler available.
-positive_token_pos_test: RuntimeError
-regress_28443_test: RuntimeError
-regress_28980_test: RuntimeError
-rewind_optimized_out_test: RuntimeError
-rewind_test: RuntimeError
-set_name_rpc_test: RuntimeError
-set_vm_name_rpc_test: RuntimeError
-simple_reload_test: RuntimeError
-steal_breakpoint_test: RuntimeError
-step_into_async_no_await_test: RuntimeError
-step_over_await_test: RuntimeError
-step_test: RuntimeError # Issue 34143
-step_through_arithmetic_test: RuntimeError
-step_through_constructor_calls_test: RuntimeError
-step_through_constructor_test: RuntimeError
-step_through_for_each_sync_star_2_test: RuntimeError
-step_through_for_each_sync_star_test: RuntimeError
-step_through_function_2_test: RuntimeError
-step_through_function_test: RuntimeError
-step_through_getter_test: RuntimeError
-step_through_mixin_from_sdk_test: RuntimeError
-step_through_property_get_test: RuntimeError
-step_through_property_set_test: RuntimeError
-step_through_setter_test: RuntimeError
-step_through_switch_test: RuntimeError
-step_through_switch_with_continue_test: RuntimeError
+developer_service_get_isolate_id_test: SkipByDesign # No incremental compiler available.
+eval_internal_class_test: SkipByDesign # No incremental compiler available.
+eval_regression_flutter20255_test: SkipByDesign # No incremental compiler available.
+eval_test: SkipByDesign # No incremental compiler available.
+evaluate_activation_in_method_class_test: RuntimeError # Issue 35505
+evaluate_activation_test: SkipByDesign # No incremental compiler available.
+evaluate_async_closure_test: SkipByDesign # No incremental compiler available.
+evaluate_class_type_parameters_test: SkipByDesign # No incremental compiler available.
+evaluate_in_async_activation_test: SkipByDesign # No incremental compiler available.
+evaluate_in_async_star_activation_test: SkipByDesign # No incremental compiler available.
+evaluate_in_frame_rpc_test: SkipByDesign # No incremental compiler available.
+evaluate_in_frame_with_scope_test: SkipByDesign # No incremental compiler available.
+evaluate_in_sync_star_activation_test: SkipByDesign # No incremental compiler available.
+evaluate_with_scope_test: SkipByDesign # No incremental compiler available.
+get_instances_rpc_test: SkipByDesign # No incremental compiler available.
+get_object_rpc_test: SkipByDesign # No incremental compiler available.
+get_retained_size_rpc_test: SkipByDesign # No incremental compiler available.
+get_retaining_path_rpc_test: SkipByDesign # No incremental compiler available.
+get_user_level_retaining_path_rpc_test: SkipByDesign # No incremental compiler available.
+instance_field_order_rpc_test: SkipByDesign # No incremental compiler available.
+pause_on_exceptions_test: SkipByDesign # No incremental compiler available.
+rewind_optimized_out_test: SkipByDesign # No incremental compiler available.
+rewind_test: SkipByDesign # No incremental compiler available.
+simple_reload_test: RuntimeError, Timeout # Issue 35506
 unused_changes_in_last_reload_test: RuntimeError
-valid_source_locations_test: RuntimeError
 
 # Kernel works slightly different. There are kernel specific versions.
 # These are the non-kernel specific versions so skip tests and allow errors.
 [ $compiler == dartk ]
 add_breakpoint_rpc_test: SkipByDesign # non-kernel specific version of add_breakpoint_rpc_kernel_test.
-async_generator_breakpoint_test: Crash, RuntimeError # Issue 34746
-async_single_step_exception_test: RuntimeError # Issue 34746
-async_single_step_out_test: RuntimeError # Issue 34746
 bad_reload_test: RuntimeError # Issue 34025
 coverage_optimized_function_test: Pass, Slow
-evaluate_activation_in_method_class_test: RuntimeError
+evaluate_activation_in_method_class_test: RuntimeError # Issue 35505
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
 evaluate_activation_test/scope: RuntimeError # http://dartbug.com/20047
 pause_on_unhandled_async_exceptions2_test: Pass, Slow
-positive_token_pos_test: RuntimeError # Issue 34746
-step_through_arithmetic_test: RuntimeError # probably constant evaluator pre-evaluating e.g. 1+2
 unused_changes_in_last_reload_test: RuntimeError
 
 [ $compiler == dartkp ]
-*: Skip # Non-kernel also skips precompiled mode.
+*: SkipByDesign # Non-kernel also skips precompiled mode.
 
 [ $fasta ]
 developer_extension_test: CompileTimeError
@@ -136,38 +63,29 @@
 
 [ $arch == ia32 && $builder_tag == optimization_counter_threshold ]
 eval_regression_flutter20255_test: SkipSlow # Timeout
+get_vm_timeline_rpc_test: Pass, Slow
 rewind_optimized_out_test: SkipSlow # Timeout
 
 [ $arch != simarm && $arch != simarm64 && $arch != simdbc && $compiler == dartk ]
 complex_reload_test: RuntimeError
 
 [ $arch == simdbc64 && $compiler == dartk ]
-eval_test: RuntimeError, Timeout # Issue #33087
-evaluate_in_frame_rpc_test: RuntimeError, Timeout # Issue #33087
+eval_test: RuntimeError, Timeout # Issue #34736
+evaluate_in_frame_rpc_test: RuntimeError, Timeout # Issue #34736
 get_cpu_profile_timeline_rpc_test: Pass, RuntimeError # http://dartbug.com/31794
 
 [ $arch == simdbc64 && $compiler == dartk && $mode == debug ]
 eval_test: Pass, Slow
 
-[ $arch == x64 && $compiler == dartk && $mode == release && $system == windows ]
-code_test: RuntimeError
-get_object_rpc_test: RuntimeError
-get_stack_rpc_test: RuntimeError
-
-[ $arch == x64 && $compiler == dartk && $system == windows ]
-regexp_function_test: Pass, Crash # Issue http://dartbug.com/34422
-
-[ $compiler == app_jitk && $mode == debug ]
-code_test: RuntimeError
-step_test: RuntimeError
-
 [ $compiler == dartk && $mode == debug ]
 isolate_lifecycle_test: Skip # Flaky.
 pause_idle_isolate_test: Skip # Flaky
 rewind_optimized_out_test: Pass, Slow
 
 [ $compiler == dartk && $system == windows ]
+add_breakpoint_rpc_kernel_test: Skip # Timeout
 break_on_default_constructor_test: Skip # Issues 32137 and 32138.
+breakpoint_in_parts_class_test: Skip # Timeout
 coverage_optimized_function_test: Skip # Timeout
 field_script_test: Skip # Timeout
 get_vm_timeline_rpc_test: Skip # Issue 32137.
@@ -177,84 +95,75 @@
 next_through_assign_int_test: Skip # Issues 32137 and 32138.
 next_through_call_on_field_in_class_test: Skip # Issues 32137 and 32138.
 next_through_call_on_field_test: Skip # Issues 32137 and 32138.
+next_through_call_on_static_field_in_class_test: Skip # Timeout
 next_through_catch_test: Skip # Issues 32137 and 32138.
+next_through_closure_test: Skip # Timeout
 next_through_create_list_and_map_test: Skip # Issues 32137 and 32138.
+next_through_for_each_loop_test: Skip # Timeout
 next_through_for_loop_with_break_and_continue_test: Skip # Timeout
 next_through_function_expression_test: Skip # Issues 32137 and 32138.
+next_through_implicit_call_test: Skip # Timeout
 next_through_is_and_as_test: Skip # Issues 32137 and 32138.
 next_through_multi_catch_test: Skip # Issues 32137 and 32138.
+next_through_new_test: Skip # Timeout
+next_through_operator_bracket_on_super_test: Skip # Timeout
+next_through_operator_bracket_on_this_test: Skip # Timeout
+next_through_operator_bracket_test: Skip # Timeout
+next_through_simple_async_test: Skip # Timeout
 next_through_simple_async_with_returns_test: Skip # Issues 32137 and 32138.
 next_through_simple_linear_2_test: Skip # Issues 32137 and 32138.
 next_through_simple_linear_test: Skip # Issues 32137 and 32138.
 pause_idle_isolate_test: Skip # Issues 32137 and 32138.
 pause_on_start_and_exit_test: Skip # Issues 32225, 32138.
+pause_on_start_and_exit_with_child_test: Skip # Timeout
 pause_on_start_then_step_test: Skip # Issue 32225, 32138.
 regress_28443_test: Skip # Times out.
 regress_28980_test: Skip # Issues 32137 and 32138.
 reload_sources_test: RuntimeError
 set_vm_name_rpc_test: Skip # Times out. Issue 32137.
 step_test: Skip # Issues 32137 and 32138.
+step_through_constructor_calls_test: Skip # Timeout
 step_through_constructor_test: Skip # Timeout
 step_through_function_2_test: Skip # Issues 32137 and 32138.
 step_through_function_test: Skip # Issues 32137 and 32138.
+step_through_getter_test: Skip # Timeout
 step_through_property_get_test: Skip # Times out. Issue 32137.
+step_through_property_set_test: Skip # Timeout
 step_through_setter_test: Skip # Issues 32137 and 32138.
 step_through_switch_test: Skip # Times out. Issue 32137.
 step_through_switch_with_continue_test: Skip # Times out. Issue 32137.
 
-[ $compiler == dartk && $system == windows && $strong ]
-add_breakpoint_rpc_kernel_test: Skip # Timeout
-breakpoint_in_parts_class_test: Skip # Timeout
-next_through_call_on_static_field_in_class_test: Skip # Timeout
-next_through_closure_test: Skip # Timeout
-next_through_for_each_loop_test: Skip # Timeout
-next_through_implicit_call_test: Skip # Timeout
-next_through_new_test: Skip # Timeout
-next_through_operator_bracket_on_super_test: Skip # Timeout
-next_through_operator_bracket_on_this_test: Skip # Timeout
-next_through_operator_bracket_test: Skip # Timeout
-next_through_simple_async_test: Skip # Timeout
-pause_on_start_and_exit_with_child_test: Skip # Timeout
-step_through_constructor_calls_test: Skip # Timeout
-step_through_getter_test: Skip # Timeout
-step_through_property_set_test: Skip # Timeout
-
-[ $compiler == dartk && $system == windows && !$strong ]
-next_through_simple_async_test: Skip # Timeout
-step_test: Skip # Timeout
-step_through_constructor_test: Skip # Timeout
-
 [ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
-add_breakpoint_rpc_kernel_test: RuntimeError # Issue #33087
-async_generator_breakpoint_test: Skip # No incremental compiler available.
+add_breakpoint_rpc_kernel_test: RuntimeError # Issue #34736
+async_generator_breakpoint_test: SkipByDesign # No incremental compiler available.
 bad_reload_test: Skip # Times out on sim architectures, also RuntimeError.
-break_on_activation_test: RuntimeError # Issue #33087
+break_on_activation_test: RuntimeError # Issue #34736
 complex_reload_test: Skip # Times out on sim architectures, also RuntimeError.
-debugger_inspect_test: RuntimeError, Timeout # Issue #33087
-developer_service_get_isolate_id_test: RuntimeError # Issue #33087
-eval_internal_class_test: RuntimeError # Issue #33087
-eval_regression_flutter20255_test: RuntimeError # "No incremental compiler available for this isolate"
-eval_test: RuntimeError # Issue #33087
-evaluate_activation_test/none: RuntimeError # Issue #33087
-evaluate_async_closure_test: RuntimeError # Issue #33087
-evaluate_class_type_parameters_test: RuntimeError # Issue 33087
-evaluate_function_type_parameters_test: RuntimeError # Issue 33087
-evaluate_in_async_activation_test: RuntimeError # Issue #33087
-evaluate_in_async_star_activation_test: RuntimeError # Issue #33087
-evaluate_in_frame_rpc_test: RuntimeError # Issue #33087
-evaluate_in_frame_with_scope_test: RuntimeError # Issue #33087
-evaluate_in_sync_star_activation_test: RuntimeError # "No incremental compiler available for this isolate"
-evaluate_with_scope_test: RuntimeError # Issue #33087
-get_instances_rpc_test: RuntimeError # Issue #33087
+debugger_inspect_test: RuntimeError, Timeout # Issue #34736
+developer_service_get_isolate_id_test: RuntimeError # Issue #34736
+eval_internal_class_test: RuntimeError # Issue #34736
+eval_regression_flutter20255_test: SkipByDesign # No incremental compiler available.
+eval_test: RuntimeError # Issue #34736
+evaluate_activation_test/none: RuntimeError # Issue #34736
+evaluate_async_closure_test: RuntimeError # Issue #34736
+evaluate_class_type_parameters_test: RuntimeError # Issue 34736
+evaluate_function_type_parameters_test: RuntimeError # Issue 34736
+evaluate_in_async_activation_test: RuntimeError # Issue #34736
+evaluate_in_async_star_activation_test: RuntimeError # Issue #34736
+evaluate_in_frame_rpc_test: RuntimeError # Issue #34736
+evaluate_in_frame_with_scope_test: RuntimeError # Issue #34736
+evaluate_in_sync_star_activation_test: SkipByDesign # No incremental compiler available.
+evaluate_with_scope_test: RuntimeError # Issue #34736
+get_instances_rpc_test: RuntimeError # Issue #34736
 get_object_rpc_test: RuntimeError # Please triage.
-get_retaining_path_rpc_test: RuntimeError # Issue #33087
-get_user_level_retaining_path_rpc_test: RuntimeError # Issue #33087
-instance_field_order_rpc_test: RuntimeError # Issue #33087
-pause_on_exceptions_test: RuntimeError, Timeout # Issue #33087
+get_retaining_path_rpc_test: RuntimeError # Issue #34736
+get_user_level_retaining_path_rpc_test: RuntimeError # Issue #34736
+instance_field_order_rpc_test: RuntimeError # Issue #34736
+pause_on_exceptions_test: RuntimeError, Timeout # Issue #34736
 reload_sources_test: Skip # Times out.
-rewind_optimized_out_test: RuntimeError # Issue #33087
+rewind_optimized_out_test: RuntimeError # Issue #34736
 rewind_test: Pass, RuntimeError
 set_name_rpc_test: RuntimeError # Please triage.
 simple_reload_test: RuntimeError, Timeout
 unused_changes_in_last_reload_test: Skip # Times out on sim architectures.
-valid_source_locations_test: Pass, Slow, Timeout # Issue 33087
+valid_source_locations_test: Pass, Slow, Timeout # Issue 34736
diff --git a/runtime/observatory/tests/service/set_name_rpc_test.dart b/runtime/observatory/tests/service/set_name_rpc_test.dart
index 790cd46..1d743cc 100644
--- a/runtime/observatory/tests/service/set_name_rpc_test.dart
+++ b/runtime/observatory/tests/service/set_name_rpc_test.dart
@@ -10,7 +10,10 @@
 
 var tests = <IsolateTest>[
   (Isolate isolate) async {
-    expect(isolate.name, equals('set_name_rpc_test.dart:main()'));
+    expect(
+        ((isolate.name == 'set_name_rpc_test.dart:main()') ||
+            (isolate.name == 'out.jitsnapshot:main()')),
+        isTrue);
 
     Completer completer = new Completer();
     var stream = await isolate.vm.getEventStream(VM.kIsolateStream);
diff --git a/runtime/observatory/tests/service/step_through_function_2_test.dart b/runtime/observatory/tests/service/step_through_function_2_test.dart
index d5df807..b6b6ff5 100644
--- a/runtime/observatory/tests/service/step_through_function_2_test.dart
+++ b/runtime/observatory/tests/service/step_through_function_2_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'test_helper.dart';
 import 'service_test_common.dart';
+import 'test_helper.dart';
 
 const int LINE = 11;
 const String file = "step_through_function_2_test.dart";
@@ -16,6 +16,7 @@
   fooXYZ2(42);
 }
 
+// ignore: unused_element
 int _xyz = -1;
 
 fooXYZ1(int i) {
@@ -42,31 +43,31 @@
 
 List<String> stops = [];
 List<String> expected = [
-  "$file:${LINE+0}:5", // after 'code'
-  "$file:${LINE+1}:17", // on 'Bar'
+  "$file:${LINE + 0}:5", // after 'code'
+  "$file:${LINE + 1}:17", // on 'Bar'
 
-  "$file:${LINE+2}:7", // on 'barXYZ1'
-  "$file:${LINE+21}:15", // on 'i'
-  "$file:${LINE+22}:14", // on '-'
-  "$file:${LINE+22}:5", // on '_xyz'
-  "$file:${LINE+23}:3", // on '}'
+  "$file:${LINE + 2}:7", // on 'barXYZ1'
+  "$file:${LINE + 22}:15", // on 'i'
+  "$file:${LINE + 23}:14", // on '-'
+  "$file:${LINE + 23}:5", // on '_xyz'
+  "$file:${LINE + 24}:3", // on '}'
 
-  "$file:${LINE+3}:7", // on 'barXYZ2'
-  "$file:${LINE+25}:15", // on 'i'
-  "$file:${LINE+26}:5", // on '_xyz'
-  "$file:${LINE+27}:3", // on '}'
+  "$file:${LINE + 3}:7", // on 'barXYZ2'
+  "$file:${LINE + 26}:15", // on 'i'
+  "$file:${LINE + 27}:5", // on '_xyz'
+  "$file:${LINE + 28}:3", // on '}'
 
-  "$file:${LINE+4}:3", // on 'fooXYZ1'
-  "$file:${LINE+10}:13", // on 'i'
-  "$file:${LINE+11}:12", // on '-'
-  "$file:${LINE+12}:1", // on '}'
+  "$file:${LINE + 4}:3", // on 'fooXYZ1'
+  "$file:${LINE + 11}:13", // on 'i'
+  "$file:${LINE + 12}:12", // on '-'
+  "$file:${LINE + 13}:1", // on '}'
 
-  "$file:${LINE+5}:3", // on 'fooXYZ2'
-  "$file:${LINE+14}:13", // on 'i'
-  "$file:${LINE+15}:3", // on '_xyz'
-  "$file:${LINE+16}:1", // on '}'
+  "$file:${LINE + 5}:3", // on 'fooXYZ2'
+  "$file:${LINE + 15}:13", // on 'i'
+  "$file:${LINE + 16}:3", // on '_xyz'
+  "$file:${LINE + 17}:1", // on '}'
 
-  "$file:${LINE+6}:1" // on ending '}'
+  "$file:${LINE + 6}:1" // on ending '}'
 ];
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/step_through_setter_test.dart b/runtime/observatory/tests/service/step_through_setter_test.dart
index 1274c2f..aa40fb1 100644
--- a/runtime/observatory/tests/service/step_through_setter_test.dart
+++ b/runtime/observatory/tests/service/step_through_setter_test.dart
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'test_helper.dart';
 import 'service_test_common.dart';
+import 'test_helper.dart';
 
 const int LINE = 11;
 const String file = "step_through_setter_test.dart";
@@ -14,6 +14,7 @@
   fooXYZ = 42;
 }
 
+// ignore: unused_element
 int _xyz = -1;
 
 set fooXYZ(int i) {
@@ -32,21 +33,21 @@
 
 List<String> stops = [];
 List<String> expected = [
-  "$file:${LINE+0}:5", // after 'code'
-  "$file:${LINE+1}:17", // on 'Bar'
+  "$file:${LINE + 0}:5", // after 'code'
+  "$file:${LINE + 1}:17", // on 'Bar'
 
-  "$file:${LINE+2}:7", // on 'barXYZ'
-  "$file:${LINE+15}:18", // on 'i'
-  "$file:${LINE+16}:14", // on '-'
-  "$file:${LINE+16}:5", // on '_xyz'
-  "$file:${LINE+17}:3", // on '}'
+  "$file:${LINE + 2}:7", // on 'barXYZ'
+  "$file:${LINE + 16}:18", // on 'i'
+  "$file:${LINE + 17}:14", // on '-'
+  "$file:${LINE + 17}:5", // on '_xyz'
+  "$file:${LINE + 18}:3", // on '}'
 
-  "$file:${LINE+3}:3", // on 'fooXYZ'
-  "$file:${LINE+8}:16", // on 'i'
-  "$file:${LINE+9}:12", // on '-'
-  "$file:${LINE+10}:1", // on '}'
+  "$file:${LINE + 3}:3", // on 'fooXYZ'
+  "$file:${LINE + 9}:16", // on 'i'
+  "$file:${LINE + 10}:12", // on '-'
+  "$file:${LINE + 11}:1", // on '}'
 
-  "$file:${LINE+4}:1" // on ending '}'
+  "$file:${LINE + 4}:1" // on ending '}'
 ];
 
 var tests = <IsolateTest>[
diff --git a/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart b/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
index a995125..740a138 100644
--- a/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
+++ b/runtime/observatory/tests/service/tcp_socket_closing_service_test.dart
@@ -35,7 +35,7 @@
 
   var server = await io.RawDatagramSocket.bind('127.0.0.1', 0);
   server.listen((io.RawSocketEvent event) {
-    if (event == io.RawSocketEvent.READ) {
+    if (event == io.RawSocketEvent.read) {
       io.Datagram dg = server.receive();
       dg.data.forEach((x) => true);
       server.close();
diff --git a/runtime/observatory/tests/service/udp_socket_service_test.dart b/runtime/observatory/tests/service/udp_socket_service_test.dart
index 3d40eda..01b88d3 100644
--- a/runtime/observatory/tests/service/udp_socket_service_test.dart
+++ b/runtime/observatory/tests/service/udp_socket_service_test.dart
@@ -10,16 +10,29 @@
 import 'test_helper.dart';
 
 Future setupUDP() async {
+  // Service might attach to us after we completed the setup but
+  // before we actually received a datagram - if it will start inspecting
+  // IO metrics at that point then it will see that no reads happened
+  // and the test will fail. That is why we don't consider setup complete
+  // until after we received the datagram.
+  final doneCompleter = Completer<void>();
+
   var server = await io.RawDatagramSocket.bind('127.0.0.1', 0);
   server.listen((io.RawSocketEvent event) {
-    if (event == io.RawSocketEvent.READ) {
+    if (event == io.RawSocketEvent.read) {
       io.Datagram dg = server.receive();
       dg.data.forEach((x) => true);
+      if (!doneCompleter.isCompleted) {
+        doneCompleter.complete(null);
+      }
     }
   });
   var client = await io.RawDatagramSocket.bind('127.0.0.1', 0);
   client.send(utf8.encoder.convert('foobar'),
       new io.InternetAddress('127.0.0.1'), server.port);
+
+  // Wait for datagram to arrive.
+  await doneCompleter.future;
 }
 
 var udpTests = <IsolateTest>[
@@ -46,12 +59,9 @@
     expect(server['listening'], isFalse);
     expect(server['socketType'], equals('UDP'));
     expect(server['port'], greaterThanOrEqualTo(1024));
-    // Stopwatch resolution on windows makes us sometimes report 0;
-    if (io.Platform.isWindows) {
-      expect(server['lastRead'], greaterThanOrEqualTo(0));
-    } else {
-      expect(server['lastRead'], greaterThan(0));
-    }
+    final now = DateTime.now().millisecondsSinceEpoch;
+    expect(
+        server['lastRead'], closeTo(now, Duration(seconds: 10).inMilliseconds));
     expect(server['totalRead'], equals(6));
     expect(server['lastWrite'], equals(0));
     expect(server['totalWritten'], equals(0));
diff --git a/runtime/observatory/tests/service/unused_changes_in_last_reload_test.dart b/runtime/observatory/tests/service/unused_changes_in_last_reload_test.dart
index 35f548a..223ac40 100644
--- a/runtime/observatory/tests/service/unused_changes_in_last_reload_test.dart
+++ b/runtime/observatory/tests/service/unused_changes_in_last_reload_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'test_helper.dart';
-import 'dart:async';
 import 'dart:developer';
 import 'dart:isolate' as I;
 import 'dart:io';
diff --git a/runtime/platform/atomic.h b/runtime/platform/atomic.h
index 37836e0..72d563b 100644
--- a/runtime/platform/atomic.h
+++ b/runtime/platform/atomic.h
@@ -49,6 +49,12 @@
   }
 
   template <typename T>
+  static T LoadAcquire(T* ptr);
+
+  template <typename T>
+  static void StoreRelease(T* ptr, T value);
+
+  template <typename T>
   static T* CompareAndSwapPointer(T** slot, T* old_value, T* new_value) {
     return reinterpret_cast<T*>(AtomicOperations::CompareAndSwapWord(
         reinterpret_cast<uword*>(slot), reinterpret_cast<uword>(old_value),
diff --git a/runtime/platform/atomic_android.h b/runtime/platform/atomic_android.h
index f95ba02..ef4e78a 100644
--- a/runtime/platform/atomic_android.h
+++ b/runtime/platform/atomic_android.h
@@ -68,6 +68,16 @@
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 }
 
+template <typename T>
+inline T AtomicOperations::LoadAcquire(T* ptr) {
+  return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
+}
+
+template <typename T>
+inline void AtomicOperations::StoreRelease(T* ptr, T value) {
+  __atomic_store_n(ptr, value, __ATOMIC_RELEASE);
+}
+
 }  // namespace dart
 
 #endif  // RUNTIME_PLATFORM_ATOMIC_ANDROID_H_
diff --git a/runtime/platform/atomic_fuchsia.h b/runtime/platform/atomic_fuchsia.h
index 2883e1e..8688987 100644
--- a/runtime/platform/atomic_fuchsia.h
+++ b/runtime/platform/atomic_fuchsia.h
@@ -65,6 +65,16 @@
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 }
 
+template <typename T>
+inline T AtomicOperations::LoadAcquire(T* ptr) {
+  return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
+}
+
+template <typename T>
+inline void AtomicOperations::StoreRelease(T* ptr, T value) {
+  __atomic_store_n(ptr, value, __ATOMIC_RELEASE);
+}
+
 }  // namespace dart
 
 #endif  // RUNTIME_PLATFORM_ATOMIC_FUCHSIA_H_
diff --git a/runtime/platform/atomic_linux.h b/runtime/platform/atomic_linux.h
index fd1773f..c309af7 100644
--- a/runtime/platform/atomic_linux.h
+++ b/runtime/platform/atomic_linux.h
@@ -68,6 +68,16 @@
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 }
 
+template <typename T>
+inline T AtomicOperations::LoadAcquire(T* ptr) {
+  return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
+}
+
+template <typename T>
+inline void AtomicOperations::StoreRelease(T* ptr, T value) {
+  __atomic_store_n(ptr, value, __ATOMIC_RELEASE);
+}
+
 }  // namespace dart
 
 #endif  // RUNTIME_PLATFORM_ATOMIC_LINUX_H_
diff --git a/runtime/platform/atomic_macos.h b/runtime/platform/atomic_macos.h
index b0bd31f..340ed40 100644
--- a/runtime/platform/atomic_macos.h
+++ b/runtime/platform/atomic_macos.h
@@ -68,6 +68,16 @@
   return __sync_val_compare_and_swap(ptr, old_value, new_value);
 }
 
+template <typename T>
+inline T AtomicOperations::LoadAcquire(T* ptr) {
+  return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
+}
+
+template <typename T>
+inline void AtomicOperations::StoreRelease(T* ptr, T value) {
+  __atomic_store_n(ptr, value, __ATOMIC_RELEASE);
+}
+
 }  // namespace dart
 
 #endif  // RUNTIME_PLATFORM_ATOMIC_MACOS_H_
diff --git a/runtime/platform/atomic_win.h b/runtime/platform/atomic_win.h
index 5e6db1b..bbef085 100644
--- a/runtime/platform/atomic_win.h
+++ b/runtime/platform/atomic_win.h
@@ -141,6 +141,24 @@
 #endif
 }
 
+template <typename T>
+inline T AtomicOperations::LoadAcquire(T* ptr) {
+#if (defined(HOST_ARCH_X64) || defined(HOST_ARCH_IA32))
+  return *ptr;
+#else
+#error Unsupported host architecture.
+#endif
+}
+
+template <typename T>
+inline void AtomicOperations::StoreRelease(T* ptr, T value) {
+#if (defined(HOST_ARCH_X64) || defined(HOST_ARCH_IA32))
+  *ptr = value;
+#else
+#error Unsupported host architecture.
+#endif
+}
+
 }  // namespace dart
 
 #endif  // RUNTIME_PLATFORM_ATOMIC_WIN_H_
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 11c9d32..0dfd620 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -238,6 +238,23 @@
 #error Automatic compiler detection failed.
 #endif
 
+#ifdef _MSC_VER
+#elif __GNUC__
+#define DART_HAS_COMPUTED_GOTO 1
+#else
+#error Automatic compiler detection failed.
+#endif
+
+// LIKELY/UNLIKELY give the compiler branch preditions that may affect block
+// scheduling.
+#ifdef __GNUC__
+#define LIKELY(cond) __builtin_expect((cond), 1)
+#define UNLIKELY(cond) __builtin_expect((cond), 0)
+#else
+#define LIKELY(cond) cond
+#define UNLIKELY(cond) cond
+#endif
+
 // DART_UNUSED indicates to the compiler that a variable or typedef is expected
 // to be unused and disables the related warning.
 #ifdef __GNUC__
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index 2917008..56c49bb 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -337,6 +337,26 @@
     return bit << n;
   }
 
+  // Decode integer in SLEB128 format from |data| and update |byte_index|.
+  static intptr_t DecodeSLEB128(const uint8_t* data,
+                                const intptr_t data_length,
+                                intptr_t* byte_index) {
+    ASSERT(*byte_index < data_length);
+    uword shift = 0;
+    intptr_t value = 0;
+    uint8_t part = 0;
+    do {
+      part = data[(*byte_index)++];
+      value |= static_cast<intptr_t>(part & 0x7f) << shift;
+      shift += 7;
+    } while ((part & 0x80) != 0);
+
+    if ((shift < (sizeof(value) * 8)) && ((part & 0x40) != 0)) {
+      value |= static_cast<intptr_t>(kUwordMax << shift);
+    }
+    return value;
+  }
+
   static char* StrError(int err, char* buffer, size_t bufsize);
 
   // Not all platforms support strndup.
diff --git a/runtime/tests/vm/dart/entrypoints/aot/static_this_test.dart b/runtime/tests/vm/dart/entrypoints/aot/static_this_test.dart
new file mode 100644
index 0000000..2aef254
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/aot/static_this_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true
+
+import '../static_this.dart';
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/aot/super_test.dart b/runtime/tests/vm/dart/entrypoints/aot/super_test.dart
new file mode 100644
index 0000000..8b19e02
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/aot/super_test.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true
+
+import "../super.dart";
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/common.dart b/runtime/tests/vm/dart/entrypoints/common.dart
index 37a6aa5..3d6521b 100644
--- a/runtime/tests/vm/dart/entrypoints/common.dart
+++ b/runtime/tests/vm/dart/entrypoints/common.dart
@@ -11,6 +11,11 @@
 const String NeverInline =
     const bool.fromEnvironment("enable_inlining") ? "" : "NeverInline";
 
+// In AOT we need to force some functions to be inlined since we only build the
+// unchecked entry-point when inlining.
+const String AlwaysInline =
+    const bool.fromEnvironment("enable_inlining") ? "AlwaysInline" : "";
+
 // All these tests can be run in test mode or in benchmark mode. In benchmark
 // mode, there is introspection is omitted and the tests runs for many more
 // iterations.
@@ -48,5 +53,7 @@
       entryPoint);
 }
 
+@pragma("vm:entry-point", "get")
 const validate = benchmarkMode ? null : _validateFn;
+@pragma("vm:entry-point", "get")
 const validateTearoff = benchmarkMode ? null : _validateTearoffFn;
diff --git a/runtime/tests/vm/dart/entrypoints/jit/polymorphic_optional_this_test.dart b/runtime/tests/vm/dart/entrypoints/jit/polymorphic_optional_this_test.dart
new file mode 100644
index 0000000..12523e8
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/jit/polymorphic_optional_this_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+
+// Test that 'PolymorphicInstanceCall's against "this" go through the unchecked
+// entrypoint. The use of optional arguments here encourages prologue sharing
+// between the entrypoints.
+
+import "../common.dart";
+import "package:expect/expect.dart";
+
+abstract class C<T> {
+  @NeverInline
+  void samir1(T x) {
+    samir2(x, y: "hi");
+  }
+
+  void samir2(T x, {String y});
+}
+
+class D<T> extends C<T> {
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  @pragma("vm:entry-point")
+  void samir2(T x, {String y}) {
+    Expect.notEquals(x, -1);
+    Expect.equals(y, "hi");
+  }
+}
+
+class E<T> extends C<T> {
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  @pragma("vm:entry-point")
+  void samir2(T x, {String y}) {
+    Expect.notEquals(x, -1);
+    Expect.equals(y, "hi");
+  }
+}
+
+int j = 0;
+
+C getC() {
+  if (j % 2 == 0) {
+    ++j;
+    return new D<int>();
+  } else {
+    ++j;
+    return new E<int>();
+  }
+}
+
+main(List<String> args) {
+  // Warmup.
+  expectedEntryPoint = -1;
+  for (int i = 0; i < 100; ++i) {
+    getC().samir1(i);
+  }
+
+  expectedEntryPoint = 2;
+  const int iterations = benchmarkMode ? 100000000 : 100;
+  for (int i = 0; i < iterations; ++i) {
+    getC().samir1(i);
+  }
+
+  Expect.isTrue(validateRan);
+}
diff --git a/runtime/tests/vm/dart/entrypoints/jit/polymorphic_this_test.dart b/runtime/tests/vm/dart/entrypoints/jit/polymorphic_this_test.dart
new file mode 100644
index 0000000..4a360e9
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/jit/polymorphic_this_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+
+// Test that 'PolymorphicInstanceCall's against "this" go through the unchecked
+// entrypoint.
+
+import "../common.dart";
+import "package:expect/expect.dart";
+
+abstract class C<T> {
+  @NeverInline
+  void target1(T x) {
+    target2(x);
+  }
+
+  void target2(T x);
+}
+
+class D<T> extends C<T> {
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  void target2(T x) {
+    Expect.notEquals(x, -1);
+  }
+}
+
+class E<T> extends C<T> {
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  @NeverInline
+  void target2(T x) {
+    Expect.notEquals(x, -1);
+  }
+}
+
+int j = 0;
+
+C getC() {
+  if (j % 2 == 0) {
+    ++j;
+    return new D<int>();
+  } else {
+    ++j;
+    return new E<int>();
+  }
+}
+
+main(List<String> args) {
+  // Warmup.
+  expectedEntryPoint = -1;
+  for (int i = 0; i < 100; ++i) {
+    getC().target1(0);
+  }
+
+  expectedEntryPoint = 1;
+  const int iterations = benchmarkMode ? 200000000 : 100;
+  for (int i = 0; i < iterations; ++i) {
+    getC().target1(i);
+  }
+
+  // Once for D and once for E.
+  expectedEntryPoint = 0;
+  dynamic x = getC();
+  x.target2(0);
+  x = getC();
+  x.target2(0);
+
+  Expect.isTrue(validateRan);
+}
diff --git a/runtime/tests/vm/dart/entrypoints/jit/static_this_test.dart b/runtime/tests/vm/dart/entrypoints/jit/static_this_test.dart
new file mode 100644
index 0000000..0662ada
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/jit/static_this_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true
+
+import '../static_this.dart';
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/jit/super_test.dart b/runtime/tests/vm/dart/entrypoints/jit/super_test.dart
new file mode 100644
index 0000000..dff824c
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/jit/super_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5
+
+import "../super.dart";
+
+main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this.dart
deleted file mode 100644
index 6099194..0000000
--- a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that 'PolymorphicInstanceCall's against "this" go through the unchecked
-// entrypoint. The use of optional arguments here encourages prologue sharing
-// between the entrypoints.
-
-import "common.dart";
-import "package:expect/expect.dart";
-
-abstract class C<T> {
-  @NeverInline
-  void samir1(T x) {
-    samir2(x, y: "hi");
-  }
-
-  void samir2(T x, {String y});
-}
-
-class D<T> extends C<T> {
-  @NeverInline
-  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
-  void samir2(T x, {String y}) {
-    Expect.notEquals(x, -1);
-    Expect.equals(y, "hi");
-  }
-}
-
-class E<T> extends C<T> {
-  @NeverInline
-  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
-  void samir2(T x, {String y}) {
-    Expect.notEquals(x, -1);
-    Expect.equals(y, "hi");
-  }
-}
-
-int j = 0;
-
-C getC() {
-  if (j % 2 == 0) {
-    ++j;
-    return new D<int>();
-  } else {
-    ++j;
-    return new E<int>();
-  }
-}
-
-test(List<String> args) {
-  // Warmup.
-  expectedEntryPoint = -1;
-  for (int i = 0; i < 100; ++i) {
-    getC().samir1(i);
-  }
-
-  expectedEntryPoint = 2;
-  const int iterations = benchmarkMode ? 100000000 : 100;
-  for (int i = 0; i < iterations; ++i) {
-    getC().samir1(i);
-  }
-
-  Expect.isTrue(validateRan);
-}
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_inline_test.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_inline_test.dart
deleted file mode 100644
index 7d01f34..0000000
--- a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_inline_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
-
-import "polymorphic_optional_this.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_noinline_test.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_noinline_test.dart
deleted file mode 100644
index 5dbf571..0000000
--- a/runtime/tests/vm/dart/entrypoints/polymorphic_optional_this_noinline_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
-
-import "polymorphic_optional_this.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_this.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_this.dart
deleted file mode 100644
index 5d4aac9..0000000
--- a/runtime/tests/vm/dart/entrypoints/polymorphic_this.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that 'PolymorphicInstanceCall's against "this" go through the unchecked
-// entrypoint.
-
-import "common.dart";
-import "package:expect/expect.dart";
-
-abstract class C<T> {
-  @NeverInline
-  void target1(T x) {
-    target2(x);
-  }
-
-  void target2(T x);
-}
-
-class D<T> extends C<T> {
-  @NeverInline
-  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
-  void target2(T x) {
-    Expect.notEquals(x, -1);
-  }
-}
-
-class E<T> extends C<T> {
-  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
-  @NeverInline
-  void target2(T x) {
-    Expect.notEquals(x, -1);
-  }
-}
-
-int j = 0;
-
-C getC() {
-  if (j % 2 == 0) {
-    ++j;
-    return new D<int>();
-  } else {
-    ++j;
-    return new E<int>();
-  }
-}
-
-test(List<String> args) {
-  // Warmup.
-  expectedEntryPoint = -1;
-  for (int i = 0; i < 100; ++i) {
-    getC().target1(0);
-  }
-
-  expectedEntryPoint = 1;
-  const int iterations = benchmarkMode ? 200000000 : 100;
-  for (int i = 0; i < iterations; ++i) {
-    getC().target1(i);
-  }
-
-  // Once for D and once for E.
-  expectedEntryPoint = 0;
-  dynamic f = getC().target2;
-  f(0);
-  f = getC().target2;
-  f(0);
-
-  Expect.isTrue(validateRan);
-}
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_this_inline_test.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_this_inline_test.dart
deleted file mode 100644
index 99617e7..0000000
--- a/runtime/tests/vm/dart/entrypoints/polymorphic_this_inline_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
-
-import "polymorphic_this.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/polymorphic_this_noinline_test.dart b/runtime/tests/vm/dart/entrypoints/polymorphic_this_noinline_test.dart
deleted file mode 100644
index 7e2e1f0..0000000
--- a/runtime/tests/vm/dart/entrypoints/polymorphic_this_noinline_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
-
-import "polymorphic_this.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/static_this.dart b/runtime/tests/vm/dart/entrypoints/static_this.dart
index d64f6be..da610da 100644
--- a/runtime/tests/vm/dart/entrypoints/static_this.dart
+++ b/runtime/tests/vm/dart/entrypoints/static_this.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-
+//
 // Test that 'StaticCall's against "this" go through the unchecked entry-point.
 
 import "common.dart";
@@ -10,6 +10,7 @@
 class C<T> {
   @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
   @NeverInline
+  @AlwaysInline
   void target2(T x) {
     Expect.notEquals(x, -1);
   }
@@ -37,8 +38,8 @@
   }
 
   expectedEntryPoint = 0;
-  dynamic f = c.target2;
-  f(0);
+  dynamic x = c;
+  x.target2(0);
 
   Expect.isTrue(validateRan);
 }
diff --git a/runtime/tests/vm/dart/entrypoints/static_this_inline_test.dart b/runtime/tests/vm/dart/entrypoints/static_this_inline_test.dart
deleted file mode 100644
index ea7391e..0000000
--- a/runtime/tests/vm/dart/entrypoints/static_this_inline_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
-
-import "static_this.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/static_this_noinline_test.dart b/runtime/tests/vm/dart/entrypoints/static_this_noinline_test.dart
deleted file mode 100644
index 453677b..0000000
--- a/runtime/tests/vm/dart/entrypoints/static_this_noinline_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
-
-import "static_this.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/super.dart b/runtime/tests/vm/dart/entrypoints/super.dart
new file mode 100644
index 0000000..088b193
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/super.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Test that 'StaticCall's against "super" go through the unchecked entrypoint.
+
+import "common.dart";
+import "package:expect/expect.dart";
+
+class C<T> {
+  @AlwaysInline
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validate)
+  void target1(T x) {
+    Expect.notEquals(x, -1);
+  }
+}
+
+class D<T> extends C<T> {
+  @NeverInline
+  void target1(T x) {
+    super.target1(x);
+  }
+}
+
+class E<T> extends C<T> {
+  @NeverInline
+  void target1(T x) {
+    super.target1(x);
+  }
+}
+
+int j = 0;
+
+C getC() {
+  if (j % 2 == 0) {
+    ++j;
+    return new D<int>();
+  } else if (j % 2 == 1) {
+    ++j;
+    return new E<int>();
+  } else {
+    return new C<int>();
+  }
+}
+
+// This works around issues with OSR not totally respecting the optimization
+// counter threshold.
+void testOneC(C x, int i) => x.target1(i);
+
+test(List<String> args) {
+  // Make sure the check on target1.x is not completely eliminated.
+  if (args.length > 0) {
+    (C<int>() as C<num>).target1(1.0);
+  }
+
+  expectedEntryPoint = -1;
+  for (int i = 0; i < 100; ++i) {
+    testOneC(getC(), i);
+  }
+
+  expectedEntryPoint = 1;
+  const int iterations = benchmarkMode ? 200000000 : 100;
+  for (int i = 0; i < iterations; ++i) {
+    testOneC(getC(), i);
+  }
+
+  Expect.isTrue(validateRan);
+}
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff.dart b/runtime/tests/vm/dart/entrypoints/tearoff.dart
deleted file mode 100644
index cdebd3a..0000000
--- a/runtime/tests/vm/dart/entrypoints/tearoff.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that typed calls against tearoffs go into the unchecked entrypoint.
-
-import "package:expect/expect.dart";
-import "common.dart";
-
-class C<T> {
-  @NeverInline
-  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validateTearoff)
-  void target1(T x, String y) {
-    Expect.notEquals(x, -1);
-    Expect.equals(y, "foo");
-  }
-}
-
-test(List<String> args) {
-  var f = (new C<int>()).target1;
-
-  // Warmup.
-  expectedEntryPoint = -1;
-  expectedTearoffEntryPoint = -1;
-  for (int i = 0; i < 100; ++i) {
-    f(i, "foo");
-  }
-
-  expectedEntryPoint = 0;
-  expectedTearoffEntryPoint = 1;
-  const int iterations = benchmarkMode ? 100000000 : 100;
-  for (int i = 0; i < iterations; ++i) {
-    f(i, "foo");
-  }
-
-  Expect.isTrue(validateRan);
-}
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_inline_test.dart b/runtime/tests/vm/dart/entrypoints/tearoff_inline_test.dart
deleted file mode 100644
index 843324a..0000000
--- a/runtime/tests/vm/dart/entrypoints/tearoff_inline_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
-
-import "tearoff.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_noinline_test.dart b/runtime/tests/vm/dart/entrypoints/tearoff_noinline_test.dart
deleted file mode 100644
index aac3f75..0000000
--- a/runtime/tests/vm/dart/entrypoints/tearoff_noinline_test.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
-
-import "tearoff.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_prologue.dart b/runtime/tests/vm/dart/entrypoints/tearoff_prologue.dart
deleted file mode 100644
index 8ce9916..0000000
--- a/runtime/tests/vm/dart/entrypoints/tearoff_prologue.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// No type checks are removed here, but we can skip the argument count check.
-
-import "package:expect/expect.dart";
-import "common.dart";
-
-class C<T> {
-  @NeverInline
-  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validateTearoff)
-  void samir1(T x) {
-    if (x == -1) {
-      throw "oh no";
-    }
-  }
-}
-
-test(List<String> args) {
-  var c = new C<int>();
-  var f = c.samir1;
-
-  // Warmup.
-  expectedEntryPoint = -1;
-  expectedTearoffEntryPoint = -1;
-  for (int i = 0; i < 100; ++i) {
-    f(i);
-  }
-
-  expectedEntryPoint = 0;
-  expectedTearoffEntryPoint = 1;
-  int iterations = benchmarkMode ? 100000000 : 100;
-  for (int i = 0; i < iterations; ++i) {
-    f(i);
-  }
-
-  Expect.isTrue(validateRan);
-}
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_prologue_inline_test.dart b/runtime/tests/vm/dart/entrypoints/tearoff_prologue_inline_test.dart
deleted file mode 100644
index 3ccf462..0000000
--- a/runtime/tests/vm/dart/entrypoints/tearoff_prologue_inline_test.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
-
-import "tearoff_prologue.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_prologue_noinline_test.dart b/runtime/tests/vm/dart/entrypoints/tearoff_prologue_noinline_test.dart
deleted file mode 100644
index 4f1bbcd..0000000
--- a/runtime/tests/vm/dart/entrypoints/tearoff_prologue_noinline_test.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
-
-import "tearoff_prologue.dart";
-
-main(args) => test(args);
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_prologue_test.dart b/runtime/tests/vm/dart/entrypoints/tearoff_prologue_test.dart
new file mode 100644
index 0000000..c74b806
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/tearoff_prologue_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// No type checks are removed here, but we can skip the argument count check.
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+
+import "package:expect/expect.dart";
+import "common.dart";
+
+class C<T> {
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validateTearoff)
+  @pragma("vm:entry-point")
+  void samir1(T x) {
+    if (x == -1) {
+      throw "oh no";
+    }
+  }
+}
+
+main(List<String> args) {
+  var c = new C<int>();
+  var f = c.samir1;
+
+  // Warmup.
+  expectedEntryPoint = -1;
+  expectedTearoffEntryPoint = -1;
+  for (int i = 0; i < 100; ++i) {
+    f(i);
+  }
+
+  expectedEntryPoint = 0;
+  expectedTearoffEntryPoint = 1;
+  int iterations = benchmarkMode ? 100000000 : 100;
+  for (int i = 0; i < iterations; ++i) {
+    f(i);
+  }
+
+  Expect.isTrue(validateRan);
+}
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_test.dart b/runtime/tests/vm/dart/entrypoints/tearoff_test.dart
new file mode 100644
index 0000000..1b29cbe
--- /dev/null
+++ b/runtime/tests/vm/dart/entrypoints/tearoff_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+
+// Test that typed calls against tearoffs go into the unchecked entrypoint.
+
+import "package:expect/expect.dart";
+import "common.dart";
+
+class C<T> {
+  @NeverInline
+  @pragma("vm:testing.unsafe.trace-entrypoints-fn", validateTearoff)
+  @pragma("vm:entry-point")
+  void target1(T x, String y) {
+    Expect.notEquals(x, -1);
+    Expect.equals(y, "foo");
+  }
+}
+
+main(List<String> args) {
+  var f = (new C<int>()).target1;
+
+  // Warmup.
+  expectedEntryPoint = -1;
+  expectedTearoffEntryPoint = -1;
+  for (int i = 0; i < 100; ++i) {
+    f(i, "foo");
+  }
+
+  expectedEntryPoint = 0;
+  expectedTearoffEntryPoint = 1;
+  const int iterations = benchmarkMode ? 100000000 : 100;
+  for (int i = 0; i < iterations; ++i) {
+    f(i, "foo");
+  }
+
+  Expect.isTrue(validateRan);
+}
diff --git a/runtime/tests/vm/dart/kernel_determinism_test.dart b/runtime/tests/vm/dart/kernel_determinism_test.dart
new file mode 100644
index 0000000..ed3ab3d
--- /dev/null
+++ b/runtime/tests/vm/dart/kernel_determinism_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Verify creating an incremental kernel file twice generates the same bits.
+
+import 'dart:async';
+import 'snapshot_test_helper.dart';
+
+int fib(int n) {
+  if (n <= 1) return 1;
+  return fib(n - 1) + fib(n - 2);
+}
+
+Future<void> main(List<String> args) async {
+  if (args.contains('--child')) {
+    print(fib(35));
+    return;
+  }
+
+  await checkDeterministicSnapshot("kernel", "");
+}
diff --git a/runtime/tests/vm/dart/regress_33999_test.dart b/runtime/tests/vm/dart/regress_33999_test.dart
index 933d2e0..e7e9e89 100644
--- a/runtime/tests/vm/dart/regress_33999_test.dart
+++ b/runtime/tests/vm/dart/regress_33999_test.dart
@@ -8,12 +8,16 @@
 
 // Class with two type parameters.
 class A<U, T> {
-  T field;
+  T field1;
+  List<T> field2;
+  T Function(T) field3;
 }
 
 // Class with a single type parameter
 class B<T> {
-  T field;
+  T field1;
+  List<T> field2;
+  T Function(T) field3;
 }
 
 var TRUE = true;
@@ -22,9 +26,13 @@
   dynamic x = f ? new B<int>() : new A<String, int>();
   if (f == TRUE) {
     // Prevent constant folding by accessing a global
-    x.field = 10;
+    x.field1 = 10;
+    x.field2 = <int>[];
+    x.field3 = (int i) => ++i;
   } else {
-    x.field = 10;
+    x.field1 = 10;
+    x.field2 = <int>[];
+    x.field3 = (int i) => ++i;
   }
 }
 
diff --git a/runtime/tests/vm/dart/regress_34755_test.dart b/runtime/tests/vm/dart/regress_34755_test.dart
new file mode 100644
index 0000000..c13cfcf
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_34755_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test checking that null is handled correctly at the call-sites that
+// are tracking static type exactness.
+
+import 'package:expect/expect.dart';
+
+void invokeAdd(List<int> l) {
+  l.add(10);
+}
+
+void main() {
+  Expect.throws(() => invokeAdd(null), (error) => error is NoSuchMethodError);
+}
diff --git a/runtime/tests/vm/dart/regress_35481_test.dart b/runtime/tests/vm/dart/regress_35481_test.dart
new file mode 100644
index 0000000..21fd2ed
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_35481_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test checking that inlines replacing binding instructions with non-binding
+// instructions do not cause the compiler to crash due to not appropriately
+// replacing uses of the original binding instruction.
+//
+// Here, all phi nodes generated within the try block are kept alive, and one of
+// the phi nodes within toList (which gets inlined) uses the value of an
+// instance call to setLength. Inlining setLength wthin toList replaced the
+// (binding) InstanceCall instruction with a (non-binding) StoreInstanceField
+// instruction, which caused the phi node to have an invalid SSA index argument.
+
+void foo() {
+  try {
+    for (var i = 0; i < 1000; i++) {
+      List(10).toList(growable: true);
+    }
+  } catch (e) {}
+}
+
+void main() {
+  foo();
+  foo();
+}
diff --git a/runtime/tests/vm/dart/snapshot_test_helper.dart b/runtime/tests/vm/dart/snapshot_test_helper.dart
index ef65c1f..5c27ced 100644
--- a/runtime/tests/vm/dart/snapshot_test_helper.dart
+++ b/runtime/tests/vm/dart/snapshot_test_helper.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 import 'dart:io';
+import 'dart:math';
 
 import 'package:expect/expect.dart';
 import 'package:path/path.dart' as p;
@@ -49,6 +50,21 @@
   final processResult = await Process.run(binary, actualArguments);
   final result = new Result(
       '[$prefix] ${binary} ${actualArguments.join(' ')}', processResult);
+
+  if (processResult.stdout.isNotEmpty) {
+    print('''
+
+Command stdout:
+${processResult.stdout}''');
+  }
+
+  if (processResult.stderr.isNotEmpty) {
+    print('''
+
+Command stderr:
+${processResult.stderr}''');
+  }
+
   if (result.processResult.exitCode != 0) {
     reportError(result,
         '[$prefix] Process finished with non-zero exit code ${result.processResult.exitCode}');
@@ -63,8 +79,14 @@
   final snapshot2Path = p.join(temp.path, 'snapshot2');
 
   try {
+    print("Version ${Platform.version}");
+
     final generate1Result = await runDartBinary('GENERATE SNAPSHOT 1', [
       '--deterministic',
+      '--trace_class_finalization',
+      '--trace_type_finalization',
+      '--trace_compiler',
+      '--verbose_gc',
       '--snapshot=$snapshot1Path',
       '--snapshot-kind=$snapshotKind',
       Platform.script.toFilePath(),
@@ -74,6 +96,10 @@
 
     final generate2Result = await runDartBinary('GENERATE SNAPSHOT 2', [
       '--deterministic',
+      '--trace_class_finalization',
+      '--trace_type_finalization',
+      '--trace_compiler',
+      '--verbose_gc',
       '--snapshot=$snapshot2Path',
       '--snapshot-kind=$snapshotKind',
       Platform.script.toFilePath(),
@@ -84,12 +110,13 @@
     var snapshot1Bytes = await new File(snapshot1Path).readAsBytes();
     var snapshot2Bytes = await new File(snapshot2Path).readAsBytes();
 
-    Expect.equals(snapshot1Bytes.length, snapshot2Bytes.length);
-    for (var i = 0; i < snapshot1Bytes.length; i++) {
+    var minLength = min(snapshot1Bytes.length, snapshot2Bytes.length);
+    for (var i = 0; i < minLength; i++) {
       if (snapshot1Bytes[i] != snapshot2Bytes[i]) {
-        Expect.fail("Snapshots are not bitwise equal!");
+        Expect.fail("Snapshots differ at byte $i");
       }
     }
+    Expect.equals(snapshot1Bytes.length, snapshot2Bytes.length);
   } finally {
     await temp.delete(recursive: true);
   }
diff --git a/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
new file mode 100644
index 0000000..266adde
--- /dev/null
+++ b/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart
@@ -0,0 +1,177 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:convert";
+import "dart:io";
+
+import "package:expect/expect.dart";
+import "package:vm/v8_snapshot_profile.dart";
+
+String path(List<String> segments) {
+  return "/" + segments.join("/");
+}
+
+test(String sdkRoot, {bool useElf: false}) async {
+  if (Platform.isMacOS && useElf) return;
+
+  // Generate the snapshot profile.
+  final String thisTestPath =
+      "$sdkRoot/runtime/tests/vm/dart/v8_snapshot_profile_writer_test.dart";
+
+  final Directory temp = await Directory.systemTemp.createTemp();
+  final String snapshotPath = temp.path + "/test.snap";
+
+  final List<String> precompiler2Args = [
+    "--write-v8-snapshot-profile-to=${temp.path}/profile.heapsnapshot",
+    thisTestPath,
+    snapshotPath,
+  ];
+
+  if (useElf) {
+    precompiler2Args.insert(0, "--build-elf");
+  }
+
+  final ProcessResult result = await Process.run(
+    "pkg/vm/tool/precompiler2",
+    precompiler2Args,
+    workingDirectory: sdkRoot,
+    runInShell: true,
+  );
+
+  // The precompiler2 script tried using GCC for the wrong architecture. We
+  // don't have a workaround for this now.
+  if (useElf &&
+      result.exitCode != 0 &&
+      result.stderr.contains("Assembler messages")) {
+    return;
+  }
+
+  print(precompiler2Args);
+  print(result.stderr);
+  print(result.stdout);
+
+  Expect.equals(result.exitCode, 0);
+  Expect.equals(result.stderr, "");
+  Expect.equals(result.stdout, "");
+
+  final V8SnapshotProfile profile = V8SnapshotProfile.fromJson(JsonDecoder()
+      .convert(File("${temp.path}/profile.heapsnapshot").readAsStringSync()));
+
+  // Verify that there are no "unknown" nodes. These are emitted when we see a
+  // reference to an some object but no other metadata about the object was
+  // recorded. We should at least record the type for every object in the graph
+  // (in some cases the shallow size can legitimately be 0, e.g. for "base
+  // objects").
+  for (final int node in profile.nodes) {
+    if (profile[node].type == "Unknown") {
+      print(profile[node].id);
+    }
+    Expect.notEquals(profile[node].type, "Unknown");
+  }
+
+  // Verify that all nodes are reachable from the declared roots.
+  int unreachableNodes = 0;
+  Set<int> nodesReachableFromRoots = profile.preOrder(profile.root).toSet();
+  for (final int node in profile.nodes) {
+    if (!nodesReachableFromRoots.contains(node)) {
+      ++unreachableNodes;
+    }
+  }
+  Expect.equals(unreachableNodes, 0);
+
+  // Verify that the actual size of the snapshot is close to the sum of the
+  // shallow sizes of all objects in the profile. They will not be exactly equal
+  // because of global headers and padding.
+  if (useElf) {
+    await Process.run("strip", [snapshotPath]);
+  }
+  final int actual = await File(snapshotPath).length();
+  final int expected = profile.accountedBytes;
+  Expect.isTrue((actual - expected).abs() / actual < 0.01);
+}
+
+Match matchComplete(RegExp regexp, String line) {
+  Match match = regexp.firstMatch(line);
+  if (match == null) return match;
+  if (match.start != 0 || match.end != line.length) return null;
+  return match;
+}
+
+// All fields of "Raw..." classes defined in "raw_object.h" must be included in
+// the giant macro in "raw_object_fields.cc". This function attempts to check
+// that with some basic regexes.
+testMacros(String sdkRoot) async {
+  const String className = "([a-z0-9A-Z]+)";
+  const String rawClass = "Raw$className";
+  const String fieldName = "([a-z0-9A-Z_]+)";
+
+  final Map<String, Set<String>> fields = {};
+
+  final String rawObjectFieldsPath = "$sdkRoot/runtime/vm/raw_object_fields.cc";
+  final RegExp fieldEntry = RegExp(" *F\\($className, $fieldName\\) *\\\\?");
+
+  await for (String line in File(rawObjectFieldsPath)
+      .openRead()
+      .transform(utf8.decoder)
+      .transform(LineSplitter())) {
+    Match match = matchComplete(fieldEntry, line);
+    if (match != null) {
+      fields
+          .putIfAbsent(match.group(1), () => Set<String>())
+          .add(match.group(2));
+    }
+  }
+
+  final RegExp classStart = RegExp("class $rawClass : public $rawClass {");
+  final RegExp classEnd = RegExp("}");
+  final RegExp field = RegExp("  $rawClass. +$fieldName;.*");
+
+  final String rawObjectPath = "$sdkRoot/runtime/vm/raw_object.h";
+
+  String currentClass;
+  bool hasMissingFields = false;
+  await for (String line in File(rawObjectPath)
+      .openRead()
+      .transform(utf8.decoder)
+      .transform(LineSplitter())) {
+    Match match = matchComplete(classStart, line);
+    if (match != null) {
+      currentClass = match.group(1);
+      continue;
+    }
+
+    match = matchComplete(classEnd, line);
+    if (match != null) {
+      currentClass = null;
+      continue;
+    }
+
+    match = matchComplete(field, line);
+    if (match != null && currentClass != null) {
+      if (!fields[currentClass].contains(match.group(2))) {
+        hasMissingFields = true;
+        print("$currentClass is missing ${match.group(2)}.");
+      }
+    }
+  }
+
+  if (hasMissingFields) {
+    Expect.fail(
+        "runtime/vm/raw_object_fields.cc misses some fields. Please update it to match raw_object.h.");
+  }
+}
+
+main() async {
+  if (Platform.isWindows) return;
+
+  final List<String> sdkBaseSegments =
+      Uri.file(Platform.resolvedExecutable).pathSegments.toList();
+  sdkBaseSegments
+      .replaceRange(sdkBaseSegments.length - 3, sdkBaseSegments.length, []);
+  String sdkRoot = path(sdkBaseSegments);
+
+  test(sdkRoot, useElf: false);
+  test(sdkRoot, useElf: true);
+  testMacros(sdkRoot);
+}
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index cfd49dc..dda2b1d 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -10,26 +10,28 @@
 cc/Fail0: Fail # These tests are expected to crash on all platforms.
 cc/Fail1: Fail # These tests are expected to crash on all platforms.
 cc/Fail2: Fail # These tests are expected to crash on all platforms.
-cc/IsolateReload_PendingConstructorCall_AbstractToConcrete: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
-cc/IsolateReload_PendingConstructorCall_ConcreteToAbstract: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
+cc/IsolateReload_PendingConstructorCall_AbstractToConcrete: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline).
+cc/IsolateReload_PendingConstructorCall_ConcreteToAbstract: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline).
 cc/IsolateReload_PendingStaticCall_DefinedToNSM: Fail # Issue 32981
 cc/IsolateReload_PendingStaticCall_NSMToDefined: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
 cc/IsolateReload_PendingUnqualifiedCall_InstanceToStatic: Fail # Issue 32981
 cc/IsolateReload_PendingUnqualifiedCall_StaticToInstance: Fail # Issue 32981
 cc/IsolateReload_RunNewFieldInitializersWithGenerics: Fail # Issue 32299
-cc/Profiler_FunctionInline: Pass, Fail # Flaky failure.
-cc/Profiler_InliningIntervalBoundry: Skip # Differences in ia32, debug, release
 cc/SNPrint_BadArgs: Crash, Fail # These tests are expected to crash on all platforms.
 dart/data_uri_import_test/none: SkipByDesign
 dart/snapshot_version_test: Skip # This test is a Dart1 test (script snapshot)
 dart/slow_path_shared_stub_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
 dart/stack_overflow_shared_test: Pass, Slow # Uses --shared-slow-path-triggers-gc flag.
 
+[ $mode == debug ]
+dart/appjit_cha_deopt_test: Pass, Slow # Quite slow in debug mode, uses --optimization-counter-threshold=100
+
 [ $builder_tag == asan ]
 cc/CodeImmutability: Fail, OK # Address Sanitizer turns a crash into a failure.
 
 [ $builder_tag == optimization_counter_threshold ]
 dart/appjit*: SkipByDesign # Test needs to a particular opt-counter value
+dart/kernel_determinism_test: SkipSlow
 
 [ $compiler == app_jitk ]
 dart/data_uri_import_test/utf16: MissingRuntimeError
@@ -51,7 +53,16 @@
 dart/wrap_around_in_range_analysis_test: SkipByDesign # The test requires int64.
 
 [ $compiler != dartk || ($arch != x64 && $arch != simarm && $arch != arm) || $hot_reload || $hot_reload_rollback ]
-dart/entrypoints/*: SkipByDesign  # Only supported in the Dart 2 JIT and test optimizations - hence disabled on hotreload bots.
+dart/entrypoints/jit/*: SkipByDesign  # Only supported in the Dart 2 JIT and AOT, and test optimizations - hence disabled on hotreload bots.
+
+[ $compiler != dartkp || ($arch != x64 && $arch != simarm && $arch != arm) || $hot_reload || $hot_reload_rollback ]
+dart/entrypoints/aot/*: SkipByDesign  # Only supported in the Dart 2 JIT and AOT, and test optimizations - hence disabled on hotreload bots.
+
+[ ($compiler != dartk && $compiler != dartkp) || ($arch != x64 && $arch != simarm && $arch != arm) || $hot_reload || $hot_reload_rollback ]
+dart/entrypoints/*: SkipByDesign  # Only supported in the Dart 2 JIT and AOT, and test optimizations - hence disabled on hotreload bots.
+
+[ $compiler == dartk ]
+dart/entrypoints/aot/*: SkipByDesign
 
 [ ($compiler == dartk || $compiler == dartkb) ]
 cc/DartAPI_New: Fail # Issue #33041
@@ -68,7 +79,6 @@
 cc/IsolateReload_KernelIncrementalCompileGenerics: SkipByDesign
 cc/Mixin_PrivateSuperResolution: Skip
 cc/Mixin_PrivateSuperResolutionCrossLibraryShouldFail: Skip
-dart/appjit_determinism_test: Pass, Fail # Issue 31427 - Lingering non-determinism.
 
 [ $compiler == fasta ]
 dart/data_uri_import_test/badencodeddate: CompileTimeError
@@ -104,8 +114,6 @@
 
 [ $system == windows ]
 cc/CorelibCompilerStats: Skip
-cc/Profiler_ContextAllocation: Fail, Pass # Flaky on Windows --- sometimes give "profiler_test.cc: 1107: error: expected: !walker.Down()"
-cc/Service_Profile: Skip
 cc/GenKernelKernelLoadKernel: Skip  # Issue 34542.
 cc/GenKernelKernelReadAllBytecode: Skip  # Issue 34393.
 cc/GenKernelKernelCombined: Skip  # Issue 34393.
@@ -118,29 +126,6 @@
 [ !$checked && !$strong && $runtime == vm ]
 dart/redirection_type_shuffling_test/00: MissingCompileTimeError
 
-# Following tests are failing in a weird way on macos/ia32/debug builds
-# need to investigate.
-[ $runtime == vm && $system == macos ]
-cc/Profiler_ArrayAllocation: Skip # Issue 34493
-cc/Profiler_BasicSourcePosition: Skip # Issue 34493
-cc/Profiler_BasicSourcePositionOptimized: Skip # Issue 34493
-cc/Profiler_BinaryOperatorSourcePosition: Skip # Issue 34493
-cc/Profiler_BinaryOperatorSourcePositionOptimized: Skip # Issue 34493
-cc/Profiler_ChainedSamples: Skip # Issue 34493
-cc/Profiler_ClosureAllocation: Skip # Issue 34493
-cc/Profiler_CodeTicks: Skip # Issue 34493
-cc/Profiler_ContextAllocation: Skip # Issue 34493
-cc/Profiler_FunctionInline: Skip # Issue 34493
-cc/Profiler_FunctionTicks: Skip # Issue 34493
-cc/Profiler_IntrinsicAllocation: Skip # Issue 34493
-cc/Profiler_SourcePosition: Skip # Issue 34493
-cc/Profiler_SourcePositionOptimized: Skip # Issue 34493
-cc/Profiler_StringAllocation: Skip # Issue 34493
-cc/Profiler_StringInterpolation: Skip # Issue 34493
-cc/Profiler_ToggleRecordAllocation: Skip # Issue 34493
-cc/Profiler_TrivialRecordAllocation: Skip # Issue 34493
-cc/Profiler_TypedArrayAllocation: Skip # Issue 34493
-
 [ $arch != simarm && $arch != simarm64 && $arch != simdbc64 && ($compiler == dartk || $compiler == dartkb) && $hot_reload ]
 dart/data_uri_import_test/base64: Crash
 dart/data_uri_import_test/nocharset: Crash
@@ -149,18 +134,6 @@
 dart/data_uri_import_test/utf16: Crash
 dart/data_uri_import_test/wrongmime: Crash
 
-[ $arch == x64 && ($compiler == dartk || $compiler == dartkb) && $system == windows && $strong && $mode == release ]
-cc/Profiler_BasicSourcePosition: Fail # http://dartbug.com/33224
-cc/Profiler_CodeTicks: Fail # dartbug.com/33337
-
-[ $arch == x64 && $system == windows ]
-cc/Profiler_BinaryOperatorSourcePositionOptimized: Pass, Fail # Issue 31137
-cc/Profiler_ClosureAllocation: Pass, Fail # Issue 31137
-cc/Profiler_IntrinsicAllocation: Pass, Fail # Issue 31137
-cc/Profiler_SourcePositionOptimized: Pass, Fail # Issue 31137
-cc/Profiler_StringAllocation: Pass, Fail # Issue 31137
-cc/Profiler_TypedArrayAllocation: Pass, Fail # Issue 31137
-
 [ $builder_tag == asan && $mode == debug && ($runtime == dart_precompiled || $runtime == vm) ]
 cc/Dart2JSCompileAll: SkipSlow # Timeout.
 
@@ -195,11 +168,6 @@
 cc/Debugger_SetBreakpointInPartOfLibrary: Crash
 cc/IsolateReload_NotTypedefToTypedef: Fail
 cc/IsolateReload_TypedefToNotTypedef: Fail
-cc/Profiler_BasicSourcePositionOptimized: Skip
-cc/Profiler_BinaryOperatorSourcePositionOptimized: Skip
-cc/Profiler_GetSourceReport: Fail
-cc/Profiler_SourcePositionOptimized: Fail
-cc/Profiler_SourcePositionOptimized: Skip
 cc/SourceReport_CallSites_PolymorphicCall: Fail
 cc/SourceReport_CallSites_SimpleCall: Fail
 cc/SourceReport_Coverage_AllFunctions: Fail
@@ -214,7 +182,6 @@
 cc/SourceReport_Coverage_UnusedClass_NoForceCompile: Fail
 cc/SourceReport_MultipleReports: Fail
 cc/SourceReport_PossibleBreakpoints_Simple: Fail
-cc/UseDartApi: Fail
 dart/data_uri_import_test/utf16: MissingRuntimeError
 dart/spawn_shutdown_test: SkipSlow
 
@@ -226,13 +193,6 @@
 
 [ ($compiler == dartk || $compiler == dartkb) && $system == windows ]
 cc/IsolateReload_LibraryLookup: Fail, Crash
-cc/Profiler_FunctionTicks: Fail, Pass
-cc/Profiler_ToggleRecordAllocation: Fail, Pass
-cc/Profiler_TrivialRecordAllocation: Fail, Pass
-
-[ $arch == x64 && ($compiler == dartk || $compiler == dartkb) && $system == windows && $mode == release ]
-cc/Service_Address: Fail
-cc/Service_Code: Fail
 
 [ ($compiler == dartk || $compiler == dartkb) && $checked ]
 dart/redirection_type_shuffling_test/00: Pass # Works in --checked mode but not in --strong mode.
@@ -257,9 +217,11 @@
 
 [ ($compiler == dartk || $compiler == dartkb) && ($hot_reload || $hot_reload_rollback) ]
 dart/data_uri_spawn_test: Skip # Timeout
+dart/kernel_determinism_test: SkipSlow
 
 [ $compiler != dartk && $compiler != dartkb && $compiler != none ]
 dart/appjit*: SkipByDesign # Test needs to run from source
+dart/kernel_determinism_test: SkipByDesign # Test needs to run from source
 
 [ $compiler == dartkp && ($runtime == dart_precompiled || $runtime == vm) ]
 dart/data_uri_import_test/utf16: MissingRuntimeError # UTF-16 data URIs work in dartk
@@ -359,3 +321,9 @@
 [ $builder_tag == obfuscated && $compiler == dartkp ]
 dart/optimized_stacktrace_line_and_column_test: SkipByDesign # Looks for filenames in stacktrace output
 dart/optimized_stacktrace_line_test: SkipByDesign # Looks for filenames in stacktrace output
+
+[ $compiler != dartkp || $arch == arm || $arch == arm64 ]
+dart/v8_snapshot_profile_writer_test: SkipByDesign # Only relevant for AOT. Doesn't work in cross-compilation (has to run on the host).
+
+[ $compiler == dartkp ]
+dart/v8_snapshot_profile_writer_test: Pass, Slow # Can be slow due to re-invoking the precompiler.
diff --git a/runtime/tools/create_archive.py b/runtime/tools/create_archive.py
index ebad9c9..fafbcfe 100755
--- a/runtime/tools/create_archive.py
+++ b/runtime/tools/create_archive.py
@@ -76,13 +76,14 @@
                 name,
                 tar_archive,
                 ):
-  cc_text = '''
+  with open(output_file, 'w') as out:
+    out.write('''
 // Copyright (c) %d, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-''' % date.today().year
-  cc_text += '''
+''' % date.today().year)
+    out.write('''
 
 #if defined(_WIN32)
 typedef unsigned __int8 uint8_t;
@@ -92,31 +93,31 @@
 #endif
 #include <stddef.h>
 
-'''
-  cc_text += 'namespace %s {\n' % outer_namespace
-  if inner_namespace != None:
-    cc_text += 'namespace %s {\n' % inner_namespace
-  cc_text += '\n\n'
-  # Write the archive.
-  cc_text += 'static const uint8_t %s_[] = {\n   ' % name
-  lineCounter = 0
-  for byte in tar_archive:
-    cc_text += r" %d," % ord(byte)
-    lineCounter += 1
-    if lineCounter == 10:
-      cc_text += '\n   '
-      lineCounter = 0
-  if lineCounter != 0:
-    cc_text += '\n   '
-  cc_text += '\n};\n'
-  cc_text += '\nunsigned int %s_len = %d;\n' % (name, len(tar_archive))
-  cc_text += '\nconst uint8_t* %s = %s_;\n\n' % (name, name)
-  if inner_namespace != None:
-    cc_text += '}  // namespace %s\n' % inner_namespace
-  cc_text += '} // namespace %s\n' % outer_namespace
-
-  open(output_file, 'w').write(cc_text)
-
+''')
+    out.write('namespace %s {\n' % outer_namespace)
+    if inner_namespace != None:
+      out.write('namespace %s {\n' % inner_namespace)
+    out.write('\n\n')
+    # Write the byte contents of the archive as a comma separated list of
+    # integers, one integer for each byte.
+    out.write('static const uint8_t %s_[] = {\n' % name)
+    line = '   '
+    lineCounter = 0
+    for byte in tar_archive:
+      line += r" %d," % ord(byte)
+      lineCounter += 1
+      if lineCounter == 10:
+        out.write(line + '\n')
+        line = '   '
+        lineCounter = 0
+    if lineCounter != 0:
+      out.write(line + '\n')
+    out.write('};\n')
+    out.write('\nunsigned int %s_len = %d;\n' % (name, len(tar_archive)))
+    out.write('\nconst uint8_t* %s = %s_;\n\n' % (name, name))
+    if inner_namespace != None:
+      out.write('}  // namespace %s\n' % inner_namespace)
+    out.write('} // namespace %s\n' % outer_namespace)
 
 def MakeCCFile(options):
   if not options.output:
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index 599d17c..88da22e 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -54,11 +54,6 @@
   result.add_option("--packages",
       action="store", type="string",
       help="package config file used to reasolve package: imports.")
-  result.add_option("--url_mapping",
-      default=[],
-      action="append",
-      help=("mapping from url to file name, used when generating snapshots " +
-            "E.g.: --url_mapping=fileUri,/path/to/file.dart"))
   result.add_option("-v", "--verbose",
       help='Verbose output.',
       default=False, action="store_true")
@@ -143,11 +138,6 @@
     script_args.append(''.join([ "--isolate_snapshot_instructions=",
                                  options.isolate_instructions_output_bin ]))
 
-  # Next setup all url mapping options specified.
-  for url_arg in options.url_mapping:
-    url_mapping_argument = ''.join(["--url_mapping=", url_arg ])
-    script_args.append(url_mapping_argument)
-
   # Finally append the script name if one is specified.
   if options.script:
     script_args.append(options.script)
diff --git a/runtime/tools/create_snapshot_file.py b/runtime/tools/create_snapshot_file.py
index d31cc06..19ea870 100755
--- a/runtime/tools/create_snapshot_file.py
+++ b/runtime/tools/create_snapshot_file.py
@@ -4,7 +4,8 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-# Script to create snapshot files.
+# Script to convert snapshot files to a C++ file which can be compiled and
+# linked together with VM binary.
 
 import getopt
 import optparse
@@ -54,28 +55,46 @@
   return True
 
 
-def makeString(input_file):
-  result = ' '
-  fileHandle = open(input_file, 'rb')
-  lineCounter = 0
-  for byte in fileHandle.read():
-    result += ' %d,' % ord(byte)
-    lineCounter += 1
-    if lineCounter == 10:
-      result += '\n   '
-      lineCounter = 0
-  if lineCounter != 0:
-    result += '\n   '
-  return result
+def WriteBytesAsText(out, input_file):
+  """Writes byte contents of the input_file into out file as text.
+
+  Output is formatted as a list of comma separated integer values - one value
+  for each byte.
+  """
+  with open(input_file, 'rb') as input:
+    lineCounter = 0
+    line = ' '
+    for byte in input.read():
+      line += ' %d,' % ord(byte)
+      lineCounter += 1
+      if lineCounter == 10:
+        out.write(line + '\n')
+        line = ' '
+        lineCounter = 0
+    if lineCounter != 0:
+      out.write(line + '\n')
 
 
-def makeFile(output_file, input_cc_file,
+def GenerateFileFromTemplate(output_file, input_cc_file,
              vm_isolate_input_file, isolate_input_file):
+  """Generates C++ file based on a input_cc_file template and two binary files
+
+  Template is expected to have two %s placehoders which would be filled
+  with binary contents of the given files each formatted as a comma separated
+  list of integers.
+  """
   snapshot_cc_text = open(input_cc_file).read()
-  snapshot_cc_text = snapshot_cc_text % (makeString(vm_isolate_input_file),
-                                         makeString(isolate_input_file))
-  open(output_file, 'w').write(snapshot_cc_text)
-  return True
+  chunks = snapshot_cc_text.split("%s")
+  if len(chunks) != 3:
+    raise Exception("Template %s should contain exactly two %%s occurrences"
+        % input_cc_file)
+
+  with open(output_file, 'w') as out:
+    out.write(chunks[0])
+    WriteBytesAsText(out, vm_isolate_input_file)
+    out.write(chunks[1])
+    WriteBytesAsText(out, isolate_input_file)
+    out.write(chunks[2])
 
 
 def Main():
@@ -91,10 +110,8 @@
     parser.print_help()
     return 1
 
-  if not makeFile(options.output, options.input_cc,
-                  options.vm_input_bin, options.input_bin):
-    print "Unable to generate snapshot in C buffer form"
-    return -1
+  GenerateFileFromTemplate(options.output, options.input_cc,
+                           options.vm_input_bin, options.input_bin)
 
   return 0
 
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index ca5d676..ba3dfcc 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -34,6 +34,7 @@
     run_dartfuzz_test.py  [--help]
                           [--isolates ISOLATES ]
                           [--repeat REPEAT]
+                          [--time TIME]
                           [--true_divergence]
                           [--mode1 MODE]
                           [--mode2 MODE]
@@ -43,23 +44,25 @@
     --help            : prints help and exits
     --isolates        : number of isolates in the session (1 by default)
     --repeat          : number of tests to run (1000 by default)
+    --time            : time limit in seconds (none by default)
     --show-stats      : show statistics during session (true by default)
     --true-divergence : only report true divergences (true by default)
     --dart-top        : sets DART_TOP explicitly through command line
     --mode1           : m1
     --mode2           : m2, and values one of
-        jit-[debug-]ia32    = Dart JIT (ia32)
-        jit-[debug-]x64     = Dart JIT (x64)
-        jit-[debug-]arm32   = Dart JIT (simarm)
-        jit-[debug-]arm64   = Dart JIT (simarm64)
-        jit-[debug-]dbc     = Dart JIT (simdbc)
-        jit-[debug-]dbc64   = Dart JIT (simdbc64)
-        aot-[debug-]x64     = Dart AOT (x64)
-        aot-[debug-]arm64   = Dart AOT (simarm64)
-        kbc-int-[debug-]x64 = Dart KBC (interpreted bytecode)
-        kbc-mix-[debug-]x64 = Dart KBC (mixed-mode bytecode)
-        kbc-cmp-[debug-]x64 = Dart KBC (compiled bytecode)
-        js                  = dart2js + JS
+        jit-[stress-][debug-]ia32  = Dart JIT (ia32)
+        jit-[stress-][debug-]x64   = Dart JIT (x64)
+        jit-[stress-][debug-]arm32 = Dart JIT (simarm)
+        jit-[stress-][debug-]arm64 = Dart JIT (simarm64)
+        jit-[stress-][debug-]dbc   = Dart JIT (simdbc)
+        jit-[stress-][debug-]dbc64 = Dart JIT (simdbc64)
+        aot-[debug-]x64            = Dart AOT (x64)
+        aot-[debug-]arm32          = Dart AOT (simarm)
+        aot-[debug-]arm64          = Dart AOT (simarm64)
+        kbc-int-[debug-]x64        = Dart KBC (interpreted bytecode)
+        kbc-mix-[debug-]x64        = Dart KBC (mixed-mode bytecode)
+        kbc-cmp-[debug-]x64        = Dart KBC (compiled bytecode)
+        js-x64                     = dart2js + Node.JS
 
 If no modes are given, a random JIT and/or AOT combination is used.
 
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index d2986d7..0ad5858 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -7,6 +7,8 @@
 
 import 'package:args/args.dart';
 
+import 'dartfuzz_values.dart';
+
 // Version of DartFuzz. Increase this each time changes are made
 // to preserve the property that a given version of DartFuzz yields
 // the same fuzzed program for a deterministic random seed.
@@ -16,82 +18,6 @@
 const int stmtDepth = 5;
 const int exprDepth = 2;
 
-// Interesting integer values.
-const List<int> interestingIntegers = [
-  0x0000000000000000,
-  0x0000000000000001,
-  0x000000007fffffff,
-  0x0000000080000000,
-  0x0000000080000001,
-  0x00000000ffffffff,
-  0x0000000100000000,
-  0x0000000100000001,
-  0x000000017fffffff,
-  0x0000000180000000,
-  0x0000000180000001,
-  0x00000001ffffffff,
-  0x7fffffff00000000,
-  0x7fffffff00000001,
-  0x7fffffff7fffffff,
-  0x7fffffff80000000,
-  0x7fffffff80000001,
-  0x7fffffffffffffff,
-  0x8000000000000000,
-  0x8000000000000001,
-  0x800000007fffffff,
-  0x8000000080000000,
-  0x8000000080000001,
-  0x80000000ffffffff,
-  0x8000000100000000,
-  0x8000000100000001,
-  0x800000017fffffff,
-  0x8000000180000000,
-  0x8000000180000001,
-  0x80000001ffffffff,
-  0xffffffff00000000,
-  0xffffffff00000001,
-  0xffffffff7fffffff,
-  0xffffffff80000000,
-  0xffffffff80000001,
-  0xffffffffffffffff
-];
-
-// Interesting characters.
-const interestingChars =
-    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#&()+- ';
-
-// Class that represents Dart types.
-class DartType {
-  final String name;
-
-  const DartType._withName(this.name);
-
-  static const VOID = const DartType._withName('void');
-  static const BOOL = const DartType._withName('bool');
-  static const INT = const DartType._withName('int');
-  static const DOUBLE = const DartType._withName('double');
-  static const STRING = const DartType._withName('String');
-  static const INT_LIST = const DartType._withName('List<int>');
-  static const INT_STRING_MAP = const DartType._withName('Map<int, String>');
-}
-
-// All value types.
-const allTypes = [
-  DartType.BOOL,
-  DartType.INT,
-  DartType.DOUBLE,
-  DartType.STRING,
-  DartType.INT_LIST,
-  DartType.INT_STRING_MAP
-];
-
-// Class that represents Dart library methods.
-class DartLib {
-  final String name;
-  final List<DartType> proto;
-  const DartLib(this.name, this.proto);
-}
-
 // Naming conventions.
 const varName = 'var';
 const paramName = 'par';
@@ -112,7 +38,7 @@
     // Setup the types.
     localVars = new List<DartType>();
     globalVars = fillTypes1();
-    globalVars.addAll(allTypes); // always one each
+    globalVars.addAll(DartType.allTypes); // always one each
     globalMethods = fillTypes2();
     classFields = fillTypes2();
     classMethods = fillTypes3(classFields.length);
@@ -387,7 +313,7 @@
       // favors small positive int
       case 0:
         emit(
-            '${interestingIntegers[rand.nextInt(interestingIntegers.length)]}');
+            '${DartFuzzValues.interestingIntegers[rand.nextInt(DartFuzzValues.interestingIntegers.length)]}');
         break;
       case 1:
         emitSmallNegativeInt();
@@ -432,7 +358,8 @@
         emit('\\u{1f600}'); // rune
         break;
       default:
-        emit(interestingChars[rand.nextInt(interestingChars.length)]);
+        emit(DartFuzzValues.interestingChars[
+            rand.nextInt(DartFuzzValues.interestingChars.length)]);
         break;
     }
   }
@@ -607,7 +534,7 @@
       emitTerminal(tp); // resort to terminal
       return;
     }
-    DartLib lib = oneOf(getLibrary(tp));
+    DartLib lib = getLibraryMethod(tp);
     List<DartType> proto = lib.proto;
     // Receiver.
     if (proto[0] != null) {
@@ -786,93 +713,18 @@
   // Library methods.
   //
 
-  // Get list of library methods, organized by return type.
-  // Proto list:
-  //   [ receiver-type (null denotes none),
-  //     param1 type (null denotes getter),
-  //     param2 type,
-  //     ...
-  //   ]
-  List<DartLib> getLibrary(DartType tp) {
+  // Get a library method that returns given type.
+  DartLib getLibraryMethod(DartType tp) {
     if (tp == DartType.BOOL) {
-      return const [
-        DartLib('isEven', [DartType.INT, null]),
-        DartLib('isOdd', [DartType.INT, null]),
-        DartLib('isEmpty', [DartType.STRING, null]),
-        DartLib('isEmpty', [DartType.INT_STRING_MAP, null]),
-        DartLib('isNotEmpty', [DartType.STRING, null]),
-        DartLib('isNotEmpty', [DartType.INT_STRING_MAP, null]),
-        DartLib('endsWith', [DartType.STRING, DartType.STRING]),
-        DartLib('remove', [DartType.INT_LIST, DartType.INT]),
-        DartLib('containsValue', [DartType.INT_STRING_MAP, DartType.STRING]),
-        DartLib('containsKey', [DartType.INT_STRING_MAP, DartType.INT]),
-      ];
+      return oneOf(DartLib.boolLibs);
     } else if (tp == DartType.INT) {
-      return const [
-        DartLib('bitLength', [DartType.INT, null]),
-        DartLib('sign', [DartType.INT, null]),
-        DartLib('abs', [DartType.INT]),
-        DartLib('round', [DartType.INT]),
-        DartLib('round', [DartType.DOUBLE]),
-        DartLib('floor', [DartType.INT]),
-        DartLib('floor', [DartType.DOUBLE]),
-        DartLib('ceil', [DartType.INT]),
-        DartLib('ceil', [DartType.DOUBLE]),
-        DartLib('truncate', [DartType.INT]),
-        DartLib('truncate', [DartType.DOUBLE]),
-        DartLib('toInt', [DartType.DOUBLE]),
-        DartLib('toUnsigned', [DartType.INT, DartType.INT]),
-        DartLib('toSigned', [DartType.INT, DartType.INT]),
-        DartLib('modInverse', [DartType.INT, DartType.INT]),
-        DartLib('modPow', [DartType.INT, DartType.INT, DartType.INT]),
-        DartLib('length', [DartType.STRING, null]),
-        DartLib('length', [DartType.INT_LIST, null]),
-        DartLib('length', [DartType.INT_STRING_MAP, null]),
-        DartLib('codeUnitAt', [DartType.STRING, DartType.INT]),
-        DartLib('compareTo', [DartType.STRING, DartType.STRING]),
-        DartLib('removeLast', [DartType.INT_LIST]),
-        DartLib('removeAt', [DartType.INT_LIST, DartType.INT]),
-        DartLib('indexOf', [DartType.INT_LIST, DartType.INT]),
-        DartLib('lastIndexOf', [DartType.INT_LIST, DartType.INT]),
-      ];
+      return oneOf(DartLib.intLibs);
     } else if (tp == DartType.DOUBLE) {
-      return const [
-        DartLib('sign', [DartType.DOUBLE, null]),
-        DartLib('abs', [DartType.DOUBLE]),
-        DartLib('toDouble', [DartType.INT]),
-        DartLib('roundToDouble', [DartType.INT]),
-        DartLib('roundToDouble', [DartType.DOUBLE]),
-        DartLib('floorToDouble', [DartType.INT]),
-        DartLib('floorToDouble', [DartType.DOUBLE]),
-        DartLib('ceilToDouble', [DartType.INT]),
-        DartLib('ceilToDouble', [DartType.DOUBLE]),
-        DartLib('truncateToDouble', [DartType.INT]),
-        DartLib('truncateToDouble', [DartType.DOUBLE]),
-        DartLib('remainder', [DartType.DOUBLE, DartType.DOUBLE]),
-      ];
+      return oneOf(DartLib.doubleLibs);
     } else if (tp == DartType.STRING) {
-      return const [
-        DartLib('toString', [DartType.BOOL]),
-        DartLib('toString', [DartType.INT]),
-        DartLib('toString', [DartType.DOUBLE]),
-        DartLib('toRadixString', [DartType.INT, DartType.INT]),
-        DartLib('trim', [DartType.STRING]),
-        DartLib('trimLeft', [DartType.STRING]),
-        DartLib('trimRight', [DartType.STRING]),
-        DartLib('toLowerCase', [DartType.STRING]),
-        DartLib('toUpperCase', [DartType.STRING]),
-        DartLib('substring', [DartType.STRING, DartType.INT]),
-        DartLib('replaceRange',
-            [DartType.STRING, DartType.INT, DartType.INT, DartType.STRING]),
-        DartLib('remove', [DartType.INT_STRING_MAP, DartType.INT]),
-        // Avoid (OOM divergences, unless we restrict parameters):
-        // DartLib('padLeft', [DartType.STRING, DartType.INT]),
-        // DartLib('padRight', [DartType.STRING, DartType.INT]),
-      ];
+      return oneOf(DartLib.stringLibs);
     } else if (tp == DartType.INT_LIST) {
-      return const [
-        DartLib('sublist', [DartType.INT_LIST, DartType.INT])
-      ];
+      return oneOf(DartLib.intListLibs);
     } else {
       assert(false);
     }
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index 417c937..06545ca 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -13,7 +13,7 @@
 
 const debug = false;
 const sigkill = 9;
-const timeout = 30; // in seconds
+const timeout = 60; // in seconds
 
 // Exit code of running a test.
 enum ResultCode { success, timeout, error }
@@ -38,7 +38,7 @@
   if (res.exitCode == -sigkill) {
     return new TestResult(ResultCode.timeout, res.stdout);
   } else if (res.exitCode != 0) {
-    return new TestResult(ResultCode.error, res.stdout);
+    return new TestResult(ResultCode.error, res.stderr);
   }
   return new TestResult(ResultCode.success, res.stdout);
 }
@@ -49,15 +49,40 @@
   String description;
 
   // Factory.
-  static TestRunner getTestRunner(
-      String mode, String top, String tmp, Map<String, String> env) {
+  static TestRunner getTestRunner(String mode, String top, String tmp,
+      Map<String, String> env, Random rand) {
+    String tag = getTag(mode);
+    if (mode.startsWith('jit-stress'))
+      switch (rand.nextInt(6)) {
+        case 0:
+          return new TestRunnerJIT('JIT-NOFIELDGUARDS', tag, top, tmp, env,
+              ['--use_field_guards=false']);
+        case 1:
+          return new TestRunnerJIT(
+              'JIT-NOINTRINSIFY', tag, top, tmp, env, ['--intrinsify=false']);
+        case 2:
+          return new TestRunnerJIT('JIT-COMPACTEVERY', tag, top, tmp, env,
+              ['--gc_every=1000', '--use_compactor=true']);
+        case 3:
+          return new TestRunnerJIT('JIT-MARKSWEEPEVERY', tag, top, tmp, env,
+              ['--gc_every=1000', '--use_compactor=false']);
+        case 4:
+          return new TestRunnerJIT('JIT-DEPOPTEVERY', tag, top, tmp, env,
+              ['--deoptimize_every=100']);
+        case 5:
+          return new TestRunnerJIT('JIT-STACKTRACEEVERY', tag, top, tmp, env,
+              ['--stacktrace_every=100']);
+        case 6:
+          // Crashes (https://github.com/dart-lang/sdk/issues/35196):
+          return new TestRunnerJIT('JIT-OPTCOUNTER', tag, top, tmp, env,
+              ['--optimization_counter_threshold=1']);
+      }
     if (mode.startsWith('jit'))
-      return new TestRunnerJIT(getTag(mode), top, tmp, env);
-    if (mode.startsWith('aot'))
-      return new TestRunnerAOT(getTag(mode), top, tmp, env);
+      return new TestRunnerJIT('JIT', tag, top, tmp, env, []);
+    if (mode.startsWith('aot')) return new TestRunnerAOT(tag, top, tmp, env);
     if (mode.startsWith('kbc'))
-      return new TestRunnerKBC(mode, getTag(mode), top, tmp, env);
-    if (mode.startsWith('js')) return new TestRunnerJS(top, tmp, env);
+      return new TestRunnerKBC(mode, tag, top, tmp, env);
+    if (mode.startsWith('js')) return new TestRunnerJS(tag, top, tmp, env);
     throw ('unknown runner in mode: $mode');
   }
 
@@ -81,21 +106,24 @@
 
 /// Concrete test runner of Dart JIT.
 class TestRunnerJIT implements TestRunner {
-  TestRunnerJIT(String tag, String top, String tmp, Map<String, String> e) {
-    description = 'JIT-${tag}';
+  TestRunnerJIT(String prefix, String tag, String top, String tmp,
+      Map<String, String> e, List<String> extra_flags) {
+    description = '$prefix-$tag';
     dart = '$top/out/$tag/dart';
     fileName = '$tmp/fuzz.dart';
     env = e;
+    cmd = [dart, "--deterministic"] + extra_flags + [fileName];
   }
 
   TestResult run() {
-    return runCommand([dart, fileName], env);
+    return runCommand(cmd, env);
   }
 
   String description;
   String dart;
   String fileName;
   Map<String, String> env;
+  List<String> cmd;
 }
 
 /// Concrete test runner of Dart AOT.
@@ -167,15 +195,15 @@
   String dill;
   String dart;
   String fileName;
-  List<String> cmd;
   Map<String, String> env;
+  List<String> cmd;
 }
 
 /// Concrete test runner of Dart2JS.
 class TestRunnerJS implements TestRunner {
-  TestRunnerJS(String top, String tmp, Map<String, String> e) {
-    description = 'Dart2JS';
-    dart2js = '$top/out/ReleaseX64/dart-sdk/bin/dart2js';
+  TestRunnerJS(String tag, String top, String tmp, Map<String, String> e) {
+    description = 'Dart2JS-$tag';
+    dart2js = '$top/sdk/bin/dart2js';
     fileName = '$tmp/fuzz.dart';
     js = '$tmp/out.js';
     env = e;
@@ -198,8 +226,8 @@
 
 /// Class to run fuzz testing.
 class DartFuzzTest {
-  DartFuzzTest(this.env, this.repeat, this.trueDivergence, this.showStats,
-      this.top, this.mode1, this.mode2);
+  DartFuzzTest(this.env, this.repeat, this.time, this.trueDivergence,
+      this.showStats, this.top, this.mode1, this.mode2);
 
   int run() {
     setup();
@@ -216,8 +244,10 @@
       runTest();
       if (showStats) {
         showStatistics();
-      } else if ((i & 31) == 31) {
-        print('\n${isolate}: busy @${numTests}....');
+      }
+      // Timeout?
+      if (timeIsUp()) {
+        break;
       }
     }
 
@@ -233,11 +263,16 @@
     rand = new Random();
     tmpDir = Directory.systemTemp.createTempSync('dart_fuzz');
     fileName = '${tmpDir.path}/fuzz.dart';
-    runner1 = TestRunner.getTestRunner(mode1, top, tmpDir.path, env);
-    runner2 = TestRunner.getTestRunner(mode2, top, tmpDir.path, env);
+    runner1 = TestRunner.getTestRunner(mode1, top, tmpDir.path, env, rand);
+    runner2 = TestRunner.getTestRunner(mode2, top, tmpDir.path, env, rand);
     isolate = 'Isolate (${tmpDir.path}) '
         '${runner1.description} - ${runner2.description}';
 
+    start_time = new DateTime.now().millisecondsSinceEpoch;
+    current_time = start_time;
+    report_time = start_time;
+    end_time = start_time + max(0, time - timeout) * 1000;
+
     numTests = 0;
     numSuccess = 0;
     numNotRun = 0;
@@ -245,6 +280,22 @@
     numDivergences = 0;
   }
 
+  bool timeIsUp() {
+    if (time > 0) {
+      current_time = new DateTime.now().millisecondsSinceEpoch;
+      if (current_time > end_time) {
+        return true;
+      }
+      // Report every 10 minutes.
+      if ((current_time - report_time) > (10 * 60 * 1000)) {
+        print(
+            '\n${isolate}: busy @${numTests} ${current_time - start_time} seconds....');
+        report_time = current_time;
+      }
+    }
+    return false;
+  }
+
   void cleanup() {
     tmpDir.delete(recursive: true);
   }
@@ -307,14 +358,27 @@
     numDivergences++;
     print(
         '\n${isolate}: !DIVERGENCE! $version:$seed (output=${outputDivergence})');
-    if (showStats && outputDivergence) {
-      print('out1:\n${result1.output}\nout2:\n${result2.output}\n');
+    if (outputDivergence) {
+      // Only report the actual output divergence details when requested,
+      // since this output may be lengthy and should be reproducable anyway.
+      if (showStats) {
+        print('\nout1:\n${result1.output}\nout2:\n${result2.output}\n');
+      }
+    } else {
+      // For any other divergence, always report what went wrong.
+      if (result1.code != ResultCode.success) {
+        print('\nfail1:\n${result1.output}\n');
+      }
+      if (result2.code != ResultCode.success) {
+        print('\nfail2:\n${result2.output}\n');
+      }
     }
   }
 
   // Context.
   final Map<String, String> env;
   final int repeat;
+  final int time;
   final bool trueDivergence;
   final bool showStats;
   final String top;
@@ -330,6 +394,12 @@
   String isolate;
   int seed;
 
+  // Timing
+  int start_time;
+  int current_time;
+  int report_time;
+  int end_time;
+
   // Stats.
   int numTests;
   int numSuccess;
@@ -340,8 +410,8 @@
 
 /// Class to start fuzz testing session.
 class DartFuzzTestSession {
-  DartFuzzTestSession(this.isolates, this.repeat, this.trueDivergence,
-      this.showStats, String tp, this.mode1, this.mode2)
+  DartFuzzTestSession(this.isolates, this.repeat, this.time,
+      this.trueDivergence, this.showStats, String tp, this.mode1, this.mode2)
       : top = getTop(tp) {}
 
   start() async {
@@ -349,6 +419,11 @@
     print('Fuzz Version    : ${version}');
     print('Isolates        : ${isolates}');
     print('Tests           : ${repeat}');
+    if (time > 0) {
+      print('Time            : ${time} seconds');
+    } else {
+      print('Time            : unlimited');
+    }
     print('True Divergence : ${trueDivergence}');
     print('Show Stats      : ${showStats}');
     print('Dart Dev        : ${top}');
@@ -379,8 +454,15 @@
     try {
       final m1 = getMode(session.mode1, null);
       final m2 = getMode(session.mode2, m1);
-      final fuzz = new DartFuzzTest(Platform.environment, session.repeat,
-          session.trueDivergence, session.showStats, session.top, m1, m2);
+      final fuzz = new DartFuzzTest(
+          Platform.environment,
+          session.repeat,
+          session.time,
+          session.trueDivergence,
+          session.showStats,
+          session.top,
+          m1,
+          m2);
       divergences = fuzz.run();
     } catch (e) {
       print('Isolate: $e');
@@ -404,10 +486,9 @@
     // Random when not set.
     if (mode == null || mode == '') {
       // Pick a mode at random (cluster), different from other.
-      const cluster_modes = 20;
       Random rand = new Random();
       do {
-        mode = modes[rand.nextInt(cluster_modes)];
+        mode = clusterModes[rand.nextInt(clusterModes.length)];
       } while (mode == other);
     }
     // Verify mode.
@@ -420,6 +501,7 @@
   // Context.
   final int isolates;
   final int repeat;
+  final int time;
   final bool trueDivergence;
   final bool showStats;
   final String top;
@@ -429,9 +511,8 @@
   // Passes each port to isolate.
   SendPort port;
 
-  // Supported modes.
-  static const List<String> modes = [
-    // Cluster options:
+  // Modes used on cluster runs.
+  static const List<String> clusterModes = [
     'jit-debug-ia32',
     'jit-debug-x64',
     'jit-debug-arm32',
@@ -444,6 +525,18 @@
     'jit-arm64',
     'jit-dbc',
     'jit-dbc64',
+    'jit-stress-debug-ia32',
+    'jit-stress-debug-x64',
+    'jit-stress-debug-arm32',
+    'jit-stress-debug-arm64',
+    'jit-stress-debug-dbc',
+    'jit-stress-debug-dbc64',
+    'jit-stress-ia32',
+    'jit-stress-x64',
+    'jit-stress-arm32',
+    'jit-stress-arm64',
+    'jit-stress-dbc',
+    'jit-stress-dbc64',
     'aot-debug-x64',
     'aot-x64',
     'kbc-int-debug-x64',
@@ -452,12 +545,21 @@
     'kbc-int-x64',
     'kbc-cmp-x64',
     'kbc-mix-x64',
-    // Times out often:
-    'aot-arm64',
-    'aot-debug-arm64',
-    // Too many divergences (due to arithmetic):
-    'js'
   ];
+
+  // Modes not used on cluster runs because they have outstanding issues.
+  static const List<String> nonClusterModes = [
+    // Times out often:
+    'aot-debug-arm32',
+    'aot-debug-arm64',
+    'aot-arm32',
+    'aot-arm64',
+    // Too many divergences (due to arithmetic):
+    'js-x64',
+  ];
+
+  // All modes.
+  static List<String> modes = clusterModes + nonClusterModes;
 }
 
 /// Main driver for a fuzz testing session.
@@ -466,6 +568,7 @@
   final parser = new ArgParser()
     ..addOption('isolates', help: 'number of isolates to use', defaultsTo: '1')
     ..addOption('repeat', help: 'number of tests to run', defaultsTo: '1000')
+    ..addOption('time', help: 'time limit in seconds', defaultsTo: '0')
     ..addFlag('true-divergence',
         negatable: true, help: 'only report true divergences', defaultsTo: true)
     ..addFlag('show-stats',
@@ -476,7 +579,9 @@
     // Undocumented options for cluster runs.
     ..addOption('shards',
         help: 'number of shards used in cluster run', defaultsTo: '1')
-    ..addOption('shard', help: 'shard id in cluster run', defaultsTo: '1');
+    ..addOption('shard', help: 'shard id in cluster run', defaultsTo: '1')
+    ..addOption('output_directory',
+        help: 'path to output (ignored)', defaultsTo: null);
 
   // Starts fuzz testing session.
   try {
@@ -489,6 +594,7 @@
     new DartFuzzTestSession(
             int.parse(results['isolates']),
             int.parse(results['repeat']),
+            int.parse(results['time']),
             results['true-divergence'],
             results['show-stats'],
             results['dart-top'],
diff --git a/runtime/tools/dartfuzz/dartfuzz_values.dart b/runtime/tools/dartfuzz/dartfuzz_values.dart
new file mode 100644
index 0000000..e19e301
--- /dev/null
+++ b/runtime/tools/dartfuzz/dartfuzz_values.dart
@@ -0,0 +1,167 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Class that represents some common Dart types.
+///
+/// TODO(ajcbik): generalize
+///
+class DartType {
+  final String name;
+
+  const DartType._withName(this.name);
+
+  static const VOID = const DartType._withName('void');
+  static const BOOL = const DartType._withName('bool');
+  static const INT = const DartType._withName('int');
+  static const DOUBLE = const DartType._withName('double');
+  static const STRING = const DartType._withName('String');
+  static const INT_LIST = const DartType._withName('List<int>');
+  static const INT_STRING_MAP = const DartType._withName('Map<int, String>');
+
+  // All value types.
+  static const allTypes = [BOOL, INT, DOUBLE, STRING, INT_LIST, INT_STRING_MAP];
+}
+
+/// Class with interesting values for fuzzing.
+class DartFuzzValues {
+  // Interesting characters.
+  static const interestingChars =
+      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#&()+- ';
+
+  // Interesting integer values.
+  static const List<int> interestingIntegers = [
+    0x0000000000000000,
+    0x0000000000000001,
+    0x000000007fffffff,
+    0x0000000080000000,
+    0x0000000080000001,
+    0x00000000ffffffff,
+    0x0000000100000000,
+    0x0000000100000001,
+    0x000000017fffffff,
+    0x0000000180000000,
+    0x0000000180000001,
+    0x00000001ffffffff,
+    0x7fffffff00000000,
+    0x7fffffff00000001,
+    0x7fffffff7fffffff,
+    0x7fffffff80000000,
+    0x7fffffff80000001,
+    0x7fffffffffffffff,
+    0x8000000000000000,
+    0x8000000000000001,
+    0x800000007fffffff,
+    0x8000000080000000,
+    0x8000000080000001,
+    0x80000000ffffffff,
+    0x8000000100000000,
+    0x8000000100000001,
+    0x800000017fffffff,
+    0x8000000180000000,
+    0x8000000180000001,
+    0x80000001ffffffff,
+    0xffffffff00000000,
+    0xffffffff00000001,
+    0xffffffff7fffffff,
+    0xffffffff80000000,
+    0xffffffff80000001,
+    0xffffffffffffffff
+  ];
+}
+
+/// Class that represents Dart library methods.
+/// The invididual lists are organized by return type.
+/// Proto list:
+///   [ receiver-type (null denotes none),
+///     param1 type (null denotes getter),
+///     param2 type,
+///     ...
+///   ]
+///
+/// TODO(ajcbik): generate these lists automatically
+///
+class DartLib {
+  final String name;
+  final List<DartType> proto;
+  const DartLib(this.name, this.proto);
+
+  static const boolLibs = [
+    DartLib('isEven', [DartType.INT, null]),
+    DartLib('isOdd', [DartType.INT, null]),
+    DartLib('isEmpty', [DartType.STRING, null]),
+    DartLib('isEmpty', [DartType.INT_STRING_MAP, null]),
+    DartLib('isNotEmpty', [DartType.STRING, null]),
+    DartLib('isNotEmpty', [DartType.INT_STRING_MAP, null]),
+    DartLib('endsWith', [DartType.STRING, DartType.STRING]),
+    DartLib('remove', [DartType.INT_LIST, DartType.INT]),
+    DartLib('containsValue', [DartType.INT_STRING_MAP, DartType.STRING]),
+    DartLib('containsKey', [DartType.INT_STRING_MAP, DartType.INT]),
+  ];
+
+  static const intLibs = [
+    DartLib('bitLength', [DartType.INT, null]),
+    DartLib('sign', [DartType.INT, null]),
+    DartLib('abs', [DartType.INT]),
+    DartLib('round', [DartType.INT]),
+    DartLib('round', [DartType.DOUBLE]),
+    DartLib('floor', [DartType.INT]),
+    DartLib('floor', [DartType.DOUBLE]),
+    DartLib('ceil', [DartType.INT]),
+    DartLib('ceil', [DartType.DOUBLE]),
+    DartLib('truncate', [DartType.INT]),
+    DartLib('truncate', [DartType.DOUBLE]),
+    DartLib('toInt', [DartType.DOUBLE]),
+    DartLib('toUnsigned', [DartType.INT, DartType.INT]),
+    DartLib('toSigned', [DartType.INT, DartType.INT]),
+    DartLib('modInverse', [DartType.INT, DartType.INT]),
+    DartLib('modPow', [DartType.INT, DartType.INT, DartType.INT]),
+    DartLib('length', [DartType.STRING, null]),
+    DartLib('length', [DartType.INT_LIST, null]),
+    DartLib('length', [DartType.INT_STRING_MAP, null]),
+    DartLib('codeUnitAt', [DartType.STRING, DartType.INT]),
+    DartLib('compareTo', [DartType.STRING, DartType.STRING]),
+    DartLib('removeLast', [DartType.INT_LIST]),
+    DartLib('removeAt', [DartType.INT_LIST, DartType.INT]),
+    DartLib('indexOf', [DartType.INT_LIST, DartType.INT]),
+    DartLib('lastIndexOf', [DartType.INT_LIST, DartType.INT]),
+  ];
+
+  static const doubleLibs = [
+    DartLib('sign', [DartType.DOUBLE, null]),
+    DartLib('abs', [DartType.DOUBLE]),
+    DartLib('toDouble', [DartType.INT]),
+    DartLib('roundToDouble', [DartType.INT]),
+    DartLib('roundToDouble', [DartType.DOUBLE]),
+    DartLib('floorToDouble', [DartType.INT]),
+    DartLib('floorToDouble', [DartType.DOUBLE]),
+    DartLib('ceilToDouble', [DartType.INT]),
+    DartLib('ceilToDouble', [DartType.DOUBLE]),
+    DartLib('truncateToDouble', [DartType.INT]),
+    DartLib('truncateToDouble', [DartType.DOUBLE]),
+    DartLib('remainder', [DartType.DOUBLE, DartType.DOUBLE]),
+  ];
+
+  static const stringLibs = [
+    DartLib('toString', [DartType.BOOL]),
+    DartLib('toString', [DartType.INT]),
+    DartLib('toString', [DartType.DOUBLE]),
+    DartLib('toRadixString', [DartType.INT, DartType.INT]),
+    DartLib('trim', [DartType.STRING]),
+    DartLib('trimLeft', [DartType.STRING]),
+    DartLib('trimRight', [DartType.STRING]),
+    DartLib('toLowerCase', [DartType.STRING]),
+    DartLib('toUpperCase', [DartType.STRING]),
+    DartLib('substring', [DartType.STRING, DartType.INT]),
+    DartLib('replaceRange',
+        [DartType.STRING, DartType.INT, DartType.INT, DartType.STRING]),
+    DartLib('remove', [DartType.INT_STRING_MAP, DartType.INT]),
+    // Avoid (OOM divergences, TODO(ajcbik): restrict parameters)
+    // DartLib('padLeft', [DartType.STRING, DartType.INT]),
+    // DartLib('padRight', [DartType.STRING, DartType.INT]),
+  ];
+
+  static const intListLibs = [
+    DartLib('sublist', [DartType.INT_LIST, DartType.INT])
+  ];
+}
diff --git a/runtime/tools/layering_check.py b/runtime/tools/layering_check.py
new file mode 100755
index 0000000..50a9b25
--- /dev/null
+++ b/runtime/tools/layering_check.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Simple tool for verifying that sources from one layer do not reference
+# sources from another layer.
+#
+# Currently it only checks that core runtime headers RUNTIME_LAYER_HEADERS
+# are not included into any sources listed in SHOULD_NOT_DEPEND_ON_RUNTIME.
+
+import glob
+import os
+import re
+import sys
+
+INCLUDE_DIRECTIVE_RE = re.compile(r'^#include "(.*)"')
+
+RUNTIME_LAYER_HEADERS = [
+  'runtime/vm/isolate.h',
+  'runtime/vm/object.h',
+  'runtime/vm/raw_object.h',
+  'runtime/vm/thread.h',
+]
+
+SHOULD_NOT_DEPEND_ON_RUNTIME = [
+  'runtime/vm/allocation.h',
+  'runtime/vm/growable_array.h',
+]
+
+class LayeringChecker(object):
+  def __init__(self, root):
+    self.root = root
+    self.worklist = set()
+    # Mapping from header to a set of files it is included into.
+    self.included_into = dict()
+    # Set of files that were parsed to avoid double parsing.
+    self.loaded = set()
+    # Mapping from headers to their layer.
+    self.file_layers = {file: 'runtime' for file in RUNTIME_LAYER_HEADERS}
+
+  def Check(self):
+    self.AddAllSourcesToWorklist(os.path.join(self.root, 'runtime/vm'))
+    self.BuildIncludesGraph()
+    errors = self.PropagateLayers()
+    errors += self.CheckNotInRuntime(SHOULD_NOT_DEPEND_ON_RUNTIME)
+    return errors
+
+  def CheckNotInRuntime(self, files):
+    """Check that given files do not depend on runtime layer."""
+    errors = []
+    for file in files:
+      if not os.path.exists(os.path.join(self.root, file)):
+        errors.append('File %s does not exist.' % (file))
+      if self.file_layers.get(file) is not None:
+        errors.append(
+            'LAYERING ERROR: %s includes object.h or raw_object.h' % (file))
+    return errors
+
+  def BuildIncludesGraph(self):
+    while self.worklist:
+      file = self.worklist.pop()
+      deps = self.ExtractIncludes(file)
+      self.loaded.add(file)
+      for d in deps:
+        if d not in self.included_into:
+          self.included_into[d] = set()
+        self.included_into[d].add(file)
+        if d not in self.loaded:
+          self.worklist.add(d)
+
+  def PropagateLayers(self):
+    """Propagate layering information through include graph.
+
+    If A is in layer L and A is included into B then B is in layer L.
+    """
+    errors = []
+    self.worklist = set(self.file_layers.keys())
+    while self.worklist:
+      file = self.worklist.pop()
+      if file not in self.included_into:
+        continue
+      file_layer = self.file_layers[file]
+      for tgt in self.included_into[file]:
+        if tgt in self.file_layers:
+          if self.file_layers[tgt] != file_layer:
+            errors.add('Layer mismatch: %s (%s) is included into %s (%s)' % (
+                file, file_layer, tgt, self.file_layers[tgt]))
+        self.file_layers[tgt] = file_layer
+        self.worklist.add(tgt)
+    return errors
+
+  def AddAllSourcesToWorklist(self, dir):
+    """Add all *.cc and *.h files from dir recursively into worklist."""
+    for file in os.listdir(dir):
+      path = os.path.join(dir, file)
+      if os.path.isdir(path):
+        self.AddAllSourcesToWorklist(path)
+      elif path.endswith('.cc') or path.endswith('.h'):
+        self.worklist.add(os.path.relpath(path, self.root))
+
+  def ExtractIncludes(self, file):
+    """Extract the list of includes from the given file."""
+    deps = set()
+    with open(os.path.join(self.root, file)) as file:
+      for line in file:
+        if line.startswith('namespace dart {'):
+          break
+
+        m = INCLUDE_DIRECTIVE_RE.match(line)
+        if m is not None:
+          header = os.path.join('runtime', m.group(1))
+          if os.path.isfile(os.path.join(self.root,header)):
+            deps.add(header)
+    return deps
+
+def DoCheck(sdk_root):
+  """Run layering check at the given root folder."""
+  return LayeringChecker(sdk_root).Check()
+
+if __name__ == '__main__':
+  errors = DoCheck('.')
+  print '\n'.join(errors)
+  if errors:
+    sys.exit(-1)
+
diff --git a/runtime/vm/allocation.cc b/runtime/vm/allocation.cc
index b1a7e93..aa36221 100644
--- a/runtime/vm/allocation.cc
+++ b/runtime/vm/allocation.cc
@@ -37,16 +37,11 @@
 #if defined(DEBUG)
   if (thread_ != NULL) {
     ASSERT(Thread::Current() == thread_);
-    BaseIsolate::AssertCurrent(reinterpret_cast<BaseIsolate*>(isolate()));
   }
 #endif
 }
 
-Isolate* StackResource::isolate() const {
-  return thread_ == NULL ? NULL : thread_->isolate();
-}
-
-void StackResource::Init(Thread* thread) {
+void StackResource::Init(ThreadState* thread) {
   // We can only have longjumps and exceptions when there is a current
   // thread and isolate.  If there is no current thread, we don't need to
   // protect this case.
@@ -60,7 +55,7 @@
   }
 }
 
-void StackResource::UnwindAbove(Thread* thread, StackResource* new_top) {
+void StackResource::UnwindAbove(ThreadState* thread, StackResource* new_top) {
   StackResource* current_resource = thread->top_resource();
   while (current_resource != new_top) {
     current_resource->~StackResource();
@@ -68,16 +63,4 @@
   }
 }
 
-#if defined(DEBUG)
-NoSafepointScope::NoSafepointScope(Thread* current_thread)
-    : StackResource(current_thread != nullptr ? current_thread
-                                              : Thread::Current()) {
-  thread()->IncrementNoSafepointScopeDepth();
-}
-
-NoSafepointScope::~NoSafepointScope() {
-  thread()->DecrementNoSafepointScopeDepth();
-}
-#endif  // defined(DEBUG)
-
 }  // namespace dart
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index b9af2f9..420b85e 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -13,8 +13,7 @@
 namespace dart {
 
 // Forward declarations.
-class Isolate;
-class Thread;
+class ThreadState;
 
 // Stack resources subclass from this base class. The VM will ensure that the
 // destructors of these objects are called before the stack is unwound past the
@@ -23,27 +22,24 @@
 // to a stack frame above the frame where these objects were allocated.
 class StackResource {
  public:
-  explicit StackResource(Thread* thread) : thread_(NULL), previous_(NULL) {
+  explicit StackResource(ThreadState* thread) : thread_(NULL), previous_(NULL) {
     Init(thread);
   }
 
   virtual ~StackResource();
 
-  // Convenient access to the isolate of the thread of this resource.
-  Isolate* isolate() const;
-
   // The thread that owns this resource.
-  Thread* thread() const { return thread_; }
+  ThreadState* thread() const { return thread_; }
 
   // Destroy stack resources of thread until top exit frame.
-  static void Unwind(Thread* thread) { UnwindAbove(thread, NULL); }
+  static void Unwind(ThreadState* thread) { UnwindAbove(thread, NULL); }
   // Destroy stack resources of thread above new_top, exclusive.
-  static void UnwindAbove(Thread* thread, StackResource* new_top);
+  static void UnwindAbove(ThreadState* thread, StackResource* new_top);
 
  private:
-  void Init(Thread* thread);
+  void Init(ThreadState* thread);
 
-  Thread* thread_;
+  ThreadState* thread_;
   StackResource* previous_;
 
   DISALLOW_ALLOCATION();
@@ -77,27 +73,6 @@
   DISALLOW_COPY_AND_ASSIGN(ZoneAllocated);
 };
 
-// Within a NoSafepointScope, the thread must not reach any safepoint. Used
-// around code that manipulates raw object pointers directly without handles.
-#if defined(DEBUG)
-class NoSafepointScope : public StackResource {
- public:
-  explicit NoSafepointScope(Thread* thread = nullptr);
-  ~NoSafepointScope();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NoSafepointScope);
-};
-#else   // defined(DEBUG)
-class NoSafepointScope : public ValueObject {
- public:
-  explicit NoSafepointScope(Thread* thread = nullptr) {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NoSafepointScope);
-};
-#endif  // defined(DEBUG)
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_ALLOCATION_H_
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index c2f3f55..c3e1db3 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -99,6 +99,8 @@
   bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
   bin::Builtin::SetNativeResolver(bin::Builtin::kCLILibrary);
   TransitionNativeToVM transition(thread);
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
   Timer timer(true, "Compile all of Core lib benchmark");
   timer.Start();
   const Error& error =
@@ -238,7 +240,6 @@
 // Measure invocation of Dart API functions.
 //
 static void InitNativeFields(Dart_NativeArguments args) {
-  Dart_EnterScope();
   int count = Dart_GetNativeArgumentCount(args);
   EXPECT_EQ(1, count);
 
@@ -246,8 +247,6 @@
   EXPECT_VALID(recv);
   Dart_Handle result = Dart_SetNativeInstanceField(recv, 0, 7);
   EXPECT_VALID(result);
-
-  Dart_ExitScope();
 }
 
 // The specific api functions called here are a bit arbitrary.  We are
@@ -298,7 +297,8 @@
 BENCHMARK(UseDartApi) {
   const int kNumIterations = 1000000;
   const char* kScriptChars =
-      "class Class extends NativeFieldsWrapper{\n"
+      "import 'dart:nativewrappers';\n"
+      "class Class extends NativeFieldWrapperClass1 {\n"
       "  int init() native 'init';\n"
       "  int method(int param1, int param2) native 'method';\n"
       "}\n"
@@ -314,12 +314,7 @@
   Dart_Handle lib = TestCase::LoadTestScript(
       kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(bm_uda_lookup),
       USER_TEST_URI, false);
-
-  // Create a native wrapper class with native fields.
-  Dart_Handle result =
-      Dart_CreateNativeWrapperClass(lib, NewString("NativeFieldsWrapper"), 1);
-  EXPECT_VALID(result);
-  result = Dart_FinalizeLoading(false);
+  Dart_Handle result = Dart_FinalizeLoading(false);
   EXPECT_VALID(result);
 
   Dart_Handle args[1];
@@ -423,24 +418,33 @@
 // Measure frame lookup during stack traversal.
 //
 static void StackFrame_accessFrame(Dart_NativeArguments args) {
-  const int kNumIterations = 100;
-  Code& code = Code::Handle();
   Timer timer(true, "LookupDartCode benchmark");
   timer.Start();
-  for (int i = 0; i < kNumIterations; i++) {
-    StackFrameIterator frames(ValidationPolicy::kDontValidateFrames,
-                              Thread::Current(),
-                              StackFrameIterator::kNoCrossThreadIteration);
-    StackFrame* frame = frames.NextFrame();
-    while (frame != NULL) {
-      if (frame->IsStubFrame()) {
-        code = frame->LookupDartCode();
-        EXPECT(code.function() == Function::null());
-      } else if (frame->IsDartFrame()) {
-        code = frame->LookupDartCode();
-        EXPECT(code.function() != Function::null());
+  {
+    Thread* thread = Thread::Current();
+    TransitionNativeToVM transition(thread);
+    const int kNumIterations = 100;
+    Code& code = Code::Handle(thread->zone());
+    Bytecode& bytecode = Bytecode::Handle(thread->zone());
+    for (int i = 0; i < kNumIterations; i++) {
+      StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
+                                StackFrameIterator::kNoCrossThreadIteration);
+      StackFrame* frame = frames.NextFrame();
+      while (frame != NULL) {
+        if (frame->IsStubFrame()) {
+          code = frame->LookupDartCode();
+          EXPECT(code.function() == Function::null());
+        } else if (frame->IsDartFrame()) {
+          if (frame->is_interpreted()) {
+            bytecode = frame->LookupDartBytecode();
+            EXPECT(bytecode.function() != Function::null());
+          } else {
+            code = frame->LookupDartCode();
+            EXPECT(code.function() != Function::null());
+          }
+        }
+        frame = frames.NextFrame();
       }
-      frame = frames.NextFrame();
     }
   }
   timer.Stop();
@@ -532,9 +536,13 @@
   // Need to load the script into the dart: core library due to
   // the import of dart:_internal.
   TestCase::LoadCoreTestScript(kScriptChars, NULL);
-  Api::CheckAndFinalizePendingClasses(thread);
 
   TransitionNativeToVM transition(thread);
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
+
+  Api::CheckAndFinalizePendingClasses(thread);
+
   // Write snapshot with object content.
   FullSnapshotWriter writer(Snapshot::kFull, &vm_snapshot_data_buffer,
                             &isolate_snapshot_data_buffer, &malloc_allocator,
@@ -569,9 +577,13 @@
   // Need to load the script into the dart: core library due to
   // the import of dart:_internal.
   TestCase::LoadCoreTestScript(kScriptChars, NULL);
-  Api::CheckAndFinalizePendingClasses(thread);
 
   TransitionNativeToVM transition(thread);
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
+
+  Api::CheckAndFinalizePendingClasses(thread);
+
   // Write snapshot with object content.
   FullSnapshotWriter writer(Snapshot::kFull, &vm_snapshot_data_buffer,
                             &isolate_snapshot_data_buffer, &malloc_allocator,
@@ -611,7 +623,12 @@
       "\n";
   const intptr_t kLoopCount = 1000000;
   TestCase::LoadTestScript(kScriptChars, NULL);
-  Api::CheckAndFinalizePendingClasses(thread);
+  {
+    TransitionNativeToVM transition(thread);
+    StackZone zone(thread);
+    HANDLESCOPE(thread);
+    Api::CheckAndFinalizePendingClasses(thread);
+  }
   Dart_Isolate isolate = Dart_CurrentIsolate();
   Timer timer(true, "Enter and Exit isolate");
   timer.Start();
@@ -626,6 +643,8 @@
 
 BENCHMARK(SerializeNull) {
   TransitionNativeToVM transition(thread);
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
   const Object& null_object = Object::Handle();
   const intptr_t kLoopCount = 1000000;
   Timer timer(true, "Serialize Null");
@@ -648,6 +667,8 @@
 
 BENCHMARK(SerializeSmi) {
   TransitionNativeToVM transition(thread);
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
   const Integer& smi_object = Integer::Handle(Smi::New(42));
   const intptr_t kLoopCount = 1000000;
   Timer timer(true, "Serialize Smi");
@@ -670,6 +691,8 @@
 
 BENCHMARK(SimpleMessage) {
   TransitionNativeToVM transition(thread);
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
   const Array& array_object = Array::Handle(Array::New(2));
   array_object.SetAt(0, Integer::Handle(Smi::New(42)));
   array_object.SetAt(1, Object::Handle());
@@ -704,6 +727,8 @@
   Dart_Handle h_result = Dart_Invoke(h_lib, NewString("makeMap"), 0, NULL);
   EXPECT_VALID(h_result);
   TransitionNativeToVM transition(thread);
+  StackZone zone(thread);
+  HANDLESCOPE(thread);
   Instance& map = Instance::Handle();
   map ^= Api::UnwrapHandle(h_result);
   const intptr_t kLoopCount = 100;
diff --git a/runtime/vm/benchmark_test.h b/runtime/vm/benchmark_test.h
index eb08041..64962b9 100644
--- a/runtime/vm/benchmark_test.h
+++ b/runtime/vm/benchmark_test.h
@@ -43,8 +43,6 @@
     BenchmarkIsolateScope __isolate__(benchmark);                              \
     Thread* __thread__ = Thread::Current();                                    \
     ASSERT(__thread__->isolate() == benchmark->isolate());                     \
-    StackZone __zone__(__thread__);                                            \
-    HandleScope __hs__(__thread__);                                            \
     Dart_BenchmarkHelper##name(benchmark, __thread__);                         \
     MallocHooks::set_stack_trace_collection_enabled(                           \
         __stack_trace_collection_enabled__);                                   \
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 37d6578..fc59b64 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -48,7 +48,7 @@
   ObjectStore* object_store = thread->isolate()->object_store();
   Zone* zone = thread->zone();
   Class& cls = Class::Handle(zone, object_store->closure_class());
-  Compiler::CompileClass(cls);
+  ClassFinalizer::LoadClassMembers(cls);
 
 #if defined(DEBUG)
   // Verify that closure field offsets are identical in Dart and C++.
@@ -71,7 +71,7 @@
 
   // Eagerly compile Bool class, bool constants are used from within compiler.
   cls = object_store->bool_class();
-  Compiler::CompileClass(cls);
+  ClassFinalizer::LoadClassMembers(cls);
 }
 
 static RawError* BootstrapFromKernel(Thread* thread,
diff --git a/runtime/vm/bootstrap_natives.cc b/runtime/vm/bootstrap_natives.cc
index fb3d08b..e02c6fa 100644
--- a/runtime/vm/bootstrap_natives.cc
+++ b/runtime/vm/bootstrap_natives.cc
@@ -34,7 +34,9 @@
 Dart_NativeFunction BootstrapNatives::Lookup(Dart_Handle name,
                                              int argument_count,
                                              bool* auto_setup_scope) {
-  const Object& obj = Object::Handle(Api::UnwrapHandle(name));
+  Thread* thread = Thread::Current();
+  TransitionNativeToVM transition(thread);
+  const Object& obj = Object::Handle(thread->zone(), Api::UnwrapHandle(name));
   if (!obj.IsString()) {
     return NULL;
   }
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 929dc6c..551784d 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -156,7 +156,7 @@
   V(StackTrace_clearAsyncThreadStackTrace, 0)                                  \
   V(StackTrace_setAsyncThreadStackTrace, 1)                                    \
   V(StackTrace_current, 0)                                                     \
-  V(TypeError_throwNew, 5)                                                     \
+  V(TypeError_throwNew, 4)                                                     \
   V(FallThroughError_throwNew, 1)                                              \
   V(AbstractClassInstantiationError_throwNew, 2)                               \
   V(Stopwatch_now, 0)                                                          \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 04fb131..572175d 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -23,7 +23,6 @@
 namespace dart {
 
 DEFINE_FLAG(bool, print_classes, false, "Prints details about loaded classes.");
-DEFINE_FLAG(bool, reify, true, "Reify type arguments of generic types.");
 DEFINE_FLAG(bool, trace_class_finalization, false, "Trace class finalization.");
 DEFINE_FLAG(bool, trace_type_finalization, false, "Trace type finalization.");
 
@@ -58,7 +57,7 @@
 
 void AddSuperType(const AbstractType& type,
                   GrowableArray<intptr_t>* finalized_super_classes) {
-  ASSERT(type.HasResolvedTypeClass());
+  ASSERT(type.HasTypeClass());
   ASSERT(!type.IsDynamicType());
   if (type.IsObjectType()) {
     return;
@@ -86,7 +85,7 @@
   AbstractType& super_type = Type::Handle();
   super_type = cls.super_type();
   if (!super_type.IsNull()) {
-    if (!super_type.IsMalformed() && super_type.HasResolvedTypeClass()) {
+    if (super_type.HasTypeClass()) {
       cls ^= super_type.type_class();
       if (cls.is_finalized()) {
         AddSuperType(super_type, finalized_super_classes);
@@ -156,8 +155,7 @@
   AbstractType& type = AbstractType::Handle();
   for (intptr_t i = 0; i < interfaces.Length(); ++i) {
     type ^= interfaces.At(i);
-    if (type.IsMalformed()) continue;
-    if (!type.HasResolvedTypeClass()) continue;
+    if (!type.HasTypeClass()) continue;
     ifc ^= type.type_class();
     for (intptr_t j = 0; j < cids->length(); ++j) {
       if ((*cids)[j] == ifc.id()) {
@@ -194,11 +192,11 @@
     class_array = object_store->pending_classes();
     ASSERT(!class_array.IsNull());
     Class& cls = Class::Handle();
-    // First resolve all superclasses.
+    // First check all superclasses.
     for (intptr_t i = 0; i < class_array.Length(); i++) {
       cls ^= class_array.At(i);
       GrowableArray<intptr_t> visited_interfaces;
-      ResolveSuperTypeAndInterfaces(cls, &visited_interfaces);
+      CheckSuperTypeAndInterfaces(cls, &visited_interfaces);
     }
     // Finalize all classes.
     for (intptr_t i = 0; i < class_array.Length(); i++) {
@@ -225,22 +223,6 @@
   return true;
 }
 
-// Adds all interfaces of cls into 'collected'. Duplicate entries may occur.
-// No cycles are allowed.
-void ClassFinalizer::CollectInterfaces(const Class& cls,
-                                       GrowableArray<const Class*>* collected) {
-  Zone* zone = Thread::Current()->zone();
-  const Array& interface_array = Array::Handle(zone, cls.interfaces());
-  AbstractType& interface = AbstractType::Handle(zone);
-  Class& interface_class = Class::Handle(zone);
-  for (intptr_t i = 0; i < interface_array.Length(); i++) {
-    interface ^= interface_array.At(i);
-    interface_class = interface.type_class();
-    collected->Add(&Class::ZoneHandle(zone, interface_class.raw()));
-    CollectInterfaces(interface_class, collected);
-  }
-}
-
 #if !defined(DART_PRECOMPILED_RUNTIME)
 void ClassFinalizer::VerifyBootstrapClasses() {
   if (FLAG_trace_class_finalization) {
@@ -309,340 +291,12 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-static bool IsLoaded(const Type& type) {
-  if (type.HasResolvedTypeClass()) {
-    return true;
-  }
-  const UnresolvedClass& unresolved_class =
-      UnresolvedClass::Handle(type.unresolved_class());
-  const Object& prefix =
-      Object::Handle(unresolved_class.library_or_library_prefix());
-  if (prefix.IsNull()) {
-    return true;
-  } else if (prefix.IsLibraryPrefix()) {
-    return LibraryPrefix::Cast(prefix).is_loaded();
-  } else {
-    return true;
-  }
-}
-
-// Resolve unresolved_class in the library of cls, or return null.
-RawClass* ClassFinalizer::ResolveClass(
-    const Class& cls,
-    const UnresolvedClass& unresolved_class) {
-  const String& class_name = String::Handle(unresolved_class.ident());
-  Library& lib = Library::Handle();
-  Class& resolved_class = Class::Handle();
-  if (unresolved_class.library_or_library_prefix() == Object::null()) {
-    lib = cls.library();
-    ASSERT(!lib.IsNull());
-    resolved_class = lib.LookupClass(class_name);
-  } else {
-    const Object& prefix =
-        Object::Handle(unresolved_class.library_or_library_prefix());
-
-    if (prefix.IsLibraryPrefix()) {
-      resolved_class = LibraryPrefix::Cast(prefix).LookupClass(class_name);
-    } else {
-      resolved_class = Library::Cast(prefix).LookupClass(class_name);
-    }
-  }
-  return resolved_class.raw();
-}
-
-void ClassFinalizer::ResolveRedirectingFactory(const Class& cls,
-                                               const Function& factory) {
-  const Function& target = Function::Handle(factory.RedirectionTarget());
-  if (target.IsNull()) {
-    Type& type = Type::Handle(factory.RedirectionType());
-    if (!type.IsMalformed() && IsLoaded(type)) {
-      const GrowableObjectArray& visited_factories =
-          GrowableObjectArray::Handle(GrowableObjectArray::New());
-      ResolveRedirectingFactoryTarget(cls, factory, visited_factories);
-    }
-    if (factory.is_const()) {
-      type = factory.RedirectionType();
-      if (type.IsMalformedOrMalbounded()) {
-        ReportError(Error::Handle(type.error()));
-      }
-    }
-  }
-}
-
-void ClassFinalizer::ResolveRedirectingFactoryTarget(
-    const Class& cls,
-    const Function& factory,
-    const GrowableObjectArray& visited_factories) {
-  ASSERT(factory.IsRedirectingFactory());
-
-  // Check for redirection cycle.
-  for (intptr_t i = 0; i < visited_factories.Length(); i++) {
-    if (visited_factories.At(i) == factory.raw()) {
-      // A redirection cycle is reported as a compile-time error.
-      ReportError(cls, factory.token_pos(),
-                  "factory '%s' illegally redirects to itself",
-                  String::Handle(factory.name()).ToCString());
-    }
-  }
-  visited_factories.Add(factory);
-
-  // Check if target is already resolved.
-  Type& type = Type::Handle(factory.RedirectionType());
-  Function& target = Function::Handle(factory.RedirectionTarget());
-  if (type.IsMalformedOrMalbounded()) {
-    // Already resolved to a malformed or malbounded type. Will throw on usage.
-    ASSERT(target.IsNull());
-    return;
-  }
-  if (!target.IsNull()) {
-    // Already resolved.
-    return;
-  }
-
-  // Target is not resolved yet.
-  if (FLAG_trace_class_finalization) {
-    THR_Print("Resolving redirecting factory: %s\n",
-              String::Handle(factory.name()).ToCString());
-  }
-  type ^= FinalizeType(cls, type);
-  factory.SetRedirectionType(type);
-  if (type.IsMalformedOrMalbounded()) {
-    ASSERT(factory.RedirectionTarget() == Function::null());
-    return;
-  }
-  ASSERT(!type.IsTypeParameter());  // Resolved in parser.
-  if (type.IsDynamicType()) {
-    // Replace the type with a malformed type and compile a throw when called.
-    type = NewFinalizedMalformedType(Error::Handle(),  // No previous error.
-                                     Script::Handle(cls.script()),
-                                     factory.token_pos(),
-                                     "factory may not redirect to 'dynamic'");
-    factory.SetRedirectionType(type);
-    ASSERT(factory.RedirectionTarget() == Function::null());
-    return;
-  }
-  const Class& target_class = Class::Handle(type.type_class());
-  String& target_class_name = String::Handle(target_class.Name());
-  String& target_name =
-      String::Handle(String::Concat(target_class_name, Symbols::Dot()));
-  const String& identifier = String::Handle(factory.RedirectionIdentifier());
-  if (!identifier.IsNull()) {
-    target_name = String::Concat(target_name, identifier);
-  }
-
-  // Verify that the target constructor of the redirection exists.
-  target = target_class.LookupConstructor(target_name);
-  if (target.IsNull()) {
-    target = target_class.LookupFactory(target_name);
-  }
-  if (target.IsNull()) {
-    const String& user_visible_target_name =
-        identifier.IsNull() ? target_class_name : target_name;
-    // Replace the type with a malformed type and compile a throw when called.
-    type = NewFinalizedMalformedType(
-        Error::Handle(),  // No previous error.
-        Script::Handle(target_class.script()), factory.token_pos(),
-        "class '%s' has no constructor or factory named '%s'",
-        target_class_name.ToCString(), user_visible_target_name.ToCString());
-    factory.SetRedirectionType(type);
-    ASSERT(factory.RedirectionTarget() == Function::null());
-    return;
-  }
-
-  // Verify that the target is const if the redirecting factory is const.
-  if (factory.is_const() && !target.is_const()) {
-    ReportError(target_class, target.token_pos(),
-                "constructor '%s' must be const as required by "
-                "redirecting const factory '%s'",
-                String::Handle(target.name()).ToCString(),
-                String::Handle(factory.name()).ToCString());
-  }
-
-  // Update redirection data with resolved target.
-  factory.SetRedirectionTarget(target);
-  // Not needed anymore.
-  factory.SetRedirectionIdentifier(Object::null_string());
-  if (!target.IsRedirectingFactory()) {
-    return;
-  }
-
-  // The target is itself a redirecting factory. Recursively resolve its own
-  // target and update the current redirection data to point to the end target
-  // of the redirection chain.
-  ResolveRedirectingFactoryTarget(target_class, target, visited_factories);
-  Type& target_type = Type::Handle(target.RedirectionType());
-  Function& target_target = Function::Handle(target.RedirectionTarget());
-  if (target_target.IsNull()) {
-    ASSERT(target_type.IsMalformed());
-  } else {
-    // If the target type refers to type parameters, substitute them with the
-    // type arguments of the redirection type.
-    if (!target_type.IsInstantiated()) {
-      // We do not support generic constructors.
-      ASSERT(target_type.IsInstantiated(kFunctions));
-      const TypeArguments& type_args = TypeArguments::Handle(type.arguments());
-      Error& bound_error = Error::Handle();
-      target_type ^= target_type.InstantiateFrom(
-          type_args, Object::null_type_arguments(), kNoneFree, &bound_error,
-          NULL, NULL, Heap::kOld);
-      if (bound_error.IsNull()) {
-        target_type ^= FinalizeType(cls, target_type);
-      } else {
-        ASSERT(target_type.IsInstantiated() && type_args.IsInstantiated());
-        const Script& script = Script::Handle(target_class.script());
-        FinalizeMalformedType(bound_error, script, target_type,
-                              "cannot resolve redirecting factory");
-        target_target = Function::null();
-      }
-    }
-  }
-  factory.SetRedirectionType(target_type);
-  factory.SetRedirectionTarget(target_target);
-}
-
-void ClassFinalizer::ResolveTypeClass(const Class& cls, const Type& type) {
-  if (type.IsFinalized()) {
-    return;
-  }
-  if (FLAG_trace_type_finalization) {
-    THR_Print("Resolve type class of '%s'\n",
-              String::Handle(type.Name()).ToCString());
-  }
-
-  // Type parameters are always resolved in the parser in the correct
-  // non-static scope or factory scope. That resolution scope is unknown here.
-  // Being able to resolve a type parameter from class cls here would indicate
-  // that the type parameter appeared in a static scope. Leaving the type as
-  // unresolved is the correct thing to do.
-
-  // Lookup the type class if necessary.
-  Class& type_class = Class::Handle();
-  if (type.HasResolvedTypeClass()) {
-    type_class = type.type_class();
-  } else {
-    const UnresolvedClass& unresolved_class =
-        UnresolvedClass::Handle(type.unresolved_class());
-    type_class = ResolveClass(cls, unresolved_class);
-    if (type_class.IsNull()) {
-      // The type class could not be resolved. The type is malformed.
-      FinalizeMalformedType(Error::Handle(),  // No previous error.
-                            Script::Handle(cls.script()), type,
-                            "cannot resolve class '%s' from '%s'",
-                            String::Handle(unresolved_class.Name()).ToCString(),
-                            String::Handle(cls.Name()).ToCString());
-      return;
-    }
-    // Replace unresolved class with resolved type class.
-    type.set_type_class(type_class);
-  }
-  // Promote the type to a function type in case its type class is a typedef.
-  // Note that the type may already be a function type if it was parsed as a
-  // formal parameter function type.
-  if (!type.IsFunctionType() && type_class.IsTypedefClass() &&
-      !type.IsMalformedOrMalbounded()) {
-    type.set_signature(Function::Handle(type_class.signature_function()));
-  }
-  ASSERT(!type_class.IsTypedefClass() ||
-         (type.signature() != Function::null()));
-
-  // In non-strong mode, replace FutureOr<T> type of async library with dynamic.
-  if (type_class.IsFutureOrClass() && !FLAG_strong) {
-    Type::Cast(type).set_type_class(Class::Handle(Object::dynamic_class()));
-    type.set_arguments(Object::null_type_arguments());
-  }
-}
-
-void ClassFinalizer::ResolveType(const Class& cls, const AbstractType& type) {
-  if (type.IsResolved()) {
-    return;
-  }
-  if (FLAG_trace_type_finalization) {
-    THR_Print("Resolve type '%s'\n", String::Handle(type.Name()).ToCString());
-  }
-  if (type.IsType()) {
-    ResolveTypeClass(cls, Type::Cast(type));
-    if (type.IsMalformed()) {
-      ASSERT(type.IsResolved());
-      return;
-    }
-  }
-  // Mark type as resolved before resolving its type arguments and, in case of a
-  // function type, its signature, in order to avoid cycles.
-  type.SetIsResolved();
-  // Resolve type arguments, if any.
-  const TypeArguments& arguments = TypeArguments::Handle(type.arguments());
-  if (!arguments.IsNull()) {
-    const intptr_t num_arguments = arguments.Length();
-    AbstractType& type_argument = AbstractType::Handle();
-    for (intptr_t i = 0; i < num_arguments; i++) {
-      type_argument = arguments.TypeAt(i);
-      ResolveType(cls, type_argument);
-    }
-  }
-  // Resolve signature if function type.
-  if (type.IsFunctionType()) {
-    const Function& signature = Function::Handle(Type::Cast(type).signature());
-    Type& signature_type = Type::Handle(signature.SignatureType());
-    if (signature_type.raw() != type.raw()) {
-      // This type was promoted to a function type because its type class is a
-      // typedef class. The promotion is achieved by assigning the signature
-      // function of the typedef class to this type. This function is pointing
-      // to the original typedef function type, which is not this type.
-      // By resolving the typedef function type (which may already be resolved,
-      // hence saving work), we will resolve the shared signature function.
-      ASSERT(Class::Handle(type.type_class()).IsTypedefClass());
-      ResolveType(cls, signature_type);
-    } else {
-      const Class& scope_class = Class::Handle(type.type_class());
-      if (scope_class.IsTypedefClass()) {
-        // This type is the original function type of the typedef class.
-        ResolveSignature(scope_class, signature);
-      } else {
-        ASSERT(scope_class.IsClosureClass());
-        ResolveSignature(cls, signature);
-        ASSERT(type.arguments() == TypeArguments::null());
-        if (signature.IsSignatureFunction()) {
-          // Drop fields that are not necessary anymore after resolution.
-          // The parent function, owner, and token position of a shared
-          // canonical function type are meaningless, since the canonical
-          // representent is picked arbitrarily.
-          // The parent function is however still required to finalize function
-          // type parameters when the function has a generic parent.
-          if (!signature.HasGenericParent()) {
-            signature.set_parent_function(Function::Handle());
-          }
-          // TODO(regis): As long as we support metadata in typedef signatures,
-          // we cannot reset these fields used to reparse a typedef.
-          // Note that the scope class of a typedef function type is always
-          // preserved as the typedef class (not reset to _Closure class),
-          // thereby preventing sharing of canonical function types between
-          // typedefs. Not being shared, these fields are therefore always
-          // meaningful for typedefs.
-          if (!scope_class.IsTypedefClass()) {
-            signature.set_owner(Object::Handle());
-            signature.set_token_pos(TokenPosition::kNoSource);
-          }
-        }
-      }
-    }
-  }
-
-  // After resolving, we re-initialize the type testing stub.
-  type.SetTypeTestingStub(
-      Instructions::Handle(TypeTestingStubGenerator::DefaultCodeForType(type)));
-}
-
 void ClassFinalizer::FinalizeTypeParameters(const Class& cls,
                                             PendingTypes* pending_types) {
   if (FLAG_trace_type_finalization) {
     THR_Print("Finalizing type parameters of '%s'\n",
               String::Handle(cls.Name()).ToCString());
   }
-  if (cls.IsMixinApplication()) {
-    // Setup the type parameters of the mixin application and finalize the
-    // mixin type.
-    ApplyMixinType(cls, pending_types);
-  }
   // The type parameter bounds are not finalized here.
   const TypeArguments& type_parameters =
       TypeArguments::Handle(cls.type_parameters());
@@ -723,16 +377,14 @@
           !pending_arguments.IsSubvectorInstantiated(first_type_param,
                                                      num_type_params)) {
         const TypeArguments& instantiated_arguments = TypeArguments::Handle(
-            zone,
-            arguments.InstantiateFrom(Object::null_type_arguments(),
-                                      Object::null_type_arguments(), kNoneFree,
-                                      NULL, NULL, NULL, Heap::kNew));
+            zone, arguments.InstantiateFrom(Object::null_type_arguments(),
+                                            Object::null_type_arguments(),
+                                            kNoneFree, NULL, Heap::kNew));
         const TypeArguments& instantiated_pending_arguments =
-            TypeArguments::Handle(
-                zone, pending_arguments.InstantiateFrom(
-                          Object::null_type_arguments(),
-                          Object::null_type_arguments(), kNoneFree, NULL, NULL,
-                          NULL, Heap::kNew));
+            TypeArguments::Handle(zone, pending_arguments.InstantiateFrom(
+                                            Object::null_type_arguments(),
+                                            Object::null_type_arguments(),
+                                            kNoneFree, NULL, Heap::kNew));
         if (!instantiated_pending_arguments.IsSubvectorEquivalent(
                 instantiated_arguments, first_type_param, num_type_params)) {
           const String& type_name = String::Handle(zone, type.Name());
@@ -751,15 +403,11 @@
     const AbstractType& type,
     PendingTypes* pending_types) {
   Zone* zone = Thread::Current()->zone();
-  // The type class does not need to be finalized in order to finalize the type,
-  // however, it must at least be resolved (this was done as part of resolving
-  // the type itself, a precondition to calling FinalizeType).
-  // Also, the interfaces of the type class must be resolved and the type
-  // parameters of the type class must be finalized.
+  // The type class does not need to be finalized in order to finalize the type.
+  // Also, the type parameters of the type class must be finalized.
   Class& type_class = Class::Handle(zone, type.type_class());
   if (!type_class.is_type_finalized()) {
     FinalizeTypeParameters(type_class, pending_types);
-    ResolveUpperBounds(type_class);
   }
 
   // The finalized type argument vector needs num_type_arguments types.
@@ -767,26 +415,15 @@
   // The class has num_type_parameters type parameters.
   const intptr_t num_type_parameters = type_class.NumTypeParameters();
 
-  // If we are not reifying types, drop type arguments.
-  if (!FLAG_reify) {
-    type.set_arguments(Object::null_type_arguments());
-  }
-
   // Initialize the type argument vector.
   // Check the number of parsed type arguments, if any.
   // Specifying no type arguments indicates a raw type, which is not an error.
   // However, type parameter bounds are checked below, even for a raw type.
   TypeArguments& arguments = TypeArguments::Handle(zone, type.arguments());
   if (!arguments.IsNull() && (arguments.Length() != num_type_parameters)) {
-    // Wrong number of type arguments. The type is mapped to the raw type.
-    if (Isolate::Current()->error_on_bad_type()) {
-      const String& type_class_name = String::Handle(zone, type_class.Name());
-      ReportError(cls, type.token_pos(),
-                  "wrong number of type arguments for class '%s'",
-                  type_class_name.ToCString());
-    }
     // Make the type raw and continue without reporting any error.
     // A static warning should have been reported.
+    // TODO(regis): Check if this is dead code.
     arguments = TypeArguments::null();
     type.set_arguments(arguments);
   }
@@ -802,7 +439,7 @@
   // super types of type_class, which are initialized from the parsed
   // type arguments, followed by the parsed type arguments.
   TypeArguments& full_arguments = TypeArguments::Handle(zone);
-  if (FLAG_reify && (num_type_arguments > 0)) {
+  if (num_type_arguments > 0) {
     // If no type arguments were parsed and if the super types do not prepend
     // type arguments to the vector, we can leave the vector as null.
     if (!arguments.IsNull() || (num_type_arguments > num_type_parameters)) {
@@ -834,10 +471,7 @@
           type_arg = full_arguments.TypeAt(offset + i);
           ASSERT(!type_arg.IsBeingFinalized());
           type_arg = FinalizeType(cls, type_arg, kFinalize, pending_types);
-          if (type_arg.IsMalformed()) {
-            // Malformed type arguments are mapped to dynamic.
-            type_arg = Type::DynamicType();
-          } else if (type_arg.IsFunctionType()) {
+          if (type_arg.IsFunctionType()) {
             const Function& signature_function =
                 Function::Handle(zone, Type::Cast(type_arg).signature());
             if (signature_function.IsGeneric()) {
@@ -856,9 +490,8 @@
       }
       if (offset > 0) {
         TrailPtr instantiation_trail = new Trail(zone, 4);
-        Error& bound_error = Error::Handle(zone);
-        FinalizeTypeArguments(type_class, full_arguments, offset, &bound_error,
-                              pending_types, instantiation_trail);
+        FinalizeTypeArguments(type_class, full_arguments, offset, pending_types,
+                              instantiation_trail);
       }
       if (full_arguments.IsRaw(0, num_type_arguments)) {
         // The parameterized_type is raw. Set its argument vector to null, which
@@ -912,13 +545,11 @@
 void ClassFinalizer::FinalizeTypeArguments(const Class& cls,
                                            const TypeArguments& arguments,
                                            intptr_t num_uninitialized_arguments,
-                                           Error* bound_error,
                                            PendingTypes* pending_types,
                                            TrailPtr instantiation_trail) {
   ASSERT(arguments.Length() >= cls.NumTypeArguments());
   if (!cls.is_type_finalized()) {
     FinalizeTypeParameters(cls, pending_types);
-    ResolveUpperBounds(cls);
   }
   AbstractType& super_type = AbstractType::Handle(cls.super_type());
   if (!super_type.IsNull()) {
@@ -983,20 +614,9 @@
             arguments.SetTypeAt(i, super_type_arg);
             continue;
           }
-          Error& error = Error::Handle();
           super_type_arg = super_type_arg.InstantiateFrom(
-              arguments, Object::null_type_arguments(), kNoneFree, &error,
-              instantiation_trail, NULL, Heap::kOld);
-          if (!error.IsNull()) {
-            // InstantiateFrom does not report an error if the type is still
-            // uninstantiated. Instead, it will return a new BoundedType so
-            // that the check is postponed to run time.
-            ASSERT(super_type_arg.IsInstantiated());
-            // Keep only the first bound error.
-            if (bound_error->IsNull()) {
-              *bound_error = error.raw();
-            }
-          }
+              arguments, Object::null_type_arguments(), kNoneFree,
+              instantiation_trail, Heap::kOld);
           if (super_type_arg.IsBeingFinalized()) {
             // The super_type_arg was instantiated from a type being finalized.
             // We need to finish finalizing its type arguments.
@@ -1024,7 +644,7 @@
             FinalizeTypeArguments(
                 super_cls, super_args,
                 super_cls.NumTypeArguments() - super_cls.NumTypeParameters(),
-                bound_error, pending_types, instantiation_trail);
+                pending_types, instantiation_trail);
             if (FLAG_trace_type_finalization) {
               THR_Print("Finalized instantiated TypeRef '%s': '%s'\n",
                         String::Handle(super_type_arg.Name()).ToCString(),
@@ -1035,164 +655,8 @@
       }
       arguments.SetTypeAt(i, super_type_arg);
     }
-    FinalizeTypeArguments(super_class, arguments, super_offset, bound_error,
-                          pending_types, instantiation_trail);
-  }
-}
-
-// Check the type argument vector 'arguments' against the corresponding bounds
-// of the type parameters of class 'cls' and, recursively, of its superclasses.
-// Replace a type argument that cannot be checked at compile time by a
-// BoundedType, thereby postponing the bound check to run time.
-// Return a bound error if a type argument is not within bound at compile time.
-void ClassFinalizer::CheckTypeArgumentBounds(const Class& cls,
-                                             const TypeArguments& arguments,
-                                             Error* bound_error) {
-  if (!cls.is_type_finalized()) {
-    FinalizeTypeParameters(cls);
-    FinalizeUpperBounds(cls, kFinalize);  // No canonicalization yet.
-  }
-  // Note that when finalizing a type, we need to verify the bounds in both
-  // production mode and checked mode, because the finalized type may be written
-  // to a snapshot. It would be wrong to ignore bounds when generating the
-  // snapshot in production mode and then use the unchecked type in checked mode
-  // after reading it from the snapshot.
-  // However, we do not immediately report a bound error, which would be wrong
-  // in production mode, but simply postpone the bound checking to runtime.
-  const intptr_t num_type_params = cls.NumTypeParameters();
-  const intptr_t offset = cls.NumTypeArguments() - num_type_params;
-  AbstractType& type_arg = AbstractType::Handle();
-  AbstractType& cls_type_param = AbstractType::Handle();
-  AbstractType& declared_bound = AbstractType::Handle();
-  AbstractType& instantiated_bound = AbstractType::Handle();
-  const TypeArguments& cls_type_params =
-      TypeArguments::Handle(cls.type_parameters());
-  ASSERT((cls_type_params.IsNull() && (num_type_params == 0)) ||
-         (cls_type_params.Length() == num_type_params));
-  // In case of overlapping type argument vectors, the same type argument may
-  // get checked against different bounds.
-  for (intptr_t i = 0; i < num_type_params; i++) {
-    type_arg = arguments.TypeAt(offset + i);
-    if (type_arg.IsDynamicType()) {
-      continue;
-    }
-    ASSERT(type_arg.IsFinalized());
-    if (type_arg.IsMalbounded()) {
-      // The type argument itself is already malbounded, independently of the
-      // declared bound, which may be Object.
-      // Propagate the bound error from the type argument to the type.
-      if (bound_error->IsNull()) {
-        *bound_error = type_arg.error();
-        ASSERT(!bound_error->IsNull());
-      }
-    }
-    cls_type_param = cls_type_params.TypeAt(i);
-    const TypeParameter& type_param = TypeParameter::Cast(cls_type_param);
-    ASSERT(type_param.IsFinalized());
-    declared_bound = type_param.bound();
-    if (!declared_bound.IsObjectType() && !declared_bound.IsDynamicType()) {
-      if (!declared_bound.IsFinalized() && !declared_bound.IsBeingFinalized()) {
-        declared_bound = FinalizeType(cls, declared_bound);
-        type_param.set_bound(declared_bound);
-      }
-      ASSERT(declared_bound.IsFinalized() || declared_bound.IsBeingFinalized());
-      Error& error = Error::Handle();
-      // Note that the bound may be malformed, in which case the bound check
-      // will return an error and the bound check will be postponed to run time.
-      if (declared_bound.IsInstantiated()) {
-        instantiated_bound = declared_bound.raw();
-      } else {
-        instantiated_bound = declared_bound.InstantiateFrom(
-            arguments, Object::null_type_arguments(), kNoneFree, &error, NULL,
-            NULL, Heap::kOld);
-      }
-      if (!instantiated_bound.IsFinalized()) {
-        // The bound refers to type parameters, creating a cycle; postpone
-        // bound check to run time, when the bound will be finalized.
-        // The bound may not necessarily be 'IsBeingFinalized' yet, as is the
-        // case with a pair of type parameters of the same class referring to
-        // each other via their bounds.
-        type_arg = BoundedType::New(type_arg, instantiated_bound, type_param);
-        arguments.SetTypeAt(offset + i, type_arg);
-        continue;
-      }
-      // Shortcut the special case where we check a type parameter against its
-      // declared upper bound.
-      if (error.IsNull() && !(type_arg.Equals(type_param) &&
-                              instantiated_bound.Equals(declared_bound))) {
-        // If type_arg is a type parameter, its declared bound may not be
-        // finalized yet.
-        if (type_arg.IsTypeParameter()) {
-          const Class& type_arg_cls = Class::Handle(
-              TypeParameter::Cast(type_arg).parameterized_class());
-          AbstractType& bound =
-              AbstractType::Handle(TypeParameter::Cast(type_arg).bound());
-          if (!bound.IsFinalized() && !bound.IsBeingFinalized()) {
-            bound = FinalizeType(type_arg_cls, bound);
-            TypeParameter::Cast(type_arg).set_bound(bound);
-          }
-        }
-        // This may be called only if type needs to be finalized, therefore
-        // seems OK to allocate finalized types in old space.
-        if (!type_param.CheckBound(type_arg, instantiated_bound, &error, NULL,
-                                   Heap::kOld) &&
-            error.IsNull()) {
-          // The bound cannot be checked at compile time; postpone to run time.
-          type_arg = BoundedType::New(type_arg, instantiated_bound, type_param);
-          arguments.SetTypeAt(offset + i, type_arg);
-        }
-      }
-      if (!error.IsNull() && bound_error->IsNull()) {
-        *bound_error = error.raw();
-      }
-    }
-  }
-  AbstractType& super_type = AbstractType::Handle(cls.super_type());
-  if (!super_type.IsNull() && !super_type.IsBeingFinalized()) {
-    const Class& super_class = Class::Handle(super_type.type_class());
-    CheckTypeArgumentBounds(super_class, arguments, bound_error);
-  }
-}
-
-void ClassFinalizer::CheckTypeBounds(const Class& cls,
-                                     const AbstractType& type) {
-  Zone* zone = Thread::Current()->zone();
-  ASSERT(type.IsType());
-  ASSERT(type.IsFinalized());
-  ASSERT(!type.IsCanonical());
-  TypeArguments& arguments = TypeArguments::Handle(zone, type.arguments());
-  if (arguments.IsNull()) {
-    return;
-  }
-  if (FLAG_trace_type_finalization) {
-    THR_Print("Checking bounds of type '%s' for class '%s'\n",
-              String::Handle(zone, type.Name()).ToCString(),
-              String::Handle(zone, cls.Name()).ToCString());
-  }
-  const Class& type_class = Class::Handle(zone, type.type_class());
-  Error& bound_error = Error::Handle(zone);
-  CheckTypeArgumentBounds(type_class, arguments, &bound_error);
-  // CheckTypeArgumentBounds may have indirectly canonicalized this type.
-  if (!type.IsCanonical()) {
-    type.set_arguments(arguments);
-    // If a bound error occurred, mark the type as malbounded.
-    // The bound error will be ignored in production mode.
-    if (!bound_error.IsNull()) {
-      // No compile-time error during finalization.
-      const String& type_name = String::Handle(zone, type.UserVisibleName());
-      FinalizeMalboundedType(
-          bound_error, Script::Handle(zone, cls.script()), type,
-          "type '%s' has an out of bound type argument", type_name.ToCString());
-      if (FLAG_trace_type_finalization) {
-        THR_Print("Marking type '%s' as malbounded: %s\n",
-                  String::Handle(zone, type.Name()).ToCString(),
-                  bound_error.ToErrorCString());
-      }
-    }
-  }
-  if (FLAG_trace_type_finalization) {
-    THR_Print("Done checking bounds of type '%s': %s\n",
-              String::Handle(zone, type.Name()).ToCString(), type.ToCString());
+    FinalizeTypeArguments(super_class, arguments, super_offset, pending_types,
+                          instantiation_trail);
   }
 }
 
@@ -1204,13 +668,9 @@
   // types have been bound checked.
   ASSERT((pending_types == NULL) || (finalization < kCanonicalize));
   if (type.IsFinalized()) {
-    // Ensure type is canonical if canonicalization is requested, unless type is
-    // malformed.
-    if ((finalization >= kCanonicalize) && !type.IsMalformed() &&
-        !type.IsCanonical() && type.IsType()) {
-      if (!FLAG_strong) {
-        CheckTypeBounds(cls, type);
-      }
+    // Ensure type is canonical if canonicalization is requested.
+    if ((finalization >= kCanonicalize) && !type.IsCanonical() &&
+        type.IsType()) {
       return type.Canonicalize();
     }
     return type.raw();
@@ -1228,12 +688,6 @@
   ASSERT(!type.IsBeingFinalized());
 
   Zone* zone = Thread::Current()->zone();
-  ResolveType(cls, type);
-  // A malformed type gets mapped to a finalized type.
-  if (type.IsMalformed()) {
-    ASSERT(type.IsFinalized());
-    return type.raw();
-  }
 
   if (FLAG_trace_type_finalization) {
     THR_Print("Finalizing type '%s' for class '%s'\n",
@@ -1260,14 +714,8 @@
       ASSERT(!function.IsNull());
       offset = function.NumParentTypeParameters();
     }
-    // Calling NumTypeParameters() may finalize this type parameter if it
-    // belongs to a mixin application class.
-    if (!type_parameter.IsFinalized()) {
-      type_parameter.set_index(type_parameter.index() + offset);
-      type_parameter.SetIsFinalized();
-    } else {
-      ASSERT(cls.IsMixinApplication());
-    }
+    type_parameter.set_index(type_parameter.index() + offset);
+    type_parameter.SetIsFinalized();
 
     if (FLAG_trace_type_finalization) {
       THR_Print("Done finalizing type parameter '%s' with index %" Pd "\n",
@@ -1350,17 +798,6 @@
     type.SetIsFinalized();
   }
 
-  // If we are done finalizing a graph of mutually recursive types, check their
-  // bounds.
-  if (is_root_type && !FLAG_strong) {
-    for (intptr_t i = pending_types->length() - 1; i >= 0; i--) {
-      const AbstractType& type = pending_types->At(i);
-      if (!type.IsMalformed() && !type.IsCanonical()) {
-        CheckTypeBounds(cls, type);
-      }
-    }
-  }
-
   if (FLAG_trace_type_finalization) {
     THR_Print("Done finalizing type '%s' with %" Pd " type args: %s\n",
               String::Handle(zone, type.Name()).ToCString(),
@@ -1383,46 +820,6 @@
   }
 }
 
-void ClassFinalizer::ResolveSignature(const Class& cls,
-                                      const Function& function) {
-  AbstractType& type = AbstractType::Handle();
-  // Resolve upper bounds of function type parameters.
-  const intptr_t num_type_params = function.NumTypeParameters();
-  if (num_type_params > 0) {
-    TypeParameter& type_param = TypeParameter::Handle();
-    const TypeArguments& type_params =
-        TypeArguments::Handle(function.type_parameters());
-    for (intptr_t i = 0; i < num_type_params; i++) {
-      type_param ^= type_params.TypeAt(i);
-      type = type_param.bound();
-      ResolveType(cls, type);
-      if (type.IsFunctionType()) {
-        const Function& signature_function =
-            Function::Handle(Type::Cast(type).signature());
-        if (signature_function.IsGeneric()) {
-          const String& type_name = String::Handle(type.UserVisibleName());
-          const String& type_param_name = String::Handle(type_param.name());
-          ReportError(cls, type.token_pos(),
-                      "generic function type '%s' not allowed as bound of "
-                      "function type parameter '%s'",
-                      type_name.ToCString(), type_param_name.ToCString());
-        }
-      }
-    }
-  }
-  // Resolve result type.
-  type = function.result_type();
-  // It is not a compile time error if this name does not resolve to a class or
-  // interface.
-  ResolveType(cls, type);
-  // Resolve formal parameter types.
-  const intptr_t num_parameters = function.NumParameters();
-  for (intptr_t i = 0; i < num_parameters; i++) {
-    type = function.ParameterTypeAt(i);
-    ResolveType(cls, type);
-  }
-}
-
 void ClassFinalizer::FinalizeSignature(const Class& cls,
                                        const Function& function,
                                        FinalizationKind finalization) {
@@ -1467,36 +864,6 @@
   }
 }
 
-// Resolve the upper bounds of the type parameters of class cls.
-void ClassFinalizer::ResolveUpperBounds(const Class& cls) {
-  const intptr_t num_type_params = cls.NumTypeParameters();
-  TypeParameter& type_param = TypeParameter::Handle();
-  AbstractType& bound = AbstractType::Handle();
-  const TypeArguments& type_params =
-      TypeArguments::Handle(cls.type_parameters());
-  ASSERT((type_params.IsNull() && (num_type_params == 0)) ||
-         (type_params.Length() == num_type_params));
-  // In a first pass, resolve all bounds. This guarantees that finalization
-  // of mutually referencing bounds will not encounter an unresolved bound.
-  for (intptr_t i = 0; i < num_type_params; i++) {
-    type_param ^= type_params.TypeAt(i);
-    bound = type_param.bound();
-    ResolveType(cls, bound);
-    if (bound.IsFunctionType()) {
-      const Function& signature_function =
-          Function::Handle(Type::Cast(bound).signature());
-      if (signature_function.IsGeneric()) {
-        const String& bound_name = String::Handle(bound.UserVisibleName());
-        const String& type_param_name = String::Handle(type_param.name());
-        ReportError(cls, bound.token_pos(),
-                    "generic function type '%s' not allowed as bound of "
-                    "class type parameter '%s'",
-                    bound_name.ToCString(), type_param_name.ToCString());
-      }
-    }
-  }
-}
-
 // Finalize the upper bounds of the type parameters of class cls.
 void ClassFinalizer::FinalizeUpperBounds(const Class& cls,
                                          FinalizationKind finalization) {
@@ -1510,6 +877,18 @@
   for (intptr_t i = 0; i < num_type_params; i++) {
     type_param ^= type_params.TypeAt(i);
     bound = type_param.bound();
+    if (bound.IsFunctionType()) {
+      const Function& signature_function =
+          Function::Handle(Type::Cast(bound).signature());
+      if (signature_function.IsGeneric()) {
+        const String& bound_name = String::Handle(bound.UserVisibleName());
+        const String& type_param_name = String::Handle(type_param.name());
+        ReportError(cls, bound.token_pos(),
+                    "generic function type '%s' not allowed as bound of "
+                    "class type parameter '%s'",
+                    bound_name.ToCString(), type_param_name.ToCString());
+      }
+    }
     // Bound may be finalized, but not canonical yet.
     if (bound.IsCanonical() || bound.IsBeingFinalized()) {
       // A bound involved in F-bounded quantification may form a cycle.
@@ -1539,7 +918,7 @@
 }
 #endif
 
-void ClassFinalizer::ResolveAndFinalizeMemberTypes(const Class& cls) {
+void ClassFinalizer::FinalizeMemberTypes(const Class& cls) {
   // Note that getters and setters are explicitly listed as such in the list of
   // functions of a class, so we do not need to consider fields as implicitly
   // generating getters and setters.
@@ -1559,14 +938,14 @@
   // - an instance field or instance getter conflicting with an inherited
   //   instance method.
 
-  // Resolve type of fields and check for conflicts in super classes.
+  // Finalize type of fields and check for conflicts in super classes.
   Isolate* isolate = Isolate::Current();
   Zone* zone = Thread::Current()->zone();
   Array& array = Array::Handle(zone, cls.fields());
   Field& field = Field::Handle(zone);
   AbstractType& type = AbstractType::Handle(zone);
   const intptr_t num_fields = array.Length();
-  const bool track_exactness = FLAG_strong && isolate->use_field_guards();
+  const bool track_exactness = isolate->use_field_guards();
   for (intptr_t i = 0; i < num_fields; i++) {
     field ^= array.At(i);
     type = field.type();
@@ -1577,7 +956,7 @@
           StaticTypeExactnessState::Unitialized());
     }
   }
-  // Resolve function signatures and check for conflicts in super classes and
+  // Finalize function signatures and check for conflicts in super classes and
   // interfaces.
   array = cls.functions();
   Function& function = Function::Handle(zone);
@@ -1590,706 +969,14 @@
     }
     if (function.is_static()) {
       if (function.IsRedirectingFactory()) {
-        // The function may be a still unresolved redirecting factory. Do not
-        // yet try to resolve it in order to avoid cycles in class finalization.
-        // However, the redirection type should be finalized.
-        // If the redirection type is from a deferred library and is not
-        // yet loaded, do not attempt to resolve.
         Type& type = Type::Handle(zone, function.RedirectionType());
-        if (IsLoaded(type)) {
-          type ^= FinalizeType(cls, type);
-          function.SetRedirectionType(type);
-        }
+        type ^= FinalizeType(cls, type);
+        function.SetRedirectionType(type);
       }
     }
   }
 }
 
-// Clone the type parameters of the super class and of the mixin class of this
-// mixin application class and use them as the type parameters of this mixin
-// application class. Set the type arguments of the super type, of the mixin
-// type (as well as of the interface type, which is identical to the mixin type)
-// to refer to the respective type parameters of the mixin application class.
-// In other words, decorate this mixin application class with type parameters
-// that forward to the super type and mixin type (and interface type).
-// Example:
-//   class S<T extends BT> { }
-//   class M<T extends BT> { }
-//   class C<E extends BE> extends S<E> with M<List<E>> { }
-// results in
-//   class S&M<T`, T extends BT> extends S<T`> implements M<T> { }
-//   class C<E extends BE> extends S&M<E, List<E>> { }
-// CloneMixinAppTypeParameters decorates class S&M with type parameters T` and
-// T, and use them as type arguments in S<T`> and M<T>.
-// Note that the bound BT on T of S is not applied to T` of S&M. However, the
-// bound BT on T of M is applied to T of S&M. See comments below.
-void ClassFinalizer::CloneMixinAppTypeParameters(const Class& mixin_app_class) {
-  ASSERT(mixin_app_class.type_parameters() == TypeArguments::null());
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const AbstractType& super_type =
-      AbstractType::Handle(zone, mixin_app_class.super_type());
-  ASSERT(super_type.IsResolved());
-  const Class& super_class = Class::Handle(zone, super_type.type_class());
-  const intptr_t num_super_type_params = super_class.NumTypeParameters();
-  const Type& mixin_type = Type::Handle(zone, mixin_app_class.mixin());
-  const Class& mixin_class = Class::Handle(zone, mixin_type.type_class());
-  const intptr_t num_mixin_type_params = mixin_class.NumTypeParameters();
-
-  // The mixin type (in raw form) should have been added to the interfaces
-  // implemented by the mixin application class. This is necessary so that cycle
-  // check works at compile time (type arguments are ignored) and so that
-  // type tests work at runtime (by then, type arguments will have been set, see
-  // below).
-  ASSERT(mixin_app_class.interfaces() != Object::empty_array().raw());
-
-  // If both the super type and the mixin type are non generic, the mixin
-  // application class is non generic as well and we can skip type parameter
-  // cloning.
-  TypeArguments& instantiator = TypeArguments::Handle(zone);
-  if ((num_super_type_params + num_mixin_type_params) > 0) {
-    // If the last ampersand in the name of the mixin application class is
-    // doubled, the same type parameters can propagate the type arguments to
-    // the super type and to the mixin type.
-    bool share_type_params = false;
-    if (num_super_type_params == num_mixin_type_params) {
-      const String& name = String::Handle(zone, mixin_app_class.Name());
-      for (intptr_t i = name.Length() - 1; i > 0; --i) {
-        if (name.CharAt(i) == '&') {
-          if (name.CharAt(i - 1) == '&') {
-            share_type_params = true;
-          }
-          break;
-        }
-      }
-    }
-
-    const TypeArguments& cloned_type_params = TypeArguments::Handle(
-        zone,
-        TypeArguments::New((share_type_params ? 0 : num_super_type_params) +
-                           num_mixin_type_params));
-    TypeParameter& param = TypeParameter::Handle(zone);
-    TypeParameter& cloned_param = TypeParameter::Handle(zone);
-    String& param_name = String::Handle(zone);
-    AbstractType& param_bound = AbstractType::Handle(zone);
-    Function& null_function = Function::Handle(zone);
-    intptr_t cloned_index = 0;
-
-    // First, clone the super class type parameters. Rename them so that
-    // there can be no name conflict between the parameters of the super
-    // class and the mixin class.
-    if (!share_type_params && (num_super_type_params > 0)) {
-      const TypeArguments& super_type_params =
-          TypeArguments::Handle(zone, super_class.type_parameters());
-      const TypeArguments& super_type_args = TypeArguments::Handle(
-          zone, TypeArguments::New(num_super_type_params));
-      // The cloned super class type parameters do not need to repeat their
-      // bounds, since the bound checks will be performed at the super class
-      // level. As a consequence, if this mixin application is used itself as a
-      // mixin in another mixin application, the bounds will be ignored, which
-      // is correct, because the other mixin application does not inherit from
-      // the super class of its mixin. Note also that the other mixin
-      // application will only mixin the last mixin type listed in the first
-      // mixin application it is mixing in.
-      param_bound = thread->isolate()->object_store()->object_type();
-      for (intptr_t i = 0; i < num_super_type_params; i++) {
-        param ^= super_type_params.TypeAt(i);
-        param_name = param.name();
-        param_name =
-            Symbols::FromConcat(thread, param_name, Symbols::Backtick());
-        cloned_param =
-            TypeParameter::New(mixin_app_class, null_function, cloned_index,
-                               param_name, param_bound, param.token_pos());
-        cloned_type_params.SetTypeAt(cloned_index, cloned_param);
-        // Change the type arguments of the super type to refer to the
-        // cloned type parameters of the mixin application class.
-        super_type_args.SetTypeAt(cloned_index, cloned_param);
-        cloned_index++;
-      }
-      // The super type may have a BoundedType as type argument, but cannot be
-      // a BoundedType itself.
-      Type::Cast(super_type).set_arguments(super_type_args);
-      ASSERT(!super_type.IsFinalized());
-    }
-
-    // Second, clone the type parameters of the mixin class.
-    // We need to retain the parameter names of the mixin class
-    // since the code that will be compiled in the context of the
-    // mixin application class may refer to the type parameters
-    // with that name. We also retain the type parameter bounds.
-    if (num_mixin_type_params > 0) {
-      const TypeArguments& mixin_params =
-          TypeArguments::Handle(zone, mixin_class.type_parameters());
-      const intptr_t offset =
-          mixin_class.NumTypeArguments() - mixin_class.NumTypeParameters();
-      const TypeArguments& mixin_type_args = TypeArguments::Handle(
-          zone, TypeArguments::New(num_mixin_type_params));
-      instantiator ^= TypeArguments::New(offset + num_mixin_type_params);
-      bool has_uninstantiated_bounds = false;
-      for (intptr_t i = 0; i < num_mixin_type_params; i++) {
-        param ^= mixin_params.TypeAt(i);
-        param_name = param.name();
-        param_bound = param.bound();  // The bound will be adjusted below.
-        if (!param_bound.IsInstantiated()) {
-          has_uninstantiated_bounds = true;
-        }
-        cloned_param =
-            TypeParameter::New(mixin_app_class, null_function,
-                               cloned_index,  // Unfinalized index.
-                               param_name, param_bound, param.token_pos());
-        cloned_type_params.SetTypeAt(cloned_index, cloned_param);
-        mixin_type_args.SetTypeAt(i, cloned_param);  // Unfinalized length.
-        instantiator.SetTypeAt(offset + i, cloned_param);  // Finalized length.
-        cloned_index++;
-      }
-
-      // Third, replace the type parameters appearing in the bounds of the mixin
-      // type parameters, if any, by the cloned type parameters. This can be
-      // done by instantiating each bound using the instantiator built above.
-      // If the mixin class extends a generic super class, its first finalized
-      // type parameter has a non-zero index, therefore, the instantiator
-      // requires shifting by the offset calculated above.
-      // Unfinalized type parameters replace finalized type parameters, which
-      // is not a problem since they will get finalized shortly as the mixin
-      // application class gets finalized.
-      if (has_uninstantiated_bounds) {
-        Error& bound_error = Error::Handle(zone);
-        for (intptr_t i = 0; i < num_mixin_type_params; i++) {
-          param ^= mixin_type_args.TypeAt(i);
-          param_bound = param.bound();
-          if (!param_bound.IsInstantiated()) {
-            // Make sure the bound is finalized before instantiating it.
-            if (!param_bound.IsFinalized() && !param_bound.IsBeingFinalized()) {
-              param_bound = FinalizeType(mixin_app_class, param_bound);
-              param.set_bound(param_bound);  // In case part of recursive type.
-            }
-            param_bound = param_bound.InstantiateFrom(
-                instantiator, Object::null_type_arguments(), kNoneFree,
-                &bound_error, NULL, NULL, Heap::kOld);
-            // The instantiator contains only TypeParameter objects and no
-            // BoundedType objects, so no bound error may occur.
-            ASSERT(!param_bound.IsBoundedType());
-            ASSERT(bound_error.IsNull());
-            ASSERT(!param_bound.IsInstantiated());
-            param.set_bound(param_bound);
-          }
-        }
-      }
-
-      // Lastly, set the type arguments of the mixin type, which is also the
-      // single interface type.
-      ASSERT(!mixin_type.IsFinalized());
-      mixin_type.set_arguments(mixin_type_args);
-      if (share_type_params) {
-        Type::Cast(super_type).set_arguments(mixin_type_args);
-        ASSERT(!super_type.IsFinalized());
-      }
-    }
-    mixin_app_class.set_type_parameters(cloned_type_params);
-  }
-  // If the mixin class is a mixin application alias class, we insert a new
-  // synthesized mixin application class in the super chain of this mixin
-  // application class. The new class will have the aliased mixin as actual
-  // mixin.
-  if (mixin_class.is_mixin_app_alias()) {
-    ApplyMixinAppAlias(mixin_app_class, instantiator);
-  }
-}
-
-/* Support for mixin alias.
-Consider the following example:
-
-class I<T> { }
-class J<T> { }
-class S<T extends num> { }
-class M<T extends Map> { }
-class A<U, V extends List> = Object with M<Map<U, V>> implements I<V>;
-class C<T, K extends T> = S<T> with A<T, List<K>> implements J<K>;
-
-Before the call to ApplyMixinAppAlias, the VM has already synthesized 2 mixin
-application classes Object&M and S&A:
-
-Object&M<T extends Map> extends Object implements M<T> {
-  ... members of M applied here ...
-}
-A<U, V extends List> extends Object&M<Map<U, V>> implements I<V> { }
-
-S&A<T`, U, V extends List> extends S<T`> implements A<U, V> {
-  ... members of A applied here, but A has no members ...
-}
-C<T, K extends T> extends S&A<T, T, List<K>> implements J<K> { }
-
-In theory, class A should be an alias of Object&M instead of extending it.
-In practice, the additional class provides a hook for implemented interfaces
-(e.g. I<V>) and for type argument substitution via the super type relation (e.g.
-type parameter T of Object&M is substituted with Map<U, V>, U and V being the
-type parameters of the alias A).
-
-Similarly, class C should be an alias of S&A instead of extending it.
-
-Now, A does not have any members to be mixed into S&A, because A is an alias.
-The members to be mixed in are actually those of M, and they should appear in a
-scope where the type parameter T is visible. The class S&A declares the type
-parameters of A, i.e. U and V, but not T.
-
-Therefore, the call to ApplyMixinAppAlias inserts another synthesized class S&A`
-as the superclass of S&A. The class S&A` declares a type argument T:
-
-Instead of
-S&A<T`, U, V extends List> extends S<T`> implements A<U, V> { }
-
-We now have:
-S&A`<T`, T extends Map> extends S<T`> implements M<T> {
-  ... members of M applied here ...
-}
-S&A<T`, U, V extends List> extends S&A`<T`, Map<U, V>> implements A<U, V> { }
-
-The main implementation difficulty resides in the fact that the type parameters
-U and V in the super type S&A`<T`, Map<U, V>> of S&A must refer to the type
-parameters U and V of S&A. However, Map<U, V> is copied from the super type
-Object&M<Map<U, V>> of A and, therefore, U and V refer to A. An instantiation
-step with a properly crafted instantiator vector takes care of the required type
-parameter substitution.
-The instantiator vector must end with the type parameters U and V of S&A.
-The offset in the instantiator of the type parameter U of S&A must be at the
-finalized index of type parameter U of A.
-
-The same instantiator vector is used to adjust the type parameter bounds on U
-and V, if any. This step is done in CloneMixinAppTypeParameters above, and the
-already built instantiator is passed here.
-
-Also, a possible bound on type parameter T of M must be applied to type
-parameter T of S&A`. If the bound is uninstantiated, i.e. if it refers to T or
-other type parameters of M, an instantiation step is required to substitute
-these type parameters of M with type parameters of S&A`.
-The instantiator vector consists of the cloned type parameters of M shifted by
-an offset corresponding to the finalized index of the first type parameter of M.
-This is done in the recursive call to CloneMixinAppTypeParameters and does not
-require specific code in ApplyMixinAppAlias.
-*/
-void ClassFinalizer::ApplyMixinAppAlias(const Class& mixin_app_class,
-                                        const TypeArguments& instantiator) {
-  // If this mixin alias is aliasing another mixin alias, another class
-  // will be inserted via recursion. No need to check here.
-  // The mixin type may or may not be finalized yet.
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  AbstractType& super_type =
-      AbstractType::Handle(zone, mixin_app_class.super_type());
-  const Type& mixin_type = Type::Handle(zone, mixin_app_class.mixin());
-  const Class& mixin_class = Class::Handle(zone, mixin_type.type_class());
-  ASSERT(mixin_class.is_mixin_app_alias());
-  const Class& aliased_mixin_app_class =
-      Class::Handle(zone, mixin_class.SuperClass());
-  // Note that the super class of aliased_mixin_app_class can itself be a
-  // mixin application class (this happens if the alias is mixing more than one
-  // type). Instead of trying to recursively insert yet another class as the
-  // super class of this inserted class, we apply the composition rules of the
-  // spec and only mixin the members of aliased_mixin_app_class, not those of
-  // its super class. In other words, we only mixin the last mixin of the alias.
-  const Type& aliased_mixin_type =
-      Type::Handle(zone, aliased_mixin_app_class.mixin());
-  // The name of the inserted mixin application class is the name of mixin
-  // class name with a backtick added.
-  String& inserted_class_name = String::Handle(zone, mixin_app_class.Name());
-  inserted_class_name =
-      String::Concat(inserted_class_name, Symbols::Backtick());
-  const Library& library = Library::Handle(zone, mixin_app_class.library());
-  Class& inserted_class =
-      Class::Handle(zone, library.LookupLocalClass(inserted_class_name));
-  if (inserted_class.IsNull()) {
-    inserted_class_name = Symbols::New(thread, inserted_class_name);
-    const Script& script = Script::Handle(zone, mixin_app_class.script());
-    inserted_class = Class::New(library, inserted_class_name, script,
-                                mixin_app_class.token_pos());
-    inserted_class.set_is_synthesized_class();
-    library.AddClass(inserted_class);
-
-    if (FLAG_trace_class_finalization) {
-      THR_Print("Creating mixin application alias %s\n",
-                inserted_class.ToCString());
-    }
-
-    // The super type of the inserted class is identical to the super type of
-    // this mixin application class, except that it must refer to the type
-    // parameters of the inserted class rather than to those of the mixin
-    // application class.
-    // The type arguments of the super type will be set properly when calling
-    // CloneMixinAppTypeParameters on the inserted class, as long as the super
-    // type class is set properly.
-    inserted_class.set_super_type(super_type);  // Super class only is used.
-
-    // The mixin type and interface type must also be set before calling
-    // CloneMixinAppTypeParameters.
-    // After FinalizeTypesInClass, if the mixin type and interface type are
-    // generic, their type arguments will refer to the type parameters of
-    // inserted_class.
-    const Type& inserted_class_mixin_type = Type::Handle(
-        zone, Type::New(Class::Handle(zone, aliased_mixin_type.type_class()),
-                        Object::null_type_arguments(),
-                        aliased_mixin_type.token_pos()));
-    inserted_class.set_mixin(inserted_class_mixin_type);
-    // Add the mixin type to the list of interfaces that the mixin application
-    // class implements. This is necessary so that cycle check work at
-    // compile time (type arguments are ignored by that check).
-    const Array& interfaces = Array::Handle(Array::New(1));
-    interfaces.SetAt(0, inserted_class_mixin_type);
-    ASSERT(inserted_class.interfaces() == Object::empty_array().raw());
-    inserted_class.set_interfaces(interfaces);
-    // The type arguments of the interface, if any, will be set in
-    // CloneMixinAppTypeParameters, which is called indirectly from
-    // FinalizeTypesInClass below.
-  }
-
-  // Finalize the types and call CloneMixinAppTypeParameters.
-  FinalizeTypesInClass(inserted_class);
-
-  // The super type of this mixin application class must point to the
-  // inserted class. The super type arguments are the concatenation of the
-  // old super type arguments (propagating type arguments to the super class)
-  // with new type arguments providing type arguments to the mixin.
-  // The appended type arguments are those of the super type of the mixin
-  // application alias that are forwarding to the aliased mixin type, except
-  // that they must refer to the type parameters of the mixin application
-  // class rather than to those of the mixin application alias class.
-  // This type parameter substitution is performed by an instantiation step.
-  // It is important that the type parameters of the mixin application class
-  // are not finalized yet, because new type parameters may have been added
-  // to the super class.
-  const Class& super_class = Class::Handle(zone, super_type.type_class());
-  ASSERT(mixin_app_class.SuperClass() == super_class.raw());  // Will change.
-  const intptr_t num_super_type_params = super_class.NumTypeParameters();
-  AbstractType& type = AbstractType::Handle(zone);
-  // The instantiator is mapping finalized type parameters of mixin_class to
-  // unfinalized type parameters of mixin_app_class. Therefore, the type
-  // arguments of mixin_class_super_type must be finalized, since they get
-  // instantiated by this instantiator. Finalizing the types in mixin_class
-  // will finalize mixin_class_super_type.
-  // The aliased_mixin_type does not need to be finalized, but only resolved.
-  ASSERT(aliased_mixin_type.IsResolved());
-  const Class& aliased_mixin_type_class =
-      Class::Handle(zone, aliased_mixin_type.type_class());
-  FinalizeTypesInClass(mixin_class);
-  const intptr_t num_aliased_mixin_type_params =
-      aliased_mixin_type_class.NumTypeParameters();
-  ASSERT(inserted_class.NumTypeParameters() ==
-         (num_super_type_params + num_aliased_mixin_type_params));
-  const AbstractType& mixin_class_super_type =
-      AbstractType::Handle(zone, mixin_class.super_type());
-  ASSERT(mixin_class_super_type.IsFinalized());
-  // The aliased_mixin_type may be raw.
-  const TypeArguments& mixin_class_super_type_args =
-      TypeArguments::Handle(zone, mixin_class_super_type.arguments());
-  TypeArguments& new_mixin_type_args = TypeArguments::Handle(zone);
-  if ((num_aliased_mixin_type_params > 0) &&
-      !mixin_class_super_type_args.IsNull()) {
-    new_mixin_type_args = TypeArguments::New(num_aliased_mixin_type_params);
-    AbstractType& bounded_type = AbstractType::Handle(zone);
-    AbstractType& upper_bound = AbstractType::Handle(zone);
-    TypeParameter& type_parameter = TypeParameter::Handle(zone);
-    Error& bound_error = Error::Handle(zone);
-    const intptr_t offset =
-        mixin_class_super_type_args.Length() - num_aliased_mixin_type_params;
-    for (intptr_t i = 0; i < num_aliased_mixin_type_params; i++) {
-      type = mixin_class_super_type_args.TypeAt(offset + i);
-      if (!type.IsInstantiated()) {
-        // In the presence of bounds, the bounded type and the upper bound must
-        // be instantiated separately. Instantiating a BoundedType would wrap
-        // the BoundedType in another BoundedType.
-        if (type.IsBoundedType()) {
-          bounded_type = BoundedType::Cast(type).type();
-          bounded_type = bounded_type.InstantiateFrom(
-              instantiator, Object::null_type_arguments(), kNoneFree,
-              &bound_error, NULL, NULL, Heap::kOld);
-          // The instantiator contains only TypeParameter objects and no
-          // BoundedType objects, so no bound error may occur.
-          ASSERT(bound_error.IsNull());
-          upper_bound = BoundedType::Cast(type).bound();
-          upper_bound = upper_bound.InstantiateFrom(
-              instantiator, Object::null_type_arguments(), kNoneFree,
-              &bound_error, NULL, NULL, Heap::kOld);
-          ASSERT(bound_error.IsNull());
-          type_parameter = BoundedType::Cast(type).type_parameter();
-          // The type parameter that declared the bound does not change.
-          type = BoundedType::New(bounded_type, upper_bound, type_parameter);
-        } else {
-          type = type.InstantiateFrom(instantiator,
-                                      Object::null_type_arguments(), kNoneFree,
-                                      &bound_error, NULL, NULL, Heap::kOld);
-          ASSERT(bound_error.IsNull());
-        }
-      }
-      new_mixin_type_args.SetTypeAt(i, type);
-    }
-  }
-  TypeArguments& new_super_type_args = TypeArguments::Handle(zone);
-  if ((num_super_type_params + num_aliased_mixin_type_params) > 0) {
-    new_super_type_args = TypeArguments::New(num_super_type_params +
-                                             num_aliased_mixin_type_params);
-    const TypeArguments& type_params =
-        TypeArguments::Handle(zone, mixin_app_class.type_parameters());
-    for (intptr_t i = 0; i < num_super_type_params; i++) {
-      type = type_params.TypeAt(i);
-      new_super_type_args.SetTypeAt(i, type);
-    }
-    for (intptr_t i = 0; i < num_aliased_mixin_type_params; i++) {
-      if (new_mixin_type_args.IsNull()) {
-        type = Type::DynamicType();
-      } else {
-        type = new_mixin_type_args.TypeAt(i);
-      }
-      new_super_type_args.SetTypeAt(num_super_type_params + i, type);
-    }
-  }
-  super_type = Type::New(inserted_class, new_super_type_args,
-                         mixin_app_class.token_pos());
-  mixin_app_class.set_super_type(super_type);
-
-  // Mark this mixin application class as being an alias.
-  mixin_app_class.set_is_mixin_app_alias();
-  ASSERT(!mixin_app_class.is_type_finalized());
-  ASSERT(!mixin_app_class.is_mixin_type_applied());
-  if (FLAG_trace_class_finalization) {
-    THR_Print(
-        "Inserting class '%s' %s\n"
-        "  as super type '%s' with %" Pd
-        " type args: %s\n"
-        "  of mixin application alias '%s' %s\n",
-        String::Handle(inserted_class.Name()).ToCString(),
-        TypeArguments::Handle(inserted_class.type_parameters()).ToCString(),
-        String::Handle(zone, super_type.Name()).ToCString(),
-        num_super_type_params + num_aliased_mixin_type_params,
-        super_type.ToCString(),
-        String::Handle(mixin_app_class.Name()).ToCString(),
-        TypeArguments::Handle(mixin_app_class.type_parameters()).ToCString());
-  }
-}
-
-void ClassFinalizer::ApplyMixinType(const Class& mixin_app_class,
-                                    PendingTypes* pending_types) {
-  if (mixin_app_class.is_mixin_type_applied()) {
-    return;
-  }
-  Type& mixin_type = Type::Handle(mixin_app_class.mixin());
-  ASSERT(!mixin_type.IsNull());
-  ASSERT(mixin_type.HasResolvedTypeClass());
-  const Class& mixin_class = Class::Handle(mixin_type.type_class());
-
-  if (FLAG_trace_class_finalization) {
-    THR_Print("Applying mixin type '%s' to %s at pos %s\n",
-              String::Handle(mixin_type.Name()).ToCString(),
-              mixin_app_class.ToCString(),
-              mixin_app_class.token_pos().ToCString());
-  }
-
-  // Check for illegal self references.
-  GrowableArray<intptr_t> visited_mixins;
-  if (!IsMixinCycleFree(mixin_class, &visited_mixins)) {
-    const String& class_name = String::Handle(mixin_class.Name());
-    ReportError(mixin_class, mixin_class.token_pos(),
-                "mixin class '%s' illegally refers to itself",
-                class_name.ToCString());
-  }
-
-  // Copy type parameters to mixin application class.
-  CloneMixinAppTypeParameters(mixin_app_class);
-
-  // Verify that no restricted class is used as a mixin by checking the
-  // interfaces of the mixin application class, which implements its mixin.
-  GrowableArray<intptr_t> visited_interfaces;
-  ResolveSuperTypeAndInterfaces(mixin_app_class, &visited_interfaces);
-
-  if (FLAG_trace_class_finalization) {
-    THR_Print(
-        "Done applying mixin type '%s' to class '%s' %s extending '%s'\n",
-        String::Handle(mixin_type.Name()).ToCString(),
-        String::Handle(mixin_app_class.Name()).ToCString(),
-        TypeArguments::Handle(mixin_app_class.type_parameters()).ToCString(),
-        AbstractType::Handle(mixin_app_class.super_type()).ToCString());
-  }
-  // Mark the application class as having been applied its mixin type in order
-  // to avoid cycles while finalizing its mixin type.
-  mixin_app_class.set_is_mixin_type_applied();
-  // Finalize the mixin type, which may have been changed in case
-  // mixin_app_class is an alias.
-  mixin_type = mixin_app_class.mixin();
-  ASSERT(!mixin_type.IsBeingFinalized());
-  mixin_type ^=
-      FinalizeType(mixin_app_class, mixin_type, kFinalize, pending_types);
-  // The mixin type cannot be malbounded, since it merely substitutes the
-  // type parameters of the mixin class with those of the mixin application
-  // class, but it does not instantiate them.
-  ASSERT(!mixin_type.IsMalbounded());
-  mixin_app_class.set_mixin(mixin_type);
-}
-
-void ClassFinalizer::CreateForwardingConstructors(
-    const Class& mixin_app,
-    const Class& mixin_cls,
-    const GrowableObjectArray& cloned_funcs) {
-  Thread* T = Thread::Current();
-  Zone* Z = T->zone();
-  const String& mixin_name = String::Handle(Z, mixin_app.Name());
-  const Class& super_class = Class::Handle(Z, mixin_app.SuperClass());
-  const String& super_name = String::Handle(Z, super_class.Name());
-  const Array& functions = Array::Handle(Z, super_class.functions());
-  const intptr_t num_functions = functions.Length();
-  Function& func = Function::Handle(Z);
-  for (intptr_t i = 0; i < num_functions; i++) {
-    func ^= functions.At(i);
-    if (func.IsGenerativeConstructor()) {
-      // Build constructor name from mixin application class name
-      // and name of cloned super class constructor.
-      const String& ctor_name = String::Handle(Z, func.name());
-      String& clone_name =
-          String::Handle(Z, String::SubString(ctor_name, super_name.Length()));
-      clone_name = Symbols::FromConcat(T, mixin_name, clone_name);
-
-      if (FLAG_trace_class_finalization) {
-        THR_Print("Cloning constructor '%s' as '%s'\n", ctor_name.ToCString(),
-                  clone_name.ToCString());
-      }
-
-      // The owner of the forwarding constructor is the mixin application
-      // class. The source is the mixin class. The source may be needed
-      // to parse field initializer expressions in the mixin class.
-      const PatchClass& owner =
-          PatchClass::Handle(Z, PatchClass::New(mixin_app, mixin_cls));
-
-      const Function& clone = Function::Handle(
-          Z, Function::New(clone_name, func.kind(), func.is_static(),
-                           false,  // Not const.
-                           false,  // Not abstract.
-                           false,  // Not external.
-                           false,  // Not native.
-                           owner, mixin_cls.token_pos()));
-      clone.set_num_fixed_parameters(func.num_fixed_parameters());
-      clone.SetNumOptionalParameters(func.NumOptionalParameters(),
-                                     func.HasOptionalPositionalParameters());
-      clone.set_result_type(Object::dynamic_type());
-      clone.set_is_debuggable(false);
-
-      const intptr_t num_parameters = func.NumParameters();
-      // The cloned ctor shares the parameter names array with the
-      // original.
-      const Array& parameter_names = Array::Handle(Z, func.parameter_names());
-      ASSERT(parameter_names.Length() == num_parameters);
-      clone.set_parameter_names(parameter_names);
-      // The parameter types of the cloned constructor are 'dynamic'.
-      clone.set_parameter_types(Array::Handle(Z, Array::New(num_parameters)));
-      for (intptr_t n = 0; n < num_parameters; n++) {
-        clone.SetParameterTypeAt(n, Object::dynamic_type());
-      }
-      cloned_funcs.Add(clone);
-    }
-  }
-}
-
-void ClassFinalizer::ApplyMixinMembers(const Class& cls) {
-  Zone* zone = Thread::Current()->zone();
-  const Type& mixin_type = Type::Handle(zone, cls.mixin());
-  ASSERT(!mixin_type.IsNull());
-  ASSERT(mixin_type.HasResolvedTypeClass());
-  const Class& mixin_cls = Class::Handle(zone, mixin_type.type_class());
-  FinalizeClass(mixin_cls);
-  // If the mixin is a mixin application alias class, there are no members to
-  // apply here. A new synthesized class representing the aliased mixin
-  // application class was inserted in the super chain of this mixin application
-  // class. Members of the actual mixin class will be applied when visiting
-  // the mixin application class referring to the actual mixin.
-  ASSERT(!mixin_cls.is_mixin_app_alias() ||
-         Class::Handle(zone, cls.SuperClass()).IsMixinApplication());
-  // A default constructor will be created for the mixin app alias class.
-
-  if (FLAG_trace_class_finalization) {
-    THR_Print("Applying mixin members of %s to %s at pos %s\n",
-              mixin_cls.ToCString(), cls.ToCString(),
-              cls.token_pos().ToCString());
-  }
-
-  const GrowableObjectArray& cloned_funcs =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-
-  Array& functions = Array::Handle(zone);
-  Function& func = Function::Handle(zone);
-
-  // The parser creates the mixin application class with no functions.
-  // But the Kernel frontend will generate mixin classes with only
-  // constructors inside them, which forward to the base class constructors.
-  //
-  // => We generate the constructors if they are not already there.
-  functions = cls.functions();
-  if (functions.Length() == 0) {
-    CreateForwardingConstructors(cls, mixin_cls, cloned_funcs);
-  } else {
-    for (intptr_t i = 0; i < functions.Length(); i++) {
-      func ^= functions.At(i);
-      ASSERT(func.kernel_offset() > 0);
-      cloned_funcs.Add(func);
-    }
-  }
-
-  // Now clone the functions from the mixin class.
-  const Library& from_library = Library::Handle(zone, mixin_cls.library());
-  const Library& to_library = Library::Handle(zone, cls.library());
-  Function& from_func = Function::Handle(zone);
-
-  functions = mixin_cls.functions();
-  const intptr_t num_functions = functions.Length();
-  for (intptr_t i = 0; i < num_functions; i++) {
-    from_func ^= functions.At(i);
-    if (from_func.IsGenerativeConstructor()) {
-      // A mixin class must not have explicit constructors.
-      if (!from_func.IsImplicitConstructor()) {
-        const Script& script = Script::Handle(cls.script());
-        const Error& error = Error::Handle(LanguageError::NewFormatted(
-            Error::Handle(), script, from_func.token_pos(), Report::AtLocation,
-            Report::kError, Heap::kNew,
-            "constructor '%s' is illegal in mixin class %s",
-            String::Handle(from_func.UserVisibleName()).ToCString(),
-            String::Handle(zone, mixin_cls.Name()).ToCString()));
-
-        ReportErrors(error, cls, cls.token_pos(),
-                     "mixin class '%s' must not have constructors",
-                     String::Handle(zone, mixin_cls.Name()).ToCString());
-      }
-      continue;  // Skip the implicit constructor.
-    }
-    if (!from_func.is_static() && !from_func.IsMethodExtractor() &&
-        !from_func.IsNoSuchMethodDispatcher() &&
-        !from_func.IsInvokeFieldDispatcher()) {
-      func = from_func.Clone(cls);
-      to_library.CloneMetadataFrom(from_library, from_func, func);
-      cloned_funcs.Add(func);
-    }
-  }
-  functions = Array::MakeFixedLength(cloned_funcs);
-  cls.SetFunctions(functions);
-
-  // Now clone the fields from the mixin class. There should be no
-  // existing fields in the mixin application class.
-  ASSERT(Array::Handle(cls.fields()).Length() == 0);
-  const Array& fields = Array::Handle(zone, mixin_cls.fields());
-  const intptr_t num_fields = fields.Length();
-  Field& field = Field::Handle(zone);
-  GrowableArray<const Field*> cloned_fields(num_fields);
-  for (intptr_t i = 0; i < num_fields; i++) {
-    field ^= fields.At(i);
-    // Static fields are shared between the mixin class and the mixin
-    // application class.
-    if (!field.is_static()) {
-      const Field& cloned = Field::ZoneHandle(zone, field.Clone(cls));
-      cloned_fields.Add(&cloned);
-    }
-  }
-  cls.AddFields(cloned_fields);
-
-  if (FLAG_trace_class_finalization) {
-    THR_Print("Done applying mixin members of %s to %s\n",
-              mixin_cls.ToCString(), cls.ToCString());
-  }
-}
-
 void ClassFinalizer::FinalizeTypesInClass(const Class& cls) {
   Thread* thread = Thread::Current();
   HANDLESCOPE(thread);
@@ -2314,31 +1001,13 @@
   FinalizeTypeParameters(cls);  // May change super type while applying mixin.
   super_class = cls.SuperClass();  // Get again possibly changed super class.
   ASSERT(super_class.IsNull() || super_class.is_type_finalized());
-  // Only resolving rather than finalizing the upper bounds here would result in
-  // instantiated type parameters of the super type to temporarily have
-  // unfinalized bounds. It is more efficient to finalize them early.
-  // Finalize bounds even if running in production mode, so that a snapshot
-  // contains them.
   FinalizeUpperBounds(cls);
   // Finalize super type.
   AbstractType& super_type = AbstractType::Handle(cls.super_type());
   if (!super_type.IsNull()) {
-    // In case of a bound error in the super type in production mode, the
-    // finalized super type will have a BoundedType as type argument for the
-    // out of bound type argument.
-    // It should not be a problem if the class is written to a snapshot and
-    // later executed in checked mode. Note that the finalized type argument
-    // vector of any type of the base class will contain a BoundedType for the
-    // out of bound type argument.
     super_type = FinalizeType(cls, super_type);
     cls.set_super_type(super_type);
   }
-  // Finalize mixin type.
-  Type& mixin_type = Type::Handle(cls.mixin());
-  if (!mixin_type.IsNull()) {
-    mixin_type ^= FinalizeType(cls, mixin_type);
-    cls.set_mixin(mixin_type);
-  }
   if (cls.IsTypedefClass()) {
     Function& signature = Function::Handle(cls.signature_function());
     Type& type = Type::Handle(signature.SignatureType());
@@ -2354,12 +1023,12 @@
     }
     cls.set_is_type_finalized();
 
-    // Resolve and finalize the result and parameter types of the signature
+    // Finalize the result and parameter types of the signature
     // function of this typedef class.
     FinalizeSignature(cls, signature);  // Does not modify signature type.
     ASSERT(signature.SignatureType() == type.raw());
 
-    // Resolve and finalize the signature type of this typedef.
+    // Finalize the signature type of this typedef.
     type ^= FinalizeType(cls, type);
     ASSERT(type.type_class() == cls.raw());
 
@@ -2409,8 +1078,6 @@
       }
     }
   }
-  // Mark as type finalized before resolving type parameter upper bounds
-  // in order to break cycles.
   cls.set_is_type_finalized();
 
   // Add this class to the direct subclasses of the superclass, unless the
@@ -2443,33 +1110,9 @@
     }
   }
 
-  // A top level class is parsed eagerly so just finalize it.
+  // A top level class is loaded eagerly so just finalize it.
   if (cls.IsTopLevel()) {
     FinalizeClass(cls);
-  } else {
-    // This class should not contain any functions or user-defined fields yet,
-    // because it has not been compiled yet. There may however be metadata
-    // fields because type parameters are parsed before the class body. Since
-    // 'ResolveAndFinalizeMemberTypes(cls)' has not been called yet, unfinalized
-    // member types could choke the snapshotter.
-    // Or
-    // if the class is being refinalized because a patch is being applied
-    // after the class has been finalized then it is ok for the class to have
-    // functions.
-    //
-    // TODO(kmillikin): This ASSERT will fail when bootstrapping from Kernel
-    // because classes are first created, methods are added, and then classes
-    // are finalized.  It is not easy to finalize classes earlier because not
-    // all bootstrap classes have been created yet.  It would be possible to
-    // create all classes, delay adding methods, finalize the classes, and then
-    // reprocess all classes to add methods, but that seems unnecessary.
-    // Marking the bootstrap classes as is_refinalize_after_patch seems cute but
-    // it causes other things to fail by violating their assumptions.  Reenable
-    // this ASSERT if it's important, remove it if it's just a sanity check and
-    // not required for correctness.
-    //
-    // ASSERT((Array::Handle(cls.functions()).Length() == 0) ||
-    //        cls.is_refinalize_after_patch());
   }
 }
 
@@ -2494,6 +1137,9 @@
   // Top level classes are always fully loaded.
   if (!cls.IsTopLevel() && cls.kernel_offset() > 0) {
     kernel::KernelLoader::FinishLoading(cls);
+    if (cls.is_finalized()) {
+      return;
+    }
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -2509,38 +1155,19 @@
   const Class& super = Class::Handle(cls.SuperClass());
   if (!super.IsNull()) {
     FinalizeClass(super);
+    if (cls.is_finalized()) {
+      return;
+    }
   }
-  if (cls.IsMixinApplication()) {
-    // Copy instance methods and fields from the mixin class.
-    // This has to happen before the check whether the methods of
-    // the class conflict with inherited methods.
-    ApplyMixinMembers(cls);
-  }
-  // Mark as parsed and finalized.
+  // Mark as loaded and finalized.
   cls.Finalize();
-  // Mixin app alias classes may still lack their forwarding constructor.
-  if (cls.is_mixin_app_alias() &&
-      (cls.functions() == Object::empty_array().raw())) {
-    const GrowableObjectArray& cloned_funcs =
-        GrowableObjectArray::Handle(GrowableObjectArray::New());
-
-    const Class& mixin_app_class = Class::Handle(cls.SuperClass());
-    const Type& mixin_type = Type::Handle(mixin_app_class.mixin());
-    const Class& mixin_cls = Class::Handle(mixin_type.type_class());
-
-    CreateForwardingConstructors(cls, mixin_cls, cloned_funcs);
-    const Array& functions =
-        Array::Handle(Array::MakeFixedLength(cloned_funcs));
-    cls.SetFunctions(functions);
-  }
   // Every class should have at least a constructor, unless it is a top level
   // class or a typedef class. The Kernel frontend does not create an implicit
   // constructor for abstract classes.
   // Moreover, Dart 2 precompiler (TFA) can tree shake all members if unused.
   ASSERT(FLAG_precompiled_mode || cls.IsTopLevel() || cls.IsTypedefClass() ||
          cls.is_abstract() || (Array::Handle(cls.functions()).Length() > 0));
-  // Resolve and finalize all member types.
-  ResolveAndFinalizeMemberTypes(cls);
+  FinalizeMemberTypes(cls);
   // Run additional checks after all types are finalized.
   if (cls.is_const()) {
     CheckForLegalConstClass(cls);
@@ -2557,6 +1184,21 @@
   }
 }
 
+RawError* ClassFinalizer::LoadClassMembers(const Class& cls) {
+  ASSERT(Thread::Current()->IsMutatorThread());
+  // If class is a top level class it is already loaded.
+  if (cls.IsTopLevel()) {
+    return Error::null();
+  }
+  LongJumpScope jump;
+  if (setjmp(*jump.Set()) == 0) {
+    ClassFinalizer::FinalizeClass(cls);
+    return Error::null();
+  } else {
+    return Thread::Current()->StealStickyError();
+  }
+}
+
 // Allocate instances for each enumeration value, and populate the
 // static field 'values'.
 // By allocating the instances programmatically, we save an implicit final
@@ -2598,7 +1240,7 @@
   sentinel.RecordStore(enum_value);
 
   if (enum_cls.kernel_offset() > 0) {
-    Object& result = Object::Handle(zone);
+    Error& error = Error::Handle(zone);
     for (intptr_t i = 0; i < fields.Length(); i++) {
       field = Field::RawCast(fields.At(i));
       if (!field.is_static() || !field.is_const() ||
@@ -2608,11 +1250,12 @@
       // The eager evaluation of the enum values is required for hot-reload (see
       // commit e3ecc87).
       if (!FLAG_precompiled_mode) {
-        field.SetStaticValue(Object::transition_sentinel());
-        result = Compiler::EvaluateStaticInitializer(field);
-        ASSERT(!result.IsError());
-        field.SetStaticValue(Instance::Cast(result), true);
-        field.RecordStore(Instance::Cast(result));
+        if (field.IsUninitialized()) {
+          error = field.EvaluateInitializer();
+          if (!error.IsNull()) {
+            ReportError(error);
+          }
+        }
       }
     }
   } else {
@@ -2687,9 +1330,8 @@
                                         const AbstractType& type,
                                         GrowableArray<intptr_t>* visited) {
   ASSERT(visited != NULL);
-  ResolveType(cls, type);
   bool checking_typedef = false;
-  if (type.IsType() && !type.IsMalformed()) {
+  if (type.IsType()) {
     AbstractType& other_type = AbstractType::Handle();
     if (type.IsFunctionType()) {
       const Class& scope_class = Class::Handle(type.type_class());
@@ -2756,239 +1398,6 @@
   return true;
 }
 
-// Returns false if the mixin illegally refers to itself.
-bool ClassFinalizer::IsMixinCycleFree(const Class& cls,
-                                      GrowableArray<intptr_t>* visited) {
-  ASSERT(visited != NULL);
-  const intptr_t cls_index = cls.id();
-  for (intptr_t i = 0; i < visited->length(); i++) {
-    if ((*visited)[i] == cls_index) {
-      // We have already visited mixin 'cls'. We found a cycle.
-      return false;
-    }
-  }
-
-  // Visit the super chain of cls.
-  visited->Add(cls.id());
-  Class& super_class = Class::Handle(cls.raw());
-  do {
-    if (super_class.IsMixinApplication()) {
-      const Type& mixin_type = Type::Handle(super_class.mixin());
-      ASSERT(!mixin_type.IsNull());
-      ASSERT(mixin_type.HasResolvedTypeClass());
-      const Class& mixin_class = Class::Handle(mixin_type.type_class());
-      if (!IsMixinCycleFree(mixin_class, visited)) {
-        return false;
-      }
-    }
-    super_class = super_class.SuperClass();
-  } while (!super_class.IsNull());
-  visited->RemoveLast();
-  return true;
-}
-
-void ClassFinalizer::CollectTypeArguments(
-    const Class& cls,
-    const Type& type,
-    const GrowableObjectArray& collected_args) {
-  ASSERT(type.HasResolvedTypeClass());
-  Class& type_class = Class::Handle(type.type_class());
-  TypeArguments& type_args = TypeArguments::Handle(type.arguments());
-  const intptr_t num_type_parameters = type_class.NumTypeParameters();
-  const intptr_t num_type_arguments =
-      type_args.IsNull() ? 0 : type_args.Length();
-  AbstractType& arg = AbstractType::Handle();
-  if (num_type_arguments > 0) {
-    if (num_type_arguments == num_type_parameters) {
-      for (intptr_t i = 0; i < num_type_arguments; i++) {
-        arg = type_args.TypeAt(i);
-        arg = arg.CloneUnfinalized();
-        ASSERT(!arg.IsBeingFinalized());
-        collected_args.Add(arg);
-      }
-      return;
-    }
-    if (Isolate::Current()->error_on_bad_type()) {
-      const String& type_class_name = String::Handle(type_class.Name());
-      ReportError(cls, type.token_pos(),
-                  "wrong number of type arguments for class '%s'",
-                  type_class_name.ToCString());
-    }
-    // Discard provided type arguments and treat type as raw.
-  }
-  // Fill arguments with type dynamic.
-  for (intptr_t i = 0; i < num_type_parameters; i++) {
-    arg = Type::DynamicType();
-    collected_args.Add(arg);
-  }
-}
-
-RawType* ClassFinalizer::ResolveMixinAppType(
-    const Class& cls,
-    const MixinAppType& mixin_app_type) {
-  // Lookup or create mixin application classes in the library of cls
-  // and resolve super type and mixin types.
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const Library& library = Library::Handle(zone, cls.library());
-  ASSERT(!library.IsNull());
-  const Script& script = Script::Handle(zone, cls.script());
-  ASSERT(!script.IsNull());
-  const GrowableObjectArray& type_args =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-  AbstractType& mixin_super_type =
-      AbstractType::Handle(zone, mixin_app_type.super_type());
-  ResolveType(cls, mixin_super_type);
-  ASSERT(mixin_super_type.HasResolvedTypeClass());  // Even if malformed.
-  if (mixin_super_type.IsMalformedOrMalbounded()) {
-    ReportError(Error::Handle(zone, mixin_super_type.error()));
-  }
-  if (mixin_super_type.IsDynamicType()) {
-    ReportError(cls, cls.token_pos(), "class '%s' may not extend 'dynamic'",
-                String::Handle(zone, cls.Name()).ToCString());
-  }
-  // The super type may have a BoundedType as type argument, but cannot be
-  // a BoundedType itself.
-  CollectTypeArguments(cls, Type::Cast(mixin_super_type), type_args);
-  AbstractType& mixin_type = AbstractType::Handle(zone);
-  Class& mixin_app_class = Class::Handle(zone);
-  Class& mixin_super_type_class = Class::Handle(zone);
-  Class& mixin_type_class = Class::Handle(zone);
-  Library& mixin_super_type_library = Library::Handle(zone);
-  Library& mixin_type_library = Library::Handle(zone);
-  String& mixin_app_class_name = String::Handle(zone);
-  String& mixin_type_class_name = String::Handle(zone);
-  AbstractType& super_type_arg = AbstractType::Handle(zone);
-  AbstractType& mixin_type_arg = AbstractType::Handle(zone);
-  Type& generic_mixin_type = Type::Handle(zone);
-  Array& interfaces = Array::Handle(zone);
-  const intptr_t depth = mixin_app_type.Depth();
-  for (intptr_t i = 0; i < depth; i++) {
-    mixin_type = mixin_app_type.MixinTypeAt(i);
-    ASSERT(!mixin_type.IsNull());
-    ResolveType(cls, mixin_type);
-    ASSERT(mixin_type.HasResolvedTypeClass());  // Even if malformed.
-    ASSERT(mixin_type.IsType());
-    if (mixin_type.IsMalformedOrMalbounded()) {
-      ReportError(Error::Handle(zone, mixin_type.error()));
-    }
-    if (mixin_type.IsDynamicType()) {
-      ReportError(cls, cls.token_pos(), "class '%s' may not mixin 'dynamic'",
-                  String::Handle(zone, cls.Name()).ToCString());
-    }
-    const intptr_t num_super_type_args = type_args.Length();
-    CollectTypeArguments(cls, Type::Cast(mixin_type), type_args);
-
-    // If the mixin type has identical type arguments as the super type, they
-    // can share the same type parameters of the mixin application class,
-    // thereby allowing for further optimizations, such as instantiator vector
-    // reuse or sharing of type arguments with the super class.
-    bool share_type_params = (num_super_type_args > 0) &&
-                             (type_args.Length() == 2 * num_super_type_args);
-    if (share_type_params) {
-      for (intptr_t i = 0; i < num_super_type_args; i++) {
-        super_type_arg ^= type_args.At(i);
-        mixin_type_arg ^= type_args.At(num_super_type_args + i);
-        if (!super_type_arg.Equals(mixin_type_arg)) {
-          share_type_params = false;
-          break;
-        }
-      }
-      if (share_type_params) {
-        // Cut the type argument vector in half.
-        type_args.SetLength(num_super_type_args);
-      }
-    }
-
-    // The name of the mixin application class is a combination of
-    // the super class name and mixin class name, as well as their respective
-    // library private keys if their library is different than the library of
-    // the mixin application class.
-    // Note that appending the library url would break naming conventions (e.g.
-    // no period in the class name).
-    mixin_app_class_name = mixin_super_type.ClassName();
-    mixin_super_type_class = mixin_super_type.type_class();
-    mixin_super_type_library = mixin_super_type_class.library();
-    if (mixin_super_type_library.raw() != library.raw()) {
-      mixin_app_class_name = String::Concat(
-          mixin_app_class_name,
-          String::Handle(zone, mixin_super_type_library.private_key()));
-    }
-    mixin_app_class_name =
-        String::Concat(mixin_app_class_name, Symbols::Ampersand());
-    // If the type parameters are shared between the super type and the mixin
-    // type, use two ampersand symbols, so that the class has a different name
-    // and is not reused in a context where this optimization is not possible.
-    if (share_type_params) {
-      mixin_app_class_name =
-          String::Concat(mixin_app_class_name, Symbols::Ampersand());
-    }
-    mixin_type_class_name = mixin_type.ClassName();
-    mixin_type_class = mixin_type.type_class();
-    mixin_type_library = mixin_type_class.library();
-    if (mixin_type_library.raw() != library.raw()) {
-      mixin_type_class_name = String::Concat(
-          mixin_type_class_name,
-          String::Handle(zone, mixin_type_library.private_key()));
-    }
-    mixin_app_class_name =
-        String::Concat(mixin_app_class_name, mixin_type_class_name);
-    mixin_app_class = library.LookupLocalClass(mixin_app_class_name);
-    if (mixin_app_class.IsNull()) {
-      mixin_app_class_name = Symbols::New(thread, mixin_app_class_name);
-      mixin_app_class = Class::New(library, mixin_app_class_name, script,
-                                   mixin_type.token_pos());
-      mixin_app_class.set_super_type(mixin_super_type);
-      generic_mixin_type =
-          Type::New(mixin_type_class, Object::null_type_arguments(),
-                    mixin_type.token_pos());
-      mixin_app_class.set_mixin(generic_mixin_type);
-      // Add the mixin type to the list of interfaces that the mixin application
-      // class implements. This is necessary so that cycle check work at
-      // compile time (type arguments are ignored by that check).
-      interfaces = Array::New(1);
-      interfaces.SetAt(0, generic_mixin_type);
-      ASSERT(mixin_app_class.interfaces() == Object::empty_array().raw());
-      mixin_app_class.set_interfaces(interfaces);
-      mixin_app_class.set_is_synthesized_class();
-      library.AddClass(mixin_app_class);
-
-      // No need to add the new class to pending_classes, since it will be
-      // processed via the super_type chain of a pending class.
-
-      if (FLAG_trace_class_finalization) {
-        THR_Print("Creating mixin application %s\n",
-                  mixin_app_class.ToCString());
-      }
-    }
-    // This mixin application class becomes the type class of the super type of
-    // the next mixin application class. It is however too early to provide the
-    // correct super type arguments. We use the raw type for now.
-    mixin_super_type = Type::New(mixin_app_class, Object::null_type_arguments(),
-                                 mixin_type.token_pos());
-  }
-  TypeArguments& mixin_app_args = TypeArguments::Handle(zone);
-  if (type_args.Length() > 0) {
-    mixin_app_args = TypeArguments::New(type_args.Length());
-    AbstractType& type_arg = AbstractType::Handle(zone);
-    for (intptr_t i = 0; i < type_args.Length(); i++) {
-      type_arg ^= type_args.At(i);
-      mixin_app_args.SetTypeAt(i, type_arg);
-    }
-  }
-  if (FLAG_trace_class_finalization) {
-    THR_Print("ResolveMixinAppType: mixin appl type args: %s\n",
-              mixin_app_args.ToCString());
-  }
-  // The mixin application class at depth k is a subclass of mixin application
-  // class at depth k - 1. Build a new super type with the class at the highest
-  // depth (the last one processed by the loop above) as the type class and the
-  // collected type arguments from the super type and all mixin types.
-  // This super type replaces the MixinAppType object in the class that extends
-  // the mixin application.
-  return Type::New(mixin_app_class, mixin_app_args, mixin_app_type.token_pos());
-}
-
 // For a class used as an interface marks this class and all its superclasses
 // implemented.
 //
@@ -3009,19 +1418,17 @@
     if (type.IsNull() || type.IsObjectType()) {
       break;
     }
-    ASSERT(type.IsResolved());
     cls = type.type_class();
   }
 }
 
 // Recursively walks the graph of explicitly declared super type and
-// interfaces, resolving unresolved super types and interfaces.
-// Reports an error if there is an interface reference that cannot be
-// resolved, or if there is a cycle in the graph. We detect cycles by
+// interfaces.
+// Reports an error if there is a cycle in the graph. We detect cycles by
 // remembering interfaces we've visited in each path through the
 // graph. If we visit an interface a second time on a given path,
 // we found a loop.
-void ClassFinalizer::ResolveSuperTypeAndInterfaces(
+void ClassFinalizer::CheckSuperTypeAndInterfaces(
     const Class& cls,
     GrowableArray<intptr_t>* visited) {
   if (cls.is_cycle_free()) {
@@ -3029,7 +1436,7 @@
   }
   ASSERT(visited != NULL);
   if (FLAG_trace_class_finalization) {
-    THR_Print("Resolving super and interfaces: %s\n", cls.ToCString());
+    THR_Print("Checking super and interfaces: %s\n", cls.ToCString());
   }
   Zone* zone = Thread::Current()->zone();
   const intptr_t cls_index = cls.id();
@@ -3042,8 +1449,7 @@
     }
   }
 
-  // If the class/interface has no explicit super class/interfaces
-  // and is not a mixin application, we are done.
+  // If the class/interface has no explicit super class/interfaces, we are done.
   AbstractType& super_type = AbstractType::Handle(zone, cls.super_type());
   Array& super_interfaces = Array::Handle(zone, cls.interfaces());
   if ((super_type.IsNull() || super_type.IsObjectType()) &&
@@ -3052,32 +1458,18 @@
     return;
   }
 
-  if (super_type.IsMixinAppType()) {
-    // For the cycle check below to work, ResolveMixinAppType needs to set
-    // the mixin interfaces in the super classes, even if only in raw form.
-    // It is indeed too early to set the correct type arguments, which is not
-    // a problem since they are ignored in the cycle check.
-    const MixinAppType& mixin_app_type = MixinAppType::Cast(super_type);
-    super_type = ResolveMixinAppType(cls, mixin_app_type);
-    cls.set_super_type(super_type);
-  }
-
   // If cls belongs to core lib or is a synthetic class which could belong to
   // the core library, the restrictions about allowed interfaces are lifted.
   const bool exempt_from_hierarchy_restrictions =
       cls.library() == Library::CoreLibrary() ||
       String::Handle(cls.Name()).Equals(Symbols::DebugClassName());
 
-  // Resolve and check the super type and interfaces of cls.
+  // Check the super type and interfaces of cls.
   visited->Add(cls_index);
   AbstractType& interface = AbstractType::Handle(zone);
   Class& interface_class = Class::Handle(zone);
 
-  // Resolve super type. Failures lead to a longjmp.
-  ResolveType(cls, super_type);
-  if (super_type.IsMalformedOrMalbounded()) {
-    ReportError(Error::Handle(zone, super_type.error()));
-  }
+  // Check super type. Failures lead to a longjmp.
   if (super_type.IsDynamicType()) {
     ReportError(cls, cls.token_pos(), "class '%s' may not extend 'dynamic'",
                 String::Handle(zone, cls.Name()).ToCString());
@@ -3142,18 +1534,13 @@
                   interface_name.ToCString());
     }
   }
-  // Now resolve the super interfaces of the super type.
-  ResolveSuperTypeAndInterfaces(interface_class, visited);
+  // Now check the super interfaces of the super type.
+  CheckSuperTypeAndInterfaces(interface_class, visited);
 
-  // Resolve interfaces. Failures lead to a longjmp.
+  // Check interfaces. Failures lead to a longjmp.
   for (intptr_t i = 0; i < super_interfaces.Length(); i++) {
     interface ^= super_interfaces.At(i);
-    ResolveType(cls, interface);
     ASSERT(!interface.IsTypeParameter());  // Should be detected by parser.
-    // A malbounded interface is only reported when involved in a type test.
-    if (interface.IsMalformed()) {
-      ReportError(Error::Handle(zone, interface.error()));
-    }
     if (interface.IsDynamicType()) {
       ReportError(cls, cls.token_pos(),
                   "'dynamic' may not be used as interface");
@@ -3182,20 +1569,15 @@
           interface.IsDynamicType()) {
         const String& interface_name =
             String::Handle(zone, interface_class.Name());
-        if (cls.IsMixinApplication()) {
-          ReportError(cls, cls.token_pos(), "illegal mixin of '%s'",
-                      interface_name.ToCString());
-        } else {
-          ReportError(cls, cls.token_pos(),
-                      "'%s' is not allowed to extend or implement '%s'",
-                      String::Handle(zone, cls.Name()).ToCString(),
-                      interface_name.ToCString());
-        }
+        ReportError(cls, cls.token_pos(),
+                    "'%s' is not allowed to extend or implement '%s'",
+                    String::Handle(zone, cls.Name()).ToCString(),
+                    interface_name.ToCString());
       }
     }
 
-    // Now resolve the super interfaces.
-    ResolveSuperTypeAndInterfaces(interface_class, visited);
+    // Now check the super interfaces.
+    CheckSuperTypeAndInterfaces(interface_class, visited);
     MarkImplemented(zone, interface_class);
   }
   visited->RemoveLast();
@@ -3268,84 +1650,6 @@
   }
 }
 
-// Either report an error or mark the type as malformed.
-void ClassFinalizer::MarkTypeMalformed(const Error& prev_error,
-                                       const Script& script,
-                                       const Type& type,
-                                       const char* format,
-                                       va_list args) {
-  LanguageError& error = LanguageError::Handle(LanguageError::NewFormattedV(
-      prev_error, script, type.token_pos(), Report::AtLocation,
-      Report::kMalformedType, Heap::kOld, format, args));
-  if (Isolate::Current()->error_on_bad_type()) {
-    ReportError(error);
-  }
-  type.set_error(error);
-  // Make the type raw, since it may not be possible to
-  // properly finalize its type arguments.
-  type.set_type_class(Class::Handle(Object::dynamic_class()));
-  type.set_arguments(Object::null_type_arguments());
-  if (!type.IsFinalized()) {
-    type.SetIsFinalized();
-    // Do not canonicalize malformed types, since they contain an error field.
-  } else {
-    // The only case where the malformed type was already finalized is when its
-    // type arguments are not within bounds. In that case, we have a prev_error.
-    ASSERT(!prev_error.IsNull());
-  }
-}
-
-RawType* ClassFinalizer::NewFinalizedMalformedType(const Error& prev_error,
-                                                   const Script& script,
-                                                   TokenPosition type_pos,
-                                                   const char* format,
-                                                   ...) {
-  va_list args;
-  va_start(args, format);
-  const UnresolvedClass& unresolved_class =
-      UnresolvedClass::Handle(UnresolvedClass::New(LibraryPrefix::Handle(),
-                                                   Symbols::Empty(), type_pos));
-  const Type& type = Type::Handle(
-      Type::New(unresolved_class, Object::null_type_arguments(), type_pos));
-  MarkTypeMalformed(prev_error, script, type, format, args);
-  va_end(args);
-  ASSERT(type.IsMalformed());
-  ASSERT(type.IsFinalized());
-  return type.raw();
-}
-
-void ClassFinalizer::FinalizeMalformedType(const Error& prev_error,
-                                           const Script& script,
-                                           const Type& type,
-                                           const char* format,
-                                           ...) {
-  va_list args;
-  va_start(args, format);
-  MarkTypeMalformed(prev_error, script, type, format, args);
-  va_end(args);
-}
-
-void ClassFinalizer::FinalizeMalboundedType(const Error& prev_error,
-                                            const Script& script,
-                                            const AbstractType& type,
-                                            const char* format,
-                                            ...) {
-  va_list args;
-  va_start(args, format);
-  LanguageError& error = LanguageError::Handle(LanguageError::NewFormattedV(
-      prev_error, script, type.token_pos(), Report::AtLocation,
-      Report::kMalboundedType, Heap::kOld, format, args));
-  va_end(args);
-  if (Isolate::Current()->error_on_bad_type()) {
-    ReportError(error);
-  }
-  type.set_error(error);
-  if (!type.IsFinalized()) {
-    type.SetIsFinalized();
-    // Do not canonicalize malbounded types.
-  }
-}
-
 void ClassFinalizer::ReportError(const Error& error) {
   Report::LongJump(error);
   UNREACHABLE();
@@ -3617,7 +1921,6 @@
 //
 //    * RawTypeRef (due to RawTypeRef::type_->type_class_id)
 //    * RawType (due to RawType::signature_'s result/parameter types)
-//    * RawBoundedType (due to RawBoundedType::type_parameter_)
 //    * RawTypeArguments (due to type references)
 //    * RawInstance (due to instance fields)
 //    * RawArray (due to type arguments & array entries)
@@ -3626,7 +1929,6 @@
 //
 //    * RawType::hash_
 //    * RawTypeParameter::hash_
-//    * RawBoundedType::hash_
 //    * RawTypeArguments::hash_
 //
 // No caching of canonical hash codes (i.e. it gets re-computed every time)
@@ -3647,8 +1949,7 @@
   explicit ClearTypeHashVisitor(Zone* zone)
       : type_param_(TypeParameter::Handle(zone)),
         type_(Type::Handle(zone)),
-        type_args_(TypeArguments::Handle(zone)),
-        bounded_type_(BoundedType::Handle(zone)) {}
+        type_args_(TypeArguments::Handle(zone)) {}
 
   void VisitObject(RawObject* obj) {
     if (obj->IsTypeParameter()) {
@@ -3657,9 +1958,6 @@
     } else if (obj->IsType()) {
       type_ ^= obj;
       type_.SetHash(0);
-    } else if (obj->IsBoundedType()) {
-      bounded_type_ ^= obj;
-      bounded_type_.SetHash(0);
     } else if (obj->IsTypeArguments()) {
       type_args_ ^= obj;
       type_args_.SetHash(0);
@@ -3670,7 +1968,6 @@
   TypeParameter& type_param_;
   Type& type_;
   TypeArguments& type_args_;
-  BoundedType& bounded_type_;
 };
 
 void ClassFinalizer::RehashTypes() {
@@ -3743,7 +2040,7 @@
   object_store->set_canonical_type_arguments(typeargs_table.Release());
 }
 
-void ClassFinalizer::ClearAllCode() {
+void ClassFinalizer::ClearAllCode(bool including_nonchanging_cids) {
   class ClearCodeFunctionVisitor : public FunctionVisitor {
     void Visit(const Function& function) {
       function.ClearCode();
@@ -3754,14 +2051,34 @@
   ProgramVisitor::VisitFunctions(&function_visitor);
 
   class ClearCodeClassVisitor : public ClassVisitor {
+   public:
+    explicit ClearCodeClassVisitor(bool force) : force_(force) {}
+
     void Visit(const Class& cls) {
-      if (cls.id() >= kNumPredefinedCids) {
+      if (force_ || cls.id() >= kNumPredefinedCids) {
         cls.DisableAllocationStub();
       }
     }
+
+   private:
+    bool force_;
   };
-  ClearCodeClassVisitor class_visitor;
+  ClearCodeClassVisitor class_visitor(including_nonchanging_cids);
   ProgramVisitor::VisitClasses(&class_visitor);
+
+  // Apart from normal function code and allocation stubs we have two global
+  // code objects to clear.
+  if (including_nonchanging_cids) {
+    auto thread = Thread::Current();
+    auto object_store = thread->isolate()->object_store();
+    auto& null_code = Code::Handle(thread->zone());
+    object_store->set_build_method_extractor_code(null_code);
+
+    auto& miss_function = Function::Handle(
+        thread->zone(), object_store->megamorphic_miss_function());
+    miss_function.ClearCode();
+    object_store->SetMegamorphicMissHandler(null_code, miss_function);
+  }
 }
 
 }  // namespace dart
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index e8d70ac..a720aa0 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -17,13 +17,10 @@
  public:
   typedef ZoneGrowableHandlePtrArray<const AbstractType> PendingTypes;
 
-  // Modes for type resolution and finalization. The ordering is relevant.
+  // Modes for finalization. The ordering is relevant.
   enum FinalizationKind {
-    kIgnore,                 // Type is ignored and replaced by dynamic.
-    kDoNotResolve,           // Type resolution is postponed.
-    kResolveTypeParameters,  // Resolve type parameters only.
-    kFinalize,               // Resolve and finalize type and type arguments.
-    kCanonicalize            // Finalize, check bounds, and canonicalize.
+    kFinalize,     // Finalize type and type arguments.
+    kCanonicalize  // Finalize and canonicalize.
   };
 
   // Finalize given type while parsing class cls.
@@ -39,34 +36,6 @@
                                 const Function& function,
                                 FinalizationKind finalization = kCanonicalize);
 
-  // Allocate, finalize, and return a new malformed type as if it was declared
-  // in class cls at the given token position.
-  // If not null, prepend prev_error to the error message built from the format
-  // string and its arguments.
-  static RawType* NewFinalizedMalformedType(const Error& prev_error,
-                                            const Script& script,
-                                            TokenPosition type_pos,
-                                            const char* format,
-                                            ...) PRINTF_ATTRIBUTE(4, 5);
-
-  // Mark the given type as malformed.
-  // If not null, prepend prev_error to the error message built from the format
-  // string and its arguments.
-  static void FinalizeMalformedType(const Error& prev_error,
-                                    const Script& script,
-                                    const Type& type,
-                                    const char* format,
-                                    ...) PRINTF_ATTRIBUTE(4, 5);
-
-  // Mark the given type as malbounded.
-  // If not null, prepend prev_error to the error message built from the format
-  // string and its arguments.
-  static void FinalizeMalboundedType(const Error& prev_error,
-                                     const Script& script,
-                                     const AbstractType& type,
-                                     const char* format,
-                                     ...) PRINTF_ATTRIBUTE(4, 5);
-
   // Return false if we still have classes pending to be finalized.
   static bool AllClassesFinalized();
 
@@ -74,7 +43,7 @@
   static void SortClasses();
   static void RemapClassIds(intptr_t* old_to_new_cid);
   static void RehashTypes();
-  static void ClearAllCode();
+  static void ClearAllCode(bool including_nonchanging_cids = false);
 
   // Return whether processing pending classes (ObjectStore::pending_classes_)
   // failed. The function returns true if the processing was successful.
@@ -91,55 +60,27 @@
   // Finalize the class including its fields and functions.
   static void FinalizeClass(const Class& cls);
 
+  // Completes loading of the class, this populates the function
+  // and fields of the class.
+  //
+  // Returns Error::null() if there is no loading error.
+  static RawError* LoadClassMembers(const Class& cls);
+
 #if !defined(DART_PRECOMPILED_RUNTIME)
   // Verify that the classes have been properly prefinalized. This is
   // needed during bootstrapping where the classes have been preloaded.
   static void VerifyBootstrapClasses();
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-  // Resolve the class of the type, but not the type's type arguments.
-  // May promote the type to function type by setting its signature field.
-  static void ResolveTypeClass(const Class& cls, const Type& type);
-
-  // Resolve the type and target of the redirecting factory.
-  static void ResolveRedirectingFactory(const Class& cls,
-                                        const Function& factory);
-
-  // Apply the mixin type to the mixin application class.
-  static void ApplyMixinType(const Class& mixin_app_class,
-                             PendingTypes* pending_types = NULL);
-
  private:
   static void AllocateEnumValues(const Class& enum_cls);
   static bool IsSuperCycleFree(const Class& cls);
   static bool IsTypedefCycleFree(const Class& cls,
                                  const AbstractType& type,
                                  GrowableArray<intptr_t>* visited);
-  static bool IsMixinCycleFree(const Class& cls,
-                               GrowableArray<intptr_t>* visited);
   static void CheckForLegalConstClass(const Class& cls);
-  static RawClass* ResolveClass(const Class& cls,
-                                const UnresolvedClass& unresolved_class);
-  static void ResolveType(const Class& cls, const AbstractType& type);
-  static void ResolveRedirectingFactoryTarget(
-      const Class& cls,
-      const Function& factory,
-      const GrowableObjectArray& visited_factories);
-  static void CloneMixinAppTypeParameters(const Class& mixin_app_class);
-  static void ApplyMixinAppAlias(const Class& mixin_app_class,
-                                 const TypeArguments& instantiator);
-  static void ApplyMixinMembers(const Class& cls);
-  static void CreateForwardingConstructors(
-      const Class& mixin_app,
-      const Class& mixin_cls,
-      const GrowableObjectArray& cloned_funcs);
-  static void CollectTypeArguments(const Class& cls,
-                                   const Type& type,
-                                   const GrowableObjectArray& collected_args);
-  static RawType* ResolveMixinAppType(const Class& cls,
-                                      const MixinAppType& mixin_app_type);
-  static void ResolveSuperTypeAndInterfaces(const Class& cls,
-                                            GrowableArray<intptr_t>* visited);
+  static void CheckSuperTypeAndInterfaces(const Class& cls,
+                                          GrowableArray<intptr_t>* visited);
   static void FinalizeTypeParameters(const Class& cls,
                                      PendingTypes* pending_types = NULL);
   static intptr_t ExpandAndFinalizeTypeArguments(const Class& cls,
@@ -148,31 +89,17 @@
   static void FinalizeTypeArguments(const Class& cls,
                                     const TypeArguments& arguments,
                                     intptr_t num_uninitialized_arguments,
-                                    Error* bound_error,
                                     PendingTypes* pending_types,
                                     TrailPtr trail);
   static void CheckRecursiveType(const Class& cls,
                                  const AbstractType& type,
                                  PendingTypes* pending_types);
-  static void CheckTypeBounds(const Class& cls, const AbstractType& type);
-  static void CheckTypeArgumentBounds(const Class& cls,
-                                      const TypeArguments& arguments,
-                                      Error* bound_error);
-  static void ResolveUpperBounds(const Class& cls);
   static void FinalizeUpperBounds(
       const Class& cls,
       FinalizationKind finalization = kCanonicalize);
-  static void ResolveSignature(const Class& cls, const Function& function);
-  static void ResolveAndFinalizeMemberTypes(const Class& cls);
+  static void FinalizeMemberTypes(const Class& cls);
   static void PrintClassInformation(const Class& cls);
-  static void CollectInterfaces(const Class& cls,
-                                GrowableArray<const Class*>* collected);
 
-  static void MarkTypeMalformed(const Error& prev_error,
-                                const Script& script,
-                                const Type& type,
-                                const char* format,
-                                va_list args);
   static void ReportError(const Error& error);
   static void ReportError(const Class& cls,
                           TokenPosition token_pos,
diff --git a/runtime/vm/class_finalizer_test.cc b/runtime/vm/class_finalizer_test.cc
index 4ea8c25..42fee86 100644
--- a/runtime/vm/class_finalizer_test.cc
+++ b/runtime/vm/class_finalizer_test.cc
@@ -70,33 +70,4 @@
   EXPECT(!ClassFinalizer::ProcessPendingClasses());
 }
 
-static RawLibrary* NewLib(const char* url_chars) {
-  String& url = String::ZoneHandle(Symbols::New(Thread::Current(), url_chars));
-  return Library::New(url);
-}
-
-ISOLATE_UNIT_TEST_CASE(ClassFinalize_Resolve) {
-  Zone* zone = thread->zone();
-  Isolate* isolate = thread->isolate();
-  ObjectStore* object_store = isolate->object_store();
-  const GrowableObjectArray& pending_classes =
-      GrowableObjectArray::Handle(zone, object_store->pending_classes());
-  Class& rhb = Class::Handle(CreateTestClass("RhB"));
-  pending_classes.Add(rhb);
-  Class& sbb = Class::Handle(CreateTestClass("SBB"));
-  pending_classes.Add(sbb);
-  Library& lib = Library::Handle(NewLib("TestLib"));
-  lib.AddClass(rhb);
-  lib.AddClass(sbb);
-  const String& superclass_name = String::Handle(sbb.Name());
-  const UnresolvedClass& unresolved =
-      UnresolvedClass::Handle(UnresolvedClass::New(
-          LibraryPrefix::Handle(), superclass_name, TokenPosition::kNoSource));
-  const TypeArguments& type_arguments = TypeArguments::Handle();
-  rhb.set_super_type(
-      Type::Handle(Type::New(Object::Handle(unresolved.raw()), type_arguments,
-                             TokenPosition::kNoSource)));
-  EXPECT(ClassFinalizer::ProcessPendingClasses());
-}
-
 }  // namespace dart
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 69082af..779e9fe 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -7,6 +7,7 @@
 #include "platform/assert.h"
 #include "vm/bootstrap.h"
 #include "vm/compiler/backend/code_statistics.h"
+#include "vm/compiler/relocation.h"
 #include "vm/dart.h"
 #include "vm/heap/heap.h"
 #include "vm/image_snapshot.h"
@@ -23,6 +24,41 @@
 
 namespace dart {
 
+#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32) &&                 \
+    !defined(TARGET_ARCH_DBC)
+
+static void RelocateCodeObjects(
+    bool is_vm,
+    GrowableArray<RawCode*>* code_objects,
+    GrowableArray<ImageWriterCommand>* image_writer_commands) {
+  auto thread = Thread::Current();
+  auto isolate = is_vm ? Dart::vm_isolate() : thread->isolate();
+
+  WritableCodePages writable_code_pages(thread, isolate);
+  CodeRelocator::Relocate(thread, code_objects, image_writer_commands, is_vm);
+}
+
+class RawCodeKeyValueTrait {
+ public:
+  // Typedefs needed for the DirectChainedHashMap template.
+  typedef const RawCode* Key;
+  typedef const RawCode* Value;
+  typedef const RawCode* Pair;
+
+  static Key KeyOf(Pair kv) { return kv; }
+  static Value ValueOf(Pair kv) { return kv; }
+  static inline intptr_t Hashcode(Key key) {
+    return reinterpret_cast<intptr_t>(key);
+  }
+
+  static inline bool IsKeyEqual(Pair pair, Key key) { return pair == key; }
+};
+
+typedef DirectChainedHashMap<RawCodeKeyValueTrait> RawCodeSet;
+
+#endif  // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32) &&          \
+        // !defined(TARGET_ARCH_DBC)
+
 static RawObject* AllocateUninitialized(PageSpace* old_space, intptr_t size) {
   ASSERT(Utils::IsAligned(size, kObjectAlignment));
   uword address =
@@ -90,7 +126,7 @@
       : SerializationCluster("Class"),
         predefined_(kNumPredefinedCids),
         objects_(num_cids) {}
-  virtual ~ClassSerializationCluster() {}
+  ~ClassSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawClass* cls = Class::RawCast(object);
@@ -105,11 +141,7 @@
       objects_.Add(cls);
     }
 
-    RawObject** from = cls->from();
-    RawObject** to = cls->to_snapshot(s->kind());
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(cls);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -118,9 +150,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawClass* cls = predefined_[i];
+      s->AssignRef(cls);
+      AutoTraceObject(cls);
       intptr_t class_id = cls->ptr()->id_;
       s->WriteCid(class_id);
-      s->AssignRef(cls);
     }
     count = objects_.length();
     s->WriteUnsigned(count);
@@ -142,18 +175,14 @@
   }
 
   void WriteClass(Serializer* s, RawClass* cls) {
-    Snapshot::Kind kind = s->kind();
-    RawObject** from = cls->from();
-    RawObject** to = cls->to_snapshot(kind);
-    for (RawObject** p = from; p <= to; p++) {
-      s->WriteRef(*p);
-    }
+    AutoTraceObjectName(cls, cls->ptr()->name_);
+    WriteFromTo(cls);
     intptr_t class_id = cls->ptr()->id_;
     if (class_id == kIllegalCid) {
       s->UnexpectedObject(cls, "Class with illegal cid");
     }
     s->WriteCid(class_id);
-    if (kind != Snapshot::kFullAOT) {
+    if (s->kind() != Snapshot::kFullAOT) {
       s->Write<int32_t>(cls->ptr()->kernel_offset_);
     }
     s->Write<int32_t>(cls->ptr()->instance_size_in_words_);
@@ -175,7 +204,7 @@
 class ClassDeserializationCluster : public DeserializationCluster {
  public:
   ClassDeserializationCluster() {}
-  virtual ~ClassDeserializationCluster() {}
+  ~ClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     predefined_start_index_ = d->next_index();
@@ -200,22 +229,17 @@
   }
 
   void ReadFill(Deserializer* d) {
-    Snapshot::Kind kind = d->kind();
     bool is_vm_object = d->isolate() == Dart::vm_isolate();
     ClassTable* table = d->isolate()->class_table();
 
     for (intptr_t id = predefined_start_index_; id < predefined_stop_index_;
          id++) {
       RawClass* cls = reinterpret_cast<RawClass*>(d->Ref(id));
-      RawObject** from = cls->from();
-      RawObject** to_snapshot = cls->to_snapshot(kind);
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(cls);
       intptr_t class_id = d->ReadCid();
       cls->ptr()->id_ = class_id;
 #if !defined(DART_PRECOMPILED_RUNTIME)
-      if (kind != Snapshot::kFullAOT) {
+      if (d->kind() != Snapshot::kFullAOT) {
         cls->ptr()->kernel_offset_ = d->Read<int32_t>();
       }
 #endif
@@ -238,15 +262,7 @@
       RawClass* cls = reinterpret_cast<RawClass*>(d->Ref(id));
       Deserializer::InitializeHeader(cls, kClassCid, Class::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = cls->from();
-      RawObject** to_snapshot = cls->to_snapshot(kind);
-      RawObject** to = cls->to();
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to_snapshot + 1; p <= to; p++) {
-        *p = Object::null();
-      }
+      ReadFromTo(cls);
 
       intptr_t class_id = d->ReadCid();
 
@@ -256,7 +272,7 @@
 
       cls->ptr()->id_ = class_id;
 #if !defined(DART_PRECOMPILED_RUNTIME)
-      if (kind != Snapshot::kFullAOT) {
+      if (d->kind() != Snapshot::kFullAOT) {
         cls->ptr()->kernel_offset_ = d->Read<int32_t>();
       }
 #endif
@@ -280,91 +296,10 @@
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-class UnresolvedClassSerializationCluster : public SerializationCluster {
- public:
-  UnresolvedClassSerializationCluster()
-      : SerializationCluster("UnresolvedClass") {}
-  virtual ~UnresolvedClassSerializationCluster() {}
-
-  void Trace(Serializer* s, RawObject* object) {
-    RawUnresolvedClass* cls = UnresolvedClass::RawCast(object);
-    objects_.Add(cls);
-
-    RawObject** from = cls->from();
-    RawObject** to = cls->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
-  }
-
-  void WriteAlloc(Serializer* s) {
-    s->WriteCid(kUnresolvedClassCid);
-    intptr_t count = objects_.length();
-    s->WriteUnsigned(count);
-    for (intptr_t i = 0; i < count; i++) {
-      RawUnresolvedClass* cls = objects_[i];
-      s->AssignRef(cls);
-    }
-  }
-
-  void WriteFill(Serializer* s) {
-    intptr_t count = objects_.length();
-    for (intptr_t i = 0; i < count; i++) {
-      RawUnresolvedClass* cls = objects_[i];
-      RawObject** from = cls->from();
-      RawObject** to = cls->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
-      s->WriteTokenPosition(cls->ptr()->token_pos_);
-    }
-  }
-
- private:
-  GrowableArray<RawUnresolvedClass*> objects_;
-};
-#endif  // !DART_PRECOMPILED_RUNTIME
-
-class UnresolvedClassDeserializationCluster : public DeserializationCluster {
- public:
-  UnresolvedClassDeserializationCluster() {}
-  virtual ~UnresolvedClassDeserializationCluster() {}
-
-  void ReadAlloc(Deserializer* d) {
-    start_index_ = d->next_index();
-    PageSpace* old_space = d->heap()->old_space();
-    intptr_t count = d->ReadUnsigned();
-    for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(
-          AllocateUninitialized(old_space, UnresolvedClass::InstanceSize()));
-    }
-    stop_index_ = d->next_index();
-  }
-
-  void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
-    for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawUnresolvedClass* cls =
-          reinterpret_cast<RawUnresolvedClass*>(d->Ref(id));
-      Deserializer::InitializeHeader(cls, kUnresolvedClassCid,
-                                     UnresolvedClass::InstanceSize(),
-                                     is_vm_object);
-      RawObject** from = cls->from();
-      RawObject** to = cls->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
-      cls->ptr()->token_pos_ = d->ReadTokenPosition();
-    }
-  }
-};
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
 class TypeArgumentsSerializationCluster : public SerializationCluster {
  public:
   TypeArgumentsSerializationCluster() : SerializationCluster("TypeArguments") {}
-  virtual ~TypeArgumentsSerializationCluster() {}
+  ~TypeArgumentsSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTypeArguments* type_args = TypeArguments::RawCast(object);
@@ -383,9 +318,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawTypeArguments* type_args = objects_[i];
+      s->AssignRef(type_args);
+      AutoTraceObject(type_args);
       intptr_t length = Smi::Value(type_args->ptr()->length_);
       s->WriteUnsigned(length);
-      s->AssignRef(type_args);
     }
   }
 
@@ -393,14 +329,15 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawTypeArguments* type_args = objects_[i];
+      AutoTraceObject(type_args);
       intptr_t length = Smi::Value(type_args->ptr()->length_);
       s->WriteUnsigned(length);
       s->Write<bool>(type_args->IsCanonical());
       intptr_t hash = Smi::Value(type_args->ptr()->hash_);
       s->Write<int32_t>(hash);
-      s->WriteRef(type_args->ptr()->instantiations_);
+      WriteField(type_args, instantiations_);
       for (intptr_t j = 0; j < length; j++) {
-        s->WriteRef(type_args->ptr()->types()[j]);
+        s->WriteElementRef(type_args->ptr()->types()[j], j);
       }
     }
   }
@@ -413,7 +350,7 @@
 class TypeArgumentsDeserializationCluster : public DeserializationCluster {
  public:
   TypeArgumentsDeserializationCluster() {}
-  virtual ~TypeArgumentsDeserializationCluster() {}
+  ~TypeArgumentsDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -454,17 +391,12 @@
 class PatchClassSerializationCluster : public SerializationCluster {
  public:
   PatchClassSerializationCluster() : SerializationCluster("PatchClass") {}
-  virtual ~PatchClassSerializationCluster() {}
+  ~PatchClassSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawPatchClass* cls = PatchClass::RawCast(object);
     objects_.Add(cls);
-
-    RawObject** from = cls->from();
-    RawObject** to = cls->to_snapshot(s->kind());
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(cls);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -481,12 +413,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawPatchClass* cls = objects_[i];
-      RawObject** from = cls->from();
-      RawObject** to = cls->to_snapshot(s->kind());
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
-
+      AutoTraceObject(cls);
+      WriteFromTo(cls);
       if (s->kind() != Snapshot::kFullAOT) {
         s->Write<int32_t>(cls->ptr()->library_kernel_offset_);
       }
@@ -501,7 +429,7 @@
 class PatchClassDeserializationCluster : public DeserializationCluster {
  public:
   PatchClassDeserializationCluster() {}
-  virtual ~PatchClassDeserializationCluster() {}
+  ~PatchClassDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -521,15 +449,7 @@
       RawPatchClass* cls = reinterpret_cast<RawPatchClass*>(d->Ref(id));
       Deserializer::InitializeHeader(cls, kPatchClassCid,
                                      PatchClass::InstanceSize(), is_vm_object);
-      RawObject** from = cls->from();
-      RawObject** to_snapshot = cls->to_snapshot(d->kind());
-      RawObject** to = cls->to();
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to_snapshot + 1; p <= to; p++) {
-        *p = Object::null();
-      }
+      ReadFromTo(cls);
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() != Snapshot::kFullAOT) {
         cls->ptr()->library_kernel_offset_ = d->Read<int32_t>();
@@ -543,20 +463,19 @@
 class FunctionSerializationCluster : public SerializationCluster {
  public:
   FunctionSerializationCluster() : SerializationCluster("Function") {}
-  virtual ~FunctionSerializationCluster() {}
+  ~FunctionSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
+    Snapshot::Kind kind = s->kind();
     RawFunction* func = Function::RawCast(object);
     objects_.Add(func);
 
-    RawObject** from = func->from();
-    RawObject** to = func->to_snapshot(s->kind());
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
-    if (s->kind() == Snapshot::kFullAOT) {
+    PushFromTo(func);
+    if (kind == Snapshot::kFull) {
+      NOT_IN_PRECOMPILED(s->Push(func->ptr()->bytecode_));
+    } else if (kind == Snapshot::kFullAOT) {
       s->Push(func->ptr()->code_);
-    } else if (s->kind() == Snapshot::kFullJIT) {
+    } else if (kind == Snapshot::kFullJIT) {
       NOT_IN_PRECOMPILED(s->Push(func->ptr()->unoptimized_code_));
       NOT_IN_PRECOMPILED(s->Push(func->ptr()->bytecode_));
       s->Push(func->ptr()->code_);
@@ -579,18 +498,17 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawFunction* func = objects_[i];
-      RawObject** from = func->from();
-      RawObject** to = func->to_snapshot(s->kind());
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
-      if (kind == Snapshot::kFullAOT) {
-        s->WriteRef(func->ptr()->code_);
+      AutoTraceObjectName(func, func->ptr()->name_);
+      WriteFromTo(func);
+      if (kind == Snapshot::kFull) {
+        NOT_IN_PRECOMPILED(WriteField(func, bytecode_));
+      } else if (kind == Snapshot::kFullAOT) {
+        WriteField(func, code_);
       } else if (s->kind() == Snapshot::kFullJIT) {
-        NOT_IN_PRECOMPILED(s->WriteRef(func->ptr()->unoptimized_code_));
-        NOT_IN_PRECOMPILED(s->WriteRef(func->ptr()->bytecode_));
-        s->WriteRef(func->ptr()->code_);
-        s->WriteRef(func->ptr()->ic_data_array_);
+        NOT_IN_PRECOMPILED(WriteField(func, unoptimized_code_));
+        NOT_IN_PRECOMPILED(WriteField(func, bytecode_));
+        WriteField(func, code_);
+        WriteField(func, ic_data_array_);
       }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -613,7 +531,7 @@
 class FunctionDeserializationCluster : public DeserializationCluster {
  public:
   FunctionDeserializationCluster() {}
-  virtual ~FunctionDeserializationCluster() {}
+  ~FunctionDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -633,23 +551,18 @@
       RawFunction* func = reinterpret_cast<RawFunction*>(d->Ref(id));
       Deserializer::InitializeHeader(func, kFunctionCid,
                                      Function::InstanceSize(), is_vm_object);
-      RawObject** from = func->from();
-      RawObject** to_snapshot = func->to_snapshot(d->kind());
-      RawObject** to = func->to();
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to_snapshot + 1; p <= to; p++) {
-        *p = Object::null();
-      }
+      ReadFromTo(func);
 
-      if (kind == Snapshot::kFullAOT) {
+      if (kind == Snapshot::kFull) {
+        NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
+                               reinterpret_cast<RawBytecode*>(d->ReadRef()));
+      } else if (kind == Snapshot::kFullAOT) {
         func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
       } else if (kind == Snapshot::kFullJIT) {
         NOT_IN_PRECOMPILED(func->ptr()->unoptimized_code_ =
                                reinterpret_cast<RawCode*>(d->ReadRef()));
         NOT_IN_PRECOMPILED(func->ptr()->bytecode_ =
-                               reinterpret_cast<RawCode*>(d->ReadRef()));
+                               reinterpret_cast<RawBytecode*>(d->ReadRef()));
         func->ptr()->code_ = reinterpret_cast<RawCode*>(d->ReadRef());
         func->ptr()->ic_data_array_ = reinterpret_cast<RawArray*>(d->ReadRef());
       }
@@ -712,11 +625,9 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
         } else if (FLAG_enable_interpreter && func.HasBytecode()) {
           // Set the code entry_point to InterpretCall stub.
-          func.SetInstructions(
-              Code::Handle(StubCode::InterpretCall_entry()->code()));
+          func.SetInstructions(StubCode::InterpretCall());
         } else if (FLAG_use_bytecode_compiler && func.HasBytecode()) {
-          func.SetInstructions(
-              Code::Handle(StubCode::LazyCompile_entry()->code()));
+          func.SetInstructions(StubCode::LazyCompile());
 #endif                                 // !defined(DART_PRECOMPILED_RUNTIME)
         } else {
           func.ClearCode();  // Set code and entrypoint to lazy compile stub.
@@ -736,7 +647,7 @@
 class ClosureDataSerializationCluster : public SerializationCluster {
  public:
   ClosureDataSerializationCluster() : SerializationCluster("ClosureData") {}
-  virtual ~ClosureDataSerializationCluster() {}
+  ~ClosureDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawClosureData* data = ClosureData::RawCast(object);
@@ -764,12 +675,13 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawClosureData* data = objects_[i];
+      AutoTraceObject(data);
       if (s->kind() != Snapshot::kFullAOT) {
-        s->WriteRef(data->ptr()->context_scope_);
+        WriteField(data, context_scope_);
       }
-      s->WriteRef(data->ptr()->parent_function_);
-      s->WriteRef(data->ptr()->signature_type_);
-      s->WriteRef(data->ptr()->closure_);
+      WriteField(data, parent_function_);
+      WriteField(data, signature_type_);
+      WriteField(data, closure_);
     }
   }
 
@@ -781,7 +693,7 @@
 class ClosureDataDeserializationCluster : public DeserializationCluster {
  public:
   ClosureDataDeserializationCluster() {}
-  virtual ~ClosureDataDeserializationCluster() {}
+  ~ClosureDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -818,17 +730,12 @@
 class SignatureDataSerializationCluster : public SerializationCluster {
  public:
   SignatureDataSerializationCluster() : SerializationCluster("SignatureData") {}
-  virtual ~SignatureDataSerializationCluster() {}
+  ~SignatureDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawSignatureData* data = SignatureData::RawCast(object);
     objects_.Add(data);
-
-    RawObject** from = data->from();
-    RawObject** to = data->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(data);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -845,11 +752,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawSignatureData* data = objects_[i];
-      RawObject** from = data->from();
-      RawObject** to = data->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(data);
+      WriteFromTo(data);
     }
   }
 
@@ -861,7 +765,7 @@
 class SignatureDataDeserializationCluster : public DeserializationCluster {
  public:
   SignatureDataDeserializationCluster() {}
-  virtual ~SignatureDataDeserializationCluster() {}
+  ~SignatureDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -881,11 +785,7 @@
       RawSignatureData* data = reinterpret_cast<RawSignatureData*>(d->Ref(id));
       Deserializer::InitializeHeader(
           data, kSignatureDataCid, SignatureData::InstanceSize(), is_vm_object);
-      RawObject** from = data->from();
-      RawObject** to = data->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(data);
     }
   }
 };
@@ -895,17 +795,12 @@
  public:
   RedirectionDataSerializationCluster()
       : SerializationCluster("RedirectionData") {}
-  virtual ~RedirectionDataSerializationCluster() {}
+  ~RedirectionDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawRedirectionData* data = RedirectionData::RawCast(object);
     objects_.Add(data);
-
-    RawObject** from = data->from();
-    RawObject** to = data->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(data);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -922,11 +817,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawRedirectionData* data = objects_[i];
-      RawObject** from = data->from();
-      RawObject** to = data->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(data);
+      WriteFromTo(data);
     }
   }
 
@@ -938,7 +830,7 @@
 class RedirectionDataDeserializationCluster : public DeserializationCluster {
  public:
   RedirectionDataDeserializationCluster() {}
-  virtual ~RedirectionDataDeserializationCluster() {}
+  ~RedirectionDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -960,11 +852,7 @@
       Deserializer::InitializeHeader(data, kRedirectionDataCid,
                                      RedirectionData::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = data->from();
-      RawObject** to = data->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(data);
     }
   }
 };
@@ -973,7 +861,7 @@
 class FieldSerializationCluster : public SerializationCluster {
  public:
   FieldSerializationCluster() : SerializationCluster("Field") {}
-  virtual ~FieldSerializationCluster() {}
+  ~FieldSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawField* field = Field::RawCast(object);
@@ -1030,38 +918,39 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawField* field = objects_[i];
+      AutoTraceObjectName(field, field->ptr()->name_);
 
-      s->WriteRef(field->ptr()->name_);
-      s->WriteRef(field->ptr()->owner_);
-      s->WriteRef(field->ptr()->type_);
+      WriteField(field, name_);
+      WriteField(field, owner_);
+      WriteField(field, type_);
       // Write out the initial static value or field offset.
       if (Field::StaticBit::decode(field->ptr()->kind_bits_)) {
         if (kind == Snapshot::kFullAOT) {
           // For precompiled static fields, the value was already reset and
           // initializer_ now contains a Function.
-          s->WriteRef(field->ptr()->value_.static_value_);
+          WriteField(field, value_.static_value_);
         } else if (Field::ConstBit::decode(field->ptr()->kind_bits_)) {
           // Do not reset const fields.
-          s->WriteRef(field->ptr()->value_.static_value_);
+          WriteField(field, value_.static_value_);
         } else {
           // Otherwise, for static fields we write out the initial static value.
-          s->WriteRef(field->ptr()->initializer_.saved_value_);
+          WriteField(field, initializer_.saved_value_);
         }
       } else {
-        s->WriteRef(field->ptr()->value_.offset_);
+        WriteField(field, value_.offset_);
       }
       // Write out the initializer function or saved initial value.
       if (kind == Snapshot::kFullAOT) {
-        s->WriteRef(field->ptr()->initializer_.precompiled_);
+        WriteField(field, initializer_.precompiled_);
       } else {
-        s->WriteRef(field->ptr()->initializer_.saved_value_);
+        WriteField(field, initializer_.saved_value_);
       }
       if (kind != Snapshot::kFullAOT) {
         // Write out the guarded list length.
-        s->WriteRef(field->ptr()->guarded_list_length_);
+        WriteField(field, guarded_list_length_);
       }
       if (kind == Snapshot::kFullJIT) {
-        s->WriteRef(field->ptr()->dependent_code_);
+        WriteField(field, dependent_code_);
       }
 
       if (kind != Snapshot::kFullAOT) {
@@ -1074,7 +963,7 @@
         s->Write<int32_t>(field->ptr()->kernel_offset_);
 #endif
       }
-      s->Write<uint8_t>(field->ptr()->kind_bits_);
+      s->Write<uint16_t>(field->ptr()->kind_bits_);
     }
   }
 
@@ -1086,7 +975,7 @@
 class FieldDeserializationCluster : public DeserializationCluster {
  public:
   FieldDeserializationCluster() {}
-  virtual ~FieldDeserializationCluster() {}
+  ~FieldDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1106,16 +995,7 @@
       RawField* field = reinterpret_cast<RawField*>(d->Ref(id));
       Deserializer::InitializeHeader(field, kFieldCid, Field::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = field->from();
-      RawObject** to_snapshot = field->to_snapshot(kind);
-      RawObject** to = field->to();
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to_snapshot + 1; p <= to; p++) {
-        *p = Object::null();
-      }
-
+      ReadFromTo(field);
       if (kind != Snapshot::kFullAOT) {
         field->ptr()->token_pos_ = d->ReadTokenPosition();
         field->ptr()->end_token_pos_ = d->ReadTokenPosition();
@@ -1126,7 +1006,7 @@
         field->ptr()->kernel_offset_ = d->Read<int32_t>();
 #endif
       }
-      field->ptr()->kind_bits_ = d->Read<uint8_t>();
+      field->ptr()->kind_bits_ = d->Read<uint16_t>();
     }
   }
 
@@ -1159,17 +1039,12 @@
 class ScriptSerializationCluster : public SerializationCluster {
  public:
   ScriptSerializationCluster() : SerializationCluster("Script") {}
-  virtual ~ScriptSerializationCluster() {}
+  ~ScriptSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawScript* script = Script::RawCast(object);
     objects_.Add(script);
-
-    RawObject** from = script->from();
-    RawObject** to = script->to_snapshot(s->kind());
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(script);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -1183,16 +1058,11 @@
   }
 
   void WriteFill(Serializer* s) {
-    Snapshot::Kind kind = s->kind();
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawScript* script = objects_[i];
-      RawObject** from = script->from();
-      RawObject** to = script->to_snapshot(kind);
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
-
+      AutoTraceObject(script);
+      WriteFromTo(script);
       s->Write<int32_t>(script->ptr()->line_offset_);
       s->Write<int32_t>(script->ptr()->col_offset_);
       s->Write<int8_t>(script->ptr()->kind_);
@@ -1208,7 +1078,7 @@
 class ScriptDeserializationCluster : public DeserializationCluster {
  public:
   ScriptDeserializationCluster() {}
-  virtual ~ScriptDeserializationCluster() {}
+  ~ScriptDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1221,23 +1091,13 @@
   }
 
   void ReadFill(Deserializer* d) {
-    Snapshot::Kind kind = d->kind();
     bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawScript* script = reinterpret_cast<RawScript*>(d->Ref(id));
       Deserializer::InitializeHeader(script, kScriptCid, Script::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = script->from();
-      RawObject** to_snapshot = script->to_snapshot(kind);
-      RawObject** to = script->to();
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to_snapshot + 1; p <= to; p++) {
-        *p = Object::null();
-      }
-
+      ReadFromTo(script);
       script->ptr()->line_offset_ = d->Read<int32_t>();
       script->ptr()->col_offset_ = d->Read<int32_t>();
       script->ptr()->kind_ = d->Read<int8_t>();
@@ -1251,17 +1111,12 @@
 class LibrarySerializationCluster : public SerializationCluster {
  public:
   LibrarySerializationCluster() : SerializationCluster("Library") {}
-  virtual ~LibrarySerializationCluster() {}
+  ~LibrarySerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLibrary* lib = Library::RawCast(object);
     objects_.Add(lib);
-
-    RawObject** from = lib->from();
-    RawObject** to = lib->to_snapshot(s->kind());
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(lib);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -1278,12 +1133,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawLibrary* lib = objects_[i];
-      RawObject** from = lib->from();
-      RawObject** to = lib->to_snapshot(s->kind());
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
-
+      AutoTraceObjectName(lib, lib->ptr()->url_);
+      WriteFromTo(lib);
       s->Write<int32_t>(lib->ptr()->index_);
       s->Write<uint16_t>(lib->ptr()->num_imports_);
       s->Write<int8_t>(lib->ptr()->load_state_);
@@ -1304,7 +1155,7 @@
 class LibraryDeserializationCluster : public DeserializationCluster {
  public:
   LibraryDeserializationCluster() {}
-  virtual ~LibraryDeserializationCluster() {}
+  ~LibraryDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1323,16 +1174,7 @@
       RawLibrary* lib = reinterpret_cast<RawLibrary*>(d->Ref(id));
       Deserializer::InitializeHeader(lib, kLibraryCid, Library::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = lib->from();
-      RawObject** to_snapshot = lib->to_snapshot(d->kind());
-      RawObject** to = lib->to();
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to_snapshot + 1; p <= to; p++) {
-        *p = Object::null();
-      }
-
+      ReadFromTo(lib);
       lib->ptr()->native_entry_resolver_ = NULL;
       lib->ptr()->native_entry_symbol_resolver_ = NULL;
       lib->ptr()->index_ = d->Read<int32_t>();
@@ -1355,17 +1197,12 @@
 class NamespaceSerializationCluster : public SerializationCluster {
  public:
   NamespaceSerializationCluster() : SerializationCluster("Namespace") {}
-  virtual ~NamespaceSerializationCluster() {}
+  ~NamespaceSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawNamespace* ns = Namespace::RawCast(object);
     objects_.Add(ns);
-
-    RawObject** from = ns->from();
-    RawObject** to = ns->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(ns);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -1382,11 +1219,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawNamespace* ns = objects_[i];
-      RawObject** from = ns->from();
-      RawObject** to = ns->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(ns);
+      WriteFromTo(ns);
     }
   }
 
@@ -1398,7 +1232,7 @@
 class NamespaceDeserializationCluster : public DeserializationCluster {
  public:
   NamespaceDeserializationCluster() {}
-  virtual ~NamespaceDeserializationCluster() {}
+  ~NamespaceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1417,11 +1251,7 @@
       RawNamespace* ns = reinterpret_cast<RawNamespace*>(d->Ref(id));
       Deserializer::InitializeHeader(ns, kNamespaceCid,
                                      Namespace::InstanceSize(), is_vm_object);
-      RawObject** from = ns->from();
-      RawObject** to = ns->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(ns);
     }
   }
 };
@@ -1432,17 +1262,12 @@
  public:
   KernelProgramInfoSerializationCluster()
       : SerializationCluster("KernelProgramInfo") {}
-  virtual ~KernelProgramInfoSerializationCluster() {}
+  ~KernelProgramInfoSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawKernelProgramInfo* info = KernelProgramInfo::RawCast(object);
     objects_.Add(info);
-
-    RawObject** from = info->from();
-    RawObject** to = info->to_snapshot(s->kind());
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(info);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -1459,11 +1284,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawKernelProgramInfo* info = objects_[i];
-      RawObject** from = info->from();
-      RawObject** to = info->to_snapshot(s->kind());
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(info);
+      WriteFromTo(info);
     }
   }
 
@@ -1476,7 +1298,7 @@
 class KernelProgramInfoDeserializationCluster : public DeserializationCluster {
  public:
   KernelProgramInfoDeserializationCluster() {}
-  virtual ~KernelProgramInfoDeserializationCluster() {}
+  ~KernelProgramInfoDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1498,15 +1320,7 @@
       Deserializer::InitializeHeader(info, kKernelProgramInfoCid,
                                      KernelProgramInfo::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = info->from();
-      RawObject** to = info->to_snapshot(d->kind());
-      RawObject** end = info->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to + 1; p <= end; p++) {
-        *p = Object::null();
-      }
+      ReadFromTo(info);
     }
   }
 
@@ -1526,7 +1340,7 @@
 class CodeSerializationCluster : public SerializationCluster {
  public:
   CodeSerializationCluster() : SerializationCluster("Code") {}
-  virtual ~CodeSerializationCluster() {}
+  ~CodeSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawCode* code = Code::RawCast(object);
@@ -1569,6 +1383,7 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawCode* code = objects_[i];
+      AutoTraceObject(code);
 
       intptr_t pointer_offsets_length =
           Code::PtrOffBits::decode(code->ptr()->state_bits_);
@@ -1583,41 +1398,43 @@
       }
 
       s->WriteInstructions(code->ptr()->instructions_, code);
-      if (s->kind() == Snapshot::kFullJIT) {
+      if (kind == Snapshot::kFullJIT) {
         // TODO(rmacnak): Fix references to disabled code before serializing.
         // For now, we may write the FixCallersTarget or equivalent stub. This
         // will cause a fixup if this code is called.
         s->WriteInstructions(code->ptr()->active_instructions_, code);
       }
 
-      s->WriteRef(code->ptr()->object_pool_);
-      s->WriteRef(code->ptr()->owner_);
-      s->WriteRef(code->ptr()->exception_handlers_);
-      s->WriteRef(code->ptr()->pc_descriptors_);
+      WriteField(code, object_pool_);
+      WriteField(code, owner_);
+      WriteField(code, exception_handlers_);
+      WriteField(code, pc_descriptors_);
 #if defined(DART_PRECOMPILED_RUNTIME) || defined(DART_PRECOMPILER)
-      s->WriteRef(code->ptr()->catch_entry_.catch_entry_moves_maps_);
+      WriteField(code, catch_entry_.catch_entry_moves_maps_);
 #else
-      s->WriteRef(code->ptr()->catch_entry_.variables_);
+      WriteField(code, catch_entry_.variables_);
 #endif
-      s->WriteRef(code->ptr()->stackmaps_);
+      WriteField(code, stackmaps_);
       if (FLAG_dwarf_stack_traces) {
-        s->WriteRef(Array::null());
-        s->WriteRef(CodeSourceMap::null());
+        WriteFieldValue(inlined_id_to_function_, Array::null());
+        WriteFieldValue(code_source_map_, CodeSourceMap::null());
       } else {
-        s->WriteRef(code->ptr()->inlined_id_to_function_);
-        s->WriteRef(code->ptr()->code_source_map_);
+        WriteField(code, inlined_id_to_function_);
+        WriteField(code, code_source_map_);
       }
-      if (s->kind() == Snapshot::kFullJIT) {
-        s->WriteRef(code->ptr()->deopt_info_array_);
-        s->WriteRef(code->ptr()->static_calls_target_table_);
+      if (kind == Snapshot::kFullJIT) {
+        WriteField(code, deopt_info_array_);
+        WriteField(code, static_calls_target_table_);
       }
-      NOT_IN_PRODUCT(s->WriteRef(code->ptr()->await_token_positions_));
-      NOT_IN_PRODUCT(s->WriteRef(code->ptr()->return_address_metadata_));
+      NOT_IN_PRODUCT(WriteField(code, await_token_positions_));
+      NOT_IN_PRODUCT(WriteField(code, return_address_metadata_));
 
       s->Write<int32_t>(code->ptr()->state_bits_);
     }
   }
 
+  GrowableArray<RawCode*>* discovered_objects() { return &objects_; }
+
  private:
   GrowableArray<RawCode*> objects_;
 };
@@ -1626,20 +1443,49 @@
 class CodeDeserializationCluster : public DeserializationCluster {
  public:
   CodeDeserializationCluster() {}
-  virtual ~CodeDeserializationCluster() {}
+  ~CodeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
+    const bool is_vm_object = d->isolate() == Dart::vm_isolate();
+
     start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
-    intptr_t count = d->ReadUnsigned();
-    for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(AllocateUninitialized(old_space, Code::InstanceSize(0)));
+    const intptr_t count = d->ReadUnsigned();
+
+    // Build an array of code objects representing the order in which the
+    // [Code]'s instructions will be located in memory.
+    const bool build_code_order =
+        FLAG_precompiled_mode && FLAG_use_bare_instructions;
+    RawArray* code_order = nullptr;
+    const intptr_t code_order_length = d->code_order_length();
+    if (build_code_order) {
+      code_order = static_cast<RawArray*>(
+          AllocateUninitialized(old_space, Array::InstanceSize(count)));
+      Deserializer::InitializeHeader(code_order, kArrayCid,
+                                     Array::InstanceSize(count), is_vm_object,
+                                     /*is_canonical=*/false);
+      code_order->ptr()->type_arguments_ = TypeArguments::null();
+      code_order->ptr()->length_ = Smi::New(code_order_length);
     }
+
+    for (intptr_t i = 0; i < count; i++) {
+      auto code = AllocateUninitialized(old_space, Code::InstanceSize(0));
+      d->AssignRef(code);
+      if (code_order != nullptr && i < code_order_length) {
+        code_order->ptr()->data()[i] = code;
+      }
+    }
+
+    if (code_order != nullptr) {
+      const auto& code_order_table = Array::Handle(code_order);
+      d->isolate()->object_store()->set_code_order_table(code_order_table);
+    }
+
     stop_index_ = d->next_index();
   }
 
   void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
+    const bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawCode* code = reinterpret_cast<RawCode*>(d->Ref(id));
@@ -1651,10 +1497,12 @@
       code->ptr()->entry_point_ = Instructions::EntryPoint(instr);
       code->ptr()->monomorphic_entry_point_ =
           Instructions::MonomorphicEntryPoint(instr);
-      NOT_IN_PRECOMPILED(code->ptr()->active_instructions_ = instr);
-      code->ptr()->instructions_ = instr;
       code->ptr()->unchecked_entry_point_ =
           Instructions::UncheckedEntryPoint(instr);
+      code->ptr()->monomorphic_unchecked_entry_point_ =
+          Instructions::MonomorphicUncheckedEntryPoint(instr);
+      NOT_IN_PRECOMPILED(code->ptr()->active_instructions_ = instr);
+      code->ptr()->instructions_ = instr;
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() == Snapshot::kFullJIT) {
@@ -1712,10 +1560,74 @@
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
+class BytecodeSerializationCluster : public SerializationCluster {
+ public:
+  BytecodeSerializationCluster() : SerializationCluster("Bytecode") {}
+  virtual ~BytecodeSerializationCluster() {}
+
+  void Trace(Serializer* s, RawObject* object) {
+    RawBytecode* bytecode = Bytecode::RawCast(object);
+    objects_.Add(bytecode);
+    PushFromTo(bytecode);
+  }
+
+  void WriteAlloc(Serializer* s) {
+    s->WriteCid(kBytecodeCid);
+    intptr_t count = objects_.length();
+    s->WriteUnsigned(count);
+    for (intptr_t i = 0; i < count; i++) {
+      RawBytecode* bytecode = objects_[i];
+      s->AssignRef(bytecode);
+    }
+  }
+
+  void WriteFill(Serializer* s) {
+    ASSERT(s->kind() == Snapshot::kFullJIT);
+    intptr_t count = objects_.length();
+    for (intptr_t i = 0; i < count; i++) {
+      RawBytecode* bytecode = objects_[i];
+      WriteFromTo(bytecode);
+      s->Write<int32_t>(bytecode->ptr()->source_positions_binary_offset_);
+    }
+  }
+
+ private:
+  GrowableArray<RawBytecode*> objects_;
+};
+
+class BytecodeDeserializationCluster : public DeserializationCluster {
+ public:
+  BytecodeDeserializationCluster() {}
+  virtual ~BytecodeDeserializationCluster() {}
+
+  void ReadAlloc(Deserializer* d) {
+    start_index_ = d->next_index();
+    PageSpace* old_space = d->heap()->old_space();
+    intptr_t count = d->ReadUnsigned();
+    for (intptr_t i = 0; i < count; i++) {
+      d->AssignRef(AllocateUninitialized(old_space, Bytecode::InstanceSize()));
+    }
+    stop_index_ = d->next_index();
+  }
+
+  void ReadFill(Deserializer* d) {
+    ASSERT(d->kind() == Snapshot::kFullJIT);
+    bool is_vm_object = d->isolate() == Dart::vm_isolate();
+
+    for (intptr_t id = start_index_; id < stop_index_; id++) {
+      RawBytecode* bytecode = reinterpret_cast<RawBytecode*>(d->Ref(id));
+      Deserializer::InitializeHeader(bytecode, kBytecodeCid,
+                                     Bytecode::InstanceSize(), is_vm_object);
+      ReadFromTo(bytecode);
+      bytecode->ptr()->source_positions_binary_offset_ = d->Read<int32_t>();
+    }
+  }
+};
+
 class ObjectPoolSerializationCluster : public SerializationCluster {
  public:
   ObjectPoolSerializationCluster() : SerializationCluster("ObjectPool") {}
-  virtual ~ObjectPoolSerializationCluster() {}
+  ~ObjectPoolSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawObjectPool* pool = ObjectPool::RawCast(object);
@@ -1738,9 +1650,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawObjectPool* pool = objects_[i];
+      s->AssignRef(pool);
+      AutoTraceObject(pool);
       intptr_t length = pool->ptr()->length_;
       s->WriteUnsigned(length);
-      s->AssignRef(pool);
     }
   }
 
@@ -1748,6 +1661,7 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawObjectPool* pool = objects_[i];
+      AutoTraceObject(pool);
       intptr_t length = pool->ptr()->length_;
       s->WriteUnsigned(length);
       uint8_t* entry_bits = pool->ptr()->entry_bits();
@@ -1757,18 +1671,16 @@
         switch (ObjectPool::TypeBits::decode(entry_bits[j])) {
           case ObjectPool::kTaggedObject: {
 #if !defined(TARGET_ARCH_DBC)
-            if ((entry.raw_obj_ ==
-                 StubCode::CallNoScopeNative_entry()->code()) ||
-                (entry.raw_obj_ ==
-                 StubCode::CallAutoScopeNative_entry()->code())) {
+            if ((entry.raw_obj_ == StubCode::CallNoScopeNative().raw()) ||
+                (entry.raw_obj_ == StubCode::CallAutoScopeNative().raw())) {
               // Natives can run while precompiling, becoming linked and
               // switching their stub. Reset to the initial stub used for
               // lazy-linking.
-              s->WriteRef(StubCode::CallBootstrapNative_entry()->code());
+              s->WriteElementRef(StubCode::CallBootstrapNative().raw(), j);
               break;
             }
 #endif
-            s->WriteRef(entry.raw_obj_);
+            s->WriteElementRef(entry.raw_obj_, j);
             break;
           }
           case ObjectPool::kImmediate: {
@@ -1788,7 +1700,7 @@
               payload->trampoline = NULL;
               payload->native_function = NULL;
             }
-            s->WriteRef(raw);
+            s->WriteElementRef(raw, j);
             break;
           }
           case ObjectPool::kNativeFunction:
@@ -1811,7 +1723,7 @@
 class ObjectPoolDeserializationCluster : public DeserializationCluster {
  public:
   ObjectPoolDeserializationCluster() {}
-  virtual ~ObjectPoolDeserializationCluster() {}
+  ~ObjectPoolDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -1873,7 +1785,7 @@
  public:
   RODataSerializationCluster(const char* name, intptr_t cid)
       : SerializationCluster(name), cid_(cid) {}
-  virtual ~RODataSerializationCluster() {}
+  ~RODataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     // A string's hash must already be computed when we write it because it
@@ -1900,12 +1812,13 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawObject* object = shared_objects_[i];
+      s->AssignRef(object);
+      AutoTraceObject(object);
       uint32_t offset;
       if (!s->GetSharedDataOffset(object, &offset)) {
         UNREACHABLE();
       }
       s->WriteUnsigned(offset);
-      s->AssignRef(object);
     }
 
     count = objects_.length();
@@ -1913,12 +1826,19 @@
     uint32_t running_offset = 0;
     for (intptr_t i = 0; i < count; i++) {
       RawObject* object = objects_[i];
+      s->AssignRef(object);
+      if (cid_ == kOneByteStringCid || cid_ == kTwoByteStringCid) {
+        s->TraceStartWritingObject(name(), object, String::RawCast(object));
+      } else {
+        s->TraceStartWritingObject(name(), object, nullptr);
+      }
       uint32_t offset = s->GetDataOffset(object);
+      s->TraceDataOffset(offset);
       ASSERT(Utils::IsAligned(offset, kObjectAlignment));
       ASSERT(offset > running_offset);
       s->WriteUnsigned((offset - running_offset) >> kObjectAlignmentLog2);
       running_offset = offset;
-      s->AssignRef(object);
+      s->TraceEndWritingObject();
     }
   }
 
@@ -1936,7 +1856,7 @@
 class RODataDeserializationCluster : public DeserializationCluster {
  public:
   RODataDeserializationCluster() {}
-  virtual ~RODataDeserializationCluster() {}
+  ~RODataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     intptr_t count = d->ReadUnsigned();
@@ -1963,7 +1883,7 @@
  public:
   ExceptionHandlersSerializationCluster()
       : SerializationCluster("ExceptionHandlers") {}
-  virtual ~ExceptionHandlersSerializationCluster() {}
+  ~ExceptionHandlersSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawExceptionHandlers* handlers = ExceptionHandlers::RawCast(object);
@@ -1978,9 +1898,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawExceptionHandlers* handlers = objects_[i];
+      s->AssignRef(handlers);
+      AutoTraceObject(handlers);
       intptr_t length = handlers->ptr()->num_entries_;
       s->WriteUnsigned(length);
-      s->AssignRef(handlers);
     }
   }
 
@@ -1988,9 +1909,10 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawExceptionHandlers* handlers = objects_[i];
+      AutoTraceObject(handlers);
       intptr_t length = handlers->ptr()->num_entries_;
       s->WriteUnsigned(length);
-      s->WriteRef(handlers->ptr()->handled_types_data_);
+      WriteField(handlers, handled_types_data_);
       for (intptr_t j = 0; j < length; j++) {
         const ExceptionHandlerInfo& info = handlers->ptr()->data()[j];
         s->Write<uint32_t>(info.handler_pc_offset);
@@ -2010,7 +1932,7 @@
 class ExceptionHandlersDeserializationCluster : public DeserializationCluster {
  public:
   ExceptionHandlersDeserializationCluster() {}
-  virtual ~ExceptionHandlersDeserializationCluster() {}
+  ~ExceptionHandlersDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2053,7 +1975,7 @@
 class ContextSerializationCluster : public SerializationCluster {
  public:
   ContextSerializationCluster() : SerializationCluster("Context") {}
-  virtual ~ContextSerializationCluster() {}
+  ~ContextSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawContext* context = Context::RawCast(object);
@@ -2072,9 +1994,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawContext* context = objects_[i];
+      s->AssignRef(context);
+      AutoTraceObject(context);
       intptr_t length = context->ptr()->num_variables_;
       s->WriteUnsigned(length);
-      s->AssignRef(context);
     }
   }
 
@@ -2082,11 +2005,12 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawContext* context = objects_[i];
+      AutoTraceObject(context);
       intptr_t length = context->ptr()->num_variables_;
       s->WriteUnsigned(length);
-      s->WriteRef(context->ptr()->parent_);
+      WriteField(context, parent_);
       for (intptr_t j = 0; j < length; j++) {
-        s->WriteRef(context->ptr()->data()[j]);
+        s->WriteElementRef(context->ptr()->data()[j], j);
       }
     }
   }
@@ -2099,7 +2023,7 @@
 class ContextDeserializationCluster : public DeserializationCluster {
  public:
   ContextDeserializationCluster() {}
-  virtual ~ContextDeserializationCluster() {}
+  ~ContextDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2134,18 +2058,14 @@
 class ContextScopeSerializationCluster : public SerializationCluster {
  public:
   ContextScopeSerializationCluster() : SerializationCluster("ContextScope") {}
-  virtual ~ContextScopeSerializationCluster() {}
+  ~ContextScopeSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawContextScope* scope = ContextScope::RawCast(object);
     objects_.Add(scope);
 
     intptr_t length = scope->ptr()->num_variables_;
-    RawObject** from = scope->from();
-    RawObject** to = scope->to(length);
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(scope, length);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -2154,9 +2074,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawContextScope* scope = objects_[i];
+      s->AssignRef(scope);
+      AutoTraceObject(scope);
       intptr_t length = scope->ptr()->num_variables_;
       s->WriteUnsigned(length);
-      s->AssignRef(scope);
     }
   }
 
@@ -2164,14 +2085,11 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawContextScope* scope = objects_[i];
+      AutoTraceObject(scope);
       intptr_t length = scope->ptr()->num_variables_;
       s->WriteUnsigned(length);
       s->Write<bool>(scope->ptr()->is_implicit_);
-      RawObject** from = scope->from();
-      RawObject** to = scope->to(length);
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      WriteFromTo(scope, length);
     }
   }
 
@@ -2183,7 +2101,7 @@
 class ContextScopeDeserializationCluster : public DeserializationCluster {
  public:
   ContextScopeDeserializationCluster() {}
-  virtual ~ContextScopeDeserializationCluster() {}
+  ~ContextScopeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2208,11 +2126,7 @@
                                      is_vm_object);
       scope->ptr()->num_variables_ = length;
       scope->ptr()->is_implicit_ = d->Read<bool>();
-      RawObject** from = scope->from();
-      RawObject** to = scope->to(length);
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(scope, length);
     }
   }
 };
@@ -2221,17 +2135,12 @@
 class UnlinkedCallSerializationCluster : public SerializationCluster {
  public:
   UnlinkedCallSerializationCluster() : SerializationCluster("UnlinkedCall") {}
-  virtual ~UnlinkedCallSerializationCluster() {}
+  ~UnlinkedCallSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawUnlinkedCall* unlinked = UnlinkedCall::RawCast(object);
     objects_.Add(unlinked);
-
-    RawObject** from = unlinked->from();
-    RawObject** to = unlinked->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(unlinked);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -2248,11 +2157,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawUnlinkedCall* unlinked = objects_[i];
-      RawObject** from = unlinked->from();
-      RawObject** to = unlinked->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(unlinked);
+      WriteFromTo(unlinked);
     }
   }
 
@@ -2264,7 +2170,7 @@
 class UnlinkedCallDeserializationCluster : public DeserializationCluster {
  public:
   UnlinkedCallDeserializationCluster() {}
-  virtual ~UnlinkedCallDeserializationCluster() {}
+  ~UnlinkedCallDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2286,11 +2192,7 @@
       Deserializer::InitializeHeader(unlinked, kUnlinkedCallCid,
                                      UnlinkedCall::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = unlinked->from();
-      RawObject** to = unlinked->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(unlinked);
     }
   }
 };
@@ -2299,17 +2201,12 @@
 class ICDataSerializationCluster : public SerializationCluster {
  public:
   ICDataSerializationCluster() : SerializationCluster("ICData") {}
-  virtual ~ICDataSerializationCluster() {}
+  ~ICDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawICData* ic = ICData::RawCast(object);
     objects_.Add(ic);
-
-    RawObject** from = ic->from();
-    RawObject** to = ic->to_snapshot(s->kind());
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(ic);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -2327,11 +2224,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawICData* ic = objects_[i];
-      RawObject** from = ic->from();
-      RawObject** to = ic->to_snapshot(kind);
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(ic);
+      WriteFromTo(ic);
       if (kind != Snapshot::kFullAOT) {
         NOT_IN_PRECOMPILED(s->Write<int32_t>(ic->ptr()->deopt_id_));
       }
@@ -2350,7 +2244,7 @@
 class ICDataDeserializationCluster : public DeserializationCluster {
  public:
   ICDataDeserializationCluster() {}
-  virtual ~ICDataDeserializationCluster() {}
+  ~ICDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2363,22 +2257,13 @@
   }
 
   void ReadFill(Deserializer* d) {
-    Snapshot::Kind kind = d->kind();
     bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       RawICData* ic = reinterpret_cast<RawICData*>(d->Ref(id));
       Deserializer::InitializeHeader(ic, kICDataCid, ICData::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = ic->from();
-      RawObject** to_snapshot = ic->to_snapshot(kind);
-      RawObject** to = ic->to();
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to_snapshot + 1; p <= to; p++) {
-        *p = Object::null();
-      }
+      ReadFromTo(ic);
       NOT_IN_PRECOMPILED(ic->ptr()->deopt_id_ = d->Read<int32_t>());
       ic->ptr()->state_bits_ = d->Read<int32_t>();
 #if defined(TAG_IC_DATA)
@@ -2393,17 +2278,12 @@
  public:
   MegamorphicCacheSerializationCluster()
       : SerializationCluster("MegamorphicCache") {}
-  virtual ~MegamorphicCacheSerializationCluster() {}
+  ~MegamorphicCacheSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawMegamorphicCache* cache = MegamorphicCache::RawCast(object);
     objects_.Add(cache);
-
-    RawObject** from = cache->from();
-    RawObject** to = cache->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(cache);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -2420,11 +2300,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawMegamorphicCache* cache = objects_[i];
-      RawObject** from = cache->from();
-      RawObject** to = cache->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(cache);
+      WriteFromTo(cache);
       s->Write<int32_t>(cache->ptr()->filled_entry_count_);
     }
   }
@@ -2437,7 +2314,7 @@
 class MegamorphicCacheDeserializationCluster : public DeserializationCluster {
  public:
   MegamorphicCacheDeserializationCluster() {}
-  virtual ~MegamorphicCacheDeserializationCluster() {}
+  ~MegamorphicCacheDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2459,14 +2336,36 @@
       Deserializer::InitializeHeader(cache, kMegamorphicCacheCid,
                                      MegamorphicCache::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = cache->from();
-      RawObject** to = cache->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(cache);
       cache->ptr()->filled_entry_count_ = d->Read<int32_t>();
     }
   }
+
+  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+    if (FLAG_use_bare_instructions) {
+      // By default, every megamorphic call site will load the target
+      // [Function] from the hash table and call indirectly via loading the
+      // entrypoint from the function.
+      //
+      // In --use-bare-instruction we reduce the extra indirection via the
+      // [Function] object by storing the entry point directly into the hashmap.
+      //
+      // Currently our AOT compiler will emit megamorphic calls in certain
+      // situations (namely in slow-path code of CheckedSmi* instructions).
+      //
+      // TODO(compiler-team): Change the CheckedSmi* slow path code to use
+      // normal switchable calls instead of megamorphic calls. (This is also a
+      // memory balance beause [MegamorphicCache]s are per-selector while
+      // [ICData] are per-callsite.)
+      auto& cache = MegamorphicCache::Handle(zone);
+      for (intptr_t i = start_index_; i < stop_index_; ++i) {
+        cache ^= refs.At(i);
+        cache.SwitchToBareInstructions();
+      }
+    }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+  }
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -2474,7 +2373,7 @@
  public:
   SubtypeTestCacheSerializationCluster()
       : SerializationCluster("SubtypeTestCache") {}
-  virtual ~SubtypeTestCacheSerializationCluster() {}
+  ~SubtypeTestCacheSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawSubtypeTestCache* cache = SubtypeTestCache::RawCast(object);
@@ -2496,7 +2395,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawSubtypeTestCache* cache = objects_[i];
-      s->WriteRef(cache->ptr()->cache_);
+      AutoTraceObject(cache);
+      WriteField(cache, cache_);
     }
   }
 
@@ -2508,7 +2408,7 @@
 class SubtypeTestCacheDeserializationCluster : public DeserializationCluster {
  public:
   SubtypeTestCacheDeserializationCluster() {}
-  virtual ~SubtypeTestCacheDeserializationCluster() {}
+  ~SubtypeTestCacheDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2539,17 +2439,12 @@
 class LanguageErrorSerializationCluster : public SerializationCluster {
  public:
   LanguageErrorSerializationCluster() : SerializationCluster("LanguageError") {}
-  virtual ~LanguageErrorSerializationCluster() {}
+  ~LanguageErrorSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLanguageError* error = LanguageError::RawCast(object);
     objects_.Add(error);
-
-    RawObject** from = error->from();
-    RawObject** to = error->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(error);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -2566,11 +2461,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawLanguageError* error = objects_[i];
-      RawObject** from = error->from();
-      RawObject** to = error->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(error);
+      WriteFromTo(error);
       s->WriteTokenPosition(error->ptr()->token_pos_);
       s->Write<bool>(error->ptr()->report_after_token_);
       s->Write<int8_t>(error->ptr()->kind_);
@@ -2585,7 +2477,7 @@
 class LanguageErrorDeserializationCluster : public DeserializationCluster {
  public:
   LanguageErrorDeserializationCluster() {}
-  virtual ~LanguageErrorDeserializationCluster() {}
+  ~LanguageErrorDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2606,11 +2498,7 @@
       Deserializer::InitializeHeader(error, kLanguageErrorCid,
                                      LanguageError::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = error->from();
-      RawObject** to = error->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(error);
       error->ptr()->token_pos_ = d->ReadTokenPosition();
       error->ptr()->report_after_token_ = d->Read<bool>();
       error->ptr()->kind_ = d->Read<int8_t>();
@@ -2623,17 +2511,12 @@
  public:
   UnhandledExceptionSerializationCluster()
       : SerializationCluster("UnhandledException") {}
-  virtual ~UnhandledExceptionSerializationCluster() {}
+  ~UnhandledExceptionSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawUnhandledException* exception = UnhandledException::RawCast(object);
     objects_.Add(exception);
-
-    RawObject** from = exception->from();
-    RawObject** to = exception->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(exception);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -2650,11 +2533,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawUnhandledException* exception = objects_[i];
-      RawObject** from = exception->from();
-      RawObject** to = exception->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(exception);
+      WriteFromTo(exception);
     }
   }
 
@@ -2666,7 +2546,7 @@
 class UnhandledExceptionDeserializationCluster : public DeserializationCluster {
  public:
   UnhandledExceptionDeserializationCluster() {}
-  virtual ~UnhandledExceptionDeserializationCluster() {}
+  ~UnhandledExceptionDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2688,11 +2568,7 @@
       Deserializer::InitializeHeader(exception, kUnhandledExceptionCid,
                                      UnhandledException::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = exception->from();
-      RawObject** to = exception->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(exception);
     }
   }
 };
@@ -2708,7 +2584,7 @@
     ASSERT(next_field_offset_in_words_ > 0);
     ASSERT(instance_size_in_words_ > 0);
   }
-  virtual ~InstanceSerializationCluster() {}
+  ~InstanceSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawInstance* instance = Instance::RawCast(object);
@@ -2743,12 +2619,13 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawInstance* instance = objects_[i];
+      AutoTraceObject(instance);
       s->Write<bool>(instance->IsCanonical());
       intptr_t offset = Instance::NextFieldOffset();
       while (offset < next_field_offset) {
         RawObject* raw_obj = *reinterpret_cast<RawObject**>(
             reinterpret_cast<uword>(instance->ptr()) + offset);
-        s->WriteRef(raw_obj);
+        s->WriteElementRef(raw_obj, offset);
         offset += kWordSize;
       }
     }
@@ -2765,7 +2642,7 @@
 class InstanceDeserializationCluster : public DeserializationCluster {
  public:
   explicit InstanceDeserializationCluster(intptr_t cid) : cid_(cid) {}
-  virtual ~InstanceDeserializationCluster() {}
+  ~InstanceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2819,17 +2696,12 @@
 class LibraryPrefixSerializationCluster : public SerializationCluster {
  public:
   LibraryPrefixSerializationCluster() : SerializationCluster("LibraryPrefix") {}
-  virtual ~LibraryPrefixSerializationCluster() {}
+  ~LibraryPrefixSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLibraryPrefix* prefix = LibraryPrefix::RawCast(object);
     objects_.Add(prefix);
-
-    RawObject** from = prefix->from();
-    RawObject** to = prefix->to_snapshot(s->kind());
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(prefix);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -2843,15 +2715,11 @@
   }
 
   void WriteFill(Serializer* s) {
-    Snapshot::Kind kind = s->kind();
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawLibraryPrefix* prefix = objects_[i];
-      RawObject** from = prefix->from();
-      RawObject** to = prefix->to_snapshot(kind);
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(prefix);
+      WriteFromTo(prefix);
       s->Write<uint16_t>(prefix->ptr()->num_imports_);
       s->Write<bool>(prefix->ptr()->is_deferred_load_);
     }
@@ -2865,7 +2733,7 @@
 class LibraryPrefixDeserializationCluster : public DeserializationCluster {
  public:
   LibraryPrefixDeserializationCluster() {}
-  virtual ~LibraryPrefixDeserializationCluster() {}
+  ~LibraryPrefixDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -2879,7 +2747,6 @@
   }
 
   void ReadFill(Deserializer* d) {
-    Snapshot::Kind kind = d->kind();
     bool is_vm_object = d->isolate() == Dart::vm_isolate();
 
     for (intptr_t id = start_index_; id < stop_index_; id++) {
@@ -2888,16 +2755,7 @@
       Deserializer::InitializeHeader(prefix, kLibraryPrefixCid,
                                      LibraryPrefix::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = prefix->from();
-      RawObject** to_snapshot = prefix->to_snapshot(kind);
-      RawObject** to = prefix->to();
-      for (RawObject** p = from; p <= to_snapshot; p++) {
-        *p = d->ReadRef();
-      }
-      for (RawObject** p = to_snapshot + 1; p <= to; p++) {
-        *p = Object::null();
-      }
-
+      ReadFromTo(prefix);
       prefix->ptr()->num_imports_ = d->Read<uint16_t>();
       prefix->ptr()->is_deferred_load_ = d->Read<bool>();
       prefix->ptr()->is_loaded_ = !prefix->ptr()->is_deferred_load_;
@@ -2910,7 +2768,7 @@
  public:
   explicit TypeSerializationCluster(const TypeTestingStubFinder& ttsf)
       : SerializationCluster("Type"), type_testing_stubs_(ttsf) {}
-  virtual ~TypeSerializationCluster() {}
+  ~TypeSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawType* type = Type::RawCast(object);
@@ -2920,11 +2778,7 @@
       objects_.Add(type);
     }
 
-    RawObject** from = type->from();
-    RawObject** to = type->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(type);
 
     if (type->ptr()->type_class_id_->IsHeapObject()) {
       // Type class is still an unresolved class.
@@ -2961,11 +2815,8 @@
     intptr_t count = canonical_objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawType* type = canonical_objects_[i];
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(type);
+      WriteFromTo(type);
       s->WriteTokenPosition(type->ptr()->token_pos_);
       s->Write<int8_t>(type->ptr()->type_state_);
       if (should_write_type_testing_stub) {
@@ -2977,11 +2828,8 @@
     count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawType* type = objects_[i];
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(type);
+      WriteFromTo(type);
       s->WriteTokenPosition(type->ptr()->token_pos_);
       s->Write<int8_t>(type->ptr()->type_state_);
       if (should_write_type_testing_stub) {
@@ -3015,7 +2863,7 @@
  public:
   TypeDeserializationCluster()
       : type_(AbstractType::Handle()), instr_(Instructions::Handle()) {}
-  virtual ~TypeDeserializationCluster() {}
+  ~TypeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     canonical_start_index_ = d->next_index();
@@ -3044,11 +2892,7 @@
       RawType* type = reinterpret_cast<RawType*>(d->Ref(id));
       Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(),
                                      is_vm_isolate, true);
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(type);
       type->ptr()->token_pos_ = d->ReadTokenPosition();
       type->ptr()->type_state_ = d->Read<int8_t>();
       if (should_read_type_testing_stub) {
@@ -3062,11 +2906,7 @@
       RawType* type = reinterpret_cast<RawType*>(d->Ref(id));
       Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(),
                                      is_vm_isolate);
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(type);
       type->ptr()->token_pos_ = d->ReadTokenPosition();
       type->ptr()->type_state_ = d->Read<int8_t>();
       if (should_read_type_testing_stub) {
@@ -3114,17 +2954,12 @@
  public:
   explicit TypeRefSerializationCluster(const TypeTestingStubFinder& ttsf)
       : SerializationCluster("TypeRef"), type_testing_stubs_(ttsf) {}
-  virtual ~TypeRefSerializationCluster() {}
+  ~TypeRefSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTypeRef* type = TypeRef::RawCast(object);
     objects_.Add(type);
-
-    RawObject** from = type->from();
-    RawObject** to = type->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(type);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -3144,11 +2979,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawTypeRef* type = objects_[i];
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(type);
+      WriteFromTo(type);
       if (should_write_type_testing_stub) {
         RawInstructions* instr = type_testing_stubs_.LookupByAddresss(
             type->ptr()->type_test_stub_entry_point_);
@@ -3167,7 +2999,7 @@
  public:
   TypeRefDeserializationCluster()
       : type_(AbstractType::Handle()), instr_(Instructions::Handle()) {}
-  virtual ~TypeRefDeserializationCluster() {}
+  ~TypeRefDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3188,11 +3020,7 @@
       RawTypeRef* type = reinterpret_cast<RawTypeRef*>(d->Ref(id));
       Deserializer::InitializeHeader(type, kTypeRefCid, TypeRef::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(type);
       if (should_read_type_testing_stub) {
         instr_ = d->ReadInstructions();
         type_ = type;
@@ -3222,18 +3050,13 @@
   explicit TypeParameterSerializationCluster(const TypeTestingStubFinder& ttsf)
       : SerializationCluster("TypeParameter"), type_testing_stubs_(ttsf) {}
 
-  virtual ~TypeParameterSerializationCluster() {}
+  ~TypeParameterSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTypeParameter* type = TypeParameter::RawCast(object);
     objects_.Add(type);
     ASSERT(!type->IsCanonical());
-
-    RawObject** from = type->from();
-    RawObject** to = type->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(type);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -3253,11 +3076,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawTypeParameter* type = objects_[i];
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(type);
+      WriteFromTo(type);
       s->Write<int32_t>(type->ptr()->parameterized_class_id_);
       s->WriteTokenPosition(type->ptr()->token_pos_);
       s->Write<int16_t>(type->ptr()->index_);
@@ -3280,7 +3100,7 @@
  public:
   TypeParameterDeserializationCluster()
       : type_(AbstractType::Handle()), instr_(Instructions::Handle()) {}
-  virtual ~TypeParameterDeserializationCluster() {}
+  ~TypeParameterDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3302,11 +3122,7 @@
       RawTypeParameter* type = reinterpret_cast<RawTypeParameter*>(d->Ref(id));
       Deserializer::InitializeHeader(
           type, kTypeParameterCid, TypeParameter::InstanceSize(), is_vm_object);
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(type);
       type->ptr()->parameterized_class_id_ = d->Read<int32_t>();
       type->ptr()->token_pos_ = d->ReadTokenPosition();
       type->ptr()->index_ = d->Read<int16_t>();
@@ -3335,96 +3151,15 @@
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-class BoundedTypeSerializationCluster : public SerializationCluster {
- public:
-  BoundedTypeSerializationCluster() : SerializationCluster("BoundedType") {}
-  virtual ~BoundedTypeSerializationCluster() {}
-
-  void Trace(Serializer* s, RawObject* object) {
-    RawBoundedType* type = BoundedType::RawCast(object);
-    objects_.Add(type);
-
-    RawObject** from = type->from();
-    RawObject** to = type->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
-  }
-
-  void WriteAlloc(Serializer* s) {
-    s->WriteCid(kBoundedTypeCid);
-    intptr_t count = objects_.length();
-    s->WriteUnsigned(count);
-    for (intptr_t i = 0; i < count; i++) {
-      RawBoundedType* type = objects_[i];
-      s->AssignRef(type);
-    }
-  }
-
-  void WriteFill(Serializer* s) {
-    intptr_t count = objects_.length();
-    for (intptr_t i = 0; i < count; i++) {
-      RawBoundedType* type = objects_[i];
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
-    }
-  }
-
- private:
-  GrowableArray<RawBoundedType*> objects_;
-};
-#endif  // !DART_PRECOMPILED_RUNTIME
-
-class BoundedTypeDeserializationCluster : public DeserializationCluster {
- public:
-  BoundedTypeDeserializationCluster() {}
-  virtual ~BoundedTypeDeserializationCluster() {}
-
-  void ReadAlloc(Deserializer* d) {
-    start_index_ = d->next_index();
-    PageSpace* old_space = d->heap()->old_space();
-    intptr_t count = d->ReadUnsigned();
-    for (intptr_t i = 0; i < count; i++) {
-      d->AssignRef(
-          AllocateUninitialized(old_space, BoundedType::InstanceSize()));
-    }
-    stop_index_ = d->next_index();
-  }
-
-  void ReadFill(Deserializer* d) {
-    bool is_vm_object = d->isolate() == Dart::vm_isolate();
-
-    for (intptr_t id = start_index_; id < stop_index_; id++) {
-      RawBoundedType* type = reinterpret_cast<RawBoundedType*>(d->Ref(id));
-      Deserializer::InitializeHeader(type, kBoundedTypeCid,
-                                     BoundedType::InstanceSize(), is_vm_object);
-      RawObject** from = type->from();
-      RawObject** to = type->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
-    }
-  }
-};
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
 class ClosureSerializationCluster : public SerializationCluster {
  public:
   ClosureSerializationCluster() : SerializationCluster("Closure") {}
-  virtual ~ClosureSerializationCluster() {}
+  ~ClosureSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawClosure* closure = Closure::RawCast(object);
     objects_.Add(closure);
-
-    RawObject** from = closure->from();
-    RawObject** to = closure->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(closure);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -3441,12 +3176,9 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawClosure* closure = objects_[i];
+      AutoTraceObject(closure);
       s->Write<bool>(closure->IsCanonical());
-      RawObject** from = closure->from();
-      RawObject** to = closure->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      WriteFromTo(closure);
     }
   }
 
@@ -3458,7 +3190,7 @@
 class ClosureDeserializationCluster : public DeserializationCluster {
  public:
   ClosureDeserializationCluster() {}
-  virtual ~ClosureDeserializationCluster() {}
+  ~ClosureDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3479,11 +3211,7 @@
       Deserializer::InitializeHeader(closure, kClosureCid,
                                      Closure::InstanceSize(), is_vm_object,
                                      is_canonical);
-      RawObject** from = closure->from();
-      RawObject** to = closure->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(closure);
     }
   }
 };
@@ -3492,7 +3220,7 @@
 class MintSerializationCluster : public SerializationCluster {
  public:
   MintSerializationCluster() : SerializationCluster("Mint") {}
-  virtual ~MintSerializationCluster() {}
+  ~MintSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     if (!object->IsHeapObject()) {
@@ -3510,15 +3238,17 @@
     s->WriteUnsigned(smis_.length() + mints_.length());
     for (intptr_t i = 0; i < smis_.length(); i++) {
       RawSmi* smi = smis_[i];
+      s->AssignRef(smi);
+      AutoTraceObject(smi);
       s->Write<bool>(true);
       s->Write<int64_t>(Smi::Value(smi));
-      s->AssignRef(smi);
     }
     for (intptr_t i = 0; i < mints_.length(); i++) {
       RawMint* mint = mints_[i];
+      s->AssignRef(mint);
+      AutoTraceObject(mint);
       s->Write<bool>(mint->IsCanonical());
       s->Write<int64_t>(mint->ptr()->value_);
-      s->AssignRef(mint);
     }
   }
 
@@ -3533,7 +3263,7 @@
 class MintDeserializationCluster : public DeserializationCluster {
  public:
   MintDeserializationCluster() {}
-  virtual ~MintDeserializationCluster() {}
+  ~MintDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     PageSpace* old_space = d->heap()->old_space();
@@ -3581,7 +3311,7 @@
 class DoubleSerializationCluster : public SerializationCluster {
  public:
   DoubleSerializationCluster() : SerializationCluster("Double") {}
-  virtual ~DoubleSerializationCluster() {}
+  ~DoubleSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawDouble* dbl = Double::RawCast(object);
@@ -3602,6 +3332,7 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawDouble* dbl = objects_[i];
+      AutoTraceObject(dbl);
       s->Write<bool>(dbl->IsCanonical());
       s->Write<double>(dbl->ptr()->value_);
     }
@@ -3615,7 +3346,7 @@
 class DoubleDeserializationCluster : public DeserializationCluster {
  public:
   DoubleDeserializationCluster() {}
-  virtual ~DoubleDeserializationCluster() {}
+  ~DoubleDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3645,17 +3376,12 @@
  public:
   GrowableObjectArraySerializationCluster()
       : SerializationCluster("GrowableObjectArray") {}
-  virtual ~GrowableObjectArraySerializationCluster() {}
+  ~GrowableObjectArraySerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawGrowableObjectArray* array = GrowableObjectArray::RawCast(object);
     objects_.Add(array);
-
-    RawObject** from = array->from();
-    RawObject** to = array->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(array);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -3672,12 +3398,9 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawGrowableObjectArray* array = objects_[i];
+      AutoTraceObject(array);
       s->Write<bool>(array->IsCanonical());
-      RawObject** from = array->from();
-      RawObject** to = array->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      WriteFromTo(array);
     }
   }
 
@@ -3690,7 +3413,7 @@
     : public DeserializationCluster {
  public:
   GrowableObjectArrayDeserializationCluster() {}
-  virtual ~GrowableObjectArrayDeserializationCluster() {}
+  ~GrowableObjectArrayDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3713,11 +3436,7 @@
       Deserializer::InitializeHeader(list, kGrowableObjectArrayCid,
                                      GrowableObjectArray::InstanceSize(),
                                      is_vm_object, is_canonical);
-      RawObject** from = list->from();
-      RawObject** to = list->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(list);
     }
   }
 };
@@ -3727,7 +3446,7 @@
  public:
   explicit TypedDataSerializationCluster(intptr_t cid)
       : SerializationCluster("TypedData"), cid_(cid) {}
-  virtual ~TypedDataSerializationCluster() {}
+  ~TypedDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTypedData* data = TypedData::RawCast(object);
@@ -3740,9 +3459,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawTypedData* data = objects_[i];
+      s->AssignRef(data);
+      AutoTraceObject(data);
       intptr_t length = Smi::Value(data->ptr()->length_);
       s->WriteUnsigned(length);
-      s->AssignRef(data);
     }
   }
 
@@ -3751,6 +3471,7 @@
     intptr_t element_size = TypedData::ElementSizeInBytes(cid_);
     for (intptr_t i = 0; i < count; i++) {
       RawTypedData* data = objects_[i];
+      AutoTraceObject(data);
       intptr_t length = Smi::Value(data->ptr()->length_);
       s->WriteUnsigned(length);
       s->Write<bool>(data->IsCanonical());
@@ -3768,7 +3489,7 @@
 class TypedDataDeserializationCluster : public DeserializationCluster {
  public:
   explicit TypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
-  virtual ~TypedDataDeserializationCluster() {}
+  ~TypedDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3810,7 +3531,7 @@
  public:
   explicit ExternalTypedDataSerializationCluster(intptr_t cid)
       : SerializationCluster("ExternalTypedData"), cid_(cid) {}
-  virtual ~ExternalTypedDataSerializationCluster() {}
+  ~ExternalTypedDataSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawExternalTypedData* data = ExternalTypedData::RawCast(object);
@@ -3833,9 +3554,11 @@
     intptr_t element_size = ExternalTypedData::ElementSizeInBytes(cid_);
     for (intptr_t i = 0; i < count; i++) {
       RawExternalTypedData* data = objects_[i];
+      AutoTraceObject(data);
       intptr_t length = Smi::Value(data->ptr()->length_);
       s->WriteUnsigned(length);
       uint8_t* cdata = reinterpret_cast<uint8_t*>(data->ptr()->data_);
+      s->Align(ExternalTypedData::kDataSerializationAlignment);
       s->WriteBytes(cdata, length * element_size);
     }
   }
@@ -3849,7 +3572,7 @@
 class ExternalTypedDataDeserializationCluster : public DeserializationCluster {
  public:
   explicit ExternalTypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
-  virtual ~ExternalTypedDataDeserializationCluster() {}
+  ~ExternalTypedDataDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3873,6 +3596,7 @@
       Deserializer::InitializeHeader(
           data, cid_, ExternalTypedData::InstanceSize(), is_vm_object);
       data->ptr()->length_ = Smi::New(length);
+      d->Align(ExternalTypedData::kDataSerializationAlignment);
       data->ptr()->data_ = const_cast<uint8_t*>(d->CurrentBufferAddress());
       d->Advance(length * element_size);
       // No finalizer / external size 0.
@@ -3887,17 +3611,12 @@
 class StackTraceSerializationCluster : public SerializationCluster {
  public:
   StackTraceSerializationCluster() : SerializationCluster("StackTrace") {}
-  virtual ~StackTraceSerializationCluster() {}
+  ~StackTraceSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawStackTrace* trace = StackTrace::RawCast(object);
     objects_.Add(trace);
-
-    RawObject** from = trace->from();
-    RawObject** to = trace->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(trace);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -3914,11 +3633,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawStackTrace* trace = objects_[i];
-      RawObject** from = trace->from();
-      RawObject** to = trace->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(trace);
+      WriteFromTo(trace);
     }
   }
 
@@ -3930,7 +3646,7 @@
 class StackTraceDeserializationCluster : public DeserializationCluster {
  public:
   StackTraceDeserializationCluster() {}
-  virtual ~StackTraceDeserializationCluster() {}
+  ~StackTraceDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -3950,11 +3666,7 @@
       RawStackTrace* trace = reinterpret_cast<RawStackTrace*>(d->Ref(id));
       Deserializer::InitializeHeader(trace, kStackTraceCid,
                                      StackTrace::InstanceSize(), is_vm_object);
-      RawObject** from = trace->from();
-      RawObject** to = trace->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(trace);
     }
   }
 };
@@ -3963,17 +3675,12 @@
 class RegExpSerializationCluster : public SerializationCluster {
  public:
   RegExpSerializationCluster() : SerializationCluster("RegExp") {}
-  virtual ~RegExpSerializationCluster() {}
+  ~RegExpSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawRegExp* regexp = RegExp::RawCast(object);
     objects_.Add(regexp);
-
-    RawObject** from = regexp->from();
-    RawObject** to = regexp->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(regexp);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -3990,12 +3697,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawRegExp* regexp = objects_[i];
-      RawObject** from = regexp->from();
-      RawObject** to = regexp->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
-
+      AutoTraceObject(regexp);
+      WriteFromTo(regexp);
       s->Write<int32_t>(regexp->ptr()->num_registers_);
       s->Write<int8_t>(regexp->ptr()->type_flags_);
     }
@@ -4009,7 +3712,7 @@
 class RegExpDeserializationCluster : public DeserializationCluster {
  public:
   RegExpDeserializationCluster() {}
-  virtual ~RegExpDeserializationCluster() {}
+  ~RegExpDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4028,12 +3731,7 @@
       RawRegExp* regexp = reinterpret_cast<RawRegExp*>(d->Ref(id));
       Deserializer::InitializeHeader(regexp, kRegExpCid, RegExp::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = regexp->from();
-      RawObject** to = regexp->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
-
+      ReadFromTo(regexp);
       regexp->ptr()->num_registers_ = d->Read<int32_t>();
       regexp->ptr()->type_flags_ = d->Read<int8_t>();
     }
@@ -4044,17 +3742,12 @@
 class WeakPropertySerializationCluster : public SerializationCluster {
  public:
   WeakPropertySerializationCluster() : SerializationCluster("WeakProperty") {}
-  virtual ~WeakPropertySerializationCluster() {}
+  ~WeakPropertySerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawWeakProperty* property = WeakProperty::RawCast(object);
     objects_.Add(property);
-
-    RawObject** from = property->from();
-    RawObject** to = property->to();
-    for (RawObject** p = from; p <= to; p++) {
-      s->Push(*p);
-    }
+    PushFromTo(property);
   }
 
   void WriteAlloc(Serializer* s) {
@@ -4071,11 +3764,8 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawWeakProperty* property = objects_[i];
-      RawObject** from = property->from();
-      RawObject** to = property->to();
-      for (RawObject** p = from; p <= to; p++) {
-        s->WriteRef(*p);
-      }
+      AutoTraceObject(property);
+      WriteFromTo(property);
     }
   }
 
@@ -4087,7 +3777,7 @@
 class WeakPropertyDeserializationCluster : public DeserializationCluster {
  public:
   WeakPropertyDeserializationCluster() {}
-  virtual ~WeakPropertyDeserializationCluster() {}
+  ~WeakPropertyDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4109,11 +3799,7 @@
       Deserializer::InitializeHeader(property, kWeakPropertyCid,
                                      WeakProperty::InstanceSize(),
                                      is_vm_object);
-      RawObject** from = property->from();
-      RawObject** to = property->to();
-      for (RawObject** p = from; p <= to; p++) {
-        *p = d->ReadRef();
-      }
+      ReadFromTo(property);
     }
   }
 };
@@ -4122,7 +3808,7 @@
 class LinkedHashMapSerializationCluster : public SerializationCluster {
  public:
   LinkedHashMapSerializationCluster() : SerializationCluster("LinkedHashMap") {}
-  virtual ~LinkedHashMapSerializationCluster() {}
+  ~LinkedHashMapSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawLinkedHashMap* map = LinkedHashMap::RawCast(object);
@@ -4157,9 +3843,10 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawLinkedHashMap* map = objects_[i];
+      AutoTraceObject(map);
       s->Write<bool>(map->IsCanonical());
 
-      s->WriteRef(map->ptr()->type_arguments_);
+      WriteField(map, type_arguments_);
 
       const intptr_t used_data = Smi::Value(map->ptr()->used_data_);
       ASSERT((used_data & 1) == 0);  // Keys + values, so must be even.
@@ -4174,8 +3861,8 @@
         RawObject* key = data_elements[i];
         if (key != data_array) {
           RawObject* value = data_elements[i + 1];
-          s->WriteRef(key);
-          s->WriteRef(value);
+          s->WriteElementRef(key, i);
+          s->WriteElementRef(value, i + 1);
         }
       }
     }
@@ -4189,7 +3876,7 @@
 class LinkedHashMapDeserializationCluster : public DeserializationCluster {
  public:
   LinkedHashMapDeserializationCluster() {}
-  virtual ~LinkedHashMapDeserializationCluster() {}
+  ~LinkedHashMapDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4249,7 +3936,7 @@
  public:
   explicit ArraySerializationCluster(intptr_t cid)
       : SerializationCluster("Array"), cid_(cid) {}
-  virtual ~ArraySerializationCluster() {}
+  ~ArraySerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawArray* array = Array::RawCast(object);
@@ -4268,9 +3955,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawArray* array = objects_[i];
+      s->AssignRef(array);
+      AutoTraceObject(array);
       intptr_t length = Smi::Value(array->ptr()->length_);
       s->WriteUnsigned(length);
-      s->AssignRef(array);
     }
   }
 
@@ -4278,12 +3966,13 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawArray* array = objects_[i];
+      AutoTraceObject(array);
       intptr_t length = Smi::Value(array->ptr()->length_);
       s->WriteUnsigned(length);
       s->Write<bool>(array->IsCanonical());
-      s->WriteRef(array->ptr()->type_arguments_);
+      WriteField(array, type_arguments_);
       for (intptr_t j = 0; j < length; j++) {
-        s->WriteRef(array->ptr()->data()[j]);
+        s->WriteElementRef(array->ptr()->data()[j], j);
       }
     }
   }
@@ -4297,7 +3986,7 @@
 class ArrayDeserializationCluster : public DeserializationCluster {
  public:
   explicit ArrayDeserializationCluster(intptr_t cid) : cid_(cid) {}
-  virtual ~ArrayDeserializationCluster() {}
+  ~ArrayDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4337,7 +4026,7 @@
 class OneByteStringSerializationCluster : public SerializationCluster {
  public:
   OneByteStringSerializationCluster() : SerializationCluster("OneByteString") {}
-  virtual ~OneByteStringSerializationCluster() {}
+  ~OneByteStringSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawOneByteString* str = reinterpret_cast<RawOneByteString*>(object);
@@ -4350,9 +4039,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawOneByteString* str = objects_[i];
+      s->AssignRef(str);
+      AutoTraceObject(str);
       intptr_t length = Smi::Value(str->ptr()->length_);
       s->WriteUnsigned(length);
-      s->AssignRef(str);
     }
   }
 
@@ -4360,6 +4050,7 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawOneByteString* str = objects_[i];
+      AutoTraceObject(str);
       intptr_t length = Smi::Value(str->ptr()->length_);
       s->WriteUnsigned(length);
       s->Write<bool>(str->IsCanonical());
@@ -4377,7 +4068,7 @@
 class OneByteStringDeserializationCluster : public DeserializationCluster {
  public:
   OneByteStringDeserializationCluster() {}
-  virtual ~OneByteStringDeserializationCluster() {}
+  ~OneByteStringDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4414,7 +4105,7 @@
 class TwoByteStringSerializationCluster : public SerializationCluster {
  public:
   TwoByteStringSerializationCluster() : SerializationCluster("TwoByteString") {}
-  virtual ~TwoByteStringSerializationCluster() {}
+  ~TwoByteStringSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) {
     RawTwoByteString* str = reinterpret_cast<RawTwoByteString*>(object);
@@ -4427,9 +4118,10 @@
     s->WriteUnsigned(count);
     for (intptr_t i = 0; i < count; i++) {
       RawTwoByteString* str = objects_[i];
+      s->AssignRef(str);
+      AutoTraceObject(str);
       intptr_t length = Smi::Value(str->ptr()->length_);
       s->WriteUnsigned(length);
-      s->AssignRef(str);
     }
   }
 
@@ -4437,6 +4129,7 @@
     intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       RawTwoByteString* str = objects_[i];
+      AutoTraceObject(str);
       intptr_t length = Smi::Value(str->ptr()->length_);
       s->WriteUnsigned(length);
       s->Write<bool>(str->IsCanonical());
@@ -4454,7 +4147,7 @@
 class TwoByteStringDeserializationCluster : public DeserializationCluster {
  public:
   TwoByteStringDeserializationCluster() {}
-  virtual ~TwoByteStringDeserializationCluster() {}
+  ~TwoByteStringDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
     start_index_ = d->next_index();
@@ -4489,11 +4182,11 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 class FakeSerializationCluster : public SerializationCluster {
  public:
-  explicit FakeSerializationCluster(const char* name, intptr_t size)
+  FakeSerializationCluster(const char* name, intptr_t size)
       : SerializationCluster(name) {
     size_ = size;
   }
-  virtual ~FakeSerializationCluster() {}
+  ~FakeSerializationCluster() {}
 
   void Trace(Serializer* s, RawObject* object) { UNREACHABLE(); }
   void WriteAlloc(Serializer* s) { UNREACHABLE(); }
@@ -4506,8 +4199,10 @@
                        uint8_t** buffer,
                        ReAlloc alloc,
                        intptr_t initial_size,
-                       ImageWriter* image_writer)
-    : StackResource(thread),
+                       ImageWriter* image_writer,
+                       bool vm,
+                       V8SnapshotProfileWriter* profile_writer)
+    : ThreadStackResource(thread),
       heap_(thread->isolate()->heap()),
       zone_(thread->zone()),
       kind_(kind),
@@ -4518,7 +4213,9 @@
       num_cids_(0),
       num_base_objects_(0),
       num_written_objects_(0),
-      next_ref_index_(1)
+      next_ref_index_(1),
+      vm_(vm),
+      profile_writer_(profile_writer)
 #if defined(SNAPSHOT_BACKTRACE)
       ,
       current_parent_(Object::null()),
@@ -4530,12 +4227,56 @@
   for (intptr_t i = 0; i < num_cids_; i++) {
     clusters_by_cid_[i] = NULL;
   }
+  if (profile_writer_ != nullptr) {
+    offsets_table_ = new (zone_) OffsetsTable(zone_);
+  }
 }
 
 Serializer::~Serializer() {
   delete[] clusters_by_cid_;
 }
 
+void Serializer::TraceStartWritingObject(const char* type,
+                                         RawObject* obj,
+                                         RawString* name) {
+  if (profile_writer_ == nullptr) return;
+
+  intptr_t cid = -1;
+  intptr_t id = 0;
+  if (obj->IsHeapObject()) {
+    id = heap_->GetObjectId(obj);
+    cid = obj->GetClassId();
+  } else {
+    id = smi_ids_.Lookup(Smi::RawCast(obj))->id_;
+    cid = Smi::kClassId;
+  }
+  ASSERT(id != 0);
+
+  const char* name_str = nullptr;
+  if (name != nullptr) {
+    String& str = thread()->StringHandle();
+    str = name;
+    name_str = str.ToCString();
+  }
+
+  object_currently_writing_.object_ = obj;
+  object_currently_writing_.id_ = id;
+  object_currently_writing_.stream_start_ = stream_.Position();
+  object_currently_writing_.cid_ = cid;
+  profile_writer_->SetObjectTypeAndName(
+      {V8SnapshotProfileWriter::kSnapshot, id}, type, name_str);
+}
+
+void Serializer::TraceEndWritingObject() {
+  if (profile_writer_ != nullptr) {
+    ASSERT(object_currently_writing_.id_ != 0);
+    profile_writer_->AttributeBytesTo(
+        {V8SnapshotProfileWriter::kSnapshot, object_currently_writing_.id_},
+        stream_.Position() - object_currently_writing_.stream_start_);
+    object_currently_writing_ = ProfilingObject();
+  }
+}
+
 SerializationCluster* Serializer::NewClusterForClass(intptr_t cid) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
@@ -4557,8 +4298,6 @@
   switch (cid) {
     case kClassCid:
       return new (Z) ClassSerializationCluster(num_cids_);
-    case kUnresolvedClassCid:
-      return new (Z) UnresolvedClassSerializationCluster();
     case kTypeArgumentsCid:
       return new (Z) TypeArgumentsSerializationCluster();
     case kPatchClassCid:
@@ -4583,6 +4322,10 @@
       return new (Z) KernelProgramInfoSerializationCluster();
     case kCodeCid:
       return new (Z) CodeSerializationCluster();
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    case kBytecodeCid:
+      return new (Z) BytecodeSerializationCluster();
+#endif  // !DART_PRECOMPILED_RUNTIME
     case kObjectPoolCid:
       return new (Z) ObjectPoolSerializationCluster();
     case kPcDescriptorsCid:
@@ -4619,8 +4362,6 @@
       return new (Z) TypeRefSerializationCluster(type_testing_stubs_);
     case kTypeParameterCid:
       return new (Z) TypeParameterSerializationCluster(type_testing_stubs_);
-    case kBoundedTypeCid:
-      return new (Z) BoundedTypeSerializationCluster();
     case kClosureCid:
       return new (Z) ClosureSerializationCluster();
     case kMintCid:
@@ -4668,13 +4409,43 @@
 }
 
 void Serializer::WriteInstructions(RawInstructions* instr, RawCode* code) {
-  intptr_t offset = heap_->GetObjectId(instr);
-  if (offset == 0) {
-    offset = image_writer_->GetTextOffsetFor(instr, code);
-    ASSERT(offset != 0);
-    heap_->SetObjectId(instr, offset);
-  }
+  const intptr_t offset = image_writer_->GetTextOffsetFor(instr, code);
+  ASSERT(offset != 0);
   Write<int32_t>(offset);
+
+  // If offset < 0, it's pointing to a shared instruction. We don't profile
+  // references to shared text/data (since they don't consume any space). Of
+  // course, the space taken for the reference is profiled.
+  if (profile_writer_ != nullptr && offset >= 0) {
+    // Instructions cannot be roots.
+    ASSERT(object_currently_writing_.id_ != 0);
+    auto offset_space = vm_ ? V8SnapshotProfileWriter::kVmText
+                            : V8SnapshotProfileWriter::kIsolateText;
+    V8SnapshotProfileWriter::ObjectId to_object = {
+        offset_space, offset < 0 ? -offset : offset};
+    V8SnapshotProfileWriter::ObjectId from_object = {
+        V8SnapshotProfileWriter::kSnapshot, object_currently_writing_.id_};
+    profile_writer_->AttributeReferenceTo(
+        from_object, {to_object, V8SnapshotProfileWriter::Reference::kProperty,
+                      profile_writer_->EnsureString("<instructions>")});
+  }
+}
+
+void Serializer::TraceDataOffset(uint32_t offset) {
+  if (profile_writer_ != nullptr) {
+    // ROData cannot be roots.
+    ASSERT(object_currently_writing_.id_ != 0);
+    auto offset_space = vm_ ? V8SnapshotProfileWriter::kVmData
+                            : V8SnapshotProfileWriter::kIsolateData;
+    V8SnapshotProfileWriter::ObjectId from_object = {
+        V8SnapshotProfileWriter::kSnapshot, object_currently_writing_.id_};
+    V8SnapshotProfileWriter::ObjectId to_object = {offset_space, offset};
+    // TODO(sjindel): Give this edge a more appropriate type than element
+    // (internal, maybe?).
+    profile_writer_->AttributeReferenceTo(
+        from_object,
+        {to_object, V8SnapshotProfileWriter::Reference::kElement, 0});
+  }
 }
 
 bool Serializer::GetSharedDataOffset(RawObject* object,
@@ -4717,6 +4488,11 @@
   if (object->IsCode() && !Snapshot::IncludesCode(kind_)) {
     return;  // Do not trace, will write null.
   }
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (object->IsBytecode() && !Snapshot::IncludesBytecode(kind_)) {
+    return;  // Do not trace, will write null.
+  }
+#endif  // !DART_PRECOMPILED_RUNTIME
 
   if (object->IsSendPort()) {
     // TODO(rmacnak): Do a better job of resetting fields in precompilation
@@ -4726,11 +4502,16 @@
 
   intptr_t id = heap_->GetObjectId(object);
   if (id == 0) {
+    // When discovering the transitive closure of objects reachable from the
+    // roots we do not trace references, e.g. inside [RawCode], to
+    // [RawInstructions], since [RawInstructions] doesn't contain any references
+    // and the serialization code uses an [ImageWriter] for those.
+    ASSERT(object->GetClassId() != kInstructionsCid);
+
     heap_->SetObjectId(object, 1);
     ASSERT(heap_->GetObjectId(object) != 0);
     stack_.Add(object);
     num_written_objects_++;
-
 #if defined(SNAPSHOT_BACKTRACE)
     parent_pairs_.Add(&Object::Handle(zone_, object));
     parent_pairs_.Add(&Object::Handle(zone_, current_parent_));
@@ -4832,6 +4613,46 @@
     Trace(stack_.RemoveLast());
   }
 
+  intptr_t code_order_length = 0;
+#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32) &&                 \
+    !defined(TARGET_ARCH_DBC)
+  if (kind_ == Snapshot::kFullAOT) {
+    auto code_objects =
+        static_cast<CodeSerializationCluster*>(clusters_by_cid_[kCodeCid])
+            ->discovered_objects();
+
+    GrowableArray<ImageWriterCommand> writer_commands;
+    RelocateCodeObjects(vm_, code_objects, &writer_commands);
+    image_writer_->PrepareForSerialization(&writer_commands);
+
+    // We permute the code objects in the [CodeSerializationCluster] so they
+    // will arrive in the order in which the [Code]'s instructions will be in
+    // memory at AOT runtime.
+    GrowableArray<RawCode*> code_order;
+    RawCodeSet code_set;
+    for (auto& command : writer_commands) {
+      if (command.op == ImageWriterCommand::InsertInstructionOfCode) {
+        RawCode* code = command.insert_instruction_of_code.code;
+        ASSERT(!code_set.HasKey(code));
+        code_set.Insert(code);
+        code_order.Add(code);
+        code_order_length++;
+      }
+    }
+    for (RawCode* code : *code_objects) {
+      if (!code_set.HasKey(code)) {
+        code_set.Insert(code);
+        code_order.Add(code);
+      }
+    }
+    RELEASE_ASSERT(code_order.length() == code_objects->length());
+    for (intptr_t i = 0; i < code_objects->length(); ++i) {
+      (*code_objects)[i] = code_order[i];
+    }
+  }
+#endif  // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32) &&          \
+        // !defined(TARGET_ARCH_DBC)
+
   intptr_t num_clusters = 0;
   for (intptr_t cid = 1; cid < num_cids_; cid++) {
     SerializationCluster* cluster = clusters_by_cid_[cid];
@@ -4850,6 +4671,7 @@
   WriteUnsigned(num_base_objects_);
   WriteUnsigned(num_objects);
   WriteUnsigned(num_clusters);
+  WriteUnsigned(code_order_length);
 
   for (intptr_t cid = 1; cid < num_cids_; cid++) {
     SerializationCluster* cluster = clusters_by_cid_[cid];
@@ -4908,30 +4730,36 @@
   // These objects are always allocated by Object::InitOnce, so they are not
   // written into the snapshot.
 
-  AddBaseObject(Object::null());
-  AddBaseObject(Object::sentinel().raw());
-  AddBaseObject(Object::transition_sentinel().raw());
-  AddBaseObject(Object::empty_array().raw());
-  AddBaseObject(Object::zero_array().raw());
-  AddBaseObject(Object::dynamic_type().raw());
-  AddBaseObject(Object::void_type().raw());
-  AddBaseObject(Object::empty_type_arguments().raw());
-  AddBaseObject(Bool::True().raw());
-  AddBaseObject(Bool::False().raw());
+  AddBaseObject(Object::null(), "Null", "<null>");
+  AddBaseObject(Object::sentinel().raw(), "Sentinel");
+  AddBaseObject(Object::transition_sentinel().raw(), "Sentinel");
+  AddBaseObject(Object::empty_array().raw(), "Array", "<empty_array>");
+  AddBaseObject(Object::zero_array().raw(), "Array", "<zero_array>");
+  AddBaseObject(Object::dynamic_type().raw(), "Type", "<dynamic type>");
+  AddBaseObject(Object::void_type().raw(), "Type", "<void type>");
+  AddBaseObject(Object::empty_type_arguments().raw(), "TypeArguments", "[]");
+  AddBaseObject(Bool::True().raw(), "bool", "true");
+  AddBaseObject(Bool::False().raw(), "bool", "false");
   ASSERT(Object::extractor_parameter_types().raw() != Object::null());
-  AddBaseObject(Object::extractor_parameter_types().raw());
+  AddBaseObject(Object::extractor_parameter_types().raw(), "Array",
+                "<extractor parameter types>");
   ASSERT(Object::extractor_parameter_names().raw() != Object::null());
-  AddBaseObject(Object::extractor_parameter_names().raw());
-  AddBaseObject(Object::empty_context_scope().raw());
-  AddBaseObject(Object::empty_descriptors().raw());
-  AddBaseObject(Object::empty_var_descriptors().raw());
-  AddBaseObject(Object::empty_exception_handlers().raw());
+  AddBaseObject(Object::extractor_parameter_names().raw(), "Array",
+                "<extractor parameter names>");
+  AddBaseObject(Object::empty_context_scope().raw(), "ContextScope", "<empty>");
+  AddBaseObject(Object::empty_descriptors().raw(), "PcDescriptors", "<empty>");
+  AddBaseObject(Object::empty_var_descriptors().raw(), "LocalVarDescriptors",
+                "<empty>");
+  AddBaseObject(Object::empty_exception_handlers().raw(), "ExceptionHandlers",
+                "<empty>");
 
   for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
-    AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i]);
+    AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i],
+                  "ArgumentsDescriptor", "<cached arguments descriptor>");
   }
   for (intptr_t i = 0; i < ICData::kCachedICDataArrayCount; i++) {
-    AddBaseObject(ICData::cached_icdata_arrays_[i]);
+    AddBaseObject(ICData::cached_icdata_arrays_[i], "ICData",
+                  "<cached icdata>");
   }
 
   ClassTable* table = isolate()->class_table();
@@ -4939,15 +4767,15 @@
     // Error has no class object.
     if (cid != kErrorCid) {
       ASSERT(table->HasValidClassAt(cid));
-      AddBaseObject(table->At(cid));
+      AddBaseObject(table->At(cid), "Class");
     }
   }
-  AddBaseObject(table->At(kDynamicCid));
-  AddBaseObject(table->At(kVoidCid));
+  AddBaseObject(table->At(kDynamicCid), "Class");
+  AddBaseObject(table->At(kVoidCid), "Class");
 
   if (!Snapshot::IncludesCode(kind_)) {
     for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {
-      AddBaseObject(StubCode::EntryAt(i)->code());
+      AddBaseObject(StubCode::EntryAt(i).raw(), "Code", "<stub code>");
     }
   }
 }
@@ -4962,7 +4790,7 @@
   Push(symbols.raw());
   if (Snapshot::IncludesCode(kind_)) {
     for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {
-      Push(StubCode::EntryAt(i)->code());
+      Push(StubCode::EntryAt(i).raw());
     }
   }
   if (seeds != NULL) {
@@ -4974,10 +4802,10 @@
   Serialize();
 
   // Write roots.
-  WriteRef(symbols.raw());
+  WriteRootRef(symbols.raw());
   if (Snapshot::IncludesCode(kind_)) {
     for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {
-      WriteRef(StubCode::EntryAt(i)->code());
+      WriteRootRef(StubCode::EntryAt(i).raw());
     }
   }
 
@@ -5020,7 +4848,7 @@
 
   // Write roots.
   for (RawObject** p = from; p <= to; p++) {
-    WriteRef(*p);
+    WriteRootRef(*p);
   }
 
 #if defined(DEBUG)
@@ -5038,7 +4866,7 @@
                            const uint8_t* instructions_buffer,
                            const uint8_t* shared_data_buffer,
                            const uint8_t* shared_instructions_buffer)
-    : StackResource(thread),
+    : ThreadStackResource(thread),
       heap_(thread->isolate()->heap()),
       zone_(thread->zone()),
       kind_(kind),
@@ -5062,7 +4890,6 @@
 
 DeserializationCluster* Deserializer::ReadCluster() {
   intptr_t cid = ReadCid();
-
   Zone* Z = zone_;
   if ((cid >= kNumPredefinedCids) || (cid == kInstanceCid) ||
       RawObject::IsTypedDataViewClassId(cid)) {
@@ -5078,8 +4905,6 @@
   switch (cid) {
     case kClassCid:
       return new (Z) ClassDeserializationCluster();
-    case kUnresolvedClassCid:
-      return new (Z) UnresolvedClassDeserializationCluster();
     case kTypeArgumentsCid:
       return new (Z) TypeArgumentsDeserializationCluster();
     case kPatchClassCid:
@@ -5106,6 +4931,10 @@
 #endif  // !DART_PRECOMPILED_RUNTIME
     case kCodeCid:
       return new (Z) CodeDeserializationCluster();
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    case kBytecodeCid:
+      return new (Z) BytecodeDeserializationCluster();
+#endif  // !DART_PRECOMPILED_RUNTIME
     case kObjectPoolCid:
       return new (Z) ObjectPoolDeserializationCluster();
     case kPcDescriptorsCid:
@@ -5138,8 +4967,6 @@
       return new (Z) TypeRefDeserializationCluster();
     case kTypeParameterCid:
       return new (Z) TypeParameterDeserializationCluster();
-    case kBoundedTypeCid:
-      return new (Z) BoundedTypeDeserializationCluster();
     case kClosureCid:
       return new (Z) ClosureDeserializationCluster();
     case kMintCid:
@@ -5272,6 +5099,7 @@
   num_base_objects_ = ReadUnsigned();
   num_objects_ = ReadUnsigned();
   num_clusters_ = ReadUnsigned();
+  code_order_length_ = ReadUnsigned();
 
   clusters_ = new DeserializationCluster*[num_clusters_];
   refs_ = Array::New(num_objects_ + 1, Heap::kOld);
@@ -5368,7 +5196,7 @@
 
   if (!Snapshot::IncludesCode(kind_)) {
     for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {
-      AddBaseObject(StubCode::EntryAt(i)->code());
+      AddBaseObject(StubCode::EntryAt(i).raw());
     }
   }
 }
@@ -5390,10 +5218,10 @@
     symbol_table ^= ReadRef();
     isolate()->object_store()->set_symbol_table(symbol_table);
     if (Snapshot::IncludesCode(kind_)) {
-      Code& code = Code::Handle(zone_);
       for (intptr_t i = 0; i < StubCode::NumEntries(); i++) {
-        code ^= ReadRef();
-        StubCode::EntryAtPut(i, new StubEntry(code));
+        Code* code = Code::ReadOnlyHandle();
+        *code ^= ReadRef();
+        StubCode::EntryAtPut(i, code);
       }
     }
 
@@ -5554,6 +5382,13 @@
   KernelProgramInfo& kernel_program_info_;
 };
 
+#if defined(DART_PRECOMPILER)
+DEFINE_FLAG(charp,
+            write_v8_snapshot_profile_to,
+            NULL,
+            "Write a snapshot profile in V8 format to a file.");
+#endif
+
 FullSnapshotWriter::FullSnapshotWriter(Snapshot::Kind kind,
                                        uint8_t** vm_snapshot_data_buffer,
                                        uint8_t** isolate_snapshot_data_buffer,
@@ -5617,6 +5452,12 @@
     saved_symbol_table_ = object_store->symbol_table();
     new_vm_symbol_table_ = Dart::vm_isolate()->object_store()->symbol_table();
   }
+
+#if defined(DART_PRECOMPILER)
+  if (FLAG_write_v8_snapshot_profile_to != nullptr) {
+    profile_writer_ = new (zone()) V8SnapshotProfileWriter(zone());
+  }
+#endif
 }
 
 FullSnapshotWriter::~FullSnapshotWriter() {
@@ -5634,7 +5475,8 @@
 
   ASSERT(vm_snapshot_data_buffer_ != NULL);
   Serializer serializer(thread(), kind_, vm_snapshot_data_buffer_, alloc_,
-                        kInitialSize, vm_image_writer_);
+                        kInitialSize, vm_image_writer_, /*vm=*/true,
+                        profile_writer_);
 
   serializer.ReserveHeader();
   serializer.WriteVersionAndFeatures(true);
@@ -5648,10 +5490,12 @@
   clustered_vm_size_ = serializer.bytes_written();
 
   if (Snapshot::IncludesCode(kind_)) {
+    vm_image_writer_->SetProfileWriter(profile_writer_);
     vm_image_writer_->Write(serializer.stream(), true);
     mapped_data_size_ += vm_image_writer_->data_size();
     mapped_text_size_ += vm_image_writer_->text_size();
     vm_image_writer_->ResetOffsets();
+    vm_image_writer_->ClearProfileWriter();
   }
 
   // The clustered part + the direct mapped data part.
@@ -5664,7 +5508,8 @@
       thread(), Timeline::GetIsolateStream(), "WriteIsolateSnapshot"));
 
   Serializer serializer(thread(), kind_, isolate_snapshot_data_buffer_, alloc_,
-                        kInitialSize, isolate_image_writer_);
+                        kInitialSize, isolate_image_writer_, /*vm=*/false,
+                        profile_writer_);
   ObjectStore* object_store = isolate()->object_store();
   ASSERT(object_store != NULL);
 
@@ -5677,6 +5522,7 @@
   clustered_isolate_size_ = serializer.bytes_written();
 
   if (Snapshot::IncludesCode(kind_)) {
+    isolate_image_writer_->SetProfileWriter(profile_writer_);
     isolate_image_writer_->Write(serializer.stream(), false);
 #if defined(DART_PRECOMPILER)
     isolate_image_writer_->DumpStatistics();
@@ -5685,6 +5531,7 @@
     mapped_data_size_ += isolate_image_writer_->data_size();
     mapped_text_size_ += isolate_image_writer_->text_size();
     isolate_image_writer_->ResetOffsets();
+    isolate_image_writer_->ClearProfileWriter();
   }
 
   // The clustered part + the direct mapped data part.
@@ -5713,6 +5560,12 @@
               clustered_vm_size_ + clustered_isolate_size_ + mapped_data_size_ +
                   mapped_text_size_);
   }
+
+#if defined(DART_PRECOMPILER)
+  if (FLAG_write_v8_snapshot_profile_to != nullptr) {
+    profile_writer_->Write(FLAG_write_v8_snapshot_profile_to);
+  }
+#endif
 }
 
 FullSnapshotReader::FullSnapshotReader(const Snapshot* snapshot,
@@ -5722,7 +5575,7 @@
                                        Thread* thread)
     : kind_(snapshot->kind()),
       thread_(thread),
-      buffer_(snapshot->content()),
+      buffer_(snapshot->Addr()),
       size_(snapshot->length()),
       data_image_(snapshot->DataImage()),
       instructions_image_(instructions_buffer) {
@@ -5740,6 +5593,8 @@
   Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
                             instructions_image_, NULL, NULL);
 
+  deserializer.SkipHeader();
+
   RawApiError* error = deserializer.VerifyVersionAndFeatures(/*isolate=*/NULL);
   if (error != ApiError::null()) {
     return error;
@@ -5764,6 +5619,8 @@
                             instructions_image_, shared_data_image_,
                             shared_instructions_image_);
 
+  deserializer.SkipHeader();
+
   RawApiError* error =
       deserializer.VerifyVersionAndFeatures(thread_->isolate());
   if (error != ApiError::null()) {
@@ -5787,7 +5644,38 @@
     }
   }
 
-  deserializer.ReadIsolateSnapshot(thread_->isolate()->object_store());
+  auto object_store = thread_->isolate()->object_store();
+  deserializer.ReadIsolateSnapshot(object_store);
+
+#if defined(DART_PRECOMPILED_RUNTIME)
+  if (FLAG_use_bare_instructions) {
+    // By default, every switchable call site will put (ic_data, code) into the
+    // object pool.  The [code] is initialized (at AOT compile-time) to be a
+    // [StubCode::UnlinkedCall].
+    //
+    // In --use-bare-instruction we reduce the extra indirection via the [code]
+    // object and store instead (ic_data, entrypoint) in the object pool.
+    //
+    // Since the actual [entrypoint] is only known at AOT runtime we switch all
+    // existing UnlinkedCall entries in the object pool to be it's entrypoint.
+    auto zone = thread_->zone();
+    const auto& pool = ObjectPool::Handle(
+        zone, ObjectPool::RawCast(object_store->global_object_pool()));
+    auto& entry = Object::Handle(zone);
+    auto& smi = Smi::Handle(zone);
+    for (intptr_t i = 0; i < pool.Length(); i++) {
+      if (pool.TypeAt(i) == ObjectPool::kTaggedObject) {
+        entry = pool.ObjectAt(i);
+        if (entry.raw() == StubCode::UnlinkedCall().raw()) {
+          smi = Smi::FromAlignedAddress(
+              StubCode::UnlinkedCall().MonomorphicEntryPoint());
+          pool.SetTypeAt(i, ObjectPool::kImmediate, ObjectPool::kPatchable);
+          pool.SetObjectAt(i, smi);
+        }
+      }
+    }
+  }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 
   return ApiError::null();
 }
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 7c64239..420742d 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -13,9 +13,12 @@
 #include "vm/growable_array.h"
 #include "vm/hash_map.h"
 #include "vm/heap/heap.h"
+#include "vm/image_snapshot.h"
 #include "vm/object.h"
+#include "vm/raw_object_fields.h"
 #include "vm/snapshot.h"
 #include "vm/type_testing_stubs.h"
+#include "vm/v8_snapshot_writer.h"
 #include "vm/version.h"
 
 #if defined(DEBUG)
@@ -125,14 +128,16 @@
 
 typedef DirectChainedHashMap<SmiObjectIdPairTrait> SmiObjectIdMap;
 
-class Serializer : public StackResource {
+class Serializer : public ThreadStackResource {
  public:
   Serializer(Thread* thread,
              Snapshot::Kind kind,
              uint8_t** buffer,
              ReAlloc alloc,
              intptr_t initial_size,
-             ImageWriter* image_writer_);
+             ImageWriter* image_writer_,
+             bool vm_,
+             V8SnapshotProfileWriter* profile_writer = nullptr);
   ~Serializer();
 
   intptr_t WriteVMSnapshot(const Array& symbols,
@@ -142,12 +147,26 @@
 
   void AddVMIsolateBaseObjects();
 
-  void AddBaseObject(RawObject* base_object) {
-    AssignRef(base_object);
+  void AddBaseObject(RawObject* base_object,
+                     const char* type = nullptr,
+                     const char* name = nullptr) {
+    intptr_t ref = AssignRef(base_object);
     num_base_objects_++;
+
+    if (profile_writer_ != nullptr) {
+      if (type == nullptr) {
+        type = "Unknown";
+      }
+      if (name == nullptr) {
+        name = "<base object>";
+      }
+      profile_writer_->SetObjectTypeAndName(
+          {V8SnapshotProfileWriter::kSnapshot, ref}, type, name);
+      profile_writer_->AddRoot({V8SnapshotProfileWriter::kSnapshot, ref});
+    }
   }
 
-  void AssignRef(RawObject* object) {
+  intptr_t AssignRef(RawObject* object) {
     ASSERT(next_ref_index_ != 0);
     if (object->IsHeapObject()) {
       // The object id weak table holds image offsets for Instructions instead
@@ -168,7 +187,7 @@
         smi_ids_.Insert(new_pair);
       }
     }
-    next_ref_index_++;
+    return next_ref_index_++;
   }
 
   void Push(RawObject* object);
@@ -202,6 +221,11 @@
   WriteStream* stream() { return &stream_; }
   intptr_t bytes_written() { return stream_.bytes_written(); }
 
+  void TraceStartWritingObject(const char* type,
+                               RawObject* obj,
+                               RawString* name);
+  void TraceEndWritingObject();
+
   // Writes raw data to the stream (basic type).
   // sizeof(T) must be in {1,2,4,8}.
   template <typename T>
@@ -212,36 +236,114 @@
   void WriteBytes(const uint8_t* addr, intptr_t len) {
     stream_.WriteBytes(addr, len);
   }
+  void Align(intptr_t alignment) { stream_.Align(alignment); }
 
-  void WriteRef(RawObject* object) {
+ private:
+  intptr_t WriteRefId(RawObject* object) {
+    intptr_t id = 0;
     if (!object->IsHeapObject()) {
       RawSmi* smi = Smi::RawCast(object);
-      intptr_t id = smi_ids_.Lookup(smi)->id_;
+      id = smi_ids_.Lookup(smi)->id_;
       if (id == 0) {
         FATAL("Missing ref");
       }
-      WriteUnsigned(id);
-      return;
+    } else {
+      // The object id weak table holds image offsets for Instructions instead
+      // of ref indices.
+      ASSERT(!object->IsInstructions());
+      id = heap_->GetObjectId(object);
+      if (id == 0) {
+        if (object->IsCode() && !Snapshot::IncludesCode(kind_)) {
+          return WriteRefId(Object::null());
+        }
+#if !defined(DART_PRECOMPILED_RUNTIME)
+        if (object->IsBytecode() && !Snapshot::IncludesBytecode(kind_)) {
+          return WriteRefId(Object::null());
+        }
+#endif  // !DART_PRECOMPILED_RUNTIME
+        if (object->IsSendPort()) {
+          // TODO(rmacnak): Do a better job of resetting fields in
+          // precompilation and assert this is unreachable.
+          return WriteRefId(Object::null());
+        }
+        FATAL("Missing ref");
+      }
     }
+    return id;
+  }
 
-    // The object id weak table holds image offsets for Instructions instead
-    // of ref indices.
-    ASSERT(!object->IsInstructions());
-    intptr_t id = heap_->GetObjectId(object);
-    if (id == 0) {
-      if (object->IsCode() && !Snapshot::IncludesCode(kind_)) {
-        WriteRef(Object::null());
-        return;
-      }
-      if (object->IsSendPort()) {
-        // TODO(rmacnak): Do a better job of resetting fields in precompilation
-        // and assert this is unreachable.
-        WriteRef(Object::null());
-        return;
-      }
-      FATAL("Missing ref");
-    }
+ public:
+  void WriteRootRef(RawObject* object) {
+    intptr_t id = WriteRefId(object);
     WriteUnsigned(id);
+    if (profile_writer_ != nullptr) {
+      profile_writer_->AddRoot({V8SnapshotProfileWriter::kSnapshot, id});
+    }
+  }
+
+  void WriteElementRef(RawObject* object, intptr_t index) {
+    intptr_t id = WriteRefId(object);
+    WriteUnsigned(id);
+    if (profile_writer_ != nullptr) {
+      profile_writer_->AttributeReferenceTo(
+          {V8SnapshotProfileWriter::kSnapshot, object_currently_writing_.id_},
+          {{V8SnapshotProfileWriter::kSnapshot, id},
+           V8SnapshotProfileWriter::Reference::kElement,
+           index});
+    }
+  }
+
+  void WritePropertyRef(RawObject* object, const char* property) {
+    intptr_t id = WriteRefId(object);
+    WriteUnsigned(id);
+    if (profile_writer_ != nullptr) {
+      profile_writer_->AttributeReferenceTo(
+          {V8SnapshotProfileWriter::kSnapshot, object_currently_writing_.id_},
+          {{V8SnapshotProfileWriter::kSnapshot, id},
+           V8SnapshotProfileWriter::Reference::kProperty,
+           profile_writer_->EnsureString(property)});
+    }
+  }
+
+  void WriteOffsetRef(RawObject* object, intptr_t offset) {
+    intptr_t id = WriteRefId(object);
+    WriteUnsigned(id);
+    if (profile_writer_ != nullptr) {
+      const char* property = offsets_table_->FieldNameForOffset(
+          object_currently_writing_.cid_, offset);
+      if (property != nullptr) {
+        profile_writer_->AttributeReferenceTo(
+            {V8SnapshotProfileWriter::kSnapshot, object_currently_writing_.id_},
+            {{V8SnapshotProfileWriter::kSnapshot, id},
+             V8SnapshotProfileWriter::Reference::kProperty,
+             profile_writer_->EnsureString(property)});
+      } else {
+        profile_writer_->AttributeReferenceTo(
+            {V8SnapshotProfileWriter::kSnapshot, object_currently_writing_.id_},
+            {{V8SnapshotProfileWriter::kSnapshot, id},
+             V8SnapshotProfileWriter::Reference::kElement,
+             offset});
+      }
+    }
+  }
+
+  template <typename T, typename... P>
+  void WriteFromTo(T* obj, P&&... args) {
+    RawObject** from = obj->from();
+    RawObject** to = obj->to_snapshot(kind(), args...);
+    for (RawObject** p = from; p <= to; p++) {
+      WriteOffsetRef(*p, (p - reinterpret_cast<RawObject**>(obj->ptr())) *
+                             sizeof(RawObject*));
+    }
+  }
+
+  template <typename T, typename... P>
+  void PushFromTo(T* obj, P&&... args) {
+    RawObject** from = obj->from();
+    RawObject** to = obj->to_snapshot(kind(), args...);
+    for (RawObject** p = from; p <= to; p++) {
+      Push(*p);
+    }
   }
 
   void WriteTokenPosition(TokenPosition pos) {
@@ -256,6 +358,7 @@
   void WriteInstructions(RawInstructions* instr, RawCode* code);
   bool GetSharedDataOffset(RawObject* object, uint32_t* offset) const;
   uint32_t GetDataOffset(RawObject* object) const;
+  void TraceDataOffset(uint32_t offset);
   intptr_t GetDataSize() const;
   intptr_t GetTextSize() const;
 
@@ -279,6 +382,18 @@
   intptr_t next_ref_index_;
   SmiObjectIdMap smi_ids_;
 
+  // True if writing VM snapshot, false for Isolate snapshot.
+  bool vm_;
+
+  V8SnapshotProfileWriter* profile_writer_ = nullptr;
+  struct ProfilingObject {
+    RawObject* object_ = nullptr;
+    intptr_t id_ = 0;
+    intptr_t stream_start_ = 0;
+    intptr_t cid_ = -1;
+  } object_currently_writing_;
+  OffsetsTable* offsets_table_ = nullptr;
+
 #if defined(SNAPSHOT_BACKTRACE)
   RawObject* current_parent_;
   GrowableArray<Object*> parent_pairs_;
@@ -287,7 +402,36 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(Serializer);
 };
 
-class Deserializer : public StackResource {
+#define AutoTraceObject(obj)                                                   \
+  SerializerWritingObjectScope scope_##__COUNTER__(s, name(), obj, nullptr)
+
+#define AutoTraceObjectName(obj, str)                                          \
+  SerializerWritingObjectScope scope_##__COUNTER__(s, name(), obj, str)
+
+#define WriteFieldValue(field, value) s->WritePropertyRef(value, #field);
+
+#define WriteFromTo(obj, ...) s->WriteFromTo(obj, ##__VA_ARGS__);
+
+#define PushFromTo(obj, ...) s->PushFromTo(obj, ##__VA_ARGS__);
+
+#define WriteField(obj, field) s->WritePropertyRef(obj->ptr()->field, #field)
+
+struct SerializerWritingObjectScope {
+  SerializerWritingObjectScope(Serializer* serializer,
+                               const char* type,
+                               RawObject* object,
+                               RawString* name)
+      : serializer_(serializer) {
+    serializer_->TraceStartWritingObject(type, object, name);
+  }
+
+  ~SerializerWritingObjectScope() { serializer_->TraceEndWritingObject(); }
+
+ private:
+  Serializer* serializer_;
+};
+
+class Deserializer : public ThreadStackResource {
  public:
   Deserializer(Thread* thread,
                Snapshot::Kind kind,
@@ -324,6 +468,7 @@
   }
 
   void Advance(intptr_t value) { stream_.Advance(value); }
+  void Align(intptr_t alignment) { stream_.Align(alignment); }
 
   intptr_t PendingBytes() const { return stream_.PendingBytes(); }
 
@@ -343,6 +488,20 @@
 
   RawObject* ReadRef() { return Ref(ReadUnsigned()); }
 
+  template <typename T, typename... P>
+  void ReadFromTo(T* obj, P&&... params) {
+    RawObject** from = obj->from();
+    RawObject** to_snapshot = obj->to_snapshot(kind(), params...);
+    RawObject** to = obj->to(params...);
+    for (RawObject** p = from; p <= to_snapshot; p++) {
+      *p = ReadRef();
+    }
+    // TODO(sjindel/rmacnak): Is this really necessary?
+    for (RawObject** p = to_snapshot + 1; p <= to; p++) {
+      *p = Object::null();
+    }
+  }
+
   TokenPosition ReadTokenPosition() {
     return TokenPosition::SnapshotDecode(Read<int32_t>());
   }
@@ -356,6 +515,8 @@
   RawObject* GetObjectAt(uint32_t offset) const;
   RawObject* GetSharedObjectAt(uint32_t offset) const;
 
+  void SkipHeader() { stream_.SetPosition(Snapshot::kHeaderSize); }
+
   RawApiError* VerifyVersionAndFeatures(Isolate* isolate);
 
   void Prepare();
@@ -367,6 +528,21 @@
   Heap* heap() const { return heap_; }
   Snapshot::Kind kind() const { return kind_; }
 
+  // The number of code objects which were relocated during AOT snapshot
+  // writing.
+  //
+  // After relocating the instructions in the ".text" segment, the
+  // [CodeSerializationCluster] will re-order those code objects that get
+  // written out in the cluster.  The order will be dictated by the order of
+  // the code's instructions in the ".text" segment.
+  //
+  // The [code_order_length] represents therefore the prefix of code objects in
+  // the written out code cluster. (There might be code objects for which no
+  // relocation was performed.)
+  //
+  // This will be used to construct [ObjectStore::code_order_table].
+  intptr_t code_order_length() const { return code_order_length_; }
+
  private:
   Heap* heap_;
   Zone* zone_;
@@ -376,11 +552,14 @@
   intptr_t num_base_objects_;
   intptr_t num_objects_;
   intptr_t num_clusters_;
+  intptr_t code_order_length_ = 0;
   RawArray* refs_;
   intptr_t next_ref_index_;
   DeserializationCluster** clusters_;
 };
 
+#define ReadFromTo(obj, ...) d->ReadFromTo(obj, ##__VA_ARGS__);
+
 class FullSnapshotWriter {
  public:
   static const intptr_t kInitialSize = 64 * KB;
@@ -436,6 +615,8 @@
   intptr_t mapped_data_size_;
   intptr_t mapped_text_size_;
 
+  V8SnapshotProfileWriter* profile_writer_ = nullptr;
+
   DISALLOW_COPY_AND_ASSIGN(FullSnapshotWriter);
 };
 
diff --git a/runtime/vm/code_patcher.cc b/runtime/vm/code_patcher.cc
index f0ec1db..4926926 100644
--- a/runtime/vm/code_patcher.cc
+++ b/runtime/vm/code_patcher.cc
@@ -10,7 +10,7 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, write_protect_code, false, "Write protect jitted code");
+DEFINE_FLAG(bool, write_protect_code, true, "Write protect jitted code");
 
 WritableInstructionsScope::WritableInstructionsScope(uword address,
                                                      intptr_t size)
@@ -28,7 +28,7 @@
   }
 }
 
-bool MatchesPattern(uword end, int16_t* pattern, intptr_t size) {
+bool MatchesPattern(uword end, const int16_t* pattern, intptr_t size) {
   // When breaking within generated code in GDB, it may overwrite individual
   // instructions with trap instructions, which can cause this test to fail.
   //
diff --git a/runtime/vm/code_patcher.h b/runtime/vm/code_patcher.h
index 82668c5..9b31dcd 100644
--- a/runtime/vm/code_patcher.h
+++ b/runtime/vm/code_patcher.h
@@ -108,16 +108,16 @@
 // [0..255] values in [pattern] have to match, negative values are skipped.
 //
 // Example pattern: `[0x3d, 0x8b, -1, -1]`.
-bool MatchesPattern(uword end, int16_t* pattern, intptr_t size);
+bool MatchesPattern(uword end, const int16_t* pattern, intptr_t size);
 
 class KBCPatcher : public AllStatic {
  public:
   static NativeFunctionWrapper GetNativeCallAt(uword return_address,
-                                               const Code& bytecode,
+                                               const Bytecode& bytecode,
                                                NativeFunction* function);
 
   static void PatchNativeCallAt(uword return_address,
-                                const Code& bytecode,
+                                const Bytecode& bytecode,
                                 NativeFunction function,
                                 NativeFunctionWrapper trampoline);
 };
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index f7204fa..258b035 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -61,23 +61,39 @@
                                         const Object& data,
                                         const Code& target) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCallPattern call(return_address, caller_code);
-  call.SetData(data);
-  call.SetTarget(target);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCallPattern call(return_address, caller_code);
+    call.SetData(data);
+    call.SetTarget(target);
+  } else {
+    SwitchableCallPattern call(return_address, caller_code);
+    call.SetData(data);
+    call.SetTarget(target);
+  }
 }
 
 RawCode* CodePatcher::GetSwitchableCallTargetAt(uword return_address,
                                                 const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCallPattern call(return_address, caller_code);
-  return call.target();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCallPattern call(return_address, caller_code);
+    return call.target();
+  } else {
+    SwitchableCallPattern call(return_address, caller_code);
+    return call.target();
+  }
 }
 
 RawObject* CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                 const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCallPattern call(return_address, caller_code);
-  return call.data();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCallPattern call(return_address, caller_code);
+    return call.data();
+  } else {
+    SwitchableCallPattern call(return_address, caller_code);
+    return call.data();
+  }
 }
 
 void CodePatcher::PatchNativeCallAt(uword return_address,
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index d084ac1..7716090 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -96,23 +96,39 @@
                                         const Object& data,
                                         const Code& target) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCallPattern call(return_address, caller_code);
-  call.SetData(data);
-  call.SetTarget(target);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCallPattern call(return_address, caller_code);
+    call.SetData(data);
+    call.SetTarget(target);
+  } else {
+    SwitchableCallPattern call(return_address, caller_code);
+    call.SetData(data);
+    call.SetTarget(target);
+  }
 }
 
 RawCode* CodePatcher::GetSwitchableCallTargetAt(uword return_address,
                                                 const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCallPattern call(return_address, caller_code);
-  return call.target();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCallPattern call(return_address, caller_code);
+    return call.target();
+  } else {
+    SwitchableCallPattern call(return_address, caller_code);
+    return call.target();
+  }
 }
 
 RawObject* CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                 const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCallPattern call(return_address, caller_code);
-  return call.data();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCallPattern call(return_address, caller_code);
+    return call.data();
+  } else {
+    SwitchableCallPattern call(return_address, caller_code);
+    return call.data();
+  }
 }
 
 void CodePatcher::PatchNativeCallAt(uword return_address,
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index 113a7b8..c2437cf 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -44,7 +44,7 @@
   __ set_constant_pool_allowed(true);
 
   __ LoadObject(R5, ic_data);
-  __ BranchLinkPatchable(*StubCode::OneArgCheckInlineCache_entry());
+  __ BranchLinkPatchable(StubCode::OneArgCheckInlineCache());
   __ ret();
 }
 
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index 3e3ca0b..9463dae 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -44,7 +44,7 @@
   __ set_constant_pool_allowed(true);
 
   __ LoadObject(R9, ic_data);
-  __ BranchLinkPatchable(*StubCode::OneArgCheckInlineCache_entry());
+  __ BranchLinkPatchable(StubCode::OneArgCheckInlineCache());
   __ Ret();
 }
 
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index a843893..19e4563 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -41,7 +41,7 @@
       function, target_name, args_descriptor, 15, 1, ICData::kInstance));
 
   __ LoadObject(ECX, ic_data);
-  __ Call(*StubCode::OneArgCheckInlineCache_entry());
+  __ Call(StubCode::OneArgCheckInlineCache());
   __ ret();
 }
 
diff --git a/runtime/vm/code_patcher_kbc.cc b/runtime/vm/code_patcher_kbc.cc
index de7cac4..2dd74bd 100644
--- a/runtime/vm/code_patcher_kbc.cc
+++ b/runtime/vm/code_patcher_kbc.cc
@@ -13,7 +13,7 @@
 namespace dart {
 
 void KBCPatcher::PatchNativeCallAt(uword return_address,
-                                   const Code& bytecode,
+                                   const Bytecode& bytecode,
                                    NativeFunction function,
                                    NativeFunctionWrapper trampoline) {
   ASSERT(bytecode.ContainsInstructionAt(return_address));
@@ -24,7 +24,7 @@
 }
 
 NativeFunctionWrapper KBCPatcher::GetNativeCallAt(uword return_address,
-                                                  const Code& bytecode,
+                                                  const Bytecode& bytecode,
                                                   NativeFunction* function) {
   ASSERT(bytecode.ContainsInstructionAt(return_address));
   NativeEntryData native_entry_data(TypedData::Handle(
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index 9915d70..1794125 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -12,7 +12,9 @@
 #include "vm/dart_entry.h"
 #include "vm/instructions.h"
 #include "vm/object.h"
+#include "vm/object_store.h"
 #include "vm/raw_object.h"
+#include "vm/reverse_pc_lookup_cache.h"
 
 namespace dart {
 
@@ -209,12 +211,41 @@
 //   load guarded cid            load ICData             load MegamorphicCache
 //   load monomorphic target <-> load ICLookup stub  ->  load MMLookup stub
 //   call target.entry           call stub.entry         call stub.entry
-class SwitchableCall : public ValueObject {
+class SwitchableCallBase : public ValueObject {
  public:
-  SwitchableCall(uword return_address, const Code& code)
+  explicit SwitchableCallBase(const Code& code)
       : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
         target_index_(-1),
-        data_index_(-1) {
+        data_index_(-1) {}
+
+  intptr_t data_index() const { return data_index_; }
+  intptr_t target_index() const { return target_index_; }
+
+  RawObject* data() const { return object_pool_.ObjectAt(data_index()); }
+
+  void SetData(const Object& data) const {
+    ASSERT(!Object::Handle(object_pool_.ObjectAt(data_index())).IsCode());
+    object_pool_.SetObjectAt(data_index(), data);
+    // No need to flush the instruction cache, since the code is not modified.
+  }
+
+ protected:
+  ObjectPool& object_pool_;
+  intptr_t target_index_;
+  intptr_t data_index_;
+
+ private:
+  DISALLOW_IMPLICIT_CONSTRUCTORS(SwitchableCallBase);
+};
+
+// See [SwitchableCallBase] for a switchable calls in general.
+//
+// The target slot is always a [Code] object: Either the code of the
+// monomorphic function or a stub code.
+class SwitchableCall : public SwitchableCallBase {
+ public:
+  SwitchableCall(uword return_address, const Code& code)
+      : SwitchableCallBase(code) {
     uword pc = return_address;
 
     // callq RCX
@@ -248,7 +279,7 @@
 
     // movq rcx, [CODE_REG + entrypoint_offset]
     static int16_t load_entry_pattern[] = {
-        0x49, 0x8b, 0x4c, 0x24, 0x0f,
+        0x49, 0x8b, 0x4c, 0x24, -1,
     };
     if (MatchesPattern(pc, load_entry_pattern,
                        ARRAY_SIZE(load_entry_pattern))) {
@@ -277,33 +308,96 @@
     ASSERT(Object::Handle(object_pool_.ObjectAt(target_index_)).IsCode());
   }
 
-  intptr_t data_index() const { return data_index_; }
-  intptr_t target_index() const { return target_index_; }
-
-  RawObject* data() const { return object_pool_.ObjectAt(data_index()); }
-  RawCode* target() const {
-    return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_index()));
-  }
-
-  void SetData(const Object& data) const {
-    ASSERT(!Object::Handle(object_pool_.ObjectAt(data_index())).IsCode());
-    object_pool_.SetObjectAt(data_index(), data);
-    // No need to flush the instruction cache, since the code is not modified.
-  }
-
   void SetTarget(const Code& target) const {
     ASSERT(Object::Handle(object_pool_.ObjectAt(target_index())).IsCode());
     object_pool_.SetObjectAt(target_index(), target);
     // No need to flush the instruction cache, since the code is not modified.
   }
 
- protected:
-  const ObjectPool& object_pool_;
-  intptr_t target_index_;
-  intptr_t data_index_;
+  RawCode* target() const {
+    return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_index()));
+  }
+};
 
- private:
-  DISALLOW_IMPLICIT_CONSTRUCTORS(SwitchableCall);
+// See [SwitchableCallBase] for a switchable calls in general.
+//
+// The target slot is always a direct entrypoint address: Either the entry point
+// of the monomorphic function or a stub entry point.
+class BareSwitchableCall : public SwitchableCallBase {
+ public:
+  BareSwitchableCall(uword return_address, const Code& code)
+      : SwitchableCallBase(code) {
+    object_pool_ = ObjectPool::RawCast(
+        Isolate::Current()->object_store()->global_object_pool());
+
+    uword pc = return_address;
+
+    // callq RCX
+    static int16_t call_pattern[] = {
+        0xff, 0xd1,  //
+    };
+    if (MatchesPattern(pc, call_pattern, ARRAY_SIZE(call_pattern))) {
+      pc -= ARRAY_SIZE(call_pattern);
+    } else {
+      FATAL1("Failed to decode at %" Px, pc);
+    }
+
+    // movq RBX, [PP + offset]
+    static int16_t load_data_disp8[] = {
+        0x49, 0x8b, 0x5f, -1,  //
+    };
+    static int16_t load_data_disp32[] = {
+        0x49, 0x8b, 0x9f, -1, -1, -1, -1,
+    };
+    if (MatchesPattern(pc, load_data_disp8, ARRAY_SIZE(load_data_disp8))) {
+      pc -= ARRAY_SIZE(load_data_disp8);
+      data_index_ = IndexFromPPLoadDisp8(pc + 3);
+    } else if (MatchesPattern(pc, load_data_disp32,
+                              ARRAY_SIZE(load_data_disp32))) {
+      pc -= ARRAY_SIZE(load_data_disp32);
+      data_index_ = IndexFromPPLoadDisp32(pc + 3);
+    } else {
+      FATAL1("Failed to decode at %" Px, pc);
+    }
+    ASSERT(!Object::Handle(object_pool_.ObjectAt(data_index_)).IsCode());
+
+    // movq RCX, [PP + offset]
+    static int16_t load_code_disp8[] = {
+        0x49, 0x8b, 0x4f, -1,  //
+    };
+    static int16_t load_code_disp32[] = {
+        0x49, 0x8b, 0x8f, -1, -1, -1, -1,
+    };
+    if (MatchesPattern(pc, load_code_disp8, ARRAY_SIZE(load_code_disp8))) {
+      pc -= ARRAY_SIZE(load_code_disp8);
+      target_index_ = IndexFromPPLoadDisp8(pc + 3);
+    } else if (MatchesPattern(pc, load_code_disp32,
+                              ARRAY_SIZE(load_code_disp32))) {
+      pc -= ARRAY_SIZE(load_code_disp32);
+      target_index_ = IndexFromPPLoadDisp32(pc + 3);
+    } else {
+      FATAL1("Failed to decode at %" Px, pc);
+    }
+    ASSERT(object_pool_.TypeAt(target_index_) == ObjectPool::kImmediate);
+  }
+
+  void SetTarget(const Code& target) const {
+    ASSERT(object_pool_.TypeAt(target_index()) == ObjectPool::kImmediate);
+    object_pool_.SetRawValueAt(target_index(), target.MonomorphicEntryPoint());
+  }
+
+  RawCode* target() const {
+    const uword pc = object_pool_.RawValueAt(target_index());
+    auto rct = Isolate::Current()->reverse_pc_lookup_cache();
+    if (rct->Contains(pc)) {
+      return rct->Lookup(pc);
+    }
+    rct = Dart::vm_isolate()->reverse_pc_lookup_cache();
+    if (rct->Contains(pc)) {
+      return rct->Lookup(pc);
+    }
+    UNREACHABLE();
+  }
 };
 
 RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
@@ -360,23 +454,39 @@
                                         const Object& data,
                                         const Code& target) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCall call(return_address, caller_code);
-  call.SetData(data);
-  call.SetTarget(target);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCall call(return_address, caller_code);
+    call.SetData(data);
+    call.SetTarget(target);
+  } else {
+    SwitchableCall call(return_address, caller_code);
+    call.SetData(data);
+    call.SetTarget(target);
+  }
 }
 
 RawCode* CodePatcher::GetSwitchableCallTargetAt(uword return_address,
                                                 const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCall call(return_address, caller_code);
-  return call.target();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCall call(return_address, caller_code);
+    return call.target();
+  } else {
+    SwitchableCall call(return_address, caller_code);
+    return call.target();
+  }
 }
 
 RawObject* CodePatcher::GetSwitchableCallDataAt(uword return_address,
                                                 const Code& caller_code) {
   ASSERT(caller_code.ContainsInstructionAt(return_address));
-  SwitchableCall call(return_address, caller_code);
-  return call.data();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    BareSwitchableCall call(return_address, caller_code);
+    return call.data();
+  } else {
+    SwitchableCall call(return_address, caller_code);
+    return call.data();
+  }
 }
 
 void CodePatcher::PatchNativeCallAt(uword return_address,
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index 90bd5f5..d6ac021 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -44,7 +44,7 @@
   __ set_constant_pool_allowed(true);
 
   __ LoadObject(RBX, ic_data);
-  __ CallPatchable(*StubCode::OneArgCheckInlineCache_entry());
+  __ CallPatchable(StubCode::OneArgCheckInlineCache());
   __ ret();
 }
 
diff --git a/runtime/vm/compilation_trace.cc b/runtime/vm/compilation_trace.cc
index 3d978a3..2a9f62d 100644
--- a/runtime/vm/compilation_trace.cc
+++ b/runtime/vm/compilation_trace.cc
@@ -4,12 +4,14 @@
 
 #include "vm/compilation_trace.h"
 
+#include "vm/compiler/jit/compiler.h"
 #include "vm/globals.h"
 #include "vm/log.h"
 #include "vm/longjump.h"
 #include "vm/object_store.h"
 #include "vm/resolver.h"
 #include "vm/symbols.h"
+#include "vm/version.h"
 
 namespace dart {
 
@@ -247,7 +249,7 @@
   if (!field_.IsNull() && field_.is_const() && field_.is_static() &&
       (field_.StaticValue() == Object::sentinel().raw())) {
     processed = true;
-    error_ = EvaluateInitializer(field_);
+    error_ = field_.EvaluateInitializer();
     if (error_.IsError()) {
       if (FLAG_trace_compilation_trace) {
         THR_Print(
@@ -303,17 +305,555 @@
   return Compiler::CompileFunction(thread_, function);
 }
 
-RawObject* CompilationTraceLoader::EvaluateInitializer(const Field& field) {
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    field_.EvaluateInitializer();
-  } else {
-    Thread* thread = Thread::Current();
-    const Error& error = Error::Handle(thread->sticky_error());
-    thread->clear_sticky_error();
-    return error.raw();
+TypeFeedbackSaver::TypeFeedbackSaver(WriteStream* stream)
+    : stream_(stream),
+      cls_(Class::Handle()),
+      lib_(Library::Handle()),
+      str_(String::Handle()),
+      fields_(Array::Handle()),
+      field_(Field::Handle()),
+      code_(Code::Handle()),
+      call_sites_(Array::Handle()),
+      call_site_(ICData::Handle()) {}
+
+void TypeFeedbackSaver::WriteHeader() {
+  const char* expected_version = Version::SnapshotString();
+  ASSERT(expected_version != NULL);
+  const intptr_t version_len = strlen(expected_version);
+  stream_->WriteBytes(reinterpret_cast<const uint8_t*>(expected_version),
+                      version_len);
+}
+
+void TypeFeedbackSaver::SaveClasses() {
+  ClassTable* table = Isolate::Current()->class_table();
+
+  intptr_t num_cids = table->NumCids();
+  WriteInt(num_cids);
+
+  for (intptr_t cid = kNumPredefinedCids; cid < num_cids; cid++) {
+    cls_ = table->At(cid);
+    WriteClassByName(cls_);
   }
-  return Object::null();
+}
+
+void TypeFeedbackSaver::SaveFields() {
+  ClassTable* table = Isolate::Current()->class_table();
+  intptr_t num_cids = table->NumCids();
+  for (intptr_t cid = kNumPredefinedCids; cid < num_cids; cid++) {
+    cls_ = table->At(cid);
+    WriteClassByName(cls_);
+
+    fields_ = cls_.fields();
+    WriteInt(fields_.Length());
+    for (intptr_t i = 0; i < fields_.Length(); i++) {
+      field_ ^= fields_.At(i);
+
+      str_ = field_.name();
+      str_ = String::RemovePrivateKey(str_);
+      WriteString(str_);
+
+      WriteInt(field_.guarded_cid());
+      WriteInt(field_.is_nullable());
+    }
+  }
+}
+
+void TypeFeedbackSaver::Visit(const Function& function) {
+  if (!function.HasCode()) {
+    return;  // Not compiled.
+  }
+
+  cls_ = function.Owner();
+  WriteClassByName(cls_);
+
+  str_ = function.name();
+  str_ = String::RemovePrivateKey(str_);
+  WriteString(str_);
+
+  WriteInt(function.kind());
+  WriteInt(function.token_pos().value());
+
+  code_ = function.CurrentCode();
+  intptr_t usage = function.usage_counter();
+  if (usage < 0) {
+    // Usage is set to INT_MIN while in the background compilation queue ...
+    usage = (usage - INT_MIN) + FLAG_optimization_counter_threshold;
+  } else if (code_.is_optimized()) {
+    // ... and set to 0 when an optimizing compile completes.
+    usage = usage + FLAG_optimization_counter_threshold;
+  }
+  WriteInt(usage);
+
+  WriteInt(function.inlining_depth());
+
+  call_sites_ = function.ic_data_array();
+  if (call_sites_.IsNull()) {
+    call_sites_ = Object::empty_array().raw();  // Remove edge case.
+  }
+
+  // First element is edge counters.
+  WriteInt(call_sites_.Length() - 1);
+  for (intptr_t i = 1; i < call_sites_.Length(); i++) {
+    call_site_ ^= call_sites_.At(i);
+
+    WriteInt(call_site_.deopt_id());
+    WriteInt(call_site_.rebind_rule());
+
+    str_ = call_site_.target_name();
+    str_ = String::RemovePrivateKey(str_);
+    WriteString(str_);
+
+    intptr_t num_checked_arguments = call_site_.NumArgsTested();
+    WriteInt(num_checked_arguments);
+
+    intptr_t num_entries = call_site_.NumberOfChecks();
+    WriteInt(num_entries);
+
+    for (intptr_t entry_index = 0; entry_index < num_entries; entry_index++) {
+      WriteInt(call_site_.GetCountAt(entry_index));
+
+      for (intptr_t argument_index = 0; argument_index < num_checked_arguments;
+           argument_index++) {
+        WriteInt(call_site_.GetClassIdAt(entry_index, argument_index));
+      }
+    }
+  }
+}
+
+void TypeFeedbackSaver::WriteClassByName(const Class& cls) {
+  lib_ = cls.library();
+
+  str_ = lib_.url();
+  WriteString(str_);
+
+  str_ = cls_.Name();
+  str_ = String::RemovePrivateKey(str_);
+  WriteString(str_);
+}
+
+void TypeFeedbackSaver::WriteString(const String& value) {
+  const char* cstr = value.ToCString();
+  intptr_t len = strlen(cstr);
+  stream_->WriteUnsigned(len);
+  stream_->WriteBytes(cstr, len);
+}
+
+TypeFeedbackLoader::TypeFeedbackLoader(Thread* thread)
+    : thread_(thread),
+      zone_(thread->zone()),
+      stream_(nullptr),
+      uri_(String::Handle(zone_)),
+      lib_(Library::Handle(zone_)),
+      cls_name_(String::Handle(zone_)),
+      cls_(Class::Handle(zone_)),
+      field_name_(String::Handle(zone_)),
+      fields_(Array::Handle(zone_)),
+      field_(Field::Handle(zone_)),
+      func_name_(String::Handle(zone_)),
+      func_(Function::Handle(zone_)),
+      call_sites_(Array::Handle(zone_)),
+      call_site_(ICData::Handle(zone_)),
+      target_name_(String::Handle(zone_)),
+      target_(Function::Handle(zone_)),
+      args_desc_(Array::Handle(zone_)),
+      functions_to_compile_(
+          GrowableObjectArray::Handle(zone_, GrowableObjectArray::New())),
+      error_(Error::Handle(zone_)) {}
+
+RawObject* TypeFeedbackLoader::LoadFeedback(ReadStream* stream) {
+  stream_ = stream;
+
+  error_ = CheckHeader();
+  if (error_.IsError()) {
+    return error_.raw();
+  }
+
+  error_ = LoadClasses();
+  if (error_.IsError()) {
+    return error_.raw();
+  }
+
+  error_ = LoadFields();
+  if (error_.IsError()) {
+    return error_.raw();
+  }
+
+  while (stream_->PendingBytes() > 0) {
+    error_ = LoadFunction();
+    if (error_.IsError()) {
+      return error_.raw();
+    }
+  }
+
+  while (functions_to_compile_.Length() > 0) {
+    func_ ^= functions_to_compile_.RemoveLast();
+
+    if (Compiler::CanOptimizeFunction(thread_, func_) &&
+        (func_.usage_counter() >= FLAG_optimization_counter_threshold)) {
+      error_ = Compiler::CompileOptimizedFunction(thread_, func_);
+      if (error_.IsError()) {
+        return error_.raw();
+      }
+    }
+  }
+
+  if (FLAG_trace_compilation_trace) {
+    THR_Print("Done loading feedback\n");
+  }
+
+  return Error::null();
+}
+
+RawObject* TypeFeedbackLoader::CheckHeader() {
+  const char* expected_version = Version::SnapshotString();
+  ASSERT(expected_version != NULL);
+  const intptr_t version_len = strlen(expected_version);
+  if (stream_->PendingBytes() < version_len) {
+    const intptr_t kMessageBufferSize = 128;
+    char message_buffer[kMessageBufferSize];
+    Utils::SNPrint(message_buffer, kMessageBufferSize,
+                   "No snapshot version found, expected '%s'",
+                   expected_version);
+    const String& msg = String::Handle(String::New(message_buffer, Heap::kOld));
+    return ApiError::New(msg, Heap::kOld);
+  }
+
+  const char* version =
+      reinterpret_cast<const char*>(stream_->AddressOfCurrentPosition());
+  ASSERT(version != NULL);
+  if (strncmp(version, expected_version, version_len)) {
+    const intptr_t kMessageBufferSize = 256;
+    char message_buffer[kMessageBufferSize];
+    char* actual_version = Utils::StrNDup(version, version_len);
+    Utils::SNPrint(message_buffer, kMessageBufferSize,
+                   "Wrong snapshot version, expected '%s' found '%s'",
+                   expected_version, actual_version);
+    free(actual_version);
+    const String& msg = String::Handle(String::New(message_buffer, Heap::kOld));
+    return ApiError::New(msg, Heap::kOld);
+  }
+  stream_->Advance(version_len);
+
+  return Error::null();
+}
+
+RawObject* TypeFeedbackLoader::LoadClasses() {
+  num_cids_ = ReadInt();
+
+  cid_map_ = new intptr_t[num_cids_];
+  for (intptr_t cid = 0; cid < num_cids_; cid++) {
+    cid_map_[cid] = kIllegalCid;
+  }
+  for (intptr_t cid = kInstanceCid; cid < kNumPredefinedCids; cid++) {
+    cid_map_[cid] = cid;
+  }
+
+  for (intptr_t cid = kNumPredefinedCids; cid < num_cids_; cid++) {
+    cls_ = ReadClassByName();
+    if (!cls_.IsNull()) {
+      cid_map_[cid] = cls_.id();
+    }
+  }
+
+  return Error::null();
+}
+
+RawObject* TypeFeedbackLoader::LoadFields() {
+  for (intptr_t cid = kNumPredefinedCids; cid < num_cids_; cid++) {
+    cls_ = ReadClassByName();
+    bool skip = cls_.IsNull();
+
+    intptr_t num_fields = ReadInt();
+    if (!skip && (num_fields > 0)) {
+      error_ = cls_.EnsureIsFinalized(thread_);
+      if (error_.IsError()) {
+        return error_.raw();
+      }
+      fields_ = cls_.fields();
+    }
+
+    for (intptr_t i = 0; i < num_fields; i++) {
+      field_name_ = ReadString();
+      intptr_t guarded_cid = cid_map_[ReadInt()];
+      intptr_t is_nullable = ReadInt();
+
+      if (skip) {
+        continue;
+      }
+
+      if (i >= fields_.Length()) {
+        if (FLAG_trace_compilation_trace) {
+          THR_Print("Missing field %s\n", field_name_.ToCString());
+        }
+        continue;
+      }
+
+      field_ ^= fields_.At(i);
+      if (!String::EqualsIgnoringPrivateKey(String::Handle(field_.name()),
+                                            field_name_)) {
+        if (FLAG_trace_compilation_trace) {
+          THR_Print("Missing field %s\n", field_name_.ToCString());
+        }
+        continue;
+      }
+
+      if (guarded_cid == kIllegalCid) {
+        // Guarded CID from feedback is not in current program: assume the field
+        // will become polymorphic.
+        field_.set_guarded_cid(kDynamicCid);
+        field_.set_is_nullable(true);
+      } else if ((field_.guarded_cid() != kIllegalCid) &&
+                 (field_.guarded_cid() == guarded_cid)) {
+        // Guarded CID from feedback is different from initialized guarded CID
+        // in the current program: assume the field will become polymorphic.
+        field_.set_guarded_cid(kDynamicCid);
+        field_.set_is_nullable(true);
+      } else {
+        field_.set_guarded_cid(guarded_cid);
+        field_.set_is_nullable(is_nullable || field_.is_nullable());
+      }
+
+      // TODO(rmacnak): Merge other field type feedback.
+      field_.set_guarded_list_length(Field::kNoFixedLength);
+      field_.set_guarded_list_length_in_object_offset(
+          Field::kUnknownLengthOffset);
+      field_.set_static_type_exactness_state(
+          StaticTypeExactnessState::NotTracking());
+      field_.DeoptimizeDependentCode();
+    }
+  }
+
+  return Error::null();
+}
+
+RawObject* TypeFeedbackLoader::LoadFunction() {
+  bool skip = false;
+
+  cls_ = ReadClassByName();
+  if (!cls_.IsNull()) {
+    error_ = cls_.EnsureIsFinalized(thread_);
+    if (error_.IsError()) {
+      return error_.raw();
+    }
+  } else {
+    skip = true;
+  }
+
+  func_name_ = ReadString();  // Without private mangling.
+  RawFunction::Kind kind = static_cast<RawFunction::Kind>(ReadInt());
+  intptr_t token_pos = ReadInt();
+  intptr_t usage = ReadInt();
+  intptr_t inlining_depth = ReadInt();
+  intptr_t num_call_sites = ReadInt();
+
+  if (!skip) {
+    func_ = FindFunction(kind, token_pos);
+    if (func_.IsNull()) {
+      skip = true;
+      if (FLAG_trace_compilation_trace) {
+        THR_Print("Missing function %s %s\n", func_name_.ToCString(),
+                  Function::KindToCString(kind));
+      }
+    }
+  }
+
+  if (!skip) {
+    error_ = Compiler::CompileFunction(thread_, func_);
+    if (error_.IsError()) {
+      return error_.raw();
+    }
+    call_sites_ = func_.ic_data_array();
+    if (call_sites_.IsNull()) {
+      call_sites_ = Object::empty_array().raw();  // Remove edge case.
+    }
+    if (call_sites_.Length() != num_call_sites + 1) {
+      skip = true;
+      if (FLAG_trace_compilation_trace) {
+        THR_Print("Mismatched call site count %s %" Pd " %" Pd "\n",
+                  func_name_.ToCString(), call_sites_.Length(), num_call_sites);
+      }
+    }
+  }
+
+  // First element is edge counters.
+  for (intptr_t i = 1; i <= num_call_sites; i++) {
+    intptr_t deopt_id = ReadInt();
+    intptr_t rebind_rule = ReadInt();
+    target_name_ = ReadString();
+    intptr_t num_checked_arguments = ReadInt();
+    intptr_t num_entries = ReadInt();
+
+    if (!skip) {
+      call_site_ ^= call_sites_.At(i);
+      if ((call_site_.deopt_id() != deopt_id) ||
+          (call_site_.rebind_rule() != rebind_rule) ||
+          (call_site_.NumArgsTested() != num_checked_arguments)) {
+        skip = true;
+        if (FLAG_trace_compilation_trace) {
+          THR_Print("Mismatched call site %s\n", call_site_.ToCString());
+        }
+      }
+    }
+
+    for (intptr_t entry_index = 0; entry_index < num_entries; entry_index++) {
+      intptr_t entry_usage = ReadInt();
+      bool skip_entry = skip;
+      GrowableArray<intptr_t> cids(num_checked_arguments);
+
+      for (intptr_t argument_index = 0; argument_index < num_checked_arguments;
+           argument_index++) {
+        intptr_t cid = cid_map_[ReadInt()];
+        cids.Add(cid);
+        if (cid == kIllegalCid) {
+          // Alternative: switch to a sentinel value such as kDynamicCid and
+          // have the optimizer generate a megamorphic call.
+          skip_entry = true;
+        }
+      }
+
+      if (skip_entry) {
+        continue;
+      }
+
+      intptr_t reuse_index = call_site_.FindCheck(cids);
+      if (reuse_index == -1) {
+        cls_ = thread_->isolate()->class_table()->At(cids[0]);
+        // Use target name and args descriptor from the current program
+        // instead of saved feedback to get the correct private mangling and
+        // ensure no arity mismatch crashes.
+        target_name_ = call_site_.target_name();
+        args_desc_ = call_site_.arguments_descriptor();
+        target_ = Resolver::ResolveDynamicForReceiverClass(
+            cls_, target_name_, ArgumentsDescriptor(args_desc_));
+        if (!target_.IsNull()) {
+          if (num_checked_arguments == 1) {
+            call_site_.AddReceiverCheck(cids[0], target_, entry_usage);
+          } else {
+            call_site_.AddCheck(cids, target_, entry_usage);
+          }
+        }
+      } else {
+        call_site_.IncrementCountAt(reuse_index, entry_usage);
+      }
+    }
+  }
+
+  if (!skip) {
+    func_.set_usage_counter(usage);
+    func_.set_inlining_depth(inlining_depth);
+
+    // Delay compilation until all feedback is loaded so feedback is available
+    // for inlined functions.
+    functions_to_compile_.Add(func_);
+  }
+
+  return Error::null();
+}
+
+RawFunction* TypeFeedbackLoader::FindFunction(RawFunction::Kind kind,
+                                              intptr_t token_pos) {
+  if (cls_name_.Equals(Symbols::TopLevel())) {
+    func_ = lib_.LookupFunctionAllowPrivate(func_name_);
+  } else {
+    func_ = cls_.LookupFunctionAllowPrivate(func_name_);
+  }
+
+  if (!func_.IsNull()) {
+    // Found regular method.
+  } else if (kind == RawFunction::kMethodExtractor) {
+    ASSERT(Field::IsGetterName(func_name_));
+    // Without private mangling:
+    String& name = String::Handle(zone_, Field::NameFromGetter(func_name_));
+    func_ = cls_.LookupFunctionAllowPrivate(name);
+    if (!func_.IsNull() && func_.IsDynamicFunction()) {
+      name = func_.name();  // With private mangling.
+      name = Field::GetterName(name);
+      func_ = func_.GetMethodExtractor(name);
+    } else {
+      func_ = Function::null();
+    }
+  } else if (kind == RawFunction::kDynamicInvocationForwarder) {
+    // Without private mangling:
+    String& name = String::Handle(
+        zone_, Function::DemangleDynamicInvocationForwarderName(func_name_));
+    func_ = cls_.LookupFunctionAllowPrivate(name);
+    if (!func_.IsNull() && func_.IsDynamicFunction()) {
+      name = func_.name();  // With private mangling.
+      name = Function::CreateDynamicInvocationForwarderName(name);
+      func_ = func_.CreateDynamicInvocationForwarder(name);
+    } else {
+      func_ = Function::null();
+    }
+  } else if (kind == RawFunction::kClosureFunction) {
+    // Note this lookup relies on parent functions appearing before child
+    // functions in the serialized feedback, so the parent will have already
+    // been unoptimized compilated and the child function created and added to
+    // ObjectStore::closure_functions_.
+    const GrowableObjectArray& closure_functions = GrowableObjectArray::Handle(
+        zone_, thread_->isolate()->object_store()->closure_functions());
+    bool found = false;
+    for (intptr_t i = 0; i < closure_functions.Length(); i++) {
+      func_ ^= closure_functions.At(i);
+      if ((func_.Owner() == cls_.raw()) &&
+          (func_.token_pos().value() == token_pos)) {
+        found = true;
+        break;
+      }
+    }
+    if (!found) {
+      func_ = Function::null();
+    }
+  } else {
+    // This leaves unhandled:
+    // - kInvokeFieldDispatcher (how to get a valid args descriptor?)
+    // - static field getters
+    // - static field initializers (not retained by the field object)
+  }
+
+  if (!func_.IsNull()) {
+    if (kind == RawFunction::kImplicitClosureFunction) {
+      func_ = func_.ImplicitClosureFunction();
+    }
+    if (func_.is_abstract() || (func_.kind() != kind)) {
+      func_ = Function::null();
+    }
+  }
+
+  return func_.raw();
+}
+
+RawClass* TypeFeedbackLoader::ReadClassByName() {
+  uri_ = ReadString();
+  cls_name_ = ReadString();
+
+  lib_ = Library::LookupLibrary(thread_, uri_);
+  if (lib_.IsNull()) {
+    if (FLAG_trace_compilation_trace) {
+      THR_Print("Missing library %s\n", uri_.ToCString());
+    }
+    return Class::null();
+  }
+
+  if (cls_name_.Equals(Symbols::TopLevel())) {
+    cls_ = lib_.toplevel_class();
+  } else {
+    cls_ = lib_.SlowLookupClassAllowMultiPartPrivate(cls_name_);
+    if (cls_.IsNull()) {
+      if (FLAG_trace_compilation_trace) {
+        THR_Print("Missing class %s %s\n", uri_.ToCString(),
+                  cls_name_.ToCString());
+      }
+    }
+  }
+  return cls_.raw();
+}
+
+RawString* TypeFeedbackLoader::ReadString() {
+  intptr_t len = stream_->ReadUnsigned();
+  const char* cstr =
+      reinterpret_cast<const char*>(stream_->AddressOfCurrentPosition());
+  stream_->Advance(len);
+  return Symbols::New(thread_, cstr, len);
 }
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compilation_trace.h b/runtime/vm/compilation_trace.h
index 865cb12..106dbbe 100644
--- a/runtime/vm/compilation_trace.h
+++ b/runtime/vm/compilation_trace.h
@@ -6,7 +6,6 @@
 #define RUNTIME_VM_COMPILATION_TRACE_H_
 
 #include "platform/assert.h"
-#include "vm/compiler/jit/compiler.h"
 #include "vm/object.h"
 #include "vm/program_visitor.h"
 #include "vm/zone_text_buffer.h"
@@ -43,7 +42,6 @@
                            const char* cls_cstr,
                            const char* func_cstr);
   RawObject* CompileFunction(const Function& function);
-  RawObject* EvaluateInitializer(const Field& field);
 
   Thread* thread_;
   Zone* zone_;
@@ -59,6 +57,71 @@
   Object& error_;
 };
 
+class TypeFeedbackSaver : public FunctionVisitor {
+ public:
+  explicit TypeFeedbackSaver(WriteStream* stream);
+
+  void WriteHeader();
+  void SaveClasses();
+  void SaveFields();
+  void Visit(const Function& function);
+
+ private:
+  void WriteClassByName(const Class& cls);
+  void WriteString(const String& value);
+  void WriteInt(intptr_t value) { stream_->Write(static_cast<int32_t>(value)); }
+
+  WriteStream* const stream_;
+  Class& cls_;
+  Library& lib_;
+  String& str_;
+  Array& fields_;
+  Field& field_;
+  Code& code_;
+  Array& call_sites_;
+  ICData& call_site_;
+};
+
+class TypeFeedbackLoader : public ValueObject {
+ public:
+  explicit TypeFeedbackLoader(Thread* thread);
+
+  RawObject* LoadFeedback(ReadStream* stream);
+
+ private:
+  RawObject* CheckHeader();
+  RawObject* LoadClasses();
+  RawObject* LoadFields();
+  RawObject* LoadFunction();
+  RawFunction* FindFunction(RawFunction::Kind kind, intptr_t token_pos);
+
+  RawClass* ReadClassByName();
+  RawString* ReadString();
+  intptr_t ReadInt() { return stream_->Read<int32_t>(); }
+
+  Thread* thread_;
+  Zone* zone_;
+  ReadStream* stream_;
+  intptr_t num_cids_;
+  intptr_t* cid_map_;
+  String& uri_;
+  Library& lib_;
+  String& cls_name_;
+  Class& cls_;
+  String& field_name_;
+  Array& fields_;
+  Field& field_;
+  String& func_name_;
+  Function& func_;
+  Array& call_sites_;
+  ICData& call_site_;
+  String& target_name_;
+  Function& target_;
+  Array& args_desc_;
+  GrowableObjectArray& functions_to_compile_;
+  Object& error_;
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_COMPILATION_TRACE_H_
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 0ff81a0..9c0544a 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -287,16 +287,17 @@
   ASSERT(I->can_use_strong_mode_types());
   ASSERT((cid == kDoubleCid) || (cid == kMintCid));
 
-  const String& function_name =
-      (call->IsInstanceCall()
-           ? call->AsInstanceCall()->function_name()
-           : String::ZoneHandle(Z, call->AsStaticCall()->function().name()));
-
-  AddCheckNull(input, function_name, call->deopt_id(), call->env(), call);
+  if (input->Type()->is_nullable()) {
+    const String& function_name =
+        (call->IsInstanceCall()
+             ? call->AsInstanceCall()->function_name()
+             : String::ZoneHandle(Z, call->AsStaticCall()->function().name()));
+    AddCheckNull(input, function_name, call->deopt_id(), call->env(), call);
+  }
 
   input = input->CopyWithType(Z);
 
-  if ((cid == kDoubleCid) && input->Type()->IsNullableInt()) {
+  if (cid == kDoubleCid && input->Type()->IsNullableInt()) {
     Definition* conversion = NULL;
 
     if (input->Type()->ToNullableCid() == kSmiCid) {
@@ -319,25 +320,30 @@
   return input;
 }
 
-Value* AotCallSpecializer::PrepareReceiverOfDevirtualizedCall(Value* input,
+CompileType AotCallSpecializer::BuildStrengthenedReceiverType(Value* input,
                                                               intptr_t cid) {
-  ASSERT(I->can_use_strong_mode_types());
-  ASSERT((cid == kDoubleCid) || (cid == kMintCid));
+  CompileType* old_type = input->Type();
+  CompileType* refined_type = old_type;
 
-  // Can't assert !input->Type()->is_nullable() here as PushArgument receives
-  // value prior to a CheckNull in case of devirtualized call.
-
-  input = input->CopyWithType(Z);
-
-  // Correct type of input if necessary.
-  // This correction is needed as VM may not be able to infer receiver type.
-  if ((cid == kIntegerCid) && !input->Type()->IsNullableInt()) {
-    input->SetReachingType(new (Z) CompileType(CompileType::Int()));
-  } else if ((cid == kDoubleCid) && !input->Type()->IsNullableDouble()) {
-    input->SetReachingType(new (Z) CompileType(CompileType::Double()));
+  CompileType type = CompileType::None();
+  if (cid == kSmiCid) {
+    type = CompileType::NullableSmi();
+    refined_type = CompileType::ComputeRefinedType(old_type, &type);
+  } else if (cid == kMintCid) {
+    type = CompileType::NullableMint();
+    refined_type = CompileType::ComputeRefinedType(old_type, &type);
+  } else if (cid == kIntegerCid && !input->Type()->IsNullableInt()) {
+    type = CompileType::NullableInt();
+    refined_type = CompileType::ComputeRefinedType(old_type, &type);
+  } else if (cid == kDoubleCid && !input->Type()->IsNullableDouble()) {
+    type = CompileType::NullableDouble();
+    refined_type = CompileType::ComputeRefinedType(old_type, &type);
   }
 
-  return input;
+  if (refined_type != old_type) {
+    return *refined_type;
+  }
+  return CompileType::None();
 }
 
 // After replacing a call with a specialized instruction, make sure to
@@ -354,137 +360,249 @@
     InstanceCallInstr* instr) {
   ASSERT(I->can_use_strong_mode_types());
 
-  const intptr_t receiver_index = instr->FirstArgIndex();
   const Token::Kind op_kind = instr->token_kind();
-  Definition* replacement = NULL;
 
-  switch (op_kind) {
-    case Token::kEQ:
-    case Token::kNE:
-    case Token::kLT:
-    case Token::kLTE:
-    case Token::kGT:
-    case Token::kGTE: {
-      Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-      Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-      CompileType* left_type = left_value->Type();
-      CompileType* right_type = right_value->Type();
-      if (left_type->IsNullableInt() && right_type->IsNullableInt()) {
-        if (FlowGraphCompiler::SupportsUnboxedInt64()) {
-          if (Token::IsRelationalOperator(op_kind)) {
+  return TryOptimizeIntegerOperation(instr, op_kind) ||
+         TryOptimizeDoubleOperation(instr, op_kind);
+}
+
+bool AotCallSpecializer::TryOptimizeStaticCallUsingStaticTypes(
+    StaticCallInstr* instr) {
+  ASSERT(I->can_use_strong_mode_types());
+
+  const String& name = String::Handle(Z, instr->function().name());
+  const Token::Kind op_kind = MethodTokenRecognizer::RecognizeTokenKind(name);
+
+  if (op_kind == Token::kEQ && TryReplaceWithHaveSameRuntimeType(instr)) {
+    return true;
+  }
+
+  // We only specialize instance methods for int/double operations.
+  const auto& target = instr->function();
+  if (!target.IsDynamicFunction()) {
+    return false;
+  }
+
+  // For de-virtualized instance calls, we strengthen the type here manually
+  // because it might not be attached to the receiver.
+  // See http://dartbug.com/35179 for preserving the receiver type information.
+  const Class& owner = Class::Handle(Z, target.Owner());
+  const intptr_t cid = owner.id();
+  if (cid == kSmiCid || cid == kMintCid || cid == kIntegerCid ||
+      cid == kDoubleCid) {
+    // Sometimes TFA de-virtualizes instance calls to static calls.  In such
+    // cases the VM might have a looser type on the receiver, so we explicitly
+    // tighten it (this is safe since it was proven that te receiver is either
+    // null or will end up with that target).
+    const intptr_t receiver_index = instr->FirstArgIndex();
+    const intptr_t argument_count = instr->ArgumentCountWithoutTypeArgs();
+    if (argument_count >= 1) {
+      auto push_receiver = instr->PushArgumentAt(receiver_index);
+      auto receiver_value = push_receiver->value();
+      auto receiver = receiver_value->definition();
+      auto type = BuildStrengthenedReceiverType(receiver_value, cid);
+      if (!type.IsNone()) {
+        auto redefinition = flow_graph()->EnsureRedefinition(
+            push_receiver->previous(), receiver, type);
+        if (redefinition != nullptr) {
+          RefineUseTypes(redefinition);
+        }
+      }
+    }
+  }
+
+  return TryOptimizeIntegerOperation(instr, op_kind) ||
+         TryOptimizeDoubleOperation(instr, op_kind);
+}
+
+// Modulo against a constant power-of-two can be optimized into a mask.
+// x % y -> x & (y - 1)
+Definition* AotCallSpecializer::TryOptimizeMod(TemplateDartCall<0>* instr,
+                                               Token::Kind op_kind,
+                                               Value* left_value,
+                                               Value* right_value) {
+  if (!right_value->BindsToConstant()) {
+    return nullptr;
+  }
+
+  const Object& rhs = right_value->BoundConstant();
+  int64_t modulus = Utils::Abs(rhs.IsSmi() ? Smi::Cast(rhs).Value()
+                                           : Mint::Cast(rhs).value());
+  if (!Utils::IsPowerOfTwo(modulus) || !Smi::IsValid(modulus - 1)) {
+    return nullptr;
+  }
+
+  left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
+
+#if defined(TARGET_ARCH_ARM)
+  Definition* right_definition = new (Z) UnboxedConstantInstr(
+      Smi::ZoneHandle(Z, Smi::New(modulus - 1)), kUnboxedInt32);
+  InsertBefore(instr, right_definition, /*env=*/NULL, FlowGraph::kValue);
+  right_definition = new (Z)
+      UnboxedIntConverterInstr(kUnboxedInt32, kUnboxedInt64,
+                               new (Z) Value(right_definition), DeoptId::kNone);
+  InsertBefore(instr, right_definition, /*env=*/NULL, FlowGraph::kValue);
+#else
+  Definition* right_definition = new (Z) UnboxedConstantInstr(
+      Smi::ZoneHandle(Z, Smi::New(modulus - 1)), kUnboxedInt64);
+  InsertBefore(instr, right_definition, /*env=*/NULL, FlowGraph::kValue);
+#endif
+  right_value = new (Z) Value(right_definition);
+  return new (Z)
+      BinaryInt64OpInstr(Token::kBIT_AND, left_value, right_value,
+                         DeoptId::kNone, Instruction::kNotSpeculative);
+}
+
+bool AotCallSpecializer::TryOptimizeIntegerOperation(TemplateDartCall<0>* instr,
+                                                     Token::Kind op_kind) {
+  if (instr->type_args_len() != 0) {
+    // Arithmetic operations don't have type arguments.
+    return false;
+  }
+
+  ASSERT(I->can_use_strong_mode_types());
+
+  Definition* replacement = NULL;
+  if (instr->ArgumentCount() == 2) {
+    Value* left_value = instr->PushArgumentAt(0)->value();
+    Value* right_value = instr->PushArgumentAt(1)->value();
+    CompileType* left_type = left_value->Type();
+    CompileType* right_type = right_value->Type();
+
+    const bool is_equality_op = Token::IsEqualityOperator(op_kind);
+    const bool has_nullable_int_args =
+        left_type->IsNullableInt() && right_type->IsNullableInt();
+
+    // NOTE: We cannot use strict comparisons if the receiver has an overridden
+    // == operator or if either side can be a double, since 1.0 == 1.
+    const bool can_use_strict_compare =
+        is_equality_op && has_nullable_int_args &&
+        (left_type->IsNullableSmi() || right_type->IsNullableSmi());
+
+    // We only support binary operations if both operands are nullable integers
+    // or when we can use a cheap strict comparison operation.
+    if (!has_nullable_int_args) {
+      return false;
+    }
+
+    switch (op_kind) {
+      case Token::kEQ:
+      case Token::kNE:
+      case Token::kLT:
+      case Token::kLTE:
+      case Token::kGT:
+      case Token::kGTE: {
+        const bool supports_unboxed_int =
+            FlowGraphCompiler::SupportsUnboxedInt64();
+        const bool can_use_equality_compare =
+            supports_unboxed_int && is_equality_op && left_type->IsInt() &&
+            right_type->IsInt();
+
+        // We prefer equality compare, since it doesn't require boxing.
+        if (!can_use_equality_compare && can_use_strict_compare) {
+          replacement = new (Z) StrictCompareInstr(
+              instr->token_pos(),
+              (op_kind == Token::kEQ) ? Token::kEQ_STRICT : Token::kNE_STRICT,
+              left_value->CopyWithType(Z), right_value->CopyWithType(Z),
+              /*needs_number_check=*/false, DeoptId::kNone);
+          break;
+        }
+
+        if (supports_unboxed_int) {
+          if (can_use_equality_compare) {
+            replacement = new (Z) EqualityCompareInstr(
+                instr->token_pos(), op_kind, left_value->CopyWithType(Z),
+                right_value->CopyWithType(Z), kMintCid, DeoptId::kNone,
+                Instruction::kNotSpeculative);
+            break;
+          } else if (Token::IsRelationalOperator(op_kind)) {
             left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
             right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
             replacement = new (Z) RelationalOpInstr(
                 instr->token_pos(), op_kind, left_value, right_value, kMintCid,
                 DeoptId::kNone, Instruction::kNotSpeculative);
-
+            break;
           } else {
             // TODO(dartbug.com/30480): Figure out how to handle null in
             // equality comparisons.
-            // replacement = new (Z) EqualityCompareInstr(
-            //     instr->token_pos(), op_kind, left_value->CopyWithType(Z),
-            //     right_value->CopyWithType(Z), kMintCid, DeoptId::kNone);
-            replacement = new (Z) CheckedSmiComparisonInstr(
-                instr->token_kind(), left_value->CopyWithType(Z),
-                right_value->CopyWithType(Z), instr);
-          }
-          // TODO(dartbug.com/30480): Enable comparisons with Smi.
-        } else if (false &&
-                   ((op_kind == Token::kEQ) || (op_kind == Token::kNE)) &&
-                   ((left_type->ToCid() == kSmiCid) ||
-                    (right_type->ToCid() == kSmiCid))) {
-          replacement = new (Z) StrictCompareInstr(
-              instr->token_pos(),
-              (op_kind == Token::kEQ) ? Token::kEQ_STRICT : Token::kNE_STRICT,
-              left_value->CopyWithType(Z), right_value->CopyWithType(Z),
-              /* number_check = */ false, DeoptId::kNone);
-        } else {
-          replacement = new (Z) CheckedSmiComparisonInstr(
-              instr->token_kind(), left_value->CopyWithType(Z),
-              right_value->CopyWithType(Z), instr);
-        }
-      } else if (FlowGraphCompiler::SupportsUnboxedDoubles() &&
-                 (left_type->IsNullableDouble() ||
-                  IsSupportedIntOperandForStaticDoubleOp(left_type)) &&
-                 (right_type->IsNullableDouble() ||
-                  IsSupportedIntOperandForStaticDoubleOp(right_type))) {
-        ASSERT(left_type->IsNullableDouble() || right_type->IsNullableDouble());
-        // TODO(dartbug.com/30480): Support == and != for doubles.
-        if ((op_kind == Token::kLT) || (op_kind == Token::kLTE) ||
-            (op_kind == Token::kGT) || (op_kind == Token::kGTE)) {
-          left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
-          right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
-          replacement = new (Z) RelationalOpInstr(
-              instr->token_pos(), op_kind, left_value, right_value, kDoubleCid,
-              DeoptId::kNone, Instruction::kNotSpeculative);
-        }
-      }
-      break;
-    }
-    case Token::kSHL:
-    case Token::kSHR:
-    case Token::kBIT_OR:
-    case Token::kBIT_XOR:
-    case Token::kBIT_AND:
-    case Token::kADD:
-    case Token::kSUB:
-    case Token::kMUL:
-    case Token::kDIV: {
-      if ((op_kind == Token::kDIV) &&
-          !FlowGraphCompiler::SupportsHardwareDivision()) {
-        return false;
-      }
-      Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-      Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-      CompileType* left_type = left_value->Type();
-      CompileType* right_type = right_value->Type();
-      if (left_type->IsNullableInt() && right_type->IsNullableInt() &&
-          (op_kind != Token::kDIV)) {
-        if (FlowGraphCompiler::SupportsUnboxedInt64()) {
-          if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
-            // TODO(dartbug.com/30480): Enable 64-bit integer shifts.
-            // replacement = new ShiftInt64OpInstr(
-            //     op_kind, left_value->CopyWithType(Z),
-            //     right_value->CopyWithType(Z), DeoptId::kNone);
-            replacement =
-                new (Z) CheckedSmiOpInstr(op_kind, left_value->CopyWithType(Z),
+            replacement = new (Z)
+                CheckedSmiComparisonInstr(op_kind, left_value->CopyWithType(Z),
                                           right_value->CopyWithType(Z), instr);
+            break;
+          }
+        } else {
+          replacement = new (Z)
+              CheckedSmiComparisonInstr(op_kind, left_value->CopyWithType(Z),
+                                        right_value->CopyWithType(Z), instr);
+          break;
+        }
+        break;
+      }
+      case Token::kMOD:
+        replacement = TryOptimizeMod(instr, op_kind, left_value, right_value);
+        if (replacement != nullptr) break;
+      case Token::kTRUNCDIV:
+#if !defined(TARGET_ARCH_X64) && !defined(TARGET_ARCH_ARM64)
+        // TODO(ajcbik): 32-bit archs too?
+        break;
+#endif
+      case Token::kSHL:
+      case Token::kSHR:
+      case Token::kBIT_OR:
+      case Token::kBIT_XOR:
+      case Token::kBIT_AND:
+      case Token::kADD:
+      case Token::kSUB:
+      case Token::kMUL: {
+        if (FlowGraphCompiler::SupportsUnboxedInt64()) {
+          if (op_kind == Token::kSHR || op_kind == Token::kSHL) {
+            left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
+            right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
+            replacement = new (Z) ShiftInt64OpInstr(
+                op_kind, left_value, right_value, DeoptId::kNone);
+            break;
           } else {
             left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
             right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
             replacement = new (Z) BinaryInt64OpInstr(
                 op_kind, left_value, right_value, DeoptId::kNone,
                 Instruction::kNotSpeculative);
+            break;
           }
-        } else {
+        }
+        if (op_kind != Token::kMOD && op_kind != Token::kTRUNCDIV) {
           replacement =
               new (Z) CheckedSmiOpInstr(op_kind, left_value->CopyWithType(Z),
                                         right_value->CopyWithType(Z), instr);
+          break;
         }
-      } else if (FlowGraphCompiler::SupportsUnboxedDoubles() &&
-                 (left_type->IsNullableDouble() ||
-                  IsSupportedIntOperandForStaticDoubleOp(left_type)) &&
-                 (right_type->IsNullableDouble() ||
-                  IsSupportedIntOperandForStaticDoubleOp(right_type))) {
-        if ((op_kind == Token::kADD) || (op_kind == Token::kSUB) ||
-            (op_kind == Token::kMUL) || (op_kind == Token::kDIV)) {
-          ASSERT(left_type->IsNullableDouble() ||
-                 right_type->IsNullableDouble() || (op_kind == Token::kDIV));
-          left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
-          right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
-          replacement = new (Z) BinaryDoubleOpInstr(
-              op_kind, left_value, right_value, DeoptId::kNone,
-              instr->token_pos(), Instruction::kNotSpeculative);
-        }
+        break;
       }
-      break;
+
+      default:
+        break;
+    }
+  } else if (instr->ArgumentCount() == 1) {
+    Value* left_value = instr->PushArgumentAt(0)->value();
+    CompileType* left_type = left_value->Type();
+
+    // We only support unary operations on nullable integers.
+    if (!left_type->IsNullableInt()) {
+      return false;
     }
 
-    default:
-      break;
+#ifndef TARGET_ARCH_DBC
+    if (FlowGraphCompiler::SupportsUnboxedInt64()) {
+      if (op_kind == Token::kNEGATE || op_kind == Token::kBIT_NOT) {
+        left_value = PrepareStaticOpInput(left_value, kMintCid, instr);
+        replacement = new (Z) UnaryInt64OpInstr(
+            op_kind, left_value, DeoptId::kNone, Instruction::kNotSpeculative);
+      }
+    }
+#endif
   }
 
-  if (replacement != NULL && !replacement->ComputeCanDeoptimize()) {
+  if (replacement != nullptr && !replacement->ComputeCanDeoptimize()) {
     if (FLAG_trace_strong_mode_types) {
       THR_Print("[Strong mode] Optimization: replacing %s with %s\n",
                 instr->ToCString(), replacement->ToCString());
@@ -497,47 +615,46 @@
   return false;
 }
 
-bool AotCallSpecializer::TryOptimizeStaticCallUsingStaticTypes(
-    StaticCallInstr* instr) {
-  ASSERT(I->can_use_strong_mode_types());
-  Definition* replacement = NULL;
-
-  const String& name = String::Handle(Z, instr->function().name());
-  const Token::Kind op_kind = MethodTokenRecognizer::RecognizeTokenKind(name);
-
-  if ((op_kind == Token::kEQ) && TryReplaceWithHaveSameRuntimeType(instr)) {
-    return true;
-  }
-
-  const Class& owner = Class::Handle(Z, instr->function().Owner());
-  if ((owner.id() != kIntegerCid) && (owner.id() != kDoubleCid)) {
+bool AotCallSpecializer::TryOptimizeDoubleOperation(TemplateDartCall<0>* instr,
+                                                    Token::Kind op_kind) {
+  if (instr->type_args_len() != 0) {
+    // Arithmetic operations don't have type arguments.
     return false;
   }
 
-  const intptr_t receiver_index = instr->FirstArgIndex();
+  Definition* replacement = NULL;
 
-  // Recognize double and int operators here as devirtualization can convert
-  // instance calls of these operators into static calls.
+  if (instr->ArgumentCount() == 2) {
+    if (!FlowGraphCompiler::SupportsUnboxedDoubles()) {
+      return false;
+    }
 
-  if (owner.id() == kIntegerCid) {
-    if (!FlowGraphCompiler::SupportsUnboxedInt64()) {
+    Value* left_value = instr->PushArgumentAt(0)->value();
+    Value* right_value = instr->PushArgumentAt(1)->value();
+    CompileType* left_type = left_value->Type();
+    CompileType* right_type = right_value->Type();
+
+    if (!left_type->IsNullableDouble() &&
+        !IsSupportedIntOperandForStaticDoubleOp(left_type)) {
+      return false;
+    }
+    if (!right_type->IsNullableDouble() &&
+        !IsSupportedIntOperandForStaticDoubleOp(right_type)) {
       return false;
     }
 
     switch (op_kind) {
       case Token::kEQ:
       case Token::kNE: {
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-        CompileType* right_type = right_value->Type();
-        // TODO(dartbug.com/32166): Support EQ, NE for nullable ints.
+        // TODO(dartbug.com/32166): Support EQ, NE for nullable doubles.
         // (requires null-aware comparison instruction).
-        if (right_type->IsNullableInt() && !right_type->is_nullable()) {
-          left_value = PrepareReceiverOfDevirtualizedCall(left_value, kMintCid);
-          right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
+        if (left_type->IsDouble() && right_type->IsDouble()) {
+          left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
+          right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
           replacement = new (Z) EqualityCompareInstr(
-              instr->token_pos(), op_kind, left_value, right_value, kMintCid,
+              instr->token_pos(), op_kind, left_value, right_value, kDoubleCid,
               DeoptId::kNone, Instruction::kNotSpeculative);
+          break;
         }
         break;
       }
@@ -545,164 +662,55 @@
       case Token::kLTE:
       case Token::kGT:
       case Token::kGTE: {
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-        CompileType* left_type = left_value->Type();
-        CompileType* right_type = right_value->Type();
-        if (right_type->IsNullableInt()) {
-          left_value = PrepareReceiverOfDevirtualizedCall(left_value, kMintCid);
-          right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
-          replacement = new (Z) RelationalOpInstr(
-              instr->token_pos(), op_kind, left_value, right_value, kMintCid,
-              DeoptId::kNone, Instruction::kNotSpeculative);
-        } else if (FlowGraphCompiler::SupportsUnboxedDoubles() &&
-                   right_type->IsNullableDouble() &&
-                   IsSupportedIntOperandForStaticDoubleOp(left_type)) {
-          left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
-          right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
-          replacement = new (Z) RelationalOpInstr(
-              instr->token_pos(), op_kind, left_value, right_value, kDoubleCid,
-              DeoptId::kNone, Instruction::kNotSpeculative);
-        }
+        left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
+        right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
+        replacement = new (Z) RelationalOpInstr(
+            instr->token_pos(), op_kind, left_value, right_value, kDoubleCid,
+            DeoptId::kNone, Instruction::kNotSpeculative);
         break;
       }
-      case Token::kBIT_OR:
-      case Token::kBIT_XOR:
-      case Token::kBIT_AND:
       case Token::kADD:
       case Token::kSUB:
       case Token::kMUL:
-#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM64)
-      // TODO(ajcbik): 32-bit archs too?
-      case Token::kMOD:
-      case Token::kTRUNCDIV:
-#endif
       case Token::kDIV: {
-        if ((op_kind == Token::kDIV) &&
+        if (op_kind == Token::kDIV &&
             !FlowGraphCompiler::SupportsHardwareDivision()) {
           return false;
         }
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-        CompileType* left_type = left_value->Type();
-        CompileType* right_type = right_value->Type();
-        if (right_type->IsNullableInt() && (op_kind != Token::kDIV)) {
-          left_value = PrepareReceiverOfDevirtualizedCall(left_value, kMintCid);
-          right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
-          replacement = new (Z)
-              BinaryInt64OpInstr(op_kind, left_value, right_value,
-                                 DeoptId::kNone, Instruction::kNotSpeculative);
-        } else if (FlowGraphCompiler::SupportsUnboxedDoubles() &&
-                   right_type->IsNullableDouble() &&
-                   IsSupportedIntOperandForStaticDoubleOp(left_type)) {
-          if ((op_kind == Token::kADD) || (op_kind == Token::kSUB) ||
-              (op_kind == Token::kMUL) || (op_kind == Token::kDIV)) {
-            ASSERT(left_type->IsNullableDouble() ||
-                   right_type->IsNullableDouble() || (op_kind == Token::kDIV));
-            left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
-            right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
-            replacement = new (Z) BinaryDoubleOpInstr(
-                op_kind, left_value, right_value, DeoptId::kNone,
-                instr->token_pos(), Instruction::kNotSpeculative);
-          }
-        }
+        left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
+        right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
+        replacement = new (Z) BinaryDoubleOpInstr(
+            op_kind, left_value, right_value, DeoptId::kNone,
+            instr->token_pos(), Instruction::kNotSpeculative);
         break;
       }
-#ifndef TARGET_ARCH_DBC
-      case Token::kNEGATE: {
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        left_value = PrepareReceiverOfDevirtualizedCall(left_value, kMintCid);
-        replacement = new (Z)
-            UnaryInt64OpInstr(Token::kNEGATE, left_value, DeoptId::kNone,
-                              Instruction::kNotSpeculative);
-        break;
-      }
-#endif
-      case Token::kSHL:
-      case Token::kSHR: {
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-        CompileType* right_type = right_value->Type();
-        if (right_type->IsNullableInt()) {
-          left_value = PrepareReceiverOfDevirtualizedCall(left_value, kMintCid);
-          right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
-          replacement = new (Z) ShiftInt64OpInstr(op_kind, left_value,
-                                                  right_value, DeoptId::kNone);
-        }
-        break;
-      }
+
+      case Token::kBIT_OR:
+      case Token::kBIT_XOR:
+      case Token::kBIT_AND:
+      case Token::kMOD:
+      case Token::kTRUNCDIV:
       default:
         break;
     }
-  } else if ((owner.id() == kDoubleCid) &&
-             FlowGraphCompiler::SupportsUnboxedDoubles()) {
-    // TODO(dartbug.com/30480): Handle more double operations.
-    switch (op_kind) {
-      case Token::kEQ:
-      case Token::kNE: {
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-        CompileType* right_type = right_value->Type();
-        // TODO(dartbug.com/32166): Support EQ, NE for nullable doubles.
-        // (requires null-aware comparison instruction).
-        if (right_type->IsNullableDouble() && !right_type->is_nullable()) {
-          left_value =
-              PrepareReceiverOfDevirtualizedCall(left_value, kDoubleCid);
-          right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
-          replacement = new (Z) EqualityCompareInstr(
-              instr->token_pos(), op_kind, left_value, right_value, kDoubleCid,
-              DeoptId::kNone, Instruction::kNotSpeculative);
-        }
-        break;
-      }
-      case Token::kLT:
-      case Token::kLTE:
-      case Token::kGT:
-      case Token::kGTE: {
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-        if (right_value->Type()->IsNullableDouble() ||
-            IsSupportedIntOperandForStaticDoubleOp(right_value->Type())) {
-          left_value =
-              PrepareReceiverOfDevirtualizedCall(left_value, kDoubleCid);
-          right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
-          replacement = new (Z) RelationalOpInstr(
-              instr->token_pos(), op_kind, left_value, right_value, kDoubleCid,
-              DeoptId::kNone, Instruction::kNotSpeculative);
-        }
-        break;
-      }
-      case Token::kADD:
-      case Token::kSUB:
-      case Token::kMUL:
-      case Token::kDIV: {
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
-        if (right_value->Type()->IsNullableDouble() ||
-            IsSupportedIntOperandForStaticDoubleOp(right_value->Type())) {
-          left_value =
-              PrepareReceiverOfDevirtualizedCall(left_value, kDoubleCid);
-          right_value = PrepareStaticOpInput(right_value, kDoubleCid, instr);
-          replacement = new (Z) BinaryDoubleOpInstr(
-              op_kind, left_value, right_value, DeoptId::kNone,
-              instr->token_pos(), Instruction::kNotSpeculative);
-        }
-        break;
-      }
-      case Token::kNEGATE: {
-        Value* left_value = instr->PushArgumentAt(receiver_index)->value();
-        left_value = PrepareReceiverOfDevirtualizedCall(left_value, kDoubleCid);
-        replacement = new (Z)
-            UnaryDoubleOpInstr(Token::kNEGATE, left_value, instr->deopt_id(),
-                               Instruction::kNotSpeculative);
-        break;
-      }
-      default:
-        break;
+  } else if (instr->ArgumentCount() == 1) {
+    Value* left_value = instr->PushArgumentAt(0)->value();
+    CompileType* left_type = left_value->Type();
+
+    // We only support unary operations on nullable doubles.
+    if (!left_type->IsNullableDouble()) {
+      return false;
+    }
+
+    if (op_kind == Token::kNEGATE) {
+      left_value = PrepareStaticOpInput(left_value, kDoubleCid, instr);
+      replacement = new (Z)
+          UnaryDoubleOpInstr(Token::kNEGATE, left_value, instr->deopt_id(),
+                             Instruction::kNotSpeculative);
     }
   }
 
-  if ((replacement != NULL) && !replacement->ComputeCanDeoptimize()) {
+  if (replacement != NULL && !replacement->ComputeCanDeoptimize()) {
     if (FLAG_trace_strong_mode_types) {
       THR_Print("[Strong mode] Optimization: replacing %s with %s\n",
                 instr->ToCString(), replacement->ToCString());
@@ -1228,25 +1236,6 @@
   return true;
 }
 
-void AotCallSpecializer::ReplaceArrayBoundChecks(FlowGraph* flow_graph) {
-  Zone* zone = Thread::Current()->zone();
-
-  for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
-       !block_it.Done(); block_it.Advance()) {
-    for (ForwardInstructionIterator it(block_it.Current()); !it.Done();
-         it.Advance()) {
-      if (CheckArrayBoundInstr* check = it.Current()->AsCheckArrayBound()) {
-        GenericCheckBoundInstr* new_check = new (zone) GenericCheckBoundInstr(
-            new (zone) Value(check->length()->definition()),
-            new (zone) Value(check->index()->definition()), check->deopt_id());
-        flow_graph->InsertBefore(check, new_check, check->env(),
-                                 FlowGraph::kEffect);
-        it.RemoveCurrentFromGraph();
-      }
-    }
-  }
-}
-
 #endif  // DART_PRECOMPILER
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.h b/runtime/vm/compiler/aot/aot_call_specializer.h
index 5ffbea1..c40aa8b 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.h
+++ b/runtime/vm/compiler/aot/aot_call_specializer.h
@@ -20,11 +20,6 @@
 
   virtual ~AotCallSpecializer() {}
 
-  // TODO(dartbug.com/30633) these method has nothing to do with
-  // specialization of calls. They are here for historical reasons.
-  // Find a better place for them.
-  static void ReplaceArrayBoundChecks(FlowGraph* flow_graph);
-
   virtual void VisitInstanceCall(InstanceCallInstr* instr);
   virtual void VisitStaticCall(StaticCallInstr* instr);
   virtual void VisitPolymorphicInstanceCall(
@@ -48,12 +43,22 @@
   bool IsSupportedIntOperandForStaticDoubleOp(CompileType* operand_type);
   Value* PrepareStaticOpInput(Value* input, intptr_t cid, Instruction* call);
 
-  Value* PrepareReceiverOfDevirtualizedCall(Value* input, intptr_t cid);
+  CompileType BuildStrengthenedReceiverType(Value* input, intptr_t cid);
 
   bool TryOptimizeInstanceCallUsingStaticTypes(InstanceCallInstr* instr);
 
   virtual bool TryOptimizeStaticCallUsingStaticTypes(StaticCallInstr* call);
 
+  // Try to replace a call with a more specialized instruction working on
+  // integers (e.g. BinaryInt64OpInstr, CheckedSmiComparisonInstr,
+  // RelationalOpInstr)
+  bool TryOptimizeIntegerOperation(TemplateDartCall<0>* call, Token::Kind kind);
+
+  // Try to replace a call with a more specialized instruction working on
+  // doubles (e.g. BinaryDoubleOpInstr, CheckedSmiComparisonInstr,
+  // RelationalOpInstr)
+  bool TryOptimizeDoubleOperation(TemplateDartCall<0>* call, Token::Kind kind);
+
   // Check if o.m(...) [call] is actually an invocation through a getter
   // o.get:m().call(...) given that the receiver of the call is a subclass
   // of the [receiver_class]. If it is - then expand it into
@@ -61,6 +66,11 @@
   bool TryExpandCallThroughGetter(const Class& receiver_class,
                                   InstanceCallInstr* call);
 
+  Definition* TryOptimizeMod(TemplateDartCall<0>* instr,
+                             Token::Kind op_kind,
+                             Value* left_value,
+                             Value* right_value);
+
   Precompiler* precompiler_;
 
   bool has_unique_no_such_method_;
diff --git a/runtime/vm/compiler/aot/entry_points_pragma.md b/runtime/vm/compiler/aot/entry_points_pragma.md
deleted file mode 100644
index dfdecfe..0000000
--- a/runtime/vm/compiler/aot/entry_points_pragma.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Entry points @pragma annotations
-
-Dart VM precompiler (AOT compiler) performs whole-program optimizations such as
-tree shaking in order to decrease size of the resulting compiled apps and
-improve their performance. Such optimizations assume that compiler can see the
-whole Dart program, and is able to discover and analyze all Dart functions and
-members which can be potentially executed at run time. While the Dart code is
-fully available for precompiler, native code of the embedder and native methods
-are out of reach of the compiler. Such native code can call back to Dart via
-native Dart API.
-
-In order to aid precompiler, programmer can explicitly list entry points
-(roots) - Dart classes and members which are accessed from native code. Note
-that listing entry points is not optional: as long as program defines native
-methods which call into Dart, the entry points are required for the correctness
-of compilation.
-
-In addition, when obfuscation is enabled, the precompiler needs to know which
-symbols need to be preserved to ensure they can be resolved from native code.
-
-# Pragma annotation
-
-The annotation `@pragma("vm:entry-point", ...)` can be placed on a class or
-member to indicate that it may be resolved, allocated or invoked directly from
-native or VM code.
-
-The allowed uses of the annotation are as follows.
-
-## Classes
-
-Any one of the following forms may be attached to a class:
-
-```dart
-@pragma("vm:entry-point")
-@pragma("vm:entry-point", true/false)
-@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
-class C { ... }
-```
-
-If the second parameter is missing, `null` or `true`, the class will be
-available for allocation directly from native or VM code.
-
-Note that `@pragma("vm:entry-point")` may be added to abstract classes -- in
-this case, their name will survive obfuscation, but they won't have any
-allocation stubs.
-
-## Procedures
-
-Any one of the following forms may be attached to a procedure (including
-getters, setters and constructors):
-
-```dart
-@pragma("vm:entry-point")
-@pragma("vm:entry-point", true/false)
-@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
-void foo() { ... }
-```
-
-If the second parameter is missing, `null` or `true`, the procedure will
-available for lookup and invocation directly from native or VM code. If the
-procedure is a *generative* constructor, the enclosing class will also be marked
-for allocation from native or VM code.
-
-## Fields
-
-Any one of the following forms may be attached to a non-static field. The first
-three forms may be attached to static fields.
-
-```dart
-@pragma("vm:entry-point")
-@pragma("vm:entry-point", null)
-@pragma("vm:entry-point", true/false)
-@pragma("vm:entry-point", !const bool.formEnvironment("dart.vm.product"))
-@pragma("vm:entry-point", "get"/"set")
-void foo() { ... }
-```
-
-If the second parameter is missing, `null` or `true, the field is marked for
-native access and for non-static fields the corresponding getter and setter in
-the interface of the enclosing class are marked for native invocation. If the
-'get'/'set' parameter is used, only the getter/setter is marked. For static
-fields, the implicit getter is always marked. The third form does not make sense
-for static fields because they do not belong to an interface.
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index c272742..1fc69d6 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -9,6 +9,7 @@
 #include "vm/compiler/aot/aot_call_specializer.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/assembler/disassembler.h"
+#include "vm/compiler/backend/block_scheduler.h"
 #include "vm/compiler/backend/branch_optimizer.h"
 #include "vm/compiler/backend/constant_propagator.h"
 #include "vm/compiler/backend/flow_graph.h"
@@ -23,6 +24,7 @@
 #include "vm/compiler/compiler_pass.h"
 #include "vm/compiler/compiler_state.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"
+#include "vm/compiler/frontend/kernel_to_il.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_entry.h"
 #include "vm/exceptions.h"
@@ -57,6 +59,7 @@
 #define Z (zone())
 
 DEFINE_FLAG(bool, print_unique_targets, false, "Print unique dynamic targets");
+DEFINE_FLAG(bool, print_gop, false, "Print global object pool");
 DEFINE_FLAG(bool, trace_precompiler, false, "Trace precompiler.");
 DEFINE_FLAG(
     int,
@@ -83,6 +86,8 @@
 DECLARE_FLAG(int, inlining_constant_arguments_min_size_threshold);
 DECLARE_FLAG(bool, print_instruction_stats);
 
+Precompiler* Precompiler::singleton_ = nullptr;
+
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                  \
     !defined(TARGET_ARCH_IA32)
 
@@ -141,10 +146,7 @@
     precompiler.DoCompileAll();
     return Error::null();
   } else {
-    Thread* thread = Thread::Current();
-    const Error& error = Error::Handle(thread->sticky_error());
-    thread->clear_sticky_error();
-    return error.raw();
+    return Thread::Current()->StealStickyError();
   }
 }
 
@@ -175,7 +177,15 @@
       types_to_retain_(),
       consts_to_retain_(),
       error_(Error::Handle()),
-      get_runtime_type_is_unique_(false) {}
+      get_runtime_type_is_unique_(false) {
+  ASSERT(Precompiler::singleton_ == NULL);
+  Precompiler::singleton_ = this;
+}
+
+Precompiler::~Precompiler() {
+  ASSERT(Precompiler::singleton_ == this);
+  Precompiler::singleton_ = NULL;
+}
 
 void Precompiler::DoCompileAll() {
   ASSERT(I->compilation_allowed());
@@ -184,8 +194,16 @@
     StackZone stack_zone(T);
     zone_ = stack_zone.GetZone();
 
+    if (FLAG_use_bare_instructions) {
+      // Since we keep the object pool until the end of AOT compilation, it
+      // will hang on to its entries until the very end. Therefore we have
+      // to use handles which survive that long, so we use [zone_] here.
+      global_object_pool_wrapper_.InitializeWithZone(zone_);
+    }
+
     {
       HANDLESCOPE(T);
+
       // Make sure class hierarchy is stable before compilation so that CHA
       // can be used. Also ensures lookup of entry points won't miss functions
       // because their class hasn't been finalized yet.
@@ -204,10 +222,35 @@
 
       // Precompile constructors to compute information such as
       // optimized instruction count (used in inlining heuristics).
-      ClassFinalizer::ClearAllCode();
+      ClassFinalizer::ClearAllCode(
+          /*including_nonchanging_cids=*/FLAG_use_bare_instructions);
       PrecompileConstructors();
 
-      ClassFinalizer::ClearAllCode();
+      ClassFinalizer::ClearAllCode(
+          /*including_nonchanging_cids=*/FLAG_use_bare_instructions);
+
+      // All stubs have already been generated, all of them share the same pool.
+      // We use that pool to initialize our global object pool, to guarantee
+      // stubs as well as code compiled from here on will have the same pool.
+      if (FLAG_use_bare_instructions) {
+        // We use any stub here to get it's object pool (all stubs share the
+        // same object pool in bare instructions mode).
+        const Code& code = StubCode::InterpretCall();
+        const ObjectPool& stub_pool = ObjectPool::Handle(code.object_pool());
+
+        global_object_pool_wrapper()->Reset();
+        global_object_pool_wrapper()->InitializeFrom(stub_pool);
+
+        // We have two global code objects we need to re-generate with the new
+        // global object pool, namely the
+        //   - megamorphic miss handler code and the
+        //   - build method extractor code
+        MegamorphicCacheTable::ReInitMissHandlerCode(
+            isolate_, global_object_pool_wrapper());
+        I->object_store()->set_build_method_extractor_code(
+            Code::Handle(StubCode::GetBuildMethodExtractorStub(
+                global_object_pool_wrapper())));
+      }
 
       CollectDynamicFunctionNames();
 
@@ -223,6 +266,21 @@
       // [Type]-specialized stubs.
       AttachOptimizedTypeTestingStub();
 
+      if (FLAG_use_bare_instructions) {
+        // Now we generate the actual object pool instance and attach it to the
+        // object store. The AOT runtime will use it from there in the enter
+        // dart code stub.
+        const auto& pool =
+            ObjectPool::Handle(global_object_pool_wrapper()->MakeObjectPool());
+        I->object_store()->set_global_object_pool(pool);
+        global_object_pool_wrapper()->Reset();
+
+        if (FLAG_print_gop) {
+          THR_Print("Global object pool:\n");
+          pool.DebugPrint();
+        }
+      }
+
       I->set_compilation_allowed(false);
 
       TraceForRetainedFunctions();
@@ -369,9 +427,6 @@
     }
 
     CheckForNewDynamicFunctions();
-    if (!changed_) {
-      TraceConstFunctions();
-    }
     CollectCallbackFields();
   }
 }
@@ -438,6 +493,10 @@
 }
 
 void Precompiler::ProcessFunction(const Function& function) {
+  const intptr_t gop_offset =
+      FLAG_use_bare_instructions ? global_object_pool_wrapper()->CurrentLength()
+                                 : 0;
+
   if (!function.HasCode()) {
     function_count_++;
 
@@ -469,22 +528,29 @@
   }
 
   ASSERT(function.HasCode());
-  AddCalleesOf(function);
+  AddCalleesOf(function, gop_offset);
 }
 
-void Precompiler::AddCalleesOf(const Function& function) {
+void Precompiler::AddCalleesOf(const Function& function, intptr_t gop_offset) {
   ASSERT(function.HasCode());
 
   const Code& code = Code::Handle(Z, function.CurrentCode());
 
-  const Array& table = Array::Handle(Z, code.static_calls_target_table());
   Object& entry = Object::Handle(Z);
+  Class& cls = Class::Handle(Z);
   Function& target = Function::Handle(Z);
-  for (intptr_t i = 0; i < table.Length(); i++) {
-    entry = table.At(i);
+
+  const Array& table = Array::Handle(Z, code.static_calls_target_table());
+  StaticCallsTable static_calls(table);
+  for (auto& view : static_calls) {
+    entry = view.Get<Code::kSCallTableFunctionTarget>();
     if (entry.IsFunction()) {
-      target ^= entry.raw();
-      AddFunction(target);
+      AddFunction(Function::Cast(entry));
+    }
+    entry = view.Get<Code::kSCallTableCodeTarget>();
+    if (entry.IsCode() && Code::Cast(entry).IsAllocationStubCode()) {
+      cls ^= Code::Cast(entry).owner();
+      AddInstantiatedClass(cls);
     }
   }
 
@@ -492,58 +558,23 @@
   FATAL("Callee scanning unimplemented for IA32");
 #endif
 
-  const ObjectPool& pool = ObjectPool::Handle(Z, code.GetObjectPool());
-  ICData& call_site = ICData::Handle(Z);
-  MegamorphicCache& cache = MegamorphicCache::Handle(Z);
   String& selector = String::Handle(Z);
-  Field& field = Field::Handle(Z);
-  Class& cls = Class::Handle(Z);
-  Instance& instance = Instance::Handle(Z);
-  Code& target_code = Code::Handle(Z);
-  for (intptr_t i = 0; i < pool.Length(); i++) {
-    if (pool.TypeAt(i) == ObjectPool::kTaggedObject) {
-      entry = pool.ObjectAt(i);
-      if (entry.IsICData()) {
-        // A dynamic call.
-        call_site ^= entry.raw();
-        ASSERT(!call_site.is_static_call());
-        selector = call_site.target_name();
-        AddSelector(selector);
-        if (selector.raw() == Symbols::Call().raw()) {
-          // Potential closure call.
-          const Array& arguments_descriptor =
-              Array::Handle(Z, call_site.arguments_descriptor());
-          AddClosureCall(arguments_descriptor);
-        }
-      } else if (entry.IsMegamorphicCache()) {
-        // A dynamic call.
-        cache ^= entry.raw();
-        selector = cache.target_name();
-        AddSelector(selector);
-        if (selector.raw() == Symbols::Call().raw()) {
-          // Potential closure call.
-          const Array& arguments_descriptor =
-              Array::Handle(Z, cache.arguments_descriptor());
-          AddClosureCall(arguments_descriptor);
-        }
-      } else if (entry.IsField()) {
-        // Potential need for field initializer.
-        field ^= entry.raw();
-        AddField(field);
-      } else if (entry.IsInstance()) {
-        // Const object, literal or args descriptor.
-        instance ^= entry.raw();
-        AddConstObject(instance);
-      } else if (entry.IsFunction()) {
-        // Local closure function.
-        target ^= entry.raw();
-        AddFunction(target);
-      } else if (entry.IsCode()) {
-        target_code ^= entry.raw();
-        if (target_code.IsAllocationStubCode()) {
-          cls ^= target_code.owner();
-          AddInstantiatedClass(cls);
-        }
+  if (FLAG_use_bare_instructions) {
+    for (intptr_t i = gop_offset;
+         i < global_object_pool_wrapper()->CurrentLength(); i++) {
+      const auto& wrapper_entry = global_object_pool_wrapper()->EntryAt(i);
+      if (wrapper_entry.type() == ObjectPool::kTaggedObject) {
+        const auto& entry = *wrapper_entry.obj_;
+        AddCalleesOfHelper(entry, &selector, &cls);
+      }
+    }
+  } else {
+    const auto& pool = ObjectPool::Handle(Z, code.object_pool());
+    auto& entry = Object::Handle(Z);
+    for (intptr_t i = 0; i < pool.Length(); i++) {
+      if (pool.TypeAt(i) == ObjectPool::kTaggedObject) {
+        entry = pool.ObjectAt(i);
+        AddCalleesOfHelper(entry, &selector, &cls);
       }
     }
   }
@@ -556,6 +587,53 @@
   }
 }
 
+void Precompiler::AddCalleesOfHelper(const Object& entry,
+                                     String* temp_selector,
+                                     Class* temp_cls) {
+  if (entry.IsICData()) {
+    const auto& call_site = ICData::Cast(entry);
+    // A dynamic call.
+    ASSERT(!call_site.is_static_call());
+    *temp_selector = call_site.target_name();
+    AddSelector(*temp_selector);
+    if (temp_selector->raw() == Symbols::Call().raw()) {
+      // Potential closure call.
+      const Array& arguments_descriptor =
+          Array::Handle(Z, call_site.arguments_descriptor());
+      AddClosureCall(arguments_descriptor);
+    }
+  } else if (entry.IsMegamorphicCache()) {
+    // A dynamic call.
+    const auto& cache = MegamorphicCache::Cast(entry);
+    *temp_selector = cache.target_name();
+    AddSelector(*temp_selector);
+    if (temp_selector->raw() == Symbols::Call().raw()) {
+      // Potential closure call.
+      const Array& arguments_descriptor =
+          Array::Handle(Z, cache.arguments_descriptor());
+      AddClosureCall(arguments_descriptor);
+    }
+  } else if (entry.IsField()) {
+    // Potential need for field initializer.
+    const auto& field = Field::Cast(entry);
+    AddField(field);
+  } else if (entry.IsInstance()) {
+    // Const object, literal or args descriptor.
+    const auto& instance = Instance::Cast(entry);
+    AddConstObject(instance);
+  } else if (entry.IsFunction()) {
+    // Local closure function.
+    const auto& target = Function::Cast(entry);
+    AddFunction(target);
+  } else if (entry.IsCode()) {
+    const auto& target_code = Code::Cast(entry);
+    if (target_code.IsAllocationStubCode()) {
+      *temp_cls ^= target_code.owner();
+      AddInstantiatedClass(*temp_cls);
+    }
+  }
+}
+
 void Precompiler::AddTypesOf(const Class& cls) {
   if (cls.IsNull()) return;
   if (classes_to_retain_.HasKey(&cls)) return;
@@ -573,9 +651,6 @@
   type = cls.super_type();
   AddType(type);
 
-  type = cls.mixin();
-  AddType(type);
-
   if (cls.IsTypedefClass()) {
     AddTypesOf(Function::Handle(Z, cls.signature_function()));
   }
@@ -646,12 +721,6 @@
       const Function& func = Function::Handle(Z, type.signature());
       AddTypesOf(func);
     }
-  } else if (abstype.IsBoundedType()) {
-    AbstractType& type = AbstractType::Handle(Z);
-    type = BoundedType::Cast(abstype).type();
-    AddType(type);
-    type = BoundedType::Cast(abstype).bound();
-    AddType(type);
   } else if (abstype.IsTypeRef()) {
     AbstractType& type = AbstractType::Handle(Z);
     type = TypeRef::Cast(abstype).type();
@@ -679,7 +748,7 @@
   }
 }
 
-void Precompiler::AddConstObject(const Instance& instance) {
+void Precompiler::AddConstObject(const class Instance& instance) {
   // Types and type arguments require special handling.
   if (instance.IsAbstractType()) {
     AddType(AbstractType::Cast(instance));
@@ -777,12 +846,16 @@
         if (FLAG_trace_precompiler) {
           THR_Print("Precompiling initializer for %s\n", field.ToCString());
         }
+        const intptr_t gop_offset =
+            FLAG_use_bare_instructions
+                ? global_object_pool_wrapper()->CurrentLength()
+                : 0;
         ASSERT(Dart::vm_snapshot_kind() != Snapshot::kFullAOT);
         const Function& initializer =
             Function::Handle(Z, CompileStaticInitializer(field));
         ASSERT(!initializer.IsNull());
         field.SetPrecompiledInitializer(initializer);
-        AddCalleesOf(initializer);
+        AddCalleesOf(initializer, gop_offset);
       }
     }
   }
@@ -799,7 +872,7 @@
       kernel::ParseStaticFieldInitializer(zone, field);
 
   DartCompilationPipeline pipeline;
-  PrecompileParsedFunctionHelper helper(/* precompiler = */ NULL,
+  PrecompileParsedFunctionHelper helper(Precompiler::Instance(),
                                         parsed_function,
                                         /* optimized = */ true);
   if (!helper.Compile(&pipeline)) {
@@ -820,94 +893,6 @@
   return parsed_function->function().raw();
 }
 
-RawObject* Precompiler::EvaluateStaticInitializer(const Field& field) {
-  ASSERT(field.is_static());
-  // The VM sets the field's value to transiton_sentinel prior to
-  // evaluating the initializer value.
-  ASSERT(field.StaticValue() == Object::transition_sentinel().raw());
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    // Under precompilation, the initializer may have already been compiled, in
-    // which case use it. Under lazy compilation or early in precompilation, the
-    // initializer has not yet been created, so create it now, but don't bother
-    // remembering it because it won't be used again.
-    Function& initializer = Function::Handle();
-    if (!field.HasPrecompiledInitializer()) {
-      initializer = CompileStaticInitializer(field);
-    } else {
-      initializer ^= field.PrecompiledInitializer();
-    }
-    // Invoke the function to evaluate the expression.
-    return DartEntry::InvokeFunction(initializer, Object::empty_array());
-  } else {
-    Thread* const thread = Thread::Current();
-    StackZone zone(thread);
-    const Error& error = Error::Handle(thread->zone(), thread->sticky_error());
-    thread->clear_sticky_error();
-    return error.raw();
-  }
-  UNREACHABLE();
-  return Object::null();
-}
-
-RawObject* Precompiler::ExecuteOnce(SequenceNode* fragment) {
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    Thread* const thread = Thread::Current();
-
-    // Create a dummy function object for the code generator.
-    // The function needs to be associated with a named Class: the interface
-    // Function fits the bill.
-    const char* kEvalConst = "eval_const";
-    const Function& func = Function::ZoneHandle(Function::New(
-        String::Handle(Symbols::New(thread, kEvalConst)),
-        RawFunction::kRegularFunction,
-        true,   // static function
-        false,  // not const function
-        false,  // not abstract
-        false,  // not external
-        false,  // not native
-        Class::Handle(Type::Handle(Type::DartFunctionType()).type_class()),
-        fragment->token_pos()));
-
-    func.set_result_type(Object::dynamic_type());
-    func.set_num_fixed_parameters(0);
-    func.SetNumOptionalParameters(0, true);
-    // Manually generated AST, do not recompile.
-    func.SetIsOptimizable(false);
-    func.set_is_debuggable(false);
-
-    // We compile the function here, even though InvokeFunction() below
-    // would compile func automatically. We are checking fewer invariants
-    // here.
-    ParsedFunction* parsed_function = new ParsedFunction(thread, func);
-    parsed_function->SetNodeSequence(fragment);
-    fragment->scope()->AddVariable(parsed_function->EnsureExpressionTemp());
-    fragment->scope()->AddVariable(parsed_function->current_context_var());
-    parsed_function->AllocateVariables();
-
-    // Non-optimized code generator.
-    DartCompilationPipeline pipeline;
-    PrecompileParsedFunctionHelper helper(/* precompiler = */ NULL,
-                                          parsed_function,
-                                          /* optimized = */ false);
-    helper.Compile(&pipeline);
-    NOT_IN_PRODUCT(Code::Handle(func.unoptimized_code())
-                       .set_var_descriptors(Object::empty_var_descriptors()));
-
-    const Object& result = PassiveObject::Handle(
-        DartEntry::InvokeFunction(func, Object::empty_array()));
-    return result.raw();
-  } else {
-    Thread* const thread = Thread::Current();
-    const Object& result = PassiveObject::Handle(thread->sticky_error());
-    thread->clear_sticky_error();
-    return result.raw();
-  }
-  UNREACHABLE();
-  return Object::null();
-}
-
 void Precompiler::AddFunction(const Function& function) {
   if (enqueued_functions_.HasKey(&function)) return;
 
@@ -1015,20 +1000,22 @@
     while (it.HasNext()) {
       cls = it.GetNextClass();
 
+      // Check for @pragma on the class itself.
       if (cls.has_pragma()) {
-        // Check for @pragma on the class itself.
         metadata ^= lib.GetMetadata(cls);
         if (metadata_defines_entrypoint() == EntryPointPragma::kAlways) {
           AddInstantiatedClass(cls);
         }
+      }
 
-        // Check for @pragma on any fields in the class.
-        members = cls.fields();
-        implicit_getters = GrowableObjectArray::New(members.Length());
-        implicit_setters = GrowableObjectArray::New(members.Length());
-        implicit_static_getters = GrowableObjectArray::New(members.Length());
-        for (intptr_t k = 0; k < members.Length(); ++k) {
-          field ^= members.At(k);
+      // Check for @pragma on any fields in the class.
+      members = cls.fields();
+      implicit_getters = GrowableObjectArray::New(members.Length());
+      implicit_setters = GrowableObjectArray::New(members.Length());
+      implicit_static_getters = GrowableObjectArray::New(members.Length());
+      for (intptr_t k = 0; k < members.Length(); ++k) {
+        field ^= members.At(k);
+        if (field.has_pragma()) {
           metadata ^= lib.GetMetadata(field);
           if (metadata.IsNull()) continue;
           EntryPointPragma pragma = metadata_defines_entrypoint();
@@ -1304,35 +1291,6 @@
   table.Release();
 }
 
-void Precompiler::TraceConstFunctions() {
-  // Compilation of const accessors happens outside of the treeshakers
-  // queue, so we haven't previously scanned its literal pool.
-
-  Library& lib = Library::Handle(Z);
-  Class& cls = Class::Handle(Z);
-  Array& functions = Array::Handle(Z);
-  Function& function = Function::Handle(Z);
-
-  for (intptr_t i = 0; i < libraries_.Length(); i++) {
-    lib ^= libraries_.At(i);
-    ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
-    while (it.HasNext()) {
-      cls = it.GetNextClass();
-      if (cls.IsDynamicClass()) {
-        continue;  // class 'dynamic' is in the read-only VM isolate.
-      }
-
-      functions = cls.functions();
-      for (intptr_t j = 0; j < functions.Length(); j++) {
-        function ^= functions.At(j);
-        if (function.is_const() && function.HasCode()) {
-          AddCalleesOf(function);
-        }
-      }
-    }
-  }
-}
-
 void Precompiler::TraceForRetainedFunctions() {
   Library& lib = Library::Handle(Z);
   Class& cls = Class::Handle(Z);
@@ -1540,29 +1498,23 @@
   for (intptr_t i = 0; i < types.length(); i++) {
     const AbstractType& type = types.At(i);
 
-    if (!type.IsResolved()) {
-      continue;
-    }
-
     if (type.InVMHeap()) {
       // The only important types in the vm isolate are "dynamic"/"void", which
       // will get their optimized top-type testing stub installed at creation.
       continue;
     }
 
-    if (type.IsResolved() && !type.IsMalformedOrMalbounded()) {
-      if (type_usage_info->IsUsedInTypeTest(type)) {
-        instr = type_testing_stubs.OptimizedCodeForType(type);
-        type.SetTypeTestingStub(instr);
+    if (type_usage_info->IsUsedInTypeTest(type)) {
+      instr = type_testing_stubs.OptimizedCodeForType(type);
+      type.SetTypeTestingStub(instr);
 
-        // Ensure we retain the type.
-        AddType(type);
-      }
+      // Ensure we retain the type.
+      AddType(type);
     }
   }
 
   ASSERT(Object::dynamic_type().type_test_stub_entry_point() !=
-         StubCode::DefaultTypeTest_entry()->EntryPoint());
+         StubCode::DefaultTypeTest().EntryPoint());
 }
 
 void Precompiler::DropTypes() {
@@ -1655,12 +1607,12 @@
 }
 
 void Precompiler::TraceTypesFromRetainedClasses() {
-  Library& lib = Library::Handle(Z);
-  Class& cls = Class::Handle(Z);
-  Array& members = Array::Handle(Z);
-  Array& constants = Array::Handle(Z);
-  GrowableObjectArray& retained_constants = GrowableObjectArray::Handle(Z);
-  Instance& constant = Instance::Handle(Z);
+  auto& lib = Library::Handle(Z);
+  auto& cls = Class::Handle(Z);
+  auto& members = Array::Handle(Z);
+  auto& constants = Array::Handle(Z);
+  auto& retained_constants = GrowableObjectArray::Handle(Z);
+  auto& constant = Instance::Handle(Z);
 
   for (intptr_t i = 0; i < libraries_.Length(); i++) {
     lib ^= libraries_.At(i);
@@ -1949,13 +1901,13 @@
 }
 
 void Precompiler::BindStaticCalls() {
-  class BindStaticCallsVisitor : public FunctionVisitor {
+  class BindAOTStaticCallsVisitor : public FunctionVisitor {
    public:
-    explicit BindStaticCallsVisitor(Zone* zone)
+    explicit BindAOTStaticCallsVisitor(Zone* zone)
         : code_(Code::Handle(zone)),
           table_(Array::Handle(zone)),
-          pc_offset_(Smi::Handle(zone)),
-          target_(Function::Handle(zone)),
+          kind_and_offset_(Smi::Handle(zone)),
+          target_(Object::Handle(zone)),
           target_code_(Code::Handle(zone)) {}
 
     void Visit(const Function& function) {
@@ -1964,43 +1916,53 @@
       }
       code_ = function.CurrentCode();
       table_ = code_.static_calls_target_table();
-
-      for (intptr_t i = 0; i < table_.Length();
-           i += Code::kSCallTableEntryLength) {
-        pc_offset_ ^= table_.At(i + Code::kSCallTableOffsetEntry);
-        target_ ^= table_.At(i + Code::kSCallTableFunctionEntry);
-        if (target_.IsNull()) {
-          target_code_ ^= table_.At(i + Code::kSCallTableCodeEntry);
-          ASSERT(!target_code_.IsNull());
-          ASSERT(!target_code_.IsFunctionCode());
-          // Allocation stub or AllocateContext or AllocateArray or ...
+      StaticCallsTable static_calls(table_);
+      bool only_call_via_code = true;
+      for (auto& view : static_calls) {
+        kind_and_offset_ = view.Get<Code::kSCallTableKindAndOffset>();
+        auto kind = Code::KindField::decode(kind_and_offset_.Value());
+        auto pc_offset = Code::OffsetField::decode(kind_and_offset_.Value());
+        if (kind == Code::kCallViaCode) {
+          target_ = view.Get<Code::kSCallTableFunctionTarget>();
+          if (target_.IsNull()) {
+            target_ = view.Get<Code::kSCallTableCodeTarget>();
+            ASSERT(!Code::Cast(target_).IsFunctionCode());
+            // Allocation stub or AllocateContext or AllocateArray or ...
+          } else {
+            // Static calls initially call the CallStaticFunction stub because
+            // their target might not be compiled yet. After tree shaking, all
+            // static call targets are compiled.
+            // Cf. runtime entry PatchStaticCall called from CallStaticFunction
+            // stub.
+            auto& fun = Function::Cast(target_);
+            ASSERT(fun.HasCode());
+            target_code_ ^= fun.CurrentCode();
+            uword pc = pc_offset + code_.PayloadStart();
+            CodePatcher::PatchStaticCallAt(pc, code_, target_code_);
+          }
         } else {
-          // Static calls initially call the CallStaticFunction stub because
-          // their target might not be compiled yet. After tree shaking, all
-          // static call targets are compiled.
-          // Cf. runtime entry PatchStaticCall called from CallStaticFunction
-          // stub.
-          ASSERT(target_.HasCode());
-          target_code_ ^= target_.CurrentCode();
-          uword pc = pc_offset_.Value() + code_.PayloadStart();
-          CodePatcher::PatchStaticCallAt(pc, code_, target_code_);
+          ASSERT(kind == Code::kPcRelativeCall ||
+                 kind == Code::kPcRelativeTailCall);
+          only_call_via_code = false;
         }
       }
 
       // We won't patch static calls anymore, so drop the static call table to
       // save space.
-      code_.set_static_calls_target_table(Object::empty_array());
+      if (only_call_via_code) {
+        code_.set_static_calls_target_table(Object::empty_array());
+      }
     }
 
    private:
     Code& code_;
     Array& table_;
-    Smi& pc_offset_;
-    Function& target_;
+    Smi& kind_and_offset_;
+    Object& target_;
     Code& target_code_;
   };
 
-  BindStaticCallsVisitor visitor(Z);
+  BindAOTStaticCallsVisitor visitor(Z);
 
   // We need both iterations to ensure we visit all the functions that might end
   // up in the snapshot. The ProgramVisitor will miss closures from duplicated
@@ -2015,6 +1977,7 @@
 }
 
 void Precompiler::SwitchICCalls() {
+  ASSERT(!I->compilation_allowed());
 #if !defined(TARGET_ARCH_DBC)
   // Now that all functions have been compiled, we can switch to an instance
   // call sequence that loads the Code object and entry point directly from
@@ -2022,13 +1985,10 @@
   // array. Iterate all the object pools and rewrite the ic data from
   // (cid, target function, count) to (cid, target code, entry point), and
   // replace the ICCallThroughFunction stub with ICCallThroughCode.
-
-  class SwitchICCallsVisitor : public FunctionVisitor {
+  class ICCallSwitcher {
    public:
-    explicit SwitchICCallsVisitor(Zone* zone)
+    explicit ICCallSwitcher(Zone* zone)
         : zone_(zone),
-          code_(Code::Handle(zone)),
-          pool_(ObjectPool::Handle(zone)),
           entry_(Object::Handle(zone)),
           ic_(ICData::Handle(zone)),
           target_name_(String::Handle(zone)),
@@ -2037,16 +1997,10 @@
           target_code_(Code::Handle(zone)),
           canonical_unlinked_calls_() {}
 
-    void Visit(const Function& function) {
-      if (!function.HasCode()) {
-        return;
-      }
-
-      code_ = function.CurrentCode();
-      pool_ = code_.object_pool();
-      for (intptr_t i = 0; i < pool_.Length(); i++) {
-        if (pool_.TypeAt(i) != ObjectPool::kTaggedObject) continue;
-        entry_ = pool_.ObjectAt(i);
+    void SwitchPool(const ObjectPool& pool) {
+      for (intptr_t i = 0; i < pool.Length(); i++) {
+        if (pool.TypeAt(i) != ObjectPool::kTaggedObject) continue;
+        entry_ = pool.ObjectAt(i);
         if (entry_.IsICData()) {
           // The only IC calls generated by precompilation are for switchable
           // calls.
@@ -2059,11 +2013,10 @@
           args_descriptor_ = ic_.arguments_descriptor();
           unlinked_.set_args_descriptor(args_descriptor_);
           unlinked_ = DedupUnlinkedCall(unlinked_);
-          pool_.SetObjectAt(i, unlinked_);
-        } else if (entry_.raw() ==
-                   StubCode::ICCallThroughFunction_entry()->code()) {
-          target_code_ = StubCode::UnlinkedCall_entry()->code();
-          pool_.SetObjectAt(i, target_code_);
+          pool.SetObjectAt(i, unlinked_);
+        } else if (entry_.raw() == StubCode::ICCallThroughFunction().raw()) {
+          target_code_ = StubCode::UnlinkedCall().raw();
+          pool.SetObjectAt(i, target_code_);
         }
       }
     }
@@ -2082,8 +2035,6 @@
 
    private:
     Zone* zone_;
-    Code& code_;
-    ObjectPool& pool_;
     Object& entry_;
     ICData& ic_;
     String& target_name_;
@@ -2093,18 +2044,46 @@
     UnlinkedCallSet canonical_unlinked_calls_;
   };
 
-  ASSERT(!I->compilation_allowed());
-  SwitchICCallsVisitor visitor(Z);
+  class SwitchICCallsVisitor : public FunctionVisitor {
+   public:
+    SwitchICCallsVisitor(ICCallSwitcher* ic_call_switcher, Zone* zone)
+        : ic_call_switcher_(*ic_call_switcher),
+          code_(Code::Handle(zone)),
+          pool_(ObjectPool::Handle(zone)) {}
 
-  // We need both iterations to ensure we visit all the functions that might end
-  // up in the snapshot. The ProgramVisitor will miss closures from duplicated
-  // finally clauses, and not all functions are compiled through the
-  // tree-shaker's queue
-  ProgramVisitor::VisitFunctions(&visitor);
-  FunctionSet::Iterator it(enqueued_functions_.GetIterator());
-  for (const Function** current = it.Next(); current != NULL;
-       current = it.Next()) {
-    visitor.Visit(**current);
+    void Visit(const Function& function) {
+      if (!function.HasCode()) {
+        return;
+      }
+      code_ = function.CurrentCode();
+      pool_ = code_.object_pool();
+      ic_call_switcher_.SwitchPool(pool_);
+    }
+
+   private:
+    ICCallSwitcher& ic_call_switcher_;
+    Code& code_;
+    ObjectPool& pool_;
+  };
+
+  ICCallSwitcher switcher(Z);
+  auto& gop = ObjectPool::Handle(I->object_store()->global_object_pool());
+  ASSERT(gop.IsNull() != FLAG_use_bare_instructions);
+  if (FLAG_use_bare_instructions) {
+    switcher.SwitchPool(gop);
+  } else {
+    SwitchICCallsVisitor visitor(&switcher, Z);
+
+    // We need both iterations to ensure we visit all the functions that might
+    // end up in the snapshot. The ProgramVisitor will miss closures from
+    // duplicated finally clauses, and not all functions are compiled through
+    // the tree-shaker's queue
+    ProgramVisitor::VisitFunctions(&visitor);
+    FunctionSet::Iterator it(enqueued_functions_.GetIterator());
+    for (const Function** current = it.Next(); current != NULL;
+         current = it.Next()) {
+      visitor.Visit(**current);
+    }
   }
 #endif
 }
@@ -2231,8 +2210,12 @@
       Array::Handle(zone, graph_compiler->CreateDeoptInfo(assembler));
   // Allocates instruction object. Since this occurs only at safepoint,
   // there can be no concurrent access to the instruction page.
-  const Code& code = Code::Handle(Code::FinalizeCode(
-      function, graph_compiler, assembler, optimized(), stats));
+  const auto pool_attachment = FLAG_use_bare_instructions
+                                   ? Code::PoolAttachment::kNotAttachPool
+                                   : Code::PoolAttachment::kAttachPool;
+  const Code& code =
+      Code::Handle(Code::FinalizeCode(function, graph_compiler, assembler,
+                                      pool_attachment, optimized(), stats));
   code.set_is_optimized(optimized());
   code.set_owner(function);
   if (!function.IsOptimizable()) {
@@ -2325,8 +2308,12 @@
         FlowGraphPrinter::PrintGraph("Unoptimized Compilation", flow_graph);
       }
 
+      BlockScheduler block_scheduler(flow_graph);
       CompilerPassState pass_state(thread(), flow_graph, &speculative_policy,
                                    precompiler_);
+      pass_state.block_scheduler = &block_scheduler;
+      pass_state.reorder_blocks =
+          FlowGraph::ShouldReorderBlocks(function, optimized());
       NOT_IN_PRODUCT(pass_state.compiler_timeline = compiler_timeline);
 
       if (optimized()) {
@@ -2355,8 +2342,14 @@
       ASSERT(pass_state.inline_id_to_function.length() ==
              pass_state.caller_inline_id.length());
 
+      ASSERT(!FLAG_use_bare_instructions || precompiler_ != nullptr);
+
       ObjectPoolWrapper object_pool;
-      Assembler assembler(&object_pool, use_far_branches);
+      ObjectPoolWrapper* active_object_pool_wrapper =
+          FLAG_use_bare_instructions
+              ? precompiler_->global_object_pool_wrapper()
+              : &object_pool;
+      Assembler assembler(active_object_pool_wrapper, use_far_branches);
 
       CodeStatistics* function_stats = NULL;
       if (FLAG_print_instruction_stats) {
@@ -2391,7 +2384,7 @@
       done = true;
     } else {
       // We bailed out or we encountered an error.
-      const Error& error = Error::Handle(thread()->sticky_error());
+      const Error& error = Error::Handle(thread()->StealStickyError());
 
       if (error.raw() == Object::branch_offset_error().raw()) {
         // Compilation failed due to an out of range branch offset in the
@@ -2423,10 +2416,12 @@
         done = true;
       }
 
-      // Clear the error if it was not a real error, but just a bailout.
       if (error.IsLanguageError() &&
           (LanguageError::Cast(error).kind() == Report::kBailout)) {
-        thread()->clear_sticky_error();
+        // Discard the error if it was not a real error, but just a bailout.
+      } else {
+        // Otherwise, continue propagating.
+        thread()->set_sticky_error(error);
       }
       is_compiled = false;
     }
@@ -2469,11 +2464,8 @@
                                           optimized);
     const bool success = helper.Compile(pipeline);
     if (!success) {
-      // Encountered error.
-      Error& error = Error::Handle();
       // We got an error during compilation.
-      error = thread->sticky_error();
-      thread->clear_sticky_error();
+      const Error& error = Error::Handle(thread->StealStickyError());
       ASSERT(error.IsLanguageError() &&
              LanguageError::Cast(error).kind() != Report::kBailout);
       return error.raw();
@@ -2501,10 +2493,8 @@
   } else {
     Thread* const thread = Thread::Current();
     StackZone stack_zone(thread);
-    Error& error = Error::Handle();
     // We got an error during compilation.
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
+    const Error& error = Error::Handle(thread->StealStickyError());
     // Precompilation may encounter compile-time errors.
     // Do not attempt to optimize functions that can cause errors.
     function.set_is_optimizable(false);
@@ -2615,7 +2605,7 @@
 // TODO(dartbug.com/30524) instead call to Obfuscator::Rename from a place
 // where these are looked up.
 #define PREVENT_RENAMING(class_name, function_name, recognized_enum,           \
-                         result_type, fingerprint)                             \
+                         fingerprint)                                          \
   do {                                                                         \
     PreventRenaming(#class_name);                                              \
     PreventRenaming(#function_name);                                           \
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index a884b26..9454afc 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_COMPILER_AOT_PRECOMPILER_H_
 
 #include "vm/allocation.h"
+#include "vm/compiler/assembler/assembler.h"
 #include "vm/hash_map.h"
 #include "vm/hash_table.h"
 #include "vm/object.h"
@@ -239,9 +240,6 @@
                                    Zone* zone,
                                    const Function& function);
 
-  static RawObject* EvaluateStaticInitializer(const Field& field);
-  static RawObject* ExecuteOnce(SequenceNode* fragment);
-
   static RawFunction* CompileStaticInitializer(const Field& field);
 
   // Returns true if get:runtimeType is not overloaded by any class.
@@ -249,8 +247,18 @@
     return get_runtime_type_is_unique_;
   }
 
+  ObjectPoolWrapper* global_object_pool_wrapper() {
+    ASSERT(FLAG_use_bare_instructions);
+    return &global_object_pool_wrapper_;
+  }
+
+  static Precompiler* Instance() { return singleton_; }
+
  private:
+  static Precompiler* singleton_;
+
   explicit Precompiler(Thread* thread);
+  ~Precompiler();
 
   void DoCompileAll();
   void AddRoots();
@@ -261,8 +269,11 @@
   void AddTypesOf(const Class& cls);
   void AddTypesOf(const Function& function);
   void AddTypeArguments(const TypeArguments& args);
-  void AddCalleesOf(const Function& function);
-  void AddConstObject(const Instance& instance);
+  void AddCalleesOf(const Function& function, intptr_t gop_offset);
+  void AddCalleesOfHelper(const Object& entry,
+                          String* temp_selector,
+                          Class* temp_cls);
+  void AddConstObject(const class Instance& instance);
   void AddClosureCall(const Array& arguments_descriptor);
   void AddField(const Field& field);
   void AddFunction(const Function& function);
@@ -272,7 +283,6 @@
 
   void ProcessFunction(const Function& function);
   void CheckForNewDynamicFunctions();
-  void TraceConstFunctions();
   void CollectCallbackFields();
 
   void AttachOptimizedTypeTestingStub();
@@ -321,6 +331,7 @@
   intptr_t dropped_type_count_;
   intptr_t dropped_library_count_;
 
+  ObjectPoolWrapper global_object_pool_wrapper_;
   GrowableObjectArray& libraries_;
   const GrowableObjectArray& pending_functions_;
   SymbolSet sent_selectors_;
diff --git a/runtime/vm/compiler/assembler/assembler.cc b/runtime/vm/compiler/assembler/assembler.cc
index 8c94874..f945e3f 100644
--- a/runtime/vm/compiler/assembler/assembler.cc
+++ b/runtime/vm/compiler/assembler/assembler.cc
@@ -173,7 +173,7 @@
 }
 
 // Shared macros are implemented here.
-void Assembler::Unimplemented(const char* message) {
+void AssemblerBase::Unimplemented(const char* message) {
   const char* format = "Unimplemented: %s";
   const intptr_t len = Utils::SNPrint(NULL, 0, format, message);
   char* buffer = reinterpret_cast<char*>(malloc(len + 1));
@@ -181,7 +181,7 @@
   Stop(buffer);
 }
 
-void Assembler::Untested(const char* message) {
+void AssemblerBase::Untested(const char* message) {
   const char* format = "Untested: %s";
   const intptr_t len = Utils::SNPrint(NULL, 0, format, message);
   char* buffer = reinterpret_cast<char*>(malloc(len + 1));
@@ -189,7 +189,7 @@
   Stop(buffer);
 }
 
-void Assembler::Unreachable(const char* message) {
+void AssemblerBase::Unreachable(const char* message) {
   const char* format = "Unreachable: %s";
   const intptr_t len = Utils::SNPrint(NULL, 0, format, message);
   char* buffer = reinterpret_cast<char*>(malloc(len + 1));
@@ -197,7 +197,7 @@
   Stop(buffer);
 }
 
-void Assembler::Comment(const char* format, ...) {
+void AssemblerBase::Comment(const char* format, ...) {
   if (EmittingComments()) {
     char buffer[1024];
 
@@ -212,11 +212,11 @@
   }
 }
 
-bool Assembler::EmittingComments() {
+bool AssemblerBase::EmittingComments() {
   return FLAG_code_comments || FLAG_disassemble || FLAG_disassemble_optimized;
 }
 
-const Code::Comments& Assembler::GetCodeComments() const {
+const Code::Comments& AssemblerBase::GetCodeComments() const {
   Code::Comments& comments = Code::Comments::New(comments_.length());
 
   for (intptr_t i = 0; i < comments_.length(); i++) {
@@ -227,6 +227,70 @@
   return comments;
 }
 
+intptr_t ObjIndexPair::Hashcode(Key key) {
+  if (key.type() != ObjectPool::kTaggedObject) {
+    return key.raw_value_;
+  }
+  if (key.obj_->IsNull()) {
+    return 2011;
+  }
+  if (key.obj_->IsString() || key.obj_->IsNumber()) {
+    return Instance::Cast(*key.obj_).CanonicalizeHash();
+  }
+  if (key.obj_->IsCode()) {
+    // Instructions don't move during compaction.
+    return Code::Cast(*key.obj_).PayloadStart();
+  }
+  if (key.obj_->IsFunction()) {
+    return Function::Cast(*key.obj_).Hash();
+  }
+  if (key.obj_->IsField()) {
+    return String::HashRawSymbol(Field::Cast(*key.obj_).name());
+  }
+  // Unlikely.
+  return key.obj_->GetClassId();
+}
+void ObjectPoolWrapper::Reset() {
+  // Null out the handles we've accumulated.
+  for (intptr_t i = 0; i < object_pool_.length(); ++i) {
+    if (object_pool_[i].type() == ObjectPool::kTaggedObject) {
+      *const_cast<Object*>(object_pool_[i].obj_) = Object::null();
+      *const_cast<Object*>(object_pool_[i].equivalence_) = Object::null();
+    }
+  }
+
+  object_pool_.Clear();
+  object_pool_index_table_.Clear();
+}
+
+void ObjectPoolWrapper::InitializeFrom(const ObjectPool& other) {
+  ASSERT(object_pool_.length() == 0);
+
+  for (intptr_t i = 0; i < other.Length(); i++) {
+    auto type = other.TypeAt(i);
+    auto patchable = other.PatchableAt(i);
+    switch (type) {
+      case ObjectPool::kTaggedObject: {
+        ObjectPoolWrapperEntry entry(&Object::ZoneHandle(other.ObjectAt(i)),
+                                     patchable);
+        AddObject(entry);
+        break;
+      }
+      case ObjectPool::kImmediate:
+      case ObjectPool::kNativeFunction:
+      case ObjectPool::kNativeFunctionWrapper: {
+        ObjectPoolWrapperEntry entry(other.RawValueAt(i), type, patchable);
+        AddObject(entry);
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  }
+
+  ASSERT(CurrentLength() == other.Length());
+}
+
 intptr_t ObjectPoolWrapper::AddObject(const Object& obj,
                                       ObjectPool::Patchability patchable) {
   ASSERT(obj.IsNotTemporaryScopedHandle());
@@ -243,6 +307,19 @@
          (entry.obj_->IsNotTemporaryScopedHandle() &&
           (entry.equivalence_ == NULL ||
            entry.equivalence_->IsNotTemporaryScopedHandle())));
+
+  if (entry.type() == ObjectPool::kTaggedObject) {
+    // If the owner of the object pool wrapper specified a specific zone we
+    // shoulld use we'll do so.
+    if (zone_ != NULL) {
+      entry.obj_ = &Object::ZoneHandle(zone_, entry.obj_->raw());
+      if (entry.equivalence_ != NULL) {
+        entry.equivalence_ =
+            &Object::ZoneHandle(zone_, entry.equivalence_->raw());
+      }
+    }
+  }
+
   object_pool_.Add(entry);
   if (entry.patchable() == ObjectPool::kNotPatchable) {
     // The object isn't patchable. Record the index for fast lookup.
diff --git a/runtime/vm/compiler/assembler/assembler.h b/runtime/vm/compiler/assembler/assembler.h
index 90d106d..2ecb376 100644
--- a/runtime/vm/compiler/assembler/assembler.h
+++ b/runtime/vm/compiler/assembler/assembler.h
@@ -11,6 +11,7 @@
 #include "vm/growable_array.h"
 #include "vm/hash_map.h"
 #include "vm/object.h"
+#include "vm/thread.h"
 
 namespace dart {
 
@@ -352,20 +353,7 @@
 
   static Value ValueOf(Pair kv) { return kv.value_; }
 
-  static intptr_t Hashcode(Key key) {
-    if (key.type() != ObjectPool::kTaggedObject) {
-      return key.raw_value_;
-    }
-    if (key.obj_->IsSmi()) {
-      return Smi::Cast(*key.obj_).Value();
-    }
-    // TODO(asiva) For now we assert that the object is from Old space
-    // and use the address of the raw object, once the weak_entry_table code
-    // in heap allows for multiple thread access we should switch this code
-    // to create a temporary raw obj => id mapping and use that.
-    ASSERT(key.obj_->IsOld());
-    return reinterpret_cast<intptr_t>(key.obj_->raw());
-  }
+  static intptr_t Hashcode(Key key);
 
   static inline bool IsKeyEqual(Pair kv, Key key) {
     if (kv.key_.entry_bits_ != key.entry_bits_) return false;
@@ -383,10 +371,40 @@
 
 class ObjectPoolWrapper : public ValueObject {
  public:
+  ObjectPoolWrapper() : zone_(nullptr) {}
+  ~ObjectPoolWrapper() {
+    if (zone_ != nullptr) {
+      Reset();
+      zone_ = nullptr;
+    }
+  }
+
+  // Clears all existing entries in this object pool builder.
+  //
+  // Note: Any code which has been compiled via this builder might use offsets
+  // into the pool which are not correct anymore.
+  void Reset();
+
+  // Initializes this object pool builder from [other].
+  //
+  // All entries from [other] will be populated, including their
+  // kind/patchability bits.
+  void InitializeFrom(const ObjectPool& other);
+
+  // Initialize this object pool builder with a [zone].
+  //
+  // Any objects added later on will be referenced using handles from [zone].
+  void InitializeWithZone(Zone* zone) {
+    ASSERT(object_pool_.length() == 0);
+    ASSERT(zone_ == nullptr && zone != nullptr);
+    zone_ = zone;
+  }
+
   intptr_t AddObject(
       const Object& obj,
       ObjectPool::Patchability patchable = ObjectPool::kNotPatchable);
   intptr_t AddImmediate(uword imm);
+
   intptr_t FindObject(
       const Object& obj,
       ObjectPool::Patchability patchable = ObjectPool::kNotPatchable);
@@ -399,6 +417,9 @@
 
   RawObjectPool* MakeObjectPool();
 
+  intptr_t CurrentLength() { return object_pool_.length(); }
+  ObjectPoolWrapperEntry& EntryAt(intptr_t i) { return object_pool_[i]; }
+
  private:
   intptr_t AddObject(ObjectPoolWrapperEntry entry);
   intptr_t FindObject(ObjectPoolWrapperEntry entry);
@@ -408,10 +429,86 @@
 
   // Hashmap for fast lookup in object pool.
   DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
+
+  // The zone used for allocating the handles we keep in the map and array (or
+  // NULL, in which case allocations happen using the zone active at the point
+  // of insertion).
+  Zone* zone_;
 };
 
 enum RestorePP { kRestoreCallerPP, kKeepCalleePP };
 
+class AssemblerBase : public ValueObject {
+ public:
+  explicit AssemblerBase(ObjectPoolWrapper* object_pool_wrapper)
+      : prologue_offset_(-1),
+        has_single_entry_point_(true),
+        object_pool_wrapper_(object_pool_wrapper) {}
+  virtual ~AssemblerBase() {}
+
+  intptr_t CodeSize() const { return buffer_.Size(); }
+
+  uword CodeAddress(intptr_t offset) { return buffer_.Address(offset); }
+
+  ObjectPoolWrapper& object_pool_wrapper() { return *object_pool_wrapper_; }
+
+  intptr_t prologue_offset() const { return prologue_offset_; }
+  bool has_single_entry_point() const { return has_single_entry_point_; }
+
+  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
+  static bool EmittingComments();
+
+  const Code::Comments& GetCodeComments() const;
+
+  void Unimplemented(const char* message);
+  void Untested(const char* message);
+  void Unreachable(const char* message);
+  virtual void Stop(const char* message) = 0;
+
+  void FinalizeInstructions(const MemoryRegion& region) {
+    buffer_.FinalizeInstructions(region);
+  }
+
+  // Count the fixups that produce a pointer offset, without processing
+  // the fixups.
+  intptr_t CountPointerOffsets() const { return buffer_.CountPointerOffsets(); }
+
+  const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
+    return buffer_.pointer_offsets();
+  }
+
+  RawObjectPool* MakeObjectPool() {
+    if (object_pool_wrapper_ != nullptr) {
+      return object_pool_wrapper_->MakeObjectPool();
+    }
+    return ObjectPool::null();
+  }
+
+ protected:
+  AssemblerBuffer buffer_;  // Contains position independent code.
+  int32_t prologue_offset_;
+  bool has_single_entry_point_;
+
+ private:
+  class CodeComment : public ZoneAllocated {
+   public:
+    CodeComment(intptr_t pc_offset, const String& comment)
+        : pc_offset_(pc_offset), comment_(comment) {}
+
+    intptr_t pc_offset() const { return pc_offset_; }
+    const String& comment() const { return comment_; }
+
+   private:
+    intptr_t pc_offset_;
+    const String& comment_;
+
+    DISALLOW_COPY_AND_ASSIGN(CodeComment);
+  };
+
+  GrowableArray<CodeComment*> comments_;
+  ObjectPoolWrapper* object_pool_wrapper_;
+};
+
 }  // namespace dart
 
 #if defined(TARGET_ARCH_IA32)
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index e35c3c1..53de88b 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -24,6 +24,7 @@
 
 DECLARE_FLAG(bool, check_code_pointer);
 DECLARE_FLAG(bool, inline_alloc);
+DECLARE_FLAG(bool, precompiled_mode);
 
 uint32_t Address::encoding3() const {
   if (kind_ == Immediate) {
@@ -1591,8 +1592,6 @@
   ASSERT(object != value);
   ASSERT(object != LR);
   ASSERT(value != LR);
-
-#if defined(CONCURRENT_MARKING)
   ASSERT(object != TMP);
   ASSERT(value != TMP);
 
@@ -1645,31 +1644,55 @@
   }
   if (!lr_reserved) Pop(LR);
   Bind(&done);
-#else
-  str(value, dest);
-  // A store buffer update is required.
-  if (lr_reserved) {
-    StoreIntoObjectFilter(object, value, nullptr, can_be_smi, kNoJump);
-    ldr(LR, Address(THR, Thread::write_barrier_wrappers_offset(object)), NE);
-    blx(LR, NE);
-  } else {
-    Label done;
-    StoreIntoObjectFilter(object, value, &done, can_be_smi, kJumpToNoUpdate);
-    RegList regs = 0;
-    regs |= (1 << LR);
-    if (value != kWriteBarrierObjectReg) {
-      regs |= (1 << kWriteBarrierObjectReg);
-    }
-    PushList(regs);
-    if (object != kWriteBarrierObjectReg) {
-      mov(kWriteBarrierObjectReg, Operand(object));
-    }
-    ldr(LR, Address(THR, Thread::write_barrier_entry_point_offset()));
-    blx(LR);
-    PopList(regs);
-    Bind(&done);
+}
+
+void Assembler::StoreIntoArray(Register object,
+                               Register slot,
+                               Register value,
+                               CanBeSmi can_be_smi,
+                               bool lr_reserved) {
+  // x.slot = x. Barrier should have be removed at the IL level.
+  ASSERT(object != value);
+  ASSERT(object != LR);
+  ASSERT(value != LR);
+  ASSERT(slot != LR);
+  ASSERT(object != TMP);
+  ASSERT(value != TMP);
+  ASSERT(slot != TMP);
+
+  str(value, Address(slot, 0));
+
+  // In parallel, test whether
+  //  - object is old and not remembered and value is new, or
+  //  - object is old and value is old and not marked and concurrent marking is
+  //    in progress
+  // If so, call the WriteBarrier stub, which will either add object to the
+  // store buffer (case 1) or add value to the marking stack (case 2).
+  // Compare RawObject::StorePointer.
+  Label done;
+  if (can_be_smi == kValueCanBeSmi) {
+    BranchIfSmi(value, &done);
   }
-#endif
+  if (!lr_reserved) Push(LR);
+  ldrb(TMP, FieldAddress(object, Object::tags_offset()));
+  ldrb(LR, FieldAddress(value, Object::tags_offset()));
+  and_(TMP, LR, Operand(TMP, LSR, RawObject::kBarrierOverlapShift));
+  ldr(LR, Address(THR, Thread::write_barrier_mask_offset()));
+  tst(TMP, Operand(LR));
+
+  if ((object != kWriteBarrierObjectReg) || (value != kWriteBarrierValueReg) ||
+      (slot != kWriteBarrierSlotReg)) {
+    // Spill and shuffle unimplemented. Currently StoreIntoArray is only used
+    // from StoreIndexInstr, which gets these exact registers from the register
+    // allocator.
+    UNIMPLEMENTED();
+  }
+
+  ldr(LR, Address(THR, Thread::array_write_barrier_entry_point_offset()), NE);
+  blx(LR, NE);
+
+  if (!lr_reserved) Pop(LR);
+  Bind(&done);
 }
 
 void Assembler::StoreIntoObjectOffset(Register object,
@@ -2500,13 +2523,12 @@
   vmulqs(qd, qn, qd);
 }
 
-void Assembler::Branch(const StubEntry& stub_entry,
+void Assembler::Branch(const Code& target,
                        ObjectPool::Patchability patchable,
                        Register pp,
                        Condition cond) {
-  const Code& target_code = Code::ZoneHandle(stub_entry.code());
   const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper().FindObject(target_code, patchable));
+      object_pool_wrapper().FindObject(target, patchable));
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, pp, cond);
   Branch(FieldAddress(CODE_REG, Code::entry_point_offset()), cond);
 }
@@ -2529,12 +2551,6 @@
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
 
-void Assembler::BranchLink(const StubEntry& stub_entry,
-                           ObjectPool::Patchability patchable) {
-  const Code& code = Code::ZoneHandle(stub_entry.code());
-  BranchLink(code, patchable);
-}
-
 void Assembler::BranchLinkPatchable(const Code& target,
                                     Code::EntryKind entry_kind) {
   BranchLink(target, ObjectPool::kPatchable, entry_kind);
@@ -2554,10 +2570,9 @@
   blx(LR);
 }
 
-void Assembler::BranchLinkWithEquivalence(const StubEntry& stub_entry,
+void Assembler::BranchLinkWithEquivalence(const Code& target,
                                           const Object& equivalence,
                                           Code::EntryKind entry_kind) {
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   // Make sure that class CallPattern is able to patch the label referred
   // to by this code sequence.
   // For added code robustness, use 'blx lr' in a patchable sequence and
@@ -2574,11 +2589,6 @@
   blx(LR);  // Use blx instruction so that the return branch prediction works.
 }
 
-void Assembler::BranchLinkPatchable(const StubEntry& stub_entry,
-                                    Code::EntryKind entry_kind) {
-  BranchLinkPatchable(Code::ZoneHandle(stub_entry.code()), entry_kind);
-}
-
 void Assembler::BranchLinkOffset(Register base, int32_t offset) {
   ASSERT(base != PC);
   ASSERT(base != IP);
@@ -3153,10 +3163,16 @@
   COMPILE_ASSERT(PP < CODE_REG);
   COMPILE_ASSERT(CODE_REG < FP);
   COMPILE_ASSERT(FP < LR);
-  EnterFrame((1 << PP) | (1 << CODE_REG) | (1 << FP) | (1 << LR), 0);
 
-  // Setup pool pointer for this dart function.
-  LoadPoolPointer();
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    EnterFrame((1 << PP) | (1 << CODE_REG) | (1 << FP) | (1 << LR), 0);
+
+    // Setup pool pointer for this dart function.
+    LoadPoolPointer();
+  } else {
+    EnterFrame((1 << FP) | (1 << LR), 0);
+  }
+  set_constant_pool_allowed(true);
 
   // Reserve space for locals.
   AddImmediate(SP, -frame_size);
@@ -3177,8 +3193,10 @@
 }
 
 void Assembler::LeaveDartFrame() {
-  ldr(PP,
-      Address(FP, compiler_frame_layout.saved_caller_pp_from_fp * kWordSize));
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    ldr(PP,
+        Address(FP, compiler_frame_layout.saved_caller_pp_from_fp * kWordSize));
+  }
   set_constant_pool_allowed(false);
 
   // This will implicitly drop saved PP, PC marker due to restoring SP from FP
@@ -3187,8 +3205,10 @@
 }
 
 void Assembler::LeaveDartFrameAndReturn() {
-  ldr(PP,
-      Address(FP, compiler_frame_layout.saved_caller_pp_from_fp * kWordSize));
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    ldr(PP,
+        Address(FP, compiler_frame_layout.saved_caller_pp_from_fp * kWordSize));
+  }
   set_constant_pool_allowed(false);
 
   // This will implicitly drop saved PP, PC marker due to restoring SP from FP
@@ -3207,21 +3227,21 @@
 // R0 receiver, R9 guarded cid as Smi.
 // Preserve R4 (ARGS_DESC_REG), not required today, but maybe later.
 void Assembler::MonomorphicCheckedEntry() {
-  ASSERT(has_single_entry_point_);
   has_single_entry_point_ = false;
 #if defined(TESTING) || defined(DEBUG)
   bool saved_use_far_branches = use_far_branches();
   set_use_far_branches(false);
 #endif
+  intptr_t start = CodeSize();
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() == Instructions::kCheckedEntryOffset);
+  ASSERT(CodeSize() - start == Instructions::kPolymorphicEntryOffset);
   LoadClassIdMayBeSmi(IP, R0);
   cmp(R9, Operand(IP, LSL, 1));
   Branch(Address(THR, Thread::monomorphic_miss_entry_offset()), NE);
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() == Instructions::kUncheckedEntryOffset);
+  ASSERT(CodeSize() - start == Instructions::kMonomorphicEntryOffset);
 
 #if defined(TESTING) || defined(DEBUG)
   set_use_far_branches(saved_use_far_branches);
@@ -3386,12 +3406,18 @@
   }
 }
 
+void Assembler::GenerateUnRelocatedPcRelativeCall() {
+  // Emit "blr <offset>".
+  EmitType5(AL, 0x686868, /*link=*/true);
+}
+
 void Assembler::Stop(const char* message) {
   if (FLAG_print_stop_message) {
     PushList((1 << R0) | (1 << IP) | (1 << LR));  // Preserve R0, IP, LR.
     LoadImmediate(R0, reinterpret_cast<int32_t>(message));
     // PrintStopMessage() preserves all registers.
-    BranchLink(&StubCode::PrintStopMessage_entry()->label());
+    ExternalLabel label(StubCode::PrintStopMessage().EntryPoint());
+    BranchLink(&label);
     PopList((1 << R0) | (1 << IP) | (1 << LR));  // Restore R0, IP, LR.
   }
   bkpt(Instr::kStopMessageCode);
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 93da8c4..b4c35c9 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -21,7 +21,6 @@
 
 // Forward declarations.
 class RuntimeEntry;
-class StubEntry;
 class RegisterSet;
 
 // Instruction encoding bits.
@@ -336,16 +335,12 @@
   }
 };
 
-class Assembler : public ValueObject {
+class Assembler : public AssemblerBase {
  public:
   explicit Assembler(ObjectPoolWrapper* object_pool_wrapper,
                      bool use_far_branches = false)
-      : buffer_(),
-        object_pool_wrapper_(object_pool_wrapper),
-        prologue_offset_(-1),
-        has_single_entry_point_(true),
+      : AssemblerBase(object_pool_wrapper),
         use_far_branches_(use_far_branches),
-        comments_(),
         constant_pool_allowed_(false) {}
 
   ~Assembler() {}
@@ -364,25 +359,6 @@
   }
 
   // Misc. functionality
-  intptr_t CodeSize() const { return buffer_.Size(); }
-  intptr_t prologue_offset() const { return prologue_offset_; }
-  bool has_single_entry_point() const { return has_single_entry_point_; }
-
-  // Count the fixups that produce a pointer offset, without processing
-  // the fixups.  On ARM there are no pointers in code.
-  intptr_t CountPointerOffsets() const { return 0; }
-
-  const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
-    ASSERT(buffer_.pointer_offsets().length() == 0);  // No pointers in code.
-    return buffer_.pointer_offsets();
-  }
-
-  ObjectPoolWrapper& object_pool_wrapper() { return *object_pool_wrapper_; }
-
-  RawObjectPool* MakeObjectPool() {
-    return object_pool_wrapper_->MakeObjectPool();
-  }
-
   bool use_far_branches() const {
     return FLAG_use_far_branches || use_far_branches_;
   }
@@ -393,24 +369,12 @@
   void set_use_far_branches(bool b) { use_far_branches_ = b; }
 #endif  // TESTING || DEBUG
 
-  void FinalizeInstructions(const MemoryRegion& region) {
-    buffer_.FinalizeInstructions(region);
-  }
-
   // Debugging and bringup support.
   void Breakpoint() { bkpt(0); }
-  void Stop(const char* message);
-  void Unimplemented(const char* message);
-  void Untested(const char* message);
-  void Unreachable(const char* message);
+  void Stop(const char* message) override;
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
-  static bool EmittingComments();
-
-  const Code::Comments& GetCodeComments() const;
-
   static const char* RegisterName(Register reg);
 
   static const char* FpuRegisterName(FpuRegister reg);
@@ -691,7 +655,7 @@
   void bx(Register rm, Condition cond = AL);
   void blx(Register rm, Condition cond = AL);
 
-  void Branch(const StubEntry& stub_entry,
+  void Branch(const Code& code,
               ObjectPool::Patchability patchable = ObjectPool::kNotPatchable,
               Register pp = PP,
               Condition cond = AL);
@@ -699,28 +663,22 @@
   void Branch(const Address& address, Condition cond = AL);
 
   void BranchLink(
-      const StubEntry& stub_entry,
-      ObjectPool::Patchability patchable = ObjectPool::kNotPatchable);
-  void BranchLink(const Code& code,
-                  ObjectPool::Patchability patchable,
-                  Code::EntryKind entry_kind = Code::EntryKind::kNormal);
+      const Code& code,
+      ObjectPool::Patchability patchable = ObjectPool::kNotPatchable,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
   void BranchLinkToRuntime();
 
   void CallNullErrorShared(bool save_fpu_registers);
 
   // Branch and link to an entry address. Call sequence can be patched.
   void BranchLinkPatchable(
-      const StubEntry& stub_entry,
-      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
-
-  void BranchLinkPatchable(
       const Code& code,
       Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   // Emit a call that shares its object pool entries with other calls
   // that have the same equivalence marker.
   void BranchLinkWithEquivalence(
-      const StubEntry& stub_entry,
+      const Code& code,
       const Object& equivalence,
       Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
@@ -818,6 +776,11 @@
                        Register value,       // Value we are storing.
                        CanBeSmi can_value_be_smi = kValueCanBeSmi,
                        bool lr_reserved = false);
+  void StoreIntoArray(Register object,
+                      Register slot,
+                      Register value,
+                      CanBeSmi can_value_be_smi = kValueCanBeSmi,
+                      bool lr_reserved = false);
   void StoreIntoObjectOffset(Register object,
                              int32_t offset,
                              Register value,
@@ -1132,6 +1095,19 @@
                         Register temp1,
                         Register temp2);
 
+  // This emits an PC-relative call of the form "blr <offset>".  The offset
+  // is not yet known and needs therefore relocation to the right place before
+  // the code can be used.
+  //
+  // The neccessary information for the "linker" (i.e. the relocation
+  // information) is stored in [RawCode::static_calls_target_table_]: an entry
+  // of the form
+  //
+  //   (Code::kPcRelativeCall & pc_offset, <target-code>, <target-function>)
+  //
+  // will be used during relocation to fix the offset.
+  void GenerateUnRelocatedPcRelativeCall();
+
   // Emit data (e.g encoded instruction or immediate) in instruction stream.
   void Emit(int32_t value);
 
@@ -1160,10 +1136,6 @@
   static int32_t DecodeBranchOffset(int32_t inst);
 
  private:
-  AssemblerBuffer buffer_;  // Contains position independent code.
-  ObjectPoolWrapper* object_pool_wrapper_;
-  int32_t prologue_offset_;
-  bool has_single_entry_point_;
   bool use_far_branches_;
 
   // If you are thinking of using one or both of these instructions directly,
@@ -1176,23 +1148,6 @@
 
   void BranchLink(const ExternalLabel* label);
 
-  class CodeComment : public ZoneAllocated {
-   public:
-    CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) {}
-
-    intptr_t pc_offset() const { return pc_offset_; }
-    const String& comment() const { return comment_; }
-
-   private:
-    intptr_t pc_offset_;
-    const String& comment_;
-
-    DISALLOW_COPY_AND_ASSIGN(CodeComment);
-  };
-
-  GrowableArray<CodeComment*> comments_;
-
   bool constant_pool_allowed_;
 
   void LoadObjectHelper(Register rd,
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index c258d9a..4fb6ef4 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -18,17 +18,14 @@
 
 DECLARE_FLAG(bool, check_code_pointer);
 DECLARE_FLAG(bool, inline_alloc);
+DECLARE_FLAG(bool, precompiled_mode);
 
 DEFINE_FLAG(bool, use_far_branches, false, "Always use far branches");
 
 Assembler::Assembler(ObjectPoolWrapper* object_pool_wrapper,
                      bool use_far_branches)
-    : buffer_(),
-      object_pool_wrapper_(object_pool_wrapper),
-      prologue_offset_(-1),
-      has_single_entry_point_(true),
+    : AssemblerBase(object_pool_wrapper),
       use_far_branches_(use_far_branches),
-      comments_(),
       constant_pool_allowed_(false) {}
 
 void Assembler::InitializeMemoryWithBreakpoints(uword data, intptr_t length) {
@@ -630,10 +627,9 @@
   }
 }
 
-void Assembler::Branch(const StubEntry& stub_entry,
+void Assembler::Branch(const Code& target,
                        Register pp,
                        ObjectPool::Patchability patchable) {
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   const int32_t offset = ObjectPool::element_offset(
       object_pool_wrapper().FindObject(target, patchable));
   LoadWordFromPoolOffset(CODE_REG, offset, pp);
@@ -641,13 +637,12 @@
   br(TMP);
 }
 
-void Assembler::BranchPatchable(const StubEntry& stub_entry) {
-  Branch(stub_entry, PP, ObjectPool::kPatchable);
+void Assembler::BranchPatchable(const Code& code) {
+  Branch(code, PP, ObjectPool::kPatchable);
 }
 
-void Assembler::BranchLink(const StubEntry& stub_entry,
+void Assembler::BranchLink(const Code& target,
                            ObjectPool::Patchability patchable) {
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   const int32_t offset = ObjectPool::element_offset(
       object_pool_wrapper().FindObject(target, patchable));
   LoadWordFromPoolOffset(CODE_REG, offset);
@@ -655,18 +650,13 @@
   blr(TMP);
 }
 
-void Assembler::BranchLinkPatchable(const StubEntry& stub_entry) {
-  BranchLink(stub_entry, ObjectPool::kPatchable);
-}
-
 void Assembler::BranchLinkToRuntime() {
   ldr(LR, Address(THR, Thread::call_to_runtime_entry_point_offset()));
   blr(LR);
 }
 
-void Assembler::BranchLinkWithEquivalence(const StubEntry& stub_entry,
+void Assembler::BranchLinkWithEquivalence(const Code& target,
                                           const Object& equivalence) {
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   const int32_t offset = ObjectPool::element_offset(
       object_pool_wrapper().FindObject(target, equivalence));
   LoadWordFromPoolOffset(CODE_REG, offset);
@@ -979,8 +969,6 @@
   ASSERT(object != value);
   ASSERT(object != LR);
   ASSERT(value != LR);
-
-#if defined(CONCURRENT_MARKING)
   ASSERT(object != TMP);
   ASSERT(object != TMP2);
   ASSERT(value != TMP);
@@ -1032,20 +1020,53 @@
   }
   if (!lr_reserved) Pop(LR);
   Bind(&done);
-#else
-  ASSERT(object != value);
-  ASSERT(object != LR);
-  ASSERT(value != LR);
+}
 
-  str(value, dest);
+void Assembler::StoreIntoArray(Register object,
+                               Register slot,
+                               Register value,
+                               CanBeSmi can_be_smi,
+                               bool lr_reserved) {
+  ASSERT(object != TMP);
+  ASSERT(object != TMP2);
+  ASSERT(value != TMP);
+  ASSERT(value != TMP2);
+  ASSERT(slot != TMP);
+  ASSERT(slot != TMP2);
+
+  str(value, Address(slot, 0));
+
+  // In parallel, test whether
+  //  - object is old and not remembered and value is new, or
+  //  - object is old and value is old and not marked and concurrent marking is
+  //    in progress
+  // If so, call the WriteBarrier stub, which will either add object to the
+  // store buffer (case 1) or add value to the marking stack (case 2).
+  // Compare RawObject::StorePointer.
   Label done;
-  StoreIntoObjectFilter(object, value, &done, can_be_smi, kJumpToNoUpdate);
+  if (can_be_smi == kValueCanBeSmi) {
+    BranchIfSmi(value, &done);
+  }
+  ldr(TMP, FieldAddress(object, Object::tags_offset()), kUnsignedByte);
+  ldr(TMP2, FieldAddress(value, Object::tags_offset()), kUnsignedByte);
+  and_(TMP, TMP2, Operand(TMP, LSR, RawObject::kBarrierOverlapShift));
+  tst(TMP, Operand(BARRIER_MASK));
+  b(&done, ZERO);
   if (!lr_reserved) Push(LR);
-  ldr(LR, Address(THR, Thread::write_barrier_wrappers_offset(object)));
+
+  if ((object != kWriteBarrierObjectReg) || (value != kWriteBarrierValueReg) ||
+      (slot != kWriteBarrierSlotReg)) {
+    // Spill and shuffle unimplemented. Currently StoreIntoArray is only used
+    // from StoreIndexInstr, which gets these exact registers from the register
+    // allocator.
+    UNIMPLEMENTED();
+  }
+
+  ldr(LR, Address(THR, Thread::array_write_barrier_entry_point_offset()));
   blr(LR);
+
   if (!lr_reserved) Pop(LR);
   Bind(&done);
-#endif
 }
 
 void Assembler::StoreIntoObjectNoBarrier(Register object,
@@ -1185,7 +1206,7 @@
 #if defined(TARGET_OS_FUCHSIA)
   // Make any future signal handlers fail fast. Verifies our assumption in
   // EnterFrame.
-  LoadImmediate(CSP, 0);
+  orri(CSP, ZR, Immediate(16));
 #endif
 }
 
@@ -1230,15 +1251,18 @@
   ASSERT(!constant_pool_allowed());
   // Setup the frame.
   EnterFrame(0);
-  TagAndPushPPAndPcMarker();  // Save PP and PC marker.
 
-  // Load the pool pointer.
-  if (new_pp == kNoRegister) {
-    LoadPoolPointer();
-  } else {
-    mov(PP, new_pp);
-    set_constant_pool_allowed(true);
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    TagAndPushPPAndPcMarker();  // Save PP and PC marker.
+
+    // Load the pool pointer.
+    if (new_pp == kNoRegister) {
+      LoadPoolPointer();
+    } else {
+      mov(PP, new_pp);
+    }
   }
+  set_constant_pool_allowed(true);
 
   // Reserve space.
   if (frame_size > 0) {
@@ -1263,13 +1287,15 @@
 }
 
 void Assembler::LeaveDartFrame(RestorePP restore_pp) {
-  if (restore_pp == kRestoreCallerPP) {
-    set_constant_pool_allowed(false);
-    // Restore and untag PP.
-    LoadFromOffset(PP, FP,
-                   compiler_frame_layout.saved_caller_pp_from_fp * kWordSize);
-    sub(PP, PP, Operand(kHeapObjectTag));
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    if (restore_pp == kRestoreCallerPP) {
+      // Restore and untag PP.
+      LoadFromOffset(PP, FP,
+                     compiler_frame_layout.saved_caller_pp_from_fp * kWordSize);
+      sub(PP, PP, Operand(kHeapObjectTag));
+    }
   }
+  set_constant_pool_allowed(false);
   LeaveFrame();
 }
 
@@ -1305,7 +1331,8 @@
   const intptr_t kPushedRegistersSize =
       kDartVolatileCpuRegCount * kWordSize +
       kDartVolatileFpuRegCount * kWordSize +
-      2 * kWordSize;  // PP and pc marker from EnterStubFrame.
+      (compiler_frame_layout.dart_fixed_frame_size - 2) *
+          kWordSize;  // From EnterStubFrame (excluding PC / FP)
   AddImmediate(SP, FP, -kPushedRegistersSize);
   for (int i = kDartLastVolatileCpuReg; i >= kDartFirstVolatileCpuReg; i--) {
     const Register reg = static_cast<Register>(i);
@@ -1353,13 +1380,13 @@
   br(IP0);
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() == Instructions::kCheckedEntryOffset);
+  ASSERT(CodeSize() == Instructions::kPolymorphicEntryOffset);
   LoadClassIdMayBeSmi(IP0, R0);
   cmp(R5, Operand(IP0, LSL, 1));
   b(&miss, NE);
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() == Instructions::kUncheckedEntryOffset);
+  ASSERT(CodeSize() == Instructions::kMonomorphicEntryOffset);
 
   set_use_far_branches(saved_use_far_branches);
 }
@@ -1519,6 +1546,11 @@
   }
 }
 
+void Assembler::GenerateUnRelocatedPcRelativeCall() {
+  // Emit "bl <offset>".
+  EmitUnconditionalBranchOp(BL, 0x686868);
+}
+
 Address Assembler::ElementAddressForIntIndex(bool is_external,
                                              intptr_t cid,
                                              intptr_t index_scale,
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 7807f87..4d3d69a 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -21,7 +21,6 @@
 
 // Forward declarations.
 class RuntimeEntry;
-class StubEntry;
 class RegisterSet;
 
 class Immediate : public ValueObject {
@@ -423,7 +422,7 @@
   friend class Assembler;
 };
 
-class Assembler : public ValueObject {
+class Assembler : public AssemblerBase {
  public:
   explicit Assembler(ObjectPoolWrapper* object_pool_wrapper,
                      bool use_far_branches = false);
@@ -458,50 +457,18 @@
     cmp(value, Operand(TMP));
   }
 
-  // Misc. functionality
-  intptr_t CodeSize() const { return buffer_.Size(); }
-  intptr_t prologue_offset() const { return prologue_offset_; }
-  bool has_single_entry_point() const { return has_single_entry_point_; }
-
-  // Count the fixups that produce a pointer offset, without processing
-  // the fixups.  On ARM64 there are no pointers in code.
-  intptr_t CountPointerOffsets() const { return 0; }
-
-  const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
-    ASSERT(buffer_.pointer_offsets().length() == 0);  // No pointers in code.
-    return buffer_.pointer_offsets();
-  }
-
-  ObjectPoolWrapper& object_pool_wrapper() { return *object_pool_wrapper_; }
-
-  RawObjectPool* MakeObjectPool() {
-    return object_pool_wrapper_->MakeObjectPool();
-  }
-
   bool use_far_branches() const {
     return FLAG_use_far_branches || use_far_branches_;
   }
 
   void set_use_far_branches(bool b) { use_far_branches_ = b; }
 
-  void FinalizeInstructions(const MemoryRegion& region) {
-    buffer_.FinalizeInstructions(region);
-  }
-
   // Debugging and bringup support.
   void Breakpoint() { brk(0); }
-  void Stop(const char* message);
-  void Unimplemented(const char* message);
-  void Untested(const char* message);
-  void Unreachable(const char* message);
+  void Stop(const char* message) override;
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
-  static bool EmittingComments();
-
-  const Code::Comments& GetCodeComments() const;
-
   static const char* RegisterName(Register reg);
 
   static const char* FpuRegisterName(FpuRegister reg);
@@ -1382,24 +1349,25 @@
 
   void BranchIfSmi(Register reg, Label* label) { tbz(label, reg, kSmiTag); }
 
-  void Branch(const StubEntry& stub_entry,
+  void Branch(const Code& code,
               Register pp,
               ObjectPool::Patchability patchable = ObjectPool::kNotPatchable);
-  void BranchPatchable(const StubEntry& stub_entry);
+  void BranchPatchable(const Code& code);
 
   void BranchLink(
-      const StubEntry& stub_entry,
+      const Code& code,
       ObjectPool::Patchability patchable = ObjectPool::kNotPatchable);
 
-  void BranchLinkPatchable(const StubEntry& stub_entry);
+  void BranchLinkPatchable(const Code& code) {
+    BranchLink(code, ObjectPool::kPatchable);
+  }
   void BranchLinkToRuntime();
 
   void CallNullErrorShared(bool save_fpu_registers);
 
   // Emit a call that shares its object pool entries with other calls
   // that have the same equivalence marker.
-  void BranchLinkWithEquivalence(const StubEntry& stub_entry,
-                                 const Object& equivalence);
+  void BranchLinkWithEquivalence(const Code& code, const Object& equivalence);
 
   void AddImmediate(Register dest, int64_t imm) {
     AddImmediate(dest, dest, imm);
@@ -1477,6 +1445,12 @@
                        Register value,
                        CanBeSmi can_value_be_smi = kValueCanBeSmi,
                        bool lr_reserved = false);
+  void StoreIntoArray(Register object,
+                      Register slot,
+                      Register value,
+                      CanBeSmi can_value_be_smi = kValueCanBeSmi,
+                      bool lr_reserved = false);
+
   void StoreIntoObjectOffset(Register object,
                              int32_t offset,
                              Register value,
@@ -1593,6 +1567,19 @@
                         Register temp1,
                         Register temp2);
 
+  // This emits an PC-relative call of the form "bl <offset>".  The offset
+  // is not yet known and needs therefore relocation to the right place before
+  // the code can be used.
+  //
+  // The neccessary information for the "linker" (i.e. the relocation
+  // information) is stored in [RawCode::static_calls_target_table_]: an entry
+  // of the form
+  //
+  //   (Code::kPcRelativeCall & pc_offset, <target-code>, <target-function>)
+  //
+  // will be used during relocation to fix the offset.
+  void GenerateUnRelocatedPcRelativeCall();
+
   Address ElementAddressForIntIndex(bool is_external,
                                     intptr_t cid,
                                     intptr_t index_scale,
@@ -1624,30 +1611,20 @@
                       Register tmp,
                       OperandSize sz);
 
+  static int32_t EncodeImm26BranchOffset(int64_t imm, int32_t instr) {
+    const int32_t imm32 = static_cast<int32_t>(imm);
+    const int32_t off = (((imm32 >> 2) << kImm26Shift) & kImm26Mask);
+    return (instr & ~kImm26Mask) | off;
+  }
+
+  static int64_t DecodeImm26BranchOffset(int32_t instr) {
+    const int32_t off = (((instr & kImm26Mask) >> kImm26Shift) << 6) >> 4;
+    return static_cast<int64_t>(off);
+  }
+
  private:
-  AssemblerBuffer buffer_;  // Contains position independent code.
-  ObjectPoolWrapper* object_pool_wrapper_;
-  int32_t prologue_offset_;
-  bool has_single_entry_point_;
   bool use_far_branches_;
 
-  class CodeComment : public ZoneAllocated {
-   public:
-    CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) {}
-
-    intptr_t pc_offset() const { return pc_offset_; }
-    const String& comment() const { return comment_; }
-
-   private:
-    intptr_t pc_offset_;
-    const String& comment_;
-
-    DISALLOW_COPY_AND_ASSIGN(CodeComment);
-  };
-
-  GrowableArray<CodeComment*> comments_;
-
   bool constant_pool_allowed_;
 
   void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset);
@@ -1849,17 +1826,6 @@
     return (instr & ~B24) | (cond == EQ ? B24 : 0);  // tbz : tbnz
   }
 
-  int32_t EncodeImm26BranchOffset(int64_t imm, int32_t instr) {
-    const int32_t imm32 = static_cast<int32_t>(imm);
-    const int32_t off = (((imm32 >> 2) << kImm26Shift) & kImm26Mask);
-    return (instr & ~kImm26Mask) | off;
-  }
-
-  int64_t DecodeImm26BranchOffset(int32_t instr) {
-    const int32_t off = (((instr & kImm26Mask) >> kImm26Shift) << 6) >> 4;
-    return static_cast<int64_t>(off);
-  }
-
   void EmitCompareAndBranchOp(CompareAndBranchOp op,
                               Register rt,
                               int64_t imm,
diff --git a/runtime/vm/compiler/assembler/assembler_dbc.cc b/runtime/vm/compiler/assembler/assembler_dbc.cc
index e52eaa8..a7643b6 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc.cc
+++ b/runtime/vm/compiler/assembler/assembler_dbc.cc
@@ -21,14 +21,15 @@
 void Assembler::InitializeMemoryWithBreakpoints(uword data, intptr_t length) {
   const uword end = data + length;
   while (data < end) {
-    *reinterpret_cast<int32_t*>(data) = Bytecode::kTrap;
+    *reinterpret_cast<int32_t*>(data) = SimulatorBytecode::kTrap;
     data += sizeof(int32_t);
   }
 }
 
 #define DEFINE_EMIT(Name, Signature, Fmt0, Fmt1, Fmt2)                         \
   void Assembler::Name(PARAMS_##Signature) {                                   \
-    Emit(Bytecode::FENCODE_##Signature(Bytecode::k##Name ENCODE_##Signature)); \
+    Emit(SimulatorBytecode::FENCODE_##Signature(                               \
+        SimulatorBytecode::k##Name ENCODE_##Signature));                       \
   }
 
 #define PARAMS_0
@@ -74,8 +75,12 @@
   return Thread::Current()->zone()->PrintToString("R%d", reg);
 }
 
+const char* Assembler::FpuRegisterName(FpuRegister reg) {
+  return Thread::Current()->zone()->PrintToString("F%d", reg);
+}
+
 static int32_t EncodeJump(int32_t relative_pc) {
-  return Bytecode::kJump | (relative_pc << 8);
+  return SimulatorBytecode::kJump | (relative_pc << 8);
 }
 
 static int32_t OffsetToPC(int32_t offset) {
@@ -108,7 +113,7 @@
 
 void Assembler::Stop(const char* message) {
   // TODO(vegorov) support passing a message to the bytecode.
-  Emit(Bytecode::kTrap);
+  Emit(SimulatorBytecode::kTrap);
 }
 
 void Assembler::PushConstant(const Object& obj) {
diff --git a/runtime/vm/compiler/assembler/assembler_dbc.h b/runtime/vm/compiler/assembler/assembler_dbc.h
index 7642b4b7..9787191 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc.h
+++ b/runtime/vm/compiler/assembler/assembler_dbc.h
@@ -25,59 +25,29 @@
   Address();
 };
 
-class Assembler : public ValueObject {
+class Assembler : public AssemblerBase {
  public:
   explicit Assembler(ObjectPoolWrapper* object_pool_wrapper,
                      bool use_far_branches = false)
-      : buffer_(), object_pool_wrapper_(object_pool_wrapper), comments_() {}
-
+      : AssemblerBase(object_pool_wrapper) {}
   ~Assembler() {}
 
   void Bind(Label* label);
   void Jump(Label* label);
 
   // Misc. functionality
-  intptr_t CodeSize() const { return buffer_.Size(); }
   intptr_t prologue_offset() const { return 0; }
-  bool has_single_entry_point() const { return true; }
-
-  // Count the fixups that produce a pointer offset, without processing
-  // the fixups.
-  intptr_t CountPointerOffsets() const { return 0; }
-
-  const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
-    ASSERT(buffer_.pointer_offsets().length() == 0);  // No pointers in code.
-    return buffer_.pointer_offsets();
-  }
-
-  ObjectPoolWrapper& object_pool_wrapper() { return *object_pool_wrapper_; }
-
-  RawObjectPool* MakeObjectPool() {
-    return object_pool_wrapper_->MakeObjectPool();
-  }
-
-  void FinalizeInstructions(const MemoryRegion& region) {
-    buffer_.FinalizeInstructions(region);
-  }
 
   // Debugging and bringup support.
-  void Stop(const char* message);
-  void Unimplemented(const char* message);
-  void Untested(const char* message);
-  void Unreachable(const char* message);
+  void Stop(const char* message) override;
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
-  static bool EmittingComments();
-
-  const Code::Comments& GetCodeComments() const;
-
   static const char* RegisterName(Register reg);
 
-  static const char* FpuRegisterName(FpuRegister reg) { return "?"; }
+  static const char* FpuRegisterName(FpuRegister reg);
 
-  static uword GetBreakInstructionFiller() { return Bytecode::kTrap; }
+  static uword GetBreakInstructionFiller() { return SimulatorBytecode::kTrap; }
 
   static bool IsSafe(const Object& value) { return true; }
   static bool IsSafeSmi(const Object& value) { return false; }
@@ -125,26 +95,6 @@
   void Nop(intptr_t d) { Nop(0, d); }
 
  private:
-  AssemblerBuffer buffer_;  // Contains position independent code.
-  ObjectPoolWrapper* object_pool_wrapper_;
-
-  class CodeComment : public ZoneAllocated {
-   public:
-    CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) {}
-
-    intptr_t pc_offset() const { return pc_offset_; }
-    const String& comment() const { return comment_; }
-
-   private:
-    intptr_t pc_offset_;
-    const String& comment_;
-
-    DISALLOW_COPY_AND_ASSIGN(CodeComment);
-  };
-
-  GrowableArray<CodeComment*> comments_;
-
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(Assembler);
 };
diff --git a/runtime/vm/compiler/assembler/assembler_dbc_test.cc b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
index 6f2417a..7652b45 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_dbc_test.cc
@@ -75,7 +75,8 @@
   const Function& dummy_instance_function =
       Function::Handle(CreateFunction(dummy_function_name));
   Code& code = Code::Handle(
-      Code::FinalizeCode(dummy_instance_function, nullptr, &_assembler_));
+      Code::FinalizeCode(dummy_instance_function, nullptr, &_assembler_,
+                         Code::PoolAttachment::kAttachPool));
   dummy_instance_function.AttachCode(code);
 
   // Make a dummy ICData.
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index e2074e5..97823b4 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -1909,6 +1909,48 @@
   // No store buffer update.
 }
 
+// Destroys the value register.
+void Assembler::StoreIntoArray(Register object,
+                               Register slot,
+                               Register value,
+                               CanBeSmi can_be_smi) {
+  ASSERT(object != value);
+  movl(Address(slot, 0), value);
+
+  Label done;
+  StoreIntoObjectFilter(object, value, &done, can_be_smi, kJumpToNoUpdate);
+  // A store buffer update is required.
+  if (value != kWriteBarrierObjectReg) {
+    pushl(kWriteBarrierObjectReg);  // Preserve kWriteBarrierObjectReg.
+  }
+  if (value != kWriteBarrierSlotReg && slot != kWriteBarrierSlotReg) {
+    pushl(kWriteBarrierSlotReg);  // Preserve kWriteBarrierSlotReg.
+  }
+  if (object != kWriteBarrierObjectReg && slot != kWriteBarrierSlotReg) {
+    if (slot == kWriteBarrierObjectReg && object == kWriteBarrierSlotReg) {
+      xchgl(slot, object);
+    } else if (slot == kWriteBarrierObjectReg) {
+      movl(kWriteBarrierSlotReg, slot);
+      movl(kWriteBarrierObjectReg, object);
+    } else {
+      movl(kWriteBarrierObjectReg, object);
+      movl(kWriteBarrierSlotReg, slot);
+    }
+  } else if (object != kWriteBarrierObjectReg) {
+    movl(kWriteBarrierObjectReg, object);
+  } else if (slot != kWriteBarrierSlotReg) {
+    movl(kWriteBarrierSlotReg, slot);
+  }
+  call(Address(THR, Thread::array_write_barrier_entry_point_offset()));
+  if (value != kWriteBarrierSlotReg && slot != kWriteBarrierSlotReg) {
+    popl(kWriteBarrierSlotReg);  // Restore kWriteBarrierSlotReg.
+  }
+  if (value != kWriteBarrierObjectReg) {
+    popl(kWriteBarrierObjectReg);  // Restore kWriteBarrierObjectReg.
+  }
+  Bind(&done);
+}
+
 void Assembler::UnverifiedStoreOldObject(const Address& dest,
                                          const Object& value) {
   ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal());
@@ -2090,8 +2132,7 @@
   entry.Call(this, argument_count);
 }
 
-void Assembler::Call(const StubEntry& stub_entry, bool movable_target) {
-  const Code& target = Code::ZoneHandle(stub_entry.code());
+void Assembler::Call(const Code& target, bool movable_target) {
   LoadObject(CODE_REG, target, movable_target);
   call(FieldAddress(CODE_REG, Code::entry_point_offset()));
 }
@@ -2100,13 +2141,13 @@
   call(Address(THR, Thread::call_to_runtime_entry_point_offset()));
 }
 
-void Assembler::Jmp(const StubEntry& stub_entry) {
-  const ExternalLabel label(stub_entry.EntryPoint());
+void Assembler::Jmp(const Code& target) {
+  const ExternalLabel label(target.EntryPoint());
   jmp(&label);
 }
 
-void Assembler::J(Condition condition, const StubEntry& stub_entry) {
-  const ExternalLabel label(stub_entry.EntryPoint());
+void Assembler::J(Condition condition, const Code& target) {
+  const ExternalLabel label(target.EntryPoint());
   j(condition, &label);
 }
 
@@ -2326,8 +2367,8 @@
   if (FLAG_print_stop_message) {
     pushl(EAX);  // Preserve EAX.
     movl(EAX, Immediate(reinterpret_cast<int32_t>(message)));
-    Call(*StubCode::PrintStopMessage_entry());  // Passing message in EAX.
-    popl(EAX);                                  // Restore EAX.
+    Call(StubCode::PrintStopMessage());  // Passing message in EAX.
+    popl(EAX);                           // Restore EAX.
   }
   // Emit the int3 instruction.
   int3();  // Execution can be resumed with the 'cont' command in gdb.
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index cb75d28..9fcc3eb 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -18,7 +18,6 @@
 
 // Forward declarations.
 class RuntimeEntry;
-class StubEntry;
 
 class Immediate : public ValueObject {
  public:
@@ -221,18 +220,13 @@
   }
 };
 
-class Assembler : public ValueObject {
+class Assembler : public AssemblerBase {
  public:
   explicit Assembler(ObjectPoolWrapper* object_pool_wrapper,
                      bool use_far_branches = false)
-      : buffer_(),
-        prologue_offset_(-1),
+      : AssemblerBase(object_pool_wrapper),
         jit_cookie_(0),
-        comments_(),
         code_(Code::ZoneHandle()) {
-    // On ia32 we don't use object pools.
-    USE(object_pool_wrapper);
-
     // This mode is only needed and implemented for ARM.
     ASSERT(!use_far_branches);
   }
@@ -615,6 +609,10 @@
                        const Address& dest,  // Where we are storing into.
                        Register value,       // Value we are storing.
                        CanBeSmi can_value_be_smi = kValueCanBeSmi);
+  void StoreIntoArray(Register object,  // Object we are storing into.
+                      Register slot,    // Where we are storing into.
+                      Register value,   // Value we are storing.
+                      CanBeSmi can_value_be_smi = kValueCanBeSmi);
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
@@ -651,13 +649,13 @@
 
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
-  void Call(const StubEntry& stub_entry, bool movable_target = false);
+  void Call(const Code& code, bool movable_target = false);
   void CallToRuntime();
 
   void CallNullErrorShared(bool save_fpu_registers) { UNREACHABLE(); }
 
-  void Jmp(const StubEntry& stub_entry);
-  void J(Condition condition, const StubEntry& stub_entry);
+  void Jmp(const Code& code);
+  void J(Condition condition, const Code& code);
 
   /*
    * Loading and comparing classes of objects.
@@ -715,30 +713,8 @@
   void Bind(Label* label);
   void Jump(Label* label) { jmp(label); }
 
-  // Address of code at offset.
-  uword CodeAddress(intptr_t offset) { return buffer_.Address(offset); }
-
-  intptr_t CodeSize() const { return buffer_.Size(); }
-  intptr_t prologue_offset() const { return prologue_offset_; }
   bool has_single_entry_point() const { return true; }
 
-  // Count the fixups that produce a pointer offset, without processing
-  // the fixups.
-  intptr_t CountPointerOffsets() const { return buffer_.CountPointerOffsets(); }
-  const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
-    return buffer_.pointer_offsets();
-  }
-
-  ObjectPoolWrapper& object_pool_wrapper() { return object_pool_wrapper_; }
-
-  RawObjectPool* MakeObjectPool() {
-    return object_pool_wrapper_.MakeObjectPool();
-  }
-
-  void FinalizeInstructions(const MemoryRegion& region) {
-    buffer_.FinalizeInstructions(region);
-  }
-
   // Set up a Dart frame on entry with a frame pointer and PC information to
   // enable easy access to the RawInstruction object of code corresponding
   // to this frame.
@@ -831,18 +807,10 @@
 
   // Debugging and bringup support.
   void Breakpoint() { int3(); }
-  void Stop(const char* message);
-  void Unimplemented(const char* message);
-  void Untested(const char* message);
-  void Unreachable(const char* message);
+  void Stop(const char* message) override;
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
-  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
-  static bool EmittingComments();
-
-  const Code::Comments& GetCodeComments() const;
-
   static const char* RegisterName(Register reg);
   static const char* FpuRegisterName(FpuRegister reg);
 
@@ -873,21 +841,6 @@
   void PushCodeObject();
 
  private:
-  class CodeComment : public ZoneAllocated {
-   public:
-    CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) {}
-
-    intptr_t pc_offset() const { return pc_offset_; }
-    const String& comment() const { return comment_; }
-
-   private:
-    intptr_t pc_offset_;
-    const String& comment_;
-
-    DISALLOW_COPY_AND_ASSIGN(CodeComment);
-  };
-
   void Alu(int bytes, uint8_t opcode, Register dst, Register src);
   void Alu(uint8_t modrm_opcode, Register dst, const Immediate& imm);
   void Alu(int bytes, uint8_t opcode, Register dst, const Address& src);
@@ -931,11 +884,7 @@
 
   int32_t jit_cookie();
 
-  AssemblerBuffer buffer_;
-  ObjectPoolWrapper object_pool_wrapper_;
-  intptr_t prologue_offset_;
   int32_t jit_cookie_;
-  GrowableArray<CodeComment*> comments_;
   Code& code_;
 
   DISALLOW_ALLOCATION();
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index c91098b..74f20d2 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -21,15 +21,11 @@
 
 DECLARE_FLAG(bool, check_code_pointer);
 DECLARE_FLAG(bool, inline_alloc);
+DECLARE_FLAG(bool, precompiled_mode);
 
 Assembler::Assembler(ObjectPoolWrapper* object_pool_wrapper,
                      bool use_far_branches)
-    : buffer_(),
-      object_pool_wrapper_(object_pool_wrapper),
-      prologue_offset_(-1),
-      has_single_entry_point_(true),
-      comments_(),
-      constant_pool_allowed_(false) {
+    : AssemblerBase(object_pool_wrapper), constant_pool_allowed_(false) {
   // Far branching mode is only needed and implemented for ARM.
   ASSERT(!use_far_branches);
 }
@@ -63,10 +59,8 @@
   call(TMP);
 }
 
-void Assembler::CallPatchable(const StubEntry& stub_entry,
-                              Code::EntryKind entry_kind) {
+void Assembler::CallPatchable(const Code& target, Code::EntryKind entry_kind) {
   ASSERT(constant_pool_allowed());
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   const intptr_t idx =
       object_pool_wrapper().AddObject(target, ObjectPool::kPatchable);
   const int32_t offset = ObjectPool::element_offset(idx);
@@ -74,20 +68,18 @@
   call(FieldAddress(CODE_REG, Code::entry_point_offset(entry_kind)));
 }
 
-void Assembler::CallWithEquivalence(const StubEntry& stub_entry,
+void Assembler::CallWithEquivalence(const Code& target,
                                     const Object& equivalence,
                                     Code::EntryKind entry_kind) {
   ASSERT(constant_pool_allowed());
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   const intptr_t idx = object_pool_wrapper().FindObject(target, equivalence);
   const int32_t offset = ObjectPool::element_offset(idx);
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
   call(FieldAddress(CODE_REG, Code::entry_point_offset(entry_kind)));
 }
 
-void Assembler::Call(const StubEntry& stub_entry) {
+void Assembler::Call(const Code& target) {
   ASSERT(constant_pool_allowed());
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   const intptr_t idx =
       object_pool_wrapper().FindObject(target, ObjectPool::kNotPatchable);
   const int32_t offset = ObjectPool::element_offset(idx);
@@ -883,13 +875,11 @@
   }
 }
 
-void Assembler::J(Condition condition,
-                  const StubEntry& stub_entry,
-                  Register pp) {
+void Assembler::J(Condition condition, const Code& target, Register pp) {
   Label no_jump;
   // Negate condition.
   j(static_cast<Condition>(condition ^ 1), &no_jump, kNearJump);
-  Jmp(stub_entry, pp);
+  Jmp(target, pp);
   Bind(&no_jump);
 }
 
@@ -926,9 +916,8 @@
   jmp(TMP);
 }
 
-void Assembler::JmpPatchable(const StubEntry& stub_entry, Register pp) {
+void Assembler::JmpPatchable(const Code& target, Register pp) {
   ASSERT((pp != PP) || constant_pool_allowed());
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   const intptr_t idx =
       object_pool_wrapper().AddObject(target, ObjectPool::kPatchable);
   const int32_t offset = ObjectPool::element_offset(idx);
@@ -937,9 +926,8 @@
   jmp(TMP);
 }
 
-void Assembler::Jmp(const StubEntry& stub_entry, Register pp) {
+void Assembler::Jmp(const Code& target, Register pp) {
   ASSERT((pp != PP) || constant_pool_allowed());
-  const Code& target = Code::ZoneHandle(stub_entry.code());
   const intptr_t idx =
       object_pool_wrapper().FindObject(target, ObjectPool::kNotPatchable);
   const int32_t offset = ObjectPool::element_offset(idx);
@@ -1266,8 +1254,6 @@
                                 CanBeSmi can_be_smi) {
   // x.slot = x. Barrier should have be removed at the IL level.
   ASSERT(object != value);
-
-#if defined(CONCURRENT_MARKING)
   ASSERT(object != TMP);
   ASSERT(value != TMP);
 
@@ -1313,14 +1299,47 @@
     popq(kWriteBarrierValueReg);
   }
   Bind(&done);
-#else
-  movq(dest, value);
+}
+
+void Assembler::StoreIntoArray(Register object,
+                               Register slot,
+                               Register value,
+                               CanBeSmi can_be_smi) {
+  ASSERT(object != TMP);
+  ASSERT(value != TMP);
+  ASSERT(slot != TMP);
+
+  movq(Address(slot, 0), value);
+
+  // In parallel, test whether
+  //  - object is old and not remembered and value is new, or
+  //  - object is old and value is old and not marked and concurrent marking is
+  //    in progress
+  // If so, call the WriteBarrier stub, which will either add object to the
+  // store buffer (case 1) or add value to the marking stack (case 2).
+  // Compare RawObject::StorePointer.
   Label done;
-  StoreIntoObjectFilter(object, value, &done, can_be_smi, kJumpToNoUpdate);
-  // A store buffer update is required.
-  call(Address(THR, Thread::write_barrier_wrappers_offset(object)));
+  if (can_be_smi == kValueCanBeSmi) {
+    testq(value, Immediate(kSmiTagMask));
+    j(ZERO, &done, kNearJump);
+  }
+  movb(TMP, FieldAddress(object, Object::tags_offset()));
+  shrl(TMP, Immediate(RawObject::kBarrierOverlapShift));
+  andl(TMP, Address(THR, Thread::write_barrier_mask_offset()));
+  testb(FieldAddress(value, Object::tags_offset()), TMP);
+  j(ZERO, &done, kNearJump);
+
+  if ((object != kWriteBarrierObjectReg) || (value != kWriteBarrierValueReg) ||
+      (slot != kWriteBarrierSlotReg)) {
+    // Spill and shuffle unimplemented. Currently StoreIntoArray is only used
+    // from StoreIndexInstr, which gets these exact registers from the register
+    // allocator.
+    UNIMPLEMENTED();
+  }
+
+  call(Address(THR, Thread::array_write_barrier_entry_point_offset()));
+
   Bind(&done);
-#endif
 }
 
 void Assembler::StoreIntoObjectNoBarrier(Register object,
@@ -1369,20 +1388,14 @@
   addq(dest, inc_imm);
 }
 
-void Assembler::Stop(const char* message, bool fixed_length_encoding) {
+void Assembler::Stop(const char* message) {
   if (FLAG_print_stop_message) {
     int64_t message_address = reinterpret_cast<int64_t>(message);
     pushq(TMP);  // Preserve TMP register.
     pushq(RDI);  // Preserve RDI register.
-    if (fixed_length_encoding) {
-      AssemblerBuffer::EnsureCapacity ensured(&buffer_);
-      EmitRegisterREX(RDI, REX_W);
-      EmitUint8(0xB8 | (RDI & 7));
-      EmitInt64(message_address);
-    } else {
-      LoadImmediate(RDI, Immediate(message_address));
-    }
-    call(&StubCode::PrintStopMessage_entry()->label());
+    LoadImmediate(RDI, Immediate(message_address));
+    ExternalLabel label(StubCode::PrintStopMessage().EntryPoint());
+    call(&label);
     popq(RDI);  // Restore RDI register.
     popq(TMP);  // Restore TMP register.
   }
@@ -1519,7 +1532,9 @@
   const intptr_t kPushedRegistersSize =
       kPushedCpuRegistersCount * kWordSize +
       kPushedXmmRegistersCount * kFpuRegisterSize +
-      2 * kWordSize;  // PP, pc marker from EnterStubFrame
+      (compiler_frame_layout.dart_fixed_frame_size - 2) *
+          kWordSize;  // From EnterStubFrame (excluding PC / FP)
+
   leaq(RSP, Address(RBP, -kPushedRegistersSize));
 
   // TODO(vegorov): avoid saving FpuTMP, it is used only as scratch.
@@ -1556,12 +1571,14 @@
 void Assembler::EnterDartFrame(intptr_t frame_size, Register new_pp) {
   ASSERT(!constant_pool_allowed());
   EnterFrame(0);
-  pushq(CODE_REG);
-  pushq(PP);
-  if (new_pp == kNoRegister) {
-    LoadPoolPointer(PP);
-  } else {
-    movq(PP, new_pp);
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    pushq(CODE_REG);
+    pushq(PP);
+    if (new_pp == kNoRegister) {
+      LoadPoolPointer(PP);
+    } else {
+      movq(PP, new_pp);
+    }
   }
   set_constant_pool_allowed(true);
   if (frame_size != 0) {
@@ -1571,11 +1588,13 @@
 
 void Assembler::LeaveDartFrame(RestorePP restore_pp) {
   // Restore caller's PP register that was pushed in EnterDartFrame.
-  if (restore_pp == kRestoreCallerPP) {
-    movq(PP, Address(RBP, (compiler_frame_layout.saved_caller_pp_from_fp *
-                           kWordSize)));
-    set_constant_pool_allowed(false);
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    if (restore_pp == kRestoreCallerPP) {
+      movq(PP, Address(RBP, (compiler_frame_layout.saved_caller_pp_from_fp *
+                             kWordSize)));
+    }
   }
+  set_constant_pool_allowed(false);
   LeaveFrame();
 }
 
@@ -1639,8 +1658,8 @@
 // RDI receiver, RBX guarded cid as Smi.
 // Preserve R10 (ARGS_DESC_REG), not required today, but maybe later.
 void Assembler::MonomorphicCheckedEntry() {
-  ASSERT(has_single_entry_point_);
   has_single_entry_point_ = false;
+  intptr_t start = CodeSize();
   Label immediate, have_cid, miss;
   Bind(&miss);
   jmp(Address(THR, Thread::monomorphic_miss_entry_offset()));
@@ -1649,11 +1668,18 @@
   movq(TMP, Immediate(kSmiCid));
   jmp(&have_cid, kNearJump);
 
+  // Ensure the monomorphic entry is 2-byte aligned (so GC can see them if we
+  // store them in ICData / MegamorphicCache arrays)
+  nop(1);
+
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() == Instructions::kCheckedEntryOffset);
+  ASSERT(CodeSize() - start == Instructions::kPolymorphicEntryOffset);
+  ASSERT((CodeSize() & kSmiTagMask) == kSmiTag);
+
   SmiUntag(RBX);
   testq(RDI, Immediate(kSmiTagMask));
   j(ZERO, &immediate, kNearJump);
+  nop(1);
 
   LoadClassId(TMP, RDI);
 
@@ -1662,8 +1688,8 @@
   j(NOT_EQUAL, &miss, Assembler::kNearJump);
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() == Instructions::kUncheckedEntryOffset);
-  ASSERT((CodeSize() & kSmiTagMask) == kSmiTag);
+  ASSERT(CodeSize() - start == Instructions::kMonomorphicEntryOffset);
+  ASSERT(((CodeSize() - start) & kSmiTagMask) == kSmiTag);
 }
 
 #ifndef PRODUCT
@@ -1803,6 +1829,12 @@
   }
 }
 
+void Assembler::GenerateUnRelocatedPcRelativeCall() {
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  buffer_.Emit<uint8_t>(0xe8);
+  buffer_.Emit<int32_t>(0x68686868);
+}
+
 void Assembler::Align(int alignment, intptr_t offset) {
   ASSERT(Utils::IsPowerOfTwo(alignment));
   intptr_t pos = offset + buffer_.GetPosition();
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 6090c76..dc61bb9 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -20,7 +20,6 @@
 
 // Forward declarations.
 class RuntimeEntry;
-class StubEntry;
 
 class Immediate : public ValueObject {
  public:
@@ -275,7 +274,7 @@
   }
 };
 
-class Assembler : public ValueObject {
+class Assembler : public AssemblerBase {
  public:
   explicit Assembler(ObjectPoolWrapper* object_pool_wrapper,
                      bool use_far_branches = false);
@@ -628,7 +627,7 @@
   void jmp(const Address& address) { EmitUnaryL(address, 0xFF, 4); }
   void jmp(Label* label, bool near = kFarJump);
   void jmp(const ExternalLabel* label);
-  void jmp(const StubEntry& stub_entry);
+  void jmp(const Code& code);
 
   // Issue memory to memory move through a TMP register.
   // TODO(koda): Assert that these are not used for heap objects.
@@ -689,12 +688,12 @@
   void LoadFunctionFromCalleePool(Register dst,
                                   const Function& function,
                                   Register new_pp);
-  void JmpPatchable(const StubEntry& stub_entry, Register pp);
-  void Jmp(const StubEntry& stub_entry, Register pp = PP);
-  void J(Condition condition, const StubEntry& stub_entry, Register pp);
-  void CallPatchable(const StubEntry& stub_entry,
+  void JmpPatchable(const Code& code, Register pp);
+  void Jmp(const Code& code, Register pp = PP);
+  void J(Condition condition, const Code& code, Register pp);
+  void CallPatchable(const Code& code,
                      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
-  void Call(const StubEntry& stub_entry);
+  void Call(const Code& stub_entry);
   void CallToRuntime();
 
   void CallNullErrorShared(bool save_fpu_registers);
@@ -702,7 +701,7 @@
   // Emit a call that shares its object pool entries with other calls
   // that have the same equivalence marker.
   void CallWithEquivalence(
-      const StubEntry& stub_entry,
+      const Code& code,
       const Object& equivalence,
       Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
@@ -726,6 +725,10 @@
                        const Address& dest,  // Where we are storing into.
                        Register value,       // Value we are storing.
                        CanBeSmi can_be_smi = kValueCanBeSmi);
+  void StoreIntoArray(Register object,  // Object we are storing into.
+                      Register slot,    // Where we are storing into.
+                      Register value,   // Value we are storing.
+                      CanBeSmi can_be_smi = kValueCanBeSmi);
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
@@ -818,36 +821,6 @@
     cmpq(value, address);
   }
 
-  void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
-  static bool EmittingComments();
-
-  const Code::Comments& GetCodeComments() const;
-
-  // Address of code at offset.
-  uword CodeAddress(intptr_t offset) { return buffer_.Address(offset); }
-
-  intptr_t CodeSize() const { return buffer_.Size(); }
-  intptr_t prologue_offset() const { return prologue_offset_; }
-  bool has_single_entry_point() const { return has_single_entry_point_; }
-
-  // Count the fixups that produce a pointer offset, without processing
-  // the fixups.
-  intptr_t CountPointerOffsets() const { return buffer_.CountPointerOffsets(); }
-
-  const ZoneGrowableArray<intptr_t>& GetPointerOffsets() const {
-    return buffer_.pointer_offsets();
-  }
-
-  ObjectPoolWrapper& object_pool_wrapper() { return *object_pool_wrapper_; }
-
-  RawObjectPool* MakeObjectPool() {
-    return object_pool_wrapper_->MakeObjectPool();
-  }
-
-  void FinalizeInstructions(const MemoryRegion& region) {
-    buffer_.FinalizeInstructions(region);
-  }
-
   void RestoreCodePointer();
   void LoadPoolPointer(Register pp = PP);
 
@@ -927,12 +900,22 @@
                         Register end_address,
                         Register temp);
 
+  // This emits an PC-relative call of the form "callq *[rip+<offset>]".  The
+  // offset is not yet known and needs therefore relocation to the right place
+  // before the code can be used.
+  //
+  // The neccessary information for the "linker" (i.e. the relocation
+  // information) is stored in [RawCode::static_calls_target_table_]: an entry
+  // of the form
+  //
+  //   (Code::kPcRelativeCall & pc_offset, <target-code>, <target-function>)
+  //
+  // will be used during relocation to fix the offset.
+  void GenerateUnRelocatedPcRelativeCall();
+
   // Debugging and bringup support.
   void Breakpoint() { int3(); }
-  void Stop(const char* message, bool fixed_length_encoding = false);
-  void Unimplemented(const char* message);
-  void Untested(const char* message);
-  void Unreachable(const char* message);
+  void Stop(const char* message) override;
 
   static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
 
@@ -961,29 +944,6 @@
   static bool IsSafeSmi(const Object& object) { return object.IsSmi(); }
 
  private:
-  AssemblerBuffer buffer_;
-
-  ObjectPoolWrapper* object_pool_wrapper_;
-
-  intptr_t prologue_offset_;
-  bool has_single_entry_point_;
-
-  class CodeComment : public ZoneAllocated {
-   public:
-    CodeComment(intptr_t pc_offset, const String& comment)
-        : pc_offset_(pc_offset), comment_(comment) {}
-
-    intptr_t pc_offset() const { return pc_offset_; }
-    const String& comment() const { return comment_; }
-
-   private:
-    intptr_t pc_offset_;
-    const String& comment_;
-
-    DISALLOW_COPY_AND_ASSIGN(CodeComment);
-  };
-
-  GrowableArray<CodeComment*> comments_;
   bool constant_pool_allowed_;
 
   intptr_t FindImmediate(int64_t imm);
diff --git a/runtime/vm/compiler/assembler/assembler_x64_test.cc b/runtime/vm/compiler/assembler/assembler_x64_test.cc
index a478cf7..c06b96a 100644
--- a/runtime/vm/compiler/assembler/assembler_x64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64_test.cc
@@ -3935,7 +3935,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x1f]\n"
+      "movq pp,[r12+0x27]\n"
       "movl rax,0x........\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -3972,7 +3972,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x1f]\n"
+      "movq pp,[r12+0x27]\n"
       "movl rax,-0x........\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -4007,7 +4007,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x1f]\n"
+      "movq pp,[r12+0x27]\n"
       "movl rax,0x........\n"
       "movd xmm0,rax\n"
       "shufps xmm0,xmm0 [0]\n"
@@ -4852,7 +4852,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x1f]\n"
+      "movq pp,[r12+0x27]\n"
       "movq rax,[pp+0xf]\n"
       "cmpq rax,[pp+0xf]\n"
       "jnz 0x................\n"
@@ -5290,7 +5290,7 @@
       "push thr\n"
       "movq r12,[rdi+0x8]\n"
       "movq thr,rsi\n"
-      "movq pp,[r12+0x1f]\n"
+      "movq pp,[r12+0x27]\n"
       "movq r11,[thr+0x...]\n"
       "andpd xmm0,[r11]\n"
       "pop thr\n"
diff --git a/runtime/vm/compiler/assembler/disassembler.cc b/runtime/vm/compiler/assembler/disassembler.cc
index 01312ca..8cf7adc 100644
--- a/runtime/vm/compiler/assembler/disassembler.cc
+++ b/runtime/vm/compiler/assembler/disassembler.cc
@@ -16,13 +16,12 @@
 
 namespace dart {
 
-#ifndef PRODUCT
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 DECLARE_FLAG(bool, trace_inlining_intervals);
 DEFINE_FLAG(bool, trace_source_positions, false, "Source position diagnostics");
 
-void DisassembleToStdout::ConsumeInstruction(const Code& code,
-                                             char* hex_buffer,
+void DisassembleToStdout::ConsumeInstruction(char* hex_buffer,
                                              intptr_t hex_size,
                                              char* human_buffer,
                                              intptr_t human_size,
@@ -51,8 +50,7 @@
   va_end(args);
 }
 
-void DisassembleToJSONStream::ConsumeInstruction(const Code& code,
-                                                 char* hex_buffer,
+void DisassembleToJSONStream::ConsumeInstruction(char* hex_buffer,
                                                  intptr_t hex_size,
                                                  char* human_buffer,
                                                  intptr_t human_size,
@@ -97,9 +95,7 @@
   free(p);
 }
 
-#if !defined(PRODUCT)
-void DisassembleToMemory::ConsumeInstruction(const Code& code,
-                                             char* hex_buffer,
+void DisassembleToMemory::ConsumeInstruction(char* hex_buffer,
                                              intptr_t hex_size,
                                              char* human_buffer,
                                              intptr_t human_size,
@@ -154,8 +150,6 @@
   *buffer_ = '\0';
 }
 
-#endif
-
 void Disassembler::Disassemble(uword start,
                                uword end,
                                DisassemblyFormatter* formatter,
@@ -206,9 +200,8 @@
     DecodeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
                       sizeof(human_buffer), &instruction_length, code, &object,
                       pc);
-    formatter->ConsumeInstruction(code, hex_buffer, sizeof(hex_buffer),
-                                  human_buffer, sizeof(human_buffer), object,
-                                  pc);
+    formatter->ConsumeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
+                                  sizeof(human_buffer), object, pc);
     pc += instruction_length;
   }
 }
@@ -243,7 +236,9 @@
 
   const ObjectPool& object_pool =
       ObjectPool::Handle(zone, code.GetObjectPool());
-  object_pool.DebugPrint();
+  if (!object_pool.IsNull()) {
+    object_pool.DebugPrint();
+  }
 
   THR_Print("PC Descriptors for function '%s' {\n", function_fullname);
   PcDescriptors::PrintHeaderString();
@@ -332,32 +327,59 @@
 
   {
     THR_Print("Static call target functions {\n");
-    const Array& table = Array::Handle(zone, code.static_calls_target_table());
-    Smi& offset = Smi::Handle(zone);
-    Function& function = Function::Handle(zone);
-    Code& code = Code::Handle(zone);
-    for (intptr_t i = 0; i < table.Length();
-         i += Code::kSCallTableEntryLength) {
-      offset ^= table.At(i + Code::kSCallTableOffsetEntry);
-      function ^= table.At(i + Code::kSCallTableFunctionEntry);
-      code ^= table.At(i + Code::kSCallTableCodeEntry);
-      if (function.IsNull()) {
-        Class& cls = Class::Handle(zone);
-        cls ^= code.owner();
-        if (cls.IsNull()) {
-          THR_Print("  0x%" Px ": %s, %p\n", start + offset.Value(),
-                    code.QualifiedName(), code.raw());
-        } else {
-          THR_Print("  0x%" Px ": allocation stub for %s, %p\n",
-                    start + offset.Value(), cls.ToCString(), code.raw());
+    const auto& table = Array::Handle(zone, code.static_calls_target_table());
+    auto& cls = Class::Handle(zone);
+    auto& kind_type_and_offset = Smi::Handle(zone);
+    auto& function = Function::Handle(zone);
+    auto& code = Code::Handle(zone);
+    if (!table.IsNull()) {
+      StaticCallsTable static_calls(table);
+      for (auto& call : static_calls) {
+        kind_type_and_offset = call.Get<Code::kSCallTableKindAndOffset>();
+        function = call.Get<Code::kSCallTableFunctionTarget>();
+        code = call.Get<Code::kSCallTableCodeTarget>();
+
+        auto kind = Code::KindField::decode(kind_type_and_offset.Value());
+        auto offset = Code::OffsetField::decode(kind_type_and_offset.Value());
+        auto entry_point =
+            Code::EntryPointField::decode(kind_type_and_offset.Value());
+
+        const char* s_entry_point =
+            entry_point == Code::kUncheckedEntry ? " <unchecked-entry>" : "";
+        const char* skind = nullptr;
+        switch (kind) {
+          case Code::kPcRelativeCall:
+            skind = "pc-relative-call";
+            break;
+          case Code::kPcRelativeTailCall:
+            skind = "pc-relative-tail-call";
+            break;
+          case Code::kCallViaCode:
+            skind = "call-via-code";
+            break;
+          default:
+            UNREACHABLE();
         }
-      } else {
-        THR_Print("  0x%" Px ": %s, %p\n", start + offset.Value(),
-                  function.ToFullyQualifiedCString(), code.raw());
+        if (function.IsNull()) {
+          cls ^= code.owner();
+          if (cls.IsNull()) {
+            THR_Print("  0x%" Px ": %s, %p (%s)%s\n", start + offset,
+                      code.QualifiedName(), code.raw(), skind, s_entry_point);
+          } else {
+            THR_Print("  0x%" Px ": allocation stub for %s, %p (%s)%s\n",
+                      start + offset, cls.ToCString(), code.raw(), skind,
+                      s_entry_point);
+          }
+        } else {
+          THR_Print("  0x%" Px ": %s, %p (%s)%s\n", start + offset,
+                    function.ToFullyQualifiedCString(), code.raw(), skind,
+                    s_entry_point);
+        }
       }
     }
-    THR_Print("}\n");
   }
+  THR_Print("}\n");
+
   if (optimized && FLAG_trace_inlining_intervals) {
     code.DumpInlineIntervals();
   }
@@ -373,6 +395,11 @@
   DisassembleCodeHelper(function_fullname, code, optimized);
 }
 
-#endif  // !PRODUCT
+#else   // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
+
+void Disassembler::DisassembleCode(const Function& function,
+                                   const Code& code,
+                                   bool optimized) {}
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/assembler/disassembler.h b/runtime/vm/compiler/assembler/disassembler.h
index b43f894..f23f08c 100644
--- a/runtime/vm/compiler/assembler/disassembler.h
+++ b/runtime/vm/compiler/assembler/disassembler.h
@@ -24,8 +24,7 @@
   virtual ~DisassemblyFormatter() {}
 
   // Consume the decoded instruction at the given pc.
-  virtual void ConsumeInstruction(const Code& code,
-                                  char* hex_buffer,
+  virtual void ConsumeInstruction(char* hex_buffer,
                                   intptr_t hex_size,
                                   char* human_buffer,
                                   intptr_t human_size,
@@ -43,8 +42,7 @@
   DisassembleToStdout() : DisassemblyFormatter() {}
   ~DisassembleToStdout() {}
 
-  virtual void ConsumeInstruction(const Code& code,
-                                  char* hex_buffer,
+  virtual void ConsumeInstruction(char* hex_buffer,
                                   intptr_t hex_size,
                                   char* human_buffer,
                                   intptr_t human_size,
@@ -65,8 +63,7 @@
       : DisassemblyFormatter(), jsarr_(jsarr) {}
   ~DisassembleToJSONStream() {}
 
-  virtual void ConsumeInstruction(const Code& code,
-                                  char* hex_buffer,
+  virtual void ConsumeInstruction(char* hex_buffer,
                                   intptr_t hex_size,
                                   char* human_buffer,
                                   intptr_t human_size,
@@ -81,7 +78,7 @@
   DISALLOW_COPY_AND_ASSIGN(DisassembleToJSONStream);
 };
 
-#if !defined(PRODUCT)
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 // Basic disassembly formatter that outputs the disassembled instruction
 // to a memory buffer. This is only intended for test writing.
 class DisassembleToMemory : public DisassemblyFormatter {
@@ -93,8 +90,7 @@
         overflowed_(false) {}
   ~DisassembleToMemory() {}
 
-  virtual void ConsumeInstruction(const Code& code,
-                                  char* hex_buffer,
+  virtual void ConsumeInstruction(char* hex_buffer,
                                   intptr_t hex_size,
                                   char* human_buffer,
                                   intptr_t human_size,
@@ -130,7 +126,7 @@
   }
 
   static void Disassemble(uword start, uword end, const Code& code) {
-#if !defined(PRODUCT)
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
     DisassembleToStdout stdout_formatter;
     LogBlock lb;
     Disassemble(start, end, &stdout_formatter, code);
@@ -140,7 +136,7 @@
   }
 
   static void Disassemble(uword start, uword end) {
-#if !defined(PRODUCT)
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
     DisassembleToStdout stdout_formatter;
     LogBlock lb;
     Disassemble(start, end, &stdout_formatter);
@@ -153,7 +149,7 @@
                           uword end,
                           char* buffer,
                           uintptr_t buffer_size) {
-#if !defined(PRODUCT)
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
     DisassembleToMemory memory_formatter(buffer, buffer_size);
     LogBlock lb;
     Disassemble(start, end, &memory_formatter);
diff --git a/runtime/vm/compiler/assembler/disassembler_arm.cc b/runtime/vm/compiler/assembler/disassembler_arm.cc
index 491a2b4..d3880c0 100644
--- a/runtime/vm/compiler/assembler/disassembler_arm.cc
+++ b/runtime/vm/compiler/assembler/disassembler_arm.cc
@@ -13,7 +13,7 @@
 
 namespace dart {
 
-#ifndef PRODUCT
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 class ARMDecoder : public ValueObject {
  public:
@@ -1512,7 +1512,7 @@
   }
 }
 
-#endif  // !PRODUCT
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/assembler/disassembler_arm64.cc b/runtime/vm/compiler/assembler/disassembler_arm64.cc
index 14fb8a6..2abe750 100644
--- a/runtime/vm/compiler/assembler/disassembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/disassembler_arm64.cc
@@ -12,7 +12,7 @@
 
 namespace dart {
 
-#ifndef PRODUCT
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 class ARM64Decoder : public ValueObject {
  public:
@@ -1574,7 +1574,7 @@
   }
 }
 
-#endif  // !PRODUCT
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
index 0899494..151429a 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -128,21 +128,18 @@
   Apply(&buf, &size, pc, op2, bc, "");
 }
 
-// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
-// remove it once bytecode instruction set is finalized.
-//
-// static void FormatA_X(char* buf,
-//                      intptr_t size,
-//                      uword pc,
-//                      uint32_t op,
-//                      Fmt op1,
-//                      Fmt op2,
-//                      Fmt op3) {
-//  const int32_t a = (op & 0xFF00) >> 8;
-//  const int32_t bc = static_cast<int32_t>(op) >> 16;
-//  Apply(&buf, &size, pc, op1, a, ", ");
-//  Apply(&buf, &size, pc, op2, bc, "");
-// }
+static void FormatA_X(char* buf,
+                      intptr_t size,
+                      uword pc,
+                      uint32_t op,
+                      Fmt op1,
+                      Fmt op2,
+                      Fmt op3) {
+  const int32_t a = (op & 0xFF00) >> 8;
+  const int32_t bc = static_cast<int32_t>(op) >> 16;
+  Apply(&buf, &size, pc, op1, a, ", ");
+  Apply(&buf, &size, pc, op2, bc, "");
+}
 
 static void FormatX(char* buf,
                     intptr_t size,
@@ -217,7 +214,8 @@
     case KernelBytecode::kLoadConstant:
     case KernelBytecode::kPushConstant:
     case KernelBytecode::kIndirectStaticCall:
-    case KernelBytecode::kInstanceCall:
+    case KernelBytecode::kInterfaceCall:
+    case KernelBytecode::kDynamicCall:
     case KernelBytecode::kStoreStaticTOS:
     case KernelBytecode::kPushStatic:
     case KernelBytecode::kAllocate:
@@ -249,7 +247,7 @@
                                                    char* human_buffer,
                                                    intptr_t human_size,
                                                    int* out_instr_size,
-                                                   const Code& bytecode,
+                                                   const Bytecode& bytecode,
                                                    Object** object,
                                                    uword pc) {
   const uint32_t instr = *reinterpret_cast<uint32_t*>(pc);
@@ -280,57 +278,22 @@
 void KernelBytecodeDisassembler::Disassemble(uword start,
                                              uword end,
                                              DisassemblyFormatter* formatter,
-                                             const Code& bytecode) {
+                                             const Bytecode& bytecode) {
 #if !defined(PRODUCT)
-  const Code::Comments& comments =
-      bytecode.IsNull() ? Code::Comments::New(0) : bytecode.comments();
   ASSERT(formatter != NULL);
   char hex_buffer[kHexadecimalBufferSize];  // Instruction in hexadecimal form.
   char human_buffer[kUserReadableBufferSize];  // Human-readable instruction.
   uword pc = start;
-  intptr_t comment_finger = 0;
   GrowableArray<const Function*> inlined_functions;
   GrowableArray<TokenPosition> token_positions;
   while (pc < end) {
-    const intptr_t offset = pc - start;
-    const intptr_t old_comment_finger = comment_finger;
-    while (comment_finger < comments.Length() &&
-           comments.PCOffsetAt(comment_finger) <= offset) {
-      formatter->Print(
-          "        ;; %s\n",
-          String::Handle(comments.CommentAt(comment_finger)).ToCString());
-      comment_finger++;
-    }
-    if (old_comment_finger != comment_finger) {
-      char str[4000];
-      BufferFormatter f(str, sizeof(str));
-      // Comment emitted, emit inlining information.
-      bytecode.GetInlinedFunctionsAtInstruction(offset, &inlined_functions,
-                                                &token_positions);
-      // Skip top scope function printing (last entry in 'inlined_functions').
-      bool first = true;
-      for (intptr_t i = 1; i < inlined_functions.length(); i++) {
-        const char* name = inlined_functions[i]->ToQualifiedCString();
-        if (first) {
-          f.Print("        ;; Inlined [%s", name);
-          first = false;
-        } else {
-          f.Print(" -> %s", name);
-        }
-      }
-      if (!first) {
-        f.Print("]\n");
-        formatter->Print("%s", str);
-      }
-    }
     int instruction_length;
     Object* object;
     DecodeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
                       sizeof(human_buffer), &instruction_length, bytecode,
                       &object, pc);
-    formatter->ConsumeInstruction(bytecode, hex_buffer, sizeof(hex_buffer),
-                                  human_buffer, sizeof(human_buffer), object,
-                                  pc);
+    formatter->ConsumeInstruction(hex_buffer, sizeof(hex_buffer), human_buffer,
+                                  sizeof(human_buffer), object, pc);
     pc += instruction_length;
   }
 #else
@@ -343,17 +306,16 @@
   ASSERT(function.HasBytecode());
   const char* function_fullname = function.ToFullyQualifiedCString();
   Zone* zone = Thread::Current()->zone();
-  const Code& bytecode = Code::Handle(zone, function.Bytecode());
+  const Bytecode& bytecode = Bytecode::Handle(zone, function.bytecode());
   THR_Print("Bytecode for function '%s' {\n", function_fullname);
-  const Instructions& instr = Instructions::Handle(bytecode.instructions());
-  uword start = instr.PayloadStart();
+  uword start = bytecode.PayloadStart();
   DisassembleToStdout stdout_formatter;
   LogBlock lb;
-  Disassemble(start, start + instr.Size(), &stdout_formatter, bytecode);
+  Disassemble(start, start + bytecode.Size(), &stdout_formatter, bytecode);
   THR_Print("}\n");
 
   const ObjectPool& object_pool =
-      ObjectPool::Handle(zone, bytecode.GetObjectPool());
+      ObjectPool::Handle(zone, bytecode.object_pool());
   object_pool.DebugPrint();
 
   THR_Print("PC Descriptors for function '%s' {\n", function_fullname);
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.h b/runtime/vm/compiler/assembler/disassembler_kbc.h
index 3512779..89bbc18 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.h
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.h
@@ -21,15 +21,15 @@
   static void Disassemble(uword start,
                           uword end,
                           DisassemblyFormatter* formatter,
-                          const Code& bytecode);
+                          const Bytecode& bytecode);
 
   static void Disassemble(uword start,
                           uword end,
                           DisassemblyFormatter* formatter) {
-    Disassemble(start, end, formatter, Code::Handle());
+    Disassemble(start, end, formatter, Bytecode::Handle());
   }
 
-  static void Disassemble(uword start, uword end, const Code& bytecode) {
+  static void Disassemble(uword start, uword end, const Bytecode& bytecode) {
 #if !defined(PRODUCT)
     DisassembleToStdout stdout_formatter;
     LogBlock lb;
@@ -71,7 +71,7 @@
                                 char* human_buffer,
                                 intptr_t human_size,
                                 int* out_instr_len,
-                                const Code& bytecode,
+                                const Bytecode& bytecode,
                                 Object** object,
                                 uword pc);
 
diff --git a/runtime/vm/compiler/assembler/disassembler_x86.cc b/runtime/vm/compiler/assembler/disassembler_x86.cc
index b6c2324..01e0c0c 100644
--- a/runtime/vm/compiler/assembler/disassembler_x86.cc
+++ b/runtime/vm/compiler/assembler/disassembler_x86.cc
@@ -19,7 +19,7 @@
 
 namespace dart {
 
-#ifndef PRODUCT
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 enum OperandType {
   UNSET_OP_ORDER = 0,
@@ -1991,7 +1991,7 @@
 #endif
 }
 
-#endif  // !PRODUCT
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/backend/block_scheduler.cc b/runtime/vm/compiler/backend/block_scheduler.cc
index 24dc895..451c824 100644
--- a/runtime/vm/compiler/backend/block_scheduler.cc
+++ b/runtime/vm/compiler/backend/block_scheduler.cc
@@ -55,6 +55,9 @@
   if (!FLAG_reorder_basic_blocks) {
     return;
   }
+  if (FLAG_precompiled_mode) {
+    return;
+  }
 
   const Array& ic_data_array =
       Array::Handle(flow_graph()->zone(),
@@ -155,6 +158,18 @@
 }
 
 void BlockScheduler::ReorderBlocks() const {
+  if (FLAG_precompiled_mode) {
+    ReorderBlocksAOT();
+  } else {
+    ReorderBlocksJIT();
+  }
+}
+
+void BlockScheduler::ReorderBlocksJIT() const {
+  if (!FLAG_reorder_basic_blocks) {
+    return;
+  }
+
   // Add every block to a chain of length 1 and compute a list of edges
   // sorted by weight.
   intptr_t block_count = flow_graph()->preorder().length();
@@ -215,6 +230,68 @@
   }
 }
 
+// Moves blocks ending in a throw/rethrow, as well as any block post-dominated
+// by such a throwing block, to the end.
+void BlockScheduler::ReorderBlocksAOT() const {
+  if (!FLAG_reorder_basic_blocks) {
+    return;
+  }
+
+  auto& reverse_postorder = flow_graph()->reverse_postorder();
+  const intptr_t block_count = reverse_postorder.length();
+  GrowableArray<bool> is_terminating(block_count);
+  is_terminating.FillWith(false, 0, block_count);
+
+  // Any block in the worklist is marked and any of its unconditional
+  // predecessors need to be marked as well.
+  GrowableArray<BlockEntryInstr*> worklist;
+
+  // Add all throwing blocks to the worklist.
+  for (intptr_t i = 0; i < block_count; ++i) {
+    auto block = reverse_postorder[i];
+    auto last = block->last_instruction();
+    if (last->IsThrow() || last->IsReThrow()) {
+      const intptr_t preorder_nr = block->preorder_number();
+      is_terminating[preorder_nr] = true;
+      worklist.Add(block);
+    }
+  }
+
+  // Follow all indirect predecessors which unconditionally will end up in a
+  // throwing block.
+  while (worklist.length() > 0) {
+    auto block = worklist.RemoveLast();
+    for (intptr_t i = 0; i < block->PredecessorCount(); ++i) {
+      auto predecessor = block->PredecessorAt(i);
+      if (predecessor->last_instruction()->IsGoto()) {
+        const intptr_t preorder_nr = predecessor->preorder_number();
+        if (!is_terminating[preorder_nr]) {
+          is_terminating[preorder_nr] = true;
+          worklist.Add(predecessor);
+        }
+      }
+    }
+  }
+
+  // Emit code in reverse postorder but move any throwing blocks to the very
+  // end.
+  auto& codegen_order = *flow_graph()->CodegenBlockOrder(true);
+  for (intptr_t i = 0; i < block_count; ++i) {
+    auto block = reverse_postorder[i];
+    const intptr_t preorder_nr = block->preorder_number();
+    if (!is_terminating[preorder_nr]) {
+      codegen_order.Add(block);
+    }
+  }
+  for (intptr_t i = 0; i < block_count; ++i) {
+    auto block = reverse_postorder[i];
+    const intptr_t preorder_nr = block->preorder_number();
+    if (is_terminating[preorder_nr]) {
+      codegen_order.Add(block);
+    }
+  }
+}
+
 }  // namespace dart
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/backend/block_scheduler.h b/runtime/vm/compiler/backend/block_scheduler.h
index f1f1217..90308bc 100644
--- a/runtime/vm/compiler/backend/block_scheduler.h
+++ b/runtime/vm/compiler/backend/block_scheduler.h
@@ -18,10 +18,12 @@
   FlowGraph* flow_graph() const { return flow_graph_; }
 
   void AssignEdgeWeights() const;
-
   void ReorderBlocks() const;
 
  private:
+  void ReorderBlocksAOT() const;
+  void ReorderBlocksJIT() const;
+
   FlowGraph* const flow_graph_;
 };
 
diff --git a/runtime/vm/compiler/backend/compile_type.h b/runtime/vm/compiler/backend/compile_type.h
new file mode 100644
index 0000000..217ab1e
--- /dev/null
+++ b/runtime/vm/compiler/backend/compile_type.h
@@ -0,0 +1,215 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_COMPILER_BACKEND_COMPILE_TYPE_H_
+#define RUNTIME_VM_COMPILER_BACKEND_COMPILE_TYPE_H_
+
+#include "vm/object.h"
+#include "vm/thread.h"
+
+namespace dart {
+
+class BufferFormatter;
+
+// CompileType describes type of a value produced by a definition.
+//
+// It captures the following properties:
+//    - whether the value can potentially be null or if it is definitely not
+//      null;
+//    - concrete class id of the value or kDynamicCid if unknown statically;
+//    - abstract super type of the value, concrete type of the value in runtime
+//      is guaranteed to be sub type of this type.
+//
+// Values of CompileType form a lattice with a None type as a bottom and a
+// nullable Dynamic type as a top element. Method Union provides a join
+// operation for the lattice.
+class CompileType : public ZoneAllocated {
+ public:
+  static const bool kNullable = true;
+  static const bool kNonNullable = false;
+
+  CompileType(bool is_nullable, intptr_t cid, const AbstractType* type)
+      : is_nullable_(is_nullable), cid_(cid), type_(type) {}
+
+  CompileType(const CompileType& other)
+      : ZoneAllocated(),
+        is_nullable_(other.is_nullable_),
+        cid_(other.cid_),
+        type_(other.type_) {}
+
+  CompileType& operator=(const CompileType& other) {
+    is_nullable_ = other.is_nullable_;
+    cid_ = other.cid_;
+    type_ = other.type_;
+    return *this;
+  }
+
+  bool is_nullable() const { return is_nullable_; }
+
+  // Return type such that concrete value's type in runtime is guaranteed to
+  // be subtype of it.
+  const AbstractType* ToAbstractType();
+
+  // Return class id such that it is either kDynamicCid or in runtime
+  // value is guaranteed to have an equal class id.
+  intptr_t ToCid();
+
+  // Return class id such that it is either kDynamicCid or in runtime
+  // value is guaranteed to be either null or have an equal class id.
+  intptr_t ToNullableCid();
+
+  // Return true if the value is guaranteed to be not-null or is known to be
+  // always null.
+  bool HasDecidableNullability();
+
+  // Return true if the value is known to be always null.
+  bool IsNull();
+
+  // Return true if this type is a subtype of the given type.
+  bool IsSubtypeOf(const AbstractType& other);
+
+  // Return true if value of this type is assignable to a location of the
+  // given type.
+  bool IsAssignableTo(const AbstractType& type) {
+    bool is_instance;
+    return CanComputeIsInstanceOf(type, kNullable, &is_instance) && is_instance;
+  }
+
+  // Create a new CompileType representing given combination of class id and
+  // abstract type. The pair is assumed to be coherent.
+  static CompileType Create(intptr_t cid, const AbstractType& type);
+
+  CompileType CopyNonNullable() const {
+    return CompileType(kNonNullable, kIllegalCid, type_);
+  }
+
+  static CompileType CreateNullable(bool is_nullable, intptr_t cid) {
+    return CompileType(is_nullable, cid, NULL);
+  }
+
+  // Create a new CompileType representing given abstract type. By default
+  // values as assumed to be nullable.
+  static CompileType FromAbstractType(const AbstractType& type,
+                                      bool is_nullable = kNullable);
+
+  // Create a new CompileType representing a value with the given class id.
+  // Resulting CompileType is nullable only if cid is kDynamicCid or kNullCid.
+  static CompileType FromCid(intptr_t cid);
+
+  // Create None CompileType. It is the bottom of the lattice and is used to
+  // represent type of the phi that was not yet inferred.
+  static CompileType None() {
+    return CompileType(kNullable, kIllegalCid, NULL);
+  }
+
+  // Create Dynamic CompileType. It is the top of the lattice and is used to
+  // represent unknown type.
+  static CompileType Dynamic();
+
+  static CompileType Null();
+
+  // Create non-nullable Bool type.
+  static CompileType Bool();
+
+  // Create non-nullable Int type.
+  static CompileType Int();
+
+  // Create nullable Int type.
+  static CompileType NullableInt();
+
+  // Create non-nullable Smi type.
+  static CompileType Smi();
+
+  // Create nullable Smi type.
+  static CompileType NullableSmi() {
+    return CreateNullable(kNullable, kSmiCid);
+  }
+
+  // Create nullable Mint type.
+  static CompileType NullableMint() {
+    return CreateNullable(kNullable, kMintCid);
+  }
+
+  // Create non-nullable Double type.
+  static CompileType Double();
+
+  // Create nullable Double type.
+  static CompileType NullableDouble();
+
+  // Create non-nullable String type.
+  static CompileType String();
+
+  // Perform a join operation over the type lattice.
+  void Union(CompileType* other);
+
+  // Refine old type with newly inferred type (it could be more or less
+  // specific, or even unrelated to an old type in case of unreachable code).
+  // May return 'old_type', 'new_type' or create a new CompileType instance.
+  static CompileType* ComputeRefinedType(CompileType* old_type,
+                                         CompileType* new_type);
+
+  // Return true if this and other types are the same.
+  bool IsEqualTo(CompileType* other) {
+    return (is_nullable_ == other->is_nullable_) &&
+           (ToNullableCid() == other->ToNullableCid()) &&
+           (ToAbstractType()->Equals(*other->ToAbstractType()));
+  }
+
+  bool IsNone() const { return (cid_ == kIllegalCid) && (type_ == NULL); }
+
+  // Return true if value of this type is a non-nullable int.
+  bool IsInt() { return !is_nullable() && IsNullableInt(); }
+
+  // Return true if value of this type is a non-nullable double.
+  bool IsDouble() { return !is_nullable() && IsNullableDouble(); }
+
+  // Return true if value of this type is either int or null.
+  bool IsNullableInt() {
+    if ((cid_ == kSmiCid) || (cid_ == kMintCid)) {
+      return true;
+    }
+    if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
+      return (type_ != NULL) && ((type_->IsIntType() || type_->IsSmiType()));
+    }
+    return false;
+  }
+
+  // Returns true if value of this type is either Smi or null.
+  bool IsNullableSmi() {
+    if (cid_ == kSmiCid) {
+      return true;
+    }
+    if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
+      return type_ != nullptr && type_->IsSmiType();
+    }
+    return false;
+  }
+
+  // Return true if value of this type is either double or null.
+  bool IsNullableDouble() {
+    if (cid_ == kDoubleCid) {
+      return true;
+    }
+    if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
+      return (type_ != NULL) && type_->IsDoubleType();
+    }
+    return false;
+  }
+
+  void PrintTo(BufferFormatter* f) const;
+  const char* ToCString() const;
+
+ private:
+  bool CanComputeIsInstanceOf(const AbstractType& type,
+                              bool is_nullable,
+                              bool* is_instance);
+
+  bool is_nullable_;
+  intptr_t cid_;
+  const AbstractType* type_;
+};
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_COMPILER_BACKEND_COMPILE_TYPE_H_
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 8811240..47e4be6 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -269,14 +269,9 @@
 
 void ConstantPropagator::VisitCheckNull(CheckNullInstr* instr) {}
 
-void ConstantPropagator::VisitGenericCheckBound(GenericCheckBoundInstr* instr) {
-}
-
 void ConstantPropagator::VisitCheckEitherNonSmi(CheckEitherNonSmiInstr* instr) {
 }
 
-void ConstantPropagator::VisitCheckArrayBound(CheckArrayBoundInstr* instr) {}
-
 void ConstantPropagator::VisitDeoptimize(DeoptimizeInstr* instr) {
   // TODO(vegorov) remove all code after DeoptimizeInstr as dead.
 }
@@ -337,6 +332,20 @@
   }
 }
 
+void ConstantPropagator::VisitCheckArrayBound(CheckArrayBoundInstr* instr) {
+  // Don't propagate constants through check, since it would eliminate
+  // the data dependence between the bound check and the load/store.
+  // Graph finalization will expose the constant eventually.
+  SetValue(instr, non_constant_);
+}
+
+void ConstantPropagator::VisitGenericCheckBound(GenericCheckBoundInstr* instr) {
+  // Don't propagate constants through check, since it would eliminate
+  // the data dependence between the bound check and the load/store.
+  // Graph finalization will expose the constant eventually.
+  SetValue(instr, non_constant_);
+}
+
 void ConstantPropagator::VisitParameter(ParameterInstr* instr) {
   SetValue(instr, non_constant_);
 }
@@ -752,12 +761,9 @@
       const Instance& instance = Instance::Cast(value);
       if (instr->instantiator_type_arguments()->BindsToConstantNull() &&
           instr->function_type_arguments()->BindsToConstantNull()) {
-        Error& bound_error = Error::Handle();
         bool is_instance =
             instance.IsInstanceOf(checked_type, Object::null_type_arguments(),
-                                  Object::null_type_arguments(), &bound_error);
-        // Can only have bound error with generics.
-        ASSERT(bound_error.IsNull());
+                                  Object::null_type_arguments());
         SetValue(instr, Bool::Get(is_instance));
         return;
       }
@@ -796,8 +802,7 @@
 
 void ConstantPropagator::VisitLoadField(LoadFieldInstr* instr) {
   Value* instance = instr->instance();
-  if ((instr->native_field() != nullptr) &&
-      (instr->native_field()->kind() == NativeFieldDesc::kArray_length) &&
+  if ((instr->slot().kind() == Slot::Kind::kArray_length) &&
       instance->definition()->OriginalDefinition()->IsCreateArray()) {
     Value* num_elements = instance->definition()
                               ->OriginalDefinition()
@@ -885,12 +890,16 @@
         return;
       }
     }
-    if (instr->type_arguments().IsUninstantiatedIdentity() ||
-        instr->type_arguments().CanShareInstantiatorTypeArguments(
+    if (instr->type_arguments().CanShareInstantiatorTypeArguments(
             instr->instantiator_class())) {
       SetValue(instr, instantiator_type_args);
       return;
     }
+    if (instr->type_arguments().CanShareFunctionTypeArguments(
+            instr->function())) {
+      SetValue(instr, function_type_args);
+      return;
+    }
     SetValue(instr, non_constant_);
   }
   // TODO(regis): If both instantiator type arguments and function type
@@ -1148,6 +1157,9 @@
     }
     const Double& result = Double::ZoneHandle(Double::NewCanonical(result_val));
     SetValue(instr, result);
+  } else if (IsConstant(left) && IsConstant(right)) {
+    // Both values known, but no rule to evaluate this further.
+    SetValue(instr, non_constant_);
   }
 }
 
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index cd8350c..b5d2201 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -450,7 +450,7 @@
     // a null check rather than the more elaborate class check
     CompileType* type = receiver->Type();
     const AbstractType* atype = type->ToAbstractType();
-    if (atype->IsInstantiated() && atype->HasResolvedTypeClass() &&
+    if (atype->IsInstantiated() && atype->HasTypeClass() &&
         !atype->IsDynamicType()) {
       if (type->is_nullable()) {
         receiver_maybe_null = true;
@@ -544,15 +544,25 @@
       CheckClassInstr(new (zone()) Value(to_check), deopt_id, cids, token_pos);
 }
 
+Definition* FlowGraph::CreateCheckBound(Definition* length,
+                                        Definition* index,
+                                        intptr_t deopt_id) {
+  Value* val1 = new (zone()) Value(length);
+  Value* val2 = new (zone()) Value(index);
+  if (FLAG_precompiled_mode) {
+    return new (zone()) GenericCheckBoundInstr(val1, val2, deopt_id);
+  }
+  return new (zone()) CheckArrayBoundInstr(val1, val2, deopt_id);
+}
+
 void FlowGraph::AddExactnessGuard(InstanceCallInstr* call,
                                   intptr_t receiver_cid) {
   const Class& cls = Class::Handle(
       zone(), Isolate::Current()->class_table()->At(receiver_cid));
 
-  Definition* load_type_args = new (zone())
-      LoadFieldInstr(call->Receiver()->CopyWithType(),
-                     NativeFieldDesc::GetTypeArgumentsFieldFor(zone(), cls),
-                     call->token_pos());
+  Definition* load_type_args = new (zone()) LoadFieldInstr(
+      call->Receiver()->CopyWithType(),
+      Slot::GetTypeArgumentsSlotFor(thread(), cls), call->token_pos());
   InsertBefore(call, load_type_args, call->env(), FlowGraph::kValue);
 
   const AbstractType& type =
@@ -1112,10 +1122,7 @@
 
   // Check if inlining_parameters include a type argument vector parameter.
   const intptr_t inlined_type_args_param =
-      (FLAG_reify_generic_functions && (inlining_parameters != NULL) &&
-       function().IsGeneric())
-          ? 1
-          : 0;
+      ((inlining_parameters != NULL) && function().IsGeneric()) ? 1 : 0;
 
   for (intptr_t i = 0; i < parameter_count; i++) {
     ParameterInstr* param = new (zone()) ParameterInstr(i, function_entry);
@@ -1140,11 +1147,9 @@
     }
 
     // Replace the type arguments slot with a special parameter.
-    const bool reify_generic_argument =
-        function().IsGeneric() && FLAG_reify_generic_functions;
+    const bool reify_generic_argument = function().IsGeneric();
     if (reify_generic_argument) {
       ASSERT(parsed_function().function_type_arguments() != NULL);
-
       Definition* defn;
       if (inlining_parameters == NULL) {
         // Note: If we are not inlining, then the prologue builder will
@@ -1560,21 +1565,30 @@
   return redef;
 }
 
-void FlowGraph::RemoveRedefinitions() {
-  // Remove redefinition instructions inserted to inhibit hoisting.
+void FlowGraph::RemoveRedefinitions(bool keep_checks) {
+  // Remove redefinition and check instructions that were inserted
+  // to make a control dependence explicit with a data dependence,
+  // for example, to inhibit hoisting.
   for (BlockIterator block_it = reverse_postorder_iterator(); !block_it.Done();
        block_it.Advance()) {
     thread()->CheckForSafepoint();
     for (ForwardInstructionIterator instr_it(block_it.Current());
          !instr_it.Done(); instr_it.Advance()) {
-      RedefinitionInstr* redefinition = instr_it.Current()->AsRedefinition();
-      if (redefinition != NULL) {
-        Definition* original;
-        do {
-          original = redefinition->value()->definition();
-        } while (original->IsRedefinition());
-        redefinition->ReplaceUsesWith(original);
+      Instruction* instruction = instr_it.Current();
+      if (instruction->IsRedefinition()) {
+        RedefinitionInstr* redef = instruction->AsRedefinition();
+        redef->ReplaceUsesWith(redef->value()->definition());
         instr_it.RemoveCurrentFromGraph();
+      } else if (keep_checks) {
+        continue;
+      } else if (instruction->IsCheckArrayBound()) {
+        CheckArrayBoundInstr* check = instruction->AsCheckArrayBound();
+        check->ReplaceUsesWith(check->index()->definition());
+        check->ClearSSATempIndex();
+      } else if (instruction->IsGenericCheckBound()) {
+        GenericCheckBoundInstr* check = instruction->AsGenericCheckBound();
+        check->ReplaceUsesWith(check->index()->definition());
+        check->ClearSSATempIndex();
       }
     }
   }
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index 330bcf3..854aa81 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -180,6 +180,10 @@
                                 intptr_t deopt_id,
                                 TokenPosition token_pos);
 
+  Definition* CreateCheckBound(Definition* length,
+                               Definition* index,
+                               intptr_t deopt_id);
+
   void AddExactnessGuard(InstanceCallInstr* call, intptr_t receiver_cid);
 
   intptr_t current_ssa_temp_index() const { return current_ssa_temp_index_; }
@@ -266,7 +270,7 @@
                                         CompileType compile_type);
 
   // Remove the redefinition instructions inserted to inhibit code motion.
-  void RemoveRedefinitions();
+  void RemoveRedefinitions(bool keep_checks = false);
 
   // Copy deoptimization target from one instruction to another if we still
   // have to keep deoptimization environment at gotos for LICM purposes.
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 6d25b3e..c87bfc8 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2,9 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#include "vm/globals.h"  // Needed here to get TARGET_ARCH_XXX.
-
 #include "vm/compiler/backend/flow_graph_compiler.h"
+#include "vm/globals.h"  // Needed here to get TARGET_ARCH_XXX.
 
 #include "platform/utils.h"
 #include "vm/bit_vector.h"
@@ -66,6 +65,7 @@
 DECLARE_FLAG(int, reoptimization_counter_threshold);
 DECLARE_FLAG(int, stacktrace_every);
 DECLARE_FLAG(charp, stacktrace_filter);
+DECLARE_FLAG(int, gc_every);
 DECLARE_FLAG(bool, trace_compiler);
 
 // Assign locations to incoming arguments, i.e., values pushed above spill slots
@@ -241,16 +241,9 @@
 bool FlowGraphCompiler::ForceSlowPathForStackOverflow() const {
 #if !defined(PRODUCT)
   if ((FLAG_stacktrace_every > 0) || (FLAG_deoptimize_every > 0) ||
+      (FLAG_gc_every > 0) ||
       (isolate()->reload_every_n_stack_overflow_checks() > 0)) {
-    bool is_auxiliary_isolate = ServiceIsolate::IsServiceIsolate(isolate());
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    // Certain flags should not effect the kernel isolate itself.  They might be
-    // used by tests via the "VMOptions=--..." annotation to test VM
-    // functionality in the main isolate.
-    is_auxiliary_isolate =
-        is_auxiliary_isolate || KernelIsolate::IsKernelIsolate(isolate());
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-    if (!is_auxiliary_isolate) {
+    if (!Isolate::IsVMInternalIsolate(isolate())) {
       return true;
     }
   }
@@ -271,11 +264,11 @@
 bool FlowGraphCompiler::IsEmptyBlock(BlockEntryInstr* block) const {
   // Entry-points cannot be merged because they must have assembly
   // prologue emitted which should not be included in any block they jump to.
-  return !block->IsCatchBlockEntry() && !block->HasNonRedundantParallelMove() &&
+  return !block->IsGraphEntry() && !block->IsFunctionEntry() &&
+         !block->IsCatchBlockEntry() && !block->IsOsrEntry() &&
+         !block->IsIndirectEntry() && !block->HasNonRedundantParallelMove() &&
          block->next()->IsGoto() &&
-         !block->next()->AsGoto()->HasNonRedundantParallelMove() &&
-         !block->IsIndirectEntry() && !block->IsFunctionEntry() &&
-         !block->IsOsrEntry();
+         !block->next()->AsGoto()->HasNonRedundantParallelMove();
 }
 
 void FlowGraphCompiler::CompactBlock(BlockEntryInstr* block) {
@@ -325,6 +318,16 @@
 }
 
 intptr_t FlowGraphCompiler::UncheckedEntryOffset() const {
+  // On ARM64 we cannot use the position of the label bound in the
+  // FunctionEntryInstr, because `FunctionEntryInstr::EmitNativeCode` does not
+  // emit the monomorphic entry and frame entry (instead on ARM64 this is done
+  // in FlowGraphCompiler::CompileGraph()).
+  //
+  // See http://dartbug.com/34162
+#if defined(TARGET_ARCH_ARM64)
+  return 0;
+#endif
+
   BlockEntryInstr* entry = flow_graph().graph_entry()->unchecked_entry();
   if (entry == nullptr) {
     entry = flow_graph().graph_entry()->normal_entry();
@@ -342,7 +345,7 @@
   // Intrinsification happened.
 #ifdef DART_PRECOMPILER
   if (parsed_function().function().IsDynamicFunction()) {
-    return Instructions::kUncheckedEntryOffset;
+    return Instructions::kMonomorphicEntryOffset;
   }
 #endif
   return 0;
@@ -700,16 +703,40 @@
                                           null_check_name_idx);
 }
 
-void FlowGraphCompiler::AddStaticCallTarget(const Function& func) {
-  ASSERT(func.IsZoneHandle());
+void FlowGraphCompiler::AddPcRelativeCallTarget(const Function& function,
+                                                Code::EntryKind entry_kind) {
+  ASSERT(function.IsZoneHandle());
+  const auto entry_point = entry_kind == Code::EntryKind::kUnchecked
+                               ? Code::kUncheckedEntry
+                               : Code::kDefaultEntry;
   static_calls_target_table_.Add(
-      new (zone()) StaticCallsStruct(assembler()->CodeSize(), &func, NULL));
+      new (zone()) StaticCallsStruct(Code::kPcRelativeCall, entry_point,
+                                     assembler()->CodeSize(), &function, NULL));
+}
+
+void FlowGraphCompiler::AddPcRelativeCallStubTarget(const Code& stub_code) {
+  ASSERT(stub_code.IsZoneHandle() || stub_code.IsReadOnlyHandle());
+  ASSERT(!stub_code.IsNull());
+  static_calls_target_table_.Add(new (zone()) StaticCallsStruct(
+      Code::kPcRelativeCall, Code::kDefaultEntry, assembler()->CodeSize(), NULL,
+      &stub_code));
+}
+
+void FlowGraphCompiler::AddStaticCallTarget(const Function& func,
+                                            Code::EntryKind entry_kind) {
+  ASSERT(func.IsZoneHandle());
+  const auto entry_point = entry_kind == Code::EntryKind::kUnchecked
+                               ? Code::kUncheckedEntry
+                               : Code::kDefaultEntry;
+  static_calls_target_table_.Add(new (zone()) StaticCallsStruct(
+      Code::kCallViaCode, entry_point, assembler()->CodeSize(), &func, NULL));
 }
 
 void FlowGraphCompiler::AddStubCallTarget(const Code& code) {
-  ASSERT(code.IsZoneHandle());
+  ASSERT(code.IsZoneHandle() || code.IsReadOnlyHandle());
   static_calls_target_table_.Add(
-      new (zone()) StaticCallsStruct(assembler()->CodeSize(), NULL, &code));
+      new (zone()) StaticCallsStruct(Code::kCallViaCode, Code::kDefaultEntry,
+                                     assembler()->CodeSize(), NULL, &code));
 }
 
 CompilerDeoptInfo* FlowGraphCompiler::AddDeoptIndexAtCall(intptr_t deopt_id) {
@@ -1063,22 +1090,28 @@
 
 void FlowGraphCompiler::FinalizeStaticCallTargetsTable(const Code& code) {
   ASSERT(code.static_calls_target_table() == Array::null());
-  const Array& targets =
-      Array::Handle(zone(), Array::New((static_calls_target_table_.length() *
-                                        Code::kSCallTableEntryLength),
-                                       Heap::kOld));
-  Smi& smi_offset = Smi::Handle(zone());
-  for (intptr_t i = 0; i < static_calls_target_table_.length(); i++) {
-    const intptr_t target_ix = Code::kSCallTableEntryLength * i;
-    smi_offset = Smi::New(static_calls_target_table_[i]->offset);
-    targets.SetAt(target_ix + Code::kSCallTableOffsetEntry, smi_offset);
-    if (static_calls_target_table_[i]->function != NULL) {
-      targets.SetAt(target_ix + Code::kSCallTableFunctionEntry,
-                    *static_calls_target_table_[i]->function);
+  const auto& calls = static_calls_target_table_;
+  const intptr_t array_length = calls.length() * Code::kSCallTableEntryLength;
+  const auto& targets =
+      Array::Handle(zone(), Array::New(array_length, Heap::kOld));
+
+  StaticCallsTable entries(targets);
+  auto& kind_type_and_offset = Smi::Handle(zone());
+  for (intptr_t i = 0; i < calls.length(); i++) {
+    auto entry = calls[i];
+    kind_type_and_offset =
+        Smi::New(Code::KindField::encode(entry->call_kind) |
+                 Code::EntryPointField::encode(entry->entry_point) |
+                 Code::OffsetField::encode(entry->offset));
+    auto view = entries[i];
+    view.Set<Code::kSCallTableKindAndOffset>(kind_type_and_offset);
+    const Object* target = nullptr;
+    if (entry->function != nullptr) {
+      view.Set<Code::kSCallTableFunctionTarget>(*calls[i]->function);
     }
-    if (static_calls_target_table_[i]->code != NULL) {
-      targets.SetAt(target_ix + Code::kSCallTableCodeEntry,
-                    *static_calls_target_table_[i]->code);
+    if (entry->code != NULL) {
+      ASSERT(target == nullptr);
+      view.Set<Code::kSCallTableCodeTarget>(*calls[i]->code);
     }
   }
   code.set_static_calls_target_table(targets);
@@ -1192,10 +1225,10 @@
 #if !defined(TARGET_ARCH_DBC)
 void FlowGraphCompiler::GenerateCallWithDeopt(TokenPosition token_pos,
                                               intptr_t deopt_id,
-                                              const StubEntry& stub_entry,
+                                              const Code& stub,
                                               RawPcDescriptors::Kind kind,
                                               LocationSummary* locs) {
-  GenerateCall(token_pos, stub_entry, kind, locs);
+  GenerateCall(token_pos, stub, kind, locs);
   const intptr_t deopt_id_after = DeoptId::ToDeoptAfter(deopt_id);
   if (is_optimizing()) {
     AddDeoptIndexAtCall(deopt_id_after);
@@ -1206,31 +1239,31 @@
   }
 }
 
-static const StubEntry* StubEntryFor(const ICData& ic_data, bool optimized) {
+static const Code& StubEntryFor(const ICData& ic_data, bool optimized) {
   switch (ic_data.NumArgsTested()) {
     case 1:
 #if defined(TARGET_ARCH_X64)
       if (ic_data.IsTrackingExactness()) {
         if (optimized) {
-          return StubCode::
-              OneArgOptimizedCheckInlineCacheWithExactnessCheck_entry();
+          return StubCode::OneArgOptimizedCheckInlineCacheWithExactnessCheck();
         } else {
-          return StubCode::OneArgCheckInlineCacheWithExactnessCheck_entry();
+          return StubCode::OneArgCheckInlineCacheWithExactnessCheck();
         }
       }
 #else
       // TODO(dartbug.com/34170) Port exactness tracking to other platforms.
       ASSERT(!ic_data.IsTrackingExactness());
 #endif
-      return optimized ? StubCode::OneArgOptimizedCheckInlineCache_entry()
-                       : StubCode::OneArgCheckInlineCache_entry();
+      return optimized ? StubCode::OneArgOptimizedCheckInlineCache()
+                       : StubCode::OneArgCheckInlineCache();
     case 2:
       ASSERT(!ic_data.IsTrackingExactness());
-      return optimized ? StubCode::TwoArgsOptimizedCheckInlineCache_entry()
-                       : StubCode::TwoArgsCheckInlineCache_entry();
+      return optimized ? StubCode::TwoArgsOptimizedCheckInlineCache()
+                       : StubCode::TwoArgsCheckInlineCache();
     default:
+      ic_data.Print();
       UNIMPLEMENTED();
-      return nullptr;
+      return Code::Handle();
   }
 }
 
@@ -1243,7 +1276,7 @@
   if (FLAG_precompiled_mode) {
     // TODO(#34162): Support unchecked entry-points in precompiled mode.
     ic_data = ic_data.AsUnaryClassChecks();
-    EmitSwitchableInstanceCall(ic_data, deopt_id, token_pos, locs);
+    EmitSwitchableInstanceCall(ic_data, deopt_id, token_pos, locs, entry_kind);
     return;
   }
   ASSERT(!ic_data.IsNull());
@@ -1251,7 +1284,7 @@
     // Emit IC call that will count and thus may need reoptimization at
     // function entry.
     ASSERT(may_reoptimize() || flow_graph().IsCompiledForOsr());
-    EmitOptimizedInstanceCall(*StubEntryFor(ic_data, /*optimized=*/true),
+    EmitOptimizedInstanceCall(StubEntryFor(ic_data, /*optimized=*/true),
                               ic_data, deopt_id, token_pos, locs, entry_kind);
     return;
   }
@@ -1265,7 +1298,7 @@
     return;
   }
 
-  EmitInstanceCall(*StubEntryFor(ic_data, /*optimized=*/false), ic_data,
+  EmitInstanceCall(StubEntryFor(ic_data, /*optimized=*/false), ic_data,
                    deopt_id, token_pos, locs);
 }
 
@@ -1948,9 +1981,8 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *targets.TargetAt(smi_case)->target;
-    GenerateStaticDartCall(
-        deopt_id, token_index, *StubCode::CallStaticFunction_entry(),
-        RawPcDescriptors::kOther, locs, function, entry_kind);
+    GenerateStaticDartCall(deopt_id, token_index, RawPcDescriptors::kOther,
+                           locs, function, entry_kind);
     __ Drop(args_info.count_with_type_args);
     if (match_found != NULL) {
       __ Jump(match_found);
@@ -1999,9 +2031,8 @@
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
     const Function& function = *targets.TargetAt(i)->target;
-    GenerateStaticDartCall(
-        deopt_id, token_index, *StubCode::CallStaticFunction_entry(),
-        RawPcDescriptors::kOther, locs, function, entry_kind);
+    GenerateStaticDartCall(deopt_id, token_index, RawPcDescriptors::kOther,
+                           locs, function, entry_kind);
     __ Drop(args_info.count_with_type_args);
     if (!is_last_check || add_megamorphic_call) {
       __ Jump(match_found);
@@ -2090,7 +2121,7 @@
   // caller side!
   const Type& int_type = Type::Handle(zone(), Type::IntType());
   bool is_non_smi = false;
-  if (int_type.IsSubtypeOf(dst_type, NULL, NULL, Heap::kOld)) {
+  if (int_type.IsSubtypeOf(dst_type, Heap::kOld)) {
     __ BranchIfSmi(instance_reg, done);
     is_non_smi = true;
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 4c84b7b..f0c0af9 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -444,24 +444,24 @@
                            LocationSummary* locs);
 
   void GenerateCall(TokenPosition token_pos,
-                    const StubEntry& stub_entry,
+                    const Code& stub,
                     RawPcDescriptors::Kind kind,
                     LocationSummary* locs);
 
   void GenerateCallWithDeopt(TokenPosition token_pos,
                              intptr_t deopt_id,
-                             const StubEntry& stub_entry,
+                             const Code& stub,
                              RawPcDescriptors::Kind kind,
                              LocationSummary* locs);
 
   void GeneratePatchableCall(TokenPosition token_pos,
-                             const StubEntry& stub_entry,
+                             const Code& stub,
                              RawPcDescriptors::Kind kind,
                              LocationSummary* locs);
 
   void GenerateDartCall(intptr_t deopt_id,
                         TokenPosition token_pos,
-                        const StubEntry& stub_entry,
+                        const Code& stub,
                         RawPcDescriptors::Kind kind,
                         LocationSummary* locs,
                         Code::EntryKind entry_kind = Code::EntryKind::kNormal);
@@ -469,7 +469,6 @@
   void GenerateStaticDartCall(
       intptr_t deopt_id,
       TokenPosition token_pos,
-      const StubEntry& stub_entry,
       RawPcDescriptors::Kind kind,
       LocationSummary* locs,
       const Function& target,
@@ -529,14 +528,14 @@
                                      bool fall_through_if_inside = false);
 
   void EmitOptimizedInstanceCall(
-      const StubEntry& stub_entry,
+      const Code& stub,
       const ICData& ic_data,
       intptr_t deopt_id,
       TokenPosition token_pos,
       LocationSummary* locs,
       Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
-  void EmitInstanceCall(const StubEntry& stub_entry,
+  void EmitInstanceCall(const Code& stub,
                         const ICData& ic_data,
                         intptr_t deopt_id,
                         TokenPosition token_pos,
@@ -561,10 +560,12 @@
                                    intptr_t try_index,
                                    intptr_t slow_path_argument_count = 0);
 
-  void EmitSwitchableInstanceCall(const ICData& ic_data,
-                                  intptr_t deopt_id,
-                                  TokenPosition token_pos,
-                                  LocationSummary* locs);
+  void EmitSwitchableInstanceCall(
+      const ICData& ic_data,
+      intptr_t deopt_id,
+      TokenPosition token_pos,
+      LocationSummary* locs,
+      Code::EntryKind entry_kind = Code::EntryKind::kNormal);
 
   void EmitTestAndCall(const CallTargets& targets,
                        const String& function_name,
@@ -772,7 +773,11 @@
 
   void EmitFrameEntry();
 
-  void AddStaticCallTarget(const Function& function);
+  void AddPcRelativeCallTarget(const Function& function,
+                               Code::EntryKind entry_kind);
+  void AddPcRelativeCallStubTarget(const Code& stub_code);
+  void AddStaticCallTarget(const Function& function,
+                           Code::EntryKind entry_kind);
 
   void GenerateDeferredCode();
 
@@ -923,15 +928,24 @@
   // This struct contains either function or code, the other one being NULL.
   class StaticCallsStruct : public ZoneAllocated {
    public:
+    Code::CallKind call_kind;
+    Code::CallEntryPoint entry_point;
     const intptr_t offset;
     const Function* function;  // Can be NULL.
     const Code* code;          // Can be NULL.
-    StaticCallsStruct(intptr_t offset_arg,
+    StaticCallsStruct(Code::CallKind call_kind,
+                      Code::CallEntryPoint entry_point,
+                      intptr_t offset_arg,
                       const Function* function_arg,
                       const Code* code_arg)
-        : offset(offset_arg), function(function_arg), code(code_arg) {
+        : call_kind(call_kind),
+          entry_point(entry_point),
+          offset(offset_arg),
+          function(function_arg),
+          code(code_arg) {
       ASSERT((function == NULL) || function->IsZoneHandle());
-      ASSERT((code == NULL) || code->IsZoneHandle());
+      ASSERT((code == NULL) || code->IsZoneHandle() ||
+             code->IsReadOnlyHandle());
     }
 
    private:
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 729d9ff..c711b59 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -209,19 +209,19 @@
   if (test_kind == kTestTypeOneArg) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
-    __ BranchLink(*StubCode::Subtype1TestCache_entry());
+    __ BranchLink(StubCode::Subtype1TestCache());
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
-    __ BranchLink(*StubCode::Subtype2TestCache_entry());
+    __ BranchLink(StubCode::Subtype2TestCache());
   } else if (test_kind == kTestTypeFourArgs) {
     ASSERT(instantiator_type_arguments_reg == R2);
     ASSERT(function_type_arguments_reg == R1);
-    __ BranchLink(*StubCode::Subtype4TestCache_entry());
+    __ BranchLink(StubCode::Subtype4TestCache());
   } else if (test_kind == kTestTypeSixArgs) {
     ASSERT(instantiator_type_arguments_reg == R2);
     ASSERT(function_type_arguments_reg == R1);
-    __ BranchLink(*StubCode::Subtype6TestCache_entry());
+    __ BranchLink(StubCode::Subtype6TestCache());
   } else {
     UNREACHABLE();
   }
@@ -247,12 +247,8 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT(type_class.NumTypeArguments() > 0);
   const Register kInstanceReg = R0;
-  Error& bound_error = Error::Handle(zone());
   const Type& smi_type = Type::Handle(zone(), Type::SmiType());
-  const bool smi_is_ok =
-      smi_type.IsSubtypeOf(type, &bound_error, NULL, Heap::kOld);
-  // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || bound_error.IsNull());
+  const bool smi_is_ok = smi_type.IsSubtypeOf(type, Heap::kOld);
   __ tst(kInstanceReg, Operand(kSmiTagMask));
   if (smi_is_ok) {
     // Fast case for type = FutureOr<int/num/top-type>.
@@ -284,12 +280,11 @@
   if (type_arguments.Length() == 1) {
     const AbstractType& tp_argument =
         AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
-    ASSERT(!tp_argument.IsMalformed());
     if (tp_argument.IsType()) {
-      ASSERT(tp_argument.HasResolvedTypeClass());
+      ASSERT(tp_argument.HasTypeClass());
       // Check if type argument is dynamic, Object, or void.
       const Type& object_type = Type::Handle(zone(), Type::ObjectType());
-      if (object_type.IsSubtypeOf(tp_argument, NULL, NULL, Heap::kOld)) {
+      if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
         // Instance class test only necessary.
         return GenerateSubtype1TestCacheLookup(
             token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
@@ -339,9 +334,8 @@
   __ tst(kInstanceReg, Operand(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(Object::null_type_arguments(), type_class,
-                            Object::null_type_arguments(), NULL, NULL,
-                            Heap::kOld)) {
+  if (Class::IsSubtypeOf(smi_class, Object::null_type_arguments(), type_class,
+                         Object::null_type_arguments(), Heap::kOld)) {
     // Fast case for type = int/num/top-type.
     __ b(is_instance_lbl, EQ);
   } else {
@@ -349,7 +343,7 @@
   }
   const Register kClassIdReg = R2;
   __ LoadClassId(kClassIdReg, kInstanceReg);
-  // See ClassFinalizer::ResolveSuperTypeAndInterfaces for list of restricted
+  // See ClassFinalizer::CheckSuperTypeAndInterfaces for list of restricted
   // interfaces.
   // Bool interface can be implemented only by core class Bool.
   if (type.IsBoolType()) {
@@ -492,7 +486,7 @@
   }
   if (type.IsType()) {
     // Smi is FutureOr<T>, when T is a top type or int or num.
-    if (!FLAG_strong || !Class::Handle(type.type_class()).IsFutureOrClass()) {
+    if (!Class::Handle(type.type_class()).IsFutureOrClass()) {
       __ BranchIfSmi(kInstanceReg, is_not_instance_lbl);
     }
     __ ldm(IA, SP,
@@ -595,7 +589,7 @@
                                            intptr_t deopt_id,
                                            const AbstractType& type,
                                            LocationSummary* locs) {
-  ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+  ASSERT(type.IsFinalized());
   ASSERT(!type.IsObjectType() && !type.IsDynamicType() && !type.IsVoidType());
   const Register kInstantiatorTypeArgumentsReg = R2;
   const Register kFunctionTypeArgumentsReg = R1;
@@ -674,32 +668,11 @@
   ASSERT(!dst_type.IsNull());
   ASSERT(dst_type.IsFinalized());
   // Assignable check is skipped in FlowGraphBuilder, not here.
-  ASSERT(dst_type.IsMalformedOrMalbounded() ||
-         (!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
-          !dst_type.IsVoidType()));
+  ASSERT(!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
+         !dst_type.IsVoidType());
   const Register kInstantiatorTypeArgumentsReg = R2;
   const Register kFunctionTypeArgumentsReg = R1;
 
-  // Generate throw new TypeError() if the type is malformed or malbounded.
-  if (dst_type.IsMalformedOrMalbounded()) {
-    // A null object is always assignable and is returned as result.
-    Label is_assignable;
-    __ CompareObject(R0, Object::null_object());
-    __ b(&is_assignable, EQ);
-
-    __ PushObject(Object::null_object());  // Make room for the result.
-    __ Push(R0);                           // Push the source object.
-    __ PushObject(dst_name);               // Push the name of the destination.
-    __ PushObject(dst_type);               // Push the type of the destination.
-    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
-                        locs);
-    // We should never return here.
-    __ bkpt(0);
-
-    __ Bind(&is_assignable);  // For a null object.
-    return;
-  }
-
   if (ShouldUseTypeTestingStubFor(is_optimizing(), dst_type)) {
     GenerateAssertAssignableViaTypeTestingStub(token_pos, deopt_id, dst_type,
                                                dst_name, locs);
@@ -814,19 +787,23 @@
       extracted_method, ObjectPool::Patchability::kNotPatchable);
 
   // We use a custom pool register to preserve caller PP.
-  const Register kPoolReg = R0;
+  Register kPoolReg = R0;
 
   // R1 = extracted function
   // R4 = offset of type argument vector (or 0 if class is not generic)
-  __ LoadFieldFromOffset(kWord, kPoolReg, CODE_REG, Code::object_pool_offset());
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    kPoolReg = PP;
+  } else {
+    __ LoadFieldFromOffset(kWord, kPoolReg, CODE_REG,
+                           Code::object_pool_offset());
+  }
   __ LoadImmediate(R4, type_arguments_field_offset);
   __ LoadFieldFromOffset(kWord, R1, kPoolReg,
                          ObjectPool::element_offset(function_index));
   __ LoadFieldFromOffset(kWord, CODE_REG, kPoolReg,
                          ObjectPool::element_offset(stub_index));
-  __ LoadFieldFromOffset(kWord, R3, CODE_REG,
-                         Code::entry_point_offset(Code::EntryKind::kUnchecked));
-  __ bx(R3);
+  __ Branch(FieldAddress(
+      CODE_REG, Code::entry_point_offset(Code::EntryKind::kUnchecked)));
 }
 
 void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
@@ -860,9 +837,11 @@
       (!is_optimizing() || may_reoptimize())) {
     __ Comment("Invocation Count Check");
     const Register function_reg = R8;
-    // The pool pointer is not setup before entering the Dart frame.
-    // Temporarily setup pool pointer for this dart function.
-    __ LoadPoolPointer(new_pp);
+    if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+      // The pool pointer is not setup before entering the Dart frame.
+      // Temporarily setup pool pointer for this dart function.
+      __ LoadPoolPointer(new_pp);
+    }
     // Load function object from object pool.
     __ LoadFunctionFromCalleePool(function_reg, function, new_pp);
 
@@ -875,8 +854,8 @@
     }
     __ CompareImmediate(R3, GetOptimizationThreshold());
     ASSERT(function_reg == R8);
-    __ Branch(*StubCode::OptimizeFunction_entry(), ObjectPool::kNotPatchable,
-              new_pp, GE);
+    __ Branch(StubCode::OptimizeFunction(), ObjectPool::kNotPatchable, new_pp,
+              GE);
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -926,31 +905,13 @@
 //   R4: arguments descriptor array.
 void FlowGraphCompiler::CompileGraph() {
   InitCompiler();
-  if (FLAG_precompiled_mode) {
-    const Function& function = parsed_function().function();
-    if (function.IsDynamicFunction()) {
-      SpecialStatsBegin(CombinedCodeStatistics::kTagCheckedEntry);
-      __ MonomorphicCheckedEntry();
-      SpecialStatsEnd(CombinedCodeStatistics::kTagCheckedEntry);
-    }
 
-    // For JIT we have multiple entrypoints functionality which moved the
-    // intrinsification as well as the setup of the frame to the
-    // [TargetEntryInstr::EmitNativeCode].
-    if (TryIntrinsify()) {
-      // Skip regular code generation.
-      return;
-    }
-    EmitFrameEntry();
-    ASSERT(__ constant_pool_allowed());
-  } else {
-    // For JIT we have multiple entrypoints functionality which moved the frame
-    // setup into the [TargetEntryInstr] (which will set the constant pool
-    // allowed bit to true).  Despite this we still have to set the
-    // constant pool allowed bit to true here as well, because we can generate
-    // code for [CatchEntryInstr]s, which need the pool.
-    __ set_constant_pool_allowed(true);
-  }
+  // For JIT we have multiple entrypoints functionality which moved the frame
+  // setup into the [TargetEntryInstr] (which will set the constant pool
+  // allowed bit to true).  Despite this we still have to set the
+  // constant pool allowed bit to true here as well, because we can generate
+  // code for [CatchEntryInstr]s, which need the pool.
+  __ set_constant_pool_allowed(true);
 
   VisitBlocks();
 
@@ -960,46 +921,60 @@
 }
 
 void FlowGraphCompiler::GenerateCall(TokenPosition token_pos,
-                                     const StubEntry& stub_entry,
+                                     const Code& stub,
                                      RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  __ BranchLink(stub_entry);
-  EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
-  AddStubCallTarget(Code::ZoneHandle(stub_entry.code()));
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions && !stub.InVMHeap()) {
+    AddPcRelativeCallStubTarget(stub);
+    __ GenerateUnRelocatedPcRelativeCall();
+    EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
+  } else {
+    ASSERT(!stub.IsNull());
+    __ BranchLink(stub);
+    EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
+    AddStubCallTarget(stub);
+  }
 }
 
 void FlowGraphCompiler::GeneratePatchableCall(TokenPosition token_pos,
-                                              const StubEntry& stub_entry,
+                                              const Code& stub,
                                               RawPcDescriptors::Kind kind,
                                               LocationSummary* locs) {
-  __ BranchLinkPatchable(stub_entry);
+  __ BranchLinkPatchable(stub);
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
 }
 
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          TokenPosition token_pos,
-                                         const StubEntry& stub_entry,
+                                         const Code& stub,
                                          RawPcDescriptors::Kind kind,
                                          LocationSummary* locs,
                                          Code::EntryKind entry_kind) {
-  __ BranchLinkPatchable(stub_entry, entry_kind);
+  __ BranchLinkPatchable(stub, entry_kind);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
 }
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
                                                TokenPosition token_pos,
-                                               const StubEntry& stub_entry,
                                                RawPcDescriptors::Kind kind,
                                                LocationSummary* locs,
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
-  // Call sites to the same target can share object pool entries. These
-  // call sites are never patched for breakpoints: the function is deoptimized
-  // and the unoptimized code with IC calls for static calls is patched instead.
-  ASSERT(is_optimizing());
-  __ BranchLinkWithEquivalence(stub_entry, target, entry_kind);
-  EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
-  AddStaticCallTarget(target);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    AddPcRelativeCallTarget(target, entry_kind);
+    __ GenerateUnRelocatedPcRelativeCall();
+    EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
+  } else {
+    ASSERT(is_optimizing());
+    // Call sites to the same target can share object pool entries. These
+    // call sites are never patched for breakpoints: the function is deoptimized
+    // and the unoptimized code with IC calls for static calls is patched
+    // instead.
+    const auto& stub = StubCode::CallStaticFunction();
+    __ BranchLinkWithEquivalence(stub, target, entry_kind);
+    EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
+    AddStaticCallTarget(target, entry_kind);
+  }
 }
 
 void FlowGraphCompiler::GenerateRuntimeCall(TokenPosition token_pos,
@@ -1033,7 +1008,7 @@
 #endif  // DEBUG
 }
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const Code& stub,
                                                   const ICData& ic_data,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
@@ -1049,20 +1024,19 @@
 
   __ LoadObject(R8, parsed_function().function());
   __ LoadUniqueObject(R9, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs, entry_kind);
+  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
+                   entry_kind);
   __ Drop(ic_data.CountWithTypeArgs());
 }
 
-void FlowGraphCompiler::EmitInstanceCall(const StubEntry& stub_entry,
+void FlowGraphCompiler::EmitInstanceCall(const Code& stub,
                                          const ICData& ic_data,
                                          intptr_t deopt_id,
                                          TokenPosition token_pos,
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ LoadUniqueObject(R9, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
 }
 
@@ -1113,17 +1087,28 @@
 void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
                                                    intptr_t deopt_id,
                                                    TokenPosition token_pos,
-                                                   LocationSummary* locs) {
+                                                   LocationSummary* locs,
+                                                   Code::EntryKind entry_kind) {
+  ASSERT(entry_kind == Code::EntryKind::kNormal ||
+         entry_kind == Code::EntryKind::kUnchecked);
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub =
-      Code::ZoneHandle(StubCode::ICCallThroughFunction_entry()->code());
+  const Code& initial_stub = StubCode::ICCallThroughFunction();
 
   __ Comment("SwitchableCall");
   __ LoadFromOffset(kWord, R0, SP,
                     (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
-  __ LoadUniqueObject(CODE_REG, initial_stub);
-  __ ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset(
-                                        Code::EntryKind::kMonomorphic)));
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    // The AOT runtime will replace the slot in the object pool with the
+    // entrypoint address - see clustered_snapshot.cc.
+    __ LoadUniqueObject(LR, initial_stub);
+  } else {
+    __ LoadUniqueObject(CODE_REG, initial_stub);
+    const intptr_t entry_point_offset =
+        entry_kind == Code::EntryKind::kNormal
+            ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
+            : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
+    __ ldr(LR, FieldAddress(CODE_REG, entry_point_offset));
+  }
   __ LoadUniqueObject(R9, ic_data);
   __ blx(LR);
 
@@ -1137,10 +1122,10 @@
                                                   TokenPosition token_pos,
                                                   LocationSummary* locs,
                                                   const ICData& ic_data) {
-  const StubEntry* stub_entry =
+  const Code& stub =
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(R9, ic_data);
-  GenerateDartCall(deopt_id, token_pos, *stub_entry,
+  GenerateDartCall(deopt_id, token_pos, stub,
                    RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(count_with_type_args);
 }
@@ -1154,16 +1139,16 @@
     LocationSummary* locs,
     Code::EntryKind entry_kind) {
   ASSERT(!function.IsClosureFunction());
-  if (function.HasOptionalParameters() ||
-      (FLAG_reify_generic_functions && function.IsGeneric())) {
+  if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R4, arguments_descriptor);
   } else {
-    __ LoadImmediate(R4, 0);  // GC safe smi zero because of stub.
+    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+      __ LoadImmediate(R4, 0);  // GC safe smi zero because of stub.
+    }
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos,
-                         *StubCode::CallStaticFunction_entry(),
                          RawPcDescriptors::kOther, locs, function, entry_kind);
   __ Drop(count_with_type_args);
 }
@@ -1179,11 +1164,9 @@
     __ Push(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
-      __ BranchLinkPatchable(
-          *StubCode::OptimizedIdenticalWithNumberCheck_entry());
+      __ BranchLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
-      __ BranchLinkPatchable(
-          *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
+      __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
     AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
     // Stub returns result in flags (result of a cmp, we need Z computed).
@@ -1204,11 +1187,9 @@
     __ Push(left);
     __ Push(right);
     if (is_optimizing()) {
-      __ BranchLinkPatchable(
-          *StubCode::OptimizedIdenticalWithNumberCheck_entry());
+      __ BranchLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
-      __ BranchLinkPatchable(
-          *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
+      __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
     AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
     // Stub returns result in flags (result of a cmp, we need Z computed).
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 4812ac4..408f0c7 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -204,19 +204,19 @@
   if (test_kind == kTestTypeOneArg) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
-    __ BranchLink(*StubCode::Subtype1TestCache_entry());
+    __ BranchLink(StubCode::Subtype1TestCache());
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
-    __ BranchLink(*StubCode::Subtype2TestCache_entry());
+    __ BranchLink(StubCode::Subtype2TestCache());
   } else if (test_kind == kTestTypeFourArgs) {
     ASSERT(instantiator_type_arguments_reg == R1);
     ASSERT(function_type_arguments_reg == R2);
-    __ BranchLink(*StubCode::Subtype4TestCache_entry());
+    __ BranchLink(StubCode::Subtype4TestCache());
   } else if (test_kind == kTestTypeSixArgs) {
     ASSERT(instantiator_type_arguments_reg == R1);
     ASSERT(function_type_arguments_reg == R2);
-    __ BranchLink(*StubCode::Subtype6TestCache_entry());
+    __ BranchLink(StubCode::Subtype6TestCache());
   } else {
     UNREACHABLE();
   }
@@ -242,12 +242,8 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT(type_class.NumTypeArguments() > 0);
   const Register kInstanceReg = R0;
-  Error& bound_error = Error::Handle(zone());
   const Type& smi_type = Type::Handle(zone(), Type::SmiType());
-  const bool smi_is_ok =
-      smi_type.IsSubtypeOf(type, &bound_error, NULL, Heap::kOld);
-  // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || bound_error.IsNull());
+  const bool smi_is_ok = smi_type.IsSubtypeOf(type, Heap::kOld);
   // Fast case for type = FutureOr<int/num/top-type>.
   __ BranchIfSmi(kInstanceReg,
                  smi_is_ok ? is_instance_lbl : is_not_instance_lbl);
@@ -276,12 +272,10 @@
   if (type_arguments.Length() == 1) {
     const AbstractType& tp_argument =
         AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
-    ASSERT(!tp_argument.IsMalformed());
     if (tp_argument.IsType()) {
-      ASSERT(tp_argument.HasResolvedTypeClass());
       // Check if type argument is dynamic, Object, or void.
       const Type& object_type = Type::Handle(zone(), Type::ObjectType());
-      if (object_type.IsSubtypeOf(tp_argument, NULL, NULL, Heap::kOld)) {
+      if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
         // Instance class test only necessary.
         return GenerateSubtype1TestCacheLookup(
             token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
@@ -329,9 +323,8 @@
   const Register kInstanceReg = R0;
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(Object::null_type_arguments(), type_class,
-                            Object::null_type_arguments(), NULL, NULL,
-                            Heap::kOld)) {
+  if (Class::IsSubtypeOf(smi_class, Object::null_type_arguments(), type_class,
+                         Object::null_type_arguments(), Heap::kOld)) {
     // Fast case for type = int/num/top-type.
     __ BranchIfSmi(kInstanceReg, is_instance_lbl);
   } else {
@@ -339,7 +332,7 @@
   }
   const Register kClassIdReg = R2;
   __ LoadClassId(kClassIdReg, kInstanceReg);
-  // See ClassFinalizer::ResolveSuperTypeAndInterfaces for list of restricted
+  // See ClassFinalizer::CheckSuperTypeAndInterfaces for list of restricted
   // interfaces.
   // Bool interface can be implemented only by core class Bool.
   if (type.IsBoolType()) {
@@ -479,7 +472,7 @@
   }
   if (type.IsType()) {
     // Smi is FutureOr<T>, when T is a top type or int or num.
-    if (!FLAG_strong || !Class::Handle(type.type_class()).IsFutureOrClass()) {
+    if (!Class::Handle(type.type_class()).IsFutureOrClass()) {
       __ BranchIfSmi(kInstanceReg, is_not_instance_lbl);
     }
     __ ldp(kFunctionTypeArgumentsReg, kInstantiatorTypeArgumentsReg,
@@ -580,7 +573,7 @@
                                            intptr_t deopt_id,
                                            const AbstractType& type,
                                            LocationSummary* locs) {
-  ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
+  ASSERT(type.IsFinalized());
   ASSERT(!type.IsObjectType() && !type.IsDynamicType() && !type.IsVoidType());
   const Register kInstantiatorTypeArgumentsReg = R1;
   const Register kFunctionTypeArgumentsReg = R2;
@@ -658,32 +651,11 @@
   ASSERT(!dst_type.IsNull());
   ASSERT(dst_type.IsFinalized());
   // Assignable check is skipped in FlowGraphBuilder, not here.
-  ASSERT(dst_type.IsMalformedOrMalbounded() ||
-         (!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
-          !dst_type.IsVoidType()));
+  ASSERT(!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
+         !dst_type.IsVoidType());
   const Register kInstantiatorTypeArgumentsReg = R1;
   const Register kFunctionTypeArgumentsReg = R2;
 
-  // Generate throw new TypeError() if the type is malformed or malbounded.
-  if (dst_type.IsMalformedOrMalbounded()) {
-    // A null object is always assignable and is returned as result.
-    Label is_assignable, runtime_call;
-    __ CompareObject(R0, Object::null_object());
-    __ b(&is_assignable, EQ);
-
-    __ PushObject(Object::null_object());  // Make room for the result.
-    __ Push(R0);                           // Push the source object.
-    __ PushObject(dst_name);               // Push the name of the destination.
-    __ PushObject(dst_type);               // Push the type of the destination.
-    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
-                        locs);
-    // We should never return here.
-    __ brk(0);
-
-    __ Bind(&is_assignable);  // For a null object.
-    return;
-  }
-
   if (ShouldUseTypeTestingStubFor(is_optimizing(), dst_type)) {
     GenerateAssertAssignableViaTypeTestingStub(token_pos, deopt_id, dst_type,
                                                dst_name, locs);
@@ -794,17 +766,23 @@
       extracted_method, ObjectPool::Patchability::kNotPatchable);
 
   // We use a custom pool register to preserve caller PP.
-  const Register kPoolReg = R0;
+  Register kPoolReg = R0;
 
   // R1 = extracted function
   // R4 = offset of type argument vector (or 0 if class is not generic)
-  __ ldr(kPoolReg, FieldAddress(CODE_REG, Code::object_pool_offset()));
-  __ LoadFieldFromOffset(kPoolReg, CODE_REG, Code::object_pool_offset());
+  intptr_t pp_offset = 0;
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    // PP is not tagged on arm64.
+    kPoolReg = PP;
+    pp_offset = kHeapObjectTag;
+  } else {
+    __ LoadFieldFromOffset(kPoolReg, CODE_REG, Code::object_pool_offset());
+  }
   __ LoadImmediate(R4, type_arguments_field_offset);
-  __ LoadFieldFromOffset(R1, kPoolReg,
-                         ObjectPool::element_offset(function_index));
+  __ LoadFieldFromOffset(
+      R1, kPoolReg, ObjectPool::element_offset(function_index) + pp_offset);
   __ LoadFieldFromOffset(CODE_REG, kPoolReg,
-                         ObjectPool::element_offset(stub_index));
+                         ObjectPool::element_offset(stub_index) + pp_offset);
   __ LoadFieldFromOffset(R0, CODE_REG,
                          Code::entry_point_offset(Code::EntryKind::kUnchecked));
   __ br(R0);
@@ -841,9 +819,11 @@
     __ Comment("Invocation Count Check");
     const Register function_reg = R6;
     new_pp = R13;
-    // The pool pointer is not setup before entering the Dart frame.
-    // Temporarily setup pool pointer for this dart function.
-    __ LoadPoolPointer(new_pp);
+    if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+      // The pool pointer is not setup before entering the Dart frame.
+      // Temporarily setup pool pointer for this dart function.
+      __ LoadPoolPointer(new_pp);
+    }
 
     // Load function object using the callee's pool pointer.
     __ LoadFunctionFromCalleePool(function_reg, function, new_pp);
@@ -861,7 +841,7 @@
     ASSERT(function_reg == R6);
     Label dont_optimize;
     __ b(&dont_optimize, LT);
-    __ Branch(*StubCode::OptimizeFunction_entry(), new_pp);
+    __ Branch(StubCode::OptimizeFunction(), new_pp);
     __ Bind(&dont_optimize);
   }
   __ Comment("Enter frame");
@@ -937,48 +917,62 @@
 }
 
 void FlowGraphCompiler::GenerateCall(TokenPosition token_pos,
-                                     const StubEntry& stub_entry,
+                                     const Code& stub,
                                      RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  __ BranchLink(stub_entry);
-  EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
-  AddStubCallTarget(Code::ZoneHandle(stub_entry.code()));
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions && !stub.InVMHeap()) {
+    AddPcRelativeCallStubTarget(stub);
+    __ GenerateUnRelocatedPcRelativeCall();
+    EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
+  } else {
+    ASSERT(!stub.IsNull());
+    __ BranchLink(stub);
+    EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
+    AddStubCallTarget(stub);
+  }
 }
 
 void FlowGraphCompiler::GeneratePatchableCall(TokenPosition token_pos,
-                                              const StubEntry& stub_entry,
+                                              const Code& stub,
                                               RawPcDescriptors::Kind kind,
                                               LocationSummary* locs) {
-  __ BranchLinkPatchable(stub_entry);
+  __ BranchLinkPatchable(stub);
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
 }
 
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          TokenPosition token_pos,
-                                         const StubEntry& stub_entry,
+                                         const Code& stub,
                                          RawPcDescriptors::Kind kind,
                                          LocationSummary* locs,
                                          Code::EntryKind entry_kind) {
   // TODO(sjindel/entrypoints): Support multiple entrypoints on ARM64.
-  __ BranchLinkPatchable(stub_entry);
+  __ BranchLinkPatchable(stub);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
 }
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
                                                TokenPosition token_pos,
-                                               const StubEntry& stub_entry,
                                                RawPcDescriptors::Kind kind,
                                                LocationSummary* locs,
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
   // TODO(sjindel/entrypoints): Support multiple entrypoints on ARM64.
-  // Call sites to the same target can share object pool entries. These
-  // call sites are never patched for breakpoints: the function is deoptimized
-  // and the unoptimized code with IC calls for static calls is patched instead.
-  ASSERT(is_optimizing());
-  __ BranchLinkWithEquivalence(stub_entry, target);
-  EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
-  AddStaticCallTarget(target);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    AddPcRelativeCallTarget(target, entry_kind);
+    __ GenerateUnRelocatedPcRelativeCall();
+    EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
+  } else {
+    // Call sites to the same target can share object pool entries. These
+    // call sites are never patched for breakpoints: the function is deoptimized
+    // and the unoptimized code with IC calls for static calls is patched
+    // instead.
+    ASSERT(is_optimizing());
+    const auto& stub = StubCode::CallStaticFunction();
+    __ BranchLinkWithEquivalence(stub, target);
+    EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
+    AddStaticCallTarget(target, entry_kind);
+  }
 }
 
 void FlowGraphCompiler::GenerateRuntimeCall(TokenPosition token_pos,
@@ -1005,7 +999,7 @@
   __ StoreFieldToOffset(TMP, R0, Array::element_offset(edge_id));
 }
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const Code& stub,
                                                   const ICData& ic_data,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
@@ -1022,20 +1016,18 @@
 
   __ LoadObject(R6, parsed_function().function());
   __ LoadUniqueObject(R5, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
 }
 
-void FlowGraphCompiler::EmitInstanceCall(const StubEntry& stub_entry,
+void FlowGraphCompiler::EmitInstanceCall(const Code& stub,
                                          const ICData& ic_data,
                                          intptr_t deopt_id,
                                          TokenPosition token_pos,
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ LoadUniqueObject(R5, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
 }
 
@@ -1087,10 +1079,11 @@
 void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
                                                    intptr_t deopt_id,
                                                    TokenPosition token_pos,
-                                                   LocationSummary* locs) {
+                                                   LocationSummary* locs,
+                                                   Code::EntryKind entry_kind) {
+  // TODO(34162): Support multiple entry-points on ARM64.
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub =
-      Code::ZoneHandle(StubCode::ICCallThroughFunction_entry()->code());
+  const Code& initial_stub = StubCode::ICCallThroughFunction();
 
   auto& op = __ object_pool_wrapper();
 
@@ -1103,11 +1096,18 @@
       op.AddObject(initial_stub, ObjectPool::Patchability::kPatchable);
   ASSERT((ic_data_index + 1) == initial_stub_index);
 
-  __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                  ObjectPool::element_offset(ic_data_index));
-  __ ldr(TMP, FieldAddress(CODE_REG, Code::entry_point_offset(
-                                         Code::EntryKind::kMonomorphic)));
-  __ blr(TMP);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    // The AOT runtime will replace the slot in the object pool with the
+    // entrypoint address - see clustered_snapshot.cc.
+    __ LoadDoubleWordFromPoolOffset(R5, LR,
+                                    ObjectPool::element_offset(ic_data_index));
+  } else {
+    __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
+                                    ObjectPool::element_offset(ic_data_index));
+    __ ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset(
+                                          Code::EntryKind::kMonomorphic)));
+  }
+  __ blr(LR);
 
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, RawPcDescriptors::kOther,
                        locs);
@@ -1119,10 +1119,10 @@
                                                   TokenPosition token_pos,
                                                   LocationSummary* locs,
                                                   const ICData& ic_data) {
-  const StubEntry* stub_entry =
+  const Code& stub =
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(R5, ic_data);
-  GenerateDartCall(deopt_id, token_pos, *stub_entry,
+  GenerateDartCall(deopt_id, token_pos, stub,
                    RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(count_with_type_args);
 }
@@ -1137,16 +1137,16 @@
     Code::EntryKind entry_kind) {
   // TODO(sjindel/entrypoints): Support multiple entrypoints on ARM64.
   ASSERT(!function.IsClosureFunction());
-  if (function.HasOptionalParameters() ||
-      (FLAG_reify_generic_functions && function.IsGeneric())) {
+  if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R4, arguments_descriptor);
   } else {
-    __ LoadImmediate(R4, 0);  // GC safe smi zero because of stub.
+    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+      __ LoadImmediate(R4, 0);  // GC safe smi zero because of stub.
+    }
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos,
-                         *StubCode::CallStaticFunction_entry(),
                          RawPcDescriptors::kOther, locs, function);
   __ Drop(count_with_type_args);
 }
@@ -1162,11 +1162,9 @@
     __ Push(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
-      __ BranchLinkPatchable(
-          *StubCode::OptimizedIdenticalWithNumberCheck_entry());
+      __ BranchLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
-      __ BranchLinkPatchable(
-          *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
+      __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
     AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
     // Stub returns result in flags (result of a cmp, we need Z computed).
@@ -1187,11 +1185,9 @@
     __ Push(left);
     __ Push(right);
     if (is_optimizing()) {
-      __ BranchLinkPatchable(
-          *StubCode::OptimizedIdenticalWithNumberCheck_entry());
+      __ BranchLinkPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
-      __ BranchLinkPatchable(
-          *StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
+      __ BranchLinkPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
     AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
     // Stub returns result in flags (result of a cmp, we need Z computed).
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
index 009ecb9..b28c6cd 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
@@ -231,21 +231,17 @@
   __ PushConstant(dst_type);
   __ PushConstant(dst_name);
 
-  if (dst_type.IsMalformedOrMalbounded()) {
-    __ BadTypeError();
-  } else {
-    bool may_be_smi = false;
-    if (!dst_type.IsVoidType() && dst_type.IsInstantiated()) {
-      const Class& type_class = Class::Handle(zone(), dst_type.type_class());
-      if (type_class.NumTypeArguments() == 0) {
-        const Class& smi_class = Class::Handle(zone(), Smi::Class());
-        may_be_smi = smi_class.IsSubtypeOf(
-            TypeArguments::Handle(zone()), type_class,
-            TypeArguments::Handle(zone()), NULL, NULL, Heap::kOld);
-      }
+  bool may_be_smi = false;
+  if (!dst_type.IsVoidType() && dst_type.IsInstantiated()) {
+    const Class& type_class = Class::Handle(zone(), dst_type.type_class());
+    if (type_class.NumTypeArguments() == 0) {
+      const Class& smi_class = Class::Handle(zone(), Smi::Class());
+      may_be_smi = Class::IsSubtypeOf(smi_class, TypeArguments::Handle(zone()),
+                                      type_class, TypeArguments::Handle(zone()),
+                                      Heap::kOld);
     }
-    __ AssertAssignable(may_be_smi ? 1 : 0, __ AddConstant(test_cache));
   }
+  __ AssertAssignable(may_be_smi ? 1 : 0, __ AddConstant(test_cache));
 
   if (is_optimizing()) {
     // Register allocator does not think that our first input (also used as
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index f6dc95a..31be382 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -166,7 +166,7 @@
 
   ASSERT(deopt_env() != NULL);
   __ pushl(CODE_REG);
-  __ Call(*StubCode::Deoptimize_entry());
+  __ Call(StubCode::Deoptimize());
   set_pc_offset(assembler->CodeSize());
   __ int3();
 #undef __
@@ -210,21 +210,21 @@
     ASSERT(function_type_arguments_reg == kNoRegister);
     __ pushl(raw_null);
     __ pushl(raw_null);
-    __ Call(*StubCode::Subtype1TestCache_entry());
+    __ Call(StubCode::Subtype1TestCache());
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
     __ pushl(raw_null);
     __ pushl(raw_null);
-    __ Call(*StubCode::Subtype2TestCache_entry());
+    __ Call(StubCode::Subtype2TestCache());
   } else if (test_kind == kTestTypeFourArgs) {
     __ pushl(instantiator_type_arguments_reg);
     __ pushl(function_type_arguments_reg);
-    __ Call(*StubCode::Subtype4TestCache_entry());
+    __ Call(StubCode::Subtype4TestCache());
   } else if (test_kind == kTestTypeSixArgs) {
     __ pushl(instantiator_type_arguments_reg);
     __ pushl(function_type_arguments_reg);
-    __ Call(*StubCode::Subtype6TestCache_entry());
+    __ Call(StubCode::Subtype6TestCache());
   } else {
     UNREACHABLE();
   }
@@ -255,12 +255,8 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT(type_class.NumTypeArguments() > 0);
   const Register kInstanceReg = EAX;
-  Error& bound_error = Error::Handle(zone());
   const Type& smi_type = Type::Handle(zone(), Type::SmiType());
-  const bool smi_is_ok =
-      smi_type.IsSubtypeOf(type, &bound_error, NULL, Heap::kOld);
-  // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || bound_error.IsNull());
+  const bool smi_is_ok = smi_type.IsSubtypeOf(type, Heap::kOld);
   __ testl(kInstanceReg, Immediate(kSmiTagMask));
   if (smi_is_ok) {
     // Fast case for type = FutureOr<int/num/top-type>.
@@ -292,12 +288,10 @@
   if (type_arguments.Length() == 1) {
     const AbstractType& tp_argument =
         AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
-    ASSERT(!tp_argument.IsMalformed());
     if (tp_argument.IsType()) {
-      ASSERT(tp_argument.HasResolvedTypeClass());
       // Check if type argument is dynamic, Object, or void.
       const Type& object_type = Type::Handle(zone(), Type::ObjectType());
-      if (object_type.IsSubtypeOf(tp_argument, NULL, NULL, Heap::kOld)) {
+      if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
         // Instance class test only necessary.
         return GenerateSubtype1TestCacheLookup(
             token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
@@ -345,9 +339,8 @@
   __ testl(kInstanceReg, Immediate(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(Object::null_type_arguments(), type_class,
-                            Object::null_type_arguments(), NULL, NULL,
-                            Heap::kOld)) {
+  if (Class::IsSubtypeOf(smi_class, Object::null_type_arguments(), type_class,
+                         Object::null_type_arguments(), Heap::kOld)) {
     // Fast case for type = int/num/top-type.
     __ j(ZERO, is_instance_lbl);
   } else {
@@ -355,7 +348,7 @@
   }
   const Register kClassIdReg = ECX;
   __ LoadClassId(kClassIdReg, kInstanceReg);
-  // See ClassFinalizer::ResolveSuperTypeAndInterfaces for list of restricted
+  // See ClassFinalizer::CheckSuperTypeAndInterfaces for list of restricted
   // interfaces.
   // Bool interface can be implemented only by core class Bool.
   if (type.IsBoolType()) {
@@ -499,7 +492,7 @@
   }
   if (type.IsType()) {
     // Smi is FutureOr<T>, when T is a top type or int or num.
-    if (!FLAG_strong || !Class::Handle(type.type_class()).IsFutureOrClass()) {
+    if (!Class::Handle(type.type_class()).IsFutureOrClass()) {
       __ testl(kInstanceReg, Immediate(kSmiTagMask));  // Is instance Smi?
       __ j(ZERO, is_not_instance_lbl);
     }
@@ -602,7 +595,7 @@
                                            intptr_t deopt_id,
                                            const AbstractType& type,
                                            LocationSummary* locs) {
-  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
+  ASSERT(type.IsFinalized());
   ASSERT(!type.IsObjectType() && !type.IsDynamicType() && !type.IsVoidType());
 
   __ pushl(EDX);  // Store instantiator type arguments.
@@ -682,9 +675,8 @@
   ASSERT(!dst_type.IsNull());
   ASSERT(dst_type.IsFinalized());
   // Assignable check is skipped in FlowGraphBuilder, not here.
-  ASSERT(dst_type.IsMalformedOrMalbounded() ||
-         (!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
-          !dst_type.IsVoidType()));
+  ASSERT(!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
+         !dst_type.IsVoidType());
   __ pushl(EDX);  // Store instantiator type arguments.
   __ pushl(ECX);  // Store function type arguments.
   // A null object is always assignable and is returned as result.
@@ -694,23 +686,6 @@
   __ cmpl(EAX, raw_null);
   __ j(EQUAL, &is_assignable);
 
-  // Generate throw new TypeError() if the type is malformed or malbounded.
-  if (dst_type.IsMalformedOrMalbounded()) {
-    __ PushObject(Object::null_object());  // Make room for the result.
-    __ pushl(EAX);                         // Push the source object.
-    __ PushObject(dst_name);               // Push the name of the destination.
-    __ PushObject(dst_type);               // Push the type of the destination.
-    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
-                        locs);
-    // We should never return here.
-    __ int3();
-
-    __ Bind(&is_assignable);  // For a null object.
-    __ popl(ECX);             // Remove pushed function type arguments.
-    __ popl(EDX);             // Remove pushed instantiator type arguments.
-    return;
-  }
-
   // Generate inline type check, linking to runtime call if not assignable.
   SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle(zone());
   test_cache = GenerateInlineInstanceof(token_pos, dst_type, &is_assignable,
@@ -800,7 +775,7 @@
     __ cmpl(FieldAddress(function_reg, Function::usage_counter_offset()),
             Immediate(GetOptimizationThreshold()));
     ASSERT(function_reg == EBX);
-    __ J(GREATER_EQUAL, *StubCode::OptimizeFunction_entry());
+    __ J(GREATER_EQUAL, StubCode::OptimizeFunction());
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -856,36 +831,36 @@
 }
 
 void FlowGraphCompiler::GenerateCall(TokenPosition token_pos,
-                                     const StubEntry& stub_entry,
+                                     const Code& stub,
                                      RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  __ Call(stub_entry);
+  __ Call(stub);
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
-  AddStubCallTarget(Code::ZoneHandle(stub_entry.code()));
+  AddStubCallTarget(stub);
 }
 
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          TokenPosition token_pos,
-                                         const StubEntry& stub_entry,
+                                         const Code& stub,
                                          RawPcDescriptors::Kind kind,
                                          LocationSummary* locs,
                                          Code::EntryKind entry_kind) {
   // TODO(sjindel/entrypoints): Support multiple entrypoints on IA32.
-  __ Call(stub_entry);
+  __ Call(stub);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
 }
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
                                                TokenPosition token_pos,
-                                               const StubEntry& stub_entry,
                                                RawPcDescriptors::Kind kind,
                                                LocationSummary* locs,
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
   // TODO(sjindel/entrypoints): Support multiple entrypoints on IA32.
-  __ Call(stub_entry, true /* movable_target */);
+  const auto& stub = StubCode::CallStaticFunction();
+  __ Call(stub, true /* movable_target */);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
-  AddStaticCallTarget(target);
+  AddStaticCallTarget(target, entry_kind);
 }
 
 void FlowGraphCompiler::GenerateRuntimeCall(TokenPosition token_pos,
@@ -902,10 +877,10 @@
                                                   TokenPosition token_pos,
                                                   LocationSummary* locs,
                                                   const ICData& ic_data) {
-  const StubEntry& stub_entry =
-      *StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
+  const Code& stub =
+      StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(ECX, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry,
+  GenerateDartCall(deopt_id, token_pos, stub,
                    RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(count_with_type_args);
 }
@@ -922,7 +897,7 @@
   __ IncrementSmiField(FieldAddress(EAX, Array::element_offset(edge_id)), 1);
 }
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const Code& stub,
                                                   const ICData& ic_data,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
@@ -938,20 +913,18 @@
   // Pass the function explicitly, it is used in IC stub.
   __ LoadObject(EBX, parsed_function().function());
   __ LoadObject(ECX, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
 }
 
-void FlowGraphCompiler::EmitInstanceCall(const StubEntry& stub_entry,
+void FlowGraphCompiler::EmitInstanceCall(const Code& stub,
                                          const ICData& ic_data,
                                          intptr_t deopt_id,
                                          TokenPosition token_pos,
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   __ LoadObject(ECX, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
 }
 
@@ -995,7 +968,8 @@
 void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
                                                    intptr_t deopt_id,
                                                    TokenPosition token_pos,
-                                                   LocationSummary* locs) {
+                                                   LocationSummary* locs,
+                                                   Code::EntryKind entry_kind) {
   // Only generated with precompilation.
   UNREACHABLE();
 }
@@ -1009,8 +983,7 @@
     LocationSummary* locs,
     Code::EntryKind entry_kind) {
   // TODO(sjindel/entrypoints): Support multiple entrypoints on IA32.
-  if (function.HasOptionalParameters() ||
-      (FLAG_reify_generic_functions && function.IsGeneric())) {
+  if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(EDX, arguments_descriptor);
   } else {
     __ xorl(EDX, EDX);  // GC safe smi zero because of stub.
@@ -1018,7 +991,6 @@
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos,
-                         *StubCode::CallStaticFunction_entry(),
                          RawPcDescriptors::kOther, locs, function);
   __ Drop(count_with_type_args);
 }
@@ -1041,9 +1013,9 @@
     __ pushl(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
-      __ Call(*StubCode::OptimizedIdenticalWithNumberCheck_entry());
+      __ Call(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
-      __ Call(*StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
+      __ Call(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
     AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
@@ -1064,9 +1036,9 @@
     __ pushl(left);
     __ pushl(right);
     if (is_optimizing()) {
-      __ Call(*StubCode::OptimizedIdenticalWithNumberCheck_entry());
+      __ Call(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
-      __ Call(*StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
+      __ Call(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
     AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
     // Stub returns result in flags (result of a cmpl, we need ZF computed).
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 2471b4e..aa1c822 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -209,19 +209,19 @@
   if (test_kind == kTestTypeOneArg) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
-    __ Call(*StubCode::Subtype1TestCache_entry());
+    __ Call(StubCode::Subtype1TestCache());
   } else if (test_kind == kTestTypeTwoArgs) {
     ASSERT(instantiator_type_arguments_reg == kNoRegister);
     ASSERT(function_type_arguments_reg == kNoRegister);
-    __ Call(*StubCode::Subtype2TestCache_entry());
+    __ Call(StubCode::Subtype2TestCache());
   } else if (test_kind == kTestTypeFourArgs) {
     ASSERT(RDX == instantiator_type_arguments_reg);
     ASSERT(RCX == function_type_arguments_reg);
-    __ Call(*StubCode::Subtype4TestCache_entry());
+    __ Call(StubCode::Subtype4TestCache());
   } else if (test_kind == kTestTypeSixArgs) {
     ASSERT(RDX == instantiator_type_arguments_reg);
     ASSERT(RCX == function_type_arguments_reg);
-    __ Call(*StubCode::Subtype6TestCache_entry());
+    __ Call(StubCode::Subtype6TestCache());
   } else {
     UNREACHABLE();
   }
@@ -247,12 +247,8 @@
   const Class& type_class = Class::ZoneHandle(zone(), type.type_class());
   ASSERT(type_class.NumTypeArguments() > 0);
   const Register kInstanceReg = RAX;
-  Error& bound_error = Error::Handle(zone());
   const Type& smi_type = Type::Handle(zone(), Type::SmiType());
-  const bool smi_is_ok =
-      smi_type.IsSubtypeOf(type, &bound_error, NULL, Heap::kOld);
-  // Malformed type should have been handled at graph construction time.
-  ASSERT(smi_is_ok || bound_error.IsNull());
+  const bool smi_is_ok = smi_type.IsSubtypeOf(type, Heap::kOld);
   __ testq(kInstanceReg, Immediate(kSmiTagMask));
   if (smi_is_ok) {
     // Fast case for type = FutureOr<int/num/top-type>.
@@ -285,12 +281,11 @@
   if (type_arguments.Length() == 1) {
     const AbstractType& tp_argument =
         AbstractType::ZoneHandle(zone(), type_arguments.TypeAt(0));
-    ASSERT(!tp_argument.IsMalformed());
     if (tp_argument.IsType()) {
-      ASSERT(tp_argument.HasResolvedTypeClass());
+      ASSERT(tp_argument.HasTypeClass());
       // Check if type argument is dynamic, Object, or void.
       const Type& object_type = Type::Handle(zone(), Type::ObjectType());
-      if (object_type.IsSubtypeOf(tp_argument, NULL, NULL, Heap::kOld)) {
+      if (object_type.IsSubtypeOf(tp_argument, Heap::kOld)) {
         // Instance class test only necessary.
         return GenerateSubtype1TestCacheLookup(
             token_pos, type_class, is_instance_lbl, is_not_instance_lbl);
@@ -343,9 +338,8 @@
   __ testq(kInstanceReg, Immediate(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
-  if (smi_class.IsSubtypeOf(Object::null_type_arguments(), type_class,
-                            Object::null_type_arguments(), NULL, NULL,
-                            Heap::kOld)) {
+  if (Class::IsSubtypeOf(smi_class, Object::null_type_arguments(), type_class,
+                         Object::null_type_arguments(), Heap::kOld)) {
     // Fast case for type = int/num/top-type.
     __ j(ZERO, is_instance_lbl);
   } else {
@@ -353,7 +347,7 @@
   }
   const Register kClassIdReg = R10;
   __ LoadClassId(kClassIdReg, kInstanceReg);
-  // See ClassFinalizer::ResolveSuperTypeAndInterfaces for list of restricted
+  // See ClassFinalizer::CheckSuperTypeAndInterfaces for list of restricted
   // interfaces.
   // Bool interface can be implemented only by core class Bool.
   if (type.IsBoolType()) {
@@ -504,7 +498,7 @@
   }
   if (type.IsType()) {
     // Smi is FutureOr<T>, when T is a top type or int or num.
-    if (!FLAG_strong || !Class::Handle(type.type_class()).IsFutureOrClass()) {
+    if (!Class::Handle(type.type_class()).IsFutureOrClass()) {
       __ testq(kInstanceReg, Immediate(kSmiTagMask));  // Is instance Smi?
       __ j(ZERO, is_not_instance_lbl);
     }
@@ -602,7 +596,7 @@
                                            intptr_t deopt_id,
                                            const AbstractType& type,
                                            LocationSummary* locs) {
-  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
+  ASSERT(type.IsFinalized());
   ASSERT(!type.IsObjectType() && !type.IsDynamicType() && !type.IsVoidType());
 
   Label is_instance, is_not_instance;
@@ -674,33 +668,12 @@
   ASSERT(!dst_type.IsNull());
   ASSERT(dst_type.IsFinalized());
   // Assignable check is skipped in FlowGraphBuilder, not here.
-  ASSERT(dst_type.IsMalformedOrMalbounded() ||
-         (!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
-          !dst_type.IsVoidType()));
+  ASSERT(!dst_type.IsDynamicType() && !dst_type.IsObjectType() &&
+         !dst_type.IsVoidType());
 
   const Register kInstantiatorTypeArgumentsReg = RDX;
   const Register kFunctionTypeArgumentsReg = RCX;
 
-  // A null object is always assignable and is returned as result.
-  // Generate throw new TypeError() if the type is malformed or malbounded.
-  if (dst_type.IsMalformedOrMalbounded()) {
-    Label is_assignable;
-    __ CompareObject(RAX, Object::null_object());
-    __ j(EQUAL, &is_assignable);
-
-    __ PushObject(Object::null_object());  // Make room for the result.
-    __ pushq(RAX);                         // Push the source object.
-    __ PushObject(dst_name);               // Push the name of the destination.
-    __ PushObject(dst_type);               // Push the type of the destination.
-    GenerateRuntimeCall(token_pos, deopt_id, kBadTypeErrorRuntimeEntry, 3,
-                        locs);
-    // We should never return here.
-    __ int3();
-
-    __ Bind(&is_assignable);  // For a null object.
-    return;
-  }
-
   if (ShouldUseTypeTestingStubFor(is_optimizing(), dst_type)) {
     GenerateAssertAssignableViaTypeTestingStub(token_pos, deopt_id, dst_type,
                                                dst_name, locs);
@@ -804,6 +777,7 @@
 
   const Code& build_method_extractor = Code::ZoneHandle(
       isolate()->object_store()->build_method_extractor_code());
+  ASSERT(!build_method_extractor.IsNull());
 
   const intptr_t stub_index = __ object_pool_wrapper().AddObject(
       build_method_extractor, ObjectPool::Patchability::kNotPatchable);
@@ -811,11 +785,15 @@
       extracted_method, ObjectPool::Patchability::kNotPatchable);
 
   // We use a custom pool register to preserve caller PP.
-  const Register kPoolReg = RAX;
+  Register kPoolReg = RAX;
 
   // RBX = extracted function
   // RDX = offset of type argument vector (or 0 if class is not generic)
-  __ movq(kPoolReg, FieldAddress(CODE_REG, Code::object_pool_offset()));
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    kPoolReg = PP;
+  } else {
+    __ movq(kPoolReg, FieldAddress(CODE_REG, Code::object_pool_offset()));
+  }
   __ movq(RDX, Immediate(type_arguments_field_offset));
   __ movq(RBX,
           FieldAddress(kPoolReg, ObjectPool::element_offset(function_index)));
@@ -857,7 +835,9 @@
     __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
     const Register new_pp = R13;
-    __ LoadPoolPointer(new_pp);
+    if (!FLAG_precompiled_mode || !FLAG_use_bare_instructions) {
+      __ LoadPoolPointer(new_pp);
+    }
 
     const Function& function = parsed_function().function();
     if (CanOptimizeFunction() && function.IsOptimizable() &&
@@ -875,7 +855,7 @@
       __ cmpl(FieldAddress(function_reg, Function::usage_counter_offset()),
               Immediate(GetOptimizationThreshold()));
       ASSERT(function_reg == RDI);
-      __ J(GREATER_EQUAL, *StubCode::OptimizeFunction_entry(), new_pp);
+      __ J(GREATER_EQUAL, StubCode::OptimizeFunction(), new_pp);
     }
     ASSERT(StackSize() >= 0);
     __ Comment("Enter frame");
@@ -917,30 +897,12 @@
 void FlowGraphCompiler::CompileGraph() {
   InitCompiler();
 
-  if (FLAG_precompiled_mode) {
-    const Function& function = parsed_function().function();
-    if (function.IsDynamicFunction()) {
-      SpecialStatsBegin(CombinedCodeStatistics::kTagCheckedEntry);
-      __ MonomorphicCheckedEntry();
-      SpecialStatsEnd(CombinedCodeStatistics::kTagCheckedEntry);
-    }
-
-    // For JIT we have multiple entrypoints functionality which moved the
-    // intrinsification to the [TargetEntryInstr::EmitNativeCode].
-    if (TryIntrinsify()) {
-      // Skip regular code generation.
-      return;
-    }
-    EmitFrameEntry();
-    ASSERT(__ constant_pool_allowed());
-  } else {
-    // For JIT we have multiple entrypoints functionality which moved the frame
-    // setup into the [TargetEntryInstr] (which will set the constant pool
-    // allowed bit to true).  Despite this we still have to set the
-    // constant pool allowed bit to true here as well, because we can generate
-    // code for [CatchEntryInstr]s, which need the pool.
-    __ set_constant_pool_allowed(true);
-  }
+  // We have multiple entrypoints functionality which moved the frame
+  // setup into the [FunctionEntryInstr] (which will set the constant pool
+  // allowed bit to true).  Despite this we still have to set the
+  // constant pool allowed bit to true here as well, because we can generate
+  // code for [CatchEntryInstr]s, which need the pool.
+  __ set_constant_pool_allowed(true);
 
   ASSERT(!block_order().is_empty());
   VisitBlocks();
@@ -951,46 +913,60 @@
 }
 
 void FlowGraphCompiler::GenerateCall(TokenPosition token_pos,
-                                     const StubEntry& stub_entry,
+                                     const Code& stub,
                                      RawPcDescriptors::Kind kind,
                                      LocationSummary* locs) {
-  __ Call(stub_entry);
-  EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
-  AddStubCallTarget(Code::ZoneHandle(stub_entry.code()));
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions && !stub.InVMHeap()) {
+    AddPcRelativeCallStubTarget(stub);
+    __ GenerateUnRelocatedPcRelativeCall();
+    EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
+  } else {
+    ASSERT(!stub.IsNull());
+    __ Call(stub);
+    EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
+    AddStubCallTarget(stub);
+  }
 }
 
 void FlowGraphCompiler::GeneratePatchableCall(TokenPosition token_pos,
-                                              const StubEntry& stub_entry,
+                                              const Code& stub,
                                               RawPcDescriptors::Kind kind,
                                               LocationSummary* locs) {
-  __ CallPatchable(stub_entry);
+  __ CallPatchable(stub);
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, kind, locs);
 }
 
 void FlowGraphCompiler::GenerateDartCall(intptr_t deopt_id,
                                          TokenPosition token_pos,
-                                         const StubEntry& stub_entry,
+                                         const Code& stub,
                                          RawPcDescriptors::Kind kind,
                                          LocationSummary* locs,
                                          Code::EntryKind entry_kind) {
-  __ CallPatchable(stub_entry, entry_kind);
+  __ CallPatchable(stub, entry_kind);
   EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
 }
 
 void FlowGraphCompiler::GenerateStaticDartCall(intptr_t deopt_id,
                                                TokenPosition token_pos,
-                                               const StubEntry& stub_entry,
                                                RawPcDescriptors::Kind kind,
                                                LocationSummary* locs,
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
-  // Call sites to the same target can share object pool entries. These
-  // call sites are never patched for breakpoints: the function is deoptimized
-  // and the unoptimized code with IC calls for static calls is patched instead.
   ASSERT(is_optimizing());
-  __ CallWithEquivalence(stub_entry, target, entry_kind);
-  EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
-  AddStaticCallTarget(target);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    AddPcRelativeCallTarget(target, entry_kind);
+    __ GenerateUnRelocatedPcRelativeCall();
+    EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
+  } else {
+    // Call sites to the same target can share object pool entries. These
+    // call sites are never patched for breakpoints: the function is deoptimized
+    // and the unoptimized code with IC calls for static calls is patched
+    // instead.
+    const auto& stub_entry = StubCode::CallStaticFunction();
+    __ CallWithEquivalence(stub_entry, target, entry_kind);
+    EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
+    AddStaticCallTarget(target, entry_kind);
+  }
 }
 
 void FlowGraphCompiler::GenerateRuntimeCall(TokenPosition token_pos,
@@ -1007,10 +983,10 @@
                                                   TokenPosition token_pos,
                                                   LocationSummary* locs,
                                                   const ICData& ic_data) {
-  const StubEntry* stub_entry =
+  const Code& stub =
       StubCode::UnoptimizedStaticCallEntry(ic_data.NumArgsTested());
   __ LoadObject(RBX, ic_data);
-  GenerateDartCall(deopt_id, token_pos, *stub_entry,
+  GenerateDartCall(deopt_id, token_pos, stub,
                    RawPcDescriptors::kUnoptStaticCall, locs);
   __ Drop(count_with_type_args, RCX);
 }
@@ -1028,7 +1004,7 @@
   __ IncrementSmiField(FieldAddress(RAX, Array::element_offset(edge_id)), 1);
 }
 
-void FlowGraphCompiler::EmitOptimizedInstanceCall(const StubEntry& stub_entry,
+void FlowGraphCompiler::EmitOptimizedInstanceCall(const Code& stub,
                                                   const ICData& ic_data,
                                                   intptr_t deopt_id,
                                                   TokenPosition token_pos,
@@ -1043,20 +1019,19 @@
   // Pass the function explicitly, it is used in IC stub.
   __ LoadObject(RDI, parsed_function().function());
   __ LoadUniqueObject(RBX, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs, entry_kind);
+  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
+                   entry_kind);
   __ Drop(ic_data.CountWithTypeArgs(), RCX);
 }
 
-void FlowGraphCompiler::EmitInstanceCall(const StubEntry& stub_entry,
+void FlowGraphCompiler::EmitInstanceCall(const Code& stub,
                                          const ICData& ic_data,
                                          intptr_t deopt_id,
                                          TokenPosition token_pos,
                                          LocationSummary* locs) {
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ LoadUniqueObject(RBX, ic_data);
-  GenerateDartCall(deopt_id, token_pos, stub_entry, RawPcDescriptors::kIcCall,
-                   locs);
+  GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs(), RCX);
 }
 
@@ -1105,16 +1080,27 @@
 void FlowGraphCompiler::EmitSwitchableInstanceCall(const ICData& ic_data,
                                                    intptr_t deopt_id,
                                                    TokenPosition token_pos,
-                                                   LocationSummary* locs) {
+                                                   LocationSummary* locs,
+                                                   Code::EntryKind entry_kind) {
+  ASSERT(entry_kind == Code::EntryKind::kNormal ||
+         entry_kind == Code::EntryKind::kUnchecked);
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub =
-      Code::ZoneHandle(StubCode::ICCallThroughFunction_entry()->code());
+  const Code& initial_stub = StubCode::ICCallThroughFunction();
 
   __ Comment("SwitchableCall");
   __ movq(RDI, Address(RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
-  __ LoadUniqueObject(CODE_REG, initial_stub);
-  __ movq(RCX, FieldAddress(CODE_REG, Code::entry_point_offset(
-                                          Code::EntryKind::kMonomorphic)));
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    // The AOT runtime will replace the slot in the object pool with the
+    // entrypoint address - see clustered_snapshot.cc.
+    __ LoadUniqueObject(RCX, initial_stub);
+  } else {
+    intptr_t entry_point_offset =
+        entry_kind == Code::EntryKind::kNormal
+            ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
+            : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
+    __ LoadUniqueObject(CODE_REG, initial_stub);
+    __ movq(RCX, FieldAddress(CODE_REG, entry_point_offset));
+  }
   __ LoadUniqueObject(RBX, ic_data);
   __ call(RCX);
 
@@ -1131,16 +1117,16 @@
     LocationSummary* locs,
     Code::EntryKind entry_kind) {
   ASSERT(!function.IsClosureFunction());
-  if (function.HasOptionalParameters() ||
-      (FLAG_reify_generic_functions && function.IsGeneric())) {
+  if (function.HasOptionalParameters() || function.IsGeneric()) {
     __ LoadObject(R10, arguments_descriptor);
   } else {
-    __ xorl(R10, R10);  // GC safe smi zero because of stub.
+    if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+      __ xorl(R10, R10);  // GC safe smi zero because of stub.
+    }
   }
   // Do not use the code from the function, but let the code be patched so that
   // we can record the outgoing edges to other code.
   GenerateStaticDartCall(deopt_id, token_pos,
-                         *StubCode::CallStaticFunction_entry(),
                          RawPcDescriptors::kOther, locs, function, entry_kind);
   __ Drop(count_with_type_args, RCX);
 }
@@ -1163,9 +1149,9 @@
     __ pushq(reg);
     __ PushObject(obj);
     if (is_optimizing()) {
-      __ CallPatchable(*StubCode::OptimizedIdenticalWithNumberCheck_entry());
+      __ CallPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
-      __ CallPatchable(*StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
+      __ CallPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
     AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
     // Stub returns result in flags (result of a cmpq, we need ZF computed).
@@ -1186,9 +1172,9 @@
     __ pushq(left);
     __ pushq(right);
     if (is_optimizing()) {
-      __ CallPatchable(*StubCode::OptimizedIdenticalWithNumberCheck_entry());
+      __ CallPatchable(StubCode::OptimizedIdenticalWithNumberCheck());
     } else {
-      __ CallPatchable(*StubCode::UnoptimizedIdenticalWithNumberCheck_entry());
+      __ CallPatchable(StubCode::UnoptimizedIdenticalWithNumberCheck());
     }
     AddCurrentDescriptor(RawPcDescriptors::kRuntimeCall, deopt_id, token_pos);
     // Stub returns result in flags (result of a cmpq, we need ZF computed).
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 9688cae..65d80af 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -187,7 +187,7 @@
     bool test_succeded = false;
     if (use_subtype_test) {
       cls_type = cls.RareType();
-      test_succeded = cls_type.IsSubtypeOf(dst_type, NULL, NULL, Heap::kNew);
+      test_succeded = cls_type.IsSubtypeOf(dst_type, Heap::kNew);
     } else {
       while (!cls.IsObjectClass()) {
         if (cls.raw() == klass.raw()) {
@@ -311,7 +311,7 @@
 }
 
 bool HierarchyInfo::CanUseSubtypeRangeCheckFor(const AbstractType& type) {
-  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
+  ASSERT(type.IsFinalized());
 
   if (!type.IsInstantiated() || !type.IsType() || type.IsFunctionType() ||
       type.IsDartFunctionType()) {
@@ -354,7 +354,7 @@
 
 bool HierarchyInfo::CanUseGenericSubtypeRangeCheckFor(
     const AbstractType& type) {
-  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
+  ASSERT(type.IsFinalized());
 
   if (!type.IsType() || type.IsFunctionType() || type.IsDartFunctionType()) {
     return false;
@@ -463,11 +463,16 @@
 
 Definition* Definition::OriginalDefinition() {
   Definition* defn = this;
-  while (defn->IsRedefinition() || defn->IsAssertAssignable()) {
+  while (defn->IsRedefinition() || defn->IsAssertAssignable() ||
+         defn->IsCheckArrayBound() || defn->IsGenericCheckBound()) {
     if (defn->IsRedefinition()) {
       defn = defn->AsRedefinition()->value()->definition();
-    } else {
+    } else if (defn->IsAssertAssignable()) {
       defn = defn->AsAssertAssignable()->value()->definition();
+    } else if (defn->IsCheckArrayBound()) {
+      defn = defn->AsCheckArrayBound()->index()->definition();
+    } else {
+      defn = defn->AsGenericCheckBound()->index()->definition();
     }
   }
   return defn;
@@ -735,103 +740,19 @@
   return mask;
 }
 
-const NativeFieldDesc* NativeFieldDesc::Get(Kind kind) {
-  static const NativeFieldDesc fields[] = {
-#define IMMUTABLE true
-#define MUTABLE false
-#define DEFINE_NATIVE_FIELD(ClassName, FieldName, cid, mutability)             \
-  NativeFieldDesc(k##ClassName##_##FieldName, ClassName::FieldName##_offset(), \
-                  k##cid##Cid, mutability),
-
-      NATIVE_FIELDS_LIST(DEFINE_NATIVE_FIELD)
-
-#undef DEFINE_FIELD
-#undef MUTABLE
-#undef IMMUTABLE
-  };
-
-  return &fields[kind];
-}
-
-const NativeFieldDesc* NativeFieldDesc::GetLengthFieldForArrayCid(
-    intptr_t array_cid) {
-  if (RawObject::IsExternalTypedDataClassId(array_cid) ||
-      RawObject::IsTypedDataClassId(array_cid)) {
-    return Get(kTypedData_length);
-  }
-
-  switch (array_cid) {
-    case kGrowableObjectArrayCid:
-      return Get(kGrowableObjectArray_length);
-
-    case kOneByteStringCid:
-    case kTwoByteStringCid:
-    case kExternalOneByteStringCid:
-    case kExternalTwoByteStringCid:
-      return Get(kString_length);
-
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return Get(kArray_length);
-
-    default:
-      UNREACHABLE();
-      return nullptr;
-  }
-}
-
-const NativeFieldDesc* NativeFieldDesc::GetTypeArgumentsField(Zone* zone,
-                                                              intptr_t offset) {
-  // TODO(vegorov) consider caching type arguments fields for specific classes
-  // in some sort of a flow-graph specific cache.
-  ASSERT(offset != Class::kNoTypeArguments);
-  return new (zone) NativeFieldDesc(kTypeArguments, offset, kDynamicCid,
-                                    /*immutable=*/true);
-}
-
-const NativeFieldDesc* NativeFieldDesc::GetTypeArgumentsFieldFor(
-    Zone* zone,
-    const Class& cls) {
-  return GetTypeArgumentsField(zone, cls.type_arguments_field_offset());
-}
-
-RawAbstractType* NativeFieldDesc::type() const {
-  if (cid() == kSmiCid) {
-    return Type::SmiType();
-  }
-
-  return Type::DynamicType();
-}
-
-const char* NativeFieldDesc::name() const {
-  switch (kind()) {
-#define HANDLE_CASE(ClassName, FieldName, cid, mutability)                     \
-  case k##ClassName##_##FieldName:                                             \
-    return #ClassName "." #FieldName;
-
-    NATIVE_FIELDS_LIST(HANDLE_CASE)
-
-#undef HANDLE_CASE
-    case kTypeArguments:
-      return ":type_arguments";
-  }
-  UNREACHABLE();
-  return nullptr;
-}
-
 bool LoadFieldInstr::IsUnboxedLoad() const {
-  return FLAG_unbox_numeric_fields && (field() != NULL) &&
-         FlowGraphCompiler::IsUnboxedField(*field());
+  return FLAG_unbox_numeric_fields && slot().IsDartField() &&
+         FlowGraphCompiler::IsUnboxedField(slot().field());
 }
 
 bool LoadFieldInstr::IsPotentialUnboxedLoad() const {
-  return FLAG_unbox_numeric_fields && (field() != NULL) &&
-         FlowGraphCompiler::IsPotentialUnboxedField(*field());
+  return FLAG_unbox_numeric_fields && slot().IsDartField() &&
+         FlowGraphCompiler::IsPotentialUnboxedField(slot().field());
 }
 
 Representation LoadFieldInstr::representation() const {
   if (IsUnboxedLoad()) {
-    const intptr_t cid = field()->UnboxedFieldCid();
+    const intptr_t cid = slot().field().UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         return kUnboxedDouble;
@@ -847,20 +768,20 @@
 }
 
 bool StoreInstanceFieldInstr::IsUnboxedStore() const {
-  return FLAG_unbox_numeric_fields && !field().IsNull() &&
-         FlowGraphCompiler::IsUnboxedField(field());
+  return FLAG_unbox_numeric_fields && slot().IsDartField() &&
+         FlowGraphCompiler::IsUnboxedField(slot().field());
 }
 
 bool StoreInstanceFieldInstr::IsPotentialUnboxedStore() const {
-  return FLAG_unbox_numeric_fields && !field().IsNull() &&
-         FlowGraphCompiler::IsPotentialUnboxedField(field());
+  return FLAG_unbox_numeric_fields && slot().IsDartField() &&
+         FlowGraphCompiler::IsPotentialUnboxedField(slot().field());
 }
 
 Representation StoreInstanceFieldInstr::RequiredInputRepresentation(
     intptr_t index) const {
   ASSERT((index == 0) || (index == 1));
   if ((index == 1) && IsUnboxedStore()) {
-    const intptr_t cid = field().UnboxedFieldCid();
+    const intptr_t cid = slot().field().UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         return kUnboxedDouble;
@@ -918,13 +839,11 @@
     const TypeArguments& function_type_args = TypeArguments::Handle(
         Z, TypeArguments::RawCast(constant_function_type_args->value().raw()));
 
-    Error& error_bound = Error::Handle(Z);
-
     AbstractType& sub_type = AbstractType::Handle(Z, sub_type_.raw());
     AbstractType& super_type = AbstractType::Handle(Z, super_type_.raw());
-    if (AbstractType::InstantiateAndTestSubtype(
-            &sub_type, &super_type, &error_bound, instantiator_type_args,
-            function_type_args)) {
+    if (AbstractType::InstantiateAndTestSubtype(&sub_type, &super_type,
+                                                instantiator_type_args,
+                                                function_type_args)) {
       return NULL;
     }
   }
@@ -963,12 +882,7 @@
 bool LoadFieldInstr::AttributesEqual(Instruction* other) const {
   LoadFieldInstr* other_load = other->AsLoadField();
   ASSERT(other_load != NULL);
-  if (field() != NULL) {
-    return (other_load->field() != NULL) &&
-           (field()->raw() == other_load->field()->raw());
-  }
-  return (other_load->field() == NULL) &&
-         (offset_in_bytes() == other_load->offset_in_bytes());
+  return &this->slot_ == &other_load->slot_;
 }
 
 Instruction* InitStaticFieldInstr::Canonicalize(FlowGraph* flow_graph) {
@@ -1600,6 +1514,10 @@
   return loop_info_ != nullptr && loop_info_->header() == this;
 }
 
+intptr_t BlockEntryInstr::NestingDepth() const {
+  return loop_info_ == nullptr ? 0 : loop_info_->NestingDepth();
+}
+
 // Helper to mutate the graph during inlining. This block should be
 // replaced with new_block as a predecessor of all of this block's
 // successors.  For each successor, the predecessors will be reordered
@@ -2167,7 +2085,12 @@
     case kUnboxedInt64:
       return value.IsSmi() || value.IsMint();
 
-    case kUnboxedUint32:  // Only truncating Uint32 arithmetic is supported.
+    case kUnboxedUint32:
+      if (value.IsSmi() || value.IsMint()) {
+        return Utils::IsUint(32, value.AsInt64Value());
+      }
+      return false;
+
     default:
       UNREACHABLE();
   }
@@ -2569,26 +2492,37 @@
 }
 
 bool LoadFieldInstr::IsImmutableLengthLoad() const {
-  if (native_field() != nullptr) {
-    switch (native_field()->kind()) {
-      case NativeFieldDesc::kArray_length:
-      case NativeFieldDesc::kTypedData_length:
-      case NativeFieldDesc::kString_length:
-        return true;
-      case NativeFieldDesc::kGrowableObjectArray_length:
-        return false;
+  switch (slot().kind()) {
+    case Slot::Kind::kArray_length:
+    case Slot::Kind::kTypedData_length:
+    case Slot::Kind::kString_length:
+      return true;
+    case Slot::Kind::kGrowableObjectArray_length:
+      return false;
 
-      // Not length loads.
-      case NativeFieldDesc::kLinkedHashMap_index:
-      case NativeFieldDesc::kLinkedHashMap_data:
-      case NativeFieldDesc::kLinkedHashMap_hash_mask:
-      case NativeFieldDesc::kLinkedHashMap_used_data:
-      case NativeFieldDesc::kLinkedHashMap_deleted_keys:
-      case NativeFieldDesc::kArgumentsDescriptor_type_args_len:
-      case NativeFieldDesc::kTypeArguments:
-        return false;
-    }
+    // Not length loads.
+    case Slot::Kind::kLinkedHashMap_index:
+    case Slot::Kind::kLinkedHashMap_data:
+    case Slot::Kind::kLinkedHashMap_hash_mask:
+    case Slot::Kind::kLinkedHashMap_used_data:
+    case Slot::Kind::kLinkedHashMap_deleted_keys:
+    case Slot::Kind::kArgumentsDescriptor_type_args_len:
+    case Slot::Kind::kArgumentsDescriptor_positional_count:
+    case Slot::Kind::kArgumentsDescriptor_count:
+    case Slot::Kind::kTypeArguments:
+    case Slot::Kind::kGrowableObjectArray_data:
+    case Slot::Kind::kContext_parent:
+    case Slot::Kind::kClosure_context:
+    case Slot::Kind::kClosure_delayed_type_arguments:
+    case Slot::Kind::kClosure_function:
+    case Slot::Kind::kClosure_function_type_arguments:
+    case Slot::Kind::kClosure_instantiator_type_arguments:
+    case Slot::Kind::kClosure_hash:
+    case Slot::Kind::kCapturedVariable:
+    case Slot::Kind::kDartField:
+      return false;
   }
+  UNREACHABLE();
   return false;
 }
 
@@ -2618,42 +2552,54 @@
   return this;
 }
 
-bool LoadFieldInstr::Evaluate(const Object& instance, Object* result) {
-  if (native_field() != nullptr) {
-    switch (native_field()->kind()) {
-      case NativeFieldDesc::kArgumentsDescriptor_type_args_len:
-        if (instance.IsArray() && Array::Cast(instance).IsImmutable()) {
-          ArgumentsDescriptor desc(Array::Cast(instance));
-          *result = Smi::New(desc.TypeArgsLen());
-          return true;
-        }
-        return false;
+bool LoadFieldInstr::TryEvaluateLoad(const Object& instance,
+                                     const Slot& field,
+                                     Object* result) {
+  switch (field.kind()) {
+    case Slot::Kind::kDartField:
+      return TryEvaluateLoad(instance, field.field(), result);
 
-      default:
-        break;
-    }
+    case Slot::Kind::kArgumentsDescriptor_type_args_len:
+      if (instance.IsArray() && Array::Cast(instance).IsImmutable()) {
+        ArgumentsDescriptor desc(Array::Cast(instance));
+        *result = Smi::New(desc.TypeArgsLen());
+        return true;
+      }
+      return false;
+
+    default:
+      break;
   }
+  return false;
+}
 
-  if (field() == nullptr || !field()->is_final() || !instance.IsInstance()) {
+bool LoadFieldInstr::TryEvaluateLoad(const Object& instance,
+                                     const Field& field,
+                                     Object* result) {
+  if (!field.is_final() || !instance.IsInstance()) {
     return false;
   }
 
   // Check that instance really has the field which we
   // are trying to load from.
   Class& cls = Class::Handle(instance.clazz());
-  while (cls.raw() != Class::null() && cls.raw() != field()->Owner()) {
+  while (cls.raw() != Class::null() && cls.raw() != field.Owner()) {
     cls = cls.SuperClass();
   }
-  if (cls.raw() != field()->Owner()) {
+  if (cls.raw() != field.Owner()) {
     // Failed to find the field in class or its superclasses.
     return false;
   }
 
   // Object has the field: execute the load.
-  *result = Instance::Cast(instance).GetField(*field());
+  *result = Instance::Cast(instance).GetField(field);
   return true;
 }
 
+bool LoadFieldInstr::Evaluate(const Object& instance, Object* result) {
+  return TryEvaluateLoad(instance, slot(), result);
+}
+
 Definition* LoadFieldInstr::Canonicalize(FlowGraph* flow_graph) {
   if (!HasUses()) return nullptr;
 
@@ -2668,21 +2614,21 @@
         return call->ArgumentAt(1);
       }
     } else if (CreateArrayInstr* create_array = array->AsCreateArray()) {
-      if (native_field() == NativeFieldDesc::Array_length()) {
+      if (slot().kind() == Slot::Kind::kArray_length) {
         return create_array->num_elements()->definition();
       }
     } else if (LoadFieldInstr* load_array = array->AsLoadField()) {
       // For arrays with guarded lengths, replace the length load
       // with a constant.
-      if (const Field* field = load_array->field()) {
-        if (field->guarded_list_length() >= 0) {
+      const Slot& slot = load_array->slot();
+      if (slot.IsDartField()) {
+        if (slot.field().guarded_list_length() >= 0) {
           return flow_graph->GetConstant(
-              Smi::Handle(Smi::New(field->guarded_list_length())));
+              Smi::Handle(Smi::New(slot.field().guarded_list_length())));
         }
       }
     }
-  } else if (native_field() != nullptr &&
-             native_field()->kind() == NativeFieldDesc::kTypeArguments) {
+  } else if (slot().IsTypeArguments()) {
     Definition* array = instance()->definition()->OriginalDefinition();
     if (StaticCallInstr* call = array->AsStaticCall()) {
       if (call->is_known_list_constructor()) {
@@ -2694,18 +2640,24 @@
     } else if (CreateArrayInstr* create_array = array->AsCreateArray()) {
       return create_array->element_type()->definition();
     } else if (LoadFieldInstr* load_array = array->AsLoadField()) {
-      const Field* field = load_array->field();
-      // For trivially exact fields we know that type arguments match
-      // static type arguments exactly.
-      if ((field != nullptr) &&
-          field->static_type_exactness_state().IsTriviallyExact()) {
-        return flow_graph->GetConstant(TypeArguments::Handle(
-            AbstractType::Handle(field->type()).arguments()));
-      } else if (const NativeFieldDesc* native_field =
-                     load_array->native_field()) {
-        if (native_field == NativeFieldDesc::LinkedHashMap_data()) {
-          return flow_graph->constant_null();
+      const Slot& slot = load_array->slot();
+      switch (slot.kind()) {
+        case Slot::Kind::kDartField: {
+          // For trivially exact fields we know that type arguments match
+          // static type arguments exactly.
+          const Field& field = slot.field();
+          if (field.static_type_exactness_state().IsTriviallyExact()) {
+            return flow_graph->GetConstant(TypeArguments::Handle(
+                AbstractType::Handle(field.type()).arguments()));
+          }
+          break;
         }
+
+        case Slot::Kind::kLinkedHashMap_data:
+          return flow_graph->constant_null();
+
+        default:
+          break;
       }
     }
   }
@@ -2731,7 +2683,7 @@
 
     // In strong mode type is already verified either by static analysis
     // or runtime checks, so AssertBoolean just ensures that value is not null.
-    if (FLAG_strong && !value()->Type()->is_nullable()) {
+    if (!value()->Type()->is_nullable()) {
       return value()->definition();
     }
   }
@@ -2786,19 +2738,18 @@
   if (instantiator_type_args == nullptr) {
     if (LoadFieldInstr* load_type_args =
             instantiator_type_arguments()->definition()->AsLoadField()) {
-      if (load_type_args->native_field() != nullptr &&
-          load_type_args->native_field()->kind() ==
-              NativeFieldDesc::kTypeArguments) {
+      if (load_type_args->slot().IsTypeArguments()) {
         if (LoadFieldInstr* load_field = load_type_args->instance()
                                              ->definition()
                                              ->OriginalDefinition()
                                              ->AsLoadField()) {
-          if (load_field->field() != nullptr &&
-              load_field->field()
-                  ->static_type_exactness_state()
+          if (load_field->slot().IsDartField() &&
+              load_field->slot()
+                  .field()
+                  .static_type_exactness_state()
                   .IsHasExactSuperClass()) {
             instantiator_type_args = &TypeArguments::Handle(
-                Z, AbstractType::Handle(Z, load_field->field()->type())
+                Z, AbstractType::Handle(Z, load_field->slot().field().type())
                        .arguments());
           }
         }
@@ -2807,36 +2758,37 @@
   }
 
   if ((instantiator_type_args != nullptr) && (function_type_args != nullptr)) {
-    Error& bound_error = Error::Handle(Z);
-
     AbstractType& new_dst_type = AbstractType::Handle(
-        Z, dst_type().InstantiateFrom(
-               *instantiator_type_args, *function_type_args, kAllFree,
-               &bound_error, nullptr, nullptr, Heap::kOld));
-    if (new_dst_type.IsMalformedOrMalbounded() || !bound_error.IsNull()) {
+        Z,
+        dst_type().InstantiateFrom(*instantiator_type_args, *function_type_args,
+                                   kAllFree, nullptr, Heap::kOld));
+    if (new_dst_type.IsNull()) {
+      // Failed instantiation in dead code.
       return this;
     }
     if (new_dst_type.IsTypeRef()) {
       new_dst_type = TypeRef::Cast(new_dst_type).type();
     }
     new_dst_type = new_dst_type.Canonicalize();
+
+    // Successfully instantiated destination type: update the type attached
+    // to this instruction and set type arguments to null because we no
+    // longer need them (the type was instantiated).
     set_dst_type(new_dst_type);
+    instantiator_type_arguments()->BindTo(flow_graph->constant_null());
+    function_type_arguments()->BindTo(flow_graph->constant_null());
 
     if (new_dst_type.IsDynamicType() || new_dst_type.IsObjectType() ||
         (FLAG_eliminate_type_checks &&
          value()->Type()->IsAssignableTo(new_dst_type))) {
       return value()->definition();
     }
-
-    ConstantInstr* null_constant = flow_graph->constant_null();
-    instantiator_type_arguments()->BindTo(null_constant);
-    function_type_arguments()->BindTo(null_constant);
   }
   return this;
 }
 
 Definition* InstantiateTypeArgumentsInstr::Canonicalize(FlowGraph* flow_graph) {
-  return (Isolate::Current()->type_checks() || HasUses()) ? this : NULL;
+  return HasUses() ? this : NULL;
 }
 
 LocationSummary* DebugStepCheckInstr::MakeLocationSummary(Zone* zone,
@@ -2959,7 +2911,8 @@
         box_defn->value()->definition()->representation();
     if (from_representation == representation()) {
       return box_defn->value()->definition();
-    } else {
+    } else if (from_representation != kTagged) {
+      // Only operate on explicit unboxed operands.
       UnboxedIntConverterInstr* converter = new UnboxedIntConverterInstr(
           from_representation, representation(),
           box_defn->value()->CopyWithType(),
@@ -3105,14 +3058,22 @@
   return (cid == kDynamicCid) || (cid == kMintCid) || (cid == kDoubleCid);
 }
 
-static bool MaybeNumber(CompileType* type) {
-  ASSERT(Type::Handle(Type::Number())
-             .IsMoreSpecificThan(Type::Handle(Type::Number()), NULL, NULL,
-                                 Heap::kOld));
-  return type->ToAbstractType()->IsDynamicType() ||
-         type->ToAbstractType()->IsObjectType() ||
-         type->ToAbstractType()->IsTypeParameter() ||
-         type->IsMoreSpecificThan(Type::Handle(Type::Number()));
+static bool MayBeNumber(CompileType* type) {
+  if (type->IsNone()) {
+    return false;
+  }
+  auto& compile_type = AbstractType::Handle(type->ToAbstractType()->raw());
+  if (compile_type.IsType() &&
+      Class::Handle(compile_type.type_class()).IsFutureOrClass()) {
+    const auto& type_args = TypeArguments::Handle(compile_type.arguments());
+    if (type_args.IsNull()) {
+      return true;
+    }
+    compile_type = type_args.TypeAt(0);
+  }
+  // Note that type 'Number' is a subtype of itself.
+  return compile_type.IsTopType() || compile_type.IsTypeParameter() ||
+         compile_type.IsSubtypeOf(Type::Handle(Type::Number()), Heap::kOld);
 }
 
 // Returns a replacement for a strict comparison and signals if the result has
@@ -3127,8 +3088,8 @@
     if (!MayBeBoxableNumber(compare->left()->Type()->ToCid()) ||
         !MayBeBoxableNumber(compare->right()->Type()->ToCid())) {
       compare->set_needs_number_check(false);
-    } else if (!MaybeNumber(compare->left()->Type()) ||
-               !MaybeNumber(compare->right()->Type())) {
+    } else if (!MayBeNumber(compare->left()->Type()) ||
+               !MayBeNumber(compare->right()->Type())) {
       compare->set_needs_number_check(false);
     }
   }
@@ -3698,26 +3659,39 @@
 }
 
 void FunctionEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+#if defined(TARGET_ARCH_X64)
+  // Ensure the start of the monomorphic checked entry is 2-byte aligned (see
+  // also Assembler::MonomorphicCheckedEntry()).
+  if (__ CodeSize() % 2 == 1) {
+    __ nop();
+  }
+#endif
   __ Bind(compiler->GetJumpLabel(this));
 
   // In the AOT compiler we want to reduce code size, so generate no
   // fall-through code in [FlowGraphCompiler::CompileGraph()].
   // (As opposed to here where we don't check for the return value of
   // [Intrinsify]).
-  if (!FLAG_precompiled_mode) {
 #if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM)
-    // NOTE: Because in JIT X64/ARM mode the graph can have multiple
-    // entrypoints, so we generate several times the same intrinsification &
-    // frame setup.  That's why we cannot rely on the constant pool being
-    // `false` when we come in here.
-    __ set_constant_pool_allowed(false);
-    // TODO(#34162): Don't emit more code if 'TryIntrinsify' returns 'true'
-    // (meaning the function was fully intrinsified).
-    compiler->TryIntrinsify();
-    compiler->EmitPrologue();
-    ASSERT(__ constant_pool_allowed());
-#endif
+  if (FLAG_precompiled_mode) {
+    const Function& function = compiler->parsed_function().function();
+    if (function.IsDynamicFunction()) {
+      compiler->SpecialStatsBegin(CombinedCodeStatistics::kTagCheckedEntry);
+      __ MonomorphicCheckedEntry();
+      compiler->SpecialStatsEnd(CombinedCodeStatistics::kTagCheckedEntry);
+    }
   }
+  // NOTE: Because in JIT X64/ARM mode the graph can have multiple
+  // entrypoints, so we generate several times the same intrinsification &
+  // frame setup.  That's why we cannot rely on the constant pool being
+  // `false` when we come in here.
+  __ set_constant_pool_allowed(false);
+  // TODO(#34162): Don't emit more code if 'TryIntrinsify' returns 'true'
+  // (meaning the function was fully intrinsified).
+  compiler->TryIntrinsify();
+  compiler->EmitPrologue();
+  ASSERT(__ constant_pool_allowed());
+#endif
 
   if (!compiler->is_optimizing()) {
 #if !defined(TARGET_ARCH_DBC)
@@ -3972,19 +3946,19 @@
 
 // DBC does not use specialized inline cache stubs for smi operations.
 #if !defined(TARGET_ARCH_DBC)
-static const StubEntry* TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) {
+static RawCode* TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) {
   if (!FLAG_two_args_smi_icd) {
-    return 0;
+    return Code::null();
   }
   switch (kind) {
     case Token::kADD:
-      return StubCode::SmiAddInlineCache_entry();
+      return StubCode::SmiAddInlineCache().raw();
     case Token::kSUB:
-      return StubCode::SmiSubInlineCache_entry();
+      return StubCode::SmiSubInlineCache().raw();
     case Token::kEQ:
-      return StubCode::SmiEqualInlineCache_entry();
+      return StubCode::SmiEqualInlineCache().raw();
     default:
-      return NULL;
+      return Code::null();
   }
 }
 #else
@@ -4056,7 +4030,7 @@
     // static receiver type on the ICData.
     if (checked_argument_count() == 1) {
       if (static_receiver_type_ != nullptr &&
-          static_receiver_type_->HasResolvedTypeClass()) {
+          static_receiver_type_->HasTypeClass()) {
         const Class& cls =
             Class::Handle(zone, static_receiver_type_->type_class());
         if (cls.IsGeneric() && !cls.IsFutureOrClass()) {
@@ -4092,16 +4066,17 @@
     compiler->AddCurrentDescriptor(RawPcDescriptors::kRewind, deopt_id(),
                                    token_pos());
     bool is_smi_two_args_op = false;
-    const StubEntry* stub_entry = TwoArgsSmiOpInlineCacheEntry(token_kind());
-    if (stub_entry != nullptr) {
+    const Code& stub =
+        Code::ZoneHandle(TwoArgsSmiOpInlineCacheEntry(token_kind()));
+    if (!stub.IsNull()) {
       // We have a dedicated inline cache stub for this operation, add an
       // an initial Smi/Smi check with count 0.
       is_smi_two_args_op = call_ic_data->AddSmiSmiCheckForFastSmiStubs();
     }
     if (is_smi_two_args_op) {
       ASSERT(ArgumentCount() == 2);
-      compiler->EmitInstanceCall(*stub_entry, *call_ic_data, deopt_id(),
-                                 token_pos(), locs());
+      compiler->EmitInstanceCall(stub, *call_ic_data, deopt_id(), token_pos(),
+                                 locs());
     } else {
       compiler->GenerateInstanceCall(deopt_id(), token_pos(), locs(),
                                      *call_ic_data);
@@ -4596,7 +4571,7 @@
   const Register box = locs()->in(0).reg();
   const Register temp =
       (locs()->temp_count() > 0) ? locs()->temp(0).reg() : kNoRegister;
-  Label* deopt = compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptCheckClass);
+  Label* deopt = compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnbox);
   Label is_smi;
 
   if ((value()->Type()->ToNullableCid() == box_cid) &&
@@ -4852,9 +4827,9 @@
   return LoadFieldInstr::IsFixedLengthArrayCid(cid);
 }
 
-Instruction* CheckArrayBoundInstr::Canonicalize(FlowGraph* flow_graph) {
+Definition* CheckArrayBoundInstr::Canonicalize(FlowGraph* flow_graph) {
   return IsRedundant(RangeBoundary::FromDefinition(length()->definition()))
-             ? NULL
+             ? index()->definition()
              : this;
 }
 
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 33d1434..7020590 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -7,7 +7,9 @@
 
 #include "vm/allocation.h"
 #include "vm/code_descriptors.h"
+#include "vm/compiler/backend/compile_type.h"
 #include "vm/compiler/backend/locations.h"
+#include "vm/compiler/backend/slot.h"
 #include "vm/compiler/compiler_state.h"
 #include "vm/compiler/method_recognizer.h"
 #include "vm/flags.h"
@@ -42,178 +44,6 @@
 class UnboxIntegerInstr;
 class TypeUsageInfo;
 
-// CompileType describes type of the value produced by the definition.
-//
-// It captures the following properties:
-//    - whether value can potentially be null or it is definitely not null;
-//    - concrete class id of the value or kDynamicCid if unknown statically;
-//    - abstract super type of the value, concrete type of the value in runtime
-//      is guaranteed to be sub type of this type.
-//
-// Values of CompileType form a lattice with a None type as a bottom and a
-// nullable Dynamic type as a top element. Method Union provides a join
-// operation for the lattice.
-class CompileType : public ZoneAllocated {
- public:
-  static const bool kNullable = true;
-  static const bool kNonNullable = false;
-
-  CompileType(bool is_nullable, intptr_t cid, const AbstractType* type)
-      : is_nullable_(is_nullable), cid_(cid), type_(type) {}
-
-  CompileType(const CompileType& other)
-      : ZoneAllocated(),
-        is_nullable_(other.is_nullable_),
-        cid_(other.cid_),
-        type_(other.type_) {}
-
-  CompileType& operator=(const CompileType& other) {
-    is_nullable_ = other.is_nullable_;
-    cid_ = other.cid_;
-    type_ = other.type_;
-    return *this;
-  }
-
-  bool is_nullable() const { return is_nullable_; }
-
-  // Return type such that concrete value's type in runtime is guaranteed to
-  // be subtype of it.
-  const AbstractType* ToAbstractType();
-
-  // Return class id such that it is either kDynamicCid or in runtime
-  // value is guaranteed to have an equal class id.
-  intptr_t ToCid();
-
-  // Return class id such that it is either kDynamicCid or in runtime
-  // value is guaranteed to be either null or have an equal class id.
-  intptr_t ToNullableCid();
-
-  // Returns true if the value is guaranteed to be not-null or is known to be
-  // always null.
-  bool HasDecidableNullability();
-
-  // Returns true if the value is known to be always null.
-  bool IsNull();
-
-  // Returns true if this type is more specific than given type.
-  bool IsMoreSpecificThan(const AbstractType& other);
-
-  // Returns true if value of this type is assignable to a location of the
-  // given type.
-  bool IsAssignableTo(const AbstractType& type) {
-    bool is_instance;
-    return CanComputeIsInstanceOf(type, kNullable, &is_instance) && is_instance;
-  }
-
-  // Create a new CompileType representing given combination of class id and
-  // abstract type. The pair is assumed to be coherent.
-  static CompileType Create(intptr_t cid, const AbstractType& type);
-
-  CompileType CopyNonNullable() const {
-    return CompileType(kNonNullable, kIllegalCid, type_);
-  }
-
-  static CompileType CreateNullable(bool is_nullable, intptr_t cid) {
-    return CompileType(is_nullable, cid, NULL);
-  }
-
-  // Create a new CompileType representing given abstract type. By default
-  // values as assumed to be nullable.
-  static CompileType FromAbstractType(const AbstractType& type,
-                                      bool is_nullable = kNullable);
-
-  // Create a new CompileType representing a value with the given class id.
-  // Resulting CompileType is nullable only if cid is kDynamicCid or kNullCid.
-  static CompileType FromCid(intptr_t cid);
-
-  // Create None CompileType. It is the bottom of the lattice and is used to
-  // represent type of the phi that was not yet inferred.
-  static CompileType None() {
-    return CompileType(kNullable, kIllegalCid, NULL);
-  }
-
-  // Create Dynamic CompileType. It is the top of the lattice and is used to
-  // represent unknown type.
-  static CompileType Dynamic();
-
-  static CompileType Null();
-
-  // Create non-nullable Bool type.
-  static CompileType Bool();
-
-  // Create non-nullable Int type.
-  static CompileType Int();
-
-  // Create non-nullable Smi type.
-  static CompileType Smi();
-
-  // Create non-nullable Double type.
-  static CompileType Double();
-
-  // Create non-nullable String type.
-  static CompileType String();
-
-  // Perform a join operation over the type lattice.
-  void Union(CompileType* other);
-
-  // Refine old type with newly inferred type (it could be more or less
-  // specific, or even unrelated to an old type in case of unreachable code).
-  // May return 'old_type', 'new_type' or create a new CompileType instance.
-  static CompileType* ComputeRefinedType(CompileType* old_type,
-                                         CompileType* new_type);
-
-  // Returns true if this and other types are the same.
-  bool IsEqualTo(CompileType* other) {
-    return (is_nullable_ == other->is_nullable_) &&
-           (ToNullableCid() == other->ToNullableCid()) &&
-           (ToAbstractType()->Equals(*other->ToAbstractType()));
-  }
-
-  bool IsNone() const { return (cid_ == kIllegalCid) && (type_ == NULL); }
-
-  bool IsInt() {
-    return !is_nullable() &&
-           ((ToCid() == kSmiCid) || (ToCid() == kMintCid) ||
-            ((type_ != NULL) &&
-             (type_->Equals(Type::Handle(Type::Int64Type())))));
-  }
-
-  // Returns true if value of this type is either int or null.
-  bool IsNullableInt() {
-    if ((cid_ == kSmiCid) || (cid_ == kMintCid)) {
-      return true;
-    }
-    if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
-      return (type_ != NULL) && ((type_->IsIntType() || type_->IsInt64Type() ||
-                                  type_->IsSmiType()));
-    }
-    return false;
-  }
-
-  // Returns true if value of this type is either double or null.
-  bool IsNullableDouble() {
-    if (cid_ == kDoubleCid) {
-      return true;
-    }
-    if ((cid_ == kIllegalCid) || (cid_ == kDynamicCid)) {
-      return (type_ != NULL) && type_->IsDoubleType();
-    }
-    return false;
-  }
-
-  void PrintTo(BufferFormatter* f) const;
-  const char* ToCString() const;
-
- private:
-  bool CanComputeIsInstanceOf(const AbstractType& type,
-                              bool is_nullable,
-                              bool* is_instance);
-
-  bool is_nullable_;
-  intptr_t cid_;
-  const AbstractType* type_;
-};
-
 class Value : public ZoneAllocated {
  public:
   // A forward iterator that allows removing the current value from the
@@ -351,10 +181,10 @@
 
 typedef MallocGrowableArray<CidRange> CidRangeVector;
 
-class HierarchyInfo : public StackResource {
+class HierarchyInfo : public ThreadStackResource {
  public:
   explicit HierarchyInfo(Thread* thread)
-      : StackResource(thread),
+      : ThreadStackResource(thread),
         cid_subtype_ranges_(NULL),
         cid_subtype_ranges_abstract_(NULL),
         cid_subclass_ranges_(NULL) {
@@ -660,18 +490,18 @@
   DECLARE_INSTRUCTION_NO_BACKEND(type)                                         \
   DECLARE_COMPARISON_METHODS
 
-#ifndef PRODUCT
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 #define PRINT_TO_SUPPORT virtual void PrintTo(BufferFormatter* f) const;
 #else
 #define PRINT_TO_SUPPORT
-#endif  // !PRODUCT
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
-#ifndef PRODUCT
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 #define PRINT_OPERANDS_TO_SUPPORT                                              \
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 #else
 #define PRINT_OPERANDS_TO_SUPPORT
-#endif  // !PRODUCT
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 // Together with CidRange, this represents a mapping from a range of class-ids
 // to a method for a given selector (method name).  Also can contain an
@@ -894,7 +724,7 @@
 
   // Printing support.
   const char* ToCString() const;
-#ifndef PRODUCT
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
   virtual void PrintTo(BufferFormatter* f) const;
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 #endif
@@ -1360,6 +1190,7 @@
   LoopInfo* loop_info() const { return loop_info_; }
   void set_loop_info(LoopInfo* loop_info) { loop_info_ = loop_info; }
   bool IsLoopHeader() const;
+  intptr_t NestingDepth() const;
 
   virtual BlockEntryInstr* GetBlock() { return this; }
 
@@ -2146,8 +1977,6 @@
   virtual void RawSetInputAt(intptr_t i, Value* value) { inputs_[i] = value; }
 };
 
-class InductionVariableInfo;
-
 class PhiInstr : public Definition {
  public:
   PhiInstr(JoinEntryInstr* block, intptr_t num_inputs)
@@ -2155,7 +1984,6 @@
         inputs_(num_inputs),
         representation_(kTagged),
         reaching_defs_(NULL),
-        loop_variable_info_(NULL),
         is_alive_(false),
         is_receiver_(kUnknownReceiver) {
     for (intptr_t i = 0; i < num_inputs; ++i) {
@@ -2211,14 +2039,6 @@
   // A phi is redundant if all input operands are the same.
   bool IsRedundant() const;
 
-  void set_induction_variable_info(InductionVariableInfo* info) {
-    loop_variable_info_ = info;
-  }
-
-  InductionVariableInfo* induction_variable_info() {
-    return loop_variable_info_;
-  }
-
   PRINT_TO_SUPPORT
 
   enum ReceiverType { kUnknownReceiver = -1, kNotReceiver = 0, kReceiver = 1 };
@@ -2240,7 +2060,6 @@
   GrowableArray<Value*> inputs_;
   Representation representation_;
   BitVector* reaching_defs_;
-  InductionVariableInfo* loop_variable_info_;
   bool is_alive_;
   int8_t is_receiver_;
 
@@ -2293,7 +2112,7 @@
   DISALLOW_COPY_AND_ASSIGN(ParameterInstr);
 };
 
-// Stores a tagged pointer to a slot accessable from a fixed register.  It has
+// Stores a tagged pointer to a slot accessible from a fixed register.  It has
 // the form:
 //
 //     base_reg[index + #constant] = value
@@ -2304,7 +2123,7 @@
 //
 // Currently this instruction uses pinpoints the register to be FP.
 //
-// This lowlevel instruction is non-inlinable since it makes assumptons about
+// This low-level instruction is non-inlinable since it makes assumptions about
 // the frame.  This is asserted via `inliner.cc::CalleeGraphValidator`.
 class StoreIndexedUnsafeInstr : public TemplateDefinition<2, NoThrow> {
  public:
@@ -3098,7 +2917,7 @@
     ASSERT(!dst_type.IsNull());
     ASSERT(!dst_type.IsTypeRef());
     ASSERT(!dst_name.IsNull());
-    ASSERT(!FLAG_strong || !dst_type.IsDynamicType());
+    ASSERT(!dst_type.IsDynamicType());
     SetInputAt(0, value);
     SetInputAt(1, instantiator_type_arguments);
     SetInputAt(2, function_type_arguments);
@@ -3270,6 +3089,18 @@
     ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
   }
 
+  RawString* Selector() {
+    // The Token::Kind we have does unfortunately not encode whether the call is
+    // a dyn: call or not.
+    if (auto static_call = this->AsStaticCall()) {
+      return static_call->ic_data()->target_name();
+    } else if (auto instance_call = this->AsInstanceCall()) {
+      return instance_call->ic_data()->target_name();
+    } else {
+      UNREACHABLE();
+    }
+  }
+
   intptr_t FirstArgIndex() const { return type_args_len_ > 0 ? 1 : 0; }
   Value* Receiver() const {
     return this->PushArgumentAt(FirstArgIndex())->value();
@@ -4259,51 +4090,76 @@
 
 enum StoreBarrierType { kNoStoreBarrier, kEmitStoreBarrier };
 
+// StoreInstanceField instruction represents a store of the given [value] into
+// the specified [slot] on the [instance] object. [emit_store_barrier] allows to
+// specify whether the store should omit the write barrier. [kind] specifies
+// whether this store is an initializing store, i.e. the first store into a
+// field after the allocation.
+//
+// In JIT mode a slot might be a subject to the field unboxing optimization:
+// if field type profiling shows that this slot always contains a double or SIMD
+// value then this field becomes "unboxed" - in this case when storing into
+// such field we update the payload of the box referenced by the field, rather
+// than updating the field itself.
+//
+// Note: even if [emit_store_barrier] is set to [kEmitStoreBarrier] the store
+// can still omit the barrier if it establishes that it is not needed.
+//
+// Note: stores generated from the constructor initializer list and from
+// field initializers *must* be marked as initializing. Initializing stores
+// into unboxed fields are responsible for allocating the mutable box which
+// would be mutated by subsequent stores.
 class StoreInstanceFieldInstr : public TemplateDefinition<2, NoThrow> {
  public:
+  enum class Kind {
+    // Store is known to be the first store into a slot of an object after
+    // object was allocated and before it escapes (e.g. stores in constructor
+    // initializer list).
+    kInitializing,
+
+    // All other stores.
+    kOther,
+  };
+
+  StoreInstanceFieldInstr(const Slot& slot,
+                          Value* instance,
+                          Value* value,
+                          StoreBarrierType emit_store_barrier,
+                          TokenPosition token_pos,
+                          Kind kind = Kind::kOther)
+      : slot_(slot),
+        emit_store_barrier_(emit_store_barrier),
+        token_pos_(token_pos),
+        is_initialization_(kind == Kind::kInitializing) {
+    SetInputAt(kInstancePos, instance);
+    SetInputAt(kValuePos, value);
+  }
+
+  // Convenience constructor that looks up an IL Slot for the given [field].
   StoreInstanceFieldInstr(const Field& field,
                           Value* instance,
                           Value* value,
                           StoreBarrierType emit_store_barrier,
-                          TokenPosition token_pos)
-      : field_(field),
-        offset_in_bytes_(field.Offset()),
-        emit_store_barrier_(emit_store_barrier),
-        token_pos_(token_pos),
-        is_initialization_(false) {
-    SetInputAt(kInstancePos, instance);
-    SetInputAt(kValuePos, value);
-    CheckField(field);
-  }
-
-  StoreInstanceFieldInstr(intptr_t offset_in_bytes,
-                          Value* instance,
-                          Value* value,
-                          StoreBarrierType emit_store_barrier,
-                          TokenPosition token_pos)
-      : field_(Field::ZoneHandle()),
-        offset_in_bytes_(offset_in_bytes),
-        emit_store_barrier_(emit_store_barrier),
-        token_pos_(token_pos),
-        is_initialization_(false) {
-    SetInputAt(kInstancePos, instance);
-    SetInputAt(kValuePos, value);
-  }
+                          TokenPosition token_pos,
+                          const ParsedFunction* parsed_function,
+                          Kind kind = Kind::kOther)
+      : StoreInstanceFieldInstr(Slot::Get(field, parsed_function),
+                                instance,
+                                value,
+                                emit_store_barrier,
+                                token_pos,
+                                kind) {}
 
   DECLARE_INSTRUCTION(StoreInstanceField)
 
-  void set_is_initialization(bool value) { is_initialization_ = value; }
-
   enum { kInstancePos = 0, kValuePos = 1 };
 
   Value* instance() const { return inputs_[kInstancePos]; }
+  const Slot& slot() const { return slot_; }
   Value* value() const { return inputs_[kValuePos]; }
-  bool is_initialization() const { return is_initialization_; }
 
   virtual TokenPosition token_pos() const { return token_pos_; }
-
-  const Field& field() const { return field_; }
-  intptr_t offset_in_bytes() const { return offset_in_bytes_; }
+  bool is_initialization() const { return is_initialization_; }
 
   bool ShouldEmitStoreBarrier() const {
     if (instance()->definition() == value()->definition()) {
@@ -4335,7 +4191,6 @@
   virtual bool HasUnknownSideEffects() const { return false; }
 
   bool IsUnboxedStore() const;
-
   bool IsPotentialUnboxedStore() const;
 
   virtual Representation RequiredInputRepresentation(intptr_t index) const;
@@ -4345,14 +4200,9 @@
  private:
   friend class JitCallSpecializer;  // For ASSERT(initialization_).
 
-  Assembler::CanBeSmi CanValueBeSmi() const {
-    Isolate* isolate = Isolate::Current();
-    if (isolate->type_checks() && !FLAG_strong) {
-      // Dart 1 sometimes places a store into a context before a parameter
-      // type check.
-      return Assembler::kValueCanBeSmi;
-    }
+  intptr_t OffsetInBytes() const { return slot().offset_in_bytes(); }
 
+  Assembler::CanBeSmi CanValueBeSmi() const {
     const intptr_t cid = value()->Type()->ToNullableCid();
     // Write barrier is skipped for nullable and non-nullable smis.
     ASSERT(cid != kSmiCid);
@@ -4360,12 +4210,11 @@
                               : Assembler::kValueIsNotSmi;
   }
 
-  const Field& field_;
-  intptr_t offset_in_bytes_;
+  const Slot& slot_;
   StoreBarrierType emit_store_barrier_;
   const TokenPosition token_pos_;
   // Marks initializing stores. E.g. in the constructor.
-  bool is_initialization_;
+  const bool is_initialization_;
 
   DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldInstr);
 };
@@ -4519,13 +4368,6 @@
 
  private:
   Assembler::CanBeSmi CanValueBeSmi() const {
-    Isolate* isolate = Isolate::Current();
-    if (isolate->type_checks() && !FLAG_strong) {
-      // Dart 1 sometimes places a store into a context before a parameter
-      // type check.
-      return Assembler::kValueCanBeSmi;
-    }
-
     const intptr_t cid = value()->Type()->ToNullableCid();
     // Write barrier is skipped for nullable and non-nullable smis.
     ASSERT(cid != kSmiCid);
@@ -4955,6 +4797,9 @@
   DISALLOW_COPY_AND_ASSIGN(AllocateObjectInstr);
 };
 
+// TODO(vegorov) the name of the instruction is confusing. At some point
+// it used to allocate uninitialized storage, but this is no longer true.
+// These days it allocates null initialized storage.
 class AllocateUninitializedContextInstr
     : public TemplateAllocation<0, NoThrow> {
  public:
@@ -4998,7 +4843,7 @@
 class MaterializeObjectInstr : public Definition {
  public:
   MaterializeObjectInstr(AllocateObjectInstr* allocation,
-                         const ZoneGrowableArray<const Object*>& slots,
+                         const ZoneGrowableArray<const Slot*>& slots,
                          ZoneGrowableArray<Value*>* values)
       : allocation_(allocation),
         cls_(allocation->cls()),
@@ -5016,7 +4861,7 @@
   }
 
   MaterializeObjectInstr(AllocateUninitializedContextInstr* allocation,
-                         const ZoneGrowableArray<const Object*>& slots,
+                         const ZoneGrowableArray<const Slot*>& slots,
                          ZoneGrowableArray<Value*>* values)
       : allocation_(allocation),
         cls_(Class::ZoneHandle(Object::context_class())),
@@ -5039,8 +4884,7 @@
   intptr_t num_variables() const { return num_variables_; }
 
   intptr_t FieldOffsetAt(intptr_t i) const {
-    return slots_[i]->IsField() ? Field::Cast(*slots_[i]).Offset()
-                                : Smi::Cast(*slots_[i]).Value();
+    return slots_[i]->offset_in_bytes();
   }
 
   const Location& LocationAt(intptr_t i) { return locations_[i]; }
@@ -5084,7 +4928,7 @@
   Definition* allocation_;
   const Class& cls_;
   intptr_t num_variables_;
-  const ZoneGrowableArray<const Object*>& slots_;
+  const ZoneGrowableArray<const Slot*>& slots_;
   ZoneGrowableArray<Value*>* values_;
   Location* locations_;
 
@@ -5125,7 +4969,15 @@
   virtual AliasIdentity Identity() const { return identity_; }
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
-  virtual bool WillAllocateNewOrRemembered() const { return true; }
+  virtual bool WillAllocateNewOrRemembered() const {
+    // Large arrays will use cards instead; cannot skip write barrier.
+    if (!num_elements()->BindsToConstant()) return false;
+    const Object& length = num_elements()->BoundConstant();
+    if (!length.IsSmi()) return false;
+    intptr_t raw_length = Smi::Cast(length).Value();
+    // Compare Array::New.
+    return (raw_length >= 0) && (raw_length < Array::kMaxNewSpaceElements);
+  }
 
  private:
   const TokenPosition token_pos_;
@@ -5187,160 +5039,29 @@
   DISALLOW_COPY_AND_ASSIGN(LoadClassIdInstr);
 };
 
-#define NATIVE_FIELDS_LIST(V)                                                  \
-  V(Array, length, Smi, IMMUTABLE)                                             \
-  V(GrowableObjectArray, length, Smi, MUTABLE)                                 \
-  V(TypedData, length, Smi, IMMUTABLE)                                         \
-  V(String, length, Smi, IMMUTABLE)                                            \
-  V(LinkedHashMap, index, TypedDataUint32Array, MUTABLE)                       \
-  V(LinkedHashMap, data, Array, MUTABLE)                                       \
-  V(LinkedHashMap, hash_mask, Smi, MUTABLE)                                    \
-  V(LinkedHashMap, used_data, Smi, MUTABLE)                                    \
-  V(LinkedHashMap, deleted_keys, Smi, MUTABLE)                                 \
-  V(ArgumentsDescriptor, type_args_len, Smi, IMMUTABLE)
-
-class NativeFieldDesc : public ZoneAllocated {
- public:
-  // clang-format off
-  enum Kind {
-#define DECLARE_KIND(ClassName, FieldName, cid, mutability)                    \
-  k##ClassName##_##FieldName,
-    NATIVE_FIELDS_LIST(DECLARE_KIND)
-#undef DECLARE_KIND
-    kTypeArguments,
-  };
-  // clang-format on
-
-#define DEFINE_GETTER(ClassName, FieldName, cid, mutability)                   \
-  static const NativeFieldDesc* ClassName##_##FieldName() {                    \
-    return Get(k##ClassName##_##FieldName);                                    \
-  }
-
-  NATIVE_FIELDS_LIST(DEFINE_GETTER)
-#undef DEFINE_GETTER
-
-  static const NativeFieldDesc* Get(Kind kind);
-  static const NativeFieldDesc* GetLengthFieldForArrayCid(intptr_t array_cid);
-  static const NativeFieldDesc* GetTypeArgumentsField(Zone* zone,
-                                                      intptr_t offset);
-  static const NativeFieldDesc* GetTypeArgumentsFieldFor(Zone* zone,
-                                                         const Class& cls);
-
-  const char* name() const;
-
-  Kind kind() const { return kind_; }
-
-  intptr_t offset_in_bytes() const { return offset_in_bytes_; }
-
-  bool is_immutable() const { return immutable_; }
-
-  intptr_t cid() const { return cid_; }
-
-  RawAbstractType* type() const;
-
- private:
-  NativeFieldDesc(Kind kind,
-                  intptr_t offset_in_bytes,
-                  intptr_t cid,
-                  bool immutable)
-      : kind_(kind),
-        offset_in_bytes_(offset_in_bytes),
-        immutable_(immutable),
-        cid_(cid) {}
-
-  NativeFieldDesc(const NativeFieldDesc& other)
-      : NativeFieldDesc(other.kind_,
-                        other.offset_in_bytes_,
-                        other.immutable_,
-                        other.cid_) {}
-
-  const Kind kind_;
-  const intptr_t offset_in_bytes_;
-  const bool immutable_;
-
-  const intptr_t cid_;
-};
-
+// LoadFieldInstr represents a load from the given [slot] in the given
+// [instance].
+//
+// Note: if slot was a subject of the field unboxing optimization then this load
+// would both load the box stored in the field and then load the content of
+// the box.
 class LoadFieldInstr : public TemplateDefinition<1, NoThrow> {
  public:
-  LoadFieldInstr(Value* instance,
-                 intptr_t offset_in_bytes,
-                 const AbstractType& type,
-                 TokenPosition token_pos)
-      : offset_in_bytes_(offset_in_bytes),
-        type_(type),
-        result_cid_(kDynamicCid),
-        immutable_(false),
-        native_field_(nullptr),
-        field_(nullptr),
-        token_pos_(token_pos) {
-    ASSERT(offset_in_bytes >= 0);
-    // May be null if field is not an instance.
-    ASSERT(type_.IsZoneHandle() || type_.IsReadOnlyHandle());
+  LoadFieldInstr(Value* instance, const Slot& slot, TokenPosition token_pos)
+      : slot_(slot), token_pos_(token_pos) {
     SetInputAt(0, instance);
   }
 
-  LoadFieldInstr(Value* instance,
-                 const NativeFieldDesc* native_field,
-                 TokenPosition token_pos)
-      : offset_in_bytes_(native_field->offset_in_bytes()),
-        type_(AbstractType::ZoneHandle(native_field->type())),
-        result_cid_(native_field->cid()),
-        immutable_(native_field->is_immutable()),
-        native_field_(native_field),
-        field_(nullptr),
-        token_pos_(token_pos) {
-    ASSERT(offset_in_bytes_ >= 0);
-    // May be null if field is not an instance.
-    ASSERT(type_.IsZoneHandle() || type_.IsReadOnlyHandle());
-    SetInputAt(0, instance);
-  }
-
-  LoadFieldInstr(Value* instance,
-                 const Field* field,
-                 const AbstractType& type,
-                 TokenPosition token_pos,
-                 const ParsedFunction* parsed_function)
-      : offset_in_bytes_(field->Offset()),
-        type_(type),
-        result_cid_(kDynamicCid),
-        immutable_(false),
-        native_field_(nullptr),
-        field_(field),
-        token_pos_(token_pos) {
-    ASSERT(Class::Handle(field->Owner()).is_finalized());
-    ASSERT(field->IsZoneHandle());
-    // May be null if field is not an instance.
-    ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
-    SetInputAt(0, instance);
-
-    if (parsed_function != nullptr && field->guarded_cid() != kIllegalCid) {
-      if (!field->is_nullable() || (field->guarded_cid() == kNullCid)) {
-        set_result_cid(field->guarded_cid());
-      }
-      parsed_function->AddToGuardedFields(field);
-    }
-  }
-
-  void set_is_immutable(bool value) { immutable_ = value; }
-
   Value* instance() const { return inputs_[0]; }
-  intptr_t offset_in_bytes() const { return offset_in_bytes_; }
-  const AbstractType& type() const { return type_; }
-  void set_result_cid(intptr_t value) { result_cid_ = value; }
-  intptr_t result_cid() const { return result_cid_; }
-  virtual TokenPosition token_pos() const { return token_pos_; }
+  const Slot& slot() const { return slot_; }
 
-  const Field* field() const { return field_; }
+  virtual TokenPosition token_pos() const { return token_pos_; }
 
   virtual Representation representation() const;
 
   bool IsUnboxedLoad() const;
-
   bool IsPotentialUnboxedLoad() const;
 
-  const NativeFieldDesc* native_field() const { return native_field_; }
-
   DECLARE_INSTRUCTION(LoadField)
   virtual CompileType ComputeType() const;
 
@@ -5357,11 +5078,19 @@
   // instance has the field.
   bool Evaluate(const Object& instance_value, Object* result);
 
+  static bool TryEvaluateLoad(const Object& instance,
+                              const Field& field,
+                              Object* result);
+
+  static bool TryEvaluateLoad(const Object& instance,
+                              const Slot& field,
+                              Object* result);
+
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   static bool IsFixedLengthArrayCid(intptr_t cid);
 
-  virtual bool AllowsCSE() const { return immutable_; }
+  virtual bool AllowsCSE() const { return slot_.is_immutable(); }
   virtual bool HasUnknownSideEffects() const { return false; }
 
   virtual bool AttributesEqual(Instruction* other) const;
@@ -5369,13 +5098,9 @@
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
-  const intptr_t offset_in_bytes_;
-  const AbstractType& type_;
-  intptr_t result_cid_;
-  bool immutable_;
+  intptr_t OffsetInBytes() const { return slot().offset_in_bytes(); }
 
-  const NativeFieldDesc* native_field_;
-  const Field* field_;
+  const Slot& slot_;
   const TokenPosition token_pos_;
 
   DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
@@ -5419,14 +5144,18 @@
   InstantiateTypeArgumentsInstr(TokenPosition token_pos,
                                 const TypeArguments& type_arguments,
                                 const Class& instantiator_class,
+                                const Function& function,
                                 Value* instantiator_type_arguments,
                                 Value* function_type_arguments,
                                 intptr_t deopt_id)
       : TemplateDefinition(deopt_id),
         token_pos_(token_pos),
         type_arguments_(type_arguments),
-        instantiator_class_(instantiator_class) {
+        instantiator_class_(instantiator_class),
+        function_(function) {
     ASSERT(type_arguments.IsZoneHandle());
+    ASSERT(instantiator_class.IsZoneHandle());
+    ASSERT(function.IsZoneHandle());
     SetInputAt(0, instantiator_type_arguments);
     SetInputAt(1, function_type_arguments);
   }
@@ -5437,6 +5166,7 @@
   Value* function_type_arguments() const { return inputs_[1]; }
   const TypeArguments& type_arguments() const { return type_arguments_; }
   const Class& instantiator_class() const { return instantiator_class_; }
+  const Function& function() const { return function_; }
   virtual TokenPosition token_pos() const { return token_pos_; }
 
   virtual bool ComputeCanDeoptimize() const { return true; }
@@ -5451,20 +5181,30 @@
   const TokenPosition token_pos_;
   const TypeArguments& type_arguments_;
   const Class& instantiator_class_;
+  const Function& function_;
 
   DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsInstr);
 };
 
+// [AllocateContext] instruction allocates a new Context object with the space
+// for the given [context_variables].
 class AllocateContextInstr : public TemplateAllocation<0, NoThrow> {
  public:
-  AllocateContextInstr(TokenPosition token_pos, intptr_t num_context_variables)
-      : token_pos_(token_pos), num_context_variables_(num_context_variables) {}
+  AllocateContextInstr(TokenPosition token_pos,
+                       const GrowableArray<LocalVariable*>& context_variables)
+      : token_pos_(token_pos), context_variables_(context_variables) {}
 
   DECLARE_INSTRUCTION(AllocateContext)
   virtual CompileType ComputeType() const;
 
   virtual TokenPosition token_pos() const { return token_pos_; }
-  intptr_t num_context_variables() const { return num_context_variables_; }
+  const GrowableArray<LocalVariable*>& context_variables() const {
+    return context_variables_;
+  }
+
+  intptr_t num_context_variables() const {
+    return context_variables().length();
+  }
 
   virtual bool ComputeCanDeoptimize() const { return false; }
 
@@ -5472,14 +5212,14 @@
 
   virtual bool WillAllocateNewOrRemembered() const {
     return Heap::IsAllocatableInNewSpace(
-        Context::InstanceSize(num_context_variables_));
+        Context::InstanceSize(context_variables().length()));
   }
 
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
   const TokenPosition token_pos_;
-  const intptr_t num_context_variables_;
+  const GrowableArray<LocalVariable*>& context_variables_;
 
   DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr);
 };
@@ -5507,23 +5247,26 @@
   DISALLOW_COPY_AND_ASSIGN(InitStaticFieldInstr);
 };
 
+// [CloneContext] instruction clones the given Context object assuming that
+// it contains exactly the provided [context_variables].
 class CloneContextInstr : public TemplateDefinition<1, NoThrow> {
  public:
   CloneContextInstr(TokenPosition token_pos,
                     Value* context_value,
-                    intptr_t num_context_variables,
+                    const GrowableArray<LocalVariable*>& context_variables,
                     intptr_t deopt_id)
       : TemplateDefinition(deopt_id),
         token_pos_(token_pos),
-        num_context_variables_(num_context_variables) {
+        context_variables_(context_variables) {
     SetInputAt(0, context_value);
   }
 
-  static const intptr_t kUnknownContextSize = -1;
-
   virtual TokenPosition token_pos() const { return token_pos_; }
   Value* context_value() const { return inputs_[0]; }
-  intptr_t num_context_variables() const { return num_context_variables_; }
+
+  const GrowableArray<LocalVariable*>& context_variables() const {
+    return context_variables_;
+  }
 
   DECLARE_INSTRUCTION(CloneContext)
   virtual CompileType ComputeType() const;
@@ -5534,7 +5277,7 @@
 
  private:
   const TokenPosition token_pos_;
-  const intptr_t num_context_variables_;
+  const GrowableArray<LocalVariable*>& context_variables_;
 
   DISALLOW_COPY_AND_ASSIGN(CloneContextInstr);
 };
@@ -6319,14 +6062,14 @@
   CheckedSmiOpInstr(Token::Kind op_kind,
                     Value* left,
                     Value* right,
-                    InstanceCallInstr* call)
+                    TemplateDartCall<0>* call)
       : TemplateDefinition(call->deopt_id()), call_(call), op_kind_(op_kind) {
     ASSERT(call->type_args_len() == 0);
     SetInputAt(0, left);
     SetInputAt(1, right);
   }
 
-  InstanceCallInstr* call() const { return call_; }
+  TemplateDartCall<0>* call() const { return call_; }
   Token::Kind op_kind() const { return op_kind_; }
   Value* left() const { return inputs_[0]; }
   Value* right() const { return inputs_[1]; }
@@ -6344,7 +6087,7 @@
   DECLARE_INSTRUCTION(CheckedSmiOp)
 
  private:
-  InstanceCallInstr* call_;
+  TemplateDartCall<0>* call_;
   const Token::Kind op_kind_;
   DISALLOW_COPY_AND_ASSIGN(CheckedSmiOpInstr);
 };
@@ -6354,7 +6097,7 @@
   CheckedSmiComparisonInstr(Token::Kind op_kind,
                             Value* left,
                             Value* right,
-                            InstanceCallInstr* call)
+                            TemplateDartCall<0>* call)
       : TemplateComparison(call->token_pos(), op_kind, call->deopt_id()),
         call_(call),
         is_negated_(false) {
@@ -6363,7 +6106,7 @@
     SetInputAt(1, right);
   }
 
-  InstanceCallInstr* call() const { return call_; }
+  TemplateDartCall<0>* call() const { return call_; }
 
   virtual bool ComputeCanDeoptimize() const { return false; }
 
@@ -6400,7 +6143,7 @@
   virtual ComparisonInstr* CopyWithNewOperands(Value* left, Value* right);
 
  private:
-  InstanceCallInstr* call_;
+  TemplateDartCall<0>* call_;
   bool is_negated_;
   DISALLOW_COPY_AND_ASSIGN(CheckedSmiComparisonInstr);
 };
@@ -7462,10 +7205,15 @@
   DISALLOW_COPY_AND_ASSIGN(CheckClassIdInstr);
 };
 
-class CheckArrayBoundInstr : public TemplateInstruction<2, NoThrow, Pure> {
+// Performs an array bounds check, where
+//   safe_index := CheckArrayBound(length, index)
+// returns the "safe" index when
+//   0 <= index < length
+// or otherwise deoptimizes (viz. speculative).
+class CheckArrayBoundInstr : public TemplateDefinition<2, NoThrow, Pure> {
  public:
   CheckArrayBoundInstr(Value* length, Value* index, intptr_t deopt_id)
-      : TemplateInstruction(deopt_id),
+      : TemplateDefinition(deopt_id),
         generalized_(false),
         licm_hoisted_(false) {
     SetInputAt(kLengthPos, length);
@@ -7483,7 +7231,7 @@
 
   void mark_generalized() { generalized_ = true; }
 
-  virtual Instruction* Canonicalize(FlowGraph* flow_graph);
+  virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   // Returns the length offset for array and string types.
   static intptr_t LengthOffsetFor(intptr_t class_id);
@@ -7504,10 +7252,15 @@
   DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr);
 };
 
-class GenericCheckBoundInstr : public TemplateInstruction<2, Throws, NoCSE> {
+// Performs an array bounds check, where
+//   safe_index := CheckArrayBound(length, index)
+// returns the "safe" index when
+//   0 <= index < length
+// or otherwise throws an out-of-bounds exception (viz. non-speculative).
+class GenericCheckBoundInstr : public TemplateDefinition<2, Throws, NoCSE> {
  public:
   GenericCheckBoundInstr(Value* length, Value* index, intptr_t deopt_id)
-      : TemplateInstruction(deopt_id) {
+      : TemplateDefinition(deopt_id) {
     SetInputAt(kLengthPos, length);
     SetInputAt(kIndexPos, index);
   }
@@ -7523,6 +7276,8 @@
   // ArgumentError constructor), so it can lazily deopt.
   virtual bool ComputeCanDeoptimize() const { return true; }
 
+  bool IsRedundant(const RangeBoundary& length);
+
   // Give a name to the location/input indices.
   enum { kLengthPos = 0, kIndexPos = 1 };
 
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 05dc2cd..94c7519 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -492,18 +492,9 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  Isolate* isolate = Isolate::Current();
 
-  if (isolate->type_checks()) {
-    __ CompareObject(reg, Bool::True());
-    __ b(&done, EQ);
-    __ CompareObject(reg, Bool::False());
-    __ b(&done, EQ);
-  } else {
-    ASSERT(isolate->asserts() || FLAG_strong);
-    __ CompareObject(reg, Object::null_instance());
-    __ b(&done, NE);
-  }
+  __ CompareObject(reg, Object::null_instance());
+  __ b(&done, NE);
 
   __ Push(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos, deopt_id,
@@ -937,10 +928,7 @@
 
   // All arguments are already @SP due to preceding PushArgument()s.
   ASSERT(ArgumentCount() ==
-                 function().NumParameters() +
-                     (function().IsGeneric() && FLAG_reify_generic_functions)
-             ? 1
-             : 0);
+         function().NumParameters() + (function().IsGeneric() ? 1 : 0));
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
@@ -953,14 +941,14 @@
   // into the runtime system.
   uword entry;
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
-  const StubEntry* stub_entry;
+  const Code* stub;
   if (link_lazily()) {
-    stub_entry = StubCode::CallBootstrapNative_entry();
+    stub = &StubCode::CallBootstrapNative();
     entry = NativeEntry::LinkNativeCallEntry();
   } else {
     entry = reinterpret_cast<uword>(native_c_function());
     if (is_bootstrap_native()) {
-      stub_entry = StubCode::CallBootstrapNative_entry();
+      stub = &StubCode::CallBootstrapNative();
 #if defined(USING_SIMULATOR)
       entry = Simulator::RedirectExternalReference(
           entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments);
@@ -969,12 +957,12 @@
       // In the case of non bootstrap native methods the CallNativeCFunction
       // stub generates the redirection address when running under the simulator
       // and hence we do not change 'entry' here.
-      stub_entry = StubCode::CallAutoScopeNative_entry();
+      stub = &StubCode::CallAutoScopeNative();
     } else {
       // In the case of non bootstrap native methods the CallNativeCFunction
       // stub generates the redirection address when running under the simulator
       // and hence we do not change 'entry' here.
-      stub_entry = StubCode::CallNoScopeNative_entry();
+      stub = &StubCode::CallNoScopeNative();
     }
   }
   __ LoadImmediate(R1, argc_tag);
@@ -983,10 +971,10 @@
       R9, &label,
       link_lazily() ? ObjectPool::kPatchable : ObjectPool::kNotPatchable);
   if (link_lazily()) {
-    compiler->GeneratePatchableCall(token_pos(), *stub_entry,
+    compiler->GeneratePatchableCall(token_pos(), *stub,
                                     RawPcDescriptors::kOther, locs());
   } else {
-    compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
+    compiler->GenerateCall(token_pos(), *stub, RawPcDescriptors::kOther,
                            locs());
   }
   __ Pop(result);
@@ -1484,9 +1472,9 @@
 
 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
-  const bool directly_addressable = aligned() &&
-                                    class_id() != kTypedDataInt64ArrayCid &&
-                                    class_id() != kTypedDataUint64ArrayCid;
+  const bool directly_addressable =
+      aligned() && class_id() != kTypedDataInt64ArrayCid &&
+      class_id() != kTypedDataUint64ArrayCid && class_id() != kArrayCid;
   const intptr_t kNumInputs = 3;
   LocationSummary* locs;
 
@@ -1523,15 +1511,13 @@
 
   switch (class_id()) {
     case kArrayCid:
-#if defined(CONCURRENT_MARKING)
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::RegisterLocation(kWriteBarrierValueReg)
                           : Location::RegisterOrConstant(value()));
-#else
-      locs->set_in(2, ShouldEmitStoreBarrier()
-                          ? Location::WritableRegister()
-                          : Location::RegisterOrConstant(value()));
-#endif
+      if (ShouldEmitStoreBarrier()) {
+        locs->set_in(0, Location::RegisterLocation(kWriteBarrierObjectReg));
+        locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
+      }
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1569,9 +1555,9 @@
 }
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  const bool directly_addressable = aligned() &&
-                                    class_id() != kTypedDataInt64ArrayCid &&
-                                    class_id() != kTypedDataUint64ArrayCid;
+  const bool directly_addressable =
+      aligned() && class_id() != kTypedDataInt64ArrayCid &&
+      class_id() != kTypedDataUint64ArrayCid && class_id() != kArrayCid;
   // The array register points to the backing store for external arrays.
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
@@ -1610,14 +1596,14 @@
     case kArrayCid:
       if (ShouldEmitStoreBarrier()) {
         const Register value = locs()->in(2).reg();
-        __ StoreIntoObject(array, element_address, value, CanValueBeSmi(),
-                           /*lr_reserved=*/!compiler->intrinsic_mode());
+        __ StoreIntoArray(array, temp, value, CanValueBeSmi(),
+                          /*lr_reserved=*/!compiler->intrinsic_mode());
       } else if (locs()->in(2).IsConstant()) {
         const Object& constant = locs()->in(2).constant();
-        __ StoreIntoObjectNoBarrier(array, element_address, constant);
+        __ StoreIntoObjectNoBarrier(array, Address(temp), constant);
       } else {
         const Register value = locs()->in(2).reg();
-        __ StoreIntoObjectNoBarrier(array, element_address, value);
+        __ StoreIntoObjectNoBarrier(array, Address(temp), value);
       }
       break;
     case kTypedDataInt8ArrayCid:
@@ -2033,7 +2019,6 @@
     __ Bind(entry_label());
     const Code& stub = Code::ZoneHandle(
         compiler->zone(), StubCode::GetAllocationStubForClass(cls_));
-    const StubEntry stub_entry(stub);
 
     LocationSummary* locs = instruction()->locs();
 
@@ -2041,7 +2026,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(TokenPosition::kNoSource,  // No token position.
-                           stub_entry, RawPcDescriptors::kOther, locs);
+                           stub, RawPcDescriptors::kOther, locs);
     __ MoveRegister(result_, R0);
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
@@ -2216,15 +2201,9 @@
     summary->set_temp(2, opt ? Location::RequiresFpuRegister()
                              : Location::FpuRegisterLocation(Q1));
   } else {
-#if defined(CONCURRENT_MARKING)
     summary->set_in(1, ShouldEmitStoreBarrier()
                            ? Location::RegisterLocation(kWriteBarrierValueReg)
                            : Location::RegisterOrConstant(value()));
-#else
-    summary->set_in(1, ShouldEmitStoreBarrier()
-                           ? Location::WritableRegister()
-                           : Location::RegisterOrConstant(value()));
-#endif
   }
   return summary;
 }
@@ -2255,12 +2234,13 @@
   Label skip_store;
 
   const Register instance_reg = locs()->in(0).reg();
+  const intptr_t offset_in_bytes = OffsetInBytes();
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
     const DRegister value = EvenDRegisterOf(locs()->in(1).fpu_reg());
     const Register temp = locs()->temp(0).reg();
     const Register temp2 = locs()->temp(1).reg();
-    const intptr_t cid = field().UnboxedFieldCid();
+    const intptr_t cid = slot().field().UnboxedFieldCid();
 
     if (is_initialization()) {
       const Class* cls = NULL;
@@ -2280,10 +2260,10 @@
 
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2,
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes, temp2,
                                Assembler::kValueIsNotSmi);
     } else {
-      __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes_));
+      __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes));
     }
     switch (cid) {
       case kDoubleCid:
@@ -2324,7 +2304,7 @@
     Label store_float32x4;
     Label store_float64x2;
 
-    __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
+    __ LoadObject(temp, Field::ZoneHandle(Z, slot().field().Original()));
 
     __ ldrh(temp2, FieldAddress(temp, Field::is_nullable_offset()));
     __ CompareImmediate(temp2, kNullCid);
@@ -2357,7 +2337,7 @@
     {
       __ Bind(&store_double);
       EnsureMutableBox(compiler, this, temp, compiler->double_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ CopyDoubleField(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
@@ -2365,7 +2345,7 @@
     {
       __ Bind(&store_float32x4);
       EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ CopyFloat32x4Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
@@ -2373,7 +2353,7 @@
     {
       __ Bind(&store_float64x2);
       EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ CopyFloat64x2Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
     }
@@ -2387,16 +2367,16 @@
     // by executing 'ret LR' directly. Therefore we cannot overwrite LR. (see
     // ReturnInstr::EmitNativeCode).
     ASSERT(!locs()->live_registers()->Contains(Location::RegisterLocation(LR)));
-    __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, value_reg,
+    __ StoreIntoObjectOffset(instance_reg, offset_in_bytes, value_reg,
                              CanValueBeSmi(),
                              /*lr_reserved=*/!compiler->intrinsic_mode());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrierOffset(instance_reg, offset_in_bytes_,
+      __ StoreIntoObjectNoBarrierOffset(instance_reg, offset_in_bytes,
                                         locs()->in(1).constant());
     } else {
       const Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrierOffset(instance_reg, offset_in_bytes_,
+      __ StoreIntoObjectNoBarrierOffset(instance_reg, offset_in_bytes,
                                         value_reg);
     }
   }
@@ -2431,12 +2411,7 @@
   const intptr_t kNumTemps = 1;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
-#if defined(CONCURRENT_MARKING)
   locs->set_in(0, Location::RegisterLocation(kWriteBarrierValueReg));
-#else
-  locs->set_in(0, value()->NeedsWriteBarrier() ? Location::WritableRegister()
-                                               : Location::RequiresRegister());
-#endif
   locs->set_temp(0, Location::RequiresRegister());
   return locs;
 }
@@ -2579,7 +2554,7 @@
     }
   }
   compiler->GenerateCallWithDeopt(token_pos(), deopt_id(),
-                                  *StubCode::AllocateArray_entry(),
+                                  StubCode::AllocateArray(),
                                   RawPcDescriptors::kOther, locs());
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
@@ -2616,8 +2591,8 @@
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
     const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
     const Register temp = locs()->temp(0).reg();
-    __ LoadFieldFromOffset(kWord, temp, instance_reg, offset_in_bytes());
-    const intptr_t cid = field()->UnboxedFieldCid();
+    __ LoadFieldFromOffset(kWord, temp, instance_reg, OffsetInBytes());
+    const intptr_t cid = slot().field().UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleLoadFieldInstr");
@@ -2652,7 +2627,7 @@
     Label load_float32x4;
     Label load_float64x2;
 
-    __ LoadObject(result_reg, Field::ZoneHandle(field()->Original()));
+    __ LoadObject(result_reg, Field::ZoneHandle(slot().field().Original()));
 
     FieldAddress field_cid_operand(result_reg, Field::guarded_cid_offset());
     FieldAddress field_nullability_operand(result_reg,
@@ -2685,7 +2660,7 @@
       __ Bind(&load_double);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
                                       result_reg, temp);
-      __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ ldr(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ CopyDoubleField(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
@@ -2694,7 +2669,7 @@
       __ Bind(&load_float32x4);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float32x4_class(), result_reg, temp);
-      __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ ldr(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ CopyFloat32x4Field(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
@@ -2703,14 +2678,14 @@
       __ Bind(&load_float64x2);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float64x2_class(), result_reg, temp);
-      __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ ldr(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ CopyFloat64x2Field(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
 
     __ Bind(&load_pointer);
   }
-  __ LoadFieldFromOffset(kWord, result_reg, instance_reg, offset_in_bytes());
+  __ LoadFieldFromOffset(kWord, result_reg, instance_reg, OffsetInBytes());
   __ Bind(&done);
 }
 
@@ -2767,9 +2742,10 @@
 
   // 'instantiator_type_args_reg' is a TypeArguments object (or null).
   // 'function_type_args_reg' is a TypeArguments object (or null).
-  ASSERT(!type_arguments().IsUninstantiatedIdentity() &&
-         !type_arguments().CanShareInstantiatorTypeArguments(
-             instantiator_class()));
+  ASSERT(!type_arguments().CanShareInstantiatorTypeArguments(
+             instantiator_class()) &&
+         !type_arguments().CanShareFunctionTypeArguments(
+             compiler->parsed_function().function()));
   // If both the instantiator and function type arguments are null and if the
   // type argument vector instantiated from null becomes a vector of dynamic,
   // then use null as the type arguments.
@@ -2856,7 +2832,7 @@
 
     __ LoadImmediate(R1, instruction()->num_context_variables());
     compiler->GenerateCall(instruction()->token_pos(),
-                           *StubCode::AllocateContext_entry(),
+                           StubCode::AllocateContext(),
                            RawPcDescriptors::kOther, locs);
     ASSERT(instruction()->locs()->out(0).reg() == R0);
     compiler->RestoreLiveRegisters(instruction()->locs());
@@ -2902,7 +2878,7 @@
   ASSERT(locs()->out(0).reg() == R0);
 
   __ LoadImmediate(R1, num_context_variables());
-  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+  compiler->GenerateCall(token_pos(), StubCode::AllocateContext(),
                          RawPcDescriptors::kOther, locs());
 }
 
@@ -3012,8 +2988,12 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new (zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  const bool using_shared_stub = UseSharedSlowPathStub(opt);
+  ASSERT((kReservedCpuRegisters & (1 << LR)) != 0);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                                        : LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
   return summary;
 }
@@ -3054,7 +3034,6 @@
               ? Thread::stack_overflow_shared_with_fpu_regs_entry_point_offset()
               : Thread::
                     stack_overflow_shared_without_fpu_regs_entry_point_offset();
-      ASSERT(kReservedCpuRegisters & (1 << LR));
       __ ldr(LR, Address(THR, entry_point_offset));
       __ blx(LR);
       compiler->RecordSafepoint(instruction()->locs(), kNumSlowPathArgs);
@@ -3233,13 +3212,12 @@
     }
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
-    const String& selector =
-        String::Handle(instruction()->call()->ic_data()->target_name());
-    const Array& arguments_descriptor =
-        Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
+    const auto& selector = String::Handle(instruction()->call()->Selector());
+    const auto& arguments_descriptor = Array::Handle(
+        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
+        instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ mov(result, Operand(R0));
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
@@ -3374,13 +3352,12 @@
     }
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
-    String& selector =
-        String::Handle(instruction()->call()->ic_data()->target_name());
-    const Array& arguments_descriptor =
-        Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
+    const auto& selector = String::Handle(instruction()->call()->Selector());
+    const auto& arguments_descriptor = Array::Handle(
+        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
+        instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ mov(result, Operand(R0));
     compiler->RestoreLiveRegisters(locs);
     compiler->pending_deoptimization_env_ = NULL;
@@ -6752,15 +6729,13 @@
   }
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
-  const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), stub, RawPcDescriptors::kOther, locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  __ BranchLinkPatchable(*StubCode::DebugStepCheck_entry());
+  __ BranchLinkPatchable(StubCode::DebugStepCheck());
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
   compiler->RecordSafepoint(locs());
 }
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index f3d72fb..9c03a18 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -491,18 +491,9 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  Isolate* isolate = Isolate::Current();
 
-  if (isolate->type_checks()) {
-    __ CompareObject(reg, Bool::True());
-    __ b(&done, EQ);
-    __ CompareObject(reg, Bool::False());
-    __ b(&done, EQ);
-  } else {
-    ASSERT(isolate->asserts() || FLAG_strong);
-    __ CompareObject(reg, Object::null_instance());
-    __ b(&done, NE);
-  }
+  __ CompareObject(reg, Object::null_instance());
+  __ b(&done, NE);
 
   __ Push(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos, deopt_id,
@@ -827,10 +818,7 @@
 
   // All arguments are already @SP due to preceding PushArgument()s.
   ASSERT(ArgumentCount() ==
-                 function().NumParameters() +
-                     (function().IsGeneric() && FLAG_reify_generic_functions)
-             ? 1
-             : 0);
+         function().NumParameters() + (function().IsGeneric() ? 1 : 0));
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
@@ -843,14 +831,14 @@
   // into the runtime system.
   uword entry;
   const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
-  const StubEntry* stub_entry;
+  const Code* stub;
   if (link_lazily()) {
-    stub_entry = StubCode::CallBootstrapNative_entry();
+    stub = &StubCode::CallBootstrapNative();
     entry = NativeEntry::LinkNativeCallEntry();
   } else {
     entry = reinterpret_cast<uword>(native_c_function());
     if (is_bootstrap_native()) {
-      stub_entry = StubCode::CallBootstrapNative_entry();
+      stub = &StubCode::CallBootstrapNative();
 #if defined(USING_SIMULATOR)
       entry = Simulator::RedirectExternalReference(
           entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments);
@@ -859,12 +847,12 @@
       // In the case of non bootstrap native methods the CallNativeCFunction
       // stub generates the redirection address when running under the simulator
       // and hence we do not change 'entry' here.
-      stub_entry = StubCode::CallAutoScopeNative_entry();
+      stub = &StubCode::CallAutoScopeNative();
     } else {
       // In the case of non bootstrap native methods the CallNativeCFunction
       // stub generates the redirection address when running under the simulator
       // and hence we do not change 'entry' here.
-      stub_entry = StubCode::CallNoScopeNative_entry();
+      stub = &StubCode::CallNoScopeNative();
     }
   }
   __ LoadImmediate(R1, argc_tag);
@@ -873,10 +861,10 @@
       R5, &label,
       link_lazily() ? ObjectPool::kPatchable : ObjectPool::kNotPatchable);
   if (link_lazily()) {
-    compiler->GeneratePatchableCall(token_pos(), *stub_entry,
+    compiler->GeneratePatchableCall(token_pos(), *stub,
                                     RawPcDescriptors::kOther, locs());
   } else {
-    compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
+    compiler->GenerateCall(token_pos(), *stub, RawPcDescriptors::kOther,
                            locs());
   }
   __ Pop(result);
@@ -1357,7 +1345,7 @@
 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
-  const intptr_t kNumTemps = aligned() ? 0 : 2;
+  const intptr_t kNumTemps = aligned() ? 1 : 2;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
@@ -1366,17 +1354,19 @@
   } else {
     locs->set_in(1, Location::WritableRegister());
   }
+  for (intptr_t i = 0; i < kNumTemps; i++) {
+    locs->set_temp(i, Location::RequiresRegister());
+  }
+
   switch (class_id()) {
     case kArrayCid:
-#if defined(CONCURRENT_MARKING)
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::RegisterLocation(kWriteBarrierValueReg)
                           : Location::RegisterOrConstant(value()));
-#else
-      locs->set_in(2, ShouldEmitStoreBarrier()
-                          ? Location::WritableRegister()
-                          : Location::RegisterOrConstant(value()));
-#endif
+      if (ShouldEmitStoreBarrier()) {
+        locs->set_in(0, Location::RegisterLocation(kWriteBarrierObjectReg));
+        locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
+      }
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1405,10 +1395,6 @@
       UNREACHABLE();
       return NULL;
   }
-  if (!aligned()) {
-    locs->set_temp(0, Location::RequiresRegister());
-    locs->set_temp(1, Location::RequiresRegister());
-  }
   return locs;
 }
 
@@ -1416,30 +1402,18 @@
   // The array register points to the backing store for external arrays.
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
-  const Register address = aligned() ? kNoRegister : locs()->temp(0).reg();
+  const Register address = locs()->temp(0).reg();
   const Register scratch = aligned() ? kNoRegister : locs()->temp(1).reg();
 
-  Address element_address(TMP);  // Bad address.
-  if (aligned()) {
-    element_address =
-        index.IsRegister()
-            ? __ ElementAddressForRegIndex(false,  // Store.
-                                           IsExternal(), class_id(),
-                                           index_scale(), array, index.reg())
-            : __ ElementAddressForIntIndex(IsExternal(), class_id(),
-                                           index_scale(), array,
-                                           Smi::Cast(index.constant()).Value());
+  if (index.IsRegister()) {
+    __ LoadElementAddressForRegIndex(address,
+                                     false,  // Store.
+                                     IsExternal(), class_id(), index_scale(),
+                                     array, index.reg());
   } else {
-    if (index.IsRegister()) {
-      __ LoadElementAddressForRegIndex(address,
-                                       false,  // Store.
-                                       IsExternal(), class_id(), index_scale(),
-                                       array, index.reg());
-    } else {
-      __ LoadElementAddressForIntIndex(address, IsExternal(), class_id(),
-                                       index_scale(), array,
-                                       Smi::Cast(index.constant()).Value());
-    }
+    __ LoadElementAddressForIntIndex(address, IsExternal(), class_id(),
+                                     index_scale(), array,
+                                     Smi::Cast(index.constant()).Value());
   }
 
   switch (class_id()) {
@@ -1447,14 +1421,14 @@
       ASSERT(aligned());
       if (ShouldEmitStoreBarrier()) {
         const Register value = locs()->in(2).reg();
-        __ StoreIntoObject(array, element_address, value, CanValueBeSmi(),
-                           /*lr_reserved=*/!compiler->intrinsic_mode());
+        __ StoreIntoArray(array, address, value, CanValueBeSmi(),
+                          /*lr_reserved=*/!compiler->intrinsic_mode());
       } else if (locs()->in(2).IsConstant()) {
         const Object& constant = locs()->in(2).constant();
-        __ StoreIntoObjectNoBarrier(array, element_address, constant);
+        __ StoreIntoObjectNoBarrier(array, Address(address), constant);
       } else {
         const Register value = locs()->in(2).reg();
-        __ StoreIntoObjectNoBarrier(array, element_address, value);
+        __ StoreIntoObjectNoBarrier(array, Address(address), value);
       }
       break;
     case kTypedDataInt8ArrayCid:
@@ -1465,11 +1439,11 @@
       if (locs()->in(2).IsConstant()) {
         const Smi& constant = Smi::Cast(locs()->in(2).constant());
         __ LoadImmediate(TMP, static_cast<int8_t>(constant.Value()));
-        __ str(TMP, element_address, kUnsignedByte);
+        __ str(TMP, Address(address), kUnsignedByte);
       } else {
         const Register value = locs()->in(2).reg();
         __ SmiUntag(TMP, value);
-        __ str(TMP, element_address, kUnsignedByte);
+        __ str(TMP, Address(address), kUnsignedByte);
       }
       break;
     }
@@ -1486,7 +1460,7 @@
           value = 0;
         }
         __ LoadImmediate(TMP, static_cast<int8_t>(value));
-        __ str(TMP, element_address, kUnsignedByte);
+        __ str(TMP, Address(address), kUnsignedByte);
       } else {
         const Register value = locs()->in(2).reg();
         __ CompareImmediate(value, 0x1FE);  // Smi value and smi 0xFF.
@@ -1494,7 +1468,7 @@
         __ csetm(TMP, GT);             // TMP = value > 0x1FE ? -1 : 0.
         __ csel(TMP, value, TMP, LS);  // TMP = value in range ? value : TMP.
         __ SmiUntag(TMP);
-        __ str(TMP, element_address, kUnsignedByte);
+        __ str(TMP, Address(address), kUnsignedByte);
       }
       break;
     }
@@ -1503,7 +1477,7 @@
       const Register value = locs()->in(2).reg();
       __ SmiUntag(TMP, value);
       if (aligned()) {
-        __ str(TMP, element_address, kUnsignedHalfword);
+        __ str(TMP, Address(address), kUnsignedHalfword);
       } else {
         __ StoreUnaligned(TMP, address, scratch, kUnsignedHalfword);
       }
@@ -1513,7 +1487,7 @@
     case kTypedDataUint32ArrayCid: {
       const Register value = locs()->in(2).reg();
       if (aligned()) {
-        __ str(value, element_address, kUnsignedWord);
+        __ str(value, Address(address), kUnsignedWord);
       } else {
         __ StoreUnaligned(value, address, scratch, kUnsignedWord);
       }
@@ -1523,7 +1497,7 @@
     case kTypedDataUint64ArrayCid: {
       const Register value = locs()->in(2).reg();
       if (aligned()) {
-        __ str(value, element_address, kDoubleWord);
+        __ str(value, Address(address), kDoubleWord);
       } else {
         __ StoreUnaligned(value, address, scratch, kDoubleWord);
       }
@@ -1532,7 +1506,7 @@
     case kTypedDataFloat32ArrayCid: {
       const VRegister value_reg = locs()->in(2).fpu_reg();
       if (aligned()) {
-        __ fstrs(value_reg, element_address);
+        __ fstrs(value_reg, Address(address));
       } else {
         __ fmovrs(TMP, value_reg);
         __ StoreUnaligned(TMP, address, scratch, kWord);
@@ -1542,7 +1516,7 @@
     case kTypedDataFloat64ArrayCid: {
       const VRegister value_reg = locs()->in(2).fpu_reg();
       if (aligned()) {
-        __ fstrd(value_reg, element_address);
+        __ fstrd(value_reg, Address(address));
       } else {
         __ fmovrd(TMP, value_reg);
         __ StoreUnaligned(TMP, address, scratch, kDoubleWord);
@@ -1554,7 +1528,7 @@
     case kTypedDataFloat32x4ArrayCid: {
       ASSERT(aligned());
       const VRegister value_reg = locs()->in(2).fpu_reg();
-      __ fstrq(value_reg, element_address);
+      __ fstrq(value_reg, Address(address));
       break;
     }
     default:
@@ -1655,7 +1629,7 @@
   Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
   if (emit_full_guard) {
-    __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
+    __ LoadObject(field_reg, Field::ZoneHandle((field().Original())));
 
     FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset(),
                                    kUnsignedHalfword);
@@ -1860,7 +1834,6 @@
     __ Bind(entry_label());
     const Code& stub = Code::ZoneHandle(
         compiler->zone(), StubCode::GetAllocationStubForClass(cls_));
-    const StubEntry stub_entry(stub);
 
     LocationSummary* locs = instruction()->locs();
 
@@ -1868,7 +1841,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(TokenPosition::kNoSource,  // No token position.
-                           stub_entry, RawPcDescriptors::kOther, locs);
+                           stub, RawPcDescriptors::kOther, locs);
     __ MoveRegister(result_, R0);
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
@@ -1938,15 +1911,9 @@
     summary->set_temp(0, Location::RequiresRegister());
     summary->set_temp(1, Location::RequiresRegister());
   } else {
-#if defined(CONCURRENT_MARKING)
     summary->set_in(1, ShouldEmitStoreBarrier()
                            ? Location::RegisterLocation(kWriteBarrierValueReg)
                            : Location::RegisterOrConstant(value()));
-#else
-    summary->set_in(1, ShouldEmitStoreBarrier()
-                           ? Location::WritableRegister()
-                           : Location::RegisterOrConstant(value()));
-#endif
   }
   return summary;
 }
@@ -1956,12 +1923,13 @@
   Label skip_store;
 
   const Register instance_reg = locs()->in(0).reg();
+  const intptr_t offset_in_bytes = OffsetInBytes();
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
     const VRegister value = locs()->in(1).fpu_reg();
     const Register temp = locs()->temp(0).reg();
     const Register temp2 = locs()->temp(1).reg();
-    const intptr_t cid = field().UnboxedFieldCid();
+    const intptr_t cid = slot().field().UnboxedFieldCid();
 
     if (is_initialization()) {
       const Class* cls = NULL;
@@ -1981,11 +1949,11 @@
 
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2,
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes, temp2,
                                Assembler::kValueIsNotSmi,
                                /*lr_reserved=*/!compiler->intrinsic_mode());
     } else {
-      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes_);
+      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes);
     }
     switch (cid) {
       case kDoubleCid:
@@ -2023,7 +1991,7 @@
     Label store_float32x4;
     Label store_float64x2;
 
-    __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
+    __ LoadObject(temp, Field::ZoneHandle(Z, slot().field().Original()));
 
     __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(),
                            kUnsignedHalfword);
@@ -2061,7 +2029,7 @@
     {
       __ Bind(&store_double);
       EnsureMutableBox(compiler, this, temp, compiler->double_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ LoadDFieldFromOffset(VTMP, value_reg, Double::value_offset());
       __ StoreDFieldToOffset(VTMP, temp, Double::value_offset());
       __ b(&skip_store);
@@ -2070,7 +2038,7 @@
     {
       __ Bind(&store_float32x4);
       EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ LoadQFieldFromOffset(VTMP, value_reg, Float32x4::value_offset());
       __ StoreQFieldToOffset(VTMP, temp, Float32x4::value_offset());
       __ b(&skip_store);
@@ -2079,7 +2047,7 @@
     {
       __ Bind(&store_float64x2);
       EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ LoadQFieldFromOffset(VTMP, value_reg, Float64x2::value_offset());
       __ StoreQFieldToOffset(VTMP, temp, Float64x2::value_offset());
       __ b(&skip_store);
@@ -2094,16 +2062,16 @@
     // by executing 'ret LR' directly. Therefore we cannot overwrite LR. (see
     // ReturnInstr::EmitNativeCode).
     ASSERT((kDartAvailableCpuRegs & (1 << LR)) == 0);
-    __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, value_reg,
+    __ StoreIntoObjectOffset(instance_reg, offset_in_bytes, value_reg,
                              CanValueBeSmi(),
                              /*lr_reserved=*/!compiler->intrinsic_mode());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes_,
+      __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes,
                                         locs()->in(1).constant());
     } else {
       const Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes_,
+      __ StoreIntoObjectOffsetNoBarrier(instance_reg, offset_in_bytes,
                                         value_reg);
     }
   }
@@ -2136,12 +2104,7 @@
                                                             bool opt) const {
   LocationSummary* locs =
       new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
-#if defined(CONCURRENT_MARKING)
   locs->set_in(0, Location::RegisterLocation(kWriteBarrierValueReg));
-#else
-  locs->set_in(0, value()->NeedsWriteBarrier() ? Location::WritableRegister()
-                                               : Location::RequiresRegister());
-#endif
   locs->set_temp(0, Location::RequiresRegister());
   return locs;
 }
@@ -2287,7 +2250,7 @@
     }
   }
   compiler->GenerateCallWithDeopt(token_pos(), deopt_id(),
-                                  *StubCode::AllocateArray_entry(),
+                                  StubCode::AllocateArray(),
                                   RawPcDescriptors::kOther, locs());
   ASSERT(locs()->out(0).reg() == kResultReg);
 }
@@ -2319,8 +2282,8 @@
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
     const VRegister result = locs()->out(0).fpu_reg();
     const Register temp = locs()->temp(0).reg();
-    __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
-    const intptr_t cid = field()->UnboxedFieldCid();
+    __ LoadFieldFromOffset(temp, instance_reg, OffsetInBytes());
+    const intptr_t cid = slot().field().UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleLoadFieldInstr");
@@ -2348,7 +2311,7 @@
     Label load_float32x4;
     Label load_float64x2;
 
-    __ LoadObject(result_reg, Field::ZoneHandle(field()->Original()));
+    __ LoadObject(result_reg, Field::ZoneHandle(slot().field().Original()));
 
     FieldAddress field_cid_operand(result_reg, Field::guarded_cid_offset(),
                                    kUnsignedHalfword);
@@ -2382,7 +2345,7 @@
       __ Bind(&load_double);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
                                       result_reg, temp);
-      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
+      __ LoadFieldFromOffset(temp, instance_reg, OffsetInBytes());
       __ LoadDFieldFromOffset(VTMP, temp, Double::value_offset());
       __ StoreDFieldToOffset(VTMP, result_reg, Double::value_offset());
       __ b(&done);
@@ -2392,7 +2355,7 @@
       __ Bind(&load_float32x4);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float32x4_class(), result_reg, temp);
-      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
+      __ LoadFieldFromOffset(temp, instance_reg, OffsetInBytes());
       __ LoadQFieldFromOffset(VTMP, temp, Float32x4::value_offset());
       __ StoreQFieldToOffset(VTMP, result_reg, Float32x4::value_offset());
       __ b(&done);
@@ -2402,7 +2365,7 @@
       __ Bind(&load_float64x2);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float64x2_class(), result_reg, temp);
-      __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes());
+      __ LoadFieldFromOffset(temp, instance_reg, OffsetInBytes());
       __ LoadQFieldFromOffset(VTMP, temp, Float64x2::value_offset());
       __ StoreQFieldToOffset(VTMP, result_reg, Float64x2::value_offset());
       __ b(&done);
@@ -2410,7 +2373,7 @@
 
     __ Bind(&load_pointer);
   }
-  __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes());
+  __ LoadFieldFromOffset(result_reg, instance_reg, OffsetInBytes());
   __ Bind(&done);
 }
 
@@ -2467,9 +2430,10 @@
 
   // 'instantiator_type_args_reg' is a TypeArguments object (or null).
   // 'function_type_args_reg' is a TypeArguments object (or null).
-  ASSERT(!type_arguments().IsUninstantiatedIdentity() &&
-         !type_arguments().CanShareInstantiatorTypeArguments(
-             instantiator_class()));
+  ASSERT(!type_arguments().CanShareInstantiatorTypeArguments(
+             instantiator_class()) &&
+         !type_arguments().CanShareFunctionTypeArguments(
+             compiler->parsed_function().function()));
   // If both the instantiator and function type arguments are null and if the
   // type argument vector instantiated from null becomes a vector of dynamic,
   // then use null as the type arguments.
@@ -2556,7 +2520,7 @@
 
     __ LoadImmediate(R1, instruction()->num_context_variables());
     compiler->GenerateCall(instruction()->token_pos(),
-                           *StubCode::AllocateContext_entry(),
+                           StubCode::AllocateContext(),
                            RawPcDescriptors::kOther, locs);
     ASSERT(instruction()->locs()->out(0).reg() == R0);
     compiler->RestoreLiveRegisters(instruction()->locs());
@@ -2602,7 +2566,7 @@
   ASSERT(locs()->out(0).reg() == R0);
 
   __ LoadImmediate(R1, num_context_variables());
-  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+  compiler->GenerateCall(token_pos(), StubCode::AllocateContext(),
                          RawPcDescriptors::kOther, locs());
 }
 
@@ -2712,8 +2676,12 @@
                                                               bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary = new (zone) LocationSummary(
-      zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+  const bool using_shared_stub = UseSharedSlowPathStub(opt);
+  ASSERT((kReservedCpuRegisters & (1 << LR)) != 0);
+  LocationSummary* summary = new (zone)
+      LocationSummary(zone, kNumInputs, kNumTemps,
+                      using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+                                        : LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
   return summary;
 }
@@ -2754,8 +2722,6 @@
               ? Thread::stack_overflow_shared_with_fpu_regs_entry_point_offset()
               : Thread::
                     stack_overflow_shared_without_fpu_regs_entry_point_offset();
-      ASSERT(instruction()->locs()->temp(1).IsRegister() &&
-             instruction()->locs()->temp(1).reg() == LR);
       __ ldr(LR, Address(THR, entry_point_offset));
       __ blr(LR);
       compiler->RecordSafepoint(instruction()->locs(), kNumSlowPathArgs);
@@ -2941,13 +2907,12 @@
     }
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
-    const String& selector =
-        String::Handle(instruction()->call()->ic_data()->target_name());
-    const Array& arguments_descriptor =
-        Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
+    const auto& selector = String::Handle(instruction()->call()->Selector());
+    const auto& arguments_descriptor = Array::Handle(
+        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
+        instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ mov(result, R0);
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
@@ -3084,13 +3049,12 @@
     }
     __ Push(locs->in(0).reg());
     __ Push(locs->in(1).reg());
-    String& selector =
-        String::Handle(instruction()->call()->ic_data()->target_name());
-    const Array& arguments_descriptor =
-        Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
+    const auto& selector = String::Handle(instruction()->call()->Selector());
+    const auto& arguments_descriptor = Array::Handle(
+        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
+        instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ mov(result, R0);
     compiler->RestoreLiveRegisters(locs);
     compiler->pending_deoptimization_env_ = NULL;
@@ -6002,15 +5966,13 @@
   }
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
-  const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), stub, RawPcDescriptors::kOther, locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  __ BranchLinkPatchable(*StubCode::DebugStepCheck_entry());
+  __ BranchLinkPatchable(StubCode::DebugStepCheck());
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
   compiler->RecordSafepoint(locs());
 }
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index 71c3db4..42beb69 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -199,8 +199,7 @@
   if (compiler->is_optimizing()) {
     __ Push(locs()->in(0).reg());
   }
-  Isolate* isolate = Isolate::Current();
-  __ AssertBoolean(isolate->type_checks() ? 1 : 0);
+  __ AssertBoolean(0);
   compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
                                  token_pos());
   compiler->RecordAfterCall(this, FlowGraphCompiler::kHasResult);
@@ -516,20 +515,23 @@
   }
 
   if (!compiler->is_optimizing()) {
-    const Bytecode::Opcode eq_op = needs_number_check()
-                                       ? Bytecode::kIfEqStrictNumTOS
-                                       : Bytecode::kIfEqStrictTOS;
-    const Bytecode::Opcode ne_op = needs_number_check()
-                                       ? Bytecode::kIfNeStrictNumTOS
-                                       : Bytecode::kIfNeStrictTOS;
+    const SimulatorBytecode::Opcode eq_op =
+        needs_number_check() ? SimulatorBytecode::kIfEqStrictNumTOS
+                             : SimulatorBytecode::kIfEqStrictTOS;
+    const SimulatorBytecode::Opcode ne_op =
+        needs_number_check() ? SimulatorBytecode::kIfNeStrictNumTOS
+                             : SimulatorBytecode::kIfNeStrictTOS;
     __ Emit(comparison == Token::kEQ_STRICT ? eq_op : ne_op);
   } else {
-    const Bytecode::Opcode eq_op =
-        needs_number_check() ? Bytecode::kIfEqStrictNum : Bytecode::kIfEqStrict;
-    const Bytecode::Opcode ne_op =
-        needs_number_check() ? Bytecode::kIfNeStrictNum : Bytecode::kIfNeStrict;
-    __ Emit(Bytecode::Encode((comparison == Token::kEQ_STRICT) ? eq_op : ne_op,
-                             locs()->in(0).reg(), locs()->in(1).reg()));
+    const SimulatorBytecode::Opcode eq_op =
+        needs_number_check() ? SimulatorBytecode::kIfEqStrictNum
+                             : SimulatorBytecode::kIfEqStrict;
+    const SimulatorBytecode::Opcode ne_op =
+        needs_number_check() ? SimulatorBytecode::kIfNeStrictNum
+                             : SimulatorBytecode::kIfNeStrict;
+    __ Emit(SimulatorBytecode::Encode(
+        (comparison == Token::kEQ_STRICT) ? eq_op : ne_op, locs()->in(0).reg(),
+        locs()->in(1).reg()));
   }
 
   if (needs_number_check() && token_pos().IsReal()) {
@@ -1084,34 +1086,34 @@
 
 EMIT_NATIVE_CODE(StoreInstanceField, 2) {
   ASSERT(!HasTemp());
-  ASSERT(offset_in_bytes() % kWordSize == 0);
+  ASSERT(OffsetInBytes() % kWordSize == 0);
   if (compiler->is_optimizing()) {
     const Register value = locs()->in(1).reg();
     const Register instance = locs()->in(0).reg();
-    if (Utils::IsInt(8, offset_in_bytes() / kWordSize)) {
-      __ StoreField(instance, offset_in_bytes() / kWordSize, value);
+    if (Utils::IsInt(8, OffsetInBytes() / kWordSize)) {
+      __ StoreField(instance, OffsetInBytes() / kWordSize, value);
     } else {
       __ StoreFieldExt(instance, value);
-      __ Nop(offset_in_bytes() / kWordSize);
+      __ Nop(OffsetInBytes() / kWordSize);
     }
   } else {
-    __ StoreFieldTOS(offset_in_bytes() / kWordSize);
+    __ StoreFieldTOS(OffsetInBytes() / kWordSize);
   }
 }
 
 EMIT_NATIVE_CODE(LoadField, 1, Location::RequiresRegister()) {
-  ASSERT(offset_in_bytes() % kWordSize == 0);
+  ASSERT(OffsetInBytes() % kWordSize == 0);
   if (compiler->is_optimizing()) {
     const Register result = locs()->out(0).reg();
     const Register instance = locs()->in(0).reg();
-    if (Utils::IsInt(8, offset_in_bytes() / kWordSize)) {
-      __ LoadField(result, instance, offset_in_bytes() / kWordSize);
+    if (Utils::IsInt(8, OffsetInBytes() / kWordSize)) {
+      __ LoadField(result, instance, OffsetInBytes() / kWordSize);
     } else {
       __ LoadFieldExt(result, instance);
-      __ Nop(offset_in_bytes() / kWordSize);
+      __ Nop(OffsetInBytes() / kWordSize);
     }
   } else {
-    __ LoadFieldTOS(offset_in_bytes() / kWordSize);
+    __ LoadFieldTOS(OffsetInBytes() / kWordSize);
   }
 }
 
@@ -1848,63 +1850,43 @@
   }
 }
 
-static Token::Kind FlipCondition(Token::Kind kind) {
+static SimulatorBytecode::Opcode OpcodeForSmiCondition(Token::Kind kind) {
   switch (kind) {
     case Token::kEQ:
-      return Token::kNE;
+      return SimulatorBytecode::kIfEqStrict;
     case Token::kNE:
-      return Token::kEQ;
+      return SimulatorBytecode::kIfNeStrict;
     case Token::kLT:
-      return Token::kGTE;
+      return SimulatorBytecode::kIfLt;
     case Token::kGT:
-      return Token::kLTE;
+      return SimulatorBytecode::kIfGt;
     case Token::kLTE:
-      return Token::kGT;
+      return SimulatorBytecode::kIfLe;
     case Token::kGTE:
-      return Token::kLT;
+      return SimulatorBytecode::kIfGe;
     default:
       UNREACHABLE();
-      return Token::kNE;
+      return SimulatorBytecode::kTrap;
   }
 }
 
-static Bytecode::Opcode OpcodeForSmiCondition(Token::Kind kind) {
+static SimulatorBytecode::Opcode OpcodeForDoubleCondition(Token::Kind kind) {
   switch (kind) {
     case Token::kEQ:
-      return Bytecode::kIfEqStrict;
+      return SimulatorBytecode::kIfDEq;
     case Token::kNE:
-      return Bytecode::kIfNeStrict;
+      return SimulatorBytecode::kIfDNe;
     case Token::kLT:
-      return Bytecode::kIfLt;
+      return SimulatorBytecode::kIfDLt;
     case Token::kGT:
-      return Bytecode::kIfGt;
+      return SimulatorBytecode::kIfDGt;
     case Token::kLTE:
-      return Bytecode::kIfLe;
+      return SimulatorBytecode::kIfDLe;
     case Token::kGTE:
-      return Bytecode::kIfGe;
+      return SimulatorBytecode::kIfDGe;
     default:
       UNREACHABLE();
-      return Bytecode::kTrap;
-  }
-}
-
-static Bytecode::Opcode OpcodeForDoubleCondition(Token::Kind kind) {
-  switch (kind) {
-    case Token::kEQ:
-      return Bytecode::kIfDEq;
-    case Token::kNE:
-      return Bytecode::kIfDNe;
-    case Token::kLT:
-      return Bytecode::kIfDLt;
-    case Token::kGT:
-      return Bytecode::kIfDGt;
-    case Token::kLTE:
-      return Bytecode::kIfDLe;
-    case Token::kGTE:
-      return Bytecode::kIfDGe;
-    default:
-      UNREACHABLE();
-      return Bytecode::kTrap;
+      return SimulatorBytecode::kTrap;
   }
 }
 
@@ -1917,16 +1899,17 @@
   if (labels.fall_through != labels.false_label) {
     // If we aren't falling through to the false label, we can save a Jump
     // instruction in the case that the true case is the fall through by
-    // flipping the sense of the test such that the instruction following the
+    // negating the sense of the test such that the instruction following the
     // test is the Jump to the false label.  In the case where both labels are
-    // null we don't flip the sense of the test.
+    // null we don't negate the sense of the test.
     condition = NEXT_IS_FALSE;
-    comparison = FlipCondition(kind);
+    comparison = Token::NegateComparison(kind);
   }
   if (compiler->is_optimizing()) {
     const Register left = locs->in(0).reg();
     const Register right = locs->in(1).reg();
-    __ Emit(Bytecode::Encode(OpcodeForSmiCondition(comparison), left, right));
+    __ Emit(SimulatorBytecode::Encode(OpcodeForSmiCondition(comparison), left,
+                                      right));
     return condition;
   } else {
     switch (kind) {
@@ -1967,7 +1950,8 @@
   // TODO(fschneider): Change the block order instead in DBC so that the
   // false block in always the fall-through block.
   Condition condition = NEXT_IS_TRUE;
-  __ Emit(Bytecode::Encode(OpcodeForDoubleCondition(comparison), left, right));
+  __ Emit(SimulatorBytecode::Encode(OpcodeForDoubleCondition(comparison), left,
+                                    right));
   return condition;
 }
 
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 182ddd3..ce677dc 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -312,18 +312,9 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  Isolate* isolate = Isolate::Current();
 
-  if (isolate->type_checks()) {
-    __ CompareObject(reg, Bool::True());
-    __ j(EQUAL, &done, Assembler::kNearJump);
-    __ CompareObject(reg, Bool::False());
-    __ j(EQUAL, &done, Assembler::kNearJump);
-  } else {
-    ASSERT(isolate->asserts() || FLAG_strong);
-    __ CompareObject(reg, Object::null_instance());
-    __ j(NOT_EQUAL, &done, Assembler::kNearJump);
-  }
+  __ CompareObject(reg, Object::null_instance());
+  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
 
   __ pushl(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos, deopt_id,
@@ -822,10 +813,7 @@
 
   // All arguments are already @ESP due to preceding PushArgument()s.
   ASSERT(ArgumentCount() ==
-                 function().NumParameters() +
-                     (function().IsGeneric() && FLAG_reify_generic_functions)
-             ? 1
-             : 0);
+         function().NumParameters() + (function().IsGeneric() ? 1 : 0));
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
@@ -835,21 +823,20 @@
 
   __ movl(EDX, Immediate(argc_tag));
 
-  const StubEntry* stub_entry;
+  const Code* stub;
 
   // There is no lazy-linking support on ia32.
   ASSERT(!link_lazily());
   if (is_bootstrap_native()) {
-    stub_entry = StubCode::CallBootstrapNative_entry();
+    stub = &StubCode::CallBootstrapNative();
   } else if (is_auto_scope()) {
-    stub_entry = StubCode::CallAutoScopeNative_entry();
+    stub = &StubCode::CallAutoScopeNative();
   } else {
-    stub_entry = StubCode::CallNoScopeNative_entry();
+    stub = &StubCode::CallNoScopeNative();
   }
   const ExternalLabel label(reinterpret_cast<uword>(native_c_function()));
   __ movl(ECX, Immediate(label.address()));
-  compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), *stub, RawPcDescriptors::kOther, locs());
 
   __ popl(result);
 
@@ -1265,7 +1252,8 @@
 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
-  const intptr_t kNumTemps = 0;
+  const intptr_t kNumTemps =
+      class_id() == kArrayCid && ShouldEmitStoreBarrier() ? 1 : 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
@@ -1283,6 +1271,10 @@
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::WritableRegister()
                           : Location::RegisterOrConstant(value()));
+      if (ShouldEmitStoreBarrier()) {
+        locs->set_in(0, Location::RegisterLocation(kWriteBarrierObjectReg));
+        locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
+      }
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1345,7 +1337,9 @@
     case kArrayCid:
       if (ShouldEmitStoreBarrier()) {
         Register value = locs()->in(2).reg();
-        __ StoreIntoObject(array, element_address, value, CanValueBeSmi());
+        Register slot = locs()->temp(0).reg();
+        __ leal(slot, element_address);
+        __ StoreIntoArray(array, slot, value, CanValueBeSmi());
       } else if (locs()->in(2).IsConstant()) {
         const Object& constant = locs()->in(2).constant();
         __ StoreIntoObjectNoBarrier(array, element_address, constant);
@@ -1728,14 +1722,13 @@
     __ Bind(entry_label());
     const Code& stub = Code::ZoneHandle(
         compiler->zone(), StubCode::GetAllocationStubForClass(cls_));
-    const StubEntry stub_entry(stub);
 
     LocationSummary* locs = instruction()->locs();
 
     locs->live_registers()->Remove(Location::RegisterLocation(result_));
 
     compiler->SaveLiveRegisters(locs);
-    compiler->GenerateCall(TokenPosition::kNoSource, stub_entry,
+    compiler->GenerateCall(TokenPosition::kNoSource, stub,
                            RawPcDescriptors::kOther, locs);
     __ MoveRegister(result_, EAX);
     compiler->RestoreLiveRegisters(locs);
@@ -1823,13 +1816,14 @@
   ASSERT(sizeof(classid_t) == kInt16Size);
   Label skip_store;
 
-  Register instance_reg = locs()->in(0).reg();
+  const Register instance_reg = locs()->in(0).reg();
+  const intptr_t offset_in_bytes = OffsetInBytes();
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
     XmmRegister value = locs()->in(1).fpu_reg();
     Register temp = locs()->temp(0).reg();
     Register temp2 = locs()->temp(1).reg();
-    const intptr_t cid = field().UnboxedFieldCid();
+    const intptr_t cid = slot().field().UnboxedFieldCid();
 
     if (is_initialization()) {
       const Class* cls = NULL;
@@ -1850,10 +1844,10 @@
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ movl(temp2, temp);
       __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_), temp2,
+                         FieldAddress(instance_reg, offset_in_bytes), temp2,
                          Assembler::kValueIsNotSmi);
     } else {
-      __ movl(temp, FieldAddress(instance_reg, offset_in_bytes_));
+      __ movl(temp, FieldAddress(instance_reg, offset_in_bytes));
     }
     switch (cid) {
       case kDoubleCid:
@@ -1893,7 +1887,7 @@
     Label store_float32x4;
     Label store_float64x2;
 
-    __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
+    __ LoadObject(temp, Field::ZoneHandle(Z, slot().field().Original()));
 
     __ cmpw(FieldAddress(temp, Field::is_nullable_offset()),
             Immediate(kNullCid));
@@ -1926,7 +1920,7 @@
     {
       __ Bind(&store_double);
       EnsureMutableBox(compiler, this, temp, compiler->double_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ movsd(fpu_temp, FieldAddress(value_reg, Double::value_offset()));
       __ movsd(FieldAddress(temp, Double::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1935,7 +1929,7 @@
     {
       __ Bind(&store_float32x4);
       EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ movups(fpu_temp, FieldAddress(value_reg, Float32x4::value_offset()));
       __ movups(FieldAddress(temp, Float32x4::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1944,7 +1938,7 @@
     {
       __ Bind(&store_float64x2);
       EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ movups(fpu_temp, FieldAddress(value_reg, Float64x2::value_offset()));
       __ movups(FieldAddress(temp, Float64x2::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -1956,18 +1950,17 @@
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
     __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_), value_reg,
+                       FieldAddress(instance_reg, offset_in_bytes), value_reg,
                        CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
       __ StoreIntoObjectNoBarrier(instance_reg,
-                                  FieldAddress(instance_reg, offset_in_bytes_),
+                                  FieldAddress(instance_reg, offset_in_bytes),
                                   locs()->in(1).constant());
     } else {
       Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrier(instance_reg,
-                                  FieldAddress(instance_reg, offset_in_bytes_),
-                                  value_reg);
+      __ StoreIntoObjectNoBarrier(
+          instance_reg, FieldAddress(instance_reg, offset_in_bytes), value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2141,7 +2134,7 @@
 
   __ Bind(&slow_path);
   compiler->GenerateCallWithDeopt(token_pos(), deopt_id(),
-                                  *StubCode::AllocateArray_entry(),
+                                  StubCode::AllocateArray(),
                                   RawPcDescriptors::kOther, locs());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
@@ -2178,8 +2171,8 @@
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
     XmmRegister result = locs()->out(0).fpu_reg();
     Register temp = locs()->temp(0).reg();
-    __ movl(temp, FieldAddress(instance_reg, offset_in_bytes()));
-    const intptr_t cid = field()->UnboxedFieldCid();
+    __ movl(temp, FieldAddress(instance_reg, OffsetInBytes()));
+    const intptr_t cid = slot().field().UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleLoadFieldInstr");
@@ -2210,7 +2203,7 @@
     Label load_float32x4;
     Label load_float64x2;
 
-    __ LoadObject(result, Field::ZoneHandle(field()->Original()));
+    __ LoadObject(result, Field::ZoneHandle(slot().field().Original()));
 
     FieldAddress field_cid_operand(result, Field::guarded_cid_offset());
     FieldAddress field_nullability_operand(result, Field::is_nullable_offset());
@@ -2238,7 +2231,7 @@
       __ Bind(&load_double);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
                                       result, temp);
-      __ movl(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ movl(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ movsd(value, FieldAddress(temp, Double::value_offset()));
       __ movsd(FieldAddress(result, Double::value_offset()), value);
       __ jmp(&done);
@@ -2248,7 +2241,7 @@
       __ Bind(&load_float32x4);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float32x4_class(), result, temp);
-      __ movl(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ movl(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ movups(value, FieldAddress(temp, Float32x4::value_offset()));
       __ movups(FieldAddress(result, Float32x4::value_offset()), value);
       __ jmp(&done);
@@ -2258,7 +2251,7 @@
       __ Bind(&load_float64x2);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float64x2_class(), result, temp);
-      __ movl(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ movl(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ movups(value, FieldAddress(temp, Float64x2::value_offset()));
       __ movups(FieldAddress(result, Float64x2::value_offset()), value);
       __ jmp(&done);
@@ -2266,7 +2259,7 @@
 
     __ Bind(&load_pointer);
   }
-  __ movl(result, FieldAddress(instance_reg, offset_in_bytes()));
+  __ movl(result, FieldAddress(instance_reg, OffsetInBytes()));
   __ Bind(&done);
 }
 
@@ -2324,9 +2317,10 @@
 
   // 'instantiator_type_args_reg' is a TypeArguments object (or null).
   // 'function_type_args_reg' is a TypeArguments object (or null).
-  ASSERT(!type_arguments().IsUninstantiatedIdentity() &&
-         !type_arguments().CanShareInstantiatorTypeArguments(
-             instantiator_class()));
+  ASSERT(!type_arguments().CanShareInstantiatorTypeArguments(
+             instantiator_class()) &&
+         !type_arguments().CanShareFunctionTypeArguments(
+             compiler->parsed_function().function()));
   // If both the instantiator and function type arguments are null and if the
   // type argument vector instantiated from null becomes a vector of dynamic,
   // then use null as the type arguments.
@@ -2414,7 +2408,7 @@
 
     __ movl(EDX, Immediate(instruction()->num_context_variables()));
     compiler->GenerateCall(instruction()->token_pos(),
-                           *StubCode::AllocateContext_entry(),
+                           StubCode::AllocateContext(),
                            RawPcDescriptors::kOther, locs);
     ASSERT(instruction()->locs()->out(0).reg() == EAX);
     compiler->RestoreLiveRegisters(instruction()->locs());
@@ -2462,7 +2456,7 @@
   ASSERT(locs()->out(0).reg() == EAX);
 
   __ movl(EDX, Immediate(num_context_variables()));
-  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+  compiler->GenerateCall(token_pos(), StubCode::AllocateContext(),
                          RawPcDescriptors::kOther, locs());
 }
 
@@ -6169,15 +6163,13 @@
 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
-  const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), stub, RawPcDescriptors::kOther, locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  __ Call(*StubCode::DebugStepCheck_entry());
+  __ Call(StubCode::DebugStepCheck());
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
   compiler->RecordSafepoint(locs());
 }
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index d18ee6f..a2a26ea 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -13,7 +13,7 @@
 
 namespace dart {
 
-#ifndef PRODUCT
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 DEFINE_FLAG(bool,
             display_sorted_ic_data,
@@ -612,14 +612,8 @@
 }
 
 void StoreInstanceFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
-  if (field().IsNull()) {
-    f->Print("{%" Pd "}, ", offset_in_bytes());
-  } else {
-    f->Print("%s {%" Pd "}, ", String::Handle(field().name()).ToCString(),
-             field().Offset());
-  }
   instance()->PrintTo(f);
-  f->Print(", ");
+  f->Print(" . %s = ", slot().Name());
   value()->PrintTo(f);
   if (!ShouldEmitStoreBarrier()) f->Print(", barrier removed");
 }
@@ -671,27 +665,14 @@
   f->Print("%s", String::Handle(cls_.ScrubbedName()).ToCString());
   for (intptr_t i = 0; i < InputCount(); i++) {
     f->Print(", ");
-    f->Print("%s: ", slots_[i]->ToCString());
+    f->Print("%s: ", slots_[i]->Name());
     InputAt(i)->PrintTo(f);
   }
 }
 
 void LoadFieldInstr::PrintOperandsTo(BufferFormatter* f) const {
   instance()->PrintTo(f);
-  f->Print(", %" Pd, offset_in_bytes());
-
-  if (field() != nullptr) {
-    f->Print(" {%s} %s", String::Handle(field()->name()).ToCString(),
-             field()->GuardedPropertiesAsCString());
-  }
-
-  if (native_field() != nullptr) {
-    f->Print(" {%s}", native_field()->name());
-  }
-
-  if (immutable_) {
-    f->Print(", immutable");
-  }
+  f->Print(" . %s%s", slot().Name(), slot().is_immutable() ? " {final}" : "");
 }
 
 void InstantiateTypeInstr::PrintOperandsTo(BufferFormatter* f) const {
@@ -1158,7 +1139,7 @@
   return Thread::Current()->zone()->MakeCopyOfString(buffer);
 }
 
-#else  // PRODUCT
+#else  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 const char* Instruction::ToCString() const {
   return DebugName();
@@ -1196,7 +1177,7 @@
   return false;
 }
 
-#endif  // !PRODUCT
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/backend/il_test.cc b/runtime/vm/compiler/backend/il_test.cc
index 9c3f88c..388136c 100644
--- a/runtime/vm/compiler/backend/il_test.cc
+++ b/runtime/vm/compiler/backend/il_test.cc
@@ -7,7 +7,7 @@
 
 namespace dart {
 
-TEST_CASE(InstructionTests) {
+ISOLATE_UNIT_TEST_CASE(InstructionTests) {
   TargetEntryInstr* target_instr =
       new TargetEntryInstr(1, kInvalidTryIndex, DeoptId::kNone);
   EXPECT(target_instr->IsBlockEntry());
@@ -19,7 +19,7 @@
   EXPECT(context->GetBlock() == target_instr);
 }
 
-TEST_CASE(OptimizationTests) {
+ISOLATE_UNIT_TEST_CASE(OptimizationTests) {
   JoinEntryInstr* join =
       new JoinEntryInstr(1, kInvalidTryIndex, DeoptId::kNone);
 
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index a4709d6..4ae5a22 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -466,18 +466,9 @@
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
   Label done;
-  Isolate* isolate = Isolate::Current();
 
-  if (isolate->type_checks()) {
-    __ CompareObject(reg, Bool::True());
-    __ j(EQUAL, &done, Assembler::kNearJump);
-    __ CompareObject(reg, Bool::False());
-    __ j(EQUAL, &done, Assembler::kNearJump);
-  } else {
-    ASSERT(isolate->asserts() || FLAG_strong);
-    __ CompareObject(reg, Object::null_instance());
-    __ j(NOT_EQUAL, &done, Assembler::kNearJump);
-  }
+  __ CompareObject(reg, Object::null_instance());
+  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
 
   __ pushq(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos, deopt_id,
@@ -849,10 +840,7 @@
 
   // All arguments are already @RSP due to preceding PushArgument()s.
   ASSERT(ArgumentCount() ==
-                 function().NumParameters() +
-                     (function().IsGeneric() && FLAG_reify_generic_functions)
-             ? 1
-             : 0);
+         function().NumParameters() + (function().IsGeneric() ? 1 : 0));
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::null_object());
@@ -861,24 +849,24 @@
   __ leaq(RAX, Address(RSP, ArgumentCount() * kWordSize));
 
   __ LoadImmediate(R10, Immediate(argc_tag));
-  const StubEntry* stub_entry;
+  const Code* stub;
   if (link_lazily()) {
-    stub_entry = StubCode::CallBootstrapNative_entry();
+    stub = &StubCode::CallBootstrapNative();
     ExternalLabel label(NativeEntry::LinkNativeCallEntry());
     __ LoadNativeEntry(RBX, &label, ObjectPool::kPatchable);
-    compiler->GeneratePatchableCall(token_pos(), *stub_entry,
+    compiler->GeneratePatchableCall(token_pos(), *stub,
                                     RawPcDescriptors::kOther, locs());
   } else {
     if (is_bootstrap_native()) {
-      stub_entry = StubCode::CallBootstrapNative_entry();
+      stub = &StubCode::CallBootstrapNative();
     } else if (is_auto_scope()) {
-      stub_entry = StubCode::CallAutoScopeNative_entry();
+      stub = &StubCode::CallAutoScopeNative();
     } else {
-      stub_entry = StubCode::CallNoScopeNative_entry();
+      stub = &StubCode::CallNoScopeNative();
     }
     const ExternalLabel label(reinterpret_cast<uword>(native_c_function()));
     __ LoadNativeEntry(RBX, &label, ObjectPool::kNotPatchable);
-    compiler->GenerateCall(token_pos(), *stub_entry, RawPcDescriptors::kOther,
+    compiler->GenerateCall(token_pos(), *stub, RawPcDescriptors::kOther,
                            locs());
   }
   __ popq(result);
@@ -1029,7 +1017,6 @@
     __ Bind(entry_label());
     const Code& stub = Code::ZoneHandle(
         compiler->zone(), StubCode::GetAllocationStubForClass(cls_));
-    const StubEntry stub_entry(stub);
 
     LocationSummary* locs = instruction()->locs();
 
@@ -1037,7 +1024,7 @@
 
     compiler->SaveLiveRegisters(locs);
     compiler->GenerateCall(TokenPosition::kNoSource,  // No token position.
-                           stub_entry, RawPcDescriptors::kOther, locs);
+                           stub, RawPcDescriptors::kOther, locs);
     __ MoveRegister(result_, RAX);
     compiler->RestoreLiveRegisters(locs);
     __ jmp(exit_label());
@@ -1387,7 +1374,8 @@
 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
-  const intptr_t kNumTemps = 0;
+  const intptr_t kNumTemps =
+      class_id() == kArrayCid && ShouldEmitStoreBarrier() ? 1 : 0;
   LocationSummary* locs = new (zone)
       LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
@@ -1406,15 +1394,13 @@
   }
   switch (class_id()) {
     case kArrayCid:
-#if defined(CONCURRENT_MARKING)
       locs->set_in(2, ShouldEmitStoreBarrier()
                           ? Location::RegisterLocation(kWriteBarrierValueReg)
                           : Location::RegisterOrConstant(value()));
-#else
-      locs->set_in(2, ShouldEmitStoreBarrier()
-                          ? Location::WritableRegister()
-                          : Location::RegisterOrConstant(value()));
-#endif
+      if (ShouldEmitStoreBarrier()) {
+        locs->set_in(0, Location::RegisterLocation(kWriteBarrierObjectReg));
+        locs->set_temp(0, Location::RegisterLocation(kWriteBarrierSlotReg));
+      }
       break;
     case kExternalTypedDataUint8ArrayCid:
     case kExternalTypedDataUint8ClampedArrayCid:
@@ -1474,7 +1460,9 @@
     case kArrayCid:
       if (ShouldEmitStoreBarrier()) {
         Register value = locs()->in(2).reg();
-        __ StoreIntoObject(array, element_address, value, CanValueBeSmi());
+        Register slot = locs()->temp(0).reg();
+        __ leaq(slot, element_address);
+        __ StoreIntoArray(array, slot, value, CanValueBeSmi());
       } else if (locs()->in(2).IsConstant()) {
         const Object& constant = locs()->in(2).constant();
         __ StoreIntoObjectNoBarrier(array, element_address, constant);
@@ -1926,15 +1914,9 @@
     summary->set_temp(2, opt ? Location::RequiresFpuRegister()
                              : Location::FpuRegisterLocation(XMM1));
   } else {
-#if defined(CONCURRENT_MARKING)
     summary->set_in(1, ShouldEmitStoreBarrier()
                            ? Location::RegisterLocation(kWriteBarrierValueReg)
                            : Location::RegisterOrConstant(value()));
-#else
-    summary->set_in(1, ShouldEmitStoreBarrier()
-                           ? Location::WritableRegister()
-                           : Location::RegisterOrConstant(value()));
-#endif
   }
   return summary;
 }
@@ -1962,13 +1944,14 @@
   ASSERT(sizeof(classid_t) == kInt16Size);
   Label skip_store;
 
-  Register instance_reg = locs()->in(0).reg();
+  const Register instance_reg = locs()->in(0).reg();
+  const intptr_t offset_in_bytes = OffsetInBytes();
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
     XmmRegister value = locs()->in(1).fpu_reg();
     Register temp = locs()->temp(0).reg();
     Register temp2 = locs()->temp(1).reg();
-    const intptr_t cid = field().UnboxedFieldCid();
+    const intptr_t cid = slot().field().UnboxedFieldCid();
 
     if (is_initialization()) {
       const Class* cls = NULL;
@@ -1989,10 +1972,10 @@
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ movq(temp2, temp);
       __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_), temp2,
+                         FieldAddress(instance_reg, offset_in_bytes), temp2,
                          Assembler::kValueIsNotSmi);
     } else {
-      __ movq(temp, FieldAddress(instance_reg, offset_in_bytes_));
+      __ movq(temp, FieldAddress(instance_reg, offset_in_bytes));
     }
     switch (cid) {
       case kDoubleCid:
@@ -2030,7 +2013,7 @@
     Label store_float32x4;
     Label store_float64x2;
 
-    __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
+    __ LoadObject(temp, Field::ZoneHandle(Z, slot().field().Original()));
 
     __ cmpw(FieldAddress(temp, Field::is_nullable_offset()),
             Immediate(kNullCid));
@@ -2063,7 +2046,7 @@
     {
       __ Bind(&store_double);
       EnsureMutableBox(compiler, this, temp, compiler->double_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ movsd(fpu_temp, FieldAddress(value_reg, Double::value_offset()));
       __ movsd(FieldAddress(temp, Double::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -2072,7 +2055,7 @@
     {
       __ Bind(&store_float32x4);
       EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ movups(fpu_temp, FieldAddress(value_reg, Float32x4::value_offset()));
       __ movups(FieldAddress(temp, Float32x4::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -2081,7 +2064,7 @@
     {
       __ Bind(&store_float64x2);
       EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
-                       instance_reg, offset_in_bytes_, temp2);
+                       instance_reg, offset_in_bytes, temp2);
       __ movups(fpu_temp, FieldAddress(value_reg, Float64x2::value_offset()));
       __ movups(FieldAddress(temp, Float64x2::value_offset()), fpu_temp);
       __ jmp(&skip_store);
@@ -2093,18 +2076,17 @@
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
     __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_), value_reg,
+                       FieldAddress(instance_reg, offset_in_bytes), value_reg,
                        CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
       __ StoreIntoObjectNoBarrier(instance_reg,
-                                  FieldAddress(instance_reg, offset_in_bytes_),
+                                  FieldAddress(instance_reg, offset_in_bytes),
                                   locs()->in(1).constant());
     } else {
       Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrier(instance_reg,
-                                  FieldAddress(instance_reg, offset_in_bytes_),
-                                  value_reg);
+      __ StoreIntoObjectNoBarrier(
+          instance_reg, FieldAddress(instance_reg, offset_in_bytes), value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2136,12 +2118,7 @@
                                                             bool opt) const {
   LocationSummary* locs =
       new (zone) LocationSummary(zone, 1, 1, LocationSummary::kNoCall);
-#if defined(CONCURRENT_MARKING)
   locs->set_in(0, Location::RegisterLocation(kWriteBarrierValueReg));
-#else
-  locs->set_in(0, value()->NeedsWriteBarrier() ? Location::WritableRegister()
-                                               : Location::RequiresRegister());
-#endif
   locs->set_temp(0, Location::RequiresRegister());
   return locs;
 }
@@ -2286,7 +2263,7 @@
 
   __ Bind(&slow_path);
   compiler->GenerateCallWithDeopt(token_pos(), deopt_id(),
-                                  *StubCode::AllocateArray_entry(),
+                                  StubCode::AllocateArray(),
                                   RawPcDescriptors::kOther, locs());
   __ Bind(&done);
   ASSERT(locs()->out(0).reg() == kResultReg);
@@ -2321,8 +2298,8 @@
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
     XmmRegister result = locs()->out(0).fpu_reg();
     Register temp = locs()->temp(0).reg();
-    __ movq(temp, FieldAddress(instance_reg, offset_in_bytes()));
-    intptr_t cid = field()->UnboxedFieldCid();
+    __ movq(temp, FieldAddress(instance_reg, OffsetInBytes()));
+    intptr_t cid = slot().field().UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleLoadFieldInstr");
@@ -2353,7 +2330,7 @@
     Label load_float32x4;
     Label load_float64x2;
 
-    __ LoadObject(result, Field::ZoneHandle(field()->Original()));
+    __ LoadObject(result, Field::ZoneHandle(slot().field().Original()));
 
     FieldAddress field_cid_operand(result, Field::guarded_cid_offset());
     FieldAddress field_nullability_operand(result, Field::is_nullable_offset());
@@ -2381,7 +2358,7 @@
       __ Bind(&load_double);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
                                       result, temp);
-      __ movq(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ movq(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ movsd(value, FieldAddress(temp, Double::value_offset()));
       __ movsd(FieldAddress(result, Double::value_offset()), value);
       __ jmp(&done);
@@ -2391,7 +2368,7 @@
       __ Bind(&load_float32x4);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float32x4_class(), result, temp);
-      __ movq(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ movq(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ movups(value, FieldAddress(temp, Float32x4::value_offset()));
       __ movups(FieldAddress(result, Float32x4::value_offset()), value);
       __ jmp(&done);
@@ -2401,7 +2378,7 @@
       __ Bind(&load_float64x2);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float64x2_class(), result, temp);
-      __ movq(temp, FieldAddress(instance_reg, offset_in_bytes()));
+      __ movq(temp, FieldAddress(instance_reg, OffsetInBytes()));
       __ movups(value, FieldAddress(temp, Float64x2::value_offset()));
       __ movups(FieldAddress(result, Float64x2::value_offset()), value);
       __ jmp(&done);
@@ -2409,7 +2386,7 @@
 
     __ Bind(&load_pointer);
   }
-  __ movq(result, FieldAddress(instance_reg, offset_in_bytes()));
+  __ movq(result, FieldAddress(instance_reg, OffsetInBytes()));
   __ Bind(&done);
 }
 
@@ -2466,9 +2443,10 @@
 
   // 'instantiator_type_args_reg' is a TypeArguments object (or null).
   // 'function_type_args_reg' is a TypeArguments object (or null).
-  ASSERT(!type_arguments().IsUninstantiatedIdentity() &&
-         !type_arguments().CanShareInstantiatorTypeArguments(
-             instantiator_class()));
+  ASSERT(!type_arguments().CanShareInstantiatorTypeArguments(
+             instantiator_class()) &&
+         !type_arguments().CanShareFunctionTypeArguments(
+             compiler->parsed_function().function()));
   // If both the instantiator and function type arguments are null and if the
   // type argument vector instantiated from null becomes a vector of dynamic,
   // then use null as the type arguments.
@@ -2555,7 +2533,7 @@
 
     __ LoadImmediate(R10, Immediate(instruction()->num_context_variables()));
     compiler->GenerateCall(instruction()->token_pos(),
-                           *StubCode::AllocateContext_entry(),
+                           StubCode::AllocateContext(),
                            RawPcDescriptors::kOther, locs);
     ASSERT(instruction()->locs()->out(0).reg() == RAX);
     compiler->RestoreLiveRegisters(instruction()->locs());
@@ -2602,7 +2580,7 @@
   ASSERT(locs()->out(0).reg() == RAX);
 
   __ LoadImmediate(R10, Immediate(num_context_variables()));
-  compiler->GenerateCall(token_pos(), *StubCode::AllocateContext_entry(),
+  compiler->GenerateCall(token_pos(), StubCode::AllocateContext(),
                          RawPcDescriptors::kOther, locs());
 }
 
@@ -2955,13 +2933,12 @@
     }
     __ pushq(locs->in(0).reg());
     __ pushq(locs->in(1).reg());
-    const String& selector =
-        String::Handle(instruction()->call()->ic_data()->target_name());
-    const Array& arguments_descriptor =
-        Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
+    const auto& selector = String::Handle(instruction()->call()->Selector());
+    const auto& arguments_descriptor = Array::Handle(
+        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
+        instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ MoveRegister(result, RAX);
     compiler->RestoreLiveRegisters(locs);
     __ jmp(exit_label());
@@ -3122,13 +3099,14 @@
     }
     __ pushq(locs->in(0).reg());
     __ pushq(locs->in(1).reg());
-    String& selector =
-        String::Handle(instruction()->call()->ic_data()->target_name());
-    const Array& arguments_descriptor =
-        Array::Handle(instruction()->call()->ic_data()->arguments_descriptor());
+
+    const auto& selector = String::Handle(instruction()->call()->Selector());
+    const auto& arguments_descriptor = Array::Handle(
+        ArgumentsDescriptor::New(/*type_args_len=*/0, /*num_arguments=*/2));
+
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
-        instruction()->call()->token_pos(), locs, try_index_, kNumSlowPathArgs);
+        instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
     __ MoveRegister(result, RAX);
     compiler->RestoreLiveRegisters(locs);
     compiler->pending_deoptimization_env_ = NULL;
@@ -6318,15 +6296,13 @@
   }
   const Code& stub = Code::ZoneHandle(
       compiler->zone(), StubCode::GetAllocationStubForClass(cls()));
-  const StubEntry stub_entry(stub);
-  compiler->GenerateCall(token_pos(), stub_entry, RawPcDescriptors::kOther,
-                         locs());
+  compiler->GenerateCall(token_pos(), stub, RawPcDescriptors::kOther, locs());
   __ Drop(ArgumentCount());  // Discard arguments.
 }
 
 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(!compiler->is_optimizing());
-  __ CallPatchable(*StubCode::DebugStepCheck_entry());
+  __ CallPatchable(StubCode::DebugStepCheck());
   compiler->AddCurrentDescriptor(stub_kind_, deopt_id_, token_pos());
   compiler->RecordSafepoint(locs());
 }
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index bdbf35a..3b48fc5 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -254,7 +254,7 @@
 // A collection of call sites to consider for inlining.
 class CallSites : public ValueObject {
  public:
-  explicit CallSites(FlowGraph* flow_graph, intptr_t threshold)
+  explicit CallSites(intptr_t threshold)
       : inlining_depth_threshold_(threshold),
         static_calls_(),
         closure_calls_(),
@@ -264,9 +264,14 @@
     PolymorphicInstanceCallInstr* call;
     double ratio;
     const FlowGraph* caller_graph;
+    intptr_t nesting_depth;
     InstanceCallInfo(PolymorphicInstanceCallInstr* call_arg,
-                     FlowGraph* flow_graph)
-        : call(call_arg), ratio(0.0), caller_graph(flow_graph) {}
+                     FlowGraph* flow_graph,
+                     intptr_t depth)
+        : call(call_arg),
+          ratio(0.0),
+          caller_graph(flow_graph),
+          nesting_depth(depth) {}
     const Function& caller() const { return caller_graph->function(); }
   };
 
@@ -274,8 +279,14 @@
     StaticCallInstr* call;
     double ratio;
     FlowGraph* caller_graph;
-    StaticCallInfo(StaticCallInstr* value, FlowGraph* flow_graph)
-        : call(value), ratio(0.0), caller_graph(flow_graph) {}
+    intptr_t nesting_depth;
+    StaticCallInfo(StaticCallInstr* value,
+                   FlowGraph* flow_graph,
+                   intptr_t depth)
+        : call(value),
+          ratio(0.0),
+          caller_graph(flow_graph),
+          nesting_depth(depth) {}
     const Function& caller() const { return caller_graph->function(); }
   };
 
@@ -315,6 +326,32 @@
     instance_calls_.Clear();
   }
 
+  // Heuristic that maps the loop nesting depth to a static estimate of number
+  // of times code at that depth is executed (code at each higher nesting
+  // depth is assumed to execute 10x more often up to depth 3).
+  static intptr_t AotCallCountApproximation(intptr_t nesting_depth) {
+    switch (nesting_depth) {
+      case 0:
+        // Note that we use value 0, and not 1, i.e. any straightline code
+        // outside a loop is assumed to be very cold. With value 1, inlining
+        // inside loops is still favored over inlining inside straightline
+        // code, but for a method without loops, *all* call sites are inlined
+        // (potentially more performance, at the expense of larger code size).
+        // TODO(ajcbik): use 1 and fine tune other heuristics
+        return 0;
+      case 1:
+        return 10;
+      case 2:
+        return 100;
+      default:
+        return 1000;
+    }
+  }
+
+  // Computes the ratio for each call site in a method, defined as the
+  // number of times a call site is executed over the maximum number of
+  // times any call site is executed in the method. JIT uses actual call
+  // counts whereas AOT uses a static estimate based on nesting depth.
   void ComputeCallSiteRatio(intptr_t static_call_start_ix,
                             intptr_t instance_call_start_ix) {
     const intptr_t num_static_calls =
@@ -325,21 +362,26 @@
     intptr_t max_count = 0;
     GrowableArray<intptr_t> instance_call_counts(num_instance_calls);
     for (intptr_t i = 0; i < num_instance_calls; ++i) {
-      const intptr_t aggregate_count =
-          instance_calls_[i + instance_call_start_ix].call->CallCount();
+      const InstanceCallInfo& info =
+          instance_calls_[i + instance_call_start_ix];
+      intptr_t aggregate_count =
+          FLAG_precompiled_mode ? AotCallCountApproximation(info.nesting_depth)
+                                : info.call->CallCount();
       instance_call_counts.Add(aggregate_count);
       if (aggregate_count > max_count) max_count = aggregate_count;
     }
 
     GrowableArray<intptr_t> static_call_counts(num_static_calls);
     for (intptr_t i = 0; i < num_static_calls; ++i) {
+      const StaticCallInfo& info = static_calls_[i + static_call_start_ix];
       intptr_t aggregate_count =
-          static_calls_[i + static_call_start_ix].call->CallCount();
+          FLAG_precompiled_mode ? AotCallCountApproximation(info.nesting_depth)
+                                : info.call->CallCount();
       static_call_counts.Add(aggregate_count);
       if (aggregate_count > max_count) max_count = aggregate_count;
     }
 
-    // max_count can be 0 if none of the calls was executed.
+    // Note that max_count can be 0 if none of the calls was executed.
     for (intptr_t i = 0; i < num_instance_calls; ++i) {
       const double ratio =
           (max_count == 0)
@@ -404,12 +446,18 @@
     const bool inline_only_recognized_methods =
         (depth == inlining_depth_threshold_);
 
+    // In AOT, compute loop hierarchy.
+    if (FLAG_precompiled_mode) {
+      graph->GetLoopHierarchy();
+    }
+
     const intptr_t instance_call_start_ix = instance_calls_.length();
     const intptr_t static_call_start_ix = static_calls_.length();
     for (BlockIterator block_it = graph->postorder_iterator(); !block_it.Done();
          block_it.Advance()) {
-      for (ForwardInstructionIterator it(block_it.Current()); !it.Done();
-           it.Advance()) {
+      BlockEntryInstr* entry = block_it.Current();
+      const intptr_t depth = entry->NestingDepth();
+      for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
         Instruction* current = it.Current();
         if (current->IsPolymorphicInstanceCall()) {
           PolymorphicInstanceCallInstr* instance_call =
@@ -417,7 +465,7 @@
           if (!inline_only_recognized_methods ||
               instance_call->IsSureToCallSingleRecognizedTarget() ||
               instance_call->HasOnlyDispatcherOrImplicitAccessorTargets()) {
-            instance_calls_.Add(InstanceCallInfo(instance_call, graph));
+            instance_calls_.Add(InstanceCallInfo(instance_call, graph, depth));
           } else {
             // Method not inlined because inlining too deep and method
             // not recognized.
@@ -433,7 +481,7 @@
           if (!inline_only_recognized_methods ||
               static_call->function().IsRecognized() ||
               static_call->function().IsDispatcherOrImplicitAccessor()) {
-            static_calls_.Add(StaticCallInfo(static_call, graph));
+            static_calls_.Add(StaticCallInfo(static_call, graph, depth));
           } else {
             // Method not inlined because inlining too deep and method
             // not recognized.
@@ -539,7 +587,7 @@
 
   auto& metadata_or_error = Object::Handle(library.GetMetadata(function));
   if (metadata_or_error.IsError()) {
-    Exceptions::PropagateError(Error::Cast(metadata_or_error));
+    Report::LongJump(Error::Cast(metadata_or_error));
   }
   const Array& metadata = Array::Cast(metadata_or_error);
   if (metadata.Length() > 0) {
@@ -626,10 +674,7 @@
           ASSERT(call_data->call->IsClosureCall());
           LoadFieldInstr* context_load = new (zone) LoadFieldInstr(
               new Value((*arguments)[first_arg_index]->definition()),
-              Closure::context_offset(),
-              AbstractType::ZoneHandle(zone, AbstractType::null()),
-              call_data->call->token_pos());
-          context_load->set_is_immutable(true);
+              Slot::Closure_context(), call_data->call->token_pos());
           context_load->set_ssa_temp_index(
               caller_graph->alloc_ssa_temp_index());
           context_load->InsertBefore(callee_entry->next());
@@ -751,8 +796,8 @@
       return;
     }
     // Create two call site collections to swap between.
-    CallSites sites1(caller_graph_, inlining_depth_threshold_);
-    CallSites sites2(caller_graph_, inlining_depth_threshold_);
+    CallSites sites1(inlining_depth_threshold_);
+    CallSites sites2(inlining_depth_threshold_);
     CallSites* call_sites_temp = NULL;
     collected_call_sites_ = &sites1;
     inlining_call_sites_ = &sites2;
@@ -924,8 +969,7 @@
             isolate->loading_invalidation_gen();
 
         if (Compiler::IsBackgroundCompilation()) {
-          if (isolate->IsTopLevelParsing() ||
-              (loading_invalidation_gen_at_start !=
+          if ((loading_invalidation_gen_at_start !=
                isolate->loading_invalidation_gen())) {
             // Loading occured while parsing. We need to abort here because
             // state changed while compiling.
@@ -1005,8 +1049,7 @@
         // without linking between the caller and callee graphs.
         // TODO(zerny): Put more information in the stubs, eg, type information.
         const intptr_t first_actual_param_index = call_data->first_arg_index;
-        const intptr_t inlined_type_args_param =
-            (FLAG_reify_generic_functions && function.IsGeneric()) ? 1 : 0;
+        const intptr_t inlined_type_args_param = function.IsGeneric() ? 1 : 0;
         const intptr_t num_inlined_params =
             inlined_type_args_param + function.NumParameters();
         ZoneGrowableArray<Definition*>* param_stubs =
@@ -1220,8 +1263,7 @@
         PRINT_INLINING_TREE(NULL, &call_data->caller, &function, call);
         return true;
       } else {
-        error = thread()->sticky_error();
-        thread()->clear_sticky_error();
+        error = thread()->StealStickyError();
 
         if (error.IsLanguageError() &&
             (LanguageError::Cast(error).kind() == Report::kBailout)) {
@@ -1740,6 +1782,7 @@
 
   FunctionEntryInstr* entry = nullptr;
   Instruction* last = nullptr;
+  Definition* result = nullptr;
   // Replace the receiver argument with a redefinition to prevent code from
   // the inlined body from being hoisted above the inlined entry.
   GrowableArray<Definition*> arguments(call_->ArgumentCount());
@@ -1752,22 +1795,26 @@
           owner_->caller_graph(), receiver_cid, target, call_, redefinition,
           call_->instance_call()->token_pos(),
           call_->instance_call()->ic_data(), graph_entry, &entry, &last,
-          owner_->inliner_->speculative_policy())) {
+          &result, owner_->inliner_->speculative_policy())) {
+    // The empty Object constructor is the only case where the inlined body is
+    // empty and there is no result.
+    ASSERT((last != nullptr && result != nullptr) ||
+           MethodRecognizer::RecognizeKind(target) ==
+               MethodRecognizer::kObjectConstructor);
     graph_entry->set_normal_entry(entry);
-    ASSERT(last->IsDefinition());
     // Create a graph fragment.
     redefinition->InsertAfter(entry);
     InlineExitCollector* exit_collector =
         new (Z) InlineExitCollector(owner_->caller_graph(), call_);
-    ReturnInstr* result = new (Z)
-        ReturnInstr(call_->instance_call()->token_pos(),
-                    new (Z) Value(last->AsDefinition()), DeoptId::kNone);
+    ReturnInstr* return_result =
+        new (Z) ReturnInstr(call_->instance_call()->token_pos(),
+                            new (Z) Value(result), DeoptId::kNone);
     owner_->caller_graph()->AppendTo(
-        last, result,
+        last, return_result,
         call_->env(),  // Return can become deoptimization target.
         FlowGraph::kEffect);
-    entry->set_last_instruction(result);
-    exit_collector->AddExit(result);
+    entry->set_last_instruction(return_result);
+    exit_collector->AddExit(return_result);
 
     // Update polymorphic inliner state.
     inlined_entries_.Add(graph_entry);
@@ -2314,32 +2361,22 @@
                                        Instruction* call,
                                        intptr_t array_cid,
                                        Definition** array,
-                                       Definition* index,
-                                       Instruction** cursor,
-                                       bool can_speculate) {
+                                       Definition** index,
+                                       Instruction** cursor) {
   // Insert array length load and bounds check.
   LoadFieldInstr* length = new (Z) LoadFieldInstr(
-      new (Z) Value(*array),
-      NativeFieldDesc::GetLengthFieldForArrayCid(array_cid), call->token_pos());
+      new (Z) Value(*array), Slot::GetLengthFieldForArrayCid(array_cid),
+      call->token_pos());
   *cursor = flow_graph->AppendTo(*cursor, length, NULL, FlowGraph::kValue);
-
-  Instruction* bounds_check = NULL;
-  if (can_speculate) {
-    bounds_check = new (Z) CheckArrayBoundInstr(
-        new (Z) Value(length), new (Z) Value(index), call->deopt_id());
-  } else {
-    bounds_check = new (Z) GenericCheckBoundInstr(
-        new (Z) Value(length), new (Z) Value(index), call->deopt_id());
-  }
-  *cursor = flow_graph->AppendTo(*cursor, bounds_check, call->env(),
-                                 FlowGraph::kEffect);
+  *index = flow_graph->CreateCheckBound(length, *index, call->deopt_id());
+  *cursor =
+      flow_graph->AppendTo(*cursor, *index, call->env(), FlowGraph::kValue);
 
   if (array_cid == kGrowableObjectArrayCid) {
     // Insert data elements load.
-    LoadFieldInstr* elements = new (Z) LoadFieldInstr(
-        new (Z) Value(*array), GrowableObjectArray::data_offset(),
-        Object::dynamic_type(), call->token_pos());
-    elements->set_result_cid(kArrayCid);
+    LoadFieldInstr* elements = new (Z)
+        LoadFieldInstr(new (Z) Value(*array), Slot::GrowableObjectArray_data(),
+                       call->token_pos());
     *cursor = flow_graph->AppendTo(*cursor, elements, NULL, FlowGraph::kValue);
     // Load from the data from backing store which is a fixed-length array.
     *array = elements;
@@ -2360,7 +2397,7 @@
                              GraphEntryInstr* graph_entry,
                              FunctionEntryInstr** entry,
                              Instruction** last,
-                             bool can_speculate) {
+                             Definition** result) {
   intptr_t array_cid = MethodRecognizer::MethodKindToReceiverCid(kind);
 
   Definition* array = receiver;
@@ -2371,8 +2408,8 @@
   (*entry)->InheritDeoptTarget(Z, call);
   Instruction* cursor = *entry;
 
-  array_cid = PrepareInlineIndexedOp(flow_graph, call, array_cid, &array, index,
-                                     &cursor, can_speculate);
+  array_cid = PrepareInlineIndexedOp(flow_graph, call, array_cid, &array,
+                                     &index, &cursor);
 
   intptr_t deopt_id = DeoptId::kNone;
   if ((array_cid == kTypedDataInt32ArrayCid) ||
@@ -2397,6 +2434,7 @@
                          deopt_id != DeoptId::kNone ? call->env() : NULL,
                          FlowGraph::kValue);
   }
+  *result = (*last)->AsDefinition();
   return true;
 }
 
@@ -2410,7 +2448,8 @@
                              FlowGraphInliner::ExactnessInfo* exactness,
                              GraphEntryInstr* graph_entry,
                              FunctionEntryInstr** entry,
-                             Instruction** last) {
+                             Instruction** last,
+                             Definition** result) {
   intptr_t array_cid = MethodRecognizer::MethodKindToReceiverCid(kind);
 
   Definition* array = receiver;
@@ -2421,8 +2460,22 @@
       new (Z) FunctionEntryInstr(graph_entry, flow_graph->allocate_block_id(),
                                  call->GetBlock()->try_index(), DeoptId::kNone);
   (*entry)->InheritDeoptTarget(Z, call);
+
+  bool is_unchecked_call = false;
+  if (StaticCallInstr* static_call = call->AsStaticCall()) {
+    is_unchecked_call =
+        static_call->entry_kind() == Code::EntryKind::kUnchecked;
+  } else if (InstanceCallInstr* instance_call = call->AsInstanceCall()) {
+    is_unchecked_call =
+        instance_call->entry_kind() == Code::EntryKind::kUnchecked;
+  } else if (PolymorphicInstanceCallInstr* instance_call =
+                 call->AsPolymorphicInstanceCall()) {
+    is_unchecked_call =
+        instance_call->entry_kind() == Code::EntryKind::kUnchecked;
+  }
+
   Instruction* cursor = *entry;
-  if (flow_graph->isolate()->argument_type_checks() &&
+  if (flow_graph->isolate()->argument_type_checks() && !is_unchecked_call &&
       (kind != MethodRecognizer::kObjectArraySetIndexedUnchecked &&
        kind != MethodRecognizer::kGrowableArraySetIndexedUnchecked)) {
     // Only type check for the value. A type check for the index is not
@@ -2435,10 +2488,11 @@
       case kArrayCid:
       case kGrowableObjectArrayCid: {
         const Class& instantiator_class = Class::Handle(Z, target.Owner());
-        LoadFieldInstr* load_type_args = new (Z) LoadFieldInstr(
-            new (Z) Value(array),
-            NativeFieldDesc::GetTypeArgumentsFieldFor(Z, instantiator_class),
-            call->token_pos());
+        LoadFieldInstr* load_type_args = new (Z)
+            LoadFieldInstr(new (Z) Value(array),
+                           Slot::GetTypeArgumentsSlotFor(flow_graph->thread(),
+                                                         instantiator_class),
+                           call->token_pos());
         cursor = flow_graph->AppendTo(cursor, load_type_args, NULL,
                                       FlowGraph::kValue);
         type_args = load_type_args;
@@ -2496,8 +2550,8 @@
     }
   }
 
-  array_cid = PrepareInlineIndexedOp(flow_graph, call, array_cid, &array, index,
-                                     &cursor, /* can_speculate= */ true);
+  array_cid = PrepareInlineIndexedOp(flow_graph, call, array_cid, &array,
+                                     &index, &cursor);
 
   // Check if store barrier is needed. Byte arrays don't need a store barrier.
   StoreBarrierType needs_store_barrier =
@@ -2545,6 +2599,9 @@
       needs_store_barrier, index_scale, array_cid, kAlignedAccess,
       call->deopt_id(), call->token_pos());
   flow_graph->AppendTo(cursor, *last, call->env(), FlowGraph::kEffect);
+  // We need a return value to replace uses of the original definition. However,
+  // the final instruction is a use of 'void operator[]=()', so we use null.
+  *result = flow_graph->constant_null();
   return true;
 }
 
@@ -2554,7 +2611,8 @@
                            Definition* receiver,
                            GraphEntryInstr* graph_entry,
                            FunctionEntryInstr** entry,
-                           Instruction** last) {
+                           Instruction** last,
+                           Definition** result) {
   if (!CanUnboxDouble()) {
     return false;
   }
@@ -2571,6 +2629,7 @@
                           call->deopt_id(), call->token_pos());
   flow_graph->AppendTo(*entry, double_bin_op, call->env(), FlowGraph::kValue);
   *last = double_bin_op;
+  *result = double_bin_op->AsDefinition();
 
   return true;
 }
@@ -2581,7 +2640,8 @@
                                MethodRecognizer::Kind kind,
                                GraphEntryInstr* graph_entry,
                                FunctionEntryInstr** entry,
-                               Instruction** last) {
+                               Instruction** last,
+                               Definition** result) {
   if (!CanUnboxDouble()) {
     return false;
   }
@@ -2596,6 +2656,7 @@
       kind, new (Z) Value(receiver), call->deopt_id(), call->token_pos());
   flow_graph->AppendTo(*entry, double_test_op, call->env(), FlowGraph::kValue);
   *last = double_test_op;
+  *result = double_test_op->AsDefinition();
 
   return true;
 }
@@ -2605,7 +2666,8 @@
                                    Definition* receiver,
                                    GraphEntryInstr* graph_entry,
                                    FunctionEntryInstr** entry,
-                                   Instruction** last) {
+                                   Instruction** last,
+                                   Definition** result) {
   Definition* left = receiver;
   Definition* right = call->ArgumentAt(1);
 
@@ -2619,18 +2681,20 @@
                                new (Z) Value(right), call->deopt_id());
   flow_graph->AppendTo(*entry, smi_op, call->env(), FlowGraph::kValue);
   *last = smi_op;
+  *result = smi_op->AsDefinition();
 
   return true;
 }
 
 static bool InlineGrowableArraySetter(FlowGraph* flow_graph,
-                                      intptr_t offset,
+                                      const Slot& field,
                                       StoreBarrierType store_barrier_type,
                                       Instruction* call,
                                       Definition* receiver,
                                       GraphEntryInstr* graph_entry,
                                       FunctionEntryInstr** entry,
-                                      Instruction** last) {
+                                      Instruction** last,
+                                      Definition** result) {
   Definition* array = receiver;
   Definition* value = call->ArgumentAt(1);
 
@@ -2640,28 +2704,49 @@
   (*entry)->InheritDeoptTarget(Z, call);
 
   // This is an internal method, no need to check argument types.
-  StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
-      offset, new (Z) Value(array), new (Z) Value(value), store_barrier_type,
-      call->token_pos());
+  StoreInstanceFieldInstr* store = new (Z)
+      StoreInstanceFieldInstr(field, new (Z) Value(array), new (Z) Value(value),
+                              store_barrier_type, call->token_pos());
   flow_graph->AppendTo(*entry, store, call->env(), FlowGraph::kEffect);
   *last = store;
+  // We need a return value to replace uses of the original definition. However,
+  // the last instruction is a field setter, which returns void, so we use null.
+  *result = flow_graph->constant_null();
 
   return true;
 }
 
+static bool InlineLoadClassId(FlowGraph* flow_graph,
+                              Instruction* call,
+                              GraphEntryInstr* graph_entry,
+                              FunctionEntryInstr** entry,
+                              Instruction** last,
+                              Definition** result) {
+  *entry =
+      new (Z) FunctionEntryInstr(graph_entry, flow_graph->allocate_block_id(),
+                                 call->GetBlock()->try_index(), DeoptId::kNone);
+  (*entry)->InheritDeoptTarget(Z, call);
+  auto load_cid = new (Z)
+      LoadClassIdInstr(call->PushArgumentAt(0)->value()->CopyWithType(Z));
+  flow_graph->InsertBefore(call, load_cid, nullptr, FlowGraph::kValue);
+  *last = load_cid;
+  *result = load_cid->AsDefinition();
+  return true;
+}
+
 // Adds an explicit bounds check for a typed getter/setter.
 static void PrepareInlineTypedArrayBoundsCheck(FlowGraph* flow_graph,
                                                Instruction* call,
                                                intptr_t array_cid,
                                                intptr_t view_cid,
                                                Definition* array,
-                                               Definition* byte_index,
+                                               Definition** byte_index,
                                                Instruction** cursor) {
   ASSERT(array_cid != kDynamicCid);
 
   LoadFieldInstr* length = new (Z) LoadFieldInstr(
-      new (Z) Value(array),
-      NativeFieldDesc::GetLengthFieldForArrayCid(array_cid), call->token_pos());
+      new (Z) Value(array), Slot::GetLengthFieldForArrayCid(array_cid),
+      call->token_pos());
   *cursor = flow_graph->AppendTo(*cursor, length, NULL, FlowGraph::kValue);
 
   intptr_t element_size = Instance::ElementSizeFor(array_cid);
@@ -2687,19 +2772,19 @@
   }
 
   // Check adjusted_length > 0.
+  // TODO(ajcbik): this is a synthetic check that cannot
+  // be directly linked to a use, is that a sign of wrong use?
   ConstantInstr* zero = flow_graph->GetConstant(Smi::Handle(Z, Smi::New(0)));
-  *cursor = flow_graph->AppendTo(
-      *cursor,
-      new (Z) CheckArrayBoundInstr(new (Z) Value(adjusted_length),
-                                   new (Z) Value(zero), call->deopt_id()),
-      call->env(), FlowGraph::kEffect);
+  Definition* check =
+      flow_graph->CreateCheckBound(adjusted_length, zero, call->deopt_id());
+  *cursor =
+      flow_graph->AppendTo(*cursor, check, call->env(), FlowGraph::kValue);
 
   // Check 0 <= byte_index < adjusted_length.
-  *cursor = flow_graph->AppendTo(
-      *cursor,
-      new (Z) CheckArrayBoundInstr(new (Z) Value(adjusted_length),
-                                   new (Z) Value(byte_index), call->deopt_id()),
-      call->env(), FlowGraph::kEffect);
+  *byte_index = flow_graph->CreateCheckBound(adjusted_length, *byte_index,
+                                             call->deopt_id());
+  *cursor = flow_graph->AppendTo(*cursor, *byte_index, call->env(),
+                                 FlowGraph::kValue);
 }
 
 // Emits preparatory code for a typed getter/setter.
@@ -2778,7 +2863,8 @@
                                     intptr_t view_cid,
                                     GraphEntryInstr* graph_entry,
                                     FunctionEntryInstr** entry,
-                                    Instruction** last) {
+                                    Instruction** last,
+                                    Definition** result) {
   ASSERT(array_cid != kIllegalCid);
 
   // Dynamic calls are polymorphic due to:
@@ -2807,7 +2893,7 @@
       !flow_graph->isolate()->can_use_strong_mode_types();
   if (needs_bounds_check) {
     PrepareInlineTypedArrayBoundsCheck(flow_graph, call, array_cid, view_cid,
-                                       array, index, &cursor);
+                                       array, &index, &cursor);
   }
 
   // Generates a template for the load, either a dynamic conditional
@@ -2854,6 +2940,7 @@
                                        DeoptId::kNone);
     flow_graph->AppendTo(cursor, *last, nullptr, FlowGraph::kValue);
   }
+  *result = (*last)->AsDefinition();
   return true;
 }
 
@@ -2877,7 +2964,8 @@
                                      intptr_t view_cid,
                                      GraphEntryInstr* graph_entry,
                                      FunctionEntryInstr** entry,
-                                     Instruction** last) {
+                                     Instruction** last,
+                                     Definition** result) {
   ASSERT(array_cid != kIllegalCid);
 
   // Dynamic calls are polymorphic due to:
@@ -2906,7 +2994,7 @@
       !flow_graph->isolate()->can_use_strong_mode_types();
   if (needs_bounds_check) {
     PrepareInlineTypedArrayBoundsCheck(flow_graph, call, array_cid, view_cid,
-                                       array, index, &cursor);
+                                       array, &index, &cursor);
   }
 
   // Prepare additional checks.
@@ -2984,7 +3072,6 @@
     cursor =
         flow_graph->AppendTo(cursor, check, call->env(), FlowGraph::kEffect);
     // With an explicit null check, a non-speculative unbox suffices.
-    ASSERT(FLAG_strong);
     switch (view_cid) {
       case kTypedDataFloat32ArrayCid:
       case kTypedDataFloat64ArrayCid:
@@ -3062,6 +3149,9 @@
         FlowGraph::kEffect);
     *last = store;
   }
+  // We need a return value to replace uses of the original definition. However,
+  // the final instruction is a use of 'void operator[]=()', so we use null.
+  *result = flow_graph->constant_null();
   return true;
 }
 
@@ -3072,17 +3162,14 @@
                                               Definition* str,
                                               Definition* index,
                                               Instruction* cursor) {
-  LoadFieldInstr* length = new (Z) LoadFieldInstr(
-      new (Z) Value(str), NativeFieldDesc::GetLengthFieldForArrayCid(cid),
-      str->token_pos());
+  LoadFieldInstr* length = new (Z)
+      LoadFieldInstr(new (Z) Value(str), Slot::GetLengthFieldForArrayCid(cid),
+                     str->token_pos());
   cursor = flow_graph->AppendTo(cursor, length, NULL, FlowGraph::kValue);
 
   // Bounds check.
-  cursor = flow_graph->AppendTo(
-      cursor,
-      new (Z) CheckArrayBoundInstr(new (Z) Value(length), new (Z) Value(index),
-                                   call->deopt_id()),
-      call->env(), FlowGraph::kEffect);
+  index = flow_graph->CreateCheckBound(length, index, call->deopt_id());
+  cursor = flow_graph->AppendTo(cursor, index, call->env(), FlowGraph::kValue);
 
   // For external strings: Load backing store.
   if (cid == kExternalOneByteStringCid) {
@@ -3110,7 +3197,8 @@
                                    intptr_t cid,
                                    GraphEntryInstr* graph_entry,
                                    FunctionEntryInstr** entry,
-                                   Instruction** last) {
+                                   Instruction** last,
+                                   Definition** result) {
   if ((cid != kOneByteStringCid) && (cid != kExternalOneByteStringCid)) {
     return false;
   }
@@ -3129,6 +3217,7 @@
 
   flow_graph->AppendTo(*last, char_at, NULL, FlowGraph::kValue);
   *last = char_at;
+  *result = char_at->AsDefinition();
 
   return true;
 }
@@ -3139,14 +3228,16 @@
                                    intptr_t cid,
                                    GraphEntryInstr* graph_entry,
                                    FunctionEntryInstr** entry,
-                                   Instruction** last) {
+                                   Instruction** last,
+                                   Definition** result) {
   if (cid == kDynamicCid) {
     ASSERT(call->IsStaticCall());
     return false;
+  } else if ((cid != kOneByteStringCid) && (cid != kTwoByteStringCid) &&
+             (cid != kExternalOneByteStringCid) &&
+             (cid != kExternalTwoByteStringCid)) {
+    return false;
   }
-  ASSERT((cid == kOneByteStringCid) || (cid == kTwoByteStringCid) ||
-         (cid == kExternalOneByteStringCid) ||
-         (cid == kExternalTwoByteStringCid));
   Definition* str = receiver;
   Definition* index = call->ArgumentAt(1);
 
@@ -3156,6 +3247,7 @@
   (*entry)->InheritDeoptTarget(Z, call);
 
   *last = PrepareInlineStringIndexOp(flow_graph, call, cid, str, index, *entry);
+  *result = (*last)->AsDefinition();
 
   return true;
 }
@@ -3172,12 +3264,19 @@
   const intptr_t receiver_cid = class_ids[0];
   FunctionEntryInstr* entry = nullptr;
   Instruction* last = nullptr;
+  Definition* result = nullptr;
   auto exactness = call->ic_data()->GetExactnessAt(0);
   ExactnessInfo exactness_info{exactness.IsExact(), false};
   if (FlowGraphInliner::TryInlineRecognizedMethod(
           flow_graph, receiver_cid, target, call,
           call->Receiver()->definition(), call->token_pos(), call->ic_data(),
-          /*graph_entry=*/nullptr, &entry, &last, policy, &exactness_info)) {
+          /*graph_entry=*/nullptr, &entry, &last, &result, policy,
+          &exactness_info)) {
+    // The empty Object constructor is the only case where the inlined body is
+    // empty and there is no result.
+    ASSERT((last != nullptr && result != nullptr) ||
+           MethodRecognizer::RecognizeKind(target) ==
+               MethodRecognizer::kObjectConstructor);
     // Determine if inlining instance methods needs a check.
     FlowGraph::ToCheck check = FlowGraph::ToCheck::kNoCheck;
     if (MethodRecognizer::PolymorphicTarget(target)) {
@@ -3221,8 +3320,8 @@
     }
     // Replace all uses of this definition with the result.
     if (call->HasUses()) {
-      ASSERT(last->IsDefinition());
-      call->ReplaceUsesWith(last->AsDefinition());
+      ASSERT(result->HasSSATemp());
+      call->ReplaceUsesWith(result);
     }
     // Finally insert the sequence other definition in place of this one in the
     // graph.
@@ -3251,6 +3350,7 @@
     SpeculativeInliningPolicy* policy) {
   FunctionEntryInstr* entry = nullptr;
   Instruction* last = nullptr;
+  Definition* result = nullptr;
   Definition* receiver = nullptr;
   intptr_t receiver_cid = kIllegalCid;
   if (!call->function().is_static()) {
@@ -3260,7 +3360,12 @@
   if (FlowGraphInliner::TryInlineRecognizedMethod(
           flow_graph, receiver_cid, call->function(), call, receiver,
           call->token_pos(), call->ic_data(), /*graph_entry=*/nullptr, &entry,
-          &last, policy)) {
+          &last, &result, policy)) {
+    // The empty Object constructor is the only case where the inlined body is
+    // empty and there is no result.
+    ASSERT((last != nullptr && result != nullptr) ||
+           MethodRecognizer::RecognizeKind(call->function()) ==
+               MethodRecognizer::kObjectConstructor);
     // Remove the original push arguments.
     for (intptr_t i = 0; i < call->ArgumentCount(); ++i) {
       PushArgumentInstr* push = call->PushArgumentAt(i);
@@ -3269,8 +3374,8 @@
     }
     // Replace all uses of this definition with the result.
     if (call->HasUses()) {
-      ASSERT(last->IsDefinition());
-      call->ReplaceUsesWith(last->AsDefinition());
+      ASSERT(result->HasSSATemp());
+      call->ReplaceUsesWith(result);
     }
     // Finally insert the sequence other definition in place of this one in the
     // graph.
@@ -3332,7 +3437,8 @@
                          MethodRecognizer::Kind kind,
                          GraphEntryInstr* graph_entry,
                          FunctionEntryInstr** entry,
-                         Instruction** last) {
+                         Instruction** last,
+                         Definition** result) {
   if (!ShouldInlineSimd()) {
     return false;
   }
@@ -3394,6 +3500,7 @@
   flow_graph->AppendTo(cursor, *last,
                        call->deopt_id() != DeoptId::kNone ? call->env() : NULL,
                        FlowGraph::kValue);
+  *result = (*last)->AsDefinition();
   return true;
 }
 
@@ -3402,7 +3509,8 @@
                                 MethodRecognizer::Kind kind,
                                 GraphEntryInstr* graph_entry,
                                 FunctionEntryInstr** entry,
-                                Instruction** last) {
+                                Instruction** last,
+                                Definition** result) {
   if (!CanUnboxDouble()) {
     return false;
   }
@@ -3433,6 +3541,7 @@
   flow_graph->AppendTo(cursor, *last,
                        call->deopt_id() != DeoptId::kNone ? call->env() : NULL,
                        FlowGraph::kValue);
+  *result = (*last)->AsDefinition();
   return true;
 }
 
@@ -3450,7 +3559,8 @@
                              Instruction* call,
                              GraphEntryInstr* graph_entry,
                              FunctionEntryInstr** entry,
-                             Instruction** last) {
+                             Instruction** last,
+                             Definition** result) {
   // Invoking the _intPow(x, y) implies that both:
   // (1) x, y are int
   // (2) y >= 0.
@@ -3464,9 +3574,11 @@
   if (IsSmiValue(y, &val)) {
     if (val == 0) {
       *last = flow_graph->GetConstant(Smi::ZoneHandle(Smi::New(1)));
+      *result = (*last)->AsDefinition();
       return true;
     } else if (val == 1) {
       *last = x->definition();
+      *result = (*last)->AsDefinition();
       return true;
     } else if (1 < val && val <= small_exponent) {
       // Lazily construct entry only in this case.
@@ -3478,18 +3590,22 @@
       Definition* square =
           InlineMul(flow_graph, *entry, x_def, x_def)->AsDefinition();
       *last = square;
+      *result = square;
       switch (val) {
         case 2:
           return true;
         case 3:
           *last = InlineMul(flow_graph, *last, x_def, square);
+          *result = (*last)->AsDefinition();
           return true;
         case 4:
           *last = InlineMul(flow_graph, *last, square, square);
+          *result = (*last)->AsDefinition();
           return true;
         case 5:
           *last = InlineMul(flow_graph, *last, square, square);
           *last = InlineMul(flow_graph, *last, x_def, (*last)->AsDefinition());
+          *result = (*last)->AsDefinition();
           return true;
       }
     }
@@ -3498,6 +3614,7 @@
   if (IsSmiValue(x, &val)) {
     if (val == 1) {
       *last = x->definition();
+      *result = x->definition();
       return true;
     }
   }
@@ -3515,12 +3632,12 @@
     GraphEntryInstr* graph_entry,
     FunctionEntryInstr** entry,
     Instruction** last,
+    Definition** result,
     SpeculativeInliningPolicy* policy,
     FlowGraphInliner::ExactnessInfo* exactness) {
   const bool can_speculate = policy->IsAllowedForInlining(call->deopt_id());
 
   const MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(target);
-
   switch (kind) {
     // Recognized [] operators.
     case MethodRecognizer::kImmutableArrayGetIndexed:
@@ -3534,35 +3651,38 @@
     case MethodRecognizer::kInt16ArrayGetIndexed:
     case MethodRecognizer::kUint16ArrayGetIndexed:
       return InlineGetIndexed(flow_graph, kind, call, receiver, graph_entry,
-                              entry, last, can_speculate);
+                              entry, last, result);
     case MethodRecognizer::kFloat32ArrayGetIndexed:
     case MethodRecognizer::kFloat64ArrayGetIndexed:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineGetIndexed(flow_graph, kind, call, receiver, graph_entry,
-                              entry, last, can_speculate);
+                              entry, last, result);
     case MethodRecognizer::kFloat32x4ArrayGetIndexed:
     case MethodRecognizer::kFloat64x2ArrayGetIndexed:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineGetIndexed(flow_graph, kind, call, receiver, graph_entry,
-                              entry, last, can_speculate);
+                              entry, last, result);
     case MethodRecognizer::kInt32ArrayGetIndexed:
     case MethodRecognizer::kUint32ArrayGetIndexed:
       if (!CanUnboxInt32()) {
         return false;
       }
       return InlineGetIndexed(flow_graph, kind, call, receiver, graph_entry,
-                              entry, last, can_speculate);
+                              entry, last, result);
     case MethodRecognizer::kInt64ArrayGetIndexed:
     case MethodRecognizer::kUint64ArrayGetIndexed:
       if (!ShouldInlineInt64ArrayOps()) {
         return false;
       }
       return InlineGetIndexed(flow_graph, kind, call, receiver, graph_entry,
-                              entry, last, can_speculate);
+                              entry, last, result);
+    case MethodRecognizer::kClassIDgetID:
+      return InlineLoadClassId(flow_graph, call, graph_entry, entry, last,
+                               result);
     default:
       break;
   }
@@ -3580,7 +3700,7 @@
     case MethodRecognizer::kGrowableArraySetIndexedUnchecked:
       return InlineSetIndexed(flow_graph, kind, target, call, receiver,
                               token_pos, /* value_check = */ NULL, exactness,
-                              graph_entry, entry, last);
+                              graph_entry, entry, last, result);
     case MethodRecognizer::kInt8ArraySetIndexed:
     case MethodRecognizer::kUint8ArraySetIndexed:
     case MethodRecognizer::kUint8ClampedArraySetIndexed:
@@ -3596,7 +3716,7 @@
       Cids* value_check = Cids::CreateMonomorphic(Z, kSmiCid);
       return InlineSetIndexed(flow_graph, kind, target, call, receiver,
                               token_pos, value_check, exactness, graph_entry,
-                              entry, last);
+                              entry, last, result);
     }
     case MethodRecognizer::kInt32ArraySetIndexed:
     case MethodRecognizer::kUint32ArraySetIndexed: {
@@ -3604,7 +3724,7 @@
       // implicitly contain unboxing instructions which check for right type.
       return InlineSetIndexed(flow_graph, kind, target, call, receiver,
                               token_pos, /* value_check = */ NULL, exactness,
-                              graph_entry, entry, last);
+                              graph_entry, entry, last, result);
     }
     case MethodRecognizer::kInt64ArraySetIndexed:
     case MethodRecognizer::kUint64ArraySetIndexed:
@@ -3613,7 +3733,7 @@
       }
       return InlineSetIndexed(flow_graph, kind, target, call, receiver,
                               token_pos, /* value_check = */ NULL, exactness,
-                              graph_entry, entry, last);
+                              graph_entry, entry, last, result);
     case MethodRecognizer::kFloat32ArraySetIndexed:
     case MethodRecognizer::kFloat64ArraySetIndexed: {
       if (!CanUnboxDouble()) {
@@ -3622,7 +3742,7 @@
       Cids* value_check = Cids::CreateMonomorphic(Z, kDoubleCid);
       return InlineSetIndexed(flow_graph, kind, target, call, receiver,
                               token_pos, value_check, exactness, graph_entry,
-                              entry, last);
+                              entry, last, result);
     }
     case MethodRecognizer::kFloat32x4ArraySetIndexed: {
       if (!ShouldInlineSimd()) {
@@ -3631,7 +3751,7 @@
       Cids* value_check = Cids::CreateMonomorphic(Z, kFloat32x4Cid);
       return InlineSetIndexed(flow_graph, kind, target, call, receiver,
                               token_pos, value_check, exactness, graph_entry,
-                              entry, last);
+                              entry, last, result);
     }
     case MethodRecognizer::kFloat64x2ArraySetIndexed: {
       if (!ShouldInlineSimd()) {
@@ -3640,190 +3760,190 @@
       Cids* value_check = Cids::CreateMonomorphic(Z, kFloat64x2Cid);
       return InlineSetIndexed(flow_graph, kind, target, call, receiver,
                               token_pos, value_check, exactness, graph_entry,
-                              entry, last);
+                              entry, last, result);
     }
     case MethodRecognizer::kByteArrayBaseGetInt8:
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataInt8ArrayCid, graph_entry, entry,
-                                     last);
+                                     last, result);
     case MethodRecognizer::kByteArrayBaseGetUint8:
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataUint8ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetInt16:
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataInt16ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetUint16:
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataUint16ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetInt32:
       if (!CanUnboxInt32()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataInt32ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetUint32:
       if (!CanUnboxInt32()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataUint32ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetInt64:
       if (!ShouldInlineInt64ArrayOps()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataInt64ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetUint64:
       if (!ShouldInlineInt64ArrayOps()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataUint64ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetFloat32:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataFloat32ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetFloat64:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataFloat64ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetFloat32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataFloat32x4ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseGetInt32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineByteArrayBaseLoad(flow_graph, call, receiver, receiver_cid,
                                      kTypedDataInt32x4ArrayCid, graph_entry,
-                                     entry, last);
+                                     entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetInt8:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataInt8ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetUint8:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataUint8ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetInt16:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataInt16ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetUint16:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataUint16ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetInt32:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataInt32ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetUint32:
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataUint32ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetInt64:
       if (!ShouldInlineInt64ArrayOps()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataInt64ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetUint64:
       if (!ShouldInlineInt64ArrayOps()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataUint64ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetFloat32:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataFloat32ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetFloat64:
       if (!CanUnboxDouble()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataFloat64ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetFloat32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataFloat32x4ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kByteArrayBaseSetInt32x4:
       if (!ShouldInlineSimd()) {
         return false;
       }
       return InlineByteArrayBaseStore(flow_graph, target, call, receiver,
                                       receiver_cid, kTypedDataInt32x4ArrayCid,
-                                      graph_entry, entry, last);
+                                      graph_entry, entry, last, result);
     case MethodRecognizer::kOneByteStringCodeUnitAt:
     case MethodRecognizer::kTwoByteStringCodeUnitAt:
     case MethodRecognizer::kExternalOneByteStringCodeUnitAt:
     case MethodRecognizer::kExternalTwoByteStringCodeUnitAt:
       return InlineStringCodeUnitAt(flow_graph, call, receiver, receiver_cid,
-                                    graph_entry, entry, last);
+                                    graph_entry, entry, last, result);
     case MethodRecognizer::kStringBaseCharAt:
       return InlineStringBaseCharAt(flow_graph, call, receiver, receiver_cid,
-                                    graph_entry, entry, last);
+                                    graph_entry, entry, last, result);
     case MethodRecognizer::kDoubleAdd:
       return InlineDoubleOp(flow_graph, Token::kADD, call, receiver,
-                            graph_entry, entry, last);
+                            graph_entry, entry, last, result);
     case MethodRecognizer::kDoubleSub:
       return InlineDoubleOp(flow_graph, Token::kSUB, call, receiver,
-                            graph_entry, entry, last);
+                            graph_entry, entry, last, result);
     case MethodRecognizer::kDoubleMul:
       return InlineDoubleOp(flow_graph, Token::kMUL, call, receiver,
-                            graph_entry, entry, last);
+                            graph_entry, entry, last, result);
     case MethodRecognizer::kDoubleDiv:
       return InlineDoubleOp(flow_graph, Token::kDIV, call, receiver,
-                            graph_entry, entry, last);
+                            graph_entry, entry, last, result);
     case MethodRecognizer::kDouble_getIsNaN:
     case MethodRecognizer::kDouble_getIsInfinite:
       return InlineDoubleTestOp(flow_graph, call, receiver, kind, graph_entry,
-                                entry, last);
+                                entry, last, result);
     case MethodRecognizer::kGrowableArraySetData:
       ASSERT((receiver_cid == kGrowableObjectArrayCid) ||
              ((receiver_cid == kDynamicCid) && call->IsStaticCall()));
       ASSERT(call->IsStaticCall() ||
              (ic_data == NULL || ic_data->NumberOfChecksIs(1)));
       return InlineGrowableArraySetter(
-          flow_graph, GrowableObjectArray::data_offset(), kEmitStoreBarrier,
-          call, receiver, graph_entry, entry, last);
+          flow_graph, Slot::GrowableObjectArray_data(), kEmitStoreBarrier, call,
+          receiver, graph_entry, entry, last, result);
     case MethodRecognizer::kGrowableArraySetLength:
       ASSERT((receiver_cid == kGrowableObjectArrayCid) ||
              ((receiver_cid == kDynamicCid) && call->IsStaticCall()));
       ASSERT(call->IsStaticCall() ||
              (ic_data == NULL || ic_data->NumberOfChecksIs(1)));
       return InlineGrowableArraySetter(
-          flow_graph, GrowableObjectArray::length_offset(), kNoStoreBarrier,
-          call, receiver, graph_entry, entry, last);
+          flow_graph, Slot::GrowableObjectArray_length(), kNoStoreBarrier, call,
+          receiver, graph_entry, entry, last, result);
     case MethodRecognizer::kSmi_bitAndFromSmi:
       return InlineSmiBitAndFromSmi(flow_graph, call, receiver, graph_entry,
-                                    entry, last);
+                                    entry, last, result);
 
     case MethodRecognizer::kFloat32x4Abs:
     case MethodRecognizer::kFloat32x4Clamp:
@@ -3887,7 +4007,7 @@
     case MethodRecognizer::kFloat32x4Shuffle:
     case MethodRecognizer::kInt32x4Shuffle:
       return InlineSimdOp(flow_graph, call, receiver, kind, graph_entry, entry,
-                          last);
+                          last, result);
 
     case MethodRecognizer::kMathSqrt:
     case MethodRecognizer::kMathDoublePow:
@@ -3899,10 +4019,11 @@
     case MethodRecognizer::kMathAtan:
     case MethodRecognizer::kMathAtan2:
       return InlineMathCFunction(flow_graph, call, kind, graph_entry, entry,
-                                 last);
+                                 last, result);
 
     case MethodRecognizer::kMathIntPow:
-      return InlineMathIntPow(flow_graph, call, graph_entry, entry, last);
+      return InlineMathIntPow(flow_graph, call, graph_entry, entry, last,
+                              result);
 
     case MethodRecognizer::kObjectConstructor: {
       *entry = new (Z)
@@ -3911,6 +4032,7 @@
       (*entry)->InheritDeoptTarget(Z, call);
       ASSERT(!call->HasUses());
       *last = NULL;  // Empty body.
+      *result = NULL;  // Since no uses of original call, result will be unused.
       return true;
     }
 
@@ -3933,6 +4055,7 @@
           *entry, *last,
           call->deopt_id() != DeoptId::kNone ? call->env() : NULL,
           FlowGraph::kValue);
+      *result = (*last)->AsDefinition();
       return true;
     }
 
@@ -3952,6 +4075,7 @@
               *entry, *last,
               call->deopt_id() != DeoptId::kNone ? call->env() : NULL,
               FlowGraph::kValue);
+          *result = (*last)->AsDefinition();
           return true;
         }
       }
@@ -3972,7 +4096,7 @@
         const Class& cls = Class::Handle(
             Z, flow_graph->isolate()->class_table()->At(receiver_cid));
         if (!cls.IsGeneric()) {
-          type = cls.CanonicalType();
+          type = cls.DeclarationType();
         }
       }
 
@@ -3986,6 +4110,7 @@
             *entry, *last,
             call->deopt_id() != DeoptId::kNone ? call->env() : NULL,
             FlowGraph::kValue);
+        *result = (*last)->AsDefinition();
         return true;
       }
       return false;
@@ -4011,6 +4136,9 @@
           *entry, *last,
           call->deopt_id() != DeoptId::kNone ? call->env() : NULL,
           FlowGraph::kEffect);
+      // We need a return value to replace uses of the original definition.
+      // The final instruction is a use of 'void operator[]=()', so we use null.
+      *result = flow_graph->constant_null();
       return true;
     }
 
diff --git a/runtime/vm/compiler/backend/inliner.h b/runtime/vm/compiler/backend/inliner.h
index 1ca172f..34366cf 100644
--- a/runtime/vm/compiler/backend/inliner.h
+++ b/runtime/vm/compiler/backend/inliner.h
@@ -7,6 +7,7 @@
 
 #include "vm/allocation.h"
 #include "vm/growable_array.h"
+#include "vm/token_position.h"
 
 namespace dart {
 
@@ -68,7 +69,7 @@
  private:
   bool IsBlacklisted(intptr_t id) const {
     for (intptr_t i = 0; i < inlining_blacklist_.length(); ++i) {
-      if (inlining_blacklist_[i] != id) return true;
+      if (inlining_blacklist_[i] == id) return true;
     }
     return false;
   }
@@ -139,6 +140,7 @@
                                         GraphEntryInstr* graph_entry,
                                         FunctionEntryInstr** entry,
                                         Instruction** last,
+                                        Definition** result,
                                         SpeculativeInliningPolicy* policy,
                                         ExactnessInfo* exactness = nullptr);
 
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index 34d18ca..15184b1 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -65,6 +65,28 @@
   return (pos | 1);
 }
 
+// Additional information on loops during register allocation.
+struct ExtraLoopInfo : public ZoneAllocated {
+  ExtraLoopInfo(intptr_t s, intptr_t e)
+      : start(s), end(e), backedge_interference(nullptr) {}
+  intptr_t start;
+  intptr_t end;
+  BitVector* backedge_interference;
+};
+
+// Returns extra loop information.
+static ExtraLoopInfo* ComputeExtraLoopInfo(Zone* zone, LoopInfo* loop_info) {
+  intptr_t start = loop_info->header()->start_pos();
+  intptr_t end = start;
+  for (auto back_edge : loop_info->back_edges()) {
+    intptr_t end_pos = back_edge->end_pos();
+    if (end_pos > end) {
+      end = end_pos;
+    }
+  }
+  return new (zone) ExtraLoopInfo(start, end);
+}
+
 FlowGraphAllocator::FlowGraphAllocator(const FlowGraph& flow_graph,
                                        bool intrinsic_mode)
     : flow_graph_(flow_graph),
@@ -72,16 +94,28 @@
       value_representations_(flow_graph.max_virtual_register_number()),
       block_order_(flow_graph.reverse_postorder()),
       postorder_(flow_graph.postorder()),
+      instructions_(),
+      block_entries_(),
+      extra_loop_info_(),
       liveness_(flow_graph),
       vreg_count_(flow_graph.max_virtual_register_number()),
       live_ranges_(flow_graph.max_virtual_register_number()),
+      unallocated_cpu_(),
+      unallocated_xmm_(),
       cpu_regs_(),
       fpu_regs_(),
       blocked_cpu_registers_(),
       blocked_fpu_registers_(),
+      spilled_(),
+      safepoints_(),
+      register_kind_(),
       number_of_registers_(0),
       registers_(),
       blocked_registers_(),
+      unallocated_(),
+      spill_slots_(),
+      quad_spill_slots_(),
+      untagged_spill_slots_(),
       cpu_spill_slot_count_(0),
       intrinsic_mode_(intrinsic_mode) {
   for (intptr_t i = 0; i < vreg_count_; i++) {
@@ -489,19 +523,6 @@
   }
 }
 
-// Returns loops latest position.
-static intptr_t LoopEnd(LoopInfo* loop_info) {
-  intptr_t max_pos = 0;
-  const GrowableArray<BlockEntryInstr*>& back_edges = loop_info->back_edges();
-  for (intptr_t i = 0, n = back_edges.length(); i < n; i++) {
-    intptr_t end_pos = back_edges[i]->end_pos();
-    if (end_pos > max_pos) {
-      max_pos = end_pos;
-    }
-  }
-  return max_pos;
-}
-
 // Returns true if all uses of the given range inside the
 // given loop boundary have Any allocation policy.
 static bool HasOnlyUnconstrainedUsesInLoop(LiveRange* range,
@@ -548,10 +569,12 @@
 
     LoopInfo* loop_info = block->loop_info();
     if ((loop_info != nullptr) && (loop_info->IsBackEdge(block))) {
-      if (backedge_interference_[loop_info->id()] != nullptr) {
+      BitVector* backedge_interference =
+          extra_loop_info_[loop_info->id()]->backedge_interference;
+      if (backedge_interference != nullptr) {
         // Restore interference for subsequent backedge a loop
         // (perhaps inner loop's header reset set in the meanwhile).
-        current_interference_set = backedge_interference_[loop_info->id()];
+        current_interference_set = backedge_interference;
       } else {
         // All values flowing into the loop header are live at the
         // back edge and can interfere with phi moves.
@@ -559,7 +582,8 @@
             BitVector(zone, flow_graph_.max_virtual_register_number());
         current_interference_set->AddAll(
             liveness_.GetLiveInSet(loop_info->header()));
-        backedge_interference_[loop_info->id()] = current_interference_set;
+        extra_loop_info_[loop_info->id()]->backedge_interference =
+            current_interference_set;
       }
     }
 
@@ -583,7 +607,8 @@
       for (BitVector::Iterator it(liveness_.GetLiveInSetAt(i)); !it.Done();
            it.Advance()) {
         LiveRange* range = GetLiveRange(it.Current());
-        if (HasOnlyUnconstrainedUsesInLoop(range, LoopEnd(loop_info))) {
+        intptr_t loop_end = extra_loop_info_[loop_info->id()]->end;
+        if (HasOnlyUnconstrainedUsesInLoop(range, loop_end)) {
           range->MarkHasOnlyUnconstrainedUsesInLoop(loop_info->id());
         }
       }
@@ -1608,9 +1633,14 @@
     }
   }
 
-  // Storage per loop.
-  const intptr_t num_loops = flow_graph_.loop_hierarchy().num_loops();
-  backedge_interference_.EnsureLength(num_loops, nullptr);
+  // Prepare some extra information for each loop.
+  Zone* zone = flow_graph_.zone();
+  const LoopHierarchy& loop_hierarchy = flow_graph_.loop_hierarchy();
+  const intptr_t num_loops = loop_hierarchy.num_loops();
+  for (intptr_t i = 0; i < num_loops; i++) {
+    extra_loop_info_.Add(
+        ComputeExtraLoopInfo(zone, loop_hierarchy.headers()[i]->loop_info()));
+  }
 }
 
 Instruction* FlowGraphAllocator::InstructionAt(intptr_t pos) const {
@@ -1834,13 +1864,40 @@
   if (from < split_block_entry->lifetime_position()) {
     // Interval [from, to) spans multiple blocks.
 
-    // If last block is inside a loop prefer splitting at outermost loop's
-    // header.
+    // If the last block is inside a loop, prefer splitting at the outermost
+    // loop's header that follows the definition. Note that, as illustrated
+    // below, if the potential split S linearly appears inside a loop, even
+    // though it technically does not belong to the natural loop, we still
+    // prefer splitting at the header H. Splitting in the "middle" of the loop
+    // would disconnect the prefix of the loop from any block X that follows,
+    // increasing the chance of "disconnected" allocations.
+    //
+    //            +--------------------+
+    //            v                    |
+    //            |loop|          |loop|
+    // . . . . . . . . . . . . . . . . . . . . .
+    //     def------------use     -----------
+    //            ^      ^        ^
+    //            H      S        X
     LoopInfo* loop_info = split_block_entry->loop_info();
+    if (loop_info == nullptr) {
+      const LoopHierarchy& loop_hierarchy = flow_graph_.loop_hierarchy();
+      const intptr_t num_loops = loop_hierarchy.num_loops();
+      for (intptr_t i = 0; i < num_loops; i++) {
+        if (extra_loop_info_[i]->start < to && to < extra_loop_info_[i]->end) {
+          // Split loop found!
+          loop_info = loop_hierarchy.headers()[i]->loop_info();
+          break;
+        }
+      }
+    }
     while ((loop_info != nullptr) &&
            (from < loop_info->header()->lifetime_position())) {
       split_block_entry = loop_info->header();
       loop_info = loop_info->outer();
+      TRACE_ALLOC(THR_Print("  move back to loop header B%" Pd " at %" Pd "\n",
+                            split_block_entry->block_id(),
+                            split_block_entry->lifetime_position()));
     }
 
     // Split at block's start.
@@ -2173,8 +2230,9 @@
   // edge.
   LoopInfo* loop_info = BlockEntryAt(unallocated->Start())->loop_info();
   if ((unallocated->vreg() >= 0) && (loop_info != nullptr) &&
-      (free_until >= LoopEnd(loop_info)) &&
-      backedge_interference_[loop_info->id()]->Contains(unallocated->vreg())) {
+      (free_until >= extra_loop_info_[loop_info->id()]->end) &&
+      extra_loop_info_[loop_info->id()]->backedge_interference->Contains(
+          unallocated->vreg())) {
     GrowableArray<bool> used_on_backedge(number_of_registers_);
     for (intptr_t i = 0; i < number_of_registers_; i++) {
       used_on_backedge.Add(false);
@@ -2206,12 +2264,13 @@
     }
 
     if (used_on_backedge[candidate]) {
-      TRACE_ALLOC(
-          THR_Print("considering %s for v%" Pd
-                    ": has interference on the back edge"
-                    " {loop [%" Pd ", %" Pd ")}\n",
-                    MakeRegisterLocation(candidate).Name(), unallocated->vreg(),
-                    loop_info->header()->start_pos(), LoopEnd(loop_info)));
+      TRACE_ALLOC(THR_Print("considering %s for v%" Pd
+                            ": has interference on the back edge"
+                            " {loop [%" Pd ", %" Pd ")}\n",
+                            MakeRegisterLocation(candidate).Name(),
+                            unallocated->vreg(),
+                            extra_loop_info_[loop_info->id()]->start,
+                            extra_loop_info_[loop_info->id()]->end));
       for (intptr_t reg = 0; reg < NumberOfRegisters(); ++reg) {
         if (blocked_registers_[reg] || (reg == candidate) ||
             used_on_backedge[reg]) {
@@ -2261,16 +2320,13 @@
   return false;
 }
 
-bool FlowGraphAllocator::IsCheapToEvictRegisterInLoop(BlockEntryInstr* header,
+bool FlowGraphAllocator::IsCheapToEvictRegisterInLoop(LoopInfo* loop_info,
                                                       intptr_t reg) {
-  LoopInfo* loop_info = header->loop_info();
-
-  const intptr_t loop_start = header->start_pos();
-  const intptr_t loop_end = LoopEnd(loop_info);
+  const intptr_t loop_start = extra_loop_info_[loop_info->id()]->start;
+  const intptr_t loop_end = extra_loop_info_[loop_info->id()]->end;
 
   for (intptr_t i = 0; i < registers_[reg]->length(); i++) {
     LiveRange* allocated = (*registers_[reg])[i];
-
     UseInterval* interval = allocated->finger()->first_pending_use_interval();
     if (interval->Contains(loop_start)) {
       if (!RangeHasOnlyUnconstrainedUsesInLoop(allocated, loop_info->id())) {
@@ -2294,7 +2350,7 @@
 
   for (intptr_t reg = 0; reg < NumberOfRegisters(); ++reg) {
     if (blocked_registers_[reg]) continue;
-    if (IsCheapToEvictRegisterInLoop(header, reg)) {
+    if (IsCheapToEvictRegisterInLoop(header->loop_info(), reg)) {
       return true;
     }
   }
diff --git a/runtime/vm/compiler/backend/linearscan.h b/runtime/vm/compiler/backend/linearscan.h
index 1dacc5f..7c1a93e 100644
--- a/runtime/vm/compiler/backend/linearscan.h
+++ b/runtime/vm/compiler/backend/linearscan.h
@@ -46,6 +46,9 @@
   GraphEntryInstr* graph_entry_;
 };
 
+// Forward.
+struct ExtraLoopInfo;
+
 class FlowGraphAllocator : public ValueObject {
  public:
   // Number of stack slots needed for a fpu register spill slot.
@@ -191,7 +194,7 @@
   // performance because it introduces multiple operations with memory
   // inside the loop body and on the back edge.
   bool HasCheapEvictionCandidate(LiveRange* phi_range);
-  bool IsCheapToEvictRegisterInLoop(BlockEntryInstr* block, intptr_t reg);
+  bool IsCheapToEvictRegisterInLoop(LoopInfo* loop_info, intptr_t reg);
 
   // Assign selected non-free register to an unallocated live range and
   // evict any interference that can be evicted by splitting and spilling
@@ -256,8 +259,8 @@
   // Mapping between lifetime positions and block entries.
   GrowableArray<BlockEntryInstr*> block_entries_;
 
-  // Mapping between loops and backedge interferences.
-  GrowableArray<BitVector*> backedge_interference_;
+  // Mapping between loops and additional information.
+  GrowableArray<ExtraLoopInfo*> extra_loop_info_;
 
   SSALivenessAnalysis liveness_;
 
diff --git a/runtime/vm/compiler/backend/loops.cc b/runtime/vm/compiler/backend/loops.cc
index 42e656e..f0e8a5b 100644
--- a/runtime/vm/compiler/backend/loops.cc
+++ b/runtime/vm/compiler/backend/loops.cc
@@ -11,11 +11,769 @@
 
 namespace dart {
 
+// Private class to perform induction variable analysis on a single loop
+// or a full loop hierarchy. The analysis implementation is based on the
+// paper by M. Gerlek et al. "Beyond Induction Variables: Detecting and
+// Classifying Sequences Using a Demand-Driven SSA Form" (ACM Transactions
+// on Programming Languages and Systems, Volume 17 Issue 1, Jan. 1995).
+//
+// The algorithm discovers and classifies definitions within loops that
+// behave like induction variables, and attaches an InductionVar record
+// to it (this mapping is stored in the loop data structure). The algorithm
+// first finds strongly connected components in the flow graph and classifies
+// each component as an induction when possible. Due to the descendant-first
+// nature, classification happens "on-demand" (e.g. basic induction is
+// classified before derived induction).
+class InductionVarAnalysis : public ValueObject {
+ public:
+  // Constructor to set up analysis phase.
+  explicit InductionVarAnalysis(const GrowableArray<BlockEntryInstr*>& preorder)
+      : preorder_(preorder),
+        stack_(),
+        scc_(),
+        cycle_(),
+        map_(),
+        current_index_(0),
+        zone_(Thread::Current()->zone()) {}
+
+  // Detects induction variables on the full loop hierarchy.
+  void VisitHierarchy(LoopInfo* loop);
+
+  // Detects induction variables on a single loop.
+  void VisitLoop(LoopInfo* loop);
+
+ private:
+  // An information node needed during SCC traversal that can
+  // reside in a map without any explicit memory allocation.
+  struct SCCInfo {
+    SCCInfo() : depth(-1), done(false) {}
+    explicit SCCInfo(intptr_t d) : depth(d), done(false) {}
+    intptr_t depth;
+    bool done;
+    bool operator!=(const SCCInfo& other) const {
+      return depth != other.depth || done != other.done;
+    }
+    bool operator==(const SCCInfo& other) const {
+      return depth == other.depth && done == other.done;
+    }
+  };
+  typedef RawPointerKeyValueTrait<Definition, SCCInfo> VisitKV;
+
+  // Traversal methods.
+  bool Visit(LoopInfo* loop, Definition* def);
+  intptr_t VisitDescendant(LoopInfo* loop, Definition* def);
+  void Classify(LoopInfo* loop, Definition* def);
+  void ClassifySCC(LoopInfo* loop);
+  void ClassifyControl(LoopInfo* loop);
+
+  // Transfer methods. Compute how induction of the operands, if any,
+  // tranfers over the operation performed by the given definition.
+  InductionVar* TransferPhi(LoopInfo* loop, Definition* def, intptr_t idx = -1);
+  InductionVar* TransferBinary(LoopInfo* loop, Definition* def);
+  InductionVar* TransferUnary(LoopInfo* loop, Definition* def);
+
+  // Solver methods. Compute how temporary meaning given to the
+  // definitions in a cycle transfer over the operation performed
+  // by the given definition.
+  InductionVar* SolvePhi(LoopInfo* loop, Definition* def, intptr_t idx = -1);
+  InductionVar* SolveConstraint(LoopInfo* loop,
+                                Definition* def,
+                                InductionVar* init);
+  InductionVar* SolveBinary(LoopInfo* loop,
+                            Definition* def,
+                            InductionVar* init);
+  InductionVar* SolveUnary(LoopInfo* loop, Definition* def, InductionVar* init);
+
+  // Lookup.
+  InductionVar* Lookup(LoopInfo* loop, Definition* def);
+  InductionVar* LookupCycle(Definition* def);
+
+  // Arithmetic.
+  InductionVar* Add(InductionVar* x, InductionVar* y);
+  InductionVar* Sub(InductionVar* x, InductionVar* y);
+  InductionVar* Mul(InductionVar* x, InductionVar* y);
+
+  // Bookkeeping data (released when analysis goes out of scope).
+  const GrowableArray<BlockEntryInstr*>& preorder_;
+  GrowableArray<Definition*> stack_;
+  GrowableArray<Definition*> scc_;
+  GrowableArray<BranchInstr*> branches_;
+  DirectChainedHashMap<LoopInfo::InductionKV> cycle_;
+  DirectChainedHashMap<VisitKV> map_;
+  intptr_t current_index_;
+  Zone* zone_;
+
+  DISALLOW_COPY_AND_ASSIGN(InductionVarAnalysis);
+};
+
+// Helper method that finds phi-index of the initial value
+// that comes from a block outside the loop. Note that the
+// algorithm still works if there are several of these.
+static intptr_t InitIndex(LoopInfo* loop) {
+  BlockEntryInstr* header = loop->header();
+  for (intptr_t i = 0; i < header->PredecessorCount(); ++i) {
+    if (!loop->Contains(header->PredecessorAt(i))) {  // pick first
+      return i;
+    }
+  }
+  UNREACHABLE();
+  return -1;
+}
+
+// Helper method that determines if a definition is a constant.
+static bool IsConstant(Definition* def, int64_t* val) {
+  if (def->IsConstant()) {
+    const Object& value = def->AsConstant()->value();
+    if (value.IsInteger()) {
+      *val = Integer::Cast(value).AsInt64Value();  // smi and mint
+      return true;
+    }
+  }
+  return false;
+}
+
+// Helper method to trace back to original true definition, now
+// also ignoring constraints and (un)boxing operations, since
+// these are not relevant to the induction behavior.
+static Definition* OriginalDefinition(Definition* def) {
+  while (true) {
+    Definition* orig;
+    if (def->IsConstraint() || def->IsBox() || def->IsUnbox()) {
+      orig = def->InputAt(0)->definition();
+    } else {
+      orig = def->OriginalDefinition();
+    }
+    if (orig == def) return def;
+    def = orig;
+  }
+}
+
+void InductionVarAnalysis::VisitHierarchy(LoopInfo* loop) {
+  for (; loop != nullptr; loop = loop->next_) {
+    VisitLoop(loop);
+    VisitHierarchy(loop->inner_);
+  }
+}
+
+void InductionVarAnalysis::VisitLoop(LoopInfo* loop) {
+  loop->ResetInduction();
+  // Find strongly connected components (SSCs) in the SSA graph of this
+  // loop using Tarjan's algorithm. Due to the descendant-first nature,
+  // classification happens "on-demand".
+  current_index_ = 0;
+  ASSERT(stack_.is_empty());
+  ASSERT(map_.IsEmpty());
+  ASSERT(branches_.is_empty());
+  for (BitVector::Iterator it(loop->blocks_); !it.Done(); it.Advance()) {
+    BlockEntryInstr* block = preorder_[it.Current()];
+    ASSERT(block->loop_info() != nullptr);
+    if (block->loop_info() != loop) {
+      continue;  // inner loop
+    }
+    // Visit phi-operations.
+    if (block->IsJoinEntry()) {
+      for (PhiIterator it(block->AsJoinEntry()); !it.Done(); it.Advance()) {
+        Visit(loop, it.Current());
+      }
+    }
+    // Visit instructions and collect branches.
+    for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
+      Instruction* instruction = it.Current();
+      Visit(loop, instruction->AsDefinition());
+      if (instruction->IsBranch()) {
+        branches_.Add(instruction->AsBranch());
+      }
+    }
+  }
+  ASSERT(stack_.is_empty());
+  map_.Clear();
+  // Classify loop control.
+  ClassifyControl(loop);
+  branches_.Clear();
+}
+
+bool InductionVarAnalysis::Visit(LoopInfo* loop, Definition* def) {
+  if (def == nullptr || map_.HasKey(def)) {
+    return false;  // no def, or already visited
+  }
+  intptr_t d = ++current_index_;
+  map_.Insert(VisitKV::Pair(def, SCCInfo(d)));
+  stack_.Add(def);
+
+  // Visit all descendants.
+  intptr_t low = d;
+  for (intptr_t i = 0, n = def->InputCount(); i < n; i++) {
+    Value* input = def->InputAt(i);
+    if (input != nullptr) {
+      low = Utils::Minimum(low, VisitDescendant(loop, input->definition()));
+    }
+  }
+
+  // Lower or found SCC?
+  if (low < d) {
+    map_.Lookup(def)->value.depth = low;
+  } else {
+    // Pop the stack to build the SCC for classification.
+    ASSERT(scc_.is_empty());
+    while (!stack_.is_empty()) {
+      Definition* top = stack_.RemoveLast();
+      scc_.Add(top);
+      map_.Lookup(top)->value.done = true;
+      if (top == def) {
+        break;
+      }
+    }
+    // Classify.
+    if (scc_.length() == 1) {
+      Classify(loop, scc_[0]);
+    } else {
+      ASSERT(scc_.length() > 1);
+      ASSERT(cycle_.IsEmpty());
+      ClassifySCC(loop);
+      cycle_.Clear();
+    }
+    scc_.Clear();
+  }
+  return true;
+}
+
+intptr_t InductionVarAnalysis::VisitDescendant(LoopInfo* loop,
+                                               Definition* def) {
+  // The traversal stops at anything not defined in this loop
+  // (either a loop invariant entry value defined outside the
+  // loop or an inner exit value defined by an inner loop).
+  if (def->GetBlock()->loop_info() != loop) {
+    return current_index_;
+  }
+  // Inspect descendant node.
+  if (!Visit(loop, def) && map_.Lookup(def)->value.done) {
+    return current_index_;
+  }
+  return map_.Lookup(def)->value.depth;
+}
+
+void InductionVarAnalysis::Classify(LoopInfo* loop, Definition* def) {
+  // Classify different kind of instructions.
+  InductionVar* induc = nullptr;
+  if (loop->IsHeaderPhi(def)) {
+    intptr_t idx = InitIndex(loop);
+    induc = TransferPhi(loop, def, idx);
+    if (induc != nullptr) {
+      InductionVar* init = Lookup(loop, def->InputAt(idx)->definition());
+      // Wrap-around (except for unusual header phi(x,..,x) = x).
+      if (!init->IsEqual(induc)) {
+        induc =
+            new (zone_) InductionVar(InductionVar::kWrapAround, init, induc);
+      }
+    }
+  } else if (def->IsPhi()) {
+    induc = TransferPhi(loop, def);
+  } else if (def->IsBinaryIntegerOp()) {
+    induc = TransferBinary(loop, def);
+  } else if (def->IsUnaryIntegerOp()) {
+    induc = TransferUnary(loop, def);
+  } else {
+    Definition* orig = OriginalDefinition(def);
+    if (orig != def) {
+      induc = Lookup(loop, orig);  // pass-through
+    }
+  }
+  // Successfully classified?
+  if (induc != nullptr) {
+    loop->AddInduction(def, induc);
+  }
+}
+
+void InductionVarAnalysis::ClassifySCC(LoopInfo* loop) {
+  intptr_t size = scc_.length();
+  // Find a header phi, usually at the end.
+  intptr_t p = -1;
+  for (intptr_t i = size - 1; i >= 0; i--) {
+    if (loop->IsHeaderPhi(scc_[i])) {
+      p = i;
+      break;
+    }
+  }
+  // Rotate header phi up front.
+  if (p >= 0) {
+    Definition* phi = scc_[p];
+    intptr_t idx = InitIndex(loop);
+    InductionVar* init = Lookup(loop, phi->InputAt(idx)->definition());
+    // Inspect remainder of the cycle. The cycle mapping assigns temporary
+    // meaning to instructions, seeded from the phi instruction and back.
+    // The init of the phi is passed as marker token to detect first use.
+    cycle_.Insert(LoopInfo::InductionKV::Pair(phi, init));
+    for (intptr_t i = 1, j = p; i < size; i++) {
+      if (++j >= size) j = 0;
+      Definition* def = scc_[j];
+      InductionVar* update = nullptr;
+      if (def->IsPhi()) {
+        update = SolvePhi(loop, def);
+      } else if (def->IsBinaryIntegerOp()) {
+        update = SolveBinary(loop, def, init);
+      } else if (def->IsUnaryIntegerOp()) {
+        update = SolveUnary(loop, def, init);
+      } else if (def->IsConstraint()) {
+        update = SolveConstraint(loop, def, init);
+      } else {
+        Definition* orig = OriginalDefinition(def);
+        if (orig != def) {
+          update = LookupCycle(orig);  // pass-through
+        }
+      }
+      // Continue cycle?
+      if (update == nullptr) {
+        return;
+      }
+      cycle_.Insert(LoopInfo::InductionKV::Pair(def, update));
+    }
+    // Success if all internal links (inputs to the phi that are along
+    // back-edges) received the same temporary meaning. The external
+    // link (initial value coming from outside the loop) is excluded
+    // while taking this join.
+    InductionVar* induc = SolvePhi(loop, phi, idx);
+    if (induc != nullptr) {
+      // Invariant means linear induction.
+      if (induc->kind_ == InductionVar::kInvariant) {
+        induc = new (zone_) InductionVar(InductionVar::kLinear, init, induc);
+      } else {
+        ASSERT(induc->kind_ == InductionVar::kPeriodic);
+      }
+      // Classify first phi and then the rest of the cycle "on-demand".
+      loop->AddInduction(phi, induc);
+      for (intptr_t i = 1, j = p; i < size; i++) {
+        if (++j >= size) j = 0;
+        Classify(loop, scc_[j]);
+      }
+    }
+  }
+}
+
+void InductionVarAnalysis::ClassifyControl(LoopInfo* loop) {
+  for (auto branch : branches_) {
+    // Proper comparison?
+    ComparisonInstr* compare = branch->comparison();
+    if (compare->InputCount() != 2) {
+      continue;
+    }
+    Token::Kind cmp = compare->kind();
+    // Proper loop exit? Express the condition in "loop while true" form.
+    TargetEntryInstr* ift = branch->true_successor();
+    TargetEntryInstr* iff = branch->false_successor();
+    if (loop->Contains(ift) && !loop->Contains(iff)) {
+      // ok as is
+    } else if (!loop->Contains(ift) && loop->Contains(iff)) {
+      cmp = Token::NegateComparison(cmp);
+    } else {
+      continue;
+    }
+    // Comparison against linear constant stride induction?
+    // Express the comparison such that induction appears left.
+    int64_t stride = 0;
+    InductionVar* x =
+        Lookup(loop, OriginalDefinition(compare->left()->definition()));
+    InductionVar* y =
+        Lookup(loop, OriginalDefinition(compare->right()->definition()));
+    if (InductionVar::IsLinear(x, &stride) && InductionVar::IsInvariant(y)) {
+      // ok as is
+    } else if (InductionVar::IsInvariant(x) &&
+               InductionVar::IsLinear(y, &stride)) {
+      InductionVar* tmp = x;
+      x = y;
+      y = tmp;
+      cmp = Token::FlipComparison(cmp);
+    } else {
+      continue;
+    }
+    // Safe, strict comparison for looping condition? Note that
+    // we reject symbolic bounds in non-strict looping conditions
+    // like i <= U as upperbound or i >= L as lowerbound since this
+    // could loop forever when U is kMaxInt64 or L is kMinInt64 under
+    // Dart's 64-bit wrap-around arithmetic. Non-unit strides could
+    // overshoot the bound with a wrap-around.
+    //
+    // TODO(ajcbik): accept more conditions when safe
+    //
+    switch (cmp) {
+      case Token::kLT:
+        // Accept i < U (i++).
+        if (stride == 1) break;
+        continue;
+      case Token::kGT:
+        // Accept i > L (i--).
+        if (stride == -1) break;
+        continue;
+      case Token::kLTE: {
+        // Accept i <= C (i++) as i < C + 1.
+        int64_t end = 0;
+        if (stride == 1 && InductionVar::IsConstant(y, &end) &&
+            end < kMaxInt64) {
+          y = new (zone_) InductionVar(end + 1);
+          break;
+        }
+        continue;
+      }
+      case Token::kGTE: {
+        // Accept i >= C (i--) as i > C - 1.
+        int64_t end = 0;
+        if (stride == -1 && InductionVar::IsConstant(y, &end) &&
+            kMinInt64 < end) {
+          y = new (zone_) InductionVar(end - 1);
+          break;
+        }
+        continue;
+      }
+      case Token::kNE: {
+        // Accept i != E as either i < E (i++) or i > E (i--)
+        // for constants bounds that make the loop always-taken.
+        int64_t start = 0;
+        int64_t end = 0;
+        if (InductionVar::IsConstant(x->initial_, &start) &&
+            InductionVar::IsConstant(y, &end)) {
+          if ((stride == +1 && start < end) || (stride == -1 && start > end)) {
+            break;
+          }
+        }
+        continue;
+      }
+      default:
+        continue;
+    }
+    // We found a safe limit on the induction variable. Note that depending
+    // on the intended use of this information, clients should still test
+    // dominance on the test and the initial value of the induction variable.
+    x->bounds_.Add(InductionVar::Bound(branch, y));
+  }
+}
+
+InductionVar* InductionVarAnalysis::TransferPhi(LoopInfo* loop,
+                                                Definition* def,
+                                                intptr_t idx) {
+  InductionVar* induc = nullptr;
+  for (intptr_t i = 0, n = def->InputCount(); i < n; i++) {
+    if (i != idx) {
+      InductionVar* x = Lookup(loop, def->InputAt(i)->definition());
+      if (x == nullptr) {
+        return nullptr;
+      } else if (induc == nullptr) {
+        induc = x;
+      } else if (!induc->IsEqual(x)) {
+        return nullptr;
+      }
+    }
+  }
+  return induc;
+}
+
+InductionVar* InductionVarAnalysis::TransferBinary(LoopInfo* loop,
+                                                   Definition* def) {
+  InductionVar* x = Lookup(loop, def->InputAt(0)->definition());
+  InductionVar* y = Lookup(loop, def->InputAt(1)->definition());
+
+  switch (def->AsBinaryIntegerOp()->op_kind()) {
+    case Token::kADD:
+      return Add(x, y);
+    case Token::kSUB:
+      return Sub(x, y);
+    case Token::kMUL:
+      return Mul(x, y);
+    default:
+      return nullptr;
+  }
+}
+
+InductionVar* InductionVarAnalysis::TransferUnary(LoopInfo* loop,
+                                                  Definition* def) {
+  InductionVar* x = Lookup(loop, def->InputAt(0)->definition());
+  switch (def->AsUnaryIntegerOp()->op_kind()) {
+    case Token::kNEGATE: {
+      InductionVar* zero = new (zone_) InductionVar(0);
+      return Sub(zero, x);
+    }
+    default:
+      return nullptr;
+  }
+}
+
+InductionVar* InductionVarAnalysis::SolvePhi(LoopInfo* loop,
+                                             Definition* def,
+                                             intptr_t idx) {
+  InductionVar* induc = nullptr;
+  for (intptr_t i = 0, n = def->InputCount(); i < n; i++) {
+    if (i != idx) {
+      InductionVar* c = LookupCycle(def->InputAt(i)->definition());
+      if (c == nullptr) {
+        return nullptr;
+      } else if (induc == nullptr) {
+        induc = c;
+      } else if (!induc->IsEqual(c)) {
+        return nullptr;
+      }
+    }
+  }
+  return induc;
+}
+
+InductionVar* InductionVarAnalysis::SolveConstraint(LoopInfo* loop,
+                                                    Definition* def,
+                                                    InductionVar* init) {
+  InductionVar* c = LookupCycle(def->InputAt(0)->definition());
+  if (c == init) {
+    // Record a non-artifical bound constraint on a phi.
+    ConstraintInstr* constraint = def->AsConstraint();
+    if (constraint->target() != nullptr) {
+      loop->limit_ = constraint;
+    }
+  }
+  return c;
+}
+
+InductionVar* InductionVarAnalysis::SolveBinary(LoopInfo* loop,
+                                                Definition* def,
+                                                InductionVar* init) {
+  InductionVar* x = Lookup(loop, def->InputAt(0)->definition());
+  InductionVar* y = Lookup(loop, def->InputAt(1)->definition());
+  switch (def->AsBinaryIntegerOp()->op_kind()) {
+    case Token::kADD:
+      if (InductionVar::IsInvariant(x)) {
+        InductionVar* c = LookupCycle(def->InputAt(1)->definition());
+        // The init marker denotes first use, otherwise aggregate.
+        if (c == init) {
+          return x;
+        } else if (InductionVar::IsInvariant(c)) {
+          return Add(x, c);
+        }
+      }
+      if (InductionVar::IsInvariant(y)) {
+        InductionVar* c = LookupCycle(def->InputAt(0)->definition());
+        // The init marker denotes first use, otherwise aggregate.
+        if (c == init) {
+          return y;
+        } else if (InductionVar::IsInvariant(c)) {
+          return Add(c, y);
+        }
+      }
+      return nullptr;
+    case Token::kSUB:
+      if (InductionVar::IsInvariant(x)) {
+        InductionVar* c = LookupCycle(def->InputAt(1)->definition());
+        // Note that i = x - i is periodic. The temporary
+        // meaning is expressed in terms of the header phi.
+        if (c == init) {
+          InductionVar* next = Sub(x, init);
+          if (InductionVar::IsInvariant(next)) {
+            return new (zone_)
+                InductionVar(InductionVar::kPeriodic, init, next);
+          }
+        }
+      }
+      if (InductionVar::IsInvariant(y)) {
+        InductionVar* c = LookupCycle(def->InputAt(0)->definition());
+        // The init marker denotes first use, otherwise aggregate.
+        if (c == init) {
+          InductionVar* zero = new (zone_) InductionVar(0);
+          return Sub(zero, y);
+        } else if (InductionVar::IsInvariant(c)) {
+          return Sub(c, y);
+        }
+      }
+      return nullptr;
+    default:
+      return nullptr;
+  }
+}
+
+InductionVar* InductionVarAnalysis::SolveUnary(LoopInfo* loop,
+                                               Definition* def,
+                                               InductionVar* init) {
+  InductionVar* c = LookupCycle(def->InputAt(0)->definition());
+  switch (def->AsUnaryIntegerOp()->op_kind()) {
+    case Token::kNEGATE:
+      // Note that i = - i is periodic. The temporary
+      // meaning is expressed in terms of the header phi.
+      if (c == init) {
+        InductionVar* zero = new (zone_) InductionVar(0);
+        InductionVar* next = Sub(zero, init);
+        if (InductionVar::IsInvariant(next)) {
+          return new (zone_) InductionVar(InductionVar::kPeriodic, init, next);
+        }
+      }
+      return nullptr;
+    default:
+      return nullptr;
+  }
+}
+
+InductionVar* InductionVarAnalysis::Lookup(LoopInfo* loop, Definition* def) {
+  InductionVar* induc = loop->LookupInduction(def);
+  if (induc == nullptr) {
+    // Loop-invariants are added lazily.
+    int64_t val = 0;
+    if (IsConstant(def, &val)) {
+      induc = new (zone_) InductionVar(val);
+      loop->AddInduction(def, induc);
+    } else if (!loop->Contains(def->GetBlock())) {
+      induc = new (zone_) InductionVar(0, 1, def);
+      loop->AddInduction(def, induc);
+    }
+  }
+  return induc;
+}
+
+InductionVar* InductionVarAnalysis::LookupCycle(Definition* def) {
+  LoopInfo::InductionKV::Pair* pair = cycle_.Lookup(def);
+  if (pair != nullptr) {
+    return pair->value;
+  }
+  return nullptr;
+}
+
+InductionVar* InductionVarAnalysis::Add(InductionVar* x, InductionVar* y) {
+  if (InductionVar::IsInvariant(x)) {
+    if (InductionVar::IsInvariant(y)) {
+      // Invariant + Invariant : only for same or just one instruction.
+      if (x->def_ == y->def_) {
+        return new (zone_)
+            InductionVar(x->offset_ + y->offset_, x->mult_ + y->mult_, x->def_);
+      } else if (y->mult_ == 0) {
+        return new (zone_)
+            InductionVar(x->offset_ + y->offset_, x->mult_, x->def_);
+      } else if (x->mult_ == 0) {
+        return new (zone_)
+            InductionVar(x->offset_ + y->offset_, y->mult_, y->def_);
+      }
+    } else if (y != nullptr) {
+      // Invariant + Induction.
+      InductionVar* i = Add(x, y->initial_);
+      InductionVar* n =
+          y->kind_ == InductionVar::kLinear ? y->next_ : Add(x, y->next_);
+      if (i != nullptr && n != nullptr) {
+        return new (zone_) InductionVar(y->kind_, i, n);
+      }
+    }
+  } else if (InductionVar::IsInvariant(y)) {
+    if (x != nullptr) {
+      // Induction + Invariant.
+      ASSERT(!InductionVar::IsInvariant(x));
+      InductionVar* i = Add(x->initial_, y);
+      InductionVar* n =
+          x->kind_ == InductionVar::kLinear ? x->next_ : Add(x->next_, y);
+      if (i != nullptr && n != nullptr) {
+        return new (zone_) InductionVar(x->kind_, i, n);
+      }
+    }
+  } else if (InductionVar::IsLinear(x) && InductionVar::IsLinear(y)) {
+    // Linear + Linear.
+    InductionVar* i = Add(x->initial_, y->initial_);
+    InductionVar* n = Add(x->next_, y->next_);
+    if (i != nullptr && n != nullptr) {
+      return new (zone_) InductionVar(InductionVar::kLinear, i, n);
+    }
+  }
+  return nullptr;
+}
+
+InductionVar* InductionVarAnalysis::Sub(InductionVar* x, InductionVar* y) {
+  if (InductionVar::IsInvariant(x)) {
+    if (InductionVar::IsInvariant(y)) {
+      // Invariant + Invariant : only for same or just one instruction.
+      if (x->def_ == y->def_) {
+        return new (zone_)
+            InductionVar(x->offset_ - y->offset_, x->mult_ - y->mult_, x->def_);
+      } else if (y->mult_ == 0) {
+        return new (zone_)
+            InductionVar(x->offset_ - y->offset_, x->mult_, x->def_);
+      } else if (x->mult_ == 0) {
+        return new (zone_)
+            InductionVar(x->offset_ - y->offset_, -y->mult_, y->def_);
+      }
+    } else if (y != nullptr) {
+      // Invariant - Induction.
+      InductionVar* i = Sub(x, y->initial_);
+      InductionVar* n;
+      if (y->kind_ == InductionVar::kLinear) {
+        InductionVar* zero = new (zone_) InductionVar(0, 0, nullptr);
+        n = Sub(zero, y->next_);
+      } else {
+        n = Sub(x, y->next_);
+      }
+      if (i != nullptr && n != nullptr) {
+        return new (zone_) InductionVar(y->kind_, i, n);
+      }
+    }
+  } else if (InductionVar::IsInvariant(y)) {
+    if (x != nullptr) {
+      // Induction - Invariant.
+      ASSERT(!InductionVar::IsInvariant(x));
+      InductionVar* i = Sub(x->initial_, y);
+      InductionVar* n =
+          x->kind_ == InductionVar::kLinear ? x->next_ : Sub(x->next_, y);
+      if (i != nullptr && n != nullptr) {
+        return new (zone_) InductionVar(x->kind_, i, n);
+      }
+    }
+  } else if (InductionVar::IsLinear(x) && InductionVar::IsLinear(y)) {
+    // Linear - Linear.
+    InductionVar* i = Sub(x->initial_, y->initial_);
+    InductionVar* n = Sub(x->next_, y->next_);
+    if (i != nullptr && n != nullptr) {
+      return new (zone_) InductionVar(InductionVar::kLinear, i, n);
+    }
+  }
+  return nullptr;
+}
+
+InductionVar* InductionVarAnalysis::Mul(InductionVar* x, InductionVar* y) {
+  // Swap constant left.
+  if (!InductionVar::IsConstant(x)) {
+    InductionVar* tmp = x;
+    x = y;
+    y = tmp;
+  }
+  // Apply constant to any induction.
+  if (InductionVar::IsConstant(x) && y != nullptr) {
+    if (y->kind_ == InductionVar::kInvariant) {
+      return new (zone_)
+          InductionVar(x->offset_ * y->offset_, x->offset_ * y->mult_, y->def_);
+    }
+    return new (zone_)
+        InductionVar(y->kind_, Mul(x, y->initial_), Mul(x, y->next_));
+  }
+  return nullptr;
+}
+
+const char* InductionVar::ToCString() const {
+  char buffer[1024];
+  BufferFormatter f(buffer, sizeof(buffer));
+  switch (kind_) {
+    case kInvariant:
+      if (mult_ != 0) {
+        f.Print("(%" Pd64 " + %" Pd64 " x %.4s)", offset_, mult_,
+                def_->ToCString());
+      } else {
+        f.Print("%" Pd64, offset_);
+      }
+      break;
+    case kLinear:
+      f.Print("LIN(%s + %s * i)", initial_->ToCString(), next_->ToCString());
+      break;
+    case kWrapAround:
+      f.Print("WRAP(%s, %s)", initial_->ToCString(), next_->ToCString());
+      break;
+    case kPeriodic:
+      f.Print("PERIOD(%s, %s)", initial_->ToCString(), next_->ToCString());
+      break;
+  }
+  return Thread::Current()->zone()->MakeCopyOfString(buffer);
+}
+
 LoopInfo::LoopInfo(intptr_t id, BlockEntryInstr* header, BitVector* blocks)
     : id_(id),
       header_(header),
       blocks_(blocks),
       back_edges_(),
+      induction_(),
+      limit_(nullptr),
       outer_(nullptr),
       inner_(nullptr),
       next_(nullptr) {}
@@ -37,13 +795,22 @@
   return false;
 }
 
-bool LoopInfo::IsIn(LoopInfo* other) const {
-  if (other != nullptr) {
-    return other->blocks_->Contains(header_->preorder_number());
+bool LoopInfo::IsHeaderPhi(Definition* def) const {
+  return def != nullptr && def->IsPhi() && def->GetBlock() == header_ &&
+         !def->AsPhi()->IsRedundant();  // phi(x,..,x) = x
+}
+
+bool LoopInfo::IsIn(LoopInfo* loop) const {
+  if (loop != nullptr) {
+    return loop->Contains(header_);
   }
   return false;
 }
 
+bool LoopInfo::Contains(BlockEntryInstr* block) const {
+  return blocks_->Contains(block->preorder_number());
+}
+
 intptr_t LoopInfo::NestingDepth() const {
   intptr_t nesting_depth = 1;
   for (LoopInfo* o = outer_; o != nullptr; o = o->outer()) {
@@ -52,6 +819,24 @@
   return nesting_depth;
 }
 
+void LoopInfo::ResetInduction() {
+  induction_.Clear();
+}
+
+void LoopInfo::AddInduction(Definition* def, InductionVar* induc) {
+  ASSERT(def != nullptr);
+  ASSERT(induc != nullptr);
+  induction_.Insert(InductionKV::Pair(def, induc));
+}
+
+InductionVar* LoopInfo::LookupInduction(Definition* def) const {
+  InductionKV::Pair* pair = induction_.Lookup(def);
+  if (pair != nullptr) {
+    return pair->value;
+  }
+  return nullptr;
+}
+
 const char* LoopInfo::ToCString() const {
   char buffer[1024];
   BufferFormatter f(buffer, sizeof(buffer));
@@ -83,7 +868,7 @@
   // Link every entry block to the closest enveloping loop.
   for (intptr_t i = 0, n = headers_->length(); i < n; ++i) {
     LoopInfo* loop = (*headers_)[i]->loop_info();
-    for (BitVector::Iterator it(loop->blocks()); !it.Done(); it.Advance()) {
+    for (BitVector::Iterator it(loop->blocks_); !it.Done(); it.Advance()) {
       BlockEntryInstr* block = preorder_[it.Current()];
       if (block->loop_info() == nullptr) {
         block->set_loop_info(loop);
@@ -110,14 +895,14 @@
   }
   // If tracing is requested, print the loop hierarchy.
   if (FLAG_trace_optimization) {
-    Print(top());
+    Print(top_);
   }
 }
 
 void LoopHierarchy::Print(LoopInfo* loop) {
   for (; loop != nullptr; loop = loop->next_) {
     THR_Print("%s {", loop->ToCString());
-    for (BitVector::Iterator it(loop->blocks()); !it.Done(); it.Advance()) {
+    for (BitVector::Iterator it(loop->blocks_); !it.Done(); it.Advance()) {
       THR_Print(" B%" Pd, preorder_[it.Current()]->block_id());
     }
     THR_Print(" }\n");
@@ -125,6 +910,10 @@
   }
 }
 
+void LoopHierarchy::ComputeInduction() const {
+  InductionVarAnalysis(preorder_).VisitHierarchy(top_);
+}
+
 }  // namespace dart
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/backend/loops.h b/runtime/vm/compiler/backend/loops.h
index 555f69f..2bd3b31 100644
--- a/runtime/vm/compiler/backend/loops.h
+++ b/runtime/vm/compiler/backend/loops.h
@@ -10,6 +10,175 @@
 
 namespace dart {
 
+// Information on an induction variable in a particular loop.
+//
+// Invariant:
+//     offset + mult * def
+// Linear:
+//     initial + next * i, for invariant initial and next,
+//                       and a "normalized" loop index i
+// Wrap-around:
+//     initial then next, for invariant initial and any next
+// Periodic:
+//     alternate initial and next, for invariant initial and next
+//
+class InductionVar : public ZoneAllocated {
+ public:
+  enum Kind {
+    kInvariant,
+    kLinear,
+    kWrapAround,
+    kPeriodic,
+  };
+
+  // Strict bound on unit stride linear induction:
+  //   i < U (i++)
+  //   i > L (i--)
+  struct Bound {
+    Bound(BranchInstr* b, InductionVar* l) : branch_(b), limit_(l) {}
+    BranchInstr* branch_;
+    InductionVar* limit_;
+  };
+
+  // Constructor for an invariant.
+  InductionVar(int64_t offset, int64_t mult, Definition* def)
+      : kind_(kInvariant), offset_(offset), mult_(mult), def_(def) {}
+
+  // Constructor for a constant.
+  explicit InductionVar(int64_t offset) : InductionVar(offset, 0, nullptr) {}
+
+  // Constructor for an induction.
+  InductionVar(Kind kind, InductionVar* initial, InductionVar* next)
+      : kind_(kind), initial_(initial), next_(next) {
+    ASSERT(IsInvariant(initial));
+    switch (kind) {
+      case kLinear:
+      case kPeriodic:
+        ASSERT(IsInvariant(next));
+        break;
+      case kWrapAround:
+        ASSERT(next != nullptr);
+        break;
+      default:
+        UNREACHABLE();
+    }
+  }
+
+  // Returns true if the other induction is structually equivalent.
+  bool IsEqual(InductionVar* other) const {
+    ASSERT(other != nullptr);
+    if (kind_ == other->kind_) {
+      switch (kind_) {
+        case kInvariant:
+          return offset_ == other->offset_ && mult_ == other->mult_ &&
+                 (mult_ == 0 || def_ == other->def_);
+        case kLinear:
+        case kWrapAround:
+        case kPeriodic:
+          return initial_->IsEqual(other->initial_) &&
+                 next_->IsEqual(other->next_);
+      }
+    }
+    return false;
+  }
+
+  // Getters.
+  Kind kind() const { return kind_; }
+  int64_t offset() const {
+    ASSERT(kind_ == kInvariant);
+    return offset_;
+  }
+  int64_t mult() const {
+    ASSERT(kind_ == kInvariant);
+    return mult_;
+  }
+  Definition* def() const {
+    ASSERT(kind_ == kInvariant);
+    return def_;
+  }
+  InductionVar* initial() const {
+    ASSERT(kind_ != kInvariant);
+    return initial_;
+  }
+  InductionVar* next() const {
+    ASSERT(kind_ != kInvariant);
+    return next_;
+  }
+  const GrowableArray<Bound>& bounds() { return bounds_; }
+
+  // For debugging.
+  const char* ToCString() const;
+
+  // Returns true if x is invariant.
+  static bool IsInvariant(InductionVar* x) {
+    return x != nullptr && x->kind_ == kInvariant;
+  }
+
+  // Returns true if x is a constant (and invariant).
+  static bool IsConstant(InductionVar* x) {
+    return x != nullptr && x->kind_ == kInvariant && x->mult_ == 0;
+  }
+
+  // Returns true if x is a constant. Sets the value.
+  static bool IsConstant(InductionVar* x, int64_t* c) {
+    if (IsConstant(x)) {
+      *c = x->offset_;
+      return true;
+    }
+    return false;
+  }
+
+  // Returns true if x is linear.
+  static bool IsLinear(InductionVar* x) {
+    return x != nullptr && x->kind_ == kLinear;
+  }
+
+  // Returns true if x is linear with constant stride. Sets the stride.
+  static bool IsLinear(InductionVar* x, int64_t* s) {
+    if (IsLinear(x)) {
+      return IsConstant(x->next_, s);
+    }
+    return false;
+  }
+
+  // Returns true if x is wrap-around.
+  static bool IsWrapAround(InductionVar* x) {
+    return x != nullptr && x->kind_ == kWrapAround;
+  }
+
+  // Returns true if x is periodic.
+  static bool IsPeriodic(InductionVar* x) {
+    return x != nullptr && x->kind_ == kPeriodic;
+  }
+
+  // Returns true if x is any induction.
+  static bool IsInduction(InductionVar* x) {
+    return x != nullptr && x->kind_ != kInvariant;
+  }
+
+ private:
+  friend class InductionVarAnalysis;
+
+  // Induction classification.
+  const Kind kind_;
+  union {
+    struct {
+      int64_t offset_;
+      int64_t mult_;
+      Definition* def_;
+    };
+    struct {
+      InductionVar* initial_;
+      InductionVar* next_;
+    };
+  };
+
+  // Bounds on induction.
+  GrowableArray<Bound> bounds_;
+
+  DISALLOW_COPY_AND_ASSIGN(InductionVar);
+};
+
 // Information on a "natural loop" in the flow graph.
 class LoopInfo : public ZoneAllocated {
  public:
@@ -24,17 +193,33 @@
   // Returns true if given block is backedge of this loop.
   bool IsBackEdge(BlockEntryInstr* block) const;
 
-  // Returns true if this loop is nested inside other loop.
-  bool IsIn(LoopInfo* other) const;
+  // Returns true if given definition is a header phi for this loop.
+  bool IsHeaderPhi(Definition* def) const;
+
+  // Returns true if this loop is nested inside given loop.
+  bool IsIn(LoopInfo* loop) const;
+
+  // Returns true if this loop contains given block.
+  bool Contains(BlockEntryInstr* block) const;
 
   // Returns the nesting depth of this loop.
   intptr_t NestingDepth() const;
 
+  // Resets induction.
+  void ResetInduction();
+
+  // Assigns induction to a definition.
+  void AddInduction(Definition* def, InductionVar* induc);
+
+  // Looks up induction.
+  InductionVar* LookupInduction(Definition* def) const;
+
   // Getters.
   intptr_t id() const { return id_; }
   BlockEntryInstr* header() const { return header_; }
-  const GrowableArray<BlockEntryInstr*>& back_edges() { return back_edges_; }
   BitVector* blocks() const { return blocks_; }
+  const GrowableArray<BlockEntryInstr*>& back_edges() { return back_edges_; }
+  ConstraintInstr* limit() const { return limit_; }
   LoopInfo* outer() const { return outer_; }
   LoopInfo* inner() const { return inner_; }
   LoopInfo* next() const { return next_; }
@@ -43,8 +228,11 @@
   const char* ToCString() const;
 
  private:
+  friend class InductionVarAnalysis;
   friend class LoopHierarchy;
 
+  typedef RawPointerKeyValueTrait<Definition, InductionVar*> InductionKV;
+
   // Unique id of loop. We use its index in the
   // loop header array for this.
   const intptr_t id_;
@@ -59,6 +247,14 @@
   // Back edges of loop (usually one).
   GrowableArray<BlockEntryInstr*> back_edges_;
 
+  // Map definition -> induction for this loop.
+  DirectChainedHashMap<InductionKV> induction_;
+
+  // Constraint on a header phi.
+  // TODO(ajcbik): very specific to smi range analysis,
+  //               should we really store it here?
+  ConstraintInstr* limit_;
+
   // Loop hierarchy.
   LoopInfo* outer_;
   LoopInfo* inner_;
@@ -82,6 +278,9 @@
   // Returns total number of loops in the hierarchy.
   intptr_t num_loops() const { return headers_->length(); }
 
+  // Performs induction variable analysis on all loops.
+  void ComputeInduction() const;
+
  private:
   void Build();
   void Print(LoopInfo* loop);
diff --git a/runtime/vm/compiler/backend/loops_test.cc b/runtime/vm/compiler/backend/loops_test.cc
new file mode 100644
index 0000000..1e9c8cd
--- /dev/null
+++ b/runtime/vm/compiler/backend/loops_test.cc
@@ -0,0 +1,508 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// Unit tests specific to loops and induction variables.
+// Note, try to avoid relying on information that is subject
+// to change (block ids, variable numbers, etc.) in order
+// to make this test less sensitive to unrelated changes.
+
+#include "vm/compiler/backend/loops.h"
+#include "vm/compiler/backend/il_printer.h"
+#include "vm/compiler/backend/inliner.h"
+#include "vm/compiler/backend/type_propagator.h"
+#include "vm/compiler/compiler_pass.h"
+#include "vm/compiler/frontend/kernel_to_il.h"
+#include "vm/compiler/jit/jit_call_specializer.h"
+#include "vm/log.h"
+#include "vm/object.h"
+#include "vm/parser.h"
+#include "vm/symbols.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+// Helper method to construct an induction debug string for loop hierarchy.
+void TestString(BufferFormatter* f,
+                LoopInfo* loop,
+                const GrowableArray<BlockEntryInstr*>& preorder) {
+  for (; loop != nullptr; loop = loop->next()) {
+    intptr_t depth = loop->NestingDepth();
+    f->Print("%*c[%" Pd "\n", static_cast<int>(2 * depth), ' ', loop->id());
+    for (BitVector::Iterator block_it(loop->blocks()); !block_it.Done();
+         block_it.Advance()) {
+      BlockEntryInstr* block = preorder[block_it.Current()];
+      if (block->IsJoinEntry()) {
+        for (PhiIterator it(block->AsJoinEntry()); !it.Done(); it.Advance()) {
+          InductionVar* induc = loop->LookupInduction(it.Current());
+          if (induc != nullptr) {
+            // Obtain the debug string for induction and bounds.
+            f->Print("%*c%s", static_cast<int>(2 * depth), ' ',
+                     induc->ToCString());
+            for (auto bound : induc->bounds()) {
+              f->Print(" %s", bound.limit_->ToCString());
+            }
+            f->Print("\n");
+          }
+        }
+      }
+      for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
+        InductionVar* induc =
+            loop->LookupInduction(it.Current()->AsDefinition());
+        if (InductionVar::IsInduction(induc)) {
+          f->Print("%*c%s\n", static_cast<int>(2 * depth), ' ',
+                   induc->ToCString());
+        }
+      }
+    }
+    TestString(f, loop->inner(), preorder);
+    f->Print("%*c]\n", static_cast<int>(2 * depth), ' ');
+  }
+}
+
+// Helper method to build CFG and compute induction.
+static const char* ComputeInduction(Thread* thread, const char* script_chars) {
+  // Invoke the script.
+  Dart_Handle script = TestCase::LoadTestScript(script_chars, NULL);
+  Dart_Handle result = Dart_Invoke(script, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Find parsed function "foo".
+  TransitionNativeToVM transition(thread);
+  Zone* zone = thread->zone();
+  Library& lib =
+      Library::ZoneHandle(Library::RawCast(Api::UnwrapHandle(script)));
+  RawFunction* raw_func =
+      lib.LookupLocalFunction(String::Handle(Symbols::New(thread, "foo")));
+  ParsedFunction* parsed_function =
+      new (zone) ParsedFunction(thread, Function::ZoneHandle(zone, raw_func));
+  EXPECT(parsed_function != nullptr);
+
+  // Build flow graph.
+  CompilerState state(thread);
+  ZoneGrowableArray<const ICData*>* ic_data_array =
+      new (zone) ZoneGrowableArray<const ICData*>();
+  parsed_function->function().RestoreICDataMap(ic_data_array, true);
+  kernel::FlowGraphBuilder builder(parsed_function, ic_data_array, nullptr,
+                                   nullptr, true, DeoptId::kNone);
+  FlowGraph* flow_graph = builder.BuildGraph();
+  EXPECT(flow_graph != nullptr);
+
+  // Setup some pass data structures and perform minimum passes.
+  SpeculativeInliningPolicy speculative_policy(/*enable_blacklist*/ false);
+  CompilerPassState pass_state(thread, flow_graph, &speculative_policy);
+  JitCallSpecializer call_specializer(flow_graph, &speculative_policy);
+  pass_state.call_specializer = &call_specializer;
+  flow_graph->ComputeSSA(0, nullptr);
+  FlowGraphTypePropagator::Propagate(flow_graph);
+  call_specializer.ApplyICData();
+  flow_graph->SelectRepresentations();
+  FlowGraphTypePropagator::Propagate(flow_graph);
+  flow_graph->Canonicalize();
+
+  // Build loop hierarchy and find induction.
+  const LoopHierarchy& hierarchy = flow_graph->GetLoopHierarchy();
+  hierarchy.ComputeInduction();
+  flow_graph->RemoveRedefinitions();  // don't query later
+
+  // Construct and return a debug string for testing.
+  char buffer[1024];
+  BufferFormatter f(buffer, sizeof(buffer));
+  TestString(&f, hierarchy.top(), flow_graph->preorder());
+  return Thread::Current()->zone()->MakeCopyOfString(buffer);
+}
+
+//
+// Induction tests.
+//
+
+TEST_CASE(BasicInductionUp) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 0; i < 100; i++) {\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(0 + 1 * i) 100\n"  // phi
+      "  LIN(1 + 1 * i)\n"      // add
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(BasicInductionDown) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 100; i > 0; i--) {\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(100 + -1 * i) 0\n"  // phi
+      "  LIN(99 + -1 * i)\n"     // sub
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(BasicInductionStepUp) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 10; i < 100; i += 2) {\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(10 + 2 * i)\n"  // phi
+      "  LIN(12 + 2 * i)\n"  // add
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(BasicInductionStepDown) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 100; i >= 0; i -= 7) {\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(100 + -7 * i)\n"  // phi
+      "  LIN(93 + -7 * i)\n"   // sub
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(BasicInductionLoopNest) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 0; i < 100; i++) {\n"
+      "    for (int j = 1; j < 100; j++) {\n"
+      "      for (int k = 2; k < 100; k++) {\n"
+      "      }\n"
+      "    }\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [2\n"
+      "  LIN(0 + 1 * i) 100\n"  // i
+      "  LIN(1 + 1 * i)\n"
+      "    [1\n"
+      "    LIN(1 + 1 * i) 100\n"  // j
+      "    LIN(2 + 1 * i)\n"
+      "      [0\n"
+      "      LIN(2 + 1 * i) 100\n"  // k
+      "      LIN(3 + 1 * i)\n"
+      "      ]\n"
+      "    ]\n"
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(ChainInduction) {
+  const char* script_chars =
+      "foo() {\n"
+      "  int j = 1;\n"
+      "  for (int i = 0; i < 100; i++) {\n"
+      "    j += 5;\n"
+      "    j += 7;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(1 + 12 * i)\n"     // phi (j)
+      "  LIN(0 + 1 * i) 100\n"  // phi
+      "  LIN(6 + 12 * i)\n"     // j-add
+      "  LIN(13 + 12 * i)\n"    // j-add
+      "  LIN(1 + 1 * i)\n"      // add
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(TwoWayInduction) {
+  const char* script_chars =
+      "foo() {\n"
+      "  int j = 123;\n"
+      "  for (int i = 0; i < 100; i++) {\n"
+      "     if (i == 10) {\n"
+      "       j += 3;\n"
+      "     } else {\n"
+      "       j += 3;\n"
+      "     }\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(123 + 3 * i)\n"    // phi (j)
+      "  LIN(0 + 1 * i) 100\n"  // phi
+      "  LIN(126 + 3 * i)\n"    // j-true
+      "  LIN(126 + 3 * i)\n"    // j-false
+      "  LIN(1 + 1 * i)\n"      // add
+      "  LIN(126 + 3 * i)\n"    // phi (j)
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(DerivedInduction) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 1; i < 100; i++) {\n"
+      "    int a = i + 3;\n"
+      "    int b = i - 5;\n"
+      "    int c = i * 7;\n"
+      "    int d = - i;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(1 + 1 * i) 100\n"  // phi
+      "  LIN(4 + 1 * i)\n"      // a
+      "  LIN(-4 + 1 * i)\n"     // b
+      "  LIN(7 + 7 * i)\n"      // c
+      "  LIN(-1 + -1 * i)\n"    // d
+      "  LIN(2 + 1 * i)\n"      // add
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(WrapAroundAndDerived) {
+  const char* script_chars =
+      "foo() {\n"
+      "  int w = 99;\n"
+      "  for (int i = 0; i < 100; i++) {\n"
+      "    int a = w + 3;\n"
+      "    int b = w - 5;\n"
+      "    int c = w * 7;\n"
+      "    int d = - w;\n"
+      "    w = i;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  WRAP(99, LIN(0 + 1 * i))\n"    // phi (w)
+      "  LIN(0 + 1 * i) 100\n"          // phi
+      "  WRAP(102, LIN(3 + 1 * i))\n"   // a
+      "  WRAP(94, LIN(-5 + 1 * i))\n"   // b
+      "  WRAP(693, LIN(0 + 7 * i))\n"   // c
+      "  WRAP(-99, LIN(0 + -1 * i))\n"  // d
+      "  LIN(1 + 1 * i)\n"              // add
+      "  ]\n";
+  EXPECT_STREQ(ComputeInduction(thread, script_chars), expected);
+}
+
+TEST_CASE(PeriodicAndDerived) {
+  const char* script_chars =
+      "foo() {\n"
+      "  int p1 = 3;\n"
+      "  int p2 = 5;\n"
+      "  for (int i = 0; i < 100; i++) {\n"
+      "    int a = p1 + 3;\n"
+      "    int b = p1 - 5;\n"
+      "    int c = p1 * 7;\n"
+      "    int d = - p1;\n"
+      "    p1 = - p1;\n"
+      "    p2 = 100 - p2;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  PERIOD(3, -3)\n"       // phi(p1)
+      "  PERIOD(5, 95)\n"       // phi(p2)
+      "  LIN(0 + 1 * i) 100\n"  // phi
+      "  PERIOD(6, 0)\n"        // a
+      "  PERIOD(-2, -8)\n"      // b
+      "  PERIOD(21, -21)\n"     // c
+      "  PERIOD(-3, 3)\n"       // d
+      "  PERIOD(-3, 3)\n"       // p1
+      "  PERIOD(95, 5)\n"       // p2
+      "  LIN(1 + 1 * i)\n"      // add
+      "  ]\n";
+  EXPECT_STREQ(ComputeInduction(thread, script_chars), expected);
+}
+
+//
+// Bound specific tests.
+//
+
+TEST_CASE(NonStrictConditionUp) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 0; i <= 100; i++) {\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(0 + 1 * i) 101\n"  // phi
+      "  LIN(1 + 1 * i)\n"      // add
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+#ifndef TARGET_ARCH_DBC
+TEST_CASE(NonStrictConditionUpWrap) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 0x7ffffffffffffffe; i <= 0x7fffffffffffffff; i++) {\n"
+      "    if (i < 0) break;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(9223372036854775806 + 1 * i)\n"  // phi
+      "  LIN(9223372036854775806 + 1 * i)\n"  // (un)boxing
+      "  LIN(9223372036854775806 + 1 * i)\n"
+      "  LIN(9223372036854775806 + 1 * i)\n"
+      "  LIN(9223372036854775807 + 1 * i)\n"  // add
+      "  LIN(9223372036854775807 + 1 * i)\n"  // unbox
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+#endif
+
+TEST_CASE(NonStrictConditionDown) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 100; i >= 0; i--) {\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(100 + -1 * i) -1\n"  // phi
+      "  LIN(99 + -1 * i)\n"      // add
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+#ifndef TARGET_ARCH_DBC
+TEST_CASE(NonStrictConditionDownWrap) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 0x8000000000000001; i >= 0x8000000000000000; i--) {\n"
+      "    if (i > 0) break;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(-9223372036854775807 + -1 * i)\n"  // phi
+      "  LIN(-9223372036854775807 + -1 * i)\n"  // (un)boxing
+      "  LIN(-9223372036854775807 + -1 * i)\n"
+      "  LIN(-9223372036854775807 + -1 * i)\n"
+      "  LIN(-9223372036854775808 + -1 * i)\n"  // sub
+      "  LIN(-9223372036854775808 + -1 * i)\n"  // unbox
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+#endif
+
+TEST_CASE(NotEqualConditionUp) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 10; i != 20; i++) {\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(10 + 1 * i) 20\n"  // phi
+      "  LIN(11 + 1 * i)\n"     // add
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(NotEqualConditionDown) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 20; i != 10; i--) {\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(20 + -1 * i) 10\n"  // phi
+      "  LIN(19 + -1 * i)\n"     // sub
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(SecondExitUp) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 0; i < 100; i++) {\n"
+      "     if (i >= 50) break;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(0 + 1 * i) 100 50\n"  // phi
+      "  LIN(1 + 1 * i)\n"         // add
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+TEST_CASE(SecondExitDown) {
+  const char* script_chars =
+      "foo() {\n"
+      "  for (int i = 100; i > 0; i--) {\n"
+      "     if (i <= 10) break;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  foo();\n"
+      "}\n";
+  const char* expected =
+      "  [0\n"
+      "  LIN(100 + -1 * i) 0 10\n"  // phi
+      "  LIN(99 + -1 * i)\n"        // sub
+      "  ]\n";
+  EXPECT_STREQ(expected, ComputeInduction(thread, script_chars));
+}
+
+}  // namespace dart
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index c2a4bef..28f2199 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -30,7 +30,7 @@
 void RangeAnalysis::Analyze() {
   CollectValues();
   InsertConstraints();
-  DiscoverSimpleInductionVariables();
+  flow_graph_->GetLoopHierarchy().ComputeInduction();
   InferRanges();
   EliminateRedundantBoundsChecks();
   MarkUnreachableBlocks();
@@ -43,6 +43,7 @@
   RemoveConstraints();
 }
 
+// Helper method to chase to a constrained definition.
 static Definition* UnwrapConstraint(Definition* defn) {
   while (defn->IsConstraint()) {
     defn = defn->AsConstraint()->value()->definition();
@@ -50,167 +51,6 @@
   return defn;
 }
 
-// Simple induction variable is a variable that satisfies the following pattern:
-//
-//                         v1 <- phi(v0, v1 + 1)
-//
-// If there are two simple induction variables in the same block and one of
-// them is constrained - then another one is constrained as well, e.g.
-// from
-//
-//                        B1:
-//                         v3 <- phi(v0, v3 + 1)
-//                         v4 <- phi(v2, v4 + 1)
-//                        Bx:
-//                         v3 is constrained to [v0, v1]
-//
-// it follows that
-//
-//                        Bx:
-//                         v4 is constrained to [v2, v2 + (v0 - v1)]
-//
-// This pass essentially pattern matches induction variables introduced
-// like this:
-//
-//                  for (var i = i0, j = j0; i < L; i++, j++) {
-//                      j is known to be within [j0, j0 + (L - i0 - 1)]
-//                  }
-//
-class InductionVariableInfo : public ZoneAllocated {
- public:
-  InductionVariableInfo(PhiInstr* phi,
-                        Definition* initial_value,
-                        BinarySmiOpInstr* increment,
-                        ConstraintInstr* limit)
-      : phi_(phi),
-        initial_value_(initial_value),
-        increment_(increment),
-        limit_(limit),
-        bound_(NULL) {}
-
-  PhiInstr* phi() const { return phi_; }
-  Definition* initial_value() const { return initial_value_; }
-  BinarySmiOpInstr* increment() const { return increment_; }
-
-  // Outermost constraint that constrains this induction variable into
-  // [-inf, X] range.
-  ConstraintInstr* limit() const { return limit_; }
-
-  // Induction variable from the same join block that has limiting constraint.
-  PhiInstr* bound() const { return bound_; }
-  void set_bound(PhiInstr* bound) { bound_ = bound; }
-
- private:
-  PhiInstr* phi_;
-  Definition* initial_value_;
-  BinarySmiOpInstr* increment_;
-  ConstraintInstr* limit_;
-
-  PhiInstr* bound_;
-};
-
-static ConstraintInstr* FindBoundingConstraint(PhiInstr* phi,
-                                               Definition* defn) {
-  ConstraintInstr* limit = NULL;
-  for (ConstraintInstr* constraint = defn->AsConstraint(); constraint != NULL;
-       constraint = constraint->value()->definition()->AsConstraint()) {
-    if (constraint->target() == NULL) {
-      continue;  // Only interested in non-artifical constraints.
-    }
-
-    Range* constraining_range = constraint->constraint();
-    if (constraining_range->min().Equals(RangeBoundary::MinSmi()) &&
-        (constraining_range->max().IsSymbol() &&
-         phi->IsDominatedBy(constraining_range->max().symbol()))) {
-      limit = constraint;
-    }
-  }
-
-  return limit;
-}
-
-static InductionVariableInfo* DetectSimpleInductionVariable(PhiInstr* phi) {
-  if (phi->Type()->ToCid() != kSmiCid) {
-    return NULL;
-  }
-
-  if (phi->InputCount() != 2) {
-    return NULL;
-  }
-
-  BitVector* loop_blocks = phi->block()->loop_info()->blocks();
-
-  const intptr_t backedge_idx =
-      loop_blocks->Contains(phi->block()->PredecessorAt(0)->preorder_number())
-          ? 0
-          : 1;
-
-  Definition* initial_value = phi->InputAt(1 - backedge_idx)->definition();
-
-  BinarySmiOpInstr* increment =
-      UnwrapConstraint(phi->InputAt(backedge_idx)->definition())
-          ->AsBinarySmiOp();
-
-  if ((increment != NULL) && (increment->op_kind() == Token::kADD) &&
-      (UnwrapConstraint(increment->left()->definition()) == phi) &&
-      increment->right()->BindsToConstant() &&
-      increment->right()->BoundConstant().IsSmi() &&
-      (Smi::Cast(increment->right()->BoundConstant()).Value() == 1)) {
-    return new InductionVariableInfo(
-        phi, initial_value, increment,
-        FindBoundingConstraint(phi, increment->left()->definition()));
-  }
-
-  return NULL;
-}
-
-// TODO(ajcbik): move induction variable recognition in loop framework
-void RangeAnalysis::DiscoverSimpleInductionVariables() {
-  GrowableArray<InductionVariableInfo*> loop_variables;
-
-  for (BlockIterator block_it = flow_graph_->reverse_postorder_iterator();
-       !block_it.Done(); block_it.Advance()) {
-    BlockEntryInstr* block = block_it.Current();
-
-    JoinEntryInstr* join = block->AsJoinEntry();
-    if (join != NULL && join->loop_info() != NULL &&
-        join->loop_info()->header() == join) {
-      loop_variables.Clear();
-
-      for (PhiIterator phi_it(join); !phi_it.Done(); phi_it.Advance()) {
-        PhiInstr* current = phi_it.Current();
-
-        InductionVariableInfo* info = DetectSimpleInductionVariable(current);
-        if (info != NULL) {
-          if (FLAG_support_il_printer && FLAG_trace_range_analysis) {
-            THR_Print("Simple loop variable: %s bound <%s>\n",
-                      current->ToCString(),
-                      info->limit() != NULL ? info->limit()->ToCString() : "?");
-          }
-
-          loop_variables.Add(info);
-        }
-      }
-    }
-
-    InductionVariableInfo* bound = NULL;
-    for (intptr_t i = 0; i < loop_variables.length(); i++) {
-      if (loop_variables[i]->limit() != NULL) {
-        bound = loop_variables[i];
-        break;
-      }
-    }
-
-    if (bound != NULL) {
-      for (intptr_t i = 0; i < loop_variables.length(); i++) {
-        InductionVariableInfo* info = loop_variables[i];
-        info->set_bound(bound->phi());
-        info->phi()->set_induction_variable_info(info);
-      }
-    }
-  }
-}
-
 void RangeAnalysis::CollectValues() {
   auto graph_entry = flow_graph_->graph_entry();
 
@@ -266,35 +106,14 @@
             shift_int64_ops_.Add(defn->AsShiftIntegerOp());
           }
         }
-      } else if (current->IsCheckArrayBound()) {
-        bounds_checks_.Add(current->AsCheckArrayBound());
+      }
+      if (current->IsCheckArrayBound() || current->IsGenericCheckBound()) {
+        bounds_checks_.Add(current);
       }
     }
   }
 }
 
-// For a comparison operation return an operation for the equivalent flipped
-// comparison: a (op) b === b (op') a.
-static Token::Kind FlipComparison(Token::Kind op) {
-  switch (op) {
-    case Token::kEQ:
-      return Token::kEQ;
-    case Token::kNE:
-      return Token::kNE;
-    case Token::kLT:
-      return Token::kGT;
-    case Token::kGT:
-      return Token::kLT;
-    case Token::kLTE:
-      return Token::kGTE;
-    case Token::kGTE:
-      return Token::kLTE;
-    default:
-      UNREACHABLE();
-      return Token::kILLEGAL;
-  }
-}
-
 // Given a boundary (right operand) and a comparison operation return
 // a symbolic range constraint for the left operand of the comparison assuming
 // that it evaluated to true.
@@ -367,7 +186,7 @@
       boundary = rel_op->InputAt(0)->definition();
       // InsertConstraintFor assumes that defn is left operand of a
       // comparison if it is right operand flip the comparison.
-      op_kind = FlipComparison(rel_op->kind());
+      op_kind = Token::FlipComparison(rel_op->kind());
     }
 
     // Constrain definition at the true successor.
@@ -999,6 +818,9 @@
     // certain preconditions. Start by emitting this preconditions.
     scheduler_.Start();
 
+    // AOT should only see non-deopting GenericCheckBound.
+    ASSERT(!FLAG_precompiled_mode);
+
     ConstantInstr* max_smi =
         flow_graph_->GetConstant(Smi::Handle(Smi::New(Smi::kMaxValue)));
     for (intptr_t i = 0; i < non_positive_symbols.length(); i++) {
@@ -1048,6 +870,7 @@
     if (binary_op != NULL) {
       binary_op->set_can_overflow(false);
     }
+    check->ReplaceUsesWith(check->index()->definition());
     check->RemoveFromGraph();
   }
 
@@ -1077,6 +900,8 @@
   }
 
   typedef Definition* (BoundsCheckGeneralizer::*PhiBoundFunc)(PhiInstr*,
+                                                              LoopInfo*,
+                                                              InductionVar*,
                                                               Instruction*);
 
   // Construct symbolic lower bound for a value at the given point.
@@ -1091,6 +916,52 @@
                           value, point);
   }
 
+  // Helper methods to implement "older" business logic.
+  // TODO(ajcbik): generalize with new induction variable information
+
+  // Only accept loops with a smi constraint on smi induction.
+  LoopInfo* GetSmiBoundedLoop(PhiInstr* phi) {
+    LoopInfo* loop = phi->GetBlock()->loop_info();
+    if (loop == nullptr) {
+      return nullptr;
+    }
+    ConstraintInstr* limit = loop->limit();
+    if (limit == nullptr) {
+      return nullptr;
+    }
+    Definition* def = UnwrapConstraint(limit->value()->definition());
+    Range* constraining_range = limit->constraint();
+    if (GetSmiInduction(loop, def) != nullptr &&
+        constraining_range->min().Equals(RangeBoundary::MinSmi()) &&
+        constraining_range->max().IsSymbol() &&
+        def->IsDominatedBy(constraining_range->max().symbol())) {
+      return loop;
+    }
+    return nullptr;
+  }
+
+  // Only accept smi linear induction with unit stride.
+  InductionVar* GetSmiInduction(LoopInfo* loop, Definition* def) {
+    if (loop != nullptr && def->Type()->ToCid() == kSmiCid) {
+      InductionVar* induc = loop->LookupInduction(def);
+      if (induc != nullptr && induc->kind() == InductionVar::kLinear &&
+          induc->next()->offset() == 1 && induc->next()->mult() == 0) {
+        return induc;
+      }
+    }
+    return nullptr;
+  }
+
+  // Reconstruct invariant (phi-init is always already in the graph).
+  Definition* GenerateInvariant(InductionVar* induc) {
+    if (induc->mult() == 0) {
+      return flow_graph_->GetConstant(
+          Smi::ZoneHandle(Smi::New(induc->offset())));
+    }
+    ASSERT(induc->offset() == 0 && induc->mult() == 1);
+    return induc->def();
+  }
+
   // Construct symbolic bound for a value at the given point:
   //
   //   1. if value is an induction variable use its bounds;
@@ -1109,8 +980,10 @@
     value = UnwrapConstraint(value);
     if (value->IsPhi()) {
       PhiInstr* phi = value->AsPhi();
-      if (phi->induction_variable_info() != NULL) {
-        return (this->*phi_bound_func)(phi, point);
+      LoopInfo* loop = GetSmiBoundedLoop(phi);
+      InductionVar* induc = GetSmiInduction(loop, phi);
+      if (induc != nullptr) {
+        return (this->*phi_bound_func)(phi, loop, induc, point);
       }
     } else if (value->IsBinarySmiOp()) {
       BinarySmiOpInstr* bin_op = value->AsBinarySmiOp();
@@ -1131,58 +1004,61 @@
         }
       }
     }
-
     return value;
   }
 
-  Definition* InductionVariableUpperBound(PhiInstr* phi, Instruction* point) {
-    const InductionVariableInfo& info = *phi->induction_variable_info();
-    if (info.bound() == phi) {
-      if (point->IsDominatedBy(info.limit())) {
-        // Given induction variable
-        //
-        //          x <- phi(x0, x + 1)
-        //
-        // and a constraint x <= M that dominates the given
-        // point we conclude that M is an upper bound for x.
-        return RangeBoundaryToDefinition(info.limit()->constraint()->max());
-      }
-    } else {
-      const InductionVariableInfo& bound_info =
-          *info.bound()->induction_variable_info();
-      if (point->IsDominatedBy(bound_info.limit())) {
-        // Given two induction variables
-        //
-        //          x <- phi(x0, x + 1)
-        //          y <- phi(y0, y + 1)
-        //
-        // and a constraint x <= M that dominates the given
-        // point we can conclude that
-        //
-        //          y <= y0 + (M - x0)
-        //
-        Definition* limit =
-            RangeBoundaryToDefinition(bound_info.limit()->constraint()->max());
-        BinarySmiOpInstr* loop_length = MakeBinaryOp(
-            Token::kSUB, ConstructUpperBound(limit, point),
-            ConstructLowerBound(bound_info.initial_value(), point));
-        return MakeBinaryOp(Token::kADD,
-                            ConstructUpperBound(info.initial_value(), point),
-                            loop_length);
-      }
+  Definition* InductionVariableUpperBound(PhiInstr* phi,
+                                          LoopInfo* loop,
+                                          InductionVar* induc,
+                                          Instruction* point) {
+    // Test if limit dominates given point.
+    ConstraintInstr* limit = loop->limit();
+    if (!point->IsDominatedBy(limit)) {
+      return phi;
     }
-
-    return phi;
+    // Decide between direct or indirect bound.
+    Definition* bounded_def = UnwrapConstraint(limit->value()->definition());
+    if (bounded_def == phi) {
+      // Given a smi bounded loop with smi induction variable
+      //
+      //          x <- phi(x0, x + 1)
+      //
+      // and a constraint x <= M that dominates the given
+      // point we conclude that M is an upper bound for x.
+      return RangeBoundaryToDefinition(limit->constraint()->max());
+    } else {
+      // Given a smi bounded loop with two smi induction variables
+      //
+      //          x <- phi(x0, x + 1)
+      //          y <- phi(y0, y + 1)
+      //
+      // and a constraint x <= M that dominates the given
+      // point we can conclude that
+      //
+      //          y <= y0 + (M - x0)
+      //
+      InductionVar* bounded_induc = GetSmiInduction(loop, bounded_def);
+      Definition* x0 = GenerateInvariant(bounded_induc->initial());
+      Definition* y0 = GenerateInvariant(induc->initial());
+      Definition* m = RangeBoundaryToDefinition(limit->constraint()->max());
+      BinarySmiOpInstr* loop_length =
+          MakeBinaryOp(Token::kSUB, ConstructUpperBound(m, point),
+                       ConstructLowerBound(x0, point));
+      return MakeBinaryOp(Token::kADD, ConstructUpperBound(y0, point),
+                          loop_length);
+    }
   }
 
-  Definition* InductionVariableLowerBound(PhiInstr* phi, Instruction* point) {
-    // Given induction variable
+  Definition* InductionVariableLowerBound(PhiInstr* phi,
+                                          LoopInfo* loop,
+                                          InductionVar* induc,
+                                          Instruction* point) {
+    // Given a smi bounded loop with smi induction variable
     //
     //          x <- phi(x0, x + 1)
     //
     // we can conclude that LowerBound(x) == x0.
-    const InductionVariableInfo& info = *phi->induction_variable_info();
-    return ConstructLowerBound(info.initial_value(), point);
+    return ConstructLowerBound(GenerateInvariant(induc->initial()), point);
   }
 
   // Try to re-associate binary operations in the floating DAG of operations
@@ -1445,10 +1321,25 @@
     BoundsCheckGeneralizer generalizer(this, flow_graph_);
 
     for (intptr_t i = 0; i < bounds_checks_.length(); i++) {
-      CheckArrayBoundInstr* check = bounds_checks_[i];
+      // Is this a non-speculative check bound?
+      GenericCheckBoundInstr* aot_check =
+          bounds_checks_[i]->AsGenericCheckBound();
+      if (aot_check != nullptr) {
+        RangeBoundary array_length =
+            RangeBoundary::FromDefinition(aot_check->length()->definition());
+        if (aot_check->IsRedundant(array_length)) {
+          aot_check->ReplaceUsesWith(aot_check->index()->definition());
+          aot_check->RemoveFromGraph();
+        }
+        continue;
+      }
+      // Must be a speculative check bound.
+      CheckArrayBoundInstr* check = bounds_checks_[i]->AsCheckArrayBound();
+      ASSERT(check != nullptr);
       RangeBoundary array_length =
           RangeBoundary::FromDefinition(check->length()->definition());
       if (check->IsRedundant(array_length)) {
+        check->ReplaceUsesWith(check->index()->definition());
         check->RemoveFromGraph();
       } else if (try_generalization) {
         generalizer.TryGeneralize(check, array_length);
@@ -2707,43 +2598,55 @@
 }
 
 void LoadFieldInstr::InferRange(RangeAnalysis* analysis, Range* range) {
-  if (native_field() != nullptr) {
-    switch (native_field()->kind()) {
-      case NativeFieldDesc::kArray_length:
-      case NativeFieldDesc::kGrowableObjectArray_length:
-        *range = Range(RangeBoundary::FromConstant(0),
-                       RangeBoundary::FromConstant(Array::kMaxElements));
-        break;
+  switch (slot().kind()) {
+    case Slot::Kind::kArray_length:
+    case Slot::Kind::kGrowableObjectArray_length:
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(Array::kMaxElements));
+      break;
 
-      case NativeFieldDesc::kTypedData_length:
-        *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
-        break;
+    case Slot::Kind::kTypedData_length:
+      *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
+      break;
 
-      case NativeFieldDesc::kString_length:
-        *range = Range(RangeBoundary::FromConstant(0),
-                       RangeBoundary::FromConstant(String::kMaxElements));
-        break;
+    case Slot::Kind::kString_length:
+      *range = Range(RangeBoundary::FromConstant(0),
+                     RangeBoundary::FromConstant(String::kMaxElements));
+      break;
 
-      case NativeFieldDesc::kLinkedHashMap_index:
-      case NativeFieldDesc::kLinkedHashMap_data:
-      case NativeFieldDesc::kTypeArguments:
-        // Not an integer valued field.
-        UNREACHABLE();
-        break;
+    case Slot::Kind::kDartField:
+    case Slot::Kind::kCapturedVariable:
+      // Use default value.
+      Definition::InferRange(analysis, range);
+      break;
 
-      case NativeFieldDesc::kLinkedHashMap_hash_mask:
-      case NativeFieldDesc::kLinkedHashMap_used_data:
-      case NativeFieldDesc::kLinkedHashMap_deleted_keys:
-        *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
-        break;
+    case Slot::Kind::kLinkedHashMap_index:
+    case Slot::Kind::kLinkedHashMap_data:
+    case Slot::Kind::kGrowableObjectArray_data:
+    case Slot::Kind::kContext_parent:
+    case Slot::Kind::kTypeArguments:
+    case Slot::Kind::kClosure_context:
+    case Slot::Kind::kClosure_delayed_type_arguments:
+    case Slot::Kind::kClosure_function:
+    case Slot::Kind::kClosure_function_type_arguments:
+    case Slot::Kind::kClosure_instantiator_type_arguments:
+      // Not an integer valued field.
+      UNREACHABLE();
+      break;
 
-      case NativeFieldDesc::kArgumentsDescriptor_type_args_len:
-        *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
-        break;
-    }
-    return;
+    case Slot::Kind::kClosure_hash:
+    case Slot::Kind::kLinkedHashMap_hash_mask:
+    case Slot::Kind::kLinkedHashMap_used_data:
+    case Slot::Kind::kLinkedHashMap_deleted_keys:
+      *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
+      break;
+
+    case Slot::Kind::kArgumentsDescriptor_type_args_len:
+    case Slot::Kind::kArgumentsDescriptor_positional_count:
+    case Slot::Kind::kArgumentsDescriptor_count:
+      *range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
+      break;
   }
-  Definition::InferRange(analysis, range);
 }
 
 void LoadIndexedInstr::InferRange(RangeAnalysis* analysis, Range* range) {
@@ -3039,6 +2942,52 @@
   return false;
 }
 
+// Check if range boundary and invariant limit are the same boundary.
+static bool IsSameBound(const RangeBoundary& a, InductionVar* b) {
+  ASSERT(InductionVar::IsInvariant(b));
+  if (a.IsSymbol()) {
+    // Check for exactly the same symbol as length.
+    return a.symbol() == b->def() && b->mult() == 1 &&
+           a.offset() == b->offset();
+  } else if (a.IsConstant()) {
+    // Check for constant in right range 0 < c <= length.
+    int64_t c = 0;
+    return InductionVar::IsConstant(b, &c) && 0 < c && c <= a.ConstantValue();
+  }
+  return false;
+}
+
+bool GenericCheckBoundInstr::IsRedundant(const RangeBoundary& length) {
+  // In loop, with index as induction?
+  LoopInfo* loop = GetBlock()->loop_info();
+  if (loop == nullptr) {
+    return false;
+  }
+  InductionVar* induc = loop->LookupInduction(index()->definition());
+  if (induc == nullptr) {
+    return false;
+  }
+  // Under 64-bit wrap-around arithmetic, it is always safe to remove the
+  // bounds check from the following, if initial >= 0 and the corresponding
+  // exit branch dominates the bounds check:
+  //   for (int i = initial; i < length; i++)
+  //     .... a[i] ....
+  int64_t stride = 0;
+  int64_t initial = 0;
+  if (InductionVar::IsLinear(induc, &stride) &&
+      InductionVar::IsConstant(induc->initial(), &initial)) {
+    if (stride == 1 && initial >= 0) {
+      for (auto bound : induc->bounds()) {
+        if (IsSameBound(length, bound.limit_) &&
+            this->IsDominatedBy(bound.branch_)) {
+          return true;
+        }
+      }
+    }
+  }
+  return false;
+}
+
 }  // namespace dart
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/backend/range_analysis.h b/runtime/vm/compiler/backend/range_analysis.h
index 0b25eaa..24adeed 100644
--- a/runtime/vm/compiler/backend/range_analysis.h
+++ b/runtime/vm/compiler/backend/range_analysis.h
@@ -538,8 +538,8 @@
   enum JoinOperator { NONE, WIDEN, NARROW };
   static char OpPrefix(JoinOperator op);
 
-  // Collect all values that were proven to be smi in smi_values_ array and all
-  // CheckSmi instructions in smi_check_ array.
+  // Collect all integer values (smi or int), all 64-bit binary
+  // and shift operations, and all check bounds.
   void CollectValues();
 
   // Iterate over smi values and constrain them at branch successors.
@@ -583,8 +583,6 @@
   // Convert mint operations that stay within int32 range into Int32 operations.
   void NarrowMintToInt32();
 
-  void DiscoverSimpleInductionVariables();
-
   // Remove artificial Constraint instructions and replace them with actual
   // unconstrained definitions.
   void RemoveConstraints();
@@ -600,15 +598,15 @@
 
   Range int64_range_;
 
-  // Value that are known to be smi or mint.
+  // All values that are known to be smi or mint.
   GrowableArray<Definition*> values_;
 
+  // All 64-bit binary and shift operations.
   GrowableArray<BinaryInt64OpInstr*> binary_int64_ops_;
-
   GrowableArray<ShiftIntegerOpInstr*> shift_int64_ops_;
 
-  // All CheckArrayBound instructions.
-  GrowableArray<CheckArrayBoundInstr*> bounds_checks_;
+  // All CheckArrayBound/GenericCheckBound instructions.
+  GrowableArray<Instruction*> bounds_checks_;
 
   // All Constraints inserted during InsertConstraints phase. They are treated
   // as smi values.
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index f8f5ec8..c507504 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -58,8 +58,10 @@
 // We distinguish the following aliases:
 //
 //   - for fields
-//     - *.f, *.@offs - field inside some object;
-//     - X.f, X.@offs - field inside an allocated object X;
+//     - *.f - field inside some object;
+//     - X.f - field inside an allocated object X;
+//     -   f - static fields
+//
 //   - for indexed accesses
 //     - *[*] - non-constant index inside some object;
 //     - *[C] - constant index inside some object;
@@ -103,14 +105,13 @@
   enum Kind {
     kNone,
 
-    // Field location. For instance fields is represented as a pair of a Field
-    // object and an instance (SSA definition) that is being accessed.
-    // For static fields instance is NULL.
-    kField,
+    // Static field location. Is represented as a Field object with a
+    // nullptr instance.
+    kStaticField,
 
-    // VMField location. Represented as a pair of an instance (SSA definition)
-    // being accessed and offset to the field.
-    kVMField,
+    // Instance field location. It is reprensented by a pair of instance
+    // and a Slot.
+    kInstanceField,
 
     // Indexed location with a non-constant index.
     kIndexed,
@@ -158,19 +159,14 @@
   // Construct a place from instruction if instruction accesses any place.
   // Otherwise constructs kNone place.
   Place(Instruction* instr, bool* is_load, bool* is_store)
-      : flags_(0), instance_(NULL), raw_selector_(0), id_(0) {
+      : flags_(0), instance_(nullptr), raw_selector_(0), id_(0) {
     switch (instr->tag()) {
       case Instruction::kLoadField: {
         LoadFieldInstr* load_field = instr->AsLoadField();
         set_representation(load_field->representation());
         instance_ = load_field->instance()->definition()->OriginalDefinition();
-        if (load_field->field() != NULL) {
-          set_kind(kField);
-          field_ = load_field->field();
-        } else {
-          set_kind(kVMField);
-          offset_in_bytes_ = load_field->offset_in_bytes();
-        }
+        set_kind(kInstanceField);
+        instance_field_ = &load_field->slot();
         *is_load = true;
         break;
       }
@@ -180,30 +176,25 @@
         set_representation(store->RequiredInputRepresentation(
             StoreInstanceFieldInstr::kValuePos));
         instance_ = store->instance()->definition()->OriginalDefinition();
-        if (!store->field().IsNull()) {
-          set_kind(kField);
-          field_ = &store->field();
-        } else {
-          set_kind(kVMField);
-          offset_in_bytes_ = store->offset_in_bytes();
-        }
+        set_kind(kInstanceField);
+        instance_field_ = &store->slot();
         *is_store = true;
         break;
       }
 
       case Instruction::kLoadStaticField:
-        set_kind(kField);
+        set_kind(kStaticField);
         set_representation(instr->AsLoadStaticField()->representation());
-        field_ = &instr->AsLoadStaticField()->StaticField();
+        static_field_ = &instr->AsLoadStaticField()->StaticField();
         *is_load = true;
         break;
 
       case Instruction::kStoreStaticField:
-        set_kind(kField);
+        set_kind(kStaticField);
         set_representation(
             instr->AsStoreStaticField()->RequiredInputRepresentation(
                 StoreStaticFieldInstr::kValuePos));
-        field_ = &instr->AsStoreStaticField()->field();
+        static_field_ = &instr->AsStoreStaticField()->field();
         *is_store = true;
         break;
 
@@ -233,6 +224,18 @@
     }
   }
 
+  bool IsConstant(Object* value) const {
+    switch (kind()) {
+      case kInstanceField:
+        return (instance() != nullptr) && instance()->IsConstant() &&
+               LoadFieldInstr::TryEvaluateLoad(
+                   instance()->AsConstant()->constant_value(), instance_field(),
+                   value);
+      default:
+        return false;
+    }
+  }
+
   // Create object representing *[*] alias.
   static Place* CreateAnyInstanceAnyIndexAlias(Zone* zone, intptr_t id) {
     return Wrap(
@@ -264,12 +267,12 @@
 
   bool DependsOnInstance() const {
     switch (kind()) {
-      case kField:
-      case kVMField:
+      case kInstanceField:
       case kIndexed:
       case kConstantIndexed:
         return true;
 
+      case kStaticField:
       case kNone:
         return false;
     }
@@ -325,14 +328,15 @@
     instance_ = def->OriginalDefinition();
   }
 
-  const Field& field() const {
-    ASSERT(kind() == kField);
-    return *field_;
+  const Field& static_field() const {
+    ASSERT(kind() == kStaticField);
+    ASSERT(static_field_->is_static());
+    return *static_field_;
   }
 
-  intptr_t offset_in_bytes() const {
-    ASSERT(kind() == kVMField);
-    return offset_in_bytes_;
+  const Slot& instance_field() const {
+    ASSERT(kind() == kInstanceField);
+    return *instance_field_;
   }
 
   Definition* index() const {
@@ -361,19 +365,16 @@
       case kNone:
         return "<none>";
 
-      case kField: {
-        const char* field_name = String::Handle(field().name()).ToCString();
-        if (field().is_static()) {
-          return Thread::Current()->zone()->PrintToString("<%s>", field_name);
-        } else {
-          return Thread::Current()->zone()->PrintToString(
-              "<%s.%s>", DefinitionName(instance()), field_name);
-        }
+      case kStaticField: {
+        const char* field_name =
+            String::Handle(static_field().name()).ToCString();
+        return Thread::Current()->zone()->PrintToString("<%s>", field_name);
       }
 
-      case kVMField:
+      case kInstanceField:
         return Thread::Current()->zone()->PrintToString(
-            "<%s.@%" Pd ">", DefinitionName(instance()), offset_in_bytes());
+            "<%s.%s[%p]>", DefinitionName(instance()), instance_field().Name(),
+            &instance_field());
 
       case kIndexed:
         return Thread::Current()->zone()->PrintToString(
@@ -397,8 +398,14 @@
   // Handle static finals as non-final with precompilation because
   // they may be reset to uninitialized after compilation.
   bool IsImmutableField() const {
-    return (kind() == kField) && field().is_final() &&
-           (!field().is_static() || !FLAG_fields_may_be_reset);
+    switch (kind()) {
+      case kInstanceField:
+        return instance_field().is_immutable();
+      case kStaticField:
+        return static_field().is_final() && !FLAG_fields_may_be_reset;
+      default:
+        return false;
+    }
   }
 
   intptr_t Hashcode() const {
@@ -427,14 +434,16 @@
       : flags_(flags), instance_(instance), raw_selector_(selector), id_(0) {}
 
   bool SameField(const Place* other) const {
-    return (kind() == kField)
-               ? (field().Original() == other->field().Original())
-               : (offset_in_bytes_ == other->offset_in_bytes_);
+    return (kind() == kStaticField)
+               ? (static_field().Original() == other->static_field().Original())
+               : (raw_selector_ == other->raw_selector_);
   }
 
   intptr_t FieldHashcode() const {
-    return (kind() == kField) ? reinterpret_cast<intptr_t>(field().Original())
-                              : offset_in_bytes_;
+    return (kind() == kStaticField)
+               ? String::Handle(Field::Handle(static_field().Original()).name())
+                     .Hash()
+               : raw_selector_;
   }
 
   void set_representation(Representation rep) {
@@ -549,8 +558,8 @@
   Definition* instance_;
   union {
     intptr_t raw_selector_;
-    const Field* field_;
-    intptr_t offset_in_bytes_;
+    const Field* static_field_;
+    const Slot* instance_field_;
     intptr_t index_constant_;
     Definition* index_;
   };
@@ -907,10 +916,13 @@
         }
         break;
 
-      case Place::kField:
-      case Place::kVMField:
+      case Place::kStaticField:
+        // Nothing to do.
+        break;
+
+      case Place::kInstanceField:
         if (CanBeAliased(alias->instance())) {
-          // X.f or X.@offs alias with *.f and *.@offs respectively.
+          // X.f alias with *.f.
           CrossAlias(alias, alias->CopyWithoutInstance());
         }
         break;
@@ -925,30 +937,16 @@
   // occur in other functions.
   bool IsIndependentFromEffects(Place* place) {
     if (place->IsImmutableField()) {
-      // Note that we can't use LoadField's is_immutable attribute here because
-      // some VM-fields (those that have no corresponding Field object and
-      // accessed through offset alone) can share offset but have different
-      // immutability properties.
-      // One example is the length property of growable and fixed size list. If
-      // loads of these two properties occur in the same function for the same
-      // receiver then they will get the same expression number. However
-      // immutability of the length of fixed size list does not mean that
-      // growable list also has immutable property. Thus we will make a
-      // conservative assumption for the VM-properties.
-      // TODO(vegorov): disambiguate immutable and non-immutable VM-fields with
-      // the same offset e.g. through recognized kind.
       return true;
     }
 
-    return ((place->kind() == Place::kField) ||
-            (place->kind() == Place::kVMField)) &&
+    return (place->kind() == Place::kInstanceField) &&
            !CanBeAliased(place->instance());
   }
 
   // Returns true if there are direct loads from the given place.
   bool HasLoadsFromPlace(Definition* defn, const Place* place) {
-    ASSERT((place->kind() == Place::kField) ||
-           (place->kind() == Place::kVMField));
+    ASSERT(place->kind() == Place::kInstanceField);
 
     for (Value* use = defn->input_use_list(); use != NULL;
          use = use->next_use()) {
@@ -1127,8 +1125,7 @@
 }
 
 static bool IsPhiDependentPlace(Place* place) {
-  return ((place->kind() == Place::kField) ||
-          (place->kind() == Place::kVMField)) &&
+  return (place->kind() == Place::kInstanceField) &&
          (place->instance() != NULL) && place->instance()->IsPhi();
 }
 
@@ -1259,6 +1256,7 @@
   } else if (current->IsCheckEitherNonSmi()) {
     current->AsCheckEitherNonSmi()->set_licm_hoisted(true);
   } else if (current->IsCheckArrayBound()) {
+    ASSERT(!FLAG_precompiled_mode);  // AOT uses non-deopting GenericCheckBound
     current->AsCheckArrayBound()->set_licm_hoisted(true);
   } else if (current->IsTestCids()) {
     current->AsTestCids()->set_licm_hoisted(true);
@@ -1589,13 +1587,13 @@
         }
 
         // For object allocation forward initial values of the fields to
-        // subsequent loads. For skip final fields.  Final fields are
-        // initialized in constructor that potentially can be not inlined into
-        // the function that we are currently optimizing. However at the same
-        // time we assume that values of the final fields can be forwarded
-        // across side-effects. If we add 'null' as known values for these
-        // fields here we will incorrectly propagate this null across
-        // constructor invocation.
+        // subsequent loads except for final fields of escaping objects.
+        // Final fields are initialized in constructor which potentially was
+        // not inlined into the function that we are currently optimizing.
+        // However at the same time we assume that values of the final fields
+        // can be forwarded across side-effects. If we add 'null' as known
+        // values for these fields here we will incorrectly propagate this
+        // null across constructor invocation.
         AllocateObjectInstr* alloc = instr->AsAllocateObject();
         if ((alloc != NULL)) {
           for (Value* use = alloc->input_use_list(); use != NULL;
@@ -1610,10 +1608,10 @@
               // Found a load. Initialize current value of the field to null for
               // normal fields, or with type arguments.
 
-              // Forward for all fields for non-escaping objects and only
-              // non-final fields and type arguments for escaping ones.
+              // If the object escapes then don't forward final fields - see
+              // the comment above for explanation.
               if (aliased_set_->CanBeAliased(alloc) &&
-                  (load->field() != NULL) && load->field()->is_final()) {
+                  load->slot().IsDartField() && load->slot().is_immutable()) {
                 continue;
               }
 
@@ -1622,7 +1620,8 @@
                 ASSERT(alloc->ArgumentCount() == 1);
                 intptr_t type_args_offset =
                     alloc->cls().type_arguments_field_offset();
-                if (load->offset_in_bytes() == type_args_offset) {
+                if (load->slot().IsTypeArguments() &&
+                    load->slot().offset_in_bytes() == type_args_offset) {
                   forward_def = alloc->PushArgumentAt(0)->value()->definition();
                 }
               }
@@ -2937,12 +2936,9 @@
 }
 
 // Add a field/offset to the list of fields if it is not yet present there.
-static bool AddSlot(ZoneGrowableArray<const Object*>* slots,
-                    const Object& slot) {
-  ASSERT(slot.IsSmi() || slot.IsField());
-  ASSERT(!slot.IsField() || Field::Cast(slot).IsOriginal());
-  for (intptr_t i = 0; i < slots->length(); i++) {
-    if ((*slots)[i]->raw() == slot.raw()) {
+static bool AddSlot(ZoneGrowableArray<const Slot*>* slots, const Slot& slot) {
+  for (auto s : *slots) {
+    if (s == &slot) {
       return false;
     }
   }
@@ -2993,7 +2989,7 @@
 void AllocationSinking::CreateMaterializationAt(
     Instruction* exit,
     Definition* alloc,
-    const ZoneGrowableArray<const Object*>& slots) {
+    const ZoneGrowableArray<const Slot*>& slots) {
   ZoneGrowableArray<Value*>* values =
       new (Z) ZoneGrowableArray<Value*>(slots.length());
 
@@ -3003,20 +2999,14 @@
   Instruction* load_point = FirstMaterializationAt(exit);
 
   // Insert load instruction for every field.
-  for (intptr_t i = 0; i < slots.length(); i++) {
+  for (auto slot : slots) {
     LoadFieldInstr* load =
-        slots[i]->IsField()
-            ? new (Z) LoadFieldInstr(
-                  new (Z) Value(alloc), &Field::Cast(*slots[i]),
-                  AbstractType::ZoneHandle(Z), alloc->token_pos(), NULL)
-            : new (Z) LoadFieldInstr(
-                  new (Z) Value(alloc), Smi::Cast(*slots[i]).Value(),
-                  AbstractType::ZoneHandle(Z), alloc->token_pos());
-    flow_graph_->InsertBefore(load_point, load, NULL, FlowGraph::kValue);
+        new (Z) LoadFieldInstr(new (Z) Value(alloc), *slot, alloc->token_pos());
+    flow_graph_->InsertBefore(load_point, load, nullptr, FlowGraph::kValue);
     values->Add(new (Z) Value(load));
   }
 
-  MaterializeObjectInstr* mat = NULL;
+  MaterializeObjectInstr* mat = nullptr;
   if (alloc->IsAllocateObject()) {
     mat = new (Z)
         MaterializeObjectInstr(alloc->AsAllocateObject(), slots, values);
@@ -3026,7 +3016,7 @@
         alloc->AsAllocateUninitializedContext(), slots, values);
   }
 
-  flow_graph_->InsertBefore(exit, mat, NULL, FlowGraph::kValue);
+  flow_graph_->InsertBefore(exit, mat, nullptr, FlowGraph::kValue);
 
   // Replace all mentions of this allocation with a newly inserted
   // MaterializeObject instruction.
@@ -3112,27 +3102,21 @@
 
 void AllocationSinking::InsertMaterializations(Definition* alloc) {
   // Collect all fields that are written for this instance.
-  ZoneGrowableArray<const Object*>* slots =
-      new (Z) ZoneGrowableArray<const Object*>(5);
+  auto slots = new (Z) ZoneGrowableArray<const Slot*>(5);
 
   for (Value* use = alloc->input_use_list(); use != NULL;
        use = use->next_use()) {
     StoreInstanceFieldInstr* store = use->instruction()->AsStoreInstanceField();
     if ((store != NULL) && (store->instance()->definition() == alloc)) {
-      if (!store->field().IsNull()) {
-        AddSlot(slots, Field::ZoneHandle(Z, store->field().Original()));
-      } else {
-        AddSlot(slots, Smi::ZoneHandle(Z, Smi::New(store->offset_in_bytes())));
-      }
+      AddSlot(slots, store->slot());
     }
   }
 
   if (alloc->ArgumentCount() > 0) {
     AllocateObjectInstr* alloc_object = alloc->AsAllocateObject();
     ASSERT(alloc_object->ArgumentCount() == 1);
-    intptr_t type_args_offset =
-        alloc_object->cls().type_arguments_field_offset();
-    AddSlot(slots, Smi::ZoneHandle(Z, Smi::New(type_args_offset)));
+    AddSlot(slots, Slot::GetTypeArgumentsSlotFor(flow_graph_->thread(),
+                                                 alloc_object->cls()));
   }
 
   // Collect all instructions that mention this object in the environment.
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.h b/runtime/vm/compiler/backend/redundancy_elimination.h
index 0e9e1dd..f759073 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.h
+++ b/runtime/vm/compiler/backend/redundancy_elimination.h
@@ -64,7 +64,7 @@
 
   void CreateMaterializationAt(Instruction* exit,
                                Definition* alloc,
-                               const ZoneGrowableArray<const Object*>& fields);
+                               const ZoneGrowableArray<const Slot*>& fields);
 
   void EliminateAllocation(Definition* alloc);
 
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
new file mode 100644
index 0000000..f1c01f9
--- /dev/null
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -0,0 +1,245 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/compiler/backend/slot.h"
+
+#ifndef DART_PRECOMPILED_RUNTIME
+
+#include "vm/compiler/compiler_state.h"
+#include "vm/hash_map.h"
+#include "vm/parser.h"
+#include "vm/scopes.h"
+
+namespace dart {
+
+// Canonicalization cache for Slot objects.
+//
+// This cache is attached to the CompilerState to ensure that we preserve
+// identity of Slot objects during each individual compilation.
+class SlotCache : public ZoneAllocated {
+ public:
+  // Returns an instance of SlotCache for the current compilation.
+  static SlotCache& Instance(Thread* thread) {
+    auto result = thread->compiler_state().slot_cache();
+    if (result == nullptr) {
+      result = new (thread->zone()) SlotCache(thread);
+      thread->compiler_state().set_slot_cache(result);
+    }
+    return *result;
+  }
+
+  const Slot& Canonicalize(const Slot& value) {
+    auto result = fields_.LookupValue(&value);
+    if (result == nullptr) {
+      result = new (zone_) Slot(value);
+      fields_.Insert(result);
+    }
+    return *result;
+  }
+
+ private:
+  explicit SlotCache(Thread* thread)
+      : zone_(thread->zone()), fields_(thread->zone()) {}
+
+  Zone* const zone_;
+  DirectChainedHashMap<PointerKeyValueTrait<const Slot> > fields_;
+};
+
+const Slot& Slot::GetNativeSlot(Kind kind) {
+  // There is a fixed statically known number of native slots so we cache
+  // them statically.
+  static const Slot fields[] = {
+#define FIELD_FINAL (IsImmutableBit::encode(true))
+#define FIELD_VAR (0)
+#define DEFINE_NATIVE_FIELD(ClassName, FieldName, cid, mutability)             \
+  Slot(Kind::k##ClassName##_##FieldName, FIELD_##mutability, k##cid##Cid,      \
+       ClassName::FieldName##_offset(), #ClassName "." #FieldName, nullptr),
+
+      NATIVE_SLOTS_LIST(DEFINE_NATIVE_FIELD)
+
+#undef DEFINE_FIELD
+#undef FIELD_VAR
+#undef FIELD_FINAL
+  };
+
+  ASSERT(static_cast<uint8_t>(kind) < ARRAY_SIZE(fields));
+  return fields[static_cast<uint8_t>(kind)];
+}
+
+// Note: should only be called with cids of array-like classes.
+const Slot& Slot::GetLengthFieldForArrayCid(intptr_t array_cid) {
+  if (RawObject::IsExternalTypedDataClassId(array_cid) ||
+      RawObject::IsTypedDataClassId(array_cid)) {
+    return GetNativeSlot(Kind::kTypedData_length);
+  }
+
+  switch (array_cid) {
+    case kGrowableObjectArrayCid:
+      return GetNativeSlot(Kind::kGrowableObjectArray_length);
+
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
+    case kExternalOneByteStringCid:
+    case kExternalTwoByteStringCid:
+      return GetNativeSlot(Kind::kString_length);
+
+    case kArrayCid:
+    case kImmutableArrayCid:
+      return GetNativeSlot(Kind::kArray_length);
+
+    default:
+      UNREACHABLE();
+      return GetNativeSlot(Kind::kArray_length);
+  }
+}
+
+const Slot& Slot::GetTypeArgumentsSlotAt(Thread* thread, intptr_t offset) {
+  ASSERT(offset != Class::kNoTypeArguments);
+  return SlotCache::Instance(thread).Canonicalize(Slot(
+      Kind::kTypeArguments, IsImmutableBit::encode(true), kTypeArgumentsCid,
+      offset, ":type_arguments", /*static_type=*/nullptr));
+}
+
+const Slot& Slot::GetTypeArgumentsSlotFor(Thread* thread, const Class& cls) {
+  return GetTypeArgumentsSlotAt(thread, cls.type_arguments_field_offset());
+}
+
+const Slot& Slot::GetContextVariableSlotFor(Thread* thread,
+                                            const LocalVariable& variable) {
+  ASSERT(variable.is_captured());
+  // TODO(vegorov) Can't assign static type to local variables because
+  // for captured parameters we generate the code that first stores a
+  // variable into the context and then loads it from the context to perform
+  // the type check.
+  return SlotCache::Instance(thread).Canonicalize(Slot(
+      Kind::kCapturedVariable,
+      IsImmutableBit::encode(variable.is_final()) | IsNullableBit::encode(true),
+      kDynamicCid, Context::variable_offset(variable.index().value()),
+      &variable.name(), /*static_type=*/nullptr));
+}
+
+const Slot& Slot::Get(const Field& field,
+                      const ParsedFunction* parsed_function) {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  intptr_t nullable_cid = kDynamicCid;
+  bool is_nullable = true;
+
+  if (field.has_pragma()) {
+    const intptr_t cid = MethodRecognizer::ResultCidFromPragma(field);
+    if (cid != kDynamicCid) {
+      nullable_cid = cid;
+      is_nullable = false;
+    } else if (MethodRecognizer::HasNonNullableResultTypeFromPragma(field)) {
+      is_nullable = false;
+    }
+  }
+
+  bool used_guarded_state = false;
+  if (field.guarded_cid() != kIllegalCid &&
+      field.guarded_cid() != kDynamicCid) {
+    // Use guarded state if it is more precise then what we already have.
+    if (nullable_cid == kDynamicCid) {
+      nullable_cid = field.guarded_cid();
+      used_guarded_state = true;
+    }
+
+    if (is_nullable && !field.is_nullable()) {
+      is_nullable = false;
+      used_guarded_state = true;
+    }
+  }
+
+  const Slot& slot = SlotCache::Instance(thread).Canonicalize(
+      Slot(Kind::kDartField,
+           IsImmutableBit::encode(field.is_final() || field.is_const()) |
+               IsNullableBit::encode(is_nullable) |
+               IsGuardedBit::encode(used_guarded_state),
+           nullable_cid, field.Offset(), &field,
+           &AbstractType::ZoneHandle(zone, field.type())));
+
+  // If properties of this slot were based on the guarded state make sure
+  // to add the field to the list of guarded fields. Note that during background
+  // compilation we might have two field clones that have incompatible guarded
+  // state - however both of these clones would correspond to the same slot.
+  // That is why we check the is_guarded_field() property of the slot rather
+  // than look at the current guarded state of the field, because current
+  // guarded state of the field might be set to kDynamicCid, while it was
+  // set to something more concrete when the slot was created.
+  // Note that we could have created this slot during an unsuccessful inlining
+  // attempt where we built and discarded the graph, in this case guarded
+  // fields associated with that graph are also discarded. However the slot
+  // itself stays behind in the compilation global cache. Thus we must always
+  // try to add it to the list of guarded fields of the current function.
+  if (slot.is_guarded_field()) {
+    if (thread->isolate()->use_field_guards()) {
+      ASSERT(parsed_function != nullptr);
+      parsed_function->AddToGuardedFields(&slot.field());
+    } else {
+      // In precompiled mode we use guarded_cid field for type information
+      // inferred by TFA.
+      ASSERT(FLAG_precompiled_mode);
+    }
+  }
+
+  return slot;
+}
+
+CompileType Slot::ComputeCompileType() const {
+  return CompileType::CreateNullable(is_nullable(), nullable_cid());
+}
+
+const AbstractType& Slot::static_type() const {
+  return static_type_ != nullptr ? *static_type_ : Object::null_abstract_type();
+}
+
+const char* Slot::Name() const {
+  if (IsLocalVariable()) {
+    return DataAs<const String>()->ToCString();
+  } else if (IsDartField()) {
+    return String::Handle(field().name()).ToCString();
+  } else {
+    return DataAs<const char>();
+  }
+}
+
+bool Slot::Equals(const Slot* other) const {
+  if (kind_ != other->kind_) {
+    return false;
+  }
+
+  switch (kind_) {
+    case Kind::kTypeArguments:
+      return (offset_in_bytes_ == other->offset_in_bytes_);
+
+    case Kind::kCapturedVariable:
+      return (offset_in_bytes_ == other->offset_in_bytes_) &&
+             (flags_ == other->flags_) &&
+             (DataAs<const String>()->raw() ==
+              other->DataAs<const String>()->raw());
+
+    case Kind::kDartField:
+      return (offset_in_bytes_ == other->offset_in_bytes_) &&
+             other->DataAs<const Field>()->Original() ==
+                 DataAs<const Field>()->Original();
+
+    default:
+      UNREACHABLE();
+      return false;
+  }
+}
+
+intptr_t Slot::Hashcode() const {
+  intptr_t result = (static_cast<int8_t>(kind_) * 63 + offset_in_bytes_) * 31;
+  if (IsDartField()) {
+    result += String::Handle(DataAs<const Field>()->name()).Hash();
+  } else if (IsLocalVariable()) {
+    result += DataAs<const String>()->Hash();
+  }
+  return result;
+}
+
+}  // namespace dart
+
+#endif  // DART_PRECOMPILED_RUNTIME
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
new file mode 100644
index 0000000..d448e40
--- /dev/null
+++ b/runtime/vm/compiler/backend/slot.h
@@ -0,0 +1,219 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Slot is an abstraction that describes an readable (and possibly writeable)
+// location within an object.
+//
+// In general slots follow the memory model for normal Dart fields - but can
+// also be used to describe locations that don't have corresponding Field
+// object, i.e. fields within native objects like arrays or contexts.
+//
+// Slot objects created by the compiler have an identity. If two slots F and G
+// are different then compiler assumes that store into F can't alias a load
+// from G and vice versa.
+//
+// All slots can be split into 4 categories:
+//
+//   - slots for fields of native classes (Array, Closure, etc);
+//   - slots for type arguments;
+//   - slots for captured variable;
+//   - slots for normal Dart fields (e.g. those that Field object).
+//
+
+#ifndef RUNTIME_VM_COMPILER_BACKEND_SLOT_H_
+#define RUNTIME_VM_COMPILER_BACKEND_SLOT_H_
+
+#include "vm/compiler/backend/compile_type.h"
+#include "vm/thread.h"
+
+namespace dart {
+
+class LocalScope;
+class LocalVariable;
+class ParsedFunction;
+
+// List of slots that correspond to fields of native objects in the following
+// format:
+//
+//     V(class_name, field_name, exact_type, FINAL|VAR)
+//
+// - class_name and field_name specify the name of the host class and the name
+//   of the field respectively;
+// - exact_type specifies exact type of the field (any load from this field
+//   would only yield instances of this type);
+// - the last component specifies whether field behaves like a final field
+//   (i.e. initialized once at construction time and does not change after
+//   that) or like a non-final field.
+//
+// Note: native slots are expected to be non-nullable.
+#define NATIVE_SLOTS_LIST(V)                                                   \
+  V(Array, length, Smi, FINAL)                                                 \
+  V(Context, parent, Context, FINAL)                                           \
+  V(Closure, instantiator_type_arguments, TypeArguments, FINAL)                \
+  V(Closure, delayed_type_arguments, TypeArguments, FINAL)                     \
+  V(Closure, function_type_arguments, TypeArguments, FINAL)                    \
+  V(Closure, function, Function, FINAL)                                        \
+  V(Closure, context, Context, FINAL)                                          \
+  V(Closure, hash, Context, VAR)                                               \
+  V(GrowableObjectArray, length, Smi, VAR)                                     \
+  V(GrowableObjectArray, data, Array, VAR)                                     \
+  V(TypedData, length, Smi, FINAL)                                             \
+  V(String, length, Smi, FINAL)                                                \
+  V(LinkedHashMap, index, TypedDataUint32Array, VAR)                           \
+  V(LinkedHashMap, data, Array, VAR)                                           \
+  V(LinkedHashMap, hash_mask, Smi, VAR)                                        \
+  V(LinkedHashMap, used_data, Smi, VAR)                                        \
+  V(LinkedHashMap, deleted_keys, Smi, VAR)                                     \
+  V(ArgumentsDescriptor, type_args_len, Smi, FINAL)                            \
+  V(ArgumentsDescriptor, positional_count, Smi, FINAL)                         \
+  V(ArgumentsDescriptor, count, Smi, FINAL)
+
+// Slot is an abstraction that describes an readable (and possibly writeable)
+// location within an object.
+//
+// Slot objects returned by Slot::Get* methods have identity and can be
+// compared by pointer. If two slots are different they must not alias.
+// If two slots can alias - they must be represented by identical
+// slot object.
+class Slot : public ZoneAllocated {
+ public:
+  // clang-format off
+  enum class Kind : uint8_t {
+    // Native slots are identified by their kind - each native slot has its own.
+#define DECLARE_KIND(ClassName, FieldName, cid, mutability)                    \
+  k##ClassName##_##FieldName,
+    NATIVE_SLOTS_LIST(DECLARE_KIND)
+#undef DECLARE_KIND
+
+    // A slot used to store type arguments.
+    kTypeArguments,
+
+    // A slot within a Context object that contains a value of a captured
+    // local variable.
+    kCapturedVariable,
+
+    // A slot that corresponds to a Dart field (has corresponding Field object).
+    kDartField,
+  };
+  // clang-format on
+
+  // Returns a slot that represents length field for the given [array_cid].
+  static const Slot& GetLengthFieldForArrayCid(intptr_t array_cid);
+
+  // Return a slot that represents type arguments field at the given offset
+  // or for the given class.
+  //
+  // We do not distinguish type argument fields within disjoint
+  // class hierarchies: type argument fields at the same offset would be
+  // represented by the same Slot object. Type argument slots are final
+  // so disambiguating type arguments fields does not improve alias analysis.
+  static const Slot& GetTypeArgumentsSlotAt(Thread* thread, intptr_t offset);
+  static const Slot& GetTypeArgumentsSlotFor(Thread* thread, const Class& cls);
+
+  // Returns a slot that represents the given captured local variable.
+  static const Slot& GetContextVariableSlotFor(Thread* thread,
+                                               const LocalVariable& var);
+
+  // Returns a slot that represents the given Dart field.
+  static const Slot& Get(const Field& field,
+                         const ParsedFunction* parsed_function);
+
+  // Convenience getters for native slots.
+#define DEFINE_GETTER(ClassName, FieldName, cid, mutability)                   \
+  static const Slot& ClassName##_##FieldName() {                               \
+    return GetNativeSlot(Kind::k##ClassName##_##FieldName);                    \
+  }
+
+  NATIVE_SLOTS_LIST(DEFINE_GETTER)
+#undef DEFINE_GETTER
+
+  Kind kind() const { return kind_; }
+  bool IsDartField() const { return kind() == Kind::kDartField; }
+  bool IsLocalVariable() const { return kind() == Kind::kCapturedVariable; }
+  bool IsTypeArguments() const { return kind() == Kind::kTypeArguments; }
+
+  const char* Name() const;
+
+  intptr_t offset_in_bytes() const { return offset_in_bytes_; }
+
+  bool is_immutable() const { return IsImmutableBit::decode(flags_); }
+
+  intptr_t nullable_cid() const { return cid_; }
+  intptr_t is_nullable() const { return IsNullableBit::decode(flags_); }
+
+  // Returns true if properties of this slot were based on the guarded state
+  // of the corresponding Dart field.
+  bool is_guarded_field() const { return IsGuardedBit::decode(flags_); }
+
+  // Static type of the slots if any.
+  //
+  // A value that is read from the slot is guaranteed to be assignable to its
+  // static type.
+  const AbstractType& static_type() const;
+
+  // More precise type information about values that can be read from this slot.
+  CompileType ComputeCompileType() const;
+
+  const Field& field() const {
+    ASSERT(IsDartField());
+    ASSERT(data_ != nullptr);
+    return *DataAs<const Field>();
+  }
+
+  bool Equals(const Slot* other) const;
+  intptr_t Hashcode() const;
+
+ private:
+  Slot(Kind kind,
+       int8_t bits,
+       int16_t cid,
+       intptr_t offset_in_bytes,
+       const void* data,
+       const AbstractType* static_type)
+      : kind_(kind),
+        flags_(bits),
+        cid_(cid),
+        offset_in_bytes_(offset_in_bytes),
+        data_(data),
+        static_type_(static_type) {}
+
+  Slot(const Slot& other)
+      : Slot(other.kind_,
+             other.flags_,
+             other.cid_,
+             other.offset_in_bytes_,
+             other.data_,
+             other.static_type_) {}
+
+  using IsImmutableBit = BitField<int8_t, bool, 0, 1>;
+  using IsNullableBit = BitField<int8_t, bool, IsImmutableBit::kNextBit, 1>;
+  using IsGuardedBit = BitField<int8_t, bool, IsNullableBit::kNextBit, 1>;
+
+  template <typename T>
+  const T* DataAs() const {
+    return static_cast<const T*>(data_);
+  }
+
+  static const Slot& GetNativeSlot(Kind kind);
+
+  const Kind kind_;
+  const int8_t flags_;  // is_immutable, is_nullable
+  const int16_t cid_;   // Concrete cid of a value or kDynamicCid.
+
+  const intptr_t offset_in_bytes_;
+
+  // Kind dependent data:
+  //   - name as a Dart String object for local variables;
+  //   - name as a C string for native slots;
+  //   - Field object for Dart fields;
+  const void* data_;
+
+  const AbstractType* static_type_;
+
+  friend class SlotCache;
+};
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_COMPILER_BACKEND_SLOT_H_
diff --git a/runtime/vm/compiler/backend/slot_test.cc b/runtime/vm/compiler/backend/slot_test.cc
new file mode 100644
index 0000000..9e81ee5
--- /dev/null
+++ b/runtime/vm/compiler/backend/slot_test.cc
@@ -0,0 +1,104 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "include/dart_api.h"
+
+#include "platform/globals.h"
+
+#include "vm/compiler/backend/slot.h"
+#include "vm/compiler/compiler_state.h"
+#include "vm/object.h"
+#include "vm/parser.h"
+#include "vm/symbols.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+// This is a regression test for b/121271056: there might be a race between
+// background compiler and mutator where mutator changes guarded state of
+// the field after Slot was created from it. A situation is possible where we
+// have a clone of a field with its guarded state set to unknown, however
+// Slot::Get for this field returns a Slot created from the previous clone of
+// the same field with a known guarded state. In this case we must add *old*
+// clone from which the Slot was created to guarded fields and not the new
+// clone, because new clone has no guarded state to begin with and thus
+// ParsedFunction::AddToGuardedFields(...) would simply ignore it.
+// Such slots with inconsistent guarded state that are not in the current
+// list of guarded fields arise due to unsuccessful inlining attempts.
+// If we built and discard the graph, then guarded fields associated with
+// that graph are also discarded. However the slot itself stays behind in
+// the global cache.
+// Adding old clone would lead to correct rejection of the compilation
+// attempt because Slot type information is different from the current guarded
+// state of the field.
+TEST_CASE(SlotFromGuardedField) {
+  if (!FLAG_use_field_guards) {
+    return;
+  }
+
+  TransitionNativeToVM transition(thread);
+  Zone* zone = thread->zone();
+
+  // Setup: create dummy class, function and a field.
+  const Class& dummy_class = Class::Handle(Class::New(
+      Library::Handle(), String::Handle(Symbols::New(thread, "DummyClass")),
+      Script::Handle(), TokenPosition::kNoSource));
+  dummy_class.set_is_synthesized_class();
+
+  const Function& dummy_function = Function::ZoneHandle(
+      Function::New(String::Handle(Symbols::New(thread, "foo")),
+                    RawFunction::kRegularFunction, false, false, false, false,
+                    false, dummy_class, TokenPosition::kMinSource));
+
+  const Field& field = Field::Handle(
+      Field::New(String::Handle(Symbols::New(thread, "field")),
+                 /*is_static=*/false, /*is_final=*/false, /*is_const=*/false,
+                 /*is_reflectable=*/true, dummy_class, Object::dynamic_type(),
+                 TokenPosition::kMinSource, TokenPosition::kMinSource));
+
+  // Set non-trivial guarded state on the field.
+  field.set_guarded_cid(kSmiCid);
+  field.set_is_nullable(false);
+
+  // Enter compiler state.
+  CompilerState compiler_state(thread);
+
+  const Field& field_clone_1 = Field::ZoneHandle(field.CloneFromOriginal());
+  const Field& field_clone_2 = Field::ZoneHandle(field.CloneFromOriginal());
+
+  // Check that Slot::Get() returns correctly canonicalized and configured
+  // slot that matches properties of the field.
+  ParsedFunction* parsed_function =
+      new (zone) ParsedFunction(thread, dummy_function);
+  const Slot& slot1 = Slot::Get(field_clone_1, parsed_function);
+  const Slot& slot2 = Slot::Get(field_clone_2, parsed_function);
+  EXPECT_EQ(&slot1, &slot2);
+  EXPECT(slot1.is_guarded_field());
+  EXPECT(!slot1.is_nullable());
+  EXPECT_EQ(kSmiCid, slot1.nullable_cid());
+
+  // Check that the field was added (once) to the list of guarded fields.
+  EXPECT_EQ(1, parsed_function->guarded_fields()->length());
+  EXPECT_EQ(parsed_function->guarded_fields()->At(0)->raw(),
+            field_clone_1.raw());
+
+  // Change the guarded state of the field to "unknown" - emulating concurrent
+  // modification of the guarded state in mutator) and create a new clone of
+  // the field.
+  field.set_guarded_cid(kDynamicCid);
+  field.set_is_nullable(true);
+  const Field& field_clone_3 = Field::ZoneHandle(field.CloneFromOriginal());
+
+  // Slot::Get must return the same slot and add the field from which it
+  // was created to the guarded fields list.
+  ParsedFunction* parsed_function2 =
+      new (zone) ParsedFunction(thread, dummy_function);
+  const Slot& slot3 = Slot::Get(field_clone_3, parsed_function2);
+  EXPECT_EQ(&slot1, &slot3);
+  EXPECT_EQ(1, parsed_function2->guarded_fields()->length());
+  EXPECT_EQ(parsed_function2->guarded_fields()->At(0)->raw(),
+            field_clone_1.raw());
+}
+
+}  // namespace dart
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 45f0f84..cb7360e 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -283,7 +283,7 @@
 void FlowGraphTypePropagator::VisitCheckNull(CheckNullInstr* check) {
   Definition* receiver = check->value()->definition();
   CompileType* type = TypeOf(receiver);
-  if (type->is_nullable()) {
+  if (type->is_nullable() && !type->IsNull()) {
     // Insert redefinition for the receiver to guard against invalid
     // code motion.
     EnsureMoreAccurateRedefinition(check, receiver, type->CopyNonNullable());
@@ -305,7 +305,7 @@
   if (target.IsNull()) {
     // If the selector is not defined on Null, we can propagate non-nullness.
     CompileType* type = TypeOf(receiver);
-    if (type->is_nullable()) {
+    if (type->is_nullable() && !type->IsNull()) {
       // Insert redefinition for the receiver to guard against invalid
       // code motion.
       EnsureMoreAccurateRedefinition(call, receiver, type->CopyNonNullable());
@@ -543,12 +543,10 @@
   }
 
   const AbstractType* other_abstract_type = other->ToAbstractType();
-  if (abstract_type->IsMoreSpecificThan(*other_abstract_type, NULL, NULL,
-                                        Heap::kOld)) {
+  if (abstract_type->IsSubtypeOf(*other_abstract_type, Heap::kOld)) {
     type_ = other_abstract_type;
     return;
-  } else if (other_abstract_type->IsMoreSpecificThan(*abstract_type, NULL, NULL,
-                                                     Heap::kOld)) {
+  } else if (other_abstract_type->IsSubtypeOf(*abstract_type, Heap::kOld)) {
     return;  // Nothing to do.
   }
 
@@ -558,7 +556,7 @@
     Class& cls = Class::Handle(abstract_type->type_class());
     for (; !cls.IsNull() && !cls.IsGeneric(); cls = cls.SuperClass()) {
       type_ = &AbstractType::ZoneHandle(cls.RareType());
-      if (other_abstract_type->IsSubtypeOf(*type_, NULL, NULL, Heap::kOld)) {
+      if (other_abstract_type->IsSubtypeOf(*type_, Heap::kOld)) {
         // Found suitable supertype: keep type_ only.
         cid_ = kDynamicCid;
         return;
@@ -596,8 +594,7 @@
   const AbstractType* new_abstract_type = new_type->ToAbstractType();
 
   CompileType* preferred_type;
-  if (old_abstract_type->IsMoreSpecificThan(*new_abstract_type, NULL, NULL,
-                                            Heap::kOld)) {
+  if (old_abstract_type->IsSubtypeOf(*new_abstract_type, Heap::kOld)) {
     // Prefer old type, as it is clearly more specific.
     preferred_type = old_type;
   } else {
@@ -648,7 +645,11 @@
 }
 
 CompileType CompileType::Int() {
-  return FromAbstractType(Type::ZoneHandle(Type::Int64Type()), kNonNullable);
+  return FromAbstractType(Type::ZoneHandle(Type::IntType()), kNonNullable);
+}
+
+CompileType CompileType::NullableInt() {
+  return FromAbstractType(Type::ZoneHandle(Type::IntType()), kNullable);
 }
 
 CompileType CompileType::Smi() {
@@ -659,6 +660,10 @@
   return Create(kDoubleCid, Type::ZoneHandle(Type::Double()));
 }
 
+CompileType CompileType::NullableDouble() {
+  return FromAbstractType(Type::ZoneHandle(Type::Double()), kNullable);
+}
+
 CompileType CompileType::String() {
   return FromAbstractType(Type::ZoneHandle(Type::StringType()), kNonNullable);
 }
@@ -684,15 +689,13 @@
     if (type_ == NULL) {
       // Type propagation is turned off or has not yet run.
       return kDynamicCid;
-    } else if (type_->IsMalformed()) {
-      cid_ = kDynamicCid;
     } else if (type_->IsVoidType()) {
       cid_ = kDynamicCid;
     } else if (type_->IsNullType()) {
       cid_ = kNullCid;
     } else if (type_->IsFunctionType() || type_->IsDartFunctionType()) {
       cid_ = kClosureCid;
-    } else if (type_->HasResolvedTypeClass()) {
+    } else if (type_->type_class_id() != kIllegalCid) {
       const Class& type_class = Class::Handle(type_->type_class());
       Thread* thread = Thread::Current();
       CHA& cha = thread->compiler_state().cha();
@@ -753,11 +756,7 @@
     Isolate* I = Isolate::Current();
     const Class& type_class = Class::Handle(I->class_table()->At(cid_));
     if (type_class.NumTypeArguments() > 0) {
-      if (FLAG_strong) {
-        type_ = &AbstractType::ZoneHandle(type_class.RareType());
-      } else {
-        type_ = &Object::dynamic_type();
-      }
+      type_ = &AbstractType::ZoneHandle(type_class.RareType());
     } else {
       type_ = &Type::ZoneHandle(Type::NewNonParameterizedType(type_class));
     }
@@ -770,11 +769,6 @@
                                          bool is_nullable,
                                          bool* is_instance) {
   ASSERT(is_instance != NULL);
-  // We cannot give an answer if the given type is malformed or malbounded.
-  if (type.IsMalformedOrMalbounded()) {
-    return false;
-  }
-
   if (type.IsDynamicType() || type.IsObjectType() || type.IsVoidType()) {
     *is_instance = true;
     return true;
@@ -787,10 +781,6 @@
   // Consider the compile type of the value.
   const AbstractType& compile_type = *ToAbstractType();
 
-  if (compile_type.IsMalformedOrMalbounded()) {
-    return false;
-  }
-
   // The null instance is an instance of Null, of Object, and of dynamic.
   // Functions that do not explicitly return a value, implicitly return null,
   // except generative constructors, which return the object being constructed.
@@ -807,16 +797,16 @@
     return false;
   }
 
-  *is_instance = compile_type.IsMoreSpecificThan(type, NULL, NULL, Heap::kOld);
+  *is_instance = compile_type.IsSubtypeOf(type, Heap::kOld);
   return *is_instance;
 }
 
-bool CompileType::IsMoreSpecificThan(const AbstractType& other) {
+bool CompileType::IsSubtypeOf(const AbstractType& other) {
   if (IsNone()) {
     return false;
   }
 
-  return ToAbstractType()->IsMoreSpecificThan(other, NULL, NULL, Heap::kOld);
+  return ToAbstractType()->IsSubtypeOf(other, Heap::kOld);
 }
 
 CompileType* Value::Type() {
@@ -879,8 +869,7 @@
       return CompileType::CreateNullable(is_nullable,
                                          constrained_type_->ToNullableCid());
     }
-    if (value()->Type()->IsMoreSpecificThan(
-            *constrained_type_->ToAbstractType())) {
+    if (value()->Type()->IsSubtypeOf(*constrained_type_->ToAbstractType())) {
       return is_nullable ? *value()->Type()
                          : value()->Type()->CopyNonNullable();
     } else {
@@ -965,7 +954,7 @@
     // Receiver can't be null but can be an instance of a subclass.
     intptr_t cid = kDynamicCid;
 
-    if (type.HasResolvedTypeClass()) {
+    if (type.type_class_id() != kIllegalCid) {
       Thread* thread = Thread::Current();
       const Class& type_class = Class::Handle(type.type_class());
       if (!CHA::HasSubclasses(type_class)) {
@@ -995,6 +984,9 @@
     return CompileType(CompileType::kNonNullable, cid, &type);
   }
 
+  const bool is_unchecked_entry_param =
+      graph_entry->unchecked_entry() == block_;
+
   if (Isolate::Current()->can_use_strong_mode_types()) {
     LocalScope* scope = graph_entry->parsed_function().node_sequence()->scope();
     // Note: in catch-blocks we have ParameterInstr for each local variable
@@ -1014,7 +1006,9 @@
       }
       // If parameter type was checked by caller, then use Dart type annotation,
       // plus non-nullability from inferred type if known.
-      if (param->was_type_checked_by_caller()) {
+      if (param->was_type_checked_by_caller() ||
+          (is_unchecked_entry_param &&
+           !param->is_explicit_covariant_parameter())) {
         const bool is_nullable =
             (inferred_type == NULL) || inferred_type->is_nullable();
         TraceStrongModeType(this, param->type());
@@ -1057,7 +1051,7 @@
 CompileType AssertAssignableInstr::ComputeType() const {
   CompileType* value_type = value()->Type();
 
-  if (value_type->IsMoreSpecificThan(dst_type())) {
+  if (value_type->IsSubtypeOf(dst_type())) {
     return *value_type;
   }
 
@@ -1173,17 +1167,23 @@
 }
 
 CompileType PolymorphicInstanceCallInstr::ComputeType() const {
+  bool is_nullable = CompileType::kNullable;
   if (IsSureToCallSingleRecognizedTarget()) {
     const Function& target = *targets_.TargetAt(0)->target;
-    if (target.recognized_kind() != MethodRecognizer::kUnknown) {
-      return CompileType::FromCid(MethodRecognizer::ResultCid(target));
+    if (target.has_pragma()) {
+      const intptr_t cid = MethodRecognizer::ResultCidFromPragma(target);
+      if (cid != kDynamicCid) {
+        return CompileType::FromCid(cid);
+      } else if (MethodRecognizer::HasNonNullableResultTypeFromPragma(target)) {
+        is_nullable = CompileType::kNonNullable;
+      }
     }
   }
 
   if (Isolate::Current()->can_use_strong_mode_types()) {
     CompileType* type = instance_call()->Type();
     TraceStrongModeType(this, type);
-    return *type;
+    return is_nullable ? *type : type->CopyNonNullable();
   }
 
   return CompileType::Dynamic();
@@ -1198,21 +1198,27 @@
     return *inferred_type;
   }
 
-  if (function_.recognized_kind() != MethodRecognizer::kUnknown) {
-    return CompileType::FromCid(MethodRecognizer::ResultCid(function_));
+  bool is_nullable = CompileType::kNullable;
+  if (function_.has_pragma()) {
+    const intptr_t cid = MethodRecognizer::ResultCidFromPragma(function_);
+    if (cid != kDynamicCid) {
+      return CompileType::FromCid(cid);
+    }
+    if (MethodRecognizer::HasNonNullableResultTypeFromPragma(function_)) {
+      is_nullable = CompileType::kNonNullable;
+    }
   }
 
-  const Isolate* isolate = Isolate::Current();
-  if (isolate->can_use_strong_mode_types() || isolate->type_checks()) {
+  if (Isolate::Current()->can_use_strong_mode_types()) {
     const AbstractType& result_type =
         AbstractType::ZoneHandle(function().result_type());
     // TODO(dartbug.com/30480): instantiate generic result_type if possible.
-    // Also, consider fixing AbstractType::IsMoreSpecificThan to handle
+    // Also, consider fixing AbstractType::IsSubtypeOf to handle
     // non-instantiated types properly.
     if (result_type.IsInstantiated()) {
       TraceStrongModeType(this, result_type);
-      const bool is_nullable =
-          (inferred_type == NULL) || inferred_type->is_nullable();
+      is_nullable = is_nullable &&
+                    (inferred_type == nullptr || inferred_type->is_nullable());
       return CompileType::FromAbstractType(result_type, is_nullable);
     }
   }
@@ -1221,8 +1227,7 @@
 }
 
 CompileType LoadLocalInstr::ComputeType() const {
-  const Isolate* isolate = Isolate::Current();
-  if (isolate->can_use_strong_mode_types() || isolate->type_checks()) {
+  if (Isolate::Current()->can_use_strong_mode_types()) {
     const AbstractType& local_type = local().type();
     TraceStrongModeType(this, local_type);
     return CompileType::FromAbstractType(local_type);
@@ -1257,8 +1262,7 @@
   intptr_t cid = kDynamicCid;
   AbstractType* abstract_type = NULL;
   const Field& field = this->StaticField();
-  const Isolate* isolate = Isolate::Current();
-  if (isolate->can_use_strong_mode_types() || isolate->type_checks()) {
+  if (Isolate::Current()->can_use_strong_mode_types()) {
     cid = kIllegalCid;  // Abstract type is known, calculate cid lazily.
     abstract_type = &AbstractType::ZoneHandle(field.type());
     TraceStrongModeType(this, *abstract_type);
@@ -1306,36 +1310,26 @@
 }
 
 CompileType LoadFieldInstr::ComputeType() const {
-  // Type may be null if the field is a VM field, e.g. context parent.
-  // Keep it as null for debug purposes and do not return dynamic in production
-  // mode, since misuse of the type would remain undetected.
-  if (type().IsNull()) {
-    return CompileType::Dynamic();
+  const AbstractType& field_type = slot().static_type();
+  CompileType compile_type_cid = slot().ComputeCompileType();
+  if (field_type.raw() == AbstractType::null()) {
+    return compile_type_cid;
   }
 
   const Isolate* isolate = Isolate::Current();
-  bool is_nullable = CompileType::kNullable;
-  intptr_t cid = kDynamicCid;
   const AbstractType* abstract_type = NULL;
   if (isolate->can_use_strong_mode_types() ||
-      (isolate->type_checks() &&
-       (type().IsFunctionType() || type().HasResolvedTypeClass()))) {
-    cid = kIllegalCid;  // Abstract type is known, calculate cid lazily.
-    abstract_type = &type();
+      (field_type.IsFunctionType() || field_type.HasTypeClass())) {
+    abstract_type = &field_type;
     TraceStrongModeType(this, *abstract_type);
   }
-  if ((field_ != NULL) && (field_->guarded_cid() != kIllegalCid) &&
-      (field_->guarded_cid() != kDynamicCid)) {
-    cid = field_->guarded_cid();
-    is_nullable = field_->is_nullable();
-    abstract_type = nullptr;  // Cid is known, calculate abstract type lazily.
-  } else {
-    cid = result_cid_;
-    if ((cid != kIllegalCid) && (cid != kDynamicCid)) {
-      abstract_type = nullptr;  // Cid is known, calculate abstract type lazily.
-    }
+
+  if (compile_type_cid.ToNullableCid() != kDynamicCid) {
+    abstract_type = nullptr;
   }
-  return CompileType(is_nullable, cid, abstract_type);
+
+  return CompileType(compile_type_cid.is_nullable(),
+                     compile_type_cid.ToNullableCid(), abstract_type);
 }
 
 CompileType LoadCodeUnitsInstr::ComputeType() const {
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index c07b6f4..3d3404e 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -187,6 +187,10 @@
             VisitInstanceCall(call);
           }
         }
+      } else if (auto static_call = instr->AsStaticCall()) {
+        // If TFA devirtualized instance calls to static calls we also want to
+        // process them here.
+        VisitStaticCall(static_call);
       } else if (instr->IsPolymorphicInstanceCall()) {
         SpecializePolymorphicInstanceCall(instr->AsPolymorphicInstanceCall());
       }
@@ -894,19 +898,17 @@
 
 void CallSpecializer::InlineImplicitInstanceGetter(Definition* call,
                                                    const Field& field) {
+  const Slot& slot = Slot::Get(field, &flow_graph()->parsed_function());
   LoadFieldInstr* load = new (Z) LoadFieldInstr(
-      new (Z) Value(call->ArgumentAt(0)), &field,
-      AbstractType::ZoneHandle(Z, field.type()), call->token_pos(),
-      isolate()->use_field_guards() ? &flow_graph()->parsed_function() : NULL);
-  load->set_is_immutable(field.is_final());
+      new (Z) Value(call->ArgumentAt(0)), slot, call->token_pos());
 
   // Discard the environment from the original instruction because the load
   // can't deoptimize.
   call->RemoveEnvironment();
   ReplaceCall(call, load);
 
-  if (load->result_cid() != kDynamicCid) {
-    // Reset value types if guarded_cid was used.
+  if (load->slot().nullable_cid() != kDynamicCid) {
+    // Reset value types if we know concrete cid.
     for (Value::Iterator it(load->input_use_list()); !it.Done(); it.Advance()) {
       it.Current()->SetReachingType(NULL);
     }
@@ -1003,8 +1005,7 @@
     // Compute if we need to type check the value. Always type check if
     // not in strong mode or if at a dynamic invocation.
     bool needs_check = true;
-    if (FLAG_strong && !instr->interface_target().IsNull() &&
-        (field.kernel_offset() >= 0)) {
+    if (!instr->interface_target().IsNull() && (field.kernel_offset() >= 0)) {
       bool is_covariant = false;
       bool is_generic_covariant = false;
       field.GetCovarianceAttributes(&is_covariant, &is_generic_covariant);
@@ -1034,10 +1035,10 @@
       if (!dst_type.IsInstantiated()) {
         const Class& owner = Class::Handle(Z, field.Owner());
         if (owner.NumTypeArguments() > 0) {
-          instantiator_type_args = new (Z) LoadFieldInstr(
-              new (Z) Value(instr->ArgumentAt(0)),
-              NativeFieldDesc::GetTypeArgumentsFieldFor(zone(), owner),
-              instr->token_pos());
+          instantiator_type_args = new (Z)
+              LoadFieldInstr(new (Z) Value(instr->ArgumentAt(0)),
+                             Slot::GetTypeArgumentsSlotFor(thread(), owner),
+                             instr->token_pos());
           InsertBefore(instr, instantiator_type_args, instr->env(),
                        FlowGraph::kValue);
         }
@@ -1056,15 +1057,10 @@
 
   // Field guard was detached.
   ASSERT(instr->FirstArgIndex() == 0);
-  StoreInstanceFieldInstr* store = new (Z)
-      StoreInstanceFieldInstr(field, new (Z) Value(instr->ArgumentAt(0)),
-                              new (Z) Value(instr->ArgumentAt(1)),
-                              kEmitStoreBarrier, instr->token_pos());
-
-  ASSERT(I->use_field_guards() || !store->IsUnboxedStore());
-  if (I->use_field_guards() && store->IsUnboxedStore()) {
-    flow_graph()->parsed_function().AddToGuardedFields(&field);
-  }
+  StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
+      field, new (Z) Value(instr->ArgumentAt(0)),
+      new (Z) Value(instr->ArgumentAt(1)), kEmitStoreBarrier,
+      instr->token_pos(), &flow_graph()->parsed_function());
 
   // Discard the environment from the original instruction because the store
   // can't deoptimize.
@@ -1228,7 +1224,7 @@
   ASSERT(results->is_empty());
   ASSERT(ic_data.NumArgsTested() == 1);  // Unary checks only.
   if (type.IsFunctionType() || type.IsDartFunctionType() ||
-      !type.IsInstantiated() || type.IsMalformedOrMalbounded()) {
+      !type.IsInstantiated()) {
     return Bool::null();
   }
   const Class& type_class = Class::Handle(Z, type.type_class());
@@ -1266,9 +1262,8 @@
         cls.IsNullClass()
             ? (type_class.IsNullClass() || type_class.IsObjectClass() ||
                type_class.IsDynamicClass())
-            : cls.IsSubtypeOf(Object::null_type_arguments(), type_class,
-                              Object::null_type_arguments(), NULL, NULL,
-                              Heap::kOld);
+            : Class::IsSubtypeOf(cls, Object::null_type_arguments(), type_class,
+                                 Object::null_type_arguments(), Heap::kOld);
     results->Add(cls.id());
     results->Add(is_subtype);
     if (prev.IsNull()) {
@@ -1284,7 +1279,7 @@
 
 // Returns true if checking against this type is a direct class id comparison.
 bool CallSpecializer::TypeCheckAsClassEquality(const AbstractType& type) {
-  ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded());
+  ASSERT(type.IsFinalized());
   // Requires CHA.
   if (!type.IsInstantiated()) return false;
   // Function types have different type checking rules.
@@ -1351,7 +1346,7 @@
   const intptr_t receiver_index = call->FirstArgIndex();
   Value* left_value = call->PushArgumentAt(receiver_index)->value();
 
-  if (left_value->Type()->IsMoreSpecificThan(type)) {
+  if (left_value->Type()->IsSubtypeOf(type)) {
     Definition* replacement = new (Z) StrictCompareInstr(
         call->token_pos(),
         type.IsNullType() ? Token::kEQ_STRICT : Token::kNE_STRICT,
@@ -1583,11 +1578,11 @@
   ASSERT(results->length() >= 2);  // At least on entry.
   const ClassTable& class_table = *Isolate::Current()->class_table();
   if ((*results)[0] != kSmiCid) {
-    const Class& cls = Class::Handle(class_table.At(kSmiCid));
+    const Class& smi_class = Class::Handle(class_table.At(kSmiCid));
     const Class& type_class = Class::Handle(type.type_class());
     const bool smi_is_subtype =
-        cls.IsSubtypeOf(Object::null_type_arguments(), type_class,
-                        Object::null_type_arguments(), NULL, NULL, Heap::kOld);
+        Class::IsSubtypeOf(smi_class, Object::null_type_arguments(), type_class,
+                           Object::null_type_arguments(), Heap::kOld);
     results->Add((*results)[results->length() - 2]);
     results->Add((*results)[results->length() - 2]);
     for (intptr_t i = results->length() - 3; i > 1; --i) {
@@ -1597,7 +1592,7 @@
     (*results)[1] = smi_is_subtype;
   }
 
-  ASSERT(type.IsInstantiated() && !type.IsMalformedOrMalbounded());
+  ASSERT(type.IsInstantiated());
   ASSERT(results->length() >= 2);
   if (type.IsSmiType()) {
     ASSERT((*results)[0] == kSmiCid);
diff --git a/runtime/vm/compiler/compiler_pass.cc b/runtime/vm/compiler/compiler_pass.cc
index 988d0834..e72f1a3 100644
--- a/runtime/vm/compiler/compiler_pass.cc
+++ b/runtime/vm/compiler/compiler_pass.cc
@@ -262,17 +262,10 @@
   INVOKE_PASS(EliminateStackOverflowChecks);
   INVOKE_PASS(Canonicalize);
   INVOKE_PASS(AllocationSinking_DetachMaterializations);
-#if defined(DART_PRECOMPILER)
-  if (mode == kAOT) {
-    INVOKE_PASS(ReplaceArrayBoundChecksForAOT);
-  }
-#endif
   INVOKE_PASS(WriteBarrierElimination);
   INVOKE_PASS(FinalizeGraph);
   INVOKE_PASS(AllocateRegisters);
-  if (mode == kJIT) {
-    INVOKE_PASS(ReorderBlocks);
-  }
+  INVOKE_PASS(ReorderBlocks);
 }
 
 COMPILER_PASS(ComputeSSA, {
@@ -348,7 +341,7 @@
   DEBUG_ASSERT(flow_graph->VerifyRedefinitions());
   LICM licm(flow_graph);
   licm.Optimize();
-  flow_graph->RemoveRedefinitions();
+  flow_graph->RemoveRedefinitions(/*keep_checks*/ true);
 });
 
 COMPILER_PASS(DSE, { DeadStoreElimination::Optimize(flow_graph); });
@@ -448,11 +441,6 @@
   flow_graph->RemoveRedefinitions();
 });
 
-#if defined(DART_PRECOMPILER)
-COMPILER_PASS(ReplaceArrayBoundChecksForAOT,
-              { AotCallSpecializer::ReplaceArrayBoundChecks(flow_graph); })
-#endif
-
 }  // namespace dart
 
 #endif  // DART_PRECOMPILED_RUNTIME
diff --git a/runtime/vm/compiler/compiler_pass.h b/runtime/vm/compiler/compiler_pass.h
index 92c2bfc..1e0f613 100644
--- a/runtime/vm/compiler/compiler_pass.h
+++ b/runtime/vm/compiler/compiler_pass.h
@@ -36,7 +36,6 @@
   V(OptimizeBranches)                                                          \
   V(RangeAnalysis)                                                             \
   V(ReorderBlocks)                                                             \
-  V(ReplaceArrayBoundChecksForAOT)                                             \
   V(SelectRepresentations)                                                     \
   V(SetOuterInliningId)                                                        \
   V(TryCatchOptimization)                                                      \
@@ -52,6 +51,7 @@
 class Function;
 class Precompiler;
 class SpeculativeInliningPolicy;
+class TimelineStream;
 
 struct CompilerPassState {
   CompilerPassState(Thread* thread,
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index c771039..1b6e95f 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -37,6 +37,7 @@
   "backend/code_statistics.h",
   "backend/constant_propagator.cc",
   "backend/constant_propagator.h",
+  "backend/compile_type.h",
   "backend/flow_graph.cc",
   "backend/flow_graph.h",
   "backend/flow_graph_compiler.cc",
@@ -69,6 +70,8 @@
   "backend/range_analysis.h",
   "backend/redundancy_elimination.cc",
   "backend/redundancy_elimination.h",
+  "backend/slot.cc",
+  "backend/slot.h",
   "backend/type_propagator.cc",
   "backend/type_propagator.h",
   "call_specializer.cc",
@@ -77,6 +80,7 @@
   "cha.h",
   "compiler_pass.cc",
   "compiler_pass.h",
+  "compiler_state.cc",
   "compiler_state.h",
   "frontend/base_flow_graph_builder.cc",
   "frontend/base_flow_graph_builder.h",
@@ -113,6 +117,8 @@
   "jit/jit_call_specializer.h",
   "method_recognizer.cc",
   "method_recognizer.h",
+  "relocation.cc",
+  "relocation.h",
 ]
 
 compiler_sources_tests = [
@@ -125,6 +131,8 @@
   "assembler/disassembler_test.cc",
   "backend/il_test.cc",
   "backend/locations_helpers_test.cc",
+  "backend/loops_test.cc",
   "backend/range_analysis_test.cc",
+  "backend/slot_test.cc",
   "cha_test.cc",
 ]
diff --git a/runtime/vm/compiler/compiler_state.cc b/runtime/vm/compiler/compiler_state.cc
new file mode 100644
index 0000000..4e05c0d
--- /dev/null
+++ b/runtime/vm/compiler/compiler_state.cc
@@ -0,0 +1,80 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/compiler/compiler_state.h"
+
+#ifndef DART_PRECOMPILED_RUNTIME
+
+#include <functional>
+
+#include "vm/scopes.h"
+
+namespace dart {
+
+template <typename T>
+T* PutIfAbsent(Thread* thread,
+               ZoneGrowableArray<T*>** array_slot,
+               intptr_t index,
+               std::function<T*()> create) {
+  auto array = *array_slot;
+
+  if (array == nullptr) {
+    Zone* const Z = thread->zone();
+    *array_slot = array = new (Z) ZoneGrowableArray<T*>(Z, index + 1);
+  }
+
+  while (array->length() <= index) {
+    array->Add(nullptr);
+  }
+
+  if (array->At(index) == nullptr) {
+    (*array)[index] = create();
+  }
+  return array->At(index);
+}
+
+LocalVariable* CompilerState::GetDummyCapturedVariable(intptr_t context_id,
+                                                       intptr_t index) {
+  return PutIfAbsent<LocalVariable>(
+      thread(), &dummy_captured_vars_, index, [&]() {
+        Zone* const Z = thread()->zone();
+        const AbstractType& dynamic_type =
+            AbstractType::ZoneHandle(Z, Type::DynamicType());
+        const String& name = String::ZoneHandle(
+            Z, Symbols::NewFormatted(thread(), ":context_var%" Pd, index));
+        LocalVariable* var = new (Z)
+            LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                          name, dynamic_type, /*param_type=*/nullptr);
+        var->set_is_captured();
+        var->set_index(VariableIndex(index));
+        return var;
+      });
+}
+
+const GrowableArray<LocalVariable*>& CompilerState::GetDummyContextVariables(
+    intptr_t context_id,
+    intptr_t num_context_variables) {
+  return PutIfAbsent<LocalScope>(
+             thread(), &dummy_scopes_, num_context_variables,
+             [&]() {
+               Zone* const Z = thread()->zone();
+
+               LocalScope* scope = new (Z) LocalScope(
+                   /*parent=*/NULL, /*function_level=*/0, /*loop_level=*/0);
+               scope->set_context_level(0);
+
+               for (intptr_t i = 0; i < num_context_variables; i++) {
+                 LocalVariable* var = GetDummyCapturedVariable(context_id, i);
+                 scope->AddVariable(var);
+                 scope->AddContextVariable(var);
+               }
+
+               return scope;
+             })
+      ->context_variables();
+}
+
+}  // namespace dart
+
+#endif  // DART_PRECOMPILED_RUNTIME
diff --git a/runtime/vm/compiler/compiler_state.h b/runtime/vm/compiler/compiler_state.h
index 320a174..774f74d 100644
--- a/runtime/vm/compiler/compiler_state.h
+++ b/runtime/vm/compiler/compiler_state.h
@@ -6,10 +6,15 @@
 #define RUNTIME_VM_COMPILER_COMPILER_STATE_H_
 
 #include "vm/compiler/cha.h"
+#include "vm/heap/safepoint.h"
 #include "vm/thread.h"
 
 namespace dart {
 
+class LocalScope;
+class LocalVariable;
+class SlotCache;
+
 // Deoptimization Id logic.
 //
 // Deoptimization ids are used to refer to deoptimization points, at which
@@ -49,9 +54,10 @@
 };
 
 // Global compiler state attached to the thread.
-class CompilerState : public StackResource {
+class CompilerState : public ThreadStackResource {
  public:
-  explicit CompilerState(Thread* thread) : StackResource(thread), cha_(thread) {
+  explicit CompilerState(Thread* thread)
+      : ThreadStackResource(thread), cha_(thread) {
     previous_ = thread->SetCompilerState(this);
   }
 
@@ -79,17 +85,54 @@
     return Thread::Current()->compiler_state();
   }
 
+  SlotCache* slot_cache() const { return slot_cache_; }
+  void set_slot_cache(SlotCache* cache) { slot_cache_ = cache; }
+
+  // Create a dummy list of local variables representing a context object
+  // with the given number of captured variables and given ID.
+  //
+  // Used during bytecode to IL translation because AllocateContext and
+  // CloneContext IL instructions need a list of local varaibles and bytecode
+  // does not record this information.
+  //
+  // TODO(vegorov): create context classes for distinct context IDs and
+  // populate them with slots without creating variables.
+  const GrowableArray<LocalVariable*>& GetDummyContextVariables(
+      intptr_t context_id,
+      intptr_t num_context_variables);
+
+  // Create a dummy LocalVariable that represents a captured local variable
+  // at the given index in the context with given ID.
+  //
+  // Used during bytecode to IL translation because StoreInstanceField and
+  // LoadField IL instructions need Slot, which can only be created from a
+  // LocalVariable.
+  //
+  // This function returns the same variable when it is called with the
+  // same index.
+  //
+  // TODO(vegorov): disambiguate slots for different context IDs.
+  LocalVariable* GetDummyCapturedVariable(intptr_t context_id, intptr_t index);
+
  private:
   CHA cha_;
   intptr_t deopt_id_ = 0;
 
+  // Cache for Slot objects created during compilation (see slot.h).
+  SlotCache* slot_cache_ = nullptr;
+
+  // Caches for dummy LocalVariables and LocalScopes created during
+  // bytecode to IL translation.
+  ZoneGrowableArray<LocalScope*>* dummy_scopes_ = nullptr;
+  ZoneGrowableArray<LocalVariable*>* dummy_captured_vars_ = nullptr;
+
   CompilerState* previous_;
 };
 
-class DeoptIdScope : public StackResource {
+class DeoptIdScope : public ThreadStackResource {
  public:
   DeoptIdScope(Thread* thread, intptr_t deopt_id)
-      : StackResource(thread),
+      : ThreadStackResource(thread),
         prev_deopt_id_(thread->compiler_state().deopt_id()) {
     thread->compiler_state().set_deopt_id(deopt_id);
   }
@@ -102,6 +145,24 @@
   DISALLOW_COPY_AND_ASSIGN(DeoptIdScope);
 };
 
+/// Ensures that there were no deopt id allocations during the lifetime of this
+/// object.
+class AssertNoDeoptIdsAllocatedScope : public ThreadStackResource {
+ public:
+  explicit AssertNoDeoptIdsAllocatedScope(Thread* thread)
+      : ThreadStackResource(thread),
+        prev_deopt_id_(thread->compiler_state().deopt_id()) {}
+
+  ~AssertNoDeoptIdsAllocatedScope() {
+    ASSERT(thread()->compiler_state().deopt_id() == prev_deopt_id_);
+  }
+
+ private:
+  const intptr_t prev_deopt_id_;
+
+  DISALLOW_COPY_AND_ASSIGN(AssertNoDeoptIdsAllocatedScope);
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_COMPILER_COMPILER_STATE_H_
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index b122dab..eadab31 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -114,7 +114,7 @@
   ASSERT(delta >= 0);
   Fragment instructions = LoadLocal(parsed_function_->current_context_var());
   while (delta-- > 0) {
-    instructions += LoadField(Context::parent_offset());
+    instructions += LoadNativeField(Slot::Context_parent());
   }
   return instructions;
 }
@@ -187,9 +187,10 @@
   return instructions.closed();
 }
 
-Fragment BaseFlowGraphBuilder::CheckStackOverflow(TokenPosition position) {
+Fragment BaseFlowGraphBuilder::CheckStackOverflow(TokenPosition position,
+                                                  intptr_t loop_depth) {
   return Fragment(
-      new (Z) CheckStackOverflowInstr(position, loop_depth_, GetNextDeoptId()));
+      new (Z) CheckStackOverflowInstr(position, loop_depth, GetNextDeoptId()));
 }
 
 Fragment BaseFlowGraphBuilder::Constant(const Object& value) {
@@ -243,7 +244,7 @@
   TargetEntryInstr* neq_entry;
 
   test += LoadArgDescriptor();
-  test += LoadNativeField(NativeFieldDesc::ArgumentsDescriptor_type_args_len());
+  test += LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
   test += IntConstant(num_type_args);
   test += BranchIfEqual(&eq_entry, &neq_entry);
 
@@ -266,7 +267,7 @@
   TargetEntryInstr* present_entry;
 
   test += LoadLocal(closure);
-  test += LoadField(Closure::delayed_type_arguments_offset());
+  test += LoadNativeField(Slot::Closure_delayed_type_arguments());
   test += Constant(Object::empty_type_arguments());
   test += BranchIfEqual(&absent_entry, &present_entry);
 
@@ -302,22 +303,6 @@
   }
 }
 
-Fragment BaseFlowGraphBuilder::LoadField(const Field& field) {
-  LoadFieldInstr* load = new (Z) LoadFieldInstr(
-      Pop(), &MayCloneField(field), AbstractType::ZoneHandle(Z, field.type()),
-      TokenPosition::kNoSource, parsed_function_);
-  Push(load);
-  return Fragment(load);
-}
-
-Fragment BaseFlowGraphBuilder::LoadField(intptr_t offset, intptr_t class_id) {
-  LoadFieldInstr* load = new (Z) LoadFieldInstr(
-      Pop(), offset, AbstractType::ZoneHandle(Z), TokenPosition::kNoSource);
-  load->set_result_cid(class_id);
-  Push(load);
-  return Fragment(load);
-}
-
 Fragment BaseFlowGraphBuilder::LoadIndexed(intptr_t index_scale) {
   Value* index = Pop();
   Value* array = Pop();
@@ -328,8 +313,11 @@
   return Fragment(instr);
 }
 
-Fragment BaseFlowGraphBuilder::LoadNativeField(
-    const NativeFieldDesc* native_field) {
+Fragment BaseFlowGraphBuilder::LoadField(const Field& field) {
+  return LoadNativeField(Slot::Get(MayCloneField(field), parsed_function_));
+}
+
+Fragment BaseFlowGraphBuilder::LoadNativeField(const Slot& native_field) {
   LoadFieldInstr* load =
       new (Z) LoadFieldInstr(Pop(), native_field, TokenPosition::kNoSource);
   Push(load);
@@ -380,14 +368,14 @@
 
 Fragment BaseFlowGraphBuilder::StoreInstanceField(
     TokenPosition position,
-    intptr_t offset,
+    const Slot& field,
     StoreBarrierType emit_store_barrier) {
   Value* value = Pop();
   if (value->BindsToConstant()) {
     emit_store_barrier = kNoStoreBarrier;
   }
   StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
-      offset, Pop(), value, emit_store_barrier, position);
+      field, Pop(), value, emit_store_barrier, position);
   return Fragment(store);
 }
 
@@ -400,10 +388,11 @@
     emit_store_barrier = kNoStoreBarrier;
   }
 
-  StoreInstanceFieldInstr* store = new (Z)
-      StoreInstanceFieldInstr(MayCloneField(field), Pop(), value,
-                              emit_store_barrier, TokenPosition::kNoSource);
-  store->set_is_initialization(is_initialization_store);
+  StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
+      MayCloneField(field), Pop(), value, emit_store_barrier,
+      TokenPosition::kNoSource, parsed_function_,
+      is_initialization_store ? StoreInstanceFieldInstr::Kind::kInitializing
+                              : StoreInstanceFieldInstr::Kind::kOther);
 
   return Fragment(store);
 }
@@ -439,6 +428,14 @@
   return Fragment(load);
 }
 
+Fragment BaseFlowGraphBuilder::RedefinitionWithType(const AbstractType& type) {
+  auto redefinition = new (Z) RedefinitionInstr(Pop());
+  redefinition->set_constrained_type(
+      new (Z) CompileType(CompileType::FromAbstractType(type)));
+  Push(redefinition);
+  return Fragment(redefinition);
+}
+
 Fragment BaseFlowGraphBuilder::StoreStaticField(TokenPosition position,
                                                 const Field& field) {
   return Fragment(
@@ -466,7 +463,7 @@
     instructions += LoadContextAt(variable->owner()->context_level());
     instructions += LoadLocal(value);
     instructions += StoreInstanceField(
-        position, Context::variable_offset(variable->index().value()));
+        position, Slot::GetContextVariableSlotFor(thread_, *variable));
     return instructions;
   }
   return StoreLocalRaw(position, variable);
@@ -642,8 +639,7 @@
   JoinEntryInstr* nsm = BuildJoinEntry();
 
   Fragment failing(nsm);
-  const Code& nsm_handler =
-      Code::ZoneHandle(StubCode::CallClosureNoSuchMethod_entry()->code());
+  const Code& nsm_handler = StubCode::CallClosureNoSuchMethod();
   failing += LoadArgDescriptor();
   failing += TailCall(nsm_handler);
 
@@ -667,9 +663,10 @@
   return Fragment(negate);
 }
 
-Fragment BaseFlowGraphBuilder::AllocateContext(intptr_t size) {
+Fragment BaseFlowGraphBuilder::AllocateContext(
+    const GrowableArray<LocalVariable*>& context_variables) {
   AllocateContextInstr* allocate =
-      new (Z) AllocateContextInstr(TokenPosition::kNoSource, size);
+      new (Z) AllocateContextInstr(TokenPosition::kNoSource, context_variables);
   Push(allocate);
   return Fragment(allocate);
 }
@@ -700,7 +697,7 @@
   Value* instantiator_type_args = Pop();
   const Class& instantiator_class = Class::ZoneHandle(Z, function_.Owner());
   InstantiateTypeArgumentsInstr* instr = new (Z) InstantiateTypeArgumentsInstr(
-      TokenPosition::kNoSource, type_arguments, instantiator_class,
+      TokenPosition::kNoSource, type_arguments, instantiator_class, function_,
       instantiator_type_args, function_type_args, GetNextDeoptId());
   Push(instr);
   return Fragment(instr);
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index b37c2db..69ff503 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -129,13 +129,11 @@
         next_used_try_index_(0),
         stack_(NULL),
         pending_argument_count_(0),
-        loop_depth_(0),
         exit_collector_(exit_collector),
         inlining_unchecked_entry_(inlining_unchecked_entry) {}
 
   Fragment LoadField(const Field& field);
-  Fragment LoadField(intptr_t offset, intptr_t class_id = kDynamicCid);
-  Fragment LoadNativeField(const NativeFieldDesc* native_field);
+  Fragment LoadNativeField(const Slot& native_field);
   Fragment LoadIndexed(intptr_t index_scale);
 
   void SetTempIndex(Definition* definition);
@@ -149,7 +147,7 @@
   const Field& MayCloneField(const Field& field);
   Fragment StoreInstanceField(
       TokenPosition position,
-      intptr_t offset,
+      const Slot& field,
       StoreBarrierType emit_store_barrier = kEmitStoreBarrier);
   Fragment StoreInstanceField(
       const Field& field,
@@ -158,6 +156,7 @@
   Fragment StoreInstanceFieldGuarded(const Field& field,
                                      bool is_initialization_store);
   Fragment LoadStaticField();
+  Fragment RedefinitionWithType(const AbstractType& type);
   Fragment StoreStaticField(TokenPosition position, const Field& field);
   Fragment StoreIndexed(intptr_t class_id);
 
@@ -219,7 +218,7 @@
   Fragment BranchIfStrictEqual(TargetEntryInstr** then_entry,
                                TargetEntryInstr** otherwise_entry);
   Fragment Return(TokenPosition position);
-  Fragment CheckStackOverflow(TokenPosition position);
+  Fragment CheckStackOverflow(TokenPosition position, intptr_t loop_depth);
   Fragment ThrowException(TokenPosition position);
   Fragment TailCall(const Code& code);
 
@@ -262,7 +261,7 @@
 
   Fragment AssertBool(TokenPosition position);
   Fragment BooleanNegate();
-  Fragment AllocateContext(intptr_t size);
+  Fragment AllocateContext(const GrowableArray<LocalVariable*>& scope);
   Fragment CreateArray();
   Fragment InstantiateType(const AbstractType& type);
   Fragment InstantiateTypeArguments(const TypeArguments& type_arguments);
@@ -289,7 +288,6 @@
 
   Value* stack_;
   intptr_t pending_argument_count_;
-  intptr_t loop_depth_;
   InlineExitCollector* exit_collector_;
 
   const bool inlining_unchecked_entry_;
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 6d48c90..361da68 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -5,6 +5,7 @@
 #include "vm/compiler/frontend/bytecode_flow_graph_builder.h"
 
 #include "vm/compiler/backend/il_printer.h"
+#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/prologue_builder.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/object_store.h"
@@ -373,14 +374,15 @@
   throw_no_such_method_ = B->BuildThrowNoSuchMethod();
 
   check_args += B->LoadArgDescriptor();
-  check_args += B->LoadField(ArgumentsDescriptor::positional_count_offset());
+  check_args +=
+      B->LoadNativeField(Slot::ArgumentsDescriptor_positional_count());
   check_args += B->IntConstant(num_fixed_params);
   TargetEntryInstr *success1, *fail1;
   check_args += B->BranchIfEqual(&success1, &fail1);
   check_args = Fragment(check_args.entry, success1);
 
   check_args += B->LoadArgDescriptor();
-  check_args += B->LoadField(ArgumentsDescriptor::count_offset());
+  check_args += B->LoadNativeField(Slot::ArgumentsDescriptor_count());
   check_args += B->IntConstant(num_fixed_params);
   TargetEntryInstr *success2, *fail2;
   check_args += B->BranchIfEqual(&success2, &fail2);
@@ -566,8 +568,8 @@
   // If expect_type_args, a non-zero length must match the declaration length.
   TargetEntryInstr *then, *fail;
   setup_type_args += B->LoadArgDescriptor();
-  setup_type_args += B->LoadNativeField(NativeFieldDesc::Get(
-      NativeFieldDesc::kArgumentsDescriptor_type_args_len));
+  setup_type_args +=
+      B->LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
 
   if (expected_num_type_args != 0) {
     JoinEntryInstr* join2 = B->BuildJoinEntry();
@@ -593,7 +595,7 @@
 
     Fragment store_type_args(then2);
     store_type_args += B->LoadArgDescriptor();
-    store_type_args += B->LoadField(ArgumentsDescriptor::count_offset());
+    store_type_args += B->LoadNativeField(Slot::ArgumentsDescriptor_count());
     store_type_args += B->LoadFpRelativeSlot(
         kWordSize * (1 + compiler_frame_layout.param_end_from_fp));
     store_type_args +=
@@ -624,8 +626,10 @@
 }
 
 void BytecodeFlowGraphBuilder::BuildCheckStack() {
-  // TODO(alexmarkov): update B->loop_depth_
-  code_ += B->CheckStackOverflow(position_);
+  if (is_generating_interpreter()) {
+    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
+  }
+  code_ += B->CheckStackOverflow(position_, DecodeOperandA().value());
   ASSERT(B->stack_ == nullptr);
 }
 
@@ -697,7 +701,49 @@
   B->Push(call);
 }
 
-void BytecodeFlowGraphBuilder::BuildInstanceCall() {
+void BytecodeFlowGraphBuilder::BuildInterfaceCall() {
+  if (is_generating_interpreter()) {
+    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
+  }
+
+  const String& name = String::Cast(ConstantAt(DecodeOperandD()).value());
+  ASSERT(name.IsSymbol());
+
+  const Array& arg_desc_array =
+      Array::Cast(ConstantAt(DecodeOperandD(), 1).value());
+  const ArgumentsDescriptor arg_desc(arg_desc_array);
+
+  const intptr_t argc = DecodeOperandA().value();
+  Token::Kind token_kind = MethodTokenRecognizer::RecognizeTokenKind(name);
+
+  intptr_t checked_argument_count = 1;
+  if ((token_kind != Token::kILLEGAL) ||
+      (name.raw() ==
+       Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()).raw())) {
+    intptr_t argument_count = arg_desc.Count();
+    ASSERT(argument_count <= 2);
+    checked_argument_count = argument_count;
+  } else if (name.raw() ==
+             Library::PrivateCoreLibName(Symbols::_instanceOf()).raw()) {
+    token_kind = Token::kIS;
+  }
+
+  const ArgumentArray arguments = GetArguments(argc);
+
+  // TODO(alexmarkov): store interface_target in bytecode and pass it here.
+
+  InstanceCallInstr* call = new (Z) InstanceCallInstr(
+      position_, name, token_kind, arguments, arg_desc.TypeArgsLen(),
+      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), checked_argument_count,
+      *ic_data_array_, B->GetNextDeoptId());
+
+  // TODO(alexmarkov): add type info - call->SetResultType()
+
+  code_ <<= call;
+  B->Push(call);
+}
+
+void BytecodeFlowGraphBuilder::BuildDynamicCall() {
   if (is_generating_interpreter()) {
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
   }
@@ -777,15 +823,27 @@
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
   }
 
-  code_ += B->AllocateContext(DecodeOperandD().value());
+  const intptr_t context_id = DecodeOperandA().value();
+  const intptr_t num_context_vars = DecodeOperandD().value();
+
+  auto& context_variables = CompilerState::Current().GetDummyContextVariables(
+      context_id, num_context_vars);
+  code_ += B->AllocateContext(context_variables);
 }
 
 void BytecodeFlowGraphBuilder::BuildCloneContext() {
+  if (is_generating_interpreter()) {
+    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
+  }
+
   LoadStackSlots(1);
-  // TODO(alexmarkov): Pass context_size and use it in compiled mode.
+  const intptr_t context_id = DecodeOperandA().value();
+  const intptr_t num_context_vars = DecodeOperandD().value();
+
+  auto& context_variables = CompilerState::Current().GetDummyContextVariables(
+      context_id, num_context_vars);
   CloneContextInstr* clone_instruction = new (Z) CloneContextInstr(
-      TokenPosition::kNoSource, Pop(), CloneContextInstr::kUnknownContextSize,
-      B->GetNextDeoptId());
+      TokenPosition::kNoSource, Pop(), context_variables, B->GetNextDeoptId());
   code_ <<= clone_instruction;
   B->Push(clone_instruction);
 }
@@ -795,6 +853,24 @@
   code_ += B->CreateArray();
 }
 
+const Slot& ClosureSlotByField(const Field& field) {
+  const intptr_t offset = field.Offset();
+  if (offset == Closure::instantiator_type_arguments_offset()) {
+    return Slot::Closure_instantiator_type_arguments();
+  } else if (offset == Closure::function_type_arguments_offset()) {
+    return Slot::Closure_function_type_arguments();
+  } else if (offset == Closure::delayed_type_arguments_offset()) {
+    return Slot::Closure_delayed_type_arguments();
+  } else if (offset == Closure::function_offset()) {
+    return Slot::Closure_function();
+  } else if (offset == Closure::context_offset()) {
+    return Slot::Closure_context();
+  } else {
+    RELEASE_ASSERT(offset == Closure::hash_offset());
+    return Slot::Closure_hash();
+  }
+}
+
 void BytecodeFlowGraphBuilder::BuildStoreFieldTOS() {
   if (is_generating_interpreter()) {
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
@@ -809,8 +885,7 @@
 
   if (field.Owner() == isolate()->object_store()->closure_class()) {
     // Stores to _Closure fields are lower-level.
-    // TODO(alexmarkov): use NativeFieldDesc
-    code_ += B->StoreInstanceField(position_, field.Offset());
+    code_ += B->StoreInstanceField(position_, ClosureSlotByField(field));
   } else {
     // The rest of the StoreFieldTOS are for field initializers.
     // TODO(alexmarkov): Consider adding a flag to StoreFieldTOS or even
@@ -834,8 +909,7 @@
 
   if (field.Owner() == isolate()->object_store()->closure_class()) {
     // Loads from _Closure fields are lower-level.
-    // TODO(alexmarkov): use NativeFieldDesc
-    code_ += B->LoadField(field.Offset());
+    code_ += B->LoadNativeField(ClosureSlotByField(field));
   } else {
     code_ += B->LoadField(field);
   }
@@ -844,15 +918,13 @@
 void BytecodeFlowGraphBuilder::BuildStoreContextParent() {
   LoadStackSlots(2);
 
-  // TODO(alexmarkov): use NativeFieldDesc
-  code_ += B->StoreInstanceField(position_, Context::parent_offset());
+  code_ += B->StoreInstanceField(position_, Slot::Context_parent());
 }
 
 void BytecodeFlowGraphBuilder::BuildLoadContextParent() {
   LoadStackSlots(1);
 
-  // TODO(alexmarkov): use NativeFieldDesc
-  code_ += B->LoadField(Context::parent_offset());
+  code_ += B->LoadNativeField(Slot::Context_parent());
 }
 
 void BytecodeFlowGraphBuilder::BuildStoreContextVar() {
@@ -861,11 +933,13 @@
   }
 
   LoadStackSlots(2);
-  Operand var_index = DecodeOperandD();
+  const intptr_t context_id = DecodeOperandA().value();
+  const intptr_t var_index = DecodeOperandD().value();
 
-  // TODO(alexmarkov): use NativeFieldDesc
-  code_ += B->StoreInstanceField(position_,
-                                 Context::variable_offset(var_index.value()));
+  auto var =
+      CompilerState::Current().GetDummyCapturedVariable(context_id, var_index);
+  code_ += B->StoreInstanceField(
+      position_, Slot::GetContextVariableSlotFor(thread(), *var));
 }
 
 void BytecodeFlowGraphBuilder::BuildLoadContextVar() {
@@ -874,10 +948,12 @@
   }
 
   LoadStackSlots(1);
-  Operand var_index = DecodeOperandD();
+  const intptr_t context_id = DecodeOperandA().value();
+  const intptr_t var_index = DecodeOperandD().value();
 
-  // TODO(alexmarkov): use NativeFieldDesc
-  code_ += B->LoadField(Context::variable_offset(var_index.value()));
+  auto var =
+      CompilerState::Current().GetDummyCapturedVariable(context_id, var_index);
+  code_ += B->LoadNativeField(Slot::GetContextVariableSlotFor(thread(), *var));
 }
 
 void BytecodeFlowGraphBuilder::BuildLoadTypeArgumentsField() {
@@ -889,8 +965,7 @@
   const intptr_t offset =
       Smi::Cast(ConstantAt(DecodeOperandD()).value()).Value() * kWordSize;
 
-  code_ +=
-      B->LoadNativeField(NativeFieldDesc::GetTypeArgumentsField(Z, offset));
+  code_ += B->LoadNativeField(Slot::GetTypeArgumentsSlotAt(thread(), offset));
 }
 
 void BytecodeFlowGraphBuilder::BuildStoreStaticTOS() {
@@ -1032,8 +1107,7 @@
 
   TargetEntryInstr *is_zero, *is_not_zero;
   code_ += B->LoadArgDescriptor();
-  code_ += B->LoadNativeField(NativeFieldDesc::Get(
-      NativeFieldDesc::kArgumentsDescriptor_type_args_len));
+  code_ += B->LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
   code_ += B->IntConstant(0);
   code_ += B->BranchIfEqual(&is_zero, &is_not_zero);
 
@@ -1156,8 +1230,7 @@
   }
 
   LocalVariable* special_var = nullptr;
-  switch (DecodeOperandD().value()) {
-    // TODO(alexmarkov): Move these constants to constants_kbc.h
+  switch (DecodeOperandA().value()) {
     case KernelBytecode::kExceptionSpecialIndex:
       ASSERT(exception_var_ != nullptr);
       special_var = exception_var_;
@@ -1171,7 +1244,7 @@
   }
 
   code_ += B->LoadLocal(special_var);
-  StoreLocal(DecodeOperandA());
+  StoreLocal(DecodeOperandX());
   code_ += B->Drop();
 }
 
@@ -1451,10 +1524,10 @@
   // Use default flow graph builder for native methods.
   ASSERT(!function().is_native());
 
-  const Code& bytecode = Code::Handle(Z, function().Bytecode());
+  const Bytecode& bytecode = Bytecode::Handle(Z, function().bytecode());
 
   object_pool_ = bytecode.object_pool();
-  raw_bytecode_ = reinterpret_cast<KBCInstr*>(bytecode.EntryPoint());
+  raw_bytecode_ = reinterpret_cast<KBCInstr*>(bytecode.PayloadStart());
   bytecode_length_ = bytecode.Size() / sizeof(KBCInstr);
 
   ProcessICDataInObjectPool(object_pool_);
@@ -1472,6 +1545,9 @@
 
   CollectControlFlow(descriptors, handlers, graph_entry);
 
+  kernel::BytecodeSourcePositionsIterator source_pos_iter(Z, bytecode);
+  bool update_position = source_pos_iter.MoveNext();
+
   code_ = Fragment(normal_entry);
 
   for (pc_ = 0; pc_ < bytecode_length_; ++pc_) {
@@ -1494,6 +1570,12 @@
       ASSERT(!code_.is_closed());
     }
 
+    while (update_position &&
+           pc_ >= source_pos_iter.BytecodeInstructionIndex()) {
+      position_ = source_pos_iter.TokenPos();
+      update_position = source_pos_iter.MoveNext();
+    }
+
     BuildInstruction(KernelBytecode::DecodeOpcode(bytecode_instr_));
 
     if (code_.is_closed()) {
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 49dec04..e1379bd 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -12,11 +12,12 @@
 #include "vm/dart_entry.h"
 #include "vm/longjump.h"
 #include "vm/object_store.h"
+#include "vm/reusable_handles.h"
 #include "vm/timeline.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
-#define Z (zone_)
+#define Z (helper_->zone_)
 #define H (translation_helper_)
 #define T (type_translator_)
 #define I Isolate::Current()
@@ -32,7 +33,10 @@
                                                ActiveClass* active_class)
     : MetadataHelper(helper, tag(), /* precompiler_only = */ false),
       type_translator_(*type_translator),
-      active_class_(active_class) {}
+      active_class_(active_class),
+      bytecode_component_(nullptr),
+      closures_(nullptr),
+      function_type_type_parameters_(nullptr) {}
 
 bool BytecodeMetadataHelper::HasBytecode(intptr_t node_offset) {
   const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
@@ -59,29 +63,38 @@
 
   ASSERT(Thread::Current()->IsMutatorThread());
 
+  Array& bytecode_component_array =
+      Array::Handle(Z, translation_helper_.GetBytecodeComponent());
+  if (bytecode_component_array.IsNull()) {
+    bytecode_component_array = ReadBytecodeComponent();
+    ASSERT(!bytecode_component_array.IsNull());
+  }
+  BytecodeComponentData bytecode_component(bytecode_component_array);
+  bytecode_component_ = &bytecode_component;
+
   AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
                               md_offset);
 
-  const intptr_t version = helper_->reader_.ReadUInt();
-  if ((version < KernelBytecode::kMinSupportedBytecodeFormatVersion) ||
-      (version > KernelBytecode::kMaxSupportedBytecodeFormatVersion)) {
-    FATAL3(
-        "Unsupported Dart bytecode format version %" Pd
-        ". This version of Dart VM supports bytecode format versions from %" Pd
-        " to %" Pd ".",
-        version, KernelBytecode::kMinSupportedBytecodeFormatVersion,
-        KernelBytecode::kMaxSupportedBytecodeFormatVersion);
-  }
-
   const int kHasExceptionsTableFlag = 1 << 0;
-  const int kHasNullableFieldsFlag = 1 << 1;
-  const int kHasClosuresFlag = 1 << 2;
+  const int kHasSourcePositionsFlag = 1 << 1;
+  const int kHasNullableFieldsFlag = 1 << 2;
+  const int kHasClosuresFlag = 1 << 3;
 
   const intptr_t flags = helper_->reader_.ReadUInt();
   const bool has_exceptions_table = (flags & kHasExceptionsTableFlag) != 0;
+  const bool has_source_positions = (flags & kHasSourcePositionsFlag) != 0;
   const bool has_nullable_fields = (flags & kHasNullableFieldsFlag) != 0;
   const bool has_closures = (flags & kHasClosuresFlag) != 0;
 
+  intptr_t num_closures = 0;
+  if (has_closures) {
+    num_closures = helper_->ReadListLength();
+    closures_ = &Array::Handle(Z, Array::New(num_closures));
+    for (intptr_t i = 0; i < num_closures; i++) {
+      ReadClosureDeclaration(function, i);
+    }
+  }
+
   // Create object pool and read pool entries.
   const intptr_t obj_count = helper_->reader_.ReadListLength();
   const ObjectPool& pool =
@@ -94,16 +107,20 @@
     // TODO(alexmarkov): allocate deopt_ids for closures separately
     DeoptIdScope deopt_id_scope(H.thread(), 0);
 
-    ReadPoolEntries(function, function, pool, 0);
+    ReadConstantPool(function, pool);
   }
 
   // Read bytecode and attach to function.
-  const Code& bytecode = Code::Handle(helper_->zone_, ReadBytecode(pool));
+  const Bytecode& bytecode =
+      Bytecode::Handle(helper_->zone_, ReadBytecode(pool));
   function.AttachBytecode(bytecode);
+  ASSERT(bytecode.GetBinary(helper_->zone_) ==
+         helper_->reader_.typed_data()->raw());
 
-  // Read exceptions table.
   ReadExceptionsTable(bytecode, has_exceptions_table);
 
+  ReadSourcePositions(bytecode, has_source_positions);
+
   if (FLAG_dump_kernel_bytecode) {
     KernelBytecodeDisassembler::Disassemble(function);
   }
@@ -116,13 +133,12 @@
     if (I->use_field_guards()) {
       Field& field = Field::Handle(helper_->zone_);
       for (intptr_t i = 0; i < num_fields; i++) {
-        NameIndex name_index = helper_->ReadCanonicalNameReference();
-        field = H.LookupFieldByKernelField(name_index);
+        field ^= ReadObject();
         field.RecordStore(Object::null_object());
       }
     } else {
       for (intptr_t i = 0; i < num_fields; i++) {
-        helper_->SkipCanonicalNameReference();
+        ReadObject();
       }
     }
   }
@@ -130,34 +146,173 @@
   // Read closures.
   if (has_closures) {
     Function& closure = Function::Handle(helper_->zone_);
-    Code& closure_bytecode = Code::Handle(helper_->zone_);
-    const intptr_t num_closures = helper_->ReadListLength();
+    Bytecode& closure_bytecode = Bytecode::Handle(helper_->zone_);
     for (intptr_t i = 0; i < num_closures; i++) {
-      intptr_t closure_index = helper_->ReadUInt();
-      ASSERT(closure_index < obj_count);
-      closure ^= pool.ObjectAt(closure_index);
+      closure ^= closures_->At(i);
+
+      const intptr_t flags = helper_->reader_.ReadUInt();
+      const bool has_exceptions_table = (flags & kHasExceptionsTableFlag) != 0;
+      const bool has_source_positions = (flags & kHasSourcePositionsFlag) != 0;
 
       // Read closure bytecode and attach to closure function.
       closure_bytecode = ReadBytecode(pool);
       closure.AttachBytecode(closure_bytecode);
+      ASSERT(bytecode.GetBinary(helper_->zone_) ==
+             helper_->reader_.typed_data()->raw());
 
-      // Read closure exceptions table.
-      ReadExceptionsTable(closure_bytecode);
+      ReadExceptionsTable(closure_bytecode, has_exceptions_table);
+
+      ReadSourcePositions(closure_bytecode, has_source_positions);
 
       if (FLAG_dump_kernel_bytecode) {
         KernelBytecodeDisassembler::Disassemble(closure);
       }
     }
   }
+
+  bytecode_component_ = nullptr;
 }
 
-intptr_t BytecodeMetadataHelper::ReadPoolEntries(const Function& function,
-                                                 const Function& inner_function,
-                                                 const ObjectPool& pool,
-                                                 intptr_t from_index) {
+void BytecodeMetadataHelper::ReadClosureDeclaration(const Function& function,
+                                                    intptr_t closureIndex) {
+  const int kHasOptionalPositionalParams = 1 << 0;
+  const int kHasOptionalNamedParams = 1 << 1;
+  const int kHasTypeParams = 1 << 2;
+
+  const intptr_t flags = helper_->reader_.ReadUInt();
+
+  Object& parent = Object::Handle(Z, ReadObject());
+  if (!parent.IsFunction()) {
+    ASSERT(parent.IsField());
+    ASSERT(function.kind() == RawFunction::kImplicitStaticFinalGetter);
+    // Closure in a static field initializer, so use current function as parent.
+    parent = function.raw();
+  }
+
+  String& name = String::CheckedHandle(Z, ReadObject());
+  ASSERT(name.IsSymbol());
+
+  const Function& closure = Function::Handle(
+      Z, Function::NewClosureFunction(name, Function::Cast(parent),
+                                      TokenPosition::kNoSource));
+
+  closures_->SetAt(closureIndex, closure);
+
+  Type& signature_type =
+      Type::Handle(Z, ReadFunctionSignature(
+                          closure, (flags & kHasOptionalPositionalParams) != 0,
+                          (flags & kHasOptionalNamedParams) != 0,
+                          (flags & kHasTypeParams) != 0,
+                          /* has_positional_param_names = */ true));
+
+  closure.SetSignatureType(signature_type);
+}
+
+RawType* BytecodeMetadataHelper::ReadFunctionSignature(
+    const Function& func,
+    bool has_optional_positional_params,
+    bool has_optional_named_params,
+    bool has_type_params,
+    bool has_positional_param_names) {
+  FunctionTypeScope function_type_scope(this);
+
+  if (has_type_params) {
+    const intptr_t num_type_params = helper_->reader_.ReadUInt();
+    ReadTypeParametersDeclaration(Class::Handle(Z), func, num_type_params);
+    function_type_type_parameters_ =
+        &TypeArguments::Handle(Z, func.type_parameters());
+  }
+
+  const intptr_t kImplicitClosureParam = 1;
+  const intptr_t num_params =
+      kImplicitClosureParam + helper_->reader_.ReadUInt();
+
+  intptr_t num_required_params = num_params;
+  if (has_optional_positional_params || has_optional_named_params) {
+    num_required_params = kImplicitClosureParam + helper_->reader_.ReadUInt();
+  }
+
+  func.set_num_fixed_parameters(num_required_params);
+  func.SetNumOptionalParameters(num_params - num_required_params,
+                                !has_optional_named_params);
+  const Array& parameter_types =
+      Array::Handle(Z, Array::New(num_params, Heap::kOld));
+  func.set_parameter_types(parameter_types);
+  const Array& parameter_names =
+      Array::Handle(Z, Array::New(num_params, Heap::kOld));
+  func.set_parameter_names(parameter_names);
+
+  intptr_t i = 0;
+  parameter_types.SetAt(i, AbstractType::dynamic_type());
+  parameter_names.SetAt(i, Symbols::ClosureParameter());
+  ++i;
+
+  AbstractType& type = AbstractType::Handle(Z);
+  String& name = String::Handle(Z);
+  for (; i < num_params; ++i) {
+    if (has_positional_param_names ||
+        (has_optional_named_params && (i >= num_required_params))) {
+      name ^= ReadObject();
+    } else {
+      name = Symbols::NotNamed().raw();
+    }
+    parameter_names.SetAt(i, name);
+    type ^= ReadObject();
+    parameter_types.SetAt(i, type);
+  }
+
+  type ^= ReadObject();
+  func.set_result_type(type);
+
+  // Finalize function type.
+  type = func.SignatureType();
+  type ^= ClassFinalizer::FinalizeType(*(active_class_->klass), type);
+  return Type::Cast(type).raw();
+}
+
+void BytecodeMetadataHelper::ReadTypeParametersDeclaration(
+    const Class& parameterized_class,
+    const Function& parameterized_function,
+    intptr_t num_type_params) {
+  ASSERT(parameterized_class.IsNull() != parameterized_function.IsNull());
+  ASSERT(num_type_params > 0);
+
+  // First setup the type parameters, so if any of the following code uses it
+  // (in a recursive way) we're fine.
+  //
+  // Step a) Create array of [TypeParameter] objects (without bound).
+  const TypeArguments& type_parameters =
+      TypeArguments::Handle(Z, TypeArguments::New(num_type_params));
+  String& name = String::Handle(Z);
+  TypeParameter& parameter = TypeParameter::Handle(Z);
+  AbstractType& bound = AbstractType::Handle(Z);
+  for (intptr_t i = 0; i < num_type_params; ++i) {
+    name ^= ReadObject();
+    ASSERT(name.IsSymbol());
+    parameter = TypeParameter::New(parameterized_class, parameterized_function,
+                                   i, name, bound, TokenPosition::kNoSource);
+    type_parameters.SetTypeAt(i, parameter);
+  }
+
+  if (!parameterized_class.IsNull()) {
+    parameterized_class.set_type_parameters(type_parameters);
+  } else {
+    parameterized_function.set_type_parameters(type_parameters);
+  }
+
+  // Step b) Fill in the bounds of all [TypeParameter]s.
+  for (intptr_t i = 0; i < num_type_params; ++i) {
+    parameter ^= type_parameters.TypeAt(i);
+    bound ^= ReadObject();
+    parameter.set_bound(bound);
+  }
+}
+
+void BytecodeMetadataHelper::ReadConstantPool(const Function& function,
+                                              const ObjectPool& pool) {
 #if !defined(PRODUCT)
   TimelineDurationScope tds(Thread::Current(), Timeline::GetCompilerStream(),
-                            "BytecodeMetadataHelper::ReadPoolEntries");
+                            "BytecodeMetadataHelper::ReadConstantPool");
 #endif  // !defined(PRODUCT)
 
   // These enums and the code below reading the constant pool from kernel must
@@ -189,6 +344,7 @@
     kPartialTearOffInstantiation,
     kEmptyTypeArguments,
     kSymbol,
+    kInterfaceCall,
   };
 
   enum InvocationKind {
@@ -205,14 +361,13 @@
   Array& array = Array::Handle(helper_->zone_);
   Field& field = Field::Handle(helper_->zone_);
   Class& cls = Class::Handle(helper_->zone_);
-  Library& lib = Library::Handle(helper_->zone_);
   String& name = String::Handle(helper_->zone_);
   TypeArguments& type_args = TypeArguments::Handle(helper_->zone_);
   Class* symbol_class = nullptr;
   Field* symbol_name_field = nullptr;
   const String* simpleInstanceOf = nullptr;
   const intptr_t obj_count = pool.Length();
-  for (intptr_t i = from_index; i < obj_count; ++i) {
+  for (intptr_t i = 0; i < obj_count; ++i) {
     const intptr_t tag = helper_->ReadTag();
     switch (tag) {
       case ConstantPoolTag::kInvalid:
@@ -221,9 +376,8 @@
         obj = Object::null();
         break;
       case ConstantPoolTag::kString:
-        obj = H.DartString(helper_->ReadStringReference()).raw();
-        ASSERT(obj.IsString());
-        obj = H.Canonicalize(String::Cast(obj));
+        obj = ReadString();
+        ASSERT(obj.IsString() && obj.IsCanonical());
         break;
       case ConstantPoolTag::kInt: {
         uint32_t low_bits = helper_->ReadUInt32();
@@ -241,7 +395,7 @@
         obj = H.Canonicalize(Double::Cast(obj));
       } break;
       case ConstantPoolTag::kBool:
-        if (helper_->ReadUInt() == 1) {
+        if (helper_->ReadByte() == 1) {
           obj = Bool::True().raw();
         } else {
           obj = Bool::False().raw();
@@ -256,7 +410,8 @@
         } else {
           array = Array::New(num_arg_names);
           for (intptr_t j = 0; j < num_arg_names; j++) {
-            array.SetAt(j, H.DartSymbolPlain(helper_->ReadStringReference()));
+            name = ReadString();
+            array.SetAt(j, name);
           }
           obj = ArgumentsDescriptor::New(num_type_args, num_arguments, array);
         }
@@ -266,14 +421,8 @@
         InvocationKind kind =
             static_cast<InvocationKind>(flags & kInvocationKindMask);
         bool isDynamic = (flags & kFlagDynamic) != 0;
-        if (kind == InvocationKind::getter) {
-          name = helper_->ReadNameAsGetterName().raw();
-        } else if (kind == InvocationKind::setter) {
-          name = helper_->ReadNameAsSetterName().raw();
-        } else {
-          ASSERT(kind == InvocationKind::method);
-          name = helper_->ReadNameAsMethodName().raw();
-        }
+        name ^= ReadObject();
+        ASSERT(name.IsSymbol());
         intptr_t arg_desc_index = helper_->ReadUInt();
         ASSERT(arg_desc_index < i);
         array ^= pool.ObjectAt(arg_desc_index);
@@ -311,38 +460,11 @@
 #endif
       } break;
       case ConstantPoolTag::kStaticICData: {
-        InvocationKind kind = static_cast<InvocationKind>(helper_->ReadByte());
-        NameIndex target = helper_->ReadCanonicalNameReference();
-        if (H.IsConstructor(target)) {
-          name = H.DartConstructorName(target).raw();
-          elem = H.LookupConstructorByKernelConstructor(target);
-        } else if (H.IsField(target)) {
-          if (kind == InvocationKind::getter) {
-            name = H.DartGetterName(target).raw();
-          } else if (kind == InvocationKind::setter) {
-            name = H.DartSetterName(target).raw();
-          } else {
-            ASSERT(kind == InvocationKind::method);
-            UNIMPLEMENTED();  // TODO(regis): Revisit.
-          }
-          field = H.LookupFieldByKernelField(target);
-          cls = field.Owner();
-          elem = cls.LookupFunctionAllowPrivate(name);
-        } else {
-          if ((kind == InvocationKind::method) && H.IsGetter(target)) {
-            UNIMPLEMENTED();  // TODO(regis): Revisit.
-          }
-          name = H.DartProcedureName(target).raw();
-          elem = H.LookupStaticMethodByKernelProcedure(target);
-          if ((kind == InvocationKind::getter) && !H.IsGetter(target)) {
-            // Tear-off
-            name = H.DartGetterName(target).raw();
-            elem = Function::Cast(elem).GetMethodExtractor(name);
-          }
-        }
+        elem = ReadObject();
+        ASSERT(elem.IsFunction());
+        name = Function::Cast(elem).name();
         const int num_args_checked =
             MethodRecognizer::NumArgsCheckedForStaticCall(Function::Cast(elem));
-        ASSERT(elem.IsFunction());
         intptr_t arg_desc_index = helper_->ReadUInt();
         ASSERT(arg_desc_index < i);
         array ^= pool.ObjectAt(arg_desc_index);
@@ -356,12 +478,11 @@
 #endif
       } break;
       case ConstantPoolTag::kStaticField:
-        obj = H.LookupFieldByKernelField(helper_->ReadCanonicalNameReference());
+        obj = ReadObject();
         ASSERT(obj.IsField());
         break;
       case ConstantPoolTag::kInstanceField:
-        field =
-            H.LookupFieldByKernelField(helper_->ReadCanonicalNameReference());
+        field ^= ReadObject();
         // InstanceField constant occupies 2 entries.
         // The first entry is used for field offset.
         obj = Smi::New(field.Offset() / kWordSize);
@@ -373,16 +494,15 @@
         obj = field.raw();
         break;
       case ConstantPoolTag::kClass:
-        obj = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
+        obj = ReadObject();
         ASSERT(obj.IsClass());
         break;
       case ConstantPoolTag::kTypeArgumentsField:
-        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
+        cls ^= ReadObject();
         obj = Smi::New(cls.type_arguments_field_offset() / kWordSize);
         break;
       case ConstantPoolTag::kTearOff:
-        obj = H.LookupStaticMethodByKernelProcedure(
-            helper_->ReadCanonicalNameReference());
+        obj = ReadObject();
         ASSERT(obj.IsFunction());
         obj = Function::Cast(obj).ImplicitClosureFunction();
         ASSERT(obj.IsFunction());
@@ -391,16 +511,16 @@
         obj = H.Canonicalize(Instance::Cast(obj));
         break;
       case ConstantPoolTag::kType:
-        obj = type_translator_.BuildType().raw();
+        obj = ReadObject();
         ASSERT(obj.IsAbstractType());
         break;
       case ConstantPoolTag::kTypeArguments:
-        obj = type_translator_.BuildTypeArguments(helper_->ReadListLength())
-                  .raw();
+        cls = Class::null();
+        obj = ReadTypeArguments(cls);
         ASSERT(obj.IsNull() || obj.IsTypeArguments());
         break;
       case ConstantPoolTag::kList: {
-        obj = type_translator_.BuildType().raw();
+        obj = ReadObject();
         ASSERT(obj.IsAbstractType());
         const intptr_t length = helper_->ReadListLength();
         array = Array::New(length, AbstractType::Cast(obj));
@@ -415,7 +535,7 @@
         ASSERT(!obj.IsNull());
       } break;
       case ConstantPoolTag::kInstance: {
-        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
+        cls ^= ReadObject();
         obj = Instance::New(cls, Heap::kOld);
         intptr_t type_args_index = helper_->ReadUInt();
         ASSERT(type_args_index < i);
@@ -425,9 +545,7 @@
         }
         intptr_t num_fields = helper_->ReadUInt();
         for (intptr_t j = 0; j < num_fields; j++) {
-          NameIndex field_name = helper_->ReadCanonicalNameReference();
-          ASSERT(H.IsField(field_name));
-          field = H.LookupFieldByKernelField(field_name);
+          field ^= ReadObject();
           intptr_t elem_index = helper_->ReadUInt();
           ASSERT(elem_index < i);
           elem = pool.ObjectAt(elem_index);
@@ -436,133 +554,21 @@
         obj = H.Canonicalize(Instance::Cast(obj));
       } break;
       case ConstantPoolTag::kTypeArgumentsForInstanceAllocation: {
-        cls = H.LookupClassByKernelClass(helper_->ReadCanonicalNameReference());
-        obj =
-            type_translator_
-                .BuildInstantiatedTypeArguments(cls, helper_->ReadListLength())
-                .raw();
+        cls ^= ReadObject();
+        obj = ReadTypeArguments(cls);
         ASSERT(obj.IsNull() || obj.IsTypeArguments());
       } break;
       case ConstantPoolTag::kClosureFunction: {
-        name = H.DartSymbolPlain(helper_->ReadStringReference()).raw();
-        const Function& closure = Function::Handle(
-            helper_->zone_,
-            Function::NewClosureFunction(name, inner_function,
-                                         TokenPosition::kNoSource));
-
-        FunctionNodeHelper function_node_helper(helper_);
-        function_node_helper.ReadUntilExcluding(
-            FunctionNodeHelper::kTypeParameters);
-        type_translator_.LoadAndSetupTypeParameters(
-            active_class_, closure, helper_->ReadListLength(), closure);
-        function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
-
-        // Scope remains opened until ConstantPoolTag::kEndClosureFunctionScope.
-        ActiveTypeParametersScope scope(
-            active_class_, &closure,
-            TypeArguments::Handle(helper_->zone_, closure.type_parameters()),
-            helper_->zone_);
-
-        function_node_helper.ReadUntilExcluding(
-            FunctionNodeHelper::kPositionalParameters);
-
-        intptr_t required_parameter_count =
-            function_node_helper.required_parameter_count_;
-        intptr_t total_parameter_count =
-            function_node_helper.total_parameter_count_;
-
-        intptr_t positional_parameter_count = helper_->ReadListLength();
-
-        intptr_t named_parameter_count =
-            total_parameter_count - positional_parameter_count;
-
-        const intptr_t extra_parameters = 1;
-        closure.set_num_fixed_parameters(extra_parameters +
-                                         required_parameter_count);
-        if (named_parameter_count > 0) {
-          closure.SetNumOptionalParameters(named_parameter_count, false);
-        } else {
-          closure.SetNumOptionalParameters(
-              positional_parameter_count - required_parameter_count, true);
-        }
-        intptr_t parameter_count = extra_parameters + total_parameter_count;
-        closure.set_parameter_types(Array::Handle(
-            helper_->zone_, Array::New(parameter_count, Heap::kOld)));
-        closure.set_parameter_names(Array::Handle(
-            helper_->zone_, Array::New(parameter_count, Heap::kOld)));
-
-        intptr_t pos = 0;
-        closure.SetParameterTypeAt(pos, AbstractType::dynamic_type());
-        closure.SetParameterNameAt(pos, Symbols::ClosureParameter());
-        pos++;
-
-        lib = active_class_->klass->library();
-        for (intptr_t j = 0; j < positional_parameter_count; ++j, ++pos) {
-          VariableDeclarationHelper helper(helper_);
-          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
-          const AbstractType& type = type_translator_.BuildVariableType();
-          Tag tag = helper_->ReadTag();  // read (first part of) initializer.
-          if (tag == kSomething) {
-            helper_->SkipExpression();  // read (actual) initializer.
-          }
-
-          closure.SetParameterTypeAt(pos, type);
-          closure.SetParameterNameAt(pos,
-                                     H.DartIdentifier(lib, helper.name_index_));
-        }
-
-        intptr_t named_parameter_count_check = helper_->ReadListLength();
-        ASSERT(named_parameter_count_check == named_parameter_count);
-        for (intptr_t j = 0; j < named_parameter_count; ++j, ++pos) {
-          VariableDeclarationHelper helper(helper_);
-          helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
-          const AbstractType& type = type_translator_.BuildVariableType();
-          Tag tag = helper_->ReadTag();  // read (first part of) initializer.
-          if (tag == kSomething) {
-            helper_->SkipExpression();  // read (actual) initializer.
-          }
-
-          closure.SetParameterTypeAt(pos, type);
-          closure.SetParameterNameAt(pos,
-                                     H.DartIdentifier(lib, helper.name_index_));
-        }
-
-        function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters);
-
-        const AbstractType& return_type = type_translator_.BuildVariableType();
-        closure.set_result_type(return_type);
-        function_node_helper.SetJustRead(FunctionNodeHelper::kReturnType);
-        // The closure has no body.
-        function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
-
-        // Finalize function type.
-        Type& signature_type =
-            Type::Handle(helper_->zone_, closure.SignatureType());
-        signature_type ^= ClassFinalizer::FinalizeType(*(active_class_->klass),
-                                                       signature_type);
-        closure.SetSignatureType(signature_type);
-
-        pool.SetTypeAt(i, ObjectPool::kTaggedObject, ObjectPool::kNotPatchable);
-        pool.SetObjectAt(i, closure);
-
-        // Continue reading the constant pool entries inside the opened
-        // ActiveTypeParametersScope until the scope gets closed by a
-        // kEndClosureFunctionScope tag, in which case control returns here.
-        i = ReadPoolEntries(function, closure, pool, i + 1);
-        // Pool entry at index i has been set to null, because it was a
-        // kEndClosureFunctionScope.
-        ASSERT(pool.ObjectAt(i) == Object::null());
-        continue;
-      }
+        intptr_t closure_index = helper_->ReadUInt();
+        obj = closures_->At(closure_index);
+        ASSERT(obj.IsFunction());
+      } break;
       case ConstantPoolTag::kEndClosureFunctionScope: {
         // Entry is not used and set to null.
         obj = Object::null();
-        pool.SetTypeAt(i, ObjectPool::kTaggedObject, ObjectPool::kNotPatchable);
-        pool.SetObjectAt(i, obj);
-        return i;  // The caller will close the scope.
       } break;
       case ConstantPoolTag::kNativeEntry: {
-        name = H.DartString(helper_->ReadStringReference()).raw();
+        name = ReadString();
         obj = NativeEntry(function, name);
         pool.SetTypeAt(i, ObjectPool::kNativeEntryData,
                        ObjectPool::kNotPatchable);
@@ -595,13 +601,8 @@
         obj = Object::empty_type_arguments().raw();
         break;
       case ConstantPoolTag::kSymbol: {
-        const NameIndex lib_index = helper_->ReadCanonicalNameReference();
-        lib = Library::null();
-        if (!H.IsRoot(lib_index)) {
-          lib = H.LookupLibraryByKernelLibrary(lib_index);
-        }
-        const String& symbol =
-            H.DartIdentifier(lib, helper_->ReadStringReference());
+        name ^= ReadObject();
+        ASSERT(name.IsSymbol());
         if (symbol_class == nullptr) {
           elem = Library::InternalLibrary();
           ASSERT(!elem.IsNull());
@@ -615,36 +616,54 @@
           ASSERT(!symbol_name_field->IsNull());
         }
         obj = Instance::New(*symbol_class, Heap::kOld);
-        Instance::Cast(obj).SetField(*symbol_name_field, symbol);
+        Instance::Cast(obj).SetField(*symbol_name_field, name);
         obj = H.Canonicalize(Instance::Cast(obj));
       } break;
+      case ConstantPoolTag::kInterfaceCall: {
+        helper_->ReadByte();  // TODO(regis): Remove, unneeded.
+        name ^= ReadObject();
+        ASSERT(name.IsSymbol());
+        intptr_t arg_desc_index = helper_->ReadUInt();
+        ASSERT(arg_desc_index < i);
+        array ^= pool.ObjectAt(arg_desc_index);
+        // InterfaceCall constant occupies 2 entries.
+        // The first entry is used for selector name.
+        pool.SetTypeAt(i, ObjectPool::kTaggedObject, ObjectPool::kNotPatchable);
+        pool.SetObjectAt(i, name);
+        ++i;
+        ASSERT(i < obj_count);
+        // The second entry is used for arguments descriptor.
+        obj = array.raw();
+      } break;
       default:
         UNREACHABLE();
     }
     pool.SetTypeAt(i, ObjectPool::kTaggedObject, ObjectPool::kNotPatchable);
     pool.SetObjectAt(i, obj);
   }
-  // Return the index of the last read pool entry.
-  return obj_count - 1;
 }
 
-RawCode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
+RawBytecode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
 #if !defined(PRODUCT)
   TimelineDurationScope tds(Thread::Current(), Timeline::GetCompilerStream(),
                             "BytecodeMetadataHelper::ReadBytecode");
 #endif  // !defined(PRODUCT)
-
-  intptr_t size = helper_->reader_.ReadUInt();
-  intptr_t offset = helper_->reader_.offset();
+  intptr_t size = helper_->ReadUInt();
+  intptr_t offset = Utils::RoundUp(helper_->reader_.offset(), sizeof(KBCInstr));
   const uint8_t* data = helper_->reader_.BufferAt(offset);
+  ASSERT(Utils::IsAligned(data, sizeof(KBCInstr)));
   helper_->reader_.set_offset(offset + size);
 
-  // Create and return code object.
-  return Code::FinalizeBytecode(reinterpret_cast<const void*>(data), size,
-                                pool);
+  const ExternalTypedData& instructions = ExternalTypedData::Handle(
+      helper_->zone_,
+      ExternalTypedData::New(kExternalTypedDataInt8ArrayCid,
+                             const_cast<uint8_t*>(data), size, Heap::kOld));
+
+  // Create and return bytecode object.
+  return Bytecode::New(instructions, pool);
 }
 
-void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode,
+void BytecodeMetadataHelper::ReadExceptionsTable(const Bytecode& bytecode,
                                                  bool has_exceptions_table) {
 #if !defined(PRODUCT)
   TimelineDurationScope tds(Thread::Current(), Timeline::GetCompilerStream(),
@@ -714,6 +733,17 @@
   }
 }
 
+void BytecodeMetadataHelper::ReadSourcePositions(const Bytecode& bytecode,
+                                                 bool has_source_positions) {
+  if (!has_source_positions) {
+    return;
+  }
+
+  intptr_t length = helper_->reader_.ReadUInt();
+  bytecode.set_source_positions_binary_offset(helper_->reader_.offset());
+  helper_->SkipBytes(length);
+}
+
 RawTypedData* BytecodeMetadataHelper::NativeEntry(const Function& function,
                                                   const String& external_name) {
   Zone* zone = helper_->zone_;
@@ -774,6 +804,411 @@
   return NativeEntryData::New(kind, trampoline, native_function, argc_tag);
 }
 
+RawArray* BytecodeMetadataHelper::ReadBytecodeComponent() {
+  const intptr_t md_offset = GetComponentMetadataPayloadOffset();
+  if (md_offset < 0) {
+    return Array::null();
+  }
+
+  ASSERT(Thread::Current()->IsMutatorThread());
+
+  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                              md_offset);
+
+  const intptr_t version = helper_->reader_.ReadUInt();
+  if ((version < KernelBytecode::kMinSupportedBytecodeFormatVersion) ||
+      (version > KernelBytecode::kMaxSupportedBytecodeFormatVersion)) {
+    FATAL3("Unsupported Dart bytecode format version %" Pd
+           ". "
+           "This version of Dart VM supports bytecode format versions from %" Pd
+           " to %" Pd ".",
+           version, KernelBytecode::kMinSupportedBytecodeFormatVersion,
+           KernelBytecode::kMaxSupportedBytecodeFormatVersion);
+  }
+
+  const intptr_t strings_size = helper_->reader_.ReadUInt();
+  helper_->reader_.ReadUInt();  // Objects table size.
+
+  // Read header of strings table.
+  const intptr_t strings_header_offset = helper_->reader_.offset();
+  const intptr_t num_one_byte_strings = helper_->reader_.ReadUInt32();
+  const intptr_t num_two_byte_strings = helper_->reader_.ReadUInt32();
+  const intptr_t strings_contents_offset =
+      helper_->reader_.offset() +
+      (num_one_byte_strings + num_two_byte_strings) * 4;
+
+  // Read header of objects table.
+  helper_->reader_.set_offset(strings_header_offset + strings_size);
+  const intptr_t num_objects = helper_->reader_.ReadUInt();
+  const intptr_t objects_size = helper_->reader_.ReadUInt();
+
+  // Skip over contents of objects.
+  const intptr_t objects_contents_offset = helper_->reader_.offset();
+  helper_->reader_.set_offset(objects_contents_offset + objects_size);
+
+  const Array& bytecode_component_array = Array::Handle(
+      Z, BytecodeComponentData::New(
+             Z, version, num_objects, strings_header_offset,
+             strings_contents_offset, objects_contents_offset, Heap::kOld));
+  BytecodeComponentData bytecode_component(bytecode_component_array);
+
+  // Read object offsets.
+  Smi& offs = Smi::Handle(helper_->zone_);
+  for (intptr_t i = 0; i < num_objects; ++i) {
+    offs = Smi::New(helper_->reader_.ReadUInt());
+    bytecode_component.SetObject(i, offs);
+  }
+
+  H.SetBytecodeComponent(bytecode_component_array);
+
+  return bytecode_component_array.raw();
+}
+
+// TODO(alexmarkov): create a helper class with cached handles to avoid handle
+// allocations.
+RawObject* BytecodeMetadataHelper::ReadObject() {
+  uint32_t header = helper_->reader_.ReadUInt();
+  if ((header & kReferenceBit) != 0) {
+    intptr_t index = header >> kIndexShift;
+    if (index == 0) {
+      return Object::null();
+    }
+    RawObject* obj = bytecode_component_->GetObject(index);
+    if (obj->IsHeapObject()) {
+      return obj;
+    }
+    // Object is not loaded yet.
+    intptr_t offset = bytecode_component_->GetObjectsContentsOffset() +
+                      Smi::Value(Smi::RawCast(obj));
+    AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                                offset);
+    header = helper_->reader_.ReadUInt();
+
+    obj = ReadObjectContents(header);
+    ASSERT(obj->IsHeapObject());
+    {
+      Thread* thread = H.thread();
+      REUSABLE_OBJECT_HANDLESCOPE(thread);
+      Object& obj_handle = thread->ObjectHandle();
+      obj_handle = obj;
+      bytecode_component_->SetObject(index, obj_handle);
+    }
+    return obj;
+  }
+
+  return ReadObjectContents(header);
+}
+
+RawObject* BytecodeMetadataHelper::ReadObjectContents(uint32_t header) {
+  ASSERT(((header & kReferenceBit) == 0));
+
+  // Must be in sync with enum ObjectKind in
+  // pkg/vm/lib/bytecode/object_table.dart.
+  enum ObjectKind {
+    kInvalid,
+    kLibrary,
+    kClass,
+    kMember,
+    kClosure,
+    kSimpleType,
+    kTypeParameter,
+    kGenericType,
+    kFunctionType,
+    kName,
+  };
+
+  // Member flags, must be in sync with _MemberHandle constants in
+  // pkg/vm/lib/bytecode/object_table.dart.
+  const intptr_t kFlagIsField = kFlagBit0;
+  const intptr_t kFlagIsConstructor = kFlagBit1;
+
+  // SimpleType flags, must be in sync with _SimpleTypeHandle constants in
+  // pkg/vm/lib/bytecode/object_table.dart.
+  const intptr_t kFlagIsDynamic = kFlagBit0;
+  const intptr_t kFlagIsVoid = kFlagBit1;
+
+  // FunctionType flags, must be in sync with _FunctionTypeHandle constants in
+  // pkg/vm/lib/bytecode/object_table.dart.
+  const int kFlagHasOptionalPositionalParams = kFlagBit0;
+  const int kFlagHasOptionalNamedParams = kFlagBit1;
+  const int kFlagHasTypeParams = kFlagBit2;
+
+  const intptr_t kind = (header >> kKindShift) & kKindMask;
+  const intptr_t flags = header & kFlagsMask;
+
+  switch (kind) {
+    case kInvalid:
+      UNREACHABLE();
+      break;
+    case kLibrary: {
+      const String& uri = String::Handle(Z, ReadString());
+      RawLibrary* library = Library::LookupLibrary(H.thread(), uri);
+      if (library == Library::null()) {
+        FATAL1("Unable to find library %s", uri.ToCString());
+      }
+      return library;
+    }
+    case kClass: {
+      const Library& library = Library::CheckedHandle(Z, ReadObject());
+      const String& class_name = String::CheckedHandle(Z, ReadObject());
+      if (class_name.raw() == Symbols::Empty().raw()) {
+        return library.toplevel_class();
+      }
+      RawClass* cls = library.LookupClassAllowPrivate(class_name);
+      if (cls == Class::null()) {
+        FATAL2("Unable to find class %s in %s", class_name.ToCString(),
+               library.ToCString());
+      }
+      return cls;
+    }
+    case kMember: {
+      const Class& cls = Class::CheckedHandle(Z, ReadObject());
+      String& name = String::CheckedHandle(Z, ReadObject());
+      if ((flags & kFlagIsField) != 0) {
+        RawField* field = cls.LookupFieldAllowPrivate(name);
+        if (field == Field::null()) {
+          FATAL2("Unable to find field %s in %s", name.ToCString(),
+                 cls.ToCString());
+        }
+        return field;
+      } else {
+        if ((flags & kFlagIsConstructor) != 0) {
+          GrowableHandlePtrArray<const String> pieces(Z, 3);
+          pieces.Add(String::Handle(Z, cls.Name()));
+          pieces.Add(Symbols::Dot());
+          pieces.Add(name);
+          name = Symbols::FromConcatAll(H.thread(), pieces);
+        }
+        RawFunction* function = cls.LookupFunctionAllowPrivate(name);
+        if (function == Function::null()) {
+          // When requesting a getter, also return method extractors.
+          if (Field::IsGetterName(name)) {
+            String& method_name =
+                String::Handle(Z, Field::NameFromGetter(name));
+            function = cls.LookupFunctionAllowPrivate(method_name);
+            if (function != Function::null()) {
+              function = Function::Handle(Z, function).GetMethodExtractor(name);
+              if (function != Function::null()) {
+                return function;
+              }
+            }
+          }
+          FATAL2("Unable to find function %s in %s", name.ToCString(),
+                 cls.ToCString());
+        }
+        return function;
+      }
+    }
+    case kClosure: {
+      ReadObject();  // Skip enclosing member.
+      const intptr_t closure_index = helper_->reader_.ReadUInt();
+      return closures_->At(closure_index);
+    }
+    case kSimpleType: {
+      const Class& cls = Class::CheckedHandle(Z, ReadObject());
+      if ((flags & kFlagIsDynamic) != 0) {
+        ASSERT(cls.IsNull());
+        return AbstractType::dynamic_type().raw();
+      }
+      if ((flags & kFlagIsVoid) != 0) {
+        ASSERT(cls.IsNull());
+        return AbstractType::void_type().raw();
+      }
+      return cls.DeclarationType();
+    }
+    case kTypeParameter: {
+      Object& parent = Object::Handle(Z, ReadObject());
+      const intptr_t index_in_parent = helper_->reader_.ReadUInt();
+      TypeArguments& type_parameters = TypeArguments::Handle(Z);
+      if (parent.IsClass()) {
+        type_parameters = Class::Cast(parent).type_parameters();
+      } else if (parent.IsFunction()) {
+        if (Function::Cast(parent).IsFactory()) {
+          // For factory constructors VM uses type parameters of a class
+          // instead of constructor's type parameters.
+          parent = Function::Cast(parent).Owner();
+          type_parameters = Class::Cast(parent).type_parameters();
+        } else {
+          type_parameters = Function::Cast(parent).type_parameters();
+        }
+      } else if (parent.IsNull()) {
+        ASSERT(function_type_type_parameters_ != nullptr);
+        type_parameters = function_type_type_parameters_->raw();
+      } else {
+        UNREACHABLE();
+      }
+      AbstractType& type =
+          AbstractType::Handle(Z, type_parameters.TypeAt(index_in_parent));
+      // TODO(alexmarkov): figure out how to skip this type finalization
+      // (consider finalizing type parameters of classes/functions eagerly).
+      return ClassFinalizer::FinalizeType(*active_class_->klass, type);
+    }
+    case kGenericType: {
+      const Class& cls = Class::CheckedHandle(Z, ReadObject());
+      const TypeArguments& type_arguments =
+          TypeArguments::Handle(Z, ReadTypeArguments(Class::Handle(Z)));
+      const Type& type = Type::Handle(
+          Z, Type::New(cls, type_arguments, TokenPosition::kNoSource));
+      return ClassFinalizer::FinalizeType(*active_class_->klass, type);
+    }
+    case kFunctionType: {
+      Function& signature_function = Function::ZoneHandle(
+          Z, Function::NewSignatureFunction(*active_class_->klass,
+                                            active_class_->enclosing != NULL
+                                                ? *active_class_->enclosing
+                                                : Function::Handle(Z),
+                                            TokenPosition::kNoSource));
+
+      return ReadFunctionSignature(
+          signature_function, (flags & kFlagHasOptionalPositionalParams) != 0,
+          (flags & kFlagHasOptionalNamedParams) != 0,
+          (flags & kFlagHasTypeParams) != 0,
+          /* has_positional_param_names = */ false);
+    }
+    case kName: {
+      const Library& library = Library::CheckedHandle(Z, ReadObject());
+      if (library.IsNull()) {
+        return ReadString();
+      } else {
+        const String& name =
+            String::Handle(Z, ReadString(/* is_canonical = */ false));
+        return library.PrivateName(name);
+      }
+    }
+  }
+
+  return Object::null();
+}
+
+RawString* BytecodeMetadataHelper::ReadString(bool is_canonical) {
+  const int kFlagTwoByteString = 1;
+  const int kHeaderFields = 2;
+  const int kUInt32Size = 4;
+
+  uint32_t ref = helper_->reader_.ReadUInt();
+  const bool isOneByteString = (ref & kFlagTwoByteString) == 0;
+  intptr_t index = ref >> 1;
+
+  if (!isOneByteString) {
+    const uint32_t num_one_byte_strings = helper_->reader_.ReadUInt32At(
+        bytecode_component_->GetStringsHeaderOffset());
+    index += num_one_byte_strings;
+  }
+
+  AlternativeReadingScope alt(&helper_->reader_, &H.metadata_payloads(),
+                              bytecode_component_->GetStringsHeaderOffset() +
+                                  (kHeaderFields + index - 1) * kUInt32Size);
+  intptr_t start_offs = helper_->ReadUInt32();
+  intptr_t end_offs = helper_->ReadUInt32();
+  if (index == 0) {
+    // For the 0-th string we read a header field instead of end offset of
+    // the previous string.
+    start_offs = 0;
+  }
+
+  // Bytecode strings reside in ExternalTypedData which is not movable by GC,
+  // so it is OK to take a direct pointer to string characters even if
+  // symbol allocation triggers GC.
+  const uint8_t* data = helper_->reader_.BufferAt(
+      bytecode_component_->GetStringsContentsOffset() + start_offs);
+
+  if (is_canonical) {
+    if (isOneByteString) {
+      return Symbols::FromLatin1(H.thread(), data, end_offs - start_offs);
+    } else {
+      return Symbols::FromUTF16(H.thread(),
+                                reinterpret_cast<const uint16_t*>(data),
+                                (end_offs - start_offs) >> 1);
+    }
+  } else {
+    if (isOneByteString) {
+      return String::FromLatin1(data, end_offs - start_offs, Heap::kOld);
+    } else {
+      return String::FromUTF16(reinterpret_cast<const uint16_t*>(data),
+                               (end_offs - start_offs) >> 1, Heap::kOld);
+    }
+  }
+}
+
+RawTypeArguments* BytecodeMetadataHelper::ReadTypeArguments(
+    const Class& instantiator) {
+  const intptr_t length = helper_->reader_.ReadUInt();
+  TypeArguments& type_arguments =
+      TypeArguments::ZoneHandle(Z, TypeArguments::New(length));
+  AbstractType& type = AbstractType::Handle(Z);
+  for (intptr_t i = 0; i < length; ++i) {
+    type ^= ReadObject();
+    type_arguments.SetTypeAt(i, type);
+  }
+
+  type_arguments = type_arguments.Canonicalize();
+
+  if (instantiator.IsNull()) {
+    return type_arguments.raw();
+  }
+
+  if (type_arguments.IsNull() && instantiator.NumTypeArguments() == length) {
+    return type_arguments.raw();
+  }
+
+  // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to
+  // finalize the argument types.
+  // (This can for example make the [type_arguments] vector larger)
+  type = Type::New(instantiator, type_arguments, TokenPosition::kNoSource);
+  type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type);
+  return type.arguments();
+}
+
+intptr_t BytecodeComponentData::GetVersion() const {
+  return Smi::Value(Smi::RawCast(data_.At(kVersion)));
+}
+
+intptr_t BytecodeComponentData::GetStringsHeaderOffset() const {
+  return Smi::Value(Smi::RawCast(data_.At(kStringsHeaderOffset)));
+}
+
+intptr_t BytecodeComponentData::GetStringsContentsOffset() const {
+  return Smi::Value(Smi::RawCast(data_.At(kStringsContentsOffset)));
+}
+
+intptr_t BytecodeComponentData::GetObjectsContentsOffset() const {
+  return Smi::Value(Smi::RawCast(data_.At(kObjectsContentsOffset)));
+}
+
+void BytecodeComponentData::SetObject(intptr_t index, const Object& obj) const {
+  data_.SetAt(kNumFields + index, obj);
+}
+
+RawObject* BytecodeComponentData::GetObject(intptr_t index) const {
+  return data_.At(kNumFields + index);
+}
+
+RawArray* BytecodeComponentData::New(Zone* zone,
+                                     intptr_t version,
+                                     intptr_t num_objects,
+                                     intptr_t strings_header_offset,
+                                     intptr_t strings_contents_offset,
+                                     intptr_t objects_contents_offset,
+                                     Heap::Space space) {
+  const Array& data =
+      Array::Handle(zone, Array::New(kNumFields + num_objects, space));
+  Smi& smi_handle = Smi::Handle(zone);
+
+  smi_handle = Smi::New(version);
+  data.SetAt(kVersion, smi_handle);
+
+  smi_handle = Smi::New(strings_header_offset);
+  data.SetAt(kStringsHeaderOffset, smi_handle);
+
+  smi_handle = Smi::New(strings_contents_offset);
+  data.SetAt(kStringsContentsOffset, smi_handle);
+
+  smi_handle = Smi::New(objects_contents_offset);
+  data.SetAt(kObjectsContentsOffset, smi_handle);
+
+  return data.raw();
+}
+
 RawError* BytecodeReader::ReadFunctionBytecode(Thread* thread,
                                                const Function& function) {
   ASSERT(!FLAG_precompiled_mode);
@@ -781,6 +1216,8 @@
   ASSERT(thread->sticky_error() == Error::null());
   ASSERT(Thread::Current()->IsMutatorThread());
 
+  VMTagScope tagScope(thread, VMTag::kLoadBytecodeTagId);
+
   LongJumpScope jump;
   if (setjmp(*jump.Set()) == 0) {
     StackZone stack_zone(thread);
@@ -817,12 +1254,7 @@
 
     return Error::null();
   } else {
-    StackZone stack_zone(thread);
-    Error& error = Error::Handle();
-    // We got an error during bytecode reading.
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
+    return thread->StealStickyError();
   }
 }
 
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
index bbde906..ad1fef8 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ b/runtime/vm/compiler/frontend/bytecode_reader.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_COMPILER_FRONTEND_BYTECODE_READER_H_
 
 #include "vm/compiler/frontend/kernel_translation_helper.h"
+#include "vm/constants_kbc.h"
 #include "vm/object.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -13,6 +14,8 @@
 namespace dart {
 namespace kernel {
 
+class BytecodeComponentData;
+
 // Helper class which provides access to bytecode metadata.
 class BytecodeMetadataHelper : public MetadataHelper {
  public:
@@ -26,24 +29,100 @@
 
   void ReadMetadata(const Function& function);
 
+  RawArray* ReadBytecodeComponent();
+
  private:
-  // Returns the index of the last read pool entry.
-  intptr_t ReadPoolEntries(const Function& function,
-                           const Function& inner_function,
-                           const ObjectPool& pool,
-                           intptr_t from_index);
-  RawCode* ReadBytecode(const ObjectPool& pool);
-  void ReadExceptionsTable(const Code& bytecode,
-                           bool has_exceptions_table = true);
+  // These constants should match corresponding constants in class ObjectHandle
+  // (pkg/vm/lib/bytecode/object_table.dart).
+  static const int kReferenceBit = 1 << 0;
+  static const int kIndexShift = 1;
+  static const int kKindShift = 1;
+  static const int kKindMask = 0x0f;
+  static const int kFlagBit0 = 1 << 5;
+  static const int kFlagBit1 = 1 << 6;
+  static const int kFlagBit2 = 1 << 7;
+  static const int kFlagsMask = (kFlagBit0 | kFlagBit1 | kFlagBit2);
+
+  class FunctionTypeScope : public ValueObject {
+   public:
+    explicit FunctionTypeScope(BytecodeMetadataHelper* bytecode_reader)
+        : bytecode_reader_(bytecode_reader),
+          saved_type_parameters_(
+              bytecode_reader->function_type_type_parameters_) {}
+
+    ~FunctionTypeScope() {
+      bytecode_reader_->function_type_type_parameters_ = saved_type_parameters_;
+    }
+
+   private:
+    BytecodeMetadataHelper* bytecode_reader_;
+    TypeArguments* const saved_type_parameters_;
+  };
+
+  void ReadClosureDeclaration(const Function& function, intptr_t closureIndex);
+  RawType* ReadFunctionSignature(const Function& func,
+                                 bool has_optional_positional_params,
+                                 bool has_optional_named_params,
+                                 bool has_type_params,
+                                 bool has_positional_param_names);
+  void ReadTypeParametersDeclaration(const Class& parameterized_class,
+                                     const Function& parameterized_function,
+                                     intptr_t num_type_params);
+
+  void ReadConstantPool(const Function& function, const ObjectPool& pool);
+  RawBytecode* ReadBytecode(const ObjectPool& pool);
+  void ReadExceptionsTable(const Bytecode& bytecode, bool has_exceptions_table);
+  void ReadSourcePositions(const Bytecode& bytecode, bool has_source_positions);
   RawTypedData* NativeEntry(const Function& function,
                             const String& external_name);
 
+  RawObject* ReadObject();
+  RawObject* ReadObjectContents(uint32_t header);
+  RawString* ReadString(bool is_canonical = true);
+  RawTypeArguments* ReadTypeArguments(const Class& instantiator);
+
   TypeTranslator& type_translator_;
   ActiveClass* const active_class_;
+  BytecodeComponentData* bytecode_component_;
+  Array* closures_;
+  TypeArguments* function_type_type_parameters_;
 
   DISALLOW_COPY_AND_ASSIGN(BytecodeMetadataHelper);
 };
 
+class BytecodeComponentData : ValueObject {
+ public:
+  enum {
+    kVersion,
+    kStringsHeaderOffset,
+    kStringsContentsOffset,
+    kObjectsContentsOffset,
+    kNumFields
+  };
+
+  explicit BytecodeComponentData(const Array& data) : data_(data) {}
+
+  intptr_t GetVersion() const;
+  intptr_t GetStringsHeaderOffset() const;
+  intptr_t GetStringsContentsOffset() const;
+  intptr_t GetObjectsContentsOffset() const;
+  void SetObject(intptr_t index, const Object& obj) const;
+  RawObject* GetObject(intptr_t index) const;
+
+  bool IsNull() const { return data_.IsNull(); }
+
+  static RawArray* New(Zone* zone,
+                       intptr_t version,
+                       intptr_t num_objects,
+                       intptr_t strings_header_offset,
+                       intptr_t strings_contents_offset,
+                       intptr_t objects_contents_offset,
+                       Heap::Space space);
+
+ private:
+  const Array& data_;
+};
+
 class BytecodeReader : public AllStatic {
  public:
   // Reads bytecode for the given function and sets its bytecode field.
@@ -52,6 +131,46 @@
                                         const Function& function);
 };
 
+class BytecodeSourcePositionsIterator : ValueObject {
+ public:
+  BytecodeSourcePositionsIterator(Zone* zone, const Bytecode& bytecode)
+      : reader_(ExternalTypedData::Handle(zone, bytecode.GetBinary(zone))),
+        pairs_remaining_(0),
+        cur_bci_(0),
+        cur_token_pos_(TokenPosition::kNoSource.value()) {
+    if (bytecode.HasSourcePositions()) {
+      reader_.set_offset(bytecode.source_positions_binary_offset());
+      pairs_remaining_ = reader_.ReadUInt();
+    }
+  }
+
+  bool MoveNext() {
+    if (pairs_remaining_ == 0) {
+      return false;
+    }
+    ASSERT(pairs_remaining_ > 0);
+    --pairs_remaining_;
+    cur_bci_ += reader_.ReadUInt();
+    cur_token_pos_ += reader_.ReadSLEB128();
+    return true;
+  }
+
+  intptr_t BytecodeInstructionIndex() const { return cur_bci_; }
+
+  uword PcOffset() const {
+    return KernelBytecode::BytecodePcToOffset(BytecodeInstructionIndex(),
+                                              /* is_return_address = */ true);
+  }
+
+  TokenPosition TokenPos() const { return TokenPosition(cur_token_pos_); }
+
+ private:
+  Reader reader_;
+  intptr_t pairs_remaining_;
+  intptr_t cur_bci_;
+  intptr_t cur_token_pos_;
+};
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.cc b/runtime/vm/compiler/frontend/constant_evaluator.cc
index a59c3a0..3ac3ecc 100644
--- a/runtime/vm/compiler/frontend/constant_evaluator.cc
+++ b/runtime/vm/compiler/frontend/constant_evaluator.cc
@@ -43,6 +43,8 @@
                                                    bool reset_position) {
   ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
   if (!GetCachedConstant(offset, &result_)) {
+    BailoutIfBackgroundCompilation();
+
     ASSERT(IsAllowedToEvaluate());
     intptr_t original_offset = helper_->ReaderOffset();
     helper_->SetOffset(offset);
@@ -104,6 +106,11 @@
       case kConstListLiteral:
         EvaluateListLiteralInternal();
         break;
+      case kConstSetLiteral:
+        // Set literals are currently desugared in the frontend and will not
+        // reach the VM. See http://dartbug.com/35124 for discussion.
+        UNREACHABLE();
+        break;
       case kConstMapLiteral:
         EvaluateMapLiteralInternal();
         break;
@@ -164,6 +171,8 @@
 Instance& ConstantEvaluator::EvaluateListLiteral(intptr_t offset,
                                                  bool reset_position) {
   if (!GetCachedConstant(offset, &result_)) {
+    BailoutIfBackgroundCompilation();
+
     ASSERT(IsAllowedToEvaluate());
     intptr_t original_offset = helper_->ReaderOffset();
     helper_->SetOffset(offset);
@@ -181,6 +190,8 @@
 Instance& ConstantEvaluator::EvaluateMapLiteral(intptr_t offset,
                                                 bool reset_position) {
   if (!GetCachedConstant(offset, &result_)) {
+    BailoutIfBackgroundCompilation();
+
     ASSERT(IsAllowedToEvaluate());
     intptr_t original_offset = helper_->ReaderOffset();
     helper_->SetOffset(offset);
@@ -199,6 +210,8 @@
     intptr_t offset,
     bool reset_position) {
   if (!GetCachedConstant(offset, &result_)) {
+    BailoutIfBackgroundCompilation();
+
     ASSERT(IsAllowedToEvaluate());
     intptr_t original_offset = helper_->ReaderOffset();
     helper_->SetOffset(offset);
@@ -216,6 +229,8 @@
 Instance& ConstantEvaluator::EvaluateStaticInvocation(intptr_t offset,
                                                       bool reset_position) {
   if (!GetCachedConstant(offset, &result_)) {
+    BailoutIfBackgroundCompilation();
+
     ASSERT(IsAllowedToEvaluate());
     intptr_t original_offset = helper_->ReaderOffset();
     helper_->SetOffset(offset);
@@ -235,11 +250,7 @@
   if (setjmp(*jump.Set()) == 0) {
     return EvaluateExpression(offset);
   } else {
-    Thread* thread = H.thread();
-    Error& error = Error::Handle(Z);
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
+    return H.thread()->StealStickyError();
   }
 }
 
@@ -257,6 +268,13 @@
   return metadata_values.raw();
 }
 
+void ConstantEvaluator::BailoutIfBackgroundCompilation() {
+  if (Compiler::IsBackgroundCompilation()) {
+    Compiler::AbortBackgroundCompilation(
+        DeoptId::kNone, "Cannot evaluate annotations in background compiler.");
+  }
+}
+
 bool ConstantEvaluator::IsBuildingFlowGraph() const {
   return flow_graph_builder_ != nullptr;
 }
@@ -363,10 +381,9 @@
       }
       Thread* thread = H.thread();
       const Error& error =
-          Error::Handle(thread->zone(), thread->sticky_error());
+          Error::Handle(thread->zone(), thread->StealStickyError());
       if (!error.IsNull()) {
         field.SetStaticValue(Object::null_instance());
-        thread->clear_sticky_error();
         H.ReportError(error, script_, position, "Not a constant expression.");
         UNREACHABLE();
       }
@@ -514,8 +531,6 @@
     // TODO(27590): Can we move this code into [ReceiverType]?
     type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type,
                                          ClassFinalizer::kFinalize);
-    ASSERT(!type.IsMalformedOrMalbounded());
-
     TypeArguments& canonicalized_type_arguments =
         TypeArguments::ZoneHandle(Z, type.arguments());
     canonicalized_type_arguments = canonicalized_type_arguments.Canonicalize();
@@ -591,7 +606,7 @@
   EvaluateExpression(helper_->ReaderOffset(), false);
 
   const AbstractType& type = T.BuildType();
-  if (!type.IsInstantiated() || type.IsMalformed()) {
+  if (!type.IsInstantiated()) {
     const String& type_str = String::Handle(type.UserVisibleName());
     H.ReportError(
         script_, position,
@@ -602,9 +617,8 @@
 
   const TypeArguments& instantiator_type_arguments = TypeArguments::Handle();
   const TypeArguments& function_type_arguments = TypeArguments::Handle();
-  Error& error = Error::Handle();
   if (!result_.IsInstanceOf(type, instantiator_type_arguments,
-                            function_type_arguments, &error)) {
+                            function_type_arguments)) {
     const AbstractType& rtype =
         AbstractType::Handle(result_.GetType(Heap::kNew));
     const String& result_str = String::Handle(rtype.UserVisibleName());
@@ -681,10 +695,6 @@
 
 void ConstantEvaluator::EvaluateTypeLiteral() {
   const AbstractType& type = T.BuildType();
-  if (type.IsMalformed()) {
-    H.ReportError(script_, TokenPosition::kNoSource,
-                  "Malformed type literal in constant expression.");
-  }
   result_ = type.raw();
 }
 
@@ -777,6 +787,12 @@
   // read type arguments.
   intptr_t num_type_args = helper_->ReadListLength();
   const TypeArguments* type_args = &T.BuildTypeArguments(num_type_args);
+  if (!type_args->IsNull() && !type_args->IsInstantiated()) {
+    H.ReportError(
+        script_, TokenPosition::kNoSource,
+        "Type arguments in partial instantiations must be instantiated and are "
+        "therefore not allowed to depend on type parameters.");
+  }
 
   // Create new closure with the type arguments inserted, and other things
   // copied over.
@@ -833,6 +849,10 @@
 }
 
 void ConstantEvaluator::EvaluateConstantExpression() {
+  // Please note that this constants array is constructed exactly once, see
+  // ReadConstantTable() and is immutable from that point on, so there is no
+  // need to guard against concurrent access between mutator and background
+  // compiler.
   KernelConstantsMap constant_map(H.constants().raw());
   result_ ^= constant_map.GetOrDie(helper_->ReadUInt());
   ASSERT(constant_map.Release().raw() == H.constants().raw());
@@ -847,7 +867,7 @@
   // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so
   // we should never end up evaluating constants using the VM's constant
   // evaluator.
-  if (FLAG_strong && FLAG_precompiled_mode) {
+  if (FLAG_precompiled_mode) {
     UNREACHABLE();
   }
 
@@ -929,7 +949,7 @@
   // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation, so
   // we should never end up evaluating constants using the VM's constant
   // evaluator.
-  if (FLAG_strong && FLAG_precompiled_mode) {
+  if (FLAG_precompiled_mode) {
     UNREACHABLE();
   }
 
@@ -1017,13 +1037,16 @@
   if (script_.compile_time_constants() == Array::null()) {
     return false;
   }
-  KernelConstantsMap constants(script_.compile_time_constants());
-  *value ^= constants.GetOrNull(kernel_offset + helper_->data_program_offset_,
-                                &is_present);
-  // Mutator compiler thread may add constants while background compiler
-  // is running, and thus change the value of 'compile_time_constants';
-  // do not assert that 'compile_time_constants' has not changed.
-  constants.Release();
+  {
+    // Any access to constants arrays must be locked since mutator and
+    // background compiler can access the array at the same time.
+    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
+
+    KernelConstantsMap constants(script_.compile_time_constants());
+    *value ^= constants.GetOrNull(kernel_offset + helper_->data_program_offset_,
+                                  &is_present);
+    constants.Release();
+  }
   return is_present;
 }
 
@@ -1046,10 +1069,16 @@
         HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew));
     script_.set_compile_time_constants(array);
   }
-  KernelConstantsMap constants(script_.compile_time_constants());
-  constants.InsertNewOrGetValue(kernel_offset + helper_->data_program_offset_,
-                                value);
-  script_.set_compile_time_constants(constants.Release());
+  {
+    // Any access to constants arrays must be locked since mutator and
+    // background compiler can access the array at the same time.
+    SafepointMutexLocker ml(H.thread()->isolate()->kernel_constants_mutex());
+
+    KernelConstantsMap constants(script_.compile_time_constants());
+    constants.InsertNewOrGetValue(kernel_offset + helper_->data_program_offset_,
+                                  value);
+    script_.set_compile_time_constants(constants.Release());
+  }
 }
 
 ConstantHelper::ConstantHelper(Zone* zone,
@@ -1140,12 +1169,11 @@
         break;
       }
       case kSymbolConstant: {
-        Tag initializer_tag = helper_.ReadTag();
-        if (initializer_tag == kSomething) {
-          const NameIndex index = helper_.ReadCanonicalNameReference();
-          temp_library_ = H.LookupLibraryByKernelLibrary(index);
-        } else {
+        const NameIndex index = helper_.ReadCanonicalNameReference();
+        if (index == -1) {
           temp_library_ = Library::null();
+        } else {
+          temp_library_ = H.LookupLibraryByKernelLibrary(index);
         }
         const String& symbol =
             H.DartIdentifier(temp_library_, helper_.ReadStringReference());
@@ -1265,6 +1293,14 @@
         // Note: This is already lowered to InstanceConstant/ListConstant.
         UNREACHABLE();
         break;
+      case kEnvironmentBoolConstant:
+      case kEnvironmentIntConstant:
+      case kEnvironmentStringConstant:
+      case kUnevaluatedConstant:
+        // We should not see unevaluated constants in the constant table, they
+        // should have been fully evaluated before we get them.
+        UNREACHABLE();
+        break;
       default:
         UNREACHABLE();
     }
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.h b/runtime/vm/compiler/frontend/constant_evaluator.h
index 6ce86bc..f5fe543 100644
--- a/runtime/vm/compiler/frontend/constant_evaluator.h
+++ b/runtime/vm/compiler/frontend/constant_evaluator.h
@@ -57,6 +57,8 @@
   RawObject* EvaluateAnnotations();
 
  private:
+  void BailoutIfBackgroundCompilation();
+
   bool IsBuildingFlowGraph() const;
   bool IsAllowedToEvaluate() const;
   void EvaluateAsExpression();
diff --git a/runtime/vm/compiler/frontend/entrypoints_pragma.md b/runtime/vm/compiler/frontend/entrypoints_pragma.md
deleted file mode 100644
index 3fcb451..0000000
--- a/runtime/vm/compiler/frontend/entrypoints_pragma.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Pragma for testing multiple entrypoints
-
-Example:
-
-```dart
-void hook(String functionName, int entryPointId) {
-  // ...
-}
-
-class C<T> {
-  @pragma("vm:testing.unsafe.trace-entrypoints-fn", hook)
-  void foo(T x) {
-    // ...
-  }
-}
-```
-
-When `foo` is invoked, `hook` will be called in `foo`'s prologue if `foo` was
-compiled with multiple entrypoints. `hook` will be passed the name of the
-function it was called for and the ID of the entrypoint used for the invocation:
-
-- 0: Normal entry.
-
-- 1: Unchecked entry: prologue was short so separate prologues for normal and
-  unchecked entry were compiled.
-
-- 2: Unchecked shared entry: prologue was long, so normal and unchecked entry
-  set a temporary and type-checks are predicated on the temporary.
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc
index 2f04698..3d14de6 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc
@@ -356,7 +356,7 @@
   // Bail if the type is a function or a Dart Function type.
   if (type.IsFunctionType() || type.IsDartFunctionType()) return false;
 
-  ASSERT(type.HasResolvedTypeClass());
+  ASSERT(type.HasTypeClass());
   const Class& type_class = Class::Handle(type.type_class());
   // Bail if the type has any type parameters.
   if (type_class.IsGeneric()) return false;
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 4835b6a..8bcbb49 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -35,10 +35,6 @@
   return klass;
 }
 
-bool StreamingFlowGraphBuilder::optimizing() {
-  return flow_graph_builder_->optimizing_;
-}
-
 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFieldInitializer() {
   FieldHelper field_helper(this);
   field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
@@ -432,7 +428,7 @@
 Fragment StreamingFlowGraphBuilder::BuildDefaultTypeHandling(
     const Function& function,
     intptr_t type_parameters_offset) {
-  if (function.IsGeneric() && FLAG_reify_generic_functions) {
+  if (function.IsGeneric()) {
     AlternativeReadingScope alt(&reader_);
     SetOffset(type_parameters_offset);
     intptr_t num_type_params = ReadListLength();
@@ -468,7 +464,16 @@
 
 void StreamingFlowGraphBuilder::RecordUncheckedEntryPoint(
     FunctionEntryInstr* extra_entry) {
-  if (!B->IsInlining()) {
+  // Closures always check all arguments on their checked entry-point, most
+  // call-sites are unchecked, and they're inlined less often, so it's very
+  // beneficial to build multiple entry-points for them. Regular methods however
+  // have fewer checks to begin with since they have dynamic invocation
+  // forwarders, so in AOT we implement a more conservative time-space tradeoff
+  // by only building the unchecked entry-point when inlining. We should
+  // reconsider this heuristic if we identify non-inlined type-checks in
+  // hotspots of new benchmarks.
+  if (!B->IsInlining() && (parsed_function()->function().IsClosureFunction() ||
+                           !FLAG_precompiled_mode)) {
     B->graph_entry_->set_unchecked_entry(extra_entry);
   } else if (B->InliningUncheckedEntry()) {
     B->graph_entry_->set_normal_entry(extra_entry);
@@ -510,7 +515,6 @@
   BlockEntryInstr* instruction_cursor =
       flow_graph_builder_->BuildPrologue(normal_entry, &prologue_info);
 
-
   const Fragment prologue =
       flow_graph_builder_->CheckStackOverflowInPrologue(function.token_pos());
 
@@ -520,6 +524,10 @@
   const Fragment default_type_handling =
       BuildDefaultTypeHandling(function, ReaderOffset());
 
+  const ProcedureAttributesMetadata parent_attrs =
+      procedure_attributes_metadata_helper_.GetProcedureAttributes(
+          parent.kernel_offset());
+
   // We're going to throw away the explicit checks because the target will
   // always check them.
   Fragment implicit_checks;
@@ -530,18 +538,18 @@
       // static methods they forward to don't do it themselves.
       AlternativeReadingScope _(&reader_);
       BuildArgumentTypeChecks(kCheckAllTypeParameterBounds,
-                              &explicit_checks_unused, &implicit_checks);
+                              &explicit_checks_unused, &implicit_checks,
+                              nullptr);
     } else {
       // Check if parent function was annotated with no-dynamic-invocations.
-      const ProcedureAttributesMetadata attrs =
-          procedure_attributes_metadata_helper_.GetProcedureAttributes(
-              parent.kernel_offset());
-      if (MethodCanSkipTypeChecksForNonCovariantArguments(parent, attrs)) {
+      if (MethodCanSkipTypeChecksForNonCovariantArguments(parent,
+                                                          parent_attrs)) {
         // If it was then we might need to build some checks in the
         // tear-off.
         AlternativeReadingScope _(&reader_);
         BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds,
-                                &explicit_checks_unused, &implicit_checks);
+                                &explicit_checks_unused, &implicit_checks,
+                                nullptr);
       }
     }
   }
@@ -552,7 +560,7 @@
       FunctionNodeHelper::kPositionalParameters);
 
   intptr_t type_args_len = 0;
-  if (function.IsGeneric() && FLAG_reify_generic_functions) {
+  if (function.IsGeneric()) {
     type_args_len = function.NumTypeParameters();
     ASSERT(parsed_function()->function_type_arguments() != NULL);
     body += LoadLocal(parsed_function()->function_type_arguments());
@@ -565,8 +573,9 @@
     // closed-over receiver.
     body +=
         LoadLocal(parsed_function()->node_sequence()->scope()->VariableAt(0));
-    body += LoadField(Closure::context_offset());
-    body += flow_graph_builder_->LoadField(Context::variable_offset(0));
+    body += LoadNativeField(Slot::Closure_context());
+    body += LoadNativeField(
+        Slot::GetContextVariableSlotFor(thread(), *scopes()->this_variable));
     body += PushArgument();
   }
 
@@ -633,6 +642,7 @@
       extra_entry = BuildSharedUncheckedEntryPoint(
           /*shared_prologue_linked_in=*/shared_prologue,
           /*skippable_checks=*/default_type_handling + implicit_checks,
+          /*redefinitions_if_skipped=*/Fragment(),
           /*body=*/body);
     }
     RecordUncheckedEntryPoint(extra_entry);
@@ -678,15 +688,17 @@
   if (is_implicit_closure_function && !function.is_static()) {
     if (parsed_function()->has_arg_desc_var()) {
       body += B->LoadArgDescriptor();
-      body += LoadField(ArgumentsDescriptor::count_offset());
+      body += LoadNativeField(Slot::ArgumentsDescriptor_count());
       body += LoadLocal(parsed_function()->current_context_var());
-      body += B->LoadField(Context::variable_offset(0));
+      body += B->LoadNativeField(
+          Slot::GetContextVariableSlotFor(thread(), *scopes()->this_variable));
       body += B->StoreFpRelativeSlot(kWordSize *
                                      compiler_frame_layout.param_end_from_fp);
       body += Drop();
     } else {
       body += LoadLocal(parsed_function()->current_context_var());
-      body += B->LoadField(Context::variable_offset(0));
+      body += B->LoadNativeField(
+          Slot::GetContextVariableSlotFor(thread(), *scopes()->this_variable));
       body += B->StoreFpRelativeSlot(
           kWordSize *
           (compiler_frame_layout.param_end_from_fp + function.NumParameters()));
@@ -699,7 +711,8 @@
 
   if (function.NeedsArgumentTypeChecks(I)) {
     AlternativeReadingScope _(&reader_);
-    BuildArgumentTypeChecks(kCheckAllTypeParameterBounds, &body, &body);
+    BuildArgumentTypeChecks(kCheckAllTypeParameterBounds, &body, &body,
+                            nullptr);
   }
 
   function_node_helper.ReadUntilExcluding(
@@ -713,7 +726,7 @@
   body += IntConstant(0);
   body += StoreLocal(TokenPosition::kNoSource, argument_count_var);
   body += Drop();
-  if (function.IsGeneric() && FLAG_reify_generic_functions) {
+  if (function.IsGeneric()) {
     Fragment then;
     Fragment otherwise;
     otherwise += IntConstant(1);
@@ -724,7 +737,7 @@
 
   if (function.HasOptionalParameters()) {
     body += B->LoadArgDescriptor();
-    body += LoadField(ArgumentsDescriptor::count_offset());
+    body += LoadNativeField(Slot::ArgumentsDescriptor_count());
   } else {
     body += IntConstant(function.NumParameters());
   }
@@ -762,7 +775,7 @@
     //   arguments[0] = function_type_arguments;
     //   i = 1;
     // }
-    if (function.IsGeneric() && FLAG_reify_generic_functions) {
+    if (function.IsGeneric()) {
       Fragment store;
       store += LoadLocal(arguments);
       store += IntConstant(0);
@@ -826,18 +839,12 @@
       AbstractType& type = AbstractType::ZoneHandle(Z);
       type ^= Type::New(owner, TypeArguments::Handle(Z), owner.token_pos(),
                         Heap::kOld);
-      // If the current class is the result of a mixin application, we must
-      // use the class scope of the class from which the function originates.
-      if (owner.IsMixinApplication()) {
-        ClassFinalizer::FinalizeType(
-            Class::Handle(Z, parsed_function()->function().origin()), type);
-      } else {
-        type ^= ClassFinalizer::FinalizeType(owner, type);
-      }
+      type ^= ClassFinalizer::FinalizeType(owner, type);
       body += Constant(type);
     } else {
       body += LoadLocal(parsed_function()->current_context_var());
-      body += B->LoadField(Context::variable_offset(0));
+      body += B->LoadNativeField(
+          Slot::GetContextVariableSlotFor(thread(), *scopes()->this_variable));
     }
   } else {
     LocalScope* scope = parsed_function()->node_sequence()->scope();
@@ -949,7 +956,8 @@
 void StreamingFlowGraphBuilder::BuildArgumentTypeChecks(
     TypeChecksToBuild mode,
     Fragment* explicit_checks,
-    Fragment* implicit_checks) {
+    Fragment* implicit_checks,
+    Fragment* implicit_redefinitions) {
   if (!I->should_emit_strong_mode_checks()) return;
 
   FunctionNodeHelper function_node_helper(this);
@@ -974,9 +982,6 @@
     ASSERT(forwarding_params.Length() == num_type_params);
   }
 
-  const bool has_reified_type_arguments =
-      FLAG_strong && FLAG_reify_generic_functions;
-
   TypeParameter& forwarding_param = TypeParameter::Handle(Z);
   Fragment check_bounds;
   for (intptr_t i = 0; i < num_type_params; ++i) {
@@ -986,10 +991,6 @@
     AbstractType& bound = T.BuildType();  // read bound
     helper.Finish();
 
-    if (!has_reified_type_arguments) {
-      continue;
-    }
-
     if (forwarding_target != NULL) {
       forwarding_param ^= forwarding_params.TypeAt(i);
       bound = forwarding_param.bound();
@@ -1071,6 +1072,18 @@
     *checks += LoadLocal(param);
     *checks += CheckArgumentType(param, *target_type);
     *checks += Drop();
+
+    if (!helper.IsCovariant() && implicit_redefinitions != nullptr &&
+        B->optimizing_) {
+      // We generate slightly different code in optimized vs. un-optimized code,
+      // which is ok since we don't allocate any deopt ids.
+      AssertNoDeoptIdsAllocatedScope no_deopt_allocation(H.thread());
+
+      *implicit_redefinitions += LoadLocal(param);
+      *implicit_redefinitions += RedefinitionWithType(*target_type);
+      *implicit_redefinitions += StoreLocal(TokenPosition::kNoSource, param);
+      *implicit_redefinitions += Drop();
+    }
   }
 
   // Named.
@@ -1100,12 +1113,22 @@
     *checks += LoadLocal(param);
     *checks += CheckArgumentType(param, *target_type);
     *checks += Drop();
+
+    if (!helper.IsCovariant() && implicit_redefinitions != nullptr &&
+        B->optimizing_) {
+      // We generate slightly different code in optimized vs. un-optimized code,
+      // which is ok since we don't allocate any deopt ids.
+      AssertNoDeoptIdsAllocatedScope no_deopt_allocation(H.thread());
+
+      *implicit_redefinitions += LoadLocal(param);
+      *implicit_redefinitions += RedefinitionWithType(*target_type);
+      *implicit_redefinitions += StoreLocal(TokenPosition::kNoSource, param);
+      *implicit_redefinitions += Drop();
+    }
   }
 }
 
 Fragment StreamingFlowGraphBuilder::PushAllArguments(PushedArguments* pushed) {
-  ASSERT(FLAG_strong);
-
   FunctionNodeHelper function_node_helper(this);
   function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
 
@@ -1119,11 +1142,9 @@
       helper.Finish();
     }
 
-    if (FLAG_reify_generic_functions) {
-      body += LoadLocal(parsed_function()->function_type_arguments());
-      body += PushArgument();
-      pushed->type_args_len = num_type_params;
-    }
+    body += LoadLocal(parsed_function()->function_type_arguments());
+    body += PushArgument();
+    pushed->type_args_len = num_type_params;
   }
   function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
   function_node_helper.ReadUntilExcluding(
@@ -1222,8 +1243,8 @@
   {
     AlternativeReadingScope alt(&reader_);
     SetOffset(type_parameters_offset);
-    BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds, &body,
-                            &body);
+    BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds, &body, &body,
+                            nullptr);
   }
 
   // Push all arguments and invoke the original method.
@@ -1327,8 +1348,7 @@
       BuildDefaultTypeHandling(dart_function, type_parameters_offset);
 
   if (dart_function.IsClosureFunction() &&
-      dart_function.NumParentTypeParameters() > 0 &&
-      FLAG_reify_generic_functions) {
+      dart_function.NumParentTypeParameters() > 0) {
     LocalVariable* closure =
         parsed_function()->node_sequence()->scope()->VariableAt(0);
 
@@ -1343,7 +1363,7 @@
       prologue += LoadLocal(fn_type_args);
       prologue += PushArgument();
       prologue += LoadLocal(closure);
-      prologue += LoadField(Closure::function_type_arguments_offset());
+      prologue += LoadNativeField(Slot::Closure_function_type_arguments());
       prologue += PushArgument();
       prologue += IntConstant(dart_function.NumParentTypeParameters());
       prologue += PushArgument();
@@ -1364,7 +1384,7 @@
       prologue += Drop();
     } else {
       prologue += LoadLocal(closure);
-      prologue += LoadField(Closure::function_type_arguments_offset());
+      prologue += LoadNativeField(Slot::Closure_function_type_arguments());
       prologue += StoreLocal(TokenPosition::kNoSource, fn_type_args);
       prologue += Drop();
     }
@@ -1448,10 +1468,9 @@
 Fragment StreamingFlowGraphBuilder::SetupCapturedParameters(
     const Function& dart_function) {
   Fragment body;
-  intptr_t context_size =
-      parsed_function()->node_sequence()->scope()->num_context_variables();
-  if (context_size > 0) {
-    body += flow_graph_builder_->PushContext(context_size);
+  const LocalScope* scope = parsed_function()->node_sequence()->scope();
+  if (scope->num_context_variables() > 0) {
+    body += flow_graph_builder_->PushContext(scope);
     LocalVariable* context = MakeTemporary();
 
     // Copy captured parameters from the stack into the context.
@@ -1477,7 +1496,7 @@
         body += LoadLocal(&raw_parameter);
         body += flow_graph_builder_->StoreInstanceField(
             TokenPosition::kNoSource,
-            Context::variable_offset(variable->index().value()));
+            Slot::GetContextVariableSlotFor(thread(), *variable));
         body += NullConstant();
         body += StoreLocal(TokenPosition::kNoSource, &raw_parameter);
         body += Drop();
@@ -1498,7 +1517,8 @@
     const Function& dart_function,
     intptr_t type_parameters_offset,
     Fragment* explicit_checks,
-    Fragment* implicit_checks) {
+    Fragment* implicit_checks,
+    Fragment* implicit_redefinitions) {
   if (!dart_function.NeedsArgumentTypeChecks(I)) return;
 
   // Check if parent function was annotated with no-dynamic-invocations.
@@ -1512,7 +1532,7 @@
       MethodCanSkipTypeChecksForNonCovariantArguments(dart_function, attrs)
           ? kCheckCovariantTypeParameterBounds
           : kCheckAllTypeParameterBounds,
-      explicit_checks, implicit_checks);
+      explicit_checks, implicit_checks, implicit_redefinitions);
 }
 
 Fragment StreamingFlowGraphBuilder::ShortcutForUserDefinedEquals(
@@ -1612,25 +1632,30 @@
 Fragment StreamingFlowGraphBuilder::BuildEntryPointsIntrospection() {
   if (!FLAG_enable_testing_pragmas) return Drop();
 
-  Function& function = Function::Handle(parsed_function()->function().raw());
+  auto& function = Function::Handle(Z, parsed_function()->function().raw());
 
   if (function.IsImplicitClosureFunction()) {
-    const Function& parent =
-        Function::ZoneHandle(Z, function.parent_function());
-    const String& func_name = String::ZoneHandle(Z, parent.name());
-    const Class& owner = Class::ZoneHandle(Z, parent.Owner());
+    const auto& parent = Function::Handle(Z, function.parent_function());
+    const auto& func_name = String::Handle(Z, parent.name());
+    const auto& owner = Class::Handle(Z, parent.Owner());
     function = owner.LookupFunction(func_name);
   }
 
-  Object& options = Object::Handle();
-  if (!function.FindPragma(I, Symbols::vm_trace_entrypoints(), &options) ||
+  auto& tmp = Object::Handle(Z);
+  tmp = function.Owner();
+  tmp = Class::Cast(tmp).library();
+  auto& library = Library::Cast(tmp);
+
+  Object& options = Object::Handle(Z);
+  if (!library.FindPragma(H.thread(), function, Symbols::vm_trace_entrypoints(),
+                          &options) ||
       options.IsNull() || !options.IsClosure()) {
     return Drop();
   }
-  Closure& closure = Closure::ZoneHandle(Z, Closure::Cast(options).raw());
+  auto& closure = Closure::ZoneHandle(Z, Closure::Cast(options).raw());
   LocalVariable* entry_point_num = MakeTemporary();
 
-  String& function_name = String::ZoneHandle(
+  auto& function_name = String::ZoneHandle(
       Z, String::New(function.ToLibNamePrefixedQualifiedCString(), Heap::kOld));
   if (parsed_function()->function().IsImplicitClosureFunction()) {
     function_name = String::Concat(
@@ -1648,7 +1673,7 @@
   call_hook += Constant(Function::ZoneHandle(Z, closure.function()));
   call_hook += B->ClosureCall(TokenPosition::kNoSource,
                               /*type_args_len=*/0, /*argument_count=*/3,
-                              /*argument_names=*/Array::Handle());
+                              /*argument_names=*/Array::ZoneHandle(Z));
   call_hook += Drop();  // result of closure call
   call_hook += Drop();  // entrypoint number
   return call_hook;
@@ -1657,6 +1682,7 @@
 FunctionEntryInstr* StreamingFlowGraphBuilder::BuildSharedUncheckedEntryPoint(
     Fragment shared_prologue_linked_in,
     Fragment skippable_checks,
+    Fragment redefinitions_if_skipped,
     Fragment body) {
   ASSERT(shared_prologue_linked_in.entry == B->graph_entry_->normal_entry());
   ASSERT(parsed_function()->has_entry_points_temp_var());
@@ -1695,7 +1721,7 @@
   JoinEntryInstr* rest_entry = B->BuildJoinEntry();
 
   Fragment(do_checks) + skippable_checks + Goto(rest_entry);
-  Fragment(skip_checks) + Goto(rest_entry);
+  Fragment(skip_checks) + redefinitions_if_skipped + Goto(rest_entry);
   Fragment(rest_entry) + body;
 
   return extra_target_entry;
@@ -1815,8 +1841,10 @@
 
   Fragment explicit_type_checks;
   Fragment implicit_type_checks;
+  Fragment implicit_redefinitions;
   CheckArgumentTypesAsNecessary(dart_function, type_parameters_offset,
-                                &explicit_type_checks, &implicit_type_checks);
+                                &explicit_type_checks, &implicit_type_checks,
+                                &implicit_redefinitions);
 
   const Fragment body =
       BuildFunctionBody(dart_function, first_parameter, is_constructor);
@@ -1860,6 +1888,7 @@
         extra_entry = BuildSharedUncheckedEntryPoint(
             /*shared_prologue_linked_in=*/prologue,
             /*skippable_checks=*/implicit_type_checks,
+            /*redefinitions_if_skipped=*/implicit_redefinitions,
             /*body=*/body);
         break;
       }
@@ -2086,6 +2115,12 @@
       return BuildListLiteral(false, position);
     case kConstListLiteral:
       return BuildListLiteral(true, position);
+    case kSetLiteral:
+    case kConstSetLiteral:
+      // Set literals are currently desugared in the frontend and will not
+      // reach the VM. See http://dartbug.com/35124 for discussion.
+      UNREACHABLE();
+      break;
     case kMapLiteral:
       return BuildMapLiteral(false, position);
     case kConstMapLiteral:
@@ -2418,6 +2453,11 @@
   return flow_graph_builder_->LoadStaticField();
 }
 
+Fragment StreamingFlowGraphBuilder::RedefinitionWithType(
+    const AbstractType& type) {
+  return flow_graph_builder_->RedefinitionWithType(type);
+}
+
 Fragment StreamingFlowGraphBuilder::CheckNull(
     TokenPosition position,
     LocalVariable* receiver,
@@ -2442,10 +2482,11 @@
     const Array& argument_names,
     ICData::RebindRule rebind_rule,
     const InferredTypeMetadata* result_type,
-    intptr_t type_args_count) {
-  return flow_graph_builder_->StaticCall(position, target, argument_count,
-                                         argument_names, rebind_rule,
-                                         result_type, type_args_count);
+    intptr_t type_args_count,
+    bool use_unchecked_entry) {
+  return flow_graph_builder_->StaticCall(
+      position, target, argument_count, argument_names, rebind_rule,
+      result_type, type_args_count, use_unchecked_entry);
 }
 
 Fragment StreamingFlowGraphBuilder::InstanceCall(
@@ -2509,12 +2550,13 @@
   return flow_graph_builder_->AllocateObject(klass, closure_function);
 }
 
-Fragment StreamingFlowGraphBuilder::AllocateContext(intptr_t size) {
-  return flow_graph_builder_->AllocateContext(size);
+Fragment StreamingFlowGraphBuilder::AllocateContext(
+    const GrowableArray<LocalVariable*>& context_variables) {
+  return flow_graph_builder_->AllocateContext(context_variables);
 }
 
-Fragment StreamingFlowGraphBuilder::LoadField(intptr_t offset) {
-  return flow_graph_builder_->LoadField(offset);
+Fragment StreamingFlowGraphBuilder::LoadNativeField(const Slot& field) {
+  return flow_graph_builder_->LoadNativeField(field);
 }
 
 Fragment StreamingFlowGraphBuilder::StoreLocal(TokenPosition position,
@@ -2527,11 +2569,6 @@
   return flow_graph_builder_->StoreStaticField(position, field);
 }
 
-Fragment StreamingFlowGraphBuilder::StoreInstanceField(TokenPosition position,
-                                                       intptr_t offset) {
-  return flow_graph_builder_->StoreInstanceField(position, offset);
-}
-
 Fragment StreamingFlowGraphBuilder::StringInterpolate(TokenPosition position) {
   return flow_graph_builder_->StringInterpolate(position);
 }
@@ -2566,12 +2603,13 @@
 }
 
 Fragment StreamingFlowGraphBuilder::CheckStackOverflow(TokenPosition position) {
-  return flow_graph_builder_->CheckStackOverflow(position);
+  return flow_graph_builder_->CheckStackOverflow(
+      position, flow_graph_builder_->loop_depth_);
 }
 
 Fragment StreamingFlowGraphBuilder::CloneContext(
-    intptr_t num_context_variables) {
-  return flow_graph_builder_->CloneContext(num_context_variables);
+    const GrowableArray<LocalVariable*>& context_variables) {
+  return flow_graph_builder_->CloneContext(context_variables);
 }
 
 Fragment StreamingFlowGraphBuilder::TranslateFinallyFinalizers(
@@ -2709,15 +2747,6 @@
   return flow_graph_builder_->CheckBoolean(position);
 }
 
-Fragment StreamingFlowGraphBuilder::CheckAssignableInCheckedMode(
-    const AbstractType& dst_type,
-    const String& dst_name) {
-  if (I->type_checks()) {
-    return flow_graph_builder_->CheckAssignable(dst_type, dst_name);
-  }
-  return Fragment();
-}
-
 Fragment StreamingFlowGraphBuilder::CheckArgumentType(
     LocalVariable* variable,
     const AbstractType& type) {
@@ -2733,27 +2762,10 @@
                                             bound, dst_name);
 }
 
-Fragment StreamingFlowGraphBuilder::CheckVariableTypeInCheckedMode(
-    intptr_t variable_kernel_position) {
-  if (I->type_checks()) {
-    LocalVariable* variable = LookupVariable(variable_kernel_position);
-    return flow_graph_builder_->CheckVariableTypeInCheckedMode(
-        variable->type(), variable->name());
-  }
-  return Fragment();
-}
-
-Fragment StreamingFlowGraphBuilder::CheckVariableTypeInCheckedMode(
-    const AbstractType& dst_type,
-    const String& name_symbol) {
-  return flow_graph_builder_->CheckVariableTypeInCheckedMode(dst_type,
-                                                             name_symbol);
-}
-
 Fragment StreamingFlowGraphBuilder::EnterScope(
     intptr_t kernel_offset,
-    intptr_t* num_context_variables) {
-  return flow_graph_builder_->EnterScope(kernel_offset, num_context_variables);
+    const LocalScope** scope /* = nullptr */) {
+  return flow_graph_builder_->EnterScope(kernel_offset, scope);
 }
 
 Fragment StreamingFlowGraphBuilder::ExitScope(intptr_t kernel_offset) {
@@ -2903,7 +2915,9 @@
   TokenPosition pos = ReadPosition();
   if (position != NULL) *position = pos;
   const String& message = H.DartString(ReadStringReference());
-  H.ReportError(script(), pos, "%s", message.ToCString());
+  // Invalid expression message has pointer to the source code, no need to
+  // report it twice.
+  H.ReportError(script(), TokenPosition::kNoSource, "%s", message.ToCString());
   return Fragment();
 }
 
@@ -2933,7 +2947,6 @@
   if (NeedsDebugStepCheck(stack(), position)) {
     instructions = DebugStepCheck(position) + instructions;
   }
-  instructions += CheckVariableTypeInCheckedMode(variable_kernel_position);
   instructions +=
       StoreLocal(position, LookupVariable(variable_kernel_position));
   return instructions;
@@ -2950,7 +2963,6 @@
   if (NeedsDebugStepCheck(stack(), position)) {
     instructions = DebugStepCheck(position) + instructions;
   }
-  instructions += CheckVariableTypeInCheckedMode(variable_kernel_position);
   instructions +=
       StoreLocal(position, LookupVariable(variable_kernel_position));
 
@@ -2983,7 +2995,7 @@
   const Function* interface_target = &Function::null_function();
   const NameIndex itarget_name =
       ReadCanonicalNameReference();  // read interface_target_reference.
-  if (FLAG_strong && !H.IsRoot(itarget_name) &&
+  if (!H.IsRoot(itarget_name) &&
       (H.IsGetter(itarget_name) || H.IsField(itarget_name))) {
     interface_target = &Function::ZoneHandle(
         Z,
@@ -3022,12 +3034,14 @@
       direct_call_metadata_helper_.GetDirectTargetForPropertySet(offset);
   const CallSiteAttributesMetadata call_site_attributes =
       call_site_attributes_metadata_helper_.GetCallSiteAttributes(offset);
+  const InferredTypeMetadata inferred_type =
+      inferred_type_metadata_helper_.GetInferredType(offset);
 
   // True if callee can skip argument type checks.
-  bool is_unchecked_call = false;
+  bool is_unchecked_call = inferred_type.IsSkipCheck();
 #ifndef TARGET_ARCH_DBC
   if (call_site_attributes.receiver_type != nullptr &&
-      call_site_attributes.receiver_type->HasResolvedTypeClass() &&
+      call_site_attributes.receiver_type->HasTypeClass() &&
       !Class::Handle(call_site_attributes.receiver_type->type_class())
            .IsGeneric()) {
     is_unchecked_call = true;
@@ -3063,7 +3077,7 @@
   const Function* interface_target = &Function::null_function();
   const NameIndex itarget_name =
       ReadCanonicalNameReference();  // read interface_target_reference.
-  if (FLAG_strong && !H.IsRoot(itarget_name)) {
+  if (!H.IsRoot(itarget_name)) {
     interface_target = &Function::ZoneHandle(
         Z,
         H.LookupMethodByMember(itarget_name, H.DartSetterName(itarget_name)));
@@ -3086,12 +3100,12 @@
   }
 
   if (!direct_call_target->IsNull()) {
-    // TODO(#34162): Pass 'is_unchecked_call' down if/when we feature multiple
-    // entry-points in AOT.
     ASSERT(FLAG_precompiled_mode);
     instructions +=
         StaticCall(position, *direct_call_target, 2, Array::null_array(),
-                   ICData::kNoRebind, /*result_type=*/nullptr);
+                   ICData::kNoRebind, /*result_type=*/nullptr,
+                   /*type_args_count=*/0,
+                   /*use_unchecked_entry=*/is_unchecked_call);
   } else {
     const intptr_t kTypeArgsLen = 0;
     const intptr_t kNumArgsChecked = 1;
@@ -3100,8 +3114,7 @@
         position, *mangled_name, Token::kSET, kTypeArgsLen, 2,
         Array::null_array(), kNumArgsChecked, *interface_target,
         /*result_type=*/nullptr,
-        /*use_unchecked_entry=*/!FLAG_precompiled_mode && is_unchecked_call,
-        &call_site_attributes);
+        /*use_unchecked_entry=*/is_unchecked_call, &call_site_attributes);
   }
 
   instructions += Drop();  // Drop result of the setter invocation.
@@ -3317,9 +3330,11 @@
 
     SkipCanonicalNameReference();  // skip target_reference.
 
-    instructions +=
-        StaticCall(position, Function::ZoneHandle(Z, function.raw()),
-                   /* argument_count = */ 2, ICData::kSuper);
+    instructions += StaticCall(
+        position, Function::ZoneHandle(Z, function.raw()),
+        /* argument_count = */ 2, Array::null_array(), ICData::kSuper,
+        /*result_type=*/nullptr, /*type_args_len=*/0,
+        /*use_unchecked_entry=*/true);
     instructions += Drop();  // Drop result of the setter invocation.
   }
 
@@ -3473,13 +3488,10 @@
   if (H.IsField(target)) {
     const Field& field =
         Field::ZoneHandle(Z, H.LookupFieldByKernelField(target));
-    const AbstractType& dst_type = AbstractType::ZoneHandle(Z, field.type());
     Fragment instructions = BuildExpression();  // read expression.
     if (NeedsDebugStepCheck(stack(), position)) {
       instructions = DebugStepCheck(position) + instructions;
     }
-    instructions += CheckAssignableInCheckedMode(
-        dst_type, String::ZoneHandle(Z, field.name()));
     LocalVariable* variable = MakeTemporary();
     instructions += LoadLocal(variable);
     return instructions + StoreStaticField(position, field);
@@ -3504,11 +3516,6 @@
   }
 }
 
-static bool IsNumberLiteral(Tag tag) {
-  return tag == kNegativeIntLiteral || tag == kPositiveIntLiteral ||
-         tag == kSpecializedIntLiteral || tag == kDoubleLiteral;
-}
-
 Fragment StreamingFlowGraphBuilder::BuildMethodInvocation(TokenPosition* p) {
   const intptr_t offset = ReaderOffset() - 1;     // Include the tag.
   const TokenPosition position = ReadPosition();  // read position.
@@ -3522,42 +3529,9 @@
       call_site_attributes_metadata_helper_.GetCallSiteAttributes(offset);
 
   const Tag receiver_tag = PeekTag();  // peek tag for receiver.
-  if (IsNumberLiteral(receiver_tag) &&
-      (!optimizing() || constant_evaluator_.IsCached(offset))) {
-    const intptr_t before_branch_offset = ReaderOffset();
-
-    SkipExpression();  // read receiver (it's just a number literal).
-
-    const String& name = ReadNameAsMethodName();  // read name.
-    const Token::Kind token_kind =
-        MethodTokenRecognizer::RecognizeTokenKind(name);
-    intptr_t argument_count = PeekArgumentsCount() + 1;
-
-    if ((argument_count == 1) && (token_kind == Token::kNEGATE)) {
-      const Object& result = Object::ZoneHandle(
-          Z, constant_evaluator_.EvaluateExpressionSafe(offset));
-      if (!result.IsError()) {
-        SkipArguments();               // read arguments.
-        SkipCanonicalNameReference();  // read interface_target_reference.
-        return Constant(result);
-      }
-    } else if ((argument_count == 2) &&
-               Token::IsBinaryArithmeticOperator(token_kind) &&
-               IsNumberLiteral(PeekArgumentsFirstPositionalTag())) {
-      const Object& result = Object::ZoneHandle(
-          Z, constant_evaluator_.EvaluateExpressionSafe(offset));
-      if (!result.IsError()) {
-        SkipArguments();               // read arguments.
-        SkipCanonicalNameReference();  // read interface_target_reference.
-        return Constant(result);
-      }
-    }
-
-    SetOffset(before_branch_offset);
-  }
 
   bool is_unchecked_closure_call = false;
-  bool is_unchecked_call = false;
+  bool is_unchecked_call = result_type.IsSkipCheck();
 #ifndef TARGET_ARCH_DBC
   if (call_site_attributes.receiver_type != nullptr) {
     if (call_site_attributes.receiver_type->IsFunctionType()) {
@@ -3565,7 +3539,7 @@
       SkipExpression();  // skip receiver
       is_unchecked_closure_call =
           ReadNameAsMethodName().Equals(Symbols::Call());
-    } else if (call_site_attributes.receiver_type->HasResolvedTypeClass() &&
+    } else if (call_site_attributes.receiver_type->HasTypeClass() &&
                !Class::Handle(call_site_attributes.receiver_type->type_class())
                     .IsGeneric()) {
       is_unchecked_call = true;
@@ -3577,7 +3551,7 @@
 
   intptr_t type_args_len = 0;
   LocalVariable* type_arguments_temp = NULL;
-  if (FLAG_reify_generic_functions) {
+  {
     AlternativeReadingScope alt(&reader_);
     SkipExpression();                         // skip receiver
     SkipName();                               // skip method name
@@ -3665,13 +3639,16 @@
   const Function* interface_target = &Function::null_function();
   const NameIndex itarget_name =
       ReadCanonicalNameReference();  // read interface_target_reference.
-  if (FLAG_strong && !H.IsRoot(itarget_name) && !H.IsField(itarget_name)) {
+  // TODO(dartbug.com/34497): Once front-end desugars calls via
+  // fields/getters, filtering of field and getter interface targets here
+  // can be turned into assertions.
+  if (!H.IsRoot(itarget_name) && !H.IsField(itarget_name) &&
+      !H.IsGetter(itarget_name)) {
     interface_target = &Function::ZoneHandle(
         Z, H.LookupMethodByMember(itarget_name,
                                   H.DartProcedureName(itarget_name)));
-    ASSERT((name.raw() == interface_target->name()) ||
-           (interface_target->IsGetterFunction() &&
-            Field::GetterSymbol(name) == interface_target->name()));
+    ASSERT(name.raw() == interface_target->name());
+    ASSERT(!interface_target->IsGetterFunction());
   }
 
   // TODO(sjindel): Avoid the check for null on unchecked closure calls if TFA
@@ -3703,7 +3680,7 @@
   if (is_unchecked_closure_call) {
     // Lookup the function in the closure.
     instructions += LoadLocal(receiver_temp);
-    instructions += LoadField(Closure::function_offset());
+    instructions += LoadNativeField(Slot::Closure_function());
     if (parsed_function()->function().is_debuggable()) {
       ASSERT(!parsed_function()->function().is_native());
       instructions += DebugStepCheck(position);
@@ -3712,24 +3689,19 @@
         B->ClosureCall(position, type_args_len, argument_count, argument_names,
                        /*use_unchecked_entry=*/true);
   } else if (!direct_call_target->IsNull()) {
-    // TODO(#34162): Pass 'is_unchecked_call' down if/when we feature multiple
-    // entry-points in AOT.
-
     // Even if TFA infers a concrete receiver type, the static type of the
     // call-site may still be dynamic and we need to call the dynamic invocation
     // forwarder to ensure type-checks are performed.
     ASSERT(FLAG_precompiled_mode);
-    instructions += StaticCall(position, *direct_call_target, argument_count,
-                               argument_names, ICData::kNoRebind, &result_type,
-                               type_args_len);
+    instructions +=
+        StaticCall(position, *direct_call_target, argument_count,
+                   argument_names, ICData::kNoRebind, &result_type,
+                   type_args_len, /*use_unchecked_entry=*/is_unchecked_call);
   } else {
-    // TODO(#34162): Pass 'is_unchecked_call' down if/when we feature multiple
-    // entry-points in AOT.
     instructions += InstanceCall(
         position, *mangled_name, token_kind, type_args_len, argument_count,
         argument_names, checked_argument_count, *interface_target, &result_type,
-        /*use_unchecked_entry=*/!FLAG_precompiled_mode && is_unchecked_call,
-        &call_site_attributes);
+        /*use_unchecked_entry=*/is_unchecked_call, &call_site_attributes);
   }
 
   // Drop temporaries preserving result on the top of the stack.
@@ -3765,7 +3737,7 @@
 
   Fragment instructions;
   intptr_t type_args_len = 0;
-  if (FLAG_reify_generic_functions) {
+  {
     AlternativeReadingScope alt(&reader_);
     SkipExpression();                         // skip receiver
     ReadCanonicalNameReference();             // skip target reference
@@ -3831,7 +3803,7 @@
       inferred_type_metadata_helper_.GetInferredType(offset);
 
   intptr_t type_args_len = 0;
-  if (FLAG_reify_generic_functions) {
+  {
     AlternativeReadingScope alt(&reader_);
     SkipName();                        // skip method name
     ReadUInt();                        // read argument count.
@@ -3935,7 +3907,7 @@
   } else {
     Fragment instructions;
 
-    if (FLAG_reify_generic_functions) {
+    {
       AlternativeReadingScope alt(&reader_);
       ReadUInt();                               // read argument count.
       intptr_t list_length = ReadListLength();  // read types list length.
@@ -3961,7 +3933,8 @@
     return instructions +
            StaticCall(position, Function::ZoneHandle(Z, function.raw()),
                       argument_count, argument_names, ICData::kSuper,
-                      &result_type, type_args_len);
+                      &result_type, type_args_len,
+                      /*use_unchecked_entry_point=*/true);
   }
 }
 
@@ -4043,7 +4016,7 @@
     const TypeArguments& type_arguments = PeekArgumentsInstantiatedType(klass);
     instructions += TranslateInstantiatedTypeArguments(type_arguments);
     instructions += PushArgument();
-  } else if (!special_case && FLAG_reify_generic_functions) {
+  } else if (!special_case) {
     AlternativeReadingScope alt(&reader_);
     ReadUInt();                               // read argument count.
     intptr_t list_length = ReadListLength();  // read types list length.
@@ -4107,31 +4080,6 @@
 
   Fragment instructions;
 
-  // Check for malbounded-ness of type.
-  if (I->type_checks()) {
-    intptr_t offset = ReaderOffset();
-
-    const TypeArguments& type_arguments = BuildTypeArguments();
-
-    AbstractType& type = AbstractType::Handle(
-        Z, Type::New(klass, type_arguments, TokenPosition::kNoSource));
-    type = ClassFinalizer::FinalizeType(klass, type);
-
-    if (type.IsMalbounded()) {
-      // Evaluate expressions for correctness.
-      instructions +=
-          BuildArgumentsFromActualArguments(NULL, false, /*do_drop*/ true);
-
-      // Throw an error & keep the [Value] on the stack.
-      instructions += ThrowTypeError();
-
-      // Bail out early.
-      return instructions;
-    }
-
-    SetOffset(offset);
-  }
-
   if (klass.NumTypeArguments() > 0) {
     if (!klass.IsGeneric()) {
       Type& type = Type::ZoneHandle(Z, T.ReceiverType(klass).raw());
@@ -4139,8 +4087,6 @@
       // TODO(27590): Can we move this code into [ReceiverType]?
       type ^= ClassFinalizer::FinalizeType(*active_class()->klass, type,
                                            ClassFinalizer::kFinalize);
-      ASSERT(!type.IsMalformedOrMalbounded());
-
       TypeArguments& canonicalized_type_arguments =
           TypeArguments::ZoneHandle(Z, type.arguments());
       canonicalized_type_arguments =
@@ -4248,10 +4194,6 @@
     const bool is_bool = top->IsStrictCompare() || top->IsBooleanNegate();
     if (!is_bool) {
       right_value += CheckBoolean(position);
-      if (!FLAG_strong) {
-        right_value += Constant(Bool::True());
-        right_value += StrictCompare(Token::kEQ_STRICT);
-      }
     }
     if (negated) {
       right_value += BooleanNegate();
@@ -4377,14 +4319,7 @@
   // special case this situation.
   const Type& object_type = Type::Handle(Z, Type::ObjectType());
 
-  if (type.IsMalformed()) {
-    instructions += Drop();
-    instructions += ThrowTypeError();
-    return instructions;
-  }
-
-  if (type.IsInstantiated() &&
-      object_type.IsSubtypeOf(type, NULL, NULL, Heap::kOld)) {
+  if (type.IsInstantiated() && object_type.IsSubtypeOf(type, Heap::kOld)) {
     // Evaluate the expression on the left but ignore it's result.
     instructions += Drop();
 
@@ -4437,10 +4372,7 @@
   Fragment instructions = BuildExpression();  // read operand.
 
   const AbstractType& type = T.BuildType();  // read type.
-  if (type.IsMalformed()) {
-    instructions += Drop();
-    instructions += ThrowTypeError();
-  } else if (type.IsInstantiated() && type.IsTopType()) {
+  if (type.IsInstantiated() && type.IsTopType()) {
     // We already evaluated the operand on the left and just leave it there as
     // the result of the `obj as dynamic` expression.
   } else {
@@ -4471,10 +4403,6 @@
   if (position != NULL) *position = TokenPosition::kNoSource;
 
   const AbstractType& type = T.BuildType();  // read type.
-  if (type.IsMalformed()) {
-    H.ReportError(script_, TokenPosition::kNoSource, "Malformed type literal");
-  }
-
   Fragment instructions;
   if (type.IsInstantiated()) {
     instructions += Constant(type);
@@ -4564,23 +4492,12 @@
     instructions += LoadLocal(type);
     instructions += IntConstant(length);
     instructions += CreateArray();
-    AbstractType& list_type = AbstractType::ZoneHandle(Z);
-    if (I->type_checks()) {
-      if (type_arguments.IsNull()) {
-        // It was dynamic.
-        list_type = Object::dynamic_type().raw();
-      } else {
-        list_type = type_arguments.TypeAt(0);
-      }
-    }
 
     LocalVariable* array = MakeTemporary();
     for (intptr_t i = 0; i < length; ++i) {
       instructions += LoadLocal(array);
       instructions += IntConstant(i);
       instructions += BuildExpression();  // read ith expression.
-      instructions += CheckAssignableInCheckedMode(
-          list_type, Symbols::ListLiteralElement());
       instructions += StoreIndexed(kArrayCid);
       instructions += Drop();
     }
@@ -4802,38 +4719,40 @@
 
   instructions += LoadLocal(new_closure);
   instructions += LoadLocal(type_args_vec);
-  instructions += StoreInstanceField(TokenPosition::kNoSource,
-                                     Closure::delayed_type_arguments_offset());
-
+  instructions += flow_graph_builder_->StoreInstanceField(
+      TokenPosition::kNoSource, Slot::Closure_delayed_type_arguments());
   instructions += Drop();  // Drop type args.
 
   // Copy over the target function.
   instructions += LoadLocal(new_closure);
   instructions += LoadLocal(original_closure);
-  instructions += LoadField(Closure::function_offset());
   instructions +=
-      StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset());
+      flow_graph_builder_->LoadNativeField(Slot::Closure_function());
+  instructions += flow_graph_builder_->StoreInstanceField(
+      TokenPosition::kNoSource, Slot::Closure_function());
 
   // Copy over the instantiator type arguments.
   instructions += LoadLocal(new_closure);
   instructions += LoadLocal(original_closure);
-  instructions += LoadField(Closure::instantiator_type_arguments_offset());
-  instructions += StoreInstanceField(
-      TokenPosition::kNoSource, Closure::instantiator_type_arguments_offset());
+  instructions += flow_graph_builder_->LoadNativeField(
+      Slot::Closure_instantiator_type_arguments());
+  instructions += flow_graph_builder_->StoreInstanceField(
+      TokenPosition::kNoSource, Slot::Closure_instantiator_type_arguments());
 
   // Copy over the function type arguments.
   instructions += LoadLocal(new_closure);
   instructions += LoadLocal(original_closure);
-  instructions += LoadField(Closure::function_type_arguments_offset());
-  instructions += StoreInstanceField(TokenPosition::kNoSource,
-                                     Closure::function_type_arguments_offset());
+  instructions += flow_graph_builder_->LoadNativeField(
+      Slot::Closure_function_type_arguments());
+  instructions += flow_graph_builder_->StoreInstanceField(
+      TokenPosition::kNoSource, Slot::Closure_function_type_arguments());
 
   // Copy over the context.
   instructions += LoadLocal(new_closure);
   instructions += LoadLocal(original_closure);
-  instructions += LoadField(Closure::context_offset());
-  instructions +=
-      StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset());
+  instructions += flow_graph_builder_->LoadNativeField(Slot::Closure_context());
+  instructions += flow_graph_builder_->StoreInstanceField(
+      TokenPosition::kNoSource, Slot::Closure_context());
 
   instructions += DropTempsPreserveTop(1);  // Drop old closure.
 
@@ -5068,8 +4987,8 @@
 
   loop_depth_inc();
 
-  intptr_t num_context_variables = 0;
-  declarations += EnterScope(offset, &num_context_variables);
+  const LocalScope* context_scope = nullptr;
+  declarations += EnterScope(offset, &context_scope);
 
   intptr_t list_length = ReadListLength();  // read number of variables.
   for (intptr_t i = 0; i < list_length; ++i) {
@@ -5105,7 +5024,9 @@
     // the context object (at same depth) which ensures the next iteration of
     // the body gets a fresh set of [ForStatement] variables (with the old
     // (possibly updated) values).
-    if (num_context_variables > 0) body += CloneContext(num_context_variables);
+    if (context_scope->num_context_variables() > 0) {
+      body += CloneContext(context_scope->context_variables());
+    }
 
     body += updates;
     JoinEntryInstr* join = BuildJoinEntry();
@@ -5572,37 +5493,32 @@
     }
 
     if (type_guard != NULL) {
-      if (type_guard->IsMalformed()) {
-        catch_body += ThrowTypeError();
-        catch_body += Drop();
+      catch_body += LoadLocal(CurrentException());
+      catch_body += PushArgument();  // exception
+      if (!type_guard->IsInstantiated(kCurrentClass)) {
+        catch_body += LoadInstantiatorTypeArguments();
       } else {
-        catch_body += LoadLocal(CurrentException());
-        catch_body += PushArgument();  // exception
-        if (!type_guard->IsInstantiated(kCurrentClass)) {
-          catch_body += LoadInstantiatorTypeArguments();
-        } else {
-          catch_body += NullConstant();
-        }
-        catch_body += PushArgument();  // instantiator type arguments
-        if (!type_guard->IsInstantiated(kFunctions)) {
-          catch_body += LoadFunctionTypeArguments();
-        } else {
-          catch_body += NullConstant();
-        }
-        catch_body += PushArgument();  // function type arguments
-        catch_body += Constant(*type_guard);
-        catch_body += PushArgument();  // guard type
-        catch_body += InstanceCall(
-            position, Library::PrivateCoreLibName(Symbols::_instanceOf()),
-            Token::kIS, 4);
-
-        TargetEntryInstr* catch_entry;
-        TargetEntryInstr* next_catch_entry;
-        catch_body += BranchIfTrue(&catch_entry, &next_catch_entry, false);
-
-        Fragment(catch_entry) + catch_handler_body;
-        catch_body = Fragment(next_catch_entry);
+        catch_body += NullConstant();
       }
+      catch_body += PushArgument();  // instantiator type arguments
+      if (!type_guard->IsInstantiated(kFunctions)) {
+        catch_body += LoadFunctionTypeArguments();
+      } else {
+        catch_body += NullConstant();
+      }
+      catch_body += PushArgument();  // function type arguments
+      catch_body += Constant(*type_guard);
+      catch_body += PushArgument();  // guard type
+      catch_body += InstanceCall(
+          position, Library::PrivateCoreLibName(Symbols::_instanceOf()),
+          Token::kIS, 4);
+
+      TargetEntryInstr* catch_entry;
+      TargetEntryInstr* next_catch_entry;
+      catch_body += BranchIfTrue(&catch_entry, &next_catch_entry, false);
+
+      Fragment(catch_entry) + catch_handler_body;
+      catch_body = Fragment(next_catch_entry);
     } else {
       catch_body += catch_handler_body;
     }
@@ -5793,9 +5709,8 @@
 
   VariableDeclarationHelper helper(this);
   helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
-  String& name = H.DartSymbolObfuscate(helper.name_index_);
-  AbstractType& type = T.BuildType();  // read type.
-  Tag tag = ReadTag();                 // read (first part of) initializer.
+  T.BuildType();        // read type.
+  Tag tag = ReadTag();  // read (first part of) initializer.
 
   Fragment instructions;
   if (tag == kNothing) {
@@ -5811,7 +5726,6 @@
     } else {
       // Initializer
       instructions += BuildExpression();  // read (actual) initializer.
-      instructions += CheckVariableTypeInCheckedMode(type, name);
     }
   }
 
@@ -5946,8 +5860,7 @@
     instructions += LoadLocal(closure);
     instructions += LoadInstantiatorTypeArguments();
     instructions += flow_graph_builder_->StoreInstanceField(
-        TokenPosition::kNoSource,
-        Closure::instantiator_type_arguments_offset());
+        TokenPosition::kNoSource, Slot::Closure_instantiator_type_arguments());
   }
 
   // TODO(30455): We only need to save these if the closure uses any captured
@@ -5955,23 +5868,23 @@
   instructions += LoadLocal(closure);
   instructions += LoadFunctionTypeArguments();
   instructions += flow_graph_builder_->StoreInstanceField(
-      TokenPosition::kNoSource, Closure::function_type_arguments_offset());
+      TokenPosition::kNoSource, Slot::Closure_function_type_arguments());
 
   instructions += LoadLocal(closure);
   instructions += Constant(Object::empty_type_arguments());
   instructions += flow_graph_builder_->StoreInstanceField(
-      TokenPosition::kNoSource, Closure::delayed_type_arguments_offset());
+      TokenPosition::kNoSource, Slot::Closure_delayed_type_arguments());
 
   // Store the function and the context in the closure.
   instructions += LoadLocal(closure);
   instructions += Constant(function);
   instructions += flow_graph_builder_->StoreInstanceField(
-      TokenPosition::kNoSource, Closure::function_offset());
+      TokenPosition::kNoSource, Slot::Closure_function());
 
   instructions += LoadLocal(closure);
   instructions += LoadLocal(parsed_function()->current_context_var());
   instructions += flow_graph_builder_->StoreInstanceField(
-      TokenPosition::kNoSource, Closure::context_offset());
+      TokenPosition::kNoSource, Slot::Closure_context());
 
   return instructions;
 }
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index d5a388b..b16d914 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -43,8 +43,7 @@
         direct_call_metadata_helper_(this),
         inferred_type_metadata_helper_(this),
         procedure_attributes_metadata_helper_(this),
-        call_site_attributes_metadata_helper_(this, &type_translator_) {
-  }
+        call_site_attributes_metadata_helper_(this, &type_translator_) {}
 
   virtual ~StreamingFlowGraphBuilder() {}
 
@@ -55,7 +54,7 @@
   Fragment BuildStatementAt(intptr_t kernel_offset);
 
  private:
-  bool optimizing();
+  Thread* thread() const { return flow_graph_builder_->thread_; }
 
   FlowGraph* BuildGraphOfFieldInitializer();
   FlowGraph* BuildGraphOfFieldAccessor(LocalVariable* setter_value);
@@ -127,7 +126,8 @@
   void CheckArgumentTypesAsNecessary(const Function& dart_function,
                                      intptr_t type_parameters_offset,
                                      Fragment* explicit_checks,
-                                     Fragment* implicit_checks);
+                                     Fragment* implicit_checks,
+                                     Fragment* implicit_redefinitions);
   Fragment CompleteBodyWithYieldContinuations(Fragment body);
   FunctionEntryInstr* BuildSeparateUncheckedEntryPoint(
       BlockEntryInstr* normal_entry,
@@ -138,6 +138,7 @@
   FunctionEntryInstr* BuildSharedUncheckedEntryPoint(
       Fragment prologue_from_normal_entry,
       Fragment skippable_checks,
+      Fragment redefinitions_if_skipped,
       Fragment body);
 
   Fragment BuildEntryPointsIntrospection();
@@ -206,6 +207,7 @@
   Fragment Constant(const Object& value);
   Fragment IntConstant(int64_t value);
   Fragment LoadStaticField();
+  Fragment RedefinitionWithType(const AbstractType& type);
   Fragment CheckNull(TokenPosition position,
                      LocalVariable* receiver,
                      const String& function_name,
@@ -220,7 +222,8 @@
                       const Array& argument_names,
                       ICData::RebindRule rebind_rule,
                       const InferredTypeMetadata* result_type = NULL,
-                      intptr_t type_args_len = 0);
+                      intptr_t type_args_len = 0,
+                      bool use_unchecked_entry = false);
   Fragment InstanceCall(TokenPosition position,
                         const String& name,
                         Token::Kind kind,
@@ -258,7 +261,8 @@
 
   void BuildArgumentTypeChecks(TypeChecksToBuild mode,
                                Fragment* explicit_checks,
-                               Fragment* implicit_checks);
+                               Fragment* implicit_checks,
+                               Fragment* implicit_redefinitions);
 
   Fragment ThrowException(TokenPosition position);
   Fragment BooleanNegate();
@@ -269,11 +273,11 @@
                           const Class& klass,
                           intptr_t argument_count);
   Fragment AllocateObject(const Class& klass, const Function& closure_function);
-  Fragment AllocateContext(intptr_t size);
-  Fragment LoadField(intptr_t offset);
+  Fragment AllocateContext(
+      const GrowableArray<LocalVariable*>& context_variables);
+  Fragment LoadNativeField(const Slot& field);
   Fragment StoreLocal(TokenPosition position, LocalVariable* variable);
   Fragment StoreStaticField(TokenPosition position, const Field& field);
-  Fragment StoreInstanceField(TokenPosition position, intptr_t offset);
   Fragment StringInterpolate(TokenPosition position);
   Fragment StringInterpolateSingle(TokenPosition position);
   Fragment ThrowTypeError();
@@ -283,7 +287,7 @@
   Fragment CreateArray();
   Fragment StoreIndexed(intptr_t class_id);
   Fragment CheckStackOverflow(TokenPosition position);
-  Fragment CloneContext(intptr_t num_context_variables);
+  Fragment CloneContext(const GrowableArray<LocalVariable*>& context_variables);
   Fragment TranslateFinallyFinalizers(TryFinallyBlock* outer_finally,
                                       intptr_t target_context_depth);
   Fragment BranchIfTrue(TargetEntryInstr** then_entry,
@@ -312,17 +316,12 @@
   Fragment Goto(JoinEntryInstr* destination);
   Fragment BuildImplicitClosureCreation(const Function& target);
   Fragment CheckBoolean(TokenPosition position);
-  Fragment CheckAssignableInCheckedMode(const AbstractType& dst_type,
-                                        const String& dst_name);
   Fragment CheckArgumentType(LocalVariable* variable, const AbstractType& type);
   Fragment CheckTypeArgumentBound(const AbstractType& parameter,
                                   const AbstractType& bound,
                                   const String& dst_name);
-  Fragment CheckVariableTypeInCheckedMode(intptr_t variable_kernel_position);
-  Fragment CheckVariableTypeInCheckedMode(const AbstractType& dst_type,
-                                          const String& name_symbol);
   Fragment EnterScope(intptr_t kernel_offset,
-                      intptr_t* num_context_variables = NULL);
+                      const LocalScope** scope = nullptr);
   Fragment ExitScope(intptr_t kernel_offset);
 
   TestFragment TranslateConditionForControl();
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 1df89e8..03a4e59 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -261,7 +261,14 @@
 }
 
 void KernelFingerprintHelper::CalculateInterfaceTypeFingerprint(bool simple) {
-  BuildHash(ReadUInt());  // read klass_name.
+  NameIndex kernel_class = ReadCanonicalNameReference();
+  ASSERT(H.IsClass(kernel_class));
+  const String& class_name = H.DartClassName(kernel_class);
+  NameIndex kernel_library = H.CanonicalNameParent(kernel_class);
+  const String& library_name =
+      H.DartSymbolPlain(H.CanonicalNameString(kernel_library));
+  BuildHash(class_name.Hash());
+  BuildHash(library_name.Hash());
   if (!simple) {
     CalculateListOfDartTypesFingerprint();  // read list of types.
   }
@@ -289,7 +296,7 @@
 
   if (!simple) {
     // TODO(bkonyi): include in hash.
-    SkipCanonicalNameReference();  // read typedef reference.
+    SkipOptionalDartType();  // read typedef type.
   }
 
   CalculateDartTypeFingerprint();  // read return type.
@@ -297,14 +304,14 @@
 
 void KernelFingerprintHelper::CalculateGetterNameFingerprint() {
   const NameIndex name = ReadCanonicalNameReference();
-  if (FLAG_strong && !H.IsRoot(name) && (H.IsGetter(name) || H.IsField(name))) {
+  if (!H.IsRoot(name) && (H.IsGetter(name) || H.IsField(name))) {
     BuildHash(H.DartGetterName(name).Hash());
   }
 }
 
 void KernelFingerprintHelper::CalculateSetterNameFingerprint() {
   const NameIndex name = ReadCanonicalNameReference();
-  if (FLAG_strong && !H.IsRoot(name)) {
+  if (!H.IsRoot(name)) {
     BuildHash(H.DartSetterName(name).Hash());
   }
 }
@@ -312,7 +319,7 @@
 void KernelFingerprintHelper::CalculateMethodNameFingerprint() {
   const NameIndex name =
       ReadCanonicalNameReference();  // read interface_target_reference.
-  if (FLAG_strong && !H.IsRoot(name) && !H.IsField(name)) {
+  if (!H.IsRoot(name) && !H.IsField(name)) {
     BuildHash(H.DartProcedureName(name).Hash());
   }
 }
@@ -472,6 +479,12 @@
       CalculateDartTypeFingerprint();           // read type.
       CalculateListOfExpressionsFingerprint();  // read list of expressions.
       return;
+    case kSetLiteral:
+    case kConstSetLiteral:
+      // Set literals are currently desugared in the frontend and will not
+      // reach the VM. See http://dartbug.com/35124 for discussion.
+      UNREACHABLE();
+      return;
     case kMapLiteral:
     case kConstMapLiteral: {
       ReadPosition();                           // read position.
@@ -771,12 +784,6 @@
     hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
   }
 
-  type ^= klass.mixin();
-  if (!type.IsNull()) {
-    name ^= type.Name();
-    hash = KernelFingerprintHelper::CalculateHash(hash, name.Hash());
-  }
-
   Field& field = Field::Handle(zone);
   // Calculate fingerprint for the class fields.
   for (intptr_t i = 0; i < fields.Length(); ++i) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 88dbd35..cd0f7f7 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -50,6 +50,7 @@
       optimizing_(optimizing),
       ic_data_array_(*ic_data_array),
       next_function_id_(0),
+      loop_depth_(0),
       try_depth_(0),
       catch_depth_(0),
       for_in_depth_(0),
@@ -67,17 +68,17 @@
 
 FlowGraphBuilder::~FlowGraphBuilder() {}
 
-Fragment FlowGraphBuilder::EnterScope(intptr_t kernel_offset,
-                                      intptr_t* num_context_variables) {
+Fragment FlowGraphBuilder::EnterScope(
+    intptr_t kernel_offset,
+    const LocalScope** context_scope /* = nullptr */) {
   Fragment instructions;
-  const intptr_t context_size =
-      scopes_->scopes.Lookup(kernel_offset)->num_context_variables();
-  if (context_size > 0) {
-    instructions += PushContext(context_size);
+  const LocalScope* scope = scopes_->scopes.Lookup(kernel_offset);
+  if (scope->num_context_variables() > 0) {
+    instructions += PushContext(scope);
     instructions += Drop();
   }
-  if (num_context_variables != NULL) {
-    *num_context_variables = context_size;
+  if (context_scope != nullptr) {
+    *context_scope = scope;
   }
   return instructions;
 }
@@ -105,14 +106,14 @@
   return instructions;
 }
 
-Fragment FlowGraphBuilder::PushContext(int size) {
-  ASSERT(size > 0);
-  Fragment instructions = AllocateContext(size);
+Fragment FlowGraphBuilder::PushContext(const LocalScope* scope) {
+  ASSERT(scope->num_context_variables() > 0);
+  Fragment instructions = AllocateContext(scope->context_variables());
   LocalVariable* context = MakeTemporary();
   instructions += LoadLocal(context);
   instructions += LoadLocal(parsed_function_->current_context_var());
   instructions +=
-      StoreInstanceField(TokenPosition::kNoSource, Context::parent_offset());
+      StoreInstanceField(TokenPosition::kNoSource, Slot::Context_parent());
   instructions += StoreLocal(TokenPosition::kNoSource,
                              parsed_function_->current_context_var());
   ++context_depth_;
@@ -141,7 +142,7 @@
     ASSERT(!parsed_function_->function().IsFactory());
     instructions += LoadLocal(scopes_->this_variable);
     instructions += LoadNativeField(
-        NativeFieldDesc::GetTypeArgumentsFieldFor(Z, *active_class_.klass));
+        Slot::GetTypeArgumentsSlotFor(thread_, *active_class_.klass));
   } else {
     instructions += NullConstant();
   }
@@ -153,10 +154,6 @@
 // arguments of the current function.
 Fragment FlowGraphBuilder::LoadFunctionTypeArguments() {
   Fragment instructions;
-  if (!FLAG_reify_generic_functions) {
-    instructions += NullConstant();
-    return instructions;
-  }
 
   const Function& function = parsed_function_->function();
 
@@ -180,10 +177,8 @@
   } else {
     // The [type_arguments] vector contains a type reference to a type
     // parameter we need to resolve it.
-    const bool use_instantiator =
-        type_arguments.IsUninstantiatedIdentity() ||
-        type_arguments.CanShareInstantiatorTypeArguments(*active_class_.klass);
-    if (use_instantiator) {
+    if (type_arguments.CanShareInstantiatorTypeArguments(
+            *active_class_.klass)) {
       // If the instantiator type arguments are just passed on, we don't need to
       // resolve the type parameters.
       //
@@ -194,6 +189,9 @@
       // We just use the type argument vector from the [Foo] object and pass it
       // directly to the `new List<T>()` factory constructor.
       instructions += LoadInstantiatorTypeArguments();
+    } else if (type_arguments.CanShareFunctionTypeArguments(
+                   parsed_function_->function())) {
+      instructions += LoadFunctionTypeArguments();
     } else {
       // Otherwise we need to resolve [TypeParameterType]s in the type
       // expression based on the current instantiator type argument vector.
@@ -265,7 +263,7 @@
     LocalVariable* closure_parameter = scope->VariableAt(0);
     ASSERT(!closure_parameter->is_captured());
     instructions += LoadLocal(closure_parameter);
-    instructions += LoadField(Closure::context_offset());
+    instructions += LoadNativeField(Slot::Closure_context());
     instructions += StoreLocal(TokenPosition::kNoSource, context_variable);
     instructions += Drop();
   }
@@ -275,14 +273,14 @@
     instructions += LoadLocal(raw_exception_var);
     instructions += StoreInstanceField(
         TokenPosition::kNoSource,
-        Context::variable_offset(exception_var->index().value()));
+        Slot::GetContextVariableSlotFor(thread_, *exception_var));
   }
   if (stacktrace_var->is_captured()) {
     instructions += LoadLocal(context_variable);
     instructions += LoadLocal(raw_stacktrace_var);
     instructions += StoreInstanceField(
         TokenPosition::kNoSource,
-        Context::variable_offset(stacktrace_var->index().value()));
+        Slot::GetContextVariableSlotFor(thread_, *stacktrace_var));
   }
 
   // :saved_try_context_var can be captured in the context of
@@ -324,19 +322,20 @@
   if (IsInlining()) {
     // If we are inlining don't actually attach the stack check.  We must still
     // create the stack check in order to allocate a deopt id.
-    CheckStackOverflow(position);
+    CheckStackOverflow(position, loop_depth_);
     return Fragment();
   }
-  return CheckStackOverflow(position);
+  return CheckStackOverflow(position, loop_depth_);
 }
 
-Fragment FlowGraphBuilder::CloneContext(intptr_t num_context_variables) {
+Fragment FlowGraphBuilder::CloneContext(
+    const GrowableArray<LocalVariable*>& context_variables) {
   LocalVariable* context_variable = parsed_function_->current_context_var();
 
   Fragment instructions = LoadLocal(context_variable);
 
   CloneContextInstr* clone_instruction = new (Z) CloneContextInstr(
-      TokenPosition::kNoSource, Pop(), num_context_variables, GetNextDeoptId());
+      TokenPosition::kNoSource, Pop(), context_variables, GetNextDeoptId());
   instructions <<= clone_instruction;
   Push(clone_instruction);
 
@@ -422,7 +421,7 @@
     Fragment instructions;
     instructions += LoadContextAt(variable->owner()->context_level());
     instructions +=
-        LoadField(Context::variable_offset(variable->index().value()));
+        LoadNativeField(Slot::GetContextVariableSlotFor(thread_, *variable));
     return instructions;
   } else {
     return BaseFlowGraphBuilder::LoadLocal(variable);
@@ -439,8 +438,7 @@
                                       const Function* function) {
   InlineBailout("kernel::FlowGraphBuilder::NativeCall");
   const intptr_t num_args =
-      function->NumParameters() +
-      ((function->IsGeneric() && FLAG_reify_generic_functions) ? 1 : 0);
+      function->NumParameters() + (function->IsGeneric() ? 1 : 0);
   ArgumentArray arguments = GetArguments(num_args);
   NativeCallInstr* call =
       new (Z) NativeCallInstr(name, function, FLAG_link_natives_lazily,
@@ -456,8 +454,7 @@
 
   // Emit a type check of the return type in checked mode for all functions
   // and in strong mode for native functions.
-  if (!omit_result_type_check &&
-      (I->type_checks() || (function.is_native() && FLAG_strong))) {
+  if (!omit_result_type_check && function.is_native()) {
     const AbstractType& return_type =
         AbstractType::Handle(Z, function.result_type());
     instructions += CheckAssignable(return_type, Symbols::FunctionResult());
@@ -549,8 +546,8 @@
     call->set_is_known_list_constructor(true);
     return;
   }
-  if (target.recognized_kind() != MethodRecognizer::kUnknown) {
-    intptr_t recognized_cid = MethodRecognizer::ResultCid(target);
+  if (target.has_pragma()) {
+    intptr_t recognized_cid = MethodRecognizer::ResultCidFromPragma(target);
     if (recognized_cid != kDynamicCid) {
       ASSERT((result_type == NULL) || (result_type->cid == kDynamicCid) ||
              (result_type->cid == recognized_cid));
@@ -569,34 +566,21 @@
                                       const Array& argument_names,
                                       ICData::RebindRule rebind_rule,
                                       const InferredTypeMetadata* result_type,
-                                      intptr_t type_args_count) {
+                                      intptr_t type_args_count,
+                                      bool use_unchecked_entry) {
   const intptr_t total_count = argument_count + (type_args_count > 0 ? 1 : 0);
   ArgumentArray arguments = GetArguments(total_count);
   StaticCallInstr* call = new (Z)
       StaticCallInstr(position, target, type_args_count, argument_names,
                       arguments, ic_data_array_, GetNextDeoptId(), rebind_rule);
   SetResultTypeForStaticCall(call, target, argument_count, result_type);
+  if (use_unchecked_entry) {
+    call->set_entry_kind(Code::EntryKind::kUnchecked);
+  }
   Push(call);
   return Fragment(call);
 }
 
-Fragment FlowGraphBuilder::StoreInstanceFieldGuarded(
-    const Field& field,
-    bool is_initialization_store) {
-  Fragment instructions;
-
-  const AbstractType& dst_type = AbstractType::ZoneHandle(Z, field.type());
-  if (I->type_checks()) {
-    instructions +=
-        CheckAssignable(dst_type, String::ZoneHandle(Z, field.name()));
-  }
-
-  instructions += BaseFlowGraphBuilder::StoreInstanceFieldGuarded(
-      field, is_initialization_store);
-
-  return instructions;
-}
-
 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) {
   Value* array = Pop();
   StringInterpolateInstr* interpolate =
@@ -757,7 +741,7 @@
     case MethodRecognizer::kStringBaseLength:
     case MethodRecognizer::kStringBaseIsEmpty:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::String_length());
+      body += LoadNativeField(Slot::String_length());
       if (kind == MethodRecognizer::kStringBaseIsEmpty) {
         body += IntConstant(0);
         body += StrictCompare(Token::kEQ_STRICT);
@@ -765,16 +749,16 @@
       break;
     case MethodRecognizer::kGrowableArrayLength:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::GrowableObjectArray_length());
+      body += LoadNativeField(Slot::GrowableObjectArray_length());
       break;
     case MethodRecognizer::kObjectArrayLength:
     case MethodRecognizer::kImmutableArrayLength:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::Array_length());
+      body += LoadNativeField(Slot::Array_length());
       break;
     case MethodRecognizer::kTypedDataLength:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::TypedData_length());
+      body += LoadNativeField(Slot::TypedData_length());
       break;
     case MethodRecognizer::kClassIDgetID:
       body += LoadLocal(first_parameter);
@@ -782,8 +766,8 @@
       break;
     case MethodRecognizer::kGrowableArrayCapacity:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadField(GrowableObjectArray::data_offset(), kArrayCid);
-      body += LoadNativeField(NativeFieldDesc::Array_length());
+      body += LoadNativeField(Slot::GrowableObjectArray_data());
+      body += LoadNativeField(Slot::Array_length());
       break;
     case MethodRecognizer::kListFactory: {
       // factory List<E>([int length]) {
@@ -795,8 +779,7 @@
       TargetEntryInstr *allocate_non_growable, *allocate_growable;
 
       body += LoadArgDescriptor();
-      body +=
-          LoadField(ArgumentsDescriptor::positional_count_offset(), kSmiCid);
+      body += LoadNativeField(Slot::ArgumentsDescriptor_positional_count());
       body += IntConstant(2);
       body += BranchIfStrictEqual(&allocate_non_growable, &allocate_growable);
 
@@ -857,65 +840,65 @@
       break;
     case MethodRecognizer::kLinkedHashMap_getIndex:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::LinkedHashMap_index());
+      body += LoadNativeField(Slot::LinkedHashMap_index());
       break;
     case MethodRecognizer::kLinkedHashMap_setIndex:
       body += LoadLocal(scopes_->this_variable);
       body += LoadLocal(first_parameter);
       body += StoreInstanceField(TokenPosition::kNoSource,
-                                 LinkedHashMap::index_offset());
+                                 Slot::LinkedHashMap_index());
       body += NullConstant();
       break;
     case MethodRecognizer::kLinkedHashMap_getData:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::LinkedHashMap_data());
+      body += LoadNativeField(Slot::LinkedHashMap_data());
       break;
     case MethodRecognizer::kLinkedHashMap_setData:
       body += LoadLocal(scopes_->this_variable);
       body += LoadLocal(first_parameter);
       body += StoreInstanceField(TokenPosition::kNoSource,
-                                 LinkedHashMap::data_offset());
+                                 Slot::LinkedHashMap_data());
       body += NullConstant();
       break;
     case MethodRecognizer::kLinkedHashMap_getHashMask:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::LinkedHashMap_hash_mask());
+      body += LoadNativeField(Slot::LinkedHashMap_hash_mask());
       break;
     case MethodRecognizer::kLinkedHashMap_setHashMask:
       body += LoadLocal(scopes_->this_variable);
       body += LoadLocal(first_parameter);
-      body += StoreInstanceField(TokenPosition::kNoSource,
-                                 LinkedHashMap::hash_mask_offset(),
-                                 kNoStoreBarrier);
+      body +=
+          StoreInstanceField(TokenPosition::kNoSource,
+                             Slot::LinkedHashMap_hash_mask(), kNoStoreBarrier);
       body += NullConstant();
       break;
     case MethodRecognizer::kLinkedHashMap_getUsedData:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::LinkedHashMap_used_data());
+      body += LoadNativeField(Slot::LinkedHashMap_used_data());
       break;
     case MethodRecognizer::kLinkedHashMap_setUsedData:
       body += LoadLocal(scopes_->this_variable);
       body += LoadLocal(first_parameter);
-      body += StoreInstanceField(TokenPosition::kNoSource,
-                                 LinkedHashMap::used_data_offset(),
-                                 kNoStoreBarrier);
+      body +=
+          StoreInstanceField(TokenPosition::kNoSource,
+                             Slot::LinkedHashMap_used_data(), kNoStoreBarrier);
       body += NullConstant();
       break;
     case MethodRecognizer::kLinkedHashMap_getDeletedKeys:
       body += LoadLocal(scopes_->this_variable);
-      body += LoadNativeField(NativeFieldDesc::LinkedHashMap_deleted_keys());
+      body += LoadNativeField(Slot::LinkedHashMap_deleted_keys());
       break;
     case MethodRecognizer::kLinkedHashMap_setDeletedKeys:
       body += LoadLocal(scopes_->this_variable);
       body += LoadLocal(first_parameter);
       body += StoreInstanceField(TokenPosition::kNoSource,
-                                 LinkedHashMap::deleted_keys_offset(),
+                                 Slot::LinkedHashMap_deleted_keys(),
                                  kNoStoreBarrier);
       body += NullConstant();
       break;
     default: {
       String& name = String::ZoneHandle(Z, function.native_name());
-      if (function.IsGeneric() && FLAG_reify_generic_functions) {
+      if (function.IsGeneric()) {
         body += LoadLocal(parsed_function_->RawTypeArgumentsVariable());
         body += PushArgument();
       }
@@ -932,6 +915,27 @@
   return body + Return(TokenPosition::kNoSource, omit_result_type_check);
 }
 
+static const LocalScope* MakeImplicitClosureScope(Zone* Z,
+                                                  const Function& function) {
+  Class& klass = Class::Handle(Z, function.Owner());
+  ASSERT(!klass.IsNull());
+  // Note that if klass is _Closure, DeclarationType will be _Closure,
+  // and not the signature type.
+  Type& klass_type = Type::ZoneHandle(Z, klass.DeclarationType());
+
+  LocalVariable* this_variable = new (Z)
+      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                    Symbols::This(), klass_type, /*param_type=*/nullptr);
+
+  this_variable->set_is_captured();
+  //  this_variable->set_is_final();
+  LocalScope* scope = new (Z) LocalScope(NULL, 0, 0);
+  scope->set_context_level(0);
+  scope->AddVariable(this_variable);
+  scope->AddContextVariable(this_variable);
+  return scope;
+}
+
 Fragment FlowGraphBuilder::BuildImplicitClosureCreation(
     const Function& target) {
   Fragment fragment;
@@ -944,9 +948,8 @@
   if (!target.HasInstantiatedSignature(kCurrentClass)) {
     fragment += LoadLocal(closure);
     fragment += LoadInstantiatorTypeArguments();
-    fragment +=
-        StoreInstanceField(TokenPosition::kNoSource,
-                           Closure::instantiator_type_arguments_offset());
+    fragment += StoreInstanceField(TokenPosition::kNoSource,
+                                   Slot::Closure_instantiator_type_arguments());
   }
 
   // The function signature cannot have uninstantiated function type parameters,
@@ -954,31 +957,36 @@
   ASSERT(target.HasInstantiatedSignature(kFunctions));
 
   // Allocate a context that closes over `this`.
-  fragment += AllocateContext(1);
+  // Note: this must be kept in sync with ScopeBuilder::BuildScopes.
+  const LocalScope* implicit_closure_scope =
+      MakeImplicitClosureScope(Z, target);
+  fragment += AllocateContext(implicit_closure_scope->context_variables());
   LocalVariable* context = MakeTemporary();
 
   // Store the function and the context in the closure.
   fragment += LoadLocal(closure);
   fragment += Constant(target);
   fragment +=
-      StoreInstanceField(TokenPosition::kNoSource, Closure::function_offset());
+      StoreInstanceField(TokenPosition::kNoSource, Slot::Closure_function());
 
   fragment += LoadLocal(closure);
   fragment += LoadLocal(context);
   fragment +=
-      StoreInstanceField(TokenPosition::kNoSource, Closure::context_offset());
+      StoreInstanceField(TokenPosition::kNoSource, Slot::Closure_context());
 
   fragment += LoadLocal(closure);
   fragment += Constant(Object::empty_type_arguments());
   fragment += StoreInstanceField(TokenPosition::kNoSource,
-                                 Closure::delayed_type_arguments_offset());
+                                 Slot::Closure_delayed_type_arguments());
 
   // The context is on top of the operand stack.  Store `this`.  The context
   // doesn't need a parent pointer because it doesn't close over anything
   // else.
   fragment += LoadLocal(scopes_->this_variable);
-  fragment +=
-      StoreInstanceField(TokenPosition::kNoSource, Context::variable_offset(0));
+  fragment += StoreInstanceField(
+      TokenPosition::kNoSource,
+      Slot::GetContextVariableSlotFor(
+          thread_, *implicit_closure_scope->context_variables()[0]));
 
   return fragment;
 }
@@ -986,9 +994,6 @@
 Fragment FlowGraphBuilder::CheckVariableTypeInCheckedMode(
     const AbstractType& dst_type,
     const String& name_symbol) {
-  if (I->type_checks()) {
-    return CheckAssignable(dst_type, name_symbol);
-  }
   return Fragment();
 }
 
@@ -1032,12 +1037,10 @@
 
 Fragment FlowGraphBuilder::CheckBoolean(TokenPosition position) {
   Fragment instructions;
-  if (FLAG_strong || I->type_checks() || I->asserts()) {
-    LocalVariable* top_of_stack = MakeTemporary();
-    instructions += LoadLocal(top_of_stack);
-    instructions += AssertBool(position);
-    instructions += Drop();
-  }
+  LocalVariable* top_of_stack = MakeTemporary();
+  instructions += LoadLocal(top_of_stack);
+  instructions += AssertBool(position);
+  instructions += Drop();
   return instructions;
 }
 
@@ -1045,9 +1048,6 @@
                                            const String& dst_name,
                                            AssertAssignableInstr::Kind kind) {
   Fragment instructions;
-  if (dst_type.IsMalformed()) {
-    return ThrowTypeError();
-  }
   if (!I->should_emit_strong_mode_checks()) {
     return Fragment();
   }
@@ -1361,7 +1361,7 @@
   if (is_closure_call) {
     // Lookup the function in the closure.
     body += LoadLocal(closure);
-    body += LoadField(Closure::function_offset());
+    body += LoadNativeField(Slot::Closure_function());
 
     body += ClosureCall(TokenPosition::kNoSource, descriptor.TypeArgsLen(),
                         descriptor.Count(), argument_names);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 7607105..40ea70e 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -67,12 +67,12 @@
                               LocalVariable* first_parameter);
 
   Fragment EnterScope(intptr_t kernel_offset,
-                      intptr_t* num_context_variables = NULL);
+                      const LocalScope** scope = nullptr);
   Fragment ExitScope(intptr_t kernel_offset);
 
   Fragment AdjustContextTo(int depth);
 
-  Fragment PushContext(int size);
+  Fragment PushContext(const LocalScope* scope);
   Fragment PopContext();
 
   Fragment LoadInstantiatorTypeArguments();
@@ -90,7 +90,7 @@
                            bool is_synthesized);
   Fragment TryCatch(int try_handler_index);
   Fragment CheckStackOverflowInPrologue(TokenPosition position);
-  Fragment CloneContext(intptr_t num_context_variables);
+  Fragment CloneContext(const GrowableArray<LocalVariable*>& context_variables);
 
   Fragment InstanceCall(
       TokenPosition position,
@@ -135,9 +135,8 @@
                       const Array& argument_names,
                       ICData::RebindRule rebind_rule,
                       const InferredTypeMetadata* result_type = NULL,
-                      intptr_t type_args_len = 0);
-  Fragment StoreInstanceFieldGuarded(const Field& field,
-                                     bool is_initialization_store);
+                      intptr_t type_args_len = 0,
+                      bool use_unchecked_entry = false);
   Fragment StringInterpolate(TokenPosition position);
   Fragment StringInterpolateSingle(TokenPosition position);
   Fragment ThrowTypeError();
@@ -180,6 +179,7 @@
   intptr_t next_function_id_;
   intptr_t AllocateFunctionId() { return next_function_id_++; }
 
+  intptr_t loop_depth_;
   intptr_t try_depth_;
   intptr_t catch_depth_;
   intptr_t for_in_depth_;
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index df8096b..b6a2164 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -100,6 +100,7 @@
 void TranslationHelper::SetMetadataPayloads(
     const ExternalTypedData& metadata_payloads) {
   ASSERT(metadata_payloads_.IsNull());
+  ASSERT(Utils::IsAligned(metadata_payloads.DataAddr(0), kWordSize));
   metadata_payloads_ = metadata_payloads.raw();
 }
 
@@ -110,7 +111,8 @@
 }
 
 void TranslationHelper::SetConstants(const Array& constants) {
-  ASSERT(constants_.IsNull());
+  ASSERT(constants_.IsNull() ||
+         (constants.IsNull() || constants.Length() == 0));
   constants_ = constants.raw();
 }
 
@@ -567,13 +569,9 @@
     Function& function = Function::ZoneHandle(
         Z, klass.LookupFunctionAllowPrivate(procedure_name));
     ASSERT(!function.IsNull());
-
-    // TODO(27590): We can probably get rid of this after no longer using
-    // core libraries from the source.
-    if (function.IsRedirectingFactory()) {
-      ClassFinalizer::ResolveRedirectingFactory(klass, function);
-      function = function.RedirectionTarget();
-    }
+    // Redirecting factory must be resolved.
+    ASSERT(!function.IsRedirectingFactory() ||
+           function.RedirectionTarget() != Function::null());
     return function.raw();
   }
 }
@@ -644,20 +642,17 @@
   return Function::null();
 }
 
-Type& TranslationHelper::GetCanonicalType(const Class& klass) {
+Type& TranslationHelper::GetDeclarationType(const Class& klass) {
   ASSERT(!klass.IsNull());
   // Note that if cls is _Closure, the returned type will be _Closure,
   // and not the signature type.
-  Type& type = Type::ZoneHandle(Z, klass.CanonicalType());
-  if (!type.IsNull()) {
-    return type;
-  }
-  type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
-                   klass.token_pos());
+  Type& type = Type::ZoneHandle(Z);
   if (klass.is_type_finalized()) {
-    type ^= ClassFinalizer::FinalizeType(klass, type);
-    // Note that the receiver type may now be a malbounded type.
-    klass.SetCanonicalType(type);
+    type = klass.DeclarationType();
+  } else {
+    // Note that the type argument vector is not yet extended.
+    type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
+                     klass.token_pos());
   }
   return type;
 }
@@ -1029,20 +1024,17 @@
     }
       /* Falls through */
     case kForwardingStubSuperTarget:
-      if (helper_->ReadTag() == kSomething) {
-        forwarding_stub_super_target_ = helper_->ReadCanonicalNameReference();
-      }
+      forwarding_stub_super_target_ = helper_->ReadCanonicalNameReference();
       if (++next_read_ == field) return;
       /* Falls through */
     case kForwardingStubInterfaceTarget:
-      if (helper_->ReadTag() == kSomething) {
-        helper_->ReadCanonicalNameReference();
-      }
+      helper_->ReadCanonicalNameReference();
       if (++next_read_ == field) return;
       /* Falls through */
     case kFunction:
-      if (helper_->ReadTag() == kSomething)
+      if (helper_->ReadTag() == kSomething) {
         helper_->SkipFunctionNode();  // read function node.
+      }
       if (++next_read_ == field) return;
       /* Falls through */
     case kEnd:
@@ -1566,6 +1558,12 @@
   }
 }
 
+intptr_t MetadataHelper::GetComponentMetadataPayloadOffset() {
+  const intptr_t kComponentNodeOffset = 0;
+  return GetNextMetadataPayloadOffset(kComponentNodeOffset -
+                                      helper_->data_program_offset_);
+}
+
 DirectCallMetadataHelper::DirectCallMetadataHelper(KernelReaderHelper* helper)
     : MetadataHelper(helper, tag(), /* precompiler_only = */ true) {}
 
@@ -1937,6 +1935,10 @@
     case kSimpleFunctionType:
       SkipFunctionType(true);
       return;
+    case kTypedefType:
+      ReadUInt();             // read index for canonical name.
+      SkipListOfDartTypes();  // read list of types.
+      return;
     case kTypeParameterType:
       ReadUInt();              // read index for parameter.
       SkipOptionalDartType();  // read bound bound.
@@ -1984,7 +1986,7 @@
   }
 
   if (!simple) {
-    SkipCanonicalNameReference();  // read typedef reference.
+    SkipOptionalDartType();  // read typedef type.
   }
 
   SkipDartType();  // read return type.
@@ -2219,6 +2221,12 @@
       SkipDartType();           // read type.
       SkipListOfExpressions();  // read list of expressions.
       return;
+    case kSetLiteral:
+    case kConstSetLiteral:
+      // Set literals are currently desugared in the frontend and will not
+      // reach the VM. See http://dartbug.com/35124 for discussion.
+      UNREACHABLE();
+      return;
     case kMapLiteral:
     case kConstMapLiteral: {
       ReadPosition();                           // read position.
@@ -2700,35 +2708,10 @@
   return AbstractType::ZoneHandle(Z, result_.raw());
 }
 
-AbstractType& TypeTranslator::BuildVariableType() {
-  AbstractType& abstract_type = BuildType();
-
-  // We return a new `ZoneHandle` here on purpose: The intermediate language
-  // instructions do not make a copy of the handle, so we do it.
-  AbstractType& type = Type::ZoneHandle(Z);
-
-  if (abstract_type.IsMalformed()) {
-    type = AbstractType::dynamic_type().raw();
-  } else {
-    type = result_.raw();
-  }
-
-  return type;
-}
-
-void TypeTranslator::BuildTypeInternal(bool invalid_as_dynamic) {
+void TypeTranslator::BuildTypeInternal() {
   Tag tag = helper_->ReadTag();
   switch (tag) {
     case kInvalidType:
-      if (invalid_as_dynamic) {
-        result_ = Object::dynamic_type().raw();
-      } else {
-        result_ = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(Z),  // No previous error.
-            Script::Handle(Z, Script::null()), TokenPosition::kNoSource,
-            "[InvalidType] in Kernel IR.");
-      }
-      break;
     case kDynamicType:
       result_ = Object::dynamic_type().raw();
       break;
@@ -2737,7 +2720,7 @@
       break;
     case kBottomType:
       result_ =
-          Class::Handle(Z, I->object_store()->null_class()).CanonicalType();
+          Class::Handle(Z, I->object_store()->null_class()).DeclarationType();
       break;
     case kInterfaceType:
       BuildInterfaceType(false);
@@ -2769,10 +2752,18 @@
       helper_->ReadCanonicalNameReference();  // read klass_name.
 
   const Class& klass = Class::Handle(Z, H.LookupClassByKernelClass(klass_name));
+  ASSERT(!klass.IsNull());
   if (simple) {
-    // Fast path for non-generic types: retrieve or populate the class's only
-    // canonical type.
-    result_ = H.GetCanonicalType(klass).raw();
+    if (finalize_ || klass.is_type_finalized()) {
+      // Fast path for non-generic types: retrieve or populate the class's only
+      // canonical type, which is its declaration type.
+      result_ = klass.DeclarationType();
+    } else {
+      // Note that the type argument vector is not yet extended.
+      result_ =
+          Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
+                    klass.token_pos());
+    }
     return;
   }
 
@@ -2840,9 +2831,6 @@
   ++pos;
   for (intptr_t i = 0; i < positional_count; ++i, ++pos) {
     BuildTypeInternal();  // read ith positional parameter.
-    if (result_.IsMalformed()) {
-      result_ = AbstractType::dynamic_type().raw();
-    }
     parameter_types.SetAt(pos, result_);
     parameter_names.SetAt(pos, H.DartSymbolPlain("noname"));
   }
@@ -2859,22 +2847,16 @@
       // read string reference (i.e. named_parameters[i].name).
       String& name = H.DartSymbolObfuscate(helper_->ReadStringReference());
       BuildTypeInternal();  // read named_parameters[i].type.
-      if (result_.IsMalformed()) {
-        result_ = AbstractType::dynamic_type().raw();
-      }
       parameter_types.SetAt(pos, result_);
       parameter_names.SetAt(pos, name);
     }
   }
 
   if (!simple) {
-    helper_->SkipCanonicalNameReference();  // read typedef reference.
+    helper_->SkipOptionalDartType();  // read typedef type.
   }
 
   BuildTypeInternal();  // read return type.
-  if (result_.IsMalformed()) {
-    result_ = AbstractType::dynamic_type().raw();
-  }
   signature_function.set_result_type(result_);
 
   finalize_ = finalize;
@@ -2939,16 +2921,12 @@
             : 0;
     if (procedure_type_parameter_count > 0) {
       if (procedure_type_parameter_count > parameter_index) {
-        if (FLAG_reify_generic_functions) {
-          result_ ^=
-              TypeArguments::Handle(Z, active_class_->member->type_parameters())
-                  .TypeAt(parameter_index);
-          if (finalize_) {
-            result_ =
-                ClassFinalizer::FinalizeType(*active_class_->klass, result_);
-          }
-        } else {
-          result_ ^= Type::DynamicType();
+        result_ ^=
+            TypeArguments::Handle(Z, active_class_->member->type_parameters())
+                .TypeAt(parameter_index);
+        if (finalize_) {
+          result_ =
+              ClassFinalizer::FinalizeType(*active_class_->klass, result_);
         }
         return;
       }
@@ -2958,12 +2936,7 @@
 
   if (active_class_->local_type_parameters != NULL) {
     if (parameter_index < active_class_->local_type_parameters->Length()) {
-      if (FLAG_reify_generic_functions) {
-        result_ ^=
-            active_class_->local_type_parameters->TypeAt(parameter_index);
-      } else {
-        result_ ^= Type::DynamicType();
-      }
+      result_ ^= active_class_->local_type_parameters->TypeAt(parameter_index);
       if (finalize_) {
         result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
       }
@@ -2999,7 +2972,7 @@
   if (!only_dynamic) {
     type_arguments = TypeArguments::New(length);
     for (intptr_t i = 0; i < length; ++i) {
-      BuildTypeInternal(true);  // read ith type.
+      BuildTypeInternal();  // read ith type.
       type_arguments.SetTypeAt(i, result_);
     }
 
@@ -3099,9 +3072,6 @@
       parameter.set_bound(Type::Handle(Z, I->object_store()->object_type()));
     } else {
       AbstractType& bound = BuildTypeWithoutFinalization();  // read ith bound.
-      if (bound.IsMalformedOrMalbounded()) {
-        bound = I->object_store()->object_type();
-      }
       parameter.set_bound(bound);
     }
 
@@ -3114,15 +3084,12 @@
   ASSERT(!klass.IsTypedefClass());
   // Note that if klass is _Closure, the returned type will be _Closure,
   // and not the signature type.
-  Type& type = Type::ZoneHandle(Z, klass.CanonicalType());
-  if (!type.IsNull()) {
-    return type;
-  }
-  type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
-                   klass.token_pos());
-  if (klass.is_type_finalized()) {
-    type ^= ClassFinalizer::FinalizeType(klass, type);
-    klass.SetCanonicalType(type);
+  Type& type = Type::ZoneHandle(Z);
+  if (finalize_ || klass.is_type_finalized()) {
+    type = klass.DeclarationType();
+  } else {
+    type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()),
+                     klass.token_pos());
   }
   return type;
 }
@@ -3176,7 +3143,7 @@
   intptr_t pos = 0;
   if (is_method) {
     ASSERT(!klass.IsNull());
-    function.SetParameterTypeAt(pos, H.GetCanonicalType(klass));
+    function.SetParameterTypeAt(pos, H.GetDeclarationType(klass));
     function.SetParameterNameAt(pos, Symbols::This());
     pos++;
   } else if (is_closure) {
@@ -3200,8 +3167,7 @@
       helper_->SkipExpression();  // read (actual) initializer.
     }
 
-    function.SetParameterTypeAt(
-        pos, type.IsMalformed() ? Type::dynamic_type() : type);
+    function.SetParameterTypeAt(pos, type);
     function.SetParameterNameAt(pos, H.DartIdentifier(lib, helper.name_index_));
   }
 
@@ -3218,8 +3184,7 @@
       helper_->SkipExpression();  // read (actual) initializer.
     }
 
-    function.SetParameterTypeAt(
-        pos, type.IsMalformed() ? Type::dynamic_type() : type);
+    function.SetParameterTypeAt(pos, type);
     function.SetParameterNameAt(pos, H.DartIdentifier(lib, helper.name_index_));
   }
 
@@ -3229,8 +3194,7 @@
   if (!function.IsGenerativeConstructor()) {
     const AbstractType& return_type =
         BuildTypeWithoutFinalization();  // read return type.
-    function.set_result_type(return_type.IsMalformed() ? Type::dynamic_type()
-                                                       : return_type);
+    function.set_result_type(return_type);
     function_node_helper->SetJustRead(FunctionNodeHelper::kReturnType);
   }
 }
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 949c0b5..3a184a1 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -154,7 +154,7 @@
                                     const String& method_name);
   RawFunction* LookupDynamicFunction(const Class& klass, const String& name);
 
-  Type& GetCanonicalType(const Class& klass);
+  Type& GetDeclarationType(const Class& klass);
 
   void ReportError(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
   void ReportError(const Script& script,
@@ -169,6 +169,11 @@
                    const char* format,
                    ...) PRINTF_ATTRIBUTE(5, 6);
 
+  RawArray* GetBytecodeComponent() const { return info_.bytecode_component(); }
+  void SetBytecodeComponent(const Array& bytecode_component) {
+    info_.set_bytecode_component(bytecode_component);
+  }
+
  private:
   // This will mangle [name_to_modify] if necessary and make the result a symbol
   // if asked.  The result will be available in [name_to_modify] and it is also
@@ -514,14 +519,17 @@
   void SetNext(Field field) { next_read_ = field; }
   void SetJustRead(Field field) { next_read_ = field + 1; }
 
-  bool IsStatic() { return (flags_ & kStatic) != 0; }
-  bool IsAbstract() { return (flags_ & kAbstract) != 0; }
-  bool IsExternal() { return (flags_ & kExternal) != 0; }
-  bool IsConst() { return (flags_ & kConst) != 0; }
-  bool IsForwardingStub() { return (flags_ & kForwardingStub) != 0; }
-  bool IsRedirectingFactoryConstructor() {
+  bool IsStatic() const { return (flags_ & kStatic) != 0; }
+  bool IsAbstract() const { return (flags_ & kAbstract) != 0; }
+  bool IsExternal() const { return (flags_ & kExternal) != 0; }
+  bool IsConst() const { return (flags_ & kConst) != 0; }
+  bool IsForwardingStub() const { return (flags_ & kForwardingStub) != 0; }
+  bool IsRedirectingFactoryConstructor() const {
     return (flags_ & kRedirectingFactoryConstructor) != 0;
   }
+  bool IsNoSuchMethodForwarder() const {
+    return (flags_ & kNoSuchMethodForwarder) != 0;
+  }
 
   NameIndex canonical_name_;
   TokenPosition start_position_;
@@ -794,6 +802,9 @@
   // Assumes metadata is accesses for nodes in linear order most of the time.
   intptr_t GetNextMetadataPayloadOffset(intptr_t node_offset);
 
+  // Returns metadata associated with component.
+  intptr_t GetComponentMetadataPayloadOffset();
+
   KernelReaderHelper* helper_;
   TranslationHelper& translation_helper_;
 
@@ -843,6 +854,7 @@
   enum Flag {
     kFlagNullable = 1 << 0,
     kFlagInt = 1 << 1,
+    kFlagSkipCheck = 1 << 2,
   };
 
   InferredTypeMetadata(intptr_t cid_, uint8_t flags_)
@@ -856,6 +868,7 @@
   }
   bool IsNullable() const { return (flags & kFlagNullable) != 0; }
   bool IsInt() const { return (flags & kFlagInt) != 0; }
+  bool IsSkipCheck() const { return (flags & kFlagSkipCheck) != 0; }
 
   CompileType ToCompileType(Zone* zone) const {
     if (IsInt()) {
@@ -1202,19 +1215,11 @@
                  ActiveClass* active_class,
                  bool finalize = false);
 
-  // Can return a malformed type.
   AbstractType& BuildType();
-  // Can return a malformed type.
   AbstractType& BuildTypeWithoutFinalization();
-  // Is guaranteed to be not malformed.
-  AbstractType& BuildVariableType();
 
-  // Will return `TypeArguments::null()` in case any of the arguments are
-  // malformed.
   const TypeArguments& BuildTypeArguments(intptr_t length);
 
-  // Will return `TypeArguments::null()` in case any of the arguments are
-  // malformed.
   const TypeArguments& BuildInstantiatedTypeArguments(
       const Class& receiver_class,
       intptr_t length);
@@ -1233,8 +1238,7 @@
                                FunctionNodeHelper* function_node_helper);
 
  private:
-  // Can build a malformed type.
-  void BuildTypeInternal(bool invalid_as_dynamic = false);
+  void BuildTypeInternal();
   void BuildInterfaceType(bool simple);
   void BuildFunctionType(bool simple);
   void BuildTypeParameterType();
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index a63ae30..1ec7fd2 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -40,8 +40,7 @@
   const intptr_t previous_block_id = last_used_block_id_;
 
   const bool load_optional_arguments = function_.HasOptionalParameters();
-  const bool expect_type_args =
-      function_.IsGeneric() && FLAG_reify_generic_functions;
+  const bool expect_type_args = function_.IsGeneric();
   const bool check_arguments = function_.IsClosureFunction();
 
   Fragment prologue = Fragment(entry);
@@ -95,8 +94,7 @@
   // If expect_type_args, a non-zero length must match the declaration length.
   TargetEntryInstr *then, *fail;
   check_type_args += LoadArgDescriptor();
-  check_type_args += LoadNativeField(NativeFieldDesc::Get(
-      NativeFieldDesc::kArgumentsDescriptor_type_args_len));
+  check_type_args += LoadNativeField(Slot::ArgumentsDescriptor_type_args_len());
   if (expect_type_args) {
     JoinEntryInstr* join2 = BuildJoinEntry();
 
@@ -146,11 +144,11 @@
 
   copy_args_prologue += LoadArgDescriptor();
   copy_args_prologue +=
-      LoadField(ArgumentsDescriptor::positional_count_offset());
+      LoadNativeField(Slot::ArgumentsDescriptor_positional_count());
   LocalVariable* positional_count_var = MakeTemporary();
 
   copy_args_prologue += LoadArgDescriptor();
-  copy_args_prologue += LoadField(ArgumentsDescriptor::count_offset());
+  copy_args_prologue += LoadNativeField(Slot::ArgumentsDescriptor_count());
   LocalVariable* count_var = MakeTemporary();
 
   // Ensure the caller provided at least [min_num_pos_args] arguments.
@@ -363,7 +361,7 @@
   JoinEntryInstr* done = BuildJoinEntry();
 
   check_args += LoadArgDescriptor();
-  check_args += LoadField(ArgumentsDescriptor::count_offset());
+  check_args += LoadNativeField(Slot::ArgumentsDescriptor_count());
   LocalVariable* count = MakeTemporary();
 
   TargetEntryInstr *then, *fail;
@@ -374,7 +372,7 @@
   TargetEntryInstr *then2, *fail2;
   Fragment check_len(then);
   check_len += LoadArgDescriptor();
-  check_len += LoadField(ArgumentsDescriptor::positional_count_offset());
+  check_len += LoadNativeField(Slot::ArgumentsDescriptor_positional_count());
   check_len += BranchIfEqual(&then2, &fail2);
 
   Fragment(fail) + Goto(nsm);
@@ -394,7 +392,7 @@
   // (both load/store happen on the copyied-down places).
   Fragment populate_context;
   populate_context += LoadLocal(closure_parameter);
-  populate_context += LoadField(Closure::context_offset());
+  populate_context += LoadNativeField(Slot::Closure_context());
   populate_context += StoreLocal(TokenPosition::kNoSource, context);
   populate_context += Drop();
   return populate_context;
@@ -407,7 +405,7 @@
 
   Fragment store_type_args;
   store_type_args += LoadArgDescriptor();
-  store_type_args += LoadField(ArgumentsDescriptor::count_offset());
+  store_type_args += LoadNativeField(Slot::ArgumentsDescriptor_count());
   store_type_args += LoadFpRelativeSlot(
       kWordSize * (1 + compiler_frame_layout.param_end_from_fp));
   store_type_args += StoreLocal(TokenPosition::kNoSource, type_args_var);
@@ -430,7 +428,7 @@
     Fragment use_delayed_type_args;
     use_delayed_type_args += LoadLocal(closure);
     use_delayed_type_args +=
-        LoadField(Closure::delayed_type_arguments_offset());
+        LoadNativeField(Slot::Closure_delayed_type_arguments());
     use_delayed_type_args +=
         StoreLocal(TokenPosition::kNoSource, type_args_var);
     use_delayed_type_args += Drop();
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 09b239b..201c724 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -95,15 +95,15 @@
     // captured receiver value. This ensure that AssertAssignable will correctly
     // load instantiator type arguments if they are needed.
     Class& klass = Class::Handle(Z, function.Owner());
-    Type& klass_type = H.GetCanonicalType(klass);
+    Type& klass_type = H.GetDeclarationType(klass);
     result_->this_variable =
         MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                      Symbols::This(), klass_type);
-    result_->this_variable->set_index(VariableIndex(0));
     result_->this_variable->set_is_captured();
     enclosing_scope = new (Z) LocalScope(NULL, 0, 0);
     enclosing_scope->set_context_level(0);
     enclosing_scope->AddVariable(result_->this_variable);
+    enclosing_scope->AddContextVariable(result_->this_variable);
   } else if (function.IsLocalFunction()) {
     enclosing_scope = LocalScope::RestoreOuterScope(
         ContextScope::Handle(Z, function.context_scope()));
@@ -113,8 +113,7 @@
   scope_->set_end_token_pos(function.end_token_pos());
 
   // Add function type arguments variable before current context variable.
-  if (FLAG_reify_generic_functions &&
-      (function.IsGeneric() || function.HasGenericParent())) {
+  if ((function.IsGeneric() || function.HasGenericParent())) {
     LocalVariable* type_args_var = MakeVariable(
         TokenPosition::kNoSource, TokenPosition::kNoSource,
         Symbols::FunctionTypeArgumentsVar(), AbstractType::dynamic_type());
@@ -166,7 +165,7 @@
         // We use [is_static] instead of [IsStaticFunction] because the latter
         // returns `false` for constructors.
         Class& klass = Class::Handle(Z, function.Owner());
-        Type& klass_type = H.GetCanonicalType(klass);
+        Type& klass_type = H.GetDeclarationType(klass);
         LocalVariable* variable =
             MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                          Symbols::This(), klass_type);
@@ -280,7 +279,7 @@
       intptr_t pos = 0;
       if (is_method) {
         Class& klass = Class::Handle(Z, function.Owner());
-        Type& klass_type = H.GetCanonicalType(klass);
+        Type& klass_type = H.GetDeclarationType(klass);
         LocalVariable* variable =
             MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                          Symbols::This(), klass_type);
@@ -299,9 +298,10 @@
           FieldHelper field_helper(&helper_);
           field_helper.ReadUntilIncluding(FieldHelper::kFlags);
 
-          if (!field_helper.IsCovariant() &&
-              (!field_helper.IsGenericCovariantImpl() ||
-               (!attrs.has_non_this_uses && !attrs.has_tearoff_uses))) {
+          if (field_helper.IsCovariant()) {
+            result_->setter_value->set_is_explicit_covariant_parameter();
+          } else if (!field_helper.IsGenericCovariantImpl() ||
+                     (!attrs.has_non_this_uses && !attrs.has_tearoff_uses)) {
             result_->setter_value->set_type_check_mode(
                 LocalVariable::kTypeCheckedByCaller);
           }
@@ -321,7 +321,7 @@
         const Class& klass = Class::Handle(Z, function.Owner());
         result_->this_variable =
             MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                         Symbols::This(), H.GetCanonicalType(klass));
+                         Symbols::This(), H.GetDeclarationType(klass));
         scope_->InsertParameterAt(0, result_->this_variable);
 
         // Create setter value variable.
@@ -340,7 +340,7 @@
         Class& klass = Class::Handle(Z, function.Owner());
         result_->this_variable =
             MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                         Symbols::This(), H.GetCanonicalType(klass));
+                         Symbols::This(), H.GetDeclarationType(klass));
         scope_->InsertParameterAt(pos++, result_->this_variable);
 
         // Create all positional and named parameters.
@@ -356,7 +356,7 @@
       // instead of using the generic code for regular functions.
       // Therefore, it isn't necessary to mark it as captured here.
       Class& klass = Class::Handle(Z, function.Owner());
-      Type& klass_type = H.GetCanonicalType(klass);
+      Type& klass_type = H.GetDeclarationType(klass);
       LocalVariable* variable =
           MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                        Symbols::This(), klass_type);
@@ -787,6 +787,13 @@
       }
       return;
     }
+    case kSetLiteral:
+    case kConstSetLiteral: {
+      // Set literals are currently desugared in the frontend and will not
+      // reach the VM. See http://dartbug.com/35124 for discussion.
+      UNREACHABLE();
+      return;
+    }
     case kMapLiteral:
     case kConstMapLiteral: {
       helper_.ReadPosition();                           // read position.
@@ -1210,7 +1217,7 @@
 
 AbstractType& ScopeBuilder::BuildAndVisitVariableType() {
   const intptr_t offset = helper_.ReaderOffset();
-  AbstractType& type = T.BuildVariableType();
+  AbstractType& type = T.BuildType();
   helper_.SetOffset(offset);  // rewind
   VisitDartType();
   return type;
@@ -1292,7 +1299,7 @@
   }
 
   if (!simple) {
-    helper_.SkipCanonicalNameReference();  // read typedef reference.
+    helper_.SkipOptionalDartType();  // read typedef reference.
   }
 
   VisitDartType();  // read return type.
@@ -1428,13 +1435,17 @@
   if (helper.IsFinal()) {
     variable->set_is_final();
   }
+  if (helper.IsCovariant()) {
+    variable->set_is_explicit_covariant_parameter();
+  }
   if (variable->name().raw() == Symbols::IteratorParameter().raw()) {
     variable->set_is_forced_stack();
   }
 
   const bool needs_covariant_check_in_method =
       helper.IsCovariant() ||
-      (helper.IsGenericCovariantImpl() && attrs.has_non_this_uses);
+      (helper.IsGenericCovariantImpl() &&
+       (attrs.has_non_this_uses || attrs.has_tearoff_uses));
 
   switch (type_check_mode) {
     case kTypeCheckAllParameters:
@@ -1462,6 +1473,13 @@
       variable->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
       break;
   }
+
+  // TODO(sjindel): We can also skip these checks on dynamic invocations as
+  // well.
+  if (parameter_type.IsSkipCheck()) {
+    variable->set_type_check_mode(LocalVariable::kTypeCheckedByCaller);
+  }
+
   scope_->InsertParameterAt(pos, variable);
   result_->locals.Insert(helper_.data_program_offset_ + kernel_offset,
                          variable);
diff --git a/runtime/vm/compiler/intrinsifier.cc b/runtime/vm/compiler/intrinsifier.cc
index 7537204..3902dac 100644
--- a/runtime/vm/compiler/intrinsifier.cc
+++ b/runtime/vm/compiler/intrinsifier.cc
@@ -87,7 +87,7 @@
   IntrinsicDesc* intrinsics;
 };
 
-#define DEFINE_INTRINSIC(class_name, function_name, destination, type, fp)     \
+#define DEFINE_INTRINSIC(class_name, function_name, destination, fp)           \
   {#class_name, #function_name},
 
 // clang-format off
@@ -230,7 +230,7 @@
       new FlowGraph(parsed_function, graph_entry, block_id, prologue_info);
   const Function& function = parsed_function.function();
   switch (function.recognized_kind()) {
-#define EMIT_CASE(class_name, function_name, enum_name, type, fp)              \
+#define EMIT_CASE(class_name, function_name, enum_name, fp)                    \
   case MethodRecognizer::k##enum_name:                                         \
     if (!Build_##enum_name(graph)) return false;                               \
     break;
@@ -248,6 +248,9 @@
     printer.PrintBlocks();
   }
 
+  // Prepare for register allocation (cf. FinalizeGraph).
+  graph->RemoveRedefinitions();
+
   // Ensure loop hierarchy has been computed.
   GrowableArray<BitVector*> dominance_frontier;
   graph->ComputeDominators(&dominance_frontier);
@@ -300,7 +303,7 @@
 #define EMIT_BREAKPOINT()
 #endif
 
-#define EMIT_CASE(class_name, function_name, enum_name, type, fp)              \
+#define EMIT_CASE(class_name, function_name, enum_name, fp)                    \
   case MethodRecognizer::k##enum_name: {                                       \
     compiler->assembler()->Comment("Intrinsic");                               \
     Label normal_ir_body;                                                      \
@@ -477,15 +480,19 @@
   Environment* fall_through_env_;
 };
 
-static void PrepareIndexedOp(BlockBuilder* builder,
-                             Definition* array,
-                             Definition* index,
-                             intptr_t length_offset) {
+static Definition* PrepareIndexedOp(FlowGraph* flow_graph,
+                                    BlockBuilder* builder,
+                                    Definition* array,
+                                    Definition* index,
+                                    const Slot& length_field) {
   Definition* length = builder->AddDefinition(new LoadFieldInstr(
-      new Value(array), length_offset, Type::ZoneHandle(Type::SmiType()),
-      TokenPosition::kNoSource));
-  builder->AddInstruction(new CheckArrayBoundInstr(
-      new Value(length), new Value(index), DeoptId::kNone));
+      new Value(array), length_field, TokenPosition::kNoSource));
+  // Note that the intrinsifier must always use deopting array bound
+  // checks, because intrinsics currently don't support calls.
+  Definition* safe_index = new CheckArrayBoundInstr(
+      new Value(length), new Value(index), DeoptId::kNone);
+  builder->AddDefinition(safe_index);
+  return safe_index;
 }
 
 static bool IntrinsifyArrayGetIndexed(FlowGraph* flow_graph,
@@ -497,14 +504,8 @@
   Definition* index = builder.AddParameter(1);
   Definition* array = builder.AddParameter(2);
 
-  intptr_t length_offset = Array::length_offset();
-  if (RawObject::IsTypedDataClassId(array_cid)) {
-    length_offset = TypedData::length_offset();
-  } else if (RawObject::IsExternalTypedDataClassId(array_cid)) {
-    length_offset = ExternalTypedData::length_offset();
-  }
-
-  PrepareIndexedOp(&builder, array, index, length_offset);
+  index = PrepareIndexedOp(flow_graph, &builder, array, index,
+                           Slot::GetLengthFieldForArrayCid(array_cid));
 
   if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     array = builder.AddDefinition(new LoadUntaggedInstr(
@@ -581,14 +582,8 @@
   Definition* index = builder.AddParameter(2);
   Definition* array = builder.AddParameter(3);
 
-  intptr_t length_offset = Array::length_offset();
-  if (RawObject::IsTypedDataClassId(array_cid)) {
-    length_offset = TypedData::length_offset();
-  } else if (RawObject::IsExternalTypedDataClassId(array_cid)) {
-    length_offset = ExternalTypedData::length_offset();
-  }
-
-  PrepareIndexedOp(&builder, array, index, length_offset);
+  index = PrepareIndexedOp(flow_graph, &builder, array, index,
+                           Slot::GetLengthFieldForArrayCid(array_cid));
 
   // Value check/conversion.
   switch (array_cid) {
@@ -689,7 +684,7 @@
                         MethodRecognizer::k##enum_name##SetIndexed));          \
   }
 
-DEFINE_ARRAY_GETTER_INTRINSIC(ObjectArray)  // Setter in intrinsifier_<arch>.cc.
+DEFINE_ARRAY_GETTER_INTRINSIC(ObjectArray)
 DEFINE_ARRAY_GETTER_INTRINSIC(ImmutableArray)
 
 #define DEFINE_ARRAY_GETTER_SETTER_INTRINSICS(enum_name)                       \
@@ -782,7 +777,9 @@
 
   Definition* index = builder.AddParameter(1);
   Definition* str = builder.AddParameter(2);
-  PrepareIndexedOp(&builder, str, index, String::length_offset());
+
+  index =
+      PrepareIndexedOp(flow_graph, &builder, str, index, Slot::String_length());
 
   // For external strings: Load external data.
   if (cid == kExternalOneByteStringCid) {
@@ -907,37 +904,37 @@
                                MethodRecognizer::kFloat32x4ShuffleW);
 }
 
-static bool BuildLoadField(FlowGraph* flow_graph, intptr_t offset) {
+static bool BuildLoadField(FlowGraph* flow_graph, const Slot& field) {
   GraphEntryInstr* graph_entry = flow_graph->graph_entry();
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
   Definition* array = builder.AddParameter(1);
 
-  Definition* length = builder.AddDefinition(new LoadFieldInstr(
-      new Value(array), offset, Type::ZoneHandle(), builder.TokenPos()));
+  Definition* length = builder.AddDefinition(
+      new LoadFieldInstr(new Value(array), field, builder.TokenPos()));
   builder.AddIntrinsicReturn(new Value(length));
   return true;
 }
 
 bool Intrinsifier::Build_ObjectArrayLength(FlowGraph* flow_graph) {
-  return BuildLoadField(flow_graph, Array::length_offset());
+  return BuildLoadField(flow_graph, Slot::Array_length());
 }
 
 bool Intrinsifier::Build_ImmutableArrayLength(FlowGraph* flow_graph) {
-  return BuildLoadField(flow_graph, Array::length_offset());
+  return BuildLoadField(flow_graph, Slot::Array_length());
 }
 
 bool Intrinsifier::Build_GrowableArrayLength(FlowGraph* flow_graph) {
-  return BuildLoadField(flow_graph, GrowableObjectArray::length_offset());
+  return BuildLoadField(flow_graph, Slot::GrowableObjectArray_length());
 }
 
 bool Intrinsifier::Build_StringBaseLength(FlowGraph* flow_graph) {
-  return BuildLoadField(flow_graph, String::length_offset());
+  return BuildLoadField(flow_graph, Slot::String_length());
 }
 
 bool Intrinsifier::Build_TypedDataLength(FlowGraph* flow_graph) {
-  return BuildLoadField(flow_graph, TypedData::length_offset());
+  return BuildLoadField(flow_graph, Slot::TypedData_length());
 }
 
 bool Intrinsifier::Build_GrowableArrayCapacity(FlowGraph* flow_graph) {
@@ -947,12 +944,10 @@
 
   Definition* array = builder.AddParameter(1);
 
-  Definition* backing_store = builder.AddDefinition(
-      new LoadFieldInstr(new Value(array), GrowableObjectArray::data_offset(),
-                         Type::ZoneHandle(), builder.TokenPos()));
-  Definition* capacity = builder.AddDefinition(
-      new LoadFieldInstr(new Value(backing_store), Array::length_offset(),
-                         Type::ZoneHandle(), builder.TokenPos()));
+  Definition* backing_store = builder.AddDefinition(new LoadFieldInstr(
+      new Value(array), Slot::GrowableObjectArray_data(), builder.TokenPos()));
+  Definition* capacity = builder.AddDefinition(new LoadFieldInstr(
+      new Value(backing_store), Slot::Array_length(), builder.TokenPos()));
   builder.AddIntrinsicReturn(new Value(capacity));
   return true;
 }
@@ -965,12 +960,12 @@
   Definition* index = builder.AddParameter(1);
   Definition* growable_array = builder.AddParameter(2);
 
-  PrepareIndexedOp(&builder, growable_array, index,
-                   GrowableObjectArray::length_offset());
+  index = PrepareIndexedOp(flow_graph, &builder, growable_array, index,
+                           Slot::GrowableObjectArray_length());
 
-  Definition* backing_store = builder.AddDefinition(new LoadFieldInstr(
-      new Value(growable_array), GrowableObjectArray::data_offset(),
-      Type::ZoneHandle(), builder.TokenPos()));
+  Definition* backing_store = builder.AddDefinition(
+      new LoadFieldInstr(new Value(growable_array),
+                         Slot::GrowableObjectArray_data(), builder.TokenPos()));
   Definition* result = builder.AddDefinition(new LoadIndexedInstr(
       new Value(backing_store), new Value(index),
       Instance::ElementSizeFor(kArrayCid),  // index scale
@@ -979,13 +974,34 @@
   return true;
 }
 
-void Intrinsifier::ObjectArraySetIndexed(Assembler* assembler,
-                                         Label* normal_ir_body) {
+bool Intrinsifier::Build_ObjectArraySetIndexed(FlowGraph* flow_graph) {
   if (Isolate::Current()->argument_type_checks()) {
-    return;
+    return false;
   }
 
-  ObjectArraySetIndexedUnchecked(assembler, normal_ir_body);
+  return Build_ObjectArraySetIndexedUnchecked(flow_graph);
+}
+
+bool Intrinsifier::Build_ObjectArraySetIndexedUnchecked(FlowGraph* flow_graph) {
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  auto normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* value = builder.AddParameter(1);
+  Definition* index = builder.AddParameter(2);
+  Definition* array = builder.AddParameter(3);
+
+  index = PrepareIndexedOp(flow_graph, &builder, array, index,
+                           Slot::Array_length());
+
+  builder.AddInstruction(new StoreIndexedInstr(
+      new Value(array), new Value(index), new Value(value), kEmitStoreBarrier,
+      Instance::ElementSizeFor(kArrayCid),  // index scale
+      kArrayCid, kAlignedAccess, DeoptId::kNone, builder.TokenPos()));
+  // Return null.
+  Definition* null_def = builder.AddNullDefinition();
+  builder.AddIntrinsicReturn(new Value(null_def));
+  return true;
 }
 
 bool Intrinsifier::Build_GrowableArraySetIndexed(FlowGraph* flow_graph) {
@@ -1006,12 +1022,11 @@
   Definition* index = builder.AddParameter(2);
   Definition* array = builder.AddParameter(3);
 
-  PrepareIndexedOp(&builder, array, index,
-                   GrowableObjectArray::length_offset());
+  index = PrepareIndexedOp(flow_graph, &builder, array, index,
+                           Slot::GrowableObjectArray_length());
 
-  Definition* backing_store = builder.AddDefinition(
-      new LoadFieldInstr(new Value(array), GrowableObjectArray::data_offset(),
-                         Type::ZoneHandle(), builder.TokenPos()));
+  Definition* backing_store = builder.AddDefinition(new LoadFieldInstr(
+      new Value(array), Slot::GrowableObjectArray_data(), builder.TokenPos()));
 
   builder.AddInstruction(new StoreIndexedInstr(
       new Value(backing_store), new Value(index), new Value(value),
@@ -1038,7 +1053,7 @@
                                              *value_check, builder.TokenPos()));
 
   builder.AddInstruction(new StoreInstanceFieldInstr(
-      GrowableObjectArray::data_offset(), new Value(growable_array),
+      Slot::GrowableObjectArray_data(), new Value(growable_array),
       new Value(data), kEmitStoreBarrier, builder.TokenPos()));
   // Return null.
   Definition* null_def = builder.AddNullDefinition();
@@ -1057,7 +1072,7 @@
   builder.AddInstruction(
       new CheckSmiInstr(new Value(length), DeoptId::kNone, builder.TokenPos()));
   builder.AddInstruction(new StoreInstanceFieldInstr(
-      GrowableObjectArray::length_offset(), new Value(growable_array),
+      Slot::GrowableObjectArray_length(), new Value(growable_array),
       new Value(length), kNoStoreBarrier, builder.TokenPos()));
   Definition* null_def = builder.AddNullDefinition();
   builder.AddIntrinsicReturn(new Value(null_def));
diff --git a/runtime/vm/compiler/intrinsifier.h b/runtime/vm/compiler/intrinsifier.h
index be8a563..23d5436 100644
--- a/runtime/vm/compiler/intrinsifier.h
+++ b/runtime/vm/compiler/intrinsifier.h
@@ -43,7 +43,7 @@
 
   static bool CanIntrinsify(const Function& function);
 
-#define DECLARE_FUNCTION(class_name, function_name, enum_name, type, fp)       \
+#define DECLARE_FUNCTION(class_name, function_name, enum_name, fp)             \
   static void enum_name(Assembler* assembler, Label* normal_ir_body);
 
   ALL_INTRINSICS_LIST(DECLARE_FUNCTION)
@@ -55,7 +55,7 @@
 #undef DECLARE_FUNCTION
 
 #if !defined(TARGET_ARCH_DBC)
-#define DECLARE_FUNCTION(class_name, function_name, enum_name, type, fp)       \
+#define DECLARE_FUNCTION(class_name, function_name, enum_name, fp)             \
   static bool Build_##enum_name(FlowGraph* flow_graph);
 
   GRAPH_INTRINSICS_LIST(DECLARE_FUNCTION)
diff --git a/runtime/vm/compiler/intrinsifier_arm.cc b/runtime/vm/compiler/intrinsifier_arm.cc
index 920b211..9e516f0 100644
--- a/runtime/vm/compiler/intrinsifier_arm.cc
+++ b/runtime/vm/compiler/intrinsifier_arm.cc
@@ -53,31 +53,6 @@
   assembler->mov(LR, Operand(CALLEE_SAVED_TEMP));
 }
 
-// Intrinsify only for Smi index.
-void Intrinsifier::ObjectArraySetIndexedUnchecked(Assembler* assembler,
-                                                  Label* normal_ir_body) {
-  __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
-  __ tst(R1, Operand(kSmiTagMask));
-  // Index not Smi.
-  __ b(normal_ir_body, NE);
-  __ ldr(R0, Address(SP, 2 * kWordSize));  // Array.
-
-  // Range check.
-  __ ldr(R3, FieldAddress(R0, Array::length_offset()));  // Array length.
-  __ cmp(R1, Operand(R3));
-  // Runtime throws exception.
-  __ b(normal_ir_body, CS);
-
-  // Note that R1 is Smi, i.e, times 2.
-  ASSERT(kSmiTagShift == 1);
-  __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
-  __ add(R1, R0, Operand(R1, LSL, 1));     // R1 is Smi.
-  __ StoreIntoObject(R0, FieldAddress(R1, Array::data_offset()), R2);
-  // Caller is responsible for preserving the value if necessary.
-  __ Ret();
-  __ Bind(normal_ir_body);
-}
-
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+1), data (+0).
 void Intrinsifier::GrowableArray_Allocate(Assembler* assembler,
@@ -112,40 +87,6 @@
   __ Bind(normal_ir_body);
 }
 
-// Add an element to growable array if it doesn't need to grow, otherwise
-// call into regular code.
-// On stack: growable array (+1), value (+0).
-void Intrinsifier::GrowableArray_add(Assembler* assembler,
-                                     Label* normal_ir_body) {
-  // In checked mode we need to type-check the incoming argument.
-  if (Isolate::Current()->argument_type_checks()) {
-    return;
-  }
-  // R0: Array.
-  __ ldr(R0, Address(SP, 1 * kWordSize));
-  // R1: length.
-  __ ldr(R1, FieldAddress(R0, GrowableObjectArray::length_offset()));
-  // R2: data.
-  __ ldr(R2, FieldAddress(R0, GrowableObjectArray::data_offset()));
-  // R3: capacity.
-  __ ldr(R3, FieldAddress(R2, Array::length_offset()));
-  // Compare length with capacity.
-  __ cmp(R1, Operand(R3));
-  __ b(normal_ir_body, EQ);  // Must grow data.
-  const int32_t value_one = reinterpret_cast<int32_t>(Smi::New(1));
-  // len = len + 1;
-  __ add(R3, R1, Operand(value_one));
-  __ StoreIntoSmiField(FieldAddress(R0, GrowableObjectArray::length_offset()),
-                       R3);
-  __ ldr(R0, Address(SP, 0 * kWordSize));  // Value.
-  ASSERT(kSmiTagShift == 1);
-  __ add(R1, R2, Operand(R1, LSL, 1));
-  __ StoreIntoObject(R2, FieldAddress(R1, Array::data_offset()), R0);
-  __ LoadObject(R0, Object::null_object());
-  __ Ret();
-  __ Bind(normal_ir_body);
-}
-
 #define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_shift)           \
   Label fall_through;                                                          \
   const intptr_t kArrayLengthStackOffset = 0 * kWordSize;                      \
@@ -1627,7 +1568,7 @@
 // Return type quickly for simple types (not parameterized and not signature).
 void Intrinsifier::ObjectRuntimeType(Assembler* assembler,
                                      Label* normal_ir_body) {
-  Label use_canonical_type, not_double, not_integer;
+  Label use_declaration_type, not_double, not_integer;
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ LoadClassIdMayBeSmi(R1, R0);
 
@@ -1635,7 +1576,7 @@
   __ b(normal_ir_body, EQ);  // Instance is a closure.
 
   __ CompareImmediate(R1, kNumPredefinedCids);
-  __ b(&use_canonical_type, HI);
+  __ b(&use_declaration_type, HI);
 
   __ CompareImmediate(R1, kDoubleCid);
   __ b(&not_double, NE);
@@ -1653,19 +1594,19 @@
   __ Ret();
 
   __ Bind(&not_integer);
-  JumpIfNotString(assembler, R1, R0, &use_canonical_type);
+  JumpIfNotString(assembler, R1, R0, &use_declaration_type);
   __ LoadIsolate(R0);
   __ LoadFromOffset(kWord, R0, R0, Isolate::object_store_offset());
   __ LoadFromOffset(kWord, R0, R0, ObjectStore::string_type_offset());
   __ Ret();
 
-  __ Bind(&use_canonical_type);
+  __ Bind(&use_declaration_type);
   __ LoadClassById(R2, R1);  // Overwrites R1.
   __ ldrh(R3, FieldAddress(R2, Class::num_type_arguments_offset()));
   __ CompareImmediate(R3, 0);
   __ b(normal_ir_body, NE);
 
-  __ ldr(R0, FieldAddress(R2, Class::canonical_type_offset()));
+  __ ldr(R0, FieldAddress(R2, Class::declaration_type_offset()));
   __ CompareObject(R0, Object::null_object());
   __ b(normal_ir_body, EQ);
   __ Ret();
diff --git a/runtime/vm/compiler/intrinsifier_arm64.cc b/runtime/vm/compiler/intrinsifier_arm64.cc
index 96773e5..2abf1ed 100644
--- a/runtime/vm/compiler/intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/intrinsifier_arm64.cc
@@ -57,29 +57,6 @@
   assembler->mov(ARGS_DESC_REG, CALLEE_SAVED_TEMP2);
 }
 
-// Intrinsify only for Smi index.
-void Intrinsifier::ObjectArraySetIndexedUnchecked(Assembler* assembler,
-                                                  Label* normal_ir_body) {
-  __ ldr(R1, Address(SP, 1 * kWordSize));  // Index.
-  __ BranchIfNotSmi(R1, normal_ir_body);
-  __ ldr(R0, Address(SP, 2 * kWordSize));  // Array.
-
-  // Range check.
-  __ ldr(R3, FieldAddress(R0, Array::length_offset()));  // Array length.
-  __ cmp(R1, Operand(R3));
-  // Runtime throws exception.
-  __ b(normal_ir_body, CS);
-
-  // Note that R1 is Smi, i.e, times 2.
-  ASSERT(kSmiTagShift == 1);
-  __ ldr(R2, Address(SP, 0 * kWordSize));  // Value.
-  __ add(R1, R0, Operand(R1, LSL, 2));     // R1 is Smi.
-  __ StoreIntoObject(R0, FieldAddress(R1, Array::data_offset()), R2);
-  // Caller is responsible for preserving the value if necessary.
-  __ ret();
-  __ Bind(normal_ir_body);
-}
-
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+1), data (+0).
 void Intrinsifier::GrowableArray_Allocate(Assembler* assembler,
@@ -113,39 +90,6 @@
   __ Bind(normal_ir_body);
 }
 
-// Add an element to growable array if it doesn't need to grow, otherwise
-// call into regular code.
-// On stack: growable array (+1), value (+0).
-void Intrinsifier::GrowableArray_add(Assembler* assembler,
-                                     Label* normal_ir_body) {
-  // In checked mode we need to type-check the incoming argument.
-  if (Isolate::Current()->argument_type_checks()) {
-    return;
-  }
-  // R0: Array.
-  __ ldr(R0, Address(SP, 1 * kWordSize));
-  // R1: length.
-  __ ldr(R1, FieldAddress(R0, GrowableObjectArray::length_offset()));
-  // R2: data.
-  __ ldr(R2, FieldAddress(R0, GrowableObjectArray::data_offset()));
-  // R3: capacity.
-  __ ldr(R3, FieldAddress(R2, Array::length_offset()));
-  // Compare length with capacity.
-  __ cmp(R1, Operand(R3));
-  __ b(normal_ir_body, EQ);  // Must grow data.
-  const int64_t value_one = reinterpret_cast<int64_t>(Smi::New(1));
-  // len = len + 1;
-  __ add(R3, R1, Operand(value_one));
-  __ str(R3, FieldAddress(R0, GrowableObjectArray::length_offset()));
-  __ ldr(R0, Address(SP, 0 * kWordSize));  // Value.
-  ASSERT(kSmiTagShift == 1);
-  __ add(R1, R2, Operand(R1, LSL, 2));
-  __ StoreIntoObject(R2, FieldAddress(R1, Array::data_offset()), R0);
-  __ LoadObject(R0, Object::null_object());
-  __ ret();
-  __ Bind(normal_ir_body);
-}
-
 static int GetScaleFactor(intptr_t size) {
   switch (size) {
     case 1:
@@ -1685,7 +1629,7 @@
 // Return type quickly for simple types (not parameterized and not signature).
 void Intrinsifier::ObjectRuntimeType(Assembler* assembler,
                                      Label* normal_ir_body) {
-  Label use_canonical_type, not_double, not_integer;
+  Label use_declaration_type, not_double, not_integer;
   __ ldr(R0, Address(SP, 0 * kWordSize));
   __ LoadClassIdMayBeSmi(R1, R0);
 
@@ -1693,7 +1637,7 @@
   __ b(normal_ir_body, EQ);  // Instance is a closure.
 
   __ CompareImmediate(R1, kNumPredefinedCids);
-  __ b(&use_canonical_type, HI);
+  __ b(&use_declaration_type, HI);
 
   __ CompareImmediate(R1, kDoubleCid);
   __ b(&not_double, NE);
@@ -1711,19 +1655,19 @@
   __ ret();
 
   __ Bind(&not_integer);
-  JumpIfNotString(assembler, R1, R0, &use_canonical_type);
+  JumpIfNotString(assembler, R1, R0, &use_declaration_type);
   __ LoadIsolate(R0);
   __ LoadFromOffset(R0, R0, Isolate::object_store_offset());
   __ LoadFromOffset(R0, R0, ObjectStore::string_type_offset());
   __ ret();
 
-  __ Bind(&use_canonical_type);
+  __ Bind(&use_declaration_type);
   __ LoadClassById(R2, R1);  // Overwrites R1.
   __ ldr(R3, FieldAddress(R2, Class::num_type_arguments_offset()), kHalfword);
   __ CompareImmediate(R3, 0);
   __ b(normal_ir_body, NE);
 
-  __ ldr(R0, FieldAddress(R2, Class::canonical_type_offset()));
+  __ ldr(R0, FieldAddress(R2, Class::declaration_type_offset()));
   __ CompareObject(R0, Object::null_object());
   __ b(normal_ir_body, EQ);
   __ ret();
diff --git a/runtime/vm/compiler/intrinsifier_dbc.cc b/runtime/vm/compiler/intrinsifier_dbc.cc
index 0cad04a..b09a15f 100644
--- a/runtime/vm/compiler/intrinsifier_dbc.cc
+++ b/runtime/vm/compiler/intrinsifier_dbc.cc
@@ -25,7 +25,7 @@
   return -1;
 }
 
-#define DEFINE_FUNCTION(class_name, test_function_name, enum_name, type, fp)   \
+#define DEFINE_FUNCTION(class_name, test_function_name, enum_name, fp)         \
   void Intrinsifier::enum_name(Assembler* assembler, Label* normal_ir_body) {  \
     if (Simulator::IsSupportedIntrinsic(Simulator::k##enum_name##Intrinsic)) { \
       assembler->Intrinsic(Simulator::k##enum_name##Intrinsic);                \
diff --git a/runtime/vm/compiler/intrinsifier_ia32.cc b/runtime/vm/compiler/intrinsifier_ia32.cc
index c97906c..cfb50f6 100644
--- a/runtime/vm/compiler/intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/intrinsifier_ia32.cc
@@ -52,29 +52,6 @@
   assembler->movl(ARGS_DESC_REG, CALLEE_SAVED_TEMP);
 }
 
-// Intrinsify only for Smi index.
-void Intrinsifier::ObjectArraySetIndexedUnchecked(Assembler* assembler,
-                                                  Label* normal_ir_body) {
-  __ movl(EBX, Address(ESP, +2 * kWordSize));  // Index.
-  __ testl(EBX, Immediate(kSmiTagMask));
-  // Index not Smi.
-  __ j(NOT_ZERO, normal_ir_body);
-  __ movl(EAX, Address(ESP, +3 * kWordSize));  // Array.
-  // Range check.
-  __ cmpl(EBX, FieldAddress(EAX, Array::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, normal_ir_body);
-  // Note that EBX is Smi, i.e, times 2.
-  ASSERT(kSmiTagShift == 1);
-  // Destroy ECX (ic data) as we will not continue in the function.
-  __ movl(ECX, Address(ESP, +1 * kWordSize));  // Value.
-  __ StoreIntoObject(EAX, FieldAddress(EAX, EBX, TIMES_2, Array::data_offset()),
-                     ECX);
-  // Caller is responsible of preserving the value if necessary.
-  __ ret();
-  __ Bind(normal_ir_body);
-}
-
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+2), data (+1), return-address (+0).
 void Intrinsifier::GrowableArray_Allocate(Assembler* assembler,
@@ -110,35 +87,6 @@
   __ Bind(normal_ir_body);
 }
 
-// Add an element to growable array if it doesn't need to grow, otherwise
-// call into regular code.
-// On stack: growable array (+2), value (+1), return-address (+0).
-void Intrinsifier::GrowableArray_add(Assembler* assembler,
-                                     Label* normal_ir_body) {
-  // In checked mode we need to type-check the incoming argument.
-  if (Isolate::Current()->argument_type_checks()) return;
-
-  __ movl(EAX, Address(ESP, +2 * kWordSize));  // Array.
-  __ movl(EBX, FieldAddress(EAX, GrowableObjectArray::length_offset()));
-  // EBX: length.
-  __ movl(EDI, FieldAddress(EAX, GrowableObjectArray::data_offset()));
-  // EDI: data.
-  // Compare length with capacity.
-  __ cmpl(EBX, FieldAddress(EDI, Array::length_offset()));
-  __ j(EQUAL, normal_ir_body);  // Must grow data.
-  __ IncrementSmiField(FieldAddress(EAX, GrowableObjectArray::length_offset()),
-                       1);
-  __ movl(EAX, Address(ESP, +1 * kWordSize));  // Value
-  ASSERT(kSmiTagShift == 1);
-  __ StoreIntoObject(EDI, FieldAddress(EDI, EBX, TIMES_2, Array::data_offset()),
-                     EAX);
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<int32_t>(Object::null()));
-  __ movl(EAX, raw_null);
-  __ ret();
-  __ Bind(normal_ir_body);
-}
-
 #define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_factor)          \
   const intptr_t kArrayLengthStackOffset = 1 * kWordSize;                      \
   NOT_IN_PRODUCT(__ MaybeTraceAllocation(cid, EDI, normal_ir_body, false));    \
@@ -1689,7 +1637,7 @@
 // Return type quickly for simple types (not parameterized and not signature).
 void Intrinsifier::ObjectRuntimeType(Assembler* assembler,
                                      Label* normal_ir_body) {
-  Label use_canonical_type, not_double, not_integer;
+  Label use_declaration_type, not_double, not_integer;
   __ movl(EAX, Address(ESP, +1 * kWordSize));
   __ LoadClassIdMayBeSmi(EDI, EAX);
 
@@ -1697,7 +1645,7 @@
   __ j(EQUAL, normal_ir_body);  // Instance is a closure.
 
   __ cmpl(EDI, Immediate(kNumPredefinedCids));
-  __ j(ABOVE, &use_canonical_type);
+  __ j(ABOVE, &use_declaration_type);
 
   // If object is a instance of _Double return double type.
   __ cmpl(EDI, Immediate(kDoubleCid));
@@ -1722,7 +1670,7 @@
   // If object is a string (one byte, two byte or external variants) return
   // string type.
   __ movl(EAX, EDI);
-  JumpIfNotString(assembler, EAX, &use_canonical_type);
+  JumpIfNotString(assembler, EAX, &use_declaration_type);
 
   __ LoadIsolate(EAX);
   __ movl(EAX, Address(EAX, Isolate::object_store_offset()));
@@ -1730,12 +1678,12 @@
   __ ret();
 
   // Object is neither double, nor integer, nor string.
-  __ Bind(&use_canonical_type);
+  __ Bind(&use_declaration_type);
   __ LoadClassById(EBX, EDI);
   __ movzxw(EDI, FieldAddress(EBX, Class::num_type_arguments_offset()));
   __ cmpl(EDI, Immediate(0));
   __ j(NOT_EQUAL, normal_ir_body, Assembler::kNearJump);
-  __ movl(EAX, FieldAddress(EBX, Class::canonical_type_offset()));
+  __ movl(EAX, FieldAddress(EBX, Class::declaration_type_offset()));
   __ CompareObject(EAX, Object::null_object());
   __ j(EQUAL, normal_ir_body, Assembler::kNearJump);  // Not yet set.
   __ ret();
diff --git a/runtime/vm/compiler/intrinsifier_x64.cc b/runtime/vm/compiler/intrinsifier_x64.cc
index 57975e5..a51b665 100644
--- a/runtime/vm/compiler/intrinsifier_x64.cc
+++ b/runtime/vm/compiler/intrinsifier_x64.cc
@@ -52,27 +52,6 @@
   assembler->movq(ARGS_DESC_REG, CALLEE_SAVED_TEMP);
 }
 
-void Intrinsifier::ObjectArraySetIndexedUnchecked(Assembler* assembler,
-                                                  Label* normal_ir_body) {
-  __ movq(RDX, Address(RSP, +1 * kWordSize));  // Value.
-  __ movq(RCX, Address(RSP, +2 * kWordSize));  // Index.
-  __ movq(RAX, Address(RSP, +3 * kWordSize));  // Array.
-  __ testq(RCX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, normal_ir_body);
-  // Range check.
-  __ cmpq(RCX, FieldAddress(RAX, Array::length_offset()));
-  // Runtime throws exception.
-  __ j(ABOVE_EQUAL, normal_ir_body);
-  // Note that RBX is Smi, i.e, times 2.
-  ASSERT(kSmiTagShift == 1);
-  // Destroy RCX (ic data) as we will not continue in the function.
-  __ StoreIntoObject(RAX, FieldAddress(RAX, RCX, TIMES_4, Array::data_offset()),
-                     RDX);
-  // Caller is responsible of preserving the value if necessary.
-  __ ret();
-  __ Bind(normal_ir_body);
-}
-
 // Allocate a GrowableObjectArray using the backing array specified.
 // On stack: type argument (+2), data (+1), return-address (+0).
 void Intrinsifier::GrowableArray_Allocate(Assembler* assembler,
@@ -108,34 +87,6 @@
   __ Bind(normal_ir_body);
 }
 
-// Add an element to growable array if it doesn't need to grow, otherwise
-// call into regular code.
-// On stack: growable array (+2), value (+1), return-address (+0).
-void Intrinsifier::GrowableArray_add(Assembler* assembler,
-                                     Label* normal_ir_body) {
-  // In checked mode we need to check the incoming argument.
-  if (Isolate::Current()->argument_type_checks()) return;
-
-  __ movq(RAX, Address(RSP, +2 * kWordSize));  // Array.
-  __ movq(RCX, FieldAddress(RAX, GrowableObjectArray::length_offset()));
-  // RCX: length.
-  __ movq(RDX, FieldAddress(RAX, GrowableObjectArray::data_offset()));
-  // RDX: data.
-  // Compare length with capacity.
-  __ cmpq(RCX, FieldAddress(RDX, Array::length_offset()));
-  __ j(EQUAL, normal_ir_body);  // Must grow data.
-  // len = len + 1;
-  __ IncrementSmiField(FieldAddress(RAX, GrowableObjectArray::length_offset()),
-                       1);
-  __ movq(RAX, Address(RSP, +1 * kWordSize));  // Value
-  ASSERT(kSmiTagShift == 1);
-  __ StoreIntoObject(RDX, FieldAddress(RDX, RCX, TIMES_4, Array::data_offset()),
-                     RAX);
-  __ LoadObject(RAX, Object::null_object());
-  __ ret();
-  __ Bind(normal_ir_body);
-}
-
 #define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_factor)          \
   Label fall_through;                                                          \
   const intptr_t kArrayLengthStackOffset = 1 * kWordSize;                      \
@@ -1601,7 +1552,7 @@
 // Return type quickly for simple types (not parameterized and not signature).
 void Intrinsifier::ObjectRuntimeType(Assembler* assembler,
                                      Label* normal_ir_body) {
-  Label use_canonical_type, not_integer, not_double;
+  Label use_declaration_type, not_integer, not_double;
   __ movq(RAX, Address(RSP, +1 * kWordSize));
   __ LoadClassIdMayBeSmi(RCX, RAX);
 
@@ -1610,7 +1561,7 @@
   __ j(EQUAL, normal_ir_body);  // Instance is a closure.
 
   __ cmpl(RCX, Immediate(kNumPredefinedCids));
-  __ j(ABOVE, &use_canonical_type);
+  __ j(ABOVE, &use_declaration_type);
 
   // If object is a instance of _Double return double type.
   __ cmpl(RCX, Immediate(kDoubleCid));
@@ -1635,7 +1586,7 @@
   // If object is a string (one byte, two byte or external variants) return
   // string type.
   __ movq(RAX, RCX);
-  JumpIfNotString(assembler, RAX, &use_canonical_type);
+  JumpIfNotString(assembler, RAX, &use_declaration_type);
 
   __ LoadIsolate(RAX);
   __ movq(RAX, Address(RAX, Isolate::object_store_offset()));
@@ -1643,12 +1594,12 @@
   __ ret();
 
   // Object is neither double, nor integer, nor string.
-  __ Bind(&use_canonical_type);
+  __ Bind(&use_declaration_type);
   __ LoadClassById(RDI, RCX);
   __ movzxw(RCX, FieldAddress(RDI, Class::num_type_arguments_offset()));
   __ cmpq(RCX, Immediate(0));
   __ j(NOT_EQUAL, normal_ir_body, Assembler::kNearJump);
-  __ movq(RAX, FieldAddress(RDI, Class::canonical_type_offset()));
+  __ movq(RAX, FieldAddress(RDI, Class::declaration_type_offset()));
   __ CompareObject(RAX, Object::null_object());
   __ j(EQUAL, normal_ir_body, Assembler::kNearJump);  // Not yet set.
   __ ret();
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index f3c1792..c63af58 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -110,7 +110,7 @@
     FLAG_optimization_counter_threshold = -1;
     FLAG_polymorphic_with_deopt = false;
     FLAG_precompiled_mode = true;
-    FLAG_reorder_basic_blocks = false;
+    FLAG_reorder_basic_blocks = true;
     FLAG_use_field_guards = false;
     FLAG_use_cha_deopt = false;
 
@@ -168,10 +168,8 @@
   const bool multiline = regexp.is_multi_line();
 
   RegExpCompileData* compile_data = new (zone) RegExpCompileData();
-  if (!RegExpParser::ParseRegExp(pattern, multiline, compile_data)) {
-    // Parsing failures are handled in the RegExp factory constructor.
-    UNREACHABLE();
-  }
+  // Parsing failures are handled in the RegExp factory constructor.
+  RegExpParser::ParseRegExp(pattern, multiline, compile_data);
 
   regexp.set_num_bracket_expressions(compile_data->capture_count);
   if (compile_data->simple) {
@@ -229,7 +227,7 @@
 //   Arg0: function object.
 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) {
   ASSERT(thread->IsMutatorThread());
-  const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
+  const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
   Object& result = Object::Handle(zone);
 
   if (FLAG_enable_interpreter && function.IsBytecodeAllowed(zone)) {
@@ -334,161 +332,6 @@
   return Error::null();
 }
 
-static void AddRelatedClassesToList(
-    const Class& cls,
-    GrowableHandlePtrArray<const Class>* parse_list,
-    GrowableHandlePtrArray<const Class>* patch_list) {
-  Zone* zone = Thread::Current()->zone();
-  Class& parse_class = Class::Handle(zone);
-  AbstractType& interface_type = Type::Handle(zone);
-  Array& interfaces = Array::Handle(zone);
-
-  // Add all the interfaces implemented by the class that have not been
-  // already parsed to the parse list. Mark the interface as parsed so that
-  // we don't recursively add it back into the list.
-  interfaces ^= cls.interfaces();
-  for (intptr_t i = 0; i < interfaces.Length(); i++) {
-    interface_type ^= interfaces.At(i);
-    parse_class ^= interface_type.type_class();
-    if (!parse_class.is_finalized() && !parse_class.is_marked_for_parsing()) {
-      parse_list->Add(parse_class);
-      parse_class.set_is_marked_for_parsing();
-    }
-  }
-
-  // Walk up the super_class chain and add these classes to the list if they
-  // have not been already parsed to the parse list. Mark the class as parsed
-  // so that we don't recursively add it back into the list.
-  parse_class ^= cls.SuperClass();
-  while (!parse_class.IsNull()) {
-    if (!parse_class.is_finalized() && !parse_class.is_marked_for_parsing()) {
-      parse_list->Add(parse_class);
-      parse_class.set_is_marked_for_parsing();
-    }
-    parse_class ^= parse_class.SuperClass();
-  }
-
-  // Add patch classes if they exist to the parse list if they have not already
-  // been parsed and patched. Mark the class as parsed so that we don't
-  // recursively add it back into the list.
-  parse_class ^= cls.GetPatchClass();
-  if (!parse_class.IsNull()) {
-    if (!parse_class.is_finalized() && !parse_class.is_marked_for_parsing()) {
-      patch_list->Add(parse_class);
-      parse_class.set_is_marked_for_parsing();
-    }
-  }
-}
-
-RawError* Compiler::CompileClass(const Class& cls) {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  // If class is a top level class it is already parsed.
-  if (cls.IsTopLevel()) {
-    return Error::null();
-  }
-  // If the class is already marked for parsing return immediately.
-  if (cls.is_marked_for_parsing()) {
-    return Error::null();
-  }
-  // If the class is a typedef class there is no need to try and
-  // compile it. Just finalize it directly.
-  if (cls.IsTypedefClass()) {
-#if defined(DEBUG)
-    const Class& closure_cls =
-        Class::Handle(Isolate::Current()->object_store()->closure_class());
-    ASSERT(closure_cls.is_finalized());
-#endif
-    LongJumpScope jump;
-    if (setjmp(*jump.Set()) == 0) {
-      ClassFinalizer::FinalizeClass(cls);
-      return Error::null();
-    } else {
-      Thread* thread = Thread::Current();
-      Error& error = Error::Handle(thread->zone());
-      error = thread->sticky_error();
-      thread->clear_sticky_error();
-      return error.raw();
-    }
-  }
-
-  Thread* const thread = Thread::Current();
-  StackZone zone(thread);
-#if !defined(PRODUCT)
-  VMTagScope tagScope(thread, VMTag::kCompileClassTagId);
-  TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
-                            "CompileClass");
-  if (tds.enabled()) {
-    tds.SetNumArguments(1);
-    tds.CopyArgument(0, "class", cls.ToCString());
-  }
-#endif  // !defined(PRODUCT)
-
-  // We remember all the classes that are being compiled in these lists. This
-  // also allows us to reset the marked_for_parsing state in case we see an
-  // error.
-  GrowableHandlePtrArray<const Class> parse_list(thread->zone(), 4);
-  GrowableHandlePtrArray<const Class> patch_list(thread->zone(), 4);
-
-  // Parse the class and all the interfaces it implements and super classes.
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    if (FLAG_trace_compiler) {
-      THR_Print("Compiling Class '%s'\n", cls.ToCString());
-    }
-
-    // Add the primary class which needs to be parsed to the parse list.
-    // Mark the class as parsed so that we don't recursively add the same
-    // class back into the list.
-    parse_list.Add(cls);
-    cls.set_is_marked_for_parsing();
-
-    // Add all super classes, interface classes and patch class if one
-    // exists to the corresponding lists.
-    // NOTE: The parse_list array keeps growing as more classes are added
-    // to it by AddRelatedClassesToList. It is not OK to hoist
-    // parse_list.Length() into a local variable and iterate using the local
-    // variable.
-    for (intptr_t i = 0; i < parse_list.length(); i++) {
-      AddRelatedClassesToList(parse_list.At(i), &parse_list, &patch_list);
-    }
-
-    // Finalize these classes.
-    for (intptr_t i = (parse_list.length() - 1); i >= 0; i--) {
-      const Class& parse_class = parse_list.At(i);
-      ASSERT(!parse_class.IsNull());
-      ClassFinalizer::FinalizeClass(parse_class);
-      parse_class.reset_is_marked_for_parsing();
-    }
-    for (intptr_t i = (patch_list.length() - 1); i >= 0; i--) {
-      const Class& parse_class = patch_list.At(i);
-      ASSERT(!parse_class.IsNull());
-      ClassFinalizer::FinalizeClass(parse_class);
-      parse_class.reset_is_marked_for_parsing();
-    }
-
-    return Error::null();
-  } else {
-    // Reset the marked for parsing flags.
-    for (intptr_t i = 0; i < parse_list.length(); i++) {
-      const Class& parse_class = parse_list.At(i);
-      if (parse_class.is_marked_for_parsing()) {
-        parse_class.reset_is_marked_for_parsing();
-      }
-    }
-    for (intptr_t i = 0; i < patch_list.length(); i++) {
-      const Class& parse_class = patch_list.At(i);
-      if (parse_class.is_marked_for_parsing()) {
-        parse_class.reset_is_marked_for_parsing();
-      }
-    }
-    Thread* thread = Thread::Current();
-    Error& error = Error::Handle(thread->zone());
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
-  }
-}
-
 class CompileParsedFunctionHelper : public ValueObject {
  public:
   CompileParsedFunctionHelper(ParsedFunction* parsed_function,
@@ -541,7 +384,8 @@
   // Allocates instruction object. Since this occurs only at safepoint,
   // there can be no concurrent access to the instruction page.
   Code& code = Code::Handle(Code::FinalizeCode(
-      function, graph_compiler, assembler, optimized(), /*stats=*/nullptr));
+      function, graph_compiler, assembler, Code::PoolAttachment::kAttachPool,
+      optimized(), /*stats=*/nullptr));
   code.set_is_optimized(optimized());
   code.set_owner(function);
 #if !defined(PRODUCT)
@@ -677,6 +521,11 @@
     function.set_unoptimized_code(code);
     function.AttachCode(code);
     function.SetWasCompiled(true);
+    if (function.IsOptimizable() && (function.usage_counter() < 0)) {
+      // While doing compilation in background, usage counter is set
+      // to INT_MIN. Reset counter so that function can be optimized further.
+      function.SetUsageCounter(0);
+    }
   }
   if (parsed_function()->HasDeferredPrefixes()) {
     ASSERT(!FLAG_load_deferred_eagerly);
@@ -863,7 +712,7 @@
       done = true;
     } else {
       // We bailed out or we encountered an error.
-      const Error& error = Error::Handle(thread()->sticky_error());
+      const Error& error = Error::Handle(thread()->StealStickyError());
 
       if (error.raw() == Object::branch_offset_error().raw()) {
         // Compilation failed due to an out of range branch offset in the
@@ -883,12 +732,14 @@
         done = true;
       }
 
-      // If is is not a background compilation, clear the error if it was not a
-      // real error, but just a bailout. If we're it a background compilation
-      // this will be dealt with in the caller.
       if (!Compiler::IsBackgroundCompilation() && error.IsLanguageError() &&
           (LanguageError::Cast(error).kind() == Report::kBailout)) {
-        thread()->clear_sticky_error();
+        // If is is not a background compilation, discard the error if it was
+        // not a real error, but just a bailout. If we're it a background
+        // compilation this will be dealt with in the caller.
+      } else {
+        // Otherwise, continue propagating.
+        thread()->set_sticky_error(error);
       }
     }
   }
@@ -936,8 +787,7 @@
 
     if (Compiler::IsBackgroundCompilation()) {
       ASSERT(function.is_background_optimizable());
-      if (isolate->IsTopLevelParsing() ||
-          (loading_invalidation_gen_at_start !=
+      if ((loading_invalidation_gen_at_start !=
            isolate->loading_invalidation_gen())) {
         // Loading occured while parsing. We need to abort here because state
         // changed while compiling.
@@ -950,6 +800,8 @@
     const Code& result = Code::Handle(helper.Compile(pipeline));
 
     if (result.IsNull()) {
+      const Error& error = Error::Handle(thread->StealStickyError());
+
       if (Compiler::IsBackgroundCompilation()) {
         // Try again later, background compilation may abort because of
         // state change during compilation.
@@ -957,63 +809,62 @@
           THR_Print("Aborted background compilation: %s\n",
                     function.ToFullyQualifiedCString());
         }
-        {
-          // If it was a bailout, then disable optimization.
-          Error& error = Error::Handle();
-          // We got an error during compilation.
-          error = thread->sticky_error();
-          thread->clear_sticky_error();
 
-          if (error.raw() == Object::background_compilation_error().raw()) {
-            if (FLAG_trace_compiler) {
-              THR_Print(
-                  "--> disabling background optimizations for '%s' (will "
-                  "try to re-compile on isolate thread again)\n",
-                  function.ToFullyQualifiedCString());
-            }
-
-            // Ensure we don't attempt to re-compile the function on the
-            // background compiler.
-            function.set_is_background_optimizable(false);
-
-            // Trigger another optimization soon on the main thread.
-            function.SetUsageCounter(optimized
-                                         ? FLAG_optimization_counter_threshold
-                                         : FLAG_compilation_counter_threshold);
-          } else if ((error.IsLanguageError() &&
-                      LanguageError::Cast(error).kind() == Report::kBailout) ||
-                     error.IsUnhandledException()) {
-            if (FLAG_trace_compiler) {
-              THR_Print("--> disabling optimizations for '%s'\n",
-                        function.ToFullyQualifiedCString());
-            }
-            function.SetIsOptimizable(false);
+        // We got an error during compilation.
+        // If it was a bailout, then disable optimization.
+        if (error.raw() == Object::background_compilation_error().raw()) {
+          if (FLAG_trace_compiler) {
+            THR_Print(
+                "--> disabling background optimizations for '%s' (will "
+                "try to re-compile on isolate thread again)\n",
+                function.ToFullyQualifiedCString());
           }
+
+          // Ensure we don't attempt to re-compile the function on the
+          // background compiler.
+          function.set_is_background_optimizable(false);
+
+          // Trigger another optimization soon on the main thread.
+          function.SetUsageCounter(optimized
+                                       ? FLAG_optimization_counter_threshold
+                                       : FLAG_compilation_counter_threshold);
+          return Error::null();
+        } else if (error.IsLanguageError() &&
+                   LanguageError::Cast(error).kind() == Report::kBailout) {
+          if (FLAG_trace_compiler) {
+            THR_Print("--> disabling optimizations for '%s'\n",
+                      function.ToFullyQualifiedCString());
+          }
+          function.SetIsOptimizable(false);
+          return Error::null();
+        } else {
+          // The background compiler does not execute Dart code or handle
+          // isolate messages.
+          ASSERT(!error.IsUnwindError());
+          return error.raw();
         }
-        return Error::null();
       }
       if (optimized) {
-        // Optimizer bailed out. Disable optimizations and never try again.
-        if (trace_compiler) {
-          THR_Print("--> disabling optimizations for '%s'\n",
-                    function.ToFullyQualifiedCString());
-        } else if (FLAG_trace_failed_optimization_attempts) {
-          THR_Print("Cannot optimize: %s\n",
-                    function.ToFullyQualifiedCString());
+        if (error.IsLanguageError() &&
+            LanguageError::Cast(error).kind() == Report::kBailout) {
+          // Optimizer bailed out. Disable optimizations and never try again.
+          if (trace_compiler) {
+            THR_Print("--> disabling optimizations for '%s'\n",
+                      function.ToFullyQualifiedCString());
+          } else if (FLAG_trace_failed_optimization_attempts) {
+            THR_Print("Cannot optimize: %s\n",
+                      function.ToFullyQualifiedCString());
+          }
+          function.SetIsOptimizable(false);
+          return Error::null();
         }
-        function.SetIsOptimizable(false);
-        return Error::null();
+        return error.raw();
       } else {
         ASSERT(!optimized);
-        // Encountered error.
-        Error& error = Error::Handle();
-        // We got an error during compilation.
-        error = thread->sticky_error();
-        thread->clear_sticky_error();
         // The non-optimizing compiler can get an unhandled exception
         // due to OOM or Stack overflow errors, it should not however
         // bail out.
-        ASSERT(error.IsUnhandledException() ||
+        ASSERT(error.IsUnhandledException() || error.IsUnwindError() ||
                (error.IsLanguageError() &&
                 LanguageError::Cast(error).kind() != Report::kBailout));
         return error.raw();
@@ -1046,11 +897,9 @@
   } else {
     Thread* const thread = Thread::Current();
     StackZone stack_zone(thread);
-    Error& error = Error::Handle();
     // We got an error during compilation or it is a bailout from background
     // compilation (e.g., during parsing with EnsureIsFinalized).
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
+    const Error& error = Error::Handle(thread->StealStickyError());
     if (error.raw() == Object::background_compilation_error().raw()) {
       // Exit compilation, retry it later.
       if (FLAG_trace_bailout) {
@@ -1096,20 +945,13 @@
     pipeline->ParseFunction(parsed_function);
     return Error::null();
   } else {
-    Thread* const thread = Thread::Current();
-    StackZone stack_zone(thread);
-    Error& error = Error::Handle();
     // We got an error during compilation or it is a bailout from background
     // compilation (e.g., during parsing with EnsureIsFinalized).
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
     // Unoptimized compilation or precompilation may encounter compile-time
     // errors, but regular optimized compilation should not.
     ASSERT(!optimized);
-    return error.raw();
+    return Thread::Current()->StealStickyError();
   }
-  UNREACHABLE();
-  return Error::null();
 }
 
 RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) {
@@ -1122,12 +964,6 @@
 #endif
 
   Isolate* isolate = thread->isolate();
-
-#if !defined(PRODUCT)
-  VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
-  TIMELINE_FUNCTION_COMPILATION_DURATION(thread, "CompileFunction", function);
-#endif  // !defined(PRODUCT)
-
   if (!isolate->compilation_allowed()) {
     FATAL3("Precompilation missed function %s (%s, %s)\n",
            function.ToLibNamePrefixedQualifiedCString(),
@@ -1135,6 +971,17 @@
            Function::KindToCString(function.kind()));
   }
 
+#if !defined(PRODUCT)
+  VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId);
+  const char* event_name;
+  if (IsBackgroundCompilation()) {
+    event_name = "CompileFunctionUnoptimizedBackground";
+  } else {
+    event_name = "CompileFunction";
+  }
+  TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function);
+#endif  // !defined(PRODUCT)
+
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
 
@@ -1207,14 +1054,10 @@
   } else {
     event_name = "CompileFunctionOptimized";
   }
-  // TODO(alexmarkov): Consider adding a separate event for unoptimized
-  // compilation triggered from interpreter
   TIMELINE_FUNCTION_COMPILATION_DURATION(thread, event_name, function);
 #endif  // !defined(PRODUCT)
 
-  // If running with interpreter, do the unoptimized compilation first.
-  const bool optimized = function.ShouldCompilerOptimize();
-  ASSERT(FLAG_enable_interpreter || optimized);
+  ASSERT(function.ShouldCompilerOptimize());
 
   // If we are in the optimizing in the mutator/Dart thread, then
   // this is either an OSR compilation or background compilation is
@@ -1225,7 +1068,8 @@
          !function.is_background_optimizable());
   CompilationPipeline* pipeline =
       CompilationPipeline::New(thread->zone(), function);
-  return CompileFunctionHelper(pipeline, function, optimized, osr_id);
+  return CompileFunctionHelper(pipeline, function, /* optimized = */ true,
+                               osr_id);
 }
 
 // This is only used from unit tests.
@@ -1242,26 +1086,14 @@
     }
     return Error::null();
   } else {
-    Error& error = Error::Handle();
-    Thread* thread = Thread::Current();
     // We got an error during compilation.
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
+    return Thread::Current()->StealStickyError();
   }
-  UNREACHABLE();
-  return Error::null();
 }
 
 void Compiler::ComputeLocalVarDescriptors(const Code& code) {
   ASSERT(!code.is_optimized());
   const Function& function = Function::Handle(code.function());
-  if (FLAG_enable_interpreter && function.Bytecode() == code.raw()) {
-    // TODO(regis): Kernel bytecode does not yet provide var descriptors.
-    ASSERT(code.var_descriptors() == Object::null());
-    code.set_var_descriptors(Object::empty_var_descriptors());
-    return;
-  }
   ParsedFunction* parsed_function = new ParsedFunction(
       Thread::Current(), Function::ZoneHandle(function.raw()));
   ASSERT(code.var_descriptors() == Object::null());
@@ -1312,11 +1144,6 @@
     ASSERT(!func.IsNull());
     if (!func.HasCode() &&
         !func.is_abstract() && !func.IsRedirectingFactory()) {
-      if ((cls.is_mixin_app_alias() || cls.IsMixinApplication()) &&
-          func.HasOptionalParameters()) {
-        // Skipping optional parameters in mixin application.
-        continue;
-      }
       result = CompileFunction(thread, func);
       if (result.IsError()) {
         return Error::Cast(result).raw();
@@ -1361,7 +1188,7 @@
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                  \
     !defined(TARGET_ARCH_IA32)
   if (FLAG_precompiled_mode) {
-    return Precompiler::EvaluateStaticInitializer(field);
+    UNREACHABLE();
   }
 #endif
   ASSERT(field.is_static());
@@ -1424,18 +1251,14 @@
     }
   }
 
-  Thread* const thread = Thread::Current();
-  StackZone zone(thread);
-  const Error& error = Error::Handle(thread->zone(), thread->sticky_error());
-  thread->clear_sticky_error();
-  return error.raw();
+  return Thread::Current()->StealStickyError();
 }
 
 RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) {
 #if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                  \
     !defined(TARGET_ARCH_IA32)
   if (FLAG_precompiled_mode) {
-    return Precompiler::ExecuteOnce(fragment);
+    UNREACHABLE();
   }
 #endif
   LongJumpScope jump;
@@ -1492,10 +1315,7 @@
     }
   }
 
-  Thread* const thread = Thread::Current();
-  const Object& result = PassiveObject::Handle(thread->sticky_error());
-  thread->clear_sticky_error();
-  return result.raw();
+  return Thread::Current()->StealStickyError();
 }
 
 void Compiler::AbortBackgroundCompilation(intptr_t deopt_id, const char* msg) {
@@ -1657,14 +1477,17 @@
         MonitorLocker ml(queue_monitor_);
         function = function_queue()->PeekFunction();
       }
-      while (running_ && !function.IsNull() && !isolate_->IsTopLevelParsing()) {
+      while (running_ && !function.IsNull()) {
         // This is false if we are compiling bytecode -> unoptimized code.
         const bool optimizing = function.ShouldCompilerOptimize();
         ASSERT(FLAG_enable_interpreter || optimizing);
 
-        // Check that we have aggregated and cleared the stats.
-        Compiler::CompileOptimizedFunction(thread, function,
-                                           Compiler::kNoOSRDeoptId);
+        if (optimizing) {
+          Compiler::CompileOptimizedFunction(thread, function,
+                                             Compiler::kNoOSRDeoptId);
+        } else {
+          Compiler::CompileFunction(thread, function);
+        }
 
         QueueElement* qelem = NULL;
         {
@@ -1698,8 +1521,7 @@
     {
       // Wait to be notified when the work queue is not empty.
       MonitorLocker ml(queue_monitor_);
-      while ((function_queue()->IsEmpty() || isolate_->IsTopLevelParsing()) &&
-             running_) {
+      while (function_queue()->IsEmpty() && running_) {
         ml.Wait();
       }
     }
@@ -1824,7 +1646,7 @@
 }
 
 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) {
-  const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
+  const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
   FATAL3("Precompilation missed function %s (%" Pd ", %s)\n",
          function.ToLibNamePrefixedQualifiedCString(),
          function.token_pos().value(),
@@ -1845,11 +1667,6 @@
   return Error::null();
 }
 
-RawError* Compiler::CompileClass(const Class& cls) {
-  FATAL1("Attempt to compile class %s", cls.ToCString());
-  return Error::null();
-}
-
 RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) {
   FATAL1("Attempt to compile function %s", function.ToCString());
   return Error::null();
diff --git a/runtime/vm/compiler/jit/compiler.h b/runtime/vm/compiler/jit/compiler.h
index aee82f1..43f4320 100644
--- a/runtime/vm/compiler/jit/compiler.h
+++ b/runtime/vm/compiler/jit/compiler.h
@@ -88,12 +88,6 @@
   // Returns Error::null() if there is no compilation error.
   static RawError* Compile(const Library& library, const Script& script);
 
-  // Extracts function and field symbols from the class and populates
-  // the class.
-  //
-  // Returns Error::null() if there is no compilation error.
-  static RawError* CompileClass(const Class& cls);
-
   // Generates code for given function without optimization and sets its code
   // field.
   //
@@ -110,9 +104,6 @@
                                          const Function& function);
 
   // Generates optimized code for function.
-  // If interpreter is used and function was not compiled yet, then
-  // generates unoptimized code (it's basically the first round of
-  // optimization).
   //
   // Returns the code object if compilation succeeds.  Returns an Error if
   // there is a compilation error.  If optimization fails, but there is no
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.cc b/runtime/vm/compiler/jit/jit_call_specializer.cc
index cbc5395..3b97b71 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.cc
+++ b/runtime/vm/compiler/jit/jit_call_specializer.cc
@@ -185,7 +185,7 @@
     // usage count of at least 1/kGetterSetterRatio of the getter usage count.
     // This is to avoid unboxing fields where the setter is never or rarely
     // executed.
-    const Field& field = instr->field();
+    const Field& field = instr->slot().field();
     const String& field_name = String::Handle(Z, field.name());
     const Class& owner = Class::Handle(Z, field.Owner());
     const Function& getter =
@@ -233,23 +233,24 @@
 // allocation and explicit initializing stores.
 // If context_value is not NULL then newly allocated context is a populated
 // with values copied from it, otherwise it is initialized with null.
-void JitCallSpecializer::LowerContextAllocation(Definition* alloc,
-                                                intptr_t num_context_variables,
-                                                Value* context_value) {
+void JitCallSpecializer::LowerContextAllocation(
+    Definition* alloc,
+    const GrowableArray<LocalVariable*>& context_variables,
+    Value* context_value) {
   ASSERT(alloc->IsAllocateContext() || alloc->IsCloneContext());
 
   AllocateUninitializedContextInstr* replacement =
       new AllocateUninitializedContextInstr(alloc->token_pos(),
-                                            num_context_variables);
+                                            context_variables.length());
   alloc->ReplaceWith(replacement, current_iterator());
 
   Definition* cursor = replacement;
 
   Value* initial_value;
   if (context_value != NULL) {
-    LoadFieldInstr* load = new (Z)
-        LoadFieldInstr(context_value->CopyWithType(Z), Context::parent_offset(),
-                       AbstractType::ZoneHandle(Z), alloc->token_pos());
+    LoadFieldInstr* load =
+        new (Z) LoadFieldInstr(context_value->CopyWithType(Z),
+                               Slot::Context_parent(), alloc->token_pos());
     flow_graph()->InsertAfter(cursor, load, NULL, FlowGraph::kValue);
     cursor = load;
     initial_value = new (Z) Value(load);
@@ -257,20 +258,18 @@
     initial_value = new (Z) Value(flow_graph()->constant_null());
   }
   StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr(
-      Context::parent_offset(), new (Z) Value(replacement), initial_value,
-      kNoStoreBarrier, alloc->token_pos());
-  // Storing into uninitialized memory; remember to prevent dead store
-  // elimination and ensure proper GC barrier.
-  store->set_is_initialization(true);
-  flow_graph()->InsertAfter(cursor, store, NULL, FlowGraph::kEffect);
+      Slot::Context_parent(), new (Z) Value(replacement), initial_value,
+      kNoStoreBarrier, alloc->token_pos(),
+      StoreInstanceFieldInstr::Kind::kInitializing);
+  flow_graph()->InsertAfter(cursor, store, nullptr, FlowGraph::kEffect);
   cursor = replacement;
 
-  for (intptr_t i = 0; i < num_context_variables; ++i) {
-    if (context_value != NULL) {
+  for (auto variable : context_variables) {
+    const auto& field = Slot::GetContextVariableSlotFor(thread(), *variable);
+    if (context_value != nullptr) {
       LoadFieldInstr* load = new (Z) LoadFieldInstr(
-          context_value->CopyWithType(Z), Context::variable_offset(i),
-          AbstractType::ZoneHandle(Z), alloc->token_pos());
-      flow_graph()->InsertAfter(cursor, load, NULL, FlowGraph::kValue);
+          context_value->CopyWithType(Z), field, alloc->token_pos());
+      flow_graph()->InsertAfter(cursor, load, nullptr, FlowGraph::kValue);
       cursor = load;
       initial_value = new (Z) Value(load);
     } else {
@@ -278,27 +277,19 @@
     }
 
     store = new (Z) StoreInstanceFieldInstr(
-        Context::variable_offset(i), new (Z) Value(replacement), initial_value,
-        kNoStoreBarrier, alloc->token_pos());
-    // Storing into uninitialized memory; remember to prevent dead store
-    // elimination and ensure proper GC barrier.
-    store->set_is_initialization(true);
-    flow_graph()->InsertAfter(cursor, store, NULL, FlowGraph::kEffect);
+        field, new (Z) Value(replacement), initial_value, kNoStoreBarrier,
+        alloc->token_pos(), StoreInstanceFieldInstr::Kind::kInitializing);
+    flow_graph()->InsertAfter(cursor, store, nullptr, FlowGraph::kEffect);
     cursor = store;
   }
 }
 
 void JitCallSpecializer::VisitAllocateContext(AllocateContextInstr* instr) {
-  LowerContextAllocation(instr, instr->num_context_variables(), NULL);
+  LowerContextAllocation(instr, instr->context_variables(), nullptr);
 }
 
 void JitCallSpecializer::VisitCloneContext(CloneContextInstr* instr) {
-  if (instr->num_context_variables() ==
-      CloneContextInstr::kUnknownContextSize) {
-    return;
-  }
-
-  LowerContextAllocation(instr, instr->num_context_variables(),
+  LowerContextAllocation(instr, instr->context_variables(),
                          instr->context_value());
 }
 
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.h b/runtime/vm/compiler/jit/jit_call_specializer.h
index bbb00e3..77c72bd 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.h
+++ b/runtime/vm/compiler/jit/jit_call_specializer.h
@@ -30,9 +30,10 @@
 
   virtual bool TryOptimizeStaticCallUsingStaticTypes(StaticCallInstr* call);
 
-  void LowerContextAllocation(Definition* instr,
-                              intptr_t num_context_variables,
-                              Value* context_value);
+  void LowerContextAllocation(
+      Definition* instr,
+      const GrowableArray<LocalVariable*>& context_variables,
+      Value* context_value);
 
   void ReplaceWithStaticCall(InstanceCallInstr* instr,
                              const ICData& unary_checks,
diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc
index 82bf802..be12f08 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -35,20 +35,29 @@
   }
 }
 
-intptr_t MethodRecognizer::ResultCid(const Function& function) {
-  // Use the 'vm:exact-result-type' annotation if available. This can only be
-  // used within the core library, see 'result_type_pragma.md', detail 1.2 for
-  // explanation.
-  Class& cls = Thread::Current()->ClassHandle();
-  Library& lib = Thread::Current()->LibraryHandle();
-  cls = function.Owner();
-  lib = cls.library();
-  const bool can_use_pragma = lib.IsAnyCoreLibrary();
-  cls = Class::null();
+intptr_t MethodRecognizer::ResultCidFromPragma(
+    const Object& function_or_field) {
+  // TODO(vm-team): The caller should only call us if the
+  // function_or_field.has_pragma(). If this method turns out to be a
+  // performance problem nonetheless, we could consider adding a cache.
+  auto T = Thread::Current();
+  auto Z = T->zone();
+  auto& klass = Class::Handle(Z);
+  if (function_or_field.IsFunction()) {
+    auto& function = Function::Cast(function_or_field);
+    ASSERT(function.has_pragma());
+    klass = function.Owner();
+  } else {
+    auto& field = Field::Cast(function_or_field);
+    ASSERT(field.has_pragma());
+    klass = field.Owner();
+  }
+  auto& library = Library::Handle(Z, klass.library());
+  const bool can_use_pragma = library.IsAnyCoreLibrary();
   if (can_use_pragma) {
-    Isolate* I = Isolate::Current();
-    auto& option = Object::Handle();
-    if (function.FindPragma(I, Symbols::vm_exact_result_type(), &option)) {
+    auto& option = Object::Handle(Z);
+    if (library.FindPragma(T, function_or_field,
+                           Symbols::vm_exact_result_type(), &option)) {
       if (option.IsType()) {
         return Type::Cast(option).type_class_id();
       } else if (option.IsString()) {
@@ -68,17 +77,13 @@
           }
         }
         if (!parse_failure && library_end > 0) {
-          auto& libraryUri = String::Handle(
-              String::SubString(str, 0, library_end, Heap::kOld));
-          auto& className = String::Handle(
-              String::SubString(str, library_end + 1,
-                                str.Length() - library_end - 1, Heap::kOld));
-
-          Library& lib = Library::Handle(
-              Library::LookupLibrary(Thread::Current(), libraryUri));
-          if (!lib.IsNull()) {
-            Class& klass =
-                Class::Handle(lib.LookupClassAllowPrivate(className));
+          auto& tmp = String::Handle(Z);
+          tmp = String::SubString(str, 0, library_end, Heap::kOld);
+          library = Library::LookupLibrary(Thread::Current(), tmp);
+          if (!library.IsNull()) {
+            tmp = String::SubString(str, library_end + 1,
+                                    str.Length() - library_end - 1, Heap::kOld);
+            klass = library.LookupClassAllowPrivate(tmp);
             if (!klass.IsNull()) {
               return klass.id();
             }
@@ -88,31 +93,35 @@
     }
   }
 
-  // No result-type annotation can be used, so fall back on the table of
-  // recognized methods.
-  switch (function.recognized_kind()) {
-#define DEFINE_CASE(cname, fname, ename, result_type, fingerprint)             \
-  case k##ename: {                                                             \
-    const intptr_t cid = k##result_type##Cid;                                  \
-    if (FLAG_strong && cid != kDynamicCid) {                                   \
-      String& err = String::Handle();                                          \
-      err = function.QualifiedScrubbedName();                                  \
-      err = String::Concat(                                                    \
-          err,                                                                 \
-          String::Handle(String::New(" (MethodRecognizer::k" #ename            \
-                                     ") should be using pragma annotation"     \
-                                     " rather than method recognizer.",        \
-                                     Heap::kOld)),                             \
-          Heap::kOld);                                                         \
-      FATAL(err.ToCString());                                                  \
-    }                                                                          \
-    return cid;                                                                \
+  return kDynamicCid;
+}
+
+bool MethodRecognizer::HasNonNullableResultTypeFromPragma(
+    const Object& function_or_field) {
+  auto T = Thread::Current();
+  auto Z = T->zone();
+  auto& klass = Class::Handle(Z);
+  if (function_or_field.IsFunction()) {
+    auto& function = Function::Cast(function_or_field);
+    ASSERT(function.has_pragma());
+    klass = function.Owner();
+  } else {
+    auto& field = Field::Cast(function_or_field);
+    ASSERT(field.has_pragma());
+    klass = field.Owner();
   }
-    RECOGNIZED_LIST(DEFINE_CASE)
-#undef DEFINE_CASE
-    default:
-      return kDynamicCid;
+  auto& library = Library::Handle(Z, klass.library());
+  const bool can_use_pragma = library.IsAnyCoreLibrary();
+  if (can_use_pragma) {
+    auto& option = Object::Handle(Z);
+    if (library.FindPragma(T, function_or_field,
+                           Symbols::vm_non_nullable_result_type(), &option)) {
+      return true;
+    }
   }
+
+  // If nothing said otherwise, the return type is nullable.
+  return false;
 }
 
 intptr_t MethodRecognizer::MethodKindToReceiverCid(Kind kind) {
@@ -201,8 +210,7 @@
   return kIllegalCid;
 }
 
-#define KIND_TO_STRING(class_name, function_name, enum_name, type, fp)         \
-  #enum_name,
+#define KIND_TO_STRING(class_name, function_name, enum_name, fp) #enum_name,
 static const char* recognized_list_method_name[] = {
     "Unknown", RECOGNIZED_LIST(KIND_TO_STRING)};
 #undef KIND_TO_STRING
@@ -219,7 +227,7 @@
   Libraries(&libs);
   Function& func = Function::Handle();
 
-#define SET_RECOGNIZED_KIND(class_name, function_name, enum_name, type, fp)    \
+#define SET_RECOGNIZED_KIND(class_name, function_name, enum_name, fp)          \
   func = Library::GetFunction(libs, #class_name, #function_name);              \
   if (!func.IsNull()) {                                                        \
     CHECK_FINGERPRINT3(func, class_name, function_name, enum_name, fp);        \
@@ -279,7 +287,7 @@
   GrowableArray<Library*> libs(3);
   Libraries(&libs);
 
-#define ADD_RECOGNIZED_METHOD(class_name, function_name, enum_name, type, fp)  \
+#define ADD_RECOGNIZED_METHOD(class_name, function_name, enum_name, fp)        \
   func = Library::GetFunction(libs, #class_name, #function_name);              \
   methods.Add(func);
 
diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h
index 0c0801c..e901118 100644
--- a/runtime/vm/compiler/method_recognizer.h
+++ b/runtime/vm/compiler/method_recognizer.h
@@ -14,340 +14,310 @@
 // clang-format off
 // (class-name, function-name, recognized enum, result type, fingerprint).
 // When adding a new function add a 0 as fingerprint, build and run to get the
-// correct fingerprint from the mismatch error.
+// correct fingerprint from the mismatch error (or use Library::GetFunction()
+// and print func.SourceFingerprint()).
 #define OTHER_RECOGNIZED_LIST(V)                                               \
-  V(::, identical, ObjectIdentical, Bool, 0x49c6e96a)                          \
-  V(ClassID, getID, ClassIDgetID, Smi, 0x7b18b257)                             \
-  V(Object, Object., ObjectConstructor, Dynamic, 0x681617fe)                   \
-  V(List, ., ListFactory, Dynamic, 0x629f8324)                                 \
-  V(_List, ., ObjectArrayAllocate, Array, 0x2121902f)                          \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, Smi, 0x7041895a)               \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, Smi, 0x336fa3ea)             \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, Smi, 0x231bbe2e)             \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, Smi, 0x0371785f)           \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, Dynamic, 0x65ab3a20)         \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, Dynamic, 0x0cb0fcf6)       \
-  V(_TypedList, _getInt64, ByteArrayBaseGetInt64, Dynamic, 0x7db75d78)         \
-  V(_TypedList, _getUint64, ByteArrayBaseGetUint64, Dynamic, 0x1487cfc6)       \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, Double, 0x6674ea6f)      \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, Double, 0x236c6e7a)      \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, Float32x4,           \
-    0x5c367ffb)                                                                \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, Int32x4, 0x772d1c0f)     \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, Dynamic, 0x12bae36a)           \
-  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, Dynamic, 0x15821cc9)         \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, Dynamic, 0x1f8237fa)         \
-  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, Dynamic, 0x181e5d16)       \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, Dynamic, 0x7ddb9f87)         \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, Dynamic, 0x74094f8d)       \
-  V(_TypedList, _setInt64, ByteArrayBaseSetInt64, Dynamic, 0x4741396e)         \
-  V(_TypedList, _setUint64, ByteArrayBaseSetUint64, Dynamic, 0x3b398ae4)       \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, Dynamic, 0x03db087b)     \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, Dynamic, 0x38a80b0d)     \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, Dynamic, 0x40052c4e) \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, Dynamic, 0x07b89f54)     \
-  V(::, _toClampedUint8, ConvertIntToClampedUint8, Smi, 0x564b0435)            \
-  V(_StringBase, _interpolate, StringBaseInterpolate, Dynamic, 0x01ecb15a)     \
-  V(_IntegerImplementation, toDouble, IntegerToDouble, Double, 0x05da96ed)     \
-  V(_Double, _add, DoubleAdd, Double, 0x2a38277b)                              \
-  V(_Double, _sub, DoubleSub, Double, 0x4f466391)                              \
-  V(_Double, _mul, DoubleMul, Double, 0x175e4f66)                              \
-  V(_Double, _div, DoubleDiv, Double, 0x0854181b)                              \
-  V(::, min, MathMin, Dynamic, 0x32ebc57d)                                     \
-  V(::, max, MathMax, Dynamic, 0x377e8889)                                     \
-  V(::, _doublePow, MathDoublePow, Double, 0x5add0ec1)                         \
-  V(::, _intPow, MathIntPow, Dynamic, 0x11b45569)                              \
-  V(Float32x4, Float32x4., Float32x4Constructor, Float32x4, 0x26ea459b)        \
-  V(Float32x4, Float32x4.zero, Float32x4Zero, Float32x4, 0x16eca604)           \
-  V(Float32x4, Float32x4.splat, Float32x4Splat, Float32x4, 0x694e83e3)         \
-  V(Float32x4, Float32x4.fromInt32x4Bits, Int32x4ToFloat32x4, Float32x4,       \
-    0x2f62ebd3)                                                                \
-  V(Float32x4, Float32x4.fromFloat64x2, Float64x2ToFloat32x4, Float32x4,       \
-    0x50ed6910)                                                                \
-  V(_Float32x4, shuffle, Float32x4Shuffle, Float32x4, 0x7829101f)              \
-  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, Float32x4, 0x4182c06b)        \
-  V(_Float32x4, get:signMask, Float32x4GetSignMask, Dynamic, 0x1d08b351)       \
-  V(_Float32x4, equal, Float32x4Equal, Int32x4, 0x11adb239)                    \
-  V(_Float32x4, greaterThan, Float32x4GreaterThan, Int32x4, 0x48adaf58)        \
-  V(_Float32x4, greaterThanOrEqual, Float32x4GreaterThanOrEqual, Int32x4,      \
-    0x32db94ca)                                                                \
-  V(_Float32x4, lessThan, Float32x4LessThan, Int32x4, 0x425b000c)              \
-  V(_Float32x4, lessThanOrEqual, Float32x4LessThanOrEqual, Int32x4,            \
-    0x0278c2f8)                                                                \
-  V(_Float32x4, notEqual, Float32x4NotEqual, Int32x4, 0x2987cd26)              \
-  V(_Float32x4, min, Float32x4Min, Float32x4, 0x5ed74b6f)                      \
-  V(_Float32x4, max, Float32x4Max, Float32x4, 0x68696442)                      \
-  V(_Float32x4, scale, Float32x4Scale, Float32x4, 0x704e4122)                  \
-  V(_Float32x4, sqrt, Float32x4Sqrt, Float32x4, 0x2c967a6f)                    \
-  V(_Float32x4, reciprocalSqrt, Float32x4ReciprocalSqrt, Float32x4,            \
-    0x6264bfe8)                                                                \
-  V(_Float32x4, reciprocal, Float32x4Reciprocal, Float32x4, 0x3cd7e819)        \
-  V(_Float32x4, unary-, Float32x4Negate, Float32x4, 0x37accb52)                \
-  V(_Float32x4, abs, Float32x4Abs, Float32x4, 0x471cdd87)                      \
-  V(_Float32x4, clamp, Float32x4Clamp, Float32x4, 0x2cb30492)                  \
-  V(_Float32x4, withX, Float32x4WithX, Float32x4, 0x4e336aff)                  \
-  V(_Float32x4, withY, Float32x4WithY, Float32x4, 0x0a72b910)                  \
-  V(_Float32x4, withZ, Float32x4WithZ, Float32x4, 0x31e93658)                  \
-  V(_Float32x4, withW, Float32x4WithW, Float32x4, 0x60ddc105)                  \
-  V(Float64x2, Float64x2., Float64x2Constructor, Float64x2, 0x43054b9f)        \
-  V(Float64x2, Float64x2.zero, Float64x2Zero, Float64x2, 0x4af12f9d)           \
-  V(Float64x2, Float64x2.splat, Float64x2Splat, Float64x2, 0x134edef0)         \
-  V(Float64x2, Float64x2.fromFloat32x4, Float32x4ToFloat64x2, Float64x2,       \
-    0x17d6b5e4)                                                                \
-  V(_Float64x2, get:x, Float64x2GetX, Double, 0x58c09c58)                      \
-  V(_Float64x2, get:y, Float64x2GetY, Double, 0x3cf5e5b8)                      \
-  V(_Float64x2, unary-, Float64x2Negate, Float64x2, 0x415ca009)                \
-  V(_Float64x2, abs, Float64x2Abs, Float64x2, 0x031f9e47)                      \
-  V(_Float64x2, sqrt, Float64x2Sqrt, Float64x2, 0x77f711dd)                    \
-  V(_Float64x2, get:signMask, Float64x2GetSignMask, Dynamic, 0x27deda4b)       \
-  V(_Float64x2, scale, Float64x2Scale, Float64x2, 0x26830a61)                  \
-  V(_Float64x2, withX, Float64x2WithX, Float64x2, 0x1d2bcaf5)                  \
-  V(_Float64x2, withY, Float64x2WithY, Float64x2, 0x383ed6ac)                  \
-  V(_Float64x2, min, Float64x2Min, Float64x2, 0x28d7ddf6)                      \
-  V(_Float64x2, max, Float64x2Max, Float64x2, 0x0bd74e5b)                      \
-  V(Int32x4, Int32x4., Int32x4Constructor, Int32x4, 0x480555a9)                \
-  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, Int32x4, 0x36aa6963)        \
-  V(Int32x4, Int32x4.fromFloat32x4Bits, Float32x4ToInt32x4, Int32x4,           \
-    0x6715388a)                                                                \
-  V(_Int32x4, get:flagX, Int32x4GetFlagX, Bool, 0x56396c82)                    \
-  V(_Int32x4, get:flagY, Int32x4GetFlagY, Bool, 0x44704738)                    \
-  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, Bool, 0x20d6ff37)                    \
-  V(_Int32x4, get:flagW, Int32x4GetFlagW, Bool, 0x5045616a)                    \
-  V(_Int32x4, get:signMask, Int32x4GetSignMask, Dynamic, 0x2c1fb2a3)           \
-  V(_Int32x4, shuffle, Int32x4Shuffle, Int32x4, 0x20bc0b16)                    \
-  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, Int32x4, 0x5c7056e1)              \
-  V(_Int32x4, select, Int32x4Select, Float32x4, 0x6b49654f)                    \
-  V(_Int32x4, withFlagX, Int32x4WithFlagX, Int32x4, 0x0ef58fcf)                \
-  V(_Int32x4, withFlagY, Int32x4WithFlagY, Int32x4, 0x6485a9c4)                \
-  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, Int32x4, 0x267acdfa)                \
-  V(_Int32x4, withFlagW, Int32x4WithFlagW, Int32x4, 0x345ac675)                \
-  V(_HashVMBase, get:_index, LinkedHashMap_getIndex, TypedDataUint32Array,     \
-      0x02477157)                                                              \
-  V(_HashVMBase, set:_index, LinkedHashMap_setIndex, Dynamic, 0x4fc8d5e0)      \
-  V(_HashVMBase, get:_data, LinkedHashMap_getData, Array, 0x2d7a70ac)          \
-  V(_HashVMBase, set:_data, LinkedHashMap_setData, Dynamic, 0x0ec032e8)        \
-  V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, Smi, 0x088599ed)    \
-  V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, Dynamic, 0x5f42ca86)\
-  V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, Smi, 0x32f3b13b)    \
-  V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, Dynamic, 0x7219c45b)\
-  V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, Smi,          \
-    0x558481c2)                                                                \
-  V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, Dynamic,      \
-    0x5aa9888d)                                                                \
-  V(::, _classRangeCheck, ClassRangeCheck, Bool, 0x2ae76b84)                   \
-  V(::, _classRangeCheckNegative, ClassRangeCheckNegated, Bool, 0x5acdfb75)    \
+  V(::, identical, ObjectIdentical, 0x49c6e96a)                                \
+  V(ClassID, getID, ClassIDgetID, 0x7b18b257)                                  \
+  V(Object, Object., ObjectConstructor, 0x681617fe)                            \
+  V(List, ., ListFactory, 0x629f8324)                                          \
+  V(_List, ., ObjectArrayAllocate, 0x2121902f)                                 \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 0x7041895a)                    \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 0x336fa3ea)                  \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 0x231bbe2e)                  \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 0x0371785f)                \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 0x65ab3a20)                  \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 0x0cb0fcf6)                \
+  V(_TypedList, _getInt64, ByteArrayBaseGetInt64, 0x7db75d78)                  \
+  V(_TypedList, _getUint64, ByteArrayBaseGetUint64, 0x1487cfc6)                \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 0x6674ea6f)              \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 0x236c6e7a)              \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 0x5c367ffb)          \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 0x772d1c0f)              \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 0x12bae36a)                    \
+  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 0x15821cc9)                  \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 0x1f8237fa)                  \
+  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 0x181e5d16)                \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 0x7ddb9f87)                  \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 0x74094f8d)                \
+  V(_TypedList, _setInt64, ByteArrayBaseSetInt64, 0x4741396e)                  \
+  V(_TypedList, _setUint64, ByteArrayBaseSetUint64, 0x3b398ae4)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 0x03db087b)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 0x38a80b0d)              \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 0x40052c4e)          \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 0x07b89f54)              \
+  V(::, _toClampedUint8, ConvertIntToClampedUint8, 0x564b0435)                 \
+  V(_StringBase, _interpolate, StringBaseInterpolate, 0x01ecb15a)              \
+  V(_IntegerImplementation, toDouble, IntegerToDouble, 0x05da96ed)             \
+  V(_Double, _add, DoubleAdd, 0x2a38277b)                                      \
+  V(_Double, _sub, DoubleSub, 0x4f466391)                                      \
+  V(_Double, _mul, DoubleMul, 0x175e4f66)                                      \
+  V(_Double, _div, DoubleDiv, 0x0854181b)                                      \
+  V(::, min, MathMin, 0x32ebc57d)                                              \
+  V(::, max, MathMax, 0x377e8889)                                              \
+  V(::, _doublePow, MathDoublePow, 0x5add0ec1)                                 \
+  V(::, _intPow, MathIntPow, 0x11b45569)                                       \
+  V(Float32x4, Float32x4., Float32x4Constructor, 0x26ea459b)                   \
+  V(Float32x4, Float32x4.zero, Float32x4Zero, 0x16eca604)                      \
+  V(Float32x4, Float32x4.splat, Float32x4Splat, 0x694e83e3)                    \
+  V(Float32x4, Float32x4.fromInt32x4Bits, Int32x4ToFloat32x4, 0x2f62ebd3)      \
+  V(Float32x4, Float32x4.fromFloat64x2, Float64x2ToFloat32x4, 0x50ed6910)      \
+  V(_Float32x4, shuffle, Float32x4Shuffle, 0x7829101f)                         \
+  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 0x4182c06b)                   \
+  V(_Float32x4, get:signMask, Float32x4GetSignMask, 0x1d08b351)                \
+  V(_Float32x4, equal, Float32x4Equal, 0x11adb239)                             \
+  V(_Float32x4, greaterThan, Float32x4GreaterThan, 0x48adaf58)                 \
+  V(_Float32x4, greaterThanOrEqual, Float32x4GreaterThanOrEqual, 0x32db94ca)   \
+  V(_Float32x4, lessThan, Float32x4LessThan, 0x425b000c)                       \
+  V(_Float32x4, lessThanOrEqual, Float32x4LessThanOrEqual, 0x0278c2f8)         \
+  V(_Float32x4, notEqual, Float32x4NotEqual, 0x2987cd26)                       \
+  V(_Float32x4, min, Float32x4Min, 0x5ed74b6f)                                 \
+  V(_Float32x4, max, Float32x4Max, 0x68696442)                                 \
+  V(_Float32x4, scale, Float32x4Scale, 0x704e4122)                             \
+  V(_Float32x4, sqrt, Float32x4Sqrt, 0x2c967a6f)                               \
+  V(_Float32x4, reciprocalSqrt, Float32x4ReciprocalSqrt, 0x6264bfe8)           \
+  V(_Float32x4, reciprocal, Float32x4Reciprocal, 0x3cd7e819)                   \
+  V(_Float32x4, unary-, Float32x4Negate, 0x37accb52)                           \
+  V(_Float32x4, abs, Float32x4Abs, 0x471cdd87)                                 \
+  V(_Float32x4, clamp, Float32x4Clamp, 0x2cb30492)                             \
+  V(_Float32x4, withX, Float32x4WithX, 0x4e336aff)                             \
+  V(_Float32x4, withY, Float32x4WithY, 0x0a72b910)                             \
+  V(_Float32x4, withZ, Float32x4WithZ, 0x31e93658)                             \
+  V(_Float32x4, withW, Float32x4WithW, 0x60ddc105)                             \
+  V(Float64x2, Float64x2., Float64x2Constructor, 0x43054b9f)                   \
+  V(Float64x2, Float64x2.zero, Float64x2Zero, 0x4af12f9d)                      \
+  V(Float64x2, Float64x2.splat, Float64x2Splat, 0x134edef0)                    \
+  V(Float64x2, Float64x2.fromFloat32x4, Float32x4ToFloat64x2, 0x17d6b5e4)      \
+  V(_Float64x2, get:x, Float64x2GetX, 0x58c09c58)                              \
+  V(_Float64x2, get:y, Float64x2GetY, 0x3cf5e5b8)                              \
+  V(_Float64x2, unary-, Float64x2Negate, 0x415ca009)                           \
+  V(_Float64x2, abs, Float64x2Abs, 0x031f9e47)                                 \
+  V(_Float64x2, sqrt, Float64x2Sqrt, 0x77f711dd)                               \
+  V(_Float64x2, get:signMask, Float64x2GetSignMask, 0x27deda4b)                \
+  V(_Float64x2, scale, Float64x2Scale, 0x26830a61)                             \
+  V(_Float64x2, withX, Float64x2WithX, 0x1d2bcaf5)                             \
+  V(_Float64x2, withY, Float64x2WithY, 0x383ed6ac)                             \
+  V(_Float64x2, min, Float64x2Min,  0x28d7ddf6)                                \
+  V(_Float64x2, max, Float64x2Max,  0x0bd74e5b)                                \
+  V(Int32x4, Int32x4., Int32x4Constructor, 0x480555a9)                         \
+  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 0x36aa6963)                 \
+  V(Int32x4, Int32x4.fromFloat32x4Bits, Float32x4ToInt32x4, 0x6715388a)        \
+  V(_Int32x4, get:flagX, Int32x4GetFlagX, 0x56396c82)                          \
+  V(_Int32x4, get:flagY, Int32x4GetFlagY, 0x44704738)                          \
+  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 0x20d6ff37)                          \
+  V(_Int32x4, get:flagW, Int32x4GetFlagW, 0x5045616a)                          \
+  V(_Int32x4, get:signMask, Int32x4GetSignMask, 0x2c1fb2a3)                    \
+  V(_Int32x4, shuffle, Int32x4Shuffle, 0x20bc0b16)                             \
+  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 0x5c7056e1)                       \
+  V(_Int32x4, select, Int32x4Select, 0x6b49654f)                               \
+  V(_Int32x4, withFlagX, Int32x4WithFlagX, 0x0ef58fcf)                         \
+  V(_Int32x4, withFlagY, Int32x4WithFlagY, 0x6485a9c4)                         \
+  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 0x267acdfa)                         \
+  V(_Int32x4, withFlagW, Int32x4WithFlagW, 0x345ac675)                         \
+  V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 0x02477157)               \
+  V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 0x4fc8d5e0)               \
+  V(_HashVMBase, get:_data, LinkedHashMap_getData, 0x2d7a70ac)                 \
+  V(_HashVMBase, set:_data, LinkedHashMap_setData, 0x0ec032e8)                 \
+  V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, 0x088599ed)         \
+  V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, 0x5f42ca86)         \
+  V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, 0x32f3b13b)         \
+  V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, 0x7219c45b)         \
+  V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, 0x558481c2)   \
+  V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, 0x5aa9888d)   \
+  V(::, _classRangeCheck, ClassRangeCheck, 0x2ae76b84)                         \
+  V(::, _classRangeCheckNegative, ClassRangeCheckNegated, 0x5acdfb75)          \
 
 
 // List of intrinsics:
 // (class-name, function-name, intrinsification method, fingerprint).
 #define CORE_LIB_INTRINSIC_LIST(V)                                             \
-  V(_Smi, ~, Smi_bitNegate, Smi, 0x67299f4f)                                   \
-  V(_Smi, get:bitLength, Smi_bitLength, Smi, 0x25b3cb0a)                       \
-  V(_Smi, _bitAndFromSmi, Smi_bitAndFromSmi, Smi, 0x562d5047)                  \
-  V(_BigIntImpl, _lsh, Bigint_lsh, Dynamic, 0x5b6cfc8b)                        \
-  V(_BigIntImpl, _rsh, Bigint_rsh, Dynamic, 0x6ff14a49)                        \
-  V(_BigIntImpl, _absAdd, Bigint_absAdd, Dynamic, 0x5bf14238)                  \
-  V(_BigIntImpl, _absSub, Bigint_absSub, Dynamic, 0x1de5bd32)                  \
-  V(_BigIntImpl, _mulAdd, Bigint_mulAdd, Smi, 0x6f277966)                      \
-  V(_BigIntImpl, _sqrAdd, Bigint_sqrAdd, Smi, 0x68e4c8ea)                      \
-  V(_BigIntImpl, _estimateQuotientDigit, Bigint_estimateQuotientDigit, Smi,    \
+  V(_Smi, ~, Smi_bitNegate, 0x67299f4f)                                        \
+  V(_Smi, get:bitLength, Smi_bitLength, 0x25b3cb0a)                            \
+  V(_Smi, _bitAndFromSmi, Smi_bitAndFromSmi, 0x562d5047)                       \
+  V(_BigIntImpl, _lsh, Bigint_lsh, 0x5b6cfc8b)                                 \
+  V(_BigIntImpl, _rsh, Bigint_rsh, 0x6ff14a49)                                 \
+  V(_BigIntImpl, _absAdd, Bigint_absAdd, 0x5bf14238)                           \
+  V(_BigIntImpl, _absSub, Bigint_absSub, 0x1de5bd32)                           \
+  V(_BigIntImpl, _mulAdd, Bigint_mulAdd, 0x6f277966)                           \
+  V(_BigIntImpl, _sqrAdd, Bigint_sqrAdd, 0x68e4c8ea)                           \
+  V(_BigIntImpl, _estimateQuotientDigit, Bigint_estimateQuotientDigit,         \
     0x35456d91)                                                                \
-  V(_BigIntMontgomeryReduction, _mulMod, Montgomery_mulMod, Smi, 0x0f7b0375)   \
-  V(_Double, >, Double_greaterThan, Bool, 0x4f1375a3)                          \
-  V(_Double, >=, Double_greaterEqualThan, Bool, 0x4260c184)                    \
-  V(_Double, <, Double_lessThan, Bool, 0x365d1eba)                             \
-  V(_Double, <=, Double_lessEqualThan, Bool, 0x74b5eb64)                       \
-  V(_Double, ==, Double_equal, Bool, 0x613492fc)                               \
-  V(_Double, +, Double_add, Double, 0x53994370)                                \
-  V(_Double, -, Double_sub, Double, 0x3b69d466)                                \
-  V(_Double, *, Double_mul, Double, 0x2bb9bd5d)                                \
-  V(_Double, /, Double_div, Double, 0x483eee28)                                \
-  V(_Double, get:hashCode, Double_hashCode, Dynamic, 0x702b77b7)               \
-  V(_Double, get:_identityHashCode, Double_identityHash, Dynamic, 0x7bda5549)  \
-  V(_Double, get:isNaN, Double_getIsNaN, Bool, 0x0af9d4a9)                     \
-  V(_Double, get:isInfinite, Double_getIsInfinite, Bool, 0x0f7acb47)           \
-  V(_Double, get:isNegative, Double_getIsNegative, Bool, 0x3a59e7f4)           \
-  V(_Double, _mulFromInteger, Double_mulFromInteger, Double, 0x2017fcf6)       \
-  V(_Double, .fromInteger, DoubleFromInteger, Double, 0x6d234f4b)              \
-  V(_List, _setIndexed, ObjectArraySetIndexedUnchecked, Dynamic, 0x50d64c75)   \
-  V(_List, []=, ObjectArraySetIndexed, Dynamic, 0x16b3d2b0)                    \
-  V(_GrowableList, .withData, GrowableArray_Allocate, GrowableObjectArray,     \
-    0x28b2138e)                                                                \
-  V(_GrowableList, add, GrowableArray_add, Dynamic, 0x40b490b8)                \
-  V(_RegExp, _ExecuteMatch, RegExp_ExecuteMatch, Dynamic, 0x380184b1)          \
-  V(_RegExp, _ExecuteMatchSticky, RegExp_ExecuteMatchSticky, Dynamic,          \
-    0x79b8f955)                                                                \
-  V(Object, ==, ObjectEquals, Bool, 0x7b32a55a)                                \
-  V(Object, get:runtimeType, ObjectRuntimeType, Type, 0x00e8ab29)              \
-  V(Object, _haveSameRuntimeType, ObjectHaveSameRuntimeType, Bool, 0x4dc50799) \
-  V(_StringBase, get:hashCode, String_getHashCode, Smi, 0x78c3d446)            \
-  V(_StringBase, get:_identityHashCode, String_identityHash, Smi, 0x0472b1d8)  \
-  V(_StringBase, get:isEmpty, StringBaseIsEmpty, Bool, 0x4a8b29c8)             \
-  V(_StringBase, _substringMatches, StringBaseSubstringMatches, Bool,          \
-    0x46de4f10)                                                                \
-  V(_StringBase, [], StringBaseCharAt, Dynamic, 0x7cbb8603)                    \
-  V(_OneByteString, get:hashCode, OneByteString_getHashCode, Smi, 0x78c3d446)  \
+  V(_BigIntMontgomeryReduction, _mulMod, Montgomery_mulMod, 0x0f7b0375)        \
+  V(_Double, >, Double_greaterThan, 0x4f1375a3)                                \
+  V(_Double, >=, Double_greaterEqualThan, 0x4260c184)                          \
+  V(_Double, <, Double_lessThan, 0x365d1eba)                                   \
+  V(_Double, <=, Double_lessEqualThan, 0x74b5eb64)                             \
+  V(_Double, ==, Double_equal, 0x613492fc)                                     \
+  V(_Double, +, Double_add, 0x53994370)                                        \
+  V(_Double, -, Double_sub, 0x3b69d466)                                        \
+  V(_Double, *, Double_mul, 0x2bb9bd5d)                                        \
+  V(_Double, /, Double_div, 0x483eee28)                                        \
+  V(_Double, get:hashCode, Double_hashCode, 0x702b77b7)                        \
+  V(_Double, get:_identityHashCode, Double_identityHash, 0x7bda5549)           \
+  V(_Double, get:isNaN, Double_getIsNaN, 0x0af9d4a9)                           \
+  V(_Double, get:isInfinite, Double_getIsInfinite, 0x0f7acb47)                 \
+  V(_Double, get:isNegative, Double_getIsNegative, 0x3a59e7f4)                 \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, 0x2017fcf6)               \
+  V(_Double, .fromInteger, DoubleFromInteger, 0x6d234f4b)                      \
+  V(_GrowableList, .withData, GrowableArray_Allocate, 0x28b2138e)              \
+  V(_RegExp, _ExecuteMatch, RegExp_ExecuteMatch, 0x380184b1)                   \
+  V(_RegExp, _ExecuteMatchSticky, RegExp_ExecuteMatchSticky, 0x79b8f955)       \
+  V(Object, ==, ObjectEquals, 0x7b32a55a)                                      \
+  V(Object, get:runtimeType, ObjectRuntimeType, 0x00e8ab29)                    \
+  V(Object, _haveSameRuntimeType, ObjectHaveSameRuntimeType, 0x4dc50799)       \
+  V(_StringBase, get:hashCode, String_getHashCode, 0x78c3d446)                 \
+  V(_StringBase, get:_identityHashCode, String_identityHash, 0x0472b1d8)       \
+  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 0x4a8b29c8)                   \
+  V(_StringBase, _substringMatches, StringBaseSubstringMatches, 0x46de4f10)    \
+  V(_StringBase, [], StringBaseCharAt, 0x7cbb8603)                             \
+  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 0x78c3d446)       \
   V(_OneByteString, _substringUncheckedNative,                                 \
-    OneByteString_substringUnchecked, OneByteString, 0x3538ad86)               \
-  V(_OneByteString, _setAt, OneByteStringSetAt, Dynamic, 0x11ffddd1)           \
-  V(_OneByteString, _allocate, OneByteString_allocate, OneByteString,          \
-    0x74933376)                                                                \
-  V(_OneByteString, ==, OneByteString_equality, Bool, 0x4eda197e)              \
-  V(_TwoByteString, ==, TwoByteString_equality, Bool, 0x4eda197e)              \
-  V(_Type, get:hashCode, Type_getHashCode, Smi, 0x18d1523f)                    \
-  V(::, _getHash, Object_getHash, Smi, 0x2827856d)                             \
-  V(::, _setHash, Object_setHash, Dynamic, 0x690faebd)                         \
+    OneByteString_substringUnchecked,  0x3538ad86)                             \
+  V(_OneByteString, _setAt, OneByteStringSetAt, 0x11ffddd1)                    \
+  V(_OneByteString, _allocate, OneByteString_allocate,          0x74933376)    \
+  V(_OneByteString, ==, OneByteString_equality, 0x4eda197e)                    \
+  V(_TwoByteString, ==, TwoByteString_equality, 0x4eda197e)                    \
+  V(_Type, get:hashCode, Type_getHashCode, 0x18d1523f)                         \
+  V(::, _getHash, Object_getHash, 0x2827856d)                                  \
+  V(::, _setHash, Object_setHash, 0x690faebd)                                  \
 
 
 #define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
   V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger,           \
-    Dynamic, 0x6a10c54a)                                                       \
-  V(_IntegerImplementation, +, Integer_add, Dynamic, 0x43d53af7)               \
-  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, Dynamic,  \
+    0x6a10c54a)                                                                \
+  V(_IntegerImplementation, +, Integer_add, 0x43d53af7)                        \
+  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger,           \
     0x3fa4b1ed)                                                                \
-  V(_IntegerImplementation, -, Integer_sub, Dynamic, 0x2dc22e03)               \
+  V(_IntegerImplementation, -, Integer_sub, 0x2dc22e03)                        \
   V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger,           \
-    Dynamic, 0x3216e299)                                                       \
-  V(_IntegerImplementation, *, Integer_mul, Dynamic, 0x4e7a1c24)               \
+    0x3216e299)                                                                \
+  V(_IntegerImplementation, *, Integer_mul, 0x4e7a1c24)                        \
   V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger,     \
-    Dynamic, 0x6348b974)                                                       \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, Dynamic, 0x4efb2d39)      \
-  V(_IntegerImplementation, unary-, Integer_negate, Dynamic, 0x428bf6fa)       \
+     0x6348b974)                                                               \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 0x4efb2d39)               \
+  V(_IntegerImplementation, unary-, Integer_negate, 0x428bf6fa)                \
   V(_IntegerImplementation, _bitAndFromInteger, Integer_bitAndFromInteger,     \
-    Dynamic, 0x395b1678)                                                       \
-  V(_IntegerImplementation, &, Integer_bitAnd, Dynamic, 0x5ab35f30)            \
+    0x395b1678)                                                                \
+  V(_IntegerImplementation, &, Integer_bitAnd, 0x5ab35f30)                     \
   V(_IntegerImplementation, _bitOrFromInteger, Integer_bitOrFromInteger,       \
-    Dynamic, 0x6a36b395)                                                       \
-  V(_IntegerImplementation, |, Integer_bitOr, Dynamic, 0x267fa107)             \
+    0x6a36b395)                                                                \
+  V(_IntegerImplementation, |, Integer_bitOr, 0x267fa107)                      \
   V(_IntegerImplementation, _bitXorFromInteger, Integer_bitXorFromInteger,     \
-    Dynamic, 0x72da93f0)                                                       \
-  V(_IntegerImplementation, ^, Integer_bitXor, Dynamic, 0x0c7b0230)            \
+    0x72da93f0)                                                                \
+  V(_IntegerImplementation, ^, Integer_bitXor, 0x0c7b0230)                     \
   V(_IntegerImplementation, _greaterThanFromInteger,                           \
-    Integer_greaterThanFromInt, Bool, 0x4a50ed58)                              \
-  V(_IntegerImplementation, >, Integer_greaterThan, Bool, 0x6599a6e1)          \
-  V(_IntegerImplementation, ==, Integer_equal, Bool, 0x58abc487)               \
-  V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger, Bool,     \
+    Integer_greaterThanFromInt, 0x4a50ed58)                                    \
+  V(_IntegerImplementation, >, Integer_greaterThan, 0x6599a6e1)                \
+  V(_IntegerImplementation, ==, Integer_equal, 0x58abc487)                     \
+  V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger,           \
     0x063be842)                                                                \
-  V(_IntegerImplementation, <, Integer_lessThan, Bool, 0x365d1eba)             \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, Bool, 0x74b5eb64)       \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, Bool, 0x4260c184)    \
-  V(_IntegerImplementation, <<, Integer_shl, Dynamic, 0x371c45fa)              \
-  V(_IntegerImplementation, >>, Integer_sar, Dynamic, 0x2b630578)              \
-  V(_Double, toInt, DoubleToInteger, Dynamic, 0x26ef344b)                      \
+  V(_IntegerImplementation, <, Integer_lessThan, 0x365d1eba)                   \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, 0x74b5eb64)             \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 0x4260c184)          \
+  V(_IntegerImplementation, <<, Integer_shl, 0x371c45fa)                       \
+  V(_IntegerImplementation, >>, Integer_sar, 0x2b630578)                       \
+  V(_Double, toInt, DoubleToInteger, 0x26ef344b)                               \
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
-  V(::, sqrt, MathSqrt, Double, 0x70482cf3)                                    \
-  V(_Random, _nextState, Random_nextState, Dynamic, 0x2842c4d5)                \
+  V(::, sqrt, MathSqrt, 0x70482cf3)                                            \
+  V(_Random, _nextState, Random_nextState, 0x2842c4d5)                         \
 
 #define GRAPH_MATH_LIB_INTRINSIC_LIST(V)                                       \
-  V(::, sin, MathSin, Double, 0x6b7bd98c)                                      \
-  V(::, cos, MathCos, Double, 0x459bf5fe)                                      \
-  V(::, tan, MathTan, Double, 0x3bcd772a)                                      \
-  V(::, asin, MathAsin, Double, 0x2ecc2fcd)                                    \
-  V(::, acos, MathAcos, Double, 0x08cf2212)                                    \
-  V(::, atan, MathAtan, Double, 0x1e2731d5)                                    \
-  V(::, atan2, MathAtan2, Double, 0x39f1fa41)                                  \
+  V(::, sin, MathSin, 0x6b7bd98c)                                              \
+  V(::, cos, MathCos, 0x459bf5fe)                                              \
+  V(::, tan, MathTan, 0x3bcd772a)                                              \
+  V(::, asin, MathAsin, 0x2ecc2fcd)                                            \
+  V(::, acos, MathAcos, 0x08cf2212)                                            \
+  V(::, atan, MathAtan, 0x1e2731d5)                                            \
+  V(::, atan2, MathAtan2, 0x39f1fa41)                                          \
 
 #define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
-  V(Int8List, ., TypedData_Int8Array_factory, TypedDataInt8Array, 0x7e39a3a1)  \
-  V(Uint8List, ., TypedData_Uint8Array_factory, TypedDataUint8Array,           \
-    0x3a79adf7)                                                                \
-  V(Uint8ClampedList, ., TypedData_Uint8ClampedArray_factory,                  \
-    TypedDataUint8ClampedArray, 0x67f38395)                                    \
-  V(Int16List, ., TypedData_Int16Array_factory, TypedDataInt16Array,           \
-    0x6477bda8)                                                                \
-  V(Uint16List, ., TypedData_Uint16Array_factory, TypedDataUint16Array,        \
-    0x5707c5a2)                                                                \
-  V(Int32List, ., TypedData_Int32Array_factory, TypedDataInt32Array,           \
-    0x2b96ec0e)                                                                \
-  V(Uint32List, ., TypedData_Uint32Array_factory,                              \
-    TypedDataUint32Array, 0x0c1c0d62)                                          \
-  V(Int64List, ., TypedData_Int64Array_factory,                                \
-    TypedDataInt64Array, 0x279ab485)                                           \
-  V(Uint64List, ., TypedData_Uint64Array_factory,                              \
-    TypedDataUint64Array, 0x7bcb89c2)                                          \
-  V(Float32List, ., TypedData_Float32Array_factory,                            \
-    TypedDataFloat32Array, 0x43506c09)                                         \
-  V(Float64List, ., TypedData_Float64Array_factory,                            \
-    TypedDataFloat64Array, 0x1fde3eaf)                                         \
-  V(Float32x4List, ., TypedData_Float32x4Array_factory,                        \
-    TypedDataFloat32x4Array, 0x4a4030d6)                                       \
-  V(Int32x4List, ., TypedData_Int32x4Array_factory,                            \
-    TypedDataInt32x4Array, 0x6dd02406)                                         \
-  V(Float64x2List, ., TypedData_Float64x2Array_factory,                        \
-    TypedDataFloat64x2Array, 0x688e4e97)                                       \
+  V(Int8List, ., TypedData_Int8Array_factory, 0x7e39a3a1)                      \
+  V(Uint8List, ., TypedData_Uint8Array_factory, 0x3a79adf7)                    \
+  V(Uint8ClampedList, ., TypedData_Uint8ClampedArray_factory, 0x67f38395)      \
+  V(Int16List, ., TypedData_Int16Array_factory, 0x6477bda8)                    \
+  V(Uint16List, ., TypedData_Uint16Array_factory, 0x5707c5a2)                  \
+  V(Int32List, ., TypedData_Int32Array_factory, 0x2b96ec0e)                    \
+  V(Uint32List, ., TypedData_Uint32Array_factory, 0x0c1c0d62)                  \
+  V(Int64List, ., TypedData_Int64Array_factory, 0x279ab485)                    \
+  V(Uint64List, ., TypedData_Uint64Array_factory, 0x7bcb89c2)                  \
+  V(Float32List, ., TypedData_Float32Array_factory, 0x43506c09)                \
+  V(Float64List, ., TypedData_Float64Array_factory, 0x1fde3eaf)                \
+  V(Float32x4List, ., TypedData_Float32x4Array_factory, 0x4a4030d6)            \
+  V(Int32x4List, ., TypedData_Int32x4Array_factory, 0x6dd02406)                \
+  V(Float64x2List, ., TypedData_Float64x2Array_factory, 0x688e4e97)            \
 
 #define GRAPH_TYPED_DATA_INTRINSICS_LIST(V)                                    \
-  V(_Int8List, [], Int8ArrayGetIndexed, Smi, 0x49767a2c)                       \
-  V(_Int8List, []=, Int8ArraySetIndexed, Dynamic, 0x24f42cd0)                  \
-  V(_Uint8List, [], Uint8ArrayGetIndexed, Smi, 0x088d86d4)                     \
-  V(_Uint8List, []=, Uint8ArraySetIndexed, Dynamic, 0x12639541)                \
-  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, Smi, 0x088d86d4)    \
-  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, Dynamic,           \
-    0x12639541)                                                                \
-  V(_Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, Smi, 0x088d86d4)       \
-  V(_Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, Dynamic, 0x6790dba1)  \
+  V(_Int8List, [], Int8ArrayGetIndexed, 0x49767a2c)                            \
+  V(_Int8List, []=, Int8ArraySetIndexed, 0x24f42cd0)                           \
+  V(_Uint8List, [], Uint8ArrayGetIndexed, 0x088d86d4)                          \
+  V(_Uint8List, []=, Uint8ArraySetIndexed, 0x12639541)                         \
+  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 0x088d86d4)         \
+  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 0x12639541)        \
+  V(_Uint8ClampedList, [], Uint8ClampedArrayGetIndexed, 0x088d86d4)            \
+  V(_Uint8ClampedList, []=, Uint8ClampedArraySetIndexed, 0x6790dba1)           \
   V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
-    Smi, 0x088d86d4)                                                           \
+    0x088d86d4)                                                                \
   V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
-    Dynamic, 0x6790dba1)                                                       \
-  V(_Int16List, [], Int16ArrayGetIndexed, Smi, 0x5ec64948)                     \
-  V(_Int16List, []=, Int16ArraySetIndexed, Dynamic, 0x0e4e8221)                \
-  V(_Uint16List, [], Uint16ArrayGetIndexed, Smi, 0x5f49d093)                   \
-  V(_Uint16List, []=, Uint16ArraySetIndexed, Dynamic, 0x2efbc90f)              \
-  V(_Int32List, [], Int32ArrayGetIndexed, Dynamic, 0x4bc0d3dd)                 \
-  V(_Int32List, []=, Int32ArraySetIndexed, Dynamic, 0x1adf9823)                \
-  V(_Uint32List, [], Uint32ArrayGetIndexed, Dynamic, 0x188658ce)               \
-  V(_Uint32List, []=, Uint32ArraySetIndexed, Dynamic, 0x01f51a79)              \
-  V(_Int64List, [], Int64ArrayGetIndexed, Dynamic, 0x51eafb97)                 \
-  V(_Int64List, []=, Int64ArraySetIndexed, Dynamic, 0x376181fb)                \
-  V(_Uint64List, [], Uint64ArrayGetIndexed, Dynamic, 0x4b2a1ba2)               \
-  V(_Uint64List, []=, Uint64ArraySetIndexed, Dynamic, 0x5f881bd4)              \
-  V(_Float64List, [], Float64ArrayGetIndexed, Double, 0x0a714486)              \
-  V(_Float64List, []=, Float64ArraySetIndexed, Dynamic, 0x04937367)            \
-  V(_Float32List, [], Float32ArrayGetIndexed, Double, 0x5ade301f)              \
-  V(_Float32List, []=, Float32ArraySetIndexed, Dynamic, 0x0d5c2e2b)            \
-  V(_Float32x4List, [], Float32x4ArrayGetIndexed, Float32x4, 0x128cddeb)       \
-  V(_Float32x4List, []=, Float32x4ArraySetIndexed, Dynamic, 0x7ad55c72)        \
-  V(_Int32x4List, [], Int32x4ArrayGetIndexed, Int32x4, 0x4b78af9c)             \
-  V(_Int32x4List, []=, Int32x4ArraySetIndexed, Dynamic, 0x31453dab)            \
-  V(_Float64x2List, [], Float64x2ArrayGetIndexed, Float64x2, 0x644a0be1)       \
-  V(_Float64x2List, []=, Float64x2ArraySetIndexed, Dynamic, 0x6b836b0b)        \
-  V(_TypedList, get:length, TypedDataLength, Smi, 0x2091c4d8)                  \
-  V(_Float32x4, get:x, Float32x4ShuffleX, Double, 0x63d1a9fd)                  \
-  V(_Float32x4, get:y, Float32x4ShuffleY, Double, 0x203523d9)                  \
-  V(_Float32x4, get:z, Float32x4ShuffleZ, Double, 0x13190678)                  \
-  V(_Float32x4, get:w, Float32x4ShuffleW, Double, 0x698a38de)                  \
-  V(_Float32x4, *, Float32x4Mul, Float32x4, 0x5dec68b2)                        \
-  V(_Float32x4, -, Float32x4Sub, Float32x4, 0x3ea14461)                        \
-  V(_Float32x4, +, Float32x4Add, Float32x4, 0x7ffcf301)                        \
+    0x6790dba1)                                                                \
+  V(_Int16List, [], Int16ArrayGetIndexed, 0x5ec64948)                          \
+  V(_Int16List, []=, Int16ArraySetIndexed, 0x0e4e8221)                         \
+  V(_Uint16List, [], Uint16ArrayGetIndexed, 0x5f49d093)                        \
+  V(_Uint16List, []=, Uint16ArraySetIndexed, 0x2efbc90f)                       \
+  V(_Int32List, [], Int32ArrayGetIndexed, 0x4bc0d3dd)                          \
+  V(_Int32List, []=, Int32ArraySetIndexed, 0x1adf9823)                         \
+  V(_Uint32List, [], Uint32ArrayGetIndexed, 0x188658ce)                        \
+  V(_Uint32List, []=, Uint32ArraySetIndexed, 0x01f51a79)                       \
+  V(_Int64List, [], Int64ArrayGetIndexed, 0x51eafb97)                          \
+  V(_Int64List, []=, Int64ArraySetIndexed, 0x376181fb)                         \
+  V(_Uint64List, [], Uint64ArrayGetIndexed, 0x4b2a1ba2)                        \
+  V(_Uint64List, []=, Uint64ArraySetIndexed, 0x5f881bd4)                       \
+  V(_Float64List, [], Float64ArrayGetIndexed, 0x0a714486)                      \
+  V(_Float64List, []=, Float64ArraySetIndexed, 0x04937367)                     \
+  V(_Float32List, [], Float32ArrayGetIndexed, 0x5ade301f)                      \
+  V(_Float32List, []=, Float32ArraySetIndexed, 0x0d5c2e2b)                     \
+  V(_Float32x4List, [], Float32x4ArrayGetIndexed, 0x128cddeb)                  \
+  V(_Float32x4List, []=, Float32x4ArraySetIndexed, 0x7ad55c72)                 \
+  V(_Int32x4List, [], Int32x4ArrayGetIndexed, 0x4b78af9c)                      \
+  V(_Int32x4List, []=, Int32x4ArraySetIndexed, 0x31453dab)                     \
+  V(_Float64x2List, [], Float64x2ArrayGetIndexed, 0x644a0be1)                  \
+  V(_Float64x2List, []=, Float64x2ArraySetIndexed, 0x6b836b0b)                 \
+  V(_TypedList, get:length, TypedDataLength, 0x2091c4d8)                       \
+  V(_Float32x4, get:x, Float32x4ShuffleX, 0x63d1a9fd)                          \
+  V(_Float32x4, get:y, Float32x4ShuffleY, 0x203523d9)                          \
+  V(_Float32x4, get:z, Float32x4ShuffleZ, 0x13190678)                          \
+  V(_Float32x4, get:w, Float32x4ShuffleW, 0x698a38de)                          \
+  V(_Float32x4, *, Float32x4Mul, 0x5dec68b2)                                   \
+  V(_Float32x4, -, Float32x4Sub, 0x3ea14461)                                   \
+  V(_Float32x4, +, Float32x4Add, 0x7ffcf301)                                   \
 
 #define GRAPH_CORE_INTRINSICS_LIST(V)                                          \
-  V(_List, get:length, ObjectArrayLength, Smi, 0x25952390)                     \
-  V(_List, [], ObjectArrayGetIndexed, Dynamic, 0x653da02e)                     \
-  V(_ImmutableList, get:length, ImmutableArrayLength, Smi, 0x25952390)         \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, Dynamic, 0x653da02e)         \
-  V(_GrowableList, get:length, GrowableArrayLength, Smi, 0x18dd86b4)           \
-  V(_GrowableList, get:_capacity, GrowableArrayCapacity, Smi, 0x2e04be60)      \
-  V(_GrowableList, _setData, GrowableArraySetData, Dynamic, 0x3dbea348)        \
-  V(_GrowableList, _setLength, GrowableArraySetLength, Dynamic, 0x753e55da)    \
-  V(_GrowableList, [], GrowableArrayGetIndexed, Dynamic, 0x446fe1f0)           \
-  V(_GrowableList, []=, GrowableArraySetIndexed, Dynamic, 0x40a462ec)          \
-  V(_GrowableList, _setIndexed, GrowableArraySetIndexedUnchecked, Dynamic,     \
-    0x297083df)                                                                \
-  V(_StringBase, get:length, StringBaseLength, Smi, 0x2a2d03d1)                \
-  V(_OneByteString, codeUnitAt, OneByteStringCodeUnitAt, Smi, 0x55a0a1f3)      \
-  V(_TwoByteString, codeUnitAt, TwoByteStringCodeUnitAt, Smi, 0x55a0a1f3)      \
+  V(_List, get:length, ObjectArrayLength, 0x25952390)                          \
+  V(_List, [], ObjectArrayGetIndexed, 0x653da02e)                              \
+  V(_List, []=, ObjectArraySetIndexed, 0x16b3d2b0)                             \
+  V(_List, _setIndexed, ObjectArraySetIndexedUnchecked, 0x50d64c75)            \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 0x25952390)              \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 0x653da02e)                  \
+  V(_GrowableList, get:length, GrowableArrayLength, 0x18dd86b4)                \
+  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 0x2e04be60)           \
+  V(_GrowableList, _setData, GrowableArraySetData, 0x3dbea348)                 \
+  V(_GrowableList, _setLength, GrowableArraySetLength, 0x753e55da)             \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 0x446fe1f0)                    \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 0x40a462ec)                   \
+  V(_GrowableList, _setIndexed, GrowableArraySetIndexedUnchecked, 0x297083df)  \
+  V(_StringBase, get:length, StringBaseLength, 0x2a2d03d1)                     \
+  V(_OneByteString, codeUnitAt, OneByteStringCodeUnitAt, 0x55a0a1f3)           \
+  V(_TwoByteString, codeUnitAt, TwoByteStringCodeUnitAt, 0x55a0a1f3)           \
   V(_ExternalOneByteString, codeUnitAt, ExternalOneByteStringCodeUnitAt,       \
-    Smi, 0x55a0a1f3)                                                           \
+    0x55a0a1f3)                                                                \
   V(_ExternalTwoByteString, codeUnitAt, ExternalTwoByteStringCodeUnitAt,       \
-    Smi, 0x55a0a1f3)                                                           \
-  V(_Double, unary-, DoubleFlipSignBit, Double, 0x6db4674f)                    \
-  V(_Double, truncateToDouble, DoubleTruncate, Double, 0x2f27e5d3)             \
-  V(_Double, roundToDouble, DoubleRound, Double, 0x2f89c512)                   \
-  V(_Double, floorToDouble, DoubleFloor, Double, 0x6aa87a5f)                   \
-  V(_Double, ceilToDouble, DoubleCeil, Double, 0x1b045e9e)                     \
-  V(_Double, _modulo, DoubleMod, Double, 0x5b8ceed7)
+    0x55a0a1f3)                                                                \
+  V(_Double, unary-, DoubleFlipSignBit, 0x6db4674f)                            \
+  V(_Double, truncateToDouble, DoubleTruncate, 0x2f27e5d3)                     \
+  V(_Double, roundToDouble, DoubleRound, 0x2f89c512)                           \
+  V(_Double, floorToDouble, DoubleFloor, 0x6aa87a5f)                           \
+  V(_Double, ceilToDouble, DoubleCeil, 0x1b045e9e)                             \
+  V(_Double, _modulo, DoubleMod, 0x5b8ceed7)
 
 
 #define GRAPH_INTRINSICS_LIST(V)                                               \
@@ -356,17 +326,14 @@
   GRAPH_MATH_LIB_INTRINSIC_LIST(V)                                             \
 
 #define DEVELOPER_LIB_INTRINSIC_LIST(V)                                        \
-  V(_UserTag, makeCurrent, UserTag_makeCurrent, Dynamic, 0x0b3066fd)           \
-  V(::, _getDefaultTag, UserTag_defaultTag, Dynamic, 0x69f3f1ad)               \
-  V(::, _getCurrentTag, Profiler_getCurrentTag, Dynamic, 0x05fa99d2)           \
-  V(::, _isDartStreamEnabled, Timeline_isDartStreamEnabled, Dynamic,           \
-    0x72f13f7a)                                                                \
+  V(_UserTag, makeCurrent, UserTag_makeCurrent, 0x0b3066fd)                    \
+  V(::, _getDefaultTag, UserTag_defaultTag, 0x69f3f1ad)                        \
+  V(::, _getCurrentTag, Profiler_getCurrentTag, 0x05fa99d2)                    \
+  V(::, _isDartStreamEnabled, Timeline_isDartStreamEnabled, 0x72f13f7a)        \
 
 #define ASYNC_LIB_INTRINSIC_LIST(V)                                            \
-  V(::, _clearAsyncThreadStackTrace, ClearAsyncThreadStackTrace,               \
-    Dynamic, 0x2edd4b25)                                                       \
-  V(::, _setAsyncThreadStackTrace, SetAsyncThreadStackTrace,                   \
-    Dynamic, 0x04f429a7)
+  V(::, _clearAsyncThreadStackTrace, ClearAsyncThreadStackTrace, 0x2edd4b25)   \
+  V(::, _setAsyncThreadStackTrace, SetAsyncThreadStackTrace, 0x04f429a7)       \
 
 #define ALL_INTRINSICS_NO_INTEGER_LIB_LIST(V)                                  \
   ASYNC_LIB_INTRINSIC_LIST(V)                                                  \
@@ -444,6 +411,9 @@
   V(::, _toUint16, ConvertIntToUint16, 0x6087d1af)                             \
   V(::, _toInt32, ConvertIntToInt32, 0x62b451b9)                               \
   V(::, _toUint32, ConvertIntToUint32, 0x17a8e085)                             \
+  V(::, _byteSwap16, ByteSwap16, 0x44f173be)                                   \
+  V(::, _byteSwap32, ByteSwap32, 0x6219333b)                                   \
+  V(::, _byteSwap64, ByteSwap64, 0x9abe57e0)                                   \
   V(Lists, copy, ListsCopy, 0x40e974f6)                                        \
   V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 0x02477157)               \
   V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 0x4fc8d5e0)               \
@@ -534,6 +504,7 @@
 // Forward declarations.
 class Function;
 class Library;
+class Object;
 class RawFunction;
 class RawGrowableObjectArray;
 class String;
@@ -546,8 +517,7 @@
  public:
   enum Kind {
     kUnknown,
-#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, type, fp)       \
-  k##enum_name,
+#define DEFINE_ENUM_LIST(class_name, function_name, enum_name, fp) k##enum_name,
     RECOGNIZED_LIST(DEFINE_ENUM_LIST)
 #undef DEFINE_ENUM_LIST
         kNumRecognizedMethods
@@ -557,7 +527,23 @@
   static bool AlwaysInline(const Function& function);
   static bool PolymorphicTarget(const Function& function);
   static intptr_t NumArgsCheckedForStaticCall(const Function& function);
-  static intptr_t ResultCid(const Function& function);
+
+  // Try to find an annotation of the form
+  //   @pragma("vm:exact-result-type", int)
+  //   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  // and return the exact cid if found or kDynamicCid otherwise.
+  //
+  // See [result_type_pragma.md].
+  static intptr_t ResultCidFromPragma(const Object& function_or_field);
+
+  // Try to find an annotation of the form
+  //   @pragma("vm:non-nullable-result-type")
+  // and returns true iff `false` was specified in the annotation.
+  //
+  // See [pragmas.md].
+  static bool HasNonNullableResultTypeFromPragma(
+      const Object& function_or_field);
+
   static intptr_t MethodKindToReceiverCid(Kind kind);
   static const char* KindToCString(Kind kind);
 
diff --git a/runtime/vm/compiler/relocation.cc b/runtime/vm/compiler/relocation.cc
new file mode 100644
index 0000000..fc568c3
--- /dev/null
+++ b/runtime/vm/compiler/relocation.cc
@@ -0,0 +1,173 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/compiler/relocation.h"
+
+#include "vm/code_patcher.h"
+#include "vm/instructions.h"
+#include "vm/object_store.h"
+#include "vm/stub_code.h"
+
+namespace dart {
+
+#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                  \
+    !defined(TARGET_ARCH_IA32)
+
+class InstructionsMapTraits {
+ public:
+  struct Pair {
+    RawInstructions* instructions;
+    intptr_t inst_nr;
+
+    Pair() : instructions(nullptr), inst_nr(-1) {}
+    Pair(RawInstructions* i, intptr_t nr) : instructions(i), inst_nr(nr) {}
+  };
+
+  typedef const RawInstructions* Key;
+  typedef const intptr_t Value;
+
+  static Key KeyOf(Pair kv) { return kv.instructions; }
+  static Value ValueOf(Pair kv) { return kv.inst_nr; }
+  static inline intptr_t Hashcode(Key key) {
+    return reinterpret_cast<intptr_t>(key);
+  }
+  static inline bool IsKeyEqual(Pair pair, Key key) {
+    return pair.instructions == key;
+  }
+};
+
+typedef DirectChainedHashMap<InstructionsMapTraits> InstructionsMap;
+
+void CodeRelocator::Relocate(bool is_vm_isolate) {
+  auto zone = Thread::Current()->zone();
+  intptr_t next_text_offsets = 0;
+
+  // Keeps track of mapping from Code to the index in [commands_] at which the
+  // code object's instructions are located. This allows us to calculate the
+  // distance to the destination using commands_[index].expected_offset.
+  InstructionsMap instructions_map;
+
+  // The callers which has an unresolved call.
+  GrowableArray<RawCode*> callers;
+  // The offset from the instruction at which the call happens.
+  GrowableArray<intptr_t> call_offsets;
+  // Type entry-point type we call in the destination.
+  GrowableArray<Code::CallEntryPoint> call_entry_points;
+  // The offset in the .text segment where the call happens.
+  GrowableArray<intptr_t> text_offsets;
+  // The target of the forward call.
+  GrowableArray<RawCode*> callees;
+
+  auto& targets = Array::Handle(zone);
+  auto& kind_type_and_offset = Smi::Handle(zone);
+  auto& target = Object::Handle(zone);
+  auto& destination = Code::Handle(zone);
+  auto& instructions = Instructions::Handle(zone);
+  auto& caller = Code::Handle(zone);
+  for (intptr_t i = 0; i < code_objects_->length(); ++i) {
+    caller = (*code_objects_)[i];
+    instructions = caller.instructions();
+
+    // If two [Code] objects point to the same [Instructions] object, we'll just
+    // use the first one (they are equivalent for all practical purposes).
+    if (instructions_map.HasKey(instructions.raw())) {
+      continue;
+    }
+    instructions_map.Insert({instructions.raw(), commands_->length()});
+
+    // First we'll add the instructions of [caller] itself.
+    const intptr_t active_code_text_offsets = next_text_offsets;
+    commands_->Add(ImageWriterCommand(
+        next_text_offsets, ImageWriterCommand::InsertInstructionOfCode,
+        caller.raw()));
+
+    next_text_offsets += instructions.raw()->Size();
+
+    targets = caller.static_calls_target_table();
+    if (!targets.IsNull()) {
+      StaticCallsTable calls(targets);
+      for (auto call : calls) {
+        kind_type_and_offset = call.Get<Code::kSCallTableKindAndOffset>();
+        auto kind = Code::KindField::decode(kind_type_and_offset.Value());
+        auto offset = Code::OffsetField::decode(kind_type_and_offset.Value());
+        auto entry_point =
+            Code::EntryPointField::decode(kind_type_and_offset.Value());
+
+        if (kind == Code::kCallViaCode) {
+          continue;
+        }
+
+        target = call.Get<Code::kSCallTableFunctionTarget>();
+        if (target.IsFunction()) {
+          auto& fun = Function::Cast(target);
+          ASSERT(fun.HasCode());
+          destination = fun.CurrentCode();
+          ASSERT(!destination.IsStubCode());
+        } else {
+          target = call.Get<Code::kSCallTableCodeTarget>();
+          ASSERT(target.IsCode());
+          destination = Code::Cast(target).raw();
+        }
+
+        const intptr_t start_of_call =
+            active_code_text_offsets + instructions.HeaderSize() + offset;
+
+        callers.Add(caller.raw());
+        callees.Add(destination.raw());
+        text_offsets.Add(start_of_call);
+        call_offsets.Add(offset);
+        call_entry_points.Add(entry_point);
+      }
+    }
+  }
+
+  auto& callee = Code::Handle(zone);
+  auto& caller_instruction = Instructions::Handle(zone);
+  auto& destination_instruction = Instructions::Handle(zone);
+  for (intptr_t i = 0; i < callees.length(); ++i) {
+    caller = callers[i];
+    callee = callees[i];
+    const intptr_t text_offset = text_offsets[i];
+    const intptr_t call_offset = call_offsets[i];
+    const bool use_unchecked_entry =
+        call_entry_points[i] == Code::kUncheckedEntry;
+    caller_instruction = caller.instructions();
+    destination_instruction = callee.instructions();
+
+    const uword entry_point = use_unchecked_entry ? callee.UncheckedEntryPoint()
+                                                  : callee.EntryPoint();
+    const intptr_t unchecked_offset =
+        destination_instruction.HeaderSize() +
+        (entry_point - destination_instruction.PayloadStart());
+
+    auto map_entry = instructions_map.Lookup(destination_instruction.raw());
+    auto& dst = (*commands_)[map_entry->inst_nr];
+    ASSERT(dst.op == ImageWriterCommand::InsertInstructionOfCode);
+
+    const int32_t distance =
+        (dst.expected_offset + unchecked_offset) - text_offset;
+    {
+      NoSafepointScope no_safepoint_scope;
+
+      PcRelativeCallPattern call(caller_instruction.PayloadStart() +
+                                 call_offset);
+      ASSERT(call.IsValid());
+      call.set_distance(static_cast<int32_t>(distance));
+      ASSERT(call.distance() == distance);
+    }
+  }
+
+  // We're done now, so we clear out the targets tables.
+  if (!is_vm_isolate) {
+    for (intptr_t i = 0; i < code_objects_->length(); ++i) {
+      caller = (*code_objects_)[i];
+      caller.set_static_calls_target_table(Array::empty_array());
+    }
+  }
+}
+
+#endif  // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&           \
+        // !defined(TARGET_ARCH_IA32)
+
+}  // namespace dart
diff --git a/runtime/vm/compiler/relocation.h b/runtime/vm/compiler/relocation.h
new file mode 100644
index 0000000..4c2714f
--- /dev/null
+++ b/runtime/vm/compiler/relocation.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_COMPILER_RELOCATION_H_
+#define RUNTIME_VM_COMPILER_RELOCATION_H_
+
+#include "vm/allocation.h"
+#include "vm/image_snapshot.h"
+#include "vm/object.h"
+#include "vm/type_testing_stubs.h"
+#include "vm/visitor.h"
+
+namespace dart {
+
+#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&                  \
+    !defined(TARGET_ARCH_IA32)
+
+// Relocates the given code objects by patching the instructions with the
+// correct pc offsets.
+//
+// Produces a set of [ImageWriterCommand]s which tell the image writer in which
+// order (and at which offset) to emit instructions.
+class CodeRelocator : public StackResource {
+ public:
+  // Relocates instructions of the code objects provided by patching any
+  // pc-relative calls/jumps.
+  //
+  // Populates the image writer command array which must be used later to write
+  // the ".text" segment.
+  static void Relocate(Thread* thread,
+                       GrowableArray<RawCode*>* code_objects,
+                       GrowableArray<ImageWriterCommand>* commands,
+                       bool is_vm_isolate) {
+    CodeRelocator relocator(thread, code_objects, commands);
+    relocator.Relocate(is_vm_isolate);
+  }
+
+ private:
+  CodeRelocator(Thread* thread,
+                GrowableArray<RawCode*>* code_objects,
+                GrowableArray<ImageWriterCommand>* commands)
+      : StackResource(thread),
+        code_objects_(code_objects),
+        commands_(commands) {}
+
+  void Relocate(bool is_vm_isolate);
+
+  GrowableArray<RawCode*>* code_objects_;
+  GrowableArray<ImageWriterCommand>* commands_;
+};
+
+#endif  // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC) &&           \
+        // !defined(TARGET_ARCH_IA32)
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_COMPILER_RELOCATION_H_
diff --git a/runtime/vm/compiler/result_type_pragma.md b/runtime/vm/compiler/result_type_pragma.md
deleted file mode 100644
index debb523..0000000
--- a/runtime/vm/compiler/result_type_pragma.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Result type @pragma annotations
-
-To facilitate type-flow analysis and other optimizations, Dart methods may use the pragma `vm:exact-result-type` to declare an exact return type different than the return type in the signature of the method. There are three limitations on this pragma:
-
-0. The Dart object returned by the method at runtime must have exactly the type specified in the annotation (not a subtype).
-
-1. The exact return type declared in the pragma must be a subtype of the return type declared in the method signature.
-   Note that this restriction is not enforced automatically by the compiler.
-
-2. `vm:exact-result-type` may only be attached to methods in the core library.
-   This pragma can introduce unsafe behavior since it allows the compiler to make stronger assumptions during optimization than what the sound strong-mode type system allows, so it is only allowed in the core library where the Dart VM team can ensure that it is not misused.
-
-If limitations 0 or 1 are violated, undefined behavior may result.
-Note that since `null` is an instance of the `Null` type, which is a subtype of any other, exactness of the annotated result type implies that the result must be non-null.
-
-## Syntax
-
-### Reference to type via type literal
-
-```dart
-class A {}
-class B extends A {}
-
-@pragma("vm:exact-result-type", B)
-A foo() native "foo_impl";
-```
-
-### Reference to type via path
-
-```dart
-@pragma("vm:exact-result-type", "dart:core#_Smi");
-int foo() native "foo_impl";
-```
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index ae91b3e..02a4ed1 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -110,7 +110,7 @@
   BackgroundCompiler::Stop(isolate);
 }
 
-TEST_CASE(RegenerateAllocStubs) {
+ISOLATE_UNIT_TEST_CASE(RegenerateAllocStubs) {
   const char* kScriptChars =
       "class A {\n"
       "}\n"
@@ -120,29 +120,39 @@
       "  return unOpt();\n"
       "}\n";
 
+  Class& cls = Class::Handle();
+  TransitionVMToNative transition(thread);
+
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
-  RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(lib));
-  Library& lib_handle = Library::ZoneHandle(raw_library);
-  Class& cls = Class::Handle(
-      lib_handle.LookupClass(String::Handle(Symbols::New(thread, "A"))));
-  EXPECT(!cls.IsNull());
 
-  Zone* zone = thread->zone();
-  const Code& stub =
-      Code::Handle(zone, StubCode::GetAllocationStubForClass(cls));
-  Class& owner = Class::Handle();
-  owner ^= stub.owner();
-  owner.DisableAllocationStub();
+  {
+    TransitionNativeToVM transition(thread);
+    Library& lib_handle =
+        Library::Handle(Library::RawCast(Api::UnwrapHandle(lib)));
+    cls = lib_handle.LookupClass(String::Handle(Symbols::New(thread, "A")));
+    EXPECT(!cls.IsNull());
+  }
+
+  {
+    TransitionNativeToVM transition(thread);
+    cls.DisableAllocationStub();
+  }
   result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
-  owner.DisableAllocationStub();
+  {
+    TransitionNativeToVM transition(thread);
+    cls.DisableAllocationStub();
+  }
   result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
-  owner.DisableAllocationStub();
+  {
+    TransitionNativeToVM transition(thread);
+    cls.DisableAllocationStub();
+  }
   result = Dart_Invoke(lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 }
@@ -173,20 +183,16 @@
   const Class& receiver_cls = Class::Handle(obj.clazz());
 
   if (!KernelIsolate::IsRunning()) {
-    val = Instance::Cast(obj).Evaluate(
-        receiver_cls, expr_text, Array::empty_array(), Array::empty_array());
+    UNREACHABLE();
   } else {
     RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(lib));
     Library& lib_handle = Library::ZoneHandle(raw_library);
 
-    Dart_KernelCompilationResult compilation_result;
-    {
-      TransitionVMToNative transition(thread);
-      compilation_result = KernelIsolate::CompileExpressionToKernel(
-          expr_text.ToCString(), Array::empty_array(), Array::empty_array(),
-          String::Handle(lib_handle.url()).ToCString(), "A",
-          /* is_static= */ false);
-    }
+    Dart_KernelCompilationResult compilation_result =
+        KernelIsolate::CompileExpressionToKernel(
+            expr_text.ToCString(), Array::empty_array(), Array::empty_array(),
+            String::Handle(lib_handle.url()).ToCString(), "A",
+            /* is_static= */ false);
     EXPECT_EQ(Dart_KernelCompilationStatus_Ok, compilation_result.status);
 
     const uint8_t* kernel_bytes = compilation_result.kernel;
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 4092d250..08380f8 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -283,6 +283,7 @@
 // ABI for write barrier stub.
 const Register kWriteBarrierObjectReg = R1;
 const Register kWriteBarrierValueReg = R0;
+const Register kWriteBarrierSlotReg = R9;
 
 // List of registers used in load/store multiple.
 typedef uint16_t RegList;
@@ -308,10 +309,12 @@
 const RegList kReservedCpuRegisters = (1 << SPREG) | (1 << FPREG) | (1 << TMP) |
                                       (1 << PP) | (1 << THR) | (1 << LR) |
                                       (1 << PC);
+constexpr intptr_t kNumberOfReservedCpuRegisters = 7;
 // CPU registers available to Dart allocator.
 constexpr RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
-constexpr int kNumberOfDartAvailableCpuRegs = kNumberOfCpuRegisters - 7;
+constexpr int kNumberOfDartAvailableCpuRegs =
+    kNumberOfCpuRegisters - kNumberOfReservedCpuRegisters;
 const intptr_t kStoreBufferWrapperSize = 24;
 // Registers available to Dart that are not preserved by runtime calls.
 const RegList kDartVolatileCpuRegs =
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index c456dc7..6067a37 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -125,6 +125,7 @@
 // ABI for write barrier stub.
 const Register kWriteBarrierObjectReg = R1;
 const Register kWriteBarrierValueReg = R0;
+const Register kWriteBarrierSlotReg = R25;
 
 // Masks, sizes, etc.
 const int kXRegSizeInBits = 64;
@@ -134,7 +135,7 @@
 
 // List of registers used in load/store multiple.
 typedef uint32_t RegList;
-const RegList kAllCpuRegistersList = 0xFFFF;
+const RegList kAllCpuRegistersList = 0xFFFFFFFF;
 
 // C++ ABI call registers.
 const RegList kAbiArgumentCpuRegs = (1 << R0) | (1 << R1) | (1 << R2) |
@@ -156,10 +157,12 @@
     (1 << LR) | (1 << BARRIER_MASK) | (1 << R31) |  // C++ SP
     (1 << R18);                                     // iOS platform register.
 // TODO(rmacnak): Only reserve on Mac & iOS.
+constexpr intptr_t kNumberOfReservedCpuRegisters = 10;
 // CPU registers available to Dart allocator.
 const RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
-constexpr int kNumberOfDartAvailableCpuRegs = kNumberOfCpuRegisters - 9;
+constexpr int kNumberOfDartAvailableCpuRegs =
+    kNumberOfCpuRegisters - kNumberOfReservedCpuRegisters;
 // Registers available to Dart that are not preserved by runtime calls.
 const RegList kDartVolatileCpuRegs =
     kDartAvailableCpuRegs & ~kAbiPreservedCpuRegs;
diff --git a/runtime/vm/constants_dbc.h b/runtime/vm/constants_dbc.h
index c211898..74e1ac1 100644
--- a/runtime/vm/constants_dbc.h
+++ b/runtime/vm/constants_dbc.h
@@ -12,7 +12,7 @@
 namespace dart {
 
 // clang-format off
-// List of Dart Bytecode instructions.
+// List of Simulator Bytecode instructions.
 //
 // INTERPRETER STATE
 //
@@ -943,7 +943,7 @@
 
 typedef uint32_t Instr;
 
-class Bytecode {
+class SimulatorBytecode {
  public:
   enum Opcode {
 #define DECLARE_BYTECODE(name, encoding, op1, op2, op3) k##name,
@@ -1015,18 +1015,18 @@
   }
 
   DART_FORCE_INLINE static bool IsTrap(Instr instr) {
-    return DecodeOpcode(instr) == Bytecode::kTrap;
+    return DecodeOpcode(instr) == SimulatorBytecode::kTrap;
   }
 
   DART_FORCE_INLINE static bool IsCallOpcode(Instr instr) {
     switch (DecodeOpcode(instr)) {
-      case Bytecode::kStaticCall:
-      case Bytecode::kIndirectStaticCall:
-      case Bytecode::kInstanceCall1:
-      case Bytecode::kInstanceCall2:
-      case Bytecode::kInstanceCall1Opt:
-      case Bytecode::kInstanceCall2Opt:
-      case Bytecode::kDebugBreak:
+      case SimulatorBytecode::kStaticCall:
+      case SimulatorBytecode::kIndirectStaticCall:
+      case SimulatorBytecode::kInstanceCall1:
+      case SimulatorBytecode::kInstanceCall2:
+      case SimulatorBytecode::kInstanceCall1Opt:
+      case SimulatorBytecode::kInstanceCall2Opt:
+      case SimulatorBytecode::kDebugBreak:
         return true;
 
       default:
@@ -1036,14 +1036,14 @@
 
   DART_FORCE_INLINE static bool IsFastSmiOpcode(Instr instr) {
     switch (DecodeOpcode(instr)) {
-      case Bytecode::kAddTOS:
-      case Bytecode::kSubTOS:
-      case Bytecode::kMulTOS:
-      case Bytecode::kBitOrTOS:
-      case Bytecode::kBitAndTOS:
-      case Bytecode::kEqualTOS:
-      case Bytecode::kLessThanTOS:
-      case Bytecode::kGreaterThanTOS:
+      case SimulatorBytecode::kAddTOS:
+      case SimulatorBytecode::kSubTOS:
+      case SimulatorBytecode::kMulTOS:
+      case SimulatorBytecode::kBitOrTOS:
+      case SimulatorBytecode::kBitAndTOS:
+      case SimulatorBytecode::kEqualTOS:
+      case SimulatorBytecode::kLessThanTOS:
+      case SimulatorBytecode::kGreaterThanTOS:
         return true;
 
       default:
@@ -1060,7 +1060,7 @@
 
  private:
   DISALLOW_ALLOCATION();
-  DISALLOW_IMPLICIT_CONSTRUCTORS(Bytecode);
+  DISALLOW_IMPLICIT_CONSTRUCTORS(SimulatorBytecode);
 };
 
 // Various dummy declarations to make shared code compile.
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 5bd61c4..4e56d03 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -72,6 +72,7 @@
 // ABI for write barrier stub.
 const Register kWriteBarrierObjectReg = EDX;
 const Register kWriteBarrierValueReg = kNoRegister;
+const Register kWriteBarrierSlotReg = EDI;
 
 typedef uint32_t RegList;
 const RegList kAllCpuRegistersList = 0xFF;
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index d61ac75..15506e5 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -137,10 +137,11 @@
 //    Check for a passed-in type argument vector of length A and
 //    store it at FP[D].
 //
-//  - CheckStack
+//  - CheckStack A
 //
 //    Compare SP against isolate stack limit and call StackOverflow handler if
-//    necessary.
+//    necessary. Should be used in prologue (A = 0), or at the beginning of
+//    a loop with depth A.
 //
 //  - Allocate D
 //
@@ -154,13 +155,18 @@
 //
 //    Allocate array of length SP[0] with type arguments SP[-1].
 //
-//  - AllocateContext D
+//  - AllocateContext A, D
 //
-//    Allocate Context object assuming for D context variables.
+//    Allocate Context object holding D context variables.
+//    A is a static ID of the context. Static ID of a context may be used to
+//    disambiguate accesses to different context objects.
+//    Context objects with the same ID should have the same number of
+//    context variables.
 //
-//  - CloneContext
+//  - CloneContext A, D
 //
-//    Clone context stored in TOS.
+//    Clone Context object SP[0] holding D context variables.
+//    A is a static ID of the context. Cloned context has the same ID.
 //
 //  - LoadContextParent
 //
@@ -170,13 +176,15 @@
 //
 //    Store context SP[0] into `parent` field of context SP[-1].
 //
-//  - LoadContextVar D
+//  - LoadContextVar A, D
 //
 //    Load value from context SP[0] at index D.
+//    A is a static ID of the context.
 //
-//  - StoreContextVar D
+//  - StoreContextVar A, D
 //
 //    Store value SP[0] into context SP[-1] at index D.
+//    A is a static ID of the context.
 //
 //  - PushConstant D
 //
@@ -263,7 +271,16 @@
 //    SP[-(1+ArgC)], ..., SP[-1] and argument descriptor PP[D], which
 //    indicates whether the first argument is a type argument vector.
 //
-//  - InstanceCall ArgC, D
+//  - InterfaceCall ArgC, D
+//
+//    Lookup and invoke method using ICData in PP[D]
+//    with arguments SP[-(1+ArgC)], ..., SP[-1].
+//    Method has to be declared (explicitly or implicitly) in an interface
+//    implemented by a receiver, and passed arguments are valid for the
+//    interface method declaration.
+//    The ICData indicates whether the first argument is a type argument vector.
+//
+//  - DynamicCall ArgC, D
 //
 //    Lookup and invoke method using ICData in PP[D]
 //    with arguments SP[-(1+ArgC)], ..., SP[-1].
@@ -329,10 +346,10 @@
 //    Throw (Rethrow if A != 0) exception. Exception object and stack object
 //    are taken from TOS.
 //
-//  - MoveSpecial rA, D
+//  - MoveSpecial A, rX
 //
-//    Copy special values from inside interpreter to FP[rA]. Currently only
-//    used to pass exception object (D = 0) and stack trace object (D = 1) to
+//    Copy value from special variable to FP[rX]. Currently only
+//    used to pass exception object (A = 0) and stack trace object (A = 1) to
 //    catch handler.
 //
 //  - SetFrame A
@@ -396,13 +413,13 @@
   V(EntryOptional,                     A_B_C, num, num, num)                   \
   V(LoadConstant,                        A_D, reg, lit, ___)                   \
   V(Frame,                                 D, num, ___, ___)                   \
-  V(CheckFunctionTypeArgs,               A_D, num, num, ___)                   \
-  V(CheckStack,                            0, ___, ___, ___)                   \
+  V(CheckFunctionTypeArgs,               A_D, num, reg, ___)                   \
+  V(CheckStack,                            A, num, ___, ___)                   \
   V(Allocate,                              D, lit, ___, ___)                   \
   V(AllocateT,                             0, ___, ___, ___)                   \
   V(CreateArrayTOS,                        0, ___, ___, ___)                   \
   V(AllocateContext,                       D, num, ___, ___)                   \
-  V(CloneContext,                          0, ___, ___, ___)                   \
+  V(CloneContext,                          D, num, ___, ___)                   \
   V(LoadContextParent,                     0, ___, ___, ___)                   \
   V(StoreContextParent,                    0, ___, ___, ___)                   \
   V(LoadContextVar,                        D, num, ___, ___)                   \
@@ -431,7 +448,8 @@
   V(JumpIfNull,                            T, tgt, ___, ___)                   \
   V(JumpIfNotNull,                         T, tgt, ___, ___)                   \
   V(IndirectStaticCall,                  A_D, num, num, ___)                   \
-  V(InstanceCall,                        A_D, num, num, ___)                   \
+  V(InterfaceCall,                       A_D, num, num, ___)                   \
+  V(DynamicCall,                         A_D, num, num, ___)                   \
   V(NativeCall,                            D, lit, ___, ___)                   \
   V(ReturnTOS,                             0, ___, ___, ___)                   \
   V(AssertAssignable,                    A_D, num, lit, ___)                   \
@@ -441,7 +459,7 @@
   V(InstantiateType,                       D, lit, ___, ___)                   \
   V(InstantiateTypeArgumentsTOS,         A_D, num, lit, ___)                   \
   V(Throw,                                 A, num, ___, ___)                   \
-  V(MoveSpecial,                         A_D, reg, num, ___)                   \
+  V(MoveSpecial,                         A_X, num, xeg, ___)                   \
   V(SetFrame,                              A, num, ___, num)                   \
   V(BooleanNegateTOS,                      0, ___, ___, ___)                   \
   V(EqualsNull,                            0, ___, ___, ___)                   \
@@ -587,7 +605,8 @@
   DART_FORCE_INLINE static bool IsCallOpcode(KBCInstr instr) {
     switch (DecodeOpcode(instr)) {
       case KernelBytecode::kIndirectStaticCall:
-      case KernelBytecode::kInstanceCall:
+      case KernelBytecode::kInterfaceCall:
+      case KernelBytecode::kDynamicCall:
         return true;
 
       default:
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index 055d51b..512ff98 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -115,6 +115,7 @@
 // ABI for write barrier stub.
 const Register kWriteBarrierObjectReg = RDX;
 const Register kWriteBarrierValueReg = RAX;
+const Register kWriteBarrierSlotReg = R13;
 
 typedef uint32_t RegList;
 const RegList kAllCpuRegistersList = 0xFFFF;
@@ -122,10 +123,12 @@
 
 const RegList kReservedCpuRegisters =
     (1 << SPREG) | (1 << FPREG) | (1 << TMP) | (1 << PP) | (1 << THR);
+constexpr intptr_t kNumberOfReservedCpuRegisters = 5;
 // CPU registers available to Dart allocator.
 const RegList kDartAvailableCpuRegs =
     kAllCpuRegistersList & ~kReservedCpuRegisters;
-constexpr int kNumberOfDartAvailableCpuRegs = kNumberOfCpuRegisters - 5;
+constexpr int kNumberOfDartAvailableCpuRegs =
+    kNumberOfCpuRegisters - kNumberOfReservedCpuRegisters;
 constexpr int kStoreBufferWrapperSize = 13;
 
 enum ScaleFactor {
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index ea392ed..a951991 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -27,6 +27,7 @@
 #include "vm/object_store.h"
 #include "vm/port.h"
 #include "vm/profiler.h"
+#include "vm/reverse_pc_lookup_cache.h"
 #include "vm/service_isolate.h"
 #include "vm/simulator.h"
 #include "vm/snapshot.h"
@@ -42,7 +43,6 @@
 namespace dart {
 
 DECLARE_FLAG(bool, print_class_table);
-DECLARE_FLAG(bool, trace_time_all);
 DEFINE_FLAG(bool, keep_code, false, "Keep deoptimized code for profiling.");
 DEFINE_FLAG(bool, trace_shutdown, false, "Trace VM shutdown on stderr");
 DECLARE_FLAG(bool, strong);
@@ -84,16 +84,19 @@
 };
 
 static void CheckOffsets() {
+  bool ok = true;
 #define CHECK_OFFSET(expr, offset)                                             \
   if ((expr) != (offset)) {                                                    \
-    FATAL2("%s == %" Pd, #expr, (expr));                                       \
+    OS::PrintErr("%s got %" Pd " expected %" Pd "\n", #expr, (expr),           \
+                 static_cast<intptr_t>(offset));                               \
+    ok = false;                                                                \
   }
 
 #if defined(TARGET_ARCH_ARM)
   // These offsets are embedded in precompiled instructions. We need simarm
   // (compiler) and arm (runtime) to agree.
-  CHECK_OFFSET(Thread::stack_limit_offset(), 4);
-  CHECK_OFFSET(Thread::object_null_offset(), 64);
+  CHECK_OFFSET(Thread::stack_limit_offset(), 28);
+  CHECK_OFFSET(Thread::object_null_offset(), 88);
   CHECK_OFFSET(SingleTargetCache::upper_limit_offset(), 14);
   CHECK_OFFSET(Isolate::object_store_offset(), 20);
   NOT_IN_PRODUCT(CHECK_OFFSET(sizeof(ClassHeapStats), 168));
@@ -101,12 +104,16 @@
 #if defined(TARGET_ARCH_ARM64)
   // These offsets are embedded in precompiled instructions. We need simarm64
   // (compiler) and arm64 (runtime) to agree.
-  CHECK_OFFSET(Thread::stack_limit_offset(), 8);
-  CHECK_OFFSET(Thread::object_null_offset(), 112);
+  CHECK_OFFSET(Thread::stack_limit_offset(), 56);
+  CHECK_OFFSET(Thread::object_null_offset(), 168);
   CHECK_OFFSET(SingleTargetCache::upper_limit_offset(), 26);
   CHECK_OFFSET(Isolate::object_store_offset(), 40);
   NOT_IN_PRODUCT(CHECK_OFFSET(sizeof(ClassHeapStats), 288));
 #endif
+
+  if (!ok) {
+    FATAL("CheckOffsets failed.");
+  }
 #undef CHECK_OFFSET
 }
 
@@ -144,14 +151,7 @@
         "a sim* architecture.");
 #endif  // defined(USING_SIMULATOR) || defined(TARGET_ARCH_DBC)
 
-#if defined(TARGET_OS_WINDOWS)
-    // TODO(34393): The interpreter currently relies on computed gotos, which
-    // aren't supported on Windows.
-    return strdup("--enable-interpreter is not supported on Windows.");
-#endif  // defined(TARGET_OS_WINDOWS)
-
     FLAG_use_field_guards = false;
-    FLAG_optimization_counter_threshold = -1;
   }
 
   FrameLayout::Init();
@@ -170,7 +170,6 @@
   NOT_IN_PRODUCT(
       TimelineDurationScope tds(Timeline::GetVMStream(), "Dart::Init"));
   Isolate::InitVM();
-  IdleNotifier::Init();
   PortMap::Init();
   FreeListElement::Init();
   ForwardingCorpse::Init();
@@ -257,6 +256,9 @@
         // Must copy before leaving the zone.
         return strdup(error.ToErrorCString());
       }
+
+      ReversePcLookupCache::BuildAndAttachToIsolate(vm_isolate_);
+
       Object::FinishInit(vm_isolate_);
 #if !defined(PRODUCT)
       if (tds.enabled()) {
@@ -300,7 +302,6 @@
     // We need to initialize the constants here for the vm isolate thread due to
     // bootstrapping issues.
     T->InitVMConstants();
-    Scanner::Init();
 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
     // Dart VM requires at least SSE2.
     if (!TargetCPUFeatures::sse2_supported()) {
@@ -330,7 +331,7 @@
   }
 
   const bool is_dart2_aot_precompiler =
-      FLAG_strong && FLAG_precompiled_mode && !kDartPrecompiledRuntime;
+      FLAG_precompiled_mode && !kDartPrecompiledRuntime;
 
   if (!is_dart2_aot_precompiler &&
       (FLAG_support_service || !kDartPrecompiledRuntime)) {
@@ -441,8 +442,6 @@
   }
   WaitForIsolateShutdown();
 
-  IdleNotifier::Stop();
-
 #if !defined(PRODUCT)
   {
     // IMPORTANT: the code below enters VM isolate so that Metric::Cleanup could
@@ -500,7 +499,6 @@
   vm_isolate_ = NULL;
   ASSERT(Isolate::IsolateListLength() == 0);
   PortMap::Cleanup();
-  IdleNotifier::Cleanup();
   ICData::Cleanup();
   ArgumentsDescriptor::Cleanup();
   TargetCPUFeatures::Cleanup();
@@ -617,6 +615,9 @@
     if (!error.IsNull()) {
       return error.raw();
     }
+
+    ReversePcLookupCache::BuildAndAttachToIsolate(I);
+
 #if !defined(PRODUCT)
     if (tds.enabled()) {
       tds.SetNumArguments(2);
@@ -643,17 +644,17 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   // AOT: The megamorphic miss function and code come from the snapshot.
   ASSERT(I->object_store()->megamorphic_miss_code() != Code::null());
+  ASSERT(I->object_store()->build_method_extractor_code() != Code::null());
 #else
   // JIT: The megamorphic miss function and code come from the snapshot in JIT
   // app snapshot, otherwise create them.
   if (I->object_store()->megamorphic_miss_code() == Code::null()) {
     MegamorphicCacheTable::InitMissHandler(I);
   }
-
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
   if (I != Dart::vm_isolate()) {
     I->object_store()->set_build_method_extractor_code(
-        Code::Handle(StubCode::GetBuildMethodExtractorStub()));
+        Code::Handle(StubCode::GetBuildMethodExtractorStub(nullptr)));
   }
 #endif
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
@@ -724,25 +725,13 @@
     buffer.AddString(name ? (" " #name) : (" no-" #name));                     \
   } while (0);
 
-  // We don't write the strong flag into the features list for the VM isolate
-  // snapshot as the implementation is in an intermediate state where the VM
-  // isolate is always initialized from a vm_snapshot generated in non strong
-  // mode.
-  if (!is_vm_isolate) {
-    buffer.AddString(FLAG_strong ? " strong" : " no-strong");
-  }
-
   if (Snapshot::IncludesCode(kind)) {
-    // Checked mode affects deopt ids.
-    ADD_FLAG(type_checks, enable_type_checks, FLAG_enable_type_checks);
+    // enabling assertions affects deopt ids.
     ADD_FLAG(asserts, enable_asserts, FLAG_enable_asserts);
-    ADD_FLAG(error_on_bad_type, enable_error_on_bad_type,
-             FLAG_error_on_bad_type);
-    // sync-async and reify_generic_functions also affect deopt_ids.
-    buffer.AddString(FLAG_sync_async ? " sync_async" : " no-sync_async");
-    buffer.AddString(FLAG_reify_generic_functions
-                         ? " reify_generic_functions"
-                         : " no-reify_generic_functions");
+    if (kind == Snapshot::kFullAOT) {
+      ADD_FLAG(use_bare_instructions, use_bare_instructions,
+               FLAG_use_bare_instructions);
+    }
     if (kind == Snapshot::kFullJIT) {
       ADD_FLAG(use_field_guards, use_field_guards, FLAG_use_field_guards);
       ADD_FLAG(use_osr, use_osr, FLAG_use_osr);
@@ -796,11 +785,12 @@
 
 void Dart::RunShutdownCallback() {
   Thread* thread = Thread::Current();
-  ASSERT(thread->execution_state() == Thread::kThreadInNative);
+  ASSERT(thread->execution_state() == Thread::kThreadInVM);
   Isolate* isolate = thread->isolate();
   void* callback_data = isolate->init_callback_data();
   Dart_IsolateShutdownCallback callback = Isolate::ShutdownCallback();
   if (callback != NULL) {
+    TransitionVMToNative transition(thread);
     (callback)(callback_data);
   }
 }
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 92e7895..b01af49 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -69,6 +69,10 @@
             verify_acquired_data,
             false,
             "Verify correct API acquire/release of typed data.");
+DEFINE_FLAG(bool,
+            dump_tables,
+            false,
+            "Dump common hash tables before snapshotting.");
 
 ThreadLocalKey Api::api_native_key_ = kUnsetThreadLocalKey;
 Dart_Handle Api::true_handle_ = NULL;
@@ -107,15 +111,13 @@
       // Verify that the result type of a function is canonical or a
       // TypeParameter.
       typeHandle_ ^= funcHandle_.result_type();
-      ASSERT(typeHandle_.IsMalformed() || !typeHandle_.IsResolved() ||
-             typeHandle_.IsTypeParameter() || typeHandle_.IsCanonical());
+      ASSERT(typeHandle_.IsTypeParameter() || typeHandle_.IsCanonical());
       // Verify that the types in the function signature are all canonical or
       // a TypeParameter.
       const intptr_t num_parameters = funcHandle_.NumParameters();
       for (intptr_t i = 0; i < num_parameters; i++) {
         typeHandle_ = funcHandle_.ParameterTypeAt(i);
-        ASSERT(typeHandle_.IsMalformed() || !typeHandle_.IsResolved() ||
-               typeHandle_.IsTypeParameter() || typeHandle_.IsCanonical());
+        ASSERT(typeHandle_.IsTypeParameter() || typeHandle_.IsCanonical());
       }
     }
   }
@@ -135,11 +137,8 @@
     ASSERT(!list_class.IsNull());
     const Instance& instance = Instance::Cast(obj);
     const Class& obj_class = Class::Handle(zone, obj.clazz());
-    Error& malformed_type_error = Error::Handle(zone);
-    if (obj_class.IsSubtypeOf(Object::null_type_arguments(), list_class,
-                              Object::null_type_arguments(),
-                              &malformed_type_error, NULL, Heap::kNew)) {
-      ASSERT(malformed_type_error.IsNull());  // Type is a raw List.
+    if (Class::IsSubtypeOf(obj_class, Object::null_type_arguments(), list_class,
+                           Object::null_type_arguments(), Heap::kNew)) {
       return instance.raw();
     }
   }
@@ -154,11 +153,8 @@
     ASSERT(!map_class.IsNull());
     const Instance& instance = Instance::Cast(obj);
     const Class& obj_class = Class::Handle(zone, obj.clazz());
-    Error& malformed_type_error = Error::Handle(zone);
-    if (obj_class.IsSubtypeOf(Object::null_type_arguments(), map_class,
-                              Object::null_type_arguments(),
-                              &malformed_type_error, NULL, Heap::kNew)) {
-      ASSERT(malformed_type_error.IsNull());  // Type is a raw Map.
+    if (Class::IsSubtypeOf(obj_class, Object::null_type_arguments(), map_class,
+                           Object::null_type_arguments(), Heap::kNew)) {
       return instance.raw();
     }
   }
@@ -347,6 +343,7 @@
   if (raw == Bool::False().raw()) {
     return False();
   }
+  ASSERT(thread->execution_state() == Thread::kThreadInVM);
   return InitNewHandle(thread, raw);
 }
 
@@ -417,11 +414,11 @@
 Dart_Handle Api::NewError(const char* format, ...) {
   Thread* T = Thread::Current();
   CHECK_API_SCOPE(T);
-  HANDLESCOPE(T);
   CHECK_CALLBACK_STATE(T);
   // Ensure we transition safepoint state to VM if we are not already in
   // that state.
   TransitionToVM transition(T);
+  HANDLESCOPE(T);
 
   va_list args;
   va_start(args, format);
@@ -868,9 +865,10 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
-  NoSafepointScope no_safepoint_scope;
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
+  TransitionNativeToVM transition(thread);
+  NoSafepointScope no_safepoint_scope;
   PersistentHandle* ref = PersistentHandle::Cast(object);
   return Api::NewHandle(thread, ref->raw());
 }
@@ -880,9 +878,10 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
-  NoSafepointScope no_safepoint_scope;
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
+  TransitionNativeToVM transition(thread);
+  NoSafepointScope no_safepoint_scope;
   FinalizablePersistentHandle* weak_ref =
       FinalizablePersistentHandle::Cast(object);
   return Api::NewHandle(thread, weak_ref->raw());
@@ -1125,7 +1124,7 @@
     // We enter an API scope here as InitializeIsolate could compile some
     // bootstrap library files which call out to a tag handler that may create
     // Api Handles when an error is encountered.
-    Dart_EnterScope();
+    T->EnterApiScope();
     const Error& error_obj = Error::Handle(
         Z,
         Dart::InitializeIsolate(snapshot_data, snapshot_instructions,
@@ -1138,7 +1137,7 @@
       }
 #endif  // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT).
       // We exit the API scope entered above.
-      Dart_ExitScope();
+      T->ExitApiScope();
       // A Thread structure has been associated to the thread, we do the
       // safepoint transition explicitly here instead of using the
       // TransitionXXX scope objects as the reverse transition happens
@@ -1154,7 +1153,7 @@
       *error = strdup(error_obj.ToErrorCString());
     }
     // We exit the API scope entered above.
-    Dart_ExitScope();
+    T->ExitApiScope();
   }
   Dart::ShutdownIsolate();
   return reinterpret_cast<Dart_Isolate>(NULL);
@@ -1197,6 +1196,15 @@
   Thread* T = Thread::Current();
   Isolate* I = T->isolate();
   CHECK_ISOLATE(I);
+
+  // The Thread structure is disassociated from the isolate, we do the
+  // safepoint transition explicitly here instead of using the TransitionXXX
+  // scope objects as the original transition happened outside this scope in
+  // Dart_EnterIsolate/Dart_CreateIsolate.
+  ASSERT(T->execution_state() == Thread::kThreadInNative);
+  T->ExitSafepoint();
+  T->set_execution_state(Thread::kThreadInVM);
+
   I->WaitForOutstandingSpawns();
 
   // Release any remaining API scopes.
@@ -1212,12 +1220,6 @@
     StackZone zone(T);
     HandleScope handle_scope(T);
     Dart::RunShutdownCallback();
-    // The Thread structure is disassociated from the isolate, we do the
-    // safepoint transition explicitly here instead of using the TransitionXXX
-    // scope objects as the original transition happened outside this scope in
-    // Dart_EnterIsolate/Dart_CreateIsolate.
-    T->ExitSafepoint();
-    T->set_execution_state(Thread::kThreadInVM);
   }
   Dart::ShutdownIsolate();
 }
@@ -1419,6 +1421,7 @@
   CHECK_ISOLATE(I);
   NoSafepointScope no_safepoint_scope;
   if (I->sticky_error() != Error::null()) {
+    TransitionNativeToVM transition(T);
     Dart_Handle error = Api::NewHandle(T, I->sticky_error());
     return error;
   }
@@ -1524,7 +1527,7 @@
   Isolate* iso = reinterpret_cast<Isolate*>(isolate);
   const char* error;
   if (iso->object_store()->root_library() == Library::null()) {
-    // The embedder should have called Dart_LoadScript by now.
+    // The embedder should have called Dart_LoadScriptFromKernel by now.
     error = "Missing root library";
   } else {
     error = iso->MakeRunnable();
@@ -1541,8 +1544,23 @@
     Dart_MessageNotifyCallback message_notify_callback) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
-  NoSafepointScope no_safepoint_scope;
-  isolate->set_message_notify_callback(message_notify_callback);
+
+  {
+    NoSafepointScope no_safepoint_scope;
+    isolate->set_message_notify_callback(message_notify_callback);
+  }
+
+  if (message_notify_callback != nullptr && isolate->HasPendingMessages()) {
+    ::Dart_ExitIsolate();
+
+    // If a new handler gets installed and there are pending messages in the
+    // queue (e.g. OOB messages for doing vm service work) we need to notify
+    // the newly registered callback, otherwise the embedder might never get
+    // notified about the pending messages.
+    message_notify_callback(Api::CastIsolate(isolate));
+
+    ::Dart_EnterIsolate(Api::CastIsolate(isolate));
+  }
 }
 
 DART_EXPORT Dart_MessageNotifyCallback Dart_GetMessageNotifyCallback() {
@@ -1591,9 +1609,9 @@
   }
   ::Dart_EnterIsolate(Api::CastIsolate(I));
   if (I->sticky_error() != Object::null()) {
-    Dart_Handle error = Api::NewHandle(Thread::Current(), I->sticky_error());
-    I->clear_sticky_error();
-    return error;
+    Thread* T = Thread::Current();
+    TransitionNativeToVM transition(T);
+    return Api::NewHandle(T, I->StealStickyError());
   }
   if (FLAG_print_class_table) {
     HANDLESCOPE(Thread::Current());
@@ -1610,9 +1628,7 @@
   API_TIMELINE_BEGIN_END_BASIC(T);
   TransitionNativeToVM transition(T);
   if (I->message_handler()->HandleNextMessage() != MessageHandler::kOK) {
-    Dart_Handle error = Api::NewHandle(T, T->sticky_error());
-    T->clear_sticky_error();
-    return error;
+    return Api::NewHandle(T, T->StealStickyError());
   }
   return Api::Success();
 }
@@ -1657,7 +1673,7 @@
     const Error* error;
     {
       NoSafepointScope no_safepoint;
-      RawError* raw_error = T->get_and_clear_sticky_error();
+      RawError* raw_error = T->StealStickyError();
       T->UnwindScopes(T->top_exit_frame_info());
       error = &Error::Handle(T->zone(), raw_error);
     }
@@ -1763,34 +1779,15 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
-  NoSafepointScope no_safepoint_scope;
-  ApiLocalScope* new_scope = thread->api_reusable_scope();
-  if (new_scope == NULL) {
-    new_scope = new ApiLocalScope(thread->api_top_scope(),
-                                  thread->top_exit_frame_info());
-    ASSERT(new_scope != NULL);
-  } else {
-    new_scope->Reinit(thread, thread->api_top_scope(),
-                      thread->top_exit_frame_info());
-    thread->set_api_reusable_scope(NULL);
-  }
-  thread->set_api_top_scope(new_scope);  // New scope is now the top scope.
+  TransitionNativeToVM transition(thread);
+  thread->EnterApiScope();
 }
 
 DART_EXPORT void Dart_ExitScope() {
-  Thread* T = Thread::Current();
-  CHECK_API_SCOPE(T);
-  NoSafepointScope no_safepoint_scope;
-  ApiLocalScope* scope = T->api_top_scope();
-  ApiLocalScope* reusable_scope = T->api_reusable_scope();
-  T->set_api_top_scope(scope->previous());  // Reset top scope to previous.
-  if (reusable_scope == NULL) {
-    scope->Reset(T);  // Reset the old scope which we just exited.
-    T->set_api_reusable_scope(scope);
-  } else {
-    ASSERT(reusable_scope != scope);
-    delete scope;
-  }
+  Thread* thread = Thread::Current();
+  CHECK_API_SCOPE(thread);
+  TransitionNativeToVM transition(thread);
+  thread->ExitApiScope();
 }
 
 DART_EXPORT uint8_t* Dart_ScopeAllocate(intptr_t size) {
@@ -1871,11 +1868,8 @@
     RETURN_TYPE_ERROR(Z, object, Instance);
   }
   CHECK_CALLBACK_STATE(T);
-  Error& malformed_type_error = Error::Handle(Z);
   *value = instance.IsInstanceOf(type_obj, Object::null_type_arguments(),
-                                 Object::null_type_arguments(),
-                                 &malformed_type_error);
-  ASSERT(malformed_type_error.IsNull());  // Type was created from a class.
+                                 Object::null_type_arguments());
   return Api::Success();
 }
 
@@ -1956,6 +1950,18 @@
   return Api::ClassId(object) == kClosureCid;
 }
 
+DART_EXPORT bool Dart_IsTearOff(Dart_Handle object) {
+  DARTSCOPE(Thread::Current());
+  API_TIMELINE_DURATION(T);
+  const Object& obj = Object::Handle(Z, Api::UnwrapHandle(object));
+  if (obj.IsClosure()) {
+    const Closure& closure = Closure::Cast(obj);
+    const Function& func = Function::Handle(Z, closure.function());
+    return func.IsImplicitClosureFunction();
+  }
+  return false;
+}
+
 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) {
   intptr_t cid = Api::ClassId(handle);
   return RawObject::IsTypedDataClassId(cid) ||
@@ -1977,11 +1983,9 @@
         Class::Handle(I->object_store()->future_class());
     ASSERT(!future_class.IsNull());
     const Class& obj_class = Class::Handle(Z, obj.clazz());
-    Error& malformed_type_error = Error::Handle(Z);
-    bool is_future = obj_class.IsSubtypeOf(
-        Object::null_type_arguments(), future_class,
-        Object::null_type_arguments(), &malformed_type_error, NULL, Heap::kNew);
-    ASSERT(malformed_type_error.IsNull());  // Type is a raw Future.
+    bool is_future = Class::IsSubtypeOf(
+        obj_class, Object::null_type_arguments(), future_class,
+        Object::null_type_arguments(), Heap::kNew);
     return is_future;
   }
   return false;
@@ -2146,11 +2150,6 @@
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
   API_TIMELINE_DURATION(thread);
-  if (Smi::IsValid(value)) {
-    NOHANDLESCOPE(thread);
-    return Api::NewHandle(thread, Smi::New(static_cast<intptr_t>(value)));
-  }
-  // Slow path for Mints.
   DARTSCOPE(thread);
   CHECK_CALLBACK_STATE(thread);
   return Api::NewHandle(thread, Integer::New(value));
@@ -2343,7 +2342,7 @@
 
 DART_EXPORT Dart_Handle Dart_StringLength(Dart_Handle str, intptr_t* len) {
   Thread* thread = Thread::Current();
-  CHECK_ISOLATE(thread->isolate());
+  DARTSCOPE(thread);
   ReusableObjectHandleScope reused_obj_handle(thread);
   const String& str_obj = Api::UnwrapStringHandle(reused_obj_handle, str);
   if (str_obj.IsNull()) {
@@ -3691,6 +3690,7 @@
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
+  TransitionNativeToVM transition(thread);
   intptr_t class_id = Api::ClassId(object);
   if (class_id != kByteBufferCid) {
     RETURN_TYPE_ERROR(zone, object, 'ByteBuffer');
@@ -3801,26 +3801,18 @@
 
   Instance& new_object = Instance::Handle(Z);
   if (constructor.IsRedirectingFactory()) {
-    ClassFinalizer::ResolveRedirectingFactory(cls, constructor);
     Type& redirect_type = Type::Handle(constructor.RedirectionType());
     constructor = constructor.RedirectionTarget();
-    if (constructor.IsNull()) {
-      ASSERT(redirect_type.IsMalformed());
-      return Api::NewHandle(T, redirect_type.error());
-    }
+    ASSERT(!constructor.IsNull());
 
     if (!redirect_type.IsInstantiated()) {
       // The type arguments of the redirection type are instantiated from the
       // type arguments of the type argument.
       // We do not support generic constructors.
       ASSERT(redirect_type.IsInstantiated(kFunctions));
-      Error& bound_error = Error::Handle();
       redirect_type ^= redirect_type.InstantiateFrom(
-          type_arguments, Object::null_type_arguments(), kNoneFree,
-          &bound_error, NULL, NULL, Heap::kNew);
-      if (!bound_error.IsNull()) {
-        return Api::NewHandle(T, bound_error.raw());
-      }
+          type_arguments, Object::null_type_arguments(), kNoneFree, NULL,
+          Heap::kNew);
       redirect_type ^= redirect_type.Canonicalize();
     }
 
@@ -4409,38 +4401,6 @@
 
 // --- Native fields and functions ---
 
-DART_EXPORT Dart_Handle Dart_CreateNativeWrapperClass(Dart_Handle library,
-                                                      Dart_Handle name,
-                                                      int field_count) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
-#else
-  DARTSCOPE(Thread::Current());
-  const String& cls_name = Api::UnwrapStringHandle(Z, name);
-  if (cls_name.IsNull()) {
-    RETURN_TYPE_ERROR(Z, name, String);
-  }
-  const Library& lib = Api::UnwrapLibraryHandle(Z, library);
-  if (lib.IsNull()) {
-    RETURN_TYPE_ERROR(Z, library, Library);
-  }
-  if (!Utils::IsUint(16, field_count)) {
-    return Api::NewError(
-        "Invalid field_count passed to Dart_CreateNativeWrapperClass");
-  }
-  CHECK_CALLBACK_STATE(T);
-
-  String& cls_symbol = String::Handle(Z, Symbols::New(T, cls_name));
-  const Class& cls =
-      Class::Handle(Z, Class::NewNativeWrapper(lib, cls_symbol, field_count));
-  if (cls.IsNull()) {
-    return Api::NewError(
-        "Unable to create native wrapper class : already exists");
-  }
-  return Api::NewHandle(T, cls.RareType());
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 DART_EXPORT Dart_Handle Dart_GetNativeInstanceFieldCount(Dart_Handle obj,
                                                          int* count) {
   Thread* thread = Thread::Current();
@@ -4503,6 +4463,7 @@
     const Dart_NativeArgument_Descriptor* argument_descriptors,
     Dart_NativeArgument_Value* arg_values) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  TransitionNativeToVM transition(arguments->thread());
   ASSERT(arguments->thread()->isolate() == Isolate::Current());
   if (arg_values == NULL) {
     RETURN_NULL_ERROR(arg_values);
@@ -4636,6 +4597,7 @@
         "%s: argument 'index' out of range. Expected 0..%d but saw %d.",
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
+  TransitionNativeToVM transition(arguments->thread());
   return Api::NewHandle(arguments->thread(), arguments->NativeArgAt(index));
 }
 
@@ -4665,6 +4627,7 @@
 DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args,
                                                intptr_t* value) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  TransitionNativeToVM transition(arguments->thread());
   ASSERT(arguments->thread()->isolate() == Isolate::Current());
   if (value == NULL) {
     RETURN_NULL_ERROR(value);
@@ -4682,6 +4645,7 @@
                                                      int arg_index,
                                                      void** peer) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  TransitionNativeToVM transition(arguments->thread());
   Dart_Handle result = Api::Null();
   if (!GetNativeStringArgument(arguments, arg_index, &result, peer)) {
     return Api::NewError(
@@ -4752,6 +4716,7 @@
       !Api::IsError(retval)) {
     // Print the current stack trace to make the problematic caller
     // easier to find.
+    TransitionNativeToVM transition(arguments->thread());
     const StackTrace& stacktrace = GetCurrentStackTrace(0);
     OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString());
 
@@ -4831,25 +4796,28 @@
 RawString* Api::CallEnvironmentCallback(Thread* thread, const String& name) {
   Isolate* isolate = thread->isolate();
   Dart_EnvironmentCallback callback = isolate->environment_callback();
-  String& result = String::Handle(thread->zone());
   if (callback != NULL) {
-    TransitionVMToNative transition(thread);
     Scope api_scope(thread);
-    Dart_Handle response = callback(Api::NewHandle(thread, name.raw()));
-    if (::Dart_IsString(response)) {
-      result ^= Api::UnwrapHandle(response);
-    } else if (::Dart_IsError(response)) {
-      const Object& error =
-          Object::Handle(thread->zone(), Api::UnwrapHandle(response));
+    Dart_Handle api_name = Api::NewHandle(thread, name.raw());
+    Dart_Handle api_response;
+    {
+      TransitionVMToNative transition(thread);
+      api_response = callback(api_name);
+    }
+    const Object& response =
+        Object::Handle(thread->zone(), Api::UnwrapHandle(api_response));
+    if (response.IsString()) {
+      return String::Cast(response).raw();
+    } else if (response.IsError()) {
       Exceptions::ThrowArgumentError(
-          String::Handle(String::New(Error::Cast(error).ToErrorCString())));
-    } else if (!::Dart_IsNull(response)) {
+          String::Handle(String::New(Error::Cast(response).ToErrorCString())));
+    } else if (!response.IsNull()) {
       // At this point everything except null are invalid environment values.
       Exceptions::ThrowArgumentError(
           String::Handle(String::New("Illegal environment value")));
     }
   }
-  return result.raw();
+  return String::null();
 }
 
 DART_EXPORT Dart_Handle
@@ -4922,45 +4890,6 @@
   return Api::NewHandle(T, String::New(resolved_uri));
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-// NOTE: Need to pass 'result' as a parameter here in order to avoid
-// warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
-// which shows up because of the use of setjmp.
-static void CompileSource(Thread* thread,
-                          const Library& lib,
-                          const Script& script,
-                          Dart_Handle* result) {
-  bool update_lib_status = (script.kind() == RawScript::kScriptTag ||
-                            script.kind() == RawScript::kLibraryTag);
-  if (update_lib_status) {
-    lib.SetLoadInProgress();
-  }
-  ASSERT(thread != NULL);
-  const Error& error =
-      Error::Handle(thread->zone(), Compiler::Compile(lib, script));
-  if (error.IsNull()) {
-    *result = Api::NewHandle(thread, lib.raw());
-  } else {
-    *result = Api::NewHandle(thread, error.raw());
-    // Compilation errors are not Dart instances, so just mark the library
-    // as having failed to load without providing an error instance.
-    lib.SetLoadError(Object::null_instance());
-  }
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
-DART_EXPORT Dart_Handle Dart_LoadScript(Dart_Handle url,
-                                        Dart_Handle resolved_url,
-                                        Dart_Handle source,
-                                        intptr_t line_offset,
-                                        intptr_t column_offset) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
-#else
-  return Api::NewError("%s: Should not be called in Dart 2", CURRENT_FUNC);
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 DART_EXPORT Dart_Handle Dart_LoadScriptFromKernel(const uint8_t* buffer,
                                                   intptr_t buffer_size) {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -5014,6 +4943,7 @@
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   CHECK_ISOLATE(isolate);
+  TransitionNativeToVM transition(thread);
   return Api::NewHandle(thread, isolate->object_store()->root_library());
 }
 
@@ -5033,7 +4963,15 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   // This is not a completely thorough check that the class is an entry-point,
   // but it catches most missing annotations.
-  RELEASE_ASSERT(klass.has_pragma());
+  if (!klass.has_pragma()) {
+    OS::PrintErr(
+        "ERROR: It is illegal to access class %s through Dart C API "
+        "because it was not annotated with @pragma('vm:entry-point').\n"
+        "ERROR: See "
+        "https://github.com/dart-lang/sdk/blob/master/runtime/docs/compiler/"
+        "aot/entry_point_pragma.md\n",
+        String::Handle(klass.UserVisibleName()).ToCString());
+  }
 #endif
 }
 
@@ -5220,18 +5158,6 @@
   return error_in;
 }
 
-DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle url,
-                                         Dart_Handle resolved_url,
-                                         Dart_Handle source,
-                                         intptr_t line_offset,
-                                         intptr_t column_offset) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
-#else
-  return Api::NewError("%s: Should not be called in Dart 2", CURRENT_FUNC);
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 DART_EXPORT Dart_Handle Dart_LoadLibraryFromKernel(const uint8_t* buffer,
                                                    intptr_t buffer_size) {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -5264,51 +5190,6 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-DART_EXPORT Dart_Handle Dart_LibraryImportLibrary(Dart_Handle library,
-                                                  Dart_Handle import,
-                                                  Dart_Handle prefix) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
-#else
-  DARTSCOPE(Thread::Current());
-  Isolate* I = T->isolate();
-  const Library& library_vm = Api::UnwrapLibraryHandle(Z, library);
-  if (library_vm.IsNull()) {
-    RETURN_TYPE_ERROR(Z, library, Library);
-  }
-  const Library& import_vm = Api::UnwrapLibraryHandle(Z, import);
-  if (import_vm.IsNull()) {
-    RETURN_TYPE_ERROR(Z, import, Library);
-  }
-  const Object& prefix_object = Object::Handle(Z, Api::UnwrapHandle(prefix));
-  const String& prefix_vm =
-      prefix_object.IsNull() ? Symbols::Empty() : String::Cast(prefix_object);
-  if (prefix_vm.IsNull()) {
-    RETURN_TYPE_ERROR(Z, prefix, String);
-  }
-  CHECK_CALLBACK_STATE(T);
-  CHECK_COMPILATION_ALLOWED(I);
-
-  const String& prefix_symbol = String::Handle(Z, Symbols::New(T, prefix_vm));
-  const Namespace& import_ns = Namespace::Handle(
-      Z, Namespace::New(import_vm, Object::null_array(), Object::null_array()));
-  if (prefix_vm.Length() == 0) {
-    library_vm.AddImport(import_ns);
-  } else {
-    LibraryPrefix& library_prefix = LibraryPrefix::Handle();
-    library_prefix = library_vm.LookupLocalLibraryPrefix(prefix_symbol);
-    if (!library_prefix.IsNull()) {
-      library_prefix.AddImport(import_ns);
-    } else {
-      library_prefix =
-          LibraryPrefix::New(prefix_symbol, import_ns, false, library_vm);
-      library_vm.AddObject(library_prefix, prefix_symbol);
-    }
-  }
-  return Api::Success();
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 DART_EXPORT Dart_Handle Dart_GetImportsOfScheme(Dart_Handle scheme) {
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
@@ -5344,94 +5225,6 @@
   return Api::NewHandle(T, Array::MakeFixedLength(result));
 }
 
-DART_EXPORT Dart_Handle Dart_LoadSource(Dart_Handle library,
-                                        Dart_Handle url,
-                                        Dart_Handle resolved_url,
-                                        Dart_Handle source,
-                                        intptr_t line_offset,
-                                        intptr_t column_offset) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
-#else
-  DARTSCOPE(Thread::Current());
-  API_TIMELINE_DURATION(T);
-  Isolate* I = T->isolate();
-  const Library& lib = Api::UnwrapLibraryHandle(Z, library);
-  if (lib.IsNull()) {
-    RETURN_TYPE_ERROR(Z, library, Library);
-  }
-  const String& url_str = Api::UnwrapStringHandle(Z, url);
-  if (url_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, url, String);
-  }
-  if (::Dart_IsNull(resolved_url)) {
-    resolved_url = url;
-  }
-  const String& resolved_url_str = Api::UnwrapStringHandle(Z, resolved_url);
-  if (resolved_url_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, resolved_url, String);
-  }
-  const String& source_str = Api::UnwrapStringHandle(Z, source);
-  if (source_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, source, String);
-  }
-  if (line_offset < 0) {
-    return Api::NewError("%s: argument 'line_offset' must be positive number",
-                         CURRENT_FUNC);
-  }
-  if (column_offset < 0) {
-    return Api::NewError("%s: argument 'column_offset' must be positive number",
-                         CURRENT_FUNC);
-  }
-  CHECK_CALLBACK_STATE(T);
-  CHECK_COMPILATION_ALLOWED(I);
-
-  NoHeapGrowthControlScope no_growth_control;
-
-  const Script& script =
-      Script::Handle(Z, Script::New(url_str, resolved_url_str, source_str,
-                                    RawScript::kSourceTag));
-  script.SetLocationOffset(line_offset, column_offset);
-  Dart_Handle result;
-  CompileSource(T, lib, script, &result);
-  return result;
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
-DART_EXPORT Dart_Handle Dart_LibraryLoadPatch(Dart_Handle library,
-                                              Dart_Handle url,
-                                              Dart_Handle patch_source) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
-#else
-  DARTSCOPE(Thread::Current());
-  API_TIMELINE_DURATION(T);
-  Isolate* I = T->isolate();
-  const Library& lib = Api::UnwrapLibraryHandle(Z, library);
-  if (lib.IsNull()) {
-    RETURN_TYPE_ERROR(Z, library, Library);
-  }
-  const String& url_str = Api::UnwrapStringHandle(Z, url);
-  if (url_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, url, String);
-  }
-  const String& source_str = Api::UnwrapStringHandle(Z, patch_source);
-  if (source_str.IsNull()) {
-    RETURN_TYPE_ERROR(Z, patch_source, String);
-  }
-  CHECK_CALLBACK_STATE(T);
-  CHECK_COMPILATION_ALLOWED(I);
-
-  NoHeapGrowthControlScope no_growth_control;
-
-  const Script& script = Script::Handle(
-      Z, Script::New(url_str, url_str, source_str, RawScript::kPatchTag));
-  Dart_Handle result;
-  CompileSource(T, lib, script, &result);
-  return result;
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-}
-
 // Finalizes classes and invokes Dart core library function that completes
 // futures of loadLibrary calls (deferred library loading).
 DART_EXPORT Dart_Handle Dart_FinalizeLoading(bool complete_futures) {
@@ -5613,6 +5406,8 @@
                      intptr_t platform_kernel_size,
                      bool incremental_compile,
                      const char* package_config) {
+  API_TIMELINE_DURATION(Thread::Current());
+
   Dart_KernelCompilationResult result;
 #if defined(DART_PRECOMPILED_RUNTIME)
   result.status = Dart_KernelCompilationStatus_Unknown;
@@ -5718,6 +5513,12 @@
   return NULL;
 }
 
+DART_EXPORT void Dart_SetNativeServiceStreamCallback(
+    Dart_NativeStreamConsumer consumer,
+    const char* stream_id) {
+  return;
+}
+
 DART_EXPORT Dart_Handle Dart_ServiceSendDataEvent(const char* stream_id,
                                                   const char* event_kind,
                                                   const uint8_t* bytes,
@@ -5822,6 +5623,12 @@
   return NULL;
 }
 
+DART_EXPORT void Dart_SetNativeServiceStreamCallback(
+    Dart_NativeStreamConsumer consumer,
+    const char* stream_id) {
+  Service::SetNativeServiceStreamCallback(consumer, stream_id);
+}
+
 DART_EXPORT Dart_Handle Dart_ServiceSendDataEvent(const char* stream_id,
                                                   const char* event_kind,
                                                   const uint8_t* bytes,
@@ -6115,6 +5922,29 @@
 }
 
 DART_EXPORT
+Dart_Handle Dart_SaveTypeFeedback(uint8_t** buffer, intptr_t* buffer_length) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
+#else
+  Thread* thread = Thread::Current();
+  API_TIMELINE_DURATION(thread);
+  DARTSCOPE(thread);
+  CHECK_NULL(buffer);
+  CHECK_NULL(buffer_length);
+
+  WriteStream stream(buffer, ApiReallocate, MB);
+  TypeFeedbackSaver saver(&stream);
+  saver.WriteHeader();
+  saver.SaveClasses();
+  saver.SaveFields();
+  ProgramVisitor::VisitFunctions(&saver);
+  *buffer_length = stream.bytes_written();
+
+  return Api::Success();
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+}
+
+DART_EXPORT
 Dart_Handle Dart_LoadCompilationTrace(uint8_t* buffer, intptr_t buffer_length) {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
@@ -6133,6 +5963,25 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
+DART_EXPORT
+Dart_Handle Dart_LoadTypeFeedback(uint8_t* buffer, intptr_t buffer_length) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
+#else
+  Thread* thread = Thread::Current();
+  API_TIMELINE_DURATION(thread);
+  DARTSCOPE(thread);
+  CHECK_NULL(buffer);
+  ReadStream stream(buffer, buffer_length);
+  TypeFeedbackLoader loader(thread);
+  const Object& error = Object::Handle(loader.LoadFeedback(&stream));
+  if (error.IsError()) {
+    return Api::NewHandle(T, Error::Cast(error).raw());
+  }
+  return Api::Success();
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+}
+
 DART_EXPORT Dart_Handle Dart_SortClasses() {
 #if defined(DART_PRECOMPILED_RUNTIME)
   return Api::NewError("%s: Cannot compile on an AOT runtime.", CURRENT_FUNC);
@@ -6202,7 +6051,7 @@
 
   NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
                                             "WriteAppAOTSnapshot"));
-  AssemblyImageWriter image_writer(callback, callback_data, NULL, NULL);
+  AssemblyImageWriter image_writer(T, callback, callback_data, NULL, NULL);
   uint8_t* vm_snapshot_data_buffer = NULL;
   uint8_t* isolate_snapshot_data_buffer = NULL;
   FullSnapshotWriter writer(Snapshot::kFullAOT, &vm_snapshot_data_buffer,
@@ -6235,7 +6084,7 @@
 
   NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
                                             "WriteVMAOTSnapshot"));
-  AssemblyImageWriter image_writer(callback, callback_data, NULL, NULL);
+  AssemblyImageWriter image_writer(T, callback, callback_data, NULL, NULL);
   uint8_t* vm_snapshot_data_buffer = NULL;
   FullSnapshotWriter writer(Snapshot::kFullAOT, &vm_snapshot_data_buffer, NULL,
                             ApiReallocate, &image_writer, NULL);
@@ -6291,12 +6140,15 @@
 
   NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
                                             "WriteAppAOTSnapshot"));
-  BlobImageWriter vm_image_writer(vm_snapshot_instructions_buffer,
+  BlobImageWriter vm_image_writer(T, vm_snapshot_instructions_buffer,
                                   ApiReallocate, 2 * MB /* initial_size */,
-                                  NULL, NULL);
+                                  /*shared_objects=*/nullptr,
+                                  /*shared_instructions=*/nullptr,
+                                  /*reused_objects=*/nullptr);
   BlobImageWriter isolate_image_writer(
-      isolate_snapshot_instructions_buffer, ApiReallocate,
-      2 * MB /* initial_size */, shared_data_image, shared_instructions_image);
+      T, isolate_snapshot_instructions_buffer, ApiReallocate,
+      2 * MB /* initial_size */, shared_data_image, shared_instructions_image,
+      /* reuse_instructions= */ nullptr);
   FullSnapshotWriter writer(Snapshot::kFullAOT, vm_snapshot_data_buffer,
                             isolate_snapshot_data_buffer, ApiReallocate,
                             &vm_image_writer, &isolate_image_writer);
@@ -6312,6 +6164,52 @@
 #endif
 }
 
+#if (!defined(TARGET_ARCH_IA32) && !defined(DART_PRECOMPILED_RUNTIME))
+
+// Any flag that affects how we compile code might cause a problem when the
+// snapshot writer generates code with one value of the flag and the snapshot
+// reader expects code to behave according to another value of the flag.
+// Normally, we add these flags to Dart::FeaturesString and refuse to run the
+// snapshot it they don't match, but since --interpret-irregexp affects only
+// 2 functions we choose to remove the code instead. See issue #34422.
+static void DropRegExpMatchCode(Zone* zone) {
+  const String& execute_match_name =
+      String::Handle(zone, String::New("_ExecuteMatch"));
+  const String& execute_match_sticky_name =
+      String::Handle(zone, String::New("_ExecuteMatchSticky"));
+
+  const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
+  const Class& reg_exp_class =
+      Class::Handle(zone, core_lib.LookupClassAllowPrivate(Symbols::_RegExp()));
+  ASSERT(!reg_exp_class.IsNull());
+
+  Function& func = Function::Handle(
+      zone, reg_exp_class.LookupFunctionAllowPrivate(execute_match_name));
+  ASSERT(!func.IsNull());
+  Code& code = Code::Handle(zone);
+  if (func.HasCode()) {
+    code ^= func.CurrentCode();
+    ASSERT(!code.IsNull());
+    code.DisableDartCode();
+  }
+  func.ClearCode();
+  func.ClearICDataArray();
+  ASSERT(!func.HasCode());
+
+  func ^= reg_exp_class.LookupFunctionAllowPrivate(execute_match_sticky_name);
+  ASSERT(!func.IsNull());
+  if (func.HasCode()) {
+    code ^= func.CurrentCode();
+    ASSERT(!code.IsNull());
+    code.DisableDartCode();
+  }
+  func.ClearCode();
+  func.ClearICDataArray();
+  ASSERT(!func.HasCode());
+}
+
+#endif  // (!defined(TARGET_ARCH_IA32) && !defined(DART_PRECOMPILED_RUNTIME))
+
 DART_EXPORT Dart_Handle Dart_CreateCoreJITSnapshotAsBlobs(
     uint8_t** vm_snapshot_data_buffer,
     intptr_t* vm_snapshot_data_size,
@@ -6347,18 +6245,23 @@
     return state;
   }
   BackgroundCompiler::Stop(I);
+  DropRegExpMatchCode(Z);
 
   ProgramVisitor::Dedup();
   Symbols::Compact(I);
 
   NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
                                             "WriteCoreJITSnapshot"));
-  BlobImageWriter vm_image_writer(vm_snapshot_instructions_buffer,
+  BlobImageWriter vm_image_writer(T, vm_snapshot_instructions_buffer,
                                   ApiReallocate, 2 * MB /* initial_size */,
-                                  NULL, NULL);
-  BlobImageWriter isolate_image_writer(isolate_snapshot_instructions_buffer,
+                                  /*shared_objects=*/nullptr,
+                                  /*shared_instructions=*/nullptr,
+                                  /*reused_objects=*/nullptr);
+  BlobImageWriter isolate_image_writer(T, isolate_snapshot_instructions_buffer,
                                        ApiReallocate, 2 * MB /* initial_size */,
-                                       NULL, NULL);
+                                       /*shared_objects=*/nullptr,
+                                       /*shared_instructions=*/nullptr,
+                                       /*reused_objects=*/nullptr);
   FullSnapshotWriter writer(Snapshot::kFullJIT, vm_snapshot_data_buffer,
                             isolate_snapshot_data_buffer, ApiReallocate,
                             &vm_image_writer, &isolate_image_writer);
@@ -6402,6 +6305,7 @@
     return state;
   }
   BackgroundCompiler::Stop(I);
+  DropRegExpMatchCode(Z);
 
   if (reused_instructions) {
     DropCodeWithoutReusableInstructions(reused_instructions);
@@ -6409,11 +6313,19 @@
   ProgramVisitor::Dedup();
   Symbols::Compact(I);
 
+  if (FLAG_dump_tables) {
+    Symbols::DumpTable(I);
+    DumpTypeTable(I);
+    DumpTypeArgumentsTable(I);
+  }
+
   NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(),
                                             "WriteAppJITSnapshot"));
-  BlobImageWriter isolate_image_writer(isolate_snapshot_instructions_buffer,
+  BlobImageWriter isolate_image_writer(T, isolate_snapshot_instructions_buffer,
                                        ApiReallocate, 2 * MB /* initial_size */,
-                                       NULL, NULL, reused_instructions);
+                                       /*shared_objects=*/nullptr,
+                                       /*shared_instructions=*/nullptr,
+                                       reused_instructions);
   FullSnapshotWriter writer(Snapshot::kFullJIT, NULL,
                             isolate_snapshot_data_buffer, ApiReallocate, NULL,
                             &isolate_image_writer);
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index e6a1361..8d91094 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -131,12 +131,12 @@
 class Api : AllStatic {
  public:
   // Create on the stack to provide a new throw-safe api scope.
-  class Scope : public StackResource {
+  class Scope : public ThreadStackResource {
    public:
-    explicit Scope(Thread* thread) : StackResource(thread) {
-      Dart_EnterScope();
+    explicit Scope(Thread* thread) : ThreadStackResource(thread) {
+      thread->EnterApiScope();
     }
-    ~Scope() { Dart_ExitScope(); }
+    ~Scope() { thread()->ExitApiScope(); }
 
    private:
     DISALLOW_COPY_AND_ASSIGN(Scope);
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 995a437..3a3c425 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -671,7 +671,11 @@
 }
 
 TEST_CASE(DartAPI_Error) {
-  Dart_Handle error = Api::NewError("An %s", "error");
+  Dart_Handle error;
+  {
+    TransitionNativeToVM transition(thread);
+    error = Api::NewError("An %s", "error");
+  }
   EXPECT(Dart_IsError(error));
   EXPECT_STREQ("An error", Dart_GetError(error));
 }
@@ -728,7 +732,6 @@
   // Non-instance objects.
   {
     CHECK_API_SCOPE(thread);
-    HANDLESCOPE(thread);
     Dart_Handle lib1 = Dart_LookupLibrary(dart_core);
     Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors);
 
@@ -780,15 +783,21 @@
   Dart_Handle type = Dart_InstanceGetType(Dart_Null());
   EXPECT_VALID(type);
   EXPECT(Dart_IsType(type));
-  const Type& null_type_obj = Api::UnwrapTypeHandle(zone, type);
-  EXPECT(null_type_obj.raw() == Type::NullType());
+  {
+    TransitionNativeToVM transition(thread);
+    const Type& null_type_obj = Api::UnwrapTypeHandle(zone, type);
+    EXPECT(null_type_obj.raw() == Type::NullType());
+  }
 
   Dart_Handle instance = Dart_True();
   type = Dart_InstanceGetType(instance);
   EXPECT_VALID(type);
   EXPECT(Dart_IsType(type));
-  const Type& bool_type_obj = Api::UnwrapTypeHandle(zone, type);
-  EXPECT(bool_type_obj.raw() == Type::BoolType());
+  {
+    TransitionNativeToVM transition(thread);
+    const Type& bool_type_obj = Api::UnwrapTypeHandle(zone, type);
+    EXPECT(bool_type_obj.raw() == Type::BoolType());
+  }
 
   // Errors propagate.
   Dart_Handle error = Dart_NewApiError("MyError");
@@ -852,6 +861,60 @@
   EXPECT_STREQ(url, lib_url);
 }
 
+TEST_CASE(DartAPI_IsTearOff) {
+  const char* kScriptChars =
+      "int getInt() { return 1; }\n"
+      "getTearOff() => getInt;\n"
+      "Function foo = () { print('baz'); };\n"
+      "class Baz {\n"
+      "  static int foo() => 42;\n"
+      "  getTearOff() => bar;\n"
+      "  int bar() => 24;\n"
+      "}\n"
+      "Baz getBaz() => Baz();\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+
+  // Check tear-off of top-level static method.
+  Dart_Handle get_tear_off = Dart_GetField(lib, NewString("getTearOff"));
+  EXPECT_VALID(get_tear_off);
+  EXPECT(Dart_IsTearOff(get_tear_off));
+  Dart_Handle tear_off = Dart_InvokeClosure(get_tear_off, 0, NULL);
+  EXPECT_VALID(tear_off);
+  EXPECT(Dart_IsTearOff(tear_off));
+
+  // Check anonymous closures are not considered tear-offs.
+  Dart_Handle anonymous_closure = Dart_GetField(lib, NewString("foo"));
+  EXPECT_VALID(anonymous_closure);
+  EXPECT(!Dart_IsTearOff(anonymous_closure));
+
+  Dart_Handle baz_cls = Dart_GetClass(lib, NewString("Baz"));
+  EXPECT_VALID(baz_cls);
+
+  // Check tear-off for a static method in a class.
+  Dart_Handle closure =
+      Dart_GetStaticMethodClosure(lib, baz_cls, NewString("foo"));
+  EXPECT_VALID(closure);
+  EXPECT(Dart_IsTearOff(closure));
+
+  // Flutter will use Dart_IsTearOff in conjunction with Dart_ClosureFunction
+  // and Dart_FunctionIsStatic to prevent anonymous closures from being used to
+  // generate callback handles. We'll test that case here, just to be sure.
+  Dart_Handle function = Dart_ClosureFunction(closure);
+  EXPECT_VALID(function);
+  bool is_static = false;
+  Dart_Handle result = Dart_FunctionIsStatic(function, &is_static);
+  EXPECT_VALID(result);
+  EXPECT(is_static);
+
+  // Check tear-off for an instance method in a class.
+  Dart_Handle instance = Dart_Invoke(lib, NewString("getBaz"), 0, NULL);
+  EXPECT_VALID(instance);
+  closure = Dart_Invoke(instance, NewString("getTearOff"), 0, NULL);
+  EXPECT_VALID(closure);
+  EXPECT(Dart_IsTearOff(closure));
+}
+
 TEST_CASE(DartAPI_FunctionIsStatic) {
   const char* kScriptChars =
       "int getInt() { return 1; }\n"
@@ -872,8 +935,6 @@
   EXPECT_VALID(result);
   EXPECT(is_static);
 
-  // TODO(bkonyi): uncomment when issue 33417 is resolved.
-  /*
   Dart_Handle klass = Dart_GetType(lib, NewString("Foo"), 0, NULL);
   EXPECT_VALID(klass);
 
@@ -889,7 +950,6 @@
   result = Dart_FunctionIsStatic(closure, &is_static);
   EXPECT_VALID(result);
   EXPECT(!is_static);
-*/
 }
 
 TEST_CASE(DartAPI_ClosureFunction) {
@@ -1470,6 +1530,7 @@
     EXPECT_VALID(small16);
     {
       CHECK_API_SCOPE(thread);
+      TransitionNativeToVM transition(thread);
       HANDLESCOPE(thread);
       String& handle = String::Handle();
       handle ^= Api::UnwrapHandle(big8);
@@ -1500,6 +1561,7 @@
     EXPECT_VALID(small);
     {
       CHECK_API_SCOPE(thread);
+      TransitionNativeToVM transition(thread);
       HANDLESCOPE(thread);
       ExternalTypedData& handle = ExternalTypedData::Handle();
       handle ^= Api::UnwrapHandle(big);
@@ -2703,12 +2765,10 @@
   Dart_EnterScope();
   {
     EXPECT(thread->api_top_scope() != NULL);
+    TransitionNativeToVM transition(thread);
     HANDLESCOPE(thread);
     String& str1 = String::Handle();
-    {
-      TransitionNativeToVM transition(thread);
-      str1 = String::New("Test String");
-    }
+    str1 = String::New("Test String");
     Dart_Handle ref = Api::NewHandle(thread, str1.raw());
     String& str2 = String::Handle();
     str2 ^= Api::UnwrapHandle(ref);
@@ -2733,7 +2793,6 @@
   Dart_EnterScope();
   {
     CHECK_API_SCOPE(thread);
-    HANDLESCOPE(thread);
     Dart_Handle ref1 = Dart_NewStringFromCString(kTestString1);
     for (int i = 0; i < 1000; i++) {
       handles[i] = Dart_NewPersistentHandle(ref1);
@@ -2757,6 +2816,7 @@
   }
   Dart_ExitScope();
   {
+    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     for (int i = 0; i < 500; i++) {
@@ -2796,7 +2856,6 @@
   EXPECT(state != NULL);
   Thread* thread = Thread::Current();
   CHECK_API_SCOPE(thread);
-  HANDLESCOPE(thread);
 
   // Start with a known persistent handle.
   Dart_PersistentHandle obj1 = Dart_NewPersistentHandle(Dart_True());
@@ -2824,25 +2883,33 @@
 
   Thread* T = Thread::Current();
   CHECK_API_SCOPE(T);
-  HANDLESCOPE(T);
   Isolate* isolate = T->isolate();
   EXPECT(isolate != NULL);
   ApiState* state = isolate->api_state();
   EXPECT(state != NULL);
-  String& str = String::Handle();
 
   // Start with a known persistent handle.
   Dart_Handle ref1 = Dart_NewStringFromCString(kTestString1);
   Dart_PersistentHandle obj = Dart_NewPersistentHandle(ref1);
   EXPECT(state->IsValidPersistentHandle(obj));
-  str ^= PersistentHandle::Cast(obj)->raw();
-  EXPECT(str.Equals(kTestString1));
+  {
+    TransitionNativeToVM transition(T);
+    HANDLESCOPE(T);
+    String& str = String::Handle();
+    str ^= PersistentHandle::Cast(obj)->raw();
+    EXPECT(str.Equals(kTestString1));
+  }
 
   // Now create another local handle and assign it to the persistent handle.
   Dart_Handle ref2 = Dart_NewStringFromCString(kTestString2);
   Dart_SetPersistentHandle(obj, ref2);
-  str ^= PersistentHandle::Cast(obj)->raw();
-  EXPECT(str.Equals(kTestString2));
+  {
+    TransitionNativeToVM transition(T);
+    HANDLESCOPE(T);
+    String& str = String::Handle();
+    str ^= PersistentHandle::Cast(obj)->raw();
+    EXPECT(str.Equals(kTestString2));
+  }
 
   // Now assign Null to the persistent handle and check.
   Dart_SetPersistentHandle(obj, Dart_Null());
@@ -3168,6 +3235,7 @@
     // external size charged to old space.
     {
       CHECK_API_SCOPE(thread);
+      TransitionNativeToVM transition(thread);
       HANDLESCOPE(thread);
       String& handle = String::Handle(thread->zone());
       handle ^= Api::UnwrapHandle(obj);
@@ -3273,7 +3341,6 @@
   Dart_EnterScope();
   {
     CHECK_API_SCOPE(thread);
-    HANDLESCOPE(thread);
 
     Dart_Handle local = AllocateOldString("strongly reachable");
     strong = Dart_NewPersistentHandle(local);
@@ -3337,7 +3404,6 @@
   Dart_EnterScope();
   {
     CHECK_API_SCOPE(thread);
-    HANDLESCOPE(thread);
 
     Dart_Handle local = AllocateOldString("strongly reachable");
     strong = Dart_NewPersistentHandle(local);
@@ -3405,43 +3471,54 @@
   Dart_Handle handles[300];
   {
     StackZone zone(thread);
+    TransitionNativeToVM transition1(thread);
     HANDLESCOPE(thread);
     Smi& val = Smi::Handle();
+    TransitionVMToNative transition2(thread);
 
     // Start a new scope and allocate some local handles.
     Dart_EnterScope();
-    for (int i = 0; i < 100; i++) {
-      handles[i] = Api::NewHandle(thread, Smi::New(i));
-    }
-    EXPECT_EQ(100, thread->CountLocalHandles());
-    for (int i = 0; i < 100; i++) {
-      val ^= Api::UnwrapHandle(handles[i]);
-      EXPECT_EQ(i, val.Value());
+    {
+      TransitionNativeToVM transition3(thread);
+      for (int i = 0; i < 100; i++) {
+        handles[i] = Api::NewHandle(thread, Smi::New(i));
+      }
+      EXPECT_EQ(100, thread->CountLocalHandles());
+      for (int i = 0; i < 100; i++) {
+        val ^= Api::UnwrapHandle(handles[i]);
+        EXPECT_EQ(i, val.Value());
+      }
     }
     // Start another scope and allocate some more local handles.
     {
       Dart_EnterScope();
-      for (int i = 100; i < 200; i++) {
-        handles[i] = Api::NewHandle(thread, Smi::New(i));
-      }
-      EXPECT_EQ(200, thread->CountLocalHandles());
-      for (int i = 100; i < 200; i++) {
-        val ^= Api::UnwrapHandle(handles[i]);
-        EXPECT_EQ(i, val.Value());
+      {
+        TransitionNativeToVM transition3(thread);
+        for (int i = 100; i < 200; i++) {
+          handles[i] = Api::NewHandle(thread, Smi::New(i));
+        }
+        EXPECT_EQ(200, thread->CountLocalHandles());
+        for (int i = 100; i < 200; i++) {
+          val ^= Api::UnwrapHandle(handles[i]);
+          EXPECT_EQ(i, val.Value());
+        }
       }
 
       // Start another scope and allocate some more local handles.
       {
         Dart_EnterScope();
-        for (int i = 200; i < 300; i++) {
-          handles[i] = Api::NewHandle(thread, Smi::New(i));
+        {
+          TransitionNativeToVM transition3(thread);
+          for (int i = 200; i < 300; i++) {
+            handles[i] = Api::NewHandle(thread, Smi::New(i));
+          }
+          EXPECT_EQ(300, thread->CountLocalHandles());
+          for (int i = 200; i < 300; i++) {
+            val ^= Api::UnwrapHandle(handles[i]);
+            EXPECT_EQ(i, val.Value());
+          }
+          EXPECT_EQ(300, thread->CountLocalHandles());
         }
-        EXPECT_EQ(300, thread->CountLocalHandles());
-        for (int i = 200; i < 300; i++) {
-          val ^= Api::UnwrapHandle(handles[i]);
-          EXPECT_EQ(i, val.Value());
-        }
-        EXPECT_EQ(300, thread->CountLocalHandles());
         VERIFY_ON_TRANSITION;
         Dart_ExitScope();
       }
@@ -3568,9 +3645,7 @@
   // Create an isolate with checked mode flags.
   Dart_IsolateFlags api_flags;
   Isolate::FlagsInitialize(&api_flags);
-  api_flags.enable_type_checks = true;
   api_flags.enable_asserts = true;
-  api_flags.enable_error_on_bad_type = true;
   char* err;
   Dart_Isolate isolate =
       Dart_CreateIsolate(NULL, NULL, bin::core_isolate_snapshot_data,
@@ -4158,6 +4233,16 @@
   EXPECT_STREQ("myerror", Dart_GetError(result));
 }
 
+TEST_CASE(DartAPI_SetField_BadType) {
+  const char* kScriptChars = "int foo;\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle name = NewString("foo");
+  Dart_Handle result = Dart_SetField(lib, name, Dart_True());
+  EXPECT(Dart_IsError(result));
+  EXPECT_SUBSTRING("type 'bool' is not a subtype of type 'int' of 'foo'",
+                   Dart_GetError(result));
+}
+
 void NativeFieldLookup(Dart_NativeArguments args) {
   UNREACHABLE();
 }
@@ -4221,6 +4306,7 @@
   result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
   EXPECT_VALID(result);
   CHECK_API_SCOPE(thread);
+  TransitionNativeToVM transition(thread);
   HANDLESCOPE(thread);
   Instance& obj = Instance::Handle();
   obj ^= Api::UnwrapHandle(result);
@@ -4302,6 +4388,7 @@
                                                          bool* auto_scope) {
   ASSERT(auto_scope != NULL);
   *auto_scope = true;
+  TransitionNativeToVM transition(Thread::Current());
   const Object& obj = Object::Handle(Api::UnwrapHandle(name));
   if (!obj.IsString()) {
     return NULL;
@@ -4494,7 +4581,6 @@
       "}\n";
   Dart_Handle result;
   CHECK_API_SCOPE(thread);
-  HANDLESCOPE(thread);
 
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
@@ -5141,6 +5227,88 @@
   EXPECT_STREQ("myerror", Dart_GetError(result));
 }
 
+TEST_CASE(DartAPI_Invoke_BadArgs) {
+  const char* kScriptChars =
+      "class BaseMethods {\n"
+      "  inheritedMethod(int arg) => 'inherited $arg';\n"
+      "  static nonInheritedMethod(int arg) => 'noninherited $arg';\n"
+      "}\n"
+      "\n"
+      "class Methods extends BaseMethods {\n"
+      "  instanceMethod(int arg) => 'instance $arg';\n"
+      "  _instanceMethod(int arg) => 'hidden instance $arg';\n"
+      "  static staticMethod(int arg) => 'static $arg';\n"
+      "  static _staticMethod(int arg) => 'hidden static $arg';\n"
+      "}\n"
+      "\n"
+      "topMethod(int arg) => 'top $arg';\n"
+      "_topMethod(int arg) => 'hidden top $arg';\n"
+      "\n"
+      "Methods test() {\n"
+      "  return new Methods();\n"
+      "}\n";
+
+#if defined(PRODUCT)
+  const char* error_msg =
+      "type '_OneByteString' is not a subtype of type 'int' of 'arg'";
+#else
+  const char* error_msg =
+      "type 'String' is not a subtype of type 'int' of 'arg'";
+#endif  // defined(PRODUCT)
+
+  // Shared setup.
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  Dart_Handle type = Dart_GetType(lib, NewString("Methods"), 0, NULL);
+  EXPECT_VALID(type);
+  Dart_Handle instance = Dart_Invoke(lib, NewString("test"), 0, NULL);
+  EXPECT_VALID(instance);
+  Dart_Handle args[1];
+  args[0] = NewString("!!!");
+  Dart_Handle result;
+  Dart_Handle name;
+
+  // Instance method.
+  name = NewString("instanceMethod");
+  result = Dart_Invoke(instance, name, 1, args);
+  EXPECT(Dart_IsError(result));
+  EXPECT_SUBSTRING(error_msg, Dart_GetError(result));
+
+  name = PrivateLibName(lib, "_instanceMethod");
+  result = Dart_Invoke(instance, name, 1, args);
+  EXPECT(Dart_IsError(result));
+  EXPECT_SUBSTRING(error_msg, Dart_GetError(result));
+
+  // Inherited method.
+  name = NewString("inheritedMethod");
+  result = Dart_Invoke(instance, name, 1, args);
+  EXPECT(Dart_IsError(result));
+  EXPECT_SUBSTRING(error_msg, Dart_GetError(result));
+
+  // Static method.
+  name = NewString("staticMethod");
+  result = Dart_Invoke(type, name, 1, args);
+  EXPECT(Dart_IsError(result));
+  EXPECT_SUBSTRING(error_msg, Dart_GetError(result));
+
+  // Hidden static method.
+  name = NewString("_staticMethod");
+  result = Dart_Invoke(type, name, 1, args);
+  EXPECT(Dart_IsError(result));
+  EXPECT_SUBSTRING(error_msg, Dart_GetError(result));
+
+  // Top-Level method.
+  name = NewString("topMethod");
+  result = Dart_Invoke(lib, name, 1, args);
+  EXPECT(Dart_IsError(result));
+  EXPECT_SUBSTRING(error_msg, Dart_GetError(result));
+
+  // Hidden top-level method.
+  name = NewString("_topMethod");
+  result = Dart_Invoke(lib, name, 1, args);
+  EXPECT(Dart_IsError(result));
+  EXPECT_SUBSTRING(error_msg, Dart_GetError(result));
+}
+
 TEST_CASE(DartAPI_Invoke_Null) {
   Dart_Handle result = Dart_Invoke(Dart_Null(), NewString("toString"), 0, NULL);
   EXPECT_VALID(result);
@@ -5259,7 +5427,6 @@
       "}\n";
   Dart_Handle result;
   CHECK_API_SCOPE(thread);
-  HANDLESCOPE(thread);
 
   // Create a test library and Load up a test script in it.
   Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
@@ -5464,6 +5631,7 @@
 static Dart_NativeFunction native_args_lookup(Dart_Handle name,
                                               int argument_count,
                                               bool* auto_scope_setup) {
+  TransitionNativeToVM transition(Thread::Current());
   const Object& obj = Object::Handle(Api::UnwrapHandle(name));
   if (!obj.IsString()) {
     return NULL;
@@ -6059,10 +6227,10 @@
       /* multiroot_filepaths= */ "/bar,/baz",
       /* multiroot_scheme= */ "foo");
   EXPECT_VALID(lib);
-  Library& lib_obj = Library::Handle();
-  lib_obj ^= Api::UnwrapHandle(lib);
   {
     TransitionNativeToVM transition(thread);
+    Library& lib_obj = Library::Handle();
+    lib_obj ^= Api::UnwrapHandle(lib);
     EXPECT_STREQ("foo:///main.dart", String::Handle(lib_obj.url()).ToCString());
     const Array& lib_scripts = Array::Handle(lib_obj.LoadedScripts());
     Script& script = Script::Handle();
@@ -6627,6 +6795,7 @@
                                                    bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = false;
+  TransitionNativeToVM transition(Thread::Current());
   const Object& obj = Object::Handle(Api::UnwrapHandle(name));
   if (!obj.IsString()) {
     return NULL;
@@ -6766,6 +6935,7 @@
     bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = false;
+  TransitionNativeToVM transition(Thread::Current());
   const Object& obj = Object::Handle(Api::UnwrapHandle(name));
   if (!obj.IsString()) {
     return NULL;
@@ -6972,7 +7142,6 @@
   Dart_EnterScope();
   {
     CHECK_API_SCOPE(thread);
-    HANDLESCOPE(thread);
     Dart_Handle str = NewString("a string");
     EXPECT_VALID(str);
     EXPECT(Dart_IsString(str));
@@ -7050,7 +7219,6 @@
   Dart_EnterScope();
   {
     CHECK_API_SCOPE(thread);
-    HANDLESCOPE(thread);
     Dart_Handle s1 = NewString("s1");
     EXPECT_VALID(s1);
     EXPECT(Dart_IsString(s1));
@@ -7142,6 +7310,7 @@
   }
   {
     CHECK_API_SCOPE(thread);
+    TransitionNativeToVM transition(thread);
     HANDLESCOPE(thread);
     String& handle = String::Handle();
     handle ^= Api::UnwrapHandle(str);
@@ -7198,7 +7367,6 @@
   {
     Thread* T = Thread::Current();
     CHECK_API_SCOPE(T);
-    HANDLESCOPE(T);
     Dart_Handle str = AllocateOldString("str");
     EXPECT_VALID(str);
     EXPECT(Dart_IsString(str));
@@ -7280,7 +7448,6 @@
   {
     Thread* T = Thread::Current();
     CHECK_API_SCOPE(T);
-    HANDLESCOPE(T);
     Dart_Handle s1 = AllocateOldString("s1");
     EXPECT_VALID(s1);
     EXPECT(Dart_IsString(s1));
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 2a5ed7e..a741a5e 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -21,6 +21,7 @@
 namespace dart {
 
 DECLARE_FLAG(bool, enable_interpreter);
+DECLARE_FLAG(bool, precompiled_mode);
 
 // A cache of VM heap allocated arguments descriptors.
 RawArray* ArgumentsDescriptor::cached_args_descriptors_[kCachedDescriptorCount];
@@ -59,9 +60,9 @@
     ASSERT(thread->isolate() == Isolate::Current());
     saved_stack_limit_ = thread->saved_stack_limit();
 #if defined(USING_SIMULATOR)
-    thread->SetStackLimit(Simulator::Current()->stack_limit());
+    thread->SetStackLimit(Simulator::Current()->overflow_stack_limit());
 #else
-    thread->SetStackLimit(OSThread::Current()->stack_limit_with_headroom());
+    thread->SetStackLimit(OSThread::Current()->overflow_stack_limit());
     // TODO(regis): For now, the interpreter is using its own stack limit.
 #endif
 
@@ -92,10 +93,11 @@
 
 // Clears/restores Thread::long_jump_base on construction/destruction.
 // Ensures that we do not attempt to long jump across Dart frames.
-class SuspendLongJumpScope : public StackResource {
+class SuspendLongJumpScope : public ThreadStackResource {
  public:
   explicit SuspendLongJumpScope(Thread* thread)
-      : StackResource(thread), saved_long_jump_base_(thread->long_jump_base()) {
+      : ThreadStackResource(thread),
+        saved_long_jump_base_(thread->long_jump_base()) {
     thread->set_long_jump_base(NULL);
   }
 
@@ -116,11 +118,18 @@
   // We use a kernel2kernel constant evaluator in Dart 2.0 AOT compilation
   // and never start the VM service isolate. So we should never end up invoking
   // any dart code in the Dart 2.0 AOT compiler.
+  if (FLAG_precompiled_mode) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_strong && FLAG_precompiled_mode) {
     UNREACHABLE();
-  }
+#else
+    if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+      Thread* thread = Thread::Current();
+      thread->set_global_object_pool(
+          thread->isolate()->object_store()->global_object_pool());
+      ASSERT(thread->global_object_pool() != Object::null());
+    }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
+  }
 
   ASSERT(!function.IsNull());
 
@@ -167,8 +176,8 @@
 
 // Now Call the invoke stub which will invoke the dart function.
 #if !defined(TARGET_ARCH_DBC)
-  invokestub entrypoint = reinterpret_cast<invokestub>(
-      StubCode::InvokeDartCode_entry()->EntryPoint());
+  invokestub entrypoint =
+      reinterpret_cast<invokestub>(StubCode::InvokeDartCode().EntryPoint());
 #endif
   const Code& code = Code::Handle(zone, function.CurrentCode());
   ASSERT(!code.IsNull());
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 65a6f0d..23342d3 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -86,7 +86,6 @@
   enum {
     kTypeArgsLenIndex,
     kCountIndex,
-
     kPositionalCountIndex,
     kFirstNamedEntryIndex,
   };
diff --git a/runtime/vm/datastream.h b/runtime/vm/datastream.h
index 71e08f4..43f2d64 100644
--- a/runtime/vm/datastream.h
+++ b/runtime/vm/datastream.h
@@ -80,6 +80,12 @@
     current_ = buffer_ + value;
   }
 
+  void Align(intptr_t alignment) {
+    intptr_t position_before = Position();
+    intptr_t position_after = Utils::RoundUp(position_before, alignment);
+    Advance(position_after - position_before);
+  }
+
   const uint8_t* AddressOfCurrentPosition() const { return current_; }
 
   void Advance(intptr_t value) {
@@ -366,7 +372,7 @@
     WriteByte(static_cast<uint8_t>(value + kEndUnsignedByteMarker));
   }
 
-  void WriteBytes(const uint8_t* addr, intptr_t len) {
+  void WriteBytes(const void* addr, intptr_t len) {
     if ((end_ - current_) < len) {
       Resize(len);
     }
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index bbdd04f..1153d2c 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -49,13 +49,6 @@
             "Trace debugger stacktrace collection");
 DEFINE_FLAG(bool, trace_rewind, false, "Trace frame rewind");
 DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
-DEFINE_FLAG(bool,
-            steal_breakpoints,
-            false,
-            "Intercept breakpoints and other pause events before they "
-            "are sent to the embedder and use a generic VM breakpoint "
-            "handler instead.  This handler dispatches breakpoints to "
-            "the VM service.");
 
 DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(bool, trace_deoptimization);
@@ -63,21 +56,6 @@
 
 #ifndef PRODUCT
 
-Debugger::EventHandler* Debugger::event_handler_ = NULL;
-
-class RemoteObjectCache : public ZoneAllocated {
- public:
-  explicit RemoteObjectCache(intptr_t initial_size);
-  intptr_t AddObject(const Object& obj);
-  RawObject* GetObj(intptr_t obj_id) const;
-  bool IsValidId(intptr_t obj_id) const { return obj_id < objs_->Length(); }
-
- private:
-  GrowableObjectArray* objs_;
-
-  DISALLOW_COPY_AND_ASSIGN(RemoteObjectCache);
-};
-
 // Create an unresolved breakpoint in given token range and script.
 BreakpointLocation::BreakpointLocation(const Script& script,
                                        TokenPosition token_pos,
@@ -259,17 +237,11 @@
       deopt_frame_(Array::ZoneHandle(deopt_frame.raw())),
       deopt_frame_offset_(deopt_frame_offset),
       kind_(kind),
-#if !defined(DART_PRECOMPILED_RUNTIME)
-      is_interpreted_(FLAG_enable_interpreter &&
-                      function_.Bytecode() == code_.raw()),
-#else
-      is_interpreted_(false),
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+      is_interpreted_(false),  // TODO(regis): No bytecode debugging support.
       vars_initialized_(false),
       var_descriptors_(LocalVarDescriptors::ZoneHandle()),
       desc_indices_(8),
-      pc_desc_(PcDescriptors::ZoneHandle()) {
-}
+      pc_desc_(PcDescriptors::ZoneHandle()) {}
 
 ActivationFrame::ActivationFrame(Kind kind)
     : pc_(0),
@@ -318,47 +290,26 @@
       pc_desc_(PcDescriptors::ZoneHandle()) {
   // Extract the function and the code from the asynchronous activation.
   function_ = async_activation.function();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  // TODO(regis): Revise debugger functionality when running a mix of
-  // interpreted and compiled code.
-  if (!FLAG_enable_interpreter || !function_.HasBytecode()) {
-    function_.EnsureHasCompiledUnoptimizedCode();
-  }
-  if (FLAG_enable_interpreter && function_.HasBytecode()) {
-    is_interpreted_ = true;
-    code_ = function_.Bytecode();
-  } else {
-    code_ = function_.unoptimized_code();
-  }
-#else
   function_.EnsureHasCompiledUnoptimizedCode();
   code_ = function_.unoptimized_code();
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   ctx_ = async_activation.context();
   ASSERT(fp_ == 0);
   ASSERT(!ctx_.IsNull());
 }
 
 bool Debugger::NeedsIsolateEvents() {
-  return (!Isolate::IsVMInternalIsolate(isolate_) &&
-          ((event_handler_ != NULL) || Service::isolate_stream.enabled()));
+  return !Isolate::IsVMInternalIsolate(isolate_) &&
+         Service::isolate_stream.enabled();
 }
 
 bool Debugger::NeedsDebugEvents() {
   ASSERT(!Isolate::IsVMInternalIsolate(isolate_));
-  return (FLAG_warn_on_pause_with_no_debugger || (event_handler_ != NULL) ||
-          Service::debug_stream.enabled());
+  return FLAG_warn_on_pause_with_no_debugger || Service::debug_stream.enabled();
 }
 
 void Debugger::InvokeEventHandler(ServiceEvent* event) {
   ASSERT(!event->IsPause());  // For pause events, call Pause instead.
   Service::HandleEvent(event);
-
-  // Call the embedder's event handler, if it exists.
-  if (event_handler_ != NULL) {
-    TransitionVMToNative transition(Thread::Current());
-    (*event_handler_)(event);
-  }
 }
 
 RawError* Debugger::PauseInterrupted() {
@@ -373,7 +324,7 @@
   if (ignore_breakpoints_ || IsPaused()) {
     // We don't let the isolate get interrupted if we are already
     // paused or ignoring breakpoints.
-    return Error::null();
+    return Thread::Current()->StealStickyError();
   }
   ServiceEvent event(isolate_, kind);
   DebuggerStackTrace* trace = CollectStackTrace();
@@ -388,10 +339,10 @@
   ClearCachedStackTraces();
 
   // If any error occurred while in the debug message loop, return it here.
-  const Error& error = Error::Handle(Thread::Current()->sticky_error());
-  ASSERT(error.IsNull() || error.IsUnwindError());
-  Thread::Current()->clear_sticky_error();
-  return error.raw();
+  NoSafepointScope no_safepoint;
+  RawError* error = Thread::Current()->StealStickyError();
+  ASSERT((error == Error::null()) || error->IsUnwindError());
+  return error;
 }
 
 void Debugger::SendBreakpointEvent(ServiceEvent::EventKind kind,
@@ -767,7 +718,9 @@
         ASSERT(kind == RawLocalVarDescriptors::kContextVar);
         if (!live_frame_) {
           ASSERT(!ctx_.IsNull());
-          return ctx_.At(variable_index.value());
+          return GetRelativeContextVar(var_info.scope_id,
+                                       variable_index.value(),
+                                       /* frame_ctx_level = */ 0);
         }
         return GetContextVar(var_info.scope_id, variable_index.value());
       }
@@ -781,25 +734,19 @@
 }
 
 RawObject* ActivationFrame::GetAsyncCompleterAwaiter(const Object& completer) {
-  Instance& future = Instance::Handle();
-  if (FLAG_sync_async) {
-    const Class& completer_cls = Class::Handle(completer.clazz());
-    ASSERT(!completer_cls.IsNull());
-    const Function& future_getter = Function::Handle(
-        completer_cls.LookupGetterFunction(Symbols::CompleterFuture()));
-    ASSERT(!future_getter.IsNull());
-    const Array& args = Array::Handle(Array::New(1));
-    args.SetAt(0, Instance::Cast(completer));
-    future ^= DartEntry::InvokeFunction(future_getter, args);
-  } else {
-    const Class& sync_completer_cls = Class::Handle(completer.clazz());
-    ASSERT(!sync_completer_cls.IsNull());
-    const Class& completer_cls = Class::Handle(sync_completer_cls.SuperClass());
-    const Field& future_field =
-        Field::Handle(completer_cls.LookupInstanceFieldAllowPrivate(
-            Symbols::CompleterFuture()));
-    ASSERT(!future_field.IsNull());
-    future ^= Instance::Cast(completer).GetField(future_field);
+  DEBUG_ASSERT(Thread::Current()->TopErrorHandlerIsExitFrame());
+
+  Object& future = Object::Handle();
+  const Class& completer_cls = Class::Handle(completer.clazz());
+  ASSERT(!completer_cls.IsNull());
+  const Function& future_getter = Function::Handle(
+      completer_cls.LookupGetterFunction(Symbols::CompleterFuture()));
+  ASSERT(!future_getter.IsNull());
+  const Array& args = Array::Handle(Array::New(1));
+  args.SetAt(0, Instance::Cast(completer));
+  future = DartEntry::InvokeFunction(future_getter, args);
+  if (future.IsError()) {
+    Exceptions::PropagateError(Error::Cast(future));
   }
   if (future.IsNull()) {
     // The completer object may not be fully initialized yet.
@@ -810,7 +757,7 @@
   const Field& awaiter_field = Field::Handle(
       future_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter()));
   ASSERT(!awaiter_field.IsNull());
-  return future.GetField(awaiter_field);
+  return Instance::Cast(future).GetField(awaiter_field);
 }
 
 RawObject* ActivationFrame::GetAsyncStreamControllerStream() {
@@ -876,14 +823,11 @@
         ASSERT(!type.IsNull());
         // Uninstantiated types are not added to ExceptionHandlers data.
         ASSERT(type.IsInstantiated());
-        if (type.IsMalformed()) {
-          continue;
-        }
         if (type.IsDynamicType()) {
           return true;
         }
         if (exc_obj.IsInstanceOf(type, Object::null_type_arguments(),
-                                 Object::null_type_arguments(), NULL)) {
+                                 Object::null_type_arguments())) {
           return true;
         }
       }
@@ -1274,12 +1218,18 @@
 
 RawObject* ActivationFrame::GetContextVar(intptr_t var_ctx_level,
                                           intptr_t ctx_slot) {
-  const Context& ctx = GetSavedCurrentContext();
-  ASSERT(!ctx.IsNull());
-
   // The context level at the PC/token index of this activation frame.
   intptr_t frame_ctx_level = ContextLevel();
 
+  return GetRelativeContextVar(var_ctx_level, ctx_slot, frame_ctx_level);
+}
+
+RawObject* ActivationFrame::GetRelativeContextVar(intptr_t var_ctx_level,
+                                                  intptr_t ctx_slot,
+                                                  intptr_t frame_ctx_level) {
+  const Context& ctx = GetSavedCurrentContext();
+  ASSERT(!ctx.IsNull());
+
   intptr_t level_diff = frame_ctx_level - var_ctx_level;
   if (level_diff == 0) {
     if ((ctx_slot < 0) || (ctx_slot >= ctx.num_variables())) {
@@ -1440,43 +1390,6 @@
   return type_arguments.raw();
 }
 
-RawObject* ActivationFrame::Evaluate(const String& expr,
-                                     const GrowableObjectArray& param_names,
-                                     const GrowableObjectArray& param_values) {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  return Object::null();
-#else
-  Zone* zone = Thread::Current()->zone();
-  const GrowableObjectArray& type_params_names =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-  TypeArguments& type_arguments = TypeArguments::Handle(
-      zone, BuildParameters(param_names, param_values, type_params_names));
-
-  if (function().is_static()) {
-    const Class& cls = Class::Handle(function().Owner());
-    return cls.Evaluate(
-        expr, Array::Handle(zone, Array::MakeFixedLength(param_names)),
-        Array::Handle(zone, Array::MakeFixedLength(param_values)),
-        Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
-        type_arguments);
-  } else {
-    const Object& receiver = Object::Handle(GetReceiver());
-    const Class& method_cls = Class::Handle(function().origin());
-    ASSERT(receiver.IsInstance() || receiver.IsNull());
-    if (!(receiver.IsInstance() || receiver.IsNull())) {
-      return Object::null();
-    }
-    const Instance& inst = Instance::Cast(receiver);
-    return inst.Evaluate(
-        method_cls, expr,
-        Array::Handle(zone, Array::MakeFixedLength(param_names)),
-        Array::Handle(zone, Array::MakeFixedLength(param_values)),
-        Array::Handle(zone, Array::MakeFixedLength(type_params_names)),
-        type_arguments);
-  }
-#endif
-}
-
 const char* ActivationFrame::ToCString() {
   const String& url = String::Handle(SourceUrl());
   intptr_t line = LineNumber();
@@ -1634,8 +1547,8 @@
 #if !defined(TARGET_ARCH_DBC)
       saved_value_(Code::null())
 #else
-      saved_value_(Bytecode::kTrap),
-      saved_value_fastsmi_(Bytecode::kTrap)
+      saved_value_(SimulatorBytecode::kTrap),
+      saved_value_fastsmi_(SimulatorBytecode::kTrap)
 #endif
 {
   ASSERT(!code.IsNull());
@@ -1694,31 +1607,8 @@
   ASSERT(!is_enabled_);
 }
 
-RemoteObjectCache::RemoteObjectCache(intptr_t initial_size) {
-  objs_ =
-      &GrowableObjectArray::ZoneHandle(GrowableObjectArray::New(initial_size));
-}
-
-intptr_t RemoteObjectCache::AddObject(const Object& obj) {
-  intptr_t len = objs_->Length();
-  for (intptr_t i = 0; i < len; i++) {
-    if (objs_->At(i) == obj.raw()) {
-      return i;
-    }
-  }
-  objs_->Add(obj);
-  return len;
-}
-
-RawObject* RemoteObjectCache::GetObj(intptr_t obj_id) const {
-  ASSERT(IsValidId(obj_id));
-  return objs_->At(obj_id);
-}
-
-Debugger::Debugger()
-    : isolate_(NULL),
-      isolate_id_(ILLEGAL_ISOLATE_ID),
-      initialized_(false),
+Debugger::Debugger(Isolate* isolate)
+    : isolate_(isolate),
       next_id_(1),
       latent_locations_(NULL),
       breakpoint_locations_(NULL),
@@ -1728,7 +1618,6 @@
       post_deopt_frame_index_(-1),
       ignore_breakpoints_(false),
       pause_event_(NULL),
-      obj_cache_(NULL),
       stack_trace_(NULL),
       async_causal_stack_trace_(NULL),
       awaiter_stack_trace_(NULL),
@@ -1741,14 +1630,12 @@
       exc_pause_info_(kNoPauseOnExceptions) {}
 
 Debugger::~Debugger() {
-  isolate_id_ = ILLEGAL_ISOLATE_ID;
   ASSERT(!IsPaused());
   ASSERT(latent_locations_ == NULL);
   ASSERT(breakpoint_locations_ == NULL);
   ASSERT(code_breakpoints_ == NULL);
   ASSERT(stack_trace_ == NULL);
   ASSERT(async_causal_stack_trace_ == NULL);
-  ASSERT(obj_cache_ == NULL);
   ASSERT(synthetic_async_breakpoint_ == NULL);
 }
 
@@ -1986,6 +1873,12 @@
                    frame->ToCString());
     }
     if (frame->IsDartFrame()) {
+      if (frame->is_interpreted()) {
+        // TODO(regis): Support debugging of interpreted frames.
+        // For now, do not abort, but skip the frame, as this code is run
+        // while handling a stack overflow. See HandleStackOverflowTestCases.
+        continue;
+      }
       code = frame->LookupDartCode();
       AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
                        &inlined_code, &deopt_frame);
@@ -2067,6 +1960,10 @@
   while (synchronous_stack_trace_length > 0) {
     ASSERT(frame != NULL);
     if (frame->IsDartFrame()) {
+      if (frame->is_interpreted()) {
+        // TODO(regis): Support debugging of interpreted frames.
+        UNIMPLEMENTED();
+      }
       code = frame->LookupDartCode();
       AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
                        &inlined_code, &deopt_frame);
@@ -2084,7 +1981,7 @@
         break;
       }
       if (async_stack_trace.CodeAtFrame(i) ==
-          StubCode::AsynchronousGapMarker_entry()->code()) {
+          StubCode::AsynchronousGapMarker().raw()) {
         stack_trace->AddMarker(ActivationFrame::kAsyncSuspensionMarker);
         // The frame immediately below the asynchronous gap marker is the
         // identical to the frame above the marker. Skip the frame to enhance
@@ -2162,6 +2059,10 @@
                    frame->ToCString());
     }
     if (frame->IsDartFrame()) {
+      if (frame->is_interpreted()) {
+        // TODO(regis): Support debugging of interpreted frames.
+        UNIMPLEMENTED();
+      }
       code = frame->LookupDartCode();
       if (code.is_optimized()) {
         deopt_frame = DeoptimizeToArray(thread, frame, code);
@@ -2203,20 +2104,16 @@
             // Grab the awaiter.
             async_activation ^= activation->GetAsyncAwaiter();
             found_async_awaiter = true;
-            if (FLAG_sync_async) {
-              // async function might have been called synchronously, in which
-              // case we need to keep going down the stack.
-              // To determine how we are called we peek few more frames further
-              // expecting to see Closure_call followed by
-              // AsyncAwaitCompleter_start.
-              // If we are able to see those functions we continue going down
-              // thestack, if we are not, we break out of the loop as we are
-              // not interested in exploring rest of the stack - there is only
-              // dart-internal code left.
-              skip_sync_async_frames_count = 2;
-            } else {
-              break;
-            }
+            // async function might have been called synchronously, in which
+            // case we need to keep going down the stack.
+            // To determine how we are called we peek few more frames further
+            // expecting to see Closure_call followed by
+            // AsyncAwaitCompleter_start.
+            // If we are able to see those functions we continue going down
+            // thestack, if we are not, we break out of the loop as we are
+            // not interested in exploring rest of the stack - there is only
+            // dart-internal code left.
+            skip_sync_async_frames_count = 2;
           } else {
             stack_trace->AddActivation(
                 CollectDartFrame(isolate, it.pc(), frame, inlined_code,
@@ -2236,7 +2133,7 @@
           if (CheckAndSkipAsync(skip_sync_async_frames_count, function_name)) {
             skip_sync_async_frames_count--;
           } else {
-            // Unexpected function in sync async call.
+            // Unexpected function in synchronous call of async function.
             break;
           }
         }
@@ -2251,12 +2148,9 @@
           // Grab the awaiter.
           async_activation ^= activation->GetAsyncAwaiter();
           async_stack_trace ^= activation->GetCausalStack();
-          if (FLAG_sync_async) {
-            // see comment regarding skipping sync-async frames above.
-            skip_sync_async_frames_count = 2;
-          } else {
-            break;
-          }
+          // see comment regarding skipping frames of async functions called
+          // synchronously above.
+          skip_sync_async_frames_count = 2;
         } else {
           stack_trace->AddActivation(CollectDartFrame(
               isolate, frame->pc(), frame, code, Object::null_array(), 0));
@@ -2294,7 +2188,7 @@
         break;
       }
       if (async_stack_trace.CodeAtFrame(i) ==
-          StubCode::AsynchronousGapMarker_entry()->code()) {
+          StubCode::AsynchronousGapMarker().raw()) {
         stack_trace->AddMarker(ActivationFrame::kAsyncSuspensionMarker);
         // The frame immediately below the asynchronous gap marker is the
         // identical to the frame above the marker. Skip the frame to enhance
@@ -2331,6 +2225,12 @@
   while ((frame != NULL) && !frame->IsDartFrame()) {
     frame = iterator.NextFrame();
   }
+  ASSERT(frame != NULL);
+  if (frame->is_interpreted()) {
+    // TODO(regis): Support debugging of interpreted frames.
+    UNIMPLEMENTED();
+    return NULL;
+  }
   Code& code = Code::Handle(frame->LookupDartCode());
   ActivationFrame* activation = new ActivationFrame(
       frame->pc(), frame->fp(), frame->sp(), code, Object::null_array(), 0);
@@ -2366,6 +2266,7 @@
 DebuggerStackTrace* Debugger::StackTraceFrom(const class StackTrace& ex_trace) {
   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
   Function& function = Function::Handle();
+  Object& code_object = Object::Handle();
   Code& code = Code::Handle();
 
   const uword fp = 0;
@@ -2374,17 +2275,21 @@
   const intptr_t deopt_frame_offset = -1;
 
   for (intptr_t i = 0; i < ex_trace.Length(); i++) {
-    code = ex_trace.CodeAtFrame(i);
+    code_object = ex_trace.CodeAtFrame(i);
     // Pre-allocated StackTraces may include empty slots, either (a) to indicate
     // where frames were omitted in the case a stack has more frames than the
     // pre-allocated trace (such as a stack overflow) or (b) because a stack has
     // fewer frames that the pre-allocated trace (such as memory exhaustion with
     // a shallow stack).
-    if (!code.IsNull()) {
+    if (!code_object.IsNull()) {
+      if (code_object.IsBytecode()) {
+        // TODO(regis): Support debugging of interpreted frames.
+        UNIMPLEMENTED();
+      }
+      code ^= code_object.raw();
       ASSERT(code.IsFunctionCode());
       function = code.function();
       if (function.is_visible()) {
-        code = ex_trace.CodeAtFrame(i);
         ASSERT(function.raw() == code.function());
         uword pc =
             code.PayloadStart() + Smi::Value(ex_trace.PcOffsetAtFrame(i));
@@ -3171,198 +3076,6 @@
   return bpt;
 }
 
-intptr_t Debugger::CacheObject(const Object& obj) {
-  ASSERT(obj_cache_ != NULL);
-  return obj_cache_->AddObject(obj);
-}
-
-bool Debugger::IsValidObjectId(intptr_t obj_id) {
-  ASSERT(obj_cache_ != NULL);
-  return obj_cache_->IsValidId(obj_id);
-}
-
-RawObject* Debugger::GetCachedObject(intptr_t obj_id) {
-  ASSERT(obj_cache_ != NULL);
-  return obj_cache_->GetObj(obj_id);
-}
-
-// TODO(hausner): Merge some of this functionality with the code in
-// dart_api_impl.cc.
-RawObject* Debugger::GetInstanceField(const Class& cls,
-                                      const String& field_name,
-                                      const Instance& object) {
-  const Function& getter_func =
-      Function::Handle(cls.LookupGetterFunction(field_name));
-  ASSERT(!getter_func.IsNull());
-
-  PassiveObject& result = PassiveObject::Handle();
-  bool saved_ignore_flag = ignore_breakpoints_;
-  ignore_breakpoints_ = true;
-
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    const Array& args = Array::Handle(Array::New(1));
-    args.SetAt(0, object);
-    result = DartEntry::InvokeFunction(getter_func, args);
-  } else {
-    result = Thread::Current()->sticky_error();
-  }
-  ignore_breakpoints_ = saved_ignore_flag;
-  return result.raw();
-}
-
-RawObject* Debugger::GetStaticField(const Class& cls,
-                                    const String& field_name) {
-  const Field& fld =
-      Field::Handle(cls.LookupStaticFieldAllowPrivate(field_name));
-  if (!fld.IsNull()) {
-    // Return the value in the field if it has been initialized already.
-    const Instance& value = Instance::Handle(fld.StaticValue());
-    ASSERT(value.raw() != Object::transition_sentinel().raw());
-    if (value.raw() != Object::sentinel().raw()) {
-      return value.raw();
-    }
-  }
-  // There is no field or the field has not been initialized yet.
-  // We must have a getter. Run the getter.
-  const Function& getter_func =
-      Function::Handle(cls.LookupGetterFunction(field_name));
-  ASSERT(!getter_func.IsNull());
-  if (getter_func.IsNull()) {
-    return Object::null();
-  }
-
-  PassiveObject& result = PassiveObject::Handle();
-  bool saved_ignore_flag = ignore_breakpoints_;
-  ignore_breakpoints_ = true;
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    result = DartEntry::InvokeFunction(getter_func, Object::empty_array());
-  } else {
-    result = Thread::Current()->sticky_error();
-  }
-  ignore_breakpoints_ = saved_ignore_flag;
-  return result.raw();
-}
-
-RawArray* Debugger::GetInstanceFields(const Instance& obj) {
-  Class& cls = Class::Handle(obj.clazz());
-  Array& fields = Array::Handle();
-  Field& field = Field::Handle();
-  const GrowableObjectArray& field_list =
-      GrowableObjectArray::Handle(GrowableObjectArray::New(8));
-  String& field_name = String::Handle();
-  PassiveObject& field_value = PassiveObject::Handle();
-  // Iterate over fields in class hierarchy to count all instance fields.
-  while (!cls.IsNull()) {
-    fields = cls.fields();
-    for (intptr_t i = 0; i < fields.Length(); i++) {
-      field ^= fields.At(i);
-      if (!field.is_static()) {
-        field_name = field.name();
-        field_list.Add(field_name);
-        field_value = GetInstanceField(cls, field_name, obj);
-        field_list.Add(field_value);
-      }
-    }
-    cls = cls.SuperClass();
-  }
-  return Array::MakeFixedLength(field_list);
-}
-
-RawArray* Debugger::GetStaticFields(const Class& cls) {
-  const GrowableObjectArray& field_list =
-      GrowableObjectArray::Handle(GrowableObjectArray::New(8));
-  Array& fields = Array::Handle(cls.fields());
-  Field& field = Field::Handle();
-  String& field_name = String::Handle();
-  PassiveObject& field_value = PassiveObject::Handle();
-  for (intptr_t i = 0; i < fields.Length(); i++) {
-    field ^= fields.At(i);
-    if (field.is_static()) {
-      field_name = field.name();
-      field_value = GetStaticField(cls, field_name);
-      field_list.Add(field_name);
-      field_list.Add(field_value);
-    }
-  }
-  return Array::MakeFixedLength(field_list);
-}
-
-void Debugger::CollectLibraryFields(const GrowableObjectArray& field_list,
-                                    const Library& lib,
-                                    const String& prefix,
-                                    bool include_private_fields) {
-  DictionaryIterator it(lib);
-  Zone* zone = Thread::Current()->zone();
-  Object& entry = Object::Handle(zone);
-  Field& field = Field::Handle(zone);
-  String& field_name = String::Handle(zone);
-  PassiveObject& field_value = PassiveObject::Handle(zone);
-  while (it.HasNext()) {
-    entry = it.GetNext();
-    if (entry.IsField()) {
-      field ^= entry.raw();
-      ASSERT(field.is_static());
-      field_name = field.name();
-      if ((field_name.CharAt(0) == '_') && !include_private_fields) {
-        // Skip library-private field.
-        continue;
-      }
-      // If the field is not initialized yet, report the value to be
-      // "<not initialized>". We don't want to execute the implicit getter
-      // since it may have side effects.
-      if ((field.StaticValue() == Object::sentinel().raw()) ||
-          (field.StaticValue() == Object::transition_sentinel().raw())) {
-        field_value = Symbols::NotInitialized().raw();
-      } else {
-        field_value = field.StaticValue();
-      }
-      if (!prefix.IsNull()) {
-        field_name = String::Concat(prefix, field_name);
-      }
-      field_list.Add(field_name);
-      field_list.Add(field_value);
-    }
-  }
-}
-
-RawArray* Debugger::GetLibraryFields(const Library& lib) {
-  Zone* zone = Thread::Current()->zone();
-  const GrowableObjectArray& field_list =
-      GrowableObjectArray::Handle(GrowableObjectArray::New(8));
-  CollectLibraryFields(field_list, lib, String::Handle(zone), true);
-  return Array::MakeFixedLength(field_list);
-}
-
-RawArray* Debugger::GetGlobalFields(const Library& lib) {
-  Zone* zone = Thread::Current()->zone();
-  const GrowableObjectArray& field_list =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New(8));
-  String& prefix_name = String::Handle(zone);
-  CollectLibraryFields(field_list, lib, prefix_name, true);
-  Library& imported = Library::Handle(zone);
-  intptr_t num_imports = lib.num_imports();
-  for (intptr_t i = 0; i < num_imports; i++) {
-    imported = lib.ImportLibraryAt(i);
-    ASSERT(!imported.IsNull());
-    CollectLibraryFields(field_list, imported, prefix_name, false);
-  }
-  LibraryPrefix& prefix = LibraryPrefix::Handle(zone);
-  LibraryPrefixIterator it(lib);
-  while (it.HasNext()) {
-    prefix = it.GetNext();
-    prefix_name = prefix.name();
-    ASSERT(!prefix_name.IsNull());
-    prefix_name = String::Concat(prefix_name, Symbols::Dot());
-    for (int32_t i = 0; i < prefix.num_imports(); i++) {
-      imported = prefix.GetLibrary(i);
-      CollectLibraryFields(field_list, imported, prefix_name, false);
-    }
-  }
-  return Array::MakeFixedLength(field_list);
-}
-
 // static
 void Debugger::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
@@ -3384,20 +3097,13 @@
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&top_frame_awaiter_));
 }
 
-// static
-void Debugger::SetEventHandler(EventHandler* handler) {
-  event_handler_ = handler;
-}
-
 void Debugger::Pause(ServiceEvent* event) {
   ASSERT(event->IsPause());      // Should call InvokeEventHandler instead.
   ASSERT(!ignore_breakpoints_);  // We shouldn't get here when ignoring bpts.
   ASSERT(!IsPaused());           // No recursive pausing.
-  ASSERT(obj_cache_ == NULL);
 
   pause_event_ = event;
   pause_event_->UpdateTimestamp();
-  obj_cache_ = new RemoteObjectCache(64);
 
   // We are about to invoke the debugger's event handler. Disable
   // interrupts for this thread while waiting for debug commands over
@@ -3412,13 +3118,8 @@
     Service::HandleEvent(event);
 
     {
-      TransitionVMToNative transition(Thread::Current());
-      if (FLAG_steal_breakpoints || (event_handler_ == NULL)) {
-        // We allow the embedder's default breakpoint handler to be overridden.
-        isolate_->PauseEventHandler();
-      } else if (event_handler_ != NULL) {
-        (*event_handler_)(event);
-      }
+      TransitionVMToNative transition(thread);
+      isolate_->PauseEventHandler();
     }
 
     // Notify the service that we have resumed.
@@ -3438,7 +3139,6 @@
     RemoveUnlinkedCodeBreakpoints();
   }
   pause_event_ = NULL;
-  obj_cache_ = NULL;  // Zone allocated
 }
 
 void Debugger::EnterSingleStepMode() {
@@ -3754,7 +3454,7 @@
   }
   Thread* thread = Thread::Current();
   thread->set_resume_pc(frame->pc());
-  uword deopt_stub_pc = StubCode::DeoptForRewind_entry()->EntryPoint();
+  uword deopt_stub_pc = StubCode::DeoptForRewind().EntryPoint();
   Exceptions::JumpToFrame(thread, deopt_stub_pc, frame->sp(), frame->fp(),
                           true /* clear lazy deopt at target */);
   UNREACHABLE();
@@ -3817,7 +3517,6 @@
   ResetSteppingFramePointers();
   isolate_->set_single_step(false);
   ASSERT(!IsPaused());
-  ASSERT(obj_cache_ == NULL);
   if ((bpt != NULL) && bpt->IsSingleShot()) {
     RemoveBreakpoint(bpt->id());
     bpt = NULL;
@@ -3938,9 +3637,7 @@
   ClearCachedStackTraces();
 
   // If any error occurred while in the debug message loop, return it here.
-  const Error& error = Error::Handle(Thread::Current()->sticky_error());
-  Thread::Current()->clear_sticky_error();
-  return error.raw();
+  return Thread::Current()->StealStickyError();
 }
 
 RawError* Debugger::PauseBreakpoint() {
@@ -4010,9 +3707,7 @@
   ClearCachedStackTraces();
 
   // If any error occurred while in the debug message loop, return it here.
-  const Error& error = Error::Handle(Thread::Current()->sticky_error());
-  Thread::Current()->clear_sticky_error();
-  return error.raw();
+  return Thread::Current()->StealStickyError();
 }
 
 Breakpoint* Debugger::FindHitBreakpoint(BreakpointLocation* location,
@@ -4081,19 +3776,6 @@
   ClearCachedStackTraces();
 }
 
-void Debugger::Initialize(Isolate* isolate) {
-  if (initialized_) {
-    return;
-  }
-  isolate_ = isolate;
-
-  // Use the isolate's control port as the isolate_id for debugging.
-  // This port will be used as a unique ID to represent the isolate in
-  // the debugger embedder api.
-  isolate_id_ = isolate_->main_port();
-  initialized_ = true;
-}
-
 void Debugger::NotifyIsolateCreated() {
   if (NeedsIsolateEvents()) {
     ServiceEvent event(isolate_, ServiceEvent::kIsolateStart);
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index ee4f234..3e1a0c0 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -32,7 +32,6 @@
 class JSONArray;
 class JSONStream;
 class ObjectPointerVisitor;
-class RemoteObjectCache;
 class BreakpointLocation;
 class StackFrame;
 
@@ -333,10 +332,6 @@
       const GrowableObjectArray& param_values,
       const GrowableObjectArray& type_params_names);
 
-  RawObject* Evaluate(const String& expr,
-                      const GrowableObjectArray& names,
-                      const GrowableObjectArray& values);
-
   RawObject* EvaluateCompiledExpression(const uint8_t* kernel_bytes,
                                         intptr_t kernel_length,
                                         const Array& arguments,
@@ -395,6 +390,9 @@
   }
 
   RawObject* GetStackVar(VariableIndex var_index);
+  RawObject* GetRelativeContextVar(intptr_t ctxt_level,
+                                   intptr_t slot_index,
+                                   intptr_t frame_ctx_level);
   RawObject* GetContextVar(intptr_t ctxt_level, intptr_t slot_index);
 
   uword pc_;
@@ -473,12 +471,9 @@
     kStepOverAsyncSuspension,
   };
 
-  typedef void EventHandler(ServiceEvent* event);
-
-  Debugger();
+  explicit Debugger(Isolate* isolate);
   ~Debugger();
 
-  void Initialize(Isolate* isolate);
   void NotifyIsolateCreated();
   void Shutdown();
 
@@ -544,9 +539,6 @@
 
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
-  // Called from Runtime when a breakpoint in Dart code is reached.
-  void BreakpointCallback();
-
   // Returns true if there is at least one breakpoint set in func or code.
   // Checks for both user-defined and internal temporary breakpoints.
   // This may be called from different threads, therefore do not use the,
@@ -576,27 +568,9 @@
   // to query local variables in the returned stack.
   DebuggerStackTrace* StackTraceFrom(const class StackTrace& dart_stacktrace);
 
-  RawArray* GetInstanceFields(const Instance& obj);
-  RawArray* GetStaticFields(const Class& cls);
-  RawArray* GetLibraryFields(const Library& lib);
-  RawArray* GetGlobalFields(const Library& lib);
-
-  intptr_t CacheObject(const Object& obj);
-  RawObject* GetCachedObject(intptr_t obj_id);
-  bool IsValidObjectId(intptr_t obj_id);
-
-  Dart_Port GetIsolateId() { return isolate_id_; }
-
-  static void SetEventHandler(EventHandler* handler);
-
   // Utility functions.
   static const char* QualifiedFunctionName(const Function& func);
 
-  RawObject* GetInstanceField(const Class& cls,
-                              const String& field_name,
-                              const Instance& object);
-  RawObject* GetStaticField(const Class& cls, const String& field_name);
-
   // Pause execution for a breakpoint.  Called from generated code.
   RawError* PauseBreakpoint();
 
@@ -721,11 +695,6 @@
   bool ShouldPauseOnException(DebuggerStackTrace* stack_trace,
                               const Instance& exc);
 
-  void CollectLibraryFields(const GrowableObjectArray& field_list,
-                            const Library& lib,
-                            const String& prefix,
-                            bool include_private_fields);
-
   // Handles any events which pause vm execution.  Breakpoints,
   // interrupts, etc.
   void Pause(ServiceEvent* event);
@@ -754,8 +723,6 @@
   void SetAsyncSteppingFramePointer();
 
   Isolate* isolate_;
-  Dart_Port isolate_id_;  // A unique ID for the isolate in the debugger.
-  bool initialized_;
 
   // ID number generator.
   intptr_t next_id_;
@@ -780,9 +747,6 @@
   // exceptions.
   ServiceEvent* pause_event_;
 
-  // An id -> object map.  Valid only while IsPaused().
-  RemoteObjectCache* obj_cache_;
-
   // Current stack trace. Valid only while IsPaused().
   DebuggerStackTrace* stack_trace_;
   DebuggerStackTrace* async_causal_stack_trace_;
@@ -810,8 +774,6 @@
 
   Dart_ExceptionPauseInfo exc_pause_info_;
 
-  static EventHandler* event_handler_;
-
   friend class Isolate;
   friend class BreakpointLocation;
   DISALLOW_COPY_AND_ASSIGN(Debugger);
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 88792e5..e9a303f 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -83,82 +83,6 @@
   return Api::Success();
 }
 
-static Dart_PausedEventHandler* paused_event_handler = NULL;
-static Dart_BreakpointResolvedHandler* bp_resolved_handler = NULL;
-static Dart_ExceptionThrownHandler* exc_thrown_handler = NULL;
-static Dart_IsolateEventHandler* isolate_event_handler = NULL;
-
-static void DebuggerEventHandler(ServiceEvent* event) {
-  Thread* thread = Thread::Current();
-  Isolate* isolate = thread->isolate();
-  ASSERT(isolate != NULL);
-  Dart_EnterScope();
-  Dart_IsolateId isolate_id = isolate->debugger()->GetIsolateId();
-  if (event->kind() == ServiceEvent::kPauseBreakpoint) {
-    if (paused_event_handler != NULL) {
-      Dart_CodeLocation location;
-      ActivationFrame* top_frame = event->top_frame();
-      location.script_url = Api::NewHandle(thread, top_frame->SourceUrl());
-      const Library& lib = Library::Handle(top_frame->Library());
-      location.library_id = lib.index();
-      location.token_pos = top_frame->TokenPos().Pos();
-      intptr_t bp_id = 0;
-      if (event->breakpoint() != NULL) {
-        ASSERT(event->breakpoint()->id() != ILLEGAL_BREAKPOINT_ID);
-        bp_id = event->breakpoint()->id();
-      }
-      (*paused_event_handler)(isolate_id, bp_id, location);
-    }
-  } else if (event->kind() == ServiceEvent::kBreakpointAdded ||
-             event->kind() == ServiceEvent::kBreakpointResolved) {
-    Breakpoint* bpt = event->breakpoint();
-    ASSERT(bpt != NULL);
-    if (bp_resolved_handler != NULL && bpt->bpt_location()->IsResolved() &&
-        !bpt->IsSingleShot()) {
-      Dart_CodeLocation location;
-      Zone* zone = thread->zone();
-      Library& library = Library::Handle(zone);
-      Script& script = Script::Handle(zone);
-      TokenPosition token_pos;
-      bpt->bpt_location()->GetCodeLocation(&library, &script, &token_pos);
-      location.script_url = Api::NewHandle(thread, script.url());
-      location.library_id = library.index();
-      location.token_pos = token_pos.Pos();
-      (*bp_resolved_handler)(isolate_id, bpt->id(), location);
-    }
-  } else if (event->kind() == ServiceEvent::kBreakpointRemoved) {
-    // Ignore.
-  } else if (event->kind() == ServiceEvent::kPauseException) {
-    if (exc_thrown_handler != NULL) {
-      Dart_Handle exception = Api::NewHandle(thread, event->exception()->raw());
-      Dart_StackTrace trace =
-          reinterpret_cast<Dart_StackTrace>(isolate->debugger()->StackTrace());
-      (*exc_thrown_handler)(isolate_id, exception, trace);
-    }
-  } else if (event->kind() == ServiceEvent::kIsolateStart) {
-    if (isolate_event_handler != NULL) {
-      (*isolate_event_handler)(event->isolate_id(), kCreated);
-    }
-  } else if (event->kind() == ServiceEvent::kPauseInterrupted ||
-             event->kind() == ServiceEvent::kPausePostRequest) {
-    if (isolate_event_handler != NULL) {
-      (*isolate_event_handler)(event->isolate_id(), kInterrupted);
-    }
-  } else if (event->kind() == ServiceEvent::kIsolateExit) {
-    if (isolate_event_handler != NULL) {
-      (*isolate_event_handler)(event->isolate_id(), kShutdown);
-    }
-  } else {
-    UNIMPLEMENTED();
-  }
-  Dart_ExitScope();
-}
-
-DART_EXPORT void Dart_SetPausedEventHandler(Dart_PausedEventHandler handler) {
-  paused_event_handler = handler;
-  Debugger::SetEventHandler(DebuggerEventHandler);
-}
-
 DART_EXPORT Dart_Handle Dart_GetStackTrace(Dart_StackTrace* trace) {
   DARTSCOPE(Thread::Current());
   Isolate* I = T->isolate();
@@ -219,16 +143,20 @@
 
 DART_EXPORT Dart_Handle Dart_SetBreakpoint(Dart_Handle script_url_in,
                                            intptr_t line_number) {
-  DARTSCOPE(Thread::Current());
-  Isolate* I = T->isolate();
-  CHECK_DEBUGGER(I);
-  UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in);
+  Breakpoint* bpt;
+  {
+    DARTSCOPE(Thread::Current());
+    Isolate* I = T->isolate();
+    CHECK_DEBUGGER(I);
+    UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in);
 
-  Debugger* debugger = I->debugger();
-  Breakpoint* bpt = debugger->SetBreakpointAtLine(script_url, line_number);
-  if (bpt == NULL) {
-    return Api::NewError("%s: could not set breakpoint at line %" Pd " in '%s'",
-                         CURRENT_FUNC, line_number, script_url.ToCString());
+    Debugger* debugger = I->debugger();
+    bpt = debugger->SetBreakpointAtLine(script_url, line_number);
+    if (bpt == NULL) {
+      return Api::NewError("%s: could not set breakpoint at line %" Pd
+                           " in '%s'",
+                           CURRENT_FUNC, line_number, script_url.ToCString());
+    }
   }
   return Dart_NewInteger(bpt->id());
 }
@@ -248,20 +176,16 @@
   UNWRAP_AND_CHECK_PARAM(String, expr, expr_in);
 
   if (!KernelIsolate::IsRunning()) {
-    return Api::NewHandle(
-        T, lib.Evaluate(expr, Array::empty_array(), Array::empty_array()));
+    UNREACHABLE();
   } else {
-    Dart_KernelCompilationResult compilation_result;
-    {
-      TransitionVMToNative transition(T);
-      compilation_result = KernelIsolate::CompileExpressionToKernel(
-          expr.ToCString(),
-          /* definitions= */ Array::empty_array(),
-          /* type_defintions= */ Array::empty_array(),
-          String::Handle(lib.url()).ToCString(),
-          /* klass= */ nullptr,
-          /* is_static= */ false);
-    }
+    Dart_KernelCompilationResult compilation_result =
+        KernelIsolate::CompileExpressionToKernel(
+            expr.ToCString(),
+            /* definitions= */ Array::empty_array(),
+            /* type_defintions= */ Array::empty_array(),
+            String::Handle(lib.url()).ToCString(),
+            /* klass= */ nullptr,
+            /* is_static= */ false);
     if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
       return Api::NewError("Failed to compile expression.");
     }
@@ -282,36 +206,6 @@
   }
 }
 
-DART_EXPORT Dart_Handle Dart_GetLibraryIds() {
-  DARTSCOPE(Thread::Current());
-  Isolate* I = T->isolate();
-
-  const GrowableObjectArray& libs =
-      GrowableObjectArray::Handle(Z, I->object_store()->libraries());
-  int num_libs = libs.Length();
-
-  // Create new list and populate with the url of loaded libraries.
-  Library& lib = Library::Handle();
-  const Array& library_id_list = Array::Handle(Z, Array::New(num_libs));
-  for (int i = 0; i < num_libs; i++) {
-    lib ^= libs.At(i);
-    ASSERT(!lib.IsNull());
-    ASSERT(Smi::IsValid(lib.index()));
-    library_id_list.SetAt(i, Smi::Handle(Smi::New(lib.index())));
-  }
-  return Api::NewHandle(T, library_id_list.raw());
-}
-
-DART_EXPORT Dart_Handle Dart_GetLibraryFromId(intptr_t library_id) {
-  DARTSCOPE(Thread::Current());
-  const Library& lib = Library::Handle(Z, Library::GetLibrary(library_id));
-  if (lib.IsNull()) {
-    return Api::NewError("%s: %" Pd " is not a valid library id", CURRENT_FUNC,
-                         library_id);
-  }
-  return Api::NewHandle(T, lib.raw());
-}
-
 DART_EXPORT Dart_Handle Dart_LibraryId(Dart_Handle library,
                                        intptr_t* library_id) {
   DARTSCOPE(Thread::Current());
@@ -351,12 +245,6 @@
   return Api::Success();
 }
 
-#else
-
-DART_EXPORT void Dart_SetPausedEventHandler(Dart_PausedEventHandler handler) {
-  // NOOP.
-}
-
 #endif  // !PRODUCT
 
 }  // namespace dart
diff --git a/runtime/vm/debugger_api_impl_test.h b/runtime/vm/debugger_api_impl_test.h
index f68f645..f160273 100644
--- a/runtime/vm/debugger_api_impl_test.h
+++ b/runtime/vm/debugger_api_impl_test.h
@@ -63,16 +63,6 @@
                                             const Dart_CodeLocation& location);
 
 /**
- * Returns a list of ids (integers) of all the libraries loaded in the
- * current isolate.
- *
- * Requires there to be a current isolate.
- *
- * \return A handle to a list of library ids.
- */
-DART_EXPORT Dart_Handle Dart_GetLibraryIds();
-
-/**
  * Returns true if the debugger can step into code of the given library.
  *
  * Requires there to be a current isolate.
@@ -105,14 +95,6 @@
                                            intptr_t line_number);
 
 /**
- * Installs a handler callback function that gets called by the VM
- * when a breakpoint location has been reached or when stepping.
- *
- * Requires there to be a current isolate.
- */
-DART_EXPORT void Dart_SetPausedEventHandler(Dart_PausedEventHandler handler);
-
-/**
  * Returns in \trace the current stack trace, or NULL if the
  * VM is not paused.
  *
@@ -192,15 +174,6 @@
                                                 Dart_Handle expr);
 
 /**
- * Returns a handle to the library \library_id.
- *
- * Requires there to be a current isolate.
- *
- * \return A library handle if the id is valid.
- */
-DART_EXPORT Dart_Handle Dart_GetLibraryFromId(intptr_t library_id);
-
-/**
  * Returns in \library_id the library id of the given \library.
  *
  * \return A valid handle if no error occurs during the operation.
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index ee75cd7..3eafa74 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -25,10 +25,10 @@
   switch (breakpoint_kind_) {
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
-      stub_target = StubCode::ICCallBreakpoint_entry()->code();
+      stub_target = StubCode::ICCallBreakpoint().raw();
       break;
     case RawPcDescriptors::kRuntimeCall:
-      stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
+      stub_target = StubCode::RuntimeCallBreakpoint().raw();
       break;
     default:
       UNREACHABLE();
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index 4d53e7c..48ed9c2 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -25,10 +25,10 @@
   switch (breakpoint_kind_) {
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
-      stub_target = StubCode::ICCallBreakpoint_entry()->code();
+      stub_target = StubCode::ICCallBreakpoint().raw();
       break;
     case RawPcDescriptors::kRuntimeCall: {
-      stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
+      stub_target = StubCode::RuntimeCallBreakpoint().raw();
       break;
     }
     default:
diff --git a/runtime/vm/debugger_dbc.cc b/runtime/vm/debugger_dbc.cc
index 8287e2b..c36dddb 100644
--- a/runtime/vm/debugger_dbc.cc
+++ b/runtime/vm/debugger_dbc.cc
@@ -40,13 +40,14 @@
         // DebugBreak has an A operand matching the call it replaces.
         // This ensures that Return instructions continue to work - as they
         // look at calls to figure out how many arguments to drop.
-        *CallInstructionFromReturnAddress(pc_) = Bytecode::Encode(
-            Bytecode::kDebugBreak, Bytecode::DecodeArgc(saved_value_), 0, 0);
+        *CallInstructionFromReturnAddress(pc_) = SimulatorBytecode::Encode(
+            SimulatorBytecode::kDebugBreak,
+            SimulatorBytecode::DecodeArgc(saved_value_), 0, 0);
         break;
       }
 
       case RawPcDescriptors::kRuntimeCall: {
-        *CallInstructionFromReturnAddress(pc_) = Bytecode::kDebugBreak;
+        *CallInstructionFromReturnAddress(pc_) = SimulatorBytecode::kDebugBreak;
         break;
       }
 
@@ -56,13 +57,15 @@
 
     // If this call is the fall-through for a fast Smi op, also disable the fast
     // Smi op.
-    if ((Bytecode::DecodeOpcode(saved_value_) == Bytecode::kInstanceCall2) &&
-        Bytecode::IsFastSmiOpcode(*FastSmiInstructionFromReturnAddress(pc_))) {
+    if ((SimulatorBytecode::DecodeOpcode(saved_value_) ==
+         SimulatorBytecode::kInstanceCall2) &&
+        SimulatorBytecode::IsFastSmiOpcode(
+            *FastSmiInstructionFromReturnAddress(pc_))) {
       saved_value_fastsmi_ = *FastSmiInstructionFromReturnAddress(pc_);
       *FastSmiInstructionFromReturnAddress(pc_) =
-          Bytecode::Encode(Bytecode::kNop, 0, 0, 0);
+          SimulatorBytecode::Encode(SimulatorBytecode::kNop, 0, 0, 0);
     } else {
-      saved_value_fastsmi_ = Bytecode::kTrap;
+      saved_value_fastsmi_ = SimulatorBytecode::kTrap;
     }
   }
   is_enabled_ = true;
@@ -85,9 +88,10 @@
         UNREACHABLE();
     }
 
-    if (saved_value_fastsmi_ != Bytecode::kTrap) {
+    if (saved_value_fastsmi_ != SimulatorBytecode::kTrap) {
       Instr current_instr = *FastSmiInstructionFromReturnAddress(pc_);
-      ASSERT(Bytecode::DecodeOpcode(current_instr) == Bytecode::kNop);
+      ASSERT(SimulatorBytecode::DecodeOpcode(current_instr) ==
+             SimulatorBytecode::kNop);
       *FastSmiInstructionFromReturnAddress(pc_) = saved_value_fastsmi_;
     }
   }
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index 8dadc22..d74202c 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -33,12 +33,12 @@
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
       case RawPcDescriptors::kUnoptStaticCall: {
-        stub_target = StubCode::ICCallBreakpoint_entry()->code();
+        stub_target = StubCode::ICCallBreakpoint().raw();
         break;
       }
       case RawPcDescriptors::kRuntimeCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
-        stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
+        stub_target = StubCode::RuntimeCallBreakpoint().raw();
         break;
       }
       default:
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index a1f395c..39cf91c 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -27,10 +27,10 @@
   switch (breakpoint_kind_) {
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
-      stub_target = StubCode::ICCallBreakpoint_entry()->code();
+      stub_target = StubCode::ICCallBreakpoint().raw();
       break;
     case RawPcDescriptors::kRuntimeCall:
-      stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
+      stub_target = StubCode::RuntimeCallBreakpoint().raw();
       break;
     default:
       UNREACHABLE();
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index ec35ebc8..0f499e1 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -184,6 +184,7 @@
 }
 
 void DeoptContext::VisitObjectPointers(ObjectPointerVisitor* visitor) {
+  visitor->VisitPointer(reinterpret_cast<RawObject**>(&code_));
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&object_pool_));
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&deopt_info_));
 
@@ -406,6 +407,7 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* top_frame = iterator.NextFrame();
     ASSERT(top_frame != NULL);
+    ASSERT(!top_frame->is_interpreted());
     const Code& code = Code::Handle(top_frame->LookupDartCode());
     const Function& top_function = Function::Handle(code.function());
     const Script& script = Script::Handle(top_function.script());
@@ -741,8 +743,8 @@
     if (function.IsNull()) {
       *reinterpret_cast<RawObject**>(dest_addr) =
           deopt_context->is_lazy_deopt()
-              ? StubCode::DeoptimizeLazyFromReturn_entry()->code()
-              : StubCode::Deoptimize_entry()->code();
+              ? StubCode::DeoptimizeLazyFromReturn().raw()
+              : StubCode::Deoptimize().raw();
       return;
     }
 
@@ -752,7 +754,7 @@
     // materialization to maintain the invariant that Dart frames always have
     // a pc marker.
     *reinterpret_cast<RawObject**>(dest_addr) =
-        StubCode::FrameAwaitingMaterialization_entry()->code();
+        StubCode::FrameAwaitingMaterialization().raw();
     deopt_context->DeferPcMarkerMaterialization(object_table_index_, dest_addr);
   }
 
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index e2096b6..9270768 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -97,9 +97,9 @@
 
   double FpuRegisterValue(FpuRegister reg) const {
     ASSERT(FlowGraphCompiler::SupportsUnboxedDoubles());
+#if !defined(TARGET_ARCH_DBC)
     ASSERT(fpu_registers_ != NULL);
     ASSERT(reg >= 0);
-#if !defined(TARGET_ARCH_DBC)
     ASSERT(reg < kNumberOfFpuRegisters);
     return *reinterpret_cast<double*>(&fpu_registers_[reg]);
 #else
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 06f5a47..2783bd7 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -21,7 +21,6 @@
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
-#include "vm/tags.h"
 
 namespace dart {
 
@@ -37,7 +36,7 @@
   StackTraceBuilder() {}
   virtual ~StackTraceBuilder() {}
 
-  virtual void AddFrame(const Code& code, const Smi& offset) = 0;
+  virtual void AddFrame(const Object& code, const Smi& offset) = 0;
 };
 
 class RegularStackTraceBuilder : public StackTraceBuilder {
@@ -52,7 +51,7 @@
   const GrowableObjectArray& code_list() const { return code_list_; }
   const GrowableObjectArray& pc_offset_list() const { return pc_offset_list_; }
 
-  virtual void AddFrame(const Code& code, const Smi& offset) {
+  virtual void AddFrame(const Object& code, const Smi& offset) {
     code_list_.Add(code);
     pc_offset_list_.Add(offset);
   }
@@ -75,7 +74,7 @@
   }
   ~PreallocatedStackTraceBuilder() {}
 
-  virtual void AddFrame(const Code& code, const Smi& offset);
+  virtual void AddFrame(const Object& code, const Smi& offset);
 
  private:
   static const int kNumTopframes = StackTrace::kPreallocatedStackdepth / 2;
@@ -87,11 +86,11 @@
   DISALLOW_COPY_AND_ASSIGN(PreallocatedStackTraceBuilder);
 };
 
-void PreallocatedStackTraceBuilder::AddFrame(const Code& code,
+void PreallocatedStackTraceBuilder::AddFrame(const Object& code,
                                              const Smi& offset) {
   if (cur_index_ >= StackTrace::kPreallocatedStackdepth) {
     // The number of frames is overflowing the preallocated stack trace object.
-    Code& frame_code = Code::Handle();
+    Object& frame_code = Object::Handle();
     Smi& frame_offset = Smi::Handle();
     intptr_t start = StackTrace::kPreallocatedStackdepth - (kNumTopframes - 1);
     intptr_t null_slot = start - 2;
@@ -129,13 +128,21 @@
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Code& code = Code::Handle();
+  Bytecode& bytecode = Bytecode::Handle();
   Smi& offset = Smi::Handle();
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
-      code = frame->LookupDartCode();
-      ASSERT(code.ContainsInstructionAt(frame->pc()));
-      offset = Smi::New(frame->pc() - code.PayloadStart());
-      builder->AddFrame(code, offset);
+      if (frame->is_interpreted()) {
+        bytecode = frame->LookupDartBytecode();
+        ASSERT(bytecode.ContainsInstructionAt(frame->pc()));
+        offset = Smi::New(frame->pc() - bytecode.PayloadStart());
+        builder->AddFrame(bytecode, offset);
+      } else {
+        code = frame->LookupDartCode();
+        ASSERT(code.ContainsInstructionAt(frame->pc()));
+        offset = Smi::New(frame->pc() - code.PayloadStart());
+        builder->AddFrame(code, offset);
+      }
     }
     frame = frames.NextFrame();
   }
@@ -241,7 +248,7 @@
       switch (move.source_kind()) {
         case CatchEntryMove::SourceKind::kConstant:
           if (pool == nullptr) {
-            pool = &ObjectPool::Handle(code_->object_pool());
+            pool = &ObjectPool::Handle(code_->GetObjectPool());
           }
           value = pool->ObjectAt(move.src_slot());
           break;
@@ -441,8 +448,7 @@
         (*pending_deopts)[i].set_pc(program_counter);
 
         // Jump to the deopt stub instead of the catch handler.
-        program_counter =
-            StubCode::DeoptimizeLazyFromThrow_entry()->EntryPoint();
+        program_counter = StubCode::DeoptimizeLazyFromThrow().EntryPoint();
         if (FLAG_trace_deoptimization) {
           THR_Print("Throwing to frame scheduled for lazy deopt fp=%" Pp "\n",
                     frame_pointer);
@@ -509,7 +515,7 @@
   thread->set_active_exception(exception_object);
   thread->set_active_stacktrace(stacktrace_object);
   thread->set_resume_pc(remapped_pc);
-  uword run_exception_pc = StubCode::RunExceptionHandler_entry()->EntryPoint();
+  uword run_exception_pc = StubCode::RunExceptionHandler().EntryPoint();
   Exceptions::JumpToFrame(thread, run_exception_pc, stack_pointer,
                           frame_pointer, false /* do not clear deopt */);
 }
@@ -556,8 +562,8 @@
   // to set up the stacktrace object in kStackTraceObjectReg, and to
   // continue execution at the given pc in the given frame.
   typedef void (*ExcpHandler)(uword, uword, uword, Thread*);
-  ExcpHandler func = reinterpret_cast<ExcpHandler>(
-      StubCode::JumpToFrame_entry()->EntryPoint());
+  ExcpHandler func =
+      reinterpret_cast<ExcpHandler>(StubCode::JumpToFrame().EntryPoint());
 
   // Unpoison the stack before we tear it down in the generated stub code.
   uword current_sp = OSThread::GetCurrentStackPointer() - 1024;
@@ -612,10 +618,12 @@
   return GetStackTraceForException();
 }
 
+DART_NORETURN
 static void ThrowExceptionHelper(Thread* thread,
                                  const Instance& incoming_exception,
                                  const Instance& existing_stacktrace,
                                  const bool is_rethrow) {
+  DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
   bool use_preallocated_stacktrace = false;
@@ -745,18 +753,14 @@
 void Exceptions::CreateAndThrowTypeError(TokenPosition location,
                                          const AbstractType& src_type,
                                          const AbstractType& dst_type,
-                                         const String& dst_name,
-                                         const String& bound_error_msg) {
+                                         const String& dst_name) {
   ASSERT(!dst_name.IsNull());  // Pass Symbols::Empty() instead.
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   const Array& args = Array::Handle(zone, Array::New(4));
 
   ExceptionType exception_type =
-      (bound_error_msg.IsNull() &&
-       (dst_name.raw() == Symbols::InTypeCast().raw()))
-          ? kCast
-          : kType;
+      (dst_name.raw() == Symbols::InTypeCast().raw()) ? kCast : kType;
 
   DartFrameIterator iterator(thread,
                              StackFrameIterator::kNoCrossThreadIteration);
@@ -780,51 +784,38 @@
   const GrowableObjectArray& pieces =
       GrowableObjectArray::Handle(zone, GrowableObjectArray::New(20));
 
-  // Print bound error first, if any.
-  if (!bound_error_msg.IsNull() && (bound_error_msg.Length() > 0)) {
-    pieces.Add(bound_error_msg);
-    pieces.Add(Symbols::NewLine());
-  }
-
   // If dst_type is malformed or malbounded, only print the embedded error.
   if (!dst_type.IsNull()) {
-    const LanguageError& error = LanguageError::Handle(zone, dst_type.error());
-    if (!error.IsNull()) {
-      // Print the embedded error only.
-      pieces.Add(String::Handle(zone, String::New(error.ToErrorCString())));
-      pieces.Add(Symbols::NewLine());
-    } else {
-      // Describe the type error.
-      if (!src_type.IsNull()) {
-        pieces.Add(Symbols::TypeQuote());
-        pieces.Add(String::Handle(zone, src_type.UserVisibleName()));
-        pieces.Add(Symbols::QuoteIsNotASubtypeOf());
-      }
+    // Describe the type error.
+    if (!src_type.IsNull()) {
       pieces.Add(Symbols::TypeQuote());
-      pieces.Add(String::Handle(zone, dst_type.UserVisibleName()));
+      pieces.Add(String::Handle(zone, src_type.UserVisibleName()));
+      pieces.Add(Symbols::QuoteIsNotASubtypeOf());
+    }
+    pieces.Add(Symbols::TypeQuote());
+    pieces.Add(String::Handle(zone, dst_type.UserVisibleName()));
+    pieces.Add(Symbols::SingleQuote());
+    if (exception_type == kCast) {
+      pieces.Add(dst_name);
+    } else if (dst_name.Length() > 0) {
+      pieces.Add(Symbols::SpaceOfSpace());
       pieces.Add(Symbols::SingleQuote());
-      if (exception_type == kCast) {
-        pieces.Add(dst_name);
-      } else if (dst_name.Length() > 0) {
-        pieces.Add(Symbols::SpaceOfSpace());
-        pieces.Add(Symbols::SingleQuote());
-        pieces.Add(dst_name);
-        pieces.Add(Symbols::SingleQuote());
-      }
-      // Print ambiguous URIs of src and dst types.
-      URIs uris(zone, 12);
-      if (!src_type.IsNull()) {
-        src_type.EnumerateURIs(&uris);
-      }
-      if (!dst_type.IsDynamicType() && !dst_type.IsVoidType()) {
-        dst_type.EnumerateURIs(&uris);
-      }
-      const String& formatted_uris =
-          String::Handle(zone, AbstractType::PrintURIs(&uris));
-      if (formatted_uris.Length() > 0) {
-        pieces.Add(Symbols::SpaceWhereNewLine());
-        pieces.Add(formatted_uris);
-      }
+      pieces.Add(dst_name);
+      pieces.Add(Symbols::SingleQuote());
+    }
+    // Print ambiguous URIs of src and dst types.
+    URIs uris(zone, 12);
+    if (!src_type.IsNull()) {
+      src_type.EnumerateURIs(&uris);
+    }
+    if (!dst_type.IsDynamicType() && !dst_type.IsVoidType()) {
+      dst_type.EnumerateURIs(&uris);
+    }
+    const String& formatted_uris =
+        String::Handle(zone, AbstractType::PrintURIs(&uris));
+    if (formatted_uris.Length() > 0) {
+      pieces.Add(Symbols::SpaceWhereNewLine());
+      pieces.Add(formatted_uris);
     }
   }
   const Array& arr = Array::Handle(zone, Array::MakeFixedLength(pieces));
@@ -868,9 +859,10 @@
 }
 
 void Exceptions::PropagateError(const Error& error) {
+  ASSERT(!error.IsNull());
   Thread* thread = Thread::Current();
+  DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
   Zone* zone = thread->zone();
-  ASSERT(thread->top_exit_frame_info() != 0);
   if (error.IsUnhandledException()) {
     // If the error object represents an unhandled exception, then
     // rethrow the exception in the normal fashion.
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index b681b0f..d43201f 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -30,14 +30,14 @@
 
 class Exceptions : AllStatic {
  public:
-  static void Throw(Thread* thread, const Instance& exception);
-  static void ReThrow(Thread* thread,
-                      const Instance& exception,
-                      const Instance& stacktrace);
-  static void PropagateError(const Error& error);
+  DART_NORETURN static void Throw(Thread* thread, const Instance& exception);
+  DART_NORETURN static void ReThrow(Thread* thread,
+                                    const Instance& exception,
+                                    const Instance& stacktrace);
+  DART_NORETURN static void PropagateError(const Error& error);
 
   // Propagate an error to the entry frame, skipping over Dart frames.
-  static void PropagateToEntry(const Error& error);
+  DART_NORETURN static void PropagateToEntry(const Error& error);
 
   // Helpers to create and throw errors.
   static RawStackTrace* CurrentStackTrace();
@@ -46,8 +46,7 @@
   static void CreateAndThrowTypeError(TokenPosition location,
                                       const AbstractType& src_type,
                                       const AbstractType& dst_type,
-                                      const String& dst_name,
-                                      const String& bound_error_msg);
+                                      const String& dst_name);
 
   enum ExceptionType {
     kNone,
@@ -72,28 +71,29 @@
     kCompileTimeError,
   };
 
-  static void ThrowByType(ExceptionType type, const Array& arguments);
+  DART_NORETURN static void ThrowByType(ExceptionType type,
+                                        const Array& arguments);
   // Uses the preallocated out of memory exception to avoid calling
   // into Dart code or allocating any code.
-  static void ThrowOOM();
-  static void ThrowStackOverflow();
-  static void ThrowArgumentError(const Instance& arg);
-  static void ThrowRangeError(const char* argument_name,
-                              const Integer& argument_value,
-                              intptr_t expected_from,
-                              intptr_t expected_to);
-  static void ThrowRangeErrorMsg(const char* msg);
-  static void ThrowCompileTimeError(const LanguageError& error);
+  DART_NORETURN static void ThrowOOM();
+  DART_NORETURN static void ThrowStackOverflow();
+  DART_NORETURN static void ThrowArgumentError(const Instance& arg);
+  DART_NORETURN static void ThrowRangeError(const char* argument_name,
+                                            const Integer& argument_value,
+                                            intptr_t expected_from,
+                                            intptr_t expected_to);
+  DART_NORETURN static void ThrowRangeErrorMsg(const char* msg);
+  DART_NORETURN static void ThrowCompileTimeError(const LanguageError& error);
 
   // Returns a RawInstance if the exception is successfully created,
   // otherwise returns a RawError.
   static RawObject* Create(ExceptionType type, const Array& arguments);
 
-  static void JumpToFrame(Thread* thread,
-                          uword program_counter,
-                          uword stack_pointer,
-                          uword frame_pointer,
-                          bool clear_deopt_at_target);
+  DART_NORETURN static void JumpToFrame(Thread* thread,
+                                        uword program_counter,
+                                        uword stack_pointer,
+                                        uword frame_pointer,
+                                        bool clear_deopt_at_target);
 
  private:
   DISALLOW_COPY_AND_ASSIGN(Exceptions);
diff --git a/runtime/vm/exceptions_test.cc b/runtime/vm/exceptions_test.cc
index fcd8869..fe090d6 100644
--- a/runtime/vm/exceptions_test.cc
+++ b/runtime/vm/exceptions_test.cc
@@ -14,8 +14,12 @@
 
 void FUNCTION_NAME(Unhandled_equals)(Dart_NativeArguments args) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
-  const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0));
-  const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1));
+  TransitionNativeToVM transition(arguments->thread());
+  Zone* zone = arguments->thread()->zone();
+  const Instance& expected =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Instance& actual =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(1));
   if (!expected.CanonicalizeEquals(actual)) {
     OS::PrintErr("expected: '%s' actual: '%s'\n", expected.ToCString(),
                  actual.ToCString());
@@ -64,6 +68,7 @@
                                          bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = true;
+  TransitionNativeToVM transition(Thread::Current());
   const Object& obj = Object::Handle(Api::UnwrapHandle(name));
   ASSERT(obj.IsString());
   const char* function_name = obj.ToCString();
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 531152e..d11e203 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -68,6 +68,8 @@
   P(compilation_counter_threshold, int, 10,                                    \
     "Function's usage-counter value before interpreted function is compiled, " \
     "-1 means never")                                                          \
+  P(concurrent_mark, bool, USING_MULTICORE,                                    \
+    "Concurrent mark for old generation.")                                     \
   P(concurrent_sweep, bool, USING_MULTICORE,                                   \
     "Concurrent sweep for old generation.")                                    \
   R(dedup_instructions, true, bool, false,                                     \
@@ -90,11 +92,6 @@
     "Compile expressions with the Kernel front-end.")                          \
   P(enable_mirrors, bool, true,                                                \
     "Disable to make importing dart:mirrors an error.")                        \
-  R(enable_type_checks, false, bool, false, "Enable type checks.")             \
-  R(error_on_bad_override, false, bool, false,                                 \
-    "Report error for bad overrides. Ignored in strong mode.")                 \
-  R(error_on_bad_type, false, bool, false,                                     \
-    "Report error for malformed types.")                                       \
   P(fields_may_be_reset, bool, false,                                          \
     "Don't optimize away static field initialization")                         \
   C(force_clone_compiler_objects, false, false, bool, false,                   \
@@ -156,13 +153,10 @@
   R(profiler, false, bool, false, "Enable the profiler.")                      \
   R(profiler_native_memory, false, bool, false,                                \
     "Enable native memory statistic collection.")                              \
-  P(reify_generic_functions, bool, true,                                       \
-    "Enable reification of generic functions (not yet supported).")            \
   P(reorder_basic_blocks, bool, true, "Reorder basic blocks")                  \
   C(stress_async_stacks, false, false, bool, false,                            \
     "Stress test async stack traces")                                          \
-  P(strong, bool, true, "Enable strong mode.")                                 \
-  P(sync_async, bool, true, "Start `async` functions synchronously.")          \
+  P(use_bare_instructions, bool, false, "Enable bare instructions mode.")      \
   R(support_disassembler, false, bool, true, "Support the disassembler.")      \
   R(support_il_printer, false, bool, true, "Support the IL printer.")          \
   C(support_reload, false, false, bool, true, "Support isolate reload.")       \
@@ -170,20 +164,31 @@
   R(support_timeline, false, bool, true, "Support timeline.")                  \
   D(trace_cha, bool, false, "Trace CHA operations")                            \
   R(trace_field_guards, false, bool, false, "Trace changes in field's cids.")  \
+  D(trace_ic, bool, false, "Trace IC handling")                                \
+  D(trace_ic_miss_in_optimized, bool, false,                                   \
+    "Trace IC miss in optimized code")                                         \
   C(trace_irregexp, false, false, bool, false, "Trace irregexps.")             \
+  D(trace_intrinsified_natives, bool, false,                                   \
+    "Report if any of the intrinsified natives are called")                    \
   D(trace_isolates, bool, false, "Trace isolate creation and shut down.")      \
   D(trace_handles, bool, false, "Traces allocation of handles.")               \
   D(trace_kernel_binary, bool, false, "Trace Kernel reader/writer.")           \
+  D(trace_natives, bool, false, "Trace invocation of natives")                 \
   D(trace_optimization, bool, false, "Print optimization details.")            \
   R(trace_profiler, false, bool, false, "Profiler trace")                      \
   D(trace_profiler_verbose, bool, false, "Verbose profiler trace")             \
+  D(trace_runtime_calls, bool, false, "Trace runtime calls.")                  \
   D(trace_ssa_allocator, bool, false, "Trace register allocation over SSA.")   \
   P(trace_strong_mode_types, bool, false,                                      \
     "Trace optimizations based on strong mode types.")                         \
+  D(trace_type_checks, bool, false, "Trace runtime type checks.")              \
+  D(trace_patching, bool, false, "Trace patching of code.")                    \
+  D(trace_optimized_ic_calls, bool, false,                                     \
+    "Trace IC calls in optimized code.")                                       \
   D(trace_zones, bool, false, "Traces allocation sizes in the zone.")          \
   P(truncating_left_shift, bool, true,                                         \
     "Optimize left shift to truncate if possible")                             \
-  C(use_bytecode_compiler, false, false, bool, false, "Compile from bytecode") \
+  P(use_bytecode_compiler, bool, false, "Compile from bytecode")               \
   P(use_compactor, bool, false, "Compact the heap during old-space GC.")       \
   P(use_cha_deopt, bool, true,                                                 \
     "Use class hierarchy analysis even if it can cause deoptimization.")       \
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h
index 82f860c..a261211 100644
--- a/runtime/vm/globals.h
+++ b/runtime/vm/globals.h
@@ -85,10 +85,6 @@
 #define TAG_IC_DATA
 #endif
 
-#if !defined(TARGET_OS_MACOS_IOS) && !defined(TARGET_OS_ANDROID)
-#define CONCURRENT_MARKING 1
-#endif
-
 // The expression OFFSET_OF(type, field) computes the byte-offset of
 // the specified field relative to the containing type.
 //
diff --git a/runtime/vm/growable_array.h b/runtime/vm/growable_array.h
index 4788bff..5cd2d0b 100644
--- a/runtime/vm/growable_array.h
+++ b/runtime/vm/growable_array.h
@@ -11,7 +11,7 @@
 #define RUNTIME_VM_GROWABLE_ARRAY_H_
 
 #include "platform/growable_array.h"
-#include "vm/thread.h"
+#include "vm/thread_state.h"
 #include "vm/zone.h"
 
 namespace dart {
@@ -25,10 +25,10 @@
   explicit GrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, ValueObject, Zone>(
             initial_capacity,
-            ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            ASSERT_NOTNULL(ThreadState::Current()->zone())) {}
   GrowableArray()
       : BaseGrowableArray<T, ValueObject, Zone>(
-            ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            ASSERT_NOTNULL(ThreadState::Current()->zone())) {}
 };
 
 template <typename T>
@@ -40,10 +40,10 @@
   explicit ZoneGrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, ZoneAllocated, Zone>(
             initial_capacity,
-            ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            ASSERT_NOTNULL(ThreadState::Current()->zone())) {}
   ZoneGrowableArray()
       : BaseGrowableArray<T, ZoneAllocated, Zone>(
-            ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            ASSERT_NOTNULL(ThreadState::Current()->zone())) {}
 };
 
 // T must be a Handle type.
diff --git a/runtime/vm/growable_array_test.cc b/runtime/vm/growable_array_test.cc
index 1796f75..2b9b23b 100644
--- a/runtime/vm/growable_array_test.cc
+++ b/runtime/vm/growable_array_test.cc
@@ -92,7 +92,7 @@
   EXPECT_EQ(4, g.Last());
 }
 
-TEST_CASE(GrowableHandlePtr) {
+ISOLATE_UNIT_TEST_CASE(GrowableHandlePtr) {
   Zone* zone = Thread::Current()->zone();
   GrowableHandlePtrArray<const String> test1(zone, 1);
   EXPECT_EQ(0, test1.length());
diff --git a/runtime/vm/handles.cc b/runtime/vm/handles.cc
index 866260a..3c429ef 100644
--- a/runtime/vm/handles.cc
+++ b/runtime/vm/handles.cc
@@ -73,7 +73,7 @@
 }
 
 void HandleScope::Initialize() {
-  ASSERT(thread()->no_handle_scope_depth() == 0);
+  ASSERT(thread()->MayAllocateHandles());
   VMHandles* handles = thread()->zone()->handles();
   ASSERT(handles != NULL);
   saved_handle_block_ = handles->scoped_blocks_;
@@ -84,7 +84,7 @@
 #endif
 }
 
-HandleScope::HandleScope(Thread* thread) : StackResource(thread) {
+HandleScope::HandleScope(Thread* thread) : ThreadStackResource(thread) {
   Initialize();
 }
 
@@ -102,14 +102,4 @@
 #endif
 }
 
-#if defined(DEBUG)
-NoHandleScope::NoHandleScope(Thread* thread) : StackResource(thread) {
-  thread->IncrementNoHandleScopeDepth();
-}
-
-NoHandleScope::~NoHandleScope() {
-  thread()->DecrementNoHandleScopeDepth();
-}
-#endif  // defined(DEBUG)
-
 }  // namespace dart
diff --git a/runtime/vm/handles.h b/runtime/vm/handles.h
index 374181a..522aa02 100644
--- a/runtime/vm/handles.h
+++ b/runtime/vm/handles.h
@@ -8,6 +8,7 @@
 #include "vm/allocation.h"
 #include "vm/flags.h"
 #include "vm/os.h"
+#include "vm/thread_stack_resource.h"
 
 namespace dart {
 
@@ -45,15 +46,6 @@
 //   Handles::AllocateZoneHandle() function for creating zone handles.
 //   The ZoneHandle function of the object type is the only way to create
 //   zone handles in the dart VM.
-//
-// There are some critical regions of the Dart VM were we may need to manipulate
-// raw dart objects directly. We use NOHANDLESCOPE to assert that we do not
-// add code that will allocate new handles during this critical area.
-// {
-//   NOHANDLESCOPE(thread);
-//   ....
-//   ....
-// }
 
 // Forward declarations.
 class ObjectPointerVisitor;
@@ -287,7 +279,7 @@
 //   code that creates some scoped handles.
 //   ....
 // }
-class HandleScope : public StackResource {
+class HandleScope : public ThreadStackResource {
  public:
   explicit HandleScope(Thread* thread);
   ~HandleScope();
@@ -307,43 +299,6 @@
 #define HANDLESCOPE(thread)                                                    \
   dart::HandleScope vm_internal_handles_scope_(thread);
 
-// The class NoHandleScope is used in critical regions of the virtual machine
-// code where raw dart object pointers are directly manipulated.
-// This class asserts that we do not add code that will allocate new handles
-// during this critical area.
-// It is used as follows:
-// {
-//   NOHANDLESCOPE(thread);
-//   ....
-//   .....
-//   critical code that manipulates dart objects directly.
-//   ....
-// }
-#if defined(DEBUG)
-class NoHandleScope : public StackResource {
- public:
-  explicit NoHandleScope(Thread* thread);
-  ~NoHandleScope();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NoHandleScope);
-};
-#else   // defined(DEBUG)
-class NoHandleScope : public ValueObject {
- public:
-  explicit NoHandleScope(Thread* thread) {}
-  NoHandleScope() {}
-  ~NoHandleScope() {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NoHandleScope);
-};
-#endif  // defined(DEBUG)
-
-// Macro to start a no handles scope in the code.
-#define NOHANDLESCOPE(thread)                                                  \
-  dart::NoHandleScope no_vm_internal_handles_scope_(thread);
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_HANDLES_H_
diff --git a/runtime/vm/handles_impl.h b/runtime/vm/handles_impl.h
index 901a837..3bbd19f 100644
--- a/runtime/vm/handles_impl.h
+++ b/runtime/vm/handles_impl.h
@@ -82,7 +82,7 @@
 #if defined(DEBUG)
   Thread* thread = Thread::Current();
   ASSERT(thread->top_handle_scope() != NULL);
-  ASSERT(thread->no_handle_scope_depth() == 0);
+  ASSERT(thread->MayAllocateHandles());
 #endif  // DEBUG
   Handles* handles = zone->handles();
   ASSERT(handles != NULL);
@@ -97,7 +97,7 @@
 #if defined(DEBUG)
   Thread* thread = Thread::Current();
   ASSERT(zone->ContainsNestedZone(thread->zone()));
-  ASSERT(thread->no_handle_scope_depth() == 0);
+  ASSERT(thread->MayAllocateHandles());
 #endif  // DEBUG
   Handles* handles = zone->handles();
   ASSERT(handles != NULL);
diff --git a/runtime/vm/handles_test.cc b/runtime/vm/handles_test.cc
index 040225e..8dcb1ba 100644
--- a/runtime/vm/handles_test.cc
+++ b/runtime/vm/handles_test.cc
@@ -14,7 +14,7 @@
 namespace dart {
 
 // Unit test for Zone handle allocation.
-TEST_CASE(AllocateZoneHandle) {
+ISOLATE_UNIT_TEST_CASE(AllocateZoneHandle) {
 #if defined(DEBUG)
   FLAG_trace_handles = true;
 #endif
@@ -38,7 +38,7 @@
 }
 
 // Unit test for Scope handle allocation.
-TEST_CASE(AllocateScopeHandle) {
+ISOLATE_UNIT_TEST_CASE(AllocateScopeHandle) {
 #if defined(DEBUG)
   FLAG_trace_handles = true;
 #endif
@@ -86,11 +86,11 @@
 #if defined(DEBUG)
   FLAG_trace_handles = true;
 #endif
-  Thread* current = Thread::Current();
   Dart_Handle handle = NULL;
   // Check validity using zone handles.
   {
-    StackZone sz(current);
+    TransitionNativeToVM transition(thread);
+    StackZone sz(thread);
     handle = reinterpret_cast<Dart_Handle>(&Smi::ZoneHandle(Smi::New(1)));
     EXPECT_VALID(handle);
   }
@@ -98,18 +98,26 @@
 
   // Check validity using scoped handles.
   {
-    HANDLESCOPE(current);
     Dart_EnterScope();
-    handle = reinterpret_cast<Dart_Handle>(&Smi::Handle(Smi::New(1)));
-    EXPECT_VALID(handle);
+    {
+      TransitionNativeToVM transition(thread);
+      HANDLESCOPE(thread);
+      handle = reinterpret_cast<Dart_Handle>(&Smi::Handle(Smi::New(1)));
+      EXPECT_VALID(handle);
+    }
     Dart_ExitScope();
   }
   EXPECT(!Api::IsValid(handle));
 
   // Check validity using persistent handle.
   Isolate* isolate = Isolate::Current();
+  Dart_Handle scoped_handle;
+  {
+    TransitionNativeToVM transition(thread);
+    scoped_handle = Api::NewHandle(thread, Smi::New(1));
+  }
   Dart_PersistentHandle persistent_handle =
-      Dart_NewPersistentHandle(Api::NewHandle(thread, Smi::New(1)));
+      Dart_NewPersistentHandle(scoped_handle);
   EXPECT_VALID(persistent_handle);
 
   Dart_DeletePersistentHandle(persistent_handle);
diff --git a/runtime/vm/hash_map.h b/runtime/vm/hash_map.h
index 95194aa..1582c79 100644
--- a/runtime/vm/hash_map.h
+++ b/runtime/vm/hash_map.h
@@ -27,6 +27,8 @@
 
   BaseDirectChainedHashMap(const BaseDirectChainedHashMap& other);
 
+  intptr_t Length() const { return count_; }
+
   virtual ~BaseDirectChainedHashMap() {
     allocator_->template Free<HashMapListElement>(array_, array_size_);
     allocator_->template Free<HashMapListElement>(lists_, lists_size_);
@@ -372,7 +374,7 @@
  public:
   DirectChainedHashMap()
       : BaseDirectChainedHashMap<KeyValueTrait, ValueObject>(
-            ASSERT_NOTNULL(Thread::Current()->zone())) {}
+            ASSERT_NOTNULL(ThreadState::Current()->zone())) {}
 
   explicit DirectChainedHashMap(Zone* zone)
       : BaseDirectChainedHashMap<KeyValueTrait, ValueObject>(
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 2c408e7..250a8d0 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -715,6 +715,21 @@
   UnorderedHashSet(Zone* zone, RawArray* data) : BaseSet(zone, data) {}
   UnorderedHashSet(Object* key, Smi* value, Array* data)
       : BaseSet(key, value, data) {}
+
+  void Dump() const {
+    Object& entry = Object::Handle();
+    for (intptr_t i = 0; i < this->data_->Length(); i++) {
+      entry = this->data_->At(i);
+      if (entry.raw() == Object::sentinel().raw() ||
+          entry.raw() == Object::transition_sentinel().raw() || entry.IsSmi()) {
+        // empty, deleted, num_used/num_deleted
+        OS::PrintErr("%" Pd ": %s\n", i, entry.ToCString());
+      } else {
+        intptr_t hash = KeyTraits::Hash(entry);
+        OS::PrintErr("%" Pd ": %" Pd ", %s\n", i, hash, entry.ToCString());
+      }
+    }
+  }
 };
 
 }  // namespace dart
diff --git a/runtime/vm/heap/become.h b/runtime/vm/heap/become.h
index e962735..20804ea 100644
--- a/runtime/vm/heap/become.h
+++ b/runtime/vm/heap/become.h
@@ -80,17 +80,16 @@
   // Useful for atomically applying behavior and schema changes.
   static void ElementsForwardIdentity(const Array& before, const Array& after);
 
-  // Update any references pointing to forwarding objects to point the
-  // forwarding objects' targets. Used by the implementation of become and the
-  // simplistic compactor.
-  static void FollowForwardingPointers(Thread* thread);
-
   // Convert and instance object into a dummy object,
   // making the instance independent of its class.
   // (used for morphic instances during reload).
   static void MakeDummyObject(const Instance& instance);
 
  private:
+  // Update any references pointing to forwarding objects to point the
+  // forwarding objects' targets.
+  static void FollowForwardingPointers(Thread* thread);
+
   static void CrashDump(RawObject* before_obj, RawObject* after_obj);
 };
 
diff --git a/runtime/vm/heap/compactor.cc b/runtime/vm/heap/compactor.cc
index 12815bf..859174e 100644
--- a/runtime/vm/heap/compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -13,6 +13,11 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool,
+            force_evacuation,
+            false,
+            "Force compaction to move every movable object");
+
 static const intptr_t kBitVectorWordsPerBlock = 1;
 static const intptr_t kBlockSize =
     kObjectAlignment * kBitsPerWord * kBitVectorWordsPerBlock;
@@ -203,6 +208,26 @@
     ASSERT(task_index == num_tasks);
   }
 
+  if (FLAG_force_evacuation) {
+    // Inject empty pages at the beginning of each worker's list to ensure all
+    // objects move and all pages that used to have an object are released.
+    // This can be helpful for finding untracked pointers because it prevents
+    // an untracked pointer from getting lucky with its target not moving.
+    for (intptr_t task_index = 0; task_index < num_tasks; task_index++) {
+      const intptr_t pages_per_task = num_pages / num_tasks;
+      for (intptr_t j = 0; j < pages_per_task; j++) {
+        HeapPage* page = heap_->old_space()->AllocatePage(HeapPage::kData,
+                                                          /* link */ false);
+        FreeListElement::AsElement(page->object_start(),
+                                   page->object_end() - page->object_start());
+
+        // The compactor slides down: add the empty pages to the beginning.
+        page->set_next(heads[task_index]);
+        heads[task_index] = page;
+      }
+    }
+  }
+
   {
     ThreadBarrier barrier(num_tasks + 1, heap_->barrier(),
                           heap_->barrier_done());
@@ -251,6 +276,7 @@
       tails[task_index]->set_next(heads[task_index + 1]);
     }
     tails[num_tasks - 1]->set_next(NULL);
+    heap_->old_space()->pages_ = pages = heads[0];
     heap_->old_space()->pages_tail_ = tails[num_tasks - 1];
 
     delete[] heads;
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 96b0eec..da5e831 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -8,6 +8,7 @@
 #include "platform/utils.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/flags.h"
+#include "vm/heap/become.h"
 #include "vm/heap/pages.h"
 #include "vm/heap/safepoint.h"
 #include "vm/heap/scavenger.h"
@@ -61,23 +62,72 @@
   }
 }
 
+void Heap::MakeTLABIterable(Thread* thread) {
+  uword start = thread->top();
+  uword end = thread->end();
+  ASSERT(end >= start);
+  intptr_t size = end - start;
+  ASSERT(Utils::IsAligned(size, kObjectAlignment));
+  if (size >= kObjectAlignment) {
+    // ForwardingCorpse(forwarding to default null) will work as filler.
+    ForwardingCorpse::AsForwarder(start, size);
+    ASSERT(RawObject::FromAddr(start)->Size() == size);
+  }
+}
+
+void Heap::AbandonRemainingTLAB(Thread* thread) {
+  MakeTLABIterable(thread);
+  thread->set_top(0);
+  thread->set_end(0);
+}
+
+intptr_t Heap::CalculateTLABSize() {
+  intptr_t size = new_space_.end() - new_space_.top();
+  return Utils::RoundDown(size, kObjectAlignment);
+}
+
 uword Heap::AllocateNew(intptr_t size) {
   ASSERT(Thread::Current()->no_safepoint_scope_depth() == 0);
   // Currently, only the Dart thread may allocate in new space.
   isolate()->AssertCurrentThreadIsMutator();
   Thread* thread = Thread::Current();
   uword addr = new_space_.TryAllocateInTLAB(thread, size);
-  if (addr == 0) {
-    // This call to CollectGarbage might end up "reusing" a collection spawned
-    // from a different thread and will be racing to allocate the requested
-    // memory with other threads being released after the collection.
-    CollectGarbage(kNew);
-    addr = new_space_.TryAllocateInTLAB(thread, size);
-    if (addr == 0) {
-      return AllocateOld(size, HeapPage::kData);
+  if (addr != 0) {
+    return addr;
+  }
+
+  intptr_t tlab_size = CalculateTLABSize();
+  if ((tlab_size > 0) && (size > tlab_size)) {
+    return AllocateOld(size, HeapPage::kData);
+  }
+
+  AbandonRemainingTLAB(thread);
+  if (tlab_size > 0) {
+    uword tlab_top = new_space_.TryAllocateNewTLAB(thread, tlab_size);
+    if (tlab_top != 0) {
+      addr = new_space_.TryAllocateInTLAB(thread, size);
+      ASSERT(addr != 0);
+      return addr;
     }
   }
-  return addr;
+
+  ASSERT(!thread->HasActiveTLAB());
+
+  // This call to CollectGarbage might end up "reusing" a collection spawned
+  // from a different thread and will be racing to allocate the requested
+  // memory with other threads being released after the collection.
+  CollectGarbage(kNew);
+  tlab_size = CalculateTLABSize();
+  uword tlab_top = new_space_.TryAllocateNewTLAB(thread, tlab_size);
+  if (tlab_top != 0) {
+    addr = new_space_.TryAllocateInTLAB(thread, size);
+    // It is possible a GC doesn't clear enough space.
+    // In that case, we must fall through and allocate into old space.
+    if (addr != 0) {
+      return addr;
+    }
+  }
+  return AllocateOld(size, HeapPage::kData);
 }
 
 uword Heap::AllocateOld(intptr_t size, HeapPage::PageType type) {
@@ -200,7 +250,7 @@
 }
 
 HeapIterationScope::HeapIterationScope(Thread* thread, bool writable)
-    : StackResource(thread),
+    : ThreadStackResource(thread),
       heap_(isolate()->heap()),
       old_space_(heap_->old_space()),
       writable_(writable) {
@@ -395,7 +445,8 @@
   ASSERT((reason != kOldSpace) && (reason != kPromotion));
   if (BeginNewSpaceGC(thread)) {
     RecordBeforeGC(kScavenge, reason);
-    VMTagScope tagScope(thread, VMTag::kGCNewSpaceTagId);
+    VMTagScope tagScope(thread, reason == kIdle ? VMTag::kGCIdleTagId
+                                                : VMTag::kGCNewSpaceTagId);
     TIMELINE_FUNCTION_GC_DURATION(thread, "EvacuateNewGeneration");
     new_space_.Evacuate();
     RecordAfterGC(kScavenge);
@@ -410,7 +461,8 @@
   if (BeginNewSpaceGC(thread)) {
     RecordBeforeGC(kScavenge, reason);
     {
-      VMTagScope tagScope(thread, VMTag::kGCNewSpaceTagId);
+      VMTagScope tagScope(thread, reason == kIdle ? VMTag::kGCIdleTagId
+                                                  : VMTag::kGCNewSpaceTagId);
       TIMELINE_FUNCTION_GC_DURATION_BASIC(thread, "CollectNewGeneration");
       new_space_.Scavenge();
       RecordAfterGC(kScavenge);
@@ -438,7 +490,8 @@
   }
   if (BeginOldSpaceGC(thread)) {
     RecordBeforeGC(type, reason);
-    VMTagScope tagScope(thread, VMTag::kGCOldSpaceTagId);
+    VMTagScope tagScope(thread, reason == kIdle ? VMTag::kGCIdleTagId
+                                                : VMTag::kGCOldSpaceTagId);
     TIMELINE_FUNCTION_GC_DURATION_BASIC(thread, "CollectOldGeneration");
     old_space_.CollectGarbage(type == kMarkCompact, true /* finish */);
     RecordAfterGC(type);
@@ -644,7 +697,7 @@
   StackZone stack_zone(Thread::Current());
 
   // Change the new space's top_ with the more up-to-date thread's view of top_
-  new_space_.FlushTLS();
+  new_space_.MakeNewSpaceIterable();
 
   ObjectSet* allocated_set =
       CreateAllocatedObjectSet(stack_zone.GetZone(), mark_expectation);
@@ -952,7 +1005,7 @@
 }
 
 NoHeapGrowthControlScope::NoHeapGrowthControlScope()
-    : StackResource(Thread::Current()) {
+    : ThreadStackResource(Thread::Current()) {
   Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
   current_growth_controller_state_ = heap->GrowthControlState();
   heap->DisableGrowthControl();
@@ -964,7 +1017,7 @@
 }
 
 WritableVMIsolateScope::WritableVMIsolateScope(Thread* thread)
-    : StackResource(thread) {
+    : ThreadStackResource(thread) {
   if (FLAG_write_protect_vm_isolate) {
     Dart::vm_isolate()->heap()->WriteProtect(false);
   }
@@ -977,8 +1030,17 @@
   }
 }
 
+WritableCodePages::WritableCodePages(Thread* thread, Isolate* isolate)
+    : StackResource(thread), isolate_(isolate) {
+  isolate_->heap()->WriteProtectCode(false);
+}
+
+WritableCodePages::~WritableCodePages() {
+  isolate_->heap()->WriteProtectCode(true);
+}
+
 BumpAllocateScope::BumpAllocateScope(Thread* thread)
-    : StackResource(thread), no_reload_scope_(thread->isolate(), thread) {
+    : ThreadStackResource(thread), no_reload_scope_(thread->isolate(), thread) {
   ASSERT(!thread->bump_allocate());
   // If the background compiler thread is not disabled, there will be a cycle
   // between the symbol table lock and the old space data lock.
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index 6f205184..6935bd1 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -281,6 +281,10 @@
 
   static const intptr_t kNewAllocatableSize = 256 * KB;
 
+  intptr_t CalculateTLABSize();
+  void MakeTLABIterable(Thread* thread);
+  void AbandonRemainingTLAB(Thread* thread);
+
  private:
   class GCStats : public ValueObject {
    public:
@@ -380,6 +384,7 @@
   friend class Precompiler;  // VisitObjects
   friend class Unmarker;     // VisitObjects
   friend class ServiceEvent;
+  friend class Scavenger;             // VerifyGC
   friend class PageSpace;             // VerifyGC
   friend class IsolateReloadContext;  // VisitObjects
   friend class ClassFinalizer;        // VisitObjects
@@ -390,7 +395,7 @@
   DISALLOW_COPY_AND_ASSIGN(Heap);
 };
 
-class HeapIterationScope : public StackResource {
+class HeapIterationScope : public ThreadStackResource {
  public:
   explicit HeapIterationScope(Thread* thread, bool writable = false);
   ~HeapIterationScope();
@@ -415,7 +420,7 @@
   DISALLOW_COPY_AND_ASSIGN(HeapIterationScope);
 };
 
-class NoHeapGrowthControlScope : public StackResource {
+class NoHeapGrowthControlScope : public ThreadStackResource {
  public:
   NoHeapGrowthControlScope();
   ~NoHeapGrowthControlScope();
@@ -425,17 +430,27 @@
   DISALLOW_COPY_AND_ASSIGN(NoHeapGrowthControlScope);
 };
 
-// Note: During this scope, the code pages are non-executable.
-class WritableVMIsolateScope : StackResource {
+// Note: During this scope all pages are writable and the code pages are
+// non-executable.
+class WritableVMIsolateScope : ThreadStackResource {
  public:
   explicit WritableVMIsolateScope(Thread* thread);
   ~WritableVMIsolateScope();
 };
 
+class WritableCodePages : StackResource {
+ public:
+  explicit WritableCodePages(Thread* thread, Isolate* isolate);
+  ~WritableCodePages();
+
+ private:
+  Isolate* isolate_;
+};
+
 // This scope forces heap growth, forces use of the bump allocator, and
 // takes the page lock. It is useful e.g. at program startup when allocating
 // many objects into old gen (like libraries, classes, and functions).
-class BumpAllocateScope : StackResource {
+class BumpAllocateScope : ThreadStackResource {
  public:
   explicit BumpAllocateScope(Thread* thread);
   ~BumpAllocateScope();
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index 357b577..af5236c 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -66,12 +66,15 @@
   EXPECT_VALID(result);
   EXPECT(!Dart_IsNull(result));
   EXPECT(Dart_IsList(result));
-  TransitionNativeToVM transition(thread);
-  Isolate* isolate = Isolate::Current();
-  Heap* heap = isolate->heap();
-  heap->CollectGarbage(Heap::kOld);
+  {
+    TransitionNativeToVM transition(thread);
+    thread->heap()->CollectGarbage(Heap::kOld);
+  }
   Dart_ExitScope();
-  heap->CollectGarbage(Heap::kOld);
+  {
+    TransitionNativeToVM transition(thread);
+    thread->heap()->CollectGarbage(Heap::kOld);
+  }
 }
 
 #ifndef PRODUCT
@@ -118,78 +121,84 @@
   Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(!Dart_IsNull(result));
-  TransitionNativeToVM transition(thread);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  const Class& cls = Class::Handle(GetClass(lib, "A"));
-  ASSERT(!cls.IsNull());
-  intptr_t cid = cls.id();
-  ClassHeapStats* class_stats =
-      ClassHeapStatsTestHelper::GetHeapStatsForCid(class_table, cid);
-  // Verify preconditions:
-  EXPECT_EQ(0, class_stats->pre_gc.old_count);
-  EXPECT_EQ(0, class_stats->post_gc.old_count);
-  EXPECT_EQ(0, class_stats->recent.old_count);
-  EXPECT_EQ(0, class_stats->pre_gc.new_count);
-  EXPECT_EQ(0, class_stats->post_gc.new_count);
-  // Class allocated twice since GC from new space.
-  EXPECT_EQ(2, class_stats->recent.new_count);
-  // Perform GC.
-  heap->CollectGarbage(Heap::kNew);
-  // Verify postconditions:
-  EXPECT_EQ(0, class_stats->pre_gc.old_count);
-  EXPECT_EQ(0, class_stats->post_gc.old_count);
-  EXPECT_EQ(0, class_stats->recent.old_count);
-  // Total allocations before GC.
-  EXPECT_EQ(2, class_stats->pre_gc.new_count);
-  // Only one survived.
-  EXPECT_EQ(1, class_stats->post_gc.new_count);
-  EXPECT_EQ(0, class_stats->recent.new_count);
-  // Perform GC. The following is heavily dependent on the behaviour
-  // of the GC: Retained instance of A will be promoted.
-  heap->CollectGarbage(Heap::kNew);
-  // Verify postconditions:
-  EXPECT_EQ(0, class_stats->pre_gc.old_count);
-  EXPECT_EQ(0, class_stats->post_gc.old_count);
-  // One promoted instance.
-  EXPECT_EQ(1, class_stats->promoted_count);
-  // Promotion counted as an allocation from old space.
-  EXPECT_EQ(1, class_stats->recent.old_count);
-  // There was one instance allocated before GC.
-  EXPECT_EQ(1, class_stats->pre_gc.new_count);
-  // There are no instances allocated in new space after GC.
-  EXPECT_EQ(0, class_stats->post_gc.new_count);
-  // No new allocations.
-  EXPECT_EQ(0, class_stats->recent.new_count);
-  // Perform a GC on new space.
-  heap->CollectGarbage(Heap::kNew);
-  // There were no instances allocated before GC.
-  EXPECT_EQ(0, class_stats->pre_gc.new_count);
-  // There are no instances allocated in new space after GC.
-  EXPECT_EQ(0, class_stats->post_gc.new_count);
-  // No new allocations.
-  EXPECT_EQ(0, class_stats->recent.new_count);
-  // Nothing was promoted.
-  EXPECT_EQ(0, class_stats->promoted_count);
-  heap->CollectGarbage(Heap::kOld);
-  // Verify postconditions:
-  EXPECT_EQ(1, class_stats->pre_gc.old_count);
-  EXPECT_EQ(1, class_stats->post_gc.old_count);
-  EXPECT_EQ(0, class_stats->recent.old_count);
+  ClassHeapStats* class_stats;
+  {
+    TransitionNativeToVM transition(thread);
+    Library& lib = Library::Handle();
+    lib ^= Api::UnwrapHandle(h_lib);
+    EXPECT(!lib.IsNull());
+    const Class& cls = Class::Handle(GetClass(lib, "A"));
+    ASSERT(!cls.IsNull());
+    intptr_t cid = cls.id();
+    class_stats =
+        ClassHeapStatsTestHelper::GetHeapStatsForCid(class_table, cid);
+    // Verify preconditions:
+    EXPECT_EQ(0, class_stats->pre_gc.old_count);
+    EXPECT_EQ(0, class_stats->post_gc.old_count);
+    EXPECT_EQ(0, class_stats->recent.old_count);
+    EXPECT_EQ(0, class_stats->pre_gc.new_count);
+    EXPECT_EQ(0, class_stats->post_gc.new_count);
+    // Class allocated twice since GC from new space.
+    EXPECT_EQ(2, class_stats->recent.new_count);
+    // Perform GC.
+    heap->CollectGarbage(Heap::kNew);
+    // Verify postconditions:
+    EXPECT_EQ(0, class_stats->pre_gc.old_count);
+    EXPECT_EQ(0, class_stats->post_gc.old_count);
+    EXPECT_EQ(0, class_stats->recent.old_count);
+    // Total allocations before GC.
+    EXPECT_EQ(2, class_stats->pre_gc.new_count);
+    // Only one survived.
+    EXPECT_EQ(1, class_stats->post_gc.new_count);
+    EXPECT_EQ(0, class_stats->recent.new_count);
+    // Perform GC. The following is heavily dependent on the behaviour
+    // of the GC: Retained instance of A will be promoted.
+    heap->CollectGarbage(Heap::kNew);
+    // Verify postconditions:
+    EXPECT_EQ(0, class_stats->pre_gc.old_count);
+    EXPECT_EQ(0, class_stats->post_gc.old_count);
+    // One promoted instance.
+    EXPECT_EQ(1, class_stats->promoted_count);
+    // Promotion counted as an allocation from old space.
+    EXPECT_EQ(1, class_stats->recent.old_count);
+    // There was one instance allocated before GC.
+    EXPECT_EQ(1, class_stats->pre_gc.new_count);
+    // There are no instances allocated in new space after GC.
+    EXPECT_EQ(0, class_stats->post_gc.new_count);
+    // No new allocations.
+    EXPECT_EQ(0, class_stats->recent.new_count);
+    // Perform a GC on new space.
+    heap->CollectGarbage(Heap::kNew);
+    // There were no instances allocated before GC.
+    EXPECT_EQ(0, class_stats->pre_gc.new_count);
+    // There are no instances allocated in new space after GC.
+    EXPECT_EQ(0, class_stats->post_gc.new_count);
+    // No new allocations.
+    EXPECT_EQ(0, class_stats->recent.new_count);
+    // Nothing was promoted.
+    EXPECT_EQ(0, class_stats->promoted_count);
+    heap->CollectGarbage(Heap::kOld);
+    // Verify postconditions:
+    EXPECT_EQ(1, class_stats->pre_gc.old_count);
+    EXPECT_EQ(1, class_stats->post_gc.old_count);
+    EXPECT_EQ(0, class_stats->recent.old_count);
+  }
   // Exit scope, freeing instance.
   Dart_ExitScope();
-  // Perform GC.
-  heap->CollectGarbage(Heap::kOld);
-  // Verify postconditions:
-  EXPECT_EQ(1, class_stats->pre_gc.old_count);
-  EXPECT_EQ(0, class_stats->post_gc.old_count);
-  EXPECT_EQ(0, class_stats->recent.old_count);
-  // Perform GC.
-  heap->CollectGarbage(Heap::kOld);
-  EXPECT_EQ(0, class_stats->pre_gc.old_count);
-  EXPECT_EQ(0, class_stats->post_gc.old_count);
-  EXPECT_EQ(0, class_stats->recent.old_count);
+  {
+    TransitionNativeToVM transition(thread);
+    // Perform GC.
+    heap->CollectGarbage(Heap::kOld);
+    // Verify postconditions:
+    EXPECT_EQ(1, class_stats->pre_gc.old_count);
+    EXPECT_EQ(0, class_stats->post_gc.old_count);
+    EXPECT_EQ(0, class_stats->recent.old_count);
+    // Perform GC.
+    heap->CollectGarbage(Heap::kOld);
+    EXPECT_EQ(0, class_stats->pre_gc.old_count);
+    EXPECT_EQ(0, class_stats->post_gc.old_count);
+    EXPECT_EQ(0, class_stats->recent.old_count);
+  }
   FLAG_concurrent_sweep = saved_concurrent_sweep_mode;
 }
 
@@ -214,9 +223,6 @@
   Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
   EXPECT(!Dart_IsNull(result));
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
   intptr_t before = class_stats->recent.new_size;
   Dart_Handle result2 = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result2);
@@ -261,12 +267,14 @@
   for (size_t space = 0; space < ARRAY_SIZE(spaces); ++space) {
     const String& obj = String::Handle(String::New("x", spaces[space]));
     {
+      HeapIterationScope iteration(thread);
       NoSafepointScope no_safepoint;
       FindOnly find_only(obj.raw());
       EXPECT(obj.raw() == heap->FindObject(&find_only));
     }
   }
   {
+    HeapIterationScope iteration(thread);
     NoSafepointScope no_safepoint;
     FindNothing find_nothing;
     EXPECT(Object::null() == heap->FindObject(&find_nothing));
@@ -689,4 +697,49 @@
   EXPECT_EQ(size_before, size_after);
 }
 
+ISOLATE_UNIT_TEST_CASE(ArrayTruncationRaces) {
+  // Alternate between allocating new lists and truncating.
+  // For each list, the life cycle is
+  // 1) the list is allocated and filled with some elements
+  // 2) kNumLists other lists are allocated
+  // 3) the list's backing store is truncated; the list becomes unreachable
+  // 4) kNumLists other lists are allocated
+  // 5) the backing store becomes unreachable
+  // The goal is to cause truncation *during* concurrent mark or sweep, by
+  // truncating an array that had been alive for a while and will be visited by
+  // a GC triggering by the allocations in step 2.
+
+  intptr_t kMaxListLength = 100;
+  intptr_t kNumLists = 1000;
+  Array& lists = Array::Handle(Array::New(kNumLists));
+  Array& arrays = Array::Handle(Array::New(kNumLists));
+
+  GrowableObjectArray& list = GrowableObjectArray::Handle();
+  Array& array = Array::Handle();
+  Object& element = Object::Handle();
+
+  for (intptr_t i = 0; i < kNumLists; i++) {
+    list = GrowableObjectArray::New(Heap::kNew);
+    intptr_t length = i % kMaxListLength;
+    for (intptr_t j = 0; j < length; j++) {
+      list.Add(element, Heap::kNew);
+    }
+    lists.SetAt(i, list);
+  }
+
+  intptr_t kTruncations = 100000;
+  for (intptr_t i = 0; i < kTruncations; i++) {
+    list ^= lists.At(i % kNumLists);
+    array = Array::MakeFixedLength(list);
+    arrays.SetAt(i % kNumLists, array);
+
+    list = GrowableObjectArray::New(Heap::kOld);
+    intptr_t length = i % kMaxListLength;
+    for (intptr_t j = 0; j < length; j++) {
+      list.Add(element, Heap::kOld);
+    }
+    lists.SetAt(i % kNumLists, list);
+  }
+}
+
 }  // namespace dart
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index fed194b..23fe586 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -53,11 +53,19 @@
         // If the code wasn't strongly visited through other references
         // after skipping the function's code pointer, then we disconnect the
         // code from the function.
-        func->StorePointer(&(func->ptr()->code_),
-                           StubCode::LazyCompile_entry()->code());
-        uword entry_point = StubCode::LazyCompile_entry()->EntryPoint();
-        func->ptr()->entry_point_ = entry_point;
-        func->ptr()->unchecked_entry_point_ = entry_point;
+        if (FLAG_enable_interpreter && Function::HasBytecode(func)) {
+          func->StorePointer(&(func->ptr()->code_),
+                             StubCode::InterpretCall().raw());
+          uword entry_point = StubCode::InterpretCall().EntryPoint();
+          func->ptr()->entry_point_ = entry_point;
+          func->ptr()->unchecked_entry_point_ = entry_point;
+        } else {
+          func->StorePointer(&(func->ptr()->code_),
+                             StubCode::LazyCompile().raw());
+          uword entry_point = StubCode::LazyCompile().EntryPoint();
+          func->ptr()->entry_point_ = entry_point;
+          func->ptr()->unchecked_entry_point_ = entry_point;
+        }
         if (FLAG_log_code_drop) {
           // NOTE: This code runs while GC is in progress and runs within
           // a NoHandleScope block. Hence it is not okay to use a regular Zone
@@ -164,6 +172,7 @@
   MarkingVisitorBase(Isolate* isolate,
                      PageSpace* page_space,
                      MarkingStack* marking_stack,
+                     MarkingStack* deferred_marking_stack,
                      SkippedCodeFunctions* skipped_code_functions)
       : ObjectPointerVisitor(isolate),
         thread_(Thread::Current()),
@@ -174,6 +183,7 @@
 #endif  // !PRODUCT
         page_space_(page_space),
         work_list_(marking_stack),
+        deferred_work_list_(deferred_marking_stack),
         delayed_weak_properties_(NULL),
         skipped_code_functions_(skipped_code_functions),
         marked_bytes_(0),
@@ -252,8 +262,7 @@
         if (class_id != kWeakPropertyCid) {
           size = raw_obj->VisitPointersNonvirtual(this);
         } else {
-          RawWeakProperty* raw_weak =
-              reinterpret_cast<RawWeakProperty*>(raw_obj);
+          RawWeakProperty* raw_weak = static_cast<RawWeakProperty*>(raw_obj);
           size = ProcessWeakProperty(raw_weak);
         }
         marked_bytes_ += size;
@@ -307,6 +316,20 @@
     return raw_weak->VisitPointersNonvirtual(this);
   }
 
+  void FinalizeInstructions() {
+    RawObject* raw_obj;
+    while ((raw_obj = deferred_work_list_.Pop()) != NULL) {
+      ASSERT(raw_obj->IsInstructions());
+      RawInstructions* instr = static_cast<RawInstructions*>(raw_obj);
+      if (TryAcquireMarkBit(instr)) {
+        intptr_t size = instr->Size();
+        marked_bytes_ += size;
+        NOT_IN_PRODUCT(UpdateLiveOld(kInstructionsCid, size));
+      }
+    }
+    deferred_work_list_.Finalize();
+  }
+
   // Called when all marking is complete.
   void Finalize() {
     work_list_.Finalize();
@@ -329,7 +352,10 @@
     }
   }
 
-  void AbandonWork() { work_list_.AbandonWork(); }
+  void AbandonWork() {
+    work_list_.AbandonWork();
+    deferred_work_list_.AbandonWork();
+  }
 
  private:
   void PushMarked(RawObject* raw_obj) {
@@ -362,7 +388,15 @@
       return;
     }
 
-    ASSERT(raw_obj->GetClassId() != kFreeListElement);
+    intptr_t class_id = raw_obj->GetClassId();
+    ASSERT(class_id != kFreeListElement);
+
+    if (sync && UNLIKELY(class_id == kInstructionsCid)) {
+      // If this is the concurrent marker, instruction pages may be
+      // non-writable.
+      deferred_work_list_.Push(raw_obj);
+      return;
+    }
 
     if (!TryAcquireMarkBit(raw_obj)) {
       // Already marked.
@@ -388,6 +422,7 @@
 #endif  // !PRODUCT
   PageSpace* page_space_;
   MarkerWorkList work_list_;
+  MarkerWorkList deferred_work_list_;
   RawWeakProperty* delayed_weak_properties_;
   SkippedCodeFunctions* skipped_code_functions_;
   uintptr_t marked_bytes_;
@@ -444,6 +479,15 @@
 
 void GCMarker::Prologue() {
   isolate_->ReleaseStoreBuffers();
+
+#ifndef DART_PRECOMPILED_RUNTIME
+  if (isolate_->IsMutatorThreadScheduled()) {
+    Interpreter* interpreter = isolate_->mutator_thread()->interpreter();
+    if (interpreter != NULL) {
+      interpreter->MajorGC();
+    }
+  }
+#endif
 }
 
 void GCMarker::Epilogue() {
@@ -628,6 +672,8 @@
         barrier_->Sync();
       } while (more_to_mark);
 
+      visitor_->FinalizeInstructions();
+
       // Phase 2: Weak processing and follow-up marking on main thread.
       barrier_->Sync();
 
@@ -807,7 +853,7 @@
 }
 
 void GCMarker::StartConcurrentMark(PageSpace* page_space, bool collect_code) {
-  isolate_->EnableIncrementalBarrier(&marking_stack_);
+  isolate_->EnableIncrementalBarrier(&marking_stack_, &deferred_marking_stack_);
 
   const intptr_t num_tasks = FLAG_marker_tasks;
 
@@ -830,6 +876,7 @@
     SkippedCodeFunctions* skipped_code_functions =
         collect_code ? new SkippedCodeFunctions() : NULL;
     visitors_[i] = new SyncMarkingVisitor(isolate_, page_space, &marking_stack_,
+                                          &deferred_marking_stack_,
                                           skipped_code_functions);
 
     // Begin marking on a helper thread.
@@ -862,9 +909,11 @@
       SkippedCodeFunctions* skipped_code_functions =
           collect_code ? new SkippedCodeFunctions() : NULL;
       UnsyncMarkingVisitor mark(isolate_, page_space, &marking_stack_,
+                                &deferred_marking_stack_,
                                 skipped_code_functions);
       IterateRoots(&mark, 0, 1);
       mark.DrainMarkingStack();
+      mark.FinalizeInstructions();
       {
         TIMELINE_FUNCTION_GC_DURATION(thread, "ProcessWeakHandles");
         MarkingWeakVisitor mark_weak(thread);
@@ -889,7 +938,8 @@
           SkippedCodeFunctions* skipped_code_functions =
               collect_code ? new SkippedCodeFunctions() : NULL;
           visitor = new SyncMarkingVisitor(
-              isolate_, page_space, &marking_stack_, skipped_code_functions);
+              isolate_, page_space, &marking_stack_, &deferred_marking_stack_,
+              skipped_code_functions);
         }
 
         MarkTask* mark_task =
diff --git a/runtime/vm/heap/marker.h b/runtime/vm/heap/marker.h
index 10fde88..a4424cf 100644
--- a/runtime/vm/heap/marker.h
+++ b/runtime/vm/heap/marker.h
@@ -63,6 +63,7 @@
   Isolate* const isolate_;
   Heap* const heap_;
   MarkingStack marking_stack_;
+  MarkingStack deferred_marking_stack_;
   MarkingVisitorBase<true>** visitors_;
 
   Mutex stats_mutex_;
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index 7c0392a..d90c9ec 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -72,6 +72,7 @@
   result->next_ = NULL;
   result->used_in_bytes_ = 0;
   result->forwarding_page_ = NULL;
+  result->card_table_ = NULL;
   result->type_ = type;
 
   LSAN_REGISTER_ROOT_REGION(result, sizeof(*result));
@@ -82,6 +83,11 @@
 void HeapPage::Deallocate() {
   ASSERT(forwarding_page_ == NULL);
 
+  if (card_table_ != NULL) {
+    free(card_table_);
+    card_table_ = NULL;
+  }
+
   bool image_page = is_image_page();
 
   if (!image_page) {
@@ -125,6 +131,66 @@
   ASSERT(obj_addr == end_addr);
 }
 
+void HeapPage::VisitRememberedCards(ObjectPointerVisitor* visitor) {
+  ASSERT(Thread::Current()->IsAtSafepoint());
+  NoSafepointScope no_safepoint;
+
+  if (card_table_ == NULL) {
+    return;
+  }
+
+  bool table_is_empty = false;
+
+  RawArray* obj = static_cast<RawArray*>(RawObject::FromAddr(object_start()));
+  ASSERT(obj->IsArray());
+  ASSERT(obj->IsCardRemembered());
+  RawObject** obj_from = obj->from();
+  RawObject** obj_to = obj->to(Smi::Value(obj->ptr()->length_));
+
+  const intptr_t size = card_table_size();
+  for (intptr_t i = 0; i < size; i++) {
+    if (card_table_[i] != 0) {
+      RawObject** card_from =
+          reinterpret_cast<RawObject**>(this) + (i << kSlotsPerCardLog2);
+      RawObject** card_to = reinterpret_cast<RawObject**>(card_from) +
+                            (1 << kSlotsPerCardLog2) - 1;
+      // Minus 1 because to is inclusive.
+
+      if (card_from < obj_from) {
+        // First card overlaps with header.
+        card_from = obj_from;
+      }
+      if (card_to > obj_to) {
+        // Last card(s) may extend past the object. Array truncation can make
+        // this happen for more than one card.
+        card_to = obj_to;
+      }
+
+      visitor->VisitPointers(card_from, card_to);
+
+      bool has_new_target = false;
+      for (RawObject** slot = card_from; slot <= card_to; slot++) {
+        if ((*slot)->IsNewObjectMayBeSmi()) {
+          has_new_target = true;
+          break;
+        }
+      }
+
+      if (has_new_target) {
+        // Card remains remembered.
+        table_is_empty = false;
+      } else {
+        card_table_[i] = 0;
+      }
+    }
+  }
+
+  if (table_is_empty) {
+    free(card_table_);
+    card_table_ = NULL;
+  }
+}
+
 RawObject* HeapPage::FindObject(FindObjectVisitor* visitor) const {
   uword obj_addr = object_start();
   uword end_addr = object_end();
@@ -194,7 +260,8 @@
       marker_(NULL),
       gc_time_micros_(0),
       collections_(0),
-      mark_words_per_micro_(kConservativeInitialMarkSpeed) {
+      mark_words_per_micro_(kConservativeInitialMarkSpeed),
+      enable_concurrent_mark_(FLAG_concurrent_mark) {
   // We aren't holding the lock but no one can reference us yet.
   UpdateMaxCapacityLocked();
   UpdateMaxUsed();
@@ -222,7 +289,14 @@
   return page_size >> kWordSizeLog2;
 }
 
-HeapPage* PageSpace::AllocatePage(HeapPage::PageType type) {
+HeapPage* PageSpace::AllocatePage(HeapPage::PageType type, bool link) {
+  {
+    MutexLocker ml(pages_lock_);
+    if (!CanIncreaseCapacityInWordsLocked(kPageSizeInWords)) {
+      return NULL;
+    }
+    IncreaseCapacityInWordsLocked(kPageSizeInWords);
+  }
   const bool is_exec = (type == HeapPage::kExecutable);
   const intptr_t kVmNameSize = 128;
   char vm_name[kVmNameSize];
@@ -231,54 +305,64 @@
   HeapPage* page = HeapPage::Allocate(kPageSizeInWords, type, vm_name);
   if (page == NULL) {
     RELEASE_ASSERT(!FLAG_abort_on_oom);
+    IncreaseCapacityInWords(-kPageSizeInWords);
     return NULL;
   }
 
   MutexLocker ml(pages_lock_);
-  if (!is_exec) {
-    if (pages_ == NULL) {
-      pages_ = page;
+  if (link) {
+    if (!is_exec) {
+      if (pages_ == NULL) {
+        pages_ = page;
+      } else {
+        pages_tail_->set_next(page);
+      }
+      pages_tail_ = page;
     } else {
-      pages_tail_->set_next(page);
-    }
-    pages_tail_ = page;
-  } else {
-    // Should not allocate executable pages when running from a precompiled
-    // snapshot.
-    ASSERT(Dart::vm_snapshot_kind() != Snapshot::kFullAOT);
+      // Should not allocate executable pages when running from a precompiled
+      // snapshot.
+      ASSERT(Dart::vm_snapshot_kind() != Snapshot::kFullAOT);
 
-    if (exec_pages_ == NULL) {
-      exec_pages_ = page;
-    } else {
-      if (FLAG_write_protect_code) {
-        exec_pages_tail_->WriteProtect(false);
+      if (exec_pages_ == NULL) {
+        exec_pages_ = page;
+      } else {
+        if (FLAG_write_protect_code) {
+          exec_pages_tail_->WriteProtect(false);
+        }
+        exec_pages_tail_->set_next(page);
+        if (FLAG_write_protect_code) {
+          exec_pages_tail_->WriteProtect(true);
+        }
       }
-      exec_pages_tail_->set_next(page);
-      if (FLAG_write_protect_code) {
-        exec_pages_tail_->WriteProtect(true);
-      }
+      exec_pages_tail_ = page;
     }
-    exec_pages_tail_ = page;
   }
-  IncreaseCapacityInWordsLocked(kPageSizeInWords);
+
   page->set_object_end(page->memory_->end());
   return page;
 }
 
 HeapPage* PageSpace::AllocateLargePage(intptr_t size, HeapPage::PageType type) {
-  const bool is_exec = (type == HeapPage::kExecutable);
   const intptr_t page_size_in_words = LargePageSizeInWordsFor(size);
+  {
+    MutexLocker ml(pages_lock_);
+    if (!CanIncreaseCapacityInWordsLocked(page_size_in_words)) {
+      return NULL;
+    }
+    IncreaseCapacityInWordsLocked(page_size_in_words);
+  }
+  const bool is_exec = (type == HeapPage::kExecutable);
   const intptr_t kVmNameSize = 128;
   char vm_name[kVmNameSize];
   Heap::RegionName(heap_, is_exec ? Heap::kCode : Heap::kOld, vm_name,
                    kVmNameSize);
   HeapPage* page = HeapPage::Allocate(page_size_in_words, type, vm_name);
   if (page == NULL) {
+    IncreaseCapacityInWords(-page_size_in_words);
     return NULL;
   }
   page->set_next(large_pages_);
   large_pages_ = page;
-  IncreaseCapacityInWords(page_size_in_words);
   // Only one object in this page (at least until String::MakeExternal or
   // Array::MakeFixedLength is called).
   page->set_object_end(page->object_start() + size);
@@ -372,9 +456,8 @@
   after_allocation.used_in_words += size >> kWordSizeLog2;
   // Can we grow by one page?
   after_allocation.capacity_in_words += kPageSizeInWords;
-  if ((growth_policy == kForceGrowth ||
-       !page_space_controller_.NeedsGarbageCollection(after_allocation)) &&
-      CanIncreaseCapacityInWords(kPageSizeInWords)) {
+  if (growth_policy == kForceGrowth ||
+      !page_space_controller_.NeedsGarbageCollection(after_allocation)) {
     HeapPage* page = AllocatePage(type);
     if (page == NULL) {
       return 0;
@@ -429,9 +512,8 @@
     SpaceUsage after_allocation = GetCurrentUsage();
     after_allocation.used_in_words += size >> kWordSizeLog2;
     after_allocation.capacity_in_words += page_size_in_words;
-    if ((growth_policy == kForceGrowth ||
-         !page_space_controller_.NeedsGarbageCollection(after_allocation)) &&
-        CanIncreaseCapacityInWords(page_size_in_words)) {
+    if (growth_policy == kForceGrowth ||
+        !page_space_controller_.NeedsGarbageCollection(after_allocation)) {
       HeapPage* page = AllocateLargePage(size, type);
       if (page != NULL) {
         result = page->object_start();
@@ -694,6 +776,12 @@
   }
 }
 
+void PageSpace::VisitRememberedCards(ObjectPointerVisitor* visitor) const {
+  for (HeapPage* page = large_pages_; page != NULL; page = page->next()) {
+    page->VisitRememberedCards(visitor);
+  }
+}
+
 RawObject* PageSpace::FindObject(FindObjectVisitor* visitor,
                                  HeapPage::PageType type) const {
   if (type == HeapPage::kExecutable) {
@@ -929,11 +1017,9 @@
   if (!finalize) {
 #if defined(TARGET_ARCH_IA32)
     return;  // Barrier not implemented.
-#elif !defined(CONCURRENT_MARKING)
-    return;  // Barrier generation disabled.
 #else
-    if (FLAG_marker_tasks == 0) return;   // Concurrent marking disabled.
-    if (FLAG_write_protect_code) return;  // Not implemented.
+    if (!enable_concurrent_mark()) return;  // Disabled.
+    if (FLAG_marker_tasks == 0) return;   // Disabled.
 #endif
   }
 
@@ -1007,7 +1093,7 @@
   }
 
   // Make code pages writable.
-  WriteProtectCode(false);
+  if (finalize) WriteProtectCode(false);
 
   // Save old value before GCMarker visits the weak persistent handles.
   SpaceUsage usage_before = GetCurrentUsage();
@@ -1112,7 +1198,7 @@
   }
 
   // Make code pages read-only.
-  WriteProtectCode(true);
+  if (finalize) WriteProtectCode(true);
 
   int64_t end = OS::GetCurrentMonotonicMicros();
 
@@ -1280,6 +1366,7 @@
   page->object_end_ = memory->end();
   page->used_in_bytes_ = page->object_end_ - page->object_start();
   page->forwarding_page_ = NULL;
+  page->card_table_ = NULL;
   if (is_executable) {
     ASSERT(Utils::IsAligned(pointer, OS::PreferredCodeAlignment()));
     page->type_ = HeapPage::kExecutable;
@@ -1318,7 +1405,7 @@
   if (heap_growth_ratio_ == 100) {
     return false;
   }
-#if defined(TARGET_ARCH_IA32) || !defined(CONCURRENT_MARKING)
+#if defined(TARGET_ARCH_IA32)
   intptr_t headroom = 0;
 #else
   intptr_t headroom = heap_->new_space()->CapacityInWords();
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index 047a3b7..7829cc0 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -82,6 +82,32 @@
     return reinterpret_cast<HeapPage*>(addr & kPageMask);
   }
 
+  // 1 card = 128 slots.
+  static const intptr_t kSlotsPerCardLog2 = 7;
+  static const intptr_t kBytesPerCardLog2 = kWordSizeLog2 + kSlotsPerCardLog2;
+
+  intptr_t card_table_size() const {
+    return memory_->size() >> kBytesPerCardLog2;
+  }
+
+  static intptr_t card_table_offset() {
+    return OFFSET_OF(HeapPage, card_table_);
+  }
+
+  void RememberCard(RawObject* const* slot) {
+    ASSERT(Contains(reinterpret_cast<uword>(slot)));
+    if (card_table_ == NULL) {
+      card_table_ = reinterpret_cast<uint8_t*>(
+          calloc(card_table_size(), sizeof(uint8_t)));
+    }
+    intptr_t offset =
+        reinterpret_cast<uword>(slot) - reinterpret_cast<uword>(this);
+    intptr_t index = offset >> kBytesPerCardLog2;
+    ASSERT((index >= 0) && (index < card_table_size()));
+    card_table_[index] = 1;
+  }
+  void VisitRememberedCards(ObjectPointerVisitor* visitor);
+
  private:
   void set_object_end(uword value) {
     ASSERT((value & kObjectAlignmentMask) == kOldObjectAlignmentOffset);
@@ -102,6 +128,7 @@
   uword object_end_;
   uword used_in_bytes_;
   ForwardingPage* forwarding_page_;
+  uint8_t* card_table_;  // Remembered set, not marking.
   PageType type_;
 
   friend class PageSpace;
@@ -277,6 +304,8 @@
   void VisitObjectsImagePages(ObjectVisitor* visitor) const;
   void VisitObjectPointers(ObjectPointerVisitor* visitor) const;
 
+  void VisitRememberedCards(ObjectPointerVisitor* visitor) const;
+
   RawObject* FindObject(FindObjectVisitor* visitor,
                         HeapPage::PageType type) const;
 
@@ -374,6 +403,11 @@
   // Have threads release marking stack blocks, etc.
   void AbandonMarkingForShutdown();
 
+  bool enable_concurrent_mark() const { return enable_concurrent_mark_; }
+  void set_enable_concurrent_mark(bool enable_concurrent_mark) {
+    enable_concurrent_mark_ = enable_concurrent_mark;
+  }
+
  private:
   // Ids for time and data records in Heap::GCStats.
   enum {
@@ -407,7 +441,7 @@
                                     bool is_locked);
   // Makes bump block walkable; do not call concurrently with mutator.
   void MakeIterable() const;
-  HeapPage* AllocatePage(HeapPage::PageType type);
+  HeapPage* AllocatePage(HeapPage::PageType type, bool link = true);
   void FreePage(HeapPage* page, HeapPage* previous_page);
   HeapPage* AllocateLargePage(intptr_t size, HeapPage::PageType type);
   void TruncateLargePage(HeapPage* page, intptr_t new_object_size_in_bytes);
@@ -424,16 +458,13 @@
 
   static intptr_t LargePageSizeInWordsFor(intptr_t size);
 
-  bool CanIncreaseCapacityInWords(intptr_t increase_in_words) {
+  bool CanIncreaseCapacityInWordsLocked(intptr_t increase_in_words) {
     if (max_capacity_in_words_ == 0) {
       // Unlimited.
       return true;
     }
-    // TODO(issue 27413): Make the check against capacity and the bump
-    // of capacity atomic so that CapacityInWords does not exceed
-    // max_capacity_in_words_.
     intptr_t free_capacity_in_words =
-        (max_capacity_in_words_ - CapacityInWords());
+        (max_capacity_in_words_ - usage_.capacity_in_words);
     return ((free_capacity_in_words > 0) &&
             (increase_in_words <= free_capacity_in_words));
   }
@@ -480,6 +511,8 @@
   intptr_t collections_;
   intptr_t mark_words_per_micro_;
 
+  bool enable_concurrent_mark_;
+
   friend class ExclusivePageIterator;
   friend class ExclusiveCodePageIterator;
   friend class ExclusiveLargePageIterator;
diff --git a/runtime/vm/heap/safepoint.cc b/runtime/vm/heap/safepoint.cc
index a80b802..c231b9c 100644
--- a/runtime/vm/heap/safepoint.cc
+++ b/runtime/vm/heap/safepoint.cc
@@ -9,7 +9,10 @@
 
 namespace dart {
 
-SafepointOperationScope::SafepointOperationScope(Thread* T) : StackResource(T) {
+DEFINE_FLAG(bool, trace_safepoint, false, "Trace Safepoint logic.");
+
+SafepointOperationScope::SafepointOperationScope(Thread* T)
+    : ThreadStackResource(T) {
   ASSERT(T != NULL);
   Isolate* I = T->isolate();
   ASSERT(I != NULL);
@@ -109,7 +112,7 @@
       Monitor::WaitResult retval = sl.Wait(1000);
       if (retval == Monitor::kTimedOut) {
         num_attempts += 1;
-        if (num_attempts > 10) {
+        if (FLAG_trace_safepoint && num_attempts > 10) {
           // We have been waiting too long, start logging this as we might
           // have an issue where a thread is not checking in for a safepoint.
           OS::PrintErr("Attempt:%" Pd " waiting for %d threads to check in\n",
diff --git a/runtime/vm/heap/safepoint.h b/runtime/vm/heap/safepoint.h
index 191323f..ce84f85 100644
--- a/runtime/vm/heap/safepoint.h
+++ b/runtime/vm/heap/safepoint.h
@@ -8,13 +8,14 @@
 #include "vm/globals.h"
 #include "vm/lockers.h"
 #include "vm/thread.h"
+#include "vm/thread_stack_resource.h"
 
 namespace dart {
 
 // A stack based scope that can be used to perform an operation after getting
 // all threads to a safepoint. At the end of the operation all the threads are
 // resumed.
-class SafepointOperationScope : public StackResource {
+class SafepointOperationScope : public ThreadStackResource {
  public:
   explicit SafepointOperationScope(Thread* T);
   ~SafepointOperationScope();
@@ -136,9 +137,9 @@
  *   ==> kThreadInGenerated
  *       - Invalid transition.
  */
-class TransitionSafepointState : public StackResource {
+class TransitionSafepointState : public ThreadStackResource {
  public:
-  explicit TransitionSafepointState(Thread* T) : StackResource(T) {}
+  explicit TransitionSafepointState(Thread* T) : ThreadStackResource(T) {}
   ~TransitionSafepointState() {}
 
   SafepointHandler* handler() const {
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 346ea81..b07afe9 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -90,6 +90,10 @@
   void VisitingOldObject(RawObject* obj) {
     ASSERT((obj == NULL) || obj->IsOldObject());
     visiting_old_object_ = obj;
+    if (obj != NULL) {
+      // Card update happens in HeapPage::VisitRememberedCards.
+      ASSERT(!obj->IsCardRemembered());
+    }
   }
 
   intptr_t bytes_promoted() const { return bytes_promoted_; }
@@ -443,13 +447,6 @@
   resolved_top_ = top_;
   end_ = to_->end();
 
-  // Throw out the old information about the from space
-  if (isolate->IsMutatorThreadScheduled()) {
-    Thread* mutator_thread = isolate->mutator_thread();
-    mutator_thread->set_top(top_);
-    mutator_thread->set_end(end_);
-  }
-
   return from;
 }
 
@@ -457,13 +454,10 @@
   // All objects in the to space have been copied from the from space at this
   // moment.
 
-  // Ensure the mutator thread now has the up-to-date top_ and end_ of the
-  // semispace
-  if (isolate->IsMutatorThreadScheduled()) {
-    Thread* thread = isolate->mutator_thread();
-    thread->set_top(top_);
-    thread->set_end(end_);
-  }
+  // Ensure the mutator thread will fail the next allocation. This will force
+  // mutator to allocate a new TLAB
+  Thread* mutator_thread = isolate->mutator_thread();
+  ASSERT((mutator_thread == NULL) || (!mutator_thread->HasActiveTLAB()));
 
   double avg_frac = stats_history_.Get(0).PromoCandidatesSuccessFraction();
   if (stats_history_.Size() >= 2) {
@@ -581,6 +575,10 @@
     isolate->store_buffer()->PushBlock(pending, StoreBuffer::kIgnoreThreshold);
     pending = next;
   }
+
+  visitor->VisitingOldObject(NULL);
+  heap_->old_space()->VisitRememberedCards(visitor);
+
   heap_->RecordData(kStoreBufferEntries, total_count);
   heap_->RecordData(kDataUnused1, 0);
   heap_->RecordData(kDataUnused2, 0);
@@ -836,11 +834,45 @@
   }
 }
 
-void Scavenger::FlushTLS() const {
+void Scavenger::MakeAllTLABsIterable(Isolate* isolate) const {
+  MonitorLocker ml(isolate->threads_lock(), false);
+  ASSERT(Thread::Current()->IsAtSafepoint() ||
+         (Thread::Current()->task_kind() == Thread::kMarkerTask) ||
+         (Thread::Current()->task_kind() == Thread::kCompactorTask));
+  Thread* current = heap_->isolate()->thread_registry()->active_list();
+  while (current != NULL) {
+    if (current->HasActiveTLAB()) {
+      heap_->MakeTLABIterable(current);
+    }
+    current = current->next();
+  }
+  Thread* mutator_thread = isolate->mutator_thread();
+  if ((mutator_thread != NULL) && (!isolate->IsMutatorThreadScheduled())) {
+    heap_->MakeTLABIterable(mutator_thread);
+  }
+}
+
+void Scavenger::MakeNewSpaceIterable() const {
   ASSERT(heap_ != NULL);
-  if (heap_->isolate()->IsMutatorThreadScheduled()) {
-    Thread* mutator_thread = heap_->isolate()->mutator_thread();
-    mutator_thread->heap()->new_space()->set_top(mutator_thread->top());
+  ASSERT(Thread::Current()->IsAtSafepoint() ||
+         (Thread::Current()->task_kind() == Thread::kMarkerTask) ||
+         (Thread::Current()->task_kind() == Thread::kCompactorTask));
+  if (!scavenging_) {
+    MakeAllTLABsIterable(heap_->isolate());
+  }
+}
+
+void Scavenger::AbandonAllTLABs(Isolate* isolate) {
+  ASSERT(Thread::Current()->IsAtSafepoint());
+  MonitorLocker ml(isolate->threads_lock(), false);
+  Thread* current = isolate->thread_registry()->active_list();
+  while (current != NULL) {
+    heap_->AbandonRemainingTLAB(current);
+    current = current->next();
+  }
+  Thread* mutator_thread = isolate->mutator_thread();
+  if ((mutator_thread != NULL) && (!isolate->IsMutatorThreadScheduled())) {
+    heap_->AbandonRemainingTLAB(mutator_thread);
   }
 }
 
@@ -848,7 +880,7 @@
   ASSERT(Thread::Current()->IsAtSafepoint() ||
          (Thread::Current()->task_kind() == Thread::kMarkerTask) ||
          (Thread::Current()->task_kind() == Thread::kCompactorTask));
-  FlushTLS();
+  MakeNewSpaceIterable();
   uword cur = FirstObjectStart();
   while (cur < top_) {
     RawObject* raw_obj = RawObject::FromAddr(cur);
@@ -859,7 +891,7 @@
 void Scavenger::VisitObjects(ObjectVisitor* visitor) const {
   ASSERT(Thread::Current()->IsAtSafepoint() ||
          (Thread::Current()->task_kind() == Thread::kMarkerTask));
-  FlushTLS();
+  MakeNewSpaceIterable();
   uword cur = FirstObjectStart();
   while (cur < top_) {
     RawObject* raw_obj = RawObject::FromAddr(cur);
@@ -874,7 +906,7 @@
 
 RawObject* Scavenger::FindObject(FindObjectVisitor* visitor) const {
   ASSERT(!scavenging_);
-  FlushTLS();
+  MakeNewSpaceIterable();
   uword cur = FirstObjectStart();
   if (visitor->VisitRange(cur, top_)) {
     while (cur < top_) {
@@ -890,6 +922,26 @@
   return Object::null();
 }
 
+uword Scavenger::TryAllocateNewTLAB(Thread* thread, intptr_t size) {
+  ASSERT(Utils::IsAligned(size, kObjectAlignment));
+  ASSERT(heap_ != Dart::vm_isolate()->heap());
+  ASSERT(!scavenging_);
+  MutexLocker ml(&space_lock_);
+  uword result = top_;
+  intptr_t remaining = end_ - top_;
+  if (remaining < size) {
+    return 0;
+  }
+  ASSERT(to_->Contains(result));
+  ASSERT((result & kObjectAlignmentMask) == object_alignment_);
+  top_ += size;
+  ASSERT(to_->Contains(top_) || (top_ == to_->end()));
+  ASSERT(result < top_);
+  thread->set_top(result);
+  thread->set_end(top_);
+  return result;
+}
+
 void Scavenger::Scavenge() {
   Isolate* isolate = heap_->isolate();
   // Ensure that all threads for this isolate are at a safepoint (either stopped
@@ -915,15 +967,22 @@
   int64_t safe_point = OS::GetCurrentMonotonicMicros();
   heap_->RecordTime(kSafePoint, safe_point - start);
 
+  AbandonAllTLABs(isolate);
+
+  Thread* mutator_thread = isolate->mutator_thread();
+  if ((mutator_thread != NULL) && (mutator_thread->HasActiveTLAB())) {
+    heap_->AbandonRemainingTLAB(mutator_thread);
+  }
+
   // TODO(koda): Make verification more compatible with concurrent sweep.
   if (FLAG_verify_before_gc && !FLAG_concurrent_sweep) {
     OS::PrintErr("Verifying before Scavenge...");
-    heap_->Verify(kForbidMarked);
+    heap_->VerifyGC(kForbidMarked);
     OS::PrintErr(" done.\n");
   }
 
   // Prepare for a scavenge.
-  FlushTLS();
+  MakeNewSpaceIterable();
   SpaceUsage usage_before = GetCurrentUsage();
   intptr_t promo_candidate_words =
       (survivor_end_ - FirstObjectStart()) / kWordSize;
@@ -963,7 +1022,7 @@
   // TODO(koda): Make verification more compatible with concurrent sweep.
   if (FLAG_verify_after_gc && !FLAG_concurrent_sweep) {
     OS::PrintErr("Verifying after Scavenge...");
-    heap_->Verify(kForbidMarked);
+    heap_->VerifyGC(kForbidMarked);
     OS::PrintErr(" done.\n");
   }
 
@@ -1032,11 +1091,6 @@
   // Forces the next scavenge to promote all the objects in the new space.
   survivor_end_ = top_;
 
-  if (heap_->isolate()->IsMutatorThreadScheduled()) {
-    Thread* mutator_thread = heap_->isolate()->mutator_thread();
-    survivor_end_ = mutator_thread->top();
-  }
-
   Scavenge();
 
   // It is possible for objects to stay in the new space
diff --git a/runtime/vm/heap/scavenger.h b/runtime/vm/heap/scavenger.h
index 412395d..bd8ad4f 100644
--- a/runtime/vm/heap/scavenger.h
+++ b/runtime/vm/heap/scavenger.h
@@ -11,6 +11,7 @@
 #include "vm/flags.h"
 #include "vm/globals.h"
 #include "vm/heap/spaces.h"
+#include "vm/lockers.h"
 #include "vm/raw_object.h"
 #include "vm/ring_buffer.h"
 #include "vm/virtual_memory.h"
@@ -126,6 +127,8 @@
 
   RawObject* FindObject(FindObjectVisitor* visitor) const;
 
+  uword TryAllocateNewTLAB(Thread* thread, intptr_t size);
+
   uword AllocateGC(intptr_t size) {
     ASSERT(Utils::IsAligned(size, kObjectAlignment));
     ASSERT(heap_ != Dart::vm_isolate()->heap());
@@ -139,7 +142,7 @@
     ASSERT(to_->Contains(result));
     ASSERT((result & kObjectAlignmentMask) == object_alignment_);
     top_ += size;
-    ASSERT(to_->Contains(top_) || (top_ == to_->end()));
+    ASSERT((to_->Contains(top_)) || (top_ == to_->end()));
     return result;
   }
 
@@ -148,6 +151,8 @@
     ASSERT(heap_ != Dart::vm_isolate()->heap());
     ASSERT(thread->IsMutatorThread());
     ASSERT(thread->isolate()->IsMutatorThreadScheduled());
+    ASSERT(thread->top() <= top_);
+    ASSERT((thread->end() == 0) || (thread->end() == top_));
 #if defined(DEBUG)
     if (FLAG_gc_at_alloc) {
       ASSERT(!scavenging_);
@@ -164,7 +169,7 @@
     ASSERT(to_->Contains(result));
     ASSERT((result & kObjectAlignmentMask) == object_alignment_);
     top += size;
-    ASSERT(to_->Contains(top) || (top == to_->end()));
+    ASSERT((to_->Contains(top)) || (top == to_->end()));
     thread->set_top(top);
     return result;
   }
@@ -221,7 +226,10 @@
   void AllocateExternal(intptr_t cid, intptr_t size);
   void FreeExternal(intptr_t size);
 
-  void FlushTLS() const;
+  void MakeNewSpaceIterable() const;
+  int64_t FreeSpaceInWords(Isolate* isolate) const;
+  void MakeAllTLABsIterable(Isolate* isolate) const;
+  void AbandonAllTLABs(Isolate* isolate);
 
  private:
   // Ids for time and data records in Heap::GCStats.
@@ -323,6 +331,9 @@
 
   bool failed_to_promote_;
 
+  // Protects new space during the allocation of new TLABs
+  Mutex space_lock_;
+
   friend class ScavengerVisitor;
   friend class ScavengerWeakVisitor;
 
diff --git a/runtime/vm/heap/sweeper.cc b/runtime/vm/heap/sweeper.cc
index 8292a7d..7e477d7 100644
--- a/runtime/vm/heap/sweeper.cc
+++ b/runtime/vm/heap/sweeper.cc
@@ -4,6 +4,7 @@
 
 #include "vm/heap/sweeper.h"
 
+#include "vm/compiler/assembler/assembler.h"
 #include "vm/globals.h"
 #include "vm/heap/freelist.h"
 #include "vm/heap/heap.h"
@@ -48,7 +49,13 @@
       }
       obj_size = free_end - current;
       if (is_executable) {
-        memset(reinterpret_cast<void*>(current), 0xcc, obj_size);
+        uword cursor = current;
+        uword end = current + obj_size;
+        while (cursor < end) {
+          *reinterpret_cast<uword*>(cursor) =
+              Assembler::GetBreakInstructionFiller();
+          cursor += kWordSize;
+        }
       } else {
 #if defined(DEBUG)
         memset(reinterpret_cast<void*>(current), Heap::kZapByte, obj_size);
diff --git a/runtime/vm/heap/verifier.cc b/runtime/vm/heap/verifier.cc
index 29bbe385..8ea2fdb 100644
--- a/runtime/vm/heap/verifier.cc
+++ b/runtime/vm/heap/verifier.cc
@@ -20,7 +20,7 @@
   if (raw_obj->IsHeapObject()) {
     uword raw_addr = RawObject::ToAddr(raw_obj);
     if (raw_obj->IsFreeListElement() || raw_obj->IsForwardingCorpse()) {
-      if (raw_obj->IsMarked()) {
+      if (raw_obj->IsOldObject() && raw_obj->IsMarked()) {
         FATAL1("Marked free list element encountered %#" Px "\n", raw_addr);
       }
     } else {
diff --git a/runtime/vm/heap/verifier.h b/runtime/vm/heap/verifier.h
index f12ba82..d811be6 100644
--- a/runtime/vm/heap/verifier.h
+++ b/runtime/vm/heap/verifier.h
@@ -8,6 +8,7 @@
 #include "vm/flags.h"
 #include "vm/globals.h"
 #include "vm/handles.h"
+#include "vm/thread.h"
 #include "vm/visitor.h"
 
 namespace dart {
diff --git a/runtime/vm/heap/weak_code.cc b/runtime/vm/heap/weak_code.cc
index c1a3d53..795eda1a 100644
--- a/runtime/vm/heap/weak_code.cc
+++ b/runtime/vm/heap/weak_code.cc
@@ -76,10 +76,12 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* frame = iterator.NextFrame();
     while (frame != NULL) {
-      code = frame->LookupDartCode();
-      if (IsOptimizedCode(code_objects, code)) {
-        ReportDeoptimization(code);
-        DeoptimizeAt(code, frame);
+      if (!frame->is_interpreted()) {
+        code = frame->LookupDartCode();
+        if (IsOptimizedCode(code_objects, code)) {
+          ReportDeoptimization(code);
+          DeoptimizeAt(code, frame);
+        }
       }
       frame = iterator.NextFrame();
     }
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 14e5a58..9be1458 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -10,6 +10,7 @@
 #include "vm/hash.h"
 #include "vm/hash_map.h"
 #include "vm/heap/heap.h"
+#include "vm/instructions.h"
 #include "vm/json_writer.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
@@ -78,16 +79,45 @@
                      reinterpret_cast<const void*>(body_b), body_size);
 }
 
-ImageWriter::ImageWriter(const void* shared_objects,
+ImageWriter::ImageWriter(Heap* heap,
+                         const void* shared_objects,
                          const void* shared_instructions,
                          const void* reused_instructions)
-    : next_data_offset_(0), next_text_offset_(0), objects_(), instructions_() {
+    : heap_(heap),
+      next_data_offset_(0),
+      next_text_offset_(0),
+      objects_(),
+      instructions_() {
   ResetOffsets();
   SetupShared(&shared_objects_, shared_objects);
   SetupShared(&shared_instructions_, shared_instructions);
   SetupShared(&reuse_instructions_, reused_instructions);
 }
 
+void ImageWriter::PrepareForSerialization(
+    GrowableArray<ImageWriterCommand>* commands) {
+  if (commands != nullptr) {
+    const intptr_t initial_offset = next_text_offset_;
+    for (auto& inst : *commands) {
+      ASSERT((initial_offset + inst.expected_offset) == next_text_offset_);
+      switch (inst.op) {
+        case ImageWriterCommand::InsertInstructionOfCode: {
+          RawCode* code = inst.insert_instruction_of_code.code;
+          RawInstructions* instructions = Code::InstructionsOf(code);
+          const intptr_t offset = next_text_offset_;
+          instructions_.Add(InstructionsData(instructions, code, offset));
+          next_text_offset_ += instructions->Size();
+          ASSERT(heap_->GetObjectId(instructions) == 0);
+          heap_->SetObjectId(instructions, offset);
+          break;
+        }
+        default:
+          UNREACHABLE();
+      }
+    }
+  }
+}
+
 void ImageWriter::SetupShared(ObjectOffsetMap* map, const void* shared_image) {
   if (shared_image == NULL) {
     return;
@@ -109,6 +139,11 @@
 
 int32_t ImageWriter::GetTextOffsetFor(RawInstructions* instructions,
                                       RawCode* code) {
+  intptr_t offset = heap_->GetObjectId(instructions);
+  if (offset != 0) {
+    return offset;
+  }
+
   if (!reuse_instructions_.IsEmpty()) {
     ObjectOffsetPair* pair = reuse_instructions_.Lookup(instructions);
     if (pair == NULL) {
@@ -126,10 +161,11 @@
     return -pair->offset;
   }
 
-  intptr_t heap_size = instructions->Size();
-  intptr_t offset = next_text_offset_;
-  next_text_offset_ += heap_size;
+  offset = next_text_offset_;
+  heap_->SetObjectId(instructions, offset);
+  next_text_offset_ += instructions->Size();
   instructions_.Add(InstructionsData(instructions, code, offset));
+
   return offset;
 }
 
@@ -257,8 +293,12 @@
   }
 
   // Append the direct-mapped RO data objects after the clustered snapshot.
+  offset_space_ = vm ? V8SnapshotProfileWriter::kVmData
+                     : V8SnapshotProfileWriter::kIsolateData;
   WriteROData(clustered_stream);
 
+  offset_space_ = vm ? V8SnapshotProfileWriter::kVmText
+                     : V8SnapshotProfileWriter::kIsolateText;
   WriteText(clustered_stream, vm);
 }
 
@@ -267,14 +307,19 @@
 
   // Heap page starts here.
 
+  intptr_t section_start = stream->Position();
+
   stream->WriteWord(next_data_offset_);  // Data length.
   COMPILE_ASSERT(OS::kMaxPreferredCodeAlignment >= kObjectAlignment);
   stream->Align(OS::kMaxPreferredCodeAlignment);
 
+  ASSERT(stream->Position() - section_start == Image::kHeaderSize);
+
   // Heap page objects start here.
 
   for (intptr_t i = 0; i < objects_.length(); i++) {
     const Object& obj = *objects_[i].obj_;
+    AutoTraceImage(obj, section_start, stream);
 
     NoSafepointScope no_safepoint;
     uword start = reinterpret_cast<uword>(obj.raw()) - kHeapObjectTag;
@@ -299,11 +344,12 @@
   }
 }
 
-AssemblyImageWriter::AssemblyImageWriter(Dart_StreamingWriteCallback callback,
+AssemblyImageWriter::AssemblyImageWriter(Thread* thread,
+                                         Dart_StreamingWriteCallback callback,
                                          void* callback_data,
                                          const void* shared_objects,
                                          const void* shared_instructions)
-    : ImageWriter(shared_objects, shared_instructions, NULL),
+    : ImageWriter(thread->heap(), shared_objects, shared_instructions, nullptr),
       assembly_stream_(512 * KB, callback, callback_data),
       dwarf_(NULL) {
 #if defined(DART_PRECOMPILER)
@@ -358,9 +404,26 @@
   ObjectStore* object_store = Isolate::Current()->object_store();
 
   TypeTestingStubFinder tts;
+  intptr_t text_offset = 0;
+
   for (intptr_t i = 0; i < instructions_.length(); i++) {
-    const Instructions& insns = *instructions_[i].insns_;
-    const Code& code = *instructions_[i].code_;
+    auto& instr = instructions_[i];
+    ASSERT((instr.text_offset_ - instructions_[0].text_offset_) == text_offset);
+
+    const intptr_t instr_start = text_offset;
+
+    const Instructions& insns = *instr.insns_;
+    const Code& code = *instr.code_;
+
+    if (profile_writer_ != nullptr) {
+      const intptr_t offset = Image::kHeaderSize + text_offset;
+      ASSERT(offset_space_ != V8SnapshotProfileWriter::kSnapshot);
+      profile_writer_->SetObjectTypeAndName({offset_space_, offset},
+                                            "Instructions",
+                                            /*name=*/nullptr);
+      profile_writer_->AttributeBytesTo({offset_space_, offset},
+                                        insns.raw()->Size());
+    }
 
     ASSERT(insns.raw()->Size() % sizeof(uint64_t) == 0);
 
@@ -387,8 +450,12 @@
 
       WriteWordLiteralText(marked_tags);
       beginning += sizeof(uword);
+      text_offset += sizeof(uword);
 
       WriteByteSequence(beginning, entry);
+      text_offset += (entry - beginning);
+
+      ASSERT((text_offset - instr_start) == insns.HeaderSize());
     }
 
     // 2. Write a label at the entry point.
@@ -436,10 +503,9 @@
     {
       // 3. Write from the entry point to the end.
       NoSafepointScope no_safepoint;
-      uword beginning = reinterpret_cast<uword>(insns.raw()) - kHeapObjectTag;
+      uword beginning = reinterpret_cast<uword>(insns.raw_ptr());
       uword entry = beginning + Instructions::HeaderSize();
-      uword payload_size = insns.Size();
-      payload_size = Utils::RoundUp(payload_size, OS::PreferredCodeAlignment());
+      uword payload_size = insns.raw()->Size() - insns.HeaderSize();
       uword end = entry + payload_size;
 
       ASSERT(Utils::IsAligned(beginning, sizeof(uword)));
@@ -447,7 +513,10 @@
       ASSERT(Utils::IsAligned(end, sizeof(uword)));
 
       WriteByteSequence(entry, end);
+      text_offset += (end - entry);
     }
+
+    ASSERT((text_offset - instr_start) == insns.raw()->Size());
   }
 
   FrameUnwindEpilogue();
@@ -556,13 +625,17 @@
   }
 }
 
-BlobImageWriter::BlobImageWriter(uint8_t** instructions_blob_buffer,
+BlobImageWriter::BlobImageWriter(Thread* thread,
+                                 uint8_t** instructions_blob_buffer,
                                  ReAlloc alloc,
                                  intptr_t initial_size,
                                  const void* shared_objects,
                                  const void* shared_instructions,
                                  const void* reused_instructions)
-    : ImageWriter(shared_objects, shared_instructions, reused_instructions),
+    : ImageWriter(thread->heap(),
+                  shared_objects,
+                  shared_instructions,
+                  reused_instructions),
       instructions_blob_stream_(instructions_blob_buffer, alloc, initial_size) {
 }
 
@@ -576,10 +649,16 @@
     instructions_blob_stream_.WriteWord(0);
   }
 
+  intptr_t text_offset = 0;
+
   NoSafepointScope no_safepoint;
   for (intptr_t i = 0; i < instructions_.length(); i++) {
+    auto& instr = instructions_[i];
     const Instructions& insns = *instructions_[i].insns_;
+    AutoTraceImage(insns, 0, &this->instructions_blob_stream_);
+    ASSERT((instr.text_offset_ - instructions_[0].text_offset_) == text_offset);
 
+    const intptr_t instr_start = text_offset;
     uword beginning = reinterpret_cast<uword>(insns.raw_ptr());
     uword entry = beginning + Instructions::HeaderSize();
     uword payload_size = insns.Size();
@@ -603,12 +682,16 @@
 #endif
 
     instructions_blob_stream_.WriteWord(marked_tags);
+    text_offset += sizeof(uword);
     beginning += sizeof(uword);
 
     for (uword* cursor = reinterpret_cast<uword*>(beginning);
          cursor < reinterpret_cast<uword*>(end); cursor++) {
       instructions_blob_stream_.WriteWord(*cursor);
+      text_offset += sizeof(uword);
     }
+
+    ASSERT((text_offset - instr_start) == insns.raw()->Size());
   }
 }
 
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index b5ba9dc..939a653 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -5,12 +5,17 @@
 #ifndef RUNTIME_VM_IMAGE_SNAPSHOT_H_
 #define RUNTIME_VM_IMAGE_SNAPSHOT_H_
 
+#include <utility>
+
 #include "platform/assert.h"
 #include "vm/allocation.h"
 #include "vm/datastream.h"
 #include "vm/globals.h"
 #include "vm/growable_array.h"
 #include "vm/hash_map.h"
+#include "vm/object.h"
+#include "vm/reusable_handles.h"
+#include "vm/v8_snapshot_writer.h"
 
 namespace dart {
 
@@ -94,9 +99,39 @@
 
 typedef DirectChainedHashMap<ObjectOffsetTrait> ObjectOffsetMap;
 
+// A command which instructs the image writer to emit something into the ".text"
+// segment.
+//
+// For now this just supports emitting the instructions of a [Code] object.
+// In the future we might also want to add support for emitting trampolines.
+struct ImageWriterCommand {
+  enum Opcode {
+    InsertInstructionOfCode,
+  };
+
+  ImageWriterCommand(intptr_t expected_offset,
+                     ImageWriterCommand::Opcode opcode,
+                     RawCode* code)
+      : expected_offset(expected_offset),
+        op(opcode),
+        insert_instruction_of_code({code}) {}
+
+  // The offset (relative to the very first [ImageWriterCommand]) we expect
+  // this [ImageWriterCommand] to have.
+  intptr_t expected_offset;
+
+  Opcode op;
+  union {
+    struct {
+      RawCode* code;
+    } insert_instruction_of_code;
+  };
+};
+
 class ImageWriter : public ValueObject {
  public:
-  ImageWriter(const void* shared_objects,
+  ImageWriter(Heap* heap,
+              const void* shared_objects,
               const void* shared_instructions,
               const void* reused_instructions);
   virtual ~ImageWriter() {}
@@ -109,6 +144,10 @@
     instructions_.Clear();
   }
 
+  // Will start preparing the ".text" segment by interpreting the provided
+  // [ImageWriterCommand]s.
+  void PrepareForSerialization(GrowableArray<ImageWriterCommand>* commands);
+
   int32_t GetTextOffsetFor(RawInstructions* instructions, RawCode* code);
   bool GetSharedDataOffsetFor(RawObject* raw_object, uint32_t* offset);
   uint32_t GetDataOffsetFor(RawObject* raw_object);
@@ -119,6 +158,14 @@
 
   void DumpStatistics();
 
+  void SetProfileWriter(V8SnapshotProfileWriter* profile_writer) {
+    profile_writer_ = profile_writer;
+  }
+
+  void ClearProfileWriter() { profile_writer_ = nullptr; }
+
+  void TraceInstructions(const Instructions& instructions);
+
  protected:
   void WriteROData(WriteStream* stream);
   virtual void WriteText(WriteStream* clustered_stream, bool vm) = 0;
@@ -127,10 +174,10 @@
   void DumpInstructionsSizes();
 
   struct InstructionsData {
-    explicit InstructionsData(RawInstructions* insns,
-                              RawCode* code,
-                              intptr_t offset)
-        : raw_insns_(insns), raw_code_(code), offset_(offset) {}
+    InstructionsData(RawInstructions* insns,
+                     RawCode* code,
+                     intptr_t text_offset)
+        : raw_insns_(insns), raw_code_(code), text_offset_(text_offset) {}
 
     union {
       RawInstructions* raw_insns_;
@@ -140,7 +187,7 @@
       RawCode* raw_code_;
       const Code* code_;
     };
-    intptr_t offset_;
+    intptr_t text_offset_;
   };
 
   struct ObjectData {
@@ -152,6 +199,7 @@
     };
   };
 
+  Heap* heap_;  // Used for mapping RawInstructiosn to object ids.
   intptr_t next_data_offset_;
   intptr_t next_text_offset_;
   GrowableArray<ObjectData> objects_;
@@ -160,13 +208,67 @@
   ObjectOffsetMap shared_instructions_;
   ObjectOffsetMap reuse_instructions_;
 
+  V8SnapshotProfileWriter::IdSpace offset_space_ =
+      V8SnapshotProfileWriter::kSnapshot;
+  V8SnapshotProfileWriter* profile_writer_ = nullptr;
+
+  template <class T>
+  friend class TraceImageObjectScope;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(ImageWriter);
 };
 
+#define AutoTraceImage(object, section_offset, stream)                         \
+  auto AutoTraceImagObjectScopeVar##__COUNTER__ =                              \
+      TraceImageObjectScope<std::remove_pointer<decltype(stream)>::type>(      \
+          this, section_offset, stream, object);
+
+template <typename T>
+class TraceImageObjectScope {
+ public:
+  TraceImageObjectScope(ImageWriter* writer,
+                        intptr_t section_offset,
+                        const T* stream,
+                        const Object& object)
+      : writer_(writer),
+        stream_(stream),
+        section_offset_(section_offset),
+        start_offset_(stream_->Position() - section_offset) {
+    if (writer_->profile_writer_ != nullptr) {
+      Thread* thread = Thread::Current();
+      REUSABLE_CLASS_HANDLESCOPE(thread);
+      REUSABLE_STRING_HANDLESCOPE(thread);
+      Class& klass = thread->ClassHandle();
+      String& name = thread->StringHandle();
+      klass = object.clazz();
+      name = klass.UserVisibleName();
+      ASSERT(writer_->offset_space_ != V8SnapshotProfileWriter::kSnapshot);
+      writer_->profile_writer_->SetObjectTypeAndName(
+          {writer_->offset_space_, start_offset_}, name.ToCString(), nullptr);
+    }
+  }
+
+  ~TraceImageObjectScope() {
+    if (writer_->profile_writer_ != nullptr) {
+      ASSERT(writer_->offset_space_ != V8SnapshotProfileWriter::kSnapshot);
+      writer_->profile_writer_->AttributeBytesTo(
+          {writer_->offset_space_, start_offset_},
+          stream_->Position() - section_offset_ - start_offset_);
+    }
+  }
+
+ private:
+  ImageWriter* writer_;
+  const T* stream_;
+  intptr_t section_offset_;
+  intptr_t start_offset_;
+};
+
 class AssemblyImageWriter : public ImageWriter {
  public:
-  AssemblyImageWriter(Dart_StreamingWriteCallback callback,
+  AssemblyImageWriter(Thread* thread,
+                      Dart_StreamingWriteCallback callback,
                       void* callback_data,
                       const void* shared_objects,
                       const void* shared_instructions);
@@ -195,12 +297,13 @@
 
 class BlobImageWriter : public ImageWriter {
  public:
-  BlobImageWriter(uint8_t** instructions_blob_buffer,
+  BlobImageWriter(Thread* thread,
+                  uint8_t** instructions_blob_buffer,
                   ReAlloc alloc,
                   intptr_t initial_size,
                   const void* shared_objects,
                   const void* shared_instructions,
-                  const void* reused_instructions = NULL);
+                  const void* reused_instructions);
 
   virtual void WriteText(WriteStream* clustered_stream, bool vm);
 
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 38dbee5..f9137ac 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -12,6 +12,7 @@
 #include "vm/constants_arm.h"
 #include "vm/cpu.h"
 #include "vm/object.h"
+#include "vm/reverse_pc_lookup_cache.h"
 
 namespace dart {
 
@@ -199,9 +200,11 @@
   if (IsLoadWithOffset(instr, PP, &offset, &dst)) {
     intptr_t index = ObjectPool::IndexFromOffset(offset);
     const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-    if (pool.TypeAt(index) == ObjectPool::kTaggedObject) {
-      *obj = pool.ObjectAt(index);
-      return true;
+    if (!pool.IsNull()) {
+      if (pool.TypeAt(index) == ObjectPool::kTaggedObject) {
+        *obj = pool.ObjectAt(index);
+        return true;
+      }
     }
   } else if (IsLoadWithOffset(instr, THR, &offset, &dst)) {
     return Thread::ObjectAtOffset(offset, obj);
@@ -230,10 +233,22 @@
   object_pool_.SetObjectAt(target_code_pool_index_, target_code);
 }
 
-SwitchableCallPattern::SwitchableCallPattern(uword pc, const Code& code)
+SwitchableCallPatternBase::SwitchableCallPatternBase(const Code& code)
     : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
       data_pool_index_(-1),
-      target_pool_index_(-1) {
+      target_pool_index_(-1) {}
+
+RawObject* SwitchableCallPatternBase::data() const {
+  return object_pool_.ObjectAt(data_pool_index_);
+}
+
+void SwitchableCallPatternBase::SetData(const Object& data) const {
+  ASSERT(!Object::Handle(object_pool_.ObjectAt(data_pool_index_)).IsCode());
+  object_pool_.SetObjectAt(data_pool_index_, data);
+}
+
+SwitchableCallPattern::SwitchableCallPattern(uword pc, const Code& code)
+    : SwitchableCallPatternBase(code) {
   ASSERT(code.ContainsInstructionAt(pc));
   // Last instruction: blx lr.
   ASSERT(*(reinterpret_cast<uword*>(pc) - 1) == 0xe12fff3e);
@@ -247,24 +262,49 @@
   ASSERT(reg == CODE_REG);
 }
 
-RawObject* SwitchableCallPattern::data() const {
-  return object_pool_.ObjectAt(data_pool_index_);
-}
-
 RawCode* SwitchableCallPattern::target() const {
   return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
 }
-
-void SwitchableCallPattern::SetData(const Object& data) const {
-  ASSERT(!Object::Handle(object_pool_.ObjectAt(data_pool_index_)).IsCode());
-  object_pool_.SetObjectAt(data_pool_index_, data);
-}
-
 void SwitchableCallPattern::SetTarget(const Code& target) const {
   ASSERT(Object::Handle(object_pool_.ObjectAt(target_pool_index_)).IsCode());
   object_pool_.SetObjectAt(target_pool_index_, target);
 }
 
+BareSwitchableCallPattern::BareSwitchableCallPattern(uword pc, const Code& code)
+    : SwitchableCallPatternBase(code) {
+  ASSERT(code.ContainsInstructionAt(pc));
+  // Last instruction: blx lr.
+  ASSERT(*(reinterpret_cast<uword*>(pc) - 1) == 0xe12fff3e);
+
+  Register reg;
+  uword data_load_end = InstructionPattern::DecodeLoadWordFromPool(
+      pc - Instr::kInstrSize, &reg, &data_pool_index_);
+  ASSERT(reg == R9);
+
+  InstructionPattern::DecodeLoadWordFromPool(data_load_end, &reg,
+                                             &target_pool_index_);
+  ASSERT(reg == LR);
+}
+
+RawCode* BareSwitchableCallPattern::target() const {
+  const uword pc = object_pool_.RawValueAt(target_pool_index_);
+  auto rct = Isolate::Current()->reverse_pc_lookup_cache();
+  if (rct->Contains(pc)) {
+    return rct->Lookup(pc);
+  }
+  rct = Dart::vm_isolate()->reverse_pc_lookup_cache();
+  if (rct->Contains(pc)) {
+    return rct->Lookup(pc);
+  }
+  UNREACHABLE();
+}
+
+void BareSwitchableCallPattern::SetTarget(const Code& target) const {
+  ASSERT(object_pool_.TypeAt(target_pool_index_) == ObjectPool::kImmediate);
+  object_pool_.SetRawValueAt(target_pool_index_,
+                             target.MonomorphicEntryPoint());
+}
+
 ReturnPattern::ReturnPattern(uword pc) : pc_(pc) {}
 
 bool ReturnPattern::IsValid() const {
@@ -285,6 +325,22 @@
   return false;
 }
 
+bool PcRelativeCallPattern::IsValid() const {
+  // bl <offset>
+  const uint32_t word = *reinterpret_cast<uint32_t*>(pc_);
+  const uint32_t cond_all = 0xe0;
+  const uint32_t branch_link = 0x0b;
+  return (word >> 24) == (cond_all | branch_link);
+}
+
+bool PcRelativeJumpPattern::IsValid() const {
+  // b <offset>
+  const uint32_t word = *reinterpret_cast<uint32_t*>(pc_);
+  const uint32_t cond_all = 0xe0;
+  const uint32_t branch_nolink = 0x0a;
+  return (word >> 24) == (cond_all | branch_nolink);
+}
+
 intptr_t TypeTestingStubCallPattern::GetSubtypeTestCachePoolIndex() {
   // Calls to the type testing stubs look like:
   //   ldr R3, [PP+idx]
diff --git a/runtime/vm/instructions_arm.h b/runtime/vm/instructions_arm.h
index e11c947..70a7636 100644
--- a/runtime/vm/instructions_arm.h
+++ b/runtime/vm/instructions_arm.h
@@ -97,23 +97,52 @@
 //   load guarded cid            load ICData             load MegamorphicCache
 //   load monomorphic target <-> load ICLookup stub  ->  load MMLookup stub
 //   call target.entry           call stub.entry         call stub.entry
-class SwitchableCallPattern : public ValueObject {
+class SwitchableCallPatternBase : public ValueObject {
  public:
-  SwitchableCallPattern(uword pc, const Code& code);
+  explicit SwitchableCallPatternBase(const Code& code);
 
   RawObject* data() const;
-  RawCode* target() const;
   void SetData(const Object& data) const;
-  void SetTarget(const Code& target) const;
 
- private:
+ protected:
   const ObjectPool& object_pool_;
   intptr_t data_pool_index_;
   intptr_t target_pool_index_;
 
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SwitchableCallPatternBase);
+};
+
+// See [SwitchableCallBase] for a switchable calls in general.
+//
+// The target slot is always a [Code] object: Either the code of the
+// monomorphic function or a stub code.
+class SwitchableCallPattern : public SwitchableCallPatternBase {
+ public:
+  SwitchableCallPattern(uword pc, const Code& code);
+
+  RawCode* target() const;
+  void SetTarget(const Code& target) const;
+
+ private:
   DISALLOW_COPY_AND_ASSIGN(SwitchableCallPattern);
 };
 
+// See [SwitchableCallBase] for a switchable calls in general.
+//
+// The target slot is always a direct entrypoint address: Either the entry point
+// of the monomorphic function or a stub entry point.
+class BareSwitchableCallPattern : public SwitchableCallPatternBase {
+ public:
+  BareSwitchableCallPattern(uword pc, const Code& code);
+
+  RawCode* target() const;
+  void SetTarget(const Code& target) const;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BareSwitchableCallPattern);
+};
+
 class ReturnPattern : public ValueObject {
  public:
   explicit ReturnPattern(uword pc);
@@ -129,6 +158,66 @@
   const uword pc_;
 };
 
+class PcRelativeCallPattern : public ValueObject {
+ public:
+  explicit PcRelativeCallPattern(uword pc) : pc_(pc) {}
+
+  static const int kLengthInBytes = 1 * Instr::kInstrSize;
+
+  int32_t distance() {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    return Assembler::DecodeBranchOffset(*reinterpret_cast<int32_t*>(pc_));
+#else
+    UNREACHABLE();
+    return 0;
+#endif
+  }
+
+  void set_distance(int32_t distance) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    int32_t* word = reinterpret_cast<int32_t*>(pc_);
+    *word = Assembler::EncodeBranchOffset(distance, *word);
+#else
+    UNREACHABLE();
+#endif
+  }
+
+  bool IsValid() const;
+
+ private:
+  uword pc_;
+};
+
+class PcRelativeJumpPattern : public ValueObject {
+ public:
+  explicit PcRelativeJumpPattern(uword pc) : pc_(pc) {}
+
+  static const int kLengthInBytes = 1 * Instr::kInstrSize;
+
+  int32_t distance() {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    return Assembler::DecodeBranchOffset(*reinterpret_cast<int32_t*>(pc_));
+#else
+    UNREACHABLE();
+    return 0;
+#endif
+  }
+
+  void set_distance(int32_t distance) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    int32_t* word = reinterpret_cast<int32_t*>(pc_);
+    *word = Assembler::EncodeBranchOffset(distance, *word);
+#else
+    UNREACHABLE();
+#endif
+  }
+
+  bool IsValid() const;
+
+ private:
+  uword pc_;
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_INSTRUCTIONS_ARM_H_
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index cbb8667..2bf7c37 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -260,8 +260,7 @@
   Instr* ldr_instr = Instr::At(start);
 
   // Last instruction is always an ldp into two 64-bit X registers.
-  RELEASE_ASSERT(ldr_instr->IsLoadStoreRegPairOp() &&
-                 (ldr_instr->Bit(22) == 1));
+  ASSERT(ldr_instr->IsLoadStoreRegPairOp() && (ldr_instr->Bit(22) == 1));
 
   // Grab the destination register from the ldp instruction.
   *reg1 = ldr_instr->RtField();
@@ -276,30 +275,30 @@
     pool_offset = base_offset;
   } else {
     // Case 2 & 3.
-    RELEASE_ASSERT(base_reg == TMP);
+    ASSERT(base_reg == TMP);
 
     pool_offset = base_offset;
 
     start -= Instr::kInstrSize;
     Instr* add_instr = Instr::At(start);
-    RELEASE_ASSERT(add_instr->IsAddSubImmOp());
-    RELEASE_ASSERT(add_instr->RdField() == TMP);
+    ASSERT(add_instr->IsAddSubImmOp());
+    ASSERT(add_instr->RdField() == TMP);
 
     const auto shift = add_instr->Imm12ShiftField();
-    RELEASE_ASSERT(shift == 0 || shift == 1);
+    ASSERT(shift == 0 || shift == 1);
     pool_offset += (add_instr->Imm12Field() << (shift == 1 ? 12 : 0));
 
     if (add_instr->RnField() == TMP) {
       start -= Instr::kInstrSize;
       Instr* prev_add_instr = Instr::At(start);
-      RELEASE_ASSERT(prev_add_instr->IsAddSubImmOp());
-      RELEASE_ASSERT(prev_add_instr->RnField() == PP);
+      ASSERT(prev_add_instr->IsAddSubImmOp());
+      ASSERT(prev_add_instr->RnField() == PP);
 
       const auto shift = prev_add_instr->Imm12ShiftField();
-      RELEASE_ASSERT(shift == 0 || shift == 1);
+      ASSERT(shift == 0 || shift == 1);
       pool_offset += (prev_add_instr->Imm12Field() << (shift == 1 ? 12 : 0));
     } else {
-      RELEASE_ASSERT(add_instr->RnField() == PP);
+      ASSERT(add_instr->RnField() == PP);
     }
   }
   *index = ObjectPool::IndexFromOffset(pool_offset - kHeapObjectTag);
@@ -318,9 +317,11 @@
       ASSERT(Utils::IsAligned(offset, 8));
       intptr_t index = ObjectPool::IndexFromOffset(offset - kHeapObjectTag);
       const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-      if (pool.TypeAt(index) == ObjectPool::kTaggedObject) {
-        *obj = pool.ObjectAt(index);
-        return true;
+      if (!pool.IsNull()) {
+        if (pool.TypeAt(index) == ObjectPool::kTaggedObject) {
+          *obj = pool.ObjectAt(index);
+          return true;
+        }
       }
     } else if (instr->RnField() == THR) {
       return Thread::ObjectAtOffset(offset, obj);
@@ -371,10 +372,22 @@
   // No need to flush the instruction cache, since the code is not modified.
 }
 
-SwitchableCallPattern::SwitchableCallPattern(uword pc, const Code& code)
+SwitchableCallPatternBase::SwitchableCallPatternBase(const Code& code)
     : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
       data_pool_index_(-1),
-      target_pool_index_(-1) {
+      target_pool_index_(-1) {}
+
+RawObject* SwitchableCallPatternBase::data() const {
+  return object_pool_.ObjectAt(data_pool_index_);
+}
+
+void SwitchableCallPatternBase::SetData(const Object& data) const {
+  ASSERT(!Object::Handle(object_pool_.ObjectAt(data_pool_index_)).IsCode());
+  object_pool_.SetObjectAt(data_pool_index_, data);
+}
+
+SwitchableCallPattern::SwitchableCallPattern(uword pc, const Code& code)
+    : SwitchableCallPatternBase(code) {
   ASSERT(code.ContainsInstructionAt(pc));
   // Last instruction: blr ip0.
   ASSERT(*(reinterpret_cast<uint32_t*>(pc) - 1) == 0xd63f0200);
@@ -383,31 +396,58 @@
   intptr_t pool_index;
   InstructionPattern::DecodeLoadDoubleWordFromPool(
       pc - 2 * Instr::kInstrSize, &ic_data_reg, &code_reg, &pool_index);
-  RELEASE_ASSERT(ic_data_reg == R5);
-  RELEASE_ASSERT(code_reg == CODE_REG);
+  ASSERT(ic_data_reg == R5);
+  ASSERT(code_reg == CODE_REG);
 
   data_pool_index_ = pool_index;
   target_pool_index_ = pool_index + 1;
 }
 
-RawObject* SwitchableCallPattern::data() const {
-  return object_pool_.ObjectAt(data_pool_index_);
-}
-
 RawCode* SwitchableCallPattern::target() const {
   return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(target_pool_index_));
 }
 
-void SwitchableCallPattern::SetData(const Object& data) const {
-  ASSERT(!Object::Handle(object_pool_.ObjectAt(data_pool_index_)).IsCode());
-  object_pool_.SetObjectAt(data_pool_index_, data);
-}
-
 void SwitchableCallPattern::SetTarget(const Code& target) const {
   ASSERT(Object::Handle(object_pool_.ObjectAt(target_pool_index_)).IsCode());
   object_pool_.SetObjectAt(target_pool_index_, target);
 }
 
+BareSwitchableCallPattern::BareSwitchableCallPattern(uword pc, const Code& code)
+    : SwitchableCallPatternBase(code) {
+  ASSERT(code.ContainsInstructionAt(pc));
+  // Last instruction: blr ip0.
+  ASSERT(*(reinterpret_cast<uint32_t*>(pc) - 1) == 0xd63f0200);
+
+  Register ic_data_reg, code_reg;
+  intptr_t pool_index;
+  InstructionPattern::DecodeLoadDoubleWordFromPool(
+      pc - Instr::kInstrSize, &ic_data_reg, &code_reg, &pool_index);
+  ASSERT(ic_data_reg == R5);
+  ASSERT(code_reg == TMP);
+
+  data_pool_index_ = pool_index;
+  target_pool_index_ = pool_index + 1;
+}
+
+RawCode* BareSwitchableCallPattern::target() const {
+  const uword pc = object_pool_.RawValueAt(target_pool_index_);
+  auto rct = Isolate::Current()->reverse_pc_lookup_cache();
+  if (rct->Contains(pc)) {
+    return rct->Lookup(pc);
+  }
+  rct = Dart::vm_isolate()->reverse_pc_lookup_cache();
+  if (rct->Contains(pc)) {
+    return rct->Lookup(pc);
+  }
+  UNREACHABLE();
+}
+
+void BareSwitchableCallPattern::SetTarget(const Code& target) const {
+  ASSERT(object_pool_.TypeAt(target_pool_index_) == ObjectPool::kImmediate);
+  object_pool_.SetRawValueAt(target_pool_index_,
+                             target.MonomorphicEntryPoint());
+}
+
 ReturnPattern::ReturnPattern(uword pc) : pc_(pc) {}
 
 bool ReturnPattern::IsValid() const {
@@ -417,6 +457,20 @@
   return bx_lr->InstructionBits() == instruction;
 }
 
+bool PcRelativeCallPattern::IsValid() const {
+  // bl <offset>
+  const uint32_t word = *reinterpret_cast<uint32_t*>(pc_);
+  const uint32_t branch_link = 0x25;
+  return (word >> 26) == branch_link;
+}
+
+bool PcRelativeJumpPattern::IsValid() const {
+  // b <offset>
+  const uint32_t word = *reinterpret_cast<uint32_t*>(pc_);
+  const uint32_t branch_nolink = 0x5;
+  return (word >> 26) == branch_nolink;
+}
+
 intptr_t TypeTestingStubCallPattern::GetSubtypeTestCachePoolIndex() {
   // Calls to the type testing stubs look like:
   //   ldr R3, [PP+idx]
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
index 5a3936d..18a8cc3 100644
--- a/runtime/vm/instructions_arm64.h
+++ b/runtime/vm/instructions_arm64.h
@@ -13,6 +13,7 @@
 #include "vm/constants_arm64.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
+#include "vm/reverse_pc_lookup_cache.h"
 
 namespace dart {
 
@@ -116,23 +117,52 @@
 //   load guarded cid            load ICData             load MegamorphicCache
 //   load monomorphic target <-> load ICLookup stub  ->  load MMLookup stub
 //   call target.entry           call stub.entry         call stub.entry
-class SwitchableCallPattern : public ValueObject {
+class SwitchableCallPatternBase : public ValueObject {
  public:
-  SwitchableCallPattern(uword pc, const Code& code);
+  explicit SwitchableCallPatternBase(const Code& code);
 
   RawObject* data() const;
-  RawCode* target() const;
   void SetData(const Object& data) const;
-  void SetTarget(const Code& target) const;
 
- private:
+ protected:
   const ObjectPool& object_pool_;
   intptr_t data_pool_index_;
   intptr_t target_pool_index_;
 
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SwitchableCallPatternBase);
+};
+
+// See [SwitchableCallBase] for a switchable calls in general.
+//
+// The target slot is always a [Code] object: Either the code of the
+// monomorphic function or a stub code.
+class SwitchableCallPattern : public SwitchableCallPatternBase {
+ public:
+  SwitchableCallPattern(uword pc, const Code& code);
+
+  RawCode* target() const;
+  void SetTarget(const Code& target) const;
+
+ private:
   DISALLOW_COPY_AND_ASSIGN(SwitchableCallPattern);
 };
 
+// See [SwitchableCallBase] for a switchable calls in general.
+//
+// The target slot is always a direct entrypoint address: Either the entry point
+// of the monomorphic function or a stub entry point.
+class BareSwitchableCallPattern : public SwitchableCallPatternBase {
+ public:
+  BareSwitchableCallPattern(uword pc, const Code& code);
+
+  RawCode* target() const;
+  void SetTarget(const Code& target) const;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BareSwitchableCallPattern);
+};
+
 class ReturnPattern : public ValueObject {
  public:
   explicit ReturnPattern(uword pc);
@@ -148,6 +178,66 @@
   const uword pc_;
 };
 
+class PcRelativeCallPattern : public ValueObject {
+ public:
+  explicit PcRelativeCallPattern(uword pc) : pc_(pc) {}
+
+  static const int kLengthInBytes = 1 * Instr::kInstrSize;
+
+  int32_t distance() {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    return Assembler::DecodeImm26BranchOffset(*reinterpret_cast<int32_t*>(pc_));
+#else
+    UNREACHABLE();
+    return 0;
+#endif
+  }
+
+  void set_distance(int32_t distance) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    int32_t* word = reinterpret_cast<int32_t*>(pc_);
+    *word = Assembler::EncodeImm26BranchOffset(distance, *word);
+#else
+    UNREACHABLE();
+#endif
+  }
+
+  bool IsValid() const;
+
+ private:
+  uword pc_;
+};
+
+class PcRelativeJumpPattern : public ValueObject {
+ public:
+  explicit PcRelativeJumpPattern(uword pc) : pc_(pc) {}
+
+  static const int kLengthInBytes = 1 * Instr::kInstrSize;
+
+  int32_t distance() {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    return Assembler::DecodeImm26BranchOffset(*reinterpret_cast<int32_t*>(pc_));
+#else
+    UNREACHABLE();
+    return 0;
+#endif
+  }
+
+  void set_distance(int32_t distance) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    int32_t* word = reinterpret_cast<int32_t*>(pc_);
+    *word = Assembler::EncodeImm26BranchOffset(distance, *word);
+#else
+    UNREACHABLE();
+#endif
+  }
+
+  bool IsValid() const;
+
+ private:
+  uword pc_;
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_INSTRUCTIONS_ARM64_H_
diff --git a/runtime/vm/instructions_arm64_test.cc b/runtime/vm/instructions_arm64_test.cc
index 89cca60..4a6528c 100644
--- a/runtime/vm/instructions_arm64_test.cc
+++ b/runtime/vm/instructions_arm64_test.cc
@@ -18,7 +18,7 @@
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
   // Code accessing pp is generated, but not executed. Uninitialized pp is OK.
   __ set_constant_pool_allowed(true);
-  __ BranchLinkPatchable(*StubCode::InvokeDartCode_entry());
+  __ BranchLinkPatchable(StubCode::InvokeDartCode());
   __ ret();
 }
 
@@ -28,7 +28,7 @@
   // before the end of the code buffer.
   uword end = test->payload_start() + test->code().Size();
   CallPattern call(end - Instr::kInstrSize, test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->code(), call.TargetCode());
+  EXPECT_EQ(StubCode::InvokeDartCode().raw(), call.TargetCode());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/instructions_arm_test.cc b/runtime/vm/instructions_arm_test.cc
index 44749a7..e9fc409 100644
--- a/runtime/vm/instructions_arm_test.cc
+++ b/runtime/vm/instructions_arm_test.cc
@@ -18,7 +18,7 @@
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
   // Code accessing pp is generated, but not executed. Uninitialized pp is OK.
   __ set_constant_pool_allowed(true);
-  __ BranchLinkPatchable(*StubCode::InvokeDartCode_entry());
+  __ BranchLinkPatchable(StubCode::InvokeDartCode());
   __ Ret();
 }
 
@@ -28,7 +28,7 @@
   // before the end of the code buffer.
   uword end = test->payload_start() + test->code().Size();
   CallPattern call(end - Instr::kInstrSize, test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->code(), call.TargetCode());
+  EXPECT_EQ(StubCode::InvokeDartCode().raw(), call.TargetCode());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/instructions_dbc.cc b/runtime/vm/instructions_dbc.cc
index 697cba5..377343b 100644
--- a/runtime/vm/instructions_dbc.cc
+++ b/runtime/vm/instructions_dbc.cc
@@ -16,21 +16,21 @@
 namespace dart {
 
 static bool HasLoadFromPool(Instr instr) {
-  switch (Bytecode::DecodeOpcode(instr)) {
-    case Bytecode::kLoadConstant:
-    case Bytecode::kPushConstant:
-    case Bytecode::kStaticCall:
-    case Bytecode::kIndirectStaticCall:
-    case Bytecode::kInstanceCall1:
-    case Bytecode::kInstanceCall2:
-    case Bytecode::kInstanceCall1Opt:
-    case Bytecode::kInstanceCall2Opt:
-    case Bytecode::kStoreStaticTOS:
-    case Bytecode::kPushStatic:
-    case Bytecode::kAllocate:
-    case Bytecode::kInstantiateType:
-    case Bytecode::kInstantiateTypeArgumentsTOS:
-    case Bytecode::kAssertAssignable:
+  switch (SimulatorBytecode::DecodeOpcode(instr)) {
+    case SimulatorBytecode::kLoadConstant:
+    case SimulatorBytecode::kPushConstant:
+    case SimulatorBytecode::kStaticCall:
+    case SimulatorBytecode::kIndirectStaticCall:
+    case SimulatorBytecode::kInstanceCall1:
+    case SimulatorBytecode::kInstanceCall2:
+    case SimulatorBytecode::kInstanceCall1Opt:
+    case SimulatorBytecode::kInstanceCall2Opt:
+    case SimulatorBytecode::kStoreStaticTOS:
+    case SimulatorBytecode::kPushStatic:
+    case SimulatorBytecode::kAllocate:
+    case SimulatorBytecode::kInstantiateType:
+    case SimulatorBytecode::kInstantiateTypeArgumentsTOS:
+    case SimulatorBytecode::kAssertAssignable:
       return true;
     default:
       return false;
@@ -40,9 +40,9 @@
 static bool GetLoadedObjectAt(uword pc,
                               const ObjectPool& object_pool,
                               Object* obj) {
-  Instr instr = Bytecode::At(pc);
+  Instr instr = SimulatorBytecode::At(pc);
   if (HasLoadFromPool(instr)) {
-    uint16_t index = Bytecode::DecodeD(instr);
+    uint16_t index = SimulatorBytecode::DecodeD(instr);
     if (object_pool.TypeAt(index) == ObjectPool::kTaggedObject) {
       *obj = object_pool.ObjectAt(index);
       return true;
@@ -59,10 +59,10 @@
       ic_data_(ICData::Handle()) {
   ASSERT(code.ContainsInstructionAt(end_));
   const uword call_pc = end_ - sizeof(Instr);
-  Instr call_instr = Bytecode::At(call_pc);
-  ASSERT(Bytecode::IsCallOpcode(call_instr));
+  Instr call_instr = SimulatorBytecode::At(call_pc);
+  ASSERT(SimulatorBytecode::IsCallOpcode(call_instr));
   ic_data_load_end_ = call_pc;
-  target_code_pool_index_ = Bytecode::DecodeD(call_instr);
+  target_code_pool_index_ = SimulatorBytecode::DecodeD(call_instr);
 }
 
 NativeCallPattern::NativeCallPattern(uword pc, const Code& code)
@@ -72,10 +72,11 @@
       trampoline_pool_index_(-1) {
   ASSERT(code.ContainsInstructionAt(end_));
   const uword call_pc = end_ - sizeof(Instr);
-  Instr call_instr = Bytecode::At(call_pc);
-  ASSERT(Bytecode::DecodeOpcode(call_instr) == Bytecode::kNativeCall);
-  native_function_pool_index_ = Bytecode::DecodeB(call_instr);
-  trampoline_pool_index_ = Bytecode::DecodeA(call_instr);
+  Instr call_instr = SimulatorBytecode::At(call_pc);
+  ASSERT(SimulatorBytecode::DecodeOpcode(call_instr) ==
+         SimulatorBytecode::kNativeCall);
+  native_function_pool_index_ = SimulatorBytecode::DecodeB(call_instr);
+  trampoline_pool_index_ = SimulatorBytecode::DecodeA(call_instr);
 }
 
 NativeFunctionWrapper NativeCallPattern::target() const {
@@ -160,10 +161,12 @@
 }
 
 void CallPattern::InsertDeoptCallAt(uword pc) {
-  const uint8_t argc = Bytecode::IsCallOpcode(Bytecode::At(pc))
-                           ? Bytecode::DecodeArgc(Bytecode::At(pc))
-                           : 0;
-  *reinterpret_cast<Instr*>(pc) = Bytecode::Encode(Bytecode::kDeopt, argc, 0);
+  const uint8_t argc =
+      SimulatorBytecode::IsCallOpcode(SimulatorBytecode::At(pc))
+          ? SimulatorBytecode::DecodeArgc(SimulatorBytecode::At(pc))
+          : 0;
+  *reinterpret_cast<Instr*>(pc) =
+      SimulatorBytecode::Encode(SimulatorBytecode::kDeopt, argc, 0);
 }
 
 SwitchableCallPattern::SwitchableCallPattern(uword pc, const Code& code)
diff --git a/runtime/vm/instructions_ia32_test.cc b/runtime/vm/instructions_ia32_test.cc
index 7aef6ca..9fcdb39 100644
--- a/runtime/vm/instructions_ia32_test.cc
+++ b/runtime/vm/instructions_ia32_test.cc
@@ -17,14 +17,14 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ call(&StubCode::InvokeDartCode_entry()->label());
+  ExternalLabel label(StubCode::InvokeDartCode().EntryPoint());
+  __ call(&label);
   __ ret();
 }
 
 ASSEMBLER_TEST_RUN(Call, test) {
   CallPattern call(test->entry());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->EntryPoint(),
-            call.TargetAddress());
+  EXPECT_EQ(StubCode::InvokeDartCode().EntryPoint(), call.TargetAddress());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/instructions_kbc.cc b/runtime/vm/instructions_kbc.cc
index e33ff4d..f6d9f61 100644
--- a/runtime/vm/instructions_kbc.cc
+++ b/runtime/vm/instructions_kbc.cc
@@ -13,17 +13,18 @@
 
 namespace dart {
 
-RawTypedData* KBCNativeCallPattern::GetNativeEntryDataAt(uword pc,
-                                                         const Code& bytecode) {
+RawTypedData* KBCNativeCallPattern::GetNativeEntryDataAt(
+    uword pc,
+    const Bytecode& bytecode) {
   ASSERT(bytecode.ContainsInstructionAt(pc));
   const uword call_pc = pc - sizeof(KBCInstr);
   KBCInstr call_instr = KernelBytecode::At(call_pc);
   ASSERT(KernelBytecode::DecodeOpcode(call_instr) ==
          KernelBytecode::kNativeCall);
   intptr_t native_entry_data_pool_index = KernelBytecode::DecodeD(call_instr);
-  const ObjectPool& object_pool = ObjectPool::Handle(bytecode.GetObjectPool());
+  const ObjectPool& obj_pool = ObjectPool::Handle(bytecode.object_pool());
   TypedData& native_entry_data = TypedData::Handle();
-  native_entry_data ^= object_pool.ObjectAt(native_entry_data_pool_index);
+  native_entry_data ^= obj_pool.ObjectAt(native_entry_data_pool_index);
   // Native calls to recognized functions should never be patched.
   ASSERT(NativeEntryData(native_entry_data).kind() ==
          MethodRecognizer::kUnknown);
diff --git a/runtime/vm/instructions_kbc.h b/runtime/vm/instructions_kbc.h
index 11f56fb..d210a28 100644
--- a/runtime/vm/instructions_kbc.h
+++ b/runtime/vm/instructions_kbc.h
@@ -15,7 +15,7 @@
 
 class KBCNativeCallPattern : public AllStatic {
  public:
-  static RawTypedData* GetNativeEntryDataAt(uword pc, const Code& bytecode);
+  static RawTypedData* GetNativeEntryDataAt(uword pc, const Bytecode& bytecode);
 };
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index 5efb324..d95e027 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -37,17 +37,21 @@
       if ((bytes[2] & 0xc7) == (0x80 | (PP & 7))) {  // [r15+disp32]
         intptr_t index = IndexFromPPLoadDisp32(pc + 3);
         const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-        if (pool.TypeAt(index) == ObjectPool::kTaggedObject) {
-          *obj = pool.ObjectAt(index);
-          return true;
+        if (!pool.IsNull()) {
+          if (pool.TypeAt(index) == ObjectPool::kTaggedObject) {
+            *obj = pool.ObjectAt(index);
+            return true;
+          }
         }
       }
       if ((bytes[2] & 0xc7) == (0x40 | (PP & 7))) {  // [r15+disp8]
         intptr_t index = IndexFromPPLoadDisp8(pc + 3);
         const ObjectPool& pool = ObjectPool::Handle(code.object_pool());
-        if (pool.TypeAt(index) == ObjectPool::kTaggedObject) {
-          *obj = pool.ObjectAt(index);
-          return true;
+        if (!pool.IsNull()) {
+          if (pool.TypeAt(index) == ObjectPool::kTaggedObject) {
+            *obj = pool.ObjectAt(index);
+            return true;
+          }
         }
       }
     }
diff --git a/runtime/vm/instructions_x64.h b/runtime/vm/instructions_x64.h
index 1df85ab..8258214 100644
--- a/runtime/vm/instructions_x64.h
+++ b/runtime/vm/instructions_x64.h
@@ -112,6 +112,56 @@
   static const int kLengthInBytes = 3;
 };
 
+// callq *[rip+offset]
+class PcRelativeCallPattern : public InstructionPattern<PcRelativeCallPattern> {
+ public:
+  explicit PcRelativeCallPattern(uword pc) : InstructionPattern(pc) {}
+
+  int32_t distance() {
+    return *reinterpret_cast<int32_t*>(start() + 1) + kLengthInBytes;
+  }
+
+  void set_distance(int32_t distance) {
+    // [distance] is relative to the start of the instruction, x64 considers the
+    // offset relative to next PC.
+    *reinterpret_cast<int32_t*>(start() + 1) = distance - kLengthInBytes;
+  }
+
+  static const int* pattern() {
+    static const int kPattern[kLengthInBytes] = {0xe8, -1, -1, -1, -1};
+    return kPattern;
+  }
+
+  static int pattern_length_in_bytes() { return kLengthInBytes; }
+
+  static const int kLengthInBytes = 5;
+};
+
+// jmpq *[rip+offset]
+class PcRelativeJumpPattern : public InstructionPattern<PcRelativeJumpPattern> {
+ public:
+  explicit PcRelativeJumpPattern(uword pc) : InstructionPattern(pc) {}
+
+  int32_t distance() {
+    return *reinterpret_cast<int32_t*>(start() + 2) + kLengthInBytes;
+  }
+
+  void set_distance(int32_t distance) {
+    // [distance] is relative to the start of the instruction, x64 considers the
+    // offset relative to next PC.
+    *reinterpret_cast<int32_t*>(start() + 2) = distance - kLengthInBytes;
+  }
+
+  static const int* pattern() {
+    static const int kPattern[kLengthInBytes] = {0xff, 0x25, -1, -1, -1, -1};
+    return kPattern;
+  }
+
+  static int pattern_length_in_bytes() { return kLengthInBytes; }
+
+  static const int kLengthInBytes = 6;
+};
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_INSTRUCTIONS_X64_H_
diff --git a/runtime/vm/instructions_x64_test.cc b/runtime/vm/instructions_x64_test.cc
index 831d694..255b290 100644
--- a/runtime/vm/instructions_x64_test.cc
+++ b/runtime/vm/instructions_x64_test.cc
@@ -15,7 +15,7 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ Call(*StubCode::InvokeDartCode_entry());
+  __ Call(StubCode::InvokeDartCode());
   __ ret();
 }
 
@@ -26,8 +26,8 @@
   __ pushq(PP);
   __ LoadPoolPointer();
   prologue_code_size = assembler->CodeSize();
-  __ JmpPatchable(*StubCode::InvokeDartCode_entry(), PP);
-  __ JmpPatchable(*StubCode::AllocateArray_entry(), PP);
+  __ JmpPatchable(StubCode::InvokeDartCode(), PP);
+  __ JmpPatchable(StubCode::AllocateArray(), PP);
   __ popq(PP);
   __ ret();
 }
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 3185b93..1e1c0f1 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -6,7 +6,7 @@
 #include <stdlib.h>
 
 #include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME) && !defined(TARGET_OS_WINDOWS)
+#if !defined(DART_PRECOMPILED_RUNTIME)
 
 #include "vm/interpreter.h"
 
@@ -31,9 +31,14 @@
             trace_interpreter_after,
             ULLONG_MAX,
             "Trace interpreter execution after instruction count reached.");
-
-#define LIKELY(cond) __builtin_expect((cond), 1)
-#define UNLIKELY(cond) __builtin_expect((cond), 0)
+DEFINE_FLAG(charp,
+            interpreter_trace_file,
+            NULL,
+            "File to write a dynamic instruction trace to.");
+DEFINE_FLAG(uint64_t,
+            interpreter_trace_file_max_bytes,
+            100 * MB,
+            "Maximum size in bytes of the interpreter trace file");
 
 // InterpreterSetjmpBuffer are linked together, and the last created one
 // is referenced by the Interpreter. When an exception is thrown, the exception
@@ -112,6 +117,9 @@
                                : static_cast<intptr_t>(kSmiCid);
   }
 
+  // The usage counter is actually a 'hotness' counter.
+  // For an instance call, both the usage counters of the caller and of the
+  // calle will get incremented, as well as the ICdata counter at the call site.
   DART_FORCE_INLINE static void IncrementUsageCounter(RawFunction* f) {
     f->ptr()->usage_counter_++;
   }
@@ -126,38 +134,6 @@
     *reinterpret_cast<intptr_t*>(&entries[offset + count_offset]) = raw_smi_new;
   }
 
-  DART_FORCE_INLINE static bool IsStrictEqualWithNumberCheck(RawObject* lhs,
-                                                             RawObject* rhs) {
-    if (lhs == rhs) {
-      return true;
-    }
-
-    if (lhs->IsHeapObject() && rhs->IsHeapObject()) {
-      const intptr_t lhs_cid = lhs->GetClassId();
-      const intptr_t rhs_cid = rhs->GetClassId();
-      if (lhs_cid == rhs_cid) {
-        switch (lhs_cid) {
-          case kDoubleCid:
-            return (bit_cast<uint64_t, double>(
-                        static_cast<RawDouble*>(lhs)->ptr()->value_) ==
-                    bit_cast<uint64_t, double>(
-                        static_cast<RawDouble*>(rhs)->ptr()->value_));
-
-          case kMintCid:
-            return (static_cast<RawMint*>(lhs)->ptr()->value_ ==
-                    static_cast<RawMint*>(rhs)->ptr()->value_);
-        }
-      }
-    }
-
-    return false;
-  }
-
-  template <typename T>
-  DART_FORCE_INLINE static T* Untag(T* tagged) {
-    return tagged->ptr();
-  }
-
   DART_FORCE_INLINE static bool CheckIndex(RawSmi* index, RawSmi* length) {
     return !index->IsHeapObject() && (reinterpret_cast<intptr_t>(index) >= 0) &&
            (reinterpret_cast<intptr_t>(index) <
@@ -182,308 +158,9 @@
         Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
   }
 
-  static bool ObjectArraySetIndexed(Thread* thread,
-                                    RawObject** FP,
-                                    RawObject** result) {
-    return !thread->isolate()->type_checks() &&
-           ObjectArraySetIndexedUnchecked(thread, FP, result);
-  }
-
-  static bool ObjectArraySetIndexedUnchecked(Thread* thread,
-                                             RawObject** FP,
-                                             RawObject** result) {
-    RawObject** args = FrameArguments(FP, 3);
-    RawSmi* index = static_cast<RawSmi*>(args[1]);
-    RawArray* array = static_cast<RawArray*>(args[0]);
-    if (CheckIndex(index, array->ptr()->length_)) {
-      array->StorePointer(array->ptr()->data() + Smi::Value(index), args[2],
-                          thread);
-      return true;
-    }
-    return false;
-  }
-
-  static bool ObjectArrayGetIndexed(Thread* thread,
-                                    RawObject** FP,
-                                    RawObject** result) {
-    RawObject** args = FrameArguments(FP, 2);
-    RawSmi* index = static_cast<RawSmi*>(args[1]);
-    RawArray* array = static_cast<RawArray*>(args[0]);
-    if (CheckIndex(index, array->ptr()->length_)) {
-      *result = array->ptr()->data()[Smi::Value(index)];
-      return true;
-    }
-    return false;
-  }
-
-  static bool GrowableArraySetIndexed(Thread* thread,
-                                      RawObject** FP,
-                                      RawObject** result) {
-    return !thread->isolate()->type_checks() &&
-           GrowableArraySetIndexedUnchecked(thread, FP, result);
-  }
-
-  static bool GrowableArraySetIndexedUnchecked(Thread* thread,
-                                               RawObject** FP,
-                                               RawObject** result) {
-    RawObject** args = FrameArguments(FP, 3);
-    RawSmi* index = static_cast<RawSmi*>(args[1]);
-    RawGrowableObjectArray* array =
-        static_cast<RawGrowableObjectArray*>(args[0]);
-    if (CheckIndex(index, array->ptr()->length_)) {
-      RawArray* data = array->ptr()->data_;
-      data->StorePointer(data->ptr()->data() + Smi::Value(index), args[2],
-                         thread);
-      return true;
-    }
-    return false;
-  }
-
-  static bool GrowableArrayGetIndexed(Thread* thread,
-                                      RawObject** FP,
-                                      RawObject** result) {
-    RawObject** args = FrameArguments(FP, 2);
-    RawSmi* index = static_cast<RawSmi*>(args[1]);
-    RawGrowableObjectArray* array =
-        static_cast<RawGrowableObjectArray*>(args[0]);
-    if (CheckIndex(index, array->ptr()->length_)) {
-      *result = array->ptr()->data_->ptr()->data()[Smi::Value(index)];
-      return true;
-    }
-    return false;
-  }
-
-  static bool Double_getIsNan(Thread* thread,
-                              RawObject** FP,
-                              RawObject** result) {
-    RawObject** args = FrameArguments(FP, 1);
-    RawDouble* d = static_cast<RawDouble*>(args[0]);
-    *result =
-        isnan(d->ptr()->value_) ? Bool::True().raw() : Bool::False().raw();
-    return true;
-  }
-
-  static bool Double_getIsInfinite(Thread* thread,
-                                   RawObject** FP,
-                                   RawObject** result) {
-    RawObject** args = FrameArguments(FP, 1);
-    RawDouble* d = static_cast<RawDouble*>(args[0]);
-    *result =
-        isinf(d->ptr()->value_) ? Bool::True().raw() : Bool::False().raw();
-    return true;
-  }
-
-  static bool ObjectEquals(Thread* thread, RawObject** FP, RawObject** result) {
-    RawObject** args = FrameArguments(FP, 2);
-    *result = args[0] == args[1] ? Bool::True().raw() : Bool::False().raw();
-    return true;
-  }
-
-  static bool ObjectRuntimeType(Thread* thread,
-                                RawObject** FP,
-                                RawObject** result) {
-    RawObject** args = FrameArguments(FP, 1);
-    const intptr_t cid = GetClassId(args[0]);
-    if (cid == kClosureCid) {
-      return false;
-    }
-    if (cid < kNumPredefinedCids) {
-      if (cid == kDoubleCid) {
-        *result = thread->isolate()->object_store()->double_type();
-        return true;
-      } else if (RawObject::IsStringClassId(cid)) {
-        *result = thread->isolate()->object_store()->string_type();
-        return true;
-      } else if (RawObject::IsIntegerClassId(cid)) {
-        *result = thread->isolate()->object_store()->int_type();
-        return true;
-      }
-    }
-    RawClass* cls = thread->isolate()->class_table()->At(cid);
-    if (cls->ptr()->num_type_arguments_ != 0) {
-      return false;
-    }
-    RawType* typ = cls->ptr()->canonical_type_;
-    if (typ == Object::null()) {
-      return false;
-    }
-    *result = static_cast<RawObject*>(typ);
-    return true;
-  }
-
-  static bool GetDoubleOperands(RawObject** args, double* d1, double* d2) {
-    RawObject* obj2 = args[1];
-    if (!obj2->IsHeapObject()) {
-      *d2 =
-          static_cast<double>(reinterpret_cast<intptr_t>(obj2) >> kSmiTagSize);
-    } else if (obj2->GetClassId() == kDoubleCid) {
-      RawDouble* obj2d = static_cast<RawDouble*>(obj2);
-      *d2 = obj2d->ptr()->value_;
-    } else {
-      return false;
-    }
-    RawDouble* obj1 = static_cast<RawDouble*>(args[0]);
-    *d1 = obj1->ptr()->value_;
-    return true;
-  }
-
-  static RawObject* AllocateDouble(Thread* thread, double value) {
-    const intptr_t instance_size = Double::InstanceSize();
-    const uword start =
-        thread->heap()->new_space()->TryAllocateInTLAB(thread, instance_size);
-    if (LIKELY(start != 0)) {
-      uword tags = 0;
-      tags = RawObject::ClassIdTag::update(kDoubleCid, tags);
-      tags = RawObject::SizeTag::update(instance_size, tags);
-      tags = RawObject::NewBit::update(true, tags);
-      // Also writes zero in the hash_ field.
-      *reinterpret_cast<uword*>(start + Double::tags_offset()) = tags;
-      *reinterpret_cast<double*>(start + Double::value_offset()) = value;
-      return reinterpret_cast<RawObject*>(start + kHeapObjectTag);
-    }
-    return NULL;
-  }
-
-  static bool Double_add(Thread* thread, RawObject** FP, RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    RawObject* new_double = AllocateDouble(thread, d1 + d2);
-    if (new_double != NULL) {
-      *result = new_double;
-      return true;
-    }
-    return false;
-  }
-
-  static bool Double_mul(Thread* thread, RawObject** FP, RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    RawObject* new_double = AllocateDouble(thread, d1 * d2);
-    if (new_double != NULL) {
-      *result = new_double;
-      return true;
-    }
-    return false;
-  }
-
-  static bool Double_sub(Thread* thread, RawObject** FP, RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    RawObject* new_double = AllocateDouble(thread, d1 - d2);
-    if (new_double != NULL) {
-      *result = new_double;
-      return true;
-    }
-    return false;
-  }
-
-  static bool Double_div(Thread* thread, RawObject** FP, RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    RawObject* new_double = AllocateDouble(thread, d1 / d2);
-    if (new_double != NULL) {
-      *result = new_double;
-      return true;
-    }
-    return false;
-  }
-
-  static bool Double_greaterThan(Thread* thread,
-                                 RawObject** FP,
-                                 RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    *result = d1 > d2 ? Bool::True().raw() : Bool::False().raw();
-    return true;
-  }
-
-  static bool Double_greaterEqualThan(Thread* thread,
-                                      RawObject** FP,
-                                      RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    *result = d1 >= d2 ? Bool::True().raw() : Bool::False().raw();
-    return true;
-  }
-
-  static bool Double_lessThan(Thread* thread,
-                              RawObject** FP,
-                              RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    *result = d1 < d2 ? Bool::True().raw() : Bool::False().raw();
-    return true;
-  }
-
-  static bool Double_equal(Thread* thread, RawObject** FP, RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    *result = d1 == d2 ? Bool::True().raw() : Bool::False().raw();
-    return true;
-  }
-
-  static bool Double_lessEqualThan(Thread* thread,
-                                   RawObject** FP,
-                                   RawObject** result) {
-    double d1, d2;
-    if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) {
-      return false;
-    }
-    *result = d1 <= d2 ? Bool::True().raw() : Bool::False().raw();
-    return true;
-  }
-
-  static bool ClearAsyncThreadStack(Thread* thread,
-                                    RawObject** FP,
-                                    RawObject** result) {
-    thread->clear_async_stack_trace();
-    *result = Object::null();
-    return true;
-  }
-
-  static bool SetAsyncThreadStackTrace(Thread* thread,
-                                       RawObject** FP,
-                                       RawObject** result) {
-    RawObject** args = FrameArguments(FP, 1);
-    thread->set_raw_async_stack_trace(
-        reinterpret_cast<RawStackTrace*>(args[0]));
-    *result = Object::null();
-    return true;
-  }
-
-  DART_FORCE_INLINE static RawCode* FrameCode(RawObject** FP) {
-    ASSERT(GetClassId(FP[kKBCPcMarkerSlotFromFp]) == kCodeCid);
-    return static_cast<RawCode*>(FP[kKBCPcMarkerSlotFromFp]);
-  }
-
-  DART_FORCE_INLINE static void SetFrameCode(RawObject** FP, RawCode* code) {
-    ASSERT(GetClassId(code) == kCodeCid);
-    FP[kKBCPcMarkerSlotFromFp] = code;
-  }
-
-  DART_FORCE_INLINE static uint8_t* GetTypedData(RawObject* obj,
-                                                 RawObject* index) {
-    ASSERT(RawObject::IsTypedDataClassId(obj->GetClassId()));
-    RawTypedData* array = reinterpret_cast<RawTypedData*>(obj);
-    const intptr_t byte_offset = Smi::Value(RAW_CAST(Smi, index));
-    ASSERT(byte_offset >= 0);
-    return array->ptr()->data() + byte_offset;
+  DART_FORCE_INLINE static RawBytecode* FrameBytecode(RawObject** FP) {
+    ASSERT(GetClassId(FP[kKBCPcMarkerSlotFromFp]) == kBytecodeCid);
+    return static_cast<RawBytecode*>(FP[kKBCPcMarkerSlotFromFp]);
   }
 };
 
@@ -498,53 +175,68 @@
   return function;
 }
 
-IntrinsicHandler Interpreter::intrinsics_[Interpreter::kIntrinsicCount];
+void LookupCache::Clear() {
+  for (intptr_t i = 0; i < kNumEntries; i++) {
+    entries_[i].receiver_cid = kIllegalCid;
+  }
+}
 
-// Synchronization primitives support.
-void Interpreter::InitOnce() {
-  for (intptr_t i = 0; i < kIntrinsicCount; i++) {
-    intrinsics_[i] = 0;
+bool LookupCache::Lookup(intptr_t receiver_cid,
+                         RawString* function_name,
+                         RawFunction** target) const {
+  ASSERT(receiver_cid != kIllegalCid);  // Sentinel value.
+
+  const intptr_t hash =
+      receiver_cid ^ reinterpret_cast<intptr_t>(function_name);
+  const intptr_t probe1 = hash & kTableMask;
+  if (entries_[probe1].receiver_cid == receiver_cid &&
+      entries_[probe1].function_name == function_name) {
+    *target = entries_[probe1].target;
+    return true;
   }
 
-  intrinsics_[kObjectArraySetIndexedIntrinsic] =
-      InterpreterHelpers::ObjectArraySetIndexed;
-  intrinsics_[kObjectArraySetIndexedUncheckedIntrinsic] =
-      InterpreterHelpers::ObjectArraySetIndexedUnchecked;
-  intrinsics_[kObjectArrayGetIndexedIntrinsic] =
-      InterpreterHelpers::ObjectArrayGetIndexed;
-  intrinsics_[kGrowableArraySetIndexedIntrinsic] =
-      InterpreterHelpers::GrowableArraySetIndexed;
-  intrinsics_[kGrowableArraySetIndexedUncheckedIntrinsic] =
-      InterpreterHelpers::GrowableArraySetIndexedUnchecked;
-  intrinsics_[kGrowableArrayGetIndexedIntrinsic] =
-      InterpreterHelpers::GrowableArrayGetIndexed;
-  intrinsics_[kObjectEqualsIntrinsic] = InterpreterHelpers::ObjectEquals;
-  intrinsics_[kObjectRuntimeTypeIntrinsic] =
-      InterpreterHelpers::ObjectRuntimeType;
+  intptr_t probe2 = (hash >> 3) & kTableMask;
+  if (entries_[probe2].receiver_cid == receiver_cid &&
+      entries_[probe2].function_name == function_name) {
+    *target = entries_[probe2].target;
+    return true;
+  }
 
-  intrinsics_[kDouble_getIsNaNIntrinsic] = InterpreterHelpers::Double_getIsNan;
-  intrinsics_[kDouble_getIsInfiniteIntrinsic] =
-      InterpreterHelpers::Double_getIsInfinite;
-  intrinsics_[kDouble_addIntrinsic] = InterpreterHelpers::Double_add;
-  intrinsics_[kDouble_mulIntrinsic] = InterpreterHelpers::Double_mul;
-  intrinsics_[kDouble_subIntrinsic] = InterpreterHelpers::Double_sub;
-  intrinsics_[kDouble_divIntrinsic] = InterpreterHelpers::Double_div;
-  intrinsics_[kDouble_greaterThanIntrinsic] =
-      InterpreterHelpers::Double_greaterThan;
-  intrinsics_[kDouble_greaterEqualThanIntrinsic] =
-      InterpreterHelpers::Double_greaterEqualThan;
-  intrinsics_[kDouble_lessThanIntrinsic] = InterpreterHelpers::Double_lessThan;
-  intrinsics_[kDouble_equalIntrinsic] = InterpreterHelpers::Double_equal;
-  intrinsics_[kDouble_lessEqualThanIntrinsic] =
-      InterpreterHelpers::Double_lessEqualThan;
-  intrinsics_[kClearAsyncThreadStackTraceIntrinsic] =
-      InterpreterHelpers::ClearAsyncThreadStack;
-  intrinsics_[kSetAsyncThreadStackTraceIntrinsic] =
-      InterpreterHelpers::SetAsyncThreadStackTrace;
+  return false;
+}
+
+void LookupCache::Insert(intptr_t receiver_cid,
+                         RawString* function_name,
+                         RawFunction* target) {
+  // Otherwise we have to clear the cache or rehash on scavenges too.
+  ASSERT(function_name->IsOldObject());
+  ASSERT(target->IsOldObject());
+
+  const intptr_t hash =
+      receiver_cid ^ reinterpret_cast<intptr_t>(function_name);
+  const intptr_t probe1 = hash & kTableMask;
+  if (entries_[probe1].receiver_cid == kIllegalCid) {
+    entries_[probe1].receiver_cid = receiver_cid;
+    entries_[probe1].function_name = function_name;
+    entries_[probe1].target = target;
+    return;
+  }
+
+  const intptr_t probe2 = (hash >> 3) & kTableMask;
+  if (entries_[probe2].receiver_cid == kIllegalCid) {
+    entries_[probe2].receiver_cid = receiver_cid;
+    entries_[probe2].function_name = function_name;
+    entries_[probe2].target = target;
+    return;
+  }
+
+  entries_[probe1].receiver_cid = receiver_cid;
+  entries_[probe1].function_name = function_name;
+  entries_[probe1].target = target;
 }
 
 Interpreter::Interpreter()
-    : stack_(NULL), fp_(NULL), pp_(NULL), argdesc_(NULL) {
+    : stack_(NULL), fp_(NULL), pp_(NULL), argdesc_(NULL), lookup_cache_() {
   // Setup interpreter support first. Some of this information is needed to
   // setup the architecture state.
   // We allocate the stack here, the size is computed as the sum of
@@ -558,22 +250,54 @@
   // Low address.
   stack_base_ =
       reinterpret_cast<uword>(stack_) + kInterpreterStackUnderflowSize;
+  // Limit for StackOverflowError.
+  overflow_stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
   // High address.
-  stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
+  stack_limit_ = overflow_stack_limit_ + OSThread::kStackSizeBuffer;
 
   last_setjmp_buffer_ = NULL;
 
   DEBUG_ONLY(icount_ = 1);  // So that tracing after 0 traces first bytecode.
+
+#if defined(DEBUG)
+  trace_file_bytes_written_ = 0;
+  trace_file_ = NULL;
+  if (FLAG_interpreter_trace_file != NULL) {
+    Dart_FileOpenCallback file_open = Dart::file_open_callback();
+    if (file_open != NULL) {
+      trace_file_ = file_open(FLAG_interpreter_trace_file, /* write */ true);
+      trace_buffer_ = new KBCInstr[kTraceBufferInstrs];
+      trace_buffer_idx_ = 0;
+    }
+  }
+#endif
 }
 
 Interpreter::~Interpreter() {
   delete[] stack_;
+  pp_ = NULL;
+  argdesc_ = NULL;
+#if defined(DEBUG)
+  if (trace_file_ != NULL) {
+    FlushTraceBuffer();
+    // Close the file.
+    Dart_FileCloseCallback file_close = Dart::file_close_callback();
+    if (file_close != NULL) {
+      file_close(trace_file_);
+      trace_file_ = NULL;
+      delete[] trace_buffer_;
+      trace_buffer_ = NULL;
+    }
+  }
+#endif
 }
 
 // Get the active Interpreter for the current isolate.
 Interpreter* Interpreter::Current() {
-  Interpreter* interpreter = Thread::Current()->interpreter();
+  Thread* thread = Thread::Current();
+  Interpreter* interpreter = thread->interpreter();
   if (interpreter == NULL) {
+    TransitionGeneratedToVM transition(thread);
     interpreter = new Interpreter();
     Thread::Current()->set_interpreter(interpreter);
   }
@@ -597,6 +321,44 @@
     THR_Print("Disassembler not supported in this mode.\n");
   }
 }
+
+DART_FORCE_INLINE bool Interpreter::IsWritingTraceFile() const {
+  return (trace_file_ != NULL) &&
+         (trace_file_bytes_written_ < FLAG_interpreter_trace_file_max_bytes);
+}
+
+void Interpreter::FlushTraceBuffer() {
+  Dart_FileWriteCallback file_write = Dart::file_write_callback();
+  if (file_write == NULL) {
+    return;
+  }
+  if (trace_file_bytes_written_ >= FLAG_interpreter_trace_file_max_bytes) {
+    return;
+  }
+  const intptr_t bytes_to_write = Utils::Minimum(
+      static_cast<uint64_t>(trace_buffer_idx_ * sizeof(KBCInstr)),
+      FLAG_interpreter_trace_file_max_bytes - trace_file_bytes_written_);
+  if (bytes_to_write == 0) {
+    return;
+  }
+  file_write(trace_buffer_, bytes_to_write, trace_file_);
+  trace_file_bytes_written_ += bytes_to_write;
+  trace_buffer_idx_ = 0;
+}
+
+DART_NOINLINE void Interpreter::WriteInstructionToTrace(uint32_t* pc) {
+  Dart_FileWriteCallback file_write = Dart::file_write_callback();
+  if (file_write == NULL) {
+    return;
+  }
+  if (trace_buffer_idx_ < kTraceBufferInstrs) {
+    trace_buffer_[trace_buffer_idx_++] = static_cast<KBCInstr>(*pc);
+  }
+  if (trace_buffer_idx_ == kTraceBufferInstrs) {
+    FlushTraceBuffer();
+  }
+}
+
 #endif  // defined(DEBUG)
 
 // Calls into the Dart runtime are based on this interface.
@@ -616,7 +378,7 @@
                        RawObject** frame,
                        uint32_t* pc) {
   frame[0] = Function::null();
-  frame[1] = Code::null();
+  frame[1] = Bytecode::null();
   frame[2] = reinterpret_cast<RawObject*>(pc);
   frame[3] = reinterpret_cast<RawObject*>(base);
   fp_ = frame + kKBCDartFrameFixedSize;
@@ -630,37 +392,6 @@
 #endif
 }
 
-void Interpreter::CallRuntime(Thread* thread,
-                              RawObject** base,
-                              RawObject** exit_frame,
-                              uint32_t* pc,
-                              intptr_t argc_tag,
-                              RawObject** args,
-                              RawObject** result,
-                              uword target) {
-  Exit(thread, base, exit_frame, pc);
-  NativeArguments native_args(thread, argc_tag, args, result);
-  reinterpret_cast<RuntimeFunction>(target)(native_args);
-}
-
-DART_FORCE_INLINE static void EnterSyntheticFrame(RawObject*** FP,
-                                                  RawObject*** SP,
-                                                  uint32_t* pc) {
-  RawObject** fp = *SP + kKBCDartFrameFixedSize;
-  fp[kKBCPcMarkerSlotFromFp] = 0;
-  fp[kKBCSavedCallerPcSlotFromFp] = reinterpret_cast<RawObject*>(pc);
-  fp[kKBCSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(*FP);
-  *FP = fp;
-  *SP = fp - 1;
-}
-
-DART_FORCE_INLINE static void LeaveSyntheticFrame(RawObject*** FP,
-                                                  RawObject*** SP) {
-  RawObject** fp = *FP;
-  *FP = reinterpret_cast<RawObject**>(fp[kKBCSavedCallerFpSlotFromFp]);
-  *SP = fp - kKBCDartFrameFixedSize;
-}
-
 // Calling into runtime may trigger garbage collection and relocate objects,
 // so all RawObject* pointers become outdated and should not be used across
 // runtime calls.
@@ -675,7 +406,7 @@
   if (!setjmp(buffer.buffer_)) {
     thread->set_vm_tag(reinterpret_cast<uword>(drt));
     drt(args);
-    thread->set_vm_tag(VMTag::kDartTagId);
+    thread->set_vm_tag(VMTag::kDartInterpretedTagId);
     thread->set_top_exit_frame_info(0);
     return true;
   } else {
@@ -692,7 +423,7 @@
   if (!setjmp(buffer.buffer_)) {
     thread->set_vm_tag(reinterpret_cast<uword>(function));
     wrapper(args, function);
-    thread->set_vm_tag(VMTag::kDartTagId);
+    thread->set_vm_tag(VMTag::kDartInterpretedTagId);
     thread->set_top_exit_frame_info(0);
     return true;
   } else {
@@ -713,7 +444,7 @@
 #endif
   ASSERT(Function::HasCode(function));
   RawCode* volatile code = function->ptr()->code_;
-  ASSERT(code != StubCode::LazyCompile_entry()->code());
+  ASSERT(code != StubCode::LazyCompile().raw());
   // TODO(regis): Once we share the same stack, try to invoke directly.
 #if defined(DEBUG)
   if (IsTracingExecution()) {
@@ -725,16 +456,15 @@
   typedef RawObject* (*invokestub)(RawCode * code, RawArray * argdesc,
                                    RawObject * *arg0, Thread * thread);
   invokestub volatile entrypoint = reinterpret_cast<invokestub>(
-      StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint());
+      StubCode::InvokeDartCodeFromBytecode().EntryPoint());
   RawObject* volatile result;
   Exit(thread, *FP, call_top + 1, *pc);
   {
     InterpreterSetjmpBuffer buffer(this);
     if (!setjmp(buffer.buffer_)) {
-      thread->set_vm_tag(reinterpret_cast<uword>(entrypoint));
       result = entrypoint(code, argdesc_, call_base, thread);
-      thread->set_vm_tag(VMTag::kDartTagId);
       thread->set_top_exit_frame_info(0);
+      ASSERT(thread->vm_tag() == VMTag::kDartInterpretedTagId);
       ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
     } else {
       return false;
@@ -743,7 +473,7 @@
   // Pop args and push result.
   *SP = call_base;
   **SP = result;
-  pp_ = InterpreterHelpers::FrameCode(*FP)->ptr()->object_pool_;
+  pp_ = InterpreterHelpers::FrameBytecode(*FP)->ptr()->object_pool_;
 
   // If the result is an error (not a Dart instance), it must either be rethrown
   // (in the case of an unhandled exception) or it must be returned to the
@@ -922,7 +652,7 @@
         // Reload objects after the call which may trigger GC.
         function = reinterpret_cast<RawFunction*>(call_top[0]);
         field = reinterpret_cast<RawField*>(function->ptr()->data_);
-        pp_ = InterpreterHelpers::FrameCode(*FP)->ptr()->object_pool_;
+        pp_ = InterpreterHelpers::FrameBytecode(*FP)->ptr()->object_pool_;
         // The field is initialized by the runtime call, but not returned.
         value = field->ptr()->value_.static_value_;
       }
@@ -1034,6 +764,8 @@
   if (!InvokeRuntime(thread, this, DRT_CompileFunction, native_args)) {
     return false;
   }
+  // Reload objects after the call which may trigger GC.
+  function = Function::RawCast(call_top[2]);
   if (Function::HasCode(function)) {
     *invoked = true;
     return InvokeCompiled(thread, function, call_base, call_top, pc, FP, SP);
@@ -1042,7 +774,7 @@
   // Bytecode was loaded in the above compilation step.
   // The caller will dispatch to the function's bytecode.
   *invoked = false;
-  ASSERT(thread->vm_tag() == VMTag::kDartTagId);
+  ASSERT(thread->vm_tag() == VMTag::kDartInterpretedTagId);
   ASSERT(thread->top_exit_frame_info() == 0);
   return true;
 }
@@ -1076,14 +808,16 @@
               Function::Handle(function).ToFullyQualifiedCString());
   }
 #endif
-  RawCode* bytecode = function->ptr()->bytecode_;
+  RawBytecode* bytecode = function->ptr()->bytecode_;
   callee_fp[kKBCPcMarkerSlotFromFp] = bytecode;
   callee_fp[kKBCSavedCallerPcSlotFromFp] = reinterpret_cast<RawObject*>(*pc);
   callee_fp[kKBCSavedCallerFpSlotFromFp] = reinterpret_cast<RawObject*>(*FP);
   pp_ = bytecode->ptr()->object_pool_;
-  *pc = reinterpret_cast<uint32_t*>(bytecode->ptr()->entry_point_);
+  *pc =
+      reinterpret_cast<uint32_t*>(bytecode->ptr()->instructions_->ptr()->data_);
   pc_ = reinterpret_cast<uword>(*pc);  // For the profiler.
   *FP = callee_fp;
+  fp_ = callee_fp;  // For the profiler.
   *SP = *FP - 1;
   return true;
 }
@@ -1119,8 +853,48 @@
   // Handler arguments: arguments to check and an ICData object.
   const intptr_t miss_handler_argc = checked_args + 1;
   RawObject** exit_frame = miss_handler_args + miss_handler_argc;
-  CallRuntime(thread, FP, exit_frame, pc, miss_handler_argc, miss_handler_args,
-              result, reinterpret_cast<uword>(handler));
+  Exit(thread, FP, exit_frame, pc);
+  NativeArguments native_args(thread, miss_handler_argc, miss_handler_args,
+                              result);
+  handler(native_args);
+}
+
+DART_FORCE_INLINE bool Interpreter::InterfaceCall(Thread* thread,
+                                                  RawString* target_name,
+                                                  RawObject** call_base,
+                                                  RawObject** top,
+                                                  uint32_t** pc,
+                                                  RawObject*** FP,
+                                                  RawObject*** SP) {
+  const intptr_t type_args_len =
+      InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
+  const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
+
+  intptr_t receiver_cid =
+      InterpreterHelpers::GetClassId(call_base[receiver_idx]);
+
+  RawFunction* target;
+  if (UNLIKELY(!lookup_cache_.Lookup(receiver_cid, target_name, &target))) {
+    // Table lookup miss.
+    top[1] = call_base[receiver_idx];
+    top[2] = target_name;
+    top[3] = argdesc_;
+    top[4] = 0;  // Result slot.
+
+    Exit(thread, *FP, top + 5, *pc);
+    NativeArguments native_args(thread, 3, /* argv */ top + 1,
+                                /* result */ top + 4);
+    DRT_InterpretedInterfaceCallMissHandler(native_args);
+
+    target = static_cast<RawFunction*>(top[4]);
+    target_name = static_cast<RawString*>(top[2]);
+    argdesc_ = static_cast<RawArray*>(top[3]);
+    ASSERT(target->IsFunction());
+    lookup_cache_.Insert(receiver_cid, target_name, target);
+  }
+
+  top[0] = target;
+  return Invoke(thread, call_base, top, pc, FP, SP);
 }
 
 DART_FORCE_INLINE bool Interpreter::InstanceCall1(Thread* thread,
@@ -1216,24 +990,6 @@
   return Invoke(thread, call_base, top, pc, FP, SP);
 }
 
-DART_FORCE_INLINE void Interpreter::PrepareForTailCall(
-    RawCode* code,
-    RawImmutableArray* args_desc,
-    RawObject** FP,
-    RawObject*** SP,
-    uint32_t** pc) {
-  // Drop all stack locals.
-  *SP = FP - 1;
-
-  // Replace the callee with the new [code].
-  FP[kKBCFunctionSlotFromFp] = Object::null();
-  FP[kKBCPcMarkerSlotFromFp] = code;
-  *pc = reinterpret_cast<uint32_t*>(code->ptr()->entry_point_);
-  pc_ = reinterpret_cast<uword>(pc);  // For the profiler.
-  pp_ = code->ptr()->object_pool_;
-  argdesc_ = args_desc;
-}
-
 // Note:
 // All macro helpers are intended to be used only inside Interpreter::Call.
 
@@ -1243,6 +999,9 @@
   if (IsTracingExecution()) {                                                  \
     TraceInstruction(pc - 1);                                                  \
   }                                                                            \
+  if (IsWritingTraceFile()) {                                                  \
+    WriteInstructionToTrace(pc - 1);                                           \
+  }                                                                            \
   icount_++;
 #else
 #define TRACE_INSTRUCTION
@@ -1250,6 +1009,7 @@
 
 // Decode opcode and A part of the given value and dispatch to the
 // corresponding bytecode handler.
+#ifdef DART_HAS_COMPUTED_GOTO
 #define DISPATCH_OP(val)                                                       \
   do {                                                                         \
     op = (val);                                                                \
@@ -1257,6 +1017,15 @@
     TRACE_INSTRUCTION                                                          \
     goto* dispatch[op & 0xFF];                                                 \
   } while (0)
+#else
+#define DISPATCH_OP(val)                                                       \
+  do {                                                                         \
+    op = (val);                                                                \
+    rA = ((op >> 8) & 0xFF);                                                   \
+    TRACE_INSTRUCTION                                                          \
+    goto SwitchDispatch;                                                       \
+  } while (0)
+#endif
 
 // Fetch next operation from PC, increment program counter and dispatch.
 #define DISPATCH() DISPATCH_OP(*pc++)
@@ -1338,7 +1107,7 @@
                   reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_), \
                   exit_fp);                                                    \
       }                                                                        \
-      ASSERT(reinterpret_cast<uword>(fp_) < stack_limit());                    \
+      ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));                          \
       return special_[KernelBytecode::kExceptionSpecialIndex];                 \
     }                                                                          \
     goto DispatchAfterException;                                               \
@@ -1368,7 +1137,8 @@
 
 #define HANDLE_RETURN                                                          \
   do {                                                                         \
-    pp_ = InterpreterHelpers::FrameCode(FP)->ptr()->object_pool_;              \
+    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;          \
+    fp_ = FP; /* For the profiler. */                                          \
   } while (0)
 
 // Runtime call helpers: handle invocation and potential exception after return.
@@ -1411,61 +1181,6 @@
   }                                                                            \
   ASSERT(Integer::GetInt64Value(RAW_CAST(Integer, SP[0])) == result);
 
-// Returns true if deoptimization succeeds.
-DART_FORCE_INLINE bool Interpreter::Deoptimize(Thread* thread,
-                                               uint32_t** pc,
-                                               RawObject*** FP,
-                                               RawObject*** SP,
-                                               bool is_lazy) {
-  // Note: frame translation will take care of preserving result at the
-  // top of the stack. See CompilerDeoptInfo::CreateDeoptInfo.
-
-  // Make sure we preserve SP[0] when entering synthetic frame below.
-  (*SP)++;
-
-  // Leaf runtime function DeoptimizeCopyFrame expects a Dart frame.
-  // The code in this frame may not cause GC.
-  // DeoptimizeCopyFrame and DeoptimizeFillFrame are leaf runtime calls.
-  EnterSyntheticFrame(FP, SP, *pc - (is_lazy ? 1 : 0));
-  const intptr_t frame_size_in_bytes =
-      DLRT_DeoptimizeCopyFrame(reinterpret_cast<uword>(*FP), is_lazy ? 1 : 0);
-  LeaveSyntheticFrame(FP, SP);
-
-  *SP = *FP + (frame_size_in_bytes / kWordSize);
-  EnterSyntheticFrame(FP, SP, *pc - (is_lazy ? 1 : 0));
-  DLRT_DeoptimizeFillFrame(reinterpret_cast<uword>(*FP));
-
-  // We are now inside a valid frame.
-  {
-    *++(*SP) = 0;  // Space for the result: number of materialization args.
-    Exit(thread, *FP, *SP + 1, /*pc=*/0);
-    NativeArguments native_args(thread, 0, *SP, *SP);
-    if (!InvokeRuntime(thread, this, DRT_DeoptimizeMaterialize, native_args)) {
-      return false;
-    }
-  }
-  const intptr_t materialization_arg_count =
-      Smi::Value(RAW_CAST(Smi, *(*SP)--)) / kWordSize;
-
-  // Restore caller PC.
-  *pc = SavedCallerPC(*FP);
-  pc_ = reinterpret_cast<uword>(*pc);  // For the profiler.
-
-  // Check if it is a fake PC marking the entry frame.
-  ASSERT(!IsEntryFrameMarker(reinterpret_cast<uword>(*pc)));
-
-  // Restore SP, FP and PP.
-  // Unoptimized frame SP is one below FrameArguments(...) because
-  // FrameArguments(...) returns a pointer to the first argument.
-  *SP = FrameArguments(*FP, materialization_arg_count) - 1;
-  *FP = SavedCallerFP(*FP);
-
-  // Restore pp.
-  pp_ = InterpreterHelpers::FrameCode(*FP)->ptr()->object_pool_;
-
-  return true;
-}
-
 bool Interpreter::AssertAssignable(Thread* thread,
                                    uint32_t* pc,
                                    RawObject** FP,
@@ -1598,14 +1313,6 @@
                              intptr_t argc,
                              RawObject* const* argv,
                              Thread* thread) {
-  // Dispatch used to interpret bytecode. Contains addresses of
-  // labels of bytecode handlers. Handlers themselves are defined below.
-  static const void* dispatch[] = {
-#define TARGET(name, fmt, fmta, fmtb, fmtc) &&bc##name,
-      KERNEL_BYTECODES_LIST(TARGET)
-#undef TARGET
-  };
-
   // Interpreter state (see constants_kbc.h for high-level overview).
   uint32_t* pc;    // Program Counter: points to the next op to execute.
   RawObject** FP;  // Frame Pointer.
@@ -1629,14 +1336,6 @@
   }
 #endif
 
-  // Save current VM tag and mark thread as executing Dart code.
-  const uword vm_tag = thread->vm_tag();
-  thread->set_vm_tag(VMTag::kDartTagId);  // TODO(regis): kDartBytecodeTagId?
-
-  // Save current top stack resource and reset the list.
-  StackResource* top_resource = thread->top_resource();
-  thread->set_top_resource(NULL);
-
   // Setup entry frame:
   //
   //                        ^
@@ -1677,7 +1376,7 @@
     fp_[kKBCEntrySavedSlots + i] = argv[argc < 0 ? -i : i];
   }
 
-  RawCode* bytecode = function->ptr()->bytecode_;
+  RawBytecode* bytecode = function->ptr()->bytecode_;
   FP[kKBCFunctionSlotFromFp] = function;
   FP[kKBCPcMarkerSlotFromFp] = bytecode;
   FP[kKBCSavedCallerPcSlotFromFp] =
@@ -1689,10 +1388,22 @@
 
   // Ready to start executing bytecode. Load entry point and corresponding
   // object pool.
-  pc = reinterpret_cast<uint32_t*>(bytecode->ptr()->entry_point_);
+  pc =
+      reinterpret_cast<uint32_t*>(bytecode->ptr()->instructions_->ptr()->data_);
   pc_ = reinterpret_cast<uword>(pc);  // For the profiler.
+  fp_ = FP;                           // For the profiler.
   pp_ = bytecode->ptr()->object_pool_;
 
+  // Save current VM tag and mark thread as executing Dart code. For the
+  // profiler, do this *after* setting up the entry frame (compare the machine
+  // code entry stubs).
+  const uword vm_tag = thread->vm_tag();
+  thread->set_vm_tag(VMTag::kDartInterpretedTagId);
+
+  // Save current top stack resource and reset the list.
+  StackResource* top_resource = thread->top_resource();
+  thread->set_top_resource(NULL);
+
   // Cache some frequently used values in the frame.
   RawBool* true_value = Bool::True().raw();
   RawBool* false_value = Bool::False().raw();
@@ -1702,8 +1413,26 @@
   Function& function_h = Function::Handle();
 #endif
 
-  // Enter the dispatch loop.
-  DISPATCH();
+#ifdef DART_HAS_COMPUTED_GOTO
+  static const void* dispatch[] = {
+#define TARGET(name, fmt, fmta, fmtb, fmtc) &&bc##name,
+      KERNEL_BYTECODES_LIST(TARGET)
+#undef TARGET
+  };
+  DISPATCH();  // Enter the dispatch loop.
+#else
+  DISPATCH();  // Enter the dispatch loop.
+SwitchDispatch:
+  switch (op & 0xFF) {
+#define TARGET(name, fmt, fmta, fmtb, fmtc)                                    \
+  case KernelBytecode::k##name:                                                \
+    goto bc##name;
+    KERNEL_BYTECODES_LIST(TARGET)
+#undef TARGET
+    default:
+      FATAL1("Undefined opcode: %d\n", op);
+  }
+#endif
 
   // KernelBytecode handlers (see constants_kbc.h for bytecode descriptions).
   {
@@ -1884,7 +1613,7 @@
     {
       // Check the interpreter's own stack limit for actual interpreter's stack
       // overflows, and also the thread's stack limit for scheduled interrupts.
-      if (reinterpret_cast<uword>(SP) >= stack_limit() ||
+      if (reinterpret_cast<uword>(SP) >= overflow_stack_limit() ||
           thread->HasScheduledInterrupts()) {
         Exit(thread, FP, SP + 1, pc);
         NativeArguments args(thread, 0, NULL, NULL);
@@ -2061,8 +1790,9 @@
   }
 
   {
-    BYTECODE(MoveSpecial, A_D);
-    FP[rA] = special_[rD];
+    BYTECODE(MoveSpecial, A_X);
+    ASSERT(rA < KernelBytecode::kSpecialIndexCount);
+    FP[rD] = special_[rA];
     DISPATCH();
   }
 
@@ -2103,7 +1833,36 @@
   }
 
   {
-    BYTECODE(InstanceCall, A_D);
+    BYTECODE(InterfaceCall, A_D);
+
+    // Check if single stepping.
+    if (thread->isolate()->single_step()) {
+      Exit(thread, FP, SP + 1, pc);
+      NativeArguments args(thread, 0, NULL, NULL);
+      INVOKE_RUNTIME(DRT_SingleStepHandler, args);
+    }
+
+    {
+      const uint16_t argc = rA;
+      const uint16_t kidx = rD;
+
+      RawObject** call_base = SP - argc + 1;
+      RawObject** call_top = SP + 1;
+
+      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
+      RawString* target_name = static_cast<RawString*>(LOAD_CONSTANT(kidx));
+      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+      if (!InterfaceCall(thread, target_name, call_base, call_top, &pc, &FP,
+                         &SP)) {
+        HANDLE_EXCEPTION;
+      }
+    }
+
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(DynamicCall, A_D);
 
     // Check if single stepping.
     if (thread->isolate()->single_step()) {
@@ -2316,7 +2075,6 @@
     DISPATCH();
   }
 
-  // Return and return like instructions (Intrinsic).
   {
     RawObject* result;  // result to return to the caller.
 
@@ -2346,7 +2104,7 @@
                   reinterpret_cast<uword>(this), reinterpret_cast<uword>(fp_),
                   exit_fp);
       }
-      ASSERT(reinterpret_cast<uword>(fp_) < stack_limit());
+      ASSERT(HasFrame(reinterpret_cast<uword>(fp_)));
       const intptr_t argc = reinterpret_cast<uword>(pc) >> 2;
       ASSERT(fp_ == FrameArguments(FP, argc + kKBCEntrySavedSlots));
       // Exception propagation should have been done.
@@ -2362,7 +2120,8 @@
     // Restore SP, FP and PP. Push result and dispatch.
     SP = FrameArguments(FP, argc);
     FP = SavedCallerFP(FP);
-    pp_ = InterpreterHelpers::FrameCode(FP)->ptr()->object_pool_;
+    fp_ = FP;  // For the profiler.
+    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;
     *SP = result;
     DISPATCH();
   }
@@ -2915,8 +2674,9 @@
     SP = FrameArguments(FP, 0);
     RawObject** args = SP - argc;
     FP = SavedCallerFP(FP);
+    fp_ = FP;  // For the profiler.
     if (has_dart_caller) {
-      pp_ = InterpreterHelpers::FrameCode(FP)->ptr()->object_pool_;
+      pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;
     }
 
     *++SP = null_value;
@@ -2988,7 +2748,7 @@
   // Single dispatch point used by exception handling macros.
   {
   DispatchAfterException:
-    pp_ = InterpreterHelpers::FrameCode(FP)->ptr()->object_pool_;
+    pp_ = InterpreterHelpers::FrameBytecode(FP)->ptr()->object_pool_;
     DISPATCH();
   }
 
@@ -3011,14 +2771,9 @@
   // in the previous C++ frames.
   StackResource::Unwind(thread);
 
-  // Set the tag.
-  thread->set_vm_tag(VMTag::kDartTagId);
-  // Clear top exit frame.
-  thread->set_top_exit_frame_info(0);
-
   fp_ = reinterpret_cast<RawObject**>(fp);
 
-  if (pc == StubCode::RunExceptionHandler_entry()->EntryPoint()) {
+  if (pc == StubCode::RunExceptionHandler().EntryPoint()) {
     // The RunExceptionHandler stub is a placeholder.  We implement
     // its behavior here.
     RawObject* raw_exception = thread->active_exception();
@@ -3033,6 +2788,11 @@
     pc_ = pc;
   }
 
+  // Set the tag.
+  thread->set_vm_tag(VMTag::kDartInterpretedTagId);
+  // Clear top exit frame.
+  thread->set_top_exit_frame_info(0);
+
   buf->Longjmp();
   UNREACHABLE();
 }
@@ -3044,4 +2804,4 @@
 
 }  // namespace dart
 
-#endif  // !defined(DART_PRECOMPILED_RUNTIME) && !defined(TARGET_OS_WINDOWS)
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index 24d66a8..4e98f3e 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -24,9 +24,40 @@
 class RawArray;
 class RawObjectPool;
 class RawFunction;
+class RawString;
 class RawSubtypeTestCache;
 class ObjectPointerVisitor;
 
+class LookupCache : public ValueObject {
+ public:
+  LookupCache() {
+    ASSERT(Utils::IsPowerOfTwo(sizeof(Entry)));
+    ASSERT(Utils::IsPowerOfTwo(sizeof(kNumEntries)));
+    Clear();
+  }
+
+  void Clear();
+  bool Lookup(intptr_t receiver_cid,
+              RawString* function_name,
+              RawFunction** target) const;
+  void Insert(intptr_t receiver_cid,
+              RawString* function_name,
+              RawFunction* target);
+
+ private:
+  struct Entry {
+    intptr_t receiver_cid;
+    RawString* function_name;
+    RawFunction* target;
+    intptr_t padding;
+  };
+
+  static const intptr_t kNumEntries = 1024;
+  static const intptr_t kTableMask = kNumEntries - 1;
+
+  Entry entries_[kNumEntries];
+};
+
 // Interpreter intrinsic handler. It is invoked on entry to the intrinsified
 // function via Intrinsic bytecode before the frame is setup.
 // If the handler returns true then Intrinsic bytecode works as a return
@@ -49,6 +80,8 @@
 
   // Low address (KBC stack grows up).
   uword stack_base() const { return stack_base_; }
+  // Limit for StackOverflowError.
+  uword overflow_stack_limit() const { return overflow_stack_limit_; }
   // High address (KBC stack grows up).
   uword stack_limit() const { return stack_limit_; }
 
@@ -56,15 +89,12 @@
   // TODO(regis): We should rely on a new thread vm_tag to identify an
   // interpreter frame and not need this HasFrame() method.
   bool HasFrame(uword frame) const {
-    return frame >= stack_base() && frame <= get_fp();
+    return frame >= stack_base() && frame < stack_limit();
   }
 
   // Identify an entry frame by looking at its pc marker value.
   static bool IsEntryFrameMarker(uword pc) { return (pc & 2) != 0; }
 
-  // Call on program start.
-  static void InitOnce();
-
   RawObject* Call(const Function& function,
                   const Array& arguments_descriptor,
                   const Array& arguments,
@@ -82,23 +112,13 @@
   uword get_fp() const { return reinterpret_cast<uword>(fp_); }
   uword get_pc() const { return pc_; }
 
-  enum IntrinsicId {
-#define V(test_class_name, test_function_name, enum_name, type, fp)            \
-  k##enum_name##Intrinsic,
-    ALL_INTRINSICS_LIST(V) GRAPH_INTRINSICS_LIST(V)
-#undef V
-        kIntrinsicCount,
-  };
-
-  static bool IsSupportedIntrinsic(IntrinsicId id) {
-    return intrinsics_[id] != NULL;
-  }
-
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
+  void MajorGC() { lookup_cache_.Clear(); }
 
  private:
   uintptr_t* stack_;
   uword stack_base_;
+  uword overflow_stack_limit_;
   uword stack_limit_;
 
   RawObject** fp_;
@@ -112,22 +132,13 @@
                        // call instruction and the function entry.
   RawObject* special_[KernelBytecode::kSpecialIndexCount];
 
-  static IntrinsicHandler intrinsics_[kIntrinsicCount];
+  LookupCache lookup_cache_;
 
   void Exit(Thread* thread,
             RawObject** base,
             RawObject** exit_frame,
             uint32_t* pc);
 
-  void CallRuntime(Thread* thread,
-                   RawObject** base,
-                   RawObject** exit_frame,
-                   uint32_t* pc,
-                   intptr_t argc_tag,
-                   RawObject** args,
-                   RawObject** result,
-                   uword target);
-
   bool Invoke(Thread* thread,
               RawObject** call_base,
               RawObject** call_top,
@@ -152,12 +163,6 @@
                       RawObject*** FP,
                       RawObject*** SP);
 
-  bool Deoptimize(Thread* thread,
-                  uint32_t** pc,
-                  RawObject*** FP,
-                  RawObject*** SP,
-                  bool is_lazy);
-
   void InlineCacheMiss(int checked_args,
                        Thread* thread,
                        RawICData* icdata,
@@ -167,6 +172,14 @@
                        RawObject** FP,
                        RawObject** SP);
 
+  bool InterfaceCall(Thread* thread,
+                     RawString* target_name,
+                     RawObject** call_base,
+                     RawObject** call_top,
+                     uint32_t** pc,
+                     RawObject*** FP,
+                     RawObject*** SP);
+
   bool InstanceCall1(Thread* thread,
                      RawICData* icdata,
                      RawObject** call_base,
@@ -185,12 +198,6 @@
                      RawObject*** SP,
                      bool optimized);
 
-  void PrepareForTailCall(RawCode* code,
-                          RawImmutableArray* args_desc,
-                          RawObject** FP,
-                          RawObject*** SP,
-                          uint32_t** pc);
-
   bool AssertAssignable(Thread* thread,
                         uint32_t* pc,
                         RawObject** FP,
@@ -210,6 +217,19 @@
 
   // Prints bytecode instruction at given pc for instruction tracing.
   void TraceInstruction(uint32_t* pc) const;
+
+  bool IsWritingTraceFile() const;
+  void FlushTraceBuffer();
+  void WriteInstructionToTrace(uint32_t* pc);
+
+  void* trace_file_;
+  uint64_t trace_file_bytes_written_;
+
+  static const intptr_t kTraceBufferSizeInBytes = 10 * KB;
+  static const intptr_t kTraceBufferInstrs =
+      kTraceBufferSizeInBytes / sizeof(KBCInstr);
+  KBCInstr* trace_buffer_;
+  intptr_t trace_buffer_idx_;
 #endif  // defined(DEBUG)
 
   // Longjmp support for exceptions.
diff --git a/runtime/vm/interpreter_unsupported.cc b/runtime/vm/interpreter_unsupported.cc
deleted file mode 100644
index b12ba4e..0000000
--- a/runtime/vm/interpreter_unsupported.cc
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/globals.h"
-#if !defined(DART_PRECOMPILED_RUNTIME) && defined(TARGET_OS_WINDOWS)
-
-#include "vm/interpreter.h"
-
-#include "platform/assert.h"
-#include "vm/object.h"
-
-namespace dart {
-
-IntrinsicHandler Interpreter::intrinsics_[Interpreter::kIntrinsicCount];
-
-void Interpreter::InitOnce() {
-  UNIMPLEMENTED();
-}
-
-Interpreter::Interpreter() {
-  UNIMPLEMENTED();
-}
-
-Interpreter::~Interpreter() {
-  UNIMPLEMENTED();
-}
-
-Interpreter* Interpreter::Current() {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-#if defined(DEBUG)
-bool Interpreter::IsTracingExecution() const {
-  UNIMPLEMENTED();
-  return false;
-}
-
-void Interpreter::TraceInstruction(uint32_t* pc) const {
-  UNIMPLEMENTED();
-}
-#endif  // defined(DEBUG)
-
-void Interpreter::Exit(Thread* thread,
-                       RawObject** base,
-                       RawObject** frame,
-                       uint32_t* pc) {
-  UNIMPLEMENTED();
-}
-
-void Interpreter::CallRuntime(Thread* thread,
-                              RawObject** base,
-                              RawObject** exit_frame,
-                              uint32_t* pc,
-                              intptr_t argc_tag,
-                              RawObject** args,
-                              RawObject** result,
-                              uword target) {
-  UNIMPLEMENTED();
-}
-
-bool Interpreter::InvokeCompiled(Thread* thread,
-                                 RawFunction* function,
-                                 RawObject** call_base,
-                                 RawObject** call_top,
-                                 uint32_t** pc,
-                                 RawObject*** FP,
-                                 RawObject*** SP) {
-  UNIMPLEMENTED();
-  return false;
-}
-
-bool Interpreter::ProcessInvocation(bool* invoked,
-                                    Thread* thread,
-                                    RawFunction* function,
-                                    RawObject** call_base,
-                                    RawObject** call_top,
-                                    uint32_t** pc,
-                                    RawObject*** FP,
-                                    RawObject*** SP) {
-  UNIMPLEMENTED();
-  return false;
-}
-
-bool Interpreter::Invoke(Thread* thread,
-                         RawObject** call_base,
-                         RawObject** call_top,
-                         uint32_t** pc,
-                         RawObject*** FP,
-                         RawObject*** SP) {
-  UNIMPLEMENTED();
-  return false;
-}
-
-void Interpreter::InlineCacheMiss(int checked_args,
-                                  Thread* thread,
-                                  RawICData* icdata,
-                                  RawObject** args,
-                                  RawObject** top,
-                                  uint32_t* pc,
-                                  RawObject** FP,
-                                  RawObject** SP) {
-  UNIMPLEMENTED();
-}
-
-bool Interpreter::InstanceCall1(Thread* thread,
-                                RawICData* icdata,
-                                RawObject** call_base,
-                                RawObject** top,
-                                uint32_t** pc,
-                                RawObject*** FP,
-                                RawObject*** SP,
-                                bool optimized) {
-  UNIMPLEMENTED();
-  return false;
-}
-
-bool Interpreter::InstanceCall2(Thread* thread,
-                                RawICData* icdata,
-                                RawObject** call_base,
-                                RawObject** top,
-                                uint32_t** pc,
-                                RawObject*** FP,
-                                RawObject*** SP,
-                                bool optimized) {
-  UNIMPLEMENTED();
-  return false;
-}
-
-void Interpreter::PrepareForTailCall(RawCode* code,
-                                     RawImmutableArray* args_desc,
-                                     RawObject** FP,
-                                     RawObject*** SP,
-                                     uint32_t** pc) {
-  UNIMPLEMENTED();
-}
-
-bool Interpreter::Deoptimize(Thread* thread,
-                             uint32_t** pc,
-                             RawObject*** FP,
-                             RawObject*** SP,
-                             bool is_lazy) {
-  UNIMPLEMENTED();
-  return false;
-}
-
-bool Interpreter::AssertAssignable(Thread* thread,
-                                   uint32_t* pc,
-                                   RawObject** FP,
-                                   RawObject** call_top,
-                                   RawObject** args,
-                                   RawSubtypeTestCache* cache) {
-  UNIMPLEMENTED();
-  return false;
-}
-
-RawObject* Interpreter::Call(const Function& function,
-                             const Array& arguments_descriptor,
-                             const Array& arguments,
-                             Thread* thread) {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-RawObject* Interpreter::Call(RawFunction* function,
-                             RawArray* argdesc,
-                             intptr_t argc,
-                             RawObject* const* argv,
-                             Thread* thread) {
-  UNIMPLEMENTED();
-  return NULL;
-}
-
-void Interpreter::JumpToFrame(uword pc, uword sp, uword fp, Thread* thread) {
-  UNIMPLEMENTED();
-}
-
-void Interpreter::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  UNIMPLEMENTED();
-}
-
-}  // namespace dart
-
-#endif  // !defined(DART_PRECOMPILED_RUNTIME) && defined(TARGET_OS_WINDOWS)
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index e3a60be..7f1e8a2 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -36,6 +36,7 @@
 #include "vm/port.h"
 #include "vm/profiler.h"
 #include "vm/reusable_handles.h"
+#include "vm/reverse_pc_lookup_cache.h"
 #include "vm/service.h"
 #include "vm/service_event.h"
 #include "vm/service_isolate.h"
@@ -68,7 +69,6 @@
 #if !defined(PRODUCT)
 static void CheckedModeHandler(bool value) {
   FLAG_enable_asserts = value;
-  FLAG_enable_type_checks = value;
 }
 
 // --enable-checked-mode and --checked both enable checked mode which is
@@ -82,9 +82,9 @@
 
 static void DeterministicModeHandler(bool value) {
   if (value) {
-    FLAG_marker_tasks = 0;                // Timing dependent.
     FLAG_background_compilation = false;  // Timing dependent.
     FLAG_collect_code = false;            // Timing dependent.
+    FLAG_concurrent_mark = false;         // Timing dependent.
     FLAG_concurrent_sweep = false;        // Timing dependent.
     FLAG_random_seed = 0x44617274;  // "Dart"
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
@@ -148,7 +148,8 @@
   return Isolate::IsVMInternalIsolate(isolate);
 }
 
-NoOOBMessageScope::NoOOBMessageScope(Thread* thread) : StackResource(thread) {
+NoOOBMessageScope::NoOOBMessageScope(Thread* thread)
+    : ThreadStackResource(thread) {
   thread->DeferOOBMessageInterrupts();
 }
 
@@ -157,7 +158,7 @@
 }
 
 NoReloadScope::NoReloadScope(Isolate* isolate, Thread* thread)
-    : StackResource(thread), isolate_(isolate) {
+    : ThreadStackResource(thread), isolate_(isolate) {
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   ASSERT(isolate_ != NULL);
   AtomicOperations::FetchAndIncrement(&(isolate_->no_reload_scope_depth_));
@@ -484,6 +485,10 @@
   }
 }
 
+bool Isolate::HasPendingMessages() {
+  return message_handler_->HasMessages() || message_handler_->HasOOBMessages();
+}
+
 MessageHandler::MessageStatus IsolateMessageHandler::HandleMessage(
     Message* message) {
   ASSERT(IsCurrentIsolate());
@@ -738,7 +743,7 @@
     bool has_listener = I->NotifyErrorListeners(exc_str, stacktrace_str);
     if (I->ErrorsFatal()) {
       if (has_listener) {
-        T->clear_sticky_error();
+        T->ClearStickyError();
       } else {
         T->set_sticky_error(result);
       }
@@ -776,6 +781,7 @@
 #undef INIT_FROM_FLAG
   api_flags->entry_points = NULL;
   api_flags->load_vmservice_library = false;
+  api_flags->copy_parent_code = false;
 }
 
 void Isolate::FlagsCopyTo(Dart_IsolateFlags* api_flags) const {
@@ -786,6 +792,7 @@
 #undef INIT_FROM_FIELD
   api_flags->entry_points = NULL;
   api_flags->load_vmservice_library = should_load_vmservice();
+  api_flags->copy_parent_code = false;
 }
 
 void Isolate::FlagsCopyFrom(const Dart_IsolateFlags& api_flags) {
@@ -922,6 +929,8 @@
           new Mutex(NOT_IN_PRODUCT("Isolate::kernel_data_lib_cache_mutex_"))),
       kernel_data_class_cache_mutex_(
           new Mutex(NOT_IN_PRODUCT("Isolate::kernel_data_class_cache_mutex_"))),
+      kernel_constants_mutex_(
+          new Mutex(NOT_IN_PRODUCT("Isolate::kernel_constants_mutex_"))),
       message_handler_(NULL),
       spawn_state_(NULL),
       defer_finalization_count_(0),
@@ -933,7 +942,6 @@
       reloaded_kernel_blobs_(GrowableObjectArray::null()),
       next_(NULL),
       loading_invalidation_gen_(kInvalidGen),
-      top_level_parsing_count_(0),
       field_list_mutex_(
           new Mutex(NOT_IN_PRODUCT("Isolate::field_list_mutex_"))),
       boxed_field_list_(GrowableObjectArray::null()),
@@ -942,7 +950,8 @@
       handler_info_cache_(),
       catch_entry_moves_cache_(),
       embedder_entry_points_(NULL),
-      obfuscation_map_(NULL) {
+      obfuscation_map_(NULL),
+      reverse_pc_lookup_cache_(nullptr) {
   FlagsCopyFrom(api_flags);
   SetErrorsFatal(true);
   set_compilation_allowed(true);
@@ -970,6 +979,9 @@
   // RELEASE_ASSERT(reload_context_ == NULL);
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
+  delete reverse_pc_lookup_cache_;
+  reverse_pc_lookup_cache_ = nullptr;
+
   delete background_compiler_;
   background_compiler_ = NULL;
 
@@ -1003,6 +1015,8 @@
   constant_canonicalization_mutex_ = NULL;
   delete megamorphic_lookup_mutex_;
   megamorphic_lookup_mutex_ = NULL;
+  delete kernel_constants_mutex_;
+  kernel_constants_mutex_ = nullptr;
   delete kernel_data_lib_cache_mutex_;
   kernel_data_lib_cache_mutex_ = NULL;
   delete kernel_data_class_cache_mutex_;
@@ -1118,8 +1132,7 @@
 
   result->BuildName(name_prefix);
 #if !defined(PRODUCT)
-  result->debugger_ = new Debugger();
-  result->debugger_->Initialize(result);
+  result->debugger_ = new Debugger(result);
 #endif
   if (FLAG_trace_isolates) {
     if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) {
@@ -1166,6 +1179,21 @@
   return thread_registry()->mutator_thread();
 }
 
+RawObject* Isolate::CallTagHandler(Dart_LibraryTag tag,
+                                   const Object& arg1,
+                                   const Object& arg2) {
+  Thread* thread = Thread::Current();
+  Api::Scope api_scope(thread);
+  Dart_Handle api_arg1 = Api::NewHandle(thread, arg1.raw());
+  Dart_Handle api_arg2 = Api::NewHandle(thread, arg2.raw());
+  Dart_Handle api_result;
+  {
+    TransitionVMToNative transition(thread);
+    api_result = library_tag_handler_(tag, api_arg1, api_arg2);
+  }
+  return Api::UnwrapHandle(api_result);
+}
+
 void Isolate::SetupImagePage(const uint8_t* image_buffer, bool is_executable) {
   Image image(image_buffer);
   heap_->SetupImagePage(image.object_start(), image.object_size(),
@@ -1665,7 +1693,6 @@
 #if defined(DEBUG)
     isolate->ValidateConstants();
 #endif  // defined(DEBUG)
-    TransitionVMToNative transition(thread);
     Dart::RunShutdownCallback();
   }
   // Shut the isolate down.
@@ -2022,9 +2049,11 @@
   thread_registry()->ReleaseStoreBuffers();
 }
 
-void Isolate::EnableIncrementalBarrier(MarkingStack* marking_stack) {
+void Isolate::EnableIncrementalBarrier(MarkingStack* marking_stack,
+                                       MarkingStack* deferred_marking_stack) {
   ASSERT(marking_stack_ == NULL);
   marking_stack_ = marking_stack;
+  deferred_marking_stack_ = deferred_marking_stack;
   thread_registry()->AcquireMarkingStacks();
   ASSERT(Thread::Current()->is_marking());
 }
@@ -2033,6 +2062,7 @@
   thread_registry()->ReleaseMarkingStacks();
   ASSERT(marking_stack_ != NULL);
   marking_stack_ = NULL;
+  deferred_marking_stack_ = NULL;
   ASSERT(!Thread::Current()->is_marking());
 }
 
@@ -2299,8 +2329,11 @@
   deoptimized_code.Add(code);
 }
 
-void Isolate::clear_sticky_error() {
+RawError* Isolate::StealStickyError() {
+  NoSafepointScope no_safepoint;
+  RawError* return_value = sticky_error_;
   sticky_error_ = Error::null();
+  return return_value;
 }
 
 #if !defined(PRODUCT)
@@ -2804,10 +2837,6 @@
     os_thread->set_thread(thread);
     if (is_mutator) {
       scheduled_mutator_thread_ = thread;
-      if (this != Dart::vm_isolate()) {
-        scheduled_mutator_thread_->set_top(heap()->new_space()->top());
-        scheduled_mutator_thread_->set_end(heap()->new_space()->end());
-      }
     }
     Thread::SetCurrent(thread);
     os_thread->EnableThreadInterrupts();
@@ -2829,12 +2858,12 @@
   if (is_mutator) {
     if (thread->sticky_error() != Error::null()) {
       ASSERT(sticky_error_ == Error::null());
-      sticky_error_ = thread->sticky_error();
-      thread->clear_sticky_error();
+      sticky_error_ = thread->StealStickyError();
     }
   } else {
     ASSERT(thread->api_top_scope_ == NULL);
-    ASSERT(thread->zone_ == NULL);
+    ASSERT(thread->zone() == NULL);
+    ASSERT(thread->sticky_error() == Error::null());
   }
   if (!bypass_safepoint) {
     // Ensure that the thread reports itself as being at a safepoint.
@@ -2846,12 +2875,6 @@
   os_thread->set_thread(NULL);
   OSThread::SetCurrent(os_thread);
   if (is_mutator) {
-    if (this != Dart::vm_isolate()) {
-      heap()->new_space()->set_top(scheduled_mutator_thread_->top_);
-      heap()->new_space()->set_end(scheduled_mutator_thread_->end_);
-    }
-    scheduled_mutator_thread_->top_ = 0;
-    scheduled_mutator_thread_->end_ = 0;
     scheduled_mutator_thread_ = NULL;
   }
   // Even if we unschedule the mutator thread, e.g. via calling
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index dd92e29..ffa2a03 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -21,6 +21,7 @@
 #include "vm/random.h"
 #include "vm/tags.h"
 #include "vm/thread.h"
+#include "vm/thread_stack_resource.h"
 #include "vm/token_position.h"
 
 namespace dart {
@@ -64,6 +65,7 @@
 class RawFloat32x4;
 class RawInt32x4;
 class RawUserTag;
+class ReversePcLookupCache;
 class SafepointHandler;
 class SampleBuffer;
 class SendPort;
@@ -105,7 +107,7 @@
 };
 
 // Disallow OOB message handling within this scope.
-class NoOOBMessageScope : public StackResource {
+class NoOOBMessageScope : public ThreadStackResource {
  public:
   explicit NoOOBMessageScope(Thread* thread);
   ~NoOOBMessageScope();
@@ -115,7 +117,7 @@
 };
 
 // Disallow isolate reload.
-class NoReloadScope : public StackResource {
+class NoReloadScope : public ThreadStackResource {
  public:
   NoReloadScope(Isolate* isolate, Thread* thread);
   ~NoReloadScope();
@@ -133,14 +135,12 @@
 // List of Isolate flags with corresponding members of Dart_IsolateFlags and
 // corresponding global command line flags.
 //
-//       V(when, name, Dart_IsolateFlags-member-name, command-line-flag-name)
+//       V(when, name, bit-name, Dart_IsolateFlags-name, command-line-flag-name)
 //
 #define ISOLATE_FLAG_LIST(V)                                                   \
-  V(NONPRODUCT, type_checks, EnableTypeChecks, enable_type_checks,             \
-    FLAG_enable_type_checks)                                                   \
   V(NONPRODUCT, asserts, EnableAsserts, enable_asserts, FLAG_enable_asserts)   \
-  V(NONPRODUCT, error_on_bad_type, ErrorOnBadType, enable_error_on_bad_type,   \
-    FLAG_error_on_bad_type)                                                    \
+  V(PRODUCT, use_bare_instructions, Bare, use_bare_instructions,               \
+    FLAG_use_bare_instructions)                                                \
   V(NONPRODUCT, use_field_guards, UseFieldGuards, use_field_guards,            \
     FLAG_use_field_guards)                                                     \
   V(NONPRODUCT, use_osr, UseOsr, use_osr, FLAG_use_osr)                        \
@@ -199,11 +199,15 @@
 
   // Prepares all threads in an isolate for Garbage Collection.
   void ReleaseStoreBuffers();
-  void EnableIncrementalBarrier(MarkingStack* marking_stack);
+  void EnableIncrementalBarrier(MarkingStack* marking_stack,
+                                MarkingStack* deferred_marking_stack);
   void DisableIncrementalBarrier();
 
   StoreBuffer* store_buffer() const { return store_buffer_; }
   MarkingStack* marking_stack() const { return marking_stack_; }
+  MarkingStack* deferred_marking_stack() const {
+    return deferred_marking_stack_;
+  }
 
   ThreadRegistry* thread_registry() const { return thread_registry_; }
   SafepointHandler* safepoint_handler() const { return safepoint_handler_; }
@@ -223,10 +227,13 @@
   Dart_MessageNotifyCallback message_notify_callback() const {
     return message_notify_callback_;
   }
+
   void set_message_notify_callback(Dart_MessageNotifyCallback value) {
     message_notify_callback_ = value;
   }
 
+  bool HasPendingMessages();
+
   Thread* mutator_thread() const;
 
   // Mutator thread is not scheduled if NULL or no heap is attached
@@ -280,9 +287,10 @@
     environment_callback_ = value;
   }
 
-  Dart_LibraryTagHandler library_tag_handler() const {
-    return library_tag_handler_;
-  }
+  bool HasTagHandler() const { return library_tag_handler_ != nullptr; }
+  RawObject* CallTagHandler(Dart_LibraryTag tag,
+                            const Object& arg1,
+                            const Object& arg2);
   void set_library_tag_handler(Dart_LibraryTagHandler value) {
     library_tag_handler_ = value;
   }
@@ -357,6 +365,10 @@
     return kernel_data_class_cache_mutex_;
   }
 
+  // Any access to constants arrays must be locked since mutator and
+  // background compiler can access the arrays at the same time.
+  Mutex* kernel_constants_mutex() const { return kernel_constants_mutex_; }
+
 #if !defined(PRODUCT)
   Debugger* debugger() const {
     ASSERT(debugger_ != NULL);
@@ -598,7 +610,7 @@
   void SetStickyError(RawError* sticky_error);
 
   RawError* sticky_error() const { return sticky_error_; }
-  void clear_sticky_error();
+  DART_WARN_UNUSED_RESULT RawError* StealStickyError();
 
   void RetainKernelBlob(const ExternalTypedData& kernel_blob);
 
@@ -624,20 +636,6 @@
     isolate_flags_ = RemappingCidsBit::update(value, isolate_flags_);
   }
 
-  // True during top level parsing.
-  bool IsTopLevelParsing() {
-    const intptr_t value =
-        AtomicOperations::LoadRelaxed(&top_level_parsing_count_);
-    ASSERT(value >= 0);
-    return value > 0;
-  }
-  void IncrTopLevelParsingCount() {
-    AtomicOperations::IncrementBy(&top_level_parsing_count_, 1);
-  }
-  void DecrTopLevelParsingCount() {
-    AtomicOperations::DecrementBy(&top_level_parsing_count_, 1);
-  }
-
   static const intptr_t kInvalidGen = 0;
 
   void IncrLoadingInvalidationGen() {
@@ -697,8 +695,7 @@
   }
 
   bool can_use_strong_mode_types() const {
-    return FLAG_strong && FLAG_use_strong_mode_types &&
-           !unsafe_trust_strong_mode_types();
+    return FLAG_use_strong_mode_types && !unsafe_trust_strong_mode_types();
   }
 
   bool should_load_vmservice() const {
@@ -715,6 +712,17 @@
   void set_obfuscation_map(const char** map) { obfuscation_map_ = map; }
   const char** obfuscation_map() const { return obfuscation_map_; }
 
+  // Returns the pc -> code lookup cache object for this isolate.
+  ReversePcLookupCache* reverse_pc_lookup_cache() const {
+    return reverse_pc_lookup_cache_;
+  }
+
+  // Sets the pc -> code lookup cache object for this isolate.
+  void set_reverse_pc_lookup_cache(ReversePcLookupCache* table) {
+    ASSERT(reverse_pc_lookup_cache_ == nullptr);
+    reverse_pc_lookup_cache_ = table;
+  }
+
   // Isolate-specific flag handling.
   static void FlagsInitialize(Dart_IsolateFlags* api_flags);
   void FlagsCopyTo(Dart_IsolateFlags* api_flags) const;
@@ -756,12 +764,10 @@
 
   // Convenience flag tester indicating whether incoming function arguments
   // should be type checked.
-  bool argument_type_checks() const {
-    return should_emit_strong_mode_checks() || type_checks();
-  }
+  bool argument_type_checks() const { return should_emit_strong_mode_checks(); }
 
   bool should_emit_strong_mode_checks() const {
-    return FLAG_strong && !unsafe_trust_strong_mode_types();
+    return !unsafe_trust_strong_mode_types();
   }
 
   static void KillAllIsolates(LibMsgId msg_id);
@@ -861,6 +867,7 @@
 
   StoreBuffer* store_buffer_;
   MarkingStack* marking_stack_;
+  MarkingStack* deferred_marking_stack_;
   Heap* heap_;
 
 #define ISOLATE_FLAG_BITS(V)                                                   \
@@ -878,6 +885,7 @@
   V(EnableAsserts)                                                             \
   V(ErrorOnBadType)                                                            \
   V(ErrorOnBadOverride)                                                        \
+  V(Bare)                                                                      \
   V(UseFieldGuards)                                                            \
   V(UseOsr)                                                                    \
   V(Obfuscate)                                                                 \
@@ -976,6 +984,7 @@
   Mutex* megamorphic_lookup_mutex_;  // Protects megamorphic table lookup.
   Mutex* kernel_data_lib_cache_mutex_;
   Mutex* kernel_data_class_cache_mutex_;
+  Mutex* kernel_constants_mutex_;
   MessageHandler* message_handler_;
   IsolateSpawnState* spawn_state_;
   intptr_t defer_finalization_count_;
@@ -1001,7 +1010,6 @@
   // to background compilation. The counters may overflow, which is OK
   // since we check for equality to detect if an event occured.
   intptr_t loading_invalidation_gen_;
-  intptr_t top_level_parsing_count_;
 
   // Protect access to boxed_field_list_.
   Mutex* field_list_mutex_;
@@ -1019,6 +1027,8 @@
   Dart_QualifiedFunctionName* embedder_entry_points_;
   const char** obfuscation_map_;
 
+  ReversePcLookupCache* reverse_pc_lookup_cache_;
+
   static Dart_IsolateCreateCallback create_callback_;
   static Dart_IsolateShutdownCallback shutdown_callback_;
   static Dart_IsolateCleanupCallback cleanup_callback_;
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 892a7ed..81b77be 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -165,10 +165,8 @@
   TIR_Print("Running new field initializers for class: %s\n", to_.ToCString());
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  String& initializing_expression = String::Handle(zone);
   Function& eval_func = Function::Handle(zone);
   Object& result = Object::Handle(zone);
-  Class& owning_class = Class::Handle(zone);
   // For each new field.
   for (intptr_t i = 0; i < new_fields_->length(); i++) {
     // Create a function that returns the expression.
@@ -176,14 +174,7 @@
     if (field->kernel_offset() > 0) {
       eval_func ^= kernel::CreateFieldInitializerFunction(thread, zone, *field);
     } else {
-      owning_class ^= field->Owner();
-      ASSERT(!owning_class.IsNull());
-      // Extract the initializing expression.
-      initializing_expression = field->InitializingExpression();
-      TIR_Print("New `%s` has initializing expression `%s`\n",
-                field->ToCString(), initializing_expression.ToCString());
-      eval_func ^= Function::EvaluateHelper(
-          owning_class, initializing_expression, Array::empty_array(), true);
+      UNREACHABLE();
     }
 
     for (intptr_t j = 0; j < after_->length(); j++) {
@@ -575,11 +566,9 @@
   const String& root_lib_url =
       (root_script_url == NULL) ? old_root_lib_url
                                 : String::Handle(String::New(root_script_url));
-  bool root_lib_modified = false;
 
   // Check to see if the base url of the loaded libraries has moved.
   if (!old_root_lib_url.Equals(root_lib_url)) {
-    root_lib_modified = true;
     const char* old_root_library_url_c = old_root_lib_url.ToCString();
     const char* root_library_url_c = root_lib_url.ToCString();
     const intptr_t common_suffix_length =
@@ -598,6 +587,12 @@
     packages_url = String::New(packages_url_);
   }
 
+  // Reset stats.
+  num_received_libs_ = 0;
+  bytes_received_libs_ = 0;
+  num_received_classes_ = 0;
+  num_received_procedures_ = 0;
+
   bool did_kernel_compilation = false;
   bool skip_reload = false;
   {
@@ -606,13 +601,20 @@
         GrowableObjectArray::Handle(object_store()->libraries());
     intptr_t num_libs = libs.Length();
     modified_libs_ = new (Z) BitVector(Z, num_libs);
+    intptr_t* p_num_received_classes = nullptr;
+    intptr_t* p_num_received_procedures = nullptr;
 
     // ReadKernelFromFile checks to see if the file at
     // root_script_url is a valid .dill file. If that's the case, a Program*
     // is returned. Otherwise, this is likely a source file that needs to be
     // compiled, so ReadKernelFromFile returns NULL.
     kernel_program.set(kernel::Program::ReadFromFile(root_script_url));
-    if (kernel_program.get() == NULL) {
+    if (kernel_program.get() != NULL) {
+      num_received_libs_ = kernel_program.get()->library_count();
+      bytes_received_libs_ = kernel_program.get()->kernel_data_size();
+      p_num_received_classes = &num_received_classes_;
+      p_num_received_procedures = &num_received_procedures_;
+    } else {
       Dart_KernelCompilationResult retval;
       if (kernel_buffer != NULL && kernel_buffer_size != 0) {
         retval.kernel = const_cast<uint8_t*>(kernel_buffer);
@@ -670,7 +672,8 @@
     }
 
     kernel::KernelLoader::FindModifiedLibraries(
-        kernel_program.get(), I, modified_libs_, force_reload, &skip_reload);
+        kernel_program.get(), I, modified_libs_, force_reload, &skip_reload,
+        p_num_received_classes, p_num_received_procedures);
   }
   if (skip_reload) {
     ASSERT(modified_libs_->IsEmpty());
@@ -708,6 +711,18 @@
   // Disable the background compiler while we are performing the reload.
   BackgroundCompiler::Disable(I);
 
+  // Wait for any concurrent marking tasks to finish and turn off the
+  // concurrent marker during reload as we might be allocating new instances
+  // (constants) when loading the new kernel file and this could cause
+  // inconsistency between the saved class table and the new class table.
+  Heap* heap = thread->heap();
+  const bool old_concurrent_mark_flag =
+      heap->old_space()->enable_concurrent_mark();
+  if (old_concurrent_mark_flag) {
+    heap->WaitForMarkerTasks(thread);
+    heap->old_space()->set_enable_concurrent_mark(false);
+  }
+
   // Ensure all functions on the stack have unoptimized code.
   EnsuredUnoptimizedCodeForStack();
   // Deoptimize all code that had optimizing decisions that are dependent on
@@ -769,6 +784,9 @@
   // Re-enable the background compiler. Do this before propagating any errors.
   BackgroundCompiler::Enable(I);
 
+  // Reenable concurrent marking if it was initially on.
+  heap->old_space()->set_enable_concurrent_mark(old_concurrent_mark_flag);
+
   if (result.IsUnwindError()) {
     if (thread->top_exit_frame_info() == 0) {
       // We can only propagate errors when there are Dart frames on the stack.
@@ -811,7 +829,7 @@
   if (!old_cls.is_enum_class()) {
     new_cls.CopyCanonicalConstants(old_cls);
   }
-  new_cls.CopyCanonicalType(old_cls);
+  new_cls.CopyDeclarationType(old_cls);
   AddBecomeMapping(old_cls, new_cls);
   AddClassMapping(new_cls, old_cls);
 }
@@ -861,32 +879,35 @@
   jsobj.AddProperty("type", "ReloadReport");
   jsobj.AddProperty("success", reload_skipped_ || !HasReasonsForCancelling());
   {
-    JSONObject details(&jsobj, "details");
-    if (reload_skipped_) {
-      // Reload was skipped.
-      const GrowableObjectArray& libs =
-          GrowableObjectArray::Handle(object_store()->libraries());
-      const intptr_t final_library_count = libs.Length();
-      details.AddProperty("savedLibraryCount", final_library_count);
-      details.AddProperty("loadedLibraryCount", static_cast<intptr_t>(0));
-      details.AddProperty("finalLibraryCount", final_library_count);
-    } else if (HasReasonsForCancelling()) {
+    if (HasReasonsForCancelling()) {
       // Reload was rejected.
       JSONArray array(&jsobj, "notices");
       for (intptr_t i = 0; i < reasons_to_cancel_reload_.length(); i++) {
         ReasonForCancelling* reason = reasons_to_cancel_reload_.At(i);
         reason->AppendTo(&array);
       }
+      return;
+    }
+
+    JSONObject details(&jsobj, "details");
+    const GrowableObjectArray& libs =
+        GrowableObjectArray::Handle(object_store()->libraries());
+    const intptr_t final_library_count = libs.Length();
+    details.AddProperty("finalLibraryCount", final_library_count);
+    details.AddProperty("receivedLibraryCount", num_received_libs_);
+    details.AddProperty("receivedLibrariesBytes", bytes_received_libs_);
+    details.AddProperty("receivedClassesCount", num_received_classes_);
+    details.AddProperty("receivedProceduresCount", num_received_procedures_);
+    if (reload_skipped_) {
+      // Reload was skipped.
+      details.AddProperty("savedLibraryCount", final_library_count);
+      details.AddProperty("loadedLibraryCount", static_cast<intptr_t>(0));
     } else {
       // Reload was successful.
-      const GrowableObjectArray& libs =
-          GrowableObjectArray::Handle(object_store()->libraries());
-      const intptr_t final_library_count = libs.Length();
       const intptr_t loaded_library_count =
           final_library_count - num_saved_libs_;
       details.AddProperty("savedLibraryCount", num_saved_libs_);
       details.AddProperty("loadedLibraryCount", loaded_library_count);
-      details.AddProperty("finalLibraryCount", final_library_count);
       JSONArray array(&jsobj, "shapeChangeMappings");
       for (intptr_t i = 0; i < instance_morphers_.length(); i++) {
         instance_morphers_.At(i)->AppendTo(&array);
@@ -904,12 +925,10 @@
   Function& func = Function::Handle();
   while (it.HasNextFrame()) {
     StackFrame* frame = it.NextFrame();
-    if (frame->IsDartFrame()) {
+    if (frame->IsDartFrame() && !frame->is_interpreted()) {
       func = frame->LookupDartFunction();
       ASSERT(!func.IsNull());
-      if (!frame->is_interpreted()) {
-        func.EnsureHasCompiledUnoptimizedCode();
-      }
+      func.EnsureHasCompiledUnoptimizedCode();
     }
   }
 }
@@ -1337,13 +1356,6 @@
     return;
   }
 
-  // Don't report synthetic classes like the superclass of
-  // `class MA extends S with M {}` or `class MA = S with M'. The relevant
-  // changes with be reported as changes in M.
-  if (new_cls.IsMixinApplication() || new_cls.is_mixin_app_alias()) {
-    return;
-  }
-
   // Don't report `typedef bool Predicate(Object o)` as unused. There is nothing
   // to execute.
   if (new_cls.IsTypedefClass()) {
@@ -1843,22 +1855,28 @@
   Zone* zone = stack_zone.GetZone();
 
   Code& code = Code::Handle(zone);
+  Bytecode& bytecode = Bytecode::Handle(zone);
   Function& function = Function::Handle(zone);
   DartFrameIterator iterator(thread,
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
   while (frame != NULL) {
-    code = frame->LookupDartCode();
-    if (code.is_optimized()) {
-      // If this code is optimized, we need to reset the ICs in the
-      // corresponding unoptimized code, which will be executed when the stack
-      // unwinds to the optimized code.
-      function = code.function();
-      code = function.unoptimized_code();
-      ASSERT(!code.IsNull());
-      code.ResetICDatas(zone);
+    if (frame->is_interpreted()) {
+      bytecode = frame->LookupDartBytecode();
+      bytecode.ResetICDatas(zone);
     } else {
-      code.ResetICDatas(zone);
+      code = frame->LookupDartCode();
+      if (code.is_optimized()) {
+        // If this code is optimized, we need to reset the ICs in the
+        // corresponding unoptimized code, which will be executed when the stack
+        // unwinds to the optimized code.
+        function = code.function();
+        code = function.unoptimized_code();
+        ASSERT(!code.IsNull());
+        code.ResetICDatas(zone);
+      } else {
+        code.ResetICDatas(zone);
+      }
     }
     frame = iterator.NextFrame();
   }
@@ -1882,6 +1900,7 @@
         owning_class_(Class::Handle(zone)),
         owning_lib_(Library::Handle(zone)),
         code_(Code::Handle(zone)),
+        bytecode_(Bytecode::Handle(zone)),
         reload_context_(reload_context),
         zone_(zone) {}
 
@@ -1903,19 +1922,25 @@
       // Grab the current code.
       code_ = func.CurrentCode();
       ASSERT(!code_.IsNull());
+      bytecode_ = func.bytecode();
       const bool clear_code = IsFromDirtyLibrary(func);
       const bool stub_code = code_.IsStubCode();
 
       // Zero edge counters.
       func.ZeroEdgeCounters();
 
-      if (!stub_code) {
+      if (!stub_code || !bytecode_.IsNull()) {
         if (clear_code) {
-          VTIR_Print("Marking %s for recompilation, clearning code\n",
+          VTIR_Print("Marking %s for recompilation, clearing code\n",
                      func.ToCString());
           ClearAllCode(func);
         } else {
-          PreserveUnoptimizedCode();
+          if (!stub_code) {
+            PreserveUnoptimizedCode();
+          }
+          if (!bytecode_.IsNull()) {
+            PreserveBytecode();
+          }
         }
       }
 
@@ -1942,6 +1967,13 @@
     code_.ResetICDatas(zone_);
   }
 
+  void PreserveBytecode() {
+    ASSERT(!bytecode_.IsNull());
+    // We are preserving the bytecode, fill all ICData arrays with
+    // the sentinel values so that we have no stale type feedback.
+    bytecode_.ResetICDatas(zone_);
+  }
+
   bool IsFromDirtyLibrary(const Function& func) {
     owning_class_ = func.Owner();
     owning_lib_ = owning_class_.library();
@@ -1952,6 +1984,7 @@
   Class& owning_class_;
   Library& owning_lib_;
   Code& code_;
+  Bytecode& bytecode_;
   IsolateReloadContext* reload_context_;
   Zone* zone_;
 };
diff --git a/runtime/vm/isolate_reload.h b/runtime/vm/isolate_reload.h
index 082bc48..e8dbfe5 100644
--- a/runtime/vm/isolate_reload.h
+++ b/runtime/vm/isolate_reload.h
@@ -286,6 +286,10 @@
   intptr_t saved_num_cids_;
   ClassAndSize* saved_class_table_;
   intptr_t num_saved_libs_;
+  intptr_t num_received_libs_;
+  intptr_t bytes_received_libs_;
+  intptr_t num_received_classes_;
+  intptr_t num_received_procedures_;
 
   // Collect the necessary instance transformation for schema changes.
   ZoneGrowableArray<InstanceMorpher*> instance_morphers_;
diff --git a/runtime/vm/json_test.cc b/runtime/vm/json_test.cc
index b53d5f2..c42d2e6 100644
--- a/runtime/vm/json_test.cc
+++ b/runtime/vm/json_test.cc
@@ -161,7 +161,7 @@
   EXPECT_STREQ("{\"key\":\"2 hello\"}", js.ToCString());
 }
 
-TEST_CASE(JSON_JSONStream_DartObject) {
+ISOLATE_UNIT_TEST_CASE(JSON_JSONStream_DartObject) {
   JSONStream js;
   {
     JSONArray jsarr(&js);
@@ -216,7 +216,9 @@
   EXPECT_VALID(lib);
 
   Dart_Handle result;
+  TransitionNativeToVM transition1(thread);
   String& obj = String::Handle();
+  TransitionVMToNative transition2(thread);
 
   {
     result = Dart_GetField(lib, NewString("ascii"));
diff --git a/runtime/vm/json_writer.cc b/runtime/vm/json_writer.cc
index 7c3aa7f..c3760a8 100644
--- a/runtime/vm/json_writer.cc
+++ b/runtime/vm/json_writer.cc
@@ -298,6 +298,10 @@
   buffer_.AddChar(':');
 }
 
+void JSONWriter::PrintNewline() {
+  buffer_.AddChar('\n');
+}
+
 void JSONWriter::PrintCommaIfNeeded() {
   if (NeedComma()) {
     buffer_.AddChar(',');
diff --git a/runtime/vm/json_writer.h b/runtime/vm/json_writer.h
index b556869..c9d4375 100644
--- a/runtime/vm/json_writer.h
+++ b/runtime/vm/json_writer.h
@@ -74,6 +74,8 @@
 
   void PrintPropertyName(const char* name);
 
+  void PrintNewline();
+
   void AddEscapedUTF8String(const char* s);
   void AddEscapedUTF8String(const char* s, intptr_t len);
 
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 9fb8cfd..c5d5442 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -473,11 +473,7 @@
                                                is_annotations_offset);
 
   } else {
-    Thread* thread = Thread::Current();
-    Error& error = Error::Handle();
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
+    return Thread::Current()->StealStickyError();
   }
 }
 
@@ -584,17 +580,11 @@
 
     return builder.BuildParameterDescriptor(function.kernel_offset());
   } else {
-    Thread* thread = Thread::Current();
-    Error& error = Error::Handle();
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error.raw();
+    return Thread::Current()->StealStickyError();
   }
 }
 
 bool NeedsDynamicInvocationForwarder(const Function& function) {
-  ASSERT(FLAG_strong);
-
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
 
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index da74542..5440ddf 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -124,12 +124,14 @@
     return NULL;
   }
   kernel::Program* kernel_program = NULL;
+
+  const String& uri = String::Handle(String::New(script_uri));
+  const Object& ret = Object::Handle(thread->isolate()->CallTagHandler(
+      Dart_kKernelTag, Object::null_object(), uri));
+  Api::Scope api_scope(thread);
+  Dart_Handle retval = Api::NewHandle(thread, ret.raw());
   {
-    const String& uri = String::Handle(String::New(script_uri));
     TransitionVMToNative transition(thread);
-    Api::Scope api_scope(thread);
-    Dart_Handle retval = (thread->isolate()->library_tag_handler())(
-        Dart_kKernelTag, Api::Null(), Api::NewHandle(thread, uri.raw()));
     if (!Dart_IsError(retval)) {
       Dart_TypedData_Type data_type;
       uint8_t* data;
@@ -146,8 +148,8 @@
       memmove(kernel_buffer, data, kernel_buffer_size);
       Dart_TypedDataReleaseData(retval);
 
-      kernel_program =
-          kernel::Program::ReadFromBuffer(kernel_buffer, kernel_buffer_size);
+      kernel_program = kernel::Program::ReadFromBuffer(
+          kernel_buffer, kernel_buffer_size, error);
     } else if (error != nullptr) {
       *error = Dart_GetError(retval);
     }
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 2ffb315..4710aad 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -17,7 +17,7 @@
 // package:kernel/binary.md.
 
 static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
-static const uint32_t kBinaryFormatVersion = 12;
+static const uint32_t kBinaryFormatVersion = 16;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
@@ -72,6 +72,7 @@
   V(Rethrow, 47)                                                               \
   V(Throw, 48)                                                                 \
   V(ListLiteral, 49)                                                           \
+  V(SetLiteral, 109)                                                           \
   V(MapLiteral, 50)                                                            \
   V(AwaitExpression, 51)                                                       \
   V(FunctionExpression, 52)                                                    \
@@ -81,6 +82,7 @@
   V(NegativeIntLiteral, 56)                                                    \
   V(BigIntLiteral, 57)                                                         \
   V(ConstListLiteral, 58)                                                      \
+  V(ConstSetLiteral, 110)                                                      \
   V(ConstMapLiteral, 59)                                                       \
   V(ExpressionStatement, 61)                                                   \
   V(Block, 62)                                                                 \
@@ -145,6 +147,12 @@
   kPartialInstantiationConstant = 9,
   kTearOffConstant = 10,
   kTypeLiteralConstant = 11,
+  // These constants are not expected to be seen by the VM, because all
+  // constants are fully evaluated.
+  kEnvironmentBoolConstant = 12,
+  kEnvironmentIntConstant = 13,
+  kEnvironmentStringConstant = 14,
+  kUnevaluatedConstant = 15,
 };
 
 static const int SpecializedIntLiteralBias = 3;
@@ -238,6 +246,11 @@
     }
   }
 
+  intptr_t ReadSLEB128() {
+    const uint8_t* buffer = this->buffer();
+    return Utils::DecodeSLEB128(buffer, size_, &offset_);
+  }
+
   /**
    * Read and return a TokenPosition from this reader.
    */
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index c56df9b..693078c 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -9,6 +9,7 @@
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
+#include "vm/flags.h"
 #include "vm/isolate.h"
 #include "vm/lockers.h"
 #include "vm/message.h"
@@ -88,9 +89,7 @@
     // the app-jit training run (see //utils/kernel-service/BUILD.gn).
     Dart_IsolateFlags api_flags;
     Isolate::FlagsInitialize(&api_flags);
-    api_flags.enable_type_checks = false;
     api_flags.enable_asserts = false;
-    api_flags.enable_error_on_bad_type = false;
     api_flags.unsafe_trust_strong_mode_types = false;
 #if !defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_DBC)
     api_flags.use_field_guards = true;
@@ -160,7 +159,6 @@
         OS::PrintErr(DART_KERNEL_ISOLATE_NAME ": Error: %s\n",
                      error.ToErrorCString());
       }
-      TransitionVMToNative transition(T);
       Dart::RunShutdownCallback();
     }
 
@@ -298,6 +296,7 @@
 }
 
 Dart_Port KernelIsolate::WaitForKernelPort() {
+  VMTagScope tagScope(Thread::Current(), VMTag::kLoadWaitTagId);
   MonitorLocker ml(monitor_);
   while (initializing_ && (kernel_port_ == ILLEGAL_PORT)) {
     ml.Wait();
@@ -345,6 +344,17 @@
                                  Dart_WeakPersistentHandle handle,
                                  void* peer) {}
 
+MallocGrowableArray<char*>* KernelIsolate::experimental_flags_ =
+    new MallocGrowableArray<char*>();
+
+void KernelIsolate::AddExperimentalFlag(const char* value) {
+  experimental_flags_->Add(strdup(value));
+}
+
+DEFINE_OPTION_HANDLER(KernelIsolate::AddExperimentalFlag,
+                      enable_experiment,
+                      "Comma separated list of experimental features.");
+
 class KernelCompilationRequest : public ValueObject {
  public:
   KernelCompilationRequest()
@@ -375,7 +385,10 @@
       const Array& type_definitions,
       char const* library_uri,
       char const* klass,
-      bool is_static) {
+      bool is_static,
+      const MallocGrowableArray<char*>* experimental_flags) {
+    Thread* thread = Thread::Current();
+    TransitionNativeToVM transition(thread);
     Dart_CObject tag;
     tag.type = Dart_CObject_kInt32;
     tag.value.as_int32 = KernelIsolate::kCompileExpressionTag;
@@ -399,7 +412,7 @@
       definitions_array[i] = new Dart_CObject;
       definitions_array[i]->type = Dart_CObject_kString;
       definitions_array[i]->value.as_string = const_cast<char*>(
-          String::CheckedHandle(definitions.At(i)).ToCString());
+          String::CheckedHandle(thread->zone(), definitions.At(i)).ToCString());
     }
     definitions_object.value.as_array.values = definitions_array;
 
@@ -414,7 +427,8 @@
       type_definitions_array[i] = new Dart_CObject;
       type_definitions_array[i]->type = Dart_CObject_kString;
       type_definitions_array[i]->value.as_string = const_cast<char*>(
-          String::CheckedHandle(type_definitions.At(i)).ToCString());
+          String::CheckedHandle(thread->zone(), type_definitions.At(i))
+              .ToCString());
     }
     type_definitions_object.value.as_array.values = type_definitions_array;
 
@@ -442,12 +456,25 @@
     isolate_id.value.as_int64 =
         isolate != NULL ? static_cast<int64_t>(isolate->main_port()) : 0;
 
-    Dart_CObject message;
-    message.type = Dart_CObject_kArray;
     Dart_CObject suppress_warnings;
     suppress_warnings.type = Dart_CObject_kBool;
     suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
 
+    intptr_t num_experimental_flags = experimental_flags->length();
+    Dart_CObject** experimental_flags_array =
+        new Dart_CObject*[num_experimental_flags];
+    for (intptr_t i = 0; i < num_experimental_flags; ++i) {
+      experimental_flags_array[i] = new Dart_CObject;
+      experimental_flags_array[i]->type = Dart_CObject_kString;
+      experimental_flags_array[i]->value.as_string = (*experimental_flags)[i];
+    }
+    Dart_CObject experimental_flags_object;
+    experimental_flags_object.type = Dart_CObject_kArray;
+    experimental_flags_object.value.as_array.values = experimental_flags_array;
+    experimental_flags_object.value.as_array.length = num_experimental_flags;
+
+    Dart_CObject message;
+    message.type = Dart_CObject_kArray;
     Dart_CObject* message_arr[] = {&tag,
                                    &send_port,
                                    &isolate_id,
@@ -457,16 +484,23 @@
                                    &library_uri_object,
                                    &class_object,
                                    &is_static_object,
-                                   &suppress_warnings};
+                                   &suppress_warnings,
+                                   &experimental_flags_object};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
-    // Send the message.
-    Dart_PostCObject(kernel_port, &message);
 
-    // Wait for reply to arrive.
-    MonitorLocker ml(monitor_);
-    while (result_.status == Dart_KernelCompilationStatus_Unknown) {
-      ml.Wait();
+    {
+      TransitionVMToNative transition(thread);
+
+      // Send the message.
+      Dart_PostCObject(kernel_port, &message);
+
+      // Wait for reply to arrive.
+      VMTagScope tagScope(thread, VMTag::kLoadWaitTagId);
+      MonitorLocker ml(monitor_);
+      while (result_.status == Dart_KernelCompilationStatus_Unknown) {
+        ml.Wait();
+      }
     }
 
     for (intptr_t i = 0; i < num_definitions; ++i) {
@@ -479,6 +513,11 @@
     }
     delete[] type_definitions_array;
 
+    for (intptr_t i = 0; i < num_experimental_flags; ++i) {
+      delete experimental_flags_array[i];
+    }
+    delete[] experimental_flags_array;
+
     return result_;
   }
 
@@ -493,7 +532,8 @@
       bool incremental_compile,
       const char* package_config,
       const char* multiroot_filepaths,
-      const char* multiroot_scheme) {
+      const char* multiroot_scheme,
+      const MallocGrowableArray<char*>* experimental_flags) {
     // Build the [null, send_port, script_uri, platform_kernel,
     // incremental_compile, isolate_id, [files]] message for the Kernel isolate.
     // tag is used to specify which operation the frontend should perform.
@@ -539,7 +579,7 @@
 
     Dart_CObject dart_strong;
     dart_strong.type = Dart_CObject_kBool;
-    dart_strong.value.as_bool = FLAG_strong;
+    dart_strong.value.as_bool = true;
 
     // TODO(aam): Assert that isolate exists once we move CompileAndReadScript
     // compilation logic out of CreateIsolateAndSetupHelper and into
@@ -563,6 +603,19 @@
     suppress_warnings.type = Dart_CObject_kBool;
     suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
 
+    intptr_t num_experimental_flags = experimental_flags->length();
+    Dart_CObject** experimental_flags_array =
+        new Dart_CObject*[num_experimental_flags];
+    for (intptr_t i = 0; i < num_experimental_flags; ++i) {
+      experimental_flags_array[i] = new Dart_CObject;
+      experimental_flags_array[i]->type = Dart_CObject_kString;
+      experimental_flags_array[i]->value.as_string = (*experimental_flags)[i];
+    }
+    Dart_CObject experimental_flags_object;
+    experimental_flags_object.type = Dart_CObject_kArray;
+    experimental_flags_object.value.as_array.values = experimental_flags_array;
+    experimental_flags_object.value.as_array.length = num_experimental_flags;
+
     Dart_CObject bytecode;
     bytecode.type = Dart_CObject_kBool;
     // Interpreter is supported only on x64 and arm64.
@@ -618,6 +671,7 @@
                                    &isolate_id,
                                    &files,
                                    &suppress_warnings,
+                                   &experimental_flags_object,
                                    &bytecode,
                                    &package_config_uri,
                                    &multiroot_filepaths_object,
@@ -630,11 +684,17 @@
     ReleaseFilesPairs(files);
 
     // Wait for reply to arrive.
+    VMTagScope tagScope(Thread::Current(), VMTag::kLoadWaitTagId);
     MonitorLocker ml(monitor_);
     while (result_.status == Dart_KernelCompilationStatus_Unknown) {
       ml.Wait();
     }
 
+    for (intptr_t i = 0; i < num_experimental_flags; ++i) {
+      delete experimental_flags_array[i];
+    }
+    delete[] experimental_flags_array;
+
     return result_;
   }
 
@@ -766,11 +826,11 @@
   }
 
   KernelCompilationRequest request;
-  return request.SendAndWaitForResponse(kCompileTag, kernel_port, script_uri,
-                                        platform_kernel, platform_kernel_size,
-                                        source_file_count, source_files,
-                                        incremental_compile, package_config,
-                                        multiroot_filepaths, multiroot_scheme);
+  return request.SendAndWaitForResponse(
+      kCompileTag, kernel_port, script_uri, platform_kernel,
+      platform_kernel_size, source_file_count, source_files,
+      incremental_compile, package_config, multiroot_filepaths,
+      multiroot_scheme, experimental_flags_);
 }
 
 Dart_KernelCompilationResult KernelIsolate::ListDependencies() {
@@ -785,7 +845,7 @@
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(kListDependenciesTag, kernel_port, NULL,
                                         NULL, 0, 0, NULL, false, NULL, NULL,
-                                        NULL);
+                                        NULL, experimental_flags_);
 }
 
 Dart_KernelCompilationResult KernelIsolate::AcceptCompilation() {
@@ -801,7 +861,8 @@
 
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(kAcceptTag, kernel_port, NULL, NULL, 0,
-                                        0, NULL, true, NULL, NULL, NULL);
+                                        0, NULL, true, NULL, NULL, NULL,
+                                        experimental_flags_);
 }
 
 Dart_KernelCompilationResult KernelIsolate::CompileExpressionToKernel(
@@ -819,10 +880,11 @@
     return result;
   }
 
+  TransitionVMToNative transition(Thread::Current());
   KernelCompilationRequest request;
   return request.SendAndWaitForResponse(kernel_port, expression, definitions,
                                         type_definitions, library_url, klass,
-                                        is_static);
+                                        is_static, experimental_flags_);
 }
 
 Dart_KernelCompilationResult KernelIsolate::UpdateInMemorySources(
@@ -839,9 +901,9 @@
   }
 
   KernelCompilationRequest request;
-  return request.SendAndWaitForResponse(kUpdateSourcesTag, kernel_port, NULL,
-                                        NULL, 0, source_files_count,
-                                        source_files, true, NULL, NULL, NULL);
+  return request.SendAndWaitForResponse(
+      kUpdateSourcesTag, kernel_port, NULL, NULL, 0, source_files_count,
+      source_files, true, NULL, NULL, NULL, experimental_flags_);
 }
 
 void KernelIsolate::NotifyAboutIsolateShutdown(const Isolate* isolate) {
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index a271351..284177b 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -5,6 +5,8 @@
 #ifndef RUNTIME_VM_KERNEL_ISOLATE_H_
 #define RUNTIME_VM_KERNEL_ISOLATE_H_
 
+#include <vector>
+
 #include "include/dart_api.h"
 #include "include/dart_native_api.h"
 
@@ -65,6 +67,8 @@
 
   static void NotifyAboutIsolateShutdown(const Isolate* isolate);
 
+  static void AddExperimentalFlag(const char* value);
+
  protected:
   static Monitor* monitor_;
   static Dart_IsolateCreateCallback create_callback_;
@@ -82,6 +86,8 @@
     return create_callback_;
   }
 
+  static MallocGrowableArray<char*>* experimental_flags_;
+
   friend class Dart;
   friend class Isolate;
   friend class RunKernelTask;
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index c1c1adf..43a4dbe 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -225,7 +225,7 @@
   Library& library = Library::Handle(zone);
   // Create "fake programs" for each sub-program.
   intptr_t subprogram_count = subprogram_file_starts.length() - 1;
-  for (intptr_t i = 0; i < subprogram_count; ++i) {
+  for (intptr_t i = subprogram_count - 1; i >= 0; --i) {
     intptr_t subprogram_start = subprogram_file_starts.At(i);
     intptr_t subprogram_end = subprogram_file_starts.At(i + 1);
     reader.set_raw_buffer(program->kernel_data() + subprogram_start);
@@ -237,7 +237,7 @@
     Object& load_result = Object::Handle(loader.LoadProgram(false));
     if (load_result.IsError()) return load_result;
 
-    if (library.IsNull() && load_result.IsLibrary()) {
+    if (load_result.IsLibrary()) {
       library ^= load_result.raw();
     }
 
@@ -246,10 +246,7 @@
 
   if (process_pending_classes && !ClassFinalizer::ProcessPendingClasses()) {
     // Class finalization failed -> sticky error would be set.
-    Error& error = Error::Handle(zone);
-    error = thread->sticky_error();
-    thread->clear_sticky_error();
-    return error;
+    return Error::Handle(thread->StealStickyError());
   }
 
   return library;
@@ -321,6 +318,7 @@
   const ExternalTypedData& metadata_payloads = ExternalTypedData::Handle(
       Z, reader.ExternalDataFromTo(program_->metadata_payloads_offset(),
                                    program_->metadata_mappings_offset()));
+  ASSERT(Utils::IsAligned(metadata_payloads.DataAddr(0), kWordSize));
 
   // Create view of metadata mappings.
   const ExternalTypedData& metadata_mappings = ExternalTypedData::Handle(
@@ -347,6 +345,10 @@
     script = LoadScriptAt(index);
     scripts.SetAt(index, script);
   }
+
+  if (FLAG_enable_interpreter || FLAG_use_bytecode_compiler) {
+    bytecode_metadata_helper_.ReadBytecodeComponent();
+  }
 }
 
 KernelLoader::KernelLoader(const Script& script,
@@ -388,6 +390,9 @@
 }
 
 const Array& KernelLoader::ReadConstantTable() {
+  if (program_->library_count() == 0) {
+    return Array::empty_array();
+  }
   // We use the very first library's toplevel class as an owner for an
   // [ActiveClassScope]
   //
@@ -588,20 +593,12 @@
 
       if (uri_path.IsNull()) continue;
 
-      Dart_LibraryTagHandler handler = I->library_tag_handler();
-      if (handler == NULL) {
+      if (!I->HasTagHandler()) {
         H.ReportError("no library handler registered.");
       }
 
       I->BlockClassFinalization();
-      {
-        TransitionVMToNative transition(thread_);
-        Api::Scope api_scope(thread_);
-        Dart_Handle retval = handler(Dart_kImportExtensionTag,
-                                     Api::NewHandle(thread_, library.raw()),
-                                     Api::NewHandle(thread_, uri_path.raw()));
-        result = Api::UnwrapHandle(retval);
-      }
+      result = I->CallTagHandler(Dart_kImportExtensionTag, library, uri_path);
       I->UnblockClassFinalization();
 
       if (result.IsError()) {
@@ -633,9 +630,7 @@
     if (process_pending_classes) {
       if (!ClassFinalizer::ProcessPendingClasses()) {
         // Class finalization failed -> sticky error would be set.
-        RawError* error = H.thread()->sticky_error();
-        H.thread()->clear_sticky_error();
-        return error;
+        return H.thread()->StealStickyError();
       }
     }
 
@@ -666,9 +661,7 @@
 
   // Either class finalization failed or we caught a compile error.
   // In both cases sticky error would be set.
-  RawError* error = thread_->sticky_error();
-  thread_->clear_sticky_error();
-  return error;
+  return Thread::Current()->StealStickyError();
 }
 
 RawObject* KernelLoader::LoadExpressionEvaluationFunction(
@@ -718,7 +711,9 @@
                                          Isolate* isolate,
                                          BitVector* modified_libs,
                                          bool force_reload,
-                                         bool* is_empty_program) {
+                                         bool* is_empty_program,
+                                         intptr_t* p_num_classes,
+                                         intptr_t* p_num_procedures) {
   LongJumpScope jump;
   Zone* zone = Thread::Current()->zone();
   if (setjmp(*jump.Set()) == 0) {
@@ -738,40 +733,53 @@
       return;
     }
 
+    if (p_num_classes != nullptr) {
+      *p_num_classes = 0;
+    }
+    if (p_num_procedures != nullptr) {
+      *p_num_procedures = 0;
+    }
+
     // Now go through all the libraries that are present in the incremental
     // kernel files, these will constitute the modified libraries.
     *is_empty_program = true;
     if (program->is_single_program()) {
       KernelLoader loader(program);
-      return loader.walk_incremental_kernel(modified_libs, is_empty_program);
-    } else {
-      kernel::Reader reader(program->kernel_data(),
-                            program->kernel_data_size());
-      GrowableArray<intptr_t> subprogram_file_starts;
-      index_programs(&reader, &subprogram_file_starts);
+      loader.walk_incremental_kernel(modified_libs, is_empty_program,
+                                     p_num_classes, p_num_procedures);
+    }
+    kernel::Reader reader(program->kernel_data(), program->kernel_data_size());
+    GrowableArray<intptr_t> subprogram_file_starts;
+    index_programs(&reader, &subprogram_file_starts);
 
-      // Create "fake programs" for each sub-program.
-      intptr_t subprogram_count = subprogram_file_starts.length() - 1;
-      for (intptr_t i = 0; i < subprogram_count; ++i) {
-        intptr_t subprogram_start = subprogram_file_starts.At(i);
-        intptr_t subprogram_end = subprogram_file_starts.At(i + 1);
-        reader.set_raw_buffer(program->kernel_data() + subprogram_start);
-        reader.set_size(subprogram_end - subprogram_start);
-        reader.set_offset(0);
-        Program* subprogram = Program::ReadFrom(&reader);
-        ASSERT(subprogram->is_single_program());
-        KernelLoader loader(subprogram);
-        loader.walk_incremental_kernel(modified_libs, is_empty_program);
-        delete subprogram;
-      }
+    // Create "fake programs" for each sub-program.
+    intptr_t subprogram_count = subprogram_file_starts.length() - 1;
+    for (intptr_t i = 0; i < subprogram_count; ++i) {
+      intptr_t subprogram_start = subprogram_file_starts.At(i);
+      intptr_t subprogram_end = subprogram_file_starts.At(i + 1);
+      reader.set_raw_buffer(program->kernel_data() + subprogram_start);
+      reader.set_size(subprogram_end - subprogram_start);
+      reader.set_offset(0);
+      Program* subprogram = Program::ReadFrom(&reader);
+      ASSERT(subprogram->is_single_program());
+      KernelLoader loader(subprogram);
+      loader.walk_incremental_kernel(modified_libs, is_empty_program,
+                                     p_num_classes, p_num_procedures);
+      delete subprogram;
     }
   }
 }
 
 void KernelLoader::walk_incremental_kernel(BitVector* modified_libs,
-                                           bool* is_empty_program) {
+                                           bool* is_empty_program,
+                                           intptr_t* p_num_classes,
+                                           intptr_t* p_num_procedures) {
   intptr_t length = program_->library_count();
   *is_empty_program = *is_empty_program && (length == 0);
+  bool collect_library_stats =
+      p_num_classes != nullptr || p_num_procedures != nullptr;
+  intptr_t num_classes = 0;
+  intptr_t num_procedures = 0;
   Library& lib = Library::Handle(Z);
   for (intptr_t i = 0; i < length; i++) {
     intptr_t kernel_offset = library_offset(i);
@@ -783,6 +791,21 @@
       // This is a library that already exists so mark it as being modified.
       modified_libs->Add(lib.index());
     }
+    if (collect_library_stats) {
+      intptr_t library_end = library_offset(i + 1);
+      library_kernel_data_ =
+          helper_.reader_.ExternalDataFromTo(kernel_offset, library_end);
+
+      LibraryIndex library_index(library_kernel_data_);
+      num_classes += library_index.class_count();
+      num_procedures += library_index.procedure_count();
+    }
+  }
+  if (p_num_classes != nullptr) {
+    *p_num_classes += num_classes;
+  }
+  if (p_num_procedures != nullptr) {
+    *p_num_procedures += num_procedures;
   }
 }
 
@@ -960,9 +983,6 @@
       ReadVMAnnotations(annotation_count, &native_name_unused,
                         &is_potential_native_unused, &has_pragma_annotation);
     }
-    if (has_pragma_annotation) {
-      toplevel_class.set_has_pragma(true);
-    }
     field_helper.SetJustRead(FieldHelper::kAnnotations);
 
     field_helper.ReadUntilExcluding(FieldHelper::kType);
@@ -976,6 +996,7 @@
         Field::NewTopLevel(name, is_final, field_helper.IsConst(), script_class,
                            field_helper.position_, field_helper.end_position_));
     field.set_kernel_offset(field_offset);
+    field.set_has_pragma(has_pragma_annotation);
     const AbstractType& type = T.BuildType();  // read type.
     field.SetFieldType(type);
     ReadInferredType(field, field_offset + library_kernel_offset_);
@@ -1131,7 +1152,6 @@
   if (type_tag == kSomething) {
     AbstractType& super_type =
         T.BuildTypeWithoutFinalization();  // read super class type (part 2).
-    if (super_type.IsMalformed()) H.ReportError("Malformed super type");
     klass->set_super_type(super_type);
   }
 
@@ -1145,7 +1165,6 @@
   for (intptr_t i = 0; i < interface_count; i++) {
     const AbstractType& type =
         T.BuildTypeWithoutFinalization();  // read ith type.
-    if (type.IsMalformed()) H.ReportError("Malformed interface type.");
     interfaces.SetAt(i, type);
   }
   class_helper->SetJustRead(ClassHelper::kImplementedClasses);
@@ -1235,34 +1254,34 @@
 void KernelLoader::LoadClass(const Library& library,
                              const Class& toplevel_class,
                              intptr_t class_end,
-                             Class* klass) {
+                             Class* out_class) {
   intptr_t class_offset = helper_.ReaderOffset();
   ClassIndex class_index(program_->kernel_data(), program_->kernel_data_size(),
                          class_offset, class_end - class_offset);
 
   ClassHelper class_helper(&helper_);
   class_helper.ReadUntilIncluding(ClassHelper::kCanonicalName);
-  *klass = LookupClass(library, class_helper.canonical_name_);
-  klass->set_kernel_offset(class_offset - correction_offset_);
+  *out_class = LookupClass(library, class_helper.canonical_name_);
+  out_class->set_kernel_offset(class_offset - correction_offset_);
 
   // The class needs to have a script because all the functions in the class
   // will inherit it.  The predicate Function::IsOptimizable uses the absence of
   // a script to detect test functions that should not be optimized.
-  if (klass->script() == Script::null()) {
+  if (out_class->script() == Script::null()) {
     class_helper.ReadUntilIncluding(ClassHelper::kSourceUriIndex);
     const Script& script =
         Script::Handle(Z, ScriptAt(class_helper.source_uri_index_));
-    klass->set_script(script);
+    out_class->set_script(script);
     FixCoreLibraryScriptUri(library, script);
   }
-  if (klass->token_pos() == TokenPosition::kNoSource) {
+  if (out_class->token_pos() == TokenPosition::kNoSource) {
     class_helper.ReadUntilIncluding(ClassHelper::kStartPosition);
-    klass->set_token_pos(class_helper.start_position_);
+    out_class->set_token_pos(class_helper.start_position_);
   }
 
   class_helper.ReadUntilIncluding(ClassHelper::kFlags);
   if (class_helper.is_enum_class()) {
-    klass->set_is_enum_class();
+    out_class->set_is_enum_class();
   }
 
   class_helper.ReadUntilExcluding(ClassHelper::kAnnotations);
@@ -1275,26 +1294,25 @@
                       &is_potential_native_unused, &has_pragma_annotation);
   }
   if (has_pragma_annotation) {
-    klass->set_has_pragma(true);
+    out_class->set_has_pragma(true);
   }
   class_helper.SetJustRead(ClassHelper::kAnnotations);
   class_helper.ReadUntilExcluding(ClassHelper::kTypeParameters);
   intptr_t type_parameter_counts =
       helper_.ReadListLength();  // read type_parameters list length.
 
-  ActiveClassScope active_class_scope(&active_class_, klass);
-  if (!klass->is_cycle_free()) {
+  ActiveClassScope active_class_scope(&active_class_, out_class);
+  if (!out_class->is_cycle_free()) {
     LoadPreliminaryClass(&class_helper, type_parameter_counts);
   } else {
-    for (intptr_t i = 0; i < type_parameter_counts; ++i) {
-      helper_.SkipStringReference();  // read ith name index.
-      helper_.SkipDartType();         // read ith bound.
-    }
+    // do not use type parameters with cycle_free
+    ASSERT(type_parameter_counts == 0);
     class_helper.SetJustRead(ClassHelper::kTypeParameters);
   }
 
   if ((FLAG_enable_mirrors || has_pragma_annotation) && annotation_count > 0) {
-    library.AddClassMetadata(*klass, toplevel_class, TokenPosition::kNoSource,
+    library.AddClassMetadata(*out_class, toplevel_class,
+                             TokenPosition::kNoSource,
                              class_offset - correction_offset_);
   }
 
@@ -1305,7 +1323,7 @@
       library.raw() != expression_evaluation_library_.raw();
 
   if (loading_native_wrappers_library_ || !register_class) {
-    FinishClassLoading(*klass, library, toplevel_class, class_offset,
+    FinishClassLoading(*out_class, library, toplevel_class, class_offset,
                        class_index, &class_helper);
   }
 
@@ -1352,9 +1370,6 @@
         ReadVMAnnotations(annotation_count, &native_name_unused,
                           &is_potential_native_unused, &has_pragma_annotation);
       }
-      if (has_pragma_annotation) {
-        klass.set_has_pragma(true);
-      }
       field_helper.SetJustRead(FieldHelper::kAnnotations);
 
       field_helper.ReadUntilExcluding(FieldHelper::kType);
@@ -1374,6 +1389,7 @@
                      field_helper.IsConst(), is_reflectable, script_class, type,
                      field_helper.position_, field_helper.end_position_));
       field.set_kernel_offset(field_offset);
+      field.set_has_pragma(has_pragma_annotation);
       ReadInferredType(field, field_offset + library_kernel_offset_);
       CheckForInitializer(field);
       field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
@@ -1678,6 +1694,8 @@
                        script_class, procedure_helper.start_position_));
   function.set_has_pragma(has_pragma_annotation);
   function.set_end_token_pos(procedure_helper.end_position_);
+  function.set_is_no_such_method_forwarder(
+      procedure_helper.IsNoSuchMethodForwarder());
   if (register_function) {
     functions_.Add(&function);
   } else {
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index b8a99fd..e162a3a2 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -164,11 +164,17 @@
 
   // Finds all libraries that have been modified in this incremental
   // version of the kernel program file.
+  //
+  // When [force_reload] is false and if [p_num_classes], [p_num_procedures] are
+  // not nullptr, then they are populated with number of classes and top-level
+  // procedures in [program].
   static void FindModifiedLibraries(Program* program,
                                     Isolate* isolate,
                                     BitVector* modified_libs,
                                     bool force_reload,
-                                    bool* is_empty_kernel);
+                                    bool* is_empty_program,
+                                    intptr_t* p_num_classes,
+                                    intptr_t* p_num_procedures);
 
   RawLibrary* LoadLibrary(intptr_t index);
 
@@ -242,7 +248,9 @@
   static void index_programs(kernel::Reader* reader,
                              GrowableArray<intptr_t>* subprogram_file_starts);
   void walk_incremental_kernel(BitVector* modified_libs,
-                               bool* is_empty_program);
+                               bool* is_empty_program,
+                               intptr_t* p_num_classes,
+                               intptr_t* p_num_procedures);
 
   void LoadPreliminaryClass(ClassHelper* class_helper,
                             intptr_t type_parameter_count);
@@ -255,7 +263,7 @@
   void LoadClass(const Library& library,
                  const Class& toplevel_class,
                  intptr_t class_end,
-                 Class* klass);
+                 Class* out_class);
 
   void FinishClassLoading(const Class& klass,
                           const Library& library,
diff --git a/runtime/vm/log.h b/runtime/vm/log.h
index b644884..1c4a6d0 100644
--- a/runtime/vm/log.h
+++ b/runtime/vm/log.h
@@ -74,13 +74,13 @@
 // Can be nested.
 class LogBlock : public StackResource {
  public:
-  LogBlock(Thread* thread, Log* log)
+  LogBlock(ThreadState* thread, Log* log)
       : StackResource(thread), log_(log), cursor_(log->cursor()) {
     Initialize();
   }
 
   LogBlock()
-      : StackResource(Thread::Current()),
+      : StackResource(ThreadState::Current()),
         log_(Log::Current()),
         cursor_(Log::Current()->cursor()) {
     Initialize();
diff --git a/runtime/vm/longjump.cc b/runtime/vm/longjump.cc
index f5238c1..e56106c 100644
--- a/runtime/vm/longjump.cc
+++ b/runtime/vm/longjump.cc
@@ -9,7 +9,6 @@
 #include "vm/dart_api_impl.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
-#include "vm/object_store.h"
 #include "vm/os.h"
 
 namespace dart {
@@ -24,8 +23,10 @@
   // A zero is the default return value from setting up a LongJumpScope
   // using Set.
   ASSERT(value != 0);
+  ASSERT(!error.IsNull());
 
   Thread* thread = Thread::Current();
+  DEBUG_ASSERT(thread->TopErrorHandlerIsSetJump());
 
 #if defined(DEBUG)
 #define CHECK_REUSABLE_HANDLE(name)                                            \
diff --git a/runtime/vm/longjump.h b/runtime/vm/longjump.h
index bb6a79c..a334f15 100644
--- a/runtime/vm/longjump.h
+++ b/runtime/vm/longjump.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
@@ -8,7 +8,7 @@
 #include <setjmp.h>
 
 #include "vm/allocation.h"
-#include "vm/isolate.h"
+#include "vm/thread_state.h"
 
 namespace dart {
 
@@ -17,16 +17,19 @@
 class LongJumpScope : public StackResource {
  public:
   LongJumpScope()
-      : StackResource(Thread::Current()),
-        top_(NULL),
-        base_(Thread::Current()->long_jump_base()) {
-    Thread::Current()->set_long_jump_base(this);
+      : StackResource(ThreadState::Current()),
+        top_(nullptr),
+        base_(thread()->long_jump_base()) {
+    thread()->set_long_jump_base(this);
   }
 
-  ~LongJumpScope() { Thread::Current()->set_long_jump_base(base_); }
+  ~LongJumpScope() {
+    ASSERT(thread() == ThreadState::Current());
+    thread()->set_long_jump_base(base_);
+  }
 
   jmp_buf* Set();
-  void Jump(int value, const Error& error);
+  DART_NORETURN void Jump(int value, const Error& error);
 
  private:
   jmp_buf environment_;
diff --git a/runtime/vm/megamorphic_cache_table.cc b/runtime/vm/megamorphic_cache_table.cc
index 7d0c165..eba6c5f 100644
--- a/runtime/vm/megamorphic_cache_table.cc
+++ b/runtime/vm/megamorphic_cache_table.cc
@@ -52,8 +52,15 @@
 void MegamorphicCacheTable::InitMissHandler(Isolate* isolate) {
   // The miss handler for a class ID not found in the table is invoked as a
   // normal Dart function.
-  const Code& code = Code::Handle(StubCode::Generate(
-      "_stub_MegamorphicMiss", StubCode::GenerateMegamorphicMissStub));
+  ObjectPoolWrapper object_pool_wrapper;
+  const Code& code = Code::Handle(
+      StubCode::Generate("_stub_MegamorphicMiss", &object_pool_wrapper,
+                         StubCode::GenerateMegamorphicMissStub));
+
+  const auto& object_pool =
+      ObjectPool::Handle(object_pool_wrapper.MakeObjectPool());
+  code.set_object_pool(object_pool.raw());
+
   // When FLAG_lazy_dispatchers=false, this stub can be on the stack during
   // exceptions, but it has a corresponding function so IsStubCode is false and
   // it is considered in the search for an exception handler.
@@ -79,6 +86,21 @@
          Function::null());
   isolate->object_store()->SetMegamorphicMissHandler(code, function);
 }
+
+void MegamorphicCacheTable::ReInitMissHandlerCode(Isolate* isolate,
+                                                  ObjectPoolWrapper* wrapper) {
+  ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
+
+  const Code& code = Code::Handle(StubCode::Generate(
+      "_stub_MegamorphicMiss", wrapper, StubCode::GenerateMegamorphicMissStub));
+  code.set_exception_handlers(Object::empty_exception_handlers());
+
+  auto object_store = isolate->object_store();
+  auto& function = Function::Handle(object_store->megamorphic_miss_function());
+  function.AttachCode(code);
+  object_store->SetMegamorphicMissHandler(code, function);
+}
+
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 void MegamorphicCacheTable::PrintSizes(Isolate* isolate) {
diff --git a/runtime/vm/megamorphic_cache_table.h b/runtime/vm/megamorphic_cache_table.h
index cc813e8..8d7788a 100644
--- a/runtime/vm/megamorphic_cache_table.h
+++ b/runtime/vm/megamorphic_cache_table.h
@@ -13,6 +13,7 @@
 class Function;
 class Isolate;
 class ObjectPointerVisitor;
+class ObjectPoolWrapper;
 class RawArray;
 class RawFunction;
 class RawCode;
@@ -25,6 +26,15 @@
   static RawFunction* miss_handler(Isolate* isolate);
   NOT_IN_PRECOMPILED(static void InitMissHandler(Isolate* isolate));
 
+  // Re-initializes the megamorphic miss handler function in the object store.
+  //
+  // Normally we initialize the megamorphic miss handler during isolate startup.
+  // Though if we AOT compile with bare instructions support, we need to
+  // re-generate the handler to ensure it uses the common object pool.
+  NOT_IN_PRECOMPILED(
+      static void ReInitMissHandlerCode(Isolate* isolate,
+                                        ObjectPoolWrapper* wrapper));
+
   static RawMegamorphicCache* Lookup(Isolate* isolate,
                                      const String& name,
                                      const Array& descriptor);
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 00a2ff3..c1ae538 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -76,7 +76,6 @@
 }
 
 MessageHandler::~MessageHandler() {
-  IdleNotifier::Remove(this);
   delete queue_;
   delete oob_queue_;
   queue_ = NULL;
@@ -171,19 +170,6 @@
   MessageNotify(saved_priority);
 }
 
-void MessageHandler::EnsureTaskForIdleCheck() {
-  MonitorLocker ml(&monitor_);
-  if ((pool_ != NULL) && (task_ == NULL)) {
-    task_ = new MessageHandlerTask(this);
-    bool task_running = pool_->Run(task_);
-    if (!task_running) {
-      OS::PrintErr("Failed to start idle wakeup\n");
-      delete task_;
-      task_ = NULL;
-    }
-  }
-}
-
 Message* MessageHandler::DequeueMessage(Message::Priority min_priority) {
   // TODO(turnidge): Add assert that monitor_ is held here.
   Message* message = oob_queue_->Dequeue();
@@ -361,6 +347,11 @@
   return !oob_queue_->IsEmpty();
 }
 
+bool MessageHandler::HasMessages() {
+  MonitorLocker ml(&monitor_);
+  return !queue_->IsEmpty();
+}
+
 void MessageHandler::TaskCallback() {
   ASSERT(Isolate::Current() == NULL);
   MessageStatus status = kOK;
@@ -426,8 +417,8 @@
           status = HandleMessages(&ml, (status == kOK), true);
         }
 
-        if (status == kOK) {
-          handle_messages = CheckAndRunIdleLocked(&ml);
+        if (status == kOK && HasLivePorts()) {
+          handle_messages = CheckIfIdleLocked(&ml);
         }
       }
     }
@@ -501,22 +492,35 @@
   }
 }
 
-bool MessageHandler::CheckAndRunIdleLocked(MonitorLocker* ml) {
+bool MessageHandler::CheckIfIdleLocked(MonitorLocker* ml) {
   if ((isolate() == NULL) || (idle_start_time_ == 0) ||
       (FLAG_idle_timeout_micros == 0)) {
+    // No idle task to schedule.
     return false;
   }
-
   const int64_t now = OS::GetCurrentMonotonicMicros();
   const int64_t idle_expirary = idle_start_time_ + FLAG_idle_timeout_micros;
   if (idle_expirary > now) {
-    IdleNotifier::Update(this, idle_expirary);
-    // No new messages.
-    return false;
+    // We wait here for the scheduled idle time to expire or
+    // new messages or OOB messages to arrive.
+    paused_for_messages_ = true;
+    ml->WaitMicros(idle_expirary - now);
+    paused_for_messages_ = false;
+    // We want to loop back in order to handle the new messages
+    // or run the idle task.
+    return true;
   }
+  // The idle task can be scheduled immediately.
+  RunIdleTaskLocked(ml);
+  // We may have received new messages while running idle task, so return
+  // true so that the handle messages loop is run again.
+  return true;
+}
 
+void MessageHandler::RunIdleTaskLocked(MonitorLocker* ml) {
   // We've been without a message long enough to hope we can do some
   // cleanup before the next message arrives.
+  const int64_t now = OS::GetCurrentMonotonicMicros();
   const int64_t deadline = now + FLAG_idle_duration_micros;
   // Idle tasks may take a while: don't block other isolates sending
   // us messages.
@@ -524,11 +528,9 @@
   {
     StartIsolateScope start_isolate(isolate());
     isolate()->NotifyIdle(deadline);
-    idle_start_time_ = 0;
   }
   ml->Enter();
-  // We may have received new messages while the monitor was released.
-  return true;
+  idle_start_time_ = 0;
 }
 
 void MessageHandler::ClosePort(Dart_Port port) {
@@ -666,124 +668,4 @@
   handler_->oob_message_handling_allowed_ = true;
 }
 
-Monitor* IdleNotifier::monitor_ = NULL;
-bool IdleNotifier::task_running_ = false;
-IdleNotifier::Timer* IdleNotifier::queue_ = NULL;
-
-void IdleNotifier::Init() {
-  ASSERT(monitor_ == NULL);
-  monitor_ = new Monitor();
-}
-
-void IdleNotifier::Stop() {
-  Timer* timer;
-
-  {
-    MonitorLocker ml(monitor_);
-    timer = queue_;
-    queue_ = NULL;
-    ml.Notify();
-    while (task_running_) {
-      ml.Wait();
-    }
-  }
-
-  while (timer != NULL) {
-    Timer* next = timer->next;
-    delete timer;
-    timer = next;
-  }
-}
-
-void IdleNotifier::Cleanup() {
-  ASSERT(queue_ == NULL);
-  ASSERT(!task_running_);
-  ASSERT(monitor_ != NULL);
-  delete monitor_;
-  monitor_ = NULL;
-}
-
-class IdleNotifier::Task : public ThreadPool::Task {
- private:
-  void Run() {
-    MonitorLocker ml(monitor_);
-    while (queue_ != NULL) {
-      Timer* timer = queue_;
-      const int64_t now = OS::GetCurrentMonotonicMicros();
-      if (now >= timer->expirary) {
-        MessageHandler* handler = timer->handler;
-        queue_ = timer->next;
-        delete timer;
-        // A handler may try to update its expirary while we try to start its
-        // task for idle notification.
-        ml.Exit();
-        handler->EnsureTaskForIdleCheck();
-        ml.Enter();
-      } else {
-        ml.WaitMicros(timer->expirary - now);
-      }
-    }
-    task_running_ = false;
-    ml.Notify();
-  }
-};
-
-void IdleNotifier::Update(MessageHandler* handler, int64_t expirary) {
-  MonitorLocker ml(monitor_);
-
-  Timer* prev = NULL;
-  Timer* timer = queue_;
-  while (timer != NULL) {
-    if (timer->handler == handler) {
-      if (prev == NULL) {
-        queue_ = timer->next;
-      } else {
-        prev->next = timer->next;
-      }
-      if (expirary == 0) {
-        delete timer;
-      } else {
-        timer->expirary = expirary;
-      }
-      break;
-    } else {
-      prev = timer;
-      timer = timer->next;
-    }
-  }
-
-  if (expirary != 0) {
-    Timer* insert_timer = timer;
-    if (insert_timer == NULL) {
-      insert_timer = new Timer;
-      insert_timer->handler = handler;
-      insert_timer->expirary = expirary;
-    }
-
-    prev = NULL;
-    timer = queue_;
-    while ((timer != NULL) && (timer->expirary < insert_timer->expirary)) {
-      prev = timer;
-      timer = timer->next;
-    }
-    if (prev == NULL) {
-      queue_ = insert_timer;
-    } else {
-      prev->next = insert_timer;
-    }
-    insert_timer->next = timer;
-  }
-
-  if (task_running_) {
-    ml.Notify();
-  } else if ((queue_ != NULL) && (expirary != 0)) {
-    Task* task = new Task();
-    task_running_ = Dart::thread_pool()->Run(task);
-    if (!task_running_) {
-      OS::PrintErr("Failed to start idle ticker\n");
-      delete task;
-    }
-  }
-}
-
 }  // namespace dart
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index 1ce64ad..46dd862 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -50,10 +50,6 @@
            EndCallback end_callback,
            CallbackData data);
 
-  // Starts a task for the message handler if it runs on the thread pool and a
-  // task is not already running.
-  void EnsureTaskForIdleCheck();
-
   // Handles the next message for this message handler.  Should only
   // be used when not running the handler on the thread pool (via Run
   // or RunBlocking).
@@ -75,6 +71,10 @@
   // handler.
   bool HasOOBMessages();
 
+  // Returns true if there are pending normal messages for this message
+  // handler.
+  bool HasMessages();
+
   // A message handler tracks how many live ports it has.
   bool HasLivePorts() const { return live_ports_ > 0; }
 
@@ -211,9 +211,16 @@
   // Called by MessageHandlerTask to process our task queue.
   void TaskCallback();
 
-  // Returns true if the monitor was exited and there may be new OOB messages
-  // to process.
-  bool CheckAndRunIdleLocked(MonitorLocker* ml);
+  // Checks if we have a slot for idle task execution, if we have a slot
+  // for idle task execution it is scheduled immediately or we wait for
+  // idle expiration and then attempt to schedule the idle task.
+  // Returns true if their is scope for idle task execution so that we
+  // can loop back to handle more messages or false if idle tasks are not
+  // scheduled.
+  bool CheckIfIdleLocked(MonitorLocker* ml);
+
+  // Triggers a run of the idle task.
+  void RunIdleTaskLocked(MonitorLocker* ml);
 
   // NOTE: These two functions release and reacquire the monitor, you may
   // need to call HandleMessages to ensure all pending messages are handled.
@@ -258,28 +265,6 @@
   DISALLOW_COPY_AND_ASSIGN(MessageHandler);
 };
 
-class IdleNotifier : public AllStatic {
- public:
-  static void Init();
-  static void Stop();
-  static void Cleanup();
-  static void Update(MessageHandler* handler, int64_t expirary);
-  static void Remove(MessageHandler* handler) { Update(handler, 0); }
-
- private:
-  class Task;
-
-  struct Timer {
-    MessageHandler* handler;
-    int64_t expirary;
-    Timer* next;
-  };
-
-  static Monitor* monitor_;
-  static bool task_running_;
-  static Timer* queue_;
-};
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_MESSAGE_HANDLER_H_
diff --git a/runtime/vm/metrics_test.cc b/runtime/vm/metrics_test.cc
index 8ca4151..6ca6726 100644
--- a/runtime/vm/metrics_test.cc
+++ b/runtime/vm/metrics_test.cc
@@ -48,6 +48,7 @@
   TestCase::CreateTestIsolate();
   {
     Thread* thread = Thread::Current();
+    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     MyMetric metric;
diff --git a/runtime/vm/mixin_test.cc b/runtime/vm/mixin_test.cc
index a99aad8..e359730 100644
--- a/runtime/vm/mixin_test.cc
+++ b/runtime/vm/mixin_test.cc
@@ -84,19 +84,7 @@
   Dart_Handle lib = TestCase::LoadTestScriptWithDFE(
       sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
       /* resolver= */ NULL, /* finalize= */ true, /* incrementally= */ true);
-  if (FLAG_strong) {
-    EXPECT_ERROR(lib, "Error: Superclass has no method named '_bar'.");
-  } else {
-    EXPECT_VALID(lib);
-    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-    const char* result_str = NULL;
-    EXPECT(Dart_IsString(result));
-    EXPECT_VALID(Dart_StringToCString(result, &result_str));
-    EXPECT_STREQ(
-        "NoSuchMethodError: Super class of class 'D' has no instance method "
-        "'_bar'.",
-        result_str);
-  }
+  EXPECT_ERROR(lib, "Error: Superclass has no method named '_bar'.");
 }
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index 5c6e00a..6f12a68 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.cc
@@ -17,16 +17,16 @@
 
 // --- Message sending/receiving from native code ---
 
-class IsolateSaver {
+class IsolateLeaveScope {
  public:
-  explicit IsolateSaver(Isolate* current_isolate)
+  explicit IsolateLeaveScope(Isolate* current_isolate)
       : saved_isolate_(current_isolate) {
     if (current_isolate != NULL) {
       ASSERT(current_isolate == Isolate::Current());
       Dart_ExitIsolate();
     }
   }
-  ~IsolateSaver() {
+  ~IsolateLeaveScope() {
     if (saved_isolate_ != NULL) {
       Dart_Isolate I = reinterpret_cast<Dart_Isolate>(saved_isolate_);
       Dart_EnterIsolate(I);
@@ -36,7 +36,7 @@
  private:
   Isolate* saved_isolate_;
 
-  DISALLOW_COPY_AND_ASSIGN(IsolateSaver);
+  DISALLOW_COPY_AND_ASSIGN(IsolateLeaveScope);
 };
 
 static bool PostCObjectHelper(Dart_Port port_id, Dart_CObject* message) {
@@ -79,7 +79,7 @@
     return ILLEGAL_PORT;
   }
   // Start the native port without a current isolate.
-  IsolateSaver saver(Isolate::Current());
+  IsolateLeaveScope saver(Isolate::Current());
 
   NativeMessageHandler* nmh = new NativeMessageHandler(name, handler);
   Dart_Port port_id = PortMap::CreatePort(nmh);
@@ -90,7 +90,7 @@
 
 DART_EXPORT bool Dart_CloseNativePort(Dart_Port native_port_id) {
   // Close the native port without a current isolate.
-  IsolateSaver saver(Isolate::Current());
+  IsolateLeaveScope saver(Isolate::Current());
 
   // TODO(turnidge): Check that the port is native before trying to close.
   return PortMap::ClosePort(native_port_id);
@@ -105,7 +105,7 @@
                                             char** error) {
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate == nullptr || !isolate->is_service_isolate());
-  IsolateSaver saver(isolate);
+  IsolateLeaveScope saver(isolate);
 
   // We only allow one isolate reload at a time.  If this turns out to be on the
   // critical path, we can change it to have a global datastructure which is
diff --git a/runtime/vm/native_arguments.h b/runtime/vm/native_arguments.h
index 5b06627..251740e 100644
--- a/runtime/vm/native_arguments.h
+++ b/runtime/vm/native_arguments.h
@@ -13,8 +13,6 @@
 
 namespace dart {
 
-DECLARE_FLAG(bool, trace_natives);
-
 // Forward declarations.
 class BootstrapNatives;
 class Object;
@@ -41,7 +39,7 @@
 #define CHECK_STACK_ALIGNMENT                                                  \
   {                                                                            \
     uword (*func)() = reinterpret_cast<uword (*)()>(                           \
-        StubCode::GetCStackPointer_entry()->EntryPoint());                     \
+        StubCode::GetCStackPointer().EntryPoint());                            \
     uword current_sp = func();                                                 \
     ASSERT(Utils::IsAligned(current_sp, OS::ActivationFrameAlignment()));      \
   }
@@ -133,11 +131,33 @@
     return ArgAt(actual_index);
   }
 
-  RawTypeArguments* NativeTypeArgs() {
+  RawTypeArguments* NativeTypeArgs() const {
     ASSERT(ToGenericFunction());
     return TypeArguments::RawCast(ArgAt(0));
   }
 
+  int NativeTypeArgCount() const {
+    if (ToGenericFunction()) {
+      TypeArguments& type_args = TypeArguments::Handle(NativeTypeArgs());
+      if (type_args.IsNull()) {
+        // null vector represents infinite list of dynamics
+        return INT_MAX;
+      }
+      return type_args.Length();
+    }
+    return 0;
+  }
+
+  RawAbstractType* NativeTypeArgAt(int index) const {
+    ASSERT((index >= 0) && (index < NativeTypeArgCount()));
+    TypeArguments& type_args = TypeArguments::Handle(NativeTypeArgs());
+    if (type_args.IsNull()) {
+      // null vector represents infinite list of dynamics
+      return Type::dynamic_type().raw();
+    }
+    return TypeArguments::Handle(NativeTypeArgs()).TypeAt(index);
+  }
+
   void SetReturn(const Object& value) const { *retval_ = value.raw(); }
 
   RawObject* ReturnValue() const {
@@ -182,7 +202,7 @@
     if (function.IsClosureFunction()) {
       function_bits |= kClosureFunctionBit;
     }
-    if (function.IsGeneric() && FLAG_reify_generic_functions) {
+    if (function.IsGeneric()) {
       function_bits |= kGenericFunctionBit;
       argc++;
     }
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index ee23b12..ff77ded 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -20,11 +20,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool,
-            trace_natives,
-            false,
-            "Trace invocation of natives (debug mode only)");
-
 void DartNativeThrowArgumentException(const Instance& instance) {
   const Array& __args__ = Array::Handle(Array::New(1));
   __args__.SetAt(0, instance);
@@ -44,12 +39,14 @@
   Dart_NativeFunction native_function = NULL;
   {
     Thread* T = Thread::Current();
-    TransitionVMToNative transition(T);
-    Dart_EnterScope();  // Enter a new Dart API scope as we invoke API entries.
-    Dart_NativeEntryResolver resolver = library.native_entry_resolver();
-    native_function = resolver(Api::NewHandle(T, function_name.raw()),
-                               number_of_arguments, auto_setup_scope);
-    Dart_ExitScope();  // Exit the Dart API scope.
+    Api::Scope api_scope(T);
+    Dart_Handle api_function_name = Api::NewHandle(T, function_name.raw());
+    {
+      TransitionVMToNative transition(T);
+      Dart_NativeEntryResolver resolver = library.native_entry_resolver();
+      native_function =
+          resolver(api_function_name, number_of_arguments, auto_setup_scope);
+    }
   }
   return reinterpret_cast<NativeFunction>(native_function);
 }
@@ -180,34 +177,16 @@
     Isolate* isolate = thread->isolate();
     ApiState* state = isolate->api_state();
     ASSERT(state != NULL);
-    ApiLocalScope* current_top_scope = thread->api_top_scope();
-    ApiLocalScope* scope = thread->api_reusable_scope();
     TRACE_NATIVE_CALL("0x%" Px "", reinterpret_cast<uintptr_t>(func));
-    TransitionGeneratedToNative transition(thread);
-    if (scope == NULL) {
-      scope =
-          new ApiLocalScope(current_top_scope, thread->top_exit_frame_info());
-      ASSERT(scope != NULL);
-    } else {
-      scope->Reinit(thread, current_top_scope, thread->top_exit_frame_info());
-      thread->set_api_reusable_scope(NULL);
+    thread->EnterApiScope();
+    {
+      TransitionGeneratedToNative transition(thread);
+      func(args);
+      if (ReturnValueIsError(arguments)) {
+        PropagateErrors(arguments);
+      }
     }
-    thread->set_api_top_scope(scope);  // New scope is now the top scope.
-
-    func(args);
-    if (ReturnValueIsError(arguments)) {
-      PropagateErrors(arguments);
-    }
-
-    ASSERT(current_top_scope == scope->previous());
-    thread->set_api_top_scope(current_top_scope);  // Reset top scope to prev.
-    if (thread->api_reusable_scope() == NULL) {
-      scope->Reset(thread);  // Reset the old scope which we just exited.
-      thread->set_api_reusable_scope(scope);
-    } else {
-      ASSERT(thread->api_reusable_scope() != scope);
-      delete scope;
-    }
+    thread->ExitApiScope();
     DEOPTIMIZE_ALOT;
   }
   ASSERT(thread->execution_state() == Thread::kThreadInGenerated);
@@ -268,8 +247,16 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* caller_frame = iterator.NextFrame();
 
-    const Code& code = Code::Handle(zone, caller_frame->LookupDartCode());
-    const Function& func = Function::Handle(zone, code.function());
+    Code& code = Code::Handle(zone);
+    Bytecode& bytecode = Bytecode::Handle(zone);
+    Function& func = Function::Handle(zone);
+    if (caller_frame->is_interpreted()) {
+      bytecode = caller_frame->LookupDartBytecode();
+      func = bytecode.function();
+    } else {
+      code = caller_frame->LookupDartCode();
+      func = code.function();
+    }
 
     if (FLAG_trace_natives) {
       THR_Print("Resolving native target for %s\n", func.ToCString());
@@ -286,7 +273,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
       ASSERT(FLAG_enable_interpreter);
       NativeFunctionWrapper current_trampoline = KBCPatcher::GetNativeCallAt(
-          caller_frame->pc(), code, &current_function);
+          caller_frame->pc(), bytecode, &current_function);
       ASSERT(current_function ==
              reinterpret_cast<NativeFunction>(LinkNativeCall));
       ASSERT(current_trampoline == &BootstrapNativeCallWrapper ||
@@ -309,8 +296,7 @@
               reinterpret_cast<uword>(LinkNativeCall),
               Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments)));
 #endif
-      ASSERT(current_trampoline.raw() ==
-             StubCode::CallBootstrapNative_entry()->code());
+      ASSERT(current_trampoline.raw() == StubCode::CallBootstrapNative().raw());
     }
 #endif
 
@@ -338,7 +324,7 @@
       } else {
         trampoline = &NoScopeNativeCallWrapper;
       }
-      KBCPatcher::PatchNativeCallAt(caller_frame->pc(), code,
+      KBCPatcher::PatchNativeCallAt(caller_frame->pc(), bytecode,
                                     patch_target_function, trampoline);
 #else
       UNREACHABLE();
@@ -346,7 +332,7 @@
     } else {
       Code& trampoline = Code::Handle(zone);
       if (is_bootstrap_native) {
-        trampoline = StubCode::CallBootstrapNative_entry()->code();
+        trampoline = StubCode::CallBootstrapNative().raw();
 #if defined(USING_SIMULATOR)
         patch_target_function = reinterpret_cast<NativeFunction>(
             Simulator::RedirectExternalReference(
@@ -354,9 +340,9 @@
                 Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments));
 #endif  // defined USING_SIMULATOR
       } else if (is_auto_scope) {
-        trampoline = StubCode::CallAutoScopeNative_entry()->code();
+        trampoline = StubCode::CallAutoScopeNative().raw();
       } else {
-        trampoline = StubCode::CallNoScopeNative_entry()->code();
+        trampoline = StubCode::CallNoScopeNative().raw();
       }
       CodePatcher::PatchNativeCallAt(caller_frame->pc(), code,
                                      patch_target_function, trampoline);
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index c0abf55..b98e2f4 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -39,7 +39,7 @@
 typedef void (*NativeFunctionWrapper)(Dart_NativeArguments args,
                                       Dart_NativeFunction func);
 
-#ifndef PRODUCT
+#ifdef DEBUG
 #define TRACE_NATIVE_CALL(format, name)                                        \
   if (FLAG_trace_natives) {                                                    \
     THR_Print("Calling native: " format "\n", name);                           \
@@ -61,7 +61,7 @@
 #define SET_NATIVE_RETVAL(arguments, value) arguments->SetReturnUnsafe(value);
 #endif
 
-#define DEFINE_NATIVE_ENTRY(name, argument_count)                              \
+#define DEFINE_NATIVE_ENTRY(name, type_argument_count, argument_count)         \
   static RawObject* DN_Helper##name(Isolate* isolate, Thread* thread,          \
                                     Zone* zone, NativeArguments* arguments);   \
   void NATIVE_ENTRY_FUNCTION(name)(Dart_NativeArguments args) {                \
@@ -71,6 +71,8 @@
     /* Tell MemorySanitizer 'arguments' is initialized by generated code. */   \
     MSAN_UNPOISON(arguments, sizeof(*arguments));                              \
     ASSERT(arguments->NativeArgCount() == argument_count);                     \
+    /* Note: a longer type arguments vector may be passed */                   \
+    ASSERT(arguments->NativeTypeArgCount() >= type_argument_count);            \
     TRACE_NATIVE_CALL("%s", "" #name);                                         \
     {                                                                          \
       Thread* thread = arguments->thread();                                    \
diff --git a/runtime/vm/native_symbol_android.cc b/runtime/vm/native_symbol_android.cc
index 8ed1999..43df38d 100644
--- a/runtime/vm/native_symbol_android.cc
+++ b/runtime/vm/native_symbol_android.cc
@@ -10,21 +10,6 @@
 #include <cxxabi.h>  // NOLINT
 #include <dlfcn.h>   // NOLINT
 
-// Even though it's not used in a PRODUCT build, __cxa_demangle() still ends up
-// in the resulting binary for Android. Blowing it away by redefining it like
-// so saves >90KB of binary size.
-#if defined(PRODUCT)
-extern "C" char* __cxa_demangle(const char* mangled_name,
-                                char* buf,
-                                size_t* n,
-                                int* status) {
-  if (status) {
-    *status = -1;
-  }
-  return NULL;
-}
-#endif
-
 namespace dart {
 
 void NativeSymbolResolver::Init() {}
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 2e524cc..18b69c3 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -13,6 +13,7 @@
 #include "vm/compiler/aot/precompiler.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/assembler/disassembler.h"
+#include "vm/compiler/assembler/disassembler_kbc.h"
 #include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/compiler/frontend/kernel_fingerprints.h"
 #include "vm/compiler/frontend/kernel_translation_helper.h"
@@ -82,6 +83,7 @@
 DECLARE_FLAG(bool, trace_deoptimization_verbose);
 DECLARE_FLAG(bool, trace_reload);
 DECLARE_FLAG(bool, write_protect_code);
+DECLARE_FLAG(bool, precompiled_mode);
 
 static const char* const kGetterPrefix = "get:";
 static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix);
@@ -111,8 +113,6 @@
 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::unresolved_class_class_ =
-    reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
@@ -127,6 +127,7 @@
 RawClass* Object::kernel_program_info_class_ =
     reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+RawClass* Object::bytecode_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::object_pool_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
@@ -555,9 +556,6 @@
   }
 
   // Allocate the remaining VM internal classes.
-  cls = Class::New<UnresolvedClass>();
-  unresolved_class_class_ = cls.raw();
-
   cls = Class::New<TypeArguments>();
   type_arguments_class_ = cls.raw();
 
@@ -594,6 +592,9 @@
   cls = Class::New<Code>();
   code_class_ = cls.raw();
 
+  cls = Class::New<Bytecode>();
+  bytecode_class_ = cls.raw();
+
   cls = Class::New<Instructions>();
   instructions_class_ = cls.raw();
 
@@ -869,7 +870,7 @@
   // initialized until now.
   Thread* thr = Thread::Current();
   ASSERT(thr != NULL);
-  thr->clear_sticky_error();
+  thr->ClearStickyError();
   thr->clear_pending_functions();
 
   ASSERT(!null_object_->IsSmi());
@@ -942,7 +943,6 @@
   class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-  unresolved_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
@@ -955,6 +955,7 @@
   namespace_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   kernel_program_info_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   code_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
+  bytecode_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   object_pool_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
   pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
@@ -1041,7 +1042,6 @@
   SET_CLASS_NAME(class, Class);
   SET_CLASS_NAME(dynamic, Dynamic);
   SET_CLASS_NAME(void, Void);
-  SET_CLASS_NAME(unresolved_class, UnresolvedClass);
   SET_CLASS_NAME(type_arguments, TypeArguments);
   SET_CLASS_NAME(patch_class, PatchClass);
   SET_CLASS_NAME(function, Function);
@@ -1054,6 +1054,7 @@
   SET_CLASS_NAME(namespace, Namespace);
   SET_CLASS_NAME(kernel_program_info, KernelProgramInfo);
   SET_CLASS_NAME(code, Code);
+  SET_CLASS_NAME(bytecode, Bytecode);
   SET_CLASS_NAME(instructions, Instructions);
   SET_CLASS_NAME(object_pool, ObjectPool);
   SET_CLASS_NAME(code_source_map, CodeSourceMap);
@@ -1343,7 +1344,7 @@
         GrowableObjectArray::type_arguments_offset());
     cls.set_num_type_arguments(1);
 
-    // Initialize hash set for canonical_type_.
+    // Initialize hash set for canonical types.
     const intptr_t kInitialCanonicalTypeSize = 16;
     array = HashTables::New<CanonicalTypeSet>(kInitialCanonicalTypeSize,
                                               Heap::kOld);
@@ -1360,10 +1361,6 @@
     const Class& type_ref_cls = Class::Handle(zone, Class::New<TypeRef>());
     const Class& type_parameter_cls =
         Class::Handle(zone, Class::New<TypeParameter>());
-    const Class& bounded_type_cls =
-        Class::Handle(zone, Class::New<BoundedType>());
-    const Class& mixin_app_type_cls =
-        Class::Handle(zone, Class::New<MixinAppType>());
     const Class& library_prefix_cls =
         Class::Handle(zone, Class::New<LibraryPrefix>());
 
@@ -1406,7 +1403,7 @@
     // declared number of type parameters is still 0. It will become 1 after
     // patching. The array type allocated below represents the raw type _List
     // and not _List<E> as we could expect. Use with caution.
-    type ^= Type::New(Object::Handle(zone, cls.raw()),
+    type ^= Type::New(Class::Handle(zone, cls.raw()),
                       TypeArguments::Handle(zone), TokenPosition::kNoSource);
     type.SetIsFinalized();
     type ^= type.Canonicalize();
@@ -1523,13 +1520,6 @@
                          core_lib);
     pending_classes.Add(type_parameter_cls);
 
-    RegisterPrivateClass(bounded_type_cls, Symbols::_BoundedType(), core_lib);
-    pending_classes.Add(bounded_type_cls);
-
-    RegisterPrivateClass(mixin_app_type_cls, Symbols::_MixinAppType(),
-                         core_lib);
-    pending_classes.Add(mixin_app_type_cls);
-
     cls = Class::New<Integer>();
     object_store->set_integer_implementation_class(cls);
     RegisterPrivateClass(cls, Symbols::_IntegerImplementation(), core_lib);
@@ -1739,15 +1729,6 @@
     object_store->set_int_type(type);
 
     cls = Class::New<Instance>(kIllegalCid);
-    RegisterPrivateClass(cls, Symbols::Int64(), core_lib);
-    cls.set_num_type_arguments(0);
-    cls.set_num_own_type_arguments(0);
-    cls.set_is_prefinalized();
-    pending_classes.Add(cls);
-    type = Type::NewNonParameterizedType(cls);
-    object_store->set_int64_type(type);
-
-    cls = Class::New<Instance>(kIllegalCid);
     RegisterClass(cls, Symbols::Double(), core_lib);
     cls.set_num_type_arguments(0);
     cls.set_num_own_type_arguments(0);
@@ -1797,33 +1778,33 @@
     type_args = TypeArguments::New(1);
     type = object_store->int_type();
     type_args.SetTypeAt(0, type);
-    type_args.Canonicalize();
+    type_args = type_args.Canonicalize();
     object_store->set_type_argument_int(type_args);
 
     type_args = TypeArguments::New(1);
     type = object_store->double_type();
     type_args.SetTypeAt(0, type);
-    type_args.Canonicalize();
+    type_args = type_args.Canonicalize();
     object_store->set_type_argument_double(type_args);
 
     type_args = TypeArguments::New(1);
     type = object_store->string_type();
     type_args.SetTypeAt(0, type);
-    type_args.Canonicalize();
+    type_args = type_args.Canonicalize();
     object_store->set_type_argument_string(type_args);
 
     type_args = TypeArguments::New(2);
     type = object_store->string_type();
     type_args.SetTypeAt(0, type);
     type_args.SetTypeAt(1, Object::dynamic_type());
-    type_args.Canonicalize();
+    type_args = type_args.Canonicalize();
     object_store->set_type_argument_string_dynamic(type_args);
 
     type_args = TypeArguments::New(2);
     type = object_store->string_type();
     type_args.SetTypeAt(0, type);
     type_args.SetTypeAt(1, type);
-    type_args.Canonicalize();
+    type_args = type_args.Canonicalize();
     object_store->set_type_argument_string_string(type_args);
 
     // Finish the initialization by compiling the bootstrap scripts containing
@@ -1874,8 +1855,6 @@
     cls = Class::New<Type>();
     cls = Class::New<TypeRef>();
     cls = Class::New<TypeParameter>();
-    cls = Class::New<BoundedType>();
-    cls = Class::New<MixinAppType>();
 
     cls = Class::New<Array>();
     object_store->set_array_class(cls);
@@ -2100,10 +2079,19 @@
   }
 
   void VisitPointers(RawObject** from, RawObject** to) {
-    for (RawObject** slot = from; slot <= to; ++slot) {
-      RawObject* value = *slot;
-      if (value->IsHeapObject()) {
-        old_obj_->CheckHeapPointerStore(value, thread_);
+    if (old_obj_->IsArray()) {
+      for (RawObject** slot = from; slot <= to; ++slot) {
+        RawObject* value = *slot;
+        if (value->IsHeapObject()) {
+          old_obj_->CheckHeapPointerStore(value, thread_);
+        }
+      }
+    } else {
+      for (RawObject** slot = from; slot <= to; ++slot) {
+        RawObject* value = *slot;
+        if (value->IsHeapObject()) {
+          old_obj_->CheckArrayPointerStore(slot, value, thread_);
+        }
       }
     }
   }
@@ -2135,6 +2123,7 @@
   memmove(reinterpret_cast<uint8_t*>(clone_addr + kHeaderSizeInBytes),
           reinterpret_cast<uint8_t*>(orig_addr + kHeaderSizeInBytes),
           size - kHeaderSizeInBytes);
+
   // Add clone to store buffer, if needed.
   if (!raw_clone->IsOldObject()) {
     // No need to remember an object in new space.
@@ -2172,13 +2161,6 @@
   return ClassFinalizer::FinalizeType(*this, type);
 }
 
-RawAbstractType* Class::DeclarationType() const {
-  const TypeArguments& args = TypeArguments::Handle(type_parameters());
-  const Type& type =
-      Type::Handle(Type::New(*this, args, TokenPosition::kNoSource));
-  return ClassFinalizer::FinalizeType(*this, type);
-}
-
 template <class FakeObject>
 RawClass* Class::New() {
   ASSERT(Object::class_class() != Class::null());
@@ -2514,9 +2496,6 @@
 }
 
 intptr_t Class::NumTypeParameters(Thread* thread) const {
-  if (IsMixinApplication() && !is_mixin_type_applied()) {
-    ClassFinalizer::ApplyMixinType(*this);
-  }
   if (type_parameters() == TypeArguments::null()) {
     const intptr_t cid = id();
     if ((cid == kArrayCid) || (cid == kImmutableArrayCid) ||
@@ -2545,7 +2524,6 @@
     set_num_own_type_arguments(num_type_params);
     return num_type_params;
   }
-  ASSERT(!IsMixinApplication() || is_mixin_type_applied());
   const AbstractType& sup_type = AbstractType::Handle(zone, super_type());
   const TypeArguments& sup_type_args =
       TypeArguments::Handle(zone, sup_type.arguments());
@@ -2561,7 +2539,6 @@
   // The value of num_sup_type_args may increase when the super type is
   // finalized, but the last num_sup_type_args type arguments will not be
   // modified by finalization, only shifted to higher indices in the vector.
-  // They may however get wrapped in a BoundedType, which we skip.
   // The super type may not even be resolved yet. This is not necessary, since
   // we only check for matching type parameters, which are resolved by default.
   const TypeArguments& type_params =
@@ -2585,11 +2562,6 @@
       type_param ^= type_params.TypeAt(i);
       sup_type_arg = sup_type_args.TypeAt(num_sup_type_args -
                                           num_overlapping_type_args + i);
-      // BoundedType can nest in case the finalized super type has bounded type
-      // arguments that overlap multiple times in its own super class chain.
-      while (sup_type_arg.IsBoundedType()) {
-        sup_type_arg = BoundedType::Cast(sup_type_arg).type();
-      }
       if (!type_param.Equals(sup_type_arg)) break;
     }
     if (i == num_overlapping_type_args) {
@@ -2610,7 +2582,6 @@
   }
   // To work properly, this call requires the super class of this class to be
   // resolved, which is checked by the type_class() call on the super type.
-  // Note that calling type_class() on a MixinAppType fails.
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -2619,8 +2590,6 @@
   cls = raw();
   intptr_t num_type_args = 0;
   do {
-    // Calling NumOwnTypeArguments() on a mixin application class will setup the
-    // type parameters if not already done.
     num_type_args += cls.NumOwnTypeArguments();
     // Super type of Object class is null.
     if ((cls.super_type() == AbstractType::null()) ||
@@ -2628,10 +2597,9 @@
       break;
     }
     sup_type = cls.super_type();
-    // A BoundedType, TypeRef, or function type can appear as type argument of
+    // A TypeRef or function type can appear as type argument of
     // sup_type, but not as sup_type itself.
     ASSERT(sup_type.IsType());
-    ClassFinalizer::ResolveTypeClass(cls, Type::Cast(sup_type));
     cls = sup_type.type_class();
     ASSERT(!cls.IsTypedefClass());
   } while (true);
@@ -2660,8 +2628,7 @@
 }
 
 void Class::set_super_type(const AbstractType& value) const {
-  ASSERT(value.IsNull() || (value.IsType() && !value.IsDynamicType()) ||
-         value.IsMixinAppType());
+  ASSERT(value.IsNull() || (value.IsType() && !value.IsDynamicType()));
   StorePointer(&raw_ptr()->super_type_, value.raw());
 }
 
@@ -2736,32 +2703,30 @@
   set_next_field_offset(offset);
 }
 
-struct InvocationDispatcherCacheLayout {
-  enum { kNameIndex = 0, kArgsDescIndex, kFunctionIndex, kEntrySize };
-};
-
 void Class::AddInvocationDispatcher(const String& target_name,
                                     const Array& args_desc,
                                     const Function& dispatcher) const {
-  // Search for a free entry.
-  Array& cache = Array::Handle(invocation_dispatcher_cache());
+  auto& cache = Array::Handle(invocation_dispatcher_cache());
+  InvocationDispatcherTable dispatchers(cache);
   intptr_t i = 0;
-  while (i < cache.Length() && cache.At(i) != Object::null()) {
-    i += InvocationDispatcherCacheLayout::kEntrySize;
+  for (auto dispatcher : dispatchers) {
+    if (dispatcher.Get<kInvocationDispatcherName>() == String::null()) {
+      break;
+    }
+    i++;
   }
-
-  if (i == cache.Length()) {
-    // Allocate new larger cache.
-    intptr_t new_len =
-        (cache.Length() == 0)
-            ? static_cast<intptr_t>(InvocationDispatcherCacheLayout::kEntrySize)
+  if (i == dispatchers.Length()) {
+    const intptr_t new_len =
+        cache.Length() == 0
+            ? static_cast<intptr_t>(Class::kInvocationDispatcherEntrySize)
             : cache.Length() * 2;
     cache ^= Array::Grow(cache, new_len);
     set_invocation_dispatcher_cache(cache);
   }
-  cache.SetAt(i + InvocationDispatcherCacheLayout::kNameIndex, target_name);
-  cache.SetAt(i + InvocationDispatcherCacheLayout::kArgsDescIndex, args_desc);
-  cache.SetAt(i + InvocationDispatcherCacheLayout::kFunctionIndex, dispatcher);
+  auto entry = dispatchers[i];
+  entry.Set<Class::kInvocationDispatcherName>(target_name);
+  entry.Set<Class::kInvocationDispatcherArgsDesc>(args_desc);
+  entry.Set<Class::kInvocationDispatcherFunction>(dispatcher);
 }
 
 RawFunction* Class::GetInvocationDispatcher(const String& target_name,
@@ -2771,31 +2736,31 @@
   ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
          kind == RawFunction::kInvokeFieldDispatcher ||
          kind == RawFunction::kDynamicInvocationForwarder);
-  Function& dispatcher = Function::Handle();
-  Array& cache = Array::Handle(invocation_dispatcher_cache());
+  auto Z = Thread::Current()->zone();
+  auto& function = Function::Handle(Z);
+  auto& name = String::Handle(Z);
+  auto& desc = Array::Handle(Z);
+  auto& cache = Array::Handle(Z, invocation_dispatcher_cache());
   ASSERT(!cache.IsNull());
-  String& name = String::Handle();
-  Array& desc = Array::Handle();
-  intptr_t i = 0;
-  for (; i < cache.Length(); i += InvocationDispatcherCacheLayout::kEntrySize) {
-    name ^= cache.At(i + InvocationDispatcherCacheLayout::kNameIndex);
+
+  InvocationDispatcherTable dispatchers(cache);
+  for (auto dispatcher : dispatchers) {
+    name = dispatcher.Get<Class::kInvocationDispatcherName>();
     if (name.IsNull()) break;  // Reached last entry.
     if (!name.Equals(target_name)) continue;
-    desc ^= cache.At(i + InvocationDispatcherCacheLayout::kArgsDescIndex);
+    desc = dispatcher.Get<Class::kInvocationDispatcherArgsDesc>();
     if (desc.raw() != args_desc.raw()) continue;
-    dispatcher ^= cache.At(i + InvocationDispatcherCacheLayout::kFunctionIndex);
-    if (dispatcher.kind() == kind) {
-      // Found match.
-      ASSERT(dispatcher.IsFunction());
-      break;
+    function = dispatcher.Get<Class::kInvocationDispatcherFunction>();
+    if (function.kind() == kind) {
+      break;  // Found match.
     }
   }
 
-  if (dispatcher.IsNull() && create_if_absent) {
-    dispatcher ^= CreateInvocationDispatcher(target_name, args_desc, kind);
-    AddInvocationDispatcher(target_name, args_desc, dispatcher);
+  if (function.IsNull() && create_if_absent) {
+    function = CreateInvocationDispatcher(target_name, args_desc, kind);
+    AddInvocationDispatcher(target_name, args_desc, function);
   }
-  return dispatcher.raw();
+  return function.raw();
 }
 
 RawFunction* Class::CreateInvocationDispatcher(const String& target_name,
@@ -2913,27 +2878,49 @@
   return result.raw();
 }
 
-bool Function::FindPragma(Isolate* I,
-                          const String& pragma_name,
-                          Object* options) const {
-  if (!has_pragma()) return false;
+bool Library::FindPragma(Thread* T,
+                         const Object& obj,
+                         const String& pragma_name,
+                         Object* options) const {
+  auto I = T->isolate();
+  auto Z = T->zone();
+  auto& lib = Library::Handle(Z);
+  if (obj.IsClass()) {
+    auto& klass = Class::Cast(obj);
+    if (!klass.has_pragma()) return false;
+    lib = klass.library();
+  } else if (obj.IsFunction()) {
+    auto& function = Function::Cast(obj);
+    if (!function.has_pragma()) return false;
+    lib = Class::Handle(Z, function.Owner()).library();
+  } else if (obj.IsField()) {
+    auto& field = Field::Cast(obj);
+    if (!field.has_pragma()) return false;
+    lib = Class::Handle(Z, field.Owner()).library();
+  } else {
+    UNREACHABLE();
+  }
 
-  auto& klass = Class::Handle(Owner());
-  auto& lib = Library::Handle(klass.library());
+  Object& metadata_obj = Object::Handle(Z, lib.GetMetadata(obj));
+  if (metadata_obj.IsUnwindError()) {
+    Report::LongJump(UnwindError::Cast(metadata_obj));
+  }
 
-  auto& pragma_class =
-      Class::Handle(Isolate::Current()->object_store()->pragma_class());
+  // If there is a compile-time error while evaluating the metadata, we will
+  // simply claim there was no @pramga annotation.
+  if (metadata_obj.IsNull() || metadata_obj.IsLanguageError()) {
+    return false;
+  }
+  ASSERT(metadata_obj.IsArray());
+
+  auto& metadata = Array::Cast(metadata_obj);
+  auto& pragma_class = Class::Handle(Z, I->object_store()->pragma_class());
   auto& pragma_name_field =
-      Field::Handle(pragma_class.LookupField(Symbols::name()));
+      Field::Handle(Z, pragma_class.LookupField(Symbols::name()));
   auto& pragma_options_field =
-      Field::Handle(pragma_class.LookupField(Symbols::options()));
+      Field::Handle(Z, pragma_class.LookupField(Symbols::options()));
 
-  Array& metadata = Array::Handle();
-  metadata ^= lib.GetMetadata(Function::Handle(raw()));
-
-  if (metadata.IsNull()) return false;
-
-  auto& pragma = Object::Handle();
+  auto& pragma = Object::Handle(Z);
   for (intptr_t i = 0; i < metadata.Length(); ++i) {
     pragma = metadata.At(i);
     if (pragma.clazz() != pragma_class.raw() ||
@@ -3026,31 +3013,17 @@
 bool AbstractType::InstantiateAndTestSubtype(
     AbstractType* subtype,
     AbstractType* supertype,
-    Error* bound_error,
     const TypeArguments& instantiator_type_args,
     const TypeArguments& function_type_args) {
   if (!subtype->IsInstantiated()) {
-    *subtype =
-        subtype->InstantiateFrom(instantiator_type_args, function_type_args,
-                                 kAllFree, bound_error, NULL, NULL, Heap::kOld);
-  }
-  if (!bound_error->IsNull()) {
-    return false;
+    *subtype = subtype->InstantiateFrom(
+        instantiator_type_args, function_type_args, kAllFree, NULL, Heap::kOld);
   }
   if (!supertype->IsInstantiated()) {
     *supertype = supertype->InstantiateFrom(
-        instantiator_type_args, function_type_args, kAllFree, bound_error, NULL,
-        NULL, Heap::kOld);
+        instantiator_type_args, function_type_args, kAllFree, NULL, Heap::kOld);
   }
-  if (!bound_error->IsNull()) {
-    return false;
-  }
-  bool is_subtype_of =
-      subtype->IsSubtypeOf(*supertype, bound_error, NULL, Heap::kOld);
-  if (!bound_error->IsNull()) {
-    return false;
-  }
-  return is_subtype_of;
+  return subtype->IsSubtypeOf(*supertype, Heap::kOld);
 }
 
 RawArray* Class::invocation_dispatcher_cache() const {
@@ -3171,189 +3144,10 @@
 #endif
 }
 
-bool Class::ValidatePostFinalizePatch(const Class& orig_class,
-                                      Error* error) const {
-  ASSERT(error != NULL);
-  // Not allowed to add new fields in a post finalization patch.
-  if (fields() != Object::empty_array().raw()) {
-    *error = LanguageError::NewFormatted(
-        *error,  // No previous error.
-        Script::Handle(script()), token_pos(), Report::AtLocation,
-        Report::kError, Heap::kNew,
-        "new fields are not allowed for this patch");
-    return false;
-  }
-  // There seem to be no functions, the patch is pointless.
-  if (functions() == Object::empty_array().raw()) {
-    *error = LanguageError::NewFormatted(*error,  // No previous error.
-                                         Script::Handle(script()), token_pos(),
-                                         Report::AtLocation, Report::kError,
-                                         Heap::kNew, "no functions to patch");
-    return false;
-  }
-  // Iterate over all functions that will be patched and make sure
-  // the original function was declared 'external' and has not executed
-  // so far i.e no code has been generated for it.
-  Thread* thread = Thread::Current();
-  ASSERT(thread->IsMutatorThread());
-  Zone* zone = thread->zone();
-  const Array& funcs = Array::Handle(zone, functions());
-  Function& func = Function::Handle(zone);
-  Function& orig_func = Function::Handle(zone);
-  String& name = String::Handle(zone);
-  for (intptr_t i = 0; i < funcs.Length(); i++) {
-    func ^= funcs.At(i);
-    name ^= func.name();
-    orig_func ^= orig_class.LookupFunctionAllowPrivate(name);
-    if (!orig_func.IsNull()) {
-      if (!orig_func.is_external() || orig_func.HasCode()) {
-        // We can only patch external functions in a post finalized class.
-        *error = LanguageError::NewFormatted(
-            *error,  // No previous error.
-            Script::Handle(script()), token_pos(), Report::AtLocation,
-            Report::kError, Heap::kNew,
-            !orig_func.is_external()
-                ? "'%s' is not external and therefore cannot be patched"
-                : "'%s' has already executed and therefore cannot be patched",
-            name.ToCString());
-        return false;
-      }
-    } else if (!Library::IsPrivate(name)) {
-      // We can only have new private functions that are added.
-      *error = LanguageError::NewFormatted(
-          *error,  // No previous error.
-          Script::Handle(script()), token_pos(), Report::AtLocation,
-          Report::kError, Heap::kNew,
-          "'%s' is not private and therefore cannot be patched",
-          name.ToCString());
-      return false;
-    }
-  }
-  return true;
-}
-
 void Class::set_dependent_code(const Array& array) const {
   StorePointer(&raw_ptr()->dependent_code_, array.raw());
 }
 
-// Apply the members from the patch class to the original class.
-bool Class::ApplyPatch(const Class& patch, Error* error) const {
-  ASSERT(error != NULL);
-  ASSERT(!is_finalized());
-  // Shared handles used during the iteration.
-  String& member_name = String::Handle();
-
-  const PatchClass& patch_class = PatchClass::Handle(
-      PatchClass::New(*this, Script::Handle(patch.script())));
-
-  Array& orig_list = Array::Handle(functions());
-  intptr_t orig_len = orig_list.Length();
-  Array& patch_list = Array::Handle(patch.functions());
-  intptr_t patch_len = patch_list.Length();
-
-  Function& func = Function::Handle();
-  Function& orig_func = Function::Handle();
-  // Lookup the original implicit constructor, if any.
-  member_name = Name();
-  member_name = String::Concat(member_name, Symbols::Dot());
-  Function& orig_implicit_ctor = Function::Handle(LookupFunction(member_name));
-  if (!orig_implicit_ctor.IsNull() &&
-      !orig_implicit_ctor.IsImplicitConstructor()) {
-    // Not an implicit constructor, but a user declared one.
-    orig_implicit_ctor = Function::null();
-  }
-  const GrowableObjectArray& new_functions =
-      GrowableObjectArray::Handle(GrowableObjectArray::New(orig_len));
-  for (intptr_t i = 0; i < orig_len; i++) {
-    orig_func ^= orig_list.At(i);
-    member_name ^= orig_func.name();
-    func = patch.LookupFunction(member_name);
-    if (func.IsNull()) {
-      // Non-patched function is preserved, all patched functions are added in
-      // the loop below.
-      // However, an implicitly created constructor should not be preserved if
-      // the patch provides a constructor or a factory. Wait for now.
-      if (orig_func.raw() != orig_implicit_ctor.raw()) {
-        new_functions.Add(orig_func);
-      }
-    } else if (func.UserVisibleSignature() !=
-               orig_func.UserVisibleSignature()) {
-      // Compare user visible signatures to ignore different implicit parameters
-      // when patching a constructor with a factory.
-      *error = LanguageError::NewFormatted(
-          *error,  // No previous error.
-          Script::Handle(patch.script()), func.token_pos(), Report::AtLocation,
-          Report::kError, Heap::kNew, "signature mismatch: '%s'",
-          member_name.ToCString());
-      return false;
-    }
-  }
-  for (intptr_t i = 0; i < patch_len; i++) {
-    func ^= patch_list.At(i);
-    if (func.IsGenerativeConstructor() || func.IsFactory()) {
-      // Do not preserve the original implicit constructor, if any.
-      orig_implicit_ctor = Function::null();
-    }
-    func.set_owner(patch_class);
-    new_functions.Add(func);
-  }
-  if (!orig_implicit_ctor.IsNull()) {
-    // Preserve the original implicit constructor.
-    new_functions.Add(orig_implicit_ctor);
-  }
-  Array& new_list = Array::Handle(Array::MakeFixedLength(new_functions));
-  SetFunctions(new_list);
-
-  // Merge the two list of fields. Raise an error when duplicates are found or
-  // when a public field is being added.
-  orig_list = fields();
-  orig_len = orig_list.Length();
-  patch_list = patch.fields();
-  patch_len = patch_list.Length();
-
-  Field& field = Field::Handle();
-  Field& orig_field = Field::Handle();
-  new_list = Array::New(patch_len + orig_len);
-  for (intptr_t i = 0; i < patch_len; i++) {
-    field ^= patch_list.At(i);
-    field.set_owner(patch_class);
-    member_name = field.name();
-    // TODO(iposva): Verify non-public fields only.
-
-    // Verify no duplicate additions.
-    orig_field ^= LookupField(member_name);
-    if (!orig_field.IsNull()) {
-      *error = LanguageError::NewFormatted(
-          *error,  // No previous error.
-          Script::Handle(patch.script()), field.token_pos(), Report::AtLocation,
-          Report::kError, Heap::kNew, "duplicate field: %s",
-          member_name.ToCString());
-      return false;
-    }
-    new_list.SetAt(i, field);
-  }
-  for (intptr_t i = 0; i < orig_len; i++) {
-    field ^= orig_list.At(i);
-    new_list.SetAt(patch_len + i, field);
-  }
-  SetFields(new_list);
-
-  // The functions and fields in the patch class are no longer needed.
-  // The patch class itself is also no longer needed.
-  patch.SetFunctions(Object::empty_array());
-  patch.SetFields(Object::empty_array());
-  Library::Handle(patch.library()).RemovePatchClass(patch);
-  return true;
-}
-
-RawFunction* Function::EvaluateHelper(const Class& cls,
-                                      const String& expr,
-                                      const Array& param_names,
-                                      bool is_static) {
-  UNREACHABLE();
-  return Function::null();
-}
-
 // Conventions:
 // * For throwing a NSM in a class klass we use its runtime type as receiver,
 //   i.e., klass.RareType().
@@ -3385,6 +3179,25 @@
   return DartEntry::InvokeFunction(throwNew, args);
 }
 
+static RawObject* ThrowTypeError(const TokenPosition token_pos,
+                                 const Instance& src_value,
+                                 const AbstractType& dst_type,
+                                 const String& dst_name) {
+  const Array& args = Array::Handle(Array::New(4));
+  const Smi& pos = Smi::Handle(Smi::New(token_pos.value()));
+  args.SetAt(0, pos);
+  args.SetAt(1, src_value);
+  args.SetAt(2, dst_type);
+  args.SetAt(3, dst_name);
+
+  const Library& libcore = Library::Handle(Library::CoreLibrary());
+  const Class& TypeError =
+      Class::Handle(libcore.LookupClassAllowPrivate(Symbols::TypeError()));
+  const Function& throwNew = Function::Handle(
+      TypeError.LookupFunctionAllowPrivate(Symbols::ThrowNew()));
+  return DartEntry::InvokeFunction(throwNew, args);
+}
+
 RawObject* Class::InvokeGetter(const String& getter_name,
                                bool throw_nsm_if_absent,
                                bool respect_reflectable) const {
@@ -3449,21 +3262,31 @@
   const String& internal_setter_name =
       String::Handle(zone, Field::SetterName(setter_name));
 
+  AbstractType& parameter_type = AbstractType::Handle(zone);
+  AbstractType& argument_type =
+      AbstractType::Handle(zone, value.GetType(Heap::kOld));
+
   if (field.IsNull()) {
     const Function& setter =
         Function::Handle(zone, LookupStaticFunction(internal_setter_name));
-
     const int kNumArgs = 1;
     const Array& args = Array::Handle(zone, Array::New(kNumArgs));
     args.SetAt(0, value);
-
     if (setter.IsNull() || (respect_reflectable && !setter.is_reflectable())) {
       return ThrowNoSuchMethod(AbstractType::Handle(zone, RareType()),
                                internal_setter_name, args, Object::null_array(),
                                InvocationMirror::kStatic,
                                InvocationMirror::kSetter);
     }
-
+    parameter_type ^= setter.ParameterTypeAt(0);
+    if (!argument_type.IsNullType() && !parameter_type.IsDynamicType() &&
+        !value.IsInstanceOf(parameter_type, Object::null_type_arguments(),
+                            Object::null_type_arguments())) {
+      const String& argument_name =
+          String::Handle(zone, setter.ParameterNameAt(0));
+      return ThrowTypeError(setter.token_pos(), value, parameter_type,
+                            argument_name);
+    }
     // Invoke the setter and return the result.
     return DartEntry::InvokeFunction(setter, args);
   }
@@ -3472,13 +3295,20 @@
     const int kNumArgs = 1;
     const Array& args = Array::Handle(zone, Array::New(kNumArgs));
     args.SetAt(0, value);
-
     return ThrowNoSuchMethod(AbstractType::Handle(zone, RareType()),
                              internal_setter_name, args, Object::null_array(),
                              InvocationMirror::kStatic,
                              InvocationMirror::kSetter);
   }
 
+  parameter_type ^= field.type();
+  if (!argument_type.IsNullType() && !parameter_type.IsDynamicType() &&
+      !value.IsInstanceOf(parameter_type, Object::null_type_arguments(),
+                          Object::null_type_arguments())) {
+    const String& argument_name = String::Handle(zone, field.name());
+    return ThrowTypeError(field.token_pos(), value, parameter_type,
+                          argument_name);
+  }
   field.SetStaticValue(value);
   return value.raw();
 }
@@ -3528,48 +3358,22 @@
       return DartEntry::InvokeClosure(call_args, call_args_descriptor_array);
     }
   }
-
   const Array& args_descriptor_array = Array::Handle(
       zone, ArgumentsDescriptor::New(kTypeArgsLen, args.Length(), arg_names));
-
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
-
+  const TypeArguments& type_args = Object::null_type_arguments();
   if (function.IsNull() || !function.AreValidArguments(args_descriptor, NULL) ||
       (respect_reflectable && !function.is_reflectable())) {
     return ThrowNoSuchMethod(
         AbstractType::Handle(zone, RareType()), function_name, args, arg_names,
         InvocationMirror::kStatic, InvocationMirror::kMethod);
   }
-
-  return DartEntry::InvokeFunction(function, args, args_descriptor_array);
-}
-
-RawObject* Class::Evaluate(const String& expr,
-                           const Array& param_names,
-                           const Array& param_values) const {
-  return Evaluate(expr, param_names, param_values, Object::empty_array(),
-                  Object::null_type_arguments());
-}
-
-RawObject* Class::Evaluate(const String& expr,
-                           const Array& param_names,
-                           const Array& param_values,
-                           const Array& type_param_names,
-                           const TypeArguments& type_param_values) const {
-  ASSERT(Thread::Current()->IsMutatorThread());
-  if (id() < kInstanceCid || id() == kTypeArgumentsCid) {
-    const Instance& exception = Instance::Handle(String::New(
-        "Expressions can be evaluated only with regular Dart instances"));
-    const Instance& stacktrace = Instance::Handle();
-    return UnhandledException::New(exception, stacktrace);
+  RawObject* type_error =
+      function.DoArgumentTypesMatch(args, args_descriptor, type_args);
+  if (type_error != Error::null()) {
+    return type_error;
   }
-
-  ASSERT(Library::Handle(library()).kernel_data() ==
-             ExternalTypedData::null() ||
-         !FLAG_enable_kernel_expression_compilation);
-  const Function& eval_func = Function::Handle(
-      Function::EvaluateHelper(*this, expr, param_names, true));
-  return DartEntry::InvokeFunction(eval_func, param_values);
+  return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
 
 static RawObject* EvaluateCompiledExpressionHelper(
@@ -3615,7 +3419,7 @@
   ASSERT(thread->IsMutatorThread());
   ASSERT(thread != NULL);
   const Error& error =
-      Error::Handle(thread->zone(), Compiler::CompileClass(*this));
+      Error::Handle(thread->zone(), ClassFinalizer::LoadClassMembers(*this));
   if (!error.IsNull()) {
     ASSERT(thread == Thread::Current());
     if (thread->long_jump_base() != NULL) {
@@ -3684,6 +3488,18 @@
 
   CLASS_LIST_WITH_NULL(ADD_SET_FIELD)
 #undef ADD_SET_FIELD
+
+#define ADD_SET_FIELD(clazz)                                                   \
+  field_name = Symbols::New(thread, "cid" #clazz "View");                      \
+  field = Field::New(field_name, true, false, true, false, *this,              \
+                     Type::Handle(Type::IntType()), TokenPosition::kMinSource, \
+                     TokenPosition::kMinSource);                               \
+  value = Smi::New(kTypedData##clazz##ViewCid);                                \
+  field.SetStaticValue(value, true);                                           \
+  AddField(field);
+
+  CLASS_LIST_TYPED_DATA(ADD_SET_FIELD)
+#undef ADD_SET_FIELD
 #undef CLASS_LIST_WITH_NULL
 }
 
@@ -3900,8 +3716,6 @@
       return Symbols::Void().raw();
     case kClassCid:
       return Symbols::Class().raw();
-    case kUnresolvedClassCid:
-      return Symbols::UnresolvedClass().raw();
     case kTypeArgumentsCid:
       return Symbols::TypeArguments().raw();
     case kPatchClassCid:
@@ -3928,6 +3742,8 @@
       return Symbols::KernelProgramInfo().raw();
     case kCodeCid:
       return Symbols::Code().raw();
+    case kBytecodeCid:
+      return Symbols::Bytecode().raw();
     case kInstructionsCid:
       return Symbols::Instructions().raw();
     case kObjectPoolCid:
@@ -4002,7 +3818,7 @@
   return TokenPosition::kNoSource;
 #else
   // Return the begin token for synthetic classes.
-  if (is_synthesized_class() || IsMixinApplication() || IsTopLevel()) {
+  if (is_synthesized_class() || IsTopLevel()) {
     return token_pos();
   }
 
@@ -4090,14 +3906,6 @@
   set_state_bits(ConstBit::update(true, raw_ptr()->state_bits_));
 }
 
-void Class::set_is_mixin_app_alias() const {
-  set_state_bits(MixinAppAliasBit::update(true, raw_ptr()->state_bits_));
-}
-
-void Class::set_is_mixin_type_applied() const {
-  set_state_bits(MixinTypeAppliedBit::update(true, raw_ptr()->state_bits_));
-}
-
 void Class::set_is_transformed_mixin_application() const {
   set_state_bits(
       TransformedMixinApplicationBit::update(true, raw_ptr()->state_bits_));
@@ -4122,13 +3930,6 @@
       ClassFinalizedBits::update(RawClass::kFinalized, raw_ptr()->state_bits_));
 }
 
-void Class::SetRefinalizeAfterPatch() const {
-  ASSERT(!IsTopLevel());
-  set_state_bits(ClassFinalizedBits::update(RawClass::kRefinalizeAfterPatch,
-                                            raw_ptr()->state_bits_));
-  set_state_bits(TypeFinalizedBit::update(false, raw_ptr()->state_bits_));
-}
-
 void Class::ResetFinalization() const {
   ASSERT(IsTopLevel() || IsClosureClass());
   set_state_bits(
@@ -4142,28 +3943,11 @@
                                             raw_ptr()->state_bits_));
 }
 
-void Class::set_is_marked_for_parsing() const {
-  set_state_bits(MarkedForParsingBit::update(true, raw_ptr()->state_bits_));
-}
-
-void Class::reset_is_marked_for_parsing() const {
-  set_state_bits(MarkedForParsingBit::update(false, raw_ptr()->state_bits_));
-}
-
 void Class::set_interfaces(const Array& value) const {
   ASSERT(!value.IsNull());
   StorePointer(&raw_ptr()->interfaces_, value.raw());
 }
 
-void Class::set_mixin(const Type& value) const {
-  ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->mixin_, value.raw());
-}
-
-bool Class::IsMixinApplication() const {
-  return mixin() != Type::null();
-}
-
 RawClass* Class::GetPatchClass() const {
   const Library& lib = Library::Handle(library());
   return lib.GetPatchClass(String::Handle(Name()));
@@ -4224,23 +4008,22 @@
   StorePointer(&raw_ptr()->constants_, value.raw());
 }
 
-RawType* Class::canonical_type() const {
-  return raw_ptr()->canonical_type_;
-}
-
-void Class::set_canonical_type(const Type& value) const {
+void Class::set_declaration_type(const Type& value) const {
   ASSERT(!value.IsNull() && value.IsCanonical() && value.IsOld());
-  StorePointer(&raw_ptr()->canonical_type_, value.raw());
+  ASSERT((declaration_type() == Object::null()) ||
+         (declaration_type() == value.raw()));  // Set during own finalization.
+  StorePointer(&raw_ptr()->declaration_type_, value.raw());
 }
 
-RawType* Class::CanonicalType() const {
-  return raw_ptr()->canonical_type_;
-}
-
-void Class::SetCanonicalType(const Type& type) const {
-  ASSERT((canonical_type() == Object::null()) ||
-         (canonical_type() == type.raw()));  // Set during own finalization.
-  set_canonical_type(type);
+RawType* Class::DeclarationType() const {
+  if (declaration_type() != Type::null()) {
+    return declaration_type();
+  }
+  Type& type = Type::Handle(
+      Type::New(*this, TypeArguments::Handle(type_parameters()), token_pos()));
+  type ^= ClassFinalizer::FinalizeType(*this, type);
+  set_declaration_type(type);
+  return type.raw();
 }
 
 void Class::set_allocation_stub(const Code& value) const {
@@ -4283,20 +4066,16 @@
          (library() == Library::AsyncLibrary());
 }
 
-// If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T.
-// If test_kind == kIsMoreSpecificThan, checks if S is more specific than T.
-// Type S is specified by this class parameterized with 'type_arguments', and
+// Checks if type S is a subtype of type T.
+// Type S is specified by class 'cls' parameterized with 'type_arguments', and
 // type T by class 'other' parameterized with 'other_type_arguments'.
 // This class and class 'other' do not need to be finalized, however, they must
 // be resolved as well as their interfaces.
-bool Class::TypeTestNonRecursive(const Class& cls,
-                                 Class::TypeTestKind test_kind,
-                                 const TypeArguments& type_arguments,
-                                 const Class& other,
-                                 const TypeArguments& other_type_arguments,
-                                 Error* bound_error,
-                                 TrailPtr bound_trail,
-                                 Heap::Space space) {
+bool Class::IsSubtypeOf(const Class& cls,
+                        const TypeArguments& type_arguments,
+                        const Class& other,
+                        const TypeArguments& other_type_arguments,
+                        Heap::Space space) {
   // Use the 'this_class' object as if it was the receiver of this method, but
   // instead of recursing, reset it to the super class and loop.
   Thread* thread = Thread::Current();
@@ -4309,27 +4088,19 @@
         other.IsVoidClass()) {
       return true;
     }
-    // Check for NullType, which, as of Dart 1.5, is a subtype of (and is more
+    // Check for NullType, which, as of Dart 2.0, is a subtype of (and is more
     // specific than) any type. Note that the null instance is not handled here.
     if (this_class.IsNullClass()) {
       return true;
     }
-    // Class FutureOr is mapped to dynamic in non-strong mode.
-    // Detect snapshots compiled in strong mode and run in non-strong mode.
-    ASSERT(FLAG_strong || !other.IsFutureOrClass());
-    // In strong mode, check if 'other' is 'FutureOr'.
-    // If so, apply additional subtyping rules.
-    if (FLAG_strong && this_class.FutureOrTypeTest(
-                           zone, type_arguments, other, other_type_arguments,
-                           bound_error, bound_trail, space)) {
+    // Apply additional subtyping rules if 'other' is 'FutureOr'.
+    if (Class::IsSubtypeOfFutureOr(zone, this_class, type_arguments, other,
+                                   other_type_arguments, space)) {
       return true;
     }
-    // In the case of a subtype test, each occurrence of DynamicType in type S
-    // is interpreted as the bottom type, a subtype of all types, but not in
-    // strong mode.
-    // However, DynamicType is not more specific than any type.
+    // DynamicType is not more specific than any type.
     if (this_class.IsDynamicClass()) {
-      return !FLAG_strong && (test_kind == Class::kIsSubtypeOf);
+      return false;
     }
     // If other is neither Object, dynamic or void, then ObjectType/VoidType
     // can't be a subtype of other.
@@ -4356,20 +4127,10 @@
         // Other type can't be more specific than this one because for that
         // it would have to have all dynamic type arguments which is checked
         // above.
-        return !FLAG_strong && (test_kind == Class::kIsSubtypeOf);
+        return false;
       }
-      return type_arguments.TypeTest(test_kind, other_type_arguments,
-                                     from_index, num_type_params, bound_error,
-                                     bound_trail, space);
-    }
-    // In strong mode, subtyping rules of callable instances are restricted.
-    if (!FLAG_strong && other.IsDartFunctionClass()) {
-      // Check if type S has a call() method.
-      const Function& call_function =
-          Function::Handle(zone, this_class.LookupCallFunctionForTypeTest());
-      if (!call_function.IsNull()) {
-        return true;
-      }
+      return type_arguments.IsSubtypeOf(other_type_arguments, from_index,
+                                        num_type_params, space);
     }
     // Check for 'direct super type' specified in the implements clause
     // and check for transitivity at the same time.
@@ -4377,7 +4138,6 @@
     AbstractType& interface = AbstractType::Handle(zone);
     Class& interface_class = Class::Handle(zone);
     TypeArguments& interface_args = TypeArguments::Handle(zone);
-    Error& error = Error::Handle(zone);
     for (intptr_t i = 0; i < interfaces.Length(); i++) {
       interface ^= interfaces.At(i);
       if (!interface.IsFinalized()) {
@@ -4392,13 +4152,6 @@
         ClassFinalizer::FinalizeType(this_class, interface);
         interfaces.SetAt(i, interface);
       }
-      if (interface.IsMalbounded()) {
-        // Return the first bound error to the caller if it requests it.
-        if ((bound_error != NULL) && bound_error->IsNull()) {
-          *bound_error = interface.error();
-        }
-        continue;  // Another interface may work better.
-      }
       interface_class = interface.type_class();
       interface_args = interface.arguments();
       if (!interface_args.IsNull() && !interface_args.IsInstantiated()) {
@@ -4410,25 +4163,16 @@
         // parameters of the interface are at the end of the type vector,
         // after the type arguments of the super type of this type.
         // The index of the type parameters is adjusted upon finalization.
-        error = Error::null();
         interface_args = interface_args.InstantiateFrom(
-            type_arguments, Object::null_type_arguments(), kNoneFree, &error,
-            NULL, bound_trail, space);
-        if (!error.IsNull()) {
-          // Return the first bound error to the caller if it requests it.
-          if ((bound_error != NULL) && bound_error->IsNull()) {
-            *bound_error = error.raw();
-          }
-          continue;  // Another interface may work better.
-        }
+            type_arguments, Object::null_type_arguments(), kNoneFree, NULL,
+            space);
       }
       // In Dart 2, implementing Function has no meaning.
-      if (FLAG_strong && interface_class.IsDartFunctionClass()) {
+      if (interface_class.IsDartFunctionClass()) {
         continue;
       }
-      if (interface_class.TypeTest(test_kind, interface_args, other,
-                                   other_type_arguments, bound_error,
-                                   bound_trail, space)) {
+      if (Class::IsSubtypeOf(interface_class, interface_args, other,
+                             other_type_arguments, space)) {
         return true;
       }
     }
@@ -4442,34 +4186,12 @@
   return false;
 }
 
-// If test_kind == kIsSubtypeOf, checks if type S is a subtype of type T.
-// If test_kind == kIsMoreSpecificThan, checks if S is more specific than T.
-// Type S is specified by this class parameterized with 'type_arguments', and
-// type T by class 'other' parameterized with 'other_type_arguments'.
-// This class and class 'other' do not need to be finalized, however, they must
-// be resolved as well as their interfaces.
-bool Class::TypeTest(TypeTestKind test_kind,
-                     const TypeArguments& type_arguments,
-                     const Class& other,
-                     const TypeArguments& other_type_arguments,
-                     Error* bound_error,
-                     TrailPtr bound_trail,
-                     Heap::Space space) const {
-  return TypeTestNonRecursive(*this, test_kind, type_arguments, other,
-                              other_type_arguments, bound_error, bound_trail,
-                              space);
-}
-
-bool Class::FutureOrTypeTest(Zone* zone,
-                             const TypeArguments& type_arguments,
-                             const Class& other,
-                             const TypeArguments& other_type_arguments,
-                             Error* bound_error,
-                             TrailPtr bound_trail,
-                             Heap::Space space) const {
-  // In strong mode, there is no difference between 'is subtype of' and
-  // 'is more specific than'.
-  ASSERT(FLAG_strong);
+bool Class::IsSubtypeOfFutureOr(Zone* zone,
+                                const Class& cls,
+                                const TypeArguments& type_arguments,
+                                const Class& other,
+                                const TypeArguments& other_type_arguments,
+                                Heap::Space space) {
   if (other.IsFutureOrClass()) {
     if (other_type_arguments.IsNull()) {
       return true;
@@ -4479,19 +4201,18 @@
     if (other_type_arg.IsTopType()) {
       return true;
     }
-    if (!type_arguments.IsNull() && IsFutureClass()) {
+    if (!type_arguments.IsNull() && cls.IsFutureClass()) {
       const AbstractType& type_arg =
           AbstractType::Handle(zone, type_arguments.TypeAt(0));
-      if (type_arg.TypeTest(Class::kIsSubtypeOf, other_type_arg, bound_error,
-                            bound_trail, space)) {
+      if (type_arg.IsSubtypeOf(other_type_arg, space)) {
         return true;
       }
     }
-    if (other_type_arg.HasResolvedTypeClass() &&
-        TypeTest(Class::kIsSubtypeOf, type_arguments,
-                 Class::Handle(zone, other_type_arg.type_class()),
-                 TypeArguments::Handle(other_type_arg.arguments()), bound_error,
-                 bound_trail, space)) {
+    if (other_type_arg.HasTypeClass() &&
+        Class::IsSubtypeOf(cls, type_arguments,
+                           Class::Handle(zone, other_type_arg.type_class()),
+                           TypeArguments::Handle(other_type_arg.arguments()),
+                           space)) {
       return true;
     }
   }
@@ -4552,31 +4273,6 @@
   return LookupFunctionAllowPrivate(name, kAny);
 }
 
-RawFunction* Class::LookupCallFunctionForTypeTest() const {
-  // If this class is not compiled yet, it is too early to lookup a call
-  // function. This case should only occur during bounds checking at compile
-  // time. Return null as if the call method did not exist, so the type test
-  // may return false, but without a bound error, and the bound check will get
-  // postponed to runtime.
-  if (!is_finalized()) {
-    return Function::null();
-  }
-  Zone* zone = Thread::Current()->zone();
-  Class& cls = Class::Handle(zone, raw());
-  Function& call_function = Function::Handle(zone);
-  do {
-    ASSERT(cls.is_finalized());
-    call_function = cls.LookupDynamicFunctionAllowAbstract(Symbols::Call());
-    cls = cls.SuperClass();
-  } while (call_function.IsNull() && !cls.IsNull());
-  if (!call_function.IsNull()) {
-    // Make sure the signature is finalized before using it in a type test.
-    ClassFinalizer::FinalizeSignature(
-        cls, call_function, ClassFinalizer::kFinalize);  // No bounds checking.
-  }
-  return call_function.raw();
-}
-
 // Returns true if 'prefix' and 'accessor_name' match 'name'.
 static bool MatchesAccessorName(const String& name,
                                 const char* prefix,
@@ -5090,64 +4786,6 @@
   set.Release();
 }
 
-RawUnresolvedClass* UnresolvedClass::New(const Object& library_prefix,
-                                         const String& ident,
-                                         TokenPosition token_pos) {
-  const UnresolvedClass& type = UnresolvedClass::Handle(UnresolvedClass::New());
-  type.set_library_or_library_prefix(library_prefix);
-  type.set_ident(ident);
-  type.set_token_pos(token_pos);
-  return type.raw();
-}
-
-RawUnresolvedClass* UnresolvedClass::New() {
-  ASSERT(Object::unresolved_class_class() != Class::null());
-  RawObject* raw = Object::Allocate(
-      UnresolvedClass::kClassId, UnresolvedClass::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawUnresolvedClass*>(raw);
-}
-
-void UnresolvedClass::set_token_pos(TokenPosition token_pos) const {
-  ASSERT(!token_pos.IsClassifying());
-  StoreNonPointer(&raw_ptr()->token_pos_, token_pos);
-}
-
-void UnresolvedClass::set_ident(const String& ident) const {
-  StorePointer(&raw_ptr()->ident_, ident.raw());
-}
-
-void UnresolvedClass::set_library_or_library_prefix(
-    const Object& library_prefix) const {
-  StorePointer(&raw_ptr()->library_or_library_prefix_, library_prefix.raw());
-}
-
-RawString* UnresolvedClass::Name() const {
-  if (library_or_library_prefix() != Object::null()) {
-    Thread* thread = Thread::Current();
-    Zone* zone = thread->zone();
-    const Object& lib_prefix =
-        Object::Handle(zone, library_or_library_prefix());
-    String& name = String::Handle(zone);  // Qualifier.
-    if (lib_prefix.IsLibraryPrefix()) {
-      name = LibraryPrefix::Cast(lib_prefix).name();
-    } else {
-      name = Library::Cast(lib_prefix).name();
-    }
-    GrowableHandlePtrArray<const String> strs(zone, 3);
-    strs.Add(name);
-    strs.Add(Symbols::Dot());
-    strs.Add(String::Handle(zone, ident()));
-    return Symbols::FromConcatAll(thread, strs);
-  } else {
-    return ident();
-  }
-}
-
-const char* UnresolvedClass::ToCString() const {
-  const char* cname = String::Handle(Name()).ToCString();
-  return OS::SCreate(Thread::Current()->zone(), "unresolved class '%s'", cname);
-}
-
 intptr_t TypeArguments::ComputeHash() const {
   if (IsNull()) return 0;
   const intptr_t num_types = Length();
@@ -5205,8 +4843,6 @@
       type = TypeAt(from_index + i);
       name = type.BuildName(name_visibility);
     } else {
-      // Show dynamic type argument in strong mode.
-      ASSERT(FLAG_strong);
       name = Symbols::Dynamic().raw();
     }
     pieces.Add(name);
@@ -5263,18 +4899,6 @@
   return false;
 }
 
-void TypeArguments::SetScopeFunction(const Function& function) const {
-  if (IsNull()) return;
-  const intptr_t num_types = Length();
-  AbstractType& type = AbstractType::Handle();
-  for (intptr_t i = 0; i < num_types; i++) {
-    type = TypeAt(i);
-    if (!type.IsNull()) {
-      type.SetScopeFunction(function);
-    }
-  }
-}
-
 bool TypeArguments::IsDynamicTypes(bool raw_instantiated,
                                    intptr_t from_index,
                                    intptr_t len) const {
@@ -5286,10 +4910,9 @@
     if (type.IsNull()) {
       return false;
     }
-    if (!type.HasResolvedTypeClass()) {
+    if (!type.HasTypeClass()) {
       if (raw_instantiated && type.IsTypeParameter()) {
-        // An uninstantiated type parameter is equivalent to dynamic (even in
-        // the presence of a malformed bound in checked mode).
+        // An uninstantiated type parameter is equivalent to dynamic.
         continue;
       }
       return false;
@@ -5314,13 +4937,10 @@
   return true;
 }
 
-bool TypeArguments::TypeTest(TypeTestKind test_kind,
-                             const TypeArguments& other,
-                             intptr_t from_index,
-                             intptr_t len,
-                             Error* bound_error,
-                             TrailPtr bound_trail,
-                             Heap::Space space) const {
+bool TypeArguments::IsSubtypeOf(const TypeArguments& other,
+                                intptr_t from_index,
+                                intptr_t len,
+                                Heap::Space space) const {
   ASSERT(Length() >= (from_index + len));
   ASSERT(!other.IsNull());
   ASSERT(other.Length() >= (from_index + len));
@@ -5330,8 +4950,7 @@
     type = TypeAt(from_index + i);
     other_type = other.TypeAt(from_index + i);
     if (type.IsNull() || other_type.IsNull() ||
-        !type.TypeTest(test_kind, other_type, bound_error, bound_trail,
-                       space)) {
+        !type.IsSubtypeOf(other_type, space)) {
       return false;
     }
   }
@@ -5381,21 +5000,6 @@
   StorePointer(TypeAddr(index), value.raw());
 }
 
-bool TypeArguments::IsResolved() const {
-  if (IsCanonical()) {
-    return true;
-  }
-  AbstractType& type = AbstractType::Handle();
-  const intptr_t num_types = Length();
-  for (intptr_t i = 0; i < num_types; i++) {
-    type = TypeAt(i);
-    if (!type.IsResolved()) {
-      return false;
-    }
-  }
-  return true;
-}
-
 bool TypeArguments::IsSubvectorInstantiated(intptr_t from_index,
                                             intptr_t len,
                                             Genericity genericity,
@@ -5435,15 +5039,11 @@
     if ((type_param.index() != i) || type_param.IsFunctionTypeParameter()) {
       return false;
     }
-    // TODO(regis): Do the bounds really matter, since they are checked at
-    // finalization time (creating BoundedTypes where required)? Understand
-    // why ignoring bounds here causes failures.
     // If this type parameter specifies an upper bound, then the type argument
     // vector does not really represent the identity vector. It cannot be
     // substituted by the instantiator's type argument vector without checking
     // the upper bound.
     const AbstractType& bound = AbstractType::Handle(type_param.bound());
-    ASSERT(bound.IsResolved());
     if (!bound.IsObjectType() && !bound.IsDynamicType()) {
       return false;
     }
@@ -5508,6 +5108,7 @@
   const TypeArguments& super_type_args =
       TypeArguments::Handle(super_type.arguments());
   if (super_type_args.IsNull()) {
+    ASSERT(!IsUninstantiatedIdentity());
     return false;
   }
   AbstractType& super_type_arg = AbstractType::Handle();
@@ -5516,6 +5117,36 @@
     type_arg = TypeAt(i);
     super_type_arg = super_type_args.TypeAt(i);
     if (!type_arg.Equals(super_type_arg)) {
+      ASSERT(!IsUninstantiatedIdentity());
+      return false;
+    }
+  }
+  return true;
+}
+
+// Return true if this uninstantiated type argument vector, once instantiated
+// at runtime, is a prefix of the enclosing function type arguments.
+bool TypeArguments::CanShareFunctionTypeArguments(
+    const Function& function) const {
+  ASSERT(!IsInstantiated());
+  const intptr_t num_type_args = Length();
+  const intptr_t num_parent_type_params = function.NumParentTypeParameters();
+  const intptr_t num_function_type_params = function.NumTypeParameters();
+  const intptr_t num_function_type_args =
+      num_parent_type_params + num_function_type_params;
+  if (num_type_args > num_function_type_args) {
+    // This vector cannot be a prefix of a shorter vector.
+    return false;
+  }
+  AbstractType& type_arg = AbstractType::Handle();
+  for (intptr_t i = 0; i < num_type_args; i++) {
+    type_arg = TypeAt(i);
+    if (!type_arg.IsTypeParameter()) {
+      return false;
+    }
+    const TypeParameter& type_param = TypeParameter::Cast(type_arg);
+    ASSERT(type_param.IsFinalized());
+    if ((type_param.index() != i) || !type_param.IsFunctionTypeParameter()) {
       return false;
     }
   }
@@ -5535,42 +5166,16 @@
   return true;
 }
 
-bool TypeArguments::IsBounded() const {
-  AbstractType& type = AbstractType::Handle();
-  const intptr_t num_types = Length();
-  for (intptr_t i = 0; i < num_types; i++) {
-    type = TypeAt(i);
-    if (type.IsBoundedType()) {
-      return true;
-    }
-    if (type.IsTypeParameter()) {
-      const AbstractType& bound =
-          AbstractType::Handle(TypeParameter::Cast(type).bound());
-      if (!bound.IsObjectType() && !bound.IsDynamicType()) {
-        return true;
-      }
-      continue;
-    }
-    const TypeArguments& type_args =
-        TypeArguments::Handle(Type::Cast(type).arguments());
-    if (!type_args.IsNull() && type_args.IsBounded()) {
-      return true;
-    }
-  }
-  return false;
-}
-
 RawTypeArguments* TypeArguments::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
-    Error* bound_error,
     TrailPtr instantiation_trail,
-    TrailPtr bound_trail,
     Heap::Space space) const {
   ASSERT(!IsInstantiated(kAny, num_free_fun_type_params));
-  if (!instantiator_type_arguments.IsNull() && IsUninstantiatedIdentity() &&
-      (instantiator_type_arguments.Length() == Length())) {
+  if ((instantiator_type_arguments.IsNull() ||
+       instantiator_type_arguments.Length() == Length()) &&
+      IsUninstantiatedIdentity()) {
     return instantiator_type_arguments.raw();
   }
   const intptr_t num_types = Length();
@@ -5587,10 +5192,14 @@
     // type before A is marked as finalized.
     if (!type.IsNull() &&
         !type.IsInstantiated(kAny, num_free_fun_type_params)) {
-      type = type.InstantiateFrom(instantiator_type_arguments,
-                                  function_type_arguments,
-                                  num_free_fun_type_params, bound_error,
-                                  instantiation_trail, bound_trail, space);
+      type = type.InstantiateFrom(
+          instantiator_type_arguments, function_type_arguments,
+          num_free_fun_type_params, instantiation_trail, space);
+      // A returned null type indicates a failed instantiation in dead code that
+      // must be propagated up to the caller, the optimizing compiler.
+      if (type.IsNull()) {
+        return Object::empty_type_arguments().raw();
+      }
     }
     instantiated_array.SetTypeAt(i, type);
   }
@@ -5599,8 +5208,7 @@
 
 RawTypeArguments* TypeArguments::InstantiateAndCanonicalizeFrom(
     const TypeArguments& instantiator_type_arguments,
-    const TypeArguments& function_type_arguments,
-    Error* bound_error) const {
+    const TypeArguments& function_type_arguments) const {
   ASSERT(!IsInstantiated());
   ASSERT(instantiator_type_arguments.IsNull() ||
          instantiator_type_arguments.IsCanonical());
@@ -5626,10 +5234,7 @@
   // Cache lookup failed. Instantiate the type arguments.
   TypeArguments& result = TypeArguments::Handle();
   result = InstantiateFrom(instantiator_type_arguments, function_type_arguments,
-                           kAllFree, bound_error, NULL, NULL, Heap::kOld);
-  if ((bound_error != NULL) && !bound_error->IsNull()) {
-    return result.raw();
-  }
+                           kAllFree, NULL, Heap::kOld);
   // Instantiation did not result in bound error. Canonicalize type arguments.
   result = result.Canonicalize();
   // InstantiateAndCanonicalizeFrom is not reentrant. It cannot have been called
@@ -5691,44 +5296,6 @@
   StoreSmi(&raw_ptr()->length_, Smi::New(value));
 }
 
-RawTypeArguments* TypeArguments::CloneUnfinalized() const {
-  if (IsNull() || IsFinalized()) {
-    return raw();
-  }
-  ASSERT(IsResolved());
-  AbstractType& type = AbstractType::Handle();
-  const intptr_t num_types = Length();
-  const TypeArguments& clone =
-      TypeArguments::Handle(TypeArguments::New(num_types));
-  for (intptr_t i = 0; i < num_types; i++) {
-    type = TypeAt(i);
-    type = type.CloneUnfinalized();
-    clone.SetTypeAt(i, type);
-  }
-  ASSERT(clone.IsResolved());
-  return clone.raw();
-}
-
-RawTypeArguments* TypeArguments::CloneUninstantiated(const Class& new_owner,
-                                                     TrailPtr trail) const {
-  ASSERT(!IsNull());
-  ASSERT(IsFinalized());
-  ASSERT(!IsInstantiated());
-  AbstractType& type = AbstractType::Handle();
-  const intptr_t num_types = Length();
-  const TypeArguments& clone =
-      TypeArguments::Handle(TypeArguments::New(num_types));
-  for (intptr_t i = 0; i < num_types; i++) {
-    type = TypeAt(i);
-    if (!type.IsInstantiated()) {
-      type = type.CloneUninstantiated(new_owner, trail);
-    }
-    clone.SetTypeAt(i, type);
-  }
-  ASSERT(clone.IsFinalized());
-  return clone.raw();
-}
-
 RawTypeArguments* TypeArguments::Canonicalize(TrailPtr trail) const {
   if (IsNull() || IsCanonical()) {
     ASSERT(IsOld());
@@ -5924,10 +5491,10 @@
   NoSafepointScope no_safepoint;
   ASSERT(raw_ptr()->code_ != Code::null());
 #if defined(DART_PRECOMPILED_RUNTIME)
-  return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code();
+  return raw_ptr()->code_ != StubCode::LazyCompile().raw();
 #else
-  return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code() &&
-         raw_ptr()->code_ != StubCode::InterpretCall_entry()->code();
+  return raw_ptr()->code_ != StubCode::LazyCompile().raw() &&
+         raw_ptr()->code_ != StubCode::InterpretCall().raw();
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
@@ -5969,11 +5536,11 @@
   }
 }
 
-void Function::AttachBytecode(const Code& value) const {
+void Function::AttachBytecode(const Bytecode& value) const {
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   ASSERT(FLAG_enable_interpreter || FLAG_use_bytecode_compiler);
   // Finish setting up code before activating it.
-  value.set_owner(*this);
+  value.set_function(*this);
   StorePointer(&raw_ptr()->bytecode_, value.raw());
 
   // We should not have loaded the bytecode if the function had code.
@@ -5981,16 +5548,16 @@
 
   if (FLAG_enable_interpreter) {
     // Set the code entry_point to InterpretCall stub.
-    SetInstructions(Code::Handle(StubCode::InterpretCall_entry()->code()));
+    SetInstructions(StubCode::InterpretCall());
   }
 }
 
 bool Function::HasBytecode() const {
-  return raw_ptr()->bytecode_ != Code::null();
+  return raw_ptr()->bytecode_ != Bytecode::null();
 }
 
 bool Function::HasBytecode(RawFunction* function) {
-  return function->ptr()->bytecode_ != Code::null();
+  return function->ptr()->bytecode_ != Bytecode::null();
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -5998,10 +5565,10 @@
   NoSafepointScope no_safepoint;
   ASSERT(function->ptr()->code_ != Code::null());
 #if defined(DART_PRECOMPILED_RUNTIME)
-  return function->ptr()->code_ != StubCode::LazyCompile_entry()->code();
+  return function->ptr()->code_ != StubCode::LazyCompile().raw();
 #else
-  return function->ptr()->code_ != StubCode::LazyCompile_entry()->code() &&
-         function->ptr()->code_ != StubCode::InterpretCall_entry()->code();
+  return function->ptr()->code_ != StubCode::LazyCompile().raw() &&
+         function->ptr()->code_ != StubCode::InterpretCall().raw();
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 }
 
@@ -6012,16 +5579,17 @@
   ASSERT(Thread::Current()->IsMutatorThread());
 
   StorePointer(&raw_ptr()->unoptimized_code_, Code::null());
-  StorePointer(&raw_ptr()->bytecode_, Code::null());
+  StorePointer(&raw_ptr()->bytecode_, Bytecode::null());
 
-  SetInstructions(Code::Handle(StubCode::LazyCompile_entry()->code()));
+  SetInstructions(StubCode::LazyCompile());
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
 void Function::EnsureHasCompiledUnoptimizedCode() const {
   Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
   ASSERT(thread->IsMutatorThread());
+  DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
+  Zone* zone = thread->zone();
 
   const Error& error =
       Error::Handle(zone, Compiler::EnsureUnoptimizedCode(thread, *this));
@@ -6036,6 +5604,7 @@
   Isolate* isolate = thread->isolate();
   Zone* zone = thread->zone();
   ASSERT(thread->IsMutatorThread());
+  // TODO(35224): DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
   const Code& current_code = Code::Handle(zone, CurrentCode());
 
   if (FLAG_trace_deoptimization_verbose) {
@@ -6055,6 +5624,9 @@
 }
 
 void Function::SwitchToLazyCompiledUnoptimizedCode() const {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  UNREACHABLE();
+#else
   if (!HasOptimizedCode()) {
     return;
   }
@@ -6069,9 +5641,14 @@
 
   const Code& unopt_code = Code::Handle(zone, unoptimized_code());
   if (unopt_code.IsNull()) {
-    // Set the lazy compile code.
-    TIR_Print("Switched to lazy compile stub for %s\n", ToCString());
-    SetInstructions(Code::Handle(StubCode::LazyCompile_entry()->code()));
+    // Set the lazy compile or interpreter call stub code.
+    if (FLAG_enable_interpreter && HasBytecode()) {
+      TIR_Print("Switched to interpreter call stub for %s\n", ToCString());
+      SetInstructions(StubCode::InterpretCall());
+    } else {
+      TIR_Print("Switched to lazy compile stub for %s\n", ToCString());
+      SetInstructions(StubCode::LazyCompile());
+    }
     return;
   }
 
@@ -6079,6 +5656,7 @@
 
   AttachCode(unopt_code);
   unopt_code.Enable();
+#endif
 }
 
 void Function::set_unoptimized_code(const Code& value) const {
@@ -6965,6 +6543,87 @@
   return true;
 }
 
+RawObject* Function::DoArgumentTypesMatch(
+    const Array& args,
+    const ArgumentsDescriptor& args_desc,
+    const TypeArguments& instantiator_type_args) const {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Function& instantiated_func = Function::Handle(zone, raw());
+
+  if (!HasInstantiatedSignature()) {
+    instantiated_func ^= InstantiateSignatureFrom(instantiator_type_args,
+                                                  Object::null_type_arguments(),
+                                                  kAllFree, Heap::kOld);
+  }
+  AbstractType& argument_type = AbstractType::Handle(zone);
+  AbstractType& parameter_type = AbstractType::Handle(zone);
+  Instance& argument = Instance::Handle(zone);
+
+  // Check types of the provided arguments against the expected parameter types.
+  for (intptr_t i = args_desc.FirstArgIndex(); i < args_desc.PositionalCount();
+       ++i) {
+    argument ^= args.At(i);
+    argument_type ^= argument.GetType(Heap::kOld);
+    parameter_type ^= instantiated_func.ParameterTypeAt(i);
+
+    // If the argument type is dynamic or the parameter is null, move on.
+    if (parameter_type.IsDynamicType() || argument_type.IsNullType()) {
+      continue;
+    }
+    if (!argument.IsInstanceOf(parameter_type, instantiator_type_args,
+                               Object::null_type_arguments())) {
+      String& argument_name = String::Handle(zone, ParameterNameAt(i));
+      return ThrowTypeError(token_pos(), argument, parameter_type,
+                            argument_name);
+    }
+  }
+
+  const intptr_t num_arguments = args_desc.Count();
+  const intptr_t num_named_arguments = args_desc.NamedCount();
+  if (num_named_arguments == 0) {
+    return Error::null();
+  }
+
+  String& argument_name = String::Handle(zone);
+  String& parameter_name = String::Handle(zone);
+
+  // Check types of named arguments against expected parameter type.
+  for (intptr_t i = 0; i < num_named_arguments; i++) {
+    argument_name ^= args_desc.NameAt(i);
+    ASSERT(argument_name.IsSymbol());
+    bool found = false;
+    const intptr_t num_positional_args = num_arguments - num_named_arguments;
+    const int num_parameters = NumParameters();
+
+    // Try to find the named parameter that matches the provided argument.
+    for (intptr_t j = num_positional_args; !found && (j < num_parameters);
+         j++) {
+      parameter_name = ParameterNameAt(j);
+      ASSERT(argument_name.IsSymbol());
+      if (argument_name.Equals(parameter_name)) {
+        found = true;
+        argument ^= args.At(args_desc.PositionAt(i));
+        argument_type ^= argument.GetType(Heap::kOld);
+        parameter_type ^= instantiated_func.ParameterTypeAt(j);
+
+        // If the argument type is dynamic or the parameter is null, move on.
+        if (parameter_type.IsDynamicType() || argument_type.IsNullType()) {
+          continue;
+        }
+        if (!argument.IsInstanceOf(parameter_type, instantiator_type_args,
+                                   Object::null_type_arguments())) {
+          String& argument_name = String::Handle(zone, ParameterNameAt(i));
+          return ThrowTypeError(token_pos(), argument, parameter_type,
+                                argument_name);
+        }
+      }
+    }
+    ASSERT(found);
+  }
+  return Error::null();
+}
+
 // Helper allocating a C string buffer in the zone, printing the fully qualified
 // name of a function in it, and replacing ':' by '_' to make sure the
 // constructed name is a valid C++ identifier for debugging purpose.
@@ -7108,9 +6767,14 @@
         type_param ^= type_params.TypeAt(i);
         type = type_param.bound();
         if (!type.IsInstantiated(kAny, num_free_fun_type_params)) {
-          type = type.InstantiateFrom(
-              instantiator_type_arguments, function_type_arguments,
-              num_free_fun_type_params, NULL, NULL, NULL, space);
+          type = type.InstantiateFrom(instantiator_type_arguments,
+                                      function_type_arguments,
+                                      num_free_fun_type_params, NULL, space);
+          // A returned null type indicates a failed instantiation in dead code
+          // that must be propagated up to the caller, the optimizing compiler.
+          if (type.IsNull()) {
+            return Function::null();
+          }
           cls = type_param.parameterized_class();
           param_name = type_param.name();
           ASSERT(type_param.IsFinalized());
@@ -7138,9 +6802,14 @@
 
   type = result_type();
   if (!type.IsInstantiated(kAny, num_free_fun_type_params)) {
-    type = type.InstantiateFrom(
-        instantiator_type_arguments, function_type_arguments,
-        num_free_fun_type_params, NULL, NULL, NULL, space);
+    type = type.InstantiateFrom(instantiator_type_arguments,
+                                function_type_arguments,
+                                num_free_fun_type_params, NULL, space);
+    // A returned null type indicates a failed instantiation in dead code that
+    // must be propagated up to the caller, the optimizing compiler.
+    if (type.IsNull()) {
+      return Function::null();
+    }
   }
   sig.set_result_type(type);
   const intptr_t num_params = NumParameters();
@@ -7151,9 +6820,14 @@
   for (intptr_t i = 0; i < num_params; i++) {
     type = ParameterTypeAt(i);
     if (!type.IsInstantiated(kAny, num_free_fun_type_params)) {
-      type = type.InstantiateFrom(
-          instantiator_type_arguments, function_type_arguments,
-          num_free_fun_type_params, NULL, NULL, NULL, space);
+      type = type.InstantiateFrom(instantiator_type_arguments,
+                                  function_type_arguments,
+                                  num_free_fun_type_params, NULL, space);
+      // A returned null type indicates a failed instantiation in dead code that
+      // must be propagated up to the caller, the optimizing compiler.
+      if (type.IsNull()) {
+        return Function::null();
+      }
     }
     sig.SetParameterTypeAt(i, type);
   }
@@ -7165,54 +6839,22 @@
   return sig.raw();
 }
 
-// If test_kind == kIsSubtypeOf, checks if the type of the specified parameter
-// of this function is a subtype or a supertype of the type of the specified
-// parameter of the other function. In strong mode, we only check for supertype,
-// i.e. contravariance.
+// Checks if the type of the specified parameter of this function is a supertype
+// of the type of the specified parameter of the other function (i.e. check
+// parameter contravariance).
 // Note that types marked as covariant are already dealt with in the front-end.
-// If test_kind == kIsMoreSpecificThan, checks if the type of the specified
-// parameter of this function is more specific than the type of the specified
-// parameter of the other function.
-// Note that for kIsMoreSpecificThan (non-strong mode only), we do not apply
-// contravariance of parameter types, but covariance of both parameter types and
-// result type.
-bool Function::TestParameterType(TypeTestKind test_kind,
-                                 intptr_t parameter_position,
-                                 intptr_t other_parameter_position,
-                                 const Function& other,
-                                 Error* bound_error,
-                                 TrailPtr bound_trail,
-                                 Heap::Space space) const {
-  if (FLAG_strong) {
-    const AbstractType& param_type =
-        AbstractType::Handle(ParameterTypeAt(parameter_position));
-    if (param_type.IsTopType()) {
-      return true;
-    }
-    const AbstractType& other_param_type =
-        AbstractType::Handle(other.ParameterTypeAt(other_parameter_position));
-    return other_param_type.IsSubtypeOf(param_type, bound_error, bound_trail,
-                                        space);
+bool Function::IsContravariantParameter(intptr_t parameter_position,
+                                        const Function& other,
+                                        intptr_t other_parameter_position,
+                                        Heap::Space space) const {
+  const AbstractType& param_type =
+      AbstractType::Handle(ParameterTypeAt(parameter_position));
+  if (param_type.IsTopType()) {
+    return true;
   }
   const AbstractType& other_param_type =
       AbstractType::Handle(other.ParameterTypeAt(other_parameter_position));
-  if (other_param_type.IsDynamicType()) {
-    return true;
-  }
-  const AbstractType& param_type =
-      AbstractType::Handle(ParameterTypeAt(parameter_position));
-  if (param_type.IsDynamicType()) {
-    return test_kind == kIsSubtypeOf;
-  }
-  if (test_kind == kIsSubtypeOf) {
-    return param_type.IsSubtypeOf(other_param_type, bound_error, bound_trail,
-                                  space) ||
-           other_param_type.IsSubtypeOf(param_type, bound_error, bound_trail,
-                                        space);
-  }
-  ASSERT(test_kind == kIsMoreSpecificThan);
-  return param_type.IsMoreSpecificThan(other_param_type, bound_error,
-                                       bound_trail, space);
+  return other_param_type.IsSubtypeOf(param_type, space);
 }
 
 bool Function::HasSameTypeParametersAndBounds(const Function& other) const {
@@ -7249,11 +6891,7 @@
   return true;
 }
 
-bool Function::TypeTest(TypeTestKind test_kind,
-                        const Function& other,
-                        Error* bound_error,
-                        TrailPtr bound_trail,
-                        Heap::Space space) const {
+bool Function::IsSubtypeOf(const Function& other, Heap::Space space) const {
   const intptr_t num_fixed_params = num_fixed_parameters();
   const intptr_t num_opt_pos_params = NumOptionalPositionalParameters();
   const intptr_t num_opt_named_params = NumOptionalNamedParameters();
@@ -7274,57 +6912,28 @@
       (num_opt_named_params < other_num_opt_named_params)) {
     return false;
   }
-  if (FLAG_reify_generic_functions) {
-    // Check the type parameters and bounds of generic functions.
-    if (!HasSameTypeParametersAndBounds(other)) {
-      return false;
-    }
+  // Check the type parameters and bounds of generic functions.
+  if (!HasSameTypeParametersAndBounds(other)) {
+    return false;
   }
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   // Check the result type.
   const AbstractType& other_res_type =
       AbstractType::Handle(zone, other.result_type());
-  if (FLAG_strong) {
-    // In strong mode, 'void Function()' is a subtype of 'Object Function()'.
-    if (!other_res_type.IsTopType()) {
-      const AbstractType& res_type = AbstractType::Handle(zone, result_type());
-      if (!res_type.IsSubtypeOf(other_res_type, bound_error, bound_trail,
-                                space)) {
-        return false;
-      }
-    }
-  } else {
-    // In Dart 1.0, 'void Function()' is not a subtype of 'Object Function()',
-    // but it is a subtype of 'dynamic Function()' and of 'void Function()'.
-    if (!other_res_type.IsDynamicType() && !other_res_type.IsVoidType()) {
-      const AbstractType& res_type = AbstractType::Handle(zone, result_type());
-      if (res_type.IsVoidType()) {
-        return false;
-      }
-      if (test_kind == kIsSubtypeOf) {
-        if (!res_type.IsSubtypeOf(other_res_type, bound_error, bound_trail,
-                                  space) &&
-            !other_res_type.IsSubtypeOf(res_type, bound_error, bound_trail,
-                                        space)) {
-          return false;
-        }
-      } else {
-        ASSERT(test_kind == kIsMoreSpecificThan);
-        if (!res_type.IsMoreSpecificThan(other_res_type, bound_error,
-                                         bound_trail, space)) {
-          return false;
-        }
-      }
+  // 'void Function()' is a subtype of 'Object Function()'.
+  if (!other_res_type.IsTopType()) {
+    const AbstractType& res_type = AbstractType::Handle(zone, result_type());
+    if (!res_type.IsSubtypeOf(other_res_type, space)) {
+      return false;
     }
   }
   // Check the types of fixed and optional positional parameters.
   for (intptr_t i = 0; i < (other_num_fixed_params - other_num_ignored_params +
                             other_num_opt_pos_params);
        i++) {
-    if (!TestParameterType(test_kind, i + num_ignored_params,
-                           i + other_num_ignored_params, other, bound_error,
-                           bound_trail, space)) {
+    if (!IsContravariantParameter(i + num_ignored_params, other,
+                                  i + other_num_ignored_params, space)) {
       return false;
     }
   }
@@ -7334,10 +6943,7 @@
   }
   // Check that for each optional named parameter of type T of the other
   // function type, there exists an optional named parameter of this function
-  // type with an identical name and with a type S that is a either a subtype
-  // or supertype of T (if test_kind == kIsSubtypeOf) or that is more specific
-  // than T (if test_kind == kIsMoreSpecificThan). In strong mode, we only check
-  // for supertype, i.e. contravariance.
+  // type with an identical name and with a type S that is a supertype of T.
   // Note that SetParameterNameAt() guarantees that names are symbols, so we
   // can compare their raw pointers.
   const int num_params = num_fixed_params + num_opt_named_params;
@@ -7353,8 +6959,7 @@
       ASSERT(String::Handle(zone, ParameterNameAt(j)).IsSymbol());
       if (ParameterNameAt(j) == other_param_name.raw()) {
         found_param_name = true;
-        if (!TestParameterType(test_kind, j, i, other, bound_error, bound_trail,
-                               space)) {
+        if (!IsContravariantParameter(j, other, i, space)) {
           return false;
         }
         break;
@@ -7423,6 +7028,7 @@
   result.set_has_pragma(false);
   result.set_always_inline(false);
   result.set_is_polymorphic_target(false);
+  result.set_is_no_such_method_forwarder(false);
   NOT_IN_PRECOMPILED(result.set_state_bits(0));
   result.set_owner(owner);
   NOT_IN_PRECOMPILED(result.set_token_pos(token_pos));
@@ -7438,8 +7044,7 @@
   result.set_is_optimizable(is_native ? false : true);
   result.set_is_background_optimizable(is_native ? false : true);
   result.set_is_inlinable(true);
-  result.SetInstructionsSafe(
-      Code::Handle(StubCode::LazyCompile_entry()->code()));
+  result.SetInstructionsSafe(StubCode::LazyCompile());
   if (kind == RawFunction::kClosureFunction ||
       kind == RawFunction::kImplicitClosureFunction) {
     ASSERT(space == Heap::kOld);
@@ -7457,57 +7062,6 @@
   return result.raw();
 }
 
-RawFunction* Function::Clone(const Class& new_owner) const {
-  ASSERT(!IsGenerativeConstructor());
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  Function& clone = Function::Handle(zone);
-  clone ^= Object::Clone(*this, Heap::kOld);
-  const Class& origin = Class::Handle(zone, this->origin());
-  const PatchClass& clone_owner =
-      PatchClass::Handle(zone, PatchClass::New(new_owner, origin));
-  clone.set_owner(clone_owner);
-  clone.ClearICDataArray();
-  clone.ClearCode();
-  clone.set_data(Object::null_object());
-  clone.set_usage_counter(0);
-  clone.set_deoptimization_counter(0);
-  clone.set_optimized_instruction_count(0);
-  clone.set_inlining_depth(0);
-  clone.set_optimized_call_site_count(0);
-
-  if (new_owner.NumTypeParameters() > 0) {
-    // Adjust uninstantiated types to refer to type parameters of the new owner.
-    const TypeArguments& type_params =
-        TypeArguments::Handle(zone, type_parameters());
-    if (!type_params.IsNull()) {
-      const intptr_t num_type_params = type_params.Length();
-      const TypeArguments& type_params_clone =
-          TypeArguments::Handle(zone, TypeArguments::New(num_type_params));
-      TypeParameter& type_param = TypeParameter::Handle(zone);
-      for (intptr_t i = 0; i < num_type_params; i++) {
-        type_param ^= type_params.TypeAt(i);
-        type_param ^= type_param.CloneUninstantiated(new_owner);
-        type_params_clone.SetTypeAt(i, type_param);
-      }
-      clone.set_type_parameters(type_params_clone);
-    }
-    AbstractType& type = AbstractType::Handle(zone, clone.result_type());
-    type ^= type.CloneUninstantiated(new_owner);
-    clone.set_result_type(type);
-    const intptr_t num_params = clone.NumParameters();
-    Array& array = Array::Handle(zone, clone.parameter_types());
-    array ^= Object::Clone(array, Heap::kOld);
-    clone.set_parameter_types(array);
-    for (intptr_t i = 0; i < num_params; i++) {
-      type = clone.ParameterTypeAt(i);
-      type ^= type.CloneUninstantiated(new_owner);
-      clone.SetParameterTypeAt(i, type);
-    }
-  }
-  return clone.raw();
-}
-
 RawFunction* Function::NewClosureFunctionWithKind(RawFunction::Kind kind,
                                                   const String& name,
                                                   const Function& parent,
@@ -7654,10 +7208,8 @@
   }
   closure_function.set_kernel_offset(kernel_offset());
 
-  // In strong mode, change covariant parameter types to Object in the implicit
-  // closure of a method compiled by kernel.
-  // The VM's parser erases covariant types immediately in strong mode.
-  if (FLAG_strong && !is_static() && kernel_offset() > 0) {
+  // Change covariant parameter types to Object in the implicit closure.
+  if (!is_static()) {
     const Script& function_script = Script::Handle(zone, script());
     kernel::TranslationHelper translation_helper(thread);
     translation_helper.InitFromScript(function_script);
@@ -7821,31 +7373,29 @@
   Zone* zone = thread->zone();
   GrowableHandlePtrArray<const String> pieces(zone, 4);
   String& name = String::Handle(zone);
-  if (FLAG_reify_generic_functions) {
-    const TypeArguments& type_params =
-        TypeArguments::Handle(zone, type_parameters());
-    if (!type_params.IsNull()) {
-      const intptr_t num_type_params = type_params.Length();
-      ASSERT(num_type_params > 0);
-      TypeParameter& type_param = TypeParameter::Handle(zone);
-      AbstractType& bound = AbstractType::Handle(zone);
-      pieces.Add(Symbols::LAngleBracket());
-      for (intptr_t i = 0; i < num_type_params; i++) {
-        type_param ^= type_params.TypeAt(i);
-        name = type_param.name();
+  const TypeArguments& type_params =
+      TypeArguments::Handle(zone, type_parameters());
+  if (!type_params.IsNull()) {
+    const intptr_t num_type_params = type_params.Length();
+    ASSERT(num_type_params > 0);
+    TypeParameter& type_param = TypeParameter::Handle(zone);
+    AbstractType& bound = AbstractType::Handle(zone);
+    pieces.Add(Symbols::LAngleBracket());
+    for (intptr_t i = 0; i < num_type_params; i++) {
+      type_param ^= type_params.TypeAt(i);
+      name = type_param.name();
+      pieces.Add(name);
+      bound = type_param.bound();
+      if (!bound.IsNull() && !bound.IsObjectType()) {
+        pieces.Add(Symbols::SpaceExtendsSpace());
+        name = bound.BuildName(name_visibility);
         pieces.Add(name);
-        bound = type_param.bound();
-        if (!bound.IsNull() && !bound.IsObjectType()) {
-          pieces.Add(Symbols::SpaceExtendsSpace());
-          name = bound.BuildName(name_visibility);
-          pieces.Add(name);
-        }
-        if (i < num_type_params - 1) {
-          pieces.Add(Symbols::CommaSpace());
-        }
       }
-      pieces.Add(Symbols::RAngleBracket());
+      if (i < num_type_params - 1) {
+        pieces.Add(Symbols::CommaSpace());
+      }
     }
+    pieces.Add(Symbols::RAngleBracket());
   }
   pieces.Add(Symbols::LParen());
   BuildSignatureParameters(thread, zone, name_visibility, &pieces);
@@ -8206,11 +7756,12 @@
 }
 
 void Function::set_ic_data_array(const Array& value) const {
-  StorePointer(&raw_ptr()->ic_data_array_, value.raw());
+  StorePointer<RawArray*, MemoryOrder::kRelease>(&raw_ptr()->ic_data_array_,
+                                                 value.raw());
 }
 
 RawArray* Function::ic_data_array() const {
-  return raw_ptr()->ic_data_array_;
+  return AtomicOperations::LoadAcquire(&raw_ptr()->ic_data_array_);
 }
 
 void Function::ClearICDataArray() const {
@@ -8252,6 +7803,8 @@
 RawCode* Function::EnsureHasCode() const {
   if (HasCode()) return CurrentCode();
   Thread* thread = Thread::Current();
+  ASSERT(thread->IsMutatorThread());
+  DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
   Zone* zone = thread->zone();
   const Object& result =
       Object::Handle(zone, Compiler::CompileFunction(thread, *this));
@@ -8267,10 +7820,8 @@
 
 bool Function::MayHaveUncheckedEntryPoint(Isolate* I) const {
 // TODO(#34162): Support the other architectures.
-// TODO(#34162): Enable multiple-entrypoints for AOT if we
-// consider them beneficial.
 #if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM)
-  return !FLAG_precompiled_mode && FLAG_enable_multiple_entrypoints &&
+  return FLAG_enable_multiple_entrypoints &&
          (NeedsArgumentTypeChecks(I) || IsImplicitClosureFunction());
 #else
   return false;
@@ -8625,6 +8176,7 @@
                           const Object& owner,
                           TokenPosition token_pos,
                           TokenPosition end_token_pos) {
+  result.set_kind_bits(0);
   result.set_name(name);
   result.set_is_static(is_static);
   if (!is_static) {
@@ -8641,6 +8193,7 @@
   result.set_is_unboxing_candidate(true);
   result.set_initializer_changed_after_initialization(false);
   result.set_kernel_offset(0);
+  result.set_has_pragma(false);
   result.set_static_type_exactness_state(
       StaticTypeExactnessState::NotTracking());
   Isolate* isolate = Isolate::Current();
@@ -8698,25 +8251,6 @@
   return result.raw();
 }
 
-RawField* Field::Clone(const Class& new_owner) const {
-  Field& clone = Field::Handle();
-  clone ^= Object::Clone(*this, Heap::kOld);
-  const Class& owner = Class::Handle(this->Owner());
-  const PatchClass& clone_owner =
-      PatchClass::Handle(PatchClass::New(new_owner, owner));
-  clone.set_owner(clone_owner);
-  if (!clone.is_static()) {
-    clone.SetOffset(0);
-  }
-  if (new_owner.NumTypeParameters() > 0) {
-    // Adjust the field type to refer to type parameters of the new owner.
-    AbstractType& type = AbstractType::Handle(clone.type());
-    type ^= type.CloneUninstantiated(new_owner);
-    clone.SetFieldType(type);
-  }
-  return clone.raw();
-}
-
 RawField* Field::Clone(const Field& original) const {
   if (original.IsNull()) {
     return Field::null();
@@ -8814,35 +8348,8 @@
     return closure.raw();
   }
 
-  // This is the first time a closure for this field is requested.
-  // Create the closure and a new static field in which it is stored.
-  const char* field_name = String::Handle(zone, name()).ToCString();
-  String& expr_src = String::Handle(zone);
-  if (make_setter) {
-    expr_src = String::NewFormatted("(%s_) { return %s = %s_; }", field_name,
-                                    field_name, field_name);
-  } else {
-    expr_src = String::NewFormatted("() { return %s; }", field_name);
-  }
-  Object& result =
-      Object::Handle(zone, field_owner.Evaluate(expr_src, Object::empty_array(),
-                                                Object::empty_array()));
-  ASSERT(result.IsInstance());
-  // The caller may expect the closure to be allocated in old space. Copy
-  // the result here, since Object::Clone() is a private method.
-  result = Object::Clone(result, Heap::kOld);
-
-  closure_field = Field::New(closure_name,
-                             true,   // is_static
-                             true,   // is_final
-                             true,   // is_const
-                             false,  // is_reflectable
-                             field_owner, Object::dynamic_type(),
-                             this->token_pos(), this->end_token_pos());
-  closure_field.SetStaticValue(Instance::Cast(result), true);
-  field_owner.AddField(closure_field);
-
-  return Instance::RawCast(result.raw());
+  UNREACHABLE();
+  return Instance::null();
 }
 
 RawInstance* Field::GetterClosure() const {
@@ -8939,31 +8446,29 @@
          raw_ptr()->initializer_.precompiled_->IsFunction();
 }
 
-void Field::EvaluateInitializer() const {
+RawError* Field::EvaluateInitializer() const {
   ASSERT(IsOriginal());
   ASSERT(is_static());
   if (StaticValue() == Object::sentinel().raw()) {
     SetStaticValue(Object::transition_sentinel());
     const Object& value =
         Object::Handle(Compiler::EvaluateStaticInitializer(*this));
-    if (value.IsError()) {
+    if (!value.IsNull() && value.IsError()) {
       SetStaticValue(Object::null_instance());
-      Exceptions::PropagateError(Error::Cast(value));
-      UNREACHABLE();
+      return Error::Cast(value).raw();
     }
     ASSERT(value.IsNull() || value.IsInstance());
     SetStaticValue(value.IsNull() ? Instance::null_instance()
                                   : Instance::Cast(value));
-    return;
+    return Error::null();
   } else if (StaticValue() == Object::transition_sentinel().raw()) {
     const Array& ctor_args = Array::Handle(Array::New(1));
     const String& field_name = String::Handle(name());
     ctor_args.SetAt(0, field_name);
     Exceptions::ThrowByType(Exceptions::kCyclicInitializationError, ctor_args);
     UNREACHABLE();
-    return;
   }
-  UNREACHABLE();
+  return Error::null();
 }
 
 static intptr_t GetListLength(const Object& value) {
@@ -9181,6 +8686,8 @@
     const Type& static_type,
     const Instance& value,
     bool print_trace /* = false */) {
+  ASSERT(!value.IsNull());  // Should be handled by the caller.
+
   const TypeArguments& static_type_args =
       TypeArguments::Handle(static_type.arguments());
 
@@ -9227,14 +8734,13 @@
   // To compute C<X0, ..., Xn> at G we walk the chain backwards and
   // instantiate Si using type parameters of S{i-1} which gives us a type
   // depending on type parameters of S{i-2}.
-  Error& error = Error::Handle();
   AbstractType& type = AbstractType::Handle(path.Last()->raw());
   for (intptr_t i = path.length() - 2; (i >= 0) && !type.IsInstantiated();
        i--) {
     args = path[i]->arguments();
-    type = type.InstantiateFrom(
-        args, TypeArguments::null_type_arguments(), kAllFree, &error,
-        /*instantiation_trail=*/nullptr, /*bound_trail=*/nullptr, Heap::kNew);
+    type = type.InstantiateFrom(args, TypeArguments::null_type_arguments(),
+                                kAllFree,
+                                /*instantiation_trail=*/nullptr, Heap::kNew);
   }
 
   if (type.IsInstantiated()) {
@@ -9514,8 +9020,6 @@
       return "library";
     case RawScript::kSourceTag:
       return "source";
-    case RawScript::kPatchTag:
-      return "patch";
     case RawScript::kEvaluateTag:
       return "evaluate";
     case RawScript::kKernelTag:
@@ -9634,6 +9138,24 @@
   }
 }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+static bool IsLetter(int32_t c) {
+  return (('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z'));
+}
+
+static bool IsDecimalDigit(int32_t c) {
+  return '0' <= c && c <= '9';
+}
+
+static bool IsIdentStartChar(int32_t c) {
+  return IsLetter(c) || (c == '_') || (c == '$');
+}
+
+static bool IsIdentChar(int32_t c) {
+  return IsLetter(c) || IsDecimalDigit(c) || (c == '_') || (c == '$');
+}
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
 void Script::GetTokenLocation(TokenPosition token_pos,
                               intptr_t* line,
                               intptr_t* column,
@@ -9664,11 +9186,9 @@
       const String& source = String::Handle(zone, Source());
       intptr_t offset = token_pos.value();
       *token_len = 1;
-      if (offset < source.Length() &&
-          Scanner::IsIdentStartChar(source.CharAt(offset))) {
+      if (offset < source.Length() && IsIdentStartChar(source.CharAt(offset))) {
         for (intptr_t i = offset + 1;
-             i < source.Length() && Scanner::IsIdentChar(source.CharAt(i));
-             ++i) {
+             i < source.Length() && IsIdentChar(source.CharAt(i)); ++i) {
           ++*token_len;
         }
       }
@@ -9688,17 +9208,26 @@
 
   if (kind() == RawScript::kKernelTag) {
     const TypedData& line_starts_data = TypedData::Handle(line_starts());
-    const String& source = String::Handle(Source());
-    if (line_starts_data.IsNull() || source.IsNull()) {
+    if (line_starts_data.IsNull()) {
       // Scripts in the AOT snapshot do not have a line starts array.
       *first_token_index = TokenPosition::kNoSource;
       *last_token_index = TokenPosition::kNoSource;
       return;
     }
 #if !defined(DART_PRECOMPILED_RUNTIME)
+    const String& source = String::Handle(Source());
+    intptr_t source_length;
+    if (source.IsNull()) {
+      Smi& value = Smi::Handle();
+      const Array& debug_positions_array = Array::Handle(debug_positions());
+      value ^= debug_positions_array.At(debug_positions_array.Length() - 1);
+      source_length = value.Value();
+    } else {
+      source_length = source.Length();
+    }
     kernel::KernelLineStartsReader line_starts_reader(
         line_starts_data, Thread::Current()->zone());
-    line_starts_reader.TokenRangeAtLine(source.Length(), line_number,
+    line_starts_reader.TokenRangeAtLine(source_length, line_number,
                                         first_token_index, last_token_index);
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
     return;
@@ -11152,12 +10681,14 @@
 }
 
 // Invoke the function, or noSuchMethod if it is null.
-static RawObject* InvokeInstanceFunction(const Instance& receiver,
-                                         const Function& function,
-                                         const String& target_name,
-                                         const Array& args,
-                                         const Array& args_descriptor_array,
-                                         bool respect_reflectable) {
+static RawObject* InvokeInstanceFunction(
+    const Instance& receiver,
+    const Function& function,
+    const String& target_name,
+    const Array& args,
+    const Array& args_descriptor_array,
+    bool respect_reflectable,
+    const TypeArguments& instantiator_type_args) {
   // Note "args" is already the internal arguments with the receiver as the
   // first element.
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
@@ -11166,6 +10697,11 @@
     return DartEntry::InvokeNoSuchMethod(receiver, target_name, args,
                                          args_descriptor_array);
   }
+  RawObject* type_error = function.DoArgumentTypesMatch(args, args_descriptor,
+                                                        instantiator_type_args);
+  if (type_error != Error::null()) {
+    return type_error;
+  }
   return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
 
@@ -11227,9 +10763,16 @@
   Object& obj = Object::Handle(LookupLocalOrReExportObject(setter_name));
   const String& internal_setter_name =
       String::Handle(Field::SetterName(setter_name));
-
+  AbstractType& setter_type = AbstractType::Handle();
+  AbstractType& argument_type = AbstractType::Handle(value.GetType(Heap::kOld));
   if (obj.IsField()) {
     const Field& field = Field::Cast(obj);
+    setter_type ^= field.type();
+    if (!argument_type.IsNullType() && !setter_type.IsDynamicType() &&
+        !value.IsInstanceOf(setter_type, Object::null_type_arguments(),
+                            Object::null_type_arguments())) {
+      return ThrowTypeError(field.token_pos(), value, setter_type, setter_name);
+    }
     if (field.is_final() || (respect_reflectable && !field.is_reflectable())) {
       const int kNumArgs = 1;
       const Array& args = Array::Handle(Array::New(kNumArgs));
@@ -11260,6 +10803,13 @@
         InvocationMirror::kTopLevel, InvocationMirror::kSetter);
   }
 
+  setter_type ^= setter.ParameterTypeAt(0);
+  if (!argument_type.IsNullType() && !setter_type.IsDynamicType() &&
+      !value.IsInstanceOf(setter_type, Object::null_type_arguments(),
+                          Object::null_type_arguments())) {
+    return ThrowTypeError(setter.token_pos(), value, setter_type, setter_name);
+  }
+
   return DartEntry::InvokeFunction(setter, args);
 }
 
@@ -11301,7 +10851,7 @@
   const Array& args_descriptor_array = Array::Handle(
       ArgumentsDescriptor::New(kTypeArgsLen, args.Length(), arg_names));
   ArgumentsDescriptor args_descriptor(args_descriptor_array);
-
+  const TypeArguments& type_args = Object::null_type_arguments();
   if (function.IsNull() || !function.AreValidArguments(args_descriptor, NULL) ||
       (respect_reflectable && !function.is_reflectable())) {
     return ThrowNoSuchMethod(
@@ -11309,30 +10859,14 @@
         function_name, args, arg_names, InvocationMirror::kTopLevel,
         InvocationMirror::kMethod);
   }
-
+  RawObject* type_error =
+      function.DoArgumentTypesMatch(args, args_descriptor, type_args);
+  if (type_error != Error::null()) {
+    return type_error;
+  }
   return DartEntry::InvokeFunction(function, args, args_descriptor_array);
 }
 
-RawObject* Library::Evaluate(const String& expr,
-                             const Array& param_names,
-                             const Array& param_values) const {
-  return Evaluate(expr, param_names, param_values, Array::empty_array(),
-                  TypeArguments::null_type_arguments());
-}
-
-RawObject* Library::Evaluate(const String& expr,
-                             const Array& param_names,
-                             const Array& param_values,
-                             const Array& type_param_names,
-                             const TypeArguments& type_param_values) const {
-  ASSERT(kernel_data() == ExternalTypedData::null() ||
-         !FLAG_enable_kernel_expression_compilation);
-  // Evaluate the expression as a static function of the toplevel class.
-  Class& top_level_class = Class::Handle(toplevel_class());
-  ASSERT(top_level_class.is_finalized());
-  return top_level_class.Evaluate(expr, param_names, param_values);
-}
-
 RawObject* Library::EvaluateCompiledExpression(
     const uint8_t* kernel_bytes,
     intptr_t kernel_length,
@@ -11472,11 +11006,6 @@
   return lib.raw();
 }
 
-RawError* Library::Patch(const Script& script) const {
-  ASSERT(script.kind() == RawScript::kPatchTag);
-  return Compiler::Compile(*this, script);
-}
-
 bool Library::IsPrivate(const String& name) {
   if (ShouldBePrivate(name)) return true;
   // Factory names: List._fromLiteral.
@@ -11869,15 +11398,9 @@
             isolate->object_store()->pending_deferred_loads());
     pending_deferred_loads.Add(deferred_lib);
     const String& lib_url = String::Handle(zone, deferred_lib.url());
-    Dart_LibraryTagHandler handler = isolate->library_tag_handler();
-    Object& obj = Object::Handle(zone);
-    {
-      TransitionVMToNative transition(thread);
-      Api::Scope api_scope(thread);
-      obj = Api::UnwrapHandle(handler(Dart_kImportTag,
-                                      Api::NewHandle(thread, importer()),
-                                      Api::NewHandle(thread, lib_url.raw())));
-    }
+    const Object& obj = Object::Handle(
+        zone, isolate->CallTagHandler(
+                  Dart_kImportTag, Library::Handle(zone, importer()), lib_url));
     if (obj.IsError()) {
       Exceptions::PropagateError(Error::Cast(obj));
     }
@@ -12245,6 +11768,8 @@
   Object& key = thread->ObjectHandle();
   Smi& value = thread->SmiHandle();
   {
+    Isolate* isolate = thread->isolate();
+    SafepointMutexLocker ml(isolate->kernel_data_lib_cache_mutex());
     data ^= libraries_cache();
     ASSERT(!data.IsNull());
     IntHashMap table(&key, &value, &data);
@@ -12266,13 +11791,6 @@
   Object& key = thread->ObjectHandle();
   Smi& value = thread->SmiHandle();
   {
-    data ^= libraries_cache();
-    ASSERT(!data.IsNull());
-    IntHashMap table(&key, &value, &data);
-    result ^= table.GetOrNull(name_index);
-    table.Release();
-  }
-  if (result.IsNull()) {
     Isolate* isolate = thread->isolate();
     SafepointMutexLocker ml(isolate->kernel_data_lib_cache_mutex());
     data ^= libraries_cache();
@@ -12299,6 +11817,8 @@
   Object& key = thread->ObjectHandle();
   Smi& value = thread->SmiHandle();
   {
+    Isolate* isolate = thread->isolate();
+    SafepointMutexLocker ml(isolate->kernel_data_class_cache_mutex());
     data ^= classes_cache();
     ASSERT(!data.IsNull());
     IntHashMap table(&key, &value, &data);
@@ -12320,13 +11840,6 @@
   Object& key = thread->ObjectHandle();
   Smi& value = thread->SmiHandle();
   {
-    data ^= classes_cache();
-    ASSERT(!data.IsNull());
-    IntHashMap table(&key, &value, &data);
-    result ^= table.GetOrNull(name_index);
-    table.Release();
-  }
-  if (result.IsNull()) {
     Isolate* isolate = thread->isolate();
     SafepointMutexLocker ml(isolate->kernel_data_class_cache_mutex());
     data ^= classes_cache();
@@ -12338,6 +11851,11 @@
   return result.raw();
 }
 
+void KernelProgramInfo::set_bytecode_component(
+    const Array& bytecode_component) const {
+  StorePointer(&raw_ptr()->bytecode_component_, bytecode_component.raw());
+}
+
 RawError* Library::CompileAll(bool ignore_error /* = false */) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
@@ -12503,7 +12021,7 @@
     CHECK_FINGERPRINT3(func, class_name, function_name, dest, fp);             \
   }
 
-#define CHECK_FINGERPRINTS2(class_name, function_name, dest, type, fp)         \
+#define CHECK_FINGERPRINTS2(class_name, function_name, dest, fp)               \
   CHECK_FINGERPRINTS(class_name, function_name, dest, fp)
 
   all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
@@ -12598,26 +12116,6 @@
   }
 }
 
-// Decode integer in SLEB128 format from |data| and update |byte_index|.
-static intptr_t DecodeSLEB128(const uint8_t* data,
-                              const intptr_t data_length,
-                              intptr_t* byte_index) {
-  ASSERT(*byte_index < data_length);
-  uword shift = 0;
-  intptr_t value = 0;
-  uint8_t part = 0;
-  do {
-    part = data[(*byte_index)++];
-    value |= static_cast<intptr_t>(part & 0x7f) << shift;
-    shift += 7;
-  } while ((part & 0x80) != 0);
-
-  if ((shift < (sizeof(value) * 8)) && ((part & 0x40) != 0)) {
-    value |= static_cast<intptr_t>(kUwordMax << shift);
-  }
-  return value;
-}
-
 // Encode integer in SLEB128 format.
 void PcDescriptors::EncodeInteger(GrowableArray<uint8_t>* data,
                                   intptr_t value) {
@@ -12628,7 +12126,7 @@
 intptr_t PcDescriptors::DecodeInteger(intptr_t* byte_index) const {
   NoSafepointScope no_safepoint;
   const uint8_t* data = raw_ptr()->data();
-  return DecodeSLEB128(data, Length(), byte_index);
+  return Utils::DecodeSLEB128(data, Length(), byte_index);
 }
 
 RawObjectPool* ObjectPool::New(intptr_t len) {
@@ -13404,7 +12902,8 @@
 
 void ICData::set_ic_data_array(const Array& value) const {
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->ic_data_, value.raw());
+  StorePointer<RawArray*, MemoryOrder::kRelease>(&raw_ptr()->ic_data_,
+                                                 value.raw());
 }
 
 #if defined(TAG_IC_DATA)
@@ -13538,6 +13037,11 @@
 #if defined(DEBUG)
 // Used in asserts to verify that a check is not added twice.
 bool ICData::HasCheck(const GrowableArray<intptr_t>& cids) const {
+  return FindCheck(cids) != -1;
+}
+#endif  // DEBUG
+
+intptr_t ICData::FindCheck(const GrowableArray<intptr_t>& cids) const {
   const intptr_t len = NumberOfChecks();
   for (intptr_t i = 0; i < len; i++) {
     GrowableArray<intptr_t> class_ids;
@@ -13551,12 +13055,11 @@
       }
     }
     if (matches) {
-      return true;
+      return i;
     }
   }
-  return false;
+  return -1;
 }
-#endif  // DEBUG
 
 void ICData::WriteSentinelAt(intptr_t index) const {
   const intptr_t len = Length();
@@ -13576,45 +13079,6 @@
   SetCountAt(index, 0);
 }
 
-void ICData::ClearWithSentinel() const {
-  if (IsImmutable()) {
-    return;
-  }
-  // Write the sentinel value into all entries except the first one.
-  const intptr_t len = Length();
-  if (len == 0) {
-    return;
-  }
-  // The final entry is always the sentinel.
-  ASSERT(IsSentinelAt(len - 1));
-  for (intptr_t i = len - 1; i > 0; i--) {
-    WriteSentinelAt(i);
-  }
-  if (NumArgsTested() != 2) {
-    // Not the smi fast path case, write sentinel to first one and exit.
-    WriteSentinelAt(0);
-    return;
-  }
-  if (IsSentinelAt(0)) {
-    return;
-  }
-  Zone* zone = Thread::Current()->zone();
-  const String& name = String::Handle(target_name());
-  const Class& smi_class = Class::Handle(Smi::Class());
-  const Function& smi_op_target =
-      Function::Handle(Resolver::ResolveDynamicAnyArgs(zone, smi_class, name));
-  GrowableArray<intptr_t> class_ids(2);
-  Function& target = Function::Handle();
-  GetCheckAt(0, &class_ids, &target);
-  if ((target.raw() == smi_op_target.raw()) && (class_ids[0] == kSmiCid) &&
-      (class_ids[1] == kSmiCid)) {
-    // The smi fast path case, preserve the initial entry but reset the count.
-    ClearCountAt(0);
-    return;
-  }
-  WriteSentinelAt(0);
-}
-
 void ICData::ClearAndSetStaticTarget(const Function& func) const {
   if (IsImmutable()) {
     return;
@@ -13786,7 +13250,7 @@
     }
   }
   intptr_t index = -1;
-  data = FindFreeIndex(&index);
+  data = Grow(&index);
   ASSERT(!data.IsNull());
   intptr_t data_pos = index * TestEntryLength();
   Smi& value = Smi::Handle();
@@ -13805,26 +13269,14 @@
   set_ic_data_array(data);
 }
 
-RawArray* ICData::FindFreeIndex(intptr_t* index) const {
-  // The final entry is always the sentinel value, don't consider it
-  // when searching.
-  const intptr_t len = Length() - 1;
+RawArray* ICData::Grow(intptr_t* index) const {
   Array& data = Array::Handle(ic_data());
-  *index = len;
-  for (intptr_t i = 0; i < len; i++) {
-    if (IsSentinelAt(i)) {
-      *index = i;
-      break;
-    }
-  }
-  if (*index < len) {
-    // We've found a free slot.
-    return data.raw();
-  }
-  // Append case.
-  ASSERT(*index == len);
+  // Last entry in array should be a sentinel and will be the new entry
+  // that can be updated after growing.
+  *index = Length() - 1;
   ASSERT(*index >= 0);
-  // Grow array.
+  ASSERT(IsSentinelAt(*index));
+  // Grow the array and write the new final sentinel into place.
   const intptr_t new_len = data.Length() + TestEntryLength();
   data = Array::Grow(data, new_len, Heap::kOld);
   WriteSentinel(data, TestEntryLength());
@@ -13864,7 +13316,7 @@
   ASSERT(receiver_class_id != kIllegalCid);
 
   intptr_t index = -1;
-  Array& data = Array::Handle(FindFreeIndex(&index));
+  Array& data = Array::Handle(Grow(&index));
   intptr_t data_pos = index * TestEntryLength();
   if ((receiver_class_id == kSmiCid) && (data_pos > 0)) {
     ASSERT(GetReceiverClassIdAt(0) != kSmiCid);
@@ -14523,13 +13975,25 @@
   // FlowGraphCompiler::AddStaticCallTarget adds pc-offsets to the table while
   // emitting assembly. This guarantees that every succeeding pc-offset is
   // larger than the previously added one.
-  for (intptr_t i = kSCallTableEntryLength; i < value.Length();
-       i += kSCallTableEntryLength) {
-    ASSERT(value.At(i - kSCallTableEntryLength) < value.At(i));
+  StaticCallsTable entries(value);
+  const intptr_t count = entries.Length();
+  for (intptr_t i = 0; i < count - 1; ++i) {
+    auto left = Smi::Value(entries[i].Get<kSCallTableKindAndOffset>());
+    auto right = Smi::Value(entries[i + 1].Get<kSCallTableKindAndOffset>());
+    ASSERT(OffsetField::decode(left) < OffsetField::decode(right));
   }
 #endif  // DEBUG
 }
 
+RawObjectPool* Code::GetObjectPool() const {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  if (FLAG_use_bare_instructions) {
+    return Isolate::Current()->object_store()->global_object_pool();
+  }
+#endif
+  return object_pool();
+}
+
 bool Code::HasBreakpoint() const {
 #if defined(PRODUCT)
   return false;
@@ -14578,19 +14042,20 @@
 #else
   NoSafepointScope no_safepoint;
   const Array& table = Array::Handle(raw_ptr()->static_calls_target_table_);
-  RawObject* key = reinterpret_cast<RawObject*>(Smi::New(pc - PayloadStart()));
+  StaticCallsTable entries(table);
+  const intptr_t pc_offset = pc - PayloadStart();
   intptr_t imin = 0;
-  intptr_t imax = table.Length() / kSCallTableEntryLength;
+  intptr_t imax = (table.Length() / kSCallTableEntryLength) - 1;
   while (imax >= imin) {
-    const intptr_t imid = ((imax - imin) / 2) + imin;
-    const intptr_t real_index = imid * kSCallTableEntryLength;
-    RawObject* key_in_table = table.At(real_index);
-    if (key_in_table < key) {
+    const intptr_t imid = imin + (imax - imin) / 2;
+    const auto offset = OffsetField::decode(
+        Smi::Value(entries[imid].Get<kSCallTableKindAndOffset>()));
+    if (offset < pc_offset) {
       imin = imid + 1;
-    } else if (key_in_table > key) {
+    } else if (offset > pc_offset) {
       imax = imid - 1;
     } else {
-      return real_index;
+      return imid;
     }
   }
 #endif
@@ -14607,9 +14072,8 @@
     return Function::null();
   }
   const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
-  Function& function = Function::Handle();
-  function ^= array.At(i + kSCallTableFunctionEntry);
-  return function.raw();
+  StaticCallsTable entries(array);
+  return entries[i].Get<kSCallTableFunctionTarget>();
 #endif
 }
 
@@ -14623,9 +14087,8 @@
     return Code::null();
   }
   const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
-  Code& code = Code::Handle();
-  code ^= array.At(i + kSCallTableCodeEntry);
-  return code.raw();
+  StaticCallsTable entries(array);
+  return entries[i].Get<kSCallTableCodeTarget>();
 #endif
 }
 
@@ -14636,9 +14099,10 @@
   const intptr_t i = BinarySearchInSCallTable(pc);
   ASSERT(i >= 0);
   const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
+  StaticCallsTable entries(array);
   ASSERT(code.IsNull() ||
-         (code.function() == array.At(i + kSCallTableFunctionEntry)));
-  array.SetAt(i + kSCallTableCodeEntry, code);
+         (code.function() == entries[i].Get<kSCallTableFunctionTarget>()));
+  return entries[i].Set<kSCallTableCodeTarget>(code);
 #endif
 }
 
@@ -14649,20 +14113,21 @@
   const intptr_t i = BinarySearchInSCallTable(pc);
   ASSERT(i >= 0);
   const Array& array = Array::Handle(raw_ptr()->static_calls_target_table_);
+  StaticCallsTable entries(array);
 #if defined(DEBUG)
-  if (array.At(i + kSCallTableFunctionEntry) == Function::null()) {
+  if (entries[i].Get<kSCallTableFunctionTarget>() == Function::null()) {
     ASSERT(!code.IsNull() && Object::Handle(code.owner()).IsClass());
   } else {
     ASSERT(code.IsNull() ||
-           (code.function() == array.At(i + kSCallTableFunctionEntry)));
+           (code.function() == entries[i].Get<kSCallTableFunctionTarget>()));
   }
 #endif
-  array.SetAt(i + kSCallTableCodeEntry, code);
+  return entries[i].Set<kSCallTableCodeTarget>(code);
 #endif
 }
 
 void Code::Disassemble(DisassemblyFormatter* formatter) const {
-#if !defined(PRODUCT)
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
   if (!FLAG_support_disassembler) {
     return;
   }
@@ -14673,7 +14138,7 @@
   } else {
     Disassembler::Disassemble(start, start + instr.Size(), formatter, *this);
   }
-#endif
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 }
 
 const Code::Comments& Code::comments() const {
@@ -14779,6 +14244,7 @@
 RawCode* Code::FinalizeCode(const char* name,
                             FlowGraphCompiler* compiler,
                             Assembler* assembler,
+                            PoolAttachment pool_attachment,
                             bool optimized,
                             CodeStatistics* stats /* = nullptr */) {
   Isolate* isolate = Isolate::Current();
@@ -14787,8 +14253,10 @@
   }
 
   ASSERT(assembler != NULL);
-  const ObjectPool& object_pool =
-      ObjectPool::Handle(assembler->object_pool_wrapper().MakeObjectPool());
+  const auto object_pool =
+      pool_attachment == PoolAttachment::kAttachPool
+          ? &ObjectPool::Handle(assembler->MakeObjectPool())
+          : nullptr;
 
   // Allocate the Code and Instructions objects.  Code is allocated first
   // because a GC during allocation of the code will leave the instruction
@@ -14839,7 +14307,9 @@
     code.set_is_alive(true);
 
     // Set object pool in Instructions object.
-    code.set_object_pool(object_pool.raw());
+    if (pool_attachment == PoolAttachment::kAttachPool) {
+      code.set_object_pool(object_pool->raw());
+    }
 
     if (FLAG_write_protect_code) {
       uword address = RawObject::ToAddr(instrs.raw());
@@ -14879,6 +14349,7 @@
 RawCode* Code::FinalizeCode(const Function& function,
                             FlowGraphCompiler* compiler,
                             Assembler* assembler,
+                            PoolAttachment pool_attachment,
                             bool optimized /* = false */,
                             CodeStatistics* stats /* = nullptr */) {
 // Calling ToLibNamePrefixedQualifiedCString is very expensive,
@@ -14886,64 +14357,11 @@
 #ifndef PRODUCT
   if (CodeObservers::AreActive()) {
     return FinalizeCode(function.ToLibNamePrefixedQualifiedCString(), compiler,
-                        assembler, optimized, stats);
+                        assembler, pool_attachment, optimized, stats);
   }
 #endif  // !PRODUCT
-  return FinalizeCode("", compiler, assembler, optimized, stats);
-}
-
-RawCode* Code::FinalizeBytecode(const void* bytecode_data,
-                                intptr_t bytecode_size,
-                                const ObjectPool& object_pool,
-                                CodeStatistics* stats /* = nullptr */) {
-  // Allocate the Code and Instructions objects.  Code is allocated first
-  // because a GC during allocation of the code will leave the instruction
-  // pages read-only.
-  const intptr_t pointer_offset_count = 0;  // No fixups in bytecode.
-  Code& code = Code::ZoneHandle(Code::New(pointer_offset_count));
-  Instructions& instrs = Instructions::ZoneHandle(
-      Instructions::New(bytecode_size, true /* has_single_entry_point */, 0));
-
-  // Copy the bytecode data into the instruction area. No fixups to apply.
-  MemoryRegion instrs_region(reinterpret_cast<void*>(instrs.PayloadStart()),
-                             instrs.Size());
-  MemoryRegion bytecode_region(const_cast<void*>(bytecode_data), bytecode_size);
-  // TODO(regis): Avoid copying bytecode.
-  instrs_region.CopyFrom(0, bytecode_region);
-
-  // TODO(regis): Keep following lines or not?
-  // TODO(regis): Do we need to notify CodeObservers for bytecode too?
-  // If so, provide a better name using ToLibNamePrefixedQualifiedCString().
-#ifndef PRODUCT
-  code.set_compile_timestamp(OS::GetCurrentMonotonicMicros());
-  CodeObservers::NotifyAll("bytecode", instrs.PayloadStart(),
-                           0 /* prologue_offset */, instrs.Size(),
-                           false /* optimized */, nullptr);
-#endif
-  {
-    NoSafepointScope no_safepoint;
-
-    // Hook up Code and Instructions objects.
-    code.SetActiveInstructions(instrs);
-    code.set_instructions(instrs);
-    code.set_is_alive(true);
-
-    // Set object pool in Instructions object.
-    code.set_object_pool(object_pool.raw());
-
-    if (FLAG_write_protect_code) {
-      uword address = RawObject::ToAddr(instrs.raw());
-      VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                             instrs.raw()->Size(), VirtualMemory::kReadExecute);
-    }
-  }
-#ifndef PRODUCT
-  // No Code::Comments to set. Default is 0 length Comments.
-  // No prologue was ever entered, optimistically assume nothing was ever
-  // pushed onto the stack.
-  code.SetPrologueOffset(bytecode_size);  // TODO(regis): Correct?
-#endif
-  return code.raw();
+  return FinalizeCode("", compiler, assembler, pool_attachment, optimized,
+                      stats);
 }
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -15041,7 +14459,7 @@
     // Regular stub.
     const char* name = StubCode::NameOfStub(EntryPoint());
     if (name == NULL) {
-      return zone->PrintToString("[this stub]");  // Not yet recorded.
+      return zone->PrintToString("[unknown stub]");  // Not yet recorded.
     }
     return zone->PrintToString("[Stub] %s", name);
   } else if (obj.IsClass()) {
@@ -15052,10 +14470,10 @@
   } else {
     ASSERT(obj.IsFunction());
     // Dart function.
-    const char* opt = is_optimized() ? "*" : "";
+    const char* opt = is_optimized() ? "[Optimized]" : "[Unoptimized]";
     const char* function_name =
         String::Handle(zone, Function::Cast(obj).UserVisibleName()).ToCString();
-    return zone->PrintToString("%s%s", opt, function_name);
+    return zone->PrintToString("%s %s", opt, function_name);
   }
 }
 
@@ -15063,11 +14481,11 @@
   Zone* zone = Thread::Current()->zone();
   const Object& obj = Object::Handle(zone, owner());
   if (obj.IsFunction()) {
-    const char* opt = is_optimized() ? "*" : "";
+    const char* opt = is_optimized() ? "[Optimized]" : "[Unoptimized]";
     const char* function_name =
         String::Handle(zone, Function::Cast(obj).QualifiedScrubbedName())
             .ToCString();
-    return zone->PrintToString("%s%s", opt, function_name);
+    return zone->PrintToString("%s %s", opt, function_name);
   }
   return Name();
 }
@@ -15091,8 +14509,7 @@
   DEBUG_ASSERT(IsMutatorOrAtSafepoint());
   ASSERT(IsFunctionCode());
   ASSERT(instructions() == active_instructions());
-  const Code& new_code =
-      Code::Handle(StubCode::FixCallersTarget_entry()->code());
+  const Code& new_code = StubCode::FixCallersTarget();
   SetActiveInstructions(Instructions::Handle(new_code.instructions()));
   StoreNonPointer(&raw_ptr()->unchecked_entry_point_, raw_ptr()->entry_point_);
 }
@@ -15102,8 +14519,7 @@
   ASSERT(Thread::Current()->IsMutatorThread());
   ASSERT(IsAllocationStubCode());
   ASSERT(instructions() == active_instructions());
-  const Code& new_code =
-      Code::Handle(StubCode::FixAllocationStubTarget_entry()->code());
+  const Code& new_code = StubCode::FixAllocationStubTarget();
   SetActiveInstructions(Instructions::Handle(new_code.instructions()));
   StoreNonPointer(&raw_ptr()->unchecked_entry_point_, raw_ptr()->entry_point_);
 #else
@@ -15126,6 +14542,9 @@
                   Instructions::MonomorphicEntryPoint(instructions.raw()));
   StoreNonPointer(&raw_ptr()->unchecked_entry_point_,
                   Instructions::UncheckedEntryPoint(instructions.raw()));
+  StoreNonPointer(
+      &raw_ptr()->monomorphic_unchecked_entry_point_,
+      Instructions::MonomorphicUncheckedEntryPoint(instructions.raw()));
 #endif
 }
 
@@ -15221,6 +14640,134 @@
 #endif
 }
 
+void Bytecode::set_instructions(const ExternalTypedData& instructions) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  ASSERT(Thread::Current()->IsMutatorThread());
+  // The interpreter requires the instructions to be aligned.
+  ASSERT(Utils::IsAligned(instructions.DataAddr(0), sizeof(KBCInstr)));
+  StorePointer(&raw_ptr()->instructions_, instructions.raw());
+#else
+  UNREACHABLE();
+#endif
+}
+
+uword Bytecode::PayloadStart() const {
+  const ExternalTypedData& instr = ExternalTypedData::Handle(instructions());
+  return reinterpret_cast<uword>(instr.DataAddr(0));
+}
+
+intptr_t Bytecode::Size() const {
+  const ExternalTypedData& instr = ExternalTypedData::Handle(instructions());
+  return instr.LengthInBytes();
+}
+
+void Bytecode::Disassemble(DisassemblyFormatter* formatter) const {
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  if (!FLAG_support_disassembler) {
+    return;
+  }
+  uword start = PayloadStart();
+  intptr_t size = Size();
+  if (formatter == NULL) {
+    KernelBytecodeDisassembler::Disassemble(start, start + size, *this);
+  } else {
+    KernelBytecodeDisassembler::Disassemble(start, start + size, formatter,
+                                            *this);
+  }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
+}
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+RawBytecode* Bytecode::New(const ExternalTypedData& instructions,
+                           const ObjectPool& object_pool) {
+  ASSERT(Object::bytecode_class() != Class::null());
+  Bytecode& result = Bytecode::Handle();
+  {
+    uword size = Bytecode::InstanceSize();
+    RawObject* raw = Object::Allocate(Bytecode::kClassId, size, Heap::kOld);
+    NoSafepointScope no_safepoint;
+    result ^= raw;
+    result.set_pc_descriptors(Object::empty_descriptors());
+    result.set_instructions(instructions);
+    result.set_object_pool(object_pool);
+    result.set_source_positions_binary_offset(0);
+  }
+  return result.raw();
+}
+#endif
+
+RawExternalTypedData* Bytecode::GetBinary(Zone* zone) const {
+  const Function& func = Function::Handle(zone, function());
+  const Script& script = Script::Handle(zone, func.script());
+  const KernelProgramInfo& info =
+      KernelProgramInfo::Handle(zone, script.kernel_program_info());
+  return info.metadata_payloads();
+}
+
+TokenPosition Bytecode::GetTokenIndexOfPC(uword pc) const {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  UNREACHABLE();
+#else
+  if (!HasSourcePositions()) {
+    return TokenPosition::kNoSource;
+  }
+  uword pc_offset = pc - PayloadStart();
+  // PC could equal to bytecode size if the last instruction is Throw.
+  ASSERT(pc_offset <= static_cast<uword>(Size()));
+  kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
+                                               *this);
+  TokenPosition token_pos = TokenPosition::kNoSource;
+  while (iter.MoveNext()) {
+    if (pc_offset < iter.PcOffset()) {
+      break;
+    }
+    token_pos = iter.TokenPos();
+  }
+  return token_pos;
+#endif
+}
+
+const char* Bytecode::ToCString() const {
+  return Thread::Current()->zone()->PrintToString("Bytecode(%s)",
+                                                  QualifiedName());
+}
+
+const char* Bytecode::Name() const {
+  Zone* zone = Thread::Current()->zone();
+  const Function& fun = Function::Handle(zone, function());
+  ASSERT(!fun.IsNull());
+  const char* function_name =
+      String::Handle(zone, fun.UserVisibleName()).ToCString();
+  return zone->PrintToString("[Bytecode] %s", function_name);
+}
+
+const char* Bytecode::QualifiedName() const {
+  Zone* zone = Thread::Current()->zone();
+  const Function& fun = Function::Handle(zone, function());
+  ASSERT(!fun.IsNull());
+  const char* function_name =
+      String::Handle(zone, fun.QualifiedScrubbedName()).ToCString();
+  return zone->PrintToString("[Bytecode] %s", function_name);
+}
+
+bool Bytecode::SlowFindRawBytecodeVisitor::FindObject(
+    RawObject* raw_obj) const {
+  return RawBytecode::ContainsPC(raw_obj, pc_);
+}
+
+RawBytecode* Bytecode::FindCode(uword pc) {
+  Thread* thread = Thread::Current();
+  HeapIterationScope heap_iteration_scope(thread);
+  SlowFindRawBytecodeVisitor visitor(pc);
+  RawObject* needle = thread->heap()->FindOldObject(&visitor);
+  if (needle != Bytecode::null()) {
+    return static_cast<RawBytecode*>(needle);
+  }
+  return Bytecode::null();
+}
+
 RawContext* Context::New(intptr_t num_variables, Heap::Space space) {
   ASSERT(num_variables >= 0);
   ASSERT(Object::context_class() != Class::null());
@@ -15502,8 +15049,8 @@
     const Array& new_buckets =
         Array::Handle(Array::New(kEntryLength * new_capacity));
 
-    Function& target = Function::Handle(
-        MegamorphicCacheTable::miss_handler(Isolate::Current()));
+    auto& target =
+        Object::Handle(MegamorphicCacheTable::miss_handler(Isolate::Current()));
     for (intptr_t i = 0; i < new_capacity; ++i) {
       SetEntry(new_buckets, i, smi_illegal_cid(), target);
     }
@@ -15516,15 +15063,14 @@
     for (intptr_t i = 0; i < old_capacity; ++i) {
       class_id ^= GetClassId(old_buckets, i);
       if (class_id.Value() != kIllegalCid) {
-        target ^= GetTargetFunction(old_buckets, i);
+        target = GetTargetFunction(old_buckets, i);
         Insert(class_id, target);
       }
     }
   }
 }
 
-void MegamorphicCache::Insert(const Smi& class_id,
-                              const Function& target) const {
+void MegamorphicCache::Insert(const Smi& class_id, const Object& target) const {
   ASSERT(static_cast<double>(filled_entry_count() + 1) <=
          (kLoadFactor * static_cast<double>(mask() + 1)));
   const Array& backing_array = Array::Handle(buckets());
@@ -15548,6 +15094,23 @@
                      name.ToCString());
 }
 
+void MegamorphicCache::SwitchToBareInstructions() {
+  NoSafepointScope no_safepoint_scope;
+
+  intptr_t capacity = mask() + 1;
+  for (intptr_t i = 0; i < capacity; ++i) {
+    const intptr_t target_index = i * kEntryLength + kTargetFunctionIndex;
+    RawObject** slot = &Array::DataOf(buckets())[target_index];
+    const intptr_t cid = (*slot)->GetClassIdMayBeSmi();
+    if (cid == kFunctionCid) {
+      RawCode* code = Function::CurrentCodeOf(Function::RawCast(*slot));
+      *slot = Smi::FromAlignedAddress(Code::EntryPoint(code));
+    } else {
+      ASSERT(cid == kSmiCid);
+    }
+  }
+}
+
 RawSubtypeTestCache* SubtypeTestCache::New() {
   ASSERT(Object::subtypetestcache_class() != Class::null());
   SubtypeTestCache& result = SubtypeTestCache::Handle();
@@ -15588,18 +15151,18 @@
   intptr_t new_len = data.Length() + kTestEntryLength;
   data = Array::Grow(data, new_len);
   set_cache(data);
-  intptr_t data_pos = old_num * kTestEntryLength;
-  data.SetAt(data_pos + kInstanceClassIdOrFunction,
-             instance_class_id_or_function);
-  data.SetAt(data_pos + kInstanceTypeArguments, instance_type_arguments);
-  data.SetAt(data_pos + kInstantiatorTypeArguments,
-             instantiator_type_arguments);
-  data.SetAt(data_pos + kFunctionTypeArguments, function_type_arguments);
-  data.SetAt(data_pos + kInstanceParentFunctionTypeArguments,
-             instance_parent_function_type_arguments);
-  data.SetAt(data_pos + kInstanceDelayedFunctionTypeArguments,
-             instance_delayed_type_arguments);
-  data.SetAt(data_pos + kTestResult, test_result);
+
+  SubtypeTestCacheTable entries(data);
+  auto entry = entries[old_num];
+  entry.Set<kInstanceClassIdOrFunction>(instance_class_id_or_function);
+  entry.Set<kInstanceTypeArguments>(instance_type_arguments);
+  entry.Set<kInstantiatorTypeArguments>(instantiator_type_arguments);
+  entry.Set<kFunctionTypeArguments>(function_type_arguments);
+  entry.Set<kInstanceParentFunctionTypeArguments>(
+      instance_parent_function_type_arguments);
+  entry.Set<kInstanceDelayedFunctionTypeArguments>(
+      instance_delayed_type_arguments);
+  entry.Set<kTestResult>(test_result);
 }
 
 void SubtypeTestCache::GetCheck(
@@ -15612,18 +15175,17 @@
     TypeArguments* instance_delayed_type_arguments,
     Bool* test_result) const {
   Array& data = Array::Handle(cache());
-  intptr_t data_pos = ix * kTestEntryLength;
-  *instance_class_id_or_function =
-      data.At(data_pos + kInstanceClassIdOrFunction);
-  *instance_type_arguments ^= data.At(data_pos + kInstanceTypeArguments);
-  *instantiator_type_arguments ^=
-      data.At(data_pos + kInstantiatorTypeArguments);
-  *function_type_arguments ^= data.At(data_pos + kFunctionTypeArguments);
+  SubtypeTestCacheTable entries(data);
+  auto entry = entries[ix];
+  *instance_class_id_or_function = entry.Get<kInstanceClassIdOrFunction>();
+  *instance_type_arguments ^= entry.Get<kInstanceTypeArguments>();
+  *instantiator_type_arguments ^= entry.Get<kInstantiatorTypeArguments>();
+  *function_type_arguments ^= entry.Get<kFunctionTypeArguments>();
   *instance_parent_function_type_arguments ^=
-      data.At(data_pos + kInstanceParentFunctionTypeArguments);
+      entry.Get<kInstanceParentFunctionTypeArguments>();
   *instance_delayed_type_arguments ^=
-      data.At(data_pos + kInstanceDelayedFunctionTypeArguments);
-  *test_result ^= data.At(data_pos + kTestResult);
+      entry.Get<kInstanceDelayedFunctionTypeArguments>();
+  *test_result ^= entry.Get<kTestResult>();
 }
 
 const char* SubtypeTestCache::ToCString() const {
@@ -15922,6 +15484,10 @@
   Zone* zone = Thread::Current()->zone();
 
   Class& klass = Class::Handle(zone, clazz());
+  TypeArguments& type_args = TypeArguments::Handle(zone);
+  if (klass.NumTypeArguments() > 0) {
+    type_args ^= GetTypeArguments();
+  }
 
   const String& internal_getter_name =
       String::Handle(zone, Field::GetterName(getter_name));
@@ -15946,7 +15512,8 @@
       zone, ArgumentsDescriptor::New(kTypeArgsLen, args.Length()));
 
   return InvokeInstanceFunction(*this, function, internal_getter_name, args,
-                                args_descriptor, respect_reflectable);
+                                args_descriptor, respect_reflectable,
+                                type_args);
 }
 
 RawObject* Instance::InvokeSetter(const String& setter_name,
@@ -15955,6 +15522,11 @@
   Zone* zone = Thread::Current()->zone();
 
   const Class& klass = Class::Handle(zone, clazz());
+  TypeArguments& type_args = TypeArguments::Handle(zone);
+  if (klass.NumTypeArguments() > 0) {
+    type_args ^= GetTypeArguments();
+  }
+
   const String& internal_setter_name =
       String::Handle(zone, Field::SetterName(setter_name));
   const Function& setter = Function::Handle(
@@ -15969,7 +15541,8 @@
       zone, ArgumentsDescriptor::New(kTypeArgsLen, args.Length()));
 
   return InvokeInstanceFunction(*this, setter, internal_setter_name, args,
-                                args_descriptor, respect_reflectable);
+                                args_descriptor, respect_reflectable,
+                                type_args);
 }
 
 RawObject* Instance::Invoke(const String& function_name,
@@ -15986,6 +15559,11 @@
   const Array& args_descriptor = Array::Handle(
       zone, ArgumentsDescriptor::New(kTypeArgsLen, args.Length(), arg_names));
 
+  TypeArguments& type_args = TypeArguments::Handle(zone);
+  if (klass.NumTypeArguments() > 0) {
+    type_args ^= GetTypeArguments();
+  }
+
   if (function.IsNull()) {
     // Didn't find a method: try to find a getter and invoke call on its result.
     const String& getter_name =
@@ -16000,9 +15578,9 @@
       const Array& getter_args_descriptor = Array::Handle(
           zone, ArgumentsDescriptor::New(kTypeArgsLen, getter_args.Length()));
       const Object& getter_result = Object::Handle(
-          zone,
-          InvokeInstanceFunction(*this, function, getter_name, getter_args,
-                                 getter_args_descriptor, respect_reflectable));
+          zone, InvokeInstanceFunction(*this, function, getter_name,
+                                       getter_args, getter_args_descriptor,
+                                       respect_reflectable, type_args));
       if (getter_result.IsError()) {
         return getter_result.raw();
       }
@@ -16015,37 +15593,8 @@
 
   // Found an ordinary method.
   return InvokeInstanceFunction(*this, function, function_name, args,
-                                args_descriptor, respect_reflectable);
-}
-
-RawObject* Instance::Evaluate(const Class& method_cls,
-                              const String& expr,
-                              const Array& param_names,
-                              const Array& param_values) const {
-  return Evaluate(method_cls, expr, param_names, param_values,
-                  Object::empty_array(), TypeArguments::null_type_arguments());
-}
-
-RawObject* Instance::Evaluate(const Class& method_cls,
-                              const String& expr,
-                              const Array& param_names,
-                              const Array& param_values,
-                              const Array& type_param_names,
-                              const TypeArguments& type_param_values) const {
-  const Array& args = Array::Handle(Array::New(1 + param_values.Length()));
-  PassiveObject& param = PassiveObject::Handle();
-  args.SetAt(0, *this);
-  for (intptr_t i = 0; i < param_values.Length(); i++) {
-    param = param_values.At(i);
-    args.SetAt(i + 1, param);
-  }
-
-  const Library& library = Library::Handle(method_cls.library());
-  ASSERT(library.kernel_data() == ExternalTypedData::null() ||
-         !FLAG_enable_kernel_expression_compilation);
-  const Function& eval_func = Function::Handle(
-      Function::EvaluateHelper(method_cls, expr, param_names, false));
-  return DartEntry::InvokeFunction(eval_func, args);
+                                args_descriptor, respect_reflectable,
+                                type_args);
 }
 
 RawObject* Instance::EvaluateCompiledExpression(
@@ -16257,7 +15806,7 @@
   }
   Type& type = Type::Handle();
   if (!cls.IsGeneric()) {
-    type = cls.CanonicalType();
+    type = cls.DeclarationType();
   }
   if (type.IsNull()) {
     TypeArguments& type_arguments = TypeArguments::Handle();
@@ -16272,6 +15821,7 @@
 }
 
 RawTypeArguments* Instance::GetTypeArguments() const {
+  ASSERT(!IsType());
   const Class& cls = Class::Handle(clazz());
   intptr_t field_offset = cls.type_arguments_field_offset();
   ASSERT(field_offset != Class::kNoTypeArguments);
@@ -16281,6 +15831,7 @@
 }
 
 void Instance::SetTypeArguments(const TypeArguments& value) const {
+  ASSERT(!IsType());
   ASSERT(value.IsNull() || value.IsCanonical());
   const Class& cls = Class::Handle(clazz());
   intptr_t field_offset = cls.type_arguments_field_offset();
@@ -16291,13 +15842,10 @@
 bool Instance::IsInstanceOf(
     const AbstractType& other,
     const TypeArguments& other_instantiator_type_arguments,
-    const TypeArguments& other_function_type_arguments,
-    Error* bound_error) const {
+    const TypeArguments& other_function_type_arguments) const {
   ASSERT(other.IsFinalized());
   ASSERT(!other.IsDynamicType());
   ASSERT(!other.IsTypeRef());  // Must be dereferenced at compile time.
-  ASSERT(!other.IsMalformed());
-  ASSERT(!other.IsMalbounded());
   if (other.IsVoidType()) {
     return true;
   }
@@ -16314,11 +15862,7 @@
     if (!other.IsInstantiated()) {
       instantiated_other = other.InstantiateFrom(
           other_instantiator_type_arguments, other_function_type_arguments,
-          kAllFree, bound_error, NULL, NULL, Heap::kOld);
-      if ((bound_error != NULL) && !bound_error->IsNull()) {
-        ASSERT(Isolate::Current()->type_checks());
-        return false;
-      }
+          kAllFree, NULL, Heap::kOld);
       if (instantiated_other.IsTypeRef()) {
         instantiated_other = TypeRef::Cast(instantiated_other).type();
       }
@@ -16327,8 +15871,7 @@
         return true;
       }
     }
-    if (FLAG_strong &&
-        IsFutureOrInstanceOf(zone, instantiated_other, bound_error)) {
+    if (IsFutureOrInstanceOf(zone, instantiated_other)) {
       return true;
     }
     if (!instantiated_other.IsFunctionType()) {
@@ -16338,7 +15881,7 @@
         Function::Handle(zone, Type::Cast(instantiated_other).signature());
     const Function& sig_fun =
         Function::Handle(Closure::Cast(*this).GetInstantiatedSignature(zone));
-    return sig_fun.IsSubtypeOf(other_signature, bound_error, NULL, Heap::kOld);
+    return sig_fun.IsSubtypeOf(other_signature, Heap::kOld);
   }
   TypeArguments& type_arguments = TypeArguments::Handle(zone);
   if (cls.NumTypeArguments() > 0) {
@@ -16362,11 +15905,7 @@
   if (!other.IsInstantiated()) {
     instantiated_other = other.InstantiateFrom(
         other_instantiator_type_arguments, other_function_type_arguments,
-        kAllFree, bound_error, NULL, NULL, Heap::kOld);
-    if ((bound_error != NULL) && !bound_error->IsNull()) {
-      ASSERT(Isolate::Current()->type_checks());
-      return false;
-    }
+        kAllFree, NULL, Heap::kOld);
     if (instantiated_other.IsTypeRef()) {
       instantiated_other = TypeRef::Cast(instantiated_other).type();
     }
@@ -16375,58 +15914,25 @@
     }
   }
   other_type_arguments = instantiated_other.arguments();
-  const bool other_is_dart_function = instantiated_other.IsDartFunctionType();
-  // In strong mode, subtyping rules of callable instances are restricted.
-  if (!FLAG_strong &&
-      (other_is_dart_function || instantiated_other.IsFunctionType())) {
-    // Check if this instance understands a call() method of a compatible type.
-    Function& sig_fun =
-        Function::Handle(zone, cls.LookupCallFunctionForTypeTest());
-    if (!sig_fun.IsNull()) {
-      if (other_is_dart_function) {
-        return true;
-      }
-      if (!sig_fun.HasInstantiatedSignature(kCurrentClass)) {
-        // The following signature instantiation of sig_fun does not instantiate
-        // its own function type parameters, i.e there are 0 free function type
-        // params. Note that sig_fun has no generic parent, which is guaranteed
-        // to be the case, since the looked up call() function cannot be nested.
-        // It is most probably not even generic.
-        ASSERT(!sig_fun.HasGenericParent());
-        // No bound error possible, since the instance exists.
-        sig_fun = sig_fun.InstantiateSignatureFrom(
-            type_arguments, Object::null_type_arguments(), kNoneFree,
-            Heap::kOld);
-      }
-      const Function& other_signature =
-          Function::Handle(zone, Type::Cast(instantiated_other).signature());
-      if (sig_fun.IsSubtypeOf(other_signature, bound_error, NULL, Heap::kOld)) {
-        return true;
-      }
-    }
-  }
   if (!instantiated_other.IsType()) {
     return false;
   }
   other_class = instantiated_other.type_class();
   if (IsNull()) {
     ASSERT(cls.IsNullClass());
-    // As of Dart 1.5, the null instance and Null type are handled differently.
+    // As of Dart 2.0, the null instance and Null type are handled differently.
     // We already checked other for dynamic and void.
-    if (FLAG_strong &&
-        IsFutureOrInstanceOf(zone, instantiated_other, bound_error)) {
+    if (IsFutureOrInstanceOf(zone, instantiated_other)) {
       return true;
     }
     return other_class.IsNullClass() || other_class.IsObjectClass();
   }
-  return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments,
-                         bound_error, NULL, Heap::kOld);
+  return Class::IsSubtypeOf(cls, type_arguments, other_class,
+                            other_type_arguments, Heap::kOld);
 }
 
 bool Instance::IsFutureOrInstanceOf(Zone* zone,
-                                    const AbstractType& other,
-                                    Error* bound_error) const {
-  ASSERT(FLAG_strong);
+                                    const AbstractType& other) const {
   if (other.IsType() &&
       Class::Handle(zone, other.type_class()).IsFutureOrClass()) {
     if (other.arguments() == TypeArguments::null()) {
@@ -16445,15 +15951,14 @@
       if (!type_arguments.IsNull()) {
         const AbstractType& type_arg =
             AbstractType::Handle(zone, type_arguments.TypeAt(0));
-        if (type_arg.IsSubtypeOf(other_type_arg, bound_error, NULL,
-                                 Heap::kOld)) {
+        if (type_arg.IsSubtypeOf(other_type_arg, Heap::kOld)) {
           return true;
         }
       }
     }
     // Retry the IsInstanceOf function after unwrapping type arg of FutureOr.
     if (IsInstanceOf(other_type_arg, Object::null_type_arguments(),
-                     Object::null_type_arguments(), bound_error)) {
+                     Object::null_type_arguments())) {
       return true;
     }
   }
@@ -16623,37 +16128,15 @@
     if (IsClosure()) {
       return Closure::Cast(*this).ToCString();
     }
-    const Class& cls = Class::Handle(clazz());
-    TypeArguments& type_arguments = TypeArguments::Handle();
-    const intptr_t num_type_arguments = cls.NumTypeArguments();
-    if (num_type_arguments > 0) {
-      type_arguments = GetTypeArguments();
-    }
-    const Type& type =
-        Type::Handle(Type::New(cls, type_arguments, TokenPosition::kNoSource));
+    // Background compiler disassembly of instructions referring to pool objects
+    // calls this function and requires allocation of Type in old space.
+    const AbstractType& type = AbstractType::Handle(GetType(Heap::kOld));
     const String& type_name = String::Handle(type.UserVisibleName());
     return OS::SCreate(Thread::Current()->zone(), "Instance of '%s'",
                        type_name.ToCString());
   }
 }
 
-bool AbstractType::IsResolved() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return false;
-}
-
-void AbstractType::SetIsResolved() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-}
-
-bool AbstractType::HasResolvedTypeClass() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return false;
-}
-
 classid_t AbstractType::type_class_id() const {
   // AbstractType is an abstract class.
   UNREACHABLE();
@@ -16666,12 +16149,6 @@
   return Class::null();
 }
 
-RawUnresolvedClass* AbstractType::unresolved_class() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return UnresolvedClass::null();
-}
-
 RawTypeArguments* AbstractType::arguments() const {
   // AbstractType is an abstract class.
   UNREACHABLE();
@@ -16719,35 +16196,6 @@
   UNREACHABLE();
 }
 
-bool AbstractType::IsMalformed() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return false;
-}
-
-bool AbstractType::IsMalbounded() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return false;
-}
-
-bool AbstractType::IsMalformedOrMalbounded() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return false;
-}
-
-RawLanguageError* AbstractType::error() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return LanguageError::null();
-}
-
-void AbstractType::set_error(const LanguageError& value) const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-}
-
 bool AbstractType::IsEquivalent(const Instance& other, TrailPtr trail) const {
   // AbstractType is an abstract class.
   UNREACHABLE();
@@ -16760,37 +16208,17 @@
   return false;
 }
 
-void AbstractType::SetScopeFunction(const Function& function) const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-}
-
 RawAbstractType* AbstractType::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
-    Error* bound_error,
     TrailPtr instantiation_trail,
-    TrailPtr bound_trail,
     Heap::Space space) const {
   // AbstractType is an abstract class.
   UNREACHABLE();
   return NULL;
 }
 
-RawAbstractType* AbstractType::CloneUnfinalized() const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return NULL;
-}
-
-RawAbstractType* AbstractType::CloneUninstantiated(const Class& new_owner,
-                                                   TrailPtr trail) const {
-  // AbstractType is an abstract class.
-  UNREACHABLE();
-  return NULL;
-}
-
 RawAbstractType* AbstractType::Canonicalize(TrailPtr trail) const {
   // AbstractType is an abstract class.
   UNREACHABLE();
@@ -16921,48 +16349,16 @@
   ASSERT(name_visibility != kScrubbedName);
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  if (IsBoundedType()) {
-    const AbstractType& type =
-        AbstractType::Handle(zone, BoundedType::Cast(*this).type());
-    if (name_visibility == kUserVisibleName) {
-      return type.BuildName(kUserVisibleName);
-    }
-    GrowableHandlePtrArray<const String> pieces(zone, 5);
-    String& type_name = String::Handle(zone, type.BuildName(kInternalName));
-    pieces.Add(type_name);
-    pieces.Add(Symbols::SpaceExtendsSpace());
-    // Build the bound name without causing divergence.
-    const AbstractType& bound =
-        AbstractType::Handle(zone, BoundedType::Cast(*this).bound());
-    String& bound_name = String::Handle(zone);
-    if (bound.IsTypeParameter()) {
-      bound_name = TypeParameter::Cast(bound).name();
-      pieces.Add(bound_name);
-    } else if (bound.IsType()) {
-      const Class& cls = Class::Handle(zone, Type::Cast(bound).type_class());
-      bound_name = cls.Name();
-      pieces.Add(bound_name);
-      if (Type::Cast(bound).arguments() != TypeArguments::null()) {
-        pieces.Add(Symbols::OptimizedOut());
-      }
-    } else {
-      pieces.Add(Symbols::OptimizedOut());
-    }
-    return Symbols::FromConcatAll(thread, pieces);
-  }
   if (IsTypeParameter()) {
     return TypeParameter::Cast(*this).name();
   }
-  // If the type is still being finalized, we may be reporting an error about
-  // a malformed type, so proceed with caution.
   const TypeArguments& args = TypeArguments::Handle(zone, arguments());
   const intptr_t num_args = args.IsNull() ? 0 : args.Length();
   String& class_name = String::Handle(zone);
   intptr_t first_type_param_index;
   intptr_t num_type_params;  // Number of type parameters to print.
-  Class& cls = Class::Handle(zone);
+  Class& cls = Class::Handle(zone, type_class());
   if (IsFunctionType()) {
-    cls = type_class();
     const Function& signature_function =
         Function::Handle(zone, Type::Cast(*this).signature());
     if (!cls.IsTypedefClass()) {
@@ -16971,62 +16367,41 @@
     // Instead of printing the actual signature, use the typedef name with
     // its type arguments, if any.
     class_name = cls.Name();  // Typedef name.
-    // We may be reporting an error about a malformed function type. In that
-    // case, avoid instantiating the signature, since it may cause divergence.
-    if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) {
+    if (!IsFinalized() || IsBeingFinalized()) {
+      // TODO(regis): Check if this is dead code.
       return class_name.raw();
     }
     // Print the name of a typedef as a regular, possibly parameterized, class.
-  } else if (HasResolvedTypeClass()) {
-    cls = type_class();
   }
-  if (!cls.IsNull()) {
-    if (IsResolved() || !cls.IsMixinApplication()) {
-      // Do not print the full vector, but only the declared type parameters.
-      num_type_params = cls.NumTypeParameters();
+  // Do not print the full vector, but only the declared type parameters.
+  num_type_params = cls.NumTypeParameters();
+  if (name_visibility == kInternalName) {
+    class_name = cls.Name();
+  } else {
+    ASSERT(name_visibility == kUserVisibleName);
+    // Map internal types to their corresponding public interfaces.
+    class_name = cls.UserVisibleName();
+  }
+  if (num_type_params > num_args) {
+    first_type_param_index = 0;
+    if (!IsFinalized() || IsBeingFinalized()) {
+      // TODO(regis): Check if this is dead code.
+      num_type_params = num_args;
     } else {
-      // Do not print the type parameters of an unresolved mixin application,
-      // since it would prematurely trigger the application of the mixin type.
-      num_type_params = 0;
-    }
-    if (name_visibility == kInternalName) {
-      class_name = cls.Name();
-    } else {
-      ASSERT(name_visibility == kUserVisibleName);
-      // Map internal types to their corresponding public interfaces.
-      class_name = cls.UserVisibleName();
-    }
-    if (num_type_params > num_args) {
-      first_type_param_index = 0;
-      if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) {
-        // Most probably a malformed type. Do not fill up with "dynamic",
-        // but use actual vector.
-        num_type_params = num_args;
-      } else {
-        ASSERT(num_args == 0);  // Type is raw.
-        // No need to fill up with "dynamic", unless running in strong mode.
-        if (!FLAG_strong) {
-          num_type_params = 0;
-        }
-      }
-    } else {
-      // The actual type argument vector can be longer than necessary, because
-      // of type optimizations.
-      if (IsFinalized() && cls.is_type_finalized()) {
-        first_type_param_index = cls.NumTypeArguments() - num_type_params;
-      } else {
-        first_type_param_index = num_args - num_type_params;
-      }
+      ASSERT(num_args == 0);  // Type is raw.
     }
   } else {
-    class_name = UnresolvedClass::Handle(zone, unresolved_class()).Name();
-    num_type_params = num_args;
-    first_type_param_index = 0;
+    // The actual type argument vector can be longer than necessary, because
+    // of type optimizations.
+    if (IsFinalized() && cls.is_type_finalized()) {
+      first_type_param_index = cls.NumTypeArguments() - num_type_params;
+    } else {
+      first_type_param_index = num_args - num_type_params;
+    }
   }
   GrowableHandlePtrArray<const String> pieces(zone, 4);
   pieces.Add(class_name);
-  if ((num_type_params == 0) ||
-      (!FLAG_strong && args.IsRaw(first_type_param_index, num_type_params))) {
+  if (num_type_params == 0) {
     // Do nothing.
   } else {
     const String& args_name = String::Handle(
@@ -17042,11 +16417,7 @@
 
 RawString* AbstractType::ClassName() const {
   ASSERT(!IsFunctionType());
-  if (HasResolvedTypeClass()) {
-    return Class::Handle(type_class()).Name();
-  } else {
-    return UnresolvedClass::Handle(unresolved_class()).Name();
-  }
+  return Class::Handle(type_class()).Name();
 }
 
 bool AbstractType::IsNullTypeRef() const {
@@ -17057,7 +16428,7 @@
   if (IsCanonical()) {
     return raw() == Object::dynamic_type().raw();
   }
-  return HasResolvedTypeClass() && (type_class_id() == kDynamicCid);
+  return type_class_id() == kDynamicCid;
 }
 
 bool AbstractType::IsVoidType() const {
@@ -17066,177 +16437,111 @@
 }
 
 bool AbstractType::IsObjectType() const {
-  return HasResolvedTypeClass() && (type_class_id() == kInstanceCid);
+  return type_class_id() == kInstanceCid;
 }
 
 bool AbstractType::IsTopType() const {
   if (IsVoidType()) {
     return true;
   }
-  if (!HasResolvedTypeClass()) {
+  const classid_t cid = type_class_id();
+  if (cid == kIllegalCid) {
     return false;
   }
-  classid_t cid = type_class_id();
   if ((cid == kDynamicCid) || (cid == kInstanceCid)) {
     return true;
   }
-  // In strong mode, FutureOr<T> where T is a top type behaves as a top type.
-  if (FLAG_strong) {
-    Thread* thread = Thread::Current();
-    Zone* zone = thread->zone();
-    if (Class::Handle(zone, type_class()).IsFutureOrClass()) {
-      if (arguments() == TypeArguments::null()) {
-        return true;
-      }
-      const TypeArguments& type_arguments =
-          TypeArguments::Handle(zone, arguments());
-      const AbstractType& type_arg =
-          AbstractType::Handle(zone, type_arguments.TypeAt(0));
-      if (type_arg.IsTopType()) {
-        return true;
-      }
+  // FutureOr<T> where T is a top type behaves as a top type.
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  if (Class::Handle(zone, type_class()).IsFutureOrClass()) {
+    if (arguments() == TypeArguments::null()) {
+      return true;
+    }
+    const TypeArguments& type_arguments =
+        TypeArguments::Handle(zone, arguments());
+    const AbstractType& type_arg =
+        AbstractType::Handle(zone, type_arguments.TypeAt(0));
+    if (type_arg.IsTopType()) {
+      return true;
     }
   }
   return false;
 }
 
 bool AbstractType::IsNullType() const {
-  return HasResolvedTypeClass() && (type_class_id() == kNullCid);
+  return type_class_id() == kNullCid;
 }
 
 bool AbstractType::IsBoolType() const {
-  return HasResolvedTypeClass() && (type_class_id() == kBoolCid);
+  return type_class_id() == kBoolCid;
 }
 
 bool AbstractType::IsIntType() const {
-  return HasResolvedTypeClass() &&
+  return HasTypeClass() &&
          (type_class() == Type::Handle(Type::IntType()).type_class());
 }
 
-bool AbstractType::IsInt64Type() const {
-  return HasResolvedTypeClass() &&
-         (type_class() == Type::Handle(Type::Int64Type()).type_class());
-}
-
 bool AbstractType::IsDoubleType() const {
-  return HasResolvedTypeClass() &&
+  return HasTypeClass() &&
          (type_class() == Type::Handle(Type::Double()).type_class());
 }
 
 bool AbstractType::IsFloat32x4Type() const {
   // kFloat32x4Cid refers to the private class and cannot be used here.
-  return HasResolvedTypeClass() &&
+  return HasTypeClass() &&
          (type_class() == Type::Handle(Type::Float32x4()).type_class());
 }
 
 bool AbstractType::IsFloat64x2Type() const {
   // kFloat64x2Cid refers to the private class and cannot be used here.
-  return HasResolvedTypeClass() &&
+  return HasTypeClass() &&
          (type_class() == Type::Handle(Type::Float64x2()).type_class());
 }
 
 bool AbstractType::IsInt32x4Type() const {
   // kInt32x4Cid refers to the private class and cannot be used here.
-  return HasResolvedTypeClass() &&
+  return HasTypeClass() &&
          (type_class() == Type::Handle(Type::Int32x4()).type_class());
 }
 
 bool AbstractType::IsNumberType() const {
-  return HasResolvedTypeClass() && (type_class_id() == kNumberCid);
+  return type_class_id() == kNumberCid;
 }
 
 bool AbstractType::IsSmiType() const {
-  return HasResolvedTypeClass() && (type_class_id() == kSmiCid);
+  return type_class_id() == kSmiCid;
 }
 
 bool AbstractType::IsStringType() const {
-  return HasResolvedTypeClass() &&
+  return HasTypeClass() &&
          (type_class() == Type::Handle(Type::StringType()).type_class());
 }
 
 bool AbstractType::IsDartFunctionType() const {
-  return HasResolvedTypeClass() &&
+  return HasTypeClass() &&
          (type_class() == Type::Handle(Type::DartFunctionType()).type_class());
 }
 
 bool AbstractType::IsDartClosureType() const {
   // Non-typedef function types have '_Closure' class as type class, but are not
   // the Dart '_Closure' type.
-  return !IsFunctionType() && HasResolvedTypeClass() &&
-         (type_class_id() == kClosureCid);
+  return !IsFunctionType() && (type_class_id() == kClosureCid);
 }
 
-bool AbstractType::TypeTest(TypeTestKind test_kind,
-                            const AbstractType& other,
-                            Error* bound_error,
-                            TrailPtr bound_trail,
-                            Heap::Space space) const {
+bool AbstractType::IsSubtypeOf(const AbstractType& other,
+                               Heap::Space space) const {
   ASSERT(IsFinalized());
   ASSERT(other.IsFinalized());
-  if (IsMalformed() || other.IsMalformed()) {
-    // Malformed types involved in subtype tests should be handled specially
-    // by the caller. Malformed types should only be encountered here in a
-    // more specific than test.
-    ASSERT(test_kind == kIsMoreSpecificThan);
-    return false;
-  }
-  // In case the type checked in a type test is malbounded, the code generator
-  // may compile a throw instead of a run time call performing the type check.
-  // However, in checked mode, a function type may include malbounded result
-  // type and/or malbounded parameter types, which will then be encountered here
-  // at run time.
-  if (IsMalbounded()) {
-    ASSERT(Isolate::Current()->type_checks());
-    if ((bound_error != NULL) && bound_error->IsNull()) {
-      *bound_error = error();
-    }
-    return false;
-  }
-  if (other.IsMalbounded()) {
-    ASSERT(Isolate::Current()->type_checks());
-    if ((bound_error != NULL) && bound_error->IsNull()) {
-      *bound_error = other.error();
-    }
-    return false;
-  }
   // Any type is a subtype of (and is more specific than) Object and dynamic.
-  // As of Dart 1.24, void is dynamically treated like Object (except when
-  // comparing function-types).
-  // As of Dart 1.5, the Null type is a subtype of (and is more specific than)
+  // As of Dart 2.0, the Null type is a subtype of (and is more specific than)
   // any type.
   if (other.IsTopType() || IsNullType()) {
     return true;
   }
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  if (IsBoundedType() || other.IsBoundedType()) {
-    if (Equals(other)) {
-      return true;
-    }
-    // Redundant check if other type is equal to the upper bound of this type.
-    if (IsBoundedType() &&
-        AbstractType::Handle(BoundedType::Cast(*this).bound()).Equals(other)) {
-      return true;
-    }
-    // Bound checking at run time occurs when allocating an instance of a
-    // generic bounded type using a valid instantiator. The instantiator is
-    // the type of an instance successfully allocated, i.e. not containing
-    // unchecked bounds anymore.
-    // Therefore, when performing a type test at compile time (what is happening
-    // here), it is safe to ignore the bounds, since they will not exist at run
-    // time anymore.
-    if (IsBoundedType()) {
-      const AbstractType& bounded_type =
-          AbstractType::Handle(zone, BoundedType::Cast(*this).type());
-      return bounded_type.TypeTest(test_kind, other, bound_error, bound_trail,
-                                   space);
-    }
-    const AbstractType& other_bounded_type =
-        AbstractType::Handle(zone, BoundedType::Cast(other).type());
-    return TypeTest(test_kind, other_bounded_type, bound_error, bound_trail,
-                    space);
-  }
-  // Type parameters cannot be handled by Class::TypeTest().
+  // Type parameters cannot be handled by Class::IsSubtypeOf().
   // When comparing two uninstantiated function types, one returning type
   // parameter K, the other returning type parameter V, we cannot assume that K
   // is a subtype of V, or vice versa. We only return true if K equals V, as
@@ -17281,15 +16586,12 @@
     if (!bound.IsFinalized()) {
       return false;  // TODO(regis): Return "maybe after instantiation".
     }
-    // The current bound_trail cannot be used, because operands are swapped and
-    // the test is different anyway (more specific vs. subtype).
-    if (bound.IsMoreSpecificThan(other, bound_error, NULL, space)) {
+    // The current bound_trail cannot be used, because operands are swapped.
+    if (bound.IsSubtypeOf(other, space)) {
       return true;
     }
-    // In strong mode, check if 'other' is 'FutureOr'.
-    // If so, apply additional subtyping rules.
-    if (FLAG_strong &&
-        FutureOrTypeTest(zone, other, bound_error, bound_trail, space)) {
+    // Apply additional subtyping rules if 'other' is 'FutureOr'.
+    if (IsSubtypeOfFutureOr(zone, other, space)) {
       return true;
     }
     return false;  // TODO(regis): We should return "maybe after instantiation".
@@ -17299,7 +16601,7 @@
   }
   const Class& type_cls = Class::Handle(zone, type_class());
   const Class& other_type_cls = Class::Handle(zone, other.type_class());
-  // Function types cannot be handled by Class::TypeTest().
+  // Function types cannot be handled by Class::IsSubtypeOf().
   const bool other_is_dart_function_type = other.IsDartFunctionType();
   if (other_is_dart_function_type || other.IsFunctionType()) {
     if (IsFunctionType()) {
@@ -17311,36 +16613,12 @@
       // Check for two function types.
       const Function& fun =
           Function::Handle(zone, Type::Cast(*this).signature());
-      return fun.TypeTest(test_kind, other_fun, bound_error, bound_trail,
-                          space);
-    }
-    // In strong mode, subtyping rules of callable instances are restricted.
-    if (!FLAG_strong) {
-      // Check if type S has a call() method of function type T.
-      const Function& call_function =
-          Function::Handle(zone, type_cls.LookupCallFunctionForTypeTest());
-      if (!call_function.IsNull()) {
-        if (other_is_dart_function_type) {
-          return true;
-        }
-        // Shortcut the test involving the call function if the
-        // pair <this, other> is already in the trail.
-        if (TestAndAddBuddyToTrail(&bound_trail, other)) {
-          return true;
-        }
-        if (call_function.TypeTest(
-                test_kind,
-                Function::Handle(zone, Type::Cast(other).signature()),
-                bound_error, bound_trail, space)) {
-          return true;
-        }
-      }
+      return fun.IsSubtypeOf(other_fun, space);
     }
     if (other.IsFunctionType() && !other_type_cls.IsTypedefClass()) {
-      // [this] is not a function type (and, in non-strong mode, does not
-      // declare a compatible call() method as verified above). Therefore,
-      // non-function type [this] cannot be a subtype of function type [other],
-      // unless [other] is not only a function type, but also a named typedef.
+      // [this] is not a function type. Therefore, non-function type [this]
+      // cannot be a subtype of function type [other], unless [other] is not
+      // only a function type, but also a named typedef.
       // Indeed a typedef also behaves as a regular class-based type (with type
       // arguments when generic).
       // This check is needed to avoid falling through to class-based type
@@ -17351,28 +16629,20 @@
     }
   }
   if (IsFunctionType()) {
-    // In strong mode, check if 'other' is 'FutureOr'.
-    // If so, apply additional subtyping rules.
-    if (FLAG_strong &&
-        FutureOrTypeTest(zone, other, bound_error, bound_trail, space)) {
+    // Apply additional subtyping rules if 'other' is 'FutureOr'.
+    if (IsSubtypeOfFutureOr(zone, other, space)) {
       return true;
     }
     return false;
   }
-  return type_cls.TypeTest(test_kind, TypeArguments::Handle(zone, arguments()),
-                           other_type_cls,
-                           TypeArguments::Handle(zone, other.arguments()),
-                           bound_error, bound_trail, space);
+  return Class::IsSubtypeOf(
+      type_cls, TypeArguments::Handle(zone, arguments()), other_type_cls,
+      TypeArguments::Handle(zone, other.arguments()), space);
 }
 
-bool AbstractType::FutureOrTypeTest(Zone* zone,
-                                    const AbstractType& other,
-                                    Error* bound_error,
-                                    TrailPtr bound_trail,
-                                    Heap::Space space) const {
-  // In strong mode, there is no difference between 'is subtype of' and
-  // 'is more specific than'.
-  ASSERT(FLAG_strong);
+bool AbstractType::IsSubtypeOfFutureOr(Zone* zone,
+                                       const AbstractType& other,
+                                       Heap::Space space) const {
   if (other.IsType() &&
       Class::Handle(zone, other.type_class()).IsFutureOrClass()) {
     if (other.arguments() == TypeArguments::null()) {
@@ -17389,9 +16659,8 @@
     if (other_type_arg.IsTopType()) {
       return true;
     }
-    // Retry the TypeTest function after unwrapping type arg of FutureOr.
-    if (TypeTest(Class::kIsSubtypeOf, other_type_arg, bound_error, bound_trail,
-                 space)) {
+    // Retry the IsSubtypeOf check after unwrapping type arg of FutureOr.
+    if (IsSubtypeOf(other_type_arg, space)) {
       return true;
     }
   }
@@ -17449,10 +16718,6 @@
   return Isolate::Current()->object_store()->int_type();
 }
 
-RawType* Type::Int64Type() {
-  return Isolate::Current()->object_store()->int64_type();
-}
-
 RawType* Type::SmiType() {
   return Isolate::Current()->object_store()->smi_type();
 }
@@ -17499,12 +16764,15 @@
 
 RawType* Type::NewNonParameterizedType(const Class& type_class) {
   ASSERT(type_class.NumTypeArguments() == 0);
-  Type& type = Type::Handle(type_class.CanonicalType());
+  // It is too early to use the class finalizer, as type_class may not be named
+  // yet, so do not call DeclarationType().
+  Type& type = Type::Handle(type_class.declaration_type());
   if (type.IsNull()) {
-    type ^= Type::New(Object::Handle(type_class.raw()),
+    type ^= Type::New(Class::Handle(type_class.raw()),
                       Object::null_type_arguments(), TokenPosition::kNoSource);
     type.SetIsFinalized();
     type ^= type.Canonicalize();
+    type_class.set_declaration_type(type);
   }
   ASSERT(type.IsFinalized());
   return type.raw();
@@ -17513,7 +16781,6 @@
 void Type::SetIsFinalized() const {
   ASSERT(!IsFinalized());
   if (IsInstantiated()) {
-    ASSERT(HasResolvedTypeClass());
     set_type_state(RawType::kFinalizedInstantiated);
   } else {
     set_type_state(RawType::kFinalizedUninstantiated);
@@ -17527,111 +16794,31 @@
 }
 
 void Type::SetIsBeingFinalized() const {
-  ASSERT(IsResolved() && !IsFinalized() && !IsBeingFinalized());
+  ASSERT(!IsFinalized() && !IsBeingFinalized());
   set_type_state(RawType::kBeingFinalized);
 }
 
-bool Type::IsMalformed() const {
-  if (raw_ptr()->sig_or_err_.error_ == LanguageError::null()) {
-    return false;  // Valid type, but not a function type.
-  }
-  if (!raw_ptr()->sig_or_err_.error_->IsLanguageError()) {
-    return false;  // Valid function type.
-  }
-  const LanguageError& type_error = LanguageError::Handle(error());
-  ASSERT(!type_error.IsNull());
-  return type_error.kind() == Report::kMalformedType;
-}
-
-bool Type::IsMalbounded() const {
-  if (raw_ptr()->sig_or_err_.error_ == LanguageError::null()) {
-    return false;  // Valid type, but not a function type.
-  }
-  if (!Isolate::Current()->type_checks()) {
-    return false;
-  }
-  if (!raw_ptr()->sig_or_err_.error_->IsLanguageError()) {
-    return false;  // Valid function type.
-  }
-  const LanguageError& type_error = LanguageError::Handle(error());
-  ASSERT(!type_error.IsNull());
-  return type_error.kind() == Report::kMalboundedType;
-}
-
-bool Type::IsMalformedOrMalbounded() const {
-  if (raw_ptr()->sig_or_err_.error_ == LanguageError::null()) {
-    return false;  // Valid type, but not a function type.
-  }
-  const LanguageError& type_error = LanguageError::Handle(error());
-  if (type_error.IsNull()) {
-    return false;  // Valid function type.
-  }
-  if (type_error.kind() == Report::kMalformedType) {
-    return true;
-  }
-  ASSERT(type_error.kind() == Report::kMalboundedType);
-  return Isolate::Current()->type_checks();
-}
-
-RawLanguageError* Type::error() const {
-  if (raw_ptr()->sig_or_err_.error_->IsLanguageError()) {
-    return LanguageError::RawCast(raw_ptr()->sig_or_err_.error_);
-  }
-  return LanguageError::null();
-}
-
-void Type::set_error(const LanguageError& value) const {
-  StorePointer(&raw_ptr()->sig_or_err_.error_, value.raw());
-}
-
 RawFunction* Type::signature() const {
-  intptr_t cid = raw_ptr()->sig_or_err_.signature_->GetClassId();
+  intptr_t cid = raw_ptr()->signature_->GetClassId();
   if (cid == kNullCid) {
     return Function::null();
   }
-  if (cid == kFunctionCid) {
-    return Function::RawCast(raw_ptr()->sig_or_err_.signature_);
-  }
-  ASSERT(cid == kLanguageErrorCid);  // Type is malformed or malbounded.
-  return Function::null();
+  ASSERT(cid == kFunctionCid);
+  return Function::RawCast(raw_ptr()->signature_);
 }
 
 void Type::set_signature(const Function& value) const {
-  StorePointer(&raw_ptr()->sig_or_err_.signature_, value.raw());
-}
-
-void Type::SetIsResolved() const {
-  ASSERT(!IsResolved());
-  set_type_state(RawType::kResolved);
-}
-
-bool Type::HasResolvedTypeClass() const {
-  return !raw_ptr()->type_class_id_->IsHeapObject();
+  StorePointer(&raw_ptr()->signature_, value.raw());
 }
 
 classid_t Type::type_class_id() const {
-  ASSERT(HasResolvedTypeClass());
-  return Smi::Value(reinterpret_cast<RawSmi*>(raw_ptr()->type_class_id_));
+  return Smi::Value(raw_ptr()->type_class_id_);
 }
 
 RawClass* Type::type_class() const {
   return Isolate::Current()->class_table()->At(type_class_id());
 }
 
-RawUnresolvedClass* Type::unresolved_class() const {
-#ifdef DEBUG
-  ASSERT(!HasResolvedTypeClass());
-  UnresolvedClass& unresolved_class = UnresolvedClass::Handle();
-  unresolved_class ^= raw_ptr()->type_class_id_;
-  ASSERT(!unresolved_class.IsNull());
-  return unresolved_class.raw();
-#else
-  ASSERT(!Object::Handle(raw_ptr()->type_class_id_).IsNull());
-  ASSERT(Object::Handle(raw_ptr()->type_class_id_).IsUnresolvedClass());
-  return reinterpret_cast<RawUnresolvedClass*>(raw_ptr()->type_class_id_);
-#endif
-}
-
 bool Type::IsInstantiated(Genericity genericity,
                           intptr_t num_free_fun_type_params,
                           TrailPtr trail) const {
@@ -17660,19 +16847,13 @@
   intptr_t len = num_type_args;  // Check the full vector of type args.
   ASSERT(num_type_args > 0);
   // This type is not instantiated if it refers to type parameters.
-  // Although this type may still be unresolved, the type parameters it may
-  // refer to are resolved by definition. We can therefore return the correct
-  // result even for an unresolved type. We just need to look at all type
-  // arguments and not just at the type parameters.
-  if (HasResolvedTypeClass()) {
-    const Class& cls = Class::Handle(type_class());
-    len = cls.NumTypeParameters();  // Check the type parameters only.
-    if (len > num_type_args) {
-      // This type has the wrong number of arguments and is not finalized yet.
-      // Type arguments are reset to null when finalizing such a type.
-      ASSERT(!IsFinalized());
-      len = num_type_args;
-    }
+  const Class& cls = Class::Handle(type_class());
+  len = cls.NumTypeParameters();  // Check the type parameters only.
+  if (len > num_type_args) {
+    // This type has the wrong number of arguments and is not finalized yet.
+    // Type arguments are reset to null when finalizing such a type.
+    ASSERT(!IsFinalized());
+    len = num_type_args;
   }
   return (len == 0) ||
          args.IsSubvectorInstantiated(num_type_args - len, len, genericity,
@@ -17683,17 +16864,11 @@
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
-    Error* bound_error,
     TrailPtr instantiation_trail,
-    TrailPtr bound_trail,
     Heap::Space space) const {
   Zone* zone = Thread::Current()->zone();
   ASSERT(IsFinalized() || IsBeingFinalized());
   ASSERT(!IsInstantiated());
-  // Return the uninstantiated type unchanged if malformed. No copy needed.
-  if (IsMalformed()) {
-    return raw();
-  }
   // Note that the type class has to be resolved at this time, but not
   // necessarily finalized yet. We may be checking bounds at compile time or
   // finalizing the type argument vector of a recursive type.
@@ -17709,18 +16884,17 @@
     ASSERT(type_arguments.Length() == cls.NumTypeArguments());
     type_arguments = type_arguments.InstantiateFrom(
         instantiator_type_arguments, function_type_arguments,
-        num_free_fun_type_params, bound_error, instantiation_trail, bound_trail,
-        space);
+        num_free_fun_type_params, instantiation_trail, space);
+    // A returned empty_type_arguments indicates a failed instantiation in dead
+    // code that must be propagated up to the caller, the optimizing compiler.
+    if (type_arguments.raw() == Object::empty_type_arguments().raw()) {
+      return Type::null();
+    }
   }
   // This uninstantiated type is not modified, as it can be instantiated
   // with different instantiators. Allocate a new instantiated version of it.
   const Type& instantiated_type =
       Type::Handle(zone, Type::New(cls, type_arguments, token_pos(), space));
-  // Preserve the bound error if any.
-  if (IsMalbounded()) {
-    const LanguageError& bound_error = LanguageError::Handle(zone, error());
-    instantiated_type.set_error(bound_error);
-  }
   // For a function type, possibly instantiate and set its signature.
   if (!sig_fun.IsNull()) {
     // If we are finalizing a typedef, do not yet instantiate its signature,
@@ -17733,6 +16907,12 @@
         sig_fun = sig_fun.InstantiateSignatureFrom(
             instantiator_type_arguments, function_type_arguments,
             num_free_fun_type_params, space);
+        // A returned null signature indicates a failed instantiation in dead
+        // code that must be propagated up to the caller, the optimizing
+        // compiler.
+        if (sig_fun.IsNull()) {
+          return Type::null();
+        }
       }
     } else {
       // The Kernel frontend does not keep the information that a function type
@@ -17743,7 +16923,6 @@
   if (IsFinalized()) {
     instantiated_type.SetIsFinalized();
   } else {
-    instantiated_type.SetIsResolved();
     if (IsBeingFinalized()) {
       instantiated_type.SetIsBeingFinalized();
     }
@@ -17771,13 +16950,6 @@
   if (IsFunctionType() != other_type.IsFunctionType()) {
     return false;
   }
-  ASSERT(IsResolved() && other_type.IsResolved());
-  if (IsMalformed() || other_type.IsMalformed()) {
-    return false;  // Malformed types do not get canonicalized.
-  }
-  if (IsMalbounded() != other_type.IsMalbounded()) {
-    return false;  // Do not drop bound error.
-  }
   if (type_class_id() != other_type.type_class_id()) {
     return false;
   }
@@ -17827,13 +16999,6 @@
         for (intptr_t i = 0; i < from_index; i++) {
           type_arg = type_args.TypeAt(i);
           other_type_arg = other_type_args.TypeAt(i);
-          // Ignore bounds of bounded types.
-          while (type_arg.IsBoundedType()) {
-            type_arg = BoundedType::Cast(type_arg).type();
-          }
-          while (other_type_arg.IsBoundedType()) {
-            other_type_arg = BoundedType::Cast(other_type_arg).type();
-          }
           ASSERT(type_arg.IsEquivalent(other_type_arg, trail));
         }
       }
@@ -17853,12 +17018,10 @@
   const Function& other_sig_fun =
       Function::Handle(zone, other_type.signature());
 
-  if (FLAG_reify_generic_functions) {
-    // Compare function type parameters and their bounds.
-    // Check the type parameters and bounds of generic functions.
-    if (!sig_fun.HasSameTypeParametersAndBounds(other_sig_fun)) {
-      return false;
-    }
+  // Compare function type parameters and their bounds.
+  // Check the type parameters and bounds of generic functions.
+  if (!sig_fun.HasSameTypeParametersAndBounds(other_sig_fun)) {
+    return false;
   }
 
   // Compare number of function parameters.
@@ -17919,164 +17082,10 @@
   return TypeArguments::Handle(arguments()).IsRecursive();
 }
 
-void Type::SetScopeFunction(const Function& function) const {
-  TypeArguments::Handle(arguments()).SetScopeFunction(function);
-  if (IsFunctionType()) {
-    const Function& sig_fun = Function::Handle(signature());
-    sig_fun.set_parent_function(function);
-    // No need to traverse result type and parameter types (and bounds, in case
-    // sig_fun is generic), since they have sig_fun as scope function.
-  }
-}
-
-RawAbstractType* Type::CloneUnfinalized() const {
-  ASSERT(IsResolved());
-  if (IsFinalized()) {
-    return raw();
-  }
-  ASSERT(!IsMalformed());       // Malformed types are finalized.
-  ASSERT(!IsBeingFinalized());  // Cloning must occur prior to finalization.
-  Zone* zone = Thread::Current()->zone();
-  const TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
-  const TypeArguments& type_args_clone =
-      TypeArguments::Handle(zone, type_args.CloneUnfinalized());
-  if (type_args_clone.raw() == type_args.raw()) {
-    return raw();
-  }
-  const Type& clone = Type::Handle(
-      zone,
-      Type::New(Class::Handle(zone, type_class()), type_args, token_pos()));
-  // Preserve the bound error if any.
-  if (IsMalbounded()) {
-    const LanguageError& bound_error = LanguageError::Handle(zone, error());
-    clone.set_error(bound_error);
-  }
-  // Clone the signature if this type represents a function type.
-  Function& fun = Function::Handle(zone, signature());
-  if (!fun.IsNull()) {
-    const Class& owner = Class::Handle(zone, fun.Owner());
-    const Function& parent = Function::Handle(zone, fun.parent_function());
-    Function& fun_clone =
-        Function::Handle(zone, Function::NewSignatureFunction(
-                                   owner, parent, TokenPosition::kNoSource));
-    const TypeArguments& type_params =
-        TypeArguments::Handle(zone, fun.type_parameters());
-    if (!type_params.IsNull()) {
-      const intptr_t num_type_params = type_params.Length();
-      const TypeArguments& type_params_clone =
-          TypeArguments::Handle(zone, TypeArguments::New(num_type_params));
-      TypeParameter& type_param = TypeParameter::Handle(zone);
-      for (intptr_t i = 0; i < num_type_params; i++) {
-        type_param ^= type_params.TypeAt(i);
-        type_param ^= type_param.CloneUnfinalized();
-        type_params_clone.SetTypeAt(i, type_param);
-      }
-      fun_clone.set_type_parameters(type_params_clone);
-    }
-    AbstractType& type = AbstractType::Handle(zone, fun.result_type());
-    type = type.CloneUnfinalized();
-    fun_clone.set_result_type(type);
-    const intptr_t num_params = fun.NumParameters();
-    fun_clone.set_num_fixed_parameters(fun.num_fixed_parameters());
-    fun_clone.SetNumOptionalParameters(fun.NumOptionalParameters(),
-                                       fun.HasOptionalPositionalParameters());
-    fun_clone.set_parameter_types(
-        Array::Handle(Array::New(num_params, Heap::kOld)));
-    for (intptr_t i = 0; i < num_params; i++) {
-      type = fun.ParameterTypeAt(i);
-      type = type.CloneUnfinalized();
-      fun_clone.SetParameterTypeAt(i, type);
-    }
-    fun_clone.set_parameter_names(Array::Handle(zone, fun.parameter_names()));
-    clone.set_signature(fun_clone);
-    fun_clone.SetSignatureType(clone);
-  }
-  clone.SetIsResolved();
-  return clone.raw();
-}
-
-RawAbstractType* Type::CloneUninstantiated(const Class& new_owner,
-                                           TrailPtr trail) const {
-  ASSERT(IsFinalized());
-  ASSERT(!IsMalformed());
-  if (IsInstantiated()) {
-    return raw();
-  }
-  // We may recursively encounter a type already being cloned, because we clone
-  // the upper bounds of its uninstantiated type arguments in the same pass.
-  Zone* zone = Thread::Current()->zone();
-  Type& clone = Type::Handle(zone);
-  clone ^= OnlyBuddyInTrail(trail);
-  if (!clone.IsNull()) {
-    return clone.raw();
-  }
-  const Class& type_cls = Class::Handle(zone, type_class());
-  clone = Type::New(type_cls, TypeArguments::Handle(zone), token_pos());
-  // Preserve the bound error if any.
-  if (IsMalbounded()) {
-    const LanguageError& bound_error = LanguageError::Handle(zone, error());
-    clone.set_error(bound_error);
-  }
-  // Clone the signature if this type represents a function type.
-  const Function& fun = Function::Handle(zone, signature());
-  if (!fun.IsNull()) {
-    ASSERT(type_cls.IsTypedefClass() || type_cls.IsClosureClass());
-    // If the scope class is not a typedef and if it is generic, it must be the
-    // mixin class, set it to the new owner.
-    const Function& parent = Function::Handle(zone, fun.parent_function());
-    // TODO(regis): Is it safe to reuse the parent function with the old owner?
-    Function& fun_clone = Function::Handle(
-        zone, Function::NewSignatureFunction(new_owner, parent,
-                                             TokenPosition::kNoSource));
-    const TypeArguments& type_params =
-        TypeArguments::Handle(zone, fun.type_parameters());
-    if (!type_params.IsNull()) {
-      const intptr_t num_type_params = type_params.Length();
-      const TypeArguments& type_params_clone =
-          TypeArguments::Handle(zone, TypeArguments::New(num_type_params));
-      TypeParameter& type_param = TypeParameter::Handle(zone);
-      for (intptr_t i = 0; i < num_type_params; i++) {
-        type_param ^= type_params.TypeAt(i);
-        type_param ^= type_param.CloneUninstantiated(new_owner, trail);
-        type_params_clone.SetTypeAt(i, type_param);
-      }
-      fun_clone.set_type_parameters(type_params_clone);
-    }
-    AbstractType& type = AbstractType::Handle(zone, fun.result_type());
-    type = type.CloneUninstantiated(new_owner, trail);
-    fun_clone.set_result_type(type);
-    const intptr_t num_params = fun.NumParameters();
-    fun_clone.set_num_fixed_parameters(fun.num_fixed_parameters());
-    fun_clone.SetNumOptionalParameters(fun.NumOptionalParameters(),
-                                       fun.HasOptionalPositionalParameters());
-    fun_clone.set_parameter_types(
-        Array::Handle(Array::New(num_params, Heap::kOld)));
-    for (intptr_t i = 0; i < num_params; i++) {
-      type = fun.ParameterTypeAt(i);
-      type = type.CloneUninstantiated(new_owner, trail);
-      fun_clone.SetParameterTypeAt(i, type);
-    }
-    fun_clone.set_parameter_names(Array::Handle(zone, fun.parameter_names()));
-    clone.set_signature(fun_clone);
-  }
-  TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
-  if (!type_args.IsNull()) {
-    // Upper bounds of uninstantiated type arguments may form a cycle.
-    if (type_args.IsRecursive() || !type_args.IsInstantiated()) {
-      AddOnlyBuddyToTrail(&trail, clone);
-    }
-    type_args = type_args.CloneUninstantiated(new_owner, trail);
-    clone.set_arguments(type_args);
-  }
-  clone.SetIsFinalized();
-  clone ^= clone.Canonicalize();
-  return clone.raw();
-}
-
 RawAbstractType* Type::Canonicalize(TrailPtr trail) const {
   ASSERT(IsFinalized());
-  if (IsCanonical() || IsMalformed()) {
-    ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld());
+  if (IsCanonical()) {
+    ASSERT(TypeArguments::Handle(arguments()).IsOld());
     return this->raw();
   }
   Thread* thread = Thread::Current();
@@ -18098,7 +17107,7 @@
   // Fast canonical lookup/registry for simple types.
   if (!cls.IsGeneric() && !cls.IsClosureClass() && !cls.IsTypedefClass()) {
     ASSERT(!IsFunctionType());
-    Type& type = Type::Handle(zone, cls.CanonicalType());
+    Type& type = Type::Handle(zone, cls.declaration_type());
     if (type.IsNull()) {
       ASSERT(!cls.raw()->IsVMHeapObject() || (isolate == Dart::vm_isolate()));
       // Canonicalize the type arguments of the supertype, if any.
@@ -18110,11 +17119,12 @@
         return this->raw();
       }
       set_arguments(type_args);
-      type = cls.CanonicalType();  // May be set while canonicalizing type args.
+      type = cls.declaration_type();
+      // May be set while canonicalizing type args.
       if (type.IsNull()) {
         SafepointMutexLocker ml(isolate->type_canonicalization_mutex());
         // Recheck if type exists.
-        type = cls.CanonicalType();
+        type = cls.declaration_type();
         if (type.IsNull()) {
           if (this->IsNew()) {
             type ^= Object::Clone(*this, Heap::kOld);
@@ -18124,7 +17134,7 @@
           ASSERT(type.IsOld());
           type.ComputeHash();
           type.SetCanonical();
-          cls.set_canonical_type(type);
+          cls.set_declaration_type(type);
           return type.raw();
         }
       }
@@ -18208,7 +17218,7 @@
 
 #if defined(DEBUG)
 bool Type::CheckIsCanonical(Thread* thread) const {
-  if (IsMalformed() || IsRecursive()) {
+  if (IsRecursive()) {
     return true;
   }
   if (type_class_id() == kDynamicCid) {
@@ -18222,7 +17232,7 @@
   // Fast canonical lookup/registry for simple types.
   if (!cls.IsGeneric() && !cls.IsClosureClass() && !cls.IsTypedefClass()) {
     ASSERT(!IsFunctionType());
-    type = cls.CanonicalType();
+    type = cls.declaration_type();
     return (raw() == type.raw());
   }
 
@@ -18271,7 +17281,6 @@
 intptr_t Type::ComputeHash() const {
   ASSERT(IsFinalized());
   uint32_t result = 1;
-  if (IsMalformed()) return result;
   result = CombineHashes(result, type_class_id());
   result = CombineHashes(result, TypeArguments::Handle(arguments()).Hash());
   if (IsFunctionType()) {
@@ -18299,13 +17308,7 @@
 
 void Type::set_type_class(const Class& value) const {
   ASSERT(!value.IsNull());
-  StorePointer(&raw_ptr()->type_class_id_,
-               reinterpret_cast<RawObject*>(Smi::New(value.id())));
-}
-
-void Type::set_unresolved_class(const Object& value) const {
-  ASSERT(!value.IsNull() && value.IsUnresolvedClass());
-  StorePointer(&raw_ptr()->type_class_id_, value.raw());
+  StorePointer(&raw_ptr()->type_class_id_, Smi::New(value.id()));
 }
 
 void Type::set_arguments(const TypeArguments& value) const {
@@ -18319,17 +17322,13 @@
   return reinterpret_cast<RawType*>(raw);
 }
 
-RawType* Type::New(const Object& clazz,
+RawType* Type::New(const Class& clazz,
                    const TypeArguments& arguments,
                    TokenPosition token_pos,
                    Heap::Space space) {
   Zone* Z = Thread::Current()->zone();
   const Type& result = Type::Handle(Z, Type::New(space));
-  if (clazz.IsClass()) {
-    result.set_type_class(Class::Cast(clazz));
-  } else {
-    result.set_unresolved_class(clazz);
-  }
+  result.set_type_class(clazz);
   result.set_arguments(arguments);
   result.SetHash(0);
   result.set_token_pos(token_pos);
@@ -18356,38 +17355,31 @@
     return "Type: null";
   }
   Zone* zone = Thread::Current()->zone();
-  const char* unresolved = IsResolved() ? "" : "Unresolved ";
   const TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
   const char* args_cstr = type_args.IsNull() ? "null" : type_args.ToCString();
-  Class& cls = Class::Handle(zone);
+  const Class& cls = Class::Handle(zone, type_class());
   const char* class_name;
-  if (HasResolvedTypeClass()) {
-    cls = type_class();
-    const String& name = String::Handle(zone, cls.Name());
-    class_name = name.IsNull() ? "<null>" : name.ToCString();
-  } else {
-    class_name = UnresolvedClass::Handle(zone, unresolved_class()).ToCString();
-  }
+  const String& name = String::Handle(zone, cls.Name());
+  class_name = name.IsNull() ? "<null>" : name.ToCString();
   if (IsFunctionType()) {
     const Function& sig_fun = Function::Handle(zone, signature());
     const String& sig = String::Handle(zone, sig_fun.Signature());
     if (cls.IsClosureClass()) {
       ASSERT(type_args.IsNull());
-      return OS::SCreate(zone, "%sFunction Type: %s", unresolved,
-                         sig.ToCString());
+      return OS::SCreate(zone, "Function Type: %s", sig.ToCString());
     }
-    return OS::SCreate(zone, "%s Function Type: %s (class: %s, args: %s)",
-                       unresolved, sig.ToCString(), class_name, args_cstr);
+    return OS::SCreate(zone, "Function Type: %s (class: %s, args: %s)",
+                       sig.ToCString(), class_name, args_cstr);
   }
   if (type_args.IsNull()) {
-    return OS::SCreate(zone, "%sType: class '%s'", unresolved, class_name);
-  } else if (IsResolved() && IsFinalized() && IsRecursive()) {
+    return OS::SCreate(zone, "Type: class '%s'", class_name);
+  } else if (IsFinalized() && IsRecursive()) {
     const intptr_t hash = Hash();
     return OS::SCreate(zone, "Type: (@%p H%" Px ") class '%s', args:[%s]",
                        raw(), hash, class_name, args_cstr);
   } else {
-    return OS::SCreate(zone, "%sType: class '%s', args:[%s]", unresolved,
-                       class_name, args_cstr);
+    return OS::SCreate(zone, "Type: class '%s', args:[%s]", class_name,
+                       args_cstr);
   }
 }
 
@@ -18416,19 +17408,11 @@
   return !ref_type.IsNull() && ref_type.IsEquivalent(other, trail);
 }
 
-void TypeRef::SetScopeFunction(const Function& function) const {
-  // TypeRefs are created during finalization, when scope functions have
-  // already been adjusted.
-  UNREACHABLE();
-}
-
 RawTypeRef* TypeRef::InstantiateFrom(
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
-    Error* bound_error,
     TrailPtr instantiation_trail,
-    TrailPtr bound_trail,
     Heap::Space space) const {
   TypeRef& instantiated_type_ref = TypeRef::Handle();
   instantiated_type_ref ^= OnlyBuddyInTrail(instantiation_trail);
@@ -18443,8 +17427,12 @@
   AbstractType& instantiated_ref_type = AbstractType::Handle();
   instantiated_ref_type = ref_type.InstantiateFrom(
       instantiator_type_arguments, function_type_arguments,
-      num_free_fun_type_params, bound_error, instantiation_trail, bound_trail,
-      space);
+      num_free_fun_type_params, instantiation_trail, space);
+  // A returned null type indicates a failed instantiation in dead code that
+  // must be propagated up to the caller, the optimizing compiler.
+  if (instantiated_ref_type.IsNull()) {
+    return TypeRef::null();
+  }
   ASSERT(!instantiated_ref_type.IsTypeRef());
   instantiated_type_ref.set_type(instantiated_ref_type);
 
@@ -18453,28 +17441,8 @@
   return instantiated_type_ref.raw();
 }
 
-RawTypeRef* TypeRef::CloneUninstantiated(const Class& new_owner,
-                                         TrailPtr trail) const {
-  TypeRef& cloned_type_ref = TypeRef::Handle();
-  cloned_type_ref ^= OnlyBuddyInTrail(trail);
-  if (!cloned_type_ref.IsNull()) {
-    return cloned_type_ref.raw();
-  }
-  cloned_type_ref = TypeRef::New();
-  AddOnlyBuddyToTrail(&trail, cloned_type_ref);
-  AbstractType& ref_type = AbstractType::Handle(type());
-  ASSERT(!ref_type.IsNull() && !ref_type.IsTypeRef());
-  AbstractType& cloned_ref_type = AbstractType::Handle();
-  cloned_ref_type = ref_type.CloneUninstantiated(new_owner, trail);
-  ASSERT(!cloned_ref_type.IsTypeRef());
-  cloned_type_ref.set_type(cloned_ref_type);
-  cloned_type_ref.SetTypeTestingStub(Instructions::Handle(
-      TypeTestingStubGenerator::DefaultCodeForType(cloned_type_ref)));
-  return cloned_type_ref.raw();
-}
-
 void TypeRef::set_type(const AbstractType& value) const {
-  ASSERT(value.IsFunctionType() || value.HasResolvedTypeClass());
+  ASSERT(value.IsFunctionType() || value.HasTypeClass());
   ASSERT(!value.IsTypeRef());
   StorePointer(&raw_ptr()->type_, value.raw());
 }
@@ -18644,9 +17612,7 @@
     const TypeArguments& instantiator_type_arguments,
     const TypeArguments& function_type_arguments,
     intptr_t num_free_fun_type_params,
-    Error* bound_error,
     TrailPtr instantiation_trail,
-    TrailPtr bound_trail,
     Heap::Space space) const {
   ASSERT(IsFinalized());
   if (IsFunctionTypeParameter()) {
@@ -18668,132 +17634,15 @@
     // mismatching type arguments vector. This can only happen for
     // a dynamically unreachable code - which compiler can't remove
     // statically for some reason.
-    // To prevent crashes we treat it as a bound error.
+    // To prevent crashes we return AbstractType::null(), understood by caller
     // (see AssertAssignableInstr::Canonicalize).
-    auto space = Thread::Current()->IsMutatorThread() ? Heap::kNew : Heap::kOld;
-    *bound_error = LanguageError::New(
-        String::Handle(String::New("Mismatching type argument vector.", space)),
-        Report::kError, space);
-    return raw();
+    return AbstractType::null();
   }
   return instantiator_type_arguments.TypeAt(index());
   // There is no need to canonicalize the instantiated type parameter, since all
   // type arguments are canonicalized at type finalization time. It would be too
   // early to canonicalize the returned type argument here, since instantiation
   // not only happens at run time, but also during type finalization.
-
-  // If the instantiated type parameter type_arg is a BoundedType, it means that
-  // it is still uninstantiated and that we are instantiating at finalization
-  // time (i.e. compile time).
-  // Indeed, the instantiator (type arguments of an instance) is always
-  // instantiated at run time and any bounds were checked during allocation.
-  // Similarly, function type arguments are always instantiated before being
-  // passed to a function at run time and bounds are checked as part of the
-  // signature compatibility check (during call resolution or in the function
-  // prolog).
-}
-
-bool TypeParameter::CheckBound(const AbstractType& bounded_type,
-                               const AbstractType& upper_bound,
-                               Error* bound_error,
-                               TrailPtr bound_trail,
-                               Heap::Space space) const {
-  ASSERT((bound_error != NULL) && bound_error->IsNull());
-  ASSERT(bounded_type.IsFinalized());
-  ASSERT(upper_bound.IsFinalized());
-  ASSERT(!bounded_type.IsMalformed());
-  if (bounded_type.IsTypeRef() || upper_bound.IsTypeRef()) {
-    // Shortcut the bound check if the pair <bounded_type, upper_bound> is
-    // already in the trail.
-    if (bounded_type.TestAndAddBuddyToTrail(&bound_trail, upper_bound)) {
-      return true;
-    }
-  }
-
-  if (bounded_type.IsSubtypeOf(upper_bound, bound_error, bound_trail, space)) {
-    return true;
-  }
-  // Set bound_error if the caller is interested and if this is the first error.
-  if ((bound_error != NULL) && bound_error->IsNull()) {
-    // Report the bound error only if both the bounded type and the upper bound
-    // are instantiated. Otherwise, we cannot tell yet it is a bound error.
-    if (bounded_type.IsInstantiated() && upper_bound.IsInstantiated()) {
-      // There is another special case where we do not want to report a bound
-      // error yet: if the upper bound is a function type, but the bounded type
-      // is not and its class is not compiled yet, i.e. we cannot look for
-      // a call method yet.
-      if (!bounded_type.IsFunctionType() && upper_bound.IsFunctionType() &&
-          bounded_type.HasResolvedTypeClass() &&
-          !Class::Handle(bounded_type.type_class()).is_finalized()) {
-        return false;  // Not a subtype yet, but no bound error yet.
-      }
-      const String& bounded_type_name =
-          String::Handle(bounded_type.UserVisibleName());
-      const String& upper_bound_name =
-          String::Handle(upper_bound.UserVisibleName());
-      const AbstractType& declared_bound = AbstractType::Handle(bound());
-      const String& declared_bound_name =
-          String::Handle(declared_bound.UserVisibleName());
-      const String& type_param_name = String::Handle(UserVisibleName());
-      const Class& cls = Class::Handle(parameterized_class());
-      const String& class_name = String::Handle(cls.Name());
-      const Script& script = Script::Handle(cls.script());
-      // Since the bound may have been canonicalized, its token index is
-      // meaningless, therefore use the token index of this type parameter.
-      *bound_error = LanguageError::NewFormatted(
-          *bound_error, script, token_pos(), Report::AtLocation,
-          Report::kMalboundedType, Heap::kOld,
-          "type parameter '%s' of class '%s' must extend bound '%s', "
-          "but type argument '%s' is not a subtype of '%s'",
-          type_param_name.ToCString(), class_name.ToCString(),
-          declared_bound_name.ToCString(), bounded_type_name.ToCString(),
-          upper_bound_name.ToCString());
-    }
-  }
-  return false;
-}
-
-RawAbstractType* TypeParameter::CloneUnfinalized() const {
-  if (IsFinalized()) {
-    return raw();
-  }
-  // No need to clone bound, as it is not part of the finalization state.
-  return TypeParameter::New(Class::Handle(parameterized_class()),
-                            Function::Handle(parameterized_function()), index(),
-                            String::Handle(name()),
-                            AbstractType::Handle(bound()), token_pos());
-}
-
-RawAbstractType* TypeParameter::CloneUninstantiated(const Class& new_owner,
-                                                    TrailPtr trail) const {
-  ASSERT(IsFinalized());
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  TypeParameter& clone = TypeParameter::Handle(zone);
-  clone ^= OnlyBuddyInTrail(trail);
-  if (!clone.IsNull()) {
-    return clone.raw();
-  }
-  intptr_t new_index = index();
-  AbstractType& upper_bound = AbstractType::Handle(zone, bound());
-  const Function& fun = Function::Handle(zone, parameterized_function());
-  Class& cls = Class::Handle(zone, parameterized_class());
-  if (!cls.IsNull()) {
-    ASSERT(fun.IsNull());
-    new_index += new_owner.NumTypeArguments() - cls.NumTypeArguments();
-    cls = new_owner.raw();
-  } else {
-    ASSERT(IsFunctionTypeParameter());
-    // Only the bounds of function type parameters need cloning.
-  }
-  clone = TypeParameter::New(cls, fun, new_index, String::Handle(zone, name()),
-                             upper_bound,  // Not cloned yet.
-                             token_pos());
-  clone.SetIsFinalized();
-  AddOnlyBuddyToTrail(&trail, clone);
-  upper_bound = upper_bound.CloneUninstantiated(new_owner, trail);
-  clone.set_bound(upper_bound);
-  return clone.raw();
 }
 
 void TypeParameter::EnumerateURIs(URIs* uris) const {
@@ -18881,7 +17730,9 @@
 const char* TypeParameter::ToCString() const {
   const char* name_cstr = String::Handle(Name()).ToCString();
   const AbstractType& upper_bound = AbstractType::Handle(bound());
-  const char* bound_cstr = String::Handle(upper_bound.Name()).ToCString();
+  const char* bound_cstr = upper_bound.IsNull()
+                               ? "<null>"
+                               : String::Handle(upper_bound.Name()).ToCString();
   if (IsFunctionTypeParameter()) {
     const char* format =
         "TypeParameter: name %s; index: %d; function: %s; bound: %s";
@@ -18910,305 +17761,6 @@
   }
 }
 
-bool BoundedType::IsMalformed() const {
-  return AbstractType::Handle(type()).IsMalformed();
-}
-
-bool BoundedType::IsMalbounded() const {
-  return AbstractType::Handle(type()).IsMalbounded();
-}
-
-bool BoundedType::IsMalformedOrMalbounded() const {
-  return AbstractType::Handle(type()).IsMalformedOrMalbounded();
-}
-
-RawLanguageError* BoundedType::error() const {
-  return AbstractType::Handle(type()).error();
-}
-
-bool BoundedType::IsEquivalent(const Instance& other, TrailPtr trail) const {
-  // BoundedType are not canonicalized, because their bound may get finalized
-  // after the BoundedType is created and initialized.
-  if (raw() == other.raw()) {
-    return true;
-  }
-  if (other.IsTypeRef()) {
-    // Unfold right hand type. Divergence is controlled by left hand type.
-    const AbstractType& other_ref_type =
-        AbstractType::Handle(TypeRef::Cast(other).type());
-    ASSERT(!other_ref_type.IsTypeRef());
-    return IsEquivalent(other_ref_type, trail);
-  }
-  if (!other.IsBoundedType()) {
-    return false;
-  }
-  const BoundedType& other_bounded = BoundedType::Cast(other);
-  if (type_parameter() != other_bounded.type_parameter()) {
-    return false;
-  }
-  const AbstractType& this_type = AbstractType::Handle(type());
-  const AbstractType& other_type = AbstractType::Handle(other_bounded.type());
-  if (!this_type.IsEquivalent(other_type, trail)) {
-    return false;
-  }
-  const AbstractType& this_bound = AbstractType::Handle(bound());
-  const AbstractType& other_bound = AbstractType::Handle(other_bounded.bound());
-  return this_bound.IsFinalized() && other_bound.IsFinalized() &&
-         this_bound.Equals(other_bound);  // Different graph, do not pass trail.
-}
-
-bool BoundedType::IsRecursive() const {
-  return AbstractType::Handle(type()).IsRecursive();
-}
-
-void BoundedType::SetScopeFunction(const Function& function) const {
-  AbstractType::Handle(type()).SetScopeFunction(function);
-  AbstractType::Handle(bound()).SetScopeFunction(function);
-}
-
-void BoundedType::set_type(const AbstractType& value) const {
-  ASSERT(value.IsFinalized() || value.IsBeingFinalized() ||
-         value.IsTypeParameter());
-  ASSERT(!value.IsMalformed());
-  StorePointer(&raw_ptr()->type_, value.raw());
-}
-
-void BoundedType::set_bound(const AbstractType& value) const {
-  // The bound may still be unfinalized because of legal cycles.
-  // It must be finalized before it is checked at run time, though.
-  ASSERT(value.IsFinalized() || value.IsBeingFinalized());
-  StorePointer(&raw_ptr()->bound_, value.raw());
-}
-
-void BoundedType::set_type_parameter(const TypeParameter& value) const {
-  // A null type parameter is set when marking a type malformed because of a
-  // bound error at compile time.
-  ASSERT(value.IsNull() || value.IsFinalized());
-  StorePointer(&raw_ptr()->type_parameter_, value.raw());
-}
-
-RawAbstractType* BoundedType::InstantiateFrom(
-    const TypeArguments& instantiator_type_arguments,
-    const TypeArguments& function_type_arguments,
-    intptr_t num_free_fun_type_params,
-    Error* bound_error,
-    TrailPtr instantiation_trail,
-    TrailPtr bound_trail,
-    Heap::Space space) const {
-  ASSERT(IsFinalized());
-  AbstractType& bounded_type = AbstractType::Handle(type());
-  ASSERT(bounded_type.IsFinalized());
-  AbstractType& instantiated_bounded_type =
-      AbstractType::Handle(bounded_type.raw());
-  if (!bounded_type.IsInstantiated(kAny, num_free_fun_type_params)) {
-    instantiated_bounded_type = bounded_type.InstantiateFrom(
-        instantiator_type_arguments, function_type_arguments,
-        num_free_fun_type_params, bound_error, instantiation_trail, bound_trail,
-        space);
-    // In case types of instantiator_type_arguments are not finalized
-    // (or instantiated), then the instantiated_bounded_type is not finalized
-    // (or instantiated) either.
-    // Note that instantiator_type_arguments must have the final length, though.
-  }
-  // If instantiated_bounded_type is not finalized, it is too early to check
-  // its upper bound. It will be checked in a second finalization phase.
-  if ((Isolate::Current()->type_checks()) && (bound_error != NULL) &&
-      bound_error->IsNull() && instantiated_bounded_type.IsFinalized()) {
-    AbstractType& upper_bound = AbstractType::Handle(bound());
-    ASSERT(!upper_bound.IsObjectType() && !upper_bound.IsDynamicType());
-    AbstractType& instantiated_upper_bound =
-        AbstractType::Handle(upper_bound.raw());
-    if (upper_bound.IsFinalized() &&
-        !upper_bound.IsInstantiated(kAny, num_free_fun_type_params)) {
-      instantiated_upper_bound = upper_bound.InstantiateFrom(
-          instantiator_type_arguments, function_type_arguments,
-          num_free_fun_type_params, bound_error, instantiation_trail,
-          bound_trail, space);
-      // The instantiated_upper_bound may not be finalized or instantiated.
-      // See comment above.
-    }
-    if (bound_error->IsNull()) {
-      // Shortcut the F-bounded case where we have reached a fixpoint.
-      if (instantiated_bounded_type.Equals(bounded_type) &&
-          instantiated_upper_bound.Equals(upper_bound)) {
-        return bounded_type.raw();
-      }
-      const TypeParameter& type_param = TypeParameter::Handle(type_parameter());
-      if (instantiated_upper_bound.IsFinalized() &&
-          (!type_param.CheckBound(instantiated_bounded_type,
-                                  instantiated_upper_bound, bound_error,
-                                  bound_trail, space) &&
-           bound_error->IsNull())) {
-        // We cannot determine yet whether the bounded_type is below the
-        // upper_bound, because one or both of them is still being finalized or
-        // uninstantiated. For example, instantiated_bounded_type may be the
-        // still unfinalized cloned type parameter of a mixin application class.
-        // There is another special case where we do not want to report a bound
-        // error yet: if the upper bound is a function type, but the bounded
-        // type is not and its class is not compiled yet, i.e. we cannot look
-        // for a call method yet.
-        ASSERT(!instantiated_bounded_type.IsInstantiated() ||
-               !instantiated_upper_bound.IsInstantiated() ||
-               (!instantiated_bounded_type.IsFunctionType() &&
-                instantiated_upper_bound.IsFunctionType() &&
-                instantiated_bounded_type.HasResolvedTypeClass() &&
-                !Class::Handle(instantiated_bounded_type.type_class())
-                     .is_finalized()));
-        // Postpone bound check by returning a new BoundedType with unfinalized
-        // or partially instantiated bounded_type and upper_bound, but keeping
-        // type_param.
-        instantiated_bounded_type = BoundedType::New(
-            instantiated_bounded_type, instantiated_upper_bound, type_param);
-      }
-    }
-  }
-  return instantiated_bounded_type.raw();
-}
-
-RawAbstractType* BoundedType::CloneUnfinalized() const {
-  if (IsFinalized()) {
-    return raw();
-  }
-  const AbstractType& bounded_type = AbstractType::Handle(type());
-  const AbstractType& bounded_type_clone =
-      AbstractType::Handle(bounded_type.CloneUnfinalized());
-  if (bounded_type_clone.raw() == bounded_type.raw()) {
-    return raw();
-  }
-  // No need to clone bound or type parameter, as they are not part of the
-  // finalization state of this bounded type.
-  return BoundedType::New(bounded_type, AbstractType::Handle(bound()),
-                          TypeParameter::Handle(type_parameter()));
-}
-
-RawAbstractType* BoundedType::CloneUninstantiated(const Class& new_owner,
-                                                  TrailPtr trail) const {
-  if (IsInstantiated()) {
-    return raw();
-  }
-  AbstractType& bounded_type = AbstractType::Handle(type());
-  bounded_type = bounded_type.CloneUninstantiated(new_owner, trail);
-  AbstractType& upper_bound = AbstractType::Handle(bound());
-  upper_bound = upper_bound.CloneUninstantiated(new_owner, trail);
-  TypeParameter& type_param = TypeParameter::Handle(type_parameter());
-  type_param ^= type_param.CloneUninstantiated(new_owner, trail);
-  return BoundedType::New(bounded_type, upper_bound, type_param);
-}
-
-void BoundedType::EnumerateURIs(URIs* uris) const {
-  // The bound does not appear in the user visible name.
-  AbstractType::Handle(type()).EnumerateURIs(uris);
-}
-
-intptr_t BoundedType::ComputeHash() const {
-  uint32_t result = AbstractType::Handle(type()).Hash();
-  // No need to include the hash of the bound, since the bound is defined by the
-  // type parameter (modulo instantiation state).
-  result =
-      CombineHashes(result, TypeParameter::Handle(type_parameter()).Hash());
-  result = FinalizeHash(result, kHashBits);
-  SetHash(result);
-  return result;
-}
-
-RawBoundedType* BoundedType::New() {
-  RawObject* raw = Object::Allocate(BoundedType::kClassId,
-                                    BoundedType::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawBoundedType*>(raw);
-}
-
-RawBoundedType* BoundedType::New(const AbstractType& type,
-                                 const AbstractType& bound,
-                                 const TypeParameter& type_parameter) {
-  Zone* Z = Thread::Current()->zone();
-  const BoundedType& result = BoundedType::Handle(Z, BoundedType::New());
-  result.set_type(type);
-  result.set_bound(bound);
-  result.SetHash(0);
-  result.set_type_parameter(type_parameter);
-
-  result.SetTypeTestingStub(Instructions::Handle(
-      Z, TypeTestingStubGenerator::DefaultCodeForType(result)));
-  return result.raw();
-}
-
-const char* BoundedType::ToCString() const {
-  const char* format = "BoundedType: type %s; bound: %s; type param: %s of %s";
-  const char* type_cstr =
-      String::Handle(AbstractType::Handle(type()).Name()).ToCString();
-  const char* bound_cstr =
-      String::Handle(AbstractType::Handle(bound()).Name()).ToCString();
-  const TypeParameter& type_param = TypeParameter::Handle(type_parameter());
-  const char* type_param_cstr = String::Handle(type_param.name()).ToCString();
-  const Class& cls = Class::Handle(type_param.parameterized_class());
-  const char* cls_cstr = String::Handle(cls.Name()).ToCString();
-  intptr_t len = Utils::SNPrint(NULL, 0, format, type_cstr, bound_cstr,
-                                type_param_cstr, cls_cstr) +
-                 1;
-  char* chars = Thread::Current()->zone()->Alloc<char>(len);
-  Utils::SNPrint(chars, len, format, type_cstr, bound_cstr, type_param_cstr,
-                 cls_cstr);
-  return chars;
-}
-
-TokenPosition MixinAppType::token_pos() const {
-  return AbstractType::Handle(MixinTypeAt(0)).token_pos();
-}
-
-intptr_t MixinAppType::Depth() const {
-  return Array::Handle(mixin_types()).Length();
-}
-
-RawString* MixinAppType::Name() const {
-  return String::New("MixinAppType");
-}
-
-const char* MixinAppType::ToCString() const {
-  const char* format = "MixinAppType: super type: %s; first mixin type: %s";
-  const char* super_type_cstr =
-      String::Handle(AbstractType::Handle(super_type()).Name()).ToCString();
-  const char* first_mixin_type_cstr =
-      String::Handle(AbstractType::Handle(MixinTypeAt(0)).Name()).ToCString();
-  intptr_t len =
-      Utils::SNPrint(NULL, 0, format, super_type_cstr, first_mixin_type_cstr) +
-      1;
-  char* chars = Thread::Current()->zone()->Alloc<char>(len);
-  Utils::SNPrint(chars, len, format, super_type_cstr, first_mixin_type_cstr);
-  return chars;
-}
-
-RawAbstractType* MixinAppType::MixinTypeAt(intptr_t depth) const {
-  return AbstractType::RawCast(Array::Handle(mixin_types()).At(depth));
-}
-
-void MixinAppType::set_super_type(const AbstractType& value) const {
-  StorePointer(&raw_ptr()->super_type_, value.raw());
-}
-
-void MixinAppType::set_mixin_types(const Array& value) const {
-  StorePointer(&raw_ptr()->mixin_types_, value.raw());
-}
-
-RawMixinAppType* MixinAppType::New() {
-  // MixinAppType objects do not survive finalization, so allocate
-  // on new heap.
-  RawObject* raw = Object::Allocate(MixinAppType::kClassId,
-                                    MixinAppType::InstanceSize(), Heap::kOld);
-  return reinterpret_cast<RawMixinAppType*>(raw);
-}
-
-RawMixinAppType* MixinAppType::New(const AbstractType& super_type,
-                                   const Array& mixin_types) {
-  Zone* Z = Thread::Current()->zone();
-  const MixinAppType& result = MixinAppType::Handle(Z, MixinAppType::New());
-  result.set_super_type(super_type);
-  result.set_mixin_types(mixin_types);
-
-  result.SetTypeTestingStub(Instructions::Handle(
-      Z, TypeTestingStubGenerator::DefaultCodeForType(result)));
-  return result.raw();
-}
-
 RawInstance* Number::CheckAndCanonicalize(Thread* thread,
                                           const char** error_str) const {
   intptr_t cid = GetClassId();
@@ -19265,6 +17817,9 @@
 RawInteger* Integer::New(const String& str, Heap::Space space) {
   // We are not supposed to have integers represented as two byte strings.
   ASSERT(str.IsOneByteString());
+  if (str.IsNull() || (str.Length() == 0)) {
+    return Integer::null();
+  }
   int64_t value = 0;
   const char* cstr = str.ToCString();
   if (!OS::StringToInt64(cstr, &value)) {
@@ -19918,22 +18473,6 @@
   return ExternalTwoByteString::CharAt(*this, index);
 }
 
-Scanner::CharAtFunc String::CharAtFunc() const {
-  intptr_t class_id = raw()->GetClassId();
-  ASSERT(RawObject::IsStringClassId(class_id));
-  if (class_id == kOneByteStringCid) {
-    return &OneByteString::CharAt;
-  }
-  if (class_id == kTwoByteStringCid) {
-    return &TwoByteString::CharAt;
-  }
-  if (class_id == kExternalOneByteStringCid) {
-    return &ExternalOneByteString::CharAt;
-  }
-  ASSERT(class_id == kExternalTwoByteStringCid);
-  return &ExternalTwoByteString::CharAt;
-}
-
 intptr_t String::CharSize() const {
   intptr_t class_id = raw()->GetClassId();
   if (class_id == kOneByteStringCid || class_id == kExternalOneByteStringCid) {
@@ -19978,10 +18517,8 @@
     return false;  // Lengths don't match.
   }
 
-  Scanner::CharAtFunc this_char_at_func = this->CharAtFunc();
-  Scanner::CharAtFunc str_char_at_func = str.CharAtFunc();
   for (intptr_t i = 0; i < len; i++) {
-    if (this_char_at_func(*this, i) != str_char_at_func(str, begin_index + i)) {
+    if (CharAt(i) != str.CharAt(begin_index + i)) {
       return false;
     }
   }
@@ -20126,16 +18663,22 @@
     const String& strobj = String::Handle(OneByteString::New(len, space));
     if (len > 0) {
       NoSafepointScope no_safepoint;
-      Utf8::DecodeToLatin1(utf8_array, array_len,
-                           OneByteString::DataStart(strobj), len);
+      if (!Utf8::DecodeToLatin1(utf8_array, array_len,
+                                OneByteString::DataStart(strobj), len)) {
+        Utf8::ReportInvalidByte(utf8_array, array_len, len);
+        return String::null();
+      }
     }
     return strobj.raw();
   }
   ASSERT((type == Utf8::kBMP) || (type == Utf8::kSupplementary));
   const String& strobj = String::Handle(TwoByteString::New(len, space));
   NoSafepointScope no_safepoint;
-  Utf8::DecodeToUTF16(utf8_array, array_len, TwoByteString::DataStart(strobj),
-                      len);
+  if (!Utf8::DecodeToUTF16(utf8_array, array_len,
+                           TwoByteString::DataStart(strobj), len)) {
+    Utf8::ReportInvalidByte(utf8_array, array_len, len);
+    return String::null();
+  }
   return strobj.raw();
 }
 
@@ -20657,9 +19200,8 @@
     startChar = ExternalOneByteString::CharAddr(str, start);
   } else {
     uint8_t* chars = Thread::Current()->zone()->Alloc<uint8_t>(length);
-    const Scanner::CharAtFunc char_at = str.CharAtFunc();
     for (intptr_t i = 0; i < length; i++) {
-      int32_t ch = char_at(str, start + i);
+      int32_t ch = str.CharAt(start + i);
       if (ch < 128) {
         chars[i] = ch;
       } else {
@@ -21338,7 +19880,12 @@
 
 RawArray* Array::New(intptr_t len, Heap::Space space) {
   ASSERT(Isolate::Current()->object_store()->array_class() != Class::null());
-  return New(kClassId, len, space);
+  RawArray* result = New(kClassId, len, space);
+  if (result->Size() > Heap::kNewAllocatableSize) {
+    ASSERT(result->IsOldObject());
+    result->SetCardRememberedBitUnsynchronized();
+  }
+  return result;
 }
 
 RawArray* Array::New(intptr_t len,
@@ -21375,7 +19922,7 @@
   // allocated array with values from the given source array instead of
   // null-initializing all elements.
   Array& dest = Array::Handle(Array::New(count));
-  dest.StorePointers(dest.ObjectAddr(0), ObjectAddr(start), count);
+  dest.StoreArrayPointers(dest.ObjectAddr(0), ObjectAddr(start), count);
 
   if (with_type_argument) {
     dest.SetTypeArguments(TypeArguments::Handle(GetTypeArguments()));
@@ -21429,6 +19976,47 @@
   return result.raw();
 }
 
+void Array::Truncate(intptr_t new_len) const {
+  if (IsNull()) {
+    return;
+  }
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  const Array& array = Array::Handle(zone, this->raw());
+
+  intptr_t old_len = array.Length();
+  ASSERT(new_len <= old_len);
+  intptr_t old_size = Array::InstanceSize(old_len);
+  intptr_t new_size = Array::InstanceSize(new_len);
+
+  NoSafepointScope no_safepoint;
+
+  // If there is any left over space fill it with either an Array object or
+  // just a plain object (depending on the amount of left over space) so
+  // that it can be traversed over successfully during garbage collection.
+  Object::MakeUnusedSpaceTraversable(array, old_size, new_size);
+
+  // Update the size in the header field and length of the array object.
+  uword tags = array.raw_ptr()->tags_;
+  ASSERT(kArrayCid == RawObject::ClassIdTag::decode(tags));
+  uint32_t old_tags;
+  do {
+    old_tags = tags;
+    uint32_t new_tags = RawObject::SizeTag::update(new_size, old_tags);
+    tags = CompareAndSwapTags(old_tags, new_tags);
+  } while (tags != old_tags);
+  // TODO(22501): For the heap to remain walkable by the sweeper, it must
+  // observe the creation of the filler object no later than the new length
+  // of the array. This assumption holds on ia32/x64 or if the CAS above is a
+  // full memory barrier.
+  //
+  // Also, between the CAS of the header above and the SetLength below,
+  // the array is temporarily in an inconsistent state. The header is considered
+  // the overriding source of object size by RawObject::Size, but the ASSERTs
+  // in RawObject::SizeFromClass must handle this special case.
+  array.SetLength(new_len);
+}
+
 RawArray* Array::MakeFixedLength(const GrowableObjectArray& growable_array,
                                  bool unique) {
   ASSERT(!growable_array.IsNull());
@@ -21452,43 +20040,16 @@
     array.SetTypeArguments(type_arguments);
     return array.raw();
   }
-  intptr_t capacity_len = growable_array.Capacity();
   const Array& array = Array::Handle(zone, growable_array.data());
   ASSERT(array.IsArray());
   array.SetTypeArguments(type_arguments);
-  intptr_t capacity_size = Array::InstanceSize(capacity_len);
-  intptr_t used_size = Array::InstanceSize(used_len);
-  NoSafepointScope no_safepoint;
-
-  // If there is any left over space fill it with either an Array object or
-  // just a plain object (depending on the amount of left over space) so
-  // that it can be traversed over successfully during garbage collection.
-  Object::MakeUnusedSpaceTraversable(array, capacity_size, used_size);
-
-  // Update the size in the header field and length of the array object.
-  uword tags = array.raw_ptr()->tags_;
-  ASSERT(kArrayCid == RawObject::ClassIdTag::decode(tags));
-  uint32_t old_tags;
-  do {
-    old_tags = tags;
-    uint32_t new_tags = RawObject::SizeTag::update(used_size, old_tags);
-    tags = array.CompareAndSwapTags(old_tags, new_tags);
-  } while (tags != old_tags);
-  // TODO(22501): For the heap to remain walkable by the sweeper, it must
-  // observe the creation of the filler object no later than the new length
-  // of the array. This assumption holds on ia32/x64 or if the CAS above is a
-  // full memory barrier.
-  //
-  // Also, between the CAS of the header above and the SetLength below,
-  // the array is temporarily in an inconsistent state. The header is considered
-  // the overriding source of object size by RawObject::Size, but the ASSERTs
-  // in RawObject::SizeFromClass must handle this special case.
-  array.SetLength(used_len);
 
   // Null the GrowableObjectArray, we are removing its backing array.
   growable_array.SetLength(0);
   growable_array.SetData(Object::empty_array());
 
+  // Truncate the old backing array and return it.
+  array.Truncate(used_len);
   return array.raw();
 }
 
@@ -22124,7 +20685,9 @@
 }
 
 int64_t Closure::ComputeHash() const {
-  Zone* zone = Thread::Current()->zone();
+  Thread* thread = Thread::Current();
+  DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
+  Zone* zone = thread->zone();
   const Function& func = Function::Handle(zone, function());
   uint32_t result = 0;
   if (func.IsImplicitInstanceClosureFunction()) {
@@ -22227,12 +20790,13 @@
   return code_array.Length();
 }
 
-RawCode* StackTrace::CodeAtFrame(intptr_t frame_index) const {
+RawObject* StackTrace::CodeAtFrame(intptr_t frame_index) const {
   const Array& code_array = Array::Handle(raw_ptr()->code_array_);
-  return reinterpret_cast<RawCode*>(code_array.At(frame_index));
+  return code_array.At(frame_index);
 }
 
-void StackTrace::SetCodeAtFrame(intptr_t frame_index, const Code& code) const {
+void StackTrace::SetCodeAtFrame(intptr_t frame_index,
+                                const Object& code) const {
   const Array& code_array = Array::Handle(raw_ptr()->code_array_);
   code_array.SetAt(frame_index, code);
 }
@@ -22312,6 +20876,14 @@
       String::Handle(zone, function.QualifiedUserVisibleName());
   const String& url = String::Handle(
       zone, script.IsNull() ? String::New("Kernel") : script.url());
+
+  // If the URI starts with "data:application/dart;" this is a URI encoded
+  // script so we shouldn't print the entire URI because it could be very long.
+  const char* url_string = url.ToCString();
+  if (strstr(url_string, "data:application/dart;") == url_string) {
+    url_string = "<data:application/dart>";
+  }
+
   intptr_t line = -1;
   intptr_t column = -1;
   if (FLAG_precompiled_mode) {
@@ -22326,7 +20898,6 @@
     }
   }
 
-  const char* url_string = url.ToCString();
   if (column >= 0) {
     buffer->Printf("#%-6" Pd " %s (%s:%" Pd ":%" Pd ")\n", frame_index,
                    function_name.ToCString(), url_string, line, column);
@@ -22343,7 +20914,9 @@
   Zone* zone = Thread::Current()->zone();
   StackTrace& stack_trace = StackTrace::Handle(zone, stack_trace_in.raw());
   Function& function = Function::Handle(zone);
+  Object& code_object = Object::Handle(zone);
   Code& code = Code::Handle(zone);
+  Bytecode& bytecode = Bytecode::Handle(zone);
 
   GrowableArray<const Function*> inlined_functions;
   GrowableArray<TokenPosition> inlined_token_positions;
@@ -22354,8 +20927,8 @@
   intptr_t frame_index = 0;
   do {
     for (intptr_t i = 0; i < stack_trace.Length(); i++) {
-      code = stack_trace.CodeAtFrame(i);
-      if (code.IsNull()) {
+      code_object = stack_trace.CodeAtFrame(i);
+      if (code_object.IsNull()) {
         // Check for a null function, which indicates a gap in a StackOverflow
         // or OutOfMemory trace.
         if ((i < (stack_trace.Length() - 1)) &&
@@ -22365,33 +20938,46 @@
           // To account for gap frames.
           frame_index += Smi::Value(stack_trace.PcOffsetAtFrame(i));
         }
-      } else if (code.raw() ==
-                 StubCode::AsynchronousGapMarker_entry()->code()) {
+      } else if (code_object.raw() == StubCode::AsynchronousGapMarker().raw()) {
         buffer.AddString("<asynchronous suspension>\n");
         // The frame immediately after the asynchronous gap marker is the
         // identical to the frame above the marker. Skip the frame to enhance
         // the readability of the trace.
         i++;
       } else {
-        ASSERT(code.IsFunctionCode());
         intptr_t pc_offset = Smi::Value(stack_trace.PcOffsetAtFrame(i));
-        if (code.is_optimized() && stack_trace.expand_inlined()) {
-          code.GetInlinedFunctionsAtReturnAddress(pc_offset, &inlined_functions,
-                                                  &inlined_token_positions);
-          ASSERT(inlined_functions.length() >= 1);
-          for (intptr_t j = inlined_functions.length() - 1; j >= 0; j--) {
-            if (inlined_functions[j]->is_visible() ||
-                FLAG_show_invisible_frames) {
-              PrintStackTraceFrame(zone, &buffer, *inlined_functions[j],
-                                   inlined_token_positions[j], frame_index);
+        if (code_object.IsCode()) {
+          code ^= code_object.raw();
+          ASSERT(code.IsFunctionCode());
+          if (code.is_optimized() && stack_trace.expand_inlined()) {
+            code.GetInlinedFunctionsAtReturnAddress(
+                pc_offset, &inlined_functions, &inlined_token_positions);
+            ASSERT(inlined_functions.length() >= 1);
+            for (intptr_t j = inlined_functions.length() - 1; j >= 0; j--) {
+              if (inlined_functions[j]->is_visible() ||
+                  FLAG_show_invisible_frames) {
+                PrintStackTraceFrame(zone, &buffer, *inlined_functions[j],
+                                     inlined_token_positions[j], frame_index);
+                frame_index++;
+              }
+            }
+          } else {
+            function = code.function();
+            if (function.is_visible() || FLAG_show_invisible_frames) {
+              uword pc = code.PayloadStart() + pc_offset;
+              const TokenPosition token_pos = code.GetTokenIndexOfPC(pc);
+              PrintStackTraceFrame(zone, &buffer, function, token_pos,
+                                   frame_index);
               frame_index++;
             }
           }
         } else {
-          function = code.function();
+          ASSERT(code_object.IsBytecode());
+          bytecode ^= code_object.raw();
+          function = bytecode.function();
           if (function.is_visible() || FLAG_show_invisible_frames) {
-            uword pc = code.PayloadStart() + pc_offset;
-            const TokenPosition token_pos = code.GetTokenIndexOfPC(pc);
+            uword pc = bytecode.PayloadStart() + pc_offset;
+            const TokenPosition token_pos = bytecode.GetTokenIndexOfPC(pc);
             PrintStackTraceFrame(zone, &buffer, function, token_pos,
                                  frame_index);
             frame_index++;
@@ -22410,7 +20996,7 @@
 #if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
   Zone* zone = Thread::Current()->zone();
   StackTrace& stack_trace = StackTrace::Handle(zone, stack_trace_in.raw());
-  Code& code = Code::Handle(zone);
+  Object& code = Object::Handle(zone);
   ZoneTextBuffer buffer(zone, 1024);
 
   // The Dart standard requires the output of StackTrace.toString to include
@@ -22440,8 +21026,7 @@
           // To account for gap frames.
           frame_index += Smi::Value(stack_trace.PcOffsetAtFrame(i));
         }
-      } else if (code.raw() ==
-                 StubCode::AsynchronousGapMarker_entry()->code()) {
+      } else if (code.raw() == StubCode::AsynchronousGapMarker().raw()) {
         buffer.AddString("<asynchronous suspension>\n");
         // The frame immediately after the asynchronous gap marker is the
         // identical to the frame above the marker. Skip the frame to enhance
@@ -22451,7 +21036,9 @@
         intptr_t pc_offset = Smi::Value(stack_trace.PcOffsetAtFrame(i));
         // This output is formatted like Android's debuggerd. Note debuggerd
         // prints call addresses instead of return addresses.
-        uword return_addr = code.PayloadStart() + pc_offset;
+        uword start = code.IsBytecode() ? Bytecode::Cast(code).PayloadStart()
+                                        : Code::Cast(code).PayloadStart();
+        uword return_addr = start + pc_offset;
         uword call_addr = return_addr - 1;
         uword dso_base;
         char* dso_name;
@@ -22534,18 +21121,6 @@
   return result.raw();
 }
 
-void* RegExp::GetDataStartAddress() const {
-  intptr_t addr = reinterpret_cast<intptr_t>(raw_ptr());
-  return reinterpret_cast<void*>(addr + sizeof(RawRegExp));
-}
-
-RawRegExp* RegExp::FromDataStartAddress(void* data) {
-  RegExp& regexp = RegExp::Handle();
-  intptr_t addr = reinterpret_cast<intptr_t>(data) - sizeof(RawRegExp);
-  regexp ^= RawObject::FromAddr(addr);
-  return regexp.raw();
-}
-
 const char* RegExp::Flags() const {
   switch (flags()) {
     case kGlobal | kIgnoreCase | kMultiLine:
@@ -22781,4 +21356,19 @@
   return tag_label.ToCString();
 }
 
+void DumpTypeTable(Isolate* isolate) {
+  OS::PrintErr("canonical types:\n");
+  CanonicalTypeSet table(isolate->object_store()->canonical_types());
+  table.Dump();
+  table.Release();
+}
+
+void DumpTypeArgumentsTable(Isolate* isolate) {
+  OS::PrintErr("canonical type arguments:\n");
+  CanonicalTypeArgumentsSet table(
+      isolate->object_store()->canonical_type_arguments());
+  table.Dump();
+  table.Release();
+}
+
 }  // namespace dart
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index f792344..f1de141 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5,6 +5,7 @@
 #ifndef RUNTIME_VM_OBJECT_H_
 #define RUNTIME_VM_OBJECT_H_
 
+#include <tuple>
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "platform/utils.h"
@@ -21,7 +22,6 @@
 #include "vm/os.h"
 #include "vm/raw_object.h"
 #include "vm/report.h"
-#include "vm/scanner.h"
 #include "vm/tags.h"
 #include "vm/thread.h"
 #include "vm/token_position.h"
@@ -64,6 +64,7 @@
 
 #define BASE_OBJECT_IMPLEMENTATION(object, super)                              \
  public: /* NOLINT */                                                          \
+  using RawObjectType = Raw##object;                                           \
   Raw##object* raw() const { return reinterpret_cast<Raw##object*>(raw_); }    \
   bool Is##object() const { return true; }                                     \
   static object& Handle(Zone* zone, Raw##object* raw_ptr) {                    \
@@ -87,9 +88,6 @@
     }                                                                          \
     return *obj;                                                               \
   }                                                                            \
-  static object& CheckedHandle(RawObject* raw_ptr) {                           \
-    return CheckedHandle(Thread::Current()->zone(), raw_ptr);                  \
-  }                                                                            \
   static object& ZoneHandle(Zone* zone, Raw##object* raw_ptr) {                \
     object* obj =                                                              \
         reinterpret_cast<object*>(VMHandles::AllocateZoneHandle(zone));        \
@@ -243,6 +241,9 @@
 
 class Object {
  public:
+  using RawObjectType = RawObject;
+  static RawObject* RawCast(RawObject* obj) { return obj; }
+
   virtual ~Object() {}
 
   RawObject* raw() const { return raw_; }
@@ -413,7 +414,6 @@
   static RawClass* class_class() { return class_class_; }
   static RawClass* dynamic_class() { return dynamic_class_; }
   static RawClass* void_class() { return void_class_; }
-  static RawClass* unresolved_class_class() { return unresolved_class_class_; }
   static RawClass* type_arguments_class() { return type_arguments_class_; }
   static RawClass* patch_class_class() { return patch_class_class_; }
   static RawClass* function_class() { return function_class_; }
@@ -428,6 +428,7 @@
     return kernel_program_info_class_;
   }
   static RawClass* code_class() { return code_class_; }
+  static RawClass* bytecode_class() { return bytecode_class_; }
   static RawClass* instructions_class() { return instructions_class_; }
   static RawClass* object_pool_class() { return object_pool_class_; }
   static RawClass* pc_descriptors_class() { return pc_descriptors_class_; }
@@ -483,9 +484,6 @@
 
   static const ClassId kClassId = kObjectCid;
 
-  // Different kinds of type tests.
-  enum TypeTestKind { kIsSubtypeOf = 0, kIsMoreSpecificThan };
-
   // Different kinds of name visibility.
   enum NameVisibility {
     // Internal names are the true names of classes, fields,
@@ -552,24 +550,9 @@
   // methods below or their counterparts in RawObject, to ensure that the
   // write barrier is correctly applied.
 
-  template <typename type>
+  template <typename type, MemoryOrder order = MemoryOrder::kRelaxed>
   void StorePointer(type const* addr, type value) const {
-    raw()->StorePointer(addr, value);
-  }
-
-  // Store a range of pointers [from, from + count) into [to, to + count).
-  // TODO(koda): Use this to fix Object::Clone's broken store buffer logic.
-  void StorePointers(RawObject* const* to,
-                     RawObject* const* from,
-                     intptr_t count) {
-    ASSERT(Contains(reinterpret_cast<uword>(to)));
-    if (raw()->IsNewObject()) {
-      memmove(const_cast<RawObject**>(to), from, count * kWordSize);
-    } else {
-      for (intptr_t i = 0; i < count; ++i) {
-        StorePointer(&to[i], from[i]);
-      }
-    }
+    raw()->StorePointer<type, order>(addr, value);
   }
 
   // Use for storing into an explicitly Smi-typed field of an object
@@ -678,7 +661,6 @@
   static RawClass* class_class_;             // Class of the Class vm object.
   static RawClass* dynamic_class_;           // Class of the 'dynamic' type.
   static RawClass* void_class_;              // Class of the 'void' type.
-  static RawClass* unresolved_class_class_;  // Class of UnresolvedClass.
   static RawClass* type_arguments_class_;  // Class of TypeArguments vm object.
   static RawClass* patch_class_class_;     // Class of the PatchClass vm object.
   static RawClass* function_class_;        // Class of the Function vm object.
@@ -692,6 +674,7 @@
   static RawClass* kernel_program_info_class_;  // Class of KernelProgramInfo vm
                                                 // object.
   static RawClass* code_class_;                 // Class of the Code vm object.
+  static RawClass* bytecode_class_;      // Class of the Bytecode vm object.
   static RawClass* instructions_class_;  // Class of the Instructions vm object.
   static RawClass* object_pool_class_;   // Class of the ObjectPool vm object.
   static RawClass* pc_descriptors_class_;   // Class of PcDescriptors vm object.
@@ -791,6 +774,13 @@
 
 class Class : public Object {
  public:
+  enum InvocationDispatcherEntry {
+    kInvocationDispatcherName,
+    kInvocationDispatcherArgsDesc,
+    kInvocationDispatcherFunction,
+    kInvocationDispatcherEntrySize,
+  };
+
   intptr_t instance_size() const {
     ASSERT(is_finalized() || is_prefinalized());
     return (raw_ptr()->instance_size_in_words_ * kWordSize);
@@ -872,7 +862,11 @@
   // class B<T, S>
   // class C<R> extends B<R, int>
   // C.DeclarationType() --> C [R, int, R]
-  RawAbstractType* DeclarationType() const;
+  RawType* DeclarationType() const;
+
+  static intptr_t declaration_type_offset() {
+    return OFFSET_OF(RawClass, declaration_type_);
+  }
 
   RawLibrary* library() const { return raw_ptr()->library_; }
   void set_library(const Library& value) const;
@@ -932,23 +926,7 @@
     return OFFSET_OF(RawClass, type_arguments_field_offset_in_words_);
   }
 
-  // Returns the cached canonical type of this class, i.e. the canonical type
-  // whose type class is this class and whose type arguments are the
-  // uninstantiated type parameters declared by this class if it is generic,
-  // e.g. Map<K, V>.
-  // Returns Type::null() if the canonical type is not cached yet.
-  RawType* CanonicalType() const;
-
-  // Caches the canonical type of this class.
-  void SetCanonicalType(const Type& type) const;
-
-  static intptr_t canonical_type_offset() {
-    return OFFSET_OF(RawClass, canonical_type_);
-  }
-
   // The super type of this class, Object type if not explicitly specified.
-  // Note that the super type may be bounded, as in this example:
-  // class C<T> extends S<T> { }; class S<T extends num> { };
   RawAbstractType* super_type() const { return raw_ptr()->super_type_; }
   void set_super_type(const AbstractType& value) const;
   static intptr_t super_type_offset() {
@@ -961,12 +939,6 @@
   // classes.
   RawClass* SuperClass(bool original_classes = false) const;
 
-  RawType* mixin() const { return raw_ptr()->mixin_; }
-  void set_mixin(const Type& value) const;
-
-  // Note this returns false for mixin application aliases.
-  bool IsMixinApplication() const;
-
   RawClass* GetPatchClass() const;
 
   // Interfaces is an array of Types.
@@ -1026,27 +998,23 @@
     return cls->ptr()->library_->ptr()->is_in_fullsnapshot_;
   }
 
-  // Check the subtype relationship.
-  bool IsSubtypeOf(const TypeArguments& type_arguments,
-                   const Class& other,
-                   const TypeArguments& other_type_arguments,
-                   Error* bound_error,
-                   TrailPtr bound_trail,
-                   Heap::Space space) const {
-    return TypeTest(kIsSubtypeOf, type_arguments, other, other_type_arguments,
-                    bound_error, bound_trail, space);
-  }
-
-  // Check the 'more specific' relationship.
-  bool IsMoreSpecificThan(const TypeArguments& type_arguments,
+  // Returns true if the type specified by cls and type_arguments is a
+  // subtype of the type specified by other class and other_type_arguments.
+  static bool IsSubtypeOf(const Class& cls,
+                          const TypeArguments& type_arguments,
                           const Class& other,
                           const TypeArguments& other_type_arguments,
-                          Error* bound_error,
-                          TrailPtr bound_trail,
-                          Heap::Space space) const {
-    return TypeTest(kIsMoreSpecificThan, type_arguments, other,
-                    other_type_arguments, bound_error, bound_trail, space);
-  }
+                          Heap::Space space);
+
+  // Returns true if the type specified by cls and type_arguments is a
+  // subtype of FutureOr<T> specified by other class and other_type_arguments.
+  // Returns false if other class is not a FutureOr.
+  static bool IsSubtypeOfFutureOr(Zone* zone,
+                                  const Class& cls,
+                                  const TypeArguments& type_arguments,
+                                  const Class& other,
+                                  const TypeArguments& other_type_arguments,
+                                  Heap::Space space);
 
   // Check if this is the top level class.
   bool IsTopLevel() const;
@@ -1093,7 +1061,6 @@
   RawFunction* LookupFunctionAllowPrivate(const String& name) const;
   RawFunction* LookupGetterFunction(const String& name) const;
   RawFunction* LookupSetterFunction(const String& name) const;
-  RawFunction* LookupCallFunctionForTypeTest() const;
   RawField* LookupInstanceField(const String& name) const;
   RawField* LookupStaticField(const String& name) const;
   RawField* LookupField(const String& name) const;
@@ -1160,33 +1127,11 @@
 
   void set_is_prefinalized() const;
 
-  bool is_refinalize_after_patch() const {
-    return ClassFinalizedBits::decode(raw_ptr()->state_bits_) ==
-           RawClass::kRefinalizeAfterPatch;
-  }
-
-  void SetRefinalizeAfterPatch() const;
   void ResetFinalization() const;
 
-  bool is_marked_for_parsing() const {
-    return MarkedForParsingBit::decode(raw_ptr()->state_bits_);
-  }
-  void set_is_marked_for_parsing() const;
-  void reset_is_marked_for_parsing() const;
-
   bool is_const() const { return ConstBit::decode(raw_ptr()->state_bits_); }
   void set_is_const() const;
 
-  bool is_mixin_app_alias() const {
-    return MixinAppAliasBit::decode(raw_ptr()->state_bits_);
-  }
-  void set_is_mixin_app_alias() const;
-
-  bool is_mixin_type_applied() const {
-    return MixinTypeAppliedBit::decode(raw_ptr()->state_bits_);
-  }
-  void set_is_mixin_type_applied() const;
-
   // Tests if this is a mixin application class which was desugared
   // to a normal class by kernel mixin transformation
   // (pkg/kernel/lib/transformations/mixin_full_resolution.dart).
@@ -1248,10 +1193,6 @@
 
   void Finalize() const;
 
-  // Apply given patch class to this class.
-  // Return true on success, or false and error otherwise.
-  bool ApplyPatch(const Class& patch, Error* error) const;
-
   RawObject* Invoke(const String& selector,
                     const Array& arguments,
                     const Array& argument_names,
@@ -1268,14 +1209,6 @@
   // expression fails. The method has the formal (type) parameters given in
   // (type_)param_names, and is invoked with the (type)argument values given in
   // (type_)param_values.
-  RawObject* Evaluate(const String& expr,
-                      const Array& param_names,
-                      const Array& param_values) const;
-  RawObject* Evaluate(const String& expr,
-                      const Array& param_names,
-                      const Array& param_values,
-                      const Array& type_param_names,
-                      const TypeArguments& type_param_values) const;
   RawObject* EvaluateCompiledExpression(
       const uint8_t* kernel_bytes,
       intptr_t kernel_length,
@@ -1331,14 +1264,13 @@
   bool TraceAllocation(Isolate* isolate) const;
   void SetTraceAllocation(bool trace_allocation) const;
 
-  bool ValidatePostFinalizePatch(const Class& orig_class, Error* error) const;
   void ReplaceEnum(const Class& old_enum) const;
   void CopyStaticFieldValues(const Class& old_cls) const;
   void PatchFieldsAndFunctions() const;
   void MigrateImplicitStaticClosures(IsolateReloadContext* context,
                                      const Class& new_cls) const;
   void CopyCanonicalConstants(const Class& old_cls) const;
-  void CopyCanonicalType(const Class& old_cls) const;
+  void CopyDeclarationType(const Class& old_cls) const;
   void CheckReload(const Class& replacement,
                    IsolateReloadContext* context) const;
 
@@ -1347,6 +1279,11 @@
                                const Function& dispatcher) const;
 
  private:
+  RawType* declaration_type() const { return raw_ptr()->declaration_type_; }
+
+  // Caches the declaration type of this class.
+  void set_declaration_type(const Type& type) const;
+
   bool CanReloadFinalized(const Class& replacement,
                           IsolateReloadContext* context) const;
   bool CanReloadPreFinalized(const Class& replacement,
@@ -1374,15 +1311,14 @@
     kClassFinalizedSize = 2,
     kAbstractBit = kClassFinalizedPos + kClassFinalizedSize,  // = 5
     kPatchBit = 6,
-    kSynthesizedClassBit = 7,
-    kMarkedForParsingBit = 8,
-    kMixinAppAliasBit = 9,
-    kMixinTypeAppliedBit = 10,
-    kFieldsMarkedNullableBit = 11,
-    kCycleFreeBit = 12,
-    kEnumBit = 13,
-    kTransformedMixinApplicationBit = 14,
-    kIsAllocatedBit = 15,
+    kSynthesizedClassBit,
+    kMixinAppAliasBit,
+    kMixinTypeAppliedBit,
+    kFieldsMarkedNullableBit,
+    kCycleFreeBit,
+    kEnumBit,
+    kTransformedMixinApplicationBit,
+    kIsAllocatedBit,
   };
   class ConstBit : public BitField<uint16_t, bool, kConstBit, 1> {};
   class ImplementedBit : public BitField<uint16_t, bool, kImplementedBit, 1> {};
@@ -1396,12 +1332,6 @@
   class PatchBit : public BitField<uint16_t, bool, kPatchBit, 1> {};
   class SynthesizedClassBit
       : public BitField<uint16_t, bool, kSynthesizedClassBit, 1> {};
-  class MarkedForParsingBit
-      : public BitField<uint16_t, bool, kMarkedForParsingBit, 1> {};
-  class MixinAppAliasBit
-      : public BitField<uint16_t, bool, kMixinAppAliasBit, 1> {};
-  class MixinTypeAppliedBit
-      : public BitField<uint16_t, bool, kMixinTypeAppliedBit, 1> {};
   class FieldsMarkedNullableBit
       : public BitField<uint16_t, bool, kFieldsMarkedNullableBit, 1> {};
   class CycleFreeBit : public BitField<uint16_t, bool, kCycleFreeBit, 1> {};
@@ -1415,9 +1345,6 @@
   RawString* GenerateUserVisibleName() const;
   void set_state_bits(intptr_t bits) const;
 
-  void set_canonical_type(const Type& value) const;
-  RawType* canonical_type() const;
-
   RawArray* invocation_dispatcher_cache() const;
   void set_invocation_dispatcher_cache(const Array& cache) const;
   RawFunction* CreateInvocationDispatcher(const String& target_name,
@@ -1487,35 +1414,6 @@
   // Helper that calls 'Class::New<Instance>(kIllegalCid)'.
   static RawClass* NewInstanceClass();
 
-  // Check the subtype or 'more specific' relationship.
-  bool TypeTest(TypeTestKind test_kind,
-                const TypeArguments& type_arguments,
-                const Class& other,
-                const TypeArguments& other_type_arguments,
-                Error* bound_error,
-                TrailPtr bound_trail,
-                Heap::Space space) const;
-
-  // Returns true if the type specified by this class and type_arguments is a
-  // subtype of FutureOr<T> specified by other class and other_type_arguments.
-  // Returns false if other class is not a FutureOr.
-  bool FutureOrTypeTest(Zone* zone,
-                        const TypeArguments& type_arguments,
-                        const Class& other,
-                        const TypeArguments& other_type_arguments,
-                        Error* bound_error,
-                        TrailPtr bound_trail,
-                        Heap::Space space) const;
-
-  static bool TypeTestNonRecursive(const Class& cls,
-                                   TypeTestKind test_kind,
-                                   const TypeArguments& type_arguments,
-                                   const Class& other,
-                                   const TypeArguments& other_type_arguments,
-                                   Error* bound_error,
-                                   TrailPtr bound_trail,
-                                   Heap::Space space);
-
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Class, Object);
   friend class AbstractType;
   friend class Instance;
@@ -1525,37 +1423,6 @@
   friend class ClassFunctionVisitor;
 };
 
-// Unresolved class is used for storing unresolved names which will be resolved
-// to a class after all classes have been loaded and finalized.
-class UnresolvedClass : public Object {
- public:
-  RawObject* library_or_library_prefix() const {
-    return raw_ptr()->library_or_library_prefix_;
-  }
-  RawString* ident() const { return raw_ptr()->ident_; }
-  TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
-
-  RawString* Name() const;
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawUnresolvedClass));
-  }
-
-  static RawUnresolvedClass* New(const Object& library_prefix,
-                                 const String& ident,
-                                 TokenPosition token_pos);
-
- private:
-  void set_library_or_library_prefix(const Object& library_prefix) const;
-  void set_ident(const String& ident) const;
-  void set_token_pos(TokenPosition token_pos) const;
-
-  static RawUnresolvedClass* New();
-
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass, Object);
-  friend class Class;
-};
-
 // Classification of type genericity according to type parameter owners.
 enum Genericity {
   kAny,           // Consider type params of current class and functions.
@@ -1856,6 +1723,7 @@
   V(BinaryDoubleOp)                                                            \
   V(UnaryOp)                                                                   \
   V(UnboxInteger)                                                              \
+  V(Unbox)                                                                     \
   V(CheckArrayBound)                                                           \
   V(AtCall)                                                                    \
   V(GuardField)                                                                \
@@ -1951,18 +1819,10 @@
   // Clears the count for entry |index|.
   void ClearCountAt(intptr_t index) const;
 
-  // Clear all entries with the sentinel value (but will preserve initial
-  // smi smi checks).
-  void ClearWithSentinel() const;
-
   // Clear all entries with the sentinel value and reset the first entry
   // with the dummy target entry.
   void ClearAndSetStaticTarget(const Function& func) const;
 
-  // Returns the first index that should be used to for a new entry. Will
-  // grow the array if necessary.
-  RawArray* FindFreeIndex(intptr_t* index) const;
-
   void DebugDump() const;
 
   // Returns true if this is a two arg smi operation.
@@ -2108,10 +1968,18 @@
 
   bool is_static_call() const;
 
+  intptr_t FindCheck(const GrowableArray<intptr_t>& cids) const;
+
  private:
   static RawICData* New();
 
-  RawArray* ic_data() const { return raw_ptr()->ic_data_; }
+  RawArray* ic_data() const {
+    return AtomicOperations::LoadAcquire(&raw_ptr()->ic_data_);
+  }
+
+  // Grows the array and also sets the argument to the index that should be used
+  // for the new entry.
+  RawArray* Grow(intptr_t* index) const;
 
   void set_owner(const Function& value) const;
   void set_target_name(const String& value) const;
@@ -2172,6 +2040,7 @@
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object);
   friend class Class;
+  friend class ICDataTestTask;
   friend class Interpreter;
   friend class SnapshotWriter;
   friend class Serializer;
@@ -2277,6 +2146,9 @@
   RawAbstractType* result_type() const { return raw_ptr()->result_type_; }
   void set_result_type(const AbstractType& value) const;
 
+  // The parameters, starting with NumImplicitParameters() parameters which are
+  // only visible to the VM, but not to Dart users.
+  // Note that type checks exclude implicit parameters.
   RawAbstractType* ParameterTypeAt(intptr_t index) const;
   void SetParameterTypeAt(intptr_t index, const AbstractType& value) const;
   RawArray* parameter_types() const { return raw_ptr()->parameter_types_; }
@@ -2323,8 +2195,6 @@
   // Return true if any parent function of this function is generic.
   bool HasGenericParent() const;
 
-  bool FindPragma(Isolate* I, const String& pragma_name, Object* options) const;
-
   // Not thread-safe; must be called in the main thread.
   // Sets function's code and code's function.
   void InstallOptimizedCode(const Code& code) const;
@@ -2350,7 +2220,11 @@
 
   // Return the most recently compiled and installed code for this function.
   // It is not the only Code object that points to this function.
-  RawCode* CurrentCode() const { return raw_ptr()->code_; }
+  RawCode* CurrentCode() const { return CurrentCodeOf(raw()); }
+
+  static RawCode* CurrentCodeOf(const RawFunction* function) {
+    return function->ptr()->code_;
+  }
 
   RawCode* unoptimized_code() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -2378,8 +2252,8 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   bool IsBytecodeAllowed(Zone* zone) const;
-  void AttachBytecode(const Code& bytecode) const;
-  RawCode* Bytecode() const { return raw_ptr()->bytecode_; }
+  void AttachBytecode(const Bytecode& bytecode) const;
+  RawBytecode* bytecode() const { return raw_ptr()->bytecode_; }
   bool HasBytecode() const;
 #endif
 
@@ -2535,14 +2409,11 @@
   bool IsInFactoryScope() const;
 
   bool NeedsArgumentTypeChecks(Isolate* I) const {
-    if (FLAG_strong) {
-      if (!I->should_emit_strong_mode_checks()) {
-        return false;
-      }
-      return IsClosureFunction() ||
-             !(is_static() || (kind() == RawFunction::kConstructor));
+    if (!I->should_emit_strong_mode_checks()) {
+      return false;
     }
-    return I->type_checks();
+    return IsClosureFunction() ||
+           !(is_static() || (kind() == RawFunction::kConstructor));
   }
 
   bool MayHaveUncheckedEntryPoint(Isolate* I) const;
@@ -2680,6 +2551,13 @@
                               intptr_t num_named_arguments,
                               String* error_message) const;
 
+  // Returns a TypeError if the provided arguments don't match the function
+  // parameter types, NULL otherwise. Assumes AreValidArguments is called first.
+  RawObject* DoArgumentTypesMatch(
+      const Array& args,
+      const ArgumentsDescriptor& arg_names,
+      const TypeArguments& instantiator_type_args) const;
+
   // Returns true if the type argument count, total argument count and the names
   // of optional arguments are valid for calling this function.
   // Otherwise, it returns false and the reason (if error_message is not NULL).
@@ -2700,29 +2578,7 @@
 
   // Returns true if the type of this function is a subtype of the type of
   // the other function.
-  bool IsSubtypeOf(const Function& other,
-                   Error* bound_error,
-                   TrailPtr bound_trail,
-                   Heap::Space space) const {
-    return TypeTest(kIsSubtypeOf, other, bound_error, bound_trail, space);
-  }
-
-  // Returns true if the type of this function is more specific than the type of
-  // the other function.
-  bool IsMoreSpecificThan(const Function& other,
-                          Error* bound_error,
-                          TrailPtr bound_trail,
-                          Heap::Space space) const {
-    return TypeTest(kIsMoreSpecificThan, other, bound_error, bound_trail,
-                    space);
-  }
-
-  // Check the subtype or 'more specific' relationship.
-  bool TypeTest(TypeTestKind test_kind,
-                const Function& other,
-                Error* bound_error,
-                TrailPtr bound_trail,
-                Heap::Space space) const;
+  bool IsSubtypeOf(const Function& other, Heap::Space space) const;
 
   bool IsDispatcherOrImplicitAccessor() const {
     switch (kind()) {
@@ -2850,11 +2706,6 @@
     return RoundedAllocationSize(sizeof(RawFunction));
   }
 
-  static RawFunction* EvaluateHelper(const Class& cls,
-                                     const String& expr,
-                                     const Array& param_names,
-                                     bool is_static);
-
   static RawFunction* New(const String& name,
                           RawFunction::Kind kind,
                           bool is_static,
@@ -2912,10 +2763,6 @@
                                              bool allow_add = true) const;
 #endif
 
-  // Allocate new function object, clone values from this function. The
-  // owner of the clone is new_owner.
-  RawFunction* Clone(const Class& new_owner) const;
-
   // Slow function, use in asserts to track changes in important library
   // functions.
   int32_t SourceFingerprint() const;
@@ -3006,6 +2853,11 @@
   // redirecting: Redirecting generative or factory constructor.
   // external: Just a declaration that expects to be defined in another patch
   //           file.
+  // generated_body: Has a generated body.
+  // always_inline: Should always be inlined.
+  // polymorphic_target: A polymorphic method.
+  // has_pragma: Has a @pragma decoration.
+  // no_such_method_forwarder: A stub method that just calls noSuchMethod.
 
 #define FOR_EACH_FUNCTION_KIND_BIT(V)                                          \
   V(Static, is_static)                                                         \
@@ -3023,7 +2875,8 @@
   V(GeneratedBody, is_generated_body)                                          \
   V(AlwaysInline, always_inline)                                               \
   V(PolymorphicTarget, is_polymorphic_target)                                  \
-  V(HasPragma, has_pragma)
+  V(HasPragma, has_pragma)                                                     \
+  V(IsNoSuchMethodForwarder, is_no_such_method_forwarder)
 
 #define DEFINE_ACCESSORS(name, accessor_name)                                  \
   void set_##accessor_name(bool value) const {                                 \
@@ -3113,16 +2966,13 @@
       GrowableHandlePtrArray<const String>* pieces) const;
   RawString* BuildSignature(NameVisibility name_visibility) const;
 
-  // Checks the type of the formal parameter at the given position for
-  // subtyping or 'more specific' relationship between the type of this function
-  // and the type of the other function.
-  bool TestParameterType(TypeTestKind test_kind,
-                         intptr_t parameter_position,
-                         intptr_t other_parameter_position,
-                         const Function& other,
-                         Error* bound_error,
-                         TrailPtr bound_trail,
-                         Heap::Space space) const;
+  // Returns true if the type of the formal parameter at the given position in
+  // this function is contravariant with the type of the other formal parameter
+  // at the given position in the other function.
+  bool IsContravariantParameter(intptr_t parameter_position,
+                                const Function& other,
+                                intptr_t other_parameter_position,
+                                Heap::Space space) const;
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Function, Object);
   friend class Class;
@@ -3265,6 +3115,13 @@
         value, raw_ptr()->kind_bits_));
   }
 
+  bool has_pragma() const {
+    return HasPragmaBit::decode(raw_ptr()->kind_bits_);
+  }
+  void set_has_pragma(bool value) const {
+    set_kind_bits(HasPragmaBit::update(value, raw_ptr()->kind_bits_));
+  }
+
   intptr_t kernel_offset() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
     return 0;
@@ -3327,9 +3184,6 @@
                                TokenPosition end_token_pos);
 
   // Allocate new field object, clone values from this field. The
-  // owner of the clone is new_owner.
-  RawField* Clone(const Class& new_owner) const;
-  // Allocate new field object, clone values from this field. The
   // original is specified.
   RawField* Clone(const Field& original) const;
 
@@ -3473,7 +3327,7 @@
 
   bool IsUninitialized() const;
 
-  void EvaluateInitializer() const;
+  DART_WARN_UNUSED_RESULT RawError* EvaluateInitializer() const;
 
   RawFunction* PrecompiledInitializer() const {
     return raw_ptr()->initializer_.precompiled_;
@@ -3522,22 +3376,24 @@
     kReflectableBit,
     kDoubleInitializedBit,
     kInitializerChangedAfterInitializatonBit,
+    kHasPragmaBit,
   };
-  class ConstBit : public BitField<uint8_t, bool, kConstBit, 1> {};
-  class StaticBit : public BitField<uint8_t, bool, kStaticBit, 1> {};
-  class FinalBit : public BitField<uint8_t, bool, kFinalBit, 1> {};
+  class ConstBit : public BitField<uint16_t, bool, kConstBit, 1> {};
+  class StaticBit : public BitField<uint16_t, bool, kStaticBit, 1> {};
+  class FinalBit : public BitField<uint16_t, bool, kFinalBit, 1> {};
   class HasInitializerBit
-      : public BitField<uint8_t, bool, kHasInitializerBit, 1> {};
+      : public BitField<uint16_t, bool, kHasInitializerBit, 1> {};
   class UnboxingCandidateBit
-      : public BitField<uint8_t, bool, kUnboxingCandidateBit, 1> {};
-  class ReflectableBit : public BitField<uint8_t, bool, kReflectableBit, 1> {};
+      : public BitField<uint16_t, bool, kUnboxingCandidateBit, 1> {};
+  class ReflectableBit : public BitField<uint16_t, bool, kReflectableBit, 1> {};
   class DoubleInitializedBit
-      : public BitField<uint8_t, bool, kDoubleInitializedBit, 1> {};
+      : public BitField<uint16_t, bool, kDoubleInitializedBit, 1> {};
   class InitializerChangedAfterInitializatonBit
-      : public BitField<uint8_t,
+      : public BitField<uint16_t,
                         bool,
                         kInitializerChangedAfterInitializatonBit,
                         1> {};
+  class HasPragmaBit : public BitField<uint16_t, bool, kHasPragmaBit, 1> {};
 
   // Update guarded cid and guarded length for this field. Returns true, if
   // deoptimization of dependent code is required.
@@ -3570,7 +3426,7 @@
   void set_end_token_pos(TokenPosition token_pos) const {
     StoreNonPointer(&raw_ptr()->end_token_pos_, token_pos);
   }
-  void set_kind_bits(uint8_t value) const {
+  void set_kind_bits(uint16_t value) const {
     StoreNonPointer(&raw_ptr()->kind_bits_, value);
   }
 
@@ -3793,16 +3649,6 @@
   // evaluating the expression fails. The method has the formal (type)
   // parameters given in (type_)param_names, and is invoked with the (type)
   // argument values given in (type_)param_values.
-  RawObject* Evaluate(const String& expr,
-                      const Array& param_names,
-                      const Array& param_values) const;
-
-  RawObject* Evaluate(const String& expr,
-                      const Array& param_names,
-                      const Array& param_values,
-                      const Array& type_param_names,
-                      const TypeArguments& type_arguments) const;
-
   RawObject* EvaluateCompiledExpression(
       const uint8_t* kernel_bytes,
       intptr_t kernel_length,
@@ -3870,6 +3716,18 @@
                          const Function& to_fun) const;
   RawObject* GetMetadata(const Object& obj) const;
 
+  // Tries to finds a @pragma annotation on [object].
+  //
+  // If successful returns `true`. If an error happens during constant
+  // evaluation, returns `false.
+  //
+  // WARNING: If the isolate received an [UnwindError] this function will not
+  // return and rather unwinds until the enclosing setjmp() handler.
+  bool FindPragma(Thread* T,
+                  const Object& object,
+                  const String& pragma_name,
+                  Object* options) const;
+
   RawClass* toplevel_class() const { return raw_ptr()->toplevel_class_; }
   void set_toplevel_class(const Class& value) const;
 
@@ -3909,8 +3767,6 @@
     StoreNonPointer(&raw_ptr()->is_in_fullsnapshot_, value);
   }
 
-  RawError* Patch(const Script& script) const;
-
   RawString* PrivateName(const String& name) const;
 
   intptr_t index() const { return raw_ptr()->index_; }
@@ -4185,6 +4041,11 @@
                         const Smi& name_index,
                         const Class& klass) const;
 
+  RawArray* bytecode_component() const {
+    return raw_ptr()->bytecode_component_;
+  }
+  void set_bytecode_component(const Array& bytecode_component) const;
+
  private:
   static RawKernelProgramInfo* New();
 
@@ -4260,7 +4121,8 @@
   }
   void SetObjectAt(intptr_t index, const Object& obj) const {
     ASSERT((TypeAt(index) == kTaggedObject) ||
-           (TypeAt(index) == kNativeEntryData));
+           (TypeAt(index) == kNativeEntryData) ||
+           (TypeAt(index) == kImmediate && obj.IsSmi()));
     StorePointer(&EntryAddr(index)->raw_obj_, obj.raw());
   }
 
@@ -4273,6 +4135,9 @@
     StoreNonPointer(&EntryAddr(index)->raw_value_, raw_value);
   }
 
+  // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas.
+  void ResetICDatas(Zone* zone) const;
+
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawObjectPool) ==
            OFFSET_OF_RETURNED_VALUE(RawObjectPool, data));
@@ -4344,28 +4209,42 @@
     return FlagsBits::decode(instr->ptr()->size_and_flags_);
   }
 
+  static bool ContainsPc(RawInstructions* instruction, uword pc) {
+    const uword offset = pc - PayloadStart(instruction);
+    // We use <= instead of < here because the saved-pc can be outside the
+    // instruction stream if the last instruction is a call we don't expect to
+    // return (e.g. because it throws an exception).
+    return offset <= static_cast<uword>(Size(instruction));
+  }
+
   uword PayloadStart() const { return PayloadStart(raw()); }
   uword MonomorphicEntryPoint() const { return MonomorphicEntryPoint(raw()); }
+  uword MonomorphicUncheckedEntryPoint() const {
+    return MonomorphicUncheckedEntryPoint(raw());
+  }
   uword EntryPoint() const { return EntryPoint(raw()); }
+  uword UncheckedEntryPoint() const { return UncheckedEntryPoint(raw()); }
   static uword PayloadStart(const RawInstructions* instr) {
     return reinterpret_cast<uword>(instr->ptr()) + HeaderSize();
   }
 
+  // Note: We keep the checked entrypoint offsets even (emitting NOPs if
+  // necessary) to allow them to be seen as Smis by the GC.
 #if defined(TARGET_ARCH_IA32)
-  static const intptr_t kCheckedEntryOffset = 0;
-  static const intptr_t kUncheckedEntryOffset = 0;
+  static const intptr_t kPolymorphicEntryOffset = 0;
+  static const intptr_t kMonomorphicEntryOffset = 0;
 #elif defined(TARGET_ARCH_X64)
-  static const intptr_t kCheckedEntryOffset = 15;
-  static const intptr_t kUncheckedEntryOffset = 34;
+  static const intptr_t kPolymorphicEntryOffset = 16;
+  static const intptr_t kMonomorphicEntryOffset = 36;
 #elif defined(TARGET_ARCH_ARM)
-  static const intptr_t kCheckedEntryOffset = 0;
-  static const intptr_t kUncheckedEntryOffset = 20;
+  static const intptr_t kPolymorphicEntryOffset = 0;
+  static const intptr_t kMonomorphicEntryOffset = 20;
 #elif defined(TARGET_ARCH_ARM64)
-  static const intptr_t kCheckedEntryOffset = 8;
-  static const intptr_t kUncheckedEntryOffset = 28;
+  static const intptr_t kPolymorphicEntryOffset = 8;
+  static const intptr_t kMonomorphicEntryOffset = 28;
 #elif defined(TARGET_ARCH_DBC)
-  static const intptr_t kCheckedEntryOffset = 0;
-  static const intptr_t kUncheckedEntryOffset = 0;
+  static const intptr_t kPolymorphicEntryOffset = 0;
+  static const intptr_t kMonomorphicEntryOffset = 0;
 #else
 #error Missing entry offsets for current architecture
 #endif
@@ -4373,7 +4252,7 @@
   static uword MonomorphicEntryPoint(const RawInstructions* instr) {
     uword entry = PayloadStart(instr);
     if (!HasSingleEntryPoint(instr)) {
-      entry += kCheckedEntryOffset;
+      entry += kPolymorphicEntryOffset;
     }
     return entry;
   }
@@ -4381,13 +4260,27 @@
   static uword EntryPoint(const RawInstructions* instr) {
     uword entry = PayloadStart(instr);
     if (!HasSingleEntryPoint(instr)) {
-      entry += kUncheckedEntryOffset;
+      entry += kMonomorphicEntryOffset;
     }
     return entry;
   }
 
   static uword UncheckedEntryPoint(const RawInstructions* instr) {
-    return PayloadStart(instr) + instr->ptr()->unchecked_entrypoint_pc_offset_;
+    uword entry =
+        PayloadStart(instr) + instr->ptr()->unchecked_entrypoint_pc_offset_;
+    if (!HasSingleEntryPoint(instr)) {
+      entry += kMonomorphicEntryOffset;
+    }
+    return entry;
+  }
+
+  static uword MonomorphicUncheckedEntryPoint(const RawInstructions* instr) {
+    uword entry =
+        PayloadStart(instr) + instr->ptr()->unchecked_entrypoint_pc_offset_;
+    if (!HasSingleEntryPoint(instr)) {
+      entry += kPolymorphicEntryOffset;
+    }
+    return entry;
   }
 
   static const intptr_t kMaxElements =
@@ -4421,11 +4314,13 @@
   }
 
   bool Equals(const Instructions& other) const {
-    if (Size() != other.Size()) {
-      return false;
-    }
+    return Equals(raw(), other.raw());
+  }
+
+  static bool Equals(RawInstructions* a, RawInstructions* b) {
+    if (Size(a) != Size(b)) return false;
     NoSafepointScope no_safepoint;
-    return memcmp(raw_ptr(), other.raw_ptr(), InstanceSize(Size())) == 0;
+    return memcmp(a->ptr(), b->ptr(), InstanceSize(Size(a))) == 0;
   }
 
   CodeStatistics* stats() const {
@@ -4475,6 +4370,7 @@
   friend class Code;
   friend class AssemblyImageWriter;
   friend class BlobImageWriter;
+  friend class ImageWriter;
 };
 
 class LocalVarDescriptors : public Object {
@@ -4845,6 +4741,7 @@
     kNormal,
     kUnchecked,
     kMonomorphic,
+    kMonomorphicUnchecked,
   };
 
   static intptr_t entry_point_offset(EntryKind kind = EntryKind::kNormal) {
@@ -4855,6 +4752,8 @@
         return OFFSET_OF(RawCode, unchecked_entry_point_);
       case EntryKind::kMonomorphic:
         return OFFSET_OF(RawCode, monomorphic_entry_point_);
+      case EntryKind::kMonomorphicUnchecked:
+        return OFFSET_OF(RawCode, monomorphic_unchecked_entry_point_);
       default:
         UNREACHABLE();
     }
@@ -4896,15 +4795,19 @@
     return Instructions::UncheckedEntryPoint(instructions());
   }
   uword MonomorphicEntryPoint() const {
-    const Instructions& instr = Instructions::Handle(instructions());
-    return instr.MonomorphicEntryPoint();
+    return Instructions::MonomorphicEntryPoint(instructions());
+  }
+  uword MonomorphicUncheckedEntryPoint() const {
+    return Instructions::MonomorphicUncheckedEntryPoint(instructions());
   }
   intptr_t Size() const { return Instructions::Size(instructions()); }
-  RawObjectPool* GetObjectPool() const { return object_pool(); }
+  RawObjectPool* GetObjectPool() const;
   bool ContainsInstructionAt(uword addr) const {
-    const Instructions& instr = Instructions::Handle(instructions());
-    const uword offset = addr - instr.PayloadStart();
-    return offset < static_cast<uword>(instr.Size());
+    return ContainsInstructionAt(raw(), addr);
+  }
+
+  static bool ContainsInstructionAt(RawCode* code, uword addr) {
+    return Instructions::ContainsPc(code->ptr()->instructions_, addr);
   }
 
   // Returns true if there is a debugger breakpoint set in this code object.
@@ -4931,7 +4834,7 @@
   void set_await_token_positions(const Array& await_token_positions) const;
 
   // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas
-  // that are embedded inside the Code object.
+  // that are embedded inside the Code or ObjecPool objects.
   void ResetICDatas(Zone* zone) const;
 
   // Array of DeoptInfo objects.
@@ -4960,14 +4863,35 @@
   RawStackMap* GetStackMap(uint32_t pc_offset,
                            Array* stackmaps,
                            StackMap* map) const;
+  enum CallKind {
+    kPcRelativeCall = 1,
+    kPcRelativeTailCall = 2,
+    kCallViaCode = 3,
+  };
 
-  enum {
-    kSCallTableOffsetEntry = 0,
-    kSCallTableFunctionEntry = 1,
-    kSCallTableCodeEntry = 2,
+  enum CallEntryPoint {
+    kDefaultEntry,
+    kUncheckedEntry,
+  };
+
+  enum SCallTableEntry {
+    kSCallTableKindAndOffset = 0,
+    kSCallTableCodeTarget = 1,
+    kSCallTableFunctionTarget = 2,
     kSCallTableEntryLength = 3,
   };
 
+  enum class PoolAttachment {
+    kAttachPool,
+    kNotAttachPool,
+  };
+
+  class KindField : public BitField<intptr_t, CallKind, 0, 2> {};
+  class EntryPointField
+      : public BitField<intptr_t, CallEntryPoint, KindField::kNextBit, 1> {};
+  class OffsetField
+      : public BitField<intptr_t, intptr_t, EntryPointField::kNextBit, 27> {};
+
   void set_static_calls_target_table(const Array& value) const;
   RawArray* static_calls_target_table() const {
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -5129,20 +5053,26 @@
     return RoundedAllocationSize(sizeof(RawCode) + (len * kBytesPerElement));
   }
 #if !defined(DART_PRECOMPILED_RUNTIME)
+  // Finalizes the generated code, by generating various kinds of metadata (e.g.
+  // stack maps, pc descriptors, ...) and attach them to a newly generated
+  // [Code] object.
+  //
+  // If Code::PoolAttachment::kAttachPool is specified for [pool_attachment]
+  // then a new [ObjectPool] will be attached to the code object as well.
+  // Otherwise the caller is responsible for doing this via
+  // `Object::set_object_pool()`.
   static RawCode* FinalizeCode(const Function& function,
                                FlowGraphCompiler* compiler,
                                Assembler* assembler,
+                               PoolAttachment pool_attachment,
                                bool optimized = false,
                                CodeStatistics* stats = nullptr);
   static RawCode* FinalizeCode(const char* name,
                                FlowGraphCompiler* compiler,
                                Assembler* assembler,
+                               PoolAttachment pool_attachment,
                                bool optimized,
                                CodeStatistics* stats = nullptr);
-  static RawCode* FinalizeBytecode(const void* bytecode_data,
-                                   intptr_t bytecode_size,
-                                   const ObjectPool& object_pool,
-                                   CodeStatistics* stats = nullptr);
 #endif
   static RawCode* LookupCode(uword pc);
   static RawCode* LookupCodeInVmIsolate(uword pc);
@@ -5270,8 +5200,12 @@
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object);
   friend class Class;
   friend class SnapshotWriter;
+  friend class StubCode;     // for set_object_pool
+  friend class Precompiler;  // for set_object_pool
   friend class FunctionSerializationCluster;
   friend class CodeSerializationCluster;
+  friend class StubCode;               // for set_object_pool
+  friend class MegamorphicCacheTable;  // for set_object_pool
   friend class CodePatcher;     // for set_instructions
   friend class ProgramVisitor;  // for set_instructions
   // So that the RawFunction pointer visitor can determine whether code the
@@ -5279,6 +5213,105 @@
   friend class RawFunction;
 };
 
+class Bytecode : public Object {
+ public:
+  RawExternalTypedData* instructions() const {
+    return raw_ptr()->instructions_;
+  }
+  uword PayloadStart() const;
+  intptr_t Size() const;
+
+  RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; }
+
+  bool ContainsInstructionAt(uword addr) const {
+    return RawBytecode::ContainsPC(raw(), addr);
+  }
+
+  RawPcDescriptors* pc_descriptors() const {
+    return raw_ptr()->pc_descriptors_;
+  }
+  void set_pc_descriptors(const PcDescriptors& descriptors) const {
+    ASSERT(descriptors.IsOld());
+    StorePointer(&raw_ptr()->pc_descriptors_, descriptors.raw());
+  }
+
+  void Disassemble(DisassemblyFormatter* formatter = NULL) const;
+
+  RawExceptionHandlers* exception_handlers() const {
+    return raw_ptr()->exception_handlers_;
+  }
+  void set_exception_handlers(const ExceptionHandlers& handlers) const {
+    ASSERT(handlers.IsOld());
+    StorePointer(&raw_ptr()->exception_handlers_, handlers.raw());
+  }
+
+  RawFunction* function() const { return raw_ptr()->function_; }
+
+  void set_function(const Function& function) const {
+    ASSERT(function.IsOld());
+    StorePointer(&raw_ptr()->function_, function.raw());
+  }
+
+  // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas
+  // that are embedded inside the Code or ObjecPool objects.
+  void ResetICDatas(Zone* zone) const;
+
+  static intptr_t InstanceSize() {
+    return RoundedAllocationSize(sizeof(RawBytecode));
+  }
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  static RawBytecode* New(const ExternalTypedData& instructions,
+                          const ObjectPool& object_pool);
+#endif
+
+  RawExternalTypedData* GetBinary(Zone* zone) const;
+
+  TokenPosition GetTokenIndexOfPC(uword pc) const;
+
+  intptr_t source_positions_binary_offset() const {
+    return raw_ptr()->source_positions_binary_offset_;
+  }
+  void set_source_positions_binary_offset(intptr_t value) const {
+    StoreNonPointer(&raw_ptr()->source_positions_binary_offset_, value);
+  }
+  bool HasSourcePositions() const {
+    return (source_positions_binary_offset() != 0);
+  }
+
+  const char* Name() const;
+  const char* QualifiedName() const;
+
+  class SlowFindRawBytecodeVisitor : public FindObjectVisitor {
+   public:
+    explicit SlowFindRawBytecodeVisitor(uword pc) : pc_(pc) {}
+    virtual ~SlowFindRawBytecodeVisitor() {}
+
+    // Check if object matches find condition.
+    virtual bool FindObject(RawObject* obj) const;
+
+   private:
+    const uword pc_;
+
+    DISALLOW_COPY_AND_ASSIGN(SlowFindRawBytecodeVisitor);
+  };
+
+  static RawBytecode* FindCode(uword pc);
+
+ private:
+  void set_object_pool(const ObjectPool& object_pool) const {
+    StorePointer(&raw_ptr()->object_pool_, object_pool.raw());
+  }
+
+  friend class RawObject;  // For RawObject::SizeFromClass().
+  friend class RawBytecode;
+
+  void set_instructions(const ExternalTypedData& instructions) const;
+
+  FINAL_HEAP_OBJECT_IMPLEMENTATION(Bytecode, Object);
+  friend class Class;
+  friend class SnapshotWriter;
+};
+
 class Context : public Object {
  public:
   RawContext* parent() const { return raw_ptr()->parent_; }
@@ -5448,7 +5481,9 @@
 
   void EnsureCapacity() const;
 
-  void Insert(const Smi& class_id, const Function& target) const;
+  void Insert(const Smi& class_id, const Object& target) const;
+
+  void SwitchToBareInstructions();
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawMegamorphicCache));
@@ -5473,7 +5508,7 @@
   static inline void SetEntry(const Array& array,
                               intptr_t index,
                               const Smi& class_id,
-                              const Function& target);
+                              const Object& target);
 
   static inline RawObject* GetClassId(const Array& array, intptr_t index);
   static inline RawObject* GetTargetFunction(const Array& array,
@@ -5735,6 +5770,9 @@
 
   RawAbstractType* GetType(Heap::Space space) const;
 
+  // Access the arguments of the [Type] of this [Instance].
+  // Note: for [Type]s instead of [Instance]s with a [Type] attached, use
+  // [arguments()] and [set_arguments()]
   virtual RawTypeArguments* GetTypeArguments() const;
   virtual void SetTypeArguments(const TypeArguments& value) const;
 
@@ -5742,15 +5780,12 @@
   // The type argument vectors are used to instantiate the other type if needed.
   bool IsInstanceOf(const AbstractType& other,
                     const TypeArguments& other_instantiator_type_arguments,
-                    const TypeArguments& other_function_type_arguments,
-                    Error* bound_error) const;
+                    const TypeArguments& other_function_type_arguments) const;
 
   // Returns true if the type of this instance is a subtype of FutureOr<T>
   // specified by instantiated type 'other'.
   // Returns false if other type is not a FutureOr.
-  bool IsFutureOrInstanceOf(Zone* zone,
-                            const AbstractType& other,
-                            Error* bound_error) const;
+  bool IsFutureOrInstanceOf(Zone* zone, const AbstractType& other) const;
 
   bool IsValidNativeIndex(int index) const {
     return ((index >= 0) && (index < clazz()->ptr()->num_native_fields_));
@@ -5788,18 +5823,6 @@
   // evaluating the expression fails. The method has the formal (type)
   // parameters given in (type_)param_names, and is invoked with the (type)
   // argument values given in (type_)param_values.
-  RawObject* Evaluate(const Class& method_cls,
-                      const String& expr,
-                      const Array& param_names,
-                      const Array& param_values) const;
-
-  RawObject* Evaluate(const Class& method_cls,
-                      const String& expr,
-                      const Array& param_names,
-                      const Array& param_values,
-                      const Array& type_param_names,
-                      const TypeArguments& type_param_values) const;
-
   RawObject* EvaluateCompiledExpression(
       const Class& method_cls,
       const uint8_t* kernel_bytes,
@@ -5988,24 +6011,7 @@
   bool IsSubtypeOf(const TypeArguments& other,
                    intptr_t from_index,
                    intptr_t len,
-                   Error* bound_error,
-                   TrailPtr bound_trail,
-                   Heap::Space space) const {
-    return TypeTest(kIsSubtypeOf, other, from_index, len, bound_error,
-                    bound_trail, space);
-  }
-
-  // Check the 'more specific' relationship, considering only a subvector of
-  // length 'len' starting at 'from_index'.
-  bool IsMoreSpecificThan(const TypeArguments& other,
-                          intptr_t from_index,
-                          intptr_t len,
-                          Error* bound_error,
-                          TrailPtr bound_trail,
-                          Heap::Space space) const {
-    return TypeTest(kIsMoreSpecificThan, other, from_index, len, bound_error,
-                    bound_trail, space);
-  }
+                   Heap::Space space) const;
 
   // Check if the vectors are equal (they may be null).
   bool Equals(const TypeArguments& other) const {
@@ -6034,29 +6040,14 @@
                                TrailPtr trail = NULL) const;
   bool IsUninstantiatedIdentity() const;
   bool CanShareInstantiatorTypeArguments(const Class& instantiator_class) const;
+  bool CanShareFunctionTypeArguments(const Function& function) const;
 
-  // Return true if all types of this vector are respectively, resolved,
-  // finalized, or bounded.
-  bool IsResolved() const;
+  // Return true if all types of this vector are finalized.
   bool IsFinalized() const;
-  bool IsBounded() const;
 
   // Return true if this vector contains a recursive type argument.
   bool IsRecursive() const;
 
-  // Set the scope of this type argument vector to the given function.
-  void SetScopeFunction(const Function& function) const;
-
-  // Clone this type argument vector and clone all unfinalized type arguments.
-  // Finalized type arguments are shared.
-  RawTypeArguments* CloneUnfinalized() const;
-
-  // Clone this type argument vector and clone all uninstantiated type
-  // arguments, changing the class owner of type parameters.
-  // Instantiated type arguments are shared.
-  RawTypeArguments* CloneUninstantiated(const Class& new_owner,
-                                        TrailPtr trail = NULL) const;
-
   // Canonicalize only if instantiated, otherwise returns 'this'.
   RawTypeArguments* Canonicalize(TrailPtr trail = NULL) const;
 
@@ -6069,22 +6060,18 @@
   // where each reference to a type parameter is replaced with the corresponding
   // type from the various type argument vectors (class instantiator, function,
   // or parent functions via the current context).
-  // If bound_error is not NULL, it may be set to reflect a bound error.
   RawTypeArguments* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
-      Error* bound_error,
       TrailPtr instantiation_trail,
-      TrailPtr bound_trail,
       Heap::Space space) const;
 
   // Runtime instantiation with canonicalization. Not to be used during type
   // finalization at compile time.
   RawTypeArguments* InstantiateAndCanonicalizeFrom(
       const TypeArguments& instantiator_type_arguments,
-      const TypeArguments& function_type_arguments,
-      Error* bound_error) const;
+      const TypeArguments& function_type_arguments) const;
 
   // Return true if this type argument vector has cached instantiations.
   bool HasInstantiations() const;
@@ -6135,16 +6122,6 @@
                       intptr_t from_index,
                       intptr_t len) const;
 
-  // Check the subtype or 'more specific' relationship, considering only a
-  // subvector of length 'len' starting at 'from_index'.
-  bool TypeTest(TypeTestKind test_kind,
-                const TypeArguments& other,
-                intptr_t from_index,
-                intptr_t len,
-                Error* bound_error,
-                TrailPtr bound_trail,
-                Heap::Space space) const;
-
   // Return the internal or public name of a subvector of this type argument
   // vector, e.g. "<T, dynamic, List<T>, int>".
   RawString* SubvectorName(intptr_t from_index,
@@ -6178,17 +6155,9 @@
   virtual void SetIsFinalized() const;
   virtual bool IsBeingFinalized() const;
   virtual void SetIsBeingFinalized() const;
-  virtual bool IsMalformed() const;
-  virtual bool IsMalbounded() const;
-  virtual bool IsMalformedOrMalbounded() const;
-  virtual RawLanguageError* error() const;
-  virtual void set_error(const LanguageError& value) const;
-  virtual bool IsResolved() const;
-  virtual void SetIsResolved() const;
-  virtual bool HasResolvedTypeClass() const;
+  virtual bool HasTypeClass() const { return type_class_id() != kIllegalCid; }
   virtual classid_t type_class_id() const;
   virtual RawClass* type_class() const;
-  virtual RawUnresolvedClass* unresolved_class() const;
   virtual RawTypeArguments* arguments() const;
   virtual void set_arguments(const TypeArguments& value) const;
   virtual TokenPosition token_pos() const;
@@ -6205,9 +6174,6 @@
   virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
   virtual bool IsRecursive() const;
 
-  // Set the scope of this type to the given function.
-  virtual void SetScopeFunction(const Function& function) const;
-
   // Check if this type represents a function type.
   virtual bool IsFunctionType() const { return false; }
 
@@ -6222,29 +6188,13 @@
   // must remain uninstantiated, because only T is a free variable in this type.
   //
   // Return a new type, or return 'this' if it is already instantiated.
-  // If bound_error is not NULL, it may be set to reflect a bound error.
   virtual RawAbstractType* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
-      Error* bound_error,
       TrailPtr instantiation_trail,
-      TrailPtr bound_trail,
       Heap::Space space) const;
 
-  // Return a clone of this unfinalized type or the type itself if it is
-  // already finalized. Apply recursively to type arguments, i.e. finalized
-  // type arguments of an unfinalized type are not cloned, but shared.
-  virtual RawAbstractType* CloneUnfinalized() const;
-
-  // Return a clone of this uninstantiated type where all references to type
-  // parameters are replaced with references to type parameters of the same name
-  // but belonging to the new owner class.
-  // Apply recursively to type arguments, i.e. instantiated type arguments of
-  // an uninstantiated type are not cloned, but shared.
-  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
-                                               TrailPtr trail = NULL) const;
-
   virtual RawInstance* CheckAndCanonicalize(Thread* thread,
                                             const char** error_str) const {
     return Canonicalize();
@@ -6308,9 +6258,7 @@
   // Check if this type is a still uninitialized TypeRef.
   bool IsNullTypeRef() const;
 
-  // Check if this type represents the 'dynamic' type or if it is malformed,
-  // since a malformed type is mapped to 'dynamic'.
-  // Call IsMalformed() first, if distinction is required.
+  // Check if this type represents the 'dynamic' type.
   bool IsDynamicType() const;
 
   // Check if this type represents the 'void' type.
@@ -6332,9 +6280,6 @@
   // Check if this type represents the 'int' type.
   bool IsIntType() const;
 
-  // Check if this type represents the '_int64' type.
-  bool IsInt64Type() const;
-
   // Check if this type represents the 'double' type.
   bool IsDoubleType() const;
 
@@ -6363,28 +6308,13 @@
   bool IsDartClosureType() const;
 
   // Check the subtype relationship.
-  bool IsSubtypeOf(const AbstractType& other,
-                   Error* bound_error,
-                   TrailPtr bound_trail,
-                   Heap::Space space) const {
-    return TypeTest(kIsSubtypeOf, other, bound_error, bound_trail, space);
-  }
-
-  // Check the 'more specific' relationship.
-  bool IsMoreSpecificThan(const AbstractType& other,
-                          Error* bound_error,
-                          TrailPtr bound_trail,
-                          Heap::Space space) const {
-    return TypeTest(kIsMoreSpecificThan, other, bound_error, bound_trail,
-                    space);
-  }
+  bool IsSubtypeOf(const AbstractType& other, Heap::Space space) const;
 
   // Returns true iff subtype is a subtype of supertype, false otherwise or if
   // an error occurred.
   static bool InstantiateAndTestSubtype(
       AbstractType* subtype,
       AbstractType* supertype,
-      Error* bound_error,
       const TypeArguments& instantiator_type_args,
       const TypeArguments& function_type_args);
 
@@ -6399,20 +6329,11 @@
   void SetTypeTestingStub(const Instructions& instr) const;
 
  private:
-  // Check the 'is subtype of' or 'is more specific than' relationship.
-  bool TypeTest(TypeTestKind test_kind,
-                const AbstractType& other,
-                Error* bound_error,
-                TrailPtr bound_trail,
-                Heap::Space space) const;
-
   // Returns true if this type is a subtype of FutureOr<T> specified by 'other'.
   // Returns false if other type is not a FutureOr.
-  bool FutureOrTypeTest(Zone* zone,
-                        const AbstractType& other,
-                        Error* bound_error,
-                        TrailPtr bound_trail,
-                        Heap::Space space) const;
+  bool IsSubtypeOfFutureOr(Zone* zone,
+                           const AbstractType& other,
+                           Heap::Space space) const;
 
   // Return the internal or public name of this type, including the names of its
   // type arguments, if any.
@@ -6427,7 +6348,6 @@
 
 // A Type consists of a class, possibly parameterized with type
 // arguments. Example: C<T1, T2>.
-// An unresolved class is a String specifying the class name.
 //
 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, as
 // opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does not
@@ -6452,21 +6372,13 @@
     return raw_ptr()->type_state_ == RawType::kBeingFinalized;
   }
   virtual void SetIsBeingFinalized() const;
-  virtual bool IsMalformed() const;
-  virtual bool IsMalbounded() const;
-  virtual bool IsMalformedOrMalbounded() const;
-  virtual RawLanguageError* error() const;
-  virtual void set_error(const LanguageError& value) const;
-  virtual bool IsResolved() const {
-    return raw_ptr()->type_state_ >= RawType::kResolved;
+  virtual bool HasTypeClass() const {
+    ASSERT(type_class_id() != kIllegalCid);
+    return true;
   }
-  virtual void SetIsResolved() const;
-  virtual bool HasResolvedTypeClass() const;  // Own type class resolved.
   virtual classid_t type_class_id() const;
   virtual RawClass* type_class() const;
   void set_type_class(const Class& value) const;
-  void set_unresolved_class(const Object& value) const;
-  virtual RawUnresolvedClass* unresolved_class() const;
   virtual RawTypeArguments* arguments() const { return raw_ptr()->arguments_; }
   virtual void set_arguments(const TypeArguments& value) const;
   virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
@@ -6475,14 +6387,13 @@
                               TrailPtr trail = NULL) const;
   virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
   virtual bool IsRecursive() const;
-  virtual void SetScopeFunction(const Function& function) const;
   // If signature is not null, this type represents a function type. Note that
   // the signature fully represents the type and type arguments can be ignored.
   // However, in case of a generic typedef, they document how the typedef class
   // was parameterized to obtain the actual signature.
   RawFunction* signature() const;
   void set_signature(const Function& value) const;
-  static intptr_t signature_offset() { return OFFSET_OF(RawType, sig_or_err_); }
+  static intptr_t signature_offset() { return OFFSET_OF(RawType, signature_); }
 
   virtual bool IsFunctionType() const {
     return signature() != Function::null();
@@ -6491,13 +6402,8 @@
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
-      Error* bound_error,
       TrailPtr instantiation_trail,
-      TrailPtr bound_trail,
       Heap::Space space) const;
-  virtual RawAbstractType* CloneUnfinalized() const;
-  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
-                                               TrailPtr trail = NULL) const;
   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
 #if defined(DEBUG)
   // Check if type is canonical.
@@ -6529,9 +6435,6 @@
   // The 'int' type.
   static RawType* IntType();
 
-  // The '_int64' type.
-  static RawType* Int64Type();
-
   // The 'Smi' type.
   static RawType* SmiType();
 
@@ -6568,7 +6471,7 @@
   // The finalized type of the given non-parameterized class.
   static RawType* NewNonParameterizedType(const Class& type_class);
 
-  static RawType* New(const Object& clazz,
+  static RawType* New(const Class& clazz,
                       const TypeArguments& arguments,
                       TokenPosition token_pos,
                       Heap::Space space = Heap::kOld);
@@ -6604,22 +6507,9 @@
     const AbstractType& ref_type = AbstractType::Handle(type());
     return ref_type.IsNull() || ref_type.IsBeingFinalized();
   }
-  virtual bool IsMalformed() const {
-    return AbstractType::Handle(type()).IsMalformed();
-  }
-  virtual bool IsMalbounded() const {
-    return AbstractType::Handle(type()).IsMalbounded();
-  }
-  virtual bool IsMalformedOrMalbounded() const {
-    return AbstractType::Handle(type()).IsMalformedOrMalbounded();
-  }
-  virtual RawLanguageError* error() const {
-    return AbstractType::Handle(type()).error();
-  }
-  virtual bool IsResolved() const { return true; }
-  virtual bool HasResolvedTypeClass() const {
+  virtual bool HasTypeClass() const {
     return (type() != AbstractType::null()) &&
-           AbstractType::Handle(type()).HasResolvedTypeClass();
+           AbstractType::Handle(type()).HasTypeClass();
   }
   RawAbstractType* type() const { return raw_ptr()->type_; }
   void set_type(const AbstractType& value) const;
@@ -6640,17 +6530,16 @@
                               TrailPtr trail = NULL) const;
   virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
   virtual bool IsRecursive() const { return true; }
-  virtual void SetScopeFunction(const Function& function) const;
+  virtual bool IsFunctionType() const {
+    const AbstractType& ref_type = AbstractType::Handle(type());
+    return !ref_type.IsNull() && ref_type.IsFunctionType();
+  }
   virtual RawTypeRef* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
-      Error* bound_error,
       TrailPtr instantiation_trail,
-      TrailPtr bound_trail,
       Heap::Space space) const;
-  virtual RawTypeRef* CloneUninstantiated(const Class& new_owner,
-                                          TrailPtr trail = NULL) const;
   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const;
 #if defined(DEBUG)
   // Check if typeref is canonical.
@@ -6691,11 +6580,8 @@
   }
   virtual void SetIsFinalized() const;
   virtual bool IsBeingFinalized() const { return false; }
-  virtual bool IsMalformed() const { return false; }
-  virtual bool IsMalbounded() const { return false; }
-  virtual bool IsMalformedOrMalbounded() const { return false; }
-  virtual bool IsResolved() const { return true; }
-  virtual bool HasResolvedTypeClass() const { return false; }
+  virtual bool HasTypeClass() const { return false; }
+  virtual classid_t type_class_id() const { return kIllegalCid; }
   classid_t parameterized_class_id() const;
   RawClass* parameterized_class() const;
   RawFunction* parameterized_function() const {
@@ -6712,33 +6598,18 @@
   void set_index(intptr_t value) const;
   RawAbstractType* bound() const { return raw_ptr()->bound_; }
   void set_bound(const AbstractType& value) const;
-  // Returns true if bounded_type is below upper_bound, otherwise return false
-  // and set bound_error if both bounded_type and upper_bound are instantiated.
-  // If one or both are not instantiated, returning false only means that the
-  // bound cannot be checked yet and this is not an error.
-  bool CheckBound(const AbstractType& bounded_type,
-                  const AbstractType& upper_bound,
-                  Error* bound_error,
-                  TrailPtr bound_trail,
-                  Heap::Space space) const;
   virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
   virtual bool IsInstantiated(Genericity genericity = kAny,
                               intptr_t num_free_fun_type_params = kAllFree,
                               TrailPtr trail = NULL) const;
   virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
   virtual bool IsRecursive() const { return false; }
-  virtual void SetScopeFunction(const Function& function) const {}
   virtual RawAbstractType* InstantiateFrom(
       const TypeArguments& instantiator_type_arguments,
       const TypeArguments& function_type_arguments,
       intptr_t num_free_fun_type_params,
-      Error* bound_error,
       TrailPtr instantiation_trail,
-      TrailPtr bound_trail,
       Heap::Space space) const;
-  virtual RawAbstractType* CloneUnfinalized() const;
-  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
-                                               TrailPtr trail = NULL) const;
   virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const {
     return raw();
   }
@@ -6779,157 +6650,6 @@
   friend class ClearTypeHashVisitor;
 };
 
-// A BoundedType represents a type instantiated at compile time from a type
-// parameter specifying a bound that either cannot be checked at compile time
-// because the type or the bound are still uninstantiated or can be checked and
-// would trigger a bound error in checked mode. The bound must be checked at
-// runtime once the type and its bound are instantiated and when the execution
-// mode is known to be checked mode.
-class BoundedType : public AbstractType {
- public:
-  virtual bool IsFinalized() const {
-    return AbstractType::Handle(type()).IsFinalized();
-  }
-  virtual bool IsBeingFinalized() const {
-    return AbstractType::Handle(type()).IsBeingFinalized();
-  }
-  virtual bool IsMalformed() const;
-  virtual bool IsMalbounded() const;
-  virtual bool IsMalformedOrMalbounded() const;
-  virtual RawLanguageError* error() const;
-  virtual bool IsResolved() const { return true; }
-  virtual bool HasResolvedTypeClass() const {
-    return AbstractType::Handle(type()).HasResolvedTypeClass();
-  }
-  virtual classid_t type_class_id() const {
-    return AbstractType::Handle(type()).type_class_id();
-  }
-  virtual RawClass* type_class() const {
-    return AbstractType::Handle(type()).type_class();
-  }
-  virtual RawUnresolvedClass* unresolved_class() const {
-    return AbstractType::Handle(type()).unresolved_class();
-  }
-  virtual RawTypeArguments* arguments() const {
-    return AbstractType::Handle(type()).arguments();
-  }
-  RawAbstractType* type() const { return raw_ptr()->type_; }
-  RawAbstractType* bound() const { return raw_ptr()->bound_; }
-  RawTypeParameter* type_parameter() const {
-    return raw_ptr()->type_parameter_;
-  }
-  virtual TokenPosition token_pos() const {
-    return AbstractType::Handle(type()).token_pos();
-  }
-  virtual bool IsInstantiated(Genericity genericity = kAny,
-                              intptr_t num_free_fun_type_params = kAllFree,
-                              TrailPtr trail = NULL) const {
-    // It is not possible to encounter an instantiated bounded type with an
-    // uninstantiated upper bound. Therefore, we do not need to check if the
-    // bound is instantiated. Moreover, doing so could lead into cycles, as in
-    // class C<T extends C<C>> { }.
-    return AbstractType::Handle(type()).IsInstantiated(
-        genericity, num_free_fun_type_params, trail);
-  }
-  virtual bool IsEquivalent(const Instance& other, TrailPtr trail = NULL) const;
-  virtual bool IsRecursive() const;
-  virtual void SetScopeFunction(const Function& function) const;
-  virtual RawAbstractType* InstantiateFrom(
-      const TypeArguments& instantiator_type_arguments,
-      const TypeArguments& function_type_arguments,
-      intptr_t num_free_fun_type_params,
-      Error* bound_error,
-      TrailPtr instantiation_trail,
-      TrailPtr bound_trail,
-      Heap::Space space) const;
-  virtual RawAbstractType* CloneUnfinalized() const;
-  virtual RawAbstractType* CloneUninstantiated(const Class& new_owner,
-                                               TrailPtr trail = NULL) const;
-  virtual RawAbstractType* Canonicalize(TrailPtr trail = NULL) const {
-    return raw();
-  }
-#if defined(DEBUG)
-  // Check if bounded type is canonical.
-  virtual bool CheckIsCanonical(Thread* thread) const { return true; }
-#endif  // DEBUG
-  virtual void EnumerateURIs(URIs* uris) const;
-
-  virtual intptr_t Hash() const;
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawBoundedType));
-  }
-
-  static RawBoundedType* New(const AbstractType& type,
-                             const AbstractType& bound,
-                             const TypeParameter& type_parameter);
-
- private:
-  intptr_t ComputeHash() const;
-  void SetHash(intptr_t value) const;
-
-  void set_type(const AbstractType& value) const;
-  void set_bound(const AbstractType& value) const;
-  void set_type_parameter(const TypeParameter& value) const;
-
-  static RawBoundedType* New();
-
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(BoundedType, AbstractType);
-  friend class Class;
-  friend class ClearTypeHashVisitor;
-};
-
-// A MixinAppType represents a parsed mixin application clause, e.g.
-// "S<T> with M<U>, N<V>".
-// MixinAppType objects do not survive finalization, so they do not
-// need to be written to and read from snapshots.
-// The class finalizer creates synthesized classes S&M and S&M&N if they do not
-// yet exist in the library declaring the mixin application clause.
-class MixinAppType : public AbstractType {
- public:
-  // A MixinAppType object is unfinalized by definition, since it is replaced at
-  // class finalization time with a finalized (and possibly malformed or
-  // malbounded) Type object.
-  virtual bool IsFinalized() const { return false; }
-  virtual bool IsMalformed() const { return false; }
-  virtual bool IsMalbounded() const { return false; }
-  virtual bool IsMalformedOrMalbounded() const { return false; }
-  virtual bool IsResolved() const { return false; }
-  virtual bool HasResolvedTypeClass() const { return false; }
-  virtual RawString* Name() const;
-  virtual TokenPosition token_pos() const;
-
-  // Returns the mixin composition depth of this mixin application type.
-  intptr_t Depth() const;
-
-  // Returns the declared super type of the mixin application, which will also
-  // be the super type of the first synthesized class, e.g. class "S&M" will
-  // refer to super type "S<T>".
-  RawAbstractType* super_type() const { return raw_ptr()->super_type_; }
-
-  // Returns the mixin type at the given mixin composition depth, e.g. N<V> at
-  // depth 0 and M<U> at depth 1.
-  RawAbstractType* MixinTypeAt(intptr_t depth) const;
-
-  static intptr_t InstanceSize() {
-    return RoundedAllocationSize(sizeof(RawMixinAppType));
-  }
-
-  static RawMixinAppType* New(const AbstractType& super_type,
-                              const Array& mixin_types);
-
- private:
-  void set_super_type(const AbstractType& value) const;
-
-  RawArray* mixin_types() const { return raw_ptr()->mixin_types_; }
-  void set_mixin_types(const Array& value) const;
-
-  static RawMixinAppType* New();
-
-  FINAL_HEAP_OBJECT_IMPLEMENTATION(MixinAppType, AbstractType);
-  friend class Class;
-};
-
 class Number : public Instance {
  public:
   // TODO(iposva): Add more useful Number methods.
@@ -7287,8 +7007,6 @@
 
   uint16_t CharAt(intptr_t index) const;
 
-  Scanner::CharAtFunc CharAtFunc() const;
-
   intptr_t CharSize() const;
 
   inline bool Equals(const String& str) const;
@@ -8017,10 +7735,11 @@
   // architecture.
   static const intptr_t kHashBits = 30;
 
-  intptr_t Length() const {
-    ASSERT(!IsNull());
-    return Smi::Value(raw_ptr()->length_);
+  intptr_t Length() const { return LengthOf(raw()); }
+  static intptr_t LengthOf(const RawArray* array) {
+    return Smi::Value(array->ptr()->length_);
   }
+
   static intptr_t length_offset() { return OFFSET_OF(RawArray, length_); }
   static intptr_t data_offset() {
     return OFFSET_OF_RETURNED_VALUE(RawArray, data);
@@ -8029,10 +7748,31 @@
     return OFFSET_OF_RETURNED_VALUE(RawArray, data) + kWordSize * index;
   }
 
+  static bool Equals(RawArray* a, RawArray* b) {
+    if (a == b) return true;
+    if (a->IsRawNull() || b->IsRawNull()) return false;
+    if (a->ptr()->length_ != b->ptr()->length_) return false;
+    if (a->ptr()->type_arguments_ != b->ptr()->type_arguments_) return false;
+    const intptr_t length = LengthOf(a);
+    return memcmp(a->ptr()->data(), b->ptr()->data(), kWordSize * length) == 0;
+  }
+
+  static RawObject** DataOf(RawArray* array) { return array->ptr()->data(); }
+
   RawObject* At(intptr_t index) const { return *ObjectAddr(index); }
   void SetAt(intptr_t index, const Object& value) const {
     // TODO(iposva): Add storing NoSafepointScope.
-    StorePointer(ObjectAddr(index), value.raw());
+    StoreArrayPointer(ObjectAddr(index), value.raw());
+  }
+
+  // Access to the array with acquire release semantics.
+  RawObject* AtAcquire(intptr_t index) const {
+    return AtomicOperations::LoadAcquire(ObjectAddr(index));
+  }
+  void SetAtRelease(intptr_t index, const Object& value) const {
+    // TODO(iposva): Add storing NoSafepointScope.
+    StoreArrayPointer<RawObject*, MemoryOrder::kRelease>(ObjectAddr(index),
+                                                         value.raw());
   }
 
   bool IsImmutable() const { return raw()->GetClassId() == kImmutableArrayCid; }
@@ -8049,7 +7789,7 @@
             value.IsInstantiated() /*&& value.IsCanonical()*/));
     // TODO(asiva): Values read from a message snapshot are not properly marked
     // as canonical. See for example tests/isolate/mandel_isolate_test.dart.
-    StorePointer(&raw_ptr()->type_arguments_, value.raw());
+    StoreArrayPointer(&raw_ptr()->type_arguments_, value.raw());
   }
 
   virtual bool CanonicalizeEquals(const Instance& other) const;
@@ -8096,13 +7836,17 @@
                         intptr_t new_length,
                         Heap::Space space = Heap::kNew);
 
+  // Truncates the array to a given length. 'new_length' must be less than
+  // or equal to 'source.Length()'. The remaining unused part of the array is
+  // marked as an Array object or a regular Object so that it can be traversed
+  // during garbage collection.
+  void Truncate(intptr_t new_length) const;
+
   // Return an Array object that contains all the elements currently present
   // in the specified Growable Object Array. This is done by first truncating
   // the Growable Object Array's backing array to the currently used size and
   // returning the truncated backing array.
-  // The remaining unused part of the backing array is marked as an Array
-  // object or a regular Object so that it can be traversed during garbage
-  // collection. The backing array of the original Growable Object Array is
+  // The backing array of the original Growable Object Array is
   // set to an empty array.
   // If the unique parameter is false, the function is allowed to return
   // a shared Array instance.
@@ -8131,6 +7875,26 @@
     StoreSmi(&raw_ptr()->length_, Smi::New(value));
   }
 
+  template <typename type, MemoryOrder order = MemoryOrder::kRelaxed>
+  void StoreArrayPointer(type const* addr, type value) const {
+    raw()->StoreArrayPointer<type, order>(addr, value);
+  }
+
+  // Store a range of pointers [from, from + count) into [to, to + count).
+  // TODO(koda): Use this to fix Object::Clone's broken store buffer logic.
+  void StoreArrayPointers(RawObject* const* to,
+                          RawObject* const* from,
+                          intptr_t count) {
+    ASSERT(Contains(reinterpret_cast<uword>(to)));
+    if (raw()->IsNewObject()) {
+      memmove(const_cast<RawObject**>(to), from, count * kWordSize);
+    } else {
+      for (intptr_t i = 0; i < count; ++i) {
+        StoreArrayPointer(&to[i], from[i]);
+      }
+    }
+  }
+
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Array, Instance);
   friend class Class;
   friend class ImmutableArray;
@@ -8203,7 +7967,7 @@
     ASSERT(index < Length());
 
     // TODO(iposva): Add storing NoSafepointScope.
-    data()->StorePointer(ObjectAddr(index), value.raw());
+    data()->StoreArrayPointer(ObjectAddr(index), value.raw());
   }
 
   void Add(const Object& value, Heap::Space space = Heap::kNew) const;
@@ -8566,6 +8330,10 @@
 
 class ExternalTypedData : public Instance {
  public:
+  // Alignment of data when serializing ExternalTypedData in a clustered
+  // snapshot. Should be independent of word size.
+  static const int kDataSerializationAlignment = 8;
+
   intptr_t Length() const {
     ASSERT(!IsNull());
     return Smi::Value(raw_ptr()->length_);
@@ -9024,8 +8792,8 @@
   void set_expand_inlined(bool value) const;
 
   RawArray* code_array() const { return raw_ptr()->code_array_; }
-  RawCode* CodeAtFrame(intptr_t frame_index) const;
-  void SetCodeAtFrame(intptr_t frame_index, const Code& code) const;
+  RawObject* CodeAtFrame(intptr_t frame_index) const;
+  void SetCodeAtFrame(intptr_t frame_index, const Object& code) const;
 
   RawArray* pc_offset_array() const { return raw_ptr()->pc_offset_array_; }
   RawSmi* PcOffsetAtFrame(intptr_t frame_index) const;
@@ -9167,8 +8935,6 @@
     StoreNonPointer(&raw_ptr()->num_registers_, value);
   }
 
-  void* GetDataStartAddress() const;
-  static RawRegExp* FromDataStartAddress(void* data);
   const char* Flags() const;
 
   virtual bool CanonicalizeEquals(const Instance& other) const;
@@ -9419,8 +9185,20 @@
 void MegamorphicCache::SetEntry(const Array& array,
                                 intptr_t index,
                                 const Smi& class_id,
-                                const Function& target) {
+                                const Object& target) {
+  ASSERT(target.IsFunction() || target.IsSmi());
   array.SetAt((index * kEntryLength) + kClassIdIndex, class_id);
+#if defined(DART_PRECOMPILED_RUNTIME)
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    if (target.IsFunction()) {
+      const auto& function = Function::Cast(target);
+      const auto& entry_point = Smi::Handle(
+          Smi::FromAlignedAddress(Code::EntryPoint(function.CurrentCode())));
+      array.SetAt((index * kEntryLength) + kTargetFunctionIndex, entry_point);
+      return;
+    }
+  }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
   array.SetAt((index * kEntryLength) + kTargetFunctionIndex, target);
 }
 
@@ -9462,20 +9240,6 @@
   StoreSmi(&raw_ptr()->hash_, Smi::New(value));
 }
 
-inline intptr_t BoundedType::Hash() const {
-  intptr_t result = Smi::Value(raw_ptr()->hash_);
-  if (result != 0) {
-    return result;
-  }
-  return ComputeHash();
-}
-
-inline void BoundedType::SetHash(intptr_t value) const {
-  // This is only safe because we create a new Smi, which does not cause
-  // heap allocation.
-  StoreSmi(&raw_ptr()->hash_, Smi::New(value));
-}
-
 inline intptr_t TypeArguments::Hash() const {
   if (IsNull()) return 0;
   intptr_t result = Smi::Value(raw_ptr()->hash_);
@@ -9491,6 +9255,148 @@
   StoreSmi(&raw_ptr()->hash_, Smi::New(value));
 }
 
+// A view on an [Array] as a list of tuples, optionally starting at an offset.
+//
+// Example: We store a list of (kind, function, code) tuples into the
+// [Code::static_calls_target_table] array of type [Array].
+//
+// This helper class can then be used via
+//
+//     using CallTableView = ArrayOfTuplesVied<
+//         Code::Kind, std::tuple<Smi, Function, Code>>;
+//
+//     auto& array = Array::Handle(code.static_calls_targets_table());
+//     CallTableView static_calls(array);
+//
+//     // Using convenient for loop.
+//     auto& function = Function::Handle();
+//     for (auto& call : static_calls) {
+//       function = call.Get<Code::kSCallTableFunctionTarget>();
+//       call.Set<Code::kSCallTableFunctionTarget>(function);
+//     }
+//
+//     // Using manual loop.
+//     auto& function = Function::Handle();
+//     for (intptr_t i = 0; i < static_calls.Length(); ++i) {
+//       auto call = static_calls[i];
+//       function = call.Get<Code::kSCallTableFunctionTarget>();
+//       call.Set<Code::kSCallTableFunctionTarget>(function);
+//     }
+//
+//
+// Template parameters:
+//
+//   * [EnumType] must be a normal enum which enumerates the entries of the
+//     tuple
+//
+//   * [kStartOffset] is the offset at which the first tuple in the array
+//     starts (can be 0).
+//
+//   * [TupleT] must be a std::tuple<...> where "..." are the heap object handle
+//     classes (e.g. 'Code', 'Smi', 'Object')
+template <typename EnumType, typename TupleT, int kStartOffset = 0>
+class ArrayOfTuplesView {
+ public:
+  static constexpr intptr_t EntrySize = std::tuple_size<TupleT>::value;
+
+  class Iterator;
+
+  class TupleView {
+   public:
+    TupleView(const Array& array, intptr_t index)
+        : array_(array), index_(index) {
+      ASSERT(!array.IsNull());
+    }
+
+    template <EnumType kElement>
+    typename std::tuple_element<kElement, TupleT>::type::RawObjectType* Get()
+        const {
+      using object_type = typename std::tuple_element<kElement, TupleT>::type;
+      return object_type::RawCast(array_.At(index_ + kElement));
+    }
+
+    template <EnumType kElement>
+    void Set(const typename std::tuple_element<kElement, TupleT>::type& value)
+        const {
+      array_.SetAt(index_ + kElement, value);
+    }
+
+    intptr_t index() const { return (index_ - kStartOffset) / EntrySize; }
+
+   private:
+    const Array& array_;
+    intptr_t index_;
+
+    friend class Iterator;
+  };
+
+  class Iterator {
+   public:
+    Iterator(const Array& array, intptr_t index) : entry_(array, index) {}
+
+    bool operator==(const Iterator& other) {
+      return entry_.index_ == other.entry_.index_;
+    }
+    bool operator!=(const Iterator& other) {
+      return entry_.index_ != other.entry_.index_;
+    }
+
+    const TupleView& operator*() const { return entry_; }
+
+    Iterator& operator++() {
+      entry_.index_ += EntrySize;
+      return *this;
+    }
+
+   private:
+    TupleView entry_;
+  };
+
+  explicit ArrayOfTuplesView(const Array& array) : array_(array), index_(-1) {
+    ASSERT(array.Length() >= kStartOffset);
+    ASSERT((array.Length() - kStartOffset) % EntrySize == kStartOffset);
+  }
+
+  intptr_t Length() const {
+    return (array_.Length() - kStartOffset) / EntrySize;
+  }
+
+  TupleView At(intptr_t i) const {
+    return TupleView(array_, kStartOffset + i * EntrySize);
+  }
+
+  TupleView operator[](intptr_t i) const { return At(i); }
+
+  Iterator begin() const { return Iterator(array_, kStartOffset); }
+
+  Iterator end() const {
+    return Iterator(array_, kStartOffset + Length() * EntrySize);
+  }
+
+ private:
+  const Array& array_;
+  intptr_t index_;
+};
+
+using InvocationDispatcherTable =
+    ArrayOfTuplesView<Class::InvocationDispatcherEntry,
+                      std::tuple<String, Array, Function>>;
+
+using StaticCallsTable =
+    ArrayOfTuplesView<Code::SCallTableEntry, std::tuple<Smi, Code, Function>>;
+
+using SubtypeTestCacheTable = ArrayOfTuplesView<SubtypeTestCache::Entries,
+                                                std::tuple<Object,
+                                                           Object,
+                                                           TypeArguments,
+                                                           TypeArguments,
+                                                           TypeArguments,
+                                                           TypeArguments,
+                                                           TypeArguments>>;
+
+void DumpTypeTable(Isolate* isolate);
+void DumpTypeArgumentsTable(Isolate* isolate);
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_OBJECT_H_
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 95e3f16..6edb424 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -16,6 +16,12 @@
 
 namespace dart {
 
+static bool IsUserClass(intptr_t cid) {
+  if (cid == kContextCid) return true;
+  if (cid == kTypeArgumentsCid) return false;
+  return cid >= kInstanceCid;
+}
+
 // The state of a pre-order, depth-first traversal of an object graph.
 // When a node is visited, *all* its children are pushed to the stack at once.
 // We insert a sentinel between the node and its children on the stack, to
@@ -35,12 +41,8 @@
   virtual void VisitPointers(RawObject** first, RawObject** last) {
     for (RawObject** current = first; current <= last; ++current) {
       if ((*current)->IsHeapObject() && !(*current)->IsGraphMarked()) {
-        if (!include_vm_objects_) {
-          intptr_t cid = (*current)->GetClassId();
-          if (((cid < kInstanceCid) || (cid == kTypeArgumentsCid)) &&
-              (cid != kContextCid) && (cid != kFieldCid)) {
-            continue;
-          }
+        if (!include_vm_objects_ && !IsUserClass((*current)->GetClassId())) {
+          continue;
         }
         (*current)->SetGraphMarked();
         Node node;
@@ -197,7 +199,7 @@
   }
 }
 
-ObjectGraph::ObjectGraph(Thread* thread) : StackResource(thread) {
+ObjectGraph::ObjectGraph(Thread* thread) : ThreadStackResource(thread) {
   // The VM isolate has all its objects pre-marked, so iterating over it
   // would be a no-op.
   ASSERT(thread->isolate() != Dart::vm_isolate());
@@ -536,8 +538,7 @@
         // we'll need to encode which fields were omitted here.
         continue;
       }
-      if (only_instances_ && ((object->GetClassId() < kInstanceCid) ||
-                              (object->GetClassId() == kTypeArgumentsCid))) {
+      if (only_instances_ && !IsUserClass(object->GetClassId())) {
         continue;
       }
       WritePtr(object, stream_);
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index 838c61d..deb700f 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_OBJECT_GRAPH_H_
 
 #include "vm/allocation.h"
+#include "vm/thread_stack_resource.h"
 
 namespace dart {
 
@@ -19,7 +20,7 @@
 // Example uses:
 // - find a retaining path from the isolate roots to a particular object, or
 // - determine how much memory is retained by some particular object(s).
-class ObjectGraph : public StackResource {
+class ObjectGraph : public ThreadStackResource {
  public:
   class Stack;
 
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc
index d1c8801..23593a7 100644
--- a/runtime/vm/object_id_ring_test.cc
+++ b/runtime/vm/object_id_ring_test.cc
@@ -176,7 +176,11 @@
   EXPECT_NE(RawObject::ToAddr(raw_obj1), RawObject::ToAddr(raw_object_moved1));
   EXPECT_NE(RawObject::ToAddr(raw_obj2), RawObject::ToAddr(raw_object_moved2));
   // Test that we still point at the same list.
-  Dart_Handle moved_handle = Api::NewHandle(thread, raw_object_moved1);
+  Dart_Handle moved_handle;
+  {
+    TransitionNativeToVM transition(thread);
+    moved_handle = Api::NewHandle(thread, raw_object_moved1);
+  }
   EXPECT_VALID(moved_handle);
   EXPECT(!Dart_IsNull(moved_handle));
   EXPECT(Dart_IsList(moved_handle));
@@ -197,18 +201,12 @@
   intptr_t raw_obj_id1 = -1;
   intptr_t raw_obj_id2 = -1;
   {
-    Dart_EnterScope();
-    Dart_Handle result;
-    // Create a string in the old heap.
-    result = Api::NewHandle(thread, String::New("old", Heap::kOld));
-    EXPECT_VALID(result);
-    intptr_t string_length = 0;
-    // Inspect string.
-    EXPECT(!Dart_IsNull(result));
-    EXPECT(Dart_IsString(result));
-    EXPECT_VALID(Dart_StringLength(result, &string_length));
-    EXPECT_EQ(3, string_length);
-    RawObject* raw_obj = Api::UnwrapHandle(result);
+    HandleScope handle_scope(thread);
+    const String& str = String::Handle(String::New("old", Heap::kOld));
+    EXPECT(!str.IsNull());
+    EXPECT_EQ(3, str.Length());
+
+    RawObject* raw_obj = Object::RawCast(str.raw());
     // Verify that it is located in old heap.
     EXPECT(raw_obj->IsOldObject());
     EXPECT_NE(Object::null(), raw_obj);
@@ -224,8 +222,7 @@
     EXPECT_NE(Object::null(), raw_obj2);
     EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj1));
     EXPECT_EQ(RawObject::ToAddr(raw_obj), RawObject::ToAddr(raw_obj2));
-    // Exit scope. Freeing result handle.
-    Dart_ExitScope();
+    // Exit scope. Freeing String handle.
   }
   // Force a GC. No reference exist to the old string anymore. It should be
   // collected and the object id ring will now return the null object for
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index bc78047..c519034 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -82,14 +82,29 @@
   }
 #else
   const ObjectPool& pool = ObjectPool::Handle(zone, object_pool());
-  Object& object = Object::Handle(zone);
   ASSERT(!pool.IsNull());
-  for (intptr_t i = 0; i < pool.Length(); i++) {
-    ObjectPool::EntryType entry_type = pool.TypeAt(i);
+  pool.ResetICDatas(zone);
+#endif
+}
+
+void Bytecode::ResetICDatas(Zone* zone) const {
+  // Iterate over the Bytecode's object pool and reset all ICDatas.
+  const ObjectPool& pool = ObjectPool::Handle(zone, object_pool());
+  ASSERT(!pool.IsNull());
+  pool.ResetICDatas(zone);
+}
+
+void ObjectPool::ResetICDatas(Zone* zone) const {
+#ifdef TARGET_ARCH_IA32
+  UNREACHABLE();
+#else
+  Object& object = Object::Handle(zone);
+  for (intptr_t i = 0; i < Length(); i++) {
+    ObjectPool::EntryType entry_type = TypeAt(i);
     if (entry_type != ObjectPool::kTaggedObject) {
       continue;
     }
-    object = pool.ObjectAt(i);
+    object = ObjectAt(i);
     if (object.IsICData()) {
       ICData::Cast(object).Reset(zone);
     }
@@ -159,12 +174,12 @@
   set_constants(old_constants);
 }
 
-void Class::CopyCanonicalType(const Class& old_cls) const {
-  const Type& old_canonical_type = Type::Handle(old_cls.canonical_type());
-  if (old_canonical_type.IsNull()) {
+void Class::CopyDeclarationType(const Class& old_cls) const {
+  const Type& old_declaration_type = Type::Handle(old_cls.declaration_type());
+  if (old_declaration_type.IsNull()) {
     return;
   }
-  set_canonical_type(old_canonical_type);
+  set_declaration_type(old_declaration_type);
 }
 
 class EnumMapTraits {
@@ -689,13 +704,36 @@
   if (rule == kInstance) {
     const intptr_t num_args = NumArgsTested();
     const bool tracking_exactness = IsTrackingExactness();
-    if (num_args == 2) {
-      ClearWithSentinel();
-    } else {
-      const Array& data_array = Array::Handle(
-          zone, CachedEmptyICDataArray(num_args, tracking_exactness));
-      set_ic_data_array(data_array);
+    const intptr_t len = Length();
+    // We need at least one non-sentinel entry to require a check
+    // for the smi fast path case.
+    if (num_args == 2 && len >= 2) {
+      if (IsImmutable()) {
+        return;
+      }
+      Zone* zone = Thread::Current()->zone();
+      const String& name = String::Handle(target_name());
+      const Class& smi_class = Class::Handle(Smi::Class());
+      const Function& smi_op_target = Function::Handle(
+          Resolver::ResolveDynamicAnyArgs(zone, smi_class, name));
+      GrowableArray<intptr_t> class_ids(2);
+      Function& target = Function::Handle();
+      GetCheckAt(0, &class_ids, &target);
+      if ((target.raw() == smi_op_target.raw()) && (class_ids[0] == kSmiCid) &&
+          (class_ids[1] == kSmiCid)) {
+        // The smi fast path case, preserve the initial entry but reset the
+        // count.
+        ClearCountAt(0);
+        WriteSentinelAt(1);
+        const Array& array = Array::Handle(ic_data());
+        array.Truncate(2 * TestEntryLength());
+        return;
+      }
+      // Fall back to the normal behavior with cached empty ICData arrays.
     }
+    const Array& data_array = Array::Handle(
+        zone, CachedEmptyICDataArray(num_args, tracking_exactness));
+    set_ic_data_array(data_array);
     return;
   } else if (rule == kNoRebind || rule == kNSMDispatch) {
     // TODO(30877) we should account for addition/removal of NSM.
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index d82135f..5299079 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -107,8 +107,10 @@
   if (!superType.IsNull()) {
     jsobj.AddProperty("superType", superType);
   }
-  const Type& mix = Type::Handle(mixin());
-  if (!mix.IsNull()) {
+  const Array& interface_array = Array::Handle(interfaces());
+  if (is_transformed_mixin_application()) {
+    Type& mix = Type::Handle();
+    mix ^= interface_array.At(interface_array.Length() - 1);
     jsobj.AddProperty("mixin", mix);
   }
   jsobj.AddProperty("library", Object::Handle(library()));
@@ -118,7 +120,6 @@
   }
   {
     JSONArray interfaces_array(&jsobj, "interfaces");
-    const Array& interface_array = Array::Handle(interfaces());
     Type& interface_type = Type::Handle();
     if (!interface_array.IsNull()) {
       for (intptr_t i = 0; i < interface_array.Length(); ++i) {
@@ -173,10 +174,6 @@
   }
 }
 
-void UnresolvedClass::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  Object::PrintJSONImpl(stream, ref);
-}
-
 void TypeArguments::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   // The index in the canonical_type_arguments table cannot be used as part of
@@ -312,6 +309,12 @@
   if (!code.IsNull()) {
     jsobj.AddProperty("code", code);
   }
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  Bytecode& bytecode = Bytecode::Handle(this->bytecode());
+  if (!bytecode.IsNull()) {
+    jsobj.AddProperty("_bytecode", bytecode);
+  }
+#endif  // !DART_PRECOMPILED_RUNTIME
   Array& ics = Array::Handle(ic_data_array());
   if (!ics.IsNull()) {
     jsobj.AddProperty("_icDataArray", ics);
@@ -483,9 +486,7 @@
     Class& klass = Class::Handle();
     while (class_iter.HasNext()) {
       klass = class_iter.GetNextClass();
-      if (!klass.IsMixinApplication()) {
-        jsarr.AddValue(klass);
-      }
+      jsarr.AddValue(klass);
     }
   }
   {
@@ -788,6 +789,8 @@
 }
 
 void Code::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  // N.B. This is polymorphic with Bytecode.
+
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Code", ref);
   jsobj.AddFixedServiceId("code/%" Px64 "-%" Px "", compile_timestamp(),
@@ -853,6 +856,47 @@
 #endif
 }
 
+void Bytecode::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  // N.B. This is polymorphic with Code.
+
+  JSONObject jsobj(stream);
+  AddCommonObjectProperties(&jsobj, "Code", ref);
+  int64_t compile_timestamp = 0;
+  jsobj.AddFixedServiceId("code/%" Px64 "-%" Px "", compile_timestamp,
+                          PayloadStart());
+  const char* qualified_name = QualifiedName();
+  const char* vm_name = Name();
+  AddNameProperties(&jsobj, qualified_name, vm_name);
+
+  jsobj.AddProperty("kind", "Dart");
+  jsobj.AddProperty("_optimized", false);
+  jsobj.AddProperty("_intrinsic", false);
+  jsobj.AddProperty("_native", false);
+  if (ref) {
+    return;
+  }
+  const Function& fun = Function::Handle(function());
+  jsobj.AddProperty("function", fun);
+  jsobj.AddPropertyF("_startAddress", "%" Px "", PayloadStart());
+  jsobj.AddPropertyF("_endAddress", "%" Px "", PayloadStart() + Size());
+  jsobj.AddProperty("_alive", true);
+  const ObjectPool& obj_pool = ObjectPool::Handle(object_pool());
+  jsobj.AddProperty("_objectPool", obj_pool);
+  {
+    JSONArray jsarr(&jsobj, "_disassembly");
+    DisassembleToJSONStream formatter(jsarr);
+    Disassemble(&formatter);
+  }
+  const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
+  if (!descriptors.IsNull()) {
+    JSONObject desc(&jsobj, "_descriptors");
+    descriptors.PrintToJSONObject(&desc, false);
+  }
+
+  { JSONArray inlined_functions(&jsobj, "_inlinedFunctions"); }
+  { JSONArray inline_intervals(&jsobj, "_inlinedIntervals"); }
+}
+
 void Context::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   // TODO(turnidge): Should the user level type for Context be Context
@@ -1057,18 +1101,14 @@
   JSONObject jsobj(stream);
   PrintSharedInstanceJSON(&jsobj, ref);
   jsobj.AddProperty("kind", "Type");
-  if (HasResolvedTypeClass()) {
-    const Class& type_cls = Class::Handle(type_class());
-    if (type_cls.CanonicalType() == raw()) {
-      intptr_t cid = type_cls.id();
-      jsobj.AddFixedServiceId("classes/%" Pd "/types/%d", cid, 0);
-    } else {
-      jsobj.AddServiceId(*this);
-    }
-    jsobj.AddProperty("typeClass", type_cls);
+  const Class& type_cls = Class::Handle(type_class());
+  if (type_cls.DeclarationType() == raw()) {
+    intptr_t cid = type_cls.id();
+    jsobj.AddFixedServiceId("classes/%" Pd "/types/%d", cid, 0);
   } else {
     jsobj.AddServiceId(*this);
   }
+  jsobj.AddProperty("typeClass", type_cls);
   const String& user_name = String::Handle(UserVisibleName());
   const String& vm_name = String::Handle(Name());
   AddNameProperties(&jsobj, user_name.ToCString(), vm_name.ToCString());
@@ -1113,25 +1153,6 @@
   jsobj.AddProperty("bound", upper_bound);
 }
 
-void BoundedType::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  JSONObject jsobj(stream);
-  PrintSharedInstanceJSON(&jsobj, ref);
-  jsobj.AddProperty("kind", "BoundedType");
-  jsobj.AddServiceId(*this);
-  const String& user_name = String::Handle(UserVisibleName());
-  const String& vm_name = String::Handle(Name());
-  AddNameProperties(&jsobj, user_name.ToCString(), vm_name.ToCString());
-  if (ref) {
-    return;
-  }
-  jsobj.AddProperty("targetType", AbstractType::Handle(type()));
-  jsobj.AddProperty("bound", AbstractType::Handle(bound()));
-}
-
-void MixinAppType::PrintJSONImpl(JSONStream* stream, bool ref) const {
-  UNREACHABLE();
-}
-
 void Number::PrintJSONImpl(JSONStream* stream, bool ref) const {
   UNREACHABLE();
 }
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index cd760de..77c99ee 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -120,12 +120,14 @@
   RW(Function, async_star_move_next_helper)                                    \
   RW(Function, complete_on_async_return)                                       \
   RW(Class, async_star_stream_controller)                                      \
+  RW(ObjectPool, global_object_pool)                                           \
   RW(Array, library_load_error_table)                                          \
   RW(Array, unique_dynamic_targets)                                            \
   RW(GrowableObjectArray, megamorphic_cache_table)                             \
   RW(Code, build_method_extractor_code)                                        \
   R_(Code, megamorphic_miss_code)                                              \
   R_(Function, megamorphic_miss_function)                                      \
+  RW(Array, code_order_table)                                                  \
   RW(Array, obfuscation_map)                                                   \
   RW(GrowableObjectArray, type_testing_stubs)                                  \
   RW(GrowableObjectArray, changed_in_last_reload)                              \
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 0428856..c43828a 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2249,9 +2249,6 @@
   const char* kScript = "main() {}";
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
   Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 }
@@ -2431,13 +2428,14 @@
 
 ISOLATE_UNIT_TEST_CASE(CheckedHandle) {
   // Ensure that null handles have the correct C++ vtable setup.
-  const String& str1 = String::Handle();
+  Zone* zone = Thread::Current()->zone();
+  const String& str1 = String::Handle(zone);
   EXPECT(str1.IsString());
   EXPECT(str1.IsNull());
-  const String& str2 = String::CheckedHandle(Object::null());
+  const String& str2 = String::CheckedHandle(zone, Object::null());
   EXPECT(str2.IsString());
   EXPECT(str2.IsNull());
-  String& str3 = String::Handle();
+  String& str3 = String::Handle(zone);
   str3 ^= Object::null();
   EXPECT(str3.IsString());
   EXPECT(str3.IsNull());
@@ -2476,8 +2474,8 @@
   Assembler _assembler_(&object_pool_wrapper);
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
-  Code& code =
-      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
+  Code& code = Code::Handle(Code::FinalizeCode(
+      function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   const Instructions& instructions = Instructions::Handle(code.instructions());
   uword payload_start = instructions.PayloadStart();
@@ -2498,8 +2496,8 @@
   Assembler _assembler_(&object_pool_wrapper);
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
-  Code& code =
-      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
+  Code& code = Code::Handle(Code::FinalizeCode(
+      function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   Instructions& instructions = Instructions::Handle(code.instructions());
   uword payload_start = instructions.PayloadStart();
@@ -2526,8 +2524,8 @@
   GenerateEmbedStringInCode(&_assembler_, kHello);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedStringInCode"));
-  const Code& code =
-      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
+  const Code& code = Code::Handle(Code::FinalizeCode(
+      function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   const Object& result =
       Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
@@ -2549,8 +2547,8 @@
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedSmiInCode"));
-  const Code& code =
-      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
+  const Code& code = Code::Handle(Code::FinalizeCode(
+      function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   const Object& result =
       Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
@@ -2567,8 +2565,8 @@
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode"));
-  const Code& code =
-      Code::Handle(Code::FinalizeCode(function, nullptr, &_assembler_));
+  const Code& code = Code::Handle(Code::FinalizeCode(
+      function, nullptr, &_assembler_, Code::PoolAttachment::kAttachPool));
   function.AttachCode(code);
   const Object& result =
       Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
@@ -2596,8 +2594,9 @@
   ObjectPoolWrapper object_pool_wrapper;
   Assembler _assembler_(&object_pool_wrapper);
   GenerateIncrement(&_assembler_);
-  Code& code = Code::Handle(Code::FinalizeCode(
-      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_));
+  Code& code = Code::Handle(
+      Code::FinalizeCode(Function::Handle(CreateFunction("Test_Code")), nullptr,
+                         &_assembler_, Code::PoolAttachment::kAttachPool));
   code.set_exception_handlers(exception_handlers);
 
   // Verify the exception handler table entries by accessing them.
@@ -2637,8 +2636,9 @@
   ObjectPoolWrapper object_pool_wrapper;
   Assembler _assembler_(&object_pool_wrapper);
   GenerateIncrement(&_assembler_);
-  Code& code = Code::Handle(Code::FinalizeCode(
-      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_));
+  Code& code = Code::Handle(
+      Code::FinalizeCode(Function::Handle(CreateFunction("Test_Code")), nullptr,
+                         &_assembler_, Code::PoolAttachment::kAttachPool));
   code.set_pc_descriptors(descriptors);
 
   // Verify the PcDescriptor entries by accessing them.
@@ -2699,8 +2699,9 @@
   ObjectPoolWrapper object_pool_wrapper;
   Assembler _assembler_(&object_pool_wrapper);
   GenerateIncrement(&_assembler_);
-  Code& code = Code::Handle(Code::FinalizeCode(
-      Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_));
+  Code& code = Code::Handle(
+      Code::FinalizeCode(Function::Handle(CreateFunction("Test_Code")), nullptr,
+                         &_assembler_, Code::PoolAttachment::kAttachPool));
   code.set_pc_descriptors(descriptors);
 
   // Verify the PcDescriptor entries by accessing them.
@@ -3831,7 +3832,7 @@
   Dart_Handle result = Dart_Invoke(lib, NewString("test"), 0, NULL);
   EXPECT_VALID(result);
 
-  Function& func_b = Function::Handle();
+  // With no breakpoint, function A.b is inlineable.
   {
     TransitionNativeToVM transition(thread);
     const String& name = String::Handle(String::New(TestCase::url()));
@@ -3840,16 +3841,25 @@
     EXPECT(!vmlib.IsNull());
     const Class& class_a = Class::Handle(
         vmlib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
-    func_b = GetFunction(class_a, "b");
+    Function& func_b = Function::Handle(GetFunction(class_a, "b"));
+    EXPECT(func_b.CanBeInlined());
   }
 
-  // With no breakpoint, function A.b is inlineable.
-  EXPECT(func_b.CanBeInlined());
-
-  // After setting a breakpoint in a function A.b, it is no longer inlineable.
   result = Dart_SetBreakpoint(NewString(TestCase::url()), kBreakpointLine);
   EXPECT_VALID(result);
-  EXPECT(!func_b.CanBeInlined());
+
+  // After setting a breakpoint in a function A.b, it is no longer inlineable.
+  {
+    TransitionNativeToVM transition(thread);
+    const String& name = String::Handle(String::New(TestCase::url()));
+    const Library& vmlib =
+        Library::Handle(Library::LookupLibrary(thread, name));
+    EXPECT(!vmlib.IsNull());
+    const Class& class_a = Class::Handle(
+        vmlib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
+    Function& func_b = Function::Handle(GetFunction(class_a, "b"));
+    EXPECT(!func_b.CanBeInlined());
+  }
 }
 
 ISOLATE_UNIT_TEST_CASE(SpecialClassesHaveEmptyArrays) {
@@ -4191,13 +4201,12 @@
 
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
   Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
   EXPECT_VALID(result);
 
   TransitionNativeToVM transition(thread);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
   const Class& clazz = Class::Handle(GetClass(lib, "A"));
   EXPECT(!clazz.IsNull());
   const Instance& a0 = Instance::Handle(Instance::New(clazz));
@@ -4218,15 +4227,12 @@
 
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
   Dart_Handle h_result = Dart_Invoke(h_lib, NewString("foo"), 0, NULL);
   EXPECT_VALID(h_result);
-  Integer& result = Integer::Handle();
-  result ^= Api::UnwrapHandle(h_result);
 
   TransitionNativeToVM transition(thread);
+  Integer& result = Integer::Handle();
+  result ^= Api::UnwrapHandle(h_result);
   String& foo = String::Handle(String::New("foo"));
   Integer& expected = Integer::Handle();
   expected ^= foo.HashCode();
@@ -4286,9 +4292,6 @@
       "}";
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
   Dart_Handle h_result = Dart_Invoke(h_lib, NewString("makeMap"), 0, NULL);
   EXPECT_VALID(h_result);
 
@@ -4313,12 +4316,10 @@
       "}";
   Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
   EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
   Dart_Handle h_result = Dart_Invoke(h_lib, NewString("makeMap"), 0, NULL);
   EXPECT_VALID(h_result);
 
+  TransitionNativeToVM transition(thread);
   Instance& dart_map = Instance::Handle();
   dart_map ^= Api::UnwrapHandle(h_result);
   ASSERT(dart_map.IsLinkedHashMap());
diff --git a/runtime/vm/os.h b/runtime/vm/os.h
index e79b54a..bb8bc1f 100644
--- a/runtime/vm/os.h
+++ b/runtime/vm/os.h
@@ -123,9 +123,9 @@
   // Cleanup the OS class.
   static void Cleanup();
 
-  static DART_NORETURN void Abort();
+  DART_NORETURN static void Abort();
 
-  static DART_NORETURN void Exit(int code);
+  DART_NORETURN static void Exit(int code);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 0ff1668..54bda8a 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -324,6 +324,8 @@
   int i = 0;
   if (str[0] == '-') {
     i = 1;
+  } else if (str[0] == '+') {
+    i = 1;
   }
   if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 7f4ff12..6534a9b 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -65,9 +65,15 @@
 const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
   // TODO(abarth): Handle time zone changes.
   static const auto* tz_name = new std::string([] {
+#ifdef USE_STD_FOR_NON_NULLABLE_FIDL_FIELDS
+    std::string result;
+    tz->GetTimezoneId(&result);
+    return result;
+#else
     fidl::StringPtr result;
     tz->GetTimezoneId(&result);
     return *result;
+#endif
   }());
   return tz_name->c_str();
 }
@@ -222,6 +228,8 @@
   int i = 0;
   if (str[0] == '-') {
     i = 1;
+  } else if (str[0] == '+') {
+    i = 1;
   }
   if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
@@ -267,7 +275,7 @@
 }
 
 void OS::Exit(int code) {
-  UNIMPLEMENTED();
+  exit(code);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index 1d48dad..1079bdb 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -620,6 +620,8 @@
   int i = 0;
   if (str[0] == '-') {
     i = 1;
+  } else if (str[0] == '+') {
+    i = 1;
   }
   if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index 05813dc..16ce7e8 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -270,6 +270,8 @@
   int i = 0;
   if (str[0] == '-') {
     i = 1;
+  } else if (str[0] == '+') {
+    i = 1;
   }
   if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
diff --git a/runtime/vm/os_thread.cc b/runtime/vm/os_thread.cc
index 2120380..22abcbb 100644
--- a/runtime/vm/os_thread.cc
+++ b/runtime/vm/os_thread.cc
@@ -20,7 +20,7 @@
 bool OSThread::creation_enabled_ = false;
 
 #if defined(HAS_C11_THREAD_LOCAL)
-thread_local Thread* OSThread::current_vm_thread_ = NULL;
+thread_local ThreadState* OSThread::current_vm_thread_ = NULL;
 #endif
 
 OSThread::OSThread()
@@ -214,7 +214,7 @@
   creation_enabled_ = true;
 }
 
-OSThread* OSThread::GetOSThreadFromThread(Thread* thread) {
+OSThread* OSThread::GetOSThreadFromThread(ThreadState* thread) {
   ASSERT(thread->os_thread() != NULL);
   return thread->os_thread();
 }
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
index 1f30787..1fcf0da 100644
--- a/runtime/vm/os_thread.h
+++ b/runtime/vm/os_thread.h
@@ -35,7 +35,7 @@
 // Forward declarations.
 class Log;
 class Mutex;
-class Thread;
+class ThreadState;
 class TimelineEventBlock;
 
 class BaseThread {
@@ -48,6 +48,7 @@
 
   bool is_os_thread_;
 
+  friend class ThreadState;
   friend class Thread;
   friend class OSThread;
 
@@ -100,9 +101,7 @@
 
   uword stack_base() const { return stack_base_; }
   uword stack_limit() const { return stack_limit_; }
-  uword stack_limit_with_headroom() const {
-    return stack_limit_ + kStackSizeBuffer;
-  }
+  uword overflow_stack_limit() const { return stack_limit_ + kStackSizeBuffer; }
 
   bool HasStackHeadroom(intptr_t headroom = kStackSizeBuffer) {
     return GetCurrentStackPointer() > (stack_limit_ + headroom);
@@ -142,7 +141,7 @@
       if (thread->is_os_thread()) {
         os_thread = reinterpret_cast<OSThread*>(thread);
       } else {
-        Thread* vm_thread = reinterpret_cast<Thread*>(thread);
+        ThreadState* vm_thread = reinterpret_cast<ThreadState*>(thread);
         os_thread = GetOSThreadFromThread(vm_thread);
       }
     }
@@ -161,7 +160,7 @@
   static void SetCurrent(OSThread* current) { SetCurrentTLS(current); }
 
 #if defined(HAS_C11_THREAD_LOCAL)
-  static Thread* CurrentVMThread() { return current_vm_thread_; }
+  static ThreadState* CurrentVMThread() { return current_vm_thread_; }
 #endif
 
   // TODO(5411455): Use flag to override default value and Validate the
@@ -211,7 +210,7 @@
   static void DisableOSThreadCreation();
   static void EnableOSThreadCreation();
 
-  static const intptr_t kStackSizeBuffer = (4 * KB * kWordSize);
+  static const intptr_t kStackSizeBuffer = (16 * KB * kWordSize);
 
   static const ThreadId kInvalidThreadId;
   static const ThreadJoinId kInvalidThreadJoinId;
@@ -227,14 +226,14 @@
   // in the windows thread interrupter which is used for profiling.
   // We could eliminate this requirement if the windows thread interrupter
   // is implemented differently.
-  Thread* thread() const { return thread_; }
-  void set_thread(Thread* value) { thread_ = value; }
+  ThreadState* thread() const { return thread_; }
+  void set_thread(ThreadState* value) { thread_ = value; }
 
   static void Cleanup();
 #ifndef PRODUCT
   static ThreadId GetCurrentThreadTraceId();
 #endif  // PRODUCT
-  static OSThread* GetOSThreadFromThread(Thread* thread);
+  static OSThread* GetOSThreadFromThread(ThreadState* thread);
   static void AddThreadToListLocked(OSThread* thread);
   static void RemoveThreadFromList(OSThread* thread);
   static OSThread* CreateAndSetUnknownThread();
@@ -262,7 +261,7 @@
   Log* log_;
   uword stack_base_;
   uword stack_limit_;
-  Thread* thread_;
+  ThreadState* thread_;
 
   // thread_list_lock_ cannot have a static lifetime because the order in which
   // destructors run is undefined. At the moment this lock cannot be deleted
@@ -274,7 +273,7 @@
   static bool creation_enabled_;
 
 #if defined(HAS_C11_THREAD_LOCAL)
-  static thread_local Thread* current_vm_thread_;
+  static thread_local ThreadState* current_vm_thread_;
 #endif
 
   friend class Isolate;  // to access set_thread(Thread*).
diff --git a/runtime/vm/os_thread_win.cc b/runtime/vm/os_thread_win.cc
index 5f75a32..56b5e2f 100644
--- a/runtime/vm/os_thread_win.cc
+++ b/runtime/vm/os_thread_win.cc
@@ -51,8 +51,6 @@
   uword parameter = data->parameter();
   delete data;
 
-  MonitorData::GetMonitorWaitDataForThread();
-
   // Create new OSThread object and set as TLS for new thread.
   OSThread* thread = OSThread::CreateOSThread();
   if (thread != NULL) {
@@ -63,9 +61,6 @@
     function(parameter);
   }
 
-  // Clean up the monitor wait data for this thread.
-  MonitorWaitData::ThreadExit();
-
   return 0;
 }
 
@@ -220,15 +215,7 @@
     : name_(name)
 #endif
 {
-  // Allocate unnamed semaphore with initial count 1 and max count 1.
-  data_.semaphore_ = CreateSemaphore(NULL, 1, 1, NULL);
-  if (data_.semaphore_ == NULL) {
-#if defined(PRODUCT)
-    FATAL1("Mutex allocation failed %d", GetLastError());
-#else
-    FATAL2("[%s] Mutex allocation failed %d", name_, GetLastError());
-#endif
-  }
+  InitializeSRWLock(&data_.lock_);
 #if defined(DEBUG)
   // When running with assertions enabled we do track the owner.
   owner_ = OSThread::kInvalidThreadId;
@@ -236,7 +223,6 @@
 }
 
 Mutex::~Mutex() {
-  CloseHandle(data_.semaphore_);
 #if defined(DEBUG)
   // When running with assertions enabled we do track the owner.
   ASSERT(owner_ == OSThread::kInvalidThreadId);
@@ -244,10 +230,7 @@
 }
 
 void Mutex::Lock() {
-  DWORD result = WaitForSingleObject(data_.semaphore_, INFINITE);
-  if (result != WAIT_OBJECT_0) {
-    FATAL1("Mutex lock failed %d", GetLastError());
-  }
+  AcquireSRWLockExclusive(&data_.lock_);
 #if defined(DEBUG)
   // When running with assertions enabled we do track the owner.
   owner_ = OSThread::GetCurrentThreadId();
@@ -255,19 +238,13 @@
 }
 
 bool Mutex::TryLock() {
-  // Attempt to pass the semaphore but return immediately.
-  DWORD result = WaitForSingleObject(data_.semaphore_, 0);
-  if (result == WAIT_OBJECT_0) {
+  if (TryAcquireSRWLockExclusive(&data_.lock_) != 0) {
 #if defined(DEBUG)
     // When running with assertions enabled we do track the owner.
     owner_ = OSThread::GetCurrentThreadId();
 #endif  // defined(DEBUG)
     return true;
   }
-  if (result == WAIT_ABANDONED || result == WAIT_FAILED) {
-    FATAL1("Mutex try lock failed %d", GetLastError());
-  }
-  ASSERT(result == WAIT_TIMEOUT);
   return false;
 }
 
@@ -277,20 +254,12 @@
   ASSERT(IsOwnedByCurrentThread());
   owner_ = OSThread::kInvalidThreadId;
 #endif  // defined(DEBUG)
-  BOOL result = ReleaseSemaphore(data_.semaphore_, 1, NULL);
-  if (result == 0) {
-    FATAL1("Mutex unlock failed %d", GetLastError());
-  }
+  ReleaseSRWLockExclusive(&data_.lock_);
 }
 
-ThreadLocalKey MonitorWaitData::monitor_wait_data_key_ = kUnsetThreadLocalKey;
-
 Monitor::Monitor() {
-  InitializeCriticalSection(&data_.cs_);
-  InitializeCriticalSection(&data_.waiters_cs_);
-  data_.waiters_head_ = NULL;
-  data_.waiters_tail_ = NULL;
-
+  InitializeSRWLock(&data_.lock_);
+  InitializeConditionVariable(&data_.cond_);
 #if defined(DEBUG)
   // When running with assertions enabled we track the owner.
   owner_ = OSThread::kInvalidThreadId;
@@ -302,27 +271,23 @@
   // When running with assertions enabled we track the owner.
   ASSERT(owner_ == OSThread::kInvalidThreadId);
 #endif  // defined(DEBUG)
-
-  DeleteCriticalSection(&data_.cs_);
-  DeleteCriticalSection(&data_.waiters_cs_);
 }
 
 bool Monitor::TryEnter() {
   // Attempt to pass the semaphore but return immediately.
-  BOOL result = TryEnterCriticalSection(&data_.cs_);
-  if (!result) {
-    return false;
-  }
+  if (TryAcquireSRWLockExclusive(&data_.lock_) != 0) {
 #if defined(DEBUG)
-  // When running with assertions enabled we do track the owner.
-  ASSERT(owner_ == OSThread::kInvalidThreadId);
-  owner_ = OSThread::GetCurrentThreadId();
+    // When running with assertions enabled we do track the owner.
+    ASSERT(owner_ == OSThread::kInvalidThreadId);
+    owner_ = OSThread::GetCurrentThreadId();
 #endif  // defined(DEBUG)
-  return true;
+    return true;
+  }
+  return false;
 }
 
 void Monitor::Enter() {
-  EnterCriticalSection(&data_.cs_);
+  AcquireSRWLockExclusive(&data_.lock_);
 
 #if defined(DEBUG)
   // When running with assertions enabled we track the owner.
@@ -338,130 +303,7 @@
   owner_ = OSThread::kInvalidThreadId;
 #endif  // defined(DEBUG)
 
-  LeaveCriticalSection(&data_.cs_);
-}
-
-void MonitorWaitData::ThreadExit() {
-  if (MonitorWaitData::monitor_wait_data_key_ != kUnsetThreadLocalKey) {
-    uword raw_wait_data =
-        OSThread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
-    // Clear in case this is called a second time.
-    OSThread::SetThreadLocal(MonitorWaitData::monitor_wait_data_key_, 0);
-    if (raw_wait_data != 0) {
-      MonitorWaitData* wait_data =
-          reinterpret_cast<MonitorWaitData*>(raw_wait_data);
-      delete wait_data;
-    }
-  }
-}
-
-void MonitorData::AddWaiter(MonitorWaitData* wait_data) {
-  // Add the MonitorWaitData object to the list of objects waiting for
-  // this monitor.
-  EnterCriticalSection(&waiters_cs_);
-  if (waiters_tail_ == NULL) {
-    ASSERT(waiters_head_ == NULL);
-    waiters_head_ = waiters_tail_ = wait_data;
-  } else {
-    waiters_tail_->next_ = wait_data;
-    waiters_tail_ = wait_data;
-  }
-  LeaveCriticalSection(&waiters_cs_);
-}
-
-void MonitorData::RemoveWaiter(MonitorWaitData* wait_data) {
-  // Remove the MonitorWaitData object from the list of objects
-  // waiting for this monitor.
-  EnterCriticalSection(&waiters_cs_);
-  MonitorWaitData* previous = NULL;
-  MonitorWaitData* current = waiters_head_;
-  while (current != NULL) {
-    if (current == wait_data) {
-      if (waiters_head_ == waiters_tail_) {
-        waiters_head_ = waiters_tail_ = NULL;
-      } else if (current == waiters_head_) {
-        waiters_head_ = waiters_head_->next_;
-      } else if (current == waiters_tail_) {
-        ASSERT(previous != NULL);
-        waiters_tail_ = previous;
-        previous->next_ = NULL;
-      } else {
-        ASSERT(previous != NULL);
-        previous->next_ = current->next_;
-      }
-      // Clear next.
-      wait_data->next_ = NULL;
-      break;
-    }
-    previous = current;
-    current = current->next_;
-  }
-  LeaveCriticalSection(&waiters_cs_);
-}
-
-void MonitorData::SignalAndRemoveFirstWaiter() {
-  EnterCriticalSection(&waiters_cs_);
-  MonitorWaitData* first = waiters_head_;
-  if (first != NULL) {
-    // Remove from list.
-    if (waiters_head_ == waiters_tail_) {
-      waiters_tail_ = waiters_head_ = NULL;
-    } else {
-      waiters_head_ = waiters_head_->next_;
-    }
-    // Clear next.
-    first->next_ = NULL;
-    // Signal event.
-    BOOL result = SetEvent(first->event_);
-    if (result == 0) {
-      FATAL1("Monitor::Notify failed to signal event %d", GetLastError());
-    }
-  }
-  LeaveCriticalSection(&waiters_cs_);
-}
-
-void MonitorData::SignalAndRemoveAllWaiters() {
-  EnterCriticalSection(&waiters_cs_);
-  // Extract list to signal.
-  MonitorWaitData* current = waiters_head_;
-  // Clear list.
-  waiters_head_ = waiters_tail_ = NULL;
-  // Iterate and signal all events.
-  while (current != NULL) {
-    // Copy next.
-    MonitorWaitData* next = current->next_;
-    // Clear next.
-    current->next_ = NULL;
-    // Signal event.
-    BOOL result = SetEvent(current->event_);
-    if (result == 0) {
-      FATAL1("Failed to set event for NotifyAll %d", GetLastError());
-    }
-    current = next;
-  }
-  LeaveCriticalSection(&waiters_cs_);
-}
-
-MonitorWaitData* MonitorData::GetMonitorWaitDataForThread() {
-  // Ensure that the thread local key for monitor wait data objects is
-  // initialized.
-  ASSERT(MonitorWaitData::monitor_wait_data_key_ != kUnsetThreadLocalKey);
-
-  // Get the MonitorWaitData object containing the event for this
-  // thread from thread local storage. Create it if it does not exist.
-  uword raw_wait_data =
-      OSThread::GetThreadLocal(MonitorWaitData::monitor_wait_data_key_);
-  MonitorWaitData* wait_data = NULL;
-  if (raw_wait_data == 0) {
-    HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
-    wait_data = new MonitorWaitData(event);
-    OSThread::SetThreadLocal(MonitorWaitData::monitor_wait_data_key_,
-                             reinterpret_cast<uword>(wait_data));
-  } else {
-    wait_data = reinterpret_cast<MonitorWaitData*>(raw_wait_data);
-    ASSERT(wait_data->next_ == NULL);
-  }
-  return wait_data;
+  ReleaseSRWLockExclusive(&data_.lock_);
 }
 
 Monitor::WaitResult Monitor::Wait(int64_t millis) {
@@ -473,60 +315,17 @@
 #endif  // defined(DEBUG)
 
   Monitor::WaitResult retval = kNotified;
-
-  // Get the wait data object containing the event to wait for.
-  MonitorWaitData* wait_data = MonitorData::GetMonitorWaitDataForThread();
-
-  // Start waiting by adding the MonitorWaitData to the list of
-  // waiters.
-  data_.AddWaiter(wait_data);
-
-  // Leave the monitor critical section while waiting.
-  LeaveCriticalSection(&data_.cs_);
-
-  // Perform the actual wait on the event.
-  DWORD result = WAIT_FAILED;
-  if (millis == 0) {
-    // Wait forever for a Notify or a NotifyAll event.
-    result = WaitForSingleObject(wait_data->event_, INFINITE);
-    if (result == WAIT_FAILED) {
-      FATAL1("Monitor::Wait failed %d", GetLastError());
-    }
+  if (millis == kNoTimeout) {
+    SleepConditionVariableSRW(&data_.cond_, &data_.lock_, INFINITE, 0);
   } else {
     // Wait for the given period of time for a Notify or a NotifyAll
     // event.
-    result = WaitForSingleObject(wait_data->event_, millis);
-    if (result == WAIT_FAILED) {
-      FATAL1("Monitor::Wait with timeout failed %d", GetLastError());
-    }
-    if (result == WAIT_TIMEOUT) {
-      // No longer waiting. Remove from the list of waiters.
-      data_.RemoveWaiter(wait_data);
-      // Caveat: wait_data->event_ might have been signaled between
-      // WaitForSingleObject and RemoveWaiter because we are not in any critical
-      // section here. Leaving it in a signaled state would break invariants
-      // that Monitor::Wait code relies on. We assume that when
-      // WaitForSingleObject(wait_data->event_, ...) returns successfully then
-      // corresponding wait_data is not on the waiters list anymore.
-      // This is guaranteed because we only signal these events from
-      // SignalAndRemoveAllWaiters/SignalAndRemoveFirstWaiter which
-      // simultaneously remove MonitorWaitData from the list.
-      // Now imagine that wait_data->event_ is left signaled here. In this case
-      // the next WaitForSingleObject(wait_data->event_, ...) will immediately
-      // return while wait_data is still on the waiters list. This would
-      // leave waiters list in the inconsistent state.
-      // To prevent this from happening simply reset the event.
-      // Note: wait_data is no longer on the waiters list so it can't be
-      // signaled anymore at this point so there is no race possible from
-      // this point onward.
-      ResetEvent(wait_data->event_);
+    if (!SleepConditionVariableSRW(&data_.cond_, &data_.lock_, millis, 0)) {
+      ASSERT(GetLastError() == ERROR_TIMEOUT);
       retval = kTimedOut;
     }
   }
 
-  // Reacquire the monitor critical section before continuing.
-  EnterCriticalSection(&data_.cs_);
-
 #if defined(DEBUG)
   // When running with assertions enabled we track the owner.
   ASSERT(owner_ == OSThread::kInvalidThreadId);
@@ -551,18 +350,13 @@
 void Monitor::Notify() {
   // When running with assertions enabled we track the owner.
   ASSERT(IsOwnedByCurrentThread());
-  data_.SignalAndRemoveFirstWaiter();
+  WakeConditionVariable(&data_.cond_);
 }
 
 void Monitor::NotifyAll() {
   // When running with assertions enabled we track the owner.
   ASSERT(IsOwnedByCurrentThread());
-  // If one of the objects in the list of waiters wakes because of a
-  // timeout before we signal it, that object will get an extra
-  // signal. This will be treated as a spurious wake-up and is OK
-  // since all uses of monitors should recheck the condition after a
-  // Wait.
-  data_.SignalAndRemoveAllWaiters();
+  WakeAllConditionVariable(&data_.cond_);
 }
 
 void ThreadLocalData::AddThreadLocal(ThreadLocalKey key,
@@ -677,7 +471,6 @@
   // and on W2K and W2K3. So don't assume it is sent.
   if (DLL_THREAD_DETACH == reason || DLL_PROCESS_DETACH == reason) {
     dart::ThreadLocalData::RunDestructors();
-    dart::MonitorWaitData::ThreadExit();
   }
 }
 
diff --git a/runtime/vm/os_thread_win.h b/runtime/vm/os_thread_win.h
index 24f4031..8e1e917 100644
--- a/runtime/vm/os_thread_win.h
+++ b/runtime/vm/os_thread_win.h
@@ -44,7 +44,7 @@
   MutexData() {}
   ~MutexData() {}
 
-  HANDLE semaphore_;
+  SRWLOCK lock_;
 
   friend class Mutex;
 
@@ -52,64 +52,15 @@
   DISALLOW_COPY_AND_ASSIGN(MutexData);
 };
 
-class MonitorWaitData {
- public:
-  static void ThreadExit();
-
- private:
-  explicit MonitorWaitData(HANDLE event) : event_(event), next_(NULL) {}
-  ~MonitorWaitData() {
-    CloseHandle(event_);
-    ASSERT(next_ == NULL);
-  }
-
-  // ThreadLocalKey used to fetch and store the MonitorWaitData object
-  // for a given thread.
-  static ThreadLocalKey monitor_wait_data_key_;
-
-  // Auto-reset event used for waiting.
-  HANDLE event_;
-  // Link to next element in the singly-linked list of waiters.
-  MonitorWaitData* next_;
-
-  friend class Monitor;
-  friend class MonitorData;
-  friend class OS;
-
-  DISALLOW_COPY_AND_ASSIGN(MonitorWaitData);
-};
-
 class MonitorData {
  private:
   MonitorData() {}
   ~MonitorData() {}
 
-  // Helper methods to manipulate the list of waiters for this
-  // monitor.
-  void AddWaiter(MonitorWaitData* wait_data);
-  void RemoveWaiter(MonitorWaitData* wait_data);
-  void SignalAndRemoveFirstWaiter();
-  void SignalAndRemoveAllWaiters();
-  static MonitorWaitData* GetMonitorWaitDataForThread();
-
-  // The external critical section for the monitor.
-  CRITICAL_SECTION cs_;
-
-  // Condition variables are only available since Windows Vista. To
-  // support at least Windows XP, we implement our own condition
-  // variables using SetEvent on Event objects.
-
-  // Singly-linked list of event objects, one for each thread waiting
-  // on this monitor. New waiters are added at the end of the list.
-  // Notify signals the first element of the list (FIFO
-  // order). NotifyAll, signals all the elements of the list.
-  CRITICAL_SECTION waiters_cs_;
-  MonitorWaitData* waiters_head_;
-  MonitorWaitData* waiters_tail_;
+  SRWLOCK lock_;
+  CONDITION_VARIABLE cond_;
 
   friend class Monitor;
-  friend class OS;
-  friend unsigned int __stdcall ThreadEntry(void* data_ptr);
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(MonitorData);
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index d01ccf9..885009c 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -79,7 +79,7 @@
                                          : zone_information.StandardName;
   intptr_t utf8_len =
       WideCharToMultiByte(CP_UTF8, 0, wchar_name, -1, NULL, 0, NULL, NULL);
-  char* name = Thread::Current()->zone()->Alloc<char>(utf8_len + 1);
+  char* name = ThreadState::Current()->zone()->Alloc<char>(utf8_len + 1);
   WideCharToMultiByte(CP_UTF8, 0, wchar_name, -1, name, utf8_len, NULL, NULL);
   name[utf8_len] = '\0';
   return name;
@@ -287,6 +287,8 @@
   int i = 0;
   if (str[0] == '-') {
     i = 1;
+  } else if (str[0] == '+') {
+    i = 1;
   }
   if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') &&
       (str[i + 2] != '\0')) {
@@ -321,8 +323,6 @@
   // Do not pop up a message box when abort is called.
   _set_abort_behavior(0, _WRITE_ABORT_MSG);
   ThreadLocalData::Init();
-  MonitorWaitData::monitor_wait_data_key_ = OSThread::CreateThreadLocal();
-  MonitorData::GetMonitorWaitDataForThread();
   LARGE_INTEGER ticks_per_sec;
   if (!QueryPerformanceFrequency(&ticks_per_sec)) {
     qpc_ticks_per_second = 0;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 199d018..ad1c9b0 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -31,7 +31,6 @@
 #include "vm/os.h"
 #include "vm/regexp_assembler.h"
 #include "vm/resolver.h"
-#include "vm/scanner.h"
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
@@ -75,8 +74,7 @@
                     Symbols::CurrentContextVar(), Object::dynamic_type());
   current_context_var_ = temp;
 
-  const bool reify_generic_argument =
-      function.IsGeneric() && FLAG_reify_generic_functions;
+  const bool reify_generic_argument = function.IsGeneric();
 
   const bool load_optional_arguments = function.HasOptionalParameters();
 
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 7ca6fa3..482dac0 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -515,12 +515,8 @@
   ProfilerDartStackWalker(Thread* thread,
                           Sample* sample,
                           SampleBuffer* sample_buffer,
-                          uword stack_lower,
-                          uword stack_upper,
                           uword pc,
                           uword fp,
-                          uword sp,
-                          bool exited_dart_code,
                           bool allocation_sample,
                           intptr_t skip_count = 0)
       : ProfilerStackWalker((thread->isolate() != NULL)
@@ -529,181 +525,167 @@
                             sample,
                             sample_buffer,
                             skip_count),
+        thread_(thread),
         pc_(reinterpret_cast<uword*>(pc)),
-        fp_(reinterpret_cast<uword*>(fp)),
-        sp_(reinterpret_cast<uword*>(sp)),
-        stack_upper_(stack_upper),
-        stack_lower_(stack_lower),
-        has_exit_frame_(exited_dart_code) {
-    if (exited_dart_code) {
-// On Windows and Fuchsia the profiler does not run on the thread being
-// profiled.
-#if defined(HOST_OS_WINDOWS) || defined(HOST_OS_FUCHSIA)
-      const StackFrameIterator::CrossThreadPolicy cross_thread_policy =
-          StackFrameIterator::kAllowCrossThreadIteration;
+        fp_(reinterpret_cast<uword*>(fp)) {}
+
+  bool IsInterpretedFrame(uword* fp) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+    return false;
 #else
-      const StackFrameIterator::CrossThreadPolicy cross_thread_policy =
-          StackFrameIterator::kNoCrossThreadIteration;
+    Interpreter* interpreter = thread_->interpreter();
+    if (interpreter == nullptr) return false;
+    return interpreter->HasFrame(reinterpret_cast<uword>(fp));
 #endif
-      StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames, thread,
-                                  cross_thread_policy);
-      pc_ = NULL;
-      fp_ = NULL;
-      sp_ = NULL;
-      if (!iterator.HasNextFrame()) {
-        return;
-      }
-      // Ensure we are able to get to the exit frame.
-      StackFrame* frame = iterator.NextFrame();
-      if (!frame->IsExitFrame()) {
-        return;
-      }
-      // Skip the exit frame.
-      if (!iterator.HasNextFrame()) {
-        return;
-      }
-      frame = iterator.NextFrame();
-      // Record frame details of the first frame from which we start walking.
-      pc_ = reinterpret_cast<uword*>(frame->pc());
-      fp_ = reinterpret_cast<uword*>(frame->fp());
-      sp_ = reinterpret_cast<uword*>(frame->sp());
-      is_interpreted_frame_ = frame->is_interpreted();
-    }
   }
 
   void walk() {
-    sample_->set_exit_frame_sample(has_exit_frame_);
-    if (!ValidFramePointer()) {
+    RELEASE_ASSERT(StubCode::HasBeenInitialized());
+    if (thread_->isolate()->IsDeoptimizing()) {
       sample_->set_ignore_sample(true);
       return;
     }
-    ASSERT(ValidFramePointer());
-    uword return_pc = InitialReturnAddress();
-    if (StubCode::InInvocationStub(return_pc, is_interpreted_frame_)) {
-      // Edge case- we have called out from the Invocation Stub but have not
-      // created the stack frame of the callee. Attempt to locate the exit
-      // frame before walking the stack.
-      if (!NextExit() || !ValidFramePointer()) {
-        // Nothing to sample.
-        sample_->set_ignore_sample(true);
-        return;
+
+    uword* exit_fp = reinterpret_cast<uword*>(thread_->top_exit_frame_info());
+    bool in_interpreted_frame;
+    bool has_exit_frame = exit_fp != 0;
+    if (has_exit_frame) {
+      if (IsInterpretedFrame(exit_fp)) {
+        // Exited from interpreter.
+        pc_ = 0;
+        fp_ = exit_fp;
+        in_interpreted_frame = true;
+        RELEASE_ASSERT(IsInterpretedFrame(fp_));
+      } else {
+        // Exited from compiled code.
+        pc_ = 0;
+        fp_ = exit_fp;
+        in_interpreted_frame = false;
+      }
+
+      // Skip exit frame.
+      pc_ = CallerPC(in_interpreted_frame);
+      fp_ = CallerFP(in_interpreted_frame);
+
+      // Can only move between interpreted and compiled frames after an exit
+      // frame.
+      RELEASE_ASSERT(IsInterpretedFrame(fp_) == in_interpreted_frame);
+    } else {
+      if (thread_->vm_tag() == VMTag::kDartCompiledTagId) {
+        // Running compiled code.
+        // Use the FP and PC from the thread interrupt or simulator; already set
+        // in the constructor.
+        in_interpreted_frame = false;
+      } else if (thread_->vm_tag() == VMTag::kDartInterpretedTagId) {
+        // Running interpreter.
+#if defined(DART_PRECOMPILED_RUNTIME)
+        UNREACHABLE();
+#else
+        pc_ = reinterpret_cast<uword*>(thread_->interpreter()->get_pc());
+        fp_ = reinterpret_cast<uword*>(thread_->interpreter()->get_fp());
+#endif
+        in_interpreted_frame = true;
+        RELEASE_ASSERT(IsInterpretedFrame(fp_));
+      } else {
+        // No Dart on the stack; caller shouldn't use this walker.
+        UNREACHABLE();
       }
     }
-    while (true) {
+
+    sample_->set_exit_frame_sample(has_exit_frame);
+
+    if (!has_exit_frame && !in_interpreted_frame &&
+        (CallerPC(in_interpreted_frame) == EntryMarker(in_interpreted_frame))) {
+      // During the prologue of a function, CallerPC will return the caller's
+      // caller. For most frames, the missing PC will be added during profile
+      // processing. However, during this stack walk, it can cause us to fail
+      // to identify the entry frame and lead the stack walk into the weeds.
+      // Do not continue the stalk walk since this might be a false positive
+      // from a Smi or unboxed value.
+      RELEASE_ASSERT(!has_exit_frame);
+      sample_->set_ignore_sample(true);
+      return;
+    }
+
+    for (;;) {
+      // Skip entry frame.
+      if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_),
+                                     in_interpreted_frame)) {
+        pc_ = 0;
+        fp_ = ExitLink(in_interpreted_frame);
+        if (fp_ == 0) {
+          break;  // End of Dart stack.
+        }
+        in_interpreted_frame = IsInterpretedFrame(fp_);
+
+        // Skip exit frame.
+        pc_ = CallerPC(in_interpreted_frame);
+        fp_ = CallerFP(in_interpreted_frame);
+
+        // At least one frame between exit and next entry frame.
+        RELEASE_ASSERT(!StubCode::InInvocationStub(reinterpret_cast<uword>(pc_),
+                                                   in_interpreted_frame));
+      }
+
       if (!Append(reinterpret_cast<uword>(pc_))) {
-        return;
+        break;  // Sample is full.
       }
-      if (!Next()) {
-        return;
-      }
+
+      pc_ = CallerPC(in_interpreted_frame);
+      fp_ = CallerFP(in_interpreted_frame);
+
+      // Can only move between interpreted and compiled frames after an exit
+      // frame.
+      RELEASE_ASSERT(IsInterpretedFrame(fp_) == in_interpreted_frame);
     }
   }
 
  private:
-  bool Next() {
-    if (!ValidFramePointer()) {
-      return false;
-    }
-    if (StubCode::InInvocationStub(reinterpret_cast<uword>(pc_),
-                                   is_interpreted_frame_)) {
-      // In invocation stub.
-      return NextExit();
-    }
-    // In regular Dart frame.
-    uword* new_pc = CallerPC();
-    // Check if we've moved into the invocation stub.
-    if (StubCode::InInvocationStub(reinterpret_cast<uword>(new_pc),
-                                   is_interpreted_frame_)) {
-      // New PC is inside invocation stub, skip.
-      return NextExit();
-    }
-    uword* new_fp = CallerFP();
-    if (!IsCalleeFrameOf(reinterpret_cast<uword>(new_fp),
-                         reinterpret_cast<uword>(fp_))) {
-      // FP didn't move to a caller (higher address on most architectures).
-      return false;
-    }
-    // Success, update fp and pc.
-    fp_ = new_fp;
-    pc_ = new_pc;
-    return true;
-  }
-
-  bool NextExit() {
-    if (!ValidFramePointer()) {
-      return false;
-    }
-    uword* new_fp = ExitLink();
-    if (new_fp == NULL) {
-      // No exit link.
-      return false;
-    }
-    if (new_fp <= fp_) {
-      // FP didn't move to a higher address.
-      return false;
-    }
-    if (!ValidFramePointer(new_fp)) {
-      return false;
-    }
-    // Success, update fp and pc.
-    fp_ = new_fp;
-    pc_ = CallerPC();
-    return true;
-  }
-
-  uword InitialReturnAddress() const {
-    ASSERT(sp_ != NULL);
-    // MSan/ASan are unaware of frames initialized by generated code.
-    MSAN_UNPOISON(sp_, kWordSize);
-    ASAN_UNPOISON(sp_, kWordSize);
-    return *(sp_);
-  }
-
-  uword* CallerPC() const {
+  uword* CallerPC(bool interp) const {
     ASSERT(fp_ != NULL);
-    uword* caller_pc_ptr = fp_ + kSavedCallerPcSlotFromFp;
+    uword* caller_pc_ptr =
+        fp_ + (interp ? kKBCSavedCallerPcSlotFromFp : kSavedCallerPcSlotFromFp);
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(caller_pc_ptr, kWordSize);
     ASAN_UNPOISON(caller_pc_ptr, kWordSize);
     return reinterpret_cast<uword*>(*caller_pc_ptr);
   }
 
-  uword* CallerFP() const {
+  uword* CallerFP(bool interp) const {
     ASSERT(fp_ != NULL);
-    uword* caller_fp_ptr = fp_ + kSavedCallerFpSlotFromFp;
+    uword* caller_fp_ptr =
+        fp_ + (interp ? kKBCSavedCallerFpSlotFromFp : kSavedCallerFpSlotFromFp);
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(caller_fp_ptr, kWordSize);
     ASAN_UNPOISON(caller_fp_ptr, kWordSize);
     return reinterpret_cast<uword*>(*caller_fp_ptr);
   }
 
-  uword* ExitLink() const {
+  uword* ExitLink(bool interp) const {
     ASSERT(fp_ != NULL);
-    uword* exit_link_ptr = fp_ + kExitLinkSlotFromEntryFp;
+    uword* exit_link_ptr =
+        fp_ + (interp ? kKBCExitLinkSlotFromEntryFp : kExitLinkSlotFromEntryFp);
     // MSan/ASan are unaware of frames initialized by generated code.
     MSAN_UNPOISON(exit_link_ptr, kWordSize);
     ASAN_UNPOISON(exit_link_ptr, kWordSize);
     return reinterpret_cast<uword*>(*exit_link_ptr);
   }
 
-  bool ValidFramePointer() const { return ValidFramePointer(fp_); }
-
-  bool ValidFramePointer(uword* fp) const {
-    if (fp == NULL) {
-      return false;
-    }
-    uword cursor = reinterpret_cast<uword>(fp);
-    cursor += sizeof(fp);
-    return (cursor >= stack_lower_) && (cursor < stack_upper_);
+  // Note because of stack guards, it is important that this marker lives
+  // above FP.
+  uword* EntryMarker(bool interp) const {
+    ASSERT(!interp);
+    ASSERT(fp_ != NULL);
+    uword* entry_marker_ptr = fp_ + kSavedCallerPcSlotFromFp + 1;
+    // MSan/ASan are unaware of frames initialized by generated code.
+    MSAN_UNPOISON(entry_marker_ptr, kWordSize);
+    ASAN_UNPOISON(entry_marker_ptr, kWordSize);
+    return reinterpret_cast<uword*>(*entry_marker_ptr);
   }
 
+  Thread* const thread_;
   uword* pc_;
   uword* fp_;
-  uword* sp_;
-  bool is_interpreted_frame_;
-  const uword stack_upper_;
-  const uword stack_lower_;
-  bool has_exit_frame_;
 };
 
 // If the VM is compiled without frame pointers (which is the default on
@@ -712,7 +694,8 @@
 //
 class ProfilerNativeStackWalker : public ProfilerStackWalker {
  public:
-  ProfilerNativeStackWalker(Dart_Port port_id,
+  ProfilerNativeStackWalker(ProfilerCounters* counters,
+                            Dart_Port port_id,
                             Sample* sample,
                             SampleBuffer* sample_buffer,
                             uword stack_lower,
@@ -727,6 +710,7 @@
                             sample_buffer,
                             skip_count,
                             try_symbolize_dart_frames),
+        counters_(counters),
         stack_upper_(stack_upper),
         original_pc_(pc),
         original_fp_(fp),
@@ -746,10 +730,14 @@
     if (gap >= kMaxStep) {
       // Gap between frame pointer and stack pointer is
       // too large.
+      AtomicOperations::IncrementInt64By(&counters_->incomplete_sample_fp_step,
+                                         1);
       return;
     }
 
     if (!ValidFramePointer(fp)) {
+      AtomicOperations::IncrementInt64By(
+          &counters_->incomplete_sample_fp_bounds, 1);
       return;
     }
 
@@ -768,17 +756,23 @@
 
       if (fp <= previous_fp) {
         // Frame pointer did not move to a higher address.
+        AtomicOperations::IncrementInt64By(
+            &counters_->incomplete_sample_fp_step, 1);
         return;
       }
 
       gap = fp - previous_fp;
       if (gap >= kMaxStep) {
         // Frame pointer step is too large.
+        AtomicOperations::IncrementInt64By(
+            &counters_->incomplete_sample_fp_step, 1);
         return;
       }
 
       if (!ValidFramePointer(fp)) {
         // Frame pointer is outside of isolate stack boundary.
+        AtomicOperations::IncrementInt64By(
+            &counters_->incomplete_sample_fp_bounds, 1);
         return;
       }
 
@@ -788,6 +782,8 @@
         // the pc is so large that adding one to it will cause an
         // overflow it is invalid and it will cause headaches later
         // while we are building the profile.  Discard it.
+        AtomicOperations::IncrementInt64By(&counters_->incomplete_sample_bad_pc,
+                                           1);
         return;
       }
 
@@ -825,6 +821,7 @@
     return r;
   }
 
+  ProfilerCounters* const counters_;
   const uword stack_upper_;
   const uword original_pc_;
   const uword original_fp_;
@@ -1114,8 +1111,11 @@
 
   OSThread* os_thread = OSThread::Current();
   ASSERT(os_thread != NULL);
-  OS::PrintErr("Dumping native stack trace for thread %" Px "\n",
-               OSThread::ThreadIdToIntPtr(os_thread->trace_id()));
+  Isolate* isolate = Isolate::Current();
+  const char* name = isolate == NULL ? NULL : isolate->name();
+  OS::PrintErr("thread=%" Pd ", isolate=%s(%p)\n",
+               OSThread::ThreadIdToIntPtr(os_thread->trace_id()), name,
+               isolate);
 
   if (!InitialRegisterCheck(pc, fp, sp)) {
     OS::PrintErr("Stack dump aborted because InitialRegisterCheck failed.\n");
@@ -1133,7 +1133,8 @@
   }
 
   ProfilerNativeStackWalker native_stack_walker(
-      ILLEGAL_PORT, NULL, NULL, stack_lower, stack_upper, pc, fp, sp,
+      &counters_, ILLEGAL_PORT, NULL, NULL, stack_lower, stack_upper, pc, fp,
+      sp,
       /*skip_count=*/0,
       /*try_symbolize_dart_frames=*/!for_crash);
   native_stack_walker.walk();
@@ -1181,13 +1182,12 @@
 
   if (FLAG_profile_vm_allocation) {
     ProfilerNativeStackWalker native_stack_walker(
-        (isolate != NULL) ? isolate->main_port() : ILLEGAL_PORT, sample,
-        sample_buffer, stack_lower, stack_upper, pc, fp, sp);
+        &counters_, (isolate != NULL) ? isolate->main_port() : ILLEGAL_PORT,
+        sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp);
     native_stack_walker.walk();
   } else if (exited_dart_code) {
     ProfilerDartStackWalker dart_exit_stack_walker(
-        thread, sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp,
-        exited_dart_code, true);
+        thread, sample, sample_buffer, pc, fp, /* allocation_sample*/ true);
     dart_exit_stack_walker.walk();
   } else {
     // Fall back.
@@ -1244,8 +1244,8 @@
   sample->set_native_allocation_size_bytes(allocation_size);
 
   ProfilerNativeStackWalker native_stack_walker(
-      ILLEGAL_PORT, sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp,
-      skip_count);
+      &counters_, ILLEGAL_PORT, sample, sample_buffer, stack_lower, stack_upper,
+      pc, fp, sp, skip_count);
 
   native_stack_walker.walk();
 
@@ -1383,12 +1383,11 @@
   }
 
   ProfilerNativeStackWalker native_stack_walker(
-      (isolate != NULL) ? isolate->main_port() : ILLEGAL_PORT, sample,
-      sample_buffer, stack_lower, stack_upper, pc, fp, sp);
+      &counters_, (isolate != NULL) ? isolate->main_port() : ILLEGAL_PORT,
+      sample, sample_buffer, stack_lower, stack_upper, pc, fp, sp);
   const bool exited_dart_code = thread->HasExitedDartCode();
-  ProfilerDartStackWalker dart_stack_walker(thread, sample, sample_buffer,
-                                            stack_lower, stack_upper, pc, fp,
-                                            sp, exited_dart_code, false);
+  ProfilerDartStackWalker dart_stack_walker(thread, sample, sample_buffer, pc,
+                                            fp, /* allocation_sample*/ false);
 
   // All memory access is done inside CollectSample.
   CollectSample(isolate, exited_dart_code, in_dart_code, sample,
@@ -1396,9 +1395,7 @@
                 &counters_);
 }
 
-CodeDescriptor::CodeDescriptor(const Code& code) : code_(code) {
-  ASSERT(!code_.IsNull());
-}
+CodeDescriptor::CodeDescriptor(const AbstractCode code) : code_(code) {}
 
 uword CodeDescriptor::Start() const {
   return code_.PayloadStart();
@@ -1425,15 +1422,10 @@
   ~CodeLookupTableBuilder() {}
 
   void VisitObject(RawObject* raw_obj) {
-    uint32_t tags = raw_obj->ptr()->tags_;
-    if (RawObject::ClassIdTag::decode(tags) == kCodeCid) {
-      RawCode* raw_code = reinterpret_cast<RawCode*>(raw_obj);
-      const Code& code = Code::Handle(raw_code);
-      ASSERT(!code.IsNull());
-      const Instructions& instructions =
-          Instructions::Handle(code.instructions());
-      ASSERT(!instructions.IsNull());
-      table_->Add(code);
+    if (raw_obj->IsCode()) {
+      table_->Add(Code::Handle(Code::RawCast(raw_obj)));
+    } else if (raw_obj->IsBytecode()) {
+      table_->Add(Bytecode::Handle(Bytecode::RawCast(raw_obj)));
     }
   }
 
@@ -1482,9 +1474,10 @@
 #endif
 }
 
-void CodeLookupTable::Add(const Code& code) {
+void CodeLookupTable::Add(const Object& code) {
   ASSERT(!code.IsNull());
-  CodeDescriptor* cd = new CodeDescriptor(code);
+  ASSERT(code.IsCode() || code.IsBytecode());
+  CodeDescriptor* cd = new CodeDescriptor(AbstractCode(code.raw()));
   code_objects_.Add(cd);
 }
 
@@ -1659,7 +1652,12 @@
                                                uword pc_marker,
                                                uword* stack_buffer) {
   ASSERT(cd != NULL);
-  const Code& code = Code::Handle(cd->code());
+  if (cd->code().IsBytecode()) {
+    // Bytecode frame build is atomic from the profiler's perspective: no
+    // missing frame.
+    return;
+  }
+  const Code& code = Code::Handle(Code::RawCast(cd->code().raw()));
   ASSERT(!code.IsNull());
   // Some stubs (and intrinsics) do not push a frame onto the stack leaving
   // the frame pointer in the caller.
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 951abed..7ac6741 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -30,22 +30,26 @@
 class SampleBuffer;
 class ProfileTrieNode;
 
+#define PROFILER_COUNTERS(V)                                                   \
+  V(bail_out_unknown_task)                                                     \
+  V(bail_out_jump_to_exception_handler)                                        \
+  V(bail_out_check_isolate)                                                    \
+  V(single_frame_sample_deoptimizing)                                          \
+  V(single_frame_sample_register_check)                                        \
+  V(single_frame_sample_get_and_validate_stack_bounds)                         \
+  V(stack_walker_native)                                                       \
+  V(stack_walker_dart_exit)                                                    \
+  V(stack_walker_dart)                                                         \
+  V(stack_walker_none)                                                         \
+  V(incomplete_sample_fp_bounds)                                               \
+  V(incomplete_sample_fp_step)                                                 \
+  V(incomplete_sample_bad_pc)                                                  \
+  V(failure_native_allocation_sample)
+
 struct ProfilerCounters {
-  // Count of bail out reasons:
-  ALIGN8 int64_t bail_out_unknown_task;
-  ALIGN8 int64_t bail_out_jump_to_exception_handler;
-  ALIGN8 int64_t bail_out_check_isolate;
-  // Count of single frame sampling reasons:
-  ALIGN8 int64_t single_frame_sample_deoptimizing;
-  ALIGN8 int64_t single_frame_sample_register_check;
-  ALIGN8 int64_t single_frame_sample_get_and_validate_stack_bounds;
-  // Count of stack walkers used:
-  ALIGN8 int64_t stack_walker_native;
-  ALIGN8 int64_t stack_walker_dart_exit;
-  ALIGN8 int64_t stack_walker_dart;
-  ALIGN8 int64_t stack_walker_none;
-  // Count of failed checks:
-  ALIGN8 int64_t failure_native_allocation_sample;
+#define DECLARE_PROFILER_COUNTER(name) ALIGN8 int64_t name;
+  PROFILER_COUNTERS(DECLARE_PROFILER_COUNTER)
+#undef DECLARE_PROFILER_COUNTER
 };
 
 class Profiler : public AllStatic {
@@ -434,10 +438,83 @@
   }
 };
 
+class AbstractCode {
+ public:
+  explicit AbstractCode(RawObject* code) : code_(Object::Handle(code)) {
+    ASSERT(code_.IsNull() || code_.IsCode() || code_.IsBytecode());
+  }
+
+  RawObject* raw() const { return code_.raw(); }
+  const Object* handle() const { return &code_; }
+
+  uword PayloadStart() const {
+    if (code_.IsCode()) {
+      return Code::Cast(code_).PayloadStart();
+    } else {
+      return Bytecode::Cast(code_).PayloadStart();
+    }
+  }
+
+  uword Size() const {
+    if (code_.IsCode()) {
+      return Code::Cast(code_).Size();
+    } else {
+      return Bytecode::Cast(code_).Size();
+    }
+  }
+
+  int64_t compile_timestamp() const {
+    if (code_.IsCode()) {
+      return Code::Cast(code_).compile_timestamp();
+    } else {
+      return 0;
+    }
+  }
+
+  const char* Name() const {
+    if (code_.IsCode()) {
+      return Code::Cast(code_).Name();
+    } else {
+      return Bytecode::Cast(code_).Name();
+    }
+  }
+
+  const char* QualifiedName() const {
+    if (code_.IsCode()) {
+      return Code::Cast(code_).QualifiedName();
+    } else {
+      return Bytecode::Cast(code_).QualifiedName();
+    }
+  }
+
+  RawObject* owner() const {
+    if (code_.IsCode()) {
+      return Code::Cast(code_).owner();
+    } else {
+      return Bytecode::Cast(code_).function();
+    }
+  }
+
+  bool IsNull() const { return code_.IsNull(); }
+  bool IsCode() const { return code_.IsCode(); }
+  bool IsBytecode() const { return code_.IsBytecode(); }
+
+  bool is_optimized() const {
+    if (code_.IsCode()) {
+      return Code::Cast(code_).is_optimized();
+    } else {
+      return false;
+    }
+  }
+
+ private:
+  const Object& code_;
+};
+
 // A Code object descriptor.
 class CodeDescriptor : public ZoneAllocated {
  public:
-  explicit CodeDescriptor(const Code& code);
+  explicit CodeDescriptor(const AbstractCode code);
 
   uword Start() const;
 
@@ -445,7 +522,7 @@
 
   int64_t CompileTimestamp() const;
 
-  RawCode* code() const { return code_.raw(); }
+  const AbstractCode code() const { return code_; }
 
   const char* Name() const { return code_.Name(); }
 
@@ -471,7 +548,7 @@
   }
 
  private:
-  const Code& code_;
+  const AbstractCode code_;
 
   DISALLOW_COPY_AND_ASSIGN(CodeDescriptor);
 };
@@ -492,7 +569,7 @@
  private:
   void Build(Thread* thread);
 
-  void Add(const Code& code);
+  void Add(const Object& code);
 
   // Code objects sorted by entry.
   ZoneGrowableArray<CodeDescriptor*> code_objects_;
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 856df68..4251002 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -272,7 +272,7 @@
                          uword start,
                          uword end,
                          int64_t timestamp,
-                         const Code& code)
+                         const AbstractCode code)
     : kind_(kind),
       start_(start),
       end_(end),
@@ -482,7 +482,7 @@
   obj.AddProperty("exclusiveTicks", exclusive_ticks());
   if (kind() == kDartCode) {
     ASSERT(!code_.IsNull());
-    obj.AddProperty("code", code_);
+    obj.AddProperty("code", *code_.handle());
   } else if (kind() == kCollectedCode) {
     PrintCollectedCode(&obj);
   } else if (kind() == kReusedCode) {
@@ -626,7 +626,19 @@
   } else if (kind() == kNativeCode) {
     if (name() == NULL) {
       // Lazily set generated name.
-      GenerateAndSetSymbolName("[Native]");
+      const intptr_t kBuffSize = 512;
+      char buff[kBuffSize];
+      uword dso_base;
+      char* dso_name;
+      if (NativeSymbolResolver::LookupSharedObject(start(), &dso_base,
+                                                   &dso_name)) {
+        uword dso_offset = start() - dso_base;
+        Utils::SNPrint(&buff[0], kBuffSize - 1, "[Native] %s+0x%" Px, dso_name,
+                       dso_offset);
+      } else {
+        Utils::SNPrint(&buff[0], kBuffSize - 1, "[Native] %" Px, start());
+      }
+      SetName(buff);
     }
     function = table->AddNative(start(), name());
   } else if (kind() == kTagCode) {
@@ -1184,7 +1196,7 @@
         extra_tags_(extra_tags),
         profile_(profile),
         deoptimized_code_(new DeoptimizedCodeSet(thread->isolate())),
-        null_code_(Code::ZoneHandle()),
+        null_code_(Code::null()),
         null_function_(Function::ZoneHandle()),
         tick_functions_(false),
         inclusive_tree_(false),
@@ -1276,8 +1288,7 @@
     for (intptr_t i = 0; i < code_lookup_table.length(); i++) {
       const CodeDescriptor* descriptor = code_lookup_table.At(i);
       ASSERT(descriptor != NULL);
-      const Code& code = Code::Handle(descriptor->code());
-      ASSERT(!code.IsNull());
+      const AbstractCode code = descriptor->code();
       RegisterLiveProfileCode(new ProfileCode(
           ProfileCode::kDartCode, code.PayloadStart(),
           code.PayloadStart() + code.Size(), code.compile_timestamp(), code));
@@ -1414,7 +1425,6 @@
       }
 
       // Walk the sampled PCs.
-      Code& code = Code::Handle();
       for (intptr_t frame_index = sample->length() - 1; frame_index >= 0;
            frame_index--) {
         ASSERT(sample->At(frame_index) != 0);
@@ -1424,7 +1434,7 @@
         ProfileCode* profile_code =
             GetProfileCode(sample->At(frame_index), sample->timestamp());
         ASSERT(profile_code->code_table_index() == index);
-        code ^= profile_code->code();
+        const AbstractCode code = profile_code->code();
         current = AppendKind(code, current, sample);
         current = current->GetChild(index);
         current->Tick(sample, (frame_index == 0));
@@ -1457,7 +1467,6 @@
       }
 
       // Walk the sampled PCs.
-      Code& code = Code::Handle();
       for (intptr_t frame_index = 0; frame_index < sample->length();
            frame_index++) {
         ASSERT(sample->At(frame_index) != 0);
@@ -1467,7 +1476,7 @@
         ProfileCode* profile_code =
             GetProfileCode(sample->At(frame_index), sample->timestamp());
         ASSERT(profile_code->code_table_index() == index);
-        code ^= profile_code->code();
+        const AbstractCode code = profile_code->code();
         current = current->GetChild(index);
         if (ShouldTickNode(sample, frame_index)) {
           current->Tick(sample, (frame_index == 0));
@@ -1580,7 +1589,12 @@
     ASSERT(function != NULL);
     const intptr_t code_index = profile_code->code_table_index();
     ASSERT(profile_code != NULL);
-    const Code& code = Code::ZoneHandle(profile_code->code());
+    Code& code = Code::ZoneHandle();
+    if (profile_code->code().IsCode()) {
+      code ^= profile_code->code().raw();
+    } else {
+      // No inlining in bytecode.
+    }
     GrowableArray<const Function*>* inlined_functions = NULL;
     GrowableArray<TokenPosition>* inlined_token_positions = NULL;
     TokenPosition token_position = TokenPosition::kNoSource;
@@ -1834,7 +1848,7 @@
     return current;
   }
 
-  ProfileCodeTrieNode* AppendKind(const Code& code,
+  ProfileCodeTrieNode* AppendKind(const AbstractCode code,
                                   ProfileCodeTrieNode* current,
                                   ProcessedSample* sample) {
     if (code.IsNull()) {
@@ -1908,36 +1922,26 @@
                                   uword user_tag,
                                   ProfileCodeTrieNode* current,
                                   ProcessedSample* sample) {
-    if (FLAG_profile_vm) {
-      // None.
-      if (tag_order() == Profile::kNoTags) {
-        return current;
-      }
-      // User first.
-      if ((tag_order() == Profile::kUserVM) ||
-          (tag_order() == Profile::kUser)) {
-        current = AppendUserTag(user_tag, current, sample);
-        // Only user.
-        if (tag_order() == Profile::kUser) {
-          return current;
-        }
-        return AppendVMTags(vm_tag, current, sample);
-      }
-      // VM first.
-      ASSERT((tag_order() == Profile::kVMUser) ||
-             (tag_order() == Profile::kVM));
-      current = AppendVMTags(vm_tag, current, sample);
-      // Only VM.
-      if (tag_order() == Profile::kVM) {
-        return current;
-      }
-      return AppendUserTag(user_tag, current, sample);
-    }
-
+    // None.
     if (tag_order() == Profile::kNoTags) {
       return current;
     }
-
+    // User first.
+    if ((tag_order() == Profile::kUserVM) || (tag_order() == Profile::kUser)) {
+      current = AppendUserTag(user_tag, current, sample);
+      // Only user.
+      if (tag_order() == Profile::kUser) {
+        return current;
+      }
+      return AppendVMTags(vm_tag, current, sample);
+    }
+    // VM first.
+    ASSERT((tag_order() == Profile::kVMUser) || (tag_order() == Profile::kVM));
+    current = AppendVMTags(vm_tag, current, sample);
+    // Only VM.
+    if (tag_order() == Profile::kVM) {
+      return current;
+    }
     return AppendUserTag(user_tag, current, sample);
   }
 
@@ -2067,36 +2071,26 @@
                                       uword user_tag,
                                       ProfileFunctionTrieNode* current,
                                       ProcessedSample* sample) {
-    if (FLAG_profile_vm) {
-      // None.
-      if (tag_order() == Profile::kNoTags) {
-        return current;
-      }
-      // User first.
-      if ((tag_order() == Profile::kUserVM) ||
-          (tag_order() == Profile::kUser)) {
-        current = AppendUserTag(user_tag, current, sample);
-        // Only user.
-        if (tag_order() == Profile::kUser) {
-          return current;
-        }
-        return AppendVMTags(vm_tag, current, sample);
-      }
-      // VM first.
-      ASSERT((tag_order() == Profile::kVMUser) ||
-             (tag_order() == Profile::kVM));
-      current = AppendVMTags(vm_tag, current, sample);
-      // Only VM.
-      if (tag_order() == Profile::kVM) {
-        return current;
-      }
-      return AppendUserTag(user_tag, current, sample);
-    }
-
+    // None.
     if (tag_order() == Profile::kNoTags) {
       return current;
     }
-
+    // User first.
+    if ((tag_order() == Profile::kUserVM) || (tag_order() == Profile::kUser)) {
+      current = AppendUserTag(user_tag, current, sample);
+      // Only user.
+      if (tag_order() == Profile::kUser) {
+        return current;
+      }
+      return AppendVMTags(vm_tag, current, sample);
+    }
+    // VM first.
+    ASSERT((tag_order() == Profile::kVMUser) || (tag_order() == Profile::kVM));
+    current = AppendVMTags(vm_tag, current, sample);
+    // Only VM.
+    if (tag_order() == Profile::kVM) {
+      return current;
+    }
     return AppendUserTag(user_tag, current, sample);
   }
 
@@ -2188,7 +2182,6 @@
     }
 
     // We haven't seen this pc yet.
-    Code& code = Code::Handle(thread_->zone());
 
     // Check NativeSymbolResolver for pc.
     uintptr_t native_start = 0;
@@ -2225,7 +2218,7 @@
 
     ASSERT(pc >= native_start);
     profile_code = new ProfileCode(ProfileCode::kNativeCode, native_start,
-                                   pc + 1, 0, code);
+                                   pc + 1, 0, null_code_);
     if (native_name != NULL) {
       profile_code->SetName(native_name);
       NativeSymbolResolver::FreeSymbolName(native_name);
@@ -2289,7 +2282,7 @@
   intptr_t extra_tags_;
   Profile* profile_;
   DeoptimizedCodeSet* deoptimized_code_;
-  const Code& null_code_;
+  const AbstractCode null_code_;
   const Function& null_function_;
   bool tick_functions_;
   bool inclusive_tree_;
@@ -2529,6 +2522,14 @@
     ASSERT(root != NULL);
     root->PrintToJSONArray(&function_trie);
   }
+  {
+    ProfilerCounters counters = Profiler::counters();
+    JSONObject js_counters(&obj, "counters");
+#define ADD_PROFILER_COUNTER(name)                                             \
+    js_counters.AddProperty64("" #name, counters.name);
+PROFILER_COUNTERS(ADD_PROFILER_COUNTER)
+#undef ADD_PROFILER_COUNTER
+  }
 }
 
 void ProfileTrieWalker::Reset(Profile::TrieKind trie_kind) {
diff --git a/runtime/vm/profiler_service.h b/runtime/vm/profiler_service.h
index ba1981a..6e7d660 100644
--- a/runtime/vm/profiler_service.h
+++ b/runtime/vm/profiler_service.h
@@ -10,6 +10,7 @@
 #include "vm/globals.h"
 #include "vm/growable_array.h"
 #include "vm/object.h"
+#include "vm/profiler.h"
 #include "vm/tags.h"
 #include "vm/thread_interrupter.h"
 #include "vm/token_position.h"
@@ -158,7 +159,7 @@
               uword start,
               uword end,
               int64_t timestamp,
-              const Code& code);
+              const AbstractCode code);
 
   Kind kind() const { return kind_; }
 
@@ -195,7 +196,7 @@
   void IncInclusiveTicks() { inclusive_ticks_++; }
 
   bool IsOptimizedDart() const;
-  RawCode* code() const { return code_.raw(); }
+  const AbstractCode code() const { return code_; }
 
   const char* name() const { return name_; }
   void SetName(const char* name);
@@ -228,7 +229,7 @@
   intptr_t inclusive_ticks_;
   intptr_t inclusive_serial_;
 
-  const Code& code_;
+  const AbstractCode code_;
   char* name_;
   int64_t compile_timestamp_;
   ProfileFunction* function_;
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 36f8318..1cb8236 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -18,6 +18,7 @@
 #ifndef PRODUCT
 
 DECLARE_FLAG(bool, profile_vm);
+DECLARE_FLAG(bool, profile_vm_allocation);
 DECLARE_FLAG(int, max_profile_depth);
 DECLARE_FLAG(bool, enable_inlining_annotations);
 DECLARE_FLAG(int, optimization_counter_threshold);
@@ -25,14 +26,21 @@
 // Some tests are written assuming native stack trace profiling is disabled.
 class DisableNativeProfileScope : public ValueObject {
  public:
-  DisableNativeProfileScope() : FLAG_profile_vm_(FLAG_profile_vm) {
+  DisableNativeProfileScope()
+      : FLAG_profile_vm_(FLAG_profile_vm),
+        FLAG_profile_vm_allocation_(FLAG_profile_vm_allocation) {
     FLAG_profile_vm = false;
+    FLAG_profile_vm_allocation = false;
   }
 
-  ~DisableNativeProfileScope() { FLAG_profile_vm = FLAG_profile_vm_; }
+  ~DisableNativeProfileScope() {
+    FLAG_profile_vm = FLAG_profile_vm_;
+    FLAG_profile_vm_allocation = FLAG_profile_vm_allocation_;
+  }
 
  private:
   const bool FLAG_profile_vm_;
+  const bool FLAG_profile_vm_allocation_;
 };
 
 class DisableBackgroundCompilationScope : public ValueObject {
@@ -148,9 +156,19 @@
   delete sample_buffer;
 }
 
+static RawLibrary* LoadTestScript(const char* script) {
+  Dart_Handle api_lib;
+  {
+    TransitionVMToNative transition(Thread::Current());
+    api_lib = TestCase::LoadTestScript(script, NULL);
+  }
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(api_lib);
+  return lib.raw();
+}
+
 static RawClass* GetClass(const Library& lib, const char* name) {
   Thread* thread = Thread::Current();
-  TransitionNativeToVM transition(thread);
   const Class& cls = Class::Handle(
       lib.LookupClassAllowPrivate(String::Handle(Symbols::New(thread, name))));
   EXPECT(!cls.IsNull());  // No ambiguity error expected.
@@ -159,13 +177,23 @@
 
 static RawFunction* GetFunction(const Library& lib, const char* name) {
   Thread* thread = Thread::Current();
-  TransitionNativeToVM transition(thread);
   const Function& func = Function::Handle(lib.LookupFunctionAllowPrivate(
       String::Handle(Symbols::New(thread, name))));
   EXPECT(!func.IsNull());  // No ambiguity error expected.
   return func.raw();
 }
 
+static void Invoke(const Library& lib,
+                   const char* name,
+                   intptr_t argc = 0,
+                   Dart_Handle* argv = NULL) {
+  Thread* thread = Thread::Current();
+  Dart_Handle api_lib = Api::NewHandle(thread, lib.raw());
+  TransitionVMToNative transition(thread);
+  Dart_Handle result = Dart_Invoke(api_lib, NewString(name), argc, argv);
+  EXPECT_VALID(result);
+}
+
 class AllocationFilter : public SampleFilter {
  public:
   AllocationFilter(Dart_Port port,
@@ -201,9 +229,10 @@
   }
 }
 
-TEST_CASE(Profiler_TrivialRecordAllocation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_TrivialRecordAllocation) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript =
       "class A {\n"
       "  var a;\n"
@@ -218,18 +247,14 @@
       "  return B.boo();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const int64_t before_allocations_micros = Dart_TimelineGetMicros();
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
   class_a.SetTraceAllocation(true);
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   const int64_t after_allocations_micros = Dart_TimelineGetMicros();
   const int64_t allocation_extent_micros =
@@ -237,7 +262,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -258,18 +282,18 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
     EXPECT(!walker.Down());
 
     // Inclusive code: main -> B.boo.
     walker.Reset(Profile::kInclusiveCode);
     // Move down from the root.
     EXPECT(walker.Down());
-    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
     EXPECT(walker.Down());
     EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
     EXPECT(walker.Down());
@@ -307,7 +331,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -356,7 +379,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -499,7 +521,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -516,7 +537,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -535,10 +555,11 @@
 #endif  // defined(DART_USE_TCMALLOC) && !defined(PRODUCT) &&
         // !defined(TARGET_ARCH_DBC) && !defined(HOST_OS_FUCHSIA)
 
-TEST_CASE(Profiler_ToggleRecordAllocation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_ToggleRecordAllocation) {
   EnableProfiler();
 
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript =
       "class A {\n"
       "  var a;\n"
@@ -553,21 +574,16 @@
       "  return B.boo();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -580,13 +596,11 @@
   // Turn on allocation tracing for A.
   class_a.SetTraceAllocation(true);
 
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -604,18 +618,18 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
     EXPECT(!walker.Down());
 
     // Inclusive code: main -> B.boo.
     walker.Reset(Profile::kInclusiveCode);
     // Move down from the root.
     EXPECT(walker.Down());
-    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
     EXPECT(walker.Down());
     EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
     EXPECT(walker.Down());
@@ -652,13 +666,11 @@
   // Turn off allocation tracing for A.
   class_a.SetTraceAllocation(false);
 
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -669,9 +681,10 @@
   }
 }
 
-TEST_CASE(Profiler_CodeTicks) {
+ISOLATE_UNIT_TEST_CASE(Profiler_CodeTicks) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript =
       "class A {\n"
       "  var a;\n"
@@ -686,21 +699,16 @@
       "  return B.boo();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -714,17 +722,13 @@
   class_a.SetTraceAllocation(true);
 
   // Allocate three times.
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
+  Invoke(root_library, "main");
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -743,11 +747,11 @@
     EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
     EXPECT_EQ(3, walker.CurrentExclusiveTicks());
     EXPECT(walker.Down());
-    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
     EXPECT_EQ(3, walker.CurrentNodeTickCount());
     EXPECT_EQ(3, walker.CurrentInclusiveTicks());
     EXPECT(walker.Down());
-    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
     EXPECT_EQ(3, walker.CurrentNodeTickCount());
     EXPECT_EQ(3, walker.CurrentInclusiveTicks());
     EXPECT_EQ(0, walker.CurrentExclusiveTicks());
@@ -757,12 +761,12 @@
     walker.Reset(Profile::kInclusiveCode);
     // Move down from the root.
     EXPECT(walker.Down());
-    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
     EXPECT_EQ(3, walker.CurrentNodeTickCount());
     EXPECT_EQ(3, walker.CurrentInclusiveTicks());
     EXPECT_EQ(0, walker.CurrentExclusiveTicks());
     EXPECT(walker.Down());
-    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
     EXPECT_EQ(3, walker.CurrentNodeTickCount());
     EXPECT_EQ(3, walker.CurrentInclusiveTicks());
     EXPECT(walker.Down());
@@ -774,9 +778,10 @@
   }
 }
 
-TEST_CASE(Profiler_FunctionTicks) {
+ISOLATE_UNIT_TEST_CASE(Profiler_FunctionTicks) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript =
       "class A {\n"
       "  var a;\n"
@@ -791,21 +796,16 @@
       "  return B.boo();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -819,17 +819,13 @@
   class_a.SetTraceAllocation(true);
 
   // Allocate three times.
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
+  Invoke(root_library, "main");
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -879,29 +875,28 @@
   }
 }
 
-TEST_CASE(Profiler_IntrinsicAllocation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_IntrinsicAllocation) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript = "double foo(double a, double b) => a + b;";
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
   Isolate* isolate = thread->isolate();
 
   const Class& double_class =
       Class::Handle(isolate->object_store()->double_class());
   EXPECT(!double_class.IsNull());
 
-  Dart_Handle args[2] = {
-      Dart_NewDouble(1.0), Dart_NewDouble(2.0),
-  };
+  Dart_Handle args[2];
+  {
+    TransitionVMToNative transition(thread);
+    args[0] = Dart_NewDouble(1.0);
+    args[1] = Dart_NewDouble(2.0);
+  }
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -912,11 +907,9 @@
   }
 
   double_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -930,20 +923,18 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("Double_add", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("_Double._add", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] _Double._add", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("_Double.+", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] _Double.+", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("foo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
 
   double_class.SetTraceAllocation(false);
-  result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -954,27 +945,23 @@
   }
 }
 
-TEST_CASE(Profiler_ArrayAllocation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_ArrayAllocation) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript =
       "List foo() => new List(4);\n"
       "List bar() => new List();\n";
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
   Isolate* isolate = thread->isolate();
 
   const Class& array_class =
       Class::Handle(isolate->object_store()->array_class());
   EXPECT(!array_class.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -985,11 +972,9 @@
   }
 
   array_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1005,18 +990,16 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("[Stub] AllocateArray", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("new _List", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] new _List", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("foo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
 
   array_class.SetTraceAllocation(false);
-  result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1030,18 +1013,15 @@
   ProfilerService::ClearSamples();
 
   // Compile bar (many List objects allocated).
-  result = Dart_Invoke(lib, NewString("bar"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "bar");
 
   // Enable again.
   array_class.SetTraceAllocation(true);
 
   // Run bar.
-  result = Dart_Invoke(lib, NewString("bar"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "bar");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1053,29 +1033,25 @@
   }
 }
 
-TEST_CASE(Profiler_ContextAllocation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_ContextAllocation) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript =
       "var msg1 = 'a';\n"
       "foo() {\n"
       "  var msg = msg1 + msg1;\n"
       "  return (x) { return '$msg + $msg'; }(msg);\n"
       "}\n";
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
   Isolate* isolate = thread->isolate();
 
   const Class& context_class = Class::Handle(Object::context_class());
   EXPECT(!context_class.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1086,11 +1062,9 @@
   }
 
   context_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1106,16 +1080,14 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("[Stub] AllocateContext", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("foo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
 
   context_class.SetTraceAllocation(false);
-  result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1126,9 +1098,10 @@
   }
 }
 
-TEST_CASE(Profiler_ClosureAllocation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_ClosureAllocation) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript =
       "var msg1 = 'a';\n"
       "\n"
@@ -1143,10 +1116,7 @@
       "  return (x, y) { return '$x + $y'; }(msg, msg2);\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
   Isolate* isolate = thread->isolate();
 
   const Class& closure_class =
@@ -1155,11 +1125,9 @@
   closure_class.SetTraceAllocation(true);
 
   // Invoke "foo" which during compilation, triggers a closure allocation.
-  Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1184,11 +1152,9 @@
   closure_class.SetTraceAllocation(false);
 
   // Invoke "bar" which during compilation, triggers a closure allocation.
-  result = Dart_Invoke(lib, NewString("bar"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "bar");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1200,16 +1166,14 @@
   }
 }
 
-TEST_CASE(Profiler_TypedArrayAllocation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_TypedArrayAllocation) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript =
       "import 'dart:typed_data';\n"
       "List foo() => new Float32List(4);\n";
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
   Isolate* isolate = thread->isolate();
 
   const Library& typed_data_library =
@@ -1219,11 +1183,9 @@
       Class::Handle(GetClass(typed_data_library, "_Float32List"));
   EXPECT(!float32_list_class.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1234,11 +1196,9 @@
   }
 
   float32_list_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1252,18 +1212,16 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("TypedData_Float32Array_new", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("new Float32List", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] new Float32List", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("foo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
 
   float32_list_class.SetTraceAllocation(false);
-  result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1274,11 +1232,9 @@
   }
 
   float32_list_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo");
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1289,29 +1245,28 @@
   }
 }
 
-TEST_CASE(Profiler_StringAllocation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_StringAllocation) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
+  DisableBackgroundCompilationScope dbcs;
   const char* kScript = "String foo(String a, String b) => a + b;";
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
   Isolate* isolate = thread->isolate();
 
   const Class& one_byte_string_class =
       Class::Handle(isolate->object_store()->one_byte_string_class());
   EXPECT(!one_byte_string_class.IsNull());
 
-  Dart_Handle args[2] = {
-      NewString("a"), NewString("b"),
-  };
+  Dart_Handle args[2];
+  {
+    TransitionVMToNative transition(thread);
+    args[0] = NewString("a");
+    args[1] = NewString("b");
+  }
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1322,11 +1277,9 @@
   }
 
   one_byte_string_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1341,19 +1294,17 @@
     EXPECT_STREQ("String_concat", walker.CurrentName());
     EXPECT(walker.Down());
 #if 1
-    EXPECT_STREQ("_StringBase.+", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] _StringBase.+", walker.CurrentName());
     EXPECT(walker.Down());
 #endif
-    EXPECT_STREQ("foo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
 
   one_byte_string_class.SetTraceAllocation(false);
-  result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1364,11 +1315,9 @@
   }
 
   one_byte_string_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1379,30 +1328,28 @@
   }
 }
 
-TEST_CASE(Profiler_StringInterpolation) {
+ISOLATE_UNIT_TEST_CASE(Profiler_StringInterpolation) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   const char* kScript = "String foo(String a, String b) => '$a | $b';";
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
   Isolate* isolate = thread->isolate();
 
   const Class& one_byte_string_class =
       Class::Handle(isolate->object_store()->one_byte_string_class());
   EXPECT(!one_byte_string_class.IsNull());
 
-  Dart_Handle args[2] = {
-      NewString("a"), NewString("b"),
-  };
+  Dart_Handle args[2];
+  {
+    TransitionVMToNative transition(thread);
+    args[0] = NewString("a");
+    args[1] = NewString("b");
+  }
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1413,11 +1360,9 @@
   }
 
   one_byte_string_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1431,22 +1376,23 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("OneByteString_allocate", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("_OneByteString._allocate", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] _OneByteString._allocate",
+                 walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("_OneByteString._concatAll", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] _OneByteString._concatAll",
+                 walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("_StringBase._interpolate", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] _StringBase._interpolate",
+                 walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("foo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] foo", walker.CurrentName());
     EXPECT(!walker.Down());
   }
 
   one_byte_string_class.SetTraceAllocation(false);
-  result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1457,11 +1403,9 @@
   }
 
   one_byte_string_class.SetTraceAllocation(true);
-  result = Dart_Invoke(lib, NewString("foo"), 2, &args[0]);
-  EXPECT_VALID(result);
+  Invoke(root_library, "foo", 2, &args[0]);
 
   {
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1472,10 +1416,11 @@
   }
 }
 
-TEST_CASE(Profiler_FunctionInline) {
+ISOLATE_UNIT_TEST_CASE(Profiler_FunctionInline) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
+  SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 30000);
 
   const char* kScript =
       "class A {\n"
@@ -1503,26 +1448,20 @@
       "  B.boo(true);\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
 
   // Compile "main".
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
   // Compile "mainA".
-  result = Dart_Invoke(lib, NewString("mainA"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "mainA");
   // At this point B.boo should be optimized and inlined B.foo and B.choo.
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1536,13 +1475,11 @@
   class_a.SetTraceAllocation(true);
 
   // Allocate 50,000 instances of A.
-  result = Dart_Invoke(lib, NewString("mainA"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "mainA");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1559,12 +1496,12 @@
     EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
     EXPECT_EQ(50000, walker.CurrentExclusiveTicks());
     EXPECT(walker.Down());
-    EXPECT_STREQ("*B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Optimized] B.boo", walker.CurrentName());
     EXPECT_EQ(1, walker.SiblingCount());
     EXPECT_EQ(50000, walker.CurrentNodeTickCount());
     EXPECT_EQ(50000, walker.CurrentInclusiveTicks());
     EXPECT(walker.Down());
-    EXPECT_STREQ("mainA", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] mainA", walker.CurrentName());
     EXPECT_EQ(1, walker.SiblingCount());
     EXPECT_EQ(50000, walker.CurrentNodeTickCount());
     EXPECT_EQ(50000, walker.CurrentInclusiveTicks());
@@ -1573,13 +1510,13 @@
     // We have two code objects: mainA and B.boo.
     walker.Reset(Profile::kInclusiveCode);
     EXPECT(walker.Down());
-    EXPECT_STREQ("mainA", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] mainA", walker.CurrentName());
     EXPECT_EQ(1, walker.SiblingCount());
     EXPECT_EQ(50000, walker.CurrentNodeTickCount());
     EXPECT_EQ(50000, walker.CurrentInclusiveTicks());
     EXPECT_EQ(0, walker.CurrentExclusiveTicks());
     EXPECT(walker.Down());
-    EXPECT_STREQ("*B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Optimized] B.boo", walker.CurrentName());
     EXPECT_EQ(1, walker.SiblingCount());
     EXPECT_EQ(50000, walker.CurrentNodeTickCount());
     EXPECT_EQ(50000, walker.CurrentInclusiveTicks());
@@ -1661,7 +1598,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1680,11 +1616,11 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("[Unoptimized Code]", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("*B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Optimized] B.boo", walker.CurrentName());
     EXPECT(walker.Down());
     EXPECT_STREQ("[Optimized Code]", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("mainA", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] mainA", walker.CurrentName());
     EXPECT(walker.Down());
     EXPECT_STREQ("[Unoptimized Code]", walker.CurrentName());
     EXPECT(!walker.Down());
@@ -1693,11 +1629,11 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("[Unoptimized Code]", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("mainA", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] mainA", walker.CurrentName());
     EXPECT(walker.Down());
     EXPECT_STREQ("[Optimized Code]", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("*B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Optimized] B.boo", walker.CurrentName());
     EXPECT(walker.Down());
     EXPECT_STREQ("[Unoptimized Code]", walker.CurrentName());
     EXPECT(walker.Down());
@@ -1760,7 +1696,7 @@
   }
 }
 
-TEST_CASE(Profiler_InliningIntervalBoundry) {
+ISOLATE_UNIT_TEST_CASE(Profiler_InliningIntervalBoundry) {
   // The PC of frames below the top frame is a call's return address,
   // which can belong to a different inlining interval than the call.
   // This test checks the profiler service takes this into account; see
@@ -1769,6 +1705,8 @@
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
+  SetFlagScope<int> sfs(&FLAG_optimization_counter_threshold, 30000);
+
   const char* kScript =
       "class A {\n"
       "}\n"
@@ -1803,19 +1741,14 @@
       "  a();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
 
   // Compile and optimize.
-  Dart_Handle result = Dart_Invoke(lib, NewString("mainNoAlloc"), 0, NULL);
-  EXPECT_VALID(result);
-  result = Dart_Invoke(lib, NewString("mainAlloc"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "mainNoAlloc");
+  Invoke(root_library, "mainAlloc");
 
   // At this point a should be optimized and have inlined both right and wrong,
   // but not maybeAllocate or doNothing.
@@ -1835,7 +1768,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1848,13 +1780,11 @@
   // Turn on allocation tracing for A.
   class_a.SetTraceAllocation(true);
 
-  result = Dart_Invoke(lib, NewString("mainAlloc"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "mainAlloc");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1877,12 +1807,9 @@
     EXPECT_STREQ("a", walker.CurrentName());
     EXPECT(walker.Down());
     EXPECT_STREQ("mainAlloc", walker.CurrentName());
-    EXPECT(walker.Down());  // Account for "[Native] [xxxxxxx, xxxxxxx)"
-    EXPECT(!walker.Down());
 
     // Inline expansion should show us the complete call chain:
     walker.Reset(Profile::kInclusiveFunction);
-    EXPECT(walker.Down());  // Account for "[Native] [xxxxxxx, xxxxxxx)"
     EXPECT(walker.Down());
     EXPECT_STREQ("mainAlloc", walker.CurrentName());
     EXPECT(walker.Down());
@@ -1899,7 +1826,7 @@
   }
 }
 
-TEST_CASE(Profiler_ChainedSamples) {
+ISOLATE_UNIT_TEST_CASE(Profiler_ChainedSamples) {
   EnableProfiler();
   MaxProfileDepthScope mpds(32);
   DisableNativeProfileScope dnps;
@@ -1938,22 +1865,17 @@
       "  return go();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
   class_a.SetTraceAllocation(true);
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -1970,50 +1892,50 @@
     EXPECT(walker.Down());
     EXPECT_STREQ("[Stub] Allocate A", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("B.boo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] B.boo", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("orange", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] orange", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("napkin", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] napkin", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("mayo", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] mayo", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("lemon", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] lemon", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("kindle", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] kindle", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("jeep", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] jeep", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("ice", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] ice", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("haystack", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] haystack", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("granola", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] granola", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("fred", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] fred", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("elephant", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] elephant", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("dog", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] dog", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("cantaloupe", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] cantaloupe", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("banana", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] banana", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("apple", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] apple", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("secondInit", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] secondInit", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("init", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] init", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("go", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] go", walker.CurrentName());
     EXPECT(walker.Down());
-    EXPECT_STREQ("main", walker.CurrentName());
+    EXPECT_STREQ("[Unoptimized] main", walker.CurrentName());
     EXPECT(!walker.Down());
   }
 }
 
-TEST_CASE(Profiler_BasicSourcePosition) {
+ISOLATE_UNIT_TEST_CASE(Profiler_BasicSourcePosition) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
@@ -2035,28 +1957,22 @@
       "  B.boo();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   // Turn on allocation tracing for A.
   class_a.SetTraceAllocation(true);
 
   // Allocate one time.
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -2089,7 +2005,7 @@
   }
 }
 
-TEST_CASE(Profiler_BasicSourcePositionOptimized) {
+ISOLATE_UNIT_TEST_CASE(Profiler_BasicSourcePositionOptimized) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
@@ -2115,10 +2031,7 @@
       "  B.boo();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
@@ -2128,8 +2041,7 @@
 
   // Warm up function.
   while (true) {
-    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-    EXPECT_VALID(result);
+    Invoke(root_library, "main");
     const Code& code = Code::Handle(main.CurrentCode());
     if (code.is_optimized()) {
       // Warmed up.
@@ -2141,8 +2053,7 @@
   class_a.SetTraceAllocation(true);
 
   // Allocate one time.
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   // Still optimized.
   const Code& code = Code::Handle(main.CurrentCode());
@@ -2151,7 +2062,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -2184,7 +2094,7 @@
   }
 }
 
-TEST_CASE(Profiler_SourcePosition) {
+ISOLATE_UNIT_TEST_CASE(Profiler_SourcePosition) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
@@ -2218,28 +2128,22 @@
       "  new C()..bacon();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   // Turn on allocation tracing for A.
   class_a.SetTraceAllocation(true);
 
   // Allocate one time.
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -2290,7 +2194,7 @@
   }
 }
 
-TEST_CASE(Profiler_SourcePositionOptimized) {
+ISOLATE_UNIT_TEST_CASE(Profiler_SourcePositionOptimized) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
@@ -2329,10 +2233,7 @@
       "  new C()..bacon();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
@@ -2342,8 +2243,7 @@
 
   // Warm up function.
   while (true) {
-    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-    EXPECT_VALID(result);
+    Invoke(root_library, "main");
     const Code& code = Code::Handle(main.CurrentCode());
     if (code.is_optimized()) {
       // Warmed up.
@@ -2355,8 +2255,7 @@
   class_a.SetTraceAllocation(true);
 
   // Allocate one time.
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   // Still optimized.
   const Code& code = Code::Handle(main.CurrentCode());
@@ -2365,7 +2264,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -2416,7 +2314,7 @@
   }
 }
 
-TEST_CASE(Profiler_BinaryOperatorSourcePosition) {
+ISOLATE_UNIT_TEST_CASE(Profiler_BinaryOperatorSourcePosition) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
@@ -2453,28 +2351,22 @@
       "  new C()..bacon();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
 
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   // Turn on allocation tracing for A.
   class_a.SetTraceAllocation(true);
 
   // Allocate one time.
-  result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -2531,7 +2423,7 @@
   }
 }
 
-TEST_CASE(Profiler_BinaryOperatorSourcePositionOptimized) {
+ISOLATE_UNIT_TEST_CASE(Profiler_BinaryOperatorSourcePositionOptimized) {
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
@@ -2573,10 +2465,7 @@
       "  new C()..bacon();\n"
       "}\n";
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   const Class& class_a = Class::Handle(GetClass(root_library, "A"));
   EXPECT(!class_a.IsNull());
@@ -2586,8 +2475,7 @@
 
   // Warm up function.
   while (true) {
-    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-    EXPECT_VALID(result);
+    Invoke(root_library, "main");
     const Code& code = Code::Handle(main.CurrentCode());
     if (code.is_optimized()) {
       // Warmed up.
@@ -2599,8 +2487,7 @@
   class_a.SetTraceAllocation(true);
 
   // Allocate one time.
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   // Still optimized.
   const Code& code = Code::Handle(main.CurrentCode());
@@ -2609,7 +2496,6 @@
   {
     Thread* thread = Thread::Current();
     Isolate* isolate = thread->isolate();
-    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HANDLESCOPE(thread);
     Profile profile(isolate);
@@ -2705,7 +2591,7 @@
   return 0;
 }
 
-TEST_CASE(Profiler_GetSourceReport) {
+ISOLATE_UNIT_TEST_CASE(Profiler_GetSourceReport) {
   EnableProfiler();
   const char* kScript =
       "doWork(i) => i * i;\n"
@@ -2718,10 +2604,10 @@
       "}\n";
 
   // Token position of * in `i * i`.
-  const TokenPosition squarePosition = TokenPosition(6);
+  const TokenPosition squarePosition = TokenPosition(15);
 
   // Token position of the call to `doWork`.
-  const TokenPosition callPosition = TokenPosition(39);
+  const TokenPosition callPosition = TokenPosition(90);
 
   DisableNativeProfileScope dnps;
   // Disable profiling for this thread.
@@ -2732,14 +2618,10 @@
   SampleBuffer* sample_buffer = Profiler::sample_buffer();
   EXPECT(sample_buffer != NULL);
 
-  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
-  EXPECT_VALID(lib);
-  Library& root_library = Library::Handle();
-  root_library ^= Api::UnwrapHandle(lib);
+  const Library& root_library = Library::Handle(LoadTestScript(kScript));
 
   // Invoke main so that it gets compiled.
-  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
+  Invoke(root_library, "main");
 
   {
     // Clear the profile for this isolate.
@@ -2781,10 +2663,6 @@
       FindPCForTokenPosition(do_work_code, TokenPosition::kControlFlow);
   EXPECT(controlFlowPc != 0);
 
-  uword tempMovePc =
-      FindPCForTokenPosition(main_code, TokenPosition::kTempMove);
-  EXPECT(tempMovePc != 0);
-
   // Insert fake samples.
 
   // Sample 1:
@@ -2808,41 +2686,34 @@
                      callPositionPc,  // main.
                      0};
 
-  // Sample 4:
-  // tempMovePc exclusive.
-  uword sample4[] = {tempMovePc,  // main.
-                     0};
-
   InsertFakeSample(sample_buffer, &sample1[0]);
   InsertFakeSample(sample_buffer, &sample2[0]);
   InsertFakeSample(sample_buffer, &sample3[0]);
-  InsertFakeSample(sample_buffer, &sample4[0]);
 
   // Generate source report for main.
   JSONStream js;
   {
-    TransitionNativeToVM transition(thread);
     SourceReport sourceReport(SourceReport::kProfile);
     sourceReport.PrintJSON(&js, script, do_work.token_pos(),
                            main.end_token_pos());
   }
 
   // Verify positions in do_work.
-  EXPECT_SUBSTRING("\"positions\":[\"ControlFlow\",6]", js.ToCString());
+  EXPECT_SUBSTRING("\"positions\":[\"ControlFlow\",15]", js.ToCString());
   // Verify exclusive ticks in do_work.
   EXPECT_SUBSTRING("\"exclusiveTicks\":[1,2]", js.ToCString());
   // Verify inclusive ticks in do_work.
   EXPECT_SUBSTRING("\"inclusiveTicks\":[1,2]", js.ToCString());
 
   // Verify positions in main.
-  EXPECT_SUBSTRING("\"positions\":[\"TempMove\",39]", js.ToCString());
+  EXPECT_SUBSTRING("\"positions\":[90]", js.ToCString());
   // Verify exclusive ticks in main.
-  EXPECT_SUBSTRING("\"exclusiveTicks\":[1,0]", js.ToCString());
+  EXPECT_SUBSTRING("\"exclusiveTicks\":[0]", js.ToCString());
   // Verify inclusive ticks in main.
-  EXPECT_SUBSTRING("\"inclusiveTicks\":[1,2]", js.ToCString());
+  EXPECT_SUBSTRING("\"inclusiveTicks\":[2]", js.ToCString());
 }
 
-TEST_CASE(Profiler_ProfileCodeTableTest) {
+ISOLATE_UNIT_TEST_CASE(Profiler_ProfileCodeTableTest) {
   Zone* Z = Thread::Current()->zone();
 
   ProfileCodeTable* table = new (Z) ProfileCodeTable();
@@ -2850,7 +2721,7 @@
   EXPECT_EQ(table->FindCodeForPC(42), static_cast<ProfileCode*>(NULL));
 
   int64_t timestamp = 0;
-  Code& null_code = Code::Handle(Z);
+  const AbstractCode null_code(Code::null());
 
   ProfileCode* code1 = new (Z)
       ProfileCode(ProfileCode::kNativeCode, 50, 60, timestamp, null_code);
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 2fe8841..ec0513f 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -4,6 +4,7 @@
 
 #include "vm/program_visitor.h"
 
+#include "vm/code_patcher.h"
 #include "vm/deopt_instructions.h"
 #include "vm/hash_map.h"
 #include "vm/object.h"
@@ -114,6 +115,66 @@
   }
 }
 
+void ProgramVisitor::BindStaticCalls() {
+#if !defined(TARGET_ARCH_DBC)
+  if (FLAG_precompiled_mode) {
+    return;
+  }
+
+  class BindJITStaticCallsVisitor : public FunctionVisitor {
+   public:
+    explicit BindJITStaticCallsVisitor(Zone* zone)
+        : code_(Code::Handle(zone)),
+          table_(Array::Handle(zone)),
+          kind_and_offset_(Smi::Handle(zone)),
+          target_(Object::Handle(zone)),
+          target_code_(Code::Handle(zone)) {}
+
+    void Visit(const Function& function) {
+      if (!function.HasCode()) {
+        return;
+      }
+      code_ = function.CurrentCode();
+      table_ = code_.static_calls_target_table();
+      StaticCallsTable static_calls(table_);
+      for (const auto& view : static_calls) {
+        kind_and_offset_ = view.Get<Code::kSCallTableKindAndOffset>();
+        Code::CallKind kind = Code::KindField::decode(kind_and_offset_.Value());
+        if (kind != Code::kCallViaCode) {
+          continue;
+        }
+        int32_t pc_offset = Code::OffsetField::decode(kind_and_offset_.Value());
+        target_ = view.Get<Code::kSCallTableFunctionTarget>();
+        if (target_.IsNull()) {
+          target_ = view.Get<Code::kSCallTableCodeTarget>();
+          ASSERT(!Code::Cast(target_).IsFunctionCode());
+          // Allocation stub or AllocateContext or AllocateArray or ...
+        } else {
+          const Function& target_func = Function::Cast(target_);
+          if (target_func.HasCode()) {
+            target_code_ = target_func.CurrentCode();
+          } else {
+            target_code_ = StubCode::CallStaticFunction().raw();
+          }
+          uword pc = pc_offset + code_.PayloadStart();
+          CodePatcher::PatchStaticCallAt(pc, code_, target_code_);
+        }
+      }
+    }
+
+   private:
+    Code& code_;
+    Array& table_;
+    Smi& kind_and_offset_;
+    Object& target_;
+    Code& target_code_;
+  };
+
+  BindJITStaticCallsVisitor visitor(Thread::Current()->zone());
+  ProgramVisitor::VisitFunctions(&visitor);
+#endif  // !defined(TARGET_ARCH_DBC)
+}
+
 void ProgramVisitor::ShareMegamorphicBuckets() {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
@@ -129,8 +190,7 @@
       zone, Array::New(MegamorphicCache::kEntryLength * capacity, Heap::kOld));
   const Function& handler =
       Function::Handle(zone, MegamorphicCacheTable::miss_handler(isolate));
-  MegamorphicCache::SetEntry(buckets, 0, MegamorphicCache::smi_illegal_cid(),
-                             handler);
+  MegamorphicCache::SetEntry(buckets, 0, Object::smi_illegal_cid(), handler);
 
   for (intptr_t i = 0; i < table.Length(); i++) {
     cache ^= table.At(i);
@@ -636,6 +696,12 @@
   ProgramVisitor::VisitFunctions(&visitor);
 }
 
+// Traits for comparing two [Instructions] objects for equality, which is
+// implemented as bit-wise equality.
+//
+// This considers two instruction objects to be equal even if they have
+// different static call targets.  Since the static call targets are called via
+// the object pool this is ok.
 class InstructionsKeyValueTrait {
  public:
   // Typedefs needed for the DirectChainedHashMap template.
@@ -656,6 +722,52 @@
 
 typedef DirectChainedHashMap<InstructionsKeyValueTrait> InstructionsSet;
 
+// Traits for comparing two [Code] objects for equality.
+//
+// It considers two [Code] objects to be equal if
+//
+//   * their [RawInstruction]s are bit-wise equal
+//   * their [RawPcDescriptor]s are the same
+//   * their [RawStackMaps]s are the same
+//   * their static call targets are the same
+#if defined(DART_PRECOMPILER)
+class CodeKeyValueTrait {
+ public:
+  // Typedefs needed for the DirectChainedHashMap template.
+  typedef const Code* Key;
+  typedef const Code* Value;
+  typedef const Code* Pair;
+
+  static Key KeyOf(Pair kv) { return kv; }
+
+  static Value ValueOf(Pair kv) { return kv; }
+
+  static inline intptr_t Hashcode(Key key) { return key->Size(); }
+
+  static inline bool IsKeyEqual(Pair pair, Key key) {
+    if (pair->raw() == key->raw()) return true;
+
+    // Notice we assume that these entries have already been de-duped, so we
+    // can use pointer equality.
+    if (pair->static_calls_target_table() != key->static_calls_target_table()) {
+      return false;
+    }
+    if (pair->pc_descriptors() == key->pc_descriptors()) {
+      return false;
+    }
+    if (pair->stackmaps() == key->stackmaps()) {
+      return false;
+    }
+    if (pair->catch_entry_moves_maps() == key->catch_entry_moves_maps()) {
+      return false;
+    }
+    return Instructions::Equals(pair->instructions(), key->instructions());
+  }
+};
+
+typedef DirectChainedHashMap<CodeKeyValueTrait> CodeSet;
+#endif  // defined(DART_PRECOMPILER)
+
 void ProgramVisitor::DedupInstructions() {
   class DedupInstructionsVisitor : public FunctionVisitor,
                                    public ObjectVisitor {
@@ -712,13 +824,65 @@
   ProgramVisitor::VisitFunctions(&visitor);
 }
 
+void ProgramVisitor::DedupInstructionsWithSameMetadata() {
+#if defined(DART_PRECOMPILER)
+  class DedupInstructionsWithSameMetadataVisitor : public FunctionVisitor,
+                                                   public ObjectVisitor {
+   public:
+    explicit DedupInstructionsWithSameMetadataVisitor(Zone* zone)
+        : zone_(zone),
+          canonical_set_(),
+          code_(Code::Handle(zone)),
+          owner_(Object::Handle(zone)),
+          instructions_(Instructions::Handle(zone)) {}
+
+    void VisitObject(RawObject* obj) {
+      if (obj->IsCode()) {
+        canonical_set_.Insert(&Code::ZoneHandle(zone_, Code::RawCast(obj)));
+      }
+    }
+
+    void Visit(const Function& function) {
+      if (!function.HasCode()) {
+        return;
+      }
+      code_ = function.CurrentCode();
+      instructions_ = DedupOneInstructions(code_);
+      code_.SetActiveInstructions(instructions_);
+      code_.set_instructions(instructions_);
+      function.SetInstructions(code_);  // Update cached entry point.
+    }
+
+    RawInstructions* DedupOneInstructions(const Code& code) {
+      const Code* canonical = canonical_set_.LookupValue(&code);
+      if (canonical == NULL) {
+        canonical_set_.Insert(&Code::ZoneHandle(zone_, code.raw()));
+        return code.instructions();
+      } else {
+        owner_ = code.owner();
+        return canonical->instructions();
+      }
+    }
+
+   private:
+    Zone* zone_;
+    CodeSet canonical_set_;
+    Code& code_;
+    Object& owner_;
+    Instructions& instructions_;
+  };
+
+  DedupInstructionsWithSameMetadataVisitor visitor(Thread::Current()->zone());
+  ProgramVisitor::VisitFunctions(&visitor);
+#endif  // defined(DART_PRECOMPILER)
+}
+
 void ProgramVisitor::Dedup() {
   Thread* thread = Thread::Current();
   StackZone stack_zone(thread);
   HANDLESCOPE(thread);
 
-  // TODO(rmacnak): Bind static calls whose target has been compiled. Forward
-  // references to disabled code.
+  BindStaticCalls();
   ShareMegamorphicBuckets();
   DedupStackMaps();
   DedupPcDescriptors();
@@ -731,7 +895,11 @@
 
 #if defined(PRODUCT)
   // Reduces binary size but obfuscates profiler results.
-  DedupInstructions();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    DedupInstructionsWithSameMetadata();
+  } else {
+    DedupInstructions();
+  }
 #endif
 }
 
diff --git a/runtime/vm/program_visitor.h b/runtime/vm/program_visitor.h
index f2b255a..5583cc3 100644
--- a/runtime/vm/program_visitor.h
+++ b/runtime/vm/program_visitor.h
@@ -30,6 +30,7 @@
   static void Dedup();
 
  private:
+  static void BindStaticCalls();
   static void ShareMegamorphicBuckets();
   static void DedupStackMaps();
   static void DedupPcDescriptors();
@@ -40,6 +41,7 @@
   static void DedupCodeSourceMaps();
   static void DedupLists();
   static void DedupInstructions();
+  static void DedupInstructionsWithSameMetadata();
 };
 
 }  // namespace dart
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 76a2569..e0d7945 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -10,6 +10,7 @@
 #include "vm/heap/freelist.h"
 #include "vm/isolate.h"
 #include "vm/object.h"
+#include "vm/runtime_entry.h"
 #include "vm/visitor.h"
 
 namespace dart {
@@ -298,9 +299,21 @@
       break;
   }
 
+#if defined(DEBUG)
   ASSERT(size != 0);
-  ASSERT(size == Size());
+  const intptr_t expected_size = Size();
+
+  // In general we expect that visitors return exactly the same size that Size
+  // would compute. However in case of Arrays we might have a discrepancy when
+  // concurrently visiting an array that is being shrunk with
+  // Array::MakeFixedLength: the visitor might have visited the full array while
+  // here we are observing a smaller Size().
+  ASSERT(size == expected_size ||
+         (class_id == kArrayCid && size > expected_size));
+  return size;  // Prefer larger size.
+#else
   return size;
+#endif
 }
 
 bool RawObject::FindObject(FindObjectVisitor* visitor) {
@@ -369,12 +382,10 @@
   }
 
 REGULAR_VISITOR(Class)
-REGULAR_VISITOR(UnresolvedClass)
+REGULAR_VISITOR(Bytecode)
 REGULAR_VISITOR(Type)
 REGULAR_VISITOR(TypeRef)
 REGULAR_VISITOR(TypeParameter)
-REGULAR_VISITOR(BoundedType)
-REGULAR_VISITOR(MixinAppType)
 REGULAR_VISITOR(PatchClass)
 COMPRESSED_VISITOR(Closure)
 REGULAR_VISITOR(ClosureData)
@@ -507,9 +518,8 @@
 }
 
 bool RawCode::ContainsPC(RawObject* raw_obj, uword pc) {
-  uint32_t tags = raw_obj->ptr()->tags_;
-  if (RawObject::ClassIdTag::decode(tags) == kCodeCid) {
-    RawCode* raw_code = reinterpret_cast<RawCode*>(raw_obj);
+  if (raw_obj->IsCode()) {
+    RawCode* raw_code = static_cast<RawCode*>(raw_obj);
     return RawInstructions::ContainsPC(raw_code->ptr()->instructions_, pc);
   }
   return false;
@@ -543,6 +553,17 @@
 #endif
 }
 
+bool RawBytecode::ContainsPC(RawObject* raw_obj, uword pc) {
+  if (raw_obj->IsBytecode()) {
+    RawBytecode* raw_bytecode = static_cast<RawBytecode*>(raw_obj);
+    RawExternalTypedData* bytes = raw_bytecode->ptr()->instructions_;
+    uword start = reinterpret_cast<uword>(bytes->ptr()->data_);
+    uword size = Smi::Value(bytes->ptr()->length_);
+    return (pc - start) < size;
+  }
+  return false;
+}
+
 intptr_t RawObjectPool::VisitObjectPoolPointers(RawObjectPool* raw_obj,
                                                 ObjectPointerVisitor* visitor) {
   const intptr_t length = raw_obj->ptr()->length_;
@@ -593,4 +614,19 @@
   return RawArray::VisitArrayPointers(raw_obj, visitor);
 }
 
+void RawObject::RememberCard(RawObject* const* slot) {
+  HeapPage::Of(this)->RememberCard(slot);
+}
+
+DEFINE_LEAF_RUNTIME_ENTRY(void,
+                          RememberCard,
+                          2,
+                          RawObject* object,
+                          RawObject** slot) {
+  ASSERT(object->IsOldObject());
+  ASSERT(object->IsCardRemembered());
+  HeapPage::Of(object)->RememberCard(slot);
+}
+END_LEAF_RUNTIME_ENTRY
+
 }  // namespace dart
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 98d2b44..dcde53e 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -10,6 +10,7 @@
 #include "vm/compiler/method_recognizer.h"
 #include "vm/exceptions.h"
 #include "vm/globals.h"
+#include "vm/object_graph.h"
 #include "vm/snapshot.h"
 #include "vm/token.h"
 #include "vm/token_position.h"
@@ -22,7 +23,6 @@
 // Macrobatics to define the Object hierarchy of VM implementation classes.
 #define CLASS_LIST_NO_OBJECT_NOR_STRING_NOR_ARRAY(V)                           \
   V(Class)                                                                     \
-  V(UnresolvedClass)                                                           \
   V(PatchClass)                                                                \
   V(Function)                                                                  \
   V(ClosureData)                                                               \
@@ -34,6 +34,7 @@
   V(Namespace)                                                                 \
   V(KernelProgramInfo)                                                         \
   V(Code)                                                                      \
+  V(Bytecode)                                                                  \
   V(Instructions)                                                              \
   V(ObjectPool)                                                                \
   V(PcDescriptors)                                                             \
@@ -60,8 +61,6 @@
   V(Type)                                                                      \
   V(TypeRef)                                                                   \
   V(TypeParameter)                                                             \
-  V(BoundedType)                                                               \
-  V(MixinAppType)                                                              \
   V(Closure)                                                                   \
   V(Number)                                                                    \
   V(Integer)                                                                   \
@@ -241,6 +240,11 @@
 #undef V
 };
 
+enum class MemoryOrder {
+  kRelaxed,
+  kRelease,
+};
+
 #define SNAPSHOT_WRITER_SUPPORT()                                              \
   void WriteTo(SnapshotWriter* writer, intptr_t object_id,                     \
                Snapshot::Kind kind, bool as_reference);                        \
@@ -262,6 +266,7 @@
   friend class InterpreterHelpers;                                             \
   friend class Simulator;                                                      \
   friend class SimulatorHelpers;                                               \
+  friend class OffsetsTable;                                                   \
   DISALLOW_ALLOCATION();                                                       \
   DISALLOW_IMPLICIT_CONSTRUCTORS(Raw##object)
 
@@ -277,7 +282,9 @@
   SNAPSHOT_WRITER_SUPPORT()                                                    \
   HEAP_PROFILER_SUPPORT()                                                      \
   friend class object##SerializationCluster;                                   \
-  friend class object##DeserializationCluster;
+  friend class object##DeserializationCluster;                                 \
+  friend class Serializer;                                                     \
+  friend class Deserializer;
 
 // RawObject is the base class of all raw objects; even though it carries the
 // tags_ field not all raw objects are allocated in the heap and thus cannot
@@ -287,7 +294,7 @@
   // The tags field which is a part of the object header uses the following
   // bit fields for storing tags.
   enum TagBits {
-    kReservedBit = 0,
+    kCardRememberedBit = 0,
     kOldAndNotMarkedBit = 1,      // Incremental barrier target.
     kNewBit = 2,                  // Generational barrier target.
     kOldBit = 3,                  // Incremental barrier source.
@@ -315,7 +322,7 @@
   // The bit in the Smi tag position must be something that can be set to 0
   // for a dead filler object of either generation.
   // See Object::MakeUnusedSpaceTraversable.
-  COMPILE_ASSERT(kReservedBit == 0);
+  COMPILE_ASSERT(kCardRememberedBit == 0);
 
   COMPILE_ASSERT(kClassIdTagSize == (sizeof(classid_t) * kBitsPerByte));
 
@@ -354,6 +361,9 @@
   class ClassIdTag
       : public BitField<uint32_t, intptr_t, kClassIdTagPos, kClassIdTagSize> {};
 
+  class CardRememberedBit
+      : public BitField<uint32_t, bool, kCardRememberedBit, 1> {};
+
   class OldAndNotMarkedBit
       : public BitField<uint32_t, bool, kOldAndNotMarkedBit, 1> {};
 
@@ -388,6 +398,12 @@
     uword addr = reinterpret_cast<uword>(this);
     return (addr & kNewObjectAlignmentOffset) == kNewObjectAlignmentOffset;
   }
+  bool IsNewObjectMayBeSmi() const {
+    static const uword kNewObjectBits =
+        (kNewObjectAlignmentOffset | kHeapObjectTag);
+    const uword addr = reinterpret_cast<uword>(this);
+    return (addr & kObjectAlignmentMask) == kNewObjectBits;
+  }
   // Assumes this is a heap object.
   bool IsOldObject() const {
     ASSERT(IsHeapObject());
@@ -471,6 +487,7 @@
   }
   void SetRememberedBit() {
     ASSERT(!IsRemembered());
+    ASSERT(!IsCardRemembered());
     UpdateTagBit<OldAndNotRememberedBit>(false);
   }
   void ClearRememberedBit() {
@@ -478,6 +495,16 @@
     UpdateTagBit<OldAndNotRememberedBit>(true);
   }
 
+  bool IsCardRemembered() const {
+    return CardRememberedBit::decode(ptr()->tags_);
+  }
+  void SetCardRememberedBitUnsynchronized() {
+    ASSERT(!IsRemembered());
+    ASSERT(!IsCardRemembered());
+    uint32_t tags = ptr()->tags_;
+    ptr()->tags_ = CardRememberedBit::update(true, tags);
+  }
+
 #define DEFINE_IS_CID(clazz)                                                   \
   bool Is##clazz() const { return ((GetClassId() == k##clazz##Cid)); }
   CLASS_LIST(DEFINE_IS_CID)
@@ -685,9 +712,14 @@
   // methods below or their counterparts in Object, to ensure that the
   // write barrier is correctly applied.
 
-  template <typename type>
+  template <typename type, MemoryOrder order = MemoryOrder::kRelaxed>
   void StorePointer(type const* addr, type value) {
-    *const_cast<type*>(addr) = value;
+    if (order == MemoryOrder::kRelease) {
+      AtomicOperations::StoreRelease(const_cast<type*>(addr), value);
+    } else {
+      ASSERT(order == MemoryOrder::kRelaxed);
+      *const_cast<type*>(addr) = value;
+    }
     if (value->IsHeapObject()) {
       CheckHeapPointerStore(value, Thread::Current());
     }
@@ -717,6 +749,70 @@
         // Incremental barrier: record when a store creates an
         // old -> old-and-not-marked reference.
         ASSERT(value->IsOldObject());
+#if !defined(TARGET_ARCH_IA32)
+        if (ClassIdTag::decode(target_tags) == kInstructionsCid) {
+          // Instruction pages may be non-writable. Defer marking.
+          thread->DeferredMarkingStackAddObject(value);
+          return;
+        }
+#endif
+        if (value->TryAcquireMarkBit()) {
+          thread->MarkingStackAddObject(value);
+        }
+      }
+    }
+  }
+
+  template <typename type, MemoryOrder order = MemoryOrder::kRelaxed>
+  void StoreArrayPointer(type const* addr, type value) {
+    if (order == MemoryOrder::kRelease) {
+      AtomicOperations::StoreRelease(const_cast<type*>(addr), value);
+    } else {
+      ASSERT(order == MemoryOrder::kRelaxed);
+      *const_cast<type*>(addr) = value;
+    }
+    if (value->IsHeapObject()) {
+      CheckArrayPointerStore(addr, value, Thread::Current());
+    }
+  }
+
+  template <typename type>
+  void StoreArrayPointer(type const* addr, type value, Thread* thread) {
+    *const_cast<type*>(addr) = value;
+    if (value->IsHeapObject()) {
+      CheckArrayPointerStore(addr, value, thread);
+    }
+  }
+
+  template <typename type>
+  DART_FORCE_INLINE void CheckArrayPointerStore(type const* addr,
+                                                RawObject* value,
+                                                Thread* thread) {
+    uint32_t source_tags = this->ptr()->tags_;
+    uint32_t target_tags = value->ptr()->tags_;
+    if (((source_tags >> kBarrierOverlapShift) & target_tags &
+         thread->write_barrier_mask()) != 0) {
+      if (value->IsNewObject()) {
+        // Generational barrier: record when a store creates an
+        // old-and-not-remembered -> new reference.
+        ASSERT(!this->IsRemembered());
+        if (this->IsCardRemembered()) {
+          RememberCard(reinterpret_cast<RawObject* const*>(addr));
+        } else {
+          this->SetRememberedBit();
+          thread->StoreBufferAddObject(this);
+        }
+      } else {
+        // Incremental barrier: record when a store creates an
+        // old -> old-and-not-marked reference.
+        ASSERT(value->IsOldObject());
+#if !defined(TARGET_ARCH_IA32)
+        if (ClassIdTag::decode(target_tags) == kInstructionsCid) {
+          // Instruction pages may be non-writable. Defer marking.
+          thread->DeferredMarkingStackAddObject(value);
+          return;
+        }
+#endif
         if (value->TryAcquireMarkBit()) {
           thread->MarkingStackAddObject(value);
         }
@@ -732,6 +828,10 @@
     *const_cast<RawSmi**>(addr) = value;
   }
 
+ protected:
+  friend class StoreBufferUpdateVisitor;  // RememberCard
+  void RememberCard(RawObject* const* slot);
+
   friend class Api;
   friend class ApiMessageReader;  // GetClassId
   friend class Serializer;        // GetClassId
@@ -798,6 +898,7 @@
   friend class Precompiler;         // GetClassId
   friend class ObjectOffsetTrait;   // GetClassId
   friend class WriteBarrierUpdateVisitor;  // CheckHeapPointerStore
+  friend class OffsetsTable;
 
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject);
@@ -809,7 +910,6 @@
     kAllocated = 0,         // Initial state.
     kPreFinalized,          // VM classes: size precomputed, but no checks done.
     kFinalized,             // Class parsed, finalized and ready for use.
-    kRefinalizeAfterPatch,  // Class needs to be refinalized (patched).
   };
 
  private:
@@ -827,10 +927,9 @@
   RawLibrary* library_;
   RawTypeArguments* type_parameters_;  // Array of TypeParameter.
   RawAbstractType* super_type_;
-  RawType* mixin_;  // Generic mixin type, e.g. M<T>, not M<int>.
   RawFunction* signature_function_;  // Associated function for typedef class.
   RawArray* constants_;      // Canonicalized const instances of this class.
-  RawType* canonical_type_;  // Canonical type for this class.
+  RawType* declaration_type_;              // Declaration type for this class.
   RawArray* invocation_dispatcher_cache_;  // Cache for dispatcher functions.
   RawCode* allocation_stub_;  // Stub code for allocation of instances.
   RawGrowableObjectArray* direct_implementors_;  // Array of Class.
@@ -881,17 +980,6 @@
   friend class CidRewriteVisitor;
 };
 
-class RawUnresolvedClass : public RawObject {
-  RAW_HEAP_OBJECT_IMPLEMENTATION(UnresolvedClass);
-
-  VISIT_FROM(RawObject*, library_or_library_prefix_);
-  RawObject* library_or_library_prefix_;  // Library or library prefix qualifier
-                                          // for the ident.
-  RawString* ident_;                      // Name of the unresolved identifier.
-  VISIT_TO(RawObject*, ident_);
-  TokenPosition token_pos_;
-};
-
 class RawPatchClass : public RawObject {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(PatchClass);
@@ -1000,7 +1088,7 @@
     return reinterpret_cast<RawObject**>(&ptr()->ic_data_array_);
   }
   RawCode* code_;  // Currently active code. Accessed from generated code.
-  NOT_IN_PRECOMPILED(RawCode* bytecode_);
+  NOT_IN_PRECOMPILED(RawBytecode* bytecode_);
   NOT_IN_PRECOMPILED(RawCode* unoptimized_code_);  // Unoptimized code, keep it
                                                    // after optimization.
 #if defined(DART_PRECOMPILED_RUNTIME)
@@ -1075,6 +1163,7 @@
   RawFunction* parent_function_;  // Enclosing function of this sig. function.
   RawType* signature_type_;
   VISIT_TO(RawObject*, signature_type_);
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class Function;
 };
@@ -1088,6 +1177,7 @@
   RawString* identifier_;
   RawFunction* target_;
   VISIT_TO(RawObject*, target_);
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class RawField : public RawObject {
@@ -1151,7 +1241,7 @@
   // field.
   int8_t static_type_exactness_state_;
 
-  uint8_t kind_bits_;  // static, final, const, has initializer....
+  uint16_t kind_bits_;  // static, final, const, has initializer....
 
   friend class CidRewriteVisitor;
 };
@@ -1162,7 +1252,6 @@
     kScriptTag = 0,
     kLibraryTag,
     kSourceTag,
-    kPatchTag,
     kEvaluateTag,
     kKernelTag,
   };
@@ -1273,6 +1362,7 @@
   RawField* metadata_field_;  // remembers the token pos of metadata if any,
                               // and the metadata values if computed.
   VISIT_TO(RawObject*, metadata_field_);
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class RawKernelProgramInfo : public RawObject {
@@ -1286,6 +1376,7 @@
   RawExternalTypedData* metadata_mappings_;
   RawArray* scripts_;
   RawArray* constants_;
+  RawArray* bytecode_component_;
   RawGrowableObjectArray* potential_natives_;
   RawGrowableObjectArray* potential_pragma_functions_;
   RawExternalTypedData* constants_table_;
@@ -1338,6 +1429,7 @@
   // 'unchecked_entry_point_' will refer to the same position as 'entry_point_'.
   //
   uword unchecked_entry_point_;  // Accessed from generated code.
+  uword monomorphic_unchecked_entry_point_;  // Accessed from generated code.
 
   VISIT_FROM(RawObject*, object_pool_);
   RawObjectPool* object_pool_;     // Accessed from generated code.
@@ -1398,6 +1490,26 @@
   friend class FunctionDeserializationCluster;
 };
 
+class RawBytecode : public RawObject {
+  RAW_HEAP_OBJECT_IMPLEMENTATION(Bytecode);
+
+  VISIT_FROM(RawObject*, object_pool_);
+  RawObjectPool* object_pool_;
+  RawExternalTypedData* instructions_;
+  RawFunction* function_;
+  RawExceptionHandlers* exception_handlers_;
+  RawPcDescriptors* pc_descriptors_;
+  VISIT_TO(RawObject*, pc_descriptors_);
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+
+  intptr_t source_positions_binary_offset_;
+
+  static bool ContainsPC(RawObject* raw_obj, uword pc);
+
+  friend class Function;
+  friend class StackFrame;
+};
+
 class RawObjectPool : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(ObjectPool);
 
@@ -1429,6 +1541,7 @@
   // Instructions size in bytes and flags.
   // Currently, only flag indicates 1 or 2 entry points.
   uint32_t size_and_flags_;
+  uint32_t unchecked_entrypoint_pc_offset_;
 
 #if defined(DART_PRECOMPILER)
   // There is a gap between size_and_flags_ and the entry point
@@ -1440,8 +1553,6 @@
   CodeStatistics* stats_;
 #endif
 
-  uword unchecked_entrypoint_pc_offset_;
-
   // Variable length data follows here.
   uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
@@ -1710,6 +1821,9 @@
     // 'end' is the address just beyond the last descriptor, so step back.
     return reinterpret_cast<RawObject**>(end - kWordSize);
   }
+  RawObject** to_snapshot(Snapshot::Kind kind, intptr_t num_vars) {
+    return to(num_vars);
+  }
 
   friend class Object;
   friend class RawClosureData;
@@ -1732,6 +1846,7 @@
   RawString* target_name_;
   RawArray* args_descriptor_;
   VISIT_TO(RawObject*, args_descriptor_);
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class RawICData : public RawObject {
@@ -1781,6 +1896,7 @@
   RawString* target_name_;     // Name of target function.
   RawArray* args_descriptor_;  // Arguments descriptor.
   VISIT_TO(RawObject*, args_descriptor_)
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 
   int32_t filled_entry_count_;
 };
@@ -1816,6 +1932,8 @@
   TokenPosition token_pos_;  // Source position in script_.
   bool report_after_token_;  // Report message at or after the token.
   int8_t kind_;              // Of type Report::Kind.
+
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class RawUnhandledException : public RawError {
@@ -1825,6 +1943,7 @@
   RawInstance* exception_;
   RawInstance* stacktrace_;
   VISIT_TO(RawObject*, stacktrace_)
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class RawUnwindError : public RawError {
@@ -1902,7 +2021,6 @@
  protected:
   enum TypeState {
     kAllocated,                // Initial state.
-    kResolved,                 // Type class and type arguments resolved.
     kBeingFinalized,           // In the process of being finalized.
     kFinalizedInstantiated,    // Instantiated type ready for use.
     kFinalizedUninstantiated,  // Uninstantiated type ready for use.
@@ -1928,24 +2046,18 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(Type);
 
   VISIT_FROM(RawObject*, type_class_id_)
-  // Either the id of the resolved class as a Smi or an UnresolvedClass.
-  RawObject* type_class_id_;
+  RawSmi* type_class_id_;
   RawTypeArguments* arguments_;
   RawSmi* hash_;
   // This type object represents a function type if its signature field is a
   // non-null function object.
-  // If this type is malformed or malbounded, the signature field gets
-  // overwritten by the error object in order to save space. If the type is a
-  // function type, its signature is lost, but the message in the error object
-  // can describe the issue without needing the signature.
-  union {
-    RawFunction* signature_;   // If not null, this type is a function type.
-    RawLanguageError* error_;  // If not null, type is malformed or malbounded.
-  } sig_or_err_;
-  VISIT_TO(RawObject*, sig_or_err_.error_)
+  RawFunction* signature_;  // If not null, this type is a function type.
+  VISIT_TO(RawObject*, signature_)
   TokenPosition token_pos_;
   int8_t type_state_;
 
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+
   friend class CidRewriteVisitor;
   friend class RawTypeArguments;
 };
@@ -1957,6 +2069,7 @@
   VISIT_FROM(RawObject*, type_)
   RawAbstractType* type_;  // The referenced type.
   VISIT_TO(RawObject*, type_)
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 };
 
 class RawTypeParameter : public RawAbstractType {
@@ -1974,31 +2087,11 @@
   int16_t index_;
   int8_t type_state_;
 
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+
   friend class CidRewriteVisitor;
 };
 
-class RawBoundedType : public RawAbstractType {
- private:
-  RAW_HEAP_OBJECT_IMPLEMENTATION(BoundedType);
-
-  VISIT_FROM(RawObject*, type_);
-  RawAbstractType* type_;
-  RawAbstractType* bound_;
-  RawSmi* hash_;
-  RawTypeParameter* type_parameter_;  // For more detailed error reporting.
-  VISIT_TO(RawObject*, type_parameter_);
-};
-
-class RawMixinAppType : public RawAbstractType {
- private:
-  RAW_HEAP_OBJECT_IMPLEMENTATION(MixinAppType);
-
-  VISIT_FROM(RawObject*, super_type_);
-  RawAbstractType* super_type_;
-  RawArray* mixin_types_;  // Array of AbstractType.
-  VISIT_TO(RawObject*, mixin_types_);
-};
-
 class RawClosure : public RawInstance {
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Closure);
@@ -2018,6 +2111,8 @@
 
   VISIT_TO(RawCompressed, hash_)
 
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
+
   // Note that instantiator_type_arguments_, function_type_arguments_ and
   // delayed_type_arguments_ are used to instantiate the signature of function_
   // when this closure is involved in a type test. In other words, these fields
@@ -2164,6 +2259,7 @@
 
   friend class LinkedHashMapSerializationCluster;
   friend class LinkedHashMapDeserializationCluster;
+  friend class CodeDeserializationCluster;
   friend class Deserializer;
   friend class RawCode;
   friend class RawImmutableArray;
@@ -2174,6 +2270,8 @@
   friend class Object;
   friend class ICData;            // For high performance access.
   friend class SubtypeTestCache;  // For high performance access.
+
+  friend class HeapPage;
 };
 
 class RawImmutableArray : public RawArray {
@@ -2190,6 +2288,7 @@
   RawSmi* length_;
   RawArray* data_;
   VISIT_TO(RawCompressed, data_)
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class SnapshotReader;
 };
@@ -2297,6 +2396,8 @@
   VISIT_TO(RawCompressed, length_)
 
   uint8_t* data_;
+
+  friend class RawBytecode;
 };
 
 // VM implementations of the basic types in the isolate.
@@ -2336,6 +2437,7 @@
   RawArray* code_array_;       // Code object for each frame in the stack trace.
   RawArray* pc_offset_array_;  // Offset of PC for each frame.
   VISIT_TO(RawObject*, pc_offset_array_)
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // False for pre-allocated stack trace (used in OOM and Stack overflow).
   bool expand_inlined_;
@@ -2369,6 +2471,7 @@
   RawFunction* external_one_byte_sticky_function_;
   RawFunction* external_two_byte_sticky_function_;
   VISIT_TO(RawObject*, external_two_byte_sticky_function_)
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 
   intptr_t num_registers_;
 
@@ -2385,6 +2488,7 @@
   RawObject* key_;
   RawObject* value_;
   VISIT_TO(RawObject*, value_)
+  RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
 
   // Linked list is chaining all pending weak properties.
   // Untyped to make it clear that it is not to be visited by GC.
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
new file mode 100644
index 0000000..03cbffb
--- /dev/null
+++ b/runtime/vm/raw_object_fields.cc
@@ -0,0 +1,212 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/raw_object_fields.h"
+
+namespace dart {
+
+#if defined(DART_PRECOMPILER)
+
+#define RAW_CLASSES_AND_FIELDS(F)                                              \
+  F(Class, name_)                                                              \
+  F(Class, user_name_)                                                         \
+  F(Class, functions_)                                                         \
+  F(Class, functions_hash_table_)                                              \
+  F(Class, fields_)                                                            \
+  F(Class, offset_in_words_to_field_)                                          \
+  F(Class, interfaces_)                                                        \
+  F(Class, script_)                                                            \
+  F(Class, library_)                                                           \
+  F(Class, type_parameters_)                                                   \
+  F(Class, super_type_)                                                        \
+  F(Class, signature_function_)                                                \
+  F(Class, constants_)                                                         \
+  F(Class, declaration_type_)                                                  \
+  F(Class, invocation_dispatcher_cache_)                                       \
+  F(Class, allocation_stub_)                                                   \
+  F(Class, direct_implementors_)                                               \
+  F(Class, direct_subclasses_)                                                 \
+  F(Class, dependent_code_)                                                    \
+  F(PatchClass, patched_class_)                                                \
+  F(PatchClass, origin_class_)                                                 \
+  F(PatchClass, script_)                                                       \
+  F(PatchClass, library_kernel_data_)                                          \
+  F(Function, name_)                                                           \
+  F(Function, owner_)                                                          \
+  F(Function, result_type_)                                                    \
+  F(Function, parameter_types_)                                                \
+  F(Function, parameter_names_)                                                \
+  F(Function, type_parameters_)                                                \
+  F(Function, data_)                                                           \
+  F(Function, ic_data_array_)                                                  \
+  F(Function, code_)                                                           \
+  F(ClosureData, context_scope_)                                               \
+  F(ClosureData, parent_function_)                                             \
+  F(ClosureData, signature_type_)                                              \
+  F(ClosureData, closure_)                                                     \
+  F(SignatureData, parent_function_)                                           \
+  F(SignatureData, signature_type_)                                            \
+  F(RedirectionData, type_)                                                    \
+  F(RedirectionData, identifier_)                                              \
+  F(RedirectionData, target_)                                                  \
+  F(Field, name_)                                                              \
+  F(Field, owner_)                                                             \
+  F(Field, type_)                                                              \
+  F(Field, guarded_list_length_)                                               \
+  F(Field, dependent_code_)                                                    \
+  F(Field, type_test_cache_)                                                   \
+  F(Script, url_)                                                              \
+  F(Script, resolved_url_)                                                     \
+  F(Script, compile_time_constants_)                                           \
+  F(Script, line_starts_)                                                      \
+  F(Script, debug_positions_)                                                  \
+  F(Script, yield_positions_)                                                  \
+  F(Script, kernel_program_info_)                                              \
+  F(Script, source_)                                                           \
+  F(Library, name_)                                                            \
+  F(Library, url_)                                                             \
+  F(Library, private_key_)                                                     \
+  F(Library, dictionary_)                                                      \
+  F(Library, metadata_)                                                        \
+  F(Library, toplevel_class_)                                                  \
+  F(Library, patch_classes_)                                                   \
+  F(Library, imports_)                                                         \
+  F(Library, exports_)                                                         \
+  F(Library, load_error_)                                                      \
+  F(Library, kernel_data_)                                                     \
+  F(Library, resolved_names_)                                                  \
+  F(Library, exported_names_)                                                  \
+  F(Library, loaded_scripts_)                                                  \
+  F(Namespace, library_)                                                       \
+  F(Namespace, show_names_)                                                    \
+  F(Namespace, hide_names_)                                                    \
+  F(Namespace, metadata_field_)                                                \
+  F(KernelProgramInfo, string_offsets_)                                        \
+  F(KernelProgramInfo, string_data_)                                           \
+  F(KernelProgramInfo, canonical_names_)                                       \
+  F(KernelProgramInfo, metadata_payloads_)                                     \
+  F(KernelProgramInfo, metadata_mappings_)                                     \
+  F(KernelProgramInfo, scripts_)                                               \
+  F(KernelProgramInfo, constants_)                                             \
+  F(KernelProgramInfo, bytecode_component_)                                    \
+  F(KernelProgramInfo, potential_natives_)                                     \
+  F(KernelProgramInfo, potential_pragma_functions_)                            \
+  F(KernelProgramInfo, constants_table_)                                       \
+  F(KernelProgramInfo, libraries_cache_)                                       \
+  F(KernelProgramInfo, classes_cache_)                                         \
+  F(Code, object_pool_)                                                        \
+  F(Code, instructions_)                                                       \
+  F(Code, owner_)                                                              \
+  F(Code, exception_handlers_)                                                 \
+  F(Code, pc_descriptors_)                                                     \
+  F(Code, stackmaps_)                                                          \
+  F(Code, inlined_id_to_function_)                                             \
+  F(Code, code_source_map_)                                                    \
+  F(Bytecode, object_pool_)                                                    \
+  F(Bytecode, instructions_)                                                   \
+  F(Bytecode, function_)                                                       \
+  F(Bytecode, exception_handlers_)                                             \
+  F(Bytecode, pc_descriptors_)                                                 \
+  F(ExceptionHandlers, handled_types_data_)                                    \
+  F(Context, parent_)                                                          \
+  F(SingleTargetCache, target_)                                                \
+  F(UnlinkedCall, target_name_)                                                \
+  F(UnlinkedCall, args_descriptor_)                                            \
+  F(ICData, ic_data_)                                                          \
+  F(ICData, target_name_)                                                      \
+  F(ICData, args_descriptor_)                                                  \
+  F(ICData, owner_)                                                            \
+  F(MegamorphicCache, buckets_)                                                \
+  F(MegamorphicCache, mask_)                                                   \
+  F(MegamorphicCache, target_name_)                                            \
+  F(MegamorphicCache, args_descriptor_)                                        \
+  F(SubtypeTestCache, cache_)                                                  \
+  F(ApiError, message_)                                                        \
+  F(LanguageError, previous_error_)                                            \
+  F(LanguageError, script_)                                                    \
+  F(LanguageError, message_)                                                   \
+  F(LanguageError, formatted_message_)                                         \
+  F(UnhandledException, exception_)                                            \
+  F(UnhandledException, stacktrace_)                                           \
+  F(UnwindError, message_)                                                     \
+  F(LibraryPrefix, name_)                                                      \
+  F(LibraryPrefix, importer_)                                                  \
+  F(LibraryPrefix, imports_)                                                   \
+  F(LibraryPrefix, dependent_code_)                                            \
+  F(TypeArguments, instantiations_)                                            \
+  F(TypeArguments, length_)                                                    \
+  F(TypeArguments, hash_)                                                      \
+  F(Type, type_class_id_)                                                      \
+  F(Type, arguments_)                                                          \
+  F(Type, hash_)                                                               \
+  F(Type, signature_)                                                          \
+  F(TypeRef, type_)                                                            \
+  F(TypeParameter, name_)                                                      \
+  F(TypeParameter, hash_)                                                      \
+  F(TypeParameter, bound_)                                                     \
+  F(TypeParameter, parameterized_function_)                                    \
+  F(Closure, instantiator_type_arguments_)                                     \
+  F(Closure, function_type_arguments_)                                         \
+  F(Closure, delayed_type_arguments_)                                          \
+  F(Closure, function_)                                                        \
+  F(Closure, context_)                                                         \
+  F(Closure, hash_)                                                            \
+  F(String, length_)                                                           \
+  F(String, hash_)                                                             \
+  F(Array, type_arguments_)                                                    \
+  F(Array, length_)                                                            \
+  F(GrowableObjectArray, type_arguments_)                                      \
+  F(GrowableObjectArray, length_)                                              \
+  F(GrowableObjectArray, data_)                                                \
+  F(LinkedHashMap, type_arguments_)                                            \
+  F(LinkedHashMap, index_)                                                     \
+  F(LinkedHashMap, hash_mask_)                                                 \
+  F(LinkedHashMap, data_)                                                      \
+  F(LinkedHashMap, used_data_)                                                 \
+  F(LinkedHashMap, deleted_keys_)                                              \
+  F(TypedData, length_)                                                        \
+  F(ExternalTypedData, length_)                                                \
+  F(ReceivePort, send_port_)                                                   \
+  F(ReceivePort, handler_)                                                     \
+  F(StackTrace, async_link_)                                                   \
+  F(StackTrace, code_array_)                                                   \
+  F(StackTrace, pc_offset_array_)                                              \
+  F(RegExp, num_bracket_expressions_)                                          \
+  F(RegExp, pattern_)                                                          \
+  F(RegExp, external_one_byte_function_)                                       \
+  F(RegExp, external_two_byte_function_)                                       \
+  F(RegExp, external_one_byte_sticky_function_)                                \
+  F(RegExp, external_two_byte_sticky_function_)                                \
+  F(WeakProperty, key_)                                                        \
+  F(WeakProperty, value_)                                                      \
+  F(MirrorReference, referent_)                                                \
+  F(UserTag, label_)
+
+OffsetsTable::OffsetsTable(Zone* zone) : cached_offsets_(zone) {
+  for (intptr_t i = 0; offsets_table[i].class_id != -1; ++i) {
+    OffsetsTableEntry entry = offsets_table[i];
+    cached_offsets_.Insert({{entry.class_id, entry.offset}, entry.field_name});
+  }
+}
+
+const char* OffsetsTable::FieldNameForOffset(intptr_t class_id,
+                                             intptr_t offset) {
+  return cached_offsets_.LookupValue({class_id, offset});
+}
+
+#define DEFINE_OFFSETS_TABLE_ENTRY(class_name, field_name)                     \
+  {class_name::kClassId, #field_name, OFFSET_OF(Raw##class_name, field_name)},
+
+// clang-format off
+OffsetsTable::OffsetsTableEntry OffsetsTable::offsets_table[] = {
+    RAW_CLASSES_AND_FIELDS(DEFINE_OFFSETS_TABLE_ENTRY)
+    {-1, nullptr, -1}
+};
+// clang-format on
+
+#undef DEFINE_OFFSETS_TABLE_ENTRY
+
+#endif
+
+}  // namespace dart
diff --git a/runtime/vm/raw_object_fields.h b/runtime/vm/raw_object_fields.h
new file mode 100644
index 0000000..9f67643
--- /dev/null
+++ b/runtime/vm/raw_object_fields.h
@@ -0,0 +1,78 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// This file (and "raw_object_fields.cc") provide a kind of reflection that
+// allows us to identify the name of fields in hand-written "Raw..." classes
+// (from "raw_object.h") given the class and the offset within the object. This
+// is used for example by the snapshot profile writer ("v8_snapshot_writer.h")
+// to show the property names of these built-in objects in the snapshot profile.
+
+#ifndef RUNTIME_VM_RAW_OBJECT_FIELDS_H_
+#define RUNTIME_VM_RAW_OBJECT_FIELDS_H_
+
+#include <utility>
+
+#include "vm/hash_map.h"
+#include "vm/object.h"
+#include "vm/raw_object.h"
+
+namespace dart {
+
+#if defined(DART_PRECOMPILER)
+
+class OffsetsTable : public ZoneAllocated {
+ public:
+  explicit OffsetsTable(Zone* zone);
+
+  // Returns 'nullptr' if no offset was found.
+  // Otherwise, the returned string is allocated in global static memory.
+  const char* FieldNameForOffset(intptr_t cid, intptr_t offset);
+
+ private:
+  struct OffsetsTableEntry {
+    const intptr_t class_id;
+    const char* field_name;
+    intptr_t offset;
+  };
+
+  static OffsetsTableEntry offsets_table[];
+
+  struct IntAndIntToStringMapTraits {
+    typedef std::pair<intptr_t, intptr_t> Key;
+    typedef const char* Value;
+
+    struct Pair {
+      Key key;
+      Value value;
+      Pair() : key({-1, -1}), value(nullptr) {}
+      Pair(Key k, Value v) : key(k), value(v) {}
+    };
+
+    static Value ValueOf(Pair pair) { return pair.value; }
+    static Key KeyOf(Pair pair) { return pair.key; }
+    static size_t Hashcode(Key key) { return key.first ^ key.second; }
+    static bool IsKeyEqual(Pair x, Key y) {
+      return x.key.first == y.first && x.key.second == y.second;
+    }
+  };
+
+  DirectChainedHashMap<IntAndIntToStringMapTraits> cached_offsets_;
+};
+
+#else
+
+class OffsetsTable : public ZoneAllocated {
+ public:
+  explicit OffsetsTable(Zone* zone) {}
+
+  const char* FieldNameForOffset(intptr_t cid, intptr_t offset) {
+    return nullptr;
+  }
+};
+
+#endif
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_RAW_OBJECT_FIELDS_H_
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 94366af..286beb6 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -72,50 +72,6 @@
   }
 }
 
-RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader,
-                                              intptr_t object_id,
-                                              intptr_t tags,
-                                              Snapshot::Kind kind,
-                                              bool as_reference) {
-  ASSERT(reader != NULL);
-
-  // Allocate unresolved class object.
-  UnresolvedClass& unresolved_class =
-      UnresolvedClass::ZoneHandle(reader->zone(), UnresolvedClass::New());
-  reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized);
-
-  // Set all non object fields.
-  unresolved_class.set_token_pos(
-      TokenPosition::SnapshotDecode(reader->Read<int32_t>()));
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(unresolved_class, unresolved_class.raw()->from(),
-                     unresolved_class.raw()->to(), kAsReference);
-
-  return unresolved_class.raw();
-}
-
-void RawUnresolvedClass::WriteTo(SnapshotWriter* writer,
-                                 intptr_t object_id,
-                                 Snapshot::Kind kind,
-                                 bool as_reference) {
-  ASSERT(writer != NULL);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteVMIsolateObject(kUnresolvedClassCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the non object pointer fields.
-  writer->Write<int32_t>(ptr()->token_pos_.SnapshotEncode());
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to());
-}
-
 RawAbstractType* AbstractType::ReadFrom(SnapshotReader* reader,
                                         intptr_t object_id,
                                         intptr_t tags,
@@ -341,62 +297,6 @@
   writer->WriteObjectImpl(param_class, kAsReference);
 }
 
-RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader,
-                                      intptr_t object_id,
-                                      intptr_t tags,
-                                      Snapshot::Kind kind,
-                                      bool as_reference) {
-  ASSERT(reader != NULL);
-
-  // Allocate bounded type object.
-  BoundedType& bounded_type =
-      BoundedType::ZoneHandle(reader->zone(), BoundedType::New());
-  reader->AddBackRef(object_id, &bounded_type, kIsDeserialized);
-
-  // Read the code object for the type testing stub and set its entrypoint.
-  reader->EnqueueTypePostprocessing(bounded_type);
-
-  // Set all the object fields.
-  READ_OBJECT_FIELDS(bounded_type, bounded_type.raw()->from(),
-                     bounded_type.raw()->to(), kAsReference);
-
-  return bounded_type.raw();
-}
-
-void RawBoundedType::WriteTo(SnapshotWriter* writer,
-                             intptr_t object_id,
-                             Snapshot::Kind kind,
-                             bool as_reference) {
-  ASSERT(writer != NULL);
-
-  // Write out the serialization header value for this object.
-  writer->WriteInlinedObjectHeader(object_id);
-
-  // Write out the class and tags information.
-  writer->WriteIndexedObject(kBoundedTypeCid);
-  writer->WriteTags(writer->GetObjectTags(this));
-
-  // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer, kAsReference);
-  visitor.VisitPointers(from(), to());
-}
-
-RawMixinAppType* MixinAppType::ReadFrom(SnapshotReader* reader,
-                                        intptr_t object_id,
-                                        intptr_t tags,
-                                        Snapshot::Kind kind,
-                                        bool as_reference) {
-  UNREACHABLE();  // MixinAppType objects do not survive finalization.
-  return MixinAppType::null();
-}
-
-void RawMixinAppType::WriteTo(SnapshotWriter* writer,
-                              intptr_t object_id,
-                              Snapshot::Kind kind,
-                              bool as_reference) {
-  UNREACHABLE();  // MixinAppType objects do not survive finalization.
-}
-
 RawTypeArguments* TypeArguments::ReadFrom(SnapshotReader* reader,
                                           intptr_t object_id,
                                           intptr_t tags,
@@ -695,6 +595,22 @@
   UNREACHABLE();
 }
 
+RawBytecode* Bytecode::ReadFrom(SnapshotReader* reader,
+                                intptr_t object_id,
+                                intptr_t tags,
+                                Snapshot::Kind kind,
+                                bool as_reference) {
+  UNREACHABLE();
+  return Bytecode::null();
+}
+
+void RawBytecode::WriteTo(SnapshotWriter* writer,
+                          intptr_t object_id,
+                          Snapshot::Kind kind,
+                          bool as_reference) {
+  UNREACHABLE();
+}
+
 RawInstructions* Instructions::ReadFrom(SnapshotReader* reader,
                                         intptr_t object_id,
                                         intptr_t tags,
@@ -1982,67 +1898,51 @@
   ASSERT(writer != NULL);
   intptr_t cid = this->GetClassId();
   intptr_t length = Smi::Value(ptr()->length_);  // In elements.
-  intptr_t internal_cid;
   intptr_t bytes;
   switch (cid) {
     case kExternalTypedDataInt8ArrayCid:
-      internal_cid = kTypedDataInt8ArrayCid;
       bytes = length * sizeof(int8_t);
       break;
     case kExternalTypedDataUint8ArrayCid:
-      internal_cid = kTypedDataUint8ArrayCid;
       bytes = length * sizeof(uint8_t);
       break;
     case kExternalTypedDataUint8ClampedArrayCid:
-      internal_cid = kTypedDataUint8ClampedArrayCid;
       bytes = length * sizeof(uint8_t);
       break;
     case kExternalTypedDataInt16ArrayCid:
-      internal_cid = kTypedDataInt16ArrayCid;
       bytes = length * sizeof(int16_t);
       break;
     case kExternalTypedDataUint16ArrayCid:
-      internal_cid = kTypedDataUint16ArrayCid;
       bytes = length * sizeof(uint16_t);
       break;
     case kExternalTypedDataInt32ArrayCid:
-      internal_cid = kTypedDataInt32ArrayCid;
       bytes = length * sizeof(int32_t);
       break;
     case kExternalTypedDataUint32ArrayCid:
-      internal_cid = kTypedDataUint32ArrayCid;
       bytes = length * sizeof(uint32_t);
       break;
     case kExternalTypedDataInt64ArrayCid:
-      internal_cid = kTypedDataInt64ArrayCid;
       bytes = length * sizeof(int64_t);
       break;
     case kExternalTypedDataUint64ArrayCid:
-      internal_cid = kTypedDataUint64ArrayCid;
       bytes = length * sizeof(uint64_t);
       break;
     case kExternalTypedDataFloat32ArrayCid:
-      internal_cid = kTypedDataFloat32ArrayCid;
       bytes = length * sizeof(float);  // NOLINT.
       break;
     case kExternalTypedDataFloat64ArrayCid:
-      internal_cid = kTypedDataFloat64ArrayCid,
       bytes = length * sizeof(double);  // NOLINT.
       break;
     case kExternalTypedDataInt32x4ArrayCid:
-      internal_cid = kTypedDataInt32x4ArrayCid;
       bytes = length * sizeof(int32_t) * 4;
       break;
     case kExternalTypedDataFloat32x4ArrayCid:
-      internal_cid = kTypedDataFloat32x4ArrayCid;
       bytes = length * sizeof(float) * 4;
       break;
     case kExternalTypedDataFloat64x2ArrayCid:
-      internal_cid = kTypedDataFloat64x2ArrayCid;
       bytes = length * sizeof(double) * 2;
       break;
     default:
-      internal_cid = kIllegalCid;
       bytes = 0;
       UNREACHABLE();
   }
diff --git a/runtime/vm/regexp_assembler_bytecode.cc b/runtime/vm/regexp_assembler_bytecode.cc
index 01a5259..3847c62 100644
--- a/runtime/vm/regexp_assembler_bytecode.cc
+++ b/runtime/vm/regexp_assembler_bytecode.cc
@@ -430,10 +430,9 @@
 
     const bool multiline = regexp.is_multi_line();
     RegExpCompileData* compile_data = new (zone) RegExpCompileData();
-    if (!RegExpParser::ParseRegExp(pattern, multiline, compile_data)) {
-      // Parsing failures are handled in the RegExp factory constructor.
-      UNREACHABLE();
-    }
+
+    // Parsing failures are handled in the RegExp factory constructor.
+    RegExpParser::ParseRegExp(pattern, multiline, compile_data);
 
     regexp.set_num_bracket_expressions(compile_data->capture_count);
     if (compile_data->simple) {
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index aa69b57..888061d 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -11,6 +11,7 @@
 #include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/compiler/jit/compiler.h"
 #include "vm/dart_entry.h"
+#include "vm/longjump.h"
 #include "vm/object_store.h"
 #include "vm/regexp.h"
 #include "vm/resolver.h"
@@ -321,6 +322,9 @@
 
   const Object& retval =
       Object::Handle(zone, DartEntry::InvokeFunction(fun, args));
+  if (retval.IsUnwindError()) {
+    Exceptions::PropagateError(Error::Cast(retval));
+  }
   if (retval.IsError()) {
     const Error& error = Error::Cast(retval);
     OS::PrintErr("%s\n", error.ToErrorCString());
@@ -385,9 +389,14 @@
       regexp_class.LookupStaticFieldAllowPrivate(Symbols::_wordCharacterMap()));
   ASSERT(!word_character_field.IsNull());
 
+  DEBUG_ASSERT(Thread::Current()->TopErrorHandlerIsSetJump());
   if (word_character_field.IsUninitialized()) {
     ASSERT(!Compiler::IsBackgroundCompilation());
-    word_character_field.EvaluateInitializer();
+    const Error& error =
+        Error::Handle(Z, word_character_field.EvaluateInitializer());
+    if (!error.IsNull()) {
+      Report::LongJump(error);
+    }
   }
   ASSERT(!word_character_field.IsUninitialized());
 
diff --git a/runtime/vm/regexp_parser.cc b/runtime/vm/regexp_parser.cc
index bd6b1e3..cbe851c 100644
--- a/runtime/vm/regexp_parser.cc
+++ b/runtime/vm/regexp_parser.cc
@@ -190,7 +190,6 @@
 
 RegExpParser::RegExpParser(const String& in, String* error, bool multiline)
     : zone_(Thread::Current()->zone()),
-      error_(error),
       captures_(NULL),
       in_(in),
       current_(kEndMarker),
@@ -200,8 +199,7 @@
       multiline_(multiline),
       simple_(false),
       contains_anchor_(false),
-      is_scanned_for_captures_(false),
-      failed_(false) {
+      is_scanned_for_captures_(false) {
   Advance();
 }
 
@@ -239,14 +237,16 @@
 }
 
 void RegExpParser::ReportError(const char* message) {
-  failed_ = true;
-  *error_ = String::New(message);
   // Zip to the end to make sure the no more input is read.
   current_ = kEndMarker;
   next_pos_ = in().Length();
 
-  const Error& error = Error::Handle(LanguageError::New(*error_));
-  Report::LongJump(error);
+  // Throw a FormatException on parsing failures.
+  const String& msg = String::Handle(
+      String::Concat(String::Handle(String::New(message)), in()));
+  const Array& args = Array::Handle(Array::New(1));
+  args.SetAt(0, msg);
+  Exceptions::ThrowByType(Exceptions::kFormat, args);
   UNREACHABLE();
 }
 
@@ -1012,34 +1012,20 @@
 // ----------------------------------------------------------------------------
 // The Parser interface.
 
-bool RegExpParser::ParseRegExp(const String& input,
+void RegExpParser::ParseRegExp(const String& input,
                                bool multiline,
                                RegExpCompileData* result) {
   ASSERT(result != NULL);
-  LongJumpScope jump;
   RegExpParser parser(input, &result->error, multiline);
-  if (setjmp(*jump.Set()) == 0) {
-    RegExpTree* tree = parser.ParsePattern();
-    ASSERT(tree != NULL);
-    ASSERT(result->error.IsNull());
-    result->tree = tree;
-    intptr_t capture_count = parser.captures_started();
-    result->simple = tree->IsAtom() && parser.simple() && capture_count == 0;
-    result->contains_anchor = parser.contains_anchor();
-    result->capture_count = capture_count;
-  } else {
-    ASSERT(!result->error.IsNull());
-    Thread::Current()->clear_sticky_error();
-
-    // Throw a FormatException on parsing failures.
-    const String& message =
-        String::Handle(String::Concat(result->error, input));
-    const Array& args = Array::Handle(Array::New(1));
-    args.SetAt(0, message);
-
-    Exceptions::ThrowByType(Exceptions::kFormat, args);
-  }
-  return !parser.failed();
+  // Throws an exception if 'input' is not valid.
+  RegExpTree* tree = parser.ParsePattern();
+  ASSERT(tree != NULL);
+  ASSERT(result->error.IsNull());
+  result->tree = tree;
+  intptr_t capture_count = parser.captures_started();
+  result->simple = tree->IsAtom() && parser.simple() && capture_count == 0;
+  result->contains_anchor = parser.contains_anchor();
+  result->capture_count = capture_count;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/regexp_parser.h b/runtime/vm/regexp_parser.h
index 6536fde..51e44c5 100644
--- a/runtime/vm/regexp_parser.h
+++ b/runtime/vm/regexp_parser.h
@@ -53,7 +53,7 @@
  public:
   RegExpParser(const String& in, String* error, bool multiline_mode);
 
-  static bool ParseRegExp(const String& input,
+  static void ParseRegExp(const String& input,
                           bool multiline,
                           RegExpCompileData* result);
 
@@ -97,7 +97,6 @@
     return captures_ == NULL ? 0 : captures_->length();
   }
   intptr_t position() { return next_pos_ - 1; }
-  bool failed() { return failed_; }
 
   static const intptr_t kMaxCaptures = 1 << 16;
   static const uint32_t kEndMarker = (1 << 21);
@@ -154,7 +153,6 @@
   void ScanForCaptures();
 
   Zone* zone_;
-  String* error_;
   ZoneGrowableArray<RegExpCapture*>* captures_;
   const String& in_;
   uint32_t current_;
@@ -166,7 +164,6 @@
   bool simple_;
   bool contains_anchor_;
   bool is_scanned_for_captures_;
-  bool failed_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/report.cc b/runtime/vm/report.cc
index f681530..5d0c407 100644
--- a/runtime/vm/report.cc
+++ b/runtime/vm/report.cc
@@ -30,12 +30,6 @@
     case kError:
       message_header = "error";
       break;
-    case kMalformedType:
-      message_header = "malformed type";
-      break;
-    case kMalboundedType:
-      message_header = "malbounded type";
-      break;
     case kBailout:
       message_header = "bailout";
       break;
@@ -120,6 +114,14 @@
                        TokenPosition token_pos,
                        const char* format,
                        va_list args) {
+  // If an isolate is being killed a [UnwindError] will be propagated up the
+  // stack. In such a case we cannot wrap the unwind error in a new
+  // [LanguageError]. Instead we simply continue propagating the [UnwindError]
+  // upwards.
+  if (prev_error.IsUnwindError()) {
+    LongJump(prev_error);
+    UNREACHABLE();
+  }
   const Error& error = Error::Handle(LanguageError::NewFormattedV(
       prev_error, script, token_pos, Report::AtLocation, kError, Heap::kOld,
       format, args));
diff --git a/runtime/vm/report.h b/runtime/vm/report.h
index 00d45bd..30aaf5c 100644
--- a/runtime/vm/report.h
+++ b/runtime/vm/report.h
@@ -23,8 +23,6 @@
   enum Kind {
     kWarning,
     kError,
-    kMalformedType,
-    kMalboundedType,
     kBailout,
   };
 
@@ -32,19 +30,19 @@
   static const bool AfterLocation = true;
 
   // Report an already formatted error via a long jump.
-  static void LongJump(const Error& error);
+  DART_NORETURN static void LongJump(const Error& error);
 
   // Concatenate and report an already formatted error and a new error message.
-  static void LongJumpF(const Error& prev_error,
-                        const Script& script,
-                        TokenPosition token_pos,
-                        const char* format,
-                        ...) PRINTF_ATTRIBUTE(4, 5);
-  static void LongJumpV(const Error& prev_error,
-                        const Script& script,
-                        TokenPosition token_pos,
-                        const char* format,
-                        va_list args);
+  DART_NORETURN static void LongJumpF(const Error& prev_error,
+                                      const Script& script,
+                                      TokenPosition token_pos,
+                                      const char* format,
+                                      ...) PRINTF_ATTRIBUTE(4, 5);
+  DART_NORETURN static void LongJumpV(const Error& prev_error,
+                                      const Script& script,
+                                      TokenPosition token_pos,
+                                      const char* format,
+                                      va_list args);
 
   // Report a warning/jswarning/error/bailout message.
   static void MessageF(Kind kind,
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index 7c452bc..2c06da9 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -86,6 +86,8 @@
   ReusableClassHandleScope reused_class_handle(thread);
 #define REUSABLE_CODE_HANDLESCOPE(thread)                                      \
   ReusableCodeHandleScope reused_code_handle(thread);
+#define REUSABLE_BYTECODE_HANDLESCOPE(thread)                                  \
+  ReusableBytecodeHandleScope reused_bytecode_handle(thread);
 #define REUSABLE_ERROR_HANDLESCOPE(thread)                                     \
   ReusableErrorHandleScope reused_error_handle(thread);
 #define REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread)                        \
diff --git a/runtime/vm/reverse_pc_lookup_cache.cc b/runtime/vm/reverse_pc_lookup_cache.cc
new file mode 100644
index 0000000..325d98f
--- /dev/null
+++ b/runtime/vm/reverse_pc_lookup_cache.cc
@@ -0,0 +1,56 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/reverse_pc_lookup_cache.h"
+
+#include "vm/isolate.h"
+
+namespace dart {
+
+#if defined(DART_PRECOMPILED_RUNTIME)
+
+static uword BeginPcFromCode(const RawCode* code) {
+  auto instr = Code::InstructionsOf(code);
+  return Instructions::PayloadStart(instr);
+}
+
+static uword EndPcFromCode(const RawCode* code) {
+  auto instr = Code::InstructionsOf(code);
+  return Instructions::PayloadStart(instr) + Instructions::Size(instr);
+}
+
+void ReversePcLookupCache::BuildAndAttachToIsolate(Isolate* isolate) {
+  auto object_store = isolate->object_store();
+  auto& array = Array::Handle(object_store->code_order_table());
+  if (!array.IsNull()) {
+    const intptr_t length = array.Length();
+    {
+      NoSafepointScope no_safepoint_scope;
+
+      const uword begin =
+          BeginPcFromCode(reinterpret_cast<RawCode*>(array.At(0)));
+      const uword end =
+          EndPcFromCode(reinterpret_cast<RawCode*>(array.At(length - 1)));
+
+      auto pc_array = new uint32_t[length];
+      for (intptr_t i = 0; i < length; i++) {
+        const auto end_pc =
+            EndPcFromCode(reinterpret_cast<RawCode*>(array.At(i)));
+        pc_array[i] = end_pc - begin;
+      }
+#if defined(DEBUG)
+      for (intptr_t i = 1; i < length; i++) {
+        ASSERT(pc_array[i - 1] <= pc_array[i]);
+      }
+#endif  // defined(DEBUG)
+      auto cache =
+          new ReversePcLookupCache(isolate, pc_array, length, begin, end);
+      isolate->set_reverse_pc_lookup_cache(cache);
+    }
+  }
+}
+
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+
+}  // namespace dart
diff --git a/runtime/vm/reverse_pc_lookup_cache.h b/runtime/vm/reverse_pc_lookup_cache.h
new file mode 100644
index 0000000..8300b62
--- /dev/null
+++ b/runtime/vm/reverse_pc_lookup_cache.h
@@ -0,0 +1,126 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_REVERSE_PC_LOOKUP_CACHE_H_
+#define RUNTIME_VM_REVERSE_PC_LOOKUP_CACHE_H_
+
+#include "vm/allocation.h"
+#include "vm/growable_array.h"
+#include "vm/object.h"
+#include "vm/object_store.h"
+
+namespace dart {
+
+class Isolate;
+
+#if defined(DART_PRECOMPILED_RUNTIME)
+
+// A cache for looking up a Code object based on pc (currently the cache is
+// implemented as a binary-searchable uint32 array)
+//
+// If an AOT snapshot was created with --use_bare_instructions the isolate's
+// object store will contain a `code_order_table` - which is a sorted array
+// of [Code] objects.  The order is based on addresses of the code's
+// instructions in memory.
+//
+// For a binary search we would need to touch O(log(array-size)) array entries,
+// code objects and instruction objects.
+//
+// To avoid this we make another uint32 array which is initialized from the end
+// PCs of the instructions (relative to the start pc of the first instruction
+// object).
+//
+// We have the following invariants:
+//
+//   BeginPcFromCode(code_array[0]) <= pc_array[0]
+//   pc_array[i] == EndPcFromCode(code_array[i])
+//   pc_array[i] <= pc_array[i+1]
+//
+// The lookup will then do a binary search in pc_array. The index can then be
+// used in the `code_order_table` of the object store.
+//
+// WARNING: This class cannot do memory allocation or handle allocation!
+class ReversePcLookupCache {
+ public:
+  ReversePcLookupCache(Isolate* isolate,
+                       uint32_t* pc_array,
+                       intptr_t length,
+                       uword first_absolute_pc,
+                       uword last_absolute_pc)
+      : isolate_(isolate),
+        pc_array_(pc_array),
+        length_(length),
+        first_absolute_pc_(first_absolute_pc),
+        last_absolute_pc_(last_absolute_pc) {}
+  ~ReversePcLookupCache() { delete[] pc_array_; }
+
+  // Builds a [ReversePcLookupCache] and attaches it to the isolate (if
+  // `code_order_table` is non-`null`).
+  static void BuildAndAttachToIsolate(Isolate* isolate);
+
+  // Returns `true` if the given [pc] contains can be mapped to a [Code] object
+  // using this cache.
+  inline bool Contains(uword pc) {
+    return first_absolute_pc_ <= pc && pc <= last_absolute_pc_;
+  }
+
+  // Looks up the [Code] object from a given [pc].
+  inline RawCode* Lookup(uword pc) {
+    NoSafepointScope no_safepoint_scope;
+
+    intptr_t left = 0;
+    intptr_t right = length_ - 1;
+
+    ASSERT(first_absolute_pc_ <= pc && pc < last_absolute_pc_);
+    uint32_t pc_offset = static_cast<uint32_t>(pc - first_absolute_pc_);
+
+    while (left < right) {
+      intptr_t middle = left + (right - left) / 2;
+
+      uword middle_pc = pc_array_[middle];
+      if (middle_pc < pc_offset) {
+        left = middle + 1;
+      } else {
+        right = middle;
+      }
+    }
+
+    auto code_array = isolate_->object_store()->code_order_table();
+    auto raw_code = reinterpret_cast<RawCode*>(Array::DataOf(code_array)[left]);
+
+#if defined(DEBUG)
+    ASSERT(raw_code->GetClassIdMayBeSmi() == kCodeCid);
+    ASSERT(Code::ContainsInstructionAt(raw_code, pc));
+#endif
+
+    return raw_code;
+  }
+
+ private:
+  Isolate* isolate_;
+  uint32_t* pc_array_;
+  intptr_t length_;
+  uword first_absolute_pc_;
+  uword last_absolute_pc_;
+};
+
+#else  // defined(DART_PRECOMPILED_RUNTIME
+
+class ReversePcLookupCache {
+ public:
+  ReversePcLookupCache() {}
+  ~ReversePcLookupCache() {}
+
+  static void BuildAndAttachToIsolate(Isolate* isolate) {}
+
+  inline bool Contains(uword pc) { return false; }
+
+  inline RawCode* Lookup(uword pc) { UNREACHABLE(); }
+};
+
+#endif  // defined(DART_PRECOMPILED_RUNTIME
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_REVERSE_PC_LOOKUP_CACHE_H_
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 5994aed..c6cee03 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -50,18 +50,6 @@
             trace_deoptimization_verbose,
             false,
             "Trace deoptimization verbose");
-DEFINE_FLAG(bool, trace_ic, false, "Trace IC handling");
-DEFINE_FLAG(bool,
-            trace_ic_miss_in_optimized,
-            false,
-            "Trace IC miss in optimized code");
-DEFINE_FLAG(bool,
-            trace_optimized_ic_calls,
-            false,
-            "Trace IC calls in optimized code.");
-DEFINE_FLAG(bool, trace_patching, false, "Trace patching of code.");
-DEFINE_FLAG(bool, trace_runtime_calls, false, "Trace runtime calls");
-DEFINE_FLAG(bool, trace_type_checks, false, "Trace runtime type checks.");
 
 DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(int, max_deoptimization_counter_threshold);
@@ -72,6 +60,7 @@
 
 DEFINE_FLAG(bool, trace_osr, false, "Trace attempts at on-stack replacement.");
 
+DEFINE_FLAG(int, gc_every, 0, "Run major GC on every N stack overflow checks");
 DEFINE_FLAG(int,
             stacktrace_every,
             0,
@@ -89,14 +78,6 @@
 DECLARE_FLAG(bool, reload_every_optimized);
 DECLARE_FLAG(bool, reload_every_back_off);
 
-#ifdef DEBUG
-DEFINE_FLAG(charp,
-            gc_at_instance_allocation,
-            NULL,
-            "Perform a GC before allocation of instances of "
-            "the specified class");
-#endif
-
 #if defined(TESTING) || defined(DEBUG)
 void VerifyOnTransition() {
   Thread* thread = Thread::Current();
@@ -127,49 +108,33 @@
   return function;
 }
 
-DEFINE_RUNTIME_ENTRY(TraceFunctionEntry, 1) {
-  const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
-  const String& function_name = String::Handle(function.name());
-  const String& class_name =
-      String::Handle(Class::Handle(function.Owner()).Name());
-  OS::PrintErr("> Entering '%s.%s'\n", class_name.ToCString(),
-               function_name.ToCString());
-}
-
-DEFINE_RUNTIME_ENTRY(TraceFunctionExit, 1) {
-  const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
-  const String& function_name = String::Handle(function.name());
-  const String& class_name =
-      String::Handle(Class::Handle(function.Owner()).Name());
-  OS::PrintErr("< Exiting '%s.%s'\n", class_name.ToCString(),
-               function_name.ToCString());
-}
-
 DEFINE_RUNTIME_ENTRY(RangeError, 2) {
-  const Instance& length = Instance::CheckedHandle(arguments.ArgAt(0));
-  const Instance& index = Instance::CheckedHandle(arguments.ArgAt(1));
+  const Instance& length = Instance::CheckedHandle(zone, arguments.ArgAt(0));
+  const Instance& index = Instance::CheckedHandle(zone, arguments.ArgAt(1));
   if (!length.IsInteger()) {
     // Throw: new ArgumentError.value(length, "length", "is not an integer");
-    const Array& args = Array::Handle(Array::New(3));
+    const Array& args = Array::Handle(zone, Array::New(3));
     args.SetAt(0, length);
     args.SetAt(1, Symbols::Length());
-    args.SetAt(2, String::Handle(String::New("is not an integer")));
+    args.SetAt(2, String::Handle(zone, String::New("is not an integer")));
     Exceptions::ThrowByType(Exceptions::kArgumentValue, args);
   }
   if (!index.IsInteger()) {
     // Throw: new ArgumentError.value(index, "index", "is not an integer");
-    const Array& args = Array::Handle(Array::New(3));
+    const Array& args = Array::Handle(zone, Array::New(3));
     args.SetAt(0, index);
     args.SetAt(1, Symbols::Index());
-    args.SetAt(2, String::Handle(String::New("is not an integer")));
+    args.SetAt(2, String::Handle(zone, String::New("is not an integer")));
     Exceptions::ThrowByType(Exceptions::kArgumentValue, args);
   }
   // Throw: new RangeError.range(index, 0, length - 1, "length");
-  const Array& args = Array::Handle(Array::New(4));
+  const Array& args = Array::Handle(zone, Array::New(4));
   args.SetAt(0, index);
-  args.SetAt(1, Integer::Handle(Integer::New(0)));
-  args.SetAt(2, Integer::Handle(Integer::Cast(length).ArithmeticOp(
-                    Token::kSUB, Integer::Handle(Integer::New(1)))));
+  args.SetAt(1, Integer::Handle(zone, Integer::New(0)));
+  args.SetAt(
+      2, Integer::Handle(
+             zone, Integer::Cast(length).ArithmeticOp(
+                       Token::kSUB, Integer::Handle(zone, Integer::New(1)))));
   args.SetAt(3, Symbols::Length());
   Exceptions::ThrowByType(Exceptions::kRange, args);
 }
@@ -201,6 +166,7 @@
                              StackFrameIterator::kNoCrossThreadIteration);
   const StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame->IsDartFrame());
+  ASSERT(!caller_frame->is_interpreted());
   const Code& code = Code::Handle(zone, caller_frame->LookupDartCode());
   const uword pc_offset = caller_frame->pc() - code.PayloadStart();
 
@@ -217,7 +183,7 @@
   const intptr_t name_index = reader.GetNullCheckNameIndexAt(pc_offset);
   RELEASE_ASSERT(name_index >= 0);
 
-  const ObjectPool& pool = ObjectPool::Handle(zone, code.object_pool());
+  const ObjectPool& pool = ObjectPool::Handle(zone, code.GetObjectPool());
   const String& member_name =
       String::CheckedHandle(zone, pool.ObjectAt(name_index));
 
@@ -225,12 +191,12 @@
 }
 
 DEFINE_RUNTIME_ENTRY(NullErrorWithSelector, 1) {
-  const String& selector = String::CheckedHandle(arguments.ArgAt(0));
+  const String& selector = String::CheckedHandle(zone, arguments.ArgAt(0));
   NullErrorHelper(zone, selector);
 }
 
 DEFINE_RUNTIME_ENTRY(ArgumentError, 1) {
-  const Instance& value = Instance::CheckedHandle(arguments.ArgAt(0));
+  const Instance& value = Instance::CheckedHandle(zone, arguments.ArgAt(0));
   Exceptions::ThrowArgumentError(value);
 }
 
@@ -242,7 +208,7 @@
 }
 
 DEFINE_RUNTIME_ENTRY(IntegerDivisionByZeroException, 0) {
-  const Array& args = Array::Handle(Array::New(0));
+  const Array& args = Array::Handle(zone, Array::New(0));
   Exceptions::ThrowByType(Exceptions::kIntegerDivisionByZeroException, args);
 }
 
@@ -266,37 +232,39 @@
 // Arg1: array type arguments, i.e. vector of 1 type, the element type.
 // Return value: newly allocated array of length arg0.
 DEFINE_RUNTIME_ENTRY(AllocateArray, 2) {
-  const Instance& length = Instance::CheckedHandle(arguments.ArgAt(0));
+  const Instance& length = Instance::CheckedHandle(zone, arguments.ArgAt(0));
   if (!length.IsInteger()) {
     // Throw: new ArgumentError.value(length, "length", "is not an integer");
-    const Array& args = Array::Handle(Array::New(3));
+    const Array& args = Array::Handle(zone, Array::New(3));
     args.SetAt(0, length);
     args.SetAt(1, Symbols::Length());
-    args.SetAt(2, String::Handle(String::New("is not an integer")));
+    args.SetAt(2, String::Handle(zone, String::New("is not an integer")));
     Exceptions::ThrowByType(Exceptions::kArgumentValue, args);
   }
   if (length.IsSmi()) {
     const intptr_t len = Smi::Cast(length).Value();
     if ((len >= 0) && (len <= Array::kMaxElements)) {
-      const Array& array = Array::Handle(Array::New(len, Heap::kNew));
+      const Array& array = Array::Handle(zone, Array::New(len, Heap::kNew));
       arguments.SetReturn(array);
       TypeArguments& element_type =
-          TypeArguments::CheckedHandle(arguments.ArgAt(1));
+          TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
       // An Array is raw or takes one type argument. However, its type argument
       // vector may be longer than 1 due to a type optimization reusing the type
       // argument vector of the instantiator.
       ASSERT(element_type.IsNull() ||
              ((element_type.Length() >= 1) && element_type.IsInstantiated()));
       array.SetTypeArguments(element_type);  // May be null.
-      EnsureNewOrRemembered(isolate, thread, array);
+      if (!array.raw()->IsCardRemembered()) {
+        EnsureNewOrRemembered(isolate, thread, array);
+      }
       return;
     }
   }
   // Throw: new RangeError.range(length, 0, Array::kMaxElements, "length");
-  const Array& args = Array::Handle(Array::New(4));
+  const Array& args = Array::Handle(zone, Array::New(4));
   args.SetAt(0, length);
-  args.SetAt(1, Integer::Handle(Integer::New(0)));
-  args.SetAt(2, Integer::Handle(Integer::New(Array::kMaxElements)));
+  args.SetAt(1, Integer::Handle(zone, Integer::New(0)));
+  args.SetAt(2, Integer::Handle(zone, Integer::New(Array::kMaxElements)));
   args.SetAt(3, Symbols::Length());
   Exceptions::ThrowByType(Exceptions::kRange, args);
 }
@@ -315,29 +283,18 @@
 // Arg1: type arguments of the object that needs to be allocated.
 // Return value: newly allocated object.
 DEFINE_RUNTIME_ENTRY(AllocateObject, 2) {
-  const Class& cls = Class::CheckedHandle(arguments.ArgAt(0));
-
-#ifdef DEBUG
-  if (FLAG_gc_at_instance_allocation != NULL) {
-    const String& name = String::Handle(cls.Name());
-    if (String::EqualsIgnoringPrivateKey(
-            name,
-            String::Handle(String::New(FLAG_gc_at_instance_allocation)))) {
-      Isolate::Current()->heap()->CollectAllGarbage(Heap::kDebugging);
-    }
-  }
-#endif
-  Heap::Space space = Heap::kNew;
-  const Instance& instance = Instance::Handle(Instance::New(cls, space));
+  const Class& cls = Class::CheckedHandle(zone, arguments.ArgAt(0));
+  const Instance& instance =
+      Instance::Handle(zone, Instance::New(cls, Heap::kNew));
 
   arguments.SetReturn(instance);
   if (cls.NumTypeArguments() == 0) {
     // No type arguments required for a non-parameterized type.
-    ASSERT(Instance::CheckedHandle(arguments.ArgAt(1)).IsNull());
+    ASSERT(Instance::CheckedHandle(zone, arguments.ArgAt(1)).IsNull());
     return;
   }
   TypeArguments& type_arguments =
-      TypeArguments::CheckedHandle(arguments.ArgAt(1));
+      TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
   // Unless null (for a raw type), the type argument vector may be longer than
   // necessary due to a type optimization reusing the type argument vector of
   // the instantiator.
@@ -367,20 +324,9 @@
          instantiator_type_arguments.IsInstantiated());
   ASSERT(function_type_arguments.IsNull() ||
          function_type_arguments.IsInstantiated());
-  Error& bound_error = Error::Handle(zone);
   type =
       type.InstantiateFrom(instantiator_type_arguments, function_type_arguments,
-                           kAllFree, &bound_error, NULL, NULL, Heap::kOld);
-  if (!bound_error.IsNull()) {
-    // Throw a dynamic type error.
-    const TokenPosition location = GetCallerLocation();
-    String& bound_error_message =
-        String::Handle(zone, String::New(bound_error.ToErrorCString()));
-    Exceptions::CreateAndThrowTypeError(location, AbstractType::Handle(zone),
-                                        AbstractType::Handle(zone),
-                                        Symbols::Empty(), bound_error_message);
-    UNREACHABLE();
-  }
+                           kAllFree, NULL, Heap::kOld);
   if (type.IsTypeRef()) {
     type = TypeRef::Cast(type).type();
     ASSERT(!type.IsTypeRef());
@@ -410,24 +356,8 @@
   // Code inlined in the caller should have optimized the case where the
   // instantiator can be reused as type argument vector.
   ASSERT(!type_arguments.IsUninstantiatedIdentity());
-  if (isolate->type_checks()) {
-    Error& bound_error = Error::Handle(zone);
-    type_arguments = type_arguments.InstantiateAndCanonicalizeFrom(
-        instantiator_type_arguments, function_type_arguments, &bound_error);
-    if (!bound_error.IsNull()) {
-      // Throw a dynamic type error.
-      const TokenPosition location = GetCallerLocation();
-      String& bound_error_message =
-          String::Handle(zone, String::New(bound_error.ToErrorCString()));
-      Exceptions::CreateAndThrowTypeError(
-          location, AbstractType::Handle(zone), AbstractType::Handle(zone),
-          Symbols::Empty(), bound_error_message);
-      UNREACHABLE();
-    }
-  } else {
-    type_arguments = type_arguments.InstantiateAndCanonicalizeFrom(
-        instantiator_type_arguments, function_type_arguments, NULL);
-  }
+  type_arguments = type_arguments.InstantiateAndCanonicalizeFrom(
+      instantiator_type_arguments, function_type_arguments);
   ASSERT(type_arguments.IsNull() || type_arguments.IsInstantiated());
   arguments.SetReturn(type_arguments);
 }
@@ -449,25 +379,18 @@
       AbstractType::CheckedHandle(zone, arguments.ArgAt(3));
   const String& dst_name = String::CheckedHandle(zone, arguments.ArgAt(4));
 
-  ASSERT(!subtype.IsNull() && !subtype.IsMalformedOrMalbounded());
-  ASSERT(!supertype.IsNull() && !supertype.IsMalformedOrMalbounded());
+  ASSERT(!subtype.IsNull());
+  ASSERT(!supertype.IsNull());
 
   // The supertype or subtype may not be instantiated.
-  Error& bound_error = Error::Handle(zone);
   if (AbstractType::InstantiateAndTestSubtype(
-          &subtype, &supertype, &bound_error, instantiator_type_args,
-          function_type_args)) {
+          &subtype, &supertype, instantiator_type_args, function_type_args)) {
     return;
   }
 
   // Throw a dynamic type error.
   const TokenPosition location = GetCallerLocation();
-  String& bound_error_message = String::Handle(zone);
-  if (!bound_error.IsNull()) {
-    bound_error_message = String::New(bound_error.ToErrorCString());
-  }
-  Exceptions::CreateAndThrowTypeError(location, subtype, supertype, dst_name,
-                                      bound_error_message);
+  Exceptions::CreateAndThrowTypeError(location, subtype, supertype, dst_name);
   UNREACHABLE();
 }
 
@@ -483,7 +406,8 @@
 // Return value: newly allocated context.
 DEFINE_RUNTIME_ENTRY(AllocateContext, 1) {
   const Smi& num_variables = Smi::CheckedHandle(zone, arguments.ArgAt(0));
-  const Context& context = Context::Handle(Context::New(num_variables.Value()));
+  const Context& context =
+      Context::Handle(zone, Context::New(num_variables.Value()));
   arguments.SetReturn(context);
   if (Heap::IsAllocatableInNewSpace(
           Context::InstanceSize(num_variables.Value()))) {
@@ -499,7 +423,7 @@
   const Context& ctx = Context::CheckedHandle(zone, arguments.ArgAt(0));
   Context& cloned_ctx =
       Context::Handle(zone, Context::New(ctx.num_variables()));
-  cloned_ctx.set_parent(Context::Handle(ctx.parent()));
+  cloned_ctx.set_parent(Context::Handle(zone, ctx.parent()));
   Object& inst = Object::Handle(zone);
   for (int i = 0; i < ctx.num_variables(); i++) {
     inst = ctx.At(i);
@@ -532,8 +456,8 @@
 
 // Result of an invoke may be an unhandled exception, in which case we
 // rethrow it.
-static void CheckResultError(const Object& result) {
-  if (result.IsError()) {
+static void ThrowIfError(const Object& result) {
+  if (!result.IsNull() && result.IsError()) {
     Exceptions::PropagateError(Error::Cast(result));
   }
 }
@@ -560,7 +484,7 @@
   args.SetAt(0, receiver);
   const Object& result =
       Object::Handle(zone, DartEntry::InvokeFunction(getter, args));
-  CheckResultError(result);
+  ThrowIfError(result);
   arguments.SetReturn(result);
 }
 
@@ -608,19 +532,15 @@
                  Class::Handle(type.type_class()).id(), caller_frame->pc());
   } else {
     // Instantiate type before printing.
-    Error& bound_error = Error::Handle();
     const AbstractType& instantiated_type =
-        AbstractType::Handle(type.InstantiateFrom(
-            instantiator_type_arguments, function_type_arguments, kAllFree,
-            &bound_error, NULL, NULL, Heap::kOld));
+        AbstractType::Handle(type.InstantiateFrom(instantiator_type_arguments,
+                                                  function_type_arguments,
+                                                  kAllFree, NULL, Heap::kOld));
     OS::PrintErr("%s: '%s' %s '%s' instantiated from '%s' (pc: %#" Px ").\n",
                  message, String::Handle(instance_type.Name()).ToCString(),
                  (result.raw() == Bool::True().raw()) ? "is" : "is !",
                  String::Handle(instantiated_type.Name()).ToCString(),
                  String::Handle(type.Name()).ToCString(), caller_frame->pc());
-    if (!bound_error.IsNull()) {
-      OS::PrintErr("  bound error: %s\n", bound_error.ToErrorCString());
-    }
   }
   const Function& function =
       Function::Handle(caller_frame->LookupDartFunction());
@@ -734,11 +654,9 @@
   if (FLAG_trace_type_checks) {
     AbstractType& test_type = AbstractType::Handle(zone, type.raw());
     if (!test_type.IsInstantiated()) {
-      Error& bound_error = Error::Handle(zone);
       test_type = type.InstantiateFrom(instantiator_type_arguments,
-                                       function_type_arguments, kAllFree,
-                                       &bound_error, NULL, NULL, Heap::kNew);
-      ASSERT(bound_error.IsNull());  // Malbounded types are not optimized.
+                                       function_type_arguments, kAllFree, NULL,
+                                       Heap::kNew);
     }
     const auto& type_class = Class::Handle(zone, test_type.type_class());
     const auto& instance_class_name =
@@ -786,28 +704,13 @@
   const SubtypeTestCache& cache =
       SubtypeTestCache::CheckedHandle(zone, arguments.ArgAt(4));
   ASSERT(type.IsFinalized());
-  ASSERT(!type.IsMalformed());    // Already checked in code generator.
-  ASSERT(!type.IsMalbounded());   // Already checked in code generator.
   ASSERT(!type.IsDynamicType());  // No need to check assignment.
-  Error& bound_error = Error::Handle(zone);
-  const Bool& result =
-      Bool::Get(instance.IsInstanceOf(type, instantiator_type_arguments,
-                                      function_type_arguments, &bound_error));
+  const Bool& result = Bool::Get(instance.IsInstanceOf(
+      type, instantiator_type_arguments, function_type_arguments));
   if (FLAG_trace_type_checks) {
     PrintTypeCheck("InstanceOf", instance, type, instantiator_type_arguments,
                    function_type_arguments, result);
   }
-  if (!result.value() && !bound_error.IsNull()) {
-    // Throw a dynamic type error only if the instanceof test fails.
-    const TokenPosition location = GetCallerLocation();
-    String& bound_error_message =
-        String::Handle(zone, String::New(bound_error.ToErrorCString()));
-    Exceptions::CreateAndThrowTypeError(location, AbstractType::Handle(zone),
-                                        AbstractType::Handle(zone),
-                                        Symbols::Empty(), bound_error_message);
-    UNREACHABLE();
-  }
-
   UpdateTypeTestCache(zone, instance, type, instantiator_type_arguments,
                       function_type_arguments, result, cache);
   arguments.SetReturn(result);
@@ -847,15 +750,11 @@
   ASSERT(mode == kTypeCheckFromInline);
 #endif
 
-  ASSERT(!dst_type.IsMalformed());    // Already checked in code generator.
-  ASSERT(!dst_type.IsMalbounded());   // Already checked in code generator.
   ASSERT(!dst_type.IsDynamicType());  // No need to check assignment.
   ASSERT(!src_instance.IsNull());     // Already checked in inlined code.
 
-  Error& bound_error = Error::Handle(zone);
-  const bool is_instance_of =
-      src_instance.IsInstanceOf(dst_type, instantiator_type_arguments,
-                                function_type_arguments, &bound_error);
+  const bool is_instance_of = src_instance.IsInstanceOf(
+      dst_type, instantiator_type_arguments, function_type_arguments);
 
   if (FLAG_trace_type_checks) {
     PrintTypeCheck("TypeCheck", src_instance, dst_type,
@@ -871,14 +770,9 @@
       // Instantiate dst_type before reporting the error.
       dst_type = dst_type.InstantiateFrom(instantiator_type_arguments,
                                           function_type_arguments, kAllFree,
-                                          NULL, NULL, NULL, Heap::kNew);
+                                          NULL, Heap::kNew);
       // Note that instantiated dst_type may be malbounded.
     }
-    String& bound_error_message = String::Handle(zone);
-    if (!bound_error.IsNull()) {
-      ASSERT(isolate->type_checks());
-      bound_error_message = String::New(bound_error.ToErrorCString());
-    }
     if (dst_name.IsNull()) {
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
       // Can only come here from type testing stub.
@@ -889,10 +783,11 @@
       DartFrameIterator iterator(thread,
                                  StackFrameIterator::kNoCrossThreadIteration);
       StackFrame* caller_frame = iterator.NextFrame();
+      ASSERT(!caller_frame->is_interpreted());
       const Code& caller_code =
           Code::Handle(zone, caller_frame->LookupDartCode());
       const ObjectPool& pool =
-          ObjectPool::Handle(zone, caller_code.object_pool());
+          ObjectPool::Handle(zone, caller_code.GetObjectPool());
       TypeTestingStubCallPattern tts_pattern(caller_frame->pc());
       const intptr_t stc_pool_idx = tts_pattern.GetSubtypeTestCachePoolIndex();
       const intptr_t dst_name_idx = stc_pool_idx + 1;
@@ -902,8 +797,7 @@
 #endif
     }
 
-    Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name,
-                                        bound_error_message);
+    Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name);
     UNREACHABLE();
   }
 
@@ -926,10 +820,11 @@
       DartFrameIterator iterator(thread,
                                  StackFrameIterator::kNoCrossThreadIteration);
       StackFrame* caller_frame = iterator.NextFrame();
+      ASSERT(!caller_frame->is_interpreted());
       const Code& caller_code =
           Code::Handle(zone, caller_frame->LookupDartCode());
       const ObjectPool& pool =
-          ObjectPool::Handle(zone, caller_code.object_pool());
+          ObjectPool::Handle(zone, caller_code.GetObjectPool());
       TypeTestingStubCallPattern tts_pattern(caller_frame->pc());
       const intptr_t stc_pool_idx = tts_pattern.GetSubtypeTestCachePoolIndex();
 
@@ -982,10 +877,8 @@
   const Type& bool_interface = Type::Handle(Type::BoolType());
   const AbstractType& src_type =
       AbstractType::Handle(zone, src_instance.GetType(Heap::kNew));
-  const String& no_bound_error = String::Handle(zone);
   Exceptions::CreateAndThrowTypeError(location, src_type, bool_interface,
-                                      Symbols::BooleanExpression(),
-                                      no_bound_error);
+                                      Symbols::BooleanExpression());
   UNREACHABLE();
 }
 
@@ -1002,8 +895,7 @@
       AbstractType::CheckedHandle(zone, arguments.ArgAt(2));
   const AbstractType& src_type =
       AbstractType::Handle(zone, src_value.GetType(Heap::kNew));
-  Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name,
-                                      String::Handle(zone));
+  Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name);
   UNREACHABLE();
 }
 
@@ -1027,6 +919,7 @@
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
+  ASSERT(!caller_frame->is_interpreted());
   const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode());
   ASSERT(!caller_code.IsNull());
   ASSERT(caller_code.is_optimized());
@@ -1070,20 +963,14 @@
       zone, isolate->debugger()->GetPatchedStubAddress(caller_frame->pc()));
   const Error& error =
       Error::Handle(zone, isolate->debugger()->PauseBreakpoint());
-  if (!error.IsNull()) {
-    Exceptions::PropagateError(error);
-    UNREACHABLE();
-  }
+  ThrowIfError(error);
   arguments.SetReturn(orig_stub);
 }
 #else
 // Gets called from the simulator when the breakpoint is reached.
 DEFINE_RUNTIME_ENTRY(BreakpointRuntimeHandler, 0) {
   const Error& error = Error::Handle(isolate->debugger()->PauseBreakpoint());
-  if (!error.IsNull()) {
-    Exceptions::PropagateError(error);
-    UNREACHABLE();
-  }
+  ThrowIfError(error);
 }
 #endif  // !defined(TARGET_ARCH_DBC)
 
@@ -1093,10 +980,7 @@
 #else
   const Error& error =
       Error::Handle(zone, isolate->debugger()->PauseStepping());
-  if (!error.IsNull()) {
-    Exceptions::PropagateError(error);
-    UNREACHABLE();
-  }
+  ThrowIfError(error);
 #endif
 }
 
@@ -1176,10 +1060,8 @@
 static RawFunction* ComputeTypeCheckTarget(const Instance& receiver,
                                            const AbstractType& type,
                                            const ArgumentsDescriptor& desc) {
-  Error& error = Error::Handle();
   bool result = receiver.IsInstanceOf(type, Object::null_type_arguments(),
-                                      Object::null_type_arguments(), &error);
-  ASSERT(error.IsNull());
+                                      Object::null_type_arguments());
   ObjectStore* store = Isolate::Current()->object_store();
   const Function& target =
       Function::Handle(result ? store->simple_instance_of_true_function()
@@ -1228,9 +1110,12 @@
     if (ic_data.IsTrackingExactness()) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
       const auto& receiver = *args[0];
-      const auto state = StaticTypeExactnessState::Compute(
-          Type::Cast(AbstractType::Handle(ic_data.StaticReceiverType())),
-          receiver);
+      const auto state = receiver.IsNull()
+                             ? StaticTypeExactnessState::NotExact()
+                             : StaticTypeExactnessState::Compute(
+                                   Type::Cast(AbstractType::Handle(
+                                       ic_data.StaticReceiverType())),
+                                   receiver);
       ic_data.AddReceiverCheck(
           receiver.GetClassId(), target_function,
           /*count=*/1, /*exactness=*/state.CollapseSuperTypeExactness());
@@ -1279,8 +1164,8 @@
 //   Returns: target function with compiled code or null.
 // Modifies the instance call to hold the updated IC data array.
 DEFINE_RUNTIME_ENTRY(InlineCacheMissHandlerOneArg, 2) {
-  const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
-  const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
+  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
+  const ICData& ic_data = ICData::CheckedHandle(zone, arguments.ArgAt(1));
   GrowableArray<const Instance*> args(1);
   args.Add(&receiver);
   const Function& result =
@@ -1295,9 +1180,9 @@
 //   Returns: target function with compiled code or null.
 // Modifies the instance call to hold the updated IC data array.
 DEFINE_RUNTIME_ENTRY(InlineCacheMissHandlerTwoArgs, 3) {
-  const Instance& receiver = Instance::CheckedHandle(arguments.ArgAt(0));
-  const Instance& other = Instance::CheckedHandle(arguments.ArgAt(1));
-  const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(2));
+  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
+  const Instance& other = Instance::CheckedHandle(zone, arguments.ArgAt(1));
+  const ICData& ic_data = ICData::CheckedHandle(zone, arguments.ArgAt(2));
   GrowableArray<const Instance*> args(2);
   args.Add(&receiver);
   args.Add(&other);
@@ -1311,8 +1196,8 @@
 // Arg0: argument.
 // Arg1: IC data object.
 DEFINE_RUNTIME_ENTRY(StaticCallMissHandlerOneArg, 2) {
-  const Instance& arg = Instance::CheckedHandle(arguments.ArgAt(0));
-  const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(1));
+  const Instance& arg = Instance::CheckedHandle(zone, arguments.ArgAt(0));
+  const ICData& ic_data = ICData::CheckedHandle(zone, arguments.ArgAt(1));
   // IC data for static call is prepopulated with the statically known target.
   ASSERT(ic_data.NumberOfChecksIs(1));
   const Function& target = Function::Handle(ic_data.GetTargetAt(0));
@@ -1336,9 +1221,9 @@
 // Arg1: argument 1.
 // Arg2: IC data object.
 DEFINE_RUNTIME_ENTRY(StaticCallMissHandlerTwoArgs, 3) {
-  const Instance& arg0 = Instance::CheckedHandle(arguments.ArgAt(0));
-  const Instance& arg1 = Instance::CheckedHandle(arguments.ArgAt(1));
-  const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(2));
+  const Instance& arg0 = Instance::CheckedHandle(zone, arguments.ArgAt(0));
+  const Instance& arg1 = Instance::CheckedHandle(zone, arguments.ArgAt(1));
+  const ICData& ic_data = ICData::CheckedHandle(zone, arguments.ArgAt(2));
   // IC data for static call is prepopulated with the statically known target.
   ASSERT(!ic_data.NumberOfChecksIs(0));
   const Function& target = Function::Handle(ic_data.GetTargetAt(0));
@@ -1462,8 +1347,7 @@
   }
 
   // Call site is not single target, switch to call using ICData.
-  const Code& stub =
-      Code::Handle(zone, StubCode::ICCallThroughCode_entry()->code());
+  const Code& stub = StubCode::ICCallThroughCode();
   ASSERT(!Isolate::Current()->compilation_allowed());
   CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code, ic_data,
                                      stub);
@@ -1528,8 +1412,7 @@
   }
 
   // Patch to call through stub.
-  const Code& stub =
-      Code::Handle(zone, StubCode::ICCallThroughCode_entry()->code());
+  const Code& stub = StubCode::ICCallThroughCode();
   ASSERT(!Isolate::Current()->compilation_allowed());
   CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code, ic_data,
                                      stub);
@@ -1613,8 +1496,7 @@
       cache.set_entry_point(code.EntryPoint());
       cache.set_lower_limit(lower);
       cache.set_upper_limit(upper);
-      const Code& stub =
-          Code::Handle(zone, StubCode::SingleTargetCall_entry()->code());
+      const Code& stub = StubCode::SingleTargetCall();
       CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code, cache,
                                          stub);
       // Return the ICData. The miss stub will jump to continue in the IC call
@@ -1625,8 +1507,7 @@
   }
 
   // Patch to call through stub.
-  const Code& stub =
-      Code::Handle(zone, StubCode::ICCallThroughCode_entry()->code());
+  const Code& stub = StubCode::ICCallThroughCode();
   ASSERT(!Isolate::Current()->compilation_allowed());
   CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code, ic_data,
                                      stub);
@@ -1720,8 +1601,7 @@
         ASSERT(caller_frame->IsDartFrame());
         const Code& caller_code =
             Code::Handle(zone, caller_frame->LookupDartCode());
-        const Code& stub =
-            Code::Handle(zone, StubCode::MegamorphicCall_entry()->code());
+        const Code& stub = StubCode::MegamorphicCall();
 
         CodePatcher::PatchSwitchableCallAt(caller_frame->pc(), caller_code,
                                            cache, stub);
@@ -1738,6 +1618,37 @@
 #endif  // !defined(TARGET_ARCH_DBC)
 }
 
+// Handles interpreted interface call cache miss.
+//   Arg0: receiver
+//   Arg1: target name
+//   Arg2: arguments descriptor
+//   Returns: target function
+// Modifies the instance call table in current interpreter.
+DEFINE_RUNTIME_ENTRY(InterpretedInterfaceCallMissHandler, 3) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  UNREACHABLE();
+#else
+  ASSERT(FLAG_enable_interpreter);
+  const Instance& receiver = Instance::CheckedHandle(zone, arguments.ArgAt(0));
+  const String& target_name = String::CheckedHandle(zone, arguments.ArgAt(1));
+  const Array& arg_desc = Array::CheckedHandle(zone, arguments.ArgAt(2));
+
+  ArgumentsDescriptor arguments_descriptor(arg_desc);
+  Function& target_function = Function::Handle(
+      zone,
+      Resolver::ResolveDynamic(receiver, target_name, arguments_descriptor));
+
+  // TODO(regis): In order to substitute 'simple_instance_of_function', the 2nd
+  // arg to the call, the type, is needed.
+
+  if (target_function.IsNull()) {
+    target_function = InlineCacheMissHelper(receiver, arg_desc, target_name);
+  }
+  ASSERT(!target_function.IsNull());
+  arguments.SetReturn(target_function);
+#endif
+}
+
 // Invoke appropriate noSuchMethod or closure from getter.
 // Arg0: receiver
 // Arg1: ICData or MegamorphicCache
@@ -1774,7 +1685,7 @@
   const Object& result = Object::Handle(                                       \
       zone, DartEntry::InvokeNoSuchMethod(                                     \
                 receiver, target_name, orig_arguments, orig_arguments_desc));  \
-  CheckResultError(result);                                                    \
+  ThrowIfError(result);                                                    \
   arguments.SetReturn(result);
 
 #define CLOSURIZE(some_function)                                               \
@@ -1809,7 +1720,7 @@
       // would perform the closure call.
       const Object& result = Object::Handle(
           zone, DartEntry::InvokeClosure(orig_arguments, orig_arguments_desc));
-      CheckResultError(result);
+      ThrowIfError(result);
       arguments.SetReturn(result);
       return;
     }
@@ -1829,14 +1740,14 @@
         getter_arguments.SetAt(0, receiver);
         const Object& getter_result = Object::Handle(
             zone, DartEntry::InvokeFunction(function, getter_arguments));
-        CheckResultError(getter_result);
+        ThrowIfError(getter_result);
         ASSERT(getter_result.IsNull() || getter_result.IsInstance());
 
         orig_arguments.SetAt(args_desc.FirstArgIndex(), getter_result);
         const Object& call_result = Object::Handle(
             zone,
             DartEntry::InvokeClosure(orig_arguments, orig_arguments_desc));
-        CheckResultError(call_result);
+        ThrowIfError(call_result);
         arguments.SetReturn(call_result);
         return;
       }
@@ -1855,9 +1766,10 @@
 // Arg1: arguments descriptor array.
 // Arg2: arguments array.
 DEFINE_RUNTIME_ENTRY(InvokeClosureNoSuchMethod, 3) {
-  const Closure& receiver = Closure::CheckedHandle(arguments.ArgAt(0));
-  const Array& orig_arguments_desc = Array::CheckedHandle(arguments.ArgAt(1));
-  const Array& orig_arguments = Array::CheckedHandle(arguments.ArgAt(2));
+  const Closure& receiver = Closure::CheckedHandle(zone, arguments.ArgAt(0));
+  const Array& orig_arguments_desc =
+      Array::CheckedHandle(zone, arguments.ArgAt(1));
+  const Array& orig_arguments = Array::CheckedHandle(zone, arguments.ArgAt(2));
 
   // For closure the function name is always 'call'. Replace it with the
   // name of the closurized function so that exception contains more
@@ -1868,7 +1780,7 @@
       String::Handle(function.QualifiedUserVisibleName());
   const Object& result = Object::Handle(DartEntry::InvokeNoSuchMethod(
       receiver, original_function_name, orig_arguments, orig_arguments_desc));
-  CheckResultError(result);
+  ThrowIfError(result);
   arguments.SetReturn(result);
 }
 
@@ -1876,16 +1788,18 @@
 // The following code is used to stress test
 //  - deoptimization
 //  - debugger stack tracing
+//  - garbage collection
 //  - hot reload
 static void HandleStackOverflowTestCases(Thread* thread) {
   Isolate* isolate = thread->isolate();
   bool do_deopt = false;
   bool do_stacktrace = false;
   bool do_reload = false;
+  bool do_gc = false;
   const intptr_t isolate_reload_every =
       isolate->reload_every_n_stack_overflow_checks();
   if ((FLAG_deoptimize_every > 0) || (FLAG_stacktrace_every > 0) ||
-      (isolate_reload_every > 0)) {
+      (FLAG_gc_every > 0) || (isolate_reload_every > 0)) {
     if (!Isolate::IsVMInternalIsolate(isolate)) {
       // TODO(turnidge): To make --deoptimize_every and
       // --stacktrace-every faster we could move this increment/test to
@@ -1897,6 +1811,9 @@
       if (FLAG_stacktrace_every > 0 && (count % FLAG_stacktrace_every) == 0) {
         do_stacktrace = true;
       }
+      if (FLAG_gc_every > 0 && (count % FLAG_gc_every) == 0) {
+        do_gc = true;
+      }
       if ((isolate_reload_every > 0) && (count % isolate_reload_every) == 0) {
         do_reload = isolate->CanReload();
       }
@@ -1908,21 +1825,29 @@
                                StackFrameIterator::kNoCrossThreadIteration);
     StackFrame* frame = iterator.NextFrame();
     ASSERT(frame != NULL);
-    const Code& code = Code::Handle(frame->LookupDartCode());
-    ASSERT(!code.IsNull());
-    const Function& function = Function::Handle(code.function());
+    Code& code = Code::Handle();
+    Function& function = Function::Handle();
+    if (frame->is_interpreted()) {
+      function = frame->LookupDartFunction();
+    } else {
+      code = frame->LookupDartCode();
+      ASSERT(!code.IsNull());
+      function = code.function();
+    }
     ASSERT(!function.IsNull());
     const char* function_name = function.ToFullyQualifiedCString();
     ASSERT(function_name != NULL);
-    if (!code.is_optimized() && FLAG_reload_every_optimized) {
-      // Don't do the reload if we aren't inside optimized code.
-      do_reload = false;
-    }
-    if (code.is_optimized() && FLAG_deoptimize_filter != NULL &&
-        strstr(function_name, FLAG_deoptimize_filter) != NULL) {
-      OS::PrintErr("*** Forcing deoptimization (%s)\n",
-                   function.ToFullyQualifiedCString());
-      do_deopt = true;
+    if (!code.IsNull()) {
+      if (!code.is_optimized() && FLAG_reload_every_optimized) {
+        // Don't do the reload if we aren't inside optimized code.
+        do_reload = false;
+      }
+      if (code.is_optimized() && FLAG_deoptimize_filter != NULL &&
+          strstr(function_name, FLAG_deoptimize_filter) != NULL) {
+        OS::PrintErr("*** Forcing deoptimization (%s)\n",
+                     function.ToFullyQualifiedCString());
+        do_deopt = true;
+      }
     }
     if (FLAG_stacktrace_filter != NULL &&
         strstr(function_name, FLAG_stacktrace_filter) != NULL) {
@@ -2011,6 +1936,9 @@
     }
     FLAG_stacktrace_every = saved_stacktrace_every;
   }
+  if (do_gc) {
+    isolate->heap()->CollectAllGarbage(Heap::kDebugging);
+  }
 }
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -2060,9 +1988,7 @@
   // it cannot have been removed from the function.
   const Object& result = Object::Handle(
       Compiler::CompileOptimizedFunction(thread, function, osr_id));
-  if (result.IsError()) {
-    Exceptions::PropagateError(Error::Cast(result));
-  }
+  ThrowIfError(result);
 
   if (!result.IsNull()) {
     const Code& code = Code::Cast(result);
@@ -2095,7 +2021,7 @@
     Interpreter* interpreter = Thread::Current()->interpreter();
     if (interpreter != NULL) {
       interpreter_stack_overflow =
-          interpreter->get_sp() >= interpreter->stack_limit();
+          interpreter->get_sp() >= interpreter->overflow_stack_limit();
     }
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -2122,10 +2048,7 @@
   //  - store buffer overflow
   //  - OOB message (vm-service or dart:isolate)
   const Error& error = Error::Handle(thread->HandleInterrupts());
-  if (!error.IsNull()) {
-    Exceptions::PropagateError(error);
-    UNREACHABLE();
-  }
+  ThrowIfError(error);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if ((stack_overflow_flags & Thread::kOsrRequest) != 0) {
@@ -2137,8 +2060,8 @@
 }
 
 DEFINE_RUNTIME_ENTRY(TraceICCall, 2) {
-  const ICData& ic_data = ICData::CheckedHandle(arguments.ArgAt(0));
-  const Function& function = Function::CheckedHandle(arguments.ArgAt(1));
+  const ICData& ic_data = ICData::CheckedHandle(zone, arguments.ArgAt(0));
+  const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(1));
   DartFrameIterator iterator(thread,
                              StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = iterator.NextFrame();
@@ -2158,13 +2081,11 @@
   ASSERT(!function.IsNull());
 
   // If running with interpreter, do the unoptimized compilation first.
-  const bool unoptimized_compilation =
-      FLAG_enable_interpreter &&
-      (function.unoptimized_code() == Object::null());
+  const bool optimizing_compilation = function.ShouldCompilerOptimize();
+  ASSERT(FLAG_enable_interpreter || optimizing_compilation);
+  ASSERT((!optimizing_compilation) || function.HasCode());
 
-  ASSERT(unoptimized_compilation || function.HasCode());
-
-  if (unoptimized_compilation ||
+  if ((!optimizing_compilation) ||
       Compiler::CanOptimizeFunction(thread, function)) {
     if (FLAG_background_compilation) {
       Field& field = Field::Handle(zone, isolate->GetDeoptimizingBoxedField());
@@ -2211,11 +2132,13 @@
                   function.ToFullyQualifiedCString());
       }
     }
-    const Object& result = Object::Handle(
-        zone, Compiler::CompileOptimizedFunction(thread, function));
-    if (result.IsError()) {
-      Exceptions::PropagateError(Error::Cast(result));
+    Object& result = Object::Handle(zone);
+    if (optimizing_compilation) {
+      result = Compiler::CompileOptimizedFunction(thread, function);
+    } else {
+      result = Compiler::CompileFunction(thread, function);
     }
+    ThrowIfError(result);
   }
   arguments.SetReturn(function);
 #else
@@ -2251,11 +2174,13 @@
   CodePatcher::PatchStaticCallAt(frame->pc(), caller_code, current_target_code);
   caller_code.SetStaticCallTargetCodeAt(frame->pc(), current_target_code);
   if (FLAG_trace_patching) {
-    OS::PrintErr("FixCallersTarget: caller %#" Px
-                 " "
-                 "target '%s' -> %#" Px "\n",
-                 frame->pc(), target_function.ToFullyQualifiedCString(),
-                 current_target_code.EntryPoint());
+    OS::PrintErr(
+        "FixCallersTarget: caller %#" Px
+        " "
+        "target '%s' -> %#" Px " (%s)\n",
+        frame->pc(), target_function.ToFullyQualifiedCString(),
+        current_target_code.EntryPoint(),
+        current_target_code.is_optimized() ? "optimized" : "unoptimized");
   }
   ASSERT(!current_target_code.IsDisabled());
   arguments.SetReturn(current_target_code);
@@ -2398,9 +2323,11 @@
   StackFrame* frame = iterator.NextFrame();
   Code& optimized_code = Code::Handle();
   while (frame != NULL) {
-    optimized_code = frame->LookupDartCode();
-    if (optimized_code.is_optimized()) {
-      DeoptimizeAt(optimized_code, frame);
+    if (!frame->is_interpreted()) {
+      optimized_code = frame->LookupDartCode();
+      if (optimized_code.is_optimized()) {
+        DeoptimizeAt(optimized_code, frame);
+      }
     }
     frame = iterator.NextFrame();
   }
@@ -2623,7 +2550,7 @@
 //   Arg1: Value that is being stored.
 DEFINE_RUNTIME_ENTRY(UpdateFieldCid, 2) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  const Field& field = Field::CheckedHandle(arguments.ArgAt(0));
+  const Field& field = Field::CheckedHandle(zone, arguments.ArgAt(0));
   const Object& value = Object::Handle(arguments.ArgAt(1));
   field.RecordStore(value);
 #else
@@ -2632,8 +2559,9 @@
 }
 
 DEFINE_RUNTIME_ENTRY(InitStaticField, 1) {
-  const Field& field = Field::CheckedHandle(arguments.ArgAt(0));
-  field.EvaluateInitializer();
+  const Field& field = Field::CheckedHandle(zone, arguments.ArgAt(0));
+  const Error& result = Error::Handle(zone, field.EvaluateInitializer());
+  ThrowIfError(result);
 }
 
 // Print the stop message.
@@ -2755,16 +2683,21 @@
   ASSERT(Function::HasBytecode(function));
   ASSERT(interpreter != NULL);
 #endif
-  const Object& result = Object::Handle(
-      thread->zone(), interpreter->Call(function, argdesc, argc, argv, thread));
+  RawObject* result = interpreter->Call(function, argdesc, argc, argv, thread);
   DEBUG_ASSERT(thread->top_exit_frame_info() == exit_fp);
-  if (result.IsError()) {
+  if (RawObject::IsErrorClassId(result->GetClassIdMayBeSmi())) {
+    // Must not allocate handles in the caller's zone.
+    StackZone stack_zone(thread);
+    // Protect the result in a handle before transitioning, which may trigger
+    // GC.
+    const Error& error =
+        Error::Handle(stack_zone.GetZone(), static_cast<RawError*>(result));
     // Propagating an error may cause allocation. Check if we need to block for
     // a safepoint by switching to "in VM" execution state.
     TransitionGeneratedToVM transition(thread);
-    Exceptions::PropagateError(Error::Cast(result));
+    Exceptions::PropagateError(error);
   }
-  return result.raw();
+  return result;
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
diff --git a/runtime/vm/runtime_entry.h b/runtime/vm/runtime_entry.h
index b337cea..e0c9e56 100644
--- a/runtime/vm/runtime_entry.h
+++ b/runtime/vm/runtime_entry.h
@@ -10,27 +10,13 @@
 #include "vm/heap/safepoint.h"
 #include "vm/native_arguments.h"
 #include "vm/runtime_entry_list.h"
-#include "vm/tags.h"
 
 namespace dart {
 
 class Assembler;
 
-DECLARE_FLAG(bool, trace_runtime_calls);
-
 typedef void (*RuntimeFunction)(NativeArguments arguments);
 
-enum RuntimeFunctionId {
-  kNoRuntimeFunctionId = -1,
-#define DECLARE_ENUM_VALUE(name) k##name##Id,
-  RUNTIME_ENTRY_LIST(DECLARE_ENUM_VALUE)
-#undef DECLARE_ENUM_VALUE
-
-#define DECLARE_LEAF_ENUM_VALUE(type, name, ...) k##name##Id,
-      LEAF_RUNTIME_ENTRY_LIST(DECLARE_LEAF_ENUM_VALUE)
-#undef DECLARE_LEAF_ENUM_VALUE
-};
-
 // Class RuntimeEntry is used to encapsulate runtime functions, it includes
 // the entry point for the runtime function and the number of arguments expected
 // by the function.
@@ -45,10 +31,7 @@
         function_(function),
         argument_count_(argument_count),
         is_leaf_(is_leaf),
-        is_float_(is_float),
-        next_(NULL) {
-    VMTag::RegisterRuntimeEntry(this);
-  }
+        is_float_(is_float) {}
 
   const char* name() const { return name_; }
   RuntimeFunction function() const { return function_; }
@@ -61,12 +44,6 @@
   NOT_IN_PRECOMPILED(void Call(Assembler* assembler, intptr_t argument_count)
                          const);
 
-  void set_next(const RuntimeEntry* next) { next_ = next; }
-  const RuntimeEntry* next() const { return next_; }
-
-  static inline uword AddressFromId(RuntimeFunctionId id);
-  static inline RuntimeFunctionId RuntimeFunctionIdFromAddress(uword address);
-
   static uword InterpretCallEntry();
   static RawObject* InterpretCall(RawFunction* function,
                                   RawArray* argdesc,
@@ -75,17 +52,16 @@
                                   Thread* thread);
 
  private:
-  const char* name_;
+  const char* const name_;
   const RuntimeFunction function_;
   const intptr_t argument_count_;
   const bool is_leaf_;
   const bool is_float_;
-  const RuntimeEntry* next_;
 
   DISALLOW_COPY_AND_ASSIGN(RuntimeEntry);
 };
 
-#ifndef PRODUCT
+#ifdef DEBUG
 #define TRACE_RUNTIME_CALL(format, name)                                       \
   if (FLAG_trace_runtime_calls) {                                              \
     THR_Print("Runtime call: " format "\n", name);                             \
@@ -152,38 +128,6 @@
 RUNTIME_ENTRY_LIST(DECLARE_RUNTIME_ENTRY)
 LEAF_RUNTIME_ENTRY_LIST(DECLARE_LEAF_RUNTIME_ENTRY)
 
-uword RuntimeEntry::AddressFromId(RuntimeFunctionId id) {
-  switch (id) {
-#define DEFINE_RUNTIME_CASE(name)                                              \
-  case k##name##Id:                                                            \
-    return k##name##RuntimeEntry.GetEntryPoint();
-    RUNTIME_ENTRY_LIST(DEFINE_RUNTIME_CASE)
-#undef DEFINE_RUNTIME_CASE
-
-#define DEFINE_LEAF_RUNTIME_CASE(type, name, ...)                              \
-  case k##name##Id:                                                            \
-    return k##name##RuntimeEntry.GetEntryPoint();
-    LEAF_RUNTIME_ENTRY_LIST(DEFINE_LEAF_RUNTIME_CASE)
-#undef DEFINE_LEAF_RUNTIME_CASE
-    default:
-      break;
-  }
-  return 0;
-}
-
-RuntimeFunctionId RuntimeEntry::RuntimeFunctionIdFromAddress(uword address) {
-#define CHECK_RUNTIME_ADDRESS(name)                                            \
-  if (address == k##name##RuntimeEntry.GetEntryPoint()) return k##name##Id;
-  RUNTIME_ENTRY_LIST(CHECK_RUNTIME_ADDRESS)
-#undef CHECK_RUNTIME_ADDRESS
-
-#define CHECK_LEAF_RUNTIME_ADDRESS(type, name, ...)                            \
-  if (address == k##name##RuntimeEntry.GetEntryPoint()) return k##name##Id;
-  LEAF_RUNTIME_ENTRY_LIST(CHECK_LEAF_RUNTIME_ADDRESS)
-#undef CHECK_LEAF_RUNTIME_ADDRESS
-  return kNoRuntimeFunctionId;
-}
-
 const char* DeoptReasonToCString(ICData::DeoptReasonId deopt_reason);
 
 void DeoptimizeAt(const Code& optimized_code, StackFrame* frame);
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index 8f44e23..3ff5758 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -45,7 +45,13 @@
 void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
-    __ BranchLinkOffset(THR, Thread::OffsetFromThread(this));
+    __ LoadFromOffset(kWord, TMP, THR, Thread::OffsetFromThread(this));
+    __ str(TMP, Address(THR, Thread::vm_tag_offset()));
+    __ blx(TMP);
+    __ LoadImmediate(TMP, VMTag::kDartCompiledTagId);
+    __ str(TMP, Address(THR, Thread::vm_tag_offset()));
+    ASSERT((kAbiPreservedCpuRegs & (1 << THR)) != 0);
+    ASSERT((kAbiPreservedCpuRegs & (1 << PP)) != 0);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 04a80e6..a17870c 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -61,9 +61,14 @@
     __ ReserveAlignedFrameSpace(0);
     __ mov(CSP, SP);
     __ ldr(TMP, Address(THR, Thread::OffsetFromThread(this)));
+    __ str(TMP, Address(THR, Thread::vm_tag_offset()));
     __ blr(TMP);
+    __ LoadImmediate(TMP, VMTag::kDartCompiledTagId);
+    __ str(TMP, Address(THR, Thread::vm_tag_offset()));
     __ mov(SP, R25);
     __ mov(CSP, R23);
+    ASSERT((kAbiPreservedCpuRegs & (1 << THR)) != 0);
+    ASSERT((kAbiPreservedCpuRegs & (1 << PP)) != 0);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/runtime_entry_ia32.cc b/runtime/vm/runtime_entry_ia32.cc
index 917f6cc..26f300e 100644
--- a/runtime/vm/runtime_entry_ia32.cc
+++ b/runtime/vm/runtime_entry_ia32.cc
@@ -30,8 +30,10 @@
 void RuntimeEntry::Call(Assembler* assembler, intptr_t argument_count) const {
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
-    ExternalLabel label(GetEntryPoint());
-    __ call(&label);
+    __ movl(EAX, Immediate(GetEntryPoint()));
+    __ movl(Assembler::VMTagAddress(), EAX);
+    __ call(EAX);
+    __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 1ddd02b..fa97c63 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -24,6 +24,7 @@
   V(InlineCacheMissHandlerTwoArgs)                                             \
   V(StaticCallMissHandlerOneArg)                                               \
   V(StaticCallMissHandlerTwoArgs)                                              \
+  V(InterpretedInterfaceCallMissHandler)                                       \
   V(Instanceof)                                                                \
   V(SubtypeCheck)                                                              \
   V(TypeCheck)                                                                 \
@@ -46,8 +47,6 @@
   V(ReThrow)                                                                   \
   V(StackOverflow)                                                             \
   V(Throw)                                                                     \
-  V(TraceFunctionEntry)                                                        \
-  V(TraceFunctionExit)                                                         \
   V(DeoptimizeMaterialize)                                                     \
   V(RewindPostDeopt)                                                           \
   V(UpdateFieldCid)                                                            \
@@ -63,6 +62,7 @@
   V(void, DeoptimizeFillFrame, uword)                                          \
   V(void, StoreBufferBlockProcess, Thread*)                                    \
   V(void, MarkingStackBlockProcess, Thread*)                                   \
+  V(void, RememberCard, RawObject*, RawObject**)                               \
   V(double, LibcPow, double, double)                                           \
   V(double, DartModulo, double, double)                                        \
   V(double, LibcFloor, double)                                                 \
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index 105d71c..f84db6b 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -29,7 +29,11 @@
     ASSERT(argument_count == this->argument_count());
     COMPILE_ASSERT(CallingConventions::kVolatileCpuRegisters & (1 << RAX));
     __ movq(RAX, Address(THR, Thread::OffsetFromThread(this)));
+    __ movq(Assembler::VMTagAddress(), RAX);
     __ CallCFunction(RAX);
+    __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+    ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << THR)) != 0);
+    ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << PP)) != 0);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
deleted file mode 100644
index 765c869..0000000
--- a/runtime/vm/scanner.cc
+++ /dev/null
@@ -1,918 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/scanner.h"
-
-#include "platform/assert.h"
-#include "vm/dart.h"
-#include "vm/flags.h"
-#include "vm/object.h"
-#include "vm/object_store.h"
-#include "vm/symbols.h"
-#include "vm/token.h"
-#include "vm/unicode.h"
-
-namespace dart {
-
-// Quick access to the locally defined zone() and thread() methods.
-#define Z (zone())
-#define T (thread())
-
-class ScanContext : public ZoneAllocated {
- public:
-  explicit ScanContext(Scanner* scanner)
-      : next_(scanner->saved_context_),
-        string_delimiter_(scanner->string_delimiter_),
-        string_is_multiline_(scanner->string_is_multiline_),
-        brace_level_(scanner->brace_level_) {}
-
-  void CopyTo(Scanner* scanner) {
-    scanner->string_delimiter_ = string_delimiter_;
-    scanner->string_is_multiline_ = string_is_multiline_;
-    scanner->brace_level_ = brace_level_;
-  }
-
-  ScanContext* next() const { return next_; }
-
- private:
-  ScanContext* next_;
-  const char string_delimiter_;
-  const bool string_is_multiline_;
-  const int brace_level_;
-};
-
-Scanner::KeywordTable Scanner::keywords_[Token::kNumKeywords];
-int Scanner::keywords_char_offset_[Scanner::kNumLowercaseChars];
-
-void Scanner::Reset() {
-  // Non-changing newline properties.
-  newline_token_.kind = Token::kNEWLINE;
-  newline_token_.literal = NULL;
-  // We don't preserve the column information.
-  newline_token_.position.column = 0;
-
-  // Non-changing empty string token properties.
-  empty_string_token_.kind = Token::kSTRING;
-  empty_string_token_.literal = &Symbols::Empty();
-  empty_string_token_.position.column = 0;
-
-  lookahead_pos_ = -1;
-  token_start_ = 0;
-  c0_ = '\0';
-  newline_seen_ = false;
-  prev_token_line_ = 1;
-  saved_context_ = NULL;
-  string_delimiter_ = '\0';
-  string_is_multiline_ = false;
-  brace_level_ = 0;
-  c0_pos_.line = 1;
-  c0_pos_.column = 0;
-  ReadChar();
-}
-
-Scanner::Scanner(const String& src, const String& private_key)
-    : source_(src),
-      source_length_(src.Length()),
-      saved_context_(NULL),
-      private_key_(String::ZoneHandle(private_key.raw())),
-      char_at_func_(src.CharAtFunc()),
-      thread_(Thread::Current()),
-      zone_(thread_->zone()) {
-  Reset();
-}
-
-Scanner::~Scanner() {}
-
-void Scanner::ErrorMsg(const char* msg) {
-  current_token_.kind = Token::kERROR;
-  current_token_.literal = &String::ZoneHandle(Z, Symbols::New(T, msg));
-  current_token_.position = c0_pos_;
-  token_start_ = lookahead_pos_;
-  current_token_.offset = lookahead_pos_;
-}
-
-void Scanner::PushContext() {
-  ScanContext* ctx = new (Z) ScanContext(this);
-  saved_context_ = ctx;
-  string_delimiter_ = '\0';
-  string_is_multiline_ = false;
-  brace_level_ = 1;  // Account for the opening ${ token.
-}
-
-void Scanner::PopContext() {
-  ASSERT(saved_context_ != NULL);
-  ASSERT(brace_level_ == 0);
-  ASSERT(string_delimiter_ == '\0');
-  ScanContext* ctx = saved_context_;
-  ctx->CopyTo(this);
-  saved_context_ = ctx->next();
-  ASSERT(string_delimiter_ != '\0');
-}
-
-void Scanner::BeginStringLiteral(const char delimiter) {
-  string_delimiter_ = delimiter;
-}
-
-void Scanner::EndStringLiteral() {
-  string_delimiter_ = '\0';
-  string_is_multiline_ = false;
-}
-
-bool Scanner::IsLetter(int32_t c) {
-  return (('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z'));
-}
-
-bool Scanner::IsDecimalDigit(int32_t c) {
-  return '0' <= c && c <= '9';
-}
-
-bool Scanner::IsNumberStart(int32_t ch) {
-  return IsDecimalDigit(ch) || ch == '.';
-}
-
-bool Scanner::IsHexDigit(int32_t c) {
-  return IsDecimalDigit(c) || (('A' <= c) && (c <= 'F')) ||
-         (('a' <= c) && (c <= 'f'));
-}
-
-bool Scanner::IsIdentStartChar(int32_t c) {
-  return IsLetter(c) || (c == '_') || (c == '$');
-}
-
-bool Scanner::IsIdentChar(int32_t c) {
-  return IsLetter(c) || IsDecimalDigit(c) || (c == '_') || (c == '$');
-}
-
-bool Scanner::IsIdent(const String& str) {
-  if (!str.IsOneByteString()) {
-    return false;
-  }
-  if (str.Length() == 0 || !IsIdentStartChar(CallCharAt()(str, 0))) {
-    return false;
-  }
-  for (int i = 1; i < str.Length(); i++) {
-    if (!IsIdentChar(CallCharAt()(str, i))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-// This method is used when parsing integers in Dart code. We
-// are reusing the Scanner's handling of number literals in that situation.
-bool Scanner::IsValidInteger(const String& str,
-                             bool* is_positive,
-                             const String** value) {
-  Scanner s(str, Symbols::Empty());
-  TokenDescriptor tokens[3];
-  s.Scan();
-  tokens[0] = s.current_token();
-  s.Scan();
-  tokens[1] = s.current_token();
-  s.Scan();
-  tokens[2] = s.current_token();
-
-  if ((tokens[0].kind == Token::kINTEGER) && (tokens[1].kind == Token::kEOS)) {
-    *is_positive = true;
-    *value = tokens[0].literal;
-    return true;
-  }
-  if (((tokens[0].kind == Token::kADD) || (tokens[0].kind == Token::kSUB)) &&
-      (tokens[1].kind == Token::kINTEGER) && (tokens[2].kind == Token::kEOS)) {
-    // Check there is no space between "+/-" and number.
-    if ((tokens[0].offset + 1) != tokens[1].offset) {
-      return false;
-    }
-    *is_positive = tokens[0].kind == Token::kADD;
-    *value = tokens[1].literal;
-    return true;
-  }
-  return false;
-}
-
-void Scanner::ReadChar() {
-  if (lookahead_pos_ < source_length_) {
-    if (c0_ == '\n') {
-      newline_seen_ = true;
-      c0_pos_.line++;
-      c0_pos_.column = 0;
-      if (CallCharAt()(source_, lookahead_pos_) == '\r') {
-        // Replace a sequence of '\r' '\n' with a single '\n'.
-        if (LookaheadChar(1) == '\n') {
-          lookahead_pos_++;
-        }
-      }
-    }
-    lookahead_pos_++;
-    c0_pos_.column++;
-    c0_ = LookaheadChar(0);
-    // Replace '\r' with '\n'.
-    if (c0_ == '\r') {
-      c0_ = '\n';
-    }
-  }
-}
-
-// Look ahead 'how_many' characters. Returns the character, or '\0' if
-// the lookahead position is beyond the end of the string. Does not
-// normalize line end characters into '\n'.
-int32_t Scanner::LookaheadChar(int how_many) {
-  ASSERT(how_many >= 0);
-  int32_t lookahead_char = '\0';
-  if (lookahead_pos_ + how_many < source_length_) {
-    lookahead_char = CallCharAt()(source_, lookahead_pos_ + how_many);
-  }
-  return lookahead_char;
-}
-
-void Scanner::ConsumeWhiteSpace() {
-  while (c0_ == ' ' || c0_ == '\t' || c0_ == '\n') {
-    ReadChar();
-  }
-}
-
-void Scanner::ConsumeLineComment() {
-  ASSERT(c0_ == '/');
-  while (c0_ != '\n' && c0_ != '\0') {
-    ReadChar();
-  }
-  ReadChar();
-  current_token_.kind = Token::kWHITESP;
-}
-
-void Scanner::ConsumeBlockComment() {
-  ASSERT(c0_ == '*');
-  ReadChar();
-  int nesting_level = 1;
-
-  while (true) {
-    const char c = c0_;
-    ReadChar();
-    if (c0_ == '\0') {
-      break;
-    }
-    if (c == '/' && c0_ == '*') {
-      nesting_level++;
-      ReadChar();  // Consume asterisk.
-    } else if (c == '*' && c0_ == '/') {
-      nesting_level--;
-      ReadChar();  // Consume slash.
-      if (nesting_level == 0) {
-        break;
-      }
-    }
-  }
-  current_token_.kind =
-      (nesting_level == 0) ? Token::kWHITESP : Token::kILLEGAL;
-}
-
-void Scanner::ScanIdentChars(bool allow_dollar) {
-  ASSERT(IsIdentStartChar(c0_));
-  ASSERT(allow_dollar || (c0_ != '$'));
-  int ident_length = 0;
-  int ident_pos = lookahead_pos_;
-  int32_t ident_char0 = CallCharAt()(source_, ident_pos);
-  while (IsIdentChar(c0_) && (allow_dollar || (c0_ != '$'))) {
-    ReadChar();
-    ident_length++;
-  }
-
-  // Check whether the characters we read are a known keyword.
-  // Note, can't use strcmp since token_chars is not null-terminated.
-  if (('a' <= ident_char0) && (ident_char0 <= 'z')) {
-    int i = keywords_char_offset_[ident_char0 - 'a'];
-    while ((i < Token::kNumKeywords) &&
-           (keywords_[i].keyword_chars[0] <= ident_char0)) {
-      if (keywords_[i].keyword_len == ident_length) {
-        const char* keyword = keywords_[i].keyword_chars;
-        int char_pos = 1;
-        while ((char_pos < ident_length) &&
-               (keyword[char_pos] ==
-                CallCharAt()(source_, ident_pos + char_pos))) {
-          char_pos++;
-        }
-        if (char_pos == ident_length) {
-          current_token_.literal = keywords_[i].keyword_symbol;
-          current_token_.kind = keywords_[i].kind;
-          return;
-        }
-      }
-      i++;
-    }
-  }
-
-  // We did not read a keyword.
-  current_token_.kind = Token::kIDENT;
-  String& literal = String::ZoneHandle(Z);
-  if (ident_char0 == Library::kPrivateIdentifierStart) {
-    // Private identifiers are mangled on a per library basis.
-    literal = String::SubString(T, source_, ident_pos, ident_length);
-    literal = Symbols::FromConcat(T, literal, private_key_);
-  } else {
-    literal = Symbols::New(T, source_, ident_pos, ident_length);
-  }
-  current_token_.literal = &literal;
-}
-
-// Parse integer or double number literal of format:
-// NUMBER = INTEGER | DOUBLE
-// INTEGER = D+ | (("0x" | "0X") H+)
-// DOUBLE = ((D+ ["." D*]) | ("." D+)) [ EXPONENT ]
-// EXPONENT = ("e" | "E") ["+" | "-"] D+
-void Scanner::ScanNumber(bool dec_point_seen) {
-  ASSERT(IsDecimalDigit(c0_));
-  char first_digit = c0_;
-
-  Recognize(dec_point_seen ? Token::kDOUBLE : Token::kINTEGER);
-  if (!dec_point_seen && first_digit == '0' && (c0_ == 'x' || c0_ == 'X')) {
-    ReadChar();
-    if (!IsHexDigit(c0_)) {
-      ErrorMsg("hexadecimal digit expected");
-      return;
-    }
-    while (IsHexDigit(c0_)) {
-      ReadChar();
-    }
-  } else {
-    while (IsDecimalDigit(c0_)) {
-      ReadChar();
-    }
-    if (c0_ == '.' && !dec_point_seen && IsDecimalDigit(LookaheadChar(1))) {
-      Recognize(Token::kDOUBLE);
-      while (IsDecimalDigit(c0_)) {
-        ReadChar();
-      }
-    }
-    if (((c0_ == 'e') || (c0_ == 'E')) &&
-        (IsDecimalDigit(LookaheadChar(1)) || (LookaheadChar(1) == '-') ||
-         (LookaheadChar(1) == '+'))) {
-      Recognize(Token::kDOUBLE);
-      if ((c0_ == '-') || (c0_ == '+')) {
-        ReadChar();
-      }
-      if (!IsDecimalDigit(c0_)) {
-        ErrorMsg("missing exponent digits");
-        return;
-      }
-      while (IsDecimalDigit(c0_)) {
-        ReadChar();
-      }
-    }
-  }
-  if (current_token_.kind != Token::kILLEGAL) {
-    intptr_t len = lookahead_pos_ - token_start_;
-    const String& str =
-        String::ZoneHandle(Z, Symbols::New(T, source_, token_start_, len));
-    current_token_.literal = &str;
-  }
-}
-
-void Scanner::SkipLine() {
-  while (c0_ != '\n' && c0_ != '\0') {
-    ReadChar();
-  }
-}
-
-void Scanner::ScanScriptTag() {
-  ReadChar();
-  ASSERT(c0_ == '!');
-  Recognize(Token::kSCRIPTTAG);
-  // The script tag extends to the end of the line. Just treat this
-  // similar to a line comment.
-  SkipLine();
-}
-
-void Scanner::ScanLiteralString(bool is_raw) {
-  ASSERT(!IsScanningString());
-  ASSERT(c0_ == '"' || c0_ == '\'');
-
-  // Entering string scanning mode.
-  BeginStringLiteral(c0_);
-  ReadChar();
-
-  if ((c0_ == string_delimiter_) && (LookaheadChar(1) == string_delimiter_)) {
-    string_is_multiline_ = true;
-    ReadChar();  // Skip two additional string delimiters.
-    ReadChar();
-  }
-  ScanLiteralStringChars(is_raw, string_is_multiline_);
-}
-
-bool Scanner::ScanHexDigits(int digits, int32_t* value) {
-  *value = 0;
-  for (int i = 0; i < digits; ++i) {
-    ReadChar();
-    if (!IsHexDigit(c0_)) {
-      ErrorMsg("too few hexadecimal digits");
-      return false;
-    }
-    *value <<= 4;
-    *value |= Utils::HexDigitToInt(c0_);
-  }
-  return true;
-}
-
-bool Scanner::ScanHexDigits(int min_digits, int max_digits, int32_t* value) {
-  *value = 0;
-  ReadChar();
-  for (int i = 0; i < max_digits; ++i) {
-    if (!IsHexDigit(c0_)) {
-      if (i < min_digits) {
-        ErrorMsg("hexadecimal digit expected");
-        return false;
-      }
-      break;
-    }
-    *value <<= 4;
-    *value |= Utils::HexDigitToInt(c0_);
-    ReadChar();
-  }
-  return true;
-}
-
-void Scanner::ScanEscapedCodePoint(int32_t* code_point) {
-  ASSERT(c0_ == 'u' || c0_ == 'x');
-  bool is_valid;
-  if (c0_ == 'x') {
-    is_valid = ScanHexDigits(2, code_point);
-  } else if (c0_ == 'u' && LookaheadChar(1) != '{') {
-    is_valid = ScanHexDigits(4, code_point);
-  } else {
-    ReadChar();  // Skip left curly bracket.
-    is_valid = ScanHexDigits(1, 6, code_point);
-    if (is_valid) {
-      if (c0_ != '}') {
-        ErrorMsg("expected '}' after character code");
-        return;
-      }
-    }
-  }
-  if (is_valid && (Utf::IsOutOfRange(*code_point))) {
-    ErrorMsg("invalid code point");
-  }
-}
-
-void Scanner::ScanLiteralStringChars(bool is_raw, bool remove_whitespace) {
-  GrowableArray<int32_t> string_chars(64);
-
-  ASSERT(IsScanningString());
-  // We are at the first character of a string literal piece. A string literal
-  // can be broken up into multiple pieces by string interpolation.
-  while (true) {
-    if ((c0_ == '\0') || ((c0_ == '\n') && !string_is_multiline_)) {
-      ErrorMsg("unterminated string literal");
-      EndStringLiteral();
-      return;
-    }
-    if (c0_ == '\\' && !is_raw) {
-      // Parse escape sequence.
-      int32_t escape_char = '\0';
-      ReadChar();
-      switch (c0_) {
-        case 'n':
-          escape_char = '\n';
-          break;
-        case 'r':
-          escape_char = '\r';
-          break;
-        case 'f':
-          escape_char = '\f';
-          break;
-        case 't':
-          escape_char = '\t';
-          break;
-        case 'b':
-          escape_char = '\b';
-          break;
-        case 'v':
-          escape_char = '\v';
-          break;
-        case 'u':
-        case 'x': {
-          ScanEscapedCodePoint(&escape_char);
-          break;
-        }
-        default:
-          if ((c0_ == '\0') || ((c0_ == '\n') && !string_is_multiline_)) {
-            ErrorMsg("unterminated string literal");
-            EndStringLiteral();
-            return;
-          }
-          escape_char = c0_;
-          break;
-      }
-      string_chars.Add(escape_char);
-    } else if (c0_ == '$' && !is_raw) {
-      // Scanned a string piece.
-      ASSERT(string_chars.data() != NULL);
-      // Strings are canonicalized: Allocate a symbol.
-      current_token_.literal = &String::ZoneHandle(
-          Z, Symbols::FromUTF32(T, string_chars.data(), string_chars.length()));
-      // Preserve error tokens.
-      if (current_token_.kind != Token::kERROR) {
-        current_token_.kind = Token::kSTRING;
-      }
-      return;
-    } else if (c0_ == string_delimiter_) {
-      // Check if we are at the end of the string literal.
-      if (!string_is_multiline_ || ((LookaheadChar(1) == string_delimiter_) &&
-                                    (LookaheadChar(2) == string_delimiter_))) {
-        if (string_is_multiline_) {
-          ReadChar();  // Skip two string delimiters.
-          ReadChar();
-        }
-        // Preserve error tokens.
-        if (current_token_.kind == Token::kERROR) {
-          ReadChar();
-        } else {
-          Recognize(Token::kSTRING);
-          ASSERT(string_chars.data() != NULL);
-          // Strings are canonicalized: Allocate a symbol.
-          current_token_.literal =
-              &String::ZoneHandle(Z, Symbols::FromUTF32(T, string_chars.data(),
-                                                        string_chars.length()));
-        }
-        EndStringLiteral();
-        return;
-      } else {
-        string_chars.Add(string_delimiter_);
-      }
-    } else {
-      // Test for a two part utf16 sequence, and decode to a code point
-      // if we find one.
-      int32_t ch1 = c0_;
-      if (Utf16::IsLeadSurrogate(ch1)) {
-        const int32_t ch2 = LookaheadChar(1);
-        if (Utf16::IsTrailSurrogate(ch2)) {
-          ch1 = Utf16::Decode(ch1, ch2);
-          ReadChar();
-        }
-      }
-      string_chars.Add(ch1);
-    }
-    // The first line of a multi-line string is discarded if it only
-    // contains whitespace.
-    if (remove_whitespace && (string_chars.Last() == '\n')) {
-      bool whitespace_only = true;
-      // Last character is the newline, don't inspect it.
-      const intptr_t len = string_chars.length() - 1;
-      for (int i = 0; i < len; i++) {
-        int32_t ch = string_chars[i];
-        if ((ch != ' ') && (ch != '\t')) {
-          // Non-whitespace character, keep the first line.
-          whitespace_only = false;
-          break;
-        }
-      }
-      if (whitespace_only) {
-        string_chars.Clear();  // Discard characters on first line.
-      }
-      remove_whitespace = false;
-    }
-    ReadChar();
-  }
-}
-
-void Scanner::Scan() {
-  newline_seen_ = false;
-
-  do {
-    if (!IsScanningString()) {
-      ConsumeWhiteSpace();
-    }
-    token_start_ = lookahead_pos_;
-    current_token_.offset = lookahead_pos_;
-    current_token_.position = c0_pos_;
-    current_token_.literal = NULL;
-    current_token_.kind = Token::kILLEGAL;
-    if (IsScanningString()) {
-      if (c0_ == '$') {
-        ReadChar();  // Skip the '$' character.
-        if (IsIdentStartChar(c0_) && (c0_ != '$')) {
-          ScanIdentNoDollar();
-          current_token_.kind = Token::kINTERPOL_VAR;
-        } else if (c0_ == '{') {
-          Recognize(Token::kINTERPOL_START);
-          PushContext();
-        } else {
-          ErrorMsg("illegal character after $ in string interpolation");
-          EndStringLiteral();
-          break;
-        }
-      } else {
-        ScanLiteralStringChars(false, false);
-      }
-      break;
-    }
-    switch (c0_) {
-      case '\0':
-        current_token_.kind = Token::kEOS;
-        break;
-
-      case '+':  // +  ++  +=
-        Recognize(Token::kADD);
-        if (c0_ == '+') {
-          Recognize(Token::kINCR);
-        } else if (c0_ == '=') {
-          Recognize(Token::kASSIGN_ADD);
-        }
-        break;
-
-      case '-':  // -  --  -=
-        Recognize(Token::kSUB);
-        if (c0_ == '-') {
-          Recognize(Token::kDECR);
-        } else if (c0_ == '=') {
-          Recognize(Token::kASSIGN_SUB);
-        }
-        break;
-
-      case '*':  // *  *=
-        Recognize(Token::kMUL);
-        if (c0_ == '=') {
-          Recognize(Token::kASSIGN_MUL);
-        }
-        break;
-
-      case '%':  // %  %=
-        Recognize(Token::kMOD);
-        if (c0_ == '=') {
-          Recognize(Token::kASSIGN_MOD);
-        }
-        break;
-
-      case '/':  //  /  /=  //  /*
-        Recognize(Token::kDIV);
-        if (c0_ == '/') {
-          ConsumeLineComment();
-        } else if (c0_ == '*') {
-          ConsumeBlockComment();
-        } else if (c0_ == '=') {
-          Recognize(Token::kASSIGN_DIV);
-        }
-        break;
-
-      case '&':  // &  &=  &&
-        Recognize(Token::kBIT_AND);
-        if (c0_ == '=') {
-          Recognize(Token::kASSIGN_AND);
-        } else if (c0_ == '&') {
-          Recognize(Token::kAND);
-        }
-        break;
-
-      case '|':  // |  |=  ||
-        Recognize(Token::kBIT_OR);
-        if (c0_ == '=') {
-          Recognize(Token::kASSIGN_OR);
-        } else if (c0_ == '|') {
-          Recognize(Token::kOR);
-        }
-        break;
-
-      case '^':  // ^  ^=
-        Recognize(Token::kBIT_XOR);
-        if (c0_ == '=') {
-          Recognize(Token::kASSIGN_XOR);
-        }
-        break;
-
-      case '[':  // [  []  []=
-        Recognize(Token::kLBRACK);
-        if (c0_ == ']') {
-          Recognize(Token::kINDEX);
-          if (c0_ == '=') {
-            Recognize(Token::kASSIGN_INDEX);
-          }
-        }
-        break;
-
-      case ']':  //  ]
-        Recognize(Token::kRBRACK);
-        break;
-
-      case '<':  // <  <=  <<  <<=
-        Recognize(Token::kLT);
-        if (c0_ == '=') {
-          Recognize(Token::kLTE);
-        } else if (c0_ == '<') {
-          Recognize(Token::kSHL);
-          if (c0_ == '=') {
-            Recognize(Token::kASSIGN_SHL);
-          }
-        }
-        break;
-
-      case '>':  // >  >=  >>  >>=
-        Recognize(Token::kGT);
-        if (c0_ == '=') {
-          Recognize(Token::kGTE);
-        } else if (c0_ == '>') {
-          Recognize(Token::kSHR);
-          if (c0_ == '=') {
-            Recognize(Token::kASSIGN_SHR);
-          }
-        }
-        break;
-
-      case '!':  // !  !=
-        Recognize(Token::kNOT);
-        if (c0_ == '=') {
-          Recognize(Token::kNE);
-        }
-        break;
-
-      case '~':
-        Recognize(Token::kBIT_NOT);
-        if (c0_ == '/') {
-          Recognize(Token::kTRUNCDIV);
-          if (c0_ == '=') {
-            Recognize(Token::kASSIGN_TRUNCDIV);
-          }
-        }
-        break;
-
-      case '=':  // =  ==  =>
-        Recognize(Token::kASSIGN);
-        if (c0_ == '=') {
-          Recognize(Token::kEQ);
-        } else if (c0_ == '>') {
-          Recognize(Token::kARROW);
-        }
-        break;
-
-      case '.':  // .  ..  Number
-        Recognize(Token::kPERIOD);
-        if (c0_ == '.') {
-          Recognize(Token::kCASCADE);
-        } else if (IsDecimalDigit(c0_)) {
-          ScanNumber(true);
-        }
-        break;
-
-      case '?':  // ?  ?.  ??  ??=
-        Recognize(Token::kCONDITIONAL);
-        if (c0_ == '.') {
-          Recognize(Token::kQM_PERIOD);
-        } else if (c0_ == '?') {
-          Recognize(Token::kIFNULL);
-          if (c0_ == '=') {
-            Recognize(Token::kASSIGN_COND);
-          }
-        }
-        break;
-
-      case ':':
-        Recognize(Token::kCOLON);
-        break;
-
-      case ';':
-        Recognize(Token::kSEMICOLON);
-        break;
-
-      case '{':
-        Recognize(Token::kLBRACE);
-        if (IsNestedContext()) {
-          brace_level_++;
-        }
-        break;
-
-      case '}':
-        Recognize(Token::kRBRACE);
-        if (IsNestedContext()) {
-          ASSERT(brace_level_ > 0);
-          brace_level_--;
-          if (brace_level_ == 0) {
-            current_token_.kind = Token::kINTERPOL_END;
-            PopContext();
-          }
-        }
-        break;
-
-      case '(':
-        Recognize(Token::kLPAREN);
-        break;
-
-      case ')':
-        Recognize(Token::kRPAREN);
-        break;
-
-      case ',':
-        Recognize(Token::kCOMMA);
-        break;
-
-      case '@':
-        Recognize(Token::kAT);
-        break;
-
-      case 'r':
-        if ((LookaheadChar(1) == '"') || (LookaheadChar(1) == '\'')) {
-          ReadChar();
-          ScanLiteralString(true);
-        } else {
-          ScanIdent();
-        }
-        break;
-
-      case '"':
-      case '\'':
-        ScanLiteralString(false);
-        break;
-
-      case '#':
-        if (LookaheadChar(1) == '!') {
-          ScanScriptTag();
-        } else {
-          Recognize(Token::kHASH);
-        }
-        break;
-
-      default:
-        if (IsIdentStartChar(c0_)) {
-          ScanIdent();
-        } else if (IsDecimalDigit(c0_)) {
-          ScanNumber(false);
-        } else {
-          char msg[128];
-          char utf8_char[5];
-          int len = Utf8::Encode(c0_, utf8_char);
-          utf8_char[len] = '\0';
-          Utils::SNPrint(msg, sizeof(msg),
-                         "unexpected character: '%s' (U+%04X)\n", utf8_char,
-                         c0_);
-          ErrorMsg(msg);
-          ReadChar();
-        }
-    }
-  } while (current_token_.kind == Token::kWHITESP);
-}
-
-void Scanner::ScanAll(TokenCollector* collector) {
-  Reset();
-  do {
-    Scan();
-    bool inserted_new_lines = false;
-    for (intptr_t diff = current_token_.position.line - prev_token_line_;
-         diff > 0; diff--) {
-      newline_token_.position.line = current_token_.position.line - diff;
-      collector->AddToken(newline_token_);
-      inserted_new_lines = true;
-    }
-    if (inserted_new_lines &&
-        ((current_token_.kind == Token::kINTERPOL_VAR) ||
-         (current_token_.kind == Token::kINTERPOL_START))) {
-      // NOTE: If this changes, be sure to update
-      // Script::GenerateLineNumberArray to stay in sync.
-      empty_string_token_.position.line = current_token_.position.line;
-      collector->AddToken(empty_string_token_);
-    }
-    collector->AddToken(current_token_);
-    prev_token_line_ = current_token_.position.line;
-  } while (current_token_.kind != Token::kEOS);
-}
-
-void Scanner::ScanTo(intptr_t token_index) {
-  ASSERT(token_index >= 0);
-  intptr_t index = 0;
-  Reset();
-  do {
-    Scan();
-    bool inserted_new_lines = false;
-    for (intptr_t diff = current_token_.position.line - prev_token_line_;
-         diff > 0; diff--) {
-      // Advance the index to account for tokens added in ScanAll.
-      index++;
-      inserted_new_lines = true;
-    }
-    if (inserted_new_lines &&
-        ((current_token_.kind == Token::kINTERPOL_VAR) ||
-         (current_token_.kind == Token::kINTERPOL_START))) {
-      // Advance the index to account for tokens added in ScanAll.
-      index++;
-    }
-    index++;
-    prev_token_line_ = current_token_.position.line;
-  } while ((token_index >= index) && (current_token_.kind != Token::kEOS));
-}
-
-void Scanner::Init() {
-  ASSERT(Isolate::Current() == Dart::vm_isolate());
-  for (int i = 0; i < kNumLowercaseChars; i++) {
-    keywords_char_offset_[i] = Token::kNumKeywords;
-  }
-  for (int i = 0; i < Token::kNumKeywords; i++) {
-    Token::Kind token = static_cast<Token::Kind>(Token::kFirstKeyword + i);
-    keywords_[i].kind = token;
-    keywords_[i].keyword_chars = Token::Str(token);
-    keywords_[i].keyword_len = strlen(Token::Str(token));
-    keywords_[i].keyword_symbol = &Symbols::Token(token);
-
-    int ch = keywords_[i].keyword_chars[0] - 'a';
-    if (keywords_char_offset_[ch] == Token::kNumKeywords) {
-      keywords_char_offset_[ch] = i;
-    }
-  }
-}
-
-}  // namespace dart
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
deleted file mode 100644
index 69ce33e..0000000
--- a/runtime/vm/scanner.h
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// Scanner class for the Dart language. The scanner reads source text
-// and produces a stream of tokens which is used by the parser.
-//
-
-#ifndef RUNTIME_VM_SCANNER_H_
-#define RUNTIME_VM_SCANNER_H_
-
-#include "vm/growable_array.h"
-#include "vm/token.h"
-
-namespace dart {
-
-// Forward declarations.
-class Array;
-class Library;
-class RawString;
-class ScanContext;
-class String;
-
-// A call to Scan() scans the source one token at at time.
-// The scanned token is returned by current_token().
-// GetStream() scans the entire source text and returns a stream of tokens.
-class Scanner : ValueObject {
- public:
-  typedef uint16_t (*CharAtFunc)(const String& str, intptr_t index);
-
-  // SourcePosition describes a text location in user friendly
-  // terms of line number and column.
-  struct SourcePosition {
-    int line;
-    int column;
-  };
-
-  // TokenDesc defines the kind of a token and its location in
-  // the source text.
-  struct TokenDescriptor {
-    Token::Kind kind;
-    int offset;               // Offset in source string.
-    SourcePosition position;  // Text position in source.
-    const String* literal;    // Identifier, number or string literal.
-  };
-
-  class TokenCollector : public ValueObject {
-   public:
-    TokenCollector() {}
-    virtual ~TokenCollector() {}
-    virtual void AddToken(const TokenDescriptor& token) {}
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(TokenCollector);
-  };
-
-  // Initializes scanner to scan string source.
-  Scanner(const String& source, const String& private_key);
-  ~Scanner();
-
-  // Scans one token at a time.
-  void Scan();
-
-  // Scans the entire source and collects tokens in the provided collector.
-  void ScanAll(TokenCollector* collector);
-
-  // Scans to specified token position.
-  // Use CurrentPosition() to extract line and column number.
-  void ScanTo(intptr_t token_index);
-
-  // Info about most recently recognized token.
-  const TokenDescriptor& current_token() const { return current_token_; }
-
-  // Was there a line break before the current token?
-  bool NewlineBeforeToken() const { return newline_seen_; }
-
-  // Source code line number and column of current token.
-  const SourcePosition& CurrentPosition() const {
-    return current_token_.position;
-  }
-
-  static void Init();
-
-  // Return true if str is an identifier.
-  bool IsIdent(const String& str);
-
-  // Does the token stream contain a valid integer literal.
-  static bool IsValidInteger(const String& str,
-                             bool* is_positive,
-                             const String** value);
-
-  static bool IsIdentStartChar(int32_t c);
-  static bool IsIdentChar(int32_t c);
-
- private:
-  friend class ScanContext;
-
-  static const int kNumLowercaseChars = 26;
-
-  struct KeywordTable {
-    Token::Kind kind;
-    const char* keyword_chars;
-    int keyword_len;
-    const String* keyword_symbol;
-  };
-
-  // Rewind scanner position to token 0.
-  void Reset();
-
-  // Reads next lookahead character.
-  void ReadChar();
-
-  // Read and discard characters up to end of line.
-  void SkipLine();
-
-  // Recognizes token 'kind' and reads next character in input.
-  void Recognize(Token::Kind kind) {
-    ReadChar();
-    current_token_.kind = kind;
-  }
-
-  int32_t LookaheadChar(int how_many);
-
-  void ErrorMsg(const char* msg);
-
-  // These functions return true if the given character is a letter,
-  // a decimal digit, a hexadecimal digit, etc.
-  static bool IsLetter(int32_t c);
-  static bool IsDecimalDigit(int32_t c);
-  static bool IsNumberStart(int32_t);
-  static bool IsHexDigit(int32_t c);
-
-  // Skips up to next non-whitespace character.
-  void ConsumeWhiteSpace();
-
-  // Skips characters up to end of line.
-  void ConsumeLineComment();
-
-  // Skips characters up to matching '*/'.
-  void ConsumeBlockComment();
-
-  // Is this scanner currently scanning a string literal.
-  bool IsScanningString() const { return string_delimiter_ != '\0'; }
-  void BeginStringLiteral(const char delimiter);
-  void EndStringLiteral();
-
-  // Is this scanner currently scanning a string interpolation expression.
-  bool IsNestedContext() const { return saved_context_ != NULL; }
-  void PushContext();
-  void PopContext();
-
-  // Starts reading a string literal.
-  void ScanLiteralString(bool is_raw);
-
-  // Read the characters of a string literal. Remove whitespace up to
-  // and including the first newline character if remove_whitespace
-  // is true.
-  void ScanLiteralStringChars(bool is_raw, bool remove_whitespace);
-
-  // Reads a fixed number of hexadecimal digits.
-  bool ScanHexDigits(int digits, int32_t* value);
-
-  // Reads a variable number of hexadecimal digits.
-  bool ScanHexDigits(int min_digits, int max_digits, int32_t* value);
-
-  // Reads an escaped code point from within a string literal.
-  void ScanEscapedCodePoint(int32_t* escaped_char);
-
-  // Reads identifier.
-  void ScanIdentChars(bool allow_dollar);
-  void ScanIdent() { ScanIdentChars(true); }
-  void ScanIdentNoDollar() { ScanIdentChars(false); }
-
-  // Reads a number literal.
-  void ScanNumber(bool dec_point_seen);
-
-  void ScanScriptTag();
-
-  CharAtFunc CallCharAt() const { return char_at_func_; }
-
-  Thread* thread() const { return thread_; }
-  Zone* zone() const { return zone_; }
-
-  TokenDescriptor current_token_;       // Current token.
-  TokenDescriptor newline_token_;       // Newline token.
-  TokenDescriptor empty_string_token_;  // Token for "".
-  const String& source_;                // The source text being tokenized.
-  intptr_t source_length_;              // The length of the source text.
-  intptr_t lookahead_pos_;              // Position of lookahead character
-                                        // within source_.
-  intptr_t token_start_;                // Begin of current token in src_.
-  int32_t c0_;                          // Lookahead character.
-  bool newline_seen_;                   // Newline before current token.
-  intptr_t prev_token_line_;            // Line number of the previous token.
-
-  // The following fields keep track whether we are scanning a string literal
-  // and its interpolated expressions.
-  ScanContext* saved_context_;
-  int32_t string_delimiter_;
-  bool string_is_multiline_;
-  int brace_level_;
-
-  const String& private_key_;
-
-  SourcePosition c0_pos_;  // Source position of lookahead character c0_.
-
-  const CharAtFunc char_at_func_;
-
-  Thread* thread_;
-  Zone* zone_;
-
-  static KeywordTable keywords_[Token::kNumKeywords];
-  static int keywords_char_offset_[kNumLowercaseChars];
-};
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_SCANNER_H_
diff --git a/runtime/vm/scanner_test.cc b/runtime/vm/scanner_test.cc
deleted file mode 100644
index f7546cb..0000000
--- a/runtime/vm/scanner_test.cc
+++ /dev/null
@@ -1,398 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/scanner.h"
-#include "platform/assert.h"
-#include "vm/os.h"
-#include "vm/token.h"
-#include "vm/unit_test.h"
-
-namespace dart {
-
-typedef ZoneGrowableArray<Scanner::TokenDescriptor> GrowableTokenStream;
-
-static void LogTokenDesc(Scanner::TokenDescriptor token) {
-  OS::PrintErr("pos %2d:%d-%d token %s  ", token.position.line,
-               token.position.column, token.position.column,
-               Token::Name(token.kind));
-  if (token.literal != NULL) {
-    OS::PrintErr("%s", token.literal->ToCString());
-  }
-  OS::PrintErr("\n");
-}
-
-static void LogTokenStream(const GrowableTokenStream& token_stream) {
-  int token_index = 0;
-  EXPECT_GT(token_stream.length(), 0);
-  while (token_index < token_stream.length()) {
-    LogTokenDesc(token_stream[token_index]);
-    ASSERT(token_stream[token_index].kind != Token::kILLEGAL);
-    token_index++;
-  }
-  printf("%d tokens in stream.\n", token_index);
-  EXPECT_EQ(token_stream.Last().kind, Token::kEOS);
-}
-
-static void CheckKind(const GrowableTokenStream& token_stream,
-                      int index,
-                      Token::Kind kind) {
-  if (token_stream[index].kind != kind) {
-    OS::PrintErr("Token %d: expected kind %s but got %s\n", index,
-                 Token::Name(kind), Token::Name(token_stream[index].kind));
-  }
-  EXPECT_EQ(kind, token_stream[index].kind);
-}
-
-static void CheckLiteral(const GrowableTokenStream& token_stream,
-                         int index,
-                         const char* literal) {
-  if (token_stream[index].literal == NULL) {
-    OS::PrintErr("Token %d: expected literal \"%s\" but got nothing\n", index,
-                 literal);
-  } else if (strcmp(literal, token_stream[index].literal->ToCString())) {
-    OS::PrintErr("Token %d: expected literal \"%s\" but got \"%s\"\n", index,
-                 literal, token_stream[index].literal->ToCString());
-  }
-}
-
-static void CheckIdent(const GrowableTokenStream& token_stream,
-                       int index,
-                       const char* literal) {
-  CheckKind(token_stream, index, Token::kIDENT);
-  CheckLiteral(token_stream, index, literal);
-}
-
-static void CheckInteger(const GrowableTokenStream& token_stream,
-                         int index,
-                         const char* literal) {
-  CheckKind(token_stream, index, Token::kINTEGER);
-  CheckLiteral(token_stream, index, literal);
-}
-
-static void CheckLineNumber(const GrowableTokenStream& token_stream,
-                            int index,
-                            int line_number) {
-  if (token_stream[index].position.line != line_number) {
-    OS::PrintErr("Token %d: expected line number %d but got %d\n", index,
-                 line_number, token_stream[index].position.line);
-  }
-}
-
-static void CheckNumTokens(const GrowableTokenStream& token_stream, int index) {
-  if (token_stream.length() != index) {
-    OS::PrintErr("Expected %d tokens but got only %" Pd ".\n", index,
-                 token_stream.length());
-  }
-}
-
-class Collector : public Scanner::TokenCollector {
- public:
-  explicit Collector(GrowableTokenStream* ts) : ts_(ts) {}
-  virtual ~Collector() {}
-
-  virtual void AddToken(const Scanner::TokenDescriptor& token) {
-    ts_->Add(token);
-  }
-
- private:
-  GrowableTokenStream* ts_;
-};
-
-static const GrowableTokenStream& Scan(const char* source) {
-  OS::PrintErr("\nScanning: <%s>\n", source);
-
-  Scanner scanner(String::Handle(String::New(source)),
-                  String::Handle(String::New("")));
-  GrowableTokenStream* tokens = new GrowableTokenStream(128);
-  Collector collector(tokens);
-
-  scanner.ScanAll(&collector);
-  LogTokenStream(*tokens);
-  return *tokens;
-}
-
-static void BoringTest() {
-  const GrowableTokenStream& tokens = Scan("x = iffy++;");
-
-  CheckNumTokens(tokens, 6);
-  CheckIdent(tokens, 0, "x");
-  CheckKind(tokens, 1, Token::kASSIGN);
-  CheckIdent(tokens, 2, "iffy");
-  CheckKind(tokens, 3, Token::kINCR);
-  CheckKind(tokens, 4, Token::kSEMICOLON);
-}
-
-static void CommentTest() {
-  const GrowableTokenStream& tokens = Scan(
-      "Foo( /*block \n"
-      "comment*/ 0xff) // line comment;");
-
-  CheckNumTokens(tokens, 6);
-  CheckIdent(tokens, 0, "Foo");
-  CheckLineNumber(tokens, 0, 1);
-  CheckKind(tokens, 1, Token::kLPAREN);
-  CheckKind(tokens, 2, Token::kNEWLINE);
-  CheckInteger(tokens, 3, "0xff");
-  CheckKind(tokens, 4, Token::kRPAREN);
-  CheckLineNumber(tokens, 4, 2);
-}
-
-static void GreedIsGood() {
-  // means i++ + j
-  const GrowableTokenStream& tokens = Scan("x=i+++j");
-
-  CheckNumTokens(tokens, 7);
-  CheckIdent(tokens, 0, "x");
-  CheckKind(tokens, 1, Token::kASSIGN);
-  CheckIdent(tokens, 2, "i");
-  CheckKind(tokens, 3, Token::kINCR);
-  CheckKind(tokens, 4, Token::kADD);
-  CheckIdent(tokens, 5, "j");
-}
-
-static void StringEscapes() {
-  // sss = "\" \\ \n\r\t \'"
-  const GrowableTokenStream& tokens =
-      Scan("sss = \"\\\" \\\\ \\n\\r\\t \\\'\"");
-
-  EXPECT_EQ(4, tokens.length());
-  CheckIdent(tokens, 0, "sss");
-  CheckKind(tokens, 1, Token::kASSIGN);
-  CheckKind(tokens, 2, Token::kSTRING);
-  CheckKind(tokens, 3, Token::kEOS);
-  CheckLineNumber(tokens, 2, 1);
-  const char* litchars = (tokens)[2].literal->ToCString();
-  EXPECT_EQ(9, (tokens)[2].literal->Length());
-
-  EXPECT_EQ('"', litchars[0]);
-  EXPECT_EQ(' ', litchars[1]);
-  EXPECT_EQ('\\', litchars[2]);
-  EXPECT_EQ('\n', litchars[4]);
-  EXPECT_EQ('\r', litchars[5]);
-  EXPECT_EQ('\t', litchars[6]);
-  EXPECT_EQ('\'', litchars[8]);
-}
-
-static void InvalidStringEscapes() {
-  const GrowableTokenStream& out_of_range_low = Scan("\"\\u{110000}\"");
-  EXPECT_EQ(2, out_of_range_low.length());
-  CheckKind(out_of_range_low, 0, Token::kERROR);
-  EXPECT(out_of_range_low[0].literal->Equals("invalid code point"));
-  CheckKind(out_of_range_low, 1, Token::kEOS);
-
-  const GrowableTokenStream& out_of_range_high = Scan("\"\\u{FFFFFF}\"");
-  EXPECT_EQ(2, out_of_range_high.length());
-  CheckKind(out_of_range_high, 0, Token::kERROR);
-  EXPECT(out_of_range_high[0].literal->Equals("invalid code point"));
-  CheckKind(out_of_range_high, 1, Token::kEOS);
-}
-
-static void RawString() {
-  // rs = @"\' \\"
-  const GrowableTokenStream& tokens = Scan("rs = r\"\\\' \\\\\"");
-
-  EXPECT_EQ(4, tokens.length());
-  CheckIdent(tokens, 0, "rs");
-  CheckKind(tokens, 1, Token::kASSIGN);
-  CheckKind(tokens, 2, Token::kSTRING);
-  CheckKind(tokens, 3, Token::kEOS);
-  CheckLineNumber(tokens, 2, 1);
-  const char* litchars = (tokens)[2].literal->ToCString();
-  EXPECT_EQ(5, (tokens)[2].literal->Length());
-
-  EXPECT_EQ('\\', litchars[0]);
-  EXPECT_EQ('\'', litchars[1]);
-  EXPECT_EQ(' ', litchars[2]);
-  EXPECT_EQ('\\', litchars[3]);
-  EXPECT_EQ('\\', litchars[4]);
-}
-
-static void MultilineString() {
-  // |mls = '''
-  // |1' x
-  // |2''';
-  const GrowableTokenStream& tokens = Scan("mls = '''\n1' x\n2''';");
-
-  EXPECT_EQ(7, tokens.length());
-  CheckIdent(tokens, 0, "mls");
-  CheckKind(tokens, 1, Token::kASSIGN);
-  CheckKind(tokens, 2, Token::kSTRING);
-  CheckKind(tokens, 3, Token::kNEWLINE);
-  CheckKind(tokens, 4, Token::kNEWLINE);
-  CheckKind(tokens, 5, Token::kSEMICOLON);
-  CheckKind(tokens, 6, Token::kEOS);
-  CheckLineNumber(tokens, 0, 1);
-  CheckLineNumber(tokens, 5, 3);  // Semicolon is on line 3.
-  const char* litchars = (tokens)[2].literal->ToCString();
-  EXPECT_EQ(6, (tokens)[2].literal->Length());
-
-  EXPECT_EQ('1', litchars[0]);  // First newline is dropped.
-  EXPECT_EQ('\'', litchars[1]);
-  EXPECT_EQ(' ', litchars[2]);
-  EXPECT_EQ('x', litchars[3]);
-  EXPECT_EQ('\n', litchars[4]);
-  EXPECT_EQ('2', litchars[5]);
-}
-
-static void EmptyString() {
-  // es = "";
-  const GrowableTokenStream& tokens = Scan("es = \"\";");
-
-  EXPECT_EQ(5, tokens.length());
-  CheckIdent(tokens, 0, "es");
-  CheckKind(tokens, 1, Token::kASSIGN);
-  CheckKind(tokens, 2, Token::kSTRING);
-  CheckKind(tokens, 3, Token::kSEMICOLON);
-  CheckKind(tokens, 4, Token::kEOS);
-  EXPECT_EQ(0, (tokens)[2].literal->Length());
-}
-
-static void EmptyMultilineString() {
-  // es = """""";
-  const GrowableTokenStream& tokens = Scan("es = \"\"\"\"\"\";");
-
-  EXPECT_EQ(5, tokens.length());
-  CheckIdent(tokens, 0, "es");
-  CheckKind(tokens, 1, Token::kASSIGN);
-  CheckKind(tokens, 2, Token::kSTRING);
-  CheckKind(tokens, 3, Token::kSEMICOLON);
-  CheckKind(tokens, 4, Token::kEOS);
-  EXPECT_EQ(0, (tokens)[2].literal->Length());
-}
-
-static void NumberLiteral() {
-  const GrowableTokenStream& tokens = Scan("5 0x5d 0.3 0.33 1E+12 .42 +5");
-
-  CheckKind(tokens, 0, Token::kINTEGER);
-  CheckKind(tokens, 1, Token::kINTEGER);
-  CheckKind(tokens, 2, Token::kDOUBLE);
-  CheckKind(tokens, 3, Token::kDOUBLE);
-  CheckKind(tokens, 4, Token::kDOUBLE);
-  CheckKind(tokens, 5, Token::kDOUBLE);
-  CheckKind(tokens, 6, Token::kADD);
-  CheckKind(tokens, 7, Token::kINTEGER);
-  CheckKind(tokens, 8, Token::kEOS);
-}
-
-static void ScanLargeText() {
-  const char* dart_source =
-      "// This source is not meant to be valid Dart code. The text is used to"
-      "// test the Dart scanner."
-      ""
-      "// Cartesian point implementation."
-      "class Point {"
-      ""
-      "  // Constructor"
-      "  Point(Number x, Number y) : x(x), y(y) { }"
-      ""
-      "  // Addition for points."
-      "  Point operator +(Point other) {"
-      "    return new Point(x + other.x, y + other.y);"
-      "  }"
-      ""
-      "  // Fields are const and they cannot be changed."
-      "  const Number x;"
-      "  const Number y;"
-      "}"
-      ""
-      ""
-      "// Polar point class that implements the Point interface."
-      "class PolarPoint implements Point {"
-      ""
-      "  PolarPoint(Number theta, Number radius)"
-      "      : theta(theta), radius(radius) { }"
-      ""
-      "  Number get x { return radius * Math.cos(theta); }"
-      "  Number get y { return radius * Math.sin(theta); }"
-      ""
-      "  const Number theta;"
-      "  const Number radius;"
-      "}"
-      ""
-      "interface Map<K ,V> default HashMap<K, V> {"
-      "  V operator [](K key);"
-      "  void operator []=(K key, V value);"
-      "  void forEach(function f(K key, V value));"
-      "}"
-      ""
-      "class Foo {"
-      "  static const Array kMyArray = [1,2,3,4,5,6];"
-      "  static const Point kMyPoint = Point(1,2);"
-      "}"
-      ""
-      "class DequeEntry<T> implements QueueEntry<T>{"
-      "  DequeEntry<T> next;"
-      "  DequeEntry<T> previous;"
-      "  T value;"
-      "}"
-      ""
-      "void forEach(void function f(T element)) {"
-      "  for (int i = 0; i < this.length; i++) {"
-      "    f(this[i]);"
-      "  }"
-      "}"
-      ""
-      ""
-      "j!==!iffy  // means j !== !iffy";
-  Scan(dart_source);
-}
-
-void InvalidText() {
-  const GrowableTokenStream& tokens = Scan("\\");
-
-  EXPECT_EQ(2, tokens.length());
-  CheckKind(tokens, 0, Token::kERROR);
-  CheckKind(tokens, 1, Token::kEOS);
-}
-
-void NewlinesTest() {
-  const char* source =
-      "var es = /* a\n"
-      "            b\n"
-      "          */ \"\"\"\n"
-      "c\n"
-      "d\n"
-      "\"\"\";";
-
-  const GrowableTokenStream& tokens = Scan(source);
-
-  EXPECT_EQ(11, tokens.length());
-  CheckKind(tokens, 0, Token::kVAR);
-  CheckIdent(tokens, 1, "es");
-  CheckKind(tokens, 2, Token::kASSIGN);
-  CheckKind(tokens, 3, Token::kNEWLINE);
-  CheckKind(tokens, 4, Token::kNEWLINE);
-  CheckKind(tokens, 5, Token::kSTRING);
-  CheckKind(tokens, 6, Token::kNEWLINE);
-  CheckKind(tokens, 7, Token::kNEWLINE);
-  CheckKind(tokens, 8, Token::kNEWLINE);
-  CheckKind(tokens, 9, Token::kSEMICOLON);
-  CheckKind(tokens, 10, Token::kEOS);
-
-  EXPECT_EQ(4, (tokens)[5].literal->Length());
-  const char* litchars = (tokens)[5].literal->ToCString();
-  EXPECT_EQ('c', litchars[0]);  // First newline is dropped.
-  EXPECT_EQ('\n', litchars[1]);
-  EXPECT_EQ('d', litchars[2]);
-  EXPECT_EQ('\n', litchars[3]);
-}
-
-ISOLATE_UNIT_TEST_CASE(Scanner_Test) {
-  ScanLargeText();
-
-  BoringTest();
-  CommentTest();
-  GreedIsGood();
-  StringEscapes();
-  InvalidStringEscapes();
-  RawString();
-  MultilineString();
-  EmptyString();
-  EmptyMultilineString();
-  NumberLiteral();
-  InvalidText();
-  NewlinesTest();
-}
-
-}  // namespace dart
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 0af2a71..91b3caa 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -29,11 +29,11 @@
       function_level_(function_level),
       loop_level_(loop_level),
       context_level_(LocalScope::kUnitializedContextLevel),
-      num_context_variables_(0),
       begin_token_pos_(TokenPosition::kNoSourcePos),
       end_token_pos_(TokenPosition::kNoSourcePos),
       variables_(),
       labels_(),
+      context_variables_(),
       referenced_() {
   // Hook this node into the children of the parent, unless the parent has a
   // different function_level, since the local scope of a nested function can
@@ -149,7 +149,7 @@
   // code generation time how far to walk up the context chain in order to
   // access the variable from the current context level.
   if ((*context_owner) == NULL) {
-    ASSERT(num_context_variables_ == 0);
+    ASSERT(num_context_variables() == 0);
     // This scope becomes the current context owner.
     set_context_level(1);
     *context_owner = this;
@@ -157,7 +157,7 @@
     // The captured variable is in a child scope of the context owner and we do
     // not share contexts.
     // This scope will allocate and chain a new context.
-    ASSERT(num_context_variables_ == 0);
+    ASSERT(num_context_variables() == 0);
     // This scope becomes the current context owner.
     set_context_level((*context_owner)->context_level() + 1);
     *context_owner = this;
@@ -165,7 +165,7 @@
     ASSERT(FLAG_share_enclosing_context);
     // The captured variable is at a deeper loop level than the current context.
     // This scope will allocate and chain a new context.
-    ASSERT(num_context_variables_ == 0);
+    ASSERT(num_context_variables() == 0);
     // This scope becomes the current context owner.
     set_context_level((*context_owner)->context_level() + 1);
     *context_owner = this;
@@ -178,8 +178,13 @@
       ASSERT(context_level() == (*context_owner)->context_level());
     }
   }
-  variable->set_index(
-      VariableIndex((*context_owner)->num_context_variables_++));
+
+  (*context_owner)->AddContextVariable(variable);
+}
+
+void LocalScope::AddContextVariable(LocalVariable* variable) {
+  variable->set_index(VariableIndex(context_variables_.length()));
+  context_variables_.Add(variable);
 }
 
 VariableIndex LocalScope::AllocateVariables(VariableIndex first_parameter_index,
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index 952ecc7..38abf8f 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -88,6 +88,7 @@
         is_invisible_(false),
         is_captured_parameter_(false),
         is_forced_stack_(false),
+        is_explicit_covariant_parameter_(false),
         type_check_mode_(kDoTypeCheck),
         index_() {
     ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
@@ -121,6 +122,13 @@
   bool is_forced_stack() const { return is_forced_stack_; }
   void set_is_forced_stack() { is_forced_stack_ = true; }
 
+  bool is_explicit_covariant_parameter() const {
+    return is_explicit_covariant_parameter_;
+  }
+  void set_is_explicit_covariant_parameter() {
+    is_explicit_covariant_parameter_ = true;
+  }
+
   enum TypeCheckMode {
     kDoTypeCheck,
     kSkipTypeCheck,
@@ -197,6 +205,7 @@
   bool is_invisible_;
   bool is_captured_parameter_;
   bool is_forced_stack_;
+  bool is_explicit_covariant_parameter_;
   TypeCheckMode type_check_mode_;
   VariableIndex index_;
 
@@ -303,14 +312,25 @@
   TokenPosition end_token_pos() const { return end_token_pos_; }
   void set_end_token_pos(TokenPosition value) { end_token_pos_ = value; }
 
+  // Return the list of variables allocated in the context and belonging to this
+  // scope and to its children at the same loop level.
+  const GrowableArray<LocalVariable*>& context_variables() const {
+    return context_variables_;
+  }
+
   // The number of variables allocated in the context and belonging to this
   // scope and to its children at the same loop level.
-  int num_context_variables() const { return num_context_variables_; }
+  int num_context_variables() const { return context_variables().length(); }
 
   // Add a variable to the scope. Returns false if a variable with the
   // same name is already present.
   bool AddVariable(LocalVariable* variable);
 
+  // Add a variable to the scope as a context allocated variable and assigns
+  // it an index within the context. Does not check if the scope already
+  // contains this variable or a variable with the same name.
+  void AddContextVariable(LocalVariable* var);
+
   // Insert a formal parameter variable to the scope at the given position,
   // possibly in front of aliases already added with AddVariable.
   // Returns false if a variable with the same name is already present.
@@ -437,12 +457,14 @@
   int function_level_;         // Reflects the nesting level of local functions.
   int loop_level_;             // Reflects the loop nesting level.
   int context_level_;          // Reflects the level of the runtime context.
-  int num_context_variables_;  // Only set if this scope is a context owner.
   TokenPosition begin_token_pos_;  // Token index of beginning of scope.
   TokenPosition end_token_pos_;    // Token index of end of scope.
   GrowableArray<LocalVariable*> variables_;
   GrowableArray<SourceLabel*> labels_;
 
+  // List of variables allocated into the context which is owned by this scope.
+  GrowableArray<LocalVariable*> context_variables_;
+
   // List of names referenced in this scope and its children that
   // are not resolved to local variables.
   GrowableArray<NameReference*> referenced_;
diff --git a/runtime/vm/scopes_test.cc b/runtime/vm/scopes_test.cc
index 07f4dd7..1005d4c 100644
--- a/runtime/vm/scopes_test.cc
+++ b/runtime/vm/scopes_test.cc
@@ -8,7 +8,7 @@
 
 namespace dart {
 
-TEST_CASE(LocalScope) {
+ISOLATE_UNIT_TEST_CASE(LocalScope) {
   // Allocate a couple of local variables first.
   const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
   const String& a = String::ZoneHandle(Symbols::New(thread, "a"));
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index e46a8b3..282f198 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -167,16 +167,19 @@
 
 RawObject* Service::RequestAssets() {
   Thread* T = Thread::Current();
-  TransitionVMToNative transition(T);
-  Api::Scope api_scope(T);
-  if (get_service_assets_callback_ == NULL) {
-    return Object::null();
+  Object& object = Object::Handle();
+  {
+    Api::Scope api_scope(T);
+    TransitionVMToNative transition(T);
+    if (get_service_assets_callback_ == NULL) {
+      return Object::null();
+    }
+    Dart_Handle handle = get_service_assets_callback_();
+    if (Dart_IsError(handle)) {
+      Dart_PropagateError(handle);
+    }
+    object = Api::UnwrapHandle(handle);
   }
-  Dart_Handle handle = get_service_assets_callback_();
-  if (Dart_IsError(handle)) {
-    Dart_PropagateError(handle);
-  }
-  const Object& object = Object::Handle(Api::UnwrapHandle(handle));
   if (object.IsNull()) {
     return Object::null();
   }
@@ -197,7 +200,7 @@
     Exceptions::PropagateError(error);
     return Object::null();
   }
-  return Api::UnwrapHandle(handle);
+  return object.raw();
 }
 
 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
@@ -265,7 +268,11 @@
   }
   intptr_t r = 0;
   char* end_ptr = NULL;
+#if defined(ARCH_IS_32_BIT)
   r = strtol(s, &end_ptr, base);
+#else
+  r = strtoll(s, &end_ptr, base);
+#endif
   if (end_ptr == s) {
     // String was not advanced at all, cannot be valid.
     return false;
@@ -285,7 +292,11 @@
   }
   uintptr_t r = 0;
   char* end_ptr = NULL;
+#if defined(ARCH_IS_32_BIT)
   r = strtoul(s, &end_ptr, base);
+#else
+  r = strtoull(s, &end_ptr, base);
+#endif
   if (end_ptr == s) {
     // String was not advanced at all, cannot be valid.
     return false;
@@ -855,7 +866,7 @@
         // For now, always return an error.
         PrintInvalidParamError(&js, "_idZone");
         js.PostReply();
-        return T->get_and_clear_sticky_error();
+        return T->StealStickyError();
       }
     }
     const char* c_method_name = method_name.ToCString();
@@ -864,7 +875,7 @@
     if (method != NULL) {
       if (!ValidateParameters(method->parameters, &js)) {
         js.PostReply();
-        return T->get_and_clear_sticky_error();
+        return T->StealStickyError();
       }
       if (method->entry(T, &js)) {
         js.PostReply();
@@ -873,7 +884,7 @@
         // so this case shouldn't be reached, at present.
         UNIMPLEMENTED();
       }
-      return T->get_and_clear_sticky_error();
+      return T->StealStickyError();
     }
 
     EmbedderServiceHandler* handler = FindIsolateEmbedderHandler(c_method_name);
@@ -883,7 +894,7 @@
 
     if (handler != NULL) {
       EmbedderHandleMessage(handler, &js);
-      return T->get_and_clear_sticky_error();
+      return T->StealStickyError();
     }
 
     const Instance& extension_handler =
@@ -893,12 +904,12 @@
                                param_values, reply_port, seq);
       // Schedule was successful. Extension code will post a reply
       // asynchronously.
-      return T->get_and_clear_sticky_error();
+      return T->StealStickyError();
     }
 
     PrintUnrecognizedMethodError(&js);
     js.PostReply();
-    return T->get_and_clear_sticky_error();
+    return T->StealStickyError();
   }
 }
 
@@ -1084,6 +1095,14 @@
     params.AddProperty("event", event);
   }
   PostEvent(event->isolate(), stream_id, event->KindAsCString(), &js);
+
+  // Post event to the native Service Stream handlers if set.
+  if (event->stream_info() != nullptr &&
+      event->stream_info()->consumer() != nullptr) {
+    auto length = js.buffer()->length();
+    event->stream_info()->consumer()(
+        reinterpret_cast<uint8_t*>(js.buffer()->buf()), length);
+  }
 }
 
 void Service::PostEvent(Isolate* isolate,
@@ -1250,6 +1269,17 @@
   stream_cancel_callback_ = cancel_callback;
 }
 
+void Service::SetNativeServiceStreamCallback(Dart_NativeStreamConsumer consumer,
+                                             const char* stream_id) {
+  for (auto stream : streams_) {
+    if (stream->id() == stream_id) {
+      stream->set_consumer(consumer);
+    }
+  }
+  // Enable stream.
+  ListenStream(stream_id);
+}
+
 void Service::SetGetServiceAssetsCallback(
     Dart_GetVMServiceAssetsArchive get_service_assets) {
   get_service_assets_callback_ = get_service_assets;
@@ -1327,6 +1357,42 @@
   return true;
 }
 
+static const MethodParameter* get_scripts_params[] = {
+    RUNNABLE_ISOLATE_PARAMETER,
+    NULL,
+};
+
+static bool GetScripts(Thread* thread, JSONStream* js) {
+  Isolate* isolate = thread->isolate();
+  Zone* zone = thread->zone();
+  ASSERT(isolate != NULL);
+
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(zone, isolate->object_store()->libraries());
+  intptr_t num_libs = libs.Length();
+
+  Library& lib = Library::Handle(zone);
+  Array& scripts = Array::Handle(zone);
+  Script& script = Script::Handle(zone);
+
+  JSONObject jsobj(js);
+  {
+    jsobj.AddProperty("type", "ScriptList");
+    JSONArray script_array(&jsobj, "scripts");
+    for (intptr_t i = 0; i < num_libs; i++) {
+      lib ^= libs.At(i);
+      ASSERT(!lib.IsNull());
+      scripts ^= lib.LoadedScripts();
+      for (intptr_t j = 0; j < scripts.Length(); j++) {
+        script ^= scripts.At(j);
+        ASSERT(!script.IsNull());
+        script_array.AddValue(script);
+      }
+    }
+  }
+  return true;
+}
+
 static const MethodParameter* get_unused_changes_in_last_reload_params[] = {
     ISOLATE_PARAMETER, NULL,
 };
@@ -1749,7 +1815,7 @@
     if (id != 0) {
       return Object::sentinel().raw();
     }
-    const Type& type = Type::Handle(zone, cls.CanonicalType());
+    const Type& type = Type::Handle(zone, cls.DeclarationType());
     if (!type.IsNull()) {
       return type.raw();
     }
@@ -1825,6 +1891,10 @@
   if (!code.IsNull()) {
     return code.raw();
   }
+  Bytecode& bytecode = Bytecode::Handle(Bytecode::FindCode(pc));
+  if (!bytecode.IsNull()) {
+    return bytecode.raw();
+  }
 
   // Not found.
   return Object::sentinel().raw();
@@ -2362,7 +2432,6 @@
     // We don't use Instance::Cast here because it doesn't allow null.
     Instance& instance = Instance::Handle(zone);
     instance ^= receiver.raw();
-
     const Object& result =
         Object::Handle(zone, instance.Invoke(selector, args, arg_names));
     result.PrintJSON(js, true);
@@ -2490,76 +2559,12 @@
 }
 
 static bool Evaluate(Thread* thread, JSONStream* js) {
-  if (CheckDebuggerDisabled(thread, js)) {
-    return true;
-  }
-
-  const char* target_id = js->LookupParam("targetId");
-  if (target_id == NULL) {
-    PrintMissingParamError(js, "targetId");
-    return true;
-  }
-  const char* expr = js->LookupParam("expression");
-  if (expr == NULL) {
-    PrintMissingParamError(js, "expression");
-    return true;
-  }
-
-  Zone* zone = thread->zone();
-  const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-  const GrowableObjectArray& values =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-  if (BuildScope(thread, js, names, values)) {
-    return true;
-  }
-  const Array& names_array = Array::Handle(zone, Array::MakeFixedLength(names));
-  const Array& values_array =
-      Array::Handle(zone, Array::MakeFixedLength(values));
-
-  const String& expr_str = String::Handle(zone, String::New(expr));
-  ObjectIdRing::LookupResult lookup_result;
-  Object& obj =
-      Object::Handle(zone, LookupHeapObject(thread, target_id, &lookup_result));
-  if (obj.raw() == Object::sentinel().raw()) {
-    if (lookup_result == ObjectIdRing::kCollected) {
-      PrintSentinel(js, kCollectedSentinel);
-    } else if (lookup_result == ObjectIdRing::kExpired) {
-      PrintSentinel(js, kExpiredSentinel);
-    } else {
-      PrintInvalidParamError(js, "targetId");
-    }
-    return true;
-  }
-  if (obj.IsLibrary()) {
-    const Library& lib = Library::Cast(obj);
-    const Object& result =
-        Object::Handle(zone, lib.Evaluate(expr_str, names_array, values_array));
-    result.PrintJSON(js, true);
-    return true;
-  }
-  if (obj.IsClass()) {
-    const Class& cls = Class::Cast(obj);
-    const Object& result =
-        Object::Handle(zone, cls.Evaluate(expr_str, names_array, values_array));
-    result.PrintJSON(js, true);
-    return true;
-  }
-  if ((obj.IsInstance() || obj.IsNull()) && !ContainsNonInstance(obj)) {
-    // We don't use Instance::Cast here because it doesn't allow null.
-    Instance& instance = Instance::Handle(zone);
-    instance ^= obj.raw();
-    const Class& receiver_cls = Class::Handle(zone, instance.clazz());
-    const Object& result = Object::Handle(
-        zone,
-        instance.Evaluate(receiver_cls, expr_str, names_array, values_array));
-    result.PrintJSON(js, true);
-    return true;
-  }
-  js->PrintError(kInvalidParams,
-                 "%s: invalid 'targetId' parameter: "
-                 "Cannot evaluate against a VM-internal object",
-                 js->method());
+  // If a compilation service is available, this RPC invocation will have been
+  // intercepted by RunningIsolates.routeRequest.
+  js->PrintError(
+      kExpressionCompilationError,
+      "%s: No compilation service available; cannot evaluate from source.",
+      js->method());
   return true;
 }
 
@@ -2769,7 +2774,6 @@
 
   bool is_static = BoolParameter::Parse(js->LookupParam("isStatic"), false);
 
-  Dart_KernelCompilationResult compilation_result;
   const GrowableObjectArray& params =
       GrowableObjectArray::Handle(thread->zone(), GrowableObjectArray::New());
   if (!ParseCSVList(js->LookupParam("definitions"), params)) {
@@ -2784,14 +2788,12 @@
     return true;
   }
 
-  {
-    TransitionVMToNative transition(thread);
-    compilation_result = KernelIsolate::CompileExpressionToKernel(
-        js->LookupParam("expression"),
-        Array::Handle(Array::MakeFixedLength(params)),
-        Array::Handle(Array::MakeFixedLength(type_params)),
-        js->LookupParam("libraryUri"), js->LookupParam("klass"), is_static);
-  }
+  Dart_KernelCompilationResult compilation_result =
+      KernelIsolate::CompileExpressionToKernel(
+          js->LookupParam("expression"),
+          Array::Handle(Array::MakeFixedLength(params)),
+          Array::Handle(Array::MakeFixedLength(type_params)),
+          js->LookupParam("libraryUri"), js->LookupParam("klass"), is_static);
 
   if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
     js->PrintError(kExpressionCompilationError, "%s", compilation_result.error);
@@ -2941,34 +2943,12 @@
 };
 
 static bool EvaluateInFrame(Thread* thread, JSONStream* js) {
-  if (CheckDebuggerDisabled(thread, js)) {
-    return true;
-  }
-
-  Isolate* isolate = thread->isolate();
-  DebuggerStackTrace* stack = isolate->debugger()->StackTrace();
-  intptr_t framePos = UIntParameter::Parse(js->LookupParam("frameIndex"));
-  if (framePos >= stack->Length()) {
-    PrintInvalidParamError(js, "frameIndex");
-    return true;
-  }
-  ActivationFrame* frame = stack->FrameAt(framePos);
-
-  Zone* zone = thread->zone();
-  const GrowableObjectArray& names =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-  const GrowableObjectArray& values =
-      GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
-  if (BuildScope(thread, js, names, values)) {
-    return true;
-  }
-
-  const char* expr = js->LookupParam("expression");
-  const String& expr_str = String::Handle(zone, String::New(expr));
-
-  const Object& result =
-      Object::Handle(zone, frame->Evaluate(expr_str, names, values));
-  result.PrintJSON(js, true);
+  // If a compilation service is available, this RPC invocation will have been
+  // intercepted by RunningIsolates.routeRequest.
+  js->PrintError(
+      kExpressionCompilationError,
+      "%s: No compilation service available; cannot evaluate from source.",
+      js->method());
   return true;
 }
 
@@ -3157,8 +3137,7 @@
   }
 
   Isolate* isolate = thread->isolate();
-  Dart_LibraryTagHandler handler = isolate->library_tag_handler();
-  if (handler == NULL) {
+  if (!isolate->HasTagHandler()) {
     js->PrintError(kFeatureDisabled,
                    "A library tag handler must be installed.");
     return true;
@@ -4131,6 +4110,7 @@
 };
 
 static RawObject* GetObjectHelper(Thread* thread, uword addr) {
+  HeapIterationScope iteration(thread);
   Object& object = Object::Handle(thread->zone());
 
   {
@@ -4706,7 +4686,7 @@
   }
   {
     JSONArray internals(&map, "Type");
-    for (intptr_t id = kAbstractTypeCid; id <= kMixinAppTypeCid; ++id) {
+    for (intptr_t id = kAbstractTypeCid; id <= kTypeParameterCid; ++id) {
       DEFINE_ADD_VALUE_F(id);
     }
   }
@@ -4832,6 +4812,8 @@
     get_retained_size_params },
   { "_getRetainingPath", GetRetainingPath,
     get_retaining_path_params },
+  { "getScripts", GetScripts,
+    get_scripts_params },
   { "getSourceReport", GetSourceReport,
     get_source_report_params },
   { "getStack", GetStack,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index cdf1812..90f3e64 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 #define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 11
+#define SERVICE_PROTOCOL_MINOR_VERSION 13
 
 class Array;
 class EmbedderServiceHandler;
@@ -73,9 +73,15 @@
   void set_enabled(bool value) { enabled_ = value; }
   bool enabled() const { return enabled_; }
 
+  void set_consumer(Dart_NativeStreamConsumer consumer) {
+    callback_ = consumer;
+  }
+  Dart_NativeStreamConsumer consumer() const { return callback_; }
+
  private:
   const char* id_;
   bool enabled_;
+  Dart_NativeStreamConsumer callback_;
 };
 
 class Service : public AllStatic {
@@ -108,6 +114,9 @@
       Dart_ServiceStreamListenCallback listen_callback,
       Dart_ServiceStreamCancelCallback cancel_callback);
 
+  static void SetNativeServiceStreamCallback(Dart_NativeStreamConsumer consumer,
+                                             const char* stream_id);
+
   static void SetGetServiceAssetsCallback(
       Dart_GetVMServiceAssetsArchive get_service_assets);
 
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index d563a2c..015ecfb 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.11
+# Dart VM Service Protocol 3.13
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.11_ of the Dart VM Service Protocol. This
+This document describes of _version 3.13_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -31,6 +31,7 @@
   - [evaluateInFrame](#evaluateinframe)
   - [getFlagList](#getflaglist)
   - [getIsolate](#getisolate)
+  - [getScripts](#getscripts)
   - [getObject](#getobject)
   - [getSourceReport](#getsourcereport)
   - [getStack](#getstack)
@@ -82,6 +83,7 @@
   - [Sentinel](#sentinel)
   - [SentinelKind](#sentinelkind)
   - [Script](#script)
+  - [ScriptList](#scriptlist)
   - [SourceLocation](#sourcelocation)
   - [SourceReport](#sourcereport)
   - [SourceReportCoverage](#sourcereportcoverage)
@@ -148,7 +150,7 @@
   "jsonrpc": "2.0",
   "method": "streamListen",
   "params": {
-    "streamId": "GC",
+    "streamId": "GC"
   },
   "id": "2"
 }
@@ -595,6 +597,17 @@
 
 See [Isolate](#isolate).
 
+### getScripts
+
+```
+ScriptList getScripts(string isolateId)
+```
+
+The _getScripts_ RPC is used to retrieve a _ScriptList_ containing all
+scripts for an isolate based on the isolate's _isolateId_.
+
+See [ScriptList](#scriptlist).
+
 ### getObject
 
 ```
@@ -888,7 +901,7 @@
 The _streamListen_ RPC subscribes to a stream in the VM. Once
 subscribed, the client will begin receiving events from the stream.
 
-If the client is not subscribed to the stream, the _103_ (Stream already
+If the client is already subscribed to the stream, the _103_ (Stream already
 subscribed) error code is returned.
 
 The _streamId_ parameter may have the following published values:
@@ -1975,7 +1988,7 @@
   // Vector instance kinds.
   Float32x4,
   Float64x2,
-  Int32x4
+  Int32x4,
 
   // An instance of the built-in VM TypedData implementations. User-defined
   // TypedDatas will be PlainInstance.
@@ -2404,6 +2417,14 @@
 101 | 1 | 8
 102 | 2 | 7
 
+### ScriptList
+
+```
+class ScriptList extends Response {
+  @Script[] scripts;
+}
+```
+
 ### SourceLocation
 
 ```
@@ -2709,5 +2730,7 @@
 3.9 | Changed numbers for errors related to service extensions.
 3.10 | Add 'invoke'.
 3.11 | Rename 'invoke' parameter 'receiverId' to 'targetId.
+3.12 | Add 'getScripts' RPC and `ScriptList` object.
+3.13 | Class 'mixin' field now properly set for kernel transformed mixin applications.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index 3d26758..869811e 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.12-dev
+# Dart VM Service Protocol 3.14-dev
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.12-dev_ of the Dart VM Service Protocol. This
+This document describes of _version 3.14-dev_ of the Dart VM Service Protocol. This
 protocol is used to communicate with a running Dart Virtual Machine.
 
 To use the Service Protocol, start the VM with the *--observe* flag.
@@ -31,6 +31,7 @@
   - [evaluateInFrame](#evaluateinframe)
   - [getFlagList](#getflaglist)
   - [getIsolate](#getisolate)
+  - [getScripts](#getisolatescripts)
   - [getObject](#getobject)
   - [getSourceReport](#getsourcereport)
   - [getStack](#getstack)
@@ -82,6 +83,7 @@
   - [Sentinel](#sentinel)
   - [SentinelKind](#sentinelkind)
   - [Script](#script)
+  - [ScriptList](#scriptlist)
   - [SourceLocation](#sourcelocation)
   - [SourceReport](#sourcereport)
   - [SourceReportCoverage](#sourcereportcoverage)
@@ -148,7 +150,7 @@
   "jsonrpc": "2.0",
   "method": "streamListen",
   "params": {
-    "streamId": "GC",
+    "streamId": "GC"
   },
   "id": "2"
 }
@@ -595,6 +597,17 @@
 
 See [Isolate](#isolate).
 
+### getScripts
+
+```
+ScriptList getScripts(string isolateId)
+```
+
+The _getScripts_ RPC is used to retrieve a _ScriptList_ containing all
+scripts for an isolate based on the isolate's _isolateId_.
+
+See [ScriptList](#scriptlist).
+
 ### getObject
 
 ```
@@ -1975,7 +1988,7 @@
   // Vector instance kinds.
   Float32x4,
   Float64x2,
-  Int32x4
+  Int32x4,
 
   // An instance of the built-in VM TypedData implementations. User-defined
   // TypedDatas will be PlainInstance.
@@ -2404,6 +2417,14 @@
 101 | 1 | 8
 102 | 2 | 7
 
+### ScriptList
+
+```
+class ScriptList extends Response {
+  @Script[] scripts;
+}
+```
+
 ### SourceLocation
 
 ```
@@ -2709,5 +2730,7 @@
 3.9 | Changed numbers for errors related to service extensions.
 3.10 | Add 'invoke'.
 3.11 | Rename 'invoke' parameter 'receiverId' to 'targetId.
+3.12 | Add 'getScripts' RPC and `ScriptList` object.
+3.13 | Class 'mixin' field now properly set for kernel transformed mixin applications.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index 607f8b5..8d13ec6 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -143,6 +143,7 @@
 }
 
 Dart_Port ServiceIsolate::WaitForLoadPort() {
+  VMTagScope tagScope(Thread::Current(), VMTag::kLoadWaitTagId);
   MonitorLocker ml(monitor_);
   while (initializing_ && (load_port_ == ILLEGAL_PORT)) {
     ml.Wait();
@@ -384,7 +385,6 @@
       if (!error.IsNull() && !error.IsUnwindError()) {
         OS::PrintErr("vm-service: Error: %s\n", error.ToErrorCString());
       }
-      TransitionVMToNative transition(T);
       Dart::RunShutdownCallback();
     }
     ASSERT(ServiceIsolate::IsServiceIsolate(I));
diff --git a/runtime/vm/service_isolate.h b/runtime/vm/service_isolate.h
index 5759658..e6ecc405f 100644
--- a/runtime/vm/service_isolate.h
+++ b/runtime/vm/service_isolate.h
@@ -12,6 +12,7 @@
 
 namespace dart {
 
+class Isolate;
 class ObjectPointerVisitor;
 class SendPort;
 
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 72e7ed8..992dd24 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -276,6 +276,7 @@
   Code& unoptimized_code = Code::Handle();
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
+      ASSERT(!frame->is_interpreted());  // Not yet supported.
       code = frame->LookupDartCode();
       function = code.function();
       if (code.is_optimized()) {
@@ -672,9 +673,11 @@
       new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer +
                 kSimulatorStackUnderflowSize)];
   // Low address.
-  stack_limit_ = reinterpret_cast<uword>(stack_) + OSThread::kStackSizeBuffer;
+  stack_limit_ = reinterpret_cast<uword>(stack_);
+  // Limit for StackOverflowError.
+  overflow_stack_limit_ = stack_limit_ + OSThread::kStackSizeBuffer;
   // High address.
-  stack_base_ = stack_limit_ + OSThread::GetSpecifiedStackSize();
+  stack_base_ = overflow_stack_limit_ + OSThread::GetSpecifiedStackSize();
 
   pc_modified_ = false;
   icount_ = 0;
@@ -3736,14 +3739,17 @@
   set_register(FP, static_cast<int32_t>(fp));
   set_register(THR, reinterpret_cast<uword>(thread));
   // Set the tag.
-  thread->set_vm_tag(VMTag::kDartTagId);
+  thread->set_vm_tag(VMTag::kDartCompiledTagId);
   // Clear top exit frame.
   thread->set_top_exit_frame_info(0);
   // Restore pool pointer.
   int32_t code =
       *reinterpret_cast<int32_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
-  int32_t pp = *reinterpret_cast<int32_t*>(code + Code::object_pool_offset() -
-                                           kHeapObjectTag);
+  int32_t pp = (FLAG_precompiled_mode && FLAG_use_bare_instructions)
+                   ? reinterpret_cast<int32_t>(thread->global_object_pool())
+                   : *reinterpret_cast<int32_t*>(
+                         (code + Code::object_pool_offset() - kHeapObjectTag));
+
   set_register(CODE_REG, code);
   set_register(PP, pp);
   buf->Longjmp();
diff --git a/runtime/vm/simulator_arm.h b/runtime/vm/simulator_arm.h
index 0365f80..406f7ce 100644
--- a/runtime/vm/simulator_arm.h
+++ b/runtime/vm/simulator_arm.h
@@ -79,6 +79,8 @@
 
   // High address.
   uword stack_base() const { return stack_base_; }
+  // Limit for StackOverflowError.
+  uword overflow_stack_limit() const { return overflow_stack_limit_; }
   // Low address.
   uword stack_limit() const { return stack_limit_; }
 
@@ -149,6 +151,7 @@
   // Simulator support.
   char* stack_;
   uword stack_limit_;
+  uword overflow_stack_limit_;
   uword stack_base_;
   bool pc_modified_;
   uint64_t icount_;
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 9ae3d30..82f12b1 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -299,6 +299,7 @@
   Code& unoptimized_code = Code::Handle();
   while (frame != NULL) {
     if (frame->IsDartFrame()) {
+      ASSERT(!frame->is_interpreted());  // Not yet supported.
       code = frame->LookupDartCode();
       function = code.function();
       if (code.is_optimized()) {
@@ -722,9 +723,11 @@
       new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer +
                 kSimulatorStackUnderflowSize)];
   // Low address.
-  stack_limit_ = reinterpret_cast<uword>(stack_) + OSThread::kStackSizeBuffer;
+  stack_limit_ = reinterpret_cast<uword>(stack_);
+  // Limit for StackOverflowError.
+  overflow_stack_limit_ = stack_limit_ + OSThread::kStackSizeBuffer;
   // High address.
-  stack_base_ = stack_limit_ + OSThread::GetSpecifiedStackSize();
+  stack_base_ = overflow_stack_limit_ + OSThread::GetSpecifiedStackSize();
 
   pc_modified_ = false;
   icount_ = 0;
@@ -3556,14 +3559,16 @@
   set_register(NULL, FP, static_cast<int64_t>(fp));
   set_register(NULL, THR, reinterpret_cast<int64_t>(thread));
   // Set the tag.
-  thread->set_vm_tag(VMTag::kDartTagId);
+  thread->set_vm_tag(VMTag::kDartCompiledTagId);
   // Clear top exit frame.
   thread->set_top_exit_frame_info(0);
   // Restore pool pointer.
   int64_t code =
       *reinterpret_cast<int64_t*>(fp + kPcMarkerSlotFromFp * kWordSize);
-  int64_t pp = *reinterpret_cast<int64_t*>(code + Code::object_pool_offset() -
-                                           kHeapObjectTag);
+  int64_t pp = (FLAG_precompiled_mode && FLAG_use_bare_instructions)
+                   ? reinterpret_cast<int64_t>(thread->global_object_pool())
+                   : *reinterpret_cast<int64_t*>(
+                         code + Code::object_pool_offset() - kHeapObjectTag);
   pp -= kHeapObjectTag;  // In the PP register, the pool pointer is untagged.
   set_register(NULL, CODE_REG, code);
   set_register(NULL, PP, pp);
diff --git a/runtime/vm/simulator_arm64.h b/runtime/vm/simulator_arm64.h
index f85ebf3..43ae2ea 100644
--- a/runtime/vm/simulator_arm64.h
+++ b/runtime/vm/simulator_arm64.h
@@ -75,6 +75,8 @@
 
   // High address.
   uword stack_base() const { return stack_base_; }
+  // Limit for StackOverflowError.
+  uword overflow_stack_limit() const { return overflow_stack_limit_; }
   // Low address.
   uword stack_limit() const { return stack_limit_; }
 
@@ -136,6 +138,7 @@
   int64_t pc_;
   char* stack_;
   uword stack_limit_;
+  uword overflow_stack_limit_;
   uword stack_base_;
   bool pc_modified_;
   uint64_t icount_;
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 4ce6696..2e97a9a 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -41,9 +41,6 @@
             ULLONG_MAX,
             "Instruction address or instruction count to stop simulator at.");
 
-#define LIKELY(cond) __builtin_expect((cond), 1)
-#define UNLIKELY(cond) __builtin_expect((cond), 0)
-
 // SimulatorSetjmpBuffer are linked together, and the last created one
 // is referenced by the Simulator. When an exception is thrown, the exception
 // runtime looks at where to jump and finds the corresponding
@@ -191,8 +188,7 @@
   static bool ObjectArraySetIndexed(Thread* thread,
                                     RawObject** FP,
                                     RawObject** result) {
-    return !thread->isolate()->type_checks() &&
-           ObjectArraySetIndexedUnchecked(thread, FP, result);
+    return ObjectArraySetIndexedUnchecked(thread, FP, result);
   }
 
   static bool ObjectArraySetIndexedUnchecked(Thread* thread,
@@ -202,8 +198,8 @@
     RawSmi* index = static_cast<RawSmi*>(args[1]);
     RawArray* array = static_cast<RawArray*>(args[0]);
     if (CheckIndex(index, array->ptr()->length_)) {
-      array->StorePointer(array->ptr()->data() + Smi::Value(index), args[2],
-                          thread);
+      array->StoreArrayPointer(array->ptr()->data() + Smi::Value(index),
+                               args[2], thread);
       return true;
     }
     return false;
@@ -225,8 +221,7 @@
   static bool GrowableArraySetIndexed(Thread* thread,
                                       RawObject** FP,
                                       RawObject** result) {
-    return !thread->isolate()->type_checks() &&
-           GrowableArraySetIndexedUnchecked(thread, FP, result);
+    return GrowableArraySetIndexedUnchecked(thread, FP, result);
   }
 
   static bool GrowableArraySetIndexedUnchecked(Thread* thread,
@@ -238,8 +233,8 @@
         static_cast<RawGrowableObjectArray*>(args[0]);
     if (CheckIndex(index, array->ptr()->length_)) {
       RawArray* data = array->ptr()->data_;
-      data->StorePointer(data->ptr()->data() + Smi::Value(index), args[2],
-                         thread);
+      data->StoreArrayPointer(data->ptr()->data() + Smi::Value(index), args[2],
+                              thread);
       return true;
     }
     return false;
@@ -309,7 +304,7 @@
     if (cls->ptr()->num_type_arguments_ != 0) {
       return false;
     }
-    RawType* typ = cls->ptr()->canonical_type_;
+    RawType* typ = cls->ptr()->declaration_type_;
     if (typ == Object::null()) {
       return false;
     }
@@ -562,8 +557,10 @@
                          sizeof(uintptr_t)];
   // Low address.
   stack_base_ = reinterpret_cast<uword>(stack_) + kSimulatorStackUnderflowSize;
+  // Limit for StackOverflowError.
+  overflow_stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
   // High address.
-  stack_limit_ = stack_base_ + OSThread::GetSpecifiedStackSize();
+  stack_limit_ = overflow_stack_limit_ + OSThread::kStackSizeBuffer;
 
   last_setjmp_buffer_ = NULL;
 
@@ -957,7 +954,7 @@
   if (!setjmp(buffer.buffer_)) {
     thread->set_vm_tag(reinterpret_cast<uword>(drt));
     drt(args);
-    thread->set_vm_tag(VMTag::kDartTagId);
+    thread->set_vm_tag(VMTag::kDartCompiledTagId);
     thread->set_top_exit_frame_info(0);
     return true;
   } else {
@@ -974,7 +971,7 @@
   if (!setjmp(buffer.buffer_)) {
     thread->set_vm_tag(reinterpret_cast<uword>(function));
     wrapper(args, function);
-    thread->set_vm_tag(VMTag::kDartTagId);
+    thread->set_vm_tag(VMTag::kDartCompiledTagId);
     thread->set_top_exit_frame_info(0);
     return true;
   } else {
@@ -997,6 +994,7 @@
 
 // Decode opcode and A part of the given value and dispatch to the
 // corresponding bytecode handler.
+#ifdef DART_HAS_COMPUTED_GOTO
 #define DISPATCH_OP(val)                                                       \
   do {                                                                         \
     op = (val);                                                                \
@@ -1004,6 +1002,15 @@
     TRACE_INSTRUCTION                                                          \
     goto* dispatch[op & 0xFF];                                                 \
   } while (0)
+#else
+#define DISPATCH_OP(val)                                                       \
+  do {                                                                         \
+    op = (val);                                                                \
+    rA = ((op >> 8) & 0xFF);                                                   \
+    TRACE_INSTRUCTION                                                          \
+    goto SwitchDispatch;                                                       \
+  } while (0)
+#endif
 
 // Fetch next operation from PC, increment program counter and dispatch.
 #define DISPATCH() DISPATCH_OP(*pc++)
@@ -1023,8 +1030,8 @@
   USE(rB);                                                                     \
   USE(rC)
 #define DECODE_A_B_C                                                           \
-  rB = ((op >> Bytecode::kBShift) & Bytecode::kBMask);                         \
-  rC = ((op >> Bytecode::kCShift) & Bytecode::kCMask);
+  rB = ((op >> SimulatorBytecode::kBShift) & SimulatorBytecode::kBMask);       \
+  rC = ((op >> SimulatorBytecode::kCShift) & SimulatorBytecode::kCMask);
 
 #define DECLARE_A_B_Y                                                          \
   uint16_t rB;                                                                 \
@@ -1032,8 +1039,8 @@
   USE(rB);                                                                     \
   USE(rY)
 #define DECODE_A_B_Y                                                           \
-  rB = ((op >> Bytecode::kBShift) & Bytecode::kBMask);                         \
-  rY = ((op >> Bytecode::kYShift) & Bytecode::kYMask);
+  rB = ((op >> SimulatorBytecode::kBShift) & SimulatorBytecode::kBMask);       \
+  rY = ((op >> SimulatorBytecode::kYShift) & SimulatorBytecode::kYMask);
 
 #define DECLARE_0
 #define DECODE_0
@@ -1044,7 +1051,7 @@
 #define DECLARE___D                                                            \
   uint32_t rD;                                                                 \
   USE(rD)
-#define DECODE___D rD = (op >> Bytecode::kDShift);
+#define DECODE___D rD = (op >> SimulatorBytecode::kDShift);
 
 #define DECLARE_A_D DECLARE___D
 #define DECODE_A_D DECODE___D
@@ -1052,12 +1059,13 @@
 #define DECLARE_A_X                                                            \
   int32_t rD;                                                                  \
   USE(rD)
-#define DECODE_A_X rD = (static_cast<int32_t>(op) >> Bytecode::kDShift);
+#define DECODE_A_X                                                             \
+  rD = (static_cast<int32_t>(op) >> SimulatorBytecode::kDShift);
 
 #define SMI_FASTPATH_ICDATA_INC                                                \
   do {                                                                         \
-    ASSERT(Bytecode::IsCallOpcode(*pc));                                       \
-    const uint16_t kidx = Bytecode::DecodeD(*pc);                              \
+    ASSERT(SimulatorBytecode::IsCallOpcode(*pc));                              \
+    const uint16_t kidx = SimulatorBytecode::DecodeD(*pc);                     \
     const RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx));           \
     RawObject** entries = icdata->ptr()->ic_data_->ptr()->data();              \
     SimulatorHelpers::IncrementICUsageCount(entries, 0, 2);                    \
@@ -1204,14 +1212,6 @@
                            const Array& arguments_descriptor,
                            const Array& arguments,
                            Thread* thread) {
-  // Dispatch used to interpret bytecode. Contains addresses of
-  // labels of bytecode handlers. Handlers themselves are defined below.
-  static const void* dispatch[] = {
-#define TARGET(name, fmt, fmta, fmtb, fmtc) &&bc##name,
-      BYTECODES_LIST(TARGET)
-#undef TARGET
-  };
-
   // Interpreter state (see constants_dbc.h for high-level overview).
   uint32_t* pc;       // Program Counter: points to the next op to execute.
   RawObject** FP;     // Frame Pointer.
@@ -1226,7 +1226,7 @@
 
   // Save current VM tag and mark thread as executing Dart code.
   const uword vm_tag = thread->vm_tag();
-  thread->set_vm_tag(VMTag::kDartTagId);
+  thread->set_vm_tag(VMTag::kDartCompiledTagId);
 
   // Save current top stack resource and reset the list.
   StackResource* top_resource = thread->top_resource();
@@ -1288,8 +1288,26 @@
   Function& function_h = Function::Handle();
 #endif
 
-  // Enter the dispatch loop.
-  DISPATCH();
+#ifdef DART_HAS_COMPUTED_GOTO
+  static const void* dispatch[] = {
+#define TARGET(name, fmt, fmta, fmtb, fmtc) &&bc##name,
+      BYTECODES_LIST(TARGET)
+#undef TARGET
+  };
+  DISPATCH();  // Enter the dispatch loop.
+#else
+  DISPATCH();  // Enter the dispatch loop.
+SwitchDispatch:
+  switch (op & 0xFF) {
+#define TARGET(name, fmt, fmta, fmtb, fmtc)                                    \
+  case SimulatorBytecode::k##name:                                             \
+    goto bc##name;
+    BYTECODES_LIST(TARGET)
+#undef TARGET
+    default:
+      FATAL1("Undefined opcode: %d\n", op);
+  }
+#endif
 
   // Bytecode handlers (see constants_dbc.h for bytecode descriptions).
   {
@@ -1375,9 +1393,9 @@
       // Make the DRT_OptimizeInvokedFunction see a stub as its caller for
       // consistency with the other architectures, and to avoid needing to
       // generate a stackmap for the HotCheck pc.
-      const StubEntry* stub = StubCode::OptimizeFunction_entry();
-      FP[kPcMarkerSlotFromFp] = stub->code();
-      pc = reinterpret_cast<uint32_t*>(stub->EntryPoint());
+      const Code& stub = StubCode::OptimizeFunction();
+      FP[kPcMarkerSlotFromFp] = stub.raw();
+      pc = reinterpret_cast<uint32_t*>(stub.EntryPoint());
 
       Exit(thread, FP, FP + 3, pc);
       NativeArguments args(thread, 1, /*argv=*/FP, /*retval=*/FP + 1);
@@ -1766,10 +1784,10 @@
     RawObject** args = SP - argc + 1;
     const intptr_t receiver_cid = SimulatorHelpers::GetClassId(args[0]);
     for (intptr_t i = 0; i < 2 * cids_length; i += 2) {
-      const intptr_t icdata_cid = Bytecode::DecodeD(*(pc + i));
+      const intptr_t icdata_cid = SimulatorBytecode::DecodeD(*(pc + i));
       if (receiver_cid == icdata_cid) {
-        RawFunction* target =
-            RAW_CAST(Function, LOAD_CONSTANT(Bytecode::DecodeD(*(pc + i + 1))));
+        RawFunction* target = RAW_CAST(
+            Function, LOAD_CONSTANT(SimulatorBytecode::DecodeD(*(pc + i + 1))));
         *++SP = target;
         pc++;
         break;
@@ -1787,11 +1805,11 @@
     const intptr_t receiver_cid = SimulatorHelpers::GetClassId(args[0]);
     for (intptr_t i = 0; i < 3 * cids_length; i += 3) {
       // Note unsigned types to get an unsigned range compare.
-      const uintptr_t cid_start = Bytecode::DecodeD(*(pc + i));
-      const uintptr_t cids = Bytecode::DecodeD(*(pc + i + 1));
+      const uintptr_t cid_start = SimulatorBytecode::DecodeD(*(pc + i));
+      const uintptr_t cids = SimulatorBytecode::DecodeD(*(pc + i + 1));
       if (receiver_cid - cid_start < cids) {
-        RawFunction* target =
-            RAW_CAST(Function, LOAD_CONSTANT(Bytecode::DecodeD(*(pc + i + 2))));
+        RawFunction* target = RAW_CAST(
+            Function, LOAD_CONSTANT(SimulatorBytecode::DecodeD(*(pc + i + 2))));
         *++SP = target;
         pc++;
         break;
@@ -2616,7 +2634,7 @@
     }
 
     // Look at the caller to determine how many arguments to pop.
-    const uint8_t argc = Bytecode::DecodeArgc(pc[-1]);
+    const uint8_t argc = SimulatorBytecode::DecodeArgc(pc[-1]);
 
     // Restore SP, FP and PP. Push result and dispatch.
     SP = FrameArguments(FP, argc);
@@ -2659,7 +2677,7 @@
   {
     BYTECODE(StoreFieldExt, A_D);
     // The offset is stored in the following nop-instruction which is skipped.
-    const uint16_t offset_in_words = Bytecode::DecodeD(*pc++);
+    const uint16_t offset_in_words = SimulatorBytecode::DecodeD(*pc++);
     RawInstance* instance = reinterpret_cast<RawInstance*>(FP[rA]);
     RawObject* value = FP[rD];
 
@@ -2694,7 +2712,7 @@
   {
     BYTECODE(LoadFieldExt, A_D);
     // The offset is stored in the following nop-instruction which is skipped.
-    const uint16_t offset_in_words = Bytecode::DecodeD(*pc++);
+    const uint16_t offset_in_words = SimulatorBytecode::DecodeD(*pc++);
     const uint16_t instance_reg = rD;
     RawInstance* instance = reinterpret_cast<RawInstance*>(FP[instance_reg]);
     FP[rA] = reinterpret_cast<RawObject**>(instance->ptr())[offset_in_words];
@@ -2820,7 +2838,7 @@
         thread->heap()->new_space()->TryAllocateInTLAB(thread, instance_size);
     if (LIKELY(start != 0)) {
       RawObject* type_args = SP[0];
-      const intptr_t type_args_offset = Bytecode::DecodeD(*pc);
+      const intptr_t type_args_offset = SimulatorBytecode::DecodeD(*pc);
       // Writes both the tags and the initial identity hash on 64 bit platforms.
       tags = RawObject::NewBit::update(true, tags);
       *reinterpret_cast<uword*>(start + Instance::tags_offset()) = tags;
@@ -3163,9 +3181,9 @@
     const intptr_t cid = SimulatorHelpers::GetClassId(FP[rA]);
     const intptr_t num_cases = rD;
     for (intptr_t i = 0; i < num_cases; i++) {
-      ASSERT(Bytecode::DecodeOpcode(pc[i]) == Bytecode::kNop);
-      intptr_t test_target = Bytecode::DecodeA(pc[i]);
-      intptr_t test_cid = Bytecode::DecodeD(pc[i]);
+      ASSERT(SimulatorBytecode::DecodeOpcode(pc[i]) == SimulatorBytecode::kNop);
+      intptr_t test_target = SimulatorBytecode::DecodeA(pc[i]);
+      intptr_t test_cid = SimulatorBytecode::DecodeD(pc[i]);
       if (cid == test_cid) {
         if (test_target != 0) {
           pc += 1;  // Match true.
@@ -3213,7 +3231,7 @@
     const intptr_t actual_cid =
         reinterpret_cast<intptr_t>(FP[rA]) >> kSmiTagSize;
     const uintptr_t cid_start = rD;
-    const uintptr_t cid_range = Bytecode::DecodeD(*pc);
+    const uintptr_t cid_range = SimulatorBytecode::DecodeD(*pc);
     // Unsigned comparison.  Skip either just the nop or both the nop and the
     // following instruction.
     pc += (actual_cid - cid_start <= cid_range) ? 2 : 1;
@@ -3224,9 +3242,9 @@
     BYTECODE(CheckBitTest, A_D);
     const intptr_t raw_value = reinterpret_cast<intptr_t>(FP[rA]);
     const bool is_smi = ((raw_value & kSmiTagMask) == kSmiTag);
-    const intptr_t cid_min = Bytecode::DecodeD(*pc);
-    const intptr_t cid_mask =
-        Smi::Value(RAW_CAST(Smi, LOAD_CONSTANT(Bytecode::DecodeD(*(pc + 1)))));
+    const intptr_t cid_min = SimulatorBytecode::DecodeD(*pc);
+    const intptr_t cid_mask = Smi::Value(
+        RAW_CAST(Smi, LOAD_CONSTANT(SimulatorBytecode::DecodeD(*(pc + 1)))));
     if (LIKELY(!is_smi)) {
       const intptr_t cid_max = Utils::HighestBit(cid_mask) + cid_min;
       const intptr_t cid = SimulatorHelpers::GetClassId(FP[rA]);
@@ -3253,7 +3271,7 @@
     if (LIKELY(!is_smi)) {
       const intptr_t cid = SimulatorHelpers::GetClassId(FP[rA]);
       for (intptr_t i = 0; i < cids_length; i++) {
-        const intptr_t desired_cid = Bytecode::DecodeD(*(pc + i));
+        const intptr_t desired_cid = SimulatorBytecode::DecodeD(*(pc + i));
         if (cid == desired_cid) {
           pc++;
           break;
@@ -3277,8 +3295,8 @@
       const intptr_t cid = SimulatorHelpers::GetClassId(FP[rA]);
       for (intptr_t i = 0; i < cids_length; i += 2) {
         // Note unsigned type to get unsigned range check below.
-        const uintptr_t cid_start = Bytecode::DecodeD(*(pc + i));
-        const uintptr_t cids = Bytecode::DecodeD(*(pc + i + 1));
+        const uintptr_t cid_start = SimulatorBytecode::DecodeD(*(pc + i));
+        const uintptr_t cids = SimulatorBytecode::DecodeD(*(pc + i + 1));
         if (cid - cid_start < cids) {
           pc++;
           break;
@@ -3635,8 +3653,8 @@
     RawSmi* index = RAW_CAST(Smi, SP[2]);
     RawObject* value = SP[3];
     ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
-    array->StorePointer(array->ptr()->data() + Smi::Value(index), value,
-                        thread);
+    array->StoreArrayPointer(array->ptr()->data() + Smi::Value(index), value,
+                             thread);
     DISPATCH();
   }
 
@@ -3646,8 +3664,8 @@
     RawSmi* index = RAW_CAST(Smi, FP[rB]);
     RawObject* value = FP[rC];
     ASSERT(SimulatorHelpers::CheckIndex(index, array->ptr()->length_));
-    array->StorePointer(array->ptr()->data() + Smi::Value(index), value,
-                        thread);
+    array->StoreArrayPointer(array->ptr()->data() + Smi::Value(index), value,
+                             thread);
     DISPATCH();
   }
 
@@ -3890,8 +3908,9 @@
     pc = SavedCallerPC(FP);
 
     const bool has_dart_caller = (reinterpret_cast<uword>(pc) & 2) == 0;
-    const intptr_t argc = has_dart_caller ? Bytecode::DecodeArgc(pc[-1])
-                                          : (reinterpret_cast<uword>(pc) >> 2);
+    const intptr_t argc = has_dart_caller
+                              ? SimulatorBytecode::DecodeArgc(pc[-1])
+                              : (reinterpret_cast<uword>(pc) >> 2);
     const bool has_function_type_args =
         has_dart_caller && SimulatorHelpers::ArgDescTypeArgsLen(argdesc_) > 0;
 
@@ -3964,14 +3983,9 @@
   // in the previous C++ frames.
   StackResource::Unwind(thread);
 
-  // Set the tag.
-  thread->set_vm_tag(VMTag::kDartTagId);
-  // Clear top exit frame.
-  thread->set_top_exit_frame_info(0);
-
   fp_ = reinterpret_cast<RawObject**>(fp);
 
-  if (pc == StubCode::RunExceptionHandler_entry()->EntryPoint()) {
+  if (pc == StubCode::RunExceptionHandler().EntryPoint()) {
     // The RunExceptionHandler stub is a placeholder.  We implement
     // its behavior here.
     RawObject* raw_exception = thread->active_exception();
@@ -3986,6 +4000,11 @@
     pc_ = pc;
   }
 
+  // Set the tag.
+  thread->set_vm_tag(VMTag::kDartCompiledTagId);
+  // Clear top exit frame.
+  thread->set_top_exit_frame_info(0);
+
   buf->Longjmp();
   UNREACHABLE();
 }
diff --git a/runtime/vm/simulator_dbc.h b/runtime/vm/simulator_dbc.h
index 95a0a35..8b87a7a 100644
--- a/runtime/vm/simulator_dbc.h
+++ b/runtime/vm/simulator_dbc.h
@@ -14,18 +14,19 @@
 
 namespace dart {
 
-class Isolate;
-class RawObject;
-class SimulatorSetjmpBuffer;
-class Thread;
-class Code;
 class Array;
+class Code;
+class Isolate;
+class ObjectPointerVisitor;
+class RawArray;
+class RawCode;
+class RawFunction;
 class RawICData;
 class RawImmutableArray;
-class RawArray;
+class RawObject;
 class RawObjectPool;
-class RawFunction;
-class ObjectPointerVisitor;
+class SimulatorSetjmpBuffer;
+class Thread;
 
 // Simulator intrinsic handler. It is invoked on entry to the intrinsified
 // function via Intrinsic bytecode before the frame is setup.
@@ -49,6 +50,8 @@
 
   // Low address (DBC stack grows up).
   uword stack_base() const { return stack_base_; }
+  // Limit for StackOverflowError.
+  uword overflow_stack_limit() const { return overflow_stack_limit_; }
   // High address (DBC stack grows up).
   uword stack_limit() const { return stack_limit_; }
 
@@ -67,7 +70,7 @@
   uword get_pc() const { return reinterpret_cast<uword>(pc_); }
 
   enum IntrinsicId {
-#define V(test_class_name, test_function_name, enum_name, type, fp)            \
+#define V(test_class_name, test_function_name, enum_name, fp)                  \
   k##enum_name##Intrinsic,
     ALL_INTRINSICS_LIST(V) GRAPH_INTRINSICS_LIST(V)
 #undef V
@@ -89,6 +92,7 @@
  private:
   uintptr_t* stack_;
   uword stack_base_;
+  uword overflow_stack_limit_;
   uword stack_limit_;
 
   RawObject** fp_;
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index eaae077..5a4d2f5 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -262,9 +262,7 @@
     return result.raw();
   } else {
     // An error occurred while reading, return the error object.
-    const Error& err = Error::Handle(thread()->sticky_error());
-    thread()->clear_sticky_error();
-    return err.raw();
+    return Thread::Current()->StealStickyError();
   }
 }
 
@@ -1079,7 +1077,7 @@
 
   // Check if it is a code object in that case just write a Null object
   // as we do not want code objects in the snapshot.
-  if (cid == kCodeCid) {
+  if ((cid == kCodeCid) || (cid == kBytecodeCid)) {
     WriteVMIsolateObject(kNullObject);
     return true;
   }
@@ -1434,7 +1432,12 @@
 
 void SnapshotWriter::ThrowException(Exceptions::ExceptionType type,
                                     const char* msg) {
-  thread()->clear_sticky_error();
+  {
+    NoSafepointScope no_safepoint;
+    RawError* error = thread()->StealStickyError();
+    ASSERT(error == Object::snapshot_writer_error().raw());
+  }
+
   if (msg != NULL) {
     const String& msg_obj = String::Handle(String::New(msg));
     const Array& args = Array::Handle(Array::New(1));
@@ -1504,12 +1507,18 @@
 
   // Setup for long jump in case there is an exception while writing
   // the message.
-  LongJumpScope jump;
-  if (setjmp(*jump.Set()) == 0) {
-    NoSafepointScope no_safepoint;
-    WriteObject(obj.raw());
-  } else {
-    FreeBuffer();
+  bool has_exception = false;
+  {
+    LongJumpScope jump;
+    if (setjmp(*jump.Set()) == 0) {
+      NoSafepointScope no_safepoint;
+      WriteObject(obj.raw());
+    } else {
+      FreeBuffer();
+      has_exception = true;
+    }
+  }
+  if (has_exception) {
     ThrowException(exception_type(), exception_msg());
   }
 
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 2010460..1432259 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -39,7 +39,6 @@
 class PageSpace;
 class RawApiError;
 class RawArray;
-class RawBoundedType;
 class RawCapability;
 class RawClass;
 class RawClosure;
@@ -66,7 +65,6 @@
 class RawLocalVarDescriptors;
 class RawMegamorphicCache;
 class RawMint;
-class RawMixinAppType;
 class RawNamespace;
 class RawObject;
 class RawObjectPool;
@@ -90,7 +88,6 @@
 class RawTypeParameter;
 class RawTypeRef;
 class RawUnhandledException;
-class RawUnresolvedClass;
 class RawWeakProperty;
 class String;
 class TypeArguments;
@@ -177,9 +174,6 @@
   }
   Kind kind() const { return static_cast<Kind>(Read<int64_t>(kKindOffset)); }
   void set_kind(Kind value) { return Write<int64_t>(kKindOffset, value); }
-  const uint8_t* content() const {
-    return reinterpret_cast<const uint8_t*>(this) + kHeaderSize;
-  }
 
   static bool IsFull(Kind kind) {
     return (kind == kFull) || (kind == kFullJIT) || (kind == kFullAOT);
@@ -187,6 +181,9 @@
   static bool IncludesCode(Kind kind) {
     return (kind == kFullJIT) || (kind == kFullAOT);
   }
+  static bool IncludesBytecode(Kind kind) {
+    return (kind == kFull) || (kind == kFullJIT);
+  }
 
   const uint8_t* Addr() const { return reinterpret_cast<const uint8_t*>(this); }
 
@@ -448,7 +445,6 @@
 
   friend class ApiError;
   friend class Array;
-  friend class BoundedType;
   friend class Class;
   friend class Closure;
   friend class ClosureData;
@@ -466,7 +462,6 @@
   friend class LibraryPrefix;
   friend class LinkedHashMap;
   friend class MirrorReference;
-  friend class MixinAppType;
   friend class Namespace;
   friend class PatchClass;
   friend class RedirectionData;
@@ -479,7 +474,6 @@
   friend class TypeParameter;
   friend class TypeRef;
   friend class UnhandledException;
-  friend class UnresolvedClass;
   friend class WeakProperty;
   DISALLOW_COPY_AND_ASSIGN(SnapshotReader);
 };
@@ -749,7 +743,6 @@
   friend class RawSubtypeTestCache;
   friend class RawType;
   friend class RawTypeRef;
-  friend class RawBoundedType;
   friend class RawTypeArguments;
   friend class RawTypeParameter;
   friend class RawUserTag;
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 5ff4dd8..52bda42 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -403,6 +403,7 @@
   TEST_ROUND_TRIP_IDENTICAL(Object::script_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::library_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::code_class());
+  TEST_ROUND_TRIP_IDENTICAL(Object::bytecode_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::instructions_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::pc_descriptors_class());
   TEST_ROUND_TRIP_IDENTICAL(Object::exception_handlers_class());
@@ -760,24 +761,23 @@
   {
     TestIsolateScope __test_isolate__;
 
+    // Create a test library and Load up a test script in it.
+    TestCase::LoadTestScript(kScriptChars, NULL);
+
     Thread* thread = Thread::Current();
+    TransitionNativeToVM transition(thread);
     StackZone zone(thread);
     HandleScope scope(thread);
 
-    // Create a test library and Load up a test script in it.
-    TestCase::LoadTestScript(kScriptChars, NULL);
     EXPECT_VALID(Api::CheckAndFinalizePendingClasses(thread));
     timer1.Stop();
     OS::PrintErr("Without Snapshot: %" Pd64 "us\n", timer1.TotalElapsedTime());
 
     // Write snapshot with object content.
-    {
-      TransitionNativeToVM transition(thread);
-      FullSnapshotWriter writer(
-          Snapshot::kFull, NULL, &isolate_snapshot_data_buffer,
-          &malloc_allocator, NULL, NULL /* image_writer */);
-      writer.WriteFullSnapshot();
-    }
+    FullSnapshotWriter writer(Snapshot::kFull, NULL,
+                              &isolate_snapshot_data_buffer, &malloc_allocator,
+                              NULL, /*image_writer*/ nullptr);
+    writer.WriteFullSnapshot();
   }
 
   // Now Create another isolate using the snapshot and execute a method
@@ -832,7 +832,7 @@
       TransitionNativeToVM transition(thread);
       FullSnapshotWriter writer(
           Snapshot::kFull, NULL, &isolate_snapshot_data_buffer,
-          &malloc_allocator, NULL, NULL /* image_writer */);
+          &malloc_allocator, NULL, /*image_writer*/ nullptr);
       writer.WriteFullSnapshot();
     }
 
@@ -869,8 +869,11 @@
 // Helper function to call a top level Dart function and serialize the result.
 static Message* GetSerialized(Dart_Handle lib, const char* dart_function) {
   Dart_Handle result;
-  result = Dart_Invoke(lib, NewString(dart_function), 0, NULL);
-  EXPECT_VALID(result);
+  {
+    TransitionVMToNative transition(Thread::Current());
+    result = Dart_Invoke(lib, NewString(dart_function), 0, NULL);
+    EXPECT_VALID(result);
+  }
   Object& obj = Object::Handle(Api::UnwrapHandle(result));
 
   // Serialize the object into a message.
@@ -1009,6 +1012,7 @@
   {
     Thread* thread = Thread::Current();
     CHECK_API_SCOPE(thread);
+    TransitionNativeToVM transition(thread);
     HANDLESCOPE(thread);
 
     {
@@ -1081,6 +1085,7 @@
 
   {
     CHECK_API_SCOPE(thread);
+    TransitionNativeToVM transition(thread);
     HANDLESCOPE(thread);
     StackZone zone(thread);
     {
@@ -1208,6 +1213,7 @@
 
   {
     CHECK_API_SCOPE(thread);
+    TransitionNativeToVM transition(thread);
     HANDLESCOPE(thread);
     StackZone zone(thread);
     {
@@ -1445,6 +1451,7 @@
 
   {
     CHECK_API_SCOPE(thread);
+    TransitionNativeToVM transition(thread);
     HANDLESCOPE(thread);
     StackZone zone(thread);
     {
@@ -1653,6 +1660,7 @@
 
   {
     CHECK_API_SCOPE(thread);
+    TransitionNativeToVM transition(thread);
     HANDLESCOPE(thread);
     StackZone zone(thread);
     {
@@ -1883,6 +1891,7 @@
 
   {
     CHECK_API_SCOPE(thread);
+    TransitionNativeToVM transition(thread);
     HANDLESCOPE(thread);
     StackZone zone(thread);
     {
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 0bcef13..7ce25de 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -98,7 +98,7 @@
       return true;
   }
   if (func.is_abstract() || func.IsImplicitConstructor() ||
-      func.IsRedirectingFactory()) {
+      func.IsRedirectingFactory() || func.is_no_such_method_forwarder()) {
     return true;
   }
   if (func.IsNonImplicitClosureFunction() &&
@@ -389,12 +389,13 @@
   const TokenPosition end_pos = func.end_token_pos();
 
   Code& code = Code::Handle(zone(), func.unoptimized_code());
+  Bytecode& bytecode = Bytecode::Handle(zone());
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (FLAG_enable_interpreter && code.IsNull() && func.HasBytecode()) {
-    code = func.Bytecode();
+    bytecode = func.bytecode();
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  if (code.IsNull()) {
+  if (code.IsNull() && bytecode.IsNull()) {
     if (func.HasCode() || (compile_mode_ == kForceCompile)) {
       const Error& err =
           Error::Handle(Compiler::EnsureUnoptimizedCode(thread(), func));
@@ -411,7 +412,7 @@
       code = func.unoptimized_code();
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (FLAG_enable_interpreter && code.IsNull() && func.HasBytecode()) {
-        code = func.Bytecode();
+        bytecode = func.bytecode();
       }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
     } else {
@@ -424,7 +425,7 @@
       return;
     }
   }
-  ASSERT(!code.IsNull());
+  ASSERT(!code.IsNull() || !bytecode.IsNull());
 
   // We skip compiled async functions.  Once an async function has
   // been compiled, there is another function with the same range which
@@ -438,8 +439,14 @@
   range.AddProperty("scriptIndex", GetScriptIndex(script));
   range.AddProperty("startPos", begin_pos);
   range.AddProperty("endPos", end_pos);
-  range.AddProperty("compiled", true);
+  // TODO(regis): What is the meaning of 'compiled' in the presence of bytecode?
+  // If it means 'called', it should say 'true' if bytecode is present.
+  range.AddProperty("compiled", !code.IsNull());
 
+  // TODO(regis): Do we want a report covering interpreted functions too?
+  if (code.IsNull()) {
+    return;
+  }
   if (IsReportRequested(kCallSites)) {
     PrintCallSitesData(&range, func, code);
   }
@@ -468,15 +475,7 @@
     cls = it.GetNextClass();
     if (!cls.is_finalized()) {
       if (compile_mode_ == kForceCompile) {
-        Error& err = Error::Handle();
-        if (cls.is_marked_for_parsing()) {
-          const String& error_message = String::Handle(
-              String::New("Unable to process 'force compile' request, "
-                          "while the class is being finalized."));
-          err = ApiError::New(error_message);
-        } else {
-          err = cls.EnsureIsFinalized(thread());
-        }
+        Error& err = Error::Handle(cls.EnsureIsFinalized(thread()));
         if (!err.IsNull()) {
           // Emit an uncompiled range for this class with error information.
           JSONObject range(jsarr);
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index 6c5e1cf..5e37a9b 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -11,15 +11,15 @@
 #ifndef PRODUCT
 
 static RawObject* ExecuteScript(const char* script) {
-  TransitionVMToNative transition(Thread::Current());
-  Dart_Handle h_lib = TestCase::LoadTestScript(script, NULL);
-  EXPECT_VALID(h_lib);
-  Library& lib = Library::Handle();
-  lib ^= Api::UnwrapHandle(h_lib);
-  EXPECT(!lib.IsNull());
-  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
-  EXPECT_VALID(result);
-  return Api::UnwrapHandle(h_lib);
+  Dart_Handle lib;
+  {
+    TransitionVMToNative transition(Thread::Current());
+    lib = TestCase::LoadTestScript(script, NULL);
+    EXPECT_VALID(lib);
+    Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+    EXPECT_VALID(result);
+  }
+  return Api::UnwrapHandle(lib);
 }
 
 ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_NoCalls) {
@@ -667,6 +667,51 @@
       buffer);
 }
 
+ISOLATE_UNIT_TEST_CASE(SourceReport_Coverage_Issue35453_NoSuchMethod) {
+  char buffer[1024];
+  const char* kScript =
+      "class Foo {\n"
+      "  void bar() {}\n"
+      "}\n"
+      "class Unused implements Foo {\n"
+      "  dynamic noSuchMethod(_) {}\n"
+      "}\n"
+      "void main() {\n"
+      "  Foo().bar();\n"
+      "}\n";
+
+  Library& lib = Library::Handle();
+  lib ^= ExecuteScript(kScript);
+  ASSERT(!lib.IsNull());
+  const Script& script =
+      Script::Handle(lib.LookupScript(String::Handle(String::New("test-lib"))));
+
+  SourceReport report(SourceReport::kCoverage, SourceReport::kForceCompile);
+  JSONStream js;
+  report.PrintJSON(&js, script);
+  ElideJSONSubstring("classes", js.ToCString(), buffer);
+  ElideJSONSubstring("libraries", buffer, buffer);
+  EXPECT_STREQ(
+      "{\"type\":\"SourceReport\",\"ranges\":["
+
+      // Foo is hit.
+      "{\"scriptIndex\":0,\"startPos\":14,\"endPos\":26,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[14],\"misses\":[]}},"
+
+      // Unused is missed.
+      "{\"scriptIndex\":0,\"startPos\":62,\"endPos\":87,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[],\"misses\":[62]}},"
+
+      // Main is hit.
+      "{\"scriptIndex\":0,\"startPos\":91,\"endPos\":120,\"compiled\":true,"
+      "\"coverage\":{\"hits\":[91,107,113],\"misses\":[]}}],"
+
+      // Only one script in the script table.
+      "\"scripts\":[{\"type\":\"@Script\",\"fixedId\":true,\"id\":\"\","
+      "\"uri\":\"file:\\/\\/\\/test-lib\",\"_kind\":\"kernel\"}]}",
+      buffer);
+}
+
 #endif  // !PRODUCT
 
 }  // namespace dart
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index a8936df..5f174f8 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -15,6 +15,7 @@
 #include "vm/parser.h"
 #include "vm/raw_object.h"
 #include "vm/reusable_handles.h"
+#include "vm/reverse_pc_lookup_cache.h"
 #include "vm/scopes.h"
 #include "vm/stub_code.h"
 #include "vm/visitor.h"
@@ -42,6 +43,18 @@
     /*.saved_caller_pp_from_fp = */ kSavedCallerPpSlotFromFp,
     /*.code_from_fp = */ kPcMarkerSlotFromFp,
 };
+const FrameLayout bare_instructions_frame_layout = {
+    /*.first_object_from_pc =*/kFirstObjectSlotFromFp,  // No saved PP slot.
+    /*.last_fixed_object_from_fp = */ kLastFixedObjectSlotFromFp +
+        2,  // No saved CODE, PP slots
+    /*.param_end_from_fp = */ kParamEndSlotFromFp,
+    /*.first_local_from_fp =*/kFirstLocalSlotFromFp +
+        2,  // No saved CODE, PP slots.
+    /*.dart_fixed_frame_size =*/kDartFrameFixedSize -
+        2,                              // No saved CODE, PP slots.
+    /*.saved_caller_pp_from_fp = */ 0,  // No saved PP slot.
+    /*.code_from_fp = */ 0,             // No saved CODE
+};
 
 FrameLayout compiler_frame_layout = invalid_frame_layout;
 FrameLayout runtime_frame_layout = invalid_frame_layout;
@@ -61,20 +74,84 @@
 }
 
 void FrameLayout::Init() {
+  // By default we use frames with CODE_REG/PP in the frame.
   compiler_frame_layout = default_frame_layout;
   runtime_frame_layout = default_frame_layout;
+
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    compiler_frame_layout = bare_instructions_frame_layout;
+  }
+#if defined(DART_PRECOMPILED_RUNTIME)
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    compiler_frame_layout = invalid_frame_layout;
+    runtime_frame_layout = bare_instructions_frame_layout;
+  }
+#endif
+}
+
+Isolate* StackFrame::IsolateOfBareInstructionsFrame() const {
+  auto isolate = this->isolate();
+
+  if (isolate->object_store()->code_order_table() != Object::null()) {
+    auto rct = isolate->reverse_pc_lookup_cache();
+    if (rct->Contains(pc())) return isolate;
+  }
+
+  isolate = Dart::vm_isolate();
+  if (isolate->object_store()->code_order_table() != Object::null()) {
+    auto rct = isolate->reverse_pc_lookup_cache();
+    if (rct->Contains(pc())) return isolate;
+  }
+
+  return nullptr;
+}
+
+bool StackFrame::IsBareInstructionsDartFrame() const {
+  NoSafepointScope no_safepoint;
+
+  if (auto isolate = IsolateOfBareInstructionsFrame()) {
+    Code code;
+    auto rct = isolate->reverse_pc_lookup_cache();
+    code = rct->Lookup(pc());
+
+    const intptr_t cid = code.owner()->GetClassId();
+    ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
+    return cid == kFunctionCid;
+  }
+  return false;
+}
+
+bool StackFrame::IsBareInstructionsStubFrame() const {
+  NoSafepointScope no_safepoint;
+
+  if (auto isolate = IsolateOfBareInstructionsFrame()) {
+    Code code;
+    auto rct = isolate->reverse_pc_lookup_cache();
+    code = rct->Lookup(pc());
+
+    const intptr_t cid = code.owner()->GetClassId();
+    ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
+    return cid == kNullCid || cid == kClassCid;
+  }
+  return false;
 }
 
 bool StackFrame::IsStubFrame() const {
   if (is_interpreted()) {
     return false;
   }
+
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    return IsBareInstructionsStubFrame();
+  }
+
   ASSERT(!(IsEntryFrame() || IsExitFrame()));
 #if !defined(HOST_OS_WINDOWS) && !defined(HOST_OS_FUCHSIA)
   // On Windows and Fuchsia, the profiler calls this from a separate thread
   // where Thread::Current() is NULL, so we cannot create a NoSafepointScope.
   NoSafepointScope no_safepoint;
 #endif
+
   RawCode* code = GetCodeObject();
   ASSERT(code != Object::null());
   const intptr_t cid = code->ptr()->owner_->GetClassId();
@@ -86,6 +163,15 @@
   ASSERT(thread_ == Thread::Current());
   Zone* zone = Thread::Current()->zone();
   if (IsDartFrame()) {
+    if (is_interpreted()) {
+      const Bytecode& bytecode = Bytecode::Handle(zone, LookupDartBytecode());
+      ASSERT(!bytecode.IsNull());
+      const Function& function = Function::Handle(zone, bytecode.function());
+      ASSERT(!function.IsNull());
+      return zone->PrintToString(
+          "[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px ") bytecode %s ]",
+          GetName(), sp(), fp(), pc(), function.ToFullyQualifiedCString());
+    }
     const Code& code = Code::Handle(zone, LookupDartCode());
     ASSERT(!code.IsNull());
     const Object& owner = Object::Handle(zone, code.owner());
@@ -164,11 +250,26 @@
   // helper functions to the raw object interface.
   NoSafepointScope no_safepoint;
   Code code;
-  RawCode* raw_code = UncheckedGetCodeObject();
-  // May forward raw_code. Note we don't just visit the pc marker slot first
-  // because the visitor's forwarding might not be idempotent.
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&raw_code));
-  code ^= raw_code;
+
+  if (auto isolate = IsolateOfBareInstructionsFrame()) {
+    code = isolate->reverse_pc_lookup_cache()->Lookup(pc());
+  } else {
+    RawObject* pc_marker = *(reinterpret_cast<RawObject**>(
+        fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
+                                  : runtime_frame_layout.code_from_fp) *
+                kWordSize)));
+    // May forward raw code. Note we don't just visit the pc marker slot first
+    // because the visitor's forwarding might not be idempotent.
+    visitor->VisitPointer(&pc_marker);
+    if (pc_marker->IsHeapObject() && (pc_marker->GetClassId() == kCodeCid)) {
+      code ^= pc_marker;
+    } else {
+      ASSERT(pc_marker == Object::null() ||
+             (is_interpreted() && (!pc_marker->IsHeapObject() ||
+                                   (pc_marker->GetClassId() == kBytecodeCid))));
+    }
+  }
+
   if (!code.IsNull()) {
     // Optimized frames have a stack map. We need to visit the frame based
     // on the stack map.
@@ -289,6 +390,11 @@
 }
 
 RawFunction* StackFrame::LookupDartFunction() const {
+  if (is_interpreted()) {
+    const Bytecode& bytecode = Bytecode::Handle(LookupDartBytecode());
+    ASSERT(!bytecode.IsNull());
+    return bytecode.function();
+  }
   const Code& code = Code::Handle(LookupDartCode());
   if (!code.IsNull()) {
     return code.function();
@@ -305,6 +411,10 @@
   // where Thread::Current() is NULL, so we cannot create a NoSafepointScope.
   NoSafepointScope no_safepoint;
 #endif
+  if (auto isolate = IsolateOfBareInstructionsFrame()) {
+    return isolate->reverse_pc_lookup_cache()->Lookup(pc());
+  }
+
   RawCode* code = GetCodeObject();
   if ((code != Code::null()) &&
       (code->ptr()->owner_->GetClassId() == kFunctionCid)) {
@@ -314,17 +424,37 @@
 }
 
 RawCode* StackFrame::GetCodeObject() const {
-  RawCode* pc_marker = UncheckedGetCodeObject();
-  ASSERT((pc_marker == Object::null()) ||
-         (pc_marker->GetClassId() == kCodeCid));
-  return pc_marker;
+  ASSERT(!is_interpreted());
+  if (auto isolate = IsolateOfBareInstructionsFrame()) {
+    return isolate->reverse_pc_lookup_cache()->Lookup(pc());
+  } else {
+    RawObject* pc_marker = *(reinterpret_cast<RawObject**>(
+        fp() + runtime_frame_layout.code_from_fp * kWordSize));
+    ASSERT((pc_marker == Object::null()) ||
+           (pc_marker->GetClassId() == kCodeCid));
+    return reinterpret_cast<RawCode*>(pc_marker);
+  }
 }
 
-RawCode* StackFrame::UncheckedGetCodeObject() const {
-  return *(reinterpret_cast<RawCode**>(
-      fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
-                                : runtime_frame_layout.code_from_fp) *
-              kWordSize)));
+RawBytecode* StackFrame::LookupDartBytecode() const {
+// We add a no gc scope to ensure that the code below does not trigger
+// a GC as we are handling raw object references here. It is possible
+// that the code is called while a GC is in progress, that is ok.
+#if !defined(HOST_OS_WINDOWS) && !defined(HOST_OS_FUCHSIA)
+  // On Windows and Fuchsia, the profiler calls this from a separate thread
+  // where Thread::Current() is NULL, so we cannot create a NoSafepointScope.
+  NoSafepointScope no_safepoint;
+#endif
+  return GetBytecodeObject();
+}
+
+RawBytecode* StackFrame::GetBytecodeObject() const {
+  ASSERT(is_interpreted());
+  RawObject* pc_marker = *(
+      reinterpret_cast<RawObject**>(fp() + kKBCPcMarkerSlotFromFp * kWordSize));
+  ASSERT((pc_marker == Object::null()) ||
+         (pc_marker->GetClassId() == kBytecodeCid));
+  return reinterpret_cast<RawBytecode*>(pc_marker);
 }
 
 bool StackFrame::FindExceptionHandler(Thread* thread,
@@ -334,32 +464,43 @@
                                       bool* is_optimized) const {
   REUSABLE_CODE_HANDLESCOPE(thread);
   Code& code = reused_code_handle.Handle();
-  code = LookupDartCode();
-  if (code.IsNull()) {
-    return false;  // Stub frames do not have exception handlers.
+  REUSABLE_BYTECODE_HANDLESCOPE(thread);
+  Bytecode& bytecode = reused_bytecode_handle.Handle();
+  REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread);
+  ExceptionHandlers& handlers = reused_exception_handlers_handle.Handle();
+  REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(thread);
+  PcDescriptors& descriptors = reused_pc_descriptors_handle.Handle();
+  uword start;
+  if (is_interpreted()) {
+    bytecode = LookupDartBytecode();
+    ASSERT(!bytecode.IsNull());
+    start = bytecode.PayloadStart();
+    handlers = bytecode.exception_handlers();
+    descriptors = bytecode.pc_descriptors();
+  } else {
+    code = LookupDartCode();
+    if (code.IsNull()) {
+      return false;  // Stub frames do not have exception handlers.
+    }
+    start = code.PayloadStart();
+    handlers = code.exception_handlers();
+    descriptors = code.pc_descriptors();
+    *is_optimized = code.is_optimized();
   }
-  *is_optimized = code.is_optimized();
   HandlerInfoCache* cache = thread->isolate()->handler_info_cache();
   ExceptionHandlerInfo* info = cache->Lookup(pc());
   if (info != NULL) {
-    *handler_pc = code.PayloadStart() + info->handler_pc_offset;
+    *handler_pc = start + info->handler_pc_offset;
     *needs_stacktrace = info->needs_stacktrace;
     *has_catch_all = info->has_catch_all;
     return true;
   }
-  uword pc_offset = pc() - code.PayloadStart();
+  uword pc_offset = pc() - start;
 
-  REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(thread);
-  ExceptionHandlers& handlers = reused_exception_handlers_handle.Handle();
-  handlers = code.exception_handlers();
   if (handlers.num_entries() == 0) {
     return false;
   }
 
-  // Find pc descriptor for the current pc.
-  REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(thread);
-  PcDescriptors& descriptors = reused_pc_descriptors_handle.Handle();
-  descriptors = code.pc_descriptors();
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kAnyKind);
   intptr_t try_index = -1;
   if (is_interpreted()) {
@@ -394,7 +535,7 @@
   }
   ExceptionHandlerInfo handler_info;
   handlers.GetHandlerInfo(try_index, &handler_info);
-  *handler_pc = code.PayloadStart() + handler_info.handler_pc_offset;
+  *handler_pc = start + handler_info.handler_pc_offset;
   *needs_stacktrace = handler_info.needs_stacktrace;
   *has_catch_all = handler_info.has_catch_all;
   cache->Insert(pc(), handler_info);
@@ -402,6 +543,13 @@
 }
 
 TokenPosition StackFrame::GetTokenPos() const {
+  if (is_interpreted()) {
+    const Bytecode& bytecode = Bytecode::Handle(LookupDartBytecode());
+    if (bytecode.IsNull()) {
+      return TokenPosition::kNoSource;  // Stub frames do not have token_pos.
+    }
+    return bytecode.GetTokenIndexOfPC(pc());
+  }
   const Code& code = Code::Handle(LookupDartCode());
   if (code.IsNull()) {
     return TokenPosition::kNoSource;  // Stub frames do not have token_pos.
@@ -423,6 +571,9 @@
   if (IsEntryFrame() || IsExitFrame() || IsStubFrame()) {
     return true;
   }
+  if (is_interpreted()) {
+    return (LookupDartBytecode() != Bytecode::null());
+  }
   return (LookupDartCode() != Code::null());
 }
 
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index c43b60f..c8b59b9 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -114,11 +114,11 @@
     ASSERT(!is_interpreted());
     uword raw_pc =
         *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize));
-    return raw_pc == StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint();
+    return raw_pc == StubCode::DeoptimizeLazyFromReturn().EntryPoint();
   }
   void MarkForLazyDeopt() {
     ASSERT(!is_interpreted());
-    set_pc(StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint());
+    set_pc(StubCode::DeoptimizeLazyFromReturn().EntryPoint());
   }
   void UnmarkForLazyDeopt() {
     // If this frame was marked for lazy deopt, pc_ was computed to be the
@@ -126,8 +126,7 @@
     // Write this value back into the frame.
     ASSERT(!is_interpreted());
     uword original_pc = pc();
-    ASSERT(original_pc !=
-           StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint());
+    ASSERT(original_pc != StubCode::DeoptimizeLazyFromReturn().EntryPoint());
     set_pc(original_pc);
   }
 
@@ -153,6 +152,18 @@
   // Check validity of a frame, used for assertion purposes.
   virtual bool IsValid() const;
 
+  // Returns the isolate containing the bare instructions of the current frame.
+  //
+  // If the frame does not belong to a bare instructions snapshot, it will
+  // return nullptr.
+  Isolate* IsolateOfBareInstructionsFrame() const;
+
+  // Returns true iff the current frame is a bare instructions dart frame.
+  bool IsBareInstructionsDartFrame() const;
+
+  // Returns true iff the current frame is a bare instructions stub frame.
+  bool IsBareInstructionsStubFrame() const;
+
   // Frame type.
   virtual bool IsDartFrame(bool validate = true) const {
     ASSERT(!validate || IsValid());
@@ -161,10 +172,12 @@
   virtual bool IsStubFrame() const;
   virtual bool IsEntryFrame() const { return false; }
   virtual bool IsExitFrame() const { return false; }
+
   virtual bool is_interpreted() const { return is_interpreted_; }
 
   RawFunction* LookupDartFunction() const;
   RawCode* LookupDartCode() const;
+  RawBytecode* LookupDartBytecode() const;
   bool FindExceptionHandler(Thread* thread,
                             uword* handler_pc,
                             bool* needs_stacktrace,
@@ -180,7 +193,9 @@
 
   // Name of the frame, used for generic frame printing functionality.
   virtual const char* GetName() const {
-    return IsStubFrame() ? "stub" : "dart";
+    if (IsBareInstructionsStubFrame()) return "bare-stub";
+    if (IsStubFrame()) return "stub";
+    return IsBareInstructionsDartFrame() ? "bare-dart" : "dart";
   }
 
   Isolate* isolate() const { return thread_->isolate(); }
@@ -189,7 +204,7 @@
 
  private:
   RawCode* GetCodeObject() const;
-  RawCode* UncheckedGetCodeObject() const;
+  RawBytecode* GetBytecodeObject() const;
 
   uword GetCallerSp() const {
     return fp() +
@@ -209,8 +224,8 @@
         fp() + ((is_interpreted() ? kKBCSavedCallerPcSlotFromFp
                                   : kSavedCallerPcSlotFromFp) *
                 kWordSize)));
-    ASSERT(raw_pc != StubCode::DeoptimizeLazyFromThrow_entry()->EntryPoint());
-    if (raw_pc == StubCode::DeoptimizeLazyFromReturn_entry()->EntryPoint()) {
+    ASSERT(raw_pc != StubCode::DeoptimizeLazyFromThrow().EntryPoint());
+    if (raw_pc == StubCode::DeoptimizeLazyFromReturn().EntryPoint()) {
       return isolate()->FindPendingDeopt(GetCallerFp());
     }
     return raw_pc;
diff --git a/runtime/vm/stack_frame_arm64.h b/runtime/vm/stack_frame_arm64.h
index c0a9435..70000da 100644
--- a/runtime/vm/stack_frame_arm64.h
+++ b/runtime/vm/stack_frame_arm64.h
@@ -42,7 +42,6 @@
 
 static const int kParamEndSlotFromFp = 1;  // One slot past last parameter.
 static const int kCallerSpSlotFromFp = 2;
-static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
 static const int kExitLinkSlotFromEntryFp = -22;
diff --git a/runtime/vm/stack_frame_test.cc b/runtime/vm/stack_frame_test.cc
index 1fa5faf..9b89101 100644
--- a/runtime/vm/stack_frame_test.cc
+++ b/runtime/vm/stack_frame_test.cc
@@ -39,8 +39,12 @@
 
 void FUNCTION_NAME(StackFrame_equals)(Dart_NativeArguments args) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
-  const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0));
-  const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1));
+  TransitionNativeToVM transition(arguments->thread());
+  Zone* zone = arguments->thread()->zone();
+  const Instance& expected =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
+  const Instance& actual =
+      Instance::CheckedHandle(zone, arguments->NativeArgAt(1));
   if (!expected.OperatorEquals(actual)) {
     OS::PrintErr("expected: '%s' actual: '%s'\n", expected.ToCString(),
                  actual.ToCString());
@@ -49,32 +53,28 @@
 }
 
 void FUNCTION_NAME(StackFrame_frameCount)(Dart_NativeArguments args) {
+  NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  TransitionNativeToVM transition(arguments->thread());
   int count = 0;
   StackFrameIterator frames(ValidationPolicy::kValidateFrames,
-                            Thread::Current(),
+                            arguments->thread(),
                             StackFrameIterator::kNoCrossThreadIteration);
   while (frames.NextFrame() != NULL) {
     count += 1;  // Count the frame.
   }
-  {
-    TransitionNativeToVM transition(Thread::Current());
-    VerifyPointersVisitor::VerifyPointers();
-  }
-  NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
+  VerifyPointersVisitor::VerifyPointers();
   arguments->SetReturn(Object::Handle(Smi::New(count)));
 }
 
 void FUNCTION_NAME(StackFrame_dartFrameCount)(Dart_NativeArguments args) {
+  TransitionNativeToVM transition(Thread::Current());
   int count = 0;
   DartFrameIterator frames(Thread::Current(),
                            StackFrameIterator::kNoCrossThreadIteration);
   while (frames.NextFrame() != NULL) {
     count += 1;  // Count the dart frame.
   }
-  {
-    TransitionNativeToVM transition(Thread::Current());
-    VerifyPointersVisitor::VerifyPointers();
-  }
+  VerifyPointersVisitor::VerifyPointers();
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   arguments->SetReturn(Object::Handle(Smi::New(count)));
 }
@@ -87,13 +87,13 @@
   Dart_Handle name = Dart_GetNativeArgument(args, 1);
 
   TransitionNativeToVM transition(thread);
-  const Smi& frame_index_smi = Smi::CheckedHandle(Api::UnwrapHandle(index));
+  const Smi& frame_index_smi =
+      Smi::CheckedHandle(zone, Api::UnwrapHandle(index));
   const char* expected_name =
-      String::CheckedHandle(Api::UnwrapHandle(name)).ToCString();
+      String::CheckedHandle(zone, Api::UnwrapHandle(name)).ToCString();
   int frame_index = frame_index_smi.Value();
   int count = 0;
-  DartFrameIterator frames(Thread::Current(),
-                           StackFrameIterator::kNoCrossThreadIteration);
+  DartFrameIterator frames(thread, StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   while (frame != NULL) {
     if (count == frame_index) {
@@ -143,6 +143,7 @@
                                          bool* auto_setup_scope) {
   ASSERT(auto_setup_scope != NULL);
   *auto_setup_scope = false;
+  TransitionNativeToVM transition(Thread::Current());
   const Object& obj = Object::Handle(Api::UnwrapHandle(name));
   ASSERT(obj.IsString());
   const char* function_name = obj.ToCString();
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index 1435777..84d9652 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -43,7 +43,6 @@
 
 static const int kParamEndSlotFromFp = 1;  // One slot past last parameter.
 static const int kCallerSpSlotFromFp = 2;
-static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
 #if defined(_WIN64)
diff --git a/runtime/vm/stack_trace.cc b/runtime/vm/stack_trace.cc
index 8f5829d..24415e1 100644
--- a/runtime/vm/stack_trace.cc
+++ b/runtime/vm/stack_trace.cc
@@ -17,7 +17,6 @@
                             StackFrameIterator::kNoCrossThreadIteration);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
-  Code& code = Code::Handle(zone);
   Function& function = Function::Handle(zone);
   const bool async_function_is_null = async_function.IsNull();
   while (frame != NULL) {
@@ -25,8 +24,7 @@
       if (skip_frames > 0) {
         skip_frames--;
       } else {
-        code = frame->LookupDartCode();
-        function = code.function();
+        function = frame->LookupDartFunction();
         frame_count++;
         if (!async_function_is_null &&
             (async_function.raw() == function.parent_function())) {
@@ -54,6 +52,7 @@
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
   Function& function = Function::Handle(zone);
   Code& code = Code::Handle(zone);
+  Bytecode& bytecode = Bytecode::Handle(zone);
   Smi& offset = Smi::Handle(zone);
   intptr_t collected_frames_count = 0;
   while ((frame != NULL) && (collected_frames_count < count)) {
@@ -61,10 +60,17 @@
       if (skip_frames > 0) {
         skip_frames--;
       } else {
-        code = frame->LookupDartCode();
-        function = code.function();
-        offset = Smi::New(frame->pc() - code.PayloadStart());
-        code_array.SetAt(array_offset, code);
+        if (frame->is_interpreted()) {
+          bytecode = frame->LookupDartBytecode();
+          function = bytecode.function();
+          offset = Smi::New(frame->pc() - bytecode.PayloadStart());
+          code_array.SetAt(array_offset, bytecode);
+        } else {
+          code = frame->LookupDartCode();
+          function = code.function();
+          offset = Smi::New(frame->pc() - code.PayloadStart());
+          code_array.SetAt(array_offset, code);
+        }
         pc_offset_array.SetAt(array_offset, offset);
         array_offset++;
         collected_frames_count++;
@@ -98,10 +104,14 @@
   ASSERT(!async_pc_offset_array->IsNull());
   // We start with the asynchronous gap marker.
   ASSERT(async_code_array->At(0) != Code::null());
-  ASSERT(async_code_array->At(0) ==
-         StubCode::AsynchronousGapMarker_entry()->code());
-  const Code& code = Code::Handle(Code::RawCast(async_code_array->At(1)));
-  *async_function = code.function();
+  ASSERT(async_code_array->At(0) == StubCode::AsynchronousGapMarker().raw());
+  const Object& code_object = Object::Handle(async_code_array->At(1));
+  if (code_object.IsCode()) {
+    *async_function = Code::Cast(code_object).function();
+  } else {
+    ASSERT(code_object.IsBytecode());
+    *async_function = Bytecode::Cast(code_object).function();
+  }
   ASSERT(!async_function->IsNull());
   ASSERT(async_function->IsAsyncFunction() ||
          async_function->IsAsyncGenerator());
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 823dea5..9f48a07 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -7,6 +7,7 @@
 #include "platform/assert.h"
 #include "platform/globals.h"
 #include "vm/clustered_snapshot.h"
+#include "vm/compiler/aot/precompiler.h"
 #include "vm/compiler/assembler/assembler.h"
 #include "vm/compiler/assembler/disassembler.h"
 #include "vm/flags.h"
@@ -20,28 +21,16 @@
 namespace dart {
 
 DEFINE_FLAG(bool, disassemble_stubs, false, "Disassemble generated stubs.");
+DECLARE_FLAG(bool, precompiled_mode);
 
 DECLARE_FLAG(bool, enable_interpreter);
 
-StubEntry* StubCode::entries_[kNumStubEntries] = {
-#define STUB_CODE_DECLARE(name) NULL,
+Code* StubCode::entries_[kNumStubEntries] = {
+#define STUB_CODE_DECLARE(name) nullptr,
     VM_STUB_CODE_LIST(STUB_CODE_DECLARE)
 #undef STUB_CODE_DECLARE
 };
 
-StubEntry::StubEntry(const Code& code)
-    : code_(code.raw()),
-      entry_point_(code.EntryPoint()),
-      monomorphic_entry_point_(code.MonomorphicEntryPoint()),
-      size_(code.Size()),
-      label_(code.EntryPoint()) {}
-
-// Visit all object pointers.
-void StubEntry::VisitObjectPointers(ObjectPointerVisitor* visitor) {
-  ASSERT(visitor != NULL);
-  visitor->VisitPointer(reinterpret_cast<RawObject**>(&code_));
-}
-
 #if defined(DART_PRECOMPILED_RUNTIME)
 void StubCode::Init() {
   // Stubs will be loaded from the snapshot.
@@ -55,20 +44,28 @@
 #else
 
 #define STUB_CODE_GENERATE(name)                                               \
-  code ^= Generate("_stub_" #name, StubCode::Generate##name##Stub);            \
-  entries_[k##name##Index] = new StubEntry(code);
+  entries_[k##name##Index] = Code::ReadOnlyHandle();                           \
+  *entries_[k##name##Index] = Generate("_stub_" #name, &object_pool_wrapper,   \
+                                       StubCode::Generate##name##Stub);
+
+#define STUB_CODE_SET_OBJECT_POOL(name)                                        \
+  entries_[k##name##Index]->set_object_pool(object_pool.raw());
 
 void StubCode::Init() {
+  ObjectPoolWrapper object_pool_wrapper;
+
   // Generate all the stubs.
-  Code& code = Code::Handle();
   VM_STUB_CODE_LIST(STUB_CODE_GENERATE);
+
+  const ObjectPool& object_pool =
+      ObjectPool::Handle(object_pool_wrapper.MakeObjectPool());
+  VM_STUB_CODE_LIST(STUB_CODE_SET_OBJECT_POOL)
 }
 
 #undef STUB_CODE_GENERATE
+#undef STUB_CODE_SET_OBJECT_POOL
 
-#define STUB_CODE_CLEANUP(name)                                                \
-  delete entries_[k##name##Index];                                             \
-  entries_[k##name##Index] = NULL;
+#define STUB_CODE_CLEANUP(name) entries_[k##name##Index] = nullptr;
 
 void StubCode::Cleanup() {
   VM_STUB_CODE_LIST(STUB_CODE_CLEANUP);
@@ -77,12 +74,13 @@
 #undef STUB_CODE_CLEANUP
 
 RawCode* StubCode::Generate(const char* name,
+                            ObjectPoolWrapper* object_pool_wrapper,
                             void (*GenerateStub)(Assembler* assembler)) {
-  ObjectPoolWrapper object_pool_wrapper;
-  Assembler assembler(&object_pool_wrapper);
+  Assembler assembler(object_pool_wrapper);
   GenerateStub(&assembler);
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(name, nullptr, &assembler, false /* optimized */));
+  const Code& code = Code::Handle(Code::FinalizeCode(
+      name, nullptr, &assembler, Code::PoolAttachment::kNotAttachPool,
+      /*optimized=*/false));
 #ifndef PRODUCT
   if (FLAG_support_disassembler && FLAG_disassemble_stubs) {
     LogBlock lb;
@@ -91,7 +89,9 @@
     code.Disassemble(&formatter);
     THR_Print("}\n");
     const ObjectPool& object_pool = ObjectPool::Handle(code.object_pool());
-    object_pool.DebugPrint();
+    if (!object_pool.IsNull()) {
+      object_pool.DebugPrint();
+    }
   }
 #endif  // !PRODUCT
   return code.raw();
@@ -102,7 +102,7 @@
 
 bool StubCode::HasBeenInitialized() {
   // Use AsynchronousGapMarker as canary.
-  return StubCode::AsynchronousGapMarker_entry() != NULL;
+  return entries_[kAsynchronousGapMarkerIndex] != nullptr;
 }
 
 bool StubCode::InInvocationStub(uword pc, bool is_interpreted_frame) {
@@ -115,7 +115,7 @@
       return Interpreter::IsEntryFrameMarker(pc);
     }
     {
-      uword entry = StubCode::InvokeDartCodeFromBytecode_entry()->EntryPoint();
+      uword entry = StubCode::InvokeDartCodeFromBytecode().EntryPoint();
       uword size = StubCode::InvokeDartCodeFromBytecodeSize();
       if ((pc >= entry) && (pc < (entry + size))) {
         return true;
@@ -123,7 +123,7 @@
     }
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  uword entry = StubCode::InvokeDartCode_entry()->EntryPoint();
+  uword entry = StubCode::InvokeDartCode().EntryPoint();
   uword size = StubCode::InvokeDartCodeSize();
   return (pc >= entry) && (pc < (entry + size));
 #else
@@ -141,7 +141,7 @@
 bool StubCode::InJumpToFrameStub(uword pc) {
 #if !defined(TARGET_ARCH_DBC)
   ASSERT(HasBeenInitialized());
-  uword entry = StubCode::JumpToFrame_entry()->EntryPoint();
+  uword entry = StubCode::JumpToFrame().EntryPoint();
   uword size = StubCode::JumpToFrameSize();
   return (pc >= entry) && (pc < (entry + size));
 #else
@@ -158,19 +158,31 @@
   const Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread));
   ASSERT(error.IsNull());
   if (cls.id() == kArrayCid) {
-    return AllocateArray_entry()->code();
+    return AllocateArray().raw();
   }
   Code& stub = Code::Handle(zone, cls.allocation_stub());
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (stub.IsNull()) {
     ObjectPoolWrapper object_pool_wrapper;
-    Assembler assembler(&object_pool_wrapper);
+    Precompiler* precompiler = Precompiler::Instance();
+
+    ObjectPoolWrapper* wrapper =
+        FLAG_use_bare_instructions && precompiler != NULL
+            ? precompiler->global_object_pool_wrapper()
+            : &object_pool_wrapper;
+
+    const auto pool_attachment =
+        FLAG_precompiled_mode && FLAG_use_bare_instructions
+            ? Code::PoolAttachment::kNotAttachPool
+            : Code::PoolAttachment::kAttachPool;
+
+    Assembler assembler(wrapper);
     const char* name = cls.ToCString();
     StubCode::GenerateAllocationStubForClass(&assembler, cls);
 
     if (thread->IsMutatorThread()) {
-      stub ^=
-          Code::FinalizeCode(name, nullptr, &assembler, false /* optimized */);
+      stub ^= Code::FinalizeCode(name, nullptr, &assembler, pool_attachment,
+                                 /*optimized1*/ false);
       // Check if background compilation thread has not already added the stub.
       if (cls.allocation_stub() == Code::null()) {
         stub.set_owner(cls);
@@ -194,7 +206,7 @@
         // Do not Garbage collect during this stage and instead allow the
         // heap to grow.
         NoHeapGrowthControlScope no_growth_control;
-        stub ^= Code::FinalizeCode(name, nullptr, &assembler,
+        stub ^= Code::FinalizeCode(name, nullptr, &assembler, pool_attachment,
                                    false /* optimized */);
         stub.set_owner(cls);
         cls.set_allocation_stub(stub);
@@ -212,7 +224,9 @@
       stub.Disassemble(&formatter);
       THR_Print("}\n");
       const ObjectPool& object_pool = ObjectPool::Handle(stub.object_pool());
-      object_pool.DebugPrint();
+      if (!object_pool.IsNull()) {
+        object_pool.DebugPrint();
+      }
     }
 #endif  // !PRODUCT
   }
@@ -224,15 +238,23 @@
 }
 
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
-RawCode* StubCode::GetBuildMethodExtractorStub() {
+RawCode* StubCode::GetBuildMethodExtractorStub(ObjectPoolWrapper* pool) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
   ObjectPoolWrapper object_pool_wrapper;
-  Assembler assembler(&object_pool_wrapper);
+  Assembler assembler(pool != nullptr ? pool : &object_pool_wrapper);
   StubCode::GenerateBuildMethodExtractorStub(&assembler);
 
   const char* name = "BuildMethodExtractor";
-  const Code& stub = Code::Handle(
-      Code::FinalizeCode(name, nullptr, &assembler, false /* optimized */));
+  const Code& stub = Code::Handle(Code::FinalizeCode(
+      name, nullptr, &assembler, Code::PoolAttachment::kNotAttachPool,
+      /*optimized=*/false));
+
+  if (pool == nullptr) {
+    const ObjectPool& object_pool =
+        ObjectPool::Handle(object_pool_wrapper.MakeObjectPool());
+    stub.set_object_pool(object_pool.raw());
+  }
+
 #ifndef PRODUCT
   if (FLAG_support_disassembler && FLAG_disassemble_stubs) {
     LogBlock lb;
@@ -241,7 +263,9 @@
     stub.Disassemble(&formatter);
     THR_Print("}\n");
     const ObjectPool& object_pool = ObjectPool::Handle(stub.object_pool());
-    object_pool.DebugPrint();
+    if (!object_pool.IsNull()) {
+      object_pool.DebugPrint();
+    }
   }
 #endif  // !PRODUCT
   return stub.raw();
@@ -252,35 +276,34 @@
 }
 #endif  // !defined(TARGET_ARCH_DBC)
 
-const StubEntry* StubCode::UnoptimizedStaticCallEntry(
-    intptr_t num_args_tested) {
+const Code& StubCode::UnoptimizedStaticCallEntry(intptr_t num_args_tested) {
 // These stubs are not used by DBC.
 #if !defined(TARGET_ARCH_DBC)
   switch (num_args_tested) {
     case 0:
-      return ZeroArgsUnoptimizedStaticCall_entry();
+      return ZeroArgsUnoptimizedStaticCall();
     case 1:
-      return OneArgUnoptimizedStaticCall_entry();
+      return OneArgUnoptimizedStaticCall();
     case 2:
-      return TwoArgsUnoptimizedStaticCall_entry();
+      return TwoArgsUnoptimizedStaticCall();
     default:
       UNIMPLEMENTED();
-      return NULL;
+      return Code::Handle();
   }
 #else
-  return NULL;
+  return Code::Handle();
 #endif
 }
 
 const char* StubCode::NameOfStub(uword entry_point) {
 #define VM_STUB_CODE_TESTER(name)                                              \
-  if ((name##_entry() != NULL) &&                                              \
-      (entry_point == name##_entry()->EntryPoint())) {                         \
+  if (entries_[k##name##Index] != nullptr &&                                   \
+      entries_[k##name##Index]->EntryPoint() == entry_point) {                 \
     return "" #name;                                                           \
   }
   VM_STUB_CODE_LIST(VM_STUB_CODE_TESTER);
 #undef VM_STUB_CODE_TESTER
-  return NULL;
+  return nullptr;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index cd336be..fe2fcbe 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -14,6 +14,7 @@
 class Code;
 class Isolate;
 class ObjectPointerVisitor;
+class ObjectPoolWrapper;
 class RawCode;
 class SnapshotReader;
 class SnapshotWriter;
@@ -28,6 +29,7 @@
   V(DeoptForRewind)                                                            \
   V(WriteBarrier)                                                              \
   V(WriteBarrierWrappers)                                                      \
+  V(ArrayWriteBarrier)                                                         \
   V(PrintStopMessage)                                                          \
   V(AllocateArray)                                                             \
   V(AllocateContext)                                                           \
@@ -117,32 +119,6 @@
 // using Smi 0 instead of Object::null() is slightly more efficient, since a Smi
 // does not require relocation.
 
-// class StubEntry is used to describe stub methods generated in dart to
-// abstract out common code executed from generated dart code.
-class StubEntry {
- public:
-  explicit StubEntry(const Code& code);
-  ~StubEntry() {}
-
-  const ExternalLabel& label() const { return label_; }
-  uword EntryPoint() const { return entry_point_; }
-  uword MonomorphicEntryPoint() const { return monomorphic_entry_point_; }
-  RawCode* code() const { return code_; }
-  intptr_t Size() const { return size_; }
-
-  // Visit all object pointers.
-  void VisitObjectPointers(ObjectPointerVisitor* visitor);
-
- private:
-  RawCode* code_;
-  uword entry_point_;
-  uword monomorphic_entry_point_;
-  intptr_t size_;
-  ExternalLabel label_;
-
-  DISALLOW_COPY_AND_ASSIGN(StubEntry);
-};
-
 // class StubCode is used to maintain the lifecycle of stubs.
 class StubCode : public AllStatic {
  public:
@@ -168,25 +144,27 @@
 
 // Define the shared stub code accessors.
 #define STUB_CODE_ACCESSOR(name)                                               \
-  static const StubEntry* name##_entry() { return entries_[k##name##Index]; }  \
-  static intptr_t name##Size() { return name##_entry()->Size(); }
+  static const Code& name() { return *entries_[k##name##Index]; }              \
+  static intptr_t name##Size() { return name().Size(); }
   VM_STUB_CODE_LIST(STUB_CODE_ACCESSOR);
 #undef STUB_CODE_ACCESSOR
 
   static RawCode* GetAllocationStubForClass(const Class& cls);
 
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
-  static RawCode* GetBuildMethodExtractorStub();
+  static RawCode* GetBuildMethodExtractorStub(ObjectPoolWrapper* pool);
   static void GenerateBuildMethodExtractorStub(Assembler* assembler);
 #endif
 
-  static const StubEntry* UnoptimizedStaticCallEntry(intptr_t num_args_tested);
+  static const Code& UnoptimizedStaticCallEntry(intptr_t num_args_tested);
 
   static const intptr_t kNoInstantiator = 0;
   static const intptr_t kInstantiationSizeInWords = 3;
 
-  static StubEntry* EntryAt(intptr_t index) { return entries_[index]; }
-  static void EntryAtPut(intptr_t index, StubEntry* entry) {
+  static const Code& EntryAt(intptr_t index) { return *entries_[index]; }
+  static void EntryAtPut(intptr_t index, Code* entry) {
+    ASSERT(entry->IsReadOnlyHandle());
+    ASSERT(entries_[index] == nullptr);
     entries_[index] = entry;
   }
   static intptr_t NumEntries() { return kNumStubEntries; }
@@ -194,8 +172,6 @@
  private:
   friend class MegamorphicCacheTable;
 
-  static const intptr_t kStubCodeSize = 4 * KB;
-
   enum {
 #define STUB_CODE_ENTRY(name) k##name##Index,
     VM_STUB_CODE_LIST(STUB_CODE_ENTRY)
@@ -203,7 +179,7 @@
         kNumStubEntries
   };
 
-  static StubEntry* entries_[kNumStubEntries];
+  static Code* entries_[kNumStubEntries];
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 #define STUB_CODE_GENERATE(name)                                               \
@@ -214,6 +190,7 @@
   // Generate the stub and finalize the generated code into the stub
   // code executable area.
   static RawCode* Generate(const char* name,
+                           ObjectPoolWrapper* object_pool_wrapper,
                            void (*GenerateStub)(Assembler* assembler));
 
   static void GenerateSharedStub(Assembler* assembler,
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 7b08bf6..6709e31 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -29,7 +29,7 @@
             use_slow_path,
             false,
             "Set to true for debugging & verifying the slow paths.");
-DECLARE_FLAG(bool, trace_optimized_ic_calls);
+DECLARE_FLAG(bool, precompiled_mode);
 
 // Input parameters:
 //   LR : return address.
@@ -56,7 +56,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartTagId);
+    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -95,13 +95,19 @@
   __ blx(R9);
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(kWord, R2, THR, Thread::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
   __ StoreToOffset(kWord, R2, THR, Thread::top_exit_frame_info_offset());
 
+  // Restore the global object pool after returning from runtime (old space is
+  // moving, so the GOP could have been relocated).
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
+  }
+
   __ LeaveStubFrame();
 
   // The following return can jump to a lazy-deopt stub, which assumes R0
@@ -118,50 +124,25 @@
                                   const RuntimeEntry* target,
                                   intptr_t self_code_stub_offset_from_thread,
                                   bool allow_return) {
-  __ Push(LR);
-
   // We want the saved registers to appear like part of the caller's frame, so
   // we push them before calling EnterStubFrame.
   RegisterSet all_registers;
   all_registers.AddAllNonReservedRegisters(save_fpu_registers);
+
+  // To make the stack map calculation architecture independent we do the same
+  // as on intel.
+  __ Push(LR);
+
   __ PushRegisters(all_registers);
-
-  const intptr_t kSavedCpuRegisterSlots =
-      Utils::CountOneBitsWord(kDartAvailableCpuRegs);
-
-  const intptr_t kSavedFpuRegisterSlots =
-      save_fpu_registers ? kNumberOfFpuRegisters * kFpuRegisterSize / kWordSize
-                         : 0;
-
-  const intptr_t kAllSavedRegistersSlots =
-      kSavedCpuRegisterSlots + kSavedFpuRegisterSlots;
-
-  // Copy down the return address so the stack layout is correct.
-  __ ldr(TMP, Address(SPREG, kAllSavedRegistersSlots * kWordSize));
-  __ Push(TMP);
-
   __ ldr(CODE_REG, Address(THR, self_code_stub_offset_from_thread));
-
   __ EnterStubFrame();
-
-  __ ldr(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
-  __ ldr(R9, Address(THR, Thread::OffsetFromThread(target)));
-  __ mov(R4, Operand(/*argument_count=*/0));
-  __ ldr(TMP, Address(THR, Thread::call_to_runtime_entry_point_offset()));
-  __ blx(TMP);
-
+  __ CallRuntime(*target, /*argument_count=*/0);
   if (!allow_return) {
     __ Breakpoint();
     return;
   }
   __ LeaveStubFrame();
-
-  // Drop "official" return address -- we can just use the one stored above the
-  // saved registers.
-  __ Drop(1);
-
   __ PopRegisters(all_registers);
-
   __ Pop(LR);
   __ bx(LR);
 }
@@ -181,8 +162,7 @@
 
   const intptr_t kReceiverOffset = compiler_frame_layout.param_end_from_fp + 1;
 
-  const auto& context_allocation_stub =
-      Code::ZoneHandle(StubCode::AllocateContext_entry()->code());
+  const auto& context_allocation_stub = StubCode::AllocateContext();
 
   __ EnterStubFrame();
 
@@ -312,7 +292,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartTagId);
+    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -359,7 +339,7 @@
   __ blx(LR);
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(kWord, R2, THR, Thread::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
@@ -405,7 +385,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(kWord, R8, THR, Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartTagId);
+    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -449,7 +429,7 @@
   __ blx(R9);
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(kWord, R2, THR, Thread::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
@@ -532,7 +512,7 @@
   __ LoadObject(R1, Object::null_object());
   // R1: null element type for raw Array.
   // R2: smi-tagged argument count, may be zero.
-  __ BranchLink(*StubCode::AllocateArray_entry());
+  __ BranchLink(StubCode::AllocateArray());
   // R0: newly allocated array.
   // R2: smi-tagged argument count, may be zero (was preserved by the stub).
   __ Push(R0);  // Array is in R0 and on top of stack.
@@ -940,7 +920,7 @@
 //   R2 : arguments array.
 //   R3 : current thread.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
-  // Save frame pointer coming in.
+  __ Push(LR);  // Marker for the profiler.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
   // Push code object to PC marker slot.
@@ -968,10 +948,6 @@
   __ LoadFromOffset(kWord, R9, THR, Thread::vm_tag_offset());
   __ Push(R9);
 
-  // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R9, VMTag::kDartTagId);
-  __ StoreToOffset(kWord, R9, THR, Thread::vm_tag_offset());
-
   // Save top resource and top exit frame info. Use R4-6 as temporary registers.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ LoadFromOffset(kWord, R9, THR, Thread::top_exit_frame_info_offset());
@@ -989,6 +965,11 @@
 #endif
   __ Push(R9);
 
+  // Mark that the thread is executing Dart code. Do this after initializing the
+  // exit link for the profiler.
+  __ LoadImmediate(R9, VMTag::kDartCompiledTagId);
+  __ StoreToOffset(kWord, R9, THR, Thread::vm_tag_offset());
+
   // Load arguments descriptor array into R4, which is passed to Dart code.
   __ ldr(R4, Address(R1, VMHandles::kOffsetOfRawPtrInHandle));
 
@@ -1019,7 +1000,11 @@
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  __ LoadImmediate(PP, 0);  // GC safe value into PP.
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
+  } else {
+    __ LoadImmediate(PP, 0);  // GC safe value into PP.
+  }
   __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle));
   __ ldr(R0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ blx(R0);  // R4 is the arguments descriptor array.
@@ -1051,6 +1036,7 @@
 
   // Restore the frame pointer and return.
   __ LeaveFrame((1 << FP) | (1 << LR));
+  __ Drop(1);
   __ Ret();
 }
 
@@ -1203,28 +1189,33 @@
 // Input parameters:
 //   R1: Object (old)
 //   R0: Value (old or new)
+//   R9: Slot
 // If R0 is new, add R1 to the store buffer. Otherwise R0 is old, mark R0
 // and add it to the mark list.
 COMPILE_ASSERT(kWriteBarrierObjectReg == R1);
 COMPILE_ASSERT(kWriteBarrierValueReg == R0);
-void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
-#if defined(CONCURRENT_MARKING)
-  Label add_to_mark_stack;
+COMPILE_ASSERT(kWriteBarrierSlotReg == R9);
+static void GenerateWriteBarrierStubHelper(Assembler* assembler,
+                                           Address stub_code,
+                                           bool cards) {
+  Label add_to_mark_stack, remember_card;
   __ tst(R0, Operand(1 << kNewObjectBitPosition));
   __ b(&add_to_mark_stack, ZERO);
-#else
-  Label add_to_buffer;
-  // Check whether this object has already been remembered. Skip adding to the
-  // store buffer if the object is in the store buffer already.
-  // Spilled: R2, R3, R4
-  // R1: Address being stored
-  __ ldr(TMP, FieldAddress(R1, Object::tags_offset()));
-  __ tst(TMP, Operand(1 << RawObject::kOldAndNotRememberedBit));
-  __ b(&add_to_buffer, NE);
-  __ Ret();
 
-  __ Bind(&add_to_buffer);
+  if (cards) {
+    __ ldr(TMP, FieldAddress(R1, Object::tags_offset()));
+    __ tst(TMP, Operand(1 << RawObject::kCardRememberedBit));
+    __ b(&remember_card, NOT_ZERO);
+  } else {
+#if defined(DEBUG)
+    Label ok;
+    __ ldr(TMP, FieldAddress(R1, Object::tags_offset()));
+    __ tst(TMP, Operand(1 << RawObject::kCardRememberedBit));
+    __ b(&ok, ZERO);
+    __ Stop("Wrong barrier");
+    __ Bind(&ok);
 #endif
+  }
 
   // Save values being destroyed.
   __ PushList((1 << R2) | (1 << R3) | (1 << R4));
@@ -1275,7 +1266,7 @@
   // Setup frame, push callee-saved registers.
 
   __ Push(CODE_REG);
-  __ ldr(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ ldr(CODE_REG, stub_code);
   __ EnterCallRuntimeFrame(0 * kWordSize);
   __ mov(R0, Operand(THR));
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
@@ -1284,7 +1275,6 @@
   __ Pop(CODE_REG);
   __ Ret();
 
-#if defined(CONCURRENT_MARKING)
   __ Bind(&add_to_mark_stack);
   __ PushList((1 << R2) | (1 << R3) | (1 << R4));  // Spill.
 
@@ -1325,7 +1315,7 @@
 
   __ Bind(&marking_overflow);
   __ Push(CODE_REG);
-  __ ldr(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ ldr(CODE_REG, stub_code);
   __ EnterCallRuntimeFrame(0 * kWordSize);
   __ mov(R0, Operand(THR));
   __ CallRuntime(kMarkingStackBlockProcessRuntimeEntry, 1);
@@ -1336,7 +1326,53 @@
   __ Bind(&lost_race);
   __ PopList((1 << R2) | (1 << R3) | (1 << R4));  // Unspill.
   __ Ret();
-#endif
+
+  if (cards) {
+    Label remember_card_slow;
+
+    // Get card table.
+    __ Bind(&remember_card);
+    __ AndImmediate(TMP, R1, kPageMask);                       // HeapPage.
+    __ ldr(TMP, Address(TMP, HeapPage::card_table_offset()));  // Card table.
+    __ cmp(TMP, Operand(0));
+    __ b(&remember_card_slow, EQ);
+
+    // Dirty the card.
+    __ AndImmediate(TMP, R1, kPageMask);  // HeapPage.
+    __ sub(R9, R9, Operand(TMP));         // Offset in page.
+    __ ldr(TMP, Address(TMP, HeapPage::card_table_offset()));  // Card table.
+    __ add(TMP, TMP,
+           Operand(R9, LSR, HeapPage::kBytesPerCardLog2));  // Card address.
+    __ strb(R1,
+            Address(TMP, 0));  // Low byte of R0 is non-zero from object tag.
+    __ Ret();
+
+    // Card table not yet allocated.
+    __ Bind(&remember_card_slow);
+    __ Push(CODE_REG);
+    __ Push(R0);
+    __ Push(R1);
+    __ ldr(CODE_REG, stub_code);
+    __ mov(R0, Operand(R1));  // Arg0 = Object
+    __ mov(R1, Operand(R9));  // Arg1 = Slot
+    __ EnterCallRuntimeFrame(0);
+    __ CallRuntime(kRememberCardRuntimeEntry, 2);
+    __ LeaveCallRuntimeFrame();
+    __ Pop(R1);
+    __ Pop(R0);
+    __ Pop(CODE_REG);
+    __ Ret();
+  }
+}
+
+void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
+  GenerateWriteBarrierStubHelper(
+      assembler, Address(THR, Thread::write_barrier_code_offset()), false);
+}
+
+void StubCode::GenerateArrayWriteBarrierStub(Assembler* assembler) {
+  GenerateWriteBarrierStubHelper(
+      assembler, Address(THR, Thread::array_write_barrier_code_offset()), true);
 }
 
 // Called for inline allocation of objects.
@@ -2349,7 +2385,7 @@
   __ Bind(&is_simple_case);
   {
     __ PushList(kRegsToSave);
-    __ BranchLink(*StubCode::Subtype2TestCache_entry());
+    __ BranchLink(StubCode::Subtype2TestCache());
     __ CompareObject(R1, Bool::True());
     __ PopList(kRegsToSave);
     __ BranchIf(EQUAL, &done);  // Cache said: yes.
@@ -2359,7 +2395,7 @@
   __ Bind(&is_complex_case);
   {
     __ PushList(kRegsToSave);
-    __ BranchLink(*StubCode::Subtype6TestCache_entry());
+    __ BranchLink(StubCode::Subtype6TestCache());
     __ CompareObject(R1, Bool::True());
     __ PopList(kRegsToSave);
     __ BranchIf(EQUAL, &done);  // Cache said: yes.
@@ -2409,14 +2445,19 @@
   __ mov(FP, Operand(R2));   // Frame_pointer.
   __ mov(SP, Operand(IP));   // Set Stack pointer.
   // Set the tag.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(kWord, R2, THR, Thread::vm_tag_offset());
   // Clear top exit frame.
   __ LoadImmediate(R2, 0);
   __ StoreToOffset(kWord, R2, THR, Thread::top_exit_frame_info_offset());
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  __ LoadPoolPointer();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
+    __ set_constant_pool_allowed(true);
+  } else {
+    __ LoadPoolPointer();
+  }
   __ bx(LR);  // Jump to continuation point.
 }
 
@@ -2620,10 +2661,18 @@
   // proper target for the given name and arguments descriptor.  If the
   // illegal class id was found, the target is a cache miss handler that can
   // be invoked as a normal Dart function.
-  __ ldr(R0, FieldAddress(IP, base + kWordSize));
-  __ ldr(R4, FieldAddress(R9, MegamorphicCache::arguments_descriptor_offset()));
-  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
-  __ Branch(FieldAddress(R0, Function::entry_point_offset()));
+  const auto target_address = FieldAddress(IP, base + kWordSize);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(ARGS_DESC_REG,
+           FieldAddress(R9, MegamorphicCache::arguments_descriptor_offset()));
+    __ Branch(target_address);
+  } else {
+    __ ldr(R0, target_address);
+    __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
+    __ ldr(ARGS_DESC_REG,
+           FieldAddress(R9, MegamorphicCache::arguments_descriptor_offset()));
+    __ Branch(FieldAddress(R0, Function::entry_point_offset()));
+  }
 
   // Probe failed, check if it is a miss.
   __ Bind(&probe_failed);
@@ -2644,7 +2693,8 @@
 //  R4: arguments descriptor
 void StubCode::GenerateICCallThroughFunctionStub(Assembler* assembler) {
   Label loop, found, miss;
-  __ ldr(R4, FieldAddress(R9, ICData::arguments_descriptor_offset()));
+  __ ldr(ARGS_DESC_REG,
+         FieldAddress(R9, ICData::arguments_descriptor_offset()));
   __ ldr(R8, FieldAddress(R9, ICData::ic_data_offset()));
   __ AddImmediate(R8, Array::data_offset() - kHeapObjectTag);
   // R8: first IC entry
@@ -2677,8 +2727,8 @@
 
 void StubCode::GenerateICCallThroughCodeStub(Assembler* assembler) {
   Label loop, found, miss;
-  __ ldr(R4, FieldAddress(R9, ICData::arguments_descriptor_offset()));
   __ ldr(R8, FieldAddress(R9, ICData::ic_data_offset()));
+  __ ldr(R4, FieldAddress(R9, ICData::arguments_descriptor_offset()));
   __ AddImmediate(R8, Array::data_offset() - kHeapObjectTag);
   // R8: first IC entry
   __ LoadTaggedClassIdMayBeSmi(R1, R0);
@@ -2699,7 +2749,9 @@
   __ Bind(&found);
   const intptr_t code_offset = ICData::CodeIndexFor(1) * kWordSize;
   const intptr_t entry_offset = ICData::EntryPointIndexFor(1) * kWordSize;
-  __ ldr(CODE_REG, Address(R8, code_offset));
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    __ ldr(CODE_REG, Address(R8, code_offset));
+  }
   __ Branch(Address(R8, entry_offset));
 
   __ Bind(&miss);
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 2bf5573..182a355f 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -27,8 +27,8 @@
             use_slow_path,
             false,
             "Set to true for debugging & verifying the slow paths.");
-DECLARE_FLAG(bool, trace_optimized_ic_calls);
 DECLARE_FLAG(bool, enable_interpreter);
+DECLARE_FLAG(bool, precompiled_mode);
 
 // Input parameters:
 //   LR : return address.
@@ -57,7 +57,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R8, THR, Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartTagId);
+    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -119,12 +119,19 @@
 
   // Retval is next to 1st argument.
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(R2, THR, Thread::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
   __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset());
 
+  // Restore the global object pool after returning from runtime (old space is
+  // moving, so the GOP could have been relocated).
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
+    __ sub(PP, PP, Operand(kHeapObjectTag));  // Pool in PP is untagged!
+  }
+
   __ LeaveStubFrame();
 
   // The following return can jump to a lazy-deopt stub, which assumes R0
@@ -141,50 +148,24 @@
                                   const RuntimeEntry* target,
                                   intptr_t self_code_stub_offset_from_thread,
                                   bool allow_return) {
-  __ Push(LR);
-
   // We want the saved registers to appear like part of the caller's frame, so
   // we push them before calling EnterStubFrame.
   RegisterSet all_registers;
   all_registers.AddAllNonReservedRegisters(save_fpu_registers);
+
+  // To make the stack map calculation architecture independent we do the same
+  // as on intel.
+  __ Push(LR);
   __ PushRegisters(all_registers);
-
-  const intptr_t kSavedCpuRegisterSlots =
-      Utils::CountOneBitsWord(kDartAvailableCpuRegs);
-
-  const intptr_t kSavedFpuRegisterSlots =
-      save_fpu_registers ? kNumberOfFpuRegisters * kFpuRegisterSize / kWordSize
-                         : 0;
-
-  const intptr_t kAllSavedRegistersSlots =
-      kSavedCpuRegisterSlots + kSavedFpuRegisterSlots;
-
-  // Copy down the return address so the stack layout is correct.
-  __ ldr(TMP, Address(SPREG, kAllSavedRegistersSlots * kWordSize));
-  __ Push(TMP);
-
   __ ldr(CODE_REG, Address(THR, self_code_stub_offset_from_thread));
-
   __ EnterStubFrame();
-
-  __ ldr(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
-  __ ldr(R5, Address(THR, Thread::OffsetFromThread(target)));
-  __ LoadImmediate(R4, /*argument_count=*/0);
-  __ ldr(TMP, Address(THR, Thread::call_to_runtime_entry_point_offset()));
-  __ blr(TMP);
-
+  __ CallRuntime(*target, /*argument_count=*/0);
   if (!allow_return) {
     __ Breakpoint();
     return;
   }
   __ LeaveStubFrame();
-
-  // Drop "official" return address -- we can just use the one stored above the
-  // saved registers.
-  __ Drop(1);
-
   __ PopRegisters(all_registers);
-
   __ Pop(LR);
   __ ret(LR);
 }
@@ -203,8 +184,7 @@
 
   const intptr_t kReceiverOffset = compiler_frame_layout.param_end_from_fp + 1;
 
-  const auto& context_allocation_stub =
-      Code::ZoneHandle(StubCode::AllocateContext_entry()->code());
+  const auto& context_allocation_stub = StubCode::AllocateContext();
 
   __ EnterStubFrame();
 
@@ -330,7 +310,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R6, THR, Thread::vm_tag_offset());
-    __ CompareImmediate(R6, VMTag::kDartTagId);
+    __ CompareImmediate(R6, VMTag::kDartCompiledTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -393,7 +373,7 @@
   __ ldr(BARRIER_MASK, Address(THR, Thread::write_barrier_mask_offset()));
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(R2, THR, Thread::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
@@ -438,7 +418,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R6, THR, Thread::vm_tag_offset());
-    __ CompareImmediate(R6, VMTag::kDartTagId);
+    __ CompareImmediate(R6, VMTag::kDartCompiledTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -498,7 +478,7 @@
   __ ldr(BARRIER_MASK, Address(THR, Thread::write_barrier_mask_offset()));
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(R2, THR, Thread::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
@@ -581,7 +561,7 @@
   __ LoadObject(R1, Object::null_object());
   // R1: null element type for raw Array.
   // R2: smi-tagged argument count, may be zero.
-  __ BranchLink(*StubCode::AllocateArray_entry());
+  __ BranchLink(StubCode::AllocateArray());
   // R0: newly allocated array.
   // R2: smi-tagged argument count, may be zero (was preserved by the stub).
   __ Push(R0);  // Array is in R0 and on top of stack.
@@ -1017,6 +997,7 @@
   // Copy the C stack pointer (R31) into the stack pointer we'll actually use
   // to access the stack.
   __ SetupDartSP();
+  __ Push(LR);  // Marker for the profiler.
   __ EnterFrame(0);
 
   // Push code object to PC marker slot.
@@ -1049,10 +1030,6 @@
   __ LoadFromOffset(R4, THR, Thread::vm_tag_offset());
   __ Push(R4);
 
-  // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R6, VMTag::kDartTagId);
-  __ StoreToOffset(R6, THR, Thread::vm_tag_offset());
-
   // Save top resource and top exit frame info. Use R6 as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ LoadFromOffset(R6, THR, Thread::top_resource_offset());
@@ -1064,6 +1041,11 @@
   ASSERT(kExitLinkSlotFromEntryFp == -22);
   __ Push(R6);
 
+  // Mark that the thread is executing Dart code. Do this after initializing the
+  // exit link for the profiler.
+  __ LoadImmediate(R6, VMTag::kDartCompiledTagId);
+  __ StoreToOffset(R6, THR, Thread::vm_tag_offset());
+
   // Load arguments descriptor array into R4, which is passed to Dart code.
   __ LoadFromOffset(R4, R1, VMHandles::kOffsetOfRawPtrInHandle);
 
@@ -1094,10 +1076,15 @@
   __ b(&push_arguments, LT);
   __ Bind(&done_push_arguments);
 
-  // We now load the pool pointer(PP) with a GC safe value as we are about to
-  // invoke dart code. We don't need a real object pool here.
-  // Smi zero does not work because ARM64 assumes PP to be untagged.
-  __ LoadObject(PP, Object::null_object());
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
+    __ sub(PP, PP, Operand(kHeapObjectTag));  // Pool in PP is untagged!
+  } else {
+    // We now load the pool pointer(PP) with a GC safe value as we are about to
+    // invoke dart code. We don't need a real object pool here.
+    // Smi zero does not work because ARM64 assumes PP to be untagged.
+    __ LoadObject(PP, Object::null_object());
+  }
 
   // Call the Dart code entrypoint.
   __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle));
@@ -1137,6 +1124,7 @@
 
   // Restore the frame pointer and C stack pointer and return.
   __ LeaveFrame();
+  __ Drop(1);
   __ RestoreCSP();
   __ ret();
 }
@@ -1155,6 +1143,7 @@
   // Copy the C stack pointer (R31) into the stack pointer we'll actually use
   // to access the stack.
   __ SetupDartSP();
+  __ Push(LR);  // Marker for the profiler.
   __ EnterFrame(0);
 
   // Push code object to PC marker slot.
@@ -1188,10 +1177,6 @@
   __ LoadFromOffset(R4, THR, Thread::vm_tag_offset());
   __ Push(R4);
 
-  // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R6, VMTag::kDartTagId);
-  __ StoreToOffset(R6, THR, Thread::vm_tag_offset());
-
   // Save top resource and top exit frame info. Use R6 as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ LoadFromOffset(R6, THR, Thread::top_resource_offset());
@@ -1203,6 +1188,11 @@
   ASSERT(kExitLinkSlotFromEntryFp == -22);
   __ Push(R6);
 
+  // Mark that the thread is executing Dart code. Do this after initializing the
+  // exit link for the profiler.
+  __ LoadImmediate(R6, VMTag::kDartCompiledTagId);
+  __ StoreToOffset(R6, THR, Thread::vm_tag_offset());
+
   // Load arguments descriptor array into R4, which is passed to Dart code.
   __ mov(R4, R1);
 
@@ -1272,6 +1262,7 @@
 
   // Restore the frame pointer and C stack pointer and return.
   __ LeaveFrame();
+  __ Drop(1);
   __ RestoreCSP();
   __ ret();
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
@@ -1411,28 +1402,34 @@
   }
 }
 
-// Helper stub to implement Assembler::StoreIntoObject.
+// Helper stub to implement Assembler::StoreIntoObject/Array.
 // Input parameters:
 //   R1: Object (old)
 //   R0: Value (old or new)
+//  R25: Slot
 // If R0 is new, add R1 to the store buffer. Otherwise R0 is old, mark R0
 // and add it to the mark list.
 COMPILE_ASSERT(kWriteBarrierObjectReg == R1);
 COMPILE_ASSERT(kWriteBarrierValueReg == R0);
-void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
-#if defined(CONCURRENT_MARKING)
-  Label add_to_mark_stack;
+COMPILE_ASSERT(kWriteBarrierSlotReg == R25);
+static void GenerateWriteBarrierStubHelper(Assembler* assembler,
+                                           Address stub_code,
+                                           bool cards) {
+  Label add_to_mark_stack, remember_card;
   __ tbz(&add_to_mark_stack, R0, kNewObjectBitPosition);
-#else
-  Label add_to_buffer;
-  // Check whether this object has already been remembered. Skip adding to the
-  // store buffer if the object is in the store buffer already.
-  __ LoadFieldFromOffset(TMP, R1, Object::tags_offset(), kWord);
-  __ tbnz(&add_to_buffer, TMP, RawObject::kOldAndNotRememberedBit);
-  __ ret();
 
-  __ Bind(&add_to_buffer);
+  if (cards) {
+    __ LoadFieldFromOffset(TMP, R1, Object::tags_offset(), kWord);
+    __ tbnz(&remember_card, TMP, RawObject::kCardRememberedBit);
+  } else {
+#if defined(DEBUG)
+    Label ok;
+    __ LoadFieldFromOffset(TMP, R1, Object::tags_offset(), kWord);
+    __ tbz(&ok, TMP, RawObject::kCardRememberedBit);
+    __ Stop("Wrong barrier");
+    __ Bind(&ok);
 #endif
+  }
 
   // Save values being destroyed.
   __ Push(R2);
@@ -1478,7 +1475,7 @@
   // Setup frame, push callee-saved registers.
 
   __ Push(CODE_REG);
-  __ ldr(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ ldr(CODE_REG, stub_code);
   __ EnterCallRuntimeFrame(0 * kWordSize);
   __ mov(R0, THR);
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
@@ -1487,7 +1484,6 @@
   __ Pop(CODE_REG);
   __ ret();
 
-#if defined(CONCURRENT_MARKING)
   __ Bind(&add_to_mark_stack);
   __ Push(R2);  // Spill.
   __ Push(R3);  // Spill.
@@ -1522,7 +1518,7 @@
 
   __ Bind(&marking_overflow);
   __ Push(CODE_REG);
-  __ ldr(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ ldr(CODE_REG, stub_code);
   __ EnterCallRuntimeFrame(0 * kWordSize);
   __ mov(R0, THR);
   __ CallRuntime(kMarkingStackBlockProcessRuntimeEntry, 1);
@@ -1535,7 +1531,50 @@
   __ Pop(R3);  // Unspill.
   __ Pop(R2);  // Unspill.
   __ ret();
-#endif
+
+  if (cards) {
+    Label remember_card_slow;
+
+    // Get card table.
+    __ Bind(&remember_card);
+    __ AndImmediate(TMP, R1, kPageMask);                       // HeapPage.
+    __ ldr(TMP, Address(TMP, HeapPage::card_table_offset()));  // Card table.
+    __ cbz(&remember_card_slow, TMP);
+
+    // Dirty the card.
+    __ AndImmediate(TMP, R1, kPageMask);  // HeapPage.
+    __ sub(R25, R25, Operand(TMP));       // Offset in page.
+    __ ldr(TMP, Address(TMP, HeapPage::card_table_offset()));  // Card table.
+    __ add(TMP, TMP,
+           Operand(R25, LSR, HeapPage::kBytesPerCardLog2));  // Card address.
+    __ str(R1, Address(TMP, 0),
+           kUnsignedByte);  // Low byte of R1 is non-zero from object tag.
+    __ ret();
+
+    // Card table not yet allocated.
+    __ Bind(&remember_card_slow);
+    __ Push(CODE_REG);
+    __ PushPair(R0, R1);
+    __ ldr(CODE_REG, stub_code);
+    __ mov(R0, R1);   // Arg0 = Object
+    __ mov(R1, R25);  // Arg1 = Slot
+    __ EnterCallRuntimeFrame(0);
+    __ CallRuntime(kRememberCardRuntimeEntry, 2);
+    __ LeaveCallRuntimeFrame();
+    __ PopPair(R0, R1);
+    __ Pop(CODE_REG);
+    __ ret();
+  }
+}
+
+void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
+  GenerateWriteBarrierStubHelper(
+      assembler, Address(THR, Thread::write_barrier_code_offset()), false);
+}
+
+void StubCode::GenerateArrayWriteBarrierStub(Assembler* assembler) {
+  GenerateWriteBarrierStubHelper(
+      assembler, Address(THR, Thread::array_write_barrier_code_offset()), true);
 }
 
 // Called for inline allocation of objects.
@@ -2129,7 +2168,7 @@
     Label ok;
     // Check that we are always entering from Dart code.
     __ LoadFromOffset(R8, THR, Thread::vm_tag_offset());
-    __ CompareImmediate(R8, VMTag::kDartTagId);
+    __ CompareImmediate(R8, VMTag::kDartCompiledTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -2185,7 +2224,7 @@
   __ ldr(BARRIER_MASK, Address(THR, Thread::write_barrier_mask_offset()));
 
   // Mark that the thread is executing Dart code.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(R2, THR, Thread::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
@@ -2617,7 +2656,7 @@
   __ Bind(&is_simple_case);
   {
     __ PushPair(kInstantiatorTypeArgumentsReg, kSubtypeTestCacheReg);
-    __ BranchLink(*StubCode::Subtype2TestCache_entry());
+    __ BranchLink(StubCode::Subtype2TestCache());
     __ CompareObject(R1, Bool::True());
     __ PopPair(kInstantiatorTypeArgumentsReg, kSubtypeTestCacheReg);
     __ BranchIf(EQUAL, &done);  // Cache said: yes.
@@ -2627,7 +2666,7 @@
   __ Bind(&is_complex_case);
   {
     __ PushPair(kInstantiatorTypeArgumentsReg, kSubtypeTestCacheReg);
-    __ BranchLink(*StubCode::Subtype6TestCache_entry());
+    __ BranchLink(StubCode::Subtype6TestCache());
     __ CompareObject(R1, Bool::True());
     __ PopPair(kInstantiatorTypeArgumentsReg, kSubtypeTestCacheReg);
     __ BranchIf(EQUAL, &done);  // Cache said: yes.
@@ -2676,13 +2715,18 @@
   __ mov(THR, R3);
   __ ldr(BARRIER_MASK, Address(THR, Thread::write_barrier_mask_offset()));
   // Set the tag.
-  __ LoadImmediate(R2, VMTag::kDartTagId);
+  __ LoadImmediate(R2, VMTag::kDartCompiledTagId);
   __ StoreToOffset(R2, THR, Thread::vm_tag_offset());
   // Clear top exit frame.
   __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset());
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  __ LoadPoolPointer();
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
+    __ sub(PP, PP, Operand(kHeapObjectTag));  // Pool in PP is untagged!
+  } else {
+    __ LoadPoolPointer();
+  }
   __ ret();  // Jump to continuation point.
 }
 
@@ -2882,10 +2926,18 @@
   // proper target for the given name and arguments descriptor.  If the
   // illegal class id was found, the target is a cache miss handler that can
   // be invoked as a normal Dart function.
-  __ ldr(R0, FieldAddress(TMP, base + kWordSize));
-  __ ldr(R4, FieldAddress(R5, MegamorphicCache::arguments_descriptor_offset()));
-  __ ldr(R1, FieldAddress(R0, Function::entry_point_offset()));
-  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
+  const auto target_address = FieldAddress(TMP, base + kWordSize);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ ldr(R1, target_address);
+    __ ldr(ARGS_DESC_REG,
+           FieldAddress(R5, MegamorphicCache::arguments_descriptor_offset()));
+  } else {
+    __ ldr(R0, target_address);
+    __ ldr(R1, FieldAddress(R0, Function::entry_point_offset()));
+    __ ldr(ARGS_DESC_REG,
+           FieldAddress(R5, MegamorphicCache::arguments_descriptor_offset()));
+    __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
+  }
   __ br(R1);
 
   // Probe failed, check if it is a miss.
@@ -2912,7 +2964,8 @@
 //  R4: arguments descriptor
 void StubCode::GenerateICCallThroughFunctionStub(Assembler* assembler) {
   Label loop, found, miss;
-  __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
+  __ ldr(ARGS_DESC_REG,
+         FieldAddress(R5, ICData::arguments_descriptor_offset()));
   __ ldr(R8, FieldAddress(R5, ICData::ic_data_offset()));
   __ AddImmediate(R8, Array::data_offset() - kHeapObjectTag);
   // R8: first IC entry
@@ -2947,8 +3000,8 @@
 
 void StubCode::GenerateICCallThroughCodeStub(Assembler* assembler) {
   Label loop, found, miss;
-  __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
   __ ldr(R8, FieldAddress(R5, ICData::ic_data_offset()));
+  __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
   __ AddImmediate(R8, Array::data_offset() - kHeapObjectTag);
   // R8: first IC entry
   __ LoadTaggedClassIdMayBeSmi(R1, R0);
@@ -2970,7 +3023,9 @@
   const intptr_t code_offset = ICData::CodeIndexFor(1) * kWordSize;
   const intptr_t entry_offset = ICData::EntryPointIndexFor(1) * kWordSize;
   __ ldr(R1, Address(R8, entry_offset));
-  __ ldr(CODE_REG, Address(R8, code_offset));
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    __ ldr(CODE_REG, Address(R8, code_offset));
+  }
   __ br(R1);
 
   __ Bind(&miss);
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index a194b7c..6d4af28 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -58,8 +58,9 @@
   ObjectPoolWrapper object_pool_wrapper;
   Assembler assembler(&object_pool_wrapper);
   GenerateCallToCallRuntimeStub(&assembler, length);
-  const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler));
+  const Code& code = Code::Handle(
+      Code::FinalizeCode(*CreateFunction("Test_CallRuntimeStubCode"), nullptr,
+                         &assembler, Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -100,7 +101,8 @@
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler));
+      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler,
+      Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Instance& result = Instance::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index 2741204..c1699b7 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -57,8 +57,9 @@
   ObjectPoolWrapper object_pool_wrapper;
   Assembler assembler(&object_pool_wrapper);
   GenerateCallToCallRuntimeStub(&assembler, length);
-  const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler));
+  const Code& code = Code::Handle(
+      Code::FinalizeCode(*CreateFunction("Test_CallRuntimeStubCode"), nullptr,
+                         &assembler, Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -98,7 +99,8 @@
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler));
+      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler,
+      Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Instance& result = Instance::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
diff --git a/runtime/vm/stub_code_dbc.cc b/runtime/vm/stub_code_dbc.cc
index c1fbc5e..fa35e41 100644
--- a/runtime/vm/stub_code_dbc.cc
+++ b/runtime/vm/stub_code_dbc.cc
@@ -27,7 +27,6 @@
             use_slow_path,
             false,
             "Set to true for debugging & verifying the slow paths.");
-DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
   __ Compile();
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index d609e2a..4c59d09 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -27,7 +27,6 @@
             use_slow_path,
             false,
             "Set to true for debugging & verifying the slow paths.");
-DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
 #define INT32_SIZEOF(x) static_cast<int32_t>(sizeof(x))
 
@@ -56,7 +55,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -84,7 +83,7 @@
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
   __ call(ECX);
 
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
 
   // Reset exit frame information in Isolate structure.
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
@@ -161,7 +160,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -192,7 +191,7 @@
   __ movl(Address(ESP, kWordSize), ECX);  // Function to call.
   __ call(wrapper);
 
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
 
   // Reset exit frame information in Isolate structure.
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
@@ -238,7 +237,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+    __ cmpl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -266,7 +265,7 @@
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
   __ call(ECX);
 
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
 
   // Reset exit frame information in Isolate structure.
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
@@ -331,7 +330,7 @@
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movl(ECX, raw_null);  // Null element type for raw Array.
-  __ Call(*StubCode::AllocateArray_entry());
+  __ Call(StubCode::AllocateArray());
   __ SmiUntag(EDX);
   // EAX: newly allocated array.
   // EDX: length of the array (was preserved by the stub).
@@ -733,12 +732,12 @@
 //   ESP + 16 : current thread.
 // Uses EAX, EDX, ECX, EDI as temporary registers.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
-  const intptr_t kTargetCodeOffset = 2 * kWordSize;
-  const intptr_t kArgumentsDescOffset = 3 * kWordSize;
-  const intptr_t kArgumentsOffset = 4 * kWordSize;
-  const intptr_t kThreadOffset = 5 * kWordSize;
+  const intptr_t kTargetCodeOffset = 3 * kWordSize;
+  const intptr_t kArgumentsDescOffset = 4 * kWordSize;
+  const intptr_t kArgumentsOffset = 5 * kWordSize;
+  const intptr_t kThreadOffset = 6 * kWordSize;
 
-  // Save frame pointer coming in.
+  __ pushl(Address(ESP, 0));  // Marker for the profiler.
   __ EnterFrame(0);
 
   // Push code object to PC marker slot.
@@ -757,9 +756,6 @@
   __ movl(ECX, Assembler::VMTagAddress());
   __ pushl(ECX);
 
-  // Mark that the thread is executing Dart code.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
-
   // Save top resource and top exit frame info. Use EDX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ movl(EDX, Address(THR, Thread::top_resource_offset()));
@@ -772,6 +768,10 @@
   __ pushl(EDX);
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
 
+  // Mark that the thread is executing Dart code. Do this after initializing the
+  // exit link for the profiler.
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+
   // Load arguments descriptor array into EDX.
   __ movl(EDX, Address(EBP, kArgumentsDescOffset));
   __ movl(EDX, Address(EDX, VMHandles::kOffsetOfRawPtrInHandle));
@@ -833,6 +833,7 @@
 
   // Restore the frame pointer.
   __ LeaveFrame();
+  __ popl(ECX);
 
   __ ret();
 }
@@ -978,13 +979,19 @@
   __ Breakpoint();
 }
 
-// Helper stub to implement Assembler::StoreIntoObject.
+// Helper stub to implement Assembler::StoreIntoObject/Array.
 // Input parameters:
 //   EDX: Object (old)
+//   EDI: Slot
 // If EDX is not remembered, mark as remembered and add to the store buffer.
 COMPILE_ASSERT(kWriteBarrierObjectReg == EDX);
 COMPILE_ASSERT(kWriteBarrierValueReg == kNoRegister);
-void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
+COMPILE_ASSERT(kWriteBarrierSlotReg == EDI);
+static void GenerateWriteBarrierStubHelper(Assembler* assembler,
+                                           Address stub_code,
+                                           bool cards) {
+  Label remember_card;
+
   // Save values being destroyed.
   __ pushl(EAX);
   __ pushl(ECX);
@@ -1005,6 +1012,21 @@
   // EDX: Address being stored
   // EAX: Current tag value
   __ Bind(&add_to_buffer);
+
+  if (cards) {
+    // Check if this object is using remembered cards.
+    __ testl(EAX, Immediate(1 << RawObject::kCardRememberedBit));
+    __ j(NOT_EQUAL, &remember_card, Assembler::kFarJump);  // Unlikely.
+  } else {
+#if defined(DEBUG)
+    Label ok;
+    __ testl(EAX, Immediate(1 << RawObject::kCardRememberedBit));
+    __ j(ZERO, &ok, Assembler::kFarJump);  // Unlikely.
+    __ Stop("Wrong barrier");
+    __ Bind(&ok);
+#endif
+  }
+
   // lock+andl is an atomic read-modify-write.
   __ lock();
   __ andl(FieldAddress(EDX, Object::tags_offset()),
@@ -1043,6 +1065,48 @@
   // Restore callee-saved registers, tear down frame.
   __ LeaveCallRuntimeFrame();
   __ ret();
+
+  if (cards) {
+    Label remember_card_slow;
+
+    // Get card table.
+    __ Bind(&remember_card);
+    __ movl(EAX, EDX);                   // Object.
+    __ andl(EAX, Immediate(kPageMask));  // HeapPage.
+    __ cmpl(Address(EAX, HeapPage::card_table_offset()), Immediate(0));
+    __ j(EQUAL, &remember_card_slow, Assembler::kNearJump);
+
+    // Dirty the card.
+    __ subl(EDI, EAX);  // Offset in page.
+    __ movl(EAX, Address(EAX, HeapPage::card_table_offset()));  // Card table.
+    __ shrl(EDI,
+            Immediate(HeapPage::kBytesPerCardLog2));  // Index in card table.
+    __ movb(Address(EAX, EDI, TIMES_1, 0), Immediate(1));
+    __ popl(ECX);
+    __ popl(EAX);
+    __ ret();
+
+    // Card table not yet allocated.
+    __ Bind(&remember_card_slow);
+    __ EnterCallRuntimeFrame(2 * kWordSize);
+    __ movl(Address(ESP, 0 * kWordSize), EDX);  // Object
+    __ movl(Address(ESP, 1 * kWordSize), EDI);  // Slot
+    __ CallRuntime(kRememberCardRuntimeEntry, 2);
+    __ LeaveCallRuntimeFrame();
+    __ popl(ECX);
+    __ popl(EAX);
+    __ ret();
+  }
+}
+
+void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
+  GenerateWriteBarrierStubHelper(
+      assembler, Address(THR, Thread::write_barrier_code_offset()), false);
+}
+
+void StubCode::GenerateArrayWriteBarrierStub(Assembler* assembler) {
+  GenerateWriteBarrierStubHelper(
+      assembler, Address(THR, Thread::array_write_barrier_code_offset()), true);
 }
 
 // Called for inline allocation of objects.
@@ -1949,7 +2013,7 @@
   __ movl(EBX, Address(ESP, 1 * kWordSize));  // Load target PC into EBX.
   __ movl(ESP, Address(ESP, 2 * kWordSize));  // Load target stack_pointer.
   // Set tag.
-  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
   // Clear top exit frame.
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
   __ jmp(EBX);  // Jump to the exception handler code.
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index a4b5d5e..94bac2e 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -57,8 +57,9 @@
   const char* kName = "Test_CallRuntimeStubCode";
   Assembler assembler(nullptr);
   GenerateCallToCallRuntimeStub(&assembler, length);
-  const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler));
+  const Code& code = Code::Handle(
+      Code::FinalizeCode(*CreateFunction("Test_CallRuntimeStubCode"), nullptr,
+                         &assembler, Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -102,7 +103,8 @@
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler));
+      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler,
+      Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Instance& result = Instance::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 0839632..bcc2198 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -32,8 +32,8 @@
             use_slow_path,
             false,
             "Set to true for debugging & verifying the slow paths.");
-DECLARE_FLAG(bool, trace_optimized_ic_calls);
 DECLARE_FLAG(bool, enable_interpreter);
+DECLARE_FLAG(bool, precompiled_mode);
 
 // Input parameters:
 //   RSP : points to return address.
@@ -60,7 +60,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ movq(RAX, Immediate(VMTag::kDartTagId));
+    __ movq(RAX, Immediate(VMTag::kDartCompiledTagId));
     __ cmpq(RAX, Assembler::VMTagAddress());
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
@@ -94,11 +94,17 @@
   __ CallCFunction(RBX);
 
   // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
 
   // Reset exit frame information in Isolate structure.
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
 
+  // Restore the global object pool after returning from runtime (old space is
+  // moving, so the GOP could have been relocated).
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ movq(PP, Address(THR, Thread::global_object_pool_offset()));
+  }
+
   __ LeaveStubFrame();
 
   // The following return can jump to a lazy-deopt stub, which assumes RAX
@@ -136,12 +142,7 @@
   __ movq(CODE_REG, Address(THR, self_code_stub_offset_from_thread));
 
   __ EnterStubFrame();
-
-  __ movq(CODE_REG, Address(THR, Thread::call_to_runtime_stub_offset()));
-  __ movq(RBX, Address(THR, Thread::OffsetFromThread(target)));
-  __ movq(R10, Immediate(/*argument_count=*/0));
-  __ call(Address(THR, Thread::call_to_runtime_entry_point_offset()));
-
+  __ CallRuntime(*target, /*argument_count=*/0);
   if (!allow_return) {
     __ Breakpoint();
     return;
@@ -172,8 +173,7 @@
 
   const intptr_t kReceiverOffset = compiler_frame_layout.param_end_from_fp + 1;
 
-  const auto& context_allocation_stub =
-      Code::ZoneHandle(StubCode::AllocateContext_entry()->code());
+  const auto& context_allocation_stub = StubCode::AllocateContext();
 
   __ EnterStubFrame();
 
@@ -315,7 +315,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ movq(R8, Immediate(VMTag::kDartTagId));
+    __ movq(R8, Immediate(VMTag::kDartCompiledTagId));
     __ cmpq(R8, Assembler::VMTagAddress());
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
@@ -350,7 +350,7 @@
   __ CallCFunction(RAX);
 
   // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
 
   // Reset exit frame information in Isolate structure.
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
@@ -398,7 +398,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ movq(R8, Immediate(VMTag::kDartTagId));
+    __ movq(R8, Immediate(VMTag::kDartCompiledTagId));
     __ cmpq(R8, Assembler::VMTagAddress());
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
@@ -429,7 +429,7 @@
   __ CallCFunction(RBX);
 
   // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
 
   // Reset exit frame information in Isolate structure.
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
@@ -501,7 +501,7 @@
   __ LoadObject(R12, Object::null_object());
   // Allocate array to store arguments of caller.
   __ movq(RBX, R12);  // Null element type for raw Array.
-  __ Call(*StubCode::AllocateArray_entry());
+  __ Call(StubCode::AllocateArray());
   __ SmiUntag(R10);
   // RAX: newly allocated array.
   // R10: length of the array (was preserved by the stub).
@@ -928,7 +928,7 @@
 //   RDX : arguments array.
 //   RCX : current thread.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
-  // Save frame pointer coming in.
+  __ pushq(Address(RSP, 0));  // Marker for the profiler.
   __ EnterFrame(0);
 
   const Register kTargetCodeReg = CallingConventions::kArg1Reg;
@@ -965,9 +965,6 @@
   __ movq(RAX, Assembler::VMTagAddress());
   __ pushq(RAX);
 
-  // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
-
   // Save top resource and top exit frame info. Use RAX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ movq(RAX, Address(THR, Thread::top_resource_offset()));
@@ -991,6 +988,10 @@
 
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
 
+  // Mark that the thread is executing Dart code. Do this after initializing the
+  // exit link for the profiler.
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+
   // Load arguments descriptor array into R10, which is passed to Dart code.
   __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
 
@@ -1026,7 +1027,11 @@
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  __ xorq(PP, PP);  // GC-safe value into PP.
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ movq(PP, Address(THR, Thread::global_object_pool_offset()));
+  } else {
+    __ xorq(PP, PP);  // GC-safe value into PP.
+  }
   __ movq(CODE_REG,
           Address(kTargetCodeReg, VMHandles::kOffsetOfRawPtrInHandle));
   __ movq(kTargetCodeReg, FieldAddress(CODE_REG, Code::entry_point_offset()));
@@ -1053,6 +1058,7 @@
 
   // Restore the frame pointer.
   __ LeaveFrame();
+  __ popq(RCX);
 
   __ ret();
 }
@@ -1068,7 +1074,7 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   __ Stop("Not using interpreter");
 #else
-  // Save frame pointer coming in.
+  __ pushq(Address(RSP, 0));  // Marker for the profiler.
   __ EnterFrame(0);
 
   const Register kTargetCodeReg = CallingConventions::kArg1Reg;
@@ -1106,9 +1112,6 @@
   __ movq(RAX, Assembler::VMTagAddress());
   __ pushq(RAX);
 
-  // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
-
   // Save top resource and top exit frame info. Use RAX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ movq(RAX, Address(THR, Thread::top_resource_offset()));
@@ -1131,6 +1134,10 @@
   }
 #endif
 
+  // Mark that the thread is executing Dart code. Do this after initializing the
+  // exit link for the profiler.
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+
   // Load arguments descriptor array into R10, which is passed to Dart code.
   __ movq(R10, kArgDescReg);
 
@@ -1193,6 +1200,7 @@
 
   // Restore the frame pointer.
   __ LeaveFrame();
+  __ popq(RCX);
 
   __ ret();
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
@@ -1344,31 +1352,37 @@
   }
 }
 
-// Helper stub to implement Assembler::StoreIntoObject.
+// Helper stub to implement Assembler::StoreIntoObject/Array.
 // Input parameters:
 //   RDX: Object (old)
 //   RAX: Value (old or new)
+//   R13: Slot
 // If RAX is new, add RDX to the store buffer. Otherwise RAX is old, mark RAX
 // and add it to the mark list.
 COMPILE_ASSERT(kWriteBarrierObjectReg == RDX);
 COMPILE_ASSERT(kWriteBarrierValueReg == RAX);
-void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
-#if defined(CONCURRENT_MARKING)
-  Label add_to_mark_stack;
+COMPILE_ASSERT(kWriteBarrierSlotReg == R13);
+static void GenerateWriteBarrierStubHelper(Assembler* assembler,
+                                           Address stub_code,
+                                           bool cards) {
+  Label add_to_mark_stack, remember_card;
   __ testq(RAX, Immediate(1 << kNewObjectBitPosition));
   __ j(ZERO, &add_to_mark_stack);
-#else
-  Label add_to_buffer;
-  // Check whether this object has already been remembered. Skip adding to the
-  // store buffer if the object is in the store buffer already.
-  // RDX: Address being stored
-  __ movl(TMP, FieldAddress(RDX, Object::tags_offset()));
-  __ testl(TMP, Immediate(1 << RawObject::kOldAndNotRememberedBit));
-  __ j(NOT_EQUAL, &add_to_buffer, Assembler::kNearJump);
-  __ ret();
 
-  __ Bind(&add_to_buffer);
+  if (cards) {
+    __ movl(TMP, FieldAddress(RDX, Object::tags_offset()));
+    __ testl(TMP, Immediate(1 << RawObject::kCardRememberedBit));
+    __ j(NOT_ZERO, &remember_card, Assembler::kFarJump);
+  } else {
+#if defined(DEBUG)
+    Label ok;
+    __ movl(TMP, FieldAddress(RDX, Object::tags_offset()));
+    __ testl(TMP, Immediate(1 << RawObject::kCardRememberedBit));
+    __ j(ZERO, &ok, Assembler::kFarJump);
+    __ Stop("Wrong barrier");
+    __ Bind(&ok);
 #endif
+  }
 
   // Update the tags that this object has been remembered.
   // Note that we use 32 bit operations here to match the size of the
@@ -1408,7 +1422,7 @@
   __ Bind(&overflow);
   // Setup frame, push callee-saved registers.
   __ pushq(CODE_REG);
-  __ movq(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ movq(CODE_REG, stub_code);
   __ EnterCallRuntimeFrame(0);
   __ movq(CallingConventions::kArg1Reg, THR);
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
@@ -1416,7 +1430,6 @@
   __ popq(CODE_REG);
   __ ret();
 
-#if defined(CONCURRENT_MARKING)
   __ Bind(&add_to_mark_stack);
   __ pushq(RAX);  // Spill.
   __ pushq(RCX);  // Spill.
@@ -1449,7 +1462,7 @@
 
   __ Bind(&marking_overflow);
   __ pushq(CODE_REG);
-  __ movq(CODE_REG, Address(THR, Thread::write_barrier_code_offset()));
+  __ movq(CODE_REG, stub_code);
   __ EnterCallRuntimeFrame(0);
   __ movq(CallingConventions::kArg1Reg, THR);
   __ CallRuntime(kMarkingStackBlockProcessRuntimeEntry, 1);
@@ -1461,7 +1474,47 @@
   __ popq(RCX);  // Unspill.
   __ popq(RAX);  // Unspill.
   __ ret();
-#endif
+
+  if (cards) {
+    Label remember_card_slow;
+
+    // Get card table.
+    __ Bind(&remember_card);
+    __ movq(TMP, RDX);                   // Object.
+    __ andq(TMP, Immediate(kPageMask));  // HeapPage.
+    __ cmpq(Address(TMP, HeapPage::card_table_offset()), Immediate(0));
+    __ j(EQUAL, &remember_card_slow, Assembler::kNearJump);
+
+    // Dirty the card.
+    __ subq(R13, TMP);  // Offset in page.
+    __ movq(TMP, Address(TMP, HeapPage::card_table_offset()));  // Card table.
+    __ shrq(R13,
+            Immediate(HeapPage::kBytesPerCardLog2));  // Index in card table.
+    __ movb(Address(TMP, R13, TIMES_1, 0), Immediate(1));
+    __ ret();
+
+    // Card table not yet allocated.
+    __ Bind(&remember_card_slow);
+    __ pushq(CODE_REG);
+    __ movq(CODE_REG, stub_code);
+    __ EnterCallRuntimeFrame(0);
+    __ movq(CallingConventions::kArg1Reg, RDX);
+    __ movq(CallingConventions::kArg2Reg, R13);
+    __ CallRuntime(kRememberCardRuntimeEntry, 2);
+    __ LeaveCallRuntimeFrame();
+    __ popq(CODE_REG);
+    __ ret();
+  }
+}
+
+void StubCode::GenerateWriteBarrierStub(Assembler* assembler) {
+  GenerateWriteBarrierStubHelper(
+      assembler, Address(THR, Thread::write_barrier_code_offset()), false);
+}
+
+void StubCode::GenerateArrayWriteBarrierStub(Assembler* assembler) {
+  GenerateWriteBarrierStubHelper(
+      assembler, Address(THR, Thread::array_write_barrier_code_offset()), true);
 }
 
 // Called for inline allocation of objects.
@@ -2143,7 +2196,7 @@
   {
     Label ok;
     // Check that we are always entering from Dart code.
-    __ movq(R8, Immediate(VMTag::kDartTagId));
+    __ movq(R8, Immediate(VMTag::kDartCompiledTagId));
     __ cmpq(R8, Assembler::VMTagAddress());
     __ j(EQUAL, &ok, Assembler::kNearJump);
     __ Stop("Not coming from Dart code.");
@@ -2194,7 +2247,7 @@
   __ call(RAX);
 
   // Mark that the thread is executing Dart code.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
 
   // Reset exit frame information in Isolate structure.
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
@@ -2629,7 +2682,7 @@
 
   __ Bind(&is_simple_case);
   {
-    __ Call(*StubCode::Subtype2TestCache_entry());
+    __ Call(StubCode::Subtype2TestCache());
     __ CompareObject(R8, Bool::True());
     __ BranchIf(EQUAL, &done);  // Cache said: yes.
     __ Jump(&call_runtime);
@@ -2637,7 +2690,7 @@
 
   __ Bind(&is_complex_case);
   {
-    __ Call(*StubCode::Subtype6TestCache_entry());
+    __ Call(StubCode::Subtype6TestCache());
     __ CompareObject(R8, Bool::True());
     __ BranchIf(EQUAL, &done);  // Cache said: yes.
     // Fall through to runtime_call
@@ -2685,12 +2738,16 @@
   __ movq(RBP, CallingConventions::kArg3Reg);
   __ movq(RSP, CallingConventions::kArg2Reg);
   // Set the tag.
-  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartTagId));
+  __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
   // Clear top exit frame.
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
   // Restore the pool pointer.
   __ RestoreCodePointer();
-  __ LoadPoolPointer(PP);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ movq(PP, Address(THR, Thread::global_object_pool_offset()));
+  } else {
+    __ LoadPoolPointer(PP);
+  }
   __ jmp(CallingConventions::kArg1Reg);  // Jump to program counter.
 }
 
@@ -2896,12 +2953,19 @@
   // proper target for the given name and arguments descriptor.  If the
   // illegal class id was found, the target is a cache miss handler that can
   // be invoked as a normal Dart function.
-  __ movq(RAX, FieldAddress(RDI, RCX, TIMES_8, base + kWordSize));
-  __ movq(R10,
-          FieldAddress(RBX, MegamorphicCache::arguments_descriptor_offset()));
-  __ movq(RCX, FieldAddress(RAX, Function::entry_point_offset()));
-  __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
-  __ jmp(RCX);
+  const auto target_address = FieldAddress(RDI, RCX, TIMES_8, base + kWordSize);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    __ movq(R10,
+            FieldAddress(RBX, MegamorphicCache::arguments_descriptor_offset()));
+    __ jmp(target_address);
+  } else {
+    __ movq(RAX, target_address);
+    __ movq(R10,
+            FieldAddress(RBX, MegamorphicCache::arguments_descriptor_offset()));
+    __ movq(RCX, FieldAddress(RAX, Function::entry_point_offset()));
+    __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
+    __ jmp(RCX);
+  }
 
   // Probe failed, check if it is a miss.
   __ Bind(&probe_failed);
@@ -2988,9 +3052,10 @@
   __ Bind(&found);
   const intptr_t code_offset = ICData::CodeIndexFor(1) * kWordSize;
   const intptr_t entry_offset = ICData::EntryPointIndexFor(1) * kWordSize;
-  __ movq(RCX, Address(R13, entry_offset));
-  __ movq(CODE_REG, Address(R13, code_offset));
-  __ jmp(RCX);
+  if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
+    __ movq(CODE_REG, Address(R13, code_offset));
+  }
+  __ jmp(Address(R13, entry_offset));
 
   __ Bind(&miss);
   __ LoadIsolate(RAX);
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index c9d9474..7739541 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -58,8 +58,9 @@
   ObjectPoolWrapper object_pool_wrapper;
   Assembler assembler(&object_pool_wrapper);
   GenerateCallToCallRuntimeStub(&assembler, length);
-  const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler));
+  const Code& code = Code::Handle(
+      Code::FinalizeCode(*CreateFunction("Test_CallRuntimeStubCode"), nullptr,
+                         &assembler, Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Array& result = Array::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
@@ -100,7 +101,8 @@
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCode(
-      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler));
+      *CreateFunction("Test_CallLeafRuntimeStubCode"), nullptr, &assembler,
+      Code::PoolAttachment::kAttachPool));
   const Function& function = RegisterFakeFunction(kName, code);
   Instance& result = Instance::Handle();
   result ^= DartEntry::InvokeFunction(function, Object::empty_array());
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index e9f410f..741239a 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -417,12 +417,18 @@
   Zone* zone = thread->zone();
   if (type == Utf8::kLatin1) {
     uint8_t* characters = zone->Alloc<uint8_t>(len);
-    Utf8::DecodeToLatin1(utf8_array, array_len, characters, len);
+    if (!Utf8::DecodeToLatin1(utf8_array, array_len, characters, len)) {
+      Utf8::ReportInvalidByte(utf8_array, array_len, len);
+      return String::null();
+    }
     return FromLatin1(thread, characters, len);
   }
   ASSERT((type == Utf8::kBMP) || (type == Utf8::kSupplementary));
   uint16_t* characters = zone->Alloc<uint16_t>(len);
-  Utf8::DecodeToUTF16(utf8_array, array_len, characters, len);
+  if (!Utf8::DecodeToUTF16(utf8_array, array_len, characters, len)) {
+    Utf8::ReportInvalidByte(utf8_array, array_len, len);
+    return String::null();
+  }
   return FromUTF16(thread, characters, len);
 }
 
@@ -686,6 +692,13 @@
   // in DEBUG mode.
 }
 
+void Symbols::DumpTable(Isolate* isolate) {
+  OS::PrintErr("symbols:\n");
+  SymbolTable table(isolate->object_store()->symbol_table());
+  table.Dump();
+  table.Release();
+}
+
 intptr_t Symbols::LookupPredefinedSymbol(RawObject* obj) {
   for (intptr_t i = 1; i < Symbols::kMaxPredefinedId; i++) {
     if (symbol_handles_[i]->raw() == obj) {
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index f3572c2..536ad2b 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -80,7 +80,6 @@
   V(_CompileTimeError, "_CompileTimeError")                                    \
   V(ThrowNew, "_throwNew")                                                     \
   V(ThrowNewInvocation, "_throwNewInvocation")                                 \
-  V(ThrowNewIfNotLoaded, "_throwNewIfNotLoaded")                               \
   V(EvaluateAssertion, "_evaluateAssertion")                                   \
   V(Symbol, "Symbol")                                                          \
   V(SymbolCtor, "Symbol.")                                                     \
@@ -164,13 +163,10 @@
   V(Null, "Null")                                                              \
   V(null, "null")                                                              \
   V(Dynamic, "dynamic")                                                        \
-  V(UnresolvedClass, "UnresolvedClass")                                        \
   V(Type, "Type")                                                              \
   V(_Type, "_Type")                                                            \
   V(_TypeRef, "_TypeRef")                                                      \
   V(_TypeParameter, "_TypeParameter")                                          \
-  V(_BoundedType, "_BoundedType")                                              \
-  V(_MixinAppType, "_MixinAppType")                                            \
   V(TypeArguments, "TypeArguments")                                            \
   V(Patch, "patch")                                                            \
   V(Pragma, "pragma")                                                          \
@@ -190,6 +186,7 @@
   V(Namespace, "Namespace")                                                    \
   V(KernelProgramInfo, "KernelProgramInfo")                                    \
   V(Code, "Code")                                                              \
+  V(Bytecode, "Bytecode")                                                      \
   V(Instructions, "Instructions")                                              \
   V(ObjectPool, "ObjectPool")                                                  \
   V(PcDescriptors, "PcDescriptors")                                            \
@@ -239,7 +236,6 @@
   V(ColonStream, ":stream")                                                    \
   V(Object, "Object")                                                          \
   V(Int, "int")                                                                \
-  V(Int64, "_int64")                                                           \
   V(Double, "double")                                                          \
   V(Float32x4, "Float32x4")                                                    \
   V(Float64x2, "Float64x2")                                                    \
@@ -413,6 +409,7 @@
   V(_UserTag, "_UserTag")                                                      \
   V(Default, "Default")                                                        \
   V(ClassID, "ClassID")                                                        \
+  V(getID, "getID")                                                            \
   V(DartIsVM, "dart.isVM")                                                     \
   V(stack, ":stack")                                                           \
   V(stack_pointer, ":stack_pointer")                                           \
@@ -457,6 +454,7 @@
   V(DebugProcedureName, ":Eval")                                               \
   V(DebugClassName, "#DebugClass")                                             \
   V(vm_entry_point, "vm:entry-point")                                          \
+  V(vm_non_nullable_result_type, "vm:non-nullable-result-type")                \
   V(vm_exact_result_type, "vm:exact-result-type")                              \
   V(Get, "get")                                                                \
   V(Set, "set")                                                                \
@@ -675,6 +673,7 @@
   }
 
   static void DumpStats(Isolate* isolate);
+  static void DumpTable(Isolate* isolate);
 
   // Returns Symbol::Null if no symbol is found.
   template <typename StringType>
diff --git a/runtime/vm/tags.cc b/runtime/vm/tags.cc
index f1cd1e0..b20b42e 100644
--- a/runtime/vm/tags.cc
+++ b/runtime/vm/tags.cc
@@ -36,7 +36,7 @@
 }
 
 bool VMTag::IsDartTag(uword id) {
-  return id == kDartTagId;
+  return (id == kDartCompiledTagId) || (id == kDartInterpretedTagId);
 }
 
 bool VMTag::IsExitFrameTag(uword id) {
@@ -44,34 +44,26 @@
          (id != kVMTagId) && (id != kEmbedderTagId);
 }
 
-static RuntimeEntry* runtime_entry_list = NULL;
-
 bool VMTag::IsRuntimeEntryTag(uword id) {
-  const RuntimeEntry* current = runtime_entry_list;
-  while (current != NULL) {
-    if (reinterpret_cast<uword>(current->function()) == id) {
-      return true;
-    }
-    current = current->next();
-  }
-  return false;
+  return RuntimeEntryTagName(id) != nullptr;
 }
 
 const char* VMTag::RuntimeEntryTagName(uword id) {
-  const RuntimeEntry* current = runtime_entry_list;
-  while (current != NULL) {
-    if (reinterpret_cast<uword>(current->function()) == id) {
-      return current->name();
-    }
-    current = current->next();
-  }
-  return NULL;
-}
+  void* address = reinterpret_cast<void*>(id);
 
-void VMTag::RegisterRuntimeEntry(RuntimeEntry* runtime_entry) {
-  ASSERT(runtime_entry != NULL);
-  runtime_entry->set_next(runtime_entry_list);
-  runtime_entry_list = runtime_entry;
+#define CHECK_RUNTIME_ADDRESS(n)                                               \
+  if (address == k##n##RuntimeEntry.function())                                \
+    return k##n##RuntimeEntry.name();
+  RUNTIME_ENTRY_LIST(CHECK_RUNTIME_ADDRESS)
+#undef CHECK_RUNTIME_ADDRESS
+
+#define CHECK_LEAF_RUNTIME_ADDRESS(type, n, ...)                               \
+  if (address == k##n##RuntimeEntry.function())                                \
+    return k##n##RuntimeEntry.name();
+  LEAF_RUNTIME_ENTRY_LIST(CHECK_LEAF_RUNTIME_ADDRESS)
+#undef CHECK_LEAF_RUNTIME_ADDRESS
+
+  return nullptr;
 }
 
 VMTag::TagEntry VMTag::entries_[] = {
@@ -85,7 +77,7 @@
 };
 
 VMTagScope::VMTagScope(Thread* thread, uword tag, bool conditional_set)
-    : StackResource(thread) {
+    : ThreadStackResource(thread) {
   ASSERT(isolate() != NULL);
   previous_tag_ = thread->vm_tag();
   if (conditional_set) {
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
index 42320c3..4f3b665 100644
--- a/runtime/vm/tags.h
+++ b/runtime/vm/tags.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_TAGS_H_
 
 #include "vm/allocation.h"
+#include "vm/thread_stack_resource.h"
 
 namespace dart {
 
@@ -17,17 +18,16 @@
   V(Idle)     /* isolate is idle and is_runnable() */                          \
   V(LoadWait) /* isolate is idle and !is_runnable() */                         \
   V(VM)       /* Catch all */                                                  \
+  V(LoadBytecode)                                                              \
   V(CompileOptimized)                                                          \
   V(CompileUnoptimized)                                                        \
-  V(CompileClass)                                                              \
-  V(CompileTopLevel)                                                           \
-  V(CompileScanner)                                                            \
-  V(CompileParseFunction)                                                      \
+  V(ClassLoading)                                                              \
   V(CompileParseRegExp)                                                        \
-  V(CompileFlowGraphBuilder)                                                   \
-  V(Dart)                                                                      \
+  V(DartCompiled)                                                              \
+  V(DartInterpreted)                                                           \
   V(GCNewSpace)                                                                \
   V(GCOldSpace)                                                                \
+  V(GCIdle)                                                                    \
   V(Embedder)                                                                  \
   V(Runtime)                                                                   \
   V(Native)
@@ -76,7 +76,7 @@
   static TagEntry entries_[];
 };
 
-class VMTagScope : StackResource {
+class VMTagScope : ThreadStackResource {
  public:
   VMTagScope(Thread* thread, uword tag, bool conditional_set = true);
   ~VMTagScope();
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index bc6c6ad..8756113 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -58,7 +58,7 @@
 #define REUSABLE_HANDLE_INITIALIZERS(object) object##_handle_(NULL),
 
 Thread::Thread(Isolate* isolate)
-    : BaseThread(false),
+    : ThreadState(false),
       stack_limit_(0),
       stack_overflow_flags_(0),
       write_barrier_mask_(RawObject::kGenerationalBarrierMask),
@@ -72,21 +72,17 @@
       vm_tag_(0),
       async_stack_trace_(StackTrace::null()),
       unboxed_int64_runtime_arg_(0),
+      active_exception_(Object::null()),
+      active_stacktrace_(Object::null()),
+      resume_pc_(0),
       task_kind_(kUnknownTask),
       dart_stream_(NULL),
-      os_thread_(NULL),
       thread_lock_(new Monitor()),
-      zone_(NULL),
-      current_zone_capacity_(0),
-      zone_high_watermark_(0),
       api_reusable_scope_(NULL),
       api_top_scope_(NULL),
-      top_resource_(NULL),
-      long_jump_base_(NULL),
       no_callback_scope_depth_(0),
 #if defined(DEBUG)
       top_handle_scope_(NULL),
-      no_handle_scope_depth_(0),
       no_safepoint_scope_depth_(0),
 #endif
       reusable_handles_(),
@@ -99,9 +95,6 @@
       hierarchy_info_(NULL),
       type_usage_info_(NULL),
       pending_functions_(GrowableObjectArray::null()),
-      active_exception_(Object::null()),
-      active_stacktrace_(Object::null()),
-      resume_pc_(0),
       sticky_error_(Error::null()),
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
           REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) safepoint_state_(0),
@@ -142,20 +135,6 @@
   if ((Dart::vm_isolate() != NULL) && (isolate != Dart::vm_isolate())) {
     InitVMConstants();
   }
-
-  // This thread should not yet own any zones. If it does, we need to make sure
-  // we've accounted for any memory it has already allocated.
-  if (zone_ == NULL) {
-    ASSERT(current_zone_capacity_ == 0);
-  } else {
-    Zone* current = zone_;
-    uintptr_t total_zone_capacity = 0;
-    while (current != NULL) {
-      total_zone_capacity += current->CapacityInBytes();
-      current = current->previous();
-    }
-    ASSERT(current_zone_capacity_ == total_zone_capacity);
-  }
 }
 
 static const double double_nan_constant = NAN;
@@ -214,7 +193,7 @@
     defined(TARGET_ARCH_X64)
   for (intptr_t i = 0; i < kNumberOfDartAvailableCpuRegs; ++i) {
     write_barrier_wrappers_entry_points_[i] =
-        StubCode::WriteBarrierWrappers_entry()->EntryPoint() +
+        StubCode::WriteBarrierWrappers().EntryPoint() +
         i * kStoreBufferWrapperSize;
   }
 #endif
@@ -246,8 +225,8 @@
   jsobj.AddPropertyF("id", "threads/%" Pd "",
                      OSThread::ThreadIdToIntPtr(os_thread()->trace_id()));
   jsobj.AddProperty("kind", TaskKindToCString(task_kind()));
-  jsobj.AddPropertyF("_zoneHighWatermark", "%" Pu "", zone_high_watermark_);
-  jsobj.AddPropertyF("_zoneCapacity", "%" Pu "", current_zone_capacity_);
+  jsobj.AddPropertyF("_zoneHighWatermark", "%" Pu "", zone_high_watermark());
+  jsobj.AddPropertyF("_zoneCapacity", "%" Pu "", current_zone_capacity());
 }
 #endif
 
@@ -279,12 +258,12 @@
   sticky_error_ = value.raw();
 }
 
-void Thread::clear_sticky_error() {
+void Thread::ClearStickyError() {
   sticky_error_ = Error::null();
 }
 
-RawError* Thread::get_and_clear_sticky_error() {
-  NoSafepointScope nss;
+RawError* Thread::StealStickyError() {
+  NoSafepointScope no_safepoint;
   RawError* return_value = sticky_error_;
   sticky_error_ = Error::null();
   return return_value;
@@ -335,6 +314,7 @@
     if (isolate->marking_stack() != NULL) {
       // Concurrent mark in progress. Enable barrier for this thread.
       thread->MarkingStackAcquire();
+      thread->DeferredMarkingStackAcquire();
     }
     return true;
   }
@@ -353,6 +333,7 @@
   thread->ClearReusableHandles();
   if (thread->is_marking()) {
     thread->MarkingStackRelease();
+    thread->DeferredMarkingStackRelease();
   }
   thread->StoreBufferRelease();
   if (isolate->is_runnable()) {
@@ -380,6 +361,7 @@
     if (isolate->marking_stack() != NULL) {
       // Concurrent mark in progress. Enable barrier for this thread.
       thread->MarkingStackAcquire();
+      thread->DeferredMarkingStackAcquire();
     }
     // This thread should not be the main mutator.
     thread->task_kind_ = kind;
@@ -399,6 +381,7 @@
   thread->ClearReusableHandles();
   if (thread->is_marking()) {
     thread->MarkingStackRelease();
+    thread->DeferredMarkingStackRelease();
   }
   thread->StoreBufferRelease();
   Isolate* isolate = thread->isolate();
@@ -468,18 +451,6 @@
   return interrupt_bits;
 }
 
-bool Thread::ZoneIsOwnedByThread(Zone* zone) const {
-  ASSERT(zone != NULL);
-  Zone* current = zone_;
-  while (current != NULL) {
-    if (current == zone) {
-      return true;
-    }
-    current = current->previous();
-  }
-  return false;
-}
-
 void Thread::DeferOOBMessageInterrupts() {
   MonitorLocker ml(thread_lock_);
   defer_oob_messages_count_++;
@@ -553,11 +524,10 @@
             "\tisolate:    %s\n",
             isolate()->name());
       }
-      Thread* thread = Thread::Current();
-      const Error& error = Error::Handle(thread->sticky_error());
-      ASSERT(!error.IsNull() && error.IsUnwindError());
-      thread->clear_sticky_error();
-      return error.raw();
+      NoSafepointScope no_safepoint;
+      RawError* error = Thread::Current()->StealStickyError();
+      ASSERT(error->IsUnwindError());
+      return error;
     }
   }
   return Error::null();
@@ -603,6 +573,11 @@
   MarkingStackAcquire();
 }
 
+void Thread::DeferredMarkingStackBlockProcess() {
+  DeferredMarkingStackRelease();
+  DeferredMarkingStackAcquire();
+}
+
 void Thread::MarkingStackAddObject(RawObject* obj) {
   marking_stack_block_->Push(obj);
   if (marking_stack_block_->IsFull()) {
@@ -610,6 +585,13 @@
   }
 }
 
+void Thread::DeferredMarkingStackAddObject(RawObject* obj) {
+  deferred_marking_stack_block_->Push(obj);
+  if (deferred_marking_stack_block_->IsFull()) {
+    DeferredMarkingStackBlockProcess();
+  }
+}
+
 void Thread::MarkingStackRelease() {
   MarkingStackBlock* block = marking_stack_block_;
   marking_stack_block_ = NULL;
@@ -623,6 +605,17 @@
       RawObject::kGenerationalBarrierMask | RawObject::kIncrementalBarrierMask;
 }
 
+void Thread::DeferredMarkingStackRelease() {
+  MarkingStackBlock* block = deferred_marking_stack_block_;
+  deferred_marking_stack_block_ = NULL;
+  isolate()->deferred_marking_stack()->PushBlock(block);
+}
+
+void Thread::DeferredMarkingStackAcquire() {
+  deferred_marking_stack_block_ =
+      isolate()->deferred_marking_stack()->PopEmptyBlock();
+}
+
 bool Thread::IsMutatorThread() const {
   return ((isolate_ != NULL) && (isolate_->mutator_thread() == this));
 }
@@ -638,11 +631,11 @@
 }
 
 bool Thread::IsExecutingDartCode() const {
-  return (top_exit_frame_info() == 0) && (vm_tag() == VMTag::kDartTagId);
+  return (top_exit_frame_info() == 0) && VMTag::IsDartTag(vm_tag());
 }
 
 bool Thread::HasExitedDartCode() const {
-  return (top_exit_frame_info() != 0) && (vm_tag() != VMTag::kDartTagId);
+  return (top_exit_frame_info() != 0) && !VMTag::IsDartTag(vm_tag());
 }
 
 template <class C>
@@ -662,8 +655,8 @@
                                  ValidationPolicy validation_policy) {
   ASSERT(visitor != NULL);
 
-  if (zone_ != NULL) {
-    zone_->VisitObjectPointers(visitor);
+  if (zone() != NULL) {
+    zone()->VisitObjectPointers(visitor);
   }
 
   // Visit objects in thread specific handles area.
@@ -691,15 +684,15 @@
   // Only the mutator thread can run Dart code.
   if (IsMutatorThread()) {
     // The MarkTask, which calls this method, can run on a different thread.  We
-    // therefore assume the mutator is at a safepoint and we can iterate it's
+    // therefore assume the mutator is at a safepoint and we can iterate its
     // stack.
     // TODO(vm-team): It would be beneficial to be able to ask the mutator
     // thread whether it is in fact blocked at the moment (at a "safepoint") so
-    // we can safely iterate it's stack.
+    // we can safely iterate its stack.
     //
     // Unfortunately we cannot use `this->IsAtSafepoint()` here because that
     // will return `false` even though the mutator thread is waiting for mark
-    // tasks (which iterate it's stack) to finish.
+    // tasks (which iterate its stack) to finish.
     const StackFrameIterator::CrossThreadPolicy cross_thread_policy =
         StackFrameIterator::kAllowCrossThreadIteration;
 
@@ -805,6 +798,40 @@
   return -1;
 }
 
+#if defined(DEBUG)
+bool Thread::TopErrorHandlerIsSetJump() const {
+  if (long_jump_base() == nullptr) return false;
+  if (top_exit_frame_info_ == 0) return true;
+#if defined(USING_SIMULATOR) || defined(USING_SAFE_STACK)
+  // False positives: simulator stack and native stack are unordered.
+  return true;
+#else
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  // False positives: interpreter stack and native stack are unordered.
+  if ((interpreter_ != nullptr) && interpreter_->HasFrame(top_exit_frame_info_))
+    return true;
+#endif
+  return reinterpret_cast<uword>(long_jump_base()) < top_exit_frame_info_;
+#endif
+}
+
+bool Thread::TopErrorHandlerIsExitFrame() const {
+  if (top_exit_frame_info_ == 0) return false;
+  if (long_jump_base() == nullptr) return true;
+#if defined(USING_SIMULATOR) || defined(USING_SAFE_STACK)
+  // False positives: simulator stack and native stack are unordered.
+  return true;
+#else
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  // False positives: interpreter stack and native stack are unordered.
+  if ((interpreter_ != nullptr) && interpreter_->HasFrame(top_exit_frame_info_))
+    return true;
+#endif
+  return top_exit_frame_info_ < reinterpret_cast<uword>(long_jump_base());
+#endif
+}
+#endif  // defined(DEBUG)
+
 bool Thread::IsValidHandle(Dart_Handle object) const {
   return IsValidLocalHandle(object) || IsValidZoneHandle(object) ||
          IsValidScopedHandle(object);
@@ -832,7 +859,7 @@
 }
 
 bool Thread::IsValidZoneHandle(Dart_Handle object) const {
-  Zone* zone = zone_;
+  Zone* zone = this->zone();
   while (zone != NULL) {
     if (zone->handles()->IsValidZoneHandle(reinterpret_cast<uword>(object))) {
       return true;
@@ -844,7 +871,7 @@
 
 intptr_t Thread::CountZoneHandles() const {
   intptr_t count = 0;
-  Zone* zone = zone_;
+  Zone* zone = this->zone();
   while (zone != NULL) {
     count += zone->handles()->CountZoneHandles();
     zone = zone->previous();
@@ -854,7 +881,7 @@
 }
 
 bool Thread::IsValidScopedHandle(Dart_Handle object) const {
-  Zone* zone = zone_;
+  Zone* zone = this->zone();
   while (zone != NULL) {
     if (zone->handles()->IsValidScopedHandle(reinterpret_cast<uword>(object))) {
       return true;
@@ -866,7 +893,7 @@
 
 intptr_t Thread::CountScopedHandles() const {
   intptr_t count = 0;
-  Zone* zone = zone_;
+  Zone* zone = this->zone();
   while (zone != NULL) {
     count += zone->handles()->CountScopedHandles();
     zone = zone->previous();
@@ -885,6 +912,33 @@
   return total;
 }
 
+void Thread::EnterApiScope() {
+  ASSERT(MayAllocateHandles());
+  ApiLocalScope* new_scope = api_reusable_scope();
+  if (new_scope == NULL) {
+    new_scope = new ApiLocalScope(api_top_scope(), top_exit_frame_info());
+    ASSERT(new_scope != NULL);
+  } else {
+    new_scope->Reinit(this, api_top_scope(), top_exit_frame_info());
+    set_api_reusable_scope(NULL);
+  }
+  set_api_top_scope(new_scope);  // New scope is now the top scope.
+}
+
+void Thread::ExitApiScope() {
+  ASSERT(MayAllocateHandles());
+  ApiLocalScope* scope = api_top_scope();
+  ApiLocalScope* reusable_scope = api_reusable_scope();
+  set_api_top_scope(scope->previous());  // Reset top scope to previous.
+  if (reusable_scope == NULL) {
+    scope->Reset(this);  // Reset the old scope which we just exited.
+    set_api_reusable_scope(scope);
+  } else {
+    ASSERT(reusable_scope != scope);
+    delete scope;
+  }
+}
+
 void Thread::UnwindScopes(uword stack_marker) {
   // Unwind all scopes using the same stack_marker, i.e. all scopes allocated
   // under the same top_exit_frame_info.
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 49e3c07..0df7b36 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -16,6 +16,7 @@
 #include "vm/heap/pointer_block.h"
 #include "vm/os_thread.h"
 #include "vm/runtime_entry_list.h"
+#include "vm/thread_state.h"
 
 namespace dart {
 
@@ -25,6 +26,7 @@
 class CompilerState;
 class Class;
 class Code;
+class Bytecode;
 class Error;
 class ExceptionHandlers;
 class Field;
@@ -37,7 +39,6 @@
 class Interpreter;
 class Isolate;
 class Library;
-class LongJumpScope;
 class Object;
 class OSThread;
 class JSONObject;
@@ -47,6 +48,7 @@
 class RawCode;
 class RawError;
 class RawGrowableObjectArray;
+class RawObjectPool;
 class RawStackTrace;
 class RawString;
 class RuntimeEntry;
@@ -65,6 +67,7 @@
   V(Array)                                                                     \
   V(Class)                                                                     \
   V(Code)                                                                      \
+  V(Bytecode)                                                                  \
   V(Error)                                                                     \
   V(ExceptionHandlers)                                                         \
   V(Field)                                                                     \
@@ -83,46 +86,44 @@
 #define CACHED_VM_STUBS_LIST(V)
 #else
 #define CACHED_VM_STUBS_LIST(V)                                                \
-  V(RawCode*, write_barrier_code_, StubCode::WriteBarrier_entry()->code(),     \
+  V(RawCode*, write_barrier_code_, StubCode::WriteBarrier().raw(), NULL)       \
+  V(RawCode*, array_write_barrier_code_, StubCode::ArrayWriteBarrier().raw(),  \
     NULL)                                                                      \
-  V(RawCode*, fix_callers_target_code_,                                        \
-    StubCode::FixCallersTarget_entry()->code(), NULL)                          \
+  V(RawCode*, fix_callers_target_code_, StubCode::FixCallersTarget().raw(),    \
+    NULL)                                                                      \
   V(RawCode*, fix_allocation_stub_code_,                                       \
-    StubCode::FixAllocationStubTarget_entry()->code(), NULL)                   \
-  V(RawCode*, invoke_dart_code_stub_,                                          \
-    StubCode::InvokeDartCode_entry()->code(), NULL)                            \
+    StubCode::FixAllocationStubTarget().raw(), NULL)                           \
+  V(RawCode*, invoke_dart_code_stub_, StubCode::InvokeDartCode().raw(), NULL)  \
   V(RawCode*, invoke_dart_code_from_bytecode_stub_,                            \
-    StubCode::InvokeDartCodeFromBytecode_entry()->code(), NULL)                \
-  V(RawCode*, call_to_runtime_stub_, StubCode::CallToRuntime_entry()->code(),  \
-    NULL)                                                                      \
+    StubCode::InvokeDartCodeFromBytecode().raw(), NULL)                        \
+  V(RawCode*, call_to_runtime_stub_, StubCode::CallToRuntime().raw(), NULL)    \
   V(RawCode*, null_error_shared_without_fpu_regs_stub_,                        \
-    StubCode::NullErrorSharedWithoutFPURegs_entry()->code(), NULL)             \
+    StubCode::NullErrorSharedWithoutFPURegs().raw(), NULL)                     \
   V(RawCode*, null_error_shared_with_fpu_regs_stub_,                           \
-    StubCode::NullErrorSharedWithFPURegs_entry()->code(), NULL)                \
+    StubCode::NullErrorSharedWithFPURegs().raw(), NULL)                        \
   V(RawCode*, stack_overflow_shared_without_fpu_regs_stub_,                    \
-    StubCode::StackOverflowSharedWithoutFPURegs_entry()->code(), NULL)         \
+    StubCode::StackOverflowSharedWithoutFPURegs().raw(), NULL)                 \
   V(RawCode*, stack_overflow_shared_with_fpu_regs_stub_,                       \
-    StubCode::StackOverflowSharedWithFPURegs_entry()->code(), NULL)            \
-  V(RawCode*, monomorphic_miss_stub_,                                          \
-    StubCode::MonomorphicMiss_entry()->code(), NULL)                           \
+    StubCode::StackOverflowSharedWithFPURegs().raw(), NULL)                    \
+  V(RawCode*, monomorphic_miss_stub_, StubCode::MonomorphicMiss().raw(), NULL) \
   V(RawCode*, ic_lookup_through_code_stub_,                                    \
-    StubCode::ICCallThroughCode_entry()->code(), NULL)                         \
-  V(RawCode*, deoptimize_stub_, StubCode::Deoptimize_entry()->code(), NULL)    \
+    StubCode::ICCallThroughCode().raw(), NULL)                                 \
+  V(RawCode*, deoptimize_stub_, StubCode::Deoptimize().raw(), NULL)            \
   V(RawCode*, lazy_deopt_from_return_stub_,                                    \
-    StubCode::DeoptimizeLazyFromReturn_entry()->code(), NULL)                  \
+    StubCode::DeoptimizeLazyFromReturn().raw(), NULL)                          \
   V(RawCode*, lazy_deopt_from_throw_stub_,                                     \
-    StubCode::DeoptimizeLazyFromThrow_entry()->code(), NULL)                   \
-  V(RawCode*, slow_type_test_stub_, StubCode::SlowTypeTest_entry()->code(),    \
-    NULL)                                                                      \
+    StubCode::DeoptimizeLazyFromThrow().raw(), NULL)                           \
+  V(RawCode*, slow_type_test_stub_, StubCode::SlowTypeTest().raw(), NULL)      \
   V(RawCode*, lazy_specialize_type_test_stub_,                                 \
-    StubCode::LazySpecializeTypeTest_entry()->code(), NULL)
+    StubCode::LazySpecializeTypeTest().raw(), NULL)
 
 #endif
 
 #define CACHED_NON_VM_STUB_LIST(V)                                             \
   V(RawObject*, object_null_, Object::null(), NULL)                            \
   V(RawBool*, bool_true_, Object::bool_true().raw(), NULL)                     \
-  V(RawBool*, bool_false_, Object::bool_false().raw(), NULL)
+  V(RawBool*, bool_false_, Object::bool_false().raw(), NULL)                   \
+  V(RawObjectPool*, global_object_pool_, ObjectPool::null(), NULL)
 
 // List of VM-global objects/addresses cached in each Thread object.
 // Important: constant false must immediately follow constant true.
@@ -140,23 +141,25 @@
 #define CACHED_VM_STUBS_ADDRESSES_LIST(V)
 #else
 #define CACHED_VM_STUBS_ADDRESSES_LIST(V)                                      \
-  V(uword, write_barrier_entry_point_,                                         \
-    StubCode::WriteBarrier_entry()->EntryPoint(), 0)                           \
+  V(uword, write_barrier_entry_point_, StubCode::WriteBarrier().EntryPoint(),  \
+    0)                                                                         \
+  V(uword, array_write_barrier_entry_point_,                                   \
+    StubCode::ArrayWriteBarrier().EntryPoint(), 0)                             \
   V(uword, call_to_runtime_entry_point_,                                       \
-    StubCode::CallToRuntime_entry()->EntryPoint(), 0)                          \
+    StubCode::CallToRuntime().EntryPoint(), 0)                                 \
   V(uword, null_error_shared_without_fpu_regs_entry_point_,                    \
-    StubCode::NullErrorSharedWithoutFPURegs_entry()->EntryPoint(), 0)          \
+    StubCode::NullErrorSharedWithoutFPURegs().EntryPoint(), 0)                 \
   V(uword, null_error_shared_with_fpu_regs_entry_point_,                       \
-    StubCode::NullErrorSharedWithFPURegs_entry()->EntryPoint(), 0)             \
+    StubCode::NullErrorSharedWithFPURegs().EntryPoint(), 0)                    \
   V(uword, stack_overflow_shared_without_fpu_regs_entry_point_,                \
-    StubCode::StackOverflowSharedWithoutFPURegs_entry()->EntryPoint(), 0)      \
+    StubCode::StackOverflowSharedWithoutFPURegs().EntryPoint(), 0)             \
   V(uword, stack_overflow_shared_with_fpu_regs_entry_point_,                   \
-    StubCode::StackOverflowSharedWithFPURegs_entry()->EntryPoint(), 0)         \
+    StubCode::StackOverflowSharedWithFPURegs().EntryPoint(), 0)                \
   V(uword, megamorphic_call_checked_entry_,                                    \
-    StubCode::MegamorphicCall_entry()->EntryPoint(), 0)                        \
-  V(uword, monomorphic_miss_entry_,                                            \
-    StubCode::MonomorphicMiss_entry()->EntryPoint(), 0)                        \
-  V(uword, deoptimize_entry_, StubCode::Deoptimize_entry()->EntryPoint(), 0)
+    StubCode::MegamorphicCall().EntryPoint(), 0)                               \
+  V(uword, monomorphic_miss_entry_, StubCode::MonomorphicMiss().EntryPoint(),  \
+    0)                                                                         \
+  V(uword, deoptimize_entry_, StubCode::Deoptimize().EntryPoint(), 0)
 
 #endif
 
@@ -198,7 +201,7 @@
 // a thread is allocated by EnsureInit before entering an isolate, and destroyed
 // automatically when the underlying OS thread exits. NOTE: On Windows, CleanUp
 // must currently be called manually (issue 23474).
-class Thread : public BaseThread {
+class Thread : public ThreadState {
  public:
   // The kind of task this thread is performing. Sampled by the profiler.
   enum TaskKind {
@@ -217,13 +220,13 @@
   // The currently executing thread, or NULL if not yet initialized.
   static Thread* Current() {
 #if defined(HAS_C11_THREAD_LOCAL)
-    return OSThread::CurrentVMThread();
+    return static_cast<Thread*>(OSThread::CurrentVMThread());
 #else
     BaseThread* thread = OSThread::GetCurrentTLS();
     if (thread == NULL || thread->is_os_thread()) {
       return NULL;
     }
-    return reinterpret_cast<Thread*>(thread);
+    return static_cast<Thread*>(thread);
 #endif
   }
 
@@ -314,36 +317,9 @@
     return (stack_limit_ & kInterruptsMask) != 0;
   }
 
-  // OSThread corresponding to this thread.
-  OSThread* os_thread() const { return os_thread_; }
-  void set_os_thread(OSThread* os_thread) { os_thread_ = os_thread; }
-
   // Monitor corresponding to this thread.
   Monitor* thread_lock() const { return thread_lock_; }
 
-  // The topmost zone used for allocation in this thread.
-  Zone* zone() const { return zone_; }
-
-  bool ZoneIsOwnedByThread(Zone* zone) const;
-
-  void IncrementMemoryCapacity(uintptr_t value) {
-    current_zone_capacity_ += value;
-    if (current_zone_capacity_ > zone_high_watermark_) {
-      zone_high_watermark_ = current_zone_capacity_;
-    }
-  }
-
-  void DecrementMemoryCapacity(uintptr_t value) {
-    ASSERT(current_zone_capacity_ >= value);
-    current_zone_capacity_ -= value;
-  }
-
-  uintptr_t current_zone_capacity() { return current_zone_capacity_; }
-
-  uintptr_t zone_high_watermark() const { return zone_high_watermark_; }
-
-  void ResetHighWatermark() { zone_high_watermark_ = current_zone_capacity_; }
-
   // The reusable api local scope for this thread.
   ApiLocalScope* api_reusable_scope() const { return api_reusable_scope_; }
   void set_api_reusable_scope(ApiLocalScope* value) {
@@ -356,6 +332,9 @@
   ApiLocalScope* api_top_scope() const { return api_top_scope_; }
   void set_api_top_scope(ApiLocalScope* value) { api_top_scope_ = value; }
 
+  void EnterApiScope();
+  void ExitApiScope();
+
   // The isolate that this thread is operating on, or NULL if none.
   Isolate* isolate() const { return isolate_; }
   static intptr_t isolate_offset() { return OFFSET_OF(Thread, isolate_); }
@@ -433,7 +412,9 @@
 
   bool is_marking() const { return marking_stack_block_ != NULL; }
   void MarkingStackAddObject(RawObject* obj);
+  void DeferredMarkingStackAddObject(RawObject* obj);
   void MarkingStackBlockProcess();
+  void DeferredMarkingStackBlockProcess();
   static intptr_t marking_stack_block_offset() {
     return OFFSET_OF(Thread, marking_stack_block_);
   }
@@ -446,56 +427,28 @@
     return OFFSET_OF(Thread, top_exit_frame_info_);
   }
 
-  StackResource* top_resource() const { return top_resource_; }
-  void set_top_resource(StackResource* value) { top_resource_ = value; }
-  static intptr_t top_resource_offset() {
-    return OFFSET_OF(Thread, top_resource_);
-  }
-
   // Heap of the isolate that this thread is operating on.
   Heap* heap() const { return heap_; }
   static intptr_t heap_offset() { return OFFSET_OF(Thread, heap_); }
 
   void set_top(uword value) {
-    ASSERT(heap_ != NULL);
     top_ = value;
   }
   void set_end(uword value) {
-    ASSERT(heap_ != NULL);
     end_ = value;
   }
 
   uword top() { return top_; }
   uword end() { return end_; }
 
+  bool HasActiveTLAB() { return end_ > 0; }
+
   static intptr_t top_offset() { return OFFSET_OF(Thread, top_); }
   static intptr_t end_offset() { return OFFSET_OF(Thread, end_); }
 
   bool bump_allocate() const { return bump_allocate_; }
   void set_bump_allocate(bool b) { bump_allocate_ = b; }
 
-  int32_t no_handle_scope_depth() const {
-#if defined(DEBUG)
-    return no_handle_scope_depth_;
-#else
-    return 0;
-#endif
-  }
-
-  void IncrementNoHandleScopeDepth() {
-#if defined(DEBUG)
-    ASSERT(no_handle_scope_depth_ < INT_MAX);
-    no_handle_scope_depth_ += 1;
-#endif
-  }
-
-  void DecrementNoHandleScopeDepth() {
-#if defined(DEBUG)
-    ASSERT(no_handle_scope_depth_ > 0);
-    no_handle_scope_depth_ -= 1;
-#endif
-  }
-
   HandleScope* top_handle_scope() const {
 #if defined(DEBUG)
     return top_handle_scope_;
@@ -568,13 +521,22 @@
   LEAF_RUNTIME_ENTRY_LIST(DEFINE_OFFSET_METHOD)
 #undef DEFINE_OFFSET_METHOD
 
+  RawObjectPool* global_object_pool() const { return global_object_pool_; }
+  void set_global_object_pool(RawObjectPool* raw_value) {
+    global_object_pool_ = raw_value;
+  }
+
   static bool CanLoadFromThread(const Object& object);
   static intptr_t OffsetFromThread(const Object& object);
   static bool ObjectAtOffset(intptr_t offset, Object* object);
   static intptr_t OffsetFromThread(const RuntimeEntry* runtime_entry);
 
-  LongJumpScope* long_jump_base() const { return long_jump_base_; }
-  void set_long_jump_base(LongJumpScope* value) { long_jump_base_ = value; }
+#if defined(DEBUG)
+  // For asserts only. Has false positives when running with a simulator or
+  // SafeStack.
+  bool TopErrorHandlerIsSetJump() const;
+  bool TopErrorHandlerIsExitFrame() const;
+#endif
 
   uword vm_tag() const { return vm_tag_; }
   void set_vm_tag(uword tag) { vm_tag_ = tag; }
@@ -611,8 +573,8 @@
 
   RawError* sticky_error() const;
   void set_sticky_error(const Error& value);
-  void clear_sticky_error();
-  RawError* get_and_clear_sticky_error();
+  void ClearStickyError();
+  DART_WARN_UNUSED_RESULT RawError* StealStickyError();
 
   RawStackTrace* async_stack_trace() const;
   void set_async_stack_trace(const StackTrace& stack_trace);
@@ -731,6 +693,11 @@
     execution_state_ = static_cast<uint32_t>(state);
   }
 
+  bool MayAllocateHandles() {
+    return (execution_state() == kThreadInVM) ||
+           (execution_state() == kThreadInGenerated);
+  }
+
   bool TryEnterSafepoint() {
     uint32_t new_state = SetAtSafepoint(true, 0);
     if (AtomicOperations::CompareAndSwapUint32(&safepoint_state_, 0,
@@ -824,6 +791,7 @@
   uword top_exit_frame_info_;
   StoreBufferBlock* store_buffer_block_;
   MarkingStackBlock* marking_stack_block_;
+  MarkingStackBlock* deferred_marking_stack_block_;
   uword vm_tag_;
   RawStackTrace* async_stack_trace_;
   // Memory location dedicated for passing unboxed int64 values from
@@ -850,23 +818,27 @@
     defined(TARGET_ARCH_X64)
   uword write_barrier_wrappers_entry_points_[kNumberOfDartAvailableCpuRegs];
 #endif
-  // End accessed from generated code.
+
+  // JumpToExceptionHandler state:
+  RawObject* active_exception_;
+  RawObject* active_stacktrace_;
+  uword resume_pc_;
+
+  // ---- End accessed from generated code. ----
+
+  // The layout of Thread object up to this point should not depend
+  // on DART_PRECOMPILED_RUNTIME, as it is accessed from generated code.
+  // The code is generated without DART_PRECOMPILED_RUNTIME, but used with
+  // DART_PRECOMPILED_RUNTIME.
 
   TaskKind task_kind_;
   TimelineStream* dart_stream_;
-  OSThread* os_thread_;
   Monitor* thread_lock_;
-  Zone* zone_;
-  uintptr_t current_zone_capacity_;
-  uintptr_t zone_high_watermark_;
   ApiLocalScope* api_reusable_scope_;
   ApiLocalScope* api_top_scope_;
-  StackResource* top_resource_;
-  LongJumpScope* long_jump_base_;
   int32_t no_callback_scope_depth_;
 #if defined(DEBUG)
   HandleScope* top_handle_scope_;
-  int32_t no_handle_scope_depth_;
   int32_t no_safepoint_scope_depth_;
 #endif
   VMHandles reusable_handles_;
@@ -883,11 +855,6 @@
   TypeUsageInfo* type_usage_info_;
   RawGrowableObjectArray* pending_functions_;
 
-  // JumpToExceptionHandler state:
-  RawObject* active_exception_;
-  RawObject* active_stacktrace_;
-  uword resume_pc_;
-
   RawError* sticky_error_;
 
 // Reusable handles support.
@@ -927,8 +894,8 @@
 
   void MarkingStackRelease();
   void MarkingStackAcquire();
-
-  void set_zone(Zone* zone) { zone_ = zone; }
+  void DeferredMarkingStackRelease();
+  void DeferredMarkingStackAcquire();
 
   void set_safepoint_state(uint32_t value) { safepoint_state_ = value; }
   void EnterSafepointUsingLock();
@@ -970,6 +937,30 @@
   ~DisableThreadInterruptsScope();
 };
 
+// Within a NoSafepointScope, the thread must not reach any safepoint. Used
+// around code that manipulates raw object pointers directly without handles.
+#if defined(DEBUG)
+class NoSafepointScope : public ThreadStackResource {
+ public:
+  explicit NoSafepointScope(Thread* thread = nullptr)
+      : ThreadStackResource(thread != nullptr ? thread : Thread::Current()) {
+    this->thread()->IncrementNoSafepointScopeDepth();
+  }
+  ~NoSafepointScope() { thread()->DecrementNoSafepointScopeDepth(); }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(NoSafepointScope);
+};
+#else   // defined(DEBUG)
+class NoSafepointScope : public ValueObject {
+ public:
+  explicit NoSafepointScope(Thread* thread = nullptr) {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(NoSafepointScope);
+};
+#endif  // defined(DEBUG)
+
 }  // namespace dart
 
 #endif  // RUNTIME_VM_THREAD_H_
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index 1de2c0c..d8d56b1 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -36,16 +36,6 @@
 // The ThreadInterrupter has a single monitor (monitor_). This monitor is used
 // to synchronize startup, shutdown, and waking up from a deep sleep.
 //
-// A thread can only register and unregister itself. Each thread has a heap
-// allocated ThreadState. A thread's ThreadState is lazily allocated the first
-// time the thread is registered. A pointer to a thread's ThreadState is stored
-// in the list of threads registered to receive interrupts (threads_) and in
-// thread local storage. When a thread's ThreadState is being modified, the
-// thread local storage pointer is temporarily set to NULL while the
-// modification is occurring. After the ThreadState has been updated, the
-// thread local storage pointer is set again. This has an important side
-// effect: if the thread is interrupted by a signal handler during a ThreadState
-// update the signal handler will immediately return.
 
 DEFINE_FLAG(bool, trace_thread_interrupter, false, "Trace thread interrupter");
 
diff --git a/runtime/vm/thread_interrupter_android.cc b/runtime/vm/thread_interrupter_android.cc
index 5987846..92a21f5 100644
--- a/runtime/vm/thread_interrupter_android.cc
+++ b/runtime/vm/thread_interrupter_android.cc
@@ -18,7 +18,6 @@
 
 #ifndef PRODUCT
 
-DECLARE_FLAG(bool, thread_interrupter);
 DECLARE_FLAG(bool, trace_thread_interrupter);
 
 class ThreadInterrupterAndroid : public AllStatic {
diff --git a/runtime/vm/thread_interrupter_fuchsia.cc b/runtime/vm/thread_interrupter_fuchsia.cc
index d2f19c6..3ae857c 100644
--- a/runtime/vm/thread_interrupter_fuchsia.cc
+++ b/runtime/vm/thread_interrupter_fuchsia.cc
@@ -23,7 +23,6 @@
 
 #ifndef PRODUCT
 
-DECLARE_FLAG(bool, thread_interrupter);
 DECLARE_FLAG(bool, trace_thread_interrupter);
 
 // TODO(ZX-430): Currently, CPU profiling for Fuchsia is arranged very similarly
diff --git a/runtime/vm/thread_interrupter_linux.cc b/runtime/vm/thread_interrupter_linux.cc
index 21945a8..dc2bfd0 100644
--- a/runtime/vm/thread_interrupter_linux.cc
+++ b/runtime/vm/thread_interrupter_linux.cc
@@ -17,7 +17,6 @@
 
 #ifndef PRODUCT
 
-DECLARE_FLAG(bool, thread_interrupter);
 DECLARE_FLAG(bool, trace_thread_interrupter);
 
 class ThreadInterrupterLinux : public AllStatic {
diff --git a/runtime/vm/thread_interrupter_macos.cc b/runtime/vm/thread_interrupter_macos.cc
index c8108aa..9ea36b4 100644
--- a/runtime/vm/thread_interrupter_macos.cc
+++ b/runtime/vm/thread_interrupter_macos.cc
@@ -22,7 +22,6 @@
 
 #ifndef PRODUCT
 
-DECLARE_FLAG(bool, thread_interrupter);
 DECLARE_FLAG(bool, trace_thread_interrupter);
 
 // Returns true if the current process is being debugged (either
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index 9963983..c862a22 100644
--- a/runtime/vm/thread_interrupter_win.cc
+++ b/runtime/vm/thread_interrupter_win.cc
@@ -14,7 +14,6 @@
 
 #ifndef PRODUCT
 
-DECLARE_FLAG(bool, thread_interrupter);
 DECLARE_FLAG(bool, trace_thread_interrupter);
 
 #define kThreadError -1
@@ -82,7 +81,7 @@
     // Currently we sample only threads that are associated
     // with an isolate. It is safe to call 'os_thread->thread()'
     // here as the thread which is being queried is suspended.
-    Thread* thread = os_thread->thread();
+    Thread* thread = static_cast<Thread*>(os_thread->thread());
     if (thread != NULL) {
       Profiler::SampleThread(thread, its);
     }
diff --git a/runtime/vm/thread_registry.cc b/runtime/vm/thread_registry.cc
index bb02973..2052d4a 100644
--- a/runtime/vm/thread_registry.cc
+++ b/runtime/vm/thread_registry.cc
@@ -99,6 +99,7 @@
   while (thread != NULL) {
     if (!thread->BypassSafepoints()) {
       thread->MarkingStackAcquire();
+      thread->DeferredMarkingStackAcquire();
     }
     thread = thread->next_;
   }
@@ -110,6 +111,7 @@
   while (thread != NULL) {
     if (!thread->BypassSafepoints()) {
       thread->MarkingStackRelease();
+      thread->DeferredMarkingStackRelease();
     }
     thread = thread->next_;
   }
@@ -190,7 +192,7 @@
 
 void ThreadRegistry::ReturnToFreelistLocked(Thread* thread) {
   ASSERT(thread != NULL);
-  ASSERT(thread->os_thread_ == NULL);
+  ASSERT(thread->os_thread() == NULL);
   ASSERT(thread->isolate_ == NULL);
   ASSERT(thread->heap_ == NULL);
   ASSERT(threads_lock()->IsOwnedByCurrentThread());
diff --git a/runtime/vm/thread_registry.h b/runtime/vm/thread_registry.h
index 2d6ad35..fda9474 100644
--- a/runtime/vm/thread_registry.h
+++ b/runtime/vm/thread_registry.h
@@ -83,6 +83,7 @@
 
   friend class Isolate;
   friend class SafepointHandler;
+  friend class Scavenger;
   DISALLOW_COPY_AND_ASSIGN(ThreadRegistry);
 };
 
diff --git a/runtime/vm/thread_stack_resource.cc b/runtime/vm/thread_stack_resource.cc
new file mode 100644
index 0000000..69faf94
--- /dev/null
+++ b/runtime/vm/thread_stack_resource.cc
@@ -0,0 +1,26 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/thread_stack_resource.h"
+
+#include "platform/assert.h"
+#include "vm/isolate.h"
+#include "vm/thread.h"
+#include "vm/zone.h"
+
+namespace dart {
+
+ThreadStackResource::~ThreadStackResource() {
+#if defined(DEBUG)
+  if (thread() != nullptr) {
+    BaseIsolate::AssertCurrent(reinterpret_cast<BaseIsolate*>(isolate()));
+  }
+#endif
+}
+
+Isolate* ThreadStackResource::isolate() const {
+  return thread()->isolate();
+}
+
+}  // namespace dart
diff --git a/runtime/vm/thread_stack_resource.h b/runtime/vm/thread_stack_resource.h
new file mode 100644
index 0000000..abbf521
--- /dev/null
+++ b/runtime/vm/thread_stack_resource.h
@@ -0,0 +1,32 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_THREAD_STACK_RESOURCE_H_
+#define RUNTIME_VM_THREAD_STACK_RESOURCE_H_
+
+#include "vm/allocation.h"
+#include "vm/globals.h"
+
+namespace dart {
+
+class Isolate;
+class ThreadState;
+class Thread;
+
+class ThreadStackResource : public StackResource {
+ public:
+  explicit ThreadStackResource(Thread* T)
+      : StackResource(reinterpret_cast<ThreadState*>(T)) {}
+
+  ~ThreadStackResource();
+
+  Thread* thread() const {
+    return reinterpret_cast<Thread*>(StackResource::thread());
+  }
+  Isolate* isolate() const;
+};
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_THREAD_STACK_RESOURCE_H_
diff --git a/runtime/vm/thread_state.cc b/runtime/vm/thread_state.cc
new file mode 100644
index 0000000..d5e37e3
--- /dev/null
+++ b/runtime/vm/thread_state.cc
@@ -0,0 +1,41 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/thread_state.h"
+
+#include "vm/zone.h"
+
+namespace dart {
+
+ThreadState::ThreadState(bool is_os_thread) : BaseThread(is_os_thread) {
+  // This thread should not yet own any zones. If it does, we need to make sure
+  // we've accounted for any memory it has already allocated.
+  if (zone_ == nullptr) {
+    ASSERT(current_zone_capacity_ == 0);
+  } else {
+    Zone* current = zone_;
+    uintptr_t total_zone_capacity = 0;
+    while (current != nullptr) {
+      total_zone_capacity += current->CapacityInBytes();
+      current = current->previous();
+    }
+    ASSERT(current_zone_capacity_ == total_zone_capacity);
+  }
+}
+
+ThreadState::~ThreadState() {}
+
+bool ThreadState::ZoneIsOwnedByThread(Zone* zone) const {
+  ASSERT(zone != nullptr);
+  Zone* current = zone_;
+  while (current != nullptr) {
+    if (current == zone) {
+      return true;
+    }
+    current = current->previous();
+  }
+  return false;
+}
+
+}  // namespace dart
diff --git a/runtime/vm/thread_state.h b/runtime/vm/thread_state.h
new file mode 100644
index 0000000..85106d2
--- /dev/null
+++ b/runtime/vm/thread_state.h
@@ -0,0 +1,91 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_THREAD_STATE_H_
+#define RUNTIME_VM_THREAD_STATE_H_
+
+#include "vm/os_thread.h"
+
+namespace dart {
+
+class LongJumpScope;
+class Zone;
+
+// ThreadState is a container for auxiliary thread-local state: e.g. it
+// owns a stack of Zones for allocation and a stack of StackResources
+// for stack unwinding.
+//
+// Important: this class is shared between compiler and runtime and
+// as such it should not expose any runtime internals due to layering
+// restrictions.
+class ThreadState : public BaseThread {
+ public:
+  // The currently executing thread, or NULL if not yet initialized.
+  static ThreadState* Current() {
+#if defined(HAS_C11_THREAD_LOCAL)
+    return OSThread::CurrentVMThread();
+#else
+    BaseThread* thread = OSThread::GetCurrentTLS();
+    if (thread == NULL || thread->is_os_thread()) {
+      return NULL;
+    }
+    return static_cast<ThreadState*>(thread);
+#endif
+  }
+
+  explicit ThreadState(bool is_os_thread);
+  ~ThreadState();
+
+  // OSThread corresponding to this thread.
+  OSThread* os_thread() const { return os_thread_; }
+  void set_os_thread(OSThread* os_thread) { os_thread_ = os_thread; }
+
+  // The topmost zone used for allocation in this thread.
+  Zone* zone() const { return zone_; }
+
+  bool ZoneIsOwnedByThread(Zone* zone) const;
+
+  void IncrementMemoryCapacity(uintptr_t value) {
+    current_zone_capacity_ += value;
+    if (current_zone_capacity_ > zone_high_watermark_) {
+      zone_high_watermark_ = current_zone_capacity_;
+    }
+  }
+
+  void DecrementMemoryCapacity(uintptr_t value) {
+    ASSERT(current_zone_capacity_ >= value);
+    current_zone_capacity_ -= value;
+  }
+
+  uintptr_t current_zone_capacity() const { return current_zone_capacity_; }
+  uintptr_t zone_high_watermark() const { return zone_high_watermark_; }
+
+  void ResetHighWatermark() { zone_high_watermark_ = current_zone_capacity_; }
+
+  StackResource* top_resource() const { return top_resource_; }
+  void set_top_resource(StackResource* value) { top_resource_ = value; }
+  static intptr_t top_resource_offset() {
+    return OFFSET_OF(ThreadState, top_resource_);
+  }
+
+  LongJumpScope* long_jump_base() const { return long_jump_base_; }
+  void set_long_jump_base(LongJumpScope* value) { long_jump_base_ = value; }
+
+ private:
+  void set_zone(Zone* zone) { zone_ = zone; }
+
+  OSThread* os_thread_ = nullptr;
+  Zone* zone_ = nullptr;
+  uintptr_t current_zone_capacity_ = 0;
+  uintptr_t zone_high_watermark_ = 0;
+  StackResource* top_resource_ = nullptr;
+  LongJumpScope* long_jump_base_ = nullptr;
+
+  friend class ApiZone;
+  friend class StackZone;
+};
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_THREAD_STATE_H_
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index b0687de..d71628e 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -8,6 +8,7 @@
 #include "vm/lockers.h"
 #include "vm/profiler.h"
 #include "vm/stack_frame.h"
+#include "vm/symbols.h"
 #include "vm/thread_pool.h"
 #include "vm/unit_test.h"
 
@@ -387,6 +388,143 @@
   EXPECT_STREQ("foo", orig_str);
 }
 
+// A helper thread that repeatedly reads ICData
+class ICDataTestTask : public ThreadPool::Task {
+ public:
+  static const intptr_t kTaskCount;
+
+  ICDataTestTask(Isolate* isolate,
+                 const Array& ic_datas,
+                 Monitor* monitor,
+                 intptr_t* exited,
+                 bool* done)
+      : isolate_(isolate),
+        ic_datas_(ic_datas),
+        len_(ic_datas.Length()),
+        monitor_(monitor),
+        exited_(exited),
+        done_(done) {}
+
+  virtual void Run() {
+    Thread::EnterIsolateAsHelper(isolate_, Thread::kUnknownTask);
+
+    Thread* thread = Thread::Current();
+
+    {
+      StackZone stack_zone(thread);
+      HANDLESCOPE(thread);
+
+      ICData& ic_data = ICData::Handle();
+      Array& arr = Array::Handle();
+      while (true) {
+        for (intptr_t cnt = 0; cnt < 0x1000; cnt++) {
+          for (intptr_t i = 0; i < len_; i++) {
+            ic_data ^= ic_datas_.AtAcquire(i);
+            arr = ic_data.ic_data();
+            intptr_t num_checks = arr.Length() / 3;
+            if (num_checks < 0 || num_checks > 5) {
+              OS::PrintErr("Failure: %" Pd " checks!\n", num_checks);
+              abort();
+            }
+          }
+        }
+
+        if (AtomicOperations::LoadAcquire(done_)) {
+          break;
+        }
+
+        TransitionVMToBlocked blocked(thread);
+      }
+    }
+
+    Thread::ExitIsolateAsHelper();
+    {
+      MonitorLocker ml(monitor_);
+      ++*exited_;
+      ml.Notify();
+    }
+  }
+
+ private:
+  Isolate* isolate_;
+  const Array& ic_datas_;
+  const intptr_t len_;
+  Monitor* monitor_;
+  intptr_t* exited_;  // # tasks that are no longer running.
+  bool* done_;        // Signal that helper threads can stop working.
+};
+
+static Function* CreateFunction(const char* name) {
+  const String& class_name =
+      String::Handle(Symbols::New(Thread::Current(), "ownerClass"));
+  const Script& script = Script::Handle();
+  const Library& lib = Library::Handle(Library::New(class_name));
+  const Class& owner_class = Class::Handle(
+      Class::New(lib, class_name, script, TokenPosition::kNoSource));
+  const String& function_name =
+      String::ZoneHandle(Symbols::New(Thread::Current(), name));
+  Function& function = Function::ZoneHandle(Function::New(
+      function_name, RawFunction::kRegularFunction, true, false, false, false,
+      false, owner_class, TokenPosition::kNoSource));
+  return &function;
+}
+
+const intptr_t ICDataTestTask::kTaskCount = 1;
+
+// Test that checks that other threads only see a fully initialized ICData
+// whenever ICData is updated.
+ISOLATE_UNIT_TEST_CASE(ICDataTest) {
+  Isolate* isolate = thread->isolate();
+  USE(isolate);
+  Monitor monitor;
+  intptr_t exited = 0;
+  bool done = false;
+
+  const intptr_t kNumICData = 0x10;
+
+  const Array& ic_datas = Array::Handle(Array::New(kNumICData));
+  ICData& ic_data = ICData::Handle();
+  Function& owner = *CreateFunction("DummyFunction");
+  String& name = String::Handle(String::New("foo"));
+  const Array& args_desc =
+      Array::Handle(ArgumentsDescriptor::New(0, 0, Object::empty_array()));
+  for (intptr_t i = 0; i < kNumICData; i++) {
+    ic_data = ICData::New(owner, name, args_desc, /*deopt_id=*/0,
+                          /*num_args_tested=*/1, ICData::kInstance,
+                          Object::null_abstract_type());
+    ic_datas.SetAtRelease(i, ic_data);
+  }
+
+  for (int i = 0; i < ICDataTestTask::kTaskCount; i++) {
+    Dart::thread_pool()->Run(
+        new ICDataTestTask(isolate, ic_datas, &monitor, &exited, &done));
+  }
+
+  for (int i = 0; i < 0x10000; i++) {
+    for (intptr_t i = 0; i < kNumICData; i++) {
+      ic_data ^= ic_datas.At(i);
+      if (ic_data.NumberOfChecks() < 4) {
+        ic_data.AddReceiverCheck(kInstanceCid + ic_data.NumberOfChecks(), owner,
+                                 1);
+      } else {
+        ic_data = ICData::New(owner, name, args_desc, /*deopt_id=*/0,
+                              /*num_args_tested=*/1, ICData::kInstance,
+                              Object::null_abstract_type());
+        ic_datas.SetAtRelease(i, ic_data);
+      }
+    }
+  }
+  // Ensure we looped long enough to allow all helpers to succeed and exit.
+  {
+    AtomicOperations::StoreRelease(&done, true);
+    MonitorLocker ml(&monitor);
+    while (exited != ICDataTestTask::kTaskCount) {
+      ml.Wait();
+    }
+    EXPECT_EQ(ICDataTestTask::kTaskCount, exited);
+  }
+}
+
 // A helper thread that alternatingly cooperates and organizes
 // safepoint rendezvous. At rendezvous, it explicitly visits the
 // stacks looking for a specific marker (Smi) to verify that the expected
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index 000e759..e343cdd 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -1540,7 +1540,7 @@
     OSThread* os_thread = OSThread::Current();
     ASSERT(os_thread != NULL);
     intptr_t tid = OSThread::ThreadIdToIntPtr(os_thread->id());
-    OS::PrintErr("StartEvent in block %p for thread %" Px "\n", this, tid);
+    OS::PrintErr("StartEvent in block %p for thread %" Pd "\n", this, tid);
   }
   return &events_[length_++];
 }
diff --git a/runtime/vm/timeline_analysis.cc b/runtime/vm/timeline_analysis.cc
index cb02834..10e9c47 100644
--- a/runtime/vm/timeline_analysis.cc
+++ b/runtime/vm/timeline_analysis.cc
@@ -36,7 +36,7 @@
 void TimelineAnalysisThread::Finalize() {
   blocks_.Sort(CompareBlocksLowerTimeBound);
   if (FLAG_trace_timeline_analysis) {
-    THR_Print("Thread %" Px " has %" Pd " blocks\n",
+    THR_Print("Thread %" Pd " has %" Pd " blocks\n",
               OSThread::ThreadIdToIntPtr(id_), blocks_.length());
   }
 }
@@ -255,7 +255,7 @@
   }
   TimelineAnalysisThread* thread = GetThread(tid);
   if (thread == NULL) {
-    SetError("Thread %" Px " does not exist.", OSThread::ThreadIdToIntPtr(tid));
+    SetError("Thread %" Pd " does not exist.", OSThread::ThreadIdToIntPtr(tid));
     return;
   }
   ProcessThread(thread);
@@ -305,7 +305,7 @@
 
   TimelineAnalysisThreadEventIterator it(thread);
   if (FLAG_trace_timeline_analysis) {
-    THR_Print(">>> TimelinePauses::ProcessThread %" Px "\n",
+    THR_Print(">>> TimelinePauses::ProcessThread %" Pd "\n",
               OSThread::ThreadIdToIntPtr(thread->id()));
   }
   intptr_t event_count = 0;
@@ -341,7 +341,7 @@
   // Pop remaining duration stack.
   PopFinishedDurations(kMaxInt64);
   if (FLAG_trace_timeline_analysis) {
-    THR_Print("<<< TimelinePauses::ProcessThread %" Px " had %" Pd " events\n",
+    THR_Print("<<< TimelinePauses::ProcessThread %" Pd " had %" Pd " events\n",
               OSThread::ThreadIdToIntPtr(thread->id()), event_count);
   }
 }
@@ -514,7 +514,7 @@
     TimelineAnalysisThread* tat = pauses.At(t_idx);
     ASSERT(tat != NULL);
     pauses.CalculatePauseTimesForThread(tat->id());
-    THR_Print("Thread %" Pd " (%" Px "):\n", t_idx,
+    THR_Print("Thread %" Pd " (%" Pd "):\n", t_idx,
               OSThread::ThreadIdToIntPtr(tat->id()));
     for (intptr_t j = 0; j < pauses.NumPauseInfos(); j++) {
       const TimelineLabelPauseInfo* pause_info = pauses.PauseInfoAt(j);
diff --git a/runtime/vm/token.h b/runtime/vm/token.h
index adb0fba..ff8c682 100644
--- a/runtime/vm/token.h
+++ b/runtime/vm/token.h
@@ -322,6 +322,32 @@
     }
   }
 
+  // For a comparison operation return an operation for the equivalent flipped
+  // comparison: a (op) b === b (op') a.
+  static Token::Kind FlipComparison(Token::Kind op) {
+    switch (op) {
+      case Token::kEQ:
+        return Token::kEQ;
+      case Token::kNE:
+        return Token::kNE;
+      case Token::kLT:
+        return Token::kGT;
+      case Token::kGT:
+        return Token::kLT;
+      case Token::kLTE:
+        return Token::kGTE;
+      case Token::kGTE:
+        return Token::kLTE;
+      case Token::kEQ_STRICT:
+        return Token::kEQ_STRICT;
+      case Token::kNE_STRICT:
+        return Token::kNE_STRICT;
+      default:
+        UNREACHABLE();
+        return Token::kILLEGAL;
+    }
+  }
+
  private:
   static const char* name_[];
   static const char* tok_str_[];
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 2e635c1..bca4938 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -105,21 +105,19 @@
 
   if (type.raw() == Type::ObjectType() || type.raw() == Type::DynamicType() ||
       type.raw() == Type::VoidType()) {
-    return Code::InstructionsOf(StubCode::TopTypeTypeTest_entry()->code());
+    return StubCode::TopTypeTypeTest().instructions();
   }
 
   if (type.IsTypeRef()) {
-    return Code::InstructionsOf(StubCode::TypeRefTypeTest_entry()->code());
+    return StubCode::TypeRefTypeTest().instructions();
   }
 
   if (type.IsType() || type.IsTypeParameter()) {
     const bool should_specialize = !FLAG_precompiled_mode && lazy_specialize;
-    return Code::InstructionsOf(
-        should_specialize ? StubCode::LazySpecializeTypeTest_entry()->code()
-                          : StubCode::DefaultTypeTest_entry()->code());
+    return should_specialize ? StubCode::LazySpecializeTypeTest().instructions()
+                             : StubCode::DefaultTypeTest().instructions();
   } else {
-    ASSERT(type.IsBoundedType() || type.IsMixinAppType());
-    return Code::InstructionsOf(StubCode::UnreachableTypeTest_entry()->code());
+    return StubCode::UnreachableTypeTest().instructions();
   }
 }
 
@@ -145,15 +143,14 @@
   ASSERT(StubCode::HasBeenInitialized());
 
   if (type.IsTypeRef()) {
-    return Code::InstructionsOf(StubCode::TypeRefTypeTest_entry()->code());
+    return StubCode::TypeRefTypeTest().instructions();
   }
 
   if (type.raw() == Type::ObjectType() || type.raw() == Type::DynamicType()) {
-    return Code::InstructionsOf(StubCode::TopTypeTypeTest_entry()->code());
+    return StubCode::TopTypeTypeTest().instructions();
   }
 
   if (type.IsCanonical()) {
-    ASSERT(type.IsResolved());
     if (type.IsType()) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
       // Lazily create the type testing stubs array.
@@ -169,14 +166,13 @@
         array_.Add(instr_);
       } else {
         // Fall back to default.
-        instr_ =
-            Code::InstructionsOf(StubCode::DefaultTypeTest_entry()->code());
+        instr_ = StubCode::DefaultTypeTest().instructions();
       }
 #else
       // In the precompiled runtime we cannot lazily create new optimized type
       // testing stubs, so if we cannot find one, we'll just return the default
       // one.
-      instr_ = Code::InstructionsOf(StubCode::DefaultTypeTest_entry()->code());
+      instr_ = StubCode::DefaultTypeTest().instructions();
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
       return instr_.raw();
     }
@@ -200,23 +196,23 @@
 RawInstructions* TypeTestingStubFinder::LookupByAddresss(
     uword entry_point) const {
   // First test the 4 common ones:
-  code_ = StubCode::DefaultTypeTest_entry()->code();
+  code_ = StubCode::DefaultTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return code_.instructions();
   }
-  code_ = StubCode::LazySpecializeTypeTest_entry()->code();
+  code_ = StubCode::LazySpecializeTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return code_.instructions();
   }
-  code_ = StubCode::TopTypeTypeTest_entry()->code();
+  code_ = StubCode::TopTypeTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return code_.instructions();
   }
-  code_ = StubCode::TypeRefTypeTest_entry()->code();
+  code_ = StubCode::TypeRefTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return code_.instructions();
   }
-  code_ = StubCode::UnreachableTypeTest_entry()->code();
+  code_ = StubCode::UnreachableTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return code_.instructions();
   }
@@ -228,23 +224,23 @@
 const char* TypeTestingStubFinder::StubNameFromAddresss(
     uword entry_point) const {
   // First test the 4 common ones:
-  code_ = StubCode::DefaultTypeTest_entry()->code();
+  code_ = StubCode::DefaultTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return "TypeTestingStub_Default";
   }
-  code_ = StubCode::LazySpecializeTypeTest_entry()->code();
+  code_ = StubCode::LazySpecializeTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return "TypeTestingStub_LazySpecialize";
   }
-  code_ = StubCode::TopTypeTypeTest_entry()->code();
+  code_ = StubCode::TopTypeTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return "TypeTestingStub_Top";
   }
-  code_ = StubCode::TypeRefTypeTest_entry()->code();
+  code_ = StubCode::TypeRefTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return "TypeTestingStub_Ref";
   }
-  code_ = StubCode::UnreachableTypeTest_entry()->code();
+  code_ = StubCode::UnreachableTypeTest().raw();
   if (entry_point == code_.EntryPoint()) {
     return "TypeTestingStub_Unreachable";
   }
@@ -345,13 +341,15 @@
   ASSERT(!type_class.IsNull());
 
   // To use the already-defined __ Macro !
-  ObjectPoolWrapper object_pool_wrapper;
-  Assembler assembler(&object_pool_wrapper);
+  Assembler assembler(nullptr);
   BuildOptimizedTypeTestStub(&assembler, hi, type, type_class);
 
   const char* name = namer_.StubNameForType(type);
-  const Code& code = Code::Handle(
-      Code::FinalizeCode(name, nullptr, &assembler, false /* optimized */));
+  const auto pool_attachment = FLAG_use_bare_instructions
+                                   ? Code::PoolAttachment::kNotAttachPool
+                                   : Code::PoolAttachment::kAttachPool;
+  const Code& code = Code::Handle(Code::FinalizeCode(
+      name, nullptr, &assembler, pool_attachment, false /* optimized */));
 #ifndef PRODUCT
   if (FLAG_support_disassembler && FLAG_disassemble_stubs) {
     LogBlock lb;
@@ -360,7 +358,9 @@
     code.Disassemble(&formatter);
     THR_Print("}\n");
     const ObjectPool& object_pool = ObjectPool::Handle(code.object_pool());
-    object_pool.DebugPrint();
+    if (!object_pool.IsNull()) {
+      object_pool.DebugPrint();
+    }
   }
 #endif  // !PRODUCT
 
@@ -401,7 +401,7 @@
     const CidRangeVector& ranges = hi->SubtypeRangesForClass(type_class);
 
     const Type& int_type = Type::Handle(Type::IntType());
-    const bool smi_is_ok = int_type.IsSubtypeOf(type, NULL, NULL, Heap::kNew);
+    const bool smi_is_ok = int_type.IsSubtypeOf(type, Heap::kNew);
 
     BuildOptimizedSubtypeRangeCheck(assembler, ranges, class_id_reg,
                                     instance_reg, smi_is_ok);
@@ -629,16 +629,16 @@
     if (cid != kDynamicCid) {
       const Class& instance_klass =
           Class::Handle(Isolate::Current()->class_table()->At(cid));
-      if (instance_klass.IsGeneric() &&
+      if (load_field->slot().IsTypeArguments() && instance_klass.IsGeneric() &&
           instance_klass.type_arguments_field_offset() ==
-              load_field->offset_in_bytes()) {
+              load_field->slot().offset_in_bytes()) {
         // This is a subset of Case c) above, namely forwarding the type
         // argument vector.
         //
         // We use the declaration type arguments for the instance creation,
         // which is a non-instantiated, expanded, type arguments vector.
-        const AbstractType& declaration_type =
-            AbstractType::Handle(instance_klass.DeclarationType());
+        const Type& declaration_type =
+            Type::Handle(instance_klass.DeclarationType());
         TypeArguments& declaration_type_args =
             TypeArguments::Handle(declaration_type.arguments());
         type_usage_info->UseTypeArgumentsInInstanceCreation(
@@ -651,12 +651,12 @@
     // where we forward the type argument vector to object allocation.
     //
     // Theoretically this could be a false-positive, which is still ok, but
-    // practically it's guranteed that this is a forward of a type argument
+    // practically it's guaranteed that this is a forward of a type argument
     // vector passed in by the caller.
     if (function.IsFactory()) {
       const Class& enclosing_class = Class::Handle(function.Owner());
-      const AbstractType& declaration_type =
-          AbstractType::Handle(enclosing_class.DeclarationType());
+      const Type& declaration_type =
+          Type::Handle(enclosing_class.DeclarationType());
       TypeArguments& declaration_type_args =
           TypeArguments::Handle(declaration_type.arguments());
       type_usage_info->UseTypeArgumentsInInstanceCreation(
@@ -748,7 +748,7 @@
 }
 
 TypeUsageInfo::TypeUsageInfo(Thread* thread)
-    : StackResource(thread),
+    : ThreadStackResource(thread),
       zone_(thread->zone()),
       finder_(zone_),
       assert_assignable_types_(),
@@ -994,7 +994,7 @@
   if (type.IsTypeRef()) {
     dereferenced_type = &AbstractType::Handle(TypeRef::Cast(type).type());
   }
-  if (dereferenced_type->IsResolved() && dereferenced_type->IsFinalized()) {
+  if (dereferenced_type->IsFinalized()) {
     return assert_assignable_types_.HasKey(dereferenced_type);
   }
   return false;
diff --git a/runtime/vm/type_testing_stubs.h b/runtime/vm/type_testing_stubs.h
index b1dac5a..e8c7044 100644
--- a/runtime/vm/type_testing_stubs.h
+++ b/runtime/vm/type_testing_stubs.h
@@ -10,6 +10,8 @@
 
 namespace dart {
 
+class ObjectPoolWrapper;
+
 class TypeTestingStubNamer {
  public:
   TypeTestingStubNamer();
@@ -266,9 +268,6 @@
         }
       }
       return true;
-    } else if (type.IsBoundedType()) {
-      // No support for bounded types.
-      return false;
     }
     UNREACHABLE();
     return false;
@@ -318,7 +317,7 @@
 };
 
 // Collects data on how [Type] objects are used in generated code.
-class TypeUsageInfo : public StackResource {
+class TypeUsageInfo : public ThreadStackResource {
  public:
   explicit TypeUsageInfo(Thread* thread);
   ~TypeUsageInfo();
diff --git a/runtime/vm/unicode.cc b/runtime/vm/unicode.cc
index e051320..a3b4fb9 100644
--- a/runtime/vm/unicode.cc
+++ b/runtime/vm/unicode.cc
@@ -280,6 +280,31 @@
   *dst = ch;
   return i;
 }
+intptr_t Utf8::ReportInvalidByte(const uint8_t* utf8_array,
+                                 intptr_t array_len,
+                                 intptr_t len) {
+  intptr_t i = 0;
+  intptr_t j = 0;
+  intptr_t num_bytes;
+  for (; (i < array_len) && (j < len); i += num_bytes, ++j) {
+    int32_t ch;
+    bool is_supplementary = IsSupplementarySequenceStart(utf8_array[i]);
+    num_bytes = Utf8::Decode(&utf8_array[i], (array_len - i), &ch);
+    if (ch == -1) {
+      break;  // Invalid input.
+    }
+    if (is_supplementary) {
+      j = j + 1;
+    }
+  }
+  OS::PrintErr("Invalid UTF8 sequence encountered, ");
+  for (intptr_t idx = 0; idx < 10 && (i + idx) < array_len; idx++) {
+    OS::PrintErr("(Error Code: %X + idx: %" Pd " )", utf8_array[idx + i],
+                 (idx + i));
+  }
+  OS::PrintErr("\n");
+  return i;
+}
 
 bool Utf8::DecodeToLatin1(const uint8_t* utf8_array,
                           intptr_t array_len,
diff --git a/runtime/vm/unicode.h b/runtime/vm/unicode.h
index 23b64b7..d2050be 100644
--- a/runtime/vm/unicode.h
+++ b/runtime/vm/unicode.h
@@ -74,6 +74,9 @@
                             intptr_t array_len,
                             int32_t* dst,
                             intptr_t len);
+  static intptr_t ReportInvalidByte(const uint8_t* utf8_array,
+                                    intptr_t array_len,
+                                    intptr_t len);
   static bool DecodeCStringToUTF32(const char* str, int32_t* dst, intptr_t len);
 
   static const int32_t kMaxOneByteChar = 0x7F;
diff --git a/runtime/vm/unicode_test.cc b/runtime/vm/unicode_test.cc
index b8807f1..bfd4f0a 100644
--- a/runtime/vm/unicode_test.cc
+++ b/runtime/vm/unicode_test.cc
@@ -27,6 +27,40 @@
   }
 }
 
+ISOLATE_UNIT_TEST_CASE(Utf8InvalidByte) {
+  {
+    uint8_t array[] = {0x41, 0xF0, 0x92};
+    intptr_t encode_len = 3;
+    intptr_t decode_len = 3;
+    intptr_t pos = Utf8::ReportInvalidByte(array, encode_len, decode_len);
+    EXPECT(pos == 1);
+  }
+
+  {
+    uint8_t array[] = {0x81, 0x40, 0x42};
+    intptr_t encode_len = 3;
+    intptr_t decode_len = 3;
+    intptr_t pos = Utf8::ReportInvalidByte(array, encode_len, decode_len);
+    EXPECT(pos == 0);
+  }
+
+  {
+    uint8_t array[] = {0x42, 0x40, 0x80};
+    intptr_t encode_len = 3;
+    intptr_t decode_len = 3;
+    intptr_t pos = Utf8::ReportInvalidByte(array, encode_len, decode_len);
+    EXPECT(pos == 2);
+  }
+
+  {
+    uint8_t array[] = {0x41, 0xF0, 0x92, 0x92, 0x91};
+    intptr_t encode_len = 5;
+    intptr_t decode_len = 2;
+    intptr_t pos = Utf8::ReportInvalidByte(array, encode_len, decode_len);
+    EXPECT(pos == encode_len);
+  }
+}
+
 ISOLATE_UNIT_TEST_CASE(Utf8Decode) {
   // Examples from the Unicode specification, chapter 3
   {
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index ed188dd..50e55a0 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -663,16 +663,13 @@
 
   Object& val = Object::Handle();
   if (!KernelIsolate::IsRunning()) {
-    val = lib.Evaluate(expr, param_names, param_values);
+    UNREACHABLE();
   } else {
-    Dart_KernelCompilationResult compilation_result;
-    {
-      TransitionVMToNative transition(thread);
-      compilation_result = KernelIsolate::CompileExpressionToKernel(
-          expr.ToCString(), param_names, Array::empty_array(),
-          String::Handle(lib.url()).ToCString(), /* klass=*/nullptr,
-          /* is_static= */ false);
-    }
+    Dart_KernelCompilationResult compilation_result =
+        KernelIsolate::CompileExpressionToKernel(
+            expr.ToCString(), param_names, Array::empty_array(),
+            String::Handle(lib.url()).ToCString(), /* klass=*/nullptr,
+            /* is_static= */ false);
     if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
       return Dart_NewApiError(compilation_result.error);
     }
@@ -711,7 +708,8 @@
   Function& function = Function::ZoneHandle(
       Function::New(function_name, RawFunction::kRegularFunction, true, false,
                     false, false, false, cls, TokenPosition::kMinSource));
-  code_ = Code::FinalizeCode(function, nullptr, assembler_);
+  code_ = Code::FinalizeCode(function, nullptr, assembler_,
+                             Code::PoolAttachment::kAttachPool);
   code_.set_owner(function);
   code_.set_exception_handlers(Object::empty_exception_handlers());
 #ifndef PRODUCT
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 81a23cf..6c53746 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -64,8 +64,10 @@
     TestIsolateScope __test_isolate__;                                         \
     Thread* __thread__ = Thread::Current();                                    \
     ASSERT(__thread__->isolate() == __test_isolate__.isolate());               \
+    TransitionNativeToVM transition1(__thread__);                              \
     StackZone __zone__(__thread__);                                            \
     HandleScope __hs__(__thread__);                                            \
+    TransitionVMToNative transition2(__thread__);                              \
     Dart_TestHelper##name(__thread__);                                         \
   }                                                                            \
   static void Dart_TestHelper##name(Thread* thread)
diff --git a/runtime/vm/uri.cc b/runtime/vm/uri.cc
index 67fbcbf..5e75ef1 100644
--- a/runtime/vm/uri.cc
+++ b/runtime/vm/uri.cc
@@ -80,7 +80,7 @@
 
 static char* NormalizeEscapes(const char* str, intptr_t len) {
   // Allocate the buffer.
-  Zone* zone = Thread::Current()->zone();
+  Zone* zone = ThreadState::Current()->zone();
   // We multiply len by three because a percent-escape sequence is
   // three characters long (e.g. ' ' -> '%20).  +1 for '\0'.  We could
   // take two passes through the string and avoid the excess
@@ -156,7 +156,7 @@
 }
 
 static intptr_t ParseAuthority(const char* authority, ParsedUri* parsed_uri) {
-  Zone* zone = Thread::Current()->zone();
+  Zone* zone = ThreadState::Current()->zone();
   const char* current = authority;
   intptr_t len = 0;
 
@@ -191,7 +191,7 @@
 // Performs a simple parse of a uri into its components.
 // See RFC 3986 Section 3: Syntax.
 bool ParseUri(const char* uri, ParsedUri* parsed_uri) {
-  Zone* zone = Thread::Current()->zone();
+  Zone* zone = ThreadState::Current()->zone();
 
   // The first ':' separates the scheme from the rest of the uri.  If
   // a ':' occurs after the first '/' it doesn't count.
@@ -284,7 +284,7 @@
 
   // The output path will always be less than or equal to the size of
   // the input path.
-  Zone* zone = Thread::Current()->zone();
+  Zone* zone = ThreadState::Current()->zone();
   char* buffer = zone->Alloc<char>(strlen(path) + 1);  // +1 for '\0'
   char* output = buffer;
 
@@ -342,7 +342,7 @@
 
 // See RFC 3986 Section 5.2.3: Merge Paths.
 static const char* MergePaths(const char* base_path, const char* ref_path) {
-  Zone* zone = Thread::Current()->zone();
+  Zone* zone = ThreadState::Current()->zone();
   if (base_path[0] == '\0') {
     // If the base_path is empty, we prepend '/'.
     return zone->PrintToString("/%s", ref_path);
@@ -378,7 +378,7 @@
 }
 
 static char* BuildUri(const ParsedUri& uri) {
-  Zone* zone = Thread::Current()->zone();
+  Zone* zone = ThreadState::Current()->zone();
   ASSERT(uri.path != NULL);
 
   const char* fragment = uri.fragment == NULL ? "" : uri.fragment;
@@ -436,7 +436,7 @@
   ParsedUri target;
   if (ref.scheme != NULL) {
     if (strcmp(ref.scheme, "dart") == 0) {
-      Zone* zone = Thread::Current()->zone();
+      Zone* zone = ThreadState::Current()->zone();
       *target_uri = zone->MakeCopyOfString(ref_uri);
       return true;
     }
@@ -461,7 +461,7 @@
   }
 
   if ((base.scheme != NULL) && strcmp(base.scheme, "dart") == 0) {
-    Zone* zone = Thread::Current()->zone();
+    Zone* zone = ThreadState::Current()->zone();
     *target_uri = zone->MakeCopyOfString(ref_uri);
     return true;
   }
diff --git a/runtime/vm/v8_snapshot_writer.cc b/runtime/vm/v8_snapshot_writer.cc
new file mode 100644
index 0000000..2ddd3e0
--- /dev/null
+++ b/runtime/vm/v8_snapshot_writer.cc
@@ -0,0 +1,289 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#if defined(DART_PRECOMPILER)
+
+#include "vm/v8_snapshot_writer.h"
+
+#include "vm/dart.h"
+#include "vm/os.h"
+
+namespace dart {
+
+const char* ZoneString(Zone* Z, const char* str) {
+  const intptr_t len = strlen(str) + 1;
+  char* dest = Z->Alloc<char>(len);
+  snprintf(dest, len, "%s", str);
+  return dest;
+}
+
+V8SnapshotProfileWriter::V8SnapshotProfileWriter(Zone* zone)
+    : zone_(zone),
+      node_types_(zone_),
+      edge_types_(zone_),
+      strings_(zone),
+      roots_(zone_, 100) {
+  node_types_.Insert({"Unknown", kUnknown});
+  node_types_.Insert({"ArtificialRoot", kArtificialRoot});
+
+  edge_types_.Insert({"context", kContext});
+  edge_types_.Insert({"element", kElement});
+  edge_types_.Insert({"property", kProperty});
+  edge_types_.Insert({"internal", kInternal});
+  edge_types_.Insert({"hidden", kHidden});
+  edge_types_.Insert({"shortcut", kShortcut});
+  edge_types_.Insert({"weak", kWeak});
+  edge_types_.Insert({"extra", kExtra});
+
+  strings_.Insert({"<unknown>", kUnknownString});
+  strings_.Insert({"<object>", kObjectString});
+  strings_.Insert({"<property>", kPropertyString});
+  strings_.Insert({"<artificial root>", kArtificialRootString});
+}
+
+void V8SnapshotProfileWriter::SetObjectTypeAndName(ObjectId object_id,
+                                                   const char* type,
+                                                   const char* name) {
+  ASSERT(type != nullptr);
+  NodeInfo* info = EnsureId(object_id);
+
+  if (!node_types_.HasKey(type)) {
+    node_types_.Insert({ZoneString(zone_, type), node_types_.Size()});
+  }
+
+  intptr_t type_id = node_types_.LookupValue(type);
+  ASSERT(info->type == kUnknown || info->type == type_id);
+  info->type = type_id;
+
+  if (name != nullptr) {
+    info->name = EnsureString(OS::SCreate(zone_, "[%s] %s", type, name));
+  } else {
+    info->name = EnsureString(type);
+  }
+}
+
+void V8SnapshotProfileWriter::AttributeBytesTo(ObjectId object_id,
+                                               size_t num_bytes) {
+  EnsureId(object_id)->self_size += num_bytes;
+}
+
+void V8SnapshotProfileWriter::AttributeReferenceTo(ObjectId object_id,
+                                                   Reference reference) {
+  EnsureId(reference.to_object_id);
+  NodeInfo* info = EnsureId(object_id);
+
+  ASSERT(reference.offset_or_name >= 0);
+  info->edges->Add({
+      static_cast<intptr_t>(reference.reference_type == Reference::kElement
+                                ? kElement
+                                : kProperty),
+      reference.offset_or_name,
+      reference.to_object_id,
+  });
+  ++edge_count_;
+}
+
+V8SnapshotProfileWriter::NodeInfo V8SnapshotProfileWriter::DefaultNode(
+    ObjectId object_id) {
+  return {
+      kUnknown,
+      kUnknownString,
+      object_id,
+      0,
+      new (zone_) ZoneGrowableArray<EdgeInfo>(zone_, 0),
+      -1,
+  };
+}
+
+V8SnapshotProfileWriter::NodeInfo V8SnapshotProfileWriter::ArtificialRoot() {
+  return {
+      kArtificialRoot, kArtificialRootString, {kArtificial, 0}, 0, nullptr, 0,
+  };
+}
+
+V8SnapshotProfileWriter::NodeInfo* V8SnapshotProfileWriter::EnsureId(
+    ObjectId object_id) {
+  if (!nodes_.HasKey(object_id)) {
+    NodeInfo info = DefaultNode(object_id);
+    nodes_.Insert({object_id, info});
+  }
+  return &nodes_.Lookup(object_id)->value;
+}
+
+intptr_t V8SnapshotProfileWriter::EnsureString(const char* str) {
+  if (!strings_.HasKey(str)) {
+    strings_.Insert({ZoneString(zone_, str), strings_.Size()});
+    return strings_.Size() - 1;
+  }
+  return strings_.LookupValue(str);
+}
+
+void V8SnapshotProfileWriter::WriteNodeInfo(JSONWriter* writer,
+                                            const NodeInfo& info) {
+  writer->PrintValue(info.type);
+  writer->PrintValue(info.name);
+  writer->PrintValue(NodeIdFor(info.id));
+  writer->PrintValue(info.self_size);
+  // The artificial root has 'nullptr' edges, it actually points to all the
+  // roots.
+  writer->PrintValue64(info.edges != nullptr ? info.edges->length()
+                                             : roots_.length());
+  writer->PrintNewline();
+}
+
+void V8SnapshotProfileWriter::WriteEdgeInfo(JSONWriter* writer,
+                                            const EdgeInfo& info) {
+  writer->PrintValue64(info.type);
+  writer->PrintValue64(info.name_or_index);
+  writer->PrintValue64(nodes_.LookupValue(info.to_node).offset);
+  writer->PrintNewline();
+}
+
+void V8SnapshotProfileWriter::AddRoot(ObjectId object_id) {
+  EnsureId(object_id);
+  roots_.Add(object_id);
+}
+
+void V8SnapshotProfileWriter::WriteStringsTable(
+    JSONWriter* writer,
+    const DirectChainedHashMap<StringToIntMapTraits>& map) {
+  const char** strings = zone_->Alloc<const char*>(map.Size());
+  StringToIntMapTraits::Pair* pair = nullptr;
+  auto it = map.GetIterator();
+  while ((pair = it.Next()) != nullptr) {
+    ASSERT(pair->value >= 0 && pair->value < map.Size());
+    strings[pair->value] = pair->key;
+  }
+  for (intptr_t i = 0; i < map.Size(); ++i) {
+    writer->PrintValue(strings[i]);
+    writer->PrintNewline();
+  }
+}
+
+void V8SnapshotProfileWriter::Write(JSONWriter* writer) {
+  writer->OpenObject();
+
+  writer->OpenObject("snapshot");
+  {
+    writer->OpenObject("meta");
+
+    {
+      writer->OpenArray("node_fields");
+      writer->PrintValue("type");
+      writer->PrintValue("name");
+      writer->PrintValue("id");
+      writer->PrintValue("self_size");
+      writer->PrintValue("edge_count");
+      writer->CloseArray();
+    }
+
+    {
+      writer->OpenArray("node_types");
+      {
+        writer->OpenArray();
+        WriteStringsTable(writer, node_types_);
+        writer->CloseArray();
+      }
+      writer->CloseArray();
+    }
+
+    {
+      writer->OpenArray("edge_fields");
+      writer->PrintValue("type");
+      writer->PrintValue("name_or_index");
+      writer->PrintValue("to_node");
+      writer->CloseArray();
+    }
+
+    {
+      writer->OpenArray("edge_types");
+      {
+        writer->OpenArray();
+        WriteStringsTable(writer, edge_types_);
+        writer->CloseArray();
+      }
+      writer->CloseArray();
+    }
+
+    writer->CloseObject();
+
+    writer->PrintProperty64("node_count",
+                            nodes_.Size() + 1 /* artificial root */);
+    writer->PrintProperty64("edge_count", edge_count_ + roots_.length());
+  }
+  writer->CloseObject();
+
+  {
+    writer->OpenArray("nodes");
+    // Write the artificial root node.
+    WriteNodeInfo(writer, ArtificialRoot());
+    intptr_t offset = kNumNodeFields;
+    ObjectIdToNodeInfoTraits::Pair* entry = nullptr;
+    auto it = nodes_.GetIterator();
+    while ((entry = it.Next()) != nullptr) {
+      ASSERT(entry->key == entry->value.id);
+      entry->value.offset = offset;
+      WriteNodeInfo(writer, entry->value);
+      offset += kNumNodeFields;
+    }
+    writer->CloseArray();
+  }
+
+  {
+    writer->OpenArray("edges");
+
+    // Write references from the artificial root to the actual roots.
+    for (intptr_t i = 0; i < roots_.length(); ++i) {
+      WriteEdgeInfo(writer, {kElement, i, roots_[i]});
+    }
+
+    ObjectIdToNodeInfoTraits::Pair* entry = nullptr;
+    auto it = nodes_.GetIterator();
+    while ((entry = it.Next()) != nullptr) {
+      for (intptr_t i = 0; i < entry->value.edges->length(); ++i) {
+        WriteEdgeInfo(writer, entry->value.edges->At(i));
+      }
+    }
+
+    writer->CloseArray();
+  }
+
+  {
+    writer->OpenArray("strings");
+    WriteStringsTable(writer, strings_);
+    writer->CloseArray();
+  }
+
+  writer->CloseObject();
+}
+
+void V8SnapshotProfileWriter::Write(const char* filename) {
+  JSONWriter json;
+  Write(&json);
+
+  auto file_open = Dart::file_open_callback();
+  auto file_write = Dart::file_write_callback();
+  auto file_close = Dart::file_close_callback();
+  if ((file_open == nullptr) || (file_write == nullptr) ||
+      (file_close == nullptr)) {
+    OS::PrintErr("Could not access file callbacks to write snapshot profile.");
+    return;
+  }
+
+  auto file = file_open(filename, /*write=*/true);
+  if (file == nullptr) {
+    OS::PrintErr("Failed to open file %s\n", filename);
+  } else {
+    char* output = nullptr;
+    intptr_t output_length = 0;
+    json.Steal(&output, &output_length);
+    file_write(output, output_length, file);
+    free(output);
+    file_close(file);
+  }
+}
+
+}  // namespace dart
+
+#endif
diff --git a/runtime/vm/v8_snapshot_writer.h b/runtime/vm/v8_snapshot_writer.h
new file mode 100644
index 0000000..fa9ee85
--- /dev/null
+++ b/runtime/vm/v8_snapshot_writer.h
@@ -0,0 +1,211 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef RUNTIME_VM_V8_SNAPSHOT_WRITER_H_
+#define RUNTIME_VM_V8_SNAPSHOT_WRITER_H_
+
+#include <utility>
+
+#include "platform/assert.h"
+#include "vm/allocation.h"
+#include "vm/hash_map.h"
+#include "vm/json_writer.h"
+#include "vm/object.h"
+
+namespace dart {
+
+struct StringToIntMapTraits {
+  typedef char const* Key;
+  typedef intptr_t Value;
+
+  struct Pair {
+    Key key;
+    Value value;
+    Pair() : key(nullptr), value(-1) {}
+    Pair(Key k, Value v) : key(k), value(v) {}
+  };
+
+  static Value ValueOf(Pair pair) { return pair.value; }
+
+  static Key KeyOf(Pair pair) { return pair.key; }
+
+  static size_t Hashcode(Key key) { return String::Hash(key, strlen(key)); }
+
+  static bool IsKeyEqual(Pair x, Key y) { return strcmp(x.key, y) == 0; }
+};
+
+class V8SnapshotProfileWriter : public ZoneAllocated {
+ public:
+  enum IdSpace {
+    kSnapshot = 0,  // Can be VM or Isolate heap, they share ids.
+    kVmText = 1,
+    kIsolateText = 2,
+    kVmData = 3,
+    kIsolateData = 4,
+    kArtificial = 5,  // Artificial objects (e.g. the global root).
+    kIdSpaceBits = 3,
+  };
+
+  typedef std::pair<IdSpace, intptr_t> ObjectId;
+
+  struct Reference {
+    ObjectId to_object_id;
+    enum {
+      kElement,
+      kProperty,
+    } reference_type;
+    intptr_t offset_or_name;
+  };
+
+  enum ConstantStrings {
+    kUnknownString = 0,
+    kPropertyString = 1,
+    kObjectString = 2,
+    kArtificialRootString = 3,
+  };
+
+#if !defined(DART_PRECOMPILER)
+  explicit V8SnapshotProfileWriter(Zone* zone) {}
+  virtual ~V8SnapshotProfileWriter() {}
+
+  void SetObjectTypeAndName(ObjectId object_id,
+                            const char* type,
+                            const char* name) {}
+  void AttributeBytesTo(ObjectId object_id, size_t num_bytes) {}
+  void AttributeReferenceTo(ObjectId object_id, Reference reference) {}
+  void AddRoot(ObjectId object_id) {}
+  intptr_t EnsureString(const char* str) { return 0; }
+#else
+  explicit V8SnapshotProfileWriter(Zone* zone);
+  virtual ~V8SnapshotProfileWriter() {}
+
+  // Records that the object referenced by 'object_id' has type 'type'. The
+  // 'type' for all 'Instance's should be 'Instance', not the user-visible type
+  // and use 'name' for the real type instead.
+  void SetObjectTypeAndName(ObjectId object_id,
+                            const char* type,
+                            const char* name);
+
+  // Charges 'num_bytes'-many bytes to 'object_id'. In a clustered snapshot,
+  // objects can have their data spread across multiple sections, so this can be
+  // called multiple times for the same object.
+  void AttributeBytesTo(ObjectId object_id, size_t num_bytes);
+
+  // Records that a reference to the object with id 'to_object_id' was written
+  // in order to serialize the object with id 'object_id'. This does not affect
+  // the number of bytes charged to 'object_id'.
+  void AttributeReferenceTo(ObjectId object_id, Reference reference);
+
+  // Marks an object as being a root in the graph. Used for analysis of the
+  // graph.
+  void AddRoot(ObjectId object_id);
+
+  // Write to a file in the V8 Snapshot Profile (JSON/.heapsnapshot) format.
+  void Write(const char* file);
+
+  intptr_t EnsureString(const char* str);
+
+ private:
+  static constexpr intptr_t kNumNodeFields = 5;
+  static constexpr intptr_t kNumEdgeFields = 3;
+
+  struct EdgeInfo {
+    intptr_t type;
+    intptr_t name_or_index;
+    ObjectId to_node;
+  };
+
+  struct NodeInfo {
+    intptr_t type;
+    intptr_t name;
+    ObjectId id;
+    intptr_t self_size;
+    ZoneGrowableArray<EdgeInfo>* edges = nullptr;
+    // Populated during serialization.
+    intptr_t offset = -1;
+    // 'trace_node_id' isn't supported.
+    // 'edge_count' is computed on-demand.
+
+    // Used for testing sentinel in the hashtable.
+    bool operator!=(const NodeInfo& other) { return id != other.id; }
+    bool operator==(const NodeInfo& other) { return !(*this != other); }
+
+    NodeInfo(intptr_t type,
+             intptr_t name,
+             ObjectId id,
+             intptr_t self_size,
+             ZoneGrowableArray<EdgeInfo>* edges,
+             intptr_t offset)
+        : type(type),
+          name(name),
+          id(id),
+          self_size(self_size),
+          edges(edges),
+          offset(offset) {}
+  };
+
+  NodeInfo DefaultNode(ObjectId object_id);
+  static NodeInfo ArtificialRoot();
+
+  NodeInfo* EnsureId(ObjectId object_id);
+  static intptr_t NodeIdFor(ObjectId id) {
+    return (id.second << kIdSpaceBits) | id.first;
+  }
+
+  enum ConstantEdgeTypes {
+    kContext = 0,
+    kElement = 1,
+    kProperty = 2,
+    kInternal = 3,
+    kHidden = 4,
+    kShortcut = 5,
+    kWeak = 6,
+    kExtra = 7,
+  };
+
+  enum ConstantNodeTypes {
+    kUnknown = 0,
+    kArtificialRoot = 1,
+  };
+
+  struct ObjectIdToNodeInfoTraits {
+    typedef ObjectId Key;
+    typedef NodeInfo Value;
+
+    struct Pair {
+      Key key;
+      Value value;
+      Pair()
+          : key{kSnapshot, -1}, value{0, 0, {kSnapshot, -1}, 0, nullptr, -1} {};
+      Pair(Key k, Value v) : key(k), value(v) {}
+    };
+
+    static Key KeyOf(const Pair& pair) { return pair.key; }
+
+    static Value ValueOf(const Pair& pair) { return pair.value; }
+
+    static size_t Hashcode(Key key) { return NodeIdFor(key); }
+
+    static bool IsKeyEqual(const Pair& x, Key y) { return x.key == y; }
+  };
+
+  Zone* zone_;
+  void Write(JSONWriter* writer);
+  void WriteNodeInfo(JSONWriter* writer, const NodeInfo& info);
+  void WriteEdgeInfo(JSONWriter* writer, const EdgeInfo& info);
+  void WriteStringsTable(JSONWriter* writer,
+                         const DirectChainedHashMap<StringToIntMapTraits>& map);
+
+  DirectChainedHashMap<ObjectIdToNodeInfoTraits> nodes_;
+  DirectChainedHashMap<StringToIntMapTraits> node_types_;
+  DirectChainedHashMap<StringToIntMapTraits> edge_types_;
+  DirectChainedHashMap<StringToIntMapTraits> strings_;
+  ZoneGrowableArray<ObjectId> roots_;
+  size_t edge_count_ = 0;
+#endif
+};
+
+}  // namespace dart
+
+#endif  //  RUNTIME_VM_V8_SNAPSHOT_WRITER_H_
diff --git a/runtime/vm/vm_sources.gni b/runtime/vm/vm_sources.gni
index 3605252..82b9645 100644
--- a/runtime/vm/vm_sources.gni
+++ b/runtime/vm/vm_sources.gni
@@ -119,7 +119,6 @@
   "instructions_x64.h",
   "interpreter.cc",
   "interpreter.h",
-  "interpreter_unsupported.cc",
   "isolate.cc",
   "isolate.h",
   "isolate_reload.cc",
@@ -216,6 +215,8 @@
   "random.h",
   "raw_object.cc",
   "raw_object.h",
+  "raw_object_fields.cc",
+  "raw_object_fields.h",
   "raw_object_snapshot.cc",
   "regexp.cc",
   "regexp.h",
@@ -238,6 +239,8 @@
   "resolver.cc",
   "resolver.h",
   "reusable_handles.h",
+  "reverse_pc_lookup_cache.cc",
+  "reverse_pc_lookup_cache.h",
   "ring_buffer.h",
   "runtime_entry.cc",
   "runtime_entry.h",
@@ -247,8 +250,6 @@
   "runtime_entry_ia32.cc",
   "runtime_entry_list.h",
   "runtime_entry_x64.cc",
-  "scanner.cc",
-  "scanner.h",
   "scope_timer.h",
   "scopes.cc",
   "scopes.h",
@@ -280,9 +281,9 @@
   "stack_frame.h",
   "stack_frame_arm.h",
   "stack_frame_arm64.h",
-  "stack_frame_dbc",
+  "stack_frame_dbc.h",
   "stack_frame_ia32.h",
-  "stack_frame_kbc",
+  "stack_frame_kbc.h",
   "stack_frame_x64.h",
   "stack_trace.cc",
   "stack_trace.h",
@@ -311,6 +312,10 @@
   "thread_pool.h",
   "thread_registry.cc",
   "thread_registry.h",
+  "thread_stack_resource.cc",
+  "thread_stack_resource.h",
+  "thread_state.cc",
+  "thread_state.h",
   "timeline.cc",
   "timeline.h",
   "timeline_analysis.cc",
@@ -335,6 +340,8 @@
   "unicode_data.cc",
   "uri.cc",
   "uri.h",
+  "v8_snapshot_writer.cc",
+  "v8_snapshot_writer.h",
   "virtual_memory.cc",
   "virtual_memory.h",
   "virtual_memory_android.cc",
@@ -415,7 +422,6 @@
   "regexp_test.cc",
   "resolver_test.cc",
   "ring_buffer_test.cc",
-  "scanner_test.cc",
   "scopes_test.cc",
   "service_test.cc",
   "snapshot_test.cc",
diff --git a/runtime/vm/zone.cc b/runtime/vm/zone.cc
index 313e452..8227e48 100644
--- a/runtime/vm/zone.cc
+++ b/runtime/vm/zone.cc
@@ -75,7 +75,7 @@
 }
 
 void Zone::Segment::IncrementMemoryCapacity(uintptr_t size) {
-  Thread* current_thread = Thread::Current();
+  ThreadState* current_thread = ThreadState::Current();
   if (current_thread != NULL) {
     current_thread->IncrementMemoryCapacity(size);
   } else if (ApiNativeScope::Current() != NULL) {
@@ -85,7 +85,7 @@
 }
 
 void Zone::Segment::DecrementMemoryCapacity(uintptr_t size) {
-  Thread* current_thread = Thread::Current();
+  ThreadState* current_thread = ThreadState::Current();
   if (current_thread != NULL) {
     current_thread->DecrementMemoryCapacity(size);
   } else if (ApiNativeScope::Current() != NULL) {
@@ -288,7 +288,7 @@
   return OS::VSCreate(this, format, args);
 }
 
-StackZone::StackZone(Thread* thread) : StackResource(thread), zone_() {
+StackZone::StackZone(ThreadState* thread) : StackResource(thread), zone_() {
   if (FLAG_trace_zones) {
     OS::PrintErr("*** Starting a new Stack zone 0x%" Px "(0x%" Px ")\n",
                  reinterpret_cast<intptr_t>(this),
diff --git a/runtime/vm/zone.h b/runtime/vm/zone.h
index b892cdc..b4aba7f 100644
--- a/runtime/vm/zone.h
+++ b/runtime/vm/zone.h
@@ -8,9 +8,8 @@
 #include "platform/utils.h"
 #include "vm/allocation.h"
 #include "vm/handles.h"
-#include "vm/json_stream.h"
 #include "vm/memory_region.h"
-#include "vm/thread.h"
+#include "vm/thread_state.h"
 
 namespace dart {
 
@@ -175,7 +174,7 @@
 class StackZone : public StackResource {
  public:
   // Create an empty zone and set is at the current zone for the Thread.
-  explicit StackZone(Thread* thread);
+  explicit StackZone(ThreadState* thread);
 
   // Delete all memory associated with the zone.
   ~StackZone();
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 12455bf..ec27270 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -35,7 +35,6 @@
 # ......dart2js
 # ......dartanalyzer
 # ......dartdevc
-# ......dartdevk
 # ......pub
 # ......snapshots/
 # ........analysis_server.dart.snapshot
@@ -44,7 +43,6 @@
 # ........dartdoc.dart.snapshot
 # ........dartfmt.dart.snapshot
 # ........dartdevc.dart.snapshot
-# ........dartdevk.dart.snapshot
 # ........kernel_worker.dart.snapshot
 # ........pub.dart.snapshot
 #.........resources/
@@ -58,9 +56,6 @@
 # ......dart_tools_api.h
 # ....lib/
 # ......libraries.json
-# ......dart_client.platform
-# ......dart_server.platform
-# ......dart_shared.platform
 # ......_internal/
 #.........strong.sum
 #.........dart2js_platform.dill
@@ -96,7 +91,6 @@
   "dart2js",
   "dartanalyzer",
   "dartdevc",
-  "dartdevk",
   "dartfmt",
   "pub",
 ]
@@ -154,10 +148,6 @@
     "../utils/dartdevc",
   ],
   [
-    "dartdevk",
-    "../utils/dartdevc:dartdevk",
-  ],
-  [
     "dartdoc",
     "../utils/dartdoc",
   ],
@@ -526,7 +516,7 @@
   deps = [
     ":copy_libraries",
     "../utils/dartdevc:dartdevc_sdk",
-    "../utils/dartdevc:dartdevk_sdk",
+    "../utils/dartdevc:dartdevc_kernel_sdk",
   ]
   gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
   sources = [
@@ -613,9 +603,9 @@
 copy("copy_dev_compiler_js_amd_kernel") {
   visibility = [ ":copy_dev_compiler_js" ]
   deps = [
-    "../utils/dartdevc:dartdevk_sdk",
+    "../utils/dartdevc:dartdevc_kernel_sdk",
   ]
-  gen_dir = get_label_info("../utils/dartdevc:dartdevk_sdk",
+  gen_dir = get_label_info("../utils/dartdevc:dartdevc_kernel_sdk",
                            "target_gen_dir")
   sources = [
     "$gen_dir/kernel/amd/dart_sdk.js",
@@ -631,9 +621,9 @@
 copy("copy_dev_compiler_js_common_kernel") {
   visibility = [ ":copy_dev_compiler_js" ]
   deps = [
-    "../utils/dartdevc:dartdevk_sdk",
+    "../utils/dartdevc:dartdevc_kernel_sdk",
   ]
-  gen_dir = get_label_info("../utils/dartdevc:dartdevk_sdk",
+  gen_dir = get_label_info("../utils/dartdevc:dartdevc_kernel_sdk",
                            "target_gen_dir")
   sources = [
     "$gen_dir/kernel/common/dart_sdk.js",
@@ -649,9 +639,9 @@
 copy("copy_dev_compiler_js_es6_kernel") {
   visibility = [ ":copy_dev_compiler_js" ]
   deps = [
-    "../utils/dartdevc:dartdevk_sdk",
+    "../utils/dartdevc:dartdevc_kernel_sdk",
   ]
-  gen_dir = get_label_info("../utils/dartdevc:dartdevk_sdk",
+  gen_dir = get_label_info("../utils/dartdevc:dartdevc_kernel_sdk",
                            "target_gen_dir")
   sources = [
     "$gen_dir/kernel/es6/dart_sdk.js",
@@ -666,9 +656,9 @@
 copy("copy_dev_compiler_js_legacy_kernel") {
   visibility = [ ":copy_dev_compiler_js" ]
   deps = [
-    "../utils/dartdevc:dartdevk_sdk",
+    "../utils/dartdevc:dartdevc_kernel_sdk",
   ]
-  gen_dir = get_label_info("../utils/dartdevc:dartdevk_sdk",
+  gen_dir = get_label_info("../utils/dartdevc:dartdevc_kernel_sdk",
                            "target_gen_dir")
   sources = [
     "$gen_dir/kernel/legacy/dart_sdk.js",
@@ -753,19 +743,6 @@
   ]
 }
 
-# This rule copies .platform files to lib/
-copy("copy_platform_files") {
-  visibility = [ ":create_common_sdk" ]
-  sources = [
-    "lib/dart_client.platform",
-    "lib/dart_server.platform",
-    "lib/dart_shared.platform",
-  ]
-  outputs = [
-    "$root_out_dir/dart-sdk/lib/{{source_file_part}}",
-  ]
-}
-
 # This is the main rule to copy libraries in _platform_sdk_libraries to lib/
 group("copy_platform_sdk_libraries") {
   visibility = [
@@ -914,7 +891,6 @@
     ":copy_libraries_dart",
     ":copy_license",
     ":copy_libraries_specification",
-    ":copy_platform_files",
     ":copy_readme",
     ":copy_vm_dill_files",
     ":write_revision_file",
diff --git a/sdk/bin/dart2js_sdk b/sdk/bin/dart2js_sdk
index 70c60b7..e7999b4 100755
--- a/sdk/bin/dart2js_sdk
+++ b/sdk/bin/dart2js_sdk
@@ -40,7 +40,7 @@
 declare -a EXTRA_VM_OPTIONS
 
 if test -f "$SNAPSHOT"; then
-  EXTRA_OPTIONS+=("--library-root=$SDK_DIR")
+  EXTRA_OPTIONS+=("--libraries-spec=$SDK_DIR/lib/libraries.json")
 fi
 
 case $0 in
diff --git a/sdk/bin/dart2js_sdk.bat b/sdk/bin/dart2js_sdk.bat
index acc4e17..8485cdc 100755
--- a/sdk/bin/dart2js_sdk.bat
+++ b/sdk/bin/dart2js_sdk.bat
@@ -28,7 +28,7 @@
 )
 
 if exist "%SNAPSHOT%" (
-  set EXTRA_OPTIONS=%EXTRA_OPTIONS% "--library-root=%SDK_DIR%"
+  set EXTRA_OPTIONS=%EXTRA_OPTIONS% "--libraries-spec=%SDK_DIR%\lib\libraries.json"
 )
 
 rem We allow extra vm options to be passed in through an environment variable.
diff --git a/sdk/bin/dartdevk b/sdk/bin/dartdevk
deleted file mode 100755
index f6111dc..0000000
--- a/sdk/bin/dartdevk
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Run dev compiler using the common front-end on the Dart VM. This script
-# assumes the Dart repo's directory structure.
-
-function follow_links() {
-  file="$1"
-  while [ -h "$file" ]; do
-    # On Mac OS, readlink -f doesn't work.
-    file="$(readlink "$file")"
-  done
-  echo "$file"
-}
-
-# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
-PROG_NAME="$(follow_links "$BASH_SOURCE")"
-
-# Handle the case where dart-sdk/bin has been symlinked to.
-BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
-SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
-
-DART="$BIN_DIR/dart"
-
-unset EXTRA_VM_OPTIONS
-declare -a EXTRA_VM_OPTIONS
-
-case $0 in
-  *_developer)
-    EXTRA_VM_OPTIONS+=('--checked')
-    ;;
-esac
-
-# We allow extra vm options to be passed in through an environment variable.
-if [[ $DART_VM_OPTIONS ]]; then
-  read -a OPTIONS <<< "$DART_VM_OPTIONS"
-  EXTRA_VM_OPTIONS+=("${OPTIONS[@]}")
-fi
-
-DART_ROOT="$(cd "${SDK_DIR}/.." ; pwd -P)"
-
-DEV_COMPILER="$DART_ROOT/pkg/dev_compiler/bin/dartdevk.dart"
-
-exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$DEV_COMPILER" "$@"
diff --git a/sdk/bin/dartdevk.bat b/sdk/bin/dartdevk.bat
deleted file mode 100644
index 154162a..0000000
--- a/sdk/bin/dartdevk.bat
+++ /dev/null
@@ -1,64 +0,0 @@
-@echo off
-REM Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-REM for details. All rights reserved. Use of this source code is governed by a
-REM BSD-style license that can be found in the LICENSE file.
-
-setlocal
-rem Handle the case where dart-sdk/bin has been symlinked to.
-set DIR_NAME_WITH_SLASH=%~dp0
-set DIR_NAME=%DIR_NAME_WITH_SLASH:~0,-1%%
-call :follow_links "%DIR_NAME%", RETURNED_BIN_DIR
-rem Get rid of surrounding quotes.
-for %%i in ("%RETURNED_BIN_DIR%") do set BIN_DIR=%%~fi
-
-set DART=%BIN_DIR%\dart
-
-rem Get absolute full name for SDK_DIR.
-for %%i in ("%BIN_DIR%\..\") do set SDK_DIR=%%~fi
-
-rem Remove trailing backslash if there is one
-if %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
-
-set EXTRA_VM_OPTIONS=
-
-rem We allow extra vm options to be passed in through an environment variable.
-if not "_%DART_VM_OPTIONS%_" == "__" (
-  set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% %DART_VM_OPTIONS%
-)
-
-rem Get absolute full name for DART_ROOT.
-for %%i in ("%SDK_DIR%\..\") do set DART_ROOT=%%~fi
-
-rem Remove trailing backslash if there is one
-if %DART_ROOT:~-1%==\ set DART_ROOT=%DART_ROOT:~0,-1%
-
-set DEV_COMPILER=%DART_ROOT%\pkg\dev_compiler\bin\dartdevk.dart
-
-"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%DEV_COMPILER%" %*
-
-endlocal
-
-exit /b %errorlevel%
-
-rem Follow the symbolic links (junctions points) using `dir to determine the
-rem canonical path. Output with a link looks something like this
-rem
-rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
-rem
-rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
-rem surrounded by right angle bracket and left square bracket. Once we get
-rem the filename, which is name of the link, we recursively follow that.
-:follow_links
-setlocal
-for %%i in (%1) do set result=%%~fi
-set current=
-for /f "usebackq tokens=2 delims=[]" %%i in (`dir /a:l "%~dp1" 2^>nul ^
-                                             ^| find ">     %~n1 [" 2^>nul`) do (
-  set current=%%i
-)
-if not "%current%"=="" call :follow_links "%current%", result
-endlocal & set %~2=%result%
-goto :eof
-
-:end
diff --git a/sdk/bin/dartdevk_sdk b/sdk/bin/dartdevk_sdk
deleted file mode 100755
index 9917871..0000000
--- a/sdk/bin/dartdevk_sdk
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Run dev compiler using the common front-end on the Dart VM. This script
-# assumes the Dart SDK's directory structure.
-
-function follow_links() {
-  file="$1"
-  while [ -h "$file" ]; do
-    # On Mac OS, readlink -f doesn't work.
-    file="$(readlink "$file")"
-  done
-  echo "$file"
-}
-
-# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
-PROG_NAME="$(follow_links "$BASH_SOURCE")"
-
-# Handle the case where dart-sdk/bin has been symlinked to.
-BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
-
-SNAPSHOT="$BIN_DIR/snapshots/dartdevk.dart.snapshot"
-
-# We are running the snapshot in the built SDK.
-DART="$BIN_DIR/dart"
-exec "$DART" "$SNAPSHOT" "$@"
diff --git a/sdk/bin/dartdevk_sdk.bat b/sdk/bin/dartdevk_sdk.bat
deleted file mode 100644
index 8e490ef..0000000
--- a/sdk/bin/dartdevk_sdk.bat
+++ /dev/null
@@ -1,50 +0,0 @@
-@echo off
-REM Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-REM for details. All rights reserved. Use of this source code is governed by a
-REM BSD-style license that can be found in the LICENSE file.
-
-setlocal
-rem Handle the case where dart-sdk/bin has been symlinked to.
-set DIR_NAME_WITH_SLASH=%~dp0
-set DIR_NAME=%DIR_NAME_WITH_SLASH:~0,-1%%
-call :follow_links "%DIR_NAME%", RETURNED_BIN_DIR
-rem Get rid of surrounding quotes.
-for %%i in ("%RETURNED_BIN_DIR%") do set BIN_DIR=%%~fi
-
-set DART=%BIN_DIR%\dart
-set SNAPSHOT=%BIN_DIR%\snapshots\dartdevk.dart.snapshot
-
-rem Get absolute full name for SDK_DIR.
-for %%i in ("%BIN_DIR%\..\") do set SDK_DIR=%%~fi
-
-rem Remove trailing backslash if there is one
-if %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
-
-"%DART%" "%SNAPSHOT%" "--packages=%SDK_DIR%\..\..\..\.packages" %*
-
-endlocal
-
-exit /b %errorlevel%
-
-rem Follow the symbolic links (junctions points) using `dir to determine the
-rem canonical path. Output with a link looks something like this
-rem
-rem 01/03/2013  10:11 PM    <JUNCTION>     abc def
-rem [c:\dart_bleeding\dart-repo.9\dart\out\ReleaseIA32\dart-sdk]
-rem
-rem So in the output of 'dir /a:l "targetdir"' we are looking for a filename
-rem surrounded by right angle bracket and left square bracket. Once we get
-rem the filename, which is name of the link, we recursively follow that.
-:follow_links
-setlocal
-for %%i in (%1) do set result=%%~fi
-set current=
-for /f "usebackq tokens=2 delims=[]" %%i in (`dir /a:l "%~dp1" 2^>nul ^
-                                             ^| find ">     %~n1 ["`) do (
-  set current=%%i
-)
-if not "%current%"=="" call :follow_links "%current%", result
-endlocal & set %~2=%result%
-goto :eof
-
-:end
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index 29e785b..393045f 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -16,6 +16,7 @@
         UnmodifiableMapView;
 import 'dart:convert';
 import 'dart:developer' hide log;
+import 'dart:_internal' show Since;
 import 'dart:math';
 import 'dart:io';
 import 'dart:typed_data';
@@ -36,6 +37,8 @@
 abstract class HttpStatus {
   static const int continue_ = 100;
   static const int switchingProtocols = 101;
+  @Since("2.1")
+  static const int processing = 102;
   static const int ok = 200;
   static const int created = 201;
   static const int accepted = 202;
@@ -43,6 +46,12 @@
   static const int noContent = 204;
   static const int resetContent = 205;
   static const int partialContent = 206;
+  @Since("2.1")
+  static const int multiStatus = 207;
+  @Since("2.1")
+  static const int alreadyReported = 208;
+  @Since("2.1")
+  static const int imUsed = 226;
   static const int multipleChoices = 300;
   static const int movedPermanently = 301;
   static const int found = 302;
@@ -51,6 +60,8 @@
   static const int notModified = 304;
   static const int useProxy = 305;
   static const int temporaryRedirect = 307;
+  @Since("2.1")
+  static const int permanentRedirect = 308;
   static const int badRequest = 400;
   static const int unauthorized = 401;
   static const int paymentRequired = 402;
@@ -69,13 +80,43 @@
   static const int unsupportedMediaType = 415;
   static const int requestedRangeNotSatisfiable = 416;
   static const int expectationFailed = 417;
+  @Since("2.1")
+  static const int misdirectedRequest = 421;
+  @Since("2.1")
+  static const int unprocessableEntity = 422;
+  @Since("2.1")
+  static const int locked = 423;
+  @Since("2.1")
+  static const int failedDependency = 424;
   static const int upgradeRequired = 426;
+  @Since("2.1")
+  static const int preconditionRequired = 428;
+  @Since("2.1")
+  static const int tooManyRequests = 429;
+  @Since("2.1")
+  static const int requestHeaderFieldsTooLarge = 431;
+  @Since("2.1")
+  static const int connectionClosedWithoutResponse = 444;
+  @Since("2.1")
+  static const int unavailableForLegalReasons = 451;
+  @Since("2.1")
+  static const int clientClosedRequest = 499;
   static const int internalServerError = 500;
   static const int notImplemented = 501;
   static const int badGateway = 502;
   static const int serviceUnavailable = 503;
   static const int gatewayTimeout = 504;
   static const int httpVersionNotSupported = 505;
+  @Since("2.1")
+  static const int variantAlsoNegotiates = 506;
+  @Since("2.1")
+  static const int insufficientStorage = 507;
+  @Since("2.1")
+  static const int loopDetected = 508;
+  @Since("2.1")
+  static const int notExtended = 510;
+  @Since("2.1")
+  static const int networkAuthenticationRequired = 511;
   // Client generated status code.
   static const int networkConnectTimeoutError = 599;
 
@@ -1125,7 +1166,7 @@
  * that contains the content of and information about an HTTP request.
  *
  * __Note__: Check out the
- * [http_server](http://pub.dartlang.org/packages/http_server)
+ * [http_server](https://pub.dartlang.org/packages/http_server)
  * package, which makes working with the low-level
  * dart:io HTTP server subsystem easier.
  *
@@ -1320,7 +1361,7 @@
   /**
    * Gets and sets the content length of the response. If the size of
    * the response is not known in advance set the content length to
-   * -1 - which is also the default if not set.
+   * -1, which is also the default if not set.
    */
   int contentLength;
 
@@ -1602,11 +1643,10 @@
    * a possible query) is specified using [path].
    * The path may also contain a URI fragment, which will be ignored.
    *
-   * The `Host` header for the request will be set to the value
-   * [host]:[port]. This can be overridden through the
-   * [HttpClientRequest] interface before the request is sent.  NOTE
-   * if [host] is an IP address this will still be set in the `Host`
-   * header.
+   * The `Host` header for the request will be set to the value [host]:[port]
+   * (if [host] is an IP address, it will still be used in the `Host` header).
+   * This can be overridden through the [HttpClientRequest] interface before
+   * the request is sent.
    *
    * For additional information on the sequence of events during an
    * HTTP transaction, and the objects returned by the futures, see
@@ -1622,10 +1662,9 @@
    * [url].
    *
    * The `Host` header for the request will be set to the value
-   * [Uri.host]:[Uri.port] from [url]. This can be overridden through the
-   * [HttpClientRequest] interface before the request is sent.  NOTE
-   * if [Uri.host] is an IP address this will still be set in the `Host`
-   * header.
+   * [Uri.host]:[Uri.port] from [url] (if [url.host] is an IP address, it will
+   * still be used in the `Host` header). This can be overridden through the
+   * [HttpClientRequest] interface before the request is sent.
    *
    * For additional information on the sequence of events during an
    * HTTP transaction, and the objects returned by the futures, see
@@ -2092,16 +2131,16 @@
    * the response body is not known in advance.
    *
    * If the content length needs to be set, it must be set before the
-   * body is written to. Setting the reason phrase after writing to
-   * the body will throw a `StateError`.
+   * body is written to. Setting the content length after writing to the body
+   * will throw a `StateError`.
    */
   int get contentLength;
 
   /**
    * Gets the persistent connection state returned by the server.
    *
-   * if the persistent connection state needs to be set, it must be
-   * set before the body is written to. Setting the reason phrase
+   * If the persistent connection state needs to be set, it must be
+   * set before the body is written to. Setting the persistent connection state
    * after writing to the body will throw a `StateError`.
    */
   bool get persistentConnection;
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 018a8ea..80a5589 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -2110,6 +2110,10 @@
   set findProxy(String f(Uri uri)) => _findProxy = f;
 
   Future<_HttpClientRequest> _openUrl(String method, Uri uri) {
+    if (_closing) {
+      throw new StateError("Client is closed");
+    }
+
     // Ignore any fragments on the request URI.
     uri = uri.removeFragment();
 
diff --git a/sdk/lib/_http/websocket_impl.dart b/sdk/lib/_http/websocket_impl.dart
index 330f9ea..331a064 100644
--- a/sdk/lib/_http/websocket_impl.dart
+++ b/sdk/lib/_http/websocket_impl.dart
@@ -649,6 +649,15 @@
       result = result.sublist(0, result.length - 4);
     }
 
+    // RFC 7692 7.2.3.6. "Generating an Empty Fragment" says that if the
+    // compression library doesn't generate any data when the bufer is empty,
+    // then an empty uncompressed deflate block is used for this purpose. The
+    // 0x00 block has the BFINAL header bit set to 0 and the BTYPE header set to
+    // 00 along with 5 bits of padding. This block decodes to zero bytes.
+    if (result.length == 0) {
+      return [0x00];
+    }
+
     return result;
   }
 }
@@ -732,12 +741,13 @@
 
   void addFrame(int opcode, List<int> data) {
     createFrame(
-        opcode,
-        data,
-        webSocket._serverSide,
-        _deflateHelper != null &&
-            (opcode == _WebSocketOpcode.TEXT ||
-                opcode == _WebSocketOpcode.BINARY)).forEach((e) {
+            opcode,
+            data,
+            webSocket._serverSide,
+            _deflateHelper != null &&
+                (opcode == _WebSocketOpcode.TEXT ||
+                    opcode == _WebSocketOpcode.BINARY))
+        .forEach((e) {
       _eventSink.add(e);
     });
   }
@@ -1204,9 +1214,7 @@
   }
 
   void addUtf8Text(List<int> bytes) {
-    if (bytes is! List<int>) {
-      throw new ArgumentError.value(bytes, "bytes", "Is not a list of bytes");
-    }
+    ArgumentError.checkNotNull(bytes, "bytes");
     _sink.add(new _EncodedString(bytes));
   }
 
diff --git a/sdk/lib/_internal/js_runtime/lib/async_patch.dart b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
index 09b75af..87fab54 100644
--- a/sdk/lib/_internal/js_runtime/lib/async_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/async_patch.dart
@@ -229,13 +229,6 @@
   return new _AsyncAwaitCompleter<T>();
 }
 
-/// Creates a Completer for an `async` function.
-///
-/// Used as part of the runtime support for the async/await transformation.
-Completer<T> _makeSyncCompleter<T>() {
-  return new Completer<T>.sync();
-}
-
 /// Initiates the computation of an `async` function and starts the body
 /// synchronously.
 ///
@@ -251,19 +244,6 @@
   return completer.future;
 }
 
-/// Initiates the computation of an `async` function.
-///
-/// Used as part of the runtime support for the async/await transformation.
-///
-/// This function sets up the first call into the transformed [bodyFunction].
-/// Independently, it takes the [completer] and returns the future of the
-/// completer for convenience of the transformed code.
-dynamic _asyncStart(_WrappedAsyncBody bodyFunction, Completer completer) {
-  // TODO(sra): Specialize this implementation of `await null`.
-  _awaitOnObject(null, bodyFunction);
-  return completer.future;
-}
-
 /// Performs the `await` operation of an `async` function.
 ///
 /// Used as part of the runtime support for the async/await transformation.
diff --git a/sdk/lib/_internal/js_runtime/lib/collection_patch.dart b/sdk/lib/_internal/js_runtime/lib/collection_patch.dart
index c5d1177..fc7a3bf 100644
--- a/sdk/lib/_internal/js_runtime/lib/collection_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/collection_patch.dart
@@ -21,6 +21,8 @@
 
 const _USE_ES6_MAPS = const bool.fromEnvironment("dart2js.use.es6.maps");
 
+const int _mask30 = 0x3fffffff; // Low 30 bits.
+
 @patch
 class HashMap<K, V> {
   @patch
@@ -306,14 +308,14 @@
     // Only treat unsigned 30-bit integers as numeric keys. This way,
     // we avoid converting them to strings when we use them as keys in
     // the JavaScript hash table object.
-    return key is num && JS('bool', '(# & 0x3ffffff) === #', key, key);
+    return key is num && JS('bool', '(# & #) === #', key, _mask30, key);
   }
 
   int _computeHashCode(var key) {
     // We force the hash codes to be unsigned 30-bit integers to avoid
     // issues with problematic keys like '__proto__'. Another option
     // would be to throw an exception if the hash code isn't a number.
-    return JS('int', '# & 0x3ffffff', key.hashCode);
+    return JS('int', '# & #', key.hashCode, _mask30);
   }
 
   static bool _hasTableEntry(var table, var key) {
@@ -382,7 +384,7 @@
     // We force the hash codes to be unsigned 30-bit integers to avoid
     // issues with problematic keys like '__proto__'. Another option
     // would be to throw an exception if the hash code isn't a number.
-    return JS('int', '# & 0x3ffffff', identityHashCode(key));
+    return JS('int', '# & #', identityHashCode(key), _mask30);
   }
 
   int _findBucketIndex(var bucket, var key) {
@@ -426,7 +428,7 @@
     // We force the hash codes to be unsigned 30-bit integers to avoid
     // issues with problematic keys like '__proto__'. Another option
     // would be to throw an exception if the hash code isn't a number.
-    return JS('int', '# & 0x3ffffff', _hashCode(key));
+    return JS('int', '# & #', _hashCode(key), _mask30);
   }
 
   int _findBucketIndex(var bucket, var key) {
@@ -576,7 +578,7 @@
     // We force the hash codes to be unsigned 30-bit integers to avoid
     // issues with problematic keys like '__proto__'. Another option
     // would be to throw an exception if the hash code isn't a number.
-    return JS('int', '# & 0x3ffffff', identityHashCode(key));
+    return JS('int', '# & #', identityHashCode(key), _mask30);
   }
 
   int internalFindBucketIndex(var bucket, var key) {
@@ -669,7 +671,7 @@
     // always unboxed (Smi) values. Modification detection will be missed if you
     // make exactly some multiple of 2^30 modifications between advances of an
     // iterator.
-    _modifications = (_modifications + 1) & 0x3ffffff;
+    _modifications = _mask30 & (_modifications + 1);
   }
 }
 
@@ -779,7 +781,7 @@
     // We force the hash codes to be unsigned 30-bit integers to avoid
     // issues with problematic keys like '__proto__'. Another option
     // would be to throw an exception if the hash code isn't a number.
-    return JS('int', '# & 0x3ffffff', _hashCode(key));
+    return JS('int', '# & #', _hashCode(key), _mask30);
   }
 
   int internalFindBucketIndex(var bucket, var key) {
@@ -830,7 +832,7 @@
   factory HashSet.identity() = _IdentityHashSet<E>;
 }
 
-class _HashSet<E> extends _HashSetBase<E> implements HashSet<E> {
+class _HashSet<E> extends _SetBase<E> implements HashSet<E> {
   int _length = 0;
 
   // The hash set contents are divided into three parts: one part for
@@ -1050,7 +1052,7 @@
     // way, we avoid converting them to strings when we use them as
     // keys in the JavaScript hash table object.
     return element is num &&
-        JS('bool', '(# & 0x3ffffff) === #', element, element);
+        JS('bool', '(# & #) === #', element, _mask30, element);
   }
 
   int _computeHashCode(var element) {
@@ -1058,7 +1060,7 @@
     // issues with problematic elements like '__proto__'. Another
     // option would be to throw an exception if the hash code isn't a
     // number.
-    return JS('int', '# & 0x3ffffff', element.hashCode);
+    return JS('int', '# & #', element.hashCode, _mask30);
   }
 
   static bool _hasTableEntry(var table, var key) {
@@ -1114,7 +1116,7 @@
     // We force the hash codes to be unsigned 30-bit integers to avoid
     // issues with problematic keys like '__proto__'. Another option
     // would be to throw an exception if the hash code isn't a number.
-    return JS('int', '# & 0x3ffffff', identityHashCode(key));
+    return JS('int', '# & #', identityHashCode(key), _mask30);
   }
 
   int _findBucketIndex(var bucket, var element) {
@@ -1151,7 +1153,7 @@
     // issues with problematic elements like '__proto__'. Another
     // option would be to throw an exception if the hash code isn't a
     // number.
-    return JS('int', '# & 0x3ffffff', _hasher(element));
+    return JS('int', '# & #', _hasher(element), _mask30);
   }
 
   bool add(E object) => super._add(object);
@@ -1239,7 +1241,7 @@
   factory LinkedHashSet.identity() = _LinkedIdentityHashSet<E>;
 }
 
-class _LinkedHashSet<E> extends _HashSetBase<E> implements LinkedHashSet<E> {
+class _LinkedHashSet<E> extends _SetBase<E> implements LinkedHashSet<E> {
   int _length = 0;
 
   // The hash set contents are divided into three parts: one part for
@@ -1451,7 +1453,7 @@
     // Value cycles after 2^30 modifications. If you keep hold of an
     // iterator for that long, you might miss a modification
     // detection, and iteration can go sour. Don't do that.
-    _modifications = (_modifications + 1) & 0x3ffffff;
+    _modifications = _mask30 & (_modifications + 1);
   }
 
   // Create a new cell and link it in as the last one in the list.
@@ -1498,7 +1500,7 @@
     // way, we avoid converting them to strings when we use them as
     // keys in the JavaScript hash table object.
     return element is num &&
-        JS('bool', '(# & 0x3ffffff) === #', element, element);
+        JS('bool', '(# & #) === #', element, _mask30, element);
   }
 
   int _computeHashCode(var element) {
@@ -1506,7 +1508,7 @@
     // issues with problematic elements like '__proto__'. Another
     // option would be to throw an exception if the hash code isn't a
     // number.
-    return JS('int', '# & 0x3ffffff', element.hashCode);
+    return JS('int', '# & #', element.hashCode, _mask30);
   }
 
   static _getTableEntry(var table, var key) {
@@ -1559,7 +1561,7 @@
     // We force the hash codes to be unsigned 30-bit integers to avoid
     // issues with problematic keys like '__proto__'. Another option
     // would be to throw an exception if the hash code isn't a number.
-    return JS('int', '# & 0x3ffffff', identityHashCode(key));
+    return JS('int', '# & #', identityHashCode(key), _mask30);
   }
 
   int _findBucketIndex(var bucket, var element) {
@@ -1600,7 +1602,7 @@
     // issues with problematic elements like '__proto__'. Another
     // option would be to throw an exception if the hash code isn't a
     // number.
-    return JS('int', '# & 0x3ffffff', _hasher(element));
+    return JS('int', '# & #', _hasher(element), _mask30);
   }
 
   bool add(E element) => super._add(element);
@@ -1671,3 +1673,30 @@
     }
   }
 }
+
+@patch
+abstract class _SplayTree<K, Node extends _SplayTreeNode<K>> {
+  @patch
+  Node _splayMin(Node node) {
+    Node current = node;
+    while (current.left != null) {
+      Node left = current.left;
+      current.left = left.right;
+      left.right = current;
+      current = left;
+    }
+    return current;
+  }
+
+  @patch
+  Node _splayMax(Node node) {
+    Node current = node;
+    while (current.right != null) {
+      Node right = current.right;
+      current.right = right.left;
+      right.left = current;
+      current = right;
+    }
+    return current;
+  }
+}
diff --git a/sdk/lib/_internal/js_runtime/lib/convert_patch.dart b/sdk/lib/_internal/js_runtime/lib/convert_patch.dart
index 2d234a4..a8dcc31 100644
--- a/sdk/lib/_internal/js_runtime/lib/convert_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/convert_patch.dart
@@ -11,22 +11,20 @@
 import 'dart:collection' show LinkedHashMap, MapBase;
 import 'dart:_native_typed_data' show NativeUint8List;
 
-/**
- * Parses [json] and builds the corresponding parsed JSON value.
- *
- * Parsed JSON values Nare of the types [num], [String], [bool], [Null],
- * [List]s of parsed JSON values or [Map]s from [String] to parsed
- * JSON values.
- *
- * The optional [reviver] function, if provided, is called once for each object
- * or list property parsed. The arguments are the property name ([String]) or
- * list index ([int]), and the value is the parsed value.  The return value of
- * the reviver will be used as the value of that property instead of the parsed
- * value.  The top level value is passed to the reviver with the empty string as
- * a key.
- *
- * Throws [FormatException] if the input is not valid JSON text.
- */
+/// Parses [json] and builds the corresponding parsed JSON value.
+///
+/// Parsed JSON values Nare of the types [num], [String], [bool], [Null],
+/// [List]s of parsed JSON values or [Map]s from [String] to parsed
+/// JSON values.
+///
+/// The optional [reviver] function, if provided, is called once for each object
+/// or list property parsed. The arguments are the property name ([String]) or
+/// list index ([int]), and the value is the parsed value.  The return value of
+/// the reviver will be used as the value of that property instead of the parsed
+/// value.  The top level value is passed to the reviver with the empty string
+/// as a key.
+///
+/// Throws [FormatException] if the input is not valid JSON text.
 @patch
 _parseJson(String source, reviver(key, value)) {
   if (source is! String) throw argumentErrorValue(source);
@@ -46,11 +44,9 @@
   }
 }
 
-/**
- * Walks the raw JavaScript value [json], replacing JavaScript Objects with
- * Maps. [json] is expected to be freshly allocated so elements can be replaced
- * in-place.
- */
+/// Walks the raw JavaScript value [json], replacing JavaScript Objects with
+/// Maps. [json] is expected to be freshly allocated so elements can be replaced
+/// in-place.
 _convertJsonToDart(json, reviver(key, value)) {
   assert(reviver != null);
   walk(e) {
@@ -365,12 +361,10 @@
   }
 }
 
-/**
- * Implements the chunked conversion from a JSON string to its corresponding
- * object.
- *
- * The sink only creates one object, but its input can be chunked.
- */
+/// Implements the chunked conversion from a JSON string to its corresponding
+/// object.
+///
+/// The sink only creates one object, but its input can be chunked.
 // TODO(floitsch): don't accumulate everything before starting to decode.
 class _JsonDecoderSink extends _StringSinkConversionSink {
   final _Reviver _reviver;
@@ -496,3 +490,13 @@
     return null;
   }
 }
+
+@patch
+int _scanOneByteCharacters(List<int> units, int from, int endIndex) {
+  final to = endIndex;
+  for (var i = from; i < to; i++) {
+    final unit = units[i];
+    if ((unit & _ONE_BYTE_LIMIT) != unit) return i - from;
+  }
+  return to - from;
+}
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index 059ce00..27d7d25 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -80,14 +80,6 @@
   @patch
   static apply(Function function, List positionalArguments,
       [Map<Symbol, dynamic> namedArguments]) {
-    // The lazy and startup emitter use a different implementation. To keep the
-    // method small and inlinable, just select the method.
-    return JS_GET_FLAG("IS_FULL_EMITTER")
-        ? _apply1(function, positionalArguments, namedArguments)
-        : _apply2(function, positionalArguments, namedArguments);
-  }
-
-  static _apply1(function, positionalArguments, namedArguments) {
     return Primitives.applyFunction(
         function,
         positionalArguments,
@@ -95,15 +87,6 @@
         // tree-shake _symbolMapToStringMap.
         namedArguments == null ? null : _symbolMapToStringMap(namedArguments));
   }
-
-  static _apply2(function, positionalArguments, namedArguments) {
-    return Primitives.applyFunction2(
-        function,
-        positionalArguments,
-        // Use this form so that if namedArguments is always null, we can
-        // tree-shake _symbolMapToStringMap.
-        namedArguments == null ? null : _symbolMapToStringMap(namedArguments));
-  }
 }
 
 // Patch for Expando implementation.
@@ -375,6 +358,26 @@
 
   @patch
   int get weekday => Primitives.getWeekday(this);
+
+  @patch
+  bool operator ==(dynamic other) =>
+      other is DateTime &&
+      _value == other.millisecondsSinceEpoch &&
+      isUtc == other.isUtc;
+
+  @patch
+  bool isBefore(DateTime other) => _value < other.millisecondsSinceEpoch;
+
+  @patch
+  bool isAfter(DateTime other) => _value > other.millisecondsSinceEpoch;
+
+  @patch
+  bool isAtSameMomentAs(DateTime other) =>
+      _value == other.millisecondsSinceEpoch;
+
+  @patch
+  int compareTo(DateTime other) =>
+      _value.compareTo(other.millisecondsSinceEpoch);
 }
 
 // Patch for Stopwatch implementation.
@@ -682,11 +685,9 @@
   // are not encoded by any encoding table.
   static final RegExp _needsNoEncoding = new RegExp(r'^[\-\.0-9A-Z_a-z~]*$');
 
-  /**
-   * This is the internal implementation of JavaScript's encodeURI function.
-   * It encodes all characters in the string [text] except for those
-   * that appear in [canonicalTable], and returns the escaped string.
-   */
+  /// This is the internal implementation of JavaScript's encodeURI function.
+  /// It encodes all characters in the string [text] except for those
+  /// that appear in [canonicalTable], and returns the escaped string.
   @patch
   static String _uriEncode(List<int> canonicalTable, String text,
       Encoding encoding, bool spaceToPlus) {
@@ -876,12 +877,10 @@
  * and disclaimer.
  */
 
-/**
- * An implementation for the arbitrarily large integer.
- *
- * The integer number is represented by a sign, an array of 16-bit unsigned
- * integers in little endian format, and a number of used digits in that array.
- */
+/// An implementation for the arbitrarily large integer.
+///
+/// The integer number is represented by a sign, an array of 16-bit unsigned
+/// integers in little endian format, and a number of used digits in that array.
 class _BigIntImpl implements BigInt {
   // Bits per digit.
   static const int _digitBits = 16;
@@ -922,29 +921,27 @@
   /// replaced.
   final int _used;
 
-  /**
-   * Parses [source] as a, possibly signed, integer literal and returns its
-   * value.
-   *
-   * The [source] must be a non-empty sequence of base-[radix] digits,
-   * optionally prefixed with a minus or plus sign ('-' or '+').
-   *
-   * The [radix] must be in the range 2..36. The digits used are
-   * first the decimal digits 0..9, and then the letters 'a'..'z' with
-   * values 10 through 35. Also accepts upper-case letters with the same
-   * values as the lower-case ones.
-   *
-   * If no [radix] is given then it defaults to 10. In this case, the [source]
-   * digits may also start with `0x`, in which case the number is interpreted
-   * as a hexadecimal literal, which effectively means that the `0x` is ignored
-   * and the radix is instead set to 16.
-   *
-   * For any int `n` and radix `r`, it is guaranteed that
-   * `n == int.parse(n.toRadixString(r), radix: r)`.
-   *
-   * Throws a [FormatException] if the [source] is not a valid integer literal,
-   * optionally prefixed by a sign.
-   */
+  /// Parses [source] as a, possibly signed, integer literal and returns its
+  /// value.
+  ///
+  /// The [source] must be a non-empty sequence of base-[radix] digits,
+  /// optionally prefixed with a minus or plus sign ('-' or '+').
+  ///
+  /// The [radix] must be in the range 2..36. The digits used are
+  /// first the decimal digits 0..9, and then the letters 'a'..'z' with
+  /// values 10 through 35. Also accepts upper-case letters with the same
+  /// values as the lower-case ones.
+  ///
+  /// If no [radix] is given then it defaults to 10. In this case, the [source]
+  /// digits may also start with `0x`, in which case the number is interpreted
+  /// as a hexadecimal literal, which effectively means that the `0x` is ignored
+  /// and the radix is instead set to 16.
+  ///
+  /// For any int `n` and radix `r`, it is guaranteed that
+  /// `n == int.parse(n.toRadixString(r), radix: r)`.
+  ///
+  /// Throws a [FormatException] if the [source] is not a valid integer literal,
+  /// optionally prefixed by a sign.
   static _BigIntImpl parse(String source, {int radix}) {
     var result = _tryParse(source, radix: radix);
     if (result == null) {
@@ -1230,22 +1227,18 @@
     return absResult;
   }
 
-  /**
-   * Return the negative value of this integer.
-   *
-   * The result of negating an integer always has the opposite sign, except
-   * for zero, which is its own negation.
-   */
+  /// Return the negative value of this integer.
+  ///
+  /// The result of negating an integer always has the opposite sign, except
+  /// for zero, which is its own negation.
   _BigIntImpl operator -() {
     if (_used == 0) return this;
     return new _BigIntImpl._(!_isNegative, _used, _digits);
   }
 
-  /**
-   * Returns the absolute value of this integer.
-   *
-   * For any integer `x`, the result is the same as `x < 0 ? -x : x`.
-   */
+  /// Returns the absolute value of this integer.
+  ///
+  /// For any integer `x`, the result is the same as `x < 0 ? -x : x`.
   _BigIntImpl abs() => _isNegative ? -this : this;
 
   /// Returns this << n *_DIGIT_BITS.
@@ -1335,18 +1328,16 @@
     resultDigits[digitShift] = carry;
   }
 
-  /**
-   * Shift the bits of this integer to the left by [shiftAmount].
-   *
-   * Shifting to the left makes the number larger, effectively multiplying
-   * the number by `pow(2, shiftIndex)`.
-   *
-   * There is no limit on the size of the result. It may be relevant to
-   * limit intermediate values by using the "and" operator with a suitable
-   * mask.
-   *
-   * It is an error if [shiftAmount] is negative.
-   */
+  /// Shift the bits of this integer to the left by [shiftAmount].
+  ///
+  /// Shifting to the left makes the number larger, effectively multiplying
+  /// the number by `pow(2, shiftIndex)`.
+  ///
+  /// There is no limit on the size of the result. It may be relevant to
+  /// limit intermediate values by using the "and" operator with a suitable
+  /// mask.
+  ///
+  /// It is an error if [shiftAmount] is negative.
   _BigIntImpl operator <<(int shiftAmount) {
     if (shiftAmount < 0) {
       throw new ArgumentError("shift-amount must be posititve $shiftAmount");
@@ -1402,15 +1393,13 @@
     resultDigits[last] = carry;
   }
 
-  /**
-   * Shift the bits of this integer to the right by [shiftAmount].
-   *
-   * Shifting to the right makes the number smaller and drops the least
-   * significant bits, effectively doing an integer division by
-   *`pow(2, shiftIndex)`.
-   *
-   * It is an error if [shiftAmount] is negative.
-   */
+  /// Shift the bits of this integer to the right by [shiftAmount].
+  ///
+  /// Shifting to the right makes the number smaller and drops the least
+  /// significant bits, effectively doing an integer division by
+  /// `pow(2, shiftIndex)`.
+  ///
+  /// It is an error if [shiftAmount] is negative.
   _BigIntImpl operator >>(int shiftAmount) {
     if (shiftAmount < 0) {
       throw new ArgumentError("shift-amount must be posititve $shiftAmount");
@@ -1453,12 +1442,10 @@
     return _compareDigits(_digits, _used, other._digits, other._used);
   }
 
-  /**
-   * Compares this to `other`.
-   *
-   * Returns a negative number if `this` is less than `other`, zero if they are
-   * equal, and a positive number if `this` is greater than `other`.
-   */
+  /// Compares this to `other`.
+  ///
+  /// Returns a negative number if `this` is less than `other`, zero if they are
+  /// equal, and a positive number if `this` is greater than `other`.
   int compareTo(BigInt bigInt) {
     _BigIntImpl other = bigInt;
     if (_isNegative == other._isNegative) {
@@ -1646,16 +1633,14 @@
     return new _BigIntImpl._(isNegative, resultUsed, resultDigits);
   }
 
-  /**
-   * Bit-wise and operator.
-   *
-   * Treating both `this` and [other] as sufficiently large two's component
-   * integers, the result is a number with only the bits set that are set in
-   * both `this` and [other]
-   *
-   * Of both operands are negative, the result is negative, otherwise
-   * the result is non-negative.
-   */
+  /// Bit-wise and operator.
+  ///
+  /// Treating both `this` and [other] as sufficiently large two's component
+  /// integers, the result is a number with only the bits set that are set in
+  /// both `this` and [other]
+  ///
+  /// Of both operands are negative, the result is negative, otherwise
+  /// the result is non-negative.
   _BigIntImpl operator &(BigInt bigInt) {
     _BigIntImpl other = bigInt;
     if (_isZero || other._isZero) return zero;
@@ -1686,16 +1671,14 @@
     return p._absAndNotSetSign(n1, false);
   }
 
-  /**
-   * Bit-wise or operator.
-   *
-   * Treating both `this` and [other] as sufficiently large two's component
-   * integers, the result is a number with the bits set that are set in either
-   * of `this` and [other]
-   *
-   * If both operands are non-negative, the result is non-negative,
-   * otherwise the result us negative.
-   */
+  /// Bit-wise or operator.
+  ///
+  /// Treating both `this` and [other] as sufficiently large two's component
+  /// integers, the result is a number with the bits set that are set in either
+  /// of `this` and [other]
+  ///
+  /// If both operands are non-negative, the result is non-negative,
+  /// otherwise the result us negative.
   _BigIntImpl operator |(BigInt bigInt) {
     _BigIntImpl other = bigInt;
     if (_isZero) return other;
@@ -1728,16 +1711,14 @@
     return n1._absAndNotSetSign(p, true)._absAddSetSign(one, true);
   }
 
-  /**
-   * Bit-wise exclusive-or operator.
-   *
-   * Treating both `this` and [other] as sufficiently large two's component
-   * integers, the result is a number with the bits set that are set in one,
-   * but not both, of `this` and [other]
-   *
-   * If the operands have the same sign, the result is non-negative,
-   * otherwise the result is negative.
-   */
+  /// Bit-wise exclusive-or operator.
+  ///
+  /// Treating both `this` and [other] as sufficiently large two's component
+  /// integers, the result is a number with the bits set that are set in one,
+  /// but not both, of `this` and [other]
+  ///
+  /// If the operands have the same sign, the result is non-negative,
+  /// otherwise the result is negative.
   _BigIntImpl operator ^(BigInt bigInt) {
     _BigIntImpl other = bigInt;
     if (_isZero) return other;
@@ -1767,14 +1748,12 @@
     return p._absXorSetSign(n1, true)._absAddSetSign(one, true);
   }
 
-  /**
-   * The bit-wise negate operator.
-   *
-   * Treating `this` as a sufficiently large two's component integer,
-   * the result is a number with the opposite bits set.
-   *
-   * This maps any integer `x` to `-x - 1`.
-   */
+  /// The bit-wise negate operator.
+  ///
+  /// Treating `this` as a sufficiently large two's component integer,
+  /// the result is a number with the opposite bits set.
+  ///
+  /// This maps any integer `x` to `-x - 1`.
   _BigIntImpl operator ~() {
     if (_isZero) return _minusOne;
     if (_isNegative) {
@@ -2070,65 +2049,59 @@
     return finish(hash);
   }
 
-  /**
-   * Test whether this value is numerically equal to `other`.
-   *
-   * If [other] is a [_BigIntImpl] returns whether the two operands have the same
-   * value.
-   *
-   * Returns false if `other` is not a [_BigIntImpl].
-   */
+  /// Test whether this value is numerically equal to `other`.
+  ///
+  /// If [other] is a [_BigIntImpl] returns whether the two operands have the
+  /// same value.
+  ///
+  /// Returns false if `other` is not a [_BigIntImpl].
   bool operator ==(Object other) =>
       other is _BigIntImpl && compareTo(other) == 0;
 
-  /**
-   * Returns the minimum number of bits required to store this big integer.
-   *
-   * The number of bits excludes the sign bit, which gives the natural length
-   * for non-negative (unsigned) values.  Negative values are complemented to
-   * return the bit position of the first bit that differs from the sign bit.
-   *
-   * To find the number of bits needed to store the value as a signed value,
-   * add one, i.e. use `x.bitLength + 1`.
-   *
-   * ```
-   * x.bitLength == (-x-1).bitLength
-   *
-   * new BigInt.from(3).bitLength == 2;   // 00000011
-   * new BigInt.from(2).bitLength == 2;   // 00000010
-   * new BigInt.from(1).bitLength == 1;   // 00000001
-   * new BigInt.from(0).bitLength == 0;   // 00000000
-   * new BigInt.from(-1).bitLength == 0;  // 11111111
-   * new BigInt.from(-2).bitLength == 1;  // 11111110
-   * new BigInt.from(-3).bitLength == 2;  // 11111101
-   * new BigInt.from(-4).bitLength == 2;  // 11111100
-   * ```
-   */
+  /// Returns the minimum number of bits required to store this big integer.
+  ///
+  /// The number of bits excludes the sign bit, which gives the natural length
+  /// for non-negative (unsigned) values.  Negative values are complemented to
+  /// return the bit position of the first bit that differs from the sign bit.
+  ///
+  /// To find the number of bits needed to store the value as a signed value,
+  /// add one, i.e. use `x.bitLength + 1`.
+  ///
+  /// ```
+  /// x.bitLength == (-x-1).bitLength
+  ///
+  /// new BigInt.from(3).bitLength == 2;   // 00000011
+  /// new BigInt.from(2).bitLength == 2;   // 00000010
+  /// new BigInt.from(1).bitLength == 1;   // 00000001
+  /// new BigInt.from(0).bitLength == 0;   // 00000000
+  /// new BigInt.from(-1).bitLength == 0;  // 11111111
+  /// new BigInt.from(-2).bitLength == 1;  // 11111110
+  /// new BigInt.from(-3).bitLength == 2;  // 11111101
+  /// new BigInt.from(-4).bitLength == 2;  // 11111100
+  /// ```
   int get bitLength {
     if (_used == 0) return 0;
     if (_isNegative) return (~this).bitLength;
     return _digitBits * (_used - 1) + _digits[_used - 1].bitLength;
   }
 
-  /**
-   * Truncating division operator.
-   *
-   * Performs a truncating integer division, where the remainder is discarded.
-   *
-   * The remainder can be computed using the [remainder] method.
-   *
-   * Examples:
-   * ```
-   * var seven = new BigInt.from(7);
-   * var three = new BigInt.from(3);
-   * seven ~/ three;    // => 2
-   * (-seven) ~/ three; // => -2
-   * seven ~/ -three;   // => -2
-   * seven.remainder(three);    // => 1
-   * (-seven).remainder(three); // => -1
-   * seven.remainder(-three);   // => 1
-   * ```
-   */
+  /// Truncating division operator.
+  ///
+  /// Performs a truncating integer division, where the remainder is discarded.
+  ///
+  /// The remainder can be computed using the [remainder] method.
+  ///
+  /// Examples:
+  /// ```
+  /// var seven = new BigInt.from(7);
+  /// var three = new BigInt.from(3);
+  /// seven ~/ three;    // => 2
+  /// (-seven) ~/ three; // => -2
+  /// seven ~/ -three;   // => -2
+  /// seven.remainder(three);    // => 1
+  /// (-seven).remainder(three); // => -1
+  /// seven.remainder(-three);   // => 1
+  /// ```
   _BigIntImpl operator ~/(BigInt bigInt) {
     _BigIntImpl other = bigInt;
     if (other._used == 0) {
@@ -2137,13 +2110,12 @@
     return _div(other);
   }
 
-  /**
-   * Returns the remainder of the truncating division of `this` by [other].
-   *
-   * The result `r` of this operation satisfies:
-   * `this == (this ~/ other) * other + r`.
-   * As a consequence the remainder `r` has the same sign as the divider `this`.
-   */
+  /// Returns the remainder of the truncating division of `this` by [other].
+  ///
+  /// The result `r` of this operation satisfies:
+  /// `this == (this ~/ other) * other + r`.
+  /// As a consequence the remainder `r` has the same sign as the divider
+  /// `this`.
   _BigIntImpl remainder(BigInt bigInt) {
     _BigIntImpl other = bigInt;
     if (other._used == 0) {
@@ -2155,29 +2127,27 @@
   /// Division operator.
   double operator /(BigInt other) => this.toDouble() / other.toDouble();
 
-  /** Relational less than operator. */
+  /// Relational less than operator.
   bool operator <(BigInt other) => compareTo(other) < 0;
 
-  /** Relational less than or equal operator. */
+  /// Relational less than or equal operator.
   bool operator <=(BigInt other) => compareTo(other) <= 0;
 
-  /** Relational greater than operator. */
+  /// Relational greater than operator.
   bool operator >(BigInt other) => compareTo(other) > 0;
 
-  /** Relational greater than or equal operator. */
+  /// Relational greater than or equal operator.
   bool operator >=(BigInt other) => compareTo(other) >= 0;
 
-  /**
-   * Euclidean modulo operator.
-   *
-   * Returns the remainder of the Euclidean division. The Euclidean division of
-   * two integers `a` and `b` yields two integers `q` and `r` such that
-   * `a == b * q + r` and `0 <= r < b.abs()`.
-   *
-   * The sign of the returned value `r` is always positive.
-   *
-   * See [remainder] for the remainder of the truncating division.
-   */
+  /// Euclidean modulo operator.
+  ///
+  /// Returns the remainder of the Euclidean division. The Euclidean division of
+  /// two integers `a` and `b` yields two integers `q` and `r` such that
+  /// `a == b * q + r` and `0 <= r < b.abs()`.
+  ///
+  /// The sign of the returned value `r` is always positive.
+  ///
+  /// See [remainder] for the remainder of the truncating division.
   _BigIntImpl operator %(BigInt bigInt) {
     _BigIntImpl other = bigInt;
     if (other._used == 0) {
@@ -2194,12 +2164,10 @@
     return result;
   }
 
-  /**
-   * Returns the sign of this big integer.
-   *
-   * Returns 0 for zero, -1 for values less than zero and
-   * +1 for values greater than zero.
-   */
+  /// Returns the sign of this big integer.
+  ///
+  /// Returns 0 for zero, -1 for values less than zero and
+  /// +1 for values greater than zero.
   int get sign {
     if (_used == 0) return 0;
     return _isNegative ? -1 : 1;
@@ -2236,12 +2204,10 @@
     return result;
   }
 
-  /**
-   * Returns this integer to the power of [exponent] modulo [modulus].
-   *
-   * The [exponent] must be non-negative and [modulus] must be
-   * positive.
-   */
+  /// Returns this integer to the power of [exponent] modulo [modulus].
+  ///
+  /// The [exponent] must be non-negative and [modulus] must be
+  /// positive.
   _BigIntImpl modPow(BigInt bigExponent, BigInt bigModulus) {
     _BigIntImpl exponent = bigExponent;
     _BigIntImpl modulus = bigModulus;
@@ -2534,14 +2500,12 @@
     return new _BigIntImpl._(false, maxUsed, dDigits);
   }
 
-  /**
-   * Returns the modular multiplicative inverse of this big integer
-   * modulo [modulus].
-   *
-   * The [modulus] must be positive.
-   *
-   * It is an error if no modular inverse exists.
-   */
+  /// Returns the modular multiplicative inverse of this big integer
+  /// modulo [modulus].
+  ///
+  /// The [modulus] must be positive.
+  ///
+  /// It is an error if no modular inverse exists.
   // Returns 1/this % modulus, with modulus > 0.
   _BigIntImpl modInverse(BigInt bigInt) {
     _BigIntImpl modulus = bigInt;
@@ -2556,19 +2520,17 @@
     return _binaryGcd(modulus, tmp, true);
   }
 
-  /**
-   * Returns the greatest common divisor of this big integer and [other].
-   *
-   * If either number is non-zero, the result is the numerically greatest
-   * integer dividing both `this` and `other`.
-   *
-   * The greatest common divisor is independent of the order,
-   * so `x.gcd(y)` is  always the same as `y.gcd(x)`.
-   *
-   * For any integer `x`, `x.gcd(x)` is `x.abs()`.
-   *
-   * If both `this` and `other` is zero, the result is also zero.
-   */
+  /// Returns the greatest common divisor of this big integer and [other].
+  ///
+  /// If either number is non-zero, the result is the numerically greatest
+  /// integer dividing both `this` and `other`.
+  ///
+  /// The greatest common divisor is independent of the order,
+  /// so `x.gcd(y)` is  always the same as `y.gcd(x)`.
+  ///
+  /// For any integer `x`, `x.gcd(x)` is `x.abs()`.
+  ///
+  /// If both `this` and `other` is zero, the result is also zero.
   _BigIntImpl gcd(BigInt bigInt) {
     _BigIntImpl other = bigInt;
     if (_isZero) return other.abs();
@@ -2576,70 +2538,67 @@
     return _binaryGcd(this, other, false);
   }
 
-  /**
-   * Returns the least significant [width] bits of this big integer as a
-   * non-negative number (i.e. unsigned representation).  The returned value has
-   * zeros in all bit positions higher than [width].
-   *
-   * ```
-   * new BigInt.from(-1).toUnsigned(5) == 31   // 11111111  ->  00011111
-   * ```
-   *
-   * This operation can be used to simulate arithmetic from low level languages.
-   * For example, to increment an 8 bit quantity:
-   *
-   * ```
-   * q = (q + 1).toUnsigned(8);
-   * ```
-   *
-   * `q` will count from `0` up to `255` and then wrap around to `0`.
-   *
-   * If the input fits in [width] bits without truncation, the result is the
-   * same as the input.  The minimum width needed to avoid truncation of `x` is
-   * given by `x.bitLength`, i.e.
-   *
-   * ```
-   * x == x.toUnsigned(x.bitLength);
-   * ```
-   */
+  /// Returns the least significant [width] bits of this big integer as a
+  /// non-negative number (i.e. unsigned representation).  The returned value
+  /// has zeros in all bit positions higher than [width].
+  ///
+  /// ```
+  /// new BigInt.from(-1).toUnsigned(5) == 31   // 11111111  ->  00011111
+  /// ```
+  ///
+  /// This operation can be used to simulate arithmetic from low level
+  /// languages.  For example, to increment an 8 bit quantity:
+  ///
+  /// ```
+  /// q = (q + 1).toUnsigned(8);
+  /// ```
+  ///
+  /// `q` will count from `0` up to `255` and then wrap around to `0`.
+  ///
+  /// If the input fits in [width] bits without truncation, the result is the
+  /// same as the input.  The minimum width needed to avoid truncation of `x` is
+  /// given by `x.bitLength`, i.e.
+  ///
+  /// ```
+  /// x == x.toUnsigned(x.bitLength);
+  /// ```
   _BigIntImpl toUnsigned(int width) {
     return this & ((one << width) - one);
   }
 
-  /**
-   * Returns the least significant [width] bits of this integer, extending the
-   * highest retained bit to the sign.  This is the same as truncating the value
-   * to fit in [width] bits using an signed 2-s complement representation.  The
-   * returned value has the same bit value in all positions higher than [width].
-   *
-   * ```
-   * var big15 = new BigInt.from(15);
-   * var big16 = new BigInt.from(16);
-   * var big239 = new BigInt.from(239);
-   *                                      V--sign bit-V
-   * big16.toSigned(5) == -big16   //  00010000 -> 11110000
-   * big239.toSigned(5) == big15   //  11101111 -> 00001111
-   *                                      ^           ^
-   * ```
-   *
-   * This operation can be used to simulate arithmetic from low level languages.
-   * For example, to increment an 8 bit signed quantity:
-   *
-   * ```
-   * q = (q + 1).toSigned(8);
-   * ```
-   *
-   * `q` will count from `0` up to `127`, wrap to `-128` and count back up to
-   * `127`.
-   *
-   * If the input value fits in [width] bits without truncation, the result is
-   * the same as the input.  The minimum width needed to avoid truncation of `x`
-   * is `x.bitLength + 1`, i.e.
-   *
-   * ```
-   * x == x.toSigned(x.bitLength + 1);
-   * ```
-   */
+  /// Returns the least significant [width] bits of this integer, extending the
+  /// highest retained bit to the sign.  This is the same as truncating the
+  /// value to fit in [width] bits using an signed 2-s complement
+  /// representation.  The returned value has the same bit value in all
+  /// positions higher than [width].
+  ///
+  /// ```
+  /// var big15 = new BigInt.from(15);
+  /// var big16 = new BigInt.from(16);
+  /// var big239 = new BigInt.from(239);
+  ///                                      V--sign bit-V
+  /// big16.toSigned(5) == -big16   //  00010000 -> 11110000
+  /// big239.toSigned(5) == big15   //  11101111 -> 00001111
+  ///                                      ^           ^
+  /// ```
+  ///
+  /// This operation can be used to simulate arithmetic from low level
+  /// languages.  For example, to increment an 8 bit signed quantity:
+  ///
+  /// ```
+  /// q = (q + 1).toSigned(8);
+  /// ```
+  ///
+  /// `q` will count from `0` up to `127`, wrap to `-128` and count back up to
+  /// `127`.
+  ///
+  /// If the input value fits in [width] bits without truncation, the result is
+  /// the same as the input.  The minimum width needed to avoid truncation of
+  /// `x` is `x.bitLength + 1`, i.e.
+  ///
+  /// ```
+  /// x == x.toSigned(x.bitLength + 1);
+  /// ```
   _BigIntImpl toSigned(int width) {
     // The value of binary number weights each bit by a power of two.  The
     // twos-complement value weights the sign bit negatively.  We compute the
@@ -2668,13 +2627,11 @@
     return _isNegative ? -result : result;
   }
 
-  /**
-   * Returns this [_BigIntImpl] as a [double].
-   *
-   * If the number is not representable as a [double], an
-   * approximation is returned. For numerically large integers, the
-   * approximation may be infinite.
-   */
+  /// Returns this [_BigIntImpl] as a [double].
+  ///
+  /// If the number is not representable as a [double], an
+  /// approximation is returned. For numerically large integers, the
+  /// approximation may be infinite.
   double toDouble() {
     const int exponentBias = 1075;
     // There are 11 bits for the exponent.
@@ -2770,13 +2727,11 @@
     return resultBits.buffer.asByteData().getFloat64(0, Endian.little);
   }
 
-  /**
-   * Returns a String-representation of this integer.
-   *
-   * The returned string is parsable by [parse].
-   * For any `_BigIntImpl` `i`, it is guaranteed that
-   * `i == _BigIntImpl.parse(i.toString())`.
-   */
+  /// Returns a String-representation of this integer.
+  ///
+  /// The returned string is parsable by [parse].
+  /// For any `_BigIntImpl` `i`, it is guaranteed that
+  /// `i == _BigIntImpl.parse(i.toString())`.
   String toString() {
     if (_used == 0) return "0";
     if (_used == 1) {
@@ -2808,14 +2763,12 @@
     return _a + digit - 10;
   }
 
-  /**
-   * Converts [this] to a string representation in the given [radix].
-   *
-   * In the string representation, lower-case letters are used for digits above
-   * '9', with 'a' being 10 an 'z' being 35.
-   *
-   * The [radix] argument must be an integer in the range 2 to 36.
-   */
+  /// Converts [this] to a string representation in the given [radix].
+  ///
+  /// In the string representation, lower-case letters are used for digits above
+  /// '9', with 'a' being 10 an 'z' being 35.
+  ///
+  /// The [radix] argument must be an integer in the range 2 to 36.
   String toRadixString(int radix) {
     if (radix > 36) throw new RangeError.range(radix, 2, 36);
 
diff --git a/sdk/lib/_internal/js_runtime/lib/foreign_helper.dart b/sdk/lib/_internal/js_runtime/lib/foreign_helper.dart
index 4f549a0..5377630 100644
--- a/sdk/lib/_internal/js_runtime/lib/foreign_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/foreign_helper.dart
@@ -6,152 +6,151 @@
 
 import 'dart:_js_embedded_names' show JsGetName, JsBuiltin;
 
-/**
- * Emits a JavaScript code fragment parametrized by arguments.
- *
- * Hash characters `#` in the [codeTemplate] are replaced in left-to-right order
- * with expressions that contain the values of, or evaluate to, the arguments.
- * The number of hash marks must match the number or arguments.  Although
- * declared with arguments [arg0] through [arg2], the form actually has no limit
- * on the number of arguments.
- *
- * The [typeDescription] argument is interpreted as a description of the
- * behavior of the JavaScript code.  Currently it describes the side effects
- * types that may be returned by the expression, with the additional behavior
- * that the returned values may be fresh instances of the types.  The type
- * information must be correct as it is trusted by the compiler in
- * optimizations, and it must be precise as possible since it is used for native
- * live type analysis to tree-shake large parts of the DOM libraries.  If poorly
- * written, the [typeDescription] will cause unnecessarily bloated programs.
- * (You can check for this by compiling with `--verbose`; there is an info
- * message describing the number of native (DOM) types that can be removed,
- * which usually should be greater than zero.)
- *
- * The [typeDescription] must be a [String]. Two forms of it are supported:
- *
- * 1) a union of types separated by vertical bar `|` symbols, e.g.
- *    `"num|String"` describes the union of numbers and Strings.  There is no
- *    type in Dart that is this precise.  The Dart alternative would be `Object`
- *    or `dynamic`, but these types imply that the JS-code might also be
- *    creating instances of all the DOM types.
- *
- *    If `null` is possible, it must be specified explicitly, e.g.
- *    `"String|Null"`. [typeDescription] has several extensions to help describe
- *    the behavior more accurately.  In addition to the union type already
- *    described:
- *
- *    + `=Object` is a plain JavaScript object.  Some DOM methods return
- *       instances that have no corresponding Dart type (e.g. cross-frame
- *       documents), `=Object` can be used to describe these untyped' values.
- *
- *    + `var` or empty string.  If the entire [typeDescription] is `var` (or
- *      empty string) then the type is `dynamic` but the code is known to not
- *      create any instances.
- *
- *   Examples:
- *
- *       // Parent window might be an opaque cross-frame window.
- *       var thing = JS('=Object|Window', '#.parent', myWindow);
- *
- * 2) a sequence of the form `<tag>:<value>;` where `<tag>` is one of
- *    `creates`, `returns`, `effects` or `depends`.
- *
- *    The first two tags are used to specify the created and returned types of
- *    the expression. The value of `creates` and `returns` is a type string as
- *    defined in 1).
- *
- *    The tags `effects` and `depends` encode the side effects of this call.
- *    They can be omitted, in which case the expression is parsed and a safe
- *    conservative side-effect estimation is computed.
- *
- *    The values of `effects` and `depends` may be 'all', 'none' or a
- *    comma-separated list of 'no-index', 'no-instance' and 'no-static'.
- *
- *    The value 'all' indicates that the call affects/depends on every
- *    side-effect. The flag 'none' signals that the call does not affect
- *    (resp. depends on) anything.
- *
- *    The value 'no-index' indicates that the call does *not* do (resp. depends
- *    on) any array index-store. The flag 'no-instance' indicates that the call
- *    does not modify (resp. depends on) any instance variable. Similarly,
- *    the 'no-static' value indicates that the call does not modify (resp.
- *    depends on) any static variable.
- *
- *    The `effects` and `depends` flag must be used in tandem. Either both are
- *    specified or none is.
- *
- *    Each tag (including the type tags) may only occur once in the sequence.
- *
- * Guidelines:
- *
- *  + Do not use any parameter, local, method or field names in the
- *    [codeTemplate].  These names are all subject to arbitrary renaming by the
- *    compiler.  Pass the values in via `#` substition, and test with the
- *    `--minify` dart2js command-line option.
- *
- *  + The substituted expressions are values, not locations.
- *
- *        JS('void', '# += "x"', this.field);
- *
- *    `this.field` might not be a substituted as a reference to the field.  The
- *    generated code might accidentally work as intended, but it also might be
- *
- *        var t1 = this.field;
- *        t1 += "x";
- *
- *    or
- *
- *        this.get$field() += "x";
- *
- *    The remedy in this case is to expand the `+=` operator, leaving all
- *    references to the Dart field as Dart code:
- *
- *        this.field = JS('String', '# + "x"', this.field);
- *
- *  + Never use `#` in function bodies.
- *
- *    This is a variation on the previous guideline.  Since `#` is replaced with
- *    an *expression* and the expression is only valid in the immediate context,
- *    `#` should never appear in a function body.  Doing so might defer the
- *    evaluation of the expression, and its side effects, until the function is
- *    called.
- *
- *    For example,
- *
- *        var value = foo();
- *        var f = JS('', 'function(){return #}', value)
- *
- *    might result in no immediate call to `foo` and a call to `foo` on every
- *    call to the JavaScript function bound to `f`.  This is better:
- *
- *        var f = JS('',
- *            '(function(val) { return function(){return val}; })(#)', value);
- *
- *    Since `#` occurs in the immediately evaluated expression, the expression
- *    is immediately evaluated and bound to `val` in the immediate call.
- *
- *
- * Type argument.
- *
- * In Dart 2.0, the type argument additionally constrains the returned type.
- * So, with type inference filling in the type argumemnt,
- *
- *     String s = JS('', 'JSON.stringify(#)', x);
- *
- * will be the same as the current meaning of
- *
- *     var s = JS('String|Null', 'JSON.stringify(#)', x);
- *
- *
- * Additional notes.
- *
- * In the future we may extend [typeDescription] to include other aspects of the
- * behavior, for example, separating the returned types from the instantiated
- * types to allow the compiler to perform more optimizations around the code.
- *
- * This might be an extension of [JS] or a new function similar to [JS] with
- * additional arguments for the new information.
- */
+/// Emits a JavaScript code fragment parametrized by arguments.
+///
+/// Hash characters `#` in the [codeTemplate] are replaced in left-to-right
+/// order with expressions that contain the values of, or evaluate to, the
+/// arguments.  The number of hash marks must match the number or arguments.
+/// Although declared with arguments [arg0] through [arg2], the form actually
+/// has no limit on the number of arguments.
+///
+/// The [typeDescription] argument is interpreted as a description of the
+/// behavior of the JavaScript code.  Currently it describes the side effects
+/// types that may be returned by the expression, with the additional behavior
+/// that the returned values may be fresh instances of the types.  The type
+/// information must be correct as it is trusted by the compiler in
+/// optimizations, and it must be precise as possible since it is used for
+/// native live type analysis to tree-shake large parts of the DOM libraries.
+/// If poorly written, the [typeDescription] will cause unnecessarily bloated
+/// programs.  (You can check for this by compiling with `--verbose`; there is
+/// an info message describing the number of native (DOM) types that can be
+/// removed, which usually should be greater than zero.)
+///
+/// The [typeDescription] must be a [String]. Two forms of it are supported:
+///
+/// 1) a union of types separated by vertical bar `|` symbols, e.g.
+///    `"num|String"` describes the union of numbers and Strings.  There is no
+///    type in Dart that is this precise.  The Dart alternative would be
+///    `Object` or `dynamic`, but these types imply that the JS-code might also
+///    be creating instances of all the DOM types.
+///
+///    If `null` is possible, it must be specified explicitly, e.g.
+///    `"String|Null"`. [typeDescription] has several extensions to help
+///    describe the behavior more accurately.  In addition to the union type
+///    already described:
+///
+///    + `=Object` is a plain JavaScript object.  Some DOM methods return
+///       instances that have no corresponding Dart type (e.g. cross-frame
+///       documents), `=Object` can be used to describe these untyped' values.
+///
+///    + `var` or empty string.  If the entire [typeDescription] is `var` (or
+///      empty string) then the type is `dynamic` but the code is known to not
+///      create any instances.
+///
+///   Examples:
+///
+///       // Parent window might be an opaque cross-frame window.
+///       var thing = JS('=Object|Window', '#.parent', myWindow);
+///
+/// 2) a sequence of the form `<tag>:<value>;` where `<tag>` is one of
+///    `creates`, `returns`, `effects` or `depends`.
+///
+///    The first two tags are used to specify the created and returned types of
+///    the expression. The value of `creates` and `returns` is a type string as
+///    defined in 1).
+///
+///    The tags `effects` and `depends` encode the side effects of this call.
+///    They can be omitted, in which case the expression is parsed and a safe
+///    conservative side-effect estimation is computed.
+///
+///    The values of `effects` and `depends` may be 'all', 'none' or a
+///    comma-separated list of 'no-index', 'no-instance' and 'no-static'.
+///
+///    The value 'all' indicates that the call affects/depends on every
+///    side-effect. The flag 'none' signals that the call does not affect
+///    (resp. depends on) anything.
+///
+///    The value 'no-index' indicates that the call does *not* do (resp. depends
+///    on) any array index-store. The flag 'no-instance' indicates that the call
+///    does not modify (resp. depends on) any instance variable. Similarly,
+///    the 'no-static' value indicates that the call does not modify (resp.
+///    depends on) any static variable.
+///
+///    The `effects` and `depends` flag must be used in tandem. Either both are
+///    specified or none is.
+///
+///    Each tag (including the type tags) may only occur once in the sequence.
+///
+/// Guidelines:
+///
+///  + Do not use any parameter, local, method or field names in the
+///    [codeTemplate].  These names are all subject to arbitrary renaming by the
+///    compiler.  Pass the values in via `#` substition, and test with the
+///    `--minify` dart2js command-line option.
+///
+///  + The substituted expressions are values, not locations.
+///
+///        JS('void', '# += "x"', this.field);
+///
+///    `this.field` might not be a substituted as a reference to the field.  The
+///    generated code might accidentally work as intended, but it also might be
+///
+///        var t1 = this.field;
+///        t1 += "x";
+///
+///    or
+///
+///        this.get$field() += "x";
+///
+///    The remedy in this case is to expand the `+=` operator, leaving all
+///    references to the Dart field as Dart code:
+///
+///        this.field = JS('String', '# + "x"', this.field);
+///
+///  + Never use `#` in function bodies.
+///
+///    This is a variation on the previous guideline.  Since `#` is replaced
+///    with an *expression* and the expression is only valid in the immediate
+///    context, `#` should never appear in a function body.  Doing so might
+///    defer the evaluation of the expression, and its side effects, until the
+///    function is called.
+///
+///    For example,
+///
+///        var value = foo();
+///        var f = JS('', 'function(){return #}', value)
+///
+///    might result in no immediate call to `foo` and a call to `foo` on every
+///    call to the JavaScript function bound to `f`.  This is better:
+///
+///        var f = JS('',
+///            '(function(val) { return function(){return val}; })(#)', value);
+///
+///    Since `#` occurs in the immediately evaluated expression, the expression
+///    is immediately evaluated and bound to `val` in the immediate call.
+///
+///
+/// Type argument.
+///
+/// In Dart 2.0, the type argument additionally constrains the returned type.
+/// So, with type inference filling in the type argumemnt,
+///
+///     String s = JS('', 'JSON.stringify(#)', x);
+///
+/// will be the same as the current meaning of
+///
+///     var s = JS('String|Null', 'JSON.stringify(#)', x);
+///
+///
+/// Additional notes.
+///
+/// In the future we may extend [typeDescription] to include other aspects of
+/// the behavior, for example, separating the returned types from the
+/// instantiated types to allow the compiler to perform more optimizations
+/// around the code.
+///
+/// This might be an extension of [JS] or a new function similar to [JS] with
+/// additional arguments for the new information.
 // Add additional optional arguments if needed. The method is treated internally
 // as a variable argument method.
 external T JS<T>(String typeDescription, String codeTemplate,
@@ -176,39 +175,31 @@
     arg18,
     arg19]);
 
-/**
- * Converts the Dart closure [function] into a JavaScript closure.
- *
- * Warning: This is no different from [RAW_DART_FUNCTION_REF] which means care
- * must be taken to store the current isolate.
- */
+/// Converts the Dart closure [function] into a JavaScript closure.
+///
+/// Warning: This is no different from [RAW_DART_FUNCTION_REF] which means care
+/// must be taken to store the current isolate.
 external DART_CLOSURE_TO_JS(Function function);
 
-/**
- * Returns a raw reference to the JavaScript function which implements
- * [function].
- *
- * Warning: this is dangerous, you should probably use
- * [DART_CLOSURE_TO_JS] instead. The returned object is not a valid
- * Dart closure, does not store the isolate context or arity.
- *
- * A valid example of where this can be used is as the second argument
- * to V8's Error.captureStackTrace. See
- * https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi.
- */
+/// Returns a raw reference to the JavaScript function which implements
+/// [function].
+///
+/// Warning: this is dangerous, you should probably use
+/// [DART_CLOSURE_TO_JS] instead. The returned object is not a valid
+/// Dart closure, does not store the isolate context or arity.
+///
+/// A valid example of where this can be used is as the second argument
+/// to V8's Error.captureStackTrace. See
+/// https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi.
 external RAW_DART_FUNCTION_REF(Function function);
 
-/**
- * Sets the current static state to [staticState].
- */
+/// Sets the current static state to [staticState].
 external void JS_SET_STATIC_STATE(staticState);
 
-/**
- * Returns the interceptor for class [type].  The interceptor is the type's
- * constructor's `prototype` property.  [type] will typically be the class, not
- * an interface, e.g. `JS_INTERCEPTOR_CONSTANT(JSInt)`, not
- * `JS_INTERCEPTOR_CONSTANT(int)`.
- */
+/// Returns the interceptor for class [type].  The interceptor is the type's
+/// constructor's `prototype` property.  [type] will typically be the class, not
+/// an interface, e.g. `JS_INTERCEPTOR_CONSTANT(JSInt)`, not
+/// `JS_INTERCEPTOR_CONSTANT(int)`.
 external JS_INTERCEPTOR_CONSTANT(Type type);
 
 /// Returns the interceptor for [object].
@@ -216,9 +207,7 @@
 /// Calls are replaced with the [HInterceptor] SSA instruction.
 external getInterceptor(object);
 
-/**
- * Returns the object corresponding to Namer.staticStateHolder.
- */
+/// Returns the object corresponding to Namer.staticStateHolder.
 external JS_GET_STATIC_STATE();
 
 /// Returns the JS name for [name] from the Namer.
@@ -242,42 +231,36 @@
 /// when the program has been analyzed.
 external bool JS_GET_FLAG(String name);
 
-/**
- * Pretend [code] is executed.  Generates no executable code.  This is used to
- * model effects at some other point in external code.  For example, the
- * following models an assignment to foo with an unknown value.
- *
- *     var foo;
- *
- *     main() {
- *       JS_EFFECT((_){ foo = _; })
- *     }
- *
- * TODO(sra): Replace this hack with something to mark the volatile or
- * externally initialized elements.
- */
+/// Pretend [code] is executed.  Generates no executable code.  This is used to
+/// model effects at some other point in external code.  For example, the
+/// following models an assignment to foo with an unknown value.
+///
+///     var foo;
+///
+///     main() {
+///       JS_EFFECT((_){ foo = _; })
+///     }
+///
+/// TODO(sra): Replace this hack with something to mark the volatile or
+/// externally initialized elements.
 void JS_EFFECT(Function code) {
   code(null);
 }
 
-/**
- * Use this class for creating constants that hold JavaScript code.
- * For example:
- *
- * const constant = JS_CONST('typeof window != "undefined");
- *
- * This code will generate:
- * $.JS_CONST_1 = typeof window != "undefined";
- */
+/// Use this class for creating constants that hold JavaScript code.
+/// For example:
+///
+/// const constant = JS_CONST('typeof window != "undefined");
+///
+/// This code will generate:
+/// $.JS_CONST_1 = typeof window != "undefined";
 class JS_CONST {
   final String code;
   const JS_CONST(this.code);
 }
 
-/**
- * JavaScript string concatenation. Inputs must be Strings.  Corresponds to the
- * HStringConcat SSA instruction and may be constant-folded.
- */
+/// JavaScript string concatenation. Inputs must be Strings.  Corresponds to the
+/// HStringConcat SSA instruction and may be constant-folded.
 String JS_STRING_CONCAT(String a, String b) {
   // This body is unused, only here for type analysis.
   return JS('String', '# + #', a, b);
diff --git a/sdk/lib/_internal/js_runtime/lib/instantiation.dart b/sdk/lib/_internal/js_runtime/lib/instantiation.dart
new file mode 100644
index 0000000..0ed4974
--- /dev/null
+++ b/sdk/lib/_internal/js_runtime/lib/instantiation.dart
@@ -0,0 +1,330 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of _js_helper;
+
+/// Support class for generic function type instantiation (binding of types).
+///
+abstract class Instantiation extends Closure {
+  final Closure _genericClosure;
+  Instantiation(this._genericClosure) {
+    // TODO(sra): Copy some metadata used by Function.apply.
+
+    // Mark support code as used.  The JS condition is inscrutable to dart2js,
+    // so the 'if (false)' is in the final program.
+    // TODO(sra): Find a better way to do this. Generating the signature methods
+    // earlier as SSA on the instantiation closures should achieve this.
+    if (JS('bool', 'false')) {
+      // [instantiatedGenericFunctionType] is called from injected $signature
+      // methods with runtime type representations.
+      instantiatedGenericFunctionType(JS('', '0'), JS('', '0'));
+    }
+  }
+
+  /// Returns a list of the bound types.
+  List get _types;
+
+  String toString() {
+    var types = "<${_types.join(', ')}>";
+    // TODO(sra): Refactor Closure formatting to place type arguments inside,
+    // e.g. "Closure 'map<String>' of Instance of 'JSArray<int>'".
+    return '$_genericClosure with $types';
+  }
+}
+
+/// Instantiation classes are subclasses of [Instantiation]. For now we have a
+/// fixed number of subclasses. Later we might generate the classes on demand.
+class Instantiation1<T1> extends Instantiation {
+  Instantiation1(Closure f) : super(f);
+  List get _types => [T1];
+}
+
+class Instantiation2<T1, T2> extends Instantiation {
+  Instantiation2(Closure f) : super(f);
+  List get _types => [T1, T2];
+}
+
+class Instantiation3<T1, T2, T3> extends Instantiation {
+  Instantiation3(Closure f) : super(f);
+  List get _types => [T1, T2, T3];
+}
+
+class Instantiation4<T1, T2, T3, T4> extends Instantiation {
+  Instantiation4(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4];
+}
+
+class Instantiation5<T1, T2, T3, T4, T5> extends Instantiation {
+  Instantiation5(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5];
+}
+
+class Instantiation6<T1, T2, T3, T4, T5, T6> extends Instantiation {
+  Instantiation6(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5, T6];
+}
+
+class Instantiation7<T1, T2, T3, T4, T5, T6, T7> extends Instantiation {
+  Instantiation7(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5, T6, T7];
+}
+
+class Instantiation8<T1, T2, T3, T4, T5, T6, T7, T8> extends Instantiation {
+  Instantiation8(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8];
+}
+
+class Instantiation9<T1, T2, T3, T4, T5, T6, T7, T8, T9> extends Instantiation {
+  Instantiation9(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9];
+}
+
+class Instantiation10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
+    extends Instantiation {
+  Instantiation10(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10];
+}
+
+class Instantiation11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
+    extends Instantiation {
+  Instantiation11(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11];
+}
+
+class Instantiation12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
+    extends Instantiation {
+  Instantiation12(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12];
+}
+
+class Instantiation13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>
+    extends Instantiation {
+  Instantiation13(Closure f) : super(f);
+  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13];
+}
+
+class Instantiation14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14> extends Instantiation {
+  Instantiation14(Closure f) : super(f);
+  List get _types =>
+      [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14];
+}
+
+class Instantiation15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15> extends Instantiation {
+  Instantiation15(Closure f) : super(f);
+  List get _types =>
+      [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15];
+}
+
+class Instantiation16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16> extends Instantiation {
+  Instantiation16(Closure f) : super(f);
+  List get _types =>
+      [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16];
+}
+
+class Instantiation17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17> extends Instantiation {
+  Instantiation17(Closure f) : super(f);
+  List get _types => [
+        T1,
+        T2,
+        T3,
+        T4,
+        T5,
+        T6,
+        T7,
+        T8,
+        T9,
+        T10,
+        T11,
+        T12,
+        T13,
+        T14,
+        T15,
+        T16,
+        T17
+      ];
+}
+
+class Instantiation18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18> extends Instantiation {
+  Instantiation18(Closure f) : super(f);
+  List get _types => [
+        T1,
+        T2,
+        T3,
+        T4,
+        T5,
+        T6,
+        T7,
+        T8,
+        T9,
+        T10,
+        T11,
+        T12,
+        T13,
+        T14,
+        T15,
+        T16,
+        T17,
+        T18
+      ];
+}
+
+class Instantiation19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19> extends Instantiation {
+  Instantiation19(Closure f) : super(f);
+  List get _types => [
+        T1,
+        T2,
+        T3,
+        T4,
+        T5,
+        T6,
+        T7,
+        T8,
+        T9,
+        T10,
+        T11,
+        T12,
+        T13,
+        T14,
+        T15,
+        T16,
+        T17,
+        T18,
+        T19
+      ];
+}
+
+class Instantiation20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20> extends Instantiation {
+  Instantiation20(Closure f) : super(f);
+  List get _types => [
+        T1,
+        T2,
+        T3,
+        T4,
+        T5,
+        T6,
+        T7,
+        T8,
+        T9,
+        T10,
+        T11,
+        T12,
+        T13,
+        T14,
+        T15,
+        T16,
+        T17,
+        T18,
+        T19,
+        T20
+      ];
+}
+
+Instantiation instantiate1<T1>(Closure f) {
+  return new Instantiation1<T1>(f);
+}
+
+Instantiation instantiate2<T1, T2>(Closure f) {
+  return new Instantiation2<T1, T2>(f);
+}
+
+Instantiation instantiate3<T1, T2, T3>(Closure f) {
+  return new Instantiation3<T1, T2, T3>(f);
+}
+
+Instantiation instantiate4<T1, T2, T3, T4>(Closure f) {
+  return new Instantiation4<T1, T2, T3, T4>(f);
+}
+
+Instantiation instantiate5<T1, T2, T3, T4, T5>(Closure f) {
+  return new Instantiation5<T1, T2, T3, T4, T5>(f);
+}
+
+Instantiation instantiate6<T1, T2, T3, T4, T5, T6>(Closure f) {
+  return new Instantiation6<T1, T2, T3, T4, T5, T6>(f);
+}
+
+Instantiation instantiate7<T1, T2, T3, T4, T5, T6, T7>(Closure f) {
+  return new Instantiation7<T1, T2, T3, T4, T5, T6, T7>(f);
+}
+
+Instantiation instantiate8<T1, T2, T3, T4, T5, T6, T7, T8>(Closure f) {
+  return new Instantiation8<T1, T2, T3, T4, T5, T6, T7, T8>(f);
+}
+
+Instantiation instantiate9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(Closure f) {
+  return new Instantiation9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(f);
+}
+
+Instantiation instantiate10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
+    Closure f) {
+  return new Instantiation10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(f);
+}
+
+Instantiation instantiate11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(
+    Closure f) {
+  return new Instantiation11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(f);
+}
+
+Instantiation instantiate12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(
+    Closure f) {
+  return new Instantiation12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(
+      f);
+}
+
+Instantiation
+    instantiate13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(
+        Closure f) {
+  return new Instantiation13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13>(f);
+}
+
+Instantiation
+    instantiate14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(
+        Closure f) {
+  return new Instantiation14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14>(f);
+}
+
+Instantiation instantiate15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13, T14, T15>(Closure f) {
+  return new Instantiation15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15>(f);
+}
+
+Instantiation instantiate16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13, T14, T15, T16>(Closure f) {
+  return new Instantiation16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16>(f);
+}
+
+Instantiation instantiate17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13, T14, T15, T16, T17>(Closure f) {
+  return new Instantiation17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17>(f);
+}
+
+Instantiation instantiate18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13, T14, T15, T16, T17, T18>(Closure f) {
+  return new Instantiation18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18>(f);
+}
+
+Instantiation instantiate19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13, T14, T15, T16, T17, T18, T19>(Closure f) {
+  return new Instantiation19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19>(f);
+}
+
+Instantiation instantiate20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13, T14, T15, T16, T17, T18, T19, T20>(Closure f) {
+  return new Instantiation20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20>(f);
+}
diff --git a/sdk/lib/_internal/js_runtime/lib/interceptors.dart b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
index a9fcb75..3344d39 100644
--- a/sdk/lib/_internal/js_runtime/lib/interceptors.dart
+++ b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
@@ -52,7 +52,7 @@
         JS_EMBEDDED_GLOBAL,
         JS_INTERCEPTOR_CONSTANT,
         JS_STRING_CONCAT;
-import 'dart:math' show Random;
+import 'dart:math' show Random, ln2;
 
 part 'js_array.dart';
 part 'js_number.dart';
@@ -123,10 +123,8 @@
 dispatchRecordExtension(record) => JS('', '#.e', record);
 dispatchRecordIndexability(record) => JS('bool|Null', '#.x', record);
 
-/**
- * Returns the interceptor for a native class instance. Used by
- * [getInterceptor].
- */
+/// Returns the interceptor for a native class instance. Used by
+/// [getInterceptor].
 getNativeInterceptor(object) {
   var record = getDispatchProperty(object);
 
@@ -220,20 +218,18 @@
   JS('', '#.set(#, #)', constructorToInterceptor, constructor, interceptor);
 }
 
-/**
- * Data structure used to map a [Type] to the [Interceptor] and constructors for
- * that type.  It is JavaScript array of 3N entries of adjacent slots containing
- * a [Type], followed by an [Interceptor] class for the type, followed by a
- * JavaScript object map for the constructors.
- *
- * The value of this variable is set by the compiler and contains only types
- * that are user extensions of native classes where the type occurs as a
- * constant in the program.
- *
- * The compiler, in CustomElementsAnalysis, assumes that [typeToInterceptorMap]
- * is accessed only by code that also calls [findIndexForWebComponentType].  If
- * this assumption is invalidated, the compiler will have to be updated.
- */
+/// Data structure used to map a [Type] to the [Interceptor] and constructors
+/// for that type.  It is JavaScript array of 3N entries of adjacent slots
+/// containing a [Type], followed by an [Interceptor] class for the type,
+/// followed by a JavaScript object map for the constructors.
+///
+/// The value of this variable is set by the compiler and contains only types
+/// that are user extensions of native classes where the type occurs as a
+/// constant in the program.
+///
+/// The compiler, in CustomElementsAnalysis, assumes that [typeToInterceptorMap]
+/// is accessed only by code that also calls [findIndexForWebComponentType].  If
+/// this assumption is invalidated, the compiler will have to be updated.
 get typeToInterceptorMap {
   return JS_EMBEDDED_GLOBAL('', TYPE_TO_INTERCEPTOR_MAP);
 }
@@ -256,12 +252,10 @@
   return map[index + 1];
 }
 
-/**
- * Returns a JavaScript function that runs the constructor on its argument, or
- * `null` if there is no such constructor.
- *
- * The returned function takes one argument, the web component object.
- */
+/// Returns a JavaScript function that runs the constructor on its argument, or
+/// `null` if there is no such constructor.
+///
+/// The returned function takes one argument, the web component object.
 findConstructorForNativeSubclassType(Type type, String name) {
   var index = findIndexForNativeSubclassType(type);
   if (index == null) return null;
@@ -277,54 +271,52 @@
   return JS('', '#.prototype', constructor);
 }
 
-/**
- * The base interceptor class.
- *
- * The code `r.foo(a)` is compiled to `getInterceptor(r).foo$1(r, a)`.  The
- * value returned by [getInterceptor] holds the methods separately from the
- * state of the instance.  The compiler converts the methods on an interceptor
- * to take the Dart `this` argument as an explicit `receiver` argument.  The
- * JavaScript `this` parameter is bound to the interceptor.
- *
- * In order to have uniform call sites, if a method is defined on an
- * interceptor, methods of that name on plain unintercepted classes also use the
- * interceptor calling convention.  The plain classes are _self-interceptors_,
- * and for them, `getInterceptor(r)` returns `r`.  Methods on plain
- * unintercepted classes have a redundant `receiver` argument and, to enable
- * some optimizations, must ignore `receiver` in favour of `this`.
- *
- * In the case of mixins, a method may be placed on both an intercepted class
- * and an unintercepted class.  In this case, the method must use the `receiver`
- * parameter.
- *
- *
- * There are various optimizations of the general call pattern.
- *
- * When the interceptor can be statically determined, it can be used directly:
- *
- *     CONSTANT_INTERCEPTOR.foo$1(r, a)
- *
- * If there are only a few classes, [getInterceptor] can be specialized with a
- * more efficient dispatch:
- *
- *     getInterceptor$specialized(r).foo$1(r, a)
- *
- * If it can be determined that the receiver is an unintercepted class, it can
- * be called directly:
- *
- *     r.foo$1(r, a)
- *
- * If, further, it is known that the call site cannot call a foo that is
- * mixed-in to a native class, then it is known that the explicit receiver is
- * ignored, and space-saving dummy value can be passed instead:
- *
- *     r.foo$1(0, a)
- *
- * This class defines implementations of *all* methods on [Object] so no
- * interceptor inherits an implementation from [Object].  This enables the
- * implementations on Object to ignore the explicit receiver argument, which
- * allows dummy receiver optimization.
- */
+/// The base interceptor class.
+///
+/// The code `r.foo(a)` is compiled to `getInterceptor(r).foo$1(r, a)`.  The
+/// value returned by [getInterceptor] holds the methods separately from the
+/// state of the instance.  The compiler converts the methods on an interceptor
+/// to take the Dart `this` argument as an explicit `receiver` argument.  The
+/// JavaScript `this` parameter is bound to the interceptor.
+///
+/// In order to have uniform call sites, if a method is defined on an
+/// interceptor, methods of that name on plain unintercepted classes also use
+/// the interceptor calling convention.  The plain classes are
+/// _self-interceptors_, and for them, `getInterceptor(r)` returns `r`.  Methods
+/// on plain unintercepted classes have a redundant `receiver` argument and, to
+/// enable some optimizations, must ignore `receiver` in favour of `this`.
+///
+/// In the case of mixins, a method may be placed on both an intercepted class
+/// and an unintercepted class.  In this case, the method must use the
+/// `receiver` parameter.
+///
+///
+/// There are various optimizations of the general call pattern.
+///
+/// When the interceptor can be statically determined, it can be used directly:
+///
+///     CONSTANT_INTERCEPTOR.foo$1(r, a)
+///
+/// If there are only a few classes, [getInterceptor] can be specialized with a
+/// more efficient dispatch:
+///
+///     getInterceptor$specialized(r).foo$1(r, a)
+///
+/// If it can be determined that the receiver is an unintercepted class, it can
+/// be called directly:
+///
+///     r.foo$1(r, a)
+///
+/// If, further, it is known that the call site cannot call a foo that is
+/// mixed-in to a native class, then it is known that the explicit receiver is
+/// ignored, and space-saving dummy value can be passed instead:
+///
+///     r.foo$1(0, a)
+///
+/// This class defines implementations of *all* methods on [Object] so no
+/// interceptor inherits an implementation from [Object].  This enables the
+/// implementations on Object to ignore the explicit receiver argument, which
+/// allows dummy receiver optimization.
 abstract class Interceptor {
   const Interceptor();
 
@@ -356,9 +348,7 @@
   Type get runtimeType => getRuntimeType(this);
 }
 
-/**
- * The interceptor class for [bool].
- */
+/// The interceptor class for [bool].
 class JSBool extends Interceptor implements bool {
   const JSBool();
 
@@ -378,13 +368,11 @@
   Type get runtimeType => bool;
 }
 
-/**
- * The interceptor class for [Null].
- *
- * This class defines implementations for *all* methods on [Object] since
- * the methods on Object assume the receiver is non-null.  This means that
- * JSNull will always be in the interceptor set for methods defined on Object.
- */
+/// The interceptor class for [Null].
+///
+/// This class defines implementations for *all* methods on [Object] since
+/// the methods on Object assume the receiver is non-null.  This means that
+/// JSNull will always be in the interceptor set for methods defined on Object.
 class JSNull extends Interceptor implements Null {
   const JSNull();
 
@@ -403,37 +391,29 @@
   dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
-/**
- * The supertype for JSString and JSArray. Used by the backend as to
- * have a type mask that contains the objects that we can use the
- * native JS [] operator and length on.
- */
+/// The supertype for JSString and JSArray. Used by the backend as to
+/// have a type mask that contains the objects that we can use the
+/// native JS [] operator and length on.
 abstract class JSIndexable<E> {
   int get length;
   E operator [](int index);
 }
 
-/**
- * The supertype for JSMutableArray and
- * JavaScriptIndexingBehavior. Used by the backend to have a type mask
- * that contains the objects we can use the JS []= operator on.
- */
+/// The supertype for JSMutableArray and
+/// JavaScriptIndexingBehavior. Used by the backend to have a type mask
+/// that contains the objects we can use the JS []= operator on.
 abstract class JSMutableIndexable<E> extends JSIndexable<E> {
   operator []=(int index, E value);
 }
 
-/**
- * The interface implemented by JavaScript objects.  These are methods in
- * addition to the regular Dart Object methods like [Object.hashCode].
- *
- * This is the type that should be exported by a JavaScript interop library.
- */
+/// The interface implemented by JavaScript objects.  These are methods in
+/// addition to the regular Dart Object methods like [Object.hashCode].
+///
+/// This is the type that should be exported by a JavaScript interop library.
 abstract class JSObject {}
 
-/**
- * Interceptor base class for JavaScript objects not recognized as some more
- * specific native type.
- */
+/// Interceptor base class for JavaScript objects not recognized as some more
+/// specific native type.
 class JavaScriptObject extends Interceptor implements JSObject {
   const JavaScriptObject();
 
@@ -442,36 +422,28 @@
 
   Type get runtimeType => JSObject;
 
-  /**
-   * Returns the result of the JavaScript objects `toString` method.
-   */
+  /// Returns the result of the JavaScript objects `toString` method.
   String toString() => JS('String', 'String(#)', this);
 }
 
-/**
- * Interceptor for plain JavaScript objects created as JavaScript object
- * literals or `new Object()`.
- */
+/// Interceptor for plain JavaScript objects created as JavaScript object
+/// literals or `new Object()`.
 class PlainJavaScriptObject extends JavaScriptObject {
   const PlainJavaScriptObject();
 }
 
-/**
- * Interceptor for unclassified JavaScript objects, typically objects with a
- * non-trivial prototype chain.
- *
- * This class also serves as a fallback for unknown JavaScript exceptions.
- */
+/// Interceptor for unclassified JavaScript objects, typically objects with a
+/// non-trivial prototype chain.
+///
+/// This class also serves as a fallback for unknown JavaScript exceptions.
 class UnknownJavaScriptObject extends JavaScriptObject {
   const UnknownJavaScriptObject();
 }
 
-/**
- * Interceptor for JavaScript function objects and Dart functions that have
- * been converted to JavaScript functions.
- * These interceptor methods are not always used as the JavaScript function
- * object has also been mangled to support Dart function calling conventions.
- */
+/// Interceptor for JavaScript function objects and Dart functions that have
+/// been converted to JavaScript functions.
+/// These interceptor methods are not always used as the JavaScript function
+/// object has also been mangled to support Dart function calling conventions.
 class JavaScriptFunction extends JavaScriptObject implements Function {
   const JavaScriptFunction();
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_array.dart b/sdk/lib/_internal/js_runtime/lib/js_array.dart
index 9d0a48e..c6956d9 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_array.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_array.dart
@@ -10,12 +10,10 @@
 
 const _ListConstructorSentinel = const _Growable();
 
-/**
- * The interceptor class for [List]. The compiler recognizes this
- * class as an interceptor, and changes references to [:this:] to
- * actually use the receiver of the method, which is generated as an extra
- * argument added to each member.
- */
+/// The interceptor class for [List]. The compiler recognizes this
+/// class as an interceptor, and changes references to [:this:] to
+/// actually use the receiver of the method, which is generated as an extra
+/// argument added to each member.
 class JSArray<E> extends Interceptor implements List<E>, JSIndexable {
   const JSArray();
 
@@ -28,11 +26,9 @@
     return new JSArray<E>.fixed(length);
   }
 
-  /**
-   * Returns a fresh JavaScript Array, marked as fixed-length.
-   *
-   * [length] must be a non-negative integer.
-   */
+  /// Returns a fresh JavaScript Array, marked as fixed-length.
+  ///
+  /// [length] must be a non-negative integer.
   factory JSArray.fixed(int length) {
     // Explicit type test is necessary to guard against JavaScript conversions
     // in unchecked mode, and against `new Array(null)` which creates a single
@@ -49,16 +45,12 @@
     return new JSArray<E>.markFixed(JS('', 'new Array(#)', length));
   }
 
-  /**
-   * Returns a fresh growable JavaScript Array of zero length length.
-   */
+  /// Returns a fresh growable JavaScript Array of zero length length.
   factory JSArray.emptyGrowable() => new JSArray<E>.markGrowable(JS('', '[]'));
 
-  /**
-   * Returns a fresh growable JavaScript Array with initial length.
-   *
-   * [validatedLength] must be a non-negative integer.
-   */
+  /// Returns a fresh growable JavaScript Array with initial length.
+  ///
+  /// [validatedLength] must be a non-negative integer.
   factory JSArray.growable(int length) {
     // Explicit type test is necessary to guard against JavaScript conversions
     // in unchecked mode.
@@ -68,20 +60,18 @@
     return new JSArray<E>.markGrowable(JS('', 'new Array(#)', length));
   }
 
-  /**
-   * Constructor for adding type parameters to an existing JavaScript Array.
-   * The compiler specially recognizes this constructor.
-   *
-   *     var a = new JSArray<int>.typed(JS('JSExtendableArray', '[]'));
-   *     a is List<int>    --> true
-   *     a is List<String> --> false
-   *
-   * Usually either the [JSArray.markFixed] or [JSArray.markGrowable]
-   * constructors is used instead.
-   *
-   * The input must be a JavaScript Array.  The JS form is just a re-assertion
-   * to help type analysis when the input type is sloppy.
-   */
+  /// Constructor for adding type parameters to an existing JavaScript Array.
+  /// The compiler specially recognizes this constructor.
+  ///
+  ///     var a = new JSArray<int>.typed(JS('JSExtendableArray', '[]'));
+  ///     a is List<int>    --> true
+  ///     a is List<String> --> false
+  ///
+  /// Usually either the [JSArray.markFixed] or [JSArray.markGrowable]
+  /// constructors is used instead.
+  ///
+  /// The input must be a JavaScript Array.  The JS form is just a re-assertion
+  /// to help type analysis when the input type is sloppy.
   factory JSArray.typed(allocation) => JS('JSArray', '#', allocation);
 
   factory JSArray.markFixed(allocation) =>
@@ -181,9 +171,7 @@
     return false;
   }
 
-  /**
-   * Removes elements matching [test] from [this] List.
-   */
+  /// Removes elements matching [test] from [this] List.
   void removeWhere(bool test(E element)) {
     checkGrowable('removeWhere');
     _removeWhere(test, true);
@@ -677,17 +665,15 @@
   }
 }
 
-/**
- * Dummy subclasses that allow the backend to track more precise
- * information about arrays through their type. The CPA type inference
- * relies on the fact that these classes do not override [] nor []=.
- *
- * These classes are really a fiction, and can have no methods, since
- * getInterceptor always returns JSArray.  We should consider pushing the
- * 'isGrowable' and 'isMutable' checks into the getInterceptor implementation so
- * these classes can have specialized implementations. Doing so will challenge
- * many assumptions in the JS backend.
- */
+/// Dummy subclasses that allow the backend to track more precise
+/// information about arrays through their type. The CPA type inference
+/// relies on the fact that these classes do not override [] nor []=.
+///
+/// These classes are really a fiction, and can have no methods, since
+/// getInterceptor always returns JSArray.  We should consider pushing the
+/// 'isGrowable' and 'isMutable' checks into the getInterceptor implementation
+/// so these classes can have specialized implementations. Doing so will
+/// challenge many assumptions in the JS backend.
 class JSMutableArray<E> extends JSArray<E> implements JSMutableIndexable {}
 
 class JSFixedArray<E> extends JSMutableArray<E> {}
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 14bf26d..9457101 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -57,6 +57,7 @@
 
 part 'annotations.dart';
 part 'constant_map.dart';
+part 'instantiation.dart';
 part 'native_helper.dart';
 part 'regexp_helper.dart';
 part 'string_helper.dart';
@@ -274,45 +275,42 @@
       "because it is not included in a @MirrorsUsed annotation.");
 }
 
-/// Helper to print the given method information to the console the first
-/// time it is called with it.
+/// Helper used to instrument calls when the compiler is invoked with
+/// `--experiment-call-instrumentation`.
+///
+/// By default, whenever a method is invoked for the first time, it prints an id
+/// and the method name to the console. This can be overriden by adding a top
+/// level `dartCallInstrumentation` hook in JavaScript.
 @NoInline()
-void consoleTraceHelper(String method) {
-  if (JS('bool', '!this.cache')) {
-    JS('', 'this.cache = Object.create(null)');
-  }
-  if (JS('bool', '!this.cache[#]', method)) {
-    JS('', 'console.log(#)', method);
-    JS('', 'this.cache[#] = true', method);
-  }
-}
-
-List _traceBuffer;
-
-/// Helper to send coverage information as a POST request to a server.
-@NoInline()
-void postTraceHelper(int id, String name) {
-  // Note: we can't move this initialization to the declaration of
-  // [_traceBuffer] because [postTraceHelper] is called very early on functions
-  // that define constants, this happens before getters and setters are expanded
-  // and before main starts executing. This initialization here allows us to
-  // skip the lazy field initialization logic.
-  if (_traceBuffer == null) _traceBuffer = JS('JSArray', '[]');
-  if (JS('bool', '#.length == 0', _traceBuffer)) {
-    JS(
-        '',
-        r'''
-      window.setTimeout((function(buffer) {
-        return function() {
-          var xhr = new XMLHttpRequest();
-          xhr.open("POST", "/coverage_uri_to_amend_by_server");
-          xhr.send(JSON.stringify(buffer));
-          buffer.length = 0;
-        };
-      })(#), 1000)''',
-        _traceBuffer);
-  }
-  JS('', '#.push([#, #])', _traceBuffer, id, name);
+void traceHelper(dynamic /*int*/ id, dynamic /*String*/ qualifiedName) {
+  // Note: this method is written mostly in JavaScript to prevent a stack
+  // overflow. In particular, we use dynamic argument types because with with
+  // types, traceHelper would include type checks for the parameter types, those
+  // checks (intTypeCheck, stringTypeCheck) are themselves calls that end up
+  // invoking this traceHelper and produce a stack overflow.  Similarly if we
+  // had Dart code below using, for example, string interpolation, we would
+  // include extra calls to the Dart runtime that could also trigger a stack
+  // overflow. This approach here is simpler than making the compiler smart
+  // about how to generate traceHelper calls more carefully.
+  JS(
+      '',
+      r'''
+      (function (id, name) {
+        var hook = self.dartCallInstrumentation;
+        if (typeof hook === "function") {
+          hook(id, name);
+          return;
+        }
+        if (!this.callInstrumentationCache) {
+          this.callInstrumentationCache = Object.create(null);
+        }
+        if (!this.callInstrumentationCache[id]) {
+          console.log(id, name);
+          this.callInstrumentationCache[id] = true;
+        }
+      })(#, #)''',
+      id,
+      qualifiedName);
 }
 
 class JSInvocationMirror implements Invocation {
@@ -648,7 +646,7 @@
     return result;
   }
 
-  /** [: r"$".codeUnitAt(0) :] */
+  /// [: r"$".codeUnitAt(0) :]
   static const int DOLLAR_CHAR_VALUE = 36;
 
   /// Creates a string containing the complete type for the class [className]
@@ -1101,40 +1099,38 @@
         0));
   }
 
-  /**
-   * Implements [Function.apply] for the lazy and startup emitters.
-   *
-   * There are two types of closures that can reach this function:
-   *
-   * 1. tear-offs (including tear-offs of static functions).
-   * 2. anonymous closures.
-   *
-   * They are treated differently (although there are lots of similarities).
-   * Both have in common that they have
-   * a [JsGetName.CALL_CATCH_ALL] and
-   * a [JsGetName.REQUIRED_PARAMETER_PROPERTY] property.
-   *
-   * If the closure supports optional parameters, then they also feature
-   * a [JsGetName.DEFAULT_VALUES_PROPERTY] property.
-   *
-   * The catch-all property is a method that takes all arguments (including
-   * all optional positional or named arguments). If the function accepts
-   * optional arguments, then the default-values property stores (potentially
-   * wrapped in a function) the default values for the optional arguments. If
-   * the function accepts optional positional arguments, then the value is a
-   * JavaScript array with the default values. Otherwise, when the function
-   * accepts optional named arguments, it is a JavaScript object.
-   *
-   * The default-values property may either contain the value directly, or
-   * it can be a function that returns the default-values when invoked.
-   *
-   * If the function is an anonymous closure, then the catch-all property
-   * only contains a string pointing to the property that should be used
-   * instead. For example, if the catch-all property contains the string
-   * "call$4", then the object's "call$4" property should be used as if it was
-   * the value of the catch-all property.
-   */
-  static applyFunction2(Function function, List positionalArguments,
+  /// Implements [Function.apply] for the lazy and startup emitters.
+  ///
+  /// There are two types of closures that can reach this function:
+  ///
+  /// 1. tear-offs (including tear-offs of static functions).
+  /// 2. anonymous closures.
+  ///
+  /// They are treated differently (although there are lots of similarities).
+  /// Both have in common that they have
+  /// a [JsGetName.CALL_CATCH_ALL] and
+  /// a [JsGetName.REQUIRED_PARAMETER_PROPERTY] property.
+  ///
+  /// If the closure supports optional parameters, then they also feature
+  /// a [JsGetName.DEFAULT_VALUES_PROPERTY] property.
+  ///
+  /// The catch-all property is a method that takes all arguments (including
+  /// all optional positional or named arguments). If the function accepts
+  /// optional arguments, then the default-values property stores (potentially
+  /// wrapped in a function) the default values for the optional arguments. If
+  /// the function accepts optional positional arguments, then the value is a
+  /// JavaScript array with the default values. Otherwise, when the function
+  /// accepts optional named arguments, it is a JavaScript object.
+  ///
+  /// The default-values property may either contain the value directly, or
+  /// it can be a function that returns the default-values when invoked.
+  ///
+  /// If the function is an anonymous closure, then the catch-all property
+  /// only contains a string pointing to the property that should be used
+  /// instead. For example, if the catch-all property contains the string
+  /// "call$4", then the object's "call$4" property should be used as if it was
+  /// the value of the catch-all property.
+  static applyFunction(Function function, List positionalArguments,
       Map<String, dynamic> namedArguments) {
     // Fast shortcut for the common case.
     if (JS('bool', '# instanceof Array', positionalArguments) &&
@@ -1302,162 +1298,6 @@
     }
   }
 
-  static applyFunction(Function function, List positionalArguments,
-      Map<String, dynamic> namedArguments) {
-    // Dispatch on presence of named arguments to improve tree-shaking.
-    //
-    // This dispatch is as simple as possible to help the compiler detect the
-    // common case of `null` namedArguments, either via inlining or
-    // specialization.
-    return namedArguments == null
-        ? applyFunctionWithPositionalArguments(function, positionalArguments)
-        : applyFunctionWithNamedArguments(
-            function, positionalArguments, namedArguments);
-  }
-
-  static applyFunctionWithPositionalArguments(
-      Function function, List positionalArguments) {
-    List arguments;
-
-    if (positionalArguments != null) {
-      if (JS('bool', '# instanceof Array', positionalArguments)) {
-        arguments = JS('JSArray', '#', positionalArguments);
-      } else {
-        arguments = new List.from(positionalArguments);
-      }
-    } else {
-      arguments = [];
-    }
-
-    if (arguments.length == 0) {
-      String selectorName = JS_GET_NAME(JsGetName.CALL_PREFIX0);
-      if (JS('bool', '!!#[#]', function, selectorName)) {
-        return JS('', '#[#]()', function, selectorName);
-      }
-    } else if (arguments.length == 1) {
-      String selectorName = JS_GET_NAME(JsGetName.CALL_PREFIX1);
-      if (JS('bool', '!!#[#]', function, selectorName)) {
-        return JS('', '#[#](#[0])', function, selectorName, arguments);
-      }
-    } else if (arguments.length == 2) {
-      String selectorName = JS_GET_NAME(JsGetName.CALL_PREFIX2);
-      if (JS('bool', '!!#[#]', function, selectorName)) {
-        return JS('', '#[#](#[0],#[1])', function, selectorName, arguments,
-            arguments);
-      }
-    } else if (arguments.length == 3) {
-      String selectorName = JS_GET_NAME(JsGetName.CALL_PREFIX3);
-      if (JS('bool', '!!#[#]', function, selectorName)) {
-        return JS('', '#[#](#[0],#[1],#[2])', function, selectorName, arguments,
-            arguments, arguments);
-      }
-    } else if (arguments.length == 4) {
-      String selectorName = JS_GET_NAME(JsGetName.CALL_PREFIX4);
-      if (JS('bool', '!!#[#]', function, selectorName)) {
-        return JS('', '#[#](#[0],#[1],#[2],#[3])', function, selectorName,
-            arguments, arguments, arguments, arguments);
-      }
-    } else if (arguments.length == 5) {
-      String selectorName = JS_GET_NAME(JsGetName.CALL_PREFIX5);
-      if (JS('bool', '!!#[#]', function, selectorName)) {
-        return JS('', '#[#](#[0],#[1],#[2],#[3],#[4])', function, selectorName,
-            arguments, arguments, arguments, arguments, arguments);
-      }
-    }
-    return _genericApplyFunctionWithPositionalArguments(function, arguments);
-  }
-
-  static _genericApplyFunctionWithPositionalArguments(
-      Function function, List arguments) {
-    int argumentCount = arguments.length;
-    String selectorName =
-        '${JS_GET_NAME(JsGetName.CALL_PREFIX)}\$$argumentCount';
-    var jsFunction = JS('var', '#[#]', function, selectorName);
-    if (jsFunction == null) {
-      var interceptor = getInterceptor(function);
-      jsFunction =
-          JS('', '#[#]', interceptor, JS_GET_NAME(JsGetName.CALL_CATCH_ALL));
-
-      if (jsFunction == null) {
-        return functionNoSuchMethod(function, arguments, null);
-      }
-      ReflectionInfo info = new ReflectionInfo(jsFunction);
-      int requiredArgumentCount = info.requiredParameterCount;
-      int maxArgumentCount =
-          requiredArgumentCount + info.optionalParameterCount;
-      if (info.areOptionalParametersNamed ||
-          requiredArgumentCount > argumentCount ||
-          maxArgumentCount < argumentCount) {
-        return functionNoSuchMethod(function, arguments, null);
-      }
-      arguments = new List.from(arguments);
-      for (int pos = argumentCount; pos < maxArgumentCount; pos++) {
-        arguments.add(getMetadata(info.defaultValue(pos)));
-      }
-    }
-    // We bound 'this' to [function] because of how we compile
-    // closures: escaped local variables are stored and accessed through
-    // [function].
-    return JS('var', '#.apply(#, #)', jsFunction, function, arguments);
-  }
-
-  static applyFunctionWithNamedArguments(Function function,
-      List positionalArguments, Map<String, dynamic> namedArguments) {
-    if (namedArguments.isEmpty) {
-      return applyFunctionWithPositionalArguments(
-          function, positionalArguments);
-    }
-    // TODO(ahe): The following code can be shared with
-    // JsInstanceMirror.invoke.
-    var interceptor = getInterceptor(function);
-    var jsFunction =
-        JS('', '#[#]', interceptor, JS_GET_NAME(JsGetName.CALL_CATCH_ALL));
-
-    if (jsFunction == null) {
-      return functionNoSuchMethod(
-          function, positionalArguments, namedArguments);
-    }
-    ReflectionInfo info = new ReflectionInfo(jsFunction);
-    if (info == null || !info.areOptionalParametersNamed) {
-      return functionNoSuchMethod(
-          function, positionalArguments, namedArguments);
-    }
-
-    if (positionalArguments != null) {
-      positionalArguments = new List.from(positionalArguments);
-    } else {
-      positionalArguments = [];
-    }
-    // Check the number of positional arguments is valid.
-    if (info.requiredParameterCount != positionalArguments.length) {
-      return functionNoSuchMethod(
-          function, positionalArguments, namedArguments);
-    }
-    var defaultArguments = new Map();
-    for (int i = 0; i < info.optionalParameterCount; i++) {
-      int index = i + info.requiredParameterCount;
-      var parameterName = info.parameterNameInOrder(index);
-      var value = info.defaultValueInOrder(index);
-      var defaultValue = getMetadata(value);
-      defaultArguments[parameterName] = defaultValue;
-    }
-    bool bad = false;
-    namedArguments.forEach((String parameter, value) {
-      if (defaultArguments.containsKey(parameter)) {
-        defaultArguments[parameter] = value;
-      } else {
-        // Extraneous named argument.
-        bad = true;
-      }
-    });
-    if (bad) {
-      return functionNoSuchMethod(
-          function, positionalArguments, namedArguments);
-    }
-    positionalArguments.addAll(defaultArguments.values);
-    return JS('', '#.apply(#, #)', jsFunction, function, positionalArguments);
-  }
-
   static StackTrace extractStackTrace(Error error) {
     return getTraceFromException(JS('', r'#.$thrownJsError', error));
   }
@@ -1486,32 +1326,27 @@
   }
 }
 
-/**
- * Called by generated code to throw an illegal-argument exception,
- * for example, if a non-integer index is given to an optimized
- * indexed access.
- */
+/// Called by generated code to throw an illegal-argument exception,
+/// for example, if a non-integer index is given to an optimized
+/// indexed access.
 @NoInline()
 iae(argument) {
   throw argumentErrorValue(argument);
 }
 
-/**
- * Called by generated code to throw an index-out-of-range exception, for
- * example, if a bounds check fails in an optimized indexed access.  This may
- * also be called when the index is not an integer, in which case it throws an
- * illegal-argument exception instead, like [iae], or when the receiver is null.
- */
+/// Called by generated code to throw an index-out-of-range exception, for
+/// example, if a bounds check fails in an optimized indexed access.  This may
+/// also be called when the index is not an integer, in which case it throws an
+/// illegal-argument exception instead, like [iae], or when the receiver is
+/// null.
 @NoInline()
 ioore(receiver, index) {
   if (receiver == null) receiver.length; // Force a NoSuchMethodError.
   throw diagnoseIndexError(receiver, index);
 }
 
-/**
- * Diagnoses an indexing error. Returns the ArgumentError or RangeError that
- * describes the problem.
- */
+/// Diagnoses an indexing error. Returns the ArgumentError or RangeError that
+/// describes the problem.
 @NoInline()
 Error diagnoseIndexError(indexable, index) {
   if (index is! int) return new ArgumentError.value(index, 'index');
@@ -1525,10 +1360,8 @@
   return new RangeError.value(index, 'index');
 }
 
-/**
- * Diagnoses a range error. Returns the ArgumentError or RangeError that
- * describes the problem.
- */
+/// Diagnoses a range error. Returns the ArgumentError or RangeError that
+/// describes the problem.
 @NoInline()
 Error diagnoseRangeError(start, end, length) {
   if (start is! int) {
@@ -1584,12 +1417,10 @@
   return value;
 }
 
-/**
- * Wrap the given Dart object and record a stack trace.
- *
- * The code in [unwrapException] deals with getting the original Dart
- * object out of the wrapper again.
- */
+/// Wrap the given Dart object and record a stack trace.
+///
+/// The code in [unwrapException] deals with getting the original Dart
+/// object out of the wrapper again.
 @NoInline()
 wrapException(ex) {
   if (ex == null) ex = new NullThrownError();
@@ -1621,12 +1452,10 @@
   return JS('', r'this.dartException').toString();
 }
 
-/**
- * This wraps the exception and does the throw.  It is possible to call this in
- * a JS expression context, where the throw statement is not allowed.  Helpers
- * are never inlined, so we don't risk inlining the throw statement into an
- * expression context.
- */
+/// This wraps the exception and does the throw.  It is possible to call this in
+/// a JS expression context, where the throw statement is not allowed.  Helpers
+/// are never inlined, so we don't risk inlining the throw statement into an
+/// expression context.
 throwExpression(ex) {
   JS('void', 'throw #', wrapException(ex));
 }
@@ -1668,9 +1497,7 @@
   throw new ConcurrentModificationError(collection);
 }
 
-/**
- * Helper class for building patterns recognizing native type errors.
- */
+/// Helper class for building patterns recognizing native type errors.
 class TypeErrorDecoder {
   // Field names are private to help tree-shaking.
 
@@ -2049,14 +1876,12 @@
   ExceptionAndStackTrace(this.dartException, this.stackTrace);
 }
 
-/**
- * Called from catch blocks in generated code to extract the Dart
- * exception from the thrown value. The thrown value may have been
- * created by [wrapException] or it may be a 'native' JS exception.
- *
- * Some native exceptions are mapped to new Dart instances, others are
- * returned unmodified.
- */
+/// Called from catch blocks in generated code to extract the Dart
+/// exception from the thrown value. The thrown value may have been
+/// created by [wrapException] or it may be a 'native' JS exception.
+///
+/// Some native exceptions are mapped to new Dart instances, others are
+/// returned unmodified.
 unwrapException(ex) {
   /// If error implements Error, save [ex] in [error.$thrownJsError].
   /// Otherwise, do nothing. Later, the stack trace can then be extracted from
@@ -2206,10 +2031,8 @@
       ex);
 }
 
-/**
- * Called by generated code to fetch the stack trace from an
- * exception. Should never return null.
- */
+/// Called by generated code to fetch the stack trace from an
+/// exception. Should never return null.
 StackTrace getTraceFromException(exception) {
   if (exception is ExceptionAndStackTrace) {
     return exception.stackTrace;
@@ -2246,10 +2069,8 @@
   }
 }
 
-/**
- * Called by generated code to build a map literal. [keyValuePairs] is
- * a list of key, value, key, value, ..., etc.
- */
+/// Called by generated code to build a map literal. [keyValuePairs] is
+/// a list of key, value, key, value, ..., etc.
 fillLiteralMap(keyValuePairs, Map result) {
   // TODO(johnniwinther): Use JSArray to optimize this code instead of calling
   // [getLength] and [getIndex].
@@ -2280,10 +2101,8 @@
   throw new Exception('Unsupported number of arguments for wrapped closure');
 }
 
-/**
- * Called by generated code to convert a Dart closure to a JS
- * closure when the Dart closure is passed to the DOM.
- */
+/// Called by generated code to convert a Dart closure to a JS
+/// closure when the Dart closure is passed to the DOM.
 convertDartClosureToJS(closure, int arity) {
   if (closure == null) return null;
   var function = JS('var', r'#.$identity', closure);
@@ -2320,40 +2139,36 @@
   static const OPTIONAL_PARAMETER_INDEX = 4;
   static const DEFAULT_ARGUMENTS_INDEX = 5;
 
-  /**
-   * Global counter to prevent reusing function code objects.
-   *
-   * V8 will share the underlying function code objects when the same string is
-   * passed to "new Function".  Shared function code objects can lead to
-   * sub-optimal performance due to polymorphism, and can be prevented by
-   * ensuring the strings are different, for example, by generating a local
-   * variable with a name dependent on [functionCounter].
-   */
+  /// Global counter to prevent reusing function code objects.
+  ///
+  /// V8 will share the underlying function code objects when the same string is
+  /// passed to "new Function".  Shared function code objects can lead to
+  /// sub-optimal performance due to polymorphism, and can be prevented by
+  /// ensuring the strings are different, for example, by generating a local
+  /// variable with a name dependent on [functionCounter].
   static int functionCounter = 0;
 
   Closure();
 
-  /**
-   * Creates a new closure class for use by implicit getters associated with a
-   * method.
-   *
-   * In other words, creates a tear-off closure.
-   *
-   * Called from [closureFromTearOff] as well as from reflection when tearing
-   * of a method via `getField`.
-   *
-   * This method assumes that [functions] was created by the JavaScript function
-   * `addStubs` in `reflection_data_parser.dart`. That is, a list of JavaScript
-   * function objects with properties `$stubName` and `$callName`.
-   *
-   * Further assumes that [reflectionInfo] is the end of the array created by
-   * [dart2js.js_emitter.ContainerBuilder.addMemberMethod] starting with
-   * required parameter count or, in case of the new emitter, the runtime
-   * representation of the function's type.
-   *
-   * Caution: this function may be called when building constants.
-   * TODO(ahe): Don't call this function when building constants.
-   */
+  /// Creates a new closure class for use by implicit getters associated with a
+  /// method.
+  ///
+  /// In other words, creates a tear-off closure.
+  ///
+  /// Called from [closureFromTearOff] as well as from reflection when tearing
+  /// of a method via `getField`.
+  ///
+  /// This method assumes that [functions] was created by the JavaScript
+  /// function `addStubs` in `reflection_data_parser.dart`. That is, a list of
+  /// JavaScript function objects with properties `$stubName` and `$callName`.
+  ///
+  /// Further assumes that [reflectionInfo] is the end of the array created by
+  /// [dart2js.js_emitter.ContainerBuilder.addMemberMethod] starting with
+  /// required parameter count or, in case of the new emitter, the runtime
+  /// representation of the function's type.
+  ///
+  /// Caution: this function may be called when building constants.
+  /// TODO(ahe): Don't call this function when building constants.
   static fromTearOff(
     receiver,
     List functions,
@@ -2907,331 +2722,6 @@
   }
 }
 
-/// Support class for generic function type instantiation (binding of types).
-///
-abstract class Instantiation extends Closure {
-  final Closure _genericClosure;
-  Instantiation(this._genericClosure) {
-    // TODO(sra): Copy some metadata used by Function.apply.
-
-    // Mark support code as used.  The JS condition is inscrutable to dart2js,
-    // so the 'if (false)' is in the final program.
-    // TODO(sra): Find a better way to do this. Generating the signature methods
-    // earlier as SSA on the instantiation closures should achieve this.
-    if (JS('bool', 'false')) {
-      // [instantiatedGenericFunctionType] is called from injected $signature
-      // methods with runtime type representations.
-      instantiatedGenericFunctionType(JS('', '0'), JS('', '0'));
-    }
-  }
-
-  /// Returns a list of the bound types.
-  List get _types;
-
-  String toString() {
-    var types = "<${_types.join(', ')}>";
-    // TODO(sra): Refactor Closure formatting to place type arguments inside,
-    // e.g. "Closure 'map<String>' of Instance of 'JSArray<int>'".
-    return '$_genericClosure with $types';
-  }
-}
-
-/// Instantiation classes are subclasses of [Instantiation]. For now we have a
-/// fixed number of subclasses. Later we might generate the classes on demand.
-class Instantiation1<T1> extends Instantiation {
-  Instantiation1(Closure f) : super(f);
-  List get _types => [T1];
-}
-
-class Instantiation2<T1, T2> extends Instantiation {
-  Instantiation2(Closure f) : super(f);
-  List get _types => [T1, T2];
-}
-
-class Instantiation3<T1, T2, T3> extends Instantiation {
-  Instantiation3(Closure f) : super(f);
-  List get _types => [T1, T2, T3];
-}
-
-class Instantiation4<T1, T2, T3, T4> extends Instantiation {
-  Instantiation4(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4];
-}
-
-class Instantiation5<T1, T2, T3, T4, T5> extends Instantiation {
-  Instantiation5(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5];
-}
-
-class Instantiation6<T1, T2, T3, T4, T5, T6> extends Instantiation {
-  Instantiation6(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5, T6];
-}
-
-class Instantiation7<T1, T2, T3, T4, T5, T6, T7> extends Instantiation {
-  Instantiation7(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5, T6, T7];
-}
-
-class Instantiation8<T1, T2, T3, T4, T5, T6, T7, T8> extends Instantiation {
-  Instantiation8(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8];
-}
-
-class Instantiation9<T1, T2, T3, T4, T5, T6, T7, T8, T9> extends Instantiation {
-  Instantiation9(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9];
-}
-
-class Instantiation10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
-    extends Instantiation {
-  Instantiation10(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10];
-}
-
-class Instantiation11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
-    extends Instantiation {
-  Instantiation11(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11];
-}
-
-class Instantiation12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
-    extends Instantiation {
-  Instantiation12(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12];
-}
-
-class Instantiation13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>
-    extends Instantiation {
-  Instantiation13(Closure f) : super(f);
-  List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13];
-}
-
-class Instantiation14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14> extends Instantiation {
-  Instantiation14(Closure f) : super(f);
-  List get _types =>
-      [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14];
-}
-
-class Instantiation15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15> extends Instantiation {
-  Instantiation15(Closure f) : super(f);
-  List get _types =>
-      [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15];
-}
-
-class Instantiation16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16> extends Instantiation {
-  Instantiation16(Closure f) : super(f);
-  List get _types =>
-      [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16];
-}
-
-class Instantiation17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17> extends Instantiation {
-  Instantiation17(Closure f) : super(f);
-  List get _types => [
-        T1,
-        T2,
-        T3,
-        T4,
-        T5,
-        T6,
-        T7,
-        T8,
-        T9,
-        T10,
-        T11,
-        T12,
-        T13,
-        T14,
-        T15,
-        T16,
-        T17
-      ];
-}
-
-class Instantiation18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18> extends Instantiation {
-  Instantiation18(Closure f) : super(f);
-  List get _types => [
-        T1,
-        T2,
-        T3,
-        T4,
-        T5,
-        T6,
-        T7,
-        T8,
-        T9,
-        T10,
-        T11,
-        T12,
-        T13,
-        T14,
-        T15,
-        T16,
-        T17,
-        T18
-      ];
-}
-
-class Instantiation19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19> extends Instantiation {
-  Instantiation19(Closure f) : super(f);
-  List get _types => [
-        T1,
-        T2,
-        T3,
-        T4,
-        T5,
-        T6,
-        T7,
-        T8,
-        T9,
-        T10,
-        T11,
-        T12,
-        T13,
-        T14,
-        T15,
-        T16,
-        T17,
-        T18,
-        T19
-      ];
-}
-
-class Instantiation20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
-    T14, T15, T16, T17, T18, T19, T20> extends Instantiation {
-  Instantiation20(Closure f) : super(f);
-  List get _types => [
-        T1,
-        T2,
-        T3,
-        T4,
-        T5,
-        T6,
-        T7,
-        T8,
-        T9,
-        T10,
-        T11,
-        T12,
-        T13,
-        T14,
-        T15,
-        T16,
-        T17,
-        T18,
-        T19,
-        T20
-      ];
-}
-
-Instantiation instantiate1<T1>(Closure f) {
-  return new Instantiation1<T1>(f);
-}
-
-Instantiation instantiate2<T1, T2>(Closure f) {
-  return new Instantiation2<T1, T2>(f);
-}
-
-Instantiation instantiate3<T1, T2, T3>(Closure f) {
-  return new Instantiation3<T1, T2, T3>(f);
-}
-
-Instantiation instantiate4<T1, T2, T3, T4>(Closure f) {
-  return new Instantiation4<T1, T2, T3, T4>(f);
-}
-
-Instantiation instantiate5<T1, T2, T3, T4, T5>(Closure f) {
-  return new Instantiation5<T1, T2, T3, T4, T5>(f);
-}
-
-Instantiation instantiate6<T1, T2, T3, T4, T5, T6>(Closure f) {
-  return new Instantiation6<T1, T2, T3, T4, T5, T6>(f);
-}
-
-Instantiation instantiate7<T1, T2, T3, T4, T5, T6, T7>(Closure f) {
-  return new Instantiation7<T1, T2, T3, T4, T5, T6, T7>(f);
-}
-
-Instantiation instantiate8<T1, T2, T3, T4, T5, T6, T7, T8>(Closure f) {
-  return new Instantiation8<T1, T2, T3, T4, T5, T6, T7, T8>(f);
-}
-
-Instantiation instantiate9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(Closure f) {
-  return new Instantiation9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(f);
-}
-
-Instantiation instantiate10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
-    Closure f) {
-  return new Instantiation10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(f);
-}
-
-Instantiation instantiate11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(
-    Closure f) {
-  return new Instantiation11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(f);
-}
-
-Instantiation instantiate12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(
-    Closure f) {
-  return new Instantiation12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(
-      f);
-}
-
-Instantiation
-    instantiate13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(
-        Closure f) {
-  return new Instantiation13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13>(f);
-}
-
-Instantiation
-    instantiate14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(
-        Closure f) {
-  return new Instantiation14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14>(f);
-}
-
-Instantiation instantiate15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-    T13, T14, T15>(Closure f) {
-  return new Instantiation15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15>(f);
-}
-
-Instantiation instantiate16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-    T13, T14, T15, T16>(Closure f) {
-  return new Instantiation16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16>(f);
-}
-
-Instantiation instantiate17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-    T13, T14, T15, T16, T17>(Closure f) {
-  return new Instantiation17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17>(f);
-}
-
-Instantiation instantiate18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-    T13, T14, T15, T16, T17, T18>(Closure f) {
-  return new Instantiation18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18>(f);
-}
-
-Instantiation instantiate19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-    T13, T14, T15, T16, T17, T18, T19>(Closure f) {
-  return new Instantiation19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19>(f);
-}
-
-Instantiation instantiate20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-    T13, T14, T15, T16, T17, T18, T19, T20>(Closure f) {
-  return new Instantiation20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
-      T13, T14, T15, T16, T17, T18, T19, T20>(f);
-}
-
 bool jsHasOwnProperty(var jsObject, String property) {
   return JS('bool', r'#.hasOwnProperty(#)', jsObject, property);
 }
@@ -3240,101 +2730,91 @@
   return JS('var', r'#[#]', jsObject, property);
 }
 
-/**
- * Called at the end of unaborted switch cases to get the singleton
- * FallThroughError exception that will be thrown.
- */
+/// Called at the end of unaborted switch cases to get the singleton
+/// FallThroughError exception that will be thrown.
 getFallThroughError() => new FallThroughErrorImplementation();
 
-/**
- * A metadata annotation describing the types instantiated by a native element.
- *
- * The annotation is valid on a native method and a field of a native class.
- *
- * By default, a field of a native class is seen as an instantiation point for
- * all native classes that are a subtype of the field's type, and a native
- * method is seen as an instantiation point fo all native classes that are a
- * subtype of the method's return type, or the argument types of the declared
- * type of the method's callback parameter.
- *
- * An @[Creates] annotation overrides the default set of instantiated types.  If
- * one or more @[Creates] annotations are present, the type of the native
- * element is ignored, and the union of @[Creates] annotations is used instead.
- * The names in the strings are resolved and the program will fail to compile
- * with dart2js if they do not name types.
- *
- * The argument to [Creates] is a string.  The string is parsed as the names of
- * one or more types, separated by vertical bars `|`.  There are some special
- * names:
- *
- * * `=Object`. This means 'exactly Object', which is a plain JavaScript object
- *   with properties and none of the subtypes of Object.
- *
- * Example: we may know that a method always returns a specific implementation:
- *
- *     @Creates('_NodeList')
- *     List<Node> getElementsByTagName(String tag) native;
- *
- * Useful trick: A method can be marked as not instantiating any native classes
- * with the annotation `@Creates('Null')`.  This is useful for fields on native
- * classes that are used only in Dart code.
- *
- *     @Creates('Null')
- *     var _cachedFoo;
- */
+/// A metadata annotation describing the types instantiated by a native element.
+///
+/// The annotation is valid on a native method and a field of a native class.
+///
+/// By default, a field of a native class is seen as an instantiation point for
+/// all native classes that are a subtype of the field's type, and a native
+/// method is seen as an instantiation point fo all native classes that are a
+/// subtype of the method's return type, or the argument types of the declared
+/// type of the method's callback parameter.
+///
+/// An @[Creates] annotation overrides the default set of instantiated types.
+/// If one or more @[Creates] annotations are present, the type of the native
+/// element is ignored, and the union of @[Creates] annotations is used instead.
+/// The names in the strings are resolved and the program will fail to compile
+/// with dart2js if they do not name types.
+///
+/// The argument to [Creates] is a string.  The string is parsed as the names of
+/// one or more types, separated by vertical bars `|`.  There are some special
+/// names:
+///
+/// * `=Object`. This means 'exactly Object', which is a plain JavaScript object
+///   with properties and none of the subtypes of Object.
+///
+/// Example: we may know that a method always returns a specific implementation:
+///
+///     @Creates('_NodeList')
+///     List<Node> getElementsByTagName(String tag) native;
+///
+/// Useful trick: A method can be marked as not instantiating any native classes
+/// with the annotation `@Creates('Null')`.  This is useful for fields on native
+/// classes that are used only in Dart code.
+///
+///     @Creates('Null')
+///     var _cachedFoo;
 class Creates {
   final String types;
   const Creates(this.types);
 }
 
-/**
- * A metadata annotation describing the types returned or yielded by a native
- * element.
- *
- * The annotation is valid on a native method and a field of a native class.
- *
- * By default, a native method or field is seen as returning or yielding all
- * subtypes if the method return type or field type.  This annotation allows a
- * more precise set of types to be specified.
- *
- * See [Creates] for the syntax of the argument.
- *
- * Example: IndexedDB keys are numbers, strings and JavaScript Arrays of keys.
- *
- *     @Returns('String|num|JSExtendableArray')
- *     dynamic key;
- *
- *     // Equivalent:
- *     @Returns('String') @Returns('num') @Returns('JSExtendableArray')
- *     dynamic key;
- */
+/// A metadata annotation describing the types returned or yielded by a native
+/// element.
+///
+/// The annotation is valid on a native method and a field of a native class.
+///
+/// By default, a native method or field is seen as returning or yielding all
+/// subtypes if the method return type or field type.  This annotation allows a
+/// more precise set of types to be specified.
+///
+/// See [Creates] for the syntax of the argument.
+///
+/// Example: IndexedDB keys are numbers, strings and JavaScript Arrays of keys.
+///
+///     @Returns('String|num|JSExtendableArray')
+///     dynamic key;
+///
+///     // Equivalent:
+///     @Returns('String') @Returns('num') @Returns('JSExtendableArray')
+///     dynamic key;
 class Returns {
   final String types;
   const Returns(this.types);
 }
 
-/**
- * A metadata annotation placed on native methods and fields of native classes
- * to specify the JavaScript name.
- *
- * This example declares a Dart field + getter + setter called `$dom_title` that
- * corresponds to the JavaScript property `title`.
- *
- *     class Document native "*Foo" {
- *       @JSName('title')
- *       String $dom_title;
- *     }
- */
+/// A metadata annotation placed on native methods and fields of native classes
+/// to specify the JavaScript name.
+///
+/// This example declares a Dart field + getter + setter called `$dom_title`
+/// that corresponds to the JavaScript property `title`.
+///
+///     class Document native "*Foo" {
+///       @JSName('title')
+///       String $dom_title;
+///     }
 class JSName {
   final String name;
   const JSName(this.name);
 }
 
-/**
- * The following methods are called by the runtime to implement
- * checked mode and casts. We specialize each primitive type (eg int, bool), and
- * use the compiler's convention to do is-checks on regular objects.
- */
+/// The following methods are called by the runtime to implement checked mode
+/// and casts. We specialize each primitive type (eg int, bool), and use the
+/// compiler's convention to do is-checks on regular objects.
 boolConversionCheck(value) {
   if (value is bool) return value;
   // One of the following checks will always fail.
@@ -3409,32 +2889,26 @@
   throw new CastErrorImplementation(value, unminifyOrTag(name));
 }
 
-/**
- * For types that are not supertypes of native (eg DOM) types,
- * we emit a simple property check to check that an object implements
- * that type.
- */
+/// For types that are not supertypes of native (eg DOM) types,
+/// we emit a simple property check to check that an object implements
+/// that type.
 propertyTypeCheck(value, property) {
   if (value == null) return value;
   if (JS('bool', '!!#[#]', value, property)) return value;
   propertyTypeError(value, property);
 }
 
-/**
- * For types that are not supertypes of native (eg DOM) types,
- * we emit a simple property check to check that an object implements
- * that type.
- */
+/// For types that are not supertypes of native (eg DOM) types,
+/// we emit a simple property check to check that an object implements
+/// that type.
 propertyTypeCast(value, property) {
   if (value == null || JS('bool', '!!#[#]', value, property)) return value;
   propertyTypeCastError(value, property);
 }
 
-/**
- * For types that are supertypes of native (eg DOM) types, we use the
- * interceptor for the class because we cannot add a JS property to the
- * prototype at load time.
- */
+/// For types that are supertypes of native (eg DOM) types, we use the
+/// interceptor for the class because we cannot add a JS property to the
+/// prototype at load time.
 interceptedTypeCheck(value, property) {
   if (value == null) return value;
   if ((JS('bool', 'typeof # === "object"', value) ||
@@ -3445,11 +2919,9 @@
   propertyTypeError(value, property);
 }
 
-/**
- * For types that are supertypes of native (eg DOM) types, we use the
- * interceptor for the class because we cannot add a JS property to the
- * prototype at load time.
- */
+/// For types that are supertypes of native (eg DOM) types, we use the
+/// interceptor for the class because we cannot add a JS property to the
+/// prototype at load time.
 interceptedTypeCast(value, property) {
   if (value == null ||
       ((JS('bool', 'typeof # === "object"', value) ||
@@ -3460,10 +2932,8 @@
   propertyTypeCastError(value, property);
 }
 
-/**
- * Specialization of the type check for num and String and their
- * supertype since [value] can be a JS primitive.
- */
+/// Specialization of the type check for num and String and their
+/// supertype since [value] can be a JS primitive.
 numberOrStringSuperTypeCheck(value, property) {
   if (value == null) return value;
   if (value is String) return value;
@@ -3494,10 +2964,8 @@
   propertyTypeCastError(value, property);
 }
 
-/**
- * Specialization of the type check for String and its supertype
- * since [value] can be a JS primitive.
- */
+/// Specialization of the type check for String and its supertype
+/// since [value] can be a JS primitive.
 stringSuperTypeCheck(value, property) {
   if (value == null) return value;
   if (value is String) return value;
@@ -3523,10 +2991,8 @@
   propertyTypeCastError(value, property);
 }
 
-/**
- * Specialization of the type check for List and its supertypes,
- * since [value] can be a JS array.
- */
+/// Specialization of the type check for List and its supertypes,
+/// since [value] can be a JS array.
 listTypeCheck(value) {
   if (value == null) return value;
   if (value is List) return value;
@@ -3641,17 +3107,15 @@
   }
 }
 
-/**
- * Special interface recognized by the compiler and implemented by DOM
- * objects that support integer indexing. This interface is not
- * visible to anyone, and is only injected into special libraries.
- */
+/// Special interface recognized by the compiler and implemented by DOM
+/// objects that support integer indexing. This interface is not
+/// visible to anyone, and is only injected into special libraries.
 abstract class JavaScriptIndexingBehavior<E> extends JSMutableIndexable<E> {}
 
 // TODO(lrn): These exceptions should be implemented in core.
 // When they are, remove the 'Implementation' here.
 
-/** Thrown by type assertions that fail. */
+/// Thrown by type assertions that fail.
 class TypeErrorImplementation extends Error implements TypeError {
   final String message;
 
@@ -3665,7 +3129,7 @@
   String toString() => message;
 }
 
-/** Thrown by the 'as' operator if the cast isn't valid. */
+/// Thrown by the 'as' operator if the cast isn't valid.
 class CastErrorImplementation extends Error implements CastError {
   // TODO(lrn): Rename to CastError (and move implementation into core).
   final String message;
@@ -3694,12 +3158,11 @@
   String toString() => 'Switch case fall-through.';
 }
 
-/**
- * Helper function for implementing asserts. The compiler treats this specially.
- *
- * Returns the negation of the condition. That is: `true` if the assert should
- * fail.
- */
+/// Helper function for implementing asserts. The compiler treats this
+/// specially.
+///
+/// Returns the negation of the condition. That is: `true` if the assert should
+/// fail.
 bool assertTest(condition) {
   // Do bool success check first, it is common and faster than 'is Function'.
   if (true == condition) return false;
@@ -3707,44 +3170,34 @@
   throw new TypeErrorImplementation(condition, 'bool');
 }
 
-/**
- * Helper function for implementing asserts with messages.
- * The compiler treats this specially.
- */
+/// Helper function for implementing asserts with messages.
+/// The compiler treats this specially.
 void assertThrow(Object message) {
   throw new _AssertionError(message);
 }
 
-/**
- * Helper function for implementing asserts without messages.
- * The compiler treats this specially.
- */
+/// Helper function for implementing asserts without messages.
+/// The compiler treats this specially.
 @NoInline()
 void assertHelper(condition) {
   if (assertTest(condition)) throw new AssertionError();
 }
 
-/**
- * Called by generated code when a method that must be statically
- * resolved cannot be found.
- */
+/// Called by generated code when a method that must be statically
+/// resolved cannot be found.
 void throwNoSuchMethod(obj, name, arguments, expectedArgumentNames) {
   Symbol memberName = new _symbol_dev.Symbol.unvalidated(name);
   throw new NoSuchMethodError(obj, memberName, arguments,
       new Map<Symbol, dynamic>(), expectedArgumentNames);
 }
 
-/**
- * Called by generated code when a static field's initializer references the
- * field that is currently being initialized.
- */
+/// Called by generated code when a static field's initializer references the
+/// field that is currently being initialized.
 void throwCyclicInit(String staticName) {
   throw new CyclicInitializationError(staticName);
 }
 
-/**
- * Error thrown when a runtime error occurs.
- */
+/// Error thrown when a runtime error occurs.
 class RuntimeError extends Error {
   final message;
   RuntimeError(this.message);
@@ -3771,11 +3224,9 @@
   String toString() => 'Unsupported operation: $_message';
 }
 
-/**
- * Creates a random number with 64 bits of randomness.
- *
- * This will be truncated to the 53 bits available in a double.
- */
+/// Creates a random number with 64 bits of randomness.
+///
+/// This will be truncated to the 53 bits available in a double.
 int random64() {
   // TODO(lrn): Use a secure random source.
   int int32a = JS('int', '(Math.random() * 0x100000000) >>> 0');
@@ -3787,14 +3238,12 @@
   return JS('String', 'JSON.stringify(#)', string);
 }
 
-/**
- * Returns a property name for placing data on JavaScript objects shared between
- * DOM isolates.  This happens when multiple programs are loaded in the same
- * JavaScript context (i.e. page).  The name is based on [name] but with an
- * additional part that is unique for each isolate.
- *
- * The form of the name is '___dart_$name_$id'.
- */
+/// Returns a property name for placing data on JavaScript objects shared
+/// between DOM isolates.  This happens when multiple programs are loaded in the
+/// same JavaScript context (i.e. page).  The name is based on [name] but with
+/// an additional part that is unique for each isolate.
+///
+/// The form of the name is '___dart_$name_$id'.
 String getIsolateAffinityTag(String name) {
   var isolateTagGetter = JS_EMBEDDED_GLOBAL('', GET_ISOLATE_TAG);
   return JS('String', '#(#)', isolateTagGetter, name);
diff --git a/sdk/lib/_internal/js_runtime/lib/js_names.dart b/sdk/lib/_internal/js_runtime/lib/js_names.dart
index d3eaa07..572d354 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_names.dart
@@ -139,17 +139,15 @@
   return new JSArray.markFixed(result);
 }
 
-/**
- * Returns the (global) unmangled version of [name].
- *
- * Normally, you should use [mangledGlobalNames] directly, but this method
- * doesn't tell the compiler to preserve names. So this method only returns a
- * non-null value if some other component has made the compiler preserve names.
- *
- * This is used, for example, to return unmangled names from TypeImpl.toString
- * *if* names are being preserved for other reasons (use of dart:mirrors, for
- * example).
- */
+/// Returns the (global) unmangled version of [name].
+///
+/// Normally, you should use [mangledGlobalNames] directly, but this method
+/// doesn't tell the compiler to preserve names. So this method only returns a
+/// non-null value if some other component has made the compiler preserve names.
+///
+/// This is used, for example, to return unmangled names from TypeImpl.toString
+/// *if* names are being preserved for other reasons (use of dart:mirrors, for
+/// example).
 String unmangleGlobalNameIfPreservedAnyways(String name) {
   var names = JS_EMBEDDED_GLOBAL('=Object', MANGLED_GLOBAL_NAMES);
   return JsCache.fetch(names, name);
diff --git a/sdk/lib/_internal/js_runtime/lib/js_number.dart b/sdk/lib/_internal/js_runtime/lib/js_number.dart
index 58e5e55..1c030f3 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_number.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_number.dart
@@ -4,15 +4,13 @@
 
 part of _interceptors;
 
-/**
- * The super interceptor class for [JSInt] and [JSDouble]. The compiler
- * recognizes this class as an interceptor, and changes references to
- * [:this:] to actually use the receiver of the method, which is
- * generated as an extra argument added to each member.
- *
- * Note that none of the methods here delegate to a method defined on JSInt or
- * JSDouble.  This is exploited in [tryComputeConstantInterceptor].
- */
+/// The super interceptor class for [JSInt] and [JSDouble]. The compiler
+/// recognizes this class as an interceptor, and changes references to
+/// [:this:] to actually use the receiver of the method, which is
+/// generated as an extra argument added to each member.
+///
+/// Note that none of the methods here delegate to a method defined on JSInt or
+/// JSDouble.  This is exploited in [tryComputeConstantInterceptor].
 class JSNumber extends Interceptor implements double {
   const JSNumber();
 
@@ -241,7 +239,40 @@
     }
   }
 
-  int get hashCode => JS('int', '# & 0x1FFFFFFF', this);
+  int get hashCode {
+    int intValue = JS('int', '# | 0', this);
+    // Fast exit for integers in signed 32-bit range. Masking converts -0.0 to 0
+    // and ensures that result fits in JavaScript engine's Smi range.
+    if (this == intValue) return 0x1FFFFFFF & intValue;
+
+    // We would like to access the exponent and mantissa as integers but there
+    // are no JavaScript operations that do this, so use log2-floor-pow-divide
+    // to extract the values.
+    num absolute = JS('num', 'Math.abs(#)', this);
+    num lnAbsolute = JS('num', 'Math.log(#)', absolute);
+    num log2 = lnAbsolute / ln2;
+    // Floor via '# | 0' converts NaN to zero so the final result is not NaN.
+    int floorLog2 = JS('int', '# | 0', log2);
+    num factor = JS('num', 'Math.pow(2, #)', floorLog2);
+    num scaled = absolute < 1 ? absolute / factor : factor / absolute;
+    // [scaled] is in the range [0.5, 1].
+
+    // Multiply and truncate to pick up all the mantissa bits. Multiplying by
+    // 0x20000000000000 (which has 53 zero bits) converts the mantissa into an
+    // integer. There are interesting subsets where all the bit variance is in
+    // the most significant bits of the mantissa (e.g. 0.5, 0.625, 0.75), so we
+    // need to mix in the most significant bits. We do this by scaling with a
+    // constant that has many bits set to use the multiplier to mix in bits from
+    // all over the mantissa into low positions.
+    num rescaled1 = scaled * 0x20000000000000;
+    num rescaled2 = scaled * 0x0C95A6C285A6C9;
+    int d1 = JS('int', '# | 0', rescaled1);
+    int d2 = JS('int', '# | 0', rescaled2);
+    // Mix in exponent to distinguish e.g. 1.25 from 2.5.
+    int d3 = floorLog2;
+    int h = 0x1FFFFFFF & ((d1 + d2) * (601 * 997) + d3 * (1259));
+    return h;
+  }
 
   JSNumber operator -() => JS('num', r'-#', this);
 
@@ -411,14 +442,12 @@
   Type get runtimeType => num;
 }
 
-/**
- * The interceptor class for [int]s.
- *
- * This class implements double (indirectly through JSNumber) since in
- * JavaScript all numbers are doubles, so while we want to treat `2.0` as an
- * integer for some operations, its interceptor should answer `true` to `is
- * double`.
- */
+/// The interceptor class for [int]s.
+///
+/// This class implements double (indirectly through JSNumber) since in
+/// JavaScript all numbers are doubles, so while we want to treat `2.0` as an
+/// integer for some operations, its interceptor should answer `true` to `is
+/// double`.
 class JSInt extends JSNumber implements int {
   const JSInt();
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_primitives.dart b/sdk/lib/_internal/js_runtime/lib/js_primitives.dart
index 40c451c..97577a0 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_primitives.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_primitives.dart
@@ -8,15 +8,13 @@
 
 import 'dart:_foreign_helper' show JS;
 
-/**
- * This is the low-level method that is used to implement [print].  It is
- * possible to override this function from JavaScript by defining a function in
- * JavaScript called "dartPrint".
- *
- * Notice that it is also possible to intercept calls to [print] from within a
- * Dart program using zones. This means that there is no guarantee that a call
- * to print ends in this method.
- */
+/// This is the low-level method that is used to implement [print].  It is
+/// possible to override this function from JavaScript by defining a function in
+/// JavaScript called "dartPrint".
+///
+/// Notice that it is also possible to intercept calls to [print] from within a
+/// Dart program using zones. This means that there is no guarantee that a call
+/// to print ends in this method.
 void printString(String string) {
   if (JS('bool', r'typeof dartPrint == "function"')) {
     // Support overriding print from JavaScript.
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index b5e84fa..9a6ef99 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -2,43 +2,41 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * This part contains helpers for supporting runtime type information.
- *
- * The helper use a mixture of Dart and JavaScript objects. To indicate which is
- * used where we adopt the scheme of using explicit type annotation for Dart
- * objects and 'var' or omitted return type for JavaScript objects.
- *
- * Since bool, int, and String values are represented by the same JavaScript
- * primitives, type annotations are used for these types in all cases.
- *
- * Several methods use a common JavaScript encoding of runtime type information.
- * This encoding is referred to as the type representation which is one of
- * these:
- *  1) a JavaScript constructor for a class C: the represented type is the raw
- *     type C.
- *  2) a JavaScript array: the first entry is of type 1 and contains the
- *     subtyping flags and the substitution of the type and the rest of the
- *     array are the type arguments.
- *  3) `null`: the dynamic type.
- *  4) a JavaScript object representing the function type. For instance, it has
- *     the form {ret: rti, args: [rti], opt: [rti], named: {name: rti}} for a
- *     function with a return type, regular, optional and named arguments.
- *     Generic function types have a 'bounds' property.
- *
- * To check subtype relations between generic classes we use a JavaScript
- * expression that describes the necessary substitution for type arguments.
- * Such a substitution expression can be:
- *  1) `null`, if no substituted check is necessary, because the
- *     type variables are the same or there are no type variables in the class
- *     that is checked for.
- *  2) A list expression describing the type arguments to be used in the
- *     subtype check, if the type arguments to be used in the check do not
- *     depend on the type arguments of the object.
- *  3) A function mapping the type variables of the object to be checked to
- *     a list expression. The function may also return null, which is equivalent
- *     to an array containing only null values.
- */
+/// This part contains helpers for supporting runtime type information.
+///
+/// The helper use a mixture of Dart and JavaScript objects. To indicate which
+/// is used where we adopt the scheme of using explicit type annotation for Dart
+/// objects and 'var' or omitted return type for JavaScript objects.
+///
+/// Since bool, int, and String values are represented by the same JavaScript
+/// primitives, type annotations are used for these types in all cases.
+///
+/// Several methods use a common JavaScript encoding of runtime type
+/// information.  This encoding is referred to as the type representation which
+/// is one of these:
+///  1) a JavaScript constructor for a class C: the represented type is the raw
+///     type C.
+///  2) a JavaScript array: the first entry is of type 1 and contains the
+///     subtyping flags and the substitution of the type and the rest of the
+///     array are the type arguments.
+///  3) `null`: the dynamic type.
+///  4) a JavaScript object representing the function type. For instance, it has
+///     the form {ret: rti, args: [rti], opt: [rti], named: {name: rti}} for a
+///     function with a return type, regular, optional and named arguments.
+///     Generic function types have a 'bounds' property.
+///
+/// To check subtype relations between generic classes we use a JavaScript
+/// expression that describes the necessary substitution for type arguments.
+/// Such a substitution expression can be:
+///  1) `null`, if no substituted check is necessary, because the
+///     type variables are the same or there are no type variables in the class
+///     that is checked for.
+///  2) A list expression describing the type arguments to be used in the
+///     subtype check, if the type arguments to be used in the check do not
+///     depend on the type arguments of the object.
+///  3) A function mapping the type variables of the object to be checked to a
+///     list expression. The function may also return null, which is equivalent
+///     to an array containing only null values.
 
 part of _js_helper;
 
@@ -67,12 +65,10 @@
   }
 }
 
-/**
- * Represents a type variable.
- *
- * This class holds the information needed when reflecting on generic classes
- * and their members.
- */
+/// Represents a type variable.
+///
+/// This class holds the information needed when reflecting on generic classes
+/// and their members.
 class TypeVariable {
   final Type owner;
   final String name;
@@ -157,10 +153,8 @@
   return rti == null ? null : getIndex(rti, index);
 }
 
-/**
- * Retrieves the class name from type information stored on the constructor
- * of [object].
- */
+/// Retrieves the class name from type information stored on the constructor
+/// of [object].
 String getClassName(var object) {
   return rawRtiToJsConstructorName(getRawRuntimeType(getInterceptor(object)));
 }
@@ -327,11 +321,9 @@
   return '${typeParameters}(${argumentsText}) => ${returnTypeText}';
 }
 
-/**
- * Creates a comma-separated string of human-readable representations of the
- * type representations in the JavaScript array [types] starting at index
- * [startIndex].
- */
+/// Creates a comma-separated string of human-readable representations of the
+/// type representations in the JavaScript array [types] starting at index
+/// [startIndex].
 String joinArguments(var types, int startIndex) {
   return _joinArguments(types, startIndex, null);
 }
@@ -354,11 +346,9 @@
   return '<$buffer>';
 }
 
-/**
- * Returns a human-readable representation of the type of [object].
- *
- * In minified mode does *not* use unminified identifiers (even when present).
- */
+/// Returns a human-readable representation of the type of [object].
+///
+/// In minified mode does *not* use unminified identifiers (even when present).
 String getRuntimeTypeString(var object) {
   if (object is Closure) {
     // This excludes classes that implement Function via a `call` method, but
@@ -403,12 +393,10 @@
   return new TypeImpl(getRti(object));
 }
 
-/**
- * Applies the [substitution] on the [arguments].
- *
- * See the comment in the beginning of this file for a description of the
- * possible values for [substitution].
- */
+/// Applies the [substitution] on the [arguments].
+///
+/// See the comment in the beginning of this file for a description of the
+/// possible values for [substitution].
 substitute(var substitution, var arguments) {
   if (substitution == null) return arguments;
   assert(isJsFunction(substitution));
@@ -429,18 +417,16 @@
   return arguments;
 }
 
-/**
- * Perform a type check with arguments on the Dart object [object].
- *
- * Parameters:
- * - [isField]: the name of the flag/function to check if the object
- *   is of the correct class.
- * - [checks]: the (JavaScript) list of type representations for the
- *   arguments to check against.
- * - [asField]: the name of the function that transforms the type
- *   arguments of [objects] to an instance of the class that we check
- *   against.
- */
+/// Perform a type check with arguments on the Dart object [object].
+///
+/// Parameters:
+/// - [isField]: the name of the flag/function to check if the object
+///   is of the correct class.
+/// - [checks]: the (JavaScript) list of type representations for the
+///   arguments to check against.
+/// - [asField]: the name of the function that transforms the type
+///   arguments of [objects] to an instance of the class that we check
+///   against.
 bool checkSubtype(Object object, String isField, List checks, String asField) {
   if (object == null) return false;
   var arguments = getRuntimeTypeInfo(object);
@@ -507,17 +493,15 @@
   return areSubtypes(substitute(substitution, arguments), sEnv, checks, tEnv);
 }
 
-/**
- * Checks whether the types of [s] are all subtypes of the types of [t].
- *
- * [s] and [t] are either `null` or JavaScript arrays of type representations,
- * A `null` argument is interpreted as the arguments of a raw type, that is a
- * list of `dynamic`. If [s] and [t] are JavaScript arrays they must be of the
- * same length.
- *
- * See the comment in the beginning of this file for a description of type
- * representations.
- */
+/// Checks whether the types of [s] are all subtypes of the types of [t].
+///
+/// [s] and [t] are either `null` or JavaScript arrays of type representations,
+/// A `null` argument is interpreted as the arguments of a raw type, that is a
+/// list of `dynamic`. If [s] and [t] are JavaScript arrays they must be of the
+/// same length.
+///
+/// See the comment in the beginning of this file for a description of type
+/// representations.
 
 bool areSubtypes(var s, var sEnv, var t, var tEnv) {
   // `null` means a raw type.
@@ -545,10 +529,8 @@
   return true;
 }
 
-/**
- * Computes the signature by applying the type arguments of [context] as an
- * instance of [contextName] to the signature function [signature].
- */
+/// Computes the signature by applying the type arguments of [context] as an
+/// instance of [contextName] to the signature function [signature].
 computeSignature(var signature, var context, var contextName) {
   var interceptor = getInterceptor(context);
   var typeArguments =
@@ -619,13 +601,11 @@
       : null;
 }
 
-/**
- * Tests whether the Dart object [o] is a subtype of the runtime type
- * representation [t].
- *
- * See the comment in the beginning of this file for a description of type
- * representations.
- */
+/// Tests whether the Dart object [o] is a subtype of the runtime type
+/// representation [t].
+///
+/// See the comment in the beginning of this file for a description of type
+/// representations.
 bool checkSubtypeOfRuntimeType(o, t) {
   if (o == null) return isSupertypeOfNull(t);
   if (isTopType(t)) return true;
@@ -678,24 +658,20 @@
   return object;
 }
 
-/**
- * Extracts the type arguments from a type representation. The result is a
- * JavaScript array or `null`.
- */
+/// Extracts the type arguments from a type representation. The result is a
+/// JavaScript array or `null`.
 getArguments(var type) {
   return isJsArray(type) ? JS('var', r'#.slice(1)', type) : null;
 }
 
-/**
- * Checks whether the type represented by the type representation [s] is a
- * subtype of the type represented by the type representation [t].
- *
- * See the comment in the beginning of this file for a description of type
- * representations.
- *
- * The arguments [s] and [t] must be types, usually represented by the
- * constructor of the class, or an array (for generic class types).
- */
+/// Checks whether the type represented by the type representation [s] is a
+/// subtype of the type represented by the type representation [t].
+///
+/// See the comment in the beginning of this file for a description of type
+/// representations.
+///
+/// The arguments [s] and [t] must be types, usually represented by the
+/// constructor of the class, or an array (for generic class types).
 bool isSubtype(var s, var t) {
   return _isSubtype(s, null, t, null);
 }
@@ -1075,16 +1051,12 @@
   return array;
 }
 
-/**
- * Calls the JavaScript [function] with the [arguments] with the global scope
- * as the `this` context.
- */
+/// Calls the JavaScript [function] with the [arguments] with the global scope
+/// as the `this` context.
 invoke(var function, var arguments) => invokeOn(function, null, arguments);
 
-/**
- * Calls the JavaScript [function] with the [arguments] with [receiver] as the
- * `this` context.
- */
+/// Calls the JavaScript [function] with the [arguments] with [receiver] as the
+/// `this` context.
 Object invokeOn(function, receiver, arguments) {
   assert(isJsFunction(function));
   assert(arguments == null || isJsArray(arguments));
@@ -1132,18 +1104,14 @@
 /// Returns `true` if [o] is a JavaScript object.
 bool isJsObject(var o) => JS('bool', r"typeof # == 'object'", o);
 
-/**
- * Returns `true` if the JavaScript values [s] and [t] are identical. We use
- * this helper instead of [identical] because `identical` needs to merge
- * `null` and `undefined` (which we can avoid).
- */
+/// Returns `true` if the JavaScript values [s] and [t] are identical. We use
+/// this helper instead of [identical] because `identical` needs to merge
+/// `null` and `undefined` (which we can avoid).
 bool isIdentical(var s, var t) => JS('bool', '# === #', s, t);
 
-/**
- * Returns `true` if the JavaScript values [s] and [t] are not identical. We use
- * this helper instead of [identical] because `identical` needs to merge
- * `null` and `undefined` (which we can avoid).
- */
+/// Returns `true` if the JavaScript values [s] and [t] are not identical. We
+/// use this helper instead of [identical] because `identical` needs to merge
+/// `null` and `undefined` (which we can avoid).
 bool isNotIdentical(var s, var t) => JS('bool', '# !== #', s, t);
 
 /// 'Top' bounds are uninteresting: null/undefined and Object.
diff --git a/sdk/lib/_internal/js_runtime/lib/js_string.dart b/sdk/lib/_internal/js_runtime/lib/js_string.dart
index 91e9734..baa47b6 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_string.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_string.dart
@@ -4,12 +4,10 @@
 
 part of _interceptors;
 
-/**
- * The interceptor class for [String]. The compiler recognizes this
- * class as an interceptor, and changes references to [:this:] to
- * actually use the receiver of the method, which is generated as an extra
- * argument added to each member.
- */
+/// The interceptor class for [String]. The compiler recognizes this
+/// class as an interceptor, and changes references to [:this:] to
+/// actually use the receiver of the method, which is generated as an extra
+/// argument added to each member.
 class JSString extends Interceptor implements String, JSIndexable {
   const JSString();
 
@@ -443,12 +441,10 @@
   // Note: if you change this, also change the function [S].
   String toString() => this;
 
-  /**
-   * This is the [Jenkins hash function][1] but using masking to keep
-   * values in SMI range.
-   *
-   * [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
-   */
+  /// This is the [Jenkins hash function][1] but using masking to keep
+  /// values in SMI range.
+  ///
+  /// [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
   int get hashCode {
     // TODO(ahe): This method shouldn't have to use JS. Update when our
     // optimizations are smarter.
diff --git a/sdk/lib/_internal/js_runtime/lib/math_patch.dart b/sdk/lib/_internal/js_runtime/lib/math_patch.dart
index 68bae9a..a3d3fc9 100644
--- a/sdk/lib/_internal/js_runtime/lib/math_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/math_patch.dart
@@ -84,15 +84,11 @@
     return JS('int', '(Math.random() * #) >>> 0', max);
   }
 
-  /**
-   * Generates a positive random floating point value uniformly distributed on
-   * the range from 0.0, inclusive, to 1.0, exclusive.
-   */
+  /// Generates a positive random floating point value uniformly distributed on
+  /// the range from 0.0, inclusive, to 1.0, exclusive.
   double nextDouble() => JS('double', 'Math.random()');
 
-  /**
-   * Generates a random boolean value.
-   */
+  /// Generates a random boolean value.
   bool nextBool() => JS('bool', 'Math.random() < 0.5');
 }
 
diff --git a/sdk/lib/_internal/js_runtime/lib/native_helper.dart b/sdk/lib/_internal/js_runtime/lib/native_helper.dart
index fa11112..59a3719 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_helper.dart
@@ -38,27 +38,21 @@
   return JS('var', 'Object.getPrototypeOf(#)[#]', object, name);
 }
 
-/**
- * Returns a String tag identifying the type of the native object, or `null`.
- * The tag is not the name of the type, but usually the name of the JavaScript
- * constructor function.  Initialized by [initHooks].
- */
+/// Returns a String tag identifying the type of the native object, or `null`.
+/// The tag is not the name of the type, but usually the name of the JavaScript
+/// constructor function.  Initialized by [initHooks].
 Function getTagFunction;
 
-/**
- * If a lookup via [getTagFunction] on an object [object] that has [tag] fails,
- * this function is called to provide an alternate tag.  This allows us to fail
- * gracefully if we can make a good guess, for example, when browsers add novel
- * kinds of HTMLElement that we have never heard of.  Initialized by
- * [initHooks].
- */
+/// If a lookup via [getTagFunction] on an object [object] that has [tag] fails,
+/// this function is called to provide an alternate tag.  This allows us to fail
+/// gracefully if we can make a good guess, for example, when browsers add novel
+/// kinds of HTMLElement that we have never heard of.  Initialized by
+/// [initHooks].
 Function alternateTagFunction;
 
-/**
- * Returns the prototype for the JavaScript constructor named by an input tag.
- * Returns `null` if there is no such constructor, or if pre-patching of the
- * constructor is to be avoided.  Initialized by [initHooks].
- */
+/// Returns the prototype for the JavaScript constructor named by an input tag.
+/// Returns `null` if there is no such constructor, or if pre-patching of the
+/// constructor is to be avoided.  Initialized by [initHooks].
 Function prototypeForTagFunction;
 
 String toStringForNativeObject(var obj) {
@@ -73,9 +67,7 @@
 
 int hashCodeForNativeObject(object) => Primitives.objectHashCode(object);
 
-/**
- * Sets a JavaScript property on an object.
- */
+/// Sets a JavaScript property on an object.
 void defineProperty(var obj, String property, var value) {
   JS(
       'void',
@@ -97,20 +89,16 @@
           'depends:none;effects:none;', JsBuiltin.dartObjectConstructor));
 }
 
-/**
- * A JavaScript object mapping tags to the constructors of interceptors.
- * This is a JavaScript object with no prototype.
- *
- * Example: 'HTMLImageElement' maps to the ImageElement class constructor.
- */
+/// A JavaScript object mapping tags to the constructors of interceptors.
+/// This is a JavaScript object with no prototype.
+///
+/// Example: 'HTMLImageElement' maps to the ImageElement class constructor.
 get interceptorsByTag => JS_EMBEDDED_GLOBAL('=Object', INTERCEPTORS_BY_TAG);
 
-/**
- * A JavaScript object mapping tags to `true` or `false`.
- *
- * Example: 'HTMLImageElement' maps to `true` since, as there are no subclasses
- * of ImageElement, it is a leaf class in the native class hierarchy.
- */
+/// A JavaScript object mapping tags to `true` or `false`.
+///
+/// Example: 'HTMLImageElement' maps to `true` since, as there are no subclasses
+/// of ImageElement, it is a leaf class in the native class hierarchy.
 get leafTags => JS_EMBEDDED_GLOBAL('=Object', LEAF_TAGS);
 
 String findDispatchTagForInterceptorClass(interceptorClassConstructor) {
@@ -118,17 +106,13 @@
       '', r'#.#', interceptorClassConstructor, NATIVE_SUPERCLASS_TAG_NAME);
 }
 
-/**
- * Cache of dispatch records for instances.  This is a JavaScript object used as
- * a map.  Keys are instance tags, e.g. "!SomeThing".  The cache permits the
- * sharing of one dispatch record between multiple instances.
- */
+/// Cache of dispatch records for instances.  This is a JavaScript object used
+/// as a map.  Keys are instance tags, e.g. "!SomeThing".  The cache permits the
+/// sharing of one dispatch record between multiple instances.
 var dispatchRecordsForInstanceTags;
 
-/**
- * Cache of interceptors indexed by uncacheable tags, e.g. "~SomeThing".
- * This is a JavaScript object used as a map.
- */
+/// Cache of interceptors indexed by uncacheable tags, e.g. "~SomeThing".
+/// This is a JavaScript object used as a map.
 var interceptorsForUncacheableTags;
 
 lookupInterceptor(String tag) {
@@ -155,12 +139,10 @@
 /// A 'discriminator' function is to be used. TBD.
 const DISCRIMINATED_MARK = '*';
 
-/**
- * Returns the interceptor for a native object, or returns `null` if not found.
- *
- * A dispatch record is cached according to the specification of the dispatch
- * tag for [obj].
- */
+/// Returns the interceptor for a native object, or returns `null` if not found.
+///
+/// A dispatch record is cached according to the specification of the dispatch
+/// tag for [obj].
 @NoInline()
 lookupAndCacheInterceptor(obj) {
   assert(!isDartObject(obj));
@@ -270,10 +252,8 @@
   }
 }
 
-/**
- * [proto] should have no shadowing prototypes that are not also assigned a
- * dispatch rescord.
- */
+/// [proto] should have no shadowing prototypes that are not also assigned a
+/// dispatch rescord.
 setNativeSubclassDispatchRecord(proto, interceptor) {
   setDispatchProperty(proto, makeLeafDispatchRecord(interceptor));
 }
@@ -338,41 +318,39 @@
   }
 }
 
-/**
- * Initializes [getTagFunction] and [alternateTagFunction].
- *
- * These functions are 'hook functions', collectively 'hooks'.  They initialized
- * by applying a series of hooks transformers.  Built-in hooks transformers deal
- * with various known browser behaviours.
- *
- * Each hook tranformer takes a 'hooks' input which is a JavaScript object
- * containing the hook functions, and returns the same or a new object with
- * replacements.  The replacements can wrap the originals to provide alternate
- * or modified behaviour.
- *
- *     { getTag: function(obj) {...},
- *       getUnknownTag: function(obj, tag) {...},
- *       prototypeForTag: function(tag) {...},
- *       discriminator: function(tag) {...},
- *      }
- *
- * * getTag(obj) returns the dispatch tag, or `null`.
- * * getUnknownTag(obj, tag) returns a tag when [getTag] fails.
- * * prototypeForTag(tag) returns the prototype of the constructor for tag,
- *   or `null` if not available or prepatching is undesirable.
- * * discriminator(tag) returns a function TBD.
- *
- * The web site can adapt a dart2js application by loading code ahead of the
- * dart2js application that defines hook transformers to be after the built in
- * ones.  Code defining a transformer HT should use the following pattern to
- * ensure multiple transformers can be composed:
- *
- *     (dartNativeDispatchHooksTransformer =
- *      window.dartNativeDispatchHooksTransformer || []).push(HT);
- *
- *
- * TODO: Implement and describe dispatch tags and their caching methods.
- */
+/// Initializes [getTagFunction] and [alternateTagFunction].
+///
+/// These functions are 'hook functions', collectively 'hooks'.  They
+/// initialized by applying a series of hooks transformers.  Built-in hooks
+/// transformers deal with various known browser behaviours.
+///
+/// Each hook tranformer takes a 'hooks' input which is a JavaScript object
+/// containing the hook functions, and returns the same or a new object with
+/// replacements.  The replacements can wrap the originals to provide alternate
+/// or modified behaviour.
+///
+///     { getTag: function(obj) {...},
+///       getUnknownTag: function(obj, tag) {...},
+///       prototypeForTag: function(tag) {...},
+///       discriminator: function(tag) {...},
+///      }
+///
+/// * getTag(obj) returns the dispatch tag, or `null`.
+/// * getUnknownTag(obj, tag) returns a tag when [getTag] fails.
+/// * prototypeForTag(tag) returns the prototype of the constructor for tag,
+///   or `null` if not available or prepatching is undesirable.
+/// * discriminator(tag) returns a function TBD.
+///
+/// The web site can adapt a dart2js application by loading code ahead of the
+/// dart2js application that defines hook transformers to be after the built in
+/// ones.  Code defining a transformer HT should use the following pattern to
+/// ensure multiple transformers can be composed:
+///
+///     (dartNativeDispatchHooksTransformer =
+///      window.dartNativeDispatchHooksTransformer || []).push(HT);
+///
+///
+/// TODO: Implement and describe dispatch tags and their caching methods.
 void initHooks() {
   // The initial simple hooks:
   var hooks = JS('', '#()', _baseHooks);
@@ -478,14 +456,12 @@
     discriminator: discriminator };
 }''');
 
-/**
- * Returns the name of the constructor function for browsers where
- * `object.constructor.name` is not reliable.
- *
- * This function is split out of [_fallbackConstructorHooksTransformerGenerator]
- * as it is called from both the dispatch hooks and via
- * [constructorNameFallback] from objectToString.
- */
+/// Returns the name of the constructor function for browsers where
+/// `object.constructor.name` is not reliable.
+///
+/// This function is split out of
+/// [_fallbackConstructorHooksTransformerGenerator] as it is called from both
+/// the dispatch hooks and via [constructorNameFallback] from objectToString.
 const _constructorNameFallback = const JS_CONST(r'''
 function getTagFallback(o) {
   var s = Object.prototype.toString.call(o);
diff --git a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
index 7889c36..9fa9070 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
@@ -2,10 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Specialized integers and floating point numbers,
- * with SIMD support and efficient lists.
- */
+/// Specialized integers and floating point numbers,
+/// with SIMD support and efficient lists.
 library dart.typed_data.implementation;
 
 import 'dart:collection' show ListMixin;
@@ -99,20 +97,16 @@
   }
 }
 
-/**
- * A fixed-length list of Float32x4 numbers that is viewable as a
- * [TypedData]. For long lists, this implementation will be considerably more
- * space- and time-efficient than the default [List] implementation.
- */
+/// A fixed-length list of Float32x4 numbers that is viewable as a
+/// [TypedData]. For long lists, this implementation will be considerably more
+/// space- and time-efficient than the default [List] implementation.
 class NativeFloat32x4List extends Object
     with ListMixin<Float32x4>, FixedLengthListMixin<Float32x4>
     implements Float32x4List {
   final NativeFloat32List _storage;
 
-  /**
-   * Creates a [Float32x4List] of the specified length (in elements),
-   * all of whose elements are initially zero.
-   */
+  /// Creates a [Float32x4List] of the specified length (in elements),
+  /// all of whose elements are initially zero.
   NativeFloat32x4List(int length)
       : _storage = new NativeFloat32List(length * 4);
 
@@ -131,10 +125,8 @@
 
   Type get runtimeType => Float32x4List;
 
-  /**
-   * Creates a [Float32x4List] with the same size as the [elements] list
-   * and copies over the elements.
-   */
+  /// Creates a [Float32x4List] with the same size as the [elements] list
+  /// and copies over the elements.
   factory NativeFloat32x4List.fromList(List<Float32x4> list) {
     if (list is NativeFloat32x4List) {
       return new NativeFloat32x4List._externalStorage(
@@ -178,20 +170,16 @@
   }
 }
 
-/**
- * A fixed-length list of Int32x4 numbers that is viewable as a
- * [TypedData]. For long lists, this implementation will be considerably more
- * space- and time-efficient than the default [List] implementation.
- */
+/// A fixed-length list of Int32x4 numbers that is viewable as a
+/// [TypedData]. For long lists, this implementation will be considerably more
+/// space- and time-efficient than the default [List] implementation.
 class NativeInt32x4List extends Object
     with ListMixin<Int32x4>, FixedLengthListMixin<Int32x4>
     implements Int32x4List {
   final Int32List _storage;
 
-  /**
-   * Creates a [Int32x4List] of the specified length (in elements),
-   * all of whose elements are initially zero.
-   */
+  /// Creates a [Int32x4List] of the specified length (in elements),
+  /// all of whose elements are initially zero.
   NativeInt32x4List(int length) : _storage = new NativeInt32List(length * 4);
 
   NativeInt32x4List._externalStorage(Int32List storage) : _storage = storage;
@@ -209,10 +197,8 @@
 
   Type get runtimeType => Int32x4List;
 
-  /**
-   * Creates a [Int32x4List] with the same size as the [elements] list
-   * and copies over the elements.
-   */
+  /// Creates a [Int32x4List] with the same size as the [elements] list
+  /// and copies over the elements.
   factory NativeInt32x4List.fromList(List<Int32x4> list) {
     if (list is NativeInt32x4List) {
       return new NativeInt32x4List._externalStorage(
@@ -256,20 +242,16 @@
   }
 }
 
-/**
- * A fixed-length list of Float64x2 numbers that is viewable as a
- * [TypedData]. For long lists, this implementation will be considerably more
- * space- and time-efficient than the default [List] implementation.
- */
+/// A fixed-length list of Float64x2 numbers that is viewable as a
+/// [TypedData]. For long lists, this implementation will be considerably more
+/// space- and time-efficient than the default [List] implementation.
 class NativeFloat64x2List extends Object
     with ListMixin<Float64x2>, FixedLengthListMixin<Float64x2>
     implements Float64x2List {
   final NativeFloat64List _storage;
 
-  /**
-   * Creates a [Float64x2List] of the specified length (in elements),
-   * all of whose elements are initially zero.
-   */
+  /// Creates a [Float64x2List] of the specified length (in elements),
+  /// all of whose elements are initially zero.
   NativeFloat64x2List(int length)
       : _storage = new NativeFloat64List(length * 2);
 
@@ -284,10 +266,8 @@
     }
   }
 
-  /**
-   * Creates a [Float64x2List] with the same size as the [elements] list
-   * and copies over the elements.
-   */
+  /// Creates a [Float64x2List] with the same size as the [elements] list
+  /// and copies over the elements.
   factory NativeFloat64x2List.fromList(List<Float64x2> list) {
     if (list is NativeFloat64x2List) {
       return new NativeFloat64x2List._externalStorage(
@@ -331,30 +311,22 @@
 
 @Native('ArrayBufferView')
 class NativeTypedData implements TypedData {
-  /**
-   * Returns the byte buffer associated with this object.
-   */
+  /// Returns the byte buffer associated with this object.
   @Creates('NativeByteBuffer')
   // May be Null for IE's CanvasPixelArray.
   @Returns('NativeByteBuffer|Null')
   final ByteBuffer buffer;
 
-  /**
-   * Returns the length of this view, in bytes.
-   */
+  /// Returns the length of this view, in bytes.
   @JSName('byteLength')
   final int lengthInBytes;
 
-  /**
-   * Returns the offset in bytes into the underlying byte buffer of this view.
-   */
+  /// Returns the offset in bytes into the underlying byte buffer of this view.
   @JSName('byteOffset')
   final int offsetInBytes;
 
-  /**
-   * Returns the number of bytes in the representation of each element in this
-   * list.
-   */
+  /// Returns the number of bytes in the representation of each element in this
+  /// list.
   @JSName('BYTES_PER_ELEMENT')
   final int elementSizeInBytes;
 
@@ -413,24 +385,20 @@
 
 @Native('DataView')
 class NativeByteData extends NativeTypedData implements ByteData {
-  /**
-   * Creates a [ByteData] of the specified length (in elements), all of
-   * whose elements are initially zero.
-   */
+  /// Creates a [ByteData] of the specified length (in elements), all of
+  /// whose elements are initially zero.
   factory NativeByteData(int length) => _create1(_checkLength(length));
 
-  /**
-   * Creates an [ByteData] _view_ of the specified region in the specified
-   * byte buffer. Changes in the [ByteData] will be visible in the byte
-   * buffer and vice versa. If the [offsetInBytes] index of the region is not
-   * specified, it defaults to zero (the first byte in the byte buffer).
-   * If the length is not specified, it defaults to null, which indicates
-   * that the view extends to the end of the byte buffer.
-   *
-   * Throws [RangeError] if [offsetInBytes] or [length] are negative, or
-   * if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
-   * the length of [buffer].
-   */
+  /// Creates an [ByteData] _view_ of the specified region in the specified
+  /// byte buffer. Changes in the [ByteData] will be visible in the byte
+  /// buffer and vice versa. If the [offsetInBytes] index of the region is not
+  /// specified, it defaults to zero (the first byte in the byte buffer).
+  /// If the length is not specified, it defaults to null, which indicates
+  /// that the view extends to the end of the byte buffer.
+  ///
+  /// Throws [RangeError] if [offsetInBytes] or [length] are negative, or
+  /// if [offsetInBytes] + ([length] * elementSizeInBytes) is greater than
+  /// the length of [buffer].
   factory NativeByteData.view(
       ByteBuffer buffer, int offsetInBytes, int length) {
     _checkViewArguments(buffer, offsetInBytes, length);
@@ -443,14 +411,12 @@
 
   int get elementSizeInBytes => 1;
 
-  /**
-   * Returns the floating point number represented by the four bytes at
-   * the specified [byteOffset] in this object, in IEEE 754
-   * single-precision binary floating-point format (binary32).
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
+  /// Returns the floating point number represented by the four bytes at
+  /// the specified [byteOffset] in this object, in IEEE 754
+  /// single-precision binary floating-point format (binary32).
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 4` is greater than the length of this object.
   double getFloat32(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat32(byteOffset, Endian.little == endian);
 
@@ -458,14 +424,12 @@
   @Returns('num')
   num _getFloat32(int byteOffset, [bool littleEndian]) native;
 
-  /**
-   * Returns the floating point number represented by the eight bytes at
-   * the specified [byteOffset] in this object, in IEEE 754
-   * double-precision binary floating-point format (binary64).
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
+  /// Returns the floating point number represented by the eight bytes at
+  /// the specified [byteOffset] in this object, in IEEE 754
+  /// double-precision binary floating-point format (binary64).
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 8` is greater than the length of this object.
   double getFloat64(int byteOffset, [Endian endian = Endian.big]) =>
       _getFloat64(byteOffset, Endian.little == endian);
 
@@ -473,16 +437,14 @@
   @Returns('num')
   num _getFloat64(int byteOffset, [bool littleEndian]) native;
 
-  /**
-   * Returns the (possibly negative) integer represented by the two bytes at
-   * the specified [byteOffset] in this object, in two's complement binary
-   * form.
-   * The return value will be between 2<sup>15</sup> and 2<sup>15</sup> - 1,
-   * inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
-   */
+  /// Returns the (possibly negative) integer represented by the two bytes at
+  /// the specified [byteOffset] in this object, in two's complement binary
+  /// form.
+  /// The return value will be between 2<sup>15</sup> and 2<sup>15</sup> - 1,
+  /// inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 2` is greater than the length of this object.
   int getInt16(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt16(byteOffset, Endian.little == endian);
 
@@ -490,16 +452,14 @@
   @Returns('int')
   int _getInt16(int byteOffset, [bool littleEndian]) native;
 
-  /**
-   * Returns the (possibly negative) integer represented by the four bytes at
-   * the specified [byteOffset] in this object, in two's complement binary
-   * form.
-   * The return value will be between 2<sup>31</sup> and 2<sup>31</sup> - 1,
-   * inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
+  /// Returns the (possibly negative) integer represented by the four bytes at
+  /// the specified [byteOffset] in this object, in two's complement binary
+  /// form.
+  /// The return value will be between 2<sup>31</sup> and 2<sup>31</sup> - 1,
+  /// inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 4` is greater than the length of this object.
   int getInt32(int byteOffset, [Endian endian = Endian.big]) =>
       _getInt32(byteOffset, Endian.little == endian);
 
@@ -507,39 +467,33 @@
   @Returns('int')
   int _getInt32(int byteOffset, [bool littleEndian]) native;
 
-  /**
-   * Returns the (possibly negative) integer represented by the eight bytes at
-   * the specified [byteOffset] in this object, in two's complement binary
-   * form.
-   * The return value will be between 2<sup>63</sup> and 2<sup>63</sup> - 1,
-   * inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
+  /// Returns the (possibly negative) integer represented by the eight bytes at
+  /// the specified [byteOffset] in this object, in two's complement binary
+  /// form.
+  /// The return value will be between 2<sup>63</sup> and 2<sup>63</sup> - 1,
+  /// inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 8` is greater than the length of this object.
   int getInt64(int byteOffset, [Endian endian = Endian.big]) {
     throw new UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
-  /**
-   * Returns the (possibly negative) integer represented by the byte at the
-   * specified [byteOffset] in this object, in two's complement binary
-   * representation. The return value will be between -128 and 127, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
-   */
+  /// Returns the (possibly negative) integer represented by the byte at the
+  /// specified [byteOffset] in this object, in two's complement binary
+  /// representation. The return value will be between -128 and 127, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// greater than or equal to the length of this object.
   int getInt8(int byteOffset) native;
 
-  /**
-   * Returns the positive integer represented by the two bytes starting
-   * at the specified [byteOffset] in this object, in unsigned binary
-   * form.
-   * The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
-   */
+  /// Returns the positive integer represented by the two bytes starting
+  /// at the specified [byteOffset] in this object, in unsigned binary
+  /// form.
+  /// The return value will be between 0 and  2<sup>16</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 2` is greater than the length of this object.
   int getUint16(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint16(byteOffset, Endian.little == endian);
 
@@ -547,15 +501,13 @@
   @Returns('JSUInt31')
   int _getUint16(int byteOffset, [bool littleEndian]) native;
 
-  /**
-   * Returns the positive integer represented by the four bytes starting
-   * at the specified [byteOffset] in this object, in unsigned binary
-   * form.
-   * The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
+  /// Returns the positive integer represented by the four bytes starting
+  /// at the specified [byteOffset] in this object, in unsigned binary
+  /// form.
+  /// The return value will be between 0 and  2<sup>32</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 4` is greater than the length of this object.
   int getUint32(int byteOffset, [Endian endian = Endian.big]) =>
       _getUint32(byteOffset, Endian.little == endian);
 
@@ -563,172 +515,148 @@
   @Returns('JSUInt32')
   int _getUint32(int byteOffset, [bool littleEndian]) native;
 
-  /**
-   * Returns the positive integer represented by the eight bytes starting
-   * at the specified [byteOffset] in this object, in unsigned binary
-   * form.
-   * The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
+  /// Returns the positive integer represented by the eight bytes starting
+  /// at the specified [byteOffset] in this object, in unsigned binary
+  /// form.
+  /// The return value will be between 0 and  2<sup>64</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 8` is greater than the length of this object.
   int getUint64(int byteOffset, [Endian endian = Endian.big]) {
     throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
-  /**
-   * Returns the positive integer represented by the byte at the specified
-   * [byteOffset] in this object, in unsigned binary form. The
-   * return value will be between 0 and 255, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
-   */
+  /// Returns the positive integer represented by the byte at the specified
+  /// [byteOffset] in this object, in unsigned binary form. The
+  /// return value will be between 0 and 255, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// greater than or equal to the length of this object.
   int getUint8(int byteOffset) native;
 
-  /**
-   * Sets the four bytes starting at the specified [byteOffset] in this
-   * object to the IEEE 754 single-precision binary floating-point
-   * (binary32) representation of the specified [value].
-   *
-   * **Note that this method can lose precision.** The input [value] is
-   * a 64-bit floating point value, which will be converted to 32-bit
-   * floating point value by IEEE 754 rounding rules before it is stored.
-   * If [value] cannot be represented exactly as a binary32, it will be
-   * converted to the nearest binary32 value.  If two binary32 values are
-   * equally close, the one whose least significant bit is zero will be used.
-   * Note that finite (but large) values can be converted to infinity, and
-   * small non-zero values can be converted to zero.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
+  /// Sets the four bytes starting at the specified [byteOffset] in this
+  /// object to the IEEE 754 single-precision binary floating-point
+  /// (binary32) representation of the specified [value].
+  ///
+  /// **Note that this method can lose precision.** The input [value] is
+  /// a 64-bit floating point value, which will be converted to 32-bit
+  /// floating point value by IEEE 754 rounding rules before it is stored.
+  /// If [value] cannot be represented exactly as a binary32, it will be
+  /// converted to the nearest binary32 value.  If two binary32 values are
+  /// equally close, the one whose least significant bit is zero will be used.
+  /// Note that finite (but large) values can be converted to infinity, and
+  /// small non-zero values can be converted to zero.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 4` is greater than the length of this object.
   void setFloat32(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat32(byteOffset, value, Endian.little == endian);
 
   @JSName('setFloat32')
   void _setFloat32(int byteOffset, num value, [bool littleEndian]) native;
 
-  /**
-   * Sets the eight bytes starting at the specified [byteOffset] in this
-   * object to the IEEE 754 double-precision binary floating-point
-   * (binary64) representation of the specified [value].
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
+  /// Sets the eight bytes starting at the specified [byteOffset] in this
+  /// object to the IEEE 754 double-precision binary floating-point
+  /// (binary64) representation of the specified [value].
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 8` is greater than the length of this object.
   void setFloat64(int byteOffset, num value, [Endian endian = Endian.big]) =>
       _setFloat64(byteOffset, value, Endian.little == endian);
 
   @JSName('setFloat64')
   void _setFloat64(int byteOffset, num value, [bool littleEndian]) native;
 
-  /**
-   * Sets the two bytes starting at the specified [byteOffset] in this
-   * object to the two's complement binary representation of the specified
-   * [value], which must fit in two bytes. In other words, [value] must lie
-   * between 2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
-   */
+  /// Sets the two bytes starting at the specified [byteOffset] in this
+  /// object to the two's complement binary representation of the specified
+  /// [value], which must fit in two bytes. In other words, [value] must lie
+  /// between 2<sup>15</sup> and 2<sup>15</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 2` is greater than the length of this object.
   void setInt16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt16(byteOffset, value, Endian.little == endian);
 
   @JSName('setInt16')
   void _setInt16(int byteOffset, int value, [bool littleEndian]) native;
 
-  /**
-   * Sets the four bytes starting at the specified [byteOffset] in this
-   * object to the two's complement binary representation of the specified
-   * [value], which must fit in four bytes. In other words, [value] must lie
-   * between 2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
+  /// Sets the four bytes starting at the specified [byteOffset] in this
+  /// object to the two's complement binary representation of the specified
+  /// [value], which must fit in four bytes. In other words, [value] must lie
+  /// between 2<sup>31</sup> and 2<sup>31</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 4` is greater than the length of this object.
   void setInt32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setInt32(byteOffset, value, Endian.little == endian);
 
   @JSName('setInt32')
   void _setInt32(int byteOffset, int value, [bool littleEndian]) native;
 
-  /**
-   * Sets the eight bytes starting at the specified [byteOffset] in this
-   * object to the two's complement binary representation of the specified
-   * [value], which must fit in eight bytes. In other words, [value] must lie
-   * between 2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
+  /// Sets the eight bytes starting at the specified [byteOffset] in this
+  /// object to the two's complement binary representation of the specified
+  /// [value], which must fit in eight bytes. In other words, [value] must lie
+  /// between 2<sup>63</sup> and 2<sup>63</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 8` is greater than the length of this object.
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw new UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
-  /**
-   * Sets the byte at the specified [byteOffset] in this object to the
-   * two's complement binary representation of the specified [value], which
-   * must fit in a single byte. In other words, [value] must be between
-   * -128 and 127, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * greater than or equal to the length of this object.
-   */
+  /// Sets the byte at the specified [byteOffset] in this object to the
+  /// two's complement binary representation of the specified [value], which
+  /// must fit in a single byte. In other words, [value] must be between
+  /// -128 and 127, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// greater than or equal to the length of this object.
   void setInt8(int byteOffset, int value) native;
 
-  /**
-   * Sets the two bytes starting at the specified [byteOffset] in this object
-   * to the unsigned binary representation of the specified [value],
-   * which must fit in two bytes. in other words, [value] must be between
-   * 0 and 2<sup>16</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 2` is greater than the length of this object.
-   */
+  /// Sets the two bytes starting at the specified [byteOffset] in this object
+  /// to the unsigned binary representation of the specified [value],
+  /// which must fit in two bytes. in other words, [value] must be between
+  /// 0 and 2<sup>16</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 2` is greater than the length of this object.
   void setUint16(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint16(byteOffset, value, Endian.little == endian);
 
   @JSName('setUint16')
   void _setUint16(int byteOffset, int value, [bool littleEndian]) native;
 
-  /**
-   * Sets the four bytes starting at the specified [byteOffset] in this object
-   * to the unsigned binary representation of the specified [value],
-   * which must fit in four bytes. in other words, [value] must be between
-   * 0 and 2<sup>32</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 4` is greater than the length of this object.
-   */
+  /// Sets the four bytes starting at the specified [byteOffset] in this object
+  /// to the unsigned binary representation of the specified [value],
+  /// which must fit in four bytes. in other words, [value] must be between
+  /// 0 and 2<sup>32</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 4` is greater than the length of this object.
   void setUint32(int byteOffset, int value, [Endian endian = Endian.big]) =>
       _setUint32(byteOffset, value, Endian.little == endian);
 
   @JSName('setUint32')
   void _setUint32(int byteOffset, int value, [bool littleEndian]) native;
 
-  /**
-   * Sets the eight bytes starting at the specified [byteOffset] in this object
-   * to the unsigned binary representation of the specified [value],
-   * which must fit in eight bytes. in other words, [value] must be between
-   * 0 and 2<sup>64</sup> - 1, inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative, or
-   * `byteOffset + 8` is greater than the length of this object.
-   */
+  /// Sets the eight bytes starting at the specified [byteOffset] in this object
+  /// to the unsigned binary representation of the specified [value],
+  /// which must fit in eight bytes. in other words, [value] must be between
+  /// 0 and 2<sup>64</sup> - 1, inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative, or
+  /// `byteOffset + 8` is greater than the length of this object.
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]) {
     throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
-  /**
-   * Sets the byte at the specified [byteOffset] in this object to the
-   * unsigned binary representation of the specified [value], which must fit
-   * in a single byte. in other words, [value] must be between 0 and 255,
-   * inclusive.
-   *
-   * Throws [RangeError] if [byteOffset] is negative,
-   * or greater than or equal to the length of this object.
-   */
+  /// Sets the byte at the specified [byteOffset] in this object to the
+  /// unsigned binary representation of the specified [value], which must fit
+  /// in a single byte. in other words, [value] must be between 0 and 255,
+  /// inclusive.
+  ///
+  /// Throws [RangeError] if [byteOffset] is negative,
+  /// or greater than or equal to the length of this object.
   void setUint8(int byteOffset, int value) native;
 
   static NativeByteData _create1(arg) =>
@@ -1159,11 +1087,9 @@
       JS('NativeUint8List', 'new Uint8Array(#, #, #)', arg1, arg2, arg3);
 }
 
-/**
- * Implementation of Dart Float32x4 immutable value type and operations.
- * Float32x4 stores 4 32-bit floating point values in "lanes".
- * The lanes are "x", "y", "z", and "w" respectively.
- */
+/// Implementation of Dart Float32x4 immutable value type and operations.
+/// Float32x4 stores 4 32-bit floating point values in "lanes".
+/// The lanes are "x", "y", "z", and "w" respectively.
 class NativeFloat32x4 implements Float32x4 {
   final double x;
   final double y;
@@ -1494,11 +1420,9 @@
   }
 }
 
-/**
- * Interface of Dart Int32x4 and operations.
- * Int32x4 stores 4 32-bit bit-masks in "lanes".
- * The lanes are "x", "y", "z", and "w" respectively.
- */
+/// Interface of Dart Int32x4 and operations.
+/// Int32x4 stores 4 32-bit bit-masks in "lanes".
+/// The lanes are "x", "y", "z", and "w" respectively.
 class NativeInt32x4 implements Int32x4 {
   final int x;
   final int y;
diff --git a/sdk/lib/_internal/js_runtime/lib/regexp_helper.dart b/sdk/lib/_internal/js_runtime/lib/regexp_helper.dart
index a588b08..77f746b 100644
--- a/sdk/lib/_internal/js_runtime/lib/regexp_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/regexp_helper.dart
@@ -7,31 +7,27 @@
 // Helper method used by internal libraries.
 regExpGetNative(JSSyntaxRegExp regexp) => regexp._nativeRegExp;
 
-/**
- * Returns a native version of the RegExp with the global flag set.
- *
- * The RegExp's `lastIndex` property is zero when it is returned.
- *
- * The returned regexp is shared, and its `lastIndex` property may be
- * modified by other uses, so the returned regexp must be used immediately
- * when it's returned, with no user-provided code run in between.
- */
+/// Returns a native version of the RegExp with the global flag set.
+///
+/// The RegExp's `lastIndex` property is zero when it is returned.
+///
+/// The returned regexp is shared, and its `lastIndex` property may be
+/// modified by other uses, so the returned regexp must be used immediately
+/// when it's returned, with no user-provided code run in between.
 regExpGetGlobalNative(JSSyntaxRegExp regexp) {
   var nativeRegexp = regexp._nativeGlobalVersion;
   JS('void', '#.lastIndex = 0', nativeRegexp);
   return nativeRegexp;
 }
 
-/**
- * Computes the number of captures in a regexp.
- *
- * This currently involves creating a new RegExp object with a different
- * source and running it against the empty string (the last part is usually
- * fast).
- *
- * The JSSyntaxRegExp could cache the result, and set the cache any time
- * it finds a match.
- */
+/// Computes the number of captures in a regexp.
+///
+/// This currently involves creating a new RegExp object with a different
+/// source and running it against the empty string (the last part is usually
+/// fast).
+///
+/// The JSSyntaxRegExp could cache the result, and set the cache any time
+/// it finds a match.
 int regExpCaptureCount(JSSyntaxRegExp regexp) {
   var nativeAnchoredRegExp = regexp._nativeAnchoredVersion;
   var match = JS('JSExtendableArray', '#.exec("")', nativeAnchoredRegExp);
@@ -239,7 +235,7 @@
   }
 }
 
-/** Find the first match of [regExp] in [string] at or after [start]. */
+/// Find the first match of [regExp] in [string] at or after [start].
 Match firstMatchAfter(JSSyntaxRegExp regExp, String string, int start) {
   return regExp._execGlobal(string, start);
 }
diff --git a/sdk/lib/_internal/js_runtime/pubspec.yaml b/sdk/lib/_internal/js_runtime/pubspec.yaml
index c8fa809..821aaac 100644
--- a/sdk/lib/_internal/js_runtime/pubspec.yaml
+++ b/sdk/lib/_internal/js_runtime/pubspec.yaml
@@ -1,4 +1,6 @@
 # Note: This package is not meant to be uploaded to pub. This file is used to
 # make it easier to develop on dart2js.
 name: js_runtime
-# version: do-not-upload
+publish_to: none
+environment:
+  sdk: '>=2.0.0 <3.0.0'
diff --git a/sdk/lib/_internal/sdk_library_metadata/pubspec.yaml b/sdk/lib/_internal/sdk_library_metadata/pubspec.yaml
index 4d09374..08b5518 100644
--- a/sdk/lib/_internal/sdk_library_metadata/pubspec.yaml
+++ b/sdk/lib/_internal/sdk_library_metadata/pubspec.yaml
@@ -1,4 +1,6 @@
 # Note: This package is not meant to be uploaded to pub. This file is used to
 # make it easer to depend on libraries.dart from sdk packages like dart2js.
 name: sdk_library_metadata
-# version: do-not-upload
+publish_to: none
+environment:
+  sdk: '>=2.0.0 <3.0.0'
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index b5354bb..b3a5dbd 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -99,9 +99,10 @@
         CastStream,
         CastStreamTransformer,
         EmptyIterator,
+        IterableElementError,
         printToZone,
         printToConsole,
-        IterableElementError;
+        Since;
 
 part 'async_error.dart';
 part 'broadcast_stream_controller.dart';
diff --git a/sdk/lib/async/async_error.dart b/sdk/lib/async/async_error.dart
index df6ad29..1520c54 100644
--- a/sdk/lib/async/async_error.dart
+++ b/sdk/lib/async/async_error.dart
@@ -7,6 +7,10 @@
 _invokeErrorHandler(
     Function errorHandler, Object error, StackTrace stackTrace) {
   if (errorHandler is ZoneBinaryCallback<dynamic, Null, Null>) {
+    // Dynamic invocation because we don't know the actual type of the
+    // first argument or the error object, but we should successfully call
+    // the handler if they match up.
+    // TODO(lrn): Should we? Why not the same below for the unary case?
     return (errorHandler as dynamic)(error, stackTrace);
   } else {
     ZoneUnaryCallback unaryErrorHandler = errorHandler;
diff --git a/sdk/lib/async/broadcast_stream_controller.dart b/sdk/lib/async/broadcast_stream_controller.dart
index 44e468d..32e4582 100644
--- a/sdk/lib/async/broadcast_stream_controller.dart
+++ b/sdk/lib/async/broadcast_stream_controller.dart
@@ -57,11 +57,7 @@
 }
 
 abstract class _BroadcastStreamController<T>
-    implements
-        StreamController<T>,
-        _StreamControllerLifecycle<T>,
-        _EventSink<T>,
-        _EventDispatch<T> {
+    implements _StreamControllerBase<T> {
   static const int _STATE_INITIAL = 0;
   static const int _STATE_EVENT_ID = 1;
   static const int _STATE_FIRING = 2;
@@ -206,7 +202,7 @@
   StreamSubscription<T> _subscribe(void onData(T data), Function onError,
       void onDone(), bool cancelOnError) {
     if (isClosed) {
-      if (onDone == null) onDone = _nullDoneHandler;
+      onDone ??= _nullDoneHandler;
       return new _DoneStreamSubscription<T>(onDone);
     }
     StreamSubscription<T> subscription = new _BroadcastSubscription<T>(
@@ -466,9 +462,7 @@
   bool get _hasPending => _pending != null && !_pending.isEmpty;
 
   void _addPendingEvent(_DelayedEvent event) {
-    if (_pending == null) {
-      _pending = new _StreamImplEvents<T>();
-    }
+    _pending ??= new _StreamImplEvents<T>();
     _pending.add(event);
   }
 
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index beb982e..b9d22c1 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -224,9 +224,6 @@
       var result = computation();
       if (result is Future<T>) {
         return result;
-      } else if (result is Future) {
-        // TODO(lrn): Remove this case for Dart 2.0.
-        return new _Future<T>.immediate(result);
       } else {
         return new _Future<T>.value(result);
       }
@@ -312,10 +309,14 @@
   factory Future.delayed(Duration duration, [FutureOr<T> computation()]) {
     _Future<T> result = new _Future<T>();
     new Timer(duration, () {
-      try {
-        result._complete(computation?.call());
-      } catch (e, s) {
-        _completeWithErrorCallback(result, e, s);
+      if (computation == null) {
+        result._complete(null);
+      } else {
+        try {
+          result._complete(computation());
+        } catch (e, s) {
+          _completeWithErrorCallback(result, e, s);
+        }
       }
     });
     return result;
@@ -361,7 +362,7 @@
     // Handle an error from any of the futures.
     // TODO(jmesserly): use `void` return type once it can be inferred for the
     // `then` call below.
-    handleError(theError, theStackTrace) {
+    handleError(theError, StackTrace theStackTrace) {
       remaining--;
       if (values != null) {
         if (cleanUp != null) {
@@ -457,7 +458,7 @@
     var onValue = (T value) {
       if (!completer.isCompleted) completer.complete(value);
     };
-    var onError = (error, stack) {
+    var onError = (error, StackTrace stack) {
       if (!completer.isCompleted) completer.completeError(error, stack);
     };
     for (var future in futures) {
@@ -521,7 +522,7 @@
    */
   static Future doWhile(FutureOr<bool> action()) {
     _Future doneSignal = new _Future();
-    var nextIteration;
+    void Function(bool) nextIteration;
     // Bind this callback explicitly so that each iteration isn't bound in the
     // context of all the previous iterations' callbacks.
     // This avoids, e.g., deeply nested stack traces from the stack trace
@@ -906,7 +907,7 @@
 
 // Helper function completing a _Future with error, but checking the zone
 // for error replacement first.
-void _completeWithErrorCallback(_Future result, error, stackTrace) {
+void _completeWithErrorCallback(_Future result, error, StackTrace stackTrace) {
   AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
     error = _nonNullError(replacement.error);
@@ -916,7 +917,8 @@
 }
 
 // Like [_completeWithErrorCallback] but completes asynchronously.
-void _asyncCompleteWithErrorCallback(_Future result, error, stackTrace) {
+void _asyncCompleteWithErrorCallback(
+    _Future result, error, StackTrace stackTrace) {
   AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
     error = _nonNullError(replacement.error);
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index b85e6ab..3fd6b59 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -68,7 +68,7 @@
   static const int stateCatcherrorTest = maskError | maskTestError;
   static const int stateWhencomplete = maskWhencomplete;
   // Listeners on the same future are linked through this link.
-  _FutureListener _nextListener = null;
+  _FutureListener _nextListener;
   // The future to complete when this listener is activated.
   final _Future<T> result;
   // Which fields means what.
@@ -84,14 +84,11 @@
         errorCallback = errorCallback,
         state = (errorCallback == null) ? stateThen : stateThenOnerror;
 
-  _FutureListener.catchError(
-      this.result, this.errorCallback, _FutureErrorTest test)
-      : callback = test,
-        state = (test == null) ? stateCatcherror : stateCatcherrorTest;
+  _FutureListener.catchError(this.result, this.errorCallback, this.callback)
+      : state = (callback == null) ? stateCatcherror : stateCatcherrorTest;
 
-  _FutureListener.whenComplete(this.result, _FutureAction onComplete)
-      : callback = onComplete,
-        errorCallback = null,
+  _FutureListener.whenComplete(this.result, this.callback)
+      : errorCallback = null,
         state = stateWhencomplete;
 
   Zone get _zone => result._zone;
@@ -395,7 +392,7 @@
   }
 
   _FutureListener _reverseListeners(_FutureListener listeners) {
-    _FutureListener prev = null;
+    _FutureListener prev;
     _FutureListener current = listeners;
     while (current != null) {
       _FutureListener next = current._nextListener;
@@ -429,7 +426,7 @@
           // and dependent on the listeners of the target future. If none of
           // the target future's listeners want to have the stack trace we don't
           // need a trace.
-          onError: (error, [stackTrace]) {
+          onError: (error, [StackTrace stackTrace]) {
         assert(target._isPendingComplete);
         target._completeError(error, stackTrace);
       });
@@ -739,7 +736,7 @@
         timer.cancel();
         result._completeWithValue(v);
       }
-    }, onError: (e, s) {
+    }, onError: (e, StackTrace s) {
       if (timer.isActive) {
         timer.cancel();
         result._completeError(e, s);
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index de9b332..cb021aa 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -147,7 +147,7 @@
         if (--count == 0) controller._closeUnchecked();
       }
     };
-    var onError = (error, stack) {
+    var onError = (error, StackTrace stack) {
       if (!controller.isClosed) {
         controller._addError(error, stack);
         if (--count == 0) controller._closeUnchecked();
@@ -426,15 +426,14 @@
    * The returned stream is a broadcast stream if this stream is.
    */
   Stream<E> asyncMap<E>(FutureOr<E> convert(T event)) {
-    StreamController<E> controller;
+    _StreamControllerBase<E> controller;
     StreamSubscription<T> subscription;
 
     void onListen() {
       final add = controller.add;
-      assert(controller is _StreamController ||
+      assert(controller is _StreamController<E> ||
           controller is _BroadcastStreamController);
-      final _EventSink<E> eventSink = controller as Object;
-      final addError = eventSink._addError;
+      final addError = controller._addError;
       subscription = this.listen((T event) {
         FutureOr<E> newValue;
         try {
@@ -495,12 +494,11 @@
    * The returned stream is a broadcast stream if this stream is.
    */
   Stream<E> asyncExpand<E>(Stream<E> convert(T event)) {
-    StreamController<E> controller;
+    _StreamControllerBase<E> controller;
     StreamSubscription<T> subscription;
     void onListen() {
       assert(controller is _StreamController ||
           controller is _BroadcastStreamController);
-      final _EventSink<E> eventSink = controller as Object;
       subscription = this.listen((T event) {
         Stream<E> newStream;
         try {
@@ -514,7 +512,7 @@
           controller.addStream(newStream).whenComplete(subscription.resume);
         }
       },
-          onError: eventSink._addError, // Avoid Zone error replacement.
+          onError: controller._addError, // Avoid Zone error replacement.
           onDone: controller.close);
     }
 
@@ -1195,7 +1193,7 @@
    */
   Future<T> get last {
     _Future<T> future = new _Future<T>();
-    T result = null;
+    T result;
     bool foundResult = false;
     listen(
         (T value) {
@@ -1230,7 +1228,7 @@
    */
   Future<T> get single {
     _Future<T> future = new _Future<T>();
-    T result = null;
+    T result;
     bool foundResult = false;
     StreamSubscription subscription;
     subscription = this.listen(
@@ -1328,7 +1326,7 @@
    */
   Future<T> lastWhere(bool test(T element), {T orElse()}) {
     _Future<T> future = new _Future();
-    T result = null;
+    T result;
     bool foundResult = false;
     StreamSubscription subscription;
     subscription = this.listen(
@@ -1368,7 +1366,7 @@
    */
   Future<T> singleWhere(bool test(T element), {T orElse()}) {
     _Future<T> future = new _Future<T>();
-    T result = null;
+    T result;
     bool foundResult = false;
     StreamSubscription subscription;
     subscription = this.listen(
@@ -1425,7 +1423,8 @@
    * with a [RangeError].
    */
   Future<T> elementAt(int index) {
-    if (index is! int || index < 0) throw new ArgumentError(index);
+    ArgumentError.checkNotNull(index, "index");
+    RangeError.checkNotNegative(index, "index");
     _Future<T> future = new _Future<T>();
     StreamSubscription subscription;
     int elementIndex = 0;
@@ -1474,7 +1473,7 @@
    * and the subscriptions' timers can be paused individually.
    */
   Stream<T> timeout(Duration timeLimit, {void onTimeout(EventSink<T> sink)}) {
-    StreamController<T> controller;
+    _StreamControllerBase<T> controller;
     // The following variables are set on listen.
     StreamSubscription<T> subscription;
     Timer timer;
@@ -1491,8 +1490,7 @@
       timer.cancel();
       assert(controller is _StreamController ||
           controller is _BroadcastStreamController);
-      dynamic eventSink = controller;
-      eventSink._addError(error, stackTrace); // Avoid Zone error replacement.
+      controller._addError(error, stackTrace); // Avoid Zone error replacement.
       timer = zone.createTimer(timeLimit, timeout);
     }
 
@@ -2018,6 +2016,7 @@
    *     (stream) => stream.transform(utf8.decoder).transform(LineSplitter()));
    * ```
    */
+  @Since("2.1")
   factory StreamTransformer.fromBind(Stream<T> Function(Stream<S>) bind) =
       _StreamBindTransformer<S, T>;
 
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart
index 71b857f..34c6adf 100644
--- a/sdk/lib/async/stream_controller.dart
+++ b/sdk/lib/async/stream_controller.dart
@@ -381,17 +381,20 @@
   Future _recordCancel(StreamSubscription<T> subscription) => null;
 }
 
+// Base type for implementations of stream controllers.
+abstract class _StreamControllerBase<T>
+    implements
+        StreamController<T>,
+        _StreamControllerLifecycle<T>,
+        _EventSink<T>,
+        _EventDispatch<T> {}
+
 /**
  * Default implementation of [StreamController].
  *
  * Controls a stream that only supports a single controller.
  */
-abstract class _StreamController<T>
-    implements
-        StreamController<T>,
-        _StreamControllerLifecycle<T>,
-        _EventSink<T>,
-        _EventDispatch<T> {
+abstract class _StreamController<T> implements _StreamControllerBase<T> {
   // The states are bit-flags. More than one can be set at a time.
   //
   // The "subscription state" goes through the states:
@@ -516,7 +519,7 @@
   _StreamImplEvents<T> _ensurePendingEvents() {
     assert(_isInitialState);
     if (!_isAddingStream) {
-      if (_varData == null) _varData = new _StreamImplEvents<T>();
+      _varData ??= new _StreamImplEvents<T>();
       return _varData;
     }
     _StreamControllerAddStreamState<T> state = _varData;
@@ -571,9 +574,7 @@
   Future get done => _ensureDoneFuture();
 
   Future _ensureDoneFuture() {
-    if (_doneFuture == null) {
-      _doneFuture = _isCanceled ? Future._nullFuture : new _Future();
-    }
+    _doneFuture ??= _isCanceled ? Future._nullFuture : new _Future();
     return _doneFuture;
   }
 
@@ -824,9 +825,8 @@
 
   bool operator ==(Object other) {
     if (identical(this, other)) return true;
-    if (other is! _ControllerStream) return false;
-    _ControllerStream otherStream = other;
-    return identical(otherStream._controller, this._controller);
+    return other is _ControllerStream &&
+        identical(other._controller, this._controller);
   }
 }
 
@@ -933,7 +933,7 @@
   var varData;
 
   _StreamControllerAddStreamState(_StreamController<T> controller, this.varData,
-      Stream source, bool cancelOnError)
+      Stream<T> source, bool cancelOnError)
       : super(controller, source, cancelOnError) {
     if (controller.isPaused) {
       addSubscription.pause();
diff --git a/sdk/lib/async/stream_impl.dart b/sdk/lib/async/stream_impl.dart
index 6c2b8ba..51497e0 100644
--- a/sdk/lib/async/stream_impl.dart
+++ b/sdk/lib/async/stream_impl.dart
@@ -133,14 +133,14 @@
   // StreamSubscription interface.
 
   void onData(void handleData(T event)) {
-    if (handleData == null) handleData = _nullDataHandler;
+    handleData ??= _nullDataHandler;
     // TODO(floitsch): the return type should be 'void', and the type
     // should be inferred.
     _onData = _zone.registerUnaryCallback<dynamic, T>(handleData);
   }
 
   void onError(Function handleError) {
-    if (handleError == null) handleError = _nullErrorHandler;
+    handleError ??= _nullErrorHandler;
     if (handleError is void Function(Object, StackTrace)) {
       _onError = _zone
           .registerBinaryCallback<dynamic, Object, StackTrace>(handleError);
@@ -153,7 +153,7 @@
   }
 
   void onDone(void handleDone()) {
-    if (handleDone == null) handleDone = _nullDoneHandler;
+    handleDone ??= _nullDoneHandler;
     _onDone = _zone.registerCallback(handleDone);
   }
 
@@ -203,7 +203,7 @@
     _onDone = () {
       result._complete(futureValue);
     };
-    _onError = (error, stackTrace) {
+    _onError = (error, StackTrace stackTrace) {
       Future cancelFuture = cancel();
       if (!identical(cancelFuture, Future._nullFuture)) {
         cancelFuture.whenComplete(() {
@@ -363,7 +363,7 @@
     if (_cancelOnError) {
       _state |= _STATE_WAIT_FOR_CANCEL;
       _cancel();
-      if (_cancelFuture is Future &&
+      if (_cancelFuture != null &&
           !identical(_cancelFuture, Future._nullFuture)) {
         _cancelFuture.whenComplete(sendError);
       } else {
@@ -392,7 +392,7 @@
 
     _cancel();
     _state |= _STATE_WAIT_FOR_CANCEL;
-    if (_cancelFuture is Future &&
+    if (_cancelFuture != null &&
         !identical(_cancelFuture, Future._nullFuture)) {
       _cancelFuture.whenComplete(sendDone);
     } else {
@@ -682,10 +682,10 @@
 /** Class holding pending events for a [_StreamImpl]. */
 class _StreamImplEvents<T> extends _PendingEvents<T> {
   /// Single linked list of [_DelayedEvent] objects.
-  _DelayedEvent firstPendingEvent = null;
+  _DelayedEvent firstPendingEvent;
 
   /// Last element in the list of pending events. New events are added after it.
-  _DelayedEvent lastPendingEvent = null;
+  _DelayedEvent lastPendingEvent;
 
   bool get isEmpty => lastPendingEvent == null;
 
@@ -813,10 +813,8 @@
       // it will only ever send one done event.
       return new _DoneStreamSubscription<T>(onDone);
     }
-    if (_subscription == null) {
-      _subscription = _source.listen(_controller.add,
-          onError: _controller.addError, onDone: _controller.close);
-    }
+    _subscription ??= _source.listen(_controller.add,
+        onError: _controller.addError, onDone: _controller.close);
     cancelOnError = identical(true, cancelOnError);
     return _controller._subscribe(onData, onError, onDone, cancelOnError);
   }
diff --git a/sdk/lib/async/stream_pipe.dart b/sdk/lib/async/stream_pipe.dart
index 3cb1145..e526179 100644
--- a/sdk/lib/async/stream_pipe.dart
+++ b/sdk/lib/async/stream_pipe.dart
@@ -26,7 +26,7 @@
 void _cancelAndError(StreamSubscription subscription, _Future future, error,
     StackTrace stackTrace) {
   var cancelFuture = subscription.cancel();
-  if (cancelFuture is Future && !identical(cancelFuture, Future._nullFuture)) {
+  if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
     cancelFuture.whenComplete(() => future._completeError(error, stackTrace));
   } else {
     future._completeError(error, stackTrace);
@@ -57,7 +57,7 @@
   before completing with a value. */
 void _cancelAndValue(StreamSubscription subscription, _Future future, value) {
   var cancelFuture = subscription.cancel();
-  if (cancelFuture is Future && !identical(cancelFuture, Future._nullFuture)) {
+  if (cancelFuture != null && !identical(cancelFuture, Future._nullFuture)) {
     cancelFuture.whenComplete(() => future._complete(value));
   } else {
     future._complete(value);
@@ -179,7 +179,7 @@
 
 typedef bool _Predicate<T>(T value);
 
-void _addErrorWithReplacement(_EventSink sink, error, stackTrace) {
+void _addErrorWithReplacement(_EventSink sink, error, StackTrace stackTrace) {
   AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
   if (replacement != null) {
     error = _nonNullError(replacement.error);
@@ -306,7 +306,7 @@
         super(source) {
     // This test is done early to avoid handling an async error
     // in the _handleData method.
-    if (count is! int) throw new ArgumentError(count);
+    ArgumentError.checkNotNull(count, "count");
   }
 
   StreamSubscription<T> _createSubscription(void onData(T data),
@@ -397,7 +397,8 @@
         super(source) {
     // This test is done early to avoid handling an async error
     // in the _handleData method.
-    if (count is! int || count < 0) throw new ArgumentError(count);
+    ArgumentError.checkNotNull(count, "count");
+    RangeError.checkNotNegative(count, "count");
   }
 
   StreamSubscription<T> _createSubscription(void onData(T data),
@@ -456,7 +457,7 @@
 typedef bool _Equality<T>(T a, T b);
 
 class _DistinctStream<T> extends _ForwardingStream<T, T> {
-  static var _SENTINEL = new Object();
+  static final _SENTINEL = new Object();
 
   final _Equality<T> _equals;
 
diff --git a/sdk/lib/async/stream_transformers.dart b/sdk/lib/async/stream_transformers.dart
index 5488d55..9a4b1dc 100644
--- a/sdk/lib/async/stream_transformers.dart
+++ b/sdk/lib/async/stream_transformers.dart
@@ -123,7 +123,7 @@
     }
   }
 
-  void _handleError(error, [stackTrace]) {
+  void _handleError(error, [StackTrace stackTrace]) {
     try {
       _transformerSink.addError(error, stackTrace);
     } catch (e, s) {
diff --git a/sdk/lib/async/timer.dart b/sdk/lib/async/timer.dart
index 186bbe6..aa2f088 100644
--- a/sdk/lib/async/timer.dart
+++ b/sdk/lib/async/timer.dart
@@ -89,6 +89,10 @@
 
   /**
    * Cancels the timer.
+   *
+   * Once a [Timer] has been canceled, the callback function will not be called
+   * by the timer. Calling [cancel] more than once on a [Timer] is allowed, and
+   * will have no further effect.
    */
   void cancel();
 
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index 6f11023..911ecff 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -95,19 +95,19 @@
    * the ones in [other].
    */
   factory ZoneSpecification.from(ZoneSpecification other,
-      {HandleUncaughtErrorHandler handleUncaughtError: null,
-      RunHandler run: null,
-      RunUnaryHandler runUnary: null,
-      RunBinaryHandler runBinary: null,
-      RegisterCallbackHandler registerCallback: null,
-      RegisterUnaryCallbackHandler registerUnaryCallback: null,
-      RegisterBinaryCallbackHandler registerBinaryCallback: null,
-      ErrorCallbackHandler errorCallback: null,
-      ScheduleMicrotaskHandler scheduleMicrotask: null,
-      CreateTimerHandler createTimer: null,
-      CreatePeriodicTimerHandler createPeriodicTimer: null,
-      PrintHandler print: null,
-      ForkHandler fork: null}) {
+      {HandleUncaughtErrorHandler handleUncaughtError,
+      RunHandler run,
+      RunUnaryHandler runUnary,
+      RunBinaryHandler runBinary,
+      RegisterCallbackHandler registerCallback,
+      RegisterUnaryCallbackHandler registerUnaryCallback,
+      RegisterBinaryCallbackHandler registerBinaryCallback,
+      ErrorCallbackHandler errorCallback,
+      ScheduleMicrotaskHandler scheduleMicrotask,
+      CreateTimerHandler createTimer,
+      CreatePeriodicTimerHandler createPeriodicTimer,
+      PrintHandler print,
+      ForkHandler fork}) {
     return new ZoneSpecification(
         handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError,
         run: run ?? other.run,
@@ -150,19 +150,19 @@
  */
 class _ZoneSpecification implements ZoneSpecification {
   const _ZoneSpecification(
-      {this.handleUncaughtError: null,
-      this.run: null,
-      this.runUnary: null,
-      this.runBinary: null,
-      this.registerCallback: null,
-      this.registerUnaryCallback: null,
-      this.registerBinaryCallback: null,
-      this.errorCallback: null,
-      this.scheduleMicrotask: null,
-      this.createTimer: null,
-      this.createPeriodicTimer: null,
-      this.print: null,
-      this.fork: null});
+      {this.handleUncaughtError,
+      this.run,
+      this.runUnary,
+      this.runBinary,
+      this.registerCallback,
+      this.registerUnaryCallback,
+      this.registerBinaryCallback,
+      this.errorCallback,
+      this.scheduleMicrotask,
+      this.createTimer,
+      this.createPeriodicTimer,
+      this.print,
+      this.fork});
 
   final HandleUncaughtErrorHandler handleUncaughtError;
   final RunHandler run;
@@ -1108,7 +1108,7 @@
 void _rootHandleUncaughtError(
     Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) {
   _schedulePriorityAsyncCallback(() {
-    if (error == null) error = new NullThrownError();
+    error ??= new NullThrownError();
     if (stackTrace == null) throw error;
     _rethrow(error, stackTrace);
   });
@@ -1277,7 +1277,7 @@
   /// This is always a [HashMap].
   Map get _map => _rootMap;
 
-  static Map _rootMap = new HashMap();
+  static final _rootMap = new HashMap();
 
   static ZoneDelegate _rootDelegate;
 
diff --git a/sdk/lib/collection/hash_map.dart b/sdk/lib/collection/hash_map.dart
index dcdb4ee..728ff9e6 100644
--- a/sdk/lib/collection/hash_map.dart
+++ b/sdk/lib/collection/hash_map.dart
@@ -163,6 +163,7 @@
    * If multiple [entries] have the same key,
    * later occurrences overwrite the earlier ones.
    */
+  @Since("2.1")
   factory HashMap.fromEntries(Iterable<MapEntry<K, V>> entries) =>
       HashMap<K, V>()..addEntries(entries);
 }
diff --git a/sdk/lib/collection/hash_set.dart b/sdk/lib/collection/hash_set.dart
index 8f3f715..d93e550 100644
--- a/sdk/lib/collection/hash_set.dart
+++ b/sdk/lib/collection/hash_set.dart
@@ -4,37 +4,6 @@
 
 part of dart.collection;
 
-/** Common parts of [HashSet] and [LinkedHashSet] implementations. */
-abstract class _HashSetBase<E> extends SetBase<E> {
-  // The following two methods override the ones in SetBase.
-  // It's possible to be more efficient if we have a way to create an empty
-  // set of the correct type.
-
-  Set<E> _newSet();
-
-  Set<R> _newSimilarSet<R>();
-
-  Set<R> cast<R>() => Set.castFrom<E, R>(this, newSet: _newSimilarSet);
-  Set<E> difference(Set<Object> other) {
-    Set<E> result = _newSet();
-    for (var element in this) {
-      if (!other.contains(element)) result.add(element);
-    }
-    return result;
-  }
-
-  Set<E> intersection(Set<Object> other) {
-    Set<E> result = _newSet();
-    for (var element in this) {
-      if (other.contains(element)) result.add(element);
-    }
-    return result;
-  }
-
-  // Subclasses can optimize this further.
-  Set<E> toSet() => _newSet()..addAll(this);
-}
-
 /**
  * An unordered hash-table based [Set] implementation.
  *
diff --git a/sdk/lib/collection/iterable.dart b/sdk/lib/collection/iterable.dart
index 79d6188..b7b5497 100644
--- a/sdk/lib/collection/iterable.dart
+++ b/sdk/lib/collection/iterable.dart
@@ -168,7 +168,7 @@
   }
 
   E lastWhere(bool test(E value), {E orElse()}) {
-    E result = null;
+    E result;
     bool foundMatching = false;
     for (E element in this) {
       if (test(element)) {
@@ -182,7 +182,7 @@
   }
 
   E singleWhere(bool test(E element), {E orElse()}) {
-    E result = null;
+    E result;
     bool foundMatching = false;
     for (E element in this) {
       if (test(element)) {
@@ -199,7 +199,7 @@
   }
 
   E elementAt(int index) {
-    if (index is! int) throw new ArgumentError.notNull("index");
+    ArgumentError.checkNotNull(index, "index");
     RangeError.checkNotNegative(index, "index");
     int elementIndex = 0;
     for (E element in this) {
@@ -238,7 +238,7 @@
       }
       return "$leftDelimiter...$rightDelimiter";
     }
-    List parts = [];
+    List<String> parts = <String>[];
     _toStringVisiting.add(iterable);
     try {
       _iterablePartsToStrings(iterable, parts);
@@ -296,7 +296,7 @@
 /**
  * Convert elements of [iterable] to strings and store them in [parts].
  */
-void _iterablePartsToStrings(Iterable iterable, List parts) {
+void _iterablePartsToStrings(Iterable iterable, List<String> parts) {
   /*
    * This is the complicated part of [iterableToShortString].
    * It is extracted as a separate function to avoid having too much code
@@ -337,8 +337,8 @@
 
   // Find last two elements. One or more of them may already be in the
   // parts array. Include their length in `length`.
-  var penultimate = null;
-  var ultimate = null;
+  Object penultimate;
+  Object ultimate;
   if (!it.moveNext()) {
     if (count <= headCount + tailCount) return;
     ultimateString = parts.removeLast();
@@ -388,7 +388,7 @@
 
   // If there is a gap between the initial run and the last two,
   // prepare to add an ellipsis.
-  String elision = null;
+  String elision;
   if (count > parts.length + tailCount) {
     elision = "...";
     length += ellipsisSize + overhead;
diff --git a/sdk/lib/collection/linked_hash_map.dart b/sdk/lib/collection/linked_hash_map.dart
index 770c6e1..91f95ad 100644
--- a/sdk/lib/collection/linked_hash_map.dart
+++ b/sdk/lib/collection/linked_hash_map.dart
@@ -151,6 +151,7 @@
    * If multiple [entries] have the same key,
    * later occurrences overwrite the earlier ones.
    */
+  @Since("2.1")
   factory LinkedHashMap.fromEntries(Iterable<MapEntry<K, V>> entries) =>
       <K, V>{}..addEntries(entries);
 }
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
index a719679..0c01350 100644
--- a/sdk/lib/collection/list.dart
+++ b/sdk/lib/collection/list.dart
@@ -163,7 +163,7 @@
 
   E singleWhere(bool test(E element), {E orElse()}) {
     int length = this.length;
-    E match = null;
+    E match;
     bool matchFound = false;
     for (int i = 0; i < length; i++) {
       E element = this[i];
@@ -346,7 +346,7 @@
   }
 
   void shuffle([Random random]) {
-    if (random == null) random = new Random();
+    random ??= new Random();
     int length = this.length;
     while (length > 1) {
       int pos = random.nextInt(length);
@@ -370,7 +370,7 @@
 
   List<E> sublist(int start, [int end]) {
     int listLength = this.length;
-    if (end == null) end = listLength;
+    end ??= listLength;
     RangeError.checkValidRange(start, end, listLength);
     int length = end - start;
     List<E> result = <E>[]..length = length;
@@ -486,15 +486,12 @@
   }
 
   void insert(int index, E element) {
+    ArgumentError.checkNotNull(index, "index");
     RangeError.checkValueInInterval(index, 0, length, "index");
     if (index == this.length) {
       add(element);
       return;
     }
-    // We are modifying the length just below the is-check. Without the check
-    // Array.copy could throw an exception, leaving the list in a bad state
-    // (with a length that has been increased, but without a new element).
-    if (index is! int) throw new ArgumentError(index);
     this.length++;
     setRange(index + 1, this.length, this, index);
     this[index] = element;
diff --git a/sdk/lib/collection/maps.dart b/sdk/lib/collection/maps.dart
index 60f66e1..f54404f 100644
--- a/sdk/lib/collection/maps.dart
+++ b/sdk/lib/collection/maps.dart
@@ -250,7 +250,7 @@
 class _MapBaseValueIterator<K, V> implements Iterator<V> {
   final Iterator<K> _keys;
   final Map<K, V> _map;
-  V _current = null;
+  V _current;
 
   _MapBaseValueIterator(Map<K, V> map)
       : _map = map,
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index 30239cb..7f82357 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -525,7 +525,7 @@
 
 class _DoubleLinkedQueueIterator<E> implements Iterator<E> {
   _DoubleLinkedQueueSentinel<E> _sentinel;
-  _DoubleLinkedQueueEntry<E> _nextEntry = null;
+  _DoubleLinkedQueueEntry<E> _nextEntry;
   E _current;
 
   _DoubleLinkedQueueIterator(_DoubleLinkedQueueSentinel<E> sentinel)
diff --git a/sdk/lib/collection/set.dart b/sdk/lib/collection/set.dart
index 80ec9d3..4f21b77 100644
--- a/sdk/lib/collection/set.dart
+++ b/sdk/lib/collection/set.dart
@@ -181,13 +181,13 @@
     StringBuffer buffer = new StringBuffer();
     if (separator == null || separator == "") {
       do {
-        buffer.write("${iterator.current}");
+        buffer.write(iterator.current);
       } while (iterator.moveNext());
     } else {
-      buffer.write("${iterator.current}");
+      buffer.write(iterator.current);
       while (iterator.moveNext()) {
         buffer.write(separator);
-        buffer.write("${iterator.current}");
+        buffer.write(iterator.current);
       }
     }
     return buffer.toString();
@@ -245,7 +245,7 @@
   }
 
   E lastWhere(bool test(E value), {E orElse()}) {
-    E result = null;
+    E result;
     bool foundMatching = false;
     for (E element in this) {
       if (test(element)) {
@@ -259,7 +259,7 @@
   }
 
   E singleWhere(bool test(E value), {E orElse()}) {
-    E result = null;
+    E result;
     bool foundMatching = false;
     for (E element in this) {
       if (test(element)) {
@@ -276,7 +276,7 @@
   }
 
   E elementAt(int index) {
-    if (index is! int) throw new ArgumentError.notNull("index");
+    ArgumentError.checkNotNull(index, "index");
     RangeError.checkNotNegative(index, "index");
     int elementIndex = 0;
     for (E element in this) {
@@ -304,7 +304,7 @@
  * `clear` in constant time. The default implementation works by removing every
  * element.
  */
-abstract class SetBase<E> extends SetMixin<E> {
+abstract class SetBase<E> extends Object with SetMixin<E> {
   /**
    * Convert a `Set` to a string as `{each, element, as, string}`.
    *
@@ -314,3 +314,325 @@
   static String setToString(Set set) =>
       IterableBase.iterableToFullString(set, '{', '}');
 }
+
+/** Common internal implementation of some [Set] methods. */
+// TODO(35548): Make this mix-in SetMixin, by adding `with SetMixin<E>`
+// and removing the copied members below,
+// when analyzer supports const constructors for mixin applications.
+abstract class _SetBase<E> implements Set<E> {
+  // The following two methods override the ones in SetBase.
+  // It's possible to be more efficient if we have a way to create an empty
+  // set of the correct type.
+  const _SetBase();
+
+  Set<E> _newSet();
+
+  Set<R> _newSimilarSet<R>();
+
+  Set<R> cast<R>() => Set.castFrom<E, R>(this, newSet: _newSimilarSet);
+
+  Set<E> difference(Set<Object> other) {
+    Set<E> result = _newSet();
+    for (var element in this) {
+      if (!other.contains(element)) result.add(element);
+    }
+    return result;
+  }
+
+  Set<E> intersection(Set<Object> other) {
+    Set<E> result = _newSet();
+    for (var element in this) {
+      if (other.contains(element)) result.add(element);
+    }
+    return result;
+  }
+
+  // Subclasses can optimize this further.
+  Set<E> toSet() => _newSet()..addAll(this);
+
+  /// TODO(35548): Remove the following declarations again when the analyzer
+  /// supports mixins with const constructors, and mix in `SetMixin` instead.
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => length != 0;
+
+  Iterable<E> followedBy(Iterable<E> other) =>
+      new FollowedByIterable<E>.firstEfficient(this, other);
+
+  Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
+
+  void clear() {
+    removeAll(toList());
+  }
+
+  void addAll(Iterable<E> elements) {
+    for (E element in elements) add(element);
+  }
+
+  void removeAll(Iterable<Object> elements) {
+    for (Object element in elements) remove(element);
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    // Create a copy of the set, remove all of elements from the copy,
+    // then remove all remaining elements in copy from this.
+    Set<E> toRemove = toSet();
+    for (Object o in elements) {
+      toRemove.remove(o);
+    }
+    removeAll(toRemove);
+  }
+
+  void removeWhere(bool test(E element)) {
+    List toRemove = [];
+    for (E element in this) {
+      if (test(element)) toRemove.add(element);
+    }
+    removeAll(toRemove);
+  }
+
+  void retainWhere(bool test(E element)) {
+    List toRemove = [];
+    for (E element in this) {
+      if (!test(element)) toRemove.add(element);
+    }
+    removeAll(toRemove);
+  }
+
+  bool containsAll(Iterable<Object> other) {
+    for (Object o in other) {
+      if (!contains(o)) return false;
+    }
+    return true;
+  }
+
+  Set<E> union(Set<E> other) {
+    return toSet()..addAll(other);
+  }
+
+  List<E> toList({bool growable: true}) {
+    List<E> result = growable ? (<E>[]..length = length) : new List<E>(length);
+    int i = 0;
+    for (E element in this) result[i++] = element;
+    return result;
+  }
+
+  Iterable<T> map<T>(T f(E element)) =>
+      new EfficientLengthMappedIterable<E, T>(this, f);
+
+  E get single {
+    if (length > 1) throw IterableElementError.tooMany();
+    Iterator<E> it = iterator;
+    if (!it.moveNext()) throw IterableElementError.noElement();
+    E result = it.current;
+    return result;
+  }
+
+  String toString() => IterableBase.iterableToFullString(this, '{', '}');
+
+  Iterable<E> where(bool f(E element)) => new WhereIterable<E>(this, f);
+
+  Iterable<T> expand<T>(Iterable<T> f(E element)) =>
+      new ExpandIterable<E, T>(this, f);
+
+  void forEach(void f(E element)) {
+    for (E element in this) f(element);
+  }
+
+  E reduce(E combine(E value, E element)) {
+    Iterator<E> iterator = this.iterator;
+    if (!iterator.moveNext()) {
+      throw IterableElementError.noElement();
+    }
+    E value = iterator.current;
+    while (iterator.moveNext()) {
+      value = combine(value, iterator.current);
+    }
+    return value;
+  }
+
+  T fold<T>(T initialValue, T combine(T previousValue, E element)) {
+    var value = initialValue;
+    for (E element in this) value = combine(value, element);
+    return value;
+  }
+
+  bool every(bool f(E element)) {
+    for (E element in this) {
+      if (!f(element)) return false;
+    }
+    return true;
+  }
+
+  String join([String separator = ""]) {
+    Iterator<E> iterator = this.iterator;
+    if (!iterator.moveNext()) return "";
+    StringBuffer buffer = new StringBuffer();
+    if (separator == null || separator == "") {
+      do {
+        buffer.write(iterator.current);
+      } while (iterator.moveNext());
+    } else {
+      buffer.write(iterator.current);
+      while (iterator.moveNext()) {
+        buffer.write(separator);
+        buffer.write(iterator.current);
+      }
+    }
+    return buffer.toString();
+  }
+
+  bool any(bool test(E element)) {
+    for (E element in this) {
+      if (test(element)) return true;
+    }
+    return false;
+  }
+
+  Iterable<E> take(int n) {
+    return new TakeIterable<E>(this, n);
+  }
+
+  Iterable<E> takeWhile(bool test(E value)) {
+    return new TakeWhileIterable<E>(this, test);
+  }
+
+  Iterable<E> skip(int n) {
+    return new SkipIterable<E>(this, n);
+  }
+
+  Iterable<E> skipWhile(bool test(E value)) {
+    return new SkipWhileIterable<E>(this, test);
+  }
+
+  E get first {
+    Iterator<E> it = iterator;
+    if (!it.moveNext()) {
+      throw IterableElementError.noElement();
+    }
+    return it.current;
+  }
+
+  E get last {
+    Iterator<E> it = iterator;
+    if (!it.moveNext()) {
+      throw IterableElementError.noElement();
+    }
+    E result;
+    do {
+      result = it.current;
+    } while (it.moveNext());
+    return result;
+  }
+
+  E firstWhere(bool test(E value), {E orElse()}) {
+    for (E element in this) {
+      if (test(element)) return element;
+    }
+    if (orElse != null) return orElse();
+    throw IterableElementError.noElement();
+  }
+
+  E lastWhere(bool test(E value), {E orElse()}) {
+    E result;
+    bool foundMatching = false;
+    for (E element in this) {
+      if (test(element)) {
+        result = element;
+        foundMatching = true;
+      }
+    }
+    if (foundMatching) return result;
+    if (orElse != null) return orElse();
+    throw IterableElementError.noElement();
+  }
+
+  E singleWhere(bool test(E value), {E orElse()}) {
+    E result;
+    bool foundMatching = false;
+    for (E element in this) {
+      if (test(element)) {
+        if (foundMatching) {
+          throw IterableElementError.tooMany();
+        }
+        result = element;
+        foundMatching = true;
+      }
+    }
+    if (foundMatching) return result;
+    if (orElse != null) return orElse();
+    throw IterableElementError.noElement();
+  }
+
+  E elementAt(int index) {
+    ArgumentError.checkNotNull(index, "index");
+    RangeError.checkNotNegative(index, "index");
+    int elementIndex = 0;
+    for (E element in this) {
+      if (index == elementIndex) return element;
+      elementIndex++;
+    }
+    throw new RangeError.index(index, this, "index", null, elementIndex);
+  }
+}
+
+/** Class used to implement const sets. */
+class _UnmodifiableSet<E> extends _SetBase<E> {
+  final Map<E, Null> _map;
+
+  const _UnmodifiableSet(this._map);
+
+  Set<E> _newSet() => LinkedHashSet<E>();
+
+  Set<R> _newSimilarSet<R>() => LinkedHashSet<R>();
+
+  // Lookups use map methods.
+
+  bool contains(Object element) => _map.containsKey(element);
+
+  Iterator<E> get iterator => _map.keys.iterator;
+
+  int get length => _map.length;
+
+  E lookup(Object element) {
+    for (var key in _map.keys) {
+      if (key == element) return key;
+    }
+    return null;
+  }
+
+  // Mutating methods throw.
+
+  bool add(E value) {
+    throw UnsupportedError("Cannot change unmodifiable set");
+  }
+
+  void clear() {
+    throw UnsupportedError("Cannot change unmodifiable set");
+  }
+
+  void addAll(Iterable<E> elements) {
+    throw UnsupportedError("Cannot change unmodifiable set");
+  }
+
+  void removeAll(Iterable<Object> elements) {
+    throw UnsupportedError("Cannot change unmodifiable set");
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    throw UnsupportedError("Cannot change unmodifiable set");
+  }
+
+  void removeWhere(bool test(E element)) {
+    throw UnsupportedError("Cannot change unmodifiable set");
+  }
+
+  void retainWhere(bool test(E element)) {
+    throw UnsupportedError("Cannot change unmodifiable set");
+  }
+
+  bool remove(Object value) {
+    throw UnsupportedError("Cannot change unmodifiable set");
+  }
+}
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index b61f37a..9856d55 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -147,32 +147,14 @@
   // anchored at [node].
   // and that node is returned. It should replace the reference to [node]
   // in any parent tree or root pointer.
-  Node _splayMin(Node node) {
-    Node current = node;
-    while (current.left != null) {
-      Node left = current.left;
-      current.left = left.right;
-      left.right = current;
-      current = left;
-    }
-    return current;
-  }
+  external Node _splayMin(Node node);
 
   // Emulates splaying with a key that is greater than any in the subtree
   // anchored at [node].
   // After this, the largest element in the tree is the root of the subtree,
   // and that node is returned. It should replace the reference to [node]
   // in any parent tree or root pointer.
-  Node _splayMax(Node node) {
-    Node current = node;
-    while (current.right != null) {
-      Node right = current.right;
-      current.right = right.left;
-      right.left = current;
-      current = right;
-    }
-    return current;
-  }
+  external Node _splayMax(Node node);
 
   Node _remove(K key) {
     if (_root == null) return null;
@@ -444,7 +426,6 @@
   }
 
   bool containsValue(Object value) {
-    bool found = false;
     int initialSplayCount = _splayCount;
     bool visit(_SplayTreeMapNode node) {
       while (node != null) {
@@ -593,14 +574,14 @@
    * only the tree that has been reordered.
    */
   void _rebuildWorkList(_SplayTreeNode<K> currentNode) {
-    assert(!_workList.isEmpty);
+    assert(_workList.isNotEmpty);
     _workList.clear();
     if (currentNode == null) {
       _findLeftMostDescendent(_tree._root);
     } else {
       _tree._splay(currentNode.key);
       _findLeftMostDescendent(_tree._root.right);
-      assert(!_workList.isEmpty);
+      assert(_workList.isNotEmpty);
     }
   }
 
diff --git a/sdk/lib/convert/ascii.dart b/sdk/lib/convert/ascii.dart
index 0e07316..35105ac 100644
--- a/sdk/lib/convert/ascii.dart
+++ b/sdk/lib/convert/ascii.dart
@@ -4,58 +4,52 @@
 
 part of dart.convert;
 
-/**
- * An instance of the default implementation of the [AsciiCodec].
- *
- * This instance provides a convenient access to the most common ASCII
- * use cases.
- *
- * Examples:
- * ```dart
- * var encoded = ascii.encode("This is ASCII!");
- * var decoded = ascii.decode([0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
- *                             0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x21]);
- * ```
- */
-const AsciiCodec ascii = const AsciiCodec();
+/// An instance of the default implementation of the [AsciiCodec].
+///
+/// This instance provides a convenient access to the most common ASCII
+/// use cases.
+///
+/// Examples:
+/// ```dart
+/// var encoded = ascii.encode("This is ASCII!");
+/// var decoded = ascii.decode([0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
+///                             0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x21]);
+/// ```
+const AsciiCodec ascii = AsciiCodec();
 
 const int _asciiMask = 0x7F;
 
-/**
- * An [AsciiCodec] allows encoding strings as ASCII bytes
- * and decoding ASCII bytes to strings.
- */
+/// An [AsciiCodec] allows encoding strings as ASCII bytes
+/// and decoding ASCII bytes to strings.
 class AsciiCodec extends Encoding {
   final bool _allowInvalid;
-  /**
-   * Instantiates a new [AsciiCodec].
-   *
-   * If [allowInvalid] is true, the [decode] method and the converter
-   * returned by [decoder] will default to allowing invalid values.
-   * If allowing invalid values, the values will be decoded into the Unicode
-   * Replacement character (U+FFFD). If not, an exception will be thrown.
-   * Calls to the [decode] method can choose to override this default.
-   *
-   * Encoders will not accept invalid (non Latin-1) characters.
-   */
-  const AsciiCodec({bool allowInvalid: false}) : _allowInvalid = allowInvalid;
 
+  /// Instantiates a new [AsciiCodec].
+  ///
+  /// If [allowInvalid] is true, the [decode] method and the converter
+  /// returned by [decoder] will default to allowing invalid values.
+  /// If allowing invalid values, the values will be decoded into the Unicode
+  /// Replacement character (U+FFFD). If not, an exception will be thrown.
+  /// Calls to the [decode] method can choose to override this default.
+  ///
+  /// Encoders will not accept invalid (non ASCII) characters.
+  const AsciiCodec({bool allowInvalid = false}) : _allowInvalid = allowInvalid;
+
+  /// The name of this codec, "us-ascii".
   String get name => "us-ascii";
 
   Uint8List encode(String source) => encoder.convert(source);
 
-  /**
-   * Decodes the ASCII [bytes] (a list of unsigned 7-bit integers) to the
-   * corresponding string.
-   *
-   * If [bytes] contains values that are not in the range 0 .. 127, the decoder
-   * will eventually throw a [FormatException].
-   *
-   * If [allowInvalid] is not provided, it defaults to the value used to create
-   * this [AsciiCodec].
-   */
+  /// Decodes the ASCII [bytes] (a list of unsigned 7-bit integers) to the
+  /// corresponding string.
+  ///
+  /// If [bytes] contains values that are not in the range 0 .. 127, the decoder
+  /// will eventually throw a [FormatException].
+  ///
+  /// If [allowInvalid] is not provided, it defaults to the value used to create
+  /// this [AsciiCodec].
   String decode(List<int> bytes, {bool allowInvalid}) {
-    if (allowInvalid == null) allowInvalid = _allowInvalid;
+    allowInvalid ??= _allowInvalid;
     if (allowInvalid) {
       return const AsciiDecoder(allowInvalid: true).convert(bytes);
     } else {
@@ -77,56 +71,46 @@
 
   const _UnicodeSubsetEncoder(this._subsetMask);
 
-  /**
-   * Converts the [String] into a list of its code units.
-   *
-   * If [start] and [end] are provided, only the substring
-   * `string.substring(start, end)` is used as input to the conversion.
-   */
+  /// Converts the [String] into a list of its code units.
+  ///
+  /// If [start] and [end] are provided, only the substring
+  /// `string.substring(start, end)` is used as input to the conversion.
   Uint8List convert(String string, [int start = 0, int end]) {
-    int stringLength = string.length;
-    RangeError.checkValidRange(start, end, stringLength);
-    if (end == null) end = stringLength;
-    int length = end - start;
-    var result = new Uint8List(length);
-    for (int i = 0; i < length; i++) {
+    var stringLength = string.length;
+    end = RangeError.checkValidRange(start, end, stringLength);
+    var length = end - start;
+    var result = Uint8List(length);
+    for (var i = 0; i < length; i++) {
       var codeUnit = string.codeUnitAt(start + i);
       if ((codeUnit & ~_subsetMask) != 0) {
-        throw new ArgumentError("String contains invalid characters.");
+        throw ArgumentError.value(
+            string, "string", "Contains invalid characters.");
       }
       result[i] = codeUnit;
     }
     return result;
   }
 
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [ByteConversionSink].
-   */
+  /// Starts a chunked conversion.
+  ///
+  /// The converter works more efficiently if the given [sink] is a
+  /// [ByteConversionSink].
   StringConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    if (sink is! ByteConversionSink) {
-      sink = new ByteConversionSink.from(sink);
-    }
-    return new _UnicodeSubsetEncoderSink(_subsetMask, sink);
+    return _UnicodeSubsetEncoderSink(_subsetMask,
+        sink is ByteConversionSink ? sink : ByteConversionSink.from(sink));
   }
 
   // Override the base-class' bind, to provide a better type.
   Stream<List<int>> bind(Stream<String> stream) => super.bind(stream);
 }
 
-/**
- * This class converts strings of only ASCII characters to bytes.
- */
+/// This class converts strings of only ASCII characters to bytes.
 class AsciiEncoder extends _UnicodeSubsetEncoder {
   const AsciiEncoder() : super(_asciiMask);
 }
 
-/**
- * This class encodes chunked strings to bytes (unsigned 8-bit
- * integers).
- */
+/// This class encodes chunked strings to bytes (unsigned 8-bit
+/// integers).
 class _UnicodeSubsetEncoderSink extends StringConversionSinkBase {
   final ByteConversionSink _sink;
   final int _subsetMask;
@@ -139,10 +123,10 @@
 
   void addSlice(String source, int start, int end, bool isLast) {
     RangeError.checkValidRange(start, end, source.length);
-    for (int i = start; i < end; i++) {
-      int codeUnit = source.codeUnitAt(i);
+    for (var i = start; i < end; i++) {
+      var codeUnit = source.codeUnitAt(i);
       if ((codeUnit & ~_subsetMask) != 0) {
-        throw new ArgumentError(
+        throw ArgumentError(
             "Source contains invalid character with code point: $codeUnit.");
       }
     }
@@ -153,70 +137,62 @@
   }
 }
 
-/**
- * This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
- * to a string.
- */
+/// This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
+/// to a string.
 abstract class _UnicodeSubsetDecoder extends Converter<List<int>, String> {
   final bool _allowInvalid;
   final int _subsetMask;
 
-  /**
-   * Instantiates a new decoder.
-   *
-   * The [_allowInvalid] argument defines how [convert] deals
-   * with invalid bytes.
-   *
-   * The [_subsetMask] argument is a bit mask used to define the subset
-   * of Unicode being decoded. Use [_LATIN1_MASK] for Latin-1 (8-bit) or
-   * [_asciiMask] for ASCII (7-bit).
-   *
-   * If [_allowInvalid] is `true`, [convert] replaces invalid bytes with the
-   * Unicode Replacement character `U+FFFD` (�).
-   * Otherwise it throws a [FormatException].
-   */
+  /// Instantiates a new decoder.
+  ///
+  /// The [_allowInvalid] argument defines how [convert] deals
+  /// with invalid bytes.
+  ///
+  /// The [_subsetMask] argument is a bit mask used to define the subset
+  /// of Unicode being decoded. Use [_LATIN1_MASK] for Latin-1 (8-bit) or
+  /// [_asciiMask] for ASCII (7-bit).
+  ///
+  /// If [_allowInvalid] is `true`, [convert] replaces invalid bytes with the
+  /// Unicode Replacement character `U+FFFD` (�).
+  /// Otherwise it throws a [FormatException].
   const _UnicodeSubsetDecoder(this._allowInvalid, this._subsetMask);
 
-  /**
-   * Converts the [bytes] (a list of unsigned 7- or 8-bit integers) to the
-   * corresponding string.
-   *
-   * If [start] and [end] are provided, only the sub-list of bytes from
-   * `start` to `end` (`end` not inclusive) is used as input to the conversion.
-   */
+  /// Converts the [bytes] (a list of unsigned 7- or 8-bit integers) to the
+  /// corresponding string.
+  ///
+  /// If [start] and [end] are provided, only the sub-list of bytes from
+  /// `start` to `end` (`end` not inclusive) is used as input to the conversion.
   String convert(List<int> bytes, [int start = 0, int end]) {
-    int byteCount = bytes.length;
+    var byteCount = bytes.length;
     RangeError.checkValidRange(start, end, byteCount);
-    if (end == null) end = byteCount;
+    end ??= byteCount;
 
-    for (int i = start; i < end; i++) {
-      int byte = bytes[i];
+    for (var i = start; i < end; i++) {
+      var byte = bytes[i];
       if ((byte & ~_subsetMask) != 0) {
         if (!_allowInvalid) {
-          throw new FormatException("Invalid value in input: $byte");
+          throw FormatException("Invalid value in input: $byte");
         }
         return _convertInvalid(bytes, start, end);
       }
     }
-    return new String.fromCharCodes(bytes, start, end);
+    return String.fromCharCodes(bytes, start, end);
   }
 
   String _convertInvalid(List<int> bytes, int start, int end) {
-    StringBuffer buffer = new StringBuffer();
-    for (int i = start; i < end; i++) {
-      int value = bytes[i];
+    var buffer = StringBuffer();
+    for (var i = start; i < end; i++) {
+      var value = bytes[i];
       if ((value & ~_subsetMask) != 0) value = 0xFFFD;
       buffer.writeCharCode(value);
     }
     return buffer.toString();
   }
 
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   */
+  /// Starts a chunked conversion.
+  ///
+  /// The converter works more efficiently if the given [sink] is a
+  /// [StringConversionSink].
   ByteConversionSink startChunkedConversion(Sink<String> sink);
 
   // Override the base-class's bind, to provide a better type.
@@ -224,30 +200,28 @@
 }
 
 class AsciiDecoder extends _UnicodeSubsetDecoder {
-  const AsciiDecoder({bool allowInvalid: false})
+  const AsciiDecoder({bool allowInvalid = false})
       : super(allowInvalid, _asciiMask);
 
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   */
+  /// Starts a chunked conversion.
+  ///
+  /// The converter works more efficiently if the given [sink] is a
+  /// [StringConversionSink].
   ByteConversionSink startChunkedConversion(Sink<String> sink) {
     StringConversionSink stringSink;
     if (sink is StringConversionSink) {
       stringSink = sink;
     } else {
-      stringSink = new StringConversionSink.from(sink);
+      stringSink = StringConversionSink.from(sink);
     }
     // TODO(lrn): Use asUtf16Sink when it becomes available. It
     // works just as well, is likely to have less decoding overhead,
     // and make adding U+FFFD easier.
     // At that time, merge this with _Latin1DecoderSink;
     if (_allowInvalid) {
-      return new _ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false));
+      return _ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false));
     } else {
-      return new _SimpleAsciiDecoderSink(stringSink);
+      return _SimpleAsciiDecoderSink(stringSink);
     }
   }
 }
@@ -266,7 +240,7 @@
 
   void addSlice(List<int> source, int start, int end, bool isLast) {
     RangeError.checkValidRange(start, end, source.length);
-    for (int i = start; i < end; i++) {
+    for (var i = start; i < end; i++) {
       if ((source[i] & ~_asciiMask) != 0) {
         if (i > start) _utf8Sink.addSlice(source, start, i, false);
         // Add UTF-8 encoding of U+FFFD.
@@ -291,16 +265,16 @@
   }
 
   void add(List<int> source) {
-    for (int i = 0; i < source.length; i++) {
+    for (var i = 0; i < source.length; i++) {
       if ((source[i] & ~_asciiMask) != 0) {
-        throw new FormatException("Source contains non-ASCII bytes.");
+        throw FormatException("Source contains non-ASCII bytes.");
       }
     }
-    _sink.add(new String.fromCharCodes(source));
+    _sink.add(String.fromCharCodes(source));
   }
 
   void addSlice(List<int> source, int start, int end, bool isLast) {
-    final int length = source.length;
+    final length = source.length;
     RangeError.checkValidRange(start, end, length);
     if (start < end) {
       if (start != 0 || end != length) {
diff --git a/sdk/lib/convert/base64.dart b/sdk/lib/convert/base64.dart
index a523669..1b31387 100644
--- a/sdk/lib/convert/base64.dart
+++ b/sdk/lib/convert/base64.dart
@@ -4,72 +4,60 @@
 
 part of dart.convert;
 
-/**
- * A [base64](https://tools.ietf.org/html/rfc4648) encoder and decoder.
- *
- * It encodes using the default base64 alphabet,
- * decodes using both the base64 and base64url alphabets,
- * does not allow invalid characters and requires padding.
- *
- * Examples:
- *
- *     var encoded = base64.encode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
- *                                  0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
- *     var decoded = base64.decode("YmzDpWLDpnJncsO4ZAo=");
- */
-const Base64Codec base64 = const Base64Codec();
+/// A [base64](https://tools.ietf.org/html/rfc4648) encoder and decoder.
+///
+/// It encodes using the default base64 alphabet,
+/// decodes using both the base64 and base64url alphabets,
+/// does not allow invalid characters and requires padding.
+///
+/// Examples:
+///
+///     var encoded = base64.encode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
+///                                  0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
+///     var decoded = base64.decode("YmzDpWLDpnJncsO4ZAo=");
+const Base64Codec base64 = Base64Codec();
 
-/**
- * A [base64url](https://tools.ietf.org/html/rfc4648) encoder and decoder.
- *
- * It encodes and decodes using the base64url alphabet,
- * decodes using both the base64 and base64url alphabets,
- * does not allow invalid characters and requires padding.
- *
- * Examples:
- *
- *     var encoded = base64Url.encode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
- *                                     0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
- *     var decoded = base64Url.decode("YmzDpWLDpnJncsO4ZAo=");
- */
-const Base64Codec base64Url = const Base64Codec.urlSafe();
+/// A [base64url](https://tools.ietf.org/html/rfc4648) encoder and decoder.
+///
+/// It encodes and decodes using the base64url alphabet,
+/// decodes using both the base64 and base64url alphabets,
+/// does not allow invalid characters and requires padding.
+///
+/// Examples:
+///
+///     var encoded = base64Url.encode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
+///                                     0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
+///     var decoded = base64Url.decode("YmzDpWLDpnJncsO4ZAo=");
+const Base64Codec base64Url = Base64Codec.urlSafe();
 
-/**
- * Encodes [bytes] using [base64](https://tools.ietf.org/html/rfc4648) encoding.
- *
- * Shorthand for [base64.encode].
- */
+/// Encodes [bytes] using [base64](https://tools.ietf.org/html/rfc4648) encoding.
+///
+/// Shorthand for [base64.encode].
 String base64Encode(List<int> bytes) => base64.encode(bytes);
 
-/**
- * Encodes [bytes] using [base64url](https://tools.ietf.org/html/rfc4648) encoding.
- *
- * Shorthand for [base64url.encode].
- */
+/// Encodes [bytes] using [base64url](https://tools.ietf.org/html/rfc4648) encoding.
+///
+/// Shorthand for [base64url.encode].
 String base64UrlEncode(List<int> bytes) => base64Url.encode(bytes);
 
-/**
- * Decodes [base64](https://tools.ietf.org/html/rfc4648) or [base64url](https://tools.ietf.org/html/rfc4648) encoded bytes.
- *
- * Shorthand for [base64.decode].
- */
+/// Decodes [base64](https://tools.ietf.org/html/rfc4648) or [base64url](https://tools.ietf.org/html/rfc4648) encoded bytes.
+///
+/// Shorthand for [base64.decode].
 Uint8List base64Decode(String source) => base64.decode(source);
 
 // Constants used in more than one class.
 const int _paddingChar = 0x3d; // '='.
 
-/**
- * A [base64](https://tools.ietf.org/html/rfc4648) encoder and decoder.
- *
- * A [Base64Codec] allows base64 encoding bytes into ASCII strings and
- * decoding valid encodings back to bytes.
- *
- * This implementation only handles the simplest RFC 4648 base64 and base64url
- * encodings.
- * It does not allow invalid characters when decoding and it requires,
- * and generates, padding so that the input is always a multiple of four
- * characters.
- */
+/// A [base64](https://tools.ietf.org/html/rfc4648) encoder and decoder.
+///
+/// A [Base64Codec] allows base64 encoding bytes into ASCII strings and
+/// decoding valid encodings back to bytes.
+///
+/// This implementation only handles the simplest RFC 4648 base64 and base64url
+/// encodings.
+/// It does not allow invalid characters when decoding and it requires,
+/// and generates, padding so that the input is always a multiple of four
+/// characters.
 class Base64Codec extends Codec<List<int>, String> {
   final Base64Encoder _encoder;
   const Base64Codec() : _encoder = const Base64Encoder();
@@ -79,46 +67,42 @@
 
   Base64Decoder get decoder => const Base64Decoder();
 
-  /**
-   * Decodes [encoded].
-   *
-   * The input is decoded as if by `decoder.convert`.
-   *
-   * The returned [Uint8List] contains exactly the decoded bytes,
-   * so the [Uint8List.length] is precisely the number of decoded bytes.
-   * The [Uint8List.buffer] may be larger than the decoded bytes.
-   */
+  /// Decodes [encoded].
+  ///
+  /// The input is decoded as if by `decoder.convert`.
+  ///
+  /// The returned [Uint8List] contains exactly the decoded bytes,
+  /// so the [Uint8List.length] is precisely the number of decoded bytes.
+  /// The [Uint8List.buffer] may be larger than the decoded bytes.
   Uint8List decode(String encoded) => decoder.convert(encoded);
 
-  /**
-   * Validates and normalizes the base64 encoded data in [source].
-   *
-   * Only acts on the substring from [start] to [end], with [end]
-   * defaulting to the end of the string.
-   *
-   * Normalization will:
-   * * Unescape any `%`-escapes.
-   * * Only allow valid characters (`A`-`Z`, `a`-`z`, `0`-`9`, `/` and `+`).
-   * * Normalize a `_` or `-` character to `/` or `+`.
-   * * Validate that existing padding (trailing `=` characters) is correct.
-   * * If no padding exists, add correct padding if necessary and possible.
-   * * Validate that the length is correct (a multiple of four).
-   */
+  /// Validates and normalizes the base64 encoded data in [source].
+  ///
+  /// Only acts on the substring from [start] to [end], with [end]
+  /// defaulting to the end of the string.
+  ///
+  /// Normalization will:
+  /// * Unescape any `%`-escapes.
+  /// * Only allow valid characters (`A`-`Z`, `a`-`z`, `0`-`9`, `/` and `+`).
+  /// * Normalize a `_` or `-` character to `/` or `+`.
+  /// * Validate that existing padding (trailing `=` characters) is correct.
+  /// * If no padding exists, add correct padding if necessary and possible.
+  /// * Validate that the length is correct (a multiple of four).
   String normalize(String source, [int start = 0, int end]) {
     end = RangeError.checkValidRange(start, end, source.length);
-    const int percent = 0x25;
-    const int equals = 0x3d;
-    StringBuffer buffer = null;
-    int sliceStart = start;
+    const percent = 0x25;
+    const equals = 0x3d;
+    StringBuffer buffer;
+    var sliceStart = start;
     var alphabet = _Base64Encoder._base64Alphabet;
     var inverseAlphabet = _Base64Decoder._inverseAlphabet;
-    int firstPadding = -1;
-    int firstPaddingSourceIndex = -1;
-    int paddingCount = 0;
-    for (int i = start; i < end;) {
-      int sliceEnd = i;
-      int char = source.codeUnitAt(i++);
-      int originalChar = char;
+    var firstPadding = -1;
+    var firstPaddingSourceIndex = -1;
+    var paddingCount = 0;
+    for (var i = start; i < end;) {
+      var sliceEnd = i;
+      var char = source.codeUnitAt(i++);
+      var originalChar = char;
       // Normalize char, keep originalChar to see if it matches the source.
       if (char == percent) {
         if (i + 2 <= end) {
@@ -135,7 +119,7 @@
       }
       // If char is negative here, hex-decoding failed in some way.
       if (0 <= char && char <= 127) {
-        int value = inverseAlphabet[char];
+        var value = inverseAlphabet[char];
         if (value >= 0) {
           char = alphabet.codeUnitAt(value);
           if (char == originalChar) continue;
@@ -151,14 +135,14 @@
           if (originalChar == equals) continue;
         }
         if (value != _Base64Decoder._invalid) {
-          buffer ??= new StringBuffer();
+          buffer ??= StringBuffer();
           buffer.write(source.substring(sliceStart, sliceEnd));
           buffer.writeCharCode(char);
           sliceStart = i;
           continue;
         }
       }
-      throw new FormatException("Invalid base64 data", source, sliceEnd);
+      throw FormatException("Invalid base64 data", source, sliceEnd);
     }
     if (buffer != null) {
       buffer.write(source.substring(sliceStart, end));
@@ -170,11 +154,10 @@
             paddingCount, buffer.length);
       } else {
         // Length of last chunk (1-4 chars) in the encoding.
-        int endLength = ((buffer.length - 1) % 4) + 1;
+        var endLength = ((buffer.length - 1) % 4) + 1;
         if (endLength == 1) {
           // The data must have length 0, 2 or 3 modulo 4.
-          throw new FormatException(
-              "Invalid base64 encoding length ", source, end);
+          throw FormatException("Invalid base64 encoding length ", source, end);
         }
         while (endLength < 4) {
           buffer.write("=");
@@ -184,17 +167,16 @@
       return source.replaceRange(start, end, buffer.toString());
     }
     // Original was already normalized, only check padding.
-    int length = end - start;
+    var length = end - start;
     if (firstPadding >= 0) {
       _checkPadding(source, firstPaddingSourceIndex, end, firstPadding,
           paddingCount, length);
     } else {
       // No padding given, so add some if needed it.
-      int endLength = length % 4;
+      var endLength = length % 4;
       if (endLength == 1) {
         // The data must have length 0, 2 or 3 modulo 4.
-        throw new FormatException(
-            "Invalid base64 encoding length ", source, end);
+        throw FormatException("Invalid base64 encoding length ", source, end);
       }
       if (endLength > 1) {
         // There is no "insertAt" on String, but this works as well.
@@ -207,18 +189,18 @@
   static void _checkPadding(String source, int sourceIndex, int sourceEnd,
       int firstPadding, int paddingCount, int length) {
     if (length % 4 != 0) {
-      throw new FormatException(
+      throw FormatException(
           "Invalid base64 padding, padded length must be multiple of four, "
           "is $length",
           source,
           sourceEnd);
     }
     if (firstPadding + paddingCount != length) {
-      throw new FormatException(
+      throw FormatException(
           "Invalid base64 padding, '=' not at the end", source, sourceIndex);
     }
     if (paddingCount > 2) {
-      throw new FormatException(
+      throw FormatException(
           "Invalid base64 padding, more than two '=' characters",
           source,
           sourceIndex);
@@ -230,13 +212,11 @@
 // Encoder
 // ------------------------------------------------------------------------
 
-/**
- * Base64 and base64url encoding converter.
- *
- * Encodes lists of bytes using base64 or base64url encoding.
- *
- * The results are ASCII strings using a restricted alphabet.
- */
+/// Base64 and base64url encoding converter.
+///
+/// Encodes lists of bytes using base64 or base64url encoding.
+///
+/// The results are ASCII strings using a restricted alphabet.
 class Base64Encoder extends Converter<List<int>, String> {
   final bool _urlSafe;
 
@@ -245,95 +225,87 @@
 
   String convert(List<int> input) {
     if (input.isEmpty) return "";
-    var encoder = new _Base64Encoder(_urlSafe);
-    Uint8List buffer = encoder.encode(input, 0, input.length, true);
-    return new String.fromCharCodes(buffer);
+    var encoder = _Base64Encoder(_urlSafe);
+    var buffer = encoder.encode(input, 0, input.length, true);
+    return String.fromCharCodes(buffer);
   }
 
   ByteConversionSink startChunkedConversion(Sink<String> sink) {
     if (sink is StringConversionSink) {
-      return new _Utf8Base64EncoderSink(sink.asUtf8Sink(false), _urlSafe);
+      return _Utf8Base64EncoderSink(sink.asUtf8Sink(false), _urlSafe);
     }
-    return new _AsciiBase64EncoderSink(sink, _urlSafe);
+    return _AsciiBase64EncoderSink(sink, _urlSafe);
   }
 }
 
-/**
- * Helper class for encoding bytes to base64.
- */
+/// Helper class for encoding bytes to base64.
 class _Base64Encoder {
-  /** The RFC 4648 base64 encoding alphabet. */
+  /// The RFC 4648 base64 encoding alphabet.
   static const String _base64Alphabet =
       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
-  /** The RFC 4648 base64url encoding alphabet. */
+  /// The RFC 4648 base64url encoding alphabet.
   static const String _base64UrlAlphabet =
       "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
 
-  /** Shift-count to extract the values stored in [_state]. */
+  /// Shift-count to extract the values stored in [_state].
   static const int _valueShift = 2;
 
-  /** Mask to extract the count value stored in [_state]. */
+  /// Mask to extract the count value stored in [_state].
   static const int _countMask = 3;
 
   static const int _sixBitMask = 0x3F;
 
-  /**
-   * Intermediate state between chunks.
-   *
-   * Encoding handles three bytes at a time.
-   * If fewer than three bytes has been seen, this value encodes
-   * the number of bytes seen (0, 1 or 2) and their values.
-   */
+  /// Intermediate state between chunks.
+  ///
+  /// Encoding handles three bytes at a time.
+  /// If fewer than three bytes has been seen, this value encodes
+  /// the number of bytes seen (0, 1 or 2) and their values.
   int _state = 0;
 
-  /** Alphabet used for encoding. */
+  /// Alphabet used for encoding.
   final String _alphabet;
 
   _Base64Encoder(bool urlSafe)
       : _alphabet = urlSafe ? _base64UrlAlphabet : _base64Alphabet;
 
-  /** Encode count and bits into a value to be stored in [_state]. */
+  /// Encode count and bits into a value to be stored in [_state].
   static int _encodeState(int count, int bits) {
     assert(count <= _countMask);
     return bits << _valueShift | count;
   }
 
-  /** Extract bits from encoded state. */
+  /// Extract bits from encoded state.
   static int _stateBits(int state) => state >> _valueShift;
 
-  /** Extract count from encoded state. */
+  /// Extract count from encoded state.
   static int _stateCount(int state) => state & _countMask;
 
-  /**
-   * Create a [Uint8List] with the provided length.
-   */
-  Uint8List createBuffer(int bufferLength) => new Uint8List(bufferLength);
+  /// Create a [Uint8List] with the provided length.
+  Uint8List createBuffer(int bufferLength) => Uint8List(bufferLength);
 
-  /**
-   * Encode [bytes] from [start] to [end] and the bits in [_state].
-   *
-   * Returns a [Uint8List] of the ASCII codes of the encoded data.
-   *
-   * If the input, including left over [_state] from earlier encodings,
-   * are not a multiple of three bytes, then the partial state is stored
-   * back into [_state].
-   * If [isLast] is true, partial state is encoded in the output instead,
-   * with the necessary padding.
-   *
-   * Returns `null` if there is no output.
-   */
+  /// Encode [bytes] from [start] to [end] and the bits in [_state].
+  ///
+  /// Returns a [Uint8List] of the ASCII codes of the encoded data.
+  ///
+  /// If the input, including left over [_state] from earlier encodings,
+  /// are not a multiple of three bytes, then the partial state is stored
+  /// back into [_state].
+  /// If [isLast] is true, partial state is encoded in the output instead,
+  /// with the necessary padding.
+  ///
+  /// Returns `null` if there is no output.
   Uint8List encode(List<int> bytes, int start, int end, bool isLast) {
     assert(0 <= start);
     assert(start <= end);
     assert(bytes == null || end <= bytes.length);
-    int length = end - start;
+    var length = end - start;
 
-    int count = _stateCount(_state);
-    int byteCount = (count + length);
-    int fullChunks = byteCount ~/ 3;
-    int partialChunkLength = byteCount - fullChunks * 3;
-    int bufferLength = fullChunks * 4;
+    var count = _stateCount(_state);
+    var byteCount = (count + length);
+    var fullChunks = byteCount ~/ 3;
+    var partialChunkLength = byteCount - fullChunks * 3;
+    var bufferLength = fullChunks * 4;
     if (isLast && partialChunkLength > 0) {
       bufferLength += 4; // Room for padding.
     }
@@ -348,16 +320,16 @@
 
   static int encodeChunk(String alphabet, List<int> bytes, int start, int end,
       bool isLast, Uint8List output, int outputIndex, int state) {
-    int bits = _stateBits(state);
+    var bits = _stateBits(state);
     // Count number of missing bytes in three-byte chunk.
-    int expectedChars = 3 - _stateCount(state);
+    var expectedChars = 3 - _stateCount(state);
 
     // The input must be a list of bytes (integers in the range 0..255).
     // The value of `byteOr` will be the bitwise or of all the values in
     // `bytes` and a later check will validate that they were all valid bytes.
-    int byteOr = 0;
-    for (int i = start; i < end; i++) {
-      int byte = bytes[i];
+    var byteOr = 0;
+    for (var i = start; i < end; i++) {
+      var byte = bytes[i];
       byteOr |= byte;
       bits = ((bits << 8) | byte) & 0xFFFFFF; // Never store more than 24 bits.
       expectedChars--;
@@ -379,22 +351,20 @@
     }
 
     // There was an invalid byte value somewhere in the input - find it!
-    int i = start;
+    var i = start;
     while (i < end) {
-      int byte = bytes[i];
+      var byte = bytes[i];
       if (byte < 0 || byte > 255) break;
       i++;
     }
-    throw new ArgumentError.value(
+    throw ArgumentError.value(
         bytes, "Not a byte value at index $i: 0x${bytes[i].toRadixString(16)}");
   }
 
-  /**
-   * Writes a final encoded four-character chunk.
-   *
-   * Only used when the [_state] contains a partial (1 or 2 byte)
-   * input.
-   */
+  /// Writes a final encoded four-character chunk.
+  ///
+  /// Only used when the [_state] contains a partial (1 or 2 byte)
+  /// input.
   static void writeFinalChunk(
       String alphabet, Uint8List output, int outputIndex, int count, int bits) {
     assert(count > 0);
@@ -414,22 +384,20 @@
 }
 
 class _BufferCachingBase64Encoder extends _Base64Encoder {
-  /**
-   * Reused buffer.
-   *
-   * When the buffer isn't released to the sink, only used to create another
-   * value (a string), the buffer can be reused between chunks.
-   */
+  /// Reused buffer.
+  ///
+  /// When the buffer isn't released to the sink, only used to create another
+  /// value (a string), the buffer can be reused between chunks.
   Uint8List bufferCache;
 
   _BufferCachingBase64Encoder(bool urlSafe) : super(urlSafe);
 
   Uint8List createBuffer(int bufferLength) {
     if (bufferCache == null || bufferCache.length < bufferLength) {
-      bufferCache = new Uint8List(bufferLength);
+      bufferCache = Uint8List(bufferLength);
     }
     // Return a view of the buffer, so it has the requested length.
-    return new Uint8List.view(bufferCache.buffer, 0, bufferLength);
+    return Uint8List.view(bufferCache.buffer, 0, bufferLength);
   }
 }
 
@@ -443,7 +411,7 @@
   }
 
   void addSlice(List<int> source, int start, int end, bool isLast) {
-    if (end == null) throw new ArgumentError.notNull("end");
+    if (end == null) throw ArgumentError.notNull("end");
     RangeError.checkValidRange(start, end, source.length);
     _add(source, start, end, isLast);
   }
@@ -456,12 +424,12 @@
   final _Base64Encoder _encoder;
 
   _AsciiBase64EncoderSink(this._sink, bool urlSafe)
-      : _encoder = new _BufferCachingBase64Encoder(urlSafe);
+      : _encoder = _BufferCachingBase64Encoder(urlSafe);
 
   void _add(List<int> source, int start, int end, bool isLast) {
-    Uint8List buffer = _encoder.encode(source, start, end, isLast);
+    var buffer = _encoder.encode(source, start, end, isLast);
     if (buffer != null) {
-      String string = new String.fromCharCodes(buffer);
+      var string = String.fromCharCodes(buffer);
       _sink.add(string);
     }
     if (isLast) {
@@ -475,10 +443,10 @@
   final _Base64Encoder _encoder;
 
   _Utf8Base64EncoderSink(this._sink, bool urlSafe)
-      : _encoder = new _Base64Encoder(urlSafe);
+      : _encoder = _Base64Encoder(urlSafe);
 
   void _add(List<int> source, int start, int end, bool isLast) {
-    Uint8List buffer = _encoder.encode(source, start, end, isLast);
+    var buffer = _encoder.encode(source, start, end, isLast);
     if (buffer != null) {
       _sink.addSlice(buffer, 0, buffer.length, isLast);
     }
@@ -489,72 +457,64 @@
 // Decoder
 // ------------------------------------------------------------------------
 
-/**
- * Decoder for base64 encoded data.
- *
- * This decoder accepts both base64 and base64url ("url-safe") encodings.
- *
- * The encoding is required to be properly padded.
- */
+/// Decoder for base64 encoded data.
+///
+/// This decoder accepts both base64 and base64url ("url-safe") encodings.
+///
+/// The encoding is required to be properly padded.
 class Base64Decoder extends Converter<String, List<int>> {
   const Base64Decoder();
 
-  /**
-   * Decodes the characters of [input] from [start] to [end] as base64.
-   *
-   * If [start] is omitted, it defaults to the start of [input].
-   * If [end] is omitted, it defaults to the end of [input].
-   *
-   * The returned [Uint8List] contains exactly the decoded bytes,
-   * so the [Uint8List.length] is precisely the number of decoded bytes.
-   * The [Uint8List.buffer] may be larger than the decoded bytes.
-   */
+  /// Decodes the characters of [input] from [start] to [end] as base64.
+  ///
+  /// If [start] is omitted, it defaults to the start of [input].
+  /// If [end] is omitted, it defaults to the end of [input].
+  ///
+  /// The returned [Uint8List] contains exactly the decoded bytes,
+  /// so the [Uint8List.length] is precisely the number of decoded bytes.
+  /// The [Uint8List.buffer] may be larger than the decoded bytes.
   Uint8List convert(String input, [int start = 0, int end]) {
     end = RangeError.checkValidRange(start, end, input.length);
-    if (start == end) return new Uint8List(0);
-    var decoder = new _Base64Decoder();
-    Uint8List buffer = decoder.decode(input, start, end);
+    if (start == end) return Uint8List(0);
+    var decoder = _Base64Decoder();
+    var buffer = decoder.decode(input, start, end);
     decoder.close(input, end);
     return buffer;
   }
 
   StringConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    return new _Base64DecoderSink(sink);
+    return _Base64DecoderSink(sink);
   }
 }
 
-/**
- * Helper class implementing base64 decoding with intermediate state.
- */
+/// Helper class implementing base64 decoding with intermediate state.
 class _Base64Decoder {
-  /** Shift-count to extract the values stored in [_state]. */
+  /// Shift-count to extract the values stored in [_state].
   static const int _valueShift = 2;
 
-  /** Mask to extract the count value stored in [_state]. */
+  /// Mask to extract the count value stored in [_state].
   static const int _countMask = 3;
 
-  /** Invalid character in decoding table. */
+  /// Invalid character in decoding table.
   static const int _invalid = -2;
 
-  /** Padding character in decoding table. */
+  /// Padding character in decoding table.
   static const int _padding = -1;
 
   // Shorthands to make the table more readable.
   static const int __ = _invalid;
   static const int _p = _padding;
 
-  /**
-   * Mapping from ASCII characters to their index in the base64 alphabet.
-   *
-   * Uses [_invalid] for invalid indices and [_padding] for the padding
-   * character.
-   *
-   * Accepts the "URL-safe" alphabet as well (`-` and `_` are the
-   * 62nd and 63rd alphabet characters), and considers `%` a padding
-   * character, which must then be followed by `3D`, the percent-escape
-   * for `=`.
-   */
-  static final List<int> _inverseAlphabet = new Int8List.fromList([
+  /// Mapping from ASCII characters to their index in the base64 alphabet.
+  ///
+  /// Uses [_invalid] for invalid indices and [_padding] for the padding
+  /// character.
+  ///
+  /// Accepts the "URL-safe" alphabet as well (`-` and `_` are the
+  /// 62nd and 63rd alphabet characters), and considers `%` a padding
+  /// character, which must then be followed by `3D`, the percent-escape
+  /// for `=`.
+  static final List<int> _inverseAlphabet = Int8List.fromList([
     __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, //
     __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, //
     __, __, __, __, __, _p, __, __, __, __, __, 62, __, 62, __, 63, //
@@ -570,63 +530,51 @@
   static const int _char_3 = 0x33; // '3'.
   static const int _char_d = 0x64; // 'd'.
 
-  /**
-   * Maintains the intermediate state of a partly-decoded input.
-   *
-   * Base64 is decoded in chunks of four characters. If a chunk does not
-   * contain a full block, the decoded bits (six per character) of the
-   * available characters are stored in [_state] until the next call to
-   * [_decode] or [_close].
-   *
-   * If no padding has been seen, the value is
-   *   `numberOfCharactersSeen | (decodedBits << 2)`
-   * where `numberOfCharactersSeen` is between 0 and 3 and decoded bits
-   * contains six bits per seen character.
-   *
-   * If padding has been seen the value is negative. It's the bitwise negation
-   * of the number of remaining allowed padding characters (always ~0 or ~1).
-   *
-   * A state of `0` or `~0` are valid places to end decoding, all other values
-   * mean that a four-character block has not been completed.
-   */
+  /// Maintains the intermediate state of a partly-decoded input.
+  ///
+  /// Base64 is decoded in chunks of four characters. If a chunk does not
+  /// contain a full block, the decoded bits (six per character) of the
+  /// available characters are stored in [_state] until the next call to
+  /// [_decode] or [_close].
+  ///
+  /// If no padding has been seen, the value is
+  ///   `numberOfCharactersSeen | (decodedBits << 2)`
+  /// where `numberOfCharactersSeen` is between 0 and 3 and decoded bits
+  /// contains six bits per seen character.
+  ///
+  /// If padding has been seen the value is negative. It's the bitwise negation
+  /// of the number of remaining allowed padding characters (always ~0 or ~1).
+  ///
+  /// A state of `0` or `~0` are valid places to end decoding, all other values
+  /// mean that a four-character block has not been completed.
   int _state = 0;
 
-  /**
-   * Encodes [count] and [bits] as a value to be stored in [_state].
-   */
+  /// Encodes [count] and [bits] as a value to be stored in [_state].
   static int _encodeCharacterState(int count, int bits) {
     assert(count == (count & _countMask));
     return (bits << _valueShift | count);
   }
 
-  /**
-   * Extracts count from a [_state] value.
-   */
+  /// Extracts count from a [_state] value.
   static int _stateCount(int state) {
     assert(state >= 0);
     return state & _countMask;
   }
 
-  /**
-   * Extracts value bits from a [_state] value.
-   */
+  /// Extracts value bits from a [_state] value.
   static int _stateBits(int state) {
     assert(state >= 0);
     return state >> _valueShift;
   }
 
-  /**
-   * Encodes a number of expected padding characters to be stored in [_state].
-   */
+  /// Encodes a number of expected padding characters to be stored in [_state].
   static int _encodePaddingState(int expectedPadding) {
     assert(expectedPadding >= 0);
     assert(expectedPadding <= 5);
     return -expectedPadding - 1; // ~expectedPadding adapted to dart2js.
   }
 
-  /**
-   * Extracts expected padding character count from a [_state] value.
-   */
+  /// Extracts expected padding character count from a [_state] value.
   static int _statePadding(int state) {
     assert(state < 0);
     return -state - 1; // ~state adapted to dart2js.
@@ -634,13 +582,11 @@
 
   static bool _hasSeenPadding(int state) => state < 0;
 
-  /**
-   * Decodes [input] from [start] to [end].
-   *
-   * Returns a [Uint8List] with the decoded bytes.
-   * If a previous call had an incomplete four-character block, the bits from
-   * those are included in decoding
-   */
+  /// Decodes [input] from [start] to [end].
+  ///
+  /// Returns a [Uint8List] with the decoded bytes.
+  /// If a previous call had an incomplete four-character block, the bits from
+  /// those are included in decoding
   Uint8List decode(String input, int start, int end) {
     assert(0 <= start);
     assert(start <= end);
@@ -649,50 +595,48 @@
       _state = _checkPadding(input, start, end, _state);
       return null;
     }
-    if (start == end) return new Uint8List(0);
-    Uint8List buffer = _allocateBuffer(input, start, end, _state);
+    if (start == end) return Uint8List(0);
+    var buffer = _allocateBuffer(input, start, end, _state);
     _state = decodeChunk(input, start, end, buffer, 0, _state);
     return buffer;
   }
 
-  /** Checks that [_state] represents a valid decoding. */
+  /// Checks that [_state] represents a valid decoding.
   void close(String input, int end) {
     if (_state < _encodePaddingState(0)) {
-      throw new FormatException("Missing padding character", input, end);
+      throw FormatException("Missing padding character", input, end);
     }
     if (_state > 0) {
-      throw new FormatException(
+      throw FormatException(
           "Invalid length, must be multiple of four", input, end);
     }
     _state = _encodePaddingState(0);
   }
 
-  /**
-   * Decodes [input] from [start] to [end].
-   *
-   * Includes the state returned by a previous call in the decoding.
-   * Writes the decoding to [output] at [outIndex], and there must
-   * be room in the output.
-   */
+  /// Decodes [input] from [start] to [end].
+  ///
+  /// Includes the state returned by a previous call in the decoding.
+  /// Writes the decoding to [output] at [outIndex], and there must
+  /// be room in the output.
   static int decodeChunk(String input, int start, int end, Uint8List output,
       int outIndex, int state) {
     assert(!_hasSeenPadding(state));
-    const int asciiMask = 127;
-    const int asciiMax = 127;
-    const int eightBitMask = 0xFF;
-    const int bitsPerCharacter = 6;
+    const asciiMask = 127;
+    const asciiMax = 127;
+    const eightBitMask = 0xFF;
+    const bitsPerCharacter = 6;
 
-    int bits = _stateBits(state);
-    int count = _stateCount(state);
+    var bits = _stateBits(state);
+    var count = _stateCount(state);
     // String contents should be all ASCII.
     // Instead of checking for each character, we collect the bitwise-or of
     // all the characters in `charOr` and later validate that all characters
     // were ASCII.
-    int charOr = 0;
-    for (int i = start; i < end; i++) {
+    var charOr = 0;
+    for (var i = start; i < end; i++) {
       var char = input.codeUnitAt(i);
       charOr |= char;
-      int code = _inverseAlphabet[char & asciiMask];
+      var code = _inverseAlphabet[char & asciiMask];
       if (code >= 0) {
         bits = ((bits << bitsPerCharacter) | code) & 0xFFFFFF;
         count = (count + 1) & 3;
@@ -708,15 +652,13 @@
         if (charOr < 0 || charOr > asciiMax) break;
         if (count == 3) {
           if ((bits & 0x03) != 0) {
-            throw new FormatException(
-                "Invalid encoding before padding", input, i);
+            throw FormatException("Invalid encoding before padding", input, i);
           }
           output[outIndex++] = bits >> 10;
           output[outIndex++] = bits >> 2;
         } else {
           if ((bits & 0x0F) != 0) {
-            throw new FormatException(
-                "Invalid encoding before padding", input, i);
+            throw FormatException("Invalid encoding before padding", input, i);
           }
           output[outIndex++] = bits >> 4;
         }
@@ -725,12 +667,12 @@
         //
         // Expect either zero or one padding depending on count (2 or 3),
         // plus two more characters if the code was `%` (a partial padding).
-        int expectedPadding = (3 - count) * 3;
+        var expectedPadding = (3 - count) * 3;
         if (char == _char_percent) expectedPadding += 2;
         state = _encodePaddingState(expectedPadding);
         return _checkPadding(input, i + 1, end, state);
       }
-      throw new FormatException("Invalid character", input, i);
+      throw FormatException("Invalid character", input, i);
     }
     if (charOr >= 0 && charOr <= asciiMax) {
       return _encodeCharacterState(count, bits);
@@ -738,58 +680,54 @@
     // There is an invalid (non-ASCII) character in the input.
     int i;
     for (i = start; i < end; i++) {
-      int char = input.codeUnitAt(i);
+      var char = input.codeUnitAt(i);
       if (char < 0 || char > asciiMax) break;
     }
-    throw new FormatException("Invalid character", input, i);
+    throw FormatException("Invalid character", input, i);
   }
 
-  /**
-   * Allocates a buffer with room for the decoding of a substring of [input].
-   *
-   * Includes room for the characters in [state], and handles padding correctly.
-   */
+  /// Allocates a buffer with room for the decoding of a substring of [input].
+  ///
+  /// Includes room for the characters in [state], and handles padding correctly.
   static Uint8List _allocateBuffer(
       String input, int start, int end, int state) {
     assert(state >= 0);
-    int paddingStart = _trimPaddingChars(input, start, end);
-    int length = _stateCount(state) + (paddingStart - start);
+    var paddingStart = _trimPaddingChars(input, start, end);
+    var length = _stateCount(state) + (paddingStart - start);
     // Three bytes per full four bytes in the input.
-    int bufferLength = (length >> 2) * 3;
+    var bufferLength = (length >> 2) * 3;
     // If padding was seen, then this is the last chunk, and the final partial
     // chunk should be decoded too.
-    int remainderLength = length & 3;
+    var remainderLength = length & 3;
     if (remainderLength != 0 && paddingStart < end) {
       bufferLength += remainderLength - 1;
     }
-    if (bufferLength > 0) return new Uint8List(bufferLength);
+    if (bufferLength > 0) return Uint8List(bufferLength);
     // If the input plus state is less than four characters, and it's not
     // at the end of input, no buffer is needed.
     return null;
   }
 
-  /**
-   * Returns the position of the start of padding at the end of the input.
-   *
-   * Returns the end of input if there is no padding.
-   *
-   * This is used to ensure that the decoding buffer has the exact size
-   * it needs when input is valid, and at least enough bytes to reach the error
-   * when input is invalid.
-   *
-   * Never count more than two padding sequences since any more than that
-   * will raise an error anyway, and we only care about being precise for
-   * successful conversions.
-   */
+  /// Returns the position of the start of padding at the end of the input.
+  ///
+  /// Returns the end of input if there is no padding.
+  ///
+  /// This is used to ensure that the decoding buffer has the exact size
+  /// it needs when input is valid, and at least enough bytes to reach the error
+  /// when input is invalid.
+  ///
+  /// Never count more than two padding sequences since any more than that
+  /// will raise an error anyway, and we only care about being precise for
+  /// successful conversions.
   static int _trimPaddingChars(String input, int start, int end) {
     // This may count '%=' as two paddings. That's ok, it will err later,
     // but the buffer will be large enough to reach the error.
-    int padding = 0;
-    int index = end;
-    int newEnd = end;
+    var padding = 0;
+    var index = end;
+    var newEnd = end;
     while (index > start && padding < 2) {
       index--;
-      int char = input.codeUnitAt(index);
+      var char = input.codeUnitAt(index);
       if (char == _paddingChar) {
         padding++;
         newEnd = index;
@@ -815,34 +753,32 @@
     return newEnd;
   }
 
-  /**
-   * Check that the remainder of the string is valid padding.
-   *
-   * Valid padding is a correct number (0, 1 or 2) of `=` characters
-   * or `%3D` sequences depending on the number of preceding base64 characters.
-   * The [state] parameter encodes which padding continuations are allowed
-   * as the number of expected characters. That number is the number of
-   * expected padding characters times 3 minus the number of padding characters
-   * seen so far, where `=` counts as 3 counts as three characters,
-   * and the padding sequence `%3D` counts as one character per character.
-   *
-   * The number of missing characters is always between 0 and 5 because we
-   * only call this function after having seen at least one `=` or `%`
-   * character.
-   * If the number of missing characters is not 3 or 0, we have seen (at least)
-   * a `%` character and expects the rest of the `%3D` sequence, and a `=` is
-   * not allowed. When missing 3 characters, either `=` or `%` is allowed.
-   *
-   * When the value is 0, no more padding (or any other character) is allowed.
-   */
+  /// Check that the remainder of the string is valid padding.
+  ///
+  /// Valid padding is a correct number (0, 1 or 2) of `=` characters
+  /// or `%3D` sequences depending on the number of preceding base64 characters.
+  /// The [state] parameter encodes which padding continuations are allowed
+  /// as the number of expected characters. That number is the number of
+  /// expected padding characters times 3 minus the number of padding characters
+  /// seen so far, where `=` counts as 3 counts as three characters,
+  /// and the padding sequence `%3D` counts as one character per character.
+  ///
+  /// The number of missing characters is always between 0 and 5 because we
+  /// only call this function after having seen at least one `=` or `%`
+  /// character.
+  /// If the number of missing characters is not 3 or 0, we have seen (at least)
+  /// a `%` character and expects the rest of the `%3D` sequence, and a `=` is
+  /// not allowed. When missing 3 characters, either `=` or `%` is allowed.
+  ///
+  /// When the value is 0, no more padding (or any other character) is allowed.
   static int _checkPadding(String input, int start, int end, int state) {
     assert(_hasSeenPadding(state));
     if (start == end) return state;
-    int expectedPadding = _statePadding(state);
+    var expectedPadding = _statePadding(state);
     assert(expectedPadding >= 0);
     assert(expectedPadding < 6);
     while (expectedPadding > 0) {
-      int char = input.codeUnitAt(start);
+      var char = input.codeUnitAt(start);
       if (expectedPadding == 3) {
         if (char == _paddingChar) {
           expectedPadding -= 3;
@@ -859,7 +795,7 @@
         }
       }
       // Partial padding means we have seen part of a "%3D" escape.
-      int expectedPartialPadding = expectedPadding;
+      var expectedPartialPadding = expectedPadding;
       if (expectedPartialPadding > 3) expectedPartialPadding -= 3;
       if (expectedPartialPadding == 2) {
         // Expects '3'
@@ -876,22 +812,22 @@
       if (start == end) break;
     }
     if (start != end) {
-      throw new FormatException("Invalid padding character", input, start);
+      throw FormatException("Invalid padding character", input, start);
     }
     return _encodePaddingState(expectedPadding);
   }
 }
 
 class _Base64DecoderSink extends StringConversionSinkBase {
-  /** Output sink */
+  /// Output sink
   final Sink<List<int>> _sink;
-  final _Base64Decoder _decoder = new _Base64Decoder();
+  final _Base64Decoder _decoder = _Base64Decoder();
 
   _Base64DecoderSink(this._sink);
 
   void add(String string) {
     if (string.isEmpty) return;
-    Uint8List buffer = _decoder.decode(string, 0, string.length);
+    var buffer = _decoder.decode(string, 0, string.length);
     if (buffer != null) _sink.add(buffer);
   }
 
@@ -903,7 +839,7 @@
   void addSlice(String string, int start, int end, bool isLast) {
     end = RangeError.checkValidRange(start, end, string.length);
     if (start == end) return;
-    Uint8List buffer = _decoder.decode(string, start, end);
+    var buffer = _decoder.decode(string, start, end);
     if (buffer != null) _sink.add(buffer);
     if (isLast) {
       _decoder.close(string, end);
diff --git a/sdk/lib/convert/byte_conversion.dart b/sdk/lib/convert/byte_conversion.dart
index aaeac3e..1071b90 100644
--- a/sdk/lib/convert/byte_conversion.dart
+++ b/sdk/lib/convert/byte_conversion.dart
@@ -4,43 +4,37 @@
 
 part of dart.convert;
 
-/**
- * The [ByteConversionSink] provides an interface for converters to
- * efficiently transmit byte data.
- *
- * Instead of limiting the interface to one non-chunked list of bytes it
- * accepts its input in chunks (themselves being lists of bytes).
- *
- * This abstract class will likely get more methods over time. Implementers are
- * urged to extend or mix in [ByteConversionSinkBase] to ensure that their
- * class covers the newly added methods.
- */
+/// The [ByteConversionSink] provides an interface for converters to
+/// efficiently transmit byte data.
+///
+/// Instead of limiting the interface to one non-chunked list of bytes it
+/// accepts its input in chunks (themselves being lists of bytes).
+///
+/// This abstract class will likely get more methods over time. Implementers are
+/// urged to extend or mix in [ByteConversionSinkBase] to ensure that their
+/// class covers the newly added methods.
 abstract class ByteConversionSink extends ChunkedConversionSink<List<int>> {
   ByteConversionSink();
   factory ByteConversionSink.withCallback(
       void callback(List<int> accumulated)) = _ByteCallbackSink;
   factory ByteConversionSink.from(Sink<List<int>> sink) = _ByteAdapterSink;
 
-  /**
-   * Adds the next [chunk] to `this`.
-   *
-   * Adds the bytes defined by [start] and [end]-exclusive to `this`.
-   *
-   * If [isLast] is `true` closes `this`.
-   *
-   * Contrary to `add` the given [chunk] must not be held onto. Once the method
-   * returns, it is safe to overwrite the data in it.
-   */
+  /// Adds the next [chunk] to `this`.
+  ///
+  /// Adds the bytes defined by [start] and [end]-exclusive to `this`.
+  ///
+  /// If [isLast] is `true` closes `this`.
+  ///
+  /// Contrary to `add` the given [chunk] must not be held onto. Once the method
+  /// returns, it is safe to overwrite the data in it.
   void addSlice(List<int> chunk, int start, int end, bool isLast);
 
   // TODO(floitsch): add more methods:
   // - iterateBytes.
 }
 
-/**
- * This class provides a base-class for converters that need to accept byte
- * inputs.
- */
+/// This class provides a base-class for converters that need to accept byte
+/// inputs.
 abstract class ByteConversionSinkBase extends ByteConversionSink {
   void add(List<int> chunk);
   void close();
@@ -51,12 +45,10 @@
   }
 }
 
-/**
- * This class adapts a simple [Sink] to a [ByteConversionSink].
- *
- * All additional methods of the [ByteConversionSink] (compared to the
- * ChunkedConversionSink) are redirected to the `add` method.
- */
+/// This class adapts a simple [Sink] to a [ByteConversionSink].
+///
+/// All additional methods of the [ByteConversionSink] (compared to the
+/// ChunkedConversionSink) are redirected to the `add` method.
 class _ByteAdapterSink extends ByteConversionSinkBase {
   final Sink<List<int>> _sink;
 
@@ -71,29 +63,27 @@
   }
 }
 
-/**
- * This class accumulates all chunks into one list of bytes
- * and invokes a callback when the sink is closed.
- *
- * This class can be used to terminate a chunked conversion.
- */
+/// This class accumulates all chunks into one list of bytes
+/// and invokes a callback when the sink is closed.
+///
+/// This class can be used to terminate a chunked conversion.
 class _ByteCallbackSink extends ByteConversionSinkBase {
   static const _INITIAL_BUFFER_SIZE = 1024;
 
   final _ChunkedConversionCallback<List<int>> _callback;
-  List<int> _buffer = new Uint8List(_INITIAL_BUFFER_SIZE);
+  List<int> _buffer = Uint8List(_INITIAL_BUFFER_SIZE);
   int _bufferIndex = 0;
 
   _ByteCallbackSink(void callback(List<int> accumulated))
-      : this._callback = callback;
+      : _callback = callback;
 
   void add(Iterable<int> chunk) {
-    int freeCount = _buffer.length - _bufferIndex;
+    var freeCount = _buffer.length - _bufferIndex;
     if (chunk.length > freeCount) {
       // Grow the buffer.
-      int oldLength = _buffer.length;
-      int newLength = _roundToPowerOf2(chunk.length + oldLength) * 2;
-      List<int> grown = new Uint8List(newLength);
+      var oldLength = _buffer.length;
+      var newLength = _roundToPowerOf2(chunk.length + oldLength) * 2;
+      var grown = Uint8List(newLength);
       grown.setRange(0, _buffer.length, _buffer);
       _buffer = grown;
     }
diff --git a/sdk/lib/convert/chunked_conversion.dart b/sdk/lib/convert/chunked_conversion.dart
index ff1294f..6a9479a 100644
--- a/sdk/lib/convert/chunked_conversion.dart
+++ b/sdk/lib/convert/chunked_conversion.dart
@@ -6,44 +6,36 @@
 
 typedef void _ChunkedConversionCallback<T>(T accumulated);
 
-/**
- * A [ChunkedConversionSink] is used to transmit data more efficiently between
- * two converters during chunked conversions.
- *
- * The basic `ChunkedConversionSink` is just a [Sink], and converters should
- * work with a plain `Sink`, but may work more efficiently with certain
- * specialized types of `ChunkedConversionSink`.
- *
- * It is recommended that implementations of `ChunkedConversionSink` extend
- * this class, to inherit any further methods that may be added to the class.
- */
+/// A [ChunkedConversionSink] is used to transmit data more efficiently between
+/// two converters during chunked conversions.
+///
+/// The basic `ChunkedConversionSink` is just a [Sink], and converters should
+/// work with a plain `Sink`, but may work more efficiently with certain
+/// specialized types of `ChunkedConversionSink`.
+///
+/// It is recommended that implementations of `ChunkedConversionSink` extend
+/// this class, to inherit any further methods that may be added to the class.
 abstract class ChunkedConversionSink<T> implements Sink<T> {
   ChunkedConversionSink();
   factory ChunkedConversionSink.withCallback(
       void callback(List<T> accumulated)) = _SimpleCallbackSink<T>;
 
-  /**
-   * Adds chunked data to this sink.
-   *
-   * This method is also used when converters are used as [StreamTransformer]s.
-   */
+  /// Adds chunked data to this sink.
+  ///
+  /// This method is also used when converters are used as [StreamTransformer]s.
   void add(T chunk);
 
-  /**
-   * Closes the sink.
-   *
-   * This signals the end of the chunked conversion. This method is called
-   * when converters are used as [StreamTransformer]'s.
-   */
+  /// Closes the sink.
+  ///
+  /// This signals the end of the chunked conversion. This method is called
+  /// when converters are used as [StreamTransformer]'s.
   void close();
 }
 
-/**
- * This class accumulates all chunks and invokes a callback with a list of
- * the chunks when the sink is closed.
- *
- * This class can be used to terminate a chunked conversion.
- */
+/// This class accumulates all chunks and invokes a callback with a list of
+/// the chunks when the sink is closed.
+///
+/// This class can be used to terminate a chunked conversion.
 class _SimpleCallbackSink<T> extends ChunkedConversionSink<T> {
   final _ChunkedConversionCallback<List<T>> _callback;
   final List<T> _accumulated = <T>[];
@@ -59,27 +51,23 @@
   }
 }
 
-/**
- * This class implements the logic for a chunked conversion as a
- * stream transformer.
- *
- * It is used as strategy in the [EventTransformStream].
- *
- * It also implements the [ChunkedConversionSink] interface so that it
- * can be used as output sink in a chunked conversion.
- */
+/// This class implements the logic for a chunked conversion as a
+/// stream transformer.
+///
+/// It is used as strategy in the [EventTransformStream].
+///
+/// It also implements the [ChunkedConversionSink] interface so that it
+/// can be used as output sink in a chunked conversion.
 class _ConverterStreamEventSink<S, T> implements EventSink<S> {
-  /** The output sink for the converter. */
+  /// The output sink for the converter.
   final EventSink<T> _eventSink;
 
-  /**
-   * The input sink for new data. All data that is received with
-   * [handleData] is added into this sink.
-   */
+  /// The input sink for new data. All data that is received with
+  /// [handleData] is added into this sink.
   final Sink<S> _chunkedSink;
 
   _ConverterStreamEventSink(Converter<S, T> converter, EventSink<T> sink)
-      : this._eventSink = sink,
+      : _eventSink = sink,
         _chunkedSink = converter.startChunkedConversion(sink);
 
   void add(S o) {
diff --git a/sdk/lib/convert/codec.dart b/sdk/lib/convert/codec.dart
index 95aadd1..38e4a3c 100644
--- a/sdk/lib/convert/codec.dart
+++ b/sdk/lib/convert/codec.dart
@@ -4,92 +4,77 @@
 
 part of dart.convert;
 
-/**
- * A [Codec] encodes and (if supported) decodes data.
- *
- * Codecs can be fused. For example fusing [json] and [utf8] produces
- * an encoder that can convert Json objects directly to bytes, or can decode
- * bytes directly to json objects.
- *
- * Fused codecs generally attempt to optimize the operations and can be faster
- * than executing each step of an encoding separately.
- */
+/// A [Codec] encodes and (if supported) decodes data.
+///
+/// Codecs can be fused. For example fusing [json] and [utf8] produces
+/// an encoder that can convert Json objects directly to bytes, or can decode
+/// bytes directly to json objects.
+///
+/// Fused codecs generally attempt to optimize the operations and can be faster
+/// than executing each step of an encoding separately.
 abstract class Codec<S, T> {
   const Codec();
 
-  /**
-   * Encodes [input].
-   *
-   * The input is encoded as if by `encoder.convert`.
-   */
+  /// Encodes [input].
+  ///
+  /// The input is encoded as if by `encoder.convert`.
   T encode(S input) => encoder.convert(input);
 
-  /**
-   * Decodes [encoded] data.
-   *
-   * The input is decoded as if by `decoder.convert`.
-   */
+  /// Decodes [encoded] data.
+  ///
+  /// The input is decoded as if by `decoder.convert`.
   S decode(T encoded) => decoder.convert(encoded);
 
-  /**
-   * Returns the encoder from [S] to [T].
-   *
-   * It may be stateful and should not be reused.
-   */
+  /// Returns the encoder from [S] to [T].
+  ///
+  /// It may be stateful and should not be reused.
   Converter<S, T> get encoder;
-  /**
-   * Returns the decoder of `this`, converting from [T] to [S].
-   *
-   * It may be stateful and should not be reused.
-   */
+
+  /// Returns the decoder of `this`, converting from [T] to [S].
+  ///
+  /// It may be stateful and should not be reused.
   Converter<T, S> get decoder;
 
-  /**
-   * Fuses `this` with `other`.
-   *
-   * When encoding, the resulting codec encodes with `this` before
-   * encoding with [other].
-   *
-   * When decoding, the resulting codec decodes with [other] before decoding
-   * with `this`.
-   *
-   * In some cases one needs to use the [inverted] codecs to be able to fuse
-   * them correctly. That is, the output type of `this` ([T]) must match the
-   * input type of the second codec [other].
-   *
-   * Examples:
-   * ```dart
-   * final jsonToBytes = json.fuse(utf8);
-   * List<int> bytes = jsonToBytes.encode(["json-object"]);
-   * var decoded = jsonToBytes.decode(bytes);
-   * assert(decoded is List && decoded[0] == "json-object");
-   *
-   * var inverted = json.inverted;
-   * var jsonIdentity = json.fuse(inverted);
-   * var jsonObject = jsonIdentity.encode(["1", 2]);
-   * assert(jsonObject is List && jsonObject[0] == "1" && jsonObject[1] == 2);
-   * ```
-   */
+  /// Fuses `this` with `other`.
+  ///
+  /// When encoding, the resulting codec encodes with `this` before
+  /// encoding with [other].
+  ///
+  /// When decoding, the resulting codec decodes with [other] before decoding
+  /// with `this`.
+  ///
+  /// In some cases one needs to use the [inverted] codecs to be able to fuse
+  /// them correctly. That is, the output type of `this` ([T]) must match the
+  /// input type of the second codec [other].
+  ///
+  /// Examples:
+  /// ```dart
+  /// final jsonToBytes = json.fuse(utf8);
+  /// List<int> bytes = jsonToBytes.encode(["json-object"]);
+  /// var decoded = jsonToBytes.decode(bytes);
+  /// assert(decoded is List && decoded[0] == "json-object");
+  ///
+  /// var inverted = json.inverted;
+  /// var jsonIdentity = json.fuse(inverted);
+  /// var jsonObject = jsonIdentity.encode(["1", 2]);
+  /// assert(jsonObject is List && jsonObject[0] == "1" && jsonObject[1] == 2);
+  /// ```
   // TODO(floitsch): use better example with line-splitter once that one is
   // in this library.
   Codec<S, R> fuse<R>(Codec<T, R> other) {
-    return new _FusedCodec<S, T, R>(this, other);
+    return _FusedCodec<S, T, R>(this, other);
   }
 
-  /**
-   * Inverts `this`.
-   *
-   * The [encoder] and [decoder] of the resulting codec are swapped.
-   */
-  Codec<T, S> get inverted => new _InvertedCodec<T, S>(this);
+  /// Inverts `this`.
+  ///
+  /// The [encoder] and [decoder] of the resulting codec are swapped.
+  Codec<T, S> get inverted => _InvertedCodec<T, S>(this);
 }
 
-/**
- * Fuses the given codecs.
- *
- * In the non-chunked conversion simply invokes the non-chunked conversions in
- * sequence.
- */
+/// Fuses the given codecs.
+///
+/// In the non-chunked conversion simply invokes the non-chunked conversions in
+/// sequence.
 class _FusedCodec<S, M, T> extends Codec<S, T> {
   final Codec<S, M> _first;
   final Codec<M, T> _second;
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index 8125f34..6173782 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -2,57 +2,55 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- *
- * Encoders and decoders for converting between different data representations,
- * including JSON and UTF-8.
- *
- * In addition to converters for common data representations, this library
- * provides support for implementing converters in a way which makes them easy to
- * chain and to use with streams.
- *
- * To use this library in your code:
- *
- *     import 'dart:convert';
- *
- * Two commonly used converters are the top-level instances of
- * [JsonCodec] and [Utf8Codec], named [json] and [utf8], respectively.
- *
- * JSON is a simple text format for representing
- * structured objects and collections.
- * The JSON encoder/decoder transforms between strings and
- * object structures, such as lists and maps, using the JSON format.
- *
- * UTF-8 is a common variable-width encoding that can represent
- * every character in the Unicode character set.
- * The UTF-8 encoder/decoder transforms between Strings and bytes.
- *
- * Converters are often used with streams
- * to transform the data that comes through the stream
- * as it becomes available.
- * The following code uses two converters.
- * The first is a UTF-8 decoder, which converts the data from bytes to UTF-8
- * as it's read from a file,
- * The second is an instance of [LineSplitter],
- * which splits the data on newline boundaries.
- *
- *     int lineNumber = 1;
- *     Stream<List<int>> stream = new File('quotes.txt').openRead();
- *
- *     stream.transform(utf8.decoder)
- *           .transform(const LineSplitter())
- *           .listen((line) {
- *             if (showLineNumbers) {
- *               stdout.write('${lineNumber++} ');
- *             }
- *             stdout.writeln(line);
- *           });
- *
- * See the documentation for the [Codec] and [Converter] classes
- * for information about creating your own converters.
- *
- * {@category Core}
- */
+///
+/// Encoders and decoders for converting between different data representations,
+/// including JSON and UTF-8.
+///
+/// In addition to converters for common data representations, this library
+/// provides support for implementing converters in a way which makes them easy to
+/// chain and to use with streams.
+///
+/// To use this library in your code:
+///
+///     import 'dart:convert';
+///
+/// Two commonly used converters are the top-level instances of
+/// [JsonCodec] and [Utf8Codec], named [json] and [utf8], respectively.
+///
+/// JSON is a simple text format for representing
+/// structured objects and collections.
+/// The JSON encoder/decoder transforms between strings and
+/// object structures, such as lists and maps, using the JSON format.
+///
+/// UTF-8 is a common variable-width encoding that can represent
+/// every character in the Unicode character set.
+/// The UTF-8 encoder/decoder transforms between Strings and bytes.
+///
+/// Converters are often used with streams
+/// to transform the data that comes through the stream
+/// as it becomes available.
+/// The following code uses two converters.
+/// The first is a UTF-8 decoder, which converts the data from bytes to UTF-8
+/// as it's read from a file,
+/// The second is an instance of [LineSplitter],
+/// which splits the data on newline boundaries.
+///
+///     var lineNumber = 1;
+///     var stream = File('quotes.txt').openRead();
+///
+///     stream.transform(utf8.decoder)
+///           .transform(const LineSplitter())
+///           .listen((line) {
+///             if (showLineNumbers) {
+///               stdout.write('${lineNumber++} ');
+///             }
+///             stdout.writeln(line);
+///           });
+///
+/// See the documentation for the [Codec] and [Converter] classes
+/// for information about creating your own converters.
+///
+/// {@category Core}
 library dart.convert;
 
 import 'dart:async';
diff --git a/sdk/lib/convert/converter.dart b/sdk/lib/convert/converter.dart
index 7f0b3f5..2167933 100644
--- a/sdk/lib/convert/converter.dart
+++ b/sdk/lib/convert/converter.dart
@@ -4,74 +4,60 @@
 
 part of dart.convert;
 
-/**
- * A [Converter] converts data from one representation into another.
- *
- * It is recommended that implementations of `Converter` extend this class,
- * to inherit any further methods that may be added to the class.
- */
+/// A [Converter] converts data from one representation into another.
+///
+/// It is recommended that implementations of `Converter` extend this class,
+/// to inherit any further methods that may be added to the class.
 abstract class Converter<S, T> extends StreamTransformerBase<S, T> {
   const Converter();
 
-  /**
-   * Adapts [source] to be a `Converter<TS, TT>`.
-   *
-   * This allows [source] to be used at the new type, but at run-time it
-   * must satisfy the requirements of both the new type and its original type.
-   *
-   * Conversion input must be both [SS] and [TS] and the output created by
-   * [source] for those input must be both [ST] and [TT].
-   */
+  /// Adapts [source] to be a `Converter<TS, TT>`.
+  ///
+  /// This allows [source] to be used at the new type, but at run-time it
+  /// must satisfy the requirements of both the new type and its original type.
+  ///
+  /// Conversion input must be both [SS] and [TS] and the output created by
+  /// [source] for those input must be both [ST] and [TT].
   static Converter<TS, TT> castFrom<SS, ST, TS, TT>(Converter<SS, ST> source) =>
-      new CastConverter<SS, ST, TS, TT>(source);
+      CastConverter<SS, ST, TS, TT>(source);
 
-  /**
-   * Converts [input] and returns the result of the conversion.
-   */
+  /// Converts [input] and returns the result of the conversion.
   T convert(S input);
 
-  /**
-   * Fuses `this` with [other].
-   *
-   * Encoding with the resulting converter is equivalent to converting with
-   * `this` before converting with `other`.
-   */
+  /// Fuses `this` with [other].
+  ///
+  /// Encoding with the resulting converter is equivalent to converting with
+  /// `this` before converting with `other`.
   Converter<S, TT> fuse<TT>(Converter<T, TT> other) {
-    return new _FusedConverter<S, T, TT>(this, other);
+    return _FusedConverter<S, T, TT>(this, other);
   }
 
-  /**
-   * Starts a chunked conversion.
-   *
-   * The returned sink serves as input for the long-running conversion. The
-   * given [sink] serves as output.
-   */
+  /// Starts a chunked conversion.
+  ///
+  /// The returned sink serves as input for the long-running conversion. The
+  /// given [sink] serves as output.
   Sink<S> startChunkedConversion(Sink<T> sink) {
-    throw new UnsupportedError(
+    throw UnsupportedError(
         "This converter does not support chunked conversions: $this");
   }
 
   Stream<T> bind(Stream<S> stream) {
-    return new Stream<T>.eventTransformed(
-        stream, (EventSink sink) => new _ConverterStreamEventSink(this, sink));
+    return Stream<T>.eventTransformed(
+        stream, (EventSink sink) => _ConverterStreamEventSink(this, sink));
   }
 
-  /**
-   * Provides a `Converter<RS, RT>` view of this stream transformer.
-   *
-   * The resulting transformer will check at run-time that all conversion
-   * inputs are actually instances of [S],
-   * and it will check that all conversion output produced by this converter
-   * are actually instances of [RT].
-   */
+  /// Provides a `Converter<RS, RT>` view of this stream transformer.
+  ///
+  /// The resulting transformer will check at run-time that all conversion
+  /// inputs are actually instances of [S],
+  /// and it will check that all conversion output produced by this converter
+  /// are actually instances of [RT].
   Converter<RS, RT> cast<RS, RT>() => Converter.castFrom<S, T, RS, RT>(this);
 }
 
-/**
- * Fuses two converters.
- *
- * For a non-chunked conversion converts the input in sequence.
- */
+/// Fuses two converters.
+///
+/// For a non-chunked conversion converts the input in sequence.
 class _FusedConverter<S, M, T> extends Converter<S, T> {
   final Converter<S, M> _first;
   final Converter<M, T> _second;
diff --git a/sdk/lib/convert/encoding.dart b/sdk/lib/convert/encoding.dart
index 388868e..7441e0a 100644
--- a/sdk/lib/convert/encoding.dart
+++ b/sdk/lib/convert/encoding.dart
@@ -4,34 +4,38 @@
 
 part of dart.convert;
 
-/**
- * Open-ended Encoding enum.
- */
+/// Open-ended Encoding enum.
 abstract class Encoding extends Codec<String, List<int>> {
   const Encoding();
 
+  /// Returns the encoder from `String` to `List<int>`.
+  ///
+  /// It may be stateful and should not be reused.
   Converter<String, List<int>> get encoder;
+
+  /// Returns the decoder of `this`, converting from `List<int>` to `String`.
+  ///
+  /// It may be stateful and should not be reused.
   Converter<List<int>, String> get decoder;
 
   Future<String> decodeStream(Stream<List<int>> byteStream) {
     return byteStream
-        .transform(decoder)
-        .fold(new StringBuffer(), (buffer, string) => buffer..write(string))
-        .then((buffer) => buffer.toString());
+        .transform<String>(decoder)
+        .fold(StringBuffer(),
+            (StringBuffer buffer, String string) => buffer..write(string))
+        .then((StringBuffer buffer) => buffer.toString());
   }
 
-  /**
-   * Name of the encoding.
-   *
-   * If the encoding is standardized, this is the lower-case version of one of
-   * the IANA official names for the character set (see
-   * http://www.iana.org/assignments/character-sets/character-sets.xml)
-   */
+  /// Name of the encoding.
+  ///
+  /// If the encoding is standardized, this is the lower-case version of one of
+  /// the IANA official names for the character set (see
+  /// http://www.iana.org/assignments/character-sets/character-sets.xml)
   String get name;
 
   // All aliases (in lowercase) of supported encoding from
   // http://www.iana.org/assignments/character-sets/character-sets.xml.
-  static Map<String, Encoding> _nameToEncoding = <String, Encoding>{
+  static final Map<String, Encoding> _nameToEncoding = <String, Encoding>{
     // ISO_8859-1:1987.
     "iso_8859-1:1987": latin1,
     "iso-ir-100": latin1,
@@ -61,16 +65,14 @@
     "utf-8": utf8
   };
 
-  /**
-  * Gets an [Encoding] object from the name of the character set
-  * name. The names used are the IANA official names for the
-  * character set (see
-  * http://www.iana.org/assignments/character-sets/character-sets.xml).
-  *
-  * The [name] passed is case insensitive.
-  *
-  * If character set is not supported [:null:] is returned.
-  */
+  /// Gets an [Encoding] object from the name of the character set
+  /// name. The names used are the IANA official names for the
+  /// character set (see
+  /// http://www.iana.org/assignments/character-sets/character-sets.xml).
+  ///
+  /// The [name] passed is case insensitive.
+  ///
+  /// If character set is not supported [:null:] is returned.
   static Encoding getByName(String name) {
     if (name == null) return null;
     name = name.toLowerCase();
diff --git a/sdk/lib/convert/html_escape.dart b/sdk/lib/convert/html_escape.dart
index 3d5de0a..a0a7119 100644
--- a/sdk/lib/convert/html_escape.dart
+++ b/sdk/lib/convert/html_escape.dart
@@ -4,165 +4,149 @@
 
 part of dart.convert;
 
-/**
- * A `String` converter that converts characters to HTML entities.
- *
- * This is intended to sanitize text before inserting the text into an HTML
- * document. Characters that are meaningful in HTML are converted to
- * HTML entities (like `&amp;` for `&`).
- *
- * The general converter escapes all characters that are meaningful in HTML
- * attributes or normal element context. Elements with special content types
- * (like CSS or JavaScript) may need a more specialized escaping that
- * understands that content type.
- *
- * If the context where the text will be inserted is known in more detail,
- * it's possible to omit escaping some characters (like quotes when not
- * inside an attribute value).
- *
- * The escaped text should only be used inside quoted HTML attributes values
- * or as text content of a normal element. Using the escaped text inside a
- * tag, but not inside a quoted attribute value, is still dangerous.
- */
-const HtmlEscape htmlEscape = const HtmlEscape();
+/// A `String` converter that converts characters to HTML entities.
+///
+/// This is intended to sanitize text before inserting the text into an HTML
+/// document. Characters that are meaningful in HTML are converted to
+/// HTML entities (like `&amp;` for `&`).
+///
+/// The general converter escapes all characters that are meaningful in HTML
+/// attributes or normal element context. Elements with special content types
+/// (like CSS or JavaScript) may need a more specialized escaping that
+/// understands that content type.
+///
+/// If the context where the text will be inserted is known in more detail,
+/// it's possible to omit escaping some characters (like quotes when not
+/// inside an attribute value).
+///
+/// The escaped text should only be used inside quoted HTML attributes values
+/// or as text content of a normal element. Using the escaped text inside a
+/// tag, but not inside a quoted attribute value, is still dangerous.
+const HtmlEscape htmlEscape = HtmlEscape();
 
-/**
- * HTML escape modes.
- *
- * Allows specifying a mode for HTML escaping that depend on the context
- * where the escaped result is going to be used.
- * The relevant contexts are:
- *
- * * as text content of an HTML element.
- * * as value of a (single- or double-) quoted attribute value.
- *
- * All modes require escaping of `&` (ampersand) characters, and may
- * enable escaping of more characters.
- *
- * Custom escape modes can be created using the [HtmlEscapeMode.HtmlEscapeMode]
- * constructor.
- */
+/// HTML escape modes.
+///
+/// Allows specifying a mode for HTML escaping that depend on the context
+/// where the escaped result is going to be used.
+/// The relevant contexts are:
+///
+/// * as text content of an HTML element.
+/// * as value of a (single- or double-) quoted attribute value.
+///
+/// All modes require escaping of `&` (ampersand) characters, and may
+/// enable escaping of more characters.
+///
+/// Custom escape modes can be created using the [HtmlEscapeMode.HtmlEscapeMode]
+/// constructor.
 class HtmlEscapeMode {
   final String _name;
-  /** Whether to escape '<' and '>'. */
+
+  /// Whether to escape '<' and '>'.
   final bool escapeLtGt;
-  /** Whether to escape '"' (quote). */
+
+  /// Whether to escape '"' (quote).
   final bool escapeQuot;
-  /** Whether to escape "'" (apostrophe). */
+
+  /// Whether to escape "'" (apostrophe).
   final bool escapeApos;
-  /**
-   * Whether to escape "/" (forward slash, solidus).
-   *
-   * Escaping a slash is recommended to avoid cross-site scripting attacks by
-   * [the Open Web Application Security Project](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content)
-   */
+
+  /// Whether to escape "/" (forward slash, solidus).
+  ///
+  /// Escaping a slash is recommended to avoid cross-site scripting attacks by
+  /// [the Open Web Application Security Project](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content)
   final bool escapeSlash;
 
-  /**
-   * Default escaping mode which escape all characters.
-   *
-   * The result of such an escaping is usable both in element content and
-   * in any attribute value.
-   *
-   * The escaping only works for elements with normal HTML content,
-   * and not for, for example, script or style element content,
-   * which require escapes matching their particular content syntax.
-   */
+  /// Default escaping mode which escape all characters.
+  ///
+  /// The result of such an escaping is usable both in element content and
+  /// in any attribute value.
+  ///
+  /// The escaping only works for elements with normal HTML content,
+  /// and not for, for example, script or style element content,
+  /// which require escapes matching their particular content syntax.
   static const HtmlEscapeMode unknown =
-      const HtmlEscapeMode._('unknown', true, true, true, true);
+      HtmlEscapeMode._('unknown', true, true, true, true);
 
-  /**
-   * Escaping mode for text going into double-quoted HTML attribute values.
-   *
-   * The result should not be used as the content of an unquoted
-   * or single-quoted attribute value.
-   *
-   * Escapes double quotes (`"`) but not single quotes (`'`),
-   * and escapes `<` and `>` characters because they are not allowed
-   * in strict XHTML attributes
-   */
+  /// Escaping mode for text going into double-quoted HTML attribute values.
+  ///
+  /// The result should not be used as the content of an unquoted
+  /// or single-quoted attribute value.
+  ///
+  /// Escapes double quotes (`"`) but not single quotes (`'`),
+  /// and escapes `<` and `>` characters because they are not allowed
+  /// in strict XHTML attributes
   static const HtmlEscapeMode attribute =
-      const HtmlEscapeMode._('attribute', true, true, false, false);
+      HtmlEscapeMode._('attribute', true, true, false, false);
 
-  /**
-   * Escaping mode for text going into single-quoted HTML attribute values.
-   *
-   * The result should not be used as the content of an unquoted
-   * or double-quoted attribute value.
-   *
-   * Escapes single quotes (`'`) but not double quotes (`"`),
-   * and escapes `<` and `>` characters because they are not allowed
-   * in strict XHTML attributes
-   */
+  /// Escaping mode for text going into single-quoted HTML attribute values.
+  ///
+  /// The result should not be used as the content of an unquoted
+  /// or double-quoted attribute value.
+  ///
+  /// Escapes single quotes (`'`) but not double quotes (`"`),
+  /// and escapes `<` and `>` characters because they are not allowed
+  /// in strict XHTML attributes
   static const HtmlEscapeMode sqAttribute =
-      const HtmlEscapeMode._('attribute', true, false, true, false);
+      HtmlEscapeMode._('attribute', true, false, true, false);
 
-  /**
-   * Escaping mode for text going into HTML element content.
-   *
-   * The escaping only works for elements with normal HTML content,
-   * and not for, for example, script or style element content,
-   * which require escapes matching their particular content syntax.
-   *
-   * Escapes `<` and `>` characters.
-   */
+  /// Escaping mode for text going into HTML element content.
+  ///
+  /// The escaping only works for elements with normal HTML content,
+  /// and not for, for example, script or style element content,
+  /// which require escapes matching their particular content syntax.
+  ///
+  /// Escapes `<` and `>` characters.
   static const HtmlEscapeMode element =
-      const HtmlEscapeMode._('element', true, false, false, false);
+      HtmlEscapeMode._('element', true, false, false, false);
 
   const HtmlEscapeMode._(this._name, this.escapeLtGt, this.escapeQuot,
       this.escapeApos, this.escapeSlash);
 
-  /**
-   * Create a custom escaping mode.
-   *
-   * All modes escape `&`.
-   * The mode can further be set to escape `<` and `>` ([escapeLtGt]),
-   * `"` ([escapeQuot]), `'` ([escapeApos]), and/or `/` ([escapeSlash]).
-   */
+  /// Create a custom escaping mode.
+  ///
+  /// All modes escape `&`.
+  /// The mode can further be set to escape `<` and `>` ([escapeLtGt]),
+  /// `"` ([escapeQuot]), `'` ([escapeApos]), and/or `/` ([escapeSlash]).
   const HtmlEscapeMode(
-      {String name: "custom",
-      this.escapeLtGt: false,
-      this.escapeQuot: false,
-      this.escapeApos: false,
-      this.escapeSlash: false})
+      {String name = "custom",
+      this.escapeLtGt = false,
+      this.escapeQuot = false,
+      this.escapeApos = false,
+      this.escapeSlash = false})
       : _name = name;
 
   String toString() => _name;
 }
 
-/**
- * Converter which escapes characters with special meaning in HTML.
- *
- * The converter finds characters that are significant in HTML source and
- * replaces them with corresponding HTML entities.
- *
- * The characters that need escaping in HTML are:
- *
- * * `&` (ampersand) always need to be escaped.
- * * `<` (less than) and '>' (greater than) when inside an element.
- * * `"` (quote) when inside a double-quoted attribute value.
- * * `'` (apostrophe) when inside a single-quoted attribute value.
- *       Apostrophe is escaped as `&#39;` instead of `&apos;` since
- *       not all browsers understand `&apos;`.
- * * `/` (slash) is recommended to be escaped because it may be used
- *       to terminate an element in some HTML dialects.
- *
- * Escaping `>` (greater than) isn't necessary, but the result is often
- * found to be easier to read if greater-than is also escaped whenever
- * less-than is.
- */
+/// Converter which escapes characters with special meaning in HTML.
+///
+/// The converter finds characters that are significant in HTML source and
+/// replaces them with corresponding HTML entities.
+///
+/// The characters that need escaping in HTML are:
+///
+/// * `&` (ampersand) always need to be escaped.
+/// * `<` (less than) and '>' (greater than) when inside an element.
+/// * `"` (quote) when inside a double-quoted attribute value.
+/// * `'` (apostrophe) when inside a single-quoted attribute value.
+///       Apostrophe is escaped as `&#39;` instead of `&apos;` since
+///       not all browsers understand `&apos;`.
+/// * `/` (slash) is recommended to be escaped because it may be used
+///       to terminate an element in some HTML dialects.
+///
+/// Escaping `>` (greater than) isn't necessary, but the result is often
+/// found to be easier to read if greater-than is also escaped whenever
+/// less-than is.
 class HtmlEscape extends Converter<String, String> {
-  /** The [HtmlEscapeMode] used by the converter. */
+  /// The [HtmlEscapeMode] used by the converter.
   final HtmlEscapeMode mode;
 
-  /**
-   * Create converter that escapes HTML characters.
-   *
-   * If [mode] is provided as either [HtmlEscapeMode.attribute] or
-   * [HtmlEscapeMode.element], only the corresponding subset of HTML
-   * characters are escaped.
-   * The default is to escape all HTML characters.
-   */
+  /// Create converter that escapes HTML characters.
+  ///
+  /// If [mode] is provided as either [HtmlEscapeMode.attribute] or
+  /// [HtmlEscapeMode.element], only the corresponding subset of HTML
+  /// characters are escaped.
+  /// The default is to escape all HTML characters.
   const HtmlEscape([this.mode = HtmlEscapeMode.unknown]);
 
   String convert(String text) {
@@ -170,17 +154,15 @@
     return val == null ? text : val;
   }
 
-  /**
-   * Converts the substring of text from start to end.
-   *
-   * Returns `null` if no changes were necessary, otherwise returns
-   * the converted string.
-   */
+  /// Converts the substring of text from start to end.
+  ///
+  /// Returns `null` if no changes were necessary, otherwise returns
+  /// the converted string.
   String _convert(String text, int start, int end) {
-    StringBuffer result = null;
-    for (int i = start; i < end; i++) {
+    StringBuffer result;
+    for (var i = start; i < end; i++) {
       var ch = text[i];
-      String replacement = null;
+      String replacement;
       switch (ch) {
         case '&':
           replacement = '&amp;';
@@ -202,7 +184,7 @@
           break;
       }
       if (replacement != null) {
-        if (result == null) result = new StringBuffer();
+        result ??= StringBuffer();
         if (i > start) result.write(text.substring(start, i));
         result.write(replacement);
         start = i + 1;
@@ -214,10 +196,8 @@
   }
 
   StringConversionSink startChunkedConversion(Sink<String> sink) {
-    if (sink is! StringConversionSink) {
-      sink = new StringConversionSink.from(sink);
-    }
-    return new _HtmlEscapeSink(this, sink);
+    return _HtmlEscapeSink(this,
+        sink is StringConversionSink ? sink : StringConversionSink.from(sink));
   }
 }
 
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index 1d3c69a..35bc351 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -4,16 +4,14 @@
 
 part of dart.convert;
 
-/**
- * Error thrown by JSON serialization if an object cannot be serialized.
- *
- * The [unsupportedObject] field holds that object that failed to be serialized.
- *
- * If an object isn't directly serializable, the serializer calls the `toJson`
- * method on the object. If that call fails, the error will be stored in the
- * [cause] field. If the call returns an object that isn't directly
- * serializable, the [cause] is null.
- */
+/// Error thrown by JSON serialization if an object cannot be serialized.
+///
+/// The [unsupportedObject] field holds that object that failed to be serialized.
+///
+/// If an object isn't directly serializable, the serializer calls the `toJson`
+/// method on the object. If that call fails, the error will be stored in the
+/// [cause] field. If the call returns an object that isn't directly
+/// serializable, the [cause] is null.
 class JsonUnsupportedObjectError extends Error {
   /// The object that could not be serialized.
   final Object unsupportedObject;
@@ -30,7 +28,7 @@
       {this.cause, this.partialResult});
 
   String toString() {
-    String safeString = Error.safeToString(unsupportedObject);
+    var safeString = Error.safeToString(unsupportedObject);
     String prefix;
     if (cause != null) {
       prefix = "Converting object to an encodable object failed:";
@@ -41,330 +39,298 @@
   }
 }
 
-/**
- * Reports that an object could not be stringified due to cyclic references.
- *
- * An object that references itself cannot be serialized by
- * [JsonCodec.encode]/[JsonEncoder.convert].
- * When the cycle is detected, a [JsonCyclicError] is thrown.
- */
+/// Reports that an object could not be stringified due to cyclic references.
+///
+/// An object that references itself cannot be serialized by
+/// [JsonCodec.encode]/[JsonEncoder.convert].
+/// When the cycle is detected, a [JsonCyclicError] is thrown.
 class JsonCyclicError extends JsonUnsupportedObjectError {
-  /** The first object that was detected as part of a cycle. */
+  /// The first object that was detected as part of a cycle.
   JsonCyclicError(Object object) : super(object);
   String toString() => "Cyclic error in JSON stringify";
 }
 
-/**
- * An instance of the default implementation of the [JsonCodec].
- *
- * This instance provides a convenient access to the most common JSON
- * use cases.
- *
- * Examples:
- *
- *     var encoded = json.encode([1, 2, { "a": null }]);
- *     var decoded = json.decode('["foo", { "bar": 499 }]');
- */
-const JsonCodec json = const JsonCodec();
+/// An instance of the default implementation of the [JsonCodec].
+///
+/// This instance provides a convenient access to the most common JSON
+/// use cases.
+///
+/// Examples:
+///
+///     var encoded = json.encode([1, 2, { "a": null }]);
+///     var decoded = json.decode('["foo", { "bar": 499 }]');
+const JsonCodec json = JsonCodec();
 
-/**
- * Converts [value] to a JSON string.
- *
- * If value contains objects that are not directly encodable to a JSON
- * string (a value that is not a number, boolean, string, null, list or a map
- * with string keys), the [toEncodable] function is used to convert it to an
- * object that must be directly encodable.
- *
- * If [toEncodable] is omitted, it defaults to a function that returns the
- * result of calling `.toJson()` on the unencodable object.
- *
- * Shorthand for [json.encode].
- */
+/// Converts [value] to a JSON string.
+///
+/// If value contains objects that are not directly encodable to a JSON
+/// string (a value that is not a number, boolean, string, null, list or a map
+/// with string keys), the [toEncodable] function is used to convert it to an
+/// object that must be directly encodable.
+///
+/// If [toEncodable] is omitted, it defaults to a function that returns the
+/// result of calling `.toJson()` on the unencodable object.
+///
+/// Shorthand for [json.encode].
 String jsonEncode(Object object, {Object toEncodable(Object nonEncodable)}) =>
     json.encode(object, toEncodable: toEncodable);
 
-/**
- * Parses the string and returns the resulting Json object.
- *
- * The optional [reviver] function is called once for each object or list
- * property that has been parsed during decoding. The `key` argument is either
- * the integer list index for a list property, the string map key for object
- * properties, or `null` for the final result.
- *
- * The default [reviver] (when not provided) is the identity function.
- *
- * Shorthand for [json.decode].
- */
+/// Parses the string and returns the resulting Json object.
+///
+/// The optional [reviver] function is called once for each object or list
+/// property that has been parsed during decoding. The `key` argument is either
+/// the integer list index for a list property, the string map key for object
+/// properties, or `null` for the final result.
+///
+/// The default [reviver] (when not provided) is the identity function.
+///
+/// Shorthand for [json.decode].
 dynamic jsonDecode(String source, {Object reviver(Object key, Object value)}) =>
     json.decode(source, reviver: reviver);
 
 typedef _Reviver(Object key, Object value);
 typedef _ToEncodable(var o);
 
-/**
- * A [JsonCodec] encodes JSON objects to strings and decodes strings to
- * JSON objects.
- *
- * Examples:
- *
- *     var encoded = json.encode([1, 2, { "a": null }]);
- *     var decoded = json.decode('["foo", { "bar": 499 }]');
- */
+/// A [JsonCodec] encodes JSON objects to strings and decodes strings to
+/// JSON objects.
+///
+/// Examples:
+///
+///     var encoded = json.encode([1, 2, { "a": null }]);
+///     var decoded = json.decode('["foo", { "bar": 499 }]');
 class JsonCodec extends Codec<Object, String> {
   final _Reviver _reviver;
   final _ToEncodable _toEncodable;
 
-  /**
-   * Creates a `JsonCodec` with the given reviver and encoding function.
-   *
-   * The [reviver] function is called during decoding. It is invoked once for
-   * each object or list property that has been parsed.
-   * The `key` argument is either the integer list index for a list property,
-   * the string map key for object properties, or `null` for the final result.
-   *
-   * If [reviver] is omitted, it defaults to returning the value argument.
-   *
-   * The [toEncodable] function is used during encoding. It is invoked for
-   * values that are not directly encodable to a string (a value that is not a
-   * number, boolean, string, null, list or a map with string keys). The
-   * function must return an object that is directly encodable. The elements of
-   * a returned list and values of a returned map do not need to be directly
-   * encodable, and if they aren't, `toEncodable` will be used on them as well.
-   * Please notice that it is possible to cause an infinite recursive regress
-   * in this way, by effectively creating an infinite data structure through
-   * repeated call to `toEncodable`.
-   *
-   * If [toEncodable] is omitted, it defaults to a function that returns the
-   * result of calling `.toJson()` on the unencodable object.
-   */
+  /// Creates a `JsonCodec` with the given reviver and encoding function.
+  ///
+  /// The [reviver] function is called during decoding. It is invoked once for
+  /// each object or list property that has been parsed.
+  /// The `key` argument is either the integer list index for a list property,
+  /// the string map key for object properties, or `null` for the final result.
+  ///
+  /// If [reviver] is omitted, it defaults to returning the value argument.
+  ///
+  /// The [toEncodable] function is used during encoding. It is invoked for
+  /// values that are not directly encodable to a string (a value that is not a
+  /// number, boolean, string, null, list or a map with string keys). The
+  /// function must return an object that is directly encodable. The elements of
+  /// a returned list and values of a returned map do not need to be directly
+  /// encodable, and if they aren't, `toEncodable` will be used on them as well.
+  /// Please notice that it is possible to cause an infinite recursive regress
+  /// in this way, by effectively creating an infinite data structure through
+  /// repeated call to `toEncodable`.
+  ///
+  /// If [toEncodable] is omitted, it defaults to a function that returns the
+  /// result of calling `.toJson()` on the unencodable object.
   const JsonCodec({reviver(Object key, Object value), toEncodable(var object)})
       : _reviver = reviver,
         _toEncodable = toEncodable;
 
-  /**
-   * Creates a `JsonCodec` with the given reviver.
-   *
-   * The [reviver] function is called once for each object or list property
-   * that has been parsed during decoding. The `key` argument is either the
-   * integer list index for a list property, the string map key for object
-   * properties, or `null` for the final result.
-   */
+  /// Creates a `JsonCodec` with the given reviver.
+  ///
+  /// The [reviver] function is called once for each object or list property
+  /// that has been parsed during decoding. The `key` argument is either the
+  /// integer list index for a list property, the string map key for object
+  /// properties, or `null` for the final result.
   JsonCodec.withReviver(reviver(Object key, Object value))
       : this(reviver: reviver);
 
-  /**
-   * Parses the string and returns the resulting Json object.
-   *
-   * The optional [reviver] function is called once for each object or list
-   * property that has been parsed during decoding. The `key` argument is either
-   * the integer list index for a list property, the string map key for object
-   * properties, or `null` for the final result.
-   *
-   * The default [reviver] (when not provided) is the identity function.
-   */
+  /// Parses the string and returns the resulting Json object.
+  ///
+  /// The optional [reviver] function is called once for each object or list
+  /// property that has been parsed during decoding. The `key` argument is either
+  /// the integer list index for a list property, the string map key for object
+  /// properties, or `null` for the final result.
+  ///
+  /// The default [reviver] (when not provided) is the identity function.
   dynamic decode(String source, {reviver(Object key, Object value)}) {
-    if (reviver == null) reviver = _reviver;
+    reviver ??= _reviver;
     if (reviver == null) return decoder.convert(source);
-    return new JsonDecoder(reviver).convert(source);
+    return JsonDecoder(reviver).convert(source);
   }
 
-  /**
-   * Converts [value] to a JSON string.
-   *
-   * If value contains objects that are not directly encodable to a JSON
-   * string (a value that is not a number, boolean, string, null, list or a map
-   * with string keys), the [toEncodable] function is used to convert it to an
-   * object that must be directly encodable.
-   *
-   * If [toEncodable] is omitted, it defaults to a function that returns the
-   * result of calling `.toJson()` on the unencodable object.
-   */
+  /// Converts [value] to a JSON string.
+  ///
+  /// If value contains objects that are not directly encodable to a JSON
+  /// string (a value that is not a number, boolean, string, null, list or a map
+  /// with string keys), the [toEncodable] function is used to convert it to an
+  /// object that must be directly encodable.
+  ///
+  /// If [toEncodable] is omitted, it defaults to a function that returns the
+  /// result of calling `.toJson()` on the unencodable object.
   String encode(Object value, {toEncodable(object)}) {
-    if (toEncodable == null) toEncodable = _toEncodable;
+    toEncodable ??= _toEncodable;
     if (toEncodable == null) return encoder.convert(value);
-    return new JsonEncoder(toEncodable).convert(value);
+    return JsonEncoder(toEncodable).convert(value);
   }
 
   JsonEncoder get encoder {
     if (_toEncodable == null) return const JsonEncoder();
-    return new JsonEncoder(_toEncodable);
+    return JsonEncoder(_toEncodable);
   }
 
   JsonDecoder get decoder {
     if (_reviver == null) return const JsonDecoder();
-    return new JsonDecoder(_reviver);
+    return JsonDecoder(_reviver);
   }
 }
 
-/**
- * This class converts JSON objects to strings.
- */
+/// This class converts JSON objects to strings.
 class JsonEncoder extends Converter<Object, String> {
-  /**
-   * The string used for indention.
-   *
-   * When generating multi-line output, this string is inserted once at the
-   * beginning of each indented line for each level of indentation.
-   *
-   * If `null`, the output is encoded as a single line.
-   */
+  /// The string used for indention.
+  ///
+  /// When generating multi-line output, this string is inserted once at the
+  /// beginning of each indented line for each level of indentation.
+  ///
+  /// If `null`, the output is encoded as a single line.
   final String indent;
 
-  /**
-   * Function called on non-encodable objects to return a replacement
-   * encodable object that will be encoded in the orignal's place.
-   */
+  /// Function called on non-encodable objects to return a replacement
+  /// encodable object that will be encoded in the orignal's place.
   final _ToEncodable _toEncodable;
 
-  /**
-   * Creates a JSON encoder.
-   *
-   * The JSON encoder handles numbers, strings, booleans, null, lists and
-   * maps with string keys directly.
-   *
-   * Any other object is attempted converted by [toEncodable] to an
-   * object that is of one of the convertible types.
-   *
-   * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
-   * the object.
-   */
+  /// Creates a JSON encoder.
+  ///
+  /// The JSON encoder handles numbers, strings, booleans, null, lists and
+  /// maps with string keys directly.
+  ///
+  /// Any other object is attempted converted by [toEncodable] to an
+  /// object that is of one of the convertible types.
+  ///
+  /// If [toEncodable] is omitted, it defaults to calling `.toJson()` on
+  /// the object.
   const JsonEncoder([toEncodable(object)])
-      : this.indent = null,
-        this._toEncodable = toEncodable;
+      : indent = null,
+        _toEncodable = toEncodable;
 
-  /**
-   * Creates a JSON encoder that creates multi-line JSON.
-   *
-   * The encoding of elements of lists and maps are indented and put on separate
-   * lines. The [indent] string is prepended to these elements, once for each
-   * level of indentation.
-   *
-   * If [indent] is `null`, the output is encoded as a single line.
-   *
-   * The JSON encoder handles numbers, strings, booleans, null, lists and
-   * maps with string keys directly.
-   *
-   * Any other object is attempted converted by [toEncodable] to an
-   * object that is of one of the convertible types.
-   *
-   * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
-   * the object.
-   */
+  /// Creates a JSON encoder that creates multi-line JSON.
+  ///
+  /// The encoding of elements of lists and maps are indented and put on separate
+  /// lines. The [indent] string is prepended to these elements, once for each
+  /// level of indentation.
+  ///
+  /// If [indent] is `null`, the output is encoded as a single line.
+  ///
+  /// The JSON encoder handles numbers, strings, booleans, null, lists and
+  /// maps with string keys directly.
+  ///
+  /// Any other object is attempted converted by [toEncodable] to an
+  /// object that is of one of the convertible types.
+  ///
+  /// If [toEncodable] is omitted, it defaults to calling `.toJson()` on
+  /// the object.
   const JsonEncoder.withIndent(this.indent, [toEncodable(object)])
-      : this._toEncodable = toEncodable;
+      : _toEncodable = toEncodable;
 
-  /**
-   * Converts [object] to a JSON [String].
-   *
-   * Directly serializable values are [num], [String], [bool], and [Null], as
-   * well as some [List] and [Map] values. For [List], the elements must all be
-   * serializable. For [Map], the keys must be [String] and the values must be
-   * serializable.
-   *
-   * If a value of any other type is attempted to be serialized, the
-   * `toEncodable` function provided in the constructor is called with the value
-   * as argument. The result, which must be a directly serializable value, is
-   * serialized instead of the original value.
-   *
-   * If the conversion throws, or returns a value that is not directly
-   * serializable, a [JsonUnsupportedObjectError] exception is thrown.
-   * If the call throws, the error is caught and stored in the
-   * [JsonUnsupportedObjectError]'s [:cause:] field.
-   *
-   * If a [List] or [Map] contains a reference to itself, directly or through
-   * other lists or maps, it cannot be serialized and a [JsonCyclicError] is
-   * thrown.
-   *
-   * [object] should not change during serialization.
-   *
-   * If an object is serialized more than once, [convert] may cache the text
-   * for it. In other words, if the content of an object changes after it is
-   * first serialized, the new values may not be reflected in the result.
-   */
+  /// Converts [object] to a JSON [String].
+  ///
+  /// Directly serializable values are [num], [String], [bool], and [Null], as
+  /// well as some [List] and [Map] values. For [List], the elements must all be
+  /// serializable. For [Map], the keys must be [String] and the values must be
+  /// serializable.
+  ///
+  /// If a value of any other type is attempted to be serialized, the
+  /// `toEncodable` function provided in the constructor is called with the value
+  /// as argument. The result, which must be a directly serializable value, is
+  /// serialized instead of the original value.
+  ///
+  /// If the conversion throws, or returns a value that is not directly
+  /// serializable, a [JsonUnsupportedObjectError] exception is thrown.
+  /// If the call throws, the error is caught and stored in the
+  /// [JsonUnsupportedObjectError]'s [:cause:] field.
+  ///
+  /// If a [List] or [Map] contains a reference to itself, directly or through
+  /// other lists or maps, it cannot be serialized and a [JsonCyclicError] is
+  /// thrown.
+  ///
+  /// [object] should not change during serialization.
+  ///
+  /// If an object is serialized more than once, [convert] may cache the text
+  /// for it. In other words, if the content of an object changes after it is
+  /// first serialized, the new values may not be reflected in the result.
   String convert(Object object) =>
       _JsonStringStringifier.stringify(object, _toEncodable, indent);
 
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   *
-   * Returns a chunked-conversion sink that accepts at most one object. It is
-   * an error to invoke `add` more than once on the returned sink.
-   */
+  /// Starts a chunked conversion.
+  ///
+  /// The converter works more efficiently if the given [sink] is a
+  /// [StringConversionSink].
+  ///
+  /// Returns a chunked-conversion sink that accepts at most one object. It is
+  /// an error to invoke `add` more than once on the returned sink.
   ChunkedConversionSink<Object> startChunkedConversion(Sink<String> sink) {
-    if (sink is! StringConversionSink) {
-      sink = new StringConversionSink.from(sink);
-    } else if (sink is _Utf8EncoderSink) {
-      return new _JsonUtf8EncoderSink(
+    if (sink is _Utf8EncoderSink) {
+      return _JsonUtf8EncoderSink(
           sink._sink,
           _toEncodable,
           JsonUtf8Encoder._utf8Encode(indent),
           JsonUtf8Encoder._defaultBufferSize);
     }
-    return new _JsonEncoderSink(sink, _toEncodable, indent);
+    return _JsonEncoderSink(
+        sink is StringConversionSink ? sink : StringConversionSink.from(sink),
+        _toEncodable,
+        indent);
   }
 
   // Override the base class's bind, to provide a better type.
   Stream<String> bind(Stream<Object> stream) => super.bind(stream);
 
   Converter<Object, T> fuse<T>(Converter<String, T> other) {
-    if (other is Utf8Encoder) {
+    if (other is Utf8Encoder && T is List<int>) {
       // The instance check guarantees that `T` is (a subtype of) List<int>,
       // but the static type system doesn't know that, and so we cast.
       // Cast through dynamic to keep the cast implicit for builds using
       // unchecked implicit casts.
-      return new JsonUtf8Encoder(indent, _toEncodable) as dynamic;
+      return JsonUtf8Encoder(indent, _toEncodable) as dynamic;
     }
     return super.fuse<T>(other);
   }
 }
 
-/**
- * Encoder that encodes a single object as a UTF-8 encoded JSON string.
- *
- * This encoder works equivalently to first converting the object to
- * a JSON string, and then UTF-8 encoding the string, but without
- * creating an intermediate string.
- */
+/// Encoder that encodes a single object as a UTF-8 encoded JSON string.
+///
+/// This encoder works equivalently to first converting the object to
+/// a JSON string, and then UTF-8 encoding the string, but without
+/// creating an intermediate string.
 class JsonUtf8Encoder extends Converter<Object, List<int>> {
-  /** Default buffer size used by the JSON-to-UTF-8 encoder. */
+  /// Default buffer size used by the JSON-to-UTF-8 encoder.
   static const int _defaultBufferSize = 256;
   @deprecated
   static const int DEFAULT_BUFFER_SIZE = _defaultBufferSize;
-  /** Indentation used in pretty-print mode, `null` if not pretty. */
+
+  /// Indentation used in pretty-print mode, `null` if not pretty.
   final List<int> _indent;
-  /** Function called with each un-encodable object encountered. */
+
+  /// Function called with each un-encodable object encountered.
   final _ToEncodable _toEncodable;
-  /** UTF-8 buffer size. */
+
+  /// UTF-8 buffer size.
   final int _bufferSize;
 
-  /**
-   * Create converter.
-   *
-   * If [indent] is non-`null`, the converter attempts to "pretty-print" the
-   * JSON, and uses `indent` as the indentation. Otherwise the result has no
-   * whitespace outside of string literals.
-   * If `indent` contains characters that are not valid JSON whitespace
-   * characters, the result will not be valid JSON. JSON whitespace characters
-   * are space (U+0020), tab (U+0009), line feed (U+000a) and carriage return
-   * (U+000d) ([ECMA
-   * 404](http://www.ecma-international.org/publications/standards/Ecma-404.htm)).
-   *
-   * The [bufferSize] is the size of the internal buffers used to collect
-   * UTF-8 code units.
-   * If using [startChunkedConversion], it will be the size of the chunks.
-   *
-   * The JSON encoder handles numbers, strings, booleans, null, lists and maps
-   * directly.
-   *
-   * Any other object is attempted converted by [toEncodable] to an object that
-   * is of one of the convertible types.
-   *
-   * If [toEncodable] is omitted, it defaults to calling `.toJson()` on the
-   * object.
-   */
+  /// Create converter.
+  ///
+  /// If [indent] is non-`null`, the converter attempts to "pretty-print" the
+  /// JSON, and uses `indent` as the indentation. Otherwise the result has no
+  /// whitespace outside of string literals.
+  /// If `indent` contains characters that are not valid JSON whitespace
+  /// characters, the result will not be valid JSON. JSON whitespace characters
+  /// are space (U+0020), tab (U+0009), line feed (U+000a) and carriage return
+  /// (U+000d) ([ECMA
+  /// 404](http://www.ecma-international.org/publications/standards/Ecma-404.htm)).
+  ///
+  /// The [bufferSize] is the size of the internal buffers used to collect
+  /// UTF-8 code units.
+  /// If using [startChunkedConversion], it will be the size of the chunks.
+  ///
+  /// The JSON encoder handles numbers, strings, booleans, null, lists and maps
+  /// directly.
+  ///
+  /// Any other object is attempted converted by [toEncodable] to an object that
+  /// is of one of the convertible types.
+  ///
+  /// If [toEncodable] is omitted, it defaults to calling `.toJson()` on the
+  /// object.
   JsonUtf8Encoder(
       [String indent, toEncodable(object), int bufferSize = _defaultBufferSize])
       : _indent = _utf8Encode(indent),
@@ -373,10 +339,10 @@
 
   static List<int> _utf8Encode(String string) {
     if (string == null) return null;
-    if (string.isEmpty) return new Uint8List(0);
+    if (string.isEmpty) return Uint8List(0);
     checkAscii:
     {
-      for (int i = 0; i < string.length; i++) {
+      for (var i = 0; i < string.length; i++) {
         if (string.codeUnitAt(i) >= 0x80) break checkAscii;
       }
       return string.codeUnits;
@@ -384,16 +350,16 @@
     return utf8.encode(string);
   }
 
-  /** Convert [object] into UTF-8 encoded JSON. */
+  /// Convert [object] into UTF-8 encoded JSON.
   List<int> convert(Object object) {
-    List<List<int>> bytes = [];
+    var bytes = <List<int>>[];
     // The `stringify` function always converts into chunks.
     // Collect the chunks into the `bytes` list, then combine them afterwards.
     void addChunk(Uint8List chunk, int start, int end) {
       if (start > 0 || end < chunk.length) {
-        int length = end - start;
-        chunk = new Uint8List.view(
-            chunk.buffer, chunk.offsetInBytes + start, length);
+        var length = end - start;
+        chunk =
+            Uint8List.view(chunk.buffer, chunk.offsetInBytes + start, length);
       }
       bytes.add(chunk);
     }
@@ -401,12 +367,12 @@
     _JsonUtf8Stringifier.stringify(
         object, _indent, _toEncodable, _bufferSize, addChunk);
     if (bytes.length == 1) return bytes[0];
-    int length = 0;
-    for (int i = 0; i < bytes.length; i++) {
+    var length = 0;
+    for (var i = 0; i < bytes.length; i++) {
       length += bytes[i].length;
     }
-    Uint8List result = new Uint8List(length);
-    for (int i = 0, offset = 0; i < bytes.length; i++) {
+    var result = Uint8List(length);
+    for (var i = 0, offset = 0; i < bytes.length; i++) {
       var byteList = bytes[i];
       int end = offset + byteList.length;
       result.setRange(offset, end, byteList);
@@ -415,23 +381,20 @@
     return result;
   }
 
-  /**
-   * Start a chunked conversion.
-   *
-   * Only one object can be passed into the returned sink.
-   *
-   * The argument [sink] will receive byte lists in sizes depending on the
-   * `bufferSize` passed to the constructor when creating this encoder.
-   */
+  /// Start a chunked conversion.
+  ///
+  /// Only one object can be passed into the returned sink.
+  ///
+  /// The argument [sink] will receive byte lists in sizes depending on the
+  /// `bufferSize` passed to the constructor when creating this encoder.
   ChunkedConversionSink<Object> startChunkedConversion(Sink<List<int>> sink) {
     ByteConversionSink byteSink;
     if (sink is ByteConversionSink) {
       byteSink = sink;
     } else {
-      byteSink = new ByteConversionSink.from(sink);
+      byteSink = ByteConversionSink.from(sink);
     }
-    return new _JsonUtf8EncoderSink(
-        byteSink, _toEncodable, _indent, _bufferSize);
+    return _JsonUtf8EncoderSink(byteSink, _toEncodable, _indent, _bufferSize);
   }
 
   // Override the base class's bind, to provide a better type.
@@ -440,11 +403,9 @@
   }
 }
 
-/**
- * Implements the chunked conversion from object to its JSON representation.
- *
- * The sink only accepts one value, but will produce output in a chunked way.
- */
+/// Implements the chunked conversion from object to its JSON representation.
+///
+/// The sink only accepts one value, but will produce output in a chunked way.
 class _JsonEncoderSink extends ChunkedConversionSink<Object> {
   final String _indent;
   final _ToEncodable _toEncodable;
@@ -453,19 +414,17 @@
 
   _JsonEncoderSink(this._sink, this._toEncodable, this._indent);
 
-  /**
-   * Encodes the given object [o].
-   *
-   * It is an error to invoke this method more than once on any instance. While
-   * this makes the input effectively non-chunked the output will be generated
-   * in a chunked way.
-   */
+  /// Encodes the given object [o].
+  ///
+  /// It is an error to invoke this method more than once on any instance. While
+  /// this makes the input effectively non-chunked the output will be generated
+  /// in a chunked way.
   void add(Object o) {
     if (_isDone) {
-      throw new StateError("Only one call to add allowed");
+      throw StateError("Only one call to add allowed");
     }
     _isDone = true;
-    ClosableStringSink stringSink = _sink.asStringSink();
+    var stringSink = _sink.asStringSink();
     _JsonStringStringifier.printOn(o, stringSink, _toEncodable, _indent);
     stringSink.close();
   }
@@ -473,11 +432,9 @@
   void close() {/* do nothing */}
 }
 
-/**
- * Sink returned when starting a chunked conversion from object to bytes.
- */
+/// Sink returned when starting a chunked conversion from object to bytes.
 class _JsonUtf8EncoderSink extends ChunkedConversionSink<Object> {
-  /** The byte sink receiveing the encoded chunks. */
+  /// The byte sink receiveing the encoded chunks.
   final ByteConversionSink _sink;
   final List<int> _indent;
   final _ToEncodable _toEncodable;
@@ -486,14 +443,14 @@
   _JsonUtf8EncoderSink(
       this._sink, this._toEncodable, this._indent, this._bufferSize);
 
-  /** Callback called for each slice of result bytes. */
+  /// Callback called for each slice of result bytes.
   void _addChunk(Uint8List chunk, int start, int end) {
     _sink.addSlice(chunk, start, end, false);
   }
 
   void add(Object object) {
     if (_isDone) {
-      throw new StateError("Only one call to add allowed");
+      throw StateError("Only one call to add allowed");
     }
     _isDone = true;
     _JsonUtf8Stringifier.stringify(
@@ -509,41 +466,33 @@
   }
 }
 
-/**
- * This class parses JSON strings and builds the corresponding objects.
- */
+/// This class parses JSON strings and builds the corresponding objects.
 class JsonDecoder extends Converter<String, Object> {
   final _Reviver _reviver;
-  /**
-   * Constructs a new JsonDecoder.
-   *
-   * The [reviver] may be `null`.
-   */
-  const JsonDecoder([reviver(Object key, Object value)])
-      : this._reviver = reviver;
 
-  /**
-   * Converts the given JSON-string [input] to its corresponding object.
-   *
-   * Parsed JSON values are of the types [num], [String], [bool], [Null],
-   * [List]s of parsed JSON values or [Map]s from [String] to parsed JSON
-   * values.
-   *
-   * If `this` was initialized with a reviver, then the parsing operation
-   * invokes the reviver on every object or list property that has been parsed.
-   * The arguments are the property name ([String]) or list index ([int]), and
-   * the value is the parsed value. The return value of the reviver is used as
-   * the value of that property instead the parsed value.
-   *
-   * Throws [FormatException] if the input is not valid JSON text.
-   */
+  /// Constructs a new JsonDecoder.
+  ///
+  /// The [reviver] may be `null`.
+  const JsonDecoder([reviver(Object key, Object value)]) : _reviver = reviver;
+
+  /// Converts the given JSON-string [input] to its corresponding object.
+  ///
+  /// Parsed JSON values are of the types [num], [String], [bool], [Null],
+  /// [List]s of parsed JSON values or [Map]s from [String] to parsed JSON
+  /// values.
+  ///
+  /// If `this` was initialized with a reviver, then the parsing operation
+  /// invokes the reviver on every object or list property that has been parsed.
+  /// The arguments are the property name ([String]) or list index ([int]), and
+  /// the value is the parsed value. The return value of the reviver is used as
+  /// the value of that property instead the parsed value.
+  ///
+  /// Throws [FormatException] if the input is not valid JSON text.
   dynamic convert(String input) => _parseJson(input, _reviver);
 
-  /**
-   * Starts a conversion from a chunked JSON string to its corresponding object.
-   *
-   * The output [sink] receives exactly one decoded element through `add`.
-   */
+  /// Starts a conversion from a chunked JSON string to its corresponding object.
+  ///
+  /// The output [sink] receives exactly one decoded element through `add`.
   external StringConversionSink startChunkedConversion(Sink<Object> sink);
 
   // Override the base class's bind, to provide a better type.
@@ -557,12 +506,10 @@
 
 dynamic _defaultToEncodable(dynamic object) => object.toJson();
 
-/**
- * JSON encoder that traverses an object structure and writes JSON source.
- *
- * This is an abstract implementation that doesn't decide on the output
- * format, but writes the JSON through abstract methods like [writeString].
- */
+/// JSON encoder that traverses an object structure and writes JSON source.
+///
+/// This is an abstract implementation that doesn't decide on the output
+/// format, but writes the JSON through abstract methods like [writeString].
 abstract class _JsonStringifier {
   // Character code constants.
   static const int backspace = 0x08;
@@ -580,9 +527,10 @@
   static const int char_t = 0x74;
   static const int char_u = 0x75;
 
-  /** List of objects currently being traversed. Used to detect cycles. */
-  final List _seen = new List();
-  /** Function called for each un-encodable object encountered. */
+  /// List of objects currently being traversed. Used to detect cycles.
+  final List _seen = [];
+
+  /// Function called for each un-encodable object encountered.
   final _ToEncodable _toEncodable;
 
   _JsonStringifier(toEncodable(o))
@@ -590,26 +538,27 @@
 
   String get _partialResult;
 
-  /** Append a string to the JSON output. */
+  /// Append a string to the JSON output.
   void writeString(String characters);
-  /** Append part of a string to the JSON output. */
+
+  /// Append part of a string to the JSON output.
   void writeStringSlice(String characters, int start, int end);
-  /** Append a single character, given by its code point, to the JSON output. */
+
+  /// Append a single character, given by its code point, to the JSON output.
   void writeCharCode(int charCode);
-  /** Write a number to the JSON output. */
+
+  /// Write a number to the JSON output.
   void writeNumber(num number);
 
   // ('0' + x) or ('a' + x - 10)
   static int hexDigit(int x) => x < 10 ? 48 + x : 87 + x;
 
-  /**
-   * Write, and suitably escape, a string's content as a JSON string literal.
-   */
+  /// Write, and suitably escape, a string's content as a JSON string literal.
   void writeStringContent(String s) {
-    int offset = 0;
-    final int length = s.length;
-    for (int i = 0; i < length; i++) {
-      int charCode = s.codeUnitAt(i);
+    var offset = 0;
+    final length = s.length;
+    for (var i = 0; i < length; i++) {
+      var charCode = s.codeUnitAt(i);
       if (charCode > backslash) continue;
       if (charCode < 32) {
         if (i > offset) writeStringSlice(s, offset, i);
@@ -653,39 +602,33 @@
     }
   }
 
-  /**
-   * Check if an encountered object is already being traversed.
-   *
-   * Records the object if it isn't already seen. Should have a matching call to
-   * [_removeSeen] when the object is no longer being traversed.
-   */
+  /// Check if an encountered object is already being traversed.
+  ///
+  /// Records the object if it isn't already seen. Should have a matching call to
+  /// [_removeSeen] when the object is no longer being traversed.
   void _checkCycle(object) {
-    for (int i = 0; i < _seen.length; i++) {
+    for (var i = 0; i < _seen.length; i++) {
       if (identical(object, _seen[i])) {
-        throw new JsonCyclicError(object);
+        throw JsonCyclicError(object);
       }
     }
     _seen.add(object);
   }
 
-  /**
-   * Remove [object] from the list of currently traversed objects.
-   *
-   * Should be called in the opposite order of the matching [_checkCycle]
-   * calls.
-   */
+  /// Remove [object] from the list of currently traversed objects.
+  ///
+  /// Should be called in the opposite order of the matching [_checkCycle]
+  /// calls.
   void _removeSeen(object) {
-    assert(!_seen.isEmpty);
+    assert(_seen.isNotEmpty);
     assert(identical(_seen.last, object));
     _seen.removeLast();
   }
 
-  /**
-   * Write an object.
-   *
-   * If [object] isn't directly encodable, the [_toEncodable] function gets one
-   * chance to return a replacement which is encodable.
-   */
+  /// Write an object.
+  ///
+  /// If [object] isn't directly encodable, the [_toEncodable] function gets one
+  /// chance to return a replacement which is encodable.
   void writeObject(object) {
     // Tries stringifying object directly. If it's not a simple value, List or
     // Map, call toJson() to get a custom representation and try serializing
@@ -695,22 +638,19 @@
     try {
       var customJson = _toEncodable(object);
       if (!writeJsonValue(customJson)) {
-        throw new JsonUnsupportedObjectError(object,
-            partialResult: _partialResult);
+        throw JsonUnsupportedObjectError(object, partialResult: _partialResult);
       }
       _removeSeen(object);
     } catch (e) {
-      throw new JsonUnsupportedObjectError(object,
+      throw JsonUnsupportedObjectError(object,
           cause: e, partialResult: _partialResult);
     }
   }
 
-  /**
-   * Serialize a [num], [String], [bool], [Null], [List] or [Map] value.
-   *
-   * Returns true if the value is one of these types, and false if not.
-   * If a value is both a [List] and a [Map], it's serialized as a [List].
-   */
+  /// Serialize a [num], [String], [bool], [Null], [List] or [Map] value.
+  ///
+  /// Returns true if the value is one of these types, and false if not.
+  /// If a value is both a [List] and a [Map], it's serialized as a [List].
   bool writeJsonValue(object) {
     if (object is num) {
       if (!object.isFinite) return false;
@@ -746,12 +686,12 @@
     }
   }
 
-  /** Serialize a [List]. */
+  /// Serialize a [List].
   void writeList(List list) {
     writeString('[');
-    if (list.length > 0) {
+    if (list.isNotEmpty) {
       writeObject(list[0]);
-      for (int i = 1; i < list.length; i++) {
+      for (var i = 1; i < list.length; i++) {
         writeString(',');
         writeObject(list[i]);
       }
@@ -759,15 +699,15 @@
     writeString(']');
   }
 
-  /** Serialize a [Map]. */
+  /// Serialize a [Map].
   bool writeMap(Map map) {
     if (map.isEmpty) {
       writeString("{}");
       return true;
     }
-    List keyValueList = new List(map.length * 2);
-    int i = 0;
-    bool allStringKeys = true;
+    var keyValueList = List(map.length * 2);
+    var i = 0;
+    var allStringKeys = true;
     map.forEach((key, value) {
       if (key is! String) {
         allStringKeys = false;
@@ -777,8 +717,8 @@
     });
     if (!allStringKeys) return false;
     writeString('{');
-    String separator = '"';
-    for (int i = 0; i < keyValueList.length; i += 2) {
+    var separator = '"';
+    for (var i = 0; i < keyValueList.length; i += 2) {
       writeString(separator);
       separator = ',"';
       writeStringContent(keyValueList[i]);
@@ -790,18 +730,14 @@
   }
 }
 
-/**
- * A modification of [_JsonStringifier] which indents the contents of [List] and
- * [Map] objects using the specified indent value.
- *
- * Subclasses should implement [writeIndentation].
- */
+/// A modification of [_JsonStringifier] which indents the contents of [List] and
+/// [Map] objects using the specified indent value.
+///
+/// Subclasses should implement [writeIndentation].
 abstract class _JsonPrettyPrintMixin implements _JsonStringifier {
   int _indentLevel = 0;
 
-  /**
-   * Add [indentLevel] indentations to the JSON output.
-   */
+  /// Add [indentLevel] indentations to the JSON output.
   void writeIndentation(int indentLevel);
 
   void writeList(List list) {
@@ -812,7 +748,7 @@
       _indentLevel++;
       writeIndentation(_indentLevel);
       writeObject(list[0]);
-      for (int i = 1; i < list.length; i++) {
+      for (var i = 1; i < list.length; i++) {
         writeString(',\n');
         writeIndentation(_indentLevel);
         writeObject(list[i]);
@@ -829,9 +765,9 @@
       writeString("{}");
       return true;
     }
-    List keyValueList = new List(map.length * 2);
-    int i = 0;
-    bool allStringKeys = true;
+    var keyValueList = List(map.length * 2);
+    var i = 0;
+    var allStringKeys = true;
     map.forEach((key, value) {
       if (key is! String) {
         allStringKeys = false;
@@ -842,8 +778,8 @@
     if (!allStringKeys) return false;
     writeString('{\n');
     _indentLevel++;
-    String separator = "";
-    for (int i = 0; i < keyValueList.length; i += 2) {
+    var separator = "";
+    for (var i = 0; i < keyValueList.length; i += 2) {
       writeString(separator);
       separator = ",\n";
       writeIndentation(_indentLevel);
@@ -860,44 +796,38 @@
   }
 }
 
-/**
- * A specialziation of [_JsonStringifier] that writes its JSON to a string.
- */
+/// A specialization of [_JsonStringifier] that writes its JSON to a string.
 class _JsonStringStringifier extends _JsonStringifier {
   final StringSink _sink;
 
-  _JsonStringStringifier(this._sink, _toEncodable) : super(_toEncodable);
+  _JsonStringStringifier(this._sink, dynamic Function(dynamic) _toEncodable)
+      : super(_toEncodable);
 
-  /**
-   * Convert object to a string.
-   *
-   * The [toEncodable] function is used to convert non-encodable objects
-   * to encodable ones.
-   *
-   * If [indent] is not `null`, the resulting JSON will be "pretty-printed"
-   * with newlines and indentation. The `indent` string is added as indentation
-   * for each indentation level. It should only contain valid JSON whitespace
-   * characters (space, tab, carriage return or line feed).
-   */
+  /// Convert object to a string.
+  ///
+  /// The [toEncodable] function is used to convert non-encodable objects
+  /// to encodable ones.
+  ///
+  /// If [indent] is not `null`, the resulting JSON will be "pretty-printed"
+  /// with newlines and indentation. The `indent` string is added as indentation
+  /// for each indentation level. It should only contain valid JSON whitespace
+  /// characters (space, tab, carriage return or line feed).
   static String stringify(object, toEncodable(o), String indent) {
-    StringBuffer output = new StringBuffer();
+    var output = StringBuffer();
     printOn(object, output, toEncodable, indent);
     return output.toString();
   }
 
-  /**
-   * Convert object to a string, and write the result to the [output] sink.
-   *
-   * The result is written piecemally to the sink.
-   */
+  /// Convert object to a string, and write the result to the [output] sink.
+  ///
+  /// The result is written piecemally to the sink.
   static void printOn(
       object, StringSink output, toEncodable(o), String indent) {
     _JsonStringifier stringifier;
     if (indent == null) {
-      stringifier = new _JsonStringStringifier(output, toEncodable);
+      stringifier = _JsonStringStringifier(output, toEncodable);
     } else {
-      stringifier =
-          new _JsonStringStringifierPretty(output, toEncodable, indent);
+      stringifier = _JsonStringStringifierPretty(output, toEncodable, indent);
     }
     stringifier.writeObject(object);
   }
@@ -929,57 +859,50 @@
       : super(sink, toEncodable);
 
   void writeIndentation(int count) {
-    for (int i = 0; i < count; i++) writeString(_indent);
+    for (var i = 0; i < count; i++) writeString(_indent);
   }
 }
 
 typedef void _AddChunk(Uint8List list, int start, int end);
 
-/**
- * Specialization of [_JsonStringifier] that writes the JSON as UTF-8.
- *
- * The JSON text is UTF-8 encoded and written to [Uint8List] buffers.
- * The buffers are then passed back to a user provided callback method.
- */
+/// Specialization of [_JsonStringifier] that writes the JSON as UTF-8.
+///
+/// The JSON text is UTF-8 encoded and written to [Uint8List] buffers.
+/// The buffers are then passed back to a user provided callback method.
 class _JsonUtf8Stringifier extends _JsonStringifier {
   final int bufferSize;
   final _AddChunk addChunk;
   Uint8List buffer;
   int index = 0;
 
-  _JsonUtf8Stringifier(toEncodable(o), int bufferSize, this.addChunk)
-      : this.bufferSize = bufferSize,
-        buffer = new Uint8List(bufferSize),
+  _JsonUtf8Stringifier(toEncodable(o), this.bufferSize, this.addChunk)
+      : buffer = Uint8List(bufferSize),
         super(toEncodable);
 
-  /**
-   * Convert [object] to UTF-8 encoded JSON.
-   *
-   * Calls [addChunk] with slices of UTF-8 code units.
-   * These will typically have size [bufferSize], but may be shorter.
-   * The buffers are not reused, so the [addChunk] call may keep and reuse the
-   * chunks.
-   *
-   * If [indent] is non-`null`, the result will be "pretty-printed" with extra
-   * newlines and indentation, using [indent] as the indentation.
-   */
+  /// Convert [object] to UTF-8 encoded JSON.
+  ///
+  /// Calls [addChunk] with slices of UTF-8 code units.
+  /// These will typically have size [bufferSize], but may be shorter.
+  /// The buffers are not reused, so the [addChunk] call may keep and reuse the
+  /// chunks.
+  ///
+  /// If [indent] is non-`null`, the result will be "pretty-printed" with extra
+  /// newlines and indentation, using [indent] as the indentation.
   static void stringify(Object object, List<int> indent, toEncodable(o),
       int bufferSize, void addChunk(Uint8List chunk, int start, int end)) {
     _JsonUtf8Stringifier stringifier;
     if (indent != null) {
-      stringifier = new _JsonUtf8StringifierPretty(
-          toEncodable, indent, bufferSize, addChunk);
+      stringifier =
+          _JsonUtf8StringifierPretty(toEncodable, indent, bufferSize, addChunk);
     } else {
-      stringifier = new _JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
+      stringifier = _JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
     }
     stringifier.writeObject(object);
     stringifier.flush();
   }
 
-  /**
-   * Must be called at the end to push the last chunk to the [addChunk]
-   * callback.
-   */
+  /// Must be called at the end to push the last chunk to the [addChunk]
+  /// callback.
   void flush() {
     if (index > 0) {
       addChunk(buffer, 0, index);
@@ -994,12 +917,12 @@
     writeAsciiString(number.toString());
   }
 
-  /** Write a string that is known to not have non-ASCII characters. */
+  /// Write a string that is known to not have non-ASCII characters.
   void writeAsciiString(String string) {
     // TODO(lrn): Optimize by copying directly into buffer instead of going
     // through writeCharCode;
-    for (int i = 0; i < string.length; i++) {
-      int char = string.codeUnitAt(i);
+    for (var i = 0; i < string.length; i++) {
+      var char = string.codeUnitAt(i);
       assert(char <= 0x7f);
       writeByte(char);
     }
@@ -1013,14 +936,14 @@
     // TODO(lrn): Optimize by copying directly into buffer instead of going
     // through writeCharCode/writeByte. Assumption is the most characters
     // in starings are plain ASCII.
-    for (int i = start; i < end; i++) {
-      int char = string.codeUnitAt(i);
+    for (var i = start; i < end; i++) {
+      var char = string.codeUnitAt(i);
       if (char <= 0x7f) {
         writeByte(char);
       } else {
         if ((char & 0xFC00) == 0xD800 && i + 1 < end) {
           // Lead surrogate.
-          int nextChar = string.codeUnitAt(i + 1);
+          var nextChar = string.codeUnitAt(i + 1);
           if ((nextChar & 0xFC00) == 0xDC00) {
             // Tail surrogate.
             char = 0x10000 + ((char & 0x3ff) << 10) + (nextChar & 0x3ff);
@@ -1069,28 +992,26 @@
     assert(byte <= 0xff);
     if (index == buffer.length) {
       addChunk(buffer, 0, index);
-      buffer = new Uint8List(bufferSize);
+      buffer = Uint8List(bufferSize);
       index = 0;
     }
     buffer[index++] = byte;
   }
 }
 
-/**
- * Pretty-printing version of [_JsonUtf8Stringifier].
- */
+/// Pretty-printing version of [_JsonUtf8Stringifier].
 class _JsonUtf8StringifierPretty extends _JsonUtf8Stringifier
     with _JsonPrettyPrintMixin {
   final List<int> indent;
-  _JsonUtf8StringifierPretty(toEncodable(o), this.indent, bufferSize,
+  _JsonUtf8StringifierPretty(toEncodable(o), this.indent, int bufferSize,
       void addChunk(Uint8List buffer, int start, int end))
       : super(toEncodable, bufferSize, addChunk);
 
   void writeIndentation(int count) {
-    List<int> indent = this.indent;
-    int indentLength = indent.length;
+    var indent = this.indent;
+    var indentLength = indent.length;
     if (indentLength == 1) {
-      int char = indent[0];
+      var char = indent[0];
       while (count > 0) {
         writeByte(char);
         count -= 1;
@@ -1099,12 +1020,12 @@
     }
     while (count > 0) {
       count--;
-      int end = index + indentLength;
+      var end = index + indentLength;
       if (end <= buffer.length) {
         buffer.setRange(index, end, indent);
         index = end;
       } else {
-        for (int i = 0; i < indentLength; i++) {
+        for (var i = 0; i < indentLength; i++) {
           writeByte(indent[i]);
         }
       }
diff --git a/sdk/lib/convert/latin1.dart b/sdk/lib/convert/latin1.dart
index e9c316d..c22010c 100644
--- a/sdk/lib/convert/latin1.dart
+++ b/sdk/lib/convert/latin1.dart
@@ -4,57 +4,51 @@
 
 part of dart.convert;
 
-/**
- * An instance of the default implementation of the [Latin1Codec].
- *
- * This instance provides a convenient access to the most common ISO Latin 1
- * use cases.
- *
- * Examples:
- * ```dart
- * var encoded = latin1.encode("blåbærgrød");
- * var decoded = latin1.decode([0x62, 0x6c, 0xe5, 0x62, 0xe6,
- *                              0x72, 0x67, 0x72, 0xf8, 0x64]);
- * ```
- */
-const Latin1Codec latin1 = const Latin1Codec();
+/// An instance of the default implementation of the [Latin1Codec].
+///
+/// This instance provides a convenient access to the most common ISO Latin 1
+/// use cases.
+///
+/// Examples:
+/// ```dart
+/// var encoded = latin1.encode("blåbærgrød");
+/// var decoded = latin1.decode([0x62, 0x6c, 0xe5, 0x62, 0xe6,
+///                              0x72, 0x67, 0x72, 0xf8, 0x64]);
+/// ```
+const Latin1Codec latin1 = Latin1Codec();
 
 const int _latin1Mask = 0xFF;
 
-/**
- * A [Latin1Codec] encodes strings to ISO Latin-1 (aka ISO-8859-1) bytes
- * and decodes Latin-1 bytes to strings.
- */
+/// A [Latin1Codec] encodes strings to ISO Latin-1 (aka ISO-8859-1) bytes
+/// and decodes Latin-1 bytes to strings.
 class Latin1Codec extends Encoding {
   final bool _allowInvalid;
-  /**
-   * Instantiates a new [Latin1Codec].
-   *
-   * If [allowInvalid] is true, the [decode] method and the converter
-   * returned by [decoder] will default to allowing invalid values. Invalid
-   * values are decoded into the Unicode Replacement character (U+FFFD).
-   * Calls to the [decode] method can override this default.
-   *
-   * Encoders will not accept invalid (non Latin-1) characters.
-   */
-  const Latin1Codec({bool allowInvalid: false}) : _allowInvalid = allowInvalid;
 
+  /// Instantiates a new [Latin1Codec].
+  ///
+  /// If [allowInvalid] is true, the [decode] method and the converter
+  /// returned by [decoder] will default to allowing invalid values. Invalid
+  /// values are decoded into the Unicode Replacement character (U+FFFD).
+  /// Calls to the [decode] method can override this default.
+  ///
+  /// Encoders will not accept invalid (non Latin-1) characters.
+  const Latin1Codec({bool allowInvalid = false}) : _allowInvalid = allowInvalid;
+
+  /// The name of this codec, "iso-8859-1".
   String get name => "iso-8859-1";
 
   Uint8List encode(String source) => encoder.convert(source);
 
-  /**
-   * Decodes the Latin-1 [bytes] (a list of unsigned 8-bit integers) to the
-   * corresponding string.
-   *
-   * If [bytes] contains values that are not in the range 0 .. 255, the decoder
-   * will eventually throw a [FormatException].
-   *
-   * If [allowInvalid] is not provided, it defaults to the value used to create
-   * this [Latin1Codec].
-   */
+  /// Decodes the Latin-1 [bytes] (a list of unsigned 8-bit integers) to the
+  /// corresponding string.
+  ///
+  /// If [bytes] contains values that are not in the range 0 .. 255, the decoder
+  /// will eventually throw a [FormatException].
+  ///
+  /// If [allowInvalid] is not provided, it defaults to the value used to create
+  /// this [Latin1Codec].
   String decode(List<int> bytes, {bool allowInvalid}) {
-    if (allowInvalid == null) allowInvalid = _allowInvalid;
+    allowInvalid ??= _allowInvalid;
     if (allowInvalid) {
       return const Latin1Decoder(allowInvalid: true).convert(bytes);
     } else {
@@ -69,47 +63,39 @@
       : const Latin1Decoder(allowInvalid: false);
 }
 
-/**
- * This class converts strings of only ISO Latin-1 characters to bytes.
- */
+/// This class converts strings of only ISO Latin-1 characters to bytes.
 class Latin1Encoder extends _UnicodeSubsetEncoder {
   const Latin1Encoder() : super(_latin1Mask);
 }
 
-/**
- * This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
- * to a string.
- */
+/// This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
+/// to a string.
 class Latin1Decoder extends _UnicodeSubsetDecoder {
-  /**
-   * Instantiates a new [Latin1Decoder].
-   *
-   * The optional [allowInvalid] argument defines how [convert] deals
-   * with invalid bytes.
-   *
-   * If it is `true`, [convert] replaces invalid bytes with the Unicode
-   * Replacement character `U+FFFD` (�).
-   * Otherwise it throws a [FormatException].
-   */
-  const Latin1Decoder({bool allowInvalid: false})
+  /// Instantiates a new [Latin1Decoder].
+  ///
+  /// The optional [allowInvalid] argument defines how [convert] deals
+  /// with invalid bytes.
+  ///
+  /// If it is `true`, [convert] replaces invalid bytes with the Unicode
+  /// Replacement character `U+FFFD` (�).
+  /// Otherwise it throws a [FormatException].
+  const Latin1Decoder({bool allowInvalid = false})
       : super(allowInvalid, _latin1Mask);
 
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   */
+  /// Starts a chunked conversion.
+  ///
+  /// The converter works more efficiently if the given [sink] is a
+  /// [StringConversionSink].
   ByteConversionSink startChunkedConversion(Sink<String> sink) {
     StringConversionSink stringSink;
     if (sink is StringConversionSink) {
       stringSink = sink;
     } else {
-      stringSink = new StringConversionSink.from(sink);
+      stringSink = StringConversionSink.from(sink);
     }
     // TODO(lrn): Use stringSink.asUtf16Sink() if it becomes available.
-    if (!_allowInvalid) return new _Latin1DecoderSink(stringSink);
-    return new _Latin1AllowInvalidDecoderSink(stringSink);
+    if (!_allowInvalid) return _Latin1DecoderSink(stringSink);
+    return _Latin1AllowInvalidDecoderSink(stringSink);
   }
 }
 
@@ -131,7 +117,7 @@
     // _sink.addSlice(source, start, end, isLast).
     // The code below is an moderately stupid workaround until a real
     // solution can be made.
-    _sink.add(new String.fromCharCodes(source, start, end));
+    _sink.add(String.fromCharCodes(source, start, end));
     if (isLast) close();
   }
 
@@ -148,8 +134,8 @@
   }
 
   static void _checkValidLatin1(List<int> source, int start, int end) {
-    int mask = 0;
-    for (int i = start; i < end; i++) {
+    var mask = 0;
+    for (var i = start; i < end; i++) {
       mask |= source[i];
     }
     if (mask >= 0 && mask <= _latin1Mask) {
@@ -160,10 +146,10 @@
 
   static void _reportInvalidLatin1(List<int> source, int start, int end) {
     // Find the index of the first non-Latin-1 character code.
-    for (int i = start; i < end; i++) {
-      int char = source[i];
+    for (var i = start; i < end; i++) {
+      var char = source[i];
       if (char < 0 || char > _latin1Mask) {
-        throw new FormatException(
+        throw FormatException(
             "Source contains non-Latin-1 characters.", source, i);
       }
     }
@@ -177,8 +163,8 @@
 
   void addSlice(List<int> source, int start, int end, bool isLast) {
     RangeError.checkValidRange(start, end, source.length);
-    for (int i = start; i < end; i++) {
-      int char = source[i];
+    for (var i = start; i < end; i++) {
+      var char = source[i];
       if (char > _latin1Mask || char < 0) {
         if (i > start) _addSliceToSink(source, start, i, false);
         // Add UTF-8 encoding of U+FFFD.
diff --git a/sdk/lib/convert/line_splitter.dart b/sdk/lib/convert/line_splitter.dart
index 2522b14..71be2c0 100644
--- a/sdk/lib/convert/line_splitter.dart
+++ b/sdk/lib/convert/line_splitter.dart
@@ -8,15 +8,13 @@
 const int _LF = 10;
 const int _CR = 13;
 
-/**
- * A [StreamTransformer] that splits a [String] into individual lines.
- *
- * A line is terminated by either a CR (U+000D), a LF (U+000A), a
- * CR+LF sequence (DOS line ending),
- * and a final non-empty line can be ended by the end of the string.
- *
- * The returned lines do not contain the line terminators.
- */
+/// A [StreamTransformer] that splits a [String] into individual lines.
+///
+/// A line is terminated by either a CR (U+000D), a LF (U+000A), a
+/// CR+LF sequence (DOS line ending),
+/// and a final non-empty line can be ended by the end of the string.
+///
+/// The returned lines do not contain the line terminators.
 
 class LineSplitter extends StreamTransformerBase<String, String> {
   const LineSplitter();
@@ -29,10 +27,10 @@
   /// (`0 <= start <= end <= lines.length`).
   static Iterable<String> split(String lines, [int start = 0, int end]) sync* {
     end = RangeError.checkValidRange(start, end, lines.length);
-    int sliceStart = start;
-    int char = 0;
-    for (int i = start; i < end; i++) {
-      int previousChar = char;
+    var sliceStart = start;
+    var char = 0;
+    for (var i = start; i < end; i++) {
+      var previousChar = char;
       char = lines.codeUnitAt(i);
       if (char != _CR) {
         if (char != _LF) continue;
@@ -50,12 +48,12 @@
   }
 
   List<String> convert(String data) {
-    List<String> lines = <String>[];
-    int end = data.length;
-    int sliceStart = 0;
-    int char = 0;
-    for (int i = 0; i < end; i++) {
-      int previousChar = char;
+    var lines = <String>[];
+    var end = data.length;
+    var sliceStart = 0;
+    var char = 0;
+    for (var i = 0; i < end; i++) {
+      var previousChar = char;
       char = data.codeUnitAt(i);
       if (char != _CR) {
         if (char != _LF) continue;
@@ -74,15 +72,13 @@
   }
 
   StringConversionSink startChunkedConversion(Sink<String> sink) {
-    if (sink is! StringConversionSink) {
-      sink = new StringConversionSink.from(sink);
-    }
-    return new _LineSplitterSink(sink);
+    return _LineSplitterSink(
+        sink is StringConversionSink ? sink : StringConversionSink.from(sink));
   }
 
   Stream<String> bind(Stream<String> stream) {
-    return new Stream<String>.eventTransformed(
-        stream, (EventSink<String> sink) => new _LineSplitterEventSink(sink));
+    return Stream<String>.eventTransformed(
+        stream, (EventSink<String> sink) => _LineSplitterEventSink(sink));
   }
 }
 
@@ -139,10 +135,10 @@
   }
 
   void _addLines(String lines, int start, int end) {
-    int sliceStart = start;
-    int char = 0;
-    for (int i = start; i < end; i++) {
-      int previousChar = char;
+    var sliceStart = start;
+    var char = 0;
+    for (var i = start; i < end; i++) {
+      var previousChar = char;
       char = lines.codeUnitAt(i);
       if (char != _CR) {
         if (char != _LF) continue;
@@ -168,7 +164,7 @@
 
   _LineSplitterEventSink(EventSink<String> eventSink)
       : _eventSink = eventSink,
-        super(new StringConversionSink.from(eventSink));
+        super(StringConversionSink.from(eventSink));
 
   void addError(Object o, [StackTrace stackTrace]) {
     _eventSink.addError(o, stackTrace);
diff --git a/sdk/lib/convert/string_conversion.dart b/sdk/lib/convert/string_conversion.dart
index 15ce510..6c2d31f 100644
--- a/sdk/lib/convert/string_conversion.dart
+++ b/sdk/lib/convert/string_conversion.dart
@@ -4,87 +4,69 @@
 
 part of dart.convert;
 
-/**
- * This class provides an interface for converters to
- * efficiently transmit String data.
- *
- * Instead of limiting the interface to one non-chunked String it accepts
- * partial strings or can be transformed into a byte sink that
- * accepts UTF-8 code units.
- *
- * This abstract class will likely get more methods over time. Implementers are
- * urged to extend [StringConversionSinkBase] or to mix in
- * [StringConversionSinkMixin], to ensure that their class covers the newly
- * added methods.
- */
+/// This class provides an interface for converters to
+/// efficiently transmit String data.
+///
+/// Instead of limiting the interface to one non-chunked String it accepts
+/// partial strings or can be transformed into a byte sink that
+/// accepts UTF-8 code units.
+///
+/// This abstract class will likely get more methods over time. Implementers are
+/// urged to extend [StringConversionSinkBase] or to mix in
+/// [StringConversionSinkMixin], to ensure that their class covers the newly
+/// added methods.
 abstract class StringConversionSink extends ChunkedConversionSink<String> {
   StringConversionSink();
   factory StringConversionSink.withCallback(void callback(String accumulated)) =
       _StringCallbackSink;
   factory StringConversionSink.from(Sink<String> sink) = _StringAdapterSink;
 
-  /**
-   * Creates a new instance wrapping the given [sink].
-   *
-   * Every string that is added to the returned instance is forwarded to
-   * the [sink]. The instance is allowed to buffer and is not required to
-   * forward immediately.
-   */
+  /// Creates a new instance wrapping the given [sink].
+  ///
+  /// Every string that is added to the returned instance is forwarded to
+  /// the [sink]. The instance is allowed to buffer and is not required to
+  /// forward immediately.
   factory StringConversionSink.fromStringSink(StringSink sink) =
-      _StringSinkConversionSink;
+      _StringSinkConversionSink<StringSink>;
 
-  /**
-   * Adds the next [chunk] to `this`.
-   *
-   * Adds the substring defined by [start] and [end]-exclusive to `this`.
-   *
-   * If [isLast] is `true` closes `this`.
-   */
+  /// Adds the next [chunk] to `this`.
+  ///
+  /// Adds the substring defined by [start] and [end]-exclusive to `this`.
+  ///
+  /// If [isLast] is `true` closes `this`.
   void addSlice(String chunk, int start, int end, bool isLast);
 
-  /**
-   * Returns `this` as a sink that accepts UTF-8 input.
-   *
-   * If used, this method must be the first and only call to `this`. It
-   * invalidates `this`. All further operations must be performed on the result.
-   */
+  /// Returns `this` as a sink that accepts UTF-8 input.
+  ///
+  /// If used, this method must be the first and only call to `this`. It
+  /// invalidates `this`. All further operations must be performed on the result.
   ByteConversionSink asUtf8Sink(bool allowMalformed);
   // - asRuneSink
   // - asCodeUnitsSink
 
-  /**
-   * Returns `this` as a [ClosableStringSink].
-   *
-   * If used, this method must be the first and only call to `this`. It
-   * invalidates `this`. All further operations must be performed on the result.
-   */
+  /// Returns `this` as a [ClosableStringSink].
+  ///
+  /// If used, this method must be the first and only call to `this`. It
+  /// invalidates `this`. All further operations must be performed on the result.
   ClosableStringSink asStringSink();
 }
 
-/**
- * A [ClosableStringSink] extends the [StringSink] interface by adding a
- * `close` method.
- */
+/// A [ClosableStringSink] extends the [StringSink] interface by adding a
+/// `close` method.
 abstract class ClosableStringSink extends StringSink {
-  /**
-   * Creates a new instance combining a [StringSink] [sink] and a callback
-   * [onClose] which is invoked when the returned instance is closed.
-   */
+  /// Creates a new instance combining a [StringSink] [sink] and a callback
+  /// [onClose] which is invoked when the returned instance is closed.
   factory ClosableStringSink.fromStringSink(StringSink sink, void onClose()) =
       _ClosableStringSink;
 
-  /**
-   * Closes `this` and flushes any outstanding data.
-   */
+  /// Closes `this` and flushes any outstanding data.
   void close();
 }
 
 typedef void _StringSinkCloseCallback();
 
-/**
- * This class wraps an existing [StringSink] and invokes a
- * closure when [close] is invoked.
- */
+/// This class wraps an existing [StringSink] and invokes a
+/// closure when [close] is invoked.
 class _ClosableStringSink implements ClosableStringSink {
   final _StringSinkCloseCallback _callback;
   final StringSink _sink;
@@ -112,11 +94,9 @@
   }
 }
 
-/**
- * This class wraps an existing [StringConversionSink] and exposes a
- * [ClosableStringSink] interface. The wrapped sink only needs to implement
- * `add` and `close`.
- */
+/// This class wraps an existing [StringConversionSink] and exposes a
+/// [ClosableStringSink] interface. The wrapped sink only needs to implement
+/// `add` and `close`.
 // TODO(floitsch): make this class public?
 class _StringConversionSinkAsStringSinkAdapter implements ClosableStringSink {
   static const _MIN_STRING_SIZE = 16;
@@ -125,7 +105,7 @@
   StringConversionSink _chunkedSink;
 
   _StringConversionSinkAsStringSinkAdapter(this._chunkedSink)
-      : _buffer = new StringBuffer();
+      : _buffer = StringBuffer();
 
   void close() {
     if (_buffer.isNotEmpty) _flush();
@@ -149,7 +129,7 @@
 
   void writeAll(Iterable objects, [String separator = ""]) {
     if (_buffer.isNotEmpty) _flush();
-    Iterator iterator = objects.iterator;
+    var iterator = objects.iterator;
     if (!iterator.moveNext()) return;
     if (separator.isEmpty) {
       do {
@@ -165,22 +145,18 @@
   }
 
   void _flush() {
-    String accumulated = _buffer.toString();
+    var accumulated = _buffer.toString();
     _buffer.clear();
     _chunkedSink.add(accumulated);
   }
 }
 
-/**
- * This class provides a base-class for converters that need to accept String
- * inputs.
- */
+/// This class provides a base-class for converters that need to accept String
+/// inputs.
 abstract class StringConversionSinkBase extends StringConversionSinkMixin {}
 
-/**
- * This class provides a mixin for converters that need to accept String
- * inputs.
- */
+/// This class provides a mixin for converters that need to accept String
+/// inputs.
 abstract class StringConversionSinkMixin implements StringConversionSink {
   void addSlice(String str, int start, int end, bool isLast);
   void close();
@@ -190,25 +166,24 @@
   }
 
   ByteConversionSink asUtf8Sink(bool allowMalformed) {
-    return new _Utf8ConversionSink(this, allowMalformed);
+    return _Utf8ConversionSink(this, allowMalformed);
   }
 
   ClosableStringSink asStringSink() {
-    return new _StringConversionSinkAsStringSinkAdapter(this);
+    return _StringConversionSinkAsStringSinkAdapter(this);
   }
 }
 
-/**
- * This class is a [StringConversionSink] that wraps a [StringSink].
- */
-class _StringSinkConversionSink extends StringConversionSinkBase {
-  StringSink _stringSink;
+/// This class is a [StringConversionSink] that wraps a [StringSink].
+class _StringSinkConversionSink<TStringSink extends StringSink>
+    extends StringConversionSinkBase {
+  TStringSink _stringSink;
   _StringSinkConversionSink(this._stringSink);
 
   void close() {}
   void addSlice(String str, int start, int end, bool isLast) {
     if (start != 0 || end != str.length) {
-      for (int i = start; i < end; i++) {
+      for (var i = start; i < end; i++) {
         _stringSink.writeCharCode(str.codeUnitAt(i));
       }
     } else {
@@ -222,43 +197,38 @@
   }
 
   ByteConversionSink asUtf8Sink(bool allowMalformed) {
-    return new _Utf8StringSinkAdapter(this, _stringSink, allowMalformed);
+    return _Utf8StringSinkAdapter(this, _stringSink, allowMalformed);
   }
 
   ClosableStringSink asStringSink() {
-    return new ClosableStringSink.fromStringSink(_stringSink, this.close);
+    return ClosableStringSink.fromStringSink(_stringSink, close);
   }
 }
 
-/**
- * This class accumulates all chunks into one string
- * and invokes a callback when the sink is closed.
- *
- * This class can be used to terminate a chunked conversion.
- */
-class _StringCallbackSink extends _StringSinkConversionSink {
+/// This class accumulates all chunks into one string
+/// and invokes a callback when the sink is closed.
+///
+/// This class can be used to terminate a chunked conversion.
+class _StringCallbackSink extends _StringSinkConversionSink<StringBuffer> {
   final _ChunkedConversionCallback<String> _callback;
-  _StringCallbackSink(this._callback) : super(new StringBuffer());
+  _StringCallbackSink(this._callback) : super(StringBuffer());
 
   void close() {
-    StringBuffer buffer = _stringSink;
-    String accumulated = buffer.toString();
-    buffer.clear();
+    var accumulated = _stringSink.toString();
+    _stringSink.clear();
     _callback(accumulated);
   }
 
   ByteConversionSink asUtf8Sink(bool allowMalformed) {
-    return new _Utf8StringSinkAdapter(this, _stringSink, allowMalformed);
+    return _Utf8StringSinkAdapter(this, _stringSink, allowMalformed);
   }
 }
 
-/**
- * This class adapts a simple [ChunkedConversionSink] to a
- * [StringConversionSink].
- *
- * All additional methods of the [StringConversionSink] (compared to the
- * ChunkedConversionSink) are redirected to the `add` method.
- */
+/// This class adapts a simple [ChunkedConversionSink] to a
+/// [StringConversionSink].
+///
+/// All additional methods of the [StringConversionSink] (compared to the
+/// ChunkedConversionSink) are redirected to the `add` method.
 class _StringAdapterSink extends StringConversionSinkBase {
   final Sink<String> _sink;
 
@@ -282,15 +252,13 @@
   }
 }
 
-/**
- * Decodes UTF-8 code units and stores them in a [StringSink].
- */
+/// Decodes UTF-8 code units and stores them in a [StringSink].
 class _Utf8StringSinkAdapter extends ByteConversionSink {
   final _Utf8Decoder _decoder;
   final Sink _sink;
 
   _Utf8StringSinkAdapter(this._sink, StringSink stringSink, bool allowMalformed)
-      : _decoder = new _Utf8Decoder(stringSink, allowMalformed);
+      : _decoder = _Utf8Decoder(stringSink, allowMalformed);
 
   void close() {
     _decoder.close();
@@ -308,28 +276,26 @@
   }
 }
 
-/**
- * Decodes UTF-8 code units.
- *
- * Forwards the decoded strings to the given [StringConversionSink].
- */
+/// Decodes UTF-8 code units.
+///
+/// Forwards the decoded strings to the given [StringConversionSink].
 // TODO(floitsch): make this class public?
 class _Utf8ConversionSink extends ByteConversionSink {
   final _Utf8Decoder _decoder;
   final StringConversionSink _chunkedSink;
   final StringBuffer _buffer;
   _Utf8ConversionSink(StringConversionSink sink, bool allowMalformed)
-      : this._(sink, new StringBuffer(), allowMalformed);
+      : this._(sink, StringBuffer(), allowMalformed);
 
   _Utf8ConversionSink._(
       this._chunkedSink, StringBuffer stringBuffer, bool allowMalformed)
-      : _decoder = new _Utf8Decoder(stringBuffer, allowMalformed),
+      : _decoder = _Utf8Decoder(stringBuffer, allowMalformed),
         _buffer = stringBuffer;
 
   void close() {
     _decoder.close();
     if (_buffer.isNotEmpty) {
-      String accumulated = _buffer.toString();
+      var accumulated = _buffer.toString();
       _buffer.clear();
       _chunkedSink.addSlice(accumulated, 0, accumulated.length, true);
     } else {
@@ -344,7 +310,7 @@
   void addSlice(List<int> chunk, int startIndex, int endIndex, bool isLast) {
     _decoder.convert(chunk, startIndex, endIndex);
     if (_buffer.isNotEmpty) {
-      String accumulated = _buffer.toString();
+      var accumulated = _buffer.toString();
       _chunkedSink.addSlice(accumulated, 0, accumulated.length, isLast);
       _buffer.clear();
       return;
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index 13aecd8..eb92e2b 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -4,133 +4,115 @@
 
 part of dart.convert;
 
-/** The Unicode Replacement character `U+FFFD` (�). */
+/// The Unicode Replacement character `U+FFFD` (�).
 const int unicodeReplacementCharacterRune = 0xFFFD;
 
-/** The Unicode Byte Order Marker (BOM) character `U+FEFF`. */
+/// The Unicode Byte Order Marker (BOM) character `U+FEFF`.
 const int unicodeBomCharacterRune = 0xFEFF;
 
-/**
- * An instance of the default implementation of the [Utf8Codec].
- *
- * This instance provides a convenient access to the most common UTF-8
- * use cases.
- *
- * Examples:
- *
- *     var encoded = utf8.encode("Îñţérñåţîöñåļîžåţîờñ");
- *     var decoded = utf8.decode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
- *                                0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
- */
-const Utf8Codec utf8 = const Utf8Codec();
+/// An instance of the default implementation of the [Utf8Codec].
+///
+/// This instance provides a convenient access to the most common UTF-8
+/// use cases.
+///
+/// Examples:
+///
+///     var encoded = utf8.encode("Îñţérñåţîöñåļîžåţîờñ");
+///     var decoded = utf8.decode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
+///                                0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
+const Utf8Codec utf8 = Utf8Codec();
 
-/**
- * A [Utf8Codec] encodes strings to utf-8 code units (bytes) and decodes
- * UTF-8 code units to strings.
- */
+/// A [Utf8Codec] encodes strings to utf-8 code units (bytes) and decodes
+/// UTF-8 code units to strings.
 class Utf8Codec extends Encoding {
   final bool _allowMalformed;
 
-  /**
-   * Instantiates a new [Utf8Codec].
-   *
-   * The optional [allowMalformed] argument defines how [decoder] (and [decode])
-   * deal with invalid or unterminated character sequences.
-   *
-   * If it is `true` (and not overridden at the method invocation) [decode] and
-   * the [decoder] replace invalid (or unterminated) octet
-   * sequences with the Unicode Replacement character `U+FFFD` (�). Otherwise
-   * they throw a [FormatException].
-   */
-  const Utf8Codec({bool allowMalformed: false})
+  /// Instantiates a new [Utf8Codec].
+  ///
+  /// The optional [allowMalformed] argument defines how [decoder] (and [decode])
+  /// deal with invalid or unterminated character sequences.
+  ///
+  /// If it is `true` (and not overridden at the method invocation) [decode] and
+  /// the [decoder] replace invalid (or unterminated) octet
+  /// sequences with the Unicode Replacement character `U+FFFD` (�). Otherwise
+  /// they throw a [FormatException].
+  const Utf8Codec({bool allowMalformed = false})
       : _allowMalformed = allowMalformed;
 
+  /// The name of this codec, "utf-8".
   String get name => "utf-8";
 
-  /**
-   * Decodes the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
-   * corresponding string.
-   *
-   * If the [codeUnits] start with the encoding of a
-   * [unicodeBomCharacterRune], that character is discarded.
-   *
-   * If [allowMalformed] is `true` the decoder replaces invalid (or
-   * unterminated) character sequences with the Unicode Replacement character
-   * `U+FFFD` (�). Otherwise it throws a [FormatException].
-   *
-   * If [allowMalformed] is not given, it defaults to the `allowMalformed` that
-   * was used to instantiate `this`.
-   */
+  /// Decodes the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
+  /// corresponding string.
+  ///
+  /// If the [codeUnits] start with the encoding of a
+  /// [unicodeBomCharacterRune], that character is discarded.
+  ///
+  /// If [allowMalformed] is `true` the decoder replaces invalid (or
+  /// unterminated) character sequences with the Unicode Replacement character
+  /// `U+FFFD` (�). Otherwise it throws a [FormatException].
+  ///
+  /// If [allowMalformed] is not given, it defaults to the `allowMalformed` that
+  /// was used to instantiate `this`.
   String decode(List<int> codeUnits, {bool allowMalformed}) {
-    if (allowMalformed == null) allowMalformed = _allowMalformed;
-    return new Utf8Decoder(allowMalformed: allowMalformed).convert(codeUnits);
+    allowMalformed ??= _allowMalformed;
+    return Utf8Decoder(allowMalformed: allowMalformed).convert(codeUnits);
   }
 
   Utf8Encoder get encoder => const Utf8Encoder();
   Utf8Decoder get decoder {
-    return new Utf8Decoder(allowMalformed: _allowMalformed);
+    return Utf8Decoder(allowMalformed: _allowMalformed);
   }
 }
 
-/**
- * This class converts strings to their UTF-8 code units (a list of
- * unsigned 8-bit integers).
- */
+/// This class converts strings to their UTF-8 code units (a list of
+/// unsigned 8-bit integers).
 class Utf8Encoder extends Converter<String, List<int>> {
   const Utf8Encoder();
 
-  /**
-   * Converts [string] to its UTF-8 code units (a list of
-   * unsigned 8-bit integers).
-   *
-   * If [start] and [end] are provided, only the substring
-   * `string.substring(start, end)` is converted.
-   */
+  /// Converts [string] to its UTF-8 code units (a list of
+  /// unsigned 8-bit integers).
+  ///
+  /// If [start] and [end] are provided, only the substring
+  /// `string.substring(start, end)` is converted.
   List<int> convert(String string, [int start = 0, int end]) {
-    int stringLength = string.length;
-    RangeError.checkValidRange(start, end, stringLength);
-    if (end == null) end = stringLength;
-    int length = end - start;
-    if (length == 0) return new Uint8List(0);
+    var stringLength = string.length;
+    end = RangeError.checkValidRange(start, end, stringLength);
+    var length = end - start;
+    if (length == 0) return Uint8List(0);
     // Create a new encoder with a length that is guaranteed to be big enough.
     // A single code unit uses at most 3 bytes, a surrogate pair at most 4.
-    _Utf8Encoder encoder = new _Utf8Encoder.withBufferSize(length * 3);
-    int endPosition = encoder._fillBuffer(string, start, end);
+    var encoder = _Utf8Encoder.withBufferSize(length * 3);
+    var endPosition = encoder._fillBuffer(string, start, end);
     assert(endPosition >= end - 1);
     if (endPosition != end) {
       // Encoding skipped the last code unit.
       // That can only happen if the last code unit is a leadsurrogate.
       // Force encoding of the lead surrogate by itself.
-      int lastCodeUnit = string.codeUnitAt(end - 1);
+      var lastCodeUnit = string.codeUnitAt(end - 1);
       assert(_isLeadSurrogate(lastCodeUnit));
       // We use a non-surrogate as `nextUnit` so that _writeSurrogate just
       // writes the lead-surrogate.
-      bool wasCombined = encoder._writeSurrogate(lastCodeUnit, 0);
+      var wasCombined = encoder._writeSurrogate(lastCodeUnit, 0);
       assert(!wasCombined);
     }
     return encoder._buffer.sublist(0, encoder._bufferIndex);
   }
 
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [ByteConversionSink].
-   */
+  /// Starts a chunked conversion.
+  ///
+  /// The converter works more efficiently if the given [sink] is a
+  /// [ByteConversionSink].
   StringConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    if (sink is! ByteConversionSink) {
-      sink = new ByteConversionSink.from(sink);
-    }
-    return new _Utf8EncoderSink(sink);
+    return _Utf8EncoderSink(
+        sink is ByteConversionSink ? sink : ByteConversionSink.from(sink));
   }
 
   // Override the base-classes bind, to provide a better type.
   Stream<List<int>> bind(Stream<String> stream) => super.bind(stream);
 }
 
-/**
- * This class encodes Strings to UTF-8 code units (unsigned 8 bit integers).
- */
+/// This class encodes Strings to UTF-8 code units (unsigned 8 bit integers).
 // TODO(floitsch): make this class public.
 class _Utf8Encoder {
   int _carry = 0;
@@ -144,25 +126,21 @@
   _Utf8Encoder.withBufferSize(int bufferSize)
       : _buffer = _createBuffer(bufferSize);
 
-  /**
-   * Allow an implementation to pick the most efficient way of storing bytes.
-   */
-  static List<int> _createBuffer(int size) => new Uint8List(size);
+  /// Allow an implementation to pick the most efficient way of storing bytes.
+  static List<int> _createBuffer(int size) => Uint8List(size);
 
-  /**
-   * Tries to combine the given [leadingSurrogate] with the [nextCodeUnit] and
-   * writes it to [_buffer].
-   *
-   * Returns true if the [nextCodeUnit] was combined with the
-   * [leadingSurrogate]. If it wasn't then nextCodeUnit was not a trailing
-   * surrogate and has not been written yet.
-   *
-   * It is safe to pass 0 for [nextCodeUnit] in which case only the leading
-   * surrogate is written.
-   */
+  /// Tries to combine the given [leadingSurrogate] with the [nextCodeUnit] and
+  /// writes it to [_buffer].
+  ///
+  /// Returns true if the [nextCodeUnit] was combined with the
+  /// [leadingSurrogate]. If it wasn't then nextCodeUnit was not a trailing
+  /// surrogate and has not been written yet.
+  ///
+  /// It is safe to pass 0 for [nextCodeUnit] in which case only the leading
+  /// surrogate is written.
   bool _writeSurrogate(int leadingSurrogate, int nextCodeUnit) {
     if (_isTailSurrogate(nextCodeUnit)) {
-      int rune = _combineSurrogatePair(leadingSurrogate, nextCodeUnit);
+      var rune = _combineSurrogatePair(leadingSurrogate, nextCodeUnit);
       // If the rune is encoded with 2 code-units then it must be encoded
       // with 4 bytes in UTF-8.
       assert(rune > _THREE_BYTE_LIMIT);
@@ -185,15 +163,13 @@
     }
   }
 
-  /**
-   * Fills the [_buffer] with as many characters as possible.
-   *
-   * Does not encode any trailing lead-surrogate. This must be done by the
-   * caller.
-   *
-   * Returns the position in the string. The returned index points to the
-   * first code unit that hasn't been encoded.
-   */
+  /// Fills the [_buffer] with as many characters as possible.
+  ///
+  /// Does not encode any trailing lead-surrogate. This must be done by the
+  /// caller.
+  ///
+  /// Returns the position in the string. The returned index points to the
+  /// first code unit that hasn't been encoded.
   int _fillBuffer(String str, int start, int end) {
     if (start != end && _isLeadSurrogate(str.codeUnitAt(end - 1))) {
       // Don't handle a trailing lead-surrogate in this loop. The caller has
@@ -202,7 +178,7 @@
     }
     int stringIndex;
     for (stringIndex = start; stringIndex < end; stringIndex++) {
-      int codeUnit = str.codeUnitAt(stringIndex);
+      var codeUnit = str.codeUnitAt(stringIndex);
       // ASCII has the same representation in UTF-8 and UTF-16.
       if (codeUnit <= _ONE_BYTE_LIMIT) {
         if (_bufferIndex >= _buffer.length) break;
@@ -211,11 +187,11 @@
         if (_bufferIndex + 3 >= _buffer.length) break;
         // Note that it is safe to read the next code unit. We decremented
         // [end] above when the last valid code unit was a leading surrogate.
-        int nextCodeUnit = str.codeUnitAt(stringIndex + 1);
-        bool wasCombined = _writeSurrogate(codeUnit, nextCodeUnit);
+        var nextCodeUnit = str.codeUnitAt(stringIndex + 1);
+        var wasCombined = _writeSurrogate(codeUnit, nextCodeUnit);
         if (wasCombined) stringIndex++;
       } else {
-        int rune = codeUnit;
+        var rune = codeUnit;
         if (rune <= _TWO_BYTE_LIMIT) {
           if (_bufferIndex + 1 >= _buffer.length) break;
           _buffer[_bufferIndex++] = 0xC0 | (rune >> 6);
@@ -233,10 +209,8 @@
   }
 }
 
-/**
- * This class encodes chunked strings to UTF-8 code units (unsigned 8-bit
- * integers).
- */
+/// This class encodes chunked strings to UTF-8 code units (unsigned 8-bit
+/// integers).
 class _Utf8EncoderSink extends _Utf8Encoder with StringConversionSinkMixin {
   final ByteConversionSink _sink;
 
@@ -259,13 +233,13 @@
     }
 
     if (_carry != 0) {
-      int nextCodeUnit = 0;
+      var nextCodeUnit = 0;
       if (start != end) {
         nextCodeUnit = str.codeUnitAt(start);
       } else {
         assert(isLast);
       }
-      bool wasCombined = _writeSurrogate(_carry, nextCodeUnit);
+      var wasCombined = _writeSurrogate(_carry, nextCodeUnit);
       // Either we got a non-empty string, or we must not have been combined.
       assert(!wasCombined || start != end);
       if (wasCombined) start++;
@@ -273,13 +247,13 @@
     }
     do {
       start = _fillBuffer(str, start, end);
-      bool isLastSlice = isLast && (start == end);
+      var isLastSlice = isLast && (start == end);
       if (start == end - 1 && _isLeadSurrogate(str.codeUnitAt(start))) {
         if (isLast && _bufferIndex < _buffer.length - 3) {
           // There is still space for the last incomplete surrogate.
           // We use a non-surrogate as second argument. This way the
           // function will just add the surrogate-half to the buffer.
-          bool hasBeenCombined = _writeSurrogate(str.codeUnitAt(start), 0);
+          var hasBeenCombined = _writeSurrogate(str.codeUnitAt(start), 0);
           assert(!hasBeenCombined);
         } else {
           // Otherwise store it in the carry. If isLast is true, then
@@ -298,66 +272,57 @@
   // needs to deal with malformed input.
 }
 
-/**
- * This class converts UTF-8 code units (lists of unsigned 8-bit integers)
- * to a string.
- */
+/// This class converts UTF-8 code units (lists of unsigned 8-bit integers)
+/// to a string.
 class Utf8Decoder extends Converter<List<int>, String> {
   final bool _allowMalformed;
 
-  /**
-   * Instantiates a new [Utf8Decoder].
-   *
-   * The optional [allowMalformed] argument defines how [convert] deals
-   * with invalid or unterminated character sequences.
-   *
-   * If it is `true` [convert] replaces invalid (or unterminated) character
-   * sequences with the Unicode Replacement character `U+FFFD` (�). Otherwise
-   * it throws a [FormatException].
-   */
-  const Utf8Decoder({bool allowMalformed: false})
-      : this._allowMalformed = allowMalformed;
+  /// Instantiates a new [Utf8Decoder].
+  ///
+  /// The optional [allowMalformed] argument defines how [convert] deals
+  /// with invalid or unterminated character sequences.
+  ///
+  /// If it is `true` [convert] replaces invalid (or unterminated) character
+  /// sequences with the Unicode Replacement character `U+FFFD` (�). Otherwise
+  /// it throws a [FormatException].
+  const Utf8Decoder({bool allowMalformed = false})
+      : _allowMalformed = allowMalformed;
 
-  /**
-   * Converts the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
-   * corresponding string.
-   *
-   * Uses the code units from [start] to, but no including, [end].
-   * If [end] is omitted, it defaults to `codeUnits.length`.
-   *
-   * If the [codeUnits] start with the encoding of a
-   * [unicodeBomCharacterRune], that character is discarded.
-   */
+  /// Converts the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
+  /// corresponding string.
+  ///
+  /// Uses the code units from [start] to, but no including, [end].
+  /// If [end] is omitted, it defaults to `codeUnits.length`.
+  ///
+  /// If the [codeUnits] start with the encoding of a
+  /// [unicodeBomCharacterRune], that character is discarded.
   String convert(List<int> codeUnits, [int start = 0, int end]) {
     // Allow the implementation to intercept and specialize based on the type
     // of codeUnits.
-    String result = _convertIntercepted(_allowMalformed, codeUnits, start, end);
+    var result = _convertIntercepted(_allowMalformed, codeUnits, start, end);
     if (result != null) {
       return result;
     }
 
-    int length = codeUnits.length;
-    RangeError.checkValidRange(start, end, length);
-    if (end == null) end = length;
-    StringBuffer buffer = new StringBuffer();
-    _Utf8Decoder decoder = new _Utf8Decoder(buffer, _allowMalformed);
+    var length = codeUnits.length;
+    end = RangeError.checkValidRange(start, end, length);
+    var buffer = StringBuffer();
+    var decoder = _Utf8Decoder(buffer, _allowMalformed);
     decoder.convert(codeUnits, start, end);
     decoder.flush(codeUnits, end);
     return buffer.toString();
   }
 
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   */
+  /// Starts a chunked conversion.
+  ///
+  /// The converter works more efficiently if the given [sink] is a
+  /// [StringConversionSink].
   ByteConversionSink startChunkedConversion(Sink<String> sink) {
     StringConversionSink stringSink;
     if (sink is StringConversionSink) {
       stringSink = sink;
     } else {
-      stringSink = new StringConversionSink.from(sink);
+      stringSink = StringConversionSink.from(sink);
     }
     return stringSink.asUtf8Sink(_allowMalformed);
   }
@@ -378,7 +343,6 @@
 const int _FOUR_BYTE_LIMIT = 0x10ffff; // 21 bits, truncated to Unicode max.
 
 // UTF-16 constants.
-const int _SURROGATE_MASK = 0xF800;
 const int _SURROGATE_TAG_MASK = 0xFC00;
 const int _SURROGATE_VALUE_MASK = 0x3FF;
 const int _LEAD_SURROGATE_MIN = 0xD800;
@@ -392,11 +356,9 @@
     0x10000 + ((lead & _SURROGATE_VALUE_MASK) << 10) |
     (tail & _SURROGATE_VALUE_MASK);
 
-/**
- * Decodes UTF-8.
- *
- * The decoder handles chunked input.
- */
+/// Decodes UTF-8.
+///
+/// The decoder handles chunked input.
 // TODO(floitsch): make this class public.
 class _Utf8Decoder {
   final bool _allowMalformed;
@@ -411,7 +373,7 @@
   bool get hasPartialInput => _expectedUnits > 0;
 
   // Limits of one through four byte encodings.
-  static const List<int> _LIMITS = const <int>[
+  static const List<int> _LIMITS = <int>[
     _ONE_BYTE_LIMIT,
     _TWO_BYTE_LIMIT,
     _THREE_BYTE_LIMIT,
@@ -422,19 +384,17 @@
     flush();
   }
 
-  /**
-   * Flushes this decoder as if closed.
-   *
-   * This method throws if the input was partial and the decoder was
-   * constructed with `allowMalformed` set to `false`.
-   *
-   * The [source] and [offset] of the current position may be provided,
-   * and are included in the exception if one is thrown.
-   */
+  /// Flushes this decoder as if closed.
+  ///
+  /// This method throws if the input was partial and the decoder was
+  /// constructed with `allowMalformed` set to `false`.
+  ///
+  /// The [source] and [offset] of the current position may be provided,
+  /// and are included in the exception if one is thrown.
   void flush([List<int> source, int offset]) {
     if (hasPartialInput) {
       if (!_allowMalformed) {
-        throw new FormatException(
+        throw FormatException(
             "Unfinished UTF-8 octet sequence", source, offset);
       }
       _stringSink.writeCharCode(unicodeReplacementCharacterRune);
@@ -445,30 +405,20 @@
   }
 
   void convert(List<int> codeUnits, int startIndex, int endIndex) {
-    int value = _value;
-    int expectedUnits = _expectedUnits;
-    int extraUnits = _extraUnits;
+    var value = _value;
+    var expectedUnits = _expectedUnits;
+    var extraUnits = _extraUnits;
     _value = 0;
     _expectedUnits = 0;
     _extraUnits = 0;
 
-    int scanOneByteCharacters(List<int> units, int from) {
-      final to = endIndex;
-      final mask = _ONE_BYTE_LIMIT;
-      for (var i = from; i < to; i++) {
-        final unit = units[i];
-        if ((unit & mask) != unit) return i - from;
-      }
-      return to - from;
-    }
-
     void addSingleBytes(int from, int to) {
       assert(from >= startIndex && from <= endIndex);
       assert(to >= startIndex && to <= endIndex);
-      _stringSink.write(new String.fromCharCodes(codeUnits, from, to));
+      _stringSink.write(String.fromCharCodes(codeUnits, from, to));
     }
 
-    int i = startIndex;
+    var i = startIndex;
     loop:
     while (true) {
       multibyte:
@@ -477,11 +427,11 @@
           if (i == endIndex) {
             break loop;
           }
-          int unit = codeUnits[i];
+          var unit = codeUnits[i];
           if ((unit & 0xC0) != 0x80) {
             expectedUnits = 0;
             if (!_allowMalformed) {
-              throw new FormatException(
+              throw FormatException(
                   "Bad UTF-8 encoding 0x${unit.toRadixString(16)}",
                   codeUnits,
                   i);
@@ -499,7 +449,7 @@
           // Overly long encoding. The value could be encoded with a shorter
           // encoding.
           if (!_allowMalformed) {
-            throw new FormatException(
+            throw FormatException(
                 "Overlong encoding of 0x${value.toRadixString(16)}",
                 codeUnits,
                 i - extraUnits - 1);
@@ -509,7 +459,7 @@
         }
         if (value > _FOUR_BYTE_LIMIT) {
           if (!_allowMalformed) {
-            throw new FormatException(
+            throw FormatException(
                 "Character outside valid Unicode range: "
                 "0x${value.toRadixString(16)}",
                 codeUnits,
@@ -524,14 +474,14 @@
       }
 
       while (i < endIndex) {
-        int oneBytes = scanOneByteCharacters(codeUnits, i);
+        var oneBytes = _scanOneByteCharacters(codeUnits, i, endIndex);
         if (oneBytes > 0) {
           _isFirstCharacter = false;
           addSingleBytes(i, i + oneBytes);
           i += oneBytes;
           if (i == endIndex) break;
         }
-        int unit = codeUnits[i++];
+        var unit = codeUnits[i++];
         // TODO(floitsch): the way we test we could potentially allow
         // units that are too large, if they happen to have the
         // right bit-pattern. (Same is true for the multibyte loop above).
@@ -540,7 +490,7 @@
         if (unit < 0) {
           // TODO(floitsch): should this be unit <= 0 ?
           if (!_allowMalformed) {
-            throw new FormatException(
+            throw FormatException(
                 "Negative UTF-8 code unit: -0x${(-unit).toRadixString(16)}",
                 codeUnits,
                 i - 1);
@@ -565,7 +515,7 @@
             continue loop;
           }
           if (!_allowMalformed) {
-            throw new FormatException(
+            throw FormatException(
                 "Bad UTF-8 encoding 0x${unit.toRadixString(16)}",
                 codeUnits,
                 i - 1);
@@ -585,3 +535,10 @@
     }
   }
 }
+
+// Returns the number of bytes in [units] starting at offset [from] which have
+// the leftmost bit set to 0.
+//
+// To increase performance of this critical method we have a special variant of
+// it implemented in the VM's patch files, which is why we make it external.
+external int _scanOneByteCharacters(List<int> units, int from, int endIndex);
diff --git a/sdk/lib/core/bool.dart b/sdk/lib/core/bool.dart
index ddec7cc..e3014bb 100644
--- a/sdk/lib/core/bool.dart
+++ b/sdk/lib/core/bool.dart
@@ -55,16 +55,19 @@
   ///
   /// Returns `true` if both this and [other] are `true`, and `false` otherwise.
   //TODO(lrn): Remove "as bool" in Dart 2.
+  @Since("2.1")
   bool operator &(bool other) => (other as bool) && this;
 
   /// The logical disjunction ("inclusive or") of this and [other].
   ///
   /// Returns `true` if either this or [other] is `true`, and `false` otherwise.
+  @Since("2.1")
   bool operator |(bool other) => (other as bool) || this;
 
   /// The logical exclusive disjunction ("exclusive or") of this and [other].
   ///
   /// Returns whether this and [other] are neither both `true` nor both `false`.
+  @Since("2.1")
   bool operator ^(bool other) => !(other as bool) == this;
 
   /**
diff --git a/sdk/lib/core/core.dart b/sdk/lib/core/core.dart
index f58a6a3..9ab8ed4 100644
--- a/sdk/lib/core/core.dart
+++ b/sdk/lib/core/core.dart
@@ -169,6 +169,7 @@
 import "dart:math" show Random; // Used by List.shuffle.
 import "dart:typed_data" show Uint8List, Uint16List, Endian;
 
+@Since("2.1")
 export "dart:async" show Future, Stream;
 
 part "annotations.dart";
diff --git a/sdk/lib/core/date_time.dart b/sdk/lib/core/date_time.dart
index 75aba53..b24c0ea 100644
--- a/sdk/lib/core/date_time.dart
+++ b/sdk/lib/core/date_time.dart
@@ -117,7 +117,7 @@
  *
  * The DateTime class does not provide internationalization.
  * To internationalize your code, use
- * the [intl](http://pub.dartlang.org/packages/intl) package.
+ * the [intl](https://pub.dartlang.org/packages/intl) package.
  *
  */
 class DateTime implements Comparable<DateTime> {
@@ -237,10 +237,10 @@
    *   The time part is a two digit hour,
    *   then optionally a two digit minutes value,
    *   then optionally a two digit seconds value, and
-   *   then optionally a '.' followed by a one-to-six digit second fraction.
+   *   then optionally a '.' or ',' followed by a one-to-six digit second fraction.
    *   The minutes and seconds may be separated from the previous parts by a
    *   ':'.
-   *   Examples: "12", "12:30:24.124", "123010.50".
+   *   Examples: "12", "12:30:24.124", "12:30:24,124", "123010.50".
    * * An optional time-zone offset part,
    *   possibly separated from the previous by a space.
    *   The time zone is either 'z' or 'Z', or it is a signed two digit hour
@@ -261,6 +261,7 @@
    *
    * * `"2012-02-27 13:27:00"`
    * * `"2012-02-27 13:27:00.123456z"`
+   * * `"2012-02-27 13:27:00,123456z"`
    * * `"20120227 13:27:00"`
    * * `"20120227T132700"`
    * * `"20120227"`
@@ -404,10 +405,7 @@
    * See [isAtSameMomentAs] for a comparison that compares moments in time
    * independently of their zones.
    */
-  bool operator ==(other) {
-    if (!(other is DateTime)) return false;
-    return (_value == other._value && isUtc == other.isUtc);
-  }
+  external bool operator ==(dynamic other);
 
   /**
    * Returns true if [this] occurs before [other].
@@ -429,9 +427,7 @@
    * assert(!now.isBefore(now.toUtc()));
    * ```
    */
-  bool isBefore(DateTime other) {
-    return _value < other._value;
-  }
+  external bool isBefore(DateTime other);
 
   /**
    * Returns true if [this] occurs after [other].
@@ -453,9 +449,7 @@
    * assert(!now.isBefore(now.toUtc()));
    * ```
    */
-  bool isAfter(DateTime other) {
-    return _value > other._value;
-  }
+  external bool isAfter(DateTime other);
 
   /**
    * Returns true if [this] occurs at the same moment as [other].
@@ -477,9 +471,7 @@
    * assert(now.isAtSameMomentAs(now.toUtc()));
    * ```
    */
-  bool isAtSameMomentAs(DateTime other) {
-    return _value == other._value;
-  }
+  external bool isAtSameMomentAs(DateTime other);
 
   /**
    * Compares this DateTime object to [other],
@@ -489,7 +481,7 @@
    * if it [isAtSameMomentAs] [other], and returns a positive value otherwise
    * (when this [isAfter] [other]).
    */
-  int compareTo(DateTime other) => _value.compareTo(other._value);
+  external int compareTo(DateTime other);
 
   int get hashCode => (_value ^ (_value >> 30)) & 0x3FFFFFFF;
 
@@ -561,7 +553,7 @@
    * The returned string is constructed for the time zone of this instance.
    * The `toString()` method provides a simply formatted string.
    * It does not support internationalized strings.
-   * Use the [intl](http://pub.dartlang.org/packages/intl) package
+   * Use the [intl](https://pub.dartlang.org/packages/intl) package
    * at the pub shared packages repo.
    *
    * The resulting string can be parsed back using [parse].
@@ -861,7 +853,7 @@
    * time_opt ::= <empty> | (' ' | 'T') hour minutes_opt
    * minutes_opt ::= <empty> | colon_opt digit{2} seconds_opt
    * seconds_opt ::= <empty> | colon_opt digit{2} millis_opt
-   * micros_opt ::= <empty> | '.' digit{1,6}
+   * micros_opt ::= <empty> | ('.' | ',') digit{1,6}
    * timezone_opt ::= <empty> | space_opt timezone
    * space_opt :: ' ' | <empty>
    * timezone ::= 'z' | 'Z' | sign digit{2} timezonemins_opt
@@ -869,6 +861,6 @@
    */
   static final RegExp _parseFormat = new RegExp(
       r'^([+-]?\d{4,6})-?(\d\d)-?(\d\d)' // Day part.
-      r'(?:[ T](\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d{1,6}))?)?)?' // Time part.
+      r'(?:[ T](\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,6}))?)?)?' // Time part.
       r'( ?[zZ]| ?([-+])(\d\d)(?::?(\d\d))?)?)?$'); // Timezone part.
 }
diff --git a/sdk/lib/core/duration.dart b/sdk/lib/core/duration.dart
index d21bb2a..52bfc29 100644
--- a/sdk/lib/core/duration.dart
+++ b/sdk/lib/core/duration.dart
@@ -23,32 +23,31 @@
  *
  * To create a new Duration object, use this class's single constructor
  * giving the appropriate arguments:
- *
- *     Duration fastestMarathon = new Duration(hours:2, minutes:3, seconds:2);
- *
+ * ```dart
+ * Duration fastestMarathon = new Duration(hours:2, minutes:3, seconds:2);
+ * ```
  * The [Duration] is the sum of all individual parts.
  * This means that individual parts can be larger than the next-bigger unit.
  * For example, [inMinutes] can be greater than 59.
- *
- *     assert(fastestMarathon.inMinutes == 123);
- *
+ * ```dart
+ * assert(fastestMarathon.inMinutes == 123);
+ * ```
  * All individual parts are allowed to be negative.
  *
  * Use one of the properties, such as [inDays],
  * to retrieve the integer value of the Duration in the specified time unit.
  * Note that the returned value is rounded down.
  * For example,
- *
- *     Duration aLongWeekend = new Duration(hours:88);
- *     assert(aLongWeekend.inDays == 3);
- *
+ * ```dart
+ * Duration aLongWeekend = new Duration(hours:88);
+ * assert(aLongWeekend.inDays == 3);
+ * ```
  * This class provides a collection of arithmetic
  * and comparison operators,
  * plus a set of constants useful for converting time units.
  *
  * See [DateTime] to represent a point in time.
  * See [Stopwatch] to measure time-spans.
- *
  */
 class Duration implements Comparable<Duration> {
   static const int microsecondsPerMillisecond = 1000;
@@ -212,17 +211,15 @@
   int get inMicroseconds => _duration;
 
   /**
-   * Returns `true` if this Duration is the same object as [other].
+   * Returns `true` if this [Duration] has the same value as [other].
    */
-  bool operator ==(other) {
-    if (other is! Duration) return false;
-    return _duration == other._duration;
-  }
+  bool operator ==(dynamic other) =>
+      other is Duration && _duration == other.inMicroseconds;
 
   int get hashCode => _duration.hashCode;
 
   /**
-   * Compares this Duration to [other], returning zero if the values are equal.
+   * Compares this [Duration] to [other], returning zero if the values are equal.
    *
    * Returns a negative integer if this `Duration` is shorter than
    * [other], or a positive integer if it is longer.
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index e569785..1bd829d 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -176,6 +176,7 @@
   /**
    * Throws if [argument] is `null`.
    */
+  @Since("2.1")
   static void checkNotNull(Object argument, [String name]) {
     if (argument == null) throw ArgumentError.notNull(name);
   }
@@ -265,7 +266,7 @@
    * The [length] is the length of [indexable] at the time of the error.
    * If `length` is omitted, it defaults to `indexable.length`.
    */
-  factory RangeError.index(int index, indexable,
+  factory RangeError.index(int index, dynamic indexable,
       [String name, String message, int length]) = IndexError;
 
   /**
@@ -292,12 +293,12 @@
    * If [length] is provided, it is used as the length of the indexable object,
    * otherwise the length is found as `indexable.length`.
    */
-  static void checkValidIndex(int index, var indexable,
+  static void checkValidIndex(int index, dynamic indexable,
       [String name, int length, String message]) {
-    if (length == null) length = indexable.length;
+    length ??= indexable.length;
     // Comparing with `0` as receiver produces better dart2js type inference.
     if (0 > index || index >= length) {
-      if (name == null) name = "index";
+      name ??= "index";
       throw new RangeError.index(index, indexable, name, message, length);
     }
   }
@@ -323,12 +324,12 @@
     // Comparing with `0` as receiver produces better dart2js type inference.
     // Ditto `start > end` below.
     if (0 > start || start > length) {
-      if (startName == null) startName = "start";
+      startName ??= "start";
       throw new RangeError.range(start, 0, length, startName, message);
     }
     if (end != null) {
       if (start > end || end > length) {
-        if (endName == null) endName = "end";
+        endName ??= "end";
         throw new RangeError.range(end, start, length, endName, message);
       }
       return end;
@@ -390,10 +391,10 @@
    *
    * The message is used as part of the string representation of the error.
    */
-  IndexError(int invalidValue, indexable,
+  IndexError(int invalidValue, dynamic indexable,
       [String name, String message, int length])
       : this.indexable = indexable,
-        this.length = (length != null) ? length : indexable.length,
+        this.length = length ?? indexable.length,
         super.value(invalidValue, name,
             (message != null) ? message : "Index out of range");
 
@@ -404,6 +405,7 @@
   String get _errorName => "RangeError";
   String get _errorExplanation {
     assert(_hasValue);
+    int invalidValue = this.invalidValue;
     if (invalidValue < 0) {
       return ": index must not be negative";
     }
@@ -482,7 +484,7 @@
   @Deprecated("Use NoSuchMethod.withInvocation instead")
   external NoSuchMethodError(Object receiver, Symbol memberName,
       List positionalArguments, Map<Symbol, dynamic> namedArguments,
-      [@deprecated List existingArgumentNames = null]);
+      [@deprecated List existingArgumentNames]);
 
   external String toString();
 }
@@ -584,190 +586,3 @@
       ? "Reading static variable during its initialization"
       : "Reading static variable '$variableName' during its initialization";
 }
-
-/// Used by Fasta to wrap constant expressions so an illegal constant expression
-/// will throw an error.
-class _ConstantHelper {
-  _isNumStringBoolOrNull(Object e) {
-    return e is num || e is String || e is bool || e == null;
-  }
-
-  _isNumStringOrNull(Object e) {
-    return e is num || e is String || e == null;
-  }
-
-  _isNumOrNull(Object e) {
-    return e is num || e == null;
-  }
-
-  _isIntOrNull(Object e) {
-    return e is int || e == null;
-  }
-
-  ////////////////////////////////////////
-
-  // An expression of one of the forms e1 == e2 or e1 != e2 where e1 and e2 are
-  // constant expressions that evaluate to a numeric, string or boolean value or
-  // to null.
-
-  equals(Object e1, Object e2, Function onError) {
-    if (!_isNumStringBoolOrNull((e1)) || !_isNumStringBoolOrNull(e2)) onError();
-    return e1 == e2;
-  }
-
-  notEquals(Object e1, Object e2, Function onError) {
-    if (!_isNumStringBoolOrNull((e1)) || !_isNumStringBoolOrNull(e2)) onError();
-    return e1 != e2;
-  }
-
-  ////////////////////////////////////////
-
-  // An expression of one of the forms !e, e1 && e2 or e1 || e2 , where e, e1
-  // and e2 are constant expressions that evaluate to a boolean value.
-
-  not(Object e, Function onError) {
-    if (e is! bool) onError();
-    return !e;
-  }
-
-  logicalAnd(Object e1, Object e2, Function onError) {
-    if (e1 is! bool || e2 is! bool) onError();
-    return e1 && e2;
-  }
-
-  logicalOr(Object e1, Object e2, Function onError) {
-    if (e1 is! bool || e2 is! bool) onError();
-    return e1 || e2;
-  }
-
-  ////////////////////////////////////////
-
-  // An expression of one of the forms  ~e, e1 ˆ e2, e1 & e2, e1 | e2, e1 >> e2
-  // or e1 << e2, where e, e1 and e2 are constant expressions that evaluate to
-  // an integer value or to null.
-
-  bitwiseNot(dynamic e, Function onError) {
-    if (!_isIntOrNull(e)) onError();
-    return ~e;
-  }
-
-  bitwiseXor(dynamic e1, dynamic e2, Function onError) {
-    if (!_isIntOrNull(e1) || !_isIntOrNull(e2)) onError();
-    return e1 ^ e2;
-  }
-
-  bitwiseAnd(dynamic e1, dynamic e2, Function onError) {
-    if (!_isIntOrNull(e1) || !_isIntOrNull(e2)) onError();
-    return e1 & e2;
-  }
-
-  bitwiseOr(dynamic e1, dynamic e2, Function onError) {
-    if (!_isIntOrNull(e1) || !_isIntOrNull(e2)) onError();
-    return e1 | e2;
-  }
-
-  rightShift(dynamic e1, dynamic e2, Function onError) {
-    if (!_isIntOrNull(e1) || !_isIntOrNull(e2)) onError();
-    return e1 >> e2;
-  }
-
-  leftShift(dynamic e1, dynamic e2, Function onError) {
-    if (!_isIntOrNull(e1) || !_isIntOrNull(e2)) onError();
-    return e1 << e2;
-  }
-
-  ////////////////////////////////////////
-
-  // An expression of the form e1 + e2 where e1 and e2 are constant expressions
-  // that evaluate to a numeric or string value or to null.
-
-  plus(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumStringOrNull(e1) || !_isNumStringOrNull(e2)) onError();
-    return e1 + e2;
-  }
-
-  ////////////////////////////////////////
-
-  // An expression of one of the forms -e, e1 - e2, e1 * e2, e1 / e2, e1 ~/ e2,
-  // e1 > e2, e1 < e2, e1 >= e2, e1 <= e2 or e1 % e2, where e, e1 and e2 are
-  // constant expressions that evaluate to a numeric value or to null.
-
-  unary_minus(dynamic e, Function onError) {
-    if (!_isNumOrNull(e)) onError();
-    return -e;
-  }
-
-  minus(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 - e2;
-  }
-
-  times(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 * e2;
-  }
-
-  div(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 / e2;
-  }
-
-  integerDiv(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 ~/ e2;
-  }
-
-  greater(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 > e2;
-  }
-
-  less(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 < e2;
-  }
-
-  greaterEqual(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 >= e2;
-  }
-
-  lessEqual(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 <= e2;
-  }
-
-  mod(dynamic e1, dynamic e2, Function onError) {
-    if (!_isNumOrNull(e1) || !_isNumOrNull(e2)) onError();
-    return e1 % e2;
-  }
-
-  ////////////////////////////////////////
-
-  // An expression of the form e1 ? e2 : e3 where e1, e2 and e3 are constant
-  // expressions and e1 evaluates to a boolean value.
-
-  conditional(Object e1, Object e2, Object e3, Function onError) {
-    if (e1 is! bool) onError();
-    return e1 ? e2 : e3;
-  }
-
-  ////////////////////////////////////////
-
-  // An expression of the form e1 ?? e2 where e1 and e2 are constant expressions.
-
-  ifNull(Object e1, Object e2, Object e3, Function onError) {
-    if (e1 is! bool) onError();
-    return e1 ?? e2;
-  }
-
-  ////////////////////////////////////////
-
-  // An expression of the form e.length where e is a constant expression that
-  // evaluates to a string value.
-
-  dotLength(dynamic e, Function onError) {
-    if (e is! String) onError();
-    return e.length();
-  }
-}
diff --git a/sdk/lib/core/exceptions.dart b/sdk/lib/core/exceptions.dart
index 737fcb9..103940c 100644
--- a/sdk/lib/core/exceptions.dart
+++ b/sdk/lib/core/exceptions.dart
@@ -98,78 +98,81 @@
       report = "$report: $message";
     }
     int offset = this.offset;
-    if (source is! String) {
+    Object objectSource = this.source;
+    if (objectSource is String) {
+      String source = objectSource;
+      if (offset != null && (offset < 0 || offset > source.length)) {
+        offset = null;
+      }
+      // Source is string and offset is null or valid.
+      if (offset == null) {
+        if (source.length > 78) {
+          source = source.substring(0, 75) + "...";
+        }
+        return "$report\n$source";
+      }
+      int lineNum = 1;
+      int lineStart = 0;
+      bool previousCharWasCR = false;
+      for (int i = 0; i < offset; i++) {
+        int char = source.codeUnitAt(i);
+        if (char == 0x0a) {
+          if (lineStart != i || !previousCharWasCR) {
+            lineNum++;
+          }
+          lineStart = i + 1;
+          previousCharWasCR = false;
+        } else if (char == 0x0d) {
+          lineNum++;
+          lineStart = i + 1;
+          previousCharWasCR = true;
+        }
+      }
+      if (lineNum > 1) {
+        report += " (at line $lineNum, character ${offset - lineStart + 1})\n";
+      } else {
+        report += " (at character ${offset + 1})\n";
+      }
+      int lineEnd = source.length;
+      for (int i = offset; i < source.length; i++) {
+        int char = source.codeUnitAt(i);
+        if (char == 0x0a || char == 0x0d) {
+          lineEnd = i;
+          break;
+        }
+      }
+      int length = lineEnd - lineStart;
+      int start = lineStart;
+      int end = lineEnd;
+      String prefix = "";
+      String postfix = "";
+      if (length > 78) {
+        // Can't show entire line. Try to anchor at the nearest end, if
+        // one is within reach.
+        int index = offset - lineStart;
+        if (index < 75) {
+          end = start + 75;
+          postfix = "...";
+        } else if (end - offset < 75) {
+          start = end - 75;
+          prefix = "...";
+        } else {
+          // Neither end is near, just pick an area around the offset.
+          start = offset - 36;
+          end = offset + 36;
+          prefix = postfix = "...";
+        }
+      }
+      String slice = source.substring(start, end);
+      int markOffset = offset - start + prefix.length;
+      return "$report$prefix$slice$postfix\n${" " * markOffset}^\n";
+    } else {
+      // The source is not a string.
       if (offset != null) {
         report += " (at offset $offset)";
       }
       return report;
     }
-    if (offset != null && (offset < 0 || offset > source.length)) {
-      offset = null;
-    }
-    // Source is string and offset is null or valid.
-    if (offset == null) {
-      String source = this.source;
-      if (source.length > 78) {
-        source = source.substring(0, 75) + "...";
-      }
-      return "$report\n$source";
-    }
-    int lineNum = 1;
-    int lineStart = 0;
-    bool previousCharWasCR = false;
-    for (int i = 0; i < offset; i++) {
-      int char = source.codeUnitAt(i);
-      if (char == 0x0a) {
-        if (lineStart != i || !previousCharWasCR) {
-          lineNum++;
-        }
-        lineStart = i + 1;
-        previousCharWasCR = false;
-      } else if (char == 0x0d) {
-        lineNum++;
-        lineStart = i + 1;
-        previousCharWasCR = true;
-      }
-    }
-    if (lineNum > 1) {
-      report += " (at line $lineNum, character ${offset - lineStart + 1})\n";
-    } else {
-      report += " (at character ${offset + 1})\n";
-    }
-    int lineEnd = source.length;
-    for (int i = offset; i < source.length; i++) {
-      int char = source.codeUnitAt(i);
-      if (char == 0x0a || char == 0x0d) {
-        lineEnd = i;
-        break;
-      }
-    }
-    int length = lineEnd - lineStart;
-    int start = lineStart;
-    int end = lineEnd;
-    String prefix = "";
-    String postfix = "";
-    if (length > 78) {
-      // Can't show entire line. Try to anchor at the nearest end, if
-      // one is within reach.
-      int index = offset - lineStart;
-      if (index < 75) {
-        end = start + 75;
-        postfix = "...";
-      } else if (end - offset < 75) {
-        start = end - 75;
-        prefix = "...";
-      } else {
-        // Neither end is near, just pick an area around the offset.
-        start = offset - 36;
-        end = offset + 36;
-        prefix = postfix = "...";
-      }
-    }
-    String slice = source.substring(start, end);
-    int markOffset = offset - start + prefix.length;
-    return "$report$prefix$slice$postfix\n${" " * markOffset}^\n";
   }
 }
 
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index a6a9946..69b3eae 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -10,7 +10,7 @@
  * The default implementation of `int` is 64-bit two's complement integers
  * with operations that wrap to that range on overflow.
  *
- * **Note:** When compiling to JavaScript, integers are restricted to valus
+ * **Note:** When compiling to JavaScript, integers are restricted to values
  * that can be represented exactly by double-precision floating point values.
  * The available integer values include all integers between -2^53 and 2^53,
  * and some integers with larger magnitude. That includes some integers larger
@@ -346,8 +346,8 @@
   /**
    * Parse [source] as a, possibly signed, integer literal and return its value.
    *
-   * Like [parse] except that this function returns `null` for invalid inputs
-   * instead of throwing.
+   * Like [parse] except that this function returns `null` where a
+   * similar call to [parse] would throw a [FormatException].
    */
   external static int tryParse(String source, {int radix});
 }
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 8aaf8e6a..3436b58 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -587,7 +587,7 @@
    * If [orElse] is omitted, it defaults to throwing a [StateError].
    */
   E lastWhere(bool test(E element), {E orElse()}) {
-    E result = null;
+    E result;
     bool foundMatching = false;
     for (E element in this) {
       if (test(element)) {
@@ -605,13 +605,12 @@
    *
    * Checks elements to see if `test(element)` returns true.
    * If exactly one element satisfies [test], that element is returned.
-   * Otherwise, if there are no matching elements, or if there is more than
-   * one matching element, the result of invoking the [orElse]
-   * function is returned.
+   * If more than one matching element is found, throws [StateError].
+   * If no matching element is found, returns the result of [orElse].
    * If [orElse] is omitted, it defaults to throwing a [StateError].
    */
   E singleWhere(bool test(E element), {E orElse()}) {
-    E result = null;
+    E result;
     bool foundMatching = false;
     for (E element in this) {
       if (test(element)) {
@@ -639,7 +638,7 @@
    * Some iterables may have more a efficient way to find the element.
    */
   E elementAt(int index) {
-    if (index is! int) throw new ArgumentError.notNull("index");
+    ArgumentError.checkNotNull(index, "index");
     RangeError.checkNotNegative(index, "index");
     int elementIndex = 0;
     for (E element in this) {
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index f7cf182..4e78c2a 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -77,30 +77,31 @@
   external factory List([int length]);
 
   /**
-   * Creates a fixed-length list of the given length, and initializes the
-   * value at each position with [fill]:
-   *
-   *     new List<int>.filled(3, 0); // [0, 0, 0]
+   * Creates a list of the given length with [fill] at each position.
    *
    * The [length] must be a non-negative integer.
    *
+   * Example:
+   * ```dart
+   * new List<int>.filled(3, 0, growable: true); // [0, 0, 0]
+   * ```
+   *
+   * The created list is fixed-length if [growable] is false (the default)
+   * and growable if [growable] is true.
    * If the list is growable, changing its length will not initialize new
-   * entries with [fill]. After being created and filled, the list is
-   * no different from any other growable or fixed-length list
-   * created using [List].
+   * entries with [fill].
+   * After being created and filled, the list is no different from any other
+   * growable or fixed-length list created using [List].
    *
-   * All entries in the returned list point to the same provided [fill] value.
-   * That all items in the list are the same object is
-   * observable when the given value is a mutable object.
-   *
+   * All elements of the returned list share the same [fill] value.
    * ```
    * var shared = new List.filled(3, []);
    * shared[0].add(499);
    * print(shared);  // => [[499], [499], [499]]
    * ```
    *
-   * You may use [List.generate] to create a new object for each position in
-   * in the list.
+   * You can use [List.generate] to create a list with a new object at
+   * each position.
    * ```
    * var unique = new List.generate(3, (_) => []);
    * unique[0].add(499);
diff --git a/sdk/lib/core/regexp.dart b/sdk/lib/core/regexp.dart
index 95e12b5..9164fb9 100644
--- a/sdk/lib/core/regexp.dart
+++ b/sdk/lib/core/regexp.dart
@@ -40,6 +40,24 @@
    *
    * Throws a [FormatException] if [source] is not valid regular
    * expression syntax.
+   *
+   * If `multiLine` is enabled, then `^` and `$` will match the beginning and
+   * end of a _line_, in addition to matching beginning and end of input,
+   * respectively.
+   *
+   * If `caseSensitive` is disabled, then case is ignored.
+   *
+   * Example:
+   *
+   * ```dart
+   * var wordPattern = RegExp(r"(\w+)");
+   * var bracketedNumberValue = RegExp("$key: \\[\\d+\\]");
+   * ```
+   *
+   * Notice the use of a _raw string_ in the first example, and a regular
+   * string in the second. Because of the many character classes used in
+   * regular expressions, it is common to use a raw string here, unless string
+   * interpolation is required.
    */
   external factory RegExp(String source,
       {bool multiLine: false, bool caseSensitive: true});
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index 78f82ab..7b477df 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -180,8 +180,16 @@
   /**
    * If an object equal to [object] is in the set, return it.
    *
-   * Checks if there is an object in the set that is equal to [object].
-   * If so, that object is returned, otherwise returns null.
+   * Checks whether [object] is in the set, like [contains], and if so,
+   * returns the object in the set, otherwise returns `null`.
+   *
+   * If the equality relation used by the set is not identity,
+   * then the returned object may not be *identical* to [object].
+   * Some set implementations may not be able to implement this method.
+   * If the [contains] method is computed,
+   * rather than being based on an actual object instance,
+   * then there may not be a specific object instance representing the
+   * set element.
    */
   E lookup(Object object);
 
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index ce81a64..2d59ad4 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -1256,7 +1256,7 @@
    *  * 2010:836B:4179::836B:4179
    */
   static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
-    if (end == null) end = host.length;
+    end ??= host.length;
     // An IPv6 address consists of exactly 8 parts of 1-4 hex digits, separated
     // by `:`'s, with the following exceptions:
     //
@@ -1623,8 +1623,8 @@
   static Uri _makeHttpUri(String scheme, String authority, String unencodedPath,
       Map<String, String> queryParameters) {
     var userInfo = "";
-    var host = null;
-    var port = null;
+    String host;
+    int port;
 
     if (authority != null && authority.isNotEmpty) {
       var hostStart = 0;
@@ -1914,10 +1914,8 @@
   }
 
   Map<String, String> get queryParameters {
-    if (_queryParameters == null) {
-      _queryParameters =
-          new UnmodifiableMapView<String, String>(Uri.splitQueryString(query));
-    }
+    _queryParameters ??=
+        new UnmodifiableMapView<String, String>(Uri.splitQueryString(query));
     return _queryParameters;
   }
 
@@ -2009,7 +2007,7 @@
           index += 3;
           continue;
         }
-        if (buffer == null) buffer = new StringBuffer();
+        buffer ??= new StringBuffer();
         String slice = host.substring(sectionStart, index);
         if (!isNormalized) slice = slice.toLowerCase();
         buffer.write(slice);
@@ -2027,7 +2025,7 @@
       } else if (_isRegNameChar(char)) {
         if (isNormalized && _UPPER_CASE_A <= char && _UPPER_CASE_Z >= char) {
           // Put initial slice in buffer and continue in non-normalized mode
-          if (buffer == null) buffer = new StringBuffer();
+          buffer ??= new StringBuffer();
           if (sectionStart < index) {
             buffer.write(host.substring(sectionStart, index));
             sectionStart = index;
@@ -2046,7 +2044,7 @@
             sourceLength = 2;
           }
         }
-        if (buffer == null) buffer = new StringBuffer();
+        buffer ??= new StringBuffer();
         String slice = host.substring(sectionStart, index);
         if (!isNormalized) slice = slice.toLowerCase();
         buffer.write(slice);
@@ -2114,7 +2112,7 @@
     if (path != null && pathSegments != null) {
       throw new ArgumentError('Both path and pathSegments specified');
     }
-    var result;
+    String result;
     if (path != null) {
       result = _normalizeOrSubstring(path, start, end, _pathCharOrSlashTable,
           escapeDelimiters: true);
@@ -2333,7 +2331,7 @@
           }
           replacement = _escapeChar(char);
         }
-        if (buffer == null) buffer = new StringBuffer();
+        buffer ??= new StringBuffer();
         buffer.write(component.substring(sectionStart, index));
         buffer.write(replacement);
         index += sourceLength;
@@ -2625,7 +2623,7 @@
       throw new UnsupportedError(
           "Cannot extract a file path from a URI with a fragment component");
     }
-    if (windows == null) windows = _isWindows;
+    windows ??= _isWindows;
     return windows ? _toWindowsFilePath(this) : _toFilePath();
   }
 
@@ -2719,30 +2717,28 @@
 
   bool operator ==(Object other) {
     if (identical(this, other)) return true;
-    if (other is Uri) {
-      Uri uri = other;
-      return scheme == uri.scheme &&
-          hasAuthority == uri.hasAuthority &&
-          userInfo == uri.userInfo &&
-          host == uri.host &&
-          port == uri.port &&
-          path == uri.path &&
-          hasQuery == uri.hasQuery &&
-          query == uri.query &&
-          hasFragment == uri.hasFragment &&
-          fragment == uri.fragment;
-    }
-    return false;
+    return other is Uri &&
+        scheme == other.scheme &&
+        hasAuthority == other.hasAuthority &&
+        userInfo == other.userInfo &&
+        host == other.host &&
+        port == other.port &&
+        path == other.path &&
+        hasQuery == other.hasQuery &&
+        query == other.query &&
+        hasFragment == other.hasFragment &&
+        fragment == other.fragment;
   }
 
   int get hashCode {
     return _hashCodeCache ??= toString().hashCode;
   }
 
-  static List _createList() => [];
+  static List<String> _createList() => <String>[];
 
-  static Map _splitQueryStringAll(String query, {Encoding encoding: utf8}) {
-    Map result = {};
+  static Map<String, List<String>> _splitQueryStringAll(String query,
+      {Encoding encoding: utf8}) {
+    var result = <String, List<String>>{};
     int i = 0;
     int start = 0;
     int equalsIndex = -1;
@@ -3316,7 +3312,7 @@
       buffer.write(";charset=");
       buffer.write(_Uri._uriEncode(_tokenCharTable, charsetName, utf8, false));
     }
-    parameters?.forEach((var key, var value) {
+    parameters?.forEach((key, value) {
       if (key.isEmpty) {
         throw new ArgumentError.value("", "Parameter names must not be empty");
       }
@@ -3382,6 +3378,8 @@
    * content that can't be decoded successfully as a string, for example if
    * existing percent escapes represent bytes that cannot be decoded
    * by the chosen [Encoding] (see [contentAsString]).
+   *
+   * A [FormatException] is thrown if [uri] is not a valid data URI.
    */
   static UriData parse(String uri) {
     if (uri.length >= 5) {
@@ -3408,7 +3406,7 @@
   Uri get uri {
     if (_uriCache != null) return _uriCache;
     String path = _text;
-    String query = null;
+    String query;
     int colonIndex = _separatorIndices[0];
     int queryIndex = _text.indexOf('?', colonIndex + 1);
     int end = _text.length;
@@ -4597,7 +4595,7 @@
       throw new UnsupportedError(
           "Cannot extract a file path from a URI with a fragment component");
     }
-    if (windows == null) windows = _Uri._isWindows;
+    windows ??= _Uri._isWindows;
     return windows ? _Uri._toWindowsFilePath(this) : _toFilePath();
   }
 
@@ -4620,8 +4618,7 @@
 
   bool operator ==(Object other) {
     if (identical(this, other)) return true;
-    if (other is Uri) return _uri == other.toString();
-    return false;
+    return other is Uri && _uri == other.toString();
   }
 
   Uri _toNonSimple() {
diff --git a/sdk/lib/dart_client.platform b/sdk/lib/dart_client.platform
deleted file mode 100644
index 805ac5c..0000000
--- a/sdk/lib/dart_client.platform
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# The platform for running dart on the web with dart2js.
-#
-# Includes dart:html and associated libraries.
-#
-# This configuration used to exclude dart:io, but we made it OK to import it.
-# This is allowed as a stopgap measure until config-specific imports are
-# supported in the language.  The returned library is an implementation of
-# dart:io that throws at runtime.
-
-[dart-spec]
-spec: 3rd edition.
-
-[features]
-# No extra features.
-
-[libraries]
-async: async/async.dart
-_chrome: _chrome/dart2js/chrome_dart2js.dart
-collection: collection/collection.dart
-convert: convert/convert.dart
-core: core/core.dart
-developer: developer/developer.dart
-html: html/dart2js/html_dart2js.dart
-html_common: html/html_common/html_common_dart2js.dart
-_http: unsupported:_http/http.dart
-indexed_db: indexed_db/dart2js/indexed_db_dart2js.dart
-io: unsupported:io/io.dart
-cli: unsupported:cli/cli.dart
-isolate: isolate/isolate.dart
-js: js/dart2js/js_dart2js.dart
-_js: js/_js.dart
-js_util: js_util/dart2js/js_util_dart2js.dart
-math: math/math.dart
-mirrors: mirrors/mirrors.dart
-nativewrappers: html/dartium/nativewrappers.dart
-typed_data: typed_data/typed_data.dart
-_native_typed_data: _internal/js_runtime/lib/native_typed_data.dart
-svg: svg/dart2js/svg_dart2js.dart
-web_audio: web_audio/dart2js/web_audio_dart2js.dart
-web_gl: web_gl/dart2js/web_gl_dart2js.dart
-web_sql: web_sql/dart2js/web_sql_dart2js.dart
-_internal: internal/internal.dart
-_js_helper: _internal/js_runtime/lib/js_helper.dart
-_interceptors: _internal/js_runtime/lib/interceptors.dart
-_foreign_helper: _internal/js_runtime/lib/foreign_helper.dart
-_js_names: _internal/js_runtime/lib/js_names.dart
-_js_primitives: _internal/js_runtime/lib/js_primitives.dart
-_js_embedded_names: _internal/js_runtime/lib/shared/embedded_names.dart
-_async_await_error_codes: _internal/js_runtime/lib/shared/async_await_error_codes.dart
-_metadata: html/html_common/metadata.dart
-_mirror_helper: unsupported:
diff --git a/sdk/lib/dart_server.platform b/sdk/lib/dart_server.platform
deleted file mode 100644
index 290e1ef..0000000
--- a/sdk/lib/dart_server.platform
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# The platform for dart on the server with dart2js.
-#
-# Includes dart:io.
-# Does not include dart:html and associated libraries.
-
-[dart-spec]
-spec:3rd edition.
-
-[features]
-# No extra features.
-
-[libraries]
-async: async/async.dart
-collection: collection/collection.dart
-convert: convert/convert.dart
-core: core/core.dart
-developer: developer/developer.dart
-io: io/io.dart
-cli: cli/cli.dart
-isolate: isolate/isolate.dart
-math: math/math.dart
-mirrors: mirrors/mirrors.dart
-nativewrappers: html/dartium/nativewrappers.dart
-typed_data: typed_data/typed_data.dart
-_native_typed_data: _internal/js_runtime/lib/native_typed_data.dart
-html: unsupported:
-html_common: unsupported:
-_http: _http/http.dart
-indexed_db: unsupported:
-svg: unsupported:
-web_audio: unsupported:
-web_gl: unsupported:
-web_sql: unsupported:
-_chrome: unsupported:
-js: js/dart2js/js_dart2js.dart
-_js: js/_js.dart
-js_util: js_util/dart2js/js_util_dart2js.dart
-_mirror_helper: unsupported:
-_internal: internal/internal.dart
-_js_helper: _internal/js_runtime/lib/js_helper.dart
-_interceptors: _internal/js_runtime/lib/interceptors.dart
-_foreign_helper: _internal/js_runtime/lib/foreign_helper.dart
-_js_names: _internal/js_runtime/lib/js_names.dart
-_js_primitives: _internal/js_runtime/lib/js_primitives.dart
-_js_embedded_names: _internal/js_runtime/lib/shared/embedded_names.dart
-_async_await_error_codes: _internal/js_runtime/lib/shared/async_await_error_codes.dart
-_metadata: html/html_common/metadata.dart
diff --git a/sdk/lib/dart_shared.platform b/sdk/lib/dart_shared.platform
deleted file mode 100644
index e8aa11c..0000000
--- a/sdk/lib/dart_shared.platform
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# A combination of the libraries for dart on the server and client.
-# For testing purposes only.
-
-[dart-spec]
-spec:3rd edition.
-
-[features]
-# No extra features.
-
-[libraries]
-async: async/async.dart
-_chrome: _chrome/dart2js/chrome_dart2js.dart
-collection: collection/collection.dart
-convert: convert/convert.dart
-core: core/core.dart
-developer: developer/developer.dart
-html: html/dart2js/html_dart2js.dart
-html_common: html/html_common/html_common_dart2js.dart
-_http: _http/http.dart
-indexed_db: indexed_db/dart2js/indexed_db_dart2js.dart
-io: io/io.dart
-cli: cli/cli.dart
-isolate: isolate/isolate.dart
-js: js/dart2js/js_dart2js.dart
-_js: js/_js.dart
-js_util: js_util/dart2js/js_util_dart2js.dart
-math: math/math.dart
-mirrors: mirrors/mirrors.dart
-nativewrappers: html/dartium/nativewrappers.dart
-typed_data: typed_data/typed_data.dart
-_native_typed_data: _internal/js_runtime/lib/native_typed_data.dart
-svg: svg/dart2js/svg_dart2js.dart
-web_audio: web_audio/dart2js/web_audio_dart2js.dart
-web_gl: web_gl/dart2js/web_gl_dart2js.dart
-web_sql: web_sql/dart2js/web_sql_dart2js.dart
-_internal: internal/internal.dart
-_js_helper: _internal/js_runtime/lib/js_helper.dart
-_interceptors: _internal/js_runtime/lib/interceptors.dart
-_foreign_helper: _internal/js_runtime/lib/foreign_helper.dart
-_js_names: _internal/js_runtime/lib/js_names.dart
-_js_primitives: _internal/js_runtime/lib/js_primitives.dart
-_js_embedded_names: _internal/js_runtime/lib/shared/embedded_names.dart
-_async_await_error_codes: _internal/js_runtime/lib/shared/async_await_error_codes.dart
-_metadata: html/html_common/metadata.dart
-_mirror_helper: unsupported:
diff --git a/sdk/lib/developer/extension.dart b/sdk/lib/developer/extension.dart
index ec316c7..c6f4cce 100644
--- a/sdk/lib/developer/extension.dart
+++ b/sdk/lib/developer/extension.dart
@@ -21,9 +21,7 @@
       : _result = result,
         _errorCode = null,
         _errorDetail = null {
-    if (_result is! String) {
-      throw new ArgumentError.value(_result, "result", "Must be a String");
-    }
+    ArgumentError.checkNotNull(_result, "result");
   }
 
   /// Creates an error response to a service protocol extension RPC.
@@ -37,10 +35,7 @@
         _errorCode = errorCode,
         _errorDetail = errorDetail {
     _validateErrorCode(_errorCode);
-    if (_errorDetail is! String) {
-      throw new ArgumentError.value(
-          _errorDetail, "errorDetail", "Must be a String");
-    }
+    ArgumentError.checkNotNull(_errorDetail, "errorDetail");
   }
 
   /// Invalid method parameter(s) error code.
@@ -80,12 +75,8 @@
   }
 
   static _validateErrorCode(int errorCode) {
-    if (errorCode is! int) {
-      throw new ArgumentError.value(errorCode, "errorCode", "Must be an int");
-    }
-    if (errorCode == invalidParams) {
-      return;
-    }
+    ArgumentError.checkNotNull(errorCode, "errorCode");
+    if (errorCode == invalidParams) return;
     if ((errorCode >= extensionErrorMin) && (errorCode <= extensionErrorMax)) {
       return;
     }
@@ -134,31 +125,22 @@
 /// Because service extensions are isolate specific, clients using extensions
 /// must always include an 'isolateId' parameter with each RPC.
 void registerExtension(String method, ServiceExtensionHandler handler) {
-  if (method is! String) {
-    throw new ArgumentError.value(method, 'method', 'Must be a String');
-  }
+  ArgumentError.checkNotNull(method, 'method');
   if (!method.startsWith('ext.')) {
     throw new ArgumentError.value(method, 'method', 'Must begin with ext.');
   }
   if (_lookupExtension(method) != null) {
     throw new ArgumentError('Extension already registered: $method');
   }
-  if (handler is! ServiceExtensionHandler) {
-    throw new ArgumentError.value(
-        handler, 'handler', 'Must be a ServiceExtensionHandler');
-  }
+  ArgumentError.checkNotNull(handler, 'handler');
   _registerExtension(method, handler);
 }
 
 /// Post an event of [eventKind] with payload of [eventData] to the `Extension`
 /// event stream.
 void postEvent(String eventKind, Map eventData) {
-  if (eventKind is! String) {
-    throw new ArgumentError.value(eventKind, 'eventKind', 'Must be a String');
-  }
-  if (eventData is! Map) {
-    throw new ArgumentError.value(eventData, 'eventData', 'Must be a Map');
-  }
+  ArgumentError.checkNotNull(eventKind, 'eventKind');
+  ArgumentError.checkNotNull(eventData, 'eventData');
   String eventDataAsString = json.encode(eventData);
   _postEvent(eventKind, eventDataAsString);
 }
diff --git a/sdk/lib/developer/profiler.dart b/sdk/lib/developer/profiler.dart
index 665cd27..05a9211 100644
--- a/sdk/lib/developer/profiler.dart
+++ b/sdk/lib/developer/profiler.dart
@@ -64,15 +64,9 @@
 
   Gauge(String name, String description, this.min, this.max)
       : super(name, description) {
-    if (min is! double) {
-      throw new ArgumentError('min must be a double');
-    }
-    if (max is! double) {
-      throw new ArgumentError('max must be a double');
-    }
-    if (!(min < max)) {
-      throw new ArgumentError('min must be less than max');
-    }
+    ArgumentError.checkNotNull(min, 'min');
+    ArgumentError.checkNotNull(max, 'max');
+    if (!(min < max)) throw new ArgumentError('min must be less than max');
     _value = min;
   }
 
@@ -117,9 +111,7 @@
 
   /// Register [Metric]s to make them visible to Observatory.
   static void register(Metric metric) {
-    if (metric is! Metric) {
-      throw new ArgumentError('metric must be a Metric');
-    }
+    ArgumentError.checkNotNull(metric, 'metric');
     if (_metrics[metric.name] != null) {
       throw new ArgumentError('Registered metrics have unique names');
     }
@@ -128,9 +120,7 @@
 
   /// Deregister [Metric]s to make them not visible to Observatory.
   static void deregister(Metric metric) {
-    if (metric is! Metric) {
-      throw new ArgumentError('metric must be a Metric');
-    }
+    ArgumentError.checkNotNull(metric, 'metric');
     _metrics.remove(metric.name);
   }
 
diff --git a/sdk/lib/developer/service.dart b/sdk/lib/developer/service.dart
index 9616963..a4d92b9 100644
--- a/sdk/lib/developer/service.dart
+++ b/sdk/lib/developer/service.dart
@@ -58,9 +58,7 @@
   /// enable (true) or disable (false) the web server servicing requests.
   static Future<ServiceProtocolInfo> controlWebServer(
       {bool enable: false}) async {
-    if (enable is! bool) {
-      throw new ArgumentError.value(enable, 'enable', 'Must be a bool');
-    }
+    ArgumentError.checkNotNull(enable, 'enable');
     // Port to receive response from service isolate.
     final RawReceivePort receivePort = new RawReceivePort();
     final Completer<Uri> uriCompleter = new Completer<Uri>();
@@ -79,9 +77,7 @@
   /// Returns null if the running Dart environment does not support the service
   /// protocol.
   static String getIsolateID(Isolate isolate) {
-    if (isolate is! Isolate) {
-      throw new ArgumentError.value(isolate, 'isolate', 'Must be an Isolate');
-    }
+    ArgumentError.checkNotNull(isolate, 'isolate');
     return _getIsolateIDFromSendPort(isolate.controlPort);
   }
 }
diff --git a/sdk/lib/developer/timeline.dart b/sdk/lib/developer/timeline.dart
index e838a1f..37ae997 100644
--- a/sdk/lib/developer/timeline.dart
+++ b/sdk/lib/developer/timeline.dart
@@ -100,22 +100,18 @@
   /// a [Flow] event. This operation must be finished before
   /// returning to the event queue.
   static void startSync(String name, {Map arguments, Flow flow}) {
-    if (_isProduct) {
-      return;
-    }
-    if (name is! String) {
-      throw new ArgumentError.value(name, 'name', 'Must be a String');
-    }
+    if (_isProduct) return;
+    ArgumentError.checkNotNull(name, 'name');
     if (!_isDartStreamEnabled()) {
       // Push a null onto the stack and return.
       _stack.add(null);
       return;
     }
     var block = new _SyncBlock._(name, _getTraceClock(), _getThreadCpuClock());
-    if (arguments is Map) {
+    if (arguments != null) {
       block._arguments = arguments;
     }
-    if (flow is Flow) {
+    if (flow != null) {
       block.flow = flow;
     }
     _stack.add(block);
@@ -141,18 +137,14 @@
 
   /// Emit an instant event.
   static void instantSync(String name, {Map arguments}) {
-    if (_isProduct) {
-      return;
-    }
-    if (name is! String) {
-      throw new ArgumentError.value(name, 'name', 'Must be a String');
-    }
+    if (_isProduct) return;
+    ArgumentError.checkNotNull(name, 'name');
     if (!_isDartStreamEnabled()) {
       // Stream is disabled.
       return;
     }
     Map instantArguments;
-    if (arguments is Map) {
+    if (arguments != null) {
       instantArguments = new Map.from(arguments);
     }
     _reportInstantEvent(
@@ -189,22 +181,16 @@
   /// Create a task with an explicit [taskId]. This is useful if you are
   /// passing a task from one isolate to another.
   TimelineTask.withTaskId(int taskId) : _taskId = taskId {
-    if (taskId is! int) {
-      throw new ArgumentError.value(taskId, 'taskId', 'Must be an int');
-    }
+    ArgumentError.checkNotNull(taskId, 'taskId');
   }
 
   /// Start a synchronous operation within this task named [name].
   /// Optionally takes a [Map] of [arguments].
   void start(String name, {Map arguments}) {
-    if (_isProduct) {
-      return;
-    }
-    if (name is! String) {
-      throw new ArgumentError.value(name, 'name', 'Must be a String');
-    }
+    if (_isProduct) return;
+    ArgumentError.checkNotNull(name, 'name');
     var block = new _AsyncBlock._(name, _taskId);
-    if (arguments is Map) {
+    if (arguments != null) {
       block._arguments = arguments;
     }
     _stack.add(block);
@@ -213,14 +199,10 @@
 
   /// Emit an instant event for this task.
   void instant(String name, {Map arguments}) {
-    if (_isProduct) {
-      return;
-    }
-    if (name is! String) {
-      throw new ArgumentError.value(name, 'name', 'Must be a String');
-    }
+    if (_isProduct) return;
+    ArgumentError.checkNotNull(name, 'name');
     Map instantArguments;
-    if (arguments is Map) {
+    if (arguments != null) {
       instantArguments = new Map.from(arguments);
     }
     _reportTaskEvent(_getTraceClock(), _taskId, 'n', 'Dart', name,
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index a4f1b87..d5d6287 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -12387,8 +12387,10 @@
    *
    * See also:
    *
-   * * [CSS Inheritance and Cascade](http://docs.webplatform.org/wiki/tutorials/inheritance_and_cascade)
-   * * [Pseudo-elements](http://docs.webplatform.org/wiki/css/selectors/pseudo-elements)
+   * * [Cascade and Inheritance](https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Cascade_and_inheritance)
+   *   from MDN.
+   * * [Pseudo-elements](https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements)
+   *   from MDN.
    */
   CssStyleDeclaration getComputedStyle([String pseudoElement]) {
     if (pseudoElement == null) {
@@ -12570,8 +12572,10 @@
    *
    * See also:
    *
-   * * [scrollIntoView](http://docs.webplatform.org/wiki/dom/methods/scrollIntoView)
-   * * [scrollIntoViewIfNeeded](http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded)
+   * * [scrollIntoView](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView)
+   *   from MDN.
+   * * [scrollIntoViewIfNeeded](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoViewIfNeeded)
+   *   from MDN.
    */
   void scrollIntoView([ScrollAlignment alignment]) {
     var hasScrollIntoViewIfNeeded = true;
@@ -14039,9 +14043,9 @@
    *
    * ## Other resources
    *
-   * * [Using the fullscreen
-   *   API](http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
-   *   tutorial from WebPlatform.org.
+   * * [Fullscreen
+   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)
+   *   from MDN.
    * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
    */
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -16845,9 +16849,9 @@
    *
    * ## Other resources
    *
-   * * [Using the fullscreen
-   *   API](http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
-   *   from WebPlatform.org.
+   * * [Fullscreen
+   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)
+   *   from MDN.
    * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
    */
   @SupportedBrowser(SupportedBrowser.CHROME)
@@ -17092,9 +17096,6 @@
   /**
    * Creates a GET request for the specified [url].
    *
-   * The server response must be a `text/` mime type for this request to
-   * succeed.
-   *
    * This is similar to [request] but specialized for HTTP GET requests which
    * return text content.
    *
@@ -17105,7 +17106,7 @@
    *     var name = Uri.encodeQueryComponent('John');
    *     var id = Uri.encodeQueryComponent('42');
    *     HttpRequest.getString('users.json?name=$name&id=$id')
-   *       .then((HttpRequest resp) {
+   *       .then((String resp) {
    *         // Do something with the response.
    *     });
    *
@@ -17123,8 +17124,8 @@
   /**
    * Makes a server POST request with the specified data encoded as form data.
    *
-   * This is roughly the POST equivalent of getString. This method is similar
-   * to sending a FormData object with broader browser support but limited to
+   * This is roughly the POST equivalent of [getString]. This method is similar
+   * to sending a [FormData] object with broader browser support but limited to
    * String values.
    *
    * If [data] is supplied, the key/value pairs are URI encoded with
@@ -17421,11 +17422,11 @@
    * Specify the desired `url`, and `method` to use in making the request.
    *
    * By default the request is done asyncronously, with no user or password
-   * authentication information. If `async` is false, the request will be send
+   * authentication information. If `async` is false, the request will be sent
    * synchronously.
    *
    * Calling `open` again on a currently active request is equivalent to
-   * calling `abort`.
+   * calling [abort].
    *
    * Note: Most simple HTTP requests can be accomplished using the [getString],
    * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
@@ -17655,7 +17656,7 @@
    * response.
    *
    * This value must be set before the request has been sent. See also the list
-   * of [IANA Official MIME types](https://www.iana.org/assignments/media-types/media-types.xhtml)
+   * of [IANA Official MIME types](https://www.iana.org/assignments/media-types/media-types.xhtml).
    */
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
@@ -30365,8 +30366,6 @@
    *
    * * [Window.open](https://developer.mozilla.org/en-US/docs/Web/API/Window.open)
    *   from MDN.
-   * * [Window open](http://docs.webplatform.org/wiki/dom/methods/open)
-   *   from WebPlatform.org.
    */
   WindowBase open(String url, String name, [String options]) {
     if (options == null) {
@@ -30753,8 +30752,8 @@
    *
    * ## Other resources
    *
-   * * [innerHeight](http://docs.webplatform.org/wiki/css/cssom/properties/innerHeight)
-   *   from WebPlatform.org.
+   * * [Window.innerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window/innerHeight)
+   *   from MDN.
    */
   final int innerHeight;
 
@@ -30763,8 +30762,8 @@
    *
    * ## Other resources
    *
-   * * [innerWidth](http://docs.webplatform.org/wiki/css/cssom/properties/innerWidth)
-   *   from WebPlatform.org.
+   * * [Window.innerWidth](https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth)
+   *   from MDN.
    */
   final int innerWidth;
 
@@ -30811,8 +30810,8 @@
    *
    * ## Other resources
    *
-   * * [Window name](http://docs.webplatform.org/wiki/html/attributes/name_(window))
-   *   from WebPlatform.org.
+   * * [Window.name](https://developer.mozilla.org/en-US/docs/Web/API/Window/name)
+   *   from MDN.
    */
   String name;
 
@@ -30832,7 +30831,7 @@
    *
    * ## Other resources
    *
-   * * [offscreenBuffering](http://docs.webplatform.org/wiki/dom/properties/offscreenBuffering)
+   * * [offscreenBuffering](https://webplatform.github.io/docs/dom/HTMLElement/offscreenBuffering/)
    *   from WebPlatform.org.
    */
   final bool offscreenBuffering;
@@ -30856,8 +30855,8 @@
    *
    * ## Other resources
    *
-   * * [outerHeight](http://docs.webplatform.org/wiki/css/cssom/properties/outerHeight)
-   *   from WebPlatform.org.
+   * * [Window.outerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerHeight)
+   *   from MDN.
    */
   final int outerHeight;
 
@@ -30866,8 +30865,8 @@
    *
    * ## Other resources
    *
-   * * [outerWidth](http://docs.webplatform.org/wiki/css/cssom/properties/outerWidth)
-   *   from WebPlatform.org.
+   * * [Window.outerWidth](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerWidth)
+   *   from MDN.
    */
   final int outerWidth;
 
@@ -31274,8 +31273,8 @@
    *
    * ## Other resources
    *
-   * * [Window resizeBy](http://docs.webplatform.org/wiki/dom/methods/resizeBy)
-   *   from WebPlatform.org.
+   * * [Window.resizeBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/resizeBy)
+   *   from MDN.
    */
   void resizeBy(int x, int y) native;
 
@@ -31284,8 +31283,8 @@
    *
    * ## Other resources
    *
-   * * [Window resizeTo](http://docs.webplatform.org/wiki/dom/methods/resizeTo)
-   *   from WebPlatform.org.
+   * * [Window.resizeTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/resizeTo)
+   *   from MDN.
    */
   void resizeTo(int x, int y) native;
 
@@ -31296,8 +31295,8 @@
    *
    * ## Other resources
    *
-   * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
-   *   from WebPlatform.org.
+   * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)
+   *   from MDN.
    */
   void scroll([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
@@ -31333,8 +31332,8 @@
    *
    * ## Other resources
    *
-   * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
-   *   from WebPlatform.org.
+   * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)
+   *   from MDN.
    */
   void _scroll_1() native;
   @JSName('scroll')
@@ -31345,8 +31344,8 @@
    *
    * ## Other resources
    *
-   * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
-   *   from WebPlatform.org.
+   * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)
+   *   from MDN.
    */
   void _scroll_2(options) native;
   @JSName('scroll')
@@ -31357,8 +31356,8 @@
    *
    * ## Other resources
    *
-   * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
-   *   from WebPlatform.org.
+   * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)
+   *   from MDN.
    */
   void _scroll_3(num x, num y) native;
   @JSName('scroll')
@@ -31369,8 +31368,8 @@
    *
    * ## Other resources
    *
-   * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
-   *   from WebPlatform.org.
+   * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)
+   *   from MDN.
    */
   void _scroll_4(int x, int y) native;
   @JSName('scroll')
@@ -31381,8 +31380,8 @@
    *
    * ## Other resources
    *
-   * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)
-   *   from WebPlatform.org.
+   * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)
+   *   from MDN.
    */
   void _scroll_5(int x, int y, scrollOptions) native;
 
@@ -31391,8 +31390,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
-   *   from WebPlatform.org.
+   * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)
+   *   from MDN.
    */
   void scrollBy([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
@@ -31426,8 +31425,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
-   *   from WebPlatform.org.
+   * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)
+   *   from MDN.
    */
   void _scrollBy_1() native;
   @JSName('scrollBy')
@@ -31436,8 +31435,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
-   *   from WebPlatform.org.
+   * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)
+   *   from MDN.
    */
   void _scrollBy_2(options) native;
   @JSName('scrollBy')
@@ -31446,8 +31445,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
-   *   from WebPlatform.org.
+   * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)
+   *   from MDN.
    */
   void _scrollBy_3(num x, num y) native;
   @JSName('scrollBy')
@@ -31456,8 +31455,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
-   *   from WebPlatform.org.
+   * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)
+   *   from MDN.
    */
   void _scrollBy_4(int x, int y) native;
   @JSName('scrollBy')
@@ -31466,8 +31465,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)
-   *   from WebPlatform.org.
+   * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)
+   *   from MDN.
    */
   void _scrollBy_5(int x, int y, scrollOptions) native;
 
@@ -31478,8 +31477,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
-   *   from WebPlatform.org.
+   * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)
+   *   from MDN.
    */
   void scrollTo([options_OR_x, y, Map scrollOptions]) {
     if (options_OR_x == null && y == null && scrollOptions == null) {
@@ -31515,8 +31514,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
-   *   from WebPlatform.org.
+   * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)
+   *   from MDN.
    */
   void _scrollTo_1() native;
   @JSName('scrollTo')
@@ -31527,8 +31526,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
-   *   from WebPlatform.org.
+   * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)
+   *   from MDN.
    */
   void _scrollTo_2(options) native;
   @JSName('scrollTo')
@@ -31539,8 +31538,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
-   *   from WebPlatform.org.
+   * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)
+   *   from MDN.
    */
   void _scrollTo_3(num x, num y) native;
   @JSName('scrollTo')
@@ -31551,8 +31550,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
-   *   from WebPlatform.org.
+   * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)
+   *   from MDN.
    */
   void _scrollTo_4(int x, int y) native;
   @JSName('scrollTo')
@@ -31563,8 +31562,8 @@
    *
    * ## Other resources
    *
-   * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)
-   *   from WebPlatform.org.
+   * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)
+   *   from MDN.
    */
   void _scrollTo_5(int x, int y, scrollOptions) native;
 
@@ -35259,7 +35258,8 @@
    *
    * See also:
    *
-   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   * * [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)
+   *   from MDN.
    */
   Stream<T> forTarget(EventTarget e, {bool useCapture: false}) =>
       new _EventStream<T>(e, _eventType, useCapture);
@@ -35283,7 +35283,8 @@
    *
    * See also:
    *
-   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   * * [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)
+   *   from MDN.
    */
   ElementStream<T> forElement(Element e, {bool useCapture: false}) {
     return new _ElementEventStreamImpl<T>(e, _eventType, useCapture);
@@ -35301,7 +35302,8 @@
    *
    * See also:
    *
-   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   * * [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)
+   *   from MDN.
    */
   ElementStream<T> _forElementList(ElementList<Element> e,
       {bool useCapture: false}) {
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 78dabae..7dd739d 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -67,8 +67,8 @@
  * check out
  * [Use IndexedDB](http://www.dartlang.org/docs/tutorials/indexeddb/).
  *
- * [IndexedDB reference](http://docs.webplatform.org/wiki/apis/indexeddb)
- * provides wiki-style docs about indexedDB
+ * MDN provides [API
+ * documentation](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API).
  *
  * {@category Web}
  */
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 7ffc482..f5ae6a1 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -164,3 +164,41 @@
 /// See this issue for more context:
 /// https://github.com/dart-lang/sdk/issues/31371
 external Object extractTypeArguments<T>(T instance, Function extract);
+
+/// Annotation class marking the version where SDK API was added.
+///
+/// A `Since` annotation can be applied to a library declaration,
+/// any public declaration in a library, or in a class, or to
+/// an optional parameter.
+///
+/// It signifies that the export, member or parameter was *added* in
+/// that version.
+///
+/// When applied to a library declaration, it also a applies to
+/// all members declared or exported by that library.
+/// If applied to a class, it also applies to all members and constructors
+/// of that class.
+/// If applied to a class method, or parameter of such,
+/// any method implementing that interface method is also annotated.
+/// I multiple `Since` annotations apply to the same declaration or
+/// parameter, the latest version takes precendence.
+///
+/// Any use of a marked API may trigger a warning if the using code
+/// does not require an SDK version guaranteeing that the API is available,
+/// unless the API feature is also provided by something else.
+/// It is only a problem if an annotated feature is used, and the annotated
+/// API is the *only* thing providing the functionality.
+/// For example, using `Future` exported by `dart:core` is not a problem
+/// if the same library also imports `dart:async`, and using an optional
+/// parameter on an interface is not a problem if the same type also
+/// implements another interface providing the same parameter.
+///
+/// The version must be a semantic version (like `1.4.2` or `0.9.4-rec.4`),
+/// or the first two numbers of a semantic version (like `1.0` or `2.2`),
+/// representing a stable release, and equivalent to the semantic version
+/// you get by appending a `.0`.
+@Since("2.2")
+class Since {
+  final String version;
+  const Since(this.version);
+}
diff --git a/sdk/lib/internal/iterable.dart b/sdk/lib/internal/iterable.dart
index 1c11e53..10f0898 100644
--- a/sdk/lib/internal/iterable.dart
+++ b/sdk/lib/internal/iterable.dart
@@ -493,9 +493,8 @@
   final int _takeCount;
 
   factory TakeIterable(Iterable<E> iterable, int takeCount) {
-    if (takeCount is! int || takeCount < 0) {
-      throw new ArgumentError(takeCount);
-    }
+    ArgumentError.checkNotNull(takeCount, "takeCount");
+    RangeError.checkNotNegative(takeCount, "takeCount");
     if (iterable is EfficientLengthIterable) {
       return new EfficientLengthTakeIterable<E>(iterable, takeCount);
     }
@@ -526,7 +525,7 @@
   int _remaining;
 
   TakeIterator(this._iterator, this._remaining) {
-    assert(_remaining is int && _remaining >= 0);
+    assert(_remaining >= 0);
   }
 
   bool moveNext() {
@@ -621,9 +620,7 @@
 }
 
 int _checkCount(int count) {
-  if (count is! int) {
-    throw new ArgumentError.value(count, "count", "is not an integer");
-  }
+  ArgumentError.checkNotNull(count, "count");
   RangeError.checkNotNegative(count, "count");
   return count;
 }
@@ -633,7 +630,7 @@
   int _skipCount;
 
   SkipIterator(this._iterator, this._skipCount) {
-    assert(_skipCount is int && _skipCount >= 0);
+    assert(_skipCount >= 0);
   }
 
   bool moveNext() {
diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
index 74870cb..77b7587 100644
--- a/sdk/lib/io/common.dart
+++ b/sdk/lib/io/common.dart
@@ -72,7 +72,7 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write("OS Error");
-    if (!message.isEmpty) {
+    if (message.isNotEmpty) {
       sb..write(": ")..write(message);
       if (errorCode != noErrorCode) {
         sb..write(", errno = ")..write(errorCode.toString());
@@ -105,9 +105,7 @@
   int j = start;
   for (int i = 0; i < length; i++) {
     int value = buffer[j];
-    if (value is! int) {
-      throw new ArgumentError("List element is not an integer at index $j");
-    }
+    if (value == null) throw ArgumentError("List element is null at index $j");
     newBuffer[i] = value;
     j++;
   }
diff --git a/sdk/lib/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index ab0770b..2f51fe9 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -160,7 +160,7 @@
       this.windowBits: ZLibOption.defaultWindowBits,
       this.memLevel: ZLibOption.defaultMemLevel,
       this.strategy: ZLibOption.strategyDefault,
-      this.dictionary: null,
+      this.dictionary,
       this.raw: false,
       this.gzip: false}) {
     _validateZLibeLevel(level);
@@ -277,7 +277,7 @@
       this.windowBits: ZLibOption.defaultWindowBits,
       this.memLevel: ZLibOption.defaultMemLevel,
       this.strategy: ZLibOption.strategyDefault,
-      this.dictionary: null,
+      this.dictionary,
       this.raw: false,
       this.gzip: true}) {
     _validateZLibeLevel(level);
@@ -385,7 +385,7 @@
       this.windowBits: ZLibOption.defaultWindowBits,
       this.memLevel: ZLibOption.defaultMemLevel,
       this.strategy: ZLibOption.strategyDefault,
-      this.dictionary: null,
+      this.dictionary,
       this.raw: false}) {
     _validateZLibeLevel(level);
     _validateZLibMemLevel(memLevel);
@@ -450,7 +450,7 @@
 
   ZLibDecoder(
       {this.windowBits: ZLibOption.defaultWindowBits,
-      this.dictionary: null,
+      this.dictionary,
       this.raw: false}) {
     _validateZLibWindowBits(windowBits);
   }
@@ -629,6 +629,7 @@
         _sink.add(out);
       }
     } catch (e) {
+      // TODO(kevmoo): not sure why this isn't a try/finally
       _closed = true;
       throw e;
     }
diff --git a/sdk/lib/io/directory_impl.dart b/sdk/lib/io/directory_impl.dart
index ea1aa74..faed892 100644
--- a/sdk/lib/io/directory_impl.dart
+++ b/sdk/lib/io/directory_impl.dart
@@ -9,9 +9,7 @@
   Uint8List _rawPath;
 
   _Directory(String path) {
-    if (path is! String) {
-      throw new ArgumentError('${Error.safeToString(path)} is not a String');
-    }
+    ArgumentError.checkNotNull(path, 'path');
     _path = path;
     _rawPath = FileSystemEntity._toUtf8Array(_path);
   }
@@ -145,7 +143,7 @@
       new Directory(_systemTemp(_Namespace._namespace));
 
   Future<Directory> createTemp([String prefix]) {
-    if (prefix == null) prefix = '';
+    prefix ??= '';
     if (path == '') {
       throw new ArgumentError("Directory.createTemp called with an empty path. "
           "To use the system temp directory, use Directory.systemTemp");
@@ -169,7 +167,7 @@
   }
 
   Directory createTempSync([String prefix]) {
-    if (prefix == null) prefix = '';
+    prefix ??= '';
     if (path == '') {
       throw new ArgumentError("Directory.createTemp called with an empty path. "
           "To use the system temp directory, use Directory.systemTemp");
@@ -192,8 +190,9 @@
   }
 
   Future<Directory> _delete({bool recursive: false}) {
-    return _File._dispatchWithNamespace(_IOService.directoryDelete,
-        [null, _rawPath, recursive]).then((response) {
+    return _File._dispatchWithNamespace(
+            _IOService.directoryDelete, [null, _rawPath, recursive])
+        .then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionOrErrorFromResponse(response, "Deletion failed");
       }
@@ -252,8 +251,8 @@
         result,
         // FIXME(bkonyi): here we're using `path` directly, which might cause issues
         // if it is not UTF-8 encoded.
-        FileSystemEntity
-            ._toUtf8Array(FileSystemEntity._ensureTrailingPathSeparators(path)),
+        FileSystemEntity._toUtf8Array(
+            FileSystemEntity._ensureTrailingPathSeparators(path)),
         recursive,
         followLinks);
     return result;
@@ -369,8 +368,8 @@
       return;
     }
     nextRunning = true;
-    _IOService
-        ._dispatch(_IOService.directoryListNext, [pointer]).then((result) {
+    _IOService._dispatch(_IOService.directoryListNext, [pointer])
+        .then((result) {
       nextRunning = false;
       if (result is List) {
         next();
@@ -420,8 +419,8 @@
     if (pointer == null) {
       _cleanup();
     } else {
-      _IOService._dispatch(
-          _IOService.directoryListStop, [pointer]).whenComplete(_cleanup);
+      _IOService._dispatch(_IOService.directoryListStop, [pointer])
+          .whenComplete(_cleanup);
     }
   }
 
diff --git a/sdk/lib/io/embedder_config.dart b/sdk/lib/io/embedder_config.dart
index 89265cf..cbc94f7 100644
--- a/sdk/lib/io/embedder_config.dart
+++ b/sdk/lib/io/embedder_config.dart
@@ -11,6 +11,7 @@
 /// permitted to use (e.g. exit()). By default, the whole dart:io API is
 /// enabled. When a disallowed operation is attempted, an `UnsupportedError` is
 /// thrown.
+@pragma('vm:entry-point')
 abstract class _EmbedderConfig {
   /// The Isolate may set Directory.current.
   static bool _mayChdir = true;
@@ -20,12 +21,15 @@
   static bool _mayExit = true;
 
   // The Isolate may set Stdin.echoMode.
+  @pragma('vm:entry-point')
   static bool _maySetEchoMode = true;
 
   // The Isolate may set Stdin.lineMode.
+  @pragma('vm:entry-point')
   static bool _maySetLineMode = true;
 
   /// The Isolate may call sleep().
+  @pragma('vm:entry-point')
   static bool _maySleep = true;
 
   // TODO(zra): Consider adding:
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index a7f4c66..eb3db4c 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -989,7 +989,7 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write("FileSystemException");
-    if (!message.isEmpty) {
+    if (message.isNotEmpty) {
       sb.write(": $message");
       if (path != null) {
         sb.write(", path = '$path'");
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index e8221bc..33c1352 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -28,7 +28,7 @@
   bool _atEnd = false;
 
   _FileStream(this._path, this._position, this._end) {
-    if (_position == null) _position = 0;
+    _position ??= 0;
   }
 
   _FileStream.forStdin() : _position = 0;
@@ -207,17 +207,13 @@
   Uint8List _rawPath;
 
   _File(String path) {
-    if (path is! String) {
-      throw new ArgumentError('${Error.safeToString(path)} is not a String');
-    }
+    ArgumentError.checkNotNull(path, 'path');
     _path = path;
     _rawPath = FileSystemEntity._toUtf8Array(path);
   }
 
   _File.fromRawPath(Uint8List rawPath) {
-    if (rawPath == null) {
-      throw new ArgumentError('rawPath cannot be null');
-    }
+    ArgumentError.checkNotNull(rawPath, 'rawPath');
     _rawPath = FileSystemEntity._toNullTerminatedUtf8Array(rawPath);
     _path = FileSystemEntity._toStringFromUtf8Array(rawPath);
   }
@@ -746,9 +742,7 @@
   }
 
   Future<List<int>> read(int bytes) {
-    if (bytes is! int) {
-      throw new ArgumentError(bytes);
-    }
+    ArgumentError.checkNotNull(bytes, 'bytes');
     return _dispatch(_IOService.fileRead, [null, bytes]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "read failed", path);
@@ -761,9 +755,7 @@
 
   List<int> readSync(int bytes) {
     _checkAvailable();
-    if (bytes is! int) {
-      throw new ArgumentError(bytes);
-    }
+    ArgumentError.checkNotNull(bytes, 'bytes');
     var result = _ops.read(bytes);
     if (result is OSError) {
       throw new FileSystemException("readSync failed", path, result);
@@ -815,9 +807,7 @@
   }
 
   Future<RandomAccessFile> writeByte(int value) {
-    if (value is! int) {
-      throw new ArgumentError(value);
-    }
+    ArgumentError.checkNotNull(value, 'value');
     return _dispatch(_IOService.fileWriteByte, [null, value]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "writeByte failed", path);
@@ -829,9 +819,7 @@
 
   int writeByteSync(int value) {
     _checkAvailable();
-    if (value is! int) {
-      throw new ArgumentError(value);
-    }
+    ArgumentError.checkNotNull(value, 'value');
     var result = _ops.writeByte(value);
     if (result is OSError) {
       throw new FileSystemException("writeByte failed", path, result);
@@ -895,17 +883,13 @@
 
   Future<RandomAccessFile> writeString(String string,
       {Encoding encoding: utf8}) {
-    if (encoding is! Encoding) {
-      throw new ArgumentError(encoding);
-    }
+    ArgumentError.checkNotNull(encoding, 'encoding');
     var data = encoding.encode(string);
     return writeFrom(data, 0, data.length);
   }
 
   void writeStringSync(String string, {Encoding encoding: utf8}) {
-    if (encoding is! Encoding) {
-      throw new ArgumentError(encoding);
-    }
+    ArgumentError.checkNotNull(encoding, 'encoding');
     var data = encoding.encode(string);
     writeFromSync(data, 0, data.length);
   }
diff --git a/sdk/lib/io/file_system_entity.dart b/sdk/lib/io/file_system_entity.dart
index 2c995d0..17b05ce 100644
--- a/sdk/lib/io/file_system_entity.dart
+++ b/sdk/lib/io/file_system_entity.dart
@@ -165,8 +165,8 @@
     if (Platform.isWindows) {
       path = FileSystemEntity._trimTrailingPathSeparators(path);
     }
-    return _File._dispatchWithNamespace(_IOService.fileStat, [null, path]).then(
-        (response) {
+    return _File._dispatchWithNamespace(_IOService.fileStat, [null, path])
+        .then((response) {
       if (_isErrorResponse(response)) {
         return FileStat._notFound;
       }
@@ -846,7 +846,7 @@
   // TODO(bkonyi): find a way to do this with raw paths.
   static String _trimTrailingPathSeparators(String path) {
     // Don't handle argument errors here.
-    if (path is! String) return path;
+    if (path == null) return path;
     if (Platform.isWindows) {
       while (path.length > 1 &&
           (path.endsWith(Platform.pathSeparator) || path.endsWith('/'))) {
@@ -863,7 +863,7 @@
   // TODO(bkonyi): find a way to do this with raw paths.
   static String _ensureTrailingPathSeparators(String path) {
     // Don't handle argument errors here.
-    if (path is! String) return path;
+    if (path == null) return path;
     if (path.isEmpty) path = '.';
     if (Platform.isWindows) {
       while (!path.endsWith(Platform.pathSeparator) && !path.endsWith('/')) {
diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
index a8386dc..e8e4a08 100644
--- a/sdk/lib/io/io_sink.dart
+++ b/sdk/lib/io/io_sink.dart
@@ -104,6 +104,9 @@
    *
    * Returns a [Future] that completes when
    * all elements of the given [stream] are added to `this`.
+   *
+   * This function must not be called when a stream is currently being added
+   * using this function.
    */
   Future addStream(Stream<List<int>> stream);
 
diff --git a/sdk/lib/io/link.dart b/sdk/lib/io/link.dart
index 01b1d67..b43c13a 100644
--- a/sdk/lib/io/link.dart
+++ b/sdk/lib/io/link.dart
@@ -22,6 +22,7 @@
     return overrides.createLink(path);
   }
 
+  @pragma("vm:entry-point")
   factory Link.fromRawPath(Uint8List rawPath) {
     // TODO(bkonyi): handle overrides
     return new _Link.fromRawPath(rawPath);
@@ -161,10 +162,7 @@
   Uint8List _rawPath;
 
   _Link(String path) {
-    if (path is! String) {
-      throw new ArgumentError('${Error.safeToString(path)} '
-          'is not a String');
-    }
+    ArgumentError.checkNotNull(path, 'path');
     _path = path;
     _rawPath = FileSystemEntity._toUtf8Array(path);
   }
@@ -223,8 +221,8 @@
       return '\\??\\$result';
     } else {
       throw new FileSystemException(
-          'Target $result of Link.create on Windows cannot be converted' +
-              ' to start with a drive letter.  Unexpected error.');
+          'Target $result of Link.create on Windows cannot be converted'
+          ' to start with a drive letter.  Unexpected error.');
     }
   }
 
diff --git a/sdk/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
index 6b918b5..a350119 100644
--- a/sdk/lib/io/platform_impl.dart
+++ b/sdk/lib/io/platform_impl.dart
@@ -38,7 +38,7 @@
 
   static String executable = _executable();
   static String resolvedExecutable = _resolvedExecutable();
-  static String packageRoot = null; // TODO(mfairhurst): remove this
+  static String packageRoot; // TODO(mfairhurst): remove this
   static String packageConfig = _packageConfig();
 
   @pragma("vm:entry-point")
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index b6c616a..4cf78b9 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -21,6 +21,13 @@
  * This does not wait for any asynchronous operations to terminate. Using
  * [exit] is therefore very likely to lose data.
  *
+ * While debugging, the VM will not respect the `--pause-isolates-on-exit`
+ * flag if [exit] is called as invoking this method causes the Dart VM
+ * process to shutdown immediately. To properly break on exit, consider
+ * calling [debugger] from `dart:developer` or [Isolate.pause] from
+ * `dart:isolate` on [Isolate.current] to pause the isolate before
+ * invoking [exit].
+ *
  * The handling of exit codes is platform specific.
  *
  * On Linux and OS X an exit code for normal termination will always
@@ -43,9 +50,7 @@
  * cross-platform issues.
  */
 void exit(int code) {
-  if (code is! int) {
-    throw new ArgumentError("Integer value for exit code expected");
-  }
+  ArgumentError.checkNotNull(code, "code");
   if (!_EmbedderConfig._mayExit) {
     throw new UnsupportedError(
         "This embedder disallows calling dart:io's exit()");
@@ -66,9 +71,7 @@
  * exit code.
  */
 void set exitCode(int code) {
-  if (code is! int) {
-    throw new ArgumentError("Integer value for exit code expected");
-  }
+  ArgumentError.checkNotNull(code, "code");
   _ProcessUtils._setExitCode(code);
 }
 
@@ -655,7 +658,7 @@
   final String message;
   final osError;
 
-  const SignalException(this.message, [this.osError = null]);
+  const SignalException(this.message, [this.osError]);
 
   String toString() {
     var msg = "";
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 787762b..b4c0132 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -509,9 +509,7 @@
       this.requireClientCertificate,
       this.onBadCertificate,
       List<String> supportedProtocols) {
-    if (context == null) {
-      context = SecurityContext.defaultContext;
-    }
+    context ??= SecurityContext.defaultContext;
     _controller = new StreamController<RawSocketEvent>(
         sync: true,
         onListen: _onSubscriptionStateChange,
@@ -583,21 +581,14 @@
     if (host is! String && host is! InternetAddress) {
       throw new ArgumentError("host is not a String or an InternetAddress");
     }
-    if (requestedPort is! int) {
-      throw new ArgumentError("requestedPort is not an int");
-    }
+    ArgumentError.checkNotNull(requestedPort, "requestedPort");
     if (requestedPort < 0 || requestedPort > 65535) {
-      throw new ArgumentError("requestedPort is not in the range 0..65535");
+      throw ArgumentError("requestedPort is not in the range 0..65535");
     }
-    if (requestClientCertificate is! bool) {
-      throw new ArgumentError("requestClientCertificate is not a bool");
-    }
-    if (requireClientCertificate is! bool) {
-      throw new ArgumentError("requireClientCertificate is not a bool");
-    }
-    if (onBadCertificate != null && onBadCertificate is! Function) {
-      throw new ArgumentError("onBadCertificate is not null or a Function");
-    }
+    ArgumentError.checkNotNull(
+        requestClientCertificate, "requestClientCertificate");
+    ArgumentError.checkNotNull(
+        requireClientCertificate, "requireClientCertificate");
   }
 
   int get port => _socket.port;
@@ -716,8 +707,8 @@
       return 0;
     }
     if (_status != connectedStatus) return 0;
-    if (offset == null) offset = 0;
-    if (bytes == null) bytes = data.length - offset;
+    offset ??= 0;
+    bytes ??= data.length - offset;
 
     int written =
         _secureFilter.buffers[writePlaintextId].write(data, offset, bytes);
@@ -1265,7 +1256,7 @@
   final OSError osError;
 
   @pragma("vm:entry-point")
-  const TlsException([String message = "", OSError osError = null])
+  const TlsException([String message = "", OSError osError])
       : this._("TlsException", message, osError);
 
   const TlsException._(this.type, this.message, this.osError);
@@ -1273,7 +1264,7 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write(type);
-    if (!message.isEmpty) {
+    if (message.isNotEmpty) {
       sb.write(": $message");
       if (osError != null) {
         sb.write(" ($osError)");
@@ -1292,7 +1283,7 @@
 @pragma("vm:entry-point")
 class HandshakeException extends TlsException {
   @pragma("vm:entry-point")
-  const HandshakeException([String message = "", OSError osError = null])
+  const HandshakeException([String message = "", OSError osError])
       : super._("HandshakeException", message, osError);
 }
 
@@ -1303,6 +1294,6 @@
  */
 class CertificateException extends TlsException {
   @pragma("vm:entry-point")
-  const CertificateException([String message = "", OSError osError = null])
+  const CertificateException([String message = "", OSError osError])
       : super._("CertificateException", message, osError);
 }
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index b66e42b..fb46acf 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -823,7 +823,7 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write("SocketException");
-    if (!message.isEmpty) {
+    if (message.isNotEmpty) {
       sb.write(": $message");
       if (osError != null) {
         sb.write(" ($osError)");
diff --git a/sdk/lib/io/stdio.dart b/sdk/lib/io/stdio.dart
index 241e7d2..1c1ce97 100644
--- a/sdk/lib/io/stdio.dart
+++ b/sdk/lib/io/stdio.dart
@@ -227,7 +227,7 @@
    */
   int get terminalColumns => _terminalColumns(_fd);
 
-  /*
+  /**
    * Get the number of lines of the terminal.
    *
    * If no terminal is attached to stdout, a [StdoutException] is thrown. See
@@ -268,9 +268,7 @@
    * Get a non-blocking `IOSink`.
    */
   IOSink get nonBlocking {
-    if (_nonBlocking == null) {
-      _nonBlocking = new IOSink(new _FileStreamConsumer.fromStdio(_fd));
-    }
+    _nonBlocking ??= new IOSink(new _FileStreamConsumer.fromStdio(_fd));
     return _nonBlocking;
   }
 }
@@ -405,9 +403,7 @@
 
 /// The standard input stream of data read by this program.
 Stdin get stdin {
-  if (_stdin == null) {
-    _stdin = _StdIOUtils._getStdioInputStream(_stdinFD);
-  }
+  _stdin ??= _StdIOUtils._getStdioInputStream(_stdinFD);
   return _stdin;
 }
 
@@ -417,9 +413,7 @@
 /// result in an unhandled asynchronous error unless there is an error handler
 /// on `done`.
 Stdout get stdout {
-  if (_stdout == null) {
-    _stdout = _StdIOUtils._getStdioOutputStream(_stdoutFD);
-  }
+  _stdout ??= _StdIOUtils._getStdioOutputStream(_stdoutFD);
   return _stdout;
 }
 
@@ -429,9 +423,7 @@
 /// result in an unhandled asynchronous error unless there is an error handler
 /// on `done`.
 Stdout get stderr {
-  if (_stderr == null) {
-    _stderr = _StdIOUtils._getStdioOutputStream(_stderrFD);
-  }
+  _stderr ??= _StdIOUtils._getStdioOutputStream(_stderrFD);
   return _stderr;
 }
 
diff --git a/sdk/lib/io/string_transformer.dart b/sdk/lib/io/string_transformer.dart
index 5f4a14c..f31c41e 100644
--- a/sdk/lib/io/string_transformer.dart
+++ b/sdk/lib/io/string_transformer.dart
@@ -6,20 +6,21 @@
 
 /// The current system encoding.
 ///
-/// This us used for converting from bytes to/from String when
+/// This is used for converting from bytes to and from Strings when
 /// communicating on stdin, stdout and stderr.
 ///
-/// On Windows this will use the currently active code page for the
-/// conversion. On all other systems it will always use UTF-8.
+/// On Windows this will use the currently active code page for the conversion.
+/// On all other systems it will always use UTF-8.
 const SystemEncoding systemEncoding = const SystemEncoding();
 @Deprecated("Use systemEncoding instead")
 const SystemEncoding SYSTEM_ENCODING = const SystemEncoding();
 
-/**
- * The system encoding is the current code page on Windows and UTF-8 on
- * Linux and Mac.
- */
+/// The system encoding is the current code page on Windows and UTF-8 on Linux
+/// and Mac.
 class SystemEncoding extends Encoding {
+  /// Creates a const SystemEncoding.
+  ///
+  /// Users should use the top-level constant, [systemEncoding].
   const SystemEncoding();
 
   String get name => 'system';
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index e517e0d..6e43fb7 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -554,8 +554,9 @@
     StreamController controller;
     RawReceivePort port;
     void handleError(message) {
-      String errorDescription = message[0];
-      String stackDescription = message[1];
+      List listMessage = message;
+      String errorDescription = listMessage[0];
+      String stackDescription = listMessage[1];
       var error = new RemoteError(errorDescription, stackDescription);
       controller.addError(error, error.stackTrace);
     }
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index a178398..db0bf0c 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -342,6 +342,7 @@
       },
       "isolate": {
         "patches": "../../pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart",
+        "supported": false,
         "uri": "isolate/isolate.dart"
       },
       "web_gl": {
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index e7da30f..e2d0f7c 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -411,6 +411,7 @@
       isolate:
         uri: "isolate/isolate.dart"
         patches: "../../pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart"
+        supported: false
 
       mirrors:
         uri: "mirrors/mirrors.dart"
diff --git a/sdk/lib/math/math.dart b/sdk/lib/math/math.dart
index 658c834..f33a7a8 100644
--- a/sdk/lib/math/math.dart
+++ b/sdk/lib/math/math.dart
@@ -145,8 +145,9 @@
  *
  * This corresponds to the `pow` function defined in the IEEE Standard 754-2008.
  *
- * Notice that an [int] result cannot overflow, but a [double] result might
- * be [double.infinity].
+ * Notice that the result may overflow. If integers are represented as 64-bit
+ * numbers, an integer result may be truncated, and a double result may overflow 
+ * to positive or negative [double.infinity].
  */
 external num pow(num x, num exponent);
 
diff --git a/sdk/lib/math/point.dart b/sdk/lib/math/point.dart
index af62968..f627dcf 100644
--- a/sdk/lib/math/point.dart
+++ b/sdk/lib/math/point.dart
@@ -23,10 +23,10 @@
    * `other` is a `Point` with
    * [x] equal to `other.x` and [y] equal to `other.y`.
    */
-  bool operator ==(other) {
-    if (other is! Point) return false;
-    return x == other.x && y == other.y;
-  }
+  bool operator ==(dynamic other) =>
+      // Cannot change parameter type to `Object` in case some class
+      // inherits the type and uses their argument dynamically.
+      other is Point && x == other.x && y == other.y;
 
   int get hashCode => _JenkinsSmiHash.hash2(x.hashCode, y.hashCode);
 
diff --git a/sdk/lib/math/rectangle.dart b/sdk/lib/math/rectangle.dart
index 563713c..88e0eda 100644
--- a/sdk/lib/math/rectangle.dart
+++ b/sdk/lib/math/rectangle.dart
@@ -38,13 +38,14 @@
     return 'Rectangle ($left, $top) $width x $height';
   }
 
-  bool operator ==(other) {
-    if (other is! Rectangle) return false;
-    return left == other.left &&
-        top == other.top &&
-        right == other.right &&
-        bottom == other.bottom;
-  }
+  bool operator ==(dynamic other) =>
+      // Can't change argument type to `Object` since subclasses inherit it
+      // and uses their argument dynamically.
+      other is Rectangle &&
+      left == other.left &&
+      top == other.top &&
+      right == other.right &&
+      bottom == other.bottom;
 
   int get hashCode => _JenkinsSmiHash.hash4(
       left.hashCode, top.hashCode, right.hashCode, bottom.hashCode);
diff --git a/tests/co19_2/co19_2-analyzer.status b/tests/co19_2/co19_2-analyzer.status
index 458b18f..9de243e 100644
--- a/tests/co19_2/co19_2-analyzer.status
+++ b/tests/co19_2/co19_2-analyzer.status
@@ -8,42 +8,12 @@
 Language/Classes/Abstract_Instance_Members/override_default_value_t03: MissingCompileTimeError # Issue 33995
 Language/Classes/Abstract_Instance_Members/override_default_value_t04: MissingCompileTimeError # Issue 33995
 Language/Classes/Abstract_Instance_Members/override_default_value_t05: MissingCompileTimeError # Issue 33995
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t01: MissingCompileTimeError # Issue 33995
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t02: MissingCompileTimeError # Issue 33995
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError # Issue 33995
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError # Issue 33995
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError # Issue 33995
-Language/Classes/Constructors/name_t01: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Constructors/name_t02: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Constructors/name_t03: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t01: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t02: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t03: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t04: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t05: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Getters/type_object_t01: CompileTimeError # Issue 33995
 Language/Classes/Getters/type_object_t02: CompileTimeError # Issue 33995
 Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError # Issue 33995
 Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError # Issue 33995
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError # Issue 33995
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingCompileTimeError # Issue 27476
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingCompileTimeError # Issue 27476
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: MissingCompileTimeError # Issue 27476
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingCompileTimeError # Issue 27476
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingCompileTimeError # Issue 27476
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingCompileTimeError # Issue 27476
-Language/Classes/Setters/instance_setter_t01: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t02: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t03: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t04: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t05: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/name_t06: CompileTimeError
-Language/Classes/Setters/name_t07: CompileTimeError
 Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError # Invalid test, see #33237
 Language/Classes/method_definition_t06: MissingCompileTimeError # Please triage this failure
-Language/Classes/mixins_t02: MissingCompileTimeError # This syntax is now allowed
 Language/Enums/syntax_t08: CompileTimeError # Issue 33995
 Language/Enums/syntax_t09: CompileTimeError # Issue 33995
 Language/Errors_and_Warnings/static_warning_t01: CompileTimeError # issue #34319
@@ -87,9 +57,6 @@
 Language/Mixins/Mixin_Application/syntax_t23: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t24: CompileTimeError # Issue 26409
 Language/Mixins/Mixin_Application/syntax_t25: CompileTimeError # Issue 26409
-Language/Mixins/Mixin_Application/warning_t01: CompileTimeError # Issue 23878
-Language/Mixins/Mixin_Application/warning_t02: CompileTimeError # Issue 23878
-Language/Mixins/Mixin_Application/warning_t03: CompileTimeError # Issue 23878
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Issue 24767
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Issue 24767
 Language/Overview/Privacy/private_and_public_t11: CompileTimeError
@@ -120,53 +87,158 @@
 Language/Statements/Return/no_expression_function_t16: CompileTimeError # issue #34319
 Language/Statements/Return/no_expression_not_function_t01: CompileTimeError # issue #34319
 Language/Types/Interface_Types/subtype_t30: CompileTimeError # Please triage this failure
+LanguageFeatures/Constant_update2018/CastOperator_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/CastOperator_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/CastOperator_A02_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/CastOperator_A03_t01/none: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/CastOperator_A03_t02/none: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A01_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A02_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A02_t04: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A02_t05: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A02_t07: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A02_t08: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t03/none: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t04/none: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t02: CompileTimeError # Please triage this failure
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t04: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l1_t03: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t07: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t08: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l1_t04: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t03: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t04: CompileTimeError # Please triage this failure
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l3_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l1_t04: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t02: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/01: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/02: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/03: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/04: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t02/none: CompileTimeError # Please triage this failure
 LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t04/none: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/static/class_l1_t03/none: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t07/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_l1_t04/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t03/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t04/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t05/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t08/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t09/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_l3_t02/none: CompileTimeError # Please triage this failure
 LanguageFeatures/Instantiate-to-bound/class/static/class_l4_t01/none: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/none: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t01/none: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t02/none: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t08: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t03/none: CompileTimeError # Please triage this failure
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t05/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_FutureOr_l1_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t02/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/01: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/02: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/03: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/04: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/05: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/06: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/07: MissingCompileTimeError # Please triage this failure
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t07/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/01: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/02: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/03: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/04: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/05: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/06: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/07: MissingCompileTimeError # Please triage this failure
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t01/none: CompileTimeError # Please triage this failure
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t03/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t04/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t06/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t07: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t08: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t09: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t10: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t13: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t14: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t15: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t21: CompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/constant_set_literals_A03_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/constant_set_literals_A04_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t03: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/non_constant_set_literals_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/non_constant_set_literals_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/semantics_A04_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/set_literals_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/set_literals_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/set_literals_A04_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/syntax_compatibility_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Simple-bounds/static/typedef_FutureOr_l1_t02/none: CompileTimeError
+LanguageFeatures/Simple-bounds/static/typedef_l1_t07/none: CompileTimeError
+LanguageFeatures/Simple-bounds/static/typedef_l2_t02/none: CompileTimeError # Please triage this failure
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t02: CompileTimeError # Issue 32903
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t05: CompileTimeError # Issue 32903
 LanguageFeatures/Super-bounded-types/static_analysis_A01_t08: CompileTimeError # Issue 32903
-LanguageFeatures/Super-mixins/more_specific_t01: CompileTimeError # Please triage this failure
-LanguageFeatures/Super-mixins/not_class_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/Super-mixins/not_class_t03: CompileTimeError # Please triage this failure
-LanguageFeatures/Super-mixins/on_word_t02: CompileTimeError # Please triage this failure
-LanguageFeatures/Super-mixins/on_word_t03: CompileTimeError # Please triage this failure
-LanguageFeatures/Super_Mixins/declarations_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_application_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_application_t02: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_application_t03: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_application_t04: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_applying_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_member_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_member_t02: CompileTimeError
-LanguageFeatures/Super_Mixins/more_specific_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/super_invocation_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/syntax_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/syntax_t02: CompileTimeError
-LanguageFeatures/Super_Mixins/syntax_t04: CompileTimeError
-LanguageFeatures/regression/33585_t01: MissingCompileTimeError # Please triage this failure
-LanguageFeatures/regression/33585_t02: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/Super-mixins/covariance_t03: MissingCompileTimeError # Issue 35111
+LanguageFeatures/Super-mixins/covariance_t06: MissingCompileTimeError # Issue 35111
+LanguageFeatures/Super-mixins/covariance_t07: MissingCompileTimeError # Issue 35111
 LanguageFeatures/regression/33597_t01: MissingCompileTimeError # Please triage this failure
 LanguageFeatures/regression/33701_t02: CompileTimeError # Please triage this failure
 LanguageFeatures/regression/34635_t01: CompileTimeError # Please triage this failure
 LanguageFeatures/regression/34635_t02: CompileTimeError # Please triage this failure
+LanguageFeatures/regression/34635_t03: CompileTimeError # Please triage this failure
 LibTest/async/Future/Future_A01_t01: CompileTimeError # Please triage this failure
+
+[ $compiler == dart2analyzer && $system != macos && $system != windows ]
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t08: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t10: MissingCompileTimeError
+LanguageFeatures/Simple-bounds/static/class_typedef_l1_t02/none: CompileTimeError
+LanguageFeatures/regression/33585_t01: MissingCompileTimeError # Please triage this failure
+LanguageFeatures/regression/33585_t02: MissingCompileTimeError # Please triage this failure
+
+[ $compiler == dart2analyzer && ($system == macos || $system == windows) ]
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t03/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t06/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t07/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_01_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_01_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t04/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t12: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t13: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t01/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t03/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t05: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t10: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t11: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_04_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_05_t05: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_06_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_06_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t03/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t06/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/07: MissingCompileTimeError
+LanguageFeatures/Set-literals/semantics_A05_t01: CompileTimeError
+LanguageFeatures/Set-literals/syntax_compatibility_A01_t02: CompileTimeError
diff --git a/tests/co19_2/co19_2-dart2js.status b/tests/co19_2/co19_2-dart2js.status
index 0f4eab7..a5c9730 100644
--- a/tests/co19_2/co19_2-dart2js.status
+++ b/tests/co19_2/co19_2-dart2js.status
@@ -3,7995 +3,14 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2js ]
-Language/Classes/Constructors/Generative_Constructors/execution_of_a_superinitializer_t01: RuntimeError
-Language/Classes/mixins_t02: MissingCompileTimeError # co19 issue 163
-Language/Expressions/Assignment/null_aware_assignment_static_type_t01: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t03: RuntimeError
-Language/Expressions/Booleans/Boolean_Conversion/definition_t01: RuntimeError
-Language/Expressions/Constants/literal_number_t01: CompileTimeError
-Language/Expressions/Constants/math_operators_t01: CompileTimeError
-Language/Expressions/Constants/math_operators_t06: CompileTimeError
-Language/Expressions/Function_Invocation/async_invokation_t02: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t19: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError
-Language/Expressions/Numbers/integer_size_t03: CompileTimeError
-Language/Expressions/Numbers/static_type_of_int_t01: CompileTimeError
-Language/Expressions/Object_Identity/constant_objects_t01: RuntimeError
-Language/Expressions/Object_Identity/double_t03: RuntimeError
-Language/Expressions/Object_Identity/object_t02: RuntimeError
-Language/Expressions/Shift/integer_t01: CompileTimeError
 Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign
-Language/Functions/External_Functions/not_connected_to_a_body_t01: CompileTimeError
-Language/Libraries_and_Scripts/Parts/compilation_t03: RuntimeError
-Language/Libraries_and_Scripts/Parts/compilation_t05: RuntimeError
-Language/Libraries_and_Scripts/Scripts/top_level_syntax_t01: CompileTimeError
-Language/Metadata/before_class_t01: RuntimeError
-Language/Metadata/before_ctor_t01: RuntimeError
-Language/Metadata/before_export_t01: RuntimeError
-Language/Metadata/before_factory_t01: RuntimeError
-Language/Metadata/before_function_t05: RuntimeError
-Language/Metadata/before_function_t06: RuntimeError
-Language/Metadata/before_library_t01: RuntimeError
-Language/Metadata/before_param_t01: RuntimeError
-Language/Metadata/before_param_t02: RuntimeError
-Language/Metadata/before_param_t04: RuntimeError
-Language/Metadata/before_param_t06: RuntimeError
-Language/Metadata/before_param_t08: RuntimeError
-Language/Metadata/before_type_param_t01: RuntimeError
-Language/Metadata/before_typedef_t01: RuntimeError
-Language/Metadata/before_variable_t01: RuntimeError
-Language/Statements/Assert/execution_t03: RuntimeError
-Language/Statements/Assert/execution_t08: RuntimeError
-Language/Statements/Assert/execution_t11: RuntimeError
-Language/Statements/Do/execution_t06: RuntimeError
-Language/Statements/For/For_Loop/execution_t11: RuntimeError
-Language/Statements/For/For_in/execution_t02: RuntimeError
-Language/Statements/If/condition_evaluation_t02: RuntimeError
-Language/Statements/If/condition_evaluation_t03: RuntimeError
-Language/Statements/While/execution_t02: RuntimeError
-Language/Statements/Yield_and_Yield_Each/Yield/execution_async_t02: RuntimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_sync_t05: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t01: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t04: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t12: RuntimeError
-Language/Types/Function_Types/subtype_no_args_t04: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t03: RuntimeError
-Language/Types/Function_Types/subtype_required_args_t01: RuntimeError
-Language/Types/Function_Types/subtype_required_args_t02: RuntimeError
-Language/Types/Interface_Types/subtype_t02: RuntimeError
-Language/Types/Interface_Types/subtype_t03: RuntimeError
-Language/Types/Interface_Types/subtype_t17: RuntimeError
-Language/Types/Interface_Types/subtype_t22: RuntimeError
-Language/Types/Interface_Types/subtype_t26: RuntimeError
-Language/Types/Interface_Types/subtype_t27: Pass, Crash # Issue 34389
-Language/Types/Type_Declarations/Typedef/dynamic_param_type_t02: RuntimeError
-Language/Variables/constant_initialization_t03: RuntimeError
-LanguageFeatures/Instantiate-to-bound/FutureOr/dynamic/FutureOr_l1_t01: RuntimeError
-LanguageFeatures/Instantiate-to-bound/FutureOr/dynamic/FutureOr_l1_t02: RuntimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t02: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t03: Crash
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t04: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l1_t03: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t07: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t08: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l3_t02: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l1_t04: RuntimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t01: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t02: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t02: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t03/01: Crash
-LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t03/02: Crash
-LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t03/none: Crash
-LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t04/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l1_t03/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t07/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t08/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l3_t02/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l4_t01/02: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t01/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t02/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t03: RuntimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t05: RuntimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t07: RuntimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t08: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t01: RuntimeError
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t03/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t05/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t07/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t01/none: CompileTimeError
-LanguageFeatures/Simple-bounds/dynamic/FutureOr_l1_t01: RuntimeError, Pass
-LanguageFeatures/Simple-bounds/dynamic/class_FutureOr_l1_t02: CompileTimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_l2_t01: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_typedef_l1_t01: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_typedef_l1_t02: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_typedef_l1_t03: RuntimeError
-LanguageFeatures/Simple-bounds/static/class_FutureOr_l1_t02: CompileTimeError
-LanguageFeatures/Simple-bounds/static/typedef_typedef_l1_t03: CompileTimeError, Pass
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A52_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A52_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A52_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A52_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_return_value_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_return_value_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_global_variable_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_global_variable_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A31_t01: RuntimeError
-LanguageFeatures/Super-mixins/more_specific_t01: CompileTimeError
-LanguageFeatures/Super-mixins/not_class_t02: CompileTimeError
-LanguageFeatures/Super-mixins/not_class_t03: CompileTimeError
-LanguageFeatures/Super-mixins/on_word_t02: CompileTimeError
-LanguageFeatures/Super-mixins/on_word_t03: CompileTimeError
-LanguageFeatures/regression/33585_t01: MissingCompileTimeError
-LanguageFeatures/regression/33585_t02: MissingCompileTimeError
-LanguageFeatures/regression/33597_t01: MissingCompileTimeError
-LanguageFeatures/regression/33701_t01: MissingCompileTimeError
-LanguageFeatures/regression/34635_t01: CompileTimeError
-LanguageFeatures/regression/34635_t02: CompileTimeError
-LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError
-LayoutTests/fast/alignment/parse-align-self_t01: RuntimeError
-LayoutTests/fast/alignment/parse-justify-self_t01: RuntimeError
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: RuntimeError, Timeout
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError
-LayoutTests/fast/canvas/alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-clipping_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-color-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-color-over-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-color-over-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-fill-style_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-pattern-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-pattern-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-pattern-over-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-largeNonintegralDimensions_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-large-dimensions_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lineDash-input-sequence_t01: RuntimeError
-LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError
-LayoutTests/fast/canvas/webgl/draw-arrays-out-of-bounds_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/drawingbuffer-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/error-reporting_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/functions-returning-strings_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-verifies-too-many-indices_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/null-object-behaviour_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/null-uniform-location_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-uniform-binding-bugs_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texImage2DImageDataTest_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/triangle_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/uniform-location_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-large-texture_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-element-events_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-transition_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/auto-content-resolution-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/display-grid-set-get_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-and-minmax-content-resolution-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-columns-rows-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-container-change-explicit-grid-recompute-child_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-empty-row-column_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-min-max-height_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-padding-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-shrink-to-fit_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-bad-resolution-double-span_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-display_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-lr_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/implicit-rows-auto-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-width-only_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-resolution-grid-item_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/css-tables_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-absolutes_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/tables_t01: RuntimeError
-LayoutTests/fast/css/aspect-ratio-parsing-tests_t01: RuntimeError
-LayoutTests/fast/css/checked-pseudo-selector_t01: RuntimeError
-LayoutTests/fast/css/comment-before-charset-external_t01: RuntimeError
-LayoutTests/fast/css/content/content-normal_t01: RuntimeError
-LayoutTests/fast/css/css-escaped-identifier_t01: RuntimeError
-LayoutTests/fast/css/css3-nth-tokens-style_t01: RuntimeError
-LayoutTests/fast/css/deprecated-flexbox-auto-min-size_t01: RuntimeError
-LayoutTests/fast/css/first-child-display-change-inverse_t01: RuntimeError
-LayoutTests/fast/css/fontfaceset-loadingdone_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-font_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-clip_t01: RuntimeError
-LayoutTests/fast/css/id-or-class-before-stylesheet_t01: RuntimeError
-LayoutTests/fast/css/inherit-initial-shorthand-values_t01: RuntimeError
-LayoutTests/fast/css/invalid-hex-color_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-shadow-combinator_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-2_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-3_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-4_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-5_t01: RuntimeError
-LayoutTests/fast/css/link-disabled-attr-parser_t01: RuntimeError
-LayoutTests/fast/css/max-device-aspect-ratio_t01: RuntimeError
-LayoutTests/fast/css/min-device-aspect-ratio_t01: RuntimeError
-LayoutTests/fast/css/parsing-at-rule-recovery_t01: RuntimeError
-LayoutTests/fast/css/parsing-css-allowed-string-characters_t01: RuntimeError
-LayoutTests/fast/css/parsing-selector-error-recovery_t01: RuntimeError
-LayoutTests/fast/css/percent-width-img-src-change_t01: Timeout, Pass
-LayoutTests/fast/css/readonly-pseudoclass-opera-001_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-002_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-nested_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-link_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-second-alternate-link_t01: RuntimeError
-LayoutTests/fast/css/webkit-keyframes-errors_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-color_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-justify/getComputedStyle/getComputedStyle-text-justify_t01: RuntimeError
-LayoutTests/fast/dom/52776_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/hittest-relative-to-viewport_t01: RuntimeError
-LayoutTests/fast/dom/Document/createElementNS-namespace-err_t01: RuntimeError
-LayoutTests/fast/dom/Document/document-title-get_t01: RuntimeError
-LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError
-LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-loading-gc_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/onload-completion-test_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError
-LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError
-LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError
-LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/mutation_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-constructor_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-expand_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/discarded-sheet-owner-null_t01: RuntimeError
-LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError
-LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError
-LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError
-LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError
-LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError
-LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError
-LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError
-LayoutTests/fast/dom/custom/element-names_t01: RuntimeError
-LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError
-LayoutTests/fast/dom/dataset_t01: RuntimeError
-LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError
-LayoutTests/fast/dom/image-object_t01: RuntimeError
-LayoutTests/fast/dom/option-properties_t01: RuntimeError
-LayoutTests/fast/dom/shadow/distribution-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError
-LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-quote_t01: RuntimeError
-LayoutTests/fast/dynamic/insertAdjacentElement_t01: RuntimeError
-LayoutTests/fast/dynamic/recursive-layout_t01: RuntimeError
-LayoutTests/fast/events/add-event-without-document_t01: RuntimeError
-LayoutTests/fast/events/clipboard-clearData_t01: RuntimeError
-LayoutTests/fast/events/clipboard-dataTransferItemList_t01: RuntimeError
-LayoutTests/fast/events/div-focus_t01: RuntimeError, Pass
-LayoutTests/fast/events/event-attributes-after-exception_t01: RuntimeError
-LayoutTests/fast/events/event-trace_t01: RuntimeError
-LayoutTests/fast/events/invalid-001_t01: RuntimeError
-LayoutTests/fast/events/invalid-004_t01: RuntimeError
-LayoutTests/fast/events/invalid-005_t01: RuntimeError
-LayoutTests/fast/events/mutation-during-replace-child-2_t01: RuntimeError
-LayoutTests/fast/events/nested-event-remove-node-crash_t01: RuntimeError
-LayoutTests/fast/events/xhr-onclick-crash_t01: RuntimeError
-LayoutTests/fast/exclusions/parsing/parsing-wrap-flow_t01: RuntimeError
-LayoutTests/fast/files/blob-close-revoke_t01: RuntimeError
-LayoutTests/fast/files/blob-parts-slice-test_t01: CompileTimeError
-LayoutTests/fast/files/blob-slice-overflow_t01: CompileTimeError
-LayoutTests/fast/files/blob-slice-test_t01: CompileTimeError
-LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-abort_t01: RuntimeError
-LayoutTests/fast/flexbox/flexing-overflow-scroll-item_t01: RuntimeError
-LayoutTests/fast/flexbox/intrinsic-min-width-applies-with-fixed-width_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-001_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-002_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-003_t01: RuntimeError
-LayoutTests/fast/forms/clone-input-with-dirty-value_t01: RuntimeError
-LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError
-LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/ValidityState-typeMismatch-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError
-LayoutTests/fast/forms/form-attribute_t01: RuntimeError
-LayoutTests/fast/forms/input-width-height-attributes-without-renderer-loaded-image_t01: RuntimeError
-LayoutTests/fast/forms/menulist-disabled-selected-option_t01: RuntimeError
-LayoutTests/fast/forms/menulist-selection-reset_t01: RuntimeError
-LayoutTests/fast/forms/multiple-selected-options-innerHTML_t01: RuntimeError
-LayoutTests/fast/forms/search-popup-crasher_t01: RuntimeError
-LayoutTests/fast/forms/setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/submit-form-attributes_t01: RuntimeError
-LayoutTests/fast/forms/submit-nil-value-field-assert_t01: RuntimeError
-LayoutTests/fast/forms/textarea-maxlength_t01: RuntimeError
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: RuntimeError
-LayoutTests/fast/html/imports/import-events_t01: RuntimeError
-LayoutTests/fast/inline/empty-inline-before-collapsed-space_t01: RuntimeError
-LayoutTests/fast/inline/inline-with-empty-inline-children_t01: RuntimeError
-LayoutTests/fast/inline/out-of-flow-objects-and-whitespace-after-empty-inline_t01: RuntimeError
-LayoutTests/fast/lists/list-style-position-inside_t01: RuntimeError
-LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: RuntimeError
-LayoutTests/fast/multicol/break-properties_t01: RuntimeError
-LayoutTests/fast/multicol/cssom-view_t01: RuntimeError
-LayoutTests/fast/multicol/fixed-column-percent-logical-height-orthogonal-writing-mode_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-above-or-below_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-end-of-column-with-line-height_t01: RuntimeError
-LayoutTests/fast/parser/foster-parent-adopted_t02: RuntimeError
-LayoutTests/fast/parser/innerhtml-with-prefixed-elements_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-height-text-controls_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-lengths_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-big-box-border-radius_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-diamond-margin-polygon_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-left_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-ellipse-margin-right_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-right_t01: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-utterance-uses-voice_t01: RuntimeError, Timeout
-LayoutTests/fast/speechsynthesis/speech-synthesis-voices_t01: RuntimeError
-LayoutTests/fast/storage/disallowed-storage_t01: RuntimeError
-LayoutTests/fast/sub-pixel/cssom-subpixel-precision_t01: RuntimeError
-LayoutTests/fast/table/anonymous-table-section-removed_t01: RuntimeError
-LayoutTests/fast/table/caption-orthogonal-writing-mode-sizing_t01: RuntimeError
-LayoutTests/fast/table/css-table-max-width_t01: RuntimeError
-LayoutTests/fast/table/large-shrink-wrapped-width_t01: RuntimeError
-LayoutTests/fast/table/min-width-css-inline-table_t01: RuntimeError
-LayoutTests/fast/table/min-width-html-block-table_t01: RuntimeError
-LayoutTests/fast/table/min-width-html-inline-table_t01: RuntimeError
-LayoutTests/fast/table/padding-height-and-override-height_t01: RuntimeError
-LayoutTests/fast/table/table-cell-offset-width_t01: RuntimeError
-LayoutTests/fast/text/international/thai-offsetForPosition-inside-character_t01: RuntimeError
-LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError
-LayoutTests/fast/text/line-break-after-question-mark_t01: RuntimeError
-LayoutTests/fast/text/remove-zero-length-run_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-pixel_t01: RuntimeError
-LayoutTests/fast/text/text-combine-shrink-to-fit_t01: RuntimeError
-LayoutTests/fast/url/host_t01: RuntimeError
-LayoutTests/fast/url/relative-unix_t01: RuntimeError
-LayoutTests/fast/url/segments-from-data-url_t01: RuntimeError
-LayoutTests/fast/url/trivial-segments_t01: RuntimeError
-LayoutTests/fast/url/trivial_t01: RuntimeError
-LayoutTests/fast/writing-mode/auto-sizing-orthogonal-flows_t01: RuntimeError
-LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow-scroll_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-invalid-xml_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-document-responsetype_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-arraybuffer_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-document_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/cz_20030217_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/namespace-nodes_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError
-LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError
-LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError
-LayoutTests/fast/xpath/position_t01: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError
-LayoutTests/fast/xpath/reverse-axes_t01: RuntimeError
-LibTest/async/Future/Future_A01_t01: CompileTimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t03: RuntimeError
-LibTest/async/Stream/Stream.periodic_A02_t01: RuntimeError
-LibTest/async/Stream/Stream.periodic_A03_t01: RuntimeError
-LibTest/async/StreamController/StreamController_A03_t03: RuntimeError
-LibTest/async/StreamController/stream_A02_t02: RuntimeError
-LibTest/async/StreamController/stream_A03_t03: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer.fromHandlers_A01_t04: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer_A01_t02: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer_A01_t03: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer_A02_t01: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer_A02_t02: RuntimeError
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue.from_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/reduce_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t02: RuntimeError
-LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t03: RuntimeError
-LibTest/collection/HashMap/HashMap_A06_t01: RuntimeError
-LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/any_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/every_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/first_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/reduce_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/single_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/skipWhile_A03_t01: RuntimeError
-LibTest/collection/IterableMixin/skipWhile_A04_t01: RuntimeError
-LibTest/collection/LinkedHashSet/LinkedHashSet.from_A03_t01: RuntimeError
-LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError
-LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError
-LibTest/collection/LinkedList/LinkedList_class_A03_t01: RuntimeError
-LibTest/collection/LinkedList/remove_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A02_t03: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A02_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A02_t03: RuntimeError
-LibTest/collection/LinkedListEntry/list_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t03: RuntimeError
-LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError
-LibTest/collection/ListQueue/ListQueue_class_A01_t01: RuntimeError
-LibTest/collection/Queue/Queue.from_A01_t01: RuntimeError
-LibTest/collection/Queue/Queue_class_A01_t01: RuntimeError
-LibTest/collection/SetBase/SetBase_class_A01_t01: RuntimeError
-LibTest/collection/SetMixin/SetMixin_class_A01_t01: RuntimeError
-LibTest/collection/SplayTreeSet/SplayTreeSet_class_A01_t01: RuntimeError
-LibTest/collection/UnmodifiableListView/UnmodifiableListView_class_A01_t01: RuntimeError
-LibTest/convert/ByteConversionSink/ByteConversionSink.from_A01_t01: RuntimeError
-LibTest/convert/ByteConversionSink/ByteConversionSink_class_A01_t01: RuntimeError
-LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError
-LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError
-LibTest/convert/JsonCodec/encoder_A01_t01: RuntimeError
-LibTest/convert/JsonDecoder/fuse_A01_t01: RuntimeError
-LibTest/convert/JsonEncoder/convert_A01_t01: RuntimeError
-LibTest/convert/JsonUtf8Encoder/convert_A01_t01: RuntimeError
-LibTest/convert/StringConversionSink/StringConversionSink.from_A01_t01: RuntimeError
-LibTest/convert/StringConversionSink/asStringSink_A02_t01: RuntimeError
-LibTest/convert/StringConversionSink/asUtf8Sink_A02_t01: RuntimeError
-LibTest/convert/Utf8Codec/Utf8Codec_A01_t02: RuntimeError
-LibTest/convert/Utf8Codec/Utf8Codec_A01_t03: RuntimeError
-LibTest/convert/Utf8Codec/decode_A03_t01: RuntimeError
-LibTest/convert/Utf8Codec/decode_A03_t02: RuntimeError
-LibTest/convert/Utf8Decoder/Utf8Decoder_A02_t01: RuntimeError
-LibTest/convert/Utf8Decoder/Utf8Decoder_A02_t02: RuntimeError
-LibTest/core/AssertionError/toString_A01_t01: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t03: RuntimeError
-LibTest/core/Duration/inMinutes_A01_t01: CompileTimeError
-LibTest/core/Expando/operator_square_brackets_A01_t03: RuntimeError
-LibTest/core/List/Iterable_A01_t01: RuntimeError
-LibTest/core/List/List_class_A01_t01: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError
-LibTest/core/StackOverflowError/stackTrace_A01_t01: RuntimeError
-LibTest/core/StackOverflowError/stackTrace_A01_t02: RuntimeError
-LibTest/core/String/String.fromEnvironment_A01_t01: RuntimeError
-LibTest/core/String/replaceAllMapped_A03_t01: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t01: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t02: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t05: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A02_t01: RuntimeError
-LibTest/core/Uri/Uri.directory_A05_t01: RuntimeError
-LibTest/core/Uri/parse_A07_t01: RuntimeError
-LibTest/core/Uri/queryParametersAll_A01_t01: RuntimeError
-LibTest/core/Uri/queryParametersAll_A01_t02: RuntimeError
-LibTest/core/Uri/queryParametersAll_A04_t01: RuntimeError
-LibTest/core/UriData/UriData.fromString_A02_t03: RuntimeError
-LibTest/core/UriData/UriData.fromUri_A01_t03: RuntimeError
-LibTest/core/UriData/isBase64_A01_t01: RuntimeError
-LibTest/core/UriData/toString_A01_t01: RuntimeError
-LibTest/core/double/operator_LE_A01_t02: CompileTimeError
-LibTest/core/double/operator_addition_A01_t06: RuntimeError
-LibTest/core/int/abs_A01_t01: CompileTimeError
-LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError
-LibTest/core/int/isEven_A01_t01: CompileTimeError
-LibTest/core/int/isNaN_A01_t01: CompileTimeError
-LibTest/core/int/operator_GT_A01_t01: CompileTimeError
-LibTest/core/int/operator_LE_A01_t01: CompileTimeError
-LibTest/core/int/operator_NOT_A01_t01: CompileTimeError
-LibTest/core/int/operator_OR_A01_t01: CompileTimeError
-LibTest/core/int/operator_division_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A02_t01: CompileTimeError
-LibTest/core/int/operator_multiplication_A01_t01: RuntimeError
-LibTest/core/int/operator_remainder_A01_t01: CompileTimeError
-LibTest/core/int/operator_right_shift_A01_t01: RuntimeError
-LibTest/core/int/parse_A01_t01: CompileTimeError
-LibTest/core/int/parse_A01_t02: RuntimeError
-LibTest/core/int/remainder_A01_t01: CompileTimeError
-LibTest/core/int/remainder_A01_t03: RuntimeError
-LibTest/core/int/round_A01_t01: CompileTimeError
-LibTest/core/int/toDouble_A01_t01: CompileTimeError
-LibTest/core/int/toInt_A01_t01: CompileTimeError
-LibTest/core/int/truncate_A01_t01: CompileTimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError
-LibTest/html/Document/clone_A01_t01: RuntimeError
-LibTest/html/Document/clone_A01_t02: RuntimeError
-LibTest/html/Element/Element.tag_A01_t01: RuntimeError
-LibTest/html/Element/addEventListener_A01_t03: RuntimeError
-LibTest/html/Element/borderEdge_A01_t01: RuntimeError
-LibTest/html/Element/clickEvent_A01_t01: RuntimeError
-LibTest/html/Element/contentEdge_A01_t01: RuntimeError
-LibTest/html/Element/contextMenuEvent_A01_t01: RuntimeError
-LibTest/html/Element/copyEvent_A01_t01: RuntimeError
-LibTest/html/Element/cutEvent_A01_t01: RuntimeError
-LibTest/html/Element/dataset_A02_t01: RuntimeError
-LibTest/html/Element/dragEndEvent_A01_t01: RuntimeError
-LibTest/html/Element/dragEnterEvent_A01_t01: RuntimeError
-LibTest/html/Element/dragEvent_A01_t01: RuntimeError
-LibTest/html/Element/dragLeaveEvent_A01_t01: RuntimeError
-LibTest/html/Element/dragOverEvent_A01_t01: RuntimeError
-LibTest/html/Element/dragStartEvent_A01_t01: RuntimeError
-LibTest/html/Element/dropEvent_A01_t01: RuntimeError
-LibTest/html/Element/getAttributeNS_A01_t01: RuntimeError
-LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError
-LibTest/html/Element/isTagSupported_A01_t01: RuntimeError
-LibTest/html/Element/loadEvent_A01_t01: RuntimeError
-LibTest/html/Element/marginEdge_A01_t01: RuntimeError
-LibTest/html/Element/mouseWheelEvent_A01_t01: RuntimeError
-LibTest/html/Element/onClick_A01_t01: RuntimeError
-LibTest/html/Element/onContextMenu_A01_t01: RuntimeError
-LibTest/html/Element/onCopy_A01_t01: RuntimeError
-LibTest/html/Element/onCut_A01_t01: RuntimeError
-LibTest/html/Element/onDragEnd_A01_t01: RuntimeError
-LibTest/html/Element/onDragEnter_A01_t01: RuntimeError
-LibTest/html/Element/onDragLeave_A01_t01: RuntimeError
-LibTest/html/Element/onDragOver_A01_t01: RuntimeError
-LibTest/html/Element/onDragStart_A01_t01: RuntimeError
-LibTest/html/Element/onDrag_A01_t01: RuntimeError
-LibTest/html/Element/onDrop_A01_t01: RuntimeError
-LibTest/html/Element/onKeyDown_A01_t01: RuntimeError
-LibTest/html/Element/onKeyPress_A01_t01: RuntimeError
-LibTest/html/Element/onKeyUp_A01_t01: RuntimeError
-LibTest/html/Element/onMouseDown_A01_t01: RuntimeError
-LibTest/html/Element/onMouseEnter_A01_t01: RuntimeError
-LibTest/html/Element/onMouseLeave_A01_t01: RuntimeError
-LibTest/html/Element/onMouseMove_A01_t01: RuntimeError
-LibTest/html/Element/onMouseOut_A01_t01: RuntimeError
-LibTest/html/Element/onMouseOver_A01_t01: RuntimeError
-LibTest/html/Element/onMouseUp_A01_t01: RuntimeError
-LibTest/html/Element/onMouseWheel_A01_t01: RuntimeError
-LibTest/html/Element/onPaste_A01_t01: RuntimeError
-LibTest/html/Element/onTouchCancel_A01_t01: RuntimeError
-LibTest/html/Element/onTouchEnd_A01_t01: RuntimeError
-LibTest/html/Element/onTouchEnter_A01_t01: RuntimeError
-LibTest/html/Element/onTouchLeave_A01_t01: RuntimeError
-LibTest/html/Element/onTouchMove_A01_t01: RuntimeError
-LibTest/html/Element/onTouchStart_A01_t01: RuntimeError
-LibTest/html/Element/onTransitionEnd_A01_t01: Timeout, Pass
-LibTest/html/Element/paddingEdge_A01_t01: RuntimeError
-LibTest/html/Element/pasteEvent_A01_t01: RuntimeError
-LibTest/html/Element/previousNode_A01_t01: RuntimeError
-LibTest/html/Element/querySelectorAll_A01_t02: RuntimeError
-LibTest/html/Element/replaceWith_A01_t01: RuntimeError
-LibTest/html/Element/replaceWith_A01_t02: RuntimeError
-LibTest/html/Element/touchCancelEvent_A01_t01: RuntimeError
-LibTest/html/Element/touchEndEvent_A01_t01: RuntimeError
-LibTest/html/Element/touchEnterEvent_A01_t01: RuntimeError
-LibTest/html/Element/touchLeaveEvent_A01_t01: RuntimeError
-LibTest/html/Element/touchMoveEvent_A01_t01: RuntimeError
-LibTest/html/Element/touchStartEvent_A01_t01: RuntimeError
-LibTest/html/Element/transitionEndEvent_A01_t01: RuntimeError
-LibTest/html/Event/Event_A01_t01: RuntimeError
-LibTest/html/Event/currentTarget_A01_t01: RuntimeError
-LibTest/html/Event/defaultPrevented_A01_t01: RuntimeError
-LibTest/html/Event/eventPhase_A01_t01: RuntimeError
-LibTest/html/Event/preventDefault_A01_t01: RuntimeError
-LibTest/html/Event/stopPropagation_A01_t01: RuntimeError
-LibTest/html/Event/target_A01_t01: RuntimeError
-LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError
-LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError
-LibTest/html/HttpRequest/getString_A01_t01: RuntimeError
-LibTest/html/HttpRequest/onError_A01_t02: Timeout, Pass
-LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: RuntimeError
-LibTest/html/HttpRequest/request_A01_t01: RuntimeError
-LibTest/html/HttpRequest/responseText_A01_t02: RuntimeError
-LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError
-LibTest/html/HttpRequest/responseType_A01_t03: RuntimeError
-LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError
-LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError
-LibTest/html/HttpRequest/status_A01_t01: RuntimeError
-LibTest/html/HttpRequestUpload/onError_A01_t02: RuntimeError
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: RuntimeError
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: RuntimeError
-LibTest/html/IFrameElement/addEventListener_A01_t03: RuntimeError
-LibTest/html/IFrameElement/appendHtml_A01_t01: RuntimeError
-LibTest/html/IFrameElement/appendHtml_A01_t02: RuntimeError
-LibTest/html/IFrameElement/attributeChanged_A01_t01: RuntimeError
-LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/blur_A01_t01: Timeout, Pass
-LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError
-LibTest/html/IFrameElement/clone_A01_t02: RuntimeError
-LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError
-LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError
-LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError
-LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError
-LibTest/html/IFrameElement/createShadowRoot_A01_t01: RuntimeError
-LibTest/html/IFrameElement/innerHtml_A01_t01: RuntimeError
-LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError
-LibTest/html/IFrameElement/marginEdge_A01_t01: RuntimeError
-LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onClick_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onContextMenu_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onCopy_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onCut_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onDragEnd_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onDragEnter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onDragLeave_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onDragOver_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onDragStart_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onDrag_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onDrop_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onKeyDown_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onKeyPress_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onKeyUp_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onMouseDown_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onMouseEnter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onMouseLeave_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onMouseMove_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onMouseOut_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onMouseOver_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onMouseUp_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onPaste_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onTouchCancel_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onTouchEnd_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onTouchEnter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onTouchLeave_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onTouchMove_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onTouchStart_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onTransitionEnd_A01_t01: RuntimeError
-LibTest/html/IFrameElement/paddingEdge_A01_t01: RuntimeError
-LibTest/html/IFrameElement/querySelector_A01_t01: RuntimeError
-LibTest/html/IFrameElement/replaceWith_A01_t01: RuntimeError
-LibTest/html/IFrameElement/setInnerHtml_A01_t01: RuntimeError
-LibTest/html/Node/append_A01_t02: RuntimeError
-LibTest/html/Node/nodes_A01_t02: RuntimeError
-LibTest/html/Node/ownerDocument_A01_t01: RuntimeError
-LibTest/html/Node/parent_A01_t01: RuntimeError
-LibTest/html/Node/previousNode_A01_t01: RuntimeError
-LibTest/html/Window/document_A01_t01: RuntimeError
-LibTest/html/Window/find_A01_t01: RuntimeError
-LibTest/html/Window/find_A03_t01: RuntimeError
-LibTest/html/Window/find_A06_t01: RuntimeError
-LibTest/html/Window/moveBy_A01_t01: RuntimeError
-LibTest/html/Window/moveTo_A01_t01: RuntimeError
-LibTest/html/Window/moveTo_A02_t01: RuntimeError
-LibTest/html/Window/postMessage_A01_t01: RuntimeError
-LibTest/html/Window/postMessage_A01_t02: RuntimeError
-LibTest/html/Window/requestFileSystem_A02_t01: RuntimeError
-LibTest/html/Window/resizeBy_A01_t01: RuntimeError
-LibTest/html/Window/resizeTo_A01_t01: RuntimeError
 LibTest/io/*: SkipByDesign # dart:io not supported.
 LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
-LibTest/math/MutableRectangle/MutableRectangle_A03_t04: RuntimeError
-LibTest/math/MutableRectangle/height_A03_t02: RuntimeError
-LibTest/math/MutableRectangle/width_A03_t02: RuntimeError
-LibTest/math/Point/operator_mult_A02_t01: RuntimeError
-LibTest/math/Rectangle/Rectangle_A03_t04: RuntimeError
-LibTest/math/acos_A01_t01: RuntimeError
-LibTest/math/asin_A01_t01: RuntimeError
-LibTest/math/pow_A04_t01: RuntimeError
-LibTest/math/pow_A10_t01: CompileTimeError
-LibTest/math/pow_A14_t01: RuntimeError
-LibTest/math/pow_A16_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asByteData_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asByteData_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asByteData_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32x4List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32x4List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32x4List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat64List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat64List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat64List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat64x2List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat64x2List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat64x2List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt16List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt16List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt16List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32x4List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32x4List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32x4List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt64List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt64List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt64List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt8List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt8List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt8List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint16List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint16List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint16List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint32List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint32List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint32List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint64List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint64List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint64List_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint8ClampedList_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint8ClampedList_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint8ClampedList_A03_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint8List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint8List_A02_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint8List_A03_t01: RuntimeError
-LibTest/typed_data/ByteData/ByteData.view_A05_t01: RuntimeError
-LibTest/typed_data/ByteData/ByteData.view_A05_t02: RuntimeError
-LibTest/typed_data/ByteData/ByteData.view_A05_t03: RuntimeError
-LibTest/typed_data/ByteData/getFloat32_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getFloat32_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getFloat64_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getFloat64_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getInt16_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getInt16_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getInt32_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getInt32_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getInt64_A01_t01: CompileTimeError
-LibTest/typed_data/ByteData/getInt64_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getInt64_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getInt8_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getInt8_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getUint16_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getUint16_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getUint32_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getUint32_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getUint64_A01_t01: CompileTimeError
-LibTest/typed_data/ByteData/getUint64_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getUint64_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/getUint8_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/getUint8_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setFloat32_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setFloat32_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setFloat64_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setFloat64_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setInt16_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setInt16_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setInt32_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setInt32_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setInt64_A01_t01: CompileTimeError
-LibTest/typed_data/ByteData/setInt64_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setInt64_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setInt8_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setInt8_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setUint16_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setUint16_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setUint32_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setUint32_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setUint64_A01_t01: CompileTimeError
-LibTest/typed_data/ByteData/setUint64_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setUint64_A02_t02: RuntimeError
-LibTest/typed_data/ByteData/setUint8_A02_t01: RuntimeError
-LibTest/typed_data/ByteData/setUint8_A02_t02: RuntimeError
-LibTest/typed_data/Float32List/Float32List.view_A05_t01: RuntimeError
-LibTest/typed_data/Float32List/Float32List.view_A05_t02: RuntimeError
-LibTest/typed_data/Float32List/Float32List.view_A05_t03: RuntimeError
-LibTest/typed_data/Float32List/Float32List_A02_t01: RuntimeError
-LibTest/typed_data/Float32List/any_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/every_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/first_A01_t02: RuntimeError
-LibTest/typed_data/Float32List/fold_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/join_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/join_A01_t02: RuntimeError
-LibTest/typed_data/Float32List/last_A01_t02: RuntimeError
-LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t01: RuntimeError
-LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t02: RuntimeError
-LibTest/typed_data/Float32x4List/Float32x4List.view_A05_t03: RuntimeError
-LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError
-LibTest/typed_data/Float32x4List/Float32x4List_A02_t01: RuntimeError
-LibTest/typed_data/Float32x4List/any_A01_t01: RuntimeError
-LibTest/typed_data/Float32x4List/every_A01_t01: RuntimeError
-LibTest/typed_data/Float32x4List/fold_A01_t01: RuntimeError
-LibTest/typed_data/Float32x4List/join_A01_t01: RuntimeError
-LibTest/typed_data/Float32x4List/join_A01_t02: RuntimeError
-LibTest/typed_data/Float64List/Float64List.view_A05_t01: RuntimeError
-LibTest/typed_data/Float64List/Float64List.view_A05_t02: RuntimeError
-LibTest/typed_data/Float64List/Float64List.view_A05_t03: RuntimeError
-LibTest/typed_data/Float64List/Float64List_A02_t01: RuntimeError
-LibTest/typed_data/Float64List/any_A01_t01: RuntimeError
-LibTest/typed_data/Float64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Float64List/fold_A01_t01: RuntimeError
-LibTest/typed_data/Float64List/join_A01_t01: RuntimeError
-LibTest/typed_data/Float64List/join_A01_t02: RuntimeError
-LibTest/typed_data/Float64List/setAll_A04_t01: RuntimeError
-LibTest/typed_data/Float64x2List/Float64x2List.view_A05_t01: RuntimeError
-LibTest/typed_data/Float64x2List/Float64x2List.view_A05_t02: RuntimeError
-LibTest/typed_data/Float64x2List/Float64x2List.view_A05_t03: RuntimeError
-LibTest/typed_data/Float64x2List/Float64x2List.view_A06_t01: RuntimeError
-LibTest/typed_data/Float64x2List/Float64x2List_A02_t01: RuntimeError
-LibTest/typed_data/Float64x2List/fold_A01_t01: RuntimeError
-LibTest/typed_data/Float64x2List/join_A01_t01: RuntimeError
-LibTest/typed_data/Float64x2List/join_A01_t02: RuntimeError
-LibTest/typed_data/Float64x2List/setAll_A04_t01: RuntimeError
-LibTest/typed_data/Float64x2List/sort_A01_t01: RuntimeError
-LibTest/typed_data/Float64x2List/toString_A01_t01: RuntimeError
-LibTest/typed_data/Int16List/Int16List.view_A05_t01: RuntimeError
-LibTest/typed_data/Int16List/Int16List.view_A05_t02: RuntimeError
-LibTest/typed_data/Int16List/Int16List.view_A05_t03: RuntimeError
-LibTest/typed_data/Int16List/Int16List_A02_t01: RuntimeError
-LibTest/typed_data/Int16List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int16List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int32List/Int32List.view_A05_t01: RuntimeError
-LibTest/typed_data/Int32List/Int32List.view_A05_t02: RuntimeError
-LibTest/typed_data/Int32List/Int32List.view_A05_t03: RuntimeError
-LibTest/typed_data/Int32List/Int32List_A02_t01: RuntimeError
-LibTest/typed_data/Int32List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int32List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4/operator_OR_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.fromList_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.fromList_A01_t02: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.view_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.view_A05_t01: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.view_A05_t02: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.view_A05_t03: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.view_A06_t01: RuntimeError
-LibTest/typed_data/Int32x4List/clear_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/fold_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/forEach_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/join_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/join_A01_t02: RuntimeError
-LibTest/typed_data/Int32x4List/lengthInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/length_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/offsetInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/setAll_A04_t01: RuntimeError
-LibTest/typed_data/Int32x4List/skip_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/skip_A02_t01: RuntimeError
-LibTest/typed_data/Int32x4List/sublist_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/take_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/take_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/Int64List.fromList_A01_t01: CompileTimeError
-LibTest/typed_data/Int64List/Int64List.fromList_A01_t02: CompileTimeError
-LibTest/typed_data/Int64List/Int64List.view_A01_t01: CompileTimeError
-LibTest/typed_data/Int64List/Int64List.view_A01_t02: CompileTimeError
-LibTest/typed_data/Int64List/Int64List.view_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/Int64List.view_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/Int64List.view_A04_t01: RuntimeError
-LibTest/typed_data/Int64List/Int64List.view_A05_t01: RuntimeError
-LibTest/typed_data/Int64List/Int64List.view_A05_t02: RuntimeError
-LibTest/typed_data/Int64List/Int64List.view_A05_t03: RuntimeError
-LibTest/typed_data/Int64List/Int64List.view_A06_t01: RuntimeError
-LibTest/typed_data/Int64List/Int64List_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/Int64List_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/addAll_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/add_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/asMap_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/asMap_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/asMap_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/buffer_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/buffer_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/clear_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/contains_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/elementAt_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/elementAt_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/elementSizeInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/elementSizeInBytes_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/expand_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/expand_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/fillRange_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/fillRange_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/firstWhere_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/firstWhere_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/firstWhere_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/first_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/first_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/first_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/first_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/fold_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/forEach_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/getRange_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/getRange_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/getRange_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/getRange_A04_t01: RuntimeError
-LibTest/typed_data/Int64List/hashCode_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/hashCode_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/indexOf_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/indexOf_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/indexOf_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/indexOf_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/insertAll_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/insert_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/isEmpty_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/isEmpty_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/isNotEmpty_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/isNotEmpty_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/iterator_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/iterator_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/iterator_current_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/iterator_moveNext_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/join_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/join_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/lastIndexOf_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/lastIndexOf_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/lastIndexOf_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/lastIndexOf_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/lastWhere_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/lastWhere_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/lastWhere_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/last_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/last_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/last_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/lengthInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/lengthInBytes_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/length_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/length_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/map_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/map_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/map_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/offsetInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/offsetInBytes_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/operator_equality_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/operator_subscript_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/operator_subscript_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/operator_subscripted_assignment_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/operator_subscripted_assignment_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/reduce_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/reduce_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/removeAt_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/removeLast_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/removeRange_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/removeWhere_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/remove_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/replaceRange_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/retainWhere_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/reversed_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/reversed_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/runtimeType_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/runtimeType_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/setAll_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/setAll_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/setAll_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/setAll_A04_t01: RuntimeError
-LibTest/typed_data/Int64List/setRange_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/setRange_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/setRange_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/setRange_A04_t01: RuntimeError
-LibTest/typed_data/Int64List/setRange_A05_t01: RuntimeError
-LibTest/typed_data/Int64List/shuffle_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/shuffle_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/shuffle_A01_t03: RuntimeError
-LibTest/typed_data/Int64List/singleWhere_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/singleWhere_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/singleWhere_A02_t02: RuntimeError
-LibTest/typed_data/Int64List/single_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/single_A01_t02: RuntimeError
-LibTest/typed_data/Int64List/single_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/single_A02_t02: RuntimeError
-LibTest/typed_data/Int64List/skipWhile_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/skipWhile_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/skipWhile_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/skipWhile_A04_t01: RuntimeError
-LibTest/typed_data/Int64List/skip_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/skip_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/skip_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/sort_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/sublist_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/sublist_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/sublist_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/sublist_A03_t02: RuntimeError
-LibTest/typed_data/Int64List/takeWhile_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/takeWhile_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/takeWhile_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/takeWhile_A04_t01: RuntimeError
-LibTest/typed_data/Int64List/take_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/take_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/take_A03_t01: RuntimeError
-LibTest/typed_data/Int64List/toList_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/toList_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/toList_A02_t02: RuntimeError
-LibTest/typed_data/Int64List/toSet_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/toString_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/where_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/where_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/where_A03_t01: RuntimeError
-LibTest/typed_data/Int8List/Int8List.view_A05_t01: RuntimeError
-LibTest/typed_data/Int8List/Int8List.view_A05_t02: RuntimeError
-LibTest/typed_data/Int8List/Int8List.view_A05_t03: RuntimeError
-LibTest/typed_data/Int8List/Int8List_A02_t01: RuntimeError
-LibTest/typed_data/Int8List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int8List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint16List/Uint16List.view_A05_t01: RuntimeError
-LibTest/typed_data/Uint16List/Uint16List.view_A05_t02: RuntimeError
-LibTest/typed_data/Uint16List/Uint16List.view_A05_t03: RuntimeError
-LibTest/typed_data/Uint16List/Uint16List_A02_t01: RuntimeError
-LibTest/typed_data/Uint16List/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint16List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint32List/Uint32List.view_A05_t01: RuntimeError
-LibTest/typed_data/Uint32List/Uint32List.view_A05_t02: RuntimeError
-LibTest/typed_data/Uint32List/Uint32List.view_A05_t03: RuntimeError
-LibTest/typed_data/Uint32List/Uint32List_A02_t01: RuntimeError
-LibTest/typed_data/Uint32List/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint32List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t01: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.fromList_A01_t02: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.fromList_A02_t01: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A01_t01: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A01_t02: CompileTimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A04_t01: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A05_t01: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A05_t02: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A05_t03: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List.view_A06_t01: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/Uint64List_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/addAll_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/add_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/asMap_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/asMap_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/asMap_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/buffer_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/buffer_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/clear_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/contains_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/elementAt_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/elementAt_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/elementSizeInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/elementSizeInBytes_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/expand_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/expand_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/fillRange_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/fillRange_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/firstWhere_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/firstWhere_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/firstWhere_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/first_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/first_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/first_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/first_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/fold_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/forEach_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/getRange_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/getRange_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/getRange_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/getRange_A04_t01: RuntimeError
-LibTest/typed_data/Uint64List/hashCode_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/hashCode_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/indexOf_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/indexOf_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/indexOf_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/indexOf_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/insertAll_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/insert_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/isEmpty_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/isEmpty_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/isNotEmpty_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/isNotEmpty_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/iterator_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/iterator_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/iterator_current_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/iterator_moveNext_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/join_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/join_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/lastIndexOf_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/lastIndexOf_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/lastIndexOf_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/lastIndexOf_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/lastWhere_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/lastWhere_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/lastWhere_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/last_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/last_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/last_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/lengthInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/lengthInBytes_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/length_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/length_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/map_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/map_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/map_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/offsetInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/offsetInBytes_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/operator_equality_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/operator_subscript_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/operator_subscript_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/operator_subscripted_assignment_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/operator_subscripted_assignment_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/reduce_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/reduce_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/reduce_A03_t01: CompileTimeError
-LibTest/typed_data/Uint64List/removeAt_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/removeLast_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/removeRange_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/removeWhere_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/remove_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/replaceRange_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/retainWhere_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/reversed_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/reversed_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/runtimeType_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/runtimeType_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/setAll_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/setAll_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/setAll_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/setAll_A04_t01: RuntimeError
-LibTest/typed_data/Uint64List/setRange_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/setRange_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/setRange_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/setRange_A04_t01: RuntimeError
-LibTest/typed_data/Uint64List/setRange_A05_t01: RuntimeError
-LibTest/typed_data/Uint64List/shuffle_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/shuffle_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/shuffle_A01_t03: RuntimeError
-LibTest/typed_data/Uint64List/singleWhere_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/singleWhere_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/singleWhere_A02_t02: RuntimeError
-LibTest/typed_data/Uint64List/single_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/single_A01_t02: RuntimeError
-LibTest/typed_data/Uint64List/single_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/single_A02_t02: RuntimeError
-LibTest/typed_data/Uint64List/skipWhile_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/skipWhile_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/skipWhile_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/skipWhile_A04_t01: RuntimeError
-LibTest/typed_data/Uint64List/skip_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/skip_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/skip_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/sort_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/sublist_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/sublist_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/sublist_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/sublist_A03_t02: RuntimeError
-LibTest/typed_data/Uint64List/takeWhile_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/takeWhile_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/takeWhile_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/takeWhile_A04_t01: RuntimeError
-LibTest/typed_data/Uint64List/take_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/take_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/take_A03_t01: RuntimeError
-LibTest/typed_data/Uint64List/toList_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/toList_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/toList_A02_t02: RuntimeError
-LibTest/typed_data/Uint64List/toSet_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/toSet_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/toString_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/where_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/where_A02_t01: RuntimeError
-LibTest/typed_data/Uint64List/where_A03_t01: RuntimeError
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t01: RuntimeError
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t02: RuntimeError
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList.view_A05_t03: RuntimeError
-LibTest/typed_data/Uint8ClampedList/Uint8ClampedList_A02_t01: RuntimeError
-LibTest/typed_data/Uint8ClampedList/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint8ClampedList/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint8List/Uint8List.view_A05_t01: RuntimeError
-LibTest/typed_data/Uint8List/Uint8List.view_A05_t02: RuntimeError
-LibTest/typed_data/Uint8List/Uint8List.view_A05_t03: RuntimeError
-LibTest/typed_data/Uint8List/Uint8List_A02_t01: RuntimeError
-LibTest/typed_data/Uint8List/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint8List/every_A01_t01: RuntimeError
-Utils/tests/Expect/identical_A01_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/EventObject.after.dispatchEvenr_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: RuntimeError
-WebPlatformTest/Utils/test/testFail_t01: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A05_t01: RuntimeError
-WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError
-WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-createElement_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-getElementsByTagName_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-appendChild_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-appendChild_t02: RuntimeError
-WebPlatformTest/dom/nodes/Node-isEqualNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-replaceChild_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A05_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t03: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t02: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A08_t01: RuntimeError
-WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError
-WebPlatformTest/html-imports/link-import_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/creating-an-element-for-the-token/template-owner-document_t01: RuntimeError
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError
-WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError
-WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-autocomplete_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-nameditem_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/date_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/datetime-local_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/email_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/hidden_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/input-textselection_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/text_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/valueMode_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-meter-element/meter_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-recurse_t01: RuntimeError
-WebPlatformTest/html/semantics/grouping-content/the-blockquote-element/grouping-blockquote_t01: RuntimeError
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-showModal_t01: RuntimeError
-WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t02: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/dir_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/enabled_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/tBodies_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-004_t02: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/elements-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-006_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/composition/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/rendering-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/selectors-api-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-007_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError
-WebPlatformTest/webstorage/event_constructor_t01: RuntimeError
-WebPlatformTest/webstorage/event_local_key_t01: RuntimeError
-WebPlatformTest/webstorage/event_local_oldvalue_t01: RuntimeError
-WebPlatformTest/webstorage/event_local_storagearea_t01: RuntimeError
-WebPlatformTest/webstorage/event_session_newvalue_t01: RuntimeError
-WebPlatformTest/webstorage/event_session_oldvalue_t01: RuntimeError
-WebPlatformTest/webstorage/event_session_storagearea_t01: RuntimeError
 
 [ $builder_tag != run_webgl_tests && $compiler == dart2js ]
 LayoutTests/fast/canvas/webgl*: Skip # Only run WebGL on special builders, issue 29961
 
-[ $compiler == dart2js && $runtime == chrome ]
-Language/Expressions/Additive_Expressions/syntax_t01: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
-Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/exception_t02/01: CompileTimeError
-Language/Expressions/Constants/integer_size_t03: CompileTimeError
-Language/Expressions/Constants/integer_size_t04: CompileTimeError
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Timeout
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Timeout
-Language/Expressions/Identifier_Reference/evaluation_variable_or_parameter_t02: RuntimeError
-Language/Expressions/If_null_Expressions/static_type_t01: RuntimeError
-Language/Expressions/Lists/identical_t02: RuntimeError
-Language/Expressions/Maps/identical_t02: RuntimeError
-Language/Expressions/Null/instance_of_class_null_t01: RuntimeError
-Language/Expressions/Numbers/syntax_t06: CompileTimeError
-Language/Expressions/Numbers/syntax_t09: CompileTimeError
-Language/Expressions/Object_Identity/double_t02: RuntimeError
-Language/Expressions/Shift/integer_t02: CompileTimeError
-Language/Expressions/Type_Cast/syntax_t01: RuntimeError
-Language/Expressions/Unary_Expressions/variable_negative_t03: RuntimeError
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: CompileTimeError
-Language/Libraries_and_Scripts/top_level_syntax_t01: CompileTimeError
-Language/Metadata/before_ctor_t02: RuntimeError
-Language/Metadata/before_function_t01: RuntimeError
-Language/Metadata/before_function_t02: RuntimeError
-Language/Metadata/before_function_t03: RuntimeError
-Language/Metadata/before_function_t04: RuntimeError
-Language/Metadata/before_function_t07: RuntimeError
-Language/Metadata/before_import_t01: RuntimeError
-Language/Metadata/before_param_t03: RuntimeError
-Language/Metadata/before_param_t05: RuntimeError
-Language/Metadata/before_param_t07: RuntimeError
-Language/Metadata/before_param_t09: RuntimeError
-Language/Metadata/before_variable_t02: RuntimeError
-Language/Overview/Privacy/private_and_public_t18: RuntimeError
-Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: RuntimeError
-Language/Statements/Assert/execution_t09: RuntimeError
-Language/Types/Function_Types/call_t01: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t03: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t11: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t01: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t04: RuntimeError
-Language/Types/Interface_Types/subtype_t06: RuntimeError
-Language/Types/Interface_Types/subtype_t21: RuntimeError
-Language/Types/Interface_Types/subtype_t23: RuntimeError
-Language/Variables/constant_variable_t09: RuntimeError
-LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_FutureOr_l1_t05: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t05: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t10: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_typedef_l1_t05: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_return_value_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LanguageFeatures/regression/34803_t01: Crash
-LanguageFeatures/regression/34803_t02: Crash
-LayoutTests/fast/animation/request-animation-frame-cancel2_t01: Timeout, Pass
-LayoutTests/fast/animation/request-animation-frame-cancel_t01: Timeout, Pass
-LayoutTests/fast/animation/request-animation-frame-prefix_t01: Timeout, Pass
-LayoutTests/fast/animation/request-animation-frame-timestamps-advance_t01: Timeout, Pass
-LayoutTests/fast/animation/request-animation-frame-timestamps_t01: Timeout, Pass
-LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError
-LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError
-LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError
-LayoutTests/fast/canvas/2d.composite.globalAlpha.fillPath_t01: RuntimeError
-LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError
-LayoutTests/fast/canvas/DrawImageSinglePixelStretch_t01: Timeout
-LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: Timeout, Pass
-LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-rounding_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: Timeout, Pass
-LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-resize-after-paint_t01: Timeout, Pass
-LayoutTests/fast/canvas/drawImage-with-valid-image_t01: Timeout
-LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError
-LayoutTests/fast/canvas/gradient-addColorStop-with-invalid-color_t01: RuntimeError
-LayoutTests/fast/canvas/rgba-parsing_t01: RuntimeError
-LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: Timeout, RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: Timeout, RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: Timeout
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError
-LayoutTests/fast/css-generated-content/bug91547_t01: RuntimeError
-LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: RuntimeError, Pass
-LayoutTests/fast/css-generated-content/pseudo-animation_t01: RuntimeError, Pass
-LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Timeout
-LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Timeout, Pass
-LayoutTests/fast/css-generated-content/reset-content-to-initial_t01: Timeout, Pass
-LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-column-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError
-LayoutTests/fast/css/MarqueeLayoutTest_t01: RuntimeError, Pass
-LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError
-LayoutTests/fast/css/auto-min-size_t01: RuntimeError
-LayoutTests/fast/css/background-serialize_t01: RuntimeError
-LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError
-LayoutTests/fast/css/content/content-none_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError, Pass
-LayoutTests/fast/css/content/content-quotes-05_t01: RuntimeError, Pass
-LayoutTests/fast/css/counters/complex-before_t01: RuntimeError, Pass
-LayoutTests/fast/css/device-aspect-ratio_t01: RuntimeError
-LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_t01: RuntimeError
-LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError, Pass
-LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError, Pass
-LayoutTests/fast/css/font-face-insert-link_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError, Timeout
-LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError, Timeout
-LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError
-LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError
-LayoutTests/fast/css/implicit-attach-marking_t01: Timeout, Pass
-LayoutTests/fast/css/insertRule-media_t01: RuntimeError
-LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError
-LayoutTests/fast/css/media-query-recovery_t01: RuntimeError
-LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError
-LayoutTests/fast/css/overflow-property_t01: RuntimeError, Pass
-LayoutTests/fast/css/padding-no-renderer_t01: RuntimeError, Pass
-LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError
-LayoutTests/fast/css/percent-min-width-img-src-change_t01: Timeout, Pass
-LayoutTests/fast/css/pseudo-any_t01: RuntimeError, Pass
-LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Timeout
-LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Timeout, Pass
-LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError
-LayoutTests/fast/css/sheet-collection-link_t01: RuntimeError
-LayoutTests/fast/css/space-before-charset-external_t01: RuntimeError
-LayoutTests/fast/css/style-element-process-crash_t01: Timeout, Pass
-LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-link_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError
-LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-port_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError
-LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: RuntimeError
-LayoutTests/fast/dom/HTMLButtonElement/value/getset_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-natural-width-height_t01: Timeout
-LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/click-label_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Timeout
-LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Timeout
-LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/indeterminate-progress-002_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-reexecution_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Timeout
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableSectionElement/rows_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: Timeout, Pass
-LayoutTests/fast/dom/MutationObserver/removed-out-of-order_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError, Pass
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-style-2_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError
-LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError, Pass
-LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError
-LayoutTests/fast/dom/css-cached-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule-twice_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError
-LayoutTests/fast/dom/cssTarget-crash_t01: RuntimeError
-LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError
-LayoutTests/fast/dom/empty-hash-and-search_t01: RuntimeError
-LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError, Pass
-LayoutTests/fast/dom/gc-image-element-2_t01: Timeout
-LayoutTests/fast/dom/gc-image-element_t01: Timeout
-LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError
-LayoutTests/fast/dom/image-object_t01: Timeout
-LayoutTests/fast/dom/non-styled-element-id-crash_t01: RuntimeError
-LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError
-LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError, Pass
-LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError, Pass
-LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError
-LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError
-LayoutTests/fast/dynamic/checkbox-selection-crash_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError
-LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Timeout
-LayoutTests/fast/events/clipboard-clearData_t01: Timeout
-LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Timeout
-LayoutTests/fast/events/event-creation_t01: RuntimeError
-LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError
-LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError
-LayoutTests/fast/events/fire-scroll-event-element_t01: Timeout, Pass
-LayoutTests/fast/events/fire-scroll-event_t01: RuntimeError, Timeout
-LayoutTests/fast/events/init-message-event_t01: RuntimeError
-LayoutTests/fast/events/input-focus-no-duplicate-events_t01: RuntimeError, Pass
-LayoutTests/fast/events/invalid-002_t01: RuntimeError
-LayoutTests/fast/events/invalid-003_t01: RuntimeError
-LayoutTests/fast/events/label-focus_t01: RuntimeError, Pass
-LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError
-LayoutTests/fast/events/nested-event-remove-node-crash_t01: Timeout, Pass
-LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError, Timeout
-LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError
-LayoutTests/fast/events/scroll-during-zoom-change_t01: Timeout, Pass
-LayoutTests/fast/events/scroll-event-phase_t01: Timeout, Pass
-LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError, Pass
-LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError
-LayoutTests/fast/files/blob-close-read_t01: RuntimeError
-LayoutTests/fast/files/blob-constructor_t01: RuntimeError
-LayoutTests/fast/files/read-blob-as-array-buffer_t01: RuntimeError
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError, Pass
-LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-004_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-focus-only-once_t01: Timeout, Pass
-LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Timeout, Pass
-LayoutTests/fast/forms/autofocus-opera-007_t01: Timeout, Pass
-LayoutTests/fast/forms/autofocus-readonly-attribute_t01: Timeout, Pass
-LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError, Pass
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError, Pass
-LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/focus-style-pending_t01: Timeout, Pass
-LayoutTests/fast/forms/focus_t01: RuntimeError, Pass
-LayoutTests/fast/forms/form-attribute-nonexistence-form-id_t01: RuntimeError
-LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError
-LayoutTests/fast/forms/input-implicit-length-limit_t01: RuntimeError
-LayoutTests/fast/forms/input-inputmode_t01: RuntimeError
-LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError
-LayoutTests/fast/forms/onchange-change-type_t01: RuntimeError
-LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError
-LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError
-LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError
-LayoutTests/fast/forms/paste-into-textarea_t01: RuntimeError
-LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError
-LayoutTests/fast/forms/select-change-popup-to-listbox-in-event-handler_t01: Timeout
-LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError
-LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError
-LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError
-LayoutTests/fast/forms/textfield-focus-out_t01: Timeout, Pass
-LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError
-LayoutTests/fast/html/article-element_t01: RuntimeError
-LayoutTests/fast/html/details-add-child-2_t01: RuntimeError
-LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError
-LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError
-LayoutTests/fast/html/figure-element_t01: RuntimeError
-LayoutTests/fast/html/header-element_t01: RuntimeError
-LayoutTests/fast/html/hgroup-element_t01: RuntimeError
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Timeout
-LayoutTests/fast/html/main-element_t01: RuntimeError
-LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError
-LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError
-LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError
-LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError
-LayoutTests/fast/loader/about-blank-hash-change_t01: Timeout
-LayoutTests/fast/loader/about-blank-hash-kept_t01: Timeout
-LayoutTests/fast/loader/local-css-allowed-in-strict-mode_t01: RuntimeError
-LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Timeout, Pass
-LayoutTests/fast/loader/scroll-position-restored-on-back_t01: Timeout
-LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError
-LayoutTests/fast/masking/parsing-mask_t01: RuntimeError
-LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError
-LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError
-LayoutTests/fast/multicol/cssom-view_t01: RuntimeError
-LayoutTests/fast/multicol/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError
-LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError
-LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError
-LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError
-LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError
-LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: Timeout, Pass
-LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: Timeout, RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: Timeout, Pass
-LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: Timeout, Pass
-LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError
-LayoutTests/fast/sub-pixel/computedstylemargin_t01: RuntimeError, Pass
-LayoutTests/fast/table/col-width-span-expand_t01: RuntimeError, Pass
-LayoutTests/fast/table/fixed-table-layout-toggle-colwidth_t01: RuntimeError, Pass
-LayoutTests/fast/table/fixed-table-with-percent-width-inside-extra-large-div_t01: RuntimeError, Pass
-LayoutTests/fast/table/hittest-tablecell-bottom-edge_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-with-borders-bottom-edge_t01: RuntimeError
-LayoutTests/fast/table/html-table-width-max-width-constrained_t01: RuntimeError
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: RuntimeError
-LayoutTests/fast/table/margins-flipped-text-direction_t01: RuntimeError
-LayoutTests/fast/table/min-width-css-block-table_t01: RuntimeError
-LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError
-LayoutTests/fast/table/resize-table-binding-cell_t01: RuntimeError, Pass
-LayoutTests/fast/table/resize-table-cell_t01: RuntimeError, Pass
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError
-LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError
-LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError
-LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError, Pass
-LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError, Pass
-LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError
-LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError
-LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError, Pass
-LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError
-LayoutTests/fast/text/zero-width-characters-complex-script_t01: RuntimeError
-LayoutTests/fast/url/anchor_t01: RuntimeError
-LayoutTests/fast/url/file-http-base_t01: RuntimeError
-LayoutTests/fast/url/file_t01: RuntimeError
-LayoutTests/fast/url/idna2003_t01: RuntimeError
-LayoutTests/fast/url/idna2008_t01: RuntimeError
-LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError
-LayoutTests/fast/url/ipv4_t01: RuntimeError
-LayoutTests/fast/url/ipv6_t01: RuntimeError
-LayoutTests/fast/url/mailto_t01: RuntimeError
-LayoutTests/fast/url/path_t01: RuntimeError
-LayoutTests/fast/url/query_t01: RuntimeError
-LayoutTests/fast/url/relative-win_t01: RuntimeError
-LayoutTests/fast/url/relative_t01: RuntimeError
-LayoutTests/fast/url/segments_t01: RuntimeError
-LayoutTests/fast/url/standard-url_t01: RuntimeError
-LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: RuntimeError
-LayoutTests/fast/writing-mode/percentage-margins-absolute-replaced_t01: RuntimeError, Pass
-LayoutTests/fast/writing-mode/percentage-margins-absolute_t01: RuntimeError, Pass
-LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-html-document-responsetype-quirks_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError
-LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError
-LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError
-LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError
-LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError
-LayoutTests/fast/xsl/default-html_t01: RuntimeError
-LibTest/async/Future/asStream_A01_t02: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t01: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError, Pass
-LibTest/async/Stream/Stream.fromIterable_A03_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A03_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t03: RuntimeError
-LibTest/async/StreamController/addStream_A03_t01: RuntimeError
-LibTest/async/StreamController/stream_A02_t03: RuntimeError
-LibTest/async/StreamController/stream_A03_t02: RuntimeError
-LibTest/async/StreamSink/addStream_A01_t02: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer.fromHandlers_A01_t03: RuntimeError
-LibTest/async/Zone/registerBinaryCallback_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/fold_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t03: RuntimeError
-LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t02: RuntimeError
-LibTest/collection/HashSet/HashSet_A04_t01: RuntimeError
-LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/contains_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/every_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/expand_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/expand_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/fold_A01_t01: RuntimeError
-LibTest/collection/LinkedList/addAll_A01_t02: RuntimeError
-LibTest/collection/LinkedList/join_A01_t01: RuntimeError
-LibTest/collection/LinkedList/toString_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/LinkedListEntry_class_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A02_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/list_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A02_t02: RuntimeError
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError
-LibTest/collection/ListQueue/ListQueue.from_A01_t01: RuntimeError
-LibTest/convert/LineSplitter/fuse_A01_t01: RuntimeError
-LibTest/core/AssertionError/AssertionError_A01_t01: RuntimeError
-LibTest/core/AssertionError/message_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/CyclicInitializationError.class_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/variableName_A01_t01: RuntimeError
-LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecond_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/parse_A01_t03: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t01: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t02: RuntimeError
-LibTest/core/Duration/Duration_A01_t01: CompileTimeError
-LibTest/core/Duration/Duration_A02_t01: CompileTimeError
-LibTest/core/Duration/inDays_A01_t01: CompileTimeError
-LibTest/core/Duration/inHours_A01_t01: CompileTimeError
-LibTest/core/Duration/inMicroseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inMilliseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inSeconds_A01_t01: CompileTimeError
-LibTest/core/Error/stackTrace_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t04: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t05: RuntimeError
-LibTest/core/Function/Function_class_A01_t01: RuntimeError
-LibTest/core/IndexError/stackTrace_A01_t01: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError
-LibTest/core/Runes/any_A01_t01: RuntimeError
-LibTest/core/Runes/every_A01_t01: RuntimeError
-LibTest/core/String/padRight_A01_t01: RuntimeError
-LibTest/core/String/replaceFirstMapped_A03_t01: RuntimeError
-LibTest/core/Symbol/Symbol_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t02: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t05: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t01: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A02_t03: RuntimeError
-LibTest/core/Uri/Uri.file_A02_t03: RuntimeError
-LibTest/core/Uri/queryParametersAll_A01_t04: RuntimeError
-LibTest/core/Uri/queryParametersAll_A03_t01: RuntimeError
-LibTest/core/UriData/UriData.fromBytes_A01_t03: RuntimeError
-LibTest/core/UriData/charset_A01_t01: RuntimeError
-LibTest/core/UriData/contentText_A01_t01: RuntimeError
-LibTest/core/UriData/parse_A01_t01: RuntimeError
-LibTest/core/double/INFINITY_A01_t04: RuntimeError
-LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError
-LibTest/core/double/isInfinite_A01_t03: CompileTimeError
-LibTest/core/double/operator_GE_A01_t02: CompileTimeError
-LibTest/core/double/operator_GT_A01_t02: CompileTimeError
-LibTest/core/double/operator_LT_A01_t02: CompileTimeError
-LibTest/core/double/operator_addition_A01_t08: Crash
-LibTest/core/double/operator_subtraction_A01_t06: RuntimeError
-LibTest/core/double/operator_subtraction_A01_t09: Crash
-LibTest/core/int/ceil_A01_t01: CompileTimeError
-LibTest/core/int/compareTo_A01_t01: CompileTimeError
-LibTest/core/int/floorToDouble_A01_t01: CompileTimeError
-LibTest/core/int/floor_A01_t01: CompileTimeError
-LibTest/core/int/hashCode_A01_t01: CompileTimeError
-LibTest/core/int/isInfinite_A01_t01: CompileTimeError
-LibTest/core/int/isNegative_A01_t01: CompileTimeError
-LibTest/core/int/isOdd_A01_t01: RuntimeError
-LibTest/core/int/operator_AND_A01_t01: CompileTimeError
-LibTest/core/int/operator_GE_A01_t01: CompileTimeError
-LibTest/core/int/operator_LT_A01_t01: CompileTimeError
-LibTest/core/int/operator_XOR_A01_t01: CompileTimeError
-LibTest/core/int/operator_addition_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A03_t01: CompileTimeError
-LibTest/core/int/operator_left_shift_A01_t01: RuntimeError
-LibTest/core/int/operator_remainder_A01_t03: RuntimeError
-LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError
-LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError
-LibTest/core/int/parse_A03_t02: CompileTimeError
-LibTest/core/int/roundToDouble_A01_t01: CompileTimeError
-LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: Timeout
-LibTest/html/Element/blur_A01_t01: Timeout, Pass
-LibTest/html/Element/focus_A01_t01: Timeout, Pass
-LibTest/html/Element/loadEvent_A01_t01: Timeout
-LibTest/html/Element/mouseWheelEvent_A01_t01: Timeout
-LibTest/html/Element/onLoad_A01_t01: Timeout, Pass
-LibTest/html/Element/onMouseWheel_A01_t01: Timeout
-LibTest/html/Element/transitionEndEvent_A01_t01: Timeout
-LibTest/html/HttpRequest/responseText_A01_t02: Timeout
-LibTest/html/HttpRequestUpload/onError_A01_t02: Timeout
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Timeout, Pass
-LibTest/html/IFrameElement/enteredView_A01_t01: Timeout, Pass
-LibTest/html/IFrameElement/focus_A01_t01: Timeout, Pass
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: Timeout
-LibTest/html/IFrameElement/onTransitionEnd_A01_t01: Timeout
-LibTest/typed_data/Float64List/shuffle_A01_t01: RuntimeError, Pass
-LibTest/typed_data/Int16List/shuffle_A01_t01: RuntimeError, Pass
-Utils/tests/Expect/throws_A01_t04: RuntimeError
-WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Timeout
-WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Timeout
-WebPlatformTest/custom-elements/concepts/type_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError
-WebPlatformTest/dom/events/type_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-isEqualNode_t01: Timeout
-WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError
-WebPlatformTest/html-imports/link-import_t02: RuntimeError
-WebPlatformTest/html-imports/loading-import_t01: RuntimeError
-WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Timeout
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: Timeout
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError, Pass
-WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-nameditem_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/input-type-button_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/mobiles_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-textarea-element/textarea-type_t01: RuntimeError
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError, Pass
-WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/link_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/attributes-common-to-td-and-th-elements/cellIndex_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: Timeout, Pass
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: Timeout, Pass
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: Timeout, Pass
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: Timeout, Pass
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError, Pass
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError, Pass
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/webstorage/event_constructor_t02: RuntimeError
-WebPlatformTest/webstorage/event_local_key_t01: Timeout
-WebPlatformTest/webstorage/event_local_newvalue_t01: Timeout
-WebPlatformTest/webstorage/event_local_oldvalue_t01: Timeout
-WebPlatformTest/webstorage/event_local_storagearea_t01: Timeout
-WebPlatformTest/webstorage/event_local_url_t01: Timeout, Pass
-WebPlatformTest/webstorage/event_session_key_t01: Timeout, Pass
-WebPlatformTest/webstorage/event_session_newvalue_t01: Timeout
-WebPlatformTest/webstorage/event_session_oldvalue_t01: Timeout
-WebPlatformTest/webstorage/event_session_storagearea_t01: Timeout
-WebPlatformTest/webstorage/event_session_url_t01: Timeout
-
-[ $compiler == dart2js && $runtime == chrome && $system == linux && $fast_startup ]
-LayoutTests/fast/animation/request-animation-frame-cancel_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError, Pass
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: Timeout, Pass
-LayoutTests/fast/text/international/combining-marks-position_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime == chrome && $system == macos ]
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError, Pass
-LayoutTests/fast/css/fontface-properties_t01: RuntimeError, Pass
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError, Pass
-LayoutTests/fast/dom/vertical-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError, Pass
-LayoutTests/fast/events/scroll-event-does-not-bubble_t01: Timeout, Pass
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError, Pass
-LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError
-LayoutTests/fast/forms/percent-height-auto-width-form-controls_t01: RuntimeError, Pass
-LayoutTests/fast/multicol/column-width-zero_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError, Pass
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: RuntimeError, Pass
-LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError, Pass
-WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError, Pass
-
-[ $compiler == dart2js && $runtime == chrome && $system == macos && $fast_startup ]
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError
-LayoutTests/fast/css/overflow-property_t01: RuntimeError, Pass
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError, Pass
-LayoutTests/fast/forms/percent-height-auto-width-form-controls_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError, Pass
-LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime == chrome && $system == windows ]
-LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: RuntimeError
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError, Pass
-LayoutTests/fast/text/regional-indicator-symobls_t01: RuntimeError
-LibTest/typed_data/Uint8List/shuffle_A01_t01: RuntimeError, Pass
-
-[ $compiler == dart2js && $runtime == chrome && $fast_startup ]
-LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError, Pass
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError
-LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError, Pass
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError
-LayoutTests/fast/dom/vertical-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError, Pass
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError, Pass
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError
-LayoutTests/fast/sub-pixel/computedstylemargin_t01: RuntimeError, Pass
-LayoutTests/fast/table/css-table-max-height_t01: RuntimeError
-LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError
-LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError
-LayoutTests/fast/table/min-max-width-preferred-size_t01: RuntimeError
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError
-LayoutTests/fast/table/table-width-exceeding-max-width_t01: RuntimeError
-LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError
-LayoutTests/fast/text/find-spaces_t01: RuntimeError
-LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError
-LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError
-LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError
-LibTest/math/cos_A01_t01: RuntimeError
-WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError
-WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime == chrome && !$fast_startup ]
-WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime != chrome ]
-LayoutTests/fast/backgrounds/background-repeat-computed-style_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-strokePath-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgb565_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: RuntimeError
-LayoutTests/fast/css/dynamic-class-backdrop-pseudo_t01: RuntimeError
-LayoutTests/fast/css/invalidation/detach-reattach-shadow_t01: RuntimeError
-LayoutTests/fast/css/invalidation/shadow-host-toggle_t01: RuntimeError
-LayoutTests/fast/css/percent-min-width-img-src-change_t01: RuntimeError
-LayoutTests/fast/css/percent-width-img-src-change_t01: RuntimeError
-LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-in-shadow_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-loading-gc_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/script-load-events_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError
-LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError
-LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError, Pass
-LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError
-LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError
-LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError
-LayoutTests/fast/dom/custom/element-type_t01: RuntimeError
-LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError
-LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError
-LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError
-LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError, Pass
-LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError
-LayoutTests/fast/dom/shadow/form-in-shadow_t01: RuntimeError
-LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: RuntimeError
-LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: RuntimeError
-LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError
-LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError
-LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError
-LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError
-LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError
-LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError
-LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-append_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError
-LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: RuntimeError
-LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError
-LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError
-LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError
-LayoutTests/fast/events/label-focus_t01: RuntimeError, Pass
-LayoutTests/fast/filesystem/file-from-file-entry_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-abort-depth_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-empty-blob_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-gc-blob_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-reference_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-entry_t01: RuntimeError
-LayoutTests/fast/filesystem/op-move_t01: RuntimeError
-LayoutTests/fast/filesystem/op-remove_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-unicode_t01: RuntimeError
-LayoutTests/fast/filesystem/read-directory-many_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-readonly_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-required-arguments-getdirectory_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-required-arguments-getfile_t01: RuntimeError
-LayoutTests/fast/forms/button-baseline-and-collapsing_t01: RuntimeError
-LayoutTests/fast/forms/datalist/datalist-child-validation_t01: RuntimeError
-LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError
-LayoutTests/fast/forms/date/ValidityState-rangeOverflow-date_t01: RuntimeError
-LayoutTests/fast/forms/date/ValidityState-rangeUnderflow-date_t01: RuntimeError
-LayoutTests/fast/forms/date/ValidityState-stepMismatch-date_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/ValidityState-rangeOverflow-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/ValidityState-rangeUnderflow-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/ValidityState-stepMismatch-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-pseudo-classes_t01: RuntimeError
-LayoutTests/fast/forms/select-max-length_t01: RuntimeError
-LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-outside_t01: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: RuntimeError
-LayoutTests/fast/svg/tabindex-focus_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-integer_t01: RuntimeError
-LayoutTests/fast/table/col-width-span-expand_t01: RuntimeError, Pass
-LayoutTests/fast/text/international/listbox-width-rtl_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-rtl_t01: RuntimeError
-LayoutTests/fast/url/port_t01: RuntimeError
-LibTest/html/Element/attributeChanged_A01_t01: RuntimeError
-LibTest/html/Element/enteredView_A01_t01: RuntimeError
-LibTest/html/Element/leftView_A01_t01: RuntimeError
-LibTest/html/Element/onLoad_A01_t01: RuntimeError
-LibTest/html/Element/onTransitionEnd_A01_t01: RuntimeError
-LibTest/html/Element/tagName_A01_t03: RuntimeError
-LibTest/html/HttpRequest/onError_A01_t02: RuntimeError
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: RuntimeError
-LibTest/html/IFrameElement/IFrameElement.created_A01_t01: RuntimeError
-LibTest/html/IFrameElement/blur_A01_t01: RuntimeError
-LibTest/html/IFrameElement/enteredView_A01_t01: RuntimeError
-LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError
-LibTest/html/Window/requestFileSystem_A01_t01: RuntimeError
-LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A01_t01: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A07_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A01_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A02_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/namespace_A01_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-007_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-008_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-010_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-012_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-007_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-010_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-retargeting/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-006_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-009_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t03: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/inert-html-elements/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/shadow-root-001_t01: RuntimeError
-WebPlatformTest/webstorage/event_local_url_t01: RuntimeError
-WebPlatformTest/webstorage/event_session_key_t01: RuntimeError
-WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime != chrome && $runtime != ff && $runtime != safari && !$fast_startup ]
-LayoutTests/fast/animation/request-animation-frame-callback-id_t01: RuntimeError
-LayoutTests/fast/animation/request-animation-frame-cancel_t01: RuntimeError
-LayoutTests/fast/animation/request-animation-frame-timestamps-advance_t01: RuntimeError
-LayoutTests/fast/animation/request-animation-frame-timestamps_t01: RuntimeError
-LayoutTests/fast/animation/request-animation-frame-within-callback_t01: RuntimeError
-LayoutTests/fast/backgrounds/001_t01: RuntimeError
-LayoutTests/fast/backgrounds/multiple-backgrounds-computed-style_t01: RuntimeError
-LayoutTests/fast/backgrounds/multiple-backgrounds-initial-values_t01: RuntimeError
-LayoutTests/fast/box-shadow/box-shadow-parsing-invalid_t01: RuntimeError
-LayoutTests/fast/box-sizing/css-table-with-box-sizing_t01: RuntimeError
-LayoutTests/fast/canvas/access-zero-sized-canvas_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-2d-imageData-create-nonfinite_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-arc-zero-lineto_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-as-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-bezier-same-endpoint_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-color-clamping_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-canvas_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-copyPixels_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-drawImage-incomplete_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-ellipse_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fill-rule_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-negative-source_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-gradient-without-path_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-invalid-strokestyle_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-largedraws_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lineDash-invalid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lineWidth_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-measureText_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-pattern-behaviour_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-pattern-transform_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-radial-gradient-spreadMethod_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-resize-after-paint_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-save-restore_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-set-properties-with-non-invertible-ctm_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-skia-excessive-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokePath-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeRect_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-toDataURL-case-insensitive-mimetype_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-toDataURL-jpeg-crash_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-with-incorrect-args_t01: RuntimeError
-LayoutTests/fast/canvas/canvas_arc_largeangles_t01: RuntimeError
-LayoutTests/fast/canvas/change-context_t01: RuntimeError
-LayoutTests/fast/canvas/drawImage-with-negative-source-destination_t01: RuntimeError
-LayoutTests/fast/canvas/drawImageFromRect_withToDataURLAsSource_t01: RuntimeError
-LayoutTests/fast/canvas/fallback-content_t01: RuntimeError
-LayoutTests/fast/canvas/fillrect-gradient-zero-stops_t01: RuntimeError
-LayoutTests/fast/canvas/invalid-set-font-crash_t01: RuntimeError
-LayoutTests/fast/canvas/pointInPath_t01: RuntimeError
-LayoutTests/fast/canvas/radialGradient-infinite-values_t01: RuntimeError
-LayoutTests/fast/canvas/shadow-huge-blur_t01: RuntimeError
-LayoutTests/fast/canvas/text-globalAlpha_t01: RuntimeError
-LayoutTests/fast/canvas/transformed-canvas-reset_t01: RuntimeError
-LayoutTests/fast/canvas/translate-text_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/array-bounds-clamping_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/buffer-bind-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/canvas-2d-webgl-texture_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/compressed-tex-image_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/context-lost-restored_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/draw-webgl-to-canvas-2d_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/framebuffer-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-enable-enum-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-uniformmatrix4fv_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib-zero-issues_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-vertexattribpointer_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-crash-with-buffer-sub-data_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/invalid-UTF-16_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/invalid-passed-params_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/is-object_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/program-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/read-pixels-pack-alignment_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/renderbuffer-initialization_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba5551_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-webgl_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d-bad-args_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/uniform-location-length-limits_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-composite-modes-repaint_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-composite-modes_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-exceptions_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-texture-binding-preserved_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-viewport-parameters-preserved_t01: RuntimeError
-LayoutTests/fast/canvas/winding-enumeration_t01: RuntimeError
-LayoutTests/fast/css-generated-content/after-with-first-letter-float-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/before-content-with-list-marker-in-anon-block-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/block-after_t01: RuntimeError
-LayoutTests/fast/css-generated-content/empty-first-letter-with-columns-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/first-letter-next-sibling-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/float-first-letter-siblings-convert-to-inline_t01: RuntimeError
-LayoutTests/fast/css-generated-content/hit-test-generated-content_t01: RuntimeError
-LayoutTests/fast/css-generated-content/inline-splitting-with-after-float-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/media-generated-content_t01: RuntimeError
-LayoutTests/fast/css-generated-content/positioned-generated-content-under-run-in-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-animation-display_t01: RuntimeError
-LayoutTests/fast/css-generated-content/quote-first-letter-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/table-row-after-no-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/text-before-table-col-crash_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-remove-svg-child_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-strict-ordering-crash_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/should-not-collapse-anonymous-blocks_t01: RuntimeError
-LayoutTests/fast/css/add-remove-stylesheets-at-once-minimal-recalc-style_t01: RuntimeError
-LayoutTests/fast/css/assert-marquee-not-last-element_t01: RuntimeError
-LayoutTests/fast/css/background-position-inherit_t01: RuntimeError
-LayoutTests/fast/css/border-spacing-without-vertical-value_t01: RuntimeError
-LayoutTests/fast/css/case-sensitive-attr_t01: RuntimeError
-LayoutTests/fast/css/collapsed-whitespace-reattach-in-style-recalc_t01: RuntimeError
-LayoutTests/fast/css/content-language-dynamically-added_t01: RuntimeError
-LayoutTests/fast/css/content-language-dynamically-removed_t01: RuntimeError
-LayoutTests/fast/css/content-language-multiple_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-02_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-03_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-04_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-crash_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-function-input_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-ruby-text-cleared_t01: RuntimeError
-LayoutTests/fast/css/counters/render-tree-reorg-crash_t01: RuntimeError
-LayoutTests/fast/css/crash-comparing-equal_t01: RuntimeError
-LayoutTests/fast/css/crash-on-gradient-with-derived-color_t01: RuntimeError
-LayoutTests/fast/css/css-selector-deeply-nested_t01: RuntimeError
-LayoutTests/fast/css/css-selector-text_t01: RuntimeError
-LayoutTests/fast/css/css3-nth-space_t01: RuntimeError
-LayoutTests/fast/css/cssText-cache_t01: RuntimeError
-LayoutTests/fast/css/dfn-default-font-style_t01: RuntimeError
-LayoutTests/fast/css/display-inline-block-scrollbar_t01: RuntimeError
-LayoutTests/fast/css/display-none-inline-style-change-crash_t01: RuntimeError
-LayoutTests/fast/css/duplicate-property-in-rule-important_t01: RuntimeError
-LayoutTests/fast/css/duplicate-property-in-rule_t01: RuntimeError
-LayoutTests/fast/css/empty-display-none_t01: RuntimeError
-LayoutTests/fast/css/empty-first-line-crash_t01: RuntimeError
-LayoutTests/fast/css/end-of-buffer-crash_t01: RuntimeError
-LayoutTests/fast/css/ex-unit-with-no-x-height_t01: RuntimeError
-LayoutTests/fast/css/fill-layer-crash_t01: RuntimeError
-LayoutTests/fast/css/first-child-display-change_t01: RuntimeError
-LayoutTests/fast/css/first-letter-anonymous-block-crash_t01: RuntimeError
-LayoutTests/fast/css/first-letter-inline-flow-split-crash_t01: RuntimeError
-LayoutTests/fast/css/first-letter-inline-flow-split-table-crash_t01: RuntimeError
-LayoutTests/fast/css/first-letter-nested_t01: RuntimeError
-LayoutTests/fast/css/first-letter-wbr_t01: RuntimeError
-LayoutTests/fast/css/font-face-descending-unicode-range_t01: RuntimeError
-LayoutTests/fast/css/font-face-font-family-descriptor_t01: RuntimeError
-LayoutTests/fast/css/font-face-html-as-svg_t01: RuntimeError
-LayoutTests/fast/css/font-face-in-media-rule_t01: RuntimeError
-LayoutTests/fast/css/font-face-inherit-initial_t01: RuntimeError
-LayoutTests/fast/css/font-face-multiple-families_t01: RuntimeError
-LayoutTests/fast/css/font-face-unused-source-loaded_t01: RuntimeError
-LayoutTests/fast/css/font-family-initial-shorthand_t01: RuntimeError
-LayoutTests/fast/css/fontfaceset-download-error_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/pending-stylesheet_t01: RuntimeError
-LayoutTests/fast/css/id-or-class-before-stylesheet-strict_t01: RuntimeError
-LayoutTests/fast/css/image-set-value-crash-in-fillImageSet_t01: RuntimeError
-LayoutTests/fast/css/important-js-override_t01: RuntimeError
-LayoutTests/fast/css/infinite-floating-value_t01: RuntimeError
-LayoutTests/fast/css/invalid-appearance-progress-bar-meter_t01: RuntimeError
-LayoutTests/fast/css/invalid-cursor-property-crash_t01: RuntimeError
-LayoutTests/fast/css/invalid-parsercontext-valid-keyword-crash_t01: RuntimeError
-LayoutTests/fast/css/invalid-rule-value_t01: RuntimeError
-LayoutTests/fast/css/invalidation/style-update-with-added-stylesheet_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-attribute-style-invalidation_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-id_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-id-style-invalidation_t01: RuntimeError
-LayoutTests/fast/css/large-number-round-trip_t01: RuntimeError
-LayoutTests/fast/css/large-value-csstext_t01: RuntimeError
-LayoutTests/fast/css/many-spaces-before-charset_t01: RuntimeError
-LayoutTests/fast/css/max-height-and-max-width_t01: RuntimeError
-LayoutTests/fast/css/media-rule-screenDepthPerComponent_t01: RuntimeError
-LayoutTests/fast/css/min-max-width_t01: RuntimeError
-LayoutTests/fast/css/misplaced-charset_t01: RuntimeError
-LayoutTests/fast/css/negative-orphans-crash_t01: RuntimeError
-LayoutTests/fast/css/nested-rule-parent-sheet_t01: RuntimeError
-LayoutTests/fast/css/next-sibling-changed_t01: RuntimeError
-LayoutTests/fast/css/nth-child-negative-a-param_t01: RuntimeError
-LayoutTests/fast/css/nth-child-odd-case-insensitive_t01: RuntimeError
-LayoutTests/fast/css/number-parsing-crash-2_t01: RuntimeError
-LayoutTests/fast/css/number-parsing-crash_t01: RuntimeError
-LayoutTests/fast/css/orphaned_units_crash_t01: RuntimeError
-LayoutTests/fast/css/outline-currentcolor_t01: RuntimeError
-LayoutTests/fast/css/outline-hidden-illegal-value_t01: RuntimeError
-LayoutTests/fast/css/outline-invert-assertion_t01: RuntimeError
-LayoutTests/fast/css/outline-offset-crash_t01: RuntimeError
-LayoutTests/fast/css/parse-color-int-or-percent-crash_t01: RuntimeError
-LayoutTests/fast/css/parse-timing-function-crash_t01: RuntimeError
-LayoutTests/fast/css/parsing-css-nonascii_t01: RuntimeError
-LayoutTests/fast/css/parsing-not-after-supports_t01: RuntimeError
-LayoutTests/fast/css/parsing-object-fit_t01: RuntimeError
-LayoutTests/fast/css/pending-images-crash_t01: RuntimeError
-LayoutTests/fast/css/positioned-in-relative-position-inline-crash_t01: RuntimeError
-LayoutTests/fast/css/pseudo-default-003_t01: RuntimeError
-LayoutTests/fast/css/pseudo-default-004_t01: RuntimeError
-LayoutTests/fast/css/pseudo-element-opagedxy-crash_t01: RuntimeError
-LayoutTests/fast/css/pseudo-empty-dynamic-empty_t01: RuntimeError
-LayoutTests/fast/css/pseudo-in-range-invalid-value_t01: RuntimeError
-LayoutTests/fast/css/pseudo-in-range_t01: RuntimeError
-LayoutTests/fast/css/pseudo-invalid-002_t01: RuntimeError
-LayoutTests/fast/css/pseudo-out-of-range_t01: RuntimeError
-LayoutTests/fast/css/pseudo-valid-001_t01: RuntimeError
-LayoutTests/fast/css/pseudo-valid-004_t01: RuntimeError
-LayoutTests/fast/css/pseudo-valid-007_t01: RuntimeError
-LayoutTests/fast/css/pseudo-valid-dynamic_t01: RuntimeError
-LayoutTests/fast/css/pseudostyle-anonymous-text_t01: RuntimeError
-LayoutTests/fast/css/recursive-delay-update-scroll_t01: RuntimeError
-LayoutTests/fast/css/relative-position-replaced-in-table-display-crash_t01: RuntimeError
-LayoutTests/fast/css/rem-units-body_t01: RuntimeError
-LayoutTests/fast/css/remove-class-name_t01: RuntimeError
-LayoutTests/fast/css/remove-style-after-insert-import-rule-crash_t01: RuntimeError
-LayoutTests/fast/css/resize-object-crash_t01: RuntimeError
-LayoutTests/fast/css/selector-text-escape_t01: RuntimeError
-LayoutTests/fast/css/sheet-title_t01: RuntimeError
-LayoutTests/fast/css/shorthands-four-values_t01: RuntimeError
-LayoutTests/fast/css/sibling-selectors-dynamic_t01: RuntimeError
-LayoutTests/fast/css/space-before-charset_t01: RuntimeError
-LayoutTests/fast/css/sticky/sticky-table-col-crash_t01: RuntimeError
-LayoutTests/fast/css/string-quote-binary_t01: RuntimeError
-LayoutTests/fast/css/style-sharing-inline-stylesheet_t01: RuntimeError
-LayoutTests/fast/css/use-incorrect-svg-crash_t01: RuntimeError
-LayoutTests/fast/css/visited-link-hang_t01: RuntimeError
-LayoutTests/fast/css/webfont-lighter-weight-crash_t01: RuntimeError
-LayoutTests/fast/css/webkit-marquee-speed-unit-in-quirksmode_t01: RuntimeError
-LayoutTests/fast/dom/DOMException/prototype-object_t01: RuntimeError
-LayoutTests/fast/dom/Document/replace-child_t01: RuntimeError
-LayoutTests/fast/dom/Document/title-property-creates-title-element_t01: RuntimeError
-LayoutTests/fast/dom/Document/title-property-set-multiple-times_t01: RuntimeError
-LayoutTests/fast/dom/Element/class-name_t01: RuntimeError
-LayoutTests/fast/dom/Element/hostname-host_t01: RuntimeError
-LayoutTests/fast/dom/Element/id-in-map_t01: RuntimeError
-LayoutTests/fast/dom/Element/id-in-param_t01: RuntimeError
-LayoutTests/fast/dom/Element/node-list-identity_t01: RuntimeError
-LayoutTests/fast/dom/Element/remove_t01: RuntimeError
-LayoutTests/fast/dom/Element/setAttribute-with-colon_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/get-href-attribute-port_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-whitespace_t01: RuntimeError
-LayoutTests/fast/dom/HTMLBaseElement/multiple-base-elements_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/activeElement_t01: RuntimeError
-LayoutTests/fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail1_t01: RuntimeError
-LayoutTests/fast/dom/HTMLFormElement/htmlformelement-indexed-getter_t01: RuntimeError
-LayoutTests/fast/dom/HTMLHtmlElement/duplicate-html-element-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/constructor-mutation-event-dispatch_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-src-absolute-url_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/cloned-input-checked-state_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/focus-label_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/cachedresource-types_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-beforeload_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-detached_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-too-many-clients_t01: RuntimeError
-LayoutTests/fast/dom/HTMLMetaElement/meta-attributes_t01: RuntimeError
-LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/progress-element-indeterminate-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: RuntimeError
-LayoutTests/fast/dom/HTMLSelectElement/listbox-select-reset_t01: RuntimeError
-LayoutTests/fast/dom/HTMLSelectElement/named-options_t01: RuntimeError
-LayoutTests/fast/dom/HTMLSelectElement/remove-element-from-within-focus-handler-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLSelectElement/select-element-item-argument_t01: RuntimeError
-LayoutTests/fast/dom/HTMLStyleElement/insert-parser-generated_t01: RuntimeError
-LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onload-handler_t01: RuntimeError
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror_t01: RuntimeError
-LayoutTests/fast/dom/HTMLStyleElement/style-onload-before-page-load_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/early-acid3-66-excerpt_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/table-with-invalid-border_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableRowElement/cells_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/inertContents_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/no-form-association_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/callback-arguments_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/cross-document_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/disconnect-cancel-pending_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/mutate-during-delivery_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/mutation-record-nullity_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observe-characterdata_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observe-exceptions_t01: RuntimeError
-LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError
-LayoutTests/fast/dom/NodeList/nodelist-reachable_t01: RuntimeError
-LayoutTests/fast/dom/Range-insertNode-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/13000_t01: RuntimeError
-LayoutTests/fast/dom/Range/create-contextual-fragment-script-not-ran_t01: RuntimeError
-LayoutTests/fast/dom/Range/create-contextual-fragment_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-clone-empty_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-delete-contents-mutation-event-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-extract-contents-event-fire-crash2_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-extract-contents_t01: RuntimeError
-LayoutTests/fast/dom/Range/remove-all-children-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/remove-twice-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/select-node-different-document_t01: RuntimeError
-LayoutTests/fast/dom/Range/split-text-in-range_t01: RuntimeError
-LayoutTests/fast/dom/Range/surroundContents-1_t01: RuntimeError
-LayoutTests/fast/dom/Range/surroundContents-check-boundary-points_t01: RuntimeError
-LayoutTests/fast/dom/Selection/collapseToX-empty-selection_t01: RuntimeError
-LayoutTests/fast/dom/Selection/getRangeAt_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/caseID-almost-strict_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/caseID-strict_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/duplicate-id-scope_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/elementRoot_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/id-fastpath-almost-strict_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/id-fastpath_t01: RuntimeError
-LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError
-LayoutTests/fast/dom/Text/normalize-crash-in-spell-checker_t01: RuntimeError
-LayoutTests/fast/dom/Text/remove_t01: RuntimeError
-LayoutTests/fast/dom/Text/replaceWholeText_t01: RuntimeError
-LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError
-LayoutTests/fast/dom/Window/console-functions_t01: RuntimeError
-LayoutTests/fast/dom/Window/dispatchEvent_t01: RuntimeError
-LayoutTests/fast/dom/Window/querySelectorAll-with-pseudo-elements_t01: RuntimeError
-LayoutTests/fast/dom/Window/window-remove-event-listener_t01: RuntimeError
-LayoutTests/fast/dom/Window/window-screen-properties_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer-attribute-namespaces_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer-doctype2_t01: RuntimeError
-LayoutTests/fast/dom/anchor-text_t01: RuntimeError
-LayoutTests/fast/dom/clone-node-default-argument_t01: RuntimeError
-LayoutTests/fast/dom/clone-node-form-elements_t01: RuntimeError
-LayoutTests/fast/dom/clone-node-style_t01: RuntimeError
-LayoutTests/fast/dom/clone-node-z-index_t01: RuntimeError
-LayoutTests/fast/dom/cloneNode_t01: RuntimeError
-LayoutTests/fast/dom/comment-dom-node_t01: RuntimeError
-LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError
-LayoutTests/fast/dom/createDocumentType-ownerDocument_t01: RuntimeError
-LayoutTests/fast/dom/createDocumentType_t01: RuntimeError
-LayoutTests/fast/dom/createElement-with-column_t01: RuntimeError
-LayoutTests/fast/dom/createElement-with-column_xml_t01: RuntimeError
-LayoutTests/fast/dom/createElementNS-namespace-errors_t01: RuntimeError
-LayoutTests/fast/dom/css-inline-style-declaration-crash_t01: RuntimeError
-LayoutTests/fast/dom/css-mediarule-deleteRule-update_t01: RuntimeError
-LayoutTests/fast/dom/custom/html-element-type-extension-assert_t01: RuntimeError
-LayoutTests/fast/dom/custom/type-extension-undo-assert_t01: RuntimeError
-LayoutTests/fast/dom/delete-contents_t01: RuntimeError
-LayoutTests/fast/dom/destroy-selected-radio-button-crash_t01: RuntimeError
-LayoutTests/fast/dom/document-set-title-no-child-on-empty_t01: RuntimeError
-LayoutTests/fast/dom/dom-method-document-change_t01: RuntimeError
-LayoutTests/fast/dom/duplicate-ids-document-order_t01: RuntimeError
-LayoutTests/fast/dom/elementFromPoint-scaled-scrolled_t01: RuntimeError
-LayoutTests/fast/dom/getElementById-consistency3_t01: RuntimeError
-LayoutTests/fast/dom/getElementById-consistency5_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/002_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/005_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/008_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/013_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/015_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: RuntimeError
-LayoutTests/fast/dom/getelementsbyname-invalidation-cache_t01: RuntimeError
-LayoutTests/fast/dom/htmlcollection-namedItem_t01: RuntimeError
-LayoutTests/fast/dom/icon-size-property_t01: RuntimeError
-LayoutTests/fast/dom/icon-url-change_t01: RuntimeError
-LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError
-LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError
-LayoutTests/fast/dom/import-document-fragment_t01: RuntimeError
-LayoutTests/fast/dom/importNodeXML_t01: RuntimeError
-LayoutTests/fast/dom/insert-span-into-long-text-bug-28245_t01: RuntimeError
-LayoutTests/fast/dom/left-overflow-in-ltr_t01: RuntimeError
-LayoutTests/fast/dom/move-style-element-to-inactive-document-crash_t01: RuntimeError
-LayoutTests/fast/dom/mutation-event-remove-inserted-node_t01: RuntimeError
-LayoutTests/fast/dom/no-elements_t01: RuntimeError
-LayoutTests/fast/dom/noscript-canvas-in-created-html-document_t01: RuntimeError
-LayoutTests/fast/dom/noscript-style_t01: RuntimeError
-LayoutTests/fast/dom/object-plugin-hides-properties_t01: RuntimeError
-LayoutTests/fast/dom/offset-parent-positioned-and-inline_t01: RuntimeError
-LayoutTests/fast/dom/onerror-img_t01: RuntimeError
-LayoutTests/fast/dom/partial-layout-block_t01: RuntimeError
-LayoutTests/fast/dom/remove-children-notification-order_t01: RuntimeError
-LayoutTests/fast/dom/remove-named-attribute-crash_t01: RuntimeError
-LayoutTests/fast/dom/replace-first-child_t01: RuntimeError
-LayoutTests/fast/dom/setAttribute-using-initial-input-value_t01: RuntimeError
-LayoutTests/fast/dom/setAttributeNS-namespace-errors_t01: RuntimeError
-LayoutTests/fast/dom/setter-type-enforcement_t01: RuntimeError
-LayoutTests/fast/dom/shadow/event-path_t01: RuntimeError
-LayoutTests/fast/dom/shadow/ol-with-distribution-recalc-crash_t01: RuntimeError
-LayoutTests/fast/dom/shared-inline-style-after-node-removal_t01: RuntimeError
-LayoutTests/fast/dom/stripNullFromTextNodes_t01: RuntimeError
-LayoutTests/fast/dom/text-control-crash-on-select_t01: RuntimeError
-LayoutTests/fast/dom/title-content-set-innerText-get_t01: RuntimeError
-LayoutTests/fast/dom/xhtml-fragment-parsing-exceptions_t01: RuntimeError
-LayoutTests/fast/dom/xmlserializer-serialize-to-string-exception_t01: RuntimeError
-LayoutTests/fast/dynamic/5872671_t01: RuntimeError
-LayoutTests/fast/dynamic/float-remove-above-line-2_t01: RuntimeError
-LayoutTests/fast/dynamic/insertAdjacentHTML-allowed-parents_t01: RuntimeError
-LayoutTests/fast/dynamic/insertAdjacentHTML_t01: RuntimeError
-LayoutTests/fast/dynamic/insertAdjacentText_t01: RuntimeError
-LayoutTests/fast/dynamic/position-absolute-to-fixed-crash_t01: RuntimeError
-LayoutTests/fast/events/dispatch-event-no-document_t01: RuntimeError
-LayoutTests/fast/events/dispatch-synthetic-mouseevent_t01: RuntimeError
-LayoutTests/fast/events/domnodeinsertedintodocument-dispatched-post-rendering_t01: RuntimeError
-LayoutTests/fast/events/event-listener-sharing_t01: RuntimeError
-LayoutTests/fast/events/event-on-created-document_t01: RuntimeError
-LayoutTests/fast/events/focus-remove-focuesed-node_t01: RuntimeError
-LayoutTests/fast/events/init-event-null-view_t01: RuntimeError
-LayoutTests/fast/events/initkeyboardevent-crash_t01: RuntimeError
-LayoutTests/fast/events/keyboardevent-mousedown-crash_t01: RuntimeError
-LayoutTests/fast/events/onerror-img-after-gc_t01: RuntimeError
-LayoutTests/fast/events/page-visibility-null-view_t01: RuntimeError
-LayoutTests/fast/events/programmatic-check-no-change-event_t01: RuntimeError
-LayoutTests/fast/events/scroll-event-phase_t01: RuntimeError
-LayoutTests/fast/events/stop-immediate-propagation_t01: RuntimeError
-LayoutTests/fast/events/stopPropagation-checkbox_t01: RuntimeError
-LayoutTests/fast/events/submit-reset-nested-bubble_t01: RuntimeError
-LayoutTests/fast/files/file-reader-immediate-abort_t01: RuntimeError
-LayoutTests/fast/files/file-reader-methods-illegal-arguments_t01: RuntimeError
-LayoutTests/fast/files/not-enough-arguments_t01: RuntimeError
-LayoutTests/fast/files/revoke-blob-url_t01: RuntimeError
-LayoutTests/fast/flexbox/child-flexing_t01: RuntimeError
-LayoutTests/fast/flexbox/crash-anonymous-box_t01: RuntimeError
-LayoutTests/fast/flexbox/crash-button-keygen_t01: RuntimeError
-LayoutTests/fast/flexbox/crash-button-relayout_t01: RuntimeError
-LayoutTests/fast/flexbox/crash-flexbox-no-layout-child_t01: RuntimeError
-LayoutTests/fast/flexbox/layoutHorizontalBox-crash_t01: RuntimeError
-LayoutTests/fast/flexbox/line-clamp-crash_t01: RuntimeError
-LayoutTests/fast/flexbox/overhanging-floats-not-removed-crash_t01: RuntimeError
-LayoutTests/fast/forms/HTMLOptionElement_selected_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-patternMismatch-unsupported_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-removed-control_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-stepMismatch_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-005_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-009_t01: RuntimeError
-LayoutTests/fast/forms/activate-and-disabled-elements_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-attribute_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-opera-008_t01: RuntimeError
-LayoutTests/fast/forms/checkValidity-001_t01: RuntimeError
-LayoutTests/fast/forms/checkValidity-002_t01: RuntimeError
-LayoutTests/fast/forms/checkValidity-004_t01: RuntimeError
-LayoutTests/fast/forms/checkValidity-cancel_t01: RuntimeError
-LayoutTests/fast/forms/checkbox-click-indeterminate_t01: RuntimeError
-LayoutTests/fast/forms/checkbox-onchange_t01: RuntimeError
-LayoutTests/fast/forms/datalist/datalist-nonoption-child_t01: RuntimeError
-LayoutTests/fast/forms/datalist/slider-appearance-with-ticks-crash_t01: RuntimeError
-LayoutTests/fast/forms/date/date-click-on-label_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-interactive-validation-required_t01: RuntimeError
-LayoutTests/fast/forms/disabled-attr-checkvalidity_t01: RuntimeError
-LayoutTests/fast/forms/enctype-attribute_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/fieldset-crash_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/focus-in-fieldset-disabled_t01: RuntimeError
-LayoutTests/fast/forms/file/file-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/formmethod-attribute-button-html_t01: RuntimeError
-LayoutTests/fast/forms/formmethod-attribute-input-2_t01: RuntimeError
-LayoutTests/fast/forms/formmethod-attribute-input-html_t01: RuntimeError
-LayoutTests/fast/forms/formnovalidate-attribute_t01: RuntimeError
-LayoutTests/fast/forms/hidden-input-enabled_t01: RuntimeError
-LayoutTests/fast/forms/hidden/change-type-to-hidden-after-updating-value_t01: RuntimeError
-LayoutTests/fast/forms/hidden/hidden-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/image/image-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/input-minmax_t01: RuntimeError
-LayoutTests/fast/forms/input-pattern_t01: RuntimeError
-LayoutTests/fast/forms/input-selection-hidden_t01: RuntimeError
-LayoutTests/fast/forms/input-setvalue-selection_t01: RuntimeError
-LayoutTests/fast/forms/input-stepup-stepdown_t01: RuntimeError
-LayoutTests/fast/forms/input-text-maxlength_t01: RuntimeError
-LayoutTests/fast/forms/input-type-change3_t01: RuntimeError
-LayoutTests/fast/forms/input-valueasnumber-unsupported_t01: RuntimeError
-LayoutTests/fast/forms/input-width-height-attributes-without-renderer_t01: RuntimeError
-LayoutTests/fast/forms/input-zero-height-focus_t01: RuntimeError
-LayoutTests/fast/forms/interactive-validation-assertion-by-validate-twice_t01: RuntimeError
-LayoutTests/fast/forms/interactive-validation-attach-assertion_t01: RuntimeError
-LayoutTests/fast/forms/large-parts_t01: RuntimeError
-LayoutTests/fast/forms/legend-display-none_t01: RuntimeError
-LayoutTests/fast/forms/menulist-no-renderer-onmousedown_t01: RuntimeError
-LayoutTests/fast/forms/missing-action_t01: RuntimeError
-LayoutTests/fast/forms/novalidate-attribute_t01: RuntimeError
-LayoutTests/fast/forms/option-index_t01: RuntimeError
-LayoutTests/fast/forms/pattern-attribute-001_t01: RuntimeError
-LayoutTests/fast/forms/pattern-attribute-003_t01: RuntimeError
-LayoutTests/fast/forms/required-attribute-001_t01: RuntimeError
-LayoutTests/fast/forms/select-change-listbox-to-popup-roundtrip_t01: RuntimeError
-LayoutTests/fast/forms/select-reset-multiple-selections-4-single-selection_t01: RuntimeError
-LayoutTests/fast/forms/select-reset_t01: RuntimeError
-LayoutTests/fast/forms/select-set-length-with-mutation-reorder_t01: RuntimeError
-LayoutTests/fast/forms/select-set-length-with-mutation-reparent_t01: RuntimeError
-LayoutTests/fast/forms/select-set-length-with-mutation_t01: RuntimeError
-LayoutTests/fast/forms/select-set-length_t01: RuntimeError
-LayoutTests/fast/forms/select-width-font-change_t01: RuntimeError
-LayoutTests/fast/forms/selected-index-assert_t01: RuntimeError
-LayoutTests/fast/forms/setCustomValidity_t01: RuntimeError
-LayoutTests/fast/forms/text-control-select-blurred_t01: RuntimeError
-LayoutTests/fast/forms/textarea-and-mutation-events-appending-text_t01: RuntimeError
-LayoutTests/fast/forms/textarea-default-value-leading-newline_t01: RuntimeError
-LayoutTests/fast/forms/textarea-initial-caret-position_t01: RuntimeError
-LayoutTests/fast/forms/textarea-newline_t01: RuntimeError
-LayoutTests/fast/forms/textarea-scrollbar-height_t01: RuntimeError
-LayoutTests/fast/forms/textarea-setvalue-without-renderer_t01: RuntimeError
-LayoutTests/fast/forms/textarea-wrap-attribute_t01: RuntimeError
-LayoutTests/fast/forms/update-from-element-during-editing-crash-1_t01: RuntimeError
-LayoutTests/fast/forms/update-from-element-during-editing-crash-2_t01: RuntimeError
-LayoutTests/fast/html/clone-range_t01: RuntimeError
-LayoutTests/fast/html/hidden-attr-dom_t01: RuntimeError
-LayoutTests/fast/html/input-type-change-crash_t01: RuntimeError
-LayoutTests/fast/html/numbered-header-element_t01: RuntimeError
-LayoutTests/fast/html/range-point-in-range-for-different-documents_t01: RuntimeError
-LayoutTests/fast/html/tabindex-removal_t01: RuntimeError
-LayoutTests/fast/html/text-field-input-types_t01: RuntimeError
-LayoutTests/fast/html/unknown-tag_t01: RuntimeError
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-parent-relative-ancestor_t01: RuntimeError
-LayoutTests/fast/inline/skipped-whitespace-client-rect_t01: RuntimeError
-LayoutTests/fast/innerHTML/005_t01: RuntimeError
-LayoutTests/fast/innerHTML/additional-inline-style_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-iframe_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-nbsp_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-special-elements_t01: RuntimeError
-LayoutTests/fast/loader/hashchange-event-properties_t01: RuntimeError
-LayoutTests/fast/loader/loadInProgress_t01: RuntimeError
-LayoutTests/fast/loader/onload-policy-ignore-for-frame_t01: RuntimeError
-LayoutTests/fast/loader/stateobjects/pushstate-updates-location_t01: RuntimeError
-LayoutTests/fast/loader/stateobjects/replacestate-updates-location_t01: RuntimeError
-LayoutTests/fast/media/color-does-not-include-alpha_t01: RuntimeError
-LayoutTests/fast/media/mq-color-index_t01: RuntimeError
-LayoutTests/fast/media/mq-js-media-except_t01: RuntimeError
-LayoutTests/fast/media/mq-js-media-except_t02: RuntimeError
-LayoutTests/fast/media/mq-parsing_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t02: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t07: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t09: RuntimeError
-LayoutTests/fast/multicol/vertical-rl/image-inside-nested-blocks-with-border_t01: RuntimeError
-LayoutTests/fast/multicol/widows-and-orphans_t01: RuntimeError
-LayoutTests/fast/multicol/widows_t02: RuntimeError
-LayoutTests/fast/parser/foster-parent-adopted_t01: RuntimeError
-LayoutTests/fast/parser/pop-all-after-after-body_t01: RuntimeError
-LayoutTests/fast/parser/pre-first-line-break_t01: RuntimeError
-LayoutTests/fast/parser/stray-end-tags-with-attributes-002-alt_t01: RuntimeError
-LayoutTests/fast/replaced/table-replaced-element_t01: RuntimeError
-LayoutTests/fast/ruby/modify-positioned-ruby-text-crash_t01: RuntimeError
-LayoutTests/fast/scrolling/scroll-max-value_t01: RuntimeError
-LayoutTests/fast/selectors/style-sharing-adjacent-selector_t01: RuntimeError
-LayoutTests/fast/sub-pixel/float-containing-block-with-margin_t01: RuntimeError
-LayoutTests/fast/sub-pixel/float-list-inside_t01: RuntimeError
-LayoutTests/fast/sub-pixel/float-with-margin-in-container_t01: RuntimeError
-LayoutTests/fast/sub-pixel/float-with-right-margin-zoom_t01: RuntimeError
-LayoutTests/fast/sub-pixel/layout-boxes-with-zoom_t01: RuntimeError
-LayoutTests/fast/sub-pixel/replaced-element-baseline_t01: RuntimeError
-LayoutTests/fast/sub-pixel/size-of-span-with-different-positions_t01: RuntimeError
-LayoutTests/fast/sub-pixel/table-cells-with-padding-do-not-wrap_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-length-invalid_t01: RuntimeError
-LayoutTests/fast/table/auto-table-layout-colgroup-removal-crash_t01: RuntimeError
-LayoutTests/fast/table/col-width-span-expand_t01: RuntimeError
-LayoutTests/fast/table/fixed-table-with-percent-width-inside-extra-large-div_t01: RuntimeError
-LayoutTests/fast/table/resize-table-binding-cell_t01: RuntimeError
-LayoutTests/fast/table/table-sections-border-spacing_t01: RuntimeError
-LayoutTests/fast/text-autosizing/display-type-change-lineHeight_t01: RuntimeError
-LayoutTests/fast/text-autosizing/inline-width_t01: RuntimeError
-LayoutTests/fast/text/find-backwards_t01: RuntimeError
-LayoutTests/fast/text/find-quotes_t01: RuntimeError
-LayoutTests/fast/text/font-fallback-synthetic-italics_t01: RuntimeError
-LayoutTests/fast/text/font-linux-normalize_t01: RuntimeError
-LayoutTests/fast/text/international/complex-text-rectangle_t01: RuntimeError
-LayoutTests/fast/text/international/rtl-text-wrapping_t01: RuntimeError
-LayoutTests/fast/text/ipa-tone-letters_t01: RuntimeError
-LayoutTests/fast/text/justification-padding-mid-word_t01: RuntimeError
-LayoutTests/fast/text/line-breaks-after-ideographic-comma-or-full-stop_t01: RuntimeError
-LayoutTests/fast/text/line-breaks-after-ideographic-comma-or-full-stop_t02: RuntimeError
-LayoutTests/fast/text/regional-indicator-symobls_t01: RuntimeError
-LayoutTests/fast/text/split-text-crash_t01: RuntimeError
-LayoutTests/fast/text/text-between-two-brs-in-nowrap-overflow_t01: RuntimeError
-LayoutTests/fast/text/whitespace/nowrap-line-break-after-white-space_t01: RuntimeError
-LayoutTests/fast/tokenizer/entities_t01: RuntimeError
-LayoutTests/fast/transforms/scrollIntoView-transformed_t01: RuntimeError
-LayoutTests/fast/url/scheme_t01: RuntimeError
-LayoutTests/fast/writing-mode/broken-ideographic-font_t01: RuntimeError
-LayoutTests/fast/writing-mode/percentage-margins-absolute-replaced_t01: RuntimeError
-LayoutTests/fast/writing-mode/percentage-margins-absolute_t01: RuntimeError
-LayoutTests/fast/writing-mode/relative-positioning-percentages_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/null-document-xmlhttprequest-open_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-bad-mimetype_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-default-attributes_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-get_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-html-no-responsetype_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-set-at-headers-received_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/kd_20010423_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/rs_20010831_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/sr_20021217_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_boolean_expr_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_location_path_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_predicate_list_t01: RuntimeError
-LayoutTests/fast/xpath/ancestor-axis_t01: RuntimeError
-LayoutTests/fast/xpath/detached-subtree-invalidate-iterator_t01: RuntimeError
-LayoutTests/fast/xpath/evaluator-exceptions_t01: RuntimeError
-LayoutTests/fast/xpath/name-null-namespace_t01: RuntimeError
-LayoutTests/fast/xpath/nodeset-duplicates_t01: RuntimeError
-LayoutTests/fast/xpath/substring-after_t01: RuntimeError
-LayoutTests/fast/xpath/substring-non-positive-postion_t01: RuntimeError
-LayoutTests/fast/xpath/xpath-empty-string_t01: RuntimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t01: RuntimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t02: RuntimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t04: RuntimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t05: RuntimeError
-LibTest/html/CanvasRenderingContext2D/arc_A01_t01: RuntimeError
-LibTest/html/Document/addEventListener_A01_t01: RuntimeError
-LibTest/html/Document/adoptNode_A01_t01: RuntimeError
-LibTest/html/Document/append_A01_t01: RuntimeError
-LibTest/html/Document/append_A02_t01: RuntimeError
-LibTest/html/Document/append_A02_t02: RuntimeError
-LibTest/html/Document/childNodes_A01_t01: RuntimeError
-LibTest/html/Document/contains_A01_t02: RuntimeError
-LibTest/html/Document/createDocumentFragment_A01_t01: RuntimeError
-LibTest/html/Document/createElement_A01_t01: RuntimeError
-LibTest/html/Document/dispatchEvent_A01_t01: RuntimeError
-LibTest/html/Document/documentElement_A01_t01: RuntimeError
-LibTest/html/Document/firstChild_A01_t01: RuntimeError
-LibTest/html/Document/getElementById_A01_t01: RuntimeError
-LibTest/html/Document/getElementsByClassName_A01_t01: RuntimeError
-LibTest/html/Document/getElementsByName_A01_t01: RuntimeError
-LibTest/html/Document/getElementsByTagName_A01_t01: RuntimeError
-LibTest/html/Document/hasChildNodes_A01_t01: RuntimeError
-LibTest/html/Document/importNode_A01_t01: RuntimeError
-LibTest/html/Document/insertAllBefore_A01_t01: RuntimeError
-LibTest/html/Document/insertAllBefore_A02_t01: RuntimeError
-LibTest/html/Document/insertBefore_A01_t01: RuntimeError
-LibTest/html/Document/insertBefore_A02_t01: RuntimeError
-LibTest/html/Document/lastChild_A01_t01: RuntimeError
-LibTest/html/Document/nodeName_A01_t01: RuntimeError
-LibTest/html/Document/nodeType_A01_t01: RuntimeError
-LibTest/html/Document/nodes_A01_t01: RuntimeError
-LibTest/html/Document/on_A01_t01: RuntimeError
-LibTest/html/Document/on_A01_t02: RuntimeError
-LibTest/html/Document/querySelectorAll_A01_t01: RuntimeError
-LibTest/html/Document/querySelector_A01_t01: RuntimeError
-LibTest/html/Document/readyState_A01_t01: RuntimeError
-LibTest/html/Document/removeEventListener_A01_t01: RuntimeError
-LibTest/html/Document/window_A01_t01: RuntimeError
-LibTest/html/Element/Element.html_A01_t01: RuntimeError
-LibTest/html/Element/Element.html_A02_t01: RuntimeError
-LibTest/html/Element/Element.html_A03_t01: RuntimeError
-LibTest/html/Element/Element.html_A04_t01: RuntimeError
-LibTest/html/Element/Element.html_A04_t02: RuntimeError
-LibTest/html/Element/Element.tag_A01_t02: RuntimeError
-LibTest/html/Element/Element_element_ctors_A01_t01: RuntimeError
-LibTest/html/Element/abortEvent_A01_t01: RuntimeError
-LibTest/html/Element/addEventListener_A01_t01: RuntimeError
-LibTest/html/Element/addEventListener_A01_t02: RuntimeError
-LibTest/html/Element/addEventListener_A01_t04: RuntimeError
-LibTest/html/Element/addEventListener_A01_t05: RuntimeError
-LibTest/html/Element/addEventListener_A01_t06: RuntimeError
-LibTest/html/Element/appendHtml_A01_t01: RuntimeError
-LibTest/html/Element/appendText_A01_t01: RuntimeError
-LibTest/html/Element/append_A01_t01: RuntimeError
-LibTest/html/Element/append_A02_t01: RuntimeError
-LibTest/html/Element/append_A02_t02: RuntimeError
-LibTest/html/Element/attributes_A01_t01: RuntimeError
-LibTest/html/Element/attributes_A02_t01: RuntimeError
-LibTest/html/Element/beforeCopyEvent_A01_t01: RuntimeError
-LibTest/html/Element/beforeCutEvent_A01_t01: RuntimeError
-LibTest/html/Element/beforePasteEvent_A01_t01: RuntimeError
-LibTest/html/Element/blurEvent_A01_t01: RuntimeError
-LibTest/html/Element/changeEvent_A01_t01: RuntimeError
-LibTest/html/Element/childNodes_A01_t01: RuntimeError
-LibTest/html/Element/childNodes_A01_t02: RuntimeError
-LibTest/html/Element/children_A01_t01: RuntimeError
-LibTest/html/Element/children_A01_t02: RuntimeError
-LibTest/html/Element/className_A01_t01: RuntimeError
-LibTest/html/Element/classes_A01_t01: RuntimeError
-LibTest/html/Element/click_A01_t01: RuntimeError
-LibTest/html/Element/clone_A01_t01: RuntimeError
-LibTest/html/Element/clone_A01_t02: RuntimeError
-LibTest/html/Element/clone_A02_t01: RuntimeError
-LibTest/html/Element/clone_A03_t01: RuntimeError
-LibTest/html/Element/contains_A01_t01: RuntimeError
-LibTest/html/Element/contains_A01_t02: RuntimeError
-LibTest/html/Element/contains_A01_t03: RuntimeError
-LibTest/html/Element/contentEditable_A01_t01: RuntimeError
-LibTest/html/Element/contentEditable_A01_t02: RuntimeError
-LibTest/html/Element/createFragment_A01_t01: RuntimeError
-LibTest/html/Element/createFragment_A01_t02: RuntimeError
-LibTest/html/Element/createFragment_A01_t03: RuntimeError
-LibTest/html/Element/dataset_A01_t01: RuntimeError
-LibTest/html/Element/dataset_A01_t02: RuntimeError
-LibTest/html/Element/dir_A01_t01: RuntimeError
-LibTest/html/Element/dir_A01_t02: RuntimeError
-LibTest/html/Element/documentOffset_A01_t01: RuntimeError
-LibTest/html/Element/doubleClickEvent_A01_t01: RuntimeError
-LibTest/html/Element/draggable_A01_t01: RuntimeError
-LibTest/html/Element/draggable_A01_t02: RuntimeError
-LibTest/html/Element/errorEvent_A01_t01: RuntimeError
-LibTest/html/Element/firstChild_A01_t01: RuntimeError
-LibTest/html/Element/focusEvent_A01_t01: RuntimeError
-LibTest/html/Element/fullscreenChangeEvent_A01_t01: RuntimeError
-LibTest/html/Element/fullscreenErrorEvent_A01_t01: RuntimeError
-LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError
-LibTest/html/Element/getAttribute_A01_t01: RuntimeError
-LibTest/html/Element/getBoundingClientRect_A01_t01: RuntimeError
-LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError
-LibTest/html/Element/getClientRects_A01_t01: RuntimeError
-LibTest/html/Element/getElementsByClassName_A01_t01: RuntimeError
-LibTest/html/Element/getElementsByClassName_A02_t01: RuntimeError
-LibTest/html/Element/hasChildNodes_A01_t01: RuntimeError
-LibTest/html/Element/hidden_A01_t01: RuntimeError
-LibTest/html/Element/id_A01_t01: RuntimeError
-LibTest/html/Element/innerHtml_A01_t01: RuntimeError
-LibTest/html/Element/innerHtml_A02_t01: RuntimeError
-LibTest/html/Element/inputEvent_A01_t01: RuntimeError
-LibTest/html/Element/insertAdjacentElement_A01_t01: RuntimeError
-LibTest/html/Element/insertAdjacentHtml_A01_t01: RuntimeError
-LibTest/html/Element/insertAdjacentText_A01_t01: RuntimeError
-LibTest/html/Element/insertAllBefore_A01_t01: RuntimeError
-LibTest/html/Element/insertAllBefore_A02_t01: RuntimeError
-LibTest/html/Element/insertBefore_A01_t01: RuntimeError
-LibTest/html/Element/insertBefore_A02_t01: RuntimeError
-LibTest/html/Element/invalidEvent_A01_t01: RuntimeError
-LibTest/html/Element/isContentEditable_A01_t01: RuntimeError
-LibTest/html/Element/isTagSupported_A01_t02: RuntimeError
-LibTest/html/Element/isTagSupported_A01_t03: RuntimeError
-LibTest/html/Element/keyDownEvent_A01_t01: RuntimeError
-LibTest/html/Element/keyPressEvent_A01_t01: RuntimeError
-LibTest/html/Element/keyUpEvent_A01_t01: RuntimeError
-LibTest/html/Element/lang_A01_t01: RuntimeError
-LibTest/html/Element/lang_A01_t02: RuntimeError
-LibTest/html/Element/lastChild_A01_t01: RuntimeError
-LibTest/html/Element/matchesWithAncestors_A01_t01: RuntimeError
-LibTest/html/Element/matches_A01_t01: RuntimeError
-LibTest/html/Element/mouseDownEvent_A01_t01: RuntimeError
-LibTest/html/Element/mouseEnterEvent_A01_t01: RuntimeError
-LibTest/html/Element/mouseLeaveEvent_A01_t01: RuntimeError
-LibTest/html/Element/mouseMoveEvent_A01_t01: RuntimeError
-LibTest/html/Element/mouseOutEvent_A01_t01: RuntimeError
-LibTest/html/Element/mouseOverEvent_A01_t01: RuntimeError
-LibTest/html/Element/mouseUpEvent_A01_t01: RuntimeError
-LibTest/html/Element/namespaceUri_A01_t01: RuntimeError
-LibTest/html/Element/nextElementSibling_A01_t01: RuntimeError
-LibTest/html/Element/nextNode_A01_t01: RuntimeError
-LibTest/html/Element/nodeName_A03_t01: RuntimeError
-LibTest/html/Element/nodeName_A04_t01: RuntimeError
-LibTest/html/Element/nodeName_A05_t01: RuntimeError
-LibTest/html/Element/nodeName_A06_t01: RuntimeError
-LibTest/html/Element/nodeName_A07_t01: RuntimeError
-LibTest/html/Element/nodeName_A12_t01: RuntimeError
-LibTest/html/Element/nodes_A01_t01: RuntimeError
-LibTest/html/Element/nodes_A01_t02: RuntimeError
-LibTest/html/Element/offsetHeight_A01_t01: RuntimeError
-LibTest/html/Element/offsetLeft_A01_t01: RuntimeError
-LibTest/html/Element/offsetParent_A01_t01: RuntimeError
-LibTest/html/Element/offsetTo_A01_t01: RuntimeError
-LibTest/html/Element/offsetTo_A01_t02: RuntimeError
-LibTest/html/Element/offsetTop_A01_t01: RuntimeError
-LibTest/html/Element/offsetWidth_A01_t01: RuntimeError
-LibTest/html/Element/offset_A01_t01: RuntimeError
-LibTest/html/Element/onAbort_A01_t01: RuntimeError
-LibTest/html/Element/onBeforeCopy_A01_t01: RuntimeError
-LibTest/html/Element/onBeforeCut_A01_t01: RuntimeError
-LibTest/html/Element/onBeforePaste_A01_t01: RuntimeError
-LibTest/html/Element/onBlur_A01_t01: RuntimeError
-LibTest/html/Element/onChange_A01_t01: RuntimeError
-LibTest/html/Element/onDoubleClick_A01_t01: RuntimeError
-LibTest/html/Element/onError_A01_t01: RuntimeError
-LibTest/html/Element/onFocus_A01_t01: RuntimeError
-LibTest/html/Element/onFullscreenChange_A01_t01: RuntimeError
-LibTest/html/Element/onFullscreenError_A01_t01: RuntimeError
-LibTest/html/Element/onInput_A01_t01: RuntimeError
-LibTest/html/Element/onInvalid_A01_t01: RuntimeError
-LibTest/html/Element/onReset_A01_t01: RuntimeError
-LibTest/html/Element/onScroll_A01_t01: RuntimeError
-LibTest/html/Element/onSearch_A01_t01: RuntimeError
-LibTest/html/Element/onSelectStart_A01_t01: RuntimeError
-LibTest/html/Element/onSelect_A01_t01: RuntimeError
-LibTest/html/Element/onSubmit_A01_t01: RuntimeError
-LibTest/html/Element/on_A01_t01: RuntimeError
-LibTest/html/Element/outerHtml_A01_t01: RuntimeError
-LibTest/html/Element/ownerDocument_A01_t01: RuntimeError
-LibTest/html/Element/ownerDocument_A01_t02: RuntimeError
-LibTest/html/Element/ownerDocument_A01_t03: RuntimeError
-LibTest/html/Element/ownerDocument_A01_t04: RuntimeError
-LibTest/html/Element/ownerDocument_A01_t05: RuntimeError
-LibTest/html/Element/parentNode_A01_t01: RuntimeError
-LibTest/html/Element/parentNode_A01_t02: RuntimeError
-LibTest/html/Element/parentNode_A01_t03: RuntimeError
-LibTest/html/Element/parent_A01_t01: RuntimeError
-LibTest/html/Element/parent_A01_t02: RuntimeError
-LibTest/html/Element/parent_A01_t03: RuntimeError
-LibTest/html/Element/previousElementSibling_A01_t01: RuntimeError
-LibTest/html/Element/querySelectorAll_A01_t01: RuntimeError
-LibTest/html/Element/querySelector_A01_t01: RuntimeError
-LibTest/html/Element/removeEventListener_A01_t01: RuntimeError
-LibTest/html/Element/removeEventListener_A01_t02: RuntimeError
-LibTest/html/Element/remove_A01_t01: RuntimeError
-LibTest/html/Element/resetEvent_A01_t01: RuntimeError
-LibTest/html/Element/scrollEvent_A01_t01: RuntimeError
-LibTest/html/Element/searchEvent_A01_t01: RuntimeError
-LibTest/html/Element/selectEvent_A01_t01: RuntimeError
-LibTest/html/Element/selectStartEvent_A01_t01: RuntimeError
-LibTest/html/Element/setAttributeNS_A01_t01: RuntimeError
-LibTest/html/Element/setAttribute_A01_t01: RuntimeError
-LibTest/html/Element/setInnerHtml_A01_t01: RuntimeError
-LibTest/html/Element/setInnerHtml_A01_t02: RuntimeError
-LibTest/html/Element/setInnerHtml_A01_t03: RuntimeError
-LibTest/html/Element/spellcheck_A01_t01: RuntimeError
-LibTest/html/Element/spellcheck_A01_t02: RuntimeError
-LibTest/html/Element/style_A01_t01: RuntimeError
-LibTest/html/Element/style_A01_t02: RuntimeError
-LibTest/html/Element/submitEvent_A01_t01: RuntimeError
-LibTest/html/Element/tabIndex_A01_t01: RuntimeError
-LibTest/html/Element/tagName_A01_t01: RuntimeError
-LibTest/html/Element/tagName_A01_t02: RuntimeError
-LibTest/html/Element/text_A01_t01: RuntimeError
-LibTest/html/Element/text_A02_t01: RuntimeError
-LibTest/html/Element/text_A03_t01: RuntimeError
-LibTest/html/Element/text_A04_t01: RuntimeError
-LibTest/html/Element/title_A01_t01: RuntimeError
-LibTest/html/Event/Event.eventType_A01_t01: RuntimeError
-LibTest/html/Event/Event_A01_t02: RuntimeError
-LibTest/html/Event/Event_A01_t03: RuntimeError
-LibTest/html/Event/Event_A01_t04: RuntimeError
-LibTest/html/Event/bubbles_A01_t01: RuntimeError
-LibTest/html/Event/cancelable_A01_t01: RuntimeError
-LibTest/html/Event/matchingTarget_A01_t01: RuntimeError
-LibTest/html/Event/matchingTarget_A01_t02: RuntimeError
-LibTest/html/Event/stopImmediatePropagation_A01_t01: RuntimeError
-LibTest/html/Event/stopImmediatePropagation_A01_t02: RuntimeError
-LibTest/html/Event/type_A01_t01: RuntimeError
-LibTest/html/HttpRequest/HttpRequest_A01_t01: RuntimeError
-LibTest/html/HttpRequest/abort_A01_t01: RuntimeError
-LibTest/html/HttpRequest/addEventListener_A01_t01: RuntimeError
-LibTest/html/HttpRequest/dispatchEvent_A01_t01: RuntimeError
-LibTest/html/HttpRequest/onAbort_A01_t01: RuntimeError
-LibTest/html/HttpRequest/onLoadEnd_A01_t01: RuntimeError
-LibTest/html/HttpRequest/onLoadStart_A01_t01: RuntimeError
-LibTest/html/HttpRequest/onLoad_A01_t01: RuntimeError
-LibTest/html/HttpRequest/onReadyStateChange_A01_t01: RuntimeError
-LibTest/html/HttpRequest/open_A01_t01: RuntimeError
-LibTest/html/HttpRequest/removeEventListener_A01_t01: RuntimeError
-LibTest/html/HttpRequest/responseText_A01_t01: RuntimeError
-LibTest/html/HttpRequest/responseType_A01_t02: RuntimeError
-LibTest/html/IFrameElement/addEventListener_A01_t01: RuntimeError
-LibTest/html/IFrameElement/addEventListener_A01_t02: RuntimeError
-LibTest/html/IFrameElement/addEventListener_A01_t04: RuntimeError
-LibTest/html/IFrameElement/addEventListener_A01_t05: RuntimeError
-LibTest/html/IFrameElement/addEventListener_A01_t06: RuntimeError
-LibTest/html/IFrameElement/appendText_A01_t01: RuntimeError
-LibTest/html/IFrameElement/append_A01_t01: RuntimeError
-LibTest/html/IFrameElement/append_A02_t01: RuntimeError
-LibTest/html/IFrameElement/append_A02_t02: RuntimeError
-LibTest/html/IFrameElement/attributes_A01_t01: RuntimeError
-LibTest/html/IFrameElement/attributes_A02_t01: RuntimeError
-LibTest/html/IFrameElement/childNodes_A01_t01: RuntimeError
-LibTest/html/IFrameElement/childNodes_A01_t02: RuntimeError
-LibTest/html/IFrameElement/children_A01_t01: RuntimeError
-LibTest/html/IFrameElement/children_A01_t02: RuntimeError
-LibTest/html/IFrameElement/children_setter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/className_A01_t01: RuntimeError
-LibTest/html/IFrameElement/classes_A01_t01: RuntimeError
-LibTest/html/IFrameElement/classes_setter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/click_A01_t01: RuntimeError
-LibTest/html/IFrameElement/clone_A01_t01: RuntimeError
-LibTest/html/IFrameElement/clone_A02_t01: RuntimeError
-LibTest/html/IFrameElement/clone_A03_t01: RuntimeError
-LibTest/html/IFrameElement/contains_A01_t01: RuntimeError
-LibTest/html/IFrameElement/contains_A01_t02: RuntimeError
-LibTest/html/IFrameElement/contentEdge_A01_t01: RuntimeError
-LibTest/html/IFrameElement/dataset_A01_t01: RuntimeError
-LibTest/html/IFrameElement/dataset_A01_t02: RuntimeError
-LibTest/html/IFrameElement/dataset_setter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/dispatchEvent_A01_t01: RuntimeError
-LibTest/html/IFrameElement/documentOffset_A01_t01: RuntimeError
-LibTest/html/IFrameElement/draggable_A01_t01: RuntimeError
-LibTest/html/IFrameElement/draggable_A01_t02: RuntimeError
-LibTest/html/IFrameElement/firstChild_A01_t01: RuntimeError
-LibTest/html/IFrameElement/getAttributeNS_A01_t01: RuntimeError
-LibTest/html/IFrameElement/getAttribute_A01_t01: RuntimeError
-LibTest/html/IFrameElement/getBoundingClientRect_A01_t01: RuntimeError
-LibTest/html/IFrameElement/getClientRects_A01_t01: RuntimeError
-LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError
-LibTest/html/IFrameElement/getElementsByClassName_A01_t01: RuntimeError
-LibTest/html/IFrameElement/getElementsByClassName_A02_t01: RuntimeError
-LibTest/html/IFrameElement/getNamespacedAttributes_A01_t01: RuntimeError
-LibTest/html/IFrameElement/hasChildNodes_A01_t01: RuntimeError
-LibTest/html/IFrameElement/hasChildNodes_A01_t02: RuntimeError
-LibTest/html/IFrameElement/hidden_A01_t01: RuntimeError
-LibTest/html/IFrameElement/id_A01_t01: RuntimeError
-LibTest/html/IFrameElement/insertAdjacentElement_A01_t01: RuntimeError
-LibTest/html/IFrameElement/insertAdjacentHtml_A01_t01: RuntimeError
-LibTest/html/IFrameElement/insertAdjacentText_A01_t01: RuntimeError
-LibTest/html/IFrameElement/insertAllBefore_A01_t01: RuntimeError
-LibTest/html/IFrameElement/insertAllBefore_A02_t01: RuntimeError
-LibTest/html/IFrameElement/insertBefore_A01_t01: RuntimeError
-LibTest/html/IFrameElement/insertBefore_A02_t01: RuntimeError
-LibTest/html/IFrameElement/lang_A01_t01: RuntimeError
-LibTest/html/IFrameElement/lang_A01_t02: RuntimeError
-LibTest/html/IFrameElement/lastChild_A01_t01: RuntimeError
-LibTest/html/IFrameElement/matchesWithAncestors_A01_t01: RuntimeError
-LibTest/html/IFrameElement/matches_A01_t01: RuntimeError
-LibTest/html/IFrameElement/namespaceUri_A01_t01: RuntimeError
-LibTest/html/IFrameElement/nextElementSibling_A01_t01: RuntimeError
-LibTest/html/IFrameElement/nextNode_A01_t01: RuntimeError
-LibTest/html/IFrameElement/nodeName_A01_t01: RuntimeError
-LibTest/html/IFrameElement/nodeType_A01_t01: RuntimeError
-LibTest/html/IFrameElement/nodeValue_A01_t01: RuntimeError
-LibTest/html/IFrameElement/nodes_A01_t01: RuntimeError
-LibTest/html/IFrameElement/nodes_A01_t02: RuntimeError
-LibTest/html/IFrameElement/nodes_setter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/offsetTo_A01_t02: RuntimeError
-LibTest/html/IFrameElement/onAbort_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onBeforeCopy_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onBeforeCut_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onBeforePaste_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onBlur_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onChange_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onDoubleClick_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onError_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onFocus_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onFullscreenChange_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onFullscreenError_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onInput_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onInvalid_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onLoad_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onReset_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onScroll_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onSearch_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onSelectStart_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onSelect_A01_t01: RuntimeError
-LibTest/html/IFrameElement/onSubmit_A01_t01: RuntimeError
-LibTest/html/IFrameElement/on_A01_t01: RuntimeError
-LibTest/html/IFrameElement/outerHtml_A01_t01: RuntimeError
-LibTest/html/IFrameElement/ownerDocument_A01_t01: RuntimeError
-LibTest/html/IFrameElement/ownerDocument_A01_t02: RuntimeError
-LibTest/html/IFrameElement/ownerDocument_A01_t03: RuntimeError
-LibTest/html/IFrameElement/ownerDocument_A01_t04: RuntimeError
-LibTest/html/IFrameElement/ownerDocument_A01_t05: RuntimeError
-LibTest/html/IFrameElement/parentNode_A01_t01: RuntimeError
-LibTest/html/IFrameElement/parent_A01_t01: RuntimeError
-LibTest/html/IFrameElement/parent_A01_t02: RuntimeError
-LibTest/html/IFrameElement/previousElementSibling_A01_t01: RuntimeError
-LibTest/html/IFrameElement/previousNode_A01_t01: RuntimeError
-LibTest/html/IFrameElement/removeEventListener_A01_t01: RuntimeError
-LibTest/html/IFrameElement/removeEventListener_A01_t02: RuntimeError
-LibTest/html/IFrameElement/remove_A01_t01: RuntimeError
-LibTest/html/IFrameElement/resetEvent_A01_t01: RuntimeError
-LibTest/html/IFrameElement/scrollEvent_A01_t01: RuntimeError
-LibTest/html/IFrameElement/searchEvent_A01_t01: RuntimeError
-LibTest/html/IFrameElement/selectEvent_A01_t01: RuntimeError
-LibTest/html/IFrameElement/selectStartEvent_A01_t01: RuntimeError
-LibTest/html/IFrameElement/setAttributeNS_A01_t01: RuntimeError
-LibTest/html/IFrameElement/setAttribute_A01_t01: RuntimeError
-LibTest/html/IFrameElement/spellcheck_A01_t02: RuntimeError
-LibTest/html/IFrameElement/style_A01_t01: RuntimeError
-LibTest/html/IFrameElement/style_A01_t02: RuntimeError
-LibTest/html/IFrameElement/tabIndex_A01_t01: RuntimeError
-LibTest/html/IFrameElement/tagName_A01_t01: RuntimeError
-LibTest/html/IFrameElement/tagName_A01_t02: RuntimeError
-LibTest/html/IFrameElement/text_A01_t01: RuntimeError
-LibTest/html/IFrameElement/text_A02_t01: RuntimeError
-LibTest/html/IFrameElement/text_A03_t01: RuntimeError
-LibTest/html/IFrameElement/text_A04_t01: RuntimeError
-LibTest/html/IFrameElement/text_setter_A01_t01: RuntimeError
-LibTest/html/IFrameElement/title_A01_t01: RuntimeError
-LibTest/html/Node/addEventListener_A01_t01: RuntimeError
-LibTest/html/Node/addEventListener_A01_t02: RuntimeError
-LibTest/html/Node/addEventListener_A01_t03: RuntimeError
-LibTest/html/Node/addEventListener_A01_t04: RuntimeError
-LibTest/html/Node/addEventListener_A01_t05: RuntimeError
-LibTest/html/Node/append_A01_t01: RuntimeError
-LibTest/html/Node/append_A02_t01: RuntimeError
-LibTest/html/Node/childNodes_A01_t01: RuntimeError
-LibTest/html/Node/childNodes_A01_t02: RuntimeError
-LibTest/html/Node/clone_A01_t01: RuntimeError
-LibTest/html/Node/clone_A01_t02: RuntimeError
-LibTest/html/Node/contains_A01_t01: RuntimeError
-LibTest/html/Node/contains_A01_t02: RuntimeError
-LibTest/html/Node/dispatchEvent_A01_t01: RuntimeError
-LibTest/html/Node/firstChild_A01_t01: RuntimeError
-LibTest/html/Node/hasChildNodes_A01_t01: RuntimeError
-LibTest/html/Node/lastChild_A01_t01: RuntimeError
-LibTest/html/Node/nextNode_A01_t01: RuntimeError
-LibTest/html/Node/nodeType_A03_t01: RuntimeError
-LibTest/html/Node/nodeType_A04_t01: RuntimeError
-LibTest/html/Node/nodeType_A05_t01: RuntimeError
-LibTest/html/Node/nodeType_A06_t01: RuntimeError
-LibTest/html/Node/nodeType_A07_t01: RuntimeError
-LibTest/html/Node/nodeType_A12_t01: RuntimeError
-LibTest/html/Node/nodeValue_A03_t01: RuntimeError
-LibTest/html/Node/nodeValue_A04_t01: RuntimeError
-LibTest/html/Node/nodeValue_A06_t01: RuntimeError
-LibTest/html/Node/nodeValue_A07_t01: RuntimeError
-LibTest/html/Node/nodeValue_A12_t01: RuntimeError
-LibTest/html/Node/nodes_A01_t01: RuntimeError
-LibTest/html/Node/on_A01_t01: RuntimeError
-LibTest/html/Node/parentNode_A01_t01: RuntimeError
-LibTest/html/Node/removeEventListener_A01_t01: RuntimeError
-LibTest/html/Node/removeEventListener_A01_t02: RuntimeError
-LibTest/html/Node/remove_A01_t01: RuntimeError
-LibTest/html/Node/replaceWith_A01_t01: RuntimeError
-LibTest/html/Window/addEventListener_A01_t01: RuntimeError
-LibTest/html/Window/animationFrame_A01_t01: RuntimeError
-LibTest/html/Window/dispatchEvent_A01_t01: RuntimeError
-LibTest/html/Window/find_A01_t02: RuntimeError
-LibTest/html/Window/find_A02_t01: RuntimeError
-LibTest/html/Window/find_A03_t02: RuntimeError
-LibTest/html/Window/find_A05_t01: RuntimeError
-LibTest/html/Window/find_A07_t01: RuntimeError
-LibTest/html/Window/open_A01_t01: RuntimeError
-LibTest/html/Window/removeEventListener_A01_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/DOM.event.flow_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/EventListener.eventHandler_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/Propagation.path.target.moved_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/dispatchEvent.return.value_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/stopImmediatePropagation.effect_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/stopPropagation.dispatchEvent_t01: RuntimeError
-WebPlatformTest/Utils/test/testPass_t01: RuntimeError
-WebPlatformTest/dom/EventTarget/dispatchEvent_A01_t01: RuntimeError
-WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: RuntimeError
-WebPlatformTest/dom/EventTarget/dispatchEvent_A04_t01: RuntimeError
-WebPlatformTest/dom/collections/emptyName_A01_t01: RuntimeError
-WebPlatformTest/dom/collections/emptyName_A01_t06: RuntimeError
-WebPlatformTest/dom/collections/emptyName_A01_t07: RuntimeError
-WebPlatformTest/dom/events/defaultPrevented_A01_t01: RuntimeError
-WebPlatformTest/dom/events/defaultPrevented_A01_t02: RuntimeError
-WebPlatformTest/dom/events/defaultPrevented_A01_t03: RuntimeError
-WebPlatformTest/dom/events/defaultPrevented_A01_t04: RuntimeError
-WebPlatformTest/dom/events/defaultPrevented_A01_t05: RuntimeError
-WebPlatformTest/dom/events/event_constructors/Event_A02_t01: RuntimeError
-WebPlatformTest/dom/lists/DOMTokenList.toString_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/appendData_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/deleteData_A02_t01: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/insertData_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/remove_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/remove_A01_t02: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/remove_A02_t01: RuntimeError
-WebPlatformTest/dom/nodes/Comment-constructor_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-getElementById_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-importNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/Element-childElementCount-dynamic-add_t01: RuntimeError
-WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: RuntimeError
-WebPlatformTest/dom/nodes/Element-childElementCount_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-cloneNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/attributes_A03_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/attributes_A06_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A09_t01: RuntimeError
-WebPlatformTest/dom/ranges/Range-attributes_t01: RuntimeError
-WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError
-WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError
-WebPlatformTest/html-imports/link-import-null_t01: RuntimeError
-WebPlatformTest/html-templates/definitions/template-contents-owner-test-001_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-not-a-foster-parent-element_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-head-token_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/start-tag-body_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/template-end-tag-without-start-one_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/content-attribute_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/template-content-node-document_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-case_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-id_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-param_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t03: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t03: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/classlist-nonstring_t01: RuntimeError
-WebPlatformTest/html/semantics/edits/the-del-element/del_effect_t01: RuntimeError
-WebPlatformTest/html/semantics/edits/the-ins-element/ins_effect_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/textTracks_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/readyState_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/required_attribute_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/search_input_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-backslash_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-output-element/output_t01: RuntimeError
-WebPlatformTest/html/semantics/interactive-elements/the-details-element/toggleEvent_t01: RuntimeError
-WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t01: RuntimeError
-WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t02: RuntimeError
-WebPlatformTest/html/semantics/scripting-1/the-script-element/script-text_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/default_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/disabled_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-caption-element/caption_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/border_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/insertRow-method_t01: RuntimeError
-WebPlatformTest/html/syntax/parsing/math-parse_t01: RuntimeError
-WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError
-WebPlatformTest/webstorage/event_session_storageeventinit_t01: RuntimeError
-WebPlatformTest/webstorage/storage_builtins_t01: RuntimeError
-WebPlatformTest/webstorage/storage_clear_t01: RuntimeError
-WebPlatformTest/webstorage/storage_local_getitem_t01: RuntimeError
-WebPlatformTest/webstorage/storage_local_key_t01: RuntimeError
-WebPlatformTest/webstorage/storage_local_length_t01: RuntimeError
-WebPlatformTest/webstorage/storage_session_getitem_t01: RuntimeError
-WebPlatformTest/webstorage/storage_session_key_t01: RuntimeError
-WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime != chrome && $runtime != ff && !$fast_startup ]
-LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError
-LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError
-LayoutTests/fast/css/invalid-not-with-simple-selector-sequence_t01: RuntimeError
-LayoutTests/fast/css/parsing-object-position_t01: RuntimeError
-LayoutTests/fast/css/shadow-current-color_t01: RuntimeError, Pass
-LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError
-LayoutTests/fast/dom/Attr/direction-attribute-set-and-cleared_t01: RuntimeError
-LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError
-LayoutTests/fast/files/file-reader-readystate_t01: RuntimeError
-LayoutTests/fast/filesystem/input-access-entries_t01: RuntimeError
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError
-LayoutTests/fast/forms/date/date-input-type_t01: RuntimeError
-LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError
-LayoutTests/fast/inline/continuation-inlines-inserted-in-reverse-after-block_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError
-LayoutTests/fast/media/media-query-list_t01: RuntimeError
-LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError
-LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError
-LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError
-LayoutTests/fast/sub-pixel/table-rows-have-stable-height_t01: RuntimeError
-LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError
-LayoutTests/fast/table/switch-table-layout-dynamic-cells_t01: RuntimeError
-LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError
-LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError
-LayoutTests/fast/text/selection-exceptions_t01: RuntimeError
-LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError
-LibTest/html/Element/getClientRects_A01_t02: RuntimeError
-LibTest/html/Element/isContentEditable_A02_t01: RuntimeError, Pass
-LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError
-LibTest/html/Window/close_A01_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime != chrome && $runtime != safari ]
-LayoutTests/fast/animation/request-animation-frame-cancel2_t01: RuntimeError, Timeout
-LayoutTests/fast/backgrounds/mask-box-image-width_t01: RuntimeError
-LayoutTests/fast/borders/border-color-visited_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fill-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-frameless-document-text_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeRect-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeText-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-enum-tests_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/renderer-and-vendor-strings_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-template-areas-get-set_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/height-property-value_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/width-property-value_t01: RuntimeError
-LayoutTests/fast/css/background-parser-crash_t01: RuntimeError
-LayoutTests/fast/css/border-width-large_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-06_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-reset-subtree-insert-crash_t01: RuntimeError
-LayoutTests/fast/css/font-shorthand-mix-inherit_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-properties_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-radius-shorthand_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-column-rule_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-webkit-text-stroke_t01: RuntimeError
-LayoutTests/fast/css/insertRule-font-face_t01: RuntimeError
-LayoutTests/fast/css/invalidation/clears-invalidation-whole-tree_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-any-pseudo_t01: RuntimeError
-LayoutTests/fast/css/legacy-opacity-styles_t01: RuntimeError
-LayoutTests/fast/css/margin-start-end_t01: RuntimeError
-LayoutTests/fast/css/parsing-webkit-font-smoothing_t01: RuntimeError
-LayoutTests/fast/css/pseudo-any_t01: RuntimeError
-LayoutTests/fast/css/pseudo-valid-unapplied_t01: RuntimeError
-LayoutTests/fast/css/readwrite-contenteditable-recalc_t01: RuntimeError
-LayoutTests/fast/css/recalc-optgroup-inherit_t01: RuntimeError
-LayoutTests/fast/css/sibling-selectors_t01: RuntimeError
-LayoutTests/fast/css/style-element-process-crash_t01: RuntimeError
-LayoutTests/fast/css/text-align-webkit-match-parent-parse_t01: RuntimeError
-LayoutTests/fast/css/vertical-align-length-copy-bug_t01: RuntimeError
-LayoutTests/fast/css/webkit-keyframes-crash_t01: RuntimeError
-LayoutTests/fast/dom/Element/fixed-position-offset-parent_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control-child_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-value-change_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-invalid-string_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-true-string_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-value-caseinsensitive_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-hidden-value_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError
-LayoutTests/fast/dom/background-shorthand-csstext_t01: RuntimeError
-LayoutTests/fast/dom/boolean-attribute-reflection_t01: RuntimeError
-LayoutTests/fast/dom/css-rule-functions_t01: RuntimeError
-LayoutTests/fast/dom/css-shortHands_t01: RuntimeError
-LayoutTests/fast/dom/dom-parse-serialize-display_t01: RuntimeError
-LayoutTests/fast/dom/dom-parse-serialize_t01: RuntimeError
-LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError
-LayoutTests/fast/dom/insertBefore-refChild-crash_t01: RuntimeError
-LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError
-LayoutTests/fast/dom/remove-body-during-body-replacement_t01: RuntimeError
-LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError
-LayoutTests/fast/dom/subtree-modified-attributes_t01: RuntimeError
-LayoutTests/fast/dom/vertical-scrollbar-when-dir-change_t01: RuntimeError
-LayoutTests/fast/events/event-fire-order_t01: RuntimeError
-LayoutTests/fast/events/form-onchange_t01: RuntimeError
-LayoutTests/fast/events/selectstart-prevent-selectall_t01: RuntimeError
-LayoutTests/fast/flexbox/box-size-integer-overflow_t01: RuntimeError
-LayoutTests/fast/forms/11423_t01: RuntimeError
-LayoutTests/fast/forms/8250_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-patternMismatch_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-opera-005_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-readonly-attribute_t01: RuntimeError
-LayoutTests/fast/forms/checkValidity-handler-updates-dom_t01: RuntimeError
-LayoutTests/fast/forms/delete-text-with-invisible-br_t01: RuntimeError
-LayoutTests/fast/forms/form-dirname-attribute_t01: RuntimeError
-LayoutTests/fast/forms/input-text-paste-maxlength_t01: RuntimeError
-LayoutTests/fast/forms/input-widths_t01: RuntimeError
-LayoutTests/fast/forms/min-content-form-controls_t01: RuntimeError
-LayoutTests/fast/forms/paste-multiline-text-input_t01: RuntimeError
-LayoutTests/fast/forms/select-change-popup-to-listbox-roundtrip_t01: RuntimeError
-LayoutTests/fast/forms/select-namedItem_t01: RuntimeError
-LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-nonhtml-ancestor_t01: RuntimeError
-LayoutTests/fast/forms/textarea-no-scroll-on-blur_t01: RuntimeError
-LayoutTests/fast/forms/textfield-clone_t01: RuntimeError
-LayoutTests/fast/forms/textfield-focus-out_t01: RuntimeError
-LayoutTests/fast/inline/inline-relative-offset-boundingbox_t01: RuntimeError
-LayoutTests/fast/masking/parsing-clip-path-iri_t01: RuntimeError
-LayoutTests/fast/media/media-query-serialization_t01: RuntimeError
-LayoutTests/fast/multicol/column-width-zero_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-gap-between-pages_t01: RuntimeError
-LayoutTests/fast/multicol/inherit-column-values_t01: RuntimeError
-LayoutTests/fast/multicol/initial-column-values_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t06: RuntimeError
-LayoutTests/fast/multicol/vertical-lr/break-properties_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-lr/gap-non-negative_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-lr/image-inside-nested-blocks-with-border_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-rl/break-properties_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-rl/gap-non-negative_t01: RuntimeError
-LayoutTests/fast/overflow/height-during-simplified-layout_t01: RuntimeError
-LayoutTests/fast/overflow/overflow-rtl-vertical-origin_t01: RuntimeError
-LayoutTests/fast/parser/block-nesting-cap_t01: RuntimeError
-LayoutTests/fast/selectors/specificity-overflow_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-image-threshold_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/parsing/parsing-shape-property-aliases_t01: RuntimeError, Pass
-LayoutTests/fast/table/border-changes_t01: RuntimeError
-LayoutTests/fast/text/line-breaks-after-hyphen-before-number_t01: RuntimeError
-LayoutTests/fast/writing-mode/block-formatting-context_t01: RuntimeError
-LayoutTests/fast/writing-mode/display-mutation_t01: RuntimeError
-LayoutTests/fast/writing-mode/percentage-padding_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-abort_t01: RuntimeError
-LibTest/html/Element/translate_A01_t01: RuntimeError
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: RuntimeError
-LibTest/html/IFrameElement/spellcheck_A01_t01: RuntimeError
-LibTest/html/IFrameElement/translate_A01_t01: RuntimeError
-LibTest/html/Window/find_A04_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A10_t01: RuntimeError
-WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/templates-copy-document-owner_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/template-content_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/range_t02: RuntimeError
-WebPlatformTest/html/syntax/parsing/math-parse_t03: RuntimeError
-
-[ $compiler == dart2js && $runtime != chrome && $system != macos ]
-LayoutTests/fast/canvas/canvas-alphaImageData-behavior_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-fillRect-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokePath-alpha-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-zoom-and-background-size_t01: RuntimeError
-
 [ $compiler == dart2js && $runtime == d8 ]
-Language/Classes/Instance_Methods/Operators/return_type_t01: MissingCompileTimeError
-Language/Classes/Setters/return_type_not_void_t01: MissingCompileTimeError
-Language/Classes/Setters/syntax_t04: MissingCompileTimeError
-Language/Expressions/Additive_Expressions/syntax_t01: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
-Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/exception_t02/01: CompileTimeError
-Language/Expressions/Constants/integer_size_t03: CompileTimeError
-Language/Expressions/Constants/integer_size_t04: CompileTimeError
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Fail
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Fail
-Language/Expressions/Identifier_Reference/evaluation_variable_or_parameter_t02: RuntimeError
-Language/Expressions/If_null_Expressions/static_type_t01: RuntimeError
-Language/Expressions/Lists/identical_t02: RuntimeError
-Language/Expressions/Maps/identical_t02: RuntimeError
-Language/Expressions/Null/instance_of_class_null_t01: RuntimeError
-Language/Expressions/Numbers/syntax_t06: CompileTimeError
-Language/Expressions/Numbers/syntax_t09: CompileTimeError
-Language/Expressions/Object_Identity/double_t02: RuntimeError
-Language/Expressions/Shift/integer_t02: CompileTimeError
-Language/Expressions/Type_Cast/syntax_t01: RuntimeError
-Language/Expressions/Unary_Expressions/variable_negative_t03: RuntimeError
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: CompileTimeError
-Language/Libraries_and_Scripts/top_level_syntax_t01: CompileTimeError
-Language/Metadata/before_ctor_t02: RuntimeError
-Language/Metadata/before_function_t01: RuntimeError
-Language/Metadata/before_function_t02: RuntimeError
-Language/Metadata/before_function_t03: RuntimeError
-Language/Metadata/before_function_t04: RuntimeError
-Language/Metadata/before_function_t07: RuntimeError
-Language/Metadata/before_import_t01: RuntimeError
-Language/Metadata/before_param_t03: RuntimeError
-Language/Metadata/before_param_t05: RuntimeError
-Language/Metadata/before_param_t07: RuntimeError
-Language/Metadata/before_param_t09: RuntimeError
-Language/Metadata/before_variable_t02: RuntimeError
-Language/Mixins/Mixin_Application/superclass_t01: MissingCompileTimeError
-Language/Overview/Privacy/private_and_public_t18: RuntimeError
-Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: RuntimeError
-Language/Statements/Assert/execution_t09: RuntimeError
-Language/Statements/For/syntax_t13: Crash
-Language/Statements/For/syntax_t20: Crash
-Language/Types/Function_Types/call_t01: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t03: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t11: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t01: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t04: RuntimeError
-Language/Types/Interface_Types/subtype_t06: RuntimeError
-Language/Types/Interface_Types/subtype_t21: RuntimeError
-Language/Types/Interface_Types/subtype_t23: RuntimeError
-Language/Variables/constant_variable_t09: RuntimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t01: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t03: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t04: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t05: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t06: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t07: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t08: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t09: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/Callable/Callable_ret_extends_neg_assign_l1_t10: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Instantiate-to-bound/class/class_extends_neg_l1_t05: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t06: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/function/function_ret_extends_Future_neg_assign_l1_t07: MissingCompileTimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_FutureOr_l1_t05: RuntimeError, Pass
-LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t05: RuntimeError, Pass
-LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t10: RuntimeError, Pass
-LanguageFeatures/Simple-bounds/dynamic/typedef_typedef_l1_t05: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_return_value_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LanguageFeatures/Super_Mixins/mixin_member_neg_t02: RuntimeError
-LanguageFeatures/Super_Mixins/super_invocation_t01: CompileTimeError
-LanguageFeatures/regression/34803_t01: Crash, Pass
-LanguageFeatures/regression/34803_t02: Crash, Pass
-LayoutTests/fast/animation/request-animation-frame-prefix_t01: RuntimeError
-LayoutTests/fast/backgrounds/animated-gif-as-background_t01: RuntimeError
-LayoutTests/fast/backgrounds/background-fill-zero-area-crash_t01: RuntimeError
-LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError
-LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError
-LayoutTests/fast/backgrounds/composite-highlight-is-invalid_t01: RuntimeError
-LayoutTests/fast/backgrounds/multiple-backgrounds-assert_t01: RuntimeError
-LayoutTests/fast/backgrounds/repeat/margin-shorthand_t01: RuntimeError
-LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError
-LayoutTests/fast/borders/border-image-width-negative_t01: RuntimeError
-LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError
-LayoutTests/fast/borders/border-radius-child_t01: RuntimeError
-LayoutTests/fast/borders/border-width-percent_t01: RuntimeError
-LayoutTests/fast/box-sizing/table-cell_t01: RuntimeError
-LayoutTests/fast/canvas/2d.composite.globalAlpha.fillPath_t01: RuntimeError
-LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError
-LayoutTests/fast/canvas/DrawImageSinglePixelStretch_t01: RuntimeError
-LayoutTests/fast/canvas/arc-crash_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-arc-360-winding_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-arc-connecting-line_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-before-css_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-clearRect_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-clip-rule_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-closePath-single-point_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-stroke-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillRect-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillRect_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillStyle-no-quirks-parsing_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillText-invalid-maxWidth_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillText-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-font-consistency_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-font-ex-units-crash_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getContext-invalid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-rounding_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-zero-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-invalid-fillstyle_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lineWidth-intact-after-strokeRect_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-longlived-context_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-modify-emptyPath_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-pattern-modify_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-quadratic-same-endpoint_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-save-restore-with-path_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-fillPath-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-shadowBlur_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-setTransform_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-state-intact-after-putImageData_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-stroke-empty-fill_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-stroke-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokePath-cap-join_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokePath-gradient-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeRect-alpha-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeRect-gradient-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeText-invalid-maxWidth_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeText-strokes-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-style-intact-after-text_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-to-canvas_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-toDataURL-crash_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-transparency-and-composite_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-with-illegal-args_t01: RuntimeError
-LayoutTests/fast/canvas/crash-set-font_t01: RuntimeError
-LayoutTests/fast/canvas/drawImage-with-bad-canvas_t01: RuntimeError
-LayoutTests/fast/canvas/drawImage-with-broken-image_t01: RuntimeError
-LayoutTests/fast/canvas/drawImage-with-valid-image_t01: RuntimeError
-LayoutTests/fast/canvas/fillText-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError
-LayoutTests/fast/canvas/gradient-addColorStop-with-invalid-color_t01: RuntimeError
-LayoutTests/fast/canvas/gradient-with-clip_t01: RuntimeError
-LayoutTests/fast/canvas/linearGradient-infinite-values_t01: RuntimeError
-LayoutTests/fast/canvas/pattern-with-transform_t01: RuntimeError
-LayoutTests/fast/canvas/resize-while-save-active_t01: RuntimeError
-LayoutTests/fast/canvas/rgba-parsing_t01: RuntimeError
-LayoutTests/fast/canvas/set-colors_t01: RuntimeError
-LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: RuntimeError
-LayoutTests/fast/canvas/toDataURL-noData_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/attrib-location-length-limits_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/canvas-zero-size_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/context-destroyed-crash_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-bind-attrib-location-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-getshadersource_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-getstring_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-pixelstorei_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-vertex-attrib_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/point-size_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/premultiplyalpha-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/read-pixels-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/shader-precision-format_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgb565_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas-rgba4444_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-canvas_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-svg-image_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-bindings-uneffected-on-resize_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-npot_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/webgl-unprefixed-context-id_t01: RuntimeError
-LayoutTests/fast/canvas/zero-size-fill-rect_t01: RuntimeError
-LayoutTests/fast/cookies/local-file-can-set-cookies_t01: RuntimeError
-LayoutTests/fast/css-generated-content/bug-106384_t01: RuntimeError
-LayoutTests/fast/css-generated-content/bug91547_t01: RuntimeError
-LayoutTests/fast/css-generated-content/details-before-after-content_t01: RuntimeError
-LayoutTests/fast/css-generated-content/empty-content-with-float-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/floating-before-content-with-list-marker-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-animation_t01: RuntimeError
-LayoutTests/fast/css-generated-content/quote-layout-focus-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/remove-div-from-flexible-box-with-floating-after-content-crash_t01: RuntimeError
-LayoutTests/fast/css-generated-content/reset-content-to-initial_t01: RuntimeError
-LayoutTests/fast/css-generated-content/summary-before-after-content_t01: RuntimeError
-LayoutTests/fast/css-generated-content/table-with-scrollbar-corner_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/anonymous-grid-items_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-crash-out-of-flow-positioned-element_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-bad-cast-addchild_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-column-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError
-LayoutTests/fast/css/MarqueeLayoutTest_t01: RuntimeError
-LayoutTests/fast/css/appearance-caps-lock-indicator_t01: RuntimeError
-LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError
-LayoutTests/fast/css/attribute-selector-begin-dynamic-no-elementstyle_t01: RuntimeError
-LayoutTests/fast/css/attribute-selector-recursive-update-on-setAttribute_t01: RuntimeError
-LayoutTests/fast/css/auto-min-size_t01: RuntimeError
-LayoutTests/fast/css/background-currentcolor_t01: RuntimeError
-LayoutTests/fast/css/background-position-serialize_t01: RuntimeError
-LayoutTests/fast/css/background-serialize_t01: RuntimeError
-LayoutTests/fast/css/border-image-fill-crash_t01: RuntimeError
-LayoutTests/fast/css/border-image-null-image-crash_t01: RuntimeError
-LayoutTests/fast/css/border-image-style-length_t01: RuntimeError
-LayoutTests/fast/css/border-shorthand-initialize-longhands_t01: RuntimeError
-LayoutTests/fast/css/border-start-end_t01: RuntimeError
-LayoutTests/fast/css/box-sizing-backwards-compat-prefix_t01: RuntimeError
-LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError
-LayoutTests/fast/css/button-height_t01: RuntimeError
-LayoutTests/fast/css/cached-sheet-restore-crash_t01: RuntimeError
-LayoutTests/fast/css/comment-before-charset_t01: RuntimeError
-LayoutTests/fast/css/content-language-case-insensitivity_t01: RuntimeError
-LayoutTests/fast/css/content-language-mapped-to-webkit-locale_t01: RuntimeError
-LayoutTests/fast/css/content-language-no-content_t01: RuntimeError
-LayoutTests/fast/css/content/content-none_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-01_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-05_t01: RuntimeError
-LayoutTests/fast/css/counters/asterisk-counter-update-after-layout-crash_t01: RuntimeError
-LayoutTests/fast/css/counters/complex-before_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-before-selector-crash_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-function-input-2_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-number-input_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-reparent-table-children-crash_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-traverse-object-crash_t01: RuntimeError
-LayoutTests/fast/css/counters/reparent-table-children-with-counters-crash_t01: RuntimeError
-LayoutTests/fast/css/crash-on-incomplete-not_t01: RuntimeError
-LayoutTests/fast/css/crash-on-incomplete-webkit-any_t01: RuntimeError
-LayoutTests/fast/css/css-escaped-identifier-crash_t01: RuntimeError
-LayoutTests/fast/css/css-keyframe-style-crash_t01: RuntimeError
-LayoutTests/fast/css/css-keyframe-unexpected-end_t01: RuntimeError
-LayoutTests/fast/css/css-properties-case-insensitive_t01: RuntimeError
-LayoutTests/fast/css/css-set-selector-text-crash_t01: RuntimeError
-LayoutTests/fast/css/css3-nth-tokens-script_t01: RuntimeError
-LayoutTests/fast/css/cssom-remove-shorthand-property_t01: RuntimeError
-LayoutTests/fast/css/csstext-of-content-string_t01: RuntimeError
-LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError
-LayoutTests/fast/css/cursor-parsing-quirks_t01: RuntimeError
-LayoutTests/fast/css/cursor-parsing_t01: RuntimeError
-LayoutTests/fast/css/dashboard-regions-attr-crash_t01: RuntimeError
-LayoutTests/fast/css/dashboard-regions-undefined-length-assertion_t01: RuntimeError
-LayoutTests/fast/css/delete-rule-crash_t01: RuntimeError
-LayoutTests/fast/css/deprecated-flex-box-zero-width-intrinsic-max-width_t01: RuntimeError
-LayoutTests/fast/css/device-aspect-ratio_t01: RuntimeError
-LayoutTests/fast/css/div_plus_nav_bug47971_t01: RuntimeError
-LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError
-LayoutTests/fast/css/dynamic-class-pseudo-elements_t01: RuntimeError
-LayoutTests/fast/css/dynamic-pseudo-class_t01: RuntimeError
-LayoutTests/fast/css/dynamic-style-attribute-query_t01: RuntimeError
-LayoutTests/fast/css/emptyStyleTag_t01: RuntimeError
-LayoutTests/fast/css/first-letter-block-form-controls-crash_t01: RuntimeError
-LayoutTests/fast/css/first-letter-capitalized-edit-select-crash_t01: RuntimeError
-LayoutTests/fast/css/first-line-parent-style-different_t01: RuntimeError
-LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_t01: RuntimeError
-LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError
-LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError
-LayoutTests/fast/css/font-face-data-uri-invalid_t01: RuntimeError
-LayoutTests/fast/css/font-face-insert-link_t01: RuntimeError
-LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: RuntimeError
-LayoutTests/fast/css/font-face-svg-decoding-error_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError
-LayoutTests/fast/css/font-face-used-after-retired_t01: RuntimeError
-LayoutTests/fast/css/font-family-builtins_t01: RuntimeError
-LayoutTests/fast/css/font-family-trailing-bracket-gunk_t01: RuntimeError
-LayoutTests/fast/css/font-property-priority_t01: RuntimeError
-LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError
-LayoutTests/fast/css/fontface-properties_t01: RuntimeError
-LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-border-image_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-display-none_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-negative-top_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-page-break-inside_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-select-overflow_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-with-zoom_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-box_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-image-slice_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-style-shorthand_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-borderRadius-2_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-height_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-length-unit_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-outline-offset_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-relayout_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-text-overflow_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-zIndex-auto_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/zoom-on-display-none_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-column-rule_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-webkit-margin-collapse_t01: RuntimeError
-LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError
-LayoutTests/fast/css/image-set-parsing-invalid_t01: RuntimeError
-LayoutTests/fast/css/image-set-setting_t01: RuntimeError
-LayoutTests/fast/css/implicit-attach-marking_t01: RuntimeError
-LayoutTests/fast/css/inherited-properties-explicit_t01: RuntimeError
-LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError
-LayoutTests/fast/css/input-search-table-column-crash_t01: RuntimeError
-LayoutTests/fast/css/inputtext-crash_t01: RuntimeError
-LayoutTests/fast/css/insertRule-media_t01: RuntimeError
-LayoutTests/fast/css/invalid-import-rule-insertion_t01: RuntimeError
-LayoutTests/fast/css/invalid-not-with-pseudo-element_t01: RuntimeError
-LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError
-LayoutTests/fast/css/invalidation/detach-reattach_t01: RuntimeError
-LayoutTests/fast/css/invalidation/dynamic-selector-list-pseudo_t01: RuntimeError
-LayoutTests/fast/css/invalidation/invalidation-set-with-adjacent-combinators_t01: RuntimeError
-LayoutTests/fast/css/invalidation/no-invalidation-set-local-style_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-style-invalidation_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-type-selectors_t01: RuntimeError
-LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError
-LayoutTests/fast/css/large-font-size-crash_t01: RuntimeError
-LayoutTests/fast/css/last-child-innerhtml_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError
-LayoutTests/fast/css/list-item-text-align_t01: RuntimeError
-LayoutTests/fast/css/max-width-none_t01: RuntimeError
-LayoutTests/fast/css/media-query-recovery_t01: RuntimeError
-LayoutTests/fast/css/media-rule-dyn_t01: RuntimeError
-LayoutTests/fast/css/media-rule-no-whitespace_t01: RuntimeError
-LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError
-LayoutTests/fast/css/named-colors_t01: RuntimeError
-LayoutTests/fast/css/nested-at-rules_t01: RuntimeError
-LayoutTests/fast/css/nested-first-letter-with-float-crash_t01: RuntimeError
-LayoutTests/fast/css/nth-child-implied-step_t01: RuntimeError
-LayoutTests/fast/css/nth-child-n_t01: RuntimeError
-LayoutTests/fast/css/nth-child-no-mutations_t01: RuntimeError
-LayoutTests/fast/css/nth-child-unary-prefix_t01: RuntimeError
-LayoutTests/fast/css/overflow-property_t01: RuntimeError
-LayoutTests/fast/css/padding-no-renderer_t01: RuntimeError
-LayoutTests/fast/css/padding-start-end_t01: RuntimeError
-LayoutTests/fast/css/parse-border-image-repeat-null-crash_t01: RuntimeError
-LayoutTests/fast/css/parsing-css-comment_t01: RuntimeError
-LayoutTests/fast/css/parsing-css-escapes_t01: RuntimeError
-LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError
-LayoutTests/fast/css/parsing-css-surrogate-pairs_t01: RuntimeError
-LayoutTests/fast/css/parsing-expr-error-recovery_t01: RuntimeError
-LayoutTests/fast/css/parsing-font-variant-ligatures_t01: RuntimeError
-LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError
-LayoutTests/fast/css/parsing-text-rendering_t01: RuntimeError
-LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError
-LayoutTests/fast/css/percent-character-as-value_t01: RuntimeError
-LayoutTests/fast/css/position-absolute-float_t01: RuntimeError
-LayoutTests/fast/css/positioned-overflow-scroll_t01: RuntimeError
-LayoutTests/fast/css/pseudo-default-001_t01: RuntimeError
-LayoutTests/fast/css/pseudo-default-002_t01: RuntimeError
-LayoutTests/fast/css/pseudo-empty-display-none_t01: RuntimeError
-LayoutTests/fast/css/pseudo-escaped-parenthesis_t01: RuntimeError
-LayoutTests/fast/css/pseudo-invalid-001_t01: RuntimeError
-LayoutTests/fast/css/pseudo-invalid-novalidate-001_t01: RuntimeError
-LayoutTests/fast/css/pseudo-not_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-001_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-002_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-003_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-004_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-005_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-006_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-unapplied_t01: RuntimeError
-LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: RuntimeError
-LayoutTests/fast/css/pseudo-valid-002_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError
-LayoutTests/fast/css/recalc-direct-adjacent-001_t01: RuntimeError
-LayoutTests/fast/css/relative-positioned-block-crash_t01: RuntimeError
-LayoutTests/fast/css/remove-attribute-style_t01: RuntimeError
-LayoutTests/fast/css/remove-fixed-resizer-crash_t01: RuntimeError
-LayoutTests/fast/css/resize-value-compared_t01: RuntimeError
-LayoutTests/fast/css/rgba-custom-text_t01: RuntimeError
-LayoutTests/fast/css/scrollbar-crash_t01: RuntimeError
-LayoutTests/fast/css/shadow-dom-scope_t01: RuntimeError
-LayoutTests/fast/css/sheet-collection-link_t01: RuntimeError
-LayoutTests/fast/css/short-inline-style_t01: RuntimeError
-LayoutTests/fast/css/shorthand-priority_t01: RuntimeError
-LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError
-LayoutTests/fast/css/small-caps-crash_t01: RuntimeError
-LayoutTests/fast/css/space-before-charset-external_t01: RuntimeError
-LayoutTests/fast/css/sticky/remove-inline-sticky-crash_t01: RuntimeError
-LayoutTests/fast/css/sticky/remove-sticky-crash_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError
-LayoutTests/fast/css/style-sharing-grand-parent-invalidate_t01: RuntimeError
-LayoutTests/fast/css/style-sharing-type-and-readonly_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-link_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-parentStyleSheet_t01: RuntimeError
-LayoutTests/fast/css/test-setting-canvas-color_t01: RuntimeError
-LayoutTests/fast/css/text-align-initial_t01: RuntimeError
-LayoutTests/fast/css/text-align-webkit-match-parent_t01: RuntimeError
-LayoutTests/fast/css/text-rendering-priority_t01: RuntimeError
-LayoutTests/fast/css/transform-origin-parsing_t01: RuntimeError
-LayoutTests/fast/css/transition_shorthand_parsing_t01: RuntimeError
-LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError
-LayoutTests/fast/css/visibility-collapse-form-buttons_t01: RuntimeError
-LayoutTests/fast/css/webkit-color-adjust_t01: RuntimeError
-LayoutTests/fast/css/webkit-empty-transform-preserve3d-crash_t01: RuntimeError
-LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError
-LayoutTests/fast/css/zoom-in-length-round-trip_t01: RuntimeError
-LayoutTests/fast/css/zoom-property-parsing_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError
-LayoutTests/fast/dom/Attr/access-after-element-destruction_t01: RuntimeError
-LayoutTests/fast/dom/Attr/change-id-via-attr-node-value_t01: RuntimeError
-LayoutTests/fast/dom/Comment/comment-constructor_t01: RuntimeError
-LayoutTests/fast/dom/Comment/remove_t01: RuntimeError
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError
-LayoutTests/fast/dom/DOMImplementation/createHTMLDocument-title_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError
-LayoutTests/fast/dom/Document/clone-node_t01: RuntimeError
-LayoutTests/fast/dom/Document/createElement-invalid-names_t01: RuntimeError
-LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError
-LayoutTests/fast/dom/Document/title-with-multiple-children_t01: RuntimeError
-LayoutTests/fast/dom/DocumentFragment/document-fragment-constructor_t01: RuntimeError
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError
-LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError
-LayoutTests/fast/dom/Element/dimension-properties-unrendered_t01: RuntimeError
-LayoutTests/fast/dom/Element/getBoundingClientRect-getClientRects-relative-to-viewport_t01: RuntimeError
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError
-LayoutTests/fast/dom/Element/id-in-frame_t01: RuntimeError
-LayoutTests/fast/dom/Element/id-in-getelement01_t01: RuntimeError
-LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError
-LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: RuntimeError
-LayoutTests/fast/dom/Element/scrollWidth_t01: RuntimeError
-LayoutTests/fast/dom/Element/setAttribute-case-insensitivity_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-port_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-prevents-rebase_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-rebase_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAreaElement/area-islink-focus-null-ptr-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: RuntimeError
-LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: RuntimeError
-LayoutTests/fast/dom/HTMLButtonElement/value/getset_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/clone-node_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/title-get_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/title-set_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/innerHTML-selection-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/translate_t01: RuntimeError
-LayoutTests/fast/dom/HTMLFontElement/size-attribute_t01: RuntimeError
-LayoutTests/fast/dom/HTMLFormElement/adopt-assertion_t01: RuntimeError
-LayoutTests/fast/dom/HTMLFormElement/associated-elements-after-index-assertion-fail2_t01: RuntimeError
-LayoutTests/fast/dom/HTMLFormElement/elements-not-in-document_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-natural-width-height_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-without-renderer-width_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/checked-pseudo-selector_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/clone-input-checked_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/duplicate-element-names_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-checked-reset_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-size-attribute_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-text-reset_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/size-as-number_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/click-label_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-sheet-out-of-tree_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/subresource_t01: RuntimeError
-LayoutTests/fast/dom/HTMLMeterElement/meter-percent-size_t01: RuntimeError
-LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError
-LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLObjectElement/children-changed_t01: RuntimeError
-LayoutTests/fast/dom/HTMLObjectElement/form/test1_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-children-removed_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-reset-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-validity_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/indeterminate-progress-002_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/progress-element-with-child-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/progress-element-with-style-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/set-progress-properties_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/script-reexecution_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: RuntimeError
-LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions_t01: RuntimeError
-LayoutTests/fast/dom/HTMLSelectElement/selected-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onerror-handler_t01: RuntimeError
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLStyleElement/style-onload2_t01: RuntimeError
-LayoutTests/fast/dom/HTMLStyleElement/style-onload_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/createCaption_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/early-acid3-65-excerpt_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/exceptions_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/rows_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/tBodies_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableRowElement/exceptions_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableRowElement/insertCell_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableSectionElement/rows_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/contentWrappers_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/cycles_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/ownerDocument_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTextAreaElement/reset-textarea_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/added-out-of-order_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/clear-transient-without-delivery_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/create-during-delivery_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/delivery-order_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/disconnect-transient-crash_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/document-fragment-insertion_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/mutation-record-constructor_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observe-subtree_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observer-wrapper-dropoff-transient_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observer-wrapper-dropoff_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/removed-out-of-order_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/takeRecords_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/transient-gc-crash_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError
-LayoutTests/fast/dom/Node/DOMNodeRemovedEvent_t01: RuntimeError
-LayoutTests/fast/dom/Node/contains-method_t01: RuntimeError
-LayoutTests/fast/dom/NodeList/childNodes-reset-cache_t01: RuntimeError
-LayoutTests/fast/dom/NodeList/childNodes-reverse-iteration_t01: RuntimeError
-LayoutTests/fast/dom/NodeList/invalidate-node-lists-when-parsing_t01: RuntimeError
-LayoutTests/fast/dom/NodeList/nodelist-moved-to-fragment-2_t01: RuntimeError
-LayoutTests/fast/dom/Range/31684_t01: RuntimeError
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError
-LayoutTests/fast/dom/Range/create-contextual-fragment-script-unmark-already-started_t01: RuntimeError
-LayoutTests/fast/dom/Range/deleted-range-endpoints_t01: RuntimeError
-LayoutTests/fast/dom/Range/getClientRects-character_t01: RuntimeError
-LayoutTests/fast/dom/Range/missing-arguments_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-clone-contents_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-delete-contents-event-fire-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-extract-contents-event-fire-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-extractContents_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-assertion_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-modifycontents_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-processing-instructions_t01: RuntimeError
-LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/bug-17313_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/caseTag_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/detached-element_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/id-fastpath-strict_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/not-supported-namespace-in-selector_t01: RuntimeError
-LayoutTests/fast/dom/SelectorAPI/viewless-document_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-style-2_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError
-LayoutTests/fast/dom/Text/text-constructor_t01: RuntimeError
-LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError
-LayoutTests/fast/dom/TreeWalker/TreeWalker-currentNode_t01: RuntimeError
-LayoutTests/fast/dom/Window/invalid-protocol_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer-attribute-ns-prefix_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer-doctype_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer-double-xmlns_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer-element-ns-no-reemit_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer_t01: RuntimeError
-LayoutTests/fast/dom/allowed-children_t01: RuntimeError
-LayoutTests/fast/dom/anchor-origin_t01: RuntimeError
-LayoutTests/fast/dom/anchor-toString_t01: RuntimeError
-LayoutTests/fast/dom/assertion-on-node-removal_t01: RuntimeError
-LayoutTests/fast/dom/capturing-event-listeners_t01: RuntimeError
-LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError
-LayoutTests/fast/dom/class-attr-change-double-mutation-fire_t01: RuntimeError
-LayoutTests/fast/dom/click-method-on-html-element_t01: RuntimeError
-LayoutTests/fast/dom/clone-contents-0-end-offset_t01: RuntimeError
-LayoutTests/fast/dom/clone-node-form-elements-with-attr_t01: RuntimeError
-LayoutTests/fast/dom/clone-node-load-event-crash_t01: RuntimeError
-LayoutTests/fast/dom/cloneNode-below-body-attribute-merging_t01: RuntimeError
-LayoutTests/fast/dom/comment-not-documentElement_t01: RuntimeError
-LayoutTests/fast/dom/containerNode_t01: RuntimeError
-LayoutTests/fast/dom/createDocumentType2_t01: RuntimeError
-LayoutTests/fast/dom/createDocument_t01: RuntimeError
-LayoutTests/fast/dom/createElementNS-empty-namespace_t01: RuntimeError
-LayoutTests/fast/dom/createElementNS_t01: RuntimeError
-LayoutTests/fast/dom/createElement_t01: RuntimeError
-LayoutTests/fast/dom/css-cached-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-delete-doc_t01: RuntimeError
-LayoutTests/fast/dom/css-inline-style-important_t01: RuntimeError
-LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule-twice_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError
-LayoutTests/fast/dom/css-mediarule-insertRule-update_t01: RuntimeError
-LayoutTests/fast/dom/css-mediarule-parentRule_t01: RuntimeError
-LayoutTests/fast/dom/css-selectorText_t01: RuntimeError
-LayoutTests/fast/dom/css-set-property-exception_t01: RuntimeError
-LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError
-LayoutTests/fast/dom/cssTarget-crash_t01: RuntimeError
-LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/invalid-type-extension-crash_t01: RuntimeError
-LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError
-LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError
-LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError
-LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError
-LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError
-LayoutTests/fast/dom/document-stylesheets-empty-style_t01: RuntimeError
-LayoutTests/fast/dom/document-width-height-force-layout_t01: RuntimeError
-LayoutTests/fast/dom/dom-instanceof_t01: RuntimeError
-LayoutTests/fast/dom/dom-parse-serialize-xmldecl_t01: RuntimeError
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError
-LayoutTests/fast/dom/domtimestamp-is-number_t01: RuntimeError
-LayoutTests/fast/dom/duplicate-ids_t01: RuntimeError
-LayoutTests/fast/dom/empty-hash-and-search_t01: RuntimeError
-LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError, Pass
-LayoutTests/fast/dom/gc-image-element-2_t01: RuntimeError
-LayoutTests/fast/dom/gc-image-element_t01: RuntimeError
-LayoutTests/fast/dom/getElementById-consistency2_t01: RuntimeError
-LayoutTests/fast/dom/getElementById-consistency4_t01: RuntimeError
-LayoutTests/fast/dom/getElementById-consistency_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/001_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/003_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/004_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/006_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/007_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/009_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/012_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/014_t01: RuntimeError
-LayoutTests/fast/dom/getelementbyname-invalidation_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError
-LayoutTests/fast/dom/html-collections-named-getter-mandatory-arg_t01: RuntimeError
-LayoutTests/fast/dom/htmlcollection-length-after-item_t01: RuntimeError
-LayoutTests/fast/dom/icon-url-list_t01: RuntimeError
-LayoutTests/fast/dom/id-attribute-with-namespace-crash_t01: RuntimeError
-LayoutTests/fast/dom/importNode-confusing-localName_t01: RuntimeError
-LayoutTests/fast/dom/importNode-prefix_t01: RuntimeError
-LayoutTests/fast/dom/importNodeHTML_t01: RuntimeError
-LayoutTests/fast/dom/inner-text-first-letter_t01: RuntimeError
-LayoutTests/fast/dom/inner-text_t01: RuntimeError
-LayoutTests/fast/dom/inner-width-height_t01: RuntimeError
-LayoutTests/fast/dom/innerHTML-detached-element_t01: RuntimeError
-LayoutTests/fast/dom/innerHTML-escaping-attribute_t01: RuntimeError
-LayoutTests/fast/dom/innerHTML-nbsp_t01: RuntimeError
-LayoutTests/fast/dom/insertAdjacentHTML-DocumentFragment-crash_t01: RuntimeError
-LayoutTests/fast/dom/javascript-backslash_t01: RuntimeError
-LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError
-LayoutTests/fast/dom/legend-display-inline_t01: RuntimeError
-LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError
-LayoutTests/fast/dom/location-hash_t01: RuntimeError
-LayoutTests/fast/dom/multiple-ids_t01: RuntimeError
-LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError
-LayoutTests/fast/dom/navigator-vendorSub_t01: RuntimeError
-LayoutTests/fast/dom/node-childNodes-idempotence_t01: RuntimeError
-LayoutTests/fast/dom/node-iterator-reference-node-removed_t01: RuntimeError
-LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError
-LayoutTests/fast/dom/non-styled-element-id-crash_t01: RuntimeError
-LayoutTests/fast/dom/null-chardata-crash_t01: RuntimeError
-LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError
-LayoutTests/fast/dom/remove-style-element_t01: RuntimeError
-LayoutTests/fast/dom/replace-child-siblings_t01: RuntimeError
-LayoutTests/fast/dom/script-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/serialize-attribute_t01: RuntimeError
-LayoutTests/fast/dom/set-custom-validity-with-too-few-arguments_t01: RuntimeError
-LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError
-LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError
-LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError
-LayoutTests/fast/dom/shadow/event-path-not-in-document_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError
-LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError
-LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError
-LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError
-LayoutTests/fast/dom/style-sheet-candidate-remove-unrendered-document_t01: RuntimeError
-LayoutTests/fast/dom/text-api-arguments_t01: RuntimeError
-LayoutTests/fast/dom/text-node-attach-crash_t01: RuntimeError
-LayoutTests/fast/dom/xhtml-fragment-whitespace_t01: RuntimeError
-LayoutTests/fast/dynamic/ancestor-to-absolute_t01: RuntimeError
-LayoutTests/fast/dynamic/checkbox-selection-crash_t01: RuntimeError
-LayoutTests/fast/dynamic/continuation-detach-crash_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError
-LayoutTests/fast/dynamic/float-remove-above-line_t01: RuntimeError
-LayoutTests/fast/dynamic/inline-to-block-crash_t01: RuntimeError
-LayoutTests/fast/dynamic/jQuery-animation-crash_t01: RuntimeError
-LayoutTests/fast/dynamic/layer-no-longer-paginated_t01: RuntimeError
-LayoutTests/fast/dynamic/position-change-layout_t01: RuntimeError
-LayoutTests/fast/dynamic/style-access-late-stylesheet-load_t01: RuntimeError
-LayoutTests/fast/dynamic/subtree-common-root_t01: RuntimeError
-LayoutTests/fast/encoding/bom-in-content_t01: RuntimeError
-LayoutTests/fast/events/change-overflow-on-overflow-change_t01: RuntimeError
-LayoutTests/fast/events/clipboard-dataTransferItemList-remove_t01: RuntimeError
-LayoutTests/fast/events/create-document-crash-on-attach-event_t01: RuntimeError
-LayoutTests/fast/events/defaultprevented_t01: RuntimeError
-LayoutTests/fast/events/delayed-style-mutation-event-crash_t01: RuntimeError
-LayoutTests/fast/events/dispatch-event-being-dispatched_t01: RuntimeError
-LayoutTests/fast/events/dispatchEvent-crash_t01: RuntimeError
-LayoutTests/fast/events/event-creation_t01: RuntimeError
-LayoutTests/fast/events/event-fired-after-removal_t01: RuntimeError
-LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError
-LayoutTests/fast/events/event-listener-list-mutation_t01: RuntimeError
-LayoutTests/fast/events/event-listener-moving-documents_t01: RuntimeError
-LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError
-LayoutTests/fast/events/fire-scroll-event-element_t01: RuntimeError
-LayoutTests/fast/events/fire-scroll-event_t01: RuntimeError
-LayoutTests/fast/events/init-message-event_t01: RuntimeError
-LayoutTests/fast/events/invalid-002_t01: RuntimeError
-LayoutTests/fast/events/invalid-003_t01: RuntimeError
-LayoutTests/fast/events/mutation-during-append-child_t01: RuntimeError
-LayoutTests/fast/events/mutation-during-insert-before_t01: RuntimeError
-LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError
-LayoutTests/fast/events/no-window-load_t01: RuntimeError
-LayoutTests/fast/events/onerror-bubbling_t01: RuntimeError
-LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError
-LayoutTests/fast/events/remove-event-listener_t01: RuntimeError
-LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError
-LayoutTests/fast/events/scroll-during-zoom-change_t01: RuntimeError
-LayoutTests/fast/events/scroll-event-does-not-bubble_t01: RuntimeError
-LayoutTests/fast/events/selectstart-on-selectall_t01: RuntimeError
-LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError
-LayoutTests/fast/events/wheelevent-constructor_t01: RuntimeError
-LayoutTests/fast/events/window-load-capture_t01: RuntimeError
-LayoutTests/fast/eventsource/eventsource-attribute-listeners_t01: RuntimeError
-LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError
-LayoutTests/fast/files/blob-close-read_t01: RuntimeError
-LayoutTests/fast/files/blob-constructor_t01: RuntimeError
-LayoutTests/fast/files/file-reader-abort-in-last-progress_t01: RuntimeError
-LayoutTests/fast/files/file-reader-done-reading-abort_t01: RuntimeError
-LayoutTests/fast/files/file-reader-fffd_t01: RuntimeError
-LayoutTests/fast/files/file-reader-result-twice_t01: RuntimeError
-LayoutTests/fast/files/read-blob-as-array-buffer_t01: RuntimeError
-LayoutTests/fast/files/workers/inline-worker-via-blob-url_t01: RuntimeError
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError
-LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-after-reload-crash_t01: RuntimeError
-LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError
-LayoutTests/fast/filesystem/op-copy_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError
-LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError
-LayoutTests/fast/filesystem/read-directory_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError
-LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError
-LayoutTests/fast/flexbox/box-orient-button_t01: RuntimeError
-LayoutTests/fast/flexbox/crash-button-input-autofocus_t01: RuntimeError
-LayoutTests/fast/flexbox/inline-children-crash_t01: RuntimeError
-LayoutTests/fast/flexbox/order-iterator-crash_t01: RuntimeError
-LayoutTests/fast/flexbox/repaint-scrollbar_t01: RuntimeError
-LayoutTests/fast/flexbox/vertical-box-form-controls_t01: RuntimeError
-LayoutTests/fast/forms/4628409_t01: RuntimeError
-LayoutTests/fast/forms/HTMLOptionElement_selected2_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-rangeOverflow_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-rangeUnderflow_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-typeMismatch-url_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-004_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-006_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-008_t01: RuntimeError
-LayoutTests/fast/forms/add-remove-form-elements-stress-test_t01: RuntimeError
-LayoutTests/fast/forms/autocomplete_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-focus-only-once_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-input-css-style-change_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-opera-004_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-opera-007_t01: RuntimeError
-LayoutTests/fast/forms/button-click-DOM_t01: RuntimeError
-LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError
-LayoutTests/fast/forms/change-form-element-document-crash_t01: RuntimeError
-LayoutTests/fast/forms/checkValidity-003_t01: RuntimeError
-LayoutTests/fast/forms/checkbox-default-value_t01: RuntimeError
-LayoutTests/fast/forms/color/color-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError
-LayoutTests/fast/forms/control-detach-crash_t01: RuntimeError
-LayoutTests/fast/forms/cursor-position_t01: RuntimeError
-LayoutTests/fast/forms/dangling-form-element-crash_t01: RuntimeError
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError
-LayoutTests/fast/forms/date/ValidityState-typeMismatch-date_t01: RuntimeError
-LayoutTests/fast/forms/date/date-interactive-validation-required_t01: RuntimeError
-LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError
-LayoutTests/fast/forms/date/date-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/double-focus_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/fieldset-disabled_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/fieldset-name_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/fieldset-type_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/validation-in-fieldset_t01: RuntimeError
-LayoutTests/fast/forms/focus-style-pending_t01: RuntimeError
-LayoutTests/fast/forms/focus_t01: RuntimeError
-LayoutTests/fast/forms/form-added-to-table_t01: RuntimeError
-LayoutTests/fast/forms/form-associated-element-crash_t01: RuntimeError
-LayoutTests/fast/forms/form-attribute-nonexistence-form-id_t01: RuntimeError
-LayoutTests/fast/forms/form-attribute-not-in-document_t01: RuntimeError
-LayoutTests/fast/forms/form-input-named-arguments_t01: RuntimeError
-LayoutTests/fast/forms/form-submission-create-crash_t01: RuntimeError
-LayoutTests/fast/forms/formmethod-attribute-test_t01: RuntimeError
-LayoutTests/fast/forms/image/image-error-event-crash_t01: RuntimeError
-LayoutTests/fast/forms/image/image-error-event-modifies-type-crash_t01: RuntimeError
-LayoutTests/fast/forms/image/width-and-height-of-detached-input_t01: RuntimeError
-LayoutTests/fast/forms/incremental-dom-property_t01: RuntimeError
-LayoutTests/fast/forms/indeterminate-input-types_t01: RuntimeError
-LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError
-LayoutTests/fast/forms/input-appearance-maxlength_t01: RuntimeError
-LayoutTests/fast/forms/input-changing-value_t01: RuntimeError
-LayoutTests/fast/forms/input-file-set-value_t01: RuntimeError
-LayoutTests/fast/forms/input-hit-test-border_t01: RuntimeError
-LayoutTests/fast/forms/input-implicit-length-limit_t01: RuntimeError
-LayoutTests/fast/forms/input-inputmode_t01: RuntimeError
-LayoutTests/fast/forms/input-maxlength-unsupported_t01: RuntimeError
-LayoutTests/fast/forms/input-maxlength_t01: RuntimeError
-LayoutTests/fast/forms/input-multiple_t01: RuntimeError
-LayoutTests/fast/forms/input-select-webkit-user-select-none_t01: RuntimeError
-LayoutTests/fast/forms/input-type-change-focusout_t01: RuntimeError
-LayoutTests/fast/forms/input-type-change_t01: RuntimeError
-LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError
-LayoutTests/fast/forms/input-width-height-attributes_t01: RuntimeError
-LayoutTests/fast/forms/interactive-validation-select-crash_t01: RuntimeError
-LayoutTests/fast/forms/legend-absolute-position-auto-width_t01: RuntimeError
-LayoutTests/fast/forms/listbox-scroll-after-options-removed_t01: RuntimeError
-LayoutTests/fast/forms/listbox-select-all_t01: RuntimeError
-LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError
-LayoutTests/fast/forms/method-attribute_t01: RuntimeError
-LayoutTests/fast/forms/misplaced-img-form-registration_t01: RuntimeError
-LayoutTests/fast/forms/onchange-change-type_t01: RuntimeError
-LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError
-LayoutTests/fast/forms/option-label-trim-html-spaces_t01: RuntimeError
-LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError
-LayoutTests/fast/forms/option-value-and-label-changed-by-js_t01: RuntimeError
-LayoutTests/fast/forms/option-value-and-label_t01: RuntimeError
-LayoutTests/fast/forms/option-value-trim-html-spaces_t01: RuntimeError
-LayoutTests/fast/forms/output-reset-assertion-failed_t01: RuntimeError
-LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError
-LayoutTests/fast/forms/paste-into-textarea_t01: RuntimeError
-LayoutTests/fast/forms/pattern-attribute-002_t01: RuntimeError
-LayoutTests/fast/forms/percent-height-auto-width-form-controls_t01: RuntimeError
-LayoutTests/fast/forms/placeholder-dom-property_t01: RuntimeError
-LayoutTests/fast/forms/placeholder-non-textfield_t01: RuntimeError
-LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError
-LayoutTests/fast/forms/radio-checkbox-restore-indeterminate_t01: RuntimeError
-LayoutTests/fast/forms/required-attribute-002_t01: RuntimeError
-LayoutTests/fast/forms/search-placeholder-value-changed_t01: RuntimeError
-LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError
-LayoutTests/fast/forms/select-display-none-style-resolve_t01: RuntimeError
-LayoutTests/fast/forms/select-generated-content_t01: RuntimeError
-LayoutTests/fast/forms/select-out-of-bounds-index_t01: RuntimeError
-LayoutTests/fast/forms/select-remove-option_t01: RuntimeError
-LayoutTests/fast/forms/select-set-inner_t01: RuntimeError
-LayoutTests/fast/forms/select-set-length-with-mutation-remove_t01: RuntimeError
-LayoutTests/fast/forms/selection-direction_t01: RuntimeError
-LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError
-LayoutTests/fast/forms/setCustomValidity-arguments_t01: RuntimeError
-LayoutTests/fast/forms/setCustomValidity-existence_t01: RuntimeError
-LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError
-LayoutTests/fast/forms/slow-click_t01: RuntimeError
-LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-ancestor-dir-attribute_t01: RuntimeError
-LayoutTests/fast/forms/submit-form-with-dirname-attribute_t01: RuntimeError
-LayoutTests/fast/forms/text-control-selection-crash_t01: RuntimeError
-LayoutTests/fast/forms/text-set-value-crash_t01: RuntimeError
-LayoutTests/fast/forms/textarea-and-mutation-events_t01: RuntimeError
-LayoutTests/fast/forms/textarea-checkValidity-crash_t01: RuntimeError
-LayoutTests/fast/forms/textarea-crlf_t01: RuntimeError
-LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError
-LayoutTests/fast/forms/textarea-placeholder-dom-property_t01: RuntimeError
-LayoutTests/fast/forms/textarea-placeholder-relayout-assertion_t01: RuntimeError
-LayoutTests/fast/forms/textarea-rows-cols_t01: RuntimeError
-LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError
-LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError
-LayoutTests/fast/forms/textarea-submit-crash_t01: RuntimeError
-LayoutTests/fast/forms/textarea-trailing-newline_t01: RuntimeError
-LayoutTests/fast/forms/validationMessage_t01: RuntimeError
-LayoutTests/fast/forms/validity-property_t01: RuntimeError
-LayoutTests/fast/forms/willvalidate_t01: RuntimeError
-LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError
-LayoutTests/fast/html/article-element_t01: RuntimeError
-LayoutTests/fast/html/body-offset-properties_t01: RuntimeError
-LayoutTests/fast/html/details-add-child-2_t01: RuntimeError
-LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError
-LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError
-LayoutTests/fast/html/details-click-controls_t01: RuntimeError
-LayoutTests/fast/html/details-mouse-click_t01: RuntimeError
-LayoutTests/fast/html/disable-style-element_t01: RuntimeError
-LayoutTests/fast/html/draggable_t01: RuntimeError
-LayoutTests/fast/html/empty-fragment-id-goto-top_t01: RuntimeError
-LayoutTests/fast/html/eventhandler-attribute-non-callable_t01: RuntimeError
-LayoutTests/fast/html/figure-element_t01: RuntimeError
-LayoutTests/fast/html/header-element_t01: RuntimeError
-LayoutTests/fast/html/hgroup-element_t01: RuntimeError
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError
-LayoutTests/fast/html/layout-with-pending-stylesheet_t01: RuntimeError
-LayoutTests/fast/html/main-element_t01: RuntimeError
-LayoutTests/fast/html/object-border_t01: RuntimeError
-LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError
-LayoutTests/fast/html/xhtml-serialize_t01: RuntimeError
-LayoutTests/fast/inline-block/inline-block-vertical-align-t02: RuntimeError
-LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-inline-parent_t01: RuntimeError
-LayoutTests/fast/inline/fixed-pos-moves-with-abspos-parent_t01: RuntimeError
-LayoutTests/fast/inline/fixed-pos-with-transform-container-moves-with-abspos-parent_t01: RuntimeError
-LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError
-LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/inline/reattach-inlines-in-anonymous-blocks-with-out-of-flow-siblings_t01: RuntimeError
-LayoutTests/fast/innerHTML/001_t01: RuntimeError
-LayoutTests/fast/innerHTML/002_t01: RuntimeError
-LayoutTests/fast/innerHTML/003_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-case_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-template-crash_t01: RuntimeError
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError
-LayoutTests/fast/layers/negative-scroll-positions_t01: RuntimeError
-LayoutTests/fast/layers/normal-flow-hit-test_t01: RuntimeError
-LayoutTests/fast/layers/zindex-hit-test_t01: RuntimeError
-LayoutTests/fast/lists/calc-width-with-space_t01: RuntimeError
-LayoutTests/fast/lists/item-not-in-list-line-wrapping_t01: RuntimeError
-LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError
-LayoutTests/fast/loader/about-blank-hash-change_t01: RuntimeError
-LayoutTests/fast/loader/about-blank-hash-kept_t01: RuntimeError
-LayoutTests/fast/loader/hashchange-event-async_t01: RuntimeError
-LayoutTests/fast/loader/local-css-allowed-in-strict-mode_t01: RuntimeError
-LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError
-LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError
-LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError
-LayoutTests/fast/masking/parsing-mask_t01: RuntimeError
-LayoutTests/fast/media/invalid-lengths_t01: RuntimeError
-LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError
-LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError
-LayoutTests/fast/media/mq-append-delete_t01: RuntimeError
-LayoutTests/fast/media/mq-color-index_t02: RuntimeError
-LayoutTests/fast/media/mq-js-media-except_t03: RuntimeError
-LayoutTests/fast/media/mq-js-update-media_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCIceCandidate_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError
-LayoutTests/fast/mediastream/constructors_t01: RuntimeError
-LayoutTests/fast/multicol/balance-unbreakable_t01: RuntimeError
-LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError
-LayoutTests/fast/multicol/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/gap-non-negative_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError
-LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError
-LayoutTests/fast/multicol/inline-getclientrects_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t02: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t03: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t04: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t05: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t08: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance_t10: RuntimeError
-LayoutTests/fast/multicol/orphans-relayout_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/widows_t01: RuntimeError
-LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError
-LayoutTests/fast/overflow/child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError
-LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError
-LayoutTests/fast/overflow/scroll-vertical-not-horizontal_t01: RuntimeError
-LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError
-LayoutTests/fast/parser/foster-parent_t01: RuntimeError
-LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError
-LayoutTests/fast/parser/href-whitespace_t01: RuntimeError
-LayoutTests/fast/parser/image-tag-parses-to-HTMLImageElement_t01: RuntimeError
-LayoutTests/fast/parser/parse-wbr_t01: RuntimeError
-LayoutTests/fast/parser/residual-style-close-across-n-blocks_t01: RuntimeError
-LayoutTests/fast/parser/stray-end-tags-with-attributes-001_t01: RuntimeError
-LayoutTests/fast/parser/stray-end-tags-with-attributes-002_t01: RuntimeError
-LayoutTests/fast/parser/stray-param_t01: RuntimeError
-LayoutTests/fast/parser/strict-img-in-map_t01: RuntimeError
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError
-LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor-vertical-lr_t01: RuntimeError
-LayoutTests/fast/replaced/computed-image-width-with-percent-height-and-fixed-ancestor_t01: RuntimeError
-LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor-vertical-lr_t01: RuntimeError
-LayoutTests/fast/replaced/computed-image-width-with-percent-height-inside-table-cell-and-fixed-ancestor_t01: RuntimeError
-LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError
-LayoutTests/fast/replaced/preferred-widths_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError
-LayoutTests/fast/ruby/after-doesnt-crash_t01: RuntimeError
-LayoutTests/fast/ruby/before-block-doesnt-crash_t01: RuntimeError
-LayoutTests/fast/ruby/parse-rp_t01: RuntimeError
-LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError
-LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError
-LayoutTests/fast/selectors/querySelector-in-range-crash_t01: RuntimeError
-LayoutTests/fast/selectors/querySelector-leftmost-selector-matches-ancestor_t01: RuntimeError
-LayoutTests/fast/selectors/querySelector-leftmost-selector-matches-rootNode_t01: RuntimeError
-LayoutTests/fast/selectors/querySelector-scope_t01: RuntimeError
-LayoutTests/fast/selectors/style-sharing-last-child_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-outside-none_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError
-LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError
-LayoutTests/fast/sub-pixel/auto-table-layout-should-avoid-text-wrapping_t01: RuntimeError
-LayoutTests/fast/sub-pixel/block-preferred-widths-with-sub-pixel-floats_t01: RuntimeError
-LayoutTests/fast/sub-pixel/boundingclientrect-subpixel-margin_t01: RuntimeError
-LayoutTests/fast/sub-pixel/client-and-offset-width_t01: RuntimeError
-LayoutTests/fast/sub-pixel/computedstylemargin_t01: RuntimeError
-LayoutTests/fast/sub-pixel/float-percentage-widths_t01: RuntimeError
-LayoutTests/fast/sub-pixel/inline-block-with-padding_t01: RuntimeError
-LayoutTests/fast/sub-pixel/shadows-computed-style_t01: RuntimeError
-LayoutTests/fast/sub-pixel/table-cells-have-stable-width_t01: RuntimeError
-LayoutTests/fast/sub-pixel/tiled-canvas-elements_t01: RuntimeError
-LayoutTests/fast/sub-pixel/vertical-align-middle-overflow_t01: RuntimeError
-LayoutTests/fast/svg/getbbox_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-length_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-number_t01: RuntimeError
-LayoutTests/fast/table/before-child-non-table-section-add-table-crash_t01: RuntimeError
-LayoutTests/fast/table/columngroup-inside-columngroup_t01: RuntimeError
-LayoutTests/fast/table/css-table-width_t01: RuntimeError
-LayoutTests/fast/table/fixed-table-layout-toggle-colwidth_t01: RuntimeError
-LayoutTests/fast/table/fixed-table-layout-width-change_t01: RuntimeError
-LayoutTests/fast/table/form-with-non-table-display-inside-table-elements_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-bottom-edge_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-with-borders-bottom-edge_t01: RuntimeError
-LayoutTests/fast/table/html-table-width-max-width-constrained_t01: RuntimeError
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: RuntimeError
-LayoutTests/fast/table/margins-flipped-text-direction_t01: RuntimeError
-LayoutTests/fast/table/min-width-css-block-table_t01: RuntimeError
-LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError
-LayoutTests/fast/table/prepend-in-anonymous-table_t01: RuntimeError
-LayoutTests/fast/table/resize-table-cell_t01: RuntimeError
-LayoutTests/fast/table/resize-table-row_t01: RuntimeError
-LayoutTests/fast/table/rowindex-comment-nodes_t01: RuntimeError
-LayoutTests/fast/table/switch-table-layout-multiple-section_t01: RuntimeError
-LayoutTests/fast/table/switch-table-layout_t01: RuntimeError
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError
-LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError
-LayoutTests/fast/table/table-size-integer-overflow_t01: RuntimeError
-LayoutTests/fast/table/table-with-borderattr-null_t01: RuntimeError
-LayoutTests/fast/table/table-with-borderattr-set-to-null_t01: RuntimeError
-LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError
-LayoutTests/fast/table/td-bordercolor-attribute_t01: RuntimeError
-LayoutTests/fast/text-autosizing/table-inline-width_t01: RuntimeError
-LayoutTests/fast/text-autosizing/text-removal_t01: RuntimeError
-LayoutTests/fast/text/container-align-with-inlines_t01: RuntimeError
-LayoutTests/fast/text/decomposed-after-stacked-diacritics_t01: RuntimeError
-LayoutTests/fast/text/find-case-folding_t01: RuntimeError
-LayoutTests/fast/text/find-hidden-text_t01: RuntimeError
-LayoutTests/fast/text/find-kana_t01: RuntimeError
-LayoutTests/fast/text/find-russian_t01: RuntimeError
-LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError
-LayoutTests/fast/text/font-ligature-letter-spacing_t01: RuntimeError
-LayoutTests/fast/text/font-size-zero_t01: RuntimeError
-LayoutTests/fast/text/glyph-reordering_t01: RuntimeError
-LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError
-LayoutTests/fast/text/line-break-after-empty-inline-hebrew_t01: RuntimeError
-LayoutTests/fast/text/line-breaks-after-closing-punctuations_t01: RuntimeError
-LayoutTests/fast/text/multiglyph-characters_t01: RuntimeError
-LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError
-LayoutTests/fast/text/soft-hyphen-5_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError
-LayoutTests/fast/text/text-combine-first-line-crash_t01: RuntimeError
-LayoutTests/fast/text/text-fragment-first-letter-update-crash_t01: RuntimeError
-LayoutTests/fast/text/window-find_t01: RuntimeError
-LayoutTests/fast/text/zero-width-characters-complex-script_t01: RuntimeError
-LayoutTests/fast/tokenizer/doctype-search-reset_t01: RuntimeError
-LayoutTests/fast/tokenizer/entities_t02: RuntimeError
-LayoutTests/fast/tokenizer/entities_t03: RuntimeError
-LayoutTests/fast/transforms/topmost-becomes-bottomost-for-scrolling_t01: RuntimeError
-LayoutTests/fast/transforms/transform-hit-test-flipped_t01: RuntimeError
-LayoutTests/fast/transforms/transform-inside-overflow-scroll_t01: RuntimeError
-LayoutTests/fast/url/anchor_t01: RuntimeError
-LayoutTests/fast/url/file-http-base_t01: RuntimeError
-LayoutTests/fast/url/file_t01: RuntimeError
-LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError
-LayoutTests/fast/url/idna2003_t01: RuntimeError
-LayoutTests/fast/url/idna2008_t01: RuntimeError
-LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError
-LayoutTests/fast/url/ipv4_t01: RuntimeError
-LayoutTests/fast/url/ipv6_t01: RuntimeError
-LayoutTests/fast/url/mailto_t01: RuntimeError
-LayoutTests/fast/url/path-url_t01: RuntimeError
-LayoutTests/fast/url/path_t01: RuntimeError
-LayoutTests/fast/url/query_t01: RuntimeError
-LayoutTests/fast/url/relative-win_t01: RuntimeError
-LayoutTests/fast/url/relative_t01: RuntimeError
-LayoutTests/fast/url/safari-extension_t01: RuntimeError
-LayoutTests/fast/url/segments_t01: RuntimeError
-LayoutTests/fast/url/standard-url_t01: RuntimeError
-LayoutTests/fast/writing-mode/auto-margins-across-boundaries_t01: RuntimeError
-LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: RuntimeError
-LayoutTests/fast/writing-mode/flipped-blocks-text-map-local-to-container_t01: RuntimeError
-LayoutTests/fast/writing-mode/overhanging-float-legend-crash_t01: RuntimeError
-LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError
-LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError
-LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-html-response-encoding_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-html-document-responsetype-quirks_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-text_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-set-responsetype_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-withcredentials-before-open_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_literal_expr_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_nodeset_expr_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_numeric_expr_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_step_t01: RuntimeError
-LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError
-LayoutTests/fast/xpath/attr-namespace_t01: RuntimeError
-LayoutTests/fast/xpath/attribute-node-predicate_t01: RuntimeError
-LayoutTests/fast/xpath/complex-id_t01: RuntimeError
-LayoutTests/fast/xpath/empty-string-substring_t01: RuntimeError
-LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError
-LayoutTests/fast/xpath/id-path_t01: RuntimeError
-LayoutTests/fast/xpath/id-simple_t01: RuntimeError
-LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError
-LayoutTests/fast/xpath/invalid-resolver_t01: RuntimeError
-LayoutTests/fast/xpath/nan-to-boolean_t01: RuntimeError
-LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError
-LayoutTests/fast/xpath/substring-nan-position_t01: RuntimeError
-LayoutTests/fast/xpath/xpath-detached-nodes_t01: RuntimeError
-LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError
-LayoutTests/fast/xpath/xpath-template-element_t01: RuntimeError
-LayoutTests/fast/xsl/default-html_t01: RuntimeError
-LayoutTests/fast/xsl/extra-lf-at-end_t01: RuntimeError
-LayoutTests/fast/xsl/nbsp-in-stylesheet_t01: RuntimeError
-LayoutTests/fast/xsl/transformToFragment-XML-declaration_t01: RuntimeError
-LayoutTests/fast/xsl/xslt-bad-import-uri_t01: RuntimeError
-LayoutTests/fast/xsl/xslt-fragment-in-empty-doc_t01: RuntimeError
-LayoutTests/fast/xsl/xslt-string-parameters_t01: RuntimeError
-LayoutTests/fast/xsl/xslt-transform-to-fragment-crash_t01: RuntimeError
-LibTest/async/Future/asStream_A01_t02: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t01: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError, Pass
-LibTest/async/Stream/Stream.fromIterable_A03_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A03_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t03: RuntimeError
-LibTest/async/StreamController/addStream_A03_t01: RuntimeError
-LibTest/async/StreamController/stream_A02_t03: RuntimeError
-LibTest/async/StreamController/stream_A03_t02: RuntimeError
-LibTest/async/StreamSink/addStream_A01_t02: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer.fromHandlers_A01_t03: RuntimeError
-LibTest/async/Zone/registerBinaryCallback_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/fold_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t03: RuntimeError
-LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t02: RuntimeError
-LibTest/collection/HashSet/HashSet_A04_t01: RuntimeError
-LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/contains_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/every_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/expand_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/expand_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/fold_A01_t01: RuntimeError
-LibTest/collection/LinkedList/addAll_A01_t02: RuntimeError
-LibTest/collection/LinkedList/join_A01_t01: RuntimeError
-LibTest/collection/LinkedList/toString_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/LinkedListEntry_class_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A02_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/list_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A02_t02: RuntimeError
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError
-LibTest/collection/ListQueue/ListQueue.from_A01_t01: RuntimeError
-LibTest/convert/LineSplitter/fuse_A01_t01: RuntimeError
-LibTest/core/AssertionError/AssertionError_A01_t01: RuntimeError
-LibTest/core/AssertionError/message_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/CyclicInitializationError.class_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/variableName_A01_t01: RuntimeError
-LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecond_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/parse_A01_t03: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t01: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t02: RuntimeError
-LibTest/core/Duration/Duration_A01_t01: CompileTimeError
-LibTest/core/Duration/Duration_A02_t01: CompileTimeError
-LibTest/core/Duration/inDays_A01_t01: CompileTimeError
-LibTest/core/Duration/inHours_A01_t01: CompileTimeError
-LibTest/core/Duration/inMicroseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inMilliseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inSeconds_A01_t01: CompileTimeError
-LibTest/core/Error/stackTrace_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t04: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t05: RuntimeError
-LibTest/core/Function/Function_class_A01_t01: RuntimeError
-LibTest/core/IndexError/stackTrace_A01_t01: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError
-LibTest/core/Runes/any_A01_t01: RuntimeError
-LibTest/core/Runes/every_A01_t01: RuntimeError
-LibTest/core/String/padRight_A01_t01: RuntimeError
-LibTest/core/String/replaceFirstMapped_A03_t01: RuntimeError
-LibTest/core/Symbol/Symbol_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t02: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t05: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t01: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A02_t03: RuntimeError
-LibTest/core/Uri/Uri.file_A02_t03: RuntimeError
-LibTest/core/Uri/queryParametersAll_A01_t04: RuntimeError
-LibTest/core/Uri/queryParametersAll_A03_t01: RuntimeError
-LibTest/core/UriData/UriData.fromBytes_A01_t03: RuntimeError
-LibTest/core/UriData/charset_A01_t01: RuntimeError
-LibTest/core/UriData/contentText_A01_t01: RuntimeError
-LibTest/core/UriData/parse_A01_t01: RuntimeError
-LibTest/core/double/INFINITY_A01_t04: RuntimeError
-LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError
-LibTest/core/double/isInfinite_A01_t03: CompileTimeError
-LibTest/core/double/operator_GE_A01_t02: CompileTimeError
-LibTest/core/double/operator_GT_A01_t02: CompileTimeError
-LibTest/core/double/operator_LT_A01_t02: CompileTimeError
-LibTest/core/double/operator_addition_A01_t08: Crash
-LibTest/core/double/operator_subtraction_A01_t06: RuntimeError
-LibTest/core/double/operator_subtraction_A01_t09: Crash
-LibTest/core/int/ceil_A01_t01: CompileTimeError
-LibTest/core/int/compareTo_A01_t01: CompileTimeError
-LibTest/core/int/floorToDouble_A01_t01: CompileTimeError
-LibTest/core/int/floor_A01_t01: CompileTimeError
-LibTest/core/int/hashCode_A01_t01: CompileTimeError
-LibTest/core/int/isInfinite_A01_t01: CompileTimeError
-LibTest/core/int/isNegative_A01_t01: CompileTimeError
-LibTest/core/int/isOdd_A01_t01: RuntimeError
-LibTest/core/int/operator_AND_A01_t01: CompileTimeError
-LibTest/core/int/operator_GE_A01_t01: CompileTimeError
-LibTest/core/int/operator_LT_A01_t01: CompileTimeError
-LibTest/core/int/operator_XOR_A01_t01: CompileTimeError
-LibTest/core/int/operator_addition_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A03_t01: CompileTimeError
-LibTest/core/int/operator_left_shift_A01_t01: RuntimeError
-LibTest/core/int/operator_remainder_A01_t03: RuntimeError
-LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError
-LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError
-LibTest/core/int/parse_A03_t02: CompileTimeError
-LibTest/core/int/roundToDouble_A01_t01: CompileTimeError
-LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError
-LibTest/html/Element/focus_A01_t01: RuntimeError
-LibTest/typed_data/Float64List/shuffle_A01_t01: RuntimeError, Pass
-Utils/tests/Expect/throws_A01_t04: RuntimeError
-WebPlatformTest/DOMEvents/approved/Event.bubbles.false_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/EventObject.multiple.dispatchEvent_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError
-WebPlatformTest/DOMEvents/approved/stopPropagation.deferred.effect_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError
-WebPlatformTest/Utils/test/asyncTestPass_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError
-WebPlatformTest/dom/collections/emptyName_A01_t02: RuntimeError
-WebPlatformTest/dom/collections/emptyName_A01_t05: RuntimeError
-WebPlatformTest/dom/events/defaultPrevented_A01_t06: RuntimeError
-WebPlatformTest/dom/events/event_constructors/Event_A01_t01: RuntimeError
-WebPlatformTest/dom/events/propagation_A01_t01: RuntimeError
-WebPlatformTest/dom/events/type_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/deleteData_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/insertData_A02_t01: RuntimeError
-WebPlatformTest/dom/nodes/CharacterData/remove_A02_t02: RuntimeError
-WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-createElementNS_t02: RuntimeError
-WebPlatformTest/dom/nodes/DocumentType-remove_t01: RuntimeError
-WebPlatformTest/dom/nodes/Element-childElementCount-dynamic-remove_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-contains_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-parentElement_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-parentNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-textContent_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/attributes_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/attributes_A02_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/attributes_A04_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/attributes_A05_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A03_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A04_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A06_t02: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A09_t02: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A10_t02: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A02_t02: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A04_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A06_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A07_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A08_t01: RuntimeError
-WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError
-WebPlatformTest/html-imports/link-import_t02: RuntimeError
-WebPlatformTest/html-imports/loading-import_t01: RuntimeError
-WebPlatformTest/html-templates/additions-to-the-steps-to-clone-a-node/template-clone-children_t01: RuntimeError
-WebPlatformTest/html-templates/definitions/template-contents-owner-document-type_t01: RuntimeError
-WebPlatformTest/html-templates/definitions/template-contents_t01: RuntimeError
-WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-foster-parenting/template-is-a-foster-parent-element_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-body-token_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-frameset-token_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-body-insertion-mode/ignore-html-token_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-table-insertion-mode/end-tag-table_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/appending-to-a-template/template-child-nodes_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError
-WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/Element.getElementsByClassName-null_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-newelements_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.head_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.head_t02: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t04: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t05: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t06: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/dataset-enumeration_t01: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/id-name_t01: RuntimeError
-WebPlatformTest/html/semantics/disabled-elements/disabledElement_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/default_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/label_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/track_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/the-audio-element/audio_constructor_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/selection-not-application-textarea_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-nameditem_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/color_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/input-type-button_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/input-type-checkbox_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/mobiles_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/pattern_attribute_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/telephone_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/url_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-textarea-element/textarea-type_t01: RuntimeError
-WebPlatformTest/html/semantics/grouping-content/the-li-element/grouping-li_t01: RuntimeError
-WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t01: RuntimeError
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/inrange-outofrange_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/link_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/required-optional_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/valid-invalid_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/attributes-common-to-td-and-th-elements/cellIndex_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/caption-methods_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/createTBody_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/insertRow-method_t02: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-insertRow_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError
-WebPlatformTest/html/semantics/text-level-semantics/the-a-element/a.text-getter_t01: RuntimeError
-WebPlatformTest/html/semantics/text-level-semantics/the-a-element/a.text-setter_t01: RuntimeError
-WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t01: RuntimeError, Pass
-WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-006_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-006_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError
-WebPlatformTest/webstorage/event_constructor_t02: RuntimeError
-WebPlatformTest/webstorage/event_local_newvalue_t01: RuntimeError
-WebPlatformTest/webstorage/event_local_storageeventinit_t01: RuntimeError
-WebPlatformTest/webstorage/event_session_url_t01: RuntimeError
-WebPlatformTest/webstorage/storage_local_remove_t01: RuntimeError
-WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: RuntimeError
-WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError
-WebPlatformTest/webstorage/storage_session_getitem_t02: RuntimeError
-WebPlatformTest/webstorage/storage_session_length_t01: RuntimeError
-WebPlatformTest/webstorage/storage_session_removeitem_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime == d8 && $system == linux && !$fast_startup ]
-LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError
-LayoutTests/fast/events/input-focus-no-duplicate-events_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime == ff ]
-Language/Expressions/Additive_Expressions/syntax_t01: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
-Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/exception_t02/01: CompileTimeError
-Language/Expressions/Constants/integer_size_t03: CompileTimeError
-Language/Expressions/Constants/integer_size_t04: CompileTimeError
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Timeout
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Timeout
-Language/Expressions/Identifier_Reference/evaluation_variable_or_parameter_t02: RuntimeError
-Language/Expressions/If_null_Expressions/static_type_t01: RuntimeError
-Language/Expressions/Lists/identical_t02: RuntimeError
-Language/Expressions/Maps/identical_t02: RuntimeError
-Language/Expressions/Null/instance_of_class_null_t01: RuntimeError
-Language/Expressions/Numbers/syntax_t06: CompileTimeError
-Language/Expressions/Numbers/syntax_t09: CompileTimeError
-Language/Expressions/Object_Identity/double_t02: RuntimeError
-Language/Expressions/Shift/integer_t02: CompileTimeError
-Language/Expressions/Type_Cast/syntax_t01: RuntimeError
-Language/Expressions/Unary_Expressions/variable_negative_t03: RuntimeError
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: CompileTimeError
-Language/Libraries_and_Scripts/top_level_syntax_t01: CompileTimeError
-Language/Metadata/before_ctor_t02: RuntimeError
-Language/Metadata/before_function_t01: RuntimeError
-Language/Metadata/before_function_t02: RuntimeError
-Language/Metadata/before_function_t03: RuntimeError
-Language/Metadata/before_function_t04: RuntimeError
-Language/Metadata/before_function_t07: RuntimeError
-Language/Metadata/before_import_t01: RuntimeError
-Language/Metadata/before_param_t03: RuntimeError
-Language/Metadata/before_param_t05: RuntimeError
-Language/Metadata/before_param_t07: RuntimeError
-Language/Metadata/before_param_t09: RuntimeError
-Language/Metadata/before_variable_t02: RuntimeError
-Language/Overview/Privacy/private_and_public_t18: RuntimeError
-Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: RuntimeError
-Language/Statements/Assert/execution_t09: RuntimeError
-Language/Types/Function_Types/call_t01: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t03: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t11: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t01: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t04: RuntimeError
-Language/Types/Interface_Types/subtype_t06: RuntimeError
-Language/Types/Interface_Types/subtype_t21: RuntimeError
-Language/Types/Interface_Types/subtype_t23: RuntimeError
-Language/Variables/constant_variable_t09: RuntimeError
-LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_FutureOr_l1_t05: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t05: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t10: RuntimeError, Pass
-LanguageFeatures/Simple-bounds/dynamic/typedef_typedef_l1_t05: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_return_value_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LayoutTests/fast/animation/request-animation-frame-cancel_t01: Timeout, Pass
-LayoutTests/fast/animation/request-animation-frame-timestamps-advance_t01: Timeout, Pass
-LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError
-LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError
-LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError
-LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError
-LayoutTests/fast/borders/border-width-percent_t01: RuntimeError
-LayoutTests/fast/canvas/2d.composite.globalAlpha.fillPath_t01: RuntimeError
-LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError
-LayoutTests/fast/canvas/DrawImageSinglePixelStretch_t01: Timeout
-LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillRect-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillText-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-font-ex-units-crash_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-rounding_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: Timeout, Pass
-LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-resize-after-paint_t01: Timeout, Pass
-LayoutTests/fast/canvas/canvas-scale-fillPath-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-shadowBlur_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-stroke-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokePath-gradient-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeRect-alpha-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeRect-gradient-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-toDataURL-crash_t01: RuntimeError
-LayoutTests/fast/canvas/drawImage-with-valid-image_t01: Timeout
-LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError
-LayoutTests/fast/canvas/gradient-addColorStop-with-invalid-color_t01: RuntimeError
-LayoutTests/fast/canvas/rgba-parsing_t01: RuntimeError
-LayoutTests/fast/canvas/setWidthResetAfterForcedRender_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-get-calls_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: Timeout
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: Timeout
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: Timeout
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: Timeout
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError
-LayoutTests/fast/css-generated-content/bug91547_t01: RuntimeError
-LayoutTests/fast/css-generated-content/details-before-after-content_t01: RuntimeError
-LayoutTests/fast/css-generated-content/malformed-url_t01: Timeout, RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-animation-before-onload_t01: RuntimeError, Pass
-LayoutTests/fast/css-generated-content/pseudo-animation_t01: RuntimeError, Pass
-LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Timeout
-LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Timeout
-LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-column-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError
-LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError
-LayoutTests/fast/css/auto-min-size_t01: RuntimeError
-LayoutTests/fast/css/background-serialize_t01: RuntimeError
-LayoutTests/fast/css/border-image-null-image-crash_t01: RuntimeError
-LayoutTests/fast/css/border-image-style-length_t01: RuntimeError
-LayoutTests/fast/css/border-shorthand-initialize-longhands_t01: RuntimeError
-LayoutTests/fast/css/border-start-end_t01: RuntimeError
-LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError
-LayoutTests/fast/css/content/content-none_t01: RuntimeError
-LayoutTests/fast/css/counters/complex-before_t01: RuntimeError
-LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError
-LayoutTests/fast/css/cursor-parsing_t01: RuntimeError
-LayoutTests/fast/css/device-aspect-ratio_t01: RuntimeError
-LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError
-LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_t01: RuntimeError
-LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError, Pass
-LayoutTests/fast/css/font-face-insert-link_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError
-LayoutTests/fast/css/font-property-priority_t01: RuntimeError
-LayoutTests/fast/css/fontface-properties_t01: RuntimeError
-LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-border-image_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-style-shorthand_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-borderRadius-2_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-length-unit_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-zIndex-auto_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-column-rule_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-webkit-margin-collapse_t01: RuntimeError
-LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError
-LayoutTests/fast/css/image-set-setting_t01: RuntimeError
-LayoutTests/fast/css/implicit-attach-marking_t01: Timeout, Pass
-LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError
-LayoutTests/fast/css/insertRule-media_t01: RuntimeError
-LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError
-LayoutTests/fast/css/invalidation/dynamic-selector-list-pseudo_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError
-LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError
-LayoutTests/fast/css/media-query-recovery_t01: RuntimeError
-LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError
-LayoutTests/fast/css/nested-at-rules_t01: RuntimeError
-LayoutTests/fast/css/overflow-property_t01: RuntimeError
-LayoutTests/fast/css/padding-start-end_t01: RuntimeError
-LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError
-LayoutTests/fast/css/percent-min-width-img-src-change_t01: Timeout
-LayoutTests/fast/css/pseudo-required-optional-004_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-005_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-unapplied_t01: RuntimeError
-LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Timeout
-LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Timeout
-LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError
-LayoutTests/fast/css/sheet-collection-link_t01: RuntimeError
-LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError
-LayoutTests/fast/css/space-before-charset-external_t01: RuntimeError
-LayoutTests/fast/css/style-element-process-crash_t01: Timeout
-LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-link_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError
-LayoutTests/fast/css/text-align-webkit-match-parent_t01: RuntimeError
-LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError
-LayoutTests/fast/css/webkit-color-adjust_t01: RuntimeError
-LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError
-LayoutTests/fast/css/zoom-property-parsing_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError
-LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError
-LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError
-LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: RuntimeError
-LayoutTests/fast/dom/Element/scrollWidth_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Timeout, Pass
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-port_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError
-LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: RuntimeError
-LayoutTests/fast/dom/HTMLButtonElement/value/getset_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Timeout, RuntimeError
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Timeout
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/translate_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-natural-width-height_t01: Timeout
-LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/click-label_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Timeout
-LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError
-LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Timeout
-LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-validity_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/indeterminate-progress-002_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/set-progress-properties_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-reexecution_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Timeout
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableSectionElement/rows_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: Timeout
-LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/added-out-of-order_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/removed-out-of-order_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError
-LayoutTests/fast/dom/Range/getClientRects-character_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-assertion_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/anchor-origin_t01: RuntimeError
-LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError
-LayoutTests/fast/dom/containerNode_t01: Timeout
-LayoutTests/fast/dom/css-cached-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-delete-doc_t01: RuntimeError
-LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule-twice_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError
-LayoutTests/fast/dom/css-selectorText_t01: RuntimeError, Pass
-LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError
-LayoutTests/fast/dom/cssTarget-crash_t01: RuntimeError, Pass
-LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/invalid-type-extension-crash_t01: RuntimeError
-LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError
-LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError
-LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError
-LayoutTests/fast/dom/dom-parse-serialize-xmldecl_t01: RuntimeError
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError
-LayoutTests/fast/dom/empty-hash-and-search_t01: RuntimeError
-LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError, Pass
-LayoutTests/fast/dom/gc-image-element-2_t01: Timeout
-LayoutTests/fast/dom/gc-image-element_t01: Timeout
-LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError
-LayoutTests/fast/dom/image-object_t01: Timeout
-LayoutTests/fast/dom/javascript-backslash_t01: RuntimeError
-LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError
-LayoutTests/fast/dom/location-hash_t01: RuntimeError
-LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError
-LayoutTests/fast/dom/non-styled-element-id-crash_t01: RuntimeError
-LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError
-LayoutTests/fast/dom/remove-body-during-body-replacement_t01: Timeout
-LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError
-LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError
-LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError
-LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError
-LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError
-LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError
-LayoutTests/fast/dynamic/checkbox-selection-crash_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError
-LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Timeout
-LayoutTests/fast/events/clipboard-clearData_t01: Timeout
-LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Timeout
-LayoutTests/fast/events/event-creation_t01: RuntimeError
-LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError
-LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError
-LayoutTests/fast/events/fire-scroll-event_t01: RuntimeError, Timeout
-LayoutTests/fast/events/init-message-event_t01: RuntimeError
-LayoutTests/fast/events/input-focus-no-duplicate-events_t01: RuntimeError, Pass
-LayoutTests/fast/events/invalid-002_t01: RuntimeError
-LayoutTests/fast/events/invalid-003_t01: RuntimeError
-LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError
-LayoutTests/fast/events/nested-event-remove-node-crash_t01: Timeout
-LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError
-LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError
-LayoutTests/fast/events/scroll-during-zoom-change_t01: Timeout, Pass
-LayoutTests/fast/events/scroll-event-phase_t01: Timeout, Pass
-LayoutTests/fast/events/selectstart-on-selectall_t01: RuntimeError
-LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError
-LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError
-LayoutTests/fast/files/blob-close-read_t01: RuntimeError
-LayoutTests/fast/files/blob-constructor_t01: RuntimeError
-LayoutTests/fast/files/read-blob-as-array-buffer_t01: RuntimeError
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError
-LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-after-reload-crash_t01: RuntimeError
-LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError
-LayoutTests/fast/filesystem/op-copy_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError
-LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError
-LayoutTests/fast/filesystem/read-directory_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError
-LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-typeMismatch-url_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-004_t01: RuntimeError
-LayoutTests/fast/forms/autocomplete_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-focus-only-once_t01: Timeout
-LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Timeout
-LayoutTests/fast/forms/autofocus-opera-004_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-opera-007_t01: Timeout
-LayoutTests/fast/forms/autofocus-readonly-attribute_t01: Timeout
-LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError, Pass
-LayoutTests/fast/forms/date/ValidityState-typeMismatch-date_t01: RuntimeError
-LayoutTests/fast/forms/date/date-interactive-validation-required_t01: RuntimeError, Pass
-LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError
-LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-interactive-validation-required_t01: RuntimeError, Pass
-LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/fieldset-disabled_t01: RuntimeError
-LayoutTests/fast/forms/focus-style-pending_t01: Timeout, Pass
-LayoutTests/fast/forms/focus_t01: RuntimeError
-LayoutTests/fast/forms/form-attribute-nonexistence-form-id_t01: RuntimeError
-LayoutTests/fast/forms/formmethod-attribute-button-html_t01: RuntimeError, Pass
-LayoutTests/fast/forms/formmethod-attribute-input-2_t01: RuntimeError, Pass
-LayoutTests/fast/forms/incremental-dom-property_t01: RuntimeError
-LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError
-LayoutTests/fast/forms/input-appearance-maxlength_t01: RuntimeError
-LayoutTests/fast/forms/input-changing-value_t01: RuntimeError
-LayoutTests/fast/forms/input-file-set-value_t01: RuntimeError
-LayoutTests/fast/forms/input-implicit-length-limit_t01: RuntimeError
-LayoutTests/fast/forms/input-inputmode_t01: RuntimeError
-LayoutTests/fast/forms/input-maxlength-unsupported_t01: RuntimeError
-LayoutTests/fast/forms/input-type-change_t01: RuntimeError
-LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError
-LayoutTests/fast/forms/input-width-height-attributes_t01: RuntimeError
-LayoutTests/fast/forms/listbox-select-all_t01: RuntimeError
-LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError
-LayoutTests/fast/forms/missing-action_t01: RuntimeError, Pass
-LayoutTests/fast/forms/onchange-change-type_t01: RuntimeError
-LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError
-LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError
-LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError
-LayoutTests/fast/forms/paste-into-textarea_t01: RuntimeError
-LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError
-LayoutTests/fast/forms/select-change-popup-to-listbox-in-event-handler_t01: Timeout
-LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError
-LayoutTests/fast/forms/selection-direction_t01: RuntimeError
-LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError
-LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError
-LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-ancestor-dir-attribute_t01: RuntimeError, Pass
-LayoutTests/fast/forms/submit-form-with-dirname-attribute_t01: RuntimeError, Pass
-LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError
-LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError
-LayoutTests/fast/forms/textarea-submit-crash_t01: RuntimeError, Pass
-LayoutTests/fast/forms/textarea-trailing-newline_t01: RuntimeError
-LayoutTests/fast/forms/textfield-focus-out_t01: Timeout, Pass
-LayoutTests/fast/forms/validationMessage_t01: RuntimeError
-LayoutTests/fast/forms/willvalidate_t01: RuntimeError
-LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError
-LayoutTests/fast/html/article-element_t01: RuntimeError
-LayoutTests/fast/html/details-add-child-2_t01: RuntimeError
-LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError
-LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError
-LayoutTests/fast/html/details-click-controls_t01: RuntimeError
-LayoutTests/fast/html/figure-element_t01: RuntimeError
-LayoutTests/fast/html/header-element_t01: RuntimeError
-LayoutTests/fast/html/hgroup-element_t01: RuntimeError
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Timeout
-LayoutTests/fast/html/main-element_t01: RuntimeError
-LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError
-LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError
-LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError
-LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError
-LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError
-LayoutTests/fast/loader/about-blank-hash-change_t01: RuntimeError
-LayoutTests/fast/loader/about-blank-hash-kept_t01: RuntimeError
-LayoutTests/fast/loader/local-css-allowed-in-strict-mode_t01: RuntimeError
-LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Timeout
-LayoutTests/fast/loader/scroll-position-restored-on-back_t01: Timeout
-LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError
-LayoutTests/fast/masking/parsing-mask_t01: RuntimeError
-LayoutTests/fast/media/invalid-lengths_t01: RuntimeError
-LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError
-LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError
-LayoutTests/fast/media/mq-append-delete_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError
-LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError
-LayoutTests/fast/multicol/cssom-view_t01: RuntimeError
-LayoutTests/fast/multicol/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/gap-non-negative_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError
-LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError
-LayoutTests/fast/multicol/inline-getclientrects_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/widows_t01: RuntimeError
-LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError
-LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError
-LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError
-LayoutTests/fast/parser/stray-param_t01: RuntimeError
-LayoutTests/fast/parser/strict-img-in-map_t01: RuntimeError
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError
-LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError
-LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError
-LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/parsing/parsing-shape-outside-none_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: Timeout
-LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: Timeout, RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: Timeout
-LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: Timeout
-LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-length_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-number_t01: RuntimeError
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: RuntimeError
-LayoutTests/fast/table/min-width-css-block-table_t01: RuntimeError
-LayoutTests/fast/table/table-size-integer-overflow_t01: RuntimeError
-LayoutTests/fast/table/td-bordercolor-attribute_t01: RuntimeError
-LayoutTests/fast/text/find-kana_t01: RuntimeError
-LayoutTests/fast/text/find-russian_t01: RuntimeError
-LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError
-LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError
-LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError
-LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError
-LayoutTests/fast/text/window-find_t01: RuntimeError
-LayoutTests/fast/text/zero-width-characters-complex-script_t01: RuntimeError
-LayoutTests/fast/url/anchor_t01: RuntimeError
-LayoutTests/fast/url/file-http-base_t01: RuntimeError
-LayoutTests/fast/url/file_t01: RuntimeError
-LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError
-LayoutTests/fast/url/idna2003_t01: RuntimeError
-LayoutTests/fast/url/idna2008_t01: RuntimeError
-LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError
-LayoutTests/fast/url/ipv4_t01: RuntimeError
-LayoutTests/fast/url/ipv6_t01: RuntimeError
-LayoutTests/fast/url/mailto_t01: RuntimeError, Pass
-LayoutTests/fast/url/path_t01: RuntimeError
-LayoutTests/fast/url/query_t01: RuntimeError
-LayoutTests/fast/url/relative-win_t01: RuntimeError
-LayoutTests/fast/url/relative_t01: RuntimeError
-LayoutTests/fast/url/segments_t01: RuntimeError
-LayoutTests/fast/url/standard-url_t01: RuntimeError
-LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: RuntimeError
-LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError
-LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError
-LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-html-document-responsetype-quirks_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError
-LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError
-LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError
-LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError
-LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError
-LayoutTests/fast/xsl/default-html_t01: RuntimeError
-LibTest/async/Future/Future.delayed_A01_t02: RuntimeError, Pass
-LibTest/async/Future/asStream_A01_t02: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t01: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError
-LibTest/async/Stream/Stream.fromIterable_A03_t01: RuntimeError, Timeout, Pass
-LibTest/async/Stream/Stream.fromIterable_A03_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A01_t01: RuntimeError, Pass
-LibTest/async/Stream/Stream.periodic_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A03_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t01: Timeout, Pass
-LibTest/async/StreamController/StreamController.broadcast_A09_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t03: RuntimeError
-LibTest/async/StreamController/addStream_A03_t01: RuntimeError
-LibTest/async/StreamController/stream_A02_t01: Timeout, Pass
-LibTest/async/StreamController/stream_A02_t03: RuntimeError
-LibTest/async/StreamController/stream_A03_t01: Timeout, Pass
-LibTest/async/StreamController/stream_A03_t02: RuntimeError
-LibTest/async/StreamSink/addStream_A01_t02: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer.fromHandlers_A01_t03: RuntimeError
-LibTest/async/Zone/registerBinaryCallback_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/fold_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t03: RuntimeError
-LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t02: RuntimeError
-LibTest/collection/HashSet/HashSet_A04_t01: RuntimeError
-LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/contains_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/every_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/expand_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/expand_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/fold_A01_t01: RuntimeError
-LibTest/collection/LinkedList/addAll_A01_t02: RuntimeError
-LibTest/collection/LinkedList/join_A01_t01: RuntimeError
-LibTest/collection/LinkedList/toString_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/LinkedListEntry_class_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A02_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/list_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A02_t02: RuntimeError
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError
-LibTest/collection/ListQueue/ListQueue.from_A01_t01: RuntimeError
-LibTest/convert/LineSplitter/fuse_A01_t01: RuntimeError
-LibTest/core/AssertionError/AssertionError_A01_t01: RuntimeError
-LibTest/core/AssertionError/message_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/CyclicInitializationError.class_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/variableName_A01_t01: RuntimeError
-LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecond_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/parse_A01_t03: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t01: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t02: RuntimeError
-LibTest/core/Duration/Duration_A01_t01: CompileTimeError
-LibTest/core/Duration/Duration_A02_t01: CompileTimeError
-LibTest/core/Duration/inDays_A01_t01: CompileTimeError
-LibTest/core/Duration/inHours_A01_t01: CompileTimeError
-LibTest/core/Duration/inMicroseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inMilliseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inSeconds_A01_t01: CompileTimeError
-LibTest/core/Error/stackTrace_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t04: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t05: RuntimeError
-LibTest/core/Function/Function_class_A01_t01: RuntimeError
-LibTest/core/IndexError/stackTrace_A01_t01: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError
-LibTest/core/Runes/any_A01_t01: RuntimeError
-LibTest/core/Runes/every_A01_t01: RuntimeError
-LibTest/core/String/padRight_A01_t01: RuntimeError
-LibTest/core/String/replaceFirstMapped_A03_t01: RuntimeError
-LibTest/core/Symbol/Symbol_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t02: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t05: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t01: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A02_t03: RuntimeError
-LibTest/core/Uri/Uri.file_A02_t03: RuntimeError
-LibTest/core/Uri/Uri_A06_t03: Timeout, Pass
-LibTest/core/Uri/decodeComponent_A01_t02: Timeout, Pass
-LibTest/core/Uri/encodeQueryComponent_A01_t02: Timeout, Pass
-LibTest/core/Uri/queryParametersAll_A01_t04: RuntimeError
-LibTest/core/Uri/queryParametersAll_A03_t01: RuntimeError
-LibTest/core/UriData/UriData.fromBytes_A01_t03: RuntimeError
-LibTest/core/UriData/charset_A01_t01: RuntimeError
-LibTest/core/UriData/contentText_A01_t01: RuntimeError
-LibTest/core/UriData/parse_A01_t01: RuntimeError
-LibTest/core/double/INFINITY_A01_t04: RuntimeError
-LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError
-LibTest/core/double/isInfinite_A01_t03: CompileTimeError
-LibTest/core/double/operator_GE_A01_t02: CompileTimeError
-LibTest/core/double/operator_GT_A01_t02: CompileTimeError
-LibTest/core/double/operator_LT_A01_t02: CompileTimeError
-LibTest/core/double/operator_addition_A01_t08: Crash
-LibTest/core/double/operator_subtraction_A01_t06: RuntimeError
-LibTest/core/double/operator_subtraction_A01_t09: Crash
-LibTest/core/int/ceil_A01_t01: CompileTimeError
-LibTest/core/int/compareTo_A01_t01: CompileTimeError
-LibTest/core/int/floorToDouble_A01_t01: CompileTimeError
-LibTest/core/int/floor_A01_t01: CompileTimeError
-LibTest/core/int/hashCode_A01_t01: CompileTimeError
-LibTest/core/int/isInfinite_A01_t01: CompileTimeError
-LibTest/core/int/isNegative_A01_t01: CompileTimeError
-LibTest/core/int/isOdd_A01_t01: RuntimeError
-LibTest/core/int/operator_AND_A01_t01: CompileTimeError
-LibTest/core/int/operator_GE_A01_t01: CompileTimeError
-LibTest/core/int/operator_LT_A01_t01: CompileTimeError
-LibTest/core/int/operator_XOR_A01_t01: CompileTimeError
-LibTest/core/int/operator_addition_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A03_t01: CompileTimeError
-LibTest/core/int/operator_left_shift_A01_t01: RuntimeError
-LibTest/core/int/operator_remainder_A01_t03: RuntimeError
-LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError
-LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError
-LibTest/core/int/parse_A03_t02: CompileTimeError
-LibTest/core/int/roundToDouble_A01_t01: CompileTimeError
-LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: Timeout
-LibTest/html/Element/blur_A01_t01: Timeout, Pass
-LibTest/html/Element/focus_A01_t01: Timeout, Pass
-LibTest/html/Element/loadEvent_A01_t01: Timeout
-LibTest/html/Element/mouseEnterEvent_A01_t01: RuntimeError, Pass
-LibTest/html/Element/mouseOverEvent_A01_t01: RuntimeError, Pass
-LibTest/html/Element/mouseWheelEvent_A01_t01: Timeout
-LibTest/html/Element/onLoad_A01_t01: Timeout
-LibTest/html/Element/onMouseWheel_A01_t01: Timeout
-LibTest/html/HttpRequest/responseText_A01_t02: Timeout
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onError_A01_t02: Timeout
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Timeout
-LibTest/html/IFrameElement/enteredView_A01_t01: Timeout
-LibTest/html/IFrameElement/focus_A01_t01: Timeout
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: Timeout
-LibTest/typed_data/Int16List/shuffle_A01_t01: RuntimeError, Pass
-Utils/tests/Expect/throws_A01_t04: RuntimeError
-WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Timeout
-WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Timeout
-WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError
-WebPlatformTest/dom/events/type_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-isEqualNode_t01: Timeout
-WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError
-WebPlatformTest/html-imports/link-import_t02: RuntimeError
-WebPlatformTest/html-imports/loading-import_t01: RuntimeError
-WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-newelements_t01: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Timeout
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: Timeout
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-nameditem_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/input-type-button_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/mobiles_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-textarea-element/textarea-type_t01: RuntimeError
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError, Pass
-WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/attributes-common-to-td-and-th-elements/cellIndex_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError
-WebPlatformTest/webstorage/event_constructor_t02: RuntimeError
-WebPlatformTest/webstorage/event_local_key_t01: Timeout
-WebPlatformTest/webstorage/event_local_newvalue_t01: Timeout
-WebPlatformTest/webstorage/event_local_oldvalue_t01: Timeout
-WebPlatformTest/webstorage/event_local_storagearea_t01: Timeout
-WebPlatformTest/webstorage/event_local_url_t01: Timeout
-WebPlatformTest/webstorage/event_session_key_t01: Timeout
-WebPlatformTest/webstorage/event_session_newvalue_t01: Timeout
-WebPlatformTest/webstorage/event_session_oldvalue_t01: Timeout
-WebPlatformTest/webstorage/event_session_storagearea_t01: Timeout
-WebPlatformTest/webstorage/event_session_url_t01: Timeout
-WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime == ff && $system == windows ]
-LayoutTests/fast/css/font-face-multiple-ranges-for-unicode-range_t01: RuntimeError
-LayoutTests/fast/svg/getbbox_t01: RuntimeError
-LibTest/html/Window/close_A01_t01: RuntimeError, Pass
-LibTest/math/cos_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/shuffle_A01_t01: RuntimeError, Pass
-
-[ $compiler == dart2js && $runtime == ff && $fast_startup ]
-Language/Expressions/Additive_Expressions/syntax_t01: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
-Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/exception_t02/01: CompileTimeError
-Language/Expressions/Constants/integer_size_t03: CompileTimeError
-Language/Expressions/Constants/integer_size_t04: CompileTimeError
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Timeout
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Timeout
-Language/Expressions/Identifier_Reference/evaluation_variable_or_parameter_t02: RuntimeError
-Language/Expressions/If_null_Expressions/static_type_t01: RuntimeError
-Language/Expressions/Lists/identical_t02: RuntimeError
-Language/Expressions/Maps/identical_t02: RuntimeError
-Language/Expressions/Null/instance_of_class_null_t01: RuntimeError
-Language/Expressions/Numbers/syntax_t06: CompileTimeError
-Language/Expressions/Numbers/syntax_t09: CompileTimeError
-Language/Expressions/Object_Identity/double_t02: RuntimeError
-Language/Expressions/Shift/integer_t02: CompileTimeError
-Language/Expressions/Type_Cast/syntax_t01: RuntimeError
-Language/Expressions/Unary_Expressions/variable_negative_t03: RuntimeError
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: CompileTimeError
-Language/Libraries_and_Scripts/top_level_syntax_t01: CompileTimeError
-Language/Metadata/before_ctor_t02: RuntimeError
-Language/Metadata/before_function_t01: RuntimeError
-Language/Metadata/before_function_t02: RuntimeError
-Language/Metadata/before_function_t03: RuntimeError
-Language/Metadata/before_function_t04: RuntimeError
-Language/Metadata/before_function_t07: RuntimeError
-Language/Metadata/before_import_t01: RuntimeError
-Language/Metadata/before_param_t03: RuntimeError
-Language/Metadata/before_param_t05: RuntimeError
-Language/Metadata/before_param_t07: RuntimeError
-Language/Metadata/before_param_t09: RuntimeError
-Language/Metadata/before_variable_t02: RuntimeError
-Language/Overview/Privacy/private_and_public_t18: RuntimeError
-Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: RuntimeError
-Language/Statements/Assert/execution_t09: RuntimeError
-Language/Types/Function_Types/call_t01: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t03: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t11: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t01: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t04: RuntimeError
-Language/Types/Interface_Types/subtype_t06: RuntimeError
-Language/Types/Interface_Types/subtype_t21: RuntimeError
-Language/Types/Interface_Types/subtype_t23: RuntimeError
-Language/Variables/constant_variable_t09: RuntimeError
-LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_return_value_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LayoutTests/fast/animation/request-animation-frame-prefix_t01: Timeout, Pass
-LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError
-LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError
-LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError
-LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError
-LayoutTests/fast/borders/border-width-percent_t01: RuntimeError
-LayoutTests/fast/canvas/2d.composite.globalAlpha.fillPath_t01: RuntimeError
-LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError
-LayoutTests/fast/canvas/DrawImageSinglePixelStretch_t01: Timeout
-LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillRect-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillText-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-font-ex-units-crash_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-rounding_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-imageSmoothingEnabled-repaint_t01: Timeout, Pass
-LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-fillPath-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-shadowBlur_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-stroke-zeroSizeGradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokePath-gradient-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeRect-alpha-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-strokeRect-gradient-shadow_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-toDataURL-crash_t01: RuntimeError
-LayoutTests/fast/canvas/drawImage-with-valid-image_t01: Timeout
-LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError
-LayoutTests/fast/canvas/gradient-addColorStop-with-invalid-color_t01: RuntimeError
-LayoutTests/fast/canvas/rgba-parsing_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/framebuffer-bindings-unaffected-on-resize_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: Timeout
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-vertex-array-object_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: Timeout
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: Timeout
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: Timeout
-LayoutTests/fast/canvas/webgl/webgl-layer-update_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError
-LayoutTests/fast/css-generated-content/bug91547_t01: RuntimeError
-LayoutTests/fast/css-generated-content/details-before-after-content_t01: RuntimeError
-LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-animation_t01: RuntimeError, Pass
-LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Timeout
-LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Timeout
-LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-column-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError
-LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError
-LayoutTests/fast/css/auto-min-size_t01: RuntimeError
-LayoutTests/fast/css/background-serialize_t01: RuntimeError
-LayoutTests/fast/css/border-image-null-image-crash_t01: RuntimeError
-LayoutTests/fast/css/border-image-style-length_t01: RuntimeError
-LayoutTests/fast/css/border-shorthand-initialize-longhands_t01: RuntimeError
-LayoutTests/fast/css/border-start-end_t01: RuntimeError
-LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError
-LayoutTests/fast/css/content/content-none_t01: RuntimeError
-LayoutTests/fast/css/counters/complex-before_t01: RuntimeError
-LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError
-LayoutTests/fast/css/cursor-parsing_t01: RuntimeError
-LayoutTests/fast/css/device-aspect-ratio_t01: RuntimeError
-LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError
-LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_t01: RuntimeError
-LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError
-LayoutTests/fast/css/font-face-insert-link_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-load_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: RuntimeError
-LayoutTests/fast/css/font-property-priority_t01: RuntimeError
-LayoutTests/fast/css/fontface-properties_t01: RuntimeError
-LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-border-image_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-border-style-shorthand_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-borderRadius-2_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-length-unit_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-zIndex-auto_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-column-rule_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-webkit-margin-collapse_t01: RuntimeError
-LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError
-LayoutTests/fast/css/image-set-setting_t01: RuntimeError
-LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError
-LayoutTests/fast/css/insertRule-media_t01: RuntimeError
-LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError
-LayoutTests/fast/css/invalidation/dynamic-selector-list-pseudo_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError
-LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError
-LayoutTests/fast/css/media-query-recovery_t01: RuntimeError
-LayoutTests/fast/css/modify-ua-rules-from-javascript_t01: RuntimeError
-LayoutTests/fast/css/nested-at-rules_t01: RuntimeError
-LayoutTests/fast/css/overflow-property_t01: RuntimeError
-LayoutTests/fast/css/padding-start-end_t01: RuntimeError
-LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError
-LayoutTests/fast/css/percent-min-width-img-src-change_t01: Timeout
-LayoutTests/fast/css/pseudo-required-optional-004_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-005_t01: RuntimeError
-LayoutTests/fast/css/pseudo-required-optional-unapplied_t01: RuntimeError
-LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Timeout
-LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Timeout
-LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError
-LayoutTests/fast/css/sheet-collection-link_t01: RuntimeError
-LayoutTests/fast/css/shorthand-setProperty-important_t01: RuntimeError
-LayoutTests/fast/css/space-before-charset-external_t01: RuntimeError
-LayoutTests/fast/css/style-element-process-crash_t01: Timeout
-LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-link_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError
-LayoutTests/fast/css/text-align-webkit-match-parent_t01: RuntimeError
-LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError
-LayoutTests/fast/css/webkit-color-adjust_t01: RuntimeError
-LayoutTests/fast/css/word-break-user-modify-allowed-values_t01: RuntimeError
-LayoutTests/fast/css/zoom-property-parsing_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError
-LayoutTests/fast/dom/Document/createElement-valid-names_t01: RuntimeError
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError
-LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError
-LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: RuntimeError
-LayoutTests/fast/dom/Element/scrollWidth_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-port_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError
-LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: RuntimeError
-LayoutTests/fast/dom/HTMLButtonElement/value/getset_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Timeout
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/set-true_t01: RuntimeError
-LayoutTests/fast/dom/HTMLElement/translate_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-natural-width-height_t01: Timeout
-LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/click-label_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Timeout
-LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError
-LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Timeout
-LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-validity_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/indeterminate-progress-002_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/set-progress-properties_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-reexecution_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Timeout
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableSectionElement/rows_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: Timeout
-LayoutTests/fast/dom/HTMLTemplateElement/xhtml-parsing-and-serialization_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/added-out-of-order_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/removed-out-of-order_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-assertion_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/anchor-origin_t01: RuntimeError
-LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError
-LayoutTests/fast/dom/containerNode_t01: Timeout
-LayoutTests/fast/dom/css-cached-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-delete-doc_t01: RuntimeError
-LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule-twice_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError
-LayoutTests/fast/dom/css-selectorText_t01: RuntimeError
-LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError
-LayoutTests/fast/dom/cssTarget-crash_t01: RuntimeError
-LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/invalid-type-extension-crash_t01: RuntimeError
-LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError
-LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError
-LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError
-LayoutTests/fast/dom/dom-parse-serialize-xmldecl_t01: RuntimeError
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError
-LayoutTests/fast/dom/empty-hash-and-search_t01: RuntimeError
-LayoutTests/fast/dom/gc-image-element-2_t01: Timeout
-LayoutTests/fast/dom/gc-image-element_t01: Timeout
-LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError
-LayoutTests/fast/dom/image-object_t01: Timeout
-LayoutTests/fast/dom/javascript-backslash_t01: RuntimeError
-LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError
-LayoutTests/fast/dom/location-hash_t01: RuntimeError
-LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError
-LayoutTests/fast/dom/non-styled-element-id-crash_t01: RuntimeError
-LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError
-LayoutTests/fast/dom/remove-body-during-body-replacement_t01: Timeout
-LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError
-LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError
-LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError
-LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError
-LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError
-LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError
-LayoutTests/fast/dynamic/checkbox-selection-crash_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError
-LayoutTests/fast/events/change-overflow-on-overflow-change_t01: Timeout
-LayoutTests/fast/events/clipboard-clearData_t01: Timeout
-LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Timeout
-LayoutTests/fast/events/event-creation_t01: RuntimeError
-LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError
-LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError
-LayoutTests/fast/events/fire-scroll-event_t01: RuntimeError
-LayoutTests/fast/events/init-message-event_t01: RuntimeError
-LayoutTests/fast/events/input-focus-no-duplicate-events_t01: RuntimeError, Pass
-LayoutTests/fast/events/invalid-002_t01: RuntimeError
-LayoutTests/fast/events/invalid-003_t01: RuntimeError
-LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError
-LayoutTests/fast/events/nested-event-remove-node-crash_t01: Timeout
-LayoutTests/fast/events/overflowchanged-event-raf-timing_t01: RuntimeError
-LayoutTests/fast/events/scoped/editing-commands_t01: RuntimeError
-LayoutTests/fast/events/selectstart-on-selectall_t01: RuntimeError
-LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError, Pass
-LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError
-LayoutTests/fast/files/blob-close-read_t01: RuntimeError
-LayoutTests/fast/files/blob-constructor_t01: RuntimeError
-LayoutTests/fast/files/read-blob-as-array-buffer_t01: RuntimeError
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError
-LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-after-reload-crash_t01: RuntimeError
-LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError
-LayoutTests/fast/filesystem/op-copy_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError
-LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError
-LayoutTests/fast/filesystem/read-directory_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError
-LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-tooLong-textarea_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-typeMismatch-email_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-typeMismatch-url_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-004_t01: RuntimeError
-LayoutTests/fast/forms/autocomplete_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-focus-only-once_t01: Timeout
-LayoutTests/fast/forms/autofocus-input-css-style-change_t01: Timeout
-LayoutTests/fast/forms/autofocus-opera-004_t01: RuntimeError
-LayoutTests/fast/forms/autofocus-opera-007_t01: Timeout
-LayoutTests/fast/forms/autofocus-readonly-attribute_t01: Timeout
-LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError
-LayoutTests/fast/forms/date/ValidityState-typeMismatch-date_t01: RuntimeError
-LayoutTests/fast/forms/date/date-interactive-validation-required_t01: RuntimeError, Pass
-LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError
-LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/fieldset-disabled_t01: RuntimeError
-LayoutTests/fast/forms/focus-style-pending_t01: Timeout
-LayoutTests/fast/forms/focus_t01: RuntimeError
-LayoutTests/fast/forms/form-attribute-nonexistence-form-id_t01: RuntimeError
-LayoutTests/fast/forms/formmethod-attribute-input-2_t01: RuntimeError, Pass
-LayoutTests/fast/forms/formmethod-attribute-input-html_t01: RuntimeError, Pass
-LayoutTests/fast/forms/incremental-dom-property_t01: RuntimeError
-LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError
-LayoutTests/fast/forms/input-appearance-maxlength_t01: RuntimeError
-LayoutTests/fast/forms/input-changing-value_t01: RuntimeError
-LayoutTests/fast/forms/input-file-set-value_t01: RuntimeError
-LayoutTests/fast/forms/input-implicit-length-limit_t01: RuntimeError
-LayoutTests/fast/forms/input-inputmode_t01: RuntimeError
-LayoutTests/fast/forms/input-maxlength-unsupported_t01: RuntimeError
-LayoutTests/fast/forms/input-type-change_t01: RuntimeError
-LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError
-LayoutTests/fast/forms/input-width-height-attributes_t01: RuntimeError
-LayoutTests/fast/forms/listbox-select-all_t01: RuntimeError
-LayoutTests/fast/forms/listbox-selection-2_t01: RuntimeError
-LayoutTests/fast/forms/missing-action_t01: RuntimeError, Pass
-LayoutTests/fast/forms/onchange-change-type_t01: RuntimeError
-LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError
-LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError
-LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError
-LayoutTests/fast/forms/paste-into-textarea_t01: RuntimeError
-LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError
-LayoutTests/fast/forms/select-change-popup-to-listbox-in-event-handler_t01: Timeout
-LayoutTests/fast/forms/select-clientheight-large-size_t01: RuntimeError
-LayoutTests/fast/forms/selection-direction_t01: RuntimeError
-LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError
-LayoutTests/fast/forms/shadow-tree-exposure_t01: RuntimeError
-LayoutTests/fast/forms/submit-form-with-dirname-attribute-with-ancestor-dir-attribute_t01: RuntimeError, Pass
-LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError
-LayoutTests/fast/forms/textarea-set-defaultvalue-after-value_t01: RuntimeError
-LayoutTests/fast/forms/textarea-trailing-newline_t01: RuntimeError
-LayoutTests/fast/forms/textfield-focus-out_t01: Timeout
-LayoutTests/fast/forms/validationMessage_t01: RuntimeError
-LayoutTests/fast/forms/willvalidate_t01: RuntimeError
-LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError
-LayoutTests/fast/html/article-element_t01: RuntimeError
-LayoutTests/fast/html/details-add-child-2_t01: RuntimeError
-LayoutTests/fast/html/details-add-details-child-1_t01: RuntimeError
-LayoutTests/fast/html/details-add-details-child-2_t01: RuntimeError
-LayoutTests/fast/html/details-click-controls_t01: RuntimeError
-LayoutTests/fast/html/figure-element_t01: RuntimeError
-LayoutTests/fast/html/header-element_t01: RuntimeError
-LayoutTests/fast/html/hgroup-element_t01: RuntimeError
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Timeout
-LayoutTests/fast/html/main-element_t01: RuntimeError
-LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError
-LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError
-LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError
-LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError
-LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError
-LayoutTests/fast/loader/about-blank-hash-change_t01: RuntimeError
-LayoutTests/fast/loader/about-blank-hash-kept_t01: RuntimeError
-LayoutTests/fast/loader/local-css-allowed-in-strict-mode_t01: RuntimeError
-LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Timeout
-LayoutTests/fast/loader/scroll-position-restored-on-back_t01: Timeout
-LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError
-LayoutTests/fast/masking/parsing-mask_t01: RuntimeError
-LayoutTests/fast/media/invalid-lengths_t01: RuntimeError
-LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError
-LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError
-LayoutTests/fast/media/mq-append-delete_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError
-LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError
-LayoutTests/fast/multicol/cssom-view_t01: RuntimeError
-LayoutTests/fast/multicol/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/gap-non-negative_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-gap-between-pages-flipped_t01: RuntimeError
-LayoutTests/fast/multicol/image-inside-nested-blocks-with-border_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/widows_t01: RuntimeError
-LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError
-LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError
-LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError
-LayoutTests/fast/parser/stray-param_t01: RuntimeError
-LayoutTests/fast/parser/strict-img-in-map_t01: RuntimeError
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError
-LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError
-LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError
-LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-outside-none_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: Timeout, RuntimeError, Pass
-LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: Timeout
-LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: Timeout
-LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: Timeout
-LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-length_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-number_t01: RuntimeError
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: RuntimeError
-LayoutTests/fast/table/min-width-css-block-table_t01: RuntimeError
-LayoutTests/fast/table/table-size-integer-overflow_t01: RuntimeError
-LayoutTests/fast/table/td-bordercolor-attribute_t01: RuntimeError
-LayoutTests/fast/text/find-kana_t01: RuntimeError
-LayoutTests/fast/text/find-russian_t01: RuntimeError
-LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError
-LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError
-LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError
-LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError
-LayoutTests/fast/text/window-find_t01: RuntimeError
-LayoutTests/fast/text/zero-width-characters-complex-script_t01: RuntimeError
-LayoutTests/fast/url/anchor_t01: RuntimeError
-LayoutTests/fast/url/file-http-base_t01: RuntimeError
-LayoutTests/fast/url/file_t01: RuntimeError
-LayoutTests/fast/url/host-lowercase-per-scheme_t01: RuntimeError
-LayoutTests/fast/url/idna2003_t01: RuntimeError
-LayoutTests/fast/url/idna2008_t01: RuntimeError
-LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError
-LayoutTests/fast/url/ipv4_t01: RuntimeError
-LayoutTests/fast/url/ipv6_t01: RuntimeError
-LayoutTests/fast/url/mailto_t01: RuntimeError
-LayoutTests/fast/url/path_t01: RuntimeError
-LayoutTests/fast/url/query_t01: RuntimeError
-LayoutTests/fast/url/relative-win_t01: RuntimeError
-LayoutTests/fast/url/relative_t01: RuntimeError
-LayoutTests/fast/url/segments_t01: RuntimeError
-LayoutTests/fast/url/standard-url_t01: RuntimeError
-LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: RuntimeError
-LayoutTests/fast/writing-mode/positionForPoint_t01: RuntimeError
-LayoutTests/fast/writing-mode/table-hit-test_t01: RuntimeError
-LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-html-document-responsetype-quirks_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError
-LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError
-LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError
-LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError
-LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError
-LayoutTests/fast/xsl/default-html_t01: RuntimeError
-LibTest/async/Future/Future.delayed_A01_t02: RuntimeError, Pass
-LibTest/async/Future/asStream_A01_t02: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t01: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError
-LibTest/async/Stream/Stream.fromIterable_A03_t01: Timeout, Pass
-LibTest/async/Stream/Stream.fromIterable_A03_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A03_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t01: Timeout, Pass
-LibTest/async/StreamController/StreamController.broadcast_A09_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t03: RuntimeError
-LibTest/async/StreamController/addStream_A03_t01: RuntimeError
-LibTest/async/StreamController/stream_A02_t01: Timeout, Pass
-LibTest/async/StreamController/stream_A02_t03: RuntimeError
-LibTest/async/StreamController/stream_A03_t01: Timeout, Pass
-LibTest/async/StreamController/stream_A03_t02: RuntimeError
-LibTest/async/StreamSink/addStream_A01_t02: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer.fromHandlers_A01_t03: RuntimeError
-LibTest/async/Zone/registerBinaryCallback_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/fold_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t03: RuntimeError
-LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t02: RuntimeError
-LibTest/collection/HashSet/HashSet_A04_t01: RuntimeError
-LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/contains_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/every_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/expand_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/expand_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/fold_A01_t01: RuntimeError
-LibTest/collection/LinkedList/addAll_A01_t02: RuntimeError
-LibTest/collection/LinkedList/join_A01_t01: RuntimeError
-LibTest/collection/LinkedList/toString_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/LinkedListEntry_class_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A02_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/list_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A02_t02: RuntimeError
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError
-LibTest/collection/ListQueue/ListQueue.from_A01_t01: RuntimeError
-LibTest/convert/LineSplitter/fuse_A01_t01: RuntimeError
-LibTest/core/AssertionError/AssertionError_A01_t01: RuntimeError
-LibTest/core/AssertionError/message_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/CyclicInitializationError.class_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/variableName_A01_t01: RuntimeError
-LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecond_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/parse_A01_t03: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t01: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t02: RuntimeError
-LibTest/core/Duration/Duration_A01_t01: CompileTimeError
-LibTest/core/Duration/Duration_A02_t01: CompileTimeError
-LibTest/core/Duration/inDays_A01_t01: CompileTimeError
-LibTest/core/Duration/inHours_A01_t01: CompileTimeError
-LibTest/core/Duration/inMicroseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inMilliseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inSeconds_A01_t01: CompileTimeError
-LibTest/core/Error/stackTrace_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t04: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t05: RuntimeError
-LibTest/core/Function/Function_class_A01_t01: RuntimeError
-LibTest/core/IndexError/stackTrace_A01_t01: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError
-LibTest/core/Runes/any_A01_t01: RuntimeError
-LibTest/core/Runes/every_A01_t01: RuntimeError
-LibTest/core/String/padRight_A01_t01: RuntimeError
-LibTest/core/String/replaceFirstMapped_A03_t01: RuntimeError
-LibTest/core/Symbol/Symbol_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t02: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t05: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t01: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A02_t03: RuntimeError
-LibTest/core/Uri/Uri.file_A02_t03: RuntimeError
-LibTest/core/Uri/decodeComponent_A01_t02: Timeout, Pass
-LibTest/core/Uri/encodeQueryComponent_A01_t02: Timeout
-LibTest/core/Uri/queryParametersAll_A01_t04: RuntimeError
-LibTest/core/Uri/queryParametersAll_A03_t01: RuntimeError
-LibTest/core/UriData/UriData.fromBytes_A01_t03: RuntimeError
-LibTest/core/UriData/charset_A01_t01: RuntimeError
-LibTest/core/UriData/contentText_A01_t01: RuntimeError
-LibTest/core/UriData/parse_A01_t01: RuntimeError
-LibTest/core/double/INFINITY_A01_t04: RuntimeError
-LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError
-LibTest/core/double/isInfinite_A01_t03: CompileTimeError
-LibTest/core/double/operator_GE_A01_t02: CompileTimeError
-LibTest/core/double/operator_GT_A01_t02: CompileTimeError
-LibTest/core/double/operator_LT_A01_t02: CompileTimeError
-LibTest/core/double/operator_addition_A01_t08: Crash
-LibTest/core/double/operator_subtraction_A01_t06: RuntimeError
-LibTest/core/double/operator_subtraction_A01_t09: Crash
-LibTest/core/int/ceil_A01_t01: CompileTimeError
-LibTest/core/int/compareTo_A01_t01: CompileTimeError
-LibTest/core/int/floorToDouble_A01_t01: CompileTimeError
-LibTest/core/int/floor_A01_t01: CompileTimeError
-LibTest/core/int/hashCode_A01_t01: CompileTimeError
-LibTest/core/int/isInfinite_A01_t01: CompileTimeError
-LibTest/core/int/isNegative_A01_t01: CompileTimeError
-LibTest/core/int/isOdd_A01_t01: RuntimeError
-LibTest/core/int/operator_AND_A01_t01: CompileTimeError
-LibTest/core/int/operator_GE_A01_t01: CompileTimeError
-LibTest/core/int/operator_LT_A01_t01: CompileTimeError
-LibTest/core/int/operator_XOR_A01_t01: CompileTimeError
-LibTest/core/int/operator_addition_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A03_t01: CompileTimeError
-LibTest/core/int/operator_left_shift_A01_t01: RuntimeError
-LibTest/core/int/operator_remainder_A01_t03: RuntimeError
-LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError
-LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError
-LibTest/core/int/parse_A03_t02: CompileTimeError
-LibTest/core/int/roundToDouble_A01_t01: CompileTimeError
-LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: Timeout
-LibTest/html/Element/blur_A01_t01: Timeout
-LibTest/html/Element/focus_A01_t01: Timeout
-LibTest/html/Element/loadEvent_A01_t01: Timeout
-LibTest/html/Element/mouseEnterEvent_A01_t01: RuntimeError
-LibTest/html/Element/mouseWheelEvent_A01_t01: Timeout
-LibTest/html/Element/onLoad_A01_t01: Timeout
-LibTest/html/Element/onMouseWheel_A01_t01: Timeout
-LibTest/html/HttpRequest/responseText_A01_t02: Timeout
-LibTest/html/HttpRequestUpload/onAbort_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onError_A01_t02: Timeout
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Timeout
-LibTest/html/IFrameElement/enteredView_A01_t01: Timeout
-LibTest/html/IFrameElement/focus_A01_t01: Timeout
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: Timeout
-Utils/tests/Expect/throws_A01_t04: RuntimeError
-WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Timeout
-WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Timeout
-WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError
-WebPlatformTest/dom/events/type_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-isEqualNode_t01: Timeout
-WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError
-WebPlatformTest/html-imports/link-import_t02: RuntimeError
-WebPlatformTest/html-imports/loading-import_t01: RuntimeError
-WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/node-document-changes_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-newelements_t01: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Timeout
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: Timeout
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-nameditem_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/input-type-button_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/mobiles_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-textarea-element/textarea-type_t01: RuntimeError
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/attributes-common-to-td-and-th-elements/cellIndex_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError
-WebPlatformTest/webstorage/event_constructor_t02: RuntimeError
-WebPlatformTest/webstorage/event_local_key_t01: Timeout
-WebPlatformTest/webstorage/event_local_newvalue_t01: Timeout
-WebPlatformTest/webstorage/event_local_oldvalue_t01: Timeout
-WebPlatformTest/webstorage/event_local_storagearea_t01: Timeout
-WebPlatformTest/webstorage/event_local_url_t01: Timeout
-WebPlatformTest/webstorage/event_session_key_t01: Timeout
-WebPlatformTest/webstorage/event_session_newvalue_t01: Timeout
-WebPlatformTest/webstorage/event_session_oldvalue_t01: Timeout
-WebPlatformTest/webstorage/event_session_storagearea_t01: Timeout
-WebPlatformTest/webstorage/event_session_url_t01: Timeout
-WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: RuntimeError
-
-[ $compiler == dart2js && $runtime != ff && $system != macos && !$fast_startup ]
-LayoutTests/fast/canvas/webgl/tex-input-validation_t01: RuntimeError
-LayoutTests/fast/dom/vertical-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError
-
-[ $compiler == dart2js && $runtime != ff && !$fast_startup ]
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError
-LayoutTests/fast/table/css-table-max-height_t01: RuntimeError
-LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError
-LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError
-LayoutTests/fast/table/min-max-width-preferred-size_t01: RuntimeError
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError
-LayoutTests/fast/table/table-width-exceeding-max-width_t01: RuntimeError
-LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError
-LayoutTests/fast/text/find-spaces_t01: RuntimeError
-LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError
-LayoutTests/fast/text/international/combining-marks-position_t01: RuntimeError, Pass
-LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError
-LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError
-LibTest/math/cos_A01_t01: RuntimeError
-WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError
-
-[ $compiler == dart2js && $runtime == safari ]
-Language/Expressions/Additive_Expressions/syntax_t01: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t04: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
-Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/exception_t02/01: CompileTimeError
-Language/Expressions/Constants/integer_size_t03: CompileTimeError
-Language/Expressions/Constants/integer_size_t04: CompileTimeError
-Language/Expressions/Function_Invocation/async_generator_invokation_t08: Timeout
-Language/Expressions/Function_Invocation/async_generator_invokation_t10: Timeout
-Language/Expressions/Identifier_Reference/evaluation_variable_or_parameter_t02: RuntimeError
-Language/Expressions/If_null_Expressions/static_type_t01: RuntimeError
-Language/Expressions/Lists/identical_t02: RuntimeError
-Language/Expressions/Maps/identical_t02: RuntimeError
-Language/Expressions/Null/instance_of_class_null_t01: RuntimeError
-Language/Expressions/Numbers/syntax_t06: CompileTimeError
-Language/Expressions/Numbers/syntax_t09: CompileTimeError
-Language/Expressions/Object_Identity/double_t02: RuntimeError
-Language/Expressions/Shift/integer_t02: CompileTimeError
-Language/Expressions/Type_Cast/syntax_t01: RuntimeError
-Language/Expressions/Unary_Expressions/variable_negative_t03: RuntimeError
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: CompileTimeError
-Language/Libraries_and_Scripts/top_level_syntax_t01: CompileTimeError
-Language/Metadata/before_ctor_t02: RuntimeError
-Language/Metadata/before_function_t01: RuntimeError
-Language/Metadata/before_function_t02: RuntimeError
-Language/Metadata/before_function_t03: RuntimeError
-Language/Metadata/before_function_t04: RuntimeError
-Language/Metadata/before_function_t07: RuntimeError
-Language/Metadata/before_import_t01: RuntimeError
-Language/Metadata/before_param_t03: RuntimeError
-Language/Metadata/before_param_t05: RuntimeError
-Language/Metadata/before_param_t07: RuntimeError
-Language/Metadata/before_param_t09: RuntimeError
-Language/Metadata/before_variable_t02: RuntimeError
-Language/Overview/Privacy/private_and_public_t18: RuntimeError
-Language/Reference/Operator_Precedence/precedence_15_unary_prefix_t08: RuntimeError
-Language/Statements/Assert/execution_t09: RuntimeError
-Language/Types/Function_Types/call_t01: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t03: RuntimeError
-Language/Types/Function_Types/subtype_named_args_t11: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t01: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t02: RuntimeError
-Language/Types/Function_Types/subtype_optional_args_t04: RuntimeError
-Language/Types/Interface_Types/subtype_t06: RuntimeError
-Language/Types/Interface_Types/subtype_t21: RuntimeError
-Language/Types/Interface_Types/subtype_t23: RuntimeError
-Language/Variables/constant_variable_t09: RuntimeError
-LanguageFeatures/Instantiate-to-bound/check_types/typedef_param_t02: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_FutureOr_l1_t05: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t05: RuntimeError
-LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t10: RuntimeError, Pass
-LanguageFeatures/Simple-bounds/dynamic/typedef_typedef_l1_t05: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_arguments_binding_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A51_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_class_member_fail_A53_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_global_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A51_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A52_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_local_variable_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/named_function_types_fail_return_value_fail_A53_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A31_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_arguments_binding_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A31_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t02: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_class_member_fail_A32_t03: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A31_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_local_variable_fail_A32_t01: RuntimeError
-LanguageFeatures/Subtyping/dynamic/generated/positional_function_types_fail_return_value_fail_A32_t01: RuntimeError
-LayoutTests/fast/backgrounds/background-position-parsing-2_t01: RuntimeError
-LayoutTests/fast/backgrounds/background-shorthand-with-backgroundSize-style_t01: RuntimeError
-LayoutTests/fast/backgrounds/repeat/parsing-background-repeat_t01: RuntimeError
-LayoutTests/fast/borders/border-image-width-numbers-computed-style_t01: RuntimeError
-LayoutTests/fast/canvas/2d.composite.globalAlpha.fillPath_t01: RuntimeError
-LayoutTests/fast/canvas/2d.fillText.gradient_t01: RuntimeError
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.gradient_t01: Timeout
-LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError
-LayoutTests/fast/canvas/DrawImageSinglePixelStretch_t01: Timeout
-LayoutTests/fast/canvas/canvas-blend-solid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-color-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-global-alpha_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-gradient-over-pattern_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-color_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-image-over-gradient_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-pattern-over-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-canvas_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-composite-stroke-alpha_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-fillRect_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-fillStyle-no-quirks-parsing_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-font-consistency_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-getImageData-rounding_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-modify-emptyPath_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-quadratic-same-endpoint_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-scale-shadowBlur_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-state-intact-after-putImageData_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokePath-alpha-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokePath-gradient-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokePath-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokeRect-gradient-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/drawImage-with-broken-image_t01: RuntimeError
-LayoutTests/fast/canvas/drawImage-with-valid-image_t01: Timeout
-LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError
-LayoutTests/fast/canvas/set-colors_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/WebGLContextEvent_t01: Timeout, Pass
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/get-active-test_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-object-get-calls_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/gl-teximage_t01: Timeout
-LayoutTests/fast/canvas/webgl/glsl-conformance_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/incorrect-context-object-behaviour_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-copies-indices_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/index-validation-with-resized-buffer_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/oes-element-index-uint_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba4444_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-rgba5551_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: Timeout
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba5551_t01: Timeout
-LayoutTests/fast/canvas/webgl/texImageTest_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/texture-active-bind_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-color-profile_t01: Timeout
-LayoutTests/fast/canvas/webgl/texture-complete_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/texture-transparent-pixels-initialized_t01: Timeout
-LayoutTests/fast/canvas/webgl/viewport-unchanged-upon-resize_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/webgl-specific_t01: RuntimeError
-LayoutTests/fast/css-generated-content/bug91547_t01: RuntimeError
-LayoutTests/fast/css-generated-content/malformed-url_t01: RuntimeError
-LayoutTests/fast/css-generated-content/pseudo-element-events_t01: Timeout
-LayoutTests/fast/css-generated-content/pseudo-transition-event_t01: Timeout
-LayoutTests/fast/css-grid-layout/breadth-size-resolution-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/calc-resolution-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-columns_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/flex-content-resolution-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-auto-flow-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-border-padding-grid-item_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-element-padding-margin_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-area-get-set_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-bad-named-area-auto-placement_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-change-order-auto-flow_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-horiz-bt_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-vert-rl_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-auto-columns-rows_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-margin-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/grid-item-order-auto-flow-resolution_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/justify-self-cell_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/minmax-fixed-logical-height-only_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-in-percent-grid_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-grid-item-in-percent-grid-track_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/percent-padding-margin-resolution-grid-item-update_t01: RuntimeError
-LayoutTests/fast/css-grid-layout/place-cell-by-index_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-blocks_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-column-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-flex-items_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/intrinsic-sized-replaced-absolutes_t01: RuntimeError
-LayoutTests/fast/css-intrinsic-dimensions/width-shrinks-avoid-floats_t01: RuntimeError
-LayoutTests/fast/css/MarqueeLayoutTest_t01: RuntimeError
-LayoutTests/fast/css/aspect-ratio-inheritance_t01: RuntimeError
-LayoutTests/fast/css/auto-min-size_t01: RuntimeError
-LayoutTests/fast/css/background-serialize_t01: RuntimeError
-LayoutTests/fast/css/border-image-style-length_t01: RuntimeError
-LayoutTests/fast/css/box-sizing-border-box-dynamic-padding-border-update_t01: RuntimeError
-LayoutTests/fast/css/content/content-none_t01: RuntimeError
-LayoutTests/fast/css/content/content-quotes-05_t01: RuntimeError
-LayoutTests/fast/css/cursor-parsing-image-set_t01: RuntimeError
-LayoutTests/fast/css/device-aspect-ratio_t01: RuntimeError
-LayoutTests/fast/css/draggable-region-parser_t01: RuntimeError
-LayoutTests/fast/css/dynamic-class-pseudo-elements_t01: RuntimeError
-LayoutTests/fast/css/fixed-width-intrinsic-width-excludes-scrollbars_t01: RuntimeError
-LayoutTests/fast/css/font-face-cache-bug_t01: RuntimeError
-LayoutTests/fast/css/font-face-insert-link_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-load_t01: Timeout
-LayoutTests/fast/css/font-face-unicode-range-overlap-load_t01: Timeout
-LayoutTests/fast/css/font-shorthand-from-longhands_t01: RuntimeError
-LayoutTests/fast/css/fontface-properties_t01: RuntimeError
-LayoutTests/fast/css/fontfaceset-events_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-border-image_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/computed-style-cross-fade_t01: RuntimeError
-LayoutTests/fast/css/getComputedStyle/counterIncrement-without-counter_t01: RuntimeError, Pass
-LayoutTests/fast/css/getComputedStyle/font-family-fallback-reset_t01: RuntimeError, Pass
-LayoutTests/fast/css/getComputedStyle/getComputedStyle-zoom-and-background-size_t01: RuntimeError, Pass
-LayoutTests/fast/css/html-attr-case-sensitivity_t01: RuntimeError
-LayoutTests/fast/css/image-set-setting_t01: RuntimeError
-LayoutTests/fast/css/inherited-properties-rare-text_t01: RuntimeError
-LayoutTests/fast/css/invalid-predefined-color_t01: RuntimeError
-LayoutTests/fast/css/invalidation/targeted-class-host-pseudo_t01: RuntimeError
-LayoutTests/fast/css/invalidation/toggle-style-inside-shadow-root_t01: RuntimeError
-LayoutTests/fast/css/link-alternate-stylesheet-1_t01: RuntimeError
-LayoutTests/fast/css/media-query-recovery_t01: RuntimeError
-LayoutTests/fast/css/parsing-css-nth-child_t01: RuntimeError
-LayoutTests/fast/css/parsing-page-rule_t01: RuntimeError
-LayoutTests/fast/css/parsing-unexpected-eof_t01: RuntimeError
-LayoutTests/fast/css/percent-min-width-img-src-change_t01: Timeout
-LayoutTests/fast/css/pseudo-target-indirect-sibling-001_t01: Timeout
-LayoutTests/fast/css/pseudo-target-indirect-sibling-002_t01: Timeout
-LayoutTests/fast/css/readonly-pseudoclass-opera-003_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-004_t01: RuntimeError
-LayoutTests/fast/css/readonly-pseudoclass-opera-005_t01: RuntimeError
-LayoutTests/fast/css/sheet-collection-link_t01: RuntimeError
-LayoutTests/fast/css/space-before-charset-external_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-shadow-crash_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-dom-operation_t01: RuntimeError
-LayoutTests/fast/css/style-scoped/style-scoped-with-important-rule_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-link_t01: RuntimeError
-LayoutTests/fast/css/stylesheet-enable-first-alternate-on-load-sheet_t01: RuntimeError
-LayoutTests/fast/css/unicode-bidi-computed-value_t01: RuntimeError, Pass
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-line_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-decoration-style_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-decoration/getComputedStyle/getComputedStyle-text-underline-position_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-indent/getComputedStyle/getComputedStyle-text-indent-inherited_t01: RuntimeError
-LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError
-LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: RuntimeError, Pass
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-strict-mode-wtih-checkbox_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-user-select-none_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-in-zoom-and-scroll_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/caretRangeFromPoint-with-first-letter-style_t01: RuntimeError
-LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError
-LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Timeout
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-pathname_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError
-LayoutTests/fast/dom/HTMLButtonElement/value/getset_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/submit-dialog-close-event_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/synthetic-click-inert_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Timeout
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Timeout
-LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLImageElement/image-natural-width-height_t01: Timeout
-LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError
-LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-before-page-load_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/link-onload2_t01: RuntimeError
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Timeout
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Timeout
-LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError
-LayoutTests/fast/dom/HTMLProgressElement/indeterminate-progress-002_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-reexecution_t01: Timeout
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Timeout
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTableSectionElement/rows_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/cycles-in-shadow_t01: RuntimeError
-LayoutTests/fast/dom/HTMLTemplateElement/innerHTML-inert_t01: Timeout
-LayoutTests/fast/dom/MutationObserver/observe-options-character-data_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError
-LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-style_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: RuntimeError
-LayoutTests/fast/dom/XMLSerializer-double-xmlns_t01: RuntimeError
-LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError
-LayoutTests/fast/dom/css-cached-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule-twice_t01: RuntimeError
-LayoutTests/fast/dom/css-insert-import-rule_t01: RuntimeError
-LayoutTests/fast/dom/css-selectorText_t01: RuntimeError
-LayoutTests/fast/dom/cssTarget-crash_t01: RuntimeError, Pass
-LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError
-LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError
-LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError
-LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError
-LayoutTests/fast/dom/empty-hash-and-search_t01: RuntimeError
-LayoutTests/fast/dom/gc-image-element-2_t01: Timeout
-LayoutTests/fast/dom/gc-image-element_t01: Timeout
-LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError
-LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError
-LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError
-LayoutTests/fast/dom/image-object_t01: Timeout
-LayoutTests/fast/dom/non-styled-element-id-crash_t01: RuntimeError
-LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError
-LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError
-LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError
-LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: RuntimeError
-LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError
-LayoutTests/fast/dom/shadow/elementfrompoint_t01: RuntimeError
-LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError
-LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError
-LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError
-LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-disable_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError
-LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError
-LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError
-LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-counter_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-image_t01: RuntimeError
-LayoutTests/fast/dynamic/crash-generated-text_t01: RuntimeError
-LayoutTests/fast/events/clipboard-clearData_t01: Timeout
-LayoutTests/fast/events/clipboard-dataTransferItemList_t01: Timeout
-LayoutTests/fast/events/event-creation_t01: RuntimeError
-LayoutTests/fast/events/event-listener-html-non-html-confusion_t01: RuntimeError
-LayoutTests/fast/events/event-on-xhr-document_t01: RuntimeError
-LayoutTests/fast/events/init-message-event_t01: RuntimeError
-LayoutTests/fast/events/invalid-002_t01: RuntimeError
-LayoutTests/fast/events/invalid-003_t01: RuntimeError
-LayoutTests/fast/events/mutation-during-replace-child_t01: RuntimeError
-LayoutTests/fast/events/nested-event-remove-node-crash_t01: Timeout
-LayoutTests/fast/events/tabindex-removal-from-focused-element_t01: RuntimeError
-LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError
-LayoutTests/fast/files/blob-close-read_t01: RuntimeError
-LayoutTests/fast/files/blob-constructor_t01: RuntimeError
-LayoutTests/fast/files/file-reader-abort-in-last-progress_t01: RuntimeError
-LayoutTests/fast/files/file-reader-done-reading-abort_t01: RuntimeError, Pass
-LayoutTests/fast/files/read-blob-as-array-buffer_t01: RuntimeError
-LayoutTests/fast/filesystem/async-operations_t01: RuntimeError
-LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-after-reload-crash_t01: RuntimeError
-LayoutTests/fast/filesystem/file-entry-to-uri_t01: RuntimeError
-LayoutTests/fast/filesystem/file-metadata-after-write_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-abort-continue_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-events_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-truncate-extend_t01: RuntimeError
-LayoutTests/fast/filesystem/file-writer-write-overlapped_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-unserializable_t01: RuntimeError
-LayoutTests/fast/filesystem/filesystem-uri-origin_t01: RuntimeError
-LayoutTests/fast/filesystem/op-copy_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-metadata_t01: RuntimeError
-LayoutTests/fast/filesystem/op-get-parent_t01: RuntimeError
-LayoutTests/fast/filesystem/op-read-directory_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-chars_t01: RuntimeError
-LayoutTests/fast/filesystem/op-restricted-names_t01: RuntimeError
-LayoutTests/fast/filesystem/read-directory_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-readonly-file-object_t01: RuntimeError
-LayoutTests/fast/filesystem/simple-temporary_t01: RuntimeError
-LayoutTests/fast/filesystem/snapshot-file-with-gc_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-customError_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-typeMismatch-url_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-valueMissing-004_t01: RuntimeError
-LayoutTests/fast/forms/autocomplete_t01: RuntimeError
-LayoutTests/fast/forms/button/button-disabled-blur_t01: RuntimeError
-LayoutTests/fast/forms/color/color-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError, Pass
-LayoutTests/fast/forms/date/ValidityState-typeMismatch-date_t01: RuntimeError
-LayoutTests/fast/forms/date/date-pseudo-classes_t01: RuntimeError
-LayoutTests/fast/forms/date/date-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/date/input-date-validation-message_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/datetimelocal-setrangetext_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError
-LayoutTests/fast/forms/form-attribute-nonexistence-form-id_t01: RuntimeError
-LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError
-LayoutTests/fast/forms/input-inputmode_t01: RuntimeError
-LayoutTests/fast/forms/input-value-sanitization_t01: RuntimeError
-LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError, Pass
-LayoutTests/fast/forms/option-change-single-selected_t01: RuntimeError
-LayoutTests/fast/forms/option-strip-unicode-spaces_t01: RuntimeError
-LayoutTests/fast/forms/parser-associated-form-removal_t01: RuntimeError
-LayoutTests/fast/forms/plaintext-mode-1_t01: RuntimeError
-LayoutTests/fast/forms/selection-wrongtype_t01: RuntimeError
-LayoutTests/fast/forms/textarea-paste-newline_t01: RuntimeError
-LayoutTests/fast/forms/textarea-selection-preservation_t01: RuntimeError
-LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Timeout
-LayoutTests/fast/html/select-dropdown-consistent-background-color_t01: RuntimeError
-LayoutTests/fast/inline/boundingBox-with-continuation_t01: RuntimeError
-LayoutTests/fast/inline/inline-position-top-align_t01: RuntimeError
-LayoutTests/fast/inline/parent-inline-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/inline/positioned-element-padding-contributes-width_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError
-LayoutTests/fast/lists/marker-preferred-margins_t01: RuntimeError
-LayoutTests/fast/loader/about-blank-hash-change_t01: Timeout
-LayoutTests/fast/loader/about-blank-hash-kept_t01: Timeout
-LayoutTests/fast/loader/loadInProgress_t01: RuntimeError, Pass
-LayoutTests/fast/loader/local-css-allowed-in-strict-mode_t01: RuntimeError
-LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Timeout
-LayoutTests/fast/loader/scroll-position-restored-on-back_t01: Timeout
-LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError
-LayoutTests/fast/masking/parsing-mask_t01: RuntimeError
-LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError
-LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCIceCandidate_t01: RuntimeError
-LayoutTests/fast/mediastream/RTCPeerConnection-AddRemoveStream_t01: Timeout, Pass
-LayoutTests/fast/mediastream/RTCPeerConnection_t01: RuntimeError
-LayoutTests/fast/mediastream/constructors_t01: RuntimeError
-LayoutTests/fast/multicol/balance-unbreakable_t01: RuntimeError
-LayoutTests/fast/multicol/break-after-always-bottom-margin_t01: RuntimeError
-LayoutTests/fast/multicol/cssom-view_t01: RuntimeError
-LayoutTests/fast/multicol/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-end-of-column_t01: RuntimeError
-LayoutTests/fast/multicol/hit-test-float_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance-images_t01: RuntimeError
-LayoutTests/fast/multicol/newmulticol/balance-maxheight_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-lr/float-truncation_t01: RuntimeError
-LayoutTests/fast/multicol/vertical-rl/float-truncation_t01: RuntimeError
-LayoutTests/fast/overflow/replaced-child-100percent-height-inside-fixed-container-with-overflow-auto_t01: RuntimeError
-LayoutTests/fast/overflow/scrollbar-restored_t01: RuntimeError
-LayoutTests/fast/parser/fragment-parser-doctype_t01: RuntimeError
-LayoutTests/fast/replaced/available-height-for-content_t01: RuntimeError
-LayoutTests/fast/replaced/container-width-zero_t01: RuntimeError
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-table-cell-ignore-height_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-height_t01: RuntimeError
-LayoutTests/fast/replaced/table-percent-width_t01: RuntimeError
-LayoutTests/fast/ruby/ruby-line-height_t01: RuntimeError
-LayoutTests/fast/scrolling/scroll-element-into-view_t01: RuntimeError
-LayoutTests/fast/shapes/parsing/parsing-shape-margin_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-inset-rounded-different-writing-modes-left_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t01: RuntimeError
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-rounded-boxes_t02: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-boundary-events_t01: Timeout, Pass, RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-cancel_t01: RuntimeError
-LayoutTests/fast/speechsynthesis/speech-synthesis-pause-resume_t01: Timeout, Pass
-LayoutTests/fast/speechsynthesis/speech-synthesis-speak_t01: Timeout, Pass
-LayoutTests/fast/speechsynthesis/speech-synthesis-utterance-uses-voice_t01: Timeout, Pass
-LayoutTests/fast/storage/storage-disallowed-in-data-url_t01: RuntimeError
-LayoutTests/fast/sub-pixel/shadows-computed-style_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-angle_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-length_t01: RuntimeError
-LayoutTests/fast/svg/whitespace-number_t01: RuntimeError
-LayoutTests/fast/table/fixed-table-layout-width-change_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-bottom-edge_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-with-borders-bottom-edge_t01: RuntimeError
-LayoutTests/fast/table/html-table-width-max-width-constrained_t01: RuntimeError
-LayoutTests/fast/table/incorrect-colgroup-span-values_t01: RuntimeError, Pass
-LayoutTests/fast/table/margins-flipped-text-direction_t01: RuntimeError
-LayoutTests/fast/table/min-width-css-block-table_t01: RuntimeError
-LayoutTests/fast/table/nested-tables-with-div-offset_t01: RuntimeError
-LayoutTests/fast/table/switch-table-layout-multiple-section_t01: RuntimeError
-LayoutTests/fast/table/switch-table-layout_t01: RuntimeError
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows_t01: RuntimeError
-LayoutTests/fast/table/table-colgroup-present-after-table-row_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-cell-with-empty-cell_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t01: RuntimeError
-LayoutTests/fast/table/table-rowspan-height-distribution-in-rows_t02: RuntimeError
-LayoutTests/fast/table/table-with-content-width-exceeding-max-width_t01: RuntimeError
-LayoutTests/fast/text/find-case-folding_t01: RuntimeError
-LayoutTests/fast/text/find-russian_t01: RuntimeError
-LayoutTests/fast/text/find-soft-hyphen_t01: RuntimeError
-LayoutTests/fast/text/glyph-reordering_t01: RuntimeError
-LayoutTests/fast/text/international/iso-8859-8_t01: RuntimeError
-LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError
-LayoutTests/fast/text/multiglyph-characters_t01: RuntimeError, Pass
-LayoutTests/fast/text/offsetForPosition-cluster-at-zero_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-ltr_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-vertical_t01: RuntimeError
-LayoutTests/fast/text/sub-pixel/text-scaling-webfont_t01: RuntimeError
-LayoutTests/fast/url/anchor_t01: RuntimeError
-LayoutTests/fast/url/file-http-base_t01: RuntimeError
-LayoutTests/fast/url/file_t01: RuntimeError
-LayoutTests/fast/url/idna2003_t01: RuntimeError
-LayoutTests/fast/url/idna2008_t01: RuntimeError
-LayoutTests/fast/url/invalid-urls-utf8_t01: RuntimeError
-LayoutTests/fast/url/ipv4_t01: RuntimeError
-LayoutTests/fast/url/ipv6_t01: RuntimeError
-LayoutTests/fast/url/path_t01: RuntimeError
-LayoutTests/fast/url/query_t01: RuntimeError
-LayoutTests/fast/url/relative-win_t01: RuntimeError
-LayoutTests/fast/url/relative_t01: RuntimeError
-LayoutTests/fast/url/segments_t01: RuntimeError
-LayoutTests/fast/url/standard-url_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-html-document-responsetype-quirks_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responseXML-xml-text-responsetype_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-before-open-sync-request_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Borrowed/od_20000608_t01: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError
-LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError
-LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError
-LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError
-LayoutTests/fast/xpath/implicit-node-args_t01: RuntimeError
-LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError
-LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError
-LayoutTests/fast/xsl/default-html_t01: RuntimeError
-LibTest/async/Future/asStream_A01_t02: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t01: RuntimeError
-LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError
-LibTest/async/Stream/Stream.fromIterable_A03_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t02: RuntimeError
-LibTest/async/Stream/Stream.periodic_A04_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A03_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A09_t03: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t02: RuntimeError
-LibTest/async/StreamController/StreamController.broadcast_A10_t03: RuntimeError
-LibTest/async/StreamController/addStream_A03_t01: RuntimeError
-LibTest/async/StreamController/stream_A02_t03: RuntimeError
-LibTest/async/StreamController/stream_A03_t02: RuntimeError
-LibTest/async/StreamSink/addStream_A01_t02: RuntimeError
-LibTest/async/StreamTransformer/StreamTransformer.fromHandlers_A01_t03: RuntimeError
-LibTest/async/Zone/registerBinaryCallback_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/fold_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t03: RuntimeError
-LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t02: RuntimeError
-LibTest/collection/HashSet/HashSet_A04_t01: RuntimeError
-LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/contains_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/every_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/expand_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/expand_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/fold_A01_t01: RuntimeError
-LibTest/collection/LinkedList/addAll_A01_t02: RuntimeError
-LibTest/collection/LinkedList/join_A01_t01: RuntimeError
-LibTest/collection/LinkedList/toString_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/LinkedListEntry_class_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A02_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/list_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A02_t02: RuntimeError
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError
-LibTest/collection/ListQueue/ListQueue.from_A01_t01: RuntimeError
-LibTest/convert/LineSplitter/fuse_A01_t01: RuntimeError
-LibTest/core/AssertionError/AssertionError_A01_t01: RuntimeError
-LibTest/core/AssertionError/message_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/CyclicInitializationError.class_A01_t01: RuntimeError
-LibTest/core/CyclicInitializationError/variableName_A01_t01: RuntimeError
-LibTest/core/DateTime/DateTime.fromMicrosecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecond_A01_t01: RuntimeError
-LibTest/core/DateTime/microsecondsSinceEpoch_A01_t01: RuntimeError
-LibTest/core/DateTime/parse_A01_t03: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t01: RuntimeError
-LibTest/core/DateTime/to8601String_A01_t02: RuntimeError
-LibTest/core/Duration/Duration_A01_t01: CompileTimeError
-LibTest/core/Duration/Duration_A02_t01: CompileTimeError
-LibTest/core/Duration/inDays_A01_t01: CompileTimeError
-LibTest/core/Duration/inHours_A01_t01: CompileTimeError
-LibTest/core/Duration/inMicroseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inMilliseconds_A01_t01: CompileTimeError
-LibTest/core/Duration/inSeconds_A01_t01: CompileTimeError
-LibTest/core/Error/stackTrace_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t04: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t05: RuntimeError
-LibTest/core/Function/Function_class_A01_t01: RuntimeError
-LibTest/core/IndexError/stackTrace_A01_t01: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A03_t01: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError
-LibTest/core/RegExp/Pattern_semantics/splitQueryString_A02_t01: RuntimeError
-LibTest/core/Runes/any_A01_t01: RuntimeError
-LibTest/core/Runes/every_A01_t01: RuntimeError
-LibTest/core/String/padRight_A01_t01: RuntimeError
-LibTest/core/String/replaceFirstMapped_A03_t01: RuntimeError
-LibTest/core/Symbol/Symbol_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t02: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromBytes_A01_t05: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t01: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t03: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A01_t04: RuntimeError
-LibTest/core/Uri/Uri.dataFromString_A02_t03: RuntimeError
-LibTest/core/Uri/Uri.file_A02_t03: RuntimeError
-LibTest/core/Uri/queryParametersAll_A01_t04: RuntimeError
-LibTest/core/Uri/queryParametersAll_A03_t01: RuntimeError
-LibTest/core/UriData/UriData.fromBytes_A01_t03: RuntimeError
-LibTest/core/UriData/charset_A01_t01: RuntimeError
-LibTest/core/UriData/contentText_A01_t01: RuntimeError
-LibTest/core/UriData/parse_A01_t01: RuntimeError
-LibTest/core/double/INFINITY_A01_t04: RuntimeError
-LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError
-LibTest/core/double/isInfinite_A01_t03: CompileTimeError
-LibTest/core/double/operator_GE_A01_t02: CompileTimeError
-LibTest/core/double/operator_GT_A01_t02: CompileTimeError
-LibTest/core/double/operator_LT_A01_t02: CompileTimeError
-LibTest/core/double/operator_addition_A01_t08: Crash
-LibTest/core/double/operator_subtraction_A01_t06: RuntimeError
-LibTest/core/double/operator_subtraction_A01_t09: Crash
-LibTest/core/double/roundToDouble_A01_t01: RuntimeError
-LibTest/core/double/round_A01_t01: RuntimeError
-LibTest/core/int/ceil_A01_t01: CompileTimeError
-LibTest/core/int/compareTo_A01_t01: CompileTimeError
-LibTest/core/int/floorToDouble_A01_t01: CompileTimeError
-LibTest/core/int/floor_A01_t01: CompileTimeError
-LibTest/core/int/hashCode_A01_t01: CompileTimeError
-LibTest/core/int/isInfinite_A01_t01: CompileTimeError
-LibTest/core/int/isNegative_A01_t01: CompileTimeError
-LibTest/core/int/isOdd_A01_t01: RuntimeError
-LibTest/core/int/operator_AND_A01_t01: CompileTimeError
-LibTest/core/int/operator_GE_A01_t01: CompileTimeError
-LibTest/core/int/operator_LT_A01_t01: CompileTimeError
-LibTest/core/int/operator_XOR_A01_t01: CompileTimeError
-LibTest/core/int/operator_addition_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A01_t01: CompileTimeError
-LibTest/core/int/operator_equality_A03_t01: CompileTimeError
-LibTest/core/int/operator_left_shift_A01_t01: RuntimeError
-LibTest/core/int/operator_remainder_A01_t03: RuntimeError
-LibTest/core/int/operator_subtraction_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t01: CompileTimeError
-LibTest/core/int/operator_truncating_division_A01_t02: RuntimeError
-LibTest/core/int/operator_unary_minus_A01_t01: CompileTimeError
-LibTest/core/int/parse_A03_t02: CompileTimeError
-LibTest/core/int/roundToDouble_A01_t01: CompileTimeError
-LibTest/core/int/truncateToDouble_A01_t01: CompileTimeError
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: Timeout
-LibTest/html/Element/getClientRects_A01_t02: RuntimeError, Pass
-LibTest/html/Element/isContentEditable_A01_t01: RuntimeError, Pass
-LibTest/html/Element/loadEvent_A01_t01: Timeout
-LibTest/html/Element/mouseWheelEvent_A01_t01: Timeout
-LibTest/html/Element/onLoad_A01_t01: Timeout
-LibTest/html/Element/onMouseWheel_A01_t01: Timeout
-LibTest/html/Element/transitionEndEvent_A01_t01: Timeout
-LibTest/html/HttpRequest/responseText_A01_t02: Timeout
-LibTest/html/HttpRequestUpload/onError_A01_t02: Timeout
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Timeout
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Timeout
-LibTest/html/IFrameElement/enteredView_A01_t01: Timeout
-LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError, Pass
-LibTest/html/IFrameElement/onMouseWheel_A01_t01: Timeout
-LibTest/html/IFrameElement/onTransitionEnd_A01_t01: Timeout, Pass
-LibTest/math/atan_A01_t01: RuntimeError
-Utils/tests/Expect/throws_A01_t04: RuntimeError
-WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Timeout
-WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError
-WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Timeout
-WebPlatformTest/custom-elements/concepts/type_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/concepts/type_A08_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElementNS_A05_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A01_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A02_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/createElement_A04_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A01_t02: RuntimeError
-WebPlatformTest/custom-elements/instantiating/isAttribute_A03_t01: RuntimeError
-WebPlatformTest/custom-elements/instantiating/localName_A01_t01: RuntimeError
-WebPlatformTest/dom/events/type_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError, Pass
-WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-adoptNode_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-insertBefore_t01: RuntimeError
-WebPlatformTest/dom/nodes/Node-isEqualNode_t01: Timeout
-WebPlatformTest/dom/nodes/Node-nodeName_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A02_t01: RuntimeError, Pass
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A07_t03: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError
-WebPlatformTest/html-imports/link-import_t02: RuntimeError
-WebPlatformTest/html-imports/loading-import_t01: RuntimeError
-WebPlatformTest/html-templates/innerhtml-on-templates/innerhtml_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/additions-to-the-in-head-insertion-mode/generating-of-implied-end-tags_t01: RuntimeError
-WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError
-WebPlatformTest/html-templates/template-element/template-as-a-descendant_t01: RuntimeError
-WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Timeout
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError
-WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError
-WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Timeout
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: Timeout
-WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-elements-matches_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-form-element/form-nameditem_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/color_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/datetime_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/input-type-button_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/mobiles_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/month_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/range_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/time_t02: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/type-change-state_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-input-element/week_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-option-element/option-text-spaces_t01: RuntimeError
-WebPlatformTest/html/semantics/forms/the-textarea-element/textarea-type_t01: RuntimeError
-WebPlatformTest/html/semantics/interactive-elements/the-dialog-element/dialog-close_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/checked_t01: RuntimeError
-WebPlatformTest/html/semantics/selectors/pseudo-classes/focus_t01: RuntimeError, Pass
-WebPlatformTest/html/semantics/selectors/pseudo-classes/indeterminate_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/attributes-common-to-td-and-th-elements/cellIndex_t01: RuntimeError
-WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError
-WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol_t00: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/attributes/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-element-interface/methods/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/extensions-to-event-interface/event-path-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-009_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-011_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-013_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-methods/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-007_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/events-that-are-always-stopped/test-008_t01: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t04: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: RuntimeError
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-004_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/html-elements-in-shadow-trees/html-forms/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/custom-pseudo-elements/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/hosting-multiple-shadow-trees/test-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/distribution-003_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/nested-shadow-trees/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/reprojection/test-001_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-005_t01: RuntimeError
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-011_t01: RuntimeError
-WebPlatformTest/webstorage/event_constructor_t02: RuntimeError
-WebPlatformTest/webstorage/event_local_key_t01: Timeout
-WebPlatformTest/webstorage/event_local_newvalue_t01: Timeout
-WebPlatformTest/webstorage/event_local_oldvalue_t01: Timeout
-WebPlatformTest/webstorage/event_local_storagearea_t01: Timeout
-WebPlatformTest/webstorage/event_local_url_t01: Timeout
-WebPlatformTest/webstorage/event_session_key_t01: Timeout
-WebPlatformTest/webstorage/event_session_newvalue_t01: Timeout
-WebPlatformTest/webstorage/event_session_oldvalue_t01: Timeout
-WebPlatformTest/webstorage/event_session_storagearea_t01: Timeout
-WebPlatformTest/webstorage/event_session_url_t01: Timeout
-WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Timeout
-
-[ $compiler == dart2js && $runtime == safari && $fast_startup ]
-LayoutTests/fast/canvas/canvas-alphaImageData-behavior_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-blend-image_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-composite-alpha_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-composite-canvas_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-composite-image_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError
-LayoutTests/fast/canvas/canvas-lineDash_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-lineWidth-intact-after-strokeRect_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-scale-fillPath-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-scale-fillRect-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokePath-alpha-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokePath-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokeRect-alpha-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokeRect-gradient-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-style-intact-after-text_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/fillText-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/text-globalAlpha_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError, Pass
-LayoutTests/fast/css/computed-offset-with-zoom_t01: RuntimeError
-LayoutTests/fast/css/counters/counter-cssText_t01: RuntimeError
-LayoutTests/fast/css/cssText-shorthand_t01: RuntimeError
-LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-columns_t01: RuntimeError
-LayoutTests/fast/css/invalid-not-with-simple-selector-sequence_t01: RuntimeError
-LayoutTests/fast/css/parsing-object-position_t01: RuntimeError
-LayoutTests/fast/css/pseudo-any_t01: RuntimeError, Pass
-LayoutTests/fast/css/shadow-current-color_t01: RuntimeError
-LayoutTests/fast/css/sticky/parsing-position-sticky_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last-inherited_t01: RuntimeError
-LayoutTests/fast/css3-text/css3-text-align-last/getComputedStyle/getComputedStyle-text-align-last_t01: RuntimeError
-LayoutTests/fast/dom/Attr/direction-attribute-set-and-cleared_t01: RuntimeError
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError, Pass
-LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError
-LayoutTests/fast/dom/MutationObserver/observe-options-attributes_t01: RuntimeError
-LayoutTests/fast/files/file-reader-readystate_t01: RuntimeError
-LayoutTests/fast/filesystem/input-access-entries_t01: RuntimeError
-LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError
-LayoutTests/fast/forms/date/date-input-type_t01: RuntimeError
-LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError
-LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError, Pass
-LayoutTests/fast/inline/continuation-inlines-inserted-in-reverse-after-block_t01: RuntimeError
-LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError
-LayoutTests/fast/media/media-query-list_t01: RuntimeError
-LayoutTests/fast/mediastream/getusermedia_t01: RuntimeError, Pass
-LayoutTests/fast/multicol/balance-short-trailing-empty-block_t01: RuntimeError
-LayoutTests/fast/multicol/balance-trailing-border_t01: RuntimeError
-LayoutTests/fast/multicol/balance-trailing-border_t02: RuntimeError
-LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError
-LayoutTests/fast/replaced/iframe-with-percentage-height-within-table-with-anonymous-table-cell_t01: RuntimeError
-LayoutTests/fast/replaced/preferred-widths_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError, Pass
-LayoutTests/fast/sub-pixel/table-rows-have-stable-height_t01: RuntimeError
-LayoutTests/fast/table/absolute-table-percent-lengths_t01: RuntimeError
-LayoutTests/fast/table/css-table-max-height_t01: RuntimeError
-LayoutTests/fast/table/css-table-width-with-border-padding_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-right-edge_t01: RuntimeError
-LayoutTests/fast/table/hittest-tablecell-with-borders-right-edge_t01: RuntimeError
-LayoutTests/fast/table/margins-perpendicular-containing-block_t01: RuntimeError
-LayoutTests/fast/table/min-max-width-preferred-size_t01: RuntimeError
-LayoutTests/fast/table/switch-table-layout-dynamic-cells_t01: RuntimeError
-LayoutTests/fast/table/table-all-rowspans-height-distribution-in-rows-except-overlapped_t01: RuntimeError
-LayoutTests/fast/table/table-width-exceeding-max-width_t01: RuntimeError
-LayoutTests/fast/text-autosizing/vertical-writing-mode_t01: RuntimeError
-LayoutTests/fast/text/find-spaces_t01: RuntimeError
-LayoutTests/fast/text/font-ligatures-linebreak-word_t01: RuntimeError
-LayoutTests/fast/text/font-ligatures-linebreak_t01: RuntimeError
-LayoutTests/fast/text/international/cjk-segmentation_t01: RuntimeError
-LayoutTests/fast/text/selection-exceptions_t01: RuntimeError
-LayoutTests/fast/transforms/bounding-rect-zoom_t01: RuntimeError
-LayoutTests/fast/transforms/hit-test-large-scale_t01: RuntimeError
-LayoutTests/fast/writing-mode/vertical-font-vmtx-units-per-em_t01: RuntimeError
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-responsetype-sync-request_t01: RuntimeError
-LibTest/html/Element/isContentEditable_A02_t01: RuntimeError
-LibTest/html/IFrameElement/getClientRects_A01_t02: RuntimeError, Pass
-LibTest/html/IFrameElement/isContentEditable_A01_t01: RuntimeError
-LibTest/html/Window/close_A01_t01: RuntimeError
-LibTest/math/cos_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError, Pass
-WebPlatformTest/dom/nodes/Document-createElementNS_t01: RuntimeError, Pass
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A02_t01: RuntimeError, Pass
-WebPlatformTest/html/semantics/scripting-1/the-script-element/async_t11: RuntimeError
-
-[ $compiler == dart2js && $runtime == safari && !$fast_startup ]
-LayoutTests/fast/canvas/canvas-alphaImageData-behavior_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-composite-alpha_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-composite-image_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-getImageData_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-lineDash_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-lineWidth-intact-after-strokeRect_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-scale-drawImage-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-scale-fillPath-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-scale-fillRect-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-strokeRect-alpha-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-style-intact-after-text_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/canvas-transforms-fillRect-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/fillText-shadow_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/text-globalAlpha_t01: RuntimeError, Pass
-LayoutTests/fast/canvas/webgl/canvas-test_t01: RuntimeError, Pass
-LayoutTests/fast/css/focus-display-block-inline_t01: RuntimeError, Pass
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError, Pass
-LayoutTests/fast/forms/autofocus-input-css-style-change_t01: RuntimeError, Pass
-LayoutTests/fast/mediastream/getusermedia_t01: RuntimeError, Pass
-LayoutTests/fast/shapes/shape-outside-floats/shape-outside-floats-image-margin_t02: RuntimeError, Pass
-WebPlatformTest/dom/nodes/Document-createElementNS_t01: RuntimeError, Pass
-
-[ $compiler == dart2js && $runtime != safari ]
-LayoutTests/fast/canvas/canvas-lineDash_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/buffer-data-array-buffer_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/context-lost_t01: RuntimeError
-LayoutTests/fast/canvas/webgl/uninitialized-test_t01: RuntimeError
-LayoutTests/fast/css/background-clip-text_t01: RuntimeError
-LayoutTests/fast/css/border-radius-property-value_t01: RuntimeError
-LayoutTests/fast/css/child-selector-implicit-tbody_t01: RuntimeError
-LayoutTests/fast/css/getPropertyValue-border_t01: RuntimeError
-LayoutTests/fast/css/url-with-multi-byte-unicode-escape_t01: RuntimeError
-LayoutTests/fast/dom/DOMImplementation/createDocumentType-err_t01: RuntimeError
-LayoutTests/fast/dom/Document/CaretRangeFromPoint/replace-element_t01: RuntimeError
-LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: RuntimeError
-LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError
-LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError
-LayoutTests/fast/dom/offset-position-writing-modes_t01: RuntimeError
-LayoutTests/fast/events/document-elementFromPoint_t01: RuntimeError
-LayoutTests/fast/eventsource/eventsource-constructor_t01: RuntimeError
-LayoutTests/fast/forms/ValidityState-tooLong-input_t01: RuntimeError
-LayoutTests/fast/forms/fieldset/fieldset-elements_t01: RuntimeError
-LayoutTests/fast/forms/menulist-submit-without-selection_t01: RuntimeError, Pass
-LayoutTests/fast/forms/select-change-popup-to-listbox-in-event-handler_t01: RuntimeError
-LayoutTests/fast/forms/select-clientheight-with-multiple-attr_t01: RuntimeError
-LayoutTests/fast/forms/select-list-box-mouse-focus_t01: RuntimeError
-LayoutTests/fast/forms/selection-start-end-readonly_t01: RuntimeError
-LayoutTests/fast/html/aside-element_t01: RuntimeError
-LayoutTests/fast/html/details-add-child-1_t01: RuntimeError
-LayoutTests/fast/html/figcaption-element_t01: RuntimeError
-LayoutTests/fast/html/footer-element_t01: RuntimeError
-LayoutTests/fast/html/mark-element_t01: RuntimeError
-LayoutTests/fast/html/section-element_t01: RuntimeError
-LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError
-LayoutTests/fast/mediastream/getusermedia_t01: RuntimeError
-LayoutTests/fast/multicol/flipped-blocks-hit-test_t01: RuntimeError
-LayoutTests/fast/text/pre-wrap-trailing-tab_t01: RuntimeError
-LibTest/html/Element/blur_A01_t01: RuntimeError
-LibTest/html/HttpRequest/overrideMimeType_A01_t01: RuntimeError
-LibTest/html/IFrameElement/focus_A01_t01: RuntimeError
-LibTest/math/log_A01_t01: RuntimeError
-WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError
-WebPlatformTest/dom/nodes/Document-createElementNS_t01: RuntimeError
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A02_t01: RuntimeError
-WebPlatformTest/html/semantics/grouping-content/the-ol-element/ol.start-reflection_t02: RuntimeError
-
-[ $compiler == dart2js && $system != macos ]
-LayoutTests/fast/text/zero-width-characters_t01: RuntimeError
+LayoutTests/*: SkipByDesign # d8 is not a browser
+LibTest/html/*: SkipByDesign # d8 is not a browser
+WebPlatformTest/*: SkipByDesign # d8 is not a browser
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index 8c374fc..b620f62 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -1,15 +1,6 @@
 # Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
-LibTest/io/Link/rename_A02_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/174
-LibTest/io/RawDatagramSocket/any_A01_t02: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
-LibTest/io/RawDatagramSocket/any_A01_t03: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
-LibTest/io/RawDatagramSocket/asBroadcastStream_A01_t02: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
-LibTest/io/RawDatagramSocket/distinct_A01_t05: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
-LibTest/io/RawDatagramSocket/lastWhere_A01_t02: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
-LibTest/io/RawDatagramSocket/timeout_A02_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
-LibTest/io/RawDatagramSocket/timeout_A06_t01: Pass, Fail # Next roll might fix it (see https://github.com/dart-lang/co19/commit/8b2e2be5bc3bb9fec41efec8ac6fc777e231d915)
-LibTest/io/Stdin/readByteSync_A02_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/175
 
 [ $compiler == dartkp ]
 Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError
@@ -26,19 +17,11 @@
 LanguageFeatures/Subtyping/static/generated/left_bottom_global_variable_A02_t01: DartkCrash
 LanguageFeatures/Subtyping/static/generated/left_promoted_variable_global_variable_A02_t01: DartkCrash
 LibTest/async/Stream/Stream.periodic_A02_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue.from_A01_t01: RuntimeError
 LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t02: RuntimeError
-LibTest/collection/IterableMixin/reduce_A01_t01: RuntimeError
-LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError
-LibTest/collection/Queue/Queue.from_A01_t01: RuntimeError
-LibTest/collection/SetBase/SetBase_class_A01_t01: RuntimeError
-LibTest/core/List/List_class_A01_t01: RuntimeError
 LibTest/core/StackOverflowError/stackTrace_A01_t02: RuntimeError
 LibTest/core/Uri/Uri.dataFromString_A01_t01: RuntimeError
 LibTest/core/double/round_A01_t03: RuntimeError
 LibTest/io/Cookie/Cookie_A01_t02: RuntimeError
-LibTest/io/Directory/renameSync_A02_t01: RuntimeError
-LibTest/io/Directory/rename_A02_t01: RuntimeError
 LibTest/io/File/openRead_A01_t04: RuntimeError
 LibTest/io/HttpClientRequest/addStream_A02_t02: RuntimeError
 LibTest/io/HttpClientRequest/add_A03_t01: RuntimeError
@@ -69,12 +52,88 @@
 LibTest/isolate/Isolate/spawnUri_A01_t02: RuntimeError
 LibTest/isolate/Isolate/spawnUri_A05_t05: RuntimeError
 LibTest/isolate/ReceivePort/lastWhere_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32x4List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32List_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/first_A01_t02: RuntimeError
-LibTest/typed_data/Float32x4List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int32List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/clear_A01_t01: RuntimeError
+
+[ $compiler == fasta ]
+Language/Statements/For/syntax_t13: Crash # Assertion error: kernel_shadow_ast.dart: 'receiver == null': is not true.
+Language/Statements/For/syntax_t20: Crash # Assertion error: kernel_shadow_ast.dart: 'receiver == null': is not true.
+LanguageFeatures/Constant_update2018/*: Crash, Pass # Please triage these failures
+LanguageFeatures/Set-literals/constant_set_literals_A02_t01: Pass # CompileTimeError on $fasta
+LanguageFeatures/Set-literals/constant_set_literals_A02_t02/01: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A02_t02/02: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A02_t02/03: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A02_t02/04: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A02_t03/01: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A02_t03/02: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A02_t03/03: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A03_t01: Pass # CompileTimeError on $fasta
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/01: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/02: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/03: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/04: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/05: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/06: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/07: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/08: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/09: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t01/01: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t01/02: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t01/04: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/01: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/02: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/05: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/06: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/08: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/non_constant_set_literals_A01_t01: Pass # CompileTimeError on $fasta
+LanguageFeatures/Set-literals/non_constant_set_literals_A02_t01: Pass # CompileTimeError on $fasta
+LanguageFeatures/Set-literals/semantics_A04_t01: Pass # CompileTimeError on $fasta
+LanguageFeatures/Set-literals/semantics_A01_t01/01: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/semantics_A01_t01/02: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/semantics_A01_t01/09: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/semantics_A01_t01/10: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/semantics_A05_t01: Pass
+LanguageFeatures/Set-literals/semantics_A05_t05/01: MissingCompileTimeError # Exact types
+LanguageFeatures/Set-literals/semantics_A05_t05/02: MissingCompileTimeError # Exact types
+LanguageFeatures/Set-literals/semantics_A05_t05/03: MissingCompileTimeError # Exact types
+LanguageFeatures/Set-literals/set_literals_A01_t01: Pass # CompileTimeError on $fasta
+LanguageFeatures/Set-literals/set_literals_A02_t01: Pass # CompileTimeError on $fasta
+LanguageFeatures/Set-literals/set_literals_A04_t02/01: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/set_literals_A04_t02/02: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/set_literals_A04_t02/03: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/set_literals_A04_t02/04: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/set_literals_A04_t02/05: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/set_literals_A04_t02/11: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/set_literals_A04_t02/12: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/set_literals_A04_t02/13: MissingCompileTimeError # Issue 35608
+LanguageFeatures/Set-literals/syntax_compatibility_A01_t01: Pass # CompileTimeError on $fasta
+
+[ $runtime == vm ]
+LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Slow # Does many calls
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Pass, Slow # Does many calls
+LibTest/core/List/List_class_A01_t02: Pass, Slow # Does many calls
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t06: Pass, RuntimeError # https://github.com/dart-lang/co19/issues/186
+LibTest/io/RawDatagramSocket/*: Skip # RawDatagramSocket are flacky. Skip them all until rewritten
+LibTest/io/RawDatagramSocket/any_A01_t02: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/RawDatagramSocket/any_A01_t03: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/RawDatagramSocket/asBroadcastStream_A01_t02: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/RawDatagramSocket/distinct_A01_t05: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/RawDatagramSocket/lastWhere_A01_t02: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/RawDatagramSocket/listen_A02_t02: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/RawDatagramSocket/receive_A01_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/RawDatagramSocket/timeout_A02_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/RawDatagramSocket/timeout_A06_t01: Pass, Fail # Next roll might fix it (see https://github.com/dart-lang/co19/commit/8b2e2be5bc3bb9fec41efec8ac6fc777e231d915)
+LibTest/io/RawDatagramSocket/where_A01_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/170
+LibTest/io/Stdin/first_A04_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/193
+LibTest/io/Stdin/last_A02_t01: Pass, Fail # Issue https://github.com/dart-lang/co19/issues/182
+LibTest/io/Stdout/add_A02_t03: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/add_A02_t04: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/add_A02_t05: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/add_A02_t06: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/add_A02_t07: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/add_A02_t08: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/add_A02_t09: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/writeCharCode_A01_t03: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/write_A01_t04: Skip # https://github.com/dart-lang/co19/pull/204
+LibTest/io/Stdout/write_A01_t05: Skip # https://github.com/dart-lang/co19/pull/204
 
 [ $fasta ]
 Language/Classes/Abstract_Instance_Members/override_default_value_t01: MissingCompileTimeError # Issue 34190
@@ -82,41 +141,12 @@
 Language/Classes/Abstract_Instance_Members/override_default_value_t03: MissingCompileTimeError # Issue 34190
 Language/Classes/Abstract_Instance_Members/override_default_value_t04: MissingCompileTimeError # Issue 34190
 Language/Classes/Abstract_Instance_Members/override_default_value_t05: MissingCompileTimeError # Issue 34190
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t01: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t02: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t04: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t05: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Abstract_Instance_Members/same_name_static_method_in_superclass_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Constructors/Generative_Constructors/initializers_t15: CompileTimeError
-Language/Classes/Constructors/name_t01: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Constructors/name_t02: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Constructors/name_t03: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t01: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t02: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t03: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t04: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t05: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Getters/instance_getter_t06: MissingCompileTimeError # Legal, see #33235
 Language/Classes/Getters/type_object_t01: CompileTimeError
 Language/Classes/Getters/type_object_t02: CompileTimeError
 Language/Classes/Instance_Methods/Operators/return_type_t01: MissingCompileTimeError
 Language/Classes/Instance_Methods/override_different_default_values_t01: MissingCompileTimeError # Issue 34190
 Language/Classes/Instance_Methods/override_different_default_values_t02: MissingCompileTimeError # Issue 34190
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t01: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t02: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t04: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t05: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t06: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t07: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Instance_Methods/same_name_static_member_in_superclass_t09: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t01: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t02: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t03: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t04: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t05: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/instance_setter_t06: MissingCompileTimeError # Legal, see #33235
-Language/Classes/Setters/name_t06: CompileTimeError
-Language/Classes/Setters/name_t07: CompileTimeError
 Language/Classes/Setters/return_type_not_void_t01: MissingCompileTimeError
 Language/Classes/Setters/same_name_getter_different_type_t01: MissingCompileTimeError
 Language/Classes/Setters/syntax_t04: MissingCompileTimeError
@@ -125,7 +155,6 @@
 Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError # Issue 30273
 Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError # Issue 30273
 Language/Classes/method_definition_t06: MissingCompileTimeError # Legal
-Language/Classes/mixins_t02: MissingCompileTimeError # co19 issue 163
 Language/Enums/syntax_t08: CompileTimeError
 Language/Enums/syntax_t09: CompileTimeError
 Language/Expressions/Assignable_Expressions/syntax_t01: CompileTimeError
@@ -186,9 +215,6 @@
 Language/Mixins/Mixin_Application/superclass_t01: MissingCompileTimeError
 Language/Mixins/Mixin_Application/superclass_t02: MissingCompileTimeError
 Language/Mixins/Mixin_Application/superinterfaces_t07: MissingCompileTimeError
-Language/Mixins/Mixin_Application/warning_t01: CompileTimeError # Expects a warning, but this is an error in Dart 2
-Language/Mixins/Mixin_Application/warning_t02: CompileTimeError # Expects a warning, but this is an error in Dart 2
-Language/Mixins/Mixin_Application/warning_t03: CompileTimeError # Expects a warning, but this is an error in Dart 2
 Language/Mixins/declaring_constructor_t05: MissingCompileTimeError # Mixin constructor
 Language/Mixins/declaring_constructor_t06: MissingCompileTimeError # Mixin constructor
 Language/Overview/Privacy/private_and_public_t11: CompileTimeError
@@ -207,67 +233,195 @@
 Language/Statements/Continue/label_t07: MissingCompileTimeError # Issue 34206
 Language/Statements/Try/catch_scope_t01: CompileTimeError
 Language/Types/Interface_Types/subtype_t30: CompileTimeError
+LanguageFeatures/Constant_update2018/CastOperator_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/CastOperator_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/CastOperator_A02_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/CastOperator_A03_t01/none: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/CastOperator_A03_t02/none: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/NewOperators_A01_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t03: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t03: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t02: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t03/none: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t04/none: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t01: Crash
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t02: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t03: Crash
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t04: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l1_t03: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t07: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t08: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l1_t04: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t03: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t04: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l3_t02: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l1_t04: RuntimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t01: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t02: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t02: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01: Crash
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/01: Crash
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/02: Crash
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/03: Crash
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/04: Crash
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t01/none: Crash
+LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t02/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t03/01: Crash
 LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t03/02: Crash
 LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t03/none: Crash
 LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t04/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l1_t03/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t07/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t08/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_l1_t04/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t03/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t04/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_l3_t02/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l4_t01/02: MissingCompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t01/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t03/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/01: Crash, Pass
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/02: Crash, Pass
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/none: Crash
 LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t04/01: Crash, Pass
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t04/none: Crash, Pass
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t06/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t07/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t08/01: Crash, Pass
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t08/02: Crash, Pass
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l2_t08/none: Crash, Pass
 LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t07: RuntimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t08: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t03/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t03: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t04: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t12: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t13: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t15: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t03: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t04: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t05: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t12: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t14: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t15: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t01: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t10: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t11: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t12: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t14: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t03: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t12: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t01: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t03: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t05: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t11: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t12: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t13: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t14: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t15: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t11: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t12: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t15: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_typedef_l1_t05: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_typedef_l1_t06: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_FutureOr_l1_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t04/07: MissingCompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t07/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t09/07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_01_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_01_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t04/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t12: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_02_t13: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t01/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t03/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t05: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t10: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_03_t11: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_04_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_05_t05: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_06_t04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_06_t05/none: CompileTimeError
 LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t01/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t06/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l2_t15: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t02/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t03/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t04/07: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t06/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/01: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/02: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/03: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/04: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/05: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/06: MissingCompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_typedef_l1_t08/07: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/constant_set_literals_A03_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/constant_set_literals_A04_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t03: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/non_constant_set_literals_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/non_constant_set_literals_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/semantics_A04_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/semantics_A05_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/semantics_A05_t02: RuntimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/set_literals_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/set_literals_A02_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/set_literals_A04_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/syntax_compatibility_A01_t01: CompileTimeError # This feature is not implemented yet
+LanguageFeatures/Set-literals/syntax_compatibility_A01_t02: CompileTimeError
 LanguageFeatures/Simple-bounds/dynamic/class_FutureOr_l1_t02: CompileTimeError
 LanguageFeatures/Simple-bounds/static/class_FutureOr_l1_t02: CompileTimeError
-LanguageFeatures/Super-mixins/more_specific_t01: CompileTimeError
-LanguageFeatures/Super-mixins/not_class_t02: CompileTimeError
-LanguageFeatures/Super-mixins/not_class_t03: CompileTimeError
-LanguageFeatures/Super-mixins/on_word_t02: CompileTimeError
-LanguageFeatures/Super-mixins/on_word_t03: CompileTimeError
-LanguageFeatures/Super_Mixins/declarations_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_application_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_application_t02: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_application_t03: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_application_t04: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_applying_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_member_neg_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_member_neg_t02: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_member_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/mixin_member_t02: CompileTimeError
-LanguageFeatures/Super_Mixins/more_specific_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/super_invocation_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/syntax_t01: CompileTimeError
-LanguageFeatures/Super_Mixins/syntax_t02: CompileTimeError
-LanguageFeatures/Super_Mixins/syntax_t04: CompileTimeError
-LanguageFeatures/regression/33585_t01: MissingCompileTimeError
-LanguageFeatures/regression/33585_t02: MissingCompileTimeError
+LanguageFeatures/Simple-bounds/static/typedef_FutureOr_l1_t02/none: CompileTimeError
+LanguageFeatures/Simple-bounds/static/typedef_l1_t07/none: CompileTimeError
+LanguageFeatures/Simple-bounds/static/typedef_l2_t02/none: CompileTimeError
+LanguageFeatures/Simple-bounds/static/typedef_typedef_l1_t10: CompileTimeError
+LanguageFeatures/Super-mixins/covariance_t03: MissingCompileTimeError # Issue 35111
+LanguageFeatures/Super-mixins/covariance_t06: MissingCompileTimeError # Issue 35111
+LanguageFeatures/Super-mixins/covariance_t07: MissingCompileTimeError # Issue 35111
 LanguageFeatures/regression/33597_t01: MissingCompileTimeError
 LanguageFeatures/regression/33701_t01: MissingCompileTimeError
 LanguageFeatures/regression/34635_t01: CompileTimeError
 LanguageFeatures/regression/34635_t02: CompileTimeError
+LanguageFeatures/regression/34635_t03: CompileTimeError
 LanguageFeatures/regression/34803_t01: Crash
 LanguageFeatures/regression/34803_t02: Crash
 LibTest/async/Future/Future_A01_t01: CompileTimeError
 
+[ $arch == simdbc64 && $compiler == dartk ]
+LibTest/collection/ListBase/ListBase_class_A01_t02: Crash # Issue http://dartbug.com/35242
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Crash # Issue http://dartbug.com/35242
+LibTest/core/List/List_class_A01_t02: Crash # Issue http://dartbug.com/35242
+
 [ $arch == simdbc64 && $system == macos && ($compiler == dartk || $compiler == dartkb) ]
 LanguageFeatures/Subtyping/static/generated/function_type_function_arguments_binding_A04_t02: Crash, Pass
 LibTest/io/Directory/watch_A01_t02: RuntimeError, Pass
@@ -280,8 +434,8 @@
 LibTest/io/Stdout/writeCharCode_A01_t03: Timeout, Pass
 
 [ $arch == simdbc64 && ($compiler == dartk || $compiler == dartkb) ]
-LibTest/collection/ListBase/ListBase_class_A01_t02: Timeout, Pass
-LibTest/collection/ListMixin/ListMixin_class_A01_t02: Timeout, Pass
+LibTest/collection/ListBase/ListBase_class_A01_t02: Timeout, Pass # https://github.com/dart-lang/sdk/issues/35316 as well?
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Timeout, Pass # https://github.com/dart-lang/sdk/issues/35316 as well?
 LibTest/io/Link/renameSync_A02_t01: RuntimeError, Pass
 LibTest/io/Process/start_A01_t01: RuntimeError
 LibTest/io/Process/start_A02_t01: RuntimeError
@@ -371,39 +525,42 @@
 LibTest/isolate/Isolate/spawn_A06_t03: Crash, Pass
 
 [ $runtime == vm && $system == macos && ($compiler == dartk || $compiler == dartkb) ]
+LibTest/collection/ListBase/ListBase_class_A01_t02: Pass, Slow
+LibTest/collection/ListBase/ListBase_class_A01_t03: Pass, Slow
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Pass, Slow
+LibTest/collection/ListMixin/ListMixin_class_A01_t03: Pass, Slow
+LibTest/core/List/List_class_A01_t02: Pass, Slow
+LibTest/core/List/List_class_A01_t03: Pass, Slow
 LibTest/io/Directory/watch_A01_t02: RuntimeError, Pass
 LibTest/io/Directory/watch_A02_t01: RuntimeError, Pass
 LibTest/io/FileSystemCreateEvent/isDirectory_A01_t03: RuntimeError, Pass
 LibTest/io/FileSystemCreateEvent/isDirectory_A01_t04: RuntimeError, Pass
-LibTest/io/FileSystemCreateEvent/isDirectory_A01_t05: RuntimeError, Pass
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t05: RuntimeError, Pass, Timeout
+LibTest/io/FileSystemCreateEvent/isDirectory_A01_t06: Timeout, Pass
 LibTest/io/FileSystemCreateEvent/type_A01_t01: RuntimeError, Pass
 LibTest/io/FileSystemCreateEvent/type_A01_t02: RuntimeError, Pass
-LibTest/io/FileSystemCreateEvent/type_A01_t03: RuntimeError, Pass
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t01: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t02: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t03: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t04: RuntimeError
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t05: RuntimeError
-LibTest/io/FileSystemDeleteEvent/path_A01_t01: RuntimeError
-LibTest/io/FileSystemDeleteEvent/path_A01_t02: RuntimeError
-LibTest/io/FileSystemDeleteEvent/path_A01_t03: RuntimeError
-LibTest/io/FileSystemDeleteEvent/type_A01_t01: RuntimeError
-LibTest/io/FileSystemDeleteEvent/type_A01_t02: RuntimeError
-LibTest/io/FileSystemDeleteEvent/type_A01_t03: RuntimeError
-LibTest/io/FileSystemEntity/isWatchSupported_A01_t01: RuntimeError
-LibTest/io/FileSystemModifyEvent/contentChanged_A01_t01: Fail
-LibTest/io/FileSystemMoveEvent/destination_A01_t01: Fail
-LibTest/io/FileSystemMoveEvent/destination_A01_t02: Fail
-LibTest/io/FileSystemMoveEvent/destination_A01_t03: RuntimeError, Fail
-LibTest/io/FileSystemMoveEvent/isDirectory_A01_t01: Fail
-LibTest/io/FileSystemMoveEvent/isDirectory_A01_t02: Fail
-LibTest/io/FileSystemMoveEvent/isDirectory_A01_t03: Fail
-LibTest/io/FileSystemMoveEvent/path_A01_t01: Fail
-LibTest/io/FileSystemMoveEvent/path_A01_t02: Fail
-LibTest/io/FileSystemMoveEvent/path_A01_t03: Fail
-LibTest/io/FileSystemMoveEvent/type_A01_t01: Fail
-LibTest/io/FileSystemMoveEvent/type_A01_t02: Fail
-LibTest/io/FileSystemMoveEvent/type_A01_t03: Fail
+LibTest/io/FileSystemCreateEvent/type_A01_t03: RuntimeError, Pass, Timeout
+LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t07: RuntimeError
+LibTest/io/FileSystemDeleteEvent/path_A01_t02: RuntimeError, Pass
+LibTest/io/FileSystemDeleteEvent/path_A01_t03: RuntimeError, Pass
+LibTest/io/FileSystemDeleteEvent/type_A01_t03: RuntimeError, Pass
+LibTest/io/FileSystemModifyEvent/contentChanged_A01_t01: Fail, Timeout
+LibTest/io/FileSystemModifyEvent/contentChanged_A01_t02: Timeout, Pass
+LibTest/io/FileSystemModifyEvent/isDirectory_A01_t01: Timeout, Pass
+LibTest/io/FileSystemModifyEvent/path_A01_t02: Timeout, Pass
+LibTest/io/FileSystemModifyEvent/type_A01_t01: Timeout, Pass
+LibTest/io/FileSystemMoveEvent/destination_A01_t01: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/destination_A01_t02: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/destination_A01_t03: RuntimeError, Fail, Timeout
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t01: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t02: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/isDirectory_A01_t03: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/path_A01_t01: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/path_A01_t02: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/path_A01_t03: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/type_A01_t01: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/type_A01_t02: Fail, Timeout
+LibTest/io/FileSystemMoveEvent/type_A01_t03: Fail, Timeout
 LibTest/io/HttpClientRequest/contentLength_A02_t01: RuntimeError, Pass
 LibTest/io/HttpClientRequest/headers_A03_t01: RuntimeError, Pass
 LibTest/io/Link/stat_A01_t01: RuntimeError
@@ -517,6 +674,7 @@
 LibTest/io/Stdin/readByteSync_A02_t01: RuntimeError
 LibTest/io/Stdin/readLineSync_A03_t01: RuntimeError, Pass
 LibTest/io/Stdin/readLineSync_A03_t03: RuntimeError, Pass
+LibTest/io/Stdout/add_A02_t04: RuntimeError, Pass
 LibTest/io/WebSocket/pingInterval_A01_t01: RuntimeError, Pass
 LibTest/math/acos_A01_t01: RuntimeError
 LibTest/math/asin_A01_t01: RuntimeError
@@ -524,12 +682,6 @@
 LibTest/math/cos_A01_t01: RuntimeError
 
 [ $runtime == vm && $system != macos && ($compiler == dartk || $compiler == dartkb) ]
-LibTest/io/Directory/listSync_A01_t02: RuntimeError
-LibTest/io/Directory/listSync_A01_t03: RuntimeError
-LibTest/io/Directory/listSync_A01_t04: RuntimeError
-LibTest/io/Directory/list_A01_t02: RuntimeError
-LibTest/io/Directory/list_A01_t03: RuntimeError
-LibTest/io/Directory/list_A01_t04: RuntimeError
 LibTest/io/InternetAddress/lookup_A02_t01: RuntimeError
 LibTest/io/InternetAddress/lookup_A03_t01: RuntimeError
 LibTest/io/InternetAddress/lookup_A03_t02: RuntimeError
@@ -543,10 +695,56 @@
 Language/Mixins/Mixin_Application/syntax_t16: CompileTimeError
 Language/Statements/Assert/execution_t08: RuntimeError
 Language/Types/Function_Types/call_t01: RuntimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l1_t03: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t06: RuntimeError
 LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t04/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t08/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/static/typedef_l1_t05/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/none: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/none: DartkCrash
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_FutureOr_l1_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t01: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t05: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t10: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t11: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_01_t14: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t01: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t10: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t11: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_02_t13: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t03: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t04: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t05: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t13: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_03_t15: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t01: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t04: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t05: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t10: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t11: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t13: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t14: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_04_t15: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t02: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t04: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_05_t10: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t01: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t03: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t04: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t05: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t10: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t13: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_06_t14: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t06: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t11: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t12: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t13: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t14: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t15: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t16: RuntimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_typedef_l1_t02: RuntimeError
+LanguageFeatures/Simple-bounds/dynamic/typedef_FutureOr_l1_t02: RuntimeError
+LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t07: RuntimeError
+LanguageFeatures/Simple-bounds/dynamic/typedef_l1_t12: RuntimeError
+LanguageFeatures/Simple-bounds/dynamic/typedef_l2_t02: RuntimeError
 LanguageFeatures/regression/33701_t01: MissingCompileTimeError
 LanguageFeatures/regression/34803_t01: DartkCrash
 LanguageFeatures/regression/34803_t02: DartkCrash
@@ -554,46 +752,14 @@
 LibTest/async/Stream/Stream.fromIterable_A02_t01: RuntimeError
 LibTest/async/StreamController/addStream_A03_t01: RuntimeError
 LibTest/async/StreamSink/addStream_A01_t02: RuntimeError
-LibTest/collection/HashSet/HashSet_class_A01_t01: RuntimeError
-LibTest/collection/IterableBase/IterableBase_class_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/IterableMixin_class_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/contains_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/every_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/every_A02_t01: RuntimeError
-LibTest/collection/IterableMixin/expand_A02_t01: RuntimeError
-LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError
-LibTest/collection/LinkedList/LinkedList_class_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/LinkedListEntry_class_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A02_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A02_t03: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A02_t02: RuntimeError
-LibTest/collection/LinkedListEntry/insertBefore_A02_t03: RuntimeError
-LibTest/collection/LinkedListEntry/list_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/next_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/previous_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t02: RuntimeError
-LibTest/collection/ListBase/ListBase_class_A01_t01: RuntimeError
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: RuntimeError
-LibTest/collection/ListQueue/ListQueue_class_A01_t01: RuntimeError
-LibTest/collection/Queue/Queue_class_A01_t01: RuntimeError
-LibTest/collection/SetMixin/SetMixin_class_A01_t01: RuntimeError
-LibTest/collection/SplayTreeSet/SplayTreeSet_class_A01_t01: RuntimeError
-LibTest/collection/UnmodifiableListView/UnmodifiableListView_class_A01_t01: RuntimeError
 LibTest/core/Function/Function_class_A01_t01: RuntimeError
-LibTest/core/List/Iterable_A01_t01: RuntimeError
-LibTest/core/int/abs_A01_t01: RuntimeError
-LibTest/core/int/isOdd_A01_t01: RuntimeError
 LibTest/io/Cookie/Cookie_A01_t04: RuntimeError
 LibTest/io/Directory/watch_A01_t01: Fail, Pass
+LibTest/io/Directory/watch_A02_t01: Fail
 LibTest/io/FileSystemCreateEvent/isDirectory_A01_t01: Fail, Pass
 LibTest/io/FileSystemCreateEvent/isDirectory_A01_t02: Fail, Pass
 LibTest/io/FileSystemCreateEvent/path_A01_t01: Fail, Pass
+LibTest/io/FileSystemEntity/identical_A01_t06: Fail
 LibTest/io/FileSystemModifyEvent/isDirectory_A01_t02: Fail
 LibTest/io/FileSystemModifyEvent/path_A01_t01: Fail
 LibTest/io/FileSystemModifyEvent/type_A01_t02: Fail
@@ -623,11 +789,11 @@
 LibTest/io/ProcessResult/stdout_A01_t02: RuntimeError
 LibTest/io/RandomAccessFile/writeByte_A01_t01: RuntimeError, Pass
 LibTest/io/RawDatagramSocket/any_A01_t04: RuntimeError, Pass
-LibTest/io/RawDatagramSocket/any_A01_t05: RuntimeError
-LibTest/io/RawDatagramSocket/any_A01_t06: RuntimeError
-LibTest/io/RawDatagramSocket/any_A02_t01: RuntimeError
-LibTest/io/RawDatagramSocket/any_A02_t02: RuntimeError
-LibTest/io/RawDatagramSocket/any_A02_t03: RuntimeError
+LibTest/io/RawDatagramSocket/any_A01_t05: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/any_A01_t06: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/any_A02_t01: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/any_A02_t02: RuntimeError, Pass
+LibTest/io/RawDatagramSocket/any_A02_t03: RuntimeError, Pass
 LibTest/io/RawDatagramSocket/any_A02_t04: RuntimeError, Pass
 LibTest/io/RawDatagramSocket/asBroadcastStream_A01_t03: RuntimeError, Pass
 LibTest/io/RawDatagramSocket/asBroadcastStream_A02_t02: Timeout, Pass
@@ -640,19 +806,104 @@
 LibTest/io/RawDatagramSocket/single_A02_t01: RuntimeError, Pass
 LibTest/io/RawDatagramSocket/single_A03_t01: RuntimeError, Pass
 LibTest/io/RawDatagramSocket/skipWhile_A04_t01: RuntimeError, Pass
-LibTest/io/Stdout/addError_A02_t02: RuntimeError
-LibTest/io/Stdout/addStream_A01_t01: RuntimeError
-LibTest/io/Stdout/add_A02_t07: RuntimeError
 LibTest/io/WebSocket/connect_A01_t01: RuntimeError
 LibTest/io/WebSocket/connect_A01_t02: RuntimeError
 LibTest/isolate/Isolate/pause_A01_t01: Timeout, Pass
 LibTest/isolate/Isolate/pause_A01_t02: Timeout, Pass
+LibTest/isolate/Isolate/ping_A02_t01: Timeout, Pass
 LibTest/isolate/Isolate/ping_A03_t01: RuntimeError, Pass
 LibTest/isolate/Isolate/ping_A03_t02: RuntimeError, Pass
 LibTest/isolate/ReceivePort/firstWhere_A01_t01: RuntimeError
 LibTest/isolate/ReceivePort/firstWhere_A02_t01: RuntimeError
 LibTest/isolate/ReceivePort/transform_A01_t01: RuntimeError
 
+[ $runtime == vm && $arch != simdbc64 && ($compiler == dartk || $compiler == dartkb) ]
+LanguageFeatures/Constant_update2018/CastOperator_A01_t01: DartkCrash
+LanguageFeatures/Constant_update2018/CastOperator_A02_t01: DartkCrash
+LanguageFeatures/Constant_update2018/CastOperator_A02_t02: DartkCrash
+LanguageFeatures/Constant_update2018/CastOperator_A03_t01/02: Pass
+LanguageFeatures/Constant_update2018/CastOperator_A03_t01/03: Pass
+LanguageFeatures/Constant_update2018/CastOperator_A03_t02/01: DartkCrash
+LanguageFeatures/Constant_update2018/CastOperator_A04_t01: Pass
+LanguageFeatures/Constant_update2018/CastOperator_A04_t02: DartkCrash
+LanguageFeatures/Constant_update2018/EqualityOperator_A01_t03: DartkCrash
+LanguageFeatures/Constant_update2018/EqualityOperator_A01_t04: DartkCrash
+LanguageFeatures/Constant_update2018/NewOperators_A01_t01: DartkCrash
+LanguageFeatures/Constant_update2018/NewOperators_A01_t02: DartkCrash
+LanguageFeatures/Constant_update2018/NewOperators_A02_t01: Fail
+LanguageFeatures/Constant_update2018/NewOperators_A02_t02: DartkCrash
+LanguageFeatures/Constant_update2018/NewOperators_A02_t03: DartkCrash
+LanguageFeatures/Constant_update2018/NewOperators_A02_t04: Fail
+LanguageFeatures/Constant_update2018/NewOperators_A02_t05: DartkCrash
+LanguageFeatures/Constant_update2018/NewOperators_A02_t06: DartkCrash
+LanguageFeatures/Constant_update2018/NewOperators_A02_t07: Fail
+LanguageFeatures/Constant_update2018/NewOperators_A02_t08: DartkCrash
+LanguageFeatures/Constant_update2018/NewOperators_A02_t09: DartkCrash
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t02: DartkCrash
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t05: DartkCrash
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t02: DartkCrash
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t05: DartkCrash
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05: DartkCrash
+LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t06: DartkCrash
+LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t01: DartkCrash
+LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t02: DartkCrash
+LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t01: DartkCrash
+LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t02: DartkCrash
+LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t01: Pass
+LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t02: Pass
+LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t03/01: DartkCrash
+LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t04/01: DartkCrash
+LanguageFeatures/Constant_update2018/TypeTestOperator_A04_t01: Pass
+LanguageFeatures/Constant_update2018/TypeTestOperator_A04_t02: Pass
+LanguageFeatures/Set-literals/constant_set_literals_A02_t01: Pass
+LanguageFeatures/Set-literals/constant_set_literals_A02_t02/01: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A02_t02/02: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A02_t02/03: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A02_t02/04: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A02_t03/01: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A02_t03/02: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A02_t03/03: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A03_t01: Pass
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/01: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/02: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/03: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/04: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/05: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/06: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/07: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/08: MissingCompileTimeError
+LanguageFeatures/Set-literals/constant_set_literals_A05_t01/09: MissingCompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t01/01: MissingCompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t01/02: MissingCompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t01/04: MissingCompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/01: MissingCompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/02: MissingCompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/05: MissingCompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/06: MissingCompileTimeError
+LanguageFeatures/Set-literals/exact_types_of_literals_A01_t02/08: MissingCompileTimeError
+LanguageFeatures/Set-literals/non_constant_set_literals_A01_t01: Pass
+LanguageFeatures/Set-literals/non_constant_set_literals_A02_t01: RuntimeError
+LanguageFeatures/Set-literals/semantics_A01_t01/01: MissingCompileTimeError
+LanguageFeatures/Set-literals/semantics_A01_t01/02: MissingCompileTimeError
+LanguageFeatures/Set-literals/semantics_A01_t01/09: MissingCompileTimeError
+LanguageFeatures/Set-literals/semantics_A01_t01/10: MissingCompileTimeError
+LanguageFeatures/Set-literals/semantics_A04_t01: Pass
+LanguageFeatures/Set-literals/semantics_A05_t05/01: MissingCompileTimeError
+LanguageFeatures/Set-literals/semantics_A05_t05/02: MissingCompileTimeError
+LanguageFeatures/Set-literals/semantics_A05_t05/03: MissingCompileTimeError
+LanguageFeatures/Set-literals/semantics_A05_t01: RuntimeError
+LanguageFeatures/Set-literals/set_literals_A01_t01: Pass
+LanguageFeatures/Set-literals/set_literals_A02_t01: Pass
+LanguageFeatures/Set-literals/set_literals_A04_t02/01: MissingCompileTimeError
+LanguageFeatures/Set-literals/set_literals_A04_t02/02: MissingCompileTimeError
+LanguageFeatures/Set-literals/set_literals_A04_t02/03: MissingCompileTimeError
+LanguageFeatures/Set-literals/set_literals_A04_t02/04: MissingCompileTimeError
+LanguageFeatures/Set-literals/set_literals_A04_t02/05: MissingCompileTimeError
+LanguageFeatures/Set-literals/set_literals_A04_t02/11: MissingCompileTimeError
+LanguageFeatures/Set-literals/set_literals_A04_t02/12: MissingCompileTimeError
+LanguageFeatures/Set-literals/set_literals_A04_t02/13: MissingCompileTimeError
+LanguageFeatures/Set-literals/syntax_compatibility_A01_t01: Pass
+
 [ $runtime != vm && $fasta ]
 Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t01: MissingCompileTimeError # Issue 34192
 
@@ -863,11 +1114,7 @@
 Language/Types/Type_Declarations/Typedef/dynamic_param_type_t02: RuntimeError
 Language/Variables/constant_initialization_t03: RuntimeError
 Language/Variables/constant_variable_t09: RuntimeError
-LanguageFeatures/Instantiate-to-bound/class/dynamic/class_l2_t05: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/class/static/class_l2_t05/none: CompileTimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t03: RuntimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t05: RuntimeError
-LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t08: CompileTimeError
+LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l1_t02: RuntimeError
 LanguageFeatures/Instantiate-to-bound/typedef/dynamic/typedef_l2_t01: RuntimeError
 LibTest/async/Future/asStream_A01_t02: RuntimeError
 LibTest/async/Stream/Stream.fromFutures_A04_t02: RuntimeError
@@ -894,35 +1141,10 @@
 LibTest/async/StreamTransformer/StreamTransformer_A02_t01: RuntimeError
 LibTest/async/StreamTransformer/StreamTransformer_A02_t02: RuntimeError
 LibTest/async/Zone/registerBinaryCallback_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue.from_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/fold_A01_t01: RuntimeError
-LibTest/collection/DoubleLinkedQueue/reduce_A01_t01: RuntimeError
 LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t02: RuntimeError
 LibTest/collection/DoubleLinkedQueue/removeWhere_A02_t03: RuntimeError
 LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t02: RuntimeError
 LibTest/collection/DoubleLinkedQueue/retainWhere_A02_t03: RuntimeError
-LibTest/collection/HashMap/HashMap_A06_t01: RuntimeError
-LibTest/collection/HashSet/HashSet_A04_t01: RuntimeError
-LibTest/collection/IterableMixin/any_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/expand_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/first_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/fold_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/reduce_A01_t01: RuntimeError
-LibTest/collection/IterableMixin/single_A01_t02: RuntimeError
-LibTest/collection/IterableMixin/skipWhile_A03_t01: RuntimeError
-LibTest/collection/IterableMixin/skipWhile_A04_t01: RuntimeError
-LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError
-LibTest/collection/LinkedList/addAll_A01_t02: RuntimeError
-LibTest/collection/LinkedList/join_A01_t01: RuntimeError
-LibTest/collection/LinkedList/remove_A01_t03: RuntimeError
-LibTest/collection/LinkedList/toString_A03_t01: RuntimeError
-LibTest/collection/LinkedListEntry/insertAfter_A01_t02: RuntimeError
-LibTest/collection/LinkedListEntry/list_A01_t01: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A01_t03: RuntimeError
-LibTest/collection/LinkedListEntry/unlink_A02_t02: RuntimeError
-LibTest/collection/ListQueue/ListQueue.from_A01_t01: RuntimeError
-LibTest/collection/Queue/Queue.from_A01_t01: RuntimeError
-LibTest/collection/SetBase/SetBase_class_A01_t01: RuntimeError
 LibTest/convert/ByteConversionSink/ByteConversionSink.from_A01_t01: RuntimeError
 LibTest/convert/ByteConversionSink/ByteConversionSink_class_A01_t01: RuntimeError
 LibTest/convert/LineSplitter/fuse_A01_t01: RuntimeError
@@ -938,21 +1160,11 @@
 LibTest/core/AssertionError/AssertionError_A01_t01: RuntimeError
 LibTest/core/AssertionError/message_A01_t01: RuntimeError
 LibTest/core/AssertionError/toString_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t01: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t03: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t04: RuntimeError
-LibTest/core/Expando/operator_square_brackets_A01_t05: RuntimeError
-LibTest/core/List/List_class_A01_t01: RuntimeError
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: RuntimeError
 LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: RuntimeError
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: RuntimeError
-LibTest/core/Runes/any_A01_t01: RuntimeError
-LibTest/core/Runes/every_A01_t01: RuntimeError
 LibTest/core/StackOverflowError/stackTrace_A01_t01: RuntimeError
 LibTest/core/StackOverflowError/stackTrace_A01_t02: RuntimeError
-LibTest/core/String/padRight_A01_t01: RuntimeError
-LibTest/core/String/replaceAllMapped_A03_t01: RuntimeError
-LibTest/core/String/replaceFirstMapped_A03_t01: RuntimeError
 LibTest/core/Symbol/Symbol_A01_t03: RuntimeError
 LibTest/core/Symbol/Symbol_A01_t04: RuntimeError
 LibTest/core/Symbol/Symbol_A01_t05: RuntimeError
@@ -1000,35 +1212,21 @@
 LibTest/io/Directory/delete_A02_t05: RuntimeError
 LibTest/io/Directory/existsSync_A02_t02: RuntimeError
 LibTest/io/Directory/exists_A02_t02: RuntimeError
-LibTest/io/Directory/renameSync_A02_t01: RuntimeError
-LibTest/io/Directory/rename_A02_t01: RuntimeError
 LibTest/io/Directory/statSync_A01_t05: RuntimeError
 LibTest/io/Directory/stat_A01_t05: RuntimeError
-LibTest/io/File/absolute_A01_t01: RuntimeError
-LibTest/io/File/openRead_A01_t04: RuntimeError
-LibTest/io/File/openRead_A02_t01: RuntimeError
-LibTest/io/File/openSync_A01_t03: RuntimeError
-LibTest/io/File/openWrite_A03_t01: RuntimeError
-LibTest/io/File/open_A01_t03: RuntimeError
 LibTest/io/File/statSync_A01_t05: RuntimeError
 LibTest/io/File/stat_A01_t05: RuntimeError
 LibTest/io/FileStat/changed_A01_t01: RuntimeError
 LibTest/io/FileStat/modeString_A01_t01: RuntimeError
 LibTest/io/FileStat/mode_A01_t01: RuntimeError
 LibTest/io/FileStat/modified_A01_t01: RuntimeError
-LibTest/io/FileSystemCreateEvent/isDirectory_A01_t06: RuntimeError
 LibTest/io/FileSystemCreateEvent/path_A01_t02: RuntimeError, Fail, Pass
-LibTest/io/FileSystemCreateEvent/path_A01_t03: RuntimeError, Fail, Pass
-LibTest/io/FileSystemDeleteEvent/isDirectory_A01_t06: RuntimeError
+LibTest/io/FileSystemCreateEvent/path_A01_t03: RuntimeError, Fail, Pass, Timeout
 LibTest/io/FileSystemEntity/isDirectorySync_A01_t03: RuntimeError
 LibTest/io/FileSystemEntity/isDirectory_A01_t03: RuntimeError
 LibTest/io/FileSystemEntity/isFileSync_A01_t03: RuntimeError
-LibTest/io/FileSystemEntity/isFile_A01_t01: RuntimeError
 LibTest/io/FileSystemEntity/isFile_A01_t03: RuntimeError
-LibTest/io/FileSystemModifyEvent/contentChanged_A01_t01: RuntimeError
-LibTest/io/FileSystemModifyEvent/isDirectory_A01_t02: RuntimeError
 LibTest/io/FileSystemModifyEvent/path_A01_t01: RuntimeError
-LibTest/io/FileSystemModifyEvent/type_A01_t02: RuntimeError
 LibTest/io/HttpClient/addCredentials_A03_t01: RuntimeError
 LibTest/io/HttpClient/addProxyCredentials_A03_t01: RuntimeError
 LibTest/io/HttpClient/authenticateProxy_A01_t01: RuntimeError
@@ -1124,25 +1322,13 @@
 LibTest/io/Stdin/echoMode_A01_t02: RuntimeError
 LibTest/io/Stdin/lineMode_A01_t01: RuntimeError
 LibTest/io/Stdin/lineMode_A01_t02: RuntimeError
-LibTest/io/Stdout/Stdout_class_A02_t01: RuntimeError
-LibTest/io/Stdout/Stdout_class_A03_t01: RuntimeError
-LibTest/io/Stdout/addError_A02_t01: RuntimeError
-LibTest/io/Stdout/addStream_A02_t01: RuntimeError
-LibTest/io/Stdout/addStream_A03_t01: RuntimeError
-LibTest/io/Stdout/addStream_A03_t02: RuntimeError
-LibTest/io/Stdout/add_A03_t01: RuntimeError
-LibTest/io/Stdout/add_A03_t02: RuntimeError
-LibTest/io/Stdout/close_A02_t01: RuntimeError
-LibTest/io/Stdout/close_A02_t02: RuntimeError
-LibTest/io/Stdout/flush_A01_t01: RuntimeError
-LibTest/io/Stdout/flush_A02_t01: RuntimeError
-LibTest/io/Stdout/nonBlocking_A01_t01: RuntimeError
 LibTest/io/SystemEncoding/name_A01_t01: RuntimeError
 LibTest/io/WebSocket/isEmpty_A01_t01: RuntimeError
 LibTest/io/WebSocketTransformer/bind_A01_t01: RuntimeError
 LibTest/io/ZLibDecoder/fuse_A01_t01: RuntimeError
 LibTest/io/ZLibEncoder/fuse_A01_t01: RuntimeError
 LibTest/isolate/Isolate/addOnExitListener_A04_t01: RuntimeError
+LibTest/isolate/Isolate/kill_A01_t01: Timeout, Pass
 LibTest/isolate/Isolate/ping_A01_t01: Timeout, Pass
 LibTest/isolate/Isolate/ping_A04_t01: RuntimeError
 LibTest/isolate/Isolate/spawnUri_A05_t04: RuntimeError, Pass
@@ -1155,63 +1341,4 @@
 LibTest/math/MutableRectangle/height_A03_t02: RuntimeError
 LibTest/math/MutableRectangle/width_A03_t02: RuntimeError
 LibTest/math/Rectangle/Rectangle_A03_t04: RuntimeError
-LibTest/typed_data/ByteBuffer/asByteData_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat32x4List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat64List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asFloat64x2List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt16List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt32x4List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt64List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asInt8List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint16List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint32List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint64List_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint8ClampedList_A01_t01: RuntimeError
-LibTest/typed_data/ByteBuffer/asUint8List_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/any_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/every_A01_t01: RuntimeError
-LibTest/typed_data/Float32List/first_A01_t02: RuntimeError
-LibTest/typed_data/Float32List/last_A01_t02: RuntimeError
-LibTest/typed_data/Float32x4List/any_A01_t01: RuntimeError
-LibTest/typed_data/Float32x4List/every_A01_t01: RuntimeError
-LibTest/typed_data/Float64List/any_A01_t01: RuntimeError
-LibTest/typed_data/Float64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Float64x2List/sort_A01_t01: RuntimeError
-LibTest/typed_data/Int16List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int16List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int32List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int32List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int32List/shuffle_A01_t01: RuntimeError, Pass
-LibTest/typed_data/Int32x4List/Int32x4List.fromList_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.fromList_A01_t02: RuntimeError
-LibTest/typed_data/Int32x4List/Int32x4List.view_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/clear_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/fold_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/forEach_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/lengthInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/length_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/offsetInBytes_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/skip_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/skip_A02_t01: RuntimeError
-LibTest/typed_data/Int32x4List/sublist_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/take_A01_t01: RuntimeError
-LibTest/typed_data/Int32x4List/take_A02_t01: RuntimeError
-LibTest/typed_data/Int64List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Int8List/any_A01_t01: RuntimeError
-LibTest/typed_data/Int8List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint16List/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint16List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint32List/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint32List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint32List/shuffle_A01_t01: RuntimeError, Pass
-LibTest/typed_data/Uint64List/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint64List/last_A01_t02: RuntimeError
-LibTest/typed_data/Uint8ClampedList/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint8ClampedList/every_A01_t01: RuntimeError
-LibTest/typed_data/Uint8List/any_A01_t01: RuntimeError
-LibTest/typed_data/Uint8List/every_A01_t01: RuntimeError
 Utils/tests/Expect/throws_A01_t04: RuntimeError
diff --git a/tests/compiler/dart2js/analyses/analysis_helper.dart b/tests/compiler/dart2js/analyses/analysis_helper.dart
index 76f4a89..715352e 100644
--- a/tests/compiler/dart2js/analyses/analysis_helper.dart
+++ b/tests/compiler/dart2js/analyses/analysis_helper.dart
@@ -5,54 +5,139 @@
 import 'dart:convert' as json;
 import 'dart:io';
 
+import 'package:args/args.dart';
 import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/diagnostics/messages.dart';
 import 'package:compiler/src/diagnostics/source_span.dart';
-import 'package:compiler/src/library_loader.dart';
+import 'package:compiler/src/ir/scope.dart';
 import 'package:compiler/src/ir/static_type.dart';
 import 'package:compiler/src/ir/util.dart';
+import 'package:compiler/src/kernel/loader.dart';
 import 'package:compiler/src/util/uri_extras.dart';
 import 'package:expect/expect.dart';
+import 'package:front_end/src/api_unstable/dart2js.dart' as ir
+    show RedirectingFactoryBody;
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
 import 'package:kernel/type_algebra.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
+import '../helpers/args_helper.dart';
 import '../helpers/memory_compiler.dart';
 
-run(Uri entryPoint, String allowedListPath, List<String> analyzedPaths,
+main(List<String> args) {
+  ArgParser argParser = createArgParser();
+  ArgResults argResults = argParser.parse(args);
+
+  Uri entryPoint = getEntryPoint(argResults);
+  if (entryPoint == null) {
+    throw new ArgumentError("Missing entry point.");
+  }
+  Uri librariesSpecificationUri = getLibrariesSpec(argResults);
+  Uri packageConfig = getPackages(argResults);
+  List<String> options = getOptions(argResults);
+  run(entryPoint, null,
+      analyzedUrisFilter: (Uri uri) => uri.scheme != 'dart',
+      librariesSpecificationUri: librariesSpecificationUri,
+      packageConfig: packageConfig,
+      options: options);
+}
+
+run(Uri entryPoint, String allowedListPath,
     {Map<String, String> memorySourceFiles = const {},
+    Uri librariesSpecificationUri,
+    Uri packageConfig,
     bool verbose = false,
-    bool generate = false}) {
+    bool generate = false,
+    List<String> options = const <String>[],
+    bool analyzedUrisFilter(Uri uri)}) {
   asyncTest(() async {
-    Compiler compiler = await compilerFor(memorySourceFiles: memorySourceFiles);
-    LoadedLibraries loadedLibraries =
-        await compiler.libraryLoader.loadLibraries(entryPoint);
-    new DynamicVisitor(compiler.reporter, loadedLibraries.component,
-            allowedListPath, analyzedPaths)
+    Compiler compiler = await compilerFor(
+        memorySourceFiles: memorySourceFiles,
+        librariesSpecificationUri: librariesSpecificationUri,
+        packageConfig: packageConfig,
+        options: options);
+    KernelResult result = await compiler.kernelLoader.load(entryPoint);
+    new DynamicVisitor(compiler.reporter, result.component, allowedListPath,
+            analyzedUrisFilter)
         .run(verbose: verbose, generate: generate);
   });
 }
 
-class DynamicVisitor extends StaticTypeTraversalVisitor {
+class StaticTypeVisitorBase extends StaticTypeVisitor {
+  VariableScopeModel variableScopeModel;
+
+  StaticTypeVisitorBase(
+      ir.Component component, ir.ClassHierarchy classHierarchy)
+      : super(
+            new ir.TypeEnvironment(new ir.CoreTypes(component), classHierarchy),
+            classHierarchy);
+
+  @override
+  bool get useAsserts => false;
+
+  @override
+  bool get inferEffectivelyFinalVariableTypes => true;
+
+  @override
+  Null visitProcedure(ir.Procedure node) {
+    if (node.kind == ir.ProcedureKind.Factory) {
+      if (node.function.body is ir.RedirectingFactoryBody) {
+        // Don't visit redirecting factories.
+        return;
+      }
+    }
+    if (node.name.name.contains('#')) {
+      // Skip synthetic .dill members.
+      return;
+    }
+    variableScopeModel = ScopeModel.computeScopeModel(node)?.variableScopeModel;
+    super.visitProcedure(node);
+    variableScopeModel = null;
+  }
+
+  @override
+  Null visitField(ir.Field node) {
+    if (node.name.name.contains('#')) {
+      // Skip synthetic .dill members.
+      return;
+    }
+    variableScopeModel = ScopeModel.computeScopeModel(node)?.variableScopeModel;
+    super.visitField(node);
+    variableScopeModel = null;
+  }
+
+  @override
+  Null visitConstructor(ir.Constructor node) {
+    if (node.name.name.contains('#')) {
+      // Skip synthetic .dill members.
+      return;
+    }
+    variableScopeModel = ScopeModel.computeScopeModel(node)?.variableScopeModel;
+    super.visitConstructor(node);
+    variableScopeModel = null;
+  }
+}
+
+class DynamicVisitor extends StaticTypeVisitorBase {
   final DiagnosticReporter reporter;
   final ir.Component component;
   final String _allowedListPath;
-  final List<String> analyzedPaths;
+  final bool Function(Uri uri) analyzedUrisFilter;
 
   Map _expectedJson = {};
   Map<String, Map<String, List<DiagnosticMessage>>> _actualMessages = {};
 
-  DynamicVisitor(
-      this.reporter, this.component, this._allowedListPath, this.analyzedPaths)
-      : super(new ir.TypeEnvironment(
-            new ir.CoreTypes(component), new ir.ClassHierarchy(component)));
+  DynamicVisitor(this.reporter, this.component, this._allowedListPath,
+      this.analyzedUrisFilter)
+      : super(component, new ir.ClassHierarchy(component));
 
   void run({bool verbose = false, bool generate = false}) {
-    if (!generate) {
+    if (!generate && _allowedListPath != null) {
       File file = new File(_allowedListPath);
       if (file.existsSync()) {
         try {
@@ -63,7 +148,7 @@
       }
     }
     component.accept(this);
-    if (generate) {
+    if (generate && _allowedListPath != null) {
       Map<String, Map<String, int>> actualJson = {};
       _actualMessages.forEach(
           (String uri, Map<String, List<DiagnosticMessage>> actualMessagesMap) {
@@ -122,18 +207,16 @@
             }
           }
         });
-        _actualMessages.forEach((String uri,
-            Map<String, List<DiagnosticMessage>> actualMessagesMap) {
-          if (!_expectedJson.containsKey(uri)) {
-            actualMessagesMap.forEach(
-                (String message, List<DiagnosticMessage> actualMessages) {
-              if (!expectedMessages.containsKey(message)) {
-                for (DiagnosticMessage message in actualMessages) {
-                  reporter.reportError(message);
-                  errorCount++;
-                }
-              }
-            });
+      }
+    });
+    _actualMessages.forEach(
+        (String uri, Map<String, List<DiagnosticMessage>> actualMessagesMap) {
+      if (!_expectedJson.containsKey(uri)) {
+        actualMessagesMap
+            .forEach((String message, List<DiagnosticMessage> actualMessages) {
+          for (DiagnosticMessage message in actualMessages) {
+            reporter.reportError(message);
+            errorCount++;
           }
         });
       }
@@ -210,58 +293,70 @@
 
   ir.DartType visitNode(ir.Node node) {
     ir.DartType staticType = node?.accept(this);
-    assert(node is! ir.Expression ||
-        staticType == _getStaticTypeFromExpression(node));
+    assert(
+        node is! ir.Expression ||
+            staticType == typeEnvironment.nullType ||
+            typeEnvironment.isSubtypeOf(
+                staticType, _getStaticTypeFromExpression(node)),
+        reportAssertionFailure(
+            node,
+            "Unexpected static type for $node (${node.runtimeType}): "
+            "Found ${staticType}, expected ${_getStaticTypeFromExpression(node)}."));
     return staticType;
   }
 
   @override
   Null visitLibrary(ir.Library node) {
-    for (String path in analyzedPaths) {
-      if ('${node.importUri}'.startsWith(path)) {
-        return super.visitLibrary(node);
+    if (analyzedUrisFilter != null) {
+      if (analyzedUrisFilter(node.importUri)) {
+        super.visitLibrary(node);
       }
+    } else {
+      super.visitLibrary(node);
     }
   }
 
   @override
-  ir.DartType visitPropertyGet(ir.PropertyGet node) {
-    ir.DartType receiverType = visitNode(node.receiver);
-    ir.DartType result = computePropertyGetType(node, receiverType);
-    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
+  void handlePropertyGet(
+      ir.PropertyGet node, ir.DartType receiverType, ir.DartType resultType) {
     if (receiverType is ir.DynamicType) {
-      reportError(node, "Dynamic access of '${node.name}'.");
+      registerError(node, "Dynamic access of '${node.name}'.");
     }
-    return result;
   }
 
   @override
-  ir.DartType visitPropertySet(ir.PropertySet node) {
-    ir.DartType receiverType = visitNode(node.receiver);
-    ir.DartType result = visitNode(node.value);
-    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
+  void handlePropertySet(
+      ir.PropertySet node, ir.DartType receiverType, ir.DartType valueType) {
     if (receiverType is ir.DynamicType) {
-      reportError(node, "Dynamic update to '${node.name}'.");
+      registerError(node, "Dynamic update to '${node.name}'.");
     }
-    return result;
   }
 
   @override
-  ir.DartType visitMethodInvocation(ir.MethodInvocation node) {
-    ir.DartType receiverType = visitNode(node.receiver);
-    ir.DartType result = computeMethodInvocationType(node, receiverType);
-    if (!isSpecialCasedBinaryOperator(node.interfaceTarget)) {
-      visitNodes(node.arguments.positional);
-      visitNodes(node.arguments.named);
-    }
-    receiverType = narrowInstanceReceiver(node.interfaceTarget, receiverType);
+  void handleMethodInvocation(
+      ir.MethodInvocation node,
+      ir.DartType receiverType,
+      ArgumentTypes argumentTypes,
+      ir.DartType returnType) {
     if (receiverType is ir.DynamicType) {
-      reportError(node, "Dynamic invocation of '${node.name}'.");
+      registerError(node, "Dynamic invocation of '${node.name}'.");
     }
-    return result;
   }
 
-  void reportError(ir.Node node, String message) {
+  String reportAssertionFailure(ir.Node node, String message) {
+    SourceSpan span = computeSourceSpanFromTreeNode(node);
+    Uri uri = span.uri;
+    if (uri.scheme == 'org-dartlang-sdk') {
+      span = new SourceSpan(
+          Uri.base.resolve(uri.path.substring(1)), span.begin, span.end);
+    }
+    DiagnosticMessage diagnosticMessage =
+        reporter.createMessage(span, MessageKind.GENERIC, {'text': message});
+    reporter.reportError(diagnosticMessage);
+    return message;
+  }
+
+  void registerError(ir.Node node, String message) {
     SourceSpan span = computeSourceSpanFromTreeNode(node);
     Uri uri = span.uri;
     String uriString = relativize(Uri.base, uri, Platform.isWindows);
diff --git a/tests/compiler/dart2js/analyses/api_allowed.json b/tests/compiler/dart2js/analyses/api_allowed.json
index 830ee49..3139ef5 100644
--- a/tests/compiler/dart2js/analyses/api_allowed.json
+++ b/tests/compiler/dart2js/analyses/api_allowed.json
@@ -13,14 +13,10 @@
     "Dynamic invocation of '-'.": 4,
     "Dynamic invocation of '>>'.": 2,
     "Dynamic invocation of '&'.": 3,
-    "Dynamic invocation of '<'.": 6,
-    "Dynamic invocation of '>'.": 4,
+    "Dynamic invocation of '<'.": 3,
+    "Dynamic invocation of '>'.": 2,
     "Dynamic invocation of '+'.": 1,
-    "Dynamic access of '_js_helper::_self'.": 1,
-    "Dynamic access of '_js_helper::_target'.": 1,
-    "Dynamic access of '_js_helper::_receiver'.": 1,
-    "Dynamic access of 'length'.": 2,
-    "Dynamic invocation of '>='.": 1
+    "Dynamic access of 'length'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/string_helper.dart": {
     "Dynamic invocation of '<'.": 1,
@@ -68,12 +64,6 @@
     "Dynamic invocation of 'call'.": 4,
     "Dynamic invocation of 'then'.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/async/future.dart": {
-    "Dynamic invocation of 'call'.": 1
-  },
-  "org-dartlang-sdk:///sdk/lib/async/stream.dart": {
-    "Dynamic invocation of 'dart.async::_addError'.": 1
-  },
   "org-dartlang-sdk:///sdk/lib/async/async_error.dart": {
     "Dynamic invocation of 'call'.": 1
   },
@@ -90,25 +80,14 @@
     "Dynamic access of 'dart.collection::_element'.": 1,
     "Dynamic access of 'dart.collection::_first'.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/collection/iterable.dart": {
-    "Dynamic access of 'length'.": 2,
-    "Dynamic invocation of '+'.": 2
-  },
   "org-dartlang-sdk:///sdk/lib/html/dart2js/html_dart2js.dart": {
     "Dynamic access of 'style'.": 1,
-    "Dynamic access of 'left'.": 3,
-    "Dynamic access of 'top'.": 3,
-    "Dynamic access of 'width'.": 2,
-    "Dynamic access of 'height'.": 2,
     "Dynamic invocation of 'remove'.": 2,
     "Dynamic update to 'dart.dom.html::_innerHtml'.": 1,
     "Dynamic access of 'firstChild'.": 2,
     "Dynamic invocation of 'append'.": 1,
     "Dynamic access of 'tagName'.": 2,
     "Dynamic invocation of 'round'.": 20,
-    "Dynamic invocation of 'toList'.": 1,
-    "Dynamic access of 'right'.": 1,
-    "Dynamic access of 'bottom'.": 1,
     "Dynamic invocation of 'call'.": 1,
     "Dynamic invocation of 'dart.dom.html::_initKeyboardEvent'.": 1,
     "Dynamic access of 'attributes'.": 1,
@@ -176,11 +155,9 @@
     "Dynamic update to 'dart.io::_owner'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/io/secure_socket.dart": {
-    "Dynamic invocation of 'dart.io::_detachRaw'.": 2,
     "Dynamic invocation of '[]'.": 10,
-    "Dynamic access of 'dart.io::_socket'.": 1,
+    "Dynamic invocation of 'dart.io::_detachRaw'.": 2,
     "Dynamic access of 'closedReadEventSent'.": 1,
-    "Dynamic access of 'host'.": 1,
     "Dynamic update to 'dart.io::_owner'.": 1,
     "Dynamic access of 'length'.": 1,
     "Dynamic invocation of '~/'.": 1,
@@ -190,8 +167,7 @@
   "org-dartlang-sdk:///sdk/lib/io/stdio.dart": {
     "Dynamic invocation of 'writeFromSync'.": 1,
     "Dynamic invocation of 'cancel'.": 1,
-    "Dynamic invocation of 'closeSync'.": 1,
-    "Dynamic access of 'dart.io::_stream'.": 1
+    "Dynamic invocation of 'closeSync'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/io/common.dart": {
     "Dynamic invocation of '[]'.": 3
@@ -208,8 +184,8 @@
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/core_patch.dart": {
     "Dynamic access of 'dart.core::_digits'.": 2,
     "Dynamic invocation of '<'.": 2,
-    "Dynamic invocation of '+'.": 2,
     "Dynamic invocation of '[]'.": 19,
+    "Dynamic invocation of '+'.": 2,
     "Dynamic invocation of 'dart.core::_absSubSetSign'.": 3,
     "Dynamic invocation of 'dart.core::_absAndNotSetSign'.": 2,
     "Dynamic invocation of 'dart.core::_absAddSetSign'.": 2,
@@ -219,71 +195,20 @@
     "Dynamic invocation of '-'.": 1,
     "Dynamic invocation of '>='.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/core/date_time.dart": {
-    "Dynamic access of 'dart.core::_value'.": 1,
-    "Dynamic access of 'isUtc'.": 1
-  },
-  "org-dartlang-sdk:///sdk/lib/core/duration.dart": {
-    "Dynamic access of 'dart.core::_duration'.": 1
-  },
   "org-dartlang-sdk:///sdk/lib/core/errors.dart": {
-    "Dynamic access of 'length'.": 2,
-    "Dynamic invocation of '<'.": 2,
-    "Dynamic invocation of '~'.": 1,
-    "Dynamic invocation of '^'.": 1,
-    "Dynamic invocation of '&'.": 1,
-    "Dynamic invocation of '|'.": 1,
-    "Dynamic invocation of '>>'.": 1,
-    "Dynamic invocation of '<<'.": 1,
-    "Dynamic invocation of '+'.": 1,
-    "Dynamic invocation of 'unary-'.": 1,
-    "Dynamic invocation of '-'.": 1,
-    "Dynamic invocation of '*'.": 1,
-    "Dynamic invocation of '/'.": 1,
-    "Dynamic invocation of '~/'.": 1,
-    "Dynamic invocation of '>'.": 1,
-    "Dynamic invocation of '>='.": 1,
-    "Dynamic invocation of '<='.": 1,
-    "Dynamic invocation of '%'.": 1,
-    "Dynamic invocation of 'length'.": 1
-  },
-  "org-dartlang-sdk:///sdk/lib/core/exceptions.dart": {
-    "Dynamic access of 'length'.": 3,
-    "Dynamic invocation of 'codeUnitAt'.": 2,
-    "Dynamic invocation of 'substring'.": 1
-  },
-  "org-dartlang-sdk:///sdk/lib/core/uri.dart": {
-    "Dynamic access of 'isEmpty'.": 1,
-    "Dynamic invocation of 'startsWith'.": 1,
-    "Dynamic invocation of 'add'.": 1
-  },
-  "org-dartlang-sdk:///sdk/lib/math/point.dart": {
-    "Dynamic access of 'x'.": 1,
-    "Dynamic access of 'y'.": 1
-  },
-  "org-dartlang-sdk:///sdk/lib/math/rectangle.dart": {
-    "Dynamic access of 'left'.": 1,
-    "Dynamic access of 'top'.": 1,
-    "Dynamic access of 'right'.": 1,
-    "Dynamic access of 'bottom'.": 1
+    "Dynamic access of 'length'.": 2
   },
   "org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/convert_patch.dart": {
     "Dynamic invocation of 'clear'.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/convert/encoding.dart": {
-    "Dynamic invocation of 'write'.": 1
-  },
   "org-dartlang-sdk:///sdk/lib/convert/json.dart": {
     "Dynamic invocation of 'toJson'.": 1
   },
-  "org-dartlang-sdk:///sdk/lib/isolate/isolate.dart": {
-    "Dynamic invocation of '[]'.": 2
-  },
   "org-dartlang-sdk:///sdk/lib/_http/crypto.dart": {
     "Dynamic invocation of '+'.": 2,
     "Dynamic invocation of '&'.": 3,
-    "Dynamic invocation of '-'.": 2,
-    "Dynamic invocation of 'unary-'.": 1
+    "Dynamic invocation of 'unary-'.": 1,
+    "Dynamic invocation of '-'.": 2
   },
   "org-dartlang-sdk:///sdk/lib/_http/http_date.dart": {
     "Dynamic access of 'length'.": 3,
@@ -292,15 +217,13 @@
     "Dynamic invocation of '[]'.": 7
   },
   "org-dartlang-sdk:///sdk/lib/_http/http_headers.dart": {
-    "Dynamic invocation of 'toLowerCase'.": 1,
-    "Dynamic access of 'length'.": 1,
-    "Dynamic invocation of 'codeUnitAt'.": 1
+    "Dynamic invocation of 'toLowerCase'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/_http/http_impl.dart": {
     "Dynamic access of 'message'.": 3,
-    "Dynamic invocation of 'split'.": 1,
     "Dynamic invocation of 'trim'.": 1,
     "Dynamic invocation of 'toLowerCase'.": 1,
+    "Dynamic invocation of 'split'.": 1,
     "Dynamic invocation of 'call'.": 1,
     "Dynamic invocation of 'destroy'.": 2,
     "Dynamic invocation of 'setOption'.": 1,
@@ -321,4 +244,4 @@
     "Dynamic access of 'port'.": 1,
     "Dynamic invocation of 'dart._http::_toJSON'.": 1
   }
-}
+}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/analyses/api_dynamic_test.dart b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
index bb1564a..e06471d 100644
--- a/tests/compiler/dart2js/analyses/api_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/api_dynamic_test.dart
@@ -10,7 +10,8 @@
 main(List<String> args) {
   asyncTest(() async {
     await run(Uri.parse('memory:main.dart'),
-        'tests/compiler/dart2js/analyses/api_allowed.json', ['dart:'],
+        'tests/compiler/dart2js/analyses/api_allowed.json',
+        analyzedUrisFilter: (Uri uri) => uri.scheme == 'dart',
         memorySourceFiles: {'main.dart': 'main() {}'},
         verbose: args.contains('-v'),
         generate: args.contains('-g'));
diff --git a/tests/compiler/dart2js/analyses/dart2js_allowed.json b/tests/compiler/dart2js/analyses/dart2js_allowed.json
index c8f89bc6..5f6fdad 100644
--- a/tests/compiler/dart2js/analyses/dart2js_allowed.json
+++ b/tests/compiler/dart2js/analyses/dart2js_allowed.json
@@ -1,15 +1,13 @@
 {
   "pkg/compiler/lib/src/dart2js.dart": {
     "Dynamic invocation of 'call'.": 1,
-    "Dynamic invocation of 'pause'.": 1,
-    "Dynamic invocation of 'resume'.": 1
+    "Dynamic invocation of 'resume'.": 1,
+    "Dynamic invocation of 'pause'.": 1
   },
   "pkg/compiler/lib/src/source_file_provider.dart": {
     "Dynamic invocation of 'call'.": 3
   },
   "pkg/compiler/lib/src/util/util.dart": {
-    "Dynamic access of 'a'.": 1,
-    "Dynamic access of 'b'.": 1,
     "Dynamic invocation of 'write'.": 11,
     "Dynamic invocation of 'writeCharCode'.": 1
   },
@@ -45,75 +43,51 @@
     "Dynamic invocation of 'toSet'.": 1,
     "Dynamic invocation of 'toList'.": 1
   },
-  "pkg/compiler/lib/src/diagnostics/messages.dart": {
-    "Dynamic access of 'template'.": 1,
-    "Dynamic invocation of 'toDartText'.": 1
-  },
-  "pkg/compiler/lib/src/diagnostics/source_span.dart": {
-    "Dynamic access of 'uri'.": 1,
-    "Dynamic access of 'begin'.": 1,
-    "Dynamic access of 'end'.": 1
-  },
   "pkg/compiler/lib/src/deferred_load.dart": {
-    "Dynamic invocation of '[]='.": 1,
     "Dynamic access of 'memberContext'.": 1,
-    "Dynamic access of 'name'.": 1
-  },
-  "pkg/compiler/lib/src/elements/entities.dart": {
-    "Dynamic access of 'requiredParameters'.": 1,
-    "Dynamic access of 'positionalParameters'.": 1,
-    "Dynamic access of 'typeParameters'.": 1,
-    "Dynamic access of 'namedParameters'.": 2,
-    "Dynamic access of 'length'.": 1,
-    "Dynamic invocation of '[]'.": 1
+    "Dynamic access of 'name'.": 1,
+    "Dynamic invocation of '[]='.": 1
   },
   "pkg/compiler/lib/src/inferrer/typemasks/container_type_mask.dart": {
-    "Dynamic access of 'allocationNode'.": 2,
-    "Dynamic access of 'elementType'.": 3,
-    "Dynamic access of 'length'.": 2,
     "Dynamic access of 'isNullable'.": 2,
     "Dynamic access of 'isEmptyOrNull'.": 1,
     "Dynamic access of 'isContainer'.": 1,
+    "Dynamic access of 'elementType'.": 2,
+    "Dynamic access of 'length'.": 1,
     "Dynamic access of 'forwardTo'.": 1,
+    "Dynamic access of 'allocationNode'.": 1,
     "Dynamic access of 'allocationElement'.": 1
   },
   "pkg/compiler/lib/src/inferrer/typemasks/dictionary_type_mask.dart": {
-    "Dynamic access of 'allocationNode'.": 1,
-    "Dynamic access of 'keyType'.": 4,
-    "Dynamic access of 'valueType'.": 4,
-    "Dynamic access of 'masks::_typeMap'.": 5,
-    "Dynamic invocation of 'containsKey'.": 2,
-    "Dynamic access of 'keys'.": 1,
-    "Dynamic invocation of '[]'.": 1,
-    "Dynamic invocation of 'every'.": 1,
     "Dynamic access of 'isNullable'.": 2,
     "Dynamic access of 'isEmptyOrNull'.": 1,
     "Dynamic access of 'isDictionary'.": 1,
     "Dynamic access of 'forwardTo'.": 2,
+    "Dynamic access of 'keyType'.": 3,
+    "Dynamic access of 'valueType'.": 3,
+    "Dynamic access of 'masks::_typeMap'.": 2,
+    "Dynamic invocation of 'containsKey'.": 1,
     "Dynamic invocation of 'nullable'.": 2,
     "Dynamic invocation of 'union'.": 1,
     "Dynamic invocation of 'forEach'.": 1,
     "Dynamic access of 'isMap'.": 1
   },
   "pkg/compiler/lib/src/inferrer/typemasks/forwarding_type_mask.dart": {
-    "Dynamic access of 'forwardTo'.": 2,
-    "Dynamic invocation of 'nullable'.": 1,
-    "Dynamic invocation of 'nonNullable'.": 1,
     "Dynamic access of 'isNullable'.": 1
   },
   "pkg/compiler/lib/src/inferrer/typemasks/map_type_mask.dart": {
-    "Dynamic access of 'allocationNode'.": 2,
-    "Dynamic access of 'keyType'.": 5,
-    "Dynamic access of 'valueType'.": 3,
     "Dynamic access of 'isNullable'.": 2,
     "Dynamic access of 'isEmptyOrNull'.": 1,
     "Dynamic access of 'isMap'.": 1,
+    "Dynamic access of 'keyType'.": 4,
+    "Dynamic access of 'valueType'.": 2,
     "Dynamic access of 'forwardTo'.": 2,
     "Dynamic access of 'isDictionary'.": 1,
+    "Dynamic invocation of 'union'.": 1,
     "Dynamic access of 'typeMap'.": 1,
     "Dynamic access of 'values'.": 1,
-    "Dynamic invocation of 'union'.": 1,
     "Dynamic invocation of 'fold'.": 1,
+    "Dynamic access of 'allocationNode'.": 1,
     "Dynamic access of 'allocationElement'.": 1
   },
   "pkg/compiler/lib/src/inferrer/typemasks/type_mask.dart": {
@@ -127,38 +101,6 @@
     "Dynamic invocation of 'nonNullable'.": 1,
     "Dynamic invocation of 'every'.": 1
   },
-  "pkg/compiler/lib/src/inferrer/typemasks/value_type_mask.dart": {
-    "Dynamic access of 'value'.": 1
-  },
-  "pkg/compiler/lib/src/io/source_information.dart": {
-    "Dynamic access of 'sourceUri'.": 1,
-    "Dynamic access of 'offset'.": 1,
-    "Dynamic access of 'sourceName'.": 1
-  },
-  "pkg/compiler/lib/src/ssa/nodes.dart": {
-    "Dynamic invocation of 'replaceWith'.": 1
-  },
-  "pkg/compiler/lib/src/universe/world_builder.dart": {
-    "Dynamic access of 'cls'.": 1
-  },
-  "pkg/compiler/lib/src/universe/member_usage.dart": {
-    "Dynamic access of 'entity'.": 1
-  },
-  "pkg/compiler/lib/src/universe/resolution_world_builder.dart": {
-    "Dynamic access of 'type'.": 1,
-    "Dynamic access of 'kind'.": 1,
-    "Dynamic access of 'isRedirection'.": 1
-  },
-  "pkg/compiler/lib/src/constants/expressions.dart": {
-    "Dynamic access of 'kind'.": 1
-  },
-  "pkg/compiler/lib/src/helpers/trace.dart": {
-    "Dynamic access of 'index'.": 1,
-    "Dynamic access of 'file'.": 1,
-    "Dynamic access of 'lineNo'.": 1,
-    "Dynamic access of 'columnNo'.": 1,
-    "Dynamic access of 'method'.": 1
-  },
   "pkg/compiler/lib/src/helpers/expensive_map.dart": {
     "Dynamic access of 'length'.": 1,
     "Dynamic access of 'isEmpty'.": 1,
@@ -197,42 +139,12 @@
     "Dynamic invocation of '+'.": 2,
     "Dynamic invocation of '-'.": 1
   },
-  "pkg/compiler/lib/src/js_backend/native_data.dart": {
-    "Dynamic access of 'names'.": 1,
-    "Dynamic access of 'isNonLeaf'.": 1
-  },
-  "pkg/compiler/lib/src/elements/names.dart": {
-    "Dynamic access of 'library'.": 1
-  },
-  "pkg/compiler/lib/src/constants/values.dart": {
-    "Dynamic access of 'element'.": 1,
-    "Dynamic access of 'type'.": 1,
-    "Dynamic access of 'length'.": 1
-  },
-  "pkg/compiler/lib/src/elements/types.dart": {
-    "Dynamic access of 'element'.": 1
-  },
   "pkg/compiler/lib/src/js_backend/constant_system_javascript.dart": {
-    "Dynamic invocation of 'remainder'.": 1,
-    "Dynamic access of 'isString'.": 1,
-    "Dynamic access of 'stringValue'.": 1
+    "Dynamic invocation of 'remainder'.": 1
   },
   "pkg/compiler/lib/src/serialization/binary_sink.dart": {
     "Dynamic access of 'index'.": 1
   },
-  "pkg/compiler/lib/src/serialization/helpers.dart": {
-    "Dynamic access of 'value'.": 1
-  },
-  "pkg/compiler/lib/src/universe/use.dart": {
-    "Dynamic access of 'selector'.": 1,
-    "Dynamic access of 'receiverConstraint'.": 1,
-    "Dynamic access of 'typeArguments'.": 2,
-    "Dynamic access of 'element'.": 1,
-    "Dynamic access of 'kind'.": 2,
-    "Dynamic access of 'type'.": 2,
-    "Dynamic access of 'callStructure'.": 1,
-    "Dynamic access of 'value'.": 1
-  },
   "third_party/pkg/dart2js_info/lib/json_info_codec.dart": {
     "Dynamic invocation of '[]'.": 13,
     "Dynamic invocation of 'forEach'.": 3,
@@ -240,29 +152,23 @@
     "Dynamic access of 'length'.": 1
   },
   "pkg/compiler/lib/src/util/enumset.dart": {
-    "Dynamic access of 'index'.": 4,
-    "Dynamic access of 'value'.": 1
+    "Dynamic access of 'index'.": 4
   },
   "pkg/compiler/lib/src/native/enqueue.dart": {
     "Dynamic access of 'isDynamic'.": 1
   },
+  "pkg/compiler/lib/src/inferrer/inferrer_engine.dart": {
+    "Dynamic access of 'isVoid'.": 1,
+    "Dynamic access of 'isDynamic'.": 1,
+    "Dynamic access of 'isInterfaceType'.": 1,
+    "Dynamic access of 'element'.": 1
+  },
   "pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart": {
     "Dynamic access of 'name'.": 1
   },
-  "pkg/compiler/lib/src/js_backend/namer_names.dart": {
-    "Dynamic access of 'js_backend.namer::_target'.": 4,
-    "Dynamic access of 'base'.": 1,
-    "Dynamic access of 'prefix'.": 1,
-    "Dynamic access of 'js_backend.namer::_parts'.": 2,
-    "Dynamic access of 'length'.": 1,
-    "Dynamic invocation of '[]'.": 1
-  },
   "pkg/compiler/lib/src/universe/side_effects.dart": {
     "Dynamic access of 'universe.side_effects::_flags'.": 1
   },
-  "pkg/compiler/lib/src/closure.dart": {
-    "Dynamic access of 'typeVariable'.": 1
-  },
   "pkg/compiler/lib/src/native/behavior.dart": {
     "Dynamic invocation of 'add'.": 1
   },
@@ -279,65 +185,11 @@
     "Dynamic access of 'treatAsDynamic'.": 1,
     "Dynamic access of 'element'.": 1
   },
-  "pkg/compiler/lib/src/universe/feature.dart": {
-    "Dynamic access of 'type'.": 2,
-    "Dynamic access of 'isConstant'.": 2,
-    "Dynamic access of 'isEmpty'.": 2,
-    "Dynamic access of 'kind'.": 1,
-    "Dynamic access of 'receiverType'.": 1,
-    "Dynamic access of 'argumentType'.": 1,
-    "Dynamic access of 'functionType'.": 1,
-    "Dynamic access of 'typeArguments'.": 1
-  },
-  "pkg/compiler/lib/src/js_model/closure.dart": {
-    "Dynamic access of 'kind'.": 1,
-    "Dynamic access of 'member'.": 1,
-    "Dynamic access of 'localFunction'.": 1,
-    "Dynamic access of 'invocation'.": 1,
-    "Dynamic access of 'instantiation'.": 1,
-    "Dynamic access of 'closureClass'.": 1,
-    "Dynamic access of 'type'.": 1,
-    "Dynamic access of 'context'.": 1
-  },
   "pkg/compiler/lib/src/ssa/validate.dart": {
     "Dynamic invocation of 'isInBasicBlock'.": 2,
     "Dynamic access of 'usedBy'.": 2,
     "Dynamic access of 'inputs'.": 1
   },
-  "pkg/compiler/lib/src/inferrer/inferrer_engine.dart": {
-    "Dynamic access of 'isVoid'.": 1,
-    "Dynamic access of 'isDynamic'.": 1,
-    "Dynamic access of 'isInterfaceType'.": 1,
-    "Dynamic access of 'element'.": 1
-  },
-  "pkg/compiler/lib/src/universe/function_set.dart": {
-    "Dynamic access of 'selector'.": 1,
-    "Dynamic access of 'receiver'.": 1
-  },
-  "pkg/compiler/lib/src/constants/constructors.dart": {
-    "Dynamic access of 'type'.": 1,
-    "Dynamic access of 'superConstructorInvocation'.": 1,
-    "Dynamic access of 'defaultValues'.": 2,
-    "Dynamic access of 'fieldMap'.": 1,
-    "Dynamic access of 'thisConstructorInvocation'.": 1,
-    "Dynamic access of 'targetConstructorInvocation'.": 1
-  },
-  "pkg/compiler/lib/src/ssa/optimize.dart": {
-    "Dynamic access of 'isEmpty'.": 1,
-    "Dynamic invocation of 'replaceWith'.": 1,
-    "Dynamic access of 'inputs'.": 2,
-    "Dynamic invocation of '[]'.": 2,
-    "Dynamic invocation of 'isInteger'.": 1,
-    "Dynamic invocation of 'isConstantList'.": 1,
-    "Dynamic invocation of 'isConstantString'.": 1,
-    "Dynamic access of 'constant'.": 1,
-    "Dynamic access of 'length'.": 4,
-    "Dynamic access of 'instructionType'.": 2,
-    "Dynamic access of 'isContainer'.": 2,
-    "Dynamic access of 'isNullable'.": 1,
-    "Dynamic invocation of 'containsOnly'.": 2,
-    "Dynamic invocation of 'containsOnlyString'.": 1
-  },
   "pkg/compiler/lib/src/constant_system_dart.dart": {
     "Dynamic invocation of '|'.": 1,
     "Dynamic invocation of '&'.": 1,
@@ -385,10 +237,6 @@
     "Dynamic access of 'isEmpty'.": 1,
     "Dynamic invocation of 'satisfies'.": 2
   },
-  "pkg/compiler/lib/src/io/position_information.dart": {
-    "Dynamic access of 'startPosition'.": 1,
-    "Dynamic access of 'innerPosition'.": 1
-  },
   "pkg/compiler/lib/src/inferrer/locals_handler.dart": {
     "Dynamic access of 'isEmpty'.": 1,
     "Dynamic access of 'positional'.": 2,
@@ -396,62 +244,38 @@
     "Dynamic access of 'named'.": 2,
     "Dynamic invocation of '[]'.": 2
   },
-  "pkg/compiler/lib/src/inferrer/type_graph_dump.dart": {
-    "Dynamic invocation of 'contains'.": 2
+  "pkg/compiler/lib/src/universe/function_set.dart": {
+    "Dynamic access of 'selector'.": 1,
+    "Dynamic access of 'receiver'.": 1
   },
   "pkg/compiler/lib/src/ssa/variable_allocator.dart": {
-    "Dynamic access of 'checkedInput'.": 1,
     "Dynamic access of 'usedBy'.": 1,
     "Dynamic access of 'isEmpty'.": 1,
     "Dynamic invocation of 'nonCheck'.": 1,
     "Dynamic invocation of 'isCodeMotionInvariant'.": 1
   },
-  "pkg/compiler/lib/src/ssa/interceptor_simplifier.dart": {
-    "Dynamic access of 'interceptedClasses'.": 1
-  },
   "pkg/compiler/lib/src/ssa/value_range_analyzer.dart": {
     "Dynamic access of 'isZero'.": 2,
     "Dynamic invocation of '+'.": 2,
-    "Dynamic access of 'value'.": 7,
-    "Dynamic access of 'isInt'.": 3,
-    "Dynamic access of 'intValue'.": 4,
     "Dynamic invocation of 'unary-'.": 1,
     "Dynamic invocation of 'min'.": 1,
-    "Dynamic invocation of 'max'.": 1,
-    "Dynamic access of 'instruction'.": 1,
-    "Dynamic access of 'left'.": 4,
-    "Dynamic access of 'right'.": 4,
-    "Dynamic access of 'lower'.": 1,
-    "Dynamic access of 'upper'.": 1,
-    "Dynamic invocation of 'operation'.": 1
+    "Dynamic invocation of 'max'.": 1
   },
   "pkg/compiler/lib/src/ssa/value_set.dart": {
     "Dynamic invocation of 'add'.": 2
   },
-  "pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart": {
-    "Dynamic access of 'scheme'.": 1,
-    "Dynamic invocation of 'finalizeTokens'.": 1
-  },
   "pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart": {
     "Dynamic access of 'keys'.": 1,
     "Dynamic invocation of 'toSet'.": 1,
     "Dynamic invocation of '[]='.": 1,
     "Dynamic invocation of 'add'.": 1
   },
-  "pkg/compiler/lib/src/inferrer/node_tracer.dart": {
-    "Dynamic access of 'receiver'.": 2,
-    "Dynamic access of 'selector'.": 6,
-    "Dynamic access of 'name'.": 4,
-    "Dynamic access of 'isIndex'.": 1
-  },
-  "pkg/compiler/lib/src/hash/sha1.dart": {
-    "Dynamic invocation of '+'.": 2,
-    "Dynamic invocation of '&'.": 2,
-    "Dynamic invocation of '-'.": 1,
-    "Dynamic invocation of 'unary-'.": 1
+  "pkg/compiler/lib/src/util/features.dart": {
+    "Dynamic invocation of 'sort'.": 1,
+    "Dynamic invocation of 'join'.": 1
   },
   "pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart": {
     "Dynamic access of 'superclass'.": 1,
     "Dynamic access of 'needsTearOff'.": 1
   }
-}
\ No newline at end of file
+}
diff --git a/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart b/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
index 43ba39a..b65a57f 100644
--- a/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
+++ b/tests/compiler/dart2js/analyses/dart2js_dynamic_test.dart
@@ -5,19 +5,29 @@
 import 'package:async_helper/async_helper.dart';
 import 'analysis_helper.dart';
 
+/// Filter function used to only analysis dart2js source code.
+bool dart2jsOnly(Uri uri) {
+  String text = '$uri';
+  for (String path in [
+    'package:compiler/',
+    'package:js_ast/',
+    'package:dart2js_info/',
+    'package:js_runtime/'
+  ]) {
+    if (text.startsWith(path)) {
+      return true;
+    }
+  }
+  return false;
+}
+
 // TODO(johnniwinther): Remove unneeded dynamic accesses from dart2js source
 // code.
 main(List<String> args) {
   asyncTest(() async {
-    await run(
-        Uri.parse('package:compiler/src/dart2js.dart'),
+    await run(Uri.parse('package:compiler/src/dart2js.dart'),
         'tests/compiler/dart2js/analyses/dart2js_allowed.json',
-        [
-          'package:compiler/',
-          'package:js_ast/',
-          'package:dart2js_info/',
-          'package:js_runtime/'
-        ],
+        analyzedUrisFilter: dart2jsOnly,
         verbose: args.contains('-v'),
         generate: args.contains('-g'));
   });
diff --git a/tests/compiler/dart2js/analyses/static_type_visitor_test.dart b/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
index 3a5fabe..d546a06 100644
--- a/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
+++ b/tests/compiler/dart2js/analyses/static_type_visitor_test.dart
@@ -5,13 +5,14 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/ir/static_type.dart';
-import 'package:compiler/src/library_loader.dart';
+import 'package:compiler/src/kernel/loader.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 
 import '../helpers/memory_compiler.dart';
+import 'analysis_helper.dart';
 
 const String source = '''
 main() {}
@@ -21,18 +22,17 @@
   asyncTest(() async {
     Compiler compiler =
         await compilerFor(memorySourceFiles: {'main.dart': source});
-    LoadedLibraries loadedLibraries = await compiler.libraryLoader
-        .loadLibraries(Uri.parse('memory:main.dart'));
-    ir.Component component = loadedLibraries.component;
+    KernelResult result =
+        await compiler.kernelLoader.load(Uri.parse('memory:main.dart'));
+    ir.Component component = result.component;
     StaticTypeVisitor visitor = new Visitor(component);
     component.accept(visitor);
   });
 }
 
-class Visitor extends StaticTypeTraversalVisitor {
+class Visitor extends StaticTypeVisitorBase {
   Visitor(ir.Component component)
-      : super(new ir.TypeEnvironment(
-            new ir.CoreTypes(component), new ir.ClassHierarchy(component)));
+      : super(component, new ir.ClassHierarchy(component));
 
   ir.DartType getStaticType(ir.Expression node) {
     if (typeEnvironment == null) {
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
index e3ddbc7..705638c 100644
--- a/tests/compiler/dart2js/closure/closure_test.dart
+++ b/tests/compiler/dart2js/closure/closure_test.dart
@@ -10,9 +10,10 @@
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:compiler/src/js_model/locals.dart';
-import 'package:compiler/src/universe/world_builder.dart';
+import 'package:compiler/src/universe/codegen_world_builder.dart';
+import 'package:compiler/src/util/features.dart';
 import 'package:expect/expect.dart';
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -22,17 +23,16 @@
 main(List<String> args) {
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
-    await checkTests(dataDir, const ClosureDataComputer(),
-        args: args, testOmit: true);
+    await checkTests(dataDir, const ClosureDataComputer(), args: args);
   });
 }
 
-class ClosureDataComputer extends DataComputer {
+class ClosureDataComputer extends DataComputer<String> {
   const ClosureDataComputer();
 
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -54,10 +54,13 @@
             verbose: verbose)
         .run(definition.node);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
 /// Kernel IR visitor for computing closure data.
-class ClosureIrChecker extends IrDataExtractor {
+class ClosureIrChecker extends IrDataExtractor<String> {
   final MemberEntity member;
   final ClosureData closureDataLookup;
   final CodegenWorldBuilder codegenWorldBuilder;
@@ -73,7 +76,7 @@
 
   ClosureIrChecker(
       DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
+      Map<Id, ActualData<String>> actualMap,
       JsToElementMap elementMap,
       this.member,
       this._localsMap,
@@ -215,7 +218,7 @@
     } else {
       //Expect.isFalse(capturedScope.localIsUsedInTryOrSync(local));
     }
-    if (capturedScope.isBoxed(local)) {
+    if (capturedScope.isBoxedVariable(local)) {
       features.add('boxed');
     }
     if (capturedScope.context == local) {
diff --git a/tests/compiler/dart2js/closure/data/generic_strong.dart b/tests/compiler/dart2js/closure/data/generic.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/generic_strong.dart
rename to tests/compiler/dart2js/closure/data/generic.dart
diff --git a/tests/compiler/dart2js/closure/data/instantiation_strong.dart b/tests/compiler/dart2js/closure/data/instantiation.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/instantiation_strong.dart
rename to tests/compiler/dart2js/closure/data/instantiation.dart
diff --git a/tests/compiler/dart2js/closure/data/list_literal_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_class.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/list_literal_trust.dart
rename to tests/compiler/dart2js/closure/data/list_literal_class.dart
diff --git a/tests/compiler/dart2js/closure/data/list_literal_strong_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_method.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/list_literal_strong_trust.dart
rename to tests/compiler/dart2js/closure/data/list_literal_method.dart
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
rename to tests/compiler/dart2js/closure/data/list_literal_untested_class.dart
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
rename to tests/compiler/dart2js/closure/data/list_literal_untested_method.dart
diff --git a/tests/compiler/dart2js/closure/data/map_literal_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_class.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/map_literal_trust.dart
rename to tests/compiler/dart2js/closure/data/map_literal_class.dart
diff --git a/tests/compiler/dart2js/closure/data/map_literal_strong_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_method.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/map_literal_strong_trust.dart
rename to tests/compiler/dart2js/closure/data/map_literal_method.dart
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
rename to tests/compiler/dart2js/closure/data/map_literal_untested_class.dart
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
rename to tests/compiler/dart2js/closure/data/map_literal_untested_method.dart
diff --git a/tests/compiler/dart2js/closure/data/test_type.dart b/tests/compiler/dart2js/closure/data/test_type_class.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/test_type.dart
rename to tests/compiler/dart2js/closure/data/test_type_class.dart
diff --git a/tests/compiler/dart2js/closure/data/test_type_strong.dart b/tests/compiler/dart2js/closure/data/test_type_method.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/test_type_strong.dart
rename to tests/compiler/dart2js/closure/data/test_type_method.dart
diff --git a/tests/compiler/dart2js/closure/data/type_annotations.dart b/tests/compiler/dart2js/closure/data/type_annotations_class.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/type_annotations.dart
rename to tests/compiler/dart2js/closure/data/type_annotations_class.dart
diff --git a/tests/compiler/dart2js/closure/data/type_annotations_strong.dart b/tests/compiler/dart2js/closure/data/type_annotations_method.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/type_annotations_strong.dart
rename to tests/compiler/dart2js/closure/data/type_annotations_method.dart
diff --git a/tests/compiler/dart2js/closure/data/type_arguments.dart b/tests/compiler/dart2js/closure/data/type_arguments_class.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/type_arguments.dart
rename to tests/compiler/dart2js/closure/data/type_arguments_class.dart
diff --git a/tests/compiler/dart2js/closure/data/type_arguments_strong.dart b/tests/compiler/dart2js/closure/data/type_arguments_method.dart
similarity index 100%
rename from tests/compiler/dart2js/closure/data/type_arguments_strong.dart
rename to tests/compiler/dart2js/closure/data/type_arguments_method.dart
diff --git a/tests/compiler/dart2js/codegen/class_codegen_test.dart b/tests/compiler/dart2js/codegen/class_codegen_test.dart
index a9439f9..bb22e20 100644
--- a/tests/compiler/dart2js/codegen/class_codegen_test.dart
+++ b/tests/compiler/dart2js/codegen/class_codegen_test.dart
@@ -66,14 +66,14 @@
 
 twoClasses() async {
   String generated = await compileAll(TEST_ONE);
-  Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
-  Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"\\^": "Object;"')));
+  Expect.isTrue(generated.contains('A: function A()'));
+  Expect.isTrue(generated.contains('B: function B()'));
 }
 
 subClass() async {
   checkOutput(String generated) {
-    Expect.isTrue(generated.contains(new RegExp('A: {[ \n]*"\\^": "Object;"')));
-    Expect.isTrue(generated.contains(new RegExp('B: {[ \n]*"\\^": "A;"')));
+    Expect.isTrue(generated.contains(RegExp(r'_inherit\(.\.A, .\.Object\)')));
+    Expect.isTrue(generated.contains(RegExp(r'_inherit\(.\.B, .\.A\)')));
   }
 
   checkOutput(await compileAll(TEST_TWO));
@@ -82,12 +82,15 @@
 
 fieldTest() async {
   String generated = await compileAll(TEST_FOUR);
-  Expect.isTrue(generated
-      .contains(new RegExp('B: {[ \n]*"\\^": "A;y,z,x",[ \n]*static:')));
+  Expect.isTrue(generated.contains(RegExp(r'B: function B\(t0, t1, t2\) {'
+      r'\s*this.y = t0;'
+      r'\s*this.z = t1;'
+      r'\s*this.x = t2;')));
 }
 
 constructor1() async {
   String generated = await compileAll(TEST_FIVE);
+  print('--------------------\n$generated\n');
   Expect.isTrue(generated.contains(new RegExp(r"new [$A-Z]+\.A\(a\);")));
 }
 
diff --git a/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart b/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart
new file mode 100644
index 0000000..74d86f6
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/closure_call_of_static_reduction_test.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import '../helpers/compiler_helper.dart';
+
+const String TEST1 = r"""
+aNonInstanceMethod(x) { print(x); }
+const f = aNonInstanceMethod;
+foo() {
+  f(1);
+  // Closure call is reduced to a direct static call.
+  // present: '.aNonInstanceMethod(1)'
+  // absent: '.call$1(1)'
+}
+""";
+
+const String TEST2 = r"""
+aNonInstanceMethod([x]) { print(x); }
+final f = aNonInstanceMethod;
+foo() {
+  f(1);
+  // Closure call is reduced to a direct static call.
+  // present: '.aNonInstanceMethod(1)'
+  // absent: '.call$1(1)'
+}
+""";
+
+const String TEST3 = r"""
+aNonInstanceMethod([x]) { print(x); }
+const f = aNonInstanceMethod;
+foo() {
+  f();
+  // Closure call is not reduced to a direct static call due to not wanting to
+  // add default arguments. This may change.
+  // absent: '.aNonInstanceMethod('
+  // present: '.call$0()'
+}
+""";
+
+// TODO(29147): Add tests like above where 'f' is local. The above tests fail if
+// 'f' is local due to static function references sometimes being represented by
+// HConstant (as above) and other times being referenced as HStatic.
+
+main() {
+  runTests() async {
+    Future check(String test) {
+      return compile(test, entry: 'foo', check: checkerForAbsentPresent(test));
+    }
+
+    await check(TEST1);
+    await check(TEST2);
+    await check(TEST3);
+  }
+
+  asyncTest(() async {
+    print('--test from kernel------------------------------------------------');
+    await runTests();
+  });
+}
diff --git a/tests/compiler/dart2js/codegen/equals_test.dart b/tests/compiler/dart2js/codegen/equals_test.dart
index 9395108..45bbf50 100644
--- a/tests/compiler/dart2js/codegen/equals_test.dart
+++ b/tests/compiler/dart2js/codegen/equals_test.dart
@@ -43,7 +43,7 @@
 """;
 
 // Comparable includes String and int, so can't be compared with `a == b` since
-// that will convert an operand to make `2 =="2"` true.
+// that will convert an operand to make `2 == "2"` true.
 const String TEST5 = r"""
 foo(Comparable a, Comparable b) {
   return a == b;
@@ -63,6 +63,17 @@
 }
 """;
 
+// StringBuffer uses `Object.==`, i.e. `identical`.  This can be lowered to `==`
+// because no operand will cause JavaScript conversions.
+const String TEST7 = r"""
+foo(StringBuffer a, StringBuffer b) {
+  return a == b;
+  // present: ' == '
+  // absent: '==='
+  // absent: 'eq'
+}
+""";
+
 main() {
   runTests() async {
     Future check(String test) {
@@ -75,6 +86,7 @@
     await check(TEST4);
     await check(TEST5);
     await check(TEST6);
+    await check(TEST7);
   }
 
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index f317c5b..bcff3bd 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -7,7 +7,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
-import 'package:compiler/src/types/types.dart';
+import 'package:compiler/src/inferrer/types.dart';
 import 'package:compiler/src/world.dart' show JClosedWorld;
 import '../inference/type_mask_test_helper.dart';
 import '../helpers/memory_compiler.dart';
@@ -21,28 +21,13 @@
 @AssumeDynamic()
 int methodAssumeDynamic(String arg) => arg.length;
 
-@TrustTypeAnnotations()
-int methodTrustTypeAnnotations(String arg) => arg.length;
-
 @NoInline()
 int methodNoInline(String arg) => arg.length;
 
-@NoInline() @TrustTypeAnnotations()
-int methodNoInlineTrustTypeAnnotations(String arg) => arg.length;
-
-@AssumeDynamic() @TrustTypeAnnotations()
-int methodAssumeDynamicTrustTypeAnnotations(String arg) => arg.length;
-
-
 void main(List<String> args) {
   print(method(args[0]));
   print(methodAssumeDynamic('foo'));
-  print(methodTrustTypeAnnotations(42 as dynamic));
-  print(methodTrustTypeAnnotations("fourtyTwo"));
   print(methodNoInline('bar'));
-  print(methodNoInlineTrustTypeAnnotations(42 as dynamic));
-  print(methodNoInlineTrustTypeAnnotations("fourtyTwo"));
-  print(methodAssumeDynamicTrustTypeAnnotations(null));
 }
 """
 };
@@ -61,8 +46,6 @@
   Expect.isFalse(compiler.compilationFailed, 'Unsuccessful compilation');
   Expect.isNotNull(closedWorld.commonElements.expectNoInlineClass,
       'NoInlineClass is unresolved.');
-  Expect.isNotNull(closedWorld.commonElements.expectTrustTypeAnnotationsClass,
-      'TrustTypeAnnotations is unresolved.');
   Expect.isNotNull(closedWorld.commonElements.expectAssumeDynamicClass,
       'AssumeDynamicClass is unresolved.');
 
@@ -83,7 +66,6 @@
 
   void test(String name,
       {bool expectNoInline: false,
-      bool expectTrustTypeAnnotations: false,
       TypeMask expectedParameterType: null,
       TypeMask expectedReturnType: null,
       bool expectAssumeDynamic: false}) {
@@ -96,41 +78,18 @@
         closedWorld.annotationsData.nonInlinableFunctions.contains(method),
         "Unexpected annotation of @NoInline() on '$method'.");
     Expect.equals(
-        expectTrustTypeAnnotations,
-        closedWorld.annotationsData.trustTypeAnnotationsMembers
-            .contains(method),
-        "Unexpected annotation of @TrustTypeAnnotations() on '$method'.");
-    Expect.equals(
         expectAssumeDynamic,
         closedWorld.annotationsData.assumeDynamicMembers.contains(method),
         "Unexpected annotation of @AssumeDynamic() on '$method'.");
     GlobalTypeInferenceResults results =
         compiler.globalInference.resultsForTesting;
-    if (expectTrustTypeAnnotations && expectedParameterType != null) {
-      testTypeMatch(method, expectedParameterType, expectedReturnType, results);
-    } else if (expectAssumeDynamic) {
+    if (expectAssumeDynamic) {
       testTypeMatch(
           method, closedWorld.abstractValueDomain.dynamicType, null, results);
     }
   }
 
-  TypeMask jsStringType = closedWorld.abstractValueDomain.stringType;
-  TypeMask jsIntType = closedWorld.abstractValueDomain.intType;
-  TypeMask coreStringType =
-      new TypeMask.subtype(closedWorld.commonElements.stringClass, closedWorld);
-
   test('method');
   test('methodAssumeDynamic', expectAssumeDynamic: true);
-  test('methodTrustTypeAnnotations',
-      expectTrustTypeAnnotations: true, expectedParameterType: jsStringType);
   test('methodNoInline', expectNoInline: true);
-  test('methodNoInlineTrustTypeAnnotations',
-      expectNoInline: true,
-      expectTrustTypeAnnotations: true,
-      expectedParameterType: jsStringType,
-      expectedReturnType: jsIntType);
-  test('methodAssumeDynamicTrustTypeAnnotations',
-      expectAssumeDynamic: true,
-      expectTrustTypeAnnotations: true,
-      expectedParameterType: coreStringType);
 }
diff --git a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
index d908ebd..6695ad2 100644
--- a/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_dynamic_field_get_test.dart
@@ -9,7 +9,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/names.dart';
 import 'package:compiler/src/universe/selector.dart' show Selector;
-import 'package:compiler/src/world.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:expect/expect.dart';
 import '../helpers/compiler_helper.dart';
 import '../helpers/memory_compiler.dart';
@@ -34,7 +34,7 @@
         memorySourceFiles: {'main.dart': TEST},
         outputProvider: outputCollector);
     Compiler compiler = result.compiler;
-    ClosedWorldBase closedWorld = compiler.backendClosedWorldForTesting;
+    JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     var elementEnvironment = closedWorld.elementEnvironment;
 
     String generated = outputCollector.getOutput('', OutputType.js);
diff --git a/tests/compiler/dart2js/codegen/gvn_test.dart b/tests/compiler/dart2js/codegen/gvn_test.dart
index 54f4d30..678d9fc 100644
--- a/tests/compiler/dart2js/codegen/gvn_test.dart
+++ b/tests/compiler/dart2js/codegen/gvn_test.dart
@@ -108,24 +108,22 @@
 main() {
   runTests() async {
     await compile(TEST_ONE, entry: 'foo', check: (String generated) {
-      RegExp regexp = new RegExp(r"1 \+ [a-z]+");
+      RegExp regexp = RegExp(r"1 \+ [a-z]+");
       checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
     });
     await compile(TEST_TWO, entry: 'foo', check: (String generated) {
-      checkNumberOfMatches(
-          new RegExp("length").allMatches(generated).iterator, 1);
+      checkNumberOfMatches(RegExp("length").allMatches(generated).iterator, 1);
     });
     await compile(TEST_THREE, entry: 'foo', check: (String generated) {
-      checkNumberOfMatches(
-          new RegExp("number").allMatches(generated).iterator, 1);
+      checkNumberOfMatches(RegExp("number").allMatches(generated).iterator, 1);
     });
     await compile(TEST_FOUR, entry: 'foo', check: (String generated) {
-      checkNumberOfMatches(new RegExp("shr").allMatches(generated).iterator, 1);
+      checkNumberOfMatches(RegExp("shr").allMatches(generated).iterator, 1);
     });
 
     await compileAll(TEST_FIVE).then((generated) {
       checkNumberOfMatches(
-          new RegExp("get\\\$foo").allMatches(generated).iterator, 1);
+          RegExp(r"get\$foo\(").allMatches(generated).iterator, 1);
     });
     await compileAll(TEST_SIX).then((generated) {
       Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
new file mode 100644
index 0000000..c014519
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_get.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  method1(new Class1a());
+  method2(new Class2a<int>());
+  method3(new Class3a());
+  method3(new Class3b());
+  method4(new Class4a());
+  method4(new Class4b());
+}
+
+class Class1a {
+  /*element: Class1a.field1:*/
+  int field1;
+}
+
+@pragma('dart2js:noInline')
+method1(dynamic c) {
+  return c.field1;
+}
+
+class Class2a<T> {
+  /*element: Class2a.field2:*/
+  T field2;
+}
+
+@pragma('dart2js:noInline')
+method2(dynamic c) {
+  return c.field2;
+}
+
+class Class3a {
+  /*element: Class3a.field3:get=simple*/
+  int field3;
+}
+
+class Class3b {
+  /*element: Class3b.field3:get=simple*/
+  int field3;
+}
+
+@pragma('dart2js:noInline')
+method3(dynamic c) {
+  return c.field3;
+}
+
+class Class4a {
+  /*element: Class4a.field4:get=simple*/
+  int field4;
+}
+
+class Class4b implements Class4a {
+  /*element: Class4b.field4:get=simple*/
+  int field4;
+}
+
+@pragma('dart2js:noInline')
+method4(Class4a c) {
+  return c.field4;
+}
diff --git a/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart b/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
new file mode 100644
index 0000000..ac96348
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/model_data/dynamic_set.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  method1(new Class1a());
+  method2(new Class2a<int>());
+  method3(new Class3a());
+  method3(new Class3b());
+  method4(new Class4a());
+  method4(new Class4b());
+}
+
+class Class1a {
+  /*element: Class1a.field1:*/
+  int field1;
+}
+
+@pragma('dart2js:noInline')
+method1(dynamic c) {
+  c.field1 = 42;
+}
+
+class Class2a<T> {
+  /*strong.element: Class2a.field2:checked*/
+  /*omit.element: Class2a.field2:*/
+  T field2;
+}
+
+@pragma('dart2js:noInline')
+method2(dynamic c) {
+  c.field2 = 42;
+}
+
+class Class3a {
+  /*strong.element: Class3a.field3:checked*/
+  /*omit.element: Class3a.field3:set=simple*/
+  int field3;
+}
+
+class Class3b {
+  /*strong.element: Class3b.field3:checked*/
+  /*omit.element: Class3b.field3:set=simple*/
+  int field3;
+}
+
+@pragma('dart2js:noInline')
+method3(dynamic c) {
+  c.field3 = 42;
+}
+
+class Class4a {
+  /*strong.element: Class4a.field4:checked*/
+  /*omit.element: Class4a.field4:set=simple*/
+  int field4;
+}
+
+class Class4b implements Class4a {
+  /*strong.element: Class4b.field4:checked*/
+  /*omit.element: Class4b.field4:set=simple*/
+  int field4;
+}
+
+@pragma('dart2js:noInline')
+method4(Class4a c) {
+  c.field4 = 42;
+}
diff --git a/tests/compiler/dart2js/codegen/model_test.dart b/tests/compiler/dart2js/codegen/model_test.dart
new file mode 100644
index 0000000..fffbce8
--- /dev/null
+++ b/tests/compiler/dart2js/codegen/model_test.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_emitter/model.dart';
+import 'package:compiler/src/js_model/element_map.dart';
+import 'package:compiler/src/js_model/js_world.dart';
+import 'package:compiler/src/util/features.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+import '../helpers/program_lookup.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir =
+        new Directory.fromUri(Platform.script.resolve('model_data'));
+    await checkTests(dataDir, const ModelDataComputer(), args: args);
+  });
+}
+
+class ModelDataComputer extends DataComputer<String> {
+  const ModelDataComputer();
+
+  /// Compute type inference data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose: false}) {
+    JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    JsToElementMap elementMap = closedWorld.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new ModelIrComputer(compiler.reporter, actualMap, elementMap, member,
+            compiler, closedWorld.closureDataLookup)
+        .run(definition.node);
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+class Tags {
+  static const String needsCheckedSetter = 'checked';
+  static const String getterFlags = 'get';
+  static const String setterFlags = 'set';
+}
+
+/// AST visitor for computing inference data for a member.
+class ModelIrComputer extends IrDataExtractor<String> {
+  final JsToElementMap _elementMap;
+  final ClosureData _closureDataLookup;
+  final ProgramLookup _programLookup;
+
+  ModelIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap,
+      this._elementMap,
+      MemberEntity member,
+      Compiler compiler,
+      this._closureDataLookup)
+      : _programLookup = new ProgramLookup(compiler),
+        super(reporter, actualMap);
+
+  String getMemberValue(MemberEntity member) {
+    if (member is FieldEntity) {
+      Field field = _programLookup.getField(member);
+      if (field != null) {
+        Features features = new Features();
+        if (field.needsCheckedSetter) {
+          features.add(Tags.needsCheckedSetter);
+        }
+        void registerFlags(String tag, int flags) {
+          switch (flags) {
+            case 0:
+              break;
+            case 1:
+              features.add(tag, value: 'simple');
+              break;
+            case 2:
+              features.add(tag, value: 'intercepted');
+              break;
+            case 3:
+              features.add(tag, value: 'interceptedThis');
+              break;
+          }
+        }
+
+        registerFlags(Tags.getterFlags, field.getterFlags);
+        registerFlags(Tags.setterFlags, field.setterFlags);
+
+        return features.getText();
+      }
+    }
+    return null;
+  }
+
+  @override
+  String computeMemberValue(Id id, ir.Member node) {
+    return getMemberValue(_elementMap.getMember(node));
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
+      ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
+      return getMemberValue(info.callMethod);
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
index e34f13c..7edc700 100644
--- a/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
+++ b/tests/compiler/dart2js/codegen/no_constructor_body_test.dart
@@ -20,9 +20,8 @@
 main() {
   runTest() async {
     String generated = await compileAll(TEST);
-
-    Expect.isTrue(generated
-        .contains(new RegExp('A: {[ \n]*"\\^": "Object;",[ \n]*static:')));
+    // No methods (including no constructor body method.
+    Expect.isTrue(generated.contains('.A.prototype = {}'));
   }
 
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
index 194fce2..8d18091 100644
--- a/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
+++ b/tests/compiler/dart2js/codegen/no_duplicate_constructor_body_test.dart
@@ -18,9 +18,14 @@
 main() {
   runTest() async {
     String generated = await compileAll(CODE);
-    RegExp regexp = new RegExp(r'\A: {[ \n]*"\^": "[A-Za-z]+;"');
+
+    RegExp regexp = RegExp(r'\.A\.prototype = {');
     Iterator<Match> matches = regexp.allMatches(generated).iterator;
     checkNumberOfMatches(matches, 1);
+
+    RegExp regexp2 = RegExp(r'A\$\w+: function');
+    Iterator<Match> matches2 = regexp2.allMatches(generated).iterator;
+    checkNumberOfMatches(matches2, 1);
   }
 
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
index 9f2eed7..fc46ac1 100644
--- a/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
+++ b/tests/compiler/dart2js/codegen/trust_type_annotations2_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import 'package:compiler/src/commandline_options.dart';
 import '../helpers/memory_compiler.dart';
 
 const MEMORY_SOURCE_FILES = const {
@@ -26,9 +25,7 @@
 
 main() {
   runTest() async {
-    var options = [Flags.trustTypeAnnotations];
-    var result = await runCompiler(
-        memorySourceFiles: MEMORY_SOURCE_FILES, options: options);
+    var result = await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
     var compiler = result.compiler;
     var element =
         compiler.backendClosedWorldForTesting.elementEnvironment.mainFunction;
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index 774fd9a..aacfc98 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
+import "package:compiler/src/inferrer/abstract_value_domain.dart";
 import "package:compiler/src/ssa/nodes.dart";
 import "package:compiler/src/ssa/value_range_analyzer.dart";
-import "package:compiler/src/types/abstract_value_domain.dart";
 import "package:compiler/src/js_backend/constant_system_javascript.dart";
 
 ValueRangeInfo info = new ValueRangeInfo(JavaScriptConstantSystem.only);
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index b39dc5f4f..3df3488 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -3,6 +3,8 @@
 # BSD-style license that can be found in the LICENSE file.
 
 analyses/analyze_test: Slow, Pass
+analyses/api_dynamic_test: Slow, Pass
+analyses/dart2js_dynamic_test: Slow, Pass
 closure/closure_test: Pass, Slow
 codegen/gvn_dynamic_field_get_test: Fail # Issue 18519
 codegen/list_tracer_length_test: Fail # Issue 33051
diff --git a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
index 4d11985..70df323 100644
--- a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
+++ b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
@@ -57,7 +57,8 @@
 
     // Test that inlineSameContext was inlined into lib1.
     RegExp re4 = new RegExp(r"inline same context");
-    Expect.isFalse(re4.hasMatch(lib3Output));
+    // Output can be null when it contains no code.
+    Expect.isTrue(lib3Output == null || !re4.hasMatch(lib3Output));
     Expect.isTrue(re4.hasMatch(lib1Output));
   });
 }
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
index 97b8230..e79c1f8 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
@@ -57,7 +57,7 @@
     // InputElement is native, so it should be in the mainOutputUnit.
     Expect.equals(mainOutputUnit, outputUnitForClass(inputElement));
 
-    var hunksToLoad = compiler.deferredLoadTask.hunksToLoad;
+    var hunksToLoad = closedWorld.outputUnitData.hunksToLoad;
 
     var hunksLib1 = hunksToLoad["lib1"];
     var hunksLib2 = hunksToLoad["lib2"];
diff --git a/tests/compiler/dart2js/deferred/load_mapping_test.dart b/tests/compiler/dart2js/deferred/load_mapping_test.dart
index 51ae1a8..74c0c43 100644
--- a/tests/compiler/dart2js/deferred/load_mapping_test.dart
+++ b/tests/compiler/dart2js/deferred/load_mapping_test.dart
@@ -5,6 +5,7 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/world.dart';
 import '../helpers/memory_source_file_helper.dart';
 import '../helpers/memory_compiler.dart';
 
@@ -16,10 +17,13 @@
         options: ['--deferred-map=deferred_map.json'],
         outputProvider: collector);
     CompilerImpl compiler = result.compiler;
+    JClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     // Ensure a mapping file is output.
-    Expect.isNotNull(collector.getOutput("deferred_map.json", OutputType.info));
+    Expect.isNotNull(
+        collector.getOutput("deferred_map.json", OutputType.deferredMap));
 
-    Map mapping = compiler.deferredLoadTask.computeDeferredMap();
+    Map mapping = closedWorld.outputUnitData
+        .computeDeferredMap(compiler.options, closedWorld.elementEnvironment);
     // Test structure of mapping.
     Expect.equals("<unnamed>", mapping["main.dart"]["name"]);
     Expect.equals(2, mapping["main.dart"]["imports"]["lib1"].length);
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation0_strong.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation0.dart
similarity index 100%
rename from tests/compiler/dart2js/deferred_loading/data/instantiation0_strong.dart
rename to tests/compiler/dart2js/deferred_loading/data/instantiation0.dart
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation1_strong.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation1.dart
similarity index 100%
rename from tests/compiler/dart2js/deferred_loading/data/instantiation1_strong.dart
rename to tests/compiler/dart2js/deferred_loading/data/instantiation1.dart
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation2_strong.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation2.dart
similarity index 100%
rename from tests/compiler/dart2js/deferred_loading/data/instantiation2_strong.dart
rename to tests/compiler/dart2js/deferred_loading/data/instantiation2.dart
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation3_strong.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation3.dart
similarity index 100%
rename from tests/compiler/dart2js/deferred_loading/data/instantiation3_strong.dart
rename to tests/compiler/dart2js/deferred_loading/data/instantiation3.dart
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation4_strong.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation4.dart
similarity index 100%
rename from tests/compiler/dart2js/deferred_loading/data/instantiation4_strong.dart
rename to tests/compiler/dart2js/deferred_loading/data/instantiation4.dart
diff --git a/tests/compiler/dart2js/deferred_loading/data/instantiation5_strong.dart b/tests/compiler/dart2js/deferred_loading/data/instantiation5.dart
similarity index 100%
rename from tests/compiler/dart2js/deferred_loading/data/instantiation5_strong.dart
rename to tests/compiler/dart2js/deferred_loading/data/instantiation5.dart
diff --git a/tests/compiler/dart2js/deferred_loading/data/static_separate.dart b/tests/compiler/dart2js/deferred_loading/data/static_separate.dart
index ac5b27d..1f5a958 100644
--- a/tests/compiler/dart2js/deferred_loading/data/static_separate.dart
+++ b/tests/compiler/dart2js/deferred_loading/data/static_separate.dart
@@ -15,7 +15,9 @@
 /*element: main:OutputUnit(main, {})*/
 void main() {
   asyncStart();
-  Expect.throws(/*OutputUnit(main, {})*/ () => new lib1.C());
+  Expect.throws(/*OutputUnit(main, {})*/ () {
+    new lib1.C();
+  });
   lib1.loadLibrary().then(/*OutputUnit(main, {})*/ (_) {
     lib2.loadLibrary().then(/*OutputUnit(main, {})*/ (_) {
       print("HERE");
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index 349532c..ea3fd84 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/ir/util.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:expect/expect.dart';
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -34,8 +34,7 @@
     await checkTests(dataDir, const OutputUnitDataComputer(),
         libDirectory: new Directory.fromUri(Platform.script.resolve('libs')),
         options: compilerOptions,
-        args: args,
-        testOmit: true, setUpFunction: () {
+        args: args, setUpFunction: () {
       importPrefixes.clear();
     });
   });
@@ -76,7 +75,7 @@
   return 'OutputUnit(${unit.name}, {$sb})';
 }
 
-class OutputUnitDataComputer extends DataComputer {
+class OutputUnitDataComputer extends DataComputer<String> {
   const OutputUnitDataComputer();
 
   /// OutputData for [member] as a kernel based element.
@@ -86,8 +85,8 @@
   /// fill [actualMap] with the data computed about what the resulting OutputUnit
   /// is.
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -102,7 +101,7 @@
 
   @override
   void computeClassData(
-      Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+      Compiler compiler, ClassEntity cls, Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     OutputUnitData data = closedWorld.outputUnitData;
@@ -119,16 +118,19 @@
         actualMap,
         compiler.reporter);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
-class OutputUnitIrComputer extends IrDataExtractor {
+class OutputUnitIrComputer extends IrDataExtractor<String> {
   final JsToElementMap _elementMap;
   final OutputUnitData _data;
   final ClosureData _closureDataLookup;
 
   OutputUnitIrComputer(
       DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
+      Map<Id, ActualData<String>> actualMap,
       this._elementMap,
       MemberEntity member,
       this._data,
@@ -180,10 +182,10 @@
 /// Set [actualMap] to hold a key of [id] with the computed data [value]
 /// corresponding to [object] at location [sourceSpan]. We also perform error
 /// checking to ensure that the same [id] isn't added twice.
-void _registerValue(Id id, String value, Object object, SourceSpan sourceSpan,
-    Map<Id, ActualData> actualMap, CompilerDiagnosticReporter reporter) {
+void _registerValue<T>(Id id, T value, Object object, SourceSpan sourceSpan,
+    Map<Id, ActualData<T>> actualMap, CompilerDiagnosticReporter reporter) {
   if (actualMap.containsKey(id)) {
-    ActualData existingData = actualMap[id];
+    ActualData<T> existingData = actualMap[id];
     reportHere(reporter, sourceSpan,
         "Duplicate id ${id}, value=$value, object=$object");
     reportHere(
@@ -194,6 +196,6 @@
     Expect.fail("Duplicate id $id.");
   }
   if (value != null) {
-    actualMap[id] = new ActualData(new IdValue(id, value), sourceSpan, object);
+    actualMap[id] = new ActualData<T>(id, value, sourceSpan, object);
   }
 }
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart
index 7587f4e..194e27d 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib1.dart
@@ -4,6 +4,6 @@
 
 import "deferred_overlapping_lib3.dart";
 
-/*class: C1:OutputUnit(1, {lib1})*/
-/*element: C1.:OutputUnit(1, {lib1})*/
+/*class: C1:OutputUnit(2, {lib1})*/
+/*element: C1.:OutputUnit(2, {lib1})*/
 class C1 extends C3 {}
diff --git a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart
index 5447ff9..5167cc6 100644
--- a/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart
+++ b/tests/compiler/dart2js/deferred_loading/libs/deferred_overlapping_lib3.dart
@@ -2,6 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*class: C3:OutputUnit(2, {lib1, lib2})*/
-/*element: C3.:OutputUnit(2, {lib1, lib2})*/
+/*class: C3:OutputUnit(1, {lib1, lib2})*/
+/*element: C3.:OutputUnit(1, {lib1, lib2})*/
 class C3 {}
diff --git a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
index 39bbc85..ec404ff 100644
--- a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
@@ -46,13 +46,13 @@
   var entrypoint = Uri.parse("file:///main.dart");
 
   // Find the path to sdk/ in the repo relative to this script.
-  Uri libraryRoot = Uri.base.resolve('sdk/');
+  Uri librariesSpec = Uri.base.resolve('sdk/lib/libraries.json');
   Uri packageRoot = Uri.base.resolve('packages/');
   var platformDir =
       Uri.parse(nativeToUriPath(Platform.resolvedExecutable)).resolve('.');
   asyncTest(() => compiler.compile(
           entrypoint,
-          libraryRoot,
+          librariesSpec,
           packageRoot,
           provideInput,
           handleDiagnostic,
diff --git a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
index 3b3c0e6..56bf3e6 100644
--- a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
@@ -9,7 +9,7 @@
 import 'package:compiler/src/elements/entities.dart'
     show LibraryEntity, ClassEntity;
 import 'package:compiler/src/kernel/dart2js_target.dart';
-import 'package:compiler/src/library_loader.dart';
+import 'package:compiler/src/kernel/loader.dart';
 import 'package:expect/expect.dart';
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart'
@@ -44,9 +44,8 @@
         diagnosticHandler: diagnostics,
         outputProvider: output);
     await compiler.setupSdk();
-    LoadedLibraries loadedLibraries =
-        await compiler.libraryLoader.loadLibraries(entryPoint);
-    compiler.frontendStrategy.registerLoadedLibraries(loadedLibraries);
+    KernelResult result = await compiler.kernelLoader.load(entryPoint);
+    compiler.frontendStrategy.registerLoadedLibraries(result);
 
     Expect.equals(0, diagnostics.errors.length);
     Expect.equals(0, diagnostics.warnings.length);
diff --git a/tests/compiler/dart2js/end_to_end/exit_code_test.dart b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
index 51df9a9..c891f34 100644
--- a/tests/compiler/dart2js/end_to_end/exit_code_test.dart
+++ b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
@@ -20,11 +20,10 @@
 import 'package:compiler/src/diagnostics/spannable.dart';
 import 'package:compiler/src/apiimpl.dart' as apiimpl;
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/types.dart';
 import 'package:compiler/src/js_backend/js_backend.dart';
-import 'package:compiler/src/library_loader.dart';
 import 'package:compiler/src/null_compiler_output.dart';
 import 'package:compiler/src/options.dart' show CompilerOptions;
-import 'package:compiler/src/types/types.dart';
 import 'package:compiler/src/universe/world_impact.dart';
 import 'package:compiler/src/world.dart';
 import 'diagnostic_reporter_helper.dart';
@@ -60,11 +59,6 @@
     return super.run(uri);
   }
 
-  void processLoadedLibraries(LoadedLibraries loadedLibraries) {
-    test('Compiler.processLoadedLibraries');
-    super.processLoadedLibraries(loadedLibraries);
-  }
-
   test(String marker) {
     if (marker == testMarker) {
       switch (testType) {
@@ -109,7 +103,6 @@
       : this.compiler = compiler,
         super(compiler,
             generateSourceMap: compiler.options.generateSourceMap,
-            useStartupEmitter: compiler.options.useStartupEmitter,
             useMultiSourceInfo: compiler.options.useMultiSourceInfo,
             useNewSourceInfo: compiler.options.useNewSourceInfo);
 
@@ -189,8 +182,7 @@
     entry.compileFunc = compile;
 
     List<String> args = new List<String>.from(options)
-      // TODO(sigmund): convert to support the new CFE
-      ..add("--library-root=${Uri.base.resolve('sdk/')}")
+      ..add("--libraries-spec=${Uri.base.resolve('sdk/lib/libraries.json')}")
       ..add("tests/compiler/dart2js/end_to_end/data/exit_code_helper.dart");
     Future result = entry.internalMain(args);
     return result.catchError((e, s) {
@@ -240,7 +232,6 @@
   final tests = {
     'Compiler': beforeRun,
     'Compiler.run': beforeRun,
-    'Compiler.processLoadedLibraries': beforeRun,
     'Compiler.withCurrentElement': duringRun,
     'Compiler.codegen': duringRun,
   };
diff --git a/tests/compiler/dart2js/end_to_end/library_env_test.dart b/tests/compiler/dart2js/end_to_end/library_env_test.dart
index f1084b5..e215c89 100644
--- a/tests/compiler/dart2js/end_to_end/library_env_test.dart
+++ b/tests/compiler/dart2js/end_to_end/library_env_test.dart
@@ -18,37 +18,32 @@
 
 import 'package:compiler/src/options.dart' show CompilerOptions;
 
+import 'package:compiler/src/commandline_options.dart';
+
 import 'package:compiler/src/io/source_file.dart' show Binary;
 
 import 'package:compiler/compiler_new.dart'
     show CompilerInput, CompilerDiagnostics, Input, InputKind;
 
-const String clientPlatform = r'''
-[dart-spec]
-spec: 3rd edition.
-
-[features]
-# No extra features
-
-[libraries]
-mock.client: mock1.dart
-mock.shared: mock3.dart
-collection: collection/collection.dart
-html: html/dart2js/html_dart2js.dart
-''';
-
-const String serverPlatform = r'''
-[dart-spec]
-spec: 3rd edition.
-
-[features]
-# No extra features
-
-[libraries]
-mock.server: mock2.dart
-mock.shared: mock3.dart
-collection: collection/collection.dart
-io: io/io.dart
+const String librariesJson = r'''
+{
+ "dart2js": {
+   "libraries": {
+    "mock.client": {"uri": "mock1.dart"},
+    "mock.shared": {"uri": "mock3.dart"},
+    "collection": {"uri": "collection/collection.dart"},
+    "html": {"uri": "html/dart2js/html_dart2js.dart"}
+   }
+ },
+ "dart2js_server": {
+   "libraries": {
+    "mock.server": {"uri": "mock2.dart"},
+    "mock.shared": {"uri": "mock3.dart"},
+    "collection": {"uri": "collection/collection.dart"},
+    "io": {"uri": "io/io.dart"}
+   }
+ }
+}
 ''';
 
 class DummyCompilerInput implements CompilerInput {
@@ -56,12 +51,8 @@
 
   Future<Input> readFromUri(Uri uri,
       {InputKind inputKind: InputKind.UTF8}) async {
-    if (uri.toString().endsWith("dart_client.platform")) {
-      return new Binary(uri, clientPlatform.codeUnits);
-    } else if (uri.toString().endsWith("dart_server.platform")) {
-      return new Binary(uri, serverPlatform.codeUnits);
-    } else if (uri.path.endsWith(".dill")) {
-      return new Binary(uri, new File.fromUri(uri).readAsBytesSync());
+    if (uri.path.endsWith("libraries.json")) {
+      return new Binary(uri, librariesJson.codeUnits);
     } else {
       throw "should not be needed $uri";
     }
@@ -86,7 +77,8 @@
             const DummyCompilerDiagnostics(),
             CompilerOptions.parse(
                 ['--platform-binaries=$platformDir']..addAll(options),
-                libraryRoot: Uri.base.resolve("sdk/"))
+                librariesSpecificationUri:
+                    Uri.base.resolve("sdk/lib/libraries.json"))
               ..environment = environment);
 }
 
@@ -108,7 +100,7 @@
   Expect.equals(null, compiler.fromEnvironment("dart.library.mock.server"));
   Expect.equals(null, compiler.fromEnvironment("dart.library.io"));
 
-  compiler = new CustomCompiler(['--categories=Server'], {});
+  compiler = new CustomCompiler([Flags.serverMode], {});
 
   await compiler.setupSdk();
 
diff --git a/tests/compiler/dart2js/end_to_end/output_type_test.dart b/tests/compiler/dart2js/end_to_end/output_type_test.dart
index 4217edc..aa4dcf1 100644
--- a/tests/compiler/dart2js/end_to_end/output_type_test.dart
+++ b/tests/compiler/dart2js/end_to_end/output_type_test.dart
@@ -32,6 +32,9 @@
         provider.createUri(name, extension, type), Platform.isWindows));
     return NullSink.outputProvider(name, extension, type);
   }
+
+  @override
+  BinaryOutputSink createBinarySink(Uri uri) => new NullBinarySink(uri);
 }
 
 CompileFunc oldCompileFunc;
@@ -39,7 +42,7 @@
 Future<Null> test(List<String> arguments, List<String> expectedOutput,
     {List<String> groupOutputs: const <String>[]}) async {
   List<String> options = new List<String>.from(arguments)
-    ..add("--library-root=${Uri.base.resolve('sdk/')}");
+    ..add("--libraries-spec=${Uri.base.resolve('sdk/lib/libraries.json')}");
   print('--------------------------------------------------------------------');
   print('dart2js ${options.join(' ')}');
   TestRandomAccessFileOutputProvider outputProvider;
diff --git a/tests/compiler/dart2js/end_to_end/platform_config_parser_test.dart b/tests/compiler/dart2js/end_to_end/platform_config_parser_test.dart
deleted file mode 100644
index c0b843e..0000000
--- a/tests/compiler/dart2js/end_to_end/platform_config_parser_test.dart
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:compiler/src/platform_configuration.dart";
-import "package:expect/expect.dart";
-
-/// Runs the parser on [input] and compares it with [expectedResult]
-///
-/// A '*' in [input] indicates that the parser will report an error at the
-/// given point (On [input] with the "*" removed).
-test(String input, [Map<String, Map<String, String>> expectedOutput]) {
-  int starIndex = input.indexOf("*");
-  String inputWithoutStar = input.replaceFirst("*", "");
-
-  parse() => parseIni(inputWithoutStar.codeUnits,
-      allowedSections: new Set.from(["AA", "BB"]));
-
-  if (starIndex != -1) {
-    Expect.equals(expectedOutput, null);
-    Expect.throws(parse, (dynamic e) {
-      Expect.isTrue(e is FormatException);
-      Expect.equals(starIndex, e.offset);
-      return e is FormatException;
-    });
-  } else {
-    Map<String, Map<String, String>> result = parse();
-    Expect.equals(expectedOutput.length, result.length);
-    expectedOutput.forEach((String name, Map<String, String> properties) {
-      Expect.isTrue(expectedOutput.containsKey(name), "Missing section $name");
-      Expect.mapEquals(expectedOutput[name], properties);
-    });
-  }
-}
-
-main() {
-  // Empty file.
-  test("""
-# Nothing here
-""", {});
-
-  // Text outside section.
-  test("""
-*aaa
-""");
-
-  // Malformed header.
-  test("""
-*[AABC
-name:value
-""");
-
-  // Text after header.
-  test("""
-[AABC]*abcde
-""");
-
-  // Empty section name.
-  test("""
-[*]
-""");
-
-  // Duplicate section name.
-  test("""
-[AA]
-[BB]
-[*AA]
-""");
-
-  // Unrecognized section name.
-  test("""
-[*CC]
-""");
-
-  // Empty property name.
-  test("""
-[AA]
-*:value
-name:value
-""");
-
-  // Ok.
-  test("""
-[AA]
-name:value
-[BB]
-name:value
-name2:value2
-""", {
-    "AA": {"name": "value"},
-    "BB": {"name": "value", "name2": "value2"}
-  });
-
-  // Ok, file not ending in newline.
-  test("""
-[AA]
-name:value""", {
-    "A": {"name": "value"}
-  });
-
-  // Ok, whitespace is trimmed away.
-  test("""
-[ AA ]
- name\t:  value """, {
-    "A": {"name": "value"}
-  });
-
-  // Duplicate property name.
-  test("""
-[AA]
-a:b
-b:c
-*a:c
-""");
-
-  // No ':' on property line.
-  test("""
-[AA]
-*name1
-name2:value
-""");
-}
diff --git a/tests/compiler/dart2js/end_to_end/uri_retention_test.dart b/tests/compiler/dart2js/end_to_end/uri_retention_test.dart
deleted file mode 100644
index 1fb8a72..0000000
--- a/tests/compiler/dart2js/end_to_end/uri_retention_test.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart2js.test.uri_retention_test;
-
-import 'dart:async';
-
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/compiler_new.dart';
-import 'package:compiler/src/commandline_options.dart';
-import 'package:expect/expect.dart';
-import '../helpers/memory_compiler.dart' show runCompiler, OutputCollector;
-
-Future<String> compileSources(sources, {bool minify}) async {
-  var options = <String>[];
-  if (minify) options.add(Flags.minify);
-  OutputCollector outputCollector = new OutputCollector();
-  await runCompiler(
-      memorySourceFiles: sources,
-      options: options,
-      outputProvider: outputCollector);
-  return outputCollector.getOutput('', OutputType.js);
-}
-
-Future test(sources, {bool libName, bool fileName}) {
-  return compileSources(sources, minify: false).then((output) {
-    // Unminified the sources should always contain the library name and the
-    // file name.
-    Expect.isTrue(output.contains("main_lib"));
-    Expect.isTrue(output.contains("main.dart"));
-  }).then((_) {
-    compileSources(sources, minify: true).then((output) {
-      Expect.equals(libName, output.contains("main_lib"));
-      Expect.isFalse(output.contains("main.dart"));
-    });
-  });
-}
-
-void main() {
-  runTests() async {
-    await test(MEMORY_SOURCE_FILES1, libName: false, fileName: false);
-  }
-
-  asyncTest(() async {
-    print('--test from kernel------------------------------------------------');
-    await runTests();
-  });
-}
-
-const MEMORY_SOURCE_FILES1 = const <String, String>{
-  'main.dart': """
-library main_lib;
-
-class A {
-  final uri = "foo";
-}
-
-main() {
-  print(Uri.base);
-  print(new A().uri);
-}
-""",
-};
diff --git a/tests/compiler/dart2js/end_to_end/user_crash_test.dart b/tests/compiler/dart2js/end_to_end/user_crash_test.dart
index 76d92cd..a17fbf2 100644
--- a/tests/compiler/dart2js/end_to_end/user_crash_test.dart
+++ b/tests/compiler/dart2js/end_to_end/user_crash_test.dart
@@ -25,23 +25,6 @@
         expectedExceptions: [
           EXCEPTION
         ]);
-    test(
-        'Throw in package discovery',
-        await run(packagesDiscoveryProvider: (_) {
-          throw EXCEPTION;
-        }),
-        expectedLines: [
-          'Uncaught exception in package discovery: $EXCEPTION',
-          null /* Stack trace*/
-        ],
-        expectedExceptions: [
-          EXCEPTION
-        ]);
-    test(
-        'new Future.error in package discovery',
-        await run(
-            packagesDiscoveryProvider: (_) => new Future.error(EXCEPTION)),
-        expectedExceptions: [EXCEPTION]);
 
     var cantReadFile =
         templateCantReadFile.withArguments(entryPoint, EXCEPTION);
@@ -82,16 +65,14 @@
 
 Future<RunResult> run(
     {Map<String, String> memorySourceFiles: const {'main.dart': 'main() {}'},
-    CompilerDiagnostics diagnostics,
-    PackagesDiscoveryProvider packagesDiscoveryProvider}) async {
+    CompilerDiagnostics diagnostics}) async {
   RunResult result = new RunResult();
   await runZoned(() async {
     try {
       await runCompiler(
           entryPoint: entryPoint,
           memorySourceFiles: memorySourceFiles,
-          diagnosticHandler: diagnostics,
-          packagesDiscoveryProvider: packagesDiscoveryProvider);
+          diagnosticHandler: diagnostics);
     } catch (e) {
       result.exceptions.add(e);
     }
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence.dart b/tests/compiler/dart2js/equivalence/id_equivalence.dart
index 73f4299..4d76541 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence.dart
@@ -42,7 +42,9 @@
     return id == other.id && value == other.value;
   }
 
-  String toString() {
+  String toString() => idToString(id, value);
+
+  static String idToString(Id id, String value) {
     switch (id.kind) {
       case IdKind.element:
         ElementId elementId = id;
@@ -207,17 +209,18 @@
   String toString() => '$kind:$value';
 }
 
-class ActualData {
-  final IdValue value;
+class ActualData<T> {
+  final Id id;
+  final T value;
   final SourceSpan sourceSpan;
   final Object object;
 
-  ActualData(this.value, this.sourceSpan, this.object);
+  ActualData(this.id, this.value, this.sourceSpan, this.object);
 
   int get offset {
-    Id id = value.id;
     if (id is NodeId) {
-      return id.value;
+      NodeId nodeId = id;
+      return nodeId.value;
     } else {
       return sourceSpan.begin;
     }
@@ -228,17 +231,16 @@
   }
 
   String toString() =>
-      'ActualData(value=$value,sourceSpan=$sourceSpan,object=$objectText)';
+      'ActualData(id=$id,value=$value,sourceSpan=$sourceSpan,object=$objectText)';
 }
 
-abstract class DataRegistry {
+abstract class DataRegistry<T> {
   DiagnosticReporter get reporter;
-  Map<Id, ActualData> get actualMap;
+  Map<Id, ActualData<T>> get actualMap;
 
-  void registerValue(
-      SourceSpan sourceSpan, Id id, String value, Object object) {
+  void registerValue(SourceSpan sourceSpan, Id id, T value, Object object) {
     if (actualMap.containsKey(id)) {
-      ActualData existingData = actualMap[id];
+      ActualData<T> existingData = actualMap[id];
       reportHere(reporter, sourceSpan,
           "Duplicate id ${id}, value=$value, object=$object");
       reportHere(
@@ -249,8 +251,7 @@
       Expect.fail("Duplicate id $id.");
     }
     if (value != null) {
-      actualMap[id] =
-          new ActualData(new IdValue(id, value), sourceSpan, object);
+      actualMap[id] = new ActualData<T>(id, value, sourceSpan, object);
     }
   }
 }
@@ -270,32 +271,32 @@
 
 /// Abstract IR visitor for computing data corresponding to a node or element,
 /// and record it with a generic [Id]
-abstract class IrDataExtractor extends ir.Visitor with DataRegistry {
+abstract class IrDataExtractor<T> extends ir.Visitor with DataRegistry<T> {
   final DiagnosticReporter reporter;
-  final Map<Id, ActualData> actualMap;
+  final Map<Id, ActualData<T>> actualMap;
 
   /// Implement this to compute the data corresponding to [member].
   ///
   /// If `null` is returned, [member] has no associated data.
-  String computeMemberValue(Id id, ir.Member member);
+  T computeMemberValue(Id id, ir.Member member);
 
   /// Implement this to compute the data corresponding to [node].
   ///
   /// If `null` is returned, [node] has no associated data.
-  String computeNodeValue(Id id, ir.TreeNode node);
+  T computeNodeValue(Id id, ir.TreeNode node);
 
   IrDataExtractor(this.reporter, this.actualMap);
 
   void computeForMember(ir.Member member) {
     ElementId id = computeEntityId(member);
     if (id == null) return;
-    String value = computeMemberValue(id, member);
+    T value = computeMemberValue(id, member);
     registerValue(computeSourceSpan(member), id, value, member);
   }
 
   void computeForNode(ir.TreeNode node, NodeId id) {
     if (id == null) return;
-    String value = computeNodeValue(id, node);
+    T value = computeNodeValue(id, node);
     registerValue(computeSourceSpan(node), id, value, node);
   }
 
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 5762f41..e7becbd 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -11,6 +11,7 @@
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/util/features.dart';
 import 'package:expect/expect.dart';
 import 'package:sourcemap_testing/src/annotated_code_helper.dart';
 
@@ -20,6 +21,15 @@
 /// `true` if ANSI colors are supported by stdout.
 bool useColors = stdout.supportsAnsiEscapes;
 
+/// Colorize a message [text], if ANSI colors are supported.
+String colorizeMessage(String text) {
+  if (useColors) {
+    return '${colors.yellow(text)}';
+  } else {
+    return text;
+  }
+}
+
 /// Colorize a matching annotation [text], if ANSI colors are supported.
 String colorizeMatch(String text) {
   if (useColors) {
@@ -78,7 +88,7 @@
   return '${colorizeDelimiter(start)}$text${colorizeDelimiter(end)}';
 }
 
-abstract class DataComputer {
+abstract class DataComputer<T> {
   const DataComputer();
 
   /// Called before testing to setup flags needed for data collection.
@@ -92,7 +102,7 @@
   /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
   /// for the data origin.
   void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+      Compiler compiler, MemberEntity member, Map<Id, ActualData<T>> actualMap,
       {bool verbose});
 
   /// Returns `true` if [computeClassData] is supported.
@@ -103,8 +113,10 @@
   /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
   /// for the data origin.
   void computeClassData(
-      Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+      Compiler compiler, ClassEntity cls, Map<Id, ActualData<T>> actualMap,
       {bool verbose}) {}
+
+  DataInterpreter<T> get dataValidator;
 }
 
 const String stopAfterTypeInference = 'stopAfterTypeInference';
@@ -130,8 +142,8 @@
 /// [entryPoint] and [memorySourceFiles].
 ///
 /// Actual data is computed using [computeMemberData].
-Future<CompiledData> computeData(Uri entryPoint,
-    Map<String, String> memorySourceFiles, DataComputer dataComputer,
+Future<CompiledData<T>> computeData<T>(Uri entryPoint,
+    Map<String, String> memorySourceFiles, DataComputer<T> dataComputer,
     {List<String> options: const <String>[],
     bool verbose: false,
     bool testFrontend: false,
@@ -159,14 +171,14 @@
   ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
   CommonElements commonElements = closedWorld.commonElements;
 
-  Map<Uri, Map<Id, ActualData>> actualMaps = <Uri, Map<Id, ActualData>>{};
-  Map<Id, ActualData> globalData = <Id, ActualData>{};
+  Map<Uri, Map<Id, ActualData<T>>> actualMaps = <Uri, Map<Id, ActualData<T>>>{};
+  Map<Id, ActualData<T>> globalData = <Id, ActualData<T>>{};
 
-  Map<Id, ActualData> actualMapFor(Entity entity) {
+  Map<Id, ActualData<T>> actualMapFor(Entity entity) {
     SourceSpan span =
         compiler.backendStrategy.spanFromSpannable(entity, entity);
     Uri uri = span.uri;
-    return actualMaps.putIfAbsent(uri, () => <Id, ActualData>{});
+    return actualMaps.putIfAbsent(uri, () => <Id, ActualData<T>>{});
   }
 
   void processMember(MemberEntity member, Map<Id, ActualData> actualMap) {
@@ -194,7 +206,7 @@
         verbose: verbose);
   }
 
-  void processClass(ClassEntity cls, Map<Id, ActualData> actualMap) {
+  void processClass(ClassEntity cls, Map<Id, ActualData<T>> actualMap) {
     if (skipUnprocessedMembers && !closedWorld.isImplemented(cls)) {
       return;
     }
@@ -281,22 +293,22 @@
     }
   }
 
-  return new CompiledData(
+  return new CompiledData<T>(
       compiler, elementEnvironment, entryPoint, actualMaps, globalData);
 }
 
-class CompiledData {
+class CompiledData<T> {
   final Compiler compiler;
   final ElementEnvironment elementEnvironment;
   final Uri mainUri;
-  final Map<Uri, Map<Id, ActualData>> actualMaps;
-  final Map<Id, ActualData> globalData;
+  final Map<Uri, Map<Id, ActualData<T>>> actualMaps;
+  final Map<Id, ActualData<T>> globalData;
 
   CompiledData(this.compiler, this.elementEnvironment, this.mainUri,
       this.actualMaps, this.globalData);
 
   Map<int, List<String>> computeAnnotations(Uri uri) {
-    Map<Id, ActualData> thisMap = actualMaps[uri];
+    Map<Id, ActualData<T>> thisMap = actualMaps[uri];
     Map<int, List<String>> annotations = <int, List<String>>{};
     thisMap.forEach((Id id, ActualData data1) {
       String value1 = '${data1.value}';
@@ -308,7 +320,7 @@
   }
 
   Map<int, List<String>> computeDiffAnnotationsAgainst(
-      Map<Id, ActualData> thisMap, Map<Id, ActualData> otherMap, Uri uri,
+      Map<Id, ActualData<T>> thisMap, Map<Id, ActualData<T>> otherMap, Uri uri,
       {bool includeMatches: false}) {
     Map<int, List<String>> annotations = <int, List<String>>{};
     thisMap.forEach((Id id, ActualData data1) {
@@ -361,15 +373,15 @@
 }
 
 /// Data collected by [computeData].
-class IdData {
+class IdData<T> {
   final Map<Uri, AnnotatedCode> code;
   final MemberAnnotations<IdValue> expectedMaps;
   final CompiledData _compiledData;
-  final MemberAnnotations<ActualData> _actualMaps = new MemberAnnotations();
+  final MemberAnnotations<ActualData<T>> _actualMaps = new MemberAnnotations();
 
   IdData(this.code, this.expectedMaps, this._compiledData) {
     for (Uri uri in code.keys) {
-      _actualMaps[uri] = _compiledData.actualMaps[uri] ?? <Id, ActualData>{};
+      _actualMaps[uri] = _compiledData.actualMaps[uri] ?? <Id, ActualData<T>>{};
     }
     _actualMaps.globalData.addAll(_compiledData.globalData);
   }
@@ -389,15 +401,20 @@
     return withAnnotations(code[uri].sourceCode, annotations);
   }
 
-  String diffCode(Uri uri) {
+  String diffCode(Uri uri, DataInterpreter<T> dataValidator) {
     Map<int, List<String>> annotations = <int, List<String>>{};
     actualMaps[uri].forEach((Id id, ActualData data) {
-      IdValue value = expectedMaps[uri][id];
-      if (data.value != value || value == null && data.value.value != '') {
-        String expected = value?.toString() ?? '';
+      IdValue expectedValue = expectedMaps[uri][id];
+      T actualValue = data.value;
+      String unexpectedMessage =
+          dataValidator.isAsExpected(actualValue, expectedValue?.value);
+      if (unexpectedMessage != null) {
+        /*if (data.value != expectedValue || expectedValue == null && data.value.value != '') {*/
+        String expected = expectedValue?.toString() ?? '';
+        String actual = dataValidator.getText(actualValue);
         int offset = getOffsetFromId(id, uri);
         String value1 = '${expected}';
-        String value2 = '${data.value}';
+        String value2 = '${actual}';
         annotations
             .putIfAbsent(offset, () => [])
             .add(colorizeDiff(value1, ' | ', value2));
@@ -492,10 +509,9 @@
 /// [setUpFunction] is called once for every test that is executed.
 /// If [forUserSourceFilesOnly] is true, we examine the elements in the main
 /// file and any supporting libraries.
-Future checkTests(Directory dataDir, DataComputer dataComputer,
-    {bool testStrongMode: true,
-    List<String> skipForStrong: const <String>[],
-    bool filterActualData(IdValue idValue, ActualData actualData),
+Future checkTests<T>(Directory dataDir, DataComputer<T> dataComputer,
+    {List<String> skipForStrong: const <String>[],
+    bool filterActualData(IdValue idValue, ActualData<T> actualData),
     List<String> options: const <String>[],
     List<String> args: const <String>[],
     Directory libDirectory: null,
@@ -504,7 +520,7 @@
     Callback setUpFunction,
     int shards: 1,
     int shardIndex: 0,
-    bool testOmit: false,
+    bool testOmit: true,
     void onTest(Uri uri)}) async {
   dataComputer.setup();
 
@@ -530,21 +546,9 @@
     if (shouldContinue) continued = true;
     testCount++;
     List<String> testOptions = options.toList();
-    bool trustTypeAnnotations = false;
     if (name.endsWith('_ea.dart')) {
       testOptions.add(Flags.enableAsserts);
     }
-    if (name.contains('_strong')) {
-      if (!testStrongMode) {
-        // TODO(johnniwinther): Remove irrelevant tests.
-      }
-    }
-    if (name.endsWith('_checked.dart')) {
-      testOptions.add(Flags.enableCheckedMode);
-    }
-    if (name.contains('_trust')) {
-      trustTypeAnnotations = true;
-    }
 
     if (onTest != null) {
       onTest(entity.uri);
@@ -593,29 +597,24 @@
 
     if (setUpFunction != null) setUpFunction();
 
-    if (testStrongMode) {
-      if (skipForStrong.contains(name)) {
-        print('--skipped for kernel (strong mode)----------------------------');
-      } else {
-        print('--from kernel (strong mode)-----------------------------------');
-        List<String> options = new List<String>.from(testOptions);
-        if (trustTypeAnnotations && !testOmit) {
-          options.add(Flags.omitImplicitChecks);
-        }
-        MemberAnnotations<IdValue> annotations = expectedMaps[strongMarker];
-        CompiledData compiledData2 = await computeData(
-            entryPoint, memorySourceFiles, dataComputer,
-            options: options,
-            verbose: verbose,
-            testFrontend: testFrontend,
-            forUserLibrariesOnly: forUserLibrariesOnly,
-            globalIds: annotations.globalData.keys);
-        if (await checkCode(
-            strongName, entity.uri, code, annotations, compiledData2,
-            filterActualData: filterActualData,
-            fatalErrors: !testAfterFailures)) {
-          hasFailures = true;
-        }
+    if (skipForStrong.contains(name)) {
+      print('--skipped for kernel (strong mode)----------------------------');
+    } else {
+      print('--from kernel (strong mode)-----------------------------------');
+      List<String> options = new List<String>.from(testOptions);
+      MemberAnnotations<IdValue> annotations = expectedMaps[strongMarker];
+      CompiledData<T> compiledData2 = await computeData(
+          entryPoint, memorySourceFiles, dataComputer,
+          options: options,
+          verbose: verbose,
+          testFrontend: testFrontend,
+          forUserLibrariesOnly: forUserLibrariesOnly,
+          globalIds: annotations.globalData.keys);
+      if (await checkCode(strongName, entity.uri, code, annotations,
+          compiledData2, dataComputer.dataValidator,
+          filterActualData: filterActualData,
+          fatalErrors: !testAfterFailures)) {
+        hasFailures = true;
       }
     }
     if (testOmit) {
@@ -628,15 +627,15 @@
           Flags.laxRuntimeTypeToString
         ]..addAll(testOptions);
         MemberAnnotations<IdValue> annotations = expectedMaps[omitMarker];
-        CompiledData compiledData2 = await computeData(
+        CompiledData<T> compiledData2 = await computeData(
             entryPoint, memorySourceFiles, dataComputer,
             options: options,
             verbose: verbose,
             testFrontend: testFrontend,
             forUserLibrariesOnly: forUserLibrariesOnly,
             globalIds: annotations.globalData.keys);
-        if (await checkCode(
-            trustName, entity.uri, code, annotations, compiledData2,
+        if (await checkCode(trustName, entity.uri, code, annotations,
+            compiledData2, dataComputer.dataValidator,
             filterActualData: filterActualData,
             fatalErrors: !testAfterFailures)) {
           hasFailures = true;
@@ -650,34 +649,157 @@
 
 final Set<String> userFiles = new Set<String>();
 
+/// Interface used for interpreting annotations.
+abstract class DataInterpreter<T> {
+  /// Returns `null` if [actualData] satisfies the [expectedData] annotation.
+  /// Otherwise, a message is returned contain the information about the
+  /// problems found.
+  String isAsExpected(T actualData, String expectedData);
+
+  /// Returns `true` if [actualData] corresponds to empty data.
+  bool isEmpty(T actualData);
+
+  /// Returns a textual representation of [actualData].
+  String getText(T actualData);
+}
+
+/// Default data interpreter for string data.
+class StringDataInterpreter implements DataInterpreter<String> {
+  const StringDataInterpreter();
+
+  @override
+  String isAsExpected(String actualData, String expectedData) {
+    actualData ??= '';
+    expectedData ??= '';
+    if (actualData != expectedData) {
+      return "Expected $expectedData, found $actualData";
+    }
+    return null;
+  }
+
+  @override
+  bool isEmpty(String actualData) {
+    return actualData == '';
+  }
+
+  @override
+  String getText(String actualData) {
+    return actualData;
+  }
+}
+
+class FeaturesDataInterpreter implements DataInterpreter<Features> {
+  const FeaturesDataInterpreter();
+
+  @override
+  String isAsExpected(Features actualFeatures, String expectedData) {
+    if (expectedData == '*') {
+      return null;
+    } else if (expectedData == '') {
+      return actualFeatures.isNotEmpty ? "Expected empty data." : null;
+    } else {
+      List<String> errorsFound = [];
+      Features expectedFeatures = Features.fromText(expectedData);
+      expectedFeatures.forEach((String key, Object expectedValue) {
+        Object actualValue = actualFeatures[key] ?? '';
+        if (expectedValue == '') {
+          if (actualValue != '') {
+            errorsFound.add('Non-empty data found for $key');
+          }
+        } else if (expectedValue == '*') {
+          return;
+        } else if (expectedValue is List) {
+          if (actualValue is List) {
+            List actualList = actualValue.toList();
+            for (Object expectedObject in expectedValue) {
+              String expectedText = '$expectedObject';
+              bool matchFound = false;
+              if (expectedText.endsWith('*')) {
+                // Wildcard matcher.
+                String prefix =
+                    expectedText.substring(0, expectedText.indexOf('*'));
+                List matches = [];
+                for (Object actualObject in actualList) {
+                  if ('$actualObject'.startsWith(prefix)) {
+                    matches.add(actualObject);
+                    matchFound = true;
+                  }
+                }
+                for (Object match in matches) {
+                  actualList.remove(match);
+                }
+              } else {
+                for (Object actualObject in actualList) {
+                  if (expectedText == '$actualObject') {
+                    actualList.remove(actualObject);
+                    matchFound = true;
+                    break;
+                  }
+                }
+              }
+              if (!matchFound) {
+                errorsFound.add("No match found for $key=[$expectedText]");
+              }
+            }
+            if (actualList.isNotEmpty) {
+              errorsFound
+                  .add("Extra data found $key=[${actualList.join(',')}]");
+            }
+          } else {
+            errorsFound.add("List data expected for $key: "
+                "expected '$expectedValue', found '${actualValue}'");
+          }
+        } else if (expectedValue != actualValue) {
+          errorsFound.add(
+              "Mismatch for $key: expected '$expectedValue', found '${actualValue}");
+        }
+      });
+      return errorsFound.isNotEmpty ? errorsFound.join(', ') : null;
+    }
+  }
+
+  @override
+  String getText(Features actualData) {
+    return actualData.getText();
+  }
+
+  @override
+  bool isEmpty(Features actualData) {
+    return actualData == null || actualData.isEmpty;
+  }
+}
+
 /// Checks [compiledData] against the expected data in [expectedMap] derived
 /// from [code].
-Future<bool> checkCode(
+Future<bool> checkCode<T>(
     String mode,
     Uri mainFileUri,
     Map<Uri, AnnotatedCode> code,
     MemberAnnotations<IdValue> expectedMaps,
     CompiledData compiledData,
-    {bool filterActualData(IdValue expected, ActualData actualData),
+    DataInterpreter<T> dataValidator,
+    {bool filterActualData(IdValue expected, ActualData<T> actualData),
     bool fatalErrors: true}) async {
-  IdData data = new IdData(code, expectedMaps, compiledData);
+  IdData<T> data = new IdData<T>(code, expectedMaps, compiledData);
   bool hasFailure = false;
   Set<Uri> neededDiffs = new Set<Uri>();
 
   void checkActualMap(
-      Map<Id, ActualData> actualMap, Map<Id, IdValue> expectedMap,
+      Map<Id, ActualData<T>> actualMap, Map<Id, IdValue> expectedMap,
       [Uri uri]) {
     bool hasLocalFailure = false;
-    actualMap.forEach((Id id, ActualData actualData) {
-      IdValue actual = actualData.value;
+    actualMap.forEach((Id id, ActualData<T> actualData) {
+      T actual = actualData.value;
+      String actualText = dataValidator.getText(actual);
 
       if (!expectedMap.containsKey(id)) {
-        if (actual.value != '') {
+        if (!dataValidator.isEmpty(actual)) {
           reportError(
               data.compiler.reporter,
               actualData.sourceSpan,
-              'EXTRA $mode DATA for ${id.descriptor} = '
-              '${colorizeActual('$actual')} for ${actualData.objectText}. '
+              'EXTRA $mode DATA for ${id.descriptor}:\n '
+              'object   : ${actualData.objectText}\n '
+              'actual   : ${colorizeActual('${IdValue.idToString(id, actualText)}')}\n '
               'Data was expected for these ids: ${expectedMap.keys}');
           if (filterActualData == null || filterActualData(null, actualData)) {
             hasLocalFailure = true;
@@ -685,14 +807,17 @@
         }
       } else {
         IdValue expected = expectedMap[id];
-        if (actual != expected) {
+        String unexpectedMessage =
+            dataValidator.isAsExpected(actual, expected.value);
+        if (unexpectedMessage != null) {
           reportError(
               data.compiler.reporter,
               actualData.sourceSpan,
-              'UNEXPECTED $mode DATA for ${id.descriptor}: '
-              'Object: ${actualData.objectText}\n '
+              'UNEXPECTED $mode DATA for ${id.descriptor}:\n '
+              'detail  : ${colorizeMessage(unexpectedMessage)}\n '
+              'object  : ${actualData.objectText}\n '
               'expected: ${colorizeExpected('$expected')}\n '
-              'actual  : ${colorizeActual('$actual')}');
+              'actual  : ${colorizeActual('${IdValue.idToString(id, actualText)}')}');
           if (filterActualData == null ||
               filterActualData(expected, actualData)) {
             hasLocalFailure = true;
@@ -740,7 +865,7 @@
   checkMissing(data.expectedMaps.globalData, data.actualMaps.globalData);
   for (Uri uri in neededDiffs) {
     print('--annotations diff [${uri.pathSegments.last}]-------------');
-    print(data.diffCode(uri));
+    print(data.diffCode(uri, dataValidator));
     print('----------------------------------------------------------');
   }
   if (missingIds.isNotEmpty) {
@@ -847,56 +972,3 @@
     }
   });
 }
-
-/// Set of features used in annotations.
-class Features {
-  Map<String, Object> _features = <String, Object>{};
-
-  void add(String key, {var value: ''}) {
-    _features[key] = value.toString();
-  }
-
-  void addElement(String key, [var value]) {
-    List<String> list = _features.putIfAbsent(key, () => <String>[]);
-    if (value != null) {
-      list.add(value.toString());
-    }
-  }
-
-  bool containsKey(String key) {
-    return _features.containsKey(key);
-  }
-
-  void operator []=(String key, String value) {
-    _features[key] = value;
-  }
-
-  String operator [](String key) => _features[key];
-
-  String remove(String key) => _features.remove(key);
-
-  /// Returns a string containing all features in a comma-separated list sorted
-  /// by feature names.
-  String getText() {
-    StringBuffer sb = new StringBuffer();
-    bool needsComma = false;
-    for (String name in _features.keys.toList()..sort()) {
-      dynamic value = _features[name];
-      if (value != null) {
-        if (needsComma) {
-          sb.write(',');
-        }
-        sb.write(name);
-        if (value is List<String>) {
-          value = '[${(value..sort()).join(',')}]';
-        }
-        if (value != '') {
-          sb.write('=');
-          sb.write(value);
-        }
-        needsComma = true;
-      }
-    }
-    return sb.toString();
-  }
-}
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index 9dd2342..0e1c800 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -20,8 +20,6 @@
   argParser.addFlag('strong', negatable: false, defaultsTo: false);
   argParser.addFlag('omit-implicit-checks',
       negatable: false, defaultsTo: false);
-  argParser.addFlag('trust-type-annotations',
-      negatable: false, defaultsTo: false);
   return argParser;
 }
 
@@ -34,7 +32,6 @@
   }
   bool verbose = argResults['verbose'];
   bool omitImplicitChecks = argResults['omit-implicit-checks'];
-  bool trustTypeAnnotations = argResults['trust-type-annotations'];
 
   String file = argResults.rest.first;
   Uri entryPoint = Uri.base.resolve(nativeToUriPath(file));
@@ -48,9 +45,6 @@
   }
 
   options = new List<String>.from(options);
-  if (trustTypeAnnotations) {
-    options.add(Flags.trustTypeAnnotations);
-  }
   if (omitImplicitChecks) {
     options.add(Flags.omitImplicitChecks);
   }
diff --git a/tests/compiler/dart2js/generic_methods/world_test.dart b/tests/compiler/dart2js/generic_methods/world_test.dart
index 8578a79..13c9a72 100644
--- a/tests/compiler/dart2js/generic_methods/world_test.dart
+++ b/tests/compiler/dart2js/generic_methods/world_test.dart
@@ -5,7 +5,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/universe/call_structure.dart';
-import 'package:compiler/src/universe/world_builder.dart';
+import 'package:compiler/src/universe/codegen_world_builder.dart';
 import 'package:expect/expect.dart';
 
 import '../helpers/memory_compiler.dart';
diff --git a/tests/compiler/dart2js/helpers/args_helper.dart b/tests/compiler/dart2js/helpers/args_helper.dart
new file mode 100644
index 0000000..21f026a
--- /dev/null
+++ b/tests/compiler/dart2js/helpers/args_helper.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:args/args.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/filenames.dart';
+
+/// Creates an [ArgParser] that supports various dart2js command-line options.
+ArgParser createArgParser() {
+  ArgParser argParser = new ArgParser(allowTrailingOptions: true);
+  argParser.addFlag('fast-startup', defaultsTo: false);
+  argParser.addFlag('omit-implicit-checks', defaultsTo: false);
+  argParser.addFlag('minify', abbr: 'm', defaultsTo: false);
+  argParser.addFlag('trust-primitives', defaultsTo: false);
+  argParser.addFlag('verbose', abbr: 'v', defaultsTo: false);
+  argParser.addOption('libraries-spec');
+  argParser.addOption('packages');
+  return argParser;
+}
+
+/// Retrieves the entry point [Uri] from [argResults].
+Uri getEntryPoint(ArgResults argResults) {
+  Uri entryPoint;
+  if (argResults.rest.isNotEmpty) {
+    if (argResults.rest.length > 1) {
+      throw new ArgumentError(
+          'Extra arguments: ${argResults.rest.skip(1).join(" ")}');
+    }
+    entryPoint = Uri.base.resolve(nativeToUriPath(argResults.rest.single));
+  }
+  return entryPoint;
+}
+
+/// Retrieves the library root [Uri] from [argResults].
+Uri getLibrariesSpec(ArgResults argResults) {
+  if (!argResults.wasParsed('libraries-spec')) return null;
+  return Uri.base.resolve(nativeToUriPath(argResults['libraries-spec']));
+}
+
+/// Retrieves the packages config [Uri] from [argResults].
+Uri getPackages(ArgResults argResults) {
+  Uri packageConfig;
+  if (argResults.wasParsed('packages')) {
+    packageConfig = Uri.base.resolve(nativeToUriPath(argResults['packages']));
+  }
+  return packageConfig;
+}
+
+/// Retrieves the options from [argResults].
+List<String> getOptions(ArgResults argResults) {
+  List<String> options = <String>[];
+  if (argResults['fast-startup']) {
+    options.add(Flags.fastStartup);
+  }
+  if (argResults['omit-implicit-checks']) {
+    options.add(Flags.omitImplicitChecks);
+  }
+  if (argResults['minify']) {
+    options.add(Flags.minify);
+  }
+  if (argResults['trust-primitives']) {
+    options.add(Flags.trustPrimitives);
+  }
+  if (argResults['verbose']) {
+    options.add(Flags.verbose);
+  }
+  return options;
+}
diff --git a/tests/compiler/dart2js/helpers/compiler_helper.dart b/tests/compiler/dart2js/helpers/compiler_helper.dart
index 345fb21..1bbca1b 100644
--- a/tests/compiler/dart2js/helpers/compiler_helper.dart
+++ b/tests/compiler/dart2js/helpers/compiler_helper.dart
@@ -89,7 +89,6 @@
 
 Future<String> compileAll(String code,
     {bool disableInlining: true,
-    bool trustTypeAnnotations: false,
     bool minify: false,
     int expectedErrors,
     int expectedWarnings}) async {
@@ -99,9 +98,6 @@
   if (disableInlining) {
     options.add(Flags.disableInlining);
   }
-  if (trustTypeAnnotations) {
-    options.add(Flags.trustTypeAnnotations);
-  }
   if (minify) {
     options.add(Flags.minify);
   }
diff --git a/tests/compiler/dart2js/helpers/ir_types.dart b/tests/compiler/dart2js/helpers/ir_types.dart
new file mode 100644
index 0000000..280ae12
--- /dev/null
+++ b/tests/compiler/dart2js/helpers/ir_types.dart
@@ -0,0 +1,137 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+
+class TypeTextVisitor implements ir.DartTypeVisitor1<void, StringBuffer> {
+  const TypeTextVisitor();
+
+  @override
+  void defaultDartType(ir.DartType node, StringBuffer sb) {
+    throw new UnsupportedError("Unhandled type $node (${node.runtimeType}).");
+  }
+
+  void writeType(ir.DartType type, StringBuffer sb) {
+    type.accept1(this, sb);
+  }
+
+  void _writeTypes(List<ir.DartType> types, StringBuffer sb) {
+    String comma = '';
+    for (ir.DartType type in types) {
+      sb.write(comma);
+      writeType(type, sb);
+      comma = ',';
+    }
+  }
+
+  void _writeTypeArguments(List<ir.DartType> typeArguments, StringBuffer sb) {
+    if (typeArguments.isNotEmpty) {
+      sb.write('<');
+      _writeTypes(typeArguments, sb);
+      sb.write('>');
+    }
+  }
+
+  @override
+  void visitTypedefType(ir.TypedefType node, StringBuffer sb) {
+    sb.write(node.typedefNode.name);
+    _writeTypeArguments(node.typeArguments, sb);
+  }
+
+  @override
+  void visitTypeParameterType(ir.TypeParameterType node, StringBuffer sb) {
+    sb.write(node.parameter.name);
+  }
+
+  @override
+  void visitFunctionType(ir.FunctionType node, StringBuffer sb) {
+    writeType(node.returnType, sb);
+    sb.write(' Function');
+    if (node.typeParameters.isNotEmpty) {
+      sb.write('<');
+      String comma = '';
+      for (ir.TypeParameter typeParameter in node.typeParameters) {
+        sb.write(comma);
+        sb.write(typeParameter.name);
+        if (typeParameter is! ir.DynamicType) {
+          sb.write(' extends ');
+          writeType(typeParameter.bound, sb);
+        }
+        comma = ',';
+      }
+      sb.write('>');
+    }
+    sb.write('(');
+    _writeTypes(
+        node.positionalParameters.take(node.requiredParameterCount), sb);
+    if (node.requiredParameterCount < node.positionalParameters.length) {
+      if (node.requiredParameterCount > 0) {
+        sb.write(',');
+      }
+      _writeTypes(
+          node.positionalParameters.skip(node.requiredParameterCount), sb);
+    }
+    if (node.namedParameters.isNotEmpty) {
+      if (node.positionalParameters.isNotEmpty) {
+        sb.write(',');
+      }
+      String comma = '';
+      for (ir.NamedType namedType in node.namedParameters) {
+        sb.write(comma);
+        sb.write(namedType.name);
+        sb.write(': ');
+        writeType(namedType.type, sb);
+        comma = ',';
+      }
+    }
+    sb.write(')');
+  }
+
+  @override
+  void visitInterfaceType(ir.InterfaceType node, StringBuffer sb) {
+    sb.write(node.classNode.name);
+    _writeTypeArguments(node.typeArguments, sb);
+  }
+
+  @override
+  void visitBottomType(ir.BottomType node, StringBuffer sb) {
+    sb.write('<bottom>');
+  }
+
+  @override
+  void visitVoidType(ir.VoidType node, StringBuffer sb) {
+    sb.write('void');
+  }
+
+  @override
+  void visitDynamicType(ir.DynamicType node, StringBuffer sb) {
+    sb.write('dynamic');
+  }
+
+  @override
+  void visitInvalidType(ir.InvalidType node, StringBuffer sb) {
+    sb.write('<invalid>');
+  }
+}
+
+String typeToText(ir.DartType type) {
+  StringBuffer sb = new StringBuffer();
+  const TypeTextVisitor().writeType(type, sb);
+  return sb.toString();
+}
+
+String typesToText(Iterable<ir.DartType> types) {
+  StringBuffer sb = new StringBuffer();
+  String comma = '';
+  for (ir.DartType type in types) {
+    sb.write(comma);
+    const TypeTextVisitor().writeType(type, sb);
+    comma = ',';
+  }
+  return sb.toString();
+}
diff --git a/tests/compiler/dart2js/helpers/memory_compiler.dart b/tests/compiler/dart2js/helpers/memory_compiler.dart
index c8f1708..6062660 100644
--- a/tests/compiler/dart2js/helpers/memory_compiler.dart
+++ b/tests/compiler/dart2js/helpers/memory_compiler.dart
@@ -8,12 +8,7 @@
 
 import 'package:compiler/compiler.dart' show DiagnosticHandler;
 import 'package:compiler/compiler_new.dart'
-    show
-        CompilationResult,
-        CompilerDiagnostics,
-        CompilerOutput,
-        Diagnostic,
-        PackagesDiscoveryProvider;
+    show CompilationResult, CompilerDiagnostics, CompilerOutput, Diagnostic;
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/diagnostics/messages.dart' show Message;
 import 'package:compiler/src/null_compiler_output.dart' show NullCompilerOutput;
@@ -77,9 +72,9 @@
     CompilerOutput outputProvider,
     List<String> options: const <String>[],
     bool showDiagnostics: true,
+    Uri librariesSpecificationUri,
     Uri packageRoot,
     Uri packageConfig,
-    PackagesDiscoveryProvider packagesDiscoveryProvider,
     void beforeRun(CompilerImpl compiler)}) async {
   if (entryPoint == null) {
     entryPoint = Uri.parse('memory:main.dart');
@@ -91,15 +86,15 @@
       outputProvider: outputProvider,
       options: options,
       showDiagnostics: showDiagnostics,
+      librariesSpecificationUri: librariesSpecificationUri,
       packageRoot: packageRoot,
-      packageConfig: packageConfig,
-      packagesDiscoveryProvider: packagesDiscoveryProvider);
+      packageConfig: packageConfig);
   if (beforeRun != null) {
     beforeRun(compiler);
   }
   bool isSuccess = await compiler.run(entryPoint);
   fe.InitializedCompilerState compilerState = kernelInitializedCompilerState =
-      compiler.libraryLoader.initializedCompilerState;
+      compiler.kernelLoader.initializedCompilerState;
   return new CompilationResult(compiler,
       isSuccess: isSuccess, kernelInitializedCompilerState: compilerState);
 }
@@ -111,16 +106,14 @@
     CompilerOutput outputProvider,
     List<String> options: const <String>[],
     bool showDiagnostics: true,
+    Uri librariesSpecificationUri,
     Uri packageRoot,
-    Uri packageConfig,
-    PackagesDiscoveryProvider packagesDiscoveryProvider}) {
+    Uri packageConfig}) {
   retainDataForTesting = true;
-  Uri libraryRoot = Uri.base.resolve('sdk/');
+  librariesSpecificationUri ??= Uri.base.resolve('sdk/lib/libraries.json');
   Uri platformBinaries = computePlatformBinariesLocation();
 
-  if (packageRoot == null &&
-      packageConfig == null &&
-      packagesDiscoveryProvider == null) {
+  if (packageRoot == null && packageConfig == null) {
     if (Platform.packageRoot != null) {
       packageRoot = Uri.base.resolve(Platform.packageRoot);
     } else if (Platform.packageConfig != null) {
@@ -143,12 +136,12 @@
   }
 
   CompilerOptions compilerOptions = CompilerOptions.parse(options,
-      libraryRoot: libraryRoot, platformBinaries: platformBinaries)
+      librariesSpecificationUri: librariesSpecificationUri,
+      platformBinaries: platformBinaries)
     ..entryPoint = entryPoint
     ..packageRoot = packageRoot
     ..environment = {}
-    ..packageConfig = packageConfig
-    ..packagesDiscoveryProvider = packagesDiscoveryProvider;
+    ..packageConfig = packageConfig;
   compilerOptions.kernelInitializedCompilerState =
       kernelInitializedCompilerState;
   CompilerImpl compiler = new CompilerImpl(
diff --git a/tests/compiler/dart2js/helpers/output_collector.dart b/tests/compiler/dart2js/helpers/output_collector.dart
index a5c1cdb..e9ff37b 100644
--- a/tests/compiler/dart2js/helpers/output_collector.dart
+++ b/tests/compiler/dart2js/helpers/output_collector.dart
@@ -26,6 +26,24 @@
   }
 }
 
+class BufferedBinaryOutputSink implements BinaryOutputSink {
+  final Uri uri;
+
+  List<int> list = <int>[];
+
+  BufferedBinaryOutputSink(this.uri);
+
+  void write(List<int> buffer, [int start = 0, int end]) {
+    list.addAll(buffer.sublist(start, end));
+  }
+
+  void close() {}
+
+  String toString() {
+    return 'BufferedBinaryOutputSink($uri)';
+  }
+}
+
 class CloningOutputSink implements OutputSink {
   final List<OutputSink> sinks;
 
@@ -44,6 +62,7 @@
 
 class OutputCollector implements CompilerOutput {
   Map<OutputType, Map<String, BufferedOutputSink>> outputMap = {};
+  Map<Uri, BufferedBinaryOutputSink> binaryOutputMap = {};
 
   String getOutput(String name, OutputType type) {
     Map<String, BufferedOutputSink> sinkMap = outputMap[type];
@@ -60,8 +79,13 @@
     }
   }
 
+  BinaryOutputSink createBinarySink(Uri uri) {
+    return binaryOutputMap.putIfAbsent(
+        uri, () => new BufferedBinaryOutputSink(uri));
+  }
+
   /// `true` if any output has been collected.
-  bool get hasOutput => !outputMap.isEmpty;
+  bool get hasOutput => outputMap.isNotEmpty || binaryOutputMap.isNotEmpty;
 
   /// `true` if any output other than main output has been collected.
   bool get hasExtraOutput {
@@ -70,7 +94,7 @@
         if (name != '') return true;
       }
     }
-    return false;
+    return binaryOutputMap.isNotEmpty;
   }
 
   @override
@@ -79,4 +103,18 @@
         outputMap.putIfAbsent(type, () => {});
     return sinkMap.putIfAbsent(name, () => new BufferedOutputSink());
   }
+
+  Map<OutputType, Map<String, String>> clear() {
+    Map<OutputType, Map<String, String>> outputMapResult = {};
+    outputMap.forEach(
+        (OutputType outputType, Map<String, BufferedOutputSink> sinkMap) {
+      Map<String, String> sinkMapResult = outputMapResult[outputType] = {};
+      sinkMap.forEach((String name, BufferedOutputSink sink) {
+        sinkMapResult[name] = sink.toString();
+      });
+    });
+    outputMap.clear();
+    binaryOutputMap.clear();
+    return outputMapResult;
+  }
 }
diff --git a/tests/compiler/dart2js/helpers/program_lookup.dart b/tests/compiler/dart2js/helpers/program_lookup.dart
index ab3ecff..e01108d 100644
--- a/tests/compiler/dart2js/helpers/program_lookup.dart
+++ b/tests/compiler/dart2js/helpers/program_lookup.dart
@@ -79,13 +79,21 @@
       return getLibraryData(function.library).getMethod(function);
     }
   }
+
+  Field getField(FieldEntity field) {
+    if (field.enclosingClass != null) {
+      return getClassData(field.enclosingClass).getField(field);
+    } else {
+      return getLibraryData(field.library).getField(field);
+    }
+  }
 }
 
 class LibraryData {
   final Library library;
-  Map<ClassEntity, ClassData> _classMap = <ClassEntity, ClassData>{};
-  Map<FunctionEntity, StaticMethod> _methodMap =
-      <FunctionEntity, StaticMethod>{};
+  Map<ClassEntity, ClassData> _classMap = {};
+  Map<FunctionEntity, StaticMethod> _methodMap = {};
+  Map<FieldEntity, Field> _fieldMap = {};
 
   LibraryData(this.library) {
     for (Class cls in library.classes) {
@@ -104,6 +112,18 @@
         _methodMap[method.element] = method;
       }
     }
+    for (Field field in library.staticFieldsForReflection) {
+      ClassEntity enclosingClass = field.element?.enclosingClass;
+      if (enclosingClass != null) {
+        ClassData data =
+            _classMap.putIfAbsent(enclosingClass, () => new ClassData(null));
+        assert(!data._fieldMap.containsKey(field.element));
+        data._fieldMap[field.element] = field;
+      } else if (field.element != null) {
+        assert(!_fieldMap.containsKey(field.element));
+        _fieldMap[field.element] = field;
+      }
+    }
   }
 
   ClassData getClassData(ClassEntity element) {
@@ -113,11 +133,17 @@
   StaticMethod getMethod(FunctionEntity function) {
     return _methodMap[function];
   }
+
+  Field getField(FieldEntity field) {
+    return _fieldMap[field];
+  }
 }
 
 class ClassData {
   final Class cls;
-  Map<FunctionEntity, Method> _methodMap = <FunctionEntity, Method>{};
+  Map<FunctionEntity, Method> _methodMap = {};
+  Map<FieldEntity, Field> _fieldMap = {};
+  Map<FieldEntity, StubMethod> _checkedSetterMap = {};
 
   ClassData(this.cls) {
     if (cls != null) {
@@ -125,12 +151,28 @@
         assert(!_methodMap.containsKey(method.element));
         _methodMap[method.element] = method;
       }
+      for (Field field in cls.fields) {
+        assert(!_fieldMap.containsKey(field.element));
+        _fieldMap[field.element] = field;
+      }
+      for (StubMethod checkedSetter in cls.checkedSetters) {
+        assert(!_checkedSetterMap.containsKey(checkedSetter.element));
+        _checkedSetterMap[checkedSetter.element] = checkedSetter;
+      }
     }
   }
 
   Method getMethod(FunctionEntity function) {
     return _methodMap[function];
   }
+
+  Field getField(FieldEntity field) {
+    return _fieldMap[field];
+  }
+
+  StubMethod getCheckedSetter(FieldEntity field) {
+    return _checkedSetterMap[field];
+  }
 }
 
 void forEachNode(js.Node root,
diff --git a/tests/compiler/dart2js/helpers/text_helpers.dart b/tests/compiler/dart2js/helpers/text_helpers.dart
new file mode 100644
index 0000000..e9723d2
--- /dev/null
+++ b/tests/compiler/dart2js/helpers/text_helpers.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Compares [text1] and [text2] line-by-line. If a mismatch is found, a diff
+/// of the [windowSize] lines before and after are printed and the mismatch line
+/// number is returned. If identical, nothing is printed and `null` is returned.
+int checkEqualContentAndShowDiff(String text1, String text2,
+    {int windowSize: 20,
+    bool Function(int, List<String>, List<String>) filter}) {
+  List<String> lines1 = text1.split('\n');
+  List<String> lines2 = text2.split('\n');
+  for (int i = 0; i < lines1.length && i < lines2.length; i++) {
+    if (i >= lines1.length || i >= lines2.length || lines1[i] != lines2[i]) {
+      if (filter != null && filter(i, lines1, lines2)) {
+        String line1 = 0 <= i && i < lines1.length ? lines1[i] : null;
+        String line2 = 0 <= i && i < lines2.length ? lines2[i] : null;
+        String text = line1 == null ? '<eof>' : line1;
+        String newText = line2 == null ? '<eof>' : line2;
+        print('(skipped) - $i ${text}');
+        print('(skipped) + $i ${newText}');
+      } else {
+        List<String> pendingLines = <String>[];
+
+        void flushPendingLines() {
+          if (pendingLines.isNotEmpty) {
+            print(pendingLines.join('\n'));
+            pendingLines.clear();
+          }
+        }
+
+        for (int j = i - windowSize; j < i + windowSize; j++) {
+          if (j < 0) continue;
+          String line1 = 0 <= j && j < lines1.length ? lines1[j] : null;
+          String line2 = 0 <= j && j < lines2.length ? lines2[j] : null;
+          if (line1 == line2) {
+            flushPendingLines();
+            if (line1 != null) {
+              print('  $j $line1');
+            }
+          } else {
+            String text = line1 == null ? '<eof>' : line1;
+            String newText = line2 == null ? '<eof>' : line2;
+
+            if (text.length > 80 && newText.length > 80) {
+              flushPendingLines();
+              print('- $j ${text}');
+              print('+ $j ${newText}');
+              assert(text != newText);
+              StringBuffer diff = new StringBuffer();
+              diff.write('  $j ');
+              for (int k = 0; k < text.length && k < newText.length; k++) {
+                int char1 = k < text.length ? text.codeUnitAt(k) : null;
+                int char2 = k < newText.length ? newText.codeUnitAt(k) : null;
+                if (char1 != char2) {
+                  diff.write('^');
+                } else {
+                  diff.write(' ');
+                }
+              }
+              print(diff);
+            } else {
+              print('- $j ${text}');
+              pendingLines.add('+ $j ${newText}');
+            }
+          }
+        }
+        flushPendingLines();
+        return i;
+      }
+    }
+  }
+  return null;
+}
diff --git a/tests/compiler/dart2js/impact/data/as.dart b/tests/compiler/dart2js/impact/data/as.dart
new file mode 100644
index 0000000..b7b196a
--- /dev/null
+++ b/tests/compiler/dart2js/impact/data/as.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: main:static=[explicitAs(1),implicitAs(1),promoted(1)],type=[inst:JSNull]*/
+main() {
+  explicitAs(null);
+  implicitAs(null);
+  promoted(null);
+}
+
+/*element: explicitAs:dynamic=[String.length],type=[inst:JSBool,param:String]*/
+explicitAs(String i) {
+  i.length;
+  // ignore: unnecessary_cast
+  return i as String;
+}
+
+/*element: implicitAs:dynamic=[String.length],type=[inst:JSBool,param:String]*/
+String implicitAs(String i) {
+  dynamic j = i;
+  i.length;
+  j.length;
+  return j;
+}
+
+/*element: promoted:dynamic=[String.length],type=[inst:JSBool,inst:JSNull,is:String]*/
+String promoted(dynamic i) {
+  if (i is! String) return null;
+  i.length;
+  return i;
+}
diff --git a/tests/compiler/dart2js/impact/data/async.dart b/tests/compiler/dart2js/impact/data/async.dart
index 7098aef..24ab850 100644
--- a/tests/compiler/dart2js/impact/data/async.dart
+++ b/tests/compiler/dart2js/impact/data/async.dart
@@ -15,7 +15,7 @@
   testLocalAsyncStar(0),
   testLocalSyncStar(0),
   testSyncStar(0)],
-  type=[inst:JSNull]
+ type=[inst:JSNull]
 */
 main() {
   testSyncStar();
diff --git a/tests/compiler/dart2js/impact/data/classes.dart b/tests/compiler/dart2js/impact/data/classes.dart
index a31b32f..bacab72 100644
--- a/tests/compiler/dart2js/impact/data/classes.dart
+++ b/tests/compiler/dart2js/impact/data/classes.dart
@@ -240,7 +240,7 @@
 }
 
 /*strong.element: testInstanceGenericMethod:
- dynamic=[GenericClass.genericMethod<bool>(1)],
+ dynamic=[exact:GenericClass.genericMethod<bool>(1)],
  static=[
   GenericClass.generative(0),
   assertIsSubtype,
diff --git a/tests/compiler/dart2js/impact/data/effectively_final.dart b/tests/compiler/dart2js/impact/data/effectively_final.dart
new file mode 100644
index 0000000..305ca2b
--- /dev/null
+++ b/tests/compiler/dart2js/impact/data/effectively_final.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: main:
+ static=[
+  effectivelyFinalList(0),
+  effectivelyFinalPromoted(0),
+  effectivelyFinalPromotedInvalid(0),
+  notEffectivelyFinalList(0)]
+*/
+main() {
+  effectivelyFinalList();
+  notEffectivelyFinalList();
+  effectivelyFinalPromoted();
+  effectivelyFinalPromotedInvalid();
+}
+
+/*element: effectivelyFinalList:
+ dynamic=[
+  List.add(1),
+  List.length,
+  List.length=,
+  int.+],
+ type=[
+  inst:JSDouble,
+  inst:JSInt,
+  inst:JSNull,
+  inst:JSNumber,
+  inst:JSPositiveInt,
+  inst:JSUInt31,
+  inst:JSUInt32,
+  inst:List<dynamic>]
+*/
+effectivelyFinalList() {
+  dynamic c = [];
+  c.add(null);
+  c.length + 1;
+  c.length = 1;
+}
+
+/*element: notEffectivelyFinalList:
+ dynamic=[
+  +,
+  add(1),
+  call(1),
+  length,
+  length=],
+ type=[
+  inst:JSDouble,
+  inst:JSInt,
+  inst:JSNull,
+  inst:JSNumber,
+  inst:JSPositiveInt,
+  inst:JSUInt31,
+  inst:JSUInt32,
+  inst:List<dynamic>]
+*/
+notEffectivelyFinalList() {
+  dynamic c = [];
+  c.add(null);
+  c.length + 1;
+  c.length = 1;
+  c = null;
+}
+
+/*element: _method1:type=[inst:JSNull]*/
+num _method1() => null;
+
+/*element: effectivelyFinalPromoted:
+ dynamic=[int.+,num.+],
+ static=[_method1(0)],
+ type=[
+  inst:JSBool,
+  inst:JSDouble,
+  inst:JSInt,
+  inst:JSNumber,
+  inst:JSPositiveInt,
+  inst:JSUInt31,
+  inst:JSUInt32,
+  is:int]
+*/
+effectivelyFinalPromoted() {
+  dynamic c = _method1();
+  c + 0;
+  if (c is int) {
+    c + 1;
+  }
+}
+
+/*element: _method2:type=[inst:JSNull]*/
+String _method2() => null;
+
+/*element: effectivelyFinalPromotedInvalid:
+ dynamic=[String.+,int.+],
+ static=[_method2(0)],
+ type=[
+  inst:JSBool,
+  inst:JSDouble,
+  inst:JSInt,
+  inst:JSNumber,
+  inst:JSPositiveInt,
+  inst:JSString,
+  inst:JSUInt31,
+  inst:JSUInt32,
+  is:int]
+*/
+effectivelyFinalPromotedInvalid() {
+  dynamic c = _method2();
+  c + '';
+  if (c is int) {
+    c + 1;
+  }
+}
diff --git a/tests/compiler/dart2js/impact/data/exact.dart b/tests/compiler/dart2js/impact/data/exact.dart
new file mode 100644
index 0000000..11a6d2d
--- /dev/null
+++ b/tests/compiler/dart2js/impact/data/exact.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: A.:static=[Object.(0)]*/
+class A {
+  method1() {}
+  method2() {}
+  method3() {}
+}
+
+/*element: B.:static=[A.(0)]*/
+class B extends A {
+  method1() {}
+  method2() {}
+  method3() {}
+}
+
+/*element: C.:static=[B.(0)]*/
+class C extends B {
+  method1() {}
+  method2() {}
+  method3() {}
+}
+
+/*element: main:static=[callOnEffectivelyFinalB(0),callOnNewB(0),callOnNewC(0)]*/
+main() {
+  callOnNewB();
+  callOnNewC();
+  callOnEffectivelyFinalB();
+  callOnEffectivelyFinalB();
+}
+
+/*element: callOnNewB:dynamic=[exact:B.method1(0)],static=[B.(0)]*/
+callOnNewB() {
+  new B().method1();
+}
+
+/*element: callOnNewC:dynamic=[exact:C.method2(0)],static=[C.(0)]*/
+callOnNewC() {
+  new C().method2();
+}
+
+/*element: callOnEffectivelyFinalB:dynamic=[exact:B.method3(0)],static=[B.(0)]*/
+callOnEffectivelyFinalB() {
+  A a = new B();
+  a.method3();
+}
diff --git a/tests/compiler/dart2js/impact/data/expressions.dart b/tests/compiler/dart2js/impact/data/expressions.dart
index e2b5552..c1570bf 100644
--- a/tests/compiler/dart2js/impact/data/expressions.dart
+++ b/tests/compiler/dart2js/impact/data/expressions.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /*element: main:static=[
-  testAs(0),
-  testAsGeneric(0),
-  testAsGenericDynamic(0),
-  testAsGenericRaw(0),
+  testAs(1),
+  testAsGeneric(1),
+  testAsGenericDynamic(1),
+  testAsGenericRaw(1),
   testConditional(0),
   testIfNotNull(1),
   testIfNotNullSet(1),
@@ -56,10 +56,10 @@
   testIsTypedefGenericRaw();
   testIsTypedefGenericDynamic();
   testIsTypedefDeep();
-  testAs();
-  testAsGeneric();
-  testAsGenericRaw();
-  testAsGenericDynamic();
+  testAs(null);
+  testAsGeneric(null);
+  testAsGenericRaw(null);
+  testAsGenericDynamic(null);
   testThrow();
   testIfNotNull(null);
   testTypedIfNotNull(null);
@@ -269,10 +269,10 @@
 
 /*element: testAs:
  static=[throwRuntimeError],
- type=[as:Class,inst:JSBool,inst:JSNull]
+ type=[as:Class,inst:JSBool]
 */
 // ignore: UNNECESSARY_CAST
-testAs() => null as Class;
+testAs(dynamic o) => o as Class;
 
 /*element: testAsGeneric:static=[checkSubtype,
   getRuntimeTypeArgument,
@@ -288,24 +288,23 @@
   inst:JSExtendableArray<dynamic>,
   inst:JSFixedArray<dynamic>,
   inst:JSMutableArray<dynamic>,
-  inst:JSNull,
   inst:JSUnmodifiableArray<dynamic>]*/
 // ignore: UNNECESSARY_CAST
-testAsGeneric() => null as GenericClass<int, String>;
+testAsGeneric(dynamic o) => o as GenericClass<int, String>;
 
 /*element: testAsGenericRaw:
  static=[throwRuntimeError],
- type=[as:GenericClass<dynamic,dynamic>,inst:JSBool,inst:JSNull]
+ type=[as:GenericClass<dynamic,dynamic>,inst:JSBool]
 */
 // ignore: UNNECESSARY_CAST
-testAsGenericRaw() => null as GenericClass;
+testAsGenericRaw(dynamic o) => o as GenericClass;
 
 /*element: testAsGenericDynamic:
  static=[throwRuntimeError],
- type=[as:GenericClass<dynamic,dynamic>,inst:JSBool,inst:JSNull]
+ type=[as:GenericClass<dynamic,dynamic>,inst:JSBool]
 */
 // ignore: UNNECESSARY_CAST
-testAsGenericDynamic() => null as GenericClass<dynamic, dynamic>;
+testAsGenericDynamic(dynamic o) => o as GenericClass<dynamic, dynamic>;
 
 /*element: testThrow:
  static=[throwExpression,wrapException],
diff --git a/tests/compiler/dart2js/impact/data/extract_type_arguments_strong.dart b/tests/compiler/dart2js/impact/data/extract_type_arguments.dart
similarity index 100%
rename from tests/compiler/dart2js/impact/data/extract_type_arguments_strong.dart
rename to tests/compiler/dart2js/impact/data/extract_type_arguments.dart
diff --git a/tests/compiler/dart2js/impact/data/future_or.dart b/tests/compiler/dart2js/impact/data/future_or.dart
new file mode 100644
index 0000000..c119fbe
--- /dev/null
+++ b/tests/compiler/dart2js/impact/data/future_or.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+
+/*element: main:
+ dynamic=[runtimeType],
+ runtimeType=[unknown:FutureOr<int>],
+ static=[Future.value(1),assertIsSubtype,print(1),throwTypeError],
+ type=[inst:JSDouble,inst:JSInt,inst:JSNumber,inst:JSPositiveInt,inst:JSUInt31,inst:JSUInt32]
+*/
+@pragma('dart2js:disableFinal')
+void main() {
+  FutureOr<int> i = new Future<int>.value(0);
+  print(i.runtimeType);
+}
diff --git a/tests/compiler/dart2js/impact/data/promotion.dart b/tests/compiler/dart2js/impact/data/promotion.dart
index b076243..a36673d 100644
--- a/tests/compiler/dart2js/impact/data/promotion.dart
+++ b/tests/compiler/dart2js/impact/data/promotion.dart
@@ -47,7 +47,7 @@
   if (cls is SubClass) cls.method();
 }
 
-/*element: negativeDynamic:dynamic=[call(0),method(0)],type=[inst:JSBool,is:SubClass]*/
+/*element: negativeDynamic:dynamic=[SubClass.method(0)],type=[inst:JSBool,is:SubClass]*/
 negativeDynamic(dynamic cls) {
   if (cls is! SubClass) return;
   cls.method();
diff --git a/tests/compiler/dart2js/impact/data/runtime_type.dart b/tests/compiler/dart2js/impact/data/runtime_type.dart
new file mode 100644
index 0000000..96fac37
--- /dev/null
+++ b/tests/compiler/dart2js/impact/data/runtime_type.dart
@@ -0,0 +1,463 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: Class1a.:static=[Object.(0)]*/
+class Class1a<T> {
+  /*element: Class1a.==:
+   dynamic=[this:Class1a.runtimeType,Object.runtimeType,Type.==],
+   runtimeType=[equals:Class1a<Class1a.T>/Object]
+  */
+  bool operator ==(other) {
+    return runtimeType == other.runtimeType;
+  }
+}
+
+/*element: Class1b.:static=[Class1a.(0)]*/
+class Class1b<T> extends Class1a<T> {
+  /*element: Class1b.==:
+   dynamic=[this:Class1b.runtimeType,Object.runtimeType,Type.==],
+   runtimeType=[equals:Object/Class1b<Class1b.T>]
+  */
+  bool operator ==(other) {
+    return other.runtimeType == runtimeType;
+  }
+}
+
+/*element: Class1c.:static=[Object.(0)]*/
+class Class1c<T> implements Class1a<T> {
+  /*element: Class1c.==:
+   dynamic=[this:Class1c.runtimeType,Object.==,Object.runtimeType,Type.==],
+   runtimeType=[equals:Class1c<Class1c.T>/Object],
+   type=[inst:JSNull]
+  */
+  bool operator ==(other) {
+    return runtimeType == other?.runtimeType;
+  }
+}
+
+/*element: Class1d.:static=[Object.(0)]*/
+class Class1d<T> implements Class1a<T> {
+  /*element: Class1d.==:
+   dynamic=[this:Class1d.runtimeType,Object.==,Object.runtimeType,Type.==],
+   runtimeType=[equals:Object/Class1d<Class1d.T>],
+   type=[inst:JSNull]
+  */
+  bool operator ==(other) {
+    return other?.runtimeType == runtimeType;
+  }
+}
+
+/*element: Class2.:static=[Object.(0)]*/
+class Class2<T> {}
+
+/*element: Class3.:static=[Object.(0)]*/
+class Class3 {
+  /*element: Class3.field:type=[inst:JSNull]*/
+  var field;
+}
+
+/*element: Class4.:static=[Object.(0)]*/
+class Class4 {}
+
+/*element: toString1:
+ dynamic=[Class2.runtimeType,toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  S,
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSString,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString1(Class2<int> c) => '${c.runtimeType}';
+
+/*element: toString2:
+ dynamic=[Class2.==,Class2.runtimeType,toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  S,
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSString,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString2(Class2<int> c) => '${c?.runtimeType}';
+
+/*element: toString3:
+ dynamic=[Class2.runtimeType,Type.toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString3(Class2<int> c) => c.runtimeType.toString();
+
+/*element: toString4:
+ dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString4(Class2<int> c) => c.runtimeType?.toString();
+
+/*element: toString5:
+ dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString5(Class2<int> c) => c?.runtimeType?.toString();
+
+/*element: toString6:
+ dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],
+ runtimeType=[string:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+toString6(Class2<int> c) => c?.runtimeType.toString();
+
+/*element: unknown:
+ dynamic=[Class2.runtimeType],
+ runtimeType=[unknown:Class2<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class2<int>]
+*/
+unknown(Class2<int> c) => c.runtimeType;
+
+/*element: equals1:
+ dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],
+ runtimeType=[equals:Class1a<int>/Class1d<int>],
+ static=[
+  checkSubtype,
+  getRuntimeTypeArgument,
+  getRuntimeTypeArgumentIntercepted,
+  getRuntimeTypeInfo,
+  getTypeArgumentByIndex,
+  setRuntimeTypeInfo],
+ type=[
+  inst:JSArray<dynamic>,
+  inst:JSBool,
+  inst:JSExtendableArray<dynamic>,
+  inst:JSFixedArray<dynamic>,
+  inst:JSMutableArray<dynamic>,
+  inst:JSNull,
+  inst:JSUnmodifiableArray<dynamic>,
+  param:Class1a<int>,
+  param:Class1d<int>]
+*/
+equals1(Class1a<int> a, Class1d<int> b) => a?.runtimeType == b?.runtimeType;
+
+/*element: almostEquals1:
+ dynamic=[Class3.runtimeType,Type.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals1(Class3 a) => a.runtimeType == null;
+
+/*element: almostEquals2:
+ dynamic=[Class3.==,Class3.runtimeType,Type.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals2(Class3 a) => a?.runtimeType == null;
+
+/*element: almostEquals3:
+ dynamic=[Class3.runtimeType,Null.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals3(Class3 a) => null == a.runtimeType;
+
+/*element: almostEquals4:
+ dynamic=[Class3.==,Class3.runtimeType,Null.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals4(Class3 a) => null == a?.runtimeType;
+
+/*element: almostEquals5:
+ dynamic=[Class3.field,Class3.runtimeType,Type.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,param:Class3]
+*/
+almostEquals5(Class3 a) => a.runtimeType == a.field;
+
+/*element: almostEquals6:
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals6(Class3 a) => a?.runtimeType == a.field;
+
+/*element: almostEquals7:
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals7(Class3 a) => a.runtimeType == a?.field;
+
+/*element: almostEquals8:
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals8(Class3 a) => a?.runtimeType == a?.field;
+
+/*element: almostEquals9:
+ dynamic=[Class3.field,Class3.runtimeType,Object.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,param:Class3]
+*/
+almostEquals9(Class3 a) => a.field == a.runtimeType;
+
+/*element: almostEquals10:
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals10(Class3 a) => a?.field == a.runtimeType;
+
+/*element: almostEquals11:
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals11(Class3 a) => a.field == a?.runtimeType;
+
+/*element: almostEquals12:
+ dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostEquals12(Class3 a) => a?.field == a?.runtimeType;
+
+/*element: almostToString1:
+ dynamic=[Class3.runtimeType,Type.toString],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,param:Class3]
+*/
+almostToString1(Class3 a) => a.runtimeType.toString;
+
+/*element: almostToString2:
+ dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostToString2(Class3 a) => a?.runtimeType?.toString;
+
+/*element: almostToString3:
+ dynamic=[Class3.runtimeType,Type.noSuchMethod(1)],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostToString3(Class3 a) => a.runtimeType.noSuchMethod(null);
+
+/*element: almostToString4:
+ dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],
+ runtimeType=[unknown:Class3],
+ type=[inst:JSBool,inst:JSNull,param:Class3]
+*/
+almostToString4(Class3 a) => a?.runtimeType.noSuchMethod(null);
+
+/*element: notEquals1:
+ dynamic=[Class3.runtimeType,Class4.runtimeType,Type.==],
+ runtimeType=[equals:Class3/Class4],
+ type=[inst:JSBool,param:Class3,param:Class4]
+*/
+notEquals1(Class3 a, Class4 b) => a.runtimeType != b.runtimeType;
+
+/*element: notEquals2:
+ dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],
+ runtimeType=[equals:Class3/Class4],
+ type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
+*/
+notEquals2(Class3 a, Class4 b) => a?.runtimeType != b.runtimeType;
+
+/*element: notEquals3:
+ dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],
+ runtimeType=[equals:Class3/Class4],
+ type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
+*/
+notEquals3(Class3 a, Class4 b) => a.runtimeType != b?.runtimeType;
+
+/*element: notEquals4:
+ dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],
+ runtimeType=[equals:Class3/Class4],
+ type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
+*/
+notEquals4(Class3 a, Class4 b) => a?.runtimeType != b?.runtimeType;
+
+/*element: main:
+ dynamic=[exact:Class1a.==],
+ static=[
+  Class1a.(0),
+  Class1b.(0),
+  Class1c.(0),
+  Class1d.(0),
+  Class2.(0),
+  Class3.(0),
+  Class4.(0),
+  almostEquals1(1),
+  almostEquals10(1),
+  almostEquals11(1),
+  almostEquals12(1),
+  almostEquals2(1),
+  almostEquals3(1),
+  almostEquals4(1),
+  almostEquals5(1),
+  almostEquals6(1),
+  almostEquals7(1),
+  almostEquals8(1),
+  almostEquals9(1),
+  almostToString1(1),
+  almostToString2(1),
+  almostToString3(1),
+  almostToString4(1),
+  assertIsSubtype,
+  equals1(2),
+  notEquals1(2),
+  notEquals2(2),
+  notEquals3(2),
+  notEquals4(2),
+  print(1),
+  throwTypeError,
+  toString1(1),
+  toString2(1),
+  toString3(1),
+  toString4(1),
+  toString5(1),
+  toString6(1),
+  unknown(1)]
+*/
+main() {
+  Class1a<int> c1a = new Class1a<int>();
+  Class1b<int> c1b = new Class1b<int>();
+  Class1c<int> c1c = new Class1c<int>();
+  Class1d<int> c1d = new Class1d<int>();
+  Class2<int> c2 = new Class2<int>();
+  Class3 c3 = new Class3();
+  Class4 c4 = new Class4();
+  print(c1a == c1b);
+  print(c1a == c1c);
+  print(c1a == c1d);
+  print(c1a == c2);
+  toString1(c2);
+  toString2(c2);
+  toString3(c2);
+  toString4(c2);
+  toString5(c2);
+  toString6(c2);
+  unknown(c2);
+  equals1(c1a, c1d);
+  almostEquals1(c3);
+  almostEquals2(c3);
+  almostEquals3(c3);
+  almostEquals4(c3);
+  almostEquals5(c3);
+  almostEquals6(c3);
+  almostEquals7(c3);
+  almostEquals8(c3);
+  almostEquals9(c3);
+  almostEquals10(c3);
+  almostEquals11(c3);
+  almostEquals12(c3);
+  almostToString1(c3);
+  almostToString2(c3);
+  almostToString3(c3);
+  almostToString4(c3);
+  notEquals1(c3, c4);
+  notEquals2(c3, c4);
+  notEquals3(c3, c4);
+  notEquals4(c3, c4);
+}
diff --git a/tests/compiler/dart2js/impact/data/runtime_type_strong.dart b/tests/compiler/dart2js/impact/data/runtime_type_strong.dart
deleted file mode 100644
index 63d2dea..0000000
--- a/tests/compiler/dart2js/impact/data/runtime_type_strong.dart
+++ /dev/null
@@ -1,463 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/*element: Class1a.:static=[Object.(0)]*/
-class Class1a<T> {
-  /*element: Class1a.==:
-   dynamic=[Class1a.runtimeType,Object.runtimeType,Type.==],
-   runtimeType=[equals:Class1a<Class1a.T>/dynamic]
-  */
-  bool operator ==(other) {
-    return runtimeType == other.runtimeType;
-  }
-}
-
-/*element: Class1b.:static=[Class1a.(0)]*/
-class Class1b<T> extends Class1a<T> {
-  /*element: Class1b.==:
-   dynamic=[Class1b.runtimeType,Object.runtimeType,Type.==],
-   runtimeType=[equals:dynamic/Class1b<Class1b.T>]
-  */
-  bool operator ==(other) {
-    return other.runtimeType == runtimeType;
-  }
-}
-
-/*element: Class1c.:static=[Object.(0)]*/
-class Class1c<T> implements Class1a<T> {
-  /*element: Class1c.==:
-   dynamic=[Class1c.runtimeType,Object.==,Object.runtimeType,Type.==],
-   runtimeType=[equals:Class1c<Class1c.T>/dynamic],
-   type=[inst:JSNull]
-  */
-  bool operator ==(other) {
-    return runtimeType == other?.runtimeType;
-  }
-}
-
-/*element: Class1d.:static=[Object.(0)]*/
-class Class1d<T> implements Class1a<T> {
-  /*element: Class1d.==:
-   dynamic=[Class1d.runtimeType,Object.==,Object.runtimeType,Type.==],
-   runtimeType=[equals:dynamic/Class1d<Class1d.T>],
-   type=[inst:JSNull]
-  */
-  bool operator ==(other) {
-    return other?.runtimeType == runtimeType;
-  }
-}
-
-/*element: Class2.:static=[Object.(0)]*/
-class Class2<T> {}
-
-/*element: Class3.:static=[Object.(0)]*/
-class Class3 {
-  /*element: Class3.field:type=[inst:JSNull]*/
-  var field;
-}
-
-/*element: Class4.:static=[Object.(0)]*/
-class Class4 {}
-
-/*element: toString1:
- dynamic=[Class2.runtimeType,toString(0)],
- runtimeType=[string:Class2<int>],
- static=[
-  S,
-  checkSubtype,
-  getRuntimeTypeArgument,
-  getRuntimeTypeArgumentIntercepted,
-  getRuntimeTypeInfo,
-  getTypeArgumentByIndex,
-  setRuntimeTypeInfo],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSString,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:Class2<int>]
-*/
-toString1(Class2<int> c) => '${c.runtimeType}';
-
-/*element: toString2:
- dynamic=[Class2.==,Class2.runtimeType,toString(0)],
- runtimeType=[string:Class2<int>],
- static=[
-  S,
-  checkSubtype,
-  getRuntimeTypeArgument,
-  getRuntimeTypeArgumentIntercepted,
-  getRuntimeTypeInfo,
-  getTypeArgumentByIndex,
-  setRuntimeTypeInfo],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSNull,
-  inst:JSString,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:Class2<int>]
-*/
-toString2(Class2<int> c) => '${c?.runtimeType}';
-
-/*element: toString3:
- dynamic=[Class2.runtimeType,Type.toString(0)],
- runtimeType=[string:Class2<int>],
- static=[
-  checkSubtype,
-  getRuntimeTypeArgument,
-  getRuntimeTypeArgumentIntercepted,
-  getRuntimeTypeInfo,
-  getTypeArgumentByIndex,
-  setRuntimeTypeInfo],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:Class2<int>]
-*/
-toString3(Class2<int> c) => c.runtimeType.toString();
-
-/*element: toString4:
- dynamic=[Class2.runtimeType,Type.==,Type.toString(0)],
- runtimeType=[string:Class2<int>],
- static=[
-  checkSubtype,
-  getRuntimeTypeArgument,
-  getRuntimeTypeArgumentIntercepted,
-  getRuntimeTypeInfo,
-  getTypeArgumentByIndex,
-  setRuntimeTypeInfo],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSNull,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:Class2<int>]
-*/
-toString4(Class2<int> c) => c.runtimeType?.toString();
-
-/*element: toString5:
- dynamic=[Class2.==,Class2.runtimeType,Type.==,Type.toString(0)],
- runtimeType=[string:Class2<int>],
- static=[
-  checkSubtype,
-  getRuntimeTypeArgument,
-  getRuntimeTypeArgumentIntercepted,
-  getRuntimeTypeInfo,
-  getTypeArgumentByIndex,
-  setRuntimeTypeInfo],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSNull,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:Class2<int>]
-*/
-toString5(Class2<int> c) => c?.runtimeType?.toString();
-
-/*element: toString6:
- dynamic=[Class2.==,Class2.runtimeType,Type.toString(0)],
- runtimeType=[string:Class2<int>],
- static=[
-  checkSubtype,
-  getRuntimeTypeArgument,
-  getRuntimeTypeArgumentIntercepted,
-  getRuntimeTypeInfo,
-  getTypeArgumentByIndex,
-  setRuntimeTypeInfo],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSNull,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:Class2<int>]
-*/
-toString6(Class2<int> c) => c?.runtimeType.toString();
-
-/*element: unknown:
- dynamic=[Class2.runtimeType],
- runtimeType=[unknown:Class2<int>],
- static=[
-  checkSubtype,
-  getRuntimeTypeArgument,
-  getRuntimeTypeArgumentIntercepted,
-  getRuntimeTypeInfo,
-  getTypeArgumentByIndex,
-  setRuntimeTypeInfo],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:Class2<int>]
-*/
-unknown(Class2<int> c) => c.runtimeType;
-
-/*element: equals1:
- dynamic=[Class1a.==,Class1a.runtimeType,Class1d.==,Class1d.runtimeType,Type.==],
- runtimeType=[equals:Class1a<int>/Class1d<int>],
- static=[
-  checkSubtype,
-  getRuntimeTypeArgument,
-  getRuntimeTypeArgumentIntercepted,
-  getRuntimeTypeInfo,
-  getTypeArgumentByIndex,
-  setRuntimeTypeInfo],
- type=[
-  inst:JSArray<dynamic>,
-  inst:JSBool,
-  inst:JSExtendableArray<dynamic>,
-  inst:JSFixedArray<dynamic>,
-  inst:JSMutableArray<dynamic>,
-  inst:JSNull,
-  inst:JSUnmodifiableArray<dynamic>,
-  param:Class1a<int>,
-  param:Class1d<int>]
-*/
-equals1(Class1a<int> a, Class1d<int> b) => a?.runtimeType == b?.runtimeType;
-
-/*element: almostEquals1:
- dynamic=[Class3.runtimeType,Type.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals1(Class3 a) => a.runtimeType == null;
-
-/*element: almostEquals2:
- dynamic=[Class3.==,Class3.runtimeType,Type.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals2(Class3 a) => a?.runtimeType == null;
-
-/*element: almostEquals3:
- dynamic=[Class3.runtimeType,Null.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals3(Class3 a) => null == a.runtimeType;
-
-/*element: almostEquals4:
- dynamic=[Class3.==,Class3.runtimeType,Null.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals4(Class3 a) => null == a?.runtimeType;
-
-/*element: almostEquals5:
- dynamic=[Class3.field,Class3.runtimeType,Type.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,param:Class3]
-*/
-almostEquals5(Class3 a) => a.runtimeType == a.field;
-
-/*element: almostEquals6:
- dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals6(Class3 a) => a?.runtimeType == a.field;
-
-/*element: almostEquals7:
- dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals7(Class3 a) => a.runtimeType == a?.field;
-
-/*element: almostEquals8:
- dynamic=[Class3.==,Class3.field,Class3.runtimeType,Type.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals8(Class3 a) => a?.runtimeType == a?.field;
-
-/*element: almostEquals9:
- dynamic=[Class3.field,Class3.runtimeType,Object.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,param:Class3]
-*/
-almostEquals9(Class3 a) => a.field == a.runtimeType;
-
-/*element: almostEquals10:
- dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals10(Class3 a) => a?.field == a.runtimeType;
-
-/*element: almostEquals11:
- dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals11(Class3 a) => a.field == a?.runtimeType;
-
-/*element: almostEquals12:
- dynamic=[Class3.==,Class3.field,Class3.runtimeType,Object.==],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostEquals12(Class3 a) => a?.field == a?.runtimeType;
-
-/*element: almostToString1:
- dynamic=[Class3.runtimeType,Type.toString],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,param:Class3]
-*/
-almostToString1(Class3 a) => a.runtimeType.toString;
-
-/*element: almostToString2:
- dynamic=[Class3.==,Class3.runtimeType,Type.==,Type.toString],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostToString2(Class3 a) => a?.runtimeType?.toString;
-
-/*element: almostToString3:
- dynamic=[Class3.runtimeType,Type.noSuchMethod(1)],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostToString3(Class3 a) => a.runtimeType.noSuchMethod(null);
-
-/*element: almostToString4:
- dynamic=[Class3.==,Class3.runtimeType,Type.noSuchMethod(1)],
- runtimeType=[unknown:Class3],
- type=[inst:JSBool,inst:JSNull,param:Class3]
-*/
-almostToString4(Class3 a) => a?.runtimeType.noSuchMethod(null);
-
-/*element: notEquals1:
- dynamic=[Class3.runtimeType,Class4.runtimeType,Type.==],
- runtimeType=[equals:Class3/Class4],
- type=[inst:JSBool,param:Class3,param:Class4]
-*/
-notEquals1(Class3 a, Class4 b) => a.runtimeType != b.runtimeType;
-
-/*element: notEquals2:
- dynamic=[Class3.==,Class3.runtimeType,Class4.runtimeType,Type.==],
- runtimeType=[equals:Class3/Class4],
- type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
-*/
-notEquals2(Class3 a, Class4 b) => a?.runtimeType != b.runtimeType;
-
-/*element: notEquals3:
- dynamic=[Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],
- runtimeType=[equals:Class3/Class4],
- type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
-*/
-notEquals3(Class3 a, Class4 b) => a.runtimeType != b?.runtimeType;
-
-/*element: notEquals4:
- dynamic=[Class3.==,Class3.runtimeType,Class4.==,Class4.runtimeType,Type.==],
- runtimeType=[equals:Class3/Class4],
- type=[inst:JSBool,inst:JSNull,param:Class3,param:Class4]
-*/
-notEquals4(Class3 a, Class4 b) => a?.runtimeType != b?.runtimeType;
-
-/*element: main:
- dynamic=[Class1a.==],
- static=[
-  Class1a.(0),
-  Class1b.(0),
-  Class1c.(0),
-  Class1d.(0),
-  Class2.(0),
-  Class3.(0),
-  Class4.(0),
-  almostEquals1(1),
-  almostEquals10(1),
-  almostEquals11(1),
-  almostEquals12(1),
-  almostEquals2(1),
-  almostEquals3(1),
-  almostEquals4(1),
-  almostEquals5(1),
-  almostEquals6(1),
-  almostEquals7(1),
-  almostEquals8(1),
-  almostEquals9(1),
-  almostToString1(1),
-  almostToString2(1),
-  almostToString3(1),
-  almostToString4(1),
-  assertIsSubtype,
-  equals1(2),
-  notEquals1(2),
-  notEquals2(2),
-  notEquals3(2),
-  notEquals4(2),
-  print(1),
-  throwTypeError,
-  toString1(1),
-  toString2(1),
-  toString3(1),
-  toString4(1),
-  toString5(1),
-  toString6(1),
-  unknown(1)]
-*/
-main() {
-  Class1a<int> c1a = new Class1a<int>();
-  Class1b<int> c1b = new Class1b<int>();
-  Class1c<int> c1c = new Class1c<int>();
-  Class1d<int> c1d = new Class1d<int>();
-  Class2<int> c2 = new Class2<int>();
-  Class3 c3 = new Class3();
-  Class4 c4 = new Class4();
-  print(c1a == c1b);
-  print(c1a == c1c);
-  print(c1a == c1d);
-  print(c1a == c2);
-  toString1(c2);
-  toString2(c2);
-  toString3(c2);
-  toString4(c2);
-  toString5(c2);
-  toString6(c2);
-  unknown(c2);
-  equals1(c1a, c1d);
-  almostEquals1(c3);
-  almostEquals2(c3);
-  almostEquals3(c3);
-  almostEquals4(c3);
-  almostEquals5(c3);
-  almostEquals6(c3);
-  almostEquals7(c3);
-  almostEquals8(c3);
-  almostEquals9(c3);
-  almostEquals10(c3);
-  almostEquals11(c3);
-  almostEquals12(c3);
-  almostToString1(c3);
-  almostToString2(c3);
-  almostToString3(c3);
-  almostToString4(c3);
-  notEquals1(c3, c4);
-  notEquals2(c3, c4);
-  notEquals3(c3, c4);
-  notEquals4(c3, c4);
-}
diff --git a/tests/compiler/dart2js/impact/data/this.dart b/tests/compiler/dart2js/impact/data/this.dart
new file mode 100644
index 0000000..73a03d1
--- /dev/null
+++ b/tests/compiler/dart2js/impact/data/this.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: Class.:static=[Object.(0)]*/
+class Class {
+  /*element: Class.field1:type=[inst:JSNull]*/
+  var field1;
+
+  /*element: Class.field2:type=[inst:JSNull]*/
+  var field2;
+
+  /*element: Class.method1:dynamic=[this:Class.method2(0)]*/
+  method1() {
+    method2();
+  }
+
+  /*element: Class.method2:dynamic=[this:Class.field1=,this:Class.field2]*/
+  method2() {
+    field1 = field2;
+  }
+}
+
+/*element: Subclass.:static=[Class.(0)]*/
+class Subclass extends Class {
+  /*element: Subclass.field1:type=[inst:JSNull]*/
+  var field1;
+  /*element: Subclass.field2:type=[inst:JSNull]*/
+  var field2;
+
+  /*element: Subclass.method1:*/
+  method1() {}
+
+  /*element: Subclass.method2:dynamic=[this:Subclass.method3(0)]*/
+  method2() {
+    method3();
+  }
+
+  method3() {}
+}
+
+/*element: Subtype.:static=[Object.(0)]*/
+class Subtype implements Class {
+  /*element: Subtype.field1:type=[inst:JSNull]*/
+  var field1;
+  /*element: Subtype.field2:type=[inst:JSNull]*/
+  var field2;
+
+  method1() {}
+
+  method2() {
+    method4();
+  }
+
+  method4() {
+    method2();
+  }
+}
+
+/*element: main:
+ dynamic=[Class.method1(0)],
+ static=[Class.(0),Subclass.(0),Subtype.(0)]
+*/
+main() {
+  var c = new Class();
+  c = new Subclass();
+  c = new Subtype();
+  c.method1();
+}
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index c5a6cb9..e59b077 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_test.dart
@@ -12,6 +12,7 @@
 import 'package:compiler/src/universe/feature.dart';
 import 'package:compiler/src/universe/use.dart';
 import 'package:compiler/src/universe/world_impact.dart';
+import 'package:compiler/src/util/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -20,7 +21,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const ImpactDataComputer(),
-        args: args, testFrontend: true);
+        args: args, testOmit: false, testFrontend: true);
   });
 }
 
@@ -32,12 +33,12 @@
   static const String runtimeTypeUse = 'runtimeType';
 }
 
-class ImpactDataComputer extends DataComputer {
+class ImpactDataComputer extends DataComputer<Features> {
   const ImpactDataComputer();
 
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<Features>> actualMap,
       {bool verbose: false}) {
     KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
     WorldImpact impact = compiler.impactCache[member];
@@ -71,7 +72,11 @@
       }
     }
     Id id = computeEntityId(node);
-    actualMap[id] = new ActualData(new IdValue(id, features.getText()),
-        computeSourceSpanFromTreeNode(node), member);
+    actualMap[id] = new ActualData<Features>(
+        id, features, computeSourceSpanFromTreeNode(node), member);
   }
+
+  @override
+  DataInterpreter<Features> get dataValidator =>
+      const FeaturesDataInterpreter();
 }
diff --git a/tests/compiler/dart2js/inference/callers_test.dart b/tests/compiler/dart2js/inference/callers_test.dart
index 8209b14..5a6a719 100644
--- a/tests/compiler/dart2js/inference/callers_test.dart
+++ b/tests/compiler/dart2js/inference/callers_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/type_graph_inferrer.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -25,12 +25,12 @@
   });
 }
 
-class CallersDataComputer extends DataComputer {
+class CallersDataComputer extends DataComputer<String> {
   const CallersDataComputer();
 
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -43,16 +43,23 @@
             closedWorld.closureDataLookup)
         .run(definition.node);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
 /// AST visitor for computing side effects data for a member.
-class CallersIrComputer extends IrDataExtractor {
+class CallersIrComputer extends IrDataExtractor<String> {
   final TypeGraphInferrer inferrer;
   final JsToElementMap _elementMap;
   final ClosureData _closureDataLookup;
 
-  CallersIrComputer(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
-      this._elementMap, this.inferrer, this._closureDataLookup)
+  CallersIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap,
+      this._elementMap,
+      this.inferrer,
+      this._closureDataLookup)
       : super(reporter, actualMap);
 
   String getMemberValue(MemberEntity member) {
diff --git a/tests/compiler/dart2js/inference/data/await.dart b/tests/compiler/dart2js/inference/data/await.dart
index 0461584..de21806 100644
--- a/tests/compiler/dart2js/inference/data/await.dart
+++ b/tests/compiler/dart2js/inference/data/await.dart
@@ -16,10 +16,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _method1:[null]*/
-_method1(
-
-    /*strong.[null|subclass=JSInt]*/
-    o) {}
+_method1(/*[null|subclass=JSInt]*/ o) {}
 
 /*element: awaitOfFuture:[exact=_Future]*/
 awaitOfFuture() async {
@@ -33,10 +30,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _method2:[null]*/
-_method2(
-
-    /*strong.[null|subclass=JSInt]*/
-    o) {}
+_method2(/*[null|subclass=JSInt]*/ o) {}
 
 /*element: awaitOfInt:[exact=_Future]*/
 awaitOfInt() async {
@@ -50,13 +44,11 @@
 
 /*element: _method3:[null]*/
 _method3(
-    /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/ o) {}
+    /*Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 1)*/
+    o) {}
 
 /*element: _method4:[null]*/
-_method4(
-
-    /*strong.[null|subclass=JSInt]*/
-    o) {}
+_method4(/*[null|subclass=JSInt]*/ o) {}
 
 /*element: awaitForOfStream:[exact=_Future]*/
 awaitForOfStream() async {
diff --git a/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart b/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart
index 64aa174..a70e567 100644
--- a/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart
+++ b/tests/compiler/dart2js/inference/data/call_method_function_typed_value.dart
@@ -6,8 +6,13 @@
 
 import "package:expect/expect.dart";
 
-/*strong.element: f:[subclass=JSInt]*/
-int f(int /*[null|subclass=Object]*/ i) => 2 /*invoke: [exact=JSUInt31]*/ * i;
+/*element: f:[subclass=JSInt]*/
+int f(
+        int
+            /*strong.[null|subclass=Object]*/
+            /*omit.[null|subclass=JSInt]*/
+            i) =>
+    2 /*invoke: [exact=JSUInt31]*/ * i;
 
 typedef int IntToInt(int x);
 
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer.dart b/tests/compiler/dart2js/inference/data/closure_tracer.dart
index f1dfbb1..d419c89 100644
--- a/tests/compiler/dart2js/inference/data/closure_tracer.dart
+++ b/tests/compiler/dart2js/inference/data/closure_tracer.dart
@@ -53,8 +53,8 @@
 testStoredInMapOfList() {
   var res;
   /*[null|subclass=Object]*/ closure(/*[null|subclass=Object]*/ a) => res = a;
-  dynamic a = [closure];
-  dynamic b = {'foo': 1};
+  dynamic a = <dynamic>[closure];
+  dynamic b = <dynamic, dynamic>{'foo': 1};
 
   b
       /*update: Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSUInt31], [null|exact=JSExtendableArray]), map: {foo: [exact=JSUInt31], bar: Container([null|exact=JSExtendableArray], element: [null|subclass=Object], length: null)})*/
@@ -73,8 +73,8 @@
 testStoredInListOfList() {
   var res;
   /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
-  dynamic a = [closure];
-  dynamic b = [0, 1, 2];
+  dynamic a = <dynamic>[closure];
+  dynamic b = <dynamic>[0, 1, 2];
 
   b
       /*update: Container([exact=JSExtendableArray], element: Union([exact=JSExtendableArray], [exact=JSUInt31]), length: 3)*/
@@ -92,8 +92,8 @@
 testStoredInListOfListUsingInsert() {
   var res;
   /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
-  dynamic a = [closure];
-  dynamic b = [0, 1, 2];
+  dynamic a = <dynamic>[closure];
+  dynamic b = <dynamic>[0, 1, 2];
 
   b
       .
@@ -111,8 +111,8 @@
 testStoredInListOfListUsingAdd() {
   var res;
   /*[exact=JSUInt31]*/ closure(/*[exact=JSUInt31]*/ a) => res = a;
-  dynamic a = [closure];
-  dynamic b = [0, 1, 2];
+  dynamic a = <dynamic>[closure];
+  dynamic b = <dynamic>[0, 1, 2];
 
   b
       .
diff --git a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
index f948462..7f88ade 100644
--- a/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
+++ b/tests/compiler/dart2js/inference/data/closure_tracer_28919.dart
@@ -54,9 +54,12 @@
       i /*invoke: [subclass=JSPositiveInt]*/ != 3;
       i /*invoke: [subclass=JSPositiveInt]*/ ++) {
     methods. /*invoke: [exact=JSExtendableArray]*/ add(
-        /*[null]*/ (int /*[null|subclass=Object]*/ x) {
+        /*[null]*/ (int
+            /*strong.[null|subclass=Object]*/
+            /*omit.[null|subclass=JSInt]*/
+            x) {
       res = x;
-      sum = x /*strong.invoke: [null|subclass=JSInt]*/ + i;
+      sum = x /*invoke: [null|subclass=JSInt]*/ + i;
     });
   }
   methods /*[exact=JSExtendableArray]*/ [0](499);
@@ -64,10 +67,10 @@
   probe2methods(methods);
 }
 
-/*strong.element: probe2res:[null|subclass=JSInt]*/
+/*element: probe2res:[null|subclass=JSInt]*/
 probe2res(
 
-        /*strong.[null|subclass=JSInt]*/
+        /*[null|subclass=JSInt]*/
         x) =>
     x;
 
diff --git a/tests/compiler/dart2js/inference/data/closurization_instance_call.dart b/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
index 43e20c2..f46b1a5 100644
--- a/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_instance_call.dart
@@ -26,21 +26,9 @@
   var c = new Class();
   c.call(); // Make `Class.call` live.
   var local = c. /*[exact=Class]*/ method;
-  local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  local. /*invoke: [subclass=Closure]*/ toString();
   local();
-  local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  local. /*invoke: [subclass=Closure]*/ toString();
   local.call();
-  return local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  return local. /*invoke: [subclass=Closure]*/ toString();
 }
diff --git a/tests/compiler/dart2js/inference/data/closurization_local_call.dart b/tests/compiler/dart2js/inference/data/closurization_local_call.dart
index 9de0340..65dd652 100644
--- a/tests/compiler/dart2js/inference/data/closurization_local_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_local_call.dart
@@ -23,21 +23,9 @@
   var c = new Class();
   c.call(); // Make `Class.call` live.
   var local = /*[exact=JSUInt31]*/ () => 42;
-  local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  local. /*invoke: [subclass=Closure]*/ toString();
   local();
-  local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  local. /*invoke: [subclass=Closure]*/ toString();
   local.call();
-  return local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  return local. /*invoke: [subclass=Closure]*/ toString();
 }
diff --git a/tests/compiler/dart2js/inference/data/closurization_static.dart b/tests/compiler/dart2js/inference/data/closurization_static.dart
index 5ddf338..0da0999 100644
--- a/tests/compiler/dart2js/inference/data/closurization_static.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_static.dart
@@ -19,11 +19,7 @@
   var local = method;
   local. /*invoke: [subclass=Closure]*/ toString();
   local();
-  local
-      . /*invoke: [subclass=Closure]*/
-      toString();
+  local. /*invoke: [subclass=Closure]*/ toString();
   local.call();
-  return local
-      . /*invoke: [subclass=Closure]*/
-      toString();
+  return local. /*invoke: [subclass=Closure]*/ toString();
 }
diff --git a/tests/compiler/dart2js/inference/data/closurization_static_call.dart b/tests/compiler/dart2js/inference/data/closurization_static_call.dart
index 4f5ac7d..c45fd9f 100644
--- a/tests/compiler/dart2js/inference/data/closurization_static_call.dart
+++ b/tests/compiler/dart2js/inference/data/closurization_static_call.dart
@@ -26,21 +26,9 @@
   var c = new Class();
   c.call(); // Make `Class.call` live.
   var local = method;
-  local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  local. /*invoke: [subclass=Closure]*/ toString();
   local();
-  local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  local. /*invoke: [subclass=Closure]*/ toString();
   local.call();
-  return local
-      .
-
-      /*strong.invoke: [subclass=Closure]*/
-      toString();
+  return local. /*invoke: [subclass=Closure]*/ toString();
 }
diff --git a/tests/compiler/dart2js/inference/data/deferred_load_get.dart b/tests/compiler/dart2js/inference/data/deferred_load_get.dart
index cbe93e3..e27bf13 100644
--- a/tests/compiler/dart2js/inference/data/deferred_load_get.dart
+++ b/tests/compiler/dart2js/inference/data/deferred_load_get.dart
@@ -6,7 +6,7 @@
 
 // Synthetic getter added by kernel.
 
-/*strong.element: __loadLibrary_expect:[null|exact=_Future]*/
+/*element: __loadLibrary_expect:[null|exact=_Future]*/
 
 /*element: main:[null]*/
 main() {
diff --git a/tests/compiler/dart2js/inference/data/field_type.dart b/tests/compiler/dart2js/inference/data/field_type.dart
index ed69820..8e2e9c04 100644
--- a/tests/compiler/dart2js/inference/data/field_type.dart
+++ b/tests/compiler/dart2js/inference/data/field_type.dart
@@ -352,7 +352,7 @@
   // TODO(johnniwinther): Investigate why these include `null`. The ast version
   // didn't.
 
-  /*strong.element: A16.f16:Union([exact=JSString], [null|exact=JSUInt31])*/
+  /*element: A16.f16:Union([exact=JSString], [null|exact=JSUInt31])*/
   var f16;
 
   /*element: A16.:[exact=A16]*/
@@ -608,11 +608,7 @@
             bar24();
 
   /*element: A24.+:Value([exact=JSString], value: "foo")*/
-  operator +(
-
-          /*strong.[empty]*/
-          other) =>
-      'foo';
+  operator +(/*[empty]*/ other) => 'foo';
 
   /*element: A24.bar24:[exact=JSDouble]*/
   bar24() => 42.5;
diff --git a/tests/compiler/dart2js/inference/data/finalized_type_variable.dart b/tests/compiler/dart2js/inference/data/finalized_type_variable.dart
new file mode 100644
index 0000000..197852a
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/finalized_type_variable.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: AppView.:[subclass=AppView]*/
+abstract class AppView<T> {
+  /*element: AppView.ctx:Union([exact=CardComponent2], [null|exact=CardComponent])*/
+  T ctx;
+}
+
+/*element: CardComponent.:[exact=CardComponent]*/
+class CardComponent {
+  /*element: CardComponent.title:Value([null|exact=JSString], value: "foo")*/
+  String title;
+}
+
+/*element: ViewCardComponent.:[exact=ViewCardComponent]*/
+class ViewCardComponent extends AppView<CardComponent> {
+  /*element: ViewCardComponent._title:Value([null|exact=JSString], value: "foo")*/
+  var _title;
+
+  @pragma('dart2js:noInline')
+  set ng_title(String /*Value([exact=JSString], value: "foo")*/ value) {
+    if (/*invoke: [exact=ViewCardComponent]*/ checkBinding(
+        /*[exact=ViewCardComponent]*/ _title,
+        value)) {
+      /*[exact=ViewCardComponent]*/ ctx
+          . /*update: [null|exact=CardComponent]*/ title = value;
+      /*update: [exact=ViewCardComponent]*/ _title = value;
+    }
+  }
+
+  /*element: ViewCardComponent.checkBinding:Value([exact=JSBool], value: true)*/
+  checkBinding(
+          /*Value([null|exact=JSString], value: "foo")*/ a,
+          /*Value([exact=JSString], value: "foo")*/ b) =>
+      true;
+}
+
+/*element: CardComponent2.:[exact=CardComponent2]*/
+class CardComponent2 {
+  /*element: CardComponent2.title:Value([null|exact=JSString], value: "bar")*/
+  String title;
+}
+
+/*element: ViewCardComponent2.:[exact=ViewCardComponent2]*/
+class ViewCardComponent2 extends AppView<CardComponent2> {
+  /*element: ViewCardComponent2._title:Value([null|exact=JSString], value: "bar")*/
+  var _title;
+
+  @pragma('dart2js:noInline')
+  set ng_title(String /*Value([exact=JSString], value: "bar")*/ value) {
+    if (/*invoke: [exact=ViewCardComponent2]*/ checkBinding(
+        /*[exact=ViewCardComponent2]*/ _title,
+        value)) {
+      /*[exact=ViewCardComponent2]*/ ctx
+          . /*update: [null|exact=CardComponent2]*/ title = value;
+      /*update: [exact=ViewCardComponent2]*/ _title = value;
+    }
+  }
+
+  /*element: ViewCardComponent2.checkBinding:Value([exact=JSBool], value: true)*/
+  checkBinding(
+          /*Value([null|exact=JSString], value: "bar")*/ a,
+          /*Value([exact=JSString], value: "bar")*/ b) =>
+      true;
+}
+
+/*element: main:[null]*/
+main() {
+  var c1 = new ViewCardComponent();
+  c1. /*update: [exact=ViewCardComponent]*/ ctx = new CardComponent();
+  c1. /*update: [exact=ViewCardComponent]*/ ng_title = 'foo';
+  var c2 = new ViewCardComponent2();
+  c2. /*update: [exact=ViewCardComponent2]*/ ctx = new CardComponent2();
+  c2. /*update: [exact=ViewCardComponent2]*/ ng_title = 'bar';
+}
diff --git a/tests/compiler/dart2js/inference/data/for_in.dart b/tests/compiler/dart2js/inference/data/for_in.dart
index 9db65d4..231c016 100644
--- a/tests/compiler/dart2js/inference/data/for_in.dart
+++ b/tests/compiler/dart2js/inference/data/for_in.dart
@@ -32,7 +32,7 @@
 // Return element from a for-in loop on a list literal.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*strong.element: forInReturn:[null|subclass=JSInt]*/
+/*element: forInReturn:[null|subclass=JSInt]*/
 forInReturn() {
   /*iterator: Container([exact=JSExtendableArray], element: [exact=JSUInt31], length: 3)*/
   /*current: [exact=ArrayIterator]*/
@@ -78,7 +78,7 @@
   for (var a in [1, 2, 3]) {
     // TODO(johnniwinther): We should know the type of [a] here. Even if [a] has
     // type `dynamic`.
-    a. /*strong.[null|subclass=JSInt]*/ isEven;
+    a. /*[null|subclass=JSInt]*/ isEven;
     a. /*[subclass=JSInt]*/ isEven;
     return a;
   }
diff --git a/tests/compiler/dart2js/inference/data/general.dart b/tests/compiler/dart2js/inference/data/general.dart
index afe68f0..f4e11b1 100644
--- a/tests/compiler/dart2js/inference/data/general.dart
+++ b/tests/compiler/dart2js/inference/data/general.dart
@@ -260,7 +260,7 @@
   return 42;
 }
 
-/*element: testIsCheck20:Union([exact=JSString], [exact=JSUInt31])*/
+/*element: testIsCheck20:[exact=JSUInt31]*/
 testIsCheck20() {
   var c = topLevelGetter();
   if (c != null && c is! bool && c is! int) {
@@ -272,7 +272,7 @@
   }
 }
 
-/*element: testIsCheck21:[null|subclass=Object]*/
+/*element: testIsCheck21:Union([subclass=JSArray], [subclass=JSInt])*/
 testIsCheck21(/*[null|subclass=Object]*/ a) {
   if (a is int || a is List) {
     return a;
@@ -281,7 +281,7 @@
   }
 }
 
-/*element: testIsCheck22:[null|subclass=Object]*/
+/*element: testIsCheck22:Union([subclass=JSArray], [subclass=JSInt])*/
 testIsCheck22(/*[null|subclass=Object]*/ a) {
   return (a is int || a is List) ? a : 42;
 }
@@ -594,7 +594,7 @@
   // Make [a] a captured variable. This should disable receiver
   // specialization on [a].
   (
-      /*strong.[null|exact=JSString]*/
+      /*[null|exact=JSString]*/
       () => a.toString())();
   a - 42;
   return a;
@@ -674,7 +674,7 @@
   /*element: A.generative:[exact=A]*/
   A.generative();
 
-  /*strong.element: A.==:[exact=JSBool]*/
+  /*element: A.==:[exact=JSBool]*/
   operator ==(/*Union([exact=JSString], [exact=JSUInt31])*/ other) =>
       42 as dynamic;
 
diff --git a/tests/compiler/dart2js/inference/data/js_interop.dart b/tests/compiler/dart2js/inference/data/js_interop.dart
index 34767e1..e55c5dfe 100644
--- a/tests/compiler/dart2js/inference/data/js_interop.dart
+++ b/tests/compiler/dart2js/inference/data/js_interop.dart
@@ -21,7 +21,7 @@
       {/*[exact=JSUInt31]*/ a, /*Value([exact=JSString], value: "")*/ b});
 }
 
-/*strong.element: anonymousClass:[null|subclass=JavaScriptObject]*/
+/*element: anonymousClass:[null|subclass=JavaScriptObject]*/
 anonymousClass() => new Class1(a: 1, b: '');
 
 @JS()
diff --git a/tests/compiler/dart2js/inference/data/local_functions.dart b/tests/compiler/dart2js/inference/data/local_functions.dart
index 478faf2..6570789 100644
--- a/tests/compiler/dart2js/inference/data/local_functions.dart
+++ b/tests/compiler/dart2js/inference/data/local_functions.dart
@@ -31,7 +31,7 @@
 // Invocation of an unnamed local function.
 ////////////////////////////////////////////////////////////////////////////////
 
-/*element: unnamedLocalFunctionInvoke:[null|subclass=Object]*/
+/*element: unnamedLocalFunctionInvoke:[null|subclass=JSInt]*/
 unnamedLocalFunctionInvoke() {
   var local = /*[exact=JSUInt31]*/ () => 0;
   return local();
@@ -62,6 +62,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: namedLocalFunctionInvokeMissingArgument:[null|subclass=Object]*/
+@pragma('dart2js:disableFinal')
 namedLocalFunctionInvokeMissingArgument() {
   /*[exact=JSUInt31]*/ local(/*[empty]*/ x) => 0;
   dynamic b = local;
@@ -73,6 +74,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: namedLocalFunctionInvokeExtraArgument:[null|subclass=Object]*/
+@pragma('dart2js:disableFinal')
 namedLocalFunctionInvokeExtraArgument() {
   /*[exact=JSUInt31]*/ local() => 0;
   dynamic b = local;
@@ -84,6 +86,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: namedLocalFunctionInvokeExtraNamedArgument:[null|subclass=Object]*/
+@pragma('dart2js:disableFinal')
 namedLocalFunctionInvokeExtraNamedArgument() {
   /*[exact=JSUInt31]*/ local() => 0;
   dynamic b = local;
@@ -118,7 +121,7 @@
 
 /*element: _callCompare:[subclass=Closure]*/
 _callCompare(int /*[subclass=Closure]*/ compare({a, b})) {
-  compare(a: 0, b: 1) == 0;
+  compare(a: 0, b: 1) /*invoke: [null|subclass=JSInt]*/ == 0;
   return compare;
 }
 
diff --git a/tests/compiler/dart2js/inference/data/locals_notrust.dart b/tests/compiler/dart2js/inference/data/locals_notrust.dart
deleted file mode 100644
index 35f518a..0000000
--- a/tests/compiler/dart2js/inference/data/locals_notrust.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/*element: main:[null]*/
-main() {
-  dontTrustLocals();
-  dontTrustFunctions();
-  inferFromFunctions();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Test that we don't trust the explicit type of a local, unless we are in
-// strong mode.
-////////////////////////////////////////////////////////////////////////////////
-
-/*element: _dontTrustLocals:[exact=JSBool]*/ _dontTrustLocals(
-    int Function(int) /*[null|subclass=Closure]*/ f) {
-  int c = f(0);
-  return c /*strong.invoke: [null|subclass=JSInt]*/ == 0;
-}
-
-/*element: dontTrustLocals:[null]*/
-dontTrustLocals() {
-  _dontTrustLocals(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
-  _dontTrustLocals(null);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Test that we don't infer the type of a dynamic local from the type of the
-// function.
-////////////////////////////////////////////////////////////////////////////////
-
-// TODO(johnniwinther): Trust the function type in strong mode.
-/*element: _dontTrustFunctions:[exact=JSBool]*/
-_dontTrustFunctions(int Function(int) /*[null|subclass=Closure]*/ f) {
-  dynamic c = f(0);
-  return c == 0;
-}
-
-/*element: dontTrustFunctions:[null]*/
-dontTrustFunctions() {
-  _dontTrustFunctions(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
-  _dontTrustFunctions(null);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Test that we don't infer the type of a 'var' local from the type of the
-// function, unless we are in strong mode.
-////////////////////////////////////////////////////////////////////////////////
-
-/*element: _inferFromFunctions:[exact=JSBool]*/
-_inferFromFunctions(int Function(int) /*[null|subclass=Closure]*/ f) {
-  var c = f(0);
-  return c /*strong.invoke: [null|subclass=JSInt]*/ == 0;
-}
-
-/*element: inferFromFunctions:[null]*/
-inferFromFunctions() {
-  _inferFromFunctions(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
-  _inferFromFunctions(null);
-}
diff --git a/tests/compiler/dart2js/inference/data/locals_trust.dart b/tests/compiler/dart2js/inference/data/locals_trust.dart
index c179e96..e57e350 100644
--- a/tests/compiler/dart2js/inference/data/locals_trust.dart
+++ b/tests/compiler/dart2js/inference/data/locals_trust.dart
@@ -5,12 +5,12 @@
 /*element: main:[null]*/
 main() {
   trustLocals();
-  dontTrustFunctions();
+  trustFunctions();
+  inferFromFunctions();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// Test that we trust the explicit type of a local with
-// --trust-type-annotations or --omit-implicit-checks.
+// Test that we trust the explicit type of a local.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _trustLocals:[exact=JSBool]*/ _trustLocals(
@@ -26,19 +26,34 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// Test that we don't trust the type of a function even with
-// --trust-type-annotations or --omit-implicit-checks.
+// Test that we infer the type of a dynamic local from the type of the function.
 ////////////////////////////////////////////////////////////////////////////////
 
-// TODO(johnniwinther): Trust the function type in strong mode.
-/*element: _dontTrustFunctions:[exact=JSBool]*/
-_dontTrustFunctions(int Function(int) /*[null|subclass=Closure]*/ f) {
+/*element: _trustFunctions:[exact=JSBool]*/
+_trustFunctions(int Function(int) /*[null|subclass=Closure]*/ f) {
   dynamic c = f(0);
-  return c == 0;
+  c = f(0);
+  return c /*invoke: [null|subclass=JSInt]*/ == 0;
 }
 
-/*element: dontTrustFunctions:[null]*/
-dontTrustFunctions() {
-  _dontTrustFunctions(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
-  _dontTrustFunctions(null);
+/*element: trustFunctions:[null]*/
+trustFunctions() {
+  _trustFunctions(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
+  _trustFunctions(null);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Test that we infer the type of a 'var' local from the type of the function.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _inferFromFunctions:[exact=JSBool]*/
+_inferFromFunctions(int Function(int) /*[null|subclass=Closure]*/ f) {
+  var c = f(0);
+  return c /*invoke: [null|subclass=JSInt]*/ == 0;
+}
+
+/*element: inferFromFunctions:[null]*/
+inferFromFunctions() {
+  _inferFromFunctions(/*[exact=JSUInt31]*/ (/*[exact=JSUInt31]*/ o) => o);
+  _inferFromFunctions(null);
 }
diff --git a/tests/compiler/dart2js/inference/data/logical_if.dart b/tests/compiler/dart2js/inference/data/logical_if.dart
index 596907a..a950eb5 100644
--- a/tests/compiler/dart2js/inference/data/logical_if.dart
+++ b/tests/compiler/dart2js/inference/data/logical_if.dart
@@ -226,7 +226,7 @@
   if (o is! Class9 || c) {
     o. /*invoke: Union([exact=Class9], [exact=JSUInt31])*/ toString();
   } else {
-    o. /*invoke: Union([exact=Class9], [exact=JSUInt31])*/ toString();
+    o. /*invoke: [exact=Class9]*/ toString();
   }
 }
 
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_const.dart b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
index b434740..ab50dff 100644
--- a/tests/compiler/dart2js/inference/data/map_tracer_const.dart
+++ b/tests/compiler/dart2js/inference/data/map_tracer_const.dart
@@ -2,8 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/*strong.element: closure:[exact=JSUInt31]*/
-int closure(int /*Union([exact=JSDouble], [exact=JSUInt31])*/ x) {
+/*element: closure:[exact=JSUInt31]*/
+int closure(
+    int
+        /*strong.Union([exact=JSDouble], [exact=JSUInt31])*/
+        /*omit.[exact=JSUInt31]*/
+        x) {
   return x;
 }
 
diff --git a/tests/compiler/dart2js/inference/data/map_tracer_keys.dart b/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
index 994c879..af96537 100644
--- a/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
+++ b/tests/compiler/dart2js/inference/data/map_tracer_keys.dart
@@ -87,7 +87,7 @@
 
 /*element: test3:[null]*/
 test3() {
-  dynamic theMap = {'a': 2.2, 'b': 3.3, 'c': 4.4};
+  dynamic theMap = <dynamic, dynamic>{'a': 2.2, 'b': 3.3, 'c': 4.4};
   theMap
       /*update: Dictionary([subclass=JsLinkedHashMap], key: [exact=JSString], value: Union([exact=JSDouble], [null|exact=JSExtendableArray]), map: {a: [exact=JSDouble], b: [exact=JSDouble], c: [exact=JSDouble], d: Container([null|exact=JSExtendableArray], element: [null|subclass=Object], length: null)})*/
       ['d'] = aList3;
diff --git a/tests/compiler/dart2js/inference/data/no_such_method.dart b/tests/compiler/dart2js/inference/data/no_such_method.dart
index 09cce06..16f5358 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method.dart
@@ -13,7 +13,12 @@
 /*element: Class1.:[exact=Class1]*/
 class Class1 {
   /*element: Class1.noSuchMethod:[exact=JSUInt31]*/
-  noSuchMethod(/*[null|subclass=Object]*/ _) => 42;
+  noSuchMethod(
+          Invocation
+              /*strong.[null|subclass=Object]*/
+              /*omit.[null|exact=JSInvocationMirror]*/
+              _) =>
+      42;
 
   /*element: Class1.method:[exact=JSUInt31]*/
   method() {
@@ -32,7 +37,12 @@
 /*element: Class2.:[exact=Class2]*/
 class Class2 {
   /*element: Class2.noSuchMethod:[exact=JSUInt31]*/
-  noSuchMethod(/*[null|subclass=Object]*/ _) => 42;
+  noSuchMethod(
+          Invocation
+              /*strong.[null|subclass=Object]*/
+              /*omit.[null|exact=JSInvocationMirror]*/
+              _) =>
+      42;
 
   /*element: Class2.method:[exact=JSUInt31]*/
   method() {
@@ -51,13 +61,17 @@
 /*element: Class3.:[exact=Class3]*/
 class Class3 {
   /*element: Class3.noSuchMethod:[null|subclass=Object]*/
-  noSuchMethod(Invocation /*[null|subclass=Object]*/ invocation) {
+  noSuchMethod(
+      Invocation
+          /*strong.[null|subclass=Object]*/
+          /*omit.[null|exact=JSInvocationMirror]*/
+          invocation) {
     return invocation
         .
-        /*strong.[null|exact=JSInvocationMirror]*/
+        /*[null|exact=JSInvocationMirror]*/
         positionalArguments
         .
-        /*strong.[exact=JSUnmodifiableArray]*/
+        /*[exact=JSUnmodifiableArray]*/
         first;
   }
 
@@ -83,13 +97,17 @@
   var field;
 
   /*element: Class4.noSuchMethod:[null]*/
-  noSuchMethod(Invocation /*[null|subclass=Object]*/ invocation) {
+  noSuchMethod(
+      Invocation
+          /*strong.[null|subclass=Object]*/
+          /*omit.[null|exact=JSInvocationMirror]*/
+          invocation) {
     this. /*update: [exact=Class4]*/ field = invocation
         .
-        /*strong.[null|exact=JSInvocationMirror]*/
+        /*[null|exact=JSInvocationMirror]*/
         positionalArguments
         .
-        /*strong.[exact=JSUnmodifiableArray]*/
+        /*[exact=JSUnmodifiableArray]*/
         first;
     return null;
   }
diff --git a/tests/compiler/dart2js/inference/data/no_such_method1.dart b/tests/compiler/dart2js/inference/data/no_such_method1.dart
index 146ea37..2e9aadb 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method1.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method1.dart
@@ -5,13 +5,17 @@
 /*element: A.:[exact=A]*/
 class A {
   /*element: A.noSuchMethod:[exact=JSUInt31]*/
-  noSuchMethod(/*[null|subclass=Object]*/ im) => 42;
+  noSuchMethod(
+          /*strong.[null|subclass=Object]*/
+          /*omit.[null|exact=JSInvocationMirror]*/
+          im) =>
+      42;
 }
 
 /*element: B.:[exact=B]*/
 class B extends A {
-  /*strong.element: B.foo:[exact=JSUInt31]*/
-  /*strong.invoke: [subclass=B]*/ foo();
+  /*element: B.foo:[exact=JSUInt31]*/
+  /*invoke: [subclass=B]*/ foo();
 }
 
 /*element: C.:[exact=C]*/
diff --git a/tests/compiler/dart2js/inference/data/no_such_method2.dart b/tests/compiler/dart2js/inference/data/no_such_method2.dart
index 0d0eb8f..2f0741b 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method2.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method2.dart
@@ -5,7 +5,11 @@
 /*element: A.:[subclass=B]*/
 abstract class A {
   /*element: A.noSuchMethod:[exact=JSUInt31]*/
-  noSuchMethod(/*[null|subclass=Object]*/ im) => 42;
+  noSuchMethod(
+          /*strong.[null|subclass=Object]*/
+          /*omit.[null|exact=JSInvocationMirror]*/
+          im) =>
+      42;
 }
 
 /*element: B.:[exact=B]*/
@@ -26,7 +30,11 @@
   foo() => {};
 
   /*element: D.noSuchMethod:[exact=JSDouble]*/
-  noSuchMethod(/*[null|subclass=Object]*/ im) => 42.5;
+  noSuchMethod(
+          /*strong.[null|subclass=Object]*/
+          /*omit.[null|exact=JSInvocationMirror]*/
+          im) =>
+      42.5;
 }
 
 /*element: a:Union([exact=D], [null|subclass=B])*/
diff --git a/tests/compiler/dart2js/inference/data/no_such_method3.dart b/tests/compiler/dart2js/inference/data/no_such_method3.dart
index ed6a5f7..c89382c 100644
--- a/tests/compiler/dart2js/inference/data/no_such_method3.dart
+++ b/tests/compiler/dart2js/inference/data/no_such_method3.dart
@@ -7,7 +7,11 @@
   // We may ignore this for type inference because syntactically it always
   // throws an exception.
   /*element: A.noSuchMethod:[empty]*/
-  noSuchMethod(/*[null|subclass=Object]*/ im) => throw 'foo';
+  noSuchMethod(
+          /*strong.[null|subclass=Object]*/
+          /*omit.[null|exact=JSInvocationMirror]*/
+          im) =>
+      throw 'foo';
 }
 
 /*element: B.:[exact=B]*/
diff --git a/tests/compiler/dart2js/inference/data/null.dart b/tests/compiler/dart2js/inference/data/null.dart
new file mode 100644
index 0000000..0a220f0
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/null.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*element: main:[null]*/
+main() {
+  ifThenNullCheck(0);
+  ifThenNullCheck(null);
+  ifThenElseNullCheck(0);
+  ifThenElseNullCheck(null);
+  ifNotThenNullCheck(0);
+  ifNotThenNullCheck(null);
+  ifNotThenElseNullCheck(0);
+  ifNotThenElseNullCheck(null);
+  ifThenNotNullComplexCheck(0, 0);
+  ifThenNotNullComplexCheck(null, null);
+  ifThenElseNotNullComplexCheck(0, 0);
+  ifThenElseNotNullComplexCheck(null, null);
+  ifThenNotNullGradualCheck1(0, 0);
+  ifThenNotNullGradualCheck1(null, 0);
+  ifThenNotNullGradualCheck2(0, 0);
+  ifThenNotNullGradualCheck2(null, 0);
+}
+
+/*element: ifThenNullCheck:[exact=JSUInt31]*/
+ifThenNullCheck(int /*[null|exact=JSUInt31]*/ value) {
+  if (value == null) {
+    return 0;
+  }
+  return value;
+}
+
+/*element: ifThenElseNullCheck:[exact=JSUInt31]*/
+ifThenElseNullCheck(int /*[null|exact=JSUInt31]*/ value) {
+  if (value == null) {
+    return 0;
+  } else {
+    return value;
+  }
+}
+
+/*element: ifNotThenNullCheck:[exact=JSUInt31]*/
+ifNotThenNullCheck(int /*[null|exact=JSUInt31]*/ value) {
+  if (value != null) {
+    return value;
+  }
+  return 0;
+}
+
+/*element: ifNotThenElseNullCheck:[exact=JSUInt31]*/
+ifNotThenElseNullCheck(int /*[null|exact=JSUInt31]*/ value) {
+  if (value != null) {
+    return value;
+  } else {
+    return 0;
+  }
+}
+
+/*element: ifThenNotNullComplexCheck:[exact=JSUInt31]*/
+ifThenNotNullComplexCheck(
+    int /*[null|exact=JSUInt31]*/ a, int /*[null|exact=JSUInt31]*/ b) {
+  if (a != null && a /*invoke: [exact=JSUInt31]*/ != b) {
+    return a;
+  }
+  return 0;
+}
+
+/*element: ifThenElseNotNullComplexCheck:[null|exact=JSUInt31]*/
+ifThenElseNotNullComplexCheck(
+    int /*[null|exact=JSUInt31]*/ a, int /*[null|exact=JSUInt31]*/ b) {
+  if (a != null && a /*invoke: [exact=JSUInt31]*/ != b) {
+    return a;
+  }
+  return a;
+}
+
+/*element: ifThenNotNullGradualCheck1:[exact=JSUInt31]*/
+ifThenNotNullGradualCheck1(
+    int /*[null|exact=JSUInt31]*/ a, int /*[exact=JSUInt31]*/ b) {
+  if (a /*invoke: [null|exact=JSUInt31]*/ != b) {
+    if (a != null) {
+      return a;
+    }
+  }
+  return 0;
+}
+
+/*element: ifThenNotNullGradualCheck2:[exact=JSUInt31]*/
+ifThenNotNullGradualCheck2(
+    int /*[null|exact=JSUInt31]*/ a, int /*[exact=JSUInt31]*/ b) {
+  if (a != null) {
+    if (a /*invoke: [exact=JSUInt31]*/ != b) {
+      return a;
+    }
+  }
+  return 0;
+}
diff --git a/tests/compiler/dart2js/inference/data/optimizer_hints.dart b/tests/compiler/dart2js/inference/data/optimizer_hints.dart
index 85c19bd..4346d19 100644
--- a/tests/compiler/dart2js/inference/data/optimizer_hints.dart
+++ b/tests/compiler/dart2js/inference/data/optimizer_hints.dart
@@ -9,9 +9,7 @@
   assumeDynamic();
   notAssumeDynamic();
   trustReturnTypeString();
-  notTrustReturnTypeString();
   trustParameterTypeString();
-  notTrustParameterTypeString();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -44,49 +42,22 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// Use annotation to trust return type annotation.
+// No annotation is needed to trust return type annotation.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: trustReturnTypeString:[null|exact=JSString]*/
-@TrustTypeAnnotations()
 String trustReturnTypeString() {
   return _assumeDynamic(0);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// As above but without the annotation.
-////////////////////////////////////////////////////////////////////////////////
-
-/*strong.element: notTrustReturnTypeString:[null|exact=JSString]*/
-String notTrustReturnTypeString() {
-  return _assumeDynamic(0);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Use annotation to trust parameter type annotation.
+// No annotation is needed to trust parameter type annotation.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _trustParameterTypeString:[null]*/
-@TrustTypeAnnotations()
 _trustParameterTypeString(String /*[null|exact=JSString]*/ o) {}
 
 /*element: trustParameterTypeString:[null]*/
 trustParameterTypeString() {
   _trustParameterTypeString(_assumeDynamic(0));
 }
-
-////////////////////////////////////////////////////////////////////////////////
-// As above but without the annotation.
-////////////////////////////////////////////////////////////////////////////////
-
-/*element: _notTrustParameterTypeString:[null]*/
-_notTrustParameterTypeString(
-    String
-
-        /*strong.[null|exact=JSString]*/
-        o) {}
-
-/*element: notTrustParameterTypeString:[null]*/
-notTrustParameterTypeString() {
-  _notTrustParameterTypeString(_assumeDynamic(0));
-}
diff --git a/tests/compiler/dart2js/inference/data/parameters_notrust.dart b/tests/compiler/dart2js/inference/data/parameters_notrust.dart
deleted file mode 100644
index 861df2d..0000000
--- a/tests/compiler/dart2js/inference/data/parameters_notrust.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-
-/*element: main:[null]*/
-main() {
-  dontTrustParameters();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Test that we don't trust the explicit type of a parameter, but do trust
-// the local type of parameters in Dart 2.
-//
-// This means that in both Dart 1 and Dart 2 we infer the parameter type to be
-// either an int or a String. In Dart 1 we don't trust the static type of the
-// parameter within the method, so the return type is inferred to be either an
-// int or a String. In Dart 2 we _do_ trust the static type of the parameter
-// within the method and therefore infer the return type to be an int.
-////////////////////////////////////////////////////////////////////////////////
-
-/*strong.element: _dontTrustParameters:[exact=JSUInt31]*/
-_dontTrustParameters(int /*Union([exact=JSString], [exact=JSUInt31])*/ i) {
-  return i;
-}
-
-/*element: dontTrustParameters:[null]*/
-dontTrustParameters() {
-  dynamic f = _dontTrustParameters;
-  Expect.equals(0, f(0));
-  Expect.throws(/*[null|subclass=Object]*/ () => f('foo'));
-}
diff --git a/tests/compiler/dart2js/inference/data/parameters_trust.dart b/tests/compiler/dart2js/inference/data/parameters_trust.dart
index 3b7ff13..fae5e390 100644
--- a/tests/compiler/dart2js/inference/data/parameters_trust.dart
+++ b/tests/compiler/dart2js/inference/data/parameters_trust.dart
@@ -10,12 +10,15 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// Test that we trust the explicit type of a parameter with
-// --trust-type-annotations or --omit-implicit-checks.
+// Test that we trust the explicit type of a parameter.
 ////////////////////////////////////////////////////////////////////////////////
 
 /*element: _trustParameters:[exact=JSUInt31]*/
-_trustParameters(int /*[exact=JSUInt31]*/ i) {
+_trustParameters(
+    int
+        /*strong.Union([exact=JSString], [exact=JSUInt31])*/
+        /*omit.[exact=JSUInt31]*/
+        i) {
   return i;
 }
 
diff --git a/tests/compiler/dart2js/inference/data/static.dart b/tests/compiler/dart2js/inference/data/static.dart
index c5e1196..04fa7c3 100644
--- a/tests/compiler/dart2js/inference/data/static.dart
+++ b/tests/compiler/dart2js/inference/data/static.dart
@@ -21,9 +21,18 @@
 
   invokeStaticFieldUninitialized();
   invokeStaticFieldTearOff();
+  invokeStaticTypedFieldTearOff();
   invokeStaticFieldTearOffParameters();
 
   invokeStaticGetterTearOff();
+  invokeStaticTypedGetterTearOff();
+
+  invokeStaticGenericMethod1();
+  invokeStaticGenericMethod2();
+  invokeStaticGenericGetter1();
+  invokeStaticGenericGetter2();
+  invokeStaticGenericField1();
+  invokeStaticGenericField2();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -187,6 +196,19 @@
 invokeStaticFieldTearOff() => _field2();
 
 ////////////////////////////////////////////////////////////////////////////////
+/// Call a top level field initialized to a tear-off of a top level method.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method5:Value([exact=JSString], value: "")*/
+String _method5() => '';
+
+/*element: _field5:[null|subclass=Closure]*/
+String Function() _field5 = _method5;
+
+/*element: invokeStaticTypedFieldTearOff:[null|exact=JSString]*/
+invokeStaticTypedFieldTearOff() => _field5();
+
+////////////////////////////////////////////////////////////////////////////////
 /// Call a top level field initialized to a tear-off of a top level method
 /// taking one argument.
 ////////////////////////////////////////////////////////////////////////////////
@@ -212,3 +234,61 @@
 
 /*element: invokeStaticGetterTearOff:[null|subclass=Object]*/
 invokeStaticGetterTearOff() => _getter1();
+
+////////////////////////////////////////////////////////////////////////////////
+/// Call a typed top level getter returning a tear-off of a top level method.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method6:[exact=JSUInt31]*/
+int _method6() => 0;
+
+/*element: _field7:[null|subclass=Closure]*/
+int Function() _field7 = _method6;
+
+/*element: _getter3:[null|subclass=Closure]*/
+int Function() get _getter3 => _field7;
+
+/*element: invokeStaticTypedGetterTearOff:[null|subclass=JSInt]*/
+invokeStaticTypedGetterTearOff() => _getter3();
+
+////////////////////////////////////////////////////////////////////////////////
+/// Calls to a generic static method whose return type depend upon the type
+/// arguments.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _method4:Union([exact=JSString], [exact=JSUInt31])*/
+T _method4<T>(T /*Union([exact=JSString], [exact=JSUInt31])*/ t) => t;
+
+/*element: invokeStaticGenericMethod1:[exact=JSUInt31]*/
+invokeStaticGenericMethod1() => _method4(0);
+
+/*element: invokeStaticGenericMethod2:[exact=JSString]*/
+invokeStaticGenericMethod2() => _method4('');
+
+////////////////////////////////////////////////////////////////////////////////
+/// Calls to a generic static method whose return type depend upon the type
+/// arguments.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _getter2:[subclass=Closure]*/
+T Function<T>(T) get _getter2 => _method4;
+
+/*element: invokeStaticGenericGetter1:[null|subclass=JSInt]*/
+invokeStaticGenericGetter1() => _getter2(0);
+
+/*element: invokeStaticGenericGetter2:[null|exact=JSString]*/
+invokeStaticGenericGetter2() => _getter2('');
+
+////////////////////////////////////////////////////////////////////////////////
+/// Calls to a generic static method whose return type depend upon the type
+/// arguments.
+////////////////////////////////////////////////////////////////////////////////
+
+/*element: _field4:[null|subclass=Closure]*/
+T Function<T>(T) _field4 = _method4;
+
+/*element: invokeStaticGenericField1:[null|subclass=JSInt]*/
+invokeStaticGenericField1() => _field4(0);
+
+/*element: invokeStaticGenericField2:[null|exact=JSString]*/
+invokeStaticGenericField2() => _field4('');
diff --git a/tests/compiler/dart2js/inference/data/static_type.dart b/tests/compiler/dart2js/inference/data/static_type.dart
new file mode 100644
index 0000000..b25a3a8
--- /dev/null
+++ b/tests/compiler/dart2js/inference/data/static_type.dart
@@ -0,0 +1,343 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C<T> {
+  /*element: C.field:Union([exact=JSString], [exact=JSUInt31])*/
+  final T field;
+
+  /*element: C.fixedFunctionField:[subclass=Closure]*/
+  int Function() fixedFunctionField = /*[exact=JSUInt31]*/ () => 0;
+
+  /*element: C.functionField:[null|subclass=Closure]*/
+  T Function() functionField;
+
+  /*element: C.genericFunctionField:[null|subclass=Closure]*/
+  S Function<S>(S) genericFunctionField;
+
+  /*element: C.:[exact=C]*/
+  C(this. /*Union([exact=JSString], [exact=JSUInt31])*/ field) {
+    /*update: [subclass=C]*/ functionField =
+        /*Union([exact=JSString], [exact=JSUInt31])*/
+        () => /*[subclass=C]*/ field;
+    /*Union([exact=JSString], [exact=JSUInt31])*/
+    S local<S>(S /*Union([exact=JSString], [exact=JSUInt31])*/ s) => s;
+    /*update: [subclass=C]*/ genericFunctionField = local;
+  }
+
+  /*element: C.method:Union([exact=JSString], [exact=JSUInt31])*/
+  T method() => /*[subclass=C]*/ field;
+
+  /*element: C.+:Union([exact=JSString], [exact=JSUInt31])*/
+  T operator +(T /*Union([exact=JSString], [exact=JSUInt31])*/ t) =>
+      /*[subclass=C]*/ field;
+
+  /*element: C.getter:Union([exact=JSString], [exact=JSUInt31])*/
+  T get getter => /*[subclass=C]*/ field;
+
+  /*element: C.fixedFunctionGetter:[subclass=Closure]*/
+  int Function() get fixedFunctionGetter => /*[exact=JSUInt31]*/ () => 0;
+
+  /*element: C.functionGetter:[null|subclass=Closure]*/
+  T Function() get functionGetter => /*[subclass=C]*/ functionField;
+
+  /*element: C.genericFunctionGetter:[null|subclass=Closure]*/
+  S Function<S>(S) get genericFunctionGetter =>
+      /*[subclass=C]*/ genericFunctionField;
+
+  /*element: C.genericMethod:Union([exact=JSString], [exact=JSUInt31])*/
+  S genericMethod<S>(S /*Union([exact=JSString], [exact=JSUInt31])*/ s) => s;
+}
+
+class D1 extends C<int> {
+  /*element: D1.:[exact=D1]*/
+  D1(int /*[exact=JSUInt31]*/ field) : super(field);
+
+  /*element: D1.superFieldAccess:[exact=JSUInt31]*/
+  superFieldAccess() => super.field;
+
+  /*element: D1.superFieldInvoke:[null|subclass=JSInt]*/
+  superFieldInvoke() => super.functionField();
+
+  /*element: D1.superFixedFieldInvoke:[null|subclass=JSInt]*/
+  superFixedFieldInvoke() => super.fixedFunctionField();
+
+  /*element: D1.superMethodInvoke:[exact=JSUInt31]*/
+  superMethodInvoke() => super.method();
+
+  /*element: D1.superOperatorInvoke:[exact=JSUInt31]*/
+  superOperatorInvoke() => super + 0;
+
+  /*element: D1.superGetterAccess:[exact=JSUInt31]*/
+  superGetterAccess() => super.getter;
+
+  /*element: D1.superGetterInvoke:[null|subclass=JSInt]*/
+  superGetterInvoke() => super.functionGetter();
+
+  /*element: D1.superFixedGetterInvoke:[null|subclass=JSInt]*/
+  superFixedGetterInvoke() => super.fixedFunctionGetter();
+
+  /*element: D1.superGenericFieldInvoke1:[null|exact=JSString]*/
+  superGenericFieldInvoke1() => super.genericFunctionField('');
+
+  /*element: D1.superGenericFieldInvoke2:[null|subclass=JSInt]*/
+  superGenericFieldInvoke2() => super.genericFunctionField(0);
+
+  /*element: D1.superGenericMethodInvoke1:[exact=JSString]*/
+  superGenericMethodInvoke1() => super.genericMethod('');
+
+  /*element: D1.superGenericMethodInvoke2:[exact=JSUInt31]*/
+  superGenericMethodInvoke2() => super.genericMethod(0);
+
+  /*element: D1.superGenericGetterInvoke1:[null|exact=JSString]*/
+  superGenericGetterInvoke1() => super.genericFunctionGetter('');
+
+  /*element: D1.superGenericGetterInvoke2:[null|subclass=JSInt]*/
+  superGenericGetterInvoke2() => super.genericFunctionGetter(0);
+}
+
+class D2 extends C<String> {
+  /*element: D2.:[exact=D2]*/
+  D2(String /*Value([exact=JSString], value: "")*/ field) : super(field);
+
+  /*element: D2.superFieldAccess:[exact=JSString]*/
+  superFieldAccess() => super.field;
+
+  /*element: D2.superFieldInvoke:[null|exact=JSString]*/
+  superFieldInvoke() => super.functionField();
+
+  /*element: D2.superFixedFieldInvoke:[null|subclass=JSInt]*/
+  superFixedFieldInvoke() => super.fixedFunctionField();
+
+  /*element: D2.superMethodInvoke:[exact=JSString]*/
+  superMethodInvoke() => super.method();
+
+  /*element: D2.superOperatorInvoke:[exact=JSString]*/
+  superOperatorInvoke() => super + '';
+
+  /*element: D2.superGetterAccess:[exact=JSString]*/
+  superGetterAccess() => super.getter;
+
+  /*element: D2.superGetterInvoke:[null|exact=JSString]*/
+  superGetterInvoke() => super.functionGetter();
+
+  /*element: D2.superFixedGetterInvoke:[null|subclass=JSInt]*/
+  superFixedGetterInvoke() => super.fixedFunctionGetter();
+
+  /*element: D2.superGenericFieldInvoke1:[null|exact=JSString]*/
+  superGenericFieldInvoke1() => super.genericFunctionField('');
+
+  /*element: D2.superGenericFieldInvoke2:[null|subclass=JSInt]*/
+  superGenericFieldInvoke2() => super.genericFunctionField(0);
+
+  /*element: D2.superGenericMethodInvoke1:[exact=JSString]*/
+  superGenericMethodInvoke1() => super.genericMethod('');
+
+  /*element: D2.superGenericMethodInvoke2:[exact=JSUInt31]*/
+  superGenericMethodInvoke2() => super.genericMethod(0);
+
+  /*element: D2.superGenericGetterInvoke1:[null|exact=JSString]*/
+  superGenericGetterInvoke1() => super.genericFunctionGetter('');
+
+  /*element: D2.superGenericGetterInvoke2:[null|subclass=JSInt]*/
+  superGenericGetterInvoke2() => super.genericFunctionGetter(0);
+}
+
+/*element: main:[null]*/
+main() {
+  closureInvoke();
+  localFunctionInvoke();
+  genericLocalFunctionInvoke();
+  fieldAccess1();
+  fieldAccess2();
+  fixedFieldInvoke();
+  fieldInvoke1();
+  fieldInvoke2();
+  methodInvoke1();
+  methodInvoke2();
+  operatorInvoke1();
+  operatorInvoke2();
+  fixedGetterInvoke();
+  getterAccess1();
+  getterAccess2();
+  getterInvoke1();
+  getterInvoke2();
+  genericFieldInvoke1();
+  genericFieldInvoke2();
+  genericMethodInvoke1();
+  genericMethodInvoke2();
+  genericGetterInvoke1();
+  genericGetterInvoke2();
+  new D1(0)
+    .. /*invoke: [exact=D1]*/ superFieldAccess()
+    .. /*invoke: [exact=D1]*/ superFieldInvoke()
+    .. /*invoke: [exact=D1]*/ superFixedFieldInvoke()
+    .. /*invoke: [exact=D1]*/ superMethodInvoke()
+    .. /*invoke: [exact=D1]*/ superOperatorInvoke()
+    .. /*invoke: [exact=D1]*/ superGetterAccess()
+    .. /*invoke: [exact=D1]*/ superGetterInvoke()
+    .. /*invoke: [exact=D1]*/ superFixedGetterInvoke()
+    .. /*invoke: [exact=D1]*/ superGenericFieldInvoke1()
+    .. /*invoke: [exact=D1]*/ superGenericFieldInvoke2()
+    .. /*invoke: [exact=D1]*/ superGenericMethodInvoke1()
+    .. /*invoke: [exact=D1]*/ superGenericMethodInvoke2()
+    .. /*invoke: [exact=D1]*/ superGenericGetterInvoke1()
+    .. /*invoke: [exact=D1]*/ superGenericGetterInvoke2();
+  new D2('')
+    .. /*invoke: [exact=D2]*/ superFieldAccess()
+    .. /*invoke: [exact=D2]*/ superFieldInvoke()
+    .. /*invoke: [exact=D2]*/ superFixedFieldInvoke()
+    .. /*invoke: [exact=D2]*/ superMethodInvoke()
+    .. /*invoke: [exact=D2]*/ superOperatorInvoke()
+    .. /*invoke: [exact=D2]*/ superGetterAccess()
+    .. /*invoke: [exact=D2]*/ superGetterInvoke()
+    .. /*invoke: [exact=D2]*/ superFixedGetterInvoke()
+    .. /*invoke: [exact=D2]*/ superGenericFieldInvoke1()
+    .. /*invoke: [exact=D2]*/ superGenericFieldInvoke2()
+    .. /*invoke: [exact=D2]*/ superGenericMethodInvoke1()
+    .. /*invoke: [exact=D2]*/ superGenericMethodInvoke2()
+    .. /*invoke: [exact=D2]*/ superGenericGetterInvoke1()
+    .. /*invoke: [exact=D2]*/ superGenericGetterInvoke2();
+}
+
+/*element: closureInvoke:[null|subclass=JSInt]*/
+closureInvoke() {
+  int Function() f = /*[exact=JSUInt31]*/ () => 0;
+  return f();
+}
+
+/*element: localFunctionInvoke:[exact=JSUInt31]*/
+localFunctionInvoke() {
+  /*[exact=JSUInt31]*/
+  int local() => 0;
+  return local();
+}
+
+/*element: genericLocalFunctionInvoke:[null]*/
+genericLocalFunctionInvoke() {
+  /*Union([exact=JSString], [exact=JSUInt31])*/
+  S local<S>(S /*Union([exact=JSString], [exact=JSUInt31])*/ s) => s;
+
+  local(0). /*invoke: [exact=JSUInt31]*/ toString();
+  local(''). /*invoke: [exact=JSString]*/ toString();
+}
+
+/*element: fieldAccess1:[exact=JSUInt31]*/
+fieldAccess1() {
+  C<int> c = new C<int>(0);
+  return c. /*[exact=C]*/ field;
+}
+
+/*element: fieldAccess2:[exact=JSString]*/
+fieldAccess2() {
+  C<String> c = new C<String>('');
+  return c. /*[exact=C]*/ field;
+}
+
+/*element: fixedFieldInvoke:[null|subclass=JSInt]*/
+fixedFieldInvoke() {
+  C<int> c = new C<int>(0);
+  return c. /*invoke: [exact=C]*/ fixedFunctionField();
+}
+
+/*element: fieldInvoke1:[null|subclass=JSInt]*/
+fieldInvoke1() {
+  C<int> c = new C<int>(0);
+  return c. /*invoke: [exact=C]*/ functionField();
+}
+
+/*element: fieldInvoke2:[null|exact=JSString]*/
+fieldInvoke2() {
+  C<String> c = new C<String>('');
+  return c. /*invoke: [exact=C]*/ functionField();
+}
+
+/*element: methodInvoke1:[exact=JSUInt31]*/
+methodInvoke1() {
+  C<int> c = new C<int>(0);
+  return c. /*invoke: [exact=C]*/ method();
+}
+
+/*element: methodInvoke2:[exact=JSString]*/
+methodInvoke2() {
+  C<String> c = new C<String>('');
+  return c. /*invoke: [exact=C]*/ method();
+}
+
+/*element: operatorInvoke1:[exact=JSUInt31]*/
+operatorInvoke1() {
+  C<int> c = new C<int>(0);
+  return c /*invoke: [exact=C]*/ + 0;
+}
+
+/*element: operatorInvoke2:[exact=JSString]*/
+operatorInvoke2() {
+  C<String> c = new C<String>('');
+  return c /*invoke: [exact=C]*/ + '';
+}
+
+/*element: fixedGetterInvoke:[null|subclass=JSInt]*/
+fixedGetterInvoke() {
+  C<int> c = new C<int>(0);
+  return c. /*invoke: [exact=C]*/ fixedFunctionGetter();
+}
+
+/*element: getterAccess1:[exact=JSUInt31]*/
+getterAccess1() {
+  C<int> c = new C<int>(0);
+  return c. /*[exact=C]*/ getter;
+}
+
+/*element: getterAccess2:[exact=JSString]*/
+getterAccess2() {
+  C<String> c = new C<String>('');
+  return c. /*[exact=C]*/ getter;
+}
+
+/*element: getterInvoke1:[null|subclass=JSInt]*/
+getterInvoke1() {
+  C<int> c = new C<int>(0);
+  return c. /*invoke: [exact=C]*/ functionGetter();
+}
+
+/*element: getterInvoke2:[null|exact=JSString]*/
+getterInvoke2() {
+  C<String> c = new C<String>('');
+  return c. /*invoke: [exact=C]*/ functionGetter();
+}
+
+/*element: genericFieldInvoke1:[null|exact=JSString]*/
+genericFieldInvoke1() {
+  C<int> c = new C<int>(0);
+  return c. /*invoke: [exact=C]*/ genericFunctionField('');
+}
+
+/*element: genericFieldInvoke2:[null|subclass=JSInt]*/
+genericFieldInvoke2() {
+  C<String> c = new C<String>('');
+  return c. /*invoke: [exact=C]*/ genericFunctionField(0);
+}
+
+/*element: genericMethodInvoke1:[exact=JSString]*/
+genericMethodInvoke1() {
+  C<int> c = new C<int>(0);
+  return c. /*invoke: [exact=C]*/ genericMethod('');
+}
+
+/*element: genericMethodInvoke2:[exact=JSUInt31]*/
+genericMethodInvoke2() {
+  C<String> c = new C<String>('');
+  return c. /*invoke: [exact=C]*/ genericMethod(0);
+}
+
+/*element: genericGetterInvoke1:[null|exact=JSString]*/
+genericGetterInvoke1() {
+  C<int> c = new C<int>(0);
+  return c. /*invoke: [exact=C]*/ genericFunctionGetter('');
+}
+
+/*element: genericGetterInvoke2:[null|subclass=JSInt]*/
+genericGetterInvoke2() {
+  C<String> c = new C<String>('');
+  return c. /*invoke: [exact=C]*/ genericFunctionGetter(0);
+}
diff --git a/tests/compiler/dart2js/inference/data/type_literal.dart b/tests/compiler/dart2js/inference/data/type_literal.dart
index f90ee3c..46644d9 100644
--- a/tests/compiler/dart2js/inference/data/type_literal.dart
+++ b/tests/compiler/dart2js/inference/data/type_literal.dart
@@ -12,13 +12,13 @@
 /*element: typeLiteral:[exact=TypeImpl]*/
 typeLiteral() => Object;
 
-/*strong.element: typeLiteralToString:[exact=JSString]*/
+/*element: typeLiteralToString:[exact=JSString]*/
 typeLiteralToString() => (Object). /*invoke: [exact=TypeImpl]*/ toString();
 
 /*element: typeLiteralSubstring:[exact=JSString]*/
 typeLiteralSubstring() {
   String name = (List). /*invoke: [exact=TypeImpl]*/ toString();
-  name = name. /*strong.invoke: [exact=JSString]*/ substring(
-      0, name. /*strong.invoke: [exact=JSString]*/ indexOf('<'));
+  name = name. /*invoke: [exact=JSString]*/ substring(
+      0, name. /*invoke: [exact=JSString]*/ indexOf('<'));
   return name;
 }
diff --git a/tests/compiler/dart2js/inference/data/use_static_types.dart b/tests/compiler/dart2js/inference/data/use_static_types.dart
index 9906d25..1d59e90 100644
--- a/tests/compiler/dart2js/inference/data/use_static_types.dart
+++ b/tests/compiler/dart2js/inference/data/use_static_types.dart
@@ -18,17 +18,17 @@
   invokeGenericMethods();
 }
 
-/*strong.element: invokeFunction1:[null|subclass=A]*/
+/*element: invokeFunction1:[null|subclass=A]*/
 invokeFunction1(A Function() /*[subclass=Closure]*/ f) {
   return f();
 }
 
-/*strong.element: invokeFunction2:[null|exact=B]*/
+/*element: invokeFunction2:[null|exact=B]*/
 invokeFunction2(B Function() /*[subclass=Closure]*/ f) {
   return f();
 }
 
-/*strong.element: invokeFunction3:[null|exact=C]*/
+/*element: invokeFunction3:[null|exact=C]*/
 invokeFunction3(C Function() /*[subclass=Closure]*/ f) {
   return f();
 }
@@ -36,36 +36,36 @@
 /*element: genericFunction:[null|subclass=Object]*/
 T genericFunction<T>(T Function() /*[subclass=Closure]*/ f) => f();
 
-/*strong.element: invokeGenericFunction1:[null|subclass=A]*/
+/*element: invokeGenericFunction1:[null|subclass=A]*/
 invokeGenericFunction1() {
   return genericFunction<A>(/*[exact=A]*/ () => new A());
 }
 
-/*strong.element: invokeGenericFunction2:[null|exact=B]*/
+/*element: invokeGenericFunction2:[null|exact=B]*/
 invokeGenericFunction2() {
   return genericFunction<B>(/*[exact=B]*/ () => new B());
 }
 
-/*strong.element: invokeGenericFunction3:[null|exact=C]*/
+/*element: invokeGenericFunction3:[null|exact=C]*/
 invokeGenericFunction3() {
   return genericFunction<C>(/*[exact=C]*/ () => new C());
 }
 
-/*strong.element: invokeGenericLocalFunction1:[null|subclass=A]*/
+/*element: invokeGenericLocalFunction1:[null|subclass=A]*/
 invokeGenericLocalFunction1() {
   /*[null|subclass=Object]*/
   T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
   return local<A>(/*[exact=A]*/ () => new A());
 }
 
-/*strong.element: invokeGenericLocalFunction2:[null|exact=B]*/
+/*element: invokeGenericLocalFunction2:[null|exact=B]*/
 invokeGenericLocalFunction2() {
   /*[null|subclass=Object]*/
   T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
   return local<B>(/*[exact=B]*/ () => new B());
 }
 
-/*strong.element: invokeGenericLocalFunction3:[null|exact=C]*/
+/*element: invokeGenericLocalFunction3:[null|exact=C]*/
 invokeGenericLocalFunction3() {
   /*[null|subclass=Object]*/
   T local<T>(T Function() /*[subclass=Closure]*/ f) => f();
@@ -134,39 +134,39 @@
   superMethodInvoke() => super.functionTypedMethod()();
 }
 
-/*strong.element: invokeInstanceMethod1:[subclass=A]*/
+/*element: invokeInstanceMethod1:[subclass=A]*/
 invokeInstanceMethod1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ method();
 
-/*strong.element: invokeInstanceMethod2:[exact=B]*/
+/*element: invokeInstanceMethod2:[exact=B]*/
 invokeInstanceMethod2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ method();
 
-/*strong.element: invokeInstanceMethod3:[exact=C]*/
+/*element: invokeInstanceMethod3:[exact=C]*/
 invokeInstanceMethod3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ method();
 
-/*strong.element: invokeInstanceGetter1:[subclass=A]*/
+/*element: invokeInstanceGetter1:[subclass=A]*/
 invokeInstanceGetter1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
     c. /*[exact=GenericClass]*/ getter;
 
-/*strong.element: invokeInstanceGetter2:[exact=B]*/
+/*element: invokeInstanceGetter2:[exact=B]*/
 invokeInstanceGetter2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
     c. /*[exact=GenericClass]*/ getter;
 
-/*strong.element: invokeInstanceGetter3:[exact=C]*/
+/*element: invokeInstanceGetter3:[exact=C]*/
 invokeInstanceGetter3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
     c. /*[exact=GenericClass]*/ getter;
 
-/*strong.element: accessInstanceField1:[subclass=A]*/
+/*element: accessInstanceField1:[subclass=A]*/
 accessInstanceField1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
     c. /*[exact=GenericClass]*/ field;
 
-/*strong.element: accessInstanceField2:[exact=B]*/
+/*element: accessInstanceField2:[exact=B]*/
 accessInstanceField2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
     c. /*[exact=GenericClass]*/ field;
 
-/*strong.element: accessInstanceField3:[exact=C]*/
+/*element: accessInstanceField3:[exact=C]*/
 accessInstanceField3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
     c. /*[exact=GenericClass]*/ field;
 
@@ -206,45 +206,45 @@
 accessSuperField3(GenericSubclass<C> /*[exact=GenericSubclass]*/ c) =>
     c. /*invoke: [exact=GenericSubclass]*/ superField();
 
-/*strong.element: invokeFunctionTypedInstanceMethod1:[null|subclass=A]*/
+/*element: invokeFunctionTypedInstanceMethod1:[null|subclass=A]*/
 invokeFunctionTypedInstanceMethod1(
         GenericClass<A> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
 
-/*strong.element: invokeFunctionTypedInstanceMethod2:[null|exact=B]*/
+/*element: invokeFunctionTypedInstanceMethod2:[null|exact=B]*/
 invokeFunctionTypedInstanceMethod2(
         GenericClass<B> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
 
-/*strong.element: invokeFunctionTypedInstanceMethod3:[null|exact=C]*/
+/*element: invokeFunctionTypedInstanceMethod3:[null|exact=C]*/
 invokeFunctionTypedInstanceMethod3(
         GenericClass<C> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedMethod()();
 
-/*strong.element: invokeFunctionTypedInstanceGetter1:[null|subclass=A]*/
+/*element: invokeFunctionTypedInstanceGetter1:[null|subclass=A]*/
 invokeFunctionTypedInstanceGetter1(
         GenericClass<A> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
 
-/*strong.element: invokeFunctionTypedInstanceGetter2:[null|exact=B]*/
+/*element: invokeFunctionTypedInstanceGetter2:[null|exact=B]*/
 invokeFunctionTypedInstanceGetter2(
         GenericClass<B> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
 
-/*strong.element: invokeFunctionTypedInstanceGetter3:[null|exact=C]*/
+/*element: invokeFunctionTypedInstanceGetter3:[null|exact=C]*/
 invokeFunctionTypedInstanceGetter3(
         GenericClass<C> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedGetter();
 
-/*strong.element: invokeFunctionTypedInstanceField1:[null|subclass=A]*/
+/*element: invokeFunctionTypedInstanceField1:[null|subclass=A]*/
 invokeFunctionTypedInstanceField1(GenericClass<A> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedField();
 
-/*strong.element: invokeFunctionTypedInstanceField2:[null|exact=B]*/
+/*element: invokeFunctionTypedInstanceField2:[null|exact=B]*/
 invokeFunctionTypedInstanceField2(GenericClass<B> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedField();
 
-/*strong.element: invokeFunctionTypedInstanceField3:[null|exact=C]*/
+/*element: invokeFunctionTypedInstanceField3:[null|exact=C]*/
 invokeFunctionTypedInstanceField3(GenericClass<C> /*[exact=GenericClass]*/ c) =>
     c. /*invoke: [exact=GenericClass]*/ functionTypedField();
 
@@ -357,103 +357,103 @@
 
 /*element: Subclass.:[exact=Subclass]*/
 class Subclass extends Class {
-  /*strong.element: Subclass.superMethod1:[subclass=A]*/
+  /*element: Subclass.superMethod1:[subclass=A]*/
   superMethod1() {
     return super.genericMethod<A>(new A());
   }
 
-  /*strong.element: Subclass.superMethod2:[exact=B]*/
+  /*element: Subclass.superMethod2:[exact=B]*/
   superMethod2() {
     return super.genericMethod<B>(new B());
   }
 
-  /*strong.element: Subclass.superMethod3:[exact=C]*/
+  /*element: Subclass.superMethod3:[exact=C]*/
   superMethod3() {
     return super.genericMethod<C>(new C());
   }
 
-  /*strong.element: Subclass.functionTypedSuperMethod1:[null|subclass=A]*/
+  /*element: Subclass.functionTypedSuperMethod1:[null|subclass=A]*/
   functionTypedSuperMethod1() {
     return super.functionTypedGenericMethod<A>(new A())();
   }
 
-  /*strong.element: Subclass.functionTypedSuperMethod2:[null|exact=B]*/
+  /*element: Subclass.functionTypedSuperMethod2:[null|exact=B]*/
   functionTypedSuperMethod2() {
     return super.functionTypedGenericMethod<B>(new B())();
   }
 
-  /*strong.element: Subclass.functionTypedSuperMethod3:[null|exact=C]*/
+  /*element: Subclass.functionTypedSuperMethod3:[null|exact=C]*/
   functionTypedSuperMethod3() {
     return super.functionTypedGenericMethod<C>(new C())();
   }
 }
 
-/*strong.element: invokeGenericMethod1:[subclass=A]*/
+/*element: invokeGenericMethod1:[subclass=A]*/
 invokeGenericMethod1(A /*[exact=A]*/ a) => genericMethod<A>(a);
 
-/*strong.element: invokeGenericMethod2:[exact=B]*/
+/*element: invokeGenericMethod2:[exact=B]*/
 invokeGenericMethod2(B /*[exact=B]*/ b) => genericMethod<B>(b);
 
-/*strong.element: invokeGenericMethod3:[exact=C]*/
+/*element: invokeGenericMethod3:[exact=C]*/
 invokeGenericMethod3(C /*[exact=C]*/ c) => genericMethod<C>(c);
 
-/*strong.element: invokeGenericInstanceMethod1:[subclass=A]*/
+/*element: invokeGenericInstanceMethod1:[subclass=A]*/
 invokeGenericInstanceMethod1() =>
     new Class(). /*invoke: [exact=Class]*/ genericMethod<A>(new A());
 
-/*strong.element: invokeGenericInstanceMethod2:[exact=B]*/
+/*element: invokeGenericInstanceMethod2:[exact=B]*/
 invokeGenericInstanceMethod2() =>
     new Class(). /*invoke: [exact=Class]*/ genericMethod<B>(new B());
 
-/*strong.element: invokeGenericInstanceMethod3:[exact=C]*/
+/*element: invokeGenericInstanceMethod3:[exact=C]*/
 invokeGenericInstanceMethod3() =>
     new Class(). /*invoke: [exact=Class]*/ genericMethod<C>(new C());
 
-/*strong.element: invokeGenericSuperMethod1:[subclass=A]*/
+/*element: invokeGenericSuperMethod1:[subclass=A]*/
 invokeGenericSuperMethod1() =>
     new Subclass(). /*invoke: [exact=Subclass]*/ superMethod1();
 
-/*strong.element: invokeGenericSuperMethod2:[exact=B]*/
+/*element: invokeGenericSuperMethod2:[exact=B]*/
 invokeGenericSuperMethod2() =>
     new Subclass(). /*invoke: [exact=Subclass]*/ superMethod2();
 
-/*strong.element: invokeGenericSuperMethod3:[exact=C]*/
+/*element: invokeGenericSuperMethod3:[exact=C]*/
 invokeGenericSuperMethod3() =>
     new Subclass(). /*invoke: [exact=Subclass]*/ superMethod3();
 
-/*strong.element: invokeFunctionTypedGenericMethod1:[null|subclass=A]*/
+/*element: invokeFunctionTypedGenericMethod1:[null|subclass=A]*/
 invokeFunctionTypedGenericMethod1(A /*[exact=A]*/ a) =>
     functionTypedGenericMethod<A>(a)();
 
-/*strong.element: invokeFunctionTypedGenericMethod2:[null|exact=B]*/
+/*element: invokeFunctionTypedGenericMethod2:[null|exact=B]*/
 invokeFunctionTypedGenericMethod2(B /*[exact=B]*/ b) =>
     functionTypedGenericMethod<B>(b)();
 
-/*strong.element: invokeFunctionTypedGenericMethod3:[null|exact=C]*/
+/*element: invokeFunctionTypedGenericMethod3:[null|exact=C]*/
 invokeFunctionTypedGenericMethod3(C /*[exact=C]*/ c) =>
     functionTypedGenericMethod<C>(c)();
 
-/*strong.element: invokeFunctionTypedGenericInstanceMethod1:[null|subclass=A]*/
+/*element: invokeFunctionTypedGenericInstanceMethod1:[null|subclass=A]*/
 invokeFunctionTypedGenericInstanceMethod1() => new Class()
     . /*invoke: [exact=Class]*/ functionTypedGenericMethod<A>(new A())();
 
-/*strong.element: invokeFunctionTypedGenericInstanceMethod2:[null|exact=B]*/
+/*element: invokeFunctionTypedGenericInstanceMethod2:[null|exact=B]*/
 invokeFunctionTypedGenericInstanceMethod2() => new Class()
     . /*invoke: [exact=Class]*/ functionTypedGenericMethod<B>(new B())();
 
-/*strong.element: invokeFunctionTypedGenericInstanceMethod3:[null|exact=C]*/
+/*element: invokeFunctionTypedGenericInstanceMethod3:[null|exact=C]*/
 invokeFunctionTypedGenericInstanceMethod3() => new Class()
     . /*invoke: [exact=Class]*/ functionTypedGenericMethod<C>(new C())();
 
-/*strong.element: invokeFunctionTypedGenericSuperMethod1:[null|subclass=A]*/
+/*element: invokeFunctionTypedGenericSuperMethod1:[null|subclass=A]*/
 invokeFunctionTypedGenericSuperMethod1() =>
     new Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod1();
 
-/*strong.element: invokeFunctionTypedGenericSuperMethod2:[null|exact=B]*/
+/*element: invokeFunctionTypedGenericSuperMethod2:[null|exact=B]*/
 invokeFunctionTypedGenericSuperMethod2() =>
     new Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod2();
 
-/*strong.element: invokeFunctionTypedGenericSuperMethod3:[null|exact=C]*/
+/*element: invokeFunctionTypedGenericSuperMethod3:[null|exact=C]*/
 invokeFunctionTypedGenericSuperMethod3() =>
     new Subclass(). /*invoke: [exact=Subclass]*/ functionTypedSuperMethod3();
 
diff --git a/tests/compiler/dart2js/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
index 396bd22..a3cad1f 100644
--- a/tests/compiler/dart2js/inference/inference_data_test.dart
+++ b/tests/compiler/dart2js/inference/inference_data_test.dart
@@ -11,7 +11,8 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_backend/inferred_data.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
+import 'package:compiler/src/util/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -21,7 +22,7 @@
     Directory dataDir =
         new Directory.fromUri(Platform.script.resolve('inference_data'));
     await checkTests(dataDir, const InferenceDataComputer(),
-        args: args, options: [stopAfterTypeInference]);
+        args: args, testOmit: false, options: [stopAfterTypeInference]);
   });
 }
 
@@ -31,15 +32,15 @@
   static const String cannotThrow = 'no-throw';
 }
 
-class InferenceDataComputer extends DataComputer {
+class InferenceDataComputer extends DataComputer<String> {
   const InferenceDataComputer();
 
   /// Compute side effects data for [member] from kernel based inference.
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -48,15 +49,21 @@
             compiler.globalInference.resultsForTesting.inferredData)
         .run(definition.node);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
 /// AST visitor for computing side effects data for a member.
-class InferredDataIrComputer extends IrDataExtractor {
+class InferredDataIrComputer extends IrDataExtractor<String> {
   final JsClosedWorld closedWorld;
   final InferredData inferredData;
 
-  InferredDataIrComputer(DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap, this.closedWorld, this.inferredData)
+  InferredDataIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap,
+      this.closedWorld,
+      this.inferredData)
       : super(reporter, actualMap);
 
   JsToElementMap get _elementMap => closedWorld.elementMap;
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index 2fd448d..5b5eb7f 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -10,11 +10,10 @@
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
-import 'package:compiler/src/types/types.dart';
+import 'package:compiler/src/inferrer/types.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:compiler/src/js_model/locals.dart';
-import 'package:compiler/src/inferrer/builder_kernel.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -38,21 +37,19 @@
         options: [stopAfterTypeInference],
         skipForStrong: skipForStrong,
         shardIndex: shardIndex ?? 0,
-        shards: shardIndex != null ? 2 : 1, onTest: (Uri uri) {
-      useStaticResultTypes = uri.path.endsWith('/use_static_types.dart');
-    });
+        shards: shardIndex != null ? 2 : 1);
   });
 }
 
-class TypeMaskDataComputer extends DataComputer {
+class TypeMaskDataComputer extends DataComputer<String> {
   const TypeMaskDataComputer();
 
   /// Compute type inference data for [member] from kernel based inference.
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -68,10 +65,13 @@
             closedWorld.closureDataLookup)
         .run(definition.node);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
 /// IR visitor for computing inference data for a member.
-class TypeMaskIrComputer extends IrDataExtractor {
+class TypeMaskIrComputer extends IrDataExtractor<String> {
   final GlobalTypeInferenceResults results;
   GlobalTypeInferenceMemberResult result;
   final JsToElementMap _elementMap;
@@ -80,7 +80,7 @@
 
   TypeMaskIrComputer(
       DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
+      Map<Id, ActualData<String>> actualMap,
       this._elementMap,
       MemberEntity member,
       this._localsMap,
diff --git a/tests/compiler/dart2js/inference/load_deferred_library_test.dart b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
index ab87ab2..716d334 100644
--- a/tests/compiler/dart2js/inference/load_deferred_library_test.dart
+++ b/tests/compiler/dart2js/inference/load_deferred_library_test.dart
@@ -8,10 +8,10 @@
 import 'package:compiler/src/common/names.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
-import 'package:compiler/src/types/abstract_value_domain.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:expect/expect.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../helpers/memory_compiler.dart';
diff --git a/tests/compiler/dart2js/inference/map_tracer_test.dart b/tests/compiler/dart2js/inference/map_tracer_test.dart
index 2135e08..7e2b849 100644
--- a/tests/compiler/dart2js/inference/map_tracer_test.dart
+++ b/tests/compiler/dart2js/inference/map_tracer_test.dart
@@ -5,8 +5,8 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/inferrer/abstract_value_domain.dart';
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
-import 'package:compiler/src/types/abstract_value_domain.dart';
 import 'package:compiler/src/world.dart';
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index 1ad86b8..0e2e5cb 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_backend/inferred_data.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -25,7 +25,7 @@
   });
 }
 
-class SideEffectsDataComputer extends DataComputer {
+class SideEffectsDataComputer extends DataComputer<String> {
   const SideEffectsDataComputer();
 
   /// Compute side effects data for [member] from kernel based inference.
@@ -42,15 +42,21 @@
             compiler.globalInference.resultsForTesting.inferredData)
         .run(definition.node);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
 /// AST visitor for computing side effects data for a member.
-class SideEffectsIrComputer extends IrDataExtractor {
+class SideEffectsIrComputer extends IrDataExtractor<String> {
   final JsClosedWorld closedWorld;
   final InferredData inferredData;
 
-  SideEffectsIrComputer(DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap, this.closedWorld, this.inferredData)
+  SideEffectsIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap,
+      this.closedWorld,
+      this.inferredData)
       : super(reporter, actualMap);
 
   JsToElementMap get _elementMap => closedWorld.elementMap;
diff --git a/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart b/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart
new file mode 100644
index 0000000..6a8f389
--- /dev/null
+++ b/tests/compiler/dart2js/inference/trivial_abstract_value_domain_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:args/args.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+
+import '../helpers/args_helper.dart';
+import '../helpers/memory_compiler.dart';
+
+main(List<String> args) {
+  ArgParser argParser = createArgParser();
+
+  asyncTest(() async {
+    ArgResults argResults = argParser.parse(args);
+    Uri entryPoint = getEntryPoint(argResults) ??
+        Uri.base.resolve('samples-dev/swarm/swarm.dart');
+    Uri librariesSpecificationUri = getLibrariesSpec(argResults);
+    Uri packageConfig = getPackages(argResults);
+    List<String> options = getOptions(argResults);
+    await runCompiler(
+        entryPoint: entryPoint,
+        packageConfig: packageConfig,
+        librariesSpecificationUri: librariesSpecificationUri,
+        options: [Flags.useTrivialAbstractValueDomain]..addAll(options));
+  });
+}
diff --git a/tests/compiler/dart2js/inference/type_mask_test_helper.dart b/tests/compiler/dart2js/inference/type_mask_test_helper.dart
index 025d218..75fe378 100644
--- a/tests/compiler/dart2js/inference/type_mask_test_helper.dart
+++ b/tests/compiler/dart2js/inference/type_mask_test_helper.dart
@@ -7,7 +7,7 @@
 import 'package:compiler/src/inferrer/typemasks/masks.dart';
 import 'package:compiler/src/world.dart' show JClosedWorld;
 
-export 'package:compiler/src/types/types.dart';
+export 'package:compiler/src/inferrer/types.dart';
 
 TypeMask simplify(TypeMask mask, JClosedWorld closedWorld) {
   if (mask is ForwardingTypeMask) {
diff --git a/tests/compiler/dart2js/inlining/inlining_test.dart b/tests/compiler/dart2js/inlining/inlining_test.dart
index 12d032b..c6a8b92 100644
--- a/tests/compiler/dart2js/inlining/inlining_test.dart
+++ b/tests/compiler/dart2js/inlining/inlining_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_backend/backend.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:compiler/src/ssa/builder_kernel.dart' as kernel;
 import 'package:compiler/src/universe/world_impact.dart';
 import 'package:compiler/src/universe/use.dart';
@@ -26,15 +26,15 @@
   });
 }
 
-class InliningDataComputer extends DataComputer {
+class InliningDataComputer extends DataComputer<String> {
   const InliningDataComputer();
 
   /// Compute type inference data for [member] from kernel based inference.
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -43,17 +43,20 @@
             compiler.backend, closedWorld.closureDataLookup)
         .run(definition.node);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
 /// AST visitor for computing inference data for a member.
-class InliningIrComputer extends IrDataExtractor {
+class InliningIrComputer extends IrDataExtractor<String> {
   final JavaScriptBackend backend;
   final JsToElementMap _elementMap;
   final ClosureData _closureDataLookup;
 
   InliningIrComputer(
       DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
+      Map<Id, ActualData<String>> actualMap,
       this._elementMap,
       MemberEntity member,
       this.backend,
diff --git a/tests/compiler/dart2js/js/js_spec_string_test.dart b/tests/compiler/dart2js/js/js_spec_string_test.dart
index 4f301af..1e7080d 100644
--- a/tests/compiler/dart2js/js/js_spec_string_test.dart
+++ b/tests/compiler/dart2js/js/js_spec_string_test.dart
@@ -5,7 +5,7 @@
 // Unit test of the [NativeBehavior.processSpecString] method.
 
 import 'package:expect/expect.dart';
-import 'package:compiler/src/native/native.dart';
+import 'package:compiler/src/native/behavior.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/diagnostics/messages.dart';
 import 'package:compiler/src/universe/side_effects.dart' show SideEffects;
diff --git a/tests/compiler/dart2js/js/js_throw_behavior_test.dart b/tests/compiler/dart2js/js/js_throw_behavior_test.dart
index e0b75b9..22fb733 100644
--- a/tests/compiler/dart2js/js/js_throw_behavior_test.dart
+++ b/tests/compiler/dart2js/js/js_throw_behavior_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import 'package:compiler/src/native/native.dart';
+import 'package:compiler/src/native/behavior.dart';
+import 'package:compiler/src/native/js.dart';
 import 'package:compiler/src/js/js.dart' as js;
 
 void test(String source, NativeThrowBehavior expectedThrowBehavior) {
diff --git a/tests/compiler/dart2js/jumps/jump_test.dart b/tests/compiler/dart2js/jumps/jump_test.dart
index c90e13c..4d954d7 100644
--- a/tests/compiler/dart2js/jumps/jump_test.dart
+++ b/tests/compiler/dart2js/jumps/jump_test.dart
@@ -4,14 +4,13 @@
 
 import 'dart:io';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/common.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/jumps.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:compiler/src/js_model/locals.dart';
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -21,12 +20,11 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, const JumpDataComputer(),
-        options: [Flags.disableTypeInference, stopAfterTypeInference],
-        args: args);
+        options: [stopAfterTypeInference], args: args);
   });
 }
 
-class JumpDataComputer extends DataComputer {
+class JumpDataComputer extends DataComputer<String> {
   const JumpDataComputer();
 
   /// Compute closure data mapping for [member] as a kernel based element.
@@ -34,8 +32,8 @@
   /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
   /// for the data origin.
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -45,6 +43,9 @@
             compiler.reporter, actualMap, localsMap.getLocalsMap(member))
         .run(definition.node);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
 class TargetData {
@@ -70,15 +71,15 @@
 }
 
 /// Kernel IR visitor for computing jump data.
-class JumpsIrChecker extends IrDataExtractor {
+class JumpsIrChecker extends IrDataExtractor<String> {
   final KernelToLocalsMap _localsMap;
 
   int index = 0;
   Map<JumpTarget, TargetData> targets = <JumpTarget, TargetData>{};
   List<GotoData> gotos = <GotoData>[];
 
-  JumpsIrChecker(DiagnosticReporter reporter, Map<Id, ActualData> actualMap,
-      this._localsMap)
+  JumpsIrChecker(DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap, this._localsMap)
       : super(reporter, actualMap);
 
   void processData() {
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index 790a8a5..5ceb1e8 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -12,7 +12,6 @@
 import 'package:compiler/src/universe/class_set.dart';
 import 'package:compiler/src/util/enumset.dart';
 import 'package:compiler/src/world.dart';
-import 'package:front_end/src/fasta/util/link.dart' show Link;
 import '../helpers/type_test_helper.dart';
 
 void main() {
@@ -36,8 +35,8 @@
       ///    D   E F G
       ///
       class A {}
-      class C extends A {}
       class B extends A {}
+      class C extends A {}
       class D extends B {}
       class E extends C {}
       class F extends C {}
@@ -98,9 +97,9 @@
       return node != null ? node.cls : null;
     }
 
-    List<ClassEntity> classesOf(Link<ClassHierarchyNode> link) {
-      if (link == null) return null;
-      return link.map(classOf).toList();
+    List<ClassEntity> classesOf(Iterable<ClassHierarchyNode> list) {
+      if (list == null) return null;
+      return list.map(classOf).toList();
     }
 
     ClassEntity foundRoot = iterator.root.cls;
@@ -138,10 +137,8 @@
           world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
       .iterator;
   checkState(G, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(G, currentNode: G, stack: []);
-  Expect.equals(G, iterator.current);
   Expect.isFalse(iterator.moveNext());
   checkState(G, currentNode: null, stack: []);
   Expect.isNull(iterator.current);
@@ -151,71 +148,53 @@
           includeRoot: false)
       .iterator;
   checkState(G, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isFalse(iterator.moveNext());
   checkState(G, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
           world.classHierarchy.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
       .iterator;
   checkState(C, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
-  checkState(C, currentNode: C, stack: [E, F, G]);
-  Expect.equals(C, iterator.current);
+  checkState(C, currentNode: C, stack: [G, F, E]);
   Expect.isTrue(iterator.moveNext());
-  checkState(C, currentNode: E, stack: [F, G]);
-  Expect.equals(E, iterator.current);
+  checkState(C, currentNode: E, stack: [G, F]);
   Expect.isTrue(iterator.moveNext());
   checkState(C, currentNode: F, stack: [G]);
-  Expect.equals(F, iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(C, currentNode: G, stack: []);
-  Expect.equals(G, iterator.current);
   Expect.isFalse(iterator.moveNext());
   checkState(C, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
           world.classHierarchy.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
       .iterator;
   checkState(D, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(D, currentNode: D, stack: []);
-  Expect.equals(D, iterator.current);
   Expect.isFalse(iterator.moveNext());
   checkState(D, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
           world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
       .iterator;
   checkState(B, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(B, currentNode: B, stack: [D]);
-  Expect.equals(B, iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(B, currentNode: D, stack: []);
-  Expect.equals(D, iterator.current);
   Expect.isFalse(iterator.moveNext());
   checkState(B, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
           world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(B, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(B, currentNode: D, stack: []);
-  Expect.equals(D, iterator.current);
   Expect.isFalse(iterator.moveNext());
   checkState(B, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
       world.classHierarchy.getClassHierarchyNode(B),
@@ -224,71 +203,51 @@
         Instantiation.UNINSTANTIATED
       ])).iterator;
   checkState(B, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(B, currentNode: D, stack: []);
-  Expect.equals(D, iterator.current);
   Expect.isFalse(iterator.moveNext());
   checkState(B, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
           world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
       .iterator;
   checkState(A, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(A, currentNode: A, stack: [C, B]);
-  Expect.equals(A, iterator.current);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: C, stack: [E, F, G, B]);
-  Expect.equals(C, iterator.current);
+  checkState(A, currentNode: B, stack: [C, D]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: E, stack: [F, G, B]);
-  Expect.equals(E, iterator.current);
+  checkState(A, currentNode: D, stack: [C]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: F, stack: [G, B]);
-  Expect.equals(F, iterator.current);
+  checkState(A, currentNode: C, stack: [G, F, E]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: G, stack: [B]);
-  Expect.equals(G, iterator.current);
+  checkState(A, currentNode: E, stack: [G, F]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: B, stack: [D]);
-  Expect.equals(B, iterator.current);
+  checkState(A, currentNode: F, stack: [G]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: D, stack: []);
-  Expect.equals(D, iterator.current);
+  checkState(A, currentNode: G, stack: []);
   Expect.isFalse(iterator.moveNext());
   checkState(A, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
           world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
           includeRoot: false)
       .iterator;
   checkState(A, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: C, stack: [E, F, G, B]);
-  Expect.equals(C, iterator.current);
+  checkState(A, currentNode: B, stack: [C, D]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: E, stack: [F, G, B]);
-  Expect.equals(E, iterator.current);
+  checkState(A, currentNode: D, stack: [C]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: F, stack: [G, B]);
-  Expect.equals(F, iterator.current);
+  checkState(A, currentNode: C, stack: [G, F, E]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: G, stack: [B]);
-  Expect.equals(G, iterator.current);
+  checkState(A, currentNode: E, stack: [G, F]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: B, stack: [D]);
-  Expect.equals(B, iterator.current);
+  checkState(A, currentNode: F, stack: [G]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: D, stack: []);
-  Expect.equals(D, iterator.current);
+  checkState(A, currentNode: G, stack: []);
   Expect.isFalse(iterator.moveNext());
   checkState(A, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
       world.classHierarchy.getClassHierarchyNode(A),
@@ -297,28 +256,20 @@
         Instantiation.UNINSTANTIATED
       ])).iterator;
   checkState(A, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
   checkState(A, currentNode: A, stack: [C, B]);
-  Expect.equals(A, iterator.current);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: C, stack: [E, F, G, B]);
-  Expect.equals(C, iterator.current);
+  checkState(A, currentNode: D, stack: [C]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: E, stack: [F, G, B]);
-  Expect.equals(E, iterator.current);
+  checkState(A, currentNode: C, stack: [G, F, E]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: F, stack: [G, B]);
-  Expect.equals(F, iterator.current);
+  checkState(A, currentNode: E, stack: [G, F]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: G, stack: [B]);
-  Expect.equals(G, iterator.current);
+  checkState(A, currentNode: F, stack: [G]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: D, stack: []);
-  Expect.equals(D, iterator.current);
+  checkState(A, currentNode: G, stack: []);
   Expect.isFalse(iterator.moveNext());
   checkState(A, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 
   iterator = new ClassHierarchyNodeIterable(
           world.classHierarchy.getClassHierarchyNode(A),
@@ -329,25 +280,18 @@
           includeRoot: false)
       .iterator;
   checkState(A, currentNode: null, stack: null);
-  Expect.isNull(iterator.current);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: C, stack: [E, F, G, B]);
-  Expect.equals(C, iterator.current);
+  checkState(A, currentNode: D, stack: [C]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: E, stack: [F, G, B]);
-  Expect.equals(E, iterator.current);
+  checkState(A, currentNode: C, stack: [G, F, E]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: F, stack: [G, B]);
-  Expect.equals(F, iterator.current);
+  checkState(A, currentNode: E, stack: [G, F]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: G, stack: [B]);
-  Expect.equals(G, iterator.current);
+  checkState(A, currentNode: F, stack: [G]);
   Expect.isTrue(iterator.moveNext());
-  checkState(A, currentNode: D, stack: []);
-  Expect.equals(D, iterator.current);
+  checkState(A, currentNode: G, stack: []);
   Expect.isFalse(iterator.moveNext());
   checkState(A, currentNode: null, stack: []);
-  Expect.isNull(iterator.current);
 }
 
 testForEach() async {
@@ -361,8 +305,8 @@
       ///         H I
       ///
       class A implements X {}
-      class C extends A {}
       class B extends A {}
+      class C extends A {}
       class D extends B {}
       class E extends C {}
       class F extends C implements B {}
@@ -421,12 +365,12 @@
         "Actual: $visited, expected: $expected\n$classSet");
   }
 
-  checkForEachSubclass(A, [A, B, D, C, G, F, I, H, E]);
+  checkForEachSubclass(A, [A, B, D, C, E, F, H, I, G]);
   checkForEachSubclass(B, [B, D]);
-  checkForEachSubclass(C, [C, G, F, I, H, E]);
+  checkForEachSubclass(C, [C, E, F, H, I, G]);
   checkForEachSubclass(D, [D]);
   checkForEachSubclass(E, [E]);
-  checkForEachSubclass(F, [F, I, H]);
+  checkForEachSubclass(F, [F, H, I]);
   checkForEachSubclass(G, [G]);
   checkForEachSubclass(H, [H]);
   checkForEachSubclass(I, [I]);
@@ -458,16 +402,16 @@
         "Actual: $visited, expected: $expected\n$classSet");
   }
 
-  checkForEachSubtype(A, [A, B, D, C, G, F, I, H, E]);
-  checkForEachSubtype(B, [B, D, F, I, H, G]);
-  checkForEachSubtype(C, [C, G, F, I, H, E]);
+  checkForEachSubtype(A, [A, B, D, C, E, F, H, I, G]);
+  checkForEachSubtype(B, [B, D, F, H, I, G]);
+  checkForEachSubtype(C, [C, E, F, H, I, G]);
   checkForEachSubtype(D, [D, G]);
   checkForEachSubtype(E, [E]);
-  checkForEachSubtype(F, [F, I, H]);
+  checkForEachSubtype(F, [F, H, I]);
   checkForEachSubtype(G, [G]);
   checkForEachSubtype(H, [H]);
   checkForEachSubtype(I, [I]);
-  checkForEachSubtype(X, [X, A, B, D, C, G, F, I, H, E]);
+  checkForEachSubtype(X, [X, A, B, D, C, E, F, H, I, G]);
 
   void checkForEach(ClassEntity cls, List<ClassEntity> expected,
       {ClassEntity stop,
@@ -507,30 +451,30 @@
         "Actual: $visited, expected: $expected\n$classSet");
   }
 
-  checkForEach(A, [A, B, D, C, G, F, I, H, E]);
+  checkForEach(A, [A, B, D, C, E, F, H, I, G]);
   checkForEach(A, [A], stop: A);
-  checkForEach(A, [A, B, C, G, F, I, H, E], skipSubclasses: [B]);
+  checkForEach(A, [A, B, C, E, F, H, I, G], skipSubclasses: [B]);
   checkForEach(A, [A, B, C], skipSubclasses: [B, C]);
-  checkForEach(A, [A, B, C, G], stop: G, skipSubclasses: [B]);
+  checkForEach(A, [A, B, C, E, F], stop: F, skipSubclasses: [B]);
 
-  checkForEach(B, [B, D, F, I, H, G], forEachSubtype: true);
+  checkForEach(B, [B, D, F, H, I, G], forEachSubtype: true);
   checkForEach(B, [B, D], stop: D, forEachSubtype: true);
   checkForEach(B, [B, D, F, G], skipSubclasses: [F], forEachSubtype: true);
-  checkForEach(B, [B, F, I, H, G], skipSubclasses: [B], forEachSubtype: true);
-  checkForEach(B, [B, D, F, I, H, G],
+  checkForEach(B, [B, F, H, I, G], skipSubclasses: [B], forEachSubtype: true);
+  checkForEach(B, [B, D, F, H, I, G],
       skipSubclasses: [D], forEachSubtype: true);
 
-  checkForEach(X, [X, A, B, D, C, G, F, I, H, E], forEachSubtype: true);
+  checkForEach(X, [X, A, B, D, C, E, F, H, I, G], forEachSubtype: true);
   checkForEach(X, [X, A, B, D], stop: D, forEachSubtype: true);
-  checkForEach(X, [X, A, B, D, C, G, F, E],
+  checkForEach(X, [X, A, B, D, C, E, F, G],
       skipSubclasses: [F], forEachSubtype: true);
-  checkForEach(X, [X, A, B, D, C, G, F, I, H, E],
+  checkForEach(X, [X, A, B, D, C, E, F, H, I, G],
       skipSubclasses: [X], forEachSubtype: true);
-  checkForEach(X, [X, A, B, D, C, G, F, I, H, E],
+  checkForEach(X, [X, A, B, D, C, E, F, H, I, G],
       skipSubclasses: [D], forEachSubtype: true);
-  checkForEach(X, [A, D, C, G, F, I, H, E],
+  checkForEach(X, [A, D, C, E, F, H, I, G],
       forEachSubtype: true, mask: ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
-  checkForEach(X, [A, B, D, C, G, F, I, H, E],
+  checkForEach(X, [A, B, D, C, E, F, H, I, G],
       forEachSubtype: true, mask: ClassHierarchyNode.INSTANTIATED);
 
   void checkAny(ClassEntity cls, List<ClassEntity> expected,
@@ -566,21 +510,21 @@
         "Actual: $visited, expected: $expected\n$classSet");
   }
 
-  checkAny(A, [A, B, D, C, G, F, I, H, E], expectedResult: false);
+  checkAny(A, [A, B, D, C, E, F, H, I, G], expectedResult: false);
   checkAny(A, [A], find: A, expectedResult: true);
-  checkAny(A, [A, B, D, C, G, F, I], find: I, expectedResult: true);
+  checkAny(A, [A, B, D, C, E, F, H], find: H, expectedResult: true);
 
-  checkAny(B, [B, D, F, I, H, G], anySubtype: true, expectedResult: false);
-  checkAny(B, [B, D, F, I, H, G],
+  checkAny(B, [B, D, F, H, I, G], anySubtype: true, expectedResult: false);
+  checkAny(B, [B, D, F, H, I, G],
       find: A, anySubtype: true, expectedResult: false);
   checkAny(B, [B, D], find: D, anySubtype: true, expectedResult: true);
-  checkAny(B, [B, D, F, I], find: I, anySubtype: true, expectedResult: true);
+  checkAny(B, [B, D, F, H, I], find: I, anySubtype: true, expectedResult: true);
 
-  checkAny(X, [X, A, B, D, C, G, F, I, H, E],
+  checkAny(X, [X, A, B, D, C, E, F, H, I, G],
       anySubtype: true, expectedResult: false);
   checkAny(X, [X, A], find: A, anySubtype: true, expectedResult: true);
   checkAny(X, [X, A, B, D], find: D, anySubtype: true, expectedResult: true);
-  checkAny(X, [X, A, B, D, C, G, F, I],
+  checkAny(X, [X, A, B, D, C, E, F, H, I],
       find: I, anySubtype: true, expectedResult: true);
 }
 
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index 64b6506..3b16a86 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -65,6 +65,8 @@
 
   MemoryEnvironment(this._environment, [this.env = const <String, String>{}]);
 
+  bool get checkCasts => true;
+
   @override
   String readFromEnvironment(String name) => env[name];
 
diff --git a/tests/compiler/dart2js/model/enqueuer_test.dart b/tests/compiler/dart2js/model/enqueuer_test.dart
index 60c3fe6..8a8a6a6 100644
--- a/tests/compiler/dart2js/model/enqueuer_test.dart
+++ b/tests/compiler/dart2js/model/enqueuer_test.dart
@@ -177,8 +177,8 @@
         elementEnvironment.lookupConstructor(cls, '');
     InterfaceType type = elementEnvironment.getRawType(cls);
     WorldImpact impact = new WorldImpactBuilderImpl()
-      ..registerStaticUse(new StaticUse.typedConstructorInvoke(
-          constructor, constructor.parameterStructure.callStructure, type));
+      ..registerStaticUse(new StaticUse.typedConstructorInvoke(constructor,
+          constructor.parameterStructure.callStructure, type, null));
     enqueuer.applyImpact(impact);
   }
 
diff --git a/tests/compiler/dart2js/model/in_memory_split_test.dart b/tests/compiler/dart2js/model/in_memory_split_test.dart
deleted file mode 100644
index ab13b90..0000000
--- a/tests/compiler/dart2js/model/in_memory_split_test.dart
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:args/args.dart';
-import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/compiler.dart';
-import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/js_backend/inferred_data.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
-import 'package:compiler/src/serialization/serialization.dart';
-import 'package:compiler/src/types/types.dart';
-import 'package:expect/expect.dart';
-import 'package:front_end/src/fasta/kernel/utils.dart' as ir
-    show serializeComponent;
-import 'package:front_end/src/fasta/kernel/utils.dart';
-import 'package:kernel/ast.dart' as ir;
-import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
-import '../helpers/memory_compiler.dart';
-
-main(List<String> args) {
-  ArgParser argParser = new ArgParser(allowTrailingOptions: true);
-  argParser.addFlag('debug', abbr: 'd', defaultsTo: false);
-  argParser.addFlag('object', abbr: 'o', defaultsTo: false);
-  argParser.addFlag('kinds', abbr: 'k', defaultsTo: false);
-  ArgResults argResults = argParser.parse(args);
-
-  bool useObjectSink = argResults['object'] || argResults['debug'];
-  bool useDataKinds = argResults['kinds'] || argResults['debug'];
-
-  asyncTest(() async {
-    Uri entryPoint;
-    if (argResults.rest.isEmpty) {
-      entryPoint = Uri.base.resolve('samples-dev/swarm/swarm.dart');
-    } else {
-      entryPoint = Uri.base.resolve(nativeToUriPath(argResults.rest.last));
-    }
-
-    CompilationResult result = await runCompiler(
-        entryPoint: entryPoint,
-        beforeRun: (Compiler compiler) {
-          compiler.stopAfterTypeInference = true;
-        });
-    Expect.isTrue(result.isSuccess);
-    Compiler compiler = result.compiler;
-    GlobalTypeInferenceResults globalInferenceResults = cloneInferenceResults(
-        compiler, compiler.globalInference.resultsForTesting,
-        useObjectSink: useObjectSink, useDataKinds: useDataKinds);
-    compiler.generateJavaScriptCode(globalInferenceResults);
-  });
-}
-
-GlobalTypeInferenceResults cloneInferenceResults(
-    Compiler compiler, GlobalTypeInferenceResults results,
-    {bool useObjectSink: false, bool useDataKinds}) {
-  JsClosedWorld closedWorld = results.closedWorld;
-  InferredData inferredData = results.inferredData;
-  ir.Component component = closedWorld.elementMap.programEnv.mainComponent;
-  List<int> irData = ir.serializeComponent(component);
-
-  Function() getData;
-
-  DataSink sink;
-  if (useObjectSink) {
-    List data = [];
-    sink = new ObjectSink(data, useDataKinds: useDataKinds);
-    getData = () => data;
-  } else {
-    ByteSink byteSink = new ByteSink();
-    sink = new BinarySink(byteSink, useDataKinds: useDataKinds);
-    getData = () => byteSink.builder.takeBytes();
-  }
-  closedWorld.writeToDataSink(sink);
-  inferredData.writeToDataSink(sink);
-  results.writeToDataSink(sink);
-  sink.close();
-  var worldData = getData();
-  print('data size: ${worldData.length}');
-
-  ir.Component newComponent = new ir.Component();
-  new BinaryBuilder(irData).readComponent(newComponent);
-  DataSource source = useObjectSink
-      ? new ObjectSource(worldData, useDataKinds: useDataKinds)
-      : new BinarySourceImpl(worldData, useDataKinds: useDataKinds);
-  closedWorld = new JsClosedWorld.readFromDataSource(
-      compiler.options,
-      compiler.reporter,
-      compiler.environment,
-      compiler.abstractValueStrategy,
-      newComponent,
-      source);
-  inferredData = new InferredData.readFromDataSource(source, closedWorld);
-  results = new GlobalTypeInferenceResults.readFromDataSource(
-      source, closedWorld, inferredData);
-  return results;
-}
diff --git a/tests/compiler/dart2js/model/open_world_test.dart b/tests/compiler/dart2js/model/open_world_test.dart
new file mode 100644
index 0000000..b315b5c
--- /dev/null
+++ b/tests/compiler/dart2js/model/open_world_test.dart
@@ -0,0 +1,434 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/common_elements.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/ir/static_type.dart';
+import 'package:compiler/src/js_backend/native_data.dart';
+import 'package:compiler/src/universe/resolution_world_builder.dart';
+import 'package:compiler/src/universe/world_builder.dart';
+import '../helpers/memory_compiler.dart';
+
+main() {
+  asyncTest(() async {
+    await runTest();
+  });
+}
+
+runTest() async {
+  String classes = '''
+@JS()
+library lib;
+
+import 'package:js/js.dart';
+
+class A {}
+class A1 extends A {}
+class A2 extends A1 {}
+
+class B implements A {}
+class B1 extends B {}
+
+class C {}
+class C0 {}
+class C1 = C with A;
+class C2 extends C1 {}
+class C3 = C with C0, A;
+class C4 = C with A, C0;
+
+@JS()
+class D {}
+
+@JS()
+class D1 extends D {}
+
+''';
+
+  CommonElements commonElements;
+  NativeBasicData nativeBasicData;
+  ResolutionWorldBuilderImpl world;
+
+  List<ClassEntity> allClasses;
+
+  ClassEntity A;
+  ClassEntity A1;
+  ClassEntity A2;
+  ClassEntity B;
+  ClassEntity B1;
+  ClassEntity C;
+  ClassEntity C0;
+  ClassEntity C1;
+  ClassEntity C2;
+  ClassEntity C3;
+  ClassEntity C4;
+  ClassEntity D;
+  ClassEntity D1;
+
+  List<ClassRelation> allRelations = ClassRelation.values;
+  List<ClassRelation> notExact = [
+    ClassRelation.thisExpression,
+    ClassRelation.subtype
+  ];
+  List<ClassRelation> subtype = [ClassRelation.subtype];
+
+  run(List<String> liveClasses) async {
+    String source = '''
+$classes
+main() {
+${liveClasses.map((c) => '  new $c();').join('\n')}
+}
+''';
+    print('------------------------------------------------------------------');
+    print(source);
+    CompilationResult result =
+        await runCompiler(memorySourceFiles: {'main.dart': source});
+    Expect.isTrue(result.isSuccess);
+    Compiler compiler = result.compiler;
+    commonElements = compiler.frontendStrategy.commonElements;
+    ElementEnvironment elementEnvironment =
+        compiler.frontendStrategy.elementEnvironment;
+    nativeBasicData = compiler.frontendStrategy.nativeBasicData;
+    world = compiler.resolutionWorldBuilder;
+
+    ClassEntity findClass(String name) {
+      ClassEntity cls =
+          elementEnvironment.lookupClass(elementEnvironment.mainLibrary, name);
+      Expect.isNotNull(cls, 'Class $name not found.');
+      return cls;
+    }
+
+    allClasses = [
+      A = findClass('A'),
+      A1 = findClass('A1'),
+      A2 = findClass('A2'),
+      B = findClass('B'),
+      B1 = findClass('B1'),
+      C = findClass('C'),
+      C0 = findClass('C0'),
+      C1 = findClass('C1'),
+      C2 = findClass('C2'),
+      C3 = findClass('C3'),
+      C4 = findClass('C4'),
+      D = findClass('D'),
+      D1 = findClass('D1'),
+    ];
+  }
+
+  void check(
+      Map<ClassEntity, Map<ClassEntity, List<ClassRelation>>> expectedResults) {
+    for (ClassEntity cls in allClasses) {
+      for (ClassEntity memberHoldingClass in allClasses) {
+        Map<ClassEntity, List<ClassRelation>> memberResults =
+            expectedResults[memberHoldingClass] ?? {};
+        for (ClassRelation relation in allRelations) {
+          List<ClassRelation> expectRelations = memberResults[cls];
+          bool expectedResult =
+              expectRelations != null && expectRelations.contains(relation);
+          StrongModeConstraint constraint = new StrongModeConstraint(
+              commonElements, nativeBasicData, cls, relation);
+          Expect.equals(
+              expectedResult,
+              world.isInheritedInClass(
+                  memberHoldingClass, constraint.cls, constraint.relation),
+              "Unexpected results for member of $memberHoldingClass on a "
+              "receiver $constraint (cls=$cls, relation=$relation)");
+        }
+      }
+    }
+  }
+
+  await run([]);
+  check({});
+
+  await run(['A']);
+  check({
+    A: {A: allRelations},
+  });
+
+  await run(['A1']);
+  check({
+    A: {
+      A: notExact,
+      A1: allRelations,
+    },
+    A1: {
+      A: notExact,
+      A1: allRelations,
+    },
+  });
+
+  await run(['A', 'A1']);
+  check({
+    A: {
+      A: allRelations,
+      A1: allRelations,
+    },
+    A1: {
+      A: notExact,
+      A1: allRelations,
+    },
+  });
+
+  await run(['A2']);
+  check({
+    A: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+    A1: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+    A2: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+  });
+
+  await run(['A', 'A2']);
+  check({
+    A: {
+      A: allRelations,
+      A1: notExact,
+      A2: allRelations,
+    },
+    A1: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+    A2: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+  });
+
+  await run(['A1', 'A2']);
+  check({
+    A: {
+      A: notExact,
+      A1: allRelations,
+      A2: allRelations,
+    },
+    A1: {
+      A: notExact,
+      A1: allRelations,
+      A2: allRelations,
+    },
+    A2: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+  });
+
+  await run(['B']);
+  check({
+    B: {
+      A: subtype,
+      B: allRelations,
+    },
+  });
+
+  await run(['B1']);
+  check({
+    B: {
+      A: subtype,
+      B: notExact,
+      B1: allRelations,
+    },
+    B1: {
+      A: subtype,
+      B: notExact,
+      B1: allRelations,
+    },
+  });
+
+  await run(['A', 'A2', 'B']);
+  check({
+    A: {
+      A: allRelations,
+      A1: notExact,
+      A2: allRelations,
+    },
+    A1: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+    A2: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+    B: {A: subtype, B: allRelations},
+  });
+
+  await run(['C']);
+  check({
+    C: {
+      C: allRelations,
+    },
+  });
+
+  await run(['C1']);
+  check({
+    A: {
+      A: notExact,
+      C: notExact,
+      C1: allRelations,
+    },
+    C: {
+      A: notExact,
+      C: notExact,
+      C1: allRelations,
+    },
+    C1: {
+      A: notExact,
+      C: notExact,
+      C1: allRelations,
+    },
+  });
+
+  await run(['C2']);
+  check({
+    A: {
+      A: notExact,
+      C: notExact,
+      C1: notExact,
+      C2: allRelations,
+    },
+    C: {
+      A: notExact,
+      C: notExact,
+      C1: notExact,
+      C2: allRelations,
+    },
+    C1: {
+      A: notExact,
+      C: notExact,
+      C1: notExact,
+      C2: allRelations,
+    },
+    C2: {
+      A: notExact,
+      C: notExact,
+      C1: notExact,
+      C2: allRelations,
+    },
+  });
+
+  await run(['C3']);
+  check({
+    A: {
+      A: notExact,
+      C: notExact,
+      C0: notExact,
+      C3: allRelations,
+    },
+    C: {
+      A: notExact,
+      C: notExact,
+      C0: notExact,
+      C3: allRelations,
+    },
+    C0: {
+      A: notExact,
+      C: notExact,
+      C0: notExact,
+      C3: allRelations,
+    },
+    C3: {
+      A: notExact,
+      C: notExact,
+      C0: notExact,
+      C3: allRelations,
+    },
+  });
+
+  await run(['C4']);
+  check({
+    A: {
+      A: notExact,
+      C: notExact,
+      C0: notExact,
+      C4: allRelations,
+    },
+    C: {
+      A: notExact,
+      C: notExact,
+      C0: notExact,
+      C4: allRelations,
+    },
+    C0: {
+      A: notExact,
+      C: notExact,
+      C0: notExact,
+      C4: allRelations,
+    },
+    C4: {
+      A: notExact,
+      C: notExact,
+      C0: notExact,
+      C4: allRelations,
+    },
+  });
+
+  await run(['A2', 'C1']);
+  check({
+    A: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+      C: notExact,
+      C1: allRelations,
+    },
+    A1: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+    A2: {
+      A: notExact,
+      A1: notExact,
+      A2: allRelations,
+    },
+    C: {
+      A: notExact,
+      C: notExact,
+      C1: allRelations,
+    },
+    C1: {
+      A: notExact,
+      C: notExact,
+      C1: allRelations,
+    },
+  });
+
+  await run(['D']);
+  check({
+    D: {
+      D: allRelations,
+      D1: allRelations,
+    },
+  });
+  await run(['D1']);
+  check({
+    D: {
+      D: allRelations,
+      D1: allRelations,
+    },
+    D1: {
+      D: allRelations,
+      D1: allRelations,
+    },
+  });
+}
diff --git a/tests/compiler/dart2js/model/sha1_long_test_vectors.dart b/tests/compiler/dart2js/model/sha1_long_test_vectors.dart
deleted file mode 100644
index 2346aef..0000000
--- a/tests/compiler/dart2js/model/sha1_long_test_vectors.dart
+++ /dev/null
@@ -1,210222 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of sha1_test;
-
-// Standard test vectors from:
-//   http://csrc.nist.gov/groups/STM/cavp/documents/shs/shabytetestvectors.zip
-
-const sha1_long_inputs = const [
-  const [
-    0x7c,
-    0x9c,
-    0x67,
-    0x32,
-    0x3a,
-    0x1d,
-    0xf1,
-    0xad,
-    0xbf,
-    0xe5,
-    0xce,
-    0xb4,
-    0x15,
-    0xea,
-    0xef,
-    0x01,
-    0x55,
-    0xec,
-    0xe2,
-    0x82,
-    0x0f,
-    0x4d,
-    0x50,
-    0xc1,
-    0xec,
-    0x22,
-    0xcb,
-    0xa4,
-    0x92,
-    0x8a,
-    0xc6,
-    0x56,
-    0xc8,
-    0x3f,
-    0xe5,
-    0x85,
-    0xdb,
-    0x6a,
-    0x78,
-    0xce,
-    0x40,
-    0xbc,
-    0x42,
-    0x75,
-    0x7a,
-    0xba,
-    0x7e,
-    0x5a,
-    0x3f,
-    0x58,
-    0x24,
-    0x28,
-    0xd6,
-    0xca,
-    0x68,
-    0xd0,
-    0xc3,
-    0x97,
-    0x83,
-    0x36,
-    0xa6,
-    0xef,
-    0xb7,
-    0x29,
-    0x61,
-    0x3e,
-    0x8d,
-    0x99,
-    0x79,
-    0x01,
-    0x62,
-    0x04,
-    0xbf,
-    0xd9,
-    0x21,
-    0x32,
-    0x2f,
-    0xdd,
-    0x52,
-    0x22,
-    0x18,
-    0x35,
-    0x54,
-    0x44,
-    0x7d,
-    0xe5,
-    0xe6,
-    0xe9,
-    0xbb,
-    0xe6,
-    0xed,
-    0xf7,
-    0x6d,
-    0x7b,
-    0x71,
-    0xe1,
-    0x8d,
-    0xc2,
-    0xe8,
-    0xd6,
-    0xdc,
-    0x89,
-    0xb7,
-    0x39,
-    0x83,
-    0x64,
-    0xf6,
-    0x52,
-    0xfa,
-    0xfc,
-    0x73,
-    0x43,
-    0x29,
-    0xaa,
-    0xfa,
-    0x3d,
-    0xcd,
-    0x45,
-    0xd4,
-    0xf3,
-    0x1e,
-    0x38,
-    0x8e,
-    0x4f,
-    0xaf,
-    0xd7,
-    0xfc,
-    0x64,
-    0x95,
-    0xf3,
-    0x7c,
-    0xa5,
-    0xcb,
-    0xab,
-    0x7f,
-    0x54,
-    0xd5,
-    0x86,
-    0x46,
-    0x3d,
-    0xa4,
-    0xbf,
-    0xea,
-    0xa3,
-    0xba,
-    0xe0,
-    0x9f,
-    0x7b,
-    0x8e,
-    0x92,
-    0x39,
-    0xd8,
-    0x32,
-    0xb4,
-    0xf0,
-    0xa7,
-    0x33,
-    0xaa,
-    0x60,
-    0x9c,
-    0xc1,
-    0xf8,
-    0xd4
-  ],
-  const [
-    0x6c,
-    0xb7,
-    0x0d,
-    0x19,
-    0xc0,
-    0x96,
-    0x20,
-    0x0f,
-    0x92,
-    0x49,
-    0xd2,
-    0xdb,
-    0xc0,
-    0x42,
-    0x99,
-    0xb0,
-    0x08,
-    0x5e,
-    0xb0,
-    0x68,
-    0x25,
-    0x75,
-    0x60,
-    0xbe,
-    0x3a,
-    0x30,
-    0x7d,
-    0xbd,
-    0x74,
-    0x1a,
-    0x33,
-    0x78,
-    0xeb,
-    0xfa,
-    0x03,
-    0xfc,
-    0xca,
-    0x61,
-    0x08,
-    0x83,
-    0xb0,
-    0x7f,
-    0x7f,
-    0xea,
-    0x56,
-    0x3a,
-    0x86,
-    0x65,
-    0x71,
-    0x82,
-    0x24,
-    0x72,
-    0xda,
-    0xde,
-    0x8a,
-    0x0b,
-    0xec,
-    0x4b,
-    0x98,
-    0x20,
-    0x2d,
-    0x47,
-    0xa3,
-    0x44,
-    0x31,
-    0x29,
-    0x76,
-    0xa7,
-    0xbc,
-    0xb3,
-    0x96,
-    0x44,
-    0x27,
-    0xea,
-    0xcb,
-    0x5b,
-    0x05,
-    0x25,
-    0xdb,
-    0x22,
-    0x06,
-    0x65,
-    0x99,
-    0xb8,
-    0x1b,
-    0xe4,
-    0x1e,
-    0x5a,
-    0xda,
-    0xf1,
-    0x57,
-    0xd9,
-    0x25,
-    0xfa,
-    0xc0,
-    0x4b,
-    0x06,
-    0xeb,
-    0x6e,
-    0x01,
-    0xde,
-    0xb7,
-    0x53,
-    0xba,
-    0xbf,
-    0x33,
-    0xbe,
-    0x16,
-    0x16,
-    0x2b,
-    0x21,
-    0x4e,
-    0x8d,
-    0xb0,
-    0x17,
-    0x21,
-    0x2f,
-    0xaf,
-    0xa5,
-    0x12,
-    0xcd,
-    0xc8,
-    0xc0,
-    0xd0,
-    0xa1,
-    0x5c,
-    0x10,
-    0xf6,
-    0x32,
-    0xe8,
-    0xf4,
-    0xf4,
-    0x77,
-    0x92,
-    0xc6,
-    0x4d,
-    0x3f,
-    0x02,
-    0x60,
-    0x04,
-    0xd1,
-    0x73,
-    0xdf,
-    0x50,
-    0xcf,
-    0x0a,
-    0xa7,
-    0x97,
-    0x60,
-    0x66,
-    0xa7,
-    0x9a,
-    0x8d,
-    0x78,
-    0xde,
-    0xee,
-    0xec,
-    0x95,
-    0x1d,
-    0xab,
-    0x7c,
-    0xc9,
-    0x0f,
-    0x68,
-    0xd1,
-    0x6f,
-    0x78,
-    0x66,
-    0x71,
-    0xfe,
-    0xba,
-    0x0b,
-    0x7d,
-    0x26,
-    0x9d,
-    0x92,
-    0x94,
-    0x1c,
-    0x4f,
-    0x02,
-    0xf4,
-    0x32,
-    0xaa,
-    0x5c,
-    0xe2,
-    0xaa,
-    0xb6,
-    0x19,
-    0x4d,
-    0xcc,
-    0x6f,
-    0xd3,
-    0xae,
-    0x36,
-    0xc8,
-    0x43,
-    0x32,
-    0x74,
-    0xef,
-    0x6b,
-    0x1b,
-    0xd0,
-    0xd3,
-    0x14,
-    0x63,
-    0x6b,
-    0xe4,
-    0x7b,
-    0xa3,
-    0x8d,
-    0x19,
-    0x48,
-    0x34,
-    0x3a,
-    0x38,
-    0xbf,
-    0x94,
-    0x06,
-    0x52,
-    0x3a,
-    0x0b,
-    0x2a,
-    0x8c,
-    0xd7,
-    0x8e,
-    0xd6,
-    0x26,
-    0x6e,
-    0xe3,
-    0xc9,
-    0xb5,
-    0xc6,
-    0x06,
-    0x20,
-    0xb3,
-    0x08,
-    0xcc,
-    0x6b,
-    0x3a,
-    0x73,
-    0xc6,
-    0x06,
-    0x0d,
-    0x52,
-    0x68,
-    0xa7,
-    0xd8,
-    0x2b,
-    0x6a,
-    0x33,
-    0xb9,
-    0x3a,
-    0x6f,
-    0xd6,
-    0xfe,
-    0x1d,
-    0xe5,
-    0x52,
-    0x31,
-    0xd1,
-    0x2c,
-    0x97
-  ],
-  const [
-    0x64,
-    0x87,
-    0x97,
-    0x2d,
-    0x88,
-    0xd0,
-    0xdd,
-    0x39,
-    0x0d,
-    0x8d,
-    0x09,
-    0xd1,
-    0x34,
-    0x86,
-    0x0f,
-    0x26,
-    0x3f,
-    0x88,
-    0xdf,
-    0x7a,
-    0x34,
-    0x12,
-    0x45,
-    0x7a,
-    0xdf,
-    0x51,
-    0x0d,
-    0xcf,
-    0x16,
-    0x4e,
-    0x6c,
-    0xf0,
-    0x41,
-    0x67,
-    0x9b,
-    0x3a,
-    0x19,
-    0xfc,
-    0xc5,
-    0x42,
-    0xaf,
-    0x6a,
-    0x23,
-    0x6a,
-    0xb0,
-    0x3d,
-    0x66,
-    0xb2,
-    0xe8,
-    0xa1,
-    0x55,
-    0xd1,
-    0x06,
-    0x1a,
-    0xb7,
-    0x85,
-    0x9f,
-    0x75,
-    0x73,
-    0x27,
-    0x75,
-    0xff,
-    0xf6,
-    0x82,
-    0xf8,
-    0xf4,
-    0xd5,
-    0xe5,
-    0x0d,
-    0x3a,
-    0xb3,
-    0x77,
-    0x0f,
-    0x4f,
-    0x66,
-    0xcb,
-    0x13,
-    0x81,
-    0x55,
-    0xb4,
-    0x71,
-    0x5d,
-    0x24,
-    0x5b,
-    0x80,
-    0x69,
-    0x94,
-    0x8e,
-    0xa0,
-    0x16,
-    0xa4,
-    0x5b,
-    0x7e,
-    0xf0,
-    0xfd,
-    0xde,
-    0x93,
-    0x18,
-    0x8c,
-    0x57,
-    0xee,
-    0xf4,
-    0x71,
-    0x7f,
-    0x34,
-    0x25,
-    0x18,
-    0x1d,
-    0xe5,
-    0xb9,
-    0xa5,
-    0xd4,
-    0xe0,
-    0xa2,
-    0x96,
-    0x3f,
-    0x2a,
-    0x67,
-    0xa3,
-    0x40,
-    0xeb,
-    0x1a,
-    0xe9,
-    0x94,
-    0xb9,
-    0x8a,
-    0x48,
-    0xab,
-    0x19,
-    0xb9,
-    0x0a,
-    0xb7,
-    0x43,
-    0x91,
-    0xc5,
-    0x04,
-    0x26,
-    0xd2,
-    0x82,
-    0x87,
-    0xac,
-    0x4f,
-    0x1e,
-    0xb9,
-    0x3f,
-    0x5a,
-    0xf1,
-    0xa6,
-    0x8c,
-    0x7d,
-    0xae,
-    0x40,
-    0x87,
-    0x6b,
-    0x8a,
-    0xfa,
-    0xaf,
-    0x35,
-    0xa1,
-    0x92,
-    0x93,
-    0xc1,
-    0x95,
-    0x2e,
-    0x95,
-    0x79,
-    0x78,
-    0xab,
-    0xee,
-    0x40,
-    0xec,
-    0x32,
-    0xf2,
-    0xaa,
-    0x88,
-    0x0c,
-    0x95,
-    0x6c,
-    0x7e,
-    0xb7,
-    0x2f,
-    0x11,
-    0x7b,
-    0x39,
-    0x7c,
-    0xef,
-    0xcf,
-    0xb4,
-    0xe7,
-    0x5a,
-    0xce,
-    0x3b,
-    0x08,
-    0x17,
-    0x76,
-    0xe4,
-    0x6b,
-    0x13,
-    0x52,
-    0x1e,
-    0x93,
-    0x55,
-    0x9d,
-    0x45,
-    0x3e,
-    0x32,
-    0xab,
-    0x74,
-    0xeb,
-    0xc0,
-    0x85,
-    0x9b,
-    0x9a,
-    0x8d,
-    0xd4,
-    0xd1,
-    0xd3,
-    0x90,
-    0x00,
-    0xeb,
-    0xe9,
-    0x5f,
-    0x98,
-    0x4d,
-    0x80,
-    0xa3,
-    0xf5,
-    0x00,
-    0x4d,
-    0xc9,
-    0x1a,
-    0x05,
-    0x1d,
-    0xfb,
-    0xdf,
-    0xe9,
-    0x19,
-    0x4f,
-    0x4f,
-    0x9a,
-    0x48,
-    0x3e,
-    0x4e,
-    0x79,
-    0x55,
-    0x57,
-    0x7f,
-    0xb0,
-    0x93,
-    0x34,
-    0x64,
-    0xc6,
-    0x3e,
-    0xae,
-    0xc7,
-    0x71,
-    0x04,
-    0x4d,
-    0x59,
-    0xab,
-    0xc3,
-    0x02,
-    0x9a,
-    0x07,
-    0x95,
-    0x19,
-    0xf8,
-    0x46,
-    0x0a,
-    0x69,
-    0x3b,
-    0x25,
-    0xb4,
-    0xce,
-    0x20,
-    0x7a,
-    0xe9,
-    0xd9,
-    0x44,
-    0x7f,
-    0xc4,
-    0xc5,
-    0x44,
-    0x6e,
-    0x6d,
-    0xad,
-    0x23,
-    0x4e,
-    0x9a,
-    0xfd,
-    0xec,
-    0x0c,
-    0x56,
-    0x27,
-    0x98,
-    0xcd,
-    0x02,
-    0x97,
-    0x31,
-    0x83,
-    0x99,
-    0xe8,
-    0x38,
-    0xbe,
-    0x38,
-    0x58,
-    0x45,
-    0xc6,
-    0xdd,
-    0x79,
-    0xed,
-    0xe6,
-    0x6e,
-    0x2a,
-    0xe8,
-    0x0a,
-    0xfe,
-    0xc6,
-    0x73,
-    0x8d,
-    0x4d,
-    0x9b,
-    0xf4,
-    0x4c,
-    0x8d,
-    0x9e,
-    0xdd,
-    0xff,
-    0x6c,
-    0x5c,
-    0xd2,
-    0xc9,
-    0x4e,
-    0x34,
-    0x0e,
-    0x0d,
-    0xda,
-    0xc4,
-    0x03,
-    0x84,
-    0xb9,
-    0xa1,
-    0x40,
-    0x8c,
-    0x9a,
-    0x4b,
-    0x98,
-    0xc3,
-    0x7a,
-    0x60,
-    0x81,
-    0xd5,
-    0x22,
-    0x0f,
-    0xba,
-    0x92,
-    0xf1,
-    0xd0,
-    0x31,
-    0x44,
-    0xdb
-  ],
-  const [
-    0xbd,
-    0x74,
-    0xe7,
-    0xf6,
-    0x07,
-    0xcd,
-    0x7d,
-    0x90,
-    0x5e,
-    0x90,
-    0x17,
-    0x5d,
-    0x67,
-    0x65,
-    0x0a,
-    0x6d,
-    0xc2,
-    0xf8,
-    0xa4,
-    0xe2,
-    0xd4,
-    0xab,
-    0x12,
-    0x49,
-    0xca,
-    0x88,
-    0x81,
-    0x2b,
-    0xda,
-    0x79,
-    0x84,
-    0xde,
-    0xcc,
-    0xbb,
-    0xb6,
-    0xa1,
-    0xba,
-    0x90,
-    0xa0,
-    0xe9,
-    0x14,
-    0x34,
-    0xdd,
-    0xf5,
-    0xe6,
-    0x13,
-    0x7b,
-    0xa8,
-    0x5e,
-    0x39,
-    0xa5,
-    0x98,
-    0x89,
-    0x0a,
-    0x7f,
-    0x63,
-    0x5d,
-    0x33,
-    0x52,
-    0x42,
-    0xfc,
-    0xe0,
-    0xe9,
-    0xe0,
-    0x37,
-    0x30,
-    0x3b,
-    0x6c,
-    0x51,
-    0xe5,
-    0x4a,
-    0xec,
-    0x06,
-    0x61,
-    0x4a,
-    0xd5,
-    0xcc,
-    0xce,
-    0x06,
-    0xd9,
-    0x59,
-    0x9c,
-    0x80,
-    0x01,
-    0x65,
-    0x30,
-    0xd7,
-    0xfb,
-    0xb1,
-    0xda,
-    0x6e,
-    0xb5,
-    0x48,
-    0x08,
-    0x4b,
-    0x2b,
-    0x05,
-    0xba,
-    0xbd,
-    0x7d,
-    0x55,
-    0x36,
-    0x42,
-    0x44,
-    0x3e,
-    0xfd,
-    0xa7,
-    0x26,
-    0xa1,
-    0xfd,
-    0x71,
-    0xa8,
-    0xbc,
-    0x08,
-    0x7c,
-    0x44,
-    0xf2,
-    0x85,
-    0xe2,
-    0xbc,
-    0xcf,
-    0x66,
-    0x1e,
-    0xad,
-    0x47,
-    0x5a,
-    0x72,
-    0x67,
-    0x3e,
-    0x43,
-    0x86,
-    0xfc,
-    0x4e,
-    0xea,
-    0x51,
-    0x97,
-    0xc4,
-    0xf1,
-    0x3c,
-    0x0f,
-    0xeb,
-    0x0a,
-    0x85,
-    0xbc,
-    0x8e,
-    0x67,
-    0xe2,
-    0x8a,
-    0xb8,
-    0x72,
-    0x68,
-    0x4b,
-    0xbe,
-    0xbd,
-    0xaa,
-    0x52,
-    0x7f,
-    0x3c,
-    0x25,
-    0x3d,
-    0xeb,
-    0xb2,
-    0xdc,
-    0x12,
-    0xc2,
-    0x69,
-    0x3f,
-    0x8e,
-    0x9e,
-    0x26,
-    0x51,
-    0xb9,
-    0x34,
-    0x5c,
-    0x0a,
-    0xbe,
-    0xd7,
-    0xa0,
-    0xfa,
-    0xfa,
-    0x3e,
-    0x5d,
-    0x30,
-    0x53,
-    0x86,
-    0xc9,
-    0x5a,
-    0xcb,
-    0x7a,
-    0x17,
-    0x2e,
-    0x54,
-    0x13,
-    0xef,
-    0x08,
-    0xe7,
-    0x3b,
-    0x1b,
-    0xd4,
-    0xd0,
-    0xd6,
-    0x83,
-    0x2e,
-    0x4c,
-    0x03,
-    0x5b,
-    0xc8,
-    0x55,
-    0x9f,
-    0x9b,
-    0x0c,
-    0xbd,
-    0x0c,
-    0xaf,
-    0x03,
-    0x7a,
-    0x30,
-    0x70,
-    0x76,
-    0x41,
-    0xc0,
-    0x54,
-    0x53,
-    0x56,
-    0xbe,
-    0xe1,
-    0x51,
-    0xa2,
-    0x40,
-    0x68,
-    0xd7,
-    0x06,
-    0x74,
-    0xef,
-    0x1b,
-    0xef,
-    0xe1,
-    0x6f,
-    0x87,
-    0x2a,
-    0xef,
-    0x40,
-    0x60,
-    0xfa,
-    0xaa,
-    0xd1,
-    0xa9,
-    0x68,
-    0xc3,
-    0x9c,
-    0x45,
-    0xdb,
-    0xd7,
-    0x59,
-    0x5d,
-    0xe8,
-    0xf4,
-    0x72,
-    0x01,
-    0x6b,
-    0x5a,
-    0xb8,
-    0x12,
-    0xd7,
-    0x7e,
-    0x54,
-    0x5f,
-    0xca,
-    0x55,
-    0x00,
-    0x0e,
-    0xe5,
-    0xce,
-    0x77,
-    0x3e,
-    0xda,
-    0xa1,
-    0x29,
-    0xea,
-    0xc6,
-    0x47,
-    0x34,
-    0x10,
-    0xc2,
-    0x49,
-    0x90,
-    0x13,
-    0xb4,
-    0xbe,
-    0x89,
-    0x5f,
-    0x6c,
-    0x0f,
-    0x73,
-    0x4b,
-    0xec,
-    0xfe,
-    0x99,
-    0x43,
-    0x06,
-    0xe7,
-    0x76,
-    0x26,
-    0x2d,
-    0x45,
-    0x28,
-    0xed,
-    0x85,
-    0x77,
-    0x21,
-    0x8e,
-    0x3c,
-    0xc5,
-    0x20,
-    0x1f,
-    0x1d,
-    0x9e,
-    0x5f,
-    0x3f,
-    0x62,
-    0x23,
-    0x0e,
-    0xb2,
-    0xca,
-    0xea,
-    0x01,
-    0x4b,
-    0xec,
-    0xfb,
-    0xa6,
-    0x0f,
-    0xcb,
-    0x1f,
-    0x39,
-    0x97,
-    0xaa,
-    0x5b,
-    0x3b,
-    0xb6,
-    0x22,
-    0xb7,
-    0x20,
-    0x5c,
-    0x71,
-    0x43,
-    0x48,
-    0xba,
-    0x15,
-    0x5c,
-    0x30,
-    0xa7,
-    0x9a,
-    0x2c,
-    0xea,
-    0x43,
-    0xb0,
-    0x70,
-    0xca,
-    0xda,
-    0x80,
-    0x7e,
-    0x63,
-    0x0b,
-    0x40,
-    0x86,
-    0xb1,
-    0x29,
-    0x05,
-    0x18,
-    0x98,
-    0xe1,
-    0xd9,
-    0xe6,
-    0x8d,
-    0x1d,
-    0x0e,
-    0xcc,
-    0x94,
-    0x29,
-    0xd2,
-    0x0d,
-    0x6a,
-    0x14,
-    0x03,
-    0xe0,
-    0x03,
-    0x5a,
-    0x44,
-    0x2b,
-    0x37,
-    0xbf,
-    0x50,
-    0x8e,
-    0xb8,
-    0x7e,
-    0x8e,
-    0xa3,
-    0x47,
-    0xa3,
-    0xe6,
-    0x84,
-    0x27,
-    0xb6,
-    0xd4,
-    0x8e,
-    0xd2,
-    0x99,
-    0xba,
-    0x65,
-    0xec,
-    0xb3,
-    0x7b,
-    0x38,
-    0x75,
-    0x4f,
-    0x45,
-    0x47,
-    0x42,
-    0x3e,
-    0xae,
-    0xa2,
-    0xae,
-    0xc4,
-    0x03,
-    0x33,
-    0x8d,
-    0xb2,
-    0xdc,
-    0xfe,
-    0x61,
-    0xcf,
-    0xf4,
-    0xa8,
-    0xd1,
-    0x7c,
-    0x38,
-    0x36,
-    0x56,
-    0x98,
-    0x1e,
-    0x18,
-    0x38,
-    0xa2,
-    0x38,
-    0x66,
-    0xb9,
-    0x1d,
-    0x09,
-    0x69,
-    0x8f,
-    0x39,
-    0x17,
-    0x5d,
-    0x98,
-    0xaf,
-    0x41,
-    0x75,
-    0xca,
-    0xed,
-    0x53
-  ],
-  const [
-    0xa5,
-    0x26,
-    0x38,
-    0xf0,
-    0xef,
-    0xb1,
-    0x9b,
-    0xff,
-    0x5e,
-    0xc9,
-    0x5f,
-    0xcd,
-    0xe4,
-    0xac,
-    0x9a,
-    0xab,
-    0xd9,
-    0x5e,
-    0x14,
-    0xd2,
-    0xe5,
-    0xf8,
-    0x4c,
-    0x55,
-    0x1f,
-    0x43,
-    0xbc,
-    0x53,
-    0x76,
-    0x85,
-    0x5e,
-    0x71,
-    0x51,
-    0x9b,
-    0x6f,
-    0x87,
-    0x72,
-    0x48,
-    0x73,
-    0x9a,
-    0x20,
-    0xcd,
-    0x79,
-    0x0b,
-    0x85,
-    0xba,
-    0xa0,
-    0x0d,
-    0x55,
-    0x03,
-    0xda,
-    0x5c,
-    0xb0,
-    0x56,
-    0xf0,
-    0x2d,
-    0x4a,
-    0xac,
-    0xc7,
-    0x60,
-    0xc9,
-    0x1f,
-    0xe1,
-    0xfd,
-    0x6e,
-    0xfb,
-    0x26,
-    0xde,
-    0xf8,
-    0x17,
-    0xe5,
-    0xa9,
-    0xc5,
-    0x66,
-    0x16,
-    0x02,
-    0x3b,
-    0xc9,
-    0xe2,
-    0xfe,
-    0x66,
-    0x27,
-    0x65,
-    0xda,
-    0xe2,
-    0xc0,
-    0xb2,
-    0xed,
-    0xfc,
-    0xbe,
-    0x17,
-    0xdb,
-    0x14,
-    0x0d,
-    0xa3,
-    0x0c,
-    0x46,
-    0x6d,
-    0xe6,
-    0x5c,
-    0x49,
-    0xc6,
-    0xf8,
-    0x14,
-    0x96,
-    0xbb,
-    0xbd,
-    0x1a,
-    0xcd,
-    0x81,
-    0x66,
-    0x64,
-    0x55,
-    0xf2,
-    0x3b,
-    0xb2,
-    0x43,
-    0xdd,
-    0x98,
-    0x7d,
-    0x7e,
-    0xa1,
-    0x36,
-    0x2a,
-    0x20,
-    0xfa,
-    0xac,
-    0x84,
-    0x1f,
-    0x1a,
-    0x36,
-    0x69,
-    0x2c,
-    0xfc,
-    0xb4,
-    0xc3,
-    0xdb,
-    0xf5,
-    0xf6,
-    0xbb,
-    0x05,
-    0x8c,
-    0x36,
-    0x29,
-    0x6b,
-    0x8b,
-    0xe6,
-    0x4e,
-    0x9b,
-    0x56,
-    0xad,
-    0xc5,
-    0x18,
-    0x7c,
-    0xac,
-    0xb7,
-    0xb5,
-    0x8c,
-    0x05,
-    0x4f,
-    0x42,
-    0x2a,
-    0x9e,
-    0x6d,
-    0x6a,
-    0x61,
-    0x22,
-    0x9f,
-    0xdc,
-    0x3b,
-    0x49,
-    0x4d,
-    0xa9,
-    0x8f,
-    0x5a,
-    0x33,
-    0xed,
-    0x1b,
-    0xee,
-    0x14,
-    0xb2,
-    0xd2,
-    0xf6,
-    0xad,
-    0x11,
-    0x77,
-    0xff,
-    0xe9,
-    0x9a,
-    0x6b,
-    0xb5,
-    0x53,
-    0xf7,
-    0xc4,
-    0xa6,
-    0xd0,
-    0xcb,
-    0x9e,
-    0x49,
-    0x8e,
-    0xe0,
-    0xb6,
-    0x3f,
-    0x38,
-    0x82,
-    0x35,
-    0xd8,
-    0x6c,
-    0x26,
-    0xc9,
-    0xd9,
-    0x6e,
-    0x50,
-    0xfa,
-    0x7d,
-    0x1e,
-    0xb3,
-    0xbc,
-    0xb9,
-    0x27,
-    0x99,
-    0x40,
-    0xc4,
-    0x7a,
-    0x85,
-    0x10,
-    0xd7,
-    0xfb,
-    0x17,
-    0x5b,
-    0x32,
-    0x79,
-    0x31,
-    0x8d,
-    0x5f,
-    0xe4,
-    0x58,
-    0x23,
-    0xba,
-    0xba,
-    0x5d,
-    0xbe,
-    0x31,
-    0xc3,
-    0x3c,
-    0x76,
-    0x49,
-    0xfe,
-    0x44,
-    0x70,
-    0x61,
-    0xdb,
-    0x78,
-    0xb3,
-    0x3b,
-    0xaa,
-    0x36,
-    0x37,
-    0xb8,
-    0x54,
-    0x16,
-    0x3f,
-    0xe3,
-    0x49,
-    0x15,
-    0xe9,
-    0x31,
-    0xb9,
-    0xf3,
-    0x04,
-    0x08,
-    0x07,
-    0xd9,
-    0x21,
-    0x7d,
-    0x7b,
-    0x3f,
-    0xed,
-    0x62,
-    0x37,
-    0x0d,
-    0xbe,
-    0x80,
-    0x6c,
-    0x00,
-    0x6b,
-    0x21,
-    0xcd,
-    0x50,
-    0x61,
-    0xd2,
-    0x44,
-    0x90,
-    0xf3,
-    0x66,
-    0xe4,
-    0xd5,
-    0xf2,
-    0x3e,
-    0x20,
-    0x1a,
-    0x7e,
-    0xc8,
-    0x3a,
-    0xe3,
-    0x1b,
-    0x46,
-    0xfe,
-    0x21,
-    0x08,
-    0xd1,
-    0xaf,
-    0x56,
-    0xcc,
-    0x9d,
-    0x42,
-    0xf9,
-    0x11,
-    0x7e,
-    0xca,
-    0x1c,
-    0xb5,
-    0xab,
-    0x34,
-    0x4c,
-    0x1f,
-    0xc3,
-    0x34,
-    0xb9,
-    0xcf,
-    0x0d,
-    0x7f,
-    0x97,
-    0x39,
-    0x04,
-    0x3b,
-    0xc3,
-    0xd4,
-    0x13,
-    0xb3,
-    0xaa,
-    0x6e,
-    0x9d,
-    0x50,
-    0x67,
-    0xc2,
-    0x40,
-    0xc5,
-    0x2b,
-    0x4c,
-    0x5b,
-    0x89,
-    0xe2,
-    0x5c,
-    0xcd,
-    0x8a,
-    0x13,
-    0x6a,
-    0x00,
-    0x20,
-    0x08,
-    0xa9,
-    0x27,
-    0x3f,
-    0x30,
-    0xde,
-    0xc3,
-    0xf2,
-    0xc1,
-    0x73,
-    0x6c,
-    0x04,
-    0xa1,
-    0xc7,
-    0xce,
-    0x00,
-    0x87,
-    0xc9,
-    0xf2,
-    0x5d,
-    0x5e,
-    0xc5,
-    0xbf,
-    0xf2,
-    0xea,
-    0x7e,
-    0xc0,
-    0xb0,
-    0xad,
-    0x7c,
-    0x27,
-    0x8f,
-    0x0c,
-    0xa7,
-    0x12,
-    0xc9,
-    0xae,
-    0x15,
-    0x0e,
-    0x47,
-    0x25,
-    0x21,
-    0xd9,
-    0x58,
-    0xd0,
-    0xbd,
-    0x6d,
-    0xa9,
-    0xff,
-    0x09,
-    0x39,
-    0x72,
-    0x59,
-    0x24,
-    0xb2,
-    0xed,
-    0x7b,
-    0x41,
-    0x0a,
-    0x0c,
-    0xe2,
-    0xfe,
-    0x3f,
-    0x6b,
-    0x0b,
-    0xf2,
-    0x58,
-    0x84,
-    0xd8,
-    0x85,
-    0xec,
-    0x22,
-    0x36,
-    0x05,
-    0xe3,
-    0x18,
-    0xfd,
-    0xf6,
-    0x80,
-    0x32,
-    0x18,
-    0xa9,
-    0xa0,
-    0x6c,
-    0xe5,
-    0x10,
-    0x3c,
-    0x62,
-    0xde,
-    0xd0,
-    0x35,
-    0x08,
-    0x7a,
-    0x98,
-    0x51,
-    0x9b,
-    0x4e,
-    0xb1,
-    0x80,
-    0xd7,
-    0x78,
-    0xd7,
-    0x65,
-    0x6b,
-    0x3d,
-    0x48,
-    0x11,
-    0xaa,
-    0xf1,
-    0x1a,
-    0x12,
-    0x83,
-    0x17,
-    0xd1,
-    0xac,
-    0xb3,
-    0xca,
-    0x31,
-    0x66,
-    0x39,
-    0x5c,
-    0x51,
-    0xc9,
-    0x0a,
-    0x3c,
-    0xf1,
-    0x64,
-    0x07,
-    0x1d,
-    0x0d,
-    0x13,
-    0x2c,
-    0x54,
-    0xb3,
-    0x81,
-    0x0a,
-    0x82,
-    0x11,
-    0xec,
-    0x77,
-    0x74,
-    0xd2,
-    0x28,
-    0x84,
-    0x47,
-    0xab,
-    0xe7,
-    0xaf,
-    0xd0,
-    0x30,
-    0x37,
-    0x5a,
-    0x3b,
-    0xed,
-    0x4c,
-    0x7c,
-    0xf1,
-    0xb2,
-    0x80,
-    0x97,
-    0xc0,
-    0x2e,
-    0x98,
-    0xea,
-    0x36,
-    0xbf,
-    0x49,
-    0xe7,
-    0x4d,
-    0x89,
-    0xfb,
-    0xe7,
-    0x4e,
-    0xc6,
-    0xcc,
-    0x1d,
-    0xef,
-    0x5c,
-    0xd8,
-    0xc8,
-    0xbe,
-    0xb5,
-    0xb8,
-    0xad,
-    0xc3,
-    0xcb,
-    0x48,
-    0xc5,
-    0x61,
-    0x82,
-    0xad,
-    0x33,
-    0x7e,
-    0x3b,
-    0x97,
-    0x78,
-    0xe4,
-    0xa6,
-    0xc4
-  ],
-  const [
-    0x89,
-    0x2a,
-    0xf4,
-    0xc0,
-    0x53,
-    0x68,
-    0xaa,
-    0x92,
-    0x42,
-    0xac,
-    0xed,
-    0xd8,
-    0x7d,
-    0x0f,
-    0xc6,
-    0x8d,
-    0xe4,
-    0x83,
-    0xab,
-    0x59,
-    0x52,
-    0x0a,
-    0xea,
-    0x62,
-    0x1f,
-    0x26,
-    0x4b,
-    0x65,
-    0xea,
-    0x90,
-    0xf0,
-    0x05,
-    0x95,
-    0x2c,
-    0x81,
-    0x63,
-    0x90,
-    0x3d,
-    0x86,
-    0xee,
-    0x5b,
-    0xd6,
-    0x14,
-    0x7d,
-    0x46,
-    0x91,
-    0xac,
-    0x9b,
-    0x7c,
-    0x82,
-    0x60,
-    0x21,
-    0x3f,
-    0x6e,
-    0x37,
-    0x0b,
-    0x75,
-    0x39,
-    0xd3,
-    0x84,
-    0x64,
-    0x9e,
-    0x51,
-    0x43,
-    0xba,
-    0x23,
-    0x71,
-    0x1a,
-    0xd0,
-    0x4b,
-    0xf7,
-    0xcc,
-    0x2f,
-    0x0d,
-    0x51,
-    0x20,
-    0x54,
-    0x85,
-    0x79,
-    0x33,
-    0xb0,
-    0xea,
-    0x1d,
-    0x12,
-    0xf3,
-    0xc0,
-    0xfe,
-    0x88,
-    0x8a,
-    0x4e,
-    0x96,
-    0x35,
-    0x66,
-    0x53,
-    0xfd,
-    0xe0,
-    0x00,
-    0xf5,
-    0x0d,
-    0x0f,
-    0x9a,
-    0xfa,
-    0xc5,
-    0xd4,
-    0xc7,
-    0x3a,
-    0xeb,
-    0xe9,
-    0x2d,
-    0x54,
-    0xf5,
-    0xff,
-    0x8a,
-    0xa1,
-    0x2a,
-    0x54,
-    0xf5,
-    0x66,
-    0x05,
-    0x84,
-    0x67,
-    0x4e,
-    0xda,
-    0xa1,
-    0x79,
-    0x17,
-    0xbb,
-    0x85,
-    0x6f,
-    0x8b,
-    0x9d,
-    0x67,
-    0x76,
-    0xb2,
-    0xb7,
-    0xad,
-    0x2a,
-    0x46,
-    0x2b,
-    0x01,
-    0x5b,
-    0x67,
-    0xe8,
-    0xa7,
-    0x11,
-    0x90,
-    0xcf,
-    0x0e,
-    0xcd,
-    0xca,
-    0x15,
-    0xa5,
-    0x12,
-    0x1f,
-    0xe8,
-    0xef,
-    0x24,
-    0x52,
-    0x55,
-    0xda,
-    0x10,
-    0xcd,
-    0x69,
-    0x4d,
-    0xec,
-    0xdb,
-    0x96,
-    0x00,
-    0x60,
-    0x17,
-    0x59,
-    0x90,
-    0x66,
-    0x25,
-    0x1a,
-    0xd3,
-    0x4d,
-    0x9f,
-    0x54,
-    0x69,
-    0x04,
-    0x52,
-    0xf5,
-    0x93,
-    0x95,
-    0xab,
-    0x08,
-    0x48,
-    0xf0,
-    0x6c,
-    0x91,
-    0x86,
-    0xea,
-    0xa3,
-    0xb8,
-    0xe7,
-    0x85,
-    0xdd,
-    0x2a,
-    0x74,
-    0x72,
-    0x97,
-    0xbd,
-    0xbd,
-    0xd4,
-    0xf5,
-    0x53,
-    0x2a,
-    0x47,
-    0xb7,
-    0x00,
-    0x8c,
-    0x21,
-    0x68,
-    0x6f,
-    0xf7,
-    0xf8,
-    0xd8,
-    0x81,
-    0xd4,
-    0x64,
-    0xcd,
-    0x38,
-    0x32,
-    0x05,
-    0xf6,
-    0xd4,
-    0x5d,
-    0xc8,
-    0x20,
-    0x3b,
-    0xb2,
-    0x67,
-    0xac,
-    0x9e,
-    0xb1,
-    0x2f,
-    0x41,
-    0x5a,
-    0x54,
-    0x06,
-    0xbe,
-    0x1c,
-    0x9f,
-    0xac,
-    0x73,
-    0x49,
-    0x79,
-    0x41,
-    0x90,
-    0x9d,
-    0xba,
-    0x08,
-    0xdd,
-    0x12,
-    0x85,
-    0x6a,
-    0xac,
-    0x03,
-    0xd8,
-    0x3e,
-    0x0d,
-    0x91,
-    0x61,
-    0x47,
-    0x40,
-    0x46,
-    0x94,
-    0xfe,
-    0x70,
-    0xf8,
-    0xfa,
-    0x92,
-    0x9e,
-    0xf0,
-    0xcc,
-    0x2e,
-    0xdb,
-    0x4c,
-    0xc0,
-    0x7a,
-    0xba,
-    0xa2,
-    0x23,
-    0x64,
-    0x05,
-    0xe6,
-    0x28,
-    0x20,
-    0xaf,
-    0x8e,
-    0x80,
-    0x6d,
-    0x0a,
-    0xf3,
-    0x2a,
-    0x1b,
-    0x3a,
-    0xfb,
-    0x8d,
-    0xca,
-    0xea,
-    0xf5,
-    0xc4,
-    0xf4,
-    0x3d,
-    0xc4,
-    0x39,
-    0x2e,
-    0x07,
-    0x40,
-    0x75,
-    0xaa,
-    0x3e,
-    0xd9,
-    0x36,
-    0x01,
-    0xab,
-    0x7e,
-    0xc2,
-    0x2f,
-    0xe5,
-    0xbd,
-    0x7c,
-    0xdf,
-    0x80,
-    0x2b,
-    0xb5,
-    0xea,
-    0x82,
-    0x06,
-    0xc4,
-    0x1a,
-    0x16,
-    0x19,
-    0x59,
-    0x33,
-    0x85,
-    0xe0,
-    0x0e,
-    0x34,
-    0x61,
-    0xed,
-    0x3f,
-    0xda,
-    0x04,
-    0x8a,
-    0x1c,
-    0x66,
-    0x39,
-    0xa0,
-    0xfc,
-    0xa0,
-    0x38,
-    0xd7,
-    0xf5,
-    0x1c,
-    0xd8,
-    0xff,
-    0xa9,
-    0xbc,
-    0x00,
-    0xaf,
-    0x62,
-    0x76,
-    0x5e,
-    0x2b,
-    0x62,
-    0x57,
-    0x5c,
-    0x8b,
-    0x74,
-    0xc8,
-    0x50,
-    0x1a,
-    0xc7,
-    0x11,
-    0xf3,
-    0xfd,
-    0xfc,
-    0x1b,
-    0x15,
-    0x15,
-    0x7e,
-    0x7a,
-    0x8f,
-    0x26,
-    0x12,
-    0xaa,
-    0x78,
-    0x38,
-    0xaf,
-    0x99,
-    0x9c,
-    0x3d,
-    0x8f,
-    0x66,
-    0x29,
-    0xf5,
-    0x86,
-    0x69,
-    0xac,
-    0x0f,
-    0x93,
-    0x73,
-    0x3c,
-    0x91,
-    0xb5,
-    0x57,
-    0xf5,
-    0x79,
-    0xff,
-    0xa9,
-    0xa9,
-    0xa4,
-    0xef,
-    0xc5,
-    0xd1,
-    0xf0,
-    0xfc,
-    0x13,
-    0xca,
-    0x9e,
-    0x6e,
-    0x8a,
-    0x3e,
-    0xfa,
-    0x72,
-    0x73,
-    0xe0,
-    0x3d,
-    0x6e,
-    0x70,
-    0x5c,
-    0xb2,
-    0x92,
-    0xbc,
-    0x8d,
-    0x18,
-    0xb0,
-    0xb4,
-    0xf1,
-    0x48,
-    0x4d,
-    0x97,
-    0x5b,
-    0x17,
-    0xf8,
-    0x8a,
-    0xe8,
-    0x7e,
-    0xda,
-    0xdf,
-    0x34,
-    0xf8,
-    0x8f,
-    0x96,
-    0xce,
-    0x2c,
-    0x34,
-    0x24,
-    0xe9,
-    0xcc,
-    0xc1,
-    0x74,
-    0x54,
-    0xbd,
-    0x99,
-    0x2c,
-    0xac,
-    0x78,
-    0x60,
-    0x31,
-    0xd0,
-    0xb0,
-    0x0d,
-    0x6d,
-    0x95,
-    0x35,
-    0x40,
-    0xd0,
-    0xbb,
-    0x18,
-    0xd5,
-    0x94,
-    0x20,
-    0x10,
-    0xb9,
-    0xc6,
-    0x34,
-    0x1c,
-    0xfc,
-    0x02,
-    0xad,
-    0x6a,
-    0x28,
-    0x7e,
-    0x7c,
-    0x78,
-    0xd2,
-    0x49,
-    0xff,
-    0x79,
-    0x6e,
-    0xd5,
-    0x78,
-    0xfa,
-    0x68,
-    0xb4,
-    0xbe,
-    0xc5,
-    0x70,
-    0x9f,
-    0x32,
-    0x05,
-    0x15,
-    0xbc,
-    0xf5,
-    0xac,
-    0x95,
-    0x21,
-    0x58,
-    0x12,
-    0xf3,
-    0x94,
-    0x94,
-    0xde,
-    0x4b,
-    0x94,
-    0xbc,
-    0x2a,
-    0x63,
-    0x9e,
-    0xef,
-    0xe2,
-    0x82,
-    0xa9,
-    0xd2,
-    0x6d,
-    0x85,
-    0xf3,
-    0x3d,
-    0x90,
-    0x2f,
-    0xff,
-    0x35,
-    0x8f,
-    0xc1,
-    0xde,
-    0x1b,
-    0x95,
-    0xca,
-    0xaf,
-    0x22,
-    0x55,
-    0x41,
-    0x62,
-    0x07,
-    0xf2,
-    0xd1,
-    0xc1,
-    0xfc,
-    0x1c,
-    0x74,
-    0xb0,
-    0xe5,
-    0x7d,
-    0x43,
-    0xb3,
-    0xc6,
-    0x53,
-    0x8d,
-    0xb2,
-    0x7c,
-    0x5e,
-    0x26,
-    0xf9,
-    0xac,
-    0xfc,
-    0x01,
-    0x83,
-    0xfa,
-    0x93,
-    0x01,
-    0x78,
-    0x7b,
-    0x2f,
-    0x0d,
-    0xf4,
-    0x6c,
-    0x6c,
-    0x63,
-    0x0a,
-    0x24,
-    0x97,
-    0x2e,
-    0x09,
-    0x47,
-    0x10,
-    0x5a,
-    0xfd,
-    0x3d,
-    0xf2,
-    0xa7,
-    0x79,
-    0xe2,
-    0xf6,
-    0xfc,
-    0x94,
-    0x7f,
-    0x95,
-    0xff,
-    0x32,
-    0xfa,
-    0x6d,
-    0xe2,
-    0x85,
-    0x49,
-    0xe6,
-    0x7f,
-    0xd3,
-    0x2c,
-    0x15,
-    0xa8,
-    0x79,
-    0x1c,
-    0xe1,
-    0xb8,
-    0x30,
-    0x7e,
-    0x64,
-    0x6e,
-    0x8f,
-    0x1d,
-    0x94,
-    0xfc,
-    0xd1,
-    0xd7,
-    0x22,
-    0x5a,
-    0xd9,
-    0x97,
-    0xa2,
-    0xe0,
-    0x73,
-    0x83,
-    0xed,
-    0x14,
-    0xdd,
-    0x76,
-    0xc3,
-    0xc1,
-    0x86,
-    0xb0,
-    0xb5,
-    0x49,
-    0x15,
-    0xcc
-  ],
-  const [
-    0xa5,
-    0x04,
-    0x5d,
-    0x24,
-    0xd0,
-    0x75,
-    0x78,
-    0xca,
-    0x31,
-    0x98,
-    0x7d,
-    0xb3,
-    0xd2,
-    0xe2,
-    0x5e,
-    0x12,
-    0xea,
-    0x38,
-    0xbb,
-    0x1d,
-    0xa7,
-    0xa8,
-    0xbd,
-    0x64,
-    0x2a,
-    0x57,
-    0x42,
-    0x61,
-    0xd4,
-    0xba,
-    0x3a,
-    0x50,
-    0xc0,
-    0x09,
-    0x50,
-    0x41,
-    0x90,
-    0xf1,
-    0xce,
-    0x6b,
-    0x6d,
-    0x8a,
-    0xba,
-    0xc3,
-    0x49,
-    0x88,
-    0x45,
-    0xcd,
-    0x67,
-    0xb5,
-    0x67,
-    0xb2,
-    0x1e,
-    0x9f,
-    0xc3,
-    0x94,
-    0xda,
-    0x8d,
-    0xd0,
-    0x1e,
-    0x63,
-    0xb8,
-    0x3a,
-    0x5f,
-    0x62,
-    0xb8,
-    0x86,
-    0xd8,
-    0x21,
-    0x3d,
-    0xf6,
-    0xd3,
-    0x92,
-    0xff,
-    0xac,
-    0xf7,
-    0x93,
-    0xf8,
-    0x11,
-    0x1a,
-    0x70,
-    0xd0,
-    0x78,
-    0x56,
-    0xa9,
-    0x99,
-    0xff,
-    0x5f,
-    0xf6,
-    0xbc,
-    0xb6,
-    0x13,
-    0x89,
-    0x33,
-    0x04,
-    0x53,
-    0x93,
-    0xf9,
-    0x46,
-    0x12,
-    0x09,
-    0xbf,
-    0xb8,
-    0xab,
-    0xa8,
-    0xe1,
-    0x99,
-    0x78,
-    0x37,
-    0x98,
-    0x8a,
-    0xa0,
-    0x0c,
-    0x71,
-    0x38,
-    0x30,
-    0xd1,
-    0xfe,
-    0x3a,
-    0x6e,
-    0x88,
-    0xcb,
-    0x3d,
-    0x6a,
-    0xcd,
-    0x93,
-    0x5e,
-    0xd5,
-    0x5b,
-    0xb4,
-    0xd7,
-    0x16,
-    0xd2,
-    0xe1,
-    0xde,
-    0x9b,
-    0xb8,
-    0x17,
-    0xca,
-    0x6d,
-    0xbd,
-    0xd2,
-    0x78,
-    0x08,
-    0x43,
-    0x80,
-    0xed,
-    0x69,
-    0x1d,
-    0x36,
-    0x3c,
-    0x68,
-    0x97,
-    0xa2,
-    0xaa,
-    0x48,
-    0xb7,
-    0x41,
-    0x11,
-    0x8d,
-    0xc3,
-    0xd1,
-    0x82,
-    0x0d,
-    0x03,
-    0x0a,
-    0x2e,
-    0x4a,
-    0xc8,
-    0x89,
-    0x87,
-    0xff,
-    0xae,
-    0x0d,
-    0xa2,
-    0xf9,
-    0x1d,
-    0xe5,
-    0xe0,
-    0x28,
-    0x16,
-    0xa9,
-    0xcd,
-    0xf6,
-    0x2c,
-    0x29,
-    0x48,
-    0xd7,
-    0xd0,
-    0xa3,
-    0xe5,
-    0x22,
-    0xd2,
-    0x39,
-    0x8f,
-    0x1f,
-    0x25,
-    0xa1,
-    0x72,
-    0x61,
-    0xe3,
-    0x1f,
-    0x18,
-    0x56,
-    0x90,
-    0xb0,
-    0xd1,
-    0x1c,
-    0xa3,
-    0x88,
-    0x59,
-    0x96,
-    0x42,
-    0xbf,
-    0xb5,
-    0xc0,
-    0x4e,
-    0x48,
-    0x5e,
-    0x3f,
-    0x9f,
-    0x22,
-    0xa1,
-    0x3d,
-    0x91,
-    0xd2,
-    0x46,
-    0x73,
-    0xbf,
-    0x10,
-    0x70,
-    0x87,
-    0x0e,
-    0xc1,
-    0xc4,
-    0x99,
-    0xee,
-    0x25,
-    0xcd,
-    0x19,
-    0xdc,
-    0x52,
-    0x9f,
-    0xdb,
-    0x2b,
-    0xe1,
-    0xbb,
-    0x6d,
-    0x05,
-    0xe7,
-    0x33,
-    0xa8,
-    0xad,
-    0x27,
-    0x0f,
-    0x85,
-    0x06,
-    0x85,
-    0xee,
-    0x32,
-    0x59,
-    0xbe,
-    0xf1,
-    0x65,
-    0x53,
-    0x57,
-    0xd4,
-    0xf1,
-    0x4d,
-    0xd3,
-    0x5e,
-    0x97,
-    0xd1,
-    0x29,
-    0xfc,
-    0x1e,
-    0x59,
-    0x75,
-    0xa9,
-    0xa5,
-    0x59,
-    0xee,
-    0x10,
-    0x39,
-    0x80,
-    0x18,
-    0xf5,
-    0xa3,
-    0x3b,
-    0x3b,
-    0xd1,
-    0x83,
-    0x7c,
-    0x13,
-    0xbc,
-    0xa3,
-    0xb9,
-    0xc9,
-    0x90,
-    0x85,
-    0x37,
-    0x22,
-    0x4c,
-    0x3e,
-    0x88,
-    0xf7,
-    0xb6,
-    0x87,
-    0x53,
-    0xe5,
-    0x45,
-    0x12,
-    0x53,
-    0x45,
-    0x3d,
-    0x1a,
-    0xa2,
-    0x5e,
-    0x1c,
-    0x3e,
-    0x38,
-    0xda,
-    0x35,
-    0x8f,
-    0xae,
-    0x77,
-    0x9b,
-    0xe8,
-    0x48,
-    0xff,
-    0x40,
-    0x7e,
-    0x33,
-    0x7a,
-    0x5e,
-    0xb7,
-    0x0b,
-    0xa2,
-    0x16,
-    0x40,
-    0xa1,
-    0x97,
-    0x58,
-    0x5a,
-    0xfa,
-    0xd4,
-    0x02,
-    0x74,
-    0x9b,
-    0x62,
-    0x4c,
-    0xff,
-    0x03,
-    0x4b,
-    0x63,
-    0x7e,
-    0x7a,
-    0x52,
-    0x54,
-    0xdc,
-    0x09,
-    0xe1,
-    0x2c,
-    0x03,
-    0xca,
-    0x43,
-    0x5d,
-    0xaa,
-    0x62,
-    0x13,
-    0x64,
-    0x6e,
-    0xcb,
-    0xf5,
-    0xa9,
-    0x25,
-    0x57,
-    0x84,
-    0xa7,
-    0x6f,
-    0xf1,
-    0x8b,
-    0x4c,
-    0x8d,
-    0xa6,
-    0x77,
-    0xa3,
-    0x77,
-    0x65,
-    0x0c,
-    0xb0,
-    0x28,
-    0x03,
-    0x58,
-    0x9c,
-    0x3d,
-    0x82,
-    0xe5,
-    0x12,
-    0xbe,
-    0x93,
-    0x33,
-    0xe8,
-    0x3c,
-    0x59,
-    0x65,
-    0x02,
-    0x1c,
-    0x70,
-    0x3b,
-    0x73,
-    0x32,
-    0x2e,
-    0x40,
-    0xe6,
-    0x92,
-    0x29,
-    0x45,
-    0x3d,
-    0xa2,
-    0xf9,
-    0x0d,
-    0x77,
-    0x74,
-    0x3f,
-    0x4a,
-    0xd7,
-    0x53,
-    0xe6,
-    0xc8,
-    0x42,
-    0x9c,
-    0xa8,
-    0xe9,
-    0xea,
-    0xd0,
-    0xd4,
-    0x51,
-    0x29,
-    0xe6,
-    0x4f,
-    0xe2,
-    0xaf,
-    0xe6,
-    0xd9,
-    0xeb,
-    0xe0,
-    0xb3,
-    0x92,
-    0x9c,
-    0x78,
-    0x28,
-    0xbd,
-    0xbe,
-    0x71,
-    0x67,
-    0xc3,
-    0xa1,
-    0x26,
-    0x6e,
-    0x7b,
-    0x55,
-    0xb8,
-    0xec,
-    0xa8,
-    0x1c,
-    0xb1,
-    0x52,
-    0xc4,
-    0x20,
-    0xe7,
-    0x2c,
-    0xfc,
-    0x62,
-    0xa4,
-    0xb2,
-    0x7b,
-    0xf3,
-    0x03,
-    0x9a,
-    0xeb,
-    0x66,
-    0x9d,
-    0x31,
-    0x39,
-    0x85,
-    0x65,
-    0xaa,
-    0x99,
-    0x43,
-    0xd1,
-    0xb6,
-    0xcb,
-    0xf2,
-    0x3b,
-    0x55,
-    0x9c,
-    0xb6,
-    0x86,
-    0xeb,
-    0xaf,
-    0x3a,
-    0x04,
-    0x96,
-    0x7d,
-    0xa1,
-    0x97,
-    0xbf,
-    0x9b,
-    0xc0,
-    0x17,
-    0xef,
-    0x3c,
-    0x8a,
-    0xf4,
-    0xe4,
-    0xf6,
-    0xcb,
-    0x1d,
-    0xe5,
-    0xc9,
-    0x1a,
-    0x20,
-    0x52,
-    0x5d,
-    0x08,
-    0x92,
-    0x7f,
-    0x8b,
-    0x9e,
-    0xb1,
-    0xc2,
-    0x1f,
-    0x07,
-    0x48,
-    0xcb,
-    0xdc,
-    0x89,
-    0xd3,
-    0x34,
-    0xc1,
-    0xba,
-    0xe4,
-    0x59,
-    0x8b,
-    0xf0,
-    0xc5,
-    0x6a,
-    0x7b,
-    0xf9,
-    0x5f,
-    0xbf,
-    0x59,
-    0x0c,
-    0x5a,
-    0x6b,
-    0xb9,
-    0x00,
-    0x86,
-    0x13,
-    0x7d,
-    0xbc,
-    0x7a,
-    0x01,
-    0x9b,
-    0xef,
-    0x7b,
-    0x74,
-    0x21,
-    0x01,
-    0x9f,
-    0x3a,
-    0x76,
-    0x49,
-    0x31,
-    0x81,
-    0xe2,
-    0x80,
-    0x58,
-    0xeb,
-    0x50,
-    0x75,
-    0xf4,
-    0xe0,
-    0x53,
-    0x03,
-    0xc9,
-    0x28,
-    0x68,
-    0x40,
-    0xdf,
-    0xb9,
-    0x7b,
-    0xf8,
-    0x28,
-    0xcd,
-    0xac,
-    0x5a,
-    0x64,
-    0x38,
-    0x52,
-    0xf0,
-    0x42,
-    0xf9,
-    0x40,
-    0xd5,
-    0xc8,
-    0x0f,
-    0x48,
-    0x22,
-    0xf4,
-    0x8e,
-    0xfe,
-    0xa9,
-    0xa4,
-    0xf1,
-    0xbe,
-    0xe6,
-    0xb3,
-    0xb2,
-    0xf1,
-    0x32,
-    0x65,
-    0x18,
-    0x8b,
-    0x3a,
-    0x05,
-    0x51,
-    0xd8,
-    0xb0,
-    0xcc,
-    0xc0,
-    0x79,
-    0x40,
-    0x05,
-    0x98,
-    0xaa,
-    0xc6,
-    0x6f,
-    0xaa,
-    0xc6,
-    0xbe,
-    0xe3,
-    0x7b,
-    0x0c,
-    0xfb,
-    0x36,
-    0x9a,
-    0xa3,
-    0x9d,
-    0x61,
-    0x30,
-    0xdc,
-    0x3d,
-    0xdf,
-    0xd9,
-    0xb8,
-    0x6a,
-    0x57,
-    0xb2,
-    0xaa,
-    0x59,
-    0x7b,
-    0xb4,
-    0x9d,
-    0xd8,
-    0x30,
-    0x40,
-    0x39,
-    0x84,
-    0xef,
-    0xfa,
-    0x62,
-    0x3c,
-    0x6b,
-    0xdb,
-    0x02,
-    0xd5,
-    0x74,
-    0x82,
-    0x09,
-    0x0f,
-    0x1b,
-    0xcb,
-    0xb2,
-    0xc8,
-    0x17,
-    0xa3,
-    0x07,
-    0x70,
-    0x67,
-    0x1b,
-    0xa7,
-    0xbd,
-    0x39,
-    0xbb,
-    0xc7,
-    0xa0,
-    0x0b,
-    0x18,
-    0x77,
-    0x77,
-    0x10,
-    0xa8,
-    0x26,
-    0x84,
-    0xd5,
-    0xd6,
-    0x69,
-    0x9e,
-    0x24,
-    0x52,
-    0xf8,
-    0x26,
-    0x29,
-    0xab,
-    0xf9,
-    0x3d,
-    0xd3,
-    0x1f,
-    0x82,
-    0x34,
-    0x7d,
-    0xb2,
-    0x59,
-    0x44,
-    0xce,
-    0x7d,
-    0xfe,
-    0x80,
-    0xdd,
-    0x49,
-    0xeb,
-    0x07,
-    0x99,
-    0x5c,
-    0x1a,
-    0x7e,
-    0x69,
-    0x93,
-    0xc8,
-    0xbe,
-    0x0f,
-    0xb1,
-    0x79,
-    0xc9,
-    0xd2,
-    0xf7,
-    0x3c,
-    0x03,
-    0xdc,
-    0xf5,
-    0x30,
-    0x9f,
-    0xe1,
-    0x9f,
-    0x47
-  ],
-  const [
-    0x91,
-    0x2e,
-    0x0d,
-    0xc2,
-    0x5b,
-    0x52,
-    0x54,
-    0x0f,
-    0x4d,
-    0x33,
-    0xd2,
-    0x6f,
-    0xdc,
-    0xba,
-    0xdd,
-    0xb4,
-    0x20,
-    0xf5,
-    0x57,
-    0x01,
-    0x41,
-    0xbc,
-    0xcb,
-    0x8c,
-    0x2c,
-    0x94,
-    0xb8,
-    0xa3,
-    0x8a,
-    0xd3,
-    0x2d,
-    0xed,
-    0xf2,
-    0x05,
-    0x96,
-    0xf3,
-    0x5d,
-    0x8f,
-    0xd6,
-    0xde,
-    0xdb,
-    0x92,
-    0x96,
-    0x82,
-    0x85,
-    0x12,
-    0xdc,
-    0x9c,
-    0xb3,
-    0x58,
-    0xdf,
-    0x58,
-    0x6f,
-    0x94,
-    0x1a,
-    0x17,
-    0x29,
-    0xc7,
-    0x9f,
-    0x6e,
-    0xac,
-    0xe0,
-    0xae,
-    0x72,
-    0x50,
-    0x25,
-    0x86,
-    0x33,
-    0x71,
-    0xd5,
-    0x7b,
-    0x86,
-    0x21,
-    0x0c,
-    0x49,
-    0x08,
-    0x1a,
-    0xe6,
-    0xa8,
-    0x5f,
-    0xf6,
-    0xe7,
-    0x20,
-    0xc3,
-    0xa3,
-    0x9b,
-    0x1f,
-    0xbe,
-    0x11,
-    0x79,
-    0x49,
-    0x2f,
-    0x2d,
-    0x0d,
-    0x0f,
-    0x95,
-    0x13,
-    0x57,
-    0x83,
-    0x8a,
-    0x7f,
-    0x6e,
-    0x6a,
-    0x8e,
-    0x85,
-    0x68,
-    0x93,
-    0x06,
-    0x83,
-    0x7e,
-    0x68,
-    0x84,
-    0x53,
-    0x6c,
-    0xc3,
-    0x49,
-    0xc5,
-    0x17,
-    0x03,
-    0x09,
-    0x4c,
-    0x72,
-    0x5e,
-    0xee,
-    0xf7,
-    0xa2,
-    0x79,
-    0xdf,
-    0xa3,
-    0x61,
-    0x35,
-    0x01,
-    0x70,
-    0xa0,
-    0xcc,
-    0x7e,
-    0x71,
-    0x70,
-    0x1e,
-    0x86,
-    0xa8,
-    0x22,
-    0x45,
-    0x94,
-    0x31,
-    0xad,
-    0x6f,
-    0xf3,
-    0xbd,
-    0x51,
-    0xed,
-    0x80,
-    0x42,
-    0x7a,
-    0x87,
-    0xb1,
-    0xf1,
-    0xe7,
-    0x13,
-    0xd6,
-    0x69,
-    0x0b,
-    0x46,
-    0x9f,
-    0x2a,
-    0xb4,
-    0xc9,
-    0xdf,
-    0x4c,
-    0xea,
-    0x8f,
-    0x8f,
-    0x71,
-    0x1a,
-    0x67,
-    0x16,
-    0xf8,
-    0x74,
-    0xcd,
-    0xc8,
-    0x73,
-    0x91,
-    0x06,
-    0xac,
-    0x5b,
-    0x59,
-    0x6c,
-    0x82,
-    0x03,
-    0x24,
-    0x06,
-    0x04,
-    0xcb,
-    0x1f,
-    0x5b,
-    0x6d,
-    0x96,
-    0xf2,
-    0x88,
-    0x38,
-    0x7e,
-    0x9f,
-    0x91,
-    0x2a,
-    0xc6,
-    0xad,
-    0xf5,
-    0x92,
-    0x0f,
-    0x87,
-    0x85,
-    0xd0,
-    0xcf,
-    0x1f,
-    0x75,
-    0x14,
-    0x00,
-    0xd6,
-    0xb4,
-    0x68,
-    0x15,
-    0xa0,
-    0x79,
-    0xf1,
-    0x32,
-    0x63,
-    0x1f,
-    0x71,
-    0x9c,
-    0xa1,
-    0x32,
-    0x11,
-    0x6f,
-    0x57,
-    0xca,
-    0x5e,
-    0x8f,
-    0x25,
-    0x17,
-    0x91,
-    0xe0,
-    0xae,
-    0x3e,
-    0x13,
-    0xba,
-    0x42,
-    0x63,
-    0x40,
-    0x97,
-    0xbb,
-    0x07,
-    0x6c,
-    0x0f,
-    0xa4,
-    0x95,
-    0x23,
-    0x07,
-    0xa1,
-    0x37,
-    0xb5,
-    0x25,
-    0x0a,
-    0xee,
-    0xf2,
-    0x87,
-    0xda,
-    0xe2,
-    0x33,
-    0xb4,
-    0xc8,
-    0xf7,
-    0x9a,
-    0xd2,
-    0xb3,
-    0xa0,
-    0x9a,
-    0x1a,
-    0x43,
-    0xf8,
-    0xb9,
-    0x8a,
-    0xce,
-    0x0f,
-    0x94,
-    0xd9,
-    0x78,
-    0x81,
-    0x24,
-    0xb0,
-    0x9f,
-    0x4e,
-    0x41,
-    0x17,
-    0x76,
-    0xe5,
-    0x64,
-    0x2e,
-    0xef,
-    0x82,
-    0xb1,
-    0x1d,
-    0xdf,
-    0xba,
-    0x35,
-    0x4d,
-    0x5d,
-    0x55,
-    0x6c,
-    0xd9,
-    0x6a,
-    0x5b,
-    0x06,
-    0x3f,
-    0xd8,
-    0x71,
-    0xea,
-    0x5c,
-    0x64,
-    0x66,
-    0x7c,
-    0x97,
-    0x26,
-    0x0a,
-    0x1b,
-    0x5c,
-    0x2b,
-    0x3f,
-    0xee,
-    0xcc,
-    0x60,
-    0x52,
-    0xe1,
-    0xb2,
-    0xb1,
-    0x8b,
-    0xea,
-    0xb9,
-    0x73,
-    0x02,
-    0x91,
-    0xdd,
-    0xff,
-    0xb5,
-    0xaf,
-    0x20,
-    0xa0,
-    0xd8,
-    0x76,
-    0x7e,
-    0xb0,
-    0x6c,
-    0xb1,
-    0x22,
-    0xfd,
-    0x13,
-    0x4d,
-    0xda,
-    0x72,
-    0x23,
-    0x19,
-    0xc9,
-    0xf3,
-    0xf9,
-    0xca,
-    0x5c,
-    0x88,
-    0x90,
-    0x42,
-    0x7f,
-    0xbe,
-    0x52,
-    0x12,
-    0x10,
-    0x4a,
-    0x2d,
-    0x3d,
-    0x93,
-    0xf0,
-    0xea,
-    0x3f,
-    0x28,
-    0xa3,
-    0xba,
-    0x4d,
-    0xbb,
-    0xee,
-    0x12,
-    0xdf,
-    0x7b,
-    0x92,
-    0xb9,
-    0x6c,
-    0x8d,
-    0x71,
-    0x20,
-    0x74,
-    0x01,
-    0xaa,
-    0xf1,
-    0xc4,
-    0x05,
-    0x06,
-    0xea,
-    0xf6,
-    0x58,
-    0x93,
-    0xec,
-    0x37,
-    0x02,
-    0x8e,
-    0x4f,
-    0x4d,
-    0x43,
-    0x86,
-    0x79,
-    0xd8,
-    0xc9,
-    0xbf,
-    0xaf,
-    0xd7,
-    0x25,
-    0xd5,
-    0x2a,
-    0x6f,
-    0x80,
-    0xa1,
-    0x6e,
-    0xe8,
-    0x8a,
-    0x60,
-    0xd7,
-    0xf9,
-    0xb4,
-    0x12,
-    0x75,
-    0x45,
-    0x9f,
-    0x21,
-    0x1a,
-    0x25,
-    0xd4,
-    0x43,
-    0xb0,
-    0xa8,
-    0xb5,
-    0xa1,
-    0xd0,
-    0xd8,
-    0xb4,
-    0x39,
-    0x91,
-    0x3f,
-    0xc2,
-    0x81,
-    0x9e,
-    0xaa,
-    0x0a,
-    0x4d,
-    0x8c,
-    0x2d,
-    0xe0,
-    0xf2,
-    0x6a,
-    0x67,
-    0xf4,
-    0xac,
-    0x99,
-    0x07,
-    0xcc,
-    0x3d,
-    0xde,
-    0x8f,
-    0x71,
-    0xd7,
-    0xb5,
-    0x59,
-    0x68,
-    0x3c,
-    0xe8,
-    0xd7,
-    0xe3,
-    0x24,
-    0x61,
-    0x1e,
-    0x39,
-    0xdf,
-    0x3c,
-    0xa6,
-    0x94,
-    0x3b,
-    0x21,
-    0x4b,
-    0xe9,
-    0xa8,
-    0xd1,
-    0x98,
-    0x2e,
-    0x9a,
-    0xfe,
-    0x45,
-    0xc7,
-    0x2f,
-    0x60,
-    0xfe,
-    0x41,
-    0x12,
-    0x05,
-    0x67,
-    0x42,
-    0x9f,
-    0xe9,
-    0x5c,
-    0xc0,
-    0x48,
-    0xc6,
-    0x7d,
-    0x72,
-    0x37,
-    0x2d,
-    0xea,
-    0x84,
-    0x34,
-    0xd6,
-    0x4b,
-    0x8f,
-    0xca,
-    0x35,
-    0x14,
-    0xc8,
-    0xa5,
-    0x4d,
-    0x07,
-    0x78,
-    0x3f,
-    0xc9,
-    0xfa,
-    0xac,
-    0xbc,
-    0x49,
-    0xda,
-    0x2d,
-    0x12,
-    0xfa,
-    0xf0,
-    0xb2,
-    0x6c,
-    0x69,
-    0x63,
-    0x55,
-    0xd1,
-    0x99,
-    0xfe,
-    0x44,
-    0x00,
-    0x53,
-    0x34,
-    0xb9,
-    0x9f,
-    0xbd,
-    0x61,
-    0x2c,
-    0x95,
-    0x2e,
-    0x53,
-    0xc7,
-    0xb5,
-    0x41,
-    0x09,
-    0x1a,
-    0x9c,
-    0x28,
-    0xba,
-    0x10,
-    0xdc,
-    0x43,
-    0x1a,
-    0x21,
-    0x5a,
-    0xf1,
-    0xd8,
-    0xca,
-    0xf4,
-    0xa7,
-    0x6b,
-    0x3a,
-    0x67,
-    0x3f,
-    0x0e,
-    0x4f,
-    0x70,
-    0x92,
-    0x09,
-    0xc0,
-    0x32,
-    0x48,
-    0x33,
-    0x9c,
-    0xd8,
-    0xef,
-    0xb5,
-    0xf3,
-    0x7b,
-    0x4b,
-    0x10,
-    0xd2,
-    0x46,
-    0xed,
-    0x62,
-    0x75,
-    0xd8,
-    0x07,
-    0xe5,
-    0xb9,
-    0xe9,
-    0x7f,
-    0xb8,
-    0xd0,
-    0x31,
-    0x42,
-    0xe2,
-    0x38,
-    0x85,
-    0xdb,
-    0x94,
-    0xee,
-    0x44,
-    0x44,
-    0xae,
-    0xdf,
-    0xf1,
-    0xfc,
-    0x85,
-    0x9f,
-    0x21,
-    0x59,
-    0xe3,
-    0x5d,
-    0x98,
-    0x20,
-    0x50,
-    0x17,
-    0xaf,
-    0x53,
-    0x90,
-    0x0a,
-    0xf9,
-    0x4a,
-    0x6d,
-    0x6d,
-    0x25,
-    0x05,
-    0xb7,
-    0x5e,
-    0x26,
-    0xc1,
-    0x88,
-    0x1d,
-    0x92,
-    0xc9,
-    0xcc,
-    0x78,
-    0x48,
-    0x8f,
-    0x01,
-    0x86,
-    0x56,
-    0xfb,
-    0x3c,
-    0x98,
-    0x1a,
-    0x03,
-    0x6d,
-    0x6d,
-    0xa7,
-    0x7c,
-    0xe3,
-    0xa5,
-    0x69,
-    0x30,
-    0x13,
-    0x78,
-    0x0d,
-    0x30,
-    0x95,
-    0xa8,
-    0x9b,
-    0x6c,
-    0x6f,
-    0xb4,
-    0xe5,
-    0x80,
-    0x96,
-    0x4f,
-    0x25,
-    0xd1,
-    0xb2,
-    0x10,
-    0xe2,
-    0xd9,
-    0x22,
-    0x6b,
-    0x13,
-    0xbf,
-    0x40,
-    0xe0,
-    0x87,
-    0x2b,
-    0xe6,
-    0x72,
-    0x84,
-    0x58,
-    0x31,
-    0x5b,
-    0xaf,
-    0x6b,
-    0x84,
-    0xfe,
-    0x2b,
-    0x03,
-    0xd0,
-    0x1d,
-    0x05,
-    0x11,
-    0x13,
-    0x4c,
-    0xd0,
-    0xea,
-    0x1f,
-    0xa6,
-    0x8c,
-    0x9a,
-    0x9d,
-    0xbe,
-    0xcd,
-    0x7b,
-    0x51,
-    0xd9,
-    0x19,
-    0x07,
-    0xa0,
-    0x5a,
-    0x91,
-    0xeb,
-    0x4f,
-    0x7d,
-    0xd3,
-    0x5c,
-    0x8d,
-    0x48,
-    0x20,
-    0xae,
-    0x34,
-    0xbf,
-    0xba,
-    0x23,
-    0x4c,
-    0x58,
-    0x90,
-    0x01,
-    0xd1,
-    0xae,
-    0x1d,
-    0xe7,
-    0xb5,
-    0x79,
-    0x8e,
-    0x60,
-    0x29,
-    0xbe,
-    0x23,
-    0xb9,
-    0x19,
-    0x43,
-    0xd7,
-    0x10,
-    0xf5,
-    0x46,
-    0x43,
-    0xae,
-    0xb7,
-    0x6e,
-    0xc0,
-    0x97,
-    0x22,
-    0x02,
-    0xcc,
-    0x5e,
-    0x47,
-    0x59,
-    0xaf,
-    0x3e,
-    0x4e,
-    0x92,
-    0x5e,
-    0x67,
-    0x73,
-    0x85,
-    0x9f,
-    0x96,
-    0x4f,
-    0xf8,
-    0x6e,
-    0xe8,
-    0x59,
-    0x17,
-    0x9f,
-    0xf0,
-    0xac,
-    0x1e,
-    0xc6,
-    0x07,
-    0x0b,
-    0x59,
-    0x54,
-    0xe3,
-    0x22,
-    0x4e,
-    0x02,
-    0x6c,
-    0x0e,
-    0x39,
-    0x73,
-    0xca,
-    0x20,
-    0xb8,
-    0x14,
-    0xc3,
-    0xde,
-    0xc8,
-    0x48,
-    0x44,
-    0x4b,
-    0xf0,
-    0xc2,
-    0x3d,
-    0x69,
-    0xbc,
-    0x31,
-    0xb2,
-    0xfb,
-    0x6d,
-    0x23,
-    0x10,
-    0x8f,
-    0xef,
-    0x23,
-    0xbd,
-    0xbc,
-    0x0b,
-    0x25,
-    0xf2,
-    0xa9,
-    0xde,
-    0x25,
-    0xcd,
-    0xce
-  ],
-  const [
-    0x22,
-    0x98,
-    0x09,
-    0x6d,
-    0x8a,
-    0x02,
-    0x22,
-    0x5d,
-    0x4a,
-    0x5a,
-    0x91,
-    0xe9,
-    0x5b,
-    0x43,
-    0xbe,
-    0xe7,
-    0x0f,
-    0x5a,
-    0x23,
-    0xf9,
-    0x52,
-    0x69,
-    0xb1,
-    0x60,
-    0x2f,
-    0xde,
-    0x6f,
-    0x11,
-    0x96,
-    0x7b,
-    0x65,
-    0x0b,
-    0x5c,
-    0x4e,
-    0xb8,
-    0xe7,
-    0x83,
-    0xe4,
-    0x16,
-    0xb1,
-    0xbc,
-    0xba,
-    0x54,
-    0xf6,
-    0x2a,
-    0xf4,
-    0x56,
-    0x1e,
-    0x69,
-    0x51,
-    0x30,
-    0xfc,
-    0xcf,
-    0x5f,
-    0x8a,
-    0xa4,
-    0xf1,
-    0xeb,
-    0x49,
-    0x7d,
-    0x69,
-    0xbc,
-    0x6c,
-    0x97,
-    0xd7,
-    0x81,
-    0x33,
-    0x3e,
-    0x26,
-    0x07,
-    0x87,
-    0xcf,
-    0x11,
-    0xaf,
-    0x96,
-    0xca,
-    0xe5,
-    0x20,
-    0xbe,
-    0x29,
-    0x88,
-    0x39,
-    0xac,
-    0xf0,
-    0xba,
-    0x49,
-    0xc5,
-    0x06,
-    0x9b,
-    0x83,
-    0xc4,
-    0x43,
-    0x6d,
-    0xac,
-    0xa5,
-    0xca,
-    0x9c,
-    0x17,
-    0xc3,
-    0x99,
-    0xfb,
-    0xd3,
-    0x3d,
-    0x5e,
-    0x51,
-    0x23,
-    0x9d,
-    0x8c,
-    0x14,
-    0x2e,
-    0xbc,
-    0xaf,
-    0x74,
-    0xf8,
-    0xe0,
-    0xfd,
-    0x9c,
-    0x91,
-    0x28,
-    0x2d,
-    0x34,
-    0x8d,
-    0x2a,
-    0x8c,
-    0x2a,
-    0xb3,
-    0xda,
-    0x4d,
-    0xb2,
-    0xfa,
-    0xae,
-    0x20,
-    0x8b,
-    0xb1,
-    0xff,
-    0x07,
-    0x84,
-    0xfd,
-    0xb3,
-    0x65,
-    0x40,
-    0x88,
-    0x19,
-    0x58,
-    0x36,
-    0x78,
-    0x14,
-    0x49,
-    0xfb,
-    0x9e,
-    0x7c,
-    0xc2,
-    0xc4,
-    0xf0,
-    0xc1,
-    0x7f,
-    0x27,
-    0x3a,
-    0xd1,
-    0xc7,
-    0x21,
-    0x10,
-    0x3c,
-    0xfd,
-    0x5d,
-    0x07,
-    0x96,
-    0x72,
-    0xb3,
-    0x25,
-    0x1e,
-    0x7d,
-    0xf0,
-    0x95,
-    0x9c,
-    0xce,
-    0xd5,
-    0x9f,
-    0x90,
-    0xff,
-    0x62,
-    0xd8,
-    0x88,
-    0x6c,
-    0x54,
-    0x96,
-    0xd2,
-    0x45,
-    0xec,
-    0xa7,
-    0x53,
-    0xe1,
-    0xf2,
-    0x43,
-    0xb7,
-    0x55,
-    0xfa,
-    0x3e,
-    0xcb,
-    0x46,
-    0xe6,
-    0x82,
-    0x26,
-    0xfb,
-    0xac,
-    0xbd,
-    0x0f,
-    0xb6,
-    0x59,
-    0x57,
-    0x9b,
-    0x45,
-    0x56,
-    0xa7,
-    0x16,
-    0xd4,
-    0xea,
-    0x66,
-    0xa4,
-    0x05,
-    0x01,
-    0x64,
-    0x28,
-    0x43,
-    0x2c,
-    0x79,
-    0x65,
-    0x53,
-    0xe8,
-    0xbf,
-    0x64,
-    0x2b,
-    0x23,
-    0xfe,
-    0x15,
-    0x08,
-    0xfc,
-    0x68,
-    0x38,
-    0xbb,
-    0xcb,
-    0x87,
-    0x7e,
-    0x43,
-    0x61,
-    0x73,
-    0xec,
-    0xa1,
-    0x91,
-    0x48,
-    0x81,
-    0xe8,
-    0xef,
-    0xd7,
-    0x18,
-    0x94,
-    0xd7,
-    0x9c,
-    0x90,
-    0x1c,
-    0xb1,
-    0xf1,
-    0x29,
-    0xcb,
-    0x74,
-    0x80,
-    0x31,
-    0xcb,
-    0x69,
-    0xfe,
-    0xe1,
-    0x83,
-    0x32,
-    0x17,
-    0x82,
-    0x23,
-    0x0a,
-    0xa4,
-    0xd3,
-    0x7c,
-    0x4e,
-    0x24,
-    0xaf,
-    0x16,
-    0x3d,
-    0x6a,
-    0xeb,
-    0x7c,
-    0xfc,
-    0x93,
-    0x7e,
-    0xdb,
-    0xdc,
-    0x3b,
-    0xe4,
-    0xcb,
-    0xe0,
-    0xf1,
-    0xc4,
-    0x6d,
-    0x7a,
-    0xe7,
-    0xd0,
-    0xb6,
-    0x96,
-    0xee,
-    0xec,
-    0x0a,
-    0xd9,
-    0xa2,
-    0x93,
-    0x0d,
-    0x2b,
-    0xe2,
-    0x77,
-    0xb6,
-    0x73,
-    0x84,
-    0x68,
-    0xa5,
-    0xa1,
-    0x46,
-    0x77,
-    0xb6,
-    0xf2,
-    0x07,
-    0x5b,
-    0xd6,
-    0x6f,
-    0x37,
-    0x14,
-    0x15,
-    0xb8,
-    0x8c,
-    0xce,
-    0xfd,
-    0xff,
-    0xf6,
-    0x07,
-    0x22,
-    0x57,
-    0xd6,
-    0xf4,
-    0xfb,
-    0x2f,
-    0x6b,
-    0x21,
-    0xf0,
-    0x19,
-    0x8c,
-    0x59,
-    0xb4,
-    0xd1,
-    0x9d,
-    0xc5,
-    0xd5,
-    0x7a,
-    0xbc,
-    0x57,
-    0x92,
-    0x2a,
-    0x3b,
-    0x6a,
-    0xec,
-    0xa9,
-    0x53,
-    0xa2,
-    0x00,
-    0x76,
-    0x16,
-    0x1a,
-    0x93,
-    0x0b,
-    0xa6,
-    0xbe,
-    0xef,
-    0x62,
-    0xa5,
-    0xf5,
-    0xee,
-    0xb8,
-    0xec,
-    0x84,
-    0x54,
-    0x91,
-    0x80,
-    0xaf,
-    0x61,
-    0xfc,
-    0xc1,
-    0xa0,
-    0xa7,
-    0x18,
-    0xe5,
-    0x0d,
-    0x1a,
-    0xd7,
-    0xa5,
-    0x16,
-    0x66,
-    0x02,
-    0x36,
-    0x6c,
-    0x85,
-    0x7e,
-    0x7b,
-    0xb8,
-    0x90,
-    0xcd,
-    0x79,
-    0x3b,
-    0xd5,
-    0xd7,
-    0x0b,
-    0xb1,
-    0x2b,
-    0xeb,
-    0xd7,
-    0x7c,
-    0x82,
-    0x01,
-    0x80,
-    0xfe,
-    0xbe,
-    0x42,
-    0x1e,
-    0x47,
-    0xc6,
-    0xca,
-    0xeb,
-    0xf0,
-    0xd7,
-    0xac,
-    0x3e,
-    0x46,
-    0x1f,
-    0x36,
-    0xbe,
-    0xac,
-    0x87,
-    0x77,
-    0xcf,
-    0x3a,
-    0xd0,
-    0xff,
-    0x51,
-    0xaa,
-    0xe1,
-    0xe6,
-    0x8a,
-    0x75,
-    0x5f,
-    0x10,
-    0x60,
-    0x39,
-    0x7f,
-    0xae,
-    0xcc,
-    0x5e,
-    0x18,
-    0x08,
-    0x8b,
-    0xf9,
-    0xfd,
-    0x7b,
-    0x17,
-    0xf0,
-    0x89,
-    0xbd,
-    0xd5,
-    0x60,
-    0x7b,
-    0x69,
-    0x90,
-    0x3b,
-    0x04,
-    0xb7,
-    0x26,
-    0x36,
-    0x1f,
-    0x8a,
-    0x81,
-    0xe2,
-    0x21,
-    0xb1,
-    0xc9,
-    0x18,
-    0x91,
-    0x66,
-    0xd8,
-    0x9b,
-    0x39,
-    0x1b,
-    0xef,
-    0xf9,
-    0x7d,
-    0x77,
-    0xa7,
-    0xb2,
-    0xec,
-    0x9b,
-    0x2a,
-    0x9c,
-    0x15,
-    0xa9,
-    0xa2,
-    0x86,
-    0x9c,
-    0x87,
-    0xf2,
-    0x1c,
-    0x8d,
-    0xe0,
-    0xa5,
-    0x0b,
-    0xef,
-    0x6c,
-    0x23,
-    0x65,
-    0x9d,
-    0x72,
-    0x2b,
-    0x46,
-    0x51,
-    0x8b,
-    0x7d,
-    0xb8,
-    0x02,
-    0xa8,
-    0xd7,
-    0xd4,
-    0x70,
-    0x56,
-    0x23,
-    0x2a,
-    0xfd,
-    0x41,
-    0xef,
-    0x63,
-    0xbe,
-    0xf7,
-    0x1d,
-    0x25,
-    0xd2,
-    0xef,
-    0xdc,
-    0x37,
-    0xf2,
-    0xca,
-    0xd7,
-    0xe6,
-    0x4a,
-    0xd8,
-    0xac,
-    0xa7,
-    0x87,
-    0xde,
-    0x9f,
-    0xfd,
-    0x32,
-    0x17,
-    0x90,
-    0x9d,
-    0x3c,
-    0x78,
-    0x2a,
-    0xd1,
-    0xda,
-    0x38,
-    0x5e,
-    0x1a,
-    0x93,
-    0x90,
-    0x0f,
-    0x19,
-    0x96,
-    0xc0,
-    0x0f,
-    0xaf,
-    0x52,
-    0x52,
-    0x4b,
-    0x64,
-    0x41,
-    0xa2,
-    0x42,
-    0x05,
-    0x04,
-    0x9e,
-    0xbc,
-    0x91,
-    0xb5,
-    0xcb,
-    0xb8,
-    0x57,
-    0x79,
-    0x89,
-    0xa6,
-    0x58,
-    0x54,
-    0x97,
-    0xd6,
-    0xf2,
-    0x42,
-    0xd9,
-    0x31,
-    0xc0,
-    0x83,
-    0x59,
-    0x27,
-    0xbc,
-    0x36,
-    0x8d,
-    0xe8,
-    0xa6,
-    0x29,
-    0xd8,
-    0xd7,
-    0xaa,
-    0xf0,
-    0x52,
-    0x3b,
-    0x3d,
-    0x34,
-    0xcc,
-    0x38,
-    0x48,
-    0x4e,
-    0x0f,
-    0xff,
-    0x88,
-    0x14,
-    0x65,
-    0x41,
-    0x34,
-    0xf3,
-    0x5b,
-    0xe9,
-    0xe1,
-    0x3f,
-    0xc4,
-    0x0a,
-    0xa4,
-    0xc6,
-    0x01,
-    0x16,
-    0x76,
-    0xab,
-    0x80,
-    0x52,
-    0xdc,
-    0x72,
-    0x83,
-    0x86,
-    0xc7,
-    0x57,
-    0x23,
-    0xf9,
-    0xb8,
-    0xe4,
-    0x94,
-    0x9c,
-    0x29,
-    0xc2,
-    0xaa,
-    0x86,
-    0x29,
-    0xd0,
-    0x9c,
-    0xa0,
-    0x46,
-    0x72,
-    0x09,
-    0xa2,
-    0xaf,
-    0x2c,
-    0x38,
-    0x3e,
-    0x9a,
-    0x6f,
-    0xa4,
-    0x9a,
-    0xe4,
-    0xb2,
-    0xb8,
-    0x04,
-    0xf7,
-    0xc5,
-    0xd7,
-    0xe2,
-    0xf1,
-    0x62,
-    0x9f,
-    0xe7,
-    0x03,
-    0x06,
-    0x6f,
-    0x8d,
-    0x16,
-    0xfe,
-    0x26,
-    0xbf,
-    0xb5,
-    0xc5,
-    0x2e,
-    0xd5,
-    0x27,
-    0x8d,
-    0xba,
-    0xc6,
-    0xdb,
-    0x1c,
-    0x4b,
-    0x99,
-    0x0a,
-    0xd9,
-    0x79,
-    0x1d,
-    0x97,
-    0x27,
-    0xf0,
-    0xda,
-    0x3a,
-    0xf1,
-    0xb9,
-    0x47,
-    0xdd,
-    0x86,
-    0xbb,
-    0x3e,
-    0x46,
-    0xa8,
-    0x81,
-    0xac,
-    0xf7,
-    0xdf,
-    0x3d,
-    0x8d,
-    0x52,
-    0x14,
-    0x0d,
-    0x18,
-    0x01,
-    0x5a,
-    0x7e,
-    0x36,
-    0x95,
-    0x0f,
-    0x4f,
-    0x39,
-    0x6d,
-    0x24,
-    0x77,
-    0xcb,
-    0xda,
-    0xb9,
-    0x68,
-    0x24,
-    0x80,
-    0xed,
-    0x96,
-    0x81,
-    0x00,
-    0xf4,
-    0x33,
-    0xd1,
-    0xd4,
-    0x6a,
-    0x3d,
-    0xb1,
-    0x7a,
-    0xe6,
-    0xbb,
-    0x9a,
-    0xd4,
-    0xd3,
-    0x44,
-    0x59,
-    0xcf,
-    0x7b,
-    0xc0,
-    0xc0,
-    0x43,
-    0x65,
-    0x73,
-    0x9c,
-    0x1a,
-    0xe1,
-    0x37,
-    0xe7,
-    0xb5,
-    0xe1,
-    0x08,
-    0x3e,
-    0x8b,
-    0x0a,
-    0xc6,
-    0x95,
-    0x13,
-    0x0b,
-    0x37,
-    0x29,
-    0xe5,
-    0x2e,
-    0x4c,
-    0xb6,
-    0x1c,
-    0x2c,
-    0xa5,
-    0xea,
-    0xfe,
-    0x46,
-    0x56,
-    0x1a,
-    0xdf,
-    0x91,
-    0xec,
-    0x35,
-    0x42,
-    0x92,
-    0xab,
-    0xf6,
-    0x42,
-    0x0a,
-    0x1a,
-    0x5d,
-    0x30,
-    0x13,
-    0xc2,
-    0x5f,
-    0x7e,
-    0x6c,
-    0x32,
-    0xdd,
-    0xdb,
-    0x12,
-    0x46,
-    0xd3,
-    0xa0,
-    0x10,
-    0xa9,
-    0xd2,
-    0x6b,
-    0x97,
-    0x99,
-    0xb0,
-    0x09,
-    0x51,
-    0xea,
-    0x7e,
-    0x9a,
-    0xf3,
-    0x4e,
-    0xba,
-    0xef,
-    0x12,
-    0xd3,
-    0xc6,
-    0x37,
-    0x37,
-    0xad,
-    0x99,
-    0xdb,
-    0x35,
-    0x36,
-    0xb5,
-    0xa6,
-    0xba,
-    0x33,
-    0x58,
-    0x29,
-    0x25,
-    0x59,
-    0xf7,
-    0x5e,
-    0x97,
-    0x10,
-    0xe8,
-    0x8b,
-    0x4d,
-    0x76,
-    0x5f,
-    0x69,
-    0x2d,
-    0xa7,
-    0x9b,
-    0x86,
-    0x9e,
-    0x3c,
-    0x61,
-    0xe8,
-    0x9d,
-    0x11,
-    0xaa,
-    0xf3,
-    0x0e,
-    0x4c,
-    0x99,
-    0x8d,
-    0x4f,
-    0x9a,
-    0xaf,
-    0x7f,
-    0x13,
-    0xbc,
-    0x42,
-    0x1e,
-    0x6e,
-    0x43,
-    0x2b,
-    0x2c,
-    0x2c,
-    0x97,
-    0xc0,
-    0xf9,
-    0x67,
-    0x3e,
-    0x02,
-    0xcd,
-    0x59,
-    0x5b,
-    0x17,
-    0x8a,
-    0x6e,
-    0x75,
-    0xfa,
-    0x8e,
-    0x9d,
-    0x7a,
-    0x71,
-    0xd7,
-    0xf9,
-    0x04,
-    0x3f,
-    0x6a,
-    0x83,
-    0xda,
-    0x9b,
-    0xf5,
-    0x43,
-    0xba,
-    0xe2,
-    0xb3,
-    0x97,
-    0x56,
-    0x89,
-    0x90,
-    0xca,
-    0x9c,
-    0x55,
-    0x8e,
-    0xe8,
-    0x3a,
-    0xce,
-    0x67
-  ],
-  const [
-    0xfa,
-    0x15,
-    0xcc,
-    0x7f,
-    0x0d,
-    0xe2,
-    0x94,
-    0xd7,
-    0x34,
-    0x1b,
-    0x1f,
-    0xd7,
-    0x93,
-    0x26,
-    0xc8,
-    0xbe,
-    0x78,
-    0xe6,
-    0x78,
-    0x22,
-    0x34,
-    0x3c,
-    0x19,
-    0x92,
-    0x2a,
-    0xce,
-    0x4e,
-    0x79,
-    0x25,
-    0x07,
-    0x61,
-    0x45,
-    0xef,
-    0x5f,
-    0x7d,
-    0xc9,
-    0x1f,
-    0xdc,
-    0x1d,
-    0xe0,
-    0x32,
-    0xd8,
-    0xc4,
-    0x54,
-    0xdd,
-    0x06,
-    0xef,
-    0xfe,
-    0xa2,
-    0xb0,
-    0x47,
-    0x2e,
-    0xa2,
-    0x42,
-    0x1c,
-    0x4d,
-    0xb2,
-    0x0c,
-    0x0f,
-    0xc0,
-    0xb0,
-    0x44,
-    0x0e,
-    0x10,
-    0x18,
-    0x4a,
-    0x86,
-    0x48,
-    0xd2,
-    0x30,
-    0xd3,
-    0x9f,
-    0x4e,
-    0x7a,
-    0xfc,
-    0x57,
-    0xd3,
-    0x22,
-    0x9d,
-    0xe5,
-    0x14,
-    0xe0,
-    0x24,
-    0x52,
-    0x05,
-    0xa8,
-    0x40,
-    0xe1,
-    0xec,
-    0x73,
-    0x97,
-    0xf2,
-    0xbb,
-    0x42,
-    0xb8,
-    0x26,
-    0x9d,
-    0x60,
-    0x50,
-    0xc4,
-    0xcf,
-    0xe8,
-    0xa0,
-    0x5c,
-    0xb1,
-    0x88,
-    0x2e,
-    0xaa,
-    0x1d,
-    0x84,
-    0xbb,
-    0xbc,
-    0xf7,
-    0xfe,
-    0x76,
-    0x57,
-    0x05,
-    0x74,
-    0x6f,
-    0x98,
-    0x01,
-    0x8a,
-    0x4e,
-    0xd7,
-    0xed,
-    0x0a,
-    0x45,
-    0xd0,
-    0xa7,
-    0x29,
-    0x43,
-    0x05,
-    0xbd,
-    0x0c,
-    0x6b,
-    0x5e,
-    0x82,
-    0x8a,
-    0xc4,
-    0x13,
-    0x62,
-    0x34,
-    0x32,
-    0xcb,
-    0x72,
-    0x92,
-    0xa5,
-    0x06,
-    0x4b,
-    0xb0,
-    0x90,
-    0xb8,
-    0x19,
-    0xd9,
-    0x9d,
-    0x36,
-    0xef,
-    0xa3,
-    0x9f,
-    0x56,
-    0x5e,
-    0x2c,
-    0xc7,
-    0xd2,
-    0x45,
-    0xa2,
-    0x1c,
-    0xee,
-    0xea,
-    0x09,
-    0x25,
-    0x5b,
-    0x4a,
-    0x38,
-    0xe8,
-    0x5a,
-    0xae,
-    0x25,
-    0x19,
-    0x25,
-    0x7f,
-    0x63,
-    0x8b,
-    0x8a,
-    0x5b,
-    0xe9,
-    0xea,
-    0xd9,
-    0x68,
-    0x15,
-    0xac,
-    0x00,
-    0xe9,
-    0xf1,
-    0x45,
-    0xf5,
-    0x0f,
-    0xb4,
-    0x9a,
-    0x54,
-    0x11,
-    0x8c,
-    0xb9,
-    0x4a,
-    0x7f,
-    0x9a,
-    0xc7,
-    0xb1,
-    0xd3,
-    0x3e,
-    0x39,
-    0x7c,
-    0x49,
-    0x96,
-    0x48,
-    0x56,
-    0xf0,
-    0x41,
-    0x9e,
-    0x86,
-    0x01,
-    0x69,
-    0x56,
-    0x16,
-    0x70,
-    0x00,
-    0x23,
-    0x34,
-    0xc2,
-    0x49,
-    0xcf,
-    0xd8,
-    0x1e,
-    0x9b,
-    0xe8,
-    0xa7,
-    0xa6,
-    0x62,
-    0xb6,
-    0x18,
-    0x08,
-    0x66,
-    0x6f,
-    0xd5,
-    0x4f,
-    0x50,
-    0xae,
-    0x64,
-    0x00,
-    0x6a,
-    0x22,
-    0x06,
-    0x62,
-    0xa6,
-    0x83,
-    0xdf,
-    0x1d,
-    0xe2,
-    0xcb,
-    0x58,
-    0x06,
-    0x6a,
-    0xa2,
-    0xc2,
-    0x3a,
-    0xbe,
-    0x1a,
-    0x3c,
-    0x6a,
-    0x96,
-    0x9c,
-    0xd6,
-    0x75,
-    0x24,
-    0x23,
-    0xf6,
-    0x3c,
-    0x99,
-    0xa7,
-    0xfb,
-    0xb2,
-    0xea,
-    0xdd,
-    0x21,
-    0x32,
-    0xd4,
-    0x1d,
-    0xa4,
-    0x16,
-    0x1e,
-    0xa3,
-    0x29,
-    0x85,
-    0x1e,
-    0xfb,
-    0x59,
-    0x8c,
-    0x7e,
-    0xb7,
-    0xcf,
-    0x70,
-    0x40,
-    0x63,
-    0x34,
-    0x43,
-    0x00,
-    0xbb,
-    0xa8,
-    0xb6,
-    0x79,
-    0x1b,
-    0x64,
-    0x2e,
-    0x4b,
-    0x36,
-    0x9e,
-    0x1a,
-    0xfc,
-    0x0b,
-    0xad,
-    0x83,
-    0x3c,
-    0x15,
-    0x6e,
-    0xe4,
-    0x6d,
-    0xc2,
-    0xe6,
-    0x3d,
-    0x62,
-    0x27,
-    0x29,
-    0x63,
-    0x67,
-    0xf2,
-    0x7a,
-    0x9a,
-    0x82,
-    0xa0,
-    0xb3,
-    0x65,
-    0xf9,
-    0xf0,
-    0xe8,
-    0x9d,
-    0x14,
-    0x97,
-    0x47,
-    0xc1,
-    0x24,
-    0x35,
-    0x42,
-    0x8d,
-    0xc4,
-    0x88,
-    0xf1,
-    0xce,
-    0x5f,
-    0xdf,
-    0xb1,
-    0x74,
-    0xf3,
-    0xd2,
-    0x12,
-    0xe9,
-    0x14,
-    0x31,
-    0xf0,
-    0xa1,
-    0x33,
-    0x3a,
-    0xdf,
-    0xf3,
-    0x20,
-    0x0f,
-    0xcd,
-    0x27,
-    0xce,
-    0x67,
-    0xe2,
-    0xd0,
-    0x57,
-    0x83,
-    0xab,
-    0x5c,
-    0x3f,
-    0x64,
-    0x78,
-    0xe9,
-    0xfd,
-    0x3b,
-    0x02,
-    0x5a,
-    0xb7,
-    0x21,
-    0x51,
-    0xaa,
-    0x4e,
-    0x08,
-    0xdd,
-    0x81,
-    0x9a,
-    0xf1,
-    0xf4,
-    0x05,
-    0xf7,
-    0x60,
-    0x5b,
-    0xf3,
-    0x00,
-    0x0d,
-    0x38,
-    0xee,
-    0x9a,
-    0xdd,
-    0x2f,
-    0x17,
-    0x35,
-    0x10,
-    0xcc,
-    0xdd,
-    0x4e,
-    0xbc,
-    0x21,
-    0x17,
-    0x38,
-    0x7a,
-    0xb0,
-    0x50,
-    0x1d,
-    0x5f,
-    0x8b,
-    0x61,
-    0x40,
-    0x2e,
-    0xb9,
-    0x46,
-    0x84,
-    0xcb,
-    0xdc,
-    0x2a,
-    0x32,
-    0xf3,
-    0x11,
-    0xc4,
-    0xf7,
-    0x2b,
-    0x18,
-    0xe6,
-    0x2c,
-    0xf6,
-    0xb5,
-    0x53,
-    0x5a,
-    0x4b,
-    0x55,
-    0xd2,
-    0xfe,
-    0x46,
-    0xf5,
-    0x80,
-    0x89,
-    0x1e,
-    0x40,
-    0x6a,
-    0xab,
-    0x57,
-    0xf7,
-    0x5b,
-    0xd1,
-    0x39,
-    0x96,
-    0xf3,
-    0xed,
-    0x80,
-    0x35,
-    0xf9,
-    0x75,
-    0x55,
-    0xac,
-    0xf2,
-    0xae,
-    0x7d,
-    0xfa,
-    0xf3,
-    0x2a,
-    0xd1,
-    0xe8,
-    0xb3,
-    0x8f,
-    0xee,
-    0xe9,
-    0xe4,
-    0x9b,
-    0x2d,
-    0x45,
-    0xc4,
-    0x65,
-    0xd6,
-    0x76,
-    0xef,
-    0xe6,
-    0x90,
-    0xd2,
-    0x77,
-    0xb7,
-    0x1c,
-    0x6b,
-    0x36,
-    0x1c,
-    0x43,
-    0x34,
-    0x63,
-    0x42,
-    0x0d,
-    0x65,
-    0x64,
-    0xc5,
-    0x34,
-    0x20,
-    0xe3,
-    0x75,
-    0xd8,
-    0x54,
-    0x24,
-    0x5a,
-    0x74,
-    0xe2,
-    0x96,
-    0xf6,
-    0x11,
-    0xfe,
-    0xa8,
-    0xc9,
-    0xba,
-    0xd8,
-    0xdd,
-    0x1b,
-    0x2f,
-    0x7c,
-    0x23,
-    0xf5,
-    0xde,
-    0xf7,
-    0x61,
-    0x71,
-    0x0e,
-    0xbc,
-    0x4f,
-    0x33,
-    0x5e,
-    0x46,
-    0x8a,
-    0x38,
-    0x6e,
-    0xfe,
-    0xe8,
-    0xcf,
-    0xdc,
-    0x5e,
-    0x08,
-    0xe4,
-    0x72,
-    0x57,
-    0x2e,
-    0x84,
-    0x9d,
-    0xf0,
-    0x4e,
-    0x9e,
-    0x21,
-    0x31,
-    0x67,
-    0x07,
-    0x0c,
-    0x3f,
-    0x13,
-    0xc1,
-    0xe8,
-    0xc8,
-    0x5b,
-    0x7d,
-    0x35,
-    0xa1,
-    0xcf,
-    0x5e,
-    0x17,
-    0xae,
-    0xd7,
-    0x00,
-    0x4b,
-    0x03,
-    0x44,
-    0xb9,
-    0x5f,
-    0x48,
-    0x2a,
-    0x1f,
-    0x23,
-    0x62,
-    0xf2,
-    0xca,
-    0x5b,
-    0x50,
-    0xab,
-    0x5b,
-    0xb6,
-    0x52,
-    0xa1,
-    0xbc,
-    0x04,
-    0x51,
-    0x31,
-    0xaa,
-    0xa3,
-    0x7b,
-    0xdb,
-    0x71,
-    0x3a,
-    0x2e,
-    0x99,
-    0xf7,
-    0xaa,
-    0x17,
-    0x6f,
-    0xfc,
-    0x42,
-    0x9b,
-    0x44,
-    0xa0,
-    0x33,
-    0x75,
-    0xf0,
-    0x26,
-    0x43,
-    0xa1,
-    0x96,
-    0xf7,
-    0xc5,
-    0x79,
-    0x34,
-    0xea,
-    0xc8,
-    0x1f,
-    0x78,
-    0xc2,
-    0x8f,
-    0x1a,
-    0xd6,
-    0xf9,
-    0x41,
-    0x44,
-    0xd7,
-    0xbc,
-    0xe2,
-    0xe3,
-    0xb4,
-    0x36,
-    0x82,
-    0x16,
-    0x23,
-    0x11,
-    0xb4,
-    0x73,
-    0x71,
-    0x3a,
-    0x42,
-    0xee,
-    0xd1,
-    0xe5,
-    0x1f,
-    0xfc,
-    0xf4,
-    0xd2,
-    0x9d,
-    0xf9,
-    0xd9,
-    0xce,
-    0xe0,
-    0xc7,
-    0xe7,
-    0x7c,
-    0x93,
-    0xb9,
-    0x39,
-    0x55,
-    0xd9,
-    0xaf,
-    0x39,
-    0xee,
-    0x87,
-    0x82,
-    0x70,
-    0x79,
-    0x90,
-    0xa2,
-    0x9c,
-    0x8f,
-    0xc1,
-    0xfd,
-    0x03,
-    0x2d,
-    0xae,
-    0x23,
-    0x08,
-    0xfc,
-    0xec,
-    0xa8,
-    0xfc,
-    0xd5,
-    0x80,
-    0xca,
-    0x36,
-    0x84,
-    0x98,
-    0x54,
-    0x66,
-    0xcc,
-    0x79,
-    0xc3,
-    0x26,
-    0xac,
-    0xb9,
-    0xa6,
-    0xd2,
-    0xe1,
-    0xae,
-    0x4b,
-    0x9a,
-    0xac,
-    0x26,
-    0x97,
-    0xd5,
-    0xd5,
-    0x58,
-    0x36,
-    0x98,
-    0xf0,
-    0x1b,
-    0xf5,
-    0x88,
-    0xdf,
-    0x56,
-    0x6b,
-    0xec,
-    0x98,
-    0xb8,
-    0xdf,
-    0x07,
-    0x29,
-    0xa9,
-    0x66,
-    0xa4,
-    0xf9,
-    0x80,
-    0x4c,
-    0xf2,
-    0x50,
-    0xf6,
-    0xb5,
-    0x92,
-    0x19,
-    0xda,
-    0x84,
-    0xef,
-    0xe7,
-    0x07,
-    0x7c,
-    0xce,
-    0x37,
-    0x94,
-    0xa5,
-    0x26,
-    0xf5,
-    0x4a,
-    0xf2,
-    0x31,
-    0x41,
-    0x5b,
-    0x20,
-    0xc3,
-    0x72,
-    0x50,
-    0xe1,
-    0xdb,
-    0x5b,
-    0x44,
-    0x3a,
-    0x77,
-    0xce,
-    0x50,
-    0x2a,
-    0xad,
-    0x5f,
-    0x46,
-    0x8c,
-    0xf8,
-    0x6a,
-    0xa2,
-    0x3e,
-    0xd0,
-    0x58,
-    0xbd,
-    0x83,
-    0x7d,
-    0x1d,
-    0x44,
-    0xa6,
-    0x2c,
-    0x05,
-    0xe9,
-    0xe1,
-    0x43,
-    0xb1,
-    0x58,
-    0x7c,
-    0xf2,
-    0x5c,
-    0x6d,
-    0x39,
-    0x0a,
-    0x64,
-    0xa4,
-    0xf0,
-    0x13,
-    0x05,
-    0xd1,
-    0x77,
-    0x99,
-    0x67,
-    0x11,
-    0xc4,
-    0xc6,
-    0xdb,
-    0x00,
-    0x56,
-    0x36,
-    0x61,
-    0x2c,
-    0xd1,
-    0x06,
-    0x6f,
-    0xca,
-    0xe8,
-    0x2e,
-    0xed,
-    0xa8,
-    0x7f,
-    0x11,
-    0x84,
-    0x63,
-    0x11,
-    0x53,
-    0x18,
-    0xda,
-    0x50,
-    0xeb,
-    0x93,
-    0xe2,
-    0x0c,
-    0x79,
-    0xe5,
-    0x3c,
-    0x56,
-    0xd9,
-    0x49,
-    0xc4,
-    0xe5,
-    0xf8,
-    0xc9,
-    0xea,
-    0xb9,
-    0xe6,
-    0x04,
-    0x66,
-    0xfd,
-    0x2d,
-    0x2f,
-    0x28,
-    0x32,
-    0x62,
-    0x5a,
-    0x8e,
-    0x8a,
-    0xf9,
-    0xf4,
-    0xda,
-    0x92,
-    0x5d,
-    0x92,
-    0xe3,
-    0x14,
-    0x41,
-    0xec,
-    0x0b,
-    0x3c,
-    0x30,
-    0x28,
-    0x70,
-    0xf9,
-    0x6c,
-    0x5c,
-    0x67,
-    0xa6,
-    0xf5,
-    0x4e,
-    0x26,
-    0xea,
-    0xe8,
-    0x7e,
-    0xc0,
-    0xdd,
-    0x0a,
-    0x66,
-    0x57,
-    0x6c,
-    0xa5,
-    0x00,
-    0x8c,
-    0xfe,
-    0x93,
-    0x89,
-    0x3b,
-    0x58,
-    0x98,
-    0x85,
-    0x66,
-    0xbd,
-    0xf5,
-    0x03,
-    0x6e,
-    0x5a,
-    0x39,
-    0x22,
-    0x89,
-    0xe2,
-    0x5b,
-    0xd4,
-    0x70,
-    0x76,
-    0x06,
-    0xe2,
-    0x58,
-    0xc7,
-    0x34,
-    0x30,
-    0x24,
-    0x7e,
-    0xfe,
-    0x43,
-    0xd9,
-    0xdc,
-    0xb2,
-    0x00,
-    0x52,
-    0x9d,
-    0x27,
-    0xb6,
-    0x35,
-    0x23,
-    0x4d,
-    0x5f,
-    0x25,
-    0xd0,
-    0x08,
-    0x23,
-    0x39,
-    0xb4,
-    0x3f,
-    0x1e,
-    0xad,
-    0x68,
-    0x30,
-    0x63,
-    0xd8,
-    0x39,
-    0x06,
-    0x41,
-    0x5e,
-    0x89,
-    0xad,
-    0xc5,
-    0xa7,
-    0x73,
-    0xe5,
-    0x7f,
-    0x90,
-    0xae,
-    0x95,
-    0x89,
-    0x60,
-    0xb4,
-    0x62,
-    0xc6,
-    0xfd,
-    0x23,
-    0x81,
-    0x68,
-    0x60,
-    0x63,
-    0xc9,
-    0xb5,
-    0x46,
-    0x89,
-    0x0d,
-    0x0a,
-    0x28,
-    0x7b,
-    0xa8,
-    0x20,
-    0x6e,
-    0x55,
-    0x59,
-    0x8e,
-    0xe0,
-    0x0c,
-    0x52,
-    0x8f,
-    0x5d,
-    0x52,
-    0x8b,
-    0x06,
-    0xcf,
-    0xb9,
-    0x5c,
-    0xbf,
-    0x5e,
-    0x1a,
-    0x4b,
-    0xf8,
-    0xe4,
-    0x38,
-    0x23,
-    0x20,
-    0xa1,
-    0xa1,
-    0x46,
-    0xde,
-    0x31,
-    0xd5,
-    0x43,
-    0x55,
-    0xba,
-    0xaa,
-    0xab,
-    0xa7,
-    0x6a,
-    0xef,
-    0x21,
-    0xb7,
-    0x21,
-    0x50,
-    0xb1,
-    0x34
-  ],
-  const [
-    0xb7,
-    0x18,
-    0xc9,
-    0x68,
-    0xe8,
-    0xff,
-    0xe4,
-    0xea,
-    0x28,
-    0x2f,
-    0xc3,
-    0x3f,
-    0x96,
-    0xda,
-    0x23,
-    0x3b,
-    0x8a,
-    0x8a,
-    0xb6,
-    0xdd,
-    0xd5,
-    0x57,
-    0x81,
-    0x24,
-    0x4a,
-    0x5d,
-    0x82,
-    0x23,
-    0x7d,
-    0x6d,
-    0x97,
-    0x58,
-    0xca,
-    0x03,
-    0x9b,
-    0x3a,
-    0x99,
-    0x78,
-    0xd2,
-    0x11,
-    0xe1,
-    0x79,
-    0x87,
-    0x0a,
-    0xeb,
-    0xb8,
-    0xf3,
-    0x8b,
-    0x59,
-    0xe1,
-    0x61,
-    0xc4,
-    0x66,
-    0xd0,
-    0x90,
-    0x87,
-    0x6f,
-    0x01,
-    0x59,
-    0x59,
-    0xb3,
-    0x48,
-    0x91,
-    0xc9,
-    0x57,
-    0xc2,
-    0x31,
-    0x00,
-    0xad,
-    0x0b,
-    0xb4,
-    0x9a,
-    0xb5,
-    0xb1,
-    0xc1,
-    0xb4,
-    0xe4,
-    0xe9,
-    0x0a,
-    0x46,
-    0x25,
-    0x81,
-    0x74,
-    0xb4,
-    0x1e,
-    0x16,
-    0x78,
-    0x9f,
-    0xb4,
-    0x87,
-    0xc9,
-    0x01,
-    0xd1,
-    0xa9,
-    0x37,
-    0x79,
-    0x64,
-    0x3d,
-    0xd3,
-    0xe3,
-    0xaa,
-    0x1f,
-    0x54,
-    0x2c,
-    0xad,
-    0xc0,
-    0xb9,
-    0x64,
-    0x0a,
-    0xd5,
-    0x30,
-    0x15,
-    0xf6,
-    0x51,
-    0x37,
-    0xd4,
-    0x83,
-    0x91,
-    0x01,
-    0x15,
-    0x20,
-    0xd7,
-    0x1b,
-    0x44,
-    0x5f,
-    0xfa,
-    0x4f,
-    0x11,
-    0xfc,
-    0x5c,
-    0xc9,
-    0x0b,
-    0x1a,
-    0x1b,
-    0x78,
-    0x70,
-    0xcf,
-    0x8c,
-    0xb7,
-    0x43,
-    0xe3,
-    0xe5,
-    0x2d,
-    0xa0,
-    0xd5,
-    0x39,
-    0xf1,
-    0x4d,
-    0x1f,
-    0xaa,
-    0xf2,
-    0x91,
-    0xbb,
-    0xda,
-    0x97,
-    0x49,
-    0xe6,
-    0xa2,
-    0xa2,
-    0x38,
-    0x24,
-    0x07,
-    0x5a,
-    0x9f,
-    0x84,
-    0x69,
-    0xe9,
-    0x0d,
-    0x25,
-    0xfe,
-    0x03,
-    0x79,
-    0xf9,
-    0x7f,
-    0xc8,
-    0x8e,
-    0xc9,
-    0x21,
-    0xec,
-    0x46,
-    0x7a,
-    0xc7,
-    0x15,
-    0xba,
-    0x8e,
-    0x76,
-    0x84,
-    0x39,
-    0xee,
-    0x09,
-    0xf8,
-    0x97,
-    0xe6,
-    0x26,
-    0xcf,
-    0xc7,
-    0x71,
-    0x70,
-    0x6f,
-    0xac,
-    0xb7,
-    0xfe,
-    0xe4,
-    0x2d,
-    0xd4,
-    0x0d,
-    0xca,
-    0x88,
-    0xdb,
-    0xf1,
-    0x6e,
-    0xe8,
-    0x1a,
-    0x52,
-    0x30,
-    0x39,
-    0xa0,
-    0x94,
-    0x2c,
-    0x3b,
-    0xfd,
-    0x97,
-    0x19,
-    0xd5,
-    0x49,
-    0xa1,
-    0x70,
-    0xad,
-    0x68,
-    0x98,
-    0xd1,
-    0xf5,
-    0x8b,
-    0x75,
-    0xa4,
-    0x88,
-    0xfa,
-    0xf5,
-    0xfc,
-    0x35,
-    0x12,
-    0x91,
-    0xc0,
-    0x5a,
-    0x89,
-    0xb1,
-    0x0c,
-    0xb5,
-    0xfa,
-    0x1d,
-    0xd5,
-    0x78,
-    0x9d,
-    0xb4,
-    0xcc,
-    0x9b,
-    0x55,
-    0x60,
-    0x85,
-    0x76,
-    0xf1,
-    0x49,
-    0xd9,
-    0x8f,
-    0xab,
-    0x49,
-    0x89,
-    0xb1,
-    0xf5,
-    0xa1,
-    0x23,
-    0x3e,
-    0x76,
-    0xea,
-    0x2a,
-    0xc5,
-    0x4f,
-    0x4e,
-    0x71,
-    0xd7,
-    0xa2,
-    0xf7,
-    0xc8,
-    0x17,
-    0x55,
-    0xc8,
-    0xda,
-    0x91,
-    0x13,
-    0x4b,
-    0x56,
-    0x4d,
-    0x94,
-    0xeb,
-    0x4d,
-    0x23,
-    0x1f,
-    0x64,
-    0xdc,
-    0xd0,
-    0x4d,
-    0x77,
-    0x0a,
-    0x4a,
-    0x0f,
-    0xe2,
-    0xf3,
-    0x51,
-    0xf2,
-    0x8f,
-    0x27,
-    0x47,
-    0xa2,
-    0x0c,
-    0x4d,
-    0x41,
-    0xad,
-    0x3b,
-    0x0c,
-    0x5e,
-    0x8a,
-    0x4b,
-    0x2b,
-    0x58,
-    0xda,
-    0xe6,
-    0xf6,
-    0x58,
-    0xed,
-    0xac,
-    0xe4,
-    0x0f,
-    0x88,
-    0xe1,
-    0x78,
-    0x02,
-    0xe6,
-    0x62,
-    0x65,
-    0x25,
-    0xfc,
-    0xde,
-    0xf5,
-    0xac,
-    0x02,
-    0x42,
-    0xab,
-    0x1e,
-    0x2e,
-    0x75,
-    0x28,
-    0xab,
-    0xc3,
-    0x46,
-    0x4b,
-    0xbf,
-    0x4a,
-    0xa3,
-    0x9c,
-    0xd7,
-    0x1f,
-    0x0b,
-    0xeb,
-    0x94,
-    0x30,
-    0x45,
-    0x34,
-    0x0d,
-    0x02,
-    0x53,
-    0xc6,
-    0x6a,
-    0xf5,
-    0xa2,
-    0xa4,
-    0xaf,
-    0xc8,
-    0x83,
-    0x2c,
-    0xd5,
-    0x5f,
-    0xdf,
-    0xf6,
-    0x1f,
-    0xc4,
-    0x25,
-    0xff,
-    0xab,
-    0x6d,
-    0x88,
-    0x07,
-    0x48,
-    0xbd,
-    0x68,
-    0x37,
-    0x87,
-    0xcc,
-    0x0d,
-    0x07,
-    0x15,
-    0x6b,
-    0x9b,
-    0x5f,
-    0x47,
-    0x63,
-    0x42,
-    0xfc,
-    0xf7,
-    0xfe,
-    0xb6,
-    0x16,
-    0x8f,
-    0xc9,
-    0xdf,
-    0x40,
-    0x63,
-    0x97,
-    0xd1,
-    0x8f,
-    0x44,
-    0xc9,
-    0xfe,
-    0xfe,
-    0x51,
-    0xcd,
-    0xaa,
-    0x11,
-    0x11,
-    0xe5,
-    0xa0,
-    0xb9,
-    0xbf,
-    0x2a,
-    0x24,
-    0x78,
-    0xe5,
-    0xd0,
-    0x28,
-    0xc5,
-    0x2d,
-    0xab,
-    0xc3,
-    0xb2,
-    0x73,
-    0xf2,
-    0xde,
-    0xcc,
-    0x1e,
-    0x44,
-    0x31,
-    0x43,
-    0xb1,
-    0xe8,
-    0x6e,
-    0x4b,
-    0x9d,
-    0x59,
-    0xbb,
-    0xc1,
-    0x5a,
-    0x02,
-    0x66,
-    0x12,
-    0xb5,
-    0x46,
-    0xd4,
-    0x59,
-    0x6c,
-    0xc3,
-    0xbb,
-    0xc7,
-    0xf8,
-    0xd8,
-    0x91,
-    0x48,
-    0xaa,
-    0x64,
-    0x45,
-    0x63,
-    0xf9,
-    0xd1,
-    0x2c,
-    0x62,
-    0x1b,
-    0x52,
-    0x3e,
-    0xb4,
-    0xd2,
-    0x68,
-    0x82,
-    0x8f,
-    0x89,
-    0xab,
-    0xc7,
-    0xda,
-    0x9f,
-    0xc7,
-    0x95,
-    0x49,
-    0x03,
-    0xc5,
-    0x63,
-    0xca,
-    0x01,
-    0x8c,
-    0x0a,
-    0x20,
-    0x5b,
-    0xa7,
-    0x7a,
-    0xcd,
-    0x9c,
-    0x48,
-    0xac,
-    0x36,
-    0xa9,
-    0x8d,
-    0xd8,
-    0x02,
-    0x99,
-    0x03,
-    0xe7,
-    0xc3,
-    0xc6,
-    0x69,
-    0x2b,
-    0xd8,
-    0x24,
-    0xb6,
-    0x4e,
-    0x92,
-    0xd2,
-    0x5d,
-    0x88,
-    0x95,
-    0xef,
-    0xcf,
-    0x15,
-    0x81,
-    0xaf,
-    0x41,
-    0xe7,
-    0xd2,
-    0xae,
-    0xb0,
-    0x98,
-    0x05,
-    0x84,
-    0x23,
-    0xa2,
-    0xfd,
-    0x99,
-    0x31,
-    0xd2,
-    0xa4,
-    0x3b,
-    0xc2,
-    0xfa,
-    0xd5,
-    0xed,
-    0x1a,
-    0xe7,
-    0x7a,
-    0x02,
-    0x13,
-    0x92,
-    0xf1,
-    0x6b,
-    0xa9,
-    0x9a,
-    0xb5,
-    0xce,
-    0xbc,
-    0xf2,
-    0x3a,
-    0xd8,
-    0x12,
-    0xd7,
-    0x18,
-    0xd3,
-    0x9c,
-    0x06,
-    0x6c,
-    0x7b,
-    0xfa,
-    0x2b,
-    0x7b,
-    0x0d,
-    0x40,
-    0x9c,
-    0x99,
-    0xa2,
-    0xfb,
-    0x47,
-    0x4a,
-    0xbb,
-    0x6f,
-    0xea,
-    0xa6,
-    0x1d,
-    0x23,
-    0x82,
-    0x02,
-    0xdf,
-    0xa0,
-    0x05,
-    0xcc,
-    0xc1,
-    0x75,
-    0x53,
-    0xb7,
-    0xbf,
-    0x7e,
-    0x6a,
-    0x18,
-    0xe6,
-    0x66,
-    0xda,
-    0x90,
-    0x67,
-    0x6b,
-    0x7a,
-    0xec,
-    0xea,
-    0x61,
-    0x58,
-    0x49,
-    0x24,
-    0xfa,
-    0xf6,
-    0x7c,
-    0xac,
-    0x44,
-    0xb3,
-    0xb1,
-    0x0a,
-    0x73,
-    0x87,
-    0x51,
-    0x11,
-    0xe1,
-    0xf3,
-    0x2a,
-    0x70,
-    0x53,
-    0x38,
-    0xca,
-    0x83,
-    0x7e,
-    0xc8,
-    0x2b,
-    0x6f,
-    0xca,
-    0xfa,
-    0x96,
-    0x6d,
-    0x55,
-    0x01,
-    0xc1,
-    0x66,
-    0x3b,
-    0x1f,
-    0x3b,
-    0xc1,
-    0x15,
-    0x16,
-    0x09,
-    0x79,
-    0xbf,
-    0xe0,
-    0x92,
-    0x72,
-    0x5f,
-    0x9f,
-    0xb8,
-    0x0d,
-    0xa2,
-    0xd7,
-    0x48,
-    0xfa,
-    0x49,
-    0xdb,
-    0x94,
-    0x4d,
-    0xe5,
-    0x85,
-    0x5e,
-    0xd4,
-    0xde,
-    0x2a,
-    0xf8,
-    0xa8,
-    0xba,
-    0xcd,
-    0xaa,
-    0x03,
-    0x9c,
-    0x93,
-    0x54,
-    0x51,
-    0x0b,
-    0x77,
-    0x54,
-    0x8a,
-    0xf5,
-    0x3f,
-    0xaa,
-    0xbe,
-    0xf4,
-    0xaf,
-    0x5a,
-    0xf2,
-    0xcf,
-    0xfc,
-    0x12,
-    0x2a,
-    0x44,
-    0x84,
-    0x0d,
-    0xc7,
-    0x05,
-    0xbb,
-    0x37,
-    0x13,
-    0x00,
-    0x69,
-    0x92,
-    0x1b,
-    0xe3,
-    0x13,
-    0xd8,
-    0xbd,
-    0xe0,
-    0xb6,
-    0x62,
-    0x01,
-    0xae,
-    0xbc,
-    0x48,
-    0xad,
-    0xd0,
-    0x28,
-    0xca,
-    0x13,
-    0x19,
-    0x14,
-    0xef,
-    0x2e,
-    0x70,
-    0x5d,
-    0x6b,
-    0xed,
-    0xd1,
-    0x9d,
-    0xc6,
-    0xcf,
-    0x94,
-    0x59,
-    0xbb,
-    0xb0,
-    0xf2,
-    0x7c,
-    0xdf,
-    0xe3,
-    0xc5,
-    0x04,
-    0x83,
-    0x80,
-    0x8f,
-    0xfc,
-    0xda,
-    0xff,
-    0xbe,
-    0xaa,
-    0x5f,
-    0x06,
-    0x2e,
-    0x09,
-    0x71,
-    0x80,
-    0xf0,
-    0x7a,
-    0x40,
-    0xef,
-    0x4a,
-    0xb6,
-    0xed,
-    0x03,
-    0xfe,
-    0x07,
-    0xed,
-    0x6b,
-    0xcf,
-    0xb8,
-    0xaf,
-    0xeb,
-    0x42,
-    0xc9,
-    0x7e,
-    0xaf,
-    0xa2,
-    0xe8,
-    0xa8,
-    0xdf,
-    0x46,
-    0x9d,
-    0xe0,
-    0x73,
-    0x17,
-    0xc5,
-    0xe1,
-    0x49,
-    0x4c,
-    0x41,
-    0x54,
-    0x74,
-    0x78,
-    0xef,
-    0xf4,
-    0xd8,
-    0xc7,
-    0xd9,
-    0xf0,
-    0xf4,
-    0x84,
-    0xad,
-    0x90,
-    0xfe,
-    0xdf,
-    0x6e,
-    0x1c,
-    0x35,
-    0xee,
-    0x68,
-    0xfa,
-    0x73,
-    0xf1,
-    0x69,
-    0x16,
-    0x01,
-    0xda,
-    0x2e,
-    0x87,
-    0xb0,
-    0x0d,
-    0x1c,
-    0x6f,
-    0x25,
-    0x64,
-    0x31,
-    0x22,
-    0x75,
-    0x76,
-    0x39,
-    0x8b,
-    0xf2,
-    0x19,
-    0x45,
-    0xcc,
-    0x44,
-    0x25,
-    0x59,
-    0x25,
-    0xbb,
-    0x7b,
-    0x65,
-    0x17,
-    0xe3,
-    0x46,
-    0x76,
-    0xc9,
-    0x59,
-    0x81,
-    0x2e,
-    0xaa,
-    0xde,
-    0xba,
-    0x72,
-    0x58,
-    0xaa,
-    0x15,
-    0x62,
-    0xc1,
-    0x02,
-    0x93,
-    0x8e,
-    0x88,
-    0x0d,
-    0x94,
-    0x66,
-    0xaa,
-    0xe4,
-    0x9b,
-    0xf3,
-    0x61,
-    0xe8,
-    0x52,
-    0xc5,
-    0x48,
-    0x58,
-    0xce,
-    0x2d,
-    0xc0,
-    0x23,
-    0x13,
-    0xac,
-    0x93,
-    0xfa,
-    0xdb,
-    0xaa,
-    0xd8,
-    0xaa,
-    0x93,
-    0x6b,
-    0x17,
-    0xa9,
-    0xa7,
-    0x40,
-    0xad,
-    0xee,
-    0xff,
-    0xfa,
-    0x71,
-    0x06,
-    0xca,
-    0xa4,
-    0x97,
-    0x65,
-    0x7a,
-    0x72,
-    0xd5,
-    0xfa,
-    0x0f,
-    0xf4,
-    0xc5,
-    0x06,
-    0x99,
-    0x8f,
-    0x8b,
-    0x2d,
-    0xf8,
-    0x2e,
-    0xb7,
-    0xce,
-    0xe7,
-    0x35,
-    0x6d,
-    0x90,
-    0x39,
-    0xb7,
-    0xc3,
-    0x3d,
-    0x61,
-    0xe8,
-    0x6a,
-    0xd4,
-    0x38,
-    0xd5,
-    0x91,
-    0xd9,
-    0xfb,
-    0x52,
-    0x06,
-    0xf0,
-    0x93,
-    0x34,
-    0x9e,
-    0xaa,
-    0x1a,
-    0xc1,
-    0xd8,
-    0x9f,
-    0x9a,
-    0x65,
-    0xbd,
-    0xbd,
-    0x18,
-    0xa7,
-    0x0a,
-    0xdf,
-    0xd1,
-    0x5a,
-    0x91,
-    0xa1,
-    0xc3,
-    0x18,
-    0xdd,
-    0x73,
-    0x6f,
-    0xec,
-    0x15,
-    0xed,
-    0xde,
-    0x4f,
-    0x22,
-    0x63,
-    0xe2,
-    0x56,
-    0x14,
-    0xb8,
-    0x9e,
-    0x29,
-    0xc2,
-    0x77,
-    0x48,
-    0xb7,
-    0xb1,
-    0x1f,
-    0x2e,
-    0xa8,
-    0x38,
-    0xbf,
-    0xf7,
-    0x93,
-    0xe1,
-    0xc3,
-    0x2c,
-    0x72,
-    0x11,
-    0x0e,
-    0xf7,
-    0x53,
-    0xec,
-    0x49,
-    0x2a,
-    0x50,
-    0x73,
-    0x7a,
-    0x82,
-    0xc0,
-    0xef,
-    0xd8,
-    0x2e,
-    0xaf,
-    0x93,
-    0xde,
-    0x8b,
-    0x8c,
-    0x5d,
-    0x9e,
-    0x32,
-    0x22,
-    0x3d,
-    0x58,
-    0x34,
-    0xca,
-    0x79,
-    0x4b,
-    0xa4,
-    0xde,
-    0x50,
-    0xcb,
-    0x56,
-    0x70,
-    0xde,
-    0x94,
-    0xe7,
-    0x3c,
-    0x3f,
-    0x5e,
-    0xfd,
-    0xdc,
-    0xf7,
-    0xb1,
-    0xd0,
-    0x3b,
-    0x91,
-    0xfb,
-    0xea,
-    0x4c,
-    0x87,
-    0xe0,
-    0x2b,
-    0xfc,
-    0x62,
-    0xd1,
-    0x0f,
-    0x65,
-    0x22,
-    0xe0,
-    0x34,
-    0x44,
-    0xe0,
-    0xd2,
-    0x16,
-    0xad,
-    0xb2,
-    0x76,
-    0x1d,
-    0xfd,
-    0xcf,
-    0x36,
-    0xdb,
-    0x11,
-    0xf4,
-    0xec,
-    0x8e,
-    0xb5,
-    0x06,
-    0xf7,
-    0xed,
-    0x5f,
-    0xf8,
-    0x8d,
-    0x21,
-    0x1e,
-    0xef,
-    0x52,
-    0x11,
-    0xcd,
-    0xa4,
-    0x2a,
-    0xe2,
-    0x8c,
-    0x0a,
-    0x4c,
-    0xbe,
-    0x71,
-    0x32,
-    0x99,
-    0xd5,
-    0x7a,
-    0x6b,
-    0x2b,
-    0xa2,
-    0xc6,
-    0xad,
-    0x30,
-    0x70,
-    0x05,
-    0x38,
-    0xf9,
-    0x1c,
-    0x2e,
-    0x78,
-    0x4e,
-    0x1c,
-    0x70,
-    0x2c,
-    0x05,
-    0xc0,
-    0x6a,
-    0xc7,
-    0xd3,
-    0xb8,
-    0x9e,
-    0x16,
-    0x61,
-    0xd7,
-    0x23,
-    0x24,
-    0xa2,
-    0x17
-  ],
-  const [
-    0x32,
-    0x24,
-    0x5d,
-    0xf5,
-    0x14,
-    0xf6,
-    0xc2,
-    0x73,
-    0xd2,
-    0x52,
-    0x27,
-    0x1a,
-    0x98,
-    0x09,
-    0x29,
-    0xe5,
-    0x0a,
-    0x7c,
-    0xb0,
-    0xe7,
-    0x7b,
-    0x05,
-    0xc7,
-    0xd4,
-    0x60,
-    0x92,
-    0xab,
-    0xc3,
-    0x04,
-    0x93,
-    0x21,
-    0x32,
-    0x7d,
-    0x17,
-    0x0d,
-    0x4b,
-    0xde,
-    0x31,
-    0x41,
-    0x66,
-    0xae,
-    0xa1,
-    0x93,
-    0xce,
-    0x99,
-    0xb0,
-    0x32,
-    0xc8,
-    0x66,
-    0x5c,
-    0x3a,
-    0xd1,
-    0x29,
-    0xb5,
-    0x85,
-    0x28,
-    0xba,
-    0x87,
-    0xc5,
-    0x8c,
-    0x65,
-    0x39,
-    0xcf,
-    0x47,
-    0xe3,
-    0xf5,
-    0x3a,
-    0x6b,
-    0x89,
-    0x0a,
-    0x29,
-    0x5c,
-    0xc0,
-    0x8e,
-    0x65,
-    0x8e,
-    0xb5,
-    0x47,
-    0xaf,
-    0x90,
-    0x52,
-    0xcc,
-    0x54,
-    0x4a,
-    0x6c,
-    0xe7,
-    0x01,
-    0x83,
-    0x3e,
-    0x3e,
-    0xd9,
-    0xa6,
-    0x16,
-    0x32,
-    0xc5,
-    0xc5,
-    0x4e,
-    0x08,
-    0x0b,
-    0xde,
-    0x7e,
-    0x46,
-    0x23,
-    0x5d,
-    0xf0,
-    0x60,
-    0xc6,
-    0xe3,
-    0x54,
-    0x94,
-    0x47,
-    0x46,
-    0xb5,
-    0x13,
-    0x26,
-    0xd9,
-    0xac,
-    0x61,
-    0xe3,
-    0xed,
-    0xd4,
-    0xfe,
-    0x10,
-    0x97,
-    0x7d,
-    0x46,
-    0xaa,
-    0xb4,
-    0xa5,
-    0x96,
-    0xa9,
-    0x2b,
-    0x24,
-    0xb0,
-    0xd6,
-    0x72,
-    0x26,
-    0x61,
-    0xdd,
-    0x54,
-    0xde,
-    0x61,
-    0xa3,
-    0xf1,
-    0x79,
-    0x7a,
-    0xd9,
-    0x06,
-    0x51,
-    0xec,
-    0xd2,
-    0x6e,
-    0x64,
-    0x11,
-    0x91,
-    0xe9,
-    0x04,
-    0x3d,
-    0x27,
-    0x1d,
-    0xd0,
-    0xe8,
-    0x3c,
-    0xda,
-    0xe2,
-    0x0f,
-    0xeb,
-    0xa2,
-    0x4a,
-    0xd7,
-    0xd3,
-    0x69,
-    0xbb,
-    0x74,
-    0x6a,
-    0x99,
-    0x85,
-    0x49,
-    0x95,
-    0x59,
-    0xc3,
-    0x50,
-    0x76,
-    0x0f,
-    0xd6,
-    0xbd,
-    0x85,
-    0x23,
-    0x12,
-    0xde,
-    0xe3,
-    0x07,
-    0xb6,
-    0x46,
-    0xeb,
-    0x74,
-    0x22,
-    0x2a,
-    0x09,
-    0xf6,
-    0x44,
-    0x0b,
-    0xcf,
-    0xaa,
-    0x54,
-    0x95,
-    0x45,
-    0x46,
-    0xc1,
-    0xc8,
-    0x81,
-    0x5b,
-    0x6b,
-    0x55,
-    0x78,
-    0xd7,
-    0x12,
-    0x4b,
-    0x14,
-    0xce,
-    0x0e,
-    0xf2,
-    0x87,
-    0x7a,
-    0x41,
-    0xf7,
-    0xde,
-    0x80,
-    0x4b,
-    0xca,
-    0xd9,
-    0x74,
-    0xfc,
-    0x45,
-    0xfa,
-    0xa0,
-    0x0f,
-    0x8e,
-    0xdc,
-    0x01,
-    0x15,
-    0x3e,
-    0xc6,
-    0x93,
-    0xaf,
-    0xc3,
-    0x80,
-    0xcf,
-    0x00,
-    0x03,
-    0x65,
-    0x71,
-    0x62,
-    0x41,
-    0xba,
-    0x7e,
-    0x58,
-    0x45,
-    0x3e,
-    0x86,
-    0xc5,
-    0xb7,
-    0x02,
-    0x26,
-    0x5b,
-    0xcd,
-    0x7b,
-    0xd2,
-    0x55,
-    0x26,
-    0xd6,
-    0xd1,
-    0x69,
-    0xf5,
-    0x8b,
-    0x89,
-    0xf8,
-    0x61,
-    0x35,
-    0xfd,
-    0x89,
-    0x2c,
-    0xa1,
-    0x94,
-    0x75,
-    0x93,
-    0x25,
-    0x1c,
-    0xe3,
-    0x76,
-    0x33,
-    0x0e,
-    0xf7,
-    0xb9,
-    0x2d,
-    0x14,
-    0x47,
-    0xea,
-    0x7b,
-    0xc8,
-    0x8f,
-    0x24,
-    0xdc,
-    0xbf,
-    0xa5,
-    0x33,
-    0xf9,
-    0xc6,
-    0xaf,
-    0xf8,
-    0x40,
-    0x6b,
-    0x93,
-    0x0f,
-    0xef,
-    0xc0,
-    0xaf,
-    0xb0,
-    0x6f,
-    0x5b,
-    0xcb,
-    0xd3,
-    0xe4,
-    0xa1,
-    0x4b,
-    0x98,
-    0x02,
-    0x45,
-    0xa9,
-    0xe5,
-    0x22,
-    0x0b,
-    0x23,
-    0x51,
-    0x95,
-    0xd2,
-    0xb1,
-    0x41,
-    0x38,
-    0xd1,
-    0x3a,
-    0x50,
-    0x48,
-    0x21,
-    0x07,
-    0xf5,
-    0x78,
-    0x7b,
-    0x78,
-    0x60,
-    0x41,
-    0x44,
-    0xf6,
-    0xa4,
-    0x7a,
-    0xc6,
-    0x28,
-    0x1b,
-    0x28,
-    0xc1,
-    0x6a,
-    0x06,
-    0x97,
-    0x22,
-    0x7b,
-    0x75,
-    0xaa,
-    0x12,
-    0x75,
-    0x67,
-    0x6f,
-    0x32,
-    0x03,
-    0x31,
-    0xf6,
-    0x25,
-    0xce,
-    0x24,
-    0x64,
-    0x50,
-    0x38,
-    0x6a,
-    0x43,
-    0xdd,
-    0x4d,
-    0x31,
-    0x1c,
-    0x06,
-    0xf6,
-    0x0c,
-    0x48,
-    0x90,
-    0x70,
-    0x95,
-    0x03,
-    0x95,
-    0xfd,
-    0x58,
-    0xc2,
-    0x87,
-    0xda,
-    0xec,
-    0xc7,
-    0x72,
-    0x70,
-    0x63,
-    0xf2,
-    0x81,
-    0xce,
-    0xe5,
-    0xda,
-    0xc4,
-    0x57,
-    0x97,
-    0x1c,
-    0x30,
-    0xb8,
-    0xc1,
-    0xf3,
-    0xe8,
-    0x1e,
-    0x31,
-    0x09,
-    0xbb,
-    0xa5,
-    0xda,
-    0x8d,
-    0xed,
-    0x13,
-    0xc1,
-    0x86,
-    0x3a,
-    0xc6,
-    0x1a,
-    0x67,
-    0x18,
-    0xeb,
-    0xad,
-    0xe3,
-    0x3d,
-    0xf1,
-    0x7f,
-    0x02,
-    0x61,
-    0x3d,
-    0xaf,
-    0x75,
-    0x45,
-    0x20,
-    0x9e,
-    0x27,
-    0xf4,
-    0x06,
-    0x52,
-    0x14,
-    0x48,
-    0xf0,
-    0x1d,
-    0x5e,
-    0xb1,
-    0x24,
-    0x79,
-    0x9d,
-    0x32,
-    0x22,
-    0x37,
-    0x77,
-    0xac,
-    0xdb,
-    0xd9,
-    0x72,
-    0x5f,
-    0x1e,
-    0x3c,
-    0x05,
-    0xae,
-    0x53,
-    0x7a,
-    0xf5,
-    0x22,
-    0x6b,
-    0x0e,
-    0xdf,
-    0xb2,
-    0x17,
-    0x39,
-    0x10,
-    0x42,
-    0x38,
-    0xa5,
-    0x9d,
-    0x69,
-    0x97,
-    0x49,
-    0xb1,
-    0x77,
-    0xd7,
-    0x8c,
-    0x21,
-    0xb7,
-    0xa8,
-    0xad,
-    0x46,
-    0xf1,
-    0x3d,
-    0x62,
-    0x0b,
-    0x33,
-    0xff,
-    0xbf,
-    0x45,
-    0xd1,
-    0x83,
-    0x5a,
-    0x43,
-    0xab,
-    0xb9,
-    0xad,
-    0xa6,
-    0xae,
-    0x67,
-    0xbb,
-    0x73,
-    0x9e,
-    0xd6,
-    0xf7,
-    0x67,
-    0x12,
-    0xcc,
-    0x61,
-    0x8b,
-    0xc0,
-    0xb9,
-    0xf2,
-    0x08,
-    0xfa,
-    0x35,
-    0x3a,
-    0x3b,
-    0x79,
-    0xaa,
-    0x48,
-    0x0c,
-    0x5a,
-    0x4e,
-    0xca,
-    0x7c,
-    0x66,
-    0x55,
-    0x75,
-    0x7e,
-    0x96,
-    0x64,
-    0xa7,
-    0x08,
-    0xd6,
-    0x48,
-    0x4b,
-    0x69,
-    0x0a,
-    0xe8,
-    0xfe,
-    0xdd,
-    0x4f,
-    0x78,
-    0x6f,
-    0x5f,
-    0x83,
-    0xf0,
-    0x0c,
-    0xbe,
-    0x07,
-    0xbd,
-    0xdb,
-    0xf3,
-    0xc3,
-    0xb6,
-    0xa5,
-    0xb2,
-    0x6b,
-    0x51,
-    0x5a,
-    0x3f,
-    0x01,
-    0x17,
-    0xb1,
-    0x83,
-    0x9c,
-    0x55,
-    0x0f,
-    0x5f,
-    0x67,
-    0x15,
-    0xaa,
-    0x40,
-    0xec,
-    0x4c,
-    0xee,
-    0xf4,
-    0x93,
-    0x55,
-    0x20,
-    0xbc,
-    0x65,
-    0x9e,
-    0x41,
-    0xa2,
-    0x16,
-    0xa2,
-    0x35,
-    0x0c,
-    0x43,
-    0x17,
-    0x24,
-    0x92,
-    0xf8,
-    0x68,
-    0x21,
-    0x0d,
-    0x75,
-    0x65,
-    0x09,
-    0xf0,
-    0x32,
-    0x3a,
-    0xae,
-    0xdc,
-    0x20,
-    0x9d,
-    0x35,
-    0x6e,
-    0x32,
-    0x4c,
-    0xbd,
-    0x5c,
-    0x1c,
-    0xb7,
-    0x42,
-    0xc0,
-    0x5b,
-    0xf9,
-    0xc0,
-    0xb3,
-    0x75,
-    0x0d,
-    0x9b,
-    0x1e,
-    0x82,
-    0x3f,
-    0x3e,
-    0xcd,
-    0xeb,
-    0xe0,
-    0x02,
-    0xc5,
-    0x72,
-    0x3e,
-    0x52,
-    0xd8,
-    0x72,
-    0xd4,
-    0x0e,
-    0x76,
-    0x68,
-    0xbd,
-    0x2c,
-    0xc6,
-    0xb3,
-    0x6f,
-    0xa5,
-    0xf5,
-    0x98,
-    0xa5,
-    0x8f,
-    0xcf,
-    0x89,
-    0x9d,
-    0x86,
-    0x8c,
-    0xa7,
-    0x84,
-    0x51,
-    0xec,
-    0x85,
-    0x2f,
-    0xc3,
-    0x86,
-    0x2f,
-    0x0b,
-    0xde,
-    0x5c,
-    0x6b,
-    0x57,
-    0x3f,
-    0xb4,
-    0x3e,
-    0x90,
-    0xb6,
-    0x23,
-    0xb2,
-    0x2d,
-    0x34,
-    0xeb,
-    0xd7,
-    0x8d,
-    0xea,
-    0x87,
-    0x08,
-    0x2e,
-    0xaf,
-    0x83,
-    0x6f,
-    0x1f,
-    0xa2,
-    0x91,
-    0xcc,
-    0xb8,
-    0x11,
-    0xda,
-    0x71,
-    0x88,
-    0x9a,
-    0x92,
-    0x91,
-    0x8f,
-    0x90,
-    0xcf,
-    0xbb,
-    0xad,
-    0xa1,
-    0x9b,
-    0xa2,
-    0x5b,
-    0xb5,
-    0x47,
-    0x1f,
-    0x99,
-    0x18,
-    0x03,
-    0x79,
-    0x27,
-    0xdc,
-    0xac,
-    0xe3,
-    0xf8,
-    0x79,
-    0xe5,
-    0x46,
-    0xe4,
-    0xb7,
-    0x69,
-    0x41,
-    0x9d,
-    0xce,
-    0xa0,
-    0x6f,
-    0xe4,
-    0xcb,
-    0x70,
-    0xe8,
-    0xfd,
-    0x35,
-    0x55,
-    0x0a,
-    0x60,
-    0xf1,
-    0xb4,
-    0x79,
-    0xb1,
-    0x63,
-    0x6c,
-    0x64,
-    0xf2,
-    0xd6,
-    0xaf,
-    0x0a,
-    0xf8,
-    0x1e,
-    0x10,
-    0x7d,
-    0x1b,
-    0x7b,
-    0xdc,
-    0xa6,
-    0x32,
-    0xc1,
-    0xae,
-    0x8a,
-    0xbf,
-    0xb6,
-    0x3e,
-    0xcb,
-    0x66,
-    0xbc,
-    0x7a,
-    0x72,
-    0xa4,
-    0xb0,
-    0xd8,
-    0xeb,
-    0xbd,
-    0x11,
-    0xea,
-    0x51,
-    0xf6,
-    0x65,
-    0x33,
-    0xed,
-    0x05,
-    0xd8,
-    0x39,
-    0xf9,
-    0xc6,
-    0x27,
-    0xdb,
-    0xa9,
-    0x2f,
-    0xbc,
-    0xe5,
-    0x6c,
-    0x86,
-    0x1b,
-    0xe2,
-    0x6f,
-    0xd1,
-    0x7c,
-    0x31,
-    0x62,
-    0x8f,
-    0xb9,
-    0x5b,
-    0x80,
-    0xa5,
-    0x6b,
-    0xa4,
-    0xc9,
-    0x9b,
-    0x50,
-    0xe0,
-    0x92,
-    0x08,
-    0xf1,
-    0x88,
-    0x40,
-    0x4b,
-    0x81,
-    0x0d,
-    0x51,
-    0x7c,
-    0x07,
-    0x6c,
-    0x9c,
-    0xa3,
-    0xc0,
-    0x03,
-    0xd9,
-    0x27,
-    0xbe,
-    0xa3,
-    0x63,
-    0x89,
-    0xd6,
-    0xe6,
-    0x3d,
-    0x51,
-    0xb9,
-    0xc3,
-    0x53,
-    0x49,
-    0x61,
-    0x5f,
-    0x03,
-    0xea,
-    0xaf,
-    0x26,
-    0xdc,
-    0x14,
-    0x52,
-    0x1b,
-    0xa6,
-    0x02,
-    0xea,
-    0x6c,
-    0xa2,
-    0x7c,
-    0x6d,
-    0x4a,
-    0x13,
-    0x4e,
-    0xca,
-    0xf7,
-    0xfc,
-    0xfa,
-    0xcd,
-    0x21,
-    0x2c,
-    0xaa,
-    0x43,
-    0x6e,
-    0x78,
-    0x68,
-    0x5e,
-    0x58,
-    0x48,
-    0x91,
-    0x5b,
-    0x3b,
-    0x55,
-    0x87,
-    0x61,
-    0xac,
-    0xb0,
-    0xa7,
-    0xad,
-    0x0d,
-    0x07,
-    0x7b,
-    0xec,
-    0x5e,
-    0x24,
-    0x30,
-    0xe8,
-    0x56,
-    0xb6,
-    0x4a,
-    0x67,
-    0xb3,
-    0x54,
-    0x96,
-    0x50,
-    0xce,
-    0xbf,
-    0x60,
-    0x10,
-    0x72,
-    0x67,
-    0xe7,
-    0x3c,
-    0xee,
-    0x31,
-    0x0e,
-    0x78,
-    0x69,
-    0x78,
-    0x54,
-    0x97,
-    0x76,
-    0x52,
-    0x06,
-    0x04,
-    0xe9,
-    0x14,
-    0xb4,
-    0x60,
-    0xe8,
-    0x18,
-    0xe1,
-    0x6c,
-    0x45,
-    0xbd,
-    0xfe,
-    0x2a,
-    0x0b,
-    0xb0,
-    0x9a,
-    0x3f,
-    0x56,
-    0x6a,
-    0xd3,
-    0x9c,
-    0x68,
-    0xfa,
-    0x10,
-    0x5d,
-    0xfa,
-    0x05,
-    0xf2,
-    0xf1,
-    0xd0,
-    0x0b,
-    0x87,
-    0x7c,
-    0x90,
-    0xeb,
-    0xc1,
-    0x79,
-    0xd4,
-    0xaa,
-    0x27,
-    0xa4,
-    0x7e,
-    0x70,
-    0xcb,
-    0x17,
-    0x4c,
-    0xd3,
-    0x7c,
-    0xb3,
-    0xac,
-    0x58,
-    0x3c,
-    0xc1,
-    0xd1,
-    0x37,
-    0xf5,
-    0xd9,
-    0x06,
-    0x5f,
-    0x67,
-    0x03,
-    0x42,
-    0xba,
-    0x65,
-    0x1d,
-    0xfd,
-    0xb2,
-    0x41,
-    0x7d,
-    0x43,
-    0xf4,
-    0x85,
-    0xd7,
-    0x07,
-    0x74,
-    0xe3,
-    0x60,
-    0xb9,
-    0xb1,
-    0x6f,
-    0x33,
-    0x1b,
-    0x3a,
-    0x0c,
-    0xf4,
-    0x50,
-    0x71,
-    0x24,
-    0xb4,
-    0x35,
-    0x8f,
-    0x9d,
-    0x15,
-    0xf5,
-    0xe8,
-    0x08,
-    0xaf,
-    0xd8,
-    0x71,
-    0x1b,
-    0xb2,
-    0x5c,
-    0x7f,
-    0x61,
-    0xcc,
-    0x87,
-    0xd1,
-    0x30,
-    0x4d,
-    0x7b,
-    0xd1,
-    0xdc,
-    0x89,
-    0x4b,
-    0x17,
-    0x2a,
-    0x7d,
-    0x0d,
-    0x2f,
-    0x07,
-    0xb6,
-    0x31,
-    0x9c,
-    0x7a,
-    0x6f,
-    0x11,
-    0x1c,
-    0xd8,
-    0xfa,
-    0xc8,
-    0x2e,
-    0x37,
-    0x61,
-    0x48,
-    0xd2,
-    0x24,
-    0x4c,
-    0xa7,
-    0x90,
-    0x99,
-    0x25,
-    0xba,
-    0xbb,
-    0x29,
-    0x7b,
-    0xe5,
-    0xf7,
-    0x7e,
-    0xa4,
-    0x31,
-    0xf9,
-    0x05,
-    0xa7,
-    0x9f,
-    0x8e,
-    0xe8,
-    0x59,
-    0xbd,
-    0xdf,
-    0x3d,
-    0xc5,
-    0x76,
-    0xf3,
-    0x7d,
-    0xd1,
-    0x2e,
-    0x75,
-    0x37,
-    0x1f,
-    0x0f,
-    0xb8,
-    0x05,
-    0x32,
-    0x9d,
-    0xf8,
-    0xc0,
-    0xd2,
-    0x91,
-    0xe3,
-    0xf0,
-    0xb1,
-    0xe4,
-    0x57,
-    0x86,
-    0x4e,
-    0x2a,
-    0x6e,
-    0xce,
-    0x1a,
-    0x21,
-    0xb8,
-    0x9f,
-    0xda,
-    0x8a,
-    0xc7,
-    0xd5,
-    0x4c,
-    0x37,
-    0xf1,
-    0x00,
-    0x0d,
-    0x66,
-    0x51,
-    0x5e,
-    0xba,
-    0x4d,
-    0x0f,
-    0x07,
-    0x55,
-    0xf6,
-    0xe1,
-    0x68,
-    0xeb,
-    0x4d,
-    0xd2,
-    0xf2,
-    0x74,
-    0x78,
-    0x43,
-    0x13,
-    0xfb,
-    0x66,
-    0x2f,
-    0x66,
-    0xff,
-    0xab,
-    0xb3,
-    0x27,
-    0x18,
-    0x8b,
-    0xcd,
-    0xe9,
-    0xde,
-    0x54,
-    0x64,
-    0x8b,
-    0x06,
-    0xf2,
-    0x88,
-    0x68,
-    0xce,
-    0xbd,
-    0xfc,
-    0xce,
-    0x9c,
-    0x95,
-    0xf1,
-    0xb2,
-    0xe1,
-    0x31,
-    0x15,
-    0xa1,
-    0x44,
-    0xb4,
-    0xcc,
-    0xfa,
-    0xfd,
-    0x81,
-    0xbd,
-    0x5b,
-    0x7e,
-    0x51,
-    0x91,
-    0x59,
-    0x59,
-    0x83,
-    0xf7,
-    0x74,
-    0x5e,
-    0xb3,
-    0xec,
-    0x49,
-    0x03,
-    0x8d,
-    0x39,
-    0x0a,
-    0x0a,
-    0xe3,
-    0x3d,
-    0x2c,
-    0x5d,
-    0xfe,
-    0xec,
-    0x5f,
-    0x3d,
-    0x32,
-    0x18,
-    0xc3,
-    0x9b,
-    0xb5,
-    0xf0,
-    0x59,
-    0xc6,
-    0xb2,
-    0xc6,
-    0xb8,
-    0x47,
-    0x98,
-    0x15,
-    0x01,
-    0x09,
-    0xb8,
-    0xc2
-  ],
-  const [
-    0x9f,
-    0x07,
-    0xe6,
-    0xb7,
-    0xea,
-    0x8b,
-    0x6d,
-    0x2b,
-    0xb3,
-    0x01,
-    0xd6,
-    0xce,
-    0x70,
-    0x19,
-    0xe0,
-    0xf2,
-    0x7a,
-    0xd5,
-    0x5a,
-    0xbb,
-    0xb7,
-    0x99,
-    0xe6,
-    0xd4,
-    0x76,
-    0x81,
-    0xfe,
-    0x60,
-    0x9a,
-    0xf6,
-    0x34,
-    0x34,
-    0xfb,
-    0x84,
-    0xbe,
-    0x43,
-    0x09,
-    0xe6,
-    0x31,
-    0x59,
-    0xb3,
-    0x63,
-    0x8d,
-    0x0d,
-    0x87,
-    0x5e,
-    0x7a,
-    0xf1,
-    0x1a,
-    0x28,
-    0xd1,
-    0x0b,
-    0xaa,
-    0x18,
-    0x5e,
-    0x89,
-    0x02,
-    0xde,
-    0xe5,
-    0xb0,
-    0x9e,
-    0x14,
-    0x62,
-    0x16,
-    0x10,
-    0x16,
-    0x95,
-    0x11,
-    0xa2,
-    0x14,
-    0xbe,
-    0x6f,
-    0x3d,
-    0x65,
-    0xa6,
-    0x67,
-    0x89,
-    0x1e,
-    0xde,
-    0xd0,
-    0x56,
-    0xe4,
-    0x4b,
-    0x91,
-    0x3b,
-    0xfe,
-    0xe3,
-    0x59,
-    0x7c,
-    0xae,
-    0xb1,
-    0x90,
-    0x31,
-    0xc2,
-    0x1f,
-    0x8d,
-    0xa5,
-    0x66,
-    0x74,
-    0x09,
-    0xfd,
-    0x3c,
-    0x9c,
-    0xd3,
-    0x1a,
-    0xaf,
-    0x28,
-    0xc6,
-    0xc0,
-    0x84,
-    0x95,
-    0xf9,
-    0xf7,
-    0xb1,
-    0xd1,
-    0x35,
-    0xb1,
-    0x73,
-    0xfb,
-    0xac,
-    0xae,
-    0x9b,
-    0x6a,
-    0xe7,
-    0x9d,
-    0x28,
-    0xf2,
-    0x01,
-    0x84,
-    0x1b,
-    0x62,
-    0x13,
-    0x61,
-    0x87,
-    0x51,
-    0xef,
-    0x12,
-    0xe8,
-    0x1b,
-    0x11,
-    0x72,
-    0xb5,
-    0x26,
-    0xd2,
-    0xc5,
-    0x39,
-    0x6a,
-    0xdf,
-    0x56,
-    0x9e,
-    0x30,
-    0xea,
-    0x5e,
-    0x4b,
-    0x19,
-    0x9f,
-    0x28,
-    0x70,
-    0x63,
-    0xda,
-    0x73,
-    0xde,
-    0x68,
-    0x17,
-    0x18,
-    0x1d,
-    0x67,
-    0x2a,
-    0xec,
-    0xb8,
-    0x87,
-    0x30,
-    0xe8,
-    0xdc,
-    0x19,
-    0xc5,
-    0x87,
-    0x21,
-    0x1e,
-    0x77,
-    0x70,
-    0xa8,
-    0x09,
-    0x7b,
-    0x55,
-    0x66,
-    0xc6,
-    0x9f,
-    0x1b,
-    0xbf,
-    0xfa,
-    0x80,
-    0x3b,
-    0x57,
-    0x8d,
-    0xfd,
-    0x68,
-    0x25,
-    0x66,
-    0xeb,
-    0x72,
-    0xc9,
-    0x75,
-    0x0a,
-    0x6a,
-    0x1f,
-    0xf7,
-    0x38,
-    0x07,
-    0x14,
-    0xf5,
-    0xe5,
-    0x48,
-    0xb8,
-    0x0e,
-    0xc7,
-    0x5b,
-    0x95,
-    0x77,
-    0xcf,
-    0xbe,
-    0x40,
-    0x40,
-    0x5b,
-    0xa4,
-    0x2d,
-    0xd9,
-    0xad,
-    0x9a,
-    0xc7,
-    0xd4,
-    0x9c,
-    0x6a,
-    0xc0,
-    0xec,
-    0x89,
-    0x3f,
-    0xa6,
-    0x47,
-    0x95,
-    0x0b,
-    0xb8,
-    0xf8,
-    0x11,
-    0x26,
-    0xf7,
-    0xc8,
-    0x37,
-    0x38,
-    0x80,
-    0x36,
-    0x17,
-    0x58,
-    0x18,
-    0xbc,
-    0xd3,
-    0x75,
-    0x09,
-    0x54,
-    0x0f,
-    0xf5,
-    0x2d,
-    0x3b,
-    0xa4,
-    0x9d,
-    0x48,
-    0xf5,
-    0x94,
-    0xb1,
-    0x9a,
-    0x91,
-    0x43,
-    0x5c,
-    0xb5,
-    0x2e,
-    0xe4,
-    0x51,
-    0x8d,
-    0xbe,
-    0x31,
-    0xb3,
-    0xce,
-    0x0a,
-    0x5f,
-    0x33,
-    0x72,
-    0xf7,
-    0x51,
-    0x78,
-    0x92,
-    0x07,
-    0x0c,
-    0xc3,
-    0x7c,
-    0x22,
-    0x6b,
-    0xd3,
-    0x07,
-    0x97,
-    0x13,
-    0x06,
-    0x23,
-    0x5e,
-    0xaa,
-    0xc2,
-    0xb4,
-    0xa0,
-    0x44,
-    0x13,
-    0xa1,
-    0x78,
-    0x1e,
-    0x95,
-    0x27,
-    0xfc,
-    0x8f,
-    0x95,
-    0x74,
-    0x77,
-    0x3b,
-    0x73,
-    0x71,
-    0xf9,
-    0x8a,
-    0x4a,
-    0xdf,
-    0x12,
-    0x59,
-    0xd3,
-    0xa5,
-    0xda,
-    0xef,
-    0x87,
-    0x68,
-    0x34,
-    0x32,
-    0x04,
-    0x5d,
-    0x54,
-    0x1a,
-    0xb2,
-    0x5b,
-    0x7f,
-    0x67,
-    0xa6,
-    0x35,
-    0x12,
-    0x8f,
-    0xc7,
-    0x46,
-    0xc6,
-    0xfb,
-    0x2f,
-    0x4d,
-    0x32,
-    0x72,
-    0xd4,
-    0x7c,
-    0x92,
-    0xd6,
-    0x67,
-    0xcb,
-    0xc6,
-    0x0e,
-    0x7c,
-    0x92,
-    0x9e,
-    0x43,
-    0xec,
-    0x57,
-    0x54,
-    0x4f,
-    0x77,
-    0xe4,
-    0x5a,
-    0x72,
-    0xae,
-    0x9d,
-    0x56,
-    0x47,
-    0x11,
-    0x11,
-    0x6c,
-    0xf7,
-    0x74,
-    0xcf,
-    0xbb,
-    0xad,
-    0xa7,
-    0x7b,
-    0x2a,
-    0x4a,
-    0x55,
-    0x21,
-    0x64,
-    0x59,
-    0x2d,
-    0xc8,
-    0x21,
-    0x45,
-    0x40,
-    0x4b,
-    0xa8,
-    0xc9,
-    0xaa,
-    0x64,
-    0x91,
-    0xa9,
-    0x75,
-    0x0a,
-    0xd0,
-    0xa0,
-    0xba,
-    0xfd,
-    0xef,
-    0x99,
-    0x09,
-    0x9f,
-    0x9b,
-    0x22,
-    0x0b,
-    0x05,
-    0x62,
-    0x1d,
-    0x66,
-    0x4e,
-    0xbb,
-    0xb8,
-    0xe1,
-    0x33,
-    0x47,
-    0xa0,
-    0xc9,
-    0xe0,
-    0x56,
-    0x72,
-    0x93,
-    0x02,
-    0xad,
-    0x73,
-    0xc2,
-    0x22,
-    0x87,
-    0x80,
-    0x0c,
-    0x31,
-    0xd9,
-    0x48,
-    0xb8,
-    0x64,
-    0xda,
-    0xb8,
-    0x4a,
-    0x42,
-    0xc3,
-    0xb7,
-    0x62,
-    0xfb,
-    0xd3,
-    0x14,
-    0xe2,
-    0xfb,
-    0x97,
-    0xbc,
-    0x4f,
-    0xbf,
-    0x68,
-    0x31,
-    0x7a,
-    0xe7,
-    0x35,
-    0x37,
-    0x5f,
-    0x8d,
-    0x83,
-    0xd1,
-    0x4d,
-    0xd6,
-    0xb1,
-    0x6b,
-    0x47,
-    0xc6,
-    0x81,
-    0x59,
-    0xab,
-    0x59,
-    0xd4,
-    0x80,
-    0x11,
-    0xcf,
-    0xb5,
-    0x53,
-    0x76,
-    0x47,
-    0x99,
-    0x02,
-    0x9a,
-    0x8f,
-    0xe5,
-    0xed,
-    0xa6,
-    0x3b,
-    0xb1,
-    0x5f,
-    0x12,
-    0xf4,
-    0xcc,
-    0x79,
-    0xc6,
-    0x13,
-    0x00,
-    0x6c,
-    0x7f,
-    0x6f,
-    0x97,
-    0xec,
-    0x75,
-    0x72,
-    0x1d,
-    0xe1,
-    0x3b,
-    0x73,
-    0x68,
-    0x5f,
-    0xe6,
-    0x3f,
-    0xd6,
-    0xd8,
-    0x71,
-    0xf9,
-    0xd6,
-    0x90,
-    0x60,
-    0x25,
-    0xaa,
-    0x52,
-    0xa4,
-    0xff,
-    0x6b,
-    0x62,
-    0xbf,
-    0x11,
-    0x4d,
-    0xb2,
-    0x28,
-    0x04,
-    0x24,
-    0x58,
-    0xf1,
-    0xb7,
-    0x27,
-    0x40,
-    0xa7,
-    0x8e,
-    0xf4,
-    0x1e,
-    0x7a,
-    0x0d,
-    0xd5,
-    0xa7,
-    0x9d,
-    0xa5,
-    0x42,
-    0x01,
-    0xf0,
-    0xcd,
-    0xa7,
-    0x78,
-    0xdd,
-    0x55,
-    0x67,
-    0x72,
-    0x7f,
-    0xf7,
-    0x20,
-    0xa5,
-    0x0a,
-    0x30,
-    0x31,
-    0x87,
-    0x67,
-    0x4e,
-    0x79,
-    0x06,
-    0x1e,
-    0xc9,
-    0x62,
-    0x7a,
-    0x79,
-    0xd6,
-    0x1e,
-    0xd8,
-    0xe7,
-    0x3a,
-    0x31,
-    0x28,
-    0x9e,
-    0x5c,
-    0x30,
-    0x39,
-    0x84,
-    0x9f,
-    0xc8,
-    0x93,
-    0x50,
-    0xee,
-    0x01,
-    0xad,
-    0xec,
-    0x99,
-    0xc4,
-    0x60,
-    0x1e,
-    0x5f,
-    0x9c,
-    0x9c,
-    0x68,
-    0xcc,
-    0xb9,
-    0x5a,
-    0x2d,
-    0xc5,
-    0x3a,
-    0xd1,
-    0x14,
-    0x61,
-    0xac,
-    0xed,
-    0xb2,
-    0xfa,
-    0xcd,
-    0xfd,
-    0x63,
-    0x84,
-    0x96,
-    0xac,
-    0x78,
-    0x1e,
-    0x79,
-    0x32,
-    0x98,
-    0xe7,
-    0xe8,
-    0xcb,
-    0x60,
-    0x13,
-    0x16,
-    0x68,
-    0x4d,
-    0x3e,
-    0x01,
-    0xa5,
-    0xdc,
-    0xff,
-    0xb0,
-    0xfc,
-    0xef,
-    0xc1,
-    0xb9,
-    0x38,
-    0x73,
-    0xce,
-    0x07,
-    0x2c,
-    0x40,
-    0xad,
-    0xda,
-    0xa4,
-    0x40,
-    0xae,
-    0x0f,
-    0x9c,
-    0xd4,
-    0xc3,
-    0xa2,
-    0xb0,
-    0x73,
-    0x91,
-    0x71,
-    0xd4,
-    0x95,
-    0xc7,
-    0x43,
-    0x45,
-    0xcf,
-    0xaf,
-    0x08,
-    0xc0,
-    0x3f,
-    0x03,
-    0x63,
-    0xf1,
-    0x2a,
-    0x01,
-    0x65,
-    0x2e,
-    0xe4,
-    0xc1,
-    0x9c,
-    0x65,
-    0xf0,
-    0xc7,
-    0x4c,
-    0x53,
-    0x69,
-    0xd5,
-    0xfc,
-    0xf7,
-    0xa0,
-    0x02,
-    0x34,
-    0x47,
-    0x07,
-    0x10,
-    0x86,
-    0x21,
-    0x4e,
-    0xfb,
-    0xcb,
-    0x84,
-    0xcb,
-    0xce,
-    0xaf,
-    0x00,
-    0x1f,
-    0xba,
-    0x70,
-    0x6b,
-    0x17,
-    0x69,
-    0xe2,
-    0xd6,
-    0xd0,
-    0x90,
-    0xb7,
-    0xbf,
-    0x1f,
-    0xc4,
-    0xfd,
-    0x89,
-    0x2f,
-    0x8e,
-    0xe8,
-    0x29,
-    0x6c,
-    0xc1,
-    0xd2,
-    0x21,
-    0xa0,
-    0x0b,
-    0x80,
-    0xb2,
-    0x5c,
-    0xcb,
-    0xa7,
-    0x4d,
-    0x9a,
-    0x22,
-    0xae,
-    0x4c,
-    0xa0,
-    0x4d,
-    0xb6,
-    0xdf,
-    0x28,
-    0x32,
-    0xd8,
-    0x49,
-    0xbd,
-    0x38,
-    0xad,
-    0x4c,
-    0x68,
-    0x5c,
-    0x14,
-    0xe1,
-    0x8c,
-    0x82,
-    0x2f,
-    0x2d,
-    0x0f,
-    0x08,
-    0xaf,
-    0xb1,
-    0xba,
-    0xa1,
-    0x52,
-    0xc1,
-    0xe3,
-    0x61,
-    0xa9,
-    0x37,
-    0x49,
-    0x14,
-    0x1f,
-    0x68,
-    0x3f,
-    0xd4,
-    0x37,
-    0x57,
-    0x0d,
-    0xdb,
-    0x15,
-    0x29,
-    0x93,
-    0x95,
-    0x40,
-    0xd9,
-    0x2f,
-    0xf9,
-    0xa6,
-    0x2d,
-    0xe1,
-    0x1a,
-    0xe1,
-    0xe9,
-    0xad,
-    0xf9,
-    0xb8,
-    0x42,
-    0x41,
-    0x9e,
-    0xe9,
-    0x95,
-    0xd8,
-    0x67,
-    0x26,
-    0x59,
-    0x5e,
-    0x9f,
-    0x5d,
-    0x53,
-    0xd5,
-    0x52,
-    0x3c,
-    0x08,
-    0xf7,
-    0x60,
-    0xf5,
-    0x78,
-    0x1d,
-    0xd1,
-    0x3e,
-    0x09,
-    0x5f,
-    0x68,
-    0x9c,
-    0xc2,
-    0xfd,
-    0x7b,
-    0xe2,
-    0xb9,
-    0xfe,
-    0x02,
-    0xf4,
-    0xcf,
-    0x16,
-    0xed,
-    0xd1,
-    0x9a,
-    0xcd,
-    0xbb,
-    0xd1,
-    0xa3,
-    0xde,
-    0x48,
-    0x2b,
-    0xd2,
-    0xdd,
-    0xe6,
-    0xb9,
-    0x26,
-    0x1d,
-    0xb0,
-    0x00,
-    0xa9,
-    0xd1,
-    0x1b,
-    0x6b,
-    0xa4,
-    0x71,
-    0xce,
-    0xd7,
-    0x0f,
-    0x60,
-    0xb4,
-    0x54,
-    0x4b,
-    0xcb,
-    0x4f,
-    0x2a,
-    0x14,
-    0xd4,
-    0x4f,
-    0x1b,
-    0xb1,
-    0xf0,
-    0x63,
-    0xe8,
-    0x6d,
-    0x8d,
-    0x4f,
-    0x17,
-    0x4b,
-    0xf9,
-    0x3f,
-    0xf2,
-    0xf6,
-    0x7f,
-    0x5a,
-    0xd3,
-    0xf7,
-    0xd3,
-    0x9b,
-    0x9f,
-    0x2a,
-    0xb0,
-    0xdc,
-    0x91,
-    0x73,
-    0xbf,
-    0x34,
-    0x39,
-    0xad,
-    0xbb,
-    0x83,
-    0xc4,
-    0xe3,
-    0xd3,
-    0x4b,
-    0x7d,
-    0xc3,
-    0x4f,
-    0xc2,
-    0x94,
-    0x4f,
-    0x77,
-    0x25,
-    0x1e,
-    0xd6,
-    0xb0,
-    0x4e,
-    0x5e,
-    0x23,
-    0xe9,
-    0x89,
-    0x43,
-    0xf4,
-    0x35,
-    0xa4,
-    0x31,
-    0xae,
-    0xb9,
-    0x45,
-    0x05,
-    0x4e,
-    0xc9,
-    0x80,
-    0x53,
-    0xa3,
-    0x4e,
-    0xa9,
-    0xf1,
-    0xbb,
-    0x6b,
-    0x67,
-    0xba,
-    0x9b,
-    0x60,
-    0x0a,
-    0x8c,
-    0x32,
-    0xae,
-    0x1f,
-    0x93,
-    0x90,
-    0x7c,
-    0x41,
-    0xca,
-    0x54,
-    0x39,
-    0x32,
-    0xbe,
-    0x63,
-    0x83,
-    0x2a,
-    0x96,
-    0xe0,
-    0x47,
-    0x6e,
-    0x50,
-    0x58,
-    0x2a,
-    0x25,
-    0x4d,
-    0x3c,
-    0x28,
-    0x67,
-    0x10,
-    0x95,
-    0x7b,
-    0x98,
-    0x43,
-    0xf3,
-    0xbf,
-    0xf4,
-    0xfa,
-    0xa6,
-    0x53,
-    0x6a,
-    0x3c,
-    0x31,
-    0x02,
-    0xae,
-    0xc0,
-    0xfc,
-    0xe3,
-    0x8a,
-    0xf4,
-    0x49,
-    0x7d,
-    0x75,
-    0x43,
-    0x69,
-    0x2f,
-    0x66,
-    0x98,
-    0x30,
-    0xd0,
-    0xea,
-    0x1e,
-    0xa6,
-    0x92,
-    0x75,
-    0x4b,
-    0xff,
-    0x2c,
-    0xf5,
-    0x1c,
-    0xce,
-    0x38,
-    0xad,
-    0xa2,
-    0x75,
-    0xd9,
-    0x41,
-    0xbd,
-    0xe0,
-    0xa2,
-    0x0d,
-    0x28,
-    0x73,
-    0xb3,
-    0xbb,
-    0xb5,
-    0x40,
-    0x25,
-    0x15,
-    0xda,
-    0x7e,
-    0xa9,
-    0x17,
-    0x6d,
-    0x36,
-    0x6b,
-    0x49,
-    0xac,
-    0x40,
-    0x3d,
-    0x4c,
-    0x80,
-    0x6e,
-    0xf1,
-    0xb2,
-    0x03,
-    0x07,
-    0x06,
-    0x13,
-    0x3f,
-    0x77,
-    0x88,
-    0x5c,
-    0x39,
-    0x44,
-    0x31,
-    0x6b,
-    0x2e,
-    0x44,
-    0xd4,
-    0xd9,
-    0x1c,
-    0x0e,
-    0xfc,
-    0x17,
-    0x84,
-    0xae,
-    0xd0,
-    0xbd,
-    0x6e,
-    0x9d,
-    0x39,
-    0x1e,
-    0xaf,
-    0xf0,
-    0x47,
-    0x20,
-    0x67,
-    0xcf,
-    0xd1,
-    0x4b,
-    0xcd,
-    0x29,
-    0x5c,
-    0x1f,
-    0x2f,
-    0xa6,
-    0x3e,
-    0xab,
-    0x34,
-    0xdd,
-    0x04,
-    0x5b,
-    0x65,
-    0xc8,
-    0x10,
-    0x12,
-    0xeb,
-    0x74,
-    0x87,
-    0x78,
-    0x9a,
-    0xfd,
-    0x6a,
-    0x96,
-    0x2f,
-    0xba,
-    0x02,
-    0xa0,
-    0xd6,
-    0xb5,
-    0x82,
-    0x11,
-    0xf0,
-    0x5e,
-    0xe8,
-    0xfd,
-    0x12,
-    0x80,
-    0x24,
-    0xa3,
-    0x51,
-    0x73,
-    0x7c,
-    0x43,
-    0xbd,
-    0x94,
-    0x2f,
-    0x2f,
-    0x2b,
-    0xf2,
-    0x58,
-    0x23,
-    0x38,
-    0x4a,
-    0x16,
-    0xd9,
-    0x8a,
-    0x36,
-    0xea,
-    0xd9,
-    0x59,
-    0xa1,
-    0x60,
-    0x8f,
-    0x2e,
-    0x7e,
-    0xf2,
-    0x9f,
-    0xeb,
-    0xb9,
-    0x29,
-    0x7d,
-    0x0c,
-    0x6e,
-    0x05,
-    0x38,
-    0x2c,
-    0x5a,
-    0x9f,
-    0x96,
-    0xcb,
-    0x8f,
-    0x0d,
-    0x66,
-    0x4e,
-    0x6b,
-    0x86,
-    0x12,
-    0x47,
-    0xca,
-    0xc6,
-    0x74,
-    0xf7,
-    0x7b,
-    0xb4,
-    0xea,
-    0x12,
-    0xf1,
-    0x43,
-    0xad,
-    0xc1,
-    0x3b,
-    0x96,
-    0x5e,
-    0xed,
-    0x37,
-    0x67,
-    0xe2,
-    0xbb,
-    0x02,
-    0xa9,
-    0x70,
-    0x53,
-    0xb2,
-    0x6c,
-    0xe8,
-    0xe6,
-    0x48,
-    0x02,
-    0x67,
-    0xef,
-    0xe0,
-    0x60,
-    0x18,
-    0xb9,
-    0x2b,
-    0xc6,
-    0x4d,
-    0x21,
-    0x1f,
-    0xa3,
-    0xce,
-    0x9d,
-    0xed,
-    0xb3,
-    0x70,
-    0x7d,
-    0x34,
-    0x6a,
-    0xea,
-    0x71,
-    0x74,
-    0x95,
-    0xe5,
-    0x4c,
-    0xc5,
-    0x3f,
-    0x52,
-    0x07,
-    0xc9,
-    0xd1,
-    0x00,
-    0x09,
-    0xdf,
-    0x7e,
-    0x6e,
-    0xa5,
-    0x99,
-    0xde,
-    0xde,
-    0xe5,
-    0x71,
-    0xd9,
-    0xaa,
-    0x86,
-    0xb7,
-    0xc7,
-    0xdb,
-    0x43,
-    0xce,
-    0xd5,
-    0xf8,
-    0x57,
-    0x98,
-    0xab,
-    0x1c,
-    0x3d,
-    0x2f,
-    0x4c,
-    0x4b,
-    0xba,
-    0xd6,
-    0x3d,
-    0x06,
-    0x1d,
-    0x2f,
-    0xe9,
-    0x1d,
-    0xc6,
-    0xae,
-    0x44,
-    0xc5,
-    0xe5,
-    0x4d,
-    0xaf,
-    0xea,
-    0x84,
-    0x81,
-    0x1c,
-    0xc7,
-    0xc8,
-    0x6d,
-    0x72,
-    0xb3,
-    0x73,
-    0x56,
-    0x33,
-    0x3e,
-    0xae,
-    0x58,
-    0x5c,
-    0x7c,
-    0x06,
-    0x57,
-    0x8c,
-    0xa1,
-    0xb4,
-    0x38,
-    0x69,
-    0xce,
-    0x21,
-    0x50,
-    0x3f,
-    0x2b,
-    0xa9,
-    0x1c,
-    0xeb,
-    0x36,
-    0x9f,
-    0x33,
-    0xf8,
-    0x5b,
-    0x92,
-    0x7a,
-    0x07,
-    0xc4,
-    0xcf,
-    0x97,
-    0x74,
-    0x72,
-    0x27
-  ],
-  const [
-    0x25,
-    0xa4,
-    0x3f,
-    0xd8,
-    0xbf,
-    0x24,
-    0x1d,
-    0x67,
-    0xda,
-    0xb9,
-    0xe3,
-    0xc1,
-    0x06,
-    0xcd,
-    0x27,
-    0xb7,
-    0x1f,
-    0xd4,
-    0x5a,
-    0x87,
-    0xb9,
-    0x25,
-    0x4a,
-    0x53,
-    0xc1,
-    0x08,
-    0xea,
-    0xd1,
-    0x62,
-    0x10,
-    0x56,
-    0x45,
-    0x26,
-    0xab,
-    0x12,
-    0xac,
-    0x5e,
-    0xf7,
-    0x92,
-    0x3a,
-    0xc3,
-    0xd7,
-    0x00,
-    0x07,
-    0x5d,
-    0x47,
-    0x39,
-    0x06,
-    0xa4,
-    0xec,
-    0x19,
-    0x36,
-    0xe6,
-    0xef,
-    0xf8,
-    0x1c,
-    0xe8,
-    0x0c,
-    0x74,
-    0x70,
-    0xd0,
-    0xe6,
-    0x71,
-    0x17,
-    0x42,
-    0x9e,
-    0x5f,
-    0x51,
-    0xca,
-    0xa3,
-    0xbc,
-    0x34,
-    0x7a,
-    0xcc,
-    0xd9,
-    0x59,
-    0xd4,
-    0xa4,
-    0xe0,
-    0xd5,
-    0xea,
-    0x05,
-    0x16,
-    0x6a,
-    0xc3,
-    0xe8,
-    0x5e,
-    0xff,
-    0x01,
-    0x7b,
-    0xff,
-    0x4e,
-    0xc1,
-    0x74,
-    0xa6,
-    0xdd,
-    0xc3,
-    0xa5,
-    0xaf,
-    0x2f,
-    0xcb,
-    0xd1,
-    0xa0,
-    0x3b,
-    0x46,
-    0xbf,
-    0xf6,
-    0x1d,
-    0x31,
-    0x8c,
-    0x25,
-    0x0c,
-    0x37,
-    0x45,
-    0xda,
-    0x8c,
-    0x19,
-    0xb6,
-    0x83,
-    0xe4,
-    0x53,
-    0x7c,
-    0x11,
-    0xd3,
-    0xfd,
-    0x62,
-    0xfc,
-    0x7f,
-    0xef,
-    0xea,
-    0x88,
-    0xae,
-    0x28,
-    0x29,
-    0x48,
-    0x38,
-    0x71,
-    0xd8,
-    0xe0,
-    0xbd,
-    0x3d,
-    0xa9,
-    0x0e,
-    0x93,
-    0xd4,
-    0xd7,
-    0xec,
-    0x02,
-    0xb0,
-    0x01,
-    0x6f,
-    0xb4,
-    0x27,
-    0x38,
-    0x34,
-    0x67,
-    0x4b,
-    0x57,
-    0x7c,
-    0xe5,
-    0x0f,
-    0x92,
-    0x75,
-    0x36,
-    0xab,
-    0x52,
-    0xbb,
-    0x14,
-    0x41,
-    0x41,
-    0x1e,
-    0x9f,
-    0xc0,
-    0xa0,
-    0xa6,
-    0x52,
-    0x09,
-    0xe1,
-    0xd4,
-    0x36,
-    0x50,
-    0x72,
-    0x2b,
-    0x55,
-    0xc5,
-    0xd7,
-    0xef,
-    0x72,
-    0x74,
-    0xfb,
-    0x2d,
-    0xf7,
-    0x6a,
-    0xc8,
-    0xfb,
-    0x2f,
-    0x1a,
-    0xf5,
-    0x01,
-    0xb5,
-    0xff,
-    0x1f,
-    0x38,
-    0x2d,
-    0x82,
-    0x1c,
-    0xf2,
-    0x31,
-    0x1d,
-    0x8c,
-    0x1b,
-    0x8e,
-    0xc1,
-    0xb0,
-    0xbe,
-    0xb1,
-    0x75,
-    0x80,
-    0xca,
-    0x5c,
-    0x41,
-    0xf7,
-    0x17,
-    0x9e,
-    0x4a,
-    0xb2,
-    0xa4,
-    0x01,
-    0x3e,
-    0xb9,
-    0x23,
-    0x05,
-    0xf2,
-    0x9d,
-    0xb7,
-    0xcd,
-    0x4a,
-    0xc3,
-    0xfc,
-    0x19,
-    0x5a,
-    0xff,
-    0x48,
-    0x74,
-    0xca,
-    0x64,
-    0x30,
-    0xaf,
-    0x7f,
-    0x5b,
-    0x4e,
-    0x8d,
-    0x77,
-    0xf3,
-    0x42,
-    0xc0,
-    0xf5,
-    0x78,
-    0xf7,
-    0x14,
-    0xdf,
-    0x47,
-    0x28,
-    0xeb,
-    0x64,
-    0xe0,
-    0x22,
-    0xe9,
-    0xe1,
-    0x3d,
-    0xcb,
-    0xf0,
-    0x06,
-    0x63,
-    0xe3,
-    0x4f,
-    0x35,
-    0x36,
-    0x8a,
-    0x36,
-    0x2a,
-    0x91,
-    0x02,
-    0x6e,
-    0xe1,
-    0x96,
-    0xb7,
-    0x46,
-    0xb4,
-    0x43,
-    0x7c,
-    0xd1,
-    0xc5,
-    0x46,
-    0x18,
-    0x4e,
-    0x9b,
-    0x13,
-    0x01,
-    0xe8,
-    0x10,
-    0x33,
-    0x67,
-    0xa0,
-    0x6a,
-    0xdf,
-    0x74,
-    0x87,
-    0xc8,
-    0xcd,
-    0xd3,
-    0x30,
-    0xc0,
-    0x4a,
-    0x6f,
-    0x65,
-    0x46,
-    0x89,
-    0x7d,
-    0x19,
-    0xcf,
-    0x3b,
-    0xbc,
-    0x9e,
-    0xb7,
-    0x5f,
-    0xfb,
-    0x18,
-    0xe0,
-    0x5c,
-    0xdd,
-    0x32,
-    0x9d,
-    0x4d,
-    0xd9,
-    0x0f,
-    0xce,
-    0x9c,
-    0x84,
-    0x84,
-    0x4c,
-    0xd2,
-    0x13,
-    0x84,
-    0x87,
-    0xad,
-    0x1b,
-    0xdb,
-    0x6d,
-    0x74,
-    0x9c,
-    0x1f,
-    0x8e,
-    0x87,
-    0x3e,
-    0xe4,
-    0x7e,
-    0x3a,
-    0xda,
-    0x30,
-    0x7b,
-    0xe3,
-    0x3c,
-    0x2f,
-    0x50,
-    0x32,
-    0x28,
-    0x27,
-    0x79,
-    0xc1,
-    0x9a,
-    0xad,
-    0x88,
-    0xec,
-    0x52,
-    0x1a,
-    0xc8,
-    0xe3,
-    0x90,
-    0x39,
-    0x1f,
-    0xfd,
-    0x1d,
-    0x42,
-    0x39,
-    0x50,
-    0x8a,
-    0x0c,
-    0xe2,
-    0x7e,
-    0xbc,
-    0x7e,
-    0xb4,
-    0xd1,
-    0xa9,
-    0x47,
-    0xf3,
-    0x8b,
-    0x5c,
-    0xce,
-    0xb5,
-    0x77,
-    0x3f,
-    0x6c,
-    0x46,
-    0xc4,
-    0x99,
-    0xda,
-    0xca,
-    0x13,
-    0x56,
-    0xe5,
-    0x24,
-    0xcf,
-    0x07,
-    0x69,
-    0x17,
-    0xbd,
-    0x29,
-    0x7c,
-    0xab,
-    0xd4,
-    0xaa,
-    0xea,
-    0xd3,
-    0x4e,
-    0xa9,
-    0xe2,
-    0x4c,
-    0xff,
-    0x7e,
-    0xee,
-    0xc8,
-    0xe6,
-    0xfa,
-    0x28,
-    0x4c,
-    0x02,
-    0xef,
-    0xac,
-    0xd7,
-    0x66,
-    0xf3,
-    0x49,
-    0x44,
-    0x90,
-    0x62,
-    0x7c,
-    0x71,
-    0xf7,
-    0xa2,
-    0x9e,
-    0xa1,
-    0xe3,
-    0xab,
-    0x5c,
-    0x1f,
-    0x81,
-    0xc6,
-    0x68,
-    0x25,
-    0x37,
-    0x94,
-    0x6e,
-    0xfb,
-    0x35,
-    0x53,
-    0x4a,
-    0x63,
-    0x4d,
-    0x5d,
-    0x78,
-    0x35,
-    0x04,
-    0xf1,
-    0xcb,
-    0x47,
-    0xe9,
-    0x36,
-    0x62,
-    0x8f,
-    0x25,
-    0x7d,
-    0xd9,
-    0x8c,
-    0x54,
-    0xc7,
-    0xbc,
-    0xe1,
-    0x93,
-    0x87,
-    0x41,
-    0x44,
-    0xda,
-    0xa9,
-    0x36,
-    0x96,
-    0x8d,
-    0xd2,
-    0x38,
-    0x53,
-    0x4d,
-    0xea,
-    0x26,
-    0x2d,
-    0x14,
-    0xd8,
-    0xd5,
-    0xf4,
-    0x81,
-    0x8c,
-    0x05,
-    0xb9,
-    0x70,
-    0x43,
-    0x94,
-    0x33,
-    0xce,
-    0x06,
-    0xf2,
-    0x62,
-    0xac,
-    0x74,
-    0xd5,
-    0x71,
-    0x91,
-    0xc2,
-    0x2e,
-    0xe1,
-    0x15,
-    0x00,
-    0x5b,
-    0xe4,
-    0xab,
-    0x9e,
-    0x9e,
-    0x07,
-    0xbf,
-    0x2e,
-    0xce,
-    0x14,
-    0x01,
-    0x6b,
-    0x4c,
-    0x37,
-    0x00,
-    0x7b,
-    0x39,
-    0x5f,
-    0xfa,
-    0x71,
-    0xe6,
-    0xe7,
-    0xf2,
-    0x16,
-    0x8c,
-    0x76,
-    0x04,
-    0xe9,
-    0x3e,
-    0x24,
-    0xf6,
-    0x64,
-    0x1b,
-    0xde,
-    0x0f,
-    0x81,
-    0xc8,
-    0x0b,
-    0x2c,
-    0x7d,
-    0x1e,
-    0x6f,
-    0x10,
-    0xdc,
-    0x1f,
-    0x50,
-    0xfc,
-    0xad,
-    0x2f,
-    0xd8,
-    0x7f,
-    0x0f,
-    0x81,
-    0xbb,
-    0x90,
-    0xf4,
-    0xcf,
-    0x1a,
-    0xda,
-    0x25,
-    0x4e,
-    0xa6,
-    0x57,
-    0x87,
-    0xe1,
-    0x08,
-    0x20,
-    0x9c,
-    0x8c,
-    0x81,
-    0x84,
-    0x4c,
-    0x2c,
-    0xcd,
-    0x57,
-    0xe6,
-    0x66,
-    0x4e,
-    0x8c,
-    0x62,
-    0xde,
-    0x66,
-    0x07,
-    0xe9,
-    0xa9,
-    0x25,
-    0xac,
-    0x97,
-    0x04,
-    0x24,
-    0xbc,
-    0x7f,
-    0x46,
-    0xb0,
-    0x61,
-    0xef,
-    0x13,
-    0x2b,
-    0x87,
-    0xf6,
-    0xd3,
-    0xb0,
-    0xee,
-    0x24,
-    0x62,
-    0xf6,
-    0x7d,
-    0x91,
-    0x09,
-    0x77,
-    0xda,
-    0x20,
-    0xae,
-    0xd1,
-    0x37,
-    0x05,
-    0x47,
-    0x6c,
-    0x6f,
-    0x85,
-    0x95,
-    0x5d,
-    0x51,
-    0xfd,
-    0x0e,
-    0x8a,
-    0x3b,
-    0x26,
-    0x1b,
-    0x0f,
-    0xec,
-    0x97,
-    0x83,
-    0xe1,
-    0x93,
-    0x8c,
-    0x27,
-    0xb1,
-    0x2b,
-    0xe5,
-    0xf1,
-    0x14,
-    0x0b,
-    0x72,
-    0x07,
-    0xe0,
-    0xb9,
-    0x6d,
-    0x44,
-    0xd9,
-    0x00,
-    0x48,
-    0xe8,
-    0x8d,
-    0x42,
-    0xaa,
-    0x8e,
-    0x7c,
-    0x0f,
-    0xb4,
-    0x5f,
-    0x7c,
-    0xf5,
-    0x88,
-    0x86,
-    0x5c,
-    0x9a,
-    0x0c,
-    0xe3,
-    0xc8,
-    0x09,
-    0xeb,
-    0x04,
-    0x6c,
-    0x4a,
-    0xdd,
-    0x51,
-    0x5d,
-    0x35,
-    0x29,
-    0x86,
-    0xb4,
-    0x87,
-    0x68,
-    0x67,
-    0x7c,
-    0x36,
-    0x8b,
-    0xaf,
-    0xce,
-    0x02,
-    0x1f,
-    0x49,
-    0x3a,
-    0x4d,
-    0xd0,
-    0xc2,
-    0x69,
-    0x2c,
-    0x2c,
-    0xff,
-    0x01,
-    0xbe,
-    0xaa,
-    0x2b,
-    0xc9,
-    0xbd,
-    0xeb,
-    0xf4,
-    0x0e,
-    0x52,
-    0x3f,
-    0xf7,
-    0x45,
-    0x2e,
-    0x6b,
-    0x78,
-    0xf1,
-    0xd6,
-    0xaa,
-    0x57,
-    0xc7,
-    0x3e,
-    0xf1,
-    0x3f,
-    0x10,
-    0x9a,
-    0x77,
-    0x21,
-    0x50,
-    0x71,
-    0x75,
-    0xe1,
-    0x25,
-    0xf3,
-    0x2a,
-    0x4f,
-    0x71,
-    0x8c,
-    0x23,
-    0x58,
-    0xbb,
-    0xb9,
-    0xb9,
-    0x7e,
-    0xd3,
-    0x1b,
-    0xdb,
-    0x85,
-    0xb5,
-    0xca,
-    0x0e,
-    0x6f,
-    0xb0,
-    0xeb,
-    0xb1,
-    0xab,
-    0xc8,
-    0x85,
-    0x86,
-    0x8a,
-    0x58,
-    0x90,
-    0x6e,
-    0xf2,
-    0xfc,
-    0x4f,
-    0x74,
-    0x56,
-    0xad,
-    0xe0,
-    0x0d,
-    0xe5,
-    0x2e,
-    0x12,
-    0x9e,
-    0x02,
-    0xa8,
-    0x76,
-    0x3f,
-    0xf5,
-    0x91,
-    0xb9,
-    0xbf,
-    0xe0,
-    0xd1,
-    0x30,
-    0xe8,
-    0xf4,
-    0x28,
-    0xb5,
-    0x04,
-    0xe4,
-    0xca,
-    0xb2,
-    0xa0,
-    0x9a,
-    0x4d,
-    0x7b,
-    0x8f,
-    0x2a,
-    0xc5,
-    0xe1,
-    0x32,
-    0x04,
-    0x2e,
-    0x04,
-    0xf7,
-    0x6d,
-    0x0a,
-    0x68,
-    0x20,
-    0x30,
-    0x4a,
-    0x4b,
-    0xc6,
-    0x90,
-    0x72,
-    0x36,
-    0x1d,
-    0x82,
-    0xf9,
-    0xd3,
-    0xf9,
-    0x19,
-    0xee,
-    0xfe,
-    0x91,
-    0x42,
-    0xe2,
-    0x1e,
-    0x83,
-    0xb1,
-    0x01,
-    0xb6,
-    0x19,
-    0x1b,
-    0x82,
-    0x37,
-    0xcb,
-    0xa6,
-    0x42,
-    0x19,
-    0x05,
-    0x9e,
-    0xab,
-    0x29,
-    0x2a,
-    0x69,
-    0xdb,
-    0x25,
-    0xd8,
-    0xbd,
-    0x02,
-    0x86,
-    0x6e,
-    0x10,
-    0x0c,
-    0x9d,
-    0xcb,
-    0x50,
-    0x81,
-    0xe1,
-    0x59,
-    0xd5,
-    0xa9,
-    0x88,
-    0x4b,
-    0x94,
-    0xf3,
-    0x54,
-    0x22,
-    0x95,
-    0x97,
-    0xb0,
-    0x76,
-    0xa7,
-    0x7b,
-    0xfb,
-    0xf3,
-    0x52,
-    0x54,
-    0x24,
-    0xa2,
-    0x0d,
-    0x0d,
-    0x77,
-    0x69,
-    0xb1,
-    0x6c,
-    0xb6,
-    0xd6,
-    0x2e,
-    0xf3,
-    0x6c,
-    0x18,
-    0x7c,
-    0x04,
-    0x7e,
-    0x4e,
-    0xd5,
-    0x49,
-    0x03,
-    0x05,
-    0x22,
-    0x53,
-    0x55,
-    0xfb,
-    0xb3,
-    0x81,
-    0x68,
-    0x29,
-    0x32,
-    0x24,
-    0x5b,
-    0x01,
-    0xda,
-    0xe0,
-    0x4d,
-    0xf5,
-    0xe4,
-    0x56,
-    0x72,
-    0x38,
-    0x42,
-    0xff,
-    0x66,
-    0xc8,
-    0x90,
-    0x5b,
-    0xc1,
-    0xac,
-    0x48,
-    0x4c,
-    0xeb,
-    0x7a,
-    0x35,
-    0xbc,
-    0x32,
-    0x1d,
-    0x2a,
-    0x86,
-    0x19,
-    0xd5,
-    0xf3,
-    0x94,
-    0xf3,
-    0x7f,
-    0x8c,
-    0x45,
-    0xb1,
-    0x17,
-    0x91,
-    0x11,
-    0xf9,
-    0x7b,
-    0xf6,
-    0x6f,
-    0x78,
-    0x72,
-    0xf8,
-    0xf6,
-    0x78,
-    0xec,
-    0x53,
-    0xc3,
-    0xb5,
-    0x8c,
-    0xb6,
-    0x1c,
-    0x6c,
-    0x63,
-    0x74,
-    0x52,
-    0xb6,
-    0xff,
-    0x7c,
-    0xec,
-    0x14,
-    0xa4,
-    0x8b,
-    0x01,
-    0x4b,
-    0xd9,
-    0xa0,
-    0xe6,
-    0x72,
-    0x26,
-    0xb1,
-    0x0a,
-    0x49,
-    0x1d,
-    0x9c,
-    0x1d,
-    0xcc,
-    0x97,
-    0x60,
-    0x78,
-    0x08,
-    0x40,
-    0x8d,
-    0xb9,
-    0x2e,
-    0x56,
-    0xf9,
-    0xad,
-    0xe6,
-    0xad,
-    0xb5,
-    0x74,
-    0xe5,
-    0xf7,
-    0x3f,
-    0xdf,
-    0xc2,
-    0x42,
-    0xf9,
-    0x1d,
-    0x05,
-    0xc2,
-    0xda,
-    0x97,
-    0x82,
-    0xd1,
-    0x64,
-    0x18,
-    0xe5,
-    0x34,
-    0xd6,
-    0x31,
-    0x8d,
-    0xa0,
-    0xa2,
-    0xdc,
-    0x9e,
-    0x7c,
-    0x21,
-    0x5f,
-    0x51,
-    0xe9,
-    0x86,
-    0x73,
-    0x8f,
-    0x00,
-    0x11,
-    0xa6,
-    0xbf,
-    0x5a,
-    0x85,
-    0xfe,
-    0xdc,
-    0xd6,
-    0xdb,
-    0xdf,
-    0xca,
-    0x96,
-    0x38,
-    0x2e,
-    0xea,
-    0x4b,
-    0x1d,
-    0xb7,
-    0xec,
-    0xb3,
-    0xdd,
-    0xcc,
-    0xe4,
-    0x60,
-    0x55,
-    0x2f,
-    0xa0,
-    0xba,
-    0xd7,
-    0x33,
-    0x39,
-    0x47,
-    0x67,
-    0x1d,
-    0xe9,
-    0x2a,
-    0x2a,
-    0xd0,
-    0x1c,
-    0xea,
-    0x1b,
-    0xaa,
-    0xca,
-    0x75,
-    0x00,
-    0xa9,
-    0x03,
-    0x65,
-    0x9d,
-    0xd2,
-    0xcc,
-    0x81,
-    0x27,
-    0xd3,
-    0x29,
-    0x87,
-    0xfb,
-    0xe7,
-    0x7b,
-    0x29,
-    0x90,
-    0xfa,
-    0x0c,
-    0x55,
-    0xaa,
-    0x0e,
-    0xe9,
-    0xb9,
-    0xd1,
-    0xdd,
-    0xf0,
-    0x87,
-    0x02,
-    0xbf,
-    0x29,
-    0x75,
-    0xa4,
-    0xcf,
-    0x5a,
-    0x09,
-    0xbd,
-    0x49,
-    0xd5,
-    0x13,
-    0x66,
-    0x37,
-    0x95,
-    0x7b,
-    0x7d,
-    0x4d,
-    0x89,
-    0x3c,
-    0x99,
-    0x11,
-    0x30,
-    0xb1,
-    0x43,
-    0x3f,
-    0x66,
-    0x10,
-    0x63,
-    0x6b,
-    0x7e,
-    0x34,
-    0xf8,
-    0xe8,
-    0x90,
-    0x9f,
-    0x0c,
-    0xe9,
-    0x14,
-    0xbf,
-    0xe8,
-    0xe6,
-    0xb0,
-    0x70,
-    0x84,
-    0x41,
-    0x4f,
-    0xc3,
-    0x41,
-    0x2a,
-    0x73,
-    0xfd,
-    0xda,
-    0xc0,
-    0xcc,
-    0xe3,
-    0x98,
-    0x78,
-    0x09,
-    0x35,
-    0xc6,
-    0xc3,
-    0xee,
-    0x79,
-    0x65,
-    0xeb,
-    0xa7,
-    0xf9,
-    0x21,
-    0x3e,
-    0x5c,
-    0x0f,
-    0x83,
-    0x6f,
-    0x05,
-    0xa0,
-    0x67,
-    0x39,
-    0x80,
-    0xe7,
-    0xb1,
-    0x45,
-    0xe0,
-    0x74,
-    0x3c,
-    0x4e,
-    0x09,
-    0x74,
-    0x13,
-    0x83,
-    0x7a,
-    0x32,
-    0xe4,
-    0x2d,
-    0x69,
-    0xde,
-    0xb1,
-    0x91,
-    0x15,
-    0x8e,
-    0xc9,
-    0x18,
-    0x58,
-    0x82,
-    0xf7,
-    0xad,
-    0x7b,
-    0xac,
-    0xf9,
-    0x67,
-    0x4f,
-    0x6f,
-    0x33,
-    0x68,
-    0x79,
-    0xa8,
-    0xa5,
-    0x05,
-    0x0e,
-    0xeb,
-    0x1b,
-    0x27,
-    0x60,
-    0x0f,
-    0xa3,
-    0xf0,
-    0x17,
-    0xec,
-    0x44,
-    0xa2,
-    0x83,
-    0x63,
-    0xed,
-    0xbd,
-    0x30,
-    0x9f,
-    0xac,
-    0x68,
-    0xbb,
-    0x9b,
-    0x20,
-    0x12,
-    0xe5,
-    0xe4,
-    0x31,
-    0x59,
-    0xe6,
-    0xa1,
-    0xfe,
-    0x2b,
-    0x04,
-    0xd0,
-    0x17,
-    0x2b,
-    0x63,
-    0xd2,
-    0xed,
-    0x56,
-    0x1f,
-    0x2a,
-    0x87,
-    0xe6,
-    0x98,
-    0x82,
-    0x76,
-    0x76,
-    0x0d,
-    0xee,
-    0x0a,
-    0x68,
-    0x6d,
-    0x75,
-    0xc6,
-    0x84,
-    0x69,
-    0xce,
-    0x12,
-    0xe1,
-    0xce,
-    0x67,
-    0x30,
-    0x09,
-    0x12,
-    0xac,
-    0x71,
-    0x58,
-    0x2c,
-    0x85,
-    0xa9,
-    0xa5,
-    0xa9,
-    0x20,
-    0xe0,
-    0x25,
-    0xfd,
-    0xf2,
-    0x4a,
-    0x8b,
-    0x17,
-    0xf8,
-    0x7a,
-    0x74,
-    0x38,
-    0x43,
-    0xd2,
-    0x03,
-    0x04,
-    0xb3,
-    0x3e,
-    0xc8,
-    0xda,
-    0x03,
-    0x22,
-    0xe7,
-    0x61,
-    0x05,
-    0x90,
-    0x76,
-    0x63,
-    0x2f,
-    0xbf,
-    0x26,
-    0xdf,
-    0x57,
-    0xb8,
-    0x26,
-    0x59,
-    0xbb,
-    0x53,
-    0x44,
-    0x75,
-    0x44,
-    0x62,
-    0x56,
-    0xc4,
-    0x0c,
-    0x2c,
-    0xd8,
-    0xde,
-    0x1d,
-    0x1d,
-    0xd6,
-    0xb1,
-    0x7c,
-    0xbb,
-    0x0d,
-    0x18,
-    0x66,
-    0xdc,
-    0x4d,
-    0xb0,
-    0xd9,
-    0x16,
-    0x21,
-    0xe7,
-    0x56,
-    0x78,
-    0xb2,
-    0x55,
-    0xe6,
-    0x77,
-    0xe9,
-    0x50,
-    0x5b,
-    0x2b,
-    0xd4,
-    0xba,
-    0xd8,
-    0xbc,
-    0x4b,
-    0x1e,
-    0x93,
-    0x17,
-    0xd3,
-    0xfb,
-    0xda,
-    0xe5,
-    0xc2,
-    0x60,
-    0x54,
-    0xbd,
-    0xa4,
-    0xb9,
-    0x8a,
-    0x98,
-    0xde,
-    0xe9,
-    0xa5,
-    0x86,
-    0x91,
-    0x99,
-    0x79,
-    0xa0,
-    0xc1,
-    0xcf,
-    0xc3,
-    0x3e,
-    0xb7,
-    0xc2,
-    0xaf,
-    0x6a,
-    0xa3,
-    0xed
-  ],
-  const [
-    0xc2,
-    0x9a,
-    0x1a,
-    0xb0,
-    0x20,
-    0xe6,
-    0x43,
-    0x4a,
-    0x50,
-    0xa2,
-    0x71,
-    0xe5,
-    0x52,
-    0x5a,
-    0x47,
-    0xa2,
-    0x9b,
-    0x44,
-    0x7a,
-    0x76,
-    0x16,
-    0x2e,
-    0xee,
-    0xc5,
-    0x69,
-    0xb5,
-    0x1c,
-    0x33,
-    0x79,
-    0xb8,
-    0xb7,
-    0xb7,
-    0x30,
-    0x0c,
-    0x8f,
-    0xf1,
-    0x7e,
-    0x71,
-    0xb5,
-    0xbd,
-    0x9d,
-    0xc5,
-    0xe0,
-    0x08,
-    0x9a,
-    0x78,
-    0x0f,
-    0xe2,
-    0x11,
-    0x40,
-    0x70,
-    0xd5,
-    0x38,
-    0x0e,
-    0x81,
-    0x75,
-    0x1e,
-    0x40,
-    0x75,
-    0x39,
-    0x35,
-    0x18,
-    0xd9,
-    0x89,
-    0x0f,
-    0x6d,
-    0x77,
-    0x18,
-    0x65,
-    0xa0,
-    0x7b,
-    0x74,
-    0x5d,
-    0xd2,
-    0xd4,
-    0xdc,
-    0x0c,
-    0x54,
-    0xdd,
-    0x51,
-    0x3a,
-    0x5f,
-    0x3d,
-    0xef,
-    0x66,
-    0x06,
-    0x0c,
-    0x7e,
-    0x0a,
-    0x68,
-    0x37,
-    0x45,
-    0x21,
-    0x2a,
-    0x25,
-    0x1e,
-    0xe5,
-    0x25,
-    0x9a,
-    0xd0,
-    0xdd,
-    0x5b,
-    0xdc,
-    0x98,
-    0x17,
-    0x30,
-    0x15,
-    0x09,
-    0xb3,
-    0xd7,
-    0xf9,
-    0x17,
-    0xa1,
-    0x0a,
-    0xa8,
-    0x6e,
-    0xaa,
-    0xfe,
-    0xd6,
-    0x08,
-    0xb5,
-    0x96,
-    0x29,
-    0xfe,
-    0x43,
-    0xd7,
-    0xe2,
-    0x9e,
-    0x3d,
-    0x9c,
-    0xc0,
-    0xbf,
-    0xef,
-    0x8a,
-    0x21,
-    0x51,
-    0x54,
-    0x47,
-    0x6b,
-    0x38,
-    0x94,
-    0xe7,
-    0xaa,
-    0x5b,
-    0xcb,
-    0xa7,
-    0x7b,
-    0xf7,
-    0x0c,
-    0xde,
-    0x28,
-    0x3a,
-    0xa6,
-    0x30,
-    0x14,
-    0x0d,
-    0xa5,
-    0x05,
-    0x5a,
-    0x31,
-    0x9c,
-    0x39,
-    0xb1,
-    0x8d,
-    0xa2,
-    0x16,
-    0x93,
-    0xc6,
-    0x9b,
-    0x7f,
-    0x9e,
-    0x11,
-    0xb9,
-    0x6d,
-    0x3a,
-    0x45,
-    0x42,
-    0xa0,
-    0x7c,
-    0x35,
-    0x93,
-    0x8e,
-    0x4a,
-    0x3c,
-    0x65,
-    0xa0,
-    0xc0,
-    0x19,
-    0x4f,
-    0x9d,
-    0xd3,
-    0xfd,
-    0x8c,
-    0x66,
-    0x34,
-    0xe3,
-    0xff,
-    0xe5,
-    0x77,
-    0x20,
-    0x74,
-    0x40,
-    0x75,
-    0x3b,
-    0x29,
-    0x52,
-    0xef,
-    0xfe,
-    0x8d,
-    0x5b,
-    0x74,
-    0xcd,
-    0x47,
-    0xf6,
-    0x84,
-    0x37,
-    0x7a,
-    0x4c,
-    0xf5,
-    0xcb,
-    0x47,
-    0x88,
-    0x96,
-    0x2d,
-    0x94,
-    0x8b,
-    0x13,
-    0x69,
-    0x0c,
-    0xe0,
-    0x18,
-    0x86,
-    0x67,
-    0xf2,
-    0xb9,
-    0x5f,
-    0xec,
-    0x7c,
-    0x12,
-    0xae,
-    0x34,
-    0x42,
-    0x2a,
-    0x6a,
-    0x30,
-    0xff,
-    0x1e,
-    0x53,
-    0x6e,
-    0x9e,
-    0x7b,
-    0xcb,
-    0x97,
-    0xac,
-    0xeb,
-    0xe7,
-    0x3d,
-    0x0e,
-    0x14,
-    0xc6,
-    0xd3,
-    0xef,
-    0xbd,
-    0x21,
-    0xfd,
-    0xfd,
-    0x32,
-    0x24,
-    0x0b,
-    0xd5,
-    0xea,
-    0x7c,
-    0xbf,
-    0xbb,
-    0x68,
-    0xb2,
-    0x57,
-    0x8f,
-    0x5f,
-    0xb7,
-    0xc7,
-    0xfc,
-    0x19,
-    0xc0,
-    0x47,
-    0xf3,
-    0x19,
-    0x53,
-    0x0d,
-    0x58,
-    0x00,
-    0xa2,
-    0x5c,
-    0xfb,
-    0xad,
-    0x19,
-    0xbd,
-    0xc9,
-    0xa8,
-    0x33,
-    0x8d,
-    0x44,
-    0xc1,
-    0x91,
-    0xb7,
-    0x30,
-    0xf4,
-    0x4d,
-    0xc3,
-    0x8f,
-    0x90,
-    0x8c,
-    0x10,
-    0xd0,
-    0x99,
-    0x52,
-    0x5d,
-    0x44,
-    0x6a,
-    0x9b,
-    0x8e,
-    0xd1,
-    0x9e,
-    0xa7,
-    0xad,
-    0xea,
-    0x31,
-    0x95,
-    0x30,
-    0xbe,
-    0xe3,
-    0x33,
-    0x7a,
-    0xb0,
-    0xdd,
-    0x15,
-    0xa4,
-    0x08,
-    0x97,
-    0xe4,
-    0x7c,
-    0xe8,
-    0xf9,
-    0xf9,
-    0xce,
-    0x81,
-    0xc1,
-    0x2a,
-    0xe3,
-    0x86,
-    0x24,
-    0xe4,
-    0x48,
-    0xe1,
-    0xb8,
-    0x7b,
-    0xd0,
-    0xa6,
-    0x91,
-    0xbd,
-    0xdc,
-    0x45,
-    0xaa,
-    0xcd,
-    0xda,
-    0x03,
-    0x87,
-    0x2f,
-    0x0c,
-    0xab,
-    0x19,
-    0x1f,
-    0x8b,
-    0x80,
-    0xe2,
-    0x27,
-    0x8b,
-    0x77,
-    0x5a,
-    0xf0,
-    0xe0,
-    0xa3,
-    0x90,
-    0x59,
-    0xc2,
-    0xf1,
-    0x14,
-    0xc6,
-    0xcd,
-    0x15,
-    0x15,
-    0xba,
-    0x4b,
-    0xc4,
-    0xc7,
-    0xa9,
-    0xb6,
-    0x24,
-    0x07,
-    0x07,
-    0x79,
-    0x81,
-    0x42,
-    0xa5,
-    0xf7,
-    0x41,
-    0x93,
-    0x3d,
-    0xce,
-    0x1a,
-    0x2b,
-    0x4c,
-    0x5d,
-    0x82,
-    0xf6,
-    0x1f,
-    0x84,
-    0x67,
-    0x7c,
-    0x31,
-    0xaa,
-    0x21,
-    0x05,
-    0xb4,
-    0x05,
-    0xa5,
-    0x00,
-    0x6e,
-    0x15,
-    0xfb,
-    0xa5,
-    0xc6,
-    0x72,
-    0xf2,
-    0xda,
-    0x1f,
-    0xc8,
-    0x12,
-    0x53,
-    0x64,
-    0x20,
-    0xd2,
-    0xfe,
-    0xe4,
-    0x61,
-    0x0b,
-    0x9e,
-    0x61,
-    0x16,
-    0xad,
-    0xb5,
-    0x63,
-    0x71,
-    0xb1,
-    0xa8,
-    0xd2,
-    0x90,
-    0x4e,
-    0x1e,
-    0xc4,
-    0x00,
-    0x70,
-    0xa9,
-    0x94,
-    0x80,
-    0x66,
-    0xa8,
-    0x34,
-    0x07,
-    0xda,
-    0x6c,
-    0xc4,
-    0x08,
-    0x07,
-    0x99,
-    0x63,
-    0xf4,
-    0x26,
-    0xcf,
-    0x45,
-    0x01,
-    0x29,
-    0x8a,
-    0x05,
-    0x2a,
-    0xac,
-    0x47,
-    0x3d,
-    0x76,
-    0x29,
-    0xe9,
-    0x55,
-    0x7e,
-    0x6b,
-    0x5a,
-    0x98,
-    0x29,
-    0x45,
-    0x75,
-    0x8d,
-    0xbb,
-    0x83,
-    0x24,
-    0x84,
-    0x0e,
-    0x21,
-    0xc5,
-    0x6f,
-    0x1e,
-    0xbb,
-    0xd3,
-    0xf3,
-    0xcc,
-    0x45,
-    0xc2,
-    0xbf,
-    0xdb,
-    0xfc,
-    0x2a,
-    0x1d,
-    0x3f,
-    0x9c,
-    0x28,
-    0xc6,
-    0x97,
-    0xd4,
-    0x02,
-    0xfb,
-    0xf8,
-    0xf7,
-    0x09,
-    0xd1,
-    0xec,
-    0xf4,
-    0xc4,
-    0xcd,
-    0xba,
-    0x88,
-    0x4a,
-    0xb0,
-    0xe8,
-    0xb2,
-    0xf0,
-    0x94,
-    0xff,
-    0x68,
-    0x24,
-    0x38,
-    0x8e,
-    0x88,
-    0x99,
-    0x99,
-    0x71,
-    0x11,
-    0xa5,
-    0xc2,
-    0x53,
-    0x93,
-    0xe7,
-    0xe4,
-    0x72,
-    0xe4,
-    0x2c,
-    0xa9,
-    0xa2,
-    0x15,
-    0x93,
-    0xc6,
-    0x95,
-    0xa4,
-    0xf0,
-    0xd0,
-    0x59,
-    0xf3,
-    0x6f,
-    0x50,
-    0x22,
-    0xf9,
-    0x7a,
-    0x19,
-    0x4a,
-    0x38,
-    0xdc,
-    0xd9,
-    0x96,
-    0xef,
-    0x26,
-    0xef,
-    0xbb,
-    0x90,
-    0x51,
-    0x7c,
-    0x21,
-    0x74,
-    0xa6,
-    0xbd,
-    0xe6,
-    0xce,
-    0xdb,
-    0x98,
-    0x26,
-    0xde,
-    0x7f,
-    0x74,
-    0x7a,
-    0x67,
-    0x98,
-    0x4e,
-    0xbe,
-    0x62,
-    0x8a,
-    0x09,
-    0x18,
-    0xf4,
-    0x3a,
-    0x06,
-    0x35,
-    0x9e,
-    0x74,
-    0xf5,
-    0xd6,
-    0xb4,
-    0x8a,
-    0xeb,
-    0x8c,
-    0x10,
-    0x3e,
-    0xb4,
-    0xbf,
-    0x07,
-    0xe2,
-    0x6a,
-    0xf5,
-    0x9c,
-    0xbe,
-    0x46,
-    0x51,
-    0xf4,
-    0xb2,
-    0xb7,
-    0x5a,
-    0x0a,
-    0x1d,
-    0xb1,
-    0xff,
-    0xa4,
-    0xfd,
-    0x48,
-    0xd7,
-    0x86,
-    0x57,
-    0x7d,
-    0xad,
-    0xe5,
-    0xd9,
-    0x58,
-    0x3b,
-    0x1e,
-    0xbe,
-    0x37,
-    0x36,
-    0xa8,
-    0xf2,
-    0x65,
-    0x8b,
-    0x47,
-    0x76,
-    0xee,
-    0xe9,
-    0x83,
-    0x07,
-    0xb2,
-    0x7f,
-    0x59,
-    0xfa,
-    0xb9,
-    0x07,
-    0x30,
-    0x6b,
-    0xc6,
-    0x03,
-    0x0f,
-    0x96,
-    0x2f,
-    0x46,
-    0x0c,
-    0x85,
-    0xeb,
-    0xb7,
-    0x08,
-    0xec,
-    0xed,
-    0x52,
-    0x99,
-    0x51,
-    0xb0,
-    0x6f,
-    0x48,
-    0x6f,
-    0x14,
-    0x47,
-    0xfd,
-    0xdd,
-    0x68,
-    0xb4,
-    0xb7,
-    0xeb,
-    0xc8,
-    0x38,
-    0x80,
-    0xcd,
-    0xa9,
-    0x41,
-    0xa1,
-    0xfb,
-    0xb2,
-    0xab,
-    0x12,
-    0xd7,
-    0xce,
-    0x87,
-    0x34,
-    0x90,
-    0x7f,
-    0x1b,
-    0xc2,
-    0x47,
-    0x75,
-    0x29,
-    0x05,
-    0x71,
-    0x5f,
-    0x75,
-    0x48,
-    0x7d,
-    0x01,
-    0x81,
-    0x8c,
-    0xb6,
-    0x86,
-    0x9b,
-    0x7d,
-    0x6a,
-    0x18,
-    0x19,
-    0xa4,
-    0x4c,
-    0xaf,
-    0xe4,
-    0xdd,
-    0x17,
-    0x26,
-    0x33,
-    0x0c,
-    0x74,
-    0x94,
-    0x99,
-    0x0c,
-    0x1e,
-    0xd9,
-    0x42,
-    0xe8,
-    0x44,
-    0x77,
-    0x7a,
-    0x4e,
-    0x2f,
-    0xa4,
-    0x6e,
-    0x40,
-    0x24,
-    0x9d,
-    0x37,
-    0x0d,
-    0x8c,
-    0x3c,
-    0x14,
-    0x80,
-    0x52,
-    0xcd,
-    0xf7,
-    0x57,
-    0x8d,
-    0x1e,
-    0x44,
-    0xf6,
-    0x5f,
-    0xd5,
-    0xd5,
-    0x5d,
-    0x1c,
-    0x06,
-    0x41,
-    0x58,
-    0xaf,
-    0x05,
-    0x5e,
-    0xf5,
-    0x3a,
-    0x79,
-    0x04,
-    0x3b,
-    0xfd,
-    0xb2,
-    0x14,
-    0x19,
-    0x79,
-    0x3d,
-    0xb9,
-    0x9d,
-    0xd5,
-    0xb5,
-    0xee,
-    0x67,
-    0x80,
-    0xdb,
-    0x41,
-    0x5c,
-    0x18,
-    0xe9,
-    0xd6,
-    0x9f,
-    0x8b,
-    0x24,
-    0xae,
-    0xbd,
-    0x7c,
-    0xb1,
-    0x29,
-    0x27,
-    0xe8,
-    0xa9,
-    0xca,
-    0xe6,
-    0x09,
-    0x70,
-    0x3b,
-    0x8a,
-    0x7a,
-    0x42,
-    0x91,
-    0x63,
-    0x9d,
-    0x0e,
-    0xd0,
-    0xf4,
-    0x3a,
-    0x88,
-    0xb2,
-    0xa5,
-    0x68,
-    0x7a,
-    0xa4,
-    0xb8,
-    0xb1,
-    0x5a,
-    0x12,
-    0x7e,
-    0x71,
-    0x22,
-    0xe4,
-    0xcb,
-    0x7f,
-    0x5c,
-    0x49,
-    0xa7,
-    0x0f,
-    0x7c,
-    0xb3,
-    0x46,
-    0xd7,
-    0x73,
-    0x23,
-    0x3b,
-    0x71,
-    0x81,
-    0xa6,
-    0xe8,
-    0x01,
-    0x4b,
-    0x1f,
-    0x39,
-    0x17,
-    0x2d,
-    0x48,
-    0x92,
-    0xd7,
-    0xd1,
-    0xf4,
-    0x05,
-    0x57,
-    0x01,
-    0x97,
-    0xc9,
-    0x48,
-    0xb9,
-    0x07,
-    0xe7,
-    0xd9,
-    0x81,
-    0x84,
-    0x37,
-    0xd8,
-    0xf9,
-    0xf7,
-    0x8b,
-    0x1a,
-    0xb6,
-    0x77,
-    0x2a,
-    0x1e,
-    0x4c,
-    0x11,
-    0x80,
-    0xed,
-    0xac,
-    0xc9,
-    0x13,
-    0x44,
-    0xb1,
-    0xdc,
-    0xb9,
-    0xf5,
-    0xf5,
-    0x48,
-    0x09,
-    0x8b,
-    0xe9,
-    0x8e,
-    0x0f,
-    0x2d,
-    0x25,
-    0xb7,
-    0x44,
-    0xc5,
-    0xfc,
-    0x95,
-    0xbc,
-    0x61,
-    0x54,
-    0x4b,
-    0xa2,
-    0xd9,
-    0xb4,
-    0x10,
-    0xe2,
-    0xb2,
-    0x9f,
-    0x2f,
-    0x25,
-    0x42,
-    0x21,
-    0x52,
-    0x02,
-    0x15,
-    0xa7,
-    0x01,
-    0x72,
-    0x90,
-    0x14,
-    0x66,
-    0x85,
-    0xd4,
-    0x10,
-    0x53,
-    0x54,
-    0xe5,
-    0xa3,
-    0x86,
-    0x37,
-    0x0c,
-    0x04,
-    0x2b,
-    0x38,
-    0x79,
-    0xab,
-    0xa2,
-    0xc7,
-    0x2d,
-    0xad,
-    0x83,
-    0xaf,
-    0x17,
-    0x49,
-    0xdf,
-    0x48,
-    0x7d,
-    0xbe,
-    0xc9,
-    0xee,
-    0x9e,
-    0x60,
-    0x15,
-    0xb3,
-    0x96,
-    0xeb,
-    0x60,
-    0x51,
-    0x81,
-    0x17,
-    0x51,
-    0x63,
-    0xe3,
-    0x6d,
-    0x1d,
-    0xd4,
-    0x48,
-    0x58,
-    0x51,
-    0x97,
-    0x27,
-    0x7f,
-    0xcc,
-    0x98,
-    0x0c,
-    0x52,
-    0x0a,
-    0xf3,
-    0xf6,
-    0xe3,
-    0xa9,
-    0x65,
-    0xfe,
-    0xf8,
-    0x25,
-    0xff,
-    0x3a,
-    0x5e,
-    0xe7,
-    0x22,
-    0xe1,
-    0x80,
-    0x7e,
-    0xa7,
-    0xb0,
-    0x38,
-    0x2c,
-    0x5e,
-    0x8c,
-    0xe4,
-    0xa4,
-    0xba,
-    0x68,
-    0xbd,
-    0x12,
-    0xca,
-    0x69,
-    0x64,
-    0x5c,
-    0x6b,
-    0x48,
-    0xbe,
-    0xa7,
-    0xbd,
-    0xf9,
-    0x02,
-    0x1e,
-    0xd3,
-    0x8a,
-    0x10,
-    0xee,
-    0xaf,
-    0x4d,
-    0x05,
-    0x95,
-    0x6d,
-    0x39,
-    0x0c,
-    0x5d,
-    0xbe,
-    0x8e,
-    0x77,
-    0x23,
-    0x98,
-    0xb8,
-    0x0e,
-    0x5d,
-    0x2c,
-    0x76,
-    0xa6,
-    0x5c,
-    0x19,
-    0x3b,
-    0xf6,
-    0xce,
-    0xdf,
-    0xd5,
-    0xa7,
-    0x86,
-    0x96,
-    0x4c,
-    0xaa,
-    0x80,
-    0xe0,
-    0x0d,
-    0xce,
-    0x1f,
-    0x1c,
-    0x47,
-    0x92,
-    0xba,
-    0xdc,
-    0x96,
-    0x37,
-    0x57,
-    0x99,
-    0xdf,
-    0x1a,
-    0xb6,
-    0xa6,
-    0x7b,
-    0x41,
-    0x92,
-    0x63,
-    0x97,
-    0x34,
-    0x23,
-    0xb3,
-    0xda,
-    0x0e,
-    0xe7,
-    0xb0,
-    0x49,
-    0xd3,
-    0xa2,
-    0x9d,
-    0x68,
-    0x04,
-    0xa4,
-    0x1b,
-    0xa2,
-    0x71,
-    0x4a,
-    0xa0,
-    0xeb,
-    0x4f,
-    0xc7,
-    0x26,
-    0xa4,
-    0x8a,
-    0x24,
-    0x20,
-    0xbf,
-    0x5d,
-    0x86,
-    0xb2,
-    0x23,
-    0x1f,
-    0xb0,
-    0x21,
-    0x52,
-    0x60,
-    0xc8,
-    0x89,
-    0x49,
-    0x34,
-    0x5e,
-    0xce,
-    0xa8,
-    0xcf,
-    0xaa,
-    0xd4,
-    0x12,
-    0x52,
-    0x15,
-    0xf3,
-    0xd7,
-    0xe5,
-    0xfc,
-    0xa5,
-    0xd0,
-    0x06,
-    0xb0,
-    0x82,
-    0x8b,
-    0x20,
-    0xc1,
-    0x6f,
-    0xa8,
-    0x60,
-    0x7c,
-    0x12,
-    0x83,
-    0xc4,
-    0xb2,
-    0x89,
-    0x14,
-    0x75,
-    0xbb,
-    0x5b,
-    0x13,
-    0x56,
-    0xbb,
-    0xae,
-    0x5f,
-    0xdd,
-    0x24,
-    0xbb,
-    0xa0,
-    0x22,
-    0x7c,
-    0x80,
-    0x2b,
-    0x35,
-    0x61,
-    0xb4,
-    0x27,
-    0xb5,
-    0xca,
-    0x00,
-    0xee,
-    0x9e,
-    0x8f,
-    0x6c,
-    0xb6,
-    0x63,
-    0x2c,
-    0x18,
-    0x71,
-    0x3d,
-    0xc2,
-    0x2c,
-    0xf2,
-    0xc2,
-    0x5e,
-    0x11,
-    0x50,
-    0xb9,
-    0x7e,
-    0xe2,
-    0x8f,
-    0x2d,
-    0xd1,
-    0x1d,
-    0x7d,
-    0xc0,
-    0x3f,
-    0x9f,
-    0xdb,
-    0x42,
-    0x29,
-    0xcf,
-    0xbd,
-    0x82,
-    0xf2,
-    0x19,
-    0x34,
-    0x64,
-    0xbe,
-    0x9e,
-    0x29,
-    0x34,
-    0x79,
-    0x29,
-    0x8c,
-    0x3a,
-    0x1c,
-    0x65,
-    0xaf,
-    0x8f,
-    0x2b,
-    0x4e,
-    0xec,
-    0x2f,
-    0x82,
-    0xe6,
-    0x8e,
-    0x4e,
-    0x52,
-    0x29,
-    0xef,
-    0xf0,
-    0x67,
-    0x42,
-    0xdd,
-    0xb4,
-    0xac,
-    0xff,
-    0x42,
-    0xf0,
-    0xf0,
-    0x83,
-    0x04,
-    0x03,
-    0xea,
-    0x3b,
-    0x2b,
-    0xe7,
-    0x7b,
-    0x13,
-    0x42,
-    0x06,
-    0x34,
-    0xe9,
-    0xff,
-    0x4f,
-    0x18,
-    0x41,
-    0x26,
-    0x88,
-    0xa3,
-    0x3b,
-    0xaa,
-    0xe6,
-    0x0b,
-    0xc3,
-    0x15,
-    0xdb,
-    0xc5,
-    0x08,
-    0x2b,
-    0x2f,
-    0x4b,
-    0x2f,
-    0xca,
-    0x52,
-    0x1d,
-    0x48,
-    0x15,
-    0xf1,
-    0x05,
-    0x81,
-    0xd2,
-    0xc7,
-    0xa0,
-    0x99,
-    0x0f,
-    0xb6,
-    0x1a,
-    0x98,
-    0x0c,
-    0x16,
-    0x39,
-    0xbe,
-    0x55,
-    0x4d,
-    0x9d,
-    0xb9,
-    0x2f,
-    0x9f,
-    0x46,
-    0x1b,
-    0x35,
-    0x48,
-    0x56,
-    0x0a,
-    0x43,
-    0xc8,
-    0x18,
-    0x39,
-    0x93,
-    0x7f,
-    0x42,
-    0x18,
-    0x26,
-    0x79,
-    0x77,
-    0x48,
-    0x66,
-    0x8b,
-    0x10,
-    0x52,
-    0x09,
-    0x9f,
-    0x1c,
-    0x98,
-    0x38,
-    0x4c,
-    0xa5,
-    0x8c,
-    0xf1,
-    0xaa,
-    0x36,
-    0x1f,
-    0xaa,
-    0x64,
-    0x99,
-    0x7d,
-    0x37,
-    0x0e,
-    0xe5,
-    0xf7,
-    0xed,
-    0xb9,
-    0xb9,
-    0x40,
-    0x08,
-    0xc5,
-    0xc2,
-    0xdd,
-    0x4a,
-    0xf7,
-    0x83,
-    0xd7,
-    0xe5,
-    0xcb,
-    0x55,
-    0xb3,
-    0x9b,
-    0x0c,
-    0xac,
-    0xa3,
-    0x24,
-    0xa1,
-    0x9d,
-    0xfe,
-    0xd0,
-    0xaa,
-    0x9d,
-    0xee,
-    0x6d,
-    0xcc,
-    0x8c,
-    0x69,
-    0x6b,
-    0xc8,
-    0xf2,
-    0x62,
-    0x3e,
-    0x53,
-    0x88,
-    0x40,
-    0x04,
-    0x22,
-    0xfa,
-    0x8f,
-    0x68,
-    0x44,
-    0xeb,
-    0xf5,
-    0xc6,
-    0xb4,
-    0x39,
-    0x68,
-    0x90,
-    0x2f,
-    0x83,
-    0x9f,
-    0xf0,
-    0x43,
-    0xe9,
-    0xc6,
-    0xae,
-    0xa9,
-    0x13,
-    0x76,
-    0x55,
-    0xd4,
-    0x75,
-    0xe4,
-    0x91,
-    0xca,
-    0xd1,
-    0x59,
-    0xdc,
-    0x33,
-    0xfd,
-    0xe2,
-    0x59,
-    0xaf,
-    0xe6,
-    0x48,
-    0x00,
-    0x6d,
-    0xd5,
-    0x42,
-    0xfc,
-    0xfa,
-    0xf1,
-    0xea,
-    0x51,
-    0x56,
-    0x06,
-    0x6e,
-    0xc2,
-    0x4d,
-    0x84,
-    0x08,
-    0xf2,
-    0x04,
-    0xcb,
-    0x30,
-    0xc9,
-    0xd3,
-    0xa5,
-    0x10,
-    0x19,
-    0x52,
-    0x14,
-    0x38,
-    0x82,
-    0xb7,
-    0x4f,
-    0x93,
-    0x93,
-    0x5f,
-    0x07,
-    0x99,
-    0x31,
-    0xaa,
-    0xee,
-    0xc7,
-    0x3d,
-    0x0c,
-    0x7a,
-    0x4c,
-    0x71,
-    0x61,
-    0xe6,
-    0x06,
-    0x8b,
-    0x81,
-    0x7b,
-    0xac,
-    0xae,
-    0x15,
-    0x0d,
-    0x4d,
-    0x05,
-    0xa9,
-    0xc8,
-    0xf9,
-    0xa9,
-    0x02,
-    0x2d,
-    0xbe,
-    0xc5,
-    0xb1,
-    0x57,
-    0xd6,
-    0xf8,
-    0xe8,
-    0x83,
-    0x1e,
-    0xfa,
-    0x8d,
-    0xcf,
-    0xca,
-    0x83,
-    0x8d,
-    0x42,
-    0x57,
-    0x68,
-    0x73,
-    0x0d,
-    0xc2,
-    0x07,
-    0x39,
-    0x10
-  ],
-  const [
-    0xc3,
-    0xec,
-    0x01,
-    0xc7,
-    0x55,
-    0x38,
-    0x5f,
-    0x27,
-    0x02,
-    0x0d,
-    0x88,
-    0xed,
-    0x2c,
-    0x57,
-    0x8e,
-    0x73,
-    0x18,
-    0x5c,
-    0x6d,
-    0x51,
-    0x4c,
-    0x91,
-    0x92,
-    0xd1,
-    0x3c,
-    0xb2,
-    0x9e,
-    0xa4,
-    0x26,
-    0x11,
-    0x67,
-    0xd3,
-    0x3b,
-    0x2f,
-    0x3f,
-    0xf8,
-    0xff,
-    0x89,
-    0x7a,
-    0xad,
-    0xf2,
-    0xb4,
-    0x2a,
-    0x45,
-    0x70,
-    0xac,
-    0x2d,
-    0xba,
-    0xd6,
-    0x6a,
-    0x6a,
-    0xe7,
-    0xe6,
-    0xb4,
-    0x57,
-    0xf7,
-    0x6d,
-    0x39,
-    0xbf,
-    0x1e,
-    0x22,
-    0xdd,
-    0xc2,
-    0x87,
-    0xd2,
-    0x52,
-    0x1d,
-    0x8d,
-    0xba,
-    0xe8,
-    0xab,
-    0x2d,
-    0x35,
-    0xa6,
-    0x2c,
-    0xbb,
-    0x97,
-    0x99,
-    0x46,
-    0xd5,
-    0x58,
-    0x6c,
-    0xc9,
-    0x96,
-    0x75,
-    0x39,
-    0x37,
-    0x0b,
-    0x13,
-    0x9f,
-    0x84,
-    0xeb,
-    0x65,
-    0x15,
-    0x1a,
-    0x82,
-    0xd1,
-    0x7d,
-    0x20,
-    0xef,
-    0x4e,
-    0xfd,
-    0xfc,
-    0x8f,
-    0x11,
-    0x0a,
-    0x16,
-    0xb9,
-    0x68,
-    0xc5,
-    0xdf,
-    0xac,
-    0xe6,
-    0x8b,
-    0x13,
-    0xc5,
-    0xc0,
-    0xc7,
-    0x3b,
-    0xf6,
-    0x77,
-    0x0b,
-    0x75,
-    0x73,
-    0xb7,
-    0x60,
-    0x77,
-    0xae,
-    0x80,
-    0xda,
-    0xd2,
-    0x86,
-    0x83,
-    0x6f,
-    0x74,
-    0xbb,
-    0xcf,
-    0x08,
-    0x71,
-    0xa6,
-    0xac,
-    0xd9,
-    0x03,
-    0x27,
-    0xc7,
-    0xee,
-    0xcf,
-    0xde,
-    0x90,
-    0x07,
-    0x69,
-    0x9e,
-    0xe1,
-    0xa6,
-    0x1b,
-    0x1e,
-    0xe0,
-    0x66,
-    0xe2,
-    0xf2,
-    0x26,
-    0x8e,
-    0xba,
-    0xba,
-    0x21,
-    0xe6,
-    0x1b,
-    0x9a,
-    0xb6,
-    0xca,
-    0xc4,
-    0xea,
-    0x2b,
-    0x7c,
-    0xb7,
-    0x2e,
-    0x45,
-    0xbf,
-    0x85,
-    0x48,
-    0xad,
-    0xa1,
-    0xcb,
-    0xec,
-    0x98,
-    0x98,
-    0xfd,
-    0x55,
-    0xa7,
-    0xd0,
-    0x62,
-    0x36,
-    0x0c,
-    0xc4,
-    0x60,
-    0xf4,
-    0xef,
-    0x0c,
-    0xfa,
-    0x12,
-    0x10,
-    0x75,
-    0x97,
-    0xed,
-    0xad,
-    0x57,
-    0x05,
-    0xa9,
-    0xa6,
-    0x23,
-    0xbd,
-    0x6b,
-    0xdf,
-    0x3c,
-    0x69,
-    0xc8,
-    0xe6,
-    0x08,
-    0xa3,
-    0x7e,
-    0xd6,
-    0x46,
-    0x00,
-    0x62,
-    0x7b,
-    0xa2,
-    0x4d,
-    0x9a,
-    0xb6,
-    0x86,
-    0x18,
-    0x0c,
-    0x23,
-    0x34,
-    0x73,
-    0x16,
-    0xfa,
-    0x12,
-    0xf4,
-    0x80,
-    0x33,
-    0x44,
-    0x00,
-    0xaf,
-    0xee,
-    0x80,
-    0x49,
-    0x1b,
-    0x11,
-    0x1e,
-    0x96,
-    0x03,
-    0x33,
-    0x6f,
-    0xc3,
-    0x5f,
-    0xb9,
-    0x50,
-    0x08,
-    0x16,
-    0x3e,
-    0xff,
-    0x7e,
-    0x71,
-    0x39,
-    0x2d,
-    0xde,
-    0xcf,
-    0xd9,
-    0x54,
-    0x8c,
-    0x9b,
-    0x34,
-    0x4a,
-    0xd5,
-    0x7c,
-    0xa1,
-    0x17,
-    0x75,
-    0xcb,
-    0x62,
-    0x04,
-    0x5d,
-    0x4a,
-    0x87,
-    0xf4,
-    0xb3,
-    0x13,
-    0x0e,
-    0xf7,
-    0x19,
-    0xce,
-    0x4f,
-    0x1d,
-    0x32,
-    0x27,
-    0x98,
-    0x88,
-    0x62,
-    0x80,
-    0x14,
-    0xc5,
-    0xd6,
-    0xe2,
-    0xf1,
-    0x5d,
-    0xc5,
-    0x3a,
-    0xc1,
-    0xa6,
-    0xf5,
-    0xc2,
-    0x21,
-    0xdf,
-    0x80,
-    0xbd,
-    0x99,
-    0x7c,
-    0xd8,
-    0x67,
-    0xc4,
-    0xbf,
-    0x09,
-    0x2c,
-    0xb1,
-    0x88,
-    0x3e,
-    0x18,
-    0x88,
-    0x6e,
-    0x87,
-    0x8f,
-    0x71,
-    0x0e,
-    0xd9,
-    0x3e,
-    0xb1,
-    0xa3,
-    0x57,
-    0x51,
-    0x16,
-    0xd8,
-    0xcf,
-    0xe6,
-    0x96,
-    0xda,
-    0x88,
-    0xc2,
-    0x33,
-    0xb0,
-    0x3b,
-    0x43,
-    0x22,
-    0xcf,
-    0x5f,
-    0x96,
-    0x2b,
-    0xe9,
-    0xa9,
-    0x2a,
-    0x53,
-    0x07,
-    0xd4,
-    0x65,
-    0xb9,
-    0xd7,
-    0x9e,
-    0x95,
-    0xbe,
-    0x47,
-    0x13,
-    0x29,
-    0x68,
-    0x52,
-    0x0d,
-    0x21,
-    0x09,
-    0x1a,
-    0xfc,
-    0xc3,
-    0x1b,
-    0x38,
-    0xe3,
-    0x90,
-    0x6f,
-    0x50,
-    0xa3,
-    0x76,
-    0x87,
-    0xe8,
-    0x7c,
-    0x47,
-    0x40,
-    0x7a,
-    0xd1,
-    0x6a,
-    0xb3,
-    0xc7,
-    0x2b,
-    0xd1,
-    0x5e,
-    0x6f,
-    0x81,
-    0x2a,
-    0x7f,
-    0xbf,
-    0xb7,
-    0x5a,
-    0xc1,
-    0xca,
-    0x64,
-    0x27,
-    0x1a,
-    0xbb,
-    0xd8,
-    0x34,
-    0xf4,
-    0x69,
-    0x5e,
-    0x33,
-    0x8b,
-    0x2c,
-    0xbe,
-    0x56,
-    0x96,
-    0xf0,
-    0x06,
-    0x06,
-    0x29,
-    0x87,
-    0x8a,
-    0xd8,
-    0xda,
-    0x44,
-    0x2a,
-    0xbd,
-    0x23,
-    0xc5,
-    0xd3,
-    0x79,
-    0x07,
-    0x10,
-    0x49,
-    0x56,
-    0xf8,
-    0xe2,
-    0x23,
-    0x19,
-    0xf9,
-    0x43,
-    0x17,
-    0x35,
-    0x00,
-    0x5e,
-    0x77,
-    0x3f,
-    0x9e,
-    0x90,
-    0xfc,
-    0xa2,
-    0xe1,
-    0xbf,
-    0xc3,
-    0x94,
-    0x7a,
-    0xed,
-    0x95,
-    0x48,
-    0x1b,
-    0x0c,
-    0x6b,
-    0x65,
-    0x23,
-    0x14,
-    0x31,
-    0xb8,
-    0x7d,
-    0x54,
-    0xcb,
-    0x25,
-    0xc5,
-    0x05,
-    0x56,
-    0xe4,
-    0xad,
-    0x25,
-    0xb0,
-    0xea,
-    0xa0,
-    0x83,
-    0x3a,
-    0xa4,
-    0xa5,
-    0x16,
-    0xdc,
-    0xeb,
-    0x85,
-    0x92,
-    0x4a,
-    0x35,
-    0x30,
-    0x3d,
-    0x86,
-    0x08,
-    0x5d,
-    0xff,
-    0xa7,
-    0xb5,
-    0x71,
-    0xb9,
-    0xd8,
-    0x42,
-    0xa2,
-    0xd8,
-    0xa3,
-    0xa8,
-    0x5c,
-    0x2a,
-    0x70,
-    0x3f,
-    0xe3,
-    0xf0,
-    0x48,
-    0x76,
-    0x3b,
-    0x34,
-    0xdf,
-    0xc7,
-    0x45,
-    0x5d,
-    0xd2,
-    0xea,
-    0x2a,
-    0x00,
-    0x2d,
-    0x49,
-    0xfc,
-    0xf9,
-    0x30,
-    0xb5,
-    0x9b,
-    0xbb,
-    0x53,
-    0x57,
-    0xd6,
-    0xe4,
-    0x87,
-    0xe9,
-    0xd3,
-    0x15,
-    0xbf,
-    0x26,
-    0xb1,
-    0x00,
-    0xaf,
-    0x7e,
-    0x6b,
-    0xc2,
-    0xd3,
-    0x0f,
-    0x00,
-    0x74,
-    0xb4,
-    0xd1,
-    0xd1,
-    0xfc,
-    0x67,
-    0x10,
-    0x4a,
-    0x29,
-    0x56,
-    0x20,
-    0xc4,
-    0x00,
-    0x43,
-    0x4c,
-    0xaa,
-    0x50,
-    0x89,
-    0x0f,
-    0xdb,
-    0x8d,
-    0xa5,
-    0x87,
-    0x50,
-    0xda,
-    0xf6,
-    0x26,
-    0xff,
-    0x68,
-    0xc1,
-    0xab,
-    0xff,
-    0xff,
-    0x78,
-    0x50,
-    0xec,
-    0xda,
-    0x3c,
-    0x45,
-    0x8d,
-    0xb8,
-    0xa0,
-    0x5e,
-    0xb4,
-    0x30,
-    0xb0,
-    0x09,
-    0x66,
-    0x45,
-    0x32,
-    0x82,
-    0x3c,
-    0x3a,
-    0x2b,
-    0x4a,
-    0x09,
-    0xa8,
-    0xa5,
-    0xd5,
-    0xbd,
-    0xcd,
-    0xb0,
-    0x82,
-    0x8a,
-    0x27,
-    0xa7,
-    0xd1,
-    0x45,
-    0x41,
-    0xb4,
-    0xd1,
-    0x0e,
-    0xce,
-    0x96,
-    0xd7,
-    0x33,
-    0xf4,
-    0xa2,
-    0x75,
-    0x52,
-    0xea,
-    0x08,
-    0xaa,
-    0xbe,
-    0xc5,
-    0x58,
-    0x57,
-    0x24,
-    0x8f,
-    0x45,
-    0xf2,
-    0x6f,
-    0x9a,
-    0xa8,
-    0x7e,
-    0xe8,
-    0x13,
-    0xc8,
-    0xbb,
-    0xa2,
-    0xda,
-    0xd8,
-    0x9a,
-    0x15,
-    0x91,
-    0xc1,
-    0xf3,
-    0x09,
-    0xf4,
-    0x22,
-    0x7a,
-    0xb6,
-    0x68,
-    0x95,
-    0xf0,
-    0x29,
-    0xd6,
-    0x35,
-    0x96,
-    0xe9,
-    0xb9,
-    0x5d,
-    0xe7,
-    0xdb,
-    0x76,
-    0xb2,
-    0x86,
-    0x63,
-    0xed,
-    0x63,
-    0x76,
-    0xcc,
-    0x4d,
-    0xaf,
-    0x89,
-    0xea,
-    0x2c,
-    0xa8,
-    0x1b,
-    0xfd,
-    0xd7,
-    0x37,
-    0xff,
-    0xd9,
-    0xe6,
-    0x61,
-    0xba,
-    0x44,
-    0x14,
-    0xc8,
-    0xef,
-    0xa0,
-    0x4e,
-    0x75,
-    0x1b,
-    0xca,
-    0x0a,
-    0xd4,
-    0x83,
-    0x41,
-    0xda,
-    0x00,
-    0x6a,
-    0x8b,
-    0x41,
-    0x41,
-    0x86,
-    0xd4,
-    0xc5,
-    0xd4,
-    0xb5,
-    0xd9,
-    0x45,
-    0xea,
-    0xed,
-    0x04,
-    0x8d,
-    0xf2,
-    0x71,
-    0xd8,
-    0x28,
-    0x1b,
-    0x4b,
-    0x90,
-    0x75,
-    0x15,
-    0xf6,
-    0x03,
-    0xfe,
-    0x18,
-    0x5b,
-    0xcb,
-    0x04,
-    0x28,
-    0xff,
-    0xa6,
-    0x5f,
-    0x97,
-    0x7a,
-    0x1c,
-    0x85,
-    0xcb,
-    0x2b,
-    0x63,
-    0xe8,
-    0x42,
-    0x2a,
-    0x7f,
-    0x85,
-    0xd2,
-    0x7e,
-    0xad,
-    0xb9,
-    0x36,
-    0x90,
-    0x02,
-    0x57,
-    0xc6,
-    0xe0,
-    0x50,
-    0xf9,
-    0x86,
-    0xf7,
-    0x49,
-    0x93,
-    0x62,
-    0x9d,
-    0xe7,
-    0x4e,
-    0xb8,
-    0x4b,
-    0x0b,
-    0x93,
-    0x17,
-    0xe3,
-    0x64,
-    0x65,
-    0x47,
-    0x9f,
-    0x92,
-    0xf5,
-    0x89,
-    0x47,
-    0x8b,
-    0x70,
-    0x1f,
-    0xa8,
-    0x3e,
-    0x1c,
-    0x0f,
-    0x41,
-    0x77,
-    0xa3,
-    0x25,
-    0x3f,
-    0x03,
-    0xaf,
-    0x37,
-    0xac,
-    0x14,
-    0xb6,
-    0xac,
-    0xe3,
-    0xe7,
-    0x18,
-    0x3f,
-    0x47,
-    0xa3,
-    0x67,
-    0x01,
-    0x34,
-    0x85,
-    0x05,
-    0x9d,
-    0x36,
-    0x3a,
-    0xf5,
-    0xe0,
-    0x79,
-    0x8c,
-    0xeb,
-    0x79,
-    0x81,
-    0x41,
-    0xa5,
-    0xfd,
-    0x1b,
-    0x40,
-    0x7e,
-    0x2e,
-    0x94,
-    0xf6,
-    0x41,
-    0x7c,
-    0x28,
-    0xf8,
-    0x3b,
-    0xcc,
-    0xbd,
-    0xea,
-    0x94,
-    0x79,
-    0xd2,
-    0x9f,
-    0xdf,
-    0x98,
-    0xb2,
-    0x81,
-    0xef,
-    0x81,
-    0xed,
-    0x34,
-    0xec,
-    0x8b,
-    0x08,
-    0x76,
-    0xa7,
-    0x16,
-    0x74,
-    0x4a,
-    0x2b,
-    0xcf,
-    0xbd,
-    0x55,
-    0x95,
-    0x2f,
-    0x04,
-    0x88,
-    0x25,
-    0x45,
-    0xaf,
-    0xff,
-    0x94,
-    0xb6,
-    0x5f,
-    0x29,
-    0xa8,
-    0x02,
-    0x22,
-    0x2a,
-    0x07,
-    0x08,
-    0xeb,
-    0x7d,
-    0x49,
-    0xcd,
-    0x3f,
-    0xde,
-    0x50,
-    0x79,
-    0x30,
-    0x67,
-    0xdc,
-    0xa2,
-    0x8f,
-    0xf9,
-    0x5a,
-    0xcd,
-    0x5e,
-    0xdd,
-    0xfd,
-    0x32,
-    0x84,
-    0xab,
-    0x10,
-    0xc0,
-    0xc4,
-    0x6b,
-    0x8b,
-    0x61,
-    0xf0,
-    0xfb,
-    0xe4,
-    0x7f,
-    0x5a,
-    0xb1,
-    0x27,
-    0xc7,
-    0x8c,
-    0x40,
-    0x49,
-    0x2d,
-    0x39,
-    0xe0,
-    0xba,
-    0x30,
-    0x73,
-    0xa9,
-    0x39,
-    0x5f,
-    0x1d,
-    0x40,
-    0xec,
-    0x1c,
-    0xa4,
-    0xb6,
-    0xb0,
-    0xa0,
-    0xea,
-    0xad,
-    0xae,
-    0x3f,
-    0x83,
-    0xbd,
-    0x2f,
-    0xed,
-    0x24,
-    0x16,
-    0xb1,
-    0x02,
-    0x58,
-    0x66,
-    0x39,
-    0x3a,
-    0x75,
-    0xfd,
-    0xec,
-    0x00,
-    0xcf,
-    0x2f,
-    0xd9,
-    0xec,
-    0x2b,
-    0xf9,
-    0x1a,
-    0x8a,
-    0x77,
-    0xe8,
-    0x1b,
-    0x5d,
-    0xb8,
-    0x37,
-    0x39,
-    0x23,
-    0x43,
-    0x37,
-    0x8f,
-    0x5b,
-    0x30,
-    0xf4,
-    0x0c,
-    0x05,
-    0x0c,
-    0x16,
-    0xc9,
-    0xa9,
-    0xce,
-    0x05,
-    0x9a,
-    0x9a,
-    0x0c,
-    0x51,
-    0xe4,
-    0x7c,
-    0x6f,
-    0x50,
-    0xae,
-    0x04,
-    0x65,
-    0x09,
-    0xfa,
-    0xff,
-    0x15,
-    0x50,
-    0x55,
-    0x96,
-    0x98,
-    0x33,
-    0xad,
-    0xd0,
-    0x66,
-    0x95,
-    0x63,
-    0x58,
-    0x0e,
-    0x19,
-    0xa1,
-    0x81,
-    0x2b,
-    0x42,
-    0xee,
-    0x87,
-    0x93,
-    0xd8,
-    0xff,
-    0x18,
-    0xd1,
-    0x8d,
-    0xd0,
-    0x12,
-    0xd6,
-    0xe0,
-    0xf4,
-    0x8f,
-    0xeb,
-    0x42,
-    0x2a,
-    0x1f,
-    0xea,
-    0x77,
-    0x30,
-    0x54,
-    0xae,
-    0x40,
-    0xdc,
-    0x84,
-    0xc8,
-    0x37,
-    0x68,
-    0xca,
-    0x73,
-    0xfa,
-    0x0e,
-    0x4e,
-    0xcb,
-    0x8b,
-    0xd4,
-    0xc6,
-    0x39,
-    0xf7,
-    0xaa,
-    0x3d,
-    0x32,
-    0x36,
-    0xb2,
-    0x13,
-    0x21,
-    0x53,
-    0xdf,
-    0x46,
-    0xa1,
-    0xcd,
-    0xc1,
-    0xef,
-    0xf0,
-    0x3c,
-    0x9f,
-    0x10,
-    0xa0,
-    0x37,
-    0xc7,
-    0x8c,
-    0x90,
-    0x76,
-    0x22,
-    0x77,
-    0x1b,
-    0x34,
-    0x0b,
-    0x90,
-    0x8f,
-    0xd7,
-    0x61,
-    0x0c,
-    0xe1,
-    0xd3,
-    0xdb,
-    0x96,
-    0x9f,
-    0xcc,
-    0x9c,
-    0x93,
-    0x25,
-    0xfb,
-    0x08,
-    0xaa,
-    0x14,
-    0xd2,
-    0xd5,
-    0x84,
-    0x00,
-    0xe3,
-    0x65,
-    0xd0,
-    0x69,
-    0xfe,
-    0x53,
-    0x8b,
-    0xed,
-    0x99,
-    0x4c,
-    0x7e,
-    0xbb,
-    0x75,
-    0x20,
-    0x08,
-    0x4b,
-    0x7f,
-    0x18,
-    0x1d,
-    0x4d,
-    0xf5,
-    0x8b,
-    0x8f,
-    0xdf,
-    0xc9,
-    0xac,
-    0x8c,
-    0x02,
-    0x4a,
-    0xa6,
-    0x69,
-    0x4f,
-    0x01,
-    0xeb,
-    0x9d,
-    0xe6,
-    0xd9,
-    0xc8,
-    0x11,
-    0xa8,
-    0x84,
-    0x3e,
-    0x97,
-    0xa6,
-    0x19,
-    0x0d,
-    0xb7,
-    0xd8,
-    0x02,
-    0x11,
-    0xb2,
-    0x13,
-    0x15,
-    0xd1,
-    0xc1,
-    0x35,
-    0x01,
-    0x56,
-    0x9e,
-    0xa3,
-    0xec,
-    0x39,
-    0x45,
-    0xf5,
-    0x5a,
-    0x00,
-    0xfc,
-    0xef,
-    0x51,
-    0xab,
-    0x91,
-    0xb3,
-    0xbb,
-    0x89,
-    0xe3,
-    0x36,
-    0x0b,
-    0x50,
-    0xa3,
-    0xf1,
-    0x23,
-    0x6d,
-    0x5c,
-    0xd9,
-    0x75,
-    0x99,
-    0xb1,
-    0x90,
-    0x69,
-    0xad,
-    0xe7,
-    0xdd,
-    0xff,
-    0xb7,
-    0xa3,
-    0x5a,
-    0xb6,
-    0x4d,
-    0xf4,
-    0x6c,
-    0xac,
-    0x21,
-    0x93,
-    0x78,
-    0x06,
-    0xd6,
-    0x6a,
-    0x54,
-    0x92,
-    0x12,
-    0x54,
-    0xfc,
-    0xab,
-    0xd5,
-    0x24,
-    0x87,
-    0x5e,
-    0x09,
-    0xe8,
-    0x59,
-    0xcb,
-    0x5a,
-    0x6f,
-    0x99,
-    0xcd,
-    0x47,
-    0x08,
-    0xe6,
-    0xdd,
-    0x79,
-    0x8d,
-    0x45,
-    0x33,
-    0x54,
-    0xa0,
-    0x5e,
-    0x2f,
-    0xcd,
-    0x35,
-    0xe9,
-    0xf8,
-    0x7b,
-    0x51,
-    0x63,
-    0x63,
-    0xf0,
-    0x10,
-    0x05,
-    0x16,
-    0x49,
-    0xed,
-    0xf6,
-    0xed,
-    0x04,
-    0x3e,
-    0xc0,
-    0x9c,
-    0x12,
-    0xfe,
-    0x01,
-    0x96,
-    0x2d,
-    0xcf,
-    0x63,
-    0x2e,
-    0x6c,
-    0x3f,
-    0xcd,
-    0xfc,
-    0x15,
-    0x4b,
-    0xdb,
-    0x83,
-    0xb2,
-    0x22,
-    0x8c,
-    0x10,
-    0x67,
-    0x2b,
-    0x3b,
-    0xe5,
-    0x82,
-    0x48,
-    0xd1,
-    0x97,
-    0x54,
-    0x5d,
-    0x38,
-    0xb5,
-    0x40,
-    0x0c,
-    0x13,
-    0xaa,
-    0x11,
-    0xc3,
-    0xac,
-    0xe5,
-    0x90,
-    0xf9,
-    0x2d,
-    0x37,
-    0x57,
-    0xb4,
-    0x14,
-    0x7c,
-    0xe0,
-    0x4f,
-    0xe1,
-    0x7d,
-    0xe1,
-    0x7a,
-    0x11,
-    0x15,
-    0xdc,
-    0x82,
-    0x50,
-    0x93,
-    0xf1,
-    0xd3,
-    0xeb,
-    0x60,
-    0xf8,
-    0xbb,
-    0x84,
-    0xe2,
-    0xcc,
-    0x70,
-    0x09,
-    0x9f,
-    0xe9,
-    0x55,
-    0xe7,
-    0xa6,
-    0x3a,
-    0x79,
-    0x7a,
-    0x2b,
-    0x2c,
-    0x60,
-    0xc8,
-    0x71,
-    0x07,
-    0x07,
-    0x70,
-    0xed,
-    0x7e,
-    0x22,
-    0xdd,
-    0xa8,
-    0x85,
-    0xa8,
-    0xbf,
-    0xe5,
-    0x62,
-    0x91,
-    0xbc,
-    0x04,
-    0x07,
-    0xdf,
-    0x62,
-    0xa6,
-    0x9f,
-    0xdb,
-    0x61,
-    0x12,
-    0x67,
-    0xa1,
-    0xf7,
-    0xd7,
-    0xbf,
-    0xde,
-    0xab,
-    0xb3,
-    0x81,
-    0xd9,
-    0x3e,
-    0xb4,
-    0x91,
-    0xb0,
-    0xdf,
-    0x9d,
-    0xb5,
-    0xe4,
-    0x9e,
-    0x8b,
-    0xa7,
-    0x18,
-    0x23,
-    0xd8,
-    0x69,
-    0x16,
-    0xa0,
-    0x40,
-    0xd9,
-    0x13,
-    0x04,
-    0x42,
-    0x85,
-    0x34,
-    0x72,
-    0xc9,
-    0xc0,
-    0x51,
-    0xf1,
-    0x0c,
-    0xf6,
-    0xf8,
-    0x65,
-    0xb3,
-    0x3c,
-    0xb5,
-    0xbe,
-    0x3b,
-    0x2b,
-    0x90,
-    0x6f,
-    0x9b,
-    0xef,
-    0xd8,
-    0x21,
-    0x28,
-    0x9b,
-    0x1f,
-    0xa9,
-    0xb6,
-    0xbf,
-    0x86,
-    0x38,
-    0x00,
-    0x3d,
-    0x3b,
-    0xd2,
-    0x4a,
-    0x58,
-    0x3f,
-    0x02,
-    0x44,
-    0x0e,
-    0x6d,
-    0xcb,
-    0x32,
-    0xa8,
-    0xb8,
-    0xe1,
-    0x4a,
-    0x8f,
-    0xb4,
-    0x1a,
-    0x5d,
-    0x61,
-    0x58,
-    0x1f,
-    0xba,
-    0x44,
-    0x02,
-    0x67,
-    0x50,
-    0x7b,
-    0xbb,
-    0x66,
-    0x12,
-    0x37,
-    0xbc,
-    0x01,
-    0xa0,
-    0xaf,
-    0x32,
-    0x46,
-    0x23,
-    0x72,
-    0x3f,
-    0x5a,
-    0x78,
-    0xfc,
-    0x41,
-    0xb2,
-    0x92,
-    0x88,
-    0x56,
-    0x86,
-    0x19,
-    0x26,
-    0x20,
-    0x83,
-    0x57,
-    0x0d,
-    0xc5,
-    0xc1,
-    0x55,
-    0x32,
-    0x3a,
-    0xf4,
-    0x41,
-    0x1a,
-    0xc2,
-    0xe6,
-    0x13,
-    0xec,
-    0xb1,
-    0x25,
-    0x71,
-    0xca,
-    0x76,
-    0xf8,
-    0xcf,
-    0x61,
-    0xd8,
-    0x98,
-    0xda,
-    0xbf,
-    0x80,
-    0x9d,
-    0x17,
-    0x65,
-    0xb8,
-    0xb7,
-    0xc7,
-    0x9e,
-    0x72,
-    0x9e,
-    0x0f,
-    0x0f,
-    0x8c,
-    0x4c,
-    0x55,
-    0x8e,
-    0x52,
-    0x69,
-    0xed,
-    0x38,
-    0x45,
-    0x07,
-    0xf5,
-    0xbd,
-    0x1b,
-    0x8f,
-    0x7d,
-    0xff,
-    0x06,
-    0xfb,
-    0xec,
-    0xdc,
-    0x39,
-    0x46,
-    0x9e,
-    0x47,
-    0xa9,
-    0x21,
-    0xd2,
-    0x9e,
-    0x10,
-    0xe8,
-    0xc4,
-    0x37,
-    0x38,
-    0xd4,
-    0x16,
-    0x3d,
-    0x76,
-    0x72,
-    0x74,
-    0xba,
-    0x74,
-    0x54,
-    0x78,
-    0xf4,
-    0x34,
-    0x06,
-    0xcb,
-    0xfd,
-    0x52,
-    0x43,
-    0x8e,
-    0x86,
-    0x8a,
-    0x69,
-    0xf8,
-    0xf4,
-    0x79,
-    0x2b,
-    0x40,
-    0xb6,
-    0xa8,
-    0x86,
-    0xbd,
-    0xd5,
-    0xc6,
-    0xf6,
-    0x4c,
-    0xcc,
-    0x35,
-    0xe9,
-    0xf2,
-    0x9b,
-    0xc9,
-    0x74,
-    0xc2,
-    0x17,
-    0xcc,
-    0x45,
-    0x01,
-    0x84,
-    0x45,
-    0xd9,
-    0x89,
-    0x65,
-    0x79,
-    0xef,
-    0x6b,
-    0x93,
-    0xb3,
-    0x3c,
-    0xd8,
-    0x8d,
-    0x41,
-    0x60
-  ],
-  const [
-    0x78,
-    0x10,
-    0xae,
-    0xd4,
-    0xd4,
-    0x2c,
-    0x06,
-    0x06,
-    0xd0,
-    0xc1,
-    0xf7,
-    0x69,
-    0x43,
-    0xd0,
-    0xc6,
-    0x3f,
-    0x38,
-    0xd2,
-    0x61,
-    0xcd,
-    0xaa,
-    0x62,
-    0x44,
-    0xb5,
-    0x8c,
-    0x36,
-    0x99,
-    0x7f,
-    0x0d,
-    0x53,
-    0xa3,
-    0x79,
-    0x19,
-    0x81,
-    0x5c,
-    0xc1,
-    0x23,
-    0xfd,
-    0x5d,
-    0xa0,
-    0x22,
-    0x6f,
-    0xff,
-    0x19,
-    0xd9,
-    0x1b,
-    0xc0,
-    0xc2,
-    0x5c,
-    0x5b,
-    0xe8,
-    0xd3,
-    0xd0,
-    0x4d,
-    0x6c,
-    0x7d,
-    0x72,
-    0xc9,
-    0x12,
-    0x7d,
-    0xdb,
-    0x96,
-    0xd6,
-    0xf0,
-    0x82,
-    0xdd,
-    0x8c,
-    0x69,
-    0x82,
-    0xdd,
-    0xc8,
-    0x41,
-    0x9d,
-    0xe1,
-    0xfb,
-    0x2e,
-    0x81,
-    0x6f,
-    0xde,
-    0x17,
-    0x4b,
-    0xc3,
-    0x14,
-    0x27,
-    0x4a,
-    0x7c,
-    0x0b,
-    0x21,
-    0x05,
-    0x94,
-    0x23,
-    0xf3,
-    0x7f,
-    0x95,
-    0x12,
-    0x8d,
-    0xb9,
-    0x0a,
-    0x87,
-    0xf3,
-    0x79,
-    0x34,
-    0x0d,
-    0x91,
-    0x4a,
-    0xff,
-    0x32,
-    0xd0,
-    0xc4,
-    0x34,
-    0xe9,
-    0xe6,
-    0x0d,
-    0xf0,
-    0x2e,
-    0xf2,
-    0xa0,
-    0x55,
-    0xe8,
-    0x48,
-    0x4d,
-    0x7f,
-    0x13,
-    0x09,
-    0x81,
-    0xba,
-    0x1e,
-    0xf8,
-    0xc8,
-    0xf2,
-    0x92,
-    0x88,
-    0x90,
-    0x6b,
-    0xf5,
-    0x3a,
-    0x30,
-    0xb2,
-    0xee,
-    0x25,
-    0x29,
-    0xd3,
-    0xaa,
-    0xd6,
-    0xab,
-    0xcc,
-    0x7d,
-    0x5b,
-    0x5b,
-    0x42,
-    0xcd,
-    0x9b,
-    0x53,
-    0x73,
-    0x2c,
-    0xe9,
-    0x6a,
-    0x6c,
-    0xc4,
-    0xd8,
-    0xb6,
-    0x7b,
-    0xf8,
-    0x50,
-    0x50,
-    0xe8,
-    0x48,
-    0xe1,
-    0x57,
-    0xe0,
-    0x75,
-    0x58,
-    0x38,
-    0xb2,
-    0xe6,
-    0x90,
-    0x2c,
-    0x3e,
-    0x4b,
-    0x8b,
-    0x02,
-    0xa9,
-    0x80,
-    0xc1,
-    0x1e,
-    0x56,
-    0xb4,
-    0xb8,
-    0xc2,
-    0x12,
-    0xca,
-    0xd5,
-    0x8c,
-    0x8f,
-    0xff,
-    0x72,
-    0x40,
-    0x14,
-    0xce,
-    0x31,
-    0xc8,
-    0x72,
-    0x11,
-    0x8f,
-    0x79,
-    0x3a,
-    0x68,
-    0xbc,
-    0x98,
-    0x2d,
-    0xde,
-    0xaa,
-    0x1d,
-    0xf4,
-    0xca,
-    0x63,
-    0xb6,
-    0x12,
-    0xf4,
-    0xa1,
-    0x0f,
-    0x16,
-    0xf9,
-    0x98,
-    0x51,
-    0x15,
-    0xf1,
-    0x17,
-    0xe9,
-    0x57,
-    0x4e,
-    0xcf,
-    0x8a,
-    0x51,
-    0x07,
-    0xf2,
-    0x75,
-    0xd3,
-    0xf7,
-    0x01,
-    0xf8,
-    0x83,
-    0x80,
-    0xdf,
-    0x34,
-    0x8a,
-    0x73,
-    0x29,
-    0x24,
-    0x8d,
-    0x34,
-    0xca,
-    0xdb,
-    0xdf,
-    0x19,
-    0xc9,
-    0x0d,
-    0xf5,
-    0x14,
-    0x66,
-    0xd1,
-    0x1a,
-    0x92,
-    0x66,
-    0xa5,
-    0x63,
-    0xa2,
-    0xab,
-    0xb3,
-    0xe6,
-    0x5a,
-    0x07,
-    0x53,
-    0x27,
-    0x76,
-    0x52,
-    0xd0,
-    0xd3,
-    0x43,
-    0xba,
-    0x6f,
-    0xb1,
-    0xbc,
-    0x5b,
-    0xad,
-    0xd5,
-    0xf2,
-    0x10,
-    0xc9,
-    0x17,
-    0xb1,
-    0x88,
-    0x82,
-    0xc3,
-    0x60,
-    0x9c,
-    0x22,
-    0x92,
-    0x29,
-    0xdf,
-    0xbb,
-    0xd9,
-    0x5a,
-    0x77,
-    0xb1,
-    0x01,
-    0x0b,
-    0x2c,
-    0x78,
-    0x37,
-    0x02,
-    0xbf,
-    0x9f,
-    0x64,
-    0xd3,
-    0x7d,
-    0x0e,
-    0x60,
-    0x4b,
-    0x13,
-    0x8c,
-    0x63,
-    0x0f,
-    0xa4,
-    0x84,
-    0xbc,
-    0x81,
-    0x19,
-    0x08,
-    0xc5,
-    0xe3,
-    0xb9,
-    0x16,
-    0x16,
-    0xbf,
-    0xf9,
-    0x1a,
-    0xf9,
-    0x86,
-    0x95,
-    0xb5,
-    0x1e,
-    0x77,
-    0xdf,
-    0xbd,
-    0x90,
-    0xc2,
-    0x57,
-    0x85,
-    0xe8,
-    0xee,
-    0x7d,
-    0x5e,
-    0xc1,
-    0x78,
-    0xe3,
-    0x5d,
-    0x6b,
-    0xbd,
-    0x86,
-    0x5f,
-    0xe4,
-    0x19,
-    0x5e,
-    0x4b,
-    0x03,
-    0x51,
-    0x34,
-    0x97,
-    0xf7,
-    0x2e,
-    0xb4,
-    0x0e,
-    0xf0,
-    0x6b,
-    0xc3,
-    0xd0,
-    0x1c,
-    0xd2,
-    0x13,
-    0x9a,
-    0xd5,
-    0xa1,
-    0xf4,
-    0x47,
-    0x19,
-    0x32,
-    0x6d,
-    0x97,
-    0x3a,
-    0xdb,
-    0x8b,
-    0x30,
-    0xd6,
-    0x14,
-    0xf9,
-    0xe2,
-    0x0a,
-    0xd7,
-    0xd1,
-    0x2f,
-    0xe3,
-    0x4d,
-    0xb2,
-    0x0b,
-    0x15,
-    0xa6,
-    0x13,
-    0xe0,
-    0xf0,
-    0x48,
-    0xd6,
-    0xd5,
-    0x8f,
-    0x2d,
-    0x20,
-    0x50,
-    0x53,
-    0x86,
-    0x69,
-    0xb9,
-    0x90,
-    0xa5,
-    0xcf,
-    0x82,
-    0x85,
-    0x19,
-    0xb0,
-    0x64,
-    0x92,
-    0x1b,
-    0x77,
-    0xeb,
-    0xa5,
-    0x29,
-    0xb6,
-    0x34,
-    0xf6,
-    0xf0,
-    0x76,
-    0xf6,
-    0xf4,
-    0x6f,
-    0xcb,
-    0xbf,
-    0x7e,
-    0x5a,
-    0xab,
-    0x80,
-    0x57,
-    0xbc,
-    0xff,
-    0x4c,
-    0xd4,
-    0xe1,
-    0xfb,
-    0x5d,
-    0xd8,
-    0x73,
-    0xab,
-    0x58,
-    0x02,
-    0xe3,
-    0xcf,
-    0xd1,
-    0x25,
-    0x0a,
-    0xe9,
-    0x12,
-    0xf9,
-    0x11,
-    0x94,
-    0x18,
-    0x10,
-    0x8e,
-    0x17,
-    0xdf,
-    0x0b,
-    0xef,
-    0x3a,
-    0xe0,
-    0x0d,
-    0x1c,
-    0x59,
-    0xd7,
-    0x70,
-    0x58,
-    0xb6,
-    0xc9,
-    0xb7,
-    0x68,
-    0x13,
-    0x46,
-    0xc4,
-    0xf8,
-    0x81,
-    0xec,
-    0x4c,
-    0x3a,
-    0x73,
-    0x2c,
-    0x87,
-    0xd0,
-    0x16,
-    0x51,
-    0x2c,
-    0xec,
-    0xe5,
-    0xbd,
-    0x9c,
-    0xb6,
-    0x78,
-    0x76,
-    0x5d,
-    0xee,
-    0x9c,
-    0xe2,
-    0xcb,
-    0xd2,
-    0xa9,
-    0xcf,
-    0x0a,
-    0x42,
-    0x10,
-    0xb6,
-    0x3f,
-    0x22,
-    0x34,
-    0x41,
-    0x00,
-    0x00,
-    0x7b,
-    0x0a,
-    0x09,
-    0xf6,
-    0xa4,
-    0xa6,
-    0x30,
-    0xd2,
-    0x5b,
-    0xe2,
-    0x9b,
-    0x75,
-    0x0a,
-    0x4c,
-    0x30,
-    0x79,
-    0xf3,
-    0xf6,
-    0x4d,
-    0x17,
-    0x7c,
-    0x76,
-    0xb9,
-    0x47,
-    0xc9,
-    0x31,
-    0xdb,
-    0x28,
-    0x90,
-    0xda,
-    0x2a,
-    0xa3,
-    0x29,
-    0x35,
-    0xe5,
-    0x4b,
-    0xe5,
-    0x21,
-    0x04,
-    0x88,
-    0xa1,
-    0xd5,
-    0x6e,
-    0xf5,
-    0x9b,
-    0x6a,
-    0x6c,
-    0x06,
-    0x84,
-    0x9a,
-    0x5e,
-    0xee,
-    0xd6,
-    0xc7,
-    0xad,
-    0xc0,
-    0x67,
-    0x3e,
-    0x00,
-    0xd4,
-    0x3f,
-    0xbe,
-    0xb3,
-    0x6c,
-    0xa6,
-    0x34,
-    0x85,
-    0x97,
-    0x82,
-    0xc9,
-    0x90,
-    0x56,
-    0xe0,
-    0x1e,
-    0x7f,
-    0xfe,
-    0xd1,
-    0xd6,
-    0xfb,
-    0xdd,
-    0x77,
-    0x56,
-    0x66,
-    0x20,
-    0x5f,
-    0xc8,
-    0xcc,
-    0xf4,
-    0x11,
-    0x66,
-    0x16,
-    0xec,
-    0xe6,
-    0xf5,
-    0x81,
-    0xa3,
-    0x1a,
-    0x8f,
-    0x4f,
-    0xa2,
-    0x22,
-    0xa6,
-    0xbd,
-    0x84,
-    0x40,
-    0x46,
-    0x34,
-    0x58,
-    0x54,
-    0x9a,
-    0xc3,
-    0x46,
-    0xf5,
-    0xb2,
-    0xcd,
-    0x76,
-    0xc0,
-    0x83,
-    0xff,
-    0x2d,
-    0xf0,
-    0x30,
-    0x85,
-    0x39,
-    0x30,
-    0x88,
-    0x7e,
-    0x90,
-    0xad,
-    0xcf,
-    0xad,
-    0x34,
-    0x6e,
-    0xc1,
-    0x71,
-    0x59,
-    0xe8,
-    0xd4,
-    0xf7,
-    0xca,
-    0xcd,
-    0xbe,
-    0xae,
-    0x89,
-    0x26,
-    0x37,
-    0xfb,
-    0xb5,
-    0xa1,
-    0x00,
-    0x2f,
-    0xb1,
-    0x2c,
-    0x24,
-    0xb6,
-    0x83,
-    0xc2,
-    0x7e,
-    0x90,
-    0x7a,
-    0x85,
-    0x7b,
-    0x06,
-    0x14,
-    0x0e,
-    0x21,
-    0x95,
-    0x1e,
-    0x01,
-    0x50,
-    0x2f,
-    0x1d,
-    0xe4,
-    0x48,
-    0xa3,
-    0xed,
-    0x31,
-    0x6c,
-    0x59,
-    0xa8,
-    0xa9,
-    0x46,
-    0x42,
-    0xca,
-    0xec,
-    0xca,
-    0x0f,
-    0x92,
-    0x47,
-    0xdf,
-    0xa1,
-    0xab,
-    0xcd,
-    0x1b,
-    0xc1,
-    0x0b,
-    0xa9,
-    0xce,
-    0x12,
-    0x1c,
-    0xb2,
-    0x43,
-    0x43,
-    0x19,
-    0x40,
-    0x42,
-    0x89,
-    0xbb,
-    0x3e,
-    0xd9,
-    0x4d,
-    0x16,
-    0x81,
-    0x5d,
-    0x22,
-    0xbd,
-    0x58,
-    0xab,
-    0xf9,
-    0x2d,
-    0x65,
-    0xb3,
-    0x98,
-    0x69,
-    0xab,
-    0x38,
-    0x48,
-    0xe1,
-    0xe7,
-    0xd1,
-    0xce,
-    0x98,
-    0x24,
-    0x34,
-    0x9d,
-    0x86,
-    0x8a,
-    0xb3,
-    0x4a,
-    0x3c,
-    0x77,
-    0x07,
-    0x40,
-    0xc6,
-    0xd1,
-    0x4d,
-    0xb5,
-    0xd5,
-    0x9a,
-    0x4e,
-    0xdd,
-    0x1e,
-    0xc4,
-    0x03,
-    0x5d,
-    0xfd,
-    0x47,
-    0x59,
-    0x02,
-    0x5e,
-    0x72,
-    0x31,
-    0xb3,
-    0xdd,
-    0x7e,
-    0xab,
-    0xa4,
-    0x2c,
-    0x69,
-    0xa4,
-    0xcd,
-    0xb5,
-    0x02,
-    0x7d,
-    0x9b,
-    0x81,
-    0x40,
-    0x1e,
-    0xe5,
-    0x59,
-    0xd7,
-    0x3b,
-    0x21,
-    0x2b,
-    0x0d,
-    0xd6,
-    0xd8,
-    0xaf,
-    0xca,
-    0x06,
-    0x57,
-    0x49,
-    0xef,
-    0xf6,
-    0xa8,
-    0x32,
-    0xe9,
-    0x30,
-    0xc0,
-    0xd3,
-    0x86,
-    0x1c,
-    0xfa,
-    0x71,
-    0x07,
-    0xc3,
-    0xc4,
-    0x0f,
-    0x76,
-    0xd9,
-    0x98,
-    0x90,
-    0x3a,
-    0xfb,
-    0x2f,
-    0x1d,
-    0xe8,
-    0x35,
-    0xf1,
-    0xc6,
-    0x5c,
-    0xc7,
-    0xaf,
-    0x6c,
-    0x09,
-    0x29,
-    0x94,
-    0xde,
-    0x8d,
-    0x4c,
-    0x59,
-    0x42,
-    0x88,
-    0x23,
-    0xb9,
-    0xb7,
-    0xaf,
-    0x62,
-    0x25,
-    0x38,
-    0x1c,
-    0x86,
-    0xb8,
-    0xc3,
-    0xe8,
-    0x15,
-    0x6d,
-    0xbb,
-    0xfc,
-    0x27,
-    0x90,
-    0x8c,
-    0x24,
-    0x25,
-    0x72,
-    0x8d,
-    0x66,
-    0xd1,
-    0x61,
-    0x2a,
-    0x91,
-    0x86,
-    0xd7,
-    0x42,
-    0x18,
-    0xc1,
-    0xf2,
-    0xce,
-    0x21,
-    0xe1,
-    0x24,
-    0xc4,
-    0xda,
-    0x2b,
-    0x2c,
-    0x3b,
-    0x0c,
-    0x11,
-    0x45,
-    0xcf,
-    0xf2,
-    0xb4,
-    0x9d,
-    0x47,
-    0x4b,
-    0xa7,
-    0x08,
-    0x75,
-    0xae,
-    0xf6,
-    0xf6,
-    0x5e,
-    0x1e,
-    0x67,
-    0xa3,
-    0x9b,
-    0xde,
-    0xff,
-    0x8d,
-    0xff,
-    0x86,
-    0xc8,
-    0x2b,
-    0x7a,
-    0x57,
-    0xd2,
-    0xdc,
-    0x3d,
-    0xcc,
-    0x78,
-    0x1e,
-    0x1f,
-    0x71,
-    0xe4,
-    0x00,
-    0x40,
-    0xf8,
-    0xd6,
-    0xda,
-    0xec,
-    0x8a,
-    0xa0,
-    0x3b,
-    0xc2,
-    0x5b,
-    0x76,
-    0x23,
-    0x15,
-    0x81,
-    0xe4,
-    0x72,
-    0x92,
-    0x06,
-    0xa0,
-    0xa1,
-    0x23,
-    0x3c,
-    0x82,
-    0xb0,
-    0x14,
-    0x50,
-    0xd1,
-    0x5f,
-    0x75,
-    0x22,
-    0xc0,
-    0xa1,
-    0xbf,
-    0x54,
-    0x38,
-    0x4e,
-    0xba,
-    0xa2,
-    0xd8,
-    0x18,
-    0x9d,
-    0x71,
-    0x3b,
-    0xc0,
-    0x77,
-    0xaa,
-    0x79,
-    0x8a,
-    0xcf,
-    0xc8,
-    0xf0,
-    0xee,
-    0x87,
-    0x30,
-    0x44,
-    0x90,
-    0x07,
-    0xc1,
-    0xa4,
-    0x72,
-    0x97,
-    0xad,
-    0x4f,
-    0x68,
-    0x0b,
-    0x87,
-    0x57,
-    0xcd,
-    0xa6,
-    0x9d,
-    0xa5,
-    0x75,
-    0x39,
-    0x87,
-    0x3e,
-    0xe2,
-    0x8b,
-    0x00,
-    0xc5,
-    0xbb,
-    0xfd,
-    0xf5,
-    0x40,
-    0x79,
-    0x6e,
-    0xdc,
-    0x1f,
-    0x64,
-    0x5d,
-    0x47,
-    0x7a,
-    0xbe,
-    0x4d,
-    0xb9,
-    0x9a,
-    0x3e,
-    0x6e,
-    0xb8,
-    0xbb,
-    0xc0,
-    0x79,
-    0x23,
-    0x10,
-    0x3a,
-    0xdc,
-    0xc6,
-    0x08,
-    0xf2,
-    0x17,
-    0x2c,
-    0xd0,
-    0xee,
-    0x66,
-    0xb4,
-    0x19,
-    0xac,
-    0xa0,
-    0xe7,
-    0x1b,
-    0x14,
-    0x5f,
-    0x09,
-    0xd9,
-    0xab,
-    0x61,
-    0xee,
-    0xa7,
-    0x09,
-    0x2e,
-    0x10,
-    0xea,
-    0x8d,
-    0xfb,
-    0xde,
-    0x20,
-    0x4f,
-    0xcf,
-    0x56,
-    0x20,
-    0x56,
-    0xe4,
-    0xd5,
-    0xa2,
-    0x0c,
-    0x50,
-    0x2e,
-    0x01,
-    0xee,
-    0xe4,
-    0xfa,
-    0x40,
-    0x88,
-    0x55,
-    0x30,
-    0x4c,
-    0xa1,
-    0x99,
-    0xf6,
-    0x80,
-    0xb3,
-    0x94,
-    0xb6,
-    0x6e,
-    0x9e,
-    0xf4,
-    0x73,
-    0xdd,
-    0x9c,
-    0x5a,
-    0x5e,
-    0x0e,
-    0x78,
-    0xba,
-    0xa4,
-    0x44,
-    0xfb,
-    0x04,
-    0x8b,
-    0x82,
-    0xa8,
-    0x04,
-    0xbd,
-    0x97,
-    0xa9,
-    0x87,
-    0xe3,
-    0x58,
-    0x08,
-    0xbf,
-    0x76,
-    0x2d,
-    0x22,
-    0xe8,
-    0xd2,
-    0xcf,
-    0x59,
-    0x2c,
-    0x8d,
-    0x4f,
-    0x0a,
-    0xc4,
-    0x06,
-    0x5b,
-    0xbf,
-    0x61,
-    0x41,
-    0xbd,
-    0xa5,
-    0xca,
-    0xf2,
-    0x24,
-    0x40,
-    0xc6,
-    0xd7,
-    0x27,
-    0x5d,
-    0x3c,
-    0x4b,
-    0x87,
-    0x48,
-    0x99,
-    0x19,
-    0xb4,
-    0x40,
-    0x72,
-    0x8e,
-    0x93,
-    0x28,
-    0x6b,
-    0xd2,
-    0x7f,
-    0x7f,
-    0x57,
-    0x78,
-    0x8e,
-    0x92,
-    0xa0,
-    0x53,
-    0x15,
-    0xf0,
-    0xe9,
-    0x8b,
-    0x6e,
-    0x1f,
-    0xf3,
-    0xf1,
-    0xf8,
-    0x8d,
-    0xbd,
-    0x90,
-    0x60,
-    0xc9,
-    0xf0,
-    0x84,
-    0x1f,
-    0xf3,
-    0x79,
-    0x10,
-    0x44,
-    0x72,
-    0x78,
-    0xea,
-    0x74,
-    0xe4,
-    0x59,
-    0xd9,
-    0x2f,
-    0x5b,
-    0x40,
-    0x82,
-    0x54,
-    0xc6,
-    0xab,
-    0x7f,
-    0xe8,
-    0xad,
-    0x53,
-    0xb2,
-    0x13,
-    0x22,
-    0x53,
-    0xd9,
-    0x6b,
-    0xf4,
-    0x8b,
-    0x62,
-    0x76,
-    0x25,
-    0x47,
-    0x80,
-    0x69,
-    0x9e,
-    0x1c,
-    0x7e,
-    0x36,
-    0x22,
-    0x13,
-    0x54,
-    0xc6,
-    0x81,
-    0x0a,
-    0x78,
-    0x83,
-    0x0e,
-    0x56,
-    0xf6,
-    0x1a,
-    0x52,
-    0xad,
-    0xc3,
-    0x7f,
-    0x02,
-    0x44,
-    0x4e,
-    0x31,
-    0x2f,
-    0x34,
-    0x59,
-    0xbf,
-    0xbd,
-    0x22,
-    0x07,
-    0x8b,
-    0x16,
-    0x1f,
-    0x36,
-    0xce,
-    0x1f,
-    0xcd,
-    0x0e,
-    0xdc,
-    0x6c,
-    0xc3,
-    0xda,
-    0xaa,
-    0xb0,
-    0x33,
-    0x17,
-    0x8d,
-    0x77,
-    0xca,
-    0xcb,
-    0x44,
-    0x17,
-    0xd8,
-    0x19,
-    0x39,
-    0xe3,
-    0xb1,
-    0x11,
-    0x04,
-    0xa3,
-    0x53,
-    0xcd,
-    0x31,
-    0x41,
-    0x49,
-    0xb9,
-    0x43,
-    0xc5,
-    0xcf,
-    0x32,
-    0xf8,
-    0x83,
-    0x36,
-    0x53,
-    0xcf,
-    0x93,
-    0x8a,
-    0x0b,
-    0xc8,
-    0x82,
-    0x73,
-    0x73,
-    0x6b,
-    0x47,
-    0x59,
-    0x5f,
-    0x0b,
-    0x79,
-    0xcb,
-    0x34,
-    0x4c,
-    0xbf,
-    0x22,
-    0xf9,
-    0xe3,
-    0x87,
-    0x61,
-    0xb0,
-    0x9d,
-    0xfb,
-    0x60,
-    0xe6,
-    0xa3,
-    0x30,
-    0x2a,
-    0x89,
-    0xfc,
-    0xa1,
-    0xa3,
-    0xfa,
-    0x53,
-    0xdd,
-    0x6e,
-    0x63,
-    0xfb,
-    0x7c,
-    0x0d,
-    0x4b,
-    0x30,
-    0x57,
-    0x4a,
-    0x67,
-    0xa0,
-    0xf9,
-    0xd6,
-    0xb3,
-    0x2a,
-    0x50,
-    0x31,
-    0xc2,
-    0xe5,
-    0xa8,
-    0xc9,
-    0x52,
-    0x64,
-    0xdb,
-    0x66,
-    0x24,
-    0x38,
-    0xc1,
-    0xc5,
-    0x0b,
-    0xb7,
-    0xee,
-    0x83,
-    0x42,
-    0xfc,
-    0x9d,
-    0x3e,
-    0x02,
-    0x2f,
-    0xe7,
-    0xf6,
-    0x54,
-    0x07,
-    0x39,
-    0xb9,
-    0x25,
-    0x8c,
-    0x04,
-    0x7f,
-    0x98,
-    0x22,
-    0xb6,
-    0x53,
-    0xa0,
-    0xc3,
-    0xea,
-    0xb3,
-    0xcd,
-    0x8c,
-    0xdb,
-    0x3a,
-    0x66,
-    0x7b,
-    0x1f,
-    0x7c,
-    0xb9,
-    0x77,
-    0x92,
-    0x32,
-    0xaf,
-    0x90,
-    0x90,
-    0x97,
-    0xa3,
-    0x89,
-    0x67,
-    0x11,
-    0x74,
-    0x93,
-    0x0b,
-    0x14,
-    0xd9,
-    0x5c,
-    0x0c,
-    0x43,
-    0xf5,
-    0x48,
-    0xc6,
-    0xd9,
-    0x2c,
-    0xfe,
-    0xd8,
-    0x48,
-    0x34,
-    0x27,
-    0xd7,
-    0x20,
-    0x6f,
-    0x72,
-    0x43,
-    0x31,
-    0x78,
-    0xdc,
-    0xb9,
-    0xf4,
-    0xfc,
-    0x2e,
-    0x6b,
-    0x27,
-    0xcb,
-    0xc7,
-    0xce,
-    0xb8,
-    0x2e,
-    0x9b,
-    0x92,
-    0xe4,
-    0x7c,
-    0x7c,
-    0xd7,
-    0xa0,
-    0xe8,
-    0x99,
-    0x9e,
-    0x38,
-    0x9d,
-    0x44,
-    0x7d,
-    0x36,
-    0x0d,
-    0xf8,
-    0x98,
-    0x85,
-    0x85,
-    0x9a,
-    0xcc,
-    0xd6,
-    0x05,
-    0xff,
-    0x2d,
-    0x43,
-    0x50,
-    0xaf,
-    0xb3,
-    0x32,
-    0x3f,
-    0xe8,
-    0x30,
-    0x7d,
-    0x5a,
-    0xe6,
-    0x85,
-    0xd0,
-    0xa9,
-    0x62,
-    0x16,
-    0x52,
-    0xc8,
-    0x59,
-    0x7b,
-    0x87,
-    0x3a,
-    0x0e,
-    0x79,
-    0x75,
-    0xff,
-    0x52,
-    0x30,
-    0x05,
-    0x69,
-    0x03,
-    0x95,
-    0xad,
-    0x2b,
-    0xd3,
-    0x23,
-    0x4c,
-    0xb3,
-    0x4a,
-    0xce,
-    0x55,
-    0xba,
-    0x0f,
-    0x39,
-    0x30,
-    0x19,
-    0x63,
-    0x28,
-    0xdd,
-    0xde,
-    0xee,
-    0x38,
-    0xdb,
-    0x9f,
-    0xbe,
-    0xce,
-    0x48,
-    0x0e,
-    0x8d,
-    0x4d,
-    0x49,
-    0xce,
-    0x42,
-    0x8c,
-    0xac,
-    0x85,
-    0xbb,
-    0x87,
-    0xcc,
-    0x33,
-    0xca,
-    0x54,
-    0xb5,
-    0xc2,
-    0x7d,
-    0x59,
-    0x89,
-    0xde,
-    0xa3,
-    0xbd,
-    0x23,
-    0x06,
-    0x8b,
-    0x1c,
-    0xf9,
-    0xe3,
-    0x0f,
-    0x7f,
-    0x47,
-    0xd9,
-    0xd1,
-    0x8b,
-    0x6a,
-    0xdd,
-    0xc5,
-    0xf8,
-    0x89,
-    0x86,
-    0xf0,
-    0x45,
-    0x7b,
-    0x66,
-    0x6f,
-    0xaa,
-    0xe5,
-    0x9a,
-    0xba,
-    0x4f,
-    0xa3,
-    0xa0,
-    0x2a,
-    0xbb,
-    0x6a,
-    0x69,
-    0xb9,
-    0x8f,
-    0xab,
-    0xaf,
-    0x0a,
-    0x74,
-    0xba,
-    0x89,
-    0xa9,
-    0x52,
-    0x2f,
-    0x3d,
-    0x93,
-    0xc3,
-    0x8d,
-    0x55,
-    0xf9,
-    0xc7,
-    0x21,
-    0xf5,
-    0x41,
-    0xb9,
-    0x2d,
-    0x6b,
-    0x4e,
-    0x81,
-    0x46,
-    0x08,
-    0x01,
-    0x0c,
-    0xfb,
-    0x2e,
-    0xff,
-    0xf9,
-    0xb7,
-    0xab,
-    0xb5,
-    0x95,
-    0xe9,
-    0x45,
-    0x9a,
-    0x0a,
-    0x61,
-    0x96,
-    0xb4,
-    0xd3,
-    0xfd,
-    0x1b,
-    0x5e,
-    0x73,
-    0x86,
-    0x87,
-    0x48,
-    0x67,
-    0xd5,
-    0x5d,
-    0xbf,
-    0x59,
-    0x3a,
-    0xbd,
-    0x2f,
-    0x96,
-    0x1e,
-    0x7e,
-    0xe6,
-    0xc2,
-    0xe6,
-    0x7e,
-    0x1a,
-    0xcb,
-    0x1b,
-    0x36,
-    0x2e,
-    0x1b,
-    0xc8,
-    0x92,
-    0x31,
-    0x12,
-    0x24,
-    0xff,
-    0xa8,
-    0xb3,
-    0x71,
-    0xc5,
-    0x8d,
-    0x9d,
-    0x24,
-    0x97,
-    0x97,
-    0x3d,
-    0x46,
-    0x68,
-    0xbc,
-    0x43,
-    0x1a,
-    0x81,
-    0xf5,
-    0x52,
-    0x00,
-    0xd1,
-    0x41,
-    0xfc,
-    0x99,
-    0x84,
-    0xec,
-    0xed,
-    0x2c,
-    0xd7,
-    0x11,
-    0x66,
-    0x49,
-    0x2a,
-    0x5e,
-    0xee,
-    0xac,
-    0x56,
-    0x17,
-    0x44,
-    0x63,
-    0x42,
-    0x5d,
-    0x97,
-    0x34,
-    0xb1,
-    0xb1,
-    0xf9,
-    0x39,
-    0x5e,
-    0xb4,
-    0x12,
-    0xcd,
-    0x4b,
-    0x30,
-    0x11,
-    0xac,
-    0x56,
-    0x5c,
-    0xe8,
-    0x55,
-    0x0d,
-    0x5c,
-    0xb9,
-    0xb3
-  ],
-  const [
-    0x6b,
-    0x50,
-    0xd7,
-    0x0e,
-    0xb3,
-    0xd9,
-    0x58,
-    0x73,
-    0x0f,
-    0x65,
-    0x0f,
-    0x7f,
-    0x99,
-    0xf9,
-    0xfb,
-    0x04,
-    0x6d,
-    0x94,
-    0x2f,
-    0x98,
-    0x5a,
-    0x11,
-    0x29,
-    0x97,
-    0xdd,
-    0x4e,
-    0x60,
-    0x67,
-    0x4f,
-    0x8e,
-    0x1c,
-    0x00,
-    0x5d,
-    0x1c,
-    0x8a,
-    0xab,
-    0xb9,
-    0x32,
-    0x10,
-    0x09,
-    0x0f,
-    0x18,
-    0xde,
-    0x58,
-    0x3b,
-    0x90,
-    0xc6,
-    0xf2,
-    0xb9,
-    0x72,
-    0x4d,
-    0x16,
-    0x5c,
-    0x94,
-    0x02,
-    0xeb,
-    0x43,
-    0xec,
-    0x0e,
-    0xc2,
-    0x0a,
-    0xf9,
-    0x0d,
-    0x9c,
-    0x3d,
-    0x5e,
-    0x1c,
-    0xec,
-    0x12,
-    0xd1,
-    0x33,
-    0x9e,
-    0x57,
-    0x33,
-    0xb6,
-    0x57,
-    0xa9,
-    0x00,
-    0x46,
-    0xff,
-    0xe7,
-    0xea,
-    0xdd,
-    0x7d,
-    0xe6,
-    0xc1,
-    0x1a,
-    0xc1,
-    0x66,
-    0x96,
-    0xd9,
-    0x08,
-    0x45,
-    0x20,
-    0x07,
-    0x5b,
-    0xf3,
-    0x5f,
-    0xb5,
-    0x59,
-    0x26,
-    0x7e,
-    0x6a,
-    0x37,
-    0xcf,
-    0xfe,
-    0xbe,
-    0x05,
-    0x4c,
-    0x11,
-    0x24,
-    0x33,
-    0xdf,
-    0x44,
-    0x08,
-    0x53,
-    0x5f,
-    0x61,
-    0x1a,
-    0x20,
-    0x2d,
-    0x94,
-    0xe9,
-    0xc0,
-    0x6a,
-    0xcc,
-    0xb3,
-    0x46,
-    0x67,
-    0x64,
-    0x7b,
-    0x7b,
-    0x5d,
-    0x03,
-    0x5d,
-    0xde,
-    0x5f,
-    0xc1,
-    0x1f,
-    0xe9,
-    0x8c,
-    0x8b,
-    0x08,
-    0x96,
-    0x89,
-    0xc8,
-    0xf5,
-    0x22,
-    0x2f,
-    0x3c,
-    0xa9,
-    0x11,
-    0x80,
-    0x2d,
-    0x65,
-    0x72,
-    0xe0,
-    0xc5,
-    0xb8,
-    0x64,
-    0x82,
-    0xb8,
-    0x99,
-    0xd9,
-    0x20,
-    0x27,
-    0xb3,
-    0x9a,
-    0xef,
-    0xc3,
-    0x00,
-    0x8c,
-    0xd2,
-    0x35,
-    0x99,
-    0x31,
-    0xcd,
-    0xbe,
-    0xcd,
-    0x71,
-    0xbd,
-    0x1a,
-    0x70,
-    0x9b,
-    0x47,
-    0xab,
-    0x75,
-    0xa7,
-    0x0f,
-    0xd3,
-    0xc0,
-    0xbe,
-    0x2a,
-    0xa2,
-    0x35,
-    0xfc,
-    0xd5,
-    0xb1,
-    0x15,
-    0x74,
-    0x67,
-    0x4d,
-    0x8a,
-    0x74,
-    0x84,
-    0xd8,
-    0x80,
-    0x0b,
-    0x94,
-    0x6d,
-    0xb7,
-    0xc9,
-    0x73,
-    0xc3,
-    0x16,
-    0xc6,
-    0x6a,
-    0x54,
-    0x43,
-    0xe5,
-    0x5f,
-    0xbe,
-    0x70,
-    0x5a,
-    0x48,
-    0x69,
-    0x78,
-    0x6a,
-    0xe6,
-    0x6a,
-    0x2a,
-    0x72,
-    0xaf,
-    0xa7,
-    0xe4,
-    0x2b,
-    0x0c,
-    0x3c,
-    0x65,
-    0x2c,
-    0xc4,
-    0x1e,
-    0xdc,
-    0xb1,
-    0xb8,
-    0xfe,
-    0x44,
-    0x9a,
-    0xd2,
-    0x71,
-    0xf4,
-    0xb7,
-    0x38,
-    0x4d,
-    0x72,
-    0x42,
-    0xc5,
-    0x56,
-    0x89,
-    0xad,
-    0xb9,
-    0x1a,
-    0x9b,
-    0x9f,
-    0xaf,
-    0x19,
-    0x38,
-    0x39,
-    0xd0,
-    0x29,
-    0xee,
-    0x9d,
-    0x47,
-    0x19,
-    0x63,
-    0xb1,
-    0xf4,
-    0x95,
-    0xa2,
-    0x20,
-    0x65,
-    0x49,
-    0xb3,
-    0xa2,
-    0x02,
-    0x4a,
-    0x6e,
-    0x7e,
-    0x87,
-    0xb1,
-    0x90,
-    0x4d,
-    0xb8,
-    0x89,
-    0x0f,
-    0x00,
-    0x50,
-    0xeb,
-    0xab,
-    0x24,
-    0x3a,
-    0x67,
-    0xc6,
-    0x65,
-    0x03,
-    0xa6,
-    0x75,
-    0x51,
-    0x90,
-    0x4e,
-    0xd7,
-    0x5f,
-    0x0c,
-    0x26,
-    0xa6,
-    0x30,
-    0x25,
-    0x7b,
-    0x0b,
-    0x14,
-    0x78,
-    0xc2,
-    0xb7,
-    0xd0,
-    0x49,
-    0x7e,
-    0x2f,
-    0x9f,
-    0x78,
-    0x64,
-    0x67,
-    0x76,
-    0xb0,
-    0xbd,
-    0x93,
-    0x8c,
-    0xe2,
-    0x0d,
-    0x3a,
-    0x1a,
-    0xf2,
-    0xf2,
-    0x8c,
-    0x5f,
-    0xb0,
-    0x4e,
-    0xf5,
-    0xe8,
-    0x09,
-    0xa8,
-    0xf2,
-    0x0e,
-    0x7f,
-    0xd0,
-    0x24,
-    0xc0,
-    0xd6,
-    0xc2,
-    0xa3,
-    0x83,
-    0x10,
-    0xcd,
-    0x94,
-    0xb6,
-    0x9c,
-    0xf5,
-    0xfe,
-    0x1b,
-    0xcb,
-    0x95,
-    0xd9,
-    0x93,
-    0x83,
-    0x49,
-    0x68,
-    0x29,
-    0x37,
-    0x0a,
-    0xc9,
-    0x52,
-    0x16,
-    0x9b,
-    0xcb,
-    0x73,
-    0x83,
-    0x25,
-    0xff,
-    0xa4,
-    0xc6,
-    0x1e,
-    0x12,
-    0xb4,
-    0x01,
-    0x6e,
-    0x59,
-    0x6d,
-    0x65,
-    0xd5,
-    0xae,
-    0x19,
-    0xa5,
-    0x87,
-    0x7b,
-    0x45,
-    0xab,
-    0x1a,
-    0x14,
-    0xc4,
-    0x8b,
-    0xa2,
-    0x4a,
-    0xf7,
-    0xb5,
-    0x1b,
-    0x3d,
-    0x4c,
-    0x6e,
-    0x07,
-    0x71,
-    0x05,
-    0x81,
-    0x57,
-    0x24,
-    0x3b,
-    0x31,
-    0x8f,
-    0xdf,
-    0x22,
-    0x73,
-    0x26,
-    0x4c,
-    0x8e,
-    0x5a,
-    0x2b,
-    0x47,
-    0xb6,
-    0xd3,
-    0x2f,
-    0x37,
-    0x38,
-    0x92,
-    0x5e,
-    0x9f,
-    0x5e,
-    0x4c,
-    0xef,
-    0xf0,
-    0xa0,
-    0x27,
-    0xbf,
-    0xa2,
-    0x6a,
-    0x6f,
-    0x38,
-    0x82,
-    0x1f,
-    0x8a,
-    0x78,
-    0x4e,
-    0x5d,
-    0x2e,
-    0xaf,
-    0x7f,
-    0x83,
-    0xd1,
-    0xc9,
-    0x66,
-    0x70,
-    0x61,
-    0x4e,
-    0x7a,
-    0x8e,
-    0x36,
-    0x86,
-    0xf1,
-    0x10,
-    0x45,
-    0xe0,
-    0x8d,
-    0x77,
-    0x96,
-    0x94,
-    0xb9,
-    0x5b,
-    0xf8,
-    0x88,
-    0xd4,
-    0x68,
-    0xf3,
-    0x71,
-    0xcd,
-    0xa7,
-    0xfe,
-    0x3a,
-    0xf0,
-    0xfe,
-    0xf2,
-    0xa9,
-    0xff,
-    0xfb,
-    0xbf,
-    0x40,
-    0x85,
-    0xcd,
-    0x5d,
-    0x61,
-    0x67,
-    0x93,
-    0x06,
-    0xb6,
-    0xbc,
-    0xda,
-    0xa3,
-    0xd0,
-    0xde,
-    0x60,
-    0x84,
-    0x0e,
-    0xc1,
-    0x1e,
-    0x53,
-    0xc1,
-    0x84,
-    0x86,
-    0x4b,
-    0x8d,
-    0x46,
-    0x0a,
-    0xa5,
-    0x13,
-    0x3b,
-    0xdd,
-    0x53,
-    0xcc,
-    0xff,
-    0xfd,
-    0xf1,
-    0x38,
-    0x2a,
-    0x71,
-    0xf9,
-    0x39,
-    0x24,
-    0xcf,
-    0x36,
-    0xb9,
-    0x3b,
-    0x02,
-    0x7b,
-    0x93,
-    0xf2,
-    0x4a,
-    0x94,
-    0xb1,
-    0x9c,
-    0x84,
-    0x7d,
-    0x72,
-    0x2a,
-    0xac,
-    0xd2,
-    0x4e,
-    0x42,
-    0xa0,
-    0x87,
-    0xbc,
-    0x91,
-    0x27,
-    0xd9,
-    0x53,
-    0x61,
-    0x31,
-    0x84,
-    0x30,
-    0x6e,
-    0x61,
-    0x37,
-    0x99,
-    0xf5,
-    0xc8,
-    0x45,
-    0xdf,
-    0x0f,
-    0xf4,
-    0x9d,
-    0x89,
-    0x3d,
-    0x29,
-    0xfc,
-    0xae,
-    0x44,
-    0xee,
-    0x61,
-    0xa3,
-    0x3b,
-    0xcb,
-    0xc2,
-    0xd7,
-    0xe2,
-    0x52,
-    0xfd,
-    0xfa,
-    0x35,
-    0x5c,
-    0x11,
-    0x65,
-    0x41,
-    0x95,
-    0x8e,
-    0xb6,
-    0x37,
-    0x3b,
-    0x4a,
-    0xba,
-    0xbf,
-    0x22,
-    0x56,
-    0x91,
-    0x8e,
-    0xfc,
-    0x30,
-    0x0c,
-    0x3b,
-    0xd7,
-    0x3a,
-    0x5a,
-    0x4e,
-    0xe7,
-    0x6b,
-    0xe4,
-    0x9b,
-    0x86,
-    0x45,
-    0x75,
-    0xce,
-    0x79,
-    0x07,
-    0x9e,
-    0x46,
-    0x75,
-    0x23,
-    0x59,
-    0x27,
-    0xe1,
-    0xf2,
-    0xec,
-    0xaa,
-    0xde,
-    0xa7,
-    0x10,
-    0xb8,
-    0x85,
-    0x82,
-    0x53,
-    0xb8,
-    0x6f,
-    0x46,
-    0xbb,
-    0xa5,
-    0x7b,
-    0xec,
-    0xac,
-    0x63,
-    0xcb,
-    0x99,
-    0x0b,
-    0x53,
-    0x10,
-    0xce,
-    0xa4,
-    0x25,
-    0x08,
-    0xde,
-    0xc9,
-    0xed,
-    0x45,
-    0xa6,
-    0x3c,
-    0x79,
-    0x2f,
-    0x78,
-    0x50,
-    0xe2,
-    0x4c,
-    0x58,
-    0x4a,
-    0x62,
-    0xbf,
-    0x6b,
-    0x0d,
-    0x65,
-    0x0f,
-    0xac,
-    0xf7,
-    0xe3,
-    0x2a,
-    0xe1,
-    0x06,
-    0xec,
-    0xaa,
-    0xce,
-    0x3f,
-    0x85,
-    0x56,
-    0xa8,
-    0x50,
-    0xb2,
-    0xec,
-    0xcc,
-    0x74,
-    0xd4,
-    0x1e,
-    0xb1,
-    0x97,
-    0x35,
-    0xda,
-    0x1b,
-    0xbb,
-    0xe2,
-    0xce,
-    0x92,
-    0x9a,
-    0xb9,
-    0x2c,
-    0x13,
-    0x8c,
-    0xc2,
-    0xaa,
-    0x05,
-    0xac,
-    0xc3,
-    0xce,
-    0x6e,
-    0x36,
-    0x0e,
-    0x68,
-    0x67,
-    0x34,
-    0x9e,
-    0x60,
-    0xce,
-    0x5a,
-    0x62,
-    0xb1,
-    0x3a,
-    0x2e,
-    0xd9,
-    0xb6,
-    0x34,
-    0x6c,
-    0xdf,
-    0xa5,
-    0xa4,
-    0xa8,
-    0xc7,
-    0x59,
-    0x89,
-    0x35,
-    0xa9,
-    0x54,
-    0xed,
-    0x46,
-    0xfd,
-    0x04,
-    0x19,
-    0x53,
-    0x69,
-    0x45,
-    0x05,
-    0xbe,
-    0xd8,
-    0x28,
-    0x12,
-    0xb7,
-    0xcc,
-    0xf2,
-    0xfb,
-    0x5d,
-    0xf5,
-    0x68,
-    0x09,
-    0x25,
-    0x02,
-    0x4a,
-    0x87,
-    0x80,
-    0xb7,
-    0x1e,
-    0x76,
-    0xb8,
-    0x40,
-    0x2e,
-    0x82,
-    0x1b,
-    0xc5,
-    0xd4,
-    0x34,
-    0x5c,
-    0x3e,
-    0xf5,
-    0x68,
-    0x36,
-    0x89,
-    0xcc,
-    0x02,
-    0x52,
-    0xb9,
-    0xe9,
-    0xdd,
-    0x6b,
-    0xb2,
-    0x79,
-    0x04,
-    0xb0,
-    0xf3,
-    0xc7,
-    0x25,
-    0x6a,
-    0xb2,
-    0x03,
-    0x42,
-    0xde,
-    0x2e,
-    0x43,
-    0xaa,
-    0x75,
-    0x41,
-    0xc7,
-    0x28,
-    0x1a,
-    0x34,
-    0x81,
-    0x7a,
-    0xe4,
-    0xd8,
-    0xd4,
-    0x04,
-    0xf5,
-    0xd2,
-    0x9d,
-    0xc6,
-    0xa2,
-    0x37,
-    0x70,
-    0x8c,
-    0xd4,
-    0x59,
-    0x24,
-    0x64,
-    0xad,
-    0xe0,
-    0x91,
-    0x55,
-    0x6f,
-    0x1c,
-    0x98,
-    0x4e,
-    0x9a,
-    0x99,
-    0x64,
-    0x5d,
-    0x55,
-    0xf4,
-    0xf0,
-    0x21,
-    0x0f,
-    0xee,
-    0xc9,
-    0x82,
-    0x66,
-    0xbf,
-    0x16,
-    0x9f,
-    0x48,
-    0xad,
-    0xd5,
-    0x08,
-    0x58,
-    0xdc,
-    0x67,
-    0x2e,
-    0x93,
-    0x68,
-    0x4f,
-    0x18,
-    0x33,
-    0xb1,
-    0x37,
-    0x57,
-    0xd3,
-    0xf6,
-    0x33,
-    0x3b,
-    0xd5,
-    0x26,
-    0x4a,
-    0x47,
-    0x01,
-    0xf2,
-    0x33,
-    0xe3,
-    0x6e,
-    0x27,
-    0x5c,
-    0x51,
-    0xa6,
-    0x3b,
-    0x31,
-    0xe2,
-    0x05,
-    0x25,
-    0x9a,
-    0x6a,
-    0x62,
-    0x72,
-    0xc5,
-    0xf1,
-    0xf2,
-    0x96,
-    0x27,
-    0xab,
-    0x68,
-    0x80,
-    0xbd,
-    0x2b,
-    0x61,
-    0x71,
-    0x98,
-    0xd3,
-    0x00,
-    0x0d,
-    0x98,
-    0x8f,
-    0xd5,
-    0xb3,
-    0x78,
-    0xc3,
-    0x04,
-    0x0a,
-    0x0a,
-    0x81,
-    0xa3,
-    0xdc,
-    0xc4,
-    0x00,
-    0x63,
-    0x28,
-    0x7c,
-    0x49,
-    0x73,
-    0x72,
-    0x70,
-    0x34,
-    0xa1,
-    0x5e,
-    0x89,
-    0x93,
-    0xc3,
-    0x7d,
-    0xe1,
-    0xad,
-    0x55,
-    0x67,
-    0x82,
-    0xee,
-    0x63,
-    0x0a,
-    0x71,
-    0xdc,
-    0xaa,
-    0x41,
-    0xeb,
-    0x4d,
-    0xfa,
-    0xa9,
-    0xee,
-    0xd7,
-    0xde,
-    0xb0,
-    0xfb,
-    0x89,
-    0x7f,
-    0xee,
-    0x1b,
-    0xd8,
-    0xc6,
-    0xb9,
-    0x20,
-    0xdc,
-    0xc1,
-    0xf3,
-    0x2d,
-    0xbd,
-    0x48,
-    0x27,
-    0x78,
-    0x68,
-    0xe0,
-    0xd4,
-    0x4f,
-    0x86,
-    0xdf,
-    0x09,
-    0x59,
-    0xae,
-    0xd1,
-    0x32,
-    0x1f,
-    0xd9,
-    0x1b,
-    0x32,
-    0xca,
-    0x17,
-    0xde,
-    0xb2,
-    0x2e,
-    0x81,
-    0x1e,
-    0xb8,
-    0x08,
-    0x6f,
-    0x24,
-    0x7b,
-    0x84,
-    0xeb,
-    0x20,
-    0x76,
-    0x03,
-    0x65,
-    0x13,
-    0xbb,
-    0x1a,
-    0xa8,
-    0xec,
-    0x8a,
-    0xde,
-    0x0c,
-    0xf1,
-    0x22,
-    0x5f,
-    0xed,
-    0x61,
-    0xd7,
-    0x72,
-    0x5d,
-    0x58,
-    0x65,
-    0xb4,
-    0x16,
-    0xf2,
-    0x84,
-    0xcb,
-    0xb2,
-    0xb3,
-    0xbc,
-    0xef,
-    0x1f,
-    0x27,
-    0x7b,
-    0xaa,
-    0x4d,
-    0xc5,
-    0x65,
-    0xdb,
-    0x29,
-    0x19,
-    0xeb,
-    0x01,
-    0xcf,
-    0x23,
-    0x1f,
-    0xb6,
-    0xfb,
-    0xfa,
-    0xc6,
-    0x7a,
-    0xc1,
-    0xb4,
-    0xaf,
-    0xb2,
-    0x7f,
-    0x8a,
-    0x44,
-    0xf0,
-    0x0f,
-    0x38,
-    0x5f,
-    0x75,
-    0x41,
-    0xa3,
-    0x5f,
-    0xf5,
-    0x88,
-    0xbe,
-    0x7a,
-    0x9a,
-    0xf3,
-    0xae,
-    0x55,
-    0x4b,
-    0x5f,
-    0x2d,
-    0xd1,
-    0x2d,
-    0xec,
-    0x2c,
-    0x28,
-    0x6a,
-    0xad,
-    0xbc,
-    0x3a,
-    0x32,
-    0xa4,
-    0x2e,
-    0x21,
-    0x00,
-    0xed,
-    0x79,
-    0x0b,
-    0x1f,
-    0x39,
-    0xdd,
-    0x49,
-    0x6c,
-    0x7e,
-    0xc6,
-    0xa3,
-    0x5d,
-    0xed,
-    0xf3,
-    0xef,
-    0x42,
-    0x25,
-    0xd7,
-    0xe2,
-    0xcb,
-    0xa6,
-    0x40,
-    0x25,
-    0xcb,
-    0x88,
-    0x36,
-    0xab,
-    0x3b,
-    0x6d,
-    0x26,
-    0x43,
-    0x82,
-    0xb4,
-    0x40,
-    0x69,
-    0xf4,
-    0xef,
-    0x1d,
-    0x62,
-    0x98,
-    0x97,
-    0xa5,
-    0x88,
-    0x2e,
-    0xff,
-    0x30,
-    0xe2,
-    0x70,
-    0x87,
-    0xeb,
-    0xf7,
-    0x99,
-    0x12,
-    0x7e,
-    0xe4,
-    0x24,
-    0xba,
-    0xeb,
-    0xad,
-    0xd6,
-    0xc2,
-    0xb9,
-    0xd1,
-    0xfe,
-    0xcb,
-    0x53,
-    0x21,
-    0xfc,
-    0x4b,
-    0xab,
-    0xd1,
-    0x00,
-    0x3c,
-    0x22,
-    0xd0,
-    0x14,
-    0x11,
-    0xac,
-    0x55,
-    0x5d,
-    0xee,
-    0x2f,
-    0xbb,
-    0x9d,
-    0x18,
-    0x2d,
-    0x8e,
-    0xfd,
-    0xab,
-    0xa3,
-    0xe6,
-    0x0a,
-    0x8b,
-    0x31,
-    0xf3,
-    0xfd,
-    0x9c,
-    0x7a,
-    0xda,
-    0x3f,
-    0x36,
-    0xce,
-    0xbf,
-    0x2c,
-    0xd3,
-    0x07,
-    0x23,
-    0x18,
-    0x0b,
-    0xb0,
-    0x71,
-    0x8f,
-    0xc3,
-    0x6d,
-    0xd3,
-    0xe1,
-    0xa1,
-    0x96,
-    0x4a,
-    0xde,
-    0xc3,
-    0x26,
-    0xfe,
-    0xdf,
-    0xb0,
-    0xd4,
-    0xd3,
-    0x06,
-    0x8e,
-    0x7f,
-    0x3c,
-    0xc6,
-    0x96,
-    0xcf,
-    0x54,
-    0xa5,
-    0xc6,
-    0x1a,
-    0x2b,
-    0x40,
-    0xd5,
-    0x84,
-    0x5d,
-    0x90,
-    0x6c,
-    0x6b,
-    0xea,
-    0x6d,
-    0x93,
-    0x02,
-    0x41,
-    0x50,
-    0x6a,
-    0x3b,
-    0x9e,
-    0x5d,
-    0x19,
-    0xeb,
-    0x96,
-    0xa1,
-    0x09,
-    0x29,
-    0xf1,
-    0x98,
-    0x55,
-    0xf6,
-    0xb7,
-    0xf2,
-    0x7b,
-    0x24,
-    0x8d,
-    0x96,
-    0x58,
-    0x70,
-    0x42,
-    0xe8,
-    0x53,
-    0xf2,
-    0xa6,
-    0x47,
-    0xd8,
-    0xb7,
-    0x9b,
-    0xda,
-    0x08,
-    0xac,
-    0x6e,
-    0x8d,
-    0xae,
-    0xbd,
-    0x67,
-    0x56,
-    0x75,
-    0x3f,
-    0x9e,
-    0xbd,
-    0x59,
-    0x8b,
-    0x11,
-    0x9b,
-    0x5c,
-    0xec,
-    0xf4,
-    0x22,
-    0x7a,
-    0xbc,
-    0x48,
-    0x1d,
-    0xde,
-    0xc9,
-    0xaf,
-    0x79,
-    0x56,
-    0xfe,
-    0x7f,
-    0x05,
-    0x05,
-    0x3f,
-    0x15,
-    0x76,
-    0x58,
-    0x94,
-    0x6c,
-    0xae,
-    0x3b,
-    0x8a,
-    0xee,
-    0x3e,
-    0x8c,
-    0xd6,
-    0x89,
-    0x29,
-    0xcf,
-    0x3c,
-    0x06,
-    0xeb,
-    0x24,
-    0xaf,
-    0x96,
-    0xb9,
-    0x77,
-    0xba,
-    0xae,
-    0x0b,
-    0xf7,
-    0x1e,
-    0x15,
-    0x58,
-    0xc9,
-    0xbd,
-    0x3c,
-    0x20,
-    0xfd,
-    0xb6,
-    0xcd,
-    0x30,
-    0xc1,
-    0xd2,
-    0x86,
-    0x22,
-    0xd4,
-    0x1f,
-    0x48,
-    0x23,
-    0x3e,
-    0xda,
-    0x6b,
-    0xf9,
-    0x3f,
-    0x92,
-    0x55,
-    0x44,
-    0x85,
-    0x8b,
-    0x4b,
-    0x03,
-    0xa1,
-    0x61,
-    0x86,
-    0x5b,
-    0xbc,
-    0xed,
-    0x8a,
-    0x94,
-    0x86,
-    0x6c,
-    0xb3,
-    0x65,
-    0x70,
-    0xde,
-    0x11,
-    0x71,
-    0x1b,
-    0xad,
-    0x76,
-    0x11,
-    0x10,
-    0x8f,
-    0xcc,
-    0x54,
-    0xb1,
-    0xad,
-    0xac,
-    0x44,
-    0x70,
-    0x05,
-    0x2d,
-    0x6b,
-    0x3e,
-    0x0d,
-    0xfa,
-    0x96,
-    0x46,
-    0x99,
-    0xa8,
-    0xd9,
-    0xdc,
-    0xfe,
-    0x46,
-    0xd3,
-    0xb0,
-    0x78,
-    0x35,
-    0x33,
-    0x48,
-    0xc9,
-    0x3a,
-    0x7b,
-    0xad,
-    0x23,
-    0xd1,
-    0x05,
-    0x64,
-    0x48,
-    0xc4,
-    0x43,
-    0x9f,
-    0xf0,
-    0xfd,
-    0x4a,
-    0xb5,
-    0x6b,
-    0x98,
-    0x92,
-    0xd0,
-    0x87,
-    0x3d,
-    0xf7,
-    0xe5,
-    0xb4,
-    0xad,
-    0x04,
-    0xea,
-    0x66,
-    0x9a,
-    0x71,
-    0x43,
-    0xbb,
-    0xbc,
-    0xea,
-    0x7d,
-    0x5e,
-    0x21,
-    0x13,
-    0x3e,
-    0xab,
-    0xc5,
-    0xc8,
-    0x7c,
-    0x14,
-    0x62,
-    0xa9,
-    0xee,
-    0xc3,
-    0x89,
-    0xd6,
-    0xc0,
-    0x80,
-    0xf2,
-    0xf7,
-    0x8b,
-    0xd6,
-    0x11,
-    0x80,
-    0x84,
-    0x71,
-    0xe9,
-    0x33,
-    0xf4,
-    0xcb,
-    0x25,
-    0xe6,
-    0xe8,
-    0x08,
-    0x65,
-    0x86,
-    0x29,
-    0x1e,
-    0xd6,
-    0x5c,
-    0x6e,
-    0x38,
-    0x05,
-    0x8f,
-    0xd1,
-    0x5d,
-    0xf5,
-    0xea,
-    0x80,
-    0x4c,
-    0x6f,
-    0xe0,
-    0xb5,
-    0xab,
-    0x99,
-    0xcd,
-    0xe8,
-    0x61,
-    0xca,
-    0x7f,
-    0x43,
-    0x41,
-    0x9d,
-    0xf5,
-    0x56,
-    0xe8,
-    0x44,
-    0x66,
-    0x0c,
-    0xe8,
-    0x1f,
-    0x86,
-    0xdd,
-    0x26,
-    0x8d,
-    0x04,
-    0x46,
-    0x80,
-    0x03,
-    0x57,
-    0x76,
-    0xb3,
-    0x5b,
-    0xba,
-    0x4b,
-    0x7c,
-    0x6e,
-    0x75,
-    0x7c,
-    0xfe,
-    0xe4,
-    0x5f,
-    0x18,
-    0x64,
-    0x4b,
-    0xa1,
-    0x2f,
-    0xc7,
-    0x67,
-    0xbc,
-    0xce,
-    0x52,
-    0xc9,
-    0xce,
-    0x31,
-    0xa4,
-    0xa3,
-    0x11,
-    0x35,
-    0x75,
-    0xdb,
-    0xa4,
-    0x0c,
-    0x7d,
-    0x5e,
-    0x8e,
-    0x34,
-    0x91,
-    0xb7,
-    0x00,
-    0xaa,
-    0x10,
-    0xe0,
-    0xda,
-    0x5b,
-    0x7d,
-    0x58,
-    0x71,
-    0xdb,
-    0x6d,
-    0x75,
-    0x8f,
-    0x59,
-    0xa4,
-    0xfc,
-    0xbc,
-    0xd3,
-    0x7b,
-    0xef,
-    0xbc,
-    0x86,
-    0x85,
-    0xa6,
-    0x59,
-    0xa9,
-    0x71,
-    0x21,
-    0x63,
-    0x5a,
-    0x32,
-    0x9d,
-    0xf4,
-    0xd9,
-    0x5e,
-    0x65,
-    0xf8,
-    0xf4,
-    0xd4,
-    0xeb,
-    0xed,
-    0xc2,
-    0xa2,
-    0x17,
-    0xe8,
-    0x94,
-    0x26,
-    0xdf,
-    0xd9,
-    0x29,
-    0x73,
-    0x18,
-    0x0f,
-    0x21,
-    0xf5,
-    0x8c,
-    0xff,
-    0xb4,
-    0x59,
-    0x4c,
-    0x41,
-    0xa4,
-    0xa7,
-    0x48,
-    0xdb,
-    0x70,
-    0xb1,
-    0x1c,
-    0xc2,
-    0xcb,
-    0xb1,
-    0x2d,
-    0x9e,
-    0x4c,
-    0x2e,
-    0xf5,
-    0xce,
-    0x67,
-    0x1f,
-    0x9b,
-    0xac,
-    0x9c,
-    0x53,
-    0xc7,
-    0x12,
-    0xee,
-    0x10,
-    0xb4,
-    0x1d,
-    0x97,
-    0xfb,
-    0x87,
-    0x30,
-    0xfa,
-    0x37,
-    0xdf,
-    0x3c,
-    0xd9,
-    0xd1,
-    0xad,
-    0x3f,
-    0xc8,
-    0x5c,
-    0x46,
-    0x0b,
-    0xe2,
-    0xd8,
-    0xb6,
-    0x49,
-    0xba,
-    0xd9,
-    0x57,
-    0xbd,
-    0x95,
-    0xe5,
-    0xa3,
-    0xcc,
-    0xd6,
-    0x1d,
-    0x47,
-    0x3b,
-    0xb9,
-    0x1f,
-    0x78,
-    0x39,
-    0x44,
-    0x2c,
-    0x8a,
-    0xa0,
-    0x7b,
-    0x86,
-    0xbf,
-    0x78,
-    0xd4,
-    0x1c,
-    0x5d,
-    0xbd,
-    0xea,
-    0x69,
-    0x03,
-    0x61,
-    0x75,
-    0x9a,
-    0x3c,
-    0x95,
-    0x7a,
-    0xef,
-    0x55,
-    0x45,
-    0xbf,
-    0x63,
-    0x6c,
-    0xe1,
-    0x82,
-    0x8f,
-    0xca,
-    0x63,
-    0x6a,
-    0xcc,
-    0x73,
-    0x8e,
-    0xbe,
-    0x98,
-    0xfa,
-    0x73,
-    0xd5,
-    0x3b,
-    0x9a,
-    0x3a,
-    0xce,
-    0xaa,
-    0x83,
-    0x1f,
-    0x81,
-    0xab,
-    0x72,
-    0xbb,
-    0xb4,
-    0x3a,
-    0x84,
-    0x85,
-    0x93,
-    0x2b,
-    0x4c,
-    0x98,
-    0x5a,
-    0x12,
-    0x23,
-    0xb7,
-    0x55,
-    0x60,
-    0xbf,
-    0x8e,
-    0x0a,
-    0xce,
-    0x08,
-    0x3a,
-    0xb5,
-    0xff,
-    0x26,
-    0x0c,
-    0xf4,
-    0x60,
-    0xdf,
-    0x8a,
-    0xc4,
-    0x54,
-    0x20,
-    0xb7,
-    0xac,
-    0x8e,
-    0xd9,
-    0x95,
-    0x38,
-    0xbd,
-    0x0e,
-    0xe7,
-    0xa9,
-    0x6f,
-    0x2c,
-    0x3b,
-    0xeb,
-    0x2f,
-    0x99,
-    0x28,
-    0xc7,
-    0xf1,
-    0x8e,
-    0xd5,
-    0x5a,
-    0xb1,
-    0x29,
-    0xba,
-    0xc6,
-    0x56,
-    0xbe,
-    0xab,
-    0x27,
-    0xdc,
-    0x6f,
-    0x12,
-    0xc9,
-    0xb2,
-    0xfc,
-    0x7c,
-    0x98,
-    0x61,
-    0xdc,
-    0x57,
-    0xd7,
-    0x6f
-  ],
-  const [
-    0x43,
-    0xb1,
-    0xac,
-    0x9c,
-    0x15,
-    0xfc,
-    0xc2,
-    0xb0,
-    0x16,
-    0x8a,
-    0xa9,
-    0x86,
-    0x2d,
-    0xb0,
-    0x30,
-    0x44,
-    0x41,
-    0xce,
-    0x0c,
-    0x56,
-    0x59,
-    0xdb,
-    0x1f,
-    0xa8,
-    0x02,
-    0x44,
-    0xfa,
-    0x18,
-    0xf2,
-    0xf7,
-    0xa0,
-    0x2b,
-    0xea,
-    0xba,
-    0x8c,
-    0xfe,
-    0xe1,
-    0xc2,
-    0xf6,
-    0x80,
-    0x5e,
-    0x81,
-    0x53,
-    0xdf,
-    0x26,
-    0xbf,
-    0x1b,
-    0x40,
-    0x17,
-    0xec,
-    0xce,
-    0xb3,
-    0x54,
-    0xb5,
-    0x39,
-    0x66,
-    0xa2,
-    0xd5,
-    0xf6,
-    0x19,
-    0x12,
-    0x2e,
-    0x32,
-    0xd1,
-    0xe1,
-    0x18,
-    0xb2,
-    0xd1,
-    0x9c,
-    0xf9,
-    0x18,
-    0xc6,
-    0x87,
-    0x16,
-    0x63,
-    0x42,
-    0x40,
-    0xa8,
-    0xb6,
-    0x6b,
-    0xa0,
-    0x33,
-    0x5a,
-    0xf5,
-    0xe2,
-    0x13,
-    0x05,
-    0x4d,
-    0x07,
-    0x57,
-    0x5d,
-    0x17,
-    0x78,
-    0xd3,
-    0xb8,
-    0xdb,
-    0xee,
-    0x71,
-    0x26,
-    0xfb,
-    0x8f,
-    0xc8,
-    0xb1,
-    0xe9,
-    0x5a,
-    0xf0,
-    0xe3,
-    0x96,
-    0xc4,
-    0x94,
-    0x89,
-    0x2e,
-    0xa3,
-    0x48,
-    0xb7,
-    0x02,
-    0x4c,
-    0x1d,
-    0x0c,
-    0xc6,
-    0xf8,
-    0x73,
-    0x37,
-    0xfc,
-    0x6d,
-    0x0f,
-    0xba,
-    0xb0,
-    0xda,
-    0x6e,
-    0xee,
-    0x66,
-    0x02,
-    0x58,
-    0x48,
-    0x51,
-    0x9c,
-    0xb8,
-    0xda,
-    0xc5,
-    0xfa,
-    0xaa,
-    0x1d,
-    0xef,
-    0xea,
-    0xd6,
-    0xed,
-    0xc4,
-    0xda,
-    0xfd,
-    0xd5,
-    0x37,
-    0x3f,
-    0xd1,
-    0x8d,
-    0xaf,
-    0x37,
-    0x0a,
-    0xc1,
-    0xb8,
-    0x6c,
-    0xb6,
-    0x14,
-    0xf8,
-    0x3c,
-    0xd0,
-    0x65,
-    0x66,
-    0x18,
-    0x15,
-    0x51,
-    0xb6,
-    0x2a,
-    0x13,
-    0xf9,
-    0x17,
-    0x3b,
-    0x83,
-    0x05,
-    0x21,
-    0xd3,
-    0xd8,
-    0xe9,
-    0x09,
-    0xa2,
-    0x18,
-    0x66,
-    0x18,
-    0x1e,
-    0xeb,
-    0x54,
-    0x5b,
-    0x6e,
-    0xf2,
-    0xa0,
-    0x9b,
-    0x87,
-    0x59,
-    0x91,
-    0x8f,
-    0x95,
-    0xb0,
-    0x4f,
-    0x51,
-    0x9c,
-    0xf6,
-    0xa5,
-    0x0f,
-    0x5f,
-    0xf7,
-    0x06,
-    0x03,
-    0x81,
-    0xd9,
-    0xce,
-    0xa5,
-    0xea,
-    0xf1,
-    0xcb,
-    0x1f,
-    0x6c,
-    0xdb,
-    0xfc,
-    0x01,
-    0xa6,
-    0xc9,
-    0x98,
-    0x36,
-    0x29,
-    0x1b,
-    0x52,
-    0x37,
-    0xda,
-    0x30,
-    0xdc,
-    0x7e,
-    0x98,
-    0x7c,
-    0xaa,
-    0x3e,
-    0x1e,
-    0xdb,
-    0xf8,
-    0x51,
-    0x2a,
-    0x25,
-    0x0e,
-    0x71,
-    0xdf,
-    0x03,
-    0xc3,
-    0xac,
-    0x67,
-    0x01,
-    0x40,
-    0x12,
-    0xde,
-    0xe4,
-    0x06,
-    0xb1,
-    0x6b,
-    0x3d,
-    0x33,
-    0xc3,
-    0xb0,
-    0x3e,
-    0x00,
-    0x25,
-    0x65,
-    0xcd,
-    0x8f,
-    0x0b,
-    0x3f,
-    0xd7,
-    0xe4,
-    0xf3,
-    0x17,
-    0xe7,
-    0x31,
-    0xd7,
-    0x48,
-    0xf7,
-    0x56,
-    0xa7,
-    0x59,
-    0x86,
-    0xa8,
-    0xf6,
-    0xdc,
-    0xea,
-    0xf1,
-    0xf4,
-    0x95,
-    0xe8,
-    0xb9,
-    0x9c,
-    0xdf,
-    0x82,
-    0xc4,
-    0x2e,
-    0x4c,
-    0x10,
-    0xdc,
-    0xe0,
-    0x8c,
-    0x92,
-    0xd1,
-    0xd0,
-    0x90,
-    0x45,
-    0xbd,
-    0x3e,
-    0xee,
-    0x74,
-    0x8c,
-    0xf8,
-    0x88,
-    0x91,
-    0xbc,
-    0x15,
-    0x69,
-    0x84,
-    0x62,
-    0xe6,
-    0xef,
-    0x43,
-    0x6e,
-    0x2a,
-    0x2f,
-    0xa3,
-    0x2f,
-    0x81,
-    0x95,
-    0x6e,
-    0x1a,
-    0x24,
-    0xcb,
-    0xb5,
-    0xc7,
-    0xd2,
-    0xdc,
-    0x67,
-    0x3c,
-    0x0e,
-    0x9a,
-    0x23,
-    0x6e,
-    0x87,
-    0x3d,
-    0x4b,
-    0x05,
-    0xd8,
-    0x4c,
-    0x5a,
-    0x60,
-    0x71,
-    0xc1,
-    0x77,
-    0xd9,
-    0xd5,
-    0x68,
-    0x4a,
-    0x4a,
-    0x07,
-    0x88,
-    0x0e,
-    0xd0,
-    0x3e,
-    0xc5,
-    0xe7,
-    0xce,
-    0xe0,
-    0x45,
-    0x76,
-    0x35,
-    0xae,
-    0x12,
-    0xab,
-    0x03,
-    0x3c,
-    0xbf,
-    0xdb,
-    0x0a,
-    0xa5,
-    0x4f,
-    0x13,
-    0xf3,
-    0x7c,
-    0x52,
-    0xab,
-    0x82,
-    0x06,
-    0x51,
-    0x1e,
-    0x1c,
-    0xa6,
-    0x6c,
-    0x19,
-    0x86,
-    0x98,
-    0x42,
-    0xd1,
-    0xef,
-    0xe2,
-    0x11,
-    0x9a,
-    0x31,
-    0x88,
-    0x1e,
-    0xb6,
-    0x54,
-    0x00,
-    0x58,
-    0x6a,
-    0x53,
-    0xe5,
-    0x38,
-    0x57,
-    0x23,
-    0xf0,
-    0xeb,
-    0x08,
-    0xf2,
-    0x23,
-    0xb3,
-    0xc8,
-    0xad,
-    0x47,
-    0x8b,
-    0xb6,
-    0xc4,
-    0x99,
-    0x0a,
-    0x1b,
-    0x31,
-    0xc1,
-    0x89,
-    0xfa,
-    0xb7,
-    0x03,
-    0x88,
-    0xe9,
-    0x67,
-    0xb9,
-    0x4e,
-    0x20,
-    0x69,
-    0x01,
-    0xd0,
-    0xd0,
-    0xf9,
-    0xb3,
-    0xd4,
-    0xb6,
-    0xb0,
-    0x96,
-    0x56,
-    0xef,
-    0x05,
-    0xd3,
-    0x2b,
-    0x0e,
-    0x13,
-    0xa9,
-    0xe4,
-    0x6c,
-    0x9d,
-    0x63,
-    0xf5,
-    0xbf,
-    0x4f,
-    0x87,
-    0x17,
-    0xee,
-    0x46,
-    0x51,
-    0xea,
-    0x24,
-    0xd3,
-    0x5f,
-    0xdf,
-    0x24,
-    0x7c,
-    0xae,
-    0x55,
-    0xdc,
-    0x44,
-    0xc5,
-    0x02,
-    0x3c,
-    0x2d,
-    0x30,
-    0x95,
-    0x48,
-    0xfa,
-    0x30,
-    0x99,
-    0x6c,
-    0x39,
-    0xb1,
-    0x9d,
-    0x10,
-    0x81,
-    0x7c,
-    0x92,
-    0x6d,
-    0xf9,
-    0xae,
-    0x74,
-    0x9f,
-    0x19,
-    0x69,
-    0x2d,
-    0xfb,
-    0xb5,
-    0xc9,
-    0xb6,
-    0xa2,
-    0x37,
-    0x1a,
-    0x7f,
-    0x56,
-    0x2c,
-    0x48,
-    0x11,
-    0x8d,
-    0x02,
-    0x96,
-    0xf2,
-    0xc4,
-    0x0f,
-    0x93,
-    0xc8,
-    0x16,
-    0xd6,
-    0x4b,
-    0xc2,
-    0x0d,
-    0x86,
-    0xba,
-    0x34,
-    0xb8,
-    0xc4,
-    0x86,
-    0x81,
-    0xfe,
-    0xaa,
-    0xed,
-    0x3e,
-    0x31,
-    0x10,
-    0xfb,
-    0x94,
-    0xe7,
-    0x0a,
-    0x01,
-    0xe6,
-    0x05,
-    0xb1,
-    0x44,
-    0xb4,
-    0x1c,
-    0x27,
-    0xf2,
-    0xc0,
-    0xf9,
-    0xd5,
-    0x5a,
-    0x6f,
-    0x77,
-    0xf7,
-    0x5b,
-    0x71,
-    0x98,
-    0x5b,
-    0x1d,
-    0xa4,
-    0xd4,
-    0x65,
-    0x00,
-    0x36,
-    0xb1,
-    0x57,
-    0xd2,
-    0x0b,
-    0x94,
-    0xcf,
-    0x45,
-    0x5e,
-    0xd7,
-    0x92,
-    0xa0,
-    0xaa,
-    0x1b,
-    0x87,
-    0xb4,
-    0xcb,
-    0xe0,
-    0x07,
-    0x12,
-    0x60,
-    0x53,
-    0x54,
-    0x7b,
-    0x75,
-    0x66,
-    0x66,
-    0x98,
-    0x5f,
-    0x26,
-    0xee,
-    0xeb,
-    0xe6,
-    0x4a,
-    0x95,
-    0x06,
-    0xaa,
-    0x07,
-    0x84,
-    0xfb,
-    0xbf,
-    0x2c,
-    0x2a,
-    0x13,
-    0x9b,
-    0x6a,
-    0x39,
-    0xc3,
-    0x32,
-    0xf3,
-    0xf2,
-    0xdb,
-    0x5f,
-    0x48,
-    0xa3,
-    0x01,
-    0x86,
-    0x4b,
-    0x6e,
-    0x5e,
-    0x78,
-    0x9c,
-    0x4b,
-    0x97,
-    0x96,
-    0x22,
-    0x50,
-    0xff,
-    0x3a,
-    0xe8,
-    0x31,
-    0x0b,
-    0x52,
-    0x2b,
-    0x03,
-    0x06,
-    0x4e,
-    0xb1,
-    0x45,
-    0x05,
-    0x3d,
-    0x5c,
-    0x20,
-    0x1e,
-    0x32,
-    0xfe,
-    0xee,
-    0xd5,
-    0xed,
-    0x6f,
-    0xfa,
-    0xd7,
-    0xb7,
-    0xdd,
-    0x86,
-    0xeb,
-    0x8e,
-    0x64,
-    0x13,
-    0x25,
-    0x82,
-    0xde,
-    0xdc,
-    0x5c,
-    0x5f,
-    0xfd,
-    0xa4,
-    0xdf,
-    0x8c,
-    0x97,
-    0xb1,
-    0x64,
-    0x33,
-    0x40,
-    0x19,
-    0x41,
-    0xa2,
-    0x1e,
-    0x3c,
-    0xdf,
-    0xf2,
-    0xf9,
-    0x92,
-    0x6b,
-    0xe6,
-    0x92,
-    0xa7,
-    0xce,
-    0x15,
-    0x36,
-    0x63,
-    0xe0,
-    0x4c,
-    0x92,
-    0x8f,
-    0xd8,
-    0x2e,
-    0xc9,
-    0x95,
-    0x08,
-    0x1d,
-    0xc4,
-    0x87,
-    0xc7,
-    0x5e,
-    0xca,
-    0x63,
-    0xae,
-    0x77,
-    0x50,
-    0x96,
-    0x07,
-    0xdc,
-    0x12,
-    0xbe,
-    0x82,
-    0xcb,
-    0x62,
-    0xb4,
-    0x2a,
-    0x75,
-    0xc0,
-    0xca,
-    0x98,
-    0x5e,
-    0xac,
-    0x51,
-    0x66,
-    0x06,
-    0xb8,
-    0x5f,
-    0xe7,
-    0xc9,
-    0xe1,
-    0xcf,
-    0x15,
-    0x04,
-    0x1f,
-    0x88,
-    0xcb,
-    0x79,
-    0x3b,
-    0x03,
-    0x35,
-    0xf5,
-    0xe1,
-    0x07,
-    0x84,
-    0x30,
-    0xf6,
-    0xb7,
-    0xe6,
-    0xf4,
-    0x2b,
-    0xcf,
-    0xb5,
-    0x81,
-    0xd3,
-    0x2b,
-    0xee,
-    0x31,
-    0xf2,
-    0x89,
-    0xe6,
-    0x58,
-    0x96,
-    0x8f,
-    0x38,
-    0x6e,
-    0x6a,
-    0x10,
-    0x02,
-    0x70,
-    0x88,
-    0x8b,
-    0x51,
-    0x83,
-    0x8f,
-    0xf4,
-    0xd9,
-    0xdb,
-    0xf5,
-    0xb7,
-    0xea,
-    0xdb,
-    0x9f,
-    0xfb,
-    0x9f,
-    0x7d,
-    0xaf,
-    0x23,
-    0x59,
-    0xf5,
-    0x9e,
-    0x9b,
-    0x6b,
-    0x91,
-    0x8a,
-    0xd1,
-    0x17,
-    0xe4,
-    0xd1,
-    0x81,
-    0xba,
-    0x23,
-    0xde,
-    0x36,
-    0x43,
-    0xcf,
-    0x43,
-    0x0e,
-    0xe9,
-    0x94,
-    0x08,
-    0xbd,
-    0x1e,
-    0x72,
-    0x43,
-    0xd4,
-    0xbe,
-    0x1a,
-    0xe9,
-    0x44,
-    0x8d,
-    0x9b,
-    0xe4,
-    0x1d,
-    0xe0,
-    0x3d,
-    0x66,
-    0x9c,
-    0x9a,
-    0xad,
-    0x7c,
-    0x65,
-    0x5a,
-    0x5b,
-    0xe6,
-    0x0d,
-    0xf3,
-    0x21,
-    0x26,
-    0xdb,
-    0x1d,
-    0x25,
-    0xd7,
-    0xd0,
-    0x6a,
-    0x00,
-    0x40,
-    0xe4,
-    0x7b,
-    0x20,
-    0x29,
-    0x93,
-    0x73,
-    0x6a,
-    0xed,
-    0x98,
-    0xac,
-    0x24,
-    0xd1,
-    0xf9,
-    0xa9,
-    0x13,
-    0x94,
-    0x43,
-    0x4c,
-    0xe0,
-    0x48,
-    0x17,
-    0x49,
-    0xc1,
-    0x60,
-    0xe5,
-    0xdb,
-    0x55,
-    0x09,
-    0xf8,
-    0xb6,
-    0xcf,
-    0xbe,
-    0xb3,
-    0x3c,
-    0x56,
-    0x16,
-    0x1a,
-    0xf3,
-    0xac,
-    0xe1,
-    0x94,
-    0x37,
-    0x0e,
-    0x74,
-    0xee,
-    0x2c,
-    0x5c,
-    0x41,
-    0xa4,
-    0xf7,
-    0x7a,
-    0xab,
-    0x5c,
-    0x2e,
-    0xf6,
-    0x18,
-    0xb4,
-    0x8c,
-    0xeb,
-    0x47,
-    0x3d,
-    0xea,
-    0x25,
-    0xe4,
-    0xc7,
-    0x6a,
-    0x85,
-    0x59,
-    0xe0,
-    0xf6,
-    0xa7,
-    0xe8,
-    0x97,
-    0xe9,
-    0xc3,
-    0xf6,
-    0x86,
-    0x0b,
-    0xd1,
-    0xaa,
-    0x0f,
-    0xc3,
-    0xf1,
-    0xb7,
-    0xe5,
-    0x88,
-    0x09,
-    0x76,
-    0xce,
-    0x99,
-    0xb0,
-    0x38,
-    0xa8,
-    0xee,
-    0x4b,
-    0xda,
-    0xaa,
-    0x6e,
-    0x75,
-    0x9a,
-    0xed,
-    0x62,
-    0xa5,
-    0x28,
-    0x2b,
-    0x2a,
-    0x0a,
-    0x01,
-    0xc6,
-    0x2e,
-    0xba,
-    0xf8,
-    0x0c,
-    0x18,
-    0x0c,
-    0x15,
-    0xb9,
-    0x41,
-    0x42,
-    0xa3,
-    0xbd,
-    0x68,
-    0x6c,
-    0x85,
-    0x40,
-    0xaa,
-    0x89,
-    0xc9,
-    0xe4,
-    0xae,
-    0xee,
-    0x80,
-    0x4a,
-    0x21,
-    0xec,
-    0xcc,
-    0xd7,
-    0x62,
-    0xad,
-    0x3a,
-    0xb8,
-    0x7e,
-    0x5f,
-    0x52,
-    0x23,
-    0x5e,
-    0x94,
-    0x6d,
-    0xe0,
-    0x3f,
-    0xe9,
-    0xc7,
-    0x09,
-    0x63,
-    0xe6,
-    0xd5,
-    0x0e,
-    0x06,
-    0x26,
-    0xd9,
-    0xfb,
-    0x94,
-    0xb8,
-    0xb3,
-    0xfe,
-    0x19,
-    0xc4,
-    0xfa,
-    0x24,
-    0xf9,
-    0x72,
-    0x4b,
-    0x63,
-    0xe1,
-    0x07,
-    0xe1,
-    0xdd,
-    0xfd,
-    0x52,
-    0x66,
-    0x63,
-    0x6c,
-    0x46,
-    0x09,
-    0x38,
-    0xf1,
-    0xe8,
-    0xd1,
-    0x18,
-    0xeb,
-    0x6c,
-    0x31,
-    0x79,
-    0x87,
-    0x9a,
-    0xdc,
-    0x11,
-    0x34,
-    0x77,
-    0xda,
-    0x98,
-    0x57,
-    0x22,
-    0xdc,
-    0xcf,
-    0x40,
-    0xfc,
-    0xcd,
-    0xc1,
-    0x5d,
-    0x0b,
-    0xa9,
-    0x49,
-    0xae,
-    0xa1,
-    0x92,
-    0xd4,
-    0x79,
-    0x38,
-    0x21,
-    0x68,
-    0x3f,
-    0xa1,
-    0xfa,
-    0xe6,
-    0xee,
-    0x5e,
-    0xa3,
-    0x8c,
-    0x58,
-    0x4c,
-    0x96,
-    0xbd,
-    0xe4,
-    0x85,
-    0x94,
-    0x05,
-    0x84,
-    0x84,
-    0x3d,
-    0x58,
-    0xe7,
-    0x8a,
-    0xde,
-    0x9a,
-    0xef,
-    0x41,
-    0x8a,
-    0x65,
-    0x65,
-    0x9f,
-    0x6c,
-    0x06,
-    0xec,
-    0x0e,
-    0x5b,
-    0xc8,
-    0x33,
-    0xca,
-    0xaf,
-    0x76,
-    0x6f,
-    0x8a,
-    0x53,
-    0x1b,
-    0x09,
-    0x62,
-    0x1c,
-    0x0c,
-    0x93,
-    0xe8,
-    0x59,
-    0x28,
-    0x01,
-    0x96,
-    0xac,
-    0x5f,
-    0x16,
-    0x6f,
-    0x18,
-    0x71,
-    0x1c,
-    0xe5,
-    0x5a,
-    0xf8,
-    0xd8,
-    0xfb,
-    0x7d,
-    0xa9,
-    0xbd,
-    0xa7,
-    0xa9,
-    0xd7,
-    0x60,
-    0x7a,
-    0x3c,
-    0x38,
-    0x2c,
-    0x82,
-    0x1b,
-    0xec,
-    0x57,
-    0x70,
-    0x4b,
-    0xbb,
-    0x14,
-    0xf6,
-    0xbb,
-    0x9f,
-    0x0b,
-    0x73,
-    0x64,
-    0x82,
-    0x06,
-    0xd2,
-    0x94,
-    0x48,
-    0xed,
-    0xaf,
-    0x87,
-    0x10,
-    0xf4,
-    0xbc,
-    0x38,
-    0xb7,
-    0x13,
-    0x64,
-    0x76,
-    0x9e,
-    0xb7,
-    0xae,
-    0x3a,
-    0xae,
-    0xb7,
-    0x63,
-    0x38,
-    0x99,
-    0x89,
-    0x73,
-    0xb4,
-    0x62,
-    0xb6,
-    0x95,
-    0x97,
-    0x1f,
-    0x8b,
-    0x2e,
-    0xc2,
-    0xfe,
-    0x11,
-    0x74,
-    0xa2,
-    0x86,
-    0x40,
-    0xd3,
-    0x05,
-    0x1f,
-    0x70,
-    0x90,
-    0x2c,
-    0xd5,
-    0x10,
-    0xac,
-    0x21,
-    0x59,
-    0x9a,
-    0x0b,
-    0x4b,
-    0x48,
-    0xc6,
-    0xd5,
-    0x3f,
-    0xb0,
-    0xff,
-    0x1d,
-    0xd9,
-    0xd1,
-    0x13,
-    0xc0,
-    0x8c,
-    0x20,
-    0x2e,
-    0x90,
-    0xf6,
-    0x92,
-    0x09,
-    0xb2,
-    0xb7,
-    0x16,
-    0x5f,
-    0x45,
-    0x84,
-    0x63,
-    0xa1,
-    0x44,
-    0x77,
-    0xf5,
-    0xea,
-    0xae,
-    0xa9,
-    0x52,
-    0x35,
-    0xe4,
-    0x03,
-    0x92,
-    0xce,
-    0x52,
-    0x51,
-    0x1e,
-    0x06,
-    0x51,
-    0x98,
-    0xb8,
-    0x2b,
-    0x4c,
-    0xaa,
-    0xbc,
-    0xb7,
-    0x22,
-    0xf7,
-    0xa5,
-    0xc8,
-    0xcc,
-    0xa6,
-    0xd2,
-    0xd0,
-    0x40,
-    0xe5,
-    0x8b,
-    0x8e,
-    0x95,
-    0x7d,
-    0x3f,
-    0x3d,
-    0x67,
-    0xa9,
-    0x0f,
-    0x0b,
-    0x7d,
-    0x28,
-    0x91,
-    0xcc,
-    0xa9,
-    0x91,
-    0xcd,
-    0xf0,
-    0xf0,
-    0xe7,
-    0x8c,
-    0xb2,
-    0xeb,
-    0x6d,
-    0xd3,
-    0x93,
-    0x6d,
-    0xbb,
-    0xaa,
-    0x07,
-    0x67,
-    0x12,
-    0x21,
-    0x6e,
-    0x08,
-    0xed,
-    0x95,
-    0x45,
-    0x28,
-    0xd8,
-    0x30,
-    0x9e,
-    0xe6,
-    0x85,
-    0xaf,
-    0xcd,
-    0x90,
-    0x1d,
-    0x68,
-    0x65,
-    0xc4,
-    0xd4,
-    0x8b,
-    0x63,
-    0xd5,
-    0xc0,
-    0xa8,
-    0xa8,
-    0x70,
-    0xeb,
-    0x71,
-    0xad,
-    0x80,
-    0xa7,
-    0xc2,
-    0x72,
-    0x4e,
-    0x21,
-    0xde,
-    0xb7,
-    0xed,
-    0x39,
-    0xfc,
-    0x6f,
-    0xd5,
-    0x91,
-    0x02,
-    0x72,
-    0xce,
-    0xe4,
-    0x90,
-    0x72,
-    0x10,
-    0x9a,
-    0x40,
-    0x30,
-    0xa8,
-    0x99,
-    0x2c,
-    0xef,
-    0x1d,
-    0x5d,
-    0xb1,
-    0x29,
-    0x54,
-    0x4b,
-    0x73,
-    0x82,
-    0xb1,
-    0x42,
-    0xa1,
-    0xfa,
-    0x7f,
-    0x74,
-    0x7b,
-    0x66,
-    0x92,
-    0x74,
-    0x11,
-    0x21,
-    0x2a,
-    0x8f,
-    0x4d,
-    0xff,
-    0x1b,
-    0x60,
-    0x33,
-    0x82,
-    0x2b,
-    0x9f,
-    0x68,
-    0x51,
-    0xbc,
-    0x3a,
-    0xf1,
-    0xe5,
-    0xab,
-    0xa7,
-    0x3e,
-    0x86,
-    0x77,
-    0x78,
-    0x67,
-    0x76,
-    0xa6,
-    0x30,
-    0xb5,
-    0x6c,
-    0x64,
-    0x55,
-    0x64,
-    0x43,
-    0x6e,
-    0xc6,
-    0xa7,
-    0xf4,
-    0x2e,
-    0x4f,
-    0xed,
-    0xc2,
-    0x27,
-    0x7b,
-    0x63,
-    0xb4,
-    0x94,
-    0xa9,
-    0xba,
-    0x48,
-    0x4c,
-    0x62,
-    0x2a,
-    0x66,
-    0xe9,
-    0xea,
-    0xb7,
-    0x93,
-    0x29,
-    0x15,
-    0xb3,
-    0x67,
-    0x95,
-    0x5c,
-    0x84,
-    0x41,
-    0x60,
-    0x30,
-    0xa7,
-    0x39,
-    0x91,
-    0x8f,
-    0xf5,
-    0x56,
-    0x65,
-    0xd4,
-    0x25,
-    0x02,
-    0xee,
-    0xd3,
-    0x93,
-    0xba,
-    0x01,
-    0x25,
-    0x3f,
-    0x0a,
-    0x4f,
-    0xc1,
-    0x19,
-    0xb9,
-    0xd2,
-    0xcc,
-    0x7c,
-    0x41,
-    0x6b,
-    0xb3,
-    0xf8,
-    0x81,
-    0xc9,
-    0x76,
-    0x54,
-    0xb6,
-    0x8c,
-    0x47,
-    0xd3,
-    0xa8,
-    0xaa,
-    0x53,
-    0xb7,
-    0x21,
-    0x12,
-    0xe0,
-    0x04,
-    0xa3,
-    0x90,
-    0x98,
-    0x86,
-    0x5a,
-    0xf1,
-    0x24,
-    0x15,
-    0x50,
-    0x67,
-    0xfd,
-    0x18,
-    0xe0,
-    0x2f,
-    0x7f,
-    0x48,
-    0x6d,
-    0x70,
-    0x40,
-    0xb7,
-    0x54,
-    0x67,
-    0x9f,
-    0x10,
-    0x1e,
-    0xc1,
-    0xa0,
-    0x20,
-    0xfb,
-    0x48,
-    0xf7,
-    0x95,
-    0x6c,
-    0xc2,
-    0x62,
-    0x06,
-    0x3f,
-    0x16,
-    0x3c,
-    0x34,
-    0xc0,
-    0xb1,
-    0x50,
-    0x90,
-    0x2e,
-    0x28,
-    0xeb,
-    0xfd,
-    0x6c,
-    0x1f,
-    0x35,
-    0xd6,
-    0xf9,
-    0x69,
-    0xc0,
-    0x33,
-    0x22,
-    0x71,
-    0x62,
-    0x68,
-    0x76,
-    0xd8,
-    0x40,
-    0xcf,
-    0x7b,
-    0x5f,
-    0x2c,
-    0xc8,
-    0x9f,
-    0x08,
-    0x31,
-    0xfd,
-    0x71,
-    0x78,
-    0x6b,
-    0xeb,
-    0x11,
-    0xa0,
-    0x1c,
-    0x9e,
-    0xe5,
-    0x9c,
-    0xfd,
-    0xbb,
-    0x8e,
-    0xdb,
-    0xd2,
-    0xc4,
-    0x1b,
-    0x81,
-    0x41,
-    0x98,
-    0x7c,
-    0x09,
-    0xe4,
-    0x39,
-    0x39,
-    0x2f,
-    0x9d,
-    0xd2,
-    0x64,
-    0x0d,
-    0x2a,
-    0xf9,
-    0xcc,
-    0x84,
-    0xf9,
-    0x31,
-    0x73,
-    0xdd,
-    0x3d,
-    0xb3,
-    0x42,
-    0xb0,
-    0x41,
-    0x6e,
-    0xfc,
-    0x05,
-    0xfc,
-    0x4c,
-    0x71,
-    0xba,
-    0xe7,
-    0xb7,
-    0xf4,
-    0x25,
-    0x0b,
-    0x5c,
-    0x0e,
-    0xf9,
-    0x5e,
-    0x2e,
-    0x74,
-    0x6e,
-    0x4f,
-    0xae,
-    0x37,
-    0x9c,
-    0xa0,
-    0x6a,
-    0x3b,
-    0x28,
-    0x74,
-    0xc4,
-    0xea,
-    0x23,
-    0xa9,
-    0xf5,
-    0x29,
-    0x2f,
-    0x67,
-    0x52,
-    0x8b,
-    0xe4,
-    0xf9,
-    0xcd,
-    0xc5,
-    0x72,
-    0xdc,
-    0xbe,
-    0x63,
-    0x87,
-    0x16,
-    0xe4,
-    0xb9,
-    0x73,
-    0xc9,
-    0xa6,
-    0x1b,
-    0x8a,
-    0x08,
-    0x9f,
-    0x51,
-    0xc9,
-    0xe9,
-    0x5a,
-    0x45,
-    0xbd,
-    0xdc,
-    0x5a,
-    0xff,
-    0xa1,
-    0x3b,
-    0x5e,
-    0xd3,
-    0xc7,
-    0x22,
-    0xe3,
-    0xd9,
-    0x39,
-    0x80,
-    0xe9,
-    0x9e,
-    0x9f,
-    0x6e,
-    0xfa,
-    0x19,
-    0x63,
-    0xc0,
-    0x69,
-    0xe1,
-    0x14,
-    0xda,
-    0xd8,
-    0x9d,
-    0x08,
-    0xc6,
-    0xfc,
-    0xbb,
-    0x46,
-    0x83,
-    0xa5,
-    0x65,
-    0xa2,
-    0x9f,
-    0xf8,
-    0xb0,
-    0x2a,
-    0x08,
-    0xff,
-    0x17,
-    0xc1,
-    0x1f,
-    0x65,
-    0x29,
-    0x0a,
-    0x0e,
-    0x7a,
-    0x7e,
-    0x88,
-    0x5b,
-    0x7d,
-    0xef,
-    0x03,
-    0xbe,
-    0x1b,
-    0x06,
-    0x2d,
-    0x30,
-    0x33,
-    0xb4,
-    0x85,
-    0x45,
-    0xdc,
-    0x42,
-    0x7c,
-    0xbb,
-    0xa9,
-    0x8a,
-    0xd6,
-    0x53,
-    0x2c,
-    0x67,
-    0x54,
-    0xdf,
-    0xb8,
-    0x6a,
-    0x90,
-    0x9d,
-    0x6b,
-    0xcf,
-    0x28,
-    0xc3,
-    0x6c,
-    0xaf,
-    0x1e,
-    0x5b,
-    0x72,
-    0x77,
-    0x7f,
-    0x51,
-    0x86,
-    0x98,
-    0x43,
-    0xcb,
-    0x09,
-    0x80,
-    0x75,
-    0xb8,
-    0xf8,
-    0xca,
-    0x94,
-    0xac,
-    0x6f,
-    0xb1,
-    0x38,
-    0xeb,
-    0x6c,
-    0xcb,
-    0xf8,
-    0xc4,
-    0xd6,
-    0xf4,
-    0x8c,
-    0x20,
-    0xbe,
-    0x87,
-    0x2f,
-    0x5a,
-    0xe4,
-    0xd5,
-    0x47,
-    0x51,
-    0x7d,
-    0xcf,
-    0x48,
-    0xbc,
-    0x33,
-    0x06,
-    0xd6,
-    0xbe,
-    0x6e,
-    0xd6,
-    0x2a,
-    0xbb,
-    0xd2,
-    0xdd,
-    0xb6,
-    0x69,
-    0x09,
-    0xb2,
-    0x0c,
-    0x2a,
-    0xc2,
-    0xd4,
-    0xfc,
-    0x99,
-    0xf9,
-    0xe1,
-    0xfc,
-    0x62,
-    0x79,
-    0x09,
-    0xce,
-    0x58,
-    0xa0,
-    0xc1,
-    0x5c,
-    0xc1,
-    0x63,
-    0xbc,
-    0xe7,
-    0xf4,
-    0x91,
-    0x17,
-    0x60,
-    0x27,
-    0x5c,
-    0xd4,
-    0x16,
-    0x82,
-    0x15,
-    0x89,
-    0x92,
-    0x78,
-    0x37,
-    0x59,
-    0xbf,
-    0x56,
-    0xa7,
-    0x24,
-    0x4f,
-    0x1c,
-    0x3a,
-    0xfb,
-    0x59,
-    0x8d,
-    0x78,
-    0xd7,
-    0x47,
-    0x82,
-    0xa0,
-    0x8a,
-    0xef,
-    0x83,
-    0xec,
-    0xf5,
-    0x00,
-    0x98,
-    0x15,
-    0x7c,
-    0xa0,
-    0x5d,
-    0x1a,
-    0xb7,
-    0x53,
-    0x55,
-    0x3e,
-    0x6a,
-    0x1f,
-    0x80,
-    0x4f,
-    0xb8,
-    0xee,
-    0x30,
-    0x2e,
-    0x93,
-    0x33,
-    0x18,
-    0x8c,
-    0x77,
-    0xd0,
-    0xa6,
-    0xf2,
-    0x58,
-    0x38,
-    0x93,
-    0x04,
-    0xd9,
-    0xd0,
-    0xb8,
-    0x06,
-    0xbe,
-    0x9c,
-    0x23,
-    0x9f,
-    0xa4,
-    0x17,
-    0x6a,
-    0xdd,
-    0xef,
-    0x62,
-    0x3f,
-    0x7a,
-    0x05,
-    0xa1
-  ],
-  const [
-    0x0a,
-    0x72,
-    0xca,
-    0x03,
-    0xc9,
-    0x97,
-    0x7d,
-    0xcd,
-    0x01,
-    0x69,
-    0xda,
-    0x7a,
-    0xf1,
-    0xfa,
-    0x3f,
-    0x3f,
-    0x02,
-    0xe3,
-    0x74,
-    0x17,
-    0x58,
-    0x86,
-    0xde,
-    0x21,
-    0xa7,
-    0x96,
-    0xf5,
-    0x43,
-    0x48,
-    0xda,
-    0xf8,
-    0x14,
-    0x8c,
-    0x2d,
-    0xdf,
-    0xf9,
-    0x50,
-    0xca,
-    0x91,
-    0x8e,
-    0xd1,
-    0xc6,
-    0x57,
-    0x47,
-    0xc2,
-    0xde,
-    0x90,
-    0x57,
-    0x9c,
-    0x73,
-    0xa7,
-    0xd0,
-    0x36,
-    0xd3,
-    0x43,
-    0x0c,
-    0x95,
-    0xba,
-    0xbd,
-    0x4d,
-    0x05,
-    0x19,
-    0xd7,
-    0xa0,
-    0x68,
-    0x15,
-    0xab,
-    0x07,
-    0xcf,
-    0x53,
-    0xe1,
-    0xd6,
-    0x47,
-    0x73,
-    0x25,
-    0x5e,
-    0xf6,
-    0xda,
-    0xd8,
-    0xc9,
-    0x66,
-    0xb5,
-    0x06,
-    0x45,
-    0x20,
-    0x3a,
-    0x99,
-    0x65,
-    0x7d,
-    0x31,
-    0xcc,
-    0xc3,
-    0xb9,
-    0xb4,
-    0xe2,
-    0xeb,
-    0x49,
-    0x33,
-    0x17,
-    0x74,
-    0x6e,
-    0xbb,
-    0xd7,
-    0x70,
-    0x0b,
-    0x77,
-    0x2e,
-    0x07,
-    0xb4,
-    0x77,
-    0x80,
-    0x5e,
-    0x07,
-    0xb0,
-    0x7a,
-    0xbe,
-    0x3f,
-    0x44,
-    0x48,
-    0xf2,
-    0x06,
-    0x04,
-    0x08,
-    0xf0,
-    0x8b,
-    0x33,
-    0x7f,
-    0xbc,
-    0xd5,
-    0x8d,
-    0x0b,
-    0x8a,
-    0x57,
-    0x88,
-    0xd9,
-    0x23,
-    0xc4,
-    0xda,
-    0x58,
-    0x89,
-    0x24,
-    0x3b,
-    0xee,
-    0xde,
-    0x28,
-    0x6c,
-    0xe9,
-    0x82,
-    0xba,
-    0x78,
-    0xb8,
-    0x7c,
-    0xd9,
-    0x3a,
-    0x5b,
-    0x1b,
-    0xa4,
-    0x1f,
-    0x18,
-    0xdc,
-    0xb4,
-    0x2e,
-    0x70,
-    0x8f,
-    0xaf,
-    0x45,
-    0x51,
-    0xb6,
-    0x1a,
-    0xa5,
-    0x8d,
-    0x2e,
-    0x6f,
-    0xb0,
-    0x8b,
-    0x11,
-    0x70,
-    0xf2,
-    0x3d,
-    0xda,
-    0xba,
-    0x5f,
-    0x51,
-    0xca,
-    0x9d,
-    0xdb,
-    0xac,
-    0x8b,
-    0x2b,
-    0x00,
-    0x14,
-    0x14,
-    0x8f,
-    0x1b,
-    0x2c,
-    0xcc,
-    0xa1,
-    0x77,
-    0xa6,
-    0xf2,
-    0xb7,
-    0xdf,
-    0xb4,
-    0x3c,
-    0xbd,
-    0x5e,
-    0xbf,
-    0xbe,
-    0x88,
-    0x49,
-    0x5c,
-    0x0e,
-    0x67,
-    0x7f,
-    0x7c,
-    0xa6,
-    0xfb,
-    0xf0,
-    0xe2,
-    0x89,
-    0x49,
-    0x5c,
-    0xdb,
-    0x2a,
-    0x0e,
-    0x5d,
-    0x29,
-    0x89,
-    0x52,
-    0xa8,
-    0x40,
-    0x9f,
-    0x40,
-    0x90,
-    0xb5,
-    0xfc,
-    0x35,
-    0xcc,
-    0xf3,
-    0xaf,
-    0x17,
-    0x79,
-    0x30,
-    0x66,
-    0xe8,
-    0x63,
-    0x9f,
-    0xd6,
-    0x9b,
-    0x80,
-    0xe7,
-    0x5d,
-    0x26,
-    0xbd,
-    0xd5,
-    0xe6,
-    0xd8,
-    0xfd,
-    0x4d,
-    0x0e,
-    0xed,
-    0x5f,
-    0x87,
-    0x85,
-    0x60,
-    0xc0,
-    0x78,
-    0xb6,
-    0x00,
-    0x82,
-    0x8d,
-    0xaa,
-    0xc6,
-    0x8b,
-    0x9f,
-    0x29,
-    0x66,
-    0x90,
-    0x24,
-    0x23,
-    0x24,
-    0x93,
-    0xa2,
-    0x4f,
-    0xe9,
-    0xaa,
-    0x6a,
-    0x12,
-    0x96,
-    0x03,
-    0x82,
-    0xa2,
-    0x98,
-    0x25,
-    0xe3,
-    0x6b,
-    0xbd,
-    0x78,
-    0xe4,
-    0xb2,
-    0x45,
-    0x08,
-    0xf7,
-    0x78,
-    0x3d,
-    0x86,
-    0x93,
-    0xa1,
-    0x08,
-    0x90,
-    0x71,
-    0x55,
-    0x3f,
-    0x31,
-    0xfb,
-    0xa7,
-    0xbb,
-    0xac,
-    0x02,
-    0x74,
-    0xef,
-    0x75,
-    0xaf,
-    0x8e,
-    0x7b,
-    0x81,
-    0xbc,
-    0x1a,
-    0xff,
-    0xbf,
-    0xe3,
-    0x37,
-    0x2d,
-    0xe7,
-    0x97,
-    0xe1,
-    0x23,
-    0x72,
-    0xf3,
-    0x14,
-    0xf7,
-    0xe9,
-    0xf0,
-    0x34,
-    0x93,
-    0x63,
-    0xda,
-    0xac,
-    0xc3,
-    0x4a,
-    0x05,
-    0xd6,
-    0x8c,
-    0x5d,
-    0xbc,
-    0x1b,
-    0xc0,
-    0xfb,
-    0x7a,
-    0x5b,
-    0xcf,
-    0x9e,
-    0x5d,
-    0x8e,
-    0xe0,
-    0xa6,
-    0xd7,
-    0xac,
-    0x20,
-    0x58,
-    0xa7,
-    0xcb,
-    0x5a,
-    0x26,
-    0x07,
-    0x87,
-    0xc9,
-    0x30,
-    0x27,
-    0xa7,
-    0x2a,
-    0x0c,
-    0xdb,
-    0xfe,
-    0x14,
-    0xc2,
-    0x90,
-    0x8e,
-    0x8c,
-    0x1b,
-    0x85,
-    0xf4,
-    0xd5,
-    0x1c,
-    0x38,
-    0x00,
-    0x85,
-    0xcd,
-    0x1e,
-    0xa3,
-    0xde,
-    0x3f,
-    0x96,
-    0x0e,
-    0x5a,
-    0xcc,
-    0x20,
-    0x18,
-    0x88,
-    0xa1,
-    0xca,
-    0xe0,
-    0x17,
-    0x7a,
-    0xec,
-    0xb4,
-    0x30,
-    0xad,
-    0x15,
-    0x32,
-    0x0a,
-    0x6a,
-    0x45,
-    0xad,
-    0xb8,
-    0x41,
-    0x5d,
-    0xd3,
-    0x45,
-    0xe4,
-    0xd3,
-    0x8c,
-    0x02,
-    0x2f,
-    0xaa,
-    0x25,
-    0x1f,
-    0x65,
-    0xa2,
-    0xad,
-    0x79,
-    0xbd,
-    0xac,
-    0x9f,
-    0xb3,
-    0x1d,
-    0xa0,
-    0xc2,
-    0x88,
-    0x25,
-    0x32,
-    0x4e,
-    0x5f,
-    0x6f,
-    0x23,
-    0x50,
-    0x20,
-    0x15,
-    0xb4,
-    0x4f,
-    0x47,
-    0x74,
-    0x60,
-    0x30,
-    0x37,
-    0x30,
-    0xca,
-    0x57,
-    0xd0,
-    0x79,
-    0xf5,
-    0x0f,
-    0x43,
-    0x8c,
-    0xb3,
-    0x2c,
-    0x25,
-    0x7c,
-    0x60,
-    0xef,
-    0xc3,
-    0x32,
-    0xcf,
-    0x29,
-    0xb6,
-    0xb2,
-    0x85,
-    0xa3,
-    0xb7,
-    0xa1,
-    0x25,
-    0xbe,
-    0xb4,
-    0x04,
-    0x2c,
-    0x57,
-    0x23,
-    0x4b,
-    0xde,
-    0xed,
-    0x96,
-    0x8e,
-    0x81,
-    0x06,
-    0x8f,
-    0x16,
-    0xc8,
-    0xce,
-    0x96,
-    0x1f,
-    0x92,
-    0x02,
-    0x8a,
-    0xdc,
-    0xd5,
-    0x0c,
-    0x35,
-    0xbc,
-    0xd4,
-    0x70,
-    0x22,
-    0xec,
-    0x99,
-    0x66,
-    0xb3,
-    0x1d,
-    0x9f,
-    0xc8,
-    0x6e,
-    0x87,
-    0xcf,
-    0x2f,
-    0x98,
-    0x2e,
-    0xad,
-    0x5a,
-    0x05,
-    0x64,
-    0xd4,
-    0xcf,
-    0x2e,
-    0x8f,
-    0xa0,
-    0xc4,
-    0x84,
-    0x2c,
-    0x2a,
-    0x3f,
-    0x04,
-    0x14,
-    0x79,
-    0x7d,
-    0x0c,
-    0xfe,
-    0xf6,
-    0x91,
-    0x6d,
-    0x46,
-    0x21,
-    0x4d,
-    0xc1,
-    0xed,
-    0x83,
-    0x65,
-    0xff,
-    0xe0,
-    0xe3,
-    0xd2,
-    0x4c,
-    0x7d,
-    0xbd,
-    0x75,
-    0x14,
-    0x53,
-    0xf0,
-    0xfd,
-    0x5a,
-    0x29,
-    0xb7,
-    0x0a,
-    0x4c,
-    0x42,
-    0xda,
-    0x92,
-    0x1b,
-    0xe0,
-    0x26,
-    0x85,
-    0x09,
-    0x07,
-    0x1a,
-    0xac,
-    0xc4,
-    0x83,
-    0xe3,
-    0xd7,
-    0xf2,
-    0x2d,
-    0x8b,
-    0x37,
-    0x0d,
-    0x69,
-    0x6d,
-    0x09,
-    0x71,
-    0xf3,
-    0xec,
-    0x74,
-    0xb3,
-    0xdc,
-    0x64,
-    0xb5,
-    0x35,
-    0xcf,
-    0x61,
-    0x79,
-    0xf7,
-    0x99,
-    0x0f,
-    0x8a,
-    0xb0,
-    0xe8,
-    0xf2,
-    0xae,
-    0x1e,
-    0x53,
-    0xd7,
-    0xcd,
-    0x9a,
-    0x9b,
-    0x0b,
-    0x51,
-    0xef,
-    0x31,
-    0xca,
-    0xd2,
-    0x6c,
-    0xf8,
-    0xfa,
-    0xf3,
-    0x38,
-    0x4b,
-    0x1a,
-    0x87,
-    0xe6,
-    0x42,
-    0x75,
-    0xf9,
-    0x49,
-    0x31,
-    0x9b,
-    0xea,
-    0x8a,
-    0x72,
-    0x11,
-    0x1b,
-    0x77,
-    0x65,
-    0x48,
-    0x8e,
-    0x1e,
-    0xb4,
-    0xcc,
-    0xe8,
-    0x9b,
-    0xdc,
-    0xbe,
-    0x1a,
-    0x2e,
-    0xe9,
-    0x84,
-    0x40,
-    0x91,
-    0x80,
-    0xbf,
-    0xc9,
-    0x88,
-    0x23,
-    0x7d,
-    0xd9,
-    0xb9,
-    0xb1,
-    0xb1,
-    0xeb,
-    0xbe,
-    0x2c,
-    0xe0,
-    0xbb,
-    0x79,
-    0xbf,
-    0x1c,
-    0x63,
-    0xa7,
-    0x00,
-    0x36,
-    0xc4,
-    0xb8,
-    0x72,
-    0x30,
-    0x27,
-    0xdf,
-    0x4e,
-    0xf1,
-    0x24,
-    0x65,
-    0x83,
-    0x3c,
-    0xc4,
-    0x42,
-    0xfb,
-    0xe3,
-    0xe2,
-    0xee,
-    0x20,
-    0x38,
-    0xd7,
-    0x75,
-    0x9f,
-    0xc5,
-    0x56,
-    0xca,
-    0x6b,
-    0x3d,
-    0x94,
-    0x5d,
-    0x06,
-    0xb2,
-    0xac,
-    0xef,
-    0xfc,
-    0x07,
-    0x43,
-    0xa5,
-    0xb0,
-    0xa9,
-    0x67,
-    0x5c,
-    0x5a,
-    0x7a,
-    0xbd,
-    0x3d,
-    0x51,
-    0x0e,
-    0xdc,
-    0x91,
-    0x86,
-    0x1a,
-    0xf4,
-    0xd6,
-    0x51,
-    0x29,
-    0xb3,
-    0x12,
-    0x71,
-    0x91,
-    0x69,
-    0x67,
-    0x4e,
-    0xa6,
-    0x6a,
-    0xe8,
-    0x80,
-    0x2d,
-    0xb4,
-    0xab,
-    0x95,
-    0x14,
-    0xd1,
-    0x1f,
-    0x0f,
-    0x60,
-    0xff,
-    0xa0,
-    0xad,
-    0x66,
-    0x8f,
-    0x49,
-    0xec,
-    0x3e,
-    0x8b,
-    0x0a,
-    0xcc,
-    0x75,
-    0x9b,
-    0xfa,
-    0xd7,
-    0x02,
-    0x29,
-    0xee,
-    0x60,
-    0x7b,
-    0xc4,
-    0x4a,
-    0x09,
-    0x89,
-    0xc2,
-    0x17,
-    0x88,
-    0x9a,
-    0x2a,
-    0x56,
-    0xaa,
-    0xd5,
-    0xd1,
-    0x94,
-    0x97,
-    0x53,
-    0xc2,
-    0xbf,
-    0x59,
-    0x8c,
-    0xe3,
-    0x38,
-    0x98,
-    0x0f,
-    0xd6,
-    0x29,
-    0xa7,
-    0x77,
-    0x1e,
-    0x19,
-    0xc5,
-    0x9a,
-    0x83,
-    0xbe,
-    0x9c,
-    0x03,
-    0xb7,
-    0x12,
-    0x0e,
-    0xa3,
-    0x39,
-    0xa9,
-    0x31,
-    0xc3,
-    0x7a,
-    0x41,
-    0x98,
-    0x3d,
-    0x3f,
-    0x9b,
-    0xd5,
-    0xec,
-    0x46,
-    0x89,
-    0x3b,
-    0x61,
-    0x2c,
-    0x49,
-    0xe9,
-    0xd7,
-    0x8e,
-    0x11,
-    0x04,
-    0x69,
-    0x6f,
-    0xeb,
-    0x43,
-    0x83,
-    0xd9,
-    0xc3,
-    0xb1,
-    0x97,
-    0xc7,
-    0xbe,
-    0xae,
-    0x11,
-    0x43,
-    0xce,
-    0x37,
-    0x8c,
-    0xcc,
-    0x84,
-    0x68,
-    0x46,
-    0xfa,
-    0x25,
-    0x3f,
-    0xd1,
-    0x65,
-    0xff,
-    0xa3,
-    0x0c,
-    0xc2,
-    0xfd,
-    0xa5,
-    0x52,
-    0x4f,
-    0x7a,
-    0x05,
-    0xf1,
-    0x72,
-    0x53,
-    0xf8,
-    0xde,
-    0x9c,
-    0x40,
-    0x28,
-    0xa7,
-    0x74,
-    0x64,
-    0xfd,
-    0xa8,
-    0x32,
-    0x22,
-    0x1b,
-    0x82,
-    0x48,
-    0x33,
-    0x2c,
-    0xc9,
-    0x48,
-    0xf5,
-    0xdf,
-    0xfd,
-    0x02,
-    0x06,
-    0x30,
-    0xbc,
-    0xec,
-    0x12,
-    0xeb,
-    0x35,
-    0xc8,
-    0xe9,
-    0x6b,
-    0xe0,
-    0x80,
-    0xd5,
-    0xa8,
-    0x6d,
-    0x55,
-    0x2a,
-    0x71,
-    0xfa,
-    0x38,
-    0x1e,
-    0xf5,
-    0x88,
-    0x78,
-    0xdb,
-    0x88,
-    0xb0,
-    0x9e,
-    0xd3,
-    0xa4,
-    0x92,
-    0x96,
-    0x54,
-    0x2e,
-    0x0f,
-    0x0f,
-    0x5c,
-    0xfb,
-    0x38,
-    0x23,
-    0xae,
-    0x93,
-    0x05,
-    0x3b,
-    0x25,
-    0x35,
-    0x4b,
-    0x2d,
-    0x49,
-    0x1b,
-    0xe8,
-    0xa8,
-    0x20,
-    0xfe,
-    0x40,
-    0xd2,
-    0x47,
-    0xdd,
-    0xee,
-    0x2f,
-    0x40,
-    0xfb,
-    0xb3,
-    0xc5,
-    0x0e,
-    0x27,
-    0xb2,
-    0x7e,
-    0xff,
-    0x3f,
-    0xe0,
-    0xcd,
-    0xca,
-    0xf7,
-    0xb6,
-    0x94,
-    0xd9,
-    0xd7,
-    0x29,
-    0x46,
-    0xe8,
-    0x83,
-    0xdb,
-    0x49,
-    0xcf,
-    0x3f,
-    0x93,
-    0x9e,
-    0x9c,
-    0xb2,
-    0xeb,
-    0xc3,
-    0xe5,
-    0xea,
-    0x48,
-    0xd8,
-    0x5d,
-    0xa1,
-    0x0f,
-    0x02,
-    0xa4,
-    0xbf,
-    0x16,
-    0x0d,
-    0x64,
-    0x20,
-    0x59,
-    0x55,
-    0x99,
-    0x96,
-    0xef,
-    0xe6,
-    0x30,
-    0x32,
-    0x3c,
-    0xe2,
-    0xd4,
-    0xbf,
-    0x67,
-    0x23,
-    0x05,
-    0x90,
-    0x0e,
-    0x22,
-    0x6a,
-    0x7c,
-    0x39,
-    0x17,
-    0x68,
-    0x26,
-    0x8d,
-    0x62,
-    0xf3,
-    0x82,
-    0xc3,
-    0x2a,
-    0xa4,
-    0x94,
-    0x58,
-    0x44,
-    0x0c,
-    0x7b,
-    0x85,
-    0x56,
-    0x49,
-    0xaf,
-    0x71,
-    0x3c,
-    0xd6,
-    0x87,
-    0xa6,
-    0xaa,
-    0xa8,
-    0xfe,
-    0xc1,
-    0x13,
-    0x76,
-    0xb6,
-    0x6e,
-    0xca,
-    0x58,
-    0x3d,
-    0x94,
-    0x68,
-    0x93,
-    0x90,
-    0xcd,
-    0x6d,
-    0xb3,
-    0xdd,
-    0x19,
-    0x2a,
-    0xdb,
-    0x8d,
-    0xd3,
-    0xde,
-    0x5a,
-    0x82,
-    0xe4,
-    0x1f,
-    0x7e,
-    0x9d,
-    0x36,
-    0x7b,
-    0xad,
-    0x84,
-    0x6c,
-    0x60,
-    0xb1,
-    0xa2,
-    0xd0,
-    0x39,
-    0x54,
-    0x6f,
-    0x8c,
-    0xda,
-    0x2d,
-    0xf1,
-    0x1e,
-    0x1e,
-    0xb9,
-    0x83,
-    0x06,
-    0xce,
-    0xae,
-    0xd5,
-    0xc1,
-    0xc5,
-    0x8b,
-    0x34,
-    0xfb,
-    0x52,
-    0x74,
-    0x0b,
-    0x01,
-    0xde,
-    0x3d,
-    0xaa,
-    0x75,
-    0xcf,
-    0xc5,
-    0x47,
-    0x45,
-    0xac,
-    0x85,
-    0x42,
-    0xdd,
-    0x81,
-    0x68,
-    0xae,
-    0x9c,
-    0x85,
-    0xdd,
-    0x0c,
-    0x85,
-    0xfa,
-    0x2b,
-    0x59,
-    0x38,
-    0x55,
-    0x06,
-    0x4c,
-    0x20,
-    0x9f,
-    0x5f,
-    0xd9,
-    0xed,
-    0x1b,
-    0x80,
-    0xf9,
-    0x45,
-    0x29,
-    0x57,
-    0xad,
-    0xb6,
-    0x6a,
-    0x12,
-    0x40,
-    0xf0,
-    0x25,
-    0xed,
-    0xcd,
-    0x31,
-    0xe9,
-    0x48,
-    0x02,
-    0x00,
-    0x74,
-    0xfd,
-    0x23,
-    0x1e,
-    0xd4,
-    0xf0,
-    0x52,
-    0xba,
-    0xcc,
-    0xe8,
-    0x0d,
-    0xe4,
-    0x79,
-    0x9d,
-    0xf8,
-    0x44,
-    0x35,
-    0x12,
-    0xdd,
-    0x0c,
-    0xbc,
-    0x24,
-    0xf1,
-    0x2b,
-    0x8e,
-    0x63,
-    0x59,
-    0xc4,
-    0x94,
-    0x22,
-    0xec,
-    0xde,
-    0x05,
-    0xca,
-    0x3b,
-    0x5d,
-    0x8b,
-    0x74,
-    0xce,
-    0x31,
-    0xa2,
-    0xb6,
-    0xb1,
-    0xcd,
-    0x41,
-    0xbc,
-    0x30,
-    0xda,
-    0xbd,
-    0x9b,
-    0xde,
-    0x2d,
-    0xea,
-    0xe3,
-    0xdc,
-    0xf7,
-    0x83,
-    0x73,
-    0x57,
-    0x3c,
-    0xcc,
-    0x92,
-    0x53,
-    0x87,
-    0x75,
-    0x3b,
-    0xa7,
-    0xdb,
-    0xc2,
-    0xb7,
-    0x49,
-    0xec,
-    0xe9,
-    0x72,
-    0xcc,
-    0x8f,
-    0xbc,
-    0x07,
-    0x27,
-    0x70,
-    0x87,
-    0x9d,
-    0xb8,
-    0x03,
-    0x3c,
-    0x76,
-    0x89,
-    0xbd,
-    0xcd,
-    0xc5,
-    0xd1,
-    0x83,
-    0xda,
-    0xc0,
-    0xbe,
-    0x63,
-    0x8c,
-    0xf7,
-    0x71,
-    0x82,
-    0xc1,
-    0xe4,
-    0x4b,
-    0x55,
-    0x69,
-    0xc3,
-    0x67,
-    0x14,
-    0x2f,
-    0xa4,
-    0x67,
-    0x6c,
-    0x5d,
-    0xbe,
-    0x74,
-    0x75,
-    0xf9,
-    0x06,
-    0x80,
-    0xe3,
-    0x34,
-    0x00,
-    0xce,
-    0x80,
-    0x06,
-    0xd5,
-    0xb5,
-    0xda,
-    0x12,
-    0xa7,
-    0xa1,
-    0x38,
-    0xcf,
-    0x21,
-    0x5a,
-    0xd3,
-    0xe9,
-    0x52,
-    0x89,
-    0x43,
-    0xe5,
-    0xbb,
-    0x78,
-    0x38,
-    0x05,
-    0xa6,
-    0x19,
-    0x6a,
-    0x6b,
-    0xba,
-    0x4a,
-    0xd3,
-    0x80,
-    0xcd,
-    0x57,
-    0x1b,
-    0x97,
-    0xf9,
-    0xc0,
-    0x54,
-    0xce,
-    0xf2,
-    0x3d,
-    0xe7,
-    0x35,
-    0x96,
-    0x00,
-    0xce,
-    0x33,
-    0xc6,
-    0x3a,
-    0x04,
-    0x25,
-    0x75,
-    0xe0,
-    0x3a,
-    0x47,
-    0xfe,
-    0xaf,
-    0xcc,
-    0xd8,
-    0xbb,
-    0x6e,
-    0xf3,
-    0x79,
-    0xd3,
-    0x73,
-    0x3c,
-    0xd7,
-    0x53,
-    0x68,
-    0x39,
-    0x89,
-    0x81,
-    0x4f,
-    0x76,
-    0x3c,
-    0x6d,
-    0xc4,
-    0xae,
-    0x0d,
-    0xc8,
-    0x82,
-    0x3f,
-    0x36,
-    0xf9,
-    0x29,
-    0xdc,
-    0xed,
-    0x6e,
-    0x3f,
-    0x82,
-    0x89,
-    0x30,
-    0x74,
-    0xad,
-    0xe7,
-    0xbb,
-    0x2a,
-    0xcb,
-    0x0c,
-    0x0c,
-    0x34,
-    0xf1,
-    0x0b,
-    0xfb,
-    0xde,
-    0xcd,
-    0x29,
-    0xcb,
-    0x2e,
-    0xdc,
-    0x40,
-    0x00,
-    0x6a,
-    0xdc,
-    0x61,
-    0x70,
-    0xda,
-    0x85,
-    0xbd,
-    0x9d,
-    0xcf,
-    0x74,
-    0xc6,
-    0x42,
-    0xe5,
-    0x68,
-    0x91,
-    0x2c,
-    0x84,
-    0xb0,
-    0x7f,
-    0x4b,
-    0xad,
-    0xe4,
-    0x1c,
-    0x09,
-    0xf3,
-    0xd4,
-    0x47,
-    0xda,
-    0xc7,
-    0xbe,
-    0x94,
-    0x15,
-    0xf9,
-    0xc4,
-    0xee,
-    0x02,
-    0x7c,
-    0x9c,
-    0x81,
-    0x34,
-    0x6a,
-    0x8a,
-    0xd7,
-    0x19,
-    0x47,
-    0x8b,
-    0x40,
-    0xcf,
-    0x8a,
-    0xd3,
-    0x78,
-    0x39,
-    0x59,
-    0x7a,
-    0x84,
-    0x53,
-    0x95,
-    0x73,
-    0xdd,
-    0xc2,
-    0x16,
-    0xbd,
-    0xd0,
-    0xb0,
-    0x38,
-    0xdd,
-    0x25,
-    0xd6,
-    0x96,
-    0x8b,
-    0xff,
-    0xda,
-    0x15,
-    0xac,
-    0x03,
-    0xdc,
-    0x25,
-    0x80,
-    0xbc,
-    0x4c,
-    0x43,
-    0x1d,
-    0x3e,
-    0xfe,
-    0xc2,
-    0x1c,
-    0x0a,
-    0x80,
-    0xcc,
-    0x92,
-    0x32,
-    0xab,
-    0xa4,
-    0x42,
-    0xbe,
-    0x78,
-    0x2d,
-    0x10,
-    0x4d,
-    0x15,
-    0xb0,
-    0xb9,
-    0x00,
-    0x38,
-    0xda,
-    0xc2,
-    0x93,
-    0xb4,
-    0x04,
-    0xae,
-    0xcd,
-    0x4a,
-    0xb8,
-    0x74,
-    0x1b,
-    0xc1,
-    0x70,
-    0x30,
-    0x78,
-    0x38,
-    0xa0,
-    0x19,
-    0x8f,
-    0xbc,
-    0xf7,
-    0xb3,
-    0x24,
-    0x16,
-    0xe2,
-    0x46,
-    0xb0,
-    0xe6,
-    0x53,
-    0x8e,
-    0x4b,
-    0xf6,
-    0xc0,
-    0xb4,
-    0xcf,
-    0xc8,
-    0x6e,
-    0x7d,
-    0x3b,
-    0x71,
-    0xef,
-    0xc2,
-    0x55,
-    0xaa,
-    0xea,
-    0x20,
-    0x94,
-    0x25,
-    0x1a,
-    0xf0,
-    0x3c,
-    0x1d,
-    0x99,
-    0x79,
-    0xcb,
-    0x31,
-    0x5f,
-    0x65,
-    0x94,
-    0x72,
-    0x05,
-    0x72,
-    0xaa,
-    0xbb,
-    0xcf,
-    0x6a,
-    0xff,
-    0x41,
-    0xea,
-    0x55,
-    0xcd,
-    0x6a,
-    0xf2,
-    0xed,
-    0x35,
-    0xe3,
-    0xb8,
-    0x52,
-    0x27,
-    0xed,
-    0x41,
-    0xff,
-    0x81,
-    0xf7,
-    0x12,
-    0xfd,
-    0x7b,
-    0x72,
-    0xaa,
-    0x56,
-    0x42,
-    0xe1,
-    0x51,
-    0xcd,
-    0xe3,
-    0x2f,
-    0x10,
-    0xcc,
-    0x6b,
-    0x46,
-    0x01,
-    0x9e,
-    0x4c,
-    0xdd,
-    0xc9,
-    0xde,
-    0x03,
-    0x91,
-    0x62,
-    0x30,
-    0xf8,
-    0x38,
-    0x1e,
-    0x2f,
-    0xa6,
-    0x72,
-    0xe8,
-    0xa6,
-    0xfb,
-    0x80,
-    0xcd,
-    0x02,
-    0x02,
-    0x5a,
-    0xbc,
-    0x07,
-    0xbf,
-    0xfb,
-    0x8a,
-    0xc3,
-    0x5b,
-    0x00,
-    0x39,
-    0xc0,
-    0x81,
-    0x71,
-    0x7a,
-    0x7e,
-    0x07,
-    0xdf,
-    0x70,
-    0x20,
-    0xd1,
-    0xaf,
-    0xb7,
-    0x66,
-    0xf2,
-    0xb5,
-    0xa5,
-    0xdb,
-    0x15,
-    0x05,
-    0xd0,
-    0x50,
-    0x1c,
-    0x05,
-    0xd0,
-    0x88,
-    0x06,
-    0xc7,
-    0x46,
-    0x35,
-    0x16,
-    0x96,
-    0x1d,
-    0x23,
-    0x31,
-    0xcf,
-    0x0f,
-    0xb4,
-    0x89,
-    0xf3,
-    0x6b,
-    0x8c,
-    0x78,
-    0xf9,
-    0x16,
-    0x8d,
-    0xae,
-    0xe9,
-    0xd0,
-    0x06,
-    0x8f,
-    0xa6,
-    0xb9,
-    0x27,
-    0xd7,
-    0x0b,
-    0x14,
-    0xb9,
-    0x80,
-    0x3a,
-    0x4a,
-    0x0c,
-    0xe5,
-    0x31,
-    0x32,
-    0x30,
-    0x27,
-    0x9f,
-    0x8f,
-    0x67,
-    0xd0,
-    0xf5,
-    0xdb,
-    0xdb,
-    0xb6,
-    0xbf,
-    0x43,
-    0x8d,
-    0x23,
-    0x35,
-    0xf2,
-    0x8e,
-    0x32,
-    0x0d,
-    0x92,
-    0x71,
-    0x7c,
-    0x94,
-    0x10,
-    0x00,
-    0xf4,
-    0xfd,
-    0xa0,
-    0x2e,
-    0x10,
-    0xf9,
-    0x02,
-    0x4d,
-    0x2a,
-    0x88,
-    0x03,
-    0x81,
-    0x25,
-    0x0e,
-    0x46,
-    0x75,
-    0x53,
-    0xa9,
-    0x44,
-    0x4c,
-    0x96,
-    0xc2,
-    0x92,
-    0xdb,
-    0xc6,
-    0xe2,
-    0x63,
-    0x15,
-    0x53,
-    0xc7,
-    0x4d,
-    0xc6,
-    0x2c,
-    0xb8,
-    0x50,
-    0x85,
-    0xdf,
-    0x15,
-    0x14,
-    0xe3,
-    0x01,
-    0x32,
-    0x72,
-    0xe9,
-    0xd0,
-    0x65,
-    0x36,
-    0xc2,
-    0x17,
-    0x5e,
-    0x23,
-    0xb4,
-    0x52,
-    0xb7,
-    0x38,
-    0x55,
-    0x13,
-    0xcc,
-    0x32,
-    0xfb,
-    0xa4,
-    0xcd,
-    0x52,
-    0x74,
-    0xee,
-    0x12,
-    0x60,
-    0xf7,
-    0x99,
-    0xae,
-    0xf0,
-    0x5b,
-    0x75,
-    0x46,
-    0xe4,
-    0x87,
-    0x19,
-    0x24,
-    0x32,
-    0x2a,
-    0xca,
-    0x87,
-    0xe8,
-    0xac,
-    0x9e,
-    0x3d,
-    0x6d,
-    0x64,
-    0xe0,
-    0x74,
-    0x09,
-    0x0b,
-    0xb7,
-    0xce,
-    0xa7,
-    0x70,
-    0x03,
-    0xb3,
-    0xda,
-    0x6e,
-    0x88,
-    0xeb,
-    0x1f,
-    0x1b,
-    0x4e,
-    0x6c,
-    0x62,
-    0x43,
-    0x47,
-    0x70,
-    0xc3,
-    0x15,
-    0x33,
-    0xcb,
-    0x99,
-    0x1b,
-    0xc1,
-    0x7c,
-    0xb7,
-    0x70,
-    0xf7,
-    0x82,
-    0xef,
-    0x2d,
-    0xd3,
-    0xf1,
-    0xd5,
-    0x24,
-    0x33,
-    0x44,
-    0xc5,
-    0xd1,
-    0xf2,
-    0xf5,
-    0x28,
-    0x8d,
-    0x54,
-    0x4b,
-    0xf2,
-    0x05,
-    0xa4,
-    0x74,
-    0x6f,
-    0xeb,
-    0x1b,
-    0xd3,
-    0x40,
-    0xeb,
-    0x04,
-    0x9b,
-    0xa1,
-    0xe1,
-    0x1e,
-    0x9d,
-    0xed,
-    0x49,
-    0x42,
-    0x5e,
-    0x63,
-    0xf6,
-    0x45,
-    0x6d,
-    0x2a,
-    0x08,
-    0x20,
-    0xf3,
-    0x93,
-    0x18,
-    0x4e,
-    0x8c,
-    0x9f,
-    0xb5,
-    0x76,
-    0x55,
-    0xc1,
-    0x14,
-    0x4a,
-    0x47,
-    0xe4,
-    0x03,
-    0xaf,
-    0xc3,
-    0xb0,
-    0x1f,
-    0x1e,
-    0x6d,
-    0x09,
-    0x47,
-    0x4a,
-    0x3e,
-    0xd9,
-    0x50,
-    0x03,
-    0xd5,
-    0x10,
-    0xfa,
-    0x5a,
-    0x0e,
-    0xe9,
-    0x23,
-    0x06,
-    0xd6,
-    0x6e,
-    0x3b,
-    0x06,
-    0x3e,
-    0x3e,
-    0xf8,
-    0x88,
-    0xce,
-    0x8e,
-    0x4b,
-    0x0a,
-    0x1b,
-    0x6e,
-    0x92,
-    0xbf,
-    0x9b,
-    0x4d,
-    0x0f,
-    0x34,
-    0xb9,
-    0xc0,
-    0x99,
-    0x33,
-    0x25,
-    0x7f,
-    0x91,
-    0xe8,
-    0x6e,
-    0xb0,
-    0x18,
-    0x42,
-    0xd2,
-    0x69,
-    0x7f,
-    0x9c,
-    0x55,
-    0x70,
-    0xff,
-    0x9d,
-    0x10,
-    0x45,
-    0xab,
-    0x5c,
-    0xcc,
-    0x62,
-    0xa2,
-    0xc8,
-    0xcf,
-    0xc1,
-    0x89,
-    0x48,
-    0xf6,
-    0x9f,
-    0x39,
-    0x9e,
-    0x04,
-    0x80,
-    0xb4,
-    0x11,
-    0x3a,
-    0x73,
-    0x5e,
-    0xcb,
-    0x28,
-    0x97,
-    0x6a,
-    0x80,
-    0xc2,
-    0xde,
-    0x92,
-    0x50,
-    0xb6,
-    0x11,
-    0x0b,
-    0xef,
-    0xfd,
-    0x14,
-    0xb8,
-    0x03,
-    0xb0,
-    0x6c,
-    0x9e,
-    0xcd,
-    0x1e,
-    0xfe,
-    0x98,
-    0x0c,
-    0x1b,
-    0x19,
-    0x4b,
-    0x1e,
-    0x9b,
-    0xb7,
-    0x5d,
-    0x69,
-    0x7f,
-    0x00,
-    0xe2,
-    0xf9
-  ],
-  const [
-    0x09,
-    0xeb,
-    0xb3,
-    0x46,
-    0x3b,
-    0x01,
-    0xb2,
-    0xc4,
-    0x92,
-    0xca,
-    0x2b,
-    0x1f,
-    0x6a,
-    0xc7,
-    0xe6,
-    0x14,
-    0x5e,
-    0xb4,
-    0x06,
-    0x46,
-    0x53,
-    0x72,
-    0x30,
-    0xd5,
-    0xb9,
-    0x45,
-    0xef,
-    0x33,
-    0x0d,
-    0x3f,
-    0x57,
-    0x33,
-    0xa2,
-    0xfc,
-    0xe9,
-    0x63,
-    0xa2,
-    0x90,
-    0xb7,
-    0x9c,
-    0x4f,
-    0xbe,
-    0xc9,
-    0xd7,
-    0x8f,
-    0x6b,
-    0xbe,
-    0x42,
-    0xa8,
-    0x51,
-    0xb6,
-    0x94,
-    0x48,
-    0xf8,
-    0x70,
-    0x9d,
-    0xc8,
-    0xe2,
-    0xb0,
-    0x21,
-    0xb1,
-    0x06,
-    0xe4,
-    0xe6,
-    0x80,
-    0x81,
-    0x06,
-    0x0c,
-    0xa6,
-    0x87,
-    0xc4,
-    0x9d,
-    0xd3,
-    0x9f,
-    0xdf,
-    0x65,
-    0x74,
-    0x10,
-    0xd1,
-    0x04,
-    0x7b,
-    0x96,
-    0xb2,
-    0x41,
-    0x5e,
-    0x5a,
-    0x5c,
-    0xa1,
-    0x62,
-    0x21,
-    0xce,
-    0x39,
-    0x19,
-    0xc4,
-    0xce,
-    0xc0,
-    0x29,
-    0xe0,
-    0xd3,
-    0xe8,
-    0x50,
-    0xce,
-    0x21,
-    0xee,
-    0xa5,
-    0xd6,
-    0x36,
-    0x70,
-    0x21,
-    0x9f,
-    0x65,
-    0x80,
-    0x5d,
-    0xea,
-    0xc1,
-    0xf6,
-    0x9d,
-    0x80,
-    0x3c,
-    0x0a,
-    0x0e,
-    0x69,
-    0x10,
-    0x22,
-    0x4c,
-    0x5f,
-    0x5e,
-    0xe8,
-    0x27,
-    0x83,
-    0x15,
-    0xa0,
-    0xa7,
-    0x4e,
-    0x16,
-    0xb9,
-    0x4e,
-    0xc9,
-    0x96,
-    0xa1,
-    0x9c,
-    0x01,
-    0xc3,
-    0xde,
-    0xd9,
-    0xb5,
-    0xaa,
-    0x5b,
-    0x0e,
-    0x53,
-    0x58,
-    0xff,
-    0x55,
-    0x23,
-    0x3f,
-    0x84,
-    0x52,
-    0xc1,
-    0xdc,
-    0x87,
-    0x02,
-    0xd0,
-    0x97,
-    0xdb,
-    0xb3,
-    0xed,
-    0xeb,
-    0x23,
-    0x54,
-    0xe2,
-    0xc6,
-    0xa0,
-    0xef,
-    0x1c,
-    0x33,
-    0x47,
-    0x74,
-    0x60,
-    0x36,
-    0x17,
-    0xb8,
-    0xb9,
-    0xf7,
-    0xa9,
-    0xbd,
-    0xb5,
-    0x23,
-    0x09,
-    0x34,
-    0xd0,
-    0x90,
-    0xc4,
-    0x40,
-    0x31,
-    0x20,
-    0x42,
-    0x7d,
-    0x94,
-    0xe7,
-    0x56,
-    0x41,
-    0x88,
-    0x90,
-    0x14,
-    0x22,
-    0xda,
-    0xfc,
-    0xe3,
-    0xb8,
-    0x51,
-    0x2d,
-    0xd3,
-    0xa4,
-    0x9b,
-    0x63,
-    0x30,
-    0xd0,
-    0x88,
-    0x84,
-    0x57,
-    0xf9,
-    0x76,
-    0xc1,
-    0xc8,
-    0x6b,
-    0x0d,
-    0x77,
-    0x7d,
-    0x0c,
-    0x2c,
-    0x53,
-    0x7a,
-    0x9c,
-    0x22,
-    0xba,
-    0xa6,
-    0x3b,
-    0x22,
-    0x68,
-    0xd9,
-    0x2c,
-    0xf1,
-    0x57,
-    0x36,
-    0xd8,
-    0xe2,
-    0xe2,
-    0xbb,
-    0x16,
-    0x04,
-    0x2a,
-    0x16,
-    0xa9,
-    0x9a,
-    0xb9,
-    0xba,
-    0x0a,
-    0xcb,
-    0x65,
-    0x33,
-    0x69,
-    0x9b,
-    0x77,
-    0xb6,
-    0xee,
-    0x1a,
-    0x0d,
-    0xfd,
-    0x44,
-    0xdb,
-    0xbd,
-    0x52,
-    0x58,
-    0xa8,
-    0x7b,
-    0xe9,
-    0x5e,
-    0x74,
-    0xbd,
-    0x72,
-    0x16,
-    0x91,
-    0xdd,
-    0xef,
-    0x4d,
-    0x24,
-    0xbe,
-    0xc3,
-    0xa6,
-    0xd5,
-    0xb2,
-    0x0c,
-    0x9a,
-    0xcb,
-    0x9b,
-    0x33,
-    0xbe,
-    0xd7,
-    0x51,
-    0xc2,
-    0x44,
-    0xef,
-    0x44,
-    0x75,
-    0xc5,
-    0xdf,
-    0x63,
-    0x93,
-    0x3e,
-    0x3b,
-    0x3c,
-    0x7e,
-    0x58,
-    0x98,
-    0x64,
-    0x89,
-    0xec,
-    0xfb,
-    0x19,
-    0x0b,
-    0xc6,
-    0x92,
-    0x26,
-    0xb2,
-    0xa9,
-    0xa2,
-    0x07,
-    0x19,
-    0x94,
-    0xc1,
-    0x4e,
-    0x9c,
-    0x44,
-    0x45,
-    0x45,
-    0x6b,
-    0xfa,
-    0xfc,
-    0xd5,
-    0xdd,
-    0x7e,
-    0x1e,
-    0xa6,
-    0x07,
-    0x64,
-    0x7f,
-    0x88,
-    0x8e,
-    0x8e,
-    0x09,
-    0x12,
-    0xb9,
-    0xf2,
-    0x6a,
-    0x88,
-    0xca,
-    0x9d,
-    0x0a,
-    0x02,
-    0x8f,
-    0xf8,
-    0x40,
-    0xcb,
-    0x34,
-    0x4b,
-    0xc5,
-    0x08,
-    0x5b,
-    0x7f,
-    0x69,
-    0x9a,
-    0x6e,
-    0x28,
-    0x04,
-    0x45,
-    0x34,
-    0xc3,
-    0xb0,
-    0x11,
-    0xa3,
-    0x3b,
-    0x35,
-    0xf0,
-    0xf6,
-    0xb3,
-    0xc5,
-    0xa2,
-    0xff,
-    0x7f,
-    0xea,
-    0xd6,
-    0xbd,
-    0x73,
-    0xbc,
-    0x92,
-    0x31,
-    0x61,
-    0x57,
-    0xd4,
-    0x6e,
-    0xdd,
-    0x8c,
-    0x7a,
-    0xf0,
-    0x43,
-    0xd7,
-    0x5f,
-    0x2e,
-    0xfc,
-    0x91,
-    0xc7,
-    0x72,
-    0xfc,
-    0x67,
-    0xfd,
-    0xe9,
-    0x8f,
-    0x0b,
-    0x3a,
-    0xf6,
-    0x56,
-    0x29,
-    0xc9,
-    0xcc,
-    0x8c,
-    0x9d,
-    0x69,
-    0x3c,
-    0x8e,
-    0xe3,
-    0xf3,
-    0xcb,
-    0x9b,
-    0xcf,
-    0x3c,
-    0x08,
-    0xd8,
-    0x7e,
-    0x3d,
-    0x1d,
-    0x97,
-    0x8c,
-    0x71,
-    0xa3,
-    0xd8,
-    0x87,
-    0x7f,
-    0xbb,
-    0x10,
-    0xa4,
-    0x19,
-    0x5a,
-    0x2a,
-    0xb1,
-    0x24,
-    0xe4,
-    0xcc,
-    0x4b,
-    0x19,
-    0xfd,
-    0xdb,
-    0x51,
-    0xab,
-    0x9c,
-    0x41,
-    0x99,
-    0xaa,
-    0x60,
-    0xee,
-    0xe1,
-    0x27,
-    0x28,
-    0x1c,
-    0x08,
-    0xd9,
-    0xde,
-    0xd8,
-    0x7e,
-    0xbf,
-    0x93,
-    0xbe,
-    0xf9,
-    0x07,
-    0xd1,
-    0x04,
-    0x69,
-    0x2f,
-    0x2c,
-    0xba,
-    0x2f,
-    0x6a,
-    0x1b,
-    0x4f,
-    0x89,
-    0x45,
-    0x06,
-    0x58,
-    0x51,
-    0x8a,
-    0xa0,
-    0x8d,
-    0xe8,
-    0x64,
-    0x77,
-    0x14,
-    0x6d,
-    0xc5,
-    0xca,
-    0x03,
-    0x32,
-    0x05,
-    0x9a,
-    0x20,
-    0x70,
-    0xcc,
-    0x03,
-    0xeb,
-    0x39,
-    0x31,
-    0xcd,
-    0xde,
-    0xaf,
-    0x23,
-    0x3f,
-    0xf3,
-    0x74,
-    0x08,
-    0x33,
-    0x67,
-    0x61,
-    0xa5,
-    0x70,
-    0xbd,
-    0x7b,
-    0x3e,
-    0x33,
-    0x07,
-    0x22,
-    0xfe,
-    0x0f,
-    0x61,
-    0x8c,
-    0x99,
-    0xf7,
-    0xbe,
-    0x72,
-    0x2f,
-    0x9a,
-    0xe7,
-    0x09,
-    0x74,
-    0xef,
-    0xc0,
-    0x34,
-    0x0e,
-    0x10,
-    0xcd,
-    0xf8,
-    0x3e,
-    0x4b,
-    0xf6,
-    0x30,
-    0xc3,
-    0x76,
-    0x87,
-    0x82,
-    0xfb,
-    0x84,
-    0x7b,
-    0x91,
-    0x4c,
-    0x56,
-    0xfa,
-    0x74,
-    0xc2,
-    0xd3,
-    0x20,
-    0x68,
-    0xf9,
-    0x3b,
-    0x00,
-    0xc1,
-    0x3e,
-    0xb8,
-    0xe9,
-    0x27,
-    0xf1,
-    0x37,
-    0xe8,
-    0xfe,
-    0x2d,
-    0x75,
-    0x8d,
-    0x26,
-    0xac,
-    0x5d,
-    0xf2,
-    0xe5,
-    0xe4,
-    0x91,
-    0xfa,
-    0x21,
-    0x76,
-    0x47,
-    0xd7,
-    0xd3,
-    0xc9,
-    0x56,
-    0xcf,
-    0xb8,
-    0xf2,
-    0x90,
-    0x3f,
-    0x4a,
-    0xd8,
-    0x53,
-    0xe0,
-    0xee,
-    0x95,
-    0x5b,
-    0x49,
-    0x6f,
-    0x1f,
-    0xda,
-    0xb5,
-    0xab,
-    0x27,
-    0xcb,
-    0x07,
-    0x8c,
-    0x41,
-    0x83,
-    0x0b,
-    0x3a,
-    0x46,
-    0x89,
-    0xff,
-    0x8f,
-    0xf6,
-    0xa7,
-    0x52,
-    0xcc,
-    0xe2,
-    0x41,
-    0xab,
-    0x8a,
-    0x8a,
-    0xe6,
-    0x2d,
-    0xf3,
-    0xc2,
-    0x25,
-    0xfa,
-    0x31,
-    0x5a,
-    0xa2,
-    0xf5,
-    0x27,
-    0xfd,
-    0x69,
-    0xcd,
-    0x5f,
-    0x5a,
-    0x81,
-    0x37,
-    0x44,
-    0x82,
-    0xc5,
-    0x7a,
-    0x92,
-    0x91,
-    0xef,
-    0x31,
-    0x0a,
-    0x91,
-    0xf6,
-    0x4c,
-    0x6a,
-    0x9b,
-    0x9a,
-    0x59,
-    0x9c,
-    0x3f,
-    0x3c,
-    0x02,
-    0x2e,
-    0x27,
-    0xf4,
-    0xd6,
-    0x02,
-    0xf6,
-    0xde,
-    0x4c,
-    0x47,
-    0x76,
-    0xb4,
-    0x04,
-    0xa7,
-    0xf3,
-    0xa2,
-    0x51,
-    0xc2,
-    0xe2,
-    0x55,
-    0xf5,
-    0xdc,
-    0xc7,
-    0x56,
-    0x2b,
-    0xd2,
-    0x55,
-    0x96,
-    0xeb,
-    0x53,
-    0xd6,
-    0x4a,
-    0x69,
-    0x4c,
-    0xcd,
-    0xf8,
-    0xdf,
-    0xa4,
-    0xda,
-    0xd2,
-    0x8c,
-    0x2a,
-    0xdf,
-    0x44,
-    0xfc,
-    0xcc,
-    0x61,
-    0xc9,
-    0x8b,
-    0x09,
-    0x31,
-    0x02,
-    0x25,
-    0xa9,
-    0x4b,
-    0x09,
-    0x4f,
-    0xab,
-    0xfe,
-    0x03,
-    0x6b,
-    0x7f,
-    0x4d,
-    0xf4,
-    0x37,
-    0x75,
-    0x96,
-    0xd8,
-    0x98,
-    0x76,
-    0x71,
-    0xef,
-    0x96,
-    0xf2,
-    0xdb,
-    0x58,
-    0xa7,
-    0x19,
-    0x94,
-    0xe1,
-    0x30,
-    0x4e,
-    0xc5,
-    0x1e,
-    0x49,
-    0xd8,
-    0xe6,
-    0xb8,
-    0xc1,
-    0xdb,
-    0xdf,
-    0x08,
-    0x61,
-    0x87,
-    0x6d,
-    0xe4,
-    0x75,
-    0x90,
-    0xc8,
-    0xb9,
-    0x89,
-    0xde,
-    0x83,
-    0xda,
-    0x71,
-    0x85,
-    0xb3,
-    0x18,
-    0x8c,
-    0xf7,
-    0x53,
-    0x93,
-    0x49,
-    0x79,
-    0xe7,
-    0xd0,
-    0xe9,
-    0xd3,
-    0x60,
-    0x0b,
-    0x87,
-    0x4c,
-    0x40,
-    0xce,
-    0x56,
-    0xd5,
-    0xfe,
-    0xc2,
-    0x2b,
-    0x85,
-    0xac,
-    0xc6,
-    0x3b,
-    0x45,
-    0xd7,
-    0x3e,
-    0x25,
-    0xcd,
-    0xaf,
-    0xad,
-    0x33,
-    0xcf,
-    0x67,
-    0x87,
-    0xdc,
-    0x71,
-    0xdf,
-    0x40,
-    0x8e,
-    0x01,
-    0x81,
-    0xa9,
-    0xab,
-    0xe4,
-    0x69,
-    0x7c,
-    0xd2,
-    0xd0,
-    0xc8,
-    0x35,
-    0x5f,
-    0x3c,
-    0x8a,
-    0x24,
-    0x35,
-    0x14,
-    0x36,
-    0xc1,
-    0xbb,
-    0xb0,
-    0x16,
-    0x3f,
-    0x24,
-    0x07,
-    0x99,
-    0x64,
-    0xf4,
-    0x20,
-    0xf5,
-    0x97,
-    0xbf,
-    0xca,
-    0x10,
-    0x3b,
-    0x34,
-    0x8d,
-    0xa1,
-    0x3b,
-    0x5b,
-    0xe0,
-    0x92,
-    0xe6,
-    0x1b,
-    0x9c,
-    0xaa,
-    0xfe,
-    0xff,
-    0xb1,
-    0x68,
-    0x0b,
-    0x3a,
-    0x18,
-    0x32,
-    0xf5,
-    0xe8,
-    0x09,
-    0xaf,
-    0xd2,
-    0x96,
-    0x6d,
-    0x71,
-    0xfd,
-    0x05,
-    0x96,
-    0xd7,
-    0x68,
-    0x2b,
-    0x2e,
-    0x31,
-    0x33,
-    0x7b,
-    0x6d,
-    0x26,
-    0x7d,
-    0x66,
-    0x8f,
-    0x53,
-    0x7a,
-    0x22,
-    0x86,
-    0x35,
-    0xc5,
-    0xaa,
-    0xec,
-    0x49,
-    0xf8,
-    0x06,
-    0x3b,
-    0x71,
-    0x7b,
-    0xcc,
-    0x40,
-    0x9a,
-    0x99,
-    0xe7,
-    0xcd,
-    0x9c,
-    0xd9,
-    0x97,
-    0xaf,
-    0x61,
-    0x8b,
-    0xb9,
-    0xdf,
-    0x4a,
-    0xa1,
-    0x49,
-    0xfd,
-    0xce,
-    0xc0,
-    0x25,
-    0xf9,
-    0x65,
-    0x97,
-    0x13,
-    0x14,
-    0xa4,
-    0x70,
-    0x06,
-    0x07,
-    0xa9,
-    0x04,
-    0x9d,
-    0x81,
-    0xb9,
-    0x94,
-    0xed,
-    0xd7,
-    0x28,
-    0x35,
-    0x80,
-    0xf7,
-    0x79,
-    0x6c,
-    0x9d,
-    0x9f,
-    0xc7,
-    0xfa,
-    0xca,
-    0xcc,
-    0x64,
-    0xf9,
-    0x90,
-    0x74,
-    0xbf,
-    0x28,
-    0x7e,
-    0x77,
-    0x8b,
-    0x84,
-    0x71,
-    0xd4,
-    0x1d,
-    0x18,
-    0x12,
-    0x18,
-    0x16,
-    0x15,
-    0x9f,
-    0x1d,
-    0x43,
-    0x25,
-    0xef,
-    0xf0,
-    0xc1,
-    0xfd,
-    0xb0,
-    0x13,
-    0x65,
-    0x31,
-    0xf4,
-    0xe5,
-    0x5a,
-    0x4d,
-    0xec,
-    0x5e,
-    0x0c,
-    0x21,
-    0xf2,
-    0xff,
-    0x45,
-    0x5c,
-    0xcd,
-    0x09,
-    0x96,
-    0x5d,
-    0x31,
-    0xee,
-    0xf9,
-    0x45,
-    0x86,
-    0x05,
-    0xb4,
-    0x51,
-    0xea,
-    0x81,
-    0x81,
-    0x67,
-    0x79,
-    0xa4,
-    0xeb,
-    0xee,
-    0xcc,
-    0x30,
-    0xfb,
-    0xe3,
-    0xbf,
-    0x1f,
-    0x14,
-    0x29,
-    0x78,
-    0x93,
-    0x1c,
-    0x21,
-    0xa5,
-    0x10,
-    0xdc,
-    0x7b,
-    0x04,
-    0xe9,
-    0xaa,
-    0x4c,
-    0x29,
-    0xf8,
-    0x45,
-    0x60,
-    0x7c,
-    0x92,
-    0x00,
-    0xd1,
-    0x81,
-    0xba,
-    0x23,
-    0xd8,
-    0x5c,
-    0x95,
-    0x8e,
-    0xe4,
-    0x94,
-    0x1f,
-    0x9f,
-    0xe9,
-    0x17,
-    0x1b,
-    0x56,
-    0xfb,
-    0x7e,
-    0x50,
-    0xb7,
-    0x1b,
-    0x93,
-    0xf2,
-    0x70,
-    0x51,
-    0x10,
-    0x5f,
-    0xbc,
-    0xfb,
-    0xaa,
-    0x0c,
-    0x87,
-    0x64,
-    0x4e,
-    0xbe,
-    0xd3,
-    0x98,
-    0xab,
-    0xfd,
-    0x5a,
-    0x77,
-    0xf0,
-    0xc5,
-    0x75,
-    0x09,
-    0xd7,
-    0x80,
-    0x3c,
-    0x11,
-    0xe2,
-    0x31,
-    0xef,
-    0xe5,
-    0xe4,
-    0xf2,
-    0x95,
-    0x7c,
-    0xc4,
-    0xa0,
-    0xe2,
-    0xc9,
-    0x7e,
-    0xd5,
-    0x5e,
-    0x47,
-    0x6a,
-    0x16,
-    0xc4,
-    0xd6,
-    0xc1,
-    0x4e,
-    0xa8,
-    0xc5,
-    0x5d,
-    0x7b,
-    0x5d,
-    0x30,
-    0xc0,
-    0xa8,
-    0x16,
-    0x8c,
-    0x58,
-    0x1b,
-    0x4b,
-    0x80,
-    0x02,
-    0xcf,
-    0x5f,
-    0xf6,
-    0xcc,
-    0x25,
-    0x7f,
-    0x73,
-    0xff,
-    0xd6,
-    0xcd,
-    0xa3,
-    0x5d,
-    0x2c,
-    0xbe,
-    0x39,
-    0xa7,
-    0x72,
-    0xc0,
-    0xf6,
-    0x62,
-    0xa9,
-    0x21,
-    0x06,
-    0xdb,
-    0x7c,
-    0x2c,
-    0x93,
-    0x69,
-    0x76,
-    0x95,
-    0x95,
-    0xf2,
-    0x73,
-    0x17,
-    0xe7,
-    0xb0,
-    0x54,
-    0x5b,
-    0xa0,
-    0x35,
-    0xf7,
-    0x1c,
-    0xa0,
-    0xad,
-    0x67,
-    0x89,
-    0x69,
-    0x64,
-    0x4f,
-    0xea,
-    0x31,
-    0x88,
-    0xb5,
-    0x87,
-    0x35,
-    0x2f,
-    0xe4,
-    0xc5,
-    0x4f,
-    0x9b,
-    0xaa,
-    0x93,
-    0xcb,
-    0xbd,
-    0xc4,
-    0x04,
-    0x77,
-    0xf9,
-    0x97,
-    0x3d,
-    0xf9,
-    0x29,
-    0x21,
-    0x92,
-    0x65,
-    0xe4,
-    0x2e,
-    0xec,
-    0x0f,
-    0x00,
-    0xcf,
-    0x6e,
-    0x9e,
-    0x55,
-    0x08,
-    0x58,
-    0x62,
-    0xc4,
-    0xc9,
-    0x2b,
-    0xe8,
-    0x79,
-    0x1f,
-    0x0e,
-    0xcb,
-    0x6c,
-    0xac,
-    0x70,
-    0xcc,
-    0x2e,
-    0x55,
-    0xef,
-    0x25,
-    0xe2,
-    0x3a,
-    0x78,
-    0x1b,
-    0x89,
-    0xeb,
-    0xb0,
-    0xd3,
-    0x84,
-    0xd9,
-    0x93,
-    0x66,
-    0x53,
-    0x0a,
-    0x5b,
-    0x37,
-    0xa3,
-    0x11,
-    0xa4,
-    0x85,
-    0x88,
-    0x3e,
-    0xcd,
-    0x3c,
-    0x07,
-    0x12,
-    0xa1,
-    0x11,
-    0xd7,
-    0xf5,
-    0x37,
-    0xcd,
-    0x68,
-    0x2b,
-    0x16,
-    0xe9,
-    0x25,
-    0x05,
-    0x9d,
-    0x5c,
-    0xf7,
-    0x54,
-    0xa3,
-    0xb1,
-    0x0a,
-    0x23,
-    0x5a,
-    0x5c,
-    0xd3,
-    0xa6,
-    0x79,
-    0x4e,
-    0x52,
-    0x6d,
-    0x9a,
-    0xc7,
-    0x94,
-    0xdd,
-    0xe0,
-    0x6c,
-    0x7d,
-    0xe1,
-    0xde,
-    0x99,
-    0xc4,
-    0xdd,
-    0xb4,
-    0xf8,
-    0x3f,
-    0xe4,
-    0x7b,
-    0x53,
-    0x61,
-    0x2a,
-    0xe4,
-    0xa6,
-    0x01,
-    0xbc,
-    0x1b,
-    0x79,
-    0x5c,
-    0x6e,
-    0xf2,
-    0x6c,
-    0x5e,
-    0x15,
-    0x3b,
-    0x14,
-    0x1d,
-    0xf7,
-    0x75,
-    0x05,
-    0xa7,
-    0x80,
-    0xac,
-    0x30,
-    0xfd,
-    0x37,
-    0x9a,
-    0x70,
-    0x5f,
-    0xf0,
-    0x12,
-    0x5f,
-    0xca,
-    0x42,
-    0x9f,
-    0x6e,
-    0xc0,
-    0x3b,
-    0x68,
-    0x35,
-    0x47,
-    0x53,
-    0x56,
-    0x07,
-    0x34,
-    0x9f,
-    0x79,
-    0xca,
-    0xa9,
-    0x47,
-    0xa8,
-    0x05,
-    0xdd,
-    0x3a,
-    0x68,
-    0x3b,
-    0x1b,
-    0x20,
-    0x10,
-    0x78,
-    0x0e,
-    0x91,
-    0x2a,
-    0x29,
-    0x3b,
-    0x84,
-    0x1b,
-    0x30,
-    0xcf,
-    0x0a,
-    0x07,
-    0x38,
-    0x9b,
-    0x3c,
-    0xef,
-    0x46,
-    0x5d,
-    0x71,
-    0x1c,
-    0x91,
-    0x41,
-    0xb5,
-    0xc1,
-    0x94,
-    0xa7,
-    0x77,
-    0xdc,
-    0x61,
-    0x27,
-    0x82,
-    0x5d,
-    0x38,
-    0xd2,
-    0x2f,
-    0x8a,
-    0x58,
-    0xbb,
-    0xd8,
-    0xa2,
-    0x15,
-    0xb7,
-    0x8f,
-    0xc0,
-    0x2b,
-    0x60,
-    0x10,
-    0x03,
-    0x52,
-    0x60,
-    0xf5,
-    0xec,
-    0x13,
-    0xec,
-    0x29,
-    0x07,
-    0xd9,
-    0x8e,
-    0x9f,
-    0xce,
-    0x4b,
-    0x28,
-    0x44,
-    0xca,
-    0xd9,
-    0x36,
-    0x32,
-    0xfb,
-    0x95,
-    0x53,
-    0x26,
-    0x7a,
-    0x45,
-    0xff,
-    0x34,
-    0x5d,
-    0xb6,
-    0x9f,
-    0xb9,
-    0xdb,
-    0x53,
-    0xc5,
-    0x92,
-    0xb1,
-    0xf5,
-    0xb2,
-    0x8b,
-    0xc3,
-    0xfd,
-    0x19,
-    0x1a,
-    0x07,
-    0xa1,
-    0x26,
-    0x4e,
-    0x9f,
-    0x83,
-    0xbf,
-    0x02,
-    0x45,
-    0x88,
-    0x0a,
-    0x56,
-    0xec,
-    0xe7,
-    0x2f,
-    0x60,
-    0xa4,
-    0x80,
-    0x5f,
-    0x1e,
-    0xbf,
-    0x70,
-    0x15,
-    0xaf,
-    0x32,
-    0xe2,
-    0x9b,
-    0xc3,
-    0x3e,
-    0x27,
-    0xd1,
-    0x51,
-    0x4f,
-    0x0a,
-    0x2a,
-    0x88,
-    0x24,
-    0x5d,
-    0xf7,
-    0x07,
-    0x30,
-    0xd8,
-    0xe8,
-    0x50,
-    0x40,
-    0x24,
-    0xcf,
-    0x7a,
-    0x5f,
-    0x32,
-    0xa8,
-    0x27,
-    0xf6,
-    0xd1,
-    0xd7,
-    0xb6,
-    0x38,
-    0x80,
-    0xb0,
-    0xba,
-    0xbd,
-    0x80,
-    0x3c,
-    0xaa,
-    0x6d,
-    0x2e,
-    0x3a,
-    0xda,
-    0xa0,
-    0x90,
-    0x65,
-    0xa9,
-    0x84,
-    0x2e,
-    0xf5,
-    0xfc,
-    0xbe,
-    0x23,
-    0x68,
-    0xec,
-    0x54,
-    0x73,
-    0x82,
-    0xbc,
-    0xca,
-    0x9f,
-    0x93,
-    0x0e,
-    0x8b,
-    0x77,
-    0xf8,
-    0x56,
-    0x8b,
-    0x30,
-    0xe4,
-    0x8e,
-    0x2b,
-    0xb6,
-    0x61,
-    0x2c,
-    0x5d,
-    0x43,
-    0x91,
-    0x51,
-    0x08,
-    0x31,
-    0x3a,
-    0x43,
-    0xae,
-    0x0d,
-    0x81,
-    0x1d,
-    0x4c,
-    0xec,
-    0xf6,
-    0xc5,
-    0x81,
-    0x02,
-    0xd1,
-    0x1f,
-    0xf3,
-    0x70,
-    0x7b,
-    0x80,
-    0xef,
-    0x5e,
-    0x51,
-    0x66,
-    0x4f,
-    0x4a,
-    0xa4,
-    0x66,
-    0xa1,
-    0x9f,
-    0x04,
-    0x65,
-    0x85,
-    0x8a,
-    0xbe,
-    0x0b,
-    0x57,
-    0x09,
-    0xa3,
-    0x75,
-    0x0e,
-    0x45,
-    0x0b,
-    0x2a,
-    0x64,
-    0x21,
-    0x1a,
-    0x51,
-    0x38,
-    0x13,
-    0x42,
-    0x21,
-    0x30,
-    0x33,
-    0x09,
-    0x98,
-    0xa2,
-    0x91,
-    0x0d,
-    0x70,
-    0xb5,
-    0xcc,
-    0x45,
-    0x4f,
-    0xc3,
-    0xe0,
-    0x89,
-    0x3e,
-    0x02,
-    0x40,
-    0x55,
-    0x5c,
-    0x64,
-    0x25,
-    0xca,
-    0xd3,
-    0xbb,
-    0x25,
-    0xf5,
-    0x0c,
-    0x21,
-    0x07,
-    0x54,
-    0x1f,
-    0x97,
-    0xd6,
-    0x96,
-    0x8e,
-    0xec,
-    0x34,
-    0xa3,
-    0x32,
-    0xe1,
-    0xf1,
-    0xdc,
-    0x75,
-    0x8a,
-    0xdc,
-    0xa4,
-    0xc2,
-    0xf7,
-    0xd9,
-    0x1f,
-    0x3a,
-    0x14,
-    0x34,
-    0x39,
-    0xa9,
-    0xce,
-    0x35,
-    0xeb,
-    0xb8,
-    0x77,
-    0xf5,
-    0xba,
-    0x64,
-    0x6c,
-    0x6f,
-    0x80,
-    0xae,
-    0xf5,
-    0xda,
-    0x6e,
-    0x94,
-    0x6c,
-    0x37,
-    0x52,
-    0x41,
-    0xa2,
-    0x26,
-    0x16,
-    0x81,
-    0x7e,
-    0xfd,
-    0x89,
-    0x77,
-    0xe7,
-    0x1b,
-    0x63,
-    0x92,
-    0xe4,
-    0x7a,
-    0x83,
-    0xbd,
-    0x02,
-    0x84,
-    0x7a,
-    0xd6,
-    0xf7,
-    0x28,
-    0x4d,
-    0x62,
-    0x84,
-    0x2c,
-    0x77,
-    0x7f,
-    0xa0,
-    0xc5,
-    0x2e,
-    0x19,
-    0xd2,
-    0x65,
-    0xe7,
-    0x61,
-    0xdf,
-    0xd4,
-    0x1c,
-    0x7b,
-    0xa5,
-    0x82,
-    0x4d,
-    0x77,
-    0x47,
-    0x1c,
-    0x45,
-    0x83,
-    0x8a,
-    0x5d,
-    0x9e,
-    0x5f,
-    0x7f,
-    0x27,
-    0x87,
-    0x11,
-    0x63,
-    0xd2,
-    0xc5,
-    0xd9,
-    0xc3,
-    0xc4,
-    0xf8,
-    0x67,
-    0xe3,
-    0x41,
-    0x20,
-    0x4c,
-    0x61,
-    0x85,
-    0x5f,
-    0xaf,
-    0x16,
-    0x10,
-    0x01,
-    0x41,
-    0x3d,
-    0x42,
-    0xb9,
-    0x73,
-    0xd7,
-    0x27,
-    0x2d,
-    0xe6,
-    0x4e,
-    0x94,
-    0xb5,
-    0x22,
-    0x58,
-    0x73,
-    0x60,
-    0x8c,
-    0x1e,
-    0x5b,
-    0x39,
-    0x92,
-    0x9e,
-    0x64,
-    0xc8,
-    0x29,
-    0x4d,
-    0x39,
-    0xdb,
-    0x79,
-    0x01,
-    0x6e,
-    0x86,
-    0xd6,
-    0x0f,
-    0x14,
-    0x68,
-    0xf3,
-    0xb0,
-    0x8b,
-    0x30,
-    0x52,
-    0xaa,
-    0x98,
-    0x60,
-    0xff,
-    0x2c,
-    0xb7,
-    0x51,
-    0x7e,
-    0xf9,
-    0xb3,
-    0x77,
-    0x02,
-    0xc8,
-    0x73,
-    0xe7,
-    0xe0,
-    0xeb,
-    0x17,
-    0x16,
-    0x42,
-    0x30,
-    0x44,
-    0xe4,
-    0x20,
-    0x05,
-    0xbb,
-    0xd9,
-    0x6c,
-    0xdf,
-    0x31,
-    0xae,
-    0x8d,
-    0xdc,
-    0x5b,
-    0x0f,
-    0x0f,
-    0xa7,
-    0x48,
-    0x9f,
-    0x99,
-    0x9c,
-    0xf3,
-    0x3d,
-    0x1f,
-    0x2c,
-    0x19,
-    0x86,
-    0x58,
-    0x83,
-    0x48,
-    0x9a,
-    0x73,
-    0x69,
-    0x39,
-    0x23,
-    0x06,
-    0x66,
-    0x5f,
-    0x94,
-    0x47,
-    0x2a,
-    0xc0,
-    0xaf,
-    0x7e,
-    0x2b,
-    0x04,
-    0x4a,
-    0xba,
-    0x90,
-    0xcb,
-    0x52,
-    0xc3,
-    0x4e,
-    0x44,
-    0x10,
-    0x51,
-    0x91,
-    0xfc,
-    0xab,
-    0x7b,
-    0x5d,
-    0xf3,
-    0xef,
-    0x72,
-    0x75,
-    0xf5,
-    0x4c,
-    0x6f,
-    0x7c,
-    0x27,
-    0x22,
-    0xea,
-    0x5a,
-    0xe1,
-    0x3c,
-    0x0d,
-    0xe1,
-    0xbb,
-    0x9a,
-    0x68,
-    0xb1,
-    0xeb,
-    0x73,
-    0xe6,
-    0x58,
-    0xce,
-    0x7a,
-    0x00,
-    0xbe,
-    0xc4,
-    0x61,
-    0x30,
-    0xc1,
-    0x41,
-    0x9b,
-    0xa9,
-    0x1c,
-    0x21,
-    0x67,
-    0x45,
-    0x8d,
-    0x3c,
-    0x0a,
-    0xbf,
-    0x37,
-    0x3b,
-    0x5b,
-    0x22,
-    0x45,
-    0xaa,
-    0x85,
-    0x81,
-    0xd0,
-    0x4e,
-    0x09,
-    0xe9,
-    0x02,
-    0xb8,
-    0x02,
-    0x94,
-    0x7c,
-    0x1a,
-    0xad,
-    0x5f,
-    0xf6,
-    0x5a,
-    0x28,
-    0x7e,
-    0x25,
-    0x65,
-    0x7a,
-    0x6f,
-    0xe2,
-    0xc6,
-    0xd4,
-    0x2c,
-    0x88,
-    0x77,
-    0x17,
-    0xa5,
-    0x9e,
-    0xf6,
-    0x95,
-    0x6d,
-    0xb6,
-    0x9c,
-    0x1c,
-    0xb4,
-    0x94,
-    0x2b,
-    0x31,
-    0x75,
-    0x93,
-    0xa6,
-    0x99,
-    0xf0,
-    0x45,
-    0x65,
-    0x1e,
-    0x5b,
-    0x5a,
-    0x68,
-    0x8f,
-    0xd5,
-    0xc3,
-    0xec,
-    0x09,
-    0x9b,
-    0x17,
-    0x3c,
-    0x75,
-    0x7e,
-    0x35,
-    0xca,
-    0x52,
-    0x95,
-    0x2b,
-    0x7e,
-    0xb5,
-    0x2f,
-    0x56,
-    0x4e,
-    0x8d,
-    0x0b,
-    0xcb,
-    0x0f,
-    0x2c,
-    0xcc,
-    0xf6,
-    0x8a,
-    0x03,
-    0xa7,
-    0x81,
-    0xd3,
-    0xad,
-    0x5f,
-    0x77,
-    0xd6,
-    0x30,
-    0x73,
-    0xaa,
-    0x33,
-    0x7f,
-    0x96,
-    0x52,
-    0x4c,
-    0x43,
-    0x5f,
-    0xf6,
-    0x9b,
-    0xda,
-    0x42,
-    0x90,
-    0x4a,
-    0xa0,
-    0xbf,
-    0xec,
-    0xfd,
-    0x6e,
-    0xd9,
-    0x51,
-    0xf3,
-    0x61,
-    0xca,
-    0x63,
-    0x4d,
-    0xdd,
-    0xf5,
-    0x48,
-    0xad,
-    0xd1,
-    0x1c,
-    0x0a,
-    0x03,
-    0x3c,
-    0xd3,
-    0x3c,
-    0xa4,
-    0xf0,
-    0x34,
-    0xe1,
-    0x9d,
-    0x96,
-    0xd5,
-    0x89,
-    0x46,
-    0xf2,
-    0xf7,
-    0xbd,
-    0x1a,
-    0x68,
-    0x00,
-    0x9d,
-    0xc5,
-    0xbf,
-    0x2c,
-    0xc8,
-    0x7f,
-    0x26,
-    0x7f,
-    0x7c,
-    0x99,
-    0x74,
-    0xfe,
-    0xff,
-    0x55,
-    0xb4,
-    0x1e,
-    0x3d,
-    0xfb,
-    0xe1,
-    0x7d,
-    0xb2,
-    0x29,
-    0xee,
-    0xd0,
-    0x8a,
-    0x6b,
-    0x09,
-    0x1c,
-    0x07,
-    0x0b,
-    0x21,
-    0x2a,
-    0x24,
-    0x2b,
-    0xa6,
-    0x35,
-    0x78,
-    0x10,
-    0x90,
-    0xe5,
-    0x5c,
-    0xc1,
-    0xa2,
-    0x81,
-    0x50,
-    0xd1,
-    0xf0,
-    0x60,
-    0x9b
-  ],
-  const [
-    0x46,
-    0xcb,
-    0x5d,
-    0x39,
-    0x1e,
-    0x75,
-    0x11,
-    0x46,
-    0xba,
-    0x97,
-    0x00,
-    0xb4,
-    0xfd,
-    0x5f,
-    0x36,
-    0xae,
-    0x7d,
-    0xda,
-    0x17,
-    0x58,
-    0xd8,
-    0xfe,
-    0x50,
-    0xfb,
-    0x47,
-    0xed,
-    0x0d,
-    0x62,
-    0x75,
-    0x78,
-    0x6d,
-    0x84,
-    0x91,
-    0xe2,
-    0x32,
-    0x63,
-    0xa1,
-    0xe7,
-    0xbe,
-    0x33,
-    0x1a,
-    0xfd,
-    0x3b,
-    0xbf,
-    0xae,
-    0xda,
-    0x19,
-    0x09,
-    0x66,
-    0x36,
-    0xbd,
-    0x30,
-    0xf0,
-    0xd2,
-    0x77,
-    0x97,
-    0x3a,
-    0xb9,
-    0xb5,
-    0x44,
-    0x40,
-    0xc6,
-    0x77,
-    0x86,
-    0x22,
-    0x66,
-    0x03,
-    0xdb,
-    0x79,
-    0x9f,
-    0xda,
-    0x10,
-    0xeb,
-    0x52,
-    0xea,
-    0xaa,
-    0xfd,
-    0xbd,
-    0x05,
-    0x85,
-    0x29,
-    0x43,
-    0x92,
-    0xbb,
-    0x31,
-    0x70,
-    0x83,
-    0xc7,
-    0xb2,
-    0x38,
-    0x87,
-    0xeb,
-    0xfc,
-    0x7f,
-    0x80,
-    0xcf,
-    0x21,
-    0xdf,
-    0x37,
-    0x6a,
-    0x4c,
-    0xa5,
-    0x4e,
-    0x25,
-    0x54,
-    0x1c,
-    0x77,
-    0x3e,
-    0x91,
-    0x0f,
-    0xe4,
-    0x6b,
-    0xef,
-    0x89,
-    0xff,
-    0xc1,
-    0x40,
-    0xdf,
-    0x5a,
-    0xd3,
-    0xd7,
-    0xf0,
-    0xe9,
-    0x1e,
-    0x52,
-    0xac,
-    0x6f,
-    0xa5,
-    0xb7,
-    0xd3,
-    0x36,
-    0xd8,
-    0xc3,
-    0xff,
-    0x03,
-    0xba,
-    0x7e,
-    0xe5,
-    0x49,
-    0x43,
-    0x13,
-    0xd8,
-    0x9d,
-    0x03,
-    0xdf,
-    0x8f,
-    0x6a,
-    0x09,
-    0xc8,
-    0x27,
-    0xe6,
-    0x03,
-    0xd0,
-    0x6b,
-    0x44,
-    0xa7,
-    0xe9,
-    0x54,
-    0x2c,
-    0x51,
-    0x0c,
-    0xcc,
-    0x68,
-    0xed,
-    0x85,
-    0xb7,
-    0xe0,
-    0x17,
-    0x91,
-    0x34,
-    0xc8,
-    0x81,
-    0x2a,
-    0x20,
-    0x18,
-    0x95,
-    0x22,
-    0xdd,
-    0x3c,
-    0x5c,
-    0x6f,
-    0x51,
-    0x0d,
-    0x9f,
-    0xc6,
-    0x31,
-    0x01,
-    0x4c,
-    0x6b,
-    0x7f,
-    0x9e,
-    0x1a,
-    0x47,
-    0x51,
-    0x35,
-    0x70,
-    0x3b,
-    0xd5,
-    0xcc,
-    0x84,
-    0xb4,
-    0x92,
-    0x5c,
-    0xc0,
-    0x7f,
-    0xf0,
-    0x3d,
-    0x69,
-    0xdf,
-    0xfb,
-    0xde,
-    0x82,
-    0xdd,
-    0x64,
-    0xb9,
-    0xee,
-    0xe0,
-    0xc8,
-    0x86,
-    0xd6,
-    0x7d,
-    0x35,
-    0xaf,
-    0x4a,
-    0x90,
-    0xeb,
-    0x05,
-    0x2b,
-    0x8c,
-    0x5f,
-    0xb1,
-    0x48,
-    0x0f,
-    0x86,
-    0x6d,
-    0xc7,
-    0xba,
-    0x4f,
-    0xf4,
-    0xc7,
-    0x3f,
-    0x72,
-    0xb6,
-    0x43,
-    0xbb,
-    0x68,
-    0xd1,
-    0x39,
-    0x47,
-    0xba,
-    0x3d,
-    0x0c,
-    0xc9,
-    0x7f,
-    0x46,
-    0x28,
-    0x11,
-    0x20,
-    0x40,
-    0xe4,
-    0x21,
-    0x5f,
-    0x76,
-    0xac,
-    0xcb,
-    0x98,
-    0x63,
-    0x5f,
-    0x82,
-    0x46,
-    0x25,
-    0xf6,
-    0x6a,
-    0xc8,
-    0x2e,
-    0x67,
-    0xb1,
-    0x66,
-    0x3d,
-    0xc8,
-    0x22,
-    0x8f,
-    0x8c,
-    0xb8,
-    0xf7,
-    0x64,
-    0x4b,
-    0xfb,
-    0xef,
-    0x7b,
-    0x4e,
-    0x64,
-    0xa1,
-    0xdc,
-    0x03,
-    0xf8,
-    0x10,
-    0x50,
-    0xa6,
-    0x50,
-    0x7f,
-    0xdc,
-    0xb8,
-    0x3f,
-    0x87,
-    0x88,
-    0xad,
-    0xb5,
-    0x66,
-    0x64,
-    0xe5,
-    0xe3,
-    0x9a,
-    0xcd,
-    0xdd,
-    0xa0,
-    0xaf,
-    0xed,
-    0xa7,
-    0x0c,
-    0x55,
-    0x81,
-    0x97,
-    0x73,
-    0xb5,
-    0xdf,
-    0x40,
-    0x74,
-    0x05,
-    0x37,
-    0x9e,
-    0x62,
-    0x5a,
-    0x19,
-    0x95,
-    0xea,
-    0xbe,
-    0x37,
-    0x9a,
-    0xf6,
-    0x83,
-    0x6d,
-    0xb1,
-    0xd2,
-    0xd7,
-    0xfe,
-    0x97,
-    0x8d,
-    0x98,
-    0x21,
-    0x40,
-    0xa3,
-    0x69,
-    0xbc,
-    0x84,
-    0xd8,
-    0x05,
-    0x6f,
-    0x15,
-    0x67,
-    0xd3,
-    0xd4,
-    0xb4,
-    0x5c,
-    0xbb,
-    0x05,
-    0xa4,
-    0x3f,
-    0x39,
-    0x5f,
-    0x5f,
-    0xf2,
-    0xaf,
-    0x86,
-    0x89,
-    0xdc,
-    0x00,
-    0xa9,
-    0x22,
-    0x48,
-    0x5a,
-    0x08,
-    0xff,
-    0x07,
-    0x53,
-    0xb3,
-    0x7b,
-    0x5d,
-    0x38,
-    0x94,
-    0x6a,
-    0x1b,
-    0xa1,
-    0xaf,
-    0x4e,
-    0x08,
-    0x49,
-    0xa9,
-    0xce,
-    0x85,
-    0x1d,
-    0x87,
-    0x63,
-    0x71,
-    0x93,
-    0xb9,
-    0x55,
-    0x4b,
-    0x3d,
-    0x57,
-    0xe6,
-    0x96,
-    0x9e,
-    0xaa,
-    0xcc,
-    0x82,
-    0x3c,
-    0xee,
-    0xe5,
-    0xc8,
-    0xf6,
-    0x56,
-    0x27,
-    0xd6,
-    0x98,
-    0x51,
-    0xd6,
-    0x2c,
-    0xad,
-    0x0c,
-    0xf9,
-    0x06,
-    0x95,
-    0x38,
-    0x0e,
-    0x3b,
-    0xd7,
-    0x0d,
-    0xfd,
-    0x65,
-    0xb8,
-    0x8f,
-    0x4b,
-    0x42,
-    0x0c,
-    0x10,
-    0x90,
-    0x5a,
-    0x4c,
-    0xf6,
-    0x2b,
-    0xe2,
-    0xe9,
-    0xbe,
-    0x34,
-    0xe1,
-    0xe0,
-    0x41,
-    0xb2,
-    0x91,
-    0x8f,
-    0x36,
-    0x0e,
-    0x08,
-    0xc6,
-    0xf9,
-    0xc8,
-    0x17,
-    0x22,
-    0x8b,
-    0x69,
-    0x73,
-    0x96,
-    0xd9,
-    0xb9,
-    0x12,
-    0x4b,
-    0x41,
-    0x31,
-    0xd8,
-    0xaa,
-    0x52,
-    0xb3,
-    0x73,
-    0xb7,
-    0xd3,
-    0x79,
-    0x84,
-    0xa0,
-    0x07,
-    0x4c,
-    0xff,
-    0x95,
-    0x30,
-    0xf6,
-    0xd4,
-    0xdb,
-    0x52,
-    0xf9,
-    0xcf,
-    0x1c,
-    0x39,
-    0x81,
-    0xbc,
-    0x02,
-    0xbd,
-    0x98,
-    0xd0,
-    0x04,
-    0x45,
-    0x99,
-    0x44,
-    0x7f,
-    0x8a,
-    0xe7,
-    0x43,
-    0x08,
-    0x9e,
-    0xde,
-    0x06,
-    0x01,
-    0x2c,
-    0x0a,
-    0x3e,
-    0x6a,
-    0x01,
-    0x97,
-    0xb2,
-    0xfa,
-    0xcb,
-    0x09,
-    0x29,
-    0x6e,
-    0x21,
-    0x2e,
-    0x8a,
-    0x22,
-    0xc4,
-    0x50,
-    0x42,
-    0xde,
-    0x25,
-    0xae,
-    0xe6,
-    0xf2,
-    0x27,
-    0x2e,
-    0x19,
-    0x85,
-    0x25,
-    0x4c,
-    0xb1,
-    0x2a,
-    0x37,
-    0x56,
-    0x15,
-    0xb4,
-    0xb1,
-    0xdb,
-    0xe9,
-    0x4c,
-    0xed,
-    0x61,
-    0xee,
-    0xc0,
-    0x4b,
-    0x56,
-    0x23,
-    0x1e,
-    0x75,
-    0x49,
-    0x31,
-    0x82,
-    0xe8,
-    0x5a,
-    0x05,
-    0x2c,
-    0xb0,
-    0xef,
-    0xbf,
-    0xd5,
-    0x72,
-    0xa9,
-    0xcb,
-    0x43,
-    0xb0,
-    0x97,
-    0x4d,
-    0x1c,
-    0x49,
-    0xa9,
-    0xc3,
-    0xf8,
-    0x3f,
-    0x67,
-    0xe6,
-    0xb9,
-    0xbd,
-    0xe2,
-    0xd0,
-    0x1f,
-    0x59,
-    0xeb,
-    0x64,
-    0x97,
-    0x96,
-    0x84,
-    0xeb,
-    0x54,
-    0xad,
-    0x94,
-    0xfb,
-    0xa1,
-    0x8d,
-    0xdf,
-    0x9d,
-    0x76,
-    0x20,
-    0x34,
-    0xae,
-    0x49,
-    0xd0,
-    0xe8,
-    0x86,
-    0x26,
-    0x4a,
-    0x84,
-    0xd8,
-    0x02,
-    0x81,
-    0xbb,
-    0xd9,
-    0x4d,
-    0xf6,
-    0x9f,
-    0xa5,
-    0xc6,
-    0x38,
-    0x14,
-    0xde,
-    0x93,
-    0xa6,
-    0x84,
-    0x96,
-    0x91,
-    0x7c,
-    0xd4,
-    0x6f,
-    0xe9,
-    0x0e,
-    0x97,
-    0x00,
-    0xe4,
-    0x4e,
-    0x82,
-    0x7b,
-    0x00,
-    0x94,
-    0x20,
-    0x8d,
-    0x43,
-    0x9f,
-    0xc7,
-    0x86,
-    0xcf,
-    0xd7,
-    0xcb,
-    0xba,
-    0xb7,
-    0xd4,
-    0xf1,
-    0x27,
-    0x11,
-    0x24,
-    0x27,
-    0x58,
-    0x4c,
-    0x49,
-    0x72,
-    0x89,
-    0xc4,
-    0x02,
-    0x27,
-    0x0b,
-    0x94,
-    0xcc,
-    0x5e,
-    0xea,
-    0xab,
-    0xa7,
-    0xa4,
-    0xce,
-    0x23,
-    0x1d,
-    0xf0,
-    0x1f,
-    0xce,
-    0x81,
-    0xd9,
-    0x6c,
-    0x11,
-    0x75,
-    0x05,
-    0x0e,
-    0xf5,
-    0xae,
-    0xe5,
-    0x08,
-    0x7b,
-    0xfc,
-    0x9f,
-    0x32,
-    0x30,
-    0x84,
-    0x4c,
-    0x97,
-    0x02,
-    0x50,
-    0x64,
-    0x1b,
-    0x52,
-    0x0b,
-    0x76,
-    0x61,
-    0x4a,
-    0x05,
-    0x1d,
-    0xeb,
-    0x71,
-    0x7e,
-    0x2f,
-    0x83,
-    0x7c,
-    0x20,
-    0x37,
-    0xda,
-    0x68,
-    0xcd,
-    0x26,
-    0x70,
-    0xc5,
-    0x9b,
-    0x45,
-    0xb3,
-    0x55,
-    0x1d,
-    0x6e,
-    0x6b,
-    0xd5,
-    0xe5,
-    0x7c,
-    0x55,
-    0x1b,
-    0x46,
-    0x00,
-    0x0e,
-    0x61,
-    0x5f,
-    0x36,
-    0x33,
-    0xe1,
-    0x54,
-    0x37,
-    0xc7,
-    0xa2,
-    0xdf,
-    0x6f,
-    0xd5,
-    0x91,
-    0x08,
-    0x52,
-    0x56,
-    0xd3,
-    0x30,
-    0x4b,
-    0x54,
-    0x5a,
-    0x54,
-    0xf5,
-    0x50,
-    0xb6,
-    0x90,
-    0x8e,
-    0xe2,
-    0x2e,
-    0xe2,
-    0xa9,
-    0x9f,
-    0x10,
-    0x31,
-    0x22,
-    0x3f,
-    0x45,
-    0x8e,
-    0x57,
-    0x00,
-    0x28,
-    0xb9,
-    0x95,
-    0x45,
-    0x99,
-    0xe7,
-    0xd1,
-    0x83,
-    0x4c,
-    0xc2,
-    0x99,
-    0x5d,
-    0x67,
-    0xb2,
-    0x4a,
-    0x0e,
-    0x4d,
-    0x5b,
-    0x82,
-    0x08,
-    0xb4,
-    0x67,
-    0xd8,
-    0xda,
-    0xfe,
-    0x85,
-    0xcb,
-    0x57,
-    0xc6,
-    0xb1,
-    0xf9,
-    0xf5,
-    0xb9,
-    0xb7,
-    0x92,
-    0x73,
-    0xa7,
-    0xf2,
-    0x0b,
-    0xbf,
-    0xd9,
-    0x5a,
-    0x17,
-    0x16,
-    0xa6,
-    0xbe,
-    0xd3,
-    0x6d,
-    0x41,
-    0x4d,
-    0x40,
-    0x10,
-    0xd5,
-    0x5b,
-    0xf7,
-    0x89,
-    0xd4,
-    0x62,
-    0x18,
-    0xc3,
-    0x8c,
-    0x47,
-    0x84,
-    0x6f,
-    0xfb,
-    0xdf,
-    0x4c,
-    0xa7,
-    0xe4,
-    0xb2,
-    0x69,
-    0xd1,
-    0x22,
-    0xff,
-    0xad,
-    0xc7,
-    0x3d,
-    0x00,
-    0xf9,
-    0x35,
-    0x3b,
-    0x6e,
-    0xb1,
-    0x42,
-    0xb8,
-    0x48,
-    0x6d,
-    0x72,
-    0x39,
-    0xd1,
-    0xf1,
-    0xca,
-    0xbe,
-    0xd8,
-    0x60,
-    0x36,
-    0x96,
-    0x3b,
-    0xac,
-    0x29,
-    0x77,
-    0xae,
-    0x51,
-    0x83,
-    0xce,
-    0xb9,
-    0x43,
-    0xb7,
-    0x54,
-    0x00,
-    0x24,
-    0x2d,
-    0xe2,
-    0xc7,
-    0xbb,
-    0xe5,
-    0x86,
-    0xb5,
-    0xa2,
-    0x5e,
-    0xd6,
-    0xd8,
-    0x3e,
-    0xb6,
-    0x84,
-    0xea,
-    0xf4,
-    0x12,
-    0x33,
-    0xd3,
-    0x9a,
-    0x40,
-    0x89,
-    0x6e,
-    0x2c,
-    0x9b,
-    0x86,
-    0x90,
-    0xc1,
-    0x2f,
-    0x14,
-    0x47,
-    0xbd,
-    0x1e,
-    0xdf,
-    0x5f,
-    0x47,
-    0x43,
-    0x66,
-    0x2b,
-    0xfe,
-    0x14,
-    0x53,
-    0x82,
-    0xe7,
-    0xcd,
-    0x07,
-    0x07,
-    0xaa,
-    0xcb,
-    0x7a,
-    0xad,
-    0xff,
-    0x35,
-    0x42,
-    0x7b,
-    0x63,
-    0xe2,
-    0xf1,
-    0x8d,
-    0x0f,
-    0x77,
-    0xa4,
-    0x5c,
-    0x2a,
-    0xd0,
-    0xd9,
-    0x3f,
-    0x3e,
-    0xa2,
-    0x81,
-    0x31,
-    0xe9,
-    0x5e,
-    0x57,
-    0xd4,
-    0xd5,
-    0x58,
-    0x6f,
-    0xb6,
-    0xe9,
-    0x28,
-    0x12,
-    0xd3,
-    0xc1,
-    0x50,
-    0xc9,
-    0x5c,
-    0x5c,
-    0x20,
-    0xb8,
-    0xb7,
-    0x15,
-    0xd7,
-    0x2d,
-    0xc7,
-    0xd5,
-    0x0b,
-    0x79,
-    0x6d,
-    0x86,
-    0x4b,
-    0xff,
-    0x4f,
-    0xcb,
-    0x02,
-    0x8a,
-    0xd8,
-    0xee,
-    0x9e,
-    0xe4,
-    0x80,
-    0x1a,
-    0xf2,
-    0xa4,
-    0x4d,
-    0xca,
-    0xd9,
-    0x47,
-    0x99,
-    0x81,
-    0x1d,
-    0x82,
-    0x17,
-    0xbc,
-    0x97,
-    0xd7,
-    0x11,
-    0x24,
-    0x97,
-    0x67,
-    0xf3,
-    0x09,
-    0x86,
-    0x07,
-    0x0d,
-    0x0c,
-    0xc9,
-    0x95,
-    0x95,
-    0x1b,
-    0xe9,
-    0x8d,
-    0xeb,
-    0xa3,
-    0xf1,
-    0xd7,
-    0x21,
-    0x00,
-    0x18,
-    0xe3,
-    0xbb,
-    0x39,
-    0xa0,
-    0xf8,
-    0xb3,
-    0xea,
-    0xfe,
-    0xc9,
-    0xc1,
-    0x81,
-    0x3b,
-    0x4a,
-    0xd9,
-    0xad,
-    0x9a,
-    0xc1,
-    0xf4,
-    0x14,
-    0x7b,
-    0x20,
-    0x13,
-    0x45,
-    0x7f,
-    0x92,
-    0x81,
-    0xed,
-    0xed,
-    0x54,
-    0x59,
-    0x4d,
-    0x55,
-    0xc6,
-    0x49,
-    0xeb,
-    0x73,
-    0xc2,
-    0x95,
-    0x88,
-    0x55,
-    0x2c,
-    0x5f,
-    0x53,
-    0xc0,
-    0xca,
-    0x25,
-    0x5c,
-    0xd1,
-    0x56,
-    0x8b,
-    0x4b,
-    0xe0,
-    0xd2,
-    0x5b,
-    0x52,
-    0xa9,
-    0x1c,
-    0xca,
-    0x60,
-    0xae,
-    0xc2,
-    0xfd,
-    0x98,
-    0xd7,
-    0x17,
-    0xcb,
-    0x01,
-    0x5c,
-    0x87,
-    0xc5,
-    0x7f,
-    0xe4,
-    0x27,
-    0x73,
-    0x02,
-    0xef,
-    0x90,
-    0xe1,
-    0xfd,
-    0x71,
-    0xee,
-    0x5a,
-    0x1a,
-    0xbf,
-    0x54,
-    0x74,
-    0x2c,
-    0xaf,
-    0x53,
-    0x4d,
-    0x64,
-    0xfb,
-    0xca,
-    0x13,
-    0xc9,
-    0xe7,
-    0xff,
-    0xca,
-    0xe2,
-    0x24,
-    0xef,
-    0x49,
-    0xb5,
-    0xf3,
-    0xe3,
-    0x86,
-    0xf6,
-    0x8e,
-    0x44,
-    0x14,
-    0x78,
-    0xc3,
-    0xb0,
-    0xea,
-    0xe7,
-    0xe2,
-    0x4d,
-    0x66,
-    0xb9,
-    0xd9,
-    0x5e,
-    0x92,
-    0x62,
-    0x9e,
-    0x14,
-    0xa5,
-    0xc7,
-    0xcd,
-    0xa6,
-    0xcd,
-    0xf6,
-    0x93,
-    0xa4,
-    0x2b,
-    0x14,
-    0xca,
-    0x88,
-    0x1f,
-    0x96,
-    0x65,
-    0x8e,
-    0xc7,
-    0xb5,
-    0x0f,
-    0xc5,
-    0xc2,
-    0x1b,
-    0x0f,
-    0x66,
-    0x3a,
-    0xe3,
-    0x6f,
-    0x65,
-    0x21,
-    0xc0,
-    0x5d,
-    0x47,
-    0xba,
-    0x7c,
-    0xd1,
-    0x33,
-    0x5c,
-    0xa5,
-    0x70,
-    0x4b,
-    0x73,
-    0x83,
-    0xb1,
-    0x3d,
-    0xc7,
-    0x4c,
-    0x3e,
-    0x14,
-    0x01,
-    0x9b,
-    0x9d,
-    0x55,
-    0x6b,
-    0x1f,
-    0x0f,
-    0x47,
-    0xf7,
-    0x90,
-    0xb8,
-    0x92,
-    0x83,
-    0xe8,
-    0x01,
-    0x0b,
-    0x5b,
-    0xcf,
-    0x3b,
-    0xcf,
-    0xff,
-    0x57,
-    0x85,
-    0x8f,
-    0x27,
-    0xe9,
-    0xef,
-    0x2a,
-    0x05,
-    0x80,
-    0xdf,
-    0x81,
-    0xca,
-    0x14,
-    0xb4,
-    0x87,
-    0x6b,
-    0x5a,
-    0xaa,
-    0x97,
-    0xa5,
-    0xaa,
-    0xfd,
-    0x0b,
-    0x3f,
-    0x40,
-    0x52,
-    0x0a,
-    0x8f,
-    0xa8,
-    0x52,
-    0xa1,
-    0x3f,
-    0x74,
-    0x98,
-    0x15,
-    0x51,
-    0x30,
-    0xcd,
-    0x78,
-    0x61,
-    0x98,
-    0x11,
-    0x7b,
-    0x2a,
-    0x08,
-    0x9d,
-    0x83,
-    0x4c,
-    0x33,
-    0xa7,
-    0xff,
-    0x4d,
-    0x18,
-    0x86,
-    0xf8,
-    0xdd,
-    0x32,
-    0x17,
-    0xe9,
-    0x5e,
-    0xef,
-    0x5f,
-    0xd2,
-    0xa3,
-    0x64,
-    0x72,
-    0x88,
-    0xf8,
-    0x3f,
-    0x93,
-    0x4f,
-    0x63,
-    0xfd,
-    0x9c,
-    0xaa,
-    0x2a,
-    0x5d,
-    0xa1,
-    0x72,
-    0x95,
-    0x14,
-    0xd0,
-    0x26,
-    0xf5,
-    0xc2,
-    0x9b,
-    0x82,
-    0xe5,
-    0x25,
-    0x1a,
-    0x53,
-    0xd0,
-    0x8c,
-    0xaa,
-    0x89,
-    0xb4,
-    0x8f,
-    0xdb,
-    0x8e,
-    0x25,
-    0xfe,
-    0x89,
-    0xd6,
-    0x94,
-    0x17,
-    0x48,
-    0xb8,
-    0xd1,
-    0xfc,
-    0x06,
-    0x7c,
-    0xcf,
-    0x64,
-    0xeb,
-    0xb5,
-    0xa8,
-    0x90,
-    0x84,
-    0xd1,
-    0xe0,
-    0x81,
-    0x21,
-    0xee,
-    0xee,
-    0x68,
-    0x7b,
-    0xef,
-    0xf8,
-    0x5e,
-    0x9a,
-    0xcf,
-    0xdf,
-    0x55,
-    0xf6,
-    0x36,
-    0x7b,
-    0x4e,
-    0xdd,
-    0x4a,
-    0x28,
-    0xcd,
-    0x14,
-    0xc8,
-    0x81,
-    0x8a,
-    0xc1,
-    0x53,
-    0x6b,
-    0x6a,
-    0x88,
-    0x0c,
-    0x56,
-    0xad,
-    0xf5,
-    0x62,
-    0xbf,
-    0x69,
-    0x1a,
-    0x2c,
-    0xf9,
-    0x37,
-    0x79,
-    0xf5,
-    0x2e,
-    0x2c,
-    0x24,
-    0x96,
-    0xa1,
-    0x0b,
-    0x22,
-    0x0b,
-    0x35,
-    0xb8,
-    0x15,
-    0x7f,
-    0x33,
-    0xf0,
-    0x1a,
-    0xa9,
-    0x48,
-    0x38,
-    0xf1,
-    0x5b,
-    0xcd,
-    0x13,
-    0x5e,
-    0x58,
-    0x4b,
-    0x78,
-    0xce,
-    0x67,
-    0x3f,
-    0x83,
-    0x3e,
-    0xa5,
-    0x1a,
-    0x6b,
-    0x59,
-    0x1f,
-    0x8c,
-    0xb4,
-    0xe0,
-    0xa0,
-    0x02,
-    0xa6,
-    0x4f,
-    0xc8,
-    0x6e,
-    0xfd,
-    0xbe,
-    0x5e,
-    0x46,
-    0xe2,
-    0x05,
-    0xe7,
-    0xcf,
-    0x1a,
-    0x23,
-    0x78,
-    0x9b,
-    0x7e,
-    0xe1,
-    0xc8,
-    0x50,
-    0xab,
-    0xb2,
-    0x89,
-    0xac,
-    0xfa,
-    0xde,
-    0xf9,
-    0xc6,
-    0xb3,
-    0xdf,
-    0xb4,
-    0x97,
-    0x7d,
-    0x0b,
-    0xcc,
-    0xb8,
-    0x19,
-    0x74,
-    0x1b,
-    0x6d,
-    0x50,
-    0x0d,
-    0xd8,
-    0xe3,
-    0x2a,
-    0x0e,
-    0x69,
-    0xb6,
-    0x61,
-    0x99,
-    0x78,
-    0xb6,
-    0x15,
-    0x9d,
-    0x49,
-    0xeb,
-    0xc1,
-    0xfb,
-    0x4b,
-    0xd7,
-    0x6e,
-    0xe7,
-    0xed,
-    0xfa,
-    0x27,
-    0x91,
-    0xb2,
-    0x9c,
-    0xac,
-    0x05,
-    0x88,
-    0xc6,
-    0x6b,
-    0x50,
-    0x56,
-    0x92,
-    0xab,
-    0xe5,
-    0xd4,
-    0xa4,
-    0x0b,
-    0x3f,
-    0x9f,
-    0xf9,
-    0x2b,
-    0xc7,
-    0x8d,
-    0xe0,
-    0xa9,
-    0xf7,
-    0x3d,
-    0x45,
-    0x4f,
-    0xc0,
-    0xf3,
-    0x35,
-    0x8a,
-    0x29,
-    0xa3,
-    0x9f,
-    0x1e,
-    0x3a,
-    0x4c,
-    0x58,
-    0x19,
-    0x18,
-    0x88,
-    0x62,
-    0x05,
-    0x71,
-    0x60,
-    0x6e,
-    0x62,
-    0x1a,
-    0x64,
-    0x9f,
-    0x54,
-    0xf7,
-    0xfc,
-    0x91,
-    0x98,
-    0x1c,
-    0xf9,
-    0x9a,
-    0xbc,
-    0x31,
-    0x6f,
-    0x50,
-    0x90,
-    0x1b,
-    0xc7,
-    0x4b,
-    0xd8,
-    0xd9,
-    0x10,
-    0x2c,
-    0x43,
-    0xab,
-    0x96,
-    0xdd,
-    0xa1,
-    0x7a,
-    0xb6,
-    0x1b,
-    0x50,
-    0x74,
-    0xf0,
-    0x32,
-    0xf7,
-    0xf7,
-    0x3e,
-    0x08,
-    0x77,
-    0xb0,
-    0xa4,
-    0x5d,
-    0x1f,
-    0x04,
-    0x09,
-    0x51,
-    0x20,
-    0xae,
-    0x45,
-    0x27,
-    0x40,
-    0xaa,
-    0x7b,
-    0x48,
-    0xd2,
-    0x52,
-    0xa9,
-    0x8b,
-    0xe5,
-    0xc8,
-    0x7d,
-    0xb3,
-    0xbc,
-    0x93,
-    0x6b,
-    0x3a,
-    0x7e,
-    0x8d,
-    0xfc,
-    0x4d,
-    0x2f,
-    0xfc,
-    0x69,
-    0x17,
-    0xdf,
-    0xff,
-    0x68,
-    0x42,
-    0x21,
-    0x2c,
-    0x46,
-    0xbb,
-    0xbf,
-    0x77,
-    0x36,
-    0xb6,
-    0xac,
-    0x55,
-    0xe9,
-    0xf3,
-    0x3a,
-    0x22,
-    0x5e,
-    0x3f,
-    0x8d,
-    0xc0,
-    0xfc,
-    0x3d,
-    0x50,
-    0x82,
-    0xde,
-    0x66,
-    0xa6,
-    0x48,
-    0x6e,
-    0x4f,
-    0x64,
-    0xeb,
-    0x35,
-    0x2a,
-    0x7d,
-    0xdb,
-    0xf1,
-    0x90,
-    0xbe,
-    0x06,
-    0xe8,
-    0x7e,
-    0xbb,
-    0xfc,
-    0x7d,
-    0x9d,
-    0x09,
-    0x51,
-    0x01,
-    0xc6,
-    0xad,
-    0x43,
-    0xcb,
-    0xc5,
-    0xd5,
-    0x9d,
-    0x8b,
-    0x5d,
-    0xc6,
-    0xdc,
-    0xdb,
-    0x8d,
-    0x16,
-    0x8f,
-    0x17,
-    0x12,
-    0x1b,
-    0x04,
-    0x6f,
-    0x2d,
-    0xa3,
-    0x20,
-    0x3a,
-    0xa6,
-    0xe5,
-    0x8f,
-    0x8d,
-    0x11,
-    0xb8,
-    0x1e,
-    0x0d,
-    0x50,
-    0x03,
-    0x64,
-    0x01,
-    0x59,
-    0x75,
-    0xa8,
-    0xac,
-    0x3a,
-    0x76,
-    0xff,
-    0xd9,
-    0x5a,
-    0x5d,
-    0xb5,
-    0xb7,
-    0x01,
-    0xe3,
-    0xee,
-    0xe7,
-    0x1a,
-    0xd7,
-    0x8d,
-    0xd4,
-    0x38,
-    0x14,
-    0x55,
-    0x43,
-    0xd8,
-    0xb1,
-    0x4e,
-    0x2b,
-    0xe6,
-    0x77,
-    0x6b,
-    0xc6,
-    0x82,
-    0x98,
-    0x69,
-    0xe8,
-    0x03,
-    0x9d,
-    0xfa,
-    0x90,
-    0x3c,
-    0xa1,
-    0x23,
-    0xbc,
-    0xff,
-    0xbd,
-    0xe3,
-    0x82,
-    0xe0,
-    0xc3,
-    0x15,
-    0x5d,
-    0x3b,
-    0x2f,
-    0x97,
-    0xc5,
-    0x79,
-    0x5a,
-    0xac,
-    0x02,
-    0x8e,
-    0xf1,
-    0x9f,
-    0x41,
-    0xc6,
-    0xa6,
-    0xaa,
-    0xe8,
-    0xc2,
-    0x25,
-    0x15,
-    0x27,
-    0xbd,
-    0x4a,
-    0xa2,
-    0xcf,
-    0x15,
-    0x91,
-    0x29,
-    0x68,
-    0x06,
-    0xce,
-    0x80,
-    0x7e,
-    0xb8,
-    0x1e,
-    0x9d,
-    0x3b,
-    0x7c,
-    0x1d,
-    0xff,
-    0x3b,
-    0x52,
-    0x59,
-    0x4a,
-    0x9b,
-    0xb0,
-    0x07,
-    0x31,
-    0x53,
-    0x7e,
-    0xf5,
-    0x98,
-    0xc6,
-    0x65,
-    0xc0,
-    0xfa,
-    0x98,
-    0x49,
-    0x47,
-    0x09,
-    0xc0,
-    0x14,
-    0x5f,
-    0x95,
-    0xde,
-    0xb6,
-    0xc9,
-    0xaf,
-    0xce,
-    0x6a,
-    0x61,
-    0x0e,
-    0x7d,
-    0x3a,
-    0x97,
-    0xb2,
-    0xfb,
-    0xc5,
-    0x23,
-    0xc6,
-    0xd2,
-    0x40,
-    0xf5,
-    0xcb,
-    0x97,
-    0xbb,
-    0x6b,
-    0xf3,
-    0xbe,
-    0xa5,
-    0xc7,
-    0xcb,
-    0xb2,
-    0x93,
-    0xe0,
-    0x1d,
-    0x26,
-    0x3d,
-    0x18,
-    0x15,
-    0xa5,
-    0xc9,
-    0x8d,
-    0xa2,
-    0x71,
-    0x4d,
-    0x94,
-    0x1f,
-    0x8a,
-    0x8f,
-    0x63,
-    0x33,
-    0x0d,
-    0x0f,
-    0x0d,
-    0xf6,
-    0xbf,
-    0x47,
-    0xb4,
-    0x55,
-    0xea,
-    0x31,
-    0xf9,
-    0xb7,
-    0x68,
-    0x0a,
-    0xb8,
-    0xe1,
-    0xfd,
-    0x56,
-    0xf3,
-    0x16,
-    0xea,
-    0x24,
-    0x0b,
-    0x83,
-    0xbe,
-    0x93,
-    0x36,
-    0xdb,
-    0x70,
-    0x95,
-    0x2d,
-    0x3f,
-    0xab,
-    0xf3,
-    0x25,
-    0x60,
-    0x69,
-    0x91,
-    0x01,
-    0xe7,
-    0xc3,
-    0xf4,
-    0xc6,
-    0x15,
-    0x07,
-    0x01,
-    0x4f,
-    0xa6,
-    0x0c,
-    0x07,
-    0x42,
-    0xfc,
-    0xc2,
-    0x00,
-    0x42,
-    0x79,
-    0x0d,
-    0x14,
-    0x66,
-    0x2d,
-    0xd4,
-    0x5f,
-    0xea,
-    0xb1,
-    0x55,
-    0xf4,
-    0x25,
-    0x52,
-    0xbb,
-    0x22,
-    0xbb,
-    0x72,
-    0xf2,
-    0xf6,
-    0x14,
-    0x2c,
-    0xba,
-    0x00,
-    0x0d,
-    0x37,
-    0xfa,
-    0x5a,
-    0xed,
-    0x0d,
-    0x57,
-    0xe7,
-    0x9a,
-    0x4c,
-    0x06,
-    0xd9,
-    0x0d,
-    0x5c,
-    0xde,
-    0x76,
-    0x03,
-    0x52,
-    0xb2,
-    0x1b,
-    0xf5,
-    0x14,
-    0xdd,
-    0x81,
-    0x4b,
-    0xbe,
-    0x1e,
-    0x3f,
-    0xcd,
-    0x45,
-    0xa7,
-    0x90,
-    0x5a,
-    0x5b,
-    0x70,
-    0x57,
-    0xdc,
-    0x92,
-    0xd1,
-    0x60,
-    0x7b,
-    0xc3,
-    0x50,
-    0xe9,
-    0x11,
-    0xb1,
-    0xb8,
-    0x61,
-    0xde,
-    0xea,
-    0x6b,
-    0x6f,
-    0x7e,
-    0xee,
-    0xf8,
-    0x36,
-    0x17,
-    0x93,
-    0xf0,
-    0xd8,
-    0xd7,
-    0xa8,
-    0xf6,
-    0x38,
-    0x9e,
-    0xd9,
-    0x16,
-    0x05,
-    0xf7,
-    0xd2,
-    0x58,
-    0xf4,
-    0x4d,
-    0xa8,
-    0x94,
-    0x4c,
-    0x5c,
-    0x74,
-    0x87,
-    0xa8,
-    0xe5,
-    0x41,
-    0x27,
-    0xf8,
-    0xa6,
-    0x28,
-    0x34,
-    0xca,
-    0x89,
-    0xb9,
-    0x10,
-    0xc8,
-    0x1c,
-    0x9d,
-    0xd0,
-    0x81,
-    0x41,
-    0x7a,
-    0x93,
-    0x6c,
-    0x27,
-    0x17,
-    0x12,
-    0x29,
-    0x78,
-    0xc1,
-    0x79,
-    0x0b,
-    0xd4,
-    0xed,
-    0x76,
-    0xd4,
-    0x7f,
-    0x1e,
-    0x8f,
-    0xbf,
-    0x56,
-    0x09,
-    0xb8,
-    0xc4,
-    0x08,
-    0xf7,
-    0x25,
-    0x17,
-    0x82,
-    0x6c,
-    0x5d,
-    0xf2,
-    0xab,
-    0x06,
-    0x90,
-    0x94,
-    0x52,
-    0xa7,
-    0x2a,
-    0x8a,
-    0x64,
-    0xd7,
-    0xa8,
-    0x2d,
-    0x63,
-    0x63,
-    0xaa,
-    0x6c,
-    0x13,
-    0x4a,
-    0x4a,
-    0xcb,
-    0x77,
-    0xda,
-    0xad,
-    0xac,
-    0xfb,
-    0x17,
-    0xd7,
-    0xcd,
-    0xf3,
-    0x5c,
-    0xc4,
-    0x13,
-    0x44,
-    0x45,
-    0xb4,
-    0x86,
-    0x61,
-    0xcb,
-    0xc6,
-    0x9c,
-    0x7a,
-    0xb1,
-    0xc8,
-    0xba,
-    0xf0,
-    0x20,
-    0x4e,
-    0xf8,
-    0x0b,
-    0x8e,
-    0x01,
-    0x25,
-    0xef,
-    0xe4,
-    0x3a,
-    0x0b,
-    0xcc,
-    0xdf,
-    0xd0,
-    0xf3,
-    0x56,
-    0xb6,
-    0x2e,
-    0x6c,
-    0x75,
-    0xfe,
-    0xa8,
-    0x49,
-    0x3d,
-    0xcb,
-    0x0f,
-    0xe9,
-    0x20,
-    0x19,
-    0x82,
-    0xbb,
-    0x62,
-    0x6a,
-    0x88,
-    0x00,
-    0xce,
-    0xb0,
-    0x5c,
-    0xd3,
-    0xa8,
-    0x6c,
-    0x88,
-    0x67,
-    0xe2,
-    0x18,
-    0xb5,
-    0x91,
-    0x92,
-    0xc3,
-    0xc2,
-    0x86,
-    0xa4,
-    0xfb,
-    0x13,
-    0xe5,
-    0xcc,
-    0xef,
-    0x2c,
-    0xf8,
-    0xbf,
-    0xd5,
-    0x7e,
-    0x37,
-    0xa3,
-    0x8a,
-    0x80,
-    0x0d,
-    0xc4,
-    0x78,
-    0x02,
-    0xdf,
-    0x88,
-    0xbd,
-    0xbf,
-    0x4b,
-    0xa5,
-    0x8a,
-    0x31,
-    0xad,
-    0x91,
-    0xc8,
-    0xa9,
-    0xe8,
-    0x3b,
-    0x02,
-    0x9e,
-    0x63,
-    0xf8,
-    0x7f,
-    0x45,
-    0x51,
-    0xc0,
-    0xae,
-    0x63,
-    0x36,
-    0x9a,
-    0xc8,
-    0x60,
-    0xa6
-  ],
-  const [
-    0xec,
-    0x2f,
-    0x78,
-    0x52,
-    0xd0,
-    0xa6,
-    0xe6,
-    0xd1,
-    0x3f,
-    0xd4,
-    0x22,
-    0x02,
-    0x33,
-    0xa0,
-    0x0d,
-    0x9c,
-    0x9c,
-    0x06,
-    0x3d,
-    0x24,
-    0xf6,
-    0x5e,
-    0x3b,
-    0x56,
-    0x20,
-    0xe1,
-    0xef,
-    0xc6,
-    0x6c,
-    0x69,
-    0x58,
-    0xc7,
-    0xf3,
-    0x78,
-    0x81,
-    0x8c,
-    0x2b,
-    0x7c,
-    0xb0,
-    0x8d,
-    0xbb,
-    0x51,
-    0xe0,
-    0x2c,
-    0x8d,
-    0x08,
-    0x71,
-    0x99,
-    0x25,
-    0xe7,
-    0x1f,
-    0xf3,
-    0x32,
-    0xb0,
-    0x31,
-    0xb0,
-    0x63,
-    0x27,
-    0xf2,
-    0x3e,
-    0x7c,
-    0xce,
-    0x65,
-    0xea,
-    0xa9,
-    0xf3,
-    0x35,
-    0x02,
-    0x12,
-    0xec,
-    0xeb,
-    0x36,
-    0xaf,
-    0xa2,
-    0x63,
-    0x44,
-    0x5e,
-    0x4c,
-    0x81,
-    0xd5,
-    0x33,
-    0x7d,
-    0x20,
-    0xa1,
-    0x0f,
-    0x61,
-    0x4b,
-    0xda,
-    0x74,
-    0x43,
-    0xb0,
-    0xc8,
-    0x97,
-    0x53,
-    0x51,
-    0xb1,
-    0xb7,
-    0xa7,
-    0x7d,
-    0xfb,
-    0xae,
-    0x7f,
-    0xff,
-    0x94,
-    0xc6,
-    0xcd,
-    0x95,
-    0x92,
-    0xcd,
-    0xf5,
-    0xa4,
-    0x17,
-    0x6c,
-    0xd1,
-    0x29,
-    0x78,
-    0xb4,
-    0xf8,
-    0xf3,
-    0x9e,
-    0xfa,
-    0x40,
-    0x10,
-    0xac,
-    0xe5,
-    0x81,
-    0x85,
-    0xe1,
-    0xc5,
-    0x9c,
-    0x42,
-    0xc1,
-    0x26,
-    0xbc,
-    0x54,
-    0x6f,
-    0xa6,
-    0xdc,
-    0x5d,
-    0x5e,
-    0x03,
-    0x8a,
-    0x41,
-    0x28,
-    0x78,
-    0xea,
-    0x23,
-    0xbe,
-    0x4a,
-    0xfd,
-    0x90,
-    0xc2,
-    0x9e,
-    0x23,
-    0xf9,
-    0x31,
-    0x8d,
-    0xdf,
-    0x67,
-    0x45,
-    0x7a,
-    0xdb,
-    0x6a,
-    0x9a,
-    0xa3,
-    0x2c,
-    0x52,
-    0x8f,
-    0xf7,
-    0xd6,
-    0xa2,
-    0xef,
-    0x28,
-    0x93,
-    0xc2,
-    0xd1,
-    0x00,
-    0xd0,
-    0xf4,
-    0xbc,
-    0xf8,
-    0xf9,
-    0x89,
-    0x0f,
-    0x07,
-    0xf6,
-    0x55,
-    0xa0,
-    0xb8,
-    0xf6,
-    0x60,
-    0xa4,
-    0x7f,
-    0x6b,
-    0xde,
-    0xcf,
-    0x4d,
-    0x55,
-    0x62,
-    0xbc,
-    0x62,
-    0xc4,
-    0x4e,
-    0x8e,
-    0x63,
-    0x98,
-    0x8e,
-    0xd8,
-    0xac,
-    0x8c,
-    0x86,
-    0xba,
-    0xe7,
-    0x73,
-    0x48,
-    0x4d,
-    0xdd,
-    0xc1,
-    0x0b,
-    0x41,
-    0x8d,
-    0x4c,
-    0xd9,
-    0xc5,
-    0x7b,
-    0x54,
-    0x87,
-    0xa7,
-    0x4b,
-    0xc1,
-    0xea,
-    0xbd,
-    0x8e,
-    0xad,
-    0x48,
-    0x83,
-    0xdc,
-    0x22,
-    0x0d,
-    0x05,
-    0x23,
-    0x25,
-    0xbf,
-    0x00,
-    0x3e,
-    0xf3,
-    0x34,
-    0x44,
-    0xca,
-    0x8a,
-    0x03,
-    0x5c,
-    0x35,
-    0x6b,
-    0x38,
-    0x71,
-    0x17,
-    0x9f,
-    0x4c,
-    0x6c,
-    0xc6,
-    0xf8,
-    0x54,
-    0x5b,
-    0x25,
-    0x99,
-    0x78,
-    0x16,
-    0xbc,
-    0xb8,
-    0xa7,
-    0x22,
-    0x0e,
-    0xa3,
-    0x89,
-    0xd5,
-    0x26,
-    0x01,
-    0xb5,
-    0xbb,
-    0x74,
-    0x5b,
-    0x25,
-    0x39,
-    0xd7,
-    0xdb,
-    0xe6,
-    0x70,
-    0xfb,
-    0x53,
-    0x14,
-    0x64,
-    0xe5,
-    0x80,
-    0x06,
-    0x5e,
-    0xcc,
-    0x91,
-    0xc6,
-    0x8f,
-    0x2b,
-    0xe3,
-    0xc4,
-    0xf5,
-    0x14,
-    0x0f,
-    0xcb,
-    0x83,
-    0xc7,
-    0x26,
-    0x33,
-    0x7c,
-    0x83,
-    0x3b,
-    0x59,
-    0x20,
-    0x9c,
-    0x22,
-    0x4c,
-    0x8a,
-    0xce,
-    0x78,
-    0xc9,
-    0xd9,
-    0xd1,
-    0xe3,
-    0x6a,
-    0x8e,
-    0x2d,
-    0x9b,
-    0x1a,
-    0x35,
-    0x50,
-    0x2a,
-    0xcc,
-    0x48,
-    0xde,
-    0x70,
-    0x6d,
-    0x50,
-    0x48,
-    0xe9,
-    0x16,
-    0x4d,
-    0xa0,
-    0x33,
-    0x87,
-    0x58,
-    0xac,
-    0xca,
-    0xd1,
-    0x87,
-    0x39,
-    0x17,
-    0x52,
-    0x11,
-    0xb1,
-    0xa9,
-    0xe6,
-    0xb2,
-    0xf0,
-    0xc2,
-    0x5c,
-    0x51,
-    0x54,
-    0x15,
-    0x27,
-    0xe1,
-    0x13,
-    0xce,
-    0x56,
-    0x85,
-    0xd2,
-    0xd3,
-    0xc7,
-    0xf7,
-    0x73,
-    0x49,
-    0x97,
-    0x2a,
-    0x2e,
-    0x5b,
-    0xdc,
-    0x2e,
-    0xe3,
-    0x36,
-    0x97,
-    0x55,
-    0xae,
-    0x58,
-    0xe4,
-    0x94,
-    0xbd,
-    0x0b,
-    0x74,
-    0x2b,
-    0x5e,
-    0x2c,
-    0x3d,
-    0x88,
-    0x5c,
-    0x31,
-    0x70,
-    0x69,
-    0x8c,
-    0x6b,
-    0xac,
-    0x42,
-    0xa3,
-    0x87,
-    0x71,
-    0xde,
-    0x4a,
-    0x5b,
-    0xd7,
-    0x48,
-    0x75,
-    0xe0,
-    0x80,
-    0xec,
-    0xf0,
-    0x7a,
-    0xcb,
-    0xfa,
-    0x3a,
-    0x80,
-    0x4a,
-    0x0b,
-    0x97,
-    0xf8,
-    0x77,
-    0x07,
-    0x61,
-    0xa2,
-    0xa2,
-    0x46,
-    0x9f,
-    0x39,
-    0x2e,
-    0xf5,
-    0xd9,
-    0xf5,
-    0xfd,
-    0xbc,
-    0x2a,
-    0x54,
-    0x29,
-    0x9d,
-    0x96,
-    0x1a,
-    0xf5,
-    0x20,
-    0x9e,
-    0x96,
-    0x03,
-    0xad,
-    0x12,
-    0x28,
-    0xc7,
-    0x39,
-    0x27,
-    0x00,
-    0x3b,
-    0x25,
-    0xc9,
-    0x28,
-    0xd4,
-    0x62,
-    0x32,
-    0xc5,
-    0xb5,
-    0xda,
-    0xbc,
-    0x9a,
-    0x24,
-    0x0b,
-    0xf3,
-    0xcd,
-    0x3a,
-    0xf5,
-    0xef,
-    0xee,
-    0xde,
-    0x37,
-    0xe1,
-    0x35,
-    0xf4,
-    0x75,
-    0xeb,
-    0x0b,
-    0xd1,
-    0xfc,
-    0x35,
-    0xcc,
-    0xf2,
-    0xa9,
-    0x3d,
-    0xcc,
-    0xee,
-    0x07,
-    0x6e,
-    0x98,
-    0xaa,
-    0xb7,
-    0xf5,
-    0x7e,
-    0xcc,
-    0x15,
-    0xd0,
-    0x4f,
-    0x72,
-    0x18,
-    0x27,
-    0x63,
-    0x23,
-    0x7a,
-    0xe0,
-    0xde,
-    0x06,
-    0x19,
-    0x6e,
-    0x32,
-    0x51,
-    0x9e,
-    0xe9,
-    0xe5,
-    0x05,
-    0x5c,
-    0x64,
-    0x95,
-    0xd9,
-    0x7b,
-    0x7b,
-    0x39,
-    0x73,
-    0x55,
-    0x2b,
-    0xa9,
-    0xde,
-    0x20,
-    0xe7,
-    0x61,
-    0x39,
-    0xce,
-    0xe7,
-    0x81,
-    0xac,
-    0x31,
-    0xc4,
-    0x19,
-    0xa1,
-    0x63,
-    0x42,
-    0xa4,
-    0x30,
-    0x65,
-    0x6c,
-    0xd2,
-    0xda,
-    0x06,
-    0xe7,
-    0x8b,
-    0x7b,
-    0x06,
-    0x80,
-    0x30,
-    0x7a,
-    0x7c,
-    0x07,
-    0x24,
-    0x43,
-    0x75,
-    0x60,
-    0x8b,
-    0xf7,
-    0xde,
-    0xd7,
-    0x51,
-    0x61,
-    0xa4,
-    0xb4,
-    0x6e,
-    0x2d,
-    0x19,
-    0x0f,
-    0x69,
-    0x54,
-    0x9a,
-    0xe6,
-    0x1b,
-    0xdb,
-    0x6f,
-    0x6d,
-    0xb6,
-    0xbd,
-    0xf2,
-    0xa5,
-    0x06,
-    0x26,
-    0xf3,
-    0x30,
-    0xf6,
-    0xe1,
-    0x5c,
-    0x64,
-    0x55,
-    0x14,
-    0x11,
-    0x9e,
-    0xda,
-    0x2b,
-    0x1a,
-    0xd9,
-    0x66,
-    0x12,
-    0x04,
-    0x7f,
-    0x8a,
-    0xa7,
-    0x84,
-    0x7e,
-    0x49,
-    0x6f,
-    0x5e,
-    0x9f,
-    0x1f,
-    0x87,
-    0x85,
-    0x14,
-    0x42,
-    0xde,
-    0x84,
-    0x4f,
-    0x27,
-    0xa2,
-    0x1c,
-    0x1b,
-    0x48,
-    0xf8,
-    0x2f,
-    0xe5,
-    0x25,
-    0xf0,
-    0xdd,
-    0x5a,
-    0x88,
-    0xb8,
-    0xec,
-    0x38,
-    0x0e,
-    0x10,
-    0x6d,
-    0x5d,
-    0xe3,
-    0xfd,
-    0x9c,
-    0x25,
-    0xcd,
-    0xc2,
-    0x09,
-    0xf2,
-    0x6c,
-    0x0c,
-    0xf5,
-    0x0c,
-    0xc0,
-    0x6d,
-    0xff,
-    0xac,
-    0xeb,
-    0x0b,
-    0x00,
-    0x53,
-    0x38,
-    0x9a,
-    0x33,
-    0x60,
-    0x5d,
-    0x87,
-    0x99,
-    0xe2,
-    0xfd,
-    0x76,
-    0x9b,
-    0xab,
-    0x71,
-    0xef,
-    0xf2,
-    0xa6,
-    0xc8,
-    0x54,
-    0xc4,
-    0x6a,
-    0x0c,
-    0x17,
-    0x0f,
-    0x0e,
-    0xc7,
-    0x29,
-    0x4b,
-    0x3f,
-    0xc6,
-    0xb6,
-    0x4b,
-    0x91,
-    0x1d,
-    0x0f,
-    0x65,
-    0x13,
-    0x6c,
-    0xe8,
-    0xd2,
-    0x26,
-    0x60,
-    0xc3,
-    0x57,
-    0x8f,
-    0x7c,
-    0xac,
-    0x25,
-    0xca,
-    0x19,
-    0x27,
-    0xff,
-    0xa1,
-    0xab,
-    0x67,
-    0x9a,
-    0xfe,
-    0x47,
-    0xc0,
-    0x49,
-    0xfe,
-    0x62,
-    0x5f,
-    0xda,
-    0x46,
-    0xdc,
-    0x39,
-    0xba,
-    0x9a,
-    0x3d,
-    0x41,
-    0x60,
-    0xac,
-    0x3e,
-    0xde,
-    0xe9,
-    0x31,
-    0x8b,
-    0x9c,
-    0x00,
-    0x3a,
-    0xc7,
-    0x22,
-    0x01,
-    0xc2,
-    0xd0,
-    0x64,
-    0x5e,
-    0x83,
-    0x45,
-    0x19,
-    0x41,
-    0x0f,
-    0x46,
-    0x70,
-    0x73,
-    0x1b,
-    0x7b,
-    0xfe,
-    0x7c,
-    0x1e,
-    0x58,
-    0xfb,
-    0x0c,
-    0x1b,
-    0x9f,
-    0xaf,
-    0x99,
-    0xba,
-    0x26,
-    0x27,
-    0x4a,
-    0x9e,
-    0xda,
-    0x2c,
-    0x14,
-    0xf3,
-    0x04,
-    0x76,
-    0x23,
-    0x46,
-    0xcb,
-    0x1c,
-    0x7b,
-    0x9a,
-    0xfa,
-    0x4f,
-    0xdf,
-    0xb8,
-    0x04,
-    0x48,
-    0xf1,
-    0xc6,
-    0x46,
-    0x7f,
-    0x9c,
-    0x1b,
-    0x8b,
-    0x1e,
-    0xaf,
-    0x52,
-    0xd5,
-    0xb5,
-    0xca,
-    0x9d,
-    0x5b,
-    0x2f,
-    0x7e,
-    0x5c,
-    0xce,
-    0x05,
-    0xb0,
-    0xef,
-    0xe0,
-    0xb1,
-    0x3e,
-    0xc8,
-    0x07,
-    0x66,
-    0xe6,
-    0xc4,
-    0x7e,
-    0xfe,
-    0x63,
-    0xbb,
-    0x8e,
-    0x34,
-    0xd8,
-    0x56,
-    0x0b,
-    0x13,
-    0x72,
-    0x20,
-    0x21,
-    0xae,
-    0x49,
-    0xe0,
-    0x51,
-    0x12,
-    0x88,
-    0x27,
-    0xb6,
-    0x79,
-    0xce,
-    0x25,
-    0x8d,
-    0xc0,
-    0xd4,
-    0xc0,
-    0xf4,
-    0x1b,
-    0x4f,
-    0xe8,
-    0xf2,
-    0x08,
-    0x18,
-    0x24,
-    0xb8,
-    0x81,
-    0x8a,
-    0x71,
-    0x26,
-    0x76,
-    0x2b,
-    0x4d,
-    0x91,
-    0x7a,
-    0x8f,
-    0x0f,
-    0xc4,
-    0xbd,
-    0x7a,
-    0x79,
-    0x44,
-    0x3a,
-    0x45,
-    0x90,
-    0xd9,
-    0x31,
-    0x83,
-    0xab,
-    0x49,
-    0xd8,
-    0xe4,
-    0xcb,
-    0x67,
-    0x4e,
-    0x59,
-    0x2a,
-    0x4c,
-    0xd0,
-    0x78,
-    0x17,
-    0xe5,
-    0x2f,
-    0x23,
-    0x00,
-    0xae,
-    0x81,
-    0x64,
-    0xd1,
-    0xbc,
-    0x17,
-    0x9c,
-    0x7d,
-    0x01,
-    0xb0,
-    0xdd,
-    0xd9,
-    0xcc,
-    0xec,
-    0x94,
-    0xb1,
-    0x8f,
-    0x04,
-    0x6b,
-    0x16,
-    0xe5,
-    0xb7,
-    0x6d,
-    0xf5,
-    0xd3,
-    0x88,
-    0x6b,
-    0xee,
-    0x4e,
-    0x26,
-    0x9f,
-    0x62,
-    0xfe,
-    0x2c,
-    0x90,
-    0xce,
-    0x42,
-    0x0a,
-    0x35,
-    0x58,
-    0x74,
-    0x43,
-    0x5d,
-    0xa8,
-    0x6e,
-    0xda,
-    0x4f,
-    0xf9,
-    0x4d,
-    0x06,
-    0xad,
-    0x70,
-    0x75,
-    0x2d,
-    0x9e,
-    0xac,
-    0xd5,
-    0x10,
-    0x2b,
-    0x9e,
-    0x6c,
-    0x44,
-    0xea,
-    0x9b,
-    0x0b,
-    0xe1,
-    0xda,
-    0xaf,
-    0x5d,
-    0x7e,
-    0x8f,
-    0x35,
-    0x26,
-    0x5c,
-    0x8f,
-    0xa4,
-    0xc8,
-    0xe1,
-    0xfb,
-    0xac,
-    0x0b,
-    0x48,
-    0x72,
-    0x82,
-    0x1d,
-    0x98,
-    0x32,
-    0x78,
-    0xd8,
-    0xd2,
-    0x80,
-    0xd0,
-    0x44,
-    0x6f,
-    0x4b,
-    0xd2,
-    0x5d,
-    0x09,
-    0x0c,
-    0x1c,
-    0x16,
-    0x59,
-    0xf0,
-    0x3a,
-    0x9d,
-    0x61,
-    0x39,
-    0x76,
-    0xe1,
-    0xea,
-    0xe1,
-    0xf1,
-    0x52,
-    0x31,
-    0x81,
-    0xf3,
-    0xe7,
-    0xde,
-    0x72,
-    0x80,
-    0x66,
-    0x35,
-    0x32,
-    0x2c,
-    0xe0,
-    0x90,
-    0x09,
-    0x30,
-    0x7a,
-    0x0d,
-    0xec,
-    0xbc,
-    0x74,
-    0x84,
-    0xa1,
-    0x8f,
-    0x63,
-    0xbc,
-    0x24,
-    0xc6,
-    0xc1,
-    0xde,
-    0x4a,
-    0xf1,
-    0xa8,
-    0x29,
-    0xa4,
-    0x6c,
-    0xdb,
-    0xe8,
-    0xa6,
-    0xed,
-    0x06,
-    0xa1,
-    0x08,
-    0x59,
-    0x47,
-    0x90,
-    0x6d,
-    0xdc,
-    0xec,
-    0x53,
-    0x43,
-    0x38,
-    0x7f,
-    0xe7,
-    0xea,
-    0x5d,
-    0x00,
-    0xd3,
-    0x18,
-    0x3b,
-    0x71,
-    0xa3,
-    0x7c,
-    0xd4,
-    0x98,
-    0x98,
-    0xa1,
-    0x95,
-    0x00,
-    0x9e,
-    0x16,
-    0xe6,
-    0x41,
-    0x7e,
-    0xcc,
-    0x00,
-    0x81,
-    0x55,
-    0xbf,
-    0xfe,
-    0x3b,
-    0x45,
-    0xd8,
-    0x37,
-    0x3f,
-    0x6a,
-    0x12,
-    0xcc,
-    0xfa,
-    0x10,
-    0xdd,
-    0x7d,
-    0xf8,
-    0x23,
-    0xc0,
-    0xc1,
-    0xa7,
-    0xe6,
-    0x41,
-    0x15,
-    0x5e,
-    0xe8,
-    0x09,
-    0x94,
-    0x9d,
-    0x35,
-    0x44,
-    0xc8,
-    0x97,
-    0xc9,
-    0x47,
-    0xc0,
-    0xed,
-    0x4a,
-    0x75,
-    0x62,
-    0xbd,
-    0xf6,
-    0x63,
-    0x03,
-    0xdb,
-    0xda,
-    0x3a,
-    0x35,
-    0x5e,
-    0x44,
-    0x5d,
-    0xe0,
-    0x5f,
-    0x7c,
-    0x4c,
-    0x95,
-    0xfd,
-    0xaf,
-    0xc9,
-    0x1e,
-    0xa4,
-    0x2c,
-    0x39,
-    0x5a,
-    0x90,
-    0xd3,
-    0x4c,
-    0x48,
-    0x8c,
-    0xc9,
-    0xe0,
-    0x61,
-    0x00,
-    0x71,
-    0x23,
-    0x2b,
-    0x2a,
-    0x98,
-    0xf8,
-    0x0b,
-    0xac,
-    0xf0,
-    0x9d,
-    0x5a,
-    0x47,
-    0xc0,
-    0x8a,
-    0xbc,
-    0xe6,
-    0xd9,
-    0x9c,
-    0xad,
-    0xde,
-    0xcc,
-    0x72,
-    0x5d,
-    0x74,
-    0x5a,
-    0x18,
-    0xbe,
-    0xa0,
-    0x2c,
-    0xe2,
-    0xdb,
-    0x10,
-    0xc5,
-    0x9b,
-    0x6b,
-    0x70,
-    0xb4,
-    0xdf,
-    0xa6,
-    0xe9,
-    0x0e,
-    0xc6,
-    0x57,
-    0xe7,
-    0x1b,
-    0xc3,
-    0x33,
-    0x20,
-    0x50,
-    0xcb,
-    0x69,
-    0xd2,
-    0x7d,
-    0xb9,
-    0x7a,
-    0x4b,
-    0x48,
-    0xf1,
-    0x4b,
-    0xaf,
-    0xda,
-    0x43,
-    0x79,
-    0xf6,
-    0xd8,
-    0x13,
-    0xec,
-    0x34,
-    0x95,
-    0xb7,
-    0xaf,
-    0x1d,
-    0x86,
-    0x21,
-    0xfe,
-    0xc8,
-    0xf6,
-    0xbe,
-    0xa1,
-    0xb3,
-    0xfa,
-    0x9d,
-    0x79,
-    0x08,
-    0xa8,
-    0xd4,
-    0x59,
-    0x1e,
-    0x84,
-    0x20,
-    0x17,
-    0x43,
-    0x3b,
-    0xcb,
-    0xe2,
-    0xb9,
-    0x94,
-    0xd3,
-    0xd5,
-    0xfe,
-    0xa3,
-    0x48,
-    0xcd,
-    0x50,
-    0x40,
-    0xf6,
-    0x78,
-    0x71,
-    0xb7,
-    0x44,
-    0xaf,
-    0xa8,
-    0xc1,
-    0x5c,
-    0x06,
-    0x08,
-    0xb3,
-    0x8c,
-    0xa1,
-    0xf4,
-    0xf6,
-    0xec,
-    0x49,
-    0xe3,
-    0xb7,
-    0x42,
-    0xbe,
-    0x61,
-    0xdf,
-    0x22,
-    0x4f,
-    0x57,
-    0x46,
-    0x5a,
-    0xa9,
-    0x8b,
-    0x23,
-    0x8d,
-    0xed,
-    0x6a,
-    0xc8,
-    0x1d,
-    0x05,
-    0x06,
-    0x8c,
-    0x4e,
-    0x37,
-    0x5b,
-    0x08,
-    0xa9,
-    0xfa,
-    0xd6,
-    0x86,
-    0x9f,
-    0x09,
-    0x18,
-    0xb6,
-    0x6f,
-    0xb7,
-    0xf7,
-    0xa3,
-    0x4a,
-    0x82,
-    0xc5,
-    0xe6,
-    0xb4,
-    0xea,
-    0xd5,
-    0x19,
-    0x2d,
-    0x84,
-    0x3c,
-    0x8f,
-    0x11,
-    0x4a,
-    0xd5,
-    0x42,
-    0xbd,
-    0x35,
-    0x88,
-    0x0d,
-    0xf3,
-    0x0e,
-    0xcb,
-    0x1c,
-    0x80,
-    0x81,
-    0x68,
-    0xa0,
-    0x1b,
-    0x73,
-    0x81,
-    0xc7,
-    0x91,
-    0x95,
-    0xd2,
-    0xeb,
-    0x1f,
-    0x39,
-    0x37,
-    0x0a,
-    0x1f,
-    0x65,
-    0x6e,
-    0x76,
-    0xe8,
-    0x26,
-    0x1d,
-    0xcd,
-    0xef,
-    0x27,
-    0x17,
-    0x2c,
-    0x32,
-    0x82,
-    0xdb,
-    0xa0,
-    0xd6,
-    0xd6,
-    0x5e,
-    0xdd,
-    0x0e,
-    0x9a,
-    0x0a,
-    0x33,
-    0x40,
-    0xb1,
-    0x06,
-    0xbd,
-    0x63,
-    0x3e,
-    0xb8,
-    0xdc,
-    0xac,
-    0xb9,
-    0x88,
-    0xe3,
-    0x69,
-    0x43,
-    0xe7,
-    0x14,
-    0x2d,
-    0x36,
-    0x90,
-    0xcc,
-    0x2d,
-    0x01,
-    0x0e,
-    0xfa,
-    0xea,
-    0x33,
-    0x7f,
-    0xd5,
-    0x10,
-    0xd5,
-    0x97,
-    0xcf,
-    0x9e,
-    0xfd,
-    0xe8,
-    0xc4,
-    0x48,
-    0xa0,
-    0x60,
-    0x78,
-    0x1a,
-    0xa8,
-    0x13,
-    0x40,
-    0x5d,
-    0x46,
-    0x3a,
-    0xff,
-    0xbe,
-    0x8a,
-    0x7c,
-    0x54,
-    0xad,
-    0x31,
-    0x6d,
-    0x12,
-    0x04,
-    0xbe,
-    0x55,
-    0xf1,
-    0xe9,
-    0xcc,
-    0x32,
-    0x83,
-    0xf5,
-    0xa2,
-    0x00,
-    0x69,
-    0x96,
-    0x08,
-    0x37,
-    0xc6,
-    0xb1,
-    0x59,
-    0x96,
-    0xf4,
-    0x8c,
-    0xda,
-    0x1f,
-    0x76,
-    0xec,
-    0x4a,
-    0x63,
-    0x2e,
-    0x7a,
-    0xba,
-    0xff,
-    0xd0,
-    0x6b,
-    0x9f,
-    0x67,
-    0x97,
-    0x60,
-    0x26,
-    0xe2,
-    0x37,
-    0x8b,
-    0xc7,
-    0xd6,
-    0x12,
-    0x14,
-    0x1d,
-    0x46,
-    0xae,
-    0xbb,
-    0xf5,
-    0x99,
-    0x67,
-    0xbe,
-    0xa5,
-    0x9d,
-    0x61,
-    0xfd,
-    0x9f,
-    0xcb,
-    0xc1,
-    0x5c,
-    0x45,
-    0xcd,
-    0x1d,
-    0x69,
-    0xff,
-    0x3d,
-    0x30,
-    0x3f,
-    0x8b,
-    0xb0,
-    0xd3,
-    0xaa,
-    0x95,
-    0xf3,
-    0x29,
-    0x8b,
-    0x88,
-    0x94,
-    0x19,
-    0x7e,
-    0xa3,
-    0xa4,
-    0x01,
-    0xbb,
-    0x4f,
-    0xbc,
-    0xa8,
-    0x3a,
-    0xb0,
-    0x3e,
-    0x75,
-    0x1b,
-    0x7a,
-    0xdd,
-    0xdf,
-    0x44,
-    0x06,
-    0x60,
-    0x25,
-    0x4c,
-    0xa5,
-    0xa2,
-    0x3f,
-    0x98,
-    0x34,
-    0xde,
-    0x14,
-    0xc3,
-    0xf0,
-    0x29,
-    0xed,
-    0x43,
-    0x8c,
-    0x40,
-    0x2a,
-    0x4a,
-    0x81,
-    0x84,
-    0x34,
-    0xeb,
-    0xa6,
-    0x43,
-    0xb2,
-    0x7e,
-    0x00,
-    0x39,
-    0x00,
-    0x45,
-    0xdb,
-    0x57,
-    0xdc,
-    0x50,
-    0x19,
-    0xc3,
-    0x63,
-    0x9d,
-    0xcb,
-    0x1f,
-    0x3d,
-    0x84,
-    0xfe,
-    0x0e,
-    0x14,
-    0x52,
-    0xd7,
-    0xf4,
-    0x4a,
-    0x35,
-    0xe3,
-    0xfe,
-    0xeb,
-    0x58,
-    0xa8,
-    0x63,
-    0xe0,
-    0x4e,
-    0x80,
-    0xe9,
-    0x66,
-    0xb4,
-    0xa7,
-    0xaa,
-    0xbf,
-    0x12,
-    0x92,
-    0x18,
-    0x27,
-    0x03,
-    0x82,
-    0x3f,
-    0x0a,
-    0x96,
-    0x5a,
-    0x4a,
-    0x74,
-    0xf3,
-    0xad,
-    0x49,
-    0xc9,
-    0x42,
-    0x1c,
-    0x31,
-    0xb6,
-    0xc8,
-    0xdf,
-    0x24,
-    0x67,
-    0x53,
-    0xa1,
-    0xf3,
-    0xfb,
-    0xd9,
-    0x91,
-    0xe2,
-    0x35,
-    0x5c,
-    0xb6,
-    0xab,
-    0x74,
-    0x10,
-    0x82,
-    0xc5,
-    0xe5,
-    0xc0,
-    0xab,
-    0xe5,
-    0xf7,
-    0x6e,
-    0x36,
-    0xc6,
-    0x0f,
-    0x3a,
-    0xd5,
-    0x26,
-    0x7e,
-    0x85,
-    0x72,
-    0x11,
-    0xb0,
-    0x55,
-    0x0c,
-    0x61,
-    0xa5,
-    0xfb,
-    0xc2,
-    0x86,
-    0xa5,
-    0xf4,
-    0x2d,
-    0x83,
-    0x30,
-    0x0e,
-    0xf3,
-    0x39,
-    0x35,
-    0xcb,
-    0x99,
-    0xe8,
-    0x84,
-    0x0a,
-    0x99,
-    0xf3,
-    0x84,
-    0xe4,
-    0xb5,
-    0xe3,
-    0x29,
-    0xd5,
-    0x8a,
-    0xaf,
-    0x21,
-    0x1c,
-    0x68,
-    0x3b,
-    0x4e,
-    0x64,
-    0x61,
-    0x1e,
-    0x79,
-    0xa3,
-    0xa0,
-    0xa8,
-    0x45,
-    0x43,
-    0xfd,
-    0x24,
-    0x61,
-    0x80,
-    0xce,
-    0x5a,
-    0x02,
-    0x11,
-    0xff,
-    0x58,
-    0x91,
-    0x0a,
-    0x65,
-    0x72,
-    0xa0,
-    0x01,
-    0x4f,
-    0x88,
-    0x23,
-    0x6f,
-    0x5e,
-    0x87,
-    0xdd,
-    0x5a,
-    0x97,
-    0x32,
-    0x18,
-    0x31,
-    0xb7,
-    0x23,
-    0x99,
-    0xf8,
-    0xc6,
-    0x0c,
-    0xd3,
-    0xa4,
-    0xef,
-    0x43,
-    0x5b,
-    0xc9,
-    0x8f,
-    0x7e,
-    0x9c,
-    0x72,
-    0x8c,
-    0xdb,
-    0xcc,
-    0x50,
-    0xe8,
-    0x23,
-    0x1f,
-    0x18,
-    0x96,
-    0x4f,
-    0x3a,
-    0x26,
-    0x8c,
-    0x4b,
-    0xea,
-    0x66,
-    0x19,
-    0xfb,
-    0x16,
-    0x74,
-    0x79,
-    0x7c,
-    0xf2,
-    0x02,
-    0xa7,
-    0xac,
-    0x76,
-    0x7b,
-    0x72,
-    0xec,
-    0x0f,
-    0xe5,
-    0xd3,
-    0x24,
-    0x94,
-    0x0c,
-    0x7e,
-    0x08,
-    0x7b,
-    0xdd,
-    0xb7,
-    0x9a,
-    0x4d,
-    0x10,
-    0x67,
-    0xf0,
-    0x57,
-    0x0a,
-    0x6f,
-    0x38,
-    0xa3,
-    0x01,
-    0x3c,
-    0xf9,
-    0x26,
-    0x61,
-    0x9b,
-    0x9c,
-    0x3b,
-    0x6e,
-    0xcf,
-    0x2a,
-    0x50,
-    0x2b,
-    0xe2,
-    0x57,
-    0xdf,
-    0x7b,
-    0x38,
-    0xc0,
-    0xa1,
-    0x87,
-    0x6a,
-    0x71,
-    0xfe,
-    0x5f,
-    0x51,
-    0xaa,
-    0xc7,
-    0xe4,
-    0x60,
-    0xe3,
-    0x27,
-    0xe5,
-    0x37,
-    0x0d,
-    0xd7,
-    0x88,
-    0x76,
-    0x1b,
-    0x92,
-    0xec,
-    0xcf,
-    0xc1,
-    0xc9,
-    0x0c,
-    0x60,
-    0x7b,
-    0x97,
-    0xe7,
-    0x3f,
-    0xd2,
-    0xf7,
-    0xde,
-    0x56,
-    0xdb,
-    0x35,
-    0x5d,
-    0x71,
-    0x00,
-    0xa2,
-    0xbd,
-    0x95,
-    0x02,
-    0x8c,
-    0x69,
-    0x94,
-    0x3f,
-    0x6d,
-    0x40,
-    0xde,
-    0x31,
-    0x63,
-    0x3b,
-    0x9a,
-    0x38,
-    0xe0,
-    0x50,
-    0xf5,
-    0x99,
-    0xa3,
-    0x96,
-    0xba,
-    0xc6,
-    0xe7,
-    0xa9,
-    0x24,
-    0xe0,
-    0xda,
-    0x50,
-    0xf0,
-    0x7a,
-    0x50,
-    0x5d,
-    0xb5,
-    0xa0,
-    0xb9,
-    0xd5,
-    0x78,
-    0x17,
-    0x50,
-    0x51,
-    0x7b,
-    0xe7,
-    0x96,
-    0xa4,
-    0x57,
-    0x17,
-    0xff,
-    0xbe,
-    0x4a,
-    0xb8,
-    0xeb,
-    0xd1,
-    0xd2,
-    0x25,
-    0xd7,
-    0xb2,
-    0x7b,
-    0x88,
-    0xd5,
-    0x81,
-    0xf5,
-    0xa0,
-    0x39,
-    0x8c,
-    0x69,
-    0xc2,
-    0x96,
-    0x71,
-    0x0d,
-    0x1e,
-    0xe9,
-    0x83,
-    0xf7,
-    0x44,
-    0x13,
-    0x6f,
-    0x2f,
-    0xe7,
-    0x8d,
-    0x20,
-    0x07,
-    0xe0,
-    0x57,
-    0xdf,
-    0xaf,
-    0x75,
-    0x31,
-    0xbf,
-    0x04,
-    0xdc,
-    0x0e,
-    0x38,
-    0xa9,
-    0xfb,
-    0xc6,
-    0x12,
-    0x59,
-    0x72,
-    0x0b,
-    0x84,
-    0x7b,
-    0xdb,
-    0x9e,
-    0x9e,
-    0xf7,
-    0x50,
-    0xc2,
-    0xe4,
-    0x49,
-    0x2e,
-    0xf2,
-    0x3c,
-    0xd4,
-    0x19,
-    0xcf,
-    0x0a,
-    0x78,
-    0x41,
-    0x5c,
-    0x99,
-    0x66,
-    0xe3,
-    0x6d,
-    0xbd,
-    0x33,
-    0x12,
-    0x5d,
-    0xb6,
-    0x2c,
-    0xb7,
-    0x00,
-    0x58,
-    0xea,
-    0xd7,
-    0xd8,
-    0x69,
-    0x26,
-    0x14,
-    0x8c,
-    0x4b,
-    0xce,
-    0x77,
-    0x95,
-    0xda,
-    0x57,
-    0x6c,
-    0x3b,
-    0x98,
-    0x56,
-    0x0e,
-    0xc0,
-    0x08,
-    0x4a,
-    0xa5,
-    0xdb,
-    0x57,
-    0xbc,
-    0x6d,
-    0x68,
-    0x41,
-    0x8b,
-    0x9a,
-    0x5d,
-    0x33,
-    0x81,
-    0x98,
-    0x00,
-    0xad,
-    0x29,
-    0x97,
-    0x57,
-    0xeb,
-    0xe5,
-    0x47,
-    0xe0,
-    0xc4,
-    0x3b,
-    0xe0,
-    0x83,
-    0xd2,
-    0x70,
-    0x66,
-    0xc5,
-    0xd3,
-    0x58,
-    0x2b,
-    0x3e,
-    0x4f,
-    0x6c,
-    0x95,
-    0x4d,
-    0x7c,
-    0x1d,
-    0x21,
-    0x0a,
-    0x5e,
-    0x68,
-    0xa8,
-    0x7c,
-    0x32,
-    0xab,
-    0xe2,
-    0x0d,
-    0x0d,
-    0xb7,
-    0x28,
-    0x3a,
-    0xc1,
-    0x26,
-    0x7e,
-    0x8f,
-    0x00,
-    0xef,
-    0xd0,
-    0xd3,
-    0xc4,
-    0x37,
-    0x7c,
-    0x80,
-    0xed,
-    0x6a,
-    0x11,
-    0x76,
-    0x2c,
-    0x8b,
-    0x56,
-    0xef,
-    0x21,
-    0xc8,
-    0x8f,
-    0xb6,
-    0xc0,
-    0x52,
-    0xfb,
-    0x94,
-    0xf9,
-    0x6b,
-    0xa1,
-    0x0b,
-    0x98,
-    0xc1,
-    0x4d,
-    0x47,
-    0x6a,
-    0xfa,
-    0xd5,
-    0x52,
-    0xa1,
-    0x90,
-    0xa0,
-    0x87,
-    0x79,
-    0xdf,
-    0x69,
-    0x49,
-    0x1c,
-    0x7c,
-    0x41,
-    0xf5,
-    0xc3,
-    0xc9,
-    0xd3,
-    0x14,
-    0x1f,
-    0xc6,
-    0xec,
-    0xd6,
-    0xf7,
-    0x2a,
-    0x3b,
-    0xbc,
-    0x12,
-    0xb3,
-    0x55,
-    0x94,
-    0x57,
-    0xba,
-    0xfb,
-    0xaa,
-    0x33,
-    0x0a,
-    0xa0,
-    0x3d,
-    0x3b,
-    0xf2,
-    0x26,
-    0x30,
-    0x13,
-    0x99,
-    0xe9,
-    0x02,
-    0x8e,
-    0x92,
-    0xfe,
-    0x00,
-    0x16,
-    0xb0,
-    0xbd,
-    0xb9,
-    0x4f,
-    0x1c,
-    0x7c,
-    0xb3,
-    0xf7,
-    0xa4,
-    0x9e,
-    0x5c,
-    0x11,
-    0x56,
-    0xcd,
-    0x43,
-    0x42,
-    0x4e,
-    0x83,
-    0x88,
-    0x7b,
-    0xcc,
-    0xcf,
-    0x92,
-    0xd8,
-    0x8a,
-    0x56,
-    0xff,
-    0xc8,
-    0x4c,
-    0x98,
-    0xe1,
-    0x6f,
-    0xb8,
-    0x74,
-    0x27,
-    0x48,
-    0x68,
-    0xee,
-    0x59,
-    0x0f,
-    0x3e,
-    0x31,
-    0x89,
-    0xde,
-    0xf7,
-    0xd0,
-    0x86,
-    0x96,
-    0x03,
-    0x51,
-    0x52,
-    0x80,
-    0x94,
-    0xec,
-    0xd6,
-    0x34,
-    0xf6,
-    0x90,
-    0xd5,
-    0xba,
-    0x1e,
-    0x27,
-    0x1f,
-    0xf0,
-    0x85,
-    0x1b,
-    0x07,
-    0x2b,
-    0x37,
-    0x19,
-    0x16,
-    0x21,
-    0x26,
-    0x15,
-    0x01,
-    0x07,
-    0xc5,
-    0x8e,
-    0xd9,
-    0xf6,
-    0xd2,
-    0x13,
-    0x82,
-    0x93,
-    0x73,
-    0x06,
-    0x66,
-    0xef,
-    0x85,
-    0xa0,
-    0x6a,
-    0xac,
-    0x31,
-    0x35,
-    0x22,
-    0x62,
-    0xc0,
-    0xb9,
-    0x40,
-    0x40,
-    0xb0,
-    0x84,
-    0x53,
-    0xf7,
-    0x07,
-    0x52,
-    0xae,
-    0xd3,
-    0xe7,
-    0x8e,
-    0xa5,
-    0x2b,
-    0x63,
-    0xd0,
-    0x00,
-    0xfc,
-    0x91,
-    0xa4,
-    0xa9,
-    0xd1,
-    0xe0,
-    0x8d,
-    0xa8,
-    0xe6,
-    0xac,
-    0x49,
-    0x51,
-    0x8c,
-    0x10,
-    0x57,
-    0xbc,
-    0xcf,
-    0xfc,
-    0xb7,
-    0x76,
-    0x57,
-    0x87,
-    0xf1,
-    0x76,
-    0x8c,
-    0x86,
-    0x58,
-    0x53,
-    0xfe,
-    0x5d,
-    0x90,
-    0xb4,
-    0x03,
-    0x15,
-    0x4e,
-    0x07,
-    0xa2,
-    0xaf,
-    0x5f,
-    0x76,
-    0xaf,
-    0xb8,
-    0xec,
-    0x16,
-    0x38,
-    0x1e,
-    0xfc,
-    0x62,
-    0x20,
-    0x42,
-    0x3a,
-    0xe9,
-    0x0a,
-    0x4e,
-    0xf9,
-    0x43,
-    0x78,
-    0xc9
-  ],
-  const [
-    0x0b,
-    0x6e,
-    0xde,
-    0xb5,
-    0xf0,
-    0x6b,
-    0x22,
-    0x77,
-    0x3d,
-    0x0a,
-    0xf7,
-    0x27,
-    0xdd,
-    0x59,
-    0xbd,
-    0xf5,
-    0x52,
-    0xa1,
-    0x30,
-    0x00,
-    0x4c,
-    0xa4,
-    0x97,
-    0xbd,
-    0x7a,
-    0x23,
-    0x3d,
-    0x9d,
-    0xa0,
-    0xa3,
-    0x25,
-    0xea,
-    0xea,
-    0x71,
-    0xfa,
-    0xf2,
-    0x80,
-    0xe4,
-    0x45,
-    0x68,
-    0x5a,
-    0xe2,
-    0xe3,
-    0x07,
-    0x56,
-    0xa5,
-    0xb5,
-    0x78,
-    0x87,
-    0xbf,
-    0x99,
-    0x76,
-    0xd0,
-    0x5c,
-    0x99,
-    0x30,
-    0xb2,
-    0xc8,
-    0x63,
-    0xef,
-    0x63,
-    0x31,
-    0xf9,
-    0xf8,
-    0x20,
-    0xad,
-    0xaa,
-    0xb4,
-    0xc3,
-    0x7f,
-    0x41,
-    0x0e,
-    0x98,
-    0x96,
-    0x7c,
-    0x1d,
-    0x6d,
-    0x56,
-    0xc0,
-    0x03,
-    0xe8,
-    0x9b,
-    0x0a,
-    0x15,
-    0x1e,
-    0xfb,
-    0x29,
-    0x3c,
-    0x60,
-    0x4c,
-    0x2b,
-    0x9a,
-    0x58,
-    0x66,
-    0x15,
-    0x71,
-    0x56,
-    0x2a,
-    0xd7,
-    0x41,
-    0xe4,
-    0xc4,
-    0x7e,
-    0x31,
-    0xa0,
-    0x2c,
-    0xac,
-    0xb0,
-    0x4b,
-    0xf3,
-    0x45,
-    0x5c,
-    0x1d,
-    0x3c,
-    0x6c,
-    0x23,
-    0x5b,
-    0x09,
-    0xae,
-    0xa8,
-    0x2c,
-    0xb8,
-    0x7c,
-    0xe8,
-    0xa9,
-    0xcd,
-    0xdf,
-    0x1d,
-    0x33,
-    0xf1,
-    0x67,
-    0xe3,
-    0x09,
-    0x3b,
-    0x65,
-    0x99,
-    0x19,
-    0xaf,
-    0x59,
-    0x0a,
-    0x17,
-    0x04,
-    0xae,
-    0x4c,
-    0xcd,
-    0xab,
-    0xa5,
-    0xe9,
-    0xb2,
-    0x0c,
-    0x90,
-    0x3d,
-    0xbd,
-    0x13,
-    0x40,
-    0x1f,
-    0x7b,
-    0xeb,
-    0xc0,
-    0xc4,
-    0x60,
-    0x09,
-    0x44,
-    0xdf,
-    0x5b,
-    0x6d,
-    0x5c,
-    0x0d,
-    0xac,
-    0x24,
-    0x6d,
-    0x71,
-    0xfa,
-    0x12,
-    0x62,
-    0x9b,
-    0xa0,
-    0xee,
-    0x9f,
-    0xaf,
-    0x49,
-    0x8e,
-    0x36,
-    0xc3,
-    0xbc,
-    0x65,
-    0x5e,
-    0x88,
-    0xf9,
-    0x4a,
-    0x21,
-    0x2d,
-    0x84,
-    0x7a,
-    0x54,
-    0x80,
-    0x01,
-    0xe1,
-    0xcc,
-    0x57,
-    0x01,
-    0x95,
-    0xcf,
-    0x2e,
-    0x1c,
-    0xa4,
-    0xc9,
-    0x11,
-    0x40,
-    0x0f,
-    0x40,
-    0xbd,
-    0x48,
-    0x16,
-    0x0a,
-    0x02,
-    0xd0,
-    0xb6,
-    0xbe,
-    0x6b,
-    0x48,
-    0x71,
-    0x68,
-    0x21,
-    0x48,
-    0x4d,
-    0x81,
-    0x0d,
-    0x23,
-    0x1f,
-    0x1e,
-    0x3d,
-    0xbf,
-    0x09,
-    0x67,
-    0x89,
-    0xa4,
-    0x42,
-    0x4b,
-    0x76,
-    0x52,
-    0x15,
-    0x72,
-    0x5a,
-    0xd8,
-    0x2d,
-    0x73,
-    0xc1,
-    0xa2,
-    0x0f,
-    0x48,
-    0x10,
-    0x93,
-    0xe8,
-    0xff,
-    0x68,
-    0x54,
-    0x89,
-    0xb1,
-    0xcd,
-    0xeb,
-    0xb0,
-    0xb8,
-    0x88,
-    0x8f,
-    0x89,
-    0x1d,
-    0xc9,
-    0xba,
-    0x74,
-    0x50,
-    0x91,
-    0x81,
-    0x09,
-    0x1c,
-    0xcf,
-    0x21,
-    0x59,
-    0xd9,
-    0xca,
-    0xda,
-    0x77,
-    0xe4,
-    0xbe,
-    0x00,
-    0x38,
-    0x4c,
-    0xca,
-    0x4f,
-    0x36,
-    0xce,
-    0x09,
-    0x7f,
-    0x1b,
-    0x04,
-    0x00,
-    0x18,
-    0x1c,
-    0xd9,
-    0x38,
-    0x88,
-    0xc3,
-    0x40,
-    0x2b,
-    0x72,
-    0xf2,
-    0x26,
-    0x65,
-    0x4a,
-    0x25,
-    0xa4,
-    0xe3,
-    0x1f,
-    0xf7,
-    0x7a,
-    0xbf,
-    0xb7,
-    0xe8,
-    0xb9,
-    0x0f,
-    0xe1,
-    0x5d,
-    0xbf,
-    0x0a,
-    0x07,
-    0xe8,
-    0x68,
-    0x6c,
-    0x03,
-    0xca,
-    0x83,
-    0x1c,
-    0x33,
-    0xb6,
-    0x83,
-    0x0c,
-    0xd0,
-    0xd8,
-    0x77,
-    0x61,
-    0x7b,
-    0x16,
-    0x3d,
-    0xd5,
-    0x19,
-    0x96,
-    0xf2,
-    0x59,
-    0xe1,
-    0x80,
-    0xac,
-    0xfe,
-    0xb3,
-    0x05,
-    0x6c,
-    0x15,
-    0xac,
-    0xa0,
-    0x4e,
-    0x95,
-    0xf7,
-    0x9b,
-    0x03,
-    0xbe,
-    0xe6,
-    0xd6,
-    0x81,
-    0xfc,
-    0x41,
-    0xc4,
-    0xf9,
-    0x0e,
-    0xde,
-    0xb6,
-    0x0a,
-    0x67,
-    0x71,
-    0x5c,
-    0x34,
-    0xd5,
-    0xa6,
-    0x88,
-    0x8f,
-    0x60,
-    0x6d,
-    0x36,
-    0xbd,
-    0x75,
-    0x95,
-    0xca,
-    0x1d,
-    0x44,
-    0x9d,
-    0x98,
-    0x41,
-    0x66,
-    0xc7,
-    0xa9,
-    0xa3,
-    0xc3,
-    0x6d,
-    0xbc,
-    0x93,
-    0xb3,
-    0x98,
-    0x8c,
-    0x74,
-    0x63,
-    0xcf,
-    0x51,
-    0x28,
-    0x7b,
-    0x2d,
-    0x89,
-    0xc9,
-    0xfd,
-    0xb7,
-    0xf8,
-    0x9a,
-    0x70,
-    0xec,
-    0xee,
-    0x3d,
-    0x3f,
-    0x9d,
-    0xc8,
-    0x26,
-    0x5c,
-    0xfe,
-    0xb9,
-    0x4f,
-    0x28,
-    0xfe,
-    0xcb,
-    0x2d,
-    0x97,
-    0xd4,
-    0x20,
-    0xe4,
-    0x8f,
-    0xda,
-    0x7e,
-    0xb7,
-    0x92,
-    0x9f,
-    0x0b,
-    0xc2,
-    0x9d,
-    0x37,
-    0x54,
-    0xeb,
-    0x50,
-    0xd6,
-    0x94,
-    0x16,
-    0x4e,
-    0x9e,
-    0x34,
-    0x98,
-    0xe7,
-    0xb4,
-    0x8e,
-    0xee,
-    0xf5,
-    0x99,
-    0xf6,
-    0xb0,
-    0x03,
-    0xb8,
-    0xfb,
-    0xc0,
-    0xb5,
-    0x3b,
-    0xea,
-    0xc7,
-    0x64,
-    0x23,
-    0x94,
-    0xe2,
-    0x08,
-    0x98,
-    0x51,
-    0x98,
-    0x5b,
-    0x7d,
-    0x45,
-    0x10,
-    0x3b,
-    0x48,
-    0xe2,
-    0x80,
-    0x50,
-    0x11,
-    0xae,
-    0xe9,
-    0xf0,
-    0xe8,
-    0x47,
-    0x02,
-    0x3f,
-    0x6c,
-    0xa4,
-    0x71,
-    0x9b,
-    0x9a,
-    0x9d,
-    0x41,
-    0x37,
-    0xe2,
-    0xae,
-    0x91,
-    0x05,
-    0x80,
-    0xf8,
-    0x89,
-    0xda,
-    0x09,
-    0x88,
-    0x93,
-    0xcd,
-    0x44,
-    0xdc,
-    0xc7,
-    0xe0,
-    0x3c,
-    0xa3,
-    0xa6,
-    0xe2,
-    0x93,
-    0xc5,
-    0x0c,
-    0x93,
-    0x19,
-    0xa3,
-    0x60,
-    0x0a,
-    0x9d,
-    0xa0,
-    0x0e,
-    0x54,
-    0x04,
-    0xe0,
-    0x37,
-    0x5e,
-    0x98,
-    0x50,
-    0xa7,
-    0x14,
-    0xa2,
-    0xe6,
-    0x07,
-    0xcb,
-    0x3a,
-    0x2a,
-    0x53,
-    0xdc,
-    0x5e,
-    0xf5,
-    0x8f,
-    0x92,
-    0x42,
-    0x78,
-    0xb6,
-    0x47,
-    0xe7,
-    0x81,
-    0xf4,
-    0xc9,
-    0xef,
-    0xfa,
-    0x14,
-    0x03,
-    0xb0,
-    0xb2,
-    0x3c,
-    0xd9,
-    0x87,
-    0x61,
-    0xd8,
-    0x53,
-    0x6e,
-    0xe6,
-    0xd4,
-    0xfe,
-    0xd1,
-    0xd2,
-    0x0e,
-    0x8f,
-    0x9e,
-    0x2a,
-    0x0b,
-    0xca,
-    0x9c,
-    0x69,
-    0xe9,
-    0xa2,
-    0xfd,
-    0xc5,
-    0x94,
-    0xa2,
-    0x36,
-    0xb3,
-    0x3d,
-    0x8b,
-    0x0e,
-    0xad,
-    0x08,
-    0x3f,
-    0xf5,
-    0x33,
-    0x05,
-    0xdd,
-    0x98,
-    0x10,
-    0x62,
-    0x2e,
-    0xb2,
-    0xde,
-    0xdf,
-    0x40,
-    0x25,
-    0xcc,
-    0x81,
-    0x50,
-    0x49,
-    0x9f,
-    0x8b,
-    0xed,
-    0x84,
-    0xf7,
-    0xaa,
-    0x5b,
-    0x1b,
-    0xd4,
-    0x70,
-    0x36,
-    0x47,
-    0x58,
-    0x03,
-    0x57,
-    0x8c,
-    0xcf,
-    0x17,
-    0xfc,
-    0x46,
-    0xec,
-    0x19,
-    0x22,
-    0x85,
-    0x55,
-    0xad,
-    0x36,
-    0x1a,
-    0x63,
-    0x5b,
-    0xed,
-    0xf2,
-    0x22,
-    0x85,
-    0x71,
-    0xa3,
-    0xa0,
-    0x9d,
-    0xbd,
-    0x45,
-    0x64,
-    0x95,
-    0x4a,
-    0x83,
-    0x3c,
-    0x96,
-    0xeb,
-    0xf1,
-    0x3c,
-    0xf4,
-    0xf5,
-    0xa1,
-    0x03,
-    0x62,
-    0xa4,
-    0xf1,
-    0x40,
-    0x62,
-    0xba,
-    0xa6,
-    0x75,
-    0x00,
-    0x69,
-    0x3f,
-    0xfb,
-    0xc0,
-    0x73,
-    0x83,
-    0x47,
-    0xd5,
-    0x90,
-    0x5d,
-    0x6b,
-    0x93,
-    0x10,
-    0xe9,
-    0xdf,
-    0x27,
-    0xc1,
-    0xcf,
-    0x82,
-    0x86,
-    0x13,
-    0xd0,
-    0xdc,
-    0xa3,
-    0x7a,
-    0x9e,
-    0xa6,
-    0xe5,
-    0x14,
-    0xf1,
-    0x8c,
-    0xd8,
-    0x8c,
-    0xd7,
-    0x31,
-    0x23,
-    0x3e,
-    0x4b,
-    0x74,
-    0xba,
-    0x9c,
-    0x0a,
-    0xf2,
-    0x54,
-    0xd0,
-    0xa2,
-    0xcb,
-    0x20,
-    0xa3,
-    0xcc,
-    0xaa,
-    0xb3,
-    0x9d,
-    0xfb,
-    0xff,
-    0x45,
-    0x6d,
-    0x35,
-    0x8f,
-    0x1e,
-    0x8c,
-    0x22,
-    0x2f,
-    0x4b,
-    0x1e,
-    0x63,
-    0xcc,
-    0x95,
-    0x19,
-    0x24,
-    0xaf,
-    0xb4,
-    0xa8,
-    0xf5,
-    0xff,
-    0xbf,
-    0xd2,
-    0xd5,
-    0x88,
-    0xe7,
-    0x57,
-    0x90,
-    0xba,
-    0x65,
-    0xda,
-    0x4c,
-    0xf5,
-    0xb1,
-    0x45,
-    0x5e,
-    0x04,
-    0xf5,
-    0x6a,
-    0x62,
-    0xe7,
-    0xc1,
-    0xe6,
-    0x8a,
-    0xd5,
-    0x00,
-    0x4b,
-    0x36,
-    0x81,
-    0x2b,
-    0x7e,
-    0xc5,
-    0x9d,
-    0xbc,
-    0x5d,
-    0xab,
-    0x9c,
-    0xe6,
-    0xa5,
-    0xc4,
-    0xbd,
-    0x83,
-    0x13,
-    0xe9,
-    0x45,
-    0x4e,
-    0xca,
-    0xc0,
-    0x0b,
-    0x52,
-    0xf5,
-    0xd8,
-    0x3a,
-    0xa2,
-    0xad,
-    0xf5,
-    0x53,
-    0x4b,
-    0x1d,
-    0xa8,
-    0x71,
-    0x87,
-    0xe4,
-    0x23,
-    0xd1,
-    0x33,
-    0xba,
-    0x4c,
-    0x91,
-    0x83,
-    0x57,
-    0x10,
-    0xb8,
-    0xf5,
-    0x91,
-    0xfa,
-    0x77,
-    0x83,
-    0xc4,
-    0x04,
-    0xaf,
-    0x1d,
-    0x76,
-    0xad,
-    0xb2,
-    0x56,
-    0x3b,
-    0x4b,
-    0x4e,
-    0x5e,
-    0xd7,
-    0xa3,
-    0x08,
-    0x30,
-    0xa3,
-    0xb7,
-    0xa5,
-    0x0c,
-    0x32,
-    0xdf,
-    0xef,
-    0x28,
-    0x33,
-    0x1b,
-    0xb5,
-    0xa3,
-    0x99,
-    0xa8,
-    0x14,
-    0xba,
-    0xfa,
-    0xd1,
-    0xf5,
-    0x3e,
-    0x35,
-    0x08,
-    0xd7,
-    0x45,
-    0x58,
-    0x35,
-    0xcf,
-    0x21,
-    0xc1,
-    0x4e,
-    0xcc,
-    0x8e,
-    0x83,
-    0x28,
-    0x20,
-    0x2f,
-    0x0b,
-    0x8d,
-    0x3c,
-    0x3c,
-    0x03,
-    0x8e,
-    0xbb,
-    0x75,
-    0x76,
-    0x1a,
-    0xa3,
-    0x5a,
-    0x35,
-    0xd0,
-    0xe7,
-    0x9d,
-    0x7a,
-    0x12,
-    0x30,
-    0xd8,
-    0xcc,
-    0x5b,
-    0xdc,
-    0x7c,
-    0x22,
-    0xd2,
-    0x47,
-    0x09,
-    0x4b,
-    0x1f,
-    0x4a,
-    0x85,
-    0x8d,
-    0x7d,
-    0x02,
-    0x27,
-    0x8d,
-    0x10,
-    0xd3,
-    0x53,
-    0x6e,
-    0x7a,
-    0xac,
-    0xcb,
-    0x3d,
-    0xa9,
-    0x8c,
-    0x23,
-    0x8d,
-    0xf2,
-    0x45,
-    0x75,
-    0x5e,
-    0x64,
-    0x80,
-    0x57,
-    0x44,
-    0x56,
-    0x01,
-    0x0a,
-    0xc5,
-    0x43,
-    0x2c,
-    0xf4,
-    0x02,
-    0xd8,
-    0xc8,
-    0x50,
-    0x9a,
-    0x4a,
-    0x04,
-    0x25,
-    0xcb,
-    0xed,
-    0xb7,
-    0x74,
-    0xda,
-    0x03,
-    0xec,
-    0xb6,
-    0xb5,
-    0xd1,
-    0x9e,
-    0x86,
-    0xd8,
-    0xf9,
-    0xc0,
-    0x9a,
-    0x6d,
-    0x03,
-    0x81,
-    0xf7,
-    0xb7,
-    0x3d,
-    0xcd,
-    0x65,
-    0xb0,
-    0xc5,
-    0x17,
-    0x21,
-    0xf1,
-    0xe4,
-    0x56,
-    0xd3,
-    0xd3,
-    0x9d,
-    0x4d,
-    0xbf,
-    0xd4,
-    0x86,
-    0x10,
-    0x3f,
-    0x3c,
-    0xd7,
-    0xc4,
-    0x71,
-    0x00,
-    0xc1,
-    0xa6,
-    0x2d,
-    0xe6,
-    0x01,
-    0x4f,
-    0x3a,
-    0xea,
-    0xb4,
-    0x36,
-    0xc1,
-    0xe0,
-    0x6d,
-    0x76,
-    0x01,
-    0x5c,
-    0x85,
-    0xd1,
-    0x45,
-    0xcf,
-    0xb2,
-    0xf5,
-    0x13,
-    0xf2,
-    0xdb,
-    0xff,
-    0xa7,
-    0x68,
-    0x2b,
-    0x3e,
-    0xa0,
-    0x9f,
-    0x65,
-    0x39,
-    0xf8,
-    0xf7,
-    0x77,
-    0xf3,
-    0x39,
-    0x26,
-    0x51,
-    0x6d,
-    0xee,
-    0xdb,
-    0xf7,
-    0x6d,
-    0x58,
-    0xa1,
-    0xd5,
-    0x7e,
-    0x63,
-    0x06,
-    0x54,
-    0x38,
-    0xd8,
-    0xfd,
-    0xaa,
-    0xc1,
-    0xd4,
-    0x82,
-    0xf6,
-    0x94,
-    0x79,
-    0x7c,
-    0x8c,
-    0x81,
-    0xe3,
-    0xe7,
-    0x8d,
-    0xf5,
-    0x5e,
-    0x32,
-    0xbc,
-    0x7c,
-    0xd6,
-    0xe6,
-    0x8c,
-    0x84,
-    0x8f,
-    0x89,
-    0x7e,
-    0x64,
-    0x16,
-    0xc2,
-    0xa9,
-    0x9d,
-    0x77,
-    0xbe,
-    0x9a,
-    0x5f,
-    0xb0,
-    0xd1,
-    0x5f,
-    0x4f,
-    0x66,
-    0x61,
-    0xdf,
-    0x87,
-    0xd7,
-    0x00,
-    0x6d,
-    0xde,
-    0x10,
-    0xd8,
-    0x9c,
-    0x6a,
-    0x5f,
-    0x4c,
-    0x54,
-    0x44,
-    0x0c,
-    0xdc,
-    0x25,
-    0x8b,
-    0x44,
-    0x49,
-    0xdc,
-    0xac,
-    0x56,
-    0xfa,
-    0x54,
-    0xe0,
-    0x22,
-    0x9f,
-    0x8f,
-    0xf6,
-    0xcd,
-    0x14,
-    0x05,
-    0x52,
-    0xba,
-    0x88,
-    0x3c,
-    0x36,
-    0xb6,
-    0xde,
-    0x99,
-    0x40,
-    0x73,
-    0x53,
-    0x76,
-    0x34,
-    0x38,
-    0x62,
-    0x75,
-    0xfc,
-    0xd6,
-    0xe5,
-    0x13,
-    0xed,
-    0xde,
-    0x7c,
-    0x80,
-    0x4c,
-    0x11,
-    0x32,
-    0xae,
-    0x11,
-    0x18,
-    0x5e,
-    0xa7,
-    0xea,
-    0x76,
-    0xc8,
-    0x25,
-    0x83,
-    0xba,
-    0x0d,
-    0x5c,
-    0x05,
-    0xf9,
-    0x45,
-    0x1b,
-    0xdd,
-    0x7b,
-    0xe2,
-    0x13,
-    0xbe,
-    0xb5,
-    0xdb,
-    0x76,
-    0xe9,
-    0x77,
-    0x0b,
-    0xc5,
-    0xac,
-    0x67,
-    0xd4,
-    0xe3,
-    0x28,
-    0xae,
-    0x07,
-    0x6d,
-    0x58,
-    0xf1,
-    0x08,
-    0x4e,
-    0x4f,
-    0x83,
-    0x2d,
-    0x8d,
-    0xc1,
-    0xd9,
-    0x68,
-    0x6a,
-    0xc5,
-    0x3e,
-    0x26,
-    0xaa,
-    0xd9,
-    0xc7,
-    0x76,
-    0x2f,
-    0x27,
-    0x8a,
-    0x6e,
-    0xcb,
-    0x07,
-    0x0b,
-    0xca,
-    0x56,
-    0xc4,
-    0xf7,
-    0xd7,
-    0xfe,
-    0xa3,
-    0x15,
-    0x90,
-    0xdf,
-    0x21,
-    0x79,
-    0x06,
-    0xd4,
-    0x7d,
-    0xfb,
-    0x05,
-    0x8c,
-    0x76,
-    0xe7,
-    0xf4,
-    0xe0,
-    0x56,
-    0xf6,
-    0xfd,
-    0x63,
-    0x2f,
-    0x7d,
-    0x6e,
-    0x3b,
-    0x65,
-    0xe5,
-    0x5f,
-    0x30,
-    0x6c,
-    0x5b,
-    0x96,
-    0x03,
-    0xd3,
-    0xc8,
-    0xa7,
-    0x01,
-    0x82,
-    0x04,
-    0x5f,
-    0xd7,
-    0x40,
-    0x47,
-    0x63,
-    0xa8,
-    0x78,
-    0xe0,
-    0x15,
-    0x5d,
-    0x3c,
-    0x29,
-    0xb7,
-    0x3d,
-    0x8a,
-    0xba,
-    0xd3,
-    0xbd,
-    0xce,
-    0xdd,
-    0xda,
-    0x99,
-    0xa9,
-    0x42,
-    0x0b,
-    0x23,
-    0xf1,
-    0xf4,
-    0x96,
-    0xdb,
-    0xf9,
-    0x8c,
-    0x02,
-    0x41,
-    0x12,
-    0xa5,
-    0xcc,
-    0xe7,
-    0x51,
-    0x8f,
-    0x51,
-    0xca,
-    0x93,
-    0x48,
-    0xed,
-    0xe2,
-    0xbf,
-    0xa7,
-    0x65,
-    0xf8,
-    0x4b,
-    0xdb,
-    0x82,
-    0xb8,
-    0x02,
-    0x14,
-    0xff,
-    0x07,
-    0x04,
-    0x80,
-    0xa6,
-    0x97,
-    0x0e,
-    0x79,
-    0xb5,
-    0xb8,
-    0xfb,
-    0xfd,
-    0x86,
-    0x71,
-    0x8b,
-    0x5e,
-    0x6f,
-    0xcf,
-    0x64,
-    0x3a,
-    0xe8,
-    0x7d,
-    0x56,
-    0xae,
-    0xeb,
-    0x95,
-    0xe3,
-    0xc7,
-    0xa1,
-    0xb6,
-    0xff,
-    0x39,
-    0x3a,
-    0x57,
-    0x14,
-    0x54,
-    0x1c,
-    0x5a,
-    0x49,
-    0x33,
-    0x41,
-    0xe4,
-    0x04,
-    0x37,
-    0xda,
-    0x6d,
-    0xad,
-    0xb4,
-    0x39,
-    0x13,
-    0xb6,
-    0xe9,
-    0xed,
-    0x34,
-    0xd8,
-    0x36,
-    0x2f,
-    0x3b,
-    0x9f,
-    0x89,
-    0x7d,
-    0xba,
-    0x28,
-    0x1a,
-    0x84,
-    0xba,
-    0x2a,
-    0x58,
-    0x43,
-    0x4f,
-    0x33,
-    0x22,
-    0x6e,
-    0x6f,
-    0x34,
-    0x3b,
-    0x10,
-    0x03,
-    0x40,
-    0xf8,
-    0x75,
-    0x3f,
-    0x91,
-    0x3c,
-    0x47,
-    0x2f,
-    0xcc,
-    0xa6,
-    0xf7,
-    0x93,
-    0x85,
-    0x09,
-    0x5e,
-    0xed,
-    0x06,
-    0x1d,
-    0xa5,
-    0xd8,
-    0x4c,
-    0x74,
-    0x62,
-    0x9b,
-    0x53,
-    0xaf,
-    0x03,
-    0xfe,
-    0x94,
-    0xf1,
-    0x70,
-    0x5d,
-    0xcb,
-    0x94,
-    0xec,
-    0xfa,
-    0xfd,
-    0x1b,
-    0x3c,
-    0x97,
-    0xba,
-    0x68,
-    0x0c,
-    0x45,
-    0xa0,
-    0x30,
-    0x8e,
-    0x77,
-    0x20,
-    0xab,
-    0x64,
-    0x5a,
-    0x85,
-    0x90,
-    0xc0,
-    0x69,
-    0x31,
-    0x40,
-    0xca,
-    0x3c,
-    0x2a,
-    0x41,
-    0x42,
-    0xa0,
-    0xd6,
-    0xef,
-    0x66,
-    0xed,
-    0x03,
-    0x6e,
-    0x16,
-    0x94,
-    0x2a,
-    0xe3,
-    0x36,
-    0xf8,
-    0xf5,
-    0xe4,
-    0x54,
-    0x7f,
-    0xfe,
-    0x2d,
-    0x8a,
-    0xe8,
-    0xda,
-    0x94,
-    0xa6,
-    0xdf,
-    0x56,
-    0x3f,
-    0x89,
-    0xce,
-    0x00,
-    0x14,
-    0xcd,
-    0xf7,
-    0xea,
-    0x71,
-    0xab,
-    0xc0,
-    0xaa,
-    0x1d,
-    0x1b,
-    0x4d,
-    0xa5,
-    0x7f,
-    0x3c,
-    0x54,
-    0x8e,
-    0x0e,
-    0xf7,
-    0x2d,
-    0x29,
-    0x09,
-    0xdf,
-    0x29,
-    0x55,
-    0x68,
-    0x5c,
-    0x25,
-    0x49,
-    0x12,
-    0x09,
-    0x5f,
-    0x1e,
-    0x50,
-    0x5a,
-    0x88,
-    0x8e,
-    0x82,
-    0x82,
-    0x1a,
-    0xfb,
-    0x11,
-    0x94,
-    0xeb,
-    0xb2,
-    0xa4,
-    0xe8,
-    0x03,
-    0x72,
-    0x97,
-    0xc0,
-    0xaa,
-    0x28,
-    0xa9,
-    0x2b,
-    0xc6,
-    0xfd,
-    0xf4,
-    0x2a,
-    0x64,
-    0x92,
-    0x23,
-    0x12,
-    0x95,
-    0x8a,
-    0xdf,
-    0x31,
-    0x7b,
-    0x4a,
-    0x8a,
-    0xb4,
-    0xa3,
-    0xfc,
-    0x30,
-    0xc8,
-    0x95,
-    0xda,
-    0xba,
-    0x00,
-    0xaa,
-    0xa9,
-    0x65,
-    0xf7,
-    0x1e,
-    0x83,
-    0x73,
-    0x36,
-    0x66,
-    0xda,
-    0x21,
-    0x58,
-    0xc4,
-    0xba,
-    0xd8,
-    0x6c,
-    0x18,
-    0x4e,
-    0xa7,
-    0x9a,
-    0xf9,
-    0xa6,
-    0xf1,
-    0x0a,
-    0x04,
-    0xb7,
-    0x63,
-    0x01,
-    0x74,
-    0xa4,
-    0x29,
-    0x4d,
-    0xf4,
-    0x3c,
-    0x62,
-    0xe4,
-    0xb1,
-    0xc3,
-    0xd1,
-    0xc8,
-    0xb2,
-    0xf5,
-    0xd5,
-    0x2d,
-    0x6c,
-    0x48,
-    0x9b,
-    0xde,
-    0x91,
-    0x72,
-    0x92,
-    0xdd,
-    0x2a,
-    0x2b,
-    0x1f,
-    0x49,
-    0xe5,
-    0x34,
-    0x93,
-    0x85,
-    0xb0,
-    0x98,
-    0x5a,
-    0x97,
-    0x86,
-    0x32,
-    0x74,
-    0xce,
-    0x89,
-    0x6f,
-    0x2a,
-    0xa8,
-    0x52,
-    0x55,
-    0xf9,
-    0xf2,
-    0x85,
-    0xc4,
-    0xd3,
-    0x31,
-    0xa8,
-    0xfc,
-    0x87,
-    0x41,
-    0x35,
-    0x60,
-    0x7d,
-    0x3c,
-    0xed,
-    0x7a,
-    0xa6,
-    0x9e,
-    0x70,
-    0x3e,
-    0xb3,
-    0xa6,
-    0x0b,
-    0x93,
-    0x85,
-    0xff,
-    0xd1,
-    0x0f,
-    0xe5,
-    0x9f,
-    0xed,
-    0x02,
-    0x76,
-    0xf0,
-    0x36,
-    0xb7,
-    0xe7,
-    0x2d,
-    0x04,
-    0xf6,
-    0x6d,
-    0x0f,
-    0x42,
-    0xcd,
-    0x71,
-    0xaa,
-    0xc5,
-    0x91,
-    0x86,
-    0x91,
-    0xdc,
-    0x1f,
-    0x9d,
-    0x41,
-    0x29,
-    0x67,
-    0x7c,
-    0xbd,
-    0xaf,
-    0x2c,
-    0x6c,
-    0x75,
-    0x2b,
-    0x05,
-    0x32,
-    0x6c,
-    0xa8,
-    0xa8,
-    0x41,
-    0x9a,
-    0x4e,
-    0x67,
-    0x2e,
-    0x90,
-    0x7b,
-    0xfb,
-    0x64,
-    0x5a,
-    0x15,
-    0x81,
-    0x19,
-    0xa9,
-    0x1e,
-    0xc2,
-    0x81,
-    0x32,
-    0x88,
-    0xb7,
-    0x41,
-    0x51,
-    0x4b,
-    0x4d,
-    0x26,
-    0xf2,
-    0xb6,
-    0x65,
-    0x17,
-    0xb1,
-    0x02,
-    0x1f,
-    0x48,
-    0x40,
-    0x2d,
-    0x58,
-    0xb1,
-    0x09,
-    0x06,
-    0x71,
-    0xbf,
-    0x15,
-    0x84,
-    0x52,
-    0x49,
-    0x2d,
-    0x5b,
-    0xaf,
-    0xc5,
-    0x3f,
-    0xd1,
-    0x8a,
-    0xbc,
-    0x03,
-    0xce,
-    0xfa,
-    0x7b,
-    0xdd,
-    0x33,
-    0x2a,
-    0x0c,
-    0x06,
-    0x6d,
-    0xa4,
-    0x64,
-    0xe7,
-    0x4a,
-    0xd0,
-    0xde,
-    0xc5,
-    0x0b,
-    0xb7,
-    0xe8,
-    0xa3,
-    0xba,
-    0x0d,
-    0xfc,
-    0x64,
-    0xbe,
-    0x6f,
-    0xd3,
-    0x31,
-    0xac,
-    0xe9,
-    0xd5,
-    0x1a,
-    0x60,
-    0xbb,
-    0xd3,
-    0x00,
-    0x4d,
-    0x5d,
-    0xf8,
-    0xb2,
-    0x11,
-    0xc0,
-    0xfd,
-    0x56,
-    0x4c,
-    0xd7,
-    0x9d,
-    0x0b,
-    0xb3,
-    0x56,
-    0x49,
-    0xcc,
-    0x60,
-    0xba,
-    0x1c,
-    0x97,
-    0x6c,
-    0x89,
-    0x11,
-    0xcf,
-    0xc0,
-    0xdb,
-    0x74,
-    0xe0,
-    0x28,
-    0x19,
-    0x96,
-    0x21,
-    0xaa,
-    0x05,
-    0xc5,
-    0xfe,
-    0x15,
-    0xfa,
-    0x7b,
-    0x56,
-    0xdc,
-    0x75,
-    0xd6,
-    0x22,
-    0x25,
-    0xd5,
-    0x48,
-    0x58,
-    0x1e,
-    0x5f,
-    0x90,
-    0x0f,
-    0x90,
-    0x85,
-    0xe9,
-    0xe3,
-    0xb6,
-    0x68,
-    0x81,
-    0x9b,
-    0x4f,
-    0x9b,
-    0x2c,
-    0x09,
-    0xf2,
-    0x2a,
-    0x5a,
-    0x32,
-    0xa2,
-    0xdb,
-    0x47,
-    0xaf,
-    0xa2,
-    0xb3,
-    0x71,
-    0x53,
-    0x8a,
-    0xbc,
-    0x4f,
-    0x0e,
-    0x9b,
-    0x06,
-    0x40,
-    0x11,
-    0x50,
-    0xec,
-    0xc2,
-    0x33,
-    0x35,
-    0x98,
-    0xe4,
-    0x94,
-    0xfc,
-    0xca,
-    0xfe,
-    0x80,
-    0xce,
-    0xd4,
-    0x9f,
-    0x96,
-    0xdf,
-    0xea,
-    0xc7,
-    0x29,
-    0x45,
-    0x98,
-    0x56,
-    0xe6,
-    0x0a,
-    0x94,
-    0xc5,
-    0xb7,
-    0x80,
-    0xb6,
-    0x14,
-    0xe8,
-    0xd4,
-    0x45,
-    0x03,
-    0x89,
-    0xe6,
-    0x74,
-    0x85,
-    0x13,
-    0x58,
-    0x2c,
-    0x72,
-    0x4e,
-    0xe6,
-    0x0c,
-    0x7c,
-    0x71,
-    0xf5,
-    0xaf,
-    0x64,
-    0x8b,
-    0x6e,
-    0x2d,
-    0x6e,
-    0x23,
-    0xcc,
-    0xe4,
-    0x12,
-    0x1b,
-    0x74,
-    0x78,
-    0xf4,
-    0xdb,
-    0x45,
-    0x18,
-    0x16,
-    0xab,
-    0x71,
-    0x03,
-    0x4c,
-    0x5f,
-    0x8b,
-    0x4b,
-    0xf1,
-    0x3a,
-    0xe1,
-    0xd9,
-    0xd9,
-    0x0d,
-    0x0b,
-    0xb2,
-    0x86,
-    0x9f,
-    0xc4,
-    0x79,
-    0x9f,
-    0x51,
-    0xf9,
-    0x34,
-    0x9d,
-    0x02,
-    0x20,
-    0x53,
-    0xc8,
-    0x31,
-    0xcb,
-    0xee,
-    0x62,
-    0x61,
-    0x7d,
-    0x4e,
-    0x22,
-    0xc2,
-    0xbc,
-    0xaf,
-    0xe4,
-    0x0d,
-    0x67,
-    0x44,
-    0x9e,
-    0xb0,
-    0x4a,
-    0x7c,
-    0x96,
-    0x2b,
-    0xf0,
-    0x84,
-    0xd2,
-    0xba,
-    0xb8,
-    0x0d,
-    0xd0,
-    0x34,
-    0x2b,
-    0x4f,
-    0x78,
-    0x33,
-    0x8d,
-    0x4d,
-    0x4f,
-    0x75,
-    0xb2,
-    0x5b,
-    0xed,
-    0x82,
-    0x14,
-    0xde,
-    0xb1,
-    0x8f,
-    0x22,
-    0x54,
-    0xb3,
-    0xa3,
-    0xda,
-    0x94,
-    0xfa,
-    0xf8,
-    0x99,
-    0x56,
-    0xf0,
-    0xa4,
-    0x32,
-    0xf5,
-    0x12,
-    0x78,
-    0x3e,
-    0x74,
-    0xec,
-    0x29,
-    0xb4,
-    0xc0,
-    0x45,
-    0xad,
-    0xba,
-    0x34,
-    0x97,
-    0xe8,
-    0xba,
-    0x62,
-    0xc2,
-    0x88,
-    0xb7,
-    0x11,
-    0x00,
-    0x2e,
-    0xe2,
-    0x82,
-    0x1c,
-    0xce,
-    0x68,
-    0xf8,
-    0xdf,
-    0x58,
-    0x8f,
-    0x76,
-    0xcc,
-    0x98,
-    0x01,
-    0xcb,
-    0x0d,
-    0x5b,
-    0x67,
-    0xcc,
-    0xac,
-    0xd3,
-    0x3a,
-    0xe1,
-    0x06,
-    0x3c,
-    0xd6,
-    0xc3,
-    0x7d,
-    0xc0,
-    0xd1,
-    0x83,
-    0x6e,
-    0x98,
-    0x8a,
-    0xcf,
-    0x63,
-    0x75,
-    0x05,
-    0x71,
-    0x89,
-    0x1e,
-    0xf6,
-    0x18,
-    0x64,
-    0x5a,
-    0x1b,
-    0x5b,
-    0xc1,
-    0x10,
-    0xcf,
-    0xfb,
-    0xec,
-    0xad,
-    0xdd,
-    0x68,
-    0x24,
-    0xc6,
-    0x92,
-    0x87,
-    0x4c,
-    0xff,
-    0x16,
-    0xb3,
-    0xe3,
-    0x2b,
-    0xfc,
-    0x02,
-    0x36,
-    0xb4,
-    0x17,
-    0xc9,
-    0xd4,
-    0x3d,
-    0x8f,
-    0x62,
-    0x43,
-    0x87,
-    0x35,
-    0x2c,
-    0xf1,
-    0x91,
-    0x14,
-    0xd4,
-    0x6d,
-    0x04,
-    0x48,
-    0xd3,
-    0xd7,
-    0xcd,
-    0x14,
-    0x38,
-    0x96,
-    0x0c,
-    0x2e,
-    0xa8,
-    0x48,
-    0x2d,
-    0x5d,
-    0xa3,
-    0xff,
-    0x54,
-    0x46,
-    0x08,
-    0xaa,
-    0xff,
-    0x83,
-    0xdc,
-    0xd1,
-    0xe7,
-    0xf6,
-    0x47,
-    0x86,
-    0x27,
-    0x5d,
-    0xdf,
-    0x98,
-    0x9f,
-    0x26,
-    0x2a,
-    0x09,
-    0x9b,
-    0x84,
-    0x5d,
-    0xc2,
-    0xb0,
-    0xc2,
-    0x6a,
-    0x86,
-    0xe7,
-    0xd8,
-    0x3a,
-    0x25,
-    0x1e,
-    0x3c,
-    0x37,
-    0xf2,
-    0xaa,
-    0xfa,
-    0x0e,
-    0x76,
-    0x41,
-    0x07,
-    0xb3,
-    0x66,
-    0x18,
-    0xd2,
-    0xa5,
-    0xd3,
-    0x48,
-    0x1d,
-    0x73,
-    0xa1,
-    0x76,
-    0x0b,
-    0x7f,
-    0x3a,
-    0xb3,
-    0x7a,
-    0x02,
-    0x83,
-    0xa1,
-    0x92,
-    0x50,
-    0x10,
-    0xd7,
-    0x9e,
-    0x5e,
-    0x94,
-    0x87,
-    0x1b,
-    0x81,
-    0x9b,
-    0x5e,
-    0x0f,
-    0x78,
-    0x7b,
-    0xac,
-    0x9d,
-    0xad,
-    0x87,
-    0xc5,
-    0xd5,
-    0xb8,
-    0x87,
-    0xa7,
-    0xd1,
-    0x25,
-    0x65,
-    0xdd,
-    0xfd,
-    0x77,
-    0x29,
-    0xa3,
-    0xb6,
-    0x6c,
-    0x27,
-    0x4a,
-    0x17,
-    0x83,
-    0x77,
-    0xde,
-    0x0f,
-    0xbc,
-    0xa6,
-    0x07,
-    0xb7,
-    0x9f,
-    0xab,
-    0x2d,
-    0xe3,
-    0x7f,
-    0x1d,
-    0xdf,
-    0xf8,
-    0x00,
-    0xa3,
-    0x76,
-    0xfd,
-    0xd7,
-    0xab,
-    0xf5,
-    0xf4,
-    0xd1,
-    0x5f,
-    0x34,
-    0x6a,
-    0x17,
-    0xd4,
-    0x3e,
-    0x4d,
-    0xb0,
-    0x85,
-    0xf7,
-    0xfe,
-    0x47,
-    0x01,
-    0x02,
-    0xa7,
-    0x2f,
-    0xe0,
-    0xe1,
-    0xcf,
-    0xa4,
-    0xfb,
-    0x5e,
-    0x2b,
-    0x54,
-    0xdd,
-    0x2a,
-    0xb7,
-    0x1e,
-    0x74,
-    0xc5,
-    0x06,
-    0x19,
-    0x0c,
-    0x9d,
-    0xd6,
-    0xd8,
-    0x7f,
-    0x7a,
-    0xe8,
-    0xec,
-    0xa5,
-    0x19,
-    0x0f,
-    0xab,
-    0x12,
-    0x17,
-    0x86,
-    0x30,
-    0x01,
-    0x12,
-    0x86,
-    0xa3,
-    0x8b,
-    0x0a,
-    0x18,
-    0xbb,
-    0x1d,
-    0x0d,
-    0x29,
-    0x80,
-    0x28,
-    0x13,
-    0xdc,
-    0x56,
-    0x1a,
-    0x27,
-    0x24,
-    0x37,
-    0x8e,
-    0xc7,
-    0x91,
-    0x40,
-    0xbf,
-    0x8e,
-    0x6a,
-    0x6f,
-    0x43,
-    0x10,
-    0xfd,
-    0xab,
-    0xf6,
-    0x06,
-    0x33,
-    0x04,
-    0x34,
-    0xab,
-    0x67,
-    0x3d,
-    0x4b,
-    0x65,
-    0x78,
-    0x87,
-    0x2f,
-    0xa8,
-    0x1d,
-    0x90,
-    0x70,
-    0x17,
-    0x79,
-    0xbc,
-    0x6a,
-    0xed,
-    0xf0,
-    0xb2,
-    0xbc,
-    0x9c,
-    0x38,
-    0x1b,
-    0xfb,
-    0xb4,
-    0xb3,
-    0xa6,
-    0xa7,
-    0x05,
-    0xfc,
-    0x50,
-    0x5d,
-    0x08,
-    0xc0,
-    0xe2,
-    0x4f,
-    0x7b,
-    0xcf,
-    0xbb,
-    0xf2,
-    0x4c,
-    0x72,
-    0xcf,
-    0xf6,
-    0xb8,
-    0x00,
-    0xf0,
-    0x7b,
-    0xb4,
-    0xac,
-    0x4d,
-    0x82,
-    0x8c,
-    0xa1,
-    0x38,
-    0xa1,
-    0xca,
-    0x51,
-    0x2c,
-    0xfc,
-    0x59,
-    0x09,
-    0x0e,
-    0x70,
-    0xea
-  ],
-  const [
-    0xb0,
-    0x51,
-    0x7c,
-    0xc1,
-    0xd4,
-    0x6a,
-    0xe7,
-    0x9e,
-    0x22,
-    0x0c,
-    0x9e,
-    0xe7,
-    0x3a,
-    0x2a,
-    0x54,
-    0xd6,
-    0x7e,
-    0x6d,
-    0xa0,
-    0xf2,
-    0x68,
-    0x34,
-    0xf6,
-    0x32,
-    0x22,
-    0xd9,
-    0xd6,
-    0x65,
-    0x50,
-    0x36,
-    0x43,
-    0xd1,
-    0x30,
-    0x67,
-    0x77,
-    0x1b,
-    0xe6,
-    0xd2,
-    0xd5,
-    0x67,
-    0x11,
-    0x65,
-    0x1f,
-    0xbf,
-    0xa2,
-    0x1f,
-    0xe9,
-    0xb9,
-    0xee,
-    0xd2,
-    0x4e,
-    0x54,
-    0x02,
-    0x27,
-    0xe1,
-    0x24,
-    0x36,
-    0xe2,
-    0xe6,
-    0xaf,
-    0x05,
-    0x67,
-    0xc3,
-    0x16,
-    0x1b,
-    0x7d,
-    0xb1,
-    0xf8,
-    0xb0,
-    0x53,
-    0xb7,
-    0x93,
-    0x15,
-    0xc1,
-    0xd9,
-    0x2c,
-    0x8c,
-    0xcf,
-    0x8d,
-    0xb1,
-    0x5d,
-    0x7b,
-    0x6e,
-    0x9e,
-    0x26,
-    0xb7,
-    0x34,
-    0x1d,
-    0x73,
-    0xb2,
-    0xe4,
-    0x71,
-    0x8e,
-    0x58,
-    0x44,
-    0x94,
-    0x99,
-    0x1c,
-    0x92,
-    0x1f,
-    0xd9,
-    0xf5,
-    0x75,
-    0x6b,
-    0x55,
-    0xa6,
-    0x34,
-    0xf6,
-    0xa0,
-    0x43,
-    0x26,
-    0x08,
-    0xf3,
-    0xf1,
-    0x6a,
-    0x96,
-    0x7e,
-    0xed,
-    0xd7,
-    0x66,
-    0x00,
-    0xd0,
-    0x36,
-    0x74,
-    0x96,
-    0x11,
-    0xaf,
-    0x95,
-    0xd0,
-    0xcb,
-    0x82,
-    0x5a,
-    0x0a,
-    0xc0,
-    0xf8,
-    0x37,
-    0xfa,
-    0x9f,
-    0x98,
-    0xe4,
-    0x85,
-    0x82,
-    0x9d,
-    0x04,
-    0xd7,
-    0xbb,
-    0xa8,
-    0x05,
-    0xb2,
-    0xd0,
-    0xb3,
-    0x47,
-    0x06,
-    0xc4,
-    0x46,
-    0x80,
-    0xc3,
-    0x98,
-    0xed,
-    0x5f,
-    0xeb,
-    0x12,
-    0xe9,
-    0x6f,
-    0xeb,
-    0xbd,
-    0x26,
-    0x3f,
-    0x2b,
-    0x31,
-    0x6d,
-    0xc0,
-    0xe4,
-    0x94,
-    0xdb,
-    0xee,
-    0x32,
-    0x61,
-    0x92,
-    0xb2,
-    0x6a,
-    0x68,
-    0xae,
-    0x07,
-    0xad,
-    0x17,
-    0x7b,
-    0x5d,
-    0xbd,
-    0xf7,
-    0xe5,
-    0x3a,
-    0x10,
-    0x79,
-    0x2f,
-    0x27,
-    0x23,
-    0xf3,
-    0xe8,
-    0xca,
-    0x11,
-    0xe6,
-    0x1b,
-    0x50,
-    0x64,
-    0x82,
-    0xc7,
-    0x0e,
-    0x2b,
-    0x6c,
-    0x8e,
-    0x67,
-    0x4d,
-    0xbe,
-    0xb1,
-    0xf0,
-    0x1c,
-    0x50,
-    0x3c,
-    0xd2,
-    0x2d,
-    0x36,
-    0x7e,
-    0x70,
-    0x68,
-    0x89,
-    0xbc,
-    0x4a,
-    0x5b,
-    0x6b,
-    0x27,
-    0x21,
-    0xd3,
-    0x45,
-    0x0a,
-    0x5d,
-    0xae,
-    0x53,
-    0x48,
-    0xab,
-    0xeb,
-    0x63,
-    0x06,
-    0xea,
-    0x03,
-    0xd9,
-    0xa5,
-    0x48,
-    0x7c,
-    0xf7,
-    0xf3,
-    0xa8,
-    0xbb,
-    0x5b,
-    0xa2,
-    0x48,
-    0x1a,
-    0xc9,
-    0xf9,
-    0xa0,
-    0x3a,
-    0x2b,
-    0xc9,
-    0x8d,
-    0x9b,
-    0xd6,
-    0xa3,
-    0xae,
-    0x69,
-    0x0f,
-    0x48,
-    0x0e,
-    0x99,
-    0xce,
-    0x61,
-    0x04,
-    0x35,
-    0xc2,
-    0x70,
-    0x58,
-    0xf4,
-    0x94,
-    0x07,
-    0xa7,
-    0x0e,
-    0x70,
-    0x38,
-    0x09,
-    0x4e,
-    0xc2,
-    0x4c,
-    0xf0,
-    0x69,
-    0x3d,
-    0xb7,
-    0x54,
-    0x8e,
-    0x22,
-    0x4c,
-    0x0d,
-    0x3e,
-    0xbf,
-    0xae,
-    0x80,
-    0x5e,
-    0x36,
-    0x07,
-    0x7d,
-    0x8b,
-    0x7f,
-    0xfc,
-    0x68,
-    0xad,
-    0xb0,
-    0xe0,
-    0x97,
-    0xcf,
-    0x7c,
-    0x27,
-    0xfc,
-    0x2e,
-    0xfa,
-    0x1e,
-    0x04,
-    0x8f,
-    0xa8,
-    0xda,
-    0xbe,
-    0xd6,
-    0xb0,
-    0x6e,
-    0x40,
-    0xd5,
-    0x6a,
-    0x62,
-    0x47,
-    0x62,
-    0x21,
-    0x60,
-    0x1d,
-    0xac,
-    0x1a,
-    0x2f,
-    0xc0,
-    0xcf,
-    0xd2,
-    0xe6,
-    0x40,
-    0xa5,
-    0x88,
-    0x59,
-    0x69,
-    0xdf,
-    0xfb,
-    0xd8,
-    0xa2,
-    0x55,
-    0x75,
-    0x19,
-    0x15,
-    0x9b,
-    0x08,
-    0x72,
-    0x10,
-    0xd5,
-    0x18,
-    0x4b,
-    0xab,
-    0xcc,
-    0x1a,
-    0xd4,
-    0xac,
-    0x41,
-    0x9a,
-    0xf3,
-    0xa7,
-    0x81,
-    0x83,
-    0x81,
-    0x6a,
-    0x39,
-    0x9b,
-    0xb5,
-    0x98,
-    0x8c,
-    0x4d,
-    0xe0,
-    0x93,
-    0x63,
-    0xab,
-    0x5b,
-    0x9f,
-    0x04,
-    0xb3,
-    0xbe,
-    0x45,
-    0xe7,
-    0xd1,
-    0x53,
-    0xf6,
-    0xc4,
-    0xa6,
-    0xcb,
-    0xf1,
-    0xf1,
-    0x08,
-    0x2f,
-    0x67,
-    0xeb,
-    0x4a,
-    0x19,
-    0xdc,
-    0x33,
-    0xbd,
-    0x23,
-    0xd0,
-    0x5b,
-    0x76,
-    0xa0,
-    0x9f,
-    0x60,
-    0x52,
-    0x8a,
-    0xa6,
-    0x3a,
-    0x38,
-    0xbc,
-    0xa7,
-    0xb2,
-    0x9e,
-    0x61,
-    0x6e,
-    0x74,
-    0x4f,
-    0xad,
-    0xb5,
-    0x65,
-    0x6b,
-    0xcb,
-    0x46,
-    0x36,
-    0xaf,
-    0x16,
-    0x5f,
-    0x3a,
-    0xf6,
-    0x8b,
-    0x5a,
-    0x74,
-    0x00,
-    0x7e,
-    0x8d,
-    0xf5,
-    0x73,
-    0x8d,
-    0x70,
-    0x65,
-    0x1f,
-    0xd3,
-    0xfd,
-    0xdf,
-    0x86,
-    0x5e,
-    0x5d,
-    0x02,
-    0x9c,
-    0xe2,
-    0xc0,
-    0x44,
-    0xcb,
-    0xae,
-    0x8d,
-    0x8a,
-    0x3a,
-    0xe0,
-    0xbb,
-    0xf6,
-    0x4f,
-    0xd5,
-    0x7e,
-    0x00,
-    0x73,
-    0xe4,
-    0x27,
-    0xc9,
-    0x15,
-    0x4c,
-    0x45,
-    0xab,
-    0xf1,
-    0x6a,
-    0x11,
-    0x15,
-    0x92,
-    0x30,
-    0x09,
-    0x96,
-    0x15,
-    0xd2,
-    0xda,
-    0x37,
-    0x31,
-    0xc2,
-    0x83,
-    0x0e,
-    0x74,
-    0xdf,
-    0xb8,
-    0x10,
-    0xcf,
-    0xea,
-    0x84,
-    0x27,
-    0x55,
-    0x39,
-    0x33,
-    0x85,
-    0x40,
-    0xaf,
-    0x6f,
-    0x37,
-    0x35,
-    0xeb,
-    0xa9,
-    0xfd,
-    0xc9,
-    0xc0,
-    0xbb,
-    0x59,
-    0x43,
-    0xe5,
-    0xcb,
-    0xe6,
-    0xa3,
-    0xee,
-    0x72,
-    0xeb,
-    0xe4,
-    0x7b,
-    0x1d,
-    0x30,
-    0x7f,
-    0xb0,
-    0xb4,
-    0x10,
-    0x30,
-    0xe5,
-    0x7a,
-    0xd0,
-    0xfc,
-    0x9e,
-    0x35,
-    0x2f,
-    0x73,
-    0xbd,
-    0x8e,
-    0x3e,
-    0x33,
-    0xf6,
-    0xba,
-    0x72,
-    0xad,
-    0x84,
-    0x5a,
-    0xf8,
-    0x2c,
-    0x1a,
-    0xa0,
-    0x48,
-    0x13,
-    0x1d,
-    0xb4,
-    0xfd,
-    0x65,
-    0x10,
-    0x56,
-    0xe4,
-    0x8b,
-    0x50,
-    0xc4,
-    0x53,
-    0x52,
-    0x01,
-    0xde,
-    0xbc,
-    0x34,
-    0x48,
-    0x88,
-    0x81,
-    0xd8,
-    0xba,
-    0x50,
-    0x0a,
-    0xdc,
-    0x15,
-    0x51,
-    0x16,
-    0xd1,
-    0x2e,
-    0x56,
-    0x4e,
-    0x87,
-    0x2b,
-    0x43,
-    0x20,
-    0x8b,
-    0xf2,
-    0xb1,
-    0xca,
-    0xef,
-    0xe2,
-    0xd9,
-    0xb5,
-    0x49,
-    0xc0,
-    0xb3,
-    0x05,
-    0xfe,
-    0xf4,
-    0x5f,
-    0x6e,
-    0xc1,
-    0xf5,
-    0xc3,
-    0x49,
-    0x56,
-    0x02,
-    0x76,
-    0xe7,
-    0x9c,
-    0x13,
-    0xdc,
-    0x25,
-    0xca,
-    0x0f,
-    0x93,
-    0x40,
-    0xf9,
-    0x3f,
-    0x0e,
-    0xeb,
-    0xe3,
-    0x03,
-    0x80,
-    0x9f,
-    0xea,
-    0xc3,
-    0xfc,
-    0x33,
-    0x5c,
-    0x29,
-    0xda,
-    0xac,
-    0xf5,
-    0x8d,
-    0x5c,
-    0x56,
-    0xa5,
-    0xb1,
-    0x92,
-    0x14,
-    0x94,
-    0xaf,
-    0x7a,
-    0xf4,
-    0x64,
-    0x2f,
-    0x6c,
-    0x06,
-    0xb6,
-    0xdd,
-    0xb5,
-    0x6f,
-    0xef,
-    0x1b,
-    0x83,
-    0xb9,
-    0x3c,
-    0xf2,
-    0x01,
-    0x6d,
-    0xd3,
-    0x4f,
-    0xc2,
-    0xe4,
-    0x7c,
-    0x6c,
-    0x63,
-    0x5a,
-    0x50,
-    0x8c,
-    0x6c,
-    0x44,
-    0xc1,
-    0xeb,
-    0x78,
-    0xe3,
-    0xdb,
-    0xf5,
-    0x96,
-    0x1a,
-    0xca,
-    0xb6,
-    0xee,
-    0x7d,
-    0x9b,
-    0x92,
-    0xa8,
-    0xaa,
-    0x47,
-    0x36,
-    0x09,
-    0xdc,
-    0xed,
-    0xce,
-    0xdf,
-    0xbd,
-    0x5f,
-    0x78,
-    0x20,
-    0x7c,
-    0xe0,
-    0xf9,
-    0xce,
-    0x20,
-    0x2c,
-    0xb0,
-    0x1d,
-    0x1c,
-    0xb9,
-    0xc8,
-    0xd8,
-    0x23,
-    0x3d,
-    0xb1,
-    0x01,
-    0x3d,
-    0x70,
-    0xd0,
-    0xb8,
-    0x1b,
-    0x13,
-    0x75,
-    0x5d,
-    0xa7,
-    0x31,
-    0x0e,
-    0xf9,
-    0xe0,
-    0xa5,
-    0x9b,
-    0xda,
-    0xe5,
-    0xdc,
-    0x62,
-    0x7e,
-    0x4f,
-    0xdc,
-    0xe4,
-    0xb3,
-    0xc4,
-    0x85,
-    0x0f,
-    0xfb,
-    0xca,
-    0x17,
-    0xb5,
-    0x35,
-    0xd8,
-    0xf5,
-    0x3d,
-    0x7a,
-    0xb3,
-    0xa9,
-    0x99,
-    0x46,
-    0xf8,
-    0x27,
-    0x78,
-    0xd8,
-    0xf4,
-    0x56,
-    0xbc,
-    0xdb,
-    0xbc,
-    0xcc,
-    0x2e,
-    0x45,
-    0x7a,
-    0xd9,
-    0x70,
-    0x80,
-    0x06,
-    0xc8,
-    0x34,
-    0xc8,
-    0xb6,
-    0x61,
-    0xac,
-    0xd4,
-    0x76,
-    0xb3,
-    0x41,
-    0xb8,
-    0x1b,
-    0x10,
-    0x88,
-    0x0a,
-    0xf4,
-    0x58,
-    0x72,
-    0x43,
-    0xa2,
-    0x7b,
-    0xc3,
-    0x69,
-    0x2a,
-    0x39,
-    0xc5,
-    0xeb,
-    0x49,
-    0x2c,
-    0x3d,
-    0xcd,
-    0x08,
-    0x09,
-    0x9e,
-    0x04,
-    0x8f,
-    0x23,
-    0x7d,
-    0x24,
-    0x3e,
-    0x30,
-    0x45,
-    0x38,
-    0xfa,
-    0x50,
-    0x2c,
-    0xf1,
-    0xc5,
-    0x4b,
-    0x65,
-    0x04,
-    0x92,
-    0x1a,
-    0x97,
-    0xcd,
-    0x57,
-    0xaa,
-    0x8f,
-    0x38,
-    0x63,
-    0xdc,
-    0x32,
-    0xe1,
-    0xf2,
-    0xd0,
-    0xb5,
-    0x7a,
-    0xff,
-    0x63,
-    0x10,
-    0x6e,
-    0x59,
-    0xf6,
-    0xaf,
-    0xc3,
-    0xf9,
-    0x72,
-    0x6b,
-    0x45,
-    0x93,
-    0x88,
-    0xba,
-    0xe1,
-    0x6b,
-    0x3e,
-    0x22,
-    0x4f,
-    0x6a,
-    0xa7,
-    0xf4,
-    0xf4,
-    0x71,
-    0xf1,
-    0x36,
-    0x06,
-    0xed,
-    0xa6,
-    0xe1,
-    0xf1,
-    0xac,
-    0x2b,
-    0x4d,
-    0xf9,
-    0xef,
-    0x8d,
-    0xe9,
-    0x21,
-    0xc0,
-    0x7c,
-    0x2f,
-    0x4c,
-    0x85,
-    0x98,
-    0xd7,
-    0xa3,
-    0xd6,
-    0xec,
-    0x4b,
-    0x36,
-    0x8c,
-    0xb8,
-    0x5c,
-    0xe6,
-    0x1a,
-    0x74,
-    0x33,
-    0x82,
-    0x21,
-    0x11,
-    0x8a,
-    0x30,
-    0x3e,
-    0x82,
-    0x1c,
-    0x0f,
-    0x27,
-    0x7b,
-    0x59,
-    0x1a,
-    0xf6,
-    0x79,
-    0x5f,
-    0x50,
-    0xc4,
-    0x02,
-    0x26,
-    0x12,
-    0x7a,
-    0x2e,
-    0xfa,
-    0xcc,
-    0xe4,
-    0x66,
-    0x2f,
-    0xd7,
-    0x07,
-    0x6c,
-    0x10,
-    0x9e,
-    0xb5,
-    0x9b,
-    0x18,
-    0x00,
-    0x5e,
-    0x71,
-    0x65,
-    0xf6,
-    0x29,
-    0x4a,
-    0x69,
-    0x76,
-    0x43,
-    0x6e,
-    0xe3,
-    0x97,
-    0x77,
-    0x4e,
-    0x0d,
-    0xf5,
-    0x00,
-    0x0b,
-    0x17,
-    0x57,
-    0x9b,
-    0x38,
-    0xd5,
-    0x8f,
-    0xe0,
-    0xe1,
-    0xb5,
-    0xa2,
-    0xd1,
-    0xcc,
-    0xf3,
-    0x29,
-    0xb4,
-    0xfe,
-    0x10,
-    0xf7,
-    0x1e,
-    0x81,
-    0x80,
-    0xfc,
-    0x51,
-    0x65,
-    0xa3,
-    0x69,
-    0xc7,
-    0x05,
-    0xf6,
-    0x15,
-    0x0f,
-    0x8c,
-    0x8b,
-    0x20,
-    0xd8,
-    0xb7,
-    0xb6,
-    0xd6,
-    0x4c,
-    0xdc,
-    0x0a,
-    0xd6,
-    0x9f,
-    0x2b,
-    0x83,
-    0x73,
-    0xe7,
-    0x34,
-    0x05,
-    0x5a,
-    0x2e,
-    0xa9,
-    0x05,
-    0x75,
-    0xc5,
-    0x65,
-    0x86,
-    0x10,
-    0xdc,
-    0xae,
-    0x48,
-    0x3b,
-    0x50,
-    0xb7,
-    0x3c,
-    0x6f,
-    0xc4,
-    0x69,
-    0x3a,
-    0x74,
-    0xf3,
-    0x63,
-    0xf6,
-    0x81,
-    0x44,
-    0x40,
-    0x31,
-    0xa6,
-    0xa0,
-    0x18,
-    0x2c,
-    0x67,
-    0x80,
-    0x49,
-    0x62,
-    0xaa,
-    0x4a,
-    0x77,
-    0x76,
-    0xd3,
-    0xdd,
-    0xd1,
-    0x6b,
-    0x2d,
-    0x6a,
-    0x96,
-    0x13,
-    0x8c,
-    0x87,
-    0xd8,
-    0xca,
-    0x30,
-    0x7e,
-    0x81,
-    0x64,
-    0xed,
-    0xeb,
-    0x93,
-    0x63,
-    0x89,
-    0x86,
-    0xb4,
-    0x6d,
-    0x66,
-    0x3d,
-    0xe9,
-    0xfe,
-    0x60,
-    0x86,
-    0xa2,
-    0x5b,
-    0xf9,
-    0xf3,
-    0xf7,
-    0xc7,
-    0xb4,
-    0x06,
-    0x31,
-    0xf8,
-    0xbe,
-    0x48,
-    0x8c,
-    0xcc,
-    0xd3,
-    0x95,
-    0x3b,
-    0x39,
-    0x60,
-    0xba,
-    0xad,
-    0x82,
-    0xe5,
-    0x42,
-    0x0f,
-    0xb1,
-    0x9e,
-    0x8c,
-    0x12,
-    0x41,
-    0x62,
-    0x21,
-    0xee,
-    0x1b,
-    0xcb,
-    0x45,
-    0xa7,
-    0xc4,
-    0x97,
-    0xcc,
-    0x8e,
-    0xd4,
-    0x4e,
-    0x2f,
-    0x0c,
-    0xaa,
-    0x25,
-    0xdf,
-    0x9b,
-    0x5e,
-    0x23,
-    0xd9,
-    0x15,
-    0xf7,
-    0x82,
-    0x7b,
-    0x31,
-    0xde,
-    0x58,
-    0x96,
-    0x4a,
-    0x93,
-    0x77,
-    0xc4,
-    0x63,
-    0x9f,
-    0x91,
-    0xfc,
-    0x69,
-    0xca,
-    0xa0,
-    0x63,
-    0xb7,
-    0x8d,
-    0x84,
-    0x65,
-    0xe0,
-    0xca,
-    0xee,
-    0x05,
-    0xa8,
-    0xbb,
-    0x7e,
-    0x71,
-    0x53,
-    0x29,
-    0x28,
-    0xda,
-    0x23,
-    0xde,
-    0xdc,
-    0x82,
-    0x1c,
-    0x5c,
-    0x66,
-    0x17,
-    0x0a,
-    0xcf,
-    0x93,
-    0x3f,
-    0xc5,
-    0x41,
-    0x95,
-    0x74,
-    0xb4,
-    0x0d,
-    0xa8,
-    0x12,
-    0x90,
-    0x96,
-    0xf6,
-    0xae,
-    0x6a,
-    0x38,
-    0xb8,
-    0xaa,
-    0xf0,
-    0x7f,
-    0x9f,
-    0x06,
-    0xec,
-    0x97,
-    0x72,
-    0x79,
-    0x0d,
-    0x04,
-    0xf8,
-    0xc1,
-    0xea,
-    0x93,
-    0x18,
-    0x37,
-    0x44,
-    0x91,
-    0x3f,
-    0xa6,
-    0x8b,
-    0x3a,
-    0x02,
-    0x5d,
-    0xa4,
-    0x74,
-    0x05,
-    0x83,
-    0xea,
-    0xbe,
-    0x1b,
-    0xab,
-    0x73,
-    0x63,
-    0xae,
-    0xa8,
-    0x94,
-    0xf3,
-    0x62,
-    0xa3,
-    0xa7,
-    0xf3,
-    0xf5,
-    0x6b,
-    0x0b,
-    0xd4,
-    0x6a,
-    0x0b,
-    0x6d,
-    0x22,
-    0x66,
-    0xa2,
-    0x46,
-    0xfe,
-    0xda,
-    0x6f,
-    0xa5,
-    0xce,
-    0xe2,
-    0x2c,
-    0x2f,
-    0x33,
-    0xed,
-    0x9d,
-    0x64,
-    0x3c,
-    0x1f,
-    0x68,
-    0x24,
-    0xd9,
-    0xf3,
-    0x27,
-    0x71,
-    0x92,
-    0x25,
-    0xbc,
-    0x76,
-    0x78,
-    0xcf,
-    0xe4,
-    0xc8,
-    0x5c,
-    0xd2,
-    0x10,
-    0xed,
-    0x40,
-    0x77,
-    0x70,
-    0x1b,
-    0x0b,
-    0x56,
-    0x50,
-    0x41,
-    0x81,
-    0x77,
-    0xa7,
-    0x4c,
-    0x71,
-    0xb8,
-    0xed,
-    0xa3,
-    0x30,
-    0x6e,
-    0x2e,
-    0xf3,
-    0x47,
-    0x4f,
-    0x5d,
-    0x32,
-    0x69,
-    0x90,
-    0xea,
-    0xde,
-    0xa8,
-    0x4a,
-    0x96,
-    0x86,
-    0xe8,
-    0x22,
-    0x87,
-    0x8c,
-    0x93,
-    0x29,
-    0x97,
-    0x29,
-    0x8e,
-    0x01,
-    0xf2,
-    0xb1,
-    0x6c,
-    0x42,
-    0xe0,
-    0x19,
-    0xe2,
-    0x1b,
-    0xdf,
-    0xb6,
-    0x7b,
-    0x3d,
-    0xf5,
-    0x47,
-    0x8d,
-    0xf4,
-    0x44,
-    0x36,
-    0x6c,
-    0x97,
-    0xdf,
-    0x1b,
-    0xdd,
-    0x23,
-    0xdc,
-    0x82,
-    0xce,
-    0x23,
-    0xab,
-    0xee,
-    0x44,
-    0xd3,
-    0xa6,
-    0x1e,
-    0x94,
-    0x84,
-    0xe8,
-    0x8e,
-    0xd6,
-    0x42,
-    0x63,
-    0x41,
-    0x97,
-    0xb5,
-    0x2d,
-    0xbe,
-    0xce,
-    0x45,
-    0x1b,
-    0x59,
-    0x11,
-    0x81,
-    0x91,
-    0xb3,
-    0x09,
-    0xc2,
-    0x98,
-    0x84,
-    0x24,
-    0x0b,
-    0x31,
-    0x98,
-    0x89,
-    0x34,
-    0xea,
-    0x18,
-    0x51,
-    0x48,
-    0xae,
-    0x0b,
-    0xf4,
-    0x2b,
-    0xe1,
-    0x1c,
-    0x01,
-    0x80,
-    0xad,
-    0x9e,
-    0x13,
-    0xc9,
-    0x96,
-    0xcd,
-    0x00,
-    0xd0,
-    0x55,
-    0x57,
-    0x53,
-    0x47,
-    0xe3,
-    0x1b,
-    0xfd,
-    0xab,
-    0xd4,
-    0x30,
-    0x47,
-    0x6e,
-    0xe6,
-    0x29,
-    0x0b,
-    0x54,
-    0xda,
-    0x97,
-    0x24,
-    0x1e,
-    0x82,
-    0xd0,
-    0x23,
-    0x66,
-    0x1c,
-    0xef,
-    0x43,
-    0xca,
-    0xde,
-    0x1c,
-    0xa0,
-    0x4c,
-    0xd2,
-    0x0e,
-    0xa3,
-    0xf9,
-    0xe4,
-    0xcd,
-    0xc1,
-    0xc9,
-    0x3a,
-    0xbd,
-    0x65,
-    0xc7,
-    0xc3,
-    0xd8,
-    0x2a,
-    0x71,
-    0x13,
-    0x3b,
-    0x4e,
-    0x62,
-    0x6e,
-    0xe4,
-    0x64,
-    0x2e,
-    0x22,
-    0xba,
-    0x48,
-    0x8e,
-    0x1a,
-    0xcd,
-    0x58,
-    0xbd,
-    0xb1,
-    0xe0,
-    0xe1,
-    0x21,
-    0xc4,
-    0x25,
-    0xd8,
-    0x2e,
-    0x0b,
-    0x47,
-    0xcb,
-    0x88,
-    0xa9,
-    0xad,
-    0x16,
-    0x67,
-    0x01,
-    0xfe,
-    0x5a,
-    0x40,
-    0xcc,
-    0xe0,
-    0x2b,
-    0xa2,
-    0x68,
-    0x06,
-    0x09,
-    0x5e,
-    0x73,
-    0x69,
-    0x92,
-    0xea,
-    0x99,
-    0xd5,
-    0xf5,
-    0x07,
-    0xaa,
-    0xa8,
-    0xaa,
-    0xa2,
-    0xf0,
-    0xd7,
-    0x61,
-    0xf8,
-    0xbf,
-    0x31,
-    0x38,
-    0xfe,
-    0x4d,
-    0xe8,
-    0x30,
-    0x00,
-    0xc4,
-    0x4d,
-    0xe2,
-    0x88,
-    0x96,
-    0xdb,
-    0x6e,
-    0x81,
-    0x11,
-    0x77,
-    0xb5,
-    0x9c,
-    0x33,
-    0xf6,
-    0xc8,
-    0xf3,
-    0xbf,
-    0xe0,
-    0x9f,
-    0xed,
-    0x90,
-    0x73,
-    0x0f,
-    0x61,
-    0x2e,
-    0xeb,
-    0xf6,
-    0xfe,
-    0x9f,
-    0x01,
-    0xb9,
-    0xea,
-    0x80,
-    0xb2,
-    0xf0,
-    0xa9,
-    0x54,
-    0x41,
-    0x5f,
-    0x41,
-    0x1b,
-    0x7f,
-    0x29,
-    0x9b,
-    0x27,
-    0x4a,
-    0x40,
-    0x2d,
-    0x2b,
-    0x54,
-    0x20,
-    0xd6,
-    0x95,
-    0x26,
-    0xbd,
-    0x09,
-    0x1d,
-    0x64,
-    0xb9,
-    0x2e,
-    0x9e,
-    0x52,
-    0xdb,
-    0x45,
-    0x25,
-    0x97,
-    0xbd,
-    0xcd,
-    0x48,
-    0x41,
-    0xc4,
-    0xe4,
-    0xba,
-    0x0a,
-    0x55,
-    0xaf,
-    0x1c,
-    0xd9,
-    0x46,
-    0xfc,
-    0x15,
-    0x8c,
-    0x93,
-    0x26,
-    0xa4,
-    0xf5,
-    0x53,
-    0x39,
-    0xb5,
-    0x22,
-    0xea,
-    0x57,
-    0xf3,
-    0xe2,
-    0x7f,
-    0x5b,
-    0xde,
-    0x84,
-    0xb1,
-    0xbb,
-    0x1d,
-    0xe2,
-    0x85,
-    0xb3,
-    0x15,
-    0x9f,
-    0xa3,
-    0xa0,
-    0xba,
-    0xac,
-    0xc3,
-    0xaa,
-    0xa5,
-    0x11,
-    0x62,
-    0xa5,
-    0x68,
-    0xea,
-    0xb9,
-    0x39,
-    0x1e,
-    0xaf,
-    0xef,
-    0x41,
-    0x46,
-    0xb9,
-    0x8e,
-    0x72,
-    0xd1,
-    0x02,
-    0x34,
-    0x3d,
-    0x79,
-    0x2d,
-    0x8b,
-    0xf6,
-    0x55,
-    0xc6,
-    0x7a,
-    0x35,
-    0xaa,
-    0xca,
-    0x9d,
-    0x7d,
-    0x05,
-    0x6a,
-    0xf3,
-    0x1b,
-    0x86,
-    0x0c,
-    0xd7,
-    0x51,
-    0x7f,
-    0x93,
-    0x32,
-    0xb4,
-    0x3e,
-    0xe0,
-    0xee,
-    0xd3,
-    0x26,
-    0x98,
-    0xae,
-    0x19,
-    0x05,
-    0x28,
-    0xbc,
-    0xf5,
-    0xa1,
-    0x07,
-    0x42,
-    0x37,
-    0x94,
-    0x3b,
-    0xbe,
-    0xbe,
-    0x5a,
-    0x1f,
-    0xb0,
-    0x50,
-    0xa9,
-    0x63,
-    0x95,
-    0xc9,
-    0x00,
-    0x54,
-    0x19,
-    0x78,
-    0x83,
-    0x5e,
-    0x89,
-    0xc6,
-    0x06,
-    0xcf,
-    0x87,
-    0x18,
-    0x68,
-    0xdd,
-    0x01,
-    0xf7,
-    0x22,
-    0xeb,
-    0x64,
-    0x6f,
-    0x1f,
-    0x08,
-    0x0c,
-    0xb4,
-    0xcf,
-    0xb9,
-    0x00,
-    0x0c,
-    0x77,
-    0xf8,
-    0xdc,
-    0xe8,
-    0xcb,
-    0x7c,
-    0x0e,
-    0x54,
-    0xbe,
-    0x3b,
-    0x45,
-    0x92,
-    0x99,
-    0x2e,
-    0x27,
-    0x02,
-    0x4a,
-    0x54,
-    0x43,
-    0x46,
-    0xff,
-    0xf9,
-    0x46,
-    0xa2,
-    0xf4,
-    0x38,
-    0x71,
-    0xa9,
-    0x89,
-    0xbf,
-    0x4a,
-    0x16,
-    0x98,
-    0xd2,
-    0x92,
-    0xf8,
-    0x05,
-    0x93,
-    0x78,
-    0x12,
-    0x97,
-    0x80,
-    0x0c,
-    0x81,
-    0x06,
-    0x3d,
-    0xf6,
-    0x9f,
-    0x55,
-    0x94,
-    0x68,
-    0x28,
-    0x61,
-    0xba,
-    0x51,
-    0x9b,
-    0xbb,
-    0xd3,
-    0xd4,
-    0xe3,
-    0xb3,
-    0xb9,
-    0xf8,
-    0x37,
-    0xb5,
-    0xf9,
-    0xa1,
-    0x3f,
-    0xd9,
-    0x1f,
-    0xbf,
-    0x78,
-    0xb5,
-    0x34,
-    0xc5,
-    0xd9,
-    0x76,
-    0x84,
-    0x5d,
-    0xb7,
-    0x2f,
-    0xa5,
-    0x59,
-    0xe6,
-    0x70,
-    0xb4,
-    0xed,
-    0x21,
-    0x1b,
-    0xe2,
-    0x1c,
-    0xab,
-    0x73,
-    0x2f,
-    0x71,
-    0x37,
-    0x76,
-    0x76,
-    0xef,
-    0x06,
-    0x6d,
-    0xaa,
-    0x4a,
-    0x4f,
-    0xc1,
-    0x5f,
-    0x58,
-    0xe3,
-    0x10,
-    0x8c,
-    0xc2,
-    0x11,
-    0x80,
-    0x8f,
-    0xff,
-    0xc7,
-    0x53,
-    0x71,
-    0x83,
-    0xfb,
-    0xbc,
-    0x6c,
-    0x33,
-    0x49,
-    0xf1,
-    0xaa,
-    0x1d,
-    0xde,
-    0x82,
-    0x50,
-    0x66,
-    0x94,
-    0xe9,
-    0xbb,
-    0x83,
-    0x5e,
-    0x62,
-    0x09,
-    0xac,
-    0xe7,
-    0xfd,
-    0xdc,
-    0x8e,
-    0x76,
-    0xf1,
-    0x5a,
-    0x41,
-    0x15,
-    0x33,
-    0x79,
-    0x79,
-    0xf2,
-    0x47,
-    0x79,
-    0x00,
-    0x05,
-    0x57,
-    0xb2,
-    0x64,
-    0xf3,
-    0x82,
-    0x8f,
-    0xed,
-    0x33,
-    0x76,
-    0xdb,
-    0xd1,
-    0x6f,
-    0x41,
-    0x3b,
-    0xab,
-    0x2d,
-    0x64,
-    0xfc,
-    0x2a,
-    0xae,
-    0x29,
-    0x0f,
-    0x06,
-    0x16,
-    0x37,
-    0x52,
-    0x39,
-    0xce,
-    0x64,
-    0x12,
-    0x6b,
-    0x27,
-    0xca,
-    0xcd,
-    0xae,
-    0x40,
-    0x1d,
-    0x3c,
-    0x6b,
-    0x29,
-    0x3c,
-    0x90,
-    0x9c,
-    0x48,
-    0x05,
-    0xfd,
-    0x3c,
-    0xfc,
-    0x6e,
-    0x75,
-    0xfc,
-    0x81,
-    0xd1,
-    0xb6,
-    0x38,
-    0x14,
-    0x88,
-    0x86,
-    0x29,
-    0x57,
-    0xba,
-    0x3d,
-    0x5c,
-    0xf6,
-    0x74,
-    0x85,
-    0x63,
-    0x8b,
-    0xfc,
-    0x5e,
-    0xca,
-    0xbf,
-    0x62,
-    0x65,
-    0x4d,
-    0xb2,
-    0x57,
-    0x55,
-    0x47,
-    0x9e,
-    0x42,
-    0xce,
-    0x6e,
-    0xb7,
-    0x91,
-    0x55,
-    0xbe,
-    0x55,
-    0x4d,
-    0x9d,
-    0xb3,
-    0x54,
-    0xf2,
-    0x04,
-    0xbb,
-    0xbb,
-    0x7d,
-    0x61,
-    0xeb,
-    0x9d,
-    0xc6,
-    0xfd,
-    0xf1,
-    0x3d,
-    0x10,
-    0xdf,
-    0x4a,
-    0x75,
-    0xdf,
-    0x4d,
-    0xb5,
-    0x59,
-    0x0a,
-    0x8f,
-    0xe7,
-    0x17,
-    0x10,
-    0xf6,
-    0x80,
-    0x22,
-    0xaf,
-    0x1d,
-    0x3e,
-    0x8f,
-    0xb3,
-    0x6f,
-    0x70,
-    0xbf,
-    0x0d,
-    0xe9,
-    0xae,
-    0x3e,
-    0x24,
-    0x21,
-    0xc8,
-    0xeb,
-    0x70,
-    0x88,
-    0xfc,
-    0x59,
-    0x44,
-    0xec,
-    0x6c,
-    0x76,
-    0xeb,
-    0x41,
-    0xcf,
-    0x6a,
-    0xf7,
-    0xa0,
-    0x66,
-    0xc2,
-    0xd6,
-    0x90,
-    0x31,
-    0xce,
-    0xa6,
-    0x85,
-    0x64,
-    0x47,
-    0x4a,
-    0xa6,
-    0x15,
-    0x35,
-    0xbe,
-    0xd3,
-    0x37,
-    0x10,
-    0xa7,
-    0xe7,
-    0xcb,
-    0x26,
-    0x2f,
-    0x3a,
-    0x55,
-    0x3c,
-    0x0f,
-    0x6b,
-    0x8d,
-    0x78,
-    0xed,
-    0x5c,
-    0x58,
-    0x7f,
-    0xe9,
-    0x7d,
-    0xf6,
-    0xda,
-    0x73,
-    0x4e,
-    0x7d,
-    0x9e,
-    0x5f,
-    0x1f,
-    0x86,
-    0x4c,
-    0x3b,
-    0x1a,
-    0x26,
-    0xf6,
-    0xe0,
-    0x84,
-    0x20,
-    0xa3,
-    0x47,
-    0x40,
-    0x58,
-    0xf5,
-    0x9e,
-    0x95,
-    0x8b,
-    0x09,
-    0x9b,
-    0x31,
-    0x3e,
-    0x9f,
-    0x11,
-    0x6d,
-    0xf4,
-    0x7b,
-    0xc1,
-    0xd2,
-    0xa4,
-    0x0b,
-    0x72,
-    0xdc,
-    0x6a,
-    0x49,
-    0x44,
-    0xff,
-    0x7d,
-    0xe3,
-    0x41,
-    0xe8,
-    0x61,
-    0x99,
-    0x35,
-    0x05,
-    0x5e,
-    0xe7,
-    0xbf,
-    0x47,
-    0x30,
-    0xe5,
-    0xa9,
-    0x27,
-    0x00,
-    0x6b,
-    0x75,
-    0xe7,
-    0x93,
-    0x78,
-    0x38,
-    0x1a,
-    0xc2,
-    0xd5,
-    0xac,
-    0x66,
-    0x2a,
-    0xf5,
-    0x80,
-    0x89,
-    0x24,
-    0x20,
-    0xf2,
-    0x9a,
-    0xf8,
-    0xd1,
-    0xa0,
-    0x91,
-    0x4d,
-    0x5c,
-    0x9b,
-    0x0a,
-    0xe4,
-    0xd3,
-    0xbe,
-    0x46,
-    0x86,
-    0x2b,
-    0x3e,
-    0x73,
-    0x3b,
-    0x9b,
-    0x81,
-    0x2d,
-    0xbd,
-    0x45,
-    0x34,
-    0x44,
-    0x2c,
-    0x18,
-    0x98,
-    0xc0,
-    0x03,
-    0xf5,
-    0x1c,
-    0x22,
-    0x4b,
-    0x10,
-    0x31,
-    0xed,
-    0x0f,
-    0x9a,
-    0x5a,
-    0x65,
-    0x0f,
-    0x9d,
-    0x82,
-    0x97,
-    0xb8,
-    0x27,
-    0x93,
-    0x99,
-    0x54,
-    0xaa,
-    0x44,
-    0x13,
-    0x7f,
-    0xa3,
-    0x33,
-    0xfe,
-    0xda,
-    0x7a,
-    0x33,
-    0xac,
-    0x03,
-    0xa9,
-    0xe7,
-    0x09,
-    0xc4,
-    0x21,
-    0x90,
-    0x20,
-    0x8a,
-    0xe9,
-    0x23,
-    0xe1,
-    0x19,
-    0x09,
-    0x9f,
-    0x21,
-    0x7f,
-    0xa6,
-    0x9d,
-    0xe2,
-    0x46,
-    0x6e,
-    0x28,
-    0xd5,
-    0xee,
-    0x37,
-    0xd0,
-    0x1d,
-    0x9b,
-    0xe2,
-    0xfa,
-    0x56,
-    0x0a,
-    0x86,
-    0x7a,
-    0xd6,
-    0xc9,
-    0xcb,
-    0x64,
-    0x32,
-    0xa8,
-    0x93,
-    0x1e,
-    0x04,
-    0x6b,
-    0xe0,
-    0xba,
-    0xec,
-    0xc1,
-    0xf2,
-    0x83,
-    0xd5,
-    0x7a,
-    0xaf,
-    0xd6,
-    0x7a,
-    0xf4,
-    0x48,
-    0x34,
-    0x28,
-    0xd6,
-    0x1a,
-    0x94,
-    0xc5,
-    0x01,
-    0xd2,
-    0xfe,
-    0x11,
-    0xc4,
-    0xd5,
-    0x55,
-    0x2c,
-    0x4f,
-    0xdf,
-    0x75,
-    0x59,
-    0x6b,
-    0xe9,
-    0x7e,
-    0x01,
-    0x68,
-    0x51,
-    0x6e,
-    0xfb,
-    0x56,
-    0x35,
-    0xf6,
-    0x0a,
-    0x78,
-    0x1f,
-    0x86,
-    0xa7,
-    0xf5,
-    0xe8,
-    0xab,
-    0x01,
-    0xd1,
-    0xd6,
-    0x9a,
-    0x43,
-    0x1c,
-    0x08,
-    0x0d,
-    0x15,
-    0x69,
-    0x14,
-    0x4d,
-    0x65,
-    0x82,
-    0xee,
-    0x90,
-    0x67,
-    0x5a,
-    0x0c,
-    0x86,
-    0xda,
-    0x43,
-    0xc7,
-    0x2f,
-    0x8e,
-    0x61,
-    0x05,
-    0xef,
-    0x23,
-    0x5f,
-    0x15,
-    0xe4,
-    0x13,
-    0x60,
-    0xda,
-    0x77,
-    0xf3,
-    0x39,
-    0x2c,
-    0x31,
-    0xf5,
-    0xdd,
-    0x7b,
-    0xd1,
-    0xb2,
-    0x18,
-    0xb5,
-    0x9b,
-    0x26,
-    0x81,
-    0x6a,
-    0xf2,
-    0xfc,
-    0xaa,
-    0x2f,
-    0x29,
-    0x0c,
-    0x99,
-    0x40,
-    0x97,
-    0x23,
-    0x7c,
-    0x69,
-    0xe9,
-    0x02,
-    0x98,
-    0x26,
-    0xbc,
-    0xa9,
-    0x83,
-    0x09,
-    0x6c,
-    0xd5,
-    0x93,
-    0x5c,
-    0x26,
-    0xc7,
-    0x96,
-    0x08,
-    0x45,
-    0x47,
-    0xc3,
-    0xb5,
-    0xdb,
-    0xe9,
-    0xf1,
-    0x33,
-    0x8d,
-    0x8f,
-    0x07,
-    0x18,
-    0xa5,
-    0x2f,
-    0xb4,
-    0xab,
-    0x62,
-    0xd6,
-    0x60,
-    0x01,
-    0x92,
-    0xed,
-    0x62,
-    0x66,
-    0x63,
-    0xbc,
-    0x73,
-    0xff,
-    0x77,
-    0x2c,
-    0x62,
-    0xad,
-    0x36,
-    0xd1,
-    0x0a,
-    0x33,
-    0x68,
-    0x27,
-    0x82,
-    0x9c,
-    0x03,
-    0x1c,
-    0x93,
-    0xd7,
-    0x41,
-    0xcf,
-    0x6f,
-    0xa5,
-    0xf6,
-    0x98,
-    0x9f,
-    0xb5,
-    0x21,
-    0x48,
-    0x3e,
-    0x0c,
-    0xc1,
-    0xb2,
-    0x65,
-    0xab,
-    0xea,
-    0x6a,
-    0xe6,
-    0x6c,
-    0x17,
-    0xcc,
-    0x3d,
-    0x2e,
-    0xc2,
-    0x40,
-    0xc3,
-    0x31,
-    0x32,
-    0xbd,
-    0x25,
-    0xc3,
-    0x95,
-    0x8c,
-    0x15,
-    0x1d,
-    0x4e,
-    0x4f,
-    0x3f,
-    0x88,
-    0x90,
-    0x41,
-    0x7f,
-    0xc4,
-    0x2c,
-    0xbf,
-    0x51,
-    0xa9,
-    0xa7,
-    0x08,
-    0x89,
-    0x0f,
-    0x90,
-    0x41,
-    0x44,
-    0xec,
-    0x10,
-    0xbc,
-    0x1e,
-    0xbc,
-    0xc3,
-    0x79,
-    0xa5,
-    0x26,
-    0xc6,
-    0xed,
-    0x0e,
-    0xdc,
-    0x12,
-    0x03,
-    0x27,
-    0xc3,
-    0x08,
-    0x61,
-    0x8d,
-    0x54,
-    0x4c,
-    0xec,
-    0x1f,
-    0x42,
-    0xd7,
-    0x8e,
-    0xb2,
-    0x5c,
-    0x48,
-    0x37,
-    0x07,
-    0xb6,
-    0x7b,
-    0x21,
-    0xfa
-  ],
-  const [
-    0x5e,
-    0x9d,
-    0x7b,
-    0x80,
-    0x3f,
-    0x8a,
-    0x40,
-    0xca,
-    0xdd,
-    0x83,
-    0x20,
-    0x0a,
-    0xbc,
-    0x49,
-    0xe7,
-    0xae,
-    0x24,
-    0x56,
-    0x35,
-    0xa7,
-    0xd1,
-    0xc2,
-    0xd1,
-    0x6d,
-    0xec,
-    0x67,
-    0x40,
-    0x44,
-    0x3a,
-    0x44,
-    0x97,
-    0xbf,
-    0x94,
-    0x1f,
-    0x8d,
-    0x82,
-    0x97,
-    0x6e,
-    0xd4,
-    0x4b,
-    0x9c,
-    0x78,
-    0xaa,
-    0x34,
-    0xea,
-    0xb8,
-    0xab,
-    0x32,
-    0x2b,
-    0x82,
-    0xe9,
-    0xe2,
-    0x1d,
-    0xe9,
-    0x3e,
-    0x85,
-    0x8a,
-    0xdf,
-    0xe1,
-    0x48,
-    0x7a,
-    0x9e,
-    0x38,
-    0xca,
-    0xa7,
-    0x47,
-    0xed,
-    0xd8,
-    0x31,
-    0xc9,
-    0x44,
-    0x7b,
-    0x93,
-    0x05,
-    0xac,
-    0x34,
-    0xd6,
-    0x30,
-    0x94,
-    0x86,
-    0x05,
-    0x78,
-    0x7f,
-    0xb5,
-    0xe0,
-    0xea,
-    0x5b,
-    0xce,
-    0xd4,
-    0x93,
-    0x0e,
-    0xe7,
-    0x2b,
-    0xe5,
-    0x53,
-    0xa8,
-    0x81,
-    0x5d,
-    0xc4,
-    0x0a,
-    0x77,
-    0x63,
-    0x37,
-    0x5f,
-    0xab,
-    0x72,
-    0x4e,
-    0x93,
-    0xe7,
-    0x78,
-    0x4a,
-    0xb1,
-    0x98,
-    0x80,
-    0x20,
-    0xa8,
-    0x82,
-    0x8e,
-    0xcf,
-    0x50,
-    0xb3,
-    0xca,
-    0xf0,
-    0xa8,
-    0xb5,
-    0xe1,
-    0x8f,
-    0x62,
-    0x08,
-    0xa9,
-    0x39,
-    0xa1,
-    0xcf,
-    0x04,
-    0x56,
-    0x01,
-    0xca,
-    0x06,
-    0xba,
-    0xd8,
-    0x84,
-    0x5a,
-    0x76,
-    0xbb,
-    0xce,
-    0xe1,
-    0xf4,
-    0x44,
-    0x6b,
-    0x9d,
-    0x43,
-    0x13,
-    0x0d,
-    0xce,
-    0xaf,
-    0x13,
-    0x81,
-    0x5a,
-    0x95,
-    0xfe,
-    0x26,
-    0x72,
-    0x75,
-    0x24,
-    0xa3,
-    0x73,
-    0x49,
-    0x68,
-    0xd9,
-    0x0a,
-    0x15,
-    0x8b,
-    0x17,
-    0x9c,
-    0xc0,
-    0xad,
-    0x8d,
-    0xe5,
-    0x22,
-    0x10,
-    0x04,
-    0xdf,
-    0x5e,
-    0x20,
-    0xcc,
-    0xe5,
-    0x72,
-    0xb0,
-    0xf5,
-    0x18,
-    0x0c,
-    0x87,
-    0xc2,
-    0x02,
-    0xa0,
-    0x1b,
-    0x5a,
-    0x79,
-    0xb7,
-    0x9c,
-    0xc1,
-    0xc6,
-    0x8a,
-    0x34,
-    0x07,
-    0x07,
-    0xcf,
-    0x8e,
-    0xbf,
-    0xd2,
-    0xd3,
-    0x95,
-    0xb3,
-    0x1b,
-    0xc9,
-    0x7e,
-    0xd6,
-    0x58,
-    0x61,
-    0x08,
-    0x7a,
-    0xe2,
-    0x9d,
-    0x02,
-    0xc3,
-    0x9f,
-    0xe1,
-    0x0e,
-    0x5c,
-    0xde,
-    0x49,
-    0xa6,
-    0x68,
-    0x82,
-    0x3e,
-    0x5c,
-    0xbc,
-    0x63,
-    0x4c,
-    0x66,
-    0x4b,
-    0xf1,
-    0x2e,
-    0x59,
-    0xe1,
-    0x1b,
-    0x2b,
-    0x35,
-    0x15,
-    0x6f,
-    0xa6,
-    0xa2,
-    0x79,
-    0x82,
-    0xf0,
-    0x79,
-    0x13,
-    0x92,
-    0x60,
-    0x86,
-    0x11,
-    0x6a,
-    0xa6,
-    0x8d,
-    0xb8,
-    0x86,
-    0x5c,
-    0x8a,
-    0x9e,
-    0x78,
-    0xde,
-    0x3d,
-    0x19,
-    0x8a,
-    0x5c,
-    0xe6,
-    0xf7,
-    0xa5,
-    0x2d,
-    0x4e,
-    0x6f,
-    0x71,
-    0x66,
-    0x06,
-    0x58,
-    0xbe,
-    0xac,
-    0xf3,
-    0x99,
-    0x23,
-    0x46,
-    0x0b,
-    0xe1,
-    0xe4,
-    0x76,
-    0x59,
-    0x98,
-    0x19,
-    0x0a,
-    0x47,
-    0x15,
-    0x0d,
-    0x2e,
-    0x1c,
-    0x11,
-    0xe5,
-    0x84,
-    0xc4,
-    0x5b,
-    0x82,
-    0x77,
-    0xd0,
-    0xce,
-    0xa8,
-    0xcc,
-    0xbd,
-    0x81,
-    0x5f,
-    0x79,
-    0x79,
-    0x3d,
-    0x99,
-    0xbb,
-    0x23,
-    0x34,
-    0x16,
-    0x63,
-    0x12,
-    0xef,
-    0x85,
-    0x70,
-    0x1a,
-    0x89,
-    0xec,
-    0xe3,
-    0x0a,
-    0x1b,
-    0x49,
-    0xcf,
-    0x79,
-    0x77,
-    0x7a,
-    0xb0,
-    0xc3,
-    0x19,
-    0x5a,
-    0xfd,
-    0x4e,
-    0x5a,
-    0x2d,
-    0x01,
-    0x12,
-    0xe7,
-    0x3e,
-    0xe6,
-    0x58,
-    0x72,
-    0xc6,
-    0x13,
-    0xc1,
-    0xa7,
-    0x10,
-    0xb8,
-    0x8b,
-    0x62,
-    0xdb,
-    0xa6,
-    0x10,
-    0x1f,
-    0x00,
-    0x65,
-    0x8f,
-    0xb2,
-    0x54,
-    0x80,
-    0x2f,
-    0x38,
-    0xd0,
-    0x24,
-    0x41,
-    0x4d,
-    0xef,
-    0xe9,
-    0xc6,
-    0x7f,
-    0x58,
-    0xf0,
-    0x31,
-    0x03,
-    0xbd,
-    0x2e,
-    0x6e,
-    0xa7,
-    0x03,
-    0x07,
-    0x22,
-    0x08,
-    0xa3,
-    0x1f,
-    0x35,
-    0x05,
-    0x50,
-    0x6d,
-    0x8e,
-    0x73,
-    0xda,
-    0x91,
-    0x1d,
-    0x12,
-    0x52,
-    0x67,
-    0x1f,
-    0xc0,
-    0x6f,
-    0xdc,
-    0x9d,
-    0xed,
-    0x30,
-    0x00,
-    0x36,
-    0x4f,
-    0xc3,
-    0x5d,
-    0x1f,
-    0xd7,
-    0xa6,
-    0x88,
-    0x68,
-    0xe3,
-    0x0c,
-    0xf5,
-    0x81,
-    0xb5,
-    0x82,
-    0x0f,
-    0xfc,
-    0x24,
-    0xd2,
-    0x88,
-    0x94,
-    0x91,
-    0x27,
-    0xee,
-    0x6f,
-    0x1d,
-    0x73,
-    0x80,
-    0xa0,
-    0x19,
-    0x0e,
-    0x3f,
-    0xf0,
-    0xbf,
-    0xa0,
-    0x48,
-    0xde,
-    0x1f,
-    0x40,
-    0x60,
-    0xe4,
-    0x5b,
-    0xdd,
-    0xd1,
-    0xfc,
-    0x17,
-    0xdd,
-    0x75,
-    0x63,
-    0x2c,
-    0x05,
-    0x10,
-    0x9d,
-    0x9c,
-    0x99,
-    0xe2,
-    0xb9,
-    0xcb,
-    0xc4,
-    0x7d,
-    0xd6,
-    0xec,
-    0x39,
-    0xd5,
-    0xe6,
-    0xb9,
-    0x1b,
-    0x96,
-    0xb2,
-    0x67,
-    0x1b,
-    0xba,
-    0x1f,
-    0xd9,
-    0xe0,
-    0x5a,
-    0xaf,
-    0x14,
-    0xab,
-    0xc4,
-    0x4a,
-    0xf3,
-    0x3b,
-    0xcf,
-    0x3f,
-    0x1b,
-    0xee,
-    0x6b,
-    0x86,
-    0x32,
-    0x2a,
-    0x7c,
-    0x48,
-    0x4c,
-    0xfb,
-    0xe9,
-    0xa0,
-    0xa6,
-    0xfd,
-    0xef,
-    0xa4,
-    0x97,
-    0x7d,
-    0xbc,
-    0x9f,
-    0xc3,
-    0xdb,
-    0x39,
-    0xa1,
-    0x92,
-    0x32,
-    0x27,
-    0x3a,
-    0xe1,
-    0x3b,
-    0x6d,
-    0x82,
-    0xf7,
-    0x6f,
-    0xb0,
-    0x5c,
-    0xba,
-    0x6c,
-    0x25,
-    0xfc,
-    0x22,
-    0x9a,
-    0xa3,
-    0xa7,
-    0xef,
-    0x0e,
-    0xfd,
-    0xba,
-    0x97,
-    0xaf,
-    0x8e,
-    0xee,
-    0x83,
-    0x97,
-    0x15,
-    0xda,
-    0x7a,
-    0xbc,
-    0xc4,
-    0xba,
-    0x5e,
-    0xcf,
-    0x93,
-    0x6e,
-    0x16,
-    0x64,
-    0xda,
-    0xc6,
-    0xcb,
-    0x54,
-    0x1f,
-    0xfc,
-    0x57,
-    0x5f,
-    0x2c,
-    0x82,
-    0xfa,
-    0x16,
-    0x65,
-    0xfe,
-    0x4f,
-    0xf9,
-    0x59,
-    0x94,
-    0x7f,
-    0xdc,
-    0x97,
-    0x63,
-    0xb5,
-    0x8f,
-    0xc3,
-    0x52,
-    0xd2,
-    0xbd,
-    0xe9,
-    0x0c,
-    0x61,
-    0x15,
-    0x10,
-    0x49,
-    0xcd,
-    0xa8,
-    0x13,
-    0x50,
-    0xd1,
-    0x92,
-    0xac,
-    0xb9,
-    0x31,
-    0xdd,
-    0xd2,
-    0x78,
-    0xa8,
-    0xa2,
-    0x45,
-    0x17,
-    0x21,
-    0x71,
-    0x67,
-    0x43,
-    0x2a,
-    0xf3,
-    0x4d,
-    0x8a,
-    0xa5,
-    0xce,
-    0x16,
-    0x63,
-    0xc0,
-    0xc9,
-    0x7b,
-    0x6f,
-    0x28,
-    0x31,
-    0xa8,
-    0xfe,
-    0x7a,
-    0x7b,
-    0x4a,
-    0xd5,
-    0xfb,
-    0x2a,
-    0xea,
-    0x2f,
-    0x88,
-    0xf4,
-    0x79,
-    0x01,
-    0xd0,
-    0x20,
-    0x2c,
-    0x82,
-    0xc0,
-    0x32,
-    0x8a,
-    0xeb,
-    0x3f,
-    0xca,
-    0xc3,
-    0x7b,
-    0x1c,
-    0xca,
-    0x43,
-    0xbf,
-    0x44,
-    0xb7,
-    0x87,
-    0x10,
-    0x39,
-    0x62,
-    0x2f,
-    0x5d,
-    0xbf,
-    0xc7,
-    0x55,
-    0x2b,
-    0xd9,
-    0x35,
-    0x1e,
-    0xd9,
-    0xf3,
-    0xaf,
-    0x8e,
-    0x29,
-    0x61,
-    0x93,
-    0xa1,
-    0xfc,
-    0x08,
-    0x79,
-    0x97,
-    0x5d,
-    0x5b,
-    0x5e,
-    0x8f,
-    0xc1,
-    0x8a,
-    0x02,
-    0x57,
-    0x8d,
-    0xf5,
-    0x8e,
-    0x83,
-    0xd9,
-    0xe7,
-    0x7a,
-    0xbc,
-    0x74,
-    0x81,
-    0xae,
-    0x5b,
-    0x28,
-    0xf4,
-    0xe7,
-    0x37,
-    0x3f,
-    0xf4,
-    0x5d,
-    0xba,
-    0x45,
-    0x69,
-    0xa3,
-    0x3b,
-    0x10,
-    0x67,
-    0xce,
-    0x87,
-    0xfe,
-    0x60,
-    0xd9,
-    0xc1,
-    0x7e,
-    0x98,
-    0x48,
-    0x6d,
-    0xd2,
-    0xda,
-    0x0c,
-    0xc7,
-    0x13,
-    0x6a,
-    0xa7,
-    0x59,
-    0x75,
-    0x3a,
-    0x90,
-    0xcc,
-    0xcc,
-    0x60,
-    0xd9,
-    0xff,
-    0x4f,
-    0xc8,
-    0x0f,
-    0x56,
-    0x9c,
-    0x26,
-    0x62,
-    0x55,
-    0xfd,
-    0x2f,
-    0x05,
-    0x6d,
-    0xea,
-    0x09,
-    0xd8,
-    0x15,
-    0xcf,
-    0x00,
-    0x45,
-    0x1d,
-    0x0f,
-    0x7a,
-    0x67,
-    0x3f,
-    0x48,
-    0x2d,
-    0x72,
-    0xf8,
-    0xd9,
-    0x8f,
-    0x4f,
-    0x96,
-    0xa1,
-    0x8e,
-    0x86,
-    0x91,
-    0x0a,
-    0x82,
-    0x61,
-    0x1e,
-    0x46,
-    0x60,
-    0x4f,
-    0x02,
-    0xd9,
-    0x30,
-    0x86,
-    0xa4,
-    0x58,
-    0xc1,
-    0xec,
-    0x67,
-    0x70,
-    0x9b,
-    0x38,
-    0x36,
-    0x29,
-    0x35,
-    0x54,
-    0x61,
-    0x6c,
-    0x68,
-    0x06,
-    0xa7,
-    0xc4,
-    0x24,
-    0xd0,
-    0x94,
-    0x61,
-    0x62,
-    0x15,
-    0x0d,
-    0x62,
-    0x59,
-    0x7c,
-    0x29,
-    0x54,
-    0xf5,
-    0x9a,
-    0x42,
-    0xf5,
-    0x85,
-    0xcb,
-    0x4c,
-    0x3e,
-    0xb4,
-    0x60,
-    0x66,
-    0xa1,
-    0xba,
-    0x00,
-    0xaf,
-    0x90,
-    0xd3,
-    0x48,
-    0x5b,
-    0x3e,
-    0xf0,
-    0xb5,
-    0x06,
-    0xa9,
-    0xad,
-    0xc4,
-    0x47,
-    0xd8,
-    0x84,
-    0x57,
-    0x89,
-    0x61,
-    0x40,
-    0x5b,
-    0x16,
-    0x2f,
-    0xb4,
-    0xa8,
-    0x75,
-    0x82,
-    0xac,
-    0x28,
-    0xf6,
-    0x37,
-    0x24,
-    0x3c,
-    0x8b,
-    0x4a,
-    0xb8,
-    0x5b,
-    0xd9,
-    0x99,
-    0x5c,
-    0xfd,
-    0x8f,
-    0xeb,
-    0x4d,
-    0xb7,
-    0xf7,
-    0x30,
-    0x48,
-    0xa7,
-    0xcb,
-    0x0b,
-    0xf9,
-    0x12,
-    0x49,
-    0x8d,
-    0xb6,
-    0x4c,
-    0x89,
-    0x44,
-    0x6d,
-    0xd8,
-    0x0f,
-    0x74,
-    0xdb,
-    0xd1,
-    0x9d,
-    0xa4,
-    0xff,
-    0x88,
-    0x4a,
-    0x5c,
-    0xcf,
-    0x6f,
-    0xd8,
-    0x2e,
-    0x29,
-    0x36,
-    0x43,
-    0xf3,
-    0x0c,
-    0x33,
-    0x96,
-    0x57,
-    0x08,
-    0x07,
-    0x02,
-    0x98,
-    0xf3,
-    0x7f,
-    0x31,
-    0x8a,
-    0xde,
-    0xb8,
-    0xd8,
-    0xdf,
-    0x47,
-    0x87,
-    0x8c,
-    0xa5,
-    0x91,
-    0x17,
-    0xd6,
-    0x10,
-    0xb1,
-    0xd4,
-    0x89,
-    0x7a,
-    0x29,
-    0x88,
-    0x53,
-    0xa8,
-    0x3a,
-    0xc4,
-    0x93,
-    0x4f,
-    0x55,
-    0x82,
-    0x6a,
-    0xd6,
-    0xd4,
-    0x08,
-    0x15,
-    0x5e,
-    0xe7,
-    0x10,
-    0x7a,
-    0x00,
-    0xd1,
-    0x25,
-    0x00,
-    0x55,
-    0x54,
-    0x50,
-    0xa4,
-    0x3c,
-    0x69,
-    0xf4,
-    0x4a,
-    0xd7,
-    0x35,
-    0xf7,
-    0x50,
-    0xd7,
-    0x39,
-    0x22,
-    0x69,
-    0xfa,
-    0xc9,
-    0xcb,
-    0xa9,
-    0xd1,
-    0xbf,
-    0xb1,
-    0xdc,
-    0xc7,
-    0x70,
-    0x27,
-    0x1c,
-    0x5f,
-    0xdf,
-    0x75,
-    0xa3,
-    0xbd,
-    0x31,
-    0x7b,
-    0xdd,
-    0x68,
-    0x61,
-    0x97,
-    0xc1,
-    0x4e,
-    0x35,
-    0xc9,
-    0x62,
-    0x09,
-    0x71,
-    0x15,
-    0xc1,
-    0x60,
-    0x4a,
-    0x29,
-    0xe6,
-    0x11,
-    0x1d,
-    0x40,
-    0x2f,
-    0xce,
-    0x61,
-    0x46,
-    0xe7,
-    0x85,
-    0xdb,
-    0x3d,
-    0x1a,
-    0xe4,
-    0x10,
-    0xdf,
-    0xa8,
-    0x1d,
-    0x00,
-    0x85,
-    0x99,
-    0xe6,
-    0x11,
-    0x47,
-    0xb0,
-    0xc4,
-    0x4a,
-    0x65,
-    0x43,
-    0x8a,
-    0xc1,
-    0xe6,
-    0x4a,
-    0x1c,
-    0x57,
-    0x7e,
-    0xb5,
-    0x79,
-    0xa2,
-    0xb5,
-    0x03,
-    0xf9,
-    0x2b,
-    0x46,
-    0x10,
-    0xd3,
-    0xda,
-    0xc5,
-    0x2e,
-    0xe1,
-    0xae,
-    0x85,
-    0x78,
-    0xa8,
-    0xb1,
-    0xb9,
-    0x63,
-    0x93,
-    0x2c,
-    0xd9,
-    0x96,
-    0x7f,
-    0x17,
-    0x48,
-    0xfc,
-    0x7c,
-    0xd3,
-    0x33,
-    0x17,
-    0xd2,
-    0x1c,
-    0xbc,
-    0x97,
-    0x43,
-    0x39,
-    0x58,
-    0x2b,
-    0x90,
-    0x75,
-    0x75,
-    0x97,
-    0x3f,
-    0xd3,
-    0x61,
-    0x07,
-    0x9a,
-    0xfe,
-    0x67,
-    0xa2,
-    0xfb,
-    0x7f,
-    0x3b,
-    0x63,
-    0x47,
-    0x32,
-    0x98,
-    0x24,
-    0xb9,
-    0xfb,
-    0x27,
-    0xfc,
-    0xe1,
-    0xb5,
-    0xa3,
-    0xcb,
-    0xec,
-    0x6b,
-    0x3b,
-    0x13,
-    0x25,
-    0xcb,
-    0x37,
-    0x0a,
-    0xbc,
-    0xd7,
-    0xdf,
-    0xed,
-    0xc6,
-    0xde,
-    0x98,
-    0x96,
-    0x86,
-    0xab,
-    0x51,
-    0x51,
-    0xeb,
-    0xfc,
-    0x1d,
-    0xec,
-    0x59,
-    0x36,
-    0x21,
-    0x0d,
-    0xad,
-    0x56,
-    0xb1,
-    0xc8,
-    0x7b,
-    0x2b,
-    0xb6,
-    0x71,
-    0x99,
-    0xc3,
-    0x53,
-    0xaf,
-    0xe2,
-    0x23,
-    0xc8,
-    0xd2,
-    0x34,
-    0x3a,
-    0x96,
-    0x67,
-    0xbb,
-    0x18,
-    0xe4,
-    0x09,
-    0x72,
-    0x5c,
-    0x21,
-    0x7a,
-    0xe6,
-    0xeb,
-    0xeb,
-    0xf2,
-    0x3e,
-    0xe8,
-    0x2f,
-    0xb6,
-    0x78,
-    0xe0,
-    0x92,
-    0xed,
-    0xf5,
-    0x44,
-    0x10,
-    0xaf,
-    0x38,
-    0x1d,
-    0xe3,
-    0x60,
-    0xeb,
-    0xfb,
-    0xa7,
-    0x3c,
-    0x22,
-    0x2e,
-    0xbb,
-    0x32,
-    0xe4,
-    0x39,
-    0xea,
-    0xf6,
-    0xe8,
-    0x84,
-    0x4b,
-    0x52,
-    0x9c,
-    0x51,
-    0x65,
-    0xbd,
-    0x6b,
-    0xf1,
-    0x97,
-    0x2e,
-    0x40,
-    0x38,
-    0xb8,
-    0x32,
-    0x46,
-    0x2e,
-    0xfa,
-    0x3d,
-    0xf3,
-    0x07,
-    0x14,
-    0x3d,
-    0x44,
-    0x56,
-    0xa0,
-    0x75,
-    0x4a,
-    0x7d,
-    0xc1,
-    0x89,
-    0xe5,
-    0x68,
-    0x0a,
-    0xd5,
-    0xd0,
-    0x7b,
-    0x9b,
-    0x03,
-    0xdd,
-    0xc8,
-    0x8d,
-    0xdd,
-    0x82,
-    0x86,
-    0x91,
-    0x5f,
-    0x95,
-    0xbe,
-    0xd3,
-    0x11,
-    0x54,
-    0x48,
-    0x25,
-    0x94,
-    0xa8,
-    0xf6,
-    0x59,
-    0x7a,
-    0xab,
-    0x0f,
-    0xee,
-    0x5b,
-    0x67,
-    0xff,
-    0xf0,
-    0x24,
-    0xe1,
-    0x4c,
-    0x19,
-    0xb3,
-    0x56,
-    0xcc,
-    0x3c,
-    0xa1,
-    0xc4,
-    0x16,
-    0xe4,
-    0x5f,
-    0xac,
-    0x36,
-    0x38,
-    0x85,
-    0x16,
-    0xa5,
-    0x21,
-    0x66,
-    0xd7,
-    0x78,
-    0xaf,
-    0xe8,
-    0x0f,
-    0xd7,
-    0xb9,
-    0x93,
-    0xf5,
-    0xb1,
-    0xc4,
-    0xe7,
-    0xd7,
-    0xae,
-    0x26,
-    0xf3,
-    0x5c,
-    0x65,
-    0x6c,
-    0x23,
-    0x0d,
-    0xd0,
-    0xf8,
-    0x5a,
-    0x13,
-    0xfc,
-    0xef,
-    0x40,
-    0x42,
-    0x05,
-    0x52,
-    0xde,
-    0x57,
-    0x42,
-    0x6a,
-    0x68,
-    0x7e,
-    0xbd,
-    0x6a,
-    0x59,
-    0x18,
-    0xe6,
-    0x50,
-    0xc5,
-    0xba,
-    0x88,
-    0x0c,
-    0xeb,
-    0x79,
-    0xfb,
-    0xe4,
-    0x0b,
-    0x65,
-    0x9c,
-    0x17,
-    0x77,
-    0x53,
-    0x7a,
-    0xc0,
-    0xeb,
-    0xe0,
-    0x52,
-    0xfe,
-    0x21,
-    0xb2,
-    0xbe,
-    0x52,
-    0xa1,
-    0x01,
-    0xa9,
-    0x48,
-    0xd7,
-    0x56,
-    0x06,
-    0x5a,
-    0x67,
-    0x93,
-    0xc1,
-    0x11,
-    0xc5,
-    0x34,
-    0xf6,
-    0x6d,
-    0x00,
-    0xd4,
-    0x62,
-    0x87,
-    0xde,
-    0xf3,
-    0x17,
-    0x75,
-    0x2e,
-    0xf6,
-    0x73,
-    0x6e,
-    0x5a,
-    0x6f,
-    0x52,
-    0x2e,
-    0x3c,
-    0x9f,
-    0x83,
-    0x9c,
-    0x32,
-    0x3a,
-    0x79,
-    0xab,
-    0x75,
-    0x69,
-    0x43,
-    0x7e,
-    0xa6,
-    0x15,
-    0xbf,
-    0xcf,
-    0xaa,
-    0x63,
-    0x0a,
-    0x91,
-    0xb8,
-    0x7b,
-    0x3a,
-    0xd4,
-    0xb0,
-    0x8e,
-    0x50,
-    0xea,
-    0xaf,
-    0x17,
-    0x68,
-    0xc8,
-    0xe0,
-    0x61,
-    0x33,
-    0xae,
-    0x95,
-    0x49,
-    0xa7,
-    0x0b,
-    0x96,
-    0x45,
-    0xf5,
-    0x9b,
-    0xb8,
-    0xa5,
-    0xbc,
-    0xd2,
-    0xb2,
-    0x19,
-    0x7c,
-    0x7d,
-    0x2d,
-    0x74,
-    0x4d,
-    0xa7,
-    0x1a,
-    0xaf,
-    0xd1,
-    0xb9,
-    0x48,
-    0x31,
-    0x67,
-    0xe6,
-    0x36,
-    0x4d,
-    0xa1,
-    0xc6,
-    0x26,
-    0x0d,
-    0xf9,
-    0x41,
-    0x72,
-    0x2e,
-    0xbf,
-    0xaf,
-    0x23,
-    0x6b,
-    0x56,
-    0x3d,
-    0xc0,
-    0xff,
-    0xa0,
-    0x93,
-    0x64,
-    0x65,
-    0xb7,
-    0xb4,
-    0x13,
-    0x62,
-    0xde,
-    0x25,
-    0x4e,
-    0x45,
-    0xb7,
-    0x51,
-    0xe5,
-    0x6e,
-    0xb6,
-    0x2c,
-    0x0d,
-    0x0d,
-    0xd5,
-    0x17,
-    0xb2,
-    0x2c,
-    0x89,
-    0x04,
-    0x0f,
-    0xf0,
-    0xf5,
-    0xda,
-    0x7b,
-    0x1b,
-    0x5e,
-    0x1b,
-    0x86,
-    0xd6,
-    0xe0,
-    0xc4,
-    0x44,
-    0xae,
-    0x5f,
-    0x74,
-    0xe9,
-    0xdc,
-    0xc0,
-    0xd1,
-    0x96,
-    0xc9,
-    0x58,
-    0x27,
-    0x73,
-    0xd1,
-    0xa4,
-    0x53,
-    0xfe,
-    0x47,
-    0x3b,
-    0xe0,
-    0xa3,
-    0xba,
-    0x02,
-    0x6f,
-    0x8c,
-    0x77,
-    0x9f,
-    0x5c,
-    0xba,
-    0x4f,
-    0x30,
-    0x9e,
-    0x55,
-    0x9b,
-    0x3c,
-    0xef,
-    0x40,
-    0x7d,
-    0xe9,
-    0x2e,
-    0xf1,
-    0x68,
-    0x70,
-    0x01,
-    0x80,
-    0xe2,
-    0xcf,
-    0xbe,
-    0xfd,
-    0x88,
-    0xbe,
-    0x8c,
-    0x07,
-    0x53,
-    0xe3,
-    0xc5,
-    0x9a,
-    0x1b,
-    0x49,
-    0x9f,
-    0x29,
-    0x59,
-    0x0f,
-    0x0c,
-    0xed,
-    0x31,
-    0x5d,
-    0xde,
-    0x7c,
-    0xb0,
-    0x9c,
-    0x2f,
-    0x9d,
-    0x52,
-    0xe7,
-    0x00,
-    0x5b,
-    0xc7,
-    0xbc,
-    0x20,
-    0x58,
-    0xf6,
-    0xf8,
-    0x50,
-    0x64,
-    0x43,
-    0x02,
-    0xa4,
-    0x4e,
-    0x0d,
-    0x46,
-    0x2c,
-    0xfa,
-    0x7b,
-    0xe5,
-    0xd4,
-    0xb4,
-    0x79,
-    0xaa,
-    0x89,
-    0xc4,
-    0xfd,
-    0x41,
-    0x9d,
-    0x43,
-    0x8f,
-    0xa3,
-    0x6d,
-    0x2d,
-    0x08,
-    0xd5,
-    0x41,
-    0xb7,
-    0x9a,
-    0xd2,
-    0x73,
-    0xe2,
-    0x10,
-    0xc6,
-    0xd4,
-    0x50,
-    0x57,
-    0x7c,
-    0x4b,
-    0x56,
-    0x3e,
-    0x1a,
-    0xbf,
-    0x54,
-    0x7a,
-    0x0c,
-    0x37,
-    0x41,
-    0xed,
-    0x3e,
-    0x40,
-    0x8a,
-    0x28,
-    0x8e,
-    0x90,
-    0x1d,
-    0x2e,
-    0x81,
-    0xe8,
-    0xc0,
-    0x7a,
-    0x34,
-    0x3f,
-    0xa8,
-    0x44,
-    0x96,
-    0x1c,
-    0x47,
-    0x01,
-    0xd5,
-    0x44,
-    0x65,
-    0x29,
-    0x16,
-    0x95,
-    0x72,
-    0x3c,
-    0x69,
-    0x32,
-    0x1b,
-    0x07,
-    0xfc,
-    0xe0,
-    0x1b,
-    0x24,
-    0x8f,
-    0xb0,
-    0x54,
-    0xc0,
-    0x27,
-    0xdf,
-    0x1e,
-    0xa0,
-    0x07,
-    0xfa,
-    0xdf,
-    0x66,
-    0xdc,
-    0x45,
-    0xdc,
-    0x11,
-    0x38,
-    0x5e,
-    0x4e,
-    0xc4,
-    0x41,
-    0x1e,
-    0xb9,
-    0xc8,
-    0xab,
-    0xc0,
-    0x79,
-    0xd3,
-    0xe3,
-    0x45,
-    0x9d,
-    0x8b,
-    0x8d,
-    0x16,
-    0xf9,
-    0x46,
-    0x31,
-    0xec,
-    0x77,
-    0x14,
-    0x31,
-    0xed,
-    0xae,
-    0xff,
-    0xff,
-    0x18,
-    0xb6,
-    0x91,
-    0x8c,
-    0xe2,
-    0x3a,
-    0x97,
-    0x04,
-    0x21,
-    0xce,
-    0x25,
-    0xb8,
-    0x2a,
-    0x83,
-    0xda,
-    0x5c,
-    0x36,
-    0xb9,
-    0x65,
-    0x72,
-    0x0b,
-    0x35,
-    0x48,
-    0x06,
-    0xd8,
-    0x74,
-    0xdc,
-    0x9c,
-    0x60,
-    0x3e,
-    0x96,
-    0x67,
-    0x5a,
-    0x7e,
-    0x88,
-    0xbb,
-    0x18,
-    0x50,
-    0x2b,
-    0xc5,
-    0x68,
-    0x5c,
-    0x5b,
-    0x7a,
-    0xb8,
-    0x63,
-    0xa3,
-    0xcd,
-    0x7d,
-    0x17,
-    0xbb,
-    0x25,
-    0xd5,
-    0x30,
-    0x4f,
-    0x0e,
-    0x6a,
-    0xbc,
-    0x02,
-    0x2e,
-    0x9a,
-    0xb6,
-    0xb3,
-    0x7c,
-    0xd6,
-    0xdb,
-    0xff,
-    0xac,
-    0x48,
-    0xb9,
-    0x07,
-    0xed,
-    0xb9,
-    0x09,
-    0x73,
-    0xd7,
-    0xb1,
-    0x3e,
-    0xb7,
-    0x9f,
-    0xe0,
-    0x5e,
-    0x94,
-    0x8e,
-    0xbc,
-    0x11,
-    0xe2,
-    0xb1,
-    0x6c,
-    0xf8,
-    0x8e,
-    0xd1,
-    0xe5,
-    0x3f,
-    0xdf,
-    0xa5,
-    0x53,
-    0x76,
-    0xfd,
-    0x47,
-    0xba,
-    0x9c,
-    0xb3,
-    0xe5,
-    0xdd,
-    0x7d,
-    0x74,
-    0xb9,
-    0x5f,
-    0x3f,
-    0x9c,
-    0x3b,
-    0x28,
-    0x37,
-    0xf9,
-    0x95,
-    0x0a,
-    0x01,
-    0x8a,
-    0x57,
-    0xa4,
-    0xcf,
-    0x86,
-    0x6c,
-    0x87,
-    0x01,
-    0xa0,
-    0x4d,
-    0x98,
-    0xf6,
-    0x8a,
-    0x74,
-    0xb6,
-    0x22,
-    0xb8,
-    0x14,
-    0x9c,
-    0x61,
-    0x66,
-    0x07,
-    0x08,
-    0x8b,
-    0xdc,
-    0x07,
-    0x1d,
-    0x49,
-    0xf1,
-    0x22,
-    0x05,
-    0x27,
-    0xce,
-    0x68,
-    0xdc,
-    0xea,
-    0xf4,
-    0xe7,
-    0xc9,
-    0x23,
-    0x81,
-    0xd9,
-    0x6e,
-    0x04,
-    0xae,
-    0x1b,
-    0x83,
-    0x73,
-    0x9d,
-    0xe1,
-    0xbd,
-    0x5d,
-    0x52,
-    0xa9,
-    0xf5,
-    0x4d,
-    0xff,
-    0x6d,
-    0x86,
-    0x3d,
-    0x84,
-    0x1d,
-    0xf7,
-    0xac,
-    0x36,
-    0x4c,
-    0xda,
-    0xf0,
-    0xdf,
-    0x2a,
-    0xf3,
-    0xce,
-    0x07,
-    0xb2,
-    0x9d,
-    0x48,
-    0x72,
-    0x24,
-    0x6a,
-    0xb6,
-    0xea,
-    0xb6,
-    0x0a,
-    0x18,
-    0x3f,
-    0x86,
-    0x6e,
-    0xab,
-    0x8b,
-    0xd4,
-    0x2c,
-    0xba,
-    0xba,
-    0x6e,
-    0x26,
-    0xb7,
-    0x4a,
-    0x6b,
-    0x67,
-    0x8a,
-    0x50,
-    0x1c,
-    0x4d,
-    0x29,
-    0xbc,
-    0x40,
-    0xed,
-    0x69,
-    0xdd,
-    0x77,
-    0xb3,
-    0x14,
-    0x28,
-    0xfa,
-    0x49,
-    0x3b,
-    0x35,
-    0x88,
-    0xba,
-    0xcd,
-    0x0a,
-    0xa4,
-    0xd8,
-    0x69,
-    0x9c,
-    0xfd,
-    0xdb,
-    0x71,
-    0x93,
-    0x2e,
-    0x4a,
-    0x60,
-    0x4e,
-    0xa7,
-    0x1f,
-    0x5d,
-    0x27,
-    0xeb,
-    0x26,
-    0x10,
-    0xf8,
-    0xfd,
-    0xa6,
-    0xb4,
-    0xde,
-    0x14,
-    0x43,
-    0x6d,
-    0x3c,
-    0x96,
-    0x23,
-    0xdc,
-    0x03,
-    0x44,
-    0x50,
-    0xf1,
-    0x31,
-    0xb2,
-    0x5d,
-    0x01,
-    0x98,
-    0xfb,
-    0x4d,
-    0x19,
-    0xe1,
-    0xb2,
-    0xb0,
-    0x91,
-    0xd0,
-    0x1c,
-    0x0f,
-    0xe4,
-    0xca,
-    0x9c,
-    0x8a,
-    0xbf,
-    0x94,
-    0x6e,
-    0xc0,
-    0x57,
-    0x5d,
-    0x98,
-    0xef,
-    0x00,
-    0xff,
-    0x1e,
-    0x5c,
-    0xfc,
-    0x82,
-    0x76,
-    0xf6,
-    0x90,
-    0xe1,
-    0x3b,
-    0x36,
-    0x5d,
-    0x11,
-    0x26,
-    0x49,
-    0xee,
-    0x40,
-    0x39,
-    0x71,
-    0x8e,
-    0x5b,
-    0x3d,
-    0xa9,
-    0x5c,
-    0xd2,
-    0x6f,
-    0x88,
-    0xa1,
-    0x9f,
-    0x77,
-    0x67,
-    0x60,
-    0x85,
-    0x99,
-    0xc6,
-    0x2f,
-    0x95,
-    0x2f,
-    0xec,
-    0x46,
-    0xf7,
-    0x57,
-    0xce,
-    0xd6,
-    0xe7,
-    0xe9,
-    0x32,
-    0x9c,
-    0xfe,
-    0xac,
-    0x14,
-    0xb5,
-    0xb3,
-    0xc9,
-    0x49,
-    0xb4,
-    0x21,
-    0x7f,
-    0x62,
-    0xf2,
-    0x0b,
-    0x19,
-    0xd3,
-    0x25,
-    0x1d,
-    0x1d,
-    0x55,
-    0x34,
-    0x74,
-    0xc7,
-    0x88,
-    0x4a,
-    0x61,
-    0xb5,
-    0xdd,
-    0x2a,
-    0x6a,
-    0xe4,
-    0xb3,
-    0xc2,
-    0x92,
-    0xdb,
-    0xc0,
-    0x02,
-    0xdb,
-    0x26,
-    0xb3,
-    0xee,
-    0x08,
-    0x06,
-    0x17,
-    0xf2,
-    0xa7,
-    0x67,
-    0x7b,
-    0x76,
-    0x4f,
-    0x12,
-    0xd0,
-    0xb3,
-    0x27,
-    0x24,
-    0x12,
-    0xc5,
-    0xa7,
-    0xbf,
-    0x2b,
-    0x01,
-    0xa3,
-    0xff,
-    0x14,
-    0x88,
-    0x85,
-    0x30,
-    0x3d,
-    0x1c,
-    0xda,
-    0x3e,
-    0x2f,
-    0x33,
-    0x10,
-    0x6c,
-    0x70,
-    0x4a,
-    0x7d,
-    0x49,
-    0xa6,
-    0x7c,
-    0xa4,
-    0xe1,
-    0x00,
-    0x53,
-    0xb4,
-    0x30,
-    0xd2,
-    0xde,
-    0x52,
-    0xdc,
-    0x7f,
-    0x04,
-    0x98,
-    0x23,
-    0x9c,
-    0x17,
-    0x5e,
-    0x11,
-    0x52,
-    0xad,
-    0xb8,
-    0xf7,
-    0x04,
-    0xab,
-    0xbf,
-    0x1a,
-    0x32,
-    0xa2,
-    0x95,
-    0xa8,
-    0x9e,
-    0x5f,
-    0xa3,
-    0xf0,
-    0xad,
-    0xbd,
-    0x25,
-    0xd1,
-    0x0f,
-    0xbe,
-    0xe9,
-    0x73,
-    0xa2,
-    0xda,
-    0x53,
-    0x36,
-    0x94,
-    0x97,
-    0xa5,
-    0xe8,
-    0xc9,
-    0x5a,
-    0x7d,
-    0x3b,
-    0x7c,
-    0x7d,
-    0xa0,
-    0x76,
-    0x28,
-    0xa1,
-    0xf5,
-    0x6a,
-    0xa9,
-    0x46,
-    0xd5,
-    0xa8,
-    0x9e,
-    0x99,
-    0x82,
-    0xf1,
-    0x13,
-    0x8c,
-    0xf4,
-    0xee,
-    0x5d,
-    0x2c,
-    0xdc,
-    0x21,
-    0x44,
-    0x30,
-    0xe3,
-    0x1c,
-    0x68,
-    0xcd,
-    0x32,
-    0xf1,
-    0xdd,
-    0xd2,
-    0x38,
-    0xe9,
-    0x19,
-    0xf0,
-    0xa7,
-    0x79,
-    0x10,
-    0x59,
-    0xc0,
-    0x71,
-    0x9d,
-    0x8e,
-    0xd1,
-    0x77,
-    0x24,
-    0x71,
-    0xfc,
-    0xb4,
-    0x76,
-    0xa2,
-    0x39,
-    0xcd,
-    0xf4,
-    0x08,
-    0x9e,
-    0x15,
-    0xf8,
-    0xae,
-    0xdf,
-    0x01,
-    0x70,
-    0xd1,
-    0x11,
-    0xdc,
-    0xcc,
-    0x37,
-    0xb3,
-    0xbb,
-    0x1b,
-    0xc2,
-    0xee,
-    0xb4,
-    0x70,
-    0x44,
-    0x1c,
-    0x4b,
-    0x8b,
-    0x95,
-    0x88,
-    0x2d,
-    0xb5,
-    0xe3,
-    0x74,
-    0x21,
-    0xec,
-    0x4a,
-    0x61,
-    0x3b,
-    0x40,
-    0xa4,
-    0x8a,
-    0x52,
-    0x7d,
-    0xa3,
-    0xb2,
-    0xb5,
-    0x0a,
-    0x1d,
-    0x1f,
-    0x1a,
-    0x11,
-    0xa6,
-    0xe7,
-    0xd7,
-    0xe0,
-    0x64,
-    0x6a,
-    0x55,
-    0x90,
-    0x1f,
-    0x20,
-    0xc1,
-    0xe4,
-    0x98,
-    0x95,
-    0x04,
-    0x73,
-    0x1c,
-    0xb1,
-    0xf6,
-    0x0a,
-    0x58,
-    0x3d,
-    0xce,
-    0x4c,
-    0x6f,
-    0xa3,
-    0xde,
-    0x9b,
-    0x4a,
-    0xf5,
-    0x7d,
-    0x3c,
-    0x30,
-    0x31,
-    0x44,
-    0xb5,
-    0x96,
-    0xc4,
-    0x7d,
-    0x7a,
-    0x38,
-    0x4c,
-    0xd8,
-    0xc9,
-    0x68,
-    0xa2,
-    0x60,
-    0xd3,
-    0xa6,
-    0x18,
-    0xae,
-    0x1c,
-    0x72,
-    0xff,
-    0x5c,
-    0x24,
-    0x5e,
-    0x6d,
-    0xbd,
-    0x47,
-    0x67,
-    0x3d,
-    0xcb,
-    0xe2,
-    0x85,
-    0x56,
-    0x61,
-    0xb7,
-    0x81,
-    0x31,
-    0xab,
-    0x93,
-    0x07,
-    0x95,
-    0xda,
-    0x2e,
-    0xfc,
-    0xa5,
-    0x1c,
-    0x52,
-    0x11,
-    0x1d,
-    0xcb,
-    0x3f,
-    0x99,
-    0xd9,
-    0xe4,
-    0x4f,
-    0x98,
-    0x97,
-    0xbc,
-    0xd6,
-    0x1c,
-    0xfd,
-    0xee,
-    0x4c,
-    0xd0,
-    0xde,
-    0x98,
-    0xae,
-    0xce,
-    0xb9,
-    0xc7,
-    0x21,
-    0xb5,
-    0x82,
-    0x2f,
-    0xd9,
-    0xfb,
-    0xa5,
-    0x20,
-    0x39,
-    0x85,
-    0x49,
-    0xb5,
-    0x3b,
-    0x75,
-    0xd1,
-    0x4f,
-    0x13,
-    0x44,
-    0xa9,
-    0x41,
-    0x0f,
-    0x10,
-    0x3f,
-    0xcd,
-    0xc2,
-    0x37,
-    0x4f,
-    0x50,
-    0x61,
-    0x24,
-    0x64,
-    0xb9,
-    0x6d,
-    0x69,
-    0x9c,
-    0x3f,
-    0x92,
-    0x0e,
-    0xab,
-    0x54,
-    0xd0,
-    0x29,
-    0x22,
-    0xd4,
-    0xd8,
-    0xaf,
-    0xf2,
-    0x83,
-    0xb9,
-    0x8a,
-    0x2b,
-    0xb6,
-    0xbb,
-    0xec,
-    0x0a,
-    0x50,
-    0x8b,
-    0xe2,
-    0x33,
-    0xf0,
-    0x99,
-    0x2c,
-    0x3b,
-    0x69,
-    0xbf,
-    0x4c,
-    0x69,
-    0x73,
-    0x23,
-    0xdd,
-    0xbe,
-    0xa0,
-    0x5e,
-    0x26,
-    0x32,
-    0x91,
-    0xde,
-    0xef,
-    0x41,
-    0x69,
-    0x88,
-    0x93,
-    0xa6,
-    0x82,
-    0xa2,
-    0x57,
-    0x67,
-    0x5f,
-    0xf1,
-    0xfa,
-    0x11,
-    0xe2,
-    0x1e,
-    0x8e,
-    0x45,
-    0xbf,
-    0x5f,
-    0x86,
-    0x73,
-    0x31,
-    0x53,
-    0x0f,
-    0xe6,
-    0xec,
-    0x2d,
-    0xa4,
-    0x01,
-    0x52,
-    0x14,
-    0xdc,
-    0xc8,
-    0xe9,
-    0xca,
-    0x87,
-    0xa2,
-    0x0d,
-    0x8c,
-    0xfa,
-    0x5c,
-    0xe2,
-    0x3a,
-    0xa7,
-    0x72,
-    0x8d,
-    0xb8,
-    0xf1,
-    0x8a,
-    0xa4,
-    0x94,
-    0x3e,
-    0x42,
-    0xe2,
-    0xe9,
-    0x4d,
-    0x2b,
-    0x20,
-    0x83,
-    0xca,
-    0x15,
-    0x80,
-    0x43,
-    0x1f,
-    0x8e,
-    0xec,
-    0xc5,
-    0x8e,
-    0xa5,
-    0xbf,
-    0x41,
-    0x7c,
-    0xf4,
-    0xc1,
-    0xaf,
-    0x10,
-    0xdd,
-    0x59,
-    0x2f,
-    0xfd,
-    0x13,
-    0xfe,
-    0xa7,
-    0x9c,
-    0x5c,
-    0xef,
-    0xae,
-    0x3e,
-    0x96,
-    0x24,
-    0xa9,
-    0xc0,
-    0xf8,
-    0x84,
-    0x33,
-    0x60,
-    0x9b,
-    0x58,
-    0xc3,
-    0xce,
-    0x39,
-    0x00,
-    0x88,
-    0x87,
-    0x34,
-    0xe4,
-    0x98,
-    0x5e,
-    0xda,
-    0xae,
-    0x4a,
-    0x5b,
-    0xe7,
-    0xb7,
-    0xe0,
-    0xc9,
-    0x4b,
-    0xbe,
-    0x6a,
-    0x8b,
-    0x2e,
-    0xe0,
-    0xe7,
-    0xaf,
-    0x32,
-    0xc4,
-    0xac
-  ],
-  const [
-    0x54,
-    0xad,
-    0x09,
-    0xea,
-    0xd6,
-    0x15,
-    0x40,
-    0x36,
-    0x63,
-    0x64,
-    0xb6,
-    0xf3,
-    0x11,
-    0xe3,
-    0xd9,
-    0xe3,
-    0x73,
-    0x6c,
-    0x71,
-    0xc3,
-    0x1b,
-    0xda,
-    0x3b,
-    0x69,
-    0x5c,
-    0xbe,
-    0xd4,
-    0x0f,
-    0x55,
-    0x54,
-    0xd9,
-    0xef,
-    0x2a,
-    0xb5,
-    0x4d,
-    0x10,
-    0x95,
-    0x4d,
-    0x3b,
-    0x5f,
-    0x9e,
-    0x90,
-    0x9c,
-    0x01,
-    0xa6,
-    0xe9,
-    0x7a,
-    0xe8,
-    0xaa,
-    0xf3,
-    0x56,
-    0xa4,
-    0xc6,
-    0xec,
-    0xc8,
-    0x7c,
-    0xf8,
-    0x67,
-    0x65,
-    0xbe,
-    0x27,
-    0x40,
-    0xe5,
-    0x53,
-    0x64,
-    0xd5,
-    0x86,
-    0x96,
-    0x6f,
-    0x73,
-    0xab,
-    0x67,
-    0x7d,
-    0x0f,
-    0xc9,
-    0x7a,
-    0x38,
-    0x37,
-    0x83,
-    0xf5,
-    0x08,
-    0x48,
-    0x14,
-    0x3b,
-    0x91,
-    0xe0,
-    0xee,
-    0x02,
-    0x7d,
-    0x96,
-    0xa0,
-    0xac,
-    0x7b,
-    0xe9,
-    0xfd,
-    0xd4,
-    0x87,
-    0x77,
-    0x7b,
-    0x27,
-    0x6d,
-    0x70,
-    0xd9,
-    0x75,
-    0x88,
-    0x49,
-    0x05,
-    0x07,
-    0xd0,
-    0xb5,
-    0x3c,
-    0x34,
-    0x14,
-    0xd1,
-    0x73,
-    0x2f,
-    0x83,
-    0x9e,
-    0xf6,
-    0x23,
-    0x71,
-    0xb5,
-    0x4f,
-    0x82,
-    0x58,
-    0x36,
-    0x69,
-    0x9a,
-    0x1d,
-    0x02,
-    0xf5,
-    0x69,
-    0x95,
-    0x2a,
-    0x0d,
-    0xb2,
-    0x48,
-    0xa7,
-    0x17,
-    0x50,
-    0x75,
-    0x4b,
-    0xed,
-    0xcb,
-    0x56,
-    0xf7,
-    0x3b,
-    0x29,
-    0xa4,
-    0x0f,
-    0x28,
-    0x06,
-    0x5e,
-    0x2b,
-    0x38,
-    0xe7,
-    0xc7,
-    0x0f,
-    0x70,
-    0xcc,
-    0xae,
-    0xde,
-    0xbc,
-    0x04,
-    0xf1,
-    0x8a,
-    0x8f,
-    0x45,
-    0x44,
-    0x8f,
-    0xc9,
-    0xfc,
-    0x2f,
-    0xe1,
-    0xdd,
-    0xe2,
-    0x56,
-    0x22,
-    0x33,
-    0xd0,
-    0xfd,
-    0x19,
-    0xcb,
-    0xd4,
-    0xcb,
-    0x60,
-    0x24,
-    0x84,
-    0xce,
-    0x5c,
-    0x5c,
-    0x92,
-    0xc0,
-    0x72,
-    0x98,
-    0xa1,
-    0x89,
-    0x78,
-    0xa6,
-    0x57,
-    0x04,
-    0x6a,
-    0xe1,
-    0xb4,
-    0x06,
-    0x5f,
-    0x55,
-    0xa2,
-    0x9d,
-    0xbb,
-    0x24,
-    0xcd,
-    0x95,
-    0xa5,
-    0x29,
-    0xb4,
-    0x41,
-    0xbc,
-    0xda,
-    0x01,
-    0x78,
-    0x05,
-    0x73,
-    0x15,
-    0xdd,
-    0x28,
-    0x51,
-    0xe8,
-    0x63,
-    0xdd,
-    0x9b,
-    0x10,
-    0x11,
-    0xa1,
-    0x28,
-    0x1f,
-    0x03,
-    0xad,
-    0x9d,
-    0x32,
-    0xb2,
-    0x28,
-    0xd6,
-    0xc7,
-    0x75,
-    0x9c,
-    0x88,
-    0xcf,
-    0x47,
-    0xa7,
-    0x24,
-    0x05,
-    0xca,
-    0xf3,
-    0xfe,
-    0x7d,
-    0x8c,
-    0x67,
-    0xae,
-    0x80,
-    0x89,
-    0x9f,
-    0xb6,
-    0x97,
-    0xf2,
-    0x9a,
-    0x66,
-    0xe6,
-    0x2d,
-    0xb3,
-    0xfd,
-    0xbb,
-    0x1d,
-    0xd3,
-    0x11,
-    0x67,
-    0xa3,
-    0xe4,
-    0x31,
-    0x4d,
-    0x65,
-    0x89,
-    0xc8,
-    0x38,
-    0xce,
-    0x0c,
-    0x44,
-    0xf2,
-    0x56,
-    0x98,
-    0x78,
-    0x12,
-    0x03,
-    0xa8,
-    0x3f,
-    0x15,
-    0x2f,
-    0xbf,
-    0x63,
-    0xb0,
-    0x8d,
-    0x5a,
-    0xbd,
-    0x65,
-    0x67,
-    0x22,
-    0x9d,
-    0x55,
-    0x29,
-    0x67,
-    0x6c,
-    0x55,
-    0x23,
-    0xca,
-    0x8f,
-    0x43,
-    0x8b,
-    0x39,
-    0x8f,
-    0x9b,
-    0xc1,
-    0x21,
-    0x77,
-    0x45,
-    0xd7,
-    0xde,
-    0x7e,
-    0xb1,
-    0x51,
-    0x77,
-    0xe6,
-    0x26,
-    0x29,
-    0x88,
-    0x24,
-    0x57,
-    0x17,
-    0x7f,
-    0x41,
-    0x38,
-    0x0f,
-    0x0b,
-    0x80,
-    0x0f,
-    0x0a,
-    0xd2,
-    0x41,
-    0xce,
-    0x09,
-    0x63,
-    0x25,
-    0xa0,
-    0x57,
-    0x6b,
-    0x73,
-    0xc2,
-    0x0f,
-    0x2b,
-    0xbb,
-    0x94,
-    0xdf,
-    0x29,
-    0xb9,
-    0xf0,
-    0x0b,
-    0x26,
-    0x7b,
-    0xba,
-    0xb5,
-    0x51,
-    0xc6,
-    0xb8,
-    0x5b,
-    0xba,
-    0xb7,
-    0xa4,
-    0xa1,
-    0x09,
-    0xa6,
-    0x80,
-    0x51,
-    0x70,
-    0x4f,
-    0x2a,
-    0xa0,
-    0xde,
-    0x34,
-    0x30,
-    0xb3,
-    0x76,
-    0x3d,
-    0xe5,
-    0x61,
-    0x3f,
-    0xa2,
-    0xb5,
-    0x3b,
-    0x1d,
-    0x0a,
-    0xb5,
-    0xc9,
-    0x00,
-    0xf5,
-    0x7e,
-    0x17,
-    0x5b,
-    0x57,
-    0x3c,
-    0x70,
-    0xd8,
-    0x85,
-    0x02,
-    0x6a,
-    0x4a,
-    0x55,
-    0x61,
-    0x23,
-    0xe2,
-    0x81,
-    0x38,
-    0xc9,
-    0xa7,
-    0x4d,
-    0xcd,
-    0x60,
-    0x20,
-    0x6a,
-    0x1d,
-    0xbf,
-    0x53,
-    0x19,
-    0x71,
-    0xdc,
-    0xf4,
-    0x94,
-    0x32,
-    0x4a,
-    0xd6,
-    0xa9,
-    0xfe,
-    0x00,
-    0xa5,
-    0xa8,
-    0xfb,
-    0x5c,
-    0xd7,
-    0x7f,
-    0x6c,
-    0x68,
-    0xe0,
-    0x24,
-    0x82,
-    0x5b,
-    0xa5,
-    0x33,
-    0x74,
-    0x63,
-    0x34,
-    0xd9,
-    0xd2,
-    0xa1,
-    0xb2,
-    0xf0,
-    0x16,
-    0x75,
-    0x94,
-    0x6b,
-    0x7c,
-    0xfd,
-    0x13,
-    0xf5,
-    0x13,
-    0xd8,
-    0xd9,
-    0xd5,
-    0x14,
-    0x30,
-    0x01,
-    0x15,
-    0x73,
-    0xf7,
-    0x3e,
-    0xe3,
-    0xb5,
-    0x70,
-    0x5a,
-    0x37,
-    0x01,
-    0xf2,
-    0xe3,
-    0xb6,
-    0x79,
-    0xe9,
-    0x21,
-    0xd7,
-    0xcb,
-    0x1d,
-    0x4a,
-    0x44,
-    0x02,
-    0x37,
-    0xf9,
-    0x83,
-    0xa3,
-    0x81,
-    0xdd,
-    0xd5,
-    0xf5,
-    0xed,
-    0xae,
-    0x5e,
-    0xa0,
-    0x59,
-    0x66,
-    0x87,
-    0x79,
-    0x11,
-    0xad,
-    0xa1,
-    0x9d,
-    0x95,
-    0x95,
-    0xcb,
-    0xbd,
-    0x9d,
-    0x87,
-    0x15,
-    0xb8,
-    0x5b,
-    0x7e,
-    0xe5,
-    0x6f,
-    0x00,
-    0x72,
-    0x9a,
-    0xd5,
-    0x81,
-    0x18,
-    0x70,
-    0x45,
-    0x9b,
-    0xc8,
-    0xa3,
-    0x19,
-    0x15,
-    0xbe,
-    0xd8,
-    0x78,
-    0x45,
-    0x86,
-    0xb8,
-    0x6f,
-    0xd5,
-    0xb2,
-    0xde,
-    0x43,
-    0xc7,
-    0xce,
-    0xf3,
-    0x06,
-    0xb7,
-    0x96,
-    0x17,
-    0x69,
-    0x60,
-    0x66,
-    0x83,
-    0xd1,
-    0x62,
-    0xf1,
-    0x6d,
-    0xad,
-    0x43,
-    0x36,
-    0x2c,
-    0x06,
-    0xb3,
-    0xb0,
-    0x9d,
-    0x57,
-    0x14,
-    0xcd,
-    0xc5,
-    0xa0,
-    0x39,
-    0xa2,
-    0xb8,
-    0xb6,
-    0x6e,
-    0xdd,
-    0xb9,
-    0xdd,
-    0xb9,
-    0xfb,
-    0xa2,
-    0x98,
-    0x60,
-    0xbb,
-    0x87,
-    0xc0,
-    0xab,
-    0xd2,
-    0x96,
-    0xd4,
-    0xeb,
-    0xe0,
-    0x41,
-    0x90,
-    0xbb,
-    0xa3,
-    0xa0,
-    0xc1,
-    0x86,
-    0x6a,
-    0x10,
-    0x57,
-    0x4a,
-    0xcd,
-    0x21,
-    0xbc,
-    0x9b,
-    0x9c,
-    0xaf,
-    0x64,
-    0xea,
-    0x15,
-    0x4e,
-    0xa6,
-    0x07,
-    0x5a,
-    0xec,
-    0xca,
-    0xe5,
-    0x22,
-    0xb1,
-    0x63,
-    0x9e,
-    0xae,
-    0x2a,
-    0xdf,
-    0xb6,
-    0xff,
-    0xa7,
-    0x5c,
-    0xa4,
-    0x46,
-    0xe1,
-    0xbd,
-    0x8e,
-    0x9c,
-    0xe0,
-    0xfd,
-    0x55,
-    0xf3,
-    0x1c,
-    0xc4,
-    0xd1,
-    0x4c,
-    0xe3,
-    0x38,
-    0x5e,
-    0x2b,
-    0xfa,
-    0x16,
-    0x97,
-    0x48,
-    0x87,
-    0x01,
-    0x61,
-    0x88,
-    0x2e,
-    0x1a,
-    0x2c,
-    0x2b,
-    0x7b,
-    0xd0,
-    0x75,
-    0x47,
-    0x80,
-    0xfa,
-    0x8f,
-    0x75,
-    0xbf,
-    0x23,
-    0xa4,
-    0xca,
-    0x4a,
-    0x24,
-    0xf7,
-    0x09,
-    0x28,
-    0xf9,
-    0x6b,
-    0x16,
-    0xfb,
-    0xcd,
-    0x49,
-    0xae,
-    0xe0,
-    0x57,
-    0x3e,
-    0x56,
-    0x97,
-    0x69,
-    0xa3,
-    0x91,
-    0xe4,
-    0xc6,
-    0x01,
-    0x56,
-    0x34,
-    0x35,
-    0xd5,
-    0xc1,
-    0x84,
-    0xd3,
-    0x90,
-    0x09,
-    0x7f,
-    0xad,
-    0xe2,
-    0xb2,
-    0xe6,
-    0x8e,
-    0x38,
-    0x04,
-    0x35,
-    0x16,
-    0x84,
-    0xbb,
-    0x84,
-    0x0c,
-    0x3c,
-    0x00,
-    0xab,
-    0xf5,
-    0xa5,
-    0x98,
-    0xa9,
-    0xe6,
-    0x51,
-    0x5c,
-    0x47,
-    0x96,
-    0xe6,
-    0xe9,
-    0xf8,
-    0xb7,
-    0x22,
-    0x98,
-    0x04,
-    0x87,
-    0x1c,
-    0xb1,
-    0xe5,
-    0xa2,
-    0xcd,
-    0xdb,
-    0xf1,
-    0x1a,
-    0xce,
-    0xd7,
-    0x3a,
-    0xc9,
-    0x63,
-    0x6e,
-    0xb3,
-    0xe6,
-    0xb9,
-    0xa8,
-    0x94,
-    0xd7,
-    0x6c,
-    0x3f,
-    0xff,
-    0x46,
-    0x4c,
-    0x53,
-    0xe3,
-    0x77,
-    0x61,
-    0x5f,
-    0x21,
-    0xd9,
-    0x2d,
-    0x6c,
-    0xed,
-    0xdb,
-    0x30,
-    0x85,
-    0x77,
-    0x00,
-    0xb2,
-    0x6a,
-    0xcb,
-    0x36,
-    0xbc,
-    0x89,
-    0xf6,
-    0x64,
-    0x68,
-    0x29,
-    0x6b,
-    0x42,
-    0x5a,
-    0xe9,
-    0xa5,
-    0x6d,
-    0x8f,
-    0x69,
-    0x0d,
-    0xbb,
-    0x56,
-    0x47,
-    0x1d,
-    0xcb,
-    0x9b,
-    0x4d,
-    0xc6,
-    0xe1,
-    0x6b,
-    0xe8,
-    0x0f,
-    0xf1,
-    0xb5,
-    0xdc,
-    0x00,
-    0xfa,
-    0x4e,
-    0x37,
-    0xbe,
-    0x96,
-    0x38,
-    0x83,
-    0xf7,
-    0xce,
-    0x24,
-    0x40,
-    0x80,
-    0x32,
-    0x35,
-    0x92,
-    0x3d,
-    0x2a,
-    0x07,
-    0x36,
-    0x42,
-    0x87,
-    0xf0,
-    0xba,
-    0x37,
-    0x5d,
-    0x86,
-    0xee,
-    0x01,
-    0x15,
-    0x61,
-    0x96,
-    0x9f,
-    0xbe,
-    0x22,
-    0x61,
-    0x51,
-    0xa4,
-    0xb3,
-    0x1f,
-    0x00,
-    0x24,
-    0xd1,
-    0x2e,
-    0xda,
-    0xbe,
-    0xc8,
-    0x35,
-    0x3d,
-    0x6c,
-    0x7e,
-    0x15,
-    0xd6,
-    0x32,
-    0xb3,
-    0x1d,
-    0x0a,
-    0xf7,
-    0x87,
-    0x7e,
-    0x94,
-    0x93,
-    0x3d,
-    0xfe,
-    0x70,
-    0x29,
-    0x3e,
-    0xf0,
-    0xf8,
-    0xb7,
-    0x61,
-    0x63,
-    0x4e,
-    0xeb,
-    0x69,
-    0x9a,
-    0xf9,
-    0x39,
-    0xd0,
-    0xbc,
-    0xd3,
-    0x2a,
-    0xc3,
-    0xcd,
-    0x22,
-    0xf7,
-    0x6d,
-    0xdd,
-    0x05,
-    0x56,
-    0x78,
-    0x7f,
-    0x12,
-    0x94,
-    0xd1,
-    0x7d,
-    0x3d,
-    0xe4,
-    0xac,
-    0xca,
-    0xfb,
-    0xf7,
-    0xc9,
-    0xb8,
-    0xa8,
-    0xcc,
-    0xf5,
-    0x6b,
-    0x26,
-    0xca,
-    0xd3,
-    0x8e,
-    0xc8,
-    0x0c,
-    0xdc,
-    0x44,
-    0x6e,
-    0xfc,
-    0xa5,
-    0x62,
-    0xf1,
-    0x23,
-    0x60,
-    0xdb,
-    0xc1,
-    0x3f,
-    0xa6,
-    0x7c,
-    0xcc,
-    0x96,
-    0x74,
-    0xd9,
-    0xa2,
-    0x8b,
-    0x73,
-    0x87,
-    0xd7,
-    0x6f,
-    0x7c,
-    0x8b,
-    0xa9,
-    0x99,
-    0x5b,
-    0x13,
-    0xe3,
-    0xb9,
-    0xd3,
-    0x64,
-    0x02,
-    0x69,
-    0xe3,
-    0x14,
-    0x95,
-    0x05,
-    0x48,
-    0x79,
-    0xea,
-    0xbd,
-    0x43,
-    0x61,
-    0xe6,
-    0xe8,
-    0x9c,
-    0x03,
-    0x35,
-    0x9b,
-    0xe7,
-    0x36,
-    0xa4,
-    0x7b,
-    0x06,
-    0xe1,
-    0xca,
-    0xcf,
-    0xef,
-    0xb3,
-    0xee,
-    0xda,
-    0xb0,
-    0x14,
-    0x25,
-    0x67,
-    0xb0,
-    0x5b,
-    0xbb,
-    0xa5,
-    0x37,
-    0x41,
-    0xd4,
-    0x35,
-    0x30,
-    0x95,
-    0x53,
-    0x82,
-    0x2e,
-    0x32,
-    0xfb,
-    0x51,
-    0xae,
-    0x2f,
-    0xd4,
-    0x99,
-    0x9c,
-    0x55,
-    0xd1,
-    0x94,
-    0x18,
-    0xd6,
-    0xaf,
-    0x16,
-    0x79,
-    0x3b,
-    0x20,
-    0x1e,
-    0x92,
-    0x9f,
-    0x29,
-    0xaa,
-    0x35,
-    0x1b,
-    0xc9,
-    0xd0,
-    0xf6,
-    0x81,
-    0xdb,
-    0x0b,
-    0x31,
-    0x4d,
-    0x3d,
-    0xd3,
-    0x4f,
-    0xd8,
-    0x32,
-    0x70,
-    0x44,
-    0xcf,
-    0x05,
-    0x0f,
-    0x5c,
-    0xe4,
-    0xf0,
-    0x16,
-    0x38,
-    0xc3,
-    0x3b,
-    0xb5,
-    0x13,
-    0x48,
-    0xa8,
-    0xbd,
-    0x4b,
-    0xef,
-    0x0f,
-    0xb6,
-    0x1c,
-    0x8c,
-    0x46,
-    0x2c,
-    0xae,
-    0x3c,
-    0x43,
-    0x49,
-    0x52,
-    0x9b,
-    0x85,
-    0xa9,
-    0x08,
-    0x37,
-    0xb0,
-    0x69,
-    0x46,
-    0x45,
-    0x77,
-    0x81,
-    0xf4,
-    0x93,
-    0xbe,
-    0x54,
-    0xbb,
-    0xbe,
-    0x00,
-    0x86,
-    0x7f,
-    0xa5,
-    0xef,
-    0x0e,
-    0x2a,
-    0x1d,
-    0x5b,
-    0x8c,
-    0xac,
-    0xe7,
-    0x55,
-    0xdc,
-    0x40,
-    0xdf,
-    0x94,
-    0xeb,
-    0xf0,
-    0x75,
-    0x18,
-    0xc9,
-    0x5b,
-    0x61,
-    0x0c,
-    0x00,
-    0xb6,
-    0x93,
-    0xf1,
-    0x25,
-    0x11,
-    0x69,
-    0xf9,
-    0xac,
-    0xdb,
-    0x25,
-    0xb1,
-    0x00,
-    0xa9,
-    0x9e,
-    0xe3,
-    0xd4,
-    0x33,
-    0x36,
-    0xbb,
-    0xb3,
-    0x9f,
-    0x0b,
-    0x28,
-    0xdf,
-    0x03,
-    0x72,
-    0x85,
-    0x58,
-    0x25,
-    0xa1,
-    0x79,
-    0x3b,
-    0x85,
-    0xab,
-    0x1c,
-    0x4d,
-    0x9d,
-    0xb2,
-    0x5b,
-    0xd8,
-    0x67,
-    0x57,
-    0x9d,
-    0xb6,
-    0x20,
-    0x76,
-    0xa7,
-    0xab,
-    0x4c,
-    0x11,
-    0xbc,
-    0xf8,
-    0xfa,
-    0x89,
-    0x09,
-    0x2c,
-    0x49,
-    0x14,
-    0x41,
-    0x3e,
-    0x2b,
-    0x6b,
-    0x85,
-    0xd9,
-    0x69,
-    0xc3,
-    0x86,
-    0xf7,
-    0xe7,
-    0xff,
-    0xed,
-    0xb1,
-    0x2a,
-    0x24,
-    0xfb,
-    0x55,
-    0x17,
-    0x0d,
-    0x6c,
-    0xba,
-    0xfd,
-    0x60,
-    0xa2,
-    0xd0,
-    0xd6,
-    0xc0,
-    0xff,
-    0x7b,
-    0xca,
-    0x44,
-    0x93,
-    0xa2,
-    0xf5,
-    0x28,
-    0xf7,
-    0x83,
-    0x6a,
-    0xc3,
-    0x78,
-    0x49,
-    0x78,
-    0xb9,
-    0x78,
-    0xe0,
-    0x2c,
-    0x72,
-    0x12,
-    0x08,
-    0x16,
-    0xcb,
-    0xfd,
-    0xa8,
-    0x50,
-    0x0b,
-    0xb3,
-    0x65,
-    0xbd,
-    0x18,
-    0xd2,
-    0x74,
-    0x8f,
-    0xeb,
-    0xc2,
-    0xac,
-    0x0c,
-    0x41,
-    0x98,
-    0xe0,
-    0x91,
-    0x93,
-    0x3a,
-    0x6b,
-    0xd7,
-    0x49,
-    0xc4,
-    0x0c,
-    0x75,
-    0x2b,
-    0x2b,
-    0xf5,
-    0xa6,
-    0x18,
-    0x21,
-    0x1e,
-    0x4d,
-    0xfa,
-    0x38,
-    0xdf,
-    0x36,
-    0xf9,
-    0x49,
-    0xbe,
-    0x9f,
-    0xef,
-    0x17,
-    0x86,
-    0xf7,
-    0x1c,
-    0x30,
-    0x99,
-    0xe5,
-    0x1c,
-    0x14,
-    0x86,
-    0x8c,
-    0x15,
-    0x99,
-    0xde,
-    0x0e,
-    0x35,
-    0x8e,
-    0x44,
-    0x4e,
-    0x5c,
-    0x9f,
-    0xc4,
-    0xfb,
-    0x15,
-    0x78,
-    0x66,
-    0xca,
-    0xcb,
-    0x2e,
-    0x02,
-    0x02,
-    0x3a,
-    0xda,
-    0x55,
-    0x3e,
-    0x23,
-    0x87,
-    0x55,
-    0x6e,
-    0x44,
-    0x4e,
-    0xc2,
-    0x20,
-    0x87,
-    0xbf,
-    0xfe,
-    0xfe,
-    0x7a,
-    0x83,
-    0x1e,
-    0x97,
-    0xff,
-    0x40,
-    0x41,
-    0x62,
-    0x45,
-    0xbd,
-    0x20,
-    0xff,
-    0xf6,
-    0x47,
-    0xe7,
-    0xc1,
-    0xb2,
-    0x53,
-    0x44,
-    0x6a,
-    0xbd,
-    0x64,
-    0xbd,
-    0x35,
-    0xf4,
-    0x2f,
-    0x46,
-    0x1a,
-    0x06,
-    0xfd,
-    0x13,
-    0x4d,
-    0xe0,
-    0x52,
-    0xab,
-    0x08,
-    0x69,
-    0xcc,
-    0x3e,
-    0x8a,
-    0x70,
-    0x4d,
-    0x38,
-    0x60,
-    0xe2,
-    0x5d,
-    0x16,
-    0xe3,
-    0x41,
-    0xc9,
-    0x78,
-    0x02,
-    0x51,
-    0x90,
-    0x78,
-    0x41,
-    0x15,
-    0x00,
-    0x3b,
-    0x02,
-    0xf9,
-    0x1d,
-    0xc5,
-    0x03,
-    0x51,
-    0x42,
-    0x12,
-    0x29,
-    0x02,
-    0x0b,
-    0x62,
-    0x7c,
-    0x7f,
-    0x71,
-    0xd4,
-    0x72,
-    0xf8,
-    0x37,
-    0x36,
-    0x70,
-    0xce,
-    0x86,
-    0x1c,
-    0x8e,
-    0x49,
-    0xd4,
-    0x2f,
-    0x9b,
-    0x8d,
-    0x0a,
-    0xc8,
-    0x61,
-    0xca,
-    0xe5,
-    0xbe,
-    0x29,
-    0xb4,
-    0x9c,
-    0x7c,
-    0x82,
-    0x33,
-    0xc4,
-    0x56,
-    0x3f,
-    0x5b,
-    0x71,
-    0x1d,
-    0xbf,
-    0x9e,
-    0x9f,
-    0xf0,
-    0x71,
-    0x40,
-    0xd0,
-    0x56,
-    0x96,
-    0x0c,
-    0xf6,
-    0x8a,
-    0x49,
-    0x46,
-    0x92,
-    0x16,
-    0xbd,
-    0xe0,
-    0x1e,
-    0xa3,
-    0xc7,
-    0xf0,
-    0xa9,
-    0x10,
-    0x9c,
-    0x62,
-    0xc1,
-    0xc1,
-    0xdb,
-    0xea,
-    0x95,
-    0x3a,
-    0xce,
-    0x3d,
-    0x5b,
-    0xec,
-    0xed,
-    0x81,
-    0xf0,
-    0x4e,
-    0xa3,
-    0x02,
-    0xbe,
-    0x30,
-    0x55,
-    0x26,
-    0xe3,
-    0x4d,
-    0xa1,
-    0xa3,
-    0x90,
-    0x1f,
-    0xe3,
-    0xef,
-    0xae,
-    0xf7,
-    0xfe,
-    0xf9,
-    0xc8,
-    0x4c,
-    0x59,
-    0x16,
-    0x25,
-    0x53,
-    0x27,
-    0x3e,
-    0x34,
-    0xd1,
-    0xec,
-    0x78,
-    0x2e,
-    0x2e,
-    0x3c,
-    0x93,
-    0xf6,
-    0xca,
-    0xc6,
-    0x17,
-    0x44,
-    0x94,
-    0x92,
-    0x7b,
-    0x02,
-    0xd8,
-    0x87,
-    0x98,
-    0xf6,
-    0x58,
-    0x30,
-    0x5e,
-    0xa2,
-    0x9f,
-    0xc0,
-    0xc6,
-    0x68,
-    0x92,
-    0x53,
-    0x07,
-    0xf2,
-    0x48,
-    0x76,
-    0x0d,
-    0xd1,
-    0x1b,
-    0xea,
-    0x27,
-    0x64,
-    0xff,
-    0xa5,
-    0x00,
-    0xfc,
-    0x13,
-    0x1a,
-    0xd0,
-    0x3d,
-    0x76,
-    0xba,
-    0xd3,
-    0xc8,
-    0x5c,
-    0xbb,
-    0xfb,
-    0x17,
-    0x61,
-    0x18,
-    0xe2,
-    0xa7,
-    0x1d,
-    0xd9,
-    0x02,
-    0x5d,
-    0xf8,
-    0x94,
-    0x28,
-    0x23,
-    0x3f,
-    0x34,
-    0x26,
-    0xd2,
-    0x78,
-    0xf9,
-    0xc8,
-    0x54,
-    0xf3,
-    0xc0,
-    0x0a,
-    0x0a,
-    0xa2,
-    0x85,
-    0x88,
-    0x6b,
-    0x2a,
-    0x26,
-    0x36,
-    0xee,
-    0x3a,
-    0x69,
-    0x51,
-    0x2a,
-    0x1c,
-    0x41,
-    0x96,
-    0x3c,
-    0x8a,
-    0x4d,
-    0xb1,
-    0x6a,
-    0xc2,
-    0xa2,
-    0xf8,
-    0x06,
-    0xdd,
-    0xca,
-    0x59,
-    0x94,
-    0x5c,
-    0x0c,
-    0x91,
-    0x2f,
-    0x04,
-    0xee,
-    0x9f,
-    0x28,
-    0xec,
-    0xf9,
-    0x79,
-    0xf1,
-    0xd4,
-    0xbc,
-    0xfd,
-    0x39,
-    0xb8,
-    0x14,
-    0x2a,
-    0x59,
-    0xa5,
-    0xaa,
-    0x90,
-    0xef,
-    0xcc,
-    0xbc,
-    0x05,
-    0xc8,
-    0xd5,
-    0x21,
-    0x9a,
-    0x04,
-    0x75,
-    0x87,
-    0xce,
-    0x74,
-    0x43,
-    0x00,
-    0x01,
-    0x47,
-    0xc7,
-    0xbd,
-    0x2b,
-    0xe6,
-    0xd4,
-    0x18,
-    0xcd,
-    0x1c,
-    0x18,
-    0xd8,
-    0x28,
-    0x7a,
-    0xf2,
-    0xb1,
-    0xae,
-    0xfa,
-    0x83,
-    0x0b,
-    0xb6,
-    0xe2,
-    0x08,
-    0x05,
-    0x73,
-    0xeb,
-    0x67,
-    0xb8,
-    0x27,
-    0xa3,
-    0x07,
-    0xc0,
-    0x94,
-    0x10,
-    0xe5,
-    0xf9,
-    0xb3,
-    0x96,
-    0xe5,
-    0x86,
-    0xa9,
-    0x1a,
-    0x66,
-    0x18,
-    0xf7,
-    0x68,
-    0x18,
-    0x6c,
-    0xf1,
-    0xd2,
-    0x12,
-    0x16,
-    0x71,
-    0x1a,
-    0x1f,
-    0x7e,
-    0xcc,
-    0x93,
-    0x59,
-    0x28,
-    0x05,
-    0x82,
-    0xfa,
-    0x38,
-    0x41,
-    0xca,
-    0x6e,
-    0x35,
-    0x7b,
-    0xc9,
-    0xad,
-    0x0d,
-    0x79,
-    0x7d,
-    0xc7,
-    0x59,
-    0xff,
-    0xeb,
-    0xc0,
-    0xe3,
-    0x42,
-    0xc1,
-    0x9f,
-    0x65,
-    0x9f,
-    0x3a,
-    0xc2,
-    0x94,
-    0x8d,
-    0x42,
-    0x74,
-    0x5d,
-    0xd1,
-    0xdb,
-    0xc2,
-    0x6f,
-    0xf1,
-    0xbf,
-    0x8a,
-    0xf9,
-    0xea,
-    0x46,
-    0xd4,
-    0xb5,
-    0x25,
-    0x8b,
-    0x65,
-    0x25,
-    0xa8,
-    0xca,
-    0x92,
-    0x1d,
-    0x8a,
-    0x0d,
-    0x53,
-    0x81,
-    0xa9,
-    0x08,
-    0x98,
-    0x50,
-    0x9f,
-    0x41,
-    0xe0,
-    0xe1,
-    0xf1,
-    0x74,
-    0x07,
-    0x6d,
-    0x8a,
-    0x35,
-    0x5f,
-    0xce,
-    0x68,
-    0xd7,
-    0x03,
-    0x86,
-    0x96,
-    0x8d,
-    0x68,
-    0x03,
-    0x5a,
-    0xcf,
-    0x35,
-    0x22,
-    0xaf,
-    0xff,
-    0x55,
-    0xf1,
-    0xf5,
-    0x4d,
-    0x4a,
-    0xb9,
-    0xe8,
-    0xd8,
-    0xc4,
-    0x3c,
-    0xcf,
-    0x15,
-    0x72,
-    0x3b,
-    0xf5,
-    0x75,
-    0x18,
-    0x3b,
-    0x5d,
-    0x42,
-    0xe2,
-    0x89,
-    0xb2,
-    0xca,
-    0xf8,
-    0x7c,
-    0x7d,
-    0xc0,
-    0x52,
-    0xfa,
-    0x9b,
-    0xdf,
-    0xce,
-    0x3d,
-    0xed,
-    0xd0,
-    0x7f,
-    0xd7,
-    0x51,
-    0x4e,
-    0x48,
-    0xf4,
-    0xd1,
-    0x88,
-    0xaa,
-    0xe0,
-    0x1b,
-    0xc7,
-    0xdb,
-    0xc9,
-    0x31,
-    0x50,
-    0x18,
-    0xc5,
-    0x62,
-    0x8c,
-    0x3b,
-    0x17,
-    0x79,
-    0x66,
-    0x90,
-    0xae,
-    0x34,
-    0xf5,
-    0xe5,
-    0xee,
-    0xf8,
-    0x5b,
-    0xe0,
-    0xb3,
-    0xc2,
-    0xed,
-    0x96,
-    0x93,
-    0x61,
-    0x94,
-    0x58,
-    0x64,
-    0xe3,
-    0x72,
-    0xd0,
-    0xfe,
-    0x4d,
-    0xc9,
-    0x4e,
-    0x42,
-    0x8f,
-    0x19,
-    0x5c,
-    0x5c,
-    0xb6,
-    0x89,
-    0x98,
-    0x44,
-    0x64,
-    0x88,
-    0xc3,
-    0x8b,
-    0x7d,
-    0xb4,
-    0x15,
-    0x54,
-    0x24,
-    0xfb,
-    0xd3,
-    0xa1,
-    0xe6,
-    0x00,
-    0x24,
-    0xd0,
-    0x34,
-    0xc0,
-    0x21,
-    0x65,
-    0x17,
-    0x75,
-    0x2b,
-    0x09,
-    0x1f,
-    0xbb,
-    0x81,
-    0xd3,
-    0x9d,
-    0xf1,
-    0x11,
-    0xc7,
-    0x11,
-    0xe2,
-    0x8f,
-    0x9c,
-    0xe6,
-    0xa4,
-    0xc5,
-    0xc3,
-    0x5d,
-    0xc1,
-    0x2a,
-    0xa4,
-    0xc8,
-    0x95,
-    0xb5,
-    0x2b,
-    0xf8,
-    0xf7,
-    0xf3,
-    0x83,
-    0xf8,
-    0x1c,
-    0x58,
-    0x21,
-    0xfc,
-    0xb7,
-    0xd3,
-    0x05,
-    0x94,
-    0x65,
-    0xa4,
-    0x3c,
-    0x25,
-    0x49,
-    0x72,
-    0xaa,
-    0x9a,
-    0xf3,
-    0x98,
-    0x06,
-    0x57,
-    0x87,
-    0xc1,
-    0x26,
-    0x6e,
-    0x1b,
-    0xb4,
-    0x7d,
-    0x16,
-    0x60,
-    0x71,
-    0xe2,
-    0x59,
-    0x85,
-    0x7c,
-    0x92,
-    0x0c,
-    0x58,
-    0x79,
-    0x79,
-    0x04,
-    0xaf,
-    0xf9,
-    0xad,
-    0x87,
-    0x06,
-    0x94,
-    0x3c,
-    0x01,
-    0x69,
-    0x38,
-    0x27,
-    0xf8,
-    0x95,
-    0xc0,
-    0xae,
-    0x42,
-    0x5a,
-    0xc8,
-    0xce,
-    0x76,
-    0x43,
-    0xc0,
-    0x09,
-    0xa0,
-    0x79,
-    0x40,
-    0x65,
-    0x39,
-    0xe5,
-    0x9b,
-    0xb7,
-    0x56,
-    0x95,
-    0xb7,
-    0x21,
-    0x1f,
-    0x61,
-    0x1c,
-    0xda,
-    0x83,
-    0xce,
-    0x4a,
-    0x2d,
-    0x2a,
-    0x32,
-    0x50,
-    0xc5,
-    0xab,
-    0x19,
-    0x9a,
-    0x27,
-    0x00,
-    0xe8,
-    0x0b,
-    0x80,
-    0x37,
-    0xc0,
-    0x4c,
-    0xa1,
-    0x69,
-    0xa5,
-    0x63,
-    0x48,
-    0xf0,
-    0xe0,
-    0x87,
-    0xa1,
-    0xd5,
-    0xa1,
-    0x32,
-    0x0c,
-    0x88,
-    0xe9,
-    0x79,
-    0x21,
-    0xd4,
-    0xa7,
-    0x99,
-    0xf1,
-    0x11,
-    0x22,
-    0xd2,
-    0x8f,
-    0x9c,
-    0x96,
-    0x78,
-    0xd0,
-    0x84,
-    0x22,
-    0x47,
-    0x4e,
-    0x86,
-    0xe1,
-    0xf7,
-    0xb3,
-    0x3c,
-    0x58,
-    0x10,
-    0x34,
-    0x91,
-    0x10,
-    0x00,
-    0x5b,
-    0x78,
-    0x83,
-    0x6a,
-    0x0a,
-    0xde,
-    0x3d,
-    0xc2,
-    0xbd,
-    0xdc,
-    0x3b,
-    0x17,
-    0x0f,
-    0x32,
-    0x97,
-    0x2f,
-    0x80,
-    0xf1,
-    0x67,
-    0xd9,
-    0x75,
-    0x77,
-    0xe2,
-    0x7f,
-    0x80,
-    0xa0,
-    0xc4,
-    0xfb,
-    0xe2,
-    0x3b,
-    0xf4,
-    0xab,
-    0x4e,
-    0xbb,
-    0x64,
-    0xc8,
-    0xf0,
-    0x2f,
-    0x39,
-    0xf3,
-    0xae,
-    0x75,
-    0x2d,
-    0x11,
-    0xae,
-    0xaa,
-    0x31,
-    0x59,
-    0x18,
-    0xe4,
-    0x56,
-    0xab,
-    0x1d,
-    0x24,
-    0xed,
-    0x24,
-    0x38,
-    0x86,
-    0xed,
-    0xef,
-    0xb3,
-    0xbb,
-    0x96,
-    0x5e,
-    0x6e,
-    0xb9,
-    0x54,
-    0x39,
-    0xdc,
-    0xb1,
-    0xe6,
-    0x56,
-    0x4e,
-    0x42,
-    0xbf,
-    0x69,
-    0x74,
-    0xec,
-    0xad,
-    0x1e,
-    0x20,
-    0xc7,
-    0xb8,
-    0x65,
-    0x4e,
-    0x75,
-    0x4d,
-    0x0d,
-    0x62,
-    0x55,
-    0x9c,
-    0x95,
-    0xb0,
-    0xf9,
-    0x3e,
-    0x3f,
-    0x41,
-    0xdb,
-    0x1b,
-    0x65,
-    0xd4,
-    0x4b,
-    0x8b,
-    0x10,
-    0x24,
-    0xac,
-    0xbb,
-    0xc7,
-    0x69,
-    0xe0,
-    0x53,
-    0xa5,
-    0x21,
-    0x01,
-    0x55,
-    0xaf,
-    0x10,
-    0x52,
-    0x48,
-    0x64,
-    0x86,
-    0x75,
-    0x97,
-    0x95,
-    0xe0,
-    0xde,
-    0x34,
-    0x76,
-    0x51,
-    0x87,
-    0x80,
-    0xf6,
-    0xe3,
-    0xe5,
-    0x6f,
-    0x4c,
-    0xb8,
-    0x1c,
-    0xe7,
-    0xd2,
-    0x96,
-    0x6f,
-    0x6a,
-    0x17,
-    0xa3,
-    0xfa,
-    0xf5,
-    0x2f,
-    0x6c,
-    0xa3,
-    0x28,
-    0x4e,
-    0x2c,
-    0x4e,
-    0xa6,
-    0x96,
-    0x4c,
-    0x50,
-    0xbf,
-    0x2c,
-    0x26,
-    0x26,
-    0x4d,
-    0x91,
-    0x0e,
-    0x68,
-    0xdb,
-    0x30,
-    0x93,
-    0xf8,
-    0x0d,
-    0x33,
-    0x02,
-    0x7f,
-    0x3c,
-    0x9b,
-    0x2c,
-    0x1a,
-    0x60,
-    0x90,
-    0x69,
-    0x50,
-    0x33,
-    0xf5,
-    0xdd,
-    0x48,
-    0x93,
-    0x40,
-    0xfa,
-    0x38,
-    0x28,
-    0x89,
-    0x46,
-    0x21,
-    0x48,
-    0xe0,
-    0x5f,
-    0xba,
-    0x17,
-    0xe4,
-    0x3c,
-    0xa9,
-    0xf3,
-    0x92,
-    0xb5,
-    0xf9,
-    0x0f,
-    0x5a,
-    0x46,
-    0xc9,
-    0x5d,
-    0x78,
-    0x10,
-    0x41,
-    0xb2,
-    0x81,
-    0x20,
-    0xcb,
-    0x25,
-    0x3c,
-    0xf4,
-    0x7f,
-    0xb8,
-    0xb4,
-    0x3b,
-    0xde,
-    0x3a,
-    0x8b,
-    0xdd,
-    0xc4,
-    0x6b,
-    0x91,
-    0x3b,
-    0x98,
-    0x62,
-    0x95,
-    0xb8,
-    0xc6,
-    0x2c,
-    0x7c,
-    0x78,
-    0x6f,
-    0xb6,
-    0x90,
-    0x68,
-    0x5f,
-    0xec,
-    0x1a,
-    0x7e,
-    0x3f,
-    0x23,
-    0x32,
-    0x42,
-    0x0b,
-    0xb4,
-    0xd6,
-    0x8d,
-    0xc7,
-    0xea,
-    0x3a,
-    0x90,
-    0x6e,
-    0x1f,
-    0x5f,
-    0x19,
-    0x2c,
-    0x21,
-    0xe7,
-    0x12,
-    0xcc,
-    0xdb,
-    0x28,
-    0x4a,
-    0x74,
-    0x31,
-    0x7f,
-    0x79,
-    0x90,
-    0x2b,
-    0xe6,
-    0x7e,
-    0x0c,
-    0x56,
-    0xc9,
-    0xea,
-    0xc6,
-    0x67,
-    0x16,
-    0xc2,
-    0x43,
-    0x22,
-    0x94,
-    0x81,
-    0xa1,
-    0x7a,
-    0x75,
-    0x5d,
-    0xcc,
-    0xfa,
-    0x2e,
-    0xcb,
-    0xf5,
-    0x63,
-    0x86,
-    0x45,
-    0x40,
-    0x97,
-    0xed,
-    0x4b,
-    0xbd,
-    0xb5,
-    0x10,
-    0xa8,
-    0x9a,
-    0x86,
-    0xaa,
-    0xf6,
-    0x97,
-    0x18,
-    0x9d,
-    0x64,
-    0xb9,
-    0xa8,
-    0x41,
-    0xb7,
-    0x43,
-    0xc5,
-    0xfc,
-    0x8f,
-    0xe2,
-    0xb3,
-    0x13,
-    0xec,
-    0x28,
-    0x0e,
-    0xbf,
-    0xf0,
-    0x3b,
-    0xaf,
-    0x84,
-    0xe7,
-    0xcf,
-    0xd4,
-    0xbe,
-    0x84,
-    0x51,
-    0x7a,
-    0x7d,
-    0x6d,
-    0x65,
-    0x0e,
-    0x92,
-    0xfb,
-    0x93,
-    0x45,
-    0xea,
-    0x3a,
-    0x3d,
-    0x49,
-    0x1b,
-    0x38,
-    0xd5,
-    0x15,
-    0x3d,
-    0x7c,
-    0x4d,
-    0x22,
-    0xfb,
-    0xd4,
-    0xce,
-    0x43,
-    0xe9,
-    0x54,
-    0xac,
-    0xcd,
-    0x19,
-    0x9b,
-    0x9a,
-    0xfc,
-    0xe9,
-    0x58,
-    0x1a,
-    0x92,
-    0x1e,
-    0x0d,
-    0x38,
-    0xc1,
-    0x37,
-    0x13,
-    0x78,
-    0x4b,
-    0xfb,
-    0xdf,
-    0x0d,
-    0xe8,
-    0x55,
-    0x83,
-    0x4b,
-    0xe8,
-    0x61,
-    0x77,
-    0x5f,
-    0x19,
-    0xc7,
-    0x9a,
-    0x3e,
-    0xeb,
-    0x48,
-    0x74,
-    0xdb,
-    0xd2,
-    0x96,
-    0xbe,
-    0x9d,
-    0xec,
-    0x69,
-    0x24,
-    0x10,
-    0xe4,
-    0xcf,
-    0x49,
-    0xdb,
-    0x16,
-    0xc3,
-    0x0c,
-    0xf2,
-    0xf4,
-    0x02,
-    0x0a,
-    0x0c,
-    0xa8,
-    0x1a,
-    0x63,
-    0x58,
-    0xfb,
-    0xc4,
-    0xc2,
-    0x6b,
-    0x75,
-    0x73,
-    0x97,
-    0x7d,
-    0xc5,
-    0x2d,
-    0xa7,
-    0xd6,
-    0x64,
-    0x9a,
-    0xc7,
-    0x83,
-    0x76,
-    0x5b,
-    0xe4,
-    0x4d,
-    0xf1,
-    0x9c,
-    0x47,
-    0xec,
-    0x00,
-    0xed,
-    0x17,
-    0x77,
-    0xaa,
-    0x4d,
-    0x20,
-    0x1f,
-    0xaf,
-    0x88,
-    0xd2,
-    0x1d,
-    0xb2,
-    0xc4,
-    0x8d,
-    0xe9,
-    0x9d,
-    0x56,
-    0x1c,
-    0xad,
-    0x42,
-    0xda,
-    0x7f,
-    0xf9,
-    0x3e,
-    0x82,
-    0xed,
-    0xb8,
-    0x23,
-    0xae,
-    0x19,
-    0x63,
-    0xd6,
-    0xbd,
-    0xb5,
-    0x74,
-    0x35,
-    0x23,
-    0x34,
-    0x1e,
-    0xfd,
-    0xbc,
-    0xd5,
-    0x3b,
-    0xeb,
-    0x61,
-    0xdd,
-    0x86,
-    0x22,
-    0xb8,
-    0x23,
-    0x0a,
-    0xcd,
-    0x50,
-    0xd2,
-    0xda,
-    0x05,
-    0xed,
-    0x6b,
-    0x03,
-    0xf5,
-    0x20,
-    0x09,
-    0xbf,
-    0x3c,
-    0x1b,
-    0xe9,
-    0xeb,
-    0x92,
-    0xc4,
-    0x29,
-    0xbb,
-    0xaf,
-    0x08,
-    0xd0,
-    0xad,
-    0x69,
-    0x72,
-    0x0f,
-    0xbb,
-    0x1c,
-    0xfc,
-    0xc7,
-    0xd5,
-    0x4e,
-    0x25,
-    0x4a,
-    0x8e,
-    0x93,
-    0x43,
-    0x66,
-    0x16,
-    0xaf,
-    0x1b,
-    0xa0,
-    0x68,
-    0xfb,
-    0xaf,
-    0xbd,
-    0xc4,
-    0x0a,
-    0x57,
-    0x87,
-    0x60,
-    0x8b,
-    0x13,
-    0xcd,
-    0x5b,
-    0x71,
-    0x20,
-    0xac,
-    0xf2,
-    0x52,
-    0xc9,
-    0x0d,
-    0xf6,
-    0x0d,
-    0x80,
-    0x6f,
-    0x7d,
-    0xb0,
-    0x2d,
-    0xe7,
-    0xd9,
-    0x99,
-    0xc6,
-    0x64,
-    0xc6,
-    0xdb,
-    0x20,
-    0x38,
-    0xe7,
-    0xe3,
-    0x05,
-    0xd4,
-    0x74,
-    0x5b,
-    0x86,
-    0xd3,
-    0x2d,
-    0x4e,
-    0x92,
-    0x3b,
-    0x92,
-    0x8d,
-    0xc8,
-    0xff,
-    0x55,
-    0x52,
-    0x8a,
-    0xc8,
-    0x10,
-    0x24,
-    0x53,
-    0xf4,
-    0x34,
-    0xfa,
-    0x4a,
-    0xdf,
-    0x41,
-    0xa3,
-    0x17,
-    0x62,
-    0x3d,
-    0x65,
-    0xf5,
-    0x9a,
-    0x5f,
-    0xe5,
-    0x08,
-    0xeb,
-    0x0b,
-    0x46,
-    0xf2,
-    0x44,
-    0x03,
-    0x95,
-    0xa1,
-    0xa4,
-    0xdb,
-    0x65,
-    0x6a,
-    0xdd,
-    0xad,
-    0xb6,
-    0x5c,
-    0x98,
-    0x0f,
-    0x1c,
-    0xce,
-    0x99
-  ],
-  const [
-    0x04,
-    0xc8,
-    0x73,
-    0xc0,
-    0x5d,
-    0xaf,
-    0x29,
-    0x99,
-    0x23,
-    0xa2,
-    0xbf,
-    0xce,
-    0xe1,
-    0x93,
-    0xaa,
-    0x10,
-    0x4f,
-    0xe9,
-    0x07,
-    0x17,
-    0x19,
-    0x30,
-    0x83,
-    0xf1,
-    0xe2,
-    0x0f,
-    0x79,
-    0x9a,
-    0x89,
-    0x7a,
-    0x5b,
-    0xcc,
-    0xab,
-    0x28,
-    0x53,
-    0x18,
-    0x69,
-    0x48,
-    0x2a,
-    0x36,
-    0x6b,
-    0x70,
-    0x68,
-    0x9a,
-    0x24,
-    0xd6,
-    0xbd,
-    0x47,
-    0x58,
-    0xc2,
-    0x9f,
-    0xe8,
-    0xdc,
-    0x43,
-    0x35,
-    0x1d,
-    0x9e,
-    0x22,
-    0x74,
-    0x13,
-    0xe5,
-    0x14,
-    0x88,
-    0x57,
-    0xd9,
-    0x33,
-    0x75,
-    0xec,
-    0x45,
-    0xaf,
-    0xfe,
-    0x9b,
-    0x9c,
-    0xc1,
-    0xc6,
-    0x8a,
-    0x3a,
-    0xe1,
-    0xb5,
-    0x10,
-    0xed,
-    0x39,
-    0x9d,
-    0xc8,
-    0xb4,
-    0x59,
-    0x1d,
-    0xe4,
-    0xc6,
-    0x2c,
-    0xc6,
-    0xc4,
-    0xd6,
-    0x2b,
-    0x7d,
-    0xc8,
-    0x96,
-    0xd0,
-    0x20,
-    0x62,
-    0x7a,
-    0x4e,
-    0x6d,
-    0x6f,
-    0xbe,
-    0x7f,
-    0x1f,
-    0xc7,
-    0xaa,
-    0x1e,
-    0x59,
-    0x12,
-    0x15,
-    0x36,
-    0x48,
-    0xde,
-    0x28,
-    0xda,
-    0x05,
-    0xef,
-    0x64,
-    0x17,
-    0xb8,
-    0xd6,
-    0xe6,
-    0x27,
-    0x03,
-    0xc6,
-    0xea,
-    0xe7,
-    0x9e,
-    0xa2,
-    0x8f,
-    0x8c,
-    0x3e,
-    0x5a,
-    0xda,
-    0x91,
-    0xbc,
-    0x78,
-    0xfc,
-    0xf3,
-    0x73,
-    0xf6,
-    0xd8,
-    0xa1,
-    0xea,
-    0x53,
-    0xc0,
-    0x2e,
-    0xb3,
-    0xe6,
-    0x7f,
-    0xca,
-    0x92,
-    0x71,
-    0x9d,
-    0x70,
-    0xe2,
-    0xf9,
-    0xde,
-    0x61,
-    0x35,
-    0xd5,
-    0x0c,
-    0xd0,
-    0x3b,
-    0x06,
-    0xf6,
-    0xdf,
-    0xe5,
-    0xc6,
-    0xb9,
-    0xca,
-    0xc9,
-    0x63,
-    0x3e,
-    0x62,
-    0xc9,
-    0x4e,
-    0x04,
-    0xbe,
-    0xef,
-    0x6f,
-    0x20,
-    0x2d,
-    0x9c,
-    0xbc,
-    0x82,
-    0x6e,
-    0xe2,
-    0x0a,
-    0x79,
-    0x24,
-    0x2e,
-    0x23,
-    0x7a,
-    0x84,
-    0x2a,
-    0x18,
-    0x1d,
-    0x51,
-    0xe1,
-    0xd9,
-    0x68,
-    0x0a,
-    0x25,
-    0x02,
-    0x50,
-    0x62,
-    0x2d,
-    0xf8,
-    0x7d,
-    0xf0,
-    0x83,
-    0x35,
-    0x4e,
-    0x28,
-    0x1e,
-    0xe0,
-    0x1d,
-    0x8a,
-    0xca,
-    0xa1,
-    0xc4,
-    0x19,
-    0xd1,
-    0xb3,
-    0x5f,
-    0x0f,
-    0xd4,
-    0x3b,
-    0x54,
-    0xcf,
-    0xfa,
-    0xd8,
-    0x91,
-    0x1b,
-    0x4d,
-    0x7b,
-    0x15,
-    0x87,
-    0x60,
-    0x79,
-    0xb2,
-    0x2d,
-    0x35,
-    0xde,
-    0x11,
-    0xa3,
-    0x5f,
-    0x05,
-    0xf6,
-    0x2a,
-    0x64,
-    0x65,
-    0xc5,
-    0x28,
-    0x65,
-    0xae,
-    0x46,
-    0xd9,
-    0x01,
-    0x15,
-    0xa5,
-    0x41,
-    0x76,
-    0xeb,
-    0xbd,
-    0x65,
-    0x09,
-    0x75,
-    0x95,
-    0xba,
-    0xa9,
-    0xf8,
-    0x2b,
-    0xde,
-    0xcf,
-    0x13,
-    0x71,
-    0x86,
-    0xa8,
-    0x51,
-    0x96,
-    0xb8,
-    0x76,
-    0xff,
-    0x86,
-    0x3a,
-    0x34,
-    0x3b,
-    0xb4,
-    0x4a,
-    0x78,
-    0x4e,
-    0x17,
-    0x8f,
-    0x9e,
-    0x3c,
-    0x72,
-    0x50,
-    0x23,
-    0x99,
-    0xd9,
-    0xe4,
-    0x4f,
-    0x9d,
-    0x71,
-    0x69,
-    0x17,
-    0x7b,
-    0x77,
-    0xb9,
-    0x41,
-    0xef,
-    0x84,
-    0x9a,
-    0xc9,
-    0x16,
-    0x0f,
-    0x35,
-    0x84,
-    0x83,
-    0x33,
-    0xca,
-    0x03,
-    0x8f,
-    0xb2,
-    0xa1,
-    0xba,
-    0xf0,
-    0x3b,
-    0x44,
-    0x61,
-    0x8e,
-    0xe8,
-    0xeb,
-    0x9b,
-    0x92,
-    0x0b,
-    0x38,
-    0xd6,
-    0xbf,
-    0x2a,
-    0x24,
-    0x72,
-    0x05,
-    0x48,
-    0x3a,
-    0x25,
-    0x53,
-    0x66,
-    0x03,
-    0x9e,
-    0xae,
-    0x4a,
-    0xc1,
-    0x68,
-    0x80,
-    0x7f,
-    0x5f,
-    0x12,
-    0x32,
-    0x9d,
-    0xa9,
-    0x8d,
-    0xfc,
-    0xcb,
-    0xb9,
-    0xd5,
-    0xfc,
-    0x81,
-    0xb1,
-    0xd3,
-    0x86,
-    0x93,
-    0xb0,
-    0x83,
-    0xbc,
-    0x6b,
-    0xfe,
-    0x52,
-    0x5e,
-    0x95,
-    0x8a,
-    0xca,
-    0xe3,
-    0x82,
-    0x97,
-    0x70,
-    0xc8,
-    0x85,
-    0xb2,
-    0xed,
-    0x28,
-    0x22,
-    0xe7,
-    0x6d,
-    0x8d,
-    0x88,
-    0x34,
-    0x45,
-    0x06,
-    0x5c,
-    0x3e,
-    0xd8,
-    0x79,
-    0xb8,
-    0x43,
-    0xbb,
-    0x3b,
-    0x74,
-    0x50,
-    0x17,
-    0xde,
-    0xa4,
-    0xb4,
-    0x4f,
-    0x4a,
-    0x61,
-    0xb4,
-    0xe3,
-    0x0f,
-    0xcd,
-    0x80,
-    0x95,
-    0xfa,
-    0x51,
-    0x66,
-    0xca,
-    0xe7,
-    0x29,
-    0x46,
-    0x32,
-    0xd5,
-    0x23,
-    0x46,
-    0xab,
-    0x40,
-    0xa3,
-    0xc6,
-    0x63,
-    0xab,
-    0xeb,
-    0x97,
-    0x3d,
-    0x7c,
-    0x99,
-    0x67,
-    0x77,
-    0x0c,
-    0x71,
-    0x80,
-    0x89,
-    0xff,
-    0x5d,
-    0xb3,
-    0x50,
-    0xd1,
-    0xb2,
-    0x8e,
-    0x6b,
-    0xb2,
-    0xb5,
-    0xd6,
-    0xe6,
-    0x94,
-    0x5e,
-    0x31,
-    0x15,
-    0x82,
-    0x5c,
-    0x22,
-    0xc3,
-    0x33,
-    0x58,
-    0x3a,
-    0x8d,
-    0xdf,
-    0x7e,
-    0x8d,
-    0x88,
-    0x51,
-    0x3a,
-    0x64,
-    0x2a,
-    0x3e,
-    0x3f,
-    0x31,
-    0x67,
-    0xd5,
-    0xce,
-    0xc8,
-    0x1a,
-    0x97,
-    0x35,
-    0xcb,
-    0xa7,
-    0x69,
-    0x96,
-    0x66,
-    0xde,
-    0xe7,
-    0xe9,
-    0x3d,
-    0x23,
-    0xfc,
-    0x44,
-    0xa3,
-    0xcc,
-    0xaf,
-    0x5a,
-    0x0d,
-    0xcb,
-    0x40,
-    0x43,
-    0xc6,
-    0x8d,
-    0x74,
-    0x7b,
-    0xe4,
-    0x22,
-    0x2d,
-    0x2c,
-    0x7a,
-    0x9d,
-    0x3d,
-    0xb0,
-    0x0f,
-    0xbe,
-    0x7c,
-    0x51,
-    0x4f,
-    0xce,
-    0x19,
-    0x54,
-    0x01,
-    0xcb,
-    0x2d,
-    0x37,
-    0x39,
-    0xc5,
-    0x96,
-    0x36,
-    0xcf,
-    0x88,
-    0x02,
-    0x14,
-    0x0f,
-    0x7b,
-    0x4a,
-    0x17,
-    0xb2,
-    0xc8,
-    0x02,
-    0x55,
-    0x0e,
-    0xbd,
-    0x4e,
-    0x2e,
-    0x89,
-    0x73,
-    0xf6,
-    0x1a,
-    0x53,
-    0xad,
-    0xbd,
-    0xa5,
-    0x55,
-    0x02,
-    0xef,
-    0xb7,
-    0x64,
-    0x3f,
-    0x3a,
-    0x19,
-    0xbb,
-    0x07,
-    0xbe,
-    0x35,
-    0xa8,
-    0xbc,
-    0x67,
-    0x1d,
-    0x85,
-    0xa3,
-    0x7b,
-    0xcf,
-    0xea,
-    0x42,
-    0x6f,
-    0xb8,
-    0x21,
-    0x0d,
-    0xff,
-    0x76,
-    0xda,
-    0x42,
-    0x7e,
-    0xe2,
-    0x20,
-    0x12,
-    0x6a,
-    0x4e,
-    0x8c,
-    0x01,
-    0x43,
-    0x0b,
-    0xb9,
-    0x8f,
-    0x9d,
-    0x2f,
-    0xf7,
-    0x18,
-    0x75,
-    0x94,
-    0x44,
-    0xf9,
-    0xc1,
-    0x24,
-    0x78,
-    0xf4,
-    0x4a,
-    0x54,
-    0xbf,
-    0xd6,
-    0xbe,
-    0xef,
-    0x4c,
-    0x56,
-    0x01,
-    0x15,
-    0x4c,
-    0x41,
-    0xc5,
-    0x83,
-    0x19,
-    0xd4,
-    0x5a,
-    0x15,
-    0xb1,
-    0x69,
-    0xc7,
-    0x88,
-    0x66,
-    0x57,
-    0x19,
-    0x85,
-    0xd7,
-    0x13,
-    0xfb,
-    0xdb,
-    0x1e,
-    0x9b,
-    0x87,
-    0x0d,
-    0x4b,
-    0x14,
-    0x5c,
-    0x0c,
-    0x12,
-    0xb1,
-    0xf1,
-    0x45,
-    0xc0,
-    0xd8,
-    0x29,
-    0xde,
-    0x73,
-    0x80,
-    0x27,
-    0x3d,
-    0x8b,
-    0xde,
-    0x63,
-    0xcb,
-    0x5c,
-    0x40,
-    0xfd,
-    0xf7,
-    0x25,
-    0x39,
-    0x52,
-    0x7d,
-    0x46,
-    0xfe,
-    0xce,
-    0xe8,
-    0xad,
-    0x10,
-    0x01,
-    0x55,
-    0x92,
-    0x1b,
-    0xf4,
-    0x7b,
-    0x64,
-    0x1e,
-    0xbd,
-    0xe8,
-    0x03,
-    0xcd,
-    0x51,
-    0x8d,
-    0x2f,
-    0x34,
-    0x9a,
-    0x7d,
-    0x41,
-    0x9c,
-    0xc9,
-    0xf2,
-    0x18,
-    0xb2,
-    0xee,
-    0x91,
-    0x57,
-    0xe6,
-    0xc5,
-    0xef,
-    0xce,
-    0x12,
-    0xd3,
-    0x53,
-    0x35,
-    0x5c,
-    0xb2,
-    0xbe,
-    0x20,
-    0x5d,
-    0xaa,
-    0x28,
-    0x2f,
-    0x83,
-    0x81,
-    0x0d,
-    0x85,
-    0xb3,
-    0x93,
-    0x28,
-    0x7c,
-    0x33,
-    0x25,
-    0x7f,
-    0x97,
-    0xc8,
-    0xf6,
-    0x9f,
-    0xb9,
-    0x1b,
-    0x17,
-    0x29,
-    0x94,
-    0x61,
-    0xfd,
-    0x8d,
-    0x63,
-    0x3b,
-    0xd5,
-    0x16,
-    0xdc,
-    0xdb,
-    0x17,
-    0x27,
-    0x60,
-    0x69,
-    0x5e,
-    0xc4,
-    0x76,
-    0xa5,
-    0x77,
-    0x53,
-    0x77,
-    0xcd,
-    0xb7,
-    0xa4,
-    0x8b,
-    0xc1,
-    0x92,
-    0x30,
-    0xd3,
-    0x65,
-    0x6a,
-    0x9e,
-    0xe8,
-    0x47,
-    0xa5,
-    0x8c,
-    0x85,
-    0x82,
-    0x02,
-    0x8b,
-    0x80,
-    0xe2,
-    0x2d,
-    0x6b,
-    0xff,
-    0x48,
-    0x91,
-    0xba,
-    0xe8,
-    0x50,
-    0x6d,
-    0x87,
-    0x99,
-    0x32,
-    0x2a,
-    0x6b,
-    0xda,
-    0xe6,
-    0xec,
-    0xcb,
-    0x0f,
-    0x8c,
-    0x67,
-    0x57,
-    0xb3,
-    0x0a,
-    0xf4,
-    0xd6,
-    0x01,
-    0xf7,
-    0xe3,
-    0x26,
-    0xf4,
-    0xb8,
-    0x13,
-    0x7e,
-    0x72,
-    0xe8,
-    0xc1,
-    0xf7,
-    0xc4,
-    0xfe,
-    0x9e,
-    0x4b,
-    0x4a,
-    0x29,
-    0x24,
-    0xdc,
-    0x6d,
-    0x7f,
-    0x29,
-    0xf8,
-    0xd4,
-    0x57,
-    0xb5,
-    0x5b,
-    0xdb,
-    0xf3,
-    0x11,
-    0xf5,
-    0x41,
-    0x63,
-    0x20,
-    0xee,
-    0x20,
-    0xa5,
-    0xf2,
-    0xe8,
-    0x23,
-    0x11,
-    0x97,
-    0x84,
-    0xf3,
-    0xf5,
-    0x31,
-    0x27,
-    0xf2,
-    0x7c,
-    0x4d,
-    0xfe,
-    0x2c,
-    0xd4,
-    0x74,
-    0x3f,
-    0x8b,
-    0x8f,
-    0xfc,
-    0xb2,
-    0x4a,
-    0x4a,
-    0x24,
-    0x71,
-    0xab,
-    0x8d,
-    0x61,
-    0xec,
-    0xed,
-    0xf3,
-    0xf2,
-    0x2f,
-    0x78,
-    0x8b,
-    0xba,
-    0x68,
-    0x5c,
-    0x7d,
-    0x4f,
-    0xa3,
-    0xf9,
-    0xf1,
-    0x4f,
-    0xd9,
-    0xff,
-    0x2c,
-    0xf3,
-    0x29,
-    0x9a,
-    0xfc,
-    0xe6,
-    0x65,
-    0xe6,
-    0x57,
-    0x57,
-    0xd0,
-    0xa9,
-    0x3f,
-    0x4d,
-    0x26,
-    0x41,
-    0xe8,
-    0x3a,
-    0xdd,
-    0xdb,
-    0x1d,
-    0xd4,
-    0xab,
-    0xe6,
-    0xe0,
-    0x20,
-    0x48,
-    0xc8,
-    0x51,
-    0xcf,
-    0x75,
-    0xcf,
-    0xd1,
-    0xce,
-    0x3d,
-    0x6a,
-    0x66,
-    0x19,
-    0x7b,
-    0x99,
-    0x61,
-    0xd0,
-    0x9c,
-    0xa2,
-    0x3f,
-    0x8c,
-    0xa6,
-    0x06,
-    0xce,
-    0xf3,
-    0x79,
-    0xb3,
-    0x91,
-    0x8a,
-    0x56,
-    0x7b,
-    0x64,
-    0xcb,
-    0x9d,
-    0xc5,
-    0x63,
-    0x78,
-    0xdb,
-    0x82,
-    0x09,
-    0x2e,
-    0x03,
-    0x63,
-    0x95,
-    0x3d,
-    0xfc,
-    0x49,
-    0xb2,
-    0xb7,
-    0x5c,
-    0xfe,
-    0x56,
-    0xc7,
-    0x74,
-    0x22,
-    0xeb,
-    0x44,
-    0x8c,
-    0x68,
-    0xad,
-    0x86,
-    0x6f,
-    0x02,
-    0x53,
-    0x79,
-    0x2b,
-    0x59,
-    0xf1,
-    0xef,
-    0x12,
-    0x02,
-    0x1d,
-    0x3b,
-    0x04,
-    0xed,
-    0x51,
-    0xfb,
-    0xf1,
-    0xe0,
-    0x90,
-    0x35,
-    0x99,
-    0x24,
-    0x4c,
-    0xa6,
-    0x96,
-    0x7f,
-    0x88,
-    0x56,
-    0x9d,
-    0x62,
-    0x3a,
-    0x70,
-    0x01,
-    0x62,
-    0xf3,
-    0x51,
-    0x78,
-    0xec,
-    0xc1,
-    0xdf,
-    0x22,
-    0x35,
-    0x55,
-    0x1c,
-    0xc7,
-    0x71,
-    0x61,
-    0xfb,
-    0x61,
-    0x45,
-    0x44,
-    0x72,
-    0xda,
-    0x7e,
-    0xe9,
-    0xd0,
-    0x16,
-    0x03,
-    0xec,
-    0x51,
-    0x34,
-    0x08,
-    0xff,
-    0xef,
-    0x11,
-    0x85,
-    0x8d,
-    0x7c,
-    0x0e,
-    0xe7,
-    0x9d,
-    0xee,
-    0x14,
-    0x05,
-    0xf8,
-    0xfa,
-    0xd5,
-    0x55,
-    0x8e,
-    0xe4,
-    0x54,
-    0x60,
-    0x16,
-    0x95,
-    0xa7,
-    0x73,
-    0xf5,
-    0xee,
-    0xfb,
-    0x98,
-    0x61,
-    0x5c,
-    0xda,
-    0xc4,
-    0xc6,
-    0xac,
-    0xa9,
-    0x52,
-    0x68,
-    0x21,
-    0x75,
-    0xb0,
-    0x4b,
-    0xc4,
-    0xef,
-    0x59,
-    0x50,
-    0xfc,
-    0xb4,
-    0x03,
-    0xa0,
-    0x5e,
-    0xd2,
-    0x19,
-    0x4d,
-    0xc6,
-    0x88,
-    0x6b,
-    0x37,
-    0xa7,
-    0x4e,
-    0x25,
-    0x2d,
-    0x9f,
-    0x15,
-    0xfd,
-    0x55,
-    0x4f,
-    0xd0,
-    0xb1,
-    0xce,
-    0x69,
-    0x33,
-    0xb1,
-    0x93,
-    0x0a,
-    0xbb,
-    0x18,
-    0xa3,
-    0x4b,
-    0xee,
-    0xe1,
-    0x5f,
-    0x13,
-    0xe4,
-    0x58,
-    0x33,
-    0x2f,
-    0x06,
-    0xce,
-    0x78,
-    0xa4,
-    0x16,
-    0x91,
-    0x99,
-    0x43,
-    0x70,
-    0x1c,
-    0x75,
-    0x7f,
-    0x8f,
-    0x8a,
-    0x05,
-    0x7c,
-    0xd2,
-    0x51,
-    0x3f,
-    0x68,
-    0x80,
-    0x2c,
-    0x3a,
-    0x0e,
-    0x0b,
-    0x59,
-    0x92,
-    0xa8,
-    0x91,
-    0x05,
-    0x0e,
-    0xf5,
-    0xa8,
-    0x05,
-    0x80,
-    0x8c,
-    0x5b,
-    0xc6,
-    0xed,
-    0x70,
-    0x70,
-    0x87,
-    0xee,
-    0xe4,
-    0xed,
-    0xc5,
-    0x56,
-    0x81,
-    0xda,
-    0xf7,
-    0x15,
-    0x85,
-    0x47,
-    0x7c,
-    0x5d,
-    0x6e,
-    0x91,
-    0xd2,
-    0x03,
-    0xc8,
-    0xe2,
-    0x08,
-    0x27,
-    0x43,
-    0xf7,
-    0x76,
-    0x17,
-    0x08,
-    0x26,
-    0xab,
-    0x71,
-    0x4d,
-    0x9f,
-    0xa7,
-    0x88,
-    0x27,
-    0xf2,
-    0x4b,
-    0x09,
-    0xa0,
-    0xd1,
-    0x0d,
-    0xdf,
-    0x0a,
-    0x17,
-    0xf0,
-    0x53,
-    0x93,
-    0x0a,
-    0xb4,
-    0x78,
-    0x19,
-    0xdd,
-    0x49,
-    0xc6,
-    0x3f,
-    0x7a,
-    0x8a,
-    0x05,
-    0xc0,
-    0x7e,
-    0x28,
-    0x6d,
-    0x03,
-    0x84,
-    0xe4,
-    0x0b,
-    0xf0,
-    0xa6,
-    0x02,
-    0x66,
-    0x03,
-    0x41,
-    0xfa,
-    0x63,
-    0x9e,
-    0xf9,
-    0x70,
-    0x66,
-    0xa4,
-    0xfd,
-    0x66,
-    0xba,
-    0x43,
-    0x8c,
-    0xb1,
-    0x33,
-    0x11,
-    0xb9,
-    0xa9,
-    0x11,
-    0x5b,
-    0x6b,
-    0x25,
-    0x28,
-    0xb9,
-    0xa7,
-    0xa7,
-    0x3e,
-    0xe6,
-    0x12,
-    0xd3,
-    0xb5,
-    0xcf,
-    0xb1,
-    0x26,
-    0x6a,
-    0xea,
-    0xf4,
-    0xe4,
-    0xdc,
-    0xc9,
-    0xf3,
-    0x52,
-    0x91,
-    0xef,
-    0xf7,
-    0x26,
-    0xb5,
-    0xe2,
-    0x3c,
-    0x3c,
-    0x05,
-    0x82,
-    0xf5,
-    0x8a,
-    0xeb,
-    0x98,
-    0x91,
-    0x56,
-    0xea,
-    0xb2,
-    0x3d,
-    0xa6,
-    0x3d,
-    0x2f,
-    0xaa,
-    0xf9,
-    0xbb,
-    0x96,
-    0x10,
-    0x34,
-    0xfe,
-    0x2c,
-    0x73,
-    0xdf,
-    0xc4,
-    0xc5,
-    0x25,
-    0x91,
-    0x95,
-    0xda,
-    0x8c,
-    0xa9,
-    0xa7,
-    0xdc,
-    0x25,
-    0x3f,
-    0xfe,
-    0xc8,
-    0xc9,
-    0x5b,
-    0xd7,
-    0xfc,
-    0x2f,
-    0x64,
-    0x47,
-    0x49,
-    0xb3,
-    0xdb,
-    0x20,
-    0x49,
-    0x55,
-    0x49,
-    0x14,
-    0xf2,
-    0x05,
-    0x75,
-    0x1d,
-    0x6c,
-    0x1e,
-    0xdb,
-    0x1c,
-    0x20,
-    0x30,
-    0x5a,
-    0xc0,
-    0x12,
-    0x02,
-    0x2d,
-    0xa9,
-    0x70,
-    0xd7,
-    0x1c,
-    0xcd,
-    0x6b,
-    0xf1,
-    0xf3,
-    0x1b,
-    0x45,
-    0x54,
-    0x34,
-    0x5f,
-    0xab,
-    0xcc,
-    0x09,
-    0x66,
-    0x46,
-    0x31,
-    0x7c,
-    0x62,
-    0x8d,
-    0xea,
-    0xea,
-    0x8f,
-    0xdd,
-    0xb0,
-    0xb5,
-    0x17,
-    0xcb,
-    0x94,
-    0x3a,
-    0x34,
-    0xb9,
-    0x44,
-    0x03,
-    0x94,
-    0xa7,
-    0x8a,
-    0x3d,
-    0x01,
-    0x4c,
-    0x15,
-    0x6c,
-    0x41,
-    0x65,
-    0x7c,
-    0x5d,
-    0x3b,
-    0x4e,
-    0x80,
-    0x5c,
-    0x5c,
-    0xcf,
-    0x92,
-    0xa8,
-    0x39,
-    0x38,
-    0x95,
-    0x24,
-    0x76,
-    0xb0,
-    0xe4,
-    0x4f,
-    0xe6,
-    0xca,
-    0x97,
-    0x76,
-    0xf3,
-    0x59,
-    0x02,
-    0x29,
-    0x41,
-    0x86,
-    0x7f,
-    0xeb,
-    0x8e,
-    0x1f,
-    0x6e,
-    0x2d,
-    0xdd,
-    0x32,
-    0x79,
-    0x7e,
-    0xd3,
-    0xdb,
-    0x1d,
-    0xfc,
-    0x61,
-    0x5a,
-    0x65,
-    0x0e,
-    0xa3,
-    0x68,
-    0xf9,
-    0x55,
-    0x08,
-    0xcc,
-    0x58,
-    0xdf,
-    0xb4,
-    0x29,
-    0x62,
-    0x9e,
-    0x22,
-    0x1a,
-    0x19,
-    0x19,
-    0x0e,
-    0x80,
-    0xa8,
-    0x62,
-    0x92,
-    0x1b,
-    0xa5,
-    0x48,
-    0x8f,
-    0x58,
-    0x93,
-    0xcd,
-    0x4e,
-    0x6a,
-    0xab,
-    0xdb,
-    0x67,
-    0x9c,
-    0xdc,
-    0x32,
-    0xe2,
-    0xe6,
-    0x10,
-    0xa5,
-    0x9d,
-    0xbe,
-    0xb1,
-    0x86,
-    0xed,
-    0x30,
-    0x6b,
-    0x5f,
-    0x88,
-    0x31,
-    0x34,
-    0xe2,
-    0xa3,
-    0x31,
-    0x8a,
-    0x23,
-    0x57,
-    0xef,
-    0xfc,
-    0x05,
-    0x49,
-    0x91,
-    0xec,
-    0xf2,
-    0x8a,
-    0xf4,
-    0x93,
-    0xd0,
-    0xbc,
-    0x41,
-    0x46,
-    0x30,
-    0x77,
-    0xc1,
-    0xf7,
-    0xc8,
-    0xeb,
-    0xf2,
-    0xfe,
-    0x23,
-    0xc6,
-    0xda,
-    0x1a,
-    0x97,
-    0x58,
-    0x9b,
-    0xb2,
-    0x78,
-    0xf4,
-    0x48,
-    0x61,
-    0x8b,
-    0x9a,
-    0xf7,
-    0xb2,
-    0xbd,
-    0xd4,
-    0x17,
-    0x28,
-    0x15,
-    0xde,
-    0x04,
-    0x82,
-    0xe8,
-    0x09,
-    0xd9,
-    0x3c,
-    0x4c,
-    0x61,
-    0x86,
-    0x59,
-    0xce,
-    0x8e,
-    0x22,
-    0x60,
-    0x68,
-    0xf8,
-    0x82,
-    0xa5,
-    0xad,
-    0x2f,
-    0x0a,
-    0xc9,
-    0x47,
-    0x89,
-    0xc3,
-    0x84,
-    0xa3,
-    0x0d,
-    0xae,
-    0xa2,
-    0xeb,
-    0x8f,
-    0x58,
-    0x4c,
-    0x35,
-    0x1d,
-    0xaf,
-    0x89,
-    0xfa,
-    0x9a,
-    0x14,
-    0x05,
-    0xc9,
-    0xa9,
-    0xb1,
-    0x10,
-    0x3c,
-    0xcd,
-    0x0d,
-    0xe9,
-    0x2c,
-    0xce,
-    0xdd,
-    0x3d,
-    0x21,
-    0x5e,
-    0x1e,
-    0xeb,
-    0x0c,
-    0xfc,
-    0x60,
-    0x0a,
-    0x39,
-    0x19,
-    0x65,
-    0x2d,
-    0x7f,
-    0x79,
-    0xea,
-    0xe5,
-    0xba,
-    0xdd,
-    0xc5,
-    0x88,
-    0x7b,
-    0xdf,
-    0x30,
-    0x31,
-    0xfd,
-    0x1d,
-    0x65,
-    0x08,
-    0x5b,
-    0x99,
-    0x6b,
-    0xc4,
-    0x01,
-    0x60,
-    0x2f,
-    0x6e,
-    0x60,
-    0x6a,
-    0xd6,
-    0x67,
-    0xe7,
-    0xc2,
-    0x52,
-    0xac,
-    0x2e,
-    0xe6,
-    0x33,
-    0x59,
-    0x74,
-    0x71,
-    0xc0,
-    0x6c,
-    0x4b,
-    0xf7,
-    0x47,
-    0xcc,
-    0x92,
-    0x31,
-    0xb1,
-    0x8a,
-    0xa4,
-    0x5a,
-    0x59,
-    0x66,
-    0xcf,
-    0xd8,
-    0x1f,
-    0x95,
-    0x08,
-    0x1f,
-    0xb8,
-    0xc1,
-    0xdc,
-    0xd3,
-    0x48,
-    0x52,
-    0xaa,
-    0x2c,
-    0x32,
-    0xec,
-    0x10,
-    0x9f,
-    0x2e,
-    0x38,
-    0xa3,
-    0xbb,
-    0x9d,
-    0xe8,
-    0xe3,
-    0x51,
-    0x1a,
-    0xf5,
-    0x6e,
-    0xd7,
-    0x52,
-    0x2b,
-    0x73,
-    0x0e,
-    0x15,
-    0xe8,
-    0x6a,
-    0xe3,
-    0xad,
-    0x21,
-    0x02,
-    0x93,
-    0x6e,
-    0xa5,
-    0x5b,
-    0x13,
-    0x8e,
-    0xa6,
-    0x76,
-    0xaf,
-    0x37,
-    0x75,
-    0xea,
-    0xf1,
-    0xdb,
-    0x8d,
-    0xd8,
-    0xc4,
-    0xc8,
-    0xd3,
-    0x20,
-    0xd9,
-    0xfc,
-    0x1c,
-    0xd5,
-    0x4a,
-    0x3a,
-    0xf0,
-    0xef,
-    0x7e,
-    0x5d,
-    0x8e,
-    0x40,
-    0x4c,
-    0xed,
-    0x2f,
-    0xaa,
-    0x63,
-    0xf0,
-    0x8f,
-    0x8e,
-    0xe9,
-    0x02,
-    0xaa,
-    0x87,
-    0x62,
-    0xa8,
-    0xc3,
-    0x59,
-    0xd4,
-    0xe2,
-    0xab,
-    0x24,
-    0x28,
-    0xff,
-    0x40,
-    0xde,
-    0xd4,
-    0xb5,
-    0x34,
-    0xff,
-    0xb7,
-    0x71,
-    0x10,
-    0x7e,
-    0x44,
-    0xec,
-    0x78,
-    0xfd,
-    0xe3,
-    0xff,
-    0xb0,
-    0x41,
-    0x94,
-    0xb8,
-    0x5f,
-    0xe4,
-    0xd6,
-    0xad,
-    0x93,
-    0x4e,
-    0xc7,
-    0x90,
-    0x06,
-    0xe1,
-    0x8c,
-    0x04,
-    0xa0,
-    0x74,
-    0xf3,
-    0xaf,
-    0x3c,
-    0x03,
-    0x57,
-    0x91,
-    0xaf,
-    0xa4,
-    0xc5,
-    0x94,
-    0x06,
-    0xbd,
-    0x5c,
-    0x64,
-    0x10,
-    0x75,
-    0xfa,
-    0x80,
-    0x1d,
-    0x68,
-    0x15,
-    0x92,
-    0x04,
-    0x9f,
-    0xe6,
-    0xfc,
-    0x6b,
-    0xbf,
-    0xcd,
-    0xb3,
-    0x42,
-    0x80,
-    0xf1,
-    0x50,
-    0x91,
-    0x61,
-    0x27,
-    0x64,
-    0x74,
-    0x9b,
-    0x15,
-    0x0c,
-    0x63,
-    0x53,
-    0x97,
-    0xc6,
-    0xb7,
-    0x13,
-    0x61,
-    0x83,
-    0x6a,
-    0x7b,
-    0xe6,
-    0xfe,
-    0x1f,
-    0x34,
-    0x79,
-    0x4b,
-    0x62,
-    0x26,
-    0xb2,
-    0xb3,
-    0x30,
-    0xeb,
-    0x14,
-    0xbf,
-    0xba,
-    0x83,
-    0xec,
-    0x93,
-    0x66,
-    0x49,
-    0x7c,
-    0x7d,
-    0x17,
-    0x25,
-    0x59,
-    0xce,
-    0xae,
-    0x04,
-    0x12,
-    0xe9,
-    0xd1,
-    0x85,
-    0x12,
-    0x99,
-    0xeb,
-    0xf5,
-    0xc8,
-    0xa8,
-    0x73,
-    0x7e,
-    0x05,
-    0xad,
-    0x72,
-    0x9b,
-    0xa5,
-    0x25,
-    0x3f,
-    0xcf,
-    0x71,
-    0xc5,
-    0x8d,
-    0x97,
-    0x44,
-    0x0f,
-    0xa8,
-    0x9d,
-    0x6d,
-    0x24,
-    0xfc,
-    0x2e,
-    0x55,
-    0xd9,
-    0xd7,
-    0xee,
-    0x62,
-    0x0c,
-    0x70,
-    0xcb,
-    0x1a,
-    0x39,
-    0x27,
-    0x2f,
-    0x8c,
-    0x48,
-    0x0e,
-    0x7a,
-    0xeb,
-    0xa9,
-    0xa9,
-    0xaf,
-    0x7d,
-    0xa3,
-    0xf2,
-    0x6d,
-    0xb3,
-    0xe9,
-    0xa0,
-    0x22,
-    0x9a,
-    0x6f,
-    0xa9,
-    0x7b,
-    0x72,
-    0x7b,
-    0x06,
-    0x1f,
-    0x9b,
-    0xff,
-    0xb6,
-    0x9c,
-    0xb9,
-    0x26,
-    0x05,
-    0xa1,
-    0x10,
-    0x2d,
-    0x0e,
-    0x6f,
-    0x30,
-    0x74,
-    0x7f,
-    0x8a,
-    0xd7,
-    0xd5,
-    0x9c,
-    0xb4,
-    0x13,
-    0x34,
-    0x87,
-    0x1b,
-    0xa7,
-    0x57,
-    0xbe,
-    0xd2,
-    0xb0,
-    0xf8,
-    0xe5,
-    0x7e,
-    0x88,
-    0x19,
-    0xc6,
-    0x52,
-    0xeb,
-    0x98,
-    0x96,
-    0x3d,
-    0x58,
-    0x03,
-    0x79,
-    0x61,
-    0xba,
-    0xad,
-    0x49,
-    0xc8,
-    0x48,
-    0x02,
-    0x93,
-    0x52,
-    0xaa,
-    0x17,
-    0xe3,
-    0xf2,
-    0x5d,
-    0x86,
-    0x42,
-    0x1a,
-    0x58,
-    0x78,
-    0xfc,
-    0x74,
-    0xf0,
-    0x03,
-    0xa7,
-    0xd3,
-    0xf9,
-    0xb7,
-    0x60,
-    0x69,
-    0x2e,
-    0x73,
-    0x58,
-    0x3a,
-    0xd3,
-    0x7d,
-    0x90,
-    0xd0,
-    0x98,
-    0xd2,
-    0xe0,
-    0x31,
-    0xc1,
-    0xbb,
-    0x3e,
-    0x0e,
-    0x84,
-    0xa1,
-    0x3d,
-    0x3d,
-    0xb2,
-    0x22,
-    0xd4,
-    0x6a,
-    0x9a,
-    0x65,
-    0x61,
-    0x09,
-    0x2b,
-    0xaa,
-    0xed,
-    0x8e,
-    0x58,
-    0x25,
-    0xb2,
-    0xe1,
-    0xc1,
-    0x0c,
-    0xda,
-    0x0c,
-    0x8f,
-    0xef,
-    0x8a,
-    0x37,
-    0x9f,
-    0x48,
-    0x1f,
-    0xd7,
-    0xe4,
-    0x53,
-    0xb8,
-    0x22,
-    0x06,
-    0x1f,
-    0xf4,
-    0xc6,
-    0x4f,
-    0xe5,
-    0xfd,
-    0xda,
-    0xc8,
-    0x9a,
-    0xc5,
-    0x15,
-    0x9f,
-    0xc0,
-    0x8f,
-    0x3e,
-    0xcc,
-    0x81,
-    0xb2,
-    0xe3,
-    0xf4,
-    0xfe,
-    0x99,
-    0x4e,
-    0x8e,
-    0xe5,
-    0x0f,
-    0xb5,
-    0x44,
-    0x41,
-    0xb9,
-    0xb1,
-    0x9c,
-    0x97,
-    0xe4,
-    0xf1,
-    0xd7,
-    0x2e,
-    0x82,
-    0x30,
-    0x1a,
-    0xae,
-    0x6e,
-    0x64,
-    0xcb,
-    0xed,
-    0xf8,
-    0x39,
-    0x3e,
-    0x05,
-    0x9d,
-    0xbd,
-    0x91,
-    0xaa,
-    0x16,
-    0x5d,
-    0xd4,
-    0xba,
-    0x95,
-    0x10,
-    0x6d,
-    0x16,
-    0x4b,
-    0xd2,
-    0xbb,
-    0xb1,
-    0x2d,
-    0x54,
-    0xfa,
-    0xe6,
-    0xf8,
-    0xf2,
-    0x67,
-    0x0f,
-    0x72,
-    0xe5,
-    0xa4,
-    0x53,
-    0xf3,
-    0xba,
-    0x5d,
-    0xbf,
-    0x25,
-    0x02,
-    0x2c,
-    0x98,
-    0x08,
-    0x4c,
-    0xba,
-    0xf0,
-    0x39,
-    0x50,
-    0x28,
-    0x78,
-    0x73,
-    0x6d,
-    0xad,
-    0x95,
-    0x56,
-    0x56,
-    0x80,
-    0xb6,
-    0x67,
-    0x08,
-    0xf8,
-    0xe4,
-    0x59,
-    0xff,
-    0xf1,
-    0x9b,
-    0x8b,
-    0xa9,
-    0x73,
-    0xd8,
-    0xd1,
-    0x1b,
-    0x8e,
-    0x73,
-    0x77,
-    0x03,
-    0x88,
-    0xaf,
-    0x83,
-    0xdd,
-    0x3b,
-    0x10,
-    0x3b,
-    0x6a,
-    0xb8,
-    0x6c,
-    0xe7,
-    0x5e,
-    0x30,
-    0x45,
-    0xd8,
-    0x59,
-    0x15,
-    0x56,
-    0xa9,
-    0x19,
-    0x7c,
-    0x6c,
-    0xc5,
-    0xee,
-    0xc6,
-    0x77,
-    0x29,
-    0x6e,
-    0x7f,
-    0xe1,
-    0x6c,
-    0x69,
-    0x86,
-    0x1e,
-    0xfc,
-    0x20,
-    0x6e,
-    0x85,
-    0xaa,
-    0xb1,
-    0x25,
-    0x5e,
-    0x69,
-    0xd6,
-    0xd3,
-    0x3c,
-    0x52,
-    0xcf,
-    0x05,
-    0x8d,
-    0xec,
-    0x9d,
-    0x0b,
-    0x6f,
-    0xab,
-    0x71,
-    0x9e,
-    0xc5,
-    0xb6,
-    0x64,
-    0xc7,
-    0x8a,
-    0xed,
-    0x68,
-    0xfc,
-    0x66,
-    0x2b,
-    0x7f,
-    0x8b,
-    0x7f,
-    0xc8,
-    0x2b,
-    0x3c,
-    0x92,
-    0x63,
-    0x25,
-    0x31,
-    0x42,
-    0xde,
-    0x51,
-    0x12,
-    0xb0,
-    0xa9,
-    0xf2,
-    0x67,
-    0x4b,
-    0x44,
-    0x1b,
-    0x45,
-    0xea,
-    0xff,
-    0x66,
-    0x2d,
-    0x18,
-    0x05,
-    0xe7,
-    0x31,
-    0xae,
-    0x98,
-    0x63,
-    0x58,
-    0xa8,
-    0x9e,
-    0xbe,
-    0x44,
-    0x31,
-    0x5d,
-    0xb3,
-    0x12,
-    0x00,
-    0x83,
-    0xc8,
-    0x82,
-    0xe7,
-    0x69,
-    0x80,
-    0x58,
-    0xa9,
-    0x98,
-    0xd2,
-    0x02,
-    0x0d,
-    0x8d,
-    0xda,
-    0x7a,
-    0x30,
-    0xb9,
-    0xcf,
-    0x6e,
-    0x1f,
-    0xcc,
-    0x35,
-    0x9f,
-    0xa5,
-    0x33,
-    0x53,
-    0x87,
-    0x62,
-    0xdf,
-    0xe8,
-    0x3e,
-    0x1d,
-    0x49,
-    0x1a,
-    0x9e,
-    0x5c,
-    0xb3,
-    0xaf,
-    0xa6,
-    0x31,
-    0xb0,
-    0x7f,
-    0x1c,
-    0x56,
-    0xe6,
-    0x29,
-    0x76,
-    0x7c,
-    0x13,
-    0x06,
-    0xfb,
-    0xe1,
-    0x4e,
-    0x5b,
-    0x26,
-    0x21,
-    0x90,
-    0xd3,
-    0x4b,
-    0x4e,
-    0x72,
-    0x2c,
-    0x7c,
-    0x42,
-    0x38,
-    0x30,
-    0xae,
-    0x34,
-    0x0f,
-    0xe7,
-    0x18,
-    0x8a,
-    0x93,
-    0x0b,
-    0xdc,
-    0xee,
-    0x94,
-    0xbc,
-    0xe9,
-    0xa4,
-    0x1a,
-    0x75,
-    0x20,
-    0x1b,
-    0xa6,
-    0x3f,
-    0xb6,
-    0xc2,
-    0xbb,
-    0x24,
-    0xd9,
-    0x1c,
-    0x9d,
-    0xe7,
-    0x96,
-    0x17,
-    0x59,
-    0xf2,
-    0xfa,
-    0x9a,
-    0x05,
-    0x90,
-    0x77,
-    0x5d,
-    0x49,
-    0x5c,
-    0x8a,
-    0xfd,
-    0x1f,
-    0xfa,
-    0x9b,
-    0x50,
-    0xd6,
-    0x04,
-    0x25,
-    0xf6,
-    0x5d,
-    0x47,
-    0x16,
-    0x30,
-    0xbe,
-    0x30,
-    0x79,
-    0xf5,
-    0xe9,
-    0x81,
-    0x52,
-    0x43,
-    0xb3,
-    0x48,
-    0xc9,
-    0xb4,
-    0x1e,
-    0x12,
-    0x8b,
-    0x51,
-    0xdb,
-    0x5c,
-    0x6e,
-    0xaa,
-    0x0d,
-    0x4a,
-    0x54,
-    0x27,
-    0x50,
-    0x9c,
-    0x51,
-    0x99,
-    0xfa,
-    0xdd,
-    0x10,
-    0x14,
-    0xa1,
-    0xdd,
-    0x72,
-    0x01,
-    0xdd,
-    0x62,
-    0x79,
-    0x6f,
-    0x4e,
-    0x1b,
-    0x65,
-    0xaa,
-    0xe1,
-    0xd5,
-    0x1c,
-    0x0f,
-    0x50,
-    0xf1,
-    0xcf,
-    0x1e,
-    0xe8,
-    0x16,
-    0xdb,
-    0xd1,
-    0x8f,
-    0x23,
-    0xed,
-    0x2c,
-    0x05,
-    0x68,
-    0x6a,
-    0x16,
-    0x6a,
-    0x15,
-    0x0e,
-    0x67,
-    0x01,
-    0xf2,
-    0xd3,
-    0x42,
-    0x33,
-    0x51,
-    0x14,
-    0xa5,
-    0xd7,
-    0x42,
-    0xf2,
-    0x3e,
-    0xb0,
-    0x05,
-    0xf7,
-    0x81,
-    0x37,
-    0xc5,
-    0xf9,
-    0xf7,
-    0x9b,
-    0x83,
-    0x41,
-    0xd9,
-    0x07,
-    0x50,
-    0xed,
-    0xdd,
-    0x23,
-    0xbf,
-    0x93,
-    0x50,
-    0xdd,
-    0x9a,
-    0x27,
-    0x65,
-    0x69,
-    0xd4,
-    0x1f,
-    0xcd,
-    0x86,
-    0xbf,
-    0xd4,
-    0x87,
-    0x04,
-    0x7f,
-    0x2c,
-    0xfa,
-    0x83,
-    0xbf,
-    0x76,
-    0x41,
-    0x7d,
-    0xa2,
-    0x95,
-    0xc6,
-    0x87,
-    0xfc,
-    0x61,
-    0x12,
-    0xd3,
-    0xc3,
-    0x4a,
-    0xe3,
-    0xfa,
-    0xc0,
-    0x3f,
-    0x7f,
-    0xf8,
-    0x8a,
-    0xce,
-    0x49,
-    0x78,
-    0xb5,
-    0x8c,
-    0x92,
-    0x53,
-    0x47,
-    0xb7,
-    0xb1,
-    0x53,
-    0x6b,
-    0x1a,
-    0x56,
-    0x3c,
-    0x6a,
-    0x31,
-    0x1b,
-    0x0d,
-    0xd6,
-    0x8e,
-    0x5c,
-    0x83,
-    0x09,
-    0x7b,
-    0x49,
-    0xdf,
-    0xce,
-    0xe1,
-    0x39,
-    0xe9,
-    0x5d,
-    0x68,
-    0x42,
-    0x35,
-    0x8d,
-    0xe0,
-    0x06,
-    0xa5,
-    0x45,
-    0xe0,
-    0xcf,
-    0x2f,
-    0x33,
-    0xac,
-    0xdf,
-    0xe0,
-    0xc1,
-    0x5c,
-    0x01,
-    0x21,
-    0x45,
-    0x3b,
-    0x64,
-    0x3a,
-    0x78,
-    0x6e,
-    0xa9,
-    0x14,
-    0x2a,
-    0xd6,
-    0x3b,
-    0x43,
-    0x34,
-    0x37,
-    0xdf,
-    0x43,
-    0xad,
-    0x99,
-    0x8c,
-    0x02,
-    0x61,
-    0xee,
-    0x7c,
-    0x9f,
-    0x7e,
-    0xf6,
-    0x83,
-    0x72,
-    0x91,
-    0x60,
-    0xa0,
-    0x4c,
-    0xb1,
-    0x32,
-    0xd2,
-    0x00,
-    0xfa,
-    0x6a,
-    0x2c,
-    0x22,
-    0x3e,
-    0xe5,
-    0x2c,
-    0x0e,
-    0xf6,
-    0x81,
-    0x49,
-    0x2c,
-    0x7f,
-    0x7f,
-    0xcb,
-    0x73,
-    0x83,
-    0x2b,
-    0xdf,
-    0x2c,
-    0xb5,
-    0xbe,
-    0xeb,
-    0xf9,
-    0xc1,
-    0x83,
-    0x1f,
-    0x15,
-    0x82,
-    0x39,
-    0x4d,
-    0xdd,
-    0x76,
-    0xb9,
-    0xfa,
-    0x90,
-    0x70,
-    0xd8,
-    0xb5,
-    0x53,
-    0x8d,
-    0x8f,
-    0xa7,
-    0x78,
-    0x69,
-    0x59,
-    0x6c,
-    0xff,
-    0x93,
-    0xdd,
-    0x21,
-    0x5d,
-    0x3e,
-    0xcd,
-    0xbe,
-    0x7d,
-    0x39,
-    0x0e,
-    0xa6,
-    0x05,
-    0x21,
-    0x19,
-    0x7d,
-    0xda,
-    0xd5,
-    0xa1,
-    0x3a,
-    0xe6,
-    0x2a,
-    0x76,
-    0x7d,
-    0x19,
-    0xe0,
-    0xa9,
-    0x22,
-    0xad,
-    0xd5,
-    0xf1,
-    0x16,
-    0xaf,
-    0x79,
-    0x4d,
-    0x69,
-    0xbb,
-    0x82,
-    0xeb,
-    0xa5,
-    0x07,
-    0xe1,
-    0x49,
-    0x5f,
-    0xa2,
-    0xf4,
-    0x9a,
-    0x0b,
-    0xfe,
-    0xfd,
-    0x6b,
-    0x15,
-    0xad,
-    0xd3,
-    0x86,
-    0x2d,
-    0x68,
-    0xd7,
-    0x16,
-    0xe2,
-    0x55,
-    0x2a,
-    0x0d,
-    0x72,
-    0x8a,
-    0x1d,
-    0xc3,
-    0xe0,
-    0xcd,
-    0xe9,
-    0xdf,
-    0x48,
-    0x9d,
-    0xa1,
-    0x7b,
-    0x70,
-    0x77,
-    0x64,
-    0x83,
-    0x9f,
-    0x52,
-    0xd7,
-    0x5e,
-    0xb2,
-    0x6c,
-    0xd2,
-    0xd1,
-    0x6c,
-    0x48,
-    0x5a,
-    0x20,
-    0x0e,
-    0xf7,
-    0xd0,
-    0x76,
-    0x27,
-    0x98,
-    0x67,
-    0x86,
-    0xae,
-    0x1b,
-    0xdc,
-    0x73,
-    0x4e,
-    0x4a,
-    0x61,
-    0xed,
-    0x01,
-    0x09,
-    0xda,
-    0x9e,
-    0xe0,
-    0xdc,
-    0x4b,
-    0xc4,
-    0x3a,
-    0xab,
-    0x91,
-    0x1f,
-    0xe3,
-    0xc2,
-    0x51,
-    0x0d,
-    0xce,
-    0x1c,
-    0x2f,
-    0xf4,
-    0xde,
-    0xe1,
-    0x40,
-    0xe0,
-    0xfa
-  ],
-  const [
-    0x13,
-    0xc1,
-    0x23,
-    0xac,
-    0x37,
-    0x91,
-    0x46,
-    0xd0,
-    0x66,
-    0x76,
-    0x7a,
-    0xc0,
-    0x2b,
-    0xa4,
-    0xbc,
-    0xda,
-    0x80,
-    0xfb,
-    0xf8,
-    0xa4,
-    0xe4,
-    0xce,
-    0xc5,
-    0xb0,
-    0xad,
-    0xe8,
-    0x4f,
-    0xc3,
-    0xa0,
-    0xd1,
-    0x94,
-    0x35,
-    0xbf,
-    0x4d,
-    0xd4,
-    0x9b,
-    0x62,
-    0x26,
-    0x42,
-    0xa4,
-    0x89,
-    0x2b,
-    0x00,
-    0x41,
-    0x71,
-    0x79,
-    0x4a,
-    0x09,
-    0x65,
-    0xf9,
-    0xf2,
-    0xdb,
-    0xd7,
-    0x2a,
-    0x0c,
-    0xc5,
-    0xaf,
-    0x21,
-    0xea,
-    0x24,
-    0xe3,
-    0xce,
-    0x4b,
-    0x0d,
-    0x48,
-    0x80,
-    0xcf,
-    0xec,
-    0xa8,
-    0xab,
-    0xae,
-    0x6b,
-    0x14,
-    0xea,
-    0xaa,
-    0x96,
-    0x7b,
-    0x40,
-    0x42,
-    0x3c,
-    0x7c,
-    0xa3,
-    0x29,
-    0x98,
-    0x79,
-    0xbb,
-    0xf6,
-    0x30,
-    0xed,
-    0xe7,
-    0x1d,
-    0xfe,
-    0xff,
-    0x81,
-    0x1e,
-    0xce,
-    0x57,
-    0x63,
-    0xfc,
-    0xe7,
-    0x30,
-    0xa9,
-    0xf1,
-    0xed,
-    0xae,
-    0xb9,
-    0x60,
-    0x06,
-    0x72,
-    0x81,
-    0x0b,
-    0x3c,
-    0x6d,
-    0x00,
-    0x86,
-    0x23,
-    0xf1,
-    0x08,
-    0xec,
-    0xbb,
-    0x0e,
-    0x42,
-    0xd0,
-    0x97,
-    0x1b,
-    0x72,
-    0x76,
-    0x3f,
-    0x93,
-    0xfc,
-    0x43,
-    0xd4,
-    0x23,
-    0xa8,
-    0x73,
-    0xf2,
-    0x00,
-    0xa2,
-    0x0a,
-    0xda,
-    0x7e,
-    0xc5,
-    0x0d,
-    0xd1,
-    0xdf,
-    0x18,
-    0xf1,
-    0xc3,
-    0x68,
-    0x99,
-    0x54,
-    0x2c,
-    0xbb,
-    0x3a,
-    0xeb,
-    0x39,
-    0x60,
-    0x2a,
-    0xbc,
-    0x2a,
-    0xa5,
-    0x55,
-    0x8d,
-    0xfa,
-    0xa8,
-    0x2e,
-    0x9c,
-    0x42,
-    0xb2,
-    0xac,
-    0x90,
-    0x5b,
-    0xc6,
-    0x92,
-    0xb0,
-    0xc2,
-    0x7a,
-    0xf4,
-    0x53,
-    0xc1,
-    0x06,
-    0xf7,
-    0x97,
-    0x4c,
-    0x9b,
-    0xd8,
-    0x56,
-    0x2a,
-    0xf6,
-    0x30,
-    0x56,
-    0x55,
-    0x34,
-    0x76,
-    0xc0,
-    0xa2,
-    0xe8,
-    0xc5,
-    0xd4,
-    0xa4,
-    0x6b,
-    0xdf,
-    0xda,
-    0xce,
-    0x73,
-    0x73,
-    0x5c,
-    0xd9,
-    0xe7,
-    0x9b,
-    0x92,
-    0x65,
-    0xf2,
-    0xa9,
-    0x1e,
-    0xe3,
-    0x57,
-    0x23,
-    0xfa,
-    0xb2,
-    0x04,
-    0x0c,
-    0xae,
-    0x88,
-    0xe9,
-    0x65,
-    0xc6,
-    0x14,
-    0x0a,
-    0xf4,
-    0x83,
-    0xe2,
-    0xd3,
-    0x44,
-    0xd1,
-    0x7e,
-    0xac,
-    0xed,
-    0x79,
-    0xdc,
-    0xce,
-    0x15,
-    0x98,
-    0xf7,
-    0x55,
-    0x37,
-    0x50,
-    0xb9,
-    0x96,
-    0x24,
-    0xbd,
-    0x1b,
-    0xb2,
-    0x47,
-    0x2a,
-    0x8d,
-    0x6c,
-    0x2c,
-    0x85,
-    0x98,
-    0x37,
-    0x44,
-    0x11,
-    0xc2,
-    0x93,
-    0xe2,
-    0x5b,
-    0xb2,
-    0x9a,
-    0x8a,
-    0x6f,
-    0x94,
-    0xd6,
-    0x6b,
-    0x4b,
-    0xbf,
-    0x56,
-    0x2a,
-    0x94,
-    0x95,
-    0x01,
-    0xe1,
-    0x88,
-    0xab,
-    0x2a,
-    0x68,
-    0x34,
-    0x2b,
-    0x64,
-    0xd3,
-    0xe7,
-    0x76,
-    0x97,
-    0x3b,
-    0xe6,
-    0x0d,
-    0x53,
-    0xc2,
-    0x61,
-    0xb1,
-    0x65,
-    0xd1,
-    0xa6,
-    0xc9,
-    0xa8,
-    0xa4,
-    0x95,
-    0x05,
-    0x1e,
-    0x09,
-    0x54,
-    0x41,
-    0x3f,
-    0x64,
-    0x44,
-    0xac,
-    0x91,
-    0xf7,
-    0x33,
-    0x29,
-    0x79,
-    0x60,
-    0xd3,
-    0xf5,
-    0x51,
-    0x63,
-    0x6a,
-    0x8a,
-    0xba,
-    0xea,
-    0xcc,
-    0xc4,
-    0x34,
-    0x4a,
-    0x87,
-    0x43,
-    0xec,
-    0xc8,
-    0x5d,
-    0x10,
-    0xd4,
-    0x5c,
-    0xf7,
-    0x83,
-    0xf9,
-    0xb5,
-    0xd7,
-    0x64,
-    0x12,
-    0x7c,
-    0x8f,
-    0x50,
-    0x54,
-    0xdd,
-    0x30,
-    0x5e,
-    0x8e,
-    0x44,
-    0x06,
-    0x03,
-    0x71,
-    0x64,
-    0x82,
-    0x33,
-    0x2f,
-    0x7e,
-    0x78,
-    0xc9,
-    0x49,
-    0xe0,
-    0x8b,
-    0x29,
-    0xa1,
-    0xac,
-    0xe5,
-    0x24,
-    0xd7,
-    0xda,
-    0x2b,
-    0x1c,
-    0xd2,
-    0x80,
-    0xaf,
-    0x68,
-    0x9d,
-    0x51,
-    0xe8,
-    0xf9,
-    0x75,
-    0x64,
-    0x20,
-    0x3e,
-    0x20,
-    0x38,
-    0x6d,
-    0x46,
-    0x80,
-    0xf4,
-    0xe2,
-    0x25,
-    0x67,
-    0xf3,
-    0x06,
-    0x98,
-    0xad,
-    0x7f,
-    0x85,
-    0xec,
-    0x80,
-    0xdd,
-    0x26,
-    0x1b,
-    0xfc,
-    0x8b,
-    0xfd,
-    0x39,
-    0xfb,
-    0xc5,
-    0xe2,
-    0x0e,
-    0x2f,
-    0x4d,
-    0x22,
-    0x05,
-    0x6e,
-    0x6c,
-    0x74,
-    0x45,
-    0x4c,
-    0x34,
-    0x2e,
-    0x1d,
-    0xef,
-    0x09,
-    0xb8,
-    0xa5,
-    0x1f,
-    0x60,
-    0x41,
-    0xa2,
-    0x9d,
-    0xc5,
-    0xb2,
-    0xab,
-    0xb6,
-    0x23,
-    0xe0,
-    0x8a,
-    0x17,
-    0x40,
-    0x06,
-    0xe5,
-    0xe3,
-    0x87,
-    0x72,
-    0x1e,
-    0x03,
-    0x0a,
-    0x7e,
-    0x77,
-    0xbe,
-    0xc7,
-    0xc2,
-    0x7a,
-    0x89,
-    0x2a,
-    0x88,
-    0x98,
-    0x20,
-    0xd4,
-    0x80,
-    0x10,
-    0xd5,
-    0x9b,
-    0xb6,
-    0x12,
-    0x28,
-    0xd2,
-    0xc0,
-    0x24,
-    0x99,
-    0xca,
-    0x3c,
-    0xc6,
-    0xba,
-    0x98,
-    0x7a,
-    0x51,
-    0x88,
-    0x19,
-    0x75,
-    0x25,
-    0xfb,
-    0x34,
-    0x08,
-    0x03,
-    0xdc,
-    0x5f,
-    0x5e,
-    0xb8,
-    0xd7,
-    0x65,
-    0xab,
-    0xfc,
-    0xd1,
-    0x66,
-    0x19,
-    0x99,
-    0x7c,
-    0x1f,
-    0x06,
-    0xd0,
-    0x28,
-    0x6b,
-    0x6c,
-    0xf8,
-    0xdc,
-    0x0a,
-    0xa0,
-    0x68,
-    0xa5,
-    0xa2,
-    0x40,
-    0x97,
-    0x2e,
-    0x03,
-    0x66,
-    0x82,
-    0x91,
-    0xaf,
-    0x22,
-    0x4e,
-    0x6d,
-    0x9a,
-    0x28,
-    0x2f,
-    0x39,
-    0x2e,
-    0xc5,
-    0x88,
-    0xd7,
-    0x92,
-    0x18,
-    0x54,
-    0x6c,
-    0x2c,
-    0x7e,
-    0xc4,
-    0x70,
-    0x65,
-    0x4e,
-    0x29,
-    0x01,
-    0xac,
-    0xc7,
-    0x15,
-    0x7d,
-    0xbd,
-    0x46,
-    0xbd,
-    0x4f,
-    0x23,
-    0xbc,
-    0xa2,
-    0x09,
-    0xfb,
-    0x60,
-    0x71,
-    0xb4,
-    0xfc,
-    0xa1,
-    0x27,
-    0x63,
-    0xb4,
-    0x5f,
-    0x78,
-    0x0f,
-    0x14,
-    0x5a,
-    0x72,
-    0x9e,
-    0x2f,
-    0xeb,
-    0x5e,
-    0x45,
-    0x3f,
-    0xf2,
-    0xe7,
-    0x10,
-    0xe9,
-    0x0f,
-    0x7e,
-    0xbf,
-    0xc2,
-    0x15,
-    0xfc,
-    0xd4,
-    0x11,
-    0xbb,
-    0x89,
-    0xea,
-    0xd7,
-    0x95,
-    0xbd,
-    0x48,
-    0x0c,
-    0x43,
-    0x06,
-    0xb6,
-    0x2c,
-    0xe9,
-    0x4a,
-    0x90,
-    0xf2,
-    0xdf,
-    0xcd,
-    0x18,
-    0x63,
-    0xa9,
-    0x54,
-    0x10,
-    0x0f,
-    0x29,
-    0x8b,
-    0x89,
-    0x94,
-    0x13,
-    0xa4,
-    0xf6,
-    0x63,
-    0xa2,
-    0x41,
-    0x84,
-    0xc7,
-    0x89,
-    0x94,
-    0xae,
-    0x23,
-    0x2d,
-    0xc4,
-    0x0b,
-    0x7b,
-    0x11,
-    0x93,
-    0x6b,
-    0x35,
-    0x91,
-    0x3f,
-    0x23,
-    0x21,
-    0xd4,
-    0xa5,
-    0xa5,
-    0xb8,
-    0xfc,
-    0xac,
-    0x54,
-    0xa1,
-    0x9f,
-    0xe1,
-    0x96,
-    0x7a,
-    0x7b,
-    0x5f,
-    0x2a,
-    0xd4,
-    0x65,
-    0xf2,
-    0xbc,
-    0x7f,
-    0x83,
-    0x7c,
-    0xb6,
-    0x09,
-    0xbb,
-    0x97,
-    0x5a,
-    0x81,
-    0x6b,
-    0x7b,
-    0x0e,
-    0x80,
-    0x5b,
-    0x23,
-    0xf6,
-    0x6b,
-    0xf0,
-    0xab,
-    0xc8,
-    0xf2,
-    0xa2,
-    0xfd,
-    0xdc,
-    0xdc,
-    0xaf,
-    0xac,
-    0x83,
-    0x07,
-    0x11,
-    0x20,
-    0x9a,
-    0xaa,
-    0xae,
-    0xf4,
-    0x5f,
-    0xde,
-    0xd0,
-    0x9c,
-    0x83,
-    0x5d,
-    0xd4,
-    0x4b,
-    0x80,
-    0x89,
-    0x26,
-    0x13,
-    0x2c,
-    0xb0,
-    0x6d,
-    0x4f,
-    0x8e,
-    0x8e,
-    0x02,
-    0x3e,
-    0xf1,
-    0x13,
-    0xa7,
-    0xf0,
-    0x38,
-    0x67,
-    0x76,
-    0x66,
-    0x71,
-    0x2c,
-    0x17,
-    0xf5,
-    0xad,
-    0x03,
-    0x36,
-    0xeb,
-    0x0e,
-    0x51,
-    0x34,
-    0x75,
-    0x21,
-    0x43,
-    0x1d,
-    0xc0,
-    0x6e,
-    0x0f,
-    0xdb,
-    0x5f,
-    0x4e,
-    0x7d,
-    0xa9,
-    0xed,
-    0xfd,
-    0xa7,
-    0xca,
-    0xf3,
-    0xf0,
-    0xfc,
-    0x7a,
-    0x0b,
-    0x69,
-    0x8b,
-    0x25,
-    0x46,
-    0x48,
-    0x7f,
-    0xd7,
-    0xcc,
-    0x24,
-    0xe5,
-    0xf4,
-    0xc2,
-    0x9a,
-    0xb6,
-    0x29,
-    0x71,
-    0xe5,
-    0x11,
-    0xa2,
-    0xa4,
-    0xaf,
-    0xc8,
-    0x7d,
-    0x51,
-    0x27,
-    0x1e,
-    0x7f,
-    0x7c,
-    0x54,
-    0xcf,
-    0x06,
-    0x59,
-    0xa9,
-    0x51,
-    0x3f,
-    0xb1,
-    0xd9,
-    0x5a,
-    0x99,
-    0x86,
-    0xed,
-    0xa2,
-    0x7a,
-    0xfa,
-    0x93,
-    0xea,
-    0x30,
-    0x6d,
-    0xb9,
-    0x3d,
-    0x2a,
-    0xe6,
-    0x5a,
-    0x76,
-    0x68,
-    0xb4,
-    0x98,
-    0x02,
-    0x30,
-    0x55,
-    0x0c,
-    0xe7,
-    0x03,
-    0x96,
-    0x5a,
-    0x05,
-    0xcf,
-    0xfc,
-    0x08,
-    0x9c,
-    0x66,
-    0x63,
-    0x90,
-    0x0f,
-    0x2f,
-    0xe5,
-    0xb3,
-    0xe8,
-    0x1b,
-    0xfd,
-    0x11,
-    0x1b,
-    0xdb,
-    0xec,
-    0xf7,
-    0x8f,
-    0x51,
-    0x5c,
-    0x78,
-    0xda,
-    0x44,
-    0x44,
-    0xbf,
-    0x4d,
-    0x57,
-    0x0b,
-    0xa3,
-    0x30,
-    0x3c,
-    0xf0,
-    0x7c,
-    0x4e,
-    0x25,
-    0xa9,
-    0x35,
-    0xb5,
-    0x7b,
-    0x4a,
-    0xa3,
-    0xb7,
-    0xd3,
-    0x69,
-    0x15,
-    0x34,
-    0x1e,
-    0x80,
-    0x2d,
-    0x1c,
-    0x1f,
-    0x92,
-    0xee,
-    0x2f,
-    0x23,
-    0x12,
-    0x15,
-    0x07,
-    0xec,
-    0x00,
-    0xad,
-    0x59,
-    0xee,
-    0x55,
-    0xde,
-    0x78,
-    0xbe,
-    0xa1,
-    0x06,
-    0x1a,
-    0xc7,
-    0xf3,
-    0x0b,
-    0x5f,
-    0x3f,
-    0xf9,
-    0xef,
-    0x0f,
-    0x59,
-    0x68,
-    0xa4,
-    0x23,
-    0xbc,
-    0x9e,
-    0x22,
-    0x88,
-    0x35,
-    0x87,
-    0xb8,
-    0x1f,
-    0xa8,
-    0xbd,
-    0x9f,
-    0x08,
-    0x4d,
-    0xf3,
-    0xd5,
-    0x20,
-    0x18,
-    0x93,
-    0x28,
-    0xc8,
-    0x79,
-    0xa6,
-    0x91,
-    0xe9,
-    0x46,
-    0xf5,
-    0xc4,
-    0x35,
-    0xf6,
-    0x6d,
-    0x05,
-    0xaf,
-    0x0f,
-    0xc8,
-    0x3d,
-    0x6d,
-    0xe1,
-    0x6a,
-    0x4d,
-    0x9c,
-    0x75,
-    0x89,
-    0xa2,
-    0xc6,
-    0xc1,
-    0x91,
-    0x0a,
-    0x50,
-    0x1d,
-    0xc7,
-    0xc6,
-    0x47,
-    0xfb,
-    0x2c,
-    0xe0,
-    0x5c,
-    0xd2,
-    0xa4,
-    0xbf,
-    0x2c,
-    0x5b,
-    0x57,
-    0xf8,
-    0xc5,
-    0x00,
-    0x58,
-    0x67,
-    0x66,
-    0x92,
-    0x85,
-    0x7f,
-    0x87,
-    0x3a,
-    0xae,
-    0xde,
-    0x19,
-    0xb2,
-    0xf9,
-    0x24,
-    0x0f,
-    0xb4,
-    0x84,
-    0x06,
-    0x1d,
-    0xb3,
-    0x4d,
-    0x9e,
-    0xc0,
-    0xca,
-    0x4f,
-    0x05,
-    0x7e,
-    0xf2,
-    0xee,
-    0x24,
-    0x6f,
-    0x77,
-    0x95,
-    0xc7,
-    0xfc,
-    0xad,
-    0x9e,
-    0xf3,
-    0xe7,
-    0xdf,
-    0x72,
-    0x7a,
-    0x8c,
-    0x88,
-    0xf1,
-    0xcc,
-    0x66,
-    0xc5,
-    0x14,
-    0x10,
-    0xd4,
-    0x0b,
-    0xd0,
-    0x74,
-    0x1d,
-    0x15,
-    0x3e,
-    0xc1,
-    0xb2,
-    0x21,
-    0xfa,
-    0x32,
-    0xb4,
-    0x5c,
-    0xc9,
-    0x86,
-    0xb6,
-    0x9b,
-    0x7e,
-    0x54,
-    0xc4,
-    0x4b,
-    0x1e,
-    0x9f,
-    0xa4,
-    0xab,
-    0x42,
-    0xaa,
-    0x5b,
-    0x39,
-    0xbd,
-    0x0d,
-    0xf4,
-    0x69,
-    0x7f,
-    0x09,
-    0x7c,
-    0x9d,
-    0xb9,
-    0x19,
-    0x51,
-    0x52,
-    0x42,
-    0xc9,
-    0x9d,
-    0x97,
-    0x3a,
-    0xcb,
-    0x1d,
-    0xc4,
-    0xed,
-    0x48,
-    0x27,
-    0x68,
-    0xf9,
-    0x74,
-    0xeb,
-    0x83,
-    0xb4,
-    0x65,
-    0xf9,
-    0xf6,
-    0xc8,
-    0x25,
-    0x03,
-    0x37,
-    0x20,
-    0x06,
-    0xe4,
-    0x49,
-    0x08,
-    0x35,
-    0xe2,
-    0xec,
-    0x8f,
-    0x92,
-    0x30,
-    0x11,
-    0x30,
-    0xbf,
-    0xb7,
-    0x90,
-    0xb2,
-    0x77,
-    0x17,
-    0x1d,
-    0x4d,
-    0x22,
-    0xe8,
-    0x79,
-    0x0e,
-    0xa6,
-    0x45,
-    0xe5,
-    0x7d,
-    0x7f,
-    0x8b,
-    0xdc,
-    0x7c,
-    0x12,
-    0x5e,
-    0x01,
-    0x72,
-    0x3e,
-    0xed,
-    0x57,
-    0xa9,
-    0x35,
-    0x77,
-    0xb0,
-    0xf5,
-    0x8a,
-    0x0f,
-    0x68,
-    0x97,
-    0x8b,
-    0x9c,
-    0x52,
-    0x60,
-    0xd0,
-    0x23,
-    0xf3,
-    0x1a,
-    0x14,
-    0x49,
-    0xee,
-    0x23,
-    0x44,
-    0x13,
-    0xc0,
-    0x5b,
-    0xd6,
-    0xf1,
-    0xad,
-    0x40,
-    0x5c,
-    0xfb,
-    0xfa,
-    0x58,
-    0x59,
-    0x7a,
-    0x5d,
-    0xd0,
-    0x53,
-    0xaa,
-    0xb2,
-    0x62,
-    0x29,
-    0xbe,
-    0xef,
-    0x7c,
-    0xa7,
-    0x25,
-    0x5a,
-    0x9e,
-    0x58,
-    0x0c,
-    0xfa,
-    0x03,
-    0x9b,
-    0x24,
-    0x4b,
-    0x85,
-    0xf9,
-    0xa5,
-    0x36,
-    0xbb,
-    0xb6,
-    0x93,
-    0x3f,
-    0x64,
-    0xa6,
-    0x40,
-    0x01,
-    0x08,
-    0x42,
-    0x12,
-    0xd7,
-    0xdc,
-    0xfb,
-    0x86,
-    0xdd,
-    0xe7,
-    0xcf,
-    0x75,
-    0x17,
-    0x63,
-    0x19,
-    0x96,
-    0xef,
-    0x66,
-    0xad,
-    0x45,
-    0xe5,
-    0xc1,
-    0x24,
-    0x82,
-    0x82,
-    0x28,
-    0x75,
-    0x3d,
-    0x8d,
-    0x94,
-    0xc6,
-    0xd1,
-    0x82,
-    0xe6,
-    0x81,
-    0xce,
-    0x40,
-    0xcd,
-    0xa9,
-    0xfb,
-    0x02,
-    0xe9,
-    0x6f,
-    0x9b,
-    0x90,
-    0x31,
-    0x00,
-    0xf0,
-    0xb7,
-    0x92,
-    0xa2,
-    0xfe,
-    0xf6,
-    0xd8,
-    0xff,
-    0x91,
-    0x7a,
-    0xd2,
-    0xc0,
-    0x81,
-    0x4d,
-    0xb1,
-    0x5e,
-    0x35,
-    0xca,
-    0xb2,
-    0x35,
-    0x66,
-    0x54,
-    0xfd,
-    0xdb,
-    0x25,
-    0x47,
-    0xcc,
-    0xaf,
-    0x20,
-    0x2f,
-    0xcf,
-    0xb5,
-    0x21,
-    0x38,
-    0xd0,
-    0xa1,
-    0xd7,
-    0xe6,
-    0x93,
-    0x31,
-    0xd9,
-    0x06,
-    0x00,
-    0xc0,
-    0xe8,
-    0xe5,
-    0x83,
-    0x19,
-    0x74,
-    0xbf,
-    0xb4,
-    0x89,
-    0x62,
-    0x7a,
-    0x33,
-    0x38,
-    0x0d,
-    0x94,
-    0xd6,
-    0xb8,
-    0x8b,
-    0x5b,
-    0x07,
-    0xdf,
-    0x31,
-    0x5c,
-    0x67,
-    0xd2,
-    0x59,
-    0x1d,
-    0xb8,
-    0x63,
-    0x62,
-    0x0f,
-    0xf9,
-    0x9d,
-    0xf9,
-    0xbe,
-    0xd2,
-    0x9c,
-    0x97,
-    0x4b,
-    0x33,
-    0xa3,
-    0x4b,
-    0x1c,
-    0x39,
-    0x68,
-    0xba,
-    0xd2,
-    0x51,
-    0xb2,
-    0x64,
-    0x7b,
-    0x9f,
-    0x26,
-    0x29,
-    0x09,
-    0xa1,
-    0x5e,
-    0x0b,
-    0x04,
-    0x0f,
-    0x3c,
-    0x35,
-    0x7b,
-    0x06,
-    0x7e,
-    0x3d,
-    0x40,
-    0x66,
-    0x92,
-    0xa6,
-    0x55,
-    0x79,
-    0xab,
-    0xa9,
-    0xa1,
-    0xd5,
-    0x14,
-    0x34,
-    0xe7,
-    0x83,
-    0xc5,
-    0x34,
-    0xf9,
-    0x60,
-    0x34,
-    0x10,
-    0x29,
-    0xc4,
-    0x6d,
-    0x75,
-    0x01,
-    0x62,
-    0x65,
-    0x59,
-    0x34,
-    0x6f,
-    0x8b,
-    0x3a,
-    0xd3,
-    0x07,
-    0xa1,
-    0xa7,
-    0xc4,
-    0xcc,
-    0xca,
-    0x02,
-    0x71,
-    0xd0,
-    0xe4,
-    0x84,
-    0xbd,
-    0xb5,
-    0x17,
-    0x81,
-    0x3c,
-    0x12,
-    0xae,
-    0xee,
-    0xa3,
-    0x19,
-    0x26,
-    0x20,
-    0x7d,
-    0x77,
-    0x85,
-    0xd6,
-    0x20,
-    0x7c,
-    0xee,
-    0x7a,
-    0xe0,
-    0x7c,
-    0x71,
-    0xa4,
-    0x82,
-    0x75,
-    0x27,
-    0xe0,
-    0xf4,
-    0xf1,
-    0x7f,
-    0xb1,
-    0x3b,
-    0x2e,
-    0xd3,
-    0xd6,
-    0xac,
-    0x7d,
-    0x3f,
-    0xcb,
-    0x5f,
-    0xe8,
-    0xb2,
-    0x93,
-    0xe1,
-    0x17,
-    0x45,
-    0xb5,
-    0x29,
-    0x75,
-    0xcc,
-    0x85,
-    0xcd,
-    0x8e,
-    0xab,
-    0xa4,
-    0x76,
-    0xbb,
-    0xec,
-    0xca,
-    0x92,
-    0x02,
-    0x8e,
-    0xc3,
-    0x48,
-    0x38,
-    0x1f,
-    0xb8,
-    0xb1,
-    0x68,
-    0x8d,
-    0xb0,
-    0x45,
-    0x79,
-    0x39,
-    0x56,
-    0x93,
-    0x0a,
-    0x4d,
-    0xfd,
-    0x36,
-    0xa1,
-    0x50,
-    0xe1,
-    0x04,
-    0x05,
-    0xf7,
-    0xb0,
-    0x88,
-    0xe8,
-    0x3e,
-    0x49,
-    0xb3,
-    0xc9,
-    0xb8,
-    0xc3,
-    0xce,
-    0x19,
-    0x23,
-    0xb1,
-    0xb3,
-    0x9d,
-    0x40,
-    0xa4,
-    0x3d,
-    0x13,
-    0xe2,
-    0xf2,
-    0xfd,
-    0x18,
-    0x44,
-    0xb6,
-    0x2e,
-    0x49,
-    0x9f,
-    0x18,
-    0xeb,
-    0xa9,
-    0xfc,
-    0xcf,
-    0xa0,
-    0x43,
-    0x47,
-    0xe4,
-    0xbf,
-    0x10,
-    0xa6,
-    0xb8,
-    0xb4,
-    0x1a,
-    0x09,
-    0x48,
-    0x1a,
-    0xe2,
-    0x01,
-    0xb0,
-    0x2f,
-    0xff,
-    0xd5,
-    0xee,
-    0x85,
-    0x09,
-    0xd3,
-    0xe9,
-    0xfb,
-    0xb5,
-    0xe4,
-    0xb2,
-    0xec,
-    0x41,
-    0x63,
-    0x09,
-    0xa6,
-    0x13,
-    0x2f,
-    0x23,
-    0x1e,
-    0x9d,
-    0xff,
-    0xaa,
-    0xe2,
-    0x83,
-    0xf6,
-    0x06,
-    0x4e,
-    0x00,
-    0x78,
-    0xdb,
-    0x03,
-    0x86,
-    0x3b,
-    0xd2,
-    0x95,
-    0xa4,
-    0xa1,
-    0x9d,
-    0x84,
-    0x2d,
-    0x45,
-    0x35,
-    0x6e,
-    0x97,
-    0xd3,
-    0x66,
-    0x82,
-    0xa1,
-    0x1e,
-    0x8e,
-    0x38,
-    0x38,
-    0x6c,
-    0xa2,
-    0x3f,
-    0x9c,
-    0x14,
-    0x71,
-    0xb7,
-    0xbf,
-    0x4c,
-    0x2d,
-    0xa1,
-    0xee,
-    0x3c,
-    0x27,
-    0x94,
-    0xb2,
-    0x57,
-    0xda,
-    0xb1,
-    0xf9,
-    0xea,
-    0x2b,
-    0xd9,
-    0x71,
-    0xf5,
-    0xef,
-    0x1d,
-    0x35,
-    0x3b,
-    0xae,
-    0x75,
-    0xab,
-    0x95,
-    0xa6,
-    0xb5,
-    0xac,
-    0x8b,
-    0x13,
-    0xbe,
-    0xe6,
-    0x25,
-    0xae,
-    0xf1,
-    0x7f,
-    0xff,
-    0x74,
-    0xea,
-    0xfb,
-    0x9c,
-    0xa8,
-    0x6a,
-    0x60,
-    0xfc,
-    0x1b,
-    0x94,
-    0x98,
-    0x71,
-    0xab,
-    0x5d,
-    0x16,
-    0xae,
-    0x0a,
-    0x3e,
-    0xbd,
-    0x21,
-    0xc1,
-    0x2b,
-    0xfd,
-    0x83,
-    0x74,
-    0xc9,
-    0x3f,
-    0xad,
-    0x67,
-    0xdc,
-    0x83,
-    0xad,
-    0x41,
-    0xfe,
-    0x47,
-    0x19,
-    0x10,
-    0x97,
-    0xab,
-    0xa3,
-    0x8e,
-    0x09,
-    0xd4,
-    0xee,
-    0xa3,
-    0x2b,
-    0x8e,
-    0xa0,
-    0x2a,
-    0xf9,
-    0x35,
-    0xb9,
-    0xf8,
-    0x8a,
-    0xd5,
-    0x23,
-    0x1a,
-    0x42,
-    0x90,
-    0x89,
-    0x5f,
-    0x48,
-    0x40,
-    0x6d,
-    0x17,
-    0x3a,
-    0x5e,
-    0x75,
-    0x19,
-    0x20,
-    0x23,
-    0x06,
-    0x0b,
-    0x9f,
-    0xec,
-    0x14,
-    0xdd,
-    0x70,
-    0xe3,
-    0x39,
-    0x97,
-    0x10,
-    0xdc,
-    0x04,
-    0x55,
-    0xb8,
-    0x7d,
-    0x93,
-    0x8f,
-    0x8f,
-    0xa2,
-    0x64,
-    0x9e,
-    0x1f,
-    0xff,
-    0x68,
-    0x7c,
-    0x05,
-    0x08,
-    0x59,
-    0xcc,
-    0xed,
-    0x0d,
-    0x4e,
-    0x1a,
-    0xbe,
-    0xaa,
-    0x8d,
-    0x63,
-    0x12,
-    0x5e,
-    0xa0,
-    0xd8,
-    0xe9,
-    0x7a,
-    0xab,
-    0xdf,
-    0x9e,
-    0x3d,
-    0xfc,
-    0x5b,
-    0x1a,
-    0x3d,
-    0xe4,
-    0x2d,
-    0x47,
-    0x08,
-    0xc5,
-    0xfb,
-    0xc7,
-    0x0c,
-    0x6d,
-    0x2f,
-    0xe7,
-    0xb4,
-    0xa2,
-    0x43,
-    0xce,
-    0xd4,
-    0xfe,
-    0x3d,
-    0xfb,
-    0x47,
-    0xfe,
-    0x75,
-    0xee,
-    0xd7,
-    0x55,
-    0x9e,
-    0x24,
-    0x5c,
-    0x86,
-    0x04,
-    0x49,
-    0x28,
-    0xb1,
-    0x13,
-    0xaa,
-    0xa3,
-    0xad,
-    0x19,
-    0xe9,
-    0x33,
-    0x58,
-    0x4d,
-    0xf4,
-    0x5f,
-    0x2b,
-    0x0f,
-    0x37,
-    0x33,
-    0x12,
-    0x71,
-    0x11,
-    0xe6,
-    0x7a,
-    0xf7,
-    0x85,
-    0xba,
-    0xab,
-    0x9b,
-    0x33,
-    0x24,
-    0x58,
-    0x14,
-    0x86,
-    0x2d,
-    0x74,
-    0x58,
-    0x2e,
-    0x18,
-    0x48,
-    0x60,
-    0xd1,
-    0x45,
-    0xc3,
-    0x2b,
-    0xfd,
-    0x55,
-    0x11,
-    0x05,
-    0x62,
-    0x8f,
-    0x6f,
-    0x09,
-    0x3e,
-    0x82,
-    0x3d,
-    0xe5,
-    0x18,
-    0xec,
-    0x54,
-    0xdd,
-    0xb1,
-    0xdb,
-    0x9b,
-    0x13,
-    0x38,
-    0x12,
-    0xd5,
-    0x05,
-    0xbd,
-    0xae,
-    0xbd,
-    0x57,
-    0xe8,
-    0x0a,
-    0x55,
-    0xd3,
-    0xeb,
-    0xdf,
-    0x7b,
-    0xae,
-    0xb5,
-    0xb0,
-    0xbd,
-    0x0c,
-    0x68,
-    0x65,
-    0x6e,
-    0xc7,
-    0x0e,
-    0x36,
-    0xf9,
-    0x6c,
-    0x88,
-    0xca,
-    0x76,
-    0x87,
-    0xc6,
-    0xa0,
-    0x7b,
-    0x21,
-    0x3e,
-    0xaf,
-    0x35,
-    0x86,
-    0x96,
-    0x49,
-    0xb7,
-    0x4c,
-    0xa4,
-    0x45,
-    0x91,
-    0x90,
-    0x99,
-    0x5d,
-    0xa5,
-    0x83,
-    0x79,
-    0xd5,
-    0x36,
-    0x26,
-    0xcf,
-    0x5e,
-    0x42,
-    0x51,
-    0x9e,
-    0x39,
-    0x12,
-    0xfa,
-    0x9a,
-    0x9f,
-    0x0f,
-    0xb4,
-    0x98,
-    0x61,
-    0xd7,
-    0x76,
-    0x44,
-    0xcc,
-    0x90,
-    0x9e,
-    0x12,
-    0xcf,
-    0x7d,
-    0x35,
-    0x77,
-    0x60,
-    0xce,
-    0x75,
-    0x58,
-    0x1b,
-    0xbd,
-    0x88,
-    0xc3,
-    0x2c,
-    0xd6,
-    0x93,
-    0xdd,
-    0x70,
-    0x96,
-    0xf3,
-    0x1b,
-    0xd7,
-    0x38,
-    0xc7,
-    0xb5,
-    0x0d,
-    0xcc,
-    0xae,
-    0x58,
-    0x59,
-    0x89,
-    0xd2,
-    0x1c,
-    0xc5,
-    0x64,
-    0x25,
-    0xb5,
-    0x7f,
-    0xe2,
-    0xea,
-    0xed,
-    0x7f,
-    0x2a,
-    0x78,
-    0x52,
-    0x6a,
-    0x5e,
-    0x3a,
-    0x2b,
-    0xb6,
-    0x2b,
-    0xfb,
-    0xb1,
-    0x10,
-    0x9f,
-    0x60,
-    0x7c,
-    0xfa,
-    0x3b,
-    0xb6,
-    0x3c,
-    0xb9,
-    0x4a,
-    0xee,
-    0xa9,
-    0x6e,
-    0x71,
-    0xe6,
-    0xbd,
-    0x83,
-    0x86,
-    0xeb,
-    0x20,
-    0x48,
-    0xa5,
-    0x7b,
-    0xe4,
-    0xde,
-    0x81,
-    0x4f,
-    0x72,
-    0x55,
-    0xf9,
-    0x99,
-    0xc4,
-    0x11,
-    0xec,
-    0x8a,
-    0xd5,
-    0x72,
-    0x4d,
-    0x17,
-    0x56,
-    0xb4,
-    0x7a,
-    0xfd,
-    0xa3,
-    0x13,
-    0xc9,
-    0x02,
-    0xf5,
-    0x33,
-    0x64,
-    0x7e,
-    0xd9,
-    0xc0,
-    0x58,
-    0x1b,
-    0xe1,
-    0x51,
-    0xe8,
-    0xd9,
-    0x99,
-    0x93,
-    0x27,
-    0x55,
-    0xbc,
-    0xa3,
-    0xc6,
-    0x4a,
-    0xa8,
-    0xbb,
-    0x2a,
-    0x58,
-    0x10,
-    0x11,
-    0xc1,
-    0x04,
-    0xf1,
-    0xfc,
-    0x97,
-    0x01,
-    0xc7,
-    0x59,
-    0x24,
-    0xae,
-    0x00,
-    0x2d,
-    0x69,
-    0xdf,
-    0xb1,
-    0x8c,
-    0x3b,
-    0xe0,
-    0x88,
-    0xb9,
-    0xde,
-    0xb7,
-    0x02,
-    0x8e,
-    0xd5,
-    0xaa,
-    0xdd,
-    0x1e,
-    0xf9,
-    0x01,
-    0xd1,
-    0x9a,
-    0xc9,
-    0x0d,
-    0x7b,
-    0x71,
-    0x01,
-    0x69,
-    0x9a,
-    0xbb,
-    0x6e,
-    0x80,
-    0x7d,
-    0xd8,
-    0x00,
-    0x4f,
-    0xbc,
-    0x54,
-    0x21,
-    0x6d,
-    0x27,
-    0x0e,
-    0x45,
-    0x48,
-    0xfc,
-    0x9a,
-    0xc2,
-    0xb1,
-    0x5d,
-    0xe3,
-    0xe3,
-    0x9b,
-    0x00,
-    0x15,
-    0x37,
-    0x1f,
-    0x29,
-    0xba,
-    0x2f,
-    0xc4,
-    0xd5,
-    0x23,
-    0xe8,
-    0xfe,
-    0x38,
-    0x09,
-    0x46,
-    0xf4,
-    0x6a,
-    0x74,
-    0x42,
-    0x86,
-    0x5e,
-    0xdc,
-    0x85,
-    0x8f,
-    0x13,
-    0x8e,
-    0x35,
-    0x67,
-    0x0e,
-    0x52,
-    0x0f,
-    0xad,
-    0x07,
-    0x4b,
-    0xb6,
-    0x43,
-    0xe3,
-    0x1e,
-    0x4a,
-    0x99,
-    0xe2,
-    0x57,
-    0x3d,
-    0x2f,
-    0x1a,
-    0x08,
-    0x62,
-    0x55,
-    0x24,
-    0xb2,
-    0x47,
-    0x36,
-    0x15,
-    0x69,
-    0xc5,
-    0x14,
-    0xaf,
-    0x34,
-    0xd5,
-    0xd5,
-    0xd9,
-    0xb3,
-    0xa5,
-    0xbf,
-    0x4d,
-    0x04,
-    0xec,
-    0x80,
-    0x91,
-    0xe6,
-    0x7a,
-    0x71,
-    0x28,
-    0x1f,
-    0x13,
-    0x1b,
-    0x09,
-    0x1c,
-    0x7d,
-    0xfb,
-    0x50,
-    0xd8,
-    0xd8,
-    0x82,
-    0x34,
-    0xff,
-    0x2e,
-    0x60,
-    0x39,
-    0x52,
-    0x4b,
-    0x02,
-    0xa6,
-    0x4d,
-    0xcf,
-    0x59,
-    0x3a,
-    0x07,
-    0x81,
-    0xde,
-    0x1b,
-    0x5b,
-    0xe6,
-    0xd3,
-    0x0f,
-    0x45,
-    0x13,
-    0xcb,
-    0xee,
-    0x8e,
-    0xbf,
-    0x6c,
-    0x58,
-    0xac,
-    0x9c,
-    0x74,
-    0xa3,
-    0xe4,
-    0xe8,
-    0xfa,
-    0x17,
-    0xb1,
-    0x3e,
-    0xf7,
-    0x5e,
-    0x69,
-    0xb3,
-    0x04,
-    0x36,
-    0x1e,
-    0x1e,
-    0x65,
-    0x69,
-    0xc2,
-    0xb7,
-    0x47,
-    0xff,
-    0x8f,
-    0xe4,
-    0x46,
-    0xb2,
-    0xa6,
-    0x4f,
-    0x32,
-    0xa2,
-    0xf7,
-    0x3c,
-    0x13,
-    0x4a,
-    0x60,
-    0x1a,
-    0x6a,
-    0xb3,
-    0x19,
-    0x57,
-    0xba,
-    0xe7,
-    0x4f,
-    0x79,
-    0x47,
-    0xa9,
-    0x0f,
-    0x6b,
-    0x1e,
-    0x63,
-    0x66,
-    0x14,
-    0x55,
-    0x60,
-    0xc7,
-    0x2e,
-    0x94,
-    0x3b,
-    0xac,
-    0x56,
-    0xd5,
-    0x98,
-    0x80,
-    0x5f,
-    0x67,
-    0x11,
-    0xbd,
-    0xec,
-    0x39,
-    0x74,
-    0x52,
-    0x3e,
-    0x55,
-    0x2b,
-    0x47,
-    0x4a,
-    0xab,
-    0xfb,
-    0xa3,
-    0x0f,
-    0x10,
-    0xf2,
-    0x8e,
-    0x26,
-    0x86,
-    0x9a,
-    0xb3,
-    0x9b,
-    0xbe,
-    0x73,
-    0xe8,
-    0xfb,
-    0xdb,
-    0xa0,
-    0x11,
-    0xae,
-    0x79,
-    0xe1,
-    0x41,
-    0x87,
-    0xee,
-    0xc1,
-    0x23,
-    0x9a,
-    0xcf,
-    0x11,
-    0x99,
-    0x4e,
-    0xb7,
-    0x94,
-    0xa2,
-    0xb3,
-    0x43,
-    0xfc,
-    0x81,
-    0x15,
-    0x61,
-    0x15,
-    0x1c,
-    0xd1,
-    0xcb,
-    0x41,
-    0xa2,
-    0x67,
-    0xce,
-    0x24,
-    0x70,
-    0xd1,
-    0x50,
-    0xa0,
-    0x36,
-    0x13,
-    0x11,
-    0x04,
-    0x55,
-    0x14,
-    0x31,
-    0x80,
-    0x8c,
-    0xac,
-    0xf3,
-    0xdd,
-    0xd4,
-    0xfe,
-    0xc0,
-    0x6a,
-    0x88,
-    0x08,
-    0x6f,
-    0x3a,
-    0xc9,
-    0x78,
-    0xc3,
-    0x8c,
-    0x21,
-    0xc1,
-    0x35,
-    0x8b,
-    0x66,
-    0x6f,
-    0xf4,
-    0x38,
-    0xe2,
-    0xb7,
-    0x2b,
-    0xa4,
-    0xb0,
-    0x53,
-    0x82,
-    0x62,
-    0x69,
-    0x8d,
-    0xe7,
-    0x3c,
-    0x01,
-    0x99,
-    0x8e,
-    0x25,
-    0xeb,
-    0x27,
-    0x36,
-    0x6f,
-    0x84,
-    0x39,
-    0xaf,
-    0x3e,
-    0xae,
-    0x32,
-    0x99,
-    0x3d,
-    0xbb,
-    0x30,
-    0x6e,
-    0x8f,
-    0x8e,
-    0x9c,
-    0xc3,
-    0x09,
-    0xfc,
-    0x00,
-    0xca,
-    0x9e,
-    0x78,
-    0x18,
-    0x1c,
-    0x1a,
-    0xf0,
-    0x2b,
-    0xb5,
-    0x14,
-    0xf2,
-    0x9b,
-    0x40,
-    0x1d,
-    0x13,
-    0xbc,
-    0x96,
-    0x3e,
-    0x91,
-    0xe2,
-    0x81,
-    0xa2,
-    0x37,
-    0xbe,
-    0xc5,
-    0x8f,
-    0x81,
-    0xea,
-    0x61,
-    0x9b,
-    0x01,
-    0xc2,
-    0x12,
-    0x1c,
-    0x01,
-    0x76,
-    0x19,
-    0xe0,
-    0x6a,
-    0x5d,
-    0x3e,
-    0x1e,
-    0xe5,
-    0x8c,
-    0x15,
-    0xad,
-    0x3f,
-    0xa8,
-    0x80,
-    0x74,
-    0x12,
-    0xf8,
-    0x75,
-    0x22,
-    0xa2,
-    0xbe,
-    0x01,
-    0x1f,
-    0x05,
-    0xc8,
-    0x8d,
-    0xc2,
-    0x87,
-    0x42,
-    0x61,
-    0xc4,
-    0x4c,
-    0xce,
-    0x66,
-    0xf4,
-    0x37,
-    0xd7,
-    0x30,
-    0x2d,
-    0x0b,
-    0x21,
-    0x3b,
-    0x85,
-    0xd0,
-    0xa5,
-    0x75,
-    0xc8,
-    0x79,
-    0x9d,
-    0xfd,
-    0x25,
-    0xc3,
-    0xdb,
-    0x2b,
-    0x26,
-    0x60,
-    0x5e,
-    0xd0,
-    0xe6,
-    0x55,
-    0x27,
-    0xbf,
-    0x7e,
-    0xa1,
-    0x49,
-    0x8c,
-    0xc0,
-    0x1f,
-    0x40,
-    0x93,
-    0x28,
-    0xad,
-    0x83,
-    0x3c,
-    0x0f,
-    0x8e,
-    0x5d,
-    0x7e,
-    0x22,
-    0x0d,
-    0xf8,
-    0xa2,
-    0x13,
-    0x63,
-    0xbb,
-    0x4a,
-    0x8e,
-    0xdb,
-    0xd5,
-    0xb1,
-    0x6f,
-    0x34,
-    0x1a,
-    0x34,
-    0x32,
-    0x47,
-    0x0f,
-    0x12,
-    0xaa,
-    0xea,
-    0x40,
-    0x70,
-    0xf6,
-    0x13,
-    0xda,
-    0xa0,
-    0xb2,
-    0x41,
-    0x75,
-    0xa2,
-    0x6a,
-    0x17,
-    0x32,
-    0xeb,
-    0x54,
-    0x4a,
-    0x06,
-    0x66,
-    0x3e,
-    0xbe,
-    0x55,
-    0xb9,
-    0xc5,
-    0xec,
-    0xc3,
-    0xc9,
-    0xc8,
-    0x87,
-    0x47,
-    0x80,
-    0x1c,
-    0x5f,
-    0x81,
-    0xce,
-    0x81,
-    0x85,
-    0x4d,
-    0xed,
-    0xd5,
-    0xb0,
-    0x98,
-    0xea,
-    0x88,
-    0xdf,
-    0x72,
-    0x61,
-    0x50,
-    0x40,
-    0x65,
-    0x88,
-    0x1e,
-    0x51,
-    0x05,
-    0x6e,
-    0x50,
-    0x45,
-    0xc9,
-    0x85,
-    0x28,
-    0xa9,
-    0x19,
-    0x5f,
-    0x7d,
-    0x47,
-    0xa8,
-    0xb5,
-    0xb0,
-    0x4b,
-    0x04,
-    0xad,
-    0xe2,
-    0xa4,
-    0x6c,
-    0x5c,
-    0x64,
-    0xad,
-    0xe1,
-    0x8a,
-    0x6f,
-    0x0d,
-    0x7f,
-    0xb6,
-    0x16,
-    0xdc,
-    0x0e,
-    0x5a,
-    0x78,
-    0x07,
-    0xd5,
-    0x71,
-    0x3a,
-    0xf5,
-    0xae,
-    0x35,
-    0x35,
-    0x6a,
-    0x60,
-    0x2d,
-    0x6b,
-    0xac,
-    0x28,
-    0x67,
-    0x40,
-    0xe5,
-    0x99,
-    0x03,
-    0xe7,
-    0xc9,
-    0xa7,
-    0xf1,
-    0x1a,
-    0x78,
-    0xfe,
-    0xfa,
-    0x0e,
-    0xa6,
-    0x98,
-    0x05,
-    0xa6,
-    0xf9,
-    0x8e,
-    0x93,
-    0xe7,
-    0xb2,
-    0x2e,
-    0x8d,
-    0xac,
-    0x90,
-    0x4f,
-    0x3f,
-    0x9a,
-    0xf1,
-    0xe1,
-    0xa4,
-    0x57,
-    0x3b,
-    0xc8,
-    0xe4,
-    0xf7,
-    0x7a,
-    0xeb,
-    0x1b,
-    0xb7,
-    0x4b,
-    0x87,
-    0x5c,
-    0xee,
-    0xf8,
-    0xca,
-    0xf6,
-    0x40,
-    0xe4,
-    0x9d,
-    0xf5,
-    0x15,
-    0x2a,
-    0xc1,
-    0xec,
-    0x49,
-    0x81,
-    0x1d,
-    0xf2,
-    0x26,
-    0x63,
-    0x56,
-    0xeb,
-    0x8f,
-    0x6e,
-    0xa1,
-    0x09,
-    0x7d,
-    0x0a,
-    0xd5,
-    0x92,
-    0xb0,
-    0x4c,
-    0xc5,
-    0xe3,
-    0x9e,
-    0x1a,
-    0xcc,
-    0xb5,
-    0xb0,
-    0x90,
-    0xa9,
-    0x9f,
-    0xad,
-    0xa3,
-    0x8d,
-    0xdc,
-    0x76,
-    0x04,
-    0x73,
-    0x4f,
-    0xf5,
-    0x47,
-    0xb0,
-    0xc4,
-    0x50,
-    0x45,
-    0xcb,
-    0x79,
-    0x62,
-    0xbf,
-    0x8e,
-    0xdd,
-    0x6b,
-    0x44,
-    0x5d,
-    0x97,
-    0x06,
-    0x54,
-    0xc7,
-    0xca,
-    0x5c,
-    0xc5,
-    0x5b,
-    0x97,
-    0x98,
-    0x66,
-    0xbd,
-    0xe4,
-    0x9b,
-    0xe3,
-    0xf9,
-    0x5c,
-    0xf0,
-    0xe8,
-    0x16,
-    0xb7,
-    0x02,
-    0x89,
-    0xef,
-    0x3c,
-    0x8c,
-    0xe2,
-    0x3e,
-    0x84,
-    0x52,
-    0xfa,
-    0xfa,
-    0x80,
-    0x0f,
-    0xee,
-    0xe3,
-    0xbe,
-    0xae,
-    0x4b,
-    0x5b,
-    0xe7,
-    0xbc,
-    0xbb,
-    0x77,
-    0x8d,
-    0x1e,
-    0xe4,
-    0x56,
-    0x23,
-    0xff,
-    0x8d,
-    0xb1,
-    0x4d,
-    0x0d,
-    0x02,
-    0xb4,
-    0x5b,
-    0xe5,
-    0xba,
-    0x0c,
-    0x0f,
-    0xcb,
-    0x38,
-    0x42,
-    0xa7,
-    0x9f,
-    0x2f,
-    0x47,
-    0x17,
-    0x0c,
-    0xe9,
-    0x50,
-    0x97,
-    0x03,
-    0xe9,
-    0xe3,
-    0x5d,
-    0x68,
-    0xd0,
-    0x32,
-    0xac,
-    0x0b,
-    0x7d,
-    0xa9,
-    0x0d,
-    0xd9,
-    0x78,
-    0xc3,
-    0xdd,
-    0x54,
-    0x91,
-    0x21,
-    0x07,
-    0x40,
-    0xc4,
-    0xdd,
-    0x13,
-    0x9f,
-    0x60,
-    0x1c,
-    0x60,
-    0xe0,
-    0x69,
-    0xe2,
-    0xad,
-    0x54,
-    0x3a,
-    0x2b,
-    0xde,
-    0xe1,
-    0x6e,
-    0x37,
-    0xfd,
-    0xfa,
-    0x01,
-    0x25,
-    0x80,
-    0xce,
-    0xb3,
-    0xc3,
-    0xca,
-    0xc0,
-    0xad,
-    0xa5,
-    0xf4,
-    0x18,
-    0x67,
-    0x74,
-    0xcc,
-    0xf8,
-    0xc9,
-    0x89,
-    0x1e,
-    0x91,
-    0x91,
-    0xba,
-    0x33,
-    0x96,
-    0xf4,
-    0x74,
-    0x98,
-    0xf1,
-    0x88,
-    0x0b,
-    0x20,
-    0xb6,
-    0x61,
-    0x4d,
-    0x2c,
-    0x55,
-    0x7a,
-    0x5d,
-    0x2a,
-    0x13,
-    0x57,
-    0xbf,
-    0x5c,
-    0xbb
-  ],
-  const [
-    0x59,
-    0x5f,
-    0x40,
-    0xb0,
-    0x57,
-    0xef,
-    0x2d,
-    0x4f,
-    0x87,
-    0x74,
-    0xa2,
-    0x28,
-    0x99,
-    0xac,
-    0xf2,
-    0x8d,
-    0xa1,
-    0x29,
-    0xfa,
-    0x40,
-    0x6d,
-    0x53,
-    0x0c,
-    0x94,
-    0x16,
-    0xb0,
-    0x2c,
-    0xce,
-    0xd6,
-    0x63,
-    0x7f,
-    0xd1,
-    0x19,
-    0xf3,
-    0x00,
-    0xfb,
-    0xd7,
-    0x4e,
-    0x75,
-    0x4a,
-    0x20,
-    0x0e,
-    0xa2,
-    0xc3,
-    0xf9,
-    0xfa,
-    0xbc,
-    0x14,
-    0x66,
-    0xd0,
-    0x20,
-    0x78,
-    0xc8,
-    0x42,
-    0x45,
-    0xdb,
-    0x69,
-    0x3e,
-    0xef,
-    0x3f,
-    0x56,
-    0x72,
-    0xa6,
-    0x5e,
-    0x6d,
-    0x10,
-    0x67,
-    0x90,
-    0xb6,
-    0xce,
-    0x99,
-    0xf0,
-    0xf7,
-    0x32,
-    0x42,
-    0xba,
-    0x82,
-    0x0c,
-    0x7b,
-    0xf8,
-    0x52,
-    0x44,
-    0x22,
-    0x5e,
-    0x56,
-    0xd5,
-    0xce,
-    0x72,
-    0x0d,
-    0x1a,
-    0x08,
-    0xf0,
-    0x53,
-    0x49,
-    0xb8,
-    0x6c,
-    0x7b,
-    0x3d,
-    0xdd,
-    0x39,
-    0x9d,
-    0x78,
-    0x81,
-    0x8a,
-    0x31,
-    0x68,
-    0xed,
-    0xd7,
-    0xdd,
-    0xe9,
-    0x19,
-    0x82,
-    0x8c,
-    0x0c,
-    0x66,
-    0xbb,
-    0xc0,
-    0x16,
-    0x8f,
-    0xa1,
-    0x29,
-    0xcc,
-    0xdd,
-    0xa9,
-    0x76,
-    0xee,
-    0x9b,
-    0x44,
-    0x6b,
-    0x02,
-    0xca,
-    0xbc,
-    0x34,
-    0x52,
-    0x16,
-    0x5f,
-    0xf9,
-    0x38,
-    0x08,
-    0xe0,
-    0xb2,
-    0x99,
-    0x7c,
-    0xfa,
-    0x3d,
-    0xb0,
-    0x56,
-    0x56,
-    0xad,
-    0x0d,
-    0x71,
-    0xaf,
-    0xe6,
-    0xdd,
-    0xd8,
-    0x34,
-    0x67,
-    0x6b,
-    0x39,
-    0x2e,
-    0x66,
-    0xe7,
-    0x96,
-    0xe2,
-    0x22,
-    0x67,
-    0x3e,
-    0xb9,
-    0x75,
-    0x2b,
-    0xfc,
-    0x9e,
-    0xa8,
-    0x25,
-    0x8e,
-    0xa8,
-    0x8c,
-    0xb8,
-    0x58,
-    0xf9,
-    0xc6,
-    0xc1,
-    0x5a,
-    0xe6,
-    0x6b,
-    0xd4,
-    0x60,
-    0x58,
-    0xcd,
-    0xc8,
-    0x78,
-    0x71,
-    0x94,
-    0x75,
-    0xa9,
-    0x73,
-    0x10,
-    0xbc,
-    0xe2,
-    0xde,
-    0xcd,
-    0xc8,
-    0x31,
-    0xd9,
-    0x68,
-    0x94,
-    0x35,
-    0xd3,
-    0xa2,
-    0xad,
-    0xd6,
-    0x6a,
-    0xb3,
-    0x3a,
-    0x33,
-    0x8c,
-    0xe1,
-    0x39,
-    0xdc,
-    0xdc,
-    0x50,
-    0x0b,
-    0x42,
-    0x57,
-    0x1c,
-    0x33,
-    0x6c,
-    0x37,
-    0xa5,
-    0x5b,
-    0xeb,
-    0x17,
-    0x2a,
-    0x97,
-    0x0f,
-    0x59,
-    0x9a,
-    0xee,
-    0x5b,
-    0xc5,
-    0xa6,
-    0x17,
-    0x37,
-    0x72,
-    0x1b,
-    0x80,
-    0xe5,
-    0xea,
-    0x6f,
-    0x95,
-    0xb6,
-    0x89,
-    0x99,
-    0x3e,
-    0x7e,
-    0x26,
-    0x26,
-    0xa9,
-    0x45,
-    0xf6,
-    0x8a,
-    0x4b,
-    0x3f,
-    0xac,
-    0xb4,
-    0x21,
-    0xff,
-    0xe5,
-    0xe5,
-    0x3c,
-    0xe7,
-    0xc4,
-    0xc1,
-    0x7c,
-    0xe3,
-    0xd9,
-    0xa7,
-    0x9c,
-    0x57,
-    0x48,
-    0x3e,
-    0x6e,
-    0x55,
-    0x27,
-    0x50,
-    0x68,
-    0x14,
-    0x27,
-    0xdc,
-    0x60,
-    0x9d,
-    0x77,
-    0x66,
-    0x94,
-    0xc8,
-    0xe5,
-    0x92,
-    0xed,
-    0x67,
-    0x47,
-    0xf1,
-    0x85,
-    0xc1,
-    0x19,
-    0x1b,
-    0x66,
-    0x42,
-    0x67,
-    0xfe,
-    0x95,
-    0x70,
-    0xee,
-    0x75,
-    0x4f,
-    0x21,
-    0x7e,
-    0x1d,
-    0x92,
-    0xeb,
-    0xa2,
-    0x64,
-    0xdf,
-    0xdd,
-    0x83,
-    0xe2,
-    0x3f,
-    0x6c,
-    0x0a,
-    0xed,
-    0x84,
-    0xb0,
-    0x45,
-    0x67,
-    0xd1,
-    0xd1,
-    0x0c,
-    0xdb,
-    0x5c,
-    0xbc,
-    0xe4,
-    0xc8,
-    0x73,
-    0x1a,
-    0x23,
-    0x3d,
-    0xbd,
-    0x82,
-    0x55,
-    0xa6,
-    0xc3,
-    0xed,
-    0xdf,
-    0xe6,
-    0xae,
-    0x6b,
-    0xe2,
-    0xa6,
-    0x52,
-    0x15,
-    0x62,
-    0xec,
-    0x6c,
-    0x43,
-    0xa8,
-    0xef,
-    0x28,
-    0xff,
-    0xe4,
-    0x2a,
-    0xe7,
-    0xb9,
-    0x17,
-    0xaf,
-    0x3e,
-    0x3c,
-    0x30,
-    0xbe,
-    0x42,
-    0xe0,
-    0x75,
-    0x96,
-    0x03,
-    0x01,
-    0x25,
-    0x8b,
-    0x56,
-    0xb1,
-    0x5c,
-    0x59,
-    0xd8,
-    0xaa,
-    0x36,
-    0xb8,
-    0x2f,
-    0x86,
-    0x37,
-    0x30,
-    0x93,
-    0x33,
-    0xeb,
-    0x2f,
-    0x8e,
-    0xa1,
-    0xc9,
-    0x59,
-    0xff,
-    0xbd,
-    0x5d,
-    0x1f,
-    0x65,
-    0xa3,
-    0xa7,
-    0x93,
-    0x5a,
-    0x0f,
-    0xbe,
-    0x7a,
-    0x5e,
-    0x15,
-    0xb8,
-    0xa3,
-    0xd6,
-    0x13,
-    0xce,
-    0x78,
-    0x54,
-    0xe3,
-    0xbc,
-    0xd3,
-    0x19,
-    0x55,
-    0x67,
-    0x13,
-    0xd9,
-    0xdc,
-    0xc2,
-    0x6e,
-    0xbe,
-    0x87,
-    0xf2,
-    0x89,
-    0xaf,
-    0x33,
-    0xb1,
-    0x45,
-    0xd1,
-    0x00,
-    0xf0,
-    0xdc,
-    0x4e,
-    0x01,
-    0xc0,
-    0x2e,
-    0x56,
-    0x38,
-    0x72,
-    0x55,
-    0x64,
-    0xc1,
-    0xfd,
-    0x7f,
-    0xc3,
-    0x4d,
-    0xa1,
-    0xfd,
-    0x50,
-    0xd2,
-    0xca,
-    0x97,
-    0x81,
-    0x81,
-    0x37,
-    0x23,
-    0xa6,
-    0xf9,
-    0x5b,
-    0x56,
-    0x6f,
-    0xba,
-    0x04,
-    0xd9,
-    0xaf,
-    0xdc,
-    0x3a,
-    0x9f,
-    0x5f,
-    0x01,
-    0x6a,
-    0x77,
-    0xe6,
-    0x88,
-    0xc4,
-    0xdd,
-    0x98,
-    0x03,
-    0xe1,
-    0x16,
-    0x7c,
-    0xeb,
-    0xa9,
-    0x7c,
-    0x52,
-    0x93,
-    0x74,
-    0x16,
-    0xd4,
-    0x5b,
-    0x6f,
-    0x6b,
-    0x3d,
-    0x26,
-    0x42,
-    0x98,
-    0x08,
-    0x0e,
-    0xef,
-    0xa1,
-    0xfa,
-    0x56,
-    0xfd,
-    0x05,
-    0x62,
-    0x9f,
-    0xd7,
-    0x95,
-    0xa0,
-    0x5f,
-    0x6f,
-    0x85,
-    0xe4,
-    0x90,
-    0x26,
-    0xc4,
-    0x38,
-    0xa5,
-    0xf0,
-    0x89,
-    0xc1,
-    0xc2,
-    0xb3,
-    0x2f,
-    0x41,
-    0x2c,
-    0xf1,
-    0x42,
-    0xe1,
-    0xff,
-    0xa7,
-    0xda,
-    0x2e,
-    0x1f,
-    0x75,
-    0x27,
-    0x61,
-    0x70,
-    0xfe,
-    0x4e,
-    0xe3,
-    0x4a,
-    0x92,
-    0x73,
-    0x10,
-    0x27,
-    0x0b,
-    0x17,
-    0x3c,
-    0x9f,
-    0xf4,
-    0xa5,
-    0xf3,
-    0x97,
-    0xf1,
-    0x47,
-    0x85,
-    0xb5,
-    0x5a,
-    0xfe,
-    0xc2,
-    0x17,
-    0x2a,
-    0xf2,
-    0x03,
-    0x44,
-    0x18,
-    0x07,
-    0x6a,
-    0x62,
-    0x03,
-    0xb0,
-    0x6a,
-    0xaa,
-    0x93,
-    0x08,
-    0x89,
-    0x1a,
-    0x1e,
-    0x1f,
-    0x64,
-    0x69,
-    0xc8,
-    0x91,
-    0xf4,
-    0x40,
-    0xef,
-    0x5e,
-    0x11,
-    0xa7,
-    0xc6,
-    0xf5,
-    0x34,
-    0xbe,
-    0x3f,
-    0x92,
-    0x81,
-    0xad,
-    0x2f,
-    0xca,
-    0x05,
-    0xdd,
-    0xad,
-    0x65,
-    0x3c,
-    0x69,
-    0xba,
-    0x6b,
-    0xd6,
-    0xcf,
-    0x28,
-    0x81,
-    0xba,
-    0xec,
-    0xb4,
-    0x76,
-    0x4c,
-    0x27,
-    0x76,
-    0x1a,
-    0xeb,
-    0xec,
-    0x7b,
-    0x4f,
-    0xbe,
-    0x5c,
-    0xb0,
-    0x62,
-    0xb1,
-    0x42,
-    0x01,
-    0x9b,
-    0xba,
-    0x49,
-    0xc3,
-    0x12,
-    0x61,
-    0x6d,
-    0x4f,
-    0xc5,
-    0x7f,
-    0xb0,
-    0xf0,
-    0xe8,
-    0x46,
-    0x0e,
-    0x00,
-    0x7c,
-    0x81,
-    0xb2,
-    0x4d,
-    0x23,
-    0x1d,
-    0x6a,
-    0xc2,
-    0x33,
-    0xe9,
-    0x59,
-    0x43,
-    0x09,
-    0x9a,
-    0xec,
-    0xd8,
-    0xa0,
-    0x12,
-    0x0f,
-    0x0e,
-    0x62,
-    0xe2,
-    0xa0,
-    0x9a,
-    0x3d,
-    0x0d,
-    0x23,
-    0x40,
-    0xfa,
-    0x0f,
-    0xb8,
-    0xf3,
-    0xca,
-    0x1d,
-    0x4b,
-    0x3e,
-    0x22,
-    0xaf,
-    0x0b,
-    0xe2,
-    0xc9,
-    0x3c,
-    0x1d,
-    0xc1,
-    0x30,
-    0x44,
-    0x91,
-    0xfa,
-    0x01,
-    0x94,
-    0x95,
-    0x56,
-    0xfa,
-    0xc6,
-    0xe8,
-    0xe3,
-    0xfc,
-    0x07,
-    0x92,
-    0xde,
-    0x5f,
-    0x1d,
-    0xd3,
-    0xd6,
-    0x89,
-    0xa8,
-    0x59,
-    0x0f,
-    0xbf,
-    0xa7,
-    0xb5,
-    0x25,
-    0x3a,
-    0x3f,
-    0x10,
-    0xf1,
-    0x7e,
-    0xb8,
-    0x1a,
-    0xb0,
-    0xe7,
-    0xc9,
-    0x44,
-    0x62,
-    0x85,
-    0x15,
-    0x2f,
-    0x71,
-    0x2a,
-    0xf5,
-    0x64,
-    0x93,
-    0xc0,
-    0x78,
-    0x45,
-    0xf1,
-    0xe0,
-    0xa8,
-    0x44,
-    0x89,
-    0xa1,
-    0x0f,
-    0x52,
-    0xd1,
-    0xae,
-    0x7a,
-    0x9a,
-    0x9d,
-    0x9c,
-    0xfd,
-    0x70,
-    0x42,
-    0x7a,
-    0x37,
-    0x84,
-    0xfc,
-    0xa9,
-    0xd7,
-    0x5c,
-    0x8d,
-    0xee,
-    0x5f,
-    0x01,
-    0x27,
-    0xc5,
-    0x29,
-    0xf8,
-    0x8c,
-    0xf8,
-    0xa7,
-    0x73,
-    0x74,
-    0x71,
-    0xee,
-    0xc9,
-    0x2f,
-    0x4c,
-    0x76,
-    0x24,
-    0x8b,
-    0x31,
-    0x1b,
-    0x79,
-    0xf8,
-    0xe1,
-    0x68,
-    0xbe,
-    0xea,
-    0x0e,
-    0x15,
-    0x57,
-    0x7f,
-    0x70,
-    0xce,
-    0xd1,
-    0x62,
-    0x15,
-    0x37,
-    0xd2,
-    0xef,
-    0xf9,
-    0x2c,
-    0x50,
-    0x98,
-    0xd6,
-    0x4d,
-    0x02,
-    0x87,
-    0x3d,
-    0xba,
-    0x14,
-    0x84,
-    0xe6,
-    0x1b,
-    0x1f,
-    0x1a,
-    0x45,
-    0xe4,
-    0x58,
-    0xf5,
-    0x5d,
-    0xd7,
-    0x08,
-    0x8f,
-    0xd9,
-    0xca,
-    0x3c,
-    0x0c,
-    0x59,
-    0xaa,
-    0xbd,
-    0x62,
-    0x0a,
-    0xc0,
-    0x42,
-    0xbc,
-    0x79,
-    0x33,
-    0xe5,
-    0x21,
-    0xa9,
-    0xce,
-    0xd4,
-    0x50,
-    0x63,
-    0x04,
-    0x49,
-    0xef,
-    0xcd,
-    0x31,
-    0xbc,
-    0xe5,
-    0x3e,
-    0x23,
-    0x57,
-    0x05,
-    0x51,
-    0xd9,
-    0xaa,
-    0xec,
-    0x38,
-    0x8a,
-    0xa0,
-    0x2c,
-    0x53,
-    0xea,
-    0xb1,
-    0xaa,
-    0x01,
-    0xa8,
-    0x5a,
-    0x44,
-    0xb7,
-    0x3b,
-    0xca,
-    0xb7,
-    0x4f,
-    0xde,
-    0xdf,
-    0xc0,
-    0xa2,
-    0xd9,
-    0x50,
-    0x82,
-    0x58,
-    0x03,
-    0x2c,
-    0x28,
-    0xff,
-    0x85,
-    0x83,
-    0xcb,
-    0x5b,
-    0xe0,
-    0x62,
-    0x96,
-    0xfd,
-    0x32,
-    0x05,
-    0x28,
-    0x17,
-    0xb5,
-    0x49,
-    0x39,
-    0x8f,
-    0x88,
-    0x60,
-    0x81,
-    0x52,
-    0xb2,
-    0xc8,
-    0xd5,
-    0xeb,
-    0x64,
-    0x7e,
-    0x94,
-    0x54,
-    0x7e,
-    0x6f,
-    0x41,
-    0x0c,
-    0x55,
-    0x2f,
-    0x71,
-    0x69,
-    0xb3,
-    0xed,
-    0xe8,
-    0x30,
-    0x20,
-    0xa7,
-    0xff,
-    0x63,
-    0x60,
-    0x9a,
-    0x49,
-    0x5a,
-    0x3d,
-    0xfd,
-    0x75,
-    0x15,
-    0x87,
-    0xee,
-    0x76,
-    0xd1,
-    0x58,
-    0xad,
-    0xe2,
-    0xd9,
-    0x9c,
-    0x08,
-    0x98,
-    0x9f,
-    0xd1,
-    0x16,
-    0xa6,
-    0x0b,
-    0x0c,
-    0x28,
-    0x6a,
-    0x13,
-    0x3d,
-    0xfd,
-    0xf7,
-    0x8c,
-    0xb3,
-    0x35,
-    0xb9,
-    0x40,
-    0xe3,
-    0x08,
-    0x5d,
-    0x40,
-    0x65,
-    0x38,
-    0xeb,
-    0x7c,
-    0x3f,
-    0x44,
-    0x35,
-    0x90,
-    0x66,
-    0xdf,
-    0x75,
-    0xe1,
-    0x82,
-    0xa0,
-    0x32,
-    0xe9,
-    0xf2,
-    0xfb,
-    0x63,
-    0xcf,
-    0x10,
-    0x70,
-    0xd7,
-    0x3b,
-    0xb6,
-    0x02,
-    0xd4,
-    0x68,
-    0x01,
-    0xeb,
-    0xff,
-    0x7b,
-    0x54,
-    0x8e,
-    0x7b,
-    0x13,
-    0xa0,
-    0xad,
-    0x55,
-    0x21,
-    0xe3,
-    0xdc,
-    0x20,
-    0xfa,
-    0xef,
-    0x36,
-    0xdc,
-    0xaa,
-    0x6d,
-    0x4e,
-    0x1d,
-    0x8b,
-    0x21,
-    0x69,
-    0x69,
-    0x17,
-    0x70,
-    0xea,
-    0xe1,
-    0xfb,
-    0x1f,
-    0x0d,
-    0x23,
-    0x6c,
-    0x5d,
-    0xd8,
-    0x70,
-    0xbe,
-    0x04,
-    0x4f,
-    0x0a,
-    0x33,
-    0x1c,
-    0xe8,
-    0xe0,
-    0x11,
-    0xa1,
-    0x3e,
-    0x6d,
-    0xf7,
-    0x85,
-    0x09,
-    0xde,
-    0x70,
-    0xf9,
-    0x4e,
-    0x73,
-    0xc9,
-    0xe9,
-    0xd3,
-    0x27,
-    0x20,
-    0xc5,
-    0xd6,
-    0x93,
-    0xbe,
-    0x87,
-    0xfe,
-    0x10,
-    0xa7,
-    0xf2,
-    0x92,
-    0x1c,
-    0x6e,
-    0x17,
-    0xe9,
-    0xff,
-    0x4e,
-    0x1e,
-    0x22,
-    0xae,
-    0x77,
-    0x43,
-    0x15,
-    0xef,
-    0xa6,
-    0x1f,
-    0x88,
-    0xbe,
-    0xf8,
-    0x29,
-    0xa7,
-    0xef,
-    0x00,
-    0x7c,
-    0xae,
-    0x16,
-    0x17,
-    0xdb,
-    0xe9,
-    0xa4,
-    0xf3,
-    0xf2,
-    0xde,
-    0x52,
-    0x7c,
-    0xde,
-    0xc9,
-    0xc3,
-    0xda,
-    0xf0,
-    0x48,
-    0x64,
-    0xd3,
-    0xae,
-    0x58,
-    0x98,
-    0x54,
-    0x1b,
-    0x80,
-    0x12,
-    0x4d,
-    0x39,
-    0x4c,
-    0x81,
-    0xc2,
-    0xcb,
-    0xfd,
-    0x73,
-    0x20,
-    0x5f,
-    0x7f,
-    0x73,
-    0xcd,
-    0x8c,
-    0x9b,
-    0x75,
-    0x02,
-    0x79,
-    0x6e,
-    0x75,
-    0xdd,
-    0x9e,
-    0x1a,
-    0x5a,
-    0xb2,
-    0xcf,
-    0xbb,
-    0x20,
-    0xa3,
-    0x76,
-    0x9d,
-    0x36,
-    0x70,
-    0x20,
-    0xac,
-    0x25,
-    0x90,
-    0x3b,
-    0x2b,
-    0x73,
-    0x80,
-    0x1d,
-    0xa9,
-    0xc7,
-    0x5b,
-    0x49,
-    0x31,
-    0x4d,
-    0xab,
-    0xee,
-    0xc2,
-    0x5c,
-    0x7e,
-    0xb1,
-    0xfe,
-    0x57,
-    0xbd,
-    0xac,
-    0x26,
-    0xd1,
-    0xba,
-    0xb7,
-    0x46,
-    0xf4,
-    0x08,
-    0xe6,
-    0xad,
-    0x23,
-    0x8f,
-    0x53,
-    0xa0,
-    0xde,
-    0xdf,
-    0x1d,
-    0x50,
-    0xe6,
-    0xc5,
-    0xb0,
-    0x09,
-    0xa2,
-    0x1c,
-    0x47,
-    0xab,
-    0xc2,
-    0xe6,
-    0xb0,
-    0x5e,
-    0x22,
-    0x9c,
-    0x4f,
-    0x82,
-    0xf1,
-    0xc2,
-    0x66,
-    0xe5,
-    0x12,
-    0xbd,
-    0x94,
-    0x39,
-    0xc2,
-    0xe9,
-    0x9b,
-    0xc5,
-    0x7c,
-    0xe7,
-    0x66,
-    0x5a,
-    0x19,
-    0x34,
-    0x4a,
-    0x89,
-    0x3c,
-    0x00,
-    0x8c,
-    0x13,
-    0xed,
-    0x3d,
-    0x23,
-    0xa1,
-    0x84,
-    0xf6,
-    0xc0,
-    0xb5,
-    0xc9,
-    0xe2,
-    0x0c,
-    0xe1,
-    0x59,
-    0x39,
-    0x30,
-    0x37,
-    0x4c,
-    0xc6,
-    0x9b,
-    0x00,
-    0x14,
-    0x3e,
-    0xff,
-    0xb1,
-    0xa8,
-    0xd0,
-    0x9d,
-    0x1a,
-    0xe3,
-    0xfd,
-    0xc3,
-    0xe1,
-    0x26,
-    0xaa,
-    0x93,
-    0x2f,
-    0x45,
-    0x73,
-    0x05,
-    0xa9,
-    0xa1,
-    0x43,
-    0x30,
-    0xa2,
-    0x91,
-    0x21,
-    0xc5,
-    0x8e,
-    0x07,
-    0x4d,
-    0xdc,
-    0xba,
-    0x70,
-    0x8c,
-    0xf3,
-    0x3b,
-    0xdb,
-    0xc0,
-    0x33,
-    0x25,
-    0x5e,
-    0xbb,
-    0xf6,
-    0xfd,
-    0xb5,
-    0x55,
-    0x87,
-    0x70,
-    0x2d,
-    0xbc,
-    0x28,
-    0x44,
-    0xc1,
-    0x0c,
-    0x5a,
-    0x90,
-    0x82,
-    0x20,
-    0x58,
-    0x28,
-    0x3c,
-    0xa7,
-    0xe5,
-    0x5c,
-    0x56,
-    0x7a,
-    0x47,
-    0xe2,
-    0xfa,
-    0x2d,
-    0x94,
-    0x10,
-    0x76,
-    0xe3,
-    0x2c,
-    0x4e,
-    0xe2,
-    0x67,
-    0x87,
-    0xcc,
-    0x03,
-    0x79,
-    0x31,
-    0x70,
-    0x70,
-    0x66,
-    0x12,
-    0x13,
-    0xf3,
-    0xdc,
-    0xf3,
-    0xec,
-    0x32,
-    0xfb,
-    0x3e,
-    0x4c,
-    0x8f,
-    0xaf,
-    0x05,
-    0x8c,
-    0x4c,
-    0x3e,
-    0x46,
-    0x44,
-    0xf3,
-    0x1d,
-    0x6e,
-    0xbe,
-    0xf5,
-    0x08,
-    0x1b,
-    0xab,
-    0x91,
-    0x51,
-    0x26,
-    0x14,
-    0xf7,
-    0x79,
-    0xe1,
-    0x93,
-    0xae,
-    0xfd,
-    0x9d,
-    0xc2,
-    0x33,
-    0x72,
-    0x70,
-    0xf4,
-    0xe3,
-    0xd4,
-    0x35,
-    0x23,
-    0x1a,
-    0x1c,
-    0xd3,
-    0x2a,
-    0x9d,
-    0x10,
-    0xc3,
-    0x34,
-    0x35,
-    0x5f,
-    0xcc,
-    0x75,
-    0x9d,
-    0xed,
-    0x11,
-    0x18,
-    0x9e,
-    0x6c,
-    0x4e,
-    0x78,
-    0x79,
-    0x2c,
-    0x5f,
-    0x92,
-    0x85,
-    0x34,
-    0x02,
-    0xbb,
-    0x19,
-    0x91,
-    0xdd,
-    0x8e,
-    0xac,
-    0xee,
-    0xc3,
-    0x29,
-    0x3b,
-    0x65,
-    0x33,
-    0x99,
-    0xec,
-    0x95,
-    0x21,
-    0x92,
-    0xf0,
-    0xf5,
-    0xf9,
-    0x63,
-    0xad,
-    0x67,
-    0xe2,
-    0x2a,
-    0x1d,
-    0x11,
-    0x40,
-    0x44,
-    0x71,
-    0x68,
-    0x7c,
-    0x08,
-    0xfb,
-    0x8d,
-    0x07,
-    0xb5,
-    0x4a,
-    0xdd,
-    0x9c,
-    0xa8,
-    0x97,
-    0xc4,
-    0xc6,
-    0xd3,
-    0x60,
-    0xd1,
-    0xa3,
-    0x6a,
-    0x52,
-    0x10,
-    0xe7,
-    0xdf,
-    0x6c,
-    0x94,
-    0x23,
-    0x11,
-    0x62,
-    0x53,
-    0x48,
-    0xc1,
-    0x3f,
-    0x37,
-    0x67,
-    0x45,
-    0x4f,
-    0x71,
-    0xba,
-    0x80,
-    0x3c,
-    0x11,
-    0xe8,
-    0x11,
-    0x77,
-    0xd3,
-    0x85,
-    0xcb,
-    0xd9,
-    0x3c,
-    0xd8,
-    0x65,
-    0x8b,
-    0xe6,
-    0xe2,
-    0x73,
-    0x23,
-    0x19,
-    0x9b,
-    0x95,
-    0x0f,
-    0x9a,
-    0x7f,
-    0xef,
-    0x37,
-    0xc8,
-    0x49,
-    0xd9,
-    0xde,
-    0xe4,
-    0xff,
-    0xd7,
-    0xc9,
-    0xb1,
-    0x2e,
-    0xcb,
-    0xa4,
-    0x3d,
-    0x77,
-    0x69,
-    0xa1,
-    0xfe,
-    0x4a,
-    0xec,
-    0x62,
-    0x20,
-    0xf2,
-    0x07,
-    0x19,
-    0x1e,
-    0xd2,
-    0x1f,
-    0xee,
-    0x90,
-    0xee,
-    0xb7,
-    0xa1,
-    0x44,
-    0xad,
-    0x2c,
-    0x70,
-    0x8f,
-    0xdd,
-    0xa2,
-    0x3b,
-    0xe5,
-    0xf7,
-    0x3e,
-    0xe6,
-    0xa8,
-    0xa4,
-    0x96,
-    0xff,
-    0x3e,
-    0x81,
-    0x65,
-    0xa0,
-    0x66,
-    0x1f,
-    0x84,
-    0x97,
-    0xcc,
-    0x4f,
-    0x15,
-    0xc5,
-    0xdb,
-    0x9c,
-    0x01,
-    0xc4,
-    0xd2,
-    0x18,
-    0xa6,
-    0xcd,
-    0x1a,
-    0x5c,
-    0xc9,
-    0xd8,
-    0xd7,
-    0xca,
-    0xd2,
-    0x04,
-    0xbd,
-    0x15,
-    0x38,
-    0x3a,
-    0x24,
-    0x04,
-    0x3a,
-    0x0d,
-    0x5f,
-    0x72,
-    0xd0,
-    0xe5,
-    0x4a,
-    0x9a,
-    0xe1,
-    0x5d,
-    0x23,
-    0x91,
-    0xb6,
-    0xe9,
-    0x9b,
-    0x14,
-    0xaf,
-    0xbc,
-    0x2c,
-    0x84,
-    0x34,
-    0xe9,
-    0xac,
-    0x2f,
-    0xef,
-    0xc8,
-    0x23,
-    0xd1,
-    0x38,
-    0x9b,
-    0xda,
-    0x5b,
-    0xd1,
-    0x71,
-    0xb4,
-    0xf2,
-    0xd4,
-    0x4b,
-    0xc1,
-    0x3b,
-    0xe9,
-    0x7e,
-    0x11,
-    0xd6,
-    0xbc,
-    0x58,
-    0xc6,
-    0x28,
-    0xaf,
-    0x06,
-    0x6d,
-    0x5e,
-    0xcc,
-    0xb5,
-    0x8f,
-    0xae,
-    0xfd,
-    0xf8,
-    0x82,
-    0xe0,
-    0x7f,
-    0x6a,
-    0x85,
-    0x0e,
-    0x94,
-    0x94,
-    0x0d,
-    0xa8,
-    0x78,
-    0x11,
-    0x59,
-    0xba,
-    0x97,
-    0xef,
-    0x4c,
-    0x72,
-    0xfd,
-    0x59,
-    0x7c,
-    0xdd,
-    0x0e,
-    0x73,
-    0x87,
-    0xf1,
-    0x77,
-    0x86,
-    0xa6,
-    0xd0,
-    0x64,
-    0x5d,
-    0x84,
-    0x4b,
-    0xf4,
-    0xef,
-    0x50,
-    0xa5,
-    0xe9,
-    0x3e,
-    0x10,
-    0x9a,
-    0xa5,
-    0x7e,
-    0x39,
-    0xa0,
-    0x52,
-    0x7a,
-    0x7d,
-    0x6d,
-    0x60,
-    0x34,
-    0xe5,
-    0xb9,
-    0x34,
-    0xcb,
-    0x1f,
-    0x45,
-    0x1e,
-    0xa2,
-    0x19,
-    0x1c,
-    0x8c,
-    0xbf,
-    0xcf,
-    0x19,
-    0x7e,
-    0x71,
-    0x61,
-    0xa9,
-    0x3a,
-    0x36,
-    0x68,
-    0xd2,
-    0x41,
-    0xdb,
-    0x8a,
-    0x75,
-    0x81,
-    0xe5,
-    0x4c,
-    0xd0,
-    0xcc,
-    0x30,
-    0x28,
-    0x46,
-    0x89,
-    0xd6,
-    0xe0,
-    0x63,
-    0xaa,
-    0x52,
-    0x11,
-    0x1b,
-    0xde,
-    0xe6,
-    0x0b,
-    0x52,
-    0x07,
-    0x3a,
-    0xe0,
-    0xa2,
-    0xee,
-    0x45,
-    0xbb,
-    0x58,
-    0x35,
-    0x70,
-    0x73,
-    0xbf,
-    0x8e,
-    0xf9,
-    0x60,
-    0xa2,
-    0x2b,
-    0x96,
-    0x6e,
-    0x0c,
-    0x76,
-    0x5c,
-    0x6f,
-    0x52,
-    0x01,
-    0xde,
-    0xb6,
-    0x53,
-    0xc0,
-    0x99,
-    0xe1,
-    0xff,
-    0x76,
-    0x90,
-    0xf6,
-    0x16,
-    0x6d,
-    0x33,
-    0xb2,
-    0x32,
-    0x6a,
-    0x85,
-    0x1d,
-    0x08,
-    0xe0,
-    0x7e,
-    0x62,
-    0xeb,
-    0x64,
-    0xae,
-    0xde,
-    0x92,
-    0x61,
-    0x24,
-    0x77,
-    0x1a,
-    0x0d,
-    0x8e,
-    0x2f,
-    0x4e,
-    0x9b,
-    0xa2,
-    0xf8,
-    0x27,
-    0xb3,
-    0xbc,
-    0xcb,
-    0x8f,
-    0x1f,
-    0xc8,
-    0xf4,
-    0x6a,
-    0xc7,
-    0x62,
-    0xb0,
-    0xd7,
-    0xdf,
-    0x3c,
-    0xf9,
-    0xb3,
-    0x5f,
-    0xc0,
-    0xa1,
-    0x60,
-    0xb3,
-    0xf7,
-    0x9e,
-    0xc4,
-    0xb4,
-    0xaa,
-    0xa5,
-    0x94,
-    0xd8,
-    0xc7,
-    0xfa,
-    0xd2,
-    0xa5,
-    0x05,
-    0x86,
-    0x94,
-    0x6c,
-    0xcb,
-    0x2a,
-    0x08,
-    0x33,
-    0x4f,
-    0x53,
-    0xb5,
-    0xf3,
-    0xfb,
-    0xce,
-    0x03,
-    0x04,
-    0x14,
-    0xde,
-    0xfe,
-    0xd5,
-    0x9d,
-    0x8c,
-    0x57,
-    0xe0,
-    0x79,
-    0x3f,
-    0xab,
-    0xdd,
-    0xd1,
-    0x8c,
-    0x08,
-    0x36,
-    0xb5,
-    0x4f,
-    0xae,
-    0xbc,
-    0x06,
-    0xfb,
-    0x12,
-    0x98,
-    0x93,
-    0x2e,
-    0x29,
-    0x84,
-    0x82,
-    0x89,
-    0xe2,
-    0x3b,
-    0xf2,
-    0xbe,
-    0xf5,
-    0x2d,
-    0xde,
-    0xea,
-    0xdb,
-    0x78,
-    0x44,
-    0x26,
-    0x1d,
-    0x14,
-    0x87,
-    0x58,
-    0xd2,
-    0x4d,
-    0x13,
-    0x50,
-    0x63,
-    0x77,
-    0x3f,
-    0x10,
-    0x92,
-    0xdd,
-    0x77,
-    0x6a,
-    0xbb,
-    0xfa,
-    0x9a,
-    0xd1,
-    0x59,
-    0xec,
-    0xa1,
-    0x69,
-    0xcb,
-    0x25,
-    0x82,
-    0x60,
-    0x59,
-    0x64,
-    0x53,
-    0x81,
-    0x72,
-    0xe3,
-    0xb3,
-    0x06,
-    0x37,
-    0xd2,
-    0x66,
-    0xae,
-    0x3e,
-    0x05,
-    0x3f,
-    0x10,
-    0x8f,
-    0xea,
-    0x43,
-    0x2f,
-    0xf3,
-    0xbd,
-    0x0b,
-    0x4e,
-    0x6f,
-    0xff,
-    0x6a,
-    0x06,
-    0x0b,
-    0x24,
-    0x50,
-    0x95,
-    0xd7,
-    0x8c,
-    0xee,
-    0x79,
-    0x30,
-    0xb4,
-    0x1b,
-    0x3e,
-    0x40,
-    0xae,
-    0xf7,
-    0x94,
-    0xc4,
-    0xce,
-    0xce,
-    0xa4,
-    0x12,
-    0xa7,
-    0x3f,
-    0xa4,
-    0x5a,
-    0x35,
-    0x9d,
-    0xa9,
-    0x2c,
-    0x5c,
-    0x95,
-    0xbd,
-    0x3a,
-    0x91,
-    0x11,
-    0x32,
-    0x60,
-    0xd8,
-    0x5d,
-    0x36,
-    0xe1,
-    0xee,
-    0x88,
-    0xa7,
-    0xf4,
-    0xc7,
-    0x0e,
-    0x28,
-    0x7f,
-    0x3b,
-    0xb3,
-    0x74,
-    0x22,
-    0xfc,
-    0xb2,
-    0xf2,
-    0x77,
-    0xcb,
-    0x17,
-    0x8a,
-    0x98,
-    0xeb,
-    0x6a,
-    0xb8,
-    0xe2,
-    0xd6,
-    0x8d,
-    0xde,
-    0xf9,
-    0x30,
-    0xe7,
-    0xdf,
-    0x0c,
-    0xf9,
-    0xc3,
-    0xe9,
-    0x5b,
-    0x06,
-    0xf2,
-    0x92,
-    0xf6,
-    0xb2,
-    0xb8,
-    0x27,
-    0xc7,
-    0xd1,
-    0xe6,
-    0x40,
-    0xd2,
-    0xe5,
-    0x43,
-    0x98,
-    0xbc,
-    0x95,
-    0x30,
-    0x1c,
-    0x8a,
-    0x5a,
-    0x8c,
-    0x42,
-    0xac,
-    0x7c,
-    0xd6,
-    0x9c,
-    0x3a,
-    0x3d,
-    0x91,
-    0xad,
-    0x7d,
-    0x53,
-    0xed,
-    0xfb,
-    0xb1,
-    0x9c,
-    0xa3,
-    0x65,
-    0x09,
-    0x0e,
-    0x21,
-    0xb7,
-    0xf4,
-    0xed,
-    0xe7,
-    0x7c,
-    0x9f,
-    0x40,
-    0x31,
-    0x14,
-    0xbb,
-    0x85,
-    0xd6,
-    0x06,
-    0x80,
-    0xa4,
-    0x70,
-    0x97,
-    0xf2,
-    0x22,
-    0xbd,
-    0x9b,
-    0x63,
-    0x97,
-    0x45,
-    0x8b,
-    0x39,
-    0x62,
-    0x3d,
-    0xd8,
-    0xf1,
-    0x9b,
-    0xac,
-    0x7f,
-    0x64,
-    0x49,
-    0xcc,
-    0xde,
-    0x49,
-    0xd5,
-    0xb3,
-    0xc5,
-    0xfc,
-    0xbf,
-    0x32,
-    0xd1,
-    0x7e,
-    0x90,
-    0xfe,
-    0xf5,
-    0xbc,
-    0x10,
-    0x0d,
-    0x5a,
-    0x14,
-    0xb8,
-    0x43,
-    0x69,
-    0x15,
-    0x6a,
-    0x4e,
-    0x26,
-    0x86,
-    0x60,
-    0xcf,
-    0xbf,
-    0xaa,
-    0x63,
-    0xba,
-    0x64,
-    0xc3,
-    0x3d,
-    0xff,
-    0x5a,
-    0xd5,
-    0x70,
-    0x6a,
-    0x4b,
-    0xac,
-    0x28,
-    0xc7,
-    0xe1,
-    0x20,
-    0x6f,
-    0x4b,
-    0x93,
-    0x98,
-    0xa0,
-    0x2f,
-    0xbe,
-    0xcd,
-    0x1e,
-    0x9e,
-    0xf7,
-    0xd1,
-    0x45,
-    0xd1,
-    0xa0,
-    0x4f,
-    0xa1,
-    0x79,
-    0xb9,
-    0x14,
-    0x5e,
-    0x5d,
-    0xf9,
-    0xce,
-    0x00,
-    0x44,
-    0x1d,
-    0x14,
-    0x55,
-    0x15,
-    0x81,
-    0xa7,
-    0xa7,
-    0x3d,
-    0xed,
-    0xf8,
-    0x35,
-    0x51,
-    0xb1,
-    0xea,
-    0xe5,
-    0xf4,
-    0xf4,
-    0xd8,
-    0x33,
-    0xfc,
-    0x49,
-    0xda,
-    0x6d,
-    0xd0,
-    0x83,
-    0x44,
-    0x22,
-    0x14,
-    0xcb,
-    0x70,
-    0xd8,
-    0x89,
-    0xef,
-    0xbe,
-    0xfd,
-    0x2e,
-    0xfd,
-    0xd8,
-    0x20,
-    0xac,
-    0x11,
-    0x3b,
-    0x61,
-    0xf0,
-    0x6b,
-    0xf3,
-    0x26,
-    0x1a,
-    0xc4,
-    0xa5,
-    0x10,
-    0x96,
-    0xe2,
-    0xd3,
-    0x2e,
-    0x88,
-    0x6b,
-    0x5c,
-    0x70,
-    0x6e,
-    0xf7,
-    0x42,
-    0x5e,
-    0x01,
-    0x68,
-    0xb0,
-    0x09,
-    0x5b,
-    0x7e,
-    0x3c,
-    0x42,
-    0x5f,
-    0xa6,
-    0x69,
-    0x0b,
-    0x56,
-    0x13,
-    0x70,
-    0x4b,
-    0xd6,
-    0x10,
-    0x40,
-    0xc6,
-    0xe8,
-    0x95,
-    0xc3,
-    0x4b,
-    0x69,
-    0x18,
-    0x63,
-    0x2f,
-    0xb1,
-    0xa5,
-    0xcd,
-    0xfb,
-    0x73,
-    0x31,
-    0xf4,
-    0x62,
-    0xe4,
-    0x2c,
-    0x59,
-    0x76,
-    0x20,
-    0x55,
-    0x8b,
-    0x1b,
-    0xc9,
-    0xd2,
-    0xe9,
-    0xbb,
-    0xf1,
-    0x80,
-    0xaf,
-    0x3b,
-    0x3a,
-    0x88,
-    0x31,
-    0x2e,
-    0x3b,
-    0x33,
-    0x61,
-    0x49,
-    0x26,
-    0xff,
-    0x97,
-    0x17,
-    0xa8,
-    0xf2,
-    0x92,
-    0xee,
-    0x11,
-    0x2e,
-    0xba,
-    0x22,
-    0xb5,
-    0xc6,
-    0xa7,
-    0x78,
-    0x92,
-    0xd0,
-    0xe7,
-    0xde,
-    0x33,
-    0xbb,
-    0xfc,
-    0x59,
-    0xd4,
-    0xe3,
-    0xa5,
-    0x3e,
-    0xc6,
-    0x63,
-    0x5f,
-    0xa5,
-    0x15,
-    0x2a,
-    0x2a,
-    0x1b,
-    0x69,
-    0x52,
-    0x90,
-    0x97,
-    0x2a,
-    0xad,
-    0xe4,
-    0xb0,
-    0xe7,
-    0xa0,
-    0xc8,
-    0x0c,
-    0xf9,
-    0x34,
-    0xf1,
-    0x1c,
-    0x63,
-    0x6a,
-    0x2f,
-    0x06,
-    0xfd,
-    0xcf,
-    0xa7,
-    0xe3,
-    0xd2,
-    0x51,
-    0x63,
-    0x2b,
-    0xc6,
-    0x51,
-    0x0e,
-    0x6d,
-    0x7c,
-    0xf9,
-    0xf8,
-    0x44,
-    0x76,
-    0xd0,
-    0x61,
-    0x86,
-    0x7e,
-    0x8b,
-    0xf3,
-    0xbe,
-    0x45,
-    0x27,
-    0x90,
-    0xdd,
-    0x4b,
-    0x34,
-    0x4e,
-    0x2c,
-    0xfe,
-    0x74,
-    0xc0,
-    0x85,
-    0x26,
-    0xa4,
-    0x78,
-    0xc3,
-    0x80,
-    0x9a,
-    0xc9,
-    0x77,
-    0xa9,
-    0x90,
-    0xd2,
-    0xdd,
-    0x3e,
-    0xc0,
-    0xb7,
-    0x0e,
-    0x42,
-    0x31,
-    0x32,
-    0x76,
-    0xc0,
-    0xd0,
-    0x4b,
-    0x89,
-    0xb1,
-    0xc2,
-    0x63,
-    0xb2,
-    0x1f,
-    0xf9,
-    0x77,
-    0x8c,
-    0x8b,
-    0x05,
-    0xa3,
-    0x55,
-    0x8d,
-    0x2d,
-    0xe5,
-    0xa0,
-    0xba,
-    0xbf,
-    0x24,
-    0x49,
-    0xca,
-    0xa4,
-    0x71,
-    0xae,
-    0xfb,
-    0x37,
-    0x8c,
-    0x1c,
-    0xb0,
-    0x58,
-    0xaa,
-    0x88,
-    0x5e,
-    0xbb,
-    0x75,
-    0x80,
-    0xa8,
-    0x86,
-    0x55,
-    0x61,
-    0xc9,
-    0x1c,
-    0xee,
-    0xc9,
-    0x33,
-    0x33,
-    0xea,
-    0x4f,
-    0x75,
-    0x2d,
-    0xf8,
-    0x72,
-    0x62,
-    0xa5,
-    0x14,
-    0xd0,
-    0x70,
-    0x48,
-    0x0a,
-    0x99,
-    0x5e,
-    0xe6,
-    0x35,
-    0x42,
-    0x1a,
-    0xc8,
-    0x8d,
-    0x7e,
-    0xe1,
-    0x45,
-    0xe1,
-    0x6a,
-    0xa8,
-    0x90,
-    0x60,
-    0x07,
-    0xbb,
-    0xd4,
-    0x5e,
-    0xee,
-    0xa4,
-    0x83,
-    0x55,
-    0x3f,
-    0x4e,
-    0xeb,
-    0x2a,
-    0xdb,
-    0x6a,
-    0x0a,
-    0xb2,
-    0xd3,
-    0x12,
-    0xa3,
-    0x75,
-    0x20,
-    0xac,
-    0x91,
-    0xb2,
-    0x94,
-    0x12,
-    0x5c,
-    0xa3,
-    0x10,
-    0xf0,
-    0x0a,
-    0x01,
-    0xf8,
-    0x6d,
-    0x37,
-    0xcb,
-    0xe4,
-    0x0d,
-    0x68,
-    0x44,
-    0x98,
-    0xd5,
-    0x9d,
-    0x3b,
-    0x37,
-    0xb1,
-    0x25,
-    0x8e,
-    0xb3,
-    0x14,
-    0xb6,
-    0xf1,
-    0x88,
-    0xde,
-    0xbd,
-    0xec,
-    0xaa,
-    0x82,
-    0xf3,
-    0x23,
-    0xbb,
-    0x68,
-    0x31,
-    0xda,
-    0x82,
-    0x90,
-    0x85,
-    0xb8,
-    0x99,
-    0x79,
-    0x85,
-    0xcb,
-    0x65,
-    0x41,
-    0xe3,
-    0xcd,
-    0x4b,
-    0x0d,
-    0x42,
-    0xa6,
-    0x21,
-    0xab,
-    0x48,
-    0x31,
-    0xe3,
-    0x76,
-    0xf5,
-    0x43,
-    0xa8,
-    0x7a,
-    0x33,
-    0xea,
-    0xd4,
-    0xd9,
-    0xae,
-    0xf2,
-    0x8e,
-    0x6e,
-    0xe5,
-    0xae,
-    0x75,
-    0xaf,
-    0x82,
-    0xf5,
-    0x8e,
-    0xd8,
-    0xe6,
-    0x6a,
-    0x81,
-    0x46,
-    0x09,
-    0x00,
-    0x06,
-    0x20,
-    0x81,
-    0xbe,
-    0x9a,
-    0x3d,
-    0xe0,
-    0xc0,
-    0x76,
-    0x42,
-    0x43,
-    0x7f,
-    0xc1,
-    0x0b,
-    0x28,
-    0x52,
-    0x05,
-    0x4d,
-    0x80,
-    0x34,
-    0xe0,
-    0x79,
-    0x06,
-    0xc7,
-    0xfc,
-    0xe3,
-    0xce,
-    0x99,
-    0x40,
-    0x23,
-    0x21,
-    0xa6,
-    0x48,
-    0xbb,
-    0x88,
-    0x1f,
-    0x13,
-    0xfb,
-    0x27,
-    0x6a,
-    0xfc,
-    0x22,
-    0x4c,
-    0x6a,
-    0xec,
-    0xc6,
-    0x48,
-    0x00,
-    0xcd,
-    0x76,
-    0x7e,
-    0xd2,
-    0x42,
-    0x9d,
-    0xb9,
-    0x4b,
-    0x95,
-    0xa9,
-    0xc3,
-    0xe3,
-    0xf1,
-    0x6d,
-    0x33,
-    0xa0,
-    0xd1,
-    0xc4,
-    0x86,
-    0xdc,
-    0xb8,
-    0x78,
-    0x71,
-    0x4a,
-    0x23,
-    0x62,
-    0x76,
-    0x34,
-    0xbb,
-    0xd2,
-    0xb6,
-    0x06,
-    0xd0,
-    0x31,
-    0x06,
-    0x10,
-    0x03,
-    0xe4,
-    0x44,
-    0x88,
-    0x42,
-    0x74,
-    0xec,
-    0xce,
-    0xfa,
-    0xec,
-    0xe6,
-    0xf4,
-    0x87,
-    0x83,
-    0xa2,
-    0x7e,
-    0xf0,
-    0x7b,
-    0x67,
-    0x66,
-    0xd1,
-    0x49,
-    0xe8,
-    0x64,
-    0x98,
-    0xf6,
-    0x19,
-    0x6c,
-    0xf4,
-    0xc5,
-    0x40,
-    0x77,
-    0x8b,
-    0x16,
-    0x4f,
-    0x86,
-    0xec,
-    0x8a,
-    0x71,
-    0xe4,
-    0xc4,
-    0x68,
-    0xe3,
-    0xac,
-    0x54,
-    0x40,
-    0x05,
-    0x8c,
-    0x22,
-    0xce,
-    0xb1,
-    0xc8,
-    0xef,
-    0x20,
-    0xcb,
-    0x82,
-    0xea,
-    0xfb,
-    0x19,
-    0x38,
-    0x23,
-    0x7c,
-    0x55,
-    0x8e,
-    0x42,
-    0xfb,
-    0x81,
-    0x4e,
-    0x79,
-    0x34,
-    0x7b,
-    0xad,
-    0xb7,
-    0xa9,
-    0xd1,
-    0xd0,
-    0x1f,
-    0x42,
-    0xd6,
-    0x8e,
-    0xb8,
-    0x37,
-    0xf6,
-    0x78,
-    0x66,
-    0x2f,
-    0x46,
-    0x16,
-    0x19,
-    0xaa,
-    0x5f,
-    0x74,
-    0x44,
-    0x9c,
-    0x6d,
-    0xdd,
-    0x91,
-    0x5a,
-    0x83,
-    0xe7,
-    0xd3,
-    0xba,
-    0x32,
-    0xb0,
-    0x3b,
-    0x76,
-    0x59,
-    0x66,
-    0xd0,
-    0xd2,
-    0x3e,
-    0x0d,
-    0x19,
-    0x7f,
-    0xde,
-    0x7c,
-    0x1c,
-    0xbe,
-    0x82,
-    0xa9,
-    0x8d,
-    0xc9,
-    0x93,
-    0x27,
-    0x3f,
-    0x6e,
-    0xaf,
-    0xed,
-    0xde,
-    0xfd,
-    0xfc,
-    0x59,
-    0xe0,
-    0x64,
-    0xbd,
-    0x75,
-    0xb9,
-    0x99,
-    0x23,
-    0x78,
-    0x4e,
-    0x38,
-    0x65,
-    0x90,
-    0xad,
-    0x6e,
-    0x13,
-    0xde,
-    0xfb,
-    0x15,
-    0xa7,
-    0xc2,
-    0xad,
-    0x20,
-    0x5d,
-    0x5a,
-    0xfc,
-    0x3a,
-    0x44,
-    0x45,
-    0x92,
-    0xaa,
-    0x95,
-    0xad,
-    0x8a,
-    0x7a,
-    0x44,
-    0x84,
-    0x97,
-    0xd8,
-    0xd6,
-    0x0d,
-    0x83,
-    0xbc,
-    0x72,
-    0x9f,
-    0xdc,
-    0xcb,
-    0x3a,
-    0xa6,
-    0xea,
-    0x7c,
-    0xdc,
-    0xea,
-    0xe3,
-    0x79,
-    0x63,
-    0x14,
-    0x62,
-    0x48,
-    0x54,
-    0x6e,
-    0x16,
-    0x2a,
-    0xf6,
-    0xea,
-    0xb7,
-    0x43,
-    0xf1,
-    0x66,
-    0x3f,
-    0xfc,
-    0x1a,
-    0x2e,
-    0x56,
-    0xa6,
-    0x8e,
-    0xc2,
-    0x0e,
-    0x60,
-    0xfe,
-    0xda,
-    0xd0,
-    0x3a,
-    0x49,
-    0xa8,
-    0x97,
-    0x9a,
-    0x50,
-    0x5d,
-    0x5b,
-    0xdf,
-    0x06,
-    0xee,
-    0xd1,
-    0x45,
-    0xc6,
-    0x18,
-    0x51,
-    0x08,
-    0xea,
-    0xa2,
-    0x17,
-    0xcd,
-    0x99,
-    0xe2,
-    0xaf,
-    0x3d,
-    0xe0,
-    0x82,
-    0xab,
-    0xf3,
-    0x04,
-    0x84,
-    0x97,
-    0x98,
-    0x17,
-    0x84,
-    0x2f,
-    0x4c,
-    0xca,
-    0x3d,
-    0xcf,
-    0x48,
-    0x82,
-    0x4f,
-    0x2a,
-    0xc2,
-    0xae,
-    0x40,
-    0x3f,
-    0x11,
-    0x57,
-    0xc0,
-    0x89,
-    0x12,
-    0xf8,
-    0x31,
-    0x76,
-    0xca,
-    0x91,
-    0x66,
-    0x1b,
-    0x4d,
-    0xf7,
-    0xab,
-    0x26,
-    0xde,
-    0x6e,
-    0x06,
-    0x14,
-    0x57,
-    0x79,
-    0xbd,
-    0xa4,
-    0xcc,
-    0xf1,
-    0x18,
-    0x8b,
-    0x6b,
-    0x55,
-    0x68,
-    0x69,
-    0xa6,
-    0x61,
-    0x48,
-    0xfc,
-    0x95,
-    0xe2,
-    0x23,
-    0x93,
-    0x95,
-    0xc8,
-    0xf7,
-    0xc6,
-    0x36,
-    0x7d,
-    0x58,
-    0x65,
-    0x54,
-    0x75,
-    0xb7
-  ],
-  const [
-    0x21,
-    0x5c,
-    0x37,
-    0x32,
-    0x0f,
-    0xbd,
-    0xd5,
-    0x52,
-    0x00,
-    0x37,
-    0xbc,
-    0xe5,
-    0xb0,
-    0x2b,
-    0x12,
-    0x87,
-    0x1b,
-    0x34,
-    0x5b,
-    0xbd,
-    0x84,
-    0x16,
-    0x9d,
-    0x87,
-    0xbc,
-    0xf1,
-    0xc1,
-    0x34,
-    0xa1,
-    0xbb,
-    0x3d,
-    0x7a,
-    0xe5,
-    0xec,
-    0xf0,
-    0xc6,
-    0x11,
-    0x7b,
-    0x4d,
-    0xd1,
-    0xc9,
-    0x0a,
-    0xbc,
-    0x74,
-    0x51,
-    0x5e,
-    0x3d,
-    0xbd,
-    0x50,
-    0x11,
-    0x4f,
-    0x42,
-    0xd4,
-    0x8b,
-    0x10,
-    0xb5,
-    0x97,
-    0x2e,
-    0xa5,
-    0xb9,
-    0x81,
-    0xd1,
-    0xdc,
-    0xf4,
-    0x6d,
-    0x70,
-    0x10,
-    0x66,
-    0x30,
-    0x21,
-    0x4e,
-    0xf9,
-    0xd7,
-    0x4a,
-    0xb5,
-    0x59,
-    0x31,
-    0x12,
-    0x23,
-    0x05,
-    0x8e,
-    0x15,
-    0x0e,
-    0xa7,
-    0xc5,
-    0x5c,
-    0xaf,
-    0xa1,
-    0x7c,
-    0x8c,
-    0x66,
-    0xe8,
-    0xa3,
-    0x5d,
-    0x5a,
-    0x15,
-    0x42,
-    0x4e,
-    0x60,
-    0xb9,
-    0x75,
-    0x98,
-    0x1e,
-    0xf1,
-    0xb4,
-    0x60,
-    0x70,
-    0x3b,
-    0x58,
-    0x30,
-    0x0a,
-    0x88,
-    0x5b,
-    0xa8,
-    0x5f,
-    0x93,
-    0x60,
-    0x71,
-    0xc2,
-    0x70,
-    0xf3,
-    0x73,
-    0xcb,
-    0x68,
-    0x11,
-    0x48,
-    0xfd,
-    0x04,
-    0xeb,
-    0xf0,
-    0xa5,
-    0x68,
-    0xe7,
-    0xc6,
-    0x05,
-    0xe2,
-    0xe8,
-    0xb2,
-    0xb2,
-    0xc3,
-    0xcf,
-    0xa1,
-    0x3b,
-    0x6e,
-    0x42,
-    0x32,
-    0x0b,
-    0xae,
-    0xac,
-    0xb2,
-    0x91,
-    0x4d,
-    0x84,
-    0x4b,
-    0x9e,
-    0xe2,
-    0xd3,
-    0x78,
-    0x0e,
-    0xea,
-    0xf0,
-    0xbc,
-    0xaa,
-    0x1a,
-    0x8e,
-    0x94,
-    0x4d,
-    0xf4,
-    0xf9,
-    0xaa,
-    0x46,
-    0x99,
-    0x9d,
-    0x4b,
-    0xfe,
-    0xde,
-    0xc8,
-    0x1b,
-    0xdb,
-    0xa1,
-    0xb1,
-    0x08,
-    0x63,
-    0x5e,
-    0xb8,
-    0x7c,
-    0xa5,
-    0xfd,
-    0xef,
-    0xd7,
-    0xd4,
-    0xee,
-    0xda,
-    0x1c,
-    0x36,
-    0x78,
-    0x73,
-    0xea,
-    0x3c,
-    0x4e,
-    0x71,
-    0xaf,
-    0xf3,
-    0x64,
-    0xca,
-    0x18,
-    0x9b,
-    0x00,
-    0x77,
-    0xcc,
-    0x94,
-    0x14,
-    0x77,
-    0x59,
-    0x82,
-    0xcb,
-    0x16,
-    0x6e,
-    0xa9,
-    0x62,
-    0x6f,
-    0x4c,
-    0x99,
-    0x39,
-    0x30,
-    0x77,
-    0x10,
-    0x2a,
-    0x9d,
-    0xb1,
-    0x1c,
-    0x19,
-    0xd8,
-    0x28,
-    0x80,
-    0xcc,
-    0x5f,
-    0xef,
-    0x59,
-    0xfd,
-    0xd6,
-    0xab,
-    0x01,
-    0xae,
-    0x07,
-    0x8f,
-    0x34,
-    0xbd,
-    0x27,
-    0x8a,
-    0x71,
-    0xb8,
-    0x5a,
-    0xbe,
-    0xa3,
-    0xf2,
-    0x7a,
-    0x35,
-    0x01,
-    0xd7,
-    0x14,
-    0xcf,
-    0x33,
-    0x7c,
-    0xb4,
-    0x7f,
-    0xb6,
-    0x7b,
-    0x63,
-    0xb7,
-    0x81,
-    0xfd,
-    0x6d,
-    0x21,
-    0xe9,
-    0x18,
-    0x68,
-    0x90,
-    0xc2,
-    0x5c,
-    0x71,
-    0x36,
-    0xc7,
-    0xa8,
-    0xb9,
-    0x17,
-    0x3c,
-    0x42,
-    0x41,
-    0xbd,
-    0xd1,
-    0x27,
-    0xe1,
-    0x2e,
-    0xca,
-    0xa0,
-    0x8f,
-    0x1b,
-    0x5d,
-    0x16,
-    0xde,
-    0x5a,
-    0x5b,
-    0x27,
-    0xc5,
-    0x97,
-    0x13,
-    0xfa,
-    0xa2,
-    0x46,
-    0x74,
-    0xcf,
-    0x7e,
-    0xdb,
-    0x71,
-    0xda,
-    0x93,
-    0x3e,
-    0xaa,
-    0x51,
-    0x0b,
-    0x79,
-    0x48,
-    0xc4,
-    0x0b,
-    0xb4,
-    0x28,
-    0xad,
-    0xf0,
-    0x64,
-    0x3d,
-    0x48,
-    0xd9,
-    0xbf,
-    0x2f,
-    0xa4,
-    0x65,
-    0x73,
-    0x48,
-    0xfa,
-    0xbe,
-    0x97,
-    0x91,
-    0x3f,
-    0xd6,
-    0xe2,
-    0x38,
-    0xf5,
-    0xf0,
-    0x1b,
-    0x35,
-    0x46,
-    0x63,
-    0xd0,
-    0x2d,
-    0x53,
-    0x9a,
-    0x4b,
-    0x97,
-    0xca,
-    0x60,
-    0xc2,
-    0x1d,
-    0xb6,
-    0x5a,
-    0xce,
-    0x45,
-    0x9c,
-    0xd5,
-    0x1e,
-    0x50,
-    0xc3,
-    0xc3,
-    0x6d,
-    0x63,
-    0xd3,
-    0xff,
-    0xb1,
-    0xe4,
-    0xa2,
-    0xd9,
-    0x96,
-    0x27,
-    0x4a,
-    0xce,
-    0x2a,
-    0x4a,
-    0x7f,
-    0x97,
-    0xda,
-    0x5d,
-    0x1f,
-    0x66,
-    0x9d,
-    0xc6,
-    0x0b,
-    0x6c,
-    0x6f,
-    0xe4,
-    0x36,
-    0x9e,
-    0x01,
-    0xf3,
-    0xfb,
-    0xb9,
-    0xaf,
-    0x30,
-    0xb4,
-    0x83,
-    0xb2,
-    0x3d,
-    0x88,
-    0x54,
-    0x97,
-    0xc6,
-    0x84,
-    0xd6,
-    0xef,
-    0x65,
-    0xed,
-    0x09,
-    0x49,
-    0xc3,
-    0xd5,
-    0x8a,
-    0x5d,
-    0x01,
-    0xed,
-    0x14,
-    0x8a,
-    0x56,
-    0x9a,
-    0x47,
-    0x83,
-    0xf9,
-    0x4b,
-    0xa8,
-    0x45,
-    0x41,
-    0x09,
-    0xea,
-    0x4c,
-    0x0a,
-    0x50,
-    0x6c,
-    0x06,
-    0x5c,
-    0x1d,
-    0x02,
-    0x88,
-    0x47,
-    0x48,
-    0xf8,
-    0x80,
-    0x11,
-    0x14,
-    0x54,
-    0x6a,
-    0x94,
-    0x05,
-    0x5c,
-    0x07,
-    0xe1,
-    0xf1,
-    0x58,
-    0x0b,
-    0x29,
-    0x5a,
-    0x99,
-    0x16,
-    0xde,
-    0xfb,
-    0xba,
-    0xe6,
-    0x15,
-    0xa1,
-    0x26,
-    0xcb,
-    0x2f,
-    0x3c,
-    0xda,
-    0x5b,
-    0xb8,
-    0x36,
-    0x6d,
-    0x66,
-    0x8f,
-    0x03,
-    0x4d,
-    0x2d,
-    0x47,
-    0xfa,
-    0x4b,
-    0xce,
-    0xce,
-    0x63,
-    0x5a,
-    0x03,
-    0x4c,
-    0xd1,
-    0x93,
-    0x0c,
-    0x4e,
-    0xb2,
-    0x7d,
-    0xea,
-    0x24,
-    0x24,
-    0x8c,
-    0xce,
-    0x87,
-    0x0a,
-    0xe7,
-    0xd1,
-    0x80,
-    0x5f,
-    0x6e,
-    0xe5,
-    0x85,
-    0xcb,
-    0xfc,
-    0x0c,
-    0xe4,
-    0x74,
-    0xe9,
-    0xc8,
-    0x65,
-    0x17,
-    0xd4,
-    0xd2,
-    0x2a,
-    0x57,
-    0x9f,
-    0x0e,
-    0xdb,
-    0x55,
-    0xba,
-    0xbf,
-    0x00,
-    0x80,
-    0xa5,
-    0xf8,
-    0xae,
-    0xaf,
-    0xb0,
-    0x53,
-    0x66,
-    0x6d,
-    0x06,
-    0xe4,
-    0x3a,
-    0x93,
-    0xe9,
-    0x70,
-    0x31,
-    0x1d,
-    0x3f,
-    0xdb,
-    0xed,
-    0x36,
-    0x4e,
-    0xe0,
-    0x8b,
-    0x95,
-    0xc4,
-    0x05,
-    0xcb,
-    0x0c,
-    0xfa,
-    0xcd,
-    0x71,
-    0x5e,
-    0x79,
-    0x2f,
-    0xeb,
-    0x52,
-    0xbe,
-    0x47,
-    0x33,
-    0x05,
-    0x3a,
-    0x4c,
-    0xf7,
-    0x84,
-    0x9d,
-    0xc2,
-    0xf8,
-    0x9a,
-    0x54,
-    0xf0,
-    0xb0,
-    0xe7,
-    0x50,
-    0x95,
-    0x37,
-    0x32,
-    0x0a,
-    0xd7,
-    0x67,
-    0x01,
-    0xc4,
-    0x7c,
-    0x3f,
-    0x66,
-    0x11,
-    0x5c,
-    0x85,
-    0x1b,
-    0x97,
-    0x16,
-    0xaf,
-    0xd1,
-    0x14,
-    0x03,
-    0x04,
-    0xc6,
-    0x9f,
-    0x68,
-    0xff,
-    0x96,
-    0x31,
-    0xf0,
-    0xf4,
-    0x53,
-    0x63,
-    0x59,
-    0xf5,
-    0xd7,
-    0x79,
-    0x6d,
-    0xf7,
-    0x59,
-    0xa0,
-    0x34,
-    0x31,
-    0x3f,
-    0x74,
-    0x68,
-    0xc5,
-    0x33,
-    0xc5,
-    0x29,
-    0xa2,
-    0x79,
-    0x9b,
-    0xf2,
-    0xa9,
-    0x80,
-    0x77,
-    0xcc,
-    0x0f,
-    0xb7,
-    0xdc,
-    0xc1,
-    0x02,
-    0xa1,
-    0x0e,
-    0x94,
-    0x8f,
-    0x2c,
-    0x1a,
-    0xaf,
-    0xc3,
-    0x3f,
-    0x16,
-    0x5d,
-    0x10,
-    0x92,
-    0xaa,
-    0x39,
-    0xf3,
-    0xc2,
-    0xd0,
-    0xe7,
-    0xd4,
-    0xa5,
-    0xd7,
-    0x01,
-    0x2e,
-    0xdb,
-    0xae,
-    0x54,
-    0xef,
-    0xa5,
-    0x5f,
-    0x4d,
-    0x22,
-    0xfa,
-    0xda,
-    0xae,
-    0xcb,
-    0xd8,
-    0xf4,
-    0x85,
-    0x12,
-    0xd9,
-    0xaf,
-    0x5f,
-    0xa4,
-    0x06,
-    0xbc,
-    0xb9,
-    0x57,
-    0xef,
-    0x3e,
-    0xb7,
-    0x0d,
-    0xfc,
-    0xd1,
-    0x19,
-    0xda,
-    0xfe,
-    0xcb,
-    0x6a,
-    0x69,
-    0x09,
-    0xc2,
-    0x7a,
-    0x9b,
-    0x86,
-    0x4e,
-    0x0f,
-    0x72,
-    0x84,
-    0x0f,
-    0xd8,
-    0x2e,
-    0x4f,
-    0xf2,
-    0xa2,
-    0xb5,
-    0x44,
-    0xb1,
-    0xce,
-    0x38,
-    0xe3,
-    0x99,
-    0x03,
-    0x14,
-    0x26,
-    0x90,
-    0x20,
-    0xf6,
-    0x11,
-    0x56,
-    0x75,
-    0x43,
-    0x8b,
-    0x0b,
-    0x32,
-    0xb7,
-    0x6c,
-    0xf2,
-    0x1f,
-    0x4c,
-    0xd7,
-    0x74,
-    0x8e,
-    0x5d,
-    0xca,
-    0x68,
-    0x8f,
-    0x0b,
-    0xf3,
-    0x91,
-    0x62,
-    0xe0,
-    0xc6,
-    0x68,
-    0x32,
-    0xb2,
-    0xcc,
-    0x1c,
-    0x00,
-    0xca,
-    0x3e,
-    0xd8,
-    0xdd,
-    0x46,
-    0xd2,
-    0x44,
-    0x5c,
-    0xbc,
-    0xd5,
-    0x4e,
-    0x47,
-    0x20,
-    0x7a,
-    0x2a,
-    0x91,
-    0xe8,
-    0x72,
-    0x97,
-    0x8c,
-    0x6d,
-    0xbc,
-    0x65,
-    0x5c,
-    0x95,
-    0xbf,
-    0x34,
-    0xac,
-    0xaf,
-    0x96,
-    0x7e,
-    0x9f,
-    0x9e,
-    0xab,
-    0xd8,
-    0x09,
-    0x3a,
-    0x87,
-    0x74,
-    0xe0,
-    0xf3,
-    0xe8,
-    0xeb,
-    0xed,
-    0xb8,
-    0x14,
-    0x39,
-    0xc7,
-    0x17,
-    0x6e,
-    0x09,
-    0x02,
-    0xa5,
-    0x47,
-    0x34,
-    0xa4,
-    0xa0,
-    0xf6,
-    0x84,
-    0xd8,
-    0xd3,
-    0x2b,
-    0xbd,
-    0xe7,
-    0xba,
-    0x80,
-    0xde,
-    0x63,
-    0xe7,
-    0x51,
-    0xa4,
-    0xa6,
-    0xa4,
-    0xce,
-    0x50,
-    0x7b,
-    0xda,
-    0x4e,
-    0xaa,
-    0x1a,
-    0x31,
-    0xe7,
-    0x46,
-    0x5a,
-    0x79,
-    0x3b,
-    0x06,
-    0x22,
-    0x49,
-    0x94,
-    0xe0,
-    0x20,
-    0xe5,
-    0x34,
-    0xe1,
-    0xbe,
-    0x65,
-    0xe6,
-    0x72,
-    0x52,
-    0x14,
-    0xd9,
-    0xdb,
-    0x95,
-    0x17,
-    0xae,
-    0x05,
-    0x57,
-    0x4f,
-    0xd0,
-    0x84,
-    0x71,
-    0x80,
-    0x04,
-    0xd4,
-    0xfa,
-    0xb2,
-    0x41,
-    0xe3,
-    0xbe,
-    0xd7,
-    0xc1,
-    0xd0,
-    0xeb,
-    0xaf,
-    0x58,
-    0xf3,
-    0x0e,
-    0xe9,
-    0x05,
-    0x1d,
-    0x3e,
-    0x8b,
-    0xc7,
-    0x21,
-    0x97,
-    0x93,
-    0xb1,
-    0x93,
-    0xeb,
-    0xde,
-    0x41,
-    0xcf,
-    0xb3,
-    0x4a,
-    0xee,
-    0x3d,
-    0x4c,
-    0x18,
-    0x00,
-    0xd4,
-    0x60,
-    0x94,
-    0xa4,
-    0xdd,
-    0xa2,
-    0xf7,
-    0x40,
-    0xfa,
-    0xbe,
-    0x8c,
-    0x04,
-    0x66,
-    0x8f,
-    0x12,
-    0xc2,
-    0x7e,
-    0x93,
-    0x62,
-    0xff,
-    0x81,
-    0x9d,
-    0x51,
-    0x4a,
-    0x94,
-    0xca,
-    0xd8,
-    0xcc,
-    0x09,
-    0xb6,
-    0x72,
-    0x21,
-    0xe0,
-    0xf0,
-    0xc6,
-    0x66,
-    0x8e,
-    0xab,
-    0x86,
-    0x93,
-    0xfe,
-    0xb6,
-    0x97,
-    0x0b,
-    0xd6,
-    0xae,
-    0x72,
-    0x72,
-    0xfb,
-    0x72,
-    0xca,
-    0xbf,
-    0x57,
-    0xd7,
-    0x6f,
-    0x92,
-    0xda,
-    0x9d,
-    0x72,
-    0xc7,
-    0xbe,
-    0xa2,
-    0x8a,
-    0x4b,
-    0x10,
-    0x56,
-    0xb6,
-    0x2e,
-    0x6c,
-    0x6f,
-    0x24,
-    0xfa,
-    0x08,
-    0xde,
-    0x52,
-    0x44,
-    0xf3,
-    0x01,
-    0x73,
-    0x80,
-    0x9f,
-    0x1a,
-    0x14,
-    0x1a,
-    0x9e,
-    0x00,
-    0xff,
-    0xc2,
-    0xa9,
-    0x14,
-    0x5f,
-    0x07,
-    0xe6,
-    0x77,
-    0x26,
-    0x27,
-    0x6b,
-    0x7a,
-    0xac,
-    0x25,
-    0xfe,
-    0x56,
-    0x98,
-    0x1d,
-    0x1e,
-    0x1e,
-    0x04,
-    0xd5,
-    0x48,
-    0xf1,
-    0xdc,
-    0x94,
-    0x73,
-    0x74,
-    0x87,
-    0x37,
-    0xdd,
-    0x7f,
-    0xca,
-    0x81,
-    0x09,
-    0x17,
-    0xe9,
-    0xb3,
-    0x08,
-    0x9d,
-    0x0f,
-    0x5c,
-    0xf9,
-    0x44,
-    0xef,
-    0x73,
-    0xcc,
-    0xc9,
-    0xac,
-    0xa3,
-    0x4b,
-    0x5e,
-    0xf6,
-    0xe6,
-    0x5a,
-    0xe7,
-    0x77,
-    0x55,
-    0x7d,
-    0x68,
-    0x6d,
-    0x3f,
-    0x9c,
-    0xbe,
-    0x98,
-    0x78,
-    0x03,
-    0x8e,
-    0x56,
-    0xf3,
-    0xad,
-    0x7c,
-    0x0d,
-    0x93,
-    0xc2,
-    0x9d,
-    0xc9,
-    0x3f,
-    0x5e,
-    0x2e,
-    0x26,
-    0x35,
-    0x94,
-    0x86,
-    0x71,
-    0xa0,
-    0xb3,
-    0x49,
-    0x0a,
-    0x6c,
-    0xc7,
-    0xdf,
-    0x0c,
-    0x59,
-    0x63,
-    0x24,
-    0x30,
-    0x4e,
-    0x9e,
-    0x61,
-    0xef,
-    0xf1,
-    0x5c,
-    0x7c,
-    0xe7,
-    0x74,
-    0xcf,
-    0x6b,
-    0x80,
-    0xb1,
-    0x3d,
-    0xee,
-    0xcf,
-    0x7a,
-    0x03,
-    0x7e,
-    0xbb,
-    0x2a,
-    0xda,
-    0x80,
-    0x5e,
-    0x80,
-    0x59,
-    0xbf,
-    0xae,
-    0xae,
-    0xbb,
-    0x19,
-    0x5c,
-    0xac,
-    0xe3,
-    0x79,
-    0xfc,
-    0xd2,
-    0x9d,
-    0x05,
-    0x67,
-    0xa6,
-    0x27,
-    0x98,
-    0x5d,
-    0xf3,
-    0xf0,
-    0x72,
-    0x6f,
-    0x1b,
-    0x9f,
-    0x2e,
-    0x1c,
-    0xad,
-    0x57,
-    0xf5,
-    0x3b,
-    0x3a,
-    0x39,
-    0xf2,
-    0x99,
-    0x65,
-    0x2b,
-    0x05,
-    0xe2,
-    0x3a,
-    0xd8,
-    0xbc,
-    0xc5,
-    0xc1,
-    0xf8,
-    0x7f,
-    0x53,
-    0xd2,
-    0xd2,
-    0x0a,
-    0xa8,
-    0x2a,
-    0xff,
-    0x21,
-    0xce,
-    0xbf,
-    0x70,
-    0x7e,
-    0xde,
-    0x51,
-    0xb3,
-    0x0f,
-    0x68,
-    0x42,
-    0x71,
-    0x5e,
-    0x15,
-    0xa7,
-    0x3c,
-    0x51,
-    0x8b,
-    0x9f,
-    0x87,
-    0x13,
-    0x91,
-    0xe4,
-    0xf6,
-    0x52,
-    0x74,
-    0x9f,
-    0xd9,
-    0xab,
-    0xa9,
-    0x81,
-    0xf3,
-    0x62,
-    0xb3,
-    0x0f,
-    0x7f,
-    0x57,
-    0x48,
-    0x3d,
-    0x75,
-    0x35,
-    0xaf,
-    0x3f,
-    0x09,
-    0xed,
-    0x6c,
-    0x9c,
-    0x74,
-    0x63,
-    0x1f,
-    0x84,
-    0xf8,
-    0x66,
-    0xaa,
-    0x63,
-    0x1e,
-    0xe6,
-    0x92,
-    0xb6,
-    0x43,
-    0x61,
-    0xa8,
-    0x1e,
-    0x52,
-    0x9f,
-    0xe8,
-    0xb2,
-    0xd3,
-    0x9f,
-    0xa1,
-    0x9a,
-    0x25,
-    0xd1,
-    0xd6,
-    0xda,
-    0x07,
-    0x86,
-    0xe4,
-    0x6b,
-    0x5e,
-    0xa4,
-    0x66,
-    0x90,
-    0x32,
-    0x9e,
-    0x56,
-    0x67,
-    0xf9,
-    0xa3,
-    0x75,
-    0xbe,
-    0x18,
-    0x16,
-    0xec,
-    0x29,
-    0xa7,
-    0x3f,
-    0x33,
-    0x51,
-    0x74,
-    0x40,
-    0x32,
-    0x8f,
-    0x4b,
-    0x4a,
-    0xa6,
-    0xba,
-    0x75,
-    0x10,
-    0xc7,
-    0x3d,
-    0x7f,
-    0x7c,
-    0x28,
-    0x6c,
-    0x3d,
-    0xa1,
-    0xde,
-    0x18,
-    0x0d,
-    0xf2,
-    0xe4,
-    0x60,
-    0x60,
-    0xb1,
-    0xbe,
-    0xcb,
-    0x77,
-    0xaa,
-    0x5d,
-    0x94,
-    0x6b,
-    0x20,
-    0x43,
-    0x45,
-    0x70,
-    0x08,
-    0xe7,
-    0x87,
-    0x5a,
-    0x75,
-    0x5b,
-    0x39,
-    0x61,
-    0x54,
-    0x2c,
-    0xbf,
-    0x21,
-    0x59,
-    0x8a,
-    0x9d,
-    0xe5,
-    0x39,
-    0xa8,
-    0x44,
-    0x24,
-    0x1a,
-    0x66,
-    0x2b,
-    0x4c,
-    0x47,
-    0x2e,
-    0x22,
-    0xbf,
-    0x29,
-    0x1b,
-    0xe4,
-    0x1b,
-    0x73,
-    0x61,
-    0xeb,
-    0xbf,
-    0x9c,
-    0xe9,
-    0x88,
-    0x8b,
-    0x92,
-    0x3b,
-    0x32,
-    0xe6,
-    0xad,
-    0xa1,
-    0x1f,
-    0x06,
-    0xe1,
-    0x89,
-    0x11,
-    0x6c,
-    0x39,
-    0x2c,
-    0x73,
-    0xad,
-    0x80,
-    0x6d,
-    0xa4,
-    0x78,
-    0x41,
-    0x04,
-    0x93,
-    0xd5,
-    0xf3,
-    0xdb,
-    0x8c,
-    0xab,
-    0x6d,
-    0xb8,
-    0x51,
-    0x85,
-    0xa0,
-    0x1d,
-    0x6d,
-    0x95,
-    0x84,
-    0x6d,
-    0xc5,
-    0xfa,
-    0x53,
-    0x4f,
-    0x70,
-    0x3e,
-    0xf6,
-    0x57,
-    0xc8,
-    0x23,
-    0xbc,
-    0xe4,
-    0xc1,
-    0x9f,
-    0x52,
-    0x44,
-    0x7a,
-    0x25,
-    0xf0,
-    0x1f,
-    0x12,
-    0x26,
-    0xd0,
-    0x12,
-    0xbd,
-    0xd8,
-    0xe4,
-    0x9a,
-    0x17,
-    0x36,
-    0xc8,
-    0x34,
-    0xb8,
-    0x48,
-    0xf6,
-    0xc2,
-    0x08,
-    0xa4,
-    0x39,
-    0x31,
-    0x54,
-    0x35,
-    0x64,
-    0x59,
-    0x22,
-    0x3b,
-    0x43,
-    0x24,
-    0xc2,
-    0x93,
-    0xd2,
-    0xf3,
-    0x26,
-    0x39,
-    0xad,
-    0x3d,
-    0xf4,
-    0x0b,
-    0xc8,
-    0x79,
-    0xd8,
-    0xcf,
-    0x60,
-    0x3f,
-    0x1f,
-    0x78,
-    0x31,
-    0xaa,
-    0x82,
-    0xa5,
-    0xea,
-    0x00,
-    0x3f,
-    0x6b,
-    0xde,
-    0x95,
-    0x6f,
-    0x54,
-    0xfc,
-    0xec,
-    0x93,
-    0xa7,
-    0x01,
-    0x20,
-    0x70,
-    0xea,
-    0xec,
-    0x82,
-    0x1d,
-    0xa6,
-    0xb2,
-    0x84,
-    0x5a,
-    0x6a,
-    0x34,
-    0xd6,
-    0x23,
-    0x12,
-    0x6e,
-    0xce,
-    0x85,
-    0x49,
-    0xf1,
-    0x0d,
-    0xb1,
-    0x4d,
-    0x93,
-    0x60,
-    0x4f,
-    0xf3,
-    0x65,
-    0xe4,
-    0x14,
-    0xea,
-    0xe5,
-    0x6e,
-    0x97,
-    0x43,
-    0x75,
-    0x29,
-    0x60,
-    0x31,
-    0x0c,
-    0x81,
-    0x42,
-    0x0e,
-    0x2c,
-    0x40,
-    0xec,
-    0x9f,
-    0x14,
-    0xf7,
-    0xba,
-    0x99,
-    0x36,
-    0xa0,
-    0xd1,
-    0x64,
-    0xeb,
-    0x81,
-    0x6a,
-    0x1e,
-    0x66,
-    0x54,
-    0x6e,
-    0xe3,
-    0xe6,
-    0xa4,
-    0x44,
-    0x4c,
-    0x30,
-    0x7a,
-    0xe6,
-    0x35,
-    0x3d,
-    0x39,
-    0x3b,
-    0xc4,
-    0x30,
-    0xc7,
-    0xa1,
-    0xa7,
-    0x8b,
-    0xed,
-    0xc8,
-    0x9c,
-    0xa1,
-    0x01,
-    0xc7,
-    0x37,
-    0x4f,
-    0xc2,
-    0x69,
-    0xe0,
-    0xe7,
-    0x83,
-    0xc8,
-    0x1b,
-    0x6d,
-    0x8c,
-    0x1e,
-    0x0c,
-    0x06,
-    0xbd,
-    0xd7,
-    0x3a,
-    0xad,
-    0x74,
-    0xeb,
-    0x93,
-    0x28,
-    0xb1,
-    0x6a,
-    0xb0,
-    0x3a,
-    0x78,
-    0x59,
-    0x5b,
-    0x1b,
-    0x77,
-    0xbc,
-    0x4e,
-    0x25,
-    0xe9,
-    0xf4,
-    0x3e,
-    0xd0,
-    0xba,
-    0x4b,
-    0x18,
-    0xe0,
-    0xec,
-    0xce,
-    0x8b,
-    0xdd,
-    0x39,
-    0x5b,
-    0xc6,
-    0xc4,
-    0xfa,
-    0xfa,
-    0x83,
-    0xfc,
-    0x47,
-    0x70,
-    0x44,
-    0x8b,
-    0x60,
-    0x12,
-    0xdc,
-    0x8a,
-    0x4b,
-    0xd8,
-    0x32,
-    0xd6,
-    0xbf,
-    0xb2,
-    0x42,
-    0x09,
-    0x41,
-    0x1f,
-    0x64,
-    0xa9,
-    0x8d,
-    0xfb,
-    0xd1,
-    0x9f,
-    0x37,
-    0x98,
-    0x63,
-    0xea,
-    0x92,
-    0x11,
-    0x9c,
-    0x94,
-    0xd1,
-    0xdb,
-    0xea,
-    0xe5,
-    0x6c,
-    0x9d,
-    0x29,
-    0xd8,
-    0xc6,
-    0x42,
-    0x6a,
-    0xcb,
-    0x0c,
-    0x4c,
-    0xf3,
-    0x7a,
-    0x60,
-    0x6b,
-    0x87,
-    0x2e,
-    0x37,
-    0x4e,
-    0xe7,
-    0x32,
-    0xff,
-    0xb9,
-    0x98,
-    0x87,
-    0x06,
-    0xd8,
-    0xe7,
-    0xd8,
-    0x97,
-    0xd3,
-    0x2b,
-    0xb0,
-    0x66,
-    0xa2,
-    0x4a,
-    0xeb,
-    0x2d,
-    0x23,
-    0x7e,
-    0x6b,
-    0x98,
-    0x69,
-    0x59,
-    0x0c,
-    0x5f,
-    0x57,
-    0x07,
-    0xd9,
-    0xb1,
-    0x6e,
-    0xd4,
-    0x80,
-    0xd9,
-    0xe4,
-    0xed,
-    0x03,
-    0x1c,
-    0xf6,
-    0x6b,
-    0xb1,
-    0xe0,
-    0x7f,
-    0x8d,
-    0x55,
-    0x14,
-    0xc8,
-    0x45,
-    0xad,
-    0xcb,
-    0xa2,
-    0xf7,
-    0x1d,
-    0x2a,
-    0xb2,
-    0x7d,
-    0xa5,
-    0x85,
-    0x0d,
-    0x6e,
-    0x11,
-    0xc5,
-    0x05,
-    0xa0,
-    0x6f,
-    0x0d,
-    0x42,
-    0xeb,
-    0xc6,
-    0x9d,
-    0x14,
-    0x30,
-    0x05,
-    0xf6,
-    0x07,
-    0x9a,
-    0x3a,
-    0x3e,
-    0xb8,
-    0x24,
-    0x04,
-    0xe7,
-    0xe8,
-    0x5c,
-    0x4b,
-    0x8c,
-    0xcf,
-    0x66,
-    0x2e,
-    0x1b,
-    0xb2,
-    0x43,
-    0x3d,
-    0x39,
-    0xb8,
-    0x54,
-    0xe9,
-    0xe2,
-    0xfa,
-    0x19,
-    0x38,
-    0x50,
-    0xd9,
-    0x3f,
-    0xbe,
-    0x1f,
-    0x94,
-    0xda,
-    0xc8,
-    0xae,
-    0x1a,
-    0xef,
-    0xda,
-    0xc8,
-    0x1c,
-    0x35,
-    0x5c,
-    0x84,
-    0x67,
-    0x1c,
-    0x90,
-    0x69,
-    0x71,
-    0x0f,
-    0xc7,
-    0xd6,
-    0x31,
-    0xf6,
-    0xd5,
-    0xa1,
-    0x34,
-    0x00,
-    0xc2,
-    0xff,
-    0xee,
-    0x9f,
-    0xc2,
-    0xa4,
-    0x4e,
-    0xd4,
-    0x67,
-    0x2b,
-    0x95,
-    0xac,
-    0x16,
-    0xb7,
-    0x67,
-    0x0b,
-    0xb8,
-    0xdb,
-    0x22,
-    0xa8,
-    0xb1,
-    0xb7,
-    0x70,
-    0x59,
-    0x16,
-    0x64,
-    0x18,
-    0x91,
-    0x1a,
-    0x93,
-    0x1a,
-    0x26,
-    0xca,
-    0x70,
-    0xfa,
-    0x58,
-    0xfb,
-    0xcd,
-    0x5c,
-    0x10,
-    0x80,
-    0x7c,
-    0xd1,
-    0x65,
-    0xa0,
-    0xfc,
-    0xf1,
-    0x64,
-    0xc7,
-    0x59,
-    0xaa,
-    0x11,
-    0x7b,
-    0x4d,
-    0xd7,
-    0xa9,
-    0x92,
-    0xab,
-    0x14,
-    0x2a,
-    0xa2,
-    0xfd,
-    0xd1,
-    0x15,
-    0xba,
-    0x6c,
-    0xa6,
-    0x73,
-    0x4f,
-    0xe1,
-    0xe6,
-    0x16,
-    0x79,
-    0x6a,
-    0x77,
-    0x21,
-    0x60,
-    0xdf,
-    0xe1,
-    0xcb,
-    0xf0,
-    0xc5,
-    0xa4,
-    0x5f,
-    0xd5,
-    0x72,
-    0xcf,
-    0x87,
-    0xa3,
-    0x72,
-    0xce,
-    0xcb,
-    0x54,
-    0x2a,
-    0x84,
-    0x55,
-    0xf8,
-    0xbb,
-    0x9a,
-    0xf7,
-    0xa8,
-    0x2a,
-    0x16,
-    0x6f,
-    0xbc,
-    0xbd,
-    0x2f,
-    0xe9,
-    0x3e,
-    0xa8,
-    0x5f,
-    0xc5,
-    0x9e,
-    0xe8,
-    0xbb,
-    0x9b,
-    0xa6,
-    0x70,
-    0x80,
-    0x7c,
-    0xb1,
-    0x83,
-    0xee,
-    0x7b,
-    0x18,
-    0x61,
-    0x59,
-    0x6c,
-    0xee,
-    0x25,
-    0x7d,
-    0xec,
-    0xed,
-    0xee,
-    0x12,
-    0xa2,
-    0xaf,
-    0x3d,
-    0xa0,
-    0xc4,
-    0x22,
-    0x9e,
-    0x95,
-    0xdc,
-    0x36,
-    0x8b,
-    0x95,
-    0xcc,
-    0xd8,
-    0x8d,
-    0x11,
-    0x0f,
-    0x24,
-    0xa4,
-    0x1b,
-    0x43,
-    0xd6,
-    0xe9,
-    0x78,
-    0xe4,
-    0x02,
-    0x72,
-    0xf7,
-    0x5b,
-    0x06,
-    0x76,
-    0x02,
-    0x37,
-    0xbc,
-    0xb1,
-    0x73,
-    0xba,
-    0xf4,
-    0x0a,
-    0xa9,
-    0x97,
-    0x21,
-    0x74,
-    0xda,
-    0xfa,
-    0x52,
-    0x12,
-    0xaa,
-    0xc9,
-    0x64,
-    0x9e,
-    0xfd,
-    0x29,
-    0x76,
-    0x0b,
-    0x0a,
-    0x45,
-    0x9e,
-    0x69,
-    0xb2,
-    0x4b,
-    0xda,
-    0x0a,
-    0x0f,
-    0xb6,
-    0x4a,
-    0xe3,
-    0x4f,
-    0xd3,
-    0x9c,
-    0x34,
-    0xc3,
-    0x7e,
-    0xc7,
-    0x6c,
-    0x33,
-    0x2d,
-    0xfc,
-    0x47,
-    0x75,
-    0x31,
-    0xd9,
-    0x39,
-    0x3d,
-    0x38,
-    0xe1,
-    0x0f,
-    0x37,
-    0x15,
-    0x29,
-    0xd4,
-    0x53,
-    0xc4,
-    0x53,
-    0xf1,
-    0x61,
-    0xa8,
-    0xc0,
-    0x99,
-    0xdd,
-    0x18,
-    0x02,
-    0x64,
-    0x0c,
-    0x1a,
-    0x90,
-    0x3a,
-    0x48,
-    0x6e,
-    0xbe,
-    0x73,
-    0x97,
-    0xcf,
-    0xec,
-    0x3c,
-    0x83,
-    0x75,
-    0xfd,
-    0x3d,
-    0x26,
-    0xde,
-    0x0b,
-    0x79,
-    0x85,
-    0xce,
-    0x58,
-    0x75,
-    0x1f,
-    0x95,
-    0x88,
-    0x9c,
-    0xc5,
-    0x90,
-    0x0e,
-    0xe2,
-    0xab,
-    0xf2,
-    0xe5,
-    0xa8,
-    0xc0,
-    0xc4,
-    0x80,
-    0xdf,
-    0x3b,
-    0x2b,
-    0x03,
-    0x71,
-    0x76,
-    0xea,
-    0xb3,
-    0xdc,
-    0x00,
-    0x27,
-    0xab,
-    0x20,
-    0xee,
-    0x72,
-    0xd2,
-    0xdc,
-    0x71,
-    0x03,
-    0x09,
-    0xb4,
-    0xae,
-    0x43,
-    0xa9,
-    0xf5,
-    0xc9,
-    0x8f,
-    0x2c,
-    0x7c,
-    0x43,
-    0x38,
-    0x2a,
-    0xd4,
-    0x87,
-    0xce,
-    0x88,
-    0x9e,
-    0xbf,
-    0x9e,
-    0xec,
-    0x36,
-    0xec,
-    0x79,
-    0x73,
-    0x93,
-    0x36,
-    0xb7,
-    0xa7,
-    0x6f,
-    0x80,
-    0x7c,
-    0xab,
-    0xa8,
-    0x40,
-    0x3a,
-    0xb9,
-    0xe7,
-    0x8e,
-    0x77,
-    0xcf,
-    0x7f,
-    0x7b,
-    0xd1,
-    0xa4,
-    0x98,
-    0xa3,
-    0x3f,
-    0xe1,
-    0x8c,
-    0x06,
-    0x99,
-    0x8e,
-    0x91,
-    0x13,
-    0x5b,
-    0xca,
-    0x99,
-    0x06,
-    0xa6,
-    0xc0,
-    0x76,
-    0x74,
-    0x87,
-    0xd6,
-    0x42,
-    0x24,
-    0x7c,
-    0x27,
-    0xfe,
-    0x21,
-    0x34,
-    0x34,
-    0x79,
-    0x0d,
-    0x97,
-    0xd6,
-    0x73,
-    0xb8,
-    0x06,
-    0x78,
-    0x03,
-    0xf2,
-    0xe4,
-    0x82,
-    0x36,
-    0x9d,
-    0x55,
-    0x18,
-    0xf9,
-    0x06,
-    0x45,
-    0x05,
-    0x39,
-    0x75,
-    0xad,
-    0xf2,
-    0x48,
-    0x02,
-    0x11,
-    0xdc,
-    0x83,
-    0xab,
-    0x4e,
-    0xc5,
-    0x32,
-    0xa4,
-    0x92,
-    0xa9,
-    0xaf,
-    0xee,
-    0xac,
-    0xb3,
-    0xcb,
-    0x2b,
-    0x86,
-    0xb1,
-    0x6d,
-    0xb1,
-    0xef,
-    0xc6,
-    0x7c,
-    0xdd,
-    0x9e,
-    0x5e,
-    0xff,
-    0xa9,
-    0x74,
-    0x67,
-    0x83,
-    0x81,
-    0x02,
-    0xbf,
-    0xbd,
-    0x53,
-    0x4b,
-    0xe8,
-    0x71,
-    0xe6,
-    0xcb,
-    0x03,
-    0x93,
-    0x6c,
-    0xb8,
-    0xfc,
-    0xab,
-    0x5a,
-    0x87,
-    0x02,
-    0x7e,
-    0x77,
-    0xb2,
-    0x3a,
-    0xea,
-    0x33,
-    0xb9,
-    0xb4,
-    0x12,
-    0x3b,
-    0x67,
-    0x9e,
-    0xbb,
-    0x4a,
-    0x56,
-    0xb7,
-    0xf6,
-    0x42,
-    0xb5,
-    0x07,
-    0x00,
-    0x7b,
-    0x49,
-    0xce,
-    0x66,
-    0x5b,
-    0xb2,
-    0xba,
-    0x6c,
-    0x27,
-    0xf0,
-    0x5c,
-    0xb0,
-    0x18,
-    0x25,
-    0xdd,
-    0x0b,
-    0xb2,
-    0x9c,
-    0xed,
-    0xb8,
-    0x51,
-    0x0b,
-    0xfd,
-    0xb8,
-    0x05,
-    0x15,
-    0xae,
-    0x74,
-    0x9f,
-    0x13,
-    0x89,
-    0xa5,
-    0x0c,
-    0x14,
-    0xf0,
-    0x71,
-    0xe2,
-    0x22,
-    0x54,
-    0xd6,
-    0x39,
-    0xc8,
-    0xa9,
-    0x4c,
-    0xbc,
-    0xd1,
-    0x17,
-    0xa6,
-    0x00,
-    0x51,
-    0xf3,
-    0x3a,
-    0x14,
-    0xea,
-    0xed,
-    0x41,
-    0x59,
-    0x48,
-    0x8b,
-    0x81,
-    0x93,
-    0xee,
-    0xd6,
-    0x29,
-    0x41,
-    0x35,
-    0x53,
-    0xfc,
-    0x2a,
-    0x91,
-    0x34,
-    0xb1,
-    0x39,
-    0x17,
-    0xd0,
-    0x9a,
-    0x8a,
-    0x3c,
-    0x51,
-    0x85,
-    0xc5,
-    0xe0,
-    0xac,
-    0xe0,
-    0xab,
-    0x8b,
-    0xd7,
-    0x20,
-    0xee,
-    0xf6,
-    0x36,
-    0x63,
-    0x46,
-    0xcd,
-    0x56,
-    0x53,
-    0xc1,
-    0xb3,
-    0xdd,
-    0x4e,
-    0x5b,
-    0x87,
-    0xc1,
-    0xc5,
-    0xce,
-    0xe5,
-    0xb9,
-    0xe2,
-    0xab,
-    0xf0,
-    0xf1,
-    0x6e,
-    0xaa,
-    0x4f,
-    0x02,
-    0xf1,
-    0x3e,
-    0x76,
-    0x21,
-    0x1b,
-    0x6d,
-    0x27,
-    0x96,
-    0x62,
-    0xdf,
-    0x38,
-    0x71,
-    0xed,
-    0x35,
-    0x96,
-    0x78,
-    0xb1,
-    0x9c,
-    0x8a,
-    0x63,
-    0xda,
-    0xa1,
-    0x3b,
-    0x4c,
-    0x6c,
-    0x47,
-    0x75,
-    0x61,
-    0x2a,
-    0x56,
-    0xa8,
-    0xdc,
-    0xb7,
-    0xf7,
-    0x34,
-    0x35,
-    0xfb,
-    0x7e,
-    0xe3,
-    0x95,
-    0xc8,
-    0x87,
-    0xb7,
-    0x8f,
-    0xbd,
-    0x44,
-    0xe7,
-    0x0b,
-    0x6b,
-    0x15,
-    0x24,
-    0x82,
-    0xb7,
-    0x59,
-    0x20,
-    0x71,
-    0x7f,
-    0x85,
-    0x51,
-    0x07,
-    0x81,
-    0x73,
-    0xf3,
-    0x21,
-    0x78,
-    0xfc,
-    0x4c,
-    0x79,
-    0x87,
-    0xc8,
-    0x33,
-    0x1a,
-    0xdb,
-    0x65,
-    0xd3,
-    0x18,
-    0x8d,
-    0x97,
-    0xad,
-    0x7d,
-    0xc5,
-    0xef,
-    0xdc,
-    0x86,
-    0x25,
-    0x9f,
-    0x9d,
-    0x10,
-    0x65,
-    0x8d,
-    0x0e,
-    0x4d,
-    0x3a,
-    0xa6,
-    0x36,
-    0xbb,
-    0x7d,
-    0x75,
-    0x46,
-    0x57,
-    0x89,
-    0xf4,
-    0x1e,
-    0x0e,
-    0xe5,
-    0xa2,
-    0x13,
-    0x74,
-    0x23,
-    0xd5,
-    0xf0,
-    0xb8,
-    0x07,
-    0x52,
-    0x3a,
-    0xd8,
-    0xec,
-    0x1b,
-    0xb9,
-    0x11,
-    0x64,
-    0x88,
-    0x33,
-    0x9a,
-    0x1f,
-    0x99,
-    0x7b,
-    0x91,
-    0x0e,
-    0x8b,
-    0xab,
-    0x36,
-    0xc7,
-    0xa9,
-    0xad,
-    0x57,
-    0x2c,
-    0x65,
-    0x00,
-    0x0b,
-    0x47,
-    0xa7,
-    0xb8,
-    0xa3,
-    0x79,
-    0x65,
-    0xc7,
-    0xde,
-    0xd4,
-    0x74,
-    0x7c,
-    0x5c,
-    0xc5,
-    0x9e,
-    0x49,
-    0x55,
-    0xf6,
-    0xf4,
-    0xc9,
-    0x8b,
-    0x72,
-    0x65,
-    0x01,
-    0x7d,
-    0x0b,
-    0x90,
-    0xe7,
-    0xde,
-    0xf9,
-    0xd7,
-    0x20,
-    0x45,
-    0xc3,
-    0xb5,
-    0x0e,
-    0x26,
-    0x63,
-    0x51,
-    0x0a,
-    0x01,
-    0xa5,
-    0x53,
-    0xee,
-    0xd9,
-    0xd0,
-    0xf6,
-    0xd7,
-    0xe8,
-    0x88,
-    0x5e,
-    0x29,
-    0x91,
-    0xf3,
-    0x2d,
-    0xd3,
-    0x96,
-    0x1b,
-    0x51,
-    0xd4,
-    0x8b,
-    0x93,
-    0x1f,
-    0xfe,
-    0x8b,
-    0x5e,
-    0xa6,
-    0xf9,
-    0x29,
-    0x0c,
-    0x3d,
-    0x8c,
-    0xa9,
-    0x26,
-    0x5f,
-    0x18,
-    0x71,
-    0xcc,
-    0xb9,
-    0x65,
-    0xba,
-    0x9d,
-    0x80,
-    0xa1,
-    0x8b,
-    0xd7,
-    0x08,
-    0xa6,
-    0xe8,
-    0xbf,
-    0x93,
-    0x7c,
-    0x47,
-    0x44,
-    0x67,
-    0x1f,
-    0x43,
-    0xdf,
-    0x23,
-    0x82,
-    0x94,
-    0xbd,
-    0x52,
-    0xd3,
-    0x3f,
-    0x20,
-    0x41,
-    0x01,
-    0x0a,
-    0x03,
-    0x0e,
-    0x7c,
-    0x33,
-    0xfd,
-    0x02,
-    0x3c,
-    0x61,
-    0x67,
-    0x20,
-    0x04,
-    0xdb,
-    0xc1,
-    0xfe,
-    0xe8,
-    0xf8,
-    0x52,
-    0xd4,
-    0x0d,
-    0xd7,
-    0x0f,
-    0xd3,
-    0xb0,
-    0x4f,
-    0xbe,
-    0xb8,
-    0x69,
-    0x29,
-    0x5b,
-    0xa0,
-    0xb1,
-    0x8d,
-    0xbb,
-    0x1e,
-    0xa3,
-    0xbb,
-    0x6f,
-    0x8b,
-    0xff,
-    0xfc,
-    0xeb,
-    0x9d,
-    0x74,
-    0xd7,
-    0xe8,
-    0x3b,
-    0x1f,
-    0x87,
-    0x06,
-    0x90,
-    0x4f,
-    0xad,
-    0xb6,
-    0x5f,
-    0x8b,
-    0x43,
-    0x57,
-    0x96,
-    0xd6,
-    0xd1,
-    0x9f,
-    0x25,
-    0x31,
-    0xe3,
-    0x3d,
-    0x10,
-    0x62,
-    0xba,
-    0xbc,
-    0xc3,
-    0xf4,
-    0x42,
-    0xab,
-    0xa7,
-    0x7f,
-    0x44,
-    0xfb,
-    0xf2,
-    0x29,
-    0xdd,
-    0xa8,
-    0xc3,
-    0x6d,
-    0x2f,
-    0x9c,
-    0x6e,
-    0x1b,
-    0x56,
-    0xd0,
-    0x14,
-    0xa0,
-    0x9d,
-    0xb4,
-    0x78,
-    0x88,
-    0xf2,
-    0xd1,
-    0x0d,
-    0x41,
-    0x98,
-    0xac,
-    0x54,
-    0x22,
-    0x1c,
-    0xee,
-    0x64,
-    0xab,
-    0x8a,
-    0xc3,
-    0xca,
-    0x0f,
-    0xe0,
-    0x80,
-    0x94,
-    0xef,
-    0xc3,
-    0x88,
-    0xa9,
-    0x69,
-    0x71,
-    0x70,
-    0x5c,
-    0x51,
-    0xf7,
-    0x61,
-    0x40,
-    0xbe,
-    0xa4,
-    0xbe,
-    0x3d,
-    0xc9,
-    0xbd,
-    0x07,
-    0xe3,
-    0x91,
-    0x72,
-    0xfe,
-    0xff,
-    0x83,
-    0x11,
-    0x08,
-    0x6c,
-    0xd8,
-    0x7a,
-    0xd5,
-    0x2c,
-    0x5e,
-    0xd3,
-    0x43,
-    0xb7,
-    0x7c,
-    0x7d,
-    0x80,
-    0x93,
-    0x70,
-    0x46,
-    0x6f,
-    0x25,
-    0xdc,
-    0xe0,
-    0x4e,
-    0xc7,
-    0x81,
-    0x92,
-    0x95,
-    0x1b,
-    0x4a,
-    0x2d,
-    0x21,
-    0x9e,
-    0x8c,
-    0x42,
-    0x91,
-    0x80,
-    0x8c,
-    0x92,
-    0xf1,
-    0xb3,
-    0x42,
-    0xc6,
-    0x96,
-    0x42,
-    0x5c,
-    0x60,
-    0x48,
-    0xe4,
-    0x86,
-    0xf2,
-    0xa7,
-    0xd1,
-    0xe9,
-    0x8d,
-    0xc7,
-    0xd4,
-    0xf1,
-    0x7d,
-    0x1e,
-    0xa1,
-    0x54,
-    0x33,
-    0xa0,
-    0x6a,
-    0x50,
-    0x83,
-    0x28,
-    0xad,
-    0x34,
-    0x10,
-    0x1a,
-    0x50,
-    0x21,
-    0x04,
-    0x46,
-    0xef,
-    0x12,
-    0x04,
-    0x10,
-    0x75,
-    0x1a,
-    0x63,
-    0xce,
-    0xe9,
-    0xed,
-    0x95,
-    0x72,
-    0x8b,
-    0xa2,
-    0xe7,
-    0x69,
-    0x20,
-    0xb7,
-    0x6e,
-    0xc3,
-    0x8a,
-    0x56,
-    0x3d,
-    0x93,
-    0x9b,
-    0xd6,
-    0xdb,
-    0x99,
-    0x2b,
-    0x85,
-    0xf5,
-    0x1e,
-    0x68,
-    0xa5,
-    0x4f,
-    0x20,
-    0x6e,
-    0xb4,
-    0x00,
-    0xaf,
-    0x18,
-    0xf1,
-    0xdf,
-    0x97,
-    0x15,
-    0x1b,
-    0x39,
-    0x3f,
-    0x3e,
-    0x7c,
-    0xc5,
-    0xd1,
-    0x26,
-    0x26,
-    0xd9,
-    0x9b,
-    0xf3,
-    0x7d,
-    0xdd,
-    0xb6,
-    0x6d,
-    0xf5,
-    0x01,
-    0xe5,
-    0x55,
-    0x1d,
-    0x2b,
-    0xbf,
-    0xf8,
-    0xdd,
-    0x33,
-    0x11,
-    0x04,
-    0xfb,
-    0x53,
-    0x7e,
-    0x99,
-    0xe4,
-    0xd9,
-    0x68,
-    0xa3,
-    0xaa,
-    0x1f,
-    0x14,
-    0x68,
-    0x49,
-    0xbd,
-    0x08,
-    0x5d,
-    0x2e,
-    0xfd,
-    0xb8,
-    0x3e,
-    0xfa,
-    0x90,
-    0x62,
-    0x5d,
-    0x83,
-    0x7f,
-    0x37,
-    0x3b,
-    0x1b,
-    0x64,
-    0xbb,
-    0x55,
-    0x16,
-    0xd9,
-    0x6e,
-    0x40,
-    0x86,
-    0x31,
-    0xac,
-    0xf8,
-    0x49,
-    0x66,
-    0xd2,
-    0x76,
-    0x46,
-    0x53,
-    0xa2,
-    0x80,
-    0xf3,
-    0x23,
-    0xe9,
-    0xc5,
-    0x1b,
-    0x0a,
-    0x5e,
-    0x29,
-    0xde,
-    0x33,
-    0xce,
-    0x5e,
-    0xf9,
-    0xf9,
-    0x76,
-    0xb4,
-    0x47,
-    0x59,
-    0xb1,
-    0x32,
-    0x88,
-    0xa7,
-    0xd3,
-    0xe5,
-    0x62,
-    0x81,
-    0x54,
-    0x78,
-    0xa5,
-    0x02,
-    0x31,
-    0x05,
-    0xd3,
-    0x37,
-    0x8f,
-    0x2b,
-    0xe0,
-    0xd7,
-    0xa1,
-    0x61,
-    0x36,
-    0x2e,
-    0xcd,
-    0x89,
-    0xfc,
-    0x5b,
-    0x0a,
-    0xc9,
-    0x98,
-    0xbb,
-    0x8d,
-    0x96,
-    0x72,
-    0xa5,
-    0xa4,
-    0x11,
-    0xfb,
-    0x58,
-    0xe2,
-    0x97,
-    0xef,
-    0x31,
-    0x7c,
-    0x93,
-    0xd7,
-    0x22,
-    0xf3,
-    0x97,
-    0xd1,
-    0x5f,
-    0xf3,
-    0xac,
-    0x93,
-    0x5a,
-    0x7c,
-    0xe6,
-    0xae,
-    0xf2,
-    0x3f,
-    0x3b,
-    0x10,
-    0xe7,
-    0x4b,
-    0x94,
-    0xcd,
-    0x92,
-    0xe8,
-    0x25,
-    0x1f,
-    0xd3,
-    0xc3,
-    0xfa,
-    0xab,
-    0x4a,
-    0x4c,
-    0xd3,
-    0x05,
-    0xca,
-    0x5d,
-    0x32,
-    0x77,
-    0x0a,
-    0x1c,
-    0xb2,
-    0xfe,
-    0x9e,
-    0x22,
-    0x9a,
-    0x96,
-    0x26,
-    0xdd,
-    0xb2,
-    0xb7,
-    0xc6,
-    0x32,
-    0x56,
-    0x20,
-    0xd6,
-    0x67,
-    0xc8,
-    0xd3,
-    0xda,
-    0x41,
-    0xcb,
-    0x61,
-    0xb4,
-    0x69,
-    0x6d,
-    0x67,
-    0x18,
-    0x14,
-    0x24,
-    0x59,
-    0x41,
-    0xe3,
-    0x1c,
-    0x7e,
-    0xe2,
-    0x08,
-    0xd0,
-    0x3c,
-    0x60,
-    0xab,
-    0xd8,
-    0x96,
-    0x3e,
-    0x8c,
-    0x01,
-    0xf3,
-    0xd9,
-    0xe9,
-    0xa3,
-    0x21,
-    0x55,
-    0xa2,
-    0x2f,
-    0x99,
-    0xd7,
-    0x9b,
-    0x08,
-    0x05
-  ],
-  const [
-    0xf9,
-    0xee,
-    0x55,
-    0xf8,
-    0x7a,
-    0xe8,
-    0x34,
-    0x3e,
-    0x45,
-    0xf0,
-    0x1f,
-    0xb2,
-    0x85,
-    0x95,
-    0x3c,
-    0x75,
-    0x2c,
-    0x15,
-    0xa1,
-    0xd8,
-    0x92,
-    0x73,
-    0x14,
-    0x14,
-    0x5e,
-    0xcb,
-    0x14,
-    0x3c,
-    0xaa,
-    0xe3,
-    0x1e,
-    0x6f,
-    0x62,
-    0x02,
-    0x29,
-    0x52,
-    0xed,
-    0x05,
-    0x73,
-    0xbd,
-    0x10,
-    0xaf,
-    0x7f,
-    0xb5,
-    0x0f,
-    0x41,
-    0x5e,
-    0x9b,
-    0x15,
-    0x4a,
-    0x2f,
-    0xa2,
-    0xd5,
-    0xc1,
-    0xe2,
-    0x87,
-    0x72,
-    0x51,
-    0x41,
-    0x7c,
-    0x9c,
-    0xf4,
-    0x30,
-    0x65,
-    0xfd,
-    0xc3,
-    0x33,
-    0x46,
-    0xd3,
-    0x0d,
-    0x32,
-    0xfc,
-    0xde,
-    0xa6,
-    0x79,
-    0x2c,
-    0x7c,
-    0x81,
-    0x03,
-    0x7a,
-    0x13,
-    0x81,
-    0xf8,
-    0xfb,
-    0xaf,
-    0x8d,
-    0x74,
-    0xec,
-    0xec,
-    0xe3,
-    0x8a,
-    0xa4,
-    0x17,
-    0xae,
-    0x89,
-    0xc7,
-    0x90,
-    0xda,
-    0x7d,
-    0xbd,
-    0x72,
-    0x27,
-    0xf9,
-    0x62,
-    0x76,
-    0x7c,
-    0x14,
-    0xff,
-    0x15,
-    0x7f,
-    0xb2,
-    0x7a,
-    0xed,
-    0x62,
-    0x05,
-    0xc9,
-    0x66,
-    0xff,
-    0x53,
-    0xac,
-    0x95,
-    0x28,
-    0xf9,
-    0x9c,
-    0x61,
-    0x38,
-    0xb0,
-    0xfe,
-    0xe4,
-    0xee,
-    0x0f,
-    0x9d,
-    0x14,
-    0x7c,
-    0x51,
-    0x57,
-    0xa2,
-    0xda,
-    0x59,
-    0x17,
-    0x22,
-    0x60,
-    0xf3,
-    0x03,
-    0x6d,
-    0x94,
-    0x5d,
-    0xf6,
-    0x43,
-    0x41,
-    0x06,
-    0x30,
-    0x35,
-    0xc9,
-    0x95,
-    0x4c,
-    0xc2,
-    0xbb,
-    0x2d,
-    0x73,
-    0xc1,
-    0xa8,
-    0xef,
-    0xd0,
-    0xff,
-    0x33,
-    0xc1,
-    0x43,
-    0x28,
-    0x68,
-    0x4e,
-    0x5a,
-    0xeb,
-    0x4f,
-    0x4e,
-    0x7d,
-    0x59,
-    0xc0,
-    0x08,
-    0x68,
-    0x8e,
-    0x78,
-    0x15,
-    0xdf,
-    0x94,
-    0x6d,
-    0x66,
-    0x9c,
-    0x84,
-    0x5f,
-    0x89,
-    0x8d,
-    0xee,
-    0xb0,
-    0x27,
-    0x3c,
-    0x7b,
-    0x75,
-    0xd2,
-    0x8f,
-    0xd1,
-    0xcd,
-    0xfd,
-    0xb1,
-    0xb7,
-    0x72,
-    0x4c,
-    0x50,
-    0x7a,
-    0x8d,
-    0x0f,
-    0x09,
-    0x8f,
-    0xcf,
-    0x09,
-    0x20,
-    0x79,
-    0xbd,
-    0x75,
-    0x75,
-    0xee,
-    0x4b,
-    0x4b,
-    0xb3,
-    0x35,
-    0xad,
-    0xbf,
-    0xcb,
-    0xd2,
-    0x6a,
-    0x0a,
-    0xa1,
-    0x65,
-    0xb2,
-    0x6e,
-    0x04,
-    0xd0,
-    0xf1,
-    0x74,
-    0xe4,
-    0x98,
-    0xa4,
-    0x79,
-    0xbf,
-    0x8e,
-    0x6c,
-    0x68,
-    0x5d,
-    0xae,
-    0x60,
-    0xc9,
-    0xbd,
-    0x47,
-    0xa8,
-    0xfb,
-    0x4f,
-    0x5c,
-    0x48,
-    0xbd,
-    0x64,
-    0x4a,
-    0x39,
-    0xf4,
-    0xe2,
-    0xac,
-    0xbe,
-    0xa8,
-    0x3c,
-    0x7c,
-    0xf5,
-    0x4f,
-    0xa1,
-    0x7b,
-    0xac,
-    0x4e,
-    0x74,
-    0xd2,
-    0x77,
-    0xbd,
-    0xfd,
-    0xf9,
-    0xff,
-    0x6a,
-    0x5e,
-    0xd8,
-    0x9d,
-    0x21,
-    0xc8,
-    0x2c,
-    0x28,
-    0x2b,
-    0xee,
-    0x2d,
-    0x0b,
-    0x15,
-    0xba,
-    0x6e,
-    0x9a,
-    0xb3,
-    0x3f,
-    0x04,
-    0xa6,
-    0x63,
-    0xf0,
-    0xea,
-    0x4e,
-    0x96,
-    0x0f,
-    0xa4,
-    0x19,
-    0x8d,
-    0x68,
-    0x23,
-    0x42,
-    0x61,
-    0x3e,
-    0xe9,
-    0x53,
-    0x46,
-    0x86,
-    0x6d,
-    0xf5,
-    0x10,
-    0x53,
-    0xc1,
-    0x07,
-    0xf7,
-    0x92,
-    0x72,
-    0xed,
-    0x97,
-    0xf7,
-    0xb0,
-    0x2b,
-    0x3b,
-    0x37,
-    0xae,
-    0x32,
-    0x5a,
-    0x78,
-    0x4c,
-    0x79,
-    0x62,
-    0x05,
-    0xf4,
-    0xd0,
-    0xb5,
-    0x47,
-    0xc1,
-    0xf2,
-    0xf1,
-    0xf1,
-    0xe7,
-    0x59,
-    0x75,
-    0x7a,
-    0x4f,
-    0x56,
-    0x21,
-    0xd0,
-    0x81,
-    0x60,
-    0x5c,
-    0x4b,
-    0xc7,
-    0xad,
-    0x5c,
-    0xdf,
-    0x8f,
-    0xff,
-    0xa2,
-    0x97,
-    0x12,
-    0xc1,
-    0xc3,
-    0x3e,
-    0x33,
-    0x52,
-    0x6e,
-    0x5f,
-    0xaa,
-    0xa1,
-    0xab,
-    0x71,
-    0x61,
-    0xfa,
-    0x61,
-    0x4b,
-    0x1e,
-    0x1f,
-    0x1b,
-    0xde,
-    0x63,
-    0x9b,
-    0x0b,
-    0x22,
-    0x93,
-    0x53,
-    0x50,
-    0x51,
-    0x55,
-    0x5e,
-    0x74,
-    0x54,
-    0x3d,
-    0x16,
-    0x39,
-    0x7a,
-    0xaa,
-    0x6f,
-    0x95,
-    0x70,
-    0xea,
-    0x88,
-    0xfb,
-    0x6e,
-    0xa5,
-    0x80,
-    0xdc,
-    0xae,
-    0x78,
-    0x8b,
-    0x6e,
-    0x22,
-    0xe0,
-    0x45,
-    0xac,
-    0x66,
-    0x5a,
-    0x46,
-    0x9e,
-    0xf4,
-    0xc8,
-    0xf6,
-    0xda,
-    0x97,
-    0x17,
-    0xa2,
-    0x4b,
-    0x22,
-    0x1f,
-    0xd0,
-    0x31,
-    0x61,
-    0xca,
-    0xd0,
-    0x69,
-    0x50,
-    0x79,
-    0x94,
-    0xef,
-    0x8b,
-    0xa3,
-    0xc2,
-    0xa1,
-    0x06,
-    0xbf,
-    0x06,
-    0x45,
-    0xfe,
-    0x65,
-    0xad,
-    0xce,
-    0x2f,
-    0xb0,
-    0x70,
-    0xdb,
-    0x48,
-    0xe6,
-    0x8d,
-    0x81,
-    0x9c,
-    0x5b,
-    0x1d,
-    0x4a,
-    0x1a,
-    0x92,
-    0xa1,
-    0x7d,
-    0x7f,
-    0xa6,
-    0xde,
-    0xa0,
-    0xca,
-    0xe8,
-    0xeb,
-    0x3c,
-    0xf0,
-    0xca,
-    0x88,
-    0xe0,
-    0xd2,
-    0xfc,
-    0xb1,
-    0x68,
-    0x6c,
-    0xd4,
-    0x73,
-    0x7f,
-    0x4f,
-    0xf3,
-    0xff,
-    0x63,
-    0x51,
-    0x26,
-    0xfd,
-    0xe9,
-    0x83,
-    0x8a,
-    0x22,
-    0xc0,
-    0x63,
-    0xf4,
-    0x05,
-    0xf9,
-    0x53,
-    0x8f,
-    0x2e,
-    0xc7,
-    0x4a,
-    0xc7,
-    0x70,
-    0x84,
-    0xca,
-    0x66,
-    0x7a,
-    0xf5,
-    0x12,
-    0xfd,
-    0xa8,
-    0xcf,
-    0x94,
-    0x86,
-    0x1f,
-    0x7a,
-    0xa9,
-    0x47,
-    0x18,
-    0x14,
-    0x84,
-    0xfa,
-    0x7c,
-    0xb9,
-    0x64,
-    0x2a,
-    0xb2,
-    0x02,
-    0x0e,
-    0xe0,
-    0xb4,
-    0xcb,
-    0x7b,
-    0x7f,
-    0x69,
-    0x3a,
-    0xce,
-    0xed,
-    0x2f,
-    0xfd,
-    0x89,
-    0xf3,
-    0xb6,
-    0xd2,
-    0xff,
-    0xe7,
-    0x15,
-    0x4d,
-    0x0d,
-    0x88,
-    0x17,
-    0xd6,
-    0x05,
-    0x29,
-    0xd6,
-    0xf1,
-    0xeb,
-    0x12,
-    0x8c,
-    0xc2,
-    0xe4,
-    0x23,
-    0xa5,
-    0xd0,
-    0xeb,
-    0xba,
-    0x19,
-    0x09,
-    0xc6,
-    0xd7,
-    0xf8,
-    0x06,
-    0x38,
-    0x7e,
-    0x47,
-    0x91,
-    0x79,
-    0x5d,
-    0x0a,
-    0x64,
-    0xe3,
-    0xaf,
-    0xa2,
-    0x34,
-    0xee,
-    0x60,
-    0x59,
-    0xee,
-    0x5e,
-    0x72,
-    0x3c,
-    0x41,
-    0xbb,
-    0x9f,
-    0x29,
-    0x5c,
-    0x02,
-    0x40,
-    0x28,
-    0xf9,
-    0x9a,
-    0x6d,
-    0xfe,
-    0x9a,
-    0x89,
-    0x66,
-    0x00,
-    0x12,
-    0xe8,
-    0x31,
-    0x26,
-    0x48,
-    0x94,
-    0x85,
-    0x60,
-    0x38,
-    0x27,
-    0xe7,
-    0x2d,
-    0x3a,
-    0x27,
-    0x13,
-    0x69,
-    0x87,
-    0x7d,
-    0x9d,
-    0x66,
-    0xf9,
-    0x28,
-    0xd8,
-    0x3f,
-    0x12,
-    0x32,
-    0xf7,
-    0x69,
-    0x40,
-    0xe3,
-    0x72,
-    0x8b,
-    0x5f,
-    0x36,
-    0xac,
-    0x90,
-    0x80,
-    0x89,
-    0xd2,
-    0xfa,
-    0xe9,
-    0x98,
-    0x06,
-    0x79,
-    0x5d,
-    0xac,
-    0xbd,
-    0xbc,
-    0x9d,
-    0x10,
-    0x65,
-    0x87,
-    0x2e,
-    0xc5,
-    0x4c,
-    0x06,
-    0x5d,
-    0x76,
-    0xbd,
-    0x61,
-    0x81,
-    0xae,
-    0x6c,
-    0x90,
-    0x80,
-    0x49,
-    0x13,
-    0x71,
-    0x94,
-    0x29,
-    0x5e,
-    0x17,
-    0x4f,
-    0x2a,
-    0x05,
-    0x65,
-    0xdd,
-    0x57,
-    0x37,
-    0xdc,
-    0x8a,
-    0x5e,
-    0x3f,
-    0xb2,
-    0x83,
-    0x41,
-    0x62,
-    0x24,
-    0xe1,
-    0x4f,
-    0x06,
-    0x0d,
-    0xe3,
-    0x53,
-    0x1a,
-    0xb6,
-    0x7b,
-    0x0b,
-    0xb1,
-    0xf0,
-    0x0d,
-    0xdb,
-    0xf0,
-    0x60,
-    0x73,
-    0xc3,
-    0x2b,
-    0x1b,
-    0x44,
-    0x8f,
-    0x4b,
-    0x73,
-    0x56,
-    0x4d,
-    0x73,
-    0x10,
-    0x81,
-    0x04,
-    0xe3,
-    0x42,
-    0xa6,
-    0xa3,
-    0x1c,
-    0x95,
-    0xf0,
-    0x38,
-    0x44,
-    0xa6,
-    0x5a,
-    0x62,
-    0xcd,
-    0x36,
-    0x72,
-    0x09,
-    0x52,
-    0x7d,
-    0x5c,
-    0x4c,
-    0xc1,
-    0xc0,
-    0x19,
-    0xbb,
-    0xbf,
-    0x26,
-    0x0a,
-    0xc7,
-    0x48,
-    0xc8,
-    0xaf,
-    0x76,
-    0x96,
-    0x07,
-    0xb5,
-    0x5c,
-    0x45,
-    0x22,
-    0x30,
-    0xc6,
-    0xb4,
-    0x08,
-    0x25,
-    0x38,
-    0xae,
-    0x6a,
-    0x4b,
-    0x1a,
-    0x4a,
-    0x15,
-    0x12,
-    0xae,
-    0x0f,
-    0x7f,
-    0xe5,
-    0x45,
-    0x5c,
-    0x9f,
-    0xac,
-    0xb3,
-    0x07,
-    0x02,
-    0x96,
-    0x00,
-    0x45,
-    0x1c,
-    0x15,
-    0x60,
-    0xca,
-    0xdc,
-    0x2a,
-    0x65,
-    0x31,
-    0x83,
-    0xe2,
-    0x74,
-    0x9d,
-    0xb5,
-    0x21,
-    0x76,
-    0xa1,
-    0xd0,
-    0x9e,
-    0xcf,
-    0x5d,
-    0x7e,
-    0x2f,
-    0x94,
-    0xea,
-    0x86,
-    0x47,
-    0xf8,
-    0xf9,
-    0xe8,
-    0xbc,
-    0x08,
-    0xb6,
-    0x28,
-    0xce,
-    0x99,
-    0xf3,
-    0xea,
-    0x66,
-    0x7e,
-    0x82,
-    0xbf,
-    0x9b,
-    0xfe,
-    0xe2,
-    0x3f,
-    0x7a,
-    0x85,
-    0x1f,
-    0x58,
-    0x07,
-    0x99,
-    0xf3,
-    0xe5,
-    0x7f,
-    0x10,
-    0x31,
-    0x82,
-    0xe0,
-    0x80,
-    0x63,
-    0x9f,
-    0xab,
-    0xf8,
-    0xb2,
-    0xd4,
-    0xe9,
-    0xed,
-    0x07,
-    0x74,
-    0x6c,
-    0x77,
-    0x70,
-    0x65,
-    0x57,
-    0xbe,
-    0xc5,
-    0x2f,
-    0xe1,
-    0xae,
-    0x8b,
-    0x52,
-    0x55,
-    0xf3,
-    0x18,
-    0xdd,
-    0x5d,
-    0x21,
-    0xf8,
-    0x3c,
-    0x81,
-    0x32,
-    0x90,
-    0x52,
-    0xeb,
-    0x36,
-    0x01,
-    0xc8,
-    0x6d,
-    0x46,
-    0x50,
-    0xa4,
-    0xc5,
-    0xba,
-    0xc3,
-    0x1d,
-    0x1f,
-    0x9c,
-    0x8e,
-    0xad,
-    0xdb,
-    0x5c,
-    0xae,
-    0x69,
-    0x91,
-    0xc4,
-    0x16,
-    0x8e,
-    0x52,
-    0x2f,
-    0x09,
-    0x5c,
-    0x31,
-    0xf6,
-    0xc7,
-    0x27,
-    0x02,
-    0x2c,
-    0x6b,
-    0xab,
-    0x62,
-    0x8b,
-    0x14,
-    0xa0,
-    0xf8,
-    0xad,
-    0x43,
-    0x8e,
-    0xfa,
-    0x80,
-    0x84,
-    0xe3,
-    0xf2,
-    0xf4,
-    0x51,
-    0x43,
-    0xc2,
-    0xf6,
-    0x33,
-    0x1f,
-    0xe5,
-    0xa2,
-    0x2a,
-    0x89,
-    0xf9,
-    0xb4,
-    0x4f,
-    0x46,
-    0x7a,
-    0x40,
-    0xb8,
-    0x25,
-    0xd1,
-    0xa4,
-    0x9c,
-    0x90,
-    0x8d,
-    0xba,
-    0xb7,
-    0x61,
-    0xf0,
-    0x52,
-    0xf0,
-    0xf7,
-    0xad,
-    0xdf,
-    0x3a,
-    0x88,
-    0xf0,
-    0x70,
-    0xb8,
-    0xb8,
-    0x9f,
-    0xe2,
-    0x24,
-    0x6b,
-    0xdf,
-    0x54,
-    0x71,
-    0xd8,
-    0xdb,
-    0xdc,
-    0xaf,
-    0xe0,
-    0xc1,
-    0x78,
-    0x30,
-    0x9d,
-    0x0c,
-    0x48,
-    0xe9,
-    0x3d,
-    0x09,
-    0xfa,
-    0x1a,
-    0x11,
-    0x94,
-    0x85,
-    0x32,
-    0xe1,
-    0x23,
-    0x1a,
-    0xed,
-    0x83,
-    0x07,
-    0x57,
-    0xbf,
-    0xab,
-    0xee,
-    0xbf,
-    0x75,
-    0x05,
-    0xab,
-    0x67,
-    0x1a,
-    0x81,
-    0x3a,
-    0xf1,
-    0x17,
-    0xef,
-    0xfe,
-    0xbe,
-    0x9f,
-    0xcb,
-    0x4e,
-    0x60,
-    0x4a,
-    0x5a,
-    0x30,
-    0x4e,
-    0x00,
-    0xf6,
-    0x64,
-    0xdc,
-    0x19,
-    0xa5,
-    0xa5,
-    0x6a,
-    0xc2,
-    0xf1,
-    0x2b,
-    0xdb,
-    0xa3,
-    0xf4,
-    0x74,
-    0x49,
-    0xbf,
-    0xb3,
-    0x44,
-    0xf6,
-    0x9b,
-    0xad,
-    0xeb,
-    0x86,
-    0xa2,
-    0xb3,
-    0xc6,
-    0x6c,
-    0xc8,
-    0xf9,
-    0x08,
-    0xa3,
-    0x6e,
-    0x6e,
-    0xba,
-    0x9e,
-    0x85,
-    0x49,
-    0x01,
-    0x81,
-    0xf7,
-    0xe4,
-    0xa0,
-    0x91,
-    0x42,
-    0xce,
-    0xbd,
-    0xe9,
-    0x66,
-    0x1c,
-    0xe8,
-    0x70,
-    0x02,
-    0xff,
-    0x59,
-    0x07,
-    0xba,
-    0x9c,
-    0x79,
-    0x07,
-    0xdb,
-    0x17,
-    0xa5,
-    0xea,
-    0x42,
-    0xf1,
-    0x2e,
-    0x48,
-    0x7a,
-    0x95,
-    0xa4,
-    0x06,
-    0x24,
-    0x2d,
-    0x54,
-    0xca,
-    0x9c,
-    0xba,
-    0x0f,
-    0xb1,
-    0xd9,
-    0x64,
-    0x2d,
-    0x45,
-    0x95,
-    0x0e,
-    0xd2,
-    0xa9,
-    0xae,
-    0x2e,
-    0x70,
-    0x17,
-    0xcd,
-    0xdc,
-    0x8d,
-    0x8d,
-    0x45,
-    0x29,
-    0xc7,
-    0xc2,
-    0x3e,
-    0xb1,
-    0x15,
-    0x5f,
-    0x12,
-    0x74,
-    0x4f,
-    0x6c,
-    0xf7,
-    0xe1,
-    0xf1,
-    0x08,
-    0xdf,
-    0x34,
-    0x1c,
-    0x5e,
-    0x9c,
-    0x02,
-    0xdd,
-    0xd4,
-    0x48,
-    0x12,
-    0xb2,
-    0x85,
-    0xe4,
-    0x6f,
-    0x4a,
-    0xf2,
-    0x3f,
-    0xbb,
-    0x8d,
-    0xf4,
-    0x19,
-    0xc6,
-    0xdc,
-    0xf6,
-    0x89,
-    0x60,
-    0x9a,
-    0x60,
-    0x9c,
-    0x6b,
-    0xeb,
-    0x56,
-    0x3f,
-    0x34,
-    0xbb,
-    0xa3,
-    0x5f,
-    0x03,
-    0x03,
-    0xf0,
-    0x4e,
-    0xf0,
-    0x47,
-    0x3a,
-    0x69,
-    0xf9,
-    0x64,
-    0x83,
-    0xf8,
-    0x52,
-    0x88,
-    0xc7,
-    0x55,
-    0xfc,
-    0x82,
-    0x31,
-    0x51,
-    0x99,
-    0x3c,
-    0x8f,
-    0xd3,
-    0x7f,
-    0x85,
-    0x04,
-    0xc2,
-    0x0b,
-    0x14,
-    0xfc,
-    0x25,
-    0x37,
-    0xca,
-    0x65,
-    0x89,
-    0x6f,
-    0x38,
-    0x1d,
-    0xa3,
-    0xa1,
-    0x61,
-    0xa6,
-    0x37,
-    0x94,
-    0xc1,
-    0x21,
-    0x39,
-    0x7a,
-    0x8e,
-    0x7a,
-    0x31,
-    0xc8,
-    0x3d,
-    0xe0,
-    0xe4,
-    0x45,
-    0x48,
-    0x78,
-    0x30,
-    0x61,
-    0x2f,
-    0x52,
-    0x38,
-    0xc9,
-    0xbd,
-    0x9c,
-    0xc1,
-    0x38,
-    0x8c,
-    0x15,
-    0xdc,
-    0x90,
-    0xcb,
-    0xc5,
-    0xc6,
-    0x29,
-    0x3f,
-    0xec,
-    0x0c,
-    0x69,
-    0x88,
-    0x38,
-    0xf2,
-    0x95,
-    0xa6,
-    0x3a,
-    0x16,
-    0xe6,
-    0xbb,
-    0x1b,
-    0x51,
-    0xe0,
-    0x12,
-    0x8b,
-    0xde,
-    0xdf,
-    0x61,
-    0xfb,
-    0xbe,
-    0xf3,
-    0x4b,
-    0x0c,
-    0x5a,
-    0xed,
-    0x29,
-    0x47,
-    0x6b,
-    0xba,
-    0x0a,
-    0x0e,
-    0x17,
-    0xf0,
-    0xf8,
-    0xd2,
-    0x5c,
-    0xa7,
-    0x7e,
-    0x87,
-    0xb2,
-    0x8a,
-    0x67,
-    0x55,
-    0xec,
-    0x2e,
-    0xc7,
-    0x91,
-    0x60,
-    0xa2,
-    0x40,
-    0xeb,
-    0x47,
-    0x47,
-    0x7e,
-    0xe9,
-    0x67,
-    0xe1,
-    0x04,
-    0x94,
-    0xef,
-    0xef,
-    0x2b,
-    0x71,
-    0xa2,
-    0x38,
-    0x67,
-    0xb2,
-    0x37,
-    0xa7,
-    0xcd,
-    0xae,
-    0x00,
-    0x58,
-    0xd2,
-    0x8f,
-    0xcb,
-    0xf3,
-    0x56,
-    0x4a,
-    0x06,
-    0x39,
-    0xe1,
-    0xd5,
-    0x26,
-    0xdc,
-    0x2c,
-    0x94,
-    0x49,
-    0x94,
-    0xe3,
-    0x14,
-    0x19,
-    0x6f,
-    0xa9,
-    0xfb,
-    0xf4,
-    0x69,
-    0x5d,
-    0x3f,
-    0x4b,
-    0x3c,
-    0x9b,
-    0x97,
-    0x48,
-    0x79,
-    0x86,
-    0x2f,
-    0xb4,
-    0xd8,
-    0xc5,
-    0xa0,
-    0x17,
-    0xcc,
-    0xcc,
-    0x1f,
-    0x21,
-    0x5b,
-    0x5d,
-    0xf4,
-    0x48,
-    0x2d,
-    0x4e,
-    0x2f,
-    0xb3,
-    0xe3,
-    0x8c,
-    0x96,
-    0x57,
-    0xaa,
-    0x60,
-    0xe1,
-    0x60,
-    0x0f,
-    0xf1,
-    0x2a,
-    0xd2,
-    0x15,
-    0x0b,
-    0x9f,
-    0x70,
-    0x84,
-    0x1e,
-    0x7a,
-    0xdd,
-    0x85,
-    0x8a,
-    0x33,
-    0x01,
-    0x6c,
-    0x19,
-    0xf3,
-    0xae,
-    0xd5,
-    0xcd,
-    0x4d,
-    0x83,
-    0xf2,
-    0xdd,
-    0x29,
-    0x11,
-    0x23,
-    0xfa,
-    0x00,
-    0x3d,
-    0xc7,
-    0xd6,
-    0x4f,
-    0xe5,
-    0x53,
-    0xe7,
-    0x45,
-    0xc7,
-    0xa1,
-    0x69,
-    0xbf,
-    0x9e,
-    0x8a,
-    0xa2,
-    0x77,
-    0x8d,
-    0xb6,
-    0x69,
-    0x78,
-    0xc1,
-    0xb3,
-    0xe9,
-    0xd6,
-    0x53,
-    0x45,
-    0xa3,
-    0x9b,
-    0x6b,
-    0xfd,
-    0xb2,
-    0x04,
-    0xab,
-    0x0d,
-    0x53,
-    0xee,
-    0xcb,
-    0x5b,
-    0xa4,
-    0x8b,
-    0x80,
-    0xd4,
-    0xac,
-    0x59,
-    0xa3,
-    0x03,
-    0x9c,
-    0x55,
-    0x8f,
-    0xe2,
-    0x54,
-    0x6c,
-    0xcb,
-    0xf0,
-    0x29,
-    0x32,
-    0xe9,
-    0x83,
-    0xe6,
-    0xd6,
-    0xad,
-    0x60,
-    0x10,
-    0x56,
-    0x72,
-    0x89,
-    0x6f,
-    0xef,
-    0xca,
-    0x56,
-    0xc9,
-    0xd8,
-    0x65,
-    0xc7,
-    0xf1,
-    0x2f,
-    0x34,
-    0x19,
-    0x01,
-    0x34,
-    0xcd,
-    0x97,
-    0xe3,
-    0xb5,
-    0x12,
-    0xb3,
-    0x16,
-    0xc9,
-    0x0d,
-    0x55,
-    0xae,
-    0xc1,
-    0x1f,
-    0x73,
-    0x9d,
-    0x5c,
-    0x5a,
-    0xe2,
-    0x32,
-    0x3a,
-    0x2b,
-    0x6c,
-    0xdf,
-    0x93,
-    0x3c,
-    0x22,
-    0x3f,
-    0x29,
-    0x98,
-    0xf3,
-    0x57,
-    0x7b,
-    0x11,
-    0x7e,
-    0x1d,
-    0x3c,
-    0xdf,
-    0x25,
-    0x36,
-    0x03,
-    0x89,
-    0x63,
-    0x04,
-    0x44,
-    0x09,
-    0x5f,
-    0xe0,
-    0x7f,
-    0x2b,
-    0xc1,
-    0xa4,
-    0xb7,
-    0x36,
-    0xc4,
-    0x6d,
-    0x26,
-    0xce,
-    0x8c,
-    0x9f,
-    0x2f,
-    0x19,
-    0xbb,
-    0x29,
-    0x94,
-    0x21,
-    0x3f,
-    0x0a,
-    0xe9,
-    0x79,
-    0x6d,
-    0x14,
-    0x49,
-    0x24,
-    0x54,
-    0xef,
-    0x47,
-    0xb2,
-    0x4b,
-    0x62,
-    0x27,
-    0xac,
-    0xcd,
-    0xce,
-    0x4f,
-    0x32,
-    0x87,
-    0xfb,
-    0xf8,
-    0xe3,
-    0xae,
-    0x17,
-    0x29,
-    0xfd,
-    0x96,
-    0xfc,
-    0xe6,
-    0xc5,
-    0x81,
-    0xb2,
-    0xa5,
-    0x2a,
-    0xb5,
-    0x35,
-    0x01,
-    0xa5,
-    0xd1,
-    0x78,
-    0xb2,
-    0x63,
-    0x60,
-    0xa9,
-    0xbd,
-    0xa6,
-    0xaf,
-    0xb7,
-    0xe8,
-    0x69,
-    0xdc,
-    0x12,
-    0x71,
-    0x43,
-    0x30,
-    0xb2,
-    0xff,
-    0x8d,
-    0xae,
-    0x5a,
-    0xd9,
-    0xc7,
-    0xec,
-    0x1e,
-    0x56,
-    0x38,
-    0x22,
-    0x23,
-    0x95,
-    0xd5,
-    0x81,
-    0xa6,
-    0x6d,
-    0x64,
-    0xc6,
-    0x3f,
-    0xa7,
-    0xe1,
-    0x0e,
-    0x67,
-    0x6b,
-    0x21,
-    0xec,
-    0x39,
-    0xf9,
-    0xb5,
-    0xb9,
-    0x75,
-    0x9a,
-    0x11,
-    0x2b,
-    0xca,
-    0xd5,
-    0xee,
-    0x29,
-    0x55,
-    0xe5,
-    0xec,
-    0xde,
-    0x65,
-    0x6b,
-    0x7c,
-    0x0d,
-    0x81,
-    0x61,
-    0xfd,
-    0xa4,
-    0xac,
-    0x4f,
-    0x25,
-    0x93,
-    0xe7,
-    0xc1,
-    0xa3,
-    0xde,
-    0xf8,
-    0xf8,
-    0x02,
-    0xf1,
-    0x6a,
-    0xe0,
-    0xd1,
-    0x35,
-    0xd5,
-    0x42,
-    0x01,
-    0xe0,
-    0x5f,
-    0x3b,
-    0x8e,
-    0x11,
-    0x83,
-    0xed,
-    0x62,
-    0x1c,
-    0x11,
-    0x74,
-    0x76,
-    0x22,
-    0x76,
-    0x1b,
-    0x3a,
-    0xe6,
-    0x3e,
-    0xd0,
-    0x37,
-    0xdb,
-    0xd7,
-    0xd6,
-    0xf2,
-    0x82,
-    0x98,
-    0xba,
-    0x14,
-    0xf2,
-    0x01,
-    0x88,
-    0xc9,
-    0xb8,
-    0x45,
-    0x3e,
-    0x66,
-    0xe2,
-    0x05,
-    0x81,
-    0x4e,
-    0x57,
-    0x5f,
-    0x8f,
-    0x16,
-    0x6a,
-    0x27,
-    0x75,
-    0xe7,
-    0xae,
-    0x74,
-    0x82,
-    0x24,
-    0x0b,
-    0x5f,
-    0xfb,
-    0x4d,
-    0x11,
-    0x07,
-    0x10,
-    0x24,
-    0x8d,
-    0xd9,
-    0x0f,
-    0x0e,
-    0x5a,
-    0x0e,
-    0xd8,
-    0xbb,
-    0x7a,
-    0x74,
-    0x91,
-    0x09,
-    0x65,
-    0x72,
-    0x9b,
-    0x26,
-    0xa1,
-    0x46,
-    0xc4,
-    0xf5,
-    0x93,
-    0x92,
-    0xbe,
-    0xb4,
-    0x95,
-    0x17,
-    0xd0,
-    0xdb,
-    0x49,
-    0xc0,
-    0xcb,
-    0x47,
-    0x2c,
-    0xe2,
-    0x40,
-    0x97,
-    0x6e,
-    0xc2,
-    0xf0,
-    0xd7,
-    0x01,
-    0x58,
-    0x84,
-    0x5c,
-    0xf0,
-    0x52,
-    0x7e,
-    0xee,
-    0xf2,
-    0x5c,
-    0x70,
-    0x2d,
-    0x3f,
-    0x9f,
-    0x6b,
-    0x2d,
-    0xa2,
-    0x87,
-    0xbb,
-    0x64,
-    0xcf,
-    0xca,
-    0xd1,
-    0xc6,
-    0xf8,
-    0xa6,
-    0x81,
-    0x2e,
-    0x9b,
-    0x6a,
-    0x6e,
-    0x00,
-    0x9e,
-    0x37,
-    0xc2,
-    0x0c,
-    0x9d,
-    0x08,
-    0x22,
-    0xb6,
-    0x83,
-    0xf0,
-    0xe1,
-    0x54,
-    0x57,
-    0xa3,
-    0x73,
-    0xd8,
-    0x59,
-    0x38,
-    0x25,
-    0xaf,
-    0x4e,
-    0x2d,
-    0x0c,
-    0xe9,
-    0x18,
-    0xac,
-    0x3b,
-    0x99,
-    0x89,
-    0x0c,
-    0x39,
-    0x7f,
-    0x79,
-    0x9b,
-    0xb3,
-    0xe4,
-    0x16,
-    0x9b,
-    0x6d,
-    0xc6,
-    0x7c,
-    0x8a,
-    0x7e,
-    0x35,
-    0x86,
-    0xa7,
-    0xbd,
-    0xfd,
-    0xe3,
-    0xb1,
-    0x77,
-    0x85,
-    0x6c,
-    0xf2,
-    0x63,
-    0xf7,
-    0xb4,
-    0x7c,
-    0xd7,
-    0xa1,
-    0xe1,
-    0xb3,
-    0x3b,
-    0x9c,
-    0xbb,
-    0x0b,
-    0xbf,
-    0xab,
-    0x03,
-    0x13,
-    0x49,
-    0x65,
-    0x06,
-    0xb3,
-    0xb1,
-    0x97,
-    0x72,
-    0xb1,
-    0x31,
-    0xe4,
-    0x67,
-    0x7a,
-    0x17,
-    0xae,
-    0xd1,
-    0x20,
-    0xbd,
-    0x3a,
-    0xf6,
-    0x9f,
-    0xbb,
-    0x0e,
-    0x4b,
-    0x64,
-    0x5b,
-    0x9e,
-    0x8c,
-    0x10,
-    0x4e,
-    0x28,
-    0x0b,
-    0x79,
-    0x9d,
-    0xdd,
-    0x49,
-    0xf1,
-    0xe2,
-    0x41,
-    0xc3,
-    0xcc,
-    0xb7,
-    0xd4,
-    0x0e,
-    0x1c,
-    0x6f,
-    0xf2,
-    0x26,
-    0xbf,
-    0x04,
-    0xf8,
-    0x04,
-    0x9c,
-    0x51,
-    0xa8,
-    0x6e,
-    0x29,
-    0x81,
-    0xcf,
-    0x13,
-    0x31,
-    0xc8,
-    0x24,
-    0xd7,
-    0xd4,
-    0x51,
-    0x74,
-    0x6c,
-    0xcf,
-    0x77,
-    0xfc,
-    0x22,
-    0xfd,
-    0x37,
-    0x17,
-    0x00,
-    0x1e,
-    0xe5,
-    0x19,
-    0x13,
-    0xd8,
-    0x1f,
-    0x7a,
-    0x06,
-    0xfb,
-    0x00,
-    0x37,
-    0xf3,
-    0x09,
-    0x95,
-    0x75,
-    0x79,
-    0xf6,
-    0x95,
-    0x67,
-    0x0f,
-    0x2c,
-    0x4c,
-    0x73,
-    0x97,
-    0xd2,
-    0xd9,
-    0x90,
-    0x37,
-    0x4e,
-    0x99,
-    0xf3,
-    0x64,
-    0x08,
-    0xe3,
-    0xea,
-    0x3f,
-    0x71,
-    0xf6,
-    0x08,
-    0x25,
-    0x45,
-    0x2f,
-    0x82,
-    0x81,
-    0x0d,
-    0x80,
-    0xd9,
-    0xe5,
-    0xe7,
-    0x1d,
-    0xb9,
-    0x5a,
-    0x89,
-    0x78,
-    0x22,
-    0xf4,
-    0x84,
-    0x70,
-    0xc5,
-    0xa9,
-    0xc6,
-    0xc5,
-    0xb1,
-    0x62,
-    0x63,
-    0xd0,
-    0x2e,
-    0x53,
-    0x95,
-    0x71,
-    0xe9,
-    0x88,
-    0x01,
-    0x48,
-    0x52,
-    0xc1,
-    0x3b,
-    0x28,
-    0x43,
-    0x80,
-    0x8d,
-    0xc8,
-    0xe2,
-    0x60,
-    0xf4,
-    0xbc,
-    0xc8,
-    0xa8,
-    0x6c,
-    0xa4,
-    0x63,
-    0x20,
-    0x6d,
-    0xa4,
-    0x98,
-    0x24,
-    0xb6,
-    0x14,
-    0xad,
-    0xf6,
-    0x49,
-    0x78,
-    0x67,
-    0x59,
-    0xb7,
-    0xb2,
-    0x6f,
-    0x5b,
-    0x9d,
-    0x76,
-    0xfa,
-    0x72,
-    0x6f,
-    0xff,
-    0xa9,
-    0xca,
-    0x74,
-    0x00,
-    0xae,
-    0xde,
-    0x12,
-    0xde,
-    0x31,
-    0x46,
-    0x4c,
-    0x1c,
-    0xf2,
-    0xcf,
-    0x89,
-    0x17,
-    0x2f,
-    0xd1,
-    0x97,
-    0xf3,
-    0xc8,
-    0xbd,
-    0xef,
-    0xd5,
-    0xa1,
-    0xf6,
-    0x3b,
-    0x52,
-    0x48,
-    0xe2,
-    0x15,
-    0x28,
-    0xd8,
-    0x40,
-    0x12,
-    0x2c,
-    0x1d,
-    0xbc,
-    0xff,
-    0x84,
-    0xf8,
-    0xc0,
-    0x6a,
-    0x16,
-    0x05,
-    0x8e,
-    0x65,
-    0x40,
-    0x7c,
-    0x8c,
-    0x86,
-    0xca,
-    0x55,
-    0xde,
-    0x32,
-    0x19,
-    0xb0,
-    0x3a,
-    0x1b,
-    0xa5,
-    0x73,
-    0xf8,
-    0x08,
-    0xad,
-    0x35,
-    0x69,
-    0xd5,
-    0x29,
-    0x5b,
-    0x6a,
-    0xba,
-    0x00,
-    0x80,
-    0x39,
-    0xd0,
-    0x7b,
-    0x1b,
-    0x87,
-    0xd0,
-    0xf9,
-    0x5b,
-    0xce,
-    0x1e,
-    0xe5,
-    0x56,
-    0xe4,
-    0x07,
-    0xe6,
-    0x63,
-    0xd1,
-    0x47,
-    0x55,
-    0xc4,
-    0xde,
-    0xcf,
-    0xf4,
-    0x89,
-    0xee,
-    0xc5,
-    0xdd,
-    0xb0,
-    0x11,
-    0xcb,
-    0xb8,
-    0x91,
-    0x57,
-    0x84,
-    0x31,
-    0x7a,
-    0xe2,
-    0x54,
-    0xaa,
-    0x96,
-    0x3f,
-    0x68,
-    0x2c,
-    0x13,
-    0xf7,
-    0xf7,
-    0xa4,
-    0x83,
-    0x60,
-    0xc7,
-    0x4c,
-    0x83,
-    0xb9,
-    0xf2,
-    0x67,
-    0x9b,
-    0x76,
-    0xea,
-    0x31,
-    0x66,
-    0xd9,
-    0xbb,
-    0x16,
-    0xf3,
-    0xc2,
-    0x90,
-    0x22,
-    0x6a,
-    0xc8,
-    0x79,
-    0xb9,
-    0xf3,
-    0x88,
-    0x6b,
-    0x88,
-    0xd3,
-    0x3d,
-    0x89,
-    0xbb,
-    0xd8,
-    0x92,
-    0xa1,
-    0x70,
-    0xf8,
-    0xb4,
-    0xfa,
-    0x6c,
-    0x35,
-    0xaa,
-    0x4d,
-    0x0d,
-    0xc4,
-    0xe9,
-    0x11,
-    0x80,
-    0x6d,
-    0x23,
-    0xfb,
-    0x34,
-    0x35,
-    0x61,
-    0xc6,
-    0x8f,
-    0x3b,
-    0x51,
-    0x30,
-    0xdf,
-    0xe0,
-    0xe1,
-    0x45,
-    0x93,
-    0x2a,
-    0x0c,
-    0xdf,
-    0xab,
-    0x6b,
-    0xf4,
-    0x6e,
-    0x6d,
-    0x1d,
-    0x32,
-    0xf5,
-    0x5a,
-    0x11,
-    0x6a,
-    0x55,
-    0x60,
-    0xc9,
-    0x22,
-    0xce,
-    0x51,
-    0x22,
-    0xd4,
-    0xc3,
-    0x94,
-    0x35,
-    0x41,
-    0xbd,
-    0x1b,
-    0x80,
-    0x09,
-    0xb3,
-    0x94,
-    0x41,
-    0x79,
-    0x89,
-    0xe4,
-    0x23,
-    0xa4,
-    0xd6,
-    0xd1,
-    0x1c,
-    0xb5,
-    0xea,
-    0xfe,
-    0x96,
-    0x83,
-    0x10,
-    0x1d,
-    0xcd,
-    0x66,
-    0x10,
-    0x60,
-    0x78,
-    0x4a,
-    0xf8,
-    0x30,
-    0xab,
-    0x01,
-    0x1c,
-    0x22,
-    0xfc,
-    0xde,
-    0x5c,
-    0x27,
-    0xe5,
-    0x7f,
-    0xa5,
-    0x03,
-    0x69,
-    0xea,
-    0xbb,
-    0x00,
-    0xfa,
-    0xdc,
-    0x35,
-    0xe3,
-    0x9b,
-    0x5d,
-    0xc9,
-    0x1f,
-    0x42,
-    0x98,
-    0xc9,
-    0x49,
-    0x80,
-    0xea,
-    0xee,
-    0xcc,
-    0x63,
-    0x39,
-    0x55,
-    0xde,
-    0x9c,
-    0x87,
-    0xc7,
-    0xb2,
-    0xdd,
-    0xc6,
-    0x3d,
-    0xef,
-    0x85,
-    0xee,
-    0xa3,
-    0x62,
-    0x7f,
-    0x4e,
-    0xdd,
-    0xef,
-    0x67,
-    0x1f,
-    0x08,
-    0xce,
-    0xef,
-    0x5f,
-    0x02,
-    0xf4,
-    0x82,
-    0xdd,
-    0x2c,
-    0xce,
-    0x27,
-    0x90,
-    0x6e,
-    0x35,
-    0xa7,
-    0x2c,
-    0x7c,
-    0x9f,
-    0xf2,
-    0xf7,
-    0x58,
-    0x92,
-    0xbf,
-    0xd9,
-    0x19,
-    0x5f,
-    0x73,
-    0xb3,
-    0xea,
-    0x0c,
-    0x44,
-    0xf2,
-    0x55,
-    0x92,
-    0x9e,
-    0x64,
-    0xc2,
-    0x49,
-    0xc5,
-    0x4a,
-    0x3a,
-    0xa0,
-    0xbd,
-    0xae,
-    0x71,
-    0x11,
-    0x67,
-    0xf7,
-    0x04,
-    0x54,
-    0xec,
-    0xba,
-    0xff,
-    0xd3,
-    0x5e,
-    0xd3,
-    0xa2,
-    0x5f,
-    0x9d,
-    0xb5,
-    0x65,
-    0x21,
-    0x78,
-    0xfe,
-    0x39,
-    0xd3,
-    0x15,
-    0x4f,
-    0x11,
-    0x30,
-    0x93,
-    0x5a,
-    0xa1,
-    0xa8,
-    0xed,
-    0x3c,
-    0x65,
-    0x59,
-    0x22,
-    0x0e,
-    0xe6,
-    0x3b,
-    0x93,
-    0xb6,
-    0x39,
-    0x9a,
-    0xac,
-    0x03,
-    0xc8,
-    0xca,
-    0xc6,
-    0xfa,
-    0x55,
-    0x16,
-    0x4c,
-    0x6a,
-    0x3b,
-    0xf9,
-    0x1d,
-    0xc7,
-    0xf7,
-    0x91,
-    0x32,
-    0x34,
-    0xe8,
-    0x50,
-    0x81,
-    0xe2,
-    0x53,
-    0xf5,
-    0x21,
-    0x99,
-    0xaa,
-    0xba,
-    0xae,
-    0x94,
-    0x0e,
-    0xcf,
-    0xef,
-    0x92,
-    0x12,
-    0x08,
-    0xb6,
-    0x2a,
-    0xc2,
-    0xd3,
-    0x08,
-    0x5f,
-    0xe4,
-    0x6c,
-    0x7e,
-    0x74,
-    0x7d,
-    0x54,
-    0xeb,
-    0x02,
-    0x97,
-    0xff,
-    0x3f,
-    0x47,
-    0x42,
-    0xcc,
-    0xac,
-    0xc1,
-    0xd9,
-    0x3b,
-    0x07,
-    0xfb,
-    0x86,
-    0x5b,
-    0x70,
-    0xa8,
-    0x08,
-    0x81,
-    0x35,
-    0xee,
-    0xb4,
-    0x3f,
-    0xf4,
-    0x04,
-    0xba,
-    0x94,
-    0x00,
-    0xff,
-    0xaa,
-    0x61,
-    0x06,
-    0xe9,
-    0x37,
-    0x1c,
-    0xf1,
-    0x14,
-    0x3a,
-    0xc8,
-    0x0a,
-    0xad,
-    0xfa,
-    0x25,
-    0x64,
-    0x94,
-    0xaa,
-    0x24,
-    0x77,
-    0x6b,
-    0x33,
-    0x9d,
-    0x0b,
-    0xee,
-    0x34,
-    0x44,
-    0x58,
-    0x82,
-    0x47,
-    0xda,
-    0x6b,
-    0x10,
-    0x87,
-    0xa0,
-    0xcb,
-    0x13,
-    0x4f,
-    0x11,
-    0x5d,
-    0xf0,
-    0x44,
-    0xd0,
-    0x85,
-    0x87,
-    0x95,
-    0xe0,
-    0x8e,
-    0x07,
-    0x81,
-    0x13,
-    0x4c,
-    0x06,
-    0x1a,
-    0xc5,
-    0xff,
-    0xd1,
-    0x49,
-    0xc9,
-    0x7b,
-    0x00,
-    0x13,
-    0xa4,
-    0x86,
-    0x4e,
-    0x1a,
-    0xf9,
-    0x82,
-    0xa8,
-    0x67,
-    0x45,
-    0x4c,
-    0x84,
-    0x66,
-    0xcd,
-    0x63,
-    0x74,
-    0x32,
-    0xd4,
-    0x4d,
-    0xfb,
-    0x13,
-    0x10,
-    0x36,
-    0x9f,
-    0x46,
-    0x5f,
-    0xdb,
-    0x3f,
-    0xfc,
-    0xb7,
-    0xa6,
-    0xa7,
-    0xa4,
-    0x5b,
-    0x1a,
-    0x62,
-    0x6d,
-    0x55,
-    0x72,
-    0xcf,
-    0x07,
-    0x20,
-    0x85,
-    0x78,
-    0xaa,
-    0xa5,
-    0xed,
-    0x9e,
-    0x5a,
-    0x69,
-    0x68,
-    0x19,
-    0x69,
-    0x04,
-    0x7e,
-    0x5f,
-    0x3d,
-    0xd5,
-    0x65,
-    0xe2,
-    0x54,
-    0xf4,
-    0x21,
-    0x9f,
-    0x84,
-    0x68,
-    0xef,
-    0xf3,
-    0x88,
-    0x9a,
-    0xe4,
-    0xb1,
-    0xb8,
-    0x0a,
-    0xd2,
-    0x73,
-    0x18,
-    0x41,
-    0x6b,
-    0x2d,
-    0x94,
-    0x07,
-    0xa9,
-    0x08,
-    0x8a,
-    0xd5,
-    0x6d,
-    0x6d,
-    0x89,
-    0x8d,
-    0x66,
-    0x5f,
-    0x59,
-    0x69,
-    0x34,
-    0x0f,
-    0x3b,
-    0x31,
-    0xcd,
-    0xaa,
-    0x71,
-    0xb2,
-    0x20,
-    0x76,
-    0x01,
-    0x6b,
-    0xf9,
-    0x1d,
-    0xb7,
-    0x89,
-    0x25,
-    0x49,
-    0x69,
-    0x16,
-    0xd6,
-    0x70,
-    0x7e,
-    0x6d,
-    0x49,
-    0xf2,
-    0xb1,
-    0xf1,
-    0xa5,
-    0x61,
-    0x13,
-    0xfe,
-    0x27,
-    0x1f,
-    0x4f,
-    0x20,
-    0x7c,
-    0x2f,
-    0x32,
-    0x83,
-    0x6e,
-    0x45,
-    0x6b,
-    0xab,
-    0xc3,
-    0x1f,
-    0x8f,
-    0x65,
-    0x62,
-    0x18,
-    0x60,
-    0xfe,
-    0xb8,
-    0xfb,
-    0x4e,
-    0xb2,
-    0x5a,
-    0x15,
-    0x3e,
-    0x67,
-    0xec,
-    0x8e,
-    0x8b,
-    0x9c,
-    0x41,
-    0xf9,
-    0x4a,
-    0x9c,
-    0xc3,
-    0x29,
-    0xd3,
-    0xf7,
-    0x16,
-    0x46,
-    0x7d,
-    0x32,
-    0xf8,
-    0x21,
-    0xa8,
-    0xbe,
-    0x6c,
-    0xc5,
-    0x01,
-    0x27,
-    0x17,
-    0x4f,
-    0x01,
-    0x8e,
-    0xea,
-    0xff,
-    0xb7,
-    0x59,
-    0x01,
-    0x8e,
-    0xc8,
-    0x29,
-    0xcb,
-    0xc2,
-    0xb4,
-    0x0c,
-    0x6c,
-    0x41,
-    0x5a,
-    0xf5,
-    0x5f,
-    0xa3,
-    0xbf,
-    0x69,
-    0x60,
-    0xca,
-    0x0b,
-    0x7a,
-    0x89,
-    0x76,
-    0xd4,
-    0xf9,
-    0xbb,
-    0x14,
-    0x9f,
-    0xe8,
-    0x3f,
-    0xd7,
-    0xa4,
-    0x2e,
-    0xad,
-    0x0a,
-    0xd2,
-    0x8e,
-    0x0d,
-    0xa5,
-    0x13,
-    0xda,
-    0x3d,
-    0x1e,
-    0xd1,
-    0x64,
-    0x93,
-    0x81,
-    0xb9,
-    0xb6,
-    0xc2,
-    0xc3,
-    0xbf,
-    0x83,
-    0x02,
-    0x54,
-    0x62,
-    0xdd,
-    0x6b,
-    0xf3,
-    0x31,
-    0xa7,
-    0xa2,
-    0xc6,
-    0x8e,
-    0x4e,
-    0xb8,
-    0xaa,
-    0xb2,
-    0xb4,
-    0x4f,
-    0xc8,
-    0xf1,
-    0x6d,
-    0xff,
-    0x69,
-    0x3f,
-    0x2e,
-    0xf8,
-    0x0b,
-    0xf4,
-    0x82,
-    0xe8,
-    0xb3,
-    0xcc,
-    0xbf,
-    0x1f,
-    0x86,
-    0x32,
-    0x39,
-    0xf1,
-    0x93,
-    0xbe,
-    0xb5,
-    0x5b,
-    0xf4,
-    0xfc,
-    0x21,
-    0xea,
-    0x15,
-    0x6f,
-    0x82,
-    0xd9,
-    0x53,
-    0xd5,
-    0x2d,
-    0x79,
-    0xc9,
-    0xad,
-    0x3a,
-    0xd6,
-    0x66,
-    0xf7,
-    0x36,
-    0x98,
-    0x43,
-    0x3b,
-    0x18,
-    0x27,
-    0x34,
-    0xcc,
-    0x76,
-    0x13,
-    0x9e,
-    0x4e,
-    0xf9,
-    0xb2,
-    0x88,
-    0x76,
-    0x0f,
-    0x0b,
-    0xf4,
-    0x11,
-    0xdf,
-    0xf2,
-    0x6f,
-    0x48,
-    0x82,
-    0x75,
-    0xe7,
-    0x22,
-    0x70,
-    0x77,
-    0xbd,
-    0x4a,
-    0x38,
-    0x9b,
-    0x1b,
-    0x13,
-    0x75,
-    0x64,
-    0x88,
-    0xb9,
-    0xfd,
-    0x9a,
-    0xb9,
-    0xea,
-    0x5b,
-    0xef,
-    0xaa,
-    0x84,
-    0x80,
-    0xe2,
-    0xee,
-    0xa1,
-    0xb5,
-    0xe4,
-    0x44,
-    0xd1,
-    0xd4,
-    0xb9,
-    0x6a,
-    0xa6,
-    0xb8,
-    0x22,
-    0x36,
-    0x76,
-    0xf2,
-    0xb9,
-    0xe2,
-    0x5c,
-    0xbd,
-    0x1c,
-    0xa8,
-    0x80,
-    0x35,
-    0x4d,
-    0x8e,
-    0x98,
-    0xc3,
-    0x59,
-    0x84,
-    0xaf,
-    0xdc,
-    0x38,
-    0xac,
-    0x25,
-    0xeb,
-    0xf5,
-    0xf9,
-    0xf8,
-    0x8b,
-    0x0f,
-    0xfb,
-    0x41,
-    0xfa,
-    0x1e,
-    0xf9,
-    0x02,
-    0xca,
-    0xb9,
-    0x41,
-    0x1e,
-    0xda,
-    0x98,
-    0xbc,
-    0xa9,
-    0x85,
-    0xf6,
-    0xc5,
-    0x62,
-    0x19,
-    0x39,
-    0x3b,
-    0x7e,
-    0x8b,
-    0xd5,
-    0xd5,
-    0xa8,
-    0x69,
-    0x6e,
-    0xb6,
-    0x45,
-    0x0f,
-    0x3d,
-    0x42,
-    0xfc,
-    0x1e,
-    0xb4,
-    0x2f,
-    0x76,
-    0x2a,
-    0x65,
-    0xdf,
-    0x62,
-    0xb3,
-    0x20,
-    0xed,
-    0xbd,
-    0x57,
-    0x5b,
-    0x06,
-    0x50,
-    0x45,
-    0xd7,
-    0xfa,
-    0x7a,
-    0xf5,
-    0x81,
-    0x12,
-    0x2f,
-    0x17,
-    0x97,
-    0xa5,
-    0x41,
-    0xc9,
-    0x0b,
-    0xe6,
-    0xde,
-    0x0c,
-    0x2c,
-    0x00,
-    0x5b,
-    0x79,
-    0x83,
-    0x65,
-    0x2f,
-    0x30,
-    0xfb,
-    0x62,
-    0x43,
-    0x12,
-    0x46,
-    0xf8,
-    0x69,
-    0x30,
-    0x7b,
-    0xe7,
-    0x29,
-    0x82,
-    0x04,
-    0x0b,
-    0xc4,
-    0xdd,
-    0xb7,
-    0xeb,
-    0x73,
-    0x1f,
-    0x43,
-    0x90,
-    0xf0,
-    0xad,
-    0xce,
-    0x93,
-    0x37,
-    0x1f,
-    0xdc,
-    0x7a,
-    0x8e,
-    0x39,
-    0x73,
-    0x45,
-    0xc3,
-    0x1d,
-    0x7d,
-    0x43,
-    0xb5,
-    0xc0,
-    0x6d,
-    0x2a,
-    0x15,
-    0x9b,
-    0x25,
-    0x67,
-    0x6e,
-    0xa3,
-    0x17,
-    0xb3,
-    0x63,
-    0x7a,
-    0xab,
-    0xe7,
-    0x39,
-    0xe7,
-    0xe1,
-    0x11,
-    0x95,
-    0x84,
-    0x38,
-    0xc7,
-    0x86,
-    0xb6,
-    0xce,
-    0xbb,
-    0xc5,
-    0xe2,
-    0xc8,
-    0x90,
-    0x3c,
-    0xde,
-    0xf4,
-    0xec,
-    0xc6,
-    0xa6,
-    0xad,
-    0xcf,
-    0x36,
-    0x51,
-    0x00,
-    0x23,
-    0x9a,
-    0x43,
-    0x0d,
-    0x94,
-    0xc1,
-    0xa3,
-    0xaf,
-    0xa1,
-    0xfa,
-    0x10,
-    0x5f,
-    0xf3,
-    0x1f,
-    0x8f,
-    0x55,
-    0xee,
-    0xd2,
-    0xc8,
-    0xf1,
-    0x87,
-    0x07,
-    0x73,
-    0x5a,
-    0x55,
-    0xc3,
-    0x0d,
-    0x65,
-    0xea,
-    0x22,
-    0xcf,
-    0xb8,
-    0x63,
-    0x9f,
-    0xe0,
-    0x2f,
-    0x3e,
-    0x90,
-    0xca,
-    0x7e,
-    0x6c,
-    0xf0,
-    0x2b,
-    0x18,
-    0xa7,
-    0x61,
-    0xad,
-    0x50,
-    0x06,
-    0x71,
-    0x37,
-    0xbe,
-    0xcf,
-    0x1d,
-    0x65,
-    0xe5,
-    0x8c,
-    0x94,
-    0x36,
-    0x12,
-    0x61,
-    0x3d,
-    0x05,
-    0x87,
-    0x9c,
-    0xfa,
-    0xbb
-  ],
-  const [
-    0xc8,
-    0xc1,
-    0x07,
-    0x93,
-    0x0a,
-    0xc3,
-    0xec,
-    0x65,
-    0x4f,
-    0x04,
-    0x39,
-    0x92,
-    0xcf,
-    0xae,
-    0xff,
-    0x31,
-    0x55,
-    0x2d,
-    0x8a,
-    0xb7,
-    0x96,
-    0x37,
-    0x4b,
-    0x18,
-    0xc1,
-    0x09,
-    0x16,
-    0x2f,
-    0x57,
-    0xf4,
-    0x8e,
-    0x60,
-    0x3d,
-    0x19,
-    0xdd,
-    0x7c,
-    0x10,
-    0x71,
-    0xa8,
-    0xe4,
-    0xb8,
-    0x10,
-    0x41,
-    0xf2,
-    0x40,
-    0xaa,
-    0x1f,
-    0x94,
-    0xe4,
-    0x56,
-    0x8c,
-    0x3a,
-    0x6c,
-    0x92,
-    0x9e,
-    0xf3,
-    0xb9,
-    0x87,
-    0x68,
-    0xd2,
-    0x9e,
-    0x8f,
-    0x71,
-    0x97,
-    0xf1,
-    0xf5,
-    0x66,
-    0x8b,
-    0xe1,
-    0xfc,
-    0x0b,
-    0xac,
-    0x89,
-    0x22,
-    0x77,
-    0x0a,
-    0xc6,
-    0xa5,
-    0x81,
-    0x71,
-    0x46,
-    0x47,
-    0x76,
-    0x48,
-    0xe2,
-    0x4e,
-    0x0d,
-    0xb9,
-    0x2e,
-    0xd0,
-    0x9c,
-    0x13,
-    0x4e,
-    0x2d,
-    0x8b,
-    0x6c,
-    0x0b,
-    0xdd,
-    0x09,
-    0x8a,
-    0x26,
-    0x6c,
-    0xff,
-    0x04,
-    0xeb,
-    0xc2,
-    0x42,
-    0xa4,
-    0x0a,
-    0xa8,
-    0x0d,
-    0x10,
-    0xa3,
-    0x88,
-    0xae,
-    0xa9,
-    0xa0,
-    0x74,
-    0x7f,
-    0xb4,
-    0x47,
-    0x6a,
-    0x18,
-    0xb8,
-    0x0f,
-    0xd7,
-    0xc3,
-    0x26,
-    0xb3,
-    0x59,
-    0x31,
-    0x3f,
-    0x86,
-    0xc9,
-    0x6b,
-    0x33,
-    0x06,
-    0x79,
-    0x0a,
-    0x86,
-    0xb3,
-    0xba,
-    0xab,
-    0xb8,
-    0x22,
-    0xa2,
-    0x9e,
-    0x25,
-    0x4d,
-    0x0c,
-    0xde,
-    0x2a,
-    0x2d,
-    0xdf,
-    0x46,
-    0x89,
-    0x8b,
-    0x94,
-    0x01,
-    0x0f,
-    0x13,
-    0xf2,
-    0x43,
-    0x74,
-    0xaa,
-    0x1c,
-    0x36,
-    0x82,
-    0x01,
-    0xce,
-    0x38,
-    0x79,
-    0x6a,
-    0xe4,
-    0x43,
-    0xb3,
-    0xeb,
-    0x1c,
-    0xac,
-    0x84,
-    0x91,
-    0x1c,
-    0x11,
-    0x64,
-    0x07,
-    0xb7,
-    0x8d,
-    0x50,
-    0x67,
-    0x6c,
-    0x2d,
-    0x6d,
-    0x50,
-    0x2f,
-    0xa8,
-    0xef,
-    0x39,
-    0x6d,
-    0x4a,
-    0x39,
-    0x05,
-    0x4a,
-    0x32,
-    0x45,
-    0xd7,
-    0x2d,
-    0xbd,
-    0x47,
-    0x27,
-    0x7e,
-    0x42,
-    0x8d,
-    0x16,
-    0xae,
-    0x00,
-    0xaa,
-    0xfe,
-    0x78,
-    0x54,
-    0xd3,
-    0x4e,
-    0x67,
-    0x30,
-    0x89,
-    0x95,
-    0x99,
-    0xc8,
-    0x79,
-    0xdc,
-    0xc2,
-    0x8e,
-    0xa0,
-    0x39,
-    0x73,
-    0x61,
-    0xb2,
-    0xa1,
-    0x9d,
-    0x01,
-    0xbd,
-    0xfe,
-    0x51,
-    0xc7,
-    0x09,
-    0x81,
-    0xc9,
-    0x93,
-    0x44,
-    0x3a,
-    0xac,
-    0x05,
-    0xdb,
-    0xe6,
-    0x8e,
-    0xf0,
-    0xab,
-    0x08,
-    0xb6,
-    0x0b,
-    0xd9,
-    0x3b,
-    0x25,
-    0xea,
-    0xfe,
-    0xc6,
-    0xd4,
-    0x2d,
-    0x88,
-    0x71,
-    0x3c,
-    0xf8,
-    0x5d,
-    0x97,
-    0x1b,
-    0xa3,
-    0xc1,
-    0x7d,
-    0x76,
-    0xb2,
-    0x79,
-    0xe2,
-    0xda,
-    0x07,
-    0x30,
-    0xd7,
-    0xe8,
-    0x56,
-    0x1b,
-    0xd1,
-    0x11,
-    0xda,
-    0xd9,
-    0xfd,
-    0x9d,
-    0x46,
-    0x9d,
-    0xd3,
-    0xf2,
-    0xff,
-    0x8e,
-    0xee,
-    0x13,
-    0x88,
-    0x6e,
-    0x1b,
-    0x67,
-    0x3d,
-    0x7a,
-    0xb0,
-    0xbc,
-    0x45,
-    0x92,
-    0x1f,
-    0x8b,
-    0xc2,
-    0x9a,
-    0xca,
-    0x7d,
-    0x4a,
-    0x20,
-    0x19,
-    0x2f,
-    0x9b,
-    0x3f,
-    0xca,
-    0x32,
-    0x8a,
-    0xc3,
-    0x89,
-    0x57,
-    0x3d,
-    0x8d,
-    0xc1,
-    0x29,
-    0x9a,
-    0x3a,
-    0xb1,
-    0xba,
-    0xff,
-    0xff,
-    0xc2,
-    0xa3,
-    0x34,
-    0xd7,
-    0x18,
-    0x46,
-    0x9e,
-    0xe1,
-    0x67,
-    0x56,
-    0xb5,
-    0x03,
-    0x08,
-    0x9a,
-    0xb8,
-    0xd4,
-    0x4c,
-    0xed,
-    0x9f,
-    0xb9,
-    0x10,
-    0x8a,
-    0x51,
-    0x4e,
-    0x91,
-    0x86,
-    0x17,
-    0x07,
-    0x82,
-    0x9e,
-    0x50,
-    0x17,
-    0x5c,
-    0x33,
-    0x67,
-    0x90,
-    0xf6,
-    0x93,
-    0x03,
-    0xcc,
-    0x55,
-    0x7a,
-    0x7d,
-    0x0d,
-    0xc5,
-    0xd9,
-    0x97,
-    0x60,
-    0x28,
-    0xd5,
-    0x6b,
-    0xc7,
-    0x8f,
-    0x13,
-    0xa1,
-    0x96,
-    0x07,
-    0x33,
-    0xe5,
-    0x1e,
-    0xb6,
-    0x9a,
-    0x98,
-    0x89,
-    0x26,
-    0x75,
-    0xc6,
-    0x05,
-    0xe0,
-    0xfa,
-    0x59,
-    0x25,
-    0x3d,
-    0xf1,
-    0x8c,
-    0x83,
-    0x79,
-    0x74,
-    0xa2,
-    0xab,
-    0x09,
-    0xf3,
-    0xd7,
-    0x34,
-    0x2e,
-    0x7b,
-    0x97,
-    0x30,
-    0xcb,
-    0x37,
-    0xee,
-    0xc7,
-    0x74,
-    0x37,
-    0x40,
-    0x1e,
-    0xc7,
-    0x70,
-    0x3a,
-    0x7e,
-    0xff,
-    0x04,
-    0x08,
-    0xb2,
-    0xc6,
-    0xc4,
-    0xc8,
-    0xb0,
-    0x4b,
-    0xf3,
-    0x3f,
-    0x7c,
-    0x95,
-    0x4d,
-    0xcb,
-    0x4a,
-    0x17,
-    0x48,
-    0x99,
-    0xe3,
-    0x84,
-    0x9a,
-    0x18,
-    0x49,
-    0xe4,
-    0xfb,
-    0xae,
-    0x9e,
-    0xe8,
-    0x2c,
-    0xa9,
-    0x42,
-    0x7a,
-    0x38,
-    0x78,
-    0x3c,
-    0x99,
-    0xfa,
-    0x1b,
-    0xdb,
-    0x64,
-    0xdf,
-    0xd8,
-    0x9c,
-    0x74,
-    0xee,
-    0x30,
-    0x4f,
-    0x6f,
-    0x05,
-    0x11,
-    0x76,
-    0xda,
-    0x65,
-    0x4d,
-    0xee,
-    0x2f,
-    0x70,
-    0x4b,
-    0xd1,
-    0x30,
-    0xb2,
-    0xfd,
-    0x9a,
-    0x7a,
-    0x1f,
-    0x11,
-    0x8a,
-    0x5d,
-    0x9b,
-    0x6c,
-    0x4b,
-    0xeb,
-    0xc0,
-    0xd4,
-    0xd4,
-    0x4f,
-    0xdb,
-    0xec,
-    0x8c,
-    0x61,
-    0x37,
-    0x66,
-    0xb2,
-    0x77,
-    0x9f,
-    0x74,
-    0xfc,
-    0x7d,
-    0x1e,
-    0x7f,
-    0x7e,
-    0x48,
-    0x09,
-    0x1c,
-    0xce,
-    0x27,
-    0x3f,
-    0x3c,
-    0x66,
-    0xbb,
-    0xb0,
-    0xa2,
-    0x49,
-    0x09,
-    0x1c,
-    0x9b,
-    0xea,
-    0xce,
-    0x1d,
-    0xe9,
-    0x49,
-    0x12,
-    0x68,
-    0x00,
-    0x5f,
-    0x00,
-    0x50,
-    0x75,
-    0xbc,
-    0xf5,
-    0x8c,
-    0xb3,
-    0x6f,
-    0xd7,
-    0x39,
-    0xf0,
-    0x26,
-    0xa8,
-    0x23,
-    0x5f,
-    0x96,
-    0x5b,
-    0x40,
-    0xa7,
-    0x1d,
-    0xe6,
-    0x7d,
-    0x95,
-    0xa6,
-    0x98,
-    0xbd,
-    0x0d,
-    0xce,
-    0xad,
-    0x1f,
-    0x47,
-    0x45,
-    0x20,
-    0x80,
-    0x38,
-    0x76,
-    0xc0,
-    0x42,
-    0x4d,
-    0x6a,
-    0x86,
-    0x4b,
-    0x5f,
-    0xe9,
-    0x26,
-    0x50,
-    0xe4,
-    0xe3,
-    0xe4,
-    0x53,
-    0x62,
-    0x0f,
-    0xa9,
-    0x6a,
-    0x2a,
-    0xd2,
-    0x56,
-    0xc3,
-    0x42,
-    0x62,
-    0x58,
-    0xe5,
-    0xa3,
-    0x2b,
-    0x7d,
-    0x38,
-    0xa4,
-    0x72,
-    0x05,
-    0xc8,
-    0xb7,
-    0x38,
-    0xfd,
-    0x46,
-    0x53,
-    0x61,
-    0xc8,
-    0x50,
-    0x31,
-    0x15,
-    0xff,
-    0xf1,
-    0xbb,
-    0x67,
-    0x7b,
-    0x6c,
-    0xc2,
-    0x34,
-    0xaf,
-    0x35,
-    0x6f,
-    0x4e,
-    0x3b,
-    0x41,
-    0x7c,
-    0xda,
-    0xbf,
-    0x7f,
-    0xa3,
-    0xf7,
-    0xed,
-    0xa7,
-    0x57,
-    0xa1,
-    0xe3,
-    0x32,
-    0xb3,
-    0xd4,
-    0xb7,
-    0xa9,
-    0xb0,
-    0xf4,
-    0x53,
-    0x23,
-    0x9a,
-    0x6c,
-    0x83,
-    0x0a,
-    0xc5,
-    0x96,
-    0x4c,
-    0x1d,
-    0x7c,
-    0xdb,
-    0x80,
-    0xbb,
-    0x3a,
-    0x1b,
-    0x8f,
-    0x5e,
-    0x1d,
-    0x4e,
-    0xa0,
-    0x66,
-    0x97,
-    0x6c,
-    0xe0,
-    0x18,
-    0x67,
-    0x8b,
-    0x1a,
-    0xe6,
-    0xc7,
-    0x47,
-    0x89,
-    0xf0,
-    0xe7,
-    0x67,
-    0xea,
-    0xcc,
-    0x9b,
-    0xbe,
-    0xd4,
-    0x82,
-    0x50,
-    0x4e,
-    0x4c,
-    0xdb,
-    0x45,
-    0xb4,
-    0x95,
-    0xdc,
-    0xf8,
-    0xc0,
-    0x45,
-    0x8d,
-    0xde,
-    0x63,
-    0x9e,
-    0xff,
-    0x56,
-    0xce,
-    0x1a,
-    0x8c,
-    0xe0,
-    0xd8,
-    0x48,
-    0x61,
-    0x8a,
-    0xa0,
-    0xd7,
-    0x3a,
-    0xac,
-    0x74,
-    0xf0,
-    0x6d,
-    0xd5,
-    0xf2,
-    0xca,
-    0x2a,
-    0x05,
-    0x6d,
-    0x78,
-    0x01,
-    0x1d,
-    0x93,
-    0x05,
-    0xa4,
-    0x93,
-    0x4c,
-    0xc2,
-    0xef,
-    0x6a,
-    0xe5,
-    0xdf,
-    0x25,
-    0x62,
-    0x6d,
-    0x39,
-    0x7d,
-    0x6c,
-    0x5f,
-    0x73,
-    0xdd,
-    0x60,
-    0x82,
-    0x48,
-    0xe5,
-    0xf2,
-    0x0e,
-    0x1f,
-    0x2f,
-    0xe3,
-    0x10,
-    0xe0,
-    0xd5,
-    0x74,
-    0x0f,
-    0x07,
-    0x34,
-    0x20,
-    0xf0,
-    0xf7,
-    0xf0,
-    0x8a,
-    0x17,
-    0x90,
-    0x39,
-    0xb5,
-    0xcf,
-    0x03,
-    0x4c,
-    0x73,
-    0xec,
-    0xe5,
-    0x3c,
-    0x20,
-    0xaf,
-    0x83,
-    0xf2,
-    0x8f,
-    0xe9,
-    0x76,
-    0x72,
-    0x45,
-    0x63,
-    0x77,
-    0x61,
-    0xe5,
-    0x7e,
-    0x74,
-    0xc4,
-    0xec,
-    0x17,
-    0xe3,
-    0x0b,
-    0x9e,
-    0xad,
-    0x56,
-    0x4e,
-    0x41,
-    0xc6,
-    0x4f,
-    0xd6,
-    0x88,
-    0x8e,
-    0x56,
-    0xdf,
-    0x52,
-    0xc2,
-    0x4a,
-    0x9c,
-    0x95,
-    0xcc,
-    0xf5,
-    0x7c,
-    0x94,
-    0x30,
-    0xe2,
-    0xac,
-    0x59,
-    0x26,
-    0x73,
-    0xdd,
-    0x5f,
-    0x88,
-    0x2e,
-    0x47,
-    0x8f,
-    0xef,
-    0x58,
-    0xee,
-    0x6d,
-    0x1a,
-    0xc5,
-    0x24,
-    0x94,
-    0x8f,
-    0xee,
-    0x4f,
-    0x60,
-    0x84,
-    0x44,
-    0xec,
-    0xea,
-    0xff,
-    0xc4,
-    0xd4,
-    0x39,
-    0x3d,
-    0xcc,
-    0xbe,
-    0xb6,
-    0x51,
-    0x2d,
-    0x06,
-    0xe1,
-    0x0d,
-    0x81,
-    0xad,
-    0x43,
-    0x25,
-    0xbf,
-    0xa0,
-    0xa3,
-    0x92,
-    0x0c,
-    0x3d,
-    0x7d,
-    0x35,
-    0xd4,
-    0x13,
-    0xb0,
-    0xbd,
-    0x1a,
-    0xe9,
-    0x77,
-    0xca,
-    0x0c,
-    0x02,
-    0x9a,
-    0x52,
-    0xdb,
-    0xa0,
-    0xe6,
-    0x45,
-    0xc9,
-    0xc7,
-    0xda,
-    0x6c,
-    0x84,
-    0x43,
-    0xa3,
-    0x97,
-    0xb2,
-    0xed,
-    0x4b,
-    0xf7,
-    0xcd,
-    0x29,
-    0x2d,
-    0xc9,
-    0x31,
-    0xb3,
-    0xac,
-    0x34,
-    0x73,
-    0x9c,
-    0x24,
-    0x75,
-    0xf5,
-    0x8f,
-    0x21,
-    0x39,
-    0xb7,
-    0x59,
-    0xcf,
-    0x4a,
-    0x70,
-    0xa8,
-    0xb2,
-    0x6e,
-    0xde,
-    0x13,
-    0x97,
-    0x8d,
-    0x5a,
-    0x5b,
-    0xcb,
-    0x11,
-    0xaf,
-    0xf1,
-    0x8a,
-    0x92,
-    0x2c,
-    0xb8,
-    0xba,
-    0xb3,
-    0xf8,
-    0x0b,
-    0xda,
-    0x47,
-    0xa6,
-    0x02,
-    0x35,
-    0xb9,
-    0x09,
-    0xf1,
-    0x5b,
-    0xaa,
-    0x4a,
-    0x32,
-    0xd1,
-    0xdb,
-    0x37,
-    0x25,
-    0x08,
-    0x4e,
-    0xde,
-    0x74,
-    0x8c,
-    0xa8,
-    0x5b,
-    0x9c,
-    0x7e,
-    0xda,
-    0xee,
-    0xa9,
-    0x44,
-    0x00,
-    0x51,
-    0x40,
-    0x7f,
-    0x89,
-    0x48,
-    0xe3,
-    0x3d,
-    0x99,
-    0x79,
-    0x71,
-    0x71,
-    0xab,
-    0x7e,
-    0xec,
-    0xa0,
-    0x7b,
-    0x39,
-    0x7f,
-    0xdc,
-    0x23,
-    0x67,
-    0xc0,
-    0xf6,
-    0x84,
-    0x78,
-    0x32,
-    0xf0,
-    0xe7,
-    0x9f,
-    0x0e,
-    0xb1,
-    0xe4,
-    0x25,
-    0x43,
-    0xfc,
-    0x84,
-    0x02,
-    0xbb,
-    0xa3,
-    0xa2,
-    0xae,
-    0xe0,
-    0xf8,
-    0x97,
-    0x35,
-    0x5f,
-    0x85,
-    0x16,
-    0x8a,
-    0x2b,
-    0xfd,
-    0x54,
-    0x1d,
-    0xc6,
-    0x72,
-    0x6c,
-    0xaf,
-    0xbc,
-    0xc7,
-    0x03,
-    0x65,
-    0x70,
-    0x69,
-    0x27,
-    0x1c,
-    0x1a,
-    0x3a,
-    0x7d,
-    0xfd,
-    0x11,
-    0xce,
-    0x9c,
-    0x51,
-    0x46,
-    0xda,
-    0xb4,
-    0x96,
-    0x11,
-    0xe9,
-    0x73,
-    0xd2,
-    0x31,
-    0x51,
-    0x29,
-    0x27,
-    0x0e,
-    0x66,
-    0x2a,
-    0xa8,
-    0x40,
-    0xed,
-    0x74,
-    0x6b,
-    0x55,
-    0xd4,
-    0x91,
-    0xdf,
-    0xcf,
-    0x20,
-    0xbf,
-    0x60,
-    0x6d,
-    0x26,
-    0x4f,
-    0x09,
-    0xac,
-    0xfe,
-    0x4b,
-    0xca,
-    0x8c,
-    0x35,
-    0x5b,
-    0xba,
-    0x97,
-    0xc2,
-    0xe9,
-    0xae,
-    0x20,
-    0x3b,
-    0x84,
-    0x0a,
-    0xc9,
-    0x49,
-    0x82,
-    0xd7,
-    0x48,
-    0x5a,
-    0xea,
-    0x16,
-    0x6a,
-    0x95,
-    0x91,
-    0x54,
-    0x57,
-    0x13,
-    0x82,
-    0x7f,
-    0x19,
-    0x4c,
-    0xa3,
-    0xf8,
-    0x58,
-    0xcf,
-    0x96,
-    0xe9,
-    0x67,
-    0x37,
-    0xde,
-    0xd9,
-    0x85,
-    0x5a,
-    0x43,
-    0x7e,
-    0x5c,
-    0xc3,
-    0x77,
-    0xd2,
-    0xce,
-    0x63,
-    0xf9,
-    0x69,
-    0xf1,
-    0x83,
-    0x3a,
-    0x01,
-    0x58,
-    0xfd,
-    0xff,
-    0x5b,
-    0x95,
-    0xac,
-    0x06,
-    0x49,
-    0xfb,
-    0x21,
-    0xec,
-    0x09,
-    0xa9,
-    0x97,
-    0x4e,
-    0xd1,
-    0xc4,
-    0x29,
-    0x2f,
-    0xab,
-    0x03,
-    0x43,
-    0x99,
-    0x83,
-    0x71,
-    0x57,
-    0x87,
-    0x7e,
-    0x6e,
-    0xd1,
-    0x03,
-    0x8e,
-    0xf7,
-    0x4c,
-    0x8c,
-    0x44,
-    0x28,
-    0x06,
-    0xba,
-    0xe5,
-    0xff,
-    0x91,
-    0x25,
-    0xbf,
-    0x63,
-    0xcc,
-    0x82,
-    0xbd,
-    0x65,
-    0x12,
-    0x0f,
-    0x3a,
-    0xc5,
-    0xb1,
-    0x32,
-    0x13,
-    0xb8,
-    0x9e,
-    0x5c,
-    0x00,
-    0xe8,
-    0x67,
-    0x34,
-    0x24,
-    0xbd,
-    0x68,
-    0xf2,
-    0xe2,
-    0xdb,
-    0x42,
-    0x08,
-    0xf3,
-    0xec,
-    0x89,
-    0x08,
-    0xb5,
-    0x9f,
-    0xbd,
-    0xc2,
-    0xc6,
-    0xf0,
-    0x7c,
-    0xac,
-    0xd2,
-    0xab,
-    0xf5,
-    0x88,
-    0xa9,
-    0x2b,
-    0xa0,
-    0x40,
-    0x95,
-    0x68,
-    0x2d,
-    0x15,
-    0xea,
-    0x31,
-    0xba,
-    0xf8,
-    0xde,
-    0xb5,
-    0x48,
-    0x38,
-    0x9b,
-    0x48,
-    0x70,
-    0x5e,
-    0x93,
-    0x64,
-    0x52,
-    0x56,
-    0x14,
-    0xee,
-    0xcf,
-    0xcf,
-    0x1c,
-    0xbb,
-    0xf8,
-    0xe3,
-    0x6e,
-    0x53,
-    0xc5,
-    0xfb,
-    0xe5,
-    0xf5,
-    0x0b,
-    0xed,
-    0x09,
-    0xdb,
-    0xa8,
-    0x68,
-    0xe0,
-    0xbe,
-    0x00,
-    0x92,
-    0x07,
-    0x9d,
-    0xae,
-    0xef,
-    0x00,
-    0xbb,
-    0x73,
-    0x85,
-    0xce,
-    0xe7,
-    0x72,
-    0x3e,
-    0xbf,
-    0xff,
-    0xa0,
-    0x8d,
-    0x8a,
-    0xb7,
-    0x76,
-    0x54,
-    0x99,
-    0x97,
-    0xe9,
-    0x06,
-    0xa8,
-    0x43,
-    0x9b,
-    0x09,
-    0x8f,
-    0xff,
-    0x53,
-    0x5e,
-    0x5c,
-    0x72,
-    0xab,
-    0x83,
-    0xa5,
-    0xaa,
-    0x08,
-    0x98,
-    0x1d,
-    0x61,
-    0xcf,
-    0xc2,
-    0x64,
-    0x7f,
-    0xd6,
-    0xcd,
-    0x24,
-    0xe0,
-    0x19,
-    0x15,
-    0x59,
-    0x56,
-    0xaf,
-    0xa6,
-    0xf0,
-    0xf2,
-    0xfc,
-    0xa2,
-    0x94,
-    0x7f,
-    0x27,
-    0xe3,
-    0xc5,
-    0x50,
-    0xce,
-    0xe2,
-    0x2a,
-    0x3c,
-    0xf9,
-    0xd7,
-    0x28,
-    0xe6,
-    0x4d,
-    0x22,
-    0xb3,
-    0x42,
-    0x83,
-    0xea,
-    0x64,
-    0x54,
-    0x18,
-    0x04,
-    0xcc,
-    0x3b,
-    0x45,
-    0x16,
-    0x09,
-    0x6f,
-    0x31,
-    0xfc,
-    0x96,
-    0x47,
-    0x66,
-    0x6a,
-    0x68,
-    0xbe,
-    0x81,
-    0xd3,
-    0x36,
-    0x76,
-    0x2e,
-    0x8a,
-    0x18,
-    0xfd,
-    0x54,
-    0x28,
-    0x53,
-    0x50,
-    0x8d,
-    0x2d,
-    0x73,
-    0x9d,
-    0xd9,
-    0xea,
-    0x9b,
-    0x4d,
-    0x93,
-    0x9e,
-    0x1a,
-    0x42,
-    0xa4,
-    0xdf,
-    0x3e,
-    0x5d,
-    0xf6,
-    0x3b,
-    0x6d,
-    0x44,
-    0x2c,
-    0x20,
-    0x71,
-    0x62,
-    0x90,
-    0xf9,
-    0x14,
-    0x2f,
-    0x4c,
-    0x9a,
-    0xed,
-    0xb1,
-    0xde,
-    0xde,
-    0x79,
-    0x43,
-    0xc6,
-    0x8e,
-    0x6e,
-    0x95,
-    0x81,
-    0x85,
-    0x4b,
-    0xf4,
-    0xbb,
-    0x12,
-    0x34,
-    0xcb,
-    0xc1,
-    0x9e,
-    0xfd,
-    0x6a,
-    0x35,
-    0x8f,
-    0x85,
-    0x07,
-    0x05,
-    0x6c,
-    0x45,
-    0x02,
-    0x9d,
-    0x41,
-    0x28,
-    0x6e,
-    0x5c,
-    0x45,
-    0x9d,
-    0xcc,
-    0x45,
-    0xba,
-    0xeb,
-    0x19,
-    0xf8,
-    0x15,
-    0xc6,
-    0x0c,
-    0xe0,
-    0x5f,
-    0x1f,
-    0x99,
-    0xad,
-    0xdb,
-    0x40,
-    0xb9,
-    0x05,
-    0xe9,
-    0x17,
-    0x6d,
-    0x76,
-    0x2a,
-    0xd2,
-    0x00,
-    0xb0,
-    0xe5,
-    0xad,
-    0x8d,
-    0xf1,
-    0xa9,
-    0x08,
-    0xc2,
-    0xc0,
-    0x34,
-    0xbd,
-    0xe3,
-    0xde,
-    0x94,
-    0xb0,
-    0x12,
-    0x7a,
-    0x8c,
-    0xa8,
-    0xcd,
-    0xa4,
-    0x39,
-    0x5d,
-    0xb8,
-    0x04,
-    0xf5,
-    0xd2,
-    0x9d,
-    0xcc,
-    0x7c,
-    0xe4,
-    0xb1,
-    0xeb,
-    0x4e,
-    0x23,
-    0x19,
-    0x84,
-    0x54,
-    0xe2,
-    0xac,
-    0x9e,
-    0xc5,
-    0x8a,
-    0xfb,
-    0x1d,
-    0x4b,
-    0x34,
-    0x8e,
-    0xf1,
-    0x62,
-    0x76,
-    0x71,
-    0x8d,
-    0x01,
-    0x7c,
-    0xf0,
-    0x9a,
-    0x7d,
-    0x5b,
-    0x9e,
-    0xed,
-    0xaa,
-    0xa3,
-    0x9c,
-    0xb7,
-    0x43,
-    0x33,
-    0x17,
-    0xfc,
-    0x8c,
-    0x52,
-    0x13,
-    0x47,
-    0x35,
-    0xfb,
-    0x67,
-    0x9b,
-    0x82,
-    0x77,
-    0x09,
-    0xac,
-    0xa9,
-    0x32,
-    0x8c,
-    0x4f,
-    0x7c,
-    0xc7,
-    0xe7,
-    0x30,
-    0x47,
-    0x5d,
-    0x78,
-    0xc3,
-    0xfc,
-    0x36,
-    0x49,
-    0x7d,
-    0x8d,
-    0x85,
-    0x91,
-    0x43,
-    0x9a,
-    0x80,
-    0x7e,
-    0x23,
-    0x4c,
-    0xb7,
-    0x31,
-    0x42,
-    0x81,
-    0xa4,
-    0x0b,
-    0x15,
-    0x29,
-    0x83,
-    0x27,
-    0xd4,
-    0xef,
-    0x64,
-    0x27,
-    0x2c,
-    0x1d,
-    0x7e,
-    0x34,
-    0x35,
-    0xb9,
-    0xc6,
-    0x40,
-    0xa3,
-    0xf4,
-    0xc0,
-    0x8e,
-    0x40,
-    0xc6,
-    0x95,
-    0x75,
-    0x9a,
-    0xd2,
-    0x67,
-    0x61,
-    0xf8,
-    0x8f,
-    0xe1,
-    0x1a,
-    0x93,
-    0xa9,
-    0x12,
-    0x49,
-    0x03,
-    0xa5,
-    0x7b,
-    0x38,
-    0xf8,
-    0xc5,
-    0x66,
-    0xd9,
-    0x2a,
-    0x2b,
-    0x7a,
-    0x0a,
-    0x93,
-    0x40,
-    0x8d,
-    0x17,
-    0xdb,
-    0x57,
-    0xb9,
-    0x80,
-    0x14,
-    0x8e,
-    0xb2,
-    0xfd,
-    0xa7,
-    0xf5,
-    0x56,
-    0xc0,
-    0x8e,
-    0xf3,
-    0x86,
-    0xfa,
-    0xc4,
-    0xe5,
-    0x35,
-    0xa0,
-    0xfa,
-    0x07,
-    0xbe,
-    0x6f,
-    0x8c,
-    0x98,
-    0x7b,
-    0x2e,
-    0xb3,
-    0x39,
-    0x93,
-    0x33,
-    0xfc,
-    0x97,
-    0x13,
-    0x28,
-    0xf9,
-    0x49,
-    0x41,
-    0x0f,
-    0x36,
-    0xfc,
-    0x2d,
-    0x84,
-    0x6e,
-    0xcd,
-    0x88,
-    0x42,
-    0xff,
-    0xf6,
-    0xb9,
-    0xe9,
-    0x9c,
-    0xad,
-    0x2e,
-    0xff,
-    0x42,
-    0x49,
-    0xf0,
-    0x34,
-    0x6d,
-    0xa7,
-    0x7b,
-    0xea,
-    0x8b,
-    0xcc,
-    0xcc,
-    0xf4,
-    0xb1,
-    0xcb,
-    0xbb,
-    0x9e,
-    0x8d,
-    0xe9,
-    0x8b,
-    0xee,
-    0x9c,
-    0x00,
-    0xc0,
-    0x2a,
-    0x9c,
-    0x21,
-    0x30,
-    0x9a,
-    0x45,
-    0x7d,
-    0x5d,
-    0x8f,
-    0x34,
-    0x86,
-    0x02,
-    0xa5,
-    0x28,
-    0x51,
-    0xec,
-    0x44,
-    0x70,
-    0x3f,
-    0x0b,
-    0x6d,
-    0xa4,
-    0xdc,
-    0xc9,
-    0xb3,
-    0x94,
-    0x07,
-    0x9a,
-    0x87,
-    0x7e,
-    0x54,
-    0xd5,
-    0xb9,
-    0x84,
-    0xae,
-    0xc2,
-    0x3c,
-    0x5c,
-    0x41,
-    0xf4,
-    0x2a,
-    0x4a,
-    0x97,
-    0xd9,
-    0x07,
-    0x4b,
-    0x00,
-    0x8f,
-    0x4a,
-    0x93,
-    0x38,
-    0xf9,
-    0x19,
-    0x3a,
-    0x44,
-    0x13,
-    0x55,
-    0x33,
-    0x9d,
-    0x82,
-    0xd6,
-    0x7d,
-    0x90,
-    0x70,
-    0xf8,
-    0x9d,
-    0xe5,
-    0x96,
-    0x56,
-    0x4b,
-    0xbf,
-    0x9a,
-    0xd5,
-    0x6c,
-    0xc3,
-    0x9c,
-    0xe5,
-    0x40,
-    0x7c,
-    0x0c,
-    0x03,
-    0xdd,
-    0xfe,
-    0xbe,
-    0x82,
-    0xdc,
-    0xca,
-    0x40,
-    0x8c,
-    0x52,
-    0xf2,
-    0x6b,
-    0x64,
-    0x02,
-    0x7e,
-    0x38,
-    0xed,
-    0xd0,
-    0x0d,
-    0xd5,
-    0x70,
-    0x79,
-    0xc0,
-    0xf8,
-    0x9a,
-    0x82,
-    0x53,
-    0x74,
-    0xc4,
-    0x6e,
-    0x8d,
-    0x0a,
-    0x78,
-    0x34,
-    0xdb,
-    0x81,
-    0x30,
-    0xf0,
-    0x38,
-    0xf8,
-    0x60,
-    0xd9,
-    0x4f,
-    0x7c,
-    0xb7,
-    0x73,
-    0xe4,
-    0xd6,
-    0xa2,
-    0x06,
-    0x70,
-    0xa6,
-    0x13,
-    0x4e,
-    0x0b,
-    0xb6,
-    0x80,
-    0x74,
-    0x8f,
-    0x88,
-    0x2e,
-    0x3d,
-    0xfb,
-    0x31,
-    0xaf,
-    0x82,
-    0x15,
-    0x6a,
-    0xaa,
-    0xe0,
-    0x54,
-    0xe5,
-    0xda,
-    0xb0,
-    0xfc,
-    0xdd,
-    0x59,
-    0x39,
-    0x8b,
-    0xf1,
-    0x1f,
-    0x25,
-    0x54,
-    0x32,
-    0xc5,
-    0x32,
-    0x6a,
-    0x7b,
-    0x8f,
-    0x2a,
-    0xbf,
-    0x01,
-    0xaa,
-    0x15,
-    0x8d,
-    0x2a,
-    0xb2,
-    0xad,
-    0xf5,
-    0xa3,
-    0x78,
-    0x12,
-    0xe7,
-    0xad,
-    0x01,
-    0xbf,
-    0x41,
-    0xb7,
-    0xd2,
-    0xbd,
-    0x3b,
-    0x32,
-    0x6a,
-    0x16,
-    0x02,
-    0xa1,
-    0x11,
-    0x8d,
-    0xa3,
-    0xef,
-    0xd0,
-    0x8c,
-    0x2b,
-    0x06,
-    0xc1,
-    0x5e,
-    0x0c,
-    0x9d,
-    0x89,
-    0x9e,
-    0xc3,
-    0x51,
-    0x22,
-    0xf0,
-    0xb8,
-    0xf8,
-    0xde,
-    0xef,
-    0x66,
-    0x32,
-    0xa8,
-    0x66,
-    0xbb,
-    0x40,
-    0x8d,
-    0xc2,
-    0xc2,
-    0x1a,
-    0x7c,
-    0xc7,
-    0x7f,
-    0xbb,
-    0x4a,
-    0x83,
-    0x1b,
-    0xc0,
-    0xf9,
-    0x80,
-    0x41,
-    0x31,
-    0x3a,
-    0x3e,
-    0xc7,
-    0x9f,
-    0x30,
-    0xe0,
-    0x91,
-    0x6f,
-    0x77,
-    0x26,
-    0xb2,
-    0x75,
-    0x65,
-    0x9b,
-    0xd5,
-    0xc5,
-    0x90,
-    0x10,
-    0xdc,
-    0xc5,
-    0x90,
-    0x48,
-    0xc6,
-    0x87,
-    0x06,
-    0xf5,
-    0xd6,
-    0x56,
-    0xdd,
-    0xe3,
-    0xf1,
-    0x8f,
-    0xcf,
-    0x74,
-    0x49,
-    0xb3,
-    0x2b,
-    0x4c,
-    0x38,
-    0xb9,
-    0xd6,
-    0x4d,
-    0x6e,
-    0xa9,
-    0x90,
-    0xc6,
-    0x4f,
-    0x66,
-    0x79,
-    0xe7,
-    0x97,
-    0xcb,
-    0xd4,
-    0x79,
-    0x40,
-    0xfa,
-    0x0a,
-    0xcc,
-    0xa5,
-    0xf1,
-    0xf2,
-    0xf0,
-    0xe7,
-    0x5f,
-    0x4f,
-    0x27,
-    0x90,
-    0xb5,
-    0x9b,
-    0x9b,
-    0x76,
-    0x7f,
-    0x03,
-    0x4d,
-    0xe3,
-    0xf5,
-    0xb2,
-    0x4e,
-    0xf2,
-    0xcd,
-    0x52,
-    0x31,
-    0x3c,
-    0x54,
-    0xd0,
-    0xc0,
-    0xb4,
-    0xbd,
-    0x60,
-    0xee,
-    0xd0,
-    0xb9,
-    0xc2,
-    0x0d,
-    0xea,
-    0x48,
-    0xc3,
-    0x41,
-    0xe5,
-    0xce,
-    0x06,
-    0x35,
-    0x13,
-    0x69,
-    0x04,
-    0x0c,
-    0x56,
-    0x82,
-    0x52,
-    0x9b,
-    0x86,
-    0xa2,
-    0x23,
-    0xd5,
-    0x13,
-    0x87,
-    0x0d,
-    0x86,
-    0xec,
-    0x78,
-    0x10,
-    0x45,
-    0x9f,
-    0xd5,
-    0xd4,
-    0xa3,
-    0xc1,
-    0xf2,
-    0x32,
-    0xa9,
-    0x90,
-    0x25,
-    0xf6,
-    0x82,
-    0xd7,
-    0x1e,
-    0xe3,
-    0x74,
-    0x12,
-    0x77,
-    0xf8,
-    0x15,
-    0xd3,
-    0x8c,
-    0xf2,
-    0xbb,
-    0x64,
-    0x8d,
-    0x12,
-    0x34,
-    0xae,
-    0xd2,
-    0x20,
-    0xb7,
-    0x59,
-    0x6e,
-    0xb0,
-    0x1b,
-    0x35,
-    0x06,
-    0xa4,
-    0x47,
-    0xd9,
-    0xe4,
-    0xf2,
-    0xea,
-    0x8a,
-    0x47,
-    0xa8,
-    0x6c,
-    0x5e,
-    0xfd,
-    0x2d,
-    0x24,
-    0xa0,
-    0x34,
-    0xc9,
-    0xcb,
-    0x77,
-    0x8e,
-    0x67,
-    0x30,
-    0xc3,
-    0x73,
-    0x9a,
-    0x2e,
-    0x48,
-    0xab,
-    0xdf,
-    0xdb,
-    0x0e,
-    0x2c,
-    0x22,
-    0x03,
-    0x07,
-    0x30,
-    0x83,
-    0xd5,
-    0xf3,
-    0x8b,
-    0x59,
-    0xdb,
-    0x81,
-    0x3c,
-    0x77,
-    0x30,
-    0xb7,
-    0x42,
-    0xaf,
-    0xed,
-    0x93,
-    0xb1,
-    0x95,
-    0xe4,
-    0xf3,
-    0x04,
-    0x85,
-    0x91,
-    0xb2,
-    0xb5,
-    0xe8,
-    0x4d,
-    0x14,
-    0x0b,
-    0xb2,
-    0xc5,
-    0x64,
-    0x34,
-    0x2f,
-    0xab,
-    0xdb,
-    0x93,
-    0x00,
-    0xab,
-    0xc4,
-    0x5b,
-    0x61,
-    0xa1,
-    0xde,
-    0x5d,
-    0xad,
-    0x09,
-    0x02,
-    0x1e,
-    0x23,
-    0xb6,
-    0x05,
-    0x2d,
-    0xea,
-    0xc8,
-    0xe0,
-    0xb3,
-    0x53,
-    0xd8,
-    0x0e,
-    0x4c,
-    0x5f,
-    0x75,
-    0x36,
-    0x15,
-    0x81,
-    0xd4,
-    0x0a,
-    0x07,
-    0xa4,
-    0xc3,
-    0x6f,
-    0x83,
-    0x70,
-    0xdf,
-    0xde,
-    0x2d,
-    0xc9,
-    0x07,
-    0x0a,
-    0xfe,
-    0x99,
-    0x10,
-    0xc3,
-    0x95,
-    0xd0,
-    0xba,
-    0x1a,
-    0xce,
-    0xa9,
-    0xe3,
-    0xc6,
-    0x96,
-    0x2e,
-    0xfb,
-    0xc6,
-    0xfe,
-    0xfe,
-    0xb8,
-    0x48,
-    0x8e,
-    0x4e,
-    0x0b,
-    0xca,
-    0xdb,
-    0x2e,
-    0x52,
-    0x7f,
-    0x5b,
-    0x0d,
-    0xcf,
-    0xf4,
-    0x79,
-    0x80,
-    0x59,
-    0xf3,
-    0xe5,
-    0x3f,
-    0x51,
-    0xa8,
-    0x2e,
-    0x70,
-    0xd8,
-    0x02,
-    0x92,
-    0x29,
-    0x3f,
-    0x5c,
-    0x15,
-    0x30,
-    0xbf,
-    0x5d,
-    0xd0,
-    0x05,
-    0x6b,
-    0x1c,
-    0x8c,
-    0x22,
-    0x62,
-    0x88,
-    0x8f,
-    0x81,
-    0x49,
-    0x08,
-    0xb6,
-    0x5f,
-    0xf9,
-    0x5e,
-    0xc4,
-    0x40,
-    0x74,
-    0xd1,
-    0xfa,
-    0x33,
-    0x1e,
-    0x8b,
-    0xe8,
-    0x57,
-    0x2a,
-    0x40,
-    0x82,
-    0x9e,
-    0x52,
-    0x10,
-    0x76,
-    0xd1,
-    0xcb,
-    0xaf,
-    0xbd,
-    0xd4,
-    0x78,
-    0xc3,
-    0x70,
-    0x2c,
-    0x5e,
-    0x8d,
-    0xde,
-    0xbe,
-    0x58,
-    0xcc,
-    0xdb,
-    0xd9,
-    0x0b,
-    0xde,
-    0x5b,
-    0x77,
-    0x1d,
-    0x29,
-    0x3f,
-    0xc0,
-    0xa2,
-    0xb9,
-    0x6e,
-    0xd0,
-    0xd7,
-    0x2a,
-    0x28,
-    0xba,
-    0x13,
-    0xc9,
-    0x97,
-    0xcd,
-    0xfa,
-    0xf6,
-    0xa7,
-    0x16,
-    0xf4,
-    0xcd,
-    0x18,
-    0x25,
-    0xde,
-    0x05,
-    0xd2,
-    0x14,
-    0xff,
-    0x17,
-    0x78,
-    0xc6,
-    0x3d,
-    0xa3,
-    0x3f,
-    0x6d,
-    0x90,
-    0x10,
-    0x01,
-    0x4f,
-    0xb8,
-    0x74,
-    0x8d,
-    0xc9,
-    0x2b,
-    0xb3,
-    0x42,
-    0x94,
-    0x52,
-    0xea,
-    0xdc,
-    0x47,
-    0xf4,
-    0x0e,
-    0x8d,
-    0x1d,
-    0xf3,
-    0xd0,
-    0x50,
-    0xf9,
-    0x36,
-    0xc4,
-    0x7a,
-    0xa7,
-    0xe6,
-    0xc3,
-    0x91,
-    0x65,
-    0xdd,
-    0x8e,
-    0x62,
-    0xa2,
-    0x5b,
-    0xb3,
-    0x4e,
-    0x05,
-    0xfb,
-    0xb5,
-    0xe5,
-    0xb1,
-    0xe6,
-    0x67,
-    0xb6,
-    0xc8,
-    0x47,
-    0x99,
-    0x64,
-    0x2d,
-    0xff,
-    0xf6,
-    0xfd,
-    0x8f,
-    0x99,
-    0x2d,
-    0x88,
-    0xa3,
-    0x80,
-    0x4f,
-    0xdd,
-    0xb0,
-    0x6f,
-    0x78,
-    0xba,
-    0x51,
-    0x2a,
-    0xb2,
-    0x12,
-    0x77,
-    0x6c,
-    0x16,
-    0xa8,
-    0xad,
-    0x20,
-    0x35,
-    0xdd,
-    0xa0,
-    0xd3,
-    0xb6,
-    0xc6,
-    0xde,
-    0x6a,
-    0x40,
-    0x82,
-    0xde,
-    0x10,
-    0x9a,
-    0xcb,
-    0x41,
-    0x73,
-    0x10,
-    0xca,
-    0x57,
-    0x30,
-    0x19,
-    0x30,
-    0xe5,
-    0x8b,
-    0x38,
-    0x82,
-    0x25,
-    0x64,
-    0x20,
-    0xb4,
-    0x0f,
-    0x67,
-    0x1b,
-    0xfa,
-    0xd7,
-    0x82,
-    0xac,
-    0xdb,
-    0xb7,
-    0x9c,
-    0x73,
-    0x87,
-    0xee,
-    0x84,
-    0x52,
-    0x6a,
-    0x09,
-    0x27,
-    0xce,
-    0x01,
-    0x61,
-    0x07,
-    0xb8,
-    0xed,
-    0xe5,
-    0xe8,
-    0x0c,
-    0x46,
-    0x19,
-    0xcc,
-    0x19,
-    0x31,
-    0x5f,
-    0x22,
-    0xe2,
-    0xb5,
-    0x76,
-    0x3b,
-    0xc5,
-    0xca,
-    0x40,
-    0xfd,
-    0x5a,
-    0xb3,
-    0xc8,
-    0xdb,
-    0x9e,
-    0x8e,
-    0x83,
-    0x05,
-    0x51,
-    0x2a,
-    0xd6,
-    0xdb,
-    0x9c,
-    0x18,
-    0xd9,
-    0xa8,
-    0xf7,
-    0x05,
-    0x5b,
-    0x8d,
-    0x4a,
-    0x47,
-    0x26,
-    0xbb,
-    0x52,
-    0xb5,
-    0x83,
-    0xe5,
-    0x47,
-    0xbc,
-    0x01,
-    0xf6,
-    0xbc,
-    0xaf,
-    0x73,
-    0xff,
-    0xc6,
-    0x5f,
-    0x38,
-    0x73,
-    0x60,
-    0xec,
-    0xbf,
-    0x96,
-    0x0e,
-    0xda,
-    0x49,
-    0x33,
-    0xc1,
-    0x67,
-    0xf1,
-    0x8d,
-    0xfb,
-    0x1c,
-    0xea,
-    0x99,
-    0x33,
-    0xa3,
-    0x09,
-    0x6a,
-    0x7b,
-    0xd8,
-    0x83,
-    0xed,
-    0x60,
-    0x22,
-    0xf7,
-    0xd6,
-    0x12,
-    0x04,
-    0xaf,
-    0xda,
-    0xc5,
-    0xef,
-    0x23,
-    0x1f,
-    0x56,
-    0x5b,
-    0xbe,
-    0xf1,
-    0x32,
-    0x16,
-    0xe5,
-    0xb6,
-    0x74,
-    0xdb,
-    0x36,
-    0x24,
-    0x4d,
-    0x26,
-    0x0d,
-    0xb1,
-    0xa9,
-    0x47,
-    0x4d,
-    0x4b,
-    0x0f,
-    0xb5,
-    0x5d,
-    0x4a,
-    0xc9,
-    0xa6,
-    0x70,
-    0xa3,
-    0x46,
-    0xdc,
-    0x0a,
-    0x5e,
-    0xbc,
-    0xc2,
-    0xc0,
-    0x4a,
-    0x11,
-    0xb7,
-    0x3f,
-    0xef,
-    0xfc,
-    0xaa,
-    0x8f,
-    0xc4,
-    0x68,
-    0xe7,
-    0x99,
-    0xa2,
-    0x19,
-    0x30,
-    0xe7,
-    0x79,
-    0x91,
-    0x10,
-    0xac,
-    0x42,
-    0x35,
-    0x6c,
-    0x04,
-    0x34,
-    0xac,
-    0x5b,
-    0x7c,
-    0x3b,
-    0x88,
-    0x38,
-    0xd5,
-    0xa6,
-    0x28,
-    0xf5,
-    0x05,
-    0x1f,
-    0xdc,
-    0xb1,
-    0x7f,
-    0xe1,
-    0x4b,
-    0x8d,
-    0xb4,
-    0x25,
-    0x12,
-    0xbc,
-    0xda,
-    0xdd,
-    0xae,
-    0xda,
-    0xec,
-    0xa5,
-    0x9c,
-    0x7f,
-    0xf2,
-    0xf7,
-    0xbe,
-    0x13,
-    0x82,
-    0x9e,
-    0x01,
-    0xe4,
-    0x87,
-    0x6d,
-    0x3d,
-    0x75,
-    0x41,
-    0x30,
-    0x5d,
-    0x1a,
-    0x8d,
-    0xe3,
-    0xbf,
-    0xc1,
-    0x67,
-    0x22,
-    0xde,
-    0x13,
-    0xad,
-    0xe1,
-    0x2e,
-    0xbc,
-    0x25,
-    0x5d,
-    0x47,
-    0x06,
-    0xc2,
-    0x52,
-    0x46,
-    0xad,
-    0x23,
-    0x6f,
-    0x70,
-    0xef,
-    0x5d,
-    0x07,
-    0x19,
-    0xe2,
-    0xfa,
-    0x09,
-    0xc5,
-    0x0a,
-    0x42,
-    0x32,
-    0x8c,
-    0x2b,
-    0xb9,
-    0x81,
-    0xc3,
-    0x5c,
-    0xe8,
-    0xec,
-    0xd8,
-    0x5d,
-    0x60,
-    0x51,
-    0x7e,
-    0x2a,
-    0xfd,
-    0xaf,
-    0x0a,
-    0xd0,
-    0x68,
-    0x96,
-    0x1d,
-    0x80,
-    0xdf,
-    0xdc,
-    0x84,
-    0xe2,
-    0x39,
-    0x92,
-    0x5c,
-    0xab,
-    0x24,
-    0x36,
-    0x7a,
-    0x72,
-    0xb2,
-    0x2a,
-    0x0a,
-    0xc0,
-    0x14,
-    0x65,
-    0x75,
-    0x66,
-    0xa5,
-    0x69,
-    0x89,
-    0x13,
-    0x2a,
-    0x75,
-    0xd4,
-    0x25,
-    0x57,
-    0xfb,
-    0x50,
-    0xc0,
-    0x96,
-    0x54,
-    0x46,
-    0x1d,
-    0x05,
-    0xb3,
-    0x6c,
-    0x25,
-    0xbd,
-    0x58,
-    0x50,
-    0x3f,
-    0x5a,
-    0x06,
-    0xfa,
-    0x66,
-    0xb8,
-    0xb6,
-    0xcd,
-    0x7e,
-    0xfa,
-    0x8d,
-    0xaf,
-    0xe8,
-    0xd1,
-    0x0c,
-    0x6a,
-    0x54,
-    0xfb,
-    0x87,
-    0x51,
-    0xd6,
-    0x09,
-    0xd8,
-    0x26,
-    0x3d,
-    0x66,
-    0x54,
-    0x3b,
-    0xa0,
-    0x95,
-    0xfe,
-    0xd8,
-    0x39,
-    0xba,
-    0xfb,
-    0xdd,
-    0x76,
-    0x5c,
-    0x46,
-    0xa8,
-    0x4e,
-    0x69,
-    0xa5,
-    0x39,
-    0xd2,
-    0x7a,
-    0xdc,
-    0x94,
-    0x04,
-    0x59,
-    0x20,
-    0x67,
-    0xeb,
-    0xc1,
-    0xce,
-    0xed,
-    0xe7,
-    0x64,
-    0x5d,
-    0x12,
-    0x43,
-    0x32,
-    0x92,
-    0xd8,
-    0x09,
-    0xd9,
-    0xf2,
-    0xf9,
-    0x1a,
-    0x88,
-    0x7d,
-    0xce,
-    0x7d,
-    0xf9,
-    0x99,
-    0x6f,
-    0xf8,
-    0xae,
-    0x4d,
-    0x1c,
-    0xdd,
-    0x7b,
-    0xaf,
-    0xdc,
-    0x27,
-    0x44,
-    0xa0,
-    0x63,
-    0xc5,
-    0x08,
-    0xb6,
-    0x39,
-    0x36,
-    0x1e,
-    0x7a,
-    0x19,
-    0x56,
-    0xbf,
-    0xd4,
-    0x98,
-    0x78,
-    0xc5,
-    0xc3,
-    0x07,
-    0xb4,
-    0xb2,
-    0x51,
-    0x99,
-    0x83,
-    0xf4,
-    0xc7,
-    0xc9,
-    0x89,
-    0x68,
-    0x1d,
-    0xf6,
-    0xb1,
-    0x1c,
-    0xb4,
-    0x50,
-    0x7f,
-    0x59,
-    0x48,
-    0xf8,
-    0xa2,
-    0xe1,
-    0x20,
-    0x63,
-    0xc9,
-    0x75,
-    0x87,
-    0x00,
-    0xb8,
-    0x9a,
-    0x80,
-    0x1a,
-    0x9b,
-    0x9d,
-    0xb6,
-    0xff,
-    0x9a,
-    0xd5,
-    0xb2,
-    0x62,
-    0xad,
-    0x28,
-    0x50,
-    0xfe,
-    0xb2,
-    0xd0,
-    0x74,
-    0x7c,
-    0xbd,
-    0x5f,
-    0xf9,
-    0x97,
-    0xaf,
-    0x01,
-    0xea,
-    0x7e,
-    0x0a,
-    0x02,
-    0xf5,
-    0x79,
-    0x03,
-    0x90,
-    0x1c,
-    0xd0,
-    0xd9,
-    0xc1,
-    0xae,
-    0xe9,
-    0x66,
-    0xd8,
-    0x76,
-    0xb0,
-    0xf4,
-    0xc4,
-    0x32,
-    0x3b,
-    0x51,
-    0xe9,
-    0x47,
-    0xaf,
-    0x26,
-    0x23,
-    0xb2,
-    0x5d,
-    0x84,
-    0x08,
-    0x42,
-    0x31,
-    0xc0,
-    0x6e,
-    0x04,
-    0x4d,
-    0x81,
-    0x2e,
-    0xff,
-    0xf1,
-    0x17,
-    0x27,
-    0x22,
-    0x9e,
-    0x0e,
-    0x85,
-    0x7b,
-    0x7b,
-    0x03,
-    0x43,
-    0xaa,
-    0xf7,
-    0xb7,
-    0xee,
-    0x94,
-    0xb0,
-    0x62,
-    0xac,
-    0x5c,
-    0x94,
-    0x4a,
-    0x7e,
-    0x8f,
-    0x45,
-    0x93,
-    0xc2,
-    0x9e,
-    0xc2,
-    0x59,
-    0xfc,
-    0x92,
-    0x45,
-    0xfc,
-    0xd5,
-    0xfb,
-    0x67,
-    0xbb,
-    0x64,
-    0x29,
-    0x8a,
-    0x85,
-    0xad,
-    0x9f,
-    0x78,
-    0x0b,
-    0x67,
-    0xc5,
-    0x48,
-    0x1a,
-    0x03,
-    0xdd,
-    0x82,
-    0x28,
-    0xe9,
-    0x38,
-    0x83,
-    0x2d,
-    0x05,
-    0xaa,
-    0x22,
-    0xb4,
-    0x82,
-    0x3b,
-    0x93,
-    0x31,
-    0xd5,
-    0x1f,
-    0x8c,
-    0x95,
-    0xfe,
-    0xe9,
-    0xa7,
-    0x20,
-    0x0a,
-    0xfb,
-    0x08,
-    0x76,
-    0xdd,
-    0x41,
-    0x3f,
-    0xf6,
-    0x2e,
-    0x1f,
-    0x6f,
-    0x47,
-    0xd3,
-    0xa7,
-    0xb0,
-    0x33,
-    0x3f,
-    0x10,
-    0xb3,
-    0xb9,
-    0x49,
-    0x63,
-    0xa5,
-    0x5d,
-    0x2f,
-    0x78,
-    0x55,
-    0xc3,
-    0xda,
-    0x21,
-    0x98,
-    0x7c,
-    0x63,
-    0xa5,
-    0xed,
-    0x20,
-    0xd7,
-    0x70,
-    0x5d,
-    0x9d,
-    0x37,
-    0x08,
-    0xa5,
-    0xce,
-    0xc3,
-    0x43,
-    0x97,
-    0x50,
-    0x78,
-    0xb8,
-    0xbe,
-    0x91,
-    0xd8,
-    0x73,
-    0x41,
-    0x29,
-    0xe9,
-    0xed,
-    0x09,
-    0x6e,
-    0x80,
-    0x3b,
-    0x26,
-    0x42,
-    0xbf,
-    0x85,
-    0x6f,
-    0x30,
-    0xdd,
-    0xba,
-    0x69,
-    0xb8,
-    0x25,
-    0x82,
-    0x6b,
-    0xe6,
-    0x42,
-    0x74,
-    0xff,
-    0x2a,
-    0xb9,
-    0x8a,
-    0x8a,
-    0x63,
-    0xb7,
-    0xd1,
-    0x30,
-    0x3d,
-    0x0d,
-    0x65,
-    0xf2,
-    0xbd,
-    0x79,
-    0x9d,
-    0x19,
-    0x1a,
-    0x27,
-    0x83,
-    0xd8,
-    0xcf,
-    0x77,
-    0x87,
-    0x2d,
-    0xee,
-    0x01,
-    0x74,
-    0x08,
-    0xb7,
-    0xd7,
-    0xa2,
-    0xaf,
-    0x69,
-    0x09,
-    0x6e,
-    0x61,
-    0x58,
-    0x6f,
-    0xe7,
-    0x39,
-    0x40,
-    0xa2,
-    0xca,
-    0x56,
-    0xd9,
-    0x4c,
-    0xb1,
-    0x39,
-    0xab,
-    0xa2,
-    0x87,
-    0x6e,
-    0x24,
-    0x2e,
-    0x3f,
-    0x6f,
-    0xe8,
-    0xd2,
-    0xc5,
-    0xc5,
-    0x68,
-    0x0a,
-    0x35,
-    0x70,
-    0xb6,
-    0x71,
-    0x4c,
-    0x89,
-    0x98,
-    0x87,
-    0x1c,
-    0x26,
-    0xdb,
-    0xb1,
-    0x03,
-    0x7e,
-    0xe9,
-    0x81,
-    0xdd,
-    0x4e,
-    0x9e,
-    0x38,
-    0x79,
-    0x7b,
-    0x58,
-    0x89,
-    0x4a,
-    0xf8,
-    0x4d,
-    0xa0,
-    0x5f,
-    0xea,
-    0x22,
-    0x63,
-    0x95,
-    0x0a,
-    0xb9,
-    0xf8,
-    0x0c,
-    0x4b,
-    0x4a,
-    0x87,
-    0xd7,
-    0xbe,
-    0xb5,
-    0x41,
-    0xf8,
-    0xb2,
-    0x16,
-    0xa1,
-    0x8b,
-    0x1f,
-    0x9a,
-    0xf1,
-    0x41,
-    0x45,
-    0x92,
-    0x11,
-    0x10,
-    0x90,
-    0xc6,
-    0x74,
-    0x29,
-    0xbf,
-    0x0c,
-    0x6b,
-    0x2b,
-    0x45,
-    0x19,
-    0xa6,
-    0x96,
-    0xef,
-    0x96,
-    0xf7,
-    0x82,
-    0xc8,
-    0x77,
-    0x5a,
-    0x91,
-    0x3a,
-    0x88,
-    0x33,
-    0x22,
-    0x75,
-    0x48,
-    0xd6,
-    0xc7,
-    0x15,
-    0xfb,
-    0x4c,
-    0xfa
-  ],
-  const [
-    0xb0,
-    0x02,
-    0x50,
-    0xcc,
-    0x95,
-    0x2f,
-    0x6d,
-    0xc3,
-    0x04,
-    0x26,
-    0x00,
-    0xe5,
-    0x4b,
-    0x89,
-    0x6d,
-    0x17,
-    0x8c,
-    0x84,
-    0x84,
-    0xf5,
-    0xbf,
-    0xbb,
-    0xa9,
-    0x6a,
-    0xfa,
-    0x81,
-    0x32,
-    0x7d,
-    0xf0,
-    0x4b,
-    0x11,
-    0x6e,
-    0xb9,
-    0x64,
-    0xb3,
-    0x02,
-    0xd1,
-    0xe2,
-    0x28,
-    0x1b,
-    0x62,
-    0xd8,
-    0x83,
-    0x8b,
-    0xc6,
-    0xcd,
-    0x84,
-    0x2a,
-    0x47,
-    0x6d,
-    0x74,
-    0x27,
-    0x2a,
-    0x7f,
-    0x51,
-    0x9b,
-    0xed,
-    0x17,
-    0x2b,
-    0x64,
-    0xcc,
-    0x0d,
-    0xce,
-    0x30,
-    0x8a,
-    0xad,
-    0xa1,
-    0xd8,
-    0x6d,
-    0xb0,
-    0xce,
-    0xf0,
-    0x8b,
-    0x6c,
-    0xa3,
-    0x9c,
-    0x44,
-    0x47,
-    0x39,
-    0xa4,
-    0x10,
-    0x71,
-    0x53,
-    0xcb,
-    0x7b,
-    0xd3,
-    0x88,
-    0x5d,
-    0x6d,
-    0x42,
-    0xa5,
-    0x08,
-    0xaf,
-    0xf9,
-    0x4d,
-    0xec,
-    0xab,
-    0x46,
-    0xe2,
-    0xf5,
-    0x73,
-    0x83,
-    0xa9,
-    0x69,
-    0x05,
-    0x48,
-    0x28,
-    0xbd,
-    0xce,
-    0xdf,
-    0xd3,
-    0xad,
-    0x6c,
-    0xf8,
-    0xe8,
-    0x8c,
-    0xb8,
-    0x9e,
-    0x98,
-    0xd8,
-    0x04,
-    0x6a,
-    0x67,
-    0x11,
-    0xa1,
-    0xf7,
-    0xd5,
-    0xcb,
-    0xa5,
-    0x95,
-    0x3e,
-    0x03,
-    0xea,
-    0x42,
-    0xff,
-    0xaf,
-    0x5a,
-    0xd6,
-    0xda,
-    0x98,
-    0x6a,
-    0x7d,
-    0x9c,
-    0x6c,
-    0xe5,
-    0x6a,
-    0xfc,
-    0x0f,
-    0xeb,
-    0xca,
-    0xc7,
-    0x33,
-    0x39,
-    0xf7,
-    0x3a,
-    0x28,
-    0xab,
-    0xef,
-    0xaf,
-    0xf5,
-    0xfe,
-    0x04,
-    0x7d,
-    0xa7,
-    0xdb,
-    0xd5,
-    0x19,
-    0xe9,
-    0x11,
-    0x7c,
-    0x81,
-    0xd5,
-    0x23,
-    0x09,
-    0xda,
-    0x0a,
-    0x02,
-    0x30,
-    0x57,
-    0xff,
-    0x1b,
-    0x3e,
-    0x5e,
-    0x97,
-    0x94,
-    0x51,
-    0xe6,
-    0xf5,
-    0xd3,
-    0xc9,
-    0x24,
-    0x91,
-    0x41,
-    0xfa,
-    0x66,
-    0x8b,
-    0x4d,
-    0x23,
-    0x3f,
-    0x40,
-    0xb3,
-    0xa4,
-    0xe4,
-    0x1c,
-    0xfe,
-    0x6b,
-    0xd6,
-    0xaf,
-    0x4b,
-    0xb0,
-    0xc1,
-    0x02,
-    0x51,
-    0xe2,
-    0xa4,
-    0x2b,
-    0x9e,
-    0xe1,
-    0x33,
-    0x1f,
-    0x23,
-    0x6d,
-    0x7a,
-    0xc8,
-    0xf3,
-    0xdf,
-    0xc2,
-    0x57,
-    0x48,
-    0x16,
-    0xb8,
-    0xdc,
-    0xc7,
-    0xb5,
-    0xcc,
-    0x13,
-    0x05,
-    0x8c,
-    0xd8,
-    0x81,
-    0x49,
-    0x53,
-    0x02,
-    0xc0,
-    0x94,
-    0x9e,
-    0xe3,
-    0x18,
-    0xde,
-    0x0d,
-    0xe9,
-    0x4f,
-    0xa3,
-    0xc3,
-    0xf9,
-    0xc1,
-    0x9e,
-    0x1a,
-    0x59,
-    0xb3,
-    0xd5,
-    0x95,
-    0xce,
-    0xe4,
-    0xd5,
-    0x17,
-    0x01,
-    0x65,
-    0x3f,
-    0x52,
-    0x27,
-    0xab,
-    0x83,
-    0x81,
-    0xe1,
-    0xe3,
-    0xec,
-    0x5a,
-    0x61,
-    0x85,
-    0xdd,
-    0x3e,
-    0xcf,
-    0x2c,
-    0x5a,
-    0xb4,
-    0xeb,
-    0xa5,
-    0xc9,
-    0x15,
-    0xf3,
-    0x45,
-    0xfa,
-    0x89,
-    0xc7,
-    0x80,
-    0x66,
-    0x31,
-    0x4b,
-    0xb8,
-    0xb4,
-    0xa6,
-    0x0d,
-    0x53,
-    0x82,
-    0xa3,
-    0x28,
-    0x10,
-    0x61,
-    0xfe,
-    0x68,
-    0x9b,
-    0x21,
-    0xdd,
-    0xae,
-    0x5f,
-    0x50,
-    0x26,
-    0x96,
-    0x9b,
-    0xfd,
-    0x37,
-    0x58,
-    0xb8,
-    0xc1,
-    0xd8,
-    0xec,
-    0xda,
-    0x01,
-    0x6d,
-    0x72,
-    0xb5,
-    0x6d,
-    0x71,
-    0xd0,
-    0xa2,
-    0xcc,
-    0x1f,
-    0x9d,
-    0xf1,
-    0xfc,
-    0x72,
-    0x3e,
-    0x81,
-    0x34,
-    0x50,
-    0x4e,
-    0x8f,
-    0x8d,
-    0x02,
-    0x44,
-    0xcc,
-    0xc1,
-    0xe8,
-    0x4f,
-    0xb2,
-    0x32,
-    0x6b,
-    0x85,
-    0x17,
-    0x2e,
-    0x32,
-    0x3d,
-    0x03,
-    0x71,
-    0x99,
-    0xb9,
-    0xbf,
-    0xeb,
-    0x5f,
-    0x09,
-    0x2e,
-    0xc4,
-    0x9e,
-    0x2b,
-    0x60,
-    0x9e,
-    0x01,
-    0x77,
-    0x65,
-    0x1a,
-    0x31,
-    0x3b,
-    0x5f,
-    0x9d,
-    0x90,
-    0xa2,
-    0xdb,
-    0x54,
-    0x2a,
-    0xda,
-    0x62,
-    0x75,
-    0xe9,
-    0x75,
-    0x4a,
-    0xc8,
-    0x08,
-    0x10,
-    0xd2,
-    0x67,
-    0xc9,
-    0x33,
-    0x6f,
-    0xc2,
-    0x6b,
-    0x79,
-    0x60,
-    0xe5,
-    0x56,
-    0xf1,
-    0x88,
-    0xfe,
-    0x9a,
-    0xc3,
-    0x7d,
-    0x19,
-    0x97,
-    0x17,
-    0xdd,
-    0x2f,
-    0xfd,
-    0x32,
-    0xe1,
-    0x5f,
-    0xf8,
-    0xe2,
-    0x34,
-    0x7b,
-    0xa4,
-    0x1d,
-    0x05,
-    0xc6,
-    0xc7,
-    0xe5,
-    0x5b,
-    0xfc,
-    0xbf,
-    0x6e,
-    0xa8,
-    0x93,
-    0xb9,
-    0x83,
-    0xa2,
-    0x41,
-    0x24,
-    0x26,
-    0x4e,
-    0xbe,
-    0x66,
-    0x77,
-    0x5d,
-    0xcb,
-    0xcd,
-    0xd7,
-    0xbc,
-    0x73,
-    0xc8,
-    0x4c,
-    0x67,
-    0x91,
-    0x57,
-    0x27,
-    0x7e,
-    0x92,
-    0xc0,
-    0xe5,
-    0x9a,
-    0x7c,
-    0x84,
-    0x54,
-    0x61,
-    0x2f,
-    0x91,
-    0xf7,
-    0x58,
-    0xec,
-    0xb9,
-    0xaa,
-    0xf9,
-    0x13,
-    0x63,
-    0x89,
-    0x06,
-    0x31,
-    0x80,
-    0x0f,
-    0x1c,
-    0x39,
-    0xc1,
-    0x7b,
-    0x8b,
-    0x12,
-    0x07,
-    0x78,
-    0x65,
-    0x52,
-    0x1c,
-    0xfc,
-    0xd5,
-    0x4a,
-    0xa0,
-    0x71,
-    0xb2,
-    0x42,
-    0x46,
-    0x13,
-    0x54,
-    0x05,
-    0x40,
-    0x99,
-    0xa7,
-    0xa1,
-    0xf7,
-    0x17,
-    0x7d,
-    0x68,
-    0x00,
-    0x23,
-    0x29,
-    0x3a,
-    0x4b,
-    0x37,
-    0x49,
-    0x07,
-    0x9e,
-    0x56,
-    0xe3,
-    0x8f,
-    0x42,
-    0xf2,
-    0xb4,
-    0x6c,
-    0xfd,
-    0x0e,
-    0xc4,
-    0x53,
-    0x40,
-    0xa0,
-    0x3e,
-    0x97,
-    0xa0,
-    0x39,
-    0x7f,
-    0xee,
-    0x8a,
-    0xe7,
-    0x6d,
-    0x78,
-    0x33,
-    0x5b,
-    0x0a,
-    0xfd,
-    0xcf,
-    0x47,
-    0x49,
-    0x77,
-    0x03,
-    0x0a,
-    0x20,
-    0xd0,
-    0x9c,
-    0x8f,
-    0xde,
-    0xec,
-    0x81,
-    0x72,
-    0xbf,
-    0xea,
-    0xe6,
-    0x65,
-    0xbd,
-    0xa7,
-    0xc3,
-    0xd3,
-    0xaa,
-    0x84,
-    0x85,
-    0xc3,
-    0x7c,
-    0x6a,
-    0x03,
-    0xfe,
-    0xe8,
-    0x0b,
-    0xb3,
-    0x74,
-    0x32,
-    0x6a,
-    0x1e,
-    0xdc,
-    0x43,
-    0x9d,
-    0x91,
-    0x9b,
-    0xfc,
-    0xd1,
-    0x16,
-    0xe7,
-    0xca,
-    0x90,
-    0xa2,
-    0x2c,
-    0x7a,
-    0x3f,
-    0x90,
-    0xae,
-    0x4f,
-    0xeb,
-    0x4e,
-    0x71,
-    0x52,
-    0x45,
-    0x57,
-    0x56,
-    0xea,
-    0xea,
-    0x61,
-    0x86,
-    0xac,
-    0xe8,
-    0xd7,
-    0x13,
-    0x74,
-    0x7e,
-    0x89,
-    0xdd,
-    0xb5,
-    0x24,
-    0xa3,
-    0xb3,
-    0x0d,
-    0xcb,
-    0xdb,
-    0xbb,
-    0x1d,
-    0x66,
-    0xef,
-    0x14,
-    0x97,
-    0xa9,
-    0x4f,
-    0xb9,
-    0x98,
-    0x11,
-    0x16,
-    0xa9,
-    0x39,
-    0x24,
-    0x3f,
-    0x45,
-    0x61,
-    0xfa,
-    0x16,
-    0xf9,
-    0xdd,
-    0xfc,
-    0xec,
-    0x1e,
-    0xb2,
-    0xec,
-    0x0f,
-    0x1f,
-    0xb1,
-    0x26,
-    0xfa,
-    0xdb,
-    0x4d,
-    0x25,
-    0xc8,
-    0x4b,
-    0xaa,
-    0x48,
-    0xef,
-    0x65,
-    0xf6,
-    0xd6,
-    0x2a,
-    0x40,
-    0xfc,
-    0x41,
-    0xb7,
-    0x78,
-    0xf6,
-    0xa7,
-    0xc3,
-    0xd4,
-    0xa3,
-    0x9e,
-    0x23,
-    0x26,
-    0x9a,
-    0x31,
-    0x44,
-    0x73,
-    0xde,
-    0x26,
-    0x65,
-    0x54,
-    0xb2,
-    0x83,
-    0x03,
-    0x9c,
-    0xaf,
-    0x50,
-    0x95,
-    0x3b,
-    0x13,
-    0x9d,
-    0x7a,
-    0x63,
-    0x5c,
-    0xc7,
-    0x30,
-    0xe9,
-    0x16,
-    0xf8,
-    0xc6,
-    0xed,
-    0xf1,
-    0xed,
-    0x94,
-    0xbd,
-    0x16,
-    0xfc,
-    0x29,
-    0xf7,
-    0xbb,
-    0x55,
-    0x85,
-    0xee,
-    0xf5,
-    0x88,
-    0x89,
-    0x4f,
-    0xce,
-    0x47,
-    0xab,
-    0x05,
-    0x98,
-    0x6d,
-    0xee,
-    0x59,
-    0x81,
-    0x40,
-    0x12,
-    0x5e,
-    0x67,
-    0xf3,
-    0x07,
-    0x8c,
-    0xed,
-    0x70,
-    0xa8,
-    0xab,
-    0xce,
-    0x54,
-    0xa6,
-    0xf3,
-    0x71,
-    0x3a,
-    0xc2,
-    0x71,
-    0xbe,
-    0x3c,
-    0x40,
-    0xac,
-    0x31,
-    0xb7,
-    0x98,
-    0x89,
-    0x2c,
-    0x4f,
-    0x6e,
-    0x6c,
-    0x92,
-    0x33,
-    0xc4,
-    0xa0,
-    0x91,
-    0xa2,
-    0x6f,
-    0xf9,
-    0xbf,
-    0xaf,
-    0xc7,
-    0xb7,
-    0x69,
-    0x41,
-    0xa3,
-    0xae,
-    0x27,
-    0x5d,
-    0x85,
-    0xa4,
-    0xb4,
-    0xa8,
-    0x11,
-    0xfb,
-    0xfd,
-    0x27,
-    0xc4,
-    0x90,
-    0x78,
-    0x4a,
-    0xe2,
-    0xe2,
-    0xb7,
-    0x29,
-    0xb0,
-    0x77,
-    0x3d,
-    0x0d,
-    0xe4,
-    0x7b,
-    0x90,
-    0x32,
-    0x5a,
-    0xab,
-    0x90,
-    0xcb,
-    0x08,
-    0x71,
-    0x06,
-    0x47,
-    0x34,
-    0x50,
-    0x80,
-    0xd3,
-    0xe4,
-    0x83,
-    0x5d,
-    0x20,
-    0x97,
-    0xe1,
-    0x24,
-    0x66,
-    0x32,
-    0x04,
-    0x1a,
-    0xa9,
-    0x3d,
-    0xaa,
-    0x13,
-    0x3b,
-    0x4f,
-    0x5b,
-    0x88,
-    0x82,
-    0xc7,
-    0x4d,
-    0xea,
-    0xfb,
-    0xbd,
-    0x84,
-    0x36,
-    0x7f,
-    0x39,
-    0x3d,
-    0xca,
-    0xc5,
-    0xa2,
-    0x8d,
-    0x77,
-    0x29,
-    0x79,
-    0x46,
-    0xd7,
-    0xab,
-    0x47,
-    0x1a,
-    0xe0,
-    0x3b,
-    0xd3,
-    0x03,
-    0xba,
-    0x34,
-    0x99,
-    0xe2,
-    0xce,
-    0x26,
-    0x78,
-    0x66,
-    0x20,
-    0xd8,
-    0xab,
-    0x2f,
-    0xde,
-    0x8d,
-    0xfa,
-    0x33,
-    0x39,
-    0x87,
-    0x31,
-    0x61,
-    0x73,
-    0xca,
-    0xd2,
-    0x85,
-    0x39,
-    0x22,
-    0x07,
-    0x6c,
-    0x34,
-    0x67,
-    0xda,
-    0x48,
-    0xdb,
-    0x00,
-    0xa8,
-    0x55,
-    0x8b,
-    0xa6,
-    0xd3,
-    0xbd,
-    0xd9,
-    0x6a,
-    0xb8,
-    0xba,
-    0x27,
-    0xfa,
-    0xe1,
-    0xfa,
-    0x75,
-    0x20,
-    0x7b,
-    0x47,
-    0x7a,
-    0x8b,
-    0x0a,
-    0x67,
-    0xf3,
-    0xd2,
-    0x5b,
-    0x41,
-    0x3c,
-    0xb6,
-    0xba,
-    0x42,
-    0x1d,
-    0xa8,
-    0x66,
-    0xff,
-    0xe6,
-    0x8b,
-    0x42,
-    0x1c,
-    0xbe,
-    0xba,
-    0xcd,
-    0x6c,
-    0x38,
-    0x4d,
-    0x54,
-    0x59,
-    0x27,
-    0x98,
-    0x67,
-    0x87,
-    0xb4,
-    0xf5,
-    0x89,
-    0xb4,
-    0xad,
-    0xc4,
-    0x2b,
-    0xe3,
-    0x20,
-    0xaf,
-    0xdc,
-    0xb9,
-    0x29,
-    0x33,
-    0xba,
-    0x27,
-    0x08,
-    0x5b,
-    0x2c,
-    0x49,
-    0x76,
-    0xcf,
-    0xd3,
-    0x8e,
-    0x3a,
-    0x0e,
-    0xbd,
-    0x1a,
-    0xf7,
-    0xf8,
-    0xdc,
-    0x68,
-    0x48,
-    0x8f,
-    0xb7,
-    0x34,
-    0x0e,
-    0xfe,
-    0x60,
-    0x98,
-    0x09,
-    0xdb,
-    0xa6,
-    0x75,
-    0xa6,
-    0xa9,
-    0x8b,
-    0x14,
-    0x18,
-    0xa1,
-    0xf9,
-    0x0d,
-    0xaa,
-    0xb2,
-    0xb0,
-    0x68,
-    0x54,
-    0xc6,
-    0x83,
-    0x03,
-    0x8c,
-    0x47,
-    0xc4,
-    0x33,
-    0x5e,
-    0xe1,
-    0xfd,
-    0xae,
-    0xbf,
-    0x8a,
-    0xe0,
-    0xa9,
-    0x1f,
-    0xc0,
-    0x81,
-    0x3d,
-    0x3d,
-    0x12,
-    0xc3,
-    0x0f,
-    0x3f,
-    0xe2,
-    0x10,
-    0x30,
-    0x02,
-    0x69,
-    0x4e,
-    0x42,
-    0xaf,
-    0xfc,
-    0x0e,
-    0xdd,
-    0x8f,
-    0x8d,
-    0x06,
-    0x31,
-    0x20,
-    0x74,
-    0xc1,
-    0xec,
-    0x68,
-    0x70,
-    0x95,
-    0x5e,
-    0x89,
-    0xe8,
-    0xd6,
-    0xda,
-    0x96,
-    0x77,
-    0x49,
-    0x60,
-    0xa5,
-    0xa8,
-    0xdb,
-    0x7a,
-    0x25,
-    0xfe,
-    0x93,
-    0x64,
-    0x72,
-    0x38,
-    0xc6,
-    0x6f,
-    0xa7,
-    0xd2,
-    0x8a,
-    0xa7,
-    0xb4,
-    0xcf,
-    0x6c,
-    0xb4,
-    0xb0,
-    0xb6,
-    0x66,
-    0xfe,
-    0x70,
-    0xdb,
-    0x0b,
-    0x15,
-    0x58,
-    0xdf,
-    0x05,
-    0x4f,
-    0x71,
-    0x7a,
-    0xc1,
-    0xb3,
-    0xbc,
-    0x78,
-    0x69,
-    0x15,
-    0xc6,
-    0x02,
-    0x13,
-    0x83,
-    0x7d,
-    0x1f,
-    0x38,
-    0xe0,
-    0x42,
-    0x7b,
-    0x67,
-    0xcf,
-    0x3f,
-    0x66,
-    0x3a,
-    0xd3,
-    0xfb,
-    0x1f,
-    0x8a,
-    0xb4,
-    0x2b,
-    0x53,
-    0xdf,
-    0x24,
-    0xcc,
-    0xe1,
-    0x2a,
-    0xa2,
-    0x6e,
-    0xe0,
-    0xb7,
-    0x9f,
-    0xd3,
-    0xe3,
-    0x5d,
-    0xdf,
-    0xb8,
-    0x7b,
-    0xf8,
-    0x23,
-    0xf3,
-    0xfe,
-    0x19,
-    0x05,
-    0xbe,
-    0x87,
-    0xfb,
-    0x23,
-    0x53,
-    0x3e,
-    0xb9,
-    0x7f,
-    0xb9,
-    0xda,
-    0xbf,
-    0x26,
-    0xdd,
-    0x64,
-    0x7e,
-    0x10,
-    0xe4,
-    0x3d,
-    0x65,
-    0x48,
-    0xc0,
-    0x62,
-    0x0c,
-    0x4c,
-    0x01,
-    0xef,
-    0xb2,
-    0xb7,
-    0xee,
-    0xe2,
-    0xe9,
-    0x1d,
-    0xd5,
-    0x22,
-    0x90,
-    0x37,
-    0x9f,
-    0xc0,
-    0x02,
-    0x40,
-    0xa7,
-    0x7c,
-    0x8d,
-    0x9e,
-    0xcd,
-    0x8b,
-    0x26,
-    0xc5,
-    0xc6,
-    0x97,
-    0x5a,
-    0x59,
-    0xb6,
-    0x08,
-    0x88,
-    0x92,
-    0x00,
-    0x82,
-    0x4e,
-    0xe5,
-    0x5c,
-    0xae,
-    0x41,
-    0xe1,
-    0x2b,
-    0x3e,
-    0xe1,
-    0x57,
-    0x08,
-    0x2b,
-    0xcc,
-    0xbd,
-    0xa0,
-    0x41,
-    0x31,
-    0xd4,
-    0xc3,
-    0xde,
-    0x88,
-    0x89,
-    0xbb,
-    0xf7,
-    0x80,
-    0x19,
-    0xdc,
-    0x5b,
-    0x39,
-    0x79,
-    0x5c,
-    0x3c,
-    0xb4,
-    0xf5,
-    0x65,
-    0xeb,
-    0x88,
-    0x17,
-    0x69,
-    0xe3,
-    0xd6,
-    0xca,
-    0xb6,
-    0x09,
-    0x7e,
-    0xbf,
-    0x4a,
-    0x32,
-    0x93,
-    0x10,
-    0xe8,
-    0xe6,
-    0x0d,
-    0x24,
-    0x6b,
-    0x64,
-    0xbe,
-    0xd2,
-    0x5b,
-    0xe5,
-    0x88,
-    0xc9,
-    0xbe,
-    0x25,
-    0xcc,
-    0x2f,
-    0x30,
-    0x20,
-    0x25,
-    0x88,
-    0x36,
-    0x19,
-    0x57,
-    0xda,
-    0xd0,
-    0xe1,
-    0x82,
-    0x0e,
-    0x4d,
-    0x56,
-    0x9c,
-    0x9a,
-    0x63,
-    0x2a,
-    0x1d,
-    0x5d,
-    0x7f,
-    0xe6,
-    0xfc,
-    0xca,
-    0x5a,
-    0x2e,
-    0xdb,
-    0x49,
-    0xcd,
-    0x46,
-    0x7f,
-    0xda,
-    0xe6,
-    0xd5,
-    0x82,
-    0xfc,
-    0x3b,
-    0xe9,
-    0x4c,
-    0xcd,
-    0x7e,
-    0x3c,
-    0x3f,
-    0x72,
-    0x52,
-    0xb6,
-    0x32,
-    0xb9,
-    0x5d,
-    0x32,
-    0x21,
-    0xfd,
-    0x9f,
-    0x85,
-    0x22,
-    0x4b,
-    0x02,
-    0xbc,
-    0x9b,
-    0xc2,
-    0x32,
-    0xa6,
-    0xb3,
-    0x40,
-    0xae,
-    0x93,
-    0x06,
-    0x3b,
-    0x20,
-    0x5a,
-    0x9d,
-    0xec,
-    0xea,
-    0xa1,
-    0x1d,
-    0xb3,
-    0x01,
-    0x58,
-    0x3e,
-    0xb7,
-    0xfe,
-    0x87,
-    0x7f,
-    0xcd,
-    0x72,
-    0x4a,
-    0x19,
-    0x9b,
-    0x7a,
-    0x19,
-    0x31,
-    0xfd,
-    0x94,
-    0x4d,
-    0x51,
-    0xa7,
-    0xb1,
-    0xe0,
-    0x19,
-    0x0c,
-    0x8c,
-    0x75,
-    0x32,
-    0x7f,
-    0x39,
-    0x98,
-    0x84,
-    0x98,
-    0x01,
-    0x46,
-    0xa9,
-    0xda,
-    0x6d,
-    0xb0,
-    0xa1,
-    0x92,
-    0xa1,
-    0x3c,
-    0xc7,
-    0x02,
-    0xeb,
-    0xcd,
-    0x03,
-    0xbf,
-    0x9c,
-    0x44,
-    0x42,
-    0x58,
-    0x17,
-    0x47,
-    0x23,
-    0x38,
-    0x27,
-    0x41,
-    0xf3,
-    0xce,
-    0x96,
-    0xa9,
-    0xdc,
-    0xeb,
-    0xfb,
-    0x88,
-    0x59,
-    0x6b,
-    0xd3,
-    0x35,
-    0xed,
-    0x17,
-    0xd3,
-    0x63,
-    0x15,
-    0xca,
-    0x7d,
-    0x5e,
-    0x7b,
-    0xd3,
-    0xf2,
-    0x92,
-    0x6c,
-    0x9b,
-    0x07,
-    0x4d,
-    0x8c,
-    0x88,
-    0x9a,
-    0xc6,
-    0xc9,
-    0x20,
-    0x27,
-    0x5d,
-    0x8d,
-    0x72,
-    0x96,
-    0x24,
-    0x38,
-    0xb1,
-    0x57,
-    0x9f,
-    0xcd,
-    0x23,
-    0xb1,
-    0xc8,
-    0xeb,
-    0x39,
-    0x57,
-    0x56,
-    0x00,
-    0x00,
-    0x3d,
-    0x3f,
-    0xb9,
-    0xb8,
-    0xa9,
-    0x7c,
-    0xbd,
-    0xc1,
-    0x8d,
-    0x0c,
-    0x9a,
-    0xbf,
-    0x14,
-    0x3b,
-    0xff,
-    0xf6,
-    0x7b,
-    0x24,
-    0x2d,
-    0xf6,
-    0x22,
-    0x75,
-    0xa8,
-    0x7d,
-    0xe3,
-    0x72,
-    0x32,
-    0x99,
-    0xa2,
-    0x3d,
-    0xf9,
-    0x0d,
-    0x25,
-    0x54,
-    0x10,
-    0xf6,
-    0x26,
-    0x5b,
-    0x1c,
-    0xae,
-    0xa7,
-    0x1c,
-    0x50,
-    0xf1,
-    0x86,
-    0xcc,
-    0x9b,
-    0x3e,
-    0x51,
-    0x8f,
-    0x1f,
-    0x80,
-    0x5b,
-    0x3f,
-    0xe6,
-    0xee,
-    0x10,
-    0x69,
-    0xd0,
-    0x30,
-    0x85,
-    0x99,
-    0xd0,
-    0xc3,
-    0x54,
-    0xd8,
-    0x58,
-    0x9e,
-    0xa6,
-    0x72,
-    0x12,
-    0x16,
-    0x91,
-    0xfd,
-    0xd1,
-    0xff,
-    0xa5,
-    0x96,
-    0xc7,
-    0x14,
-    0xc1,
-    0x6e,
-    0xf8,
-    0x99,
-    0x2b,
-    0x86,
-    0xee,
-    0x3e,
-    0xe0,
-    0xb6,
-    0xaf,
-    0x47,
-    0x29,
-    0xf4,
-    0xec,
-    0xea,
-    0x6f,
-    0xd3,
-    0x7b,
-    0xf8,
-    0x50,
-    0x4a,
-    0x08,
-    0xc0,
-    0xf3,
-    0xb7,
-    0x07,
-    0x31,
-    0x98,
-    0x23,
-    0xec,
-    0x3e,
-    0x73,
-    0xc8,
-    0x9f,
-    0x87,
-    0xba,
-    0xd0,
-    0x2a,
-    0x35,
-    0xfd,
-    0x60,
-    0xb5,
-    0x25,
-    0xb6,
-    0xd5,
-    0xb5,
-    0x4a,
-    0x21,
-    0x4e,
-    0x60,
-    0x4c,
-    0x4d,
-    0x6a,
-    0x64,
-    0x75,
-    0x73,
-    0x53,
-    0xd8,
-    0xce,
-    0x88,
-    0xfb,
-    0x73,
-    0x85,
-    0x0e,
-    0xa5,
-    0xfc,
-    0x92,
-    0x2f,
-    0xa8,
-    0x01,
-    0x9a,
-    0x0c,
-    0x6f,
-    0xcc,
-    0x14,
-    0x53,
-    0xc5,
-    0x93,
-    0xaa,
-    0x0f,
-    0x4f,
-    0xef,
-    0xe2,
-    0xc5,
-    0x5a,
-    0x8f,
-    0xfd,
-    0xbc,
-    0xd8,
-    0x2e,
-    0x20,
-    0x9c,
-    0xa4,
-    0xc2,
-    0xb1,
-    0x3b,
-    0x0e,
-    0xf7,
-    0x04,
-    0xb3,
-    0x93,
-    0xdb,
-    0x37,
-    0xb8,
-    0xec,
-    0xdb,
-    0x5a,
-    0x28,
-    0x4b,
-    0xee,
-    0xd3,
-    0xe4,
-    0xe1,
-    0x10,
-    0x01,
-    0xdf,
-    0xa3,
-    0xf2,
-    0x20,
-    0x74,
-    0x4e,
-    0xf0,
-    0x6d,
-    0xfd,
-    0xa8,
-    0x43,
-    0x8a,
-    0xa1,
-    0x09,
-    0x78,
-    0x23,
-    0x6d,
-    0x1b,
-    0x20,
-    0xd2,
-    0xa6,
-    0xde,
-    0xca,
-    0x40,
-    0x5e,
-    0xef,
-    0x2e,
-    0x8e,
-    0x46,
-    0x09,
-    0xab,
-    0xf3,
-    0xc3,
-    0xcc,
-    0xf4,
-    0xa6,
-    0x44,
-    0xbd,
-    0x06,
-    0xfe,
-    0xd2,
-    0x8f,
-    0x5d,
-    0xd7,
-    0xe9,
-    0xa1,
-    0x67,
-    0x39,
-    0x86,
-    0xc7,
-    0x39,
-    0x34,
-    0x81,
-    0x4d,
-    0x81,
-    0x0e,
-    0x1d,
-    0x39,
-    0xbb,
-    0xa1,
-    0xde,
-    0xd1,
-    0xa8,
-    0xfe,
-    0x9a,
-    0x5d,
-    0xfc,
-    0x56,
-    0xd3,
-    0x2e,
-    0x57,
-    0x1b,
-    0x44,
-    0xdf,
-    0x77,
-    0x62,
-    0xba,
-    0xdb,
-    0xac,
-    0x8c,
-    0x25,
-    0x1f,
-    0x8c,
-    0x25,
-    0xef,
-    0x42,
-    0xe7,
-    0x0c,
-    0x8c,
-    0xb2,
-    0xfe,
-    0xd4,
-    0x53,
-    0x40,
-    0xef,
-    0x6b,
-    0x8c,
-    0xdf,
-    0x74,
-    0xf9,
-    0xca,
-    0xa8,
-    0xcd,
-    0x0b,
-    0x7b,
-    0x22,
-    0xfb,
-    0xf1,
-    0xbd,
-    0xc1,
-    0x2f,
-    0x64,
-    0x73,
-    0xac,
-    0x82,
-    0x6d,
-    0x98,
-    0xc3,
-    0xe6,
-    0x82,
-    0xd4,
-    0xe1,
-    0x5d,
-    0xf1,
-    0x4d,
-    0x5e,
-    0x69,
-    0x82,
-    0xc0,
-    0xd9,
-    0xc3,
-    0x57,
-    0xd0,
-    0x34,
-    0x4f,
-    0x18,
-    0x9e,
-    0xdf,
-    0x50,
-    0x4d,
-    0x99,
-    0x5a,
-    0xd9,
-    0x0b,
-    0x98,
-    0xf5,
-    0x84,
-    0xd3,
-    0x26,
-    0xdb,
-    0x65,
-    0xb7,
-    0x1c,
-    0x4e,
-    0x41,
-    0xbe,
-    0x76,
-    0x34,
-    0xfc,
-    0x8a,
-    0x5f,
-    0xd3,
-    0x51,
-    0x38,
-    0x8e,
-    0xd9,
-    0xc6,
-    0x88,
-    0xd5,
-    0x9f,
-    0xde,
-    0x3e,
-    0xf7,
-    0xae,
-    0x90,
-    0xc8,
-    0xbb,
-    0x83,
-    0xf8,
-    0x20,
-    0x3e,
-    0x8f,
-    0x4d,
-    0xf4,
-    0x8d,
-    0x82,
-    0x13,
-    0x05,
-    0x73,
-    0xc9,
-    0x91,
-    0xcd,
-    0x90,
-    0x55,
-    0x86,
-    0x64,
-    0xab,
-    0x9f,
-    0x18,
-    0xa4,
-    0x4a,
-    0xe9,
-    0x0d,
-    0x8c,
-    0x7f,
-    0xc6,
-    0x3d,
-    0xe2,
-    0x04,
-    0xdc,
-    0x47,
-    0x1c,
-    0x8a,
-    0xe9,
-    0x84,
-    0x81,
-    0x4f,
-    0x04,
-    0x39,
-    0x8c,
-    0xef,
-    0x26,
-    0x11,
-    0x91,
-    0x7c,
-    0xe8,
-    0xca,
-    0xa2,
-    0xd0,
-    0x8e,
-    0x2e,
-    0xb4,
-    0x22,
-    0x45,
-    0x45,
-    0xfe,
-    0xd8,
-    0xa9,
-    0xc9,
-    0xa2,
-    0x9c,
-    0x8a,
-    0xda,
-    0x8f,
-    0xb2,
-    0xf0,
-    0xf3,
-    0xa6,
-    0x89,
-    0x5c,
-    0x1d,
-    0x1c,
-    0x90,
-    0x51,
-    0x62,
-    0x1f,
-    0x4a,
-    0x13,
-    0x85,
-    0xbc,
-    0xa5,
-    0xaf,
-    0xf0,
-    0x00,
-    0x88,
-    0x3b,
-    0xee,
-    0x5d,
-    0xab,
-    0x5f,
-    0x1a,
-    0x50,
-    0xab,
-    0x15,
-    0x18,
-    0x41,
-    0x5e,
-    0xac,
-    0x82,
-    0xab,
-    0x64,
-    0x13,
-    0x25,
-    0x7c,
-    0xfe,
-    0x54,
-    0x6e,
-    0xbf,
-    0x23,
-    0x5f,
-    0x1f,
-    0x78,
-    0xd1,
-    0x09,
-    0x46,
-    0xcf,
-    0xa2,
-    0x54,
-    0x70,
-    0x71,
-    0x9f,
-    0xf1,
-    0x1a,
-    0x34,
-    0x58,
-    0x03,
-    0x68,
-    0xfa,
-    0x35,
-    0x26,
-    0x1a,
-    0xd7,
-    0x07,
-    0xb0,
-    0xbb,
-    0x76,
-    0xe2,
-    0x37,
-    0x1b,
-    0xb8,
-    0x2f,
-    0x53,
-    0x00,
-    0x9f,
-    0xfd,
-    0xa4,
-    0x19,
-    0x6b,
-    0x98,
-    0x17,
-    0x33,
-    0x02,
-    0x5d,
-    0x66,
-    0xaf,
-    0x95,
-    0xcc,
-    0xde,
-    0x34,
-    0x81,
-    0xdf,
-    0x65,
-    0xa1,
-    0x73,
-    0x9a,
-    0xbb,
-    0x46,
-    0xd0,
-    0xe4,
-    0x00,
-    0x53,
-    0x54,
-    0x95,
-    0x77,
-    0x90,
-    0xf9,
-    0xd0,
-    0x89,
-    0x4f,
-    0x1a,
-    0x93,
-    0x0d,
-    0xa0,
-    0xd8,
-    0x8c,
-    0xc6,
-    0xc3,
-    0xbd,
-    0x2f,
-    0x2d,
-    0xe3,
-    0x9f,
-    0x05,
-    0x71,
-    0x01,
-    0xc7,
-    0x47,
-    0xbd,
-    0x2e,
-    0x53,
-    0xab,
-    0xb9,
-    0xfd,
-    0xd9,
-    0x7e,
-    0x53,
-    0x38,
-    0x4d,
-    0xf3,
-    0xbf,
-    0xd2,
-    0x25,
-    0xbb,
-    0xbc,
-    0x1d,
-    0xba,
-    0xd5,
-    0x1a,
-    0x3d,
-    0xf2,
-    0xa8,
-    0x79,
-    0xdd,
-    0x1c,
-    0x4f,
-    0x53,
-    0x20,
-    0x1b,
-    0x34,
-    0x3d,
-    0xda,
-    0xc7,
-    0xe0,
-    0x69,
-    0x01,
-    0x90,
-    0x11,
-    0x70,
-    0x5e,
-    0x65,
-    0x0d,
-    0x4e,
-    0x88,
-    0xd4,
-    0x37,
-    0xae,
-    0x13,
-    0x72,
-    0xe0,
-    0x69,
-    0x05,
-    0x7d,
-    0x5f,
-    0x49,
-    0x89,
-    0xc0,
-    0x64,
-    0x12,
-    0xe8,
-    0xb7,
-    0x89,
-    0xc3,
-    0xb4,
-    0xf4,
-    0x2a,
-    0x19,
-    0x47,
-    0xc1,
-    0x77,
-    0x55,
-    0x6c,
-    0x07,
-    0xc7,
-    0x3f,
-    0x5b,
-    0x6e,
-    0x30,
-    0x6b,
-    0xeb,
-    0xc6,
-    0x54,
-    0xbb,
-    0x03,
-    0xa6,
-    0x7d,
-    0x25,
-    0x51,
-    0x52,
-    0xed,
-    0xb6,
-    0x3f,
-    0xe2,
-    0x6f,
-    0xd7,
-    0x23,
-    0xa1,
-    0x32,
-    0xd0,
-    0xb6,
-    0xb4,
-    0xd7,
-    0x8a,
-    0xc8,
-    0xfc,
-    0xc9,
-    0x99,
-    0x32,
-    0x3d,
-    0xcd,
-    0x79,
-    0x0b,
-    0x7f,
-    0xda,
-    0x18,
-    0x1f,
-    0xb4,
-    0x2a,
-    0x95,
-    0x9c,
-    0x9c,
-    0x91,
-    0x48,
-    0x0f,
-    0xe6,
-    0x0e,
-    0x02,
-    0x8f,
-    0x98,
-    0xa0,
-    0x96,
-    0x38,
-    0xb0,
-    0x5a,
-    0x98,
-    0xdc,
-    0x0b,
-    0xba,
-    0x64,
-    0xf4,
-    0x87,
-    0x37,
-    0x62,
-    0xdd,
-    0x65,
-    0x19,
-    0x89,
-    0x41,
-    0xf1,
-    0x8d,
-    0x22,
-    0xd3,
-    0x64,
-    0xf9,
-    0xcf,
-    0x3f,
-    0x09,
-    0x8d,
-    0xcb,
-    0x60,
-    0x9f,
-    0x1b,
-    0x73,
-    0xb4,
-    0xff,
-    0x28,
-    0x06,
-    0x0e,
-    0xfe,
-    0x43,
-    0xa9,
-    0x8b,
-    0x95,
-    0x95,
-    0xae,
-    0xc7,
-    0x3f,
-    0xba,
-    0x15,
-    0x51,
-    0xa3,
-    0xcf,
-    0x53,
-    0x5c,
-    0x73,
-    0xcc,
-    0x53,
-    0xb7,
-    0x94,
-    0x14,
-    0xbb,
-    0xff,
-    0x7f,
-    0x4b,
-    0x70,
-    0x13,
-    0xe7,
-    0x68,
-    0x5c,
-    0xc8,
-    0x9c,
-    0x0b,
-    0x6f,
-    0xde,
-    0xaf,
-    0x10,
-    0xe3,
-    0x33,
-    0xd7,
-    0x64,
-    0xc5,
-    0x37,
-    0x13,
-    0x17,
-    0xb1,
-    0xa0,
-    0x91,
-    0xb3,
-    0xdd,
-    0x5f,
-    0xcf,
-    0xcd,
-    0x58,
-    0xd2,
-    0x00,
-    0xd9,
-    0x94,
-    0x3b,
-    0xb1,
-    0x43,
-    0x23,
-    0x71,
-    0xac,
-    0xbb,
-    0xbe,
-    0xd5,
-    0x1c,
-    0xd0,
-    0x8b,
-    0x88,
-    0xf3,
-    0xc0,
-    0xa0,
-    0xdb,
-    0x89,
-    0x8e,
-    0xc3,
-    0x07,
-    0x85,
-    0x56,
-    0x73,
-    0x1f,
-    0x01,
-    0xde,
-    0x2d,
-    0x42,
-    0xe9,
-    0x6d,
-    0xe8,
-    0x15,
-    0xa4,
-    0xe0,
-    0xe2,
-    0x70,
-    0xf7,
-    0xfa,
-    0x9e,
-    0x58,
-    0x26,
-    0xfc,
-    0x2d,
-    0x2e,
-    0x5c,
-    0x75,
-    0xae,
-    0x25,
-    0x4c,
-    0x5c,
-    0x11,
-    0xfa,
-    0x19,
-    0x5c,
-    0x20,
-    0xdf,
-    0x73,
-    0x6f,
-    0xbf,
-    0xb8,
-    0x04,
-    0xae,
-    0x72,
-    0x89,
-    0x0a,
-    0x68,
-    0x21,
-    0x2f,
-    0x45,
-    0x71,
-    0x18,
-    0x4f,
-    0x13,
-    0xbc,
-    0x52,
-    0x8d,
-    0xda,
-    0x2c,
-    0xf7,
-    0xfe,
-    0xa6,
-    0xa8,
-    0x23,
-    0xdf,
-    0x13,
-    0x6e,
-    0xe9,
-    0x87,
-    0x6e,
-    0xa9,
-    0x98,
-    0x9a,
-    0x17,
-    0x45,
-    0x3c,
-    0x80,
-    0x29,
-    0x02,
-    0x68,
-    0x15,
-    0x5d,
-    0xc7,
-    0x33,
-    0xa2,
-    0x2c,
-    0x3a,
-    0x81,
-    0x0d,
-    0x34,
-    0x8d,
-    0x84,
-    0x4c,
-    0xdd,
-    0x9a,
-    0x82,
-    0x1f,
-    0x3c,
-    0x33,
-    0xd8,
-    0xff,
-    0x38,
-    0xb3,
-    0x3f,
-    0x51,
-    0xeb,
-    0xd9,
-    0x4e,
-    0xe0,
-    0x4b,
-    0xd7,
-    0x40,
-    0x8a,
-    0x09,
-    0xa5,
-    0xf8,
-    0x3a,
-    0xb9,
-    0x9b,
-    0x42,
-    0x16,
-    0x34,
-    0x3f,
-    0x5c,
-    0xf9,
-    0x3a,
-    0x5c,
-    0xb5,
-    0x23,
-    0x5c,
-    0x54,
-    0xf4,
-    0x2f,
-    0x19,
-    0xb6,
-    0x3c,
-    0x46,
-    0x48,
-    0x13,
-    0xae,
-    0x93,
-    0xb6,
-    0x0e,
-    0x30,
-    0xf6,
-    0x0f,
-    0xb3,
-    0x6d,
-    0xfd,
-    0x02,
-    0x0a,
-    0x1d,
-    0x10,
-    0xa0,
-    0xeb,
-    0x87,
-    0xeb,
-    0x05,
-    0x13,
-    0x44,
-    0x52,
-    0x3b,
-    0x78,
-    0x45,
-    0xff,
-    0x5b,
-    0xda,
-    0x18,
-    0xe0,
-    0xf5,
-    0x9b,
-    0x66,
-    0x7f,
-    0xb2,
-    0xd0,
-    0xc1,
-    0xc2,
-    0x38,
-    0x98,
-    0x9c,
-    0xd4,
-    0x4e,
-    0xad,
-    0x9b,
-    0x63,
-    0x41,
-    0x38,
-    0x0e,
-    0x0c,
-    0x86,
-    0xea,
-    0xb8,
-    0x13,
-    0xa0,
-    0x48,
-    0xd4,
-    0x58,
-    0x45,
-    0x46,
-    0x5a,
-    0x86,
-    0xbc,
-    0x18,
-    0x7e,
-    0x8e,
-    0x89,
-    0x45,
-    0x79,
-    0x54,
-    0x4c,
-    0xfd,
-    0x8d,
-    0xa7,
-    0xe7,
-    0xac,
-    0x43,
-    0x77,
-    0xdf,
-    0xcf,
-    0xf8,
-    0x42,
-    0x05,
-    0x07,
-    0x97,
-    0xd0,
-    0x55,
-    0x6b,
-    0xa8,
-    0x20,
-    0x1e,
-    0x23,
-    0x8a,
-    0xa2,
-    0x63,
-    0x33,
-    0xfc,
-    0xa7,
-    0x81,
-    0x94,
-    0xe3,
-    0x15,
-    0x13,
-    0x89,
-    0x47,
-    0x5f,
-    0x13,
-    0x30,
-    0x9e,
-    0xb4,
-    0x42,
-    0x57,
-    0x4d,
-    0x77,
-    0xc9,
-    0x92,
-    0x6c,
-    0xf0,
-    0x20,
-    0x8a,
-    0xc9,
-    0x41,
-    0x2f,
-    0x98,
-    0x30,
-    0x9b,
-    0xb3,
-    0x93,
-    0xea,
-    0xb1,
-    0xe4,
-    0xe6,
-    0x84,
-    0x6d,
-    0x55,
-    0xe5,
-    0xd2,
-    0xe2,
-    0x1b,
-    0x61,
-    0x32,
-    0x83,
-    0x31,
-    0x79,
-    0x15,
-    0x92,
-    0x1b,
-    0xb4,
-    0xbc,
-    0xdb,
-    0xca,
-    0x4d,
-    0x40,
-    0xa1,
-    0xc0,
-    0xce,
-    0xd5,
-    0xd9,
-    0x74,
-    0xe0,
-    0x4f,
-    0x96,
-    0xf8,
-    0x62,
-    0xe6,
-    0xc5,
-    0xd9,
-    0xb8,
-    0x36,
-    0x1a,
-    0x47,
-    0x66,
-    0x8a,
-    0x4a,
-    0x75,
-    0xdd,
-    0x59,
-    0x7b,
-    0x43,
-    0x94,
-    0x11,
-    0xf8,
-    0x1b,
-    0x5b,
-    0x14,
-    0x2a,
-    0x18,
-    0xed,
-    0x00,
-    0xc4,
-    0x6e,
-    0xc4,
-    0x34,
-    0x3d,
-    0x06,
-    0x31,
-    0x90,
-    0x83,
-    0x68,
-    0xab,
-    0x7b,
-    0xee,
-    0xde,
-    0x68,
-    0x2b,
-    0x72,
-    0xd6,
-    0x2a,
-    0x21,
-    0x1a,
-    0x89,
-    0x5c,
-    0xf2,
-    0xb1,
-    0xda,
-    0x5d,
-    0x4d,
-    0xc2,
-    0x81,
-    0x1c,
-    0x3a,
-    0xc4,
-    0x68,
-    0xe5,
-    0xa0,
-    0x8e,
-    0x55,
-    0x7a,
-    0x0a,
-    0x11,
-    0xca,
-    0x66,
-    0xaa,
-    0x45,
-    0x2a,
-    0x8e,
-    0x9f,
-    0x64,
-    0x1c,
-    0x09,
-    0x73,
-    0x57,
-    0x34,
-    0x31,
-    0xe8,
-    0x6d,
-    0xd1,
-    0xfa,
-    0xf4,
-    0x53,
-    0x41,
-    0x83,
-    0x0a,
-    0x41,
-    0x2c,
-    0xeb,
-    0x9b,
-    0x71,
-    0x2f,
-    0x66,
-    0xdd,
-    0xd5,
-    0xc7,
-    0x90,
-    0xcb,
-    0x09,
-    0x71,
-    0x01,
-    0x6d,
-    0x87,
-    0x0f,
-    0x21,
-    0x59,
-    0x1a,
-    0x8e,
-    0x3d,
-    0x7a,
-    0x95,
-    0xc6,
-    0xdb,
-    0x10,
-    0xc4,
-    0xa1,
-    0x4b,
-    0xf8,
-    0xa3,
-    0x80,
-    0x7f,
-    0x2e,
-    0xce,
-    0xda,
-    0x1d,
-    0x90,
-    0x39,
-    0x26,
-    0xd1,
-    0xe4,
-    0x21,
-    0xfc,
-    0xe8,
-    0x1d,
-    0x42,
-    0x77,
-    0x1b,
-    0xda,
-    0x4b,
-    0xdd,
-    0xa8,
-    0x30,
-    0x8f,
-    0x82,
-    0xa8,
-    0xa9,
-    0xfd,
-    0xe9,
-    0x9c,
-    0x8c,
-    0x52,
-    0x2d,
-    0x49,
-    0x5f,
-    0x8d,
-    0x9f,
-    0xc6,
-    0xab,
-    0xa3,
-    0xb1,
-    0xd3,
-    0xff,
-    0x75,
-    0x13,
-    0x6c,
-    0x37,
-    0xff,
-    0x1b,
-    0x9e,
-    0xfe,
-    0xd2,
-    0x6a,
-    0x9a,
-    0x92,
-    0xc4,
-    0xcd,
-    0x08,
-    0xc8,
-    0xe6,
-    0x61,
-    0x9d,
-    0x4f,
-    0xb6,
-    0xfb,
-    0xf0,
-    0x38,
-    0x96,
-    0xc6,
-    0x89,
-    0xb6,
-    0x7d,
-    0x2e,
-    0x3b,
-    0x23,
-    0xed,
-    0xfd,
-    0xb5,
-    0x44,
-    0x25,
-    0xc4,
-    0x53,
-    0xce,
-    0x97,
-    0x7d,
-    0x3a,
-    0x29,
-    0x9c,
-    0x6e,
-    0xa3,
-    0x73,
-    0x67,
-    0x51,
-    0x77,
-    0xc8,
-    0x37,
-    0xb1,
-    0x1d,
-    0xc1,
-    0xd1,
-    0x97,
-    0x8f,
-    0x3a,
-    0x2e,
-    0x66,
-    0xb4,
-    0x59,
-    0x71,
-    0x04,
-    0xea,
-    0xcc,
-    0x1c,
-    0x3a,
-    0xe1,
-    0x51,
-    0x82,
-    0x5e,
-    0xb0,
-    0x7c,
-    0x80,
-    0x2f,
-    0x22,
-    0xb5,
-    0x68,
-    0x00,
-    0x51,
-    0x80,
-    0x3e,
-    0x19,
-    0x77,
-    0x01,
-    0x27,
-    0x5a,
-    0x00,
-    0xbf,
-    0x1e,
-    0x21,
-    0xe4,
-    0xa8,
-    0xe9,
-    0x6e,
-    0x33,
-    0x55,
-    0x4b,
-    0x45,
-    0xf2,
-    0x90,
-    0x7c,
-    0x54,
-    0x25,
-    0x13,
-    0xd6,
-    0xd6,
-    0x2d,
-    0x93,
-    0xd1,
-    0xb7,
-    0x54,
-    0xfd,
-    0x31,
-    0xf9,
-    0xa7,
-    0x00,
-    0x7e,
-    0x56,
-    0x04,
-    0xcb,
-    0xb5,
-    0x27,
-    0x73,
-    0x18,
-    0x3d,
-    0x84,
-    0xb9,
-    0x69,
-    0x1c,
-    0xad,
-    0x2b,
-    0x91,
-    0x6b,
-    0xa8,
-    0xc1,
-    0x77,
-    0x07,
-    0x2c,
-    0x6b,
-    0x17,
-    0x8a,
-    0xbe,
-    0xa8,
-    0xc9,
-    0x7a,
-    0x1a,
-    0x54,
-    0xc6,
-    0xc0,
-    0xd4,
-    0xc1,
-    0xe8,
-    0x5b,
-    0x3f,
-    0x0a,
-    0xb1,
-    0x55,
-    0x8e,
-    0xa4,
-    0x8f,
-    0xf6,
-    0x39,
-    0x36,
-    0x5e,
-    0x39,
-    0xa3,
-    0xab,
-    0x2f,
-    0x7c,
-    0xf9,
-    0x85,
-    0x48,
-    0x7b,
-    0x5d,
-    0x74,
-    0x6c,
-    0x7f,
-    0x44,
-    0x27,
-    0x5c,
-    0xd3,
-    0x1c,
-    0x62,
-    0x9d,
-    0x78,
-    0x33,
-    0x51,
-    0x7c,
-    0x19,
-    0xd4,
-    0x1c,
-    0x50,
-    0x41,
-    0xb3,
-    0xbb,
-    0xff,
-    0xcc,
-    0x8a,
-    0x0c,
-    0xc3,
-    0x9c,
-    0x05,
-    0x22,
-    0x2e,
-    0x8d,
-    0xdc,
-    0xe0,
-    0x6c,
-    0xaa,
-    0x3e,
-    0xc7,
-    0xc9,
-    0xa1,
-    0x76,
-    0x0d,
-    0x72,
-    0x74,
-    0xc9,
-    0xef,
-    0x80,
-    0x72,
-    0x9d,
-    0x48,
-    0x32,
-    0x66,
-    0xe1,
-    0x61,
-    0x7a,
-    0x0e,
-    0xa8,
-    0x0b,
-    0xbc,
-    0xce,
-    0x17,
-    0xeb,
-    0xd2,
-    0xa6,
-    0x82,
-    0x16,
-    0x53,
-    0x62,
-    0xd2,
-    0xde,
-    0x15,
-    0x10,
-    0x2a,
-    0xeb,
-    0xf0,
-    0xb7,
-    0xca,
-    0x8d,
-    0xc5,
-    0x46,
-    0x33,
-    0x50,
-    0xbf,
-    0xcb,
-    0x8b,
-    0xd1,
-    0xd9,
-    0xe5,
-    0x44,
-    0xd1,
-    0xa1,
-    0x7c,
-    0xf9,
-    0x88,
-    0x3b,
-    0xaf,
-    0x98,
-    0x3b,
-    0xa8,
-    0x0e,
-    0xc6,
-    0x11,
-    0x49,
-    0x0a,
-    0x7f,
-    0x23,
-    0x9e,
-    0xa9,
-    0xfd,
-    0xd2,
-    0x54,
-    0x7f,
-    0xdc,
-    0x5d,
-    0x7f,
-    0xd9,
-    0x7b,
-    0xb3,
-    0x24,
-    0x3b,
-    0xa5,
-    0x85,
-    0xfa,
-    0x0d,
-    0x71,
-    0xa0,
-    0x71,
-    0x91,
-    0x66,
-    0x7a,
-    0xf4,
-    0x18,
-    0xe3,
-    0x0a,
-    0x6b,
-    0x76,
-    0xbe,
-    0xdd,
-    0x05,
-    0xb3,
-    0x2c,
-    0x67,
-    0x34,
-    0x03,
-    0xe1,
-    0x97,
-    0xf9,
-    0xf8,
-    0x78,
-    0xae,
-    0x61,
-    0xf7,
-    0x14,
-    0x50,
-    0x50,
-    0xe9,
-    0x48,
-    0xdb,
-    0x7d,
-    0x32,
-    0x34,
-    0xf9,
-    0xbe,
-    0xe7,
-    0xf1,
-    0x71,
-    0x86,
-    0x3b,
-    0x30,
-    0x43,
-    0xab,
-    0x3b,
-    0x1d,
-    0xf3,
-    0x6d,
-    0xbc,
-    0x8a,
-    0x25,
-    0xb5,
-    0x91,
-    0x49,
-    0x6a,
-    0x9a,
-    0x01,
-    0xd9,
-    0x5a,
-    0x29,
-    0x78,
-    0x46,
-    0xe3,
-    0x66,
-    0x7c,
-    0x4a,
-    0xe0,
-    0x8e,
-    0xe3,
-    0xb8,
-    0xed,
-    0x9f,
-    0x43,
-    0x1a,
-    0x7a,
-    0x1a,
-    0xab,
-    0x99,
-    0x1f,
-    0x08,
-    0x90,
-    0x1e,
-    0x2f,
-    0x3b,
-    0x0a,
-    0xb7,
-    0x90,
-    0xd6,
-    0x41,
-    0x3c,
-    0xca,
-    0x10,
-    0x21,
-    0x32,
-    0x5d,
-    0x34,
-    0x56,
-    0xef,
-    0x58,
-    0xec,
-    0x74,
-    0xff,
-    0x27,
-    0xc0,
-    0x75,
-    0xc7,
-    0xad,
-    0xda,
-    0x69,
-    0x68,
-    0x93,
-    0x0c,
-    0x69,
-    0xe7,
-    0xdf,
-    0x14,
-    0xcd,
-    0x8a,
-    0xc8,
-    0x1e,
-    0x9f,
-    0x85,
-    0xc8,
-    0x8a,
-    0x4f,
-    0xd5,
-    0xf4,
-    0xf0,
-    0xa7,
-    0x6d,
-    0x89,
-    0x61,
-    0x02,
-    0x90,
-    0xc7,
-    0xf0,
-    0xb9,
-    0x7e,
-    0x02,
-    0x71,
-    0xdf,
-    0x52,
-    0xf6,
-    0x81,
-    0x2e,
-    0x2b,
-    0x5b,
-    0xc7,
-    0x40,
-    0x8a,
-    0xb9,
-    0x79,
-    0x03,
-    0xfb,
-    0x7e,
-    0x21,
-    0x67,
-    0xf8,
-    0x4e,
-    0xa1,
-    0x59,
-    0x0a,
-    0x9a,
-    0x74,
-    0xf5,
-    0x31,
-    0x74,
-    0x38,
-    0xf7,
-    0x86,
-    0xa1,
-    0x69,
-    0x73,
-    0x1f,
-    0xf0,
-    0x70,
-    0xc7,
-    0x33,
-    0xcb,
-    0xdc,
-    0xcd,
-    0x7e,
-    0x0c,
-    0xef,
-    0x55,
-    0xe7,
-    0x12,
-    0x5c,
-    0xd2,
-    0x61,
-    0x13,
-    0x4f,
-    0x53,
-    0x0f,
-    0xb3,
-    0xae,
-    0xb5,
-    0xab,
-    0xd6,
-    0x9e,
-    0x17,
-    0x28,
-    0xb3,
-    0x4a,
-    0x8f,
-    0x96,
-    0x2b,
-    0xe0,
-    0x1b,
-    0x47,
-    0x58,
-    0xdb,
-    0xdb,
-    0x30,
-    0x68,
-    0x88,
-    0x7d,
-    0x91,
-    0xac,
-    0xc3,
-    0xf8,
-    0xd9,
-    0xec,
-    0x02,
-    0x7d,
-    0xc4,
-    0xfe,
-    0x96,
-    0xaa,
-    0xc6,
-    0x96,
-    0x2d,
-    0x02,
-    0xac,
-    0x60,
-    0x9a,
-    0x9a,
-    0x81,
-    0x4c,
-    0xd9,
-    0x14,
-    0xae,
-    0x2a,
-    0x4d,
-    0xd1,
-    0x66,
-    0x76,
-    0x4d,
-    0x63,
-    0x41,
-    0x75,
-    0xdf,
-    0x41,
-    0x27,
-    0x81,
-    0xc3,
-    0xbf,
-    0x70,
-    0xa0,
-    0xb4,
-    0x3d,
-    0x49,
-    0x5c,
-    0xea,
-    0x9e,
-    0x5a,
-    0xcf,
-    0xe3,
-    0xfc,
-    0xa6,
-    0xfe,
-    0x63,
-    0x99,
-    0xb2,
-    0x68,
-    0xba,
-    0x19,
-    0xe9,
-    0xde,
-    0x45,
-    0xef,
-    0x3f,
-    0x94,
-    0x37,
-    0x16,
-    0x15,
-    0x79,
-    0x99,
-    0x01,
-    0x5c,
-    0xc4,
-    0x90,
-    0xd4,
-    0xfe,
-    0xcf,
-    0xdf,
-    0xd4,
-    0x79,
-    0x29,
-    0xac,
-    0x1c,
-    0xcd,
-    0xe7,
-    0x87,
-    0x93,
-    0x99,
-    0x3a,
-    0xa8,
-    0x1a,
-    0x81,
-    0x47,
-    0x78,
-    0x0a,
-    0xd2,
-    0x32,
-    0x54,
-    0xdd,
-    0x69,
-    0x7c,
-    0x8d,
-    0x2b,
-    0xd1,
-    0x90,
-    0xb3,
-    0xd9,
-    0xab,
-    0x98,
-    0x13,
-    0x8d,
-    0x53,
-    0x95,
-    0x7e,
-    0x64,
-    0xc0,
-    0xaf,
-    0x4c,
-    0xe8,
-    0xac,
-    0xc9,
-    0xa1,
-    0x3c,
-    0xf5,
-    0x59,
-    0xef,
-    0x9a,
-    0x44,
-    0x77,
-    0xbc,
-    0x00,
-    0xec,
-    0x34,
-    0xa6,
-    0x25,
-    0x15,
-    0x2c,
-    0xa4,
-    0xb2,
-    0x19,
-    0x5f,
-    0x8e,
-    0xaf,
-    0x2e,
-    0x3c,
-    0xe0,
-    0x3b,
-    0x46,
-    0xff,
-    0xbb,
-    0x81
-  ],
-  const [
-    0xfc,
-    0xee,
-    0x0a,
-    0x4b,
-    0x78,
-    0x17,
-    0xf8,
-    0x84,
-    0x02,
-    0x16,
-    0x63,
-    0x50,
-    0xbb,
-    0xda,
-    0x8a,
-    0xc2,
-    0xf4,
-    0xbe,
-    0x6e,
-    0xa3,
-    0xe6,
-    0x69,
-    0x2c,
-    0x72,
-    0xa3,
-    0xf2,
-    0x89,
-    0xa9,
-    0x4d,
-    0x48,
-    0xcf,
-    0x42,
-    0x86,
-    0xd2,
-    0xd8,
-    0x7a,
-    0x27,
-    0x52,
-    0x68,
-    0xd5,
-    0x35,
-    0x0f,
-    0xc0,
-    0x62,
-    0x11,
-    0x33,
-    0x6f,
-    0x40,
-    0xee,
-    0x72,
-    0x6c,
-    0x61,
-    0x88,
-    0xec,
-    0x62,
-    0x8e,
-    0x14,
-    0x55,
-    0x4b,
-    0xab,
-    0x72,
-    0x53,
-    0x40,
-    0x3d,
-    0xaa,
-    0x27,
-    0x8f,
-    0x29,
-    0x96,
-    0x90,
-    0x0f,
-    0xbe,
-    0xdc,
-    0xec,
-    0xb0,
-    0xf6,
-    0x20,
-    0xa1,
-    0x56,
-    0xf9,
-    0x77,
-    0xbb,
-    0xe8,
-    0xe3,
-    0x1e,
-    0xd7,
-    0xa3,
-    0xc7,
-    0x6c,
-    0x3f,
-    0xb5,
-    0xf4,
-    0x05,
-    0x56,
-    0x07,
-    0x77,
-    0x51,
-    0x37,
-    0x5a,
-    0xe1,
-    0x2c,
-    0x99,
-    0x95,
-    0x4a,
-    0xdf,
-    0xf6,
-    0x5d,
-    0x95,
-    0x4f,
-    0xec,
-    0xe7,
-    0xf6,
-    0x75,
-    0xe3,
-    0x0a,
-    0xb2,
-    0x0e,
-    0xf0,
-    0x99,
-    0x26,
-    0x94,
-    0xf9,
-    0xef,
-    0x0b,
-    0x6c,
-    0x1a,
-    0xcb,
-    0xf8,
-    0x61,
-    0x48,
-    0x5f,
-    0x28,
-    0x51,
-    0x34,
-    0xa3,
-    0x7e,
-    0x26,
-    0x72,
-    0xef,
-    0xc6,
-    0x08,
-    0xdb,
-    0xc9,
-    0x3e,
-    0xd2,
-    0x30,
-    0xfc,
-    0x55,
-    0xc2,
-    0x00,
-    0xea,
-    0xb2,
-    0x74,
-    0xcb,
-    0x22,
-    0x78,
-    0x11,
-    0x67,
-    0x35,
-    0xc9,
-    0xc4,
-    0xa3,
-    0xc6,
-    0x89,
-    0x6d,
-    0x2b,
-    0xe1,
-    0x64,
-    0x9a,
-    0xab,
-    0x8e,
-    0x12,
-    0xb3,
-    0x37,
-    0xa5,
-    0xd9,
-    0x74,
-    0xeb,
-    0xe3,
-    0x54,
-    0xa0,
-    0xce,
-    0x3e,
-    0x74,
-    0xf4,
-    0xfc,
-    0x76,
-    0xc4,
-    0x5a,
-    0x05,
-    0xed,
-    0xf1,
-    0x60,
-    0x90,
-    0xb8,
-    0x89,
-    0xe8,
-    0x44,
-    0xf6,
-    0x03,
-    0x21,
-    0xe8,
-    0x60,
-    0x00,
-    0xb6,
-    0xc8,
-    0x22,
-    0xd0,
-    0x45,
-    0x5b,
-    0xea,
-    0x38,
-    0x12,
-    0x24,
-    0x3e,
-    0x72,
-    0xfd,
-    0xd6,
-    0x12,
-    0x76,
-    0xb1,
-    0xbb,
-    0x9a,
-    0x78,
-    0x1f,
-    0x56,
-    0x5d,
-    0xb2,
-    0x2b,
-    0x48,
-    0x8b,
-    0x63,
-    0xa4,
-    0x70,
-    0x90,
-    0x18,
-    0x7a,
-    0x56,
-    0xe9,
-    0x2a,
-    0x2b,
-    0xca,
-    0x36,
-    0x88,
-    0x7f,
-    0xc8,
-    0x91,
-    0xb6,
-    0x75,
-    0x9f,
-    0x1f,
-    0x16,
-    0x7d,
-    0x52,
-    0xe4,
-    0x67,
-    0xe7,
-    0x3f,
-    0xdc,
-    0x8b,
-    0x9c,
-    0xfe,
-    0x47,
-    0x8d,
-    0x0c,
-    0x8c,
-    0x44,
-    0xe2,
-    0x67,
-    0xa9,
-    0xa1,
-    0xef,
-    0x10,
-    0x7e,
-    0xf2,
-    0xcc,
-    0x4f,
-    0x83,
-    0xe0,
-    0x48,
-    0x46,
-    0xa0,
-    0xc4,
-    0x2d,
-    0x26,
-    0x93,
-    0x75,
-    0xc5,
-    0xa2,
-    0x91,
-    0x5d,
-    0x9c,
-    0xa4,
-    0x30,
-    0xd3,
-    0x88,
-    0x3f,
-    0x84,
-    0xa5,
-    0xe7,
-    0xe6,
-    0x88,
-    0xf3,
-    0x28,
-    0xdb,
-    0xc0,
-    0x44,
-    0x8d,
-    0xe9,
-    0x1d,
-    0xd3,
-    0x2e,
-    0x56,
-    0x21,
-    0x2a,
-    0x42,
-    0x14,
-    0x43,
-    0xf2,
-    0x9a,
-    0x37,
-    0x95,
-    0x0a,
-    0x6e,
-    0xac,
-    0xa4,
-    0xd6,
-    0x5c,
-    0x27,
-    0xa0,
-    0xda,
-    0xae,
-    0x5d,
-    0xbd,
-    0x87,
-    0xdc,
-    0x74,
-    0xd8,
-    0x54,
-    0x51,
-    0xb7,
-    0x5e,
-    0x11,
-    0x72,
-    0x8f,
-    0x6a,
-    0x78,
-    0xdd,
-    0xae,
-    0x2d,
-    0x06,
-    0xee,
-    0x8e,
-    0x93,
-    0x09,
-    0x88,
-    0x1a,
-    0x23,
-    0xf9,
-    0x12,
-    0xab,
-    0x28,
-    0x0b,
-    0xbf,
-    0x35,
-    0x0e,
-    0x04,
-    0x13,
-    0xc3,
-    0x0e,
-    0x4b,
-    0xa3,
-    0x20,
-    0x0e,
-    0x43,
-    0x1c,
-    0xd7,
-    0xc2,
-    0xd7,
-    0x86,
-    0x5e,
-    0x18,
-    0x57,
-    0xca,
-    0x8f,
-    0xd3,
-    0x82,
-    0x72,
-    0x57,
-    0x75,
-    0xe4,
-    0xb1,
-    0xb2,
-    0x63,
-    0x62,
-    0xa3,
-    0xd7,
-    0x44,
-    0x13,
-    0xd5,
-    0xaf,
-    0xaa,
-    0x51,
-    0x08,
-    0x8c,
-    0xf4,
-    0x10,
-    0x32,
-    0x18,
-    0x73,
-    0x6f,
-    0xc6,
-    0x8c,
-    0xcb,
-    0x8d,
-    0x35,
-    0x22,
-    0x9c,
-    0x9e,
-    0xb5,
-    0xcc,
-    0x62,
-    0x3e,
-    0x41,
-    0x26,
-    0x9a,
-    0x04,
-    0xe1,
-    0xa9,
-    0x27,
-    0x5b,
-    0x2b,
-    0x22,
-    0xf3,
-    0x8d,
-    0x0a,
-    0x63,
-    0xd9,
-    0x21,
-    0xbe,
-    0x39,
-    0xc3,
-    0x67,
-    0x24,
-    0x9e,
-    0x0f,
-    0x51,
-    0x38,
-    0x2f,
-    0x38,
-    0x84,
-    0xd8,
-    0xe0,
-    0xb2,
-    0xaf,
-    0xcb,
-    0xee,
-    0x15,
-    0x1c,
-    0x01,
-    0x15,
-    0x7e,
-    0x85,
-    0x1c,
-    0x04,
-    0x32,
-    0x28,
-    0x30,
-    0x0e,
-    0x85,
-    0x1d,
-    0xc7,
-    0x22,
-    0xfb,
-    0xe8,
-    0x29,
-    0xfd,
-    0xac,
-    0x4b,
-    0xda,
-    0x9e,
-    0xed,
-    0x5e,
-    0x63,
-    0xfa,
-    0x2c,
-    0xe1,
-    0x55,
-    0xf2,
-    0x1c,
-    0xd0,
-    0x8c,
-    0x82,
-    0x13,
-    0x38,
-    0xb1,
-    0x3b,
-    0xb0,
-    0x4a,
-    0x02,
-    0xf3,
-    0xc0,
-    0xad,
-    0x56,
-    0xbb,
-    0x62,
-    0x19,
-    0x5b,
-    0x11,
-    0x6a,
-    0x22,
-    0x23,
-    0x57,
-    0x04,
-    0x51,
-    0xdf,
-    0x84,
-    0x9a,
-    0x79,
-    0xea,
-    0x1a,
-    0xf7,
-    0x48,
-    0x09,
-    0x58,
-    0xac,
-    0x1d,
-    0xf1,
-    0xb0,
-    0xb2,
-    0x19,
-    0x09,
-    0x7b,
-    0x52,
-    0x79,
-    0x72,
-    0xec,
-    0x42,
-    0x23,
-    0x45,
-    0x42,
-    0x11,
-    0x7e,
-    0x1b,
-    0x42,
-    0xc4,
-    0x87,
-    0xd3,
-    0xe5,
-    0xc2,
-    0x22,
-    0x8f,
-    0x4e,
-    0xed,
-    0xad,
-    0x00,
-    0xfe,
-    0x12,
-    0xdb,
-    0xe4,
-    0x4b,
-    0x83,
-    0xc0,
-    0xcc,
-    0x0e,
-    0x02,
-    0x28,
-    0x23,
-    0x9d,
-    0xe1,
-    0x2d,
-    0x6c,
-    0xf9,
-    0x68,
-    0x09,
-    0xcb,
-    0x48,
-    0x77,
-    0x28,
-    0xc7,
-    0x85,
-    0x6c,
-    0x82,
-    0x4e,
-    0x76,
-    0x47,
-    0x27,
-    0xf9,
-    0xde,
-    0x0d,
-    0x1b,
-    0x92,
-    0xf5,
-    0x6a,
-    0x65,
-    0xd4,
-    0x15,
-    0x99,
-    0x63,
-    0x71,
-    0xb6,
-    0x89,
-    0x60,
-    0x5a,
-    0x9c,
-    0x38,
-    0x68,
-    0x3a,
-    0x4f,
-    0x63,
-    0x5b,
-    0x43,
-    0xcc,
-    0x62,
-    0x41,
-    0x2e,
-    0x7a,
-    0x4e,
-    0xdd,
-    0x7d,
-    0x5f,
-    0x64,
-    0x85,
-    0x04,
-    0x94,
-    0xae,
-    0x31,
-    0xa7,
-    0xf6,
-    0xe0,
-    0xd1,
-    0x65,
-    0x1f,
-    0x80,
-    0xe4,
-    0x96,
-    0x95,
-    0x49,
-    0x46,
-    0x70,
-    0x40,
-    0xd2,
-    0x49,
-    0xd0,
-    0x22,
-    0x6b,
-    0x08,
-    0x38,
-    0x42,
-    0x47,
-    0xf8,
-    0x13,
-    0xe9,
-    0xe1,
-    0xc0,
-    0x41,
-    0x11,
-    0x98,
-    0x4b,
-    0xcf,
-    0x1b,
-    0x9c,
-    0x1b,
-    0x06,
-    0xc0,
-    0x0e,
-    0xe0,
-    0xa8,
-    0x4a,
-    0x63,
-    0x49,
-    0x76,
-    0x04,
-    0x0a,
-    0x1a,
-    0xf5,
-    0xef,
-    0x4e,
-    0x7f,
-    0x72,
-    0xb6,
-    0x7d,
-    0x9f,
-    0x44,
-    0xe4,
-    0x4a,
-    0x75,
-    0x51,
-    0x55,
-    0x70,
-    0xdb,
-    0xd4,
-    0xea,
-    0x98,
-    0xe8,
-    0x5d,
-    0x81,
-    0x7d,
-    0x7c,
-    0x19,
-    0x25,
-    0x4e,
-    0x19,
-    0x53,
-    0x81,
-    0x54,
-    0xf5,
-    0x3b,
-    0x9b,
-    0xd4,
-    0x4d,
-    0xe6,
-    0xbf,
-    0x37,
-    0xfb,
-    0x97,
-    0xb8,
-    0x68,
-    0x4b,
-    0x3d,
-    0x47,
-    0x7e,
-    0x0b,
-    0x3c,
-    0xcd,
-    0x9b,
-    0xe1,
-    0x70,
-    0x4b,
-    0x13,
-    0xe2,
-    0x6f,
-    0x8c,
-    0xd1,
-    0x5f,
-    0x0f,
-    0xa1,
-    0xf7,
-    0x02,
-    0x29,
-    0x8e,
-    0xc5,
-    0x1a,
-    0x9c,
-    0x43,
-    0xbc,
-    0x34,
-    0x94,
-    0xce,
-    0x03,
-    0xeb,
-    0x0c,
-    0xce,
-    0x09,
-    0x01,
-    0x91,
-    0x2b,
-    0x6c,
-    0xae,
-    0x49,
-    0x04,
-    0x1a,
-    0x37,
-    0x35,
-    0xe9,
-    0xb6,
-    0xc3,
-    0xb3,
-    0x4b,
-    0x3d,
-    0x6b,
-    0x47,
-    0x30,
-    0xe9,
-    0x90,
-    0x9a,
-    0x2b,
-    0x55,
-    0x71,
-    0xc3,
-    0x8c,
-    0xe3,
-    0xfc,
-    0xc6,
-    0xd4,
-    0x5b,
-    0xe5,
-    0x5a,
-    0x6c,
-    0xd4,
-    0xf6,
-    0xf0,
-    0x96,
-    0xd8,
-    0xa6,
-    0xf0,
-    0xa3,
-    0xc3,
-    0xec,
-    0x46,
-    0x67,
-    0x6c,
-    0x55,
-    0x1d,
-    0xea,
-    0x07,
-    0x55,
-    0xea,
-    0x60,
-    0x4a,
-    0xda,
-    0xad,
-    0x5b,
-    0xcf,
-    0x27,
-    0x74,
-    0x40,
-    0xba,
-    0xe0,
-    0x20,
-    0xf7,
-    0x9b,
-    0x61,
-    0x6b,
-    0xe7,
-    0x96,
-    0x54,
-    0x2a,
-    0x22,
-    0xc1,
-    0x83,
-    0xd0,
-    0xdc,
-    0xcd,
-    0xea,
-    0x34,
-    0x22,
-    0xe9,
-    0x11,
-    0x94,
-    0xc9,
-    0xe3,
-    0x99,
-    0xd9,
-    0xa4,
-    0x90,
-    0x14,
-    0x1c,
-    0xfa,
-    0x6f,
-    0x1a,
-    0x6a,
-    0x36,
-    0x89,
-    0x99,
-    0xc4,
-    0xe1,
-    0x9b,
-    0x6c,
-    0x6a,
-    0xce,
-    0x77,
-    0x2f,
-    0x5a,
-    0x94,
-    0xa8,
-    0x52,
-    0x13,
-    0x41,
-    0x55,
-    0x6d,
-    0x9e,
-    0x4d,
-    0x68,
-    0xd3,
-    0xcf,
-    0xcd,
-    0xee,
-    0x6a,
-    0xc9,
-    0xe9,
-    0xc1,
-    0xba,
-    0xc0,
-    0x90,
-    0x65,
-    0x43,
-    0x03,
-    0x6b,
-    0x31,
-    0x14,
-    0x39,
-    0x0f,
-    0xaf,
-    0x99,
-    0xea,
-    0x76,
-    0x45,
-    0xb5,
-    0x42,
-    0xb0,
-    0x14,
-    0x10,
-    0x12,
-    0xd6,
-    0x20,
-    0xb3,
-    0x18,
-    0x40,
-    0xb1,
-    0xd2,
-    0x80,
-    0xf7,
-    0xfa,
-    0xe8,
-    0xaa,
-    0x6d,
-    0xf9,
-    0x0a,
-    0x2e,
-    0x6c,
-    0x9e,
-    0x74,
-    0x1e,
-    0x4d,
-    0x2f,
-    0x69,
-    0x8b,
-    0x6a,
-    0xeb,
-    0x3a,
-    0x4a,
-    0xd6,
-    0xee,
-    0xa4,
-    0xf7,
-    0x4b,
-    0x54,
-    0x5e,
-    0x3b,
-    0x63,
-    0xa1,
-    0xf3,
-    0x4b,
-    0x0b,
-    0x61,
-    0xce,
-    0xb1,
-    0x35,
-    0x0b,
-    0x93,
-    0x4f,
-    0xce,
-    0x2b,
-    0xb6,
-    0xa1,
-    0xf0,
-    0xc0,
-    0x46,
-    0x42,
-    0x58,
-    0xe3,
-    0x09,
-    0xb2,
-    0x1a,
-    0xaa,
-    0xce,
-    0x56,
-    0x93,
-    0x4c,
-    0xff,
-    0xc0,
-    0xa0,
-    0x86,
-    0x76,
-    0x31,
-    0x0d,
-    0x3d,
-    0x91,
-    0x5c,
-    0x51,
-    0x64,
-    0x89,
-    0x6d,
-    0x78,
-    0x20,
-    0xff,
-    0x4a,
-    0x60,
-    0x2a,
-    0xd8,
-    0x19,
-    0x28,
-    0x76,
-    0x4b,
-    0x02,
-    0xe6,
-    0x12,
-    0x38,
-    0x36,
-    0x98,
-    0x50,
-    0xbc,
-    0x30,
-    0x5e,
-    0x27,
-    0x02,
-    0x3b,
-    0xe6,
-    0xd7,
-    0x5c,
-    0x34,
-    0x27,
-    0xcc,
-    0x92,
-    0x91,
-    0x52,
-    0xc5,
-    0x7a,
-    0xa2,
-    0x05,
-    0x35,
-    0xc8,
-    0x17,
-    0xc2,
-    0xe9,
-    0x28,
-    0xc3,
-    0xa1,
-    0xec,
-    0x8a,
-    0x9f,
-    0x41,
-    0xa8,
-    0xbd,
-    0x12,
-    0x04,
-    0x4d,
-    0x40,
-    0x6f,
-    0x7c,
-    0x77,
-    0x55,
-    0xc0,
-    0x20,
-    0x0b,
-    0x56,
-    0xc2,
-    0x44,
-    0x61,
-    0x4c,
-    0x30,
-    0x48,
-    0xa9,
-    0xbe,
-    0x44,
-    0x0f,
-    0x87,
-    0xc7,
-    0x7c,
-    0xb2,
-    0x01,
-    0x6b,
-    0x9a,
-    0x76,
-    0x9b,
-    0x2b,
-    0xee,
-    0xfc,
-    0xc0,
-    0xd7,
-    0xd7,
-    0xb8,
-    0x64,
-    0xa4,
-    0x88,
-    0xa4,
-    0xe8,
-    0x7f,
-    0x08,
-    0x36,
-    0x3e,
-    0xa0,
-    0x7c,
-    0x8f,
-    0x4d,
-    0x61,
-    0xa9,
-    0xf5,
-    0x97,
-    0x51,
-    0xb5,
-    0x83,
-    0x19,
-    0x84,
-    0x2d,
-    0x1f,
-    0x72,
-    0x2e,
-    0x4d,
-    0xad,
-    0x48,
-    0x70,
-    0x7b,
-    0x82,
-    0xe8,
-    0x72,
-    0x14,
-    0x1c,
-    0x2c,
-    0xb2,
-    0x6b,
-    0x10,
-    0xa2,
-    0x9c,
-    0x0f,
-    0x43,
-    0xea,
-    0x5a,
-    0x4d,
-    0x5d,
-    0x60,
-    0xed,
-    0xf6,
-    0x7b,
-    0xfc,
-    0x7d,
-    0x63,
-    0x25,
-    0x76,
-    0xed,
-    0xb5,
-    0x7f,
-    0xad,
-    0xb3,
-    0x61,
-    0xc3,
-    0x49,
-    0xe7,
-    0xed,
-    0xee,
-    0x9f,
-    0x99,
-    0xf4,
-    0xba,
-    0xd6,
-    0x68,
-    0x70,
-    0xcd,
-    0x48,
-    0x50,
-    0x39,
-    0x30,
-    0x2b,
-    0xc4,
-    0xc8,
-    0x02,
-    0x71,
-    0xfd,
-    0x41,
-    0x6e,
-    0xec,
-    0x91,
-    0xb1,
-    0xda,
-    0xb6,
-    0x47,
-    0x93,
-    0x61,
-    0xd0,
-    0x2a,
-    0x9a,
-    0x84,
-    0x09,
-    0xdc,
-    0xaa,
-    0x1c,
-    0x22,
-    0x2d,
-    0x27,
-    0x93,
-    0x2f,
-    0xec,
-    0x73,
-    0x54,
-    0x40,
-    0xfe,
-    0xb2,
-    0x80,
-    0x41,
-    0xac,
-    0xd1,
-    0xe3,
-    0x1f,
-    0x41,
-    0xc6,
-    0x26,
-    0x2d,
-    0xd5,
-    0x19,
-    0x46,
-    0xc5,
-    0x64,
-    0xa3,
-    0x45,
-    0x32,
-    0x23,
-    0x96,
-    0x1f,
-    0xcd,
-    0x13,
-    0xbd,
-    0xff,
-    0x67,
-    0xd6,
-    0x05,
-    0xb3,
-    0xe7,
-    0xc2,
-    0x3d,
-    0x5d,
-    0x34,
-    0x34,
-    0x1a,
-    0x6c,
-    0x56,
-    0x26,
-    0x7e,
-    0xcb,
-    0xd8,
-    0x04,
-    0xf9,
-    0x58,
-    0x70,
-    0xbc,
-    0x91,
-    0x98,
-    0xe2,
-    0x15,
-    0xbe,
-    0xa9,
-    0x21,
-    0x41,
-    0xb9,
-    0x78,
-    0xb7,
-    0xb5,
-    0xf6,
-    0x34,
-    0x68,
-    0x38,
-    0xef,
-    0x02,
-    0x12,
-    0x3a,
-    0x24,
-    0xf2,
-    0xd8,
-    0x68,
-    0x60,
-    0x31,
-    0x7f,
-    0x7d,
-    0x3d,
-    0x81,
-    0x18,
-    0x5b,
-    0xea,
-    0xe7,
-    0xe0,
-    0x5a,
-    0x2c,
-    0xa3,
-    0x64,
-    0xe0,
-    0xa3,
-    0x65,
-    0xe9,
-    0x32,
-    0x4f,
-    0xbe,
-    0x0a,
-    0x89,
-    0x53,
-    0xd5,
-    0xa3,
-    0x69,
-    0xf8,
-    0x5b,
-    0xee,
-    0x2e,
-    0xf4,
-    0xc1,
-    0xec,
-    0xe8,
-    0xed,
-    0xa8,
-    0x07,
-    0x68,
-    0x39,
-    0x99,
-    0xf5,
-    0x9b,
-    0xe8,
-    0xf6,
-    0xdf,
-    0x17,
-    0x04,
-    0x30,
-    0xc3,
-    0xf4,
-    0x17,
-    0x3b,
-    0x17,
-    0xdd,
-    0xee,
-    0x3f,
-    0xaf,
-    0x66,
-    0x9d,
-    0x91,
-    0xe0,
-    0xa0,
-    0xc3,
-    0xe1,
-    0xe6,
-    0xec,
-    0x0f,
-    0xb5,
-    0x83,
-    0x0c,
-    0x03,
-    0x16,
-    0xe9,
-    0x80,
-    0xf8,
-    0x88,
-    0xda,
-    0x0f,
-    0x63,
-    0x40,
-    0x0e,
-    0xa4,
-    0x56,
-    0x92,
-    0xd5,
-    0x5b,
-    0x4a,
-    0xa9,
-    0xfd,
-    0xdc,
-    0x1b,
-    0x7a,
-    0xf6,
-    0xe8,
-    0x54,
-    0xfa,
-    0x34,
-    0x31,
-    0xad,
-    0x8f,
-    0xd5,
-    0x6f,
-    0xd2,
-    0xc5,
-    0x84,
-    0xb0,
-    0x66,
-    0x43,
-    0x9d,
-    0xef,
-    0x48,
-    0xfd,
-    0x91,
-    0xe9,
-    0x15,
-    0xab,
-    0x8d,
-    0x2c,
-    0xee,
-    0x79,
-    0x56,
-    0x71,
-    0x7b,
-    0x00,
-    0x78,
-    0x2b,
-    0x2f,
-    0x75,
-    0x9f,
-    0x60,
-    0xce,
-    0x20,
-    0x45,
-    0xb8,
-    0x2d,
-    0x10,
-    0x8d,
-    0xd4,
-    0x3a,
-    0x0e,
-    0x6f,
-    0xe0,
-    0x3b,
-    0xcf,
-    0x16,
-    0x6c,
-    0x5b,
-    0x6e,
-    0x86,
-    0x77,
-    0x62,
-    0x19,
-    0x82,
-    0xcd,
-    0xc4,
-    0x0a,
-    0xad,
-    0x94,
-    0xdd,
-    0xb8,
-    0xef,
-    0x21,
-    0x7b,
-    0x4f,
-    0x1a,
-    0x10,
-    0x9d,
-    0x5e,
-    0xce,
-    0x93,
-    0x7a,
-    0xd0,
-    0x9a,
-    0x0a,
-    0xc5,
-    0x1e,
-    0x63,
-    0xd4,
-    0x30,
-    0xc3,
-    0x0a,
-    0x65,
-    0x2f,
-    0xef,
-    0x49,
-    0x99,
-    0xfe,
-    0x7f,
-    0xde,
-    0x48,
-    0xe5,
-    0x2d,
-    0xec,
-    0x1b,
-    0xbb,
-    0x04,
-    0x9e,
-    0x9e,
-    0xa9,
-    0x18,
-    0x0d,
-    0x96,
-    0x30,
-    0x73,
-    0x64,
-    0x94,
-    0x6d,
-    0x52,
-    0x42,
-    0xca,
-    0x9c,
-    0x92,
-    0x5f,
-    0x1e,
-    0xdc,
-    0x65,
-    0x73,
-    0x7d,
-    0x31,
-    0x49,
-    0x53,
-    0x72,
-    0xcf,
-    0x3b,
-    0x5d,
-    0xf7,
-    0x96,
-    0x27,
-    0x17,
-    0x8b,
-    0xd9,
-    0xa4,
-    0x13,
-    0x84,
-    0x63,
-    0xde,
-    0x16,
-    0xa7,
-    0xbc,
-    0xd3,
-    0x78,
-    0xf6,
-    0xa8,
-    0xc3,
-    0xce,
-    0xc9,
-    0xf1,
-    0xe1,
-    0xc7,
-    0x20,
-    0x66,
-    0x4f,
-    0x54,
-    0x38,
-    0x24,
-    0x49,
-    0x0c,
-    0x5c,
-    0x14,
-    0xa1,
-    0xce,
-    0xfe,
-    0xb5,
-    0x6b,
-    0xa8,
-    0x06,
-    0x1c,
-    0xf9,
-    0xf7,
-    0x6a,
-    0x39,
-    0x0a,
-    0xd0,
-    0xff,
-    0x5b,
-    0x3e,
-    0x9f,
-    0x8f,
-    0xf6,
-    0xcd,
-    0x0e,
-    0x2b,
-    0xa5,
-    0x79,
-    0x29,
-    0xc2,
-    0x6b,
-    0xc1,
-    0xbf,
-    0xf3,
-    0x3e,
-    0x58,
-    0x0b,
-    0x20,
-    0xc6,
-    0xd5,
-    0x93,
-    0xc4,
-    0x62,
-    0xac,
-    0x51,
-    0x06,
-    0x6c,
-    0x5d,
-    0x11,
-    0x8e,
-    0xbe,
-    0xeb,
-    0x1a,
-    0x97,
-    0x74,
-    0x90,
-    0x10,
-    0x45,
-    0xf4,
-    0xaf,
-    0x19,
-    0x39,
-    0x2c,
-    0x0a,
-    0x3f,
-    0x64,
-    0x1b,
-    0x35,
-    0x16,
-    0x18,
-    0x93,
-    0x4b,
-    0x9e,
-    0x65,
-    0x3d,
-    0xdf,
-    0x6a,
-    0xa2,
-    0xdd,
-    0x35,
-    0x02,
-    0x4a,
-    0xd7,
-    0xb2,
-    0x87,
-    0x0a,
-    0xf3,
-    0x92,
-    0x95,
-    0x17,
-    0x5d,
-    0xd9,
-    0x6d,
-    0xc5,
-    0xf0,
-    0x8c,
-    0x54,
-    0x56,
-    0xb3,
-    0x20,
-    0x36,
-    0x0f,
-    0xa4,
-    0x33,
-    0x8f,
-    0x92,
-    0xb5,
-    0x7a,
-    0x8c,
-    0x67,
-    0x15,
-    0xfb,
-    0x6d,
-    0xdc,
-    0xb0,
-    0x7c,
-    0x2d,
-    0x0f,
-    0xf9,
-    0x3b,
-    0x65,
-    0x49,
-    0xe7,
-    0xdf,
-    0x6e,
-    0x8d,
-    0x3d,
-    0xaf,
-    0xc5,
-    0x71,
-    0x0f,
-    0x02,
-    0xb4,
-    0x2d,
-    0x82,
-    0xf6,
-    0x2f,
-    0xf2,
-    0xd3,
-    0x65,
-    0xfd,
-    0x7d,
-    0x9b,
-    0x15,
-    0x18,
-    0xeb,
-    0x51,
-    0x2f,
-    0x55,
-    0xcf,
-    0x10,
-    0xf3,
-    0x47,
-    0x82,
-    0x9a,
-    0xa9,
-    0x61,
-    0xba,
-    0x9e,
-    0xdb,
-    0x5c,
-    0x5e,
-    0x36,
-    0xc1,
-    0xd8,
-    0x99,
-    0xb4,
-    0xfd,
-    0x46,
-    0x2e,
-    0x9e,
-    0x89,
-    0x05,
-    0x0b,
-    0xf7,
-    0xed,
-    0xcb,
-    0x20,
-    0xc0,
-    0xb5,
-    0x47,
-    0x71,
-    0xbf,
-    0x22,
-    0x05,
-    0x6a,
-    0x7f,
-    0x20,
-    0x91,
-    0x73,
-    0x98,
-    0x78,
-    0xdf,
-    0xc5,
-    0x30,
-    0x47,
-    0xea,
-    0x7c,
-    0xc2,
-    0xaf,
-    0x9c,
-    0xed,
-    0x1f,
-    0xcc,
-    0xee,
-    0x39,
-    0xb2,
-    0xe9,
-    0x50,
-    0x23,
-    0x07,
-    0xf4,
-    0x4b,
-    0x1e,
-    0x8f,
-    0x30,
-    0x65,
-    0xaa,
-    0x9d,
-    0x2a,
-    0x45,
-    0xe1,
-    0xb5,
-    0xee,
-    0x17,
-    0x4d,
-    0x06,
-    0x7a,
-    0x32,
-    0xfd,
-    0x35,
-    0x73,
-    0xf8,
-    0xd8,
-    0x5c,
-    0x17,
-    0xfe,
-    0x31,
-    0x53,
-    0x73,
-    0x6e,
-    0x9b,
-    0x2e,
-    0xd6,
-    0xa9,
-    0xfe,
-    0x06,
-    0x85,
-    0x30,
-    0xea,
-    0xfd,
-    0xb0,
-    0xc4,
-    0x2c,
-    0x7c,
-    0xa5,
-    0xcc,
-    0x9f,
-    0xbf,
-    0x44,
-    0xf8,
-    0x45,
-    0x94,
-    0xb3,
-    0x24,
-    0x96,
-    0x5f,
-    0x53,
-    0x7f,
-    0x18,
-    0x62,
-    0xf2,
-    0xec,
-    0x30,
-    0x3b,
-    0x42,
-    0xa8,
-    0x38,
-    0xae,
-    0x89,
-    0x2d,
-    0xd1,
-    0xa5,
-    0x9b,
-    0x57,
-    0x7b,
-    0x75,
-    0x06,
-    0xc6,
-    0x63,
-    0x63,
-    0x8c,
-    0x83,
-    0x7b,
-    0x67,
-    0xd6,
-    0xe6,
-    0xd0,
-    0x30,
-    0x66,
-    0xb7,
-    0x19,
-    0x67,
-    0xce,
-    0x93,
-    0x8b,
-    0x38,
-    0x1f,
-    0x91,
-    0xf5,
-    0x0f,
-    0xa5,
-    0x26,
-    0x08,
-    0x9f,
-    0xd1,
-    0x46,
-    0xf6,
-    0x29,
-    0x77,
-    0xcc,
-    0x40,
-    0xfb,
-    0x3a,
-    0x1c,
-    0xc8,
-    0x37,
-    0x44,
-    0x07,
-    0x2e,
-    0xd5,
-    0x3a,
-    0xef,
-    0x59,
-    0xeb,
-    0x6e,
-    0x2b,
-    0x54,
-    0x2c,
-    0x57,
-    0xac,
-    0x5c,
-    0xaf,
-    0x3f,
-    0xe1,
-    0x37,
-    0xf3,
-    0x3c,
-    0xd9,
-    0xc7,
-    0x1f,
-    0x61,
-    0xa8,
-    0xde,
-    0x8e,
-    0x35,
-    0x0b,
-    0x54,
-    0x8a,
-    0x64,
-    0x4f,
-    0x57,
-    0x58,
-    0xb5,
-    0x6e,
-    0x03,
-    0x76,
-    0x3c,
-    0x7c,
-    0x32,
-    0x20,
-    0xd1,
-    0x41,
-    0x96,
-    0x18,
-    0xc1,
-    0x28,
-    0x05,
-    0xa7,
-    0xc3,
-    0x58,
-    0x13,
-    0xdf,
-    0x2d,
-    0x20,
-    0xe6,
-    0x24,
-    0x67,
-    0x98,
-    0x46,
-    0xeb,
-    0xa0,
-    0x85,
-    0xf4,
-    0xc0,
-    0xc1,
-    0x7e,
-    0x3d,
-    0x8e,
-    0x9f,
-    0x4d,
-    0xce,
-    0x1b,
-    0x75,
-    0x98,
-    0xca,
-    0xd2,
-    0x91,
-    0xc1,
-    0x1a,
-    0xc5,
-    0x4d,
-    0x0a,
-    0x05,
-    0xf2,
-    0x41,
-    0xfd,
-    0x00,
-    0xc5,
-    0xb7,
-    0x0b,
-    0xc7,
-    0xdf,
-    0x5f,
-    0x73,
-    0xac,
-    0x16,
-    0x45,
-    0x65,
-    0x2f,
-    0xbd,
-    0xff,
-    0x67,
-    0xd0,
-    0x25,
-    0x2b,
-    0xf9,
-    0x21,
-    0x63,
-    0x19,
-    0x74,
-    0x1f,
-    0x54,
-    0xc4,
-    0x38,
-    0xc2,
-    0xdf,
-    0x07,
-    0x06,
-    0xd3,
-    0x7a,
-    0x0d,
-    0xab,
-    0xfe,
-    0xf0,
-    0x0a,
-    0xdf,
-    0x28,
-    0x61,
-    0x28,
-    0x6c,
-    0x03,
-    0x8a,
-    0xc5,
-    0x93,
-    0xdf,
-    0x46,
-    0xdb,
-    0xab,
-    0xc3,
-    0x55,
-    0xbf,
-    0x0b,
-    0xbc,
-    0x5d,
-    0x0f,
-    0x2a,
-    0x75,
-    0x2e,
-    0xe5,
-    0x05,
-    0x08,
-    0x4a,
-    0x51,
-    0xc1,
-    0x14,
-    0xa5,
-    0x07,
-    0x92,
-    0x10,
-    0xa9,
-    0x54,
-    0xdb,
-    0xde,
-    0x7d,
-    0x57,
-    0x97,
-    0xa3,
-    0x87,
-    0x6d,
-    0xf7,
-    0xd7,
-    0x30,
-    0xed,
-    0x4c,
-    0x98,
-    0xe7,
-    0x16,
-    0x28,
-    0x44,
-    0x68,
-    0x45,
-    0xc0,
-    0x46,
-    0x3e,
-    0x6b,
-    0x95,
-    0x30,
-    0x86,
-    0xbf,
-    0x54,
-    0x0b,
-    0xf7,
-    0xb0,
-    0xfa,
-    0xea,
-    0x1f,
-    0x1e,
-    0x3b,
-    0xc6,
-    0xef,
-    0xc9,
-    0x25,
-    0x85,
-    0x7a,
-    0x0a,
-    0x01,
-    0x5c,
-    0xfa,
-    0xc1,
-    0x7a,
-    0x57,
-    0x14,
-    0x8e,
-    0x01,
-    0x36,
-    0x5d,
-    0x44,
-    0x6f,
-    0x7b,
-    0x1c,
-    0x9a,
-    0xec,
-    0xc1,
-    0x52,
-    0x24,
-    0x10,
-    0x4f,
-    0xf7,
-    0x82,
-    0x49,
-    0xed,
-    0x87,
-    0xd8,
-    0x7d,
-    0xf7,
-    0xbd,
-    0x7e,
-    0xf0,
-    0xaf,
-    0x9e,
-    0xf8,
-    0x67,
-    0xd7,
-    0xba,
-    0x28,
-    0x8e,
-    0x80,
-    0xaf,
-    0xc2,
-    0x97,
-    0x1d,
-    0xee,
-    0x01,
-    0x24,
-    0xdb,
-    0xc2,
-    0x98,
-    0x67,
-    0x35,
-    0x8e,
-    0xec,
-    0x87,
-    0xc2,
-    0x56,
-    0x80,
-    0x46,
-    0x52,
-    0x80,
-    0xb0,
-    0xe2,
-    0x3a,
-    0xdc,
-    0xa3,
-    0x38,
-    0xec,
-    0xe3,
-    0x7b,
-    0x2f,
-    0xcb,
-    0x3c,
-    0xce,
-    0x54,
-    0x3d,
-    0x85,
-    0x5a,
-    0xc2,
-    0x01,
-    0x4f,
-    0xf4,
-    0x45,
-    0xc3,
-    0x6a,
-    0xc2,
-    0xbf,
-    0xed,
-    0x64,
-    0xaa,
-    0xca,
-    0xc1,
-    0x4c,
-    0x0a,
-    0x9e,
-    0xa5,
-    0xbb,
-    0xaa,
-    0x36,
-    0xbd,
-    0x16,
-    0xef,
-    0xae,
-    0xbf,
-    0x0d,
-    0x51,
-    0xf0,
-    0x03,
-    0x67,
-    0x0e,
-    0x8f,
-    0xda,
-    0x02,
-    0x20,
-    0xf3,
-    0x21,
-    0x15,
-    0x6d,
-    0xb7,
-    0x16,
-    0xb9,
-    0x3f,
-    0x4f,
-    0x6a,
-    0xa8,
-    0xf3,
-    0xee,
-    0x97,
-    0x44,
-    0xf5,
-    0xa6,
-    0x73,
-    0xdb,
-    0xec,
-    0xd2,
-    0x05,
-    0x29,
-    0x31,
-    0xb1,
-    0x98,
-    0x1e,
-    0x86,
-    0x53,
-    0x0f,
-    0xe2,
-    0x05,
-    0xb9,
-    0x78,
-    0x17,
-    0x56,
-    0x38,
-    0xe4,
-    0x5e,
-    0x25,
-    0x1e,
-    0x75,
-    0x1c,
-    0xd3,
-    0x98,
-    0xb8,
-    0x7e,
-    0x6c,
-    0xd3,
-    0x35,
-    0xba,
-    0xda,
-    0x62,
-    0x45,
-    0x98,
-    0x58,
-    0xe0,
-    0x24,
-    0x32,
-    0x29,
-    0xd6,
-    0x47,
-    0xf7,
-    0x89,
-    0xde,
-    0xf0,
-    0xf6,
-    0xe4,
-    0x09,
-    0xff,
-    0x5a,
-    0x46,
-    0x7f,
-    0x0b,
-    0x30,
-    0x13,
-    0x65,
-    0xb1,
-    0x71,
-    0xf8,
-    0x04,
-    0x2c,
-    0x3c,
-    0x21,
-    0x27,
-    0x26,
-    0x63,
-    0xac,
-    0xc4,
-    0xce,
-    0x29,
-    0x5e,
-    0xdf,
-    0x2b,
-    0x4a,
-    0x95,
-    0xac,
-    0xb0,
-    0x3c,
-    0x7e,
-    0xf4,
-    0x10,
-    0xb5,
-    0x88,
-    0xb9,
-    0x54,
-    0x6d,
-    0x19,
-    0x1d,
-    0x2a,
-    0x25,
-    0x7f,
-    0x80,
-    0x80,
-    0xe8,
-    0x29,
-    0xe9,
-    0x51,
-    0x91,
-    0x17,
-    0xa7,
-    0xbf,
-    0x8d,
-    0x8f,
-    0x38,
-    0x63,
-    0xe2,
-    0x12,
-    0x69,
-    0xe1,
-    0x70,
-    0x8e,
-    0xbf,
-    0xbf,
-    0x77,
-    0xd5,
-    0x16,
-    0x77,
-    0x5a,
-    0x4e,
-    0x88,
-    0xca,
-    0xa3,
-    0xea,
-    0x90,
-    0x58,
-    0x46,
-    0x5a,
-    0x6f,
-    0x6e,
-    0x2a,
-    0x80,
-    0xcf,
-    0x1f,
-    0xe5,
-    0x23,
-    0xa7,
-    0x96,
-    0xc8,
-    0xe6,
-    0x5e,
-    0xaa,
-    0x1b,
-    0x7b,
-    0x33,
-    0xb3,
-    0xa9,
-    0x14,
-    0xdc,
-    0x9c,
-    0x80,
-    0x1a,
-    0x6d,
-    0x3a,
-    0xf2,
-    0x22,
-    0x7c,
-    0xdc,
-    0xdf,
-    0x1d,
-    0x83,
-    0x24,
-    0x37,
-    0xce,
-    0x85,
-    0x15,
-    0xba,
-    0x82,
-    0xf5,
-    0x6c,
-    0x02,
-    0xfb,
-    0xd3,
-    0x34,
-    0xc4,
-    0xad,
-    0x18,
-    0x95,
-    0x53,
-    0x2d,
-    0x54,
-    0xed,
-    0x65,
-    0xe6,
-    0x96,
-    0x22,
-    0x1a,
-    0x0e,
-    0x8c,
-    0x36,
-    0x3a,
-    0xd8,
-    0xeb,
-    0x1b,
-    0xbe,
-    0xeb,
-    0x11,
-    0xc9,
-    0x93,
-    0x14,
-    0xea,
-    0x8f,
-    0x9a,
-    0x37,
-    0x10,
-    0xa6,
-    0xf3,
-    0x8c,
-    0x36,
-    0x0c,
-    0x7b,
-    0x07,
-    0xc6,
-    0x8f,
-    0x93,
-    0x18,
-    0xc9,
-    0x28,
-    0x24,
-    0x95,
-    0x08,
-    0x8b,
-    0xe0,
-    0xf5,
-    0x70,
-    0xfc,
-    0xca,
-    0xbe,
-    0xbb,
-    0x64,
-    0xf8,
-    0x40,
-    0x4d,
-    0xa4,
-    0x97,
-    0x84,
-    0x5c,
-    0x29,
-    0x31,
-    0x80,
-    0x54,
-    0xc1,
-    0x2b,
-    0x8c,
-    0x7a,
-    0xad,
-    0x92,
-    0x1a,
-    0xcf,
-    0xf7,
-    0x17,
-    0xa1,
-    0x37,
-    0x06,
-    0x57,
-    0xda,
-    0xda,
-    0x6f,
-    0x60,
-    0x2f,
-    0xcb,
-    0x0e,
-    0x71,
-    0x71,
-    0xe8,
-    0x56,
-    0x02,
-    0xc9,
-    0x01,
-    0xe5,
-    0x04,
-    0xf1,
-    0x3c,
-    0x5b,
-    0x6a,
-    0xa3,
-    0xb7,
-    0x6d,
-    0xe8,
-    0x52,
-    0x70,
-    0x35,
-    0xfb,
-    0x19,
-    0x62,
-    0xcc,
-    0x29,
-    0xf1,
-    0xf1,
-    0x1b,
-    0x8a,
-    0x26,
-    0x88,
-    0xee,
-    0x87,
-    0x0c,
-    0x81,
-    0x4a,
-    0xe2,
-    0xee,
-    0x45,
-    0x01,
-    0xf7,
-    0x47,
-    0xb4,
-    0x83,
-    0x41,
-    0x34,
-    0xc7,
-    0xf7,
-    0x1f,
-    0x2a,
-    0x73,
-    0x8b,
-    0xd8,
-    0xe4,
-    0xd1,
-    0x08,
-    0xdd,
-    0xa0,
-    0x7d,
-    0xa9,
-    0x4f,
-    0x8b,
-    0x3c,
-    0x2d,
-    0xc1,
-    0x7a,
-    0xe1,
-    0x2b,
-    0x3f,
-    0xda,
-    0x71,
-    0xa6,
-    0x8f,
-    0xea,
-    0x85,
-    0xe1,
-    0xb6,
-    0x28,
-    0xf0,
-    0x74,
-    0xbf,
-    0x08,
-    0xa2,
-    0xa0,
-    0xb7,
-    0xec,
-    0xcc,
-    0xe0,
-    0xfc,
-    0x51,
-    0x45,
-    0xc0,
-    0xb8,
-    0x46,
-    0x2d,
-    0xf2,
-    0xa8,
-    0x23,
-    0xd0,
-    0x9f,
-    0x22,
-    0x77,
-    0xcc,
-    0xfb,
-    0x56,
-    0x42,
-    0x77,
-    0x1c,
-    0xd4,
-    0x65,
-    0x7b,
-    0x0c,
-    0x4e,
-    0x56,
-    0xc3,
-    0x1d,
-    0x9f,
-    0x18,
-    0x9b,
-    0x7c,
-    0x0d,
-    0x6b,
-    0x12,
-    0x09,
-    0xcb,
-    0x40,
-    0xa3,
-    0x66,
-    0xc2,
-    0x6f,
-    0x15,
-    0x4e,
-    0x92,
-    0xac,
-    0xa0,
-    0x29,
-    0xd3,
-    0xb8,
-    0x51,
-    0xdd,
-    0xa0,
-    0xd4,
-    0xb0,
-    0xe6,
-    0x56,
-    0x7b,
-    0x9f,
-    0xa9,
-    0x99,
-    0x50,
-    0x85,
-    0x05,
-    0x98,
-    0x56,
-    0xac,
-    0x2c,
-    0x92,
-    0x5f,
-    0xe8,
-    0xb1,
-    0x9a,
-    0xc7,
-    0x7a,
-    0xe2,
-    0x97,
-    0x61,
-    0x33,
-    0x57,
-    0x8e,
-    0xb2,
-    0xdd,
-    0xcb,
-    0x24,
-    0x5d,
-    0xd6,
-    0x2b,
-    0x5e,
-    0xdf,
-    0xfe,
-    0xed,
-    0xac,
-    0x7c,
-    0xd3,
-    0xa3,
-    0x26,
-    0x79,
-    0xdb,
-    0xd0,
-    0x15,
-    0x8c,
-    0x43,
-    0xfa,
-    0xb5,
-    0x91,
-    0xc5,
-    0x00,
-    0x39,
-    0x7e,
-    0xcf,
-    0xae,
-    0x10,
-    0x99,
-    0xe1,
-    0x8f,
-    0x67,
-    0xe9,
-    0x36,
-    0x02,
-    0xef,
-    0xea,
-    0xa8,
-    0x90,
-    0xe0,
-    0x85,
-    0xce,
-    0x7d,
-    0x3e,
-    0x3e,
-    0x67,
-    0x9d,
-    0x5b,
-    0xb0,
-    0xfb,
-    0x69,
-    0x9d,
-    0x36,
-    0xbf,
-    0x52,
-    0x81,
-    0xec,
-    0xba,
-    0x56,
-    0xe0,
-    0xd6,
-    0x26,
-    0xd0,
-    0x71,
-    0x5e,
-    0x19,
-    0x94,
-    0x90,
-    0x04,
-    0x64,
-    0x3b,
-    0x3d,
-    0x51,
-    0xbb,
-    0xbc,
-    0x68,
-    0x0c,
-    0x17,
-    0x3d,
-    0x6c,
-    0xb1,
-    0x59,
-    0x28,
-    0xd9,
-    0x1f,
-    0x30,
-    0x80,
-    0x76,
-    0x91,
-    0x3c,
-    0x76,
-    0x86,
-    0xcf,
-    0x74,
-    0x37,
-    0x4b,
-    0xa6,
-    0xc5,
-    0x09,
-    0xc9,
-    0x95,
-    0xfb,
-    0x96,
-    0xcc,
-    0xc9,
-    0xe5,
-    0x87,
-    0x2c,
-    0x4c,
-    0xb4,
-    0x55,
-    0x50,
-    0x79,
-    0xa5,
-    0x5c,
-    0xf1,
-    0xb3,
-    0xe0,
-    0x32,
-    0x20,
-    0x56,
-    0x9f,
-    0x36,
-    0x8b,
-    0xee,
-    0x92,
-    0x6c,
-    0xfc,
-    0xa7,
-    0x83,
-    0x88,
-    0x22,
-    0x05,
-    0x36,
-    0x48,
-    0x94,
-    0xd5,
-    0x93,
-    0x07,
-    0x13,
-    0x64,
-    0x06,
-    0x90,
-    0x0f,
-    0xee,
-    0x27,
-    0x30,
-    0x6d,
-    0x59,
-    0x96,
-    0x0f,
-    0x88,
-    0x23,
-    0x29,
-    0xbf,
-    0x76,
-    0x9a,
-    0x4a,
-    0x16,
-    0x8c,
-    0x4b,
-    0x9a,
-    0x39,
-    0x24,
-    0xbc,
-    0xdb,
-    0xfa,
-    0x9d,
-    0x5e,
-    0x0c,
-    0x64,
-    0xa4,
-    0xbd,
-    0xd5,
-    0x93,
-    0xb2,
-    0xfa,
-    0x26,
-    0xca,
-    0xd6,
-    0x7b,
-    0x1c,
-    0xbf,
-    0xb5,
-    0xe1,
-    0x24,
-    0x39,
-    0xcf,
-    0x3a,
-    0x62,
-    0xdd,
-    0x04,
-    0x78,
-    0x54,
-    0x45,
-    0x56,
-    0x23,
-    0xb2,
-    0x53,
-    0xf0,
-    0x4a,
-    0x99,
-    0xc5,
-    0x68,
-    0xbf,
-    0xe9,
-    0x09,
-    0x41,
-    0x84,
-    0xec,
-    0x52,
-    0xb4,
-    0x80,
-    0x38,
-    0xeb,
-    0xaf,
-    0x76,
-    0xd6,
-    0xcc,
-    0x1f,
-    0x38,
-    0xa3,
-    0x6b,
-    0x6b,
-    0x18,
-    0xf7,
-    0xd4,
-    0x40,
-    0xa0,
-    0x85,
-    0xfc,
-    0x94,
-    0x83,
-    0x82,
-    0x52,
-    0xe5,
-    0xd2,
-    0x0a,
-    0x98,
-    0xc2,
-    0x73,
-    0xbf,
-    0xf1,
-    0x8d,
-    0xd0,
-    0xb3,
-    0x3b,
-    0x7f,
-    0xcc,
-    0x88,
-    0x9e,
-    0xec,
-    0xfb,
-    0xd5,
-    0x65,
-    0xc9,
-    0x12,
-    0xcc,
-    0x0d,
-    0x6b,
-    0x9c,
-    0x1a,
-    0x9c,
-    0x91,
-    0xef,
-    0x0f,
-    0x35,
-    0xa5,
-    0x5f,
-    0xff,
-    0xe8,
-    0x3f,
-    0xb1,
-    0xe8,
-    0xce,
-    0xeb,
-    0xd3,
-    0x54,
-    0x56,
-    0x2c,
-    0xca,
-    0x81,
-    0xda,
-    0xc1,
-    0xeb,
-    0xc0,
-    0x76,
-    0x26,
-    0x4e,
-    0x1b,
-    0x19,
-    0x5e,
-    0x80,
-    0x3a,
-    0xdc,
-    0xf0,
-    0x78,
-    0x88,
-    0x93,
-    0x30,
-    0xcc,
-    0x91,
-    0xa2,
-    0xbf,
-    0x25,
-    0xae,
-    0x13,
-    0x55,
-    0xf1,
-    0xe5,
-    0xe5,
-    0xbe,
-    0x57,
-    0x0b,
-    0xa6,
-    0x23,
-    0x70,
-    0x2b,
-    0x44,
-    0x8b,
-    0xb4,
-    0x2c,
-    0x20,
-    0xa1,
-    0xb2,
-    0xad,
-    0x64,
-    0xb8,
-    0x05,
-    0x34,
-    0x97,
-    0x0c,
-    0x83,
-    0x88,
-    0x6e,
-    0x4b,
-    0xb7,
-    0x5b,
-    0xe5,
-    0x54,
-    0x92,
-    0x2c,
-    0x8f,
-    0x3e,
-    0x5d,
-    0x6c,
-    0x2a,
-    0x9c,
-    0xf2,
-    0xe0,
-    0x77,
-    0xff,
-    0x2c,
-    0x46,
-    0x49,
-    0xbd,
-    0x9c,
-    0x3b,
-    0xdb,
-    0xf1,
-    0x7d,
-    0x5c,
-    0x66,
-    0xc3,
-    0xea,
-    0xac,
-    0xf3,
-    0xea,
-    0x4f,
-    0x36,
-    0x6e,
-    0x6f,
-    0x1e,
-    0xf3,
-    0xfd,
-    0xb3,
-    0xc3,
-    0xed,
-    0x90,
-    0xb3,
-    0xd9,
-    0xa5,
-    0xb8,
-    0x8b,
-    0x9e,
-    0xb2,
-    0xbc,
-    0x39,
-    0xa4,
-    0xac,
-    0xea,
-    0xa4,
-    0xca,
-    0x48,
-    0x2b,
-    0xdd,
-    0x6b,
-    0xc4,
-    0xda,
-    0xa4,
-    0xd5,
-    0x86,
-    0xd6,
-    0x2e,
-    0xfd,
-    0x00,
-    0xd6,
-    0x25,
-    0x71,
-    0xd6,
-    0xfd,
-    0xf1,
-    0x8d,
-    0x43,
-    0xaf,
-    0x36,
-    0xf2,
-    0xb9,
-    0xa2,
-    0x9d,
-    0x34,
-    0xc7,
-    0x38,
-    0xd8,
-    0xd3,
-    0x40,
-    0x0c,
-    0xe0,
-    0x6d,
-    0x9a,
-    0xca,
-    0x81,
-    0x31,
-    0x94,
-    0x45,
-    0x19,
-    0x97,
-    0x1b,
-    0xc3,
-    0x9d,
-    0x4e,
-    0x6f,
-    0x9b,
-    0xdc,
-    0x76,
-    0x82,
-    0x03,
-    0x08,
-    0x10,
-    0xa1,
-    0x23,
-    0x72,
-    0xb3,
-    0x55,
-    0x6e,
-    0x95,
-    0x80,
-    0x8c,
-    0x31,
-    0x56,
-    0x58,
-    0xf4,
-    0x6c,
-    0x8a,
-    0x4c,
-    0xa8,
-    0xe2,
-    0xb9,
-    0x54,
-    0x0e,
-    0x6c,
-    0x21,
-    0x44,
-    0xff,
-    0x92,
-    0xfe,
-    0xfd,
-    0x29,
-    0x5c,
-    0x09,
-    0xe0,
-    0xb2,
-    0x66,
-    0x3f,
-    0x89,
-    0x1e,
-    0x33,
-    0xe3,
-    0xb9,
-    0x73,
-    0xc3,
-    0xc6,
-    0x93,
-    0x9b,
-    0x68,
-    0xc6,
-    0x0c,
-    0x09,
-    0xd5,
-    0x95,
-    0x9d,
-    0xa0,
-    0x78,
-    0xbc,
-    0x3a,
-    0xd0,
-    0x0a,
-    0xdf,
-    0x88,
-    0x02,
-    0x64,
-    0x42,
-    0x4b,
-    0x36,
-    0x94,
-    0x8c,
-    0x1d,
-    0xea,
-    0x30,
-    0xcb,
-    0x66,
-    0x3e,
-    0xea,
-    0xb9,
-    0x88,
-    0x57,
-    0x65,
-    0x3e,
-    0x5a,
-    0x01,
-    0x47,
-    0x35,
-    0xd8,
-    0x98,
-    0x90,
-    0x73,
-    0x19,
-    0x28,
-    0x2a,
-    0x05,
-    0x81,
-    0xd3,
-    0xc0,
-    0xba,
-    0x37,
-    0x73,
-    0xd4,
-    0xe2,
-    0xd9,
-    0x81,
-    0x0c,
-    0x54,
-    0x6f,
-    0x36,
-    0xcd,
-    0xb6,
-    0x9e,
-    0xef,
-    0x0b,
-    0xf8,
-    0x1f,
-    0xd6,
-    0x60,
-    0x22,
-    0x6f,
-    0xbf,
-    0x5b,
-    0x50,
-    0xc7,
-    0x50,
-    0x1a,
-    0xfa,
-    0x4e,
-    0x65,
-    0x1b,
-    0x79,
-    0x8e,
-    0xb2,
-    0x4f,
-    0xc7,
-    0x24,
-    0xab,
-    0x70,
-    0x87,
-    0xbc,
-    0xa0,
-    0x95,
-    0x45,
-    0x3d,
-    0x2d,
-    0x04,
-    0xfe,
-    0x41,
-    0xd1,
-    0x47,
-    0xe3,
-    0xc8,
-    0xdd,
-    0x82,
-    0x5a,
-    0x2d,
-    0x90,
-    0x03,
-    0x46,
-    0x59,
-    0x80,
-    0x1b,
-    0x88,
-    0x36,
-    0x3b,
-    0x2c,
-    0xc6,
-    0x66,
-    0x2f,
-    0x04,
-    0x6a,
-    0x36,
-    0xc7,
-    0x69,
-    0xee,
-    0xcd,
-    0xd7,
-    0xf5,
-    0x58,
-    0xaa,
-    0x3a,
-    0x25,
-    0x00,
-    0x4d,
-    0xba,
-    0xac,
-    0x99,
-    0x33,
-    0x2f,
-    0x0d,
-    0x6f,
-    0x08,
-    0xeb,
-    0x68,
-    0xee,
-    0x19,
-    0x56,
-    0x94,
-    0x64,
-    0x08,
-    0xd6,
-    0x6f,
-    0x08,
-    0xc3,
-    0xf2,
-    0x72,
-    0x3a,
-    0xb6,
-    0xb6,
-    0x89,
-    0x0c,
-    0x40,
-    0x59,
-    0x21,
-    0x02,
-    0x64,
-    0x1d,
-    0x82,
-    0x16,
-    0xc2,
-    0x77,
-    0x5f,
-    0xff,
-    0xc5,
-    0x70,
-    0xab,
-    0xb3,
-    0x1d,
-    0x4b,
-    0xaf,
-    0x2b,
-    0x70,
-    0x68,
-    0x5a,
-    0x66,
-    0x4c,
-    0x68,
-    0xd8,
-    0xb0,
-    0x61,
-    0x92,
-    0x66,
-    0x24,
-    0xed,
-    0x75,
-    0x64,
-    0x70,
-    0x77,
-    0xcf,
-    0xab,
-    0xd8,
-    0xc0,
-    0xae,
-    0x22,
-    0x7e,
-    0xf7,
-    0xd5,
-    0x8c,
-    0xe0,
-    0x2c,
-    0x61,
-    0xa4,
-    0xa2,
-    0x07,
-    0xad,
-    0x6c,
-    0x8e,
-    0xba,
-    0x72,
-    0xc2,
-    0xd9,
-    0x34,
-    0x33,
-    0x34,
-    0xa7,
-    0x97,
-    0xd8,
-    0x15,
-    0xd2,
-    0xed,
-    0x99,
-    0xd0,
-    0xe7,
-    0x17,
-    0x1d,
-    0x7d,
-    0x72,
-    0x05,
-    0xe3,
-    0xb2,
-    0x7c,
-    0x2d,
-    0xe2,
-    0x9c,
-    0x51,
-    0x35,
-    0x6c,
-    0x4e,
-    0x87,
-    0xf3,
-    0x58,
-    0x58,
-    0x3b,
-    0x98,
-    0x60,
-    0x9c,
-    0x9e,
-    0x28,
-    0xc8,
-    0x5d,
-    0xb1,
-    0x2e,
-    0x41,
-    0x99,
-    0x4c,
-    0xad,
-    0x0c,
-    0x99,
-    0x65,
-    0x59,
-    0x62,
-    0xc6,
-    0x8f,
-    0x07,
-    0x14,
-    0xbe,
-    0xc1,
-    0x63,
-    0x6f,
-    0xa7,
-    0x59,
-    0xe1,
-    0x62,
-    0xc4,
-    0x60,
-    0xf6,
-    0xe3,
-    0x45,
-    0x10,
-    0x87,
-    0x8e,
-    0x64,
-    0x93,
-    0xa2,
-    0x8f,
-    0xad,
-    0x0e,
-    0x6c,
-    0xc3,
-    0x9d,
-    0xde,
-    0x5a,
-    0x1a,
-    0x6f,
-    0x22,
-    0xa4,
-    0x40,
-    0x33,
-    0x79,
-    0xf7,
-    0x7c,
-    0x20,
-    0x0d,
-    0x6b,
-    0xd8,
-    0x2b,
-    0xd0,
-    0xb4,
-    0x82,
-    0xd9,
-    0x05,
-    0x9c,
-    0x72,
-    0x51,
-    0x03,
-    0xb1,
-    0x4d,
-    0xb5,
-    0x35,
-    0x3a,
-    0x89,
-    0xb2,
-    0x66,
-    0x70,
-    0xd3,
-    0x56,
-    0x3b,
-    0xeb,
-    0xad,
-    0x22,
-    0x01,
-    0x5b,
-    0x5c,
-    0x61,
-    0xa9,
-    0x78,
-    0x01,
-    0xb8,
-    0x11,
-    0x3c,
-    0x06,
-    0xfd,
-    0x86,
-    0x4f,
-    0xbb,
-    0x4c,
-    0x86,
-    0xc3,
-    0x41,
-    0x58,
-    0xca,
-    0x01,
-    0xa8,
-    0x00,
-    0x84,
-    0x03,
-    0x54,
-    0x23,
-    0xe5,
-    0xc4,
-    0xa5,
-    0xb4,
-    0xe2,
-    0xf5,
-    0xd7,
-    0x11,
-    0x38,
-    0xf2,
-    0x26,
-    0x90,
-    0xad,
-    0xf4,
-    0x36,
-    0x5b,
-    0x99,
-    0x88,
-    0xb3,
-    0x7f,
-    0xa6,
-    0x40,
-    0x34,
-    0x3f,
-    0xd4,
-    0xa8,
-    0x66,
-    0xae,
-    0xc0,
-    0x7b,
-    0x66,
-    0x7d,
-    0x25,
-    0x17,
-    0x6e,
-    0x11,
-    0xa3,
-    0x2f,
-    0xb4,
-    0xd8,
-    0xbf,
-    0xc0
-  ],
-  const [
-    0xa2,
-    0x49,
-    0x53,
-    0xa8,
-    0x00,
-    0xe0,
-    0xb7,
-    0x3b,
-    0x45,
-    0x54,
-    0xd4,
-    0xbe,
-    0x70,
-    0xf6,
-    0xc1,
-    0xba,
-    0x76,
-    0x38,
-    0x3e,
-    0xbe,
-    0x38,
-    0xca,
-    0x47,
-    0xa6,
-    0xb2,
-    0x02,
-    0xe9,
-    0x1d,
-    0x75,
-    0x81,
-    0x55,
-    0x61,
-    0x57,
-    0x14,
-    0x33,
-    0x47,
-    0x69,
-    0xd8,
-    0x38,
-    0x7e,
-    0x29,
-    0xa2,
-    0xfb,
-    0x17,
-    0xf9,
-    0x9d,
-    0x04,
-    0x45,
-    0xd0,
-    0x35,
-    0x26,
-    0x62,
-    0x30,
-    0x34,
-    0x10,
-    0x33,
-    0x58,
-    0x2b,
-    0x1e,
-    0x6d,
-    0xba,
-    0x14,
-    0x75,
-    0x78,
-    0xaf,
-    0x35,
-    0x4e,
-    0x72,
-    0x6a,
-    0x48,
-    0x92,
-    0x77,
-    0x2a,
-    0xd8,
-    0xa8,
-    0x20,
-    0xb4,
-    0xee,
-    0x8a,
-    0x49,
-    0x01,
-    0xed,
-    0x1f,
-    0x18,
-    0x34,
-    0xbb,
-    0xc5,
-    0x3b,
-    0xcf,
-    0x21,
-    0x2c,
-    0x70,
-    0x25,
-    0x75,
-    0x6b,
-    0x4b,
-    0x13,
-    0x76,
-    0x4d,
-    0x34,
-    0xeb,
-    0x77,
-    0xec,
-    0xaf,
-    0xb1,
-    0xc0,
-    0x82,
-    0xe0,
-    0x8a,
-    0x31,
-    0x7b,
-    0x4e,
-    0x71,
-    0x28,
-    0xcf,
-    0xe7,
-    0x2c,
-    0xa5,
-    0x8e,
-    0x44,
-    0x7e,
-    0xac,
-    0xbd,
-    0x2f,
-    0x9f,
-    0xeb,
-    0x60,
-    0x62,
-    0xe9,
-    0x9d,
-    0xd8,
-    0x92,
-    0xd4,
-    0xae,
-    0x6f,
-    0xac,
-    0x24,
-    0x20,
-    0x32,
-    0x5f,
-    0x61,
-    0xad,
-    0xff,
-    0xda,
-    0x88,
-    0xae,
-    0xde,
-    0xd7,
-    0x00,
-    0x3b,
-    0x94,
-    0xd8,
-    0xcf,
-    0x94,
-    0x76,
-    0xb0,
-    0x0e,
-    0xbf,
-    0x7c,
-    0x46,
-    0x9a,
-    0x73,
-    0x96,
-    0x96,
-    0x0d,
-    0x35,
-    0x43,
-    0xf8,
-    0xed,
-    0xc1,
-    0x5f,
-    0xa5,
-    0x23,
-    0xab,
-    0x3c,
-    0x77,
-    0xae,
-    0x46,
-    0xf5,
-    0xf0,
-    0x98,
-    0xc5,
-    0xff,
-    0x7e,
-    0x29,
-    0xa0,
-    0x01,
-    0xfd,
-    0x5c,
-    0x3a,
-    0xe6,
-    0x7e,
-    0x8f,
-    0xc0,
-    0x30,
-    0x47,
-    0x7e,
-    0x54,
-    0x8f,
-    0x1b,
-    0x72,
-    0x6b,
-    0xb2,
-    0xbb,
-    0xb6,
-    0x73,
-    0x5d,
-    0xac,
-    0x4b,
-    0xba,
-    0xbc,
-    0x3b,
-    0xdc,
-    0x8b,
-    0xf7,
-    0xbf,
-    0xf4,
-    0x9a,
-    0x06,
-    0x1e,
-    0x6f,
-    0xa1,
-    0xc7,
-    0x92,
-    0x2f,
-    0x4c,
-    0x4d,
-    0xad,
-    0x10,
-    0x53,
-    0x7b,
-    0x9b,
-    0x1d,
-    0xe5,
-    0xd2,
-    0xa8,
-    0x04,
-    0x4d,
-    0x88,
-    0x01,
-    0xc7,
-    0xd0,
-    0xda,
-    0xbf,
-    0xb5,
-    0xd4,
-    0xa3,
-    0x21,
-    0x99,
-    0x48,
-    0x2c,
-    0x19,
-    0x31,
-    0x3f,
-    0x46,
-    0x0b,
-    0xe1,
-    0xde,
-    0x96,
-    0xd1,
-    0xa9,
-    0x79,
-    0x31,
-    0x02,
-    0x55,
-    0xf9,
-    0x69,
-    0x74,
-    0xf3,
-    0x81,
-    0xe6,
-    0xff,
-    0x8a,
-    0x51,
-    0xf8,
-    0x84,
-    0x09,
-    0xea,
-    0x2b,
-    0x2e,
-    0x7e,
-    0x72,
-    0x1c,
-    0xf8,
-    0x88,
-    0x5b,
-    0x8c,
-    0x70,
-    0x0f,
-    0x40,
-    0xb3,
-    0xba,
-    0x32,
-    0x0f,
-    0xd6,
-    0xd7,
-    0x81,
-    0x6d,
-    0x1c,
-    0x28,
-    0x6d,
-    0x56,
-    0x9e,
-    0x2d,
-    0xfc,
-    0x04,
-    0xbd,
-    0x93,
-    0xc2,
-    0x13,
-    0xb8,
-    0x6e,
-    0x0c,
-    0xe2,
-    0x7e,
-    0xc3,
-    0x5e,
-    0x3c,
-    0xc0,
-    0x49,
-    0x20,
-    0x38,
-    0x4b,
-    0x70,
-    0x94,
-    0x5d,
-    0x95,
-    0xa3,
-    0x0b,
-    0x0a,
-    0x95,
-    0xca,
-    0x59,
-    0x15,
-    0xd8,
-    0x14,
-    0x86,
-    0xb3,
-    0xd2,
-    0xf3,
-    0xc6,
-    0x98,
-    0x72,
-    0x68,
-    0xab,
-    0x5f,
-    0xf9,
-    0x80,
-    0x9a,
-    0x2b,
-    0x0b,
-    0x1f,
-    0x7c,
-    0x8f,
-    0x06,
-    0xfc,
-    0xb5,
-    0xab,
-    0x94,
-    0xed,
-    0x5a,
-    0x98,
-    0x7c,
-    0x65,
-    0x9e,
-    0x07,
-    0xbe,
-    0x3a,
-    0x8e,
-    0x24,
-    0xde,
-    0xac,
-    0xff,
-    0xc1,
-    0x80,
-    0xa4,
-    0xc4,
-    0xb0,
-    0x35,
-    0x39,
-    0x24,
-    0x70,
-    0x95,
-    0x78,
-    0x8b,
-    0x0d,
-    0x8e,
-    0x65,
-    0x7f,
-    0x41,
-    0xfb,
-    0x3d,
-    0xd6,
-    0xdf,
-    0x78,
-    0xfe,
-    0x26,
-    0x71,
-    0x75,
-    0x29,
-    0x7e,
-    0x20,
-    0x8a,
-    0xc7,
-    0x53,
-    0xd5,
-    0x0a,
-    0xaa,
-    0xbd,
-    0x9e,
-    0xdb,
-    0xf5,
-    0xe4,
-    0x53,
-    0x85,
-    0xdf,
-    0xb4,
-    0x79,
-    0x88,
-    0xb3,
-    0xd9,
-    0x66,
-    0xf3,
-    0x1b,
-    0xe7,
-    0xa6,
-    0x32,
-    0x9f,
-    0xd8,
-    0x9e,
-    0x28,
-    0x69,
-    0xbc,
-    0x6f,
-    0x7e,
-    0x4b,
-    0xac,
-    0x1e,
-    0x3a,
-    0x03,
-    0x00,
-    0xf1,
-    0x93,
-    0xbd,
-    0xc2,
-    0x1c,
-    0x03,
-    0xd9,
-    0x62,
-    0x9c,
-    0x9f,
-    0xef,
-    0xaa,
-    0x64,
-    0xa4,
-    0x10,
-    0xf5,
-    0xb7,
-    0x52,
-    0x4f,
-    0x9c,
-    0xd5,
-    0xfd,
-    0x80,
-    0xb2,
-    0xd9,
-    0x61,
-    0x40,
-    0xf1,
-    0xe2,
-    0x36,
-    0x36,
-    0xf3,
-    0x71,
-    0x04,
-    0x98,
-    0xa6,
-    0x12,
-    0x39,
-    0xf0,
-    0xfa,
-    0x3f,
-    0x79,
-    0x20,
-    0xdc,
-    0x81,
-    0x35,
-    0xa3,
-    0x68,
-    0xd8,
-    0x7f,
-    0x17,
-    0x5a,
-    0x5d,
-    0x1c,
-    0xf8,
-    0xc6,
-    0x26,
-    0xdb,
-    0xaf,
-    0x0a,
-    0x6a,
-    0x26,
-    0xcb,
-    0x00,
-    0xe5,
-    0xd7,
-    0x8e,
-    0x78,
-    0x7e,
-    0x4d,
-    0xab,
-    0xe5,
-    0x28,
-    0xbe,
-    0x4e,
-    0x56,
-    0x06,
-    0xce,
-    0x5d,
-    0xa8,
-    0xd2,
-    0x61,
-    0xfd,
-    0xfa,
-    0x7f,
-    0xae,
-    0x59,
-    0x62,
-    0x1d,
-    0x96,
-    0x9f,
-    0xde,
-    0xfe,
-    0x33,
-    0x4a,
-    0x8e,
-    0x17,
-    0xb3,
-    0xa7,
-    0x20,
-    0xa8,
-    0x67,
-    0x92,
-    0x8b,
-    0x20,
-    0x17,
-    0x81,
-    0x00,
-    0x3b,
-    0x99,
-    0xc5,
-    0x1d,
-    0x6d,
-    0xa1,
-    0x0c,
-    0x65,
-    0x83,
-    0xdb,
-    0x29,
-    0xed,
-    0x88,
-    0x37,
-    0x18,
-    0x57,
-    0xe5,
-    0x85,
-    0x3c,
-    0x04,
-    0xcd,
-    0x41,
-    0xec,
-    0x86,
-    0xd8,
-    0xb0,
-    0x2e,
-    0x54,
-    0xee,
-    0x2c,
-    0xc2,
-    0xc2,
-    0x67,
-    0xbb,
-    0x63,
-    0x30,
-    0x70,
-    0xe7,
-    0x49,
-    0x81,
-    0xb1,
-    0xca,
-    0xf2,
-    0xcf,
-    0x2d,
-    0x69,
-    0x22,
-    0x5c,
-    0x69,
-    0x43,
-    0x29,
-    0xcc,
-    0xd0,
-    0x29,
-    0x64,
-    0x92,
-    0x56,
-    0x4f,
-    0x06,
-    0xa9,
-    0x5c,
-    0xa4,
-    0x18,
-    0x84,
-    0xd3,
-    0x5f,
-    0xbf,
-    0x47,
-    0xa5,
-    0xda,
-    0xbe,
-    0x37,
-    0x50,
-    0xa4,
-    0x3b,
-    0x6f,
-    0xd4,
-    0xd2,
-    0xc6,
-    0xd6,
-    0xd0,
-    0x95,
-    0x97,
-    0x4d,
-    0xe8,
-    0x12,
-    0x17,
-    0x2d,
-    0x69,
-    0x6d,
-    0xa3,
-    0xf0,
-    0x30,
-    0x27,
-    0x8c,
-    0x2e,
-    0xc8,
-    0xab,
-    0x62,
-    0xcc,
-    0xd2,
-    0x23,
-    0x72,
-    0x70,
-    0xaa,
-    0x90,
-    0x8d,
-    0x37,
-    0x47,
-    0x1a,
-    0x0b,
-    0xab,
-    0x63,
-    0xa4,
-    0x10,
-    0xef,
-    0xdc,
-    0xa4,
-    0x0e,
-    0x3d,
-    0x5b,
-    0x32,
-    0x8b,
-    0x93,
-    0x33,
-    0x5f,
-    0x25,
-    0xa8,
-    0x8c,
-    0xc7,
-    0xd3,
-    0x25,
-    0xc0,
-    0x6a,
-    0x6d,
-    0x12,
-    0x05,
-    0xb7,
-    0x6f,
-    0x8e,
-    0x4d,
-    0xea,
-    0xfa,
-    0xc4,
-    0x6a,
-    0x98,
-    0x1b,
-    0x1a,
-    0x76,
-    0x88,
-    0x50,
-    0xab,
-    0x72,
-    0xc5,
-    0x48,
-    0xf8,
-    0x2d,
-    0xf1,
-    0xeb,
-    0xda,
-    0x67,
-    0xdc,
-    0x9a,
-    0xbc,
-    0x37,
-    0x56,
-    0xb8,
-    0x06,
-    0xaa,
-    0x41,
-    0x69,
-    0xdc,
-    0xad,
-    0xea,
-    0x99,
-    0x09,
-    0x2d,
-    0x99,
-    0x41,
-    0x36,
-    0x7c,
-    0x66,
-    0xe5,
-    0x60,
-    0xf7,
-    0x4f,
-    0x62,
-    0x89,
-    0xe6,
-    0x88,
-    0xe6,
-    0xad,
-    0xa3,
-    0x12,
-    0x40,
-    0xf7,
-    0xff,
-    0x8f,
-    0x5a,
-    0x35,
-    0xe1,
-    0x55,
-    0x03,
-    0x8a,
-    0x30,
-    0xc1,
-    0xf2,
-    0x62,
-    0xf3,
-    0xcd,
-    0x08,
-    0xab,
-    0xb7,
-    0xe5,
-    0xd6,
-    0x43,
-    0x31,
-    0xf7,
-    0x5f,
-    0xac,
-    0x25,
-    0xca,
-    0x1f,
-    0x07,
-    0x87,
-    0x90,
-    0x4c,
-    0x40,
-    0xdf,
-    0xbe,
-    0x5b,
-    0x86,
-    0xf2,
-    0x1b,
-    0xc6,
-    0xfe,
-    0x9e,
-    0x17,
-    0x0d,
-    0xb8,
-    0x06,
-    0x5f,
-    0xfb,
-    0xe2,
-    0xef,
-    0xae,
-    0x2a,
-    0x3b,
-    0x6a,
-    0xe6,
-    0xc9,
-    0xcb,
-    0xb4,
-    0x5f,
-    0x9d,
-    0xd2,
-    0x5a,
-    0x7f,
-    0x46,
-    0xfe,
-    0xa0,
-    0x8b,
-    0xc4,
-    0xe0,
-    0x24,
-    0xbc,
-    0x39,
-    0xa1,
-    0xbf,
-    0x96,
-    0xf0,
-    0xf1,
-    0xac,
-    0x75,
-    0x9f,
-    0x41,
-    0xec,
-    0x69,
-    0xe9,
-    0x32,
-    0xe8,
-    0x43,
-    0x27,
-    0x4d,
-    0x59,
-    0xf0,
-    0x68,
-    0xf4,
-    0x65,
-    0x06,
-    0xb6,
-    0x98,
-    0x0a,
-    0x9d,
-    0x9c,
-    0x2d,
-    0xc0,
-    0x60,
-    0xe5,
-    0xdb,
-    0x5a,
-    0xe4,
-    0xa5,
-    0xf7,
-    0x2e,
-    0x38,
-    0x7e,
-    0x31,
-    0x75,
-    0xbd,
-    0x1c,
-    0x0f,
-    0xf5,
-    0x37,
-    0x02,
-    0x9a,
-    0xdd,
-    0x25,
-    0x89,
-    0x57,
-    0xf0,
-    0x4e,
-    0x25,
-    0x78,
-    0xe5,
-    0x9d,
-    0xeb,
-    0x54,
-    0x0e,
-    0x2e,
-    0x50,
-    0x15,
-    0x39,
-    0xa9,
-    0x34,
-    0xb0,
-    0xd4,
-    0xcf,
-    0x1f,
-    0x1b,
-    0x54,
-    0x52,
-    0xca,
-    0xba,
-    0xd7,
-    0xea,
-    0xe1,
-    0x1a,
-    0x07,
-    0xa5,
-    0x07,
-    0xe1,
-    0x42,
-    0x7f,
-    0x1b,
-    0x05,
-    0xf9,
-    0x32,
-    0xb9,
-    0x3d,
-    0x56,
-    0x4f,
-    0x04,
-    0xb5,
-    0x22,
-    0x8e,
-    0xa3,
-    0x06,
-    0xe5,
-    0x62,
-    0x0a,
-    0x65,
-    0x4f,
-    0xd1,
-    0xfb,
-    0x1a,
-    0xd6,
-    0x83,
-    0x4c,
-    0x35,
-    0xa1,
-    0x19,
-    0xea,
-    0x7c,
-    0xa5,
-    0xc0,
-    0x1e,
-    0xa7,
-    0x0e,
-    0x05,
-    0x0f,
-    0xd0,
-    0xe0,
-    0xeb,
-    0x89,
-    0x25,
-    0xde,
-    0x3a,
-    0xfc,
-    0xe0,
-    0xab,
-    0x1b,
-    0xc8,
-    0x79,
-    0x2f,
-    0xe2,
-    0xb7,
-    0x19,
-    0x3c,
-    0x2b,
-    0xcb,
-    0x53,
-    0x71,
-    0x28,
-    0x3b,
-    0x0f,
-    0x5f,
-    0x39,
-    0xb8,
-    0xc6,
-    0xeb,
-    0xbd,
-    0xf4,
-    0xf5,
-    0xf3,
-    0x29,
-    0x65,
-    0xcb,
-    0x35,
-    0x57,
-    0x47,
-    0x25,
-    0x6c,
-    0x20,
-    0xe0,
-    0xbd,
-    0xbb,
-    0x2c,
-    0x07,
-    0x9e,
-    0x4f,
-    0x09,
-    0xe7,
-    0xdc,
-    0x41,
-    0x7b,
-    0x01,
-    0x81,
-    0xb9,
-    0x13,
-    0x70,
-    0xca,
-    0x59,
-    0x03,
-    0x71,
-    0x94,
-    0xd9,
-    0x31,
-    0x22,
-    0x11,
-    0xee,
-    0x8a,
-    0x8a,
-    0xbf,
-    0x71,
-    0x99,
-    0xda,
-    0x9b,
-    0xbd,
-    0x58,
-    0xf2,
-    0x92,
-    0x59,
-    0x46,
-    0x27,
-    0x38,
-    0xd7,
-    0xb9,
-    0x44,
-    0xbc,
-    0xfb,
-    0x76,
-    0xce,
-    0x1c,
-    0x20,
-    0x7f,
-    0x8d,
-    0x95,
-    0xd8,
-    0x2c,
-    0x47,
-    0x5e,
-    0xd3,
-    0x7d,
-    0xcf,
-    0x95,
-    0x02,
-    0xaf,
-    0x3f,
-    0x7a,
-    0xfb,
-    0x0d,
-    0x81,
-    0xdb,
-    0xa0,
-    0x09,
-    0x14,
-    0xcf,
-    0xfb,
-    0x8b,
-    0x0c,
-    0xa7,
-    0x6d,
-    0x89,
-    0x5b,
-    0x22,
-    0x08,
-    0xd8,
-    0x50,
-    0xe0,
-    0x39,
-    0x42,
-    0x5d,
-    0x19,
-    0xaa,
-    0xd8,
-    0x1d,
-    0x8f,
-    0x66,
-    0x89,
-    0x95,
-    0xc1,
-    0x3f,
-    0xf4,
-    0xbb,
-    0x62,
-    0x6d,
-    0x7b,
-    0x34,
-    0x09,
-    0x77,
-    0x99,
-    0x62,
-    0x2a,
-    0x57,
-    0x75,
-    0x9e,
-    0x45,
-    0xd9,
-    0xb7,
-    0xc2,
-    0x5d,
-    0x44,
-    0x9a,
-    0xeb,
-    0xac,
-    0x3c,
-    0x42,
-    0x7d,
-    0x95,
-    0xe7,
-    0x51,
-    0x67,
-    0xda,
-    0x4f,
-    0xb5,
-    0xa8,
-    0x0f,
-    0x07,
-    0xc3,
-    0x12,
-    0x4f,
-    0x12,
-    0x8a,
-    0x4d,
-    0x2d,
-    0x00,
-    0x61,
-    0x20,
-    0xed,
-    0x5a,
-    0xc3,
-    0xec,
-    0xf5,
-    0x40,
-    0x5d,
-    0x79,
-    0x7e,
-    0x51,
-    0x64,
-    0xf5,
-    0x8f,
-    0xcb,
-    0x2c,
-    0x3a,
-    0x2c,
-    0xf3,
-    0xf7,
-    0x50,
-    0xcb,
-    0xb8,
-    0x0b,
-    0x33,
-    0x07,
-    0x93,
-    0x07,
-    0xd6,
-    0x98,
-    0xb1,
-    0x76,
-    0x67,
-    0x83,
-    0x54,
-    0xa5,
-    0xd5,
-    0x8e,
-    0x77,
-    0xb2,
-    0x90,
-    0xf7,
-    0xb1,
-    0xe6,
-    0x90,
-    0x65,
-    0x5b,
-    0x44,
-    0x98,
-    0x1f,
-    0xf5,
-    0x62,
-    0xbc,
-    0x7c,
-    0xc6,
-    0x78,
-    0x21,
-    0x9b,
-    0xc3,
-    0xb7,
-    0x04,
-    0x53,
-    0xb2,
-    0xdc,
-    0xfd,
-    0x6d,
-    0x8f,
-    0x04,
-    0x85,
-    0x11,
-    0x2f,
-    0xc2,
-    0xb7,
-    0x7f,
-    0x23,
-    0x6f,
-    0x53,
-    0x00,
-    0xdf,
-    0xc1,
-    0x08,
-    0x1b,
-    0x1c,
-    0x9f,
-    0xf3,
-    0x0b,
-    0x7a,
-    0x34,
-    0x63,
-    0x71,
-    0x6a,
-    0x43,
-    0xdf,
-    0x47,
-    0x4b,
-    0xba,
-    0x6a,
-    0x15,
-    0xd3,
-    0x89,
-    0x05,
-    0x67,
-    0xb1,
-    0xb4,
-    0x76,
-    0x7e,
-    0x70,
-    0xa7,
-    0x48,
-    0x46,
-    0x9f,
-    0xcb,
-    0x13,
-    0x88,
-    0x2f,
-    0x56,
-    0xfd,
-    0x61,
-    0x1c,
-    0x67,
-    0x81,
-    0xf3,
-    0x50,
-    0x52,
-    0x6f,
-    0x5a,
-    0xc4,
-    0x38,
-    0x34,
-    0xe1,
-    0xe8,
-    0xdc,
-    0x5c,
-    0x76,
-    0x45,
-    0xb1,
-    0x55,
-    0x5c,
-    0x60,
-    0x38,
-    0x76,
-    0x20,
-    0xe2,
-    0x88,
-    0x3f,
-    0xce,
-    0xf7,
-    0x2e,
-    0xe3,
-    0x64,
-    0xf4,
-    0x38,
-    0x03,
-    0x87,
-    0x3c,
-    0x8d,
-    0xbd,
-    0x75,
-    0x64,
-    0x80,
-    0xe5,
-    0x3b,
-    0x95,
-    0xa4,
-    0x92,
-    0x28,
-    0x32,
-    0xe1,
-    0xdd,
-    0x81,
-    0xbb,
-    0xc7,
-    0xe5,
-    0x76,
-    0xf2,
-    0x23,
-    0x17,
-    0x55,
-    0x3c,
-    0xd0,
-    0xac,
-    0xfe,
-    0x49,
-    0xd0,
-    0x72,
-    0x97,
-    0xf7,
-    0x9b,
-    0xd0,
-    0x81,
-    0x74,
-    0xb7,
-    0x04,
-    0x8a,
-    0xa3,
-    0x89,
-    0xb0,
-    0x64,
-    0xc2,
-    0x6b,
-    0x95,
-    0x56,
-    0x49,
-    0xff,
-    0x9e,
-    0x31,
-    0x15,
-    0xc2,
-    0x20,
-    0x86,
-    0xc5,
-    0xe4,
-    0x60,
-    0x16,
-    0x65,
-    0x57,
-    0x56,
-    0x8a,
-    0x4a,
-    0x26,
-    0xb0,
-    0x64,
-    0x3c,
-    0x08,
-    0x1a,
-    0x36,
-    0xdb,
-    0x35,
-    0xbd,
-    0x11,
-    0x3b,
-    0x78,
-    0x05,
-    0x41,
-    0xd2,
-    0x85,
-    0xa8,
-    0x37,
-    0x94,
-    0x8e,
-    0xe4,
-    0xc7,
-    0x5c,
-    0x11,
-    0x08,
-    0x94,
-    0x8e,
-    0xf4,
-    0x35,
-    0xc8,
-    0xfa,
-    0xd3,
-    0x66,
-    0x08,
-    0x04,
-    0x99,
-    0xae,
-    0xa7,
-    0x02,
-    0x4d,
-    0xc1,
-    0x19,
-    0xe6,
-    0x2f,
-    0xb6,
-    0xab,
-    0x1d,
-    0x04,
-    0x0b,
-    0x72,
-    0xb7,
-    0xae,
-    0xea,
-    0x81,
-    0xc7,
-    0xff,
-    0xaa,
-    0x5f,
-    0x0d,
-    0xcf,
-    0x99,
-    0xb9,
-    0xd2,
-    0x4c,
-    0xf9,
-    0x53,
-    0x14,
-    0x92,
-    0x48,
-    0x44,
-    0xe3,
-    0x7c,
-    0xc5,
-    0x63,
-    0x0b,
-    0xb9,
-    0x2f,
-    0xfd,
-    0xf3,
-    0x22,
-    0xd0,
-    0xc9,
-    0xc5,
-    0x4a,
-    0xba,
-    0x1d,
-    0xcf,
-    0x57,
-    0x51,
-    0x61,
-    0x2a,
-    0x11,
-    0x09,
-    0xc5,
-    0x99,
-    0x39,
-    0x71,
-    0x2f,
-    0xb3,
-    0x1c,
-    0x71,
-    0x77,
-    0x45,
-    0x68,
-    0xcf,
-    0xd7,
-    0xf2,
-    0x3d,
-    0xf8,
-    0x9d,
-    0x1c,
-    0x87,
-    0xfe,
-    0x23,
-    0x08,
-    0x8c,
-    0xdd,
-    0x01,
-    0x3c,
-    0xc1,
-    0x02,
-    0x81,
-    0x2c,
-    0xe2,
-    0x0e,
-    0x54,
-    0x16,
-    0x41,
-    0xd7,
-    0x83,
-    0x2b,
-    0x5f,
-    0xaf,
-    0xa8,
-    0xef,
-    0xb9,
-    0xea,
-    0x5d,
-    0xe2,
-    0xe4,
-    0x9a,
-    0xf5,
-    0x60,
-    0xdc,
-    0x9d,
-    0x6a,
-    0xc6,
-    0x9a,
-    0xda,
-    0x97,
-    0xd6,
-    0xe4,
-    0xc7,
-    0xa7,
-    0x5d,
-    0x69,
-    0x2f,
-    0xce,
-    0x12,
-    0x0d,
-    0x32,
-    0x37,
-    0xc2,
-    0x82,
-    0x8d,
-    0x3d,
-    0xaa,
-    0x18,
-    0x1b,
-    0xdd,
-    0x25,
-    0xd6,
-    0x9c,
-    0x6b,
-    0x87,
-    0xc9,
-    0xb6,
-    0x85,
-    0x48,
-    0x9c,
-    0x39,
-    0x46,
-    0x65,
-    0x69,
-    0xa7,
-    0xbb,
-    0x03,
-    0xcf,
-    0xf4,
-    0x9b,
-    0x55,
-    0x45,
-    0x8a,
-    0x32,
-    0xc1,
-    0xad,
-    0x90,
-    0x9f,
-    0x3e,
-    0x2d,
-    0x6c,
-    0x3f,
-    0x01,
-    0x3a,
-    0x86,
-    0x69,
-    0x58,
-    0xf5,
-    0x4f,
-    0x5c,
-    0xd6,
-    0xbb,
-    0x83,
-    0x75,
-    0xb0,
-    0xf7,
-    0xab,
-    0xa6,
-    0x67,
-    0x3b,
-    0xe5,
-    0x23,
-    0xa7,
-    0x90,
-    0xe7,
-    0x5e,
-    0x70,
-    0x0a,
-    0x42,
-    0x36,
-    0x73,
-    0x9f,
-    0xe4,
-    0x6b,
-    0xbf,
-    0x38,
-    0xe1,
-    0x56,
-    0x9c,
-    0x09,
-    0x73,
-    0xd7,
-    0xb7,
-    0x1e,
-    0x3f,
-    0x8e,
-    0x80,
-    0x37,
-    0xd9,
-    0x4e,
-    0xd1,
-    0xd6,
-    0x8b,
-    0xce,
-    0xd0,
-    0x96,
-    0x52,
-    0xa2,
-    0x16,
-    0xbe,
-    0x2a,
-    0x6a,
-    0x11,
-    0x16,
-    0x8b,
-    0x4a,
-    0xa6,
-    0xfa,
-    0x34,
-    0x9a,
-    0x1b,
-    0xac,
-    0x27,
-    0xde,
-    0x35,
-    0xef,
-    0xf5,
-    0xf8,
-    0x9d,
-    0xd1,
-    0x3b,
-    0x9c,
-    0x88,
-    0xc8,
-    0x6d,
-    0x05,
-    0x97,
-    0x00,
-    0xd2,
-    0xe6,
-    0xfc,
-    0xf4,
-    0xd0,
-    0xa4,
-    0xdf,
-    0x3c,
-    0x6a,
-    0xc2,
-    0x00,
-    0xa5,
-    0x07,
-    0x9d,
-    0x9d,
-    0x87,
-    0x75,
-    0x59,
-    0x96,
-    0x53,
-    0x2d,
-    0x1b,
-    0xcf,
-    0x6c,
-    0xd9,
-    0x78,
-    0xd6,
-    0x38,
-    0x13,
-    0x2e,
-    0xc6,
-    0x76,
-    0x70,
-    0x12,
-    0x6b,
-    0xd2,
-    0xbd,
-    0x4a,
-    0xa6,
-    0xb6,
-    0x88,
-    0xbc,
-    0x13,
-    0x64,
-    0xe3,
-    0xc6,
-    0xea,
-    0x42,
-    0x64,
-    0x30,
-    0x23,
-    0x74,
-    0x70,
-    0x5f,
-    0xde,
-    0xb0,
-    0xb9,
-    0xcb,
-    0x01,
-    0x4e,
-    0x06,
-    0xb3,
-    0x23,
-    0x9f,
-    0x33,
-    0x0f,
-    0xa9,
-    0x80,
-    0x78,
-    0xc6,
-    0x2e,
-    0x2f,
-    0xee,
-    0x21,
-    0x29,
-    0x5d,
-    0x4e,
-    0x7f,
-    0xc9,
-    0x84,
-    0xfc,
-    0x4b,
-    0x24,
-    0x7a,
-    0x45,
-    0x2c,
-    0x91,
-    0x47,
-    0xe5,
-    0x7b,
-    0x52,
-    0x34,
-    0xcd,
-    0xfa,
-    0x77,
-    0x24,
-    0x23,
-    0xc3,
-    0xfe,
-    0x27,
-    0x89,
-    0x7e,
-    0x3f,
-    0x4d,
-    0xa2,
-    0xd7,
-    0x88,
-    0xb8,
-    0xd2,
-    0x30,
-    0x04,
-    0xf5,
-    0x46,
-    0x92,
-    0xe1,
-    0x8d,
-    0x35,
-    0xea,
-    0xb1,
-    0xd6,
-    0x65,
-    0x72,
-    0x11,
-    0x0f,
-    0xf0,
-    0x6d,
-    0x89,
-    0xac,
-    0x48,
-    0x17,
-    0xb4,
-    0xef,
-    0x79,
-    0xdc,
-    0xa1,
-    0xb8,
-    0xae,
-    0xc8,
-    0x78,
-    0x9e,
-    0xf7,
-    0x3f,
-    0x61,
-    0x3e,
-    0x49,
-    0xee,
-    0xa1,
-    0xd3,
-    0xc7,
-    0x01,
-    0x06,
-    0x08,
-    0x3f,
-    0x96,
-    0x86,
-    0x0a,
-    0xf8,
-    0x72,
-    0x23,
-    0xe0,
-    0xab,
-    0xf3,
-    0x12,
-    0xff,
-    0xcf,
-    0x46,
-    0x1b,
-    0x19,
-    0x19,
-    0xda,
-    0x43,
-    0x37,
-    0x44,
-    0x15,
-    0xa9,
-    0x07,
-    0x0e,
-    0x45,
-    0xae,
-    0x77,
-    0x83,
-    0xd9,
-    0x58,
-    0x82,
-    0x7d,
-    0xd1,
-    0xf9,
-    0x4a,
-    0x6c,
-    0x73,
-    0x0b,
-    0x68,
-    0x53,
-    0x40,
-    0x5f,
-    0x80,
-    0x13,
-    0x26,
-    0x77,
-    0x18,
-    0xec,
-    0xf7,
-    0x30,
-    0xaa,
-    0x41,
-    0x1a,
-    0xa3,
-    0xf7,
-    0x9b,
-    0x81,
-    0x4e,
-    0x9f,
-    0xf1,
-    0xda,
-    0x6f,
-    0xef,
-    0x27,
-    0x0a,
-    0xb1,
-    0xfa,
-    0xd4,
-    0xd7,
-    0x0a,
-    0xeb,
-    0x48,
-    0xe4,
-    0xe4,
-    0x99,
-    0xce,
-    0xe3,
-    0x7b,
-    0x5c,
-    0x2e,
-    0x06,
-    0x86,
-    0x20,
-    0x76,
-    0xb6,
-    0x19,
-    0xb7,
-    0xfa,
-    0x88,
-    0xca,
-    0x74,
-    0x9a,
-    0x6d,
-    0x13,
-    0xf5,
-    0x43,
-    0x29,
-    0xf7,
-    0x40,
-    0xb9,
-    0x06,
-    0xe8,
-    0x12,
-    0x93,
-    0xc9,
-    0xe9,
-    0x73,
-    0x87,
-    0xe5,
-    0xf0,
-    0x8e,
-    0xe7,
-    0xef,
-    0x8e,
-    0xc0,
-    0x6c,
-    0x52,
-    0xd1,
-    0xef,
-    0x33,
-    0x44,
-    0x6a,
-    0x1d,
-    0x05,
-    0xf8,
-    0x0b,
-    0x3c,
-    0xdb,
-    0x15,
-    0x13,
-    0x44,
-    0xa1,
-    0x68,
-    0x6d,
-    0x84,
-    0x3b,
-    0xd5,
-    0xb5,
-    0x35,
-    0xc6,
-    0x94,
-    0x9d,
-    0x55,
-    0x20,
-    0x9a,
-    0x90,
-    0xb3,
-    0xaa,
-    0x54,
-    0x95,
-    0x46,
-    0x4c,
-    0x9b,
-    0x75,
-    0xc2,
-    0xba,
-    0xe5,
-    0x20,
-    0x6d,
-    0xf6,
-    0xb8,
-    0x4d,
-    0x2f,
-    0x17,
-    0x65,
-    0x61,
-    0xe9,
-    0x48,
-    0xf2,
-    0x92,
-    0x08,
-    0x13,
-    0x58,
-    0x4c,
-    0x5a,
-    0xe0,
-    0xef,
-    0xd3,
-    0x20,
-    0xb8,
-    0x26,
-    0x2b,
-    0x64,
-    0x4f,
-    0x77,
-    0x35,
-    0x8d,
-    0x42,
-    0x9a,
-    0x1a,
-    0x30,
-    0x9d,
-    0xf9,
-    0xec,
-    0x29,
-    0xa0,
-    0x65,
-    0x8b,
-    0xeb,
-    0xc3,
-    0x07,
-    0xc6,
-    0x14,
-    0xf7,
-    0x99,
-    0xc3,
-    0x45,
-    0x2f,
-    0xd6,
-    0xa1,
-    0x30,
-    0x1f,
-    0x2e,
-    0x5b,
-    0xf2,
-    0x43,
-    0xbf,
-    0xf0,
-    0xa4,
-    0x24,
-    0x81,
-    0xc1,
-    0x2c,
-    0xd7,
-    0xc0,
-    0x3a,
-    0x59,
-    0xc6,
-    0xd0,
-    0xb4,
-    0x30,
-    0xb3,
-    0xfc,
-    0x9a,
-    0x80,
-    0xf9,
-    0xbf,
-    0xcb,
-    0xbd,
-    0x15,
-    0x37,
-    0x40,
-    0x0a,
-    0x66,
-    0xd6,
-    0xef,
-    0x98,
-    0x31,
-    0x5b,
-    0xef,
-    0x2f,
-    0xe8,
-    0x00,
-    0xdc,
-    0x0a,
-    0xac,
-    0xf5,
-    0x7d,
-    0xe8,
-    0x10,
-    0x0e,
-    0xa4,
-    0x60,
-    0x20,
-    0xb9,
-    0x56,
-    0x75,
-    0xa2,
-    0x32,
-    0x2c,
-    0x6a,
-    0x9b,
-    0xfa,
-    0xf9,
-    0xd8,
-    0x15,
-    0x85,
-    0xad,
-    0xfd,
-    0x20,
-    0x32,
-    0x7a,
-    0x57,
-    0x17,
-    0x81,
-    0x35,
-    0x71,
-    0x24,
-    0x81,
-    0xfe,
-    0xfe,
-    0x06,
-    0x87,
-    0x23,
-    0x24,
-    0x12,
-    0x25,
-    0x42,
-    0x1a,
-    0x78,
-    0x5a,
-    0xae,
-    0xf5,
-    0xc8,
-    0x07,
-    0x14,
-    0xbf,
-    0xb5,
-    0xa2,
-    0x5f,
-    0xca,
-    0x18,
-    0x2e,
-    0xd8,
-    0x43,
-    0x38,
-    0x6b,
-    0x92,
-    0x0a,
-    0x48,
-    0x4a,
-    0x05,
-    0xc1,
-    0x31,
-    0xa3,
-    0xf9,
-    0x24,
-    0x92,
-    0x2a,
-    0xa6,
-    0x98,
-    0x05,
-    0xa0,
-    0x19,
-    0x06,
-    0xa5,
-    0x46,
-    0xd9,
-    0xe9,
-    0xcd,
-    0x97,
-    0xcb,
-    0xa6,
-    0x22,
-    0x36,
-    0x53,
-    0x1d,
-    0xd3,
-    0x26,
-    0xbc,
-    0x7d,
-    0x1f,
-    0x39,
-    0xda,
-    0x5c,
-    0x18,
-    0xcb,
-    0xed,
-    0x07,
-    0xa7,
-    0xaf,
-    0xc9,
-    0x16,
-    0xd1,
-    0x6a,
-    0x34,
-    0x44,
-    0x38,
-    0x9f,
-    0x90,
-    0x7e,
-    0xe5,
-    0xcb,
-    0xba,
-    0x3a,
-    0x44,
-    0x33,
-    0x31,
-    0x0a,
-    0x70,
-    0x1a,
-    0x7b,
-    0x71,
-    0xb1,
-    0x36,
-    0xc4,
-    0xf5,
-    0x44,
-    0x65,
-    0xc9,
-    0x75,
-    0x5a,
-    0x9d,
-    0xf4,
-    0xbd,
-    0x62,
-    0x21,
-    0xc8,
-    0x58,
-    0x8b,
-    0xfb,
-    0x80,
-    0xa5,
-    0x85,
-    0xa6,
-    0xf3,
-    0x2e,
-    0x88,
-    0x0b,
-    0xbb,
-    0x34,
-    0x98,
-    0xaf,
-    0x96,
-    0x8f,
-    0x07,
-    0x2a,
-    0x0c,
-    0xb5,
-    0x3b,
-    0xdb,
-    0x53,
-    0x18,
-    0xb2,
-    0xda,
-    0x6f,
-    0xb5,
-    0x42,
-    0x2e,
-    0x9d,
-    0xe9,
-    0xa6,
-    0x40,
-    0xf2,
-    0x87,
-    0x36,
-    0x90,
-    0x40,
-    0x29,
-    0xf6,
-    0xa7,
-    0x39,
-    0xc3,
-    0xd2,
-    0x4d,
-    0xd7,
-    0x7e,
-    0x28,
-    0xfb,
-    0xfb,
-    0xc3,
-    0x87,
-    0x93,
-    0x54,
-    0x95,
-    0xb7,
-    0x4f,
-    0x82,
-    0x25,
-    0xf9,
-    0xf7,
-    0x7b,
-    0xa0,
-    0x8f,
-    0x58,
-    0x2e,
-    0x4c,
-    0x7f,
-    0xf1,
-    0x67,
-    0xd3,
-    0x95,
-    0xef,
-    0xf3,
-    0xdf,
-    0xa7,
-    0x5c,
-    0x04,
-    0xe6,
-    0x1c,
-    0x93,
-    0xd7,
-    0x48,
-    0xaf,
-    0xf7,
-    0x93,
-    0x97,
-    0x71,
-    0xe4,
-    0x75,
-    0x35,
-    0x0d,
-    0xe6,
-    0x2a,
-    0x25,
-    0x50,
-    0x29,
-    0x7c,
-    0x1b,
-    0xe9,
-    0x31,
-    0x31,
-    0xd5,
-    0x6d,
-    0xcb,
-    0x30,
-    0xae,
-    0x9e,
-    0x44,
-    0xe6,
-    0x71,
-    0xec,
-    0xd8,
-    0xe8,
-    0x6b,
-    0x3c,
-    0x6d,
-    0xda,
-    0xc4,
-    0xe9,
-    0x82,
-    0x8f,
-    0x0f,
-    0x08,
-    0x62,
-    0x71,
-    0x1f,
-    0xf1,
-    0x9d,
-    0x24,
-    0x1c,
-    0xfb,
-    0xb8,
-    0x66,
-    0xd7,
-    0x86,
-    0x24,
-    0x3a,
-    0x5b,
-    0x3f,
-    0x6d,
-    0x45,
-    0xc5,
-    0x9f,
-    0xb4,
-    0x78,
-    0x55,
-    0xb5,
-    0x5f,
-    0xef,
-    0xc4,
-    0x26,
-    0x0f,
-    0x19,
-    0xd8,
-    0x72,
-    0xd2,
-    0x1a,
-    0x37,
-    0x78,
-    0x9b,
-    0x6d,
-    0x79,
-    0x3d,
-    0xef,
-    0xce,
-    0x80,
-    0xe9,
-    0xe0,
-    0x57,
-    0x0c,
-    0x12,
-    0x3f,
-    0xe9,
-    0x8a,
-    0x3d,
-    0x0e,
-    0xcd,
-    0x2d,
-    0xa2,
-    0x34,
-    0x9b,
-    0x40,
-    0x30,
-    0x74,
-    0x5b,
-    0xbb,
-    0xd1,
-    0xa0,
-    0xeb,
-    0x14,
-    0xef,
-    0x0a,
-    0xa1,
-    0x57,
-    0x37,
-    0x3c,
-    0x30,
-    0x79,
-    0x9d,
-    0xe9,
-    0xd0,
-    0xea,
-    0xa0,
-    0x23,
-    0x99,
-    0x69,
-    0xcf,
-    0xcd,
-    0x30,
-    0x1c,
-    0x8c,
-    0x54,
-    0xa6,
-    0xe0,
-    0x10,
-    0x9a,
-    0x9d,
-    0xde,
-    0xaf,
-    0x33,
-    0xad,
-    0x5f,
-    0x5d,
-    0xd4,
-    0x06,
-    0xe1,
-    0x72,
-    0x08,
-    0x56,
-    0x69,
-    0xaa,
-    0x25,
-    0xed,
-    0x1c,
-    0x70,
-    0x7f,
-    0x1f,
-    0x09,
-    0x5c,
-    0xdb,
-    0xe9,
-    0x4a,
-    0xfa,
-    0x27,
-    0xd8,
-    0x4b,
-    0xcd,
-    0x68,
-    0x27,
-    0x69,
-    0x93,
-    0xf3,
-    0x27,
-    0xbf,
-    0xcb,
-    0xe0,
-    0xe4,
-    0x3c,
-    0x75,
-    0xbc,
-    0x06,
-    0xf9,
-    0x19,
-    0x7e,
-    0xf5,
-    0xca,
-    0x0a,
-    0xbc,
-    0x41,
-    0x14,
-    0xec,
-    0x1f,
-    0x40,
-    0xde,
-    0x74,
-    0x15,
-    0xf9,
-    0x2a,
-    0x6f,
-    0xc5,
-    0x40,
-    0x85,
-    0x06,
-    0x48,
-    0x23,
-    0xdd,
-    0x40,
-    0x16,
-    0x85,
-    0x93,
-    0xc8,
-    0xbe,
-    0x09,
-    0xd1,
-    0xf1,
-    0xdb,
-    0x32,
-    0x1e,
-    0xf7,
-    0x43,
-    0xc8,
-    0x2f,
-    0x88,
-    0x81,
-    0x7d,
-    0x00,
-    0x82,
-    0x86,
-    0xd0,
-    0x24,
-    0xff,
-    0x9b,
-    0x32,
-    0x5a,
-    0x8f,
-    0x9a,
-    0x67,
-    0x60,
-    0xc4,
-    0x5e,
-    0x30,
-    0x0c,
-    0xf4,
-    0x78,
-    0x27,
-    0x98,
-    0x3a,
-    0x23,
-    0xea,
-    0x3e,
-    0xbe,
-    0x7b,
-    0x7b,
-    0x04,
-    0x36,
-    0xe9,
-    0xe7,
-    0xda,
-    0xad,
-    0xe2,
-    0x26,
-    0xe2,
-    0x83,
-    0xd1,
-    0x43,
-    0x0f,
-    0xb6,
-    0x51,
-    0xbd,
-    0xf1,
-    0x5f,
-    0xa0,
-    0x2c,
-    0xcf,
-    0x80,
-    0x50,
-    0x27,
-    0xf7,
-    0xfc,
-    0x40,
-    0x66,
-    0x52,
-    0xe7,
-    0xcb,
-    0x24,
-    0x3b,
-    0x00,
-    0x3f,
-    0xc7,
-    0x91,
-    0x7c,
-    0x91,
-    0xc3,
-    0x0b,
-    0x06,
-    0x4f,
-    0xbc,
-    0xcc,
-    0x03,
-    0xd5,
-    0xeb,
-    0x38,
-    0x1a,
-    0xc4,
-    0xc2,
-    0x05,
-    0xf4,
-    0xb0,
-    0xd3,
-    0x95,
-    0x40,
-    0x19,
-    0xee,
-    0x83,
-    0xfb,
-    0x9d,
-    0x89,
-    0x7c,
-    0xee,
-    0x6b,
-    0x65,
-    0x50,
-    0x78,
-    0xfb,
-    0x6f,
-    0x48,
-    0x8d,
-    0xfd,
-    0xe5,
-    0xbb,
-    0xff,
-    0x8f,
-    0xb9,
-    0xdc,
-    0xfc,
-    0xb2,
-    0x3a,
-    0xd6,
-    0xd9,
-    0xff,
-    0xf1,
-    0x1b,
-    0x0d,
-    0x96,
-    0xc9,
-    0xf8,
-    0x81,
-    0x58,
-    0x74,
-    0x6e,
-    0x07,
-    0x56,
-    0x09,
-    0x3d,
-    0x27,
-    0x88,
-    0xf2,
-    0x41,
-    0x22,
-    0xc3,
-    0x05,
-    0x01,
-    0x31,
-    0xe5,
-    0xf1,
-    0x86,
-    0x0e,
-    0x53,
-    0xdc,
-    0x69,
-    0xb5,
-    0xa5,
-    0x4a,
-    0x30,
-    0x6c,
-    0x9f,
-    0x41,
-    0xdb,
-    0x01,
-    0x63,
-    0xab,
-    0xb9,
-    0x53,
-    0xe6,
-    0xfb,
-    0x80,
-    0x13,
-    0xa1,
-    0x13,
-    0x9d,
-    0xcc,
-    0x89,
-    0x65,
-    0xc9,
-    0x21,
-    0x40,
-    0x59,
-    0xdd,
-    0x57,
-    0x8d,
-    0xef,
-    0xe7,
-    0x13,
-    0x0a,
-    0xa6,
-    0x7d,
-    0x64,
-    0x1c,
-    0x9c,
-    0x51,
-    0x03,
-    0x28,
-    0xf6,
-    0x06,
-    0xda,
-    0x04,
-    0x82,
-    0x42,
-    0xc4,
-    0xac,
-    0x9b,
-    0x05,
-    0x94,
-    0x37,
-    0x4e,
-    0x39,
-    0x58,
-    0x09,
-    0xbb,
-    0x8a,
-    0xdf,
-    0x49,
-    0xbd,
-    0x77,
-    0x78,
-    0x96,
-    0xcd,
-    0xa9,
-    0xfd,
-    0xf5,
-    0x23,
-    0x84,
-    0x10,
-    0x0e,
-    0x1f,
-    0xfd,
-    0xa5,
-    0x99,
-    0xe8,
-    0xab,
-    0xc1,
-    0x13,
-    0x53,
-    0x20,
-    0x80,
-    0xb5,
-    0x06,
-    0x79,
-    0x5d,
-    0xa6,
-    0xdd,
-    0x34,
-    0xae,
-    0x70,
-    0x8c,
-    0x42,
-    0x6e,
-    0xb1,
-    0x86,
-    0x5d,
-    0x3f,
-    0x13,
-    0x1e,
-    0x9c,
-    0xaf,
-    0x7d,
-    0xec,
-    0x45,
-    0xbb,
-    0x8b,
-    0x73,
-    0xe2,
-    0x92,
-    0x3c,
-    0x00,
-    0x97,
-    0x9b,
-    0xeb,
-    0xd5,
-    0xb2,
-    0xb8,
-    0x81,
-    0x87,
-    0x84,
-    0xcd,
-    0xe8,
-    0xa5,
-    0x70,
-    0x7c,
-    0xc3,
-    0x9a,
-    0x41,
-    0x33,
-    0x5c,
-    0xd5,
-    0xc0,
-    0x69,
-    0xdd,
-    0x27,
-    0x87,
-    0x24,
-    0xc4,
-    0x6c,
-    0x10,
-    0xbf,
-    0x91,
-    0x6d,
-    0x11,
-    0xea,
-    0xc1,
-    0x05,
-    0x0c,
-    0xf2,
-    0x00,
-    0x83,
-    0x21,
-    0x43,
-    0x9b,
-    0x50,
-    0x28,
-    0x2b,
-    0x34,
-    0xd2,
-    0xfc,
-    0xe0,
-    0xb9,
-    0x8f,
-    0x19,
-    0xc5,
-    0x97,
-    0x96,
-    0x6a,
-    0xe9,
-    0x2a,
-    0x1b,
-    0x5c,
-    0xd0,
-    0x78,
-    0x61,
-    0x37,
-    0x77,
-    0x20,
-    0xdd,
-    0xae,
-    0x92,
-    0x8d,
-    0x98,
-    0xb5,
-    0x18,
-    0x6f,
-    0xd5,
-    0x92,
-    0x01,
-    0x6c,
-    0xf4,
-    0x37,
-    0x4f,
-    0x12,
-    0x96,
-    0xcf,
-    0x4b,
-    0x11,
-    0x02,
-    0x97,
-    0x11,
-    0xa7,
-    0xc7,
-    0xef,
-    0x4e,
-    0x5b,
-    0xa3,
-    0xb1,
-    0x49,
-    0xee,
-    0xa4,
-    0xc1,
-    0x20,
-    0x8f,
-    0x8d,
-    0xe5,
-    0x54,
-    0x4e,
-    0x7b,
-    0xd7,
-    0x88,
-    0xd3,
-    0xc8,
-    0x99,
-    0x86,
-    0x50,
-    0x30,
-    0x09,
-    0x83,
-    0xb4,
-    0x32,
-    0xb5,
-    0xa4,
-    0x22,
-    0xb9,
-    0xf0,
-    0xc1,
-    0xa1,
-    0xfc,
-    0x26,
-    0x68,
-    0x15,
-    0xa3,
-    0x6c,
-    0x25,
-    0x6e,
-    0x2b,
-    0x5b,
-    0x00,
-    0x1f,
-    0x8b,
-    0x1f,
-    0x48,
-    0xd1,
-    0x18,
-    0xcb,
-    0x8f,
-    0x59,
-    0xa6,
-    0xef,
-    0xf6,
-    0xe8,
-    0xf0,
-    0x6d,
-    0xab,
-    0x82,
-    0x3a,
-    0x88,
-    0xaf,
-    0xb2,
-    0x34,
-    0x3e,
-    0xdd,
-    0x7b,
-    0x22,
-    0xd8,
-    0x28,
-    0x91,
-    0x3a,
-    0xbf,
-    0x24,
-    0xca,
-    0x4d,
-    0x91,
-    0xc8,
-    0xcf,
-    0xaa,
-    0x74,
-    0x72,
-    0x17,
-    0x40,
-    0xab,
-    0x2b,
-    0x16,
-    0x02,
-    0x67,
-    0x2c,
-    0xb1,
-    0x90,
-    0xdf,
-    0xa2,
-    0xf6,
-    0x13,
-    0xa2,
-    0xaf,
-    0x0a,
-    0x68,
-    0x2c,
-    0xb1,
-    0x62,
-    0x82,
-    0xb8,
-    0xc6,
-    0x36,
-    0x09,
-    0x56,
-    0x90,
-    0x33,
-    0x47,
-    0x3d,
-    0x35,
-    0x71,
-    0x45,
-    0x62,
-    0xaa,
-    0xa4,
-    0x31,
-    0x4a,
-    0x32,
-    0x96,
-    0x03,
-    0x1c,
-    0x21,
-    0xd5,
-    0x61,
-    0xfa,
-    0xe6,
-    0xa8,
-    0xbf,
-    0x91,
-    0x48,
-    0x48,
-    0xca,
-    0xef,
-    0xf0,
-    0x4d,
-    0x07,
-    0x95,
-    0x28,
-    0x67,
-    0xb7,
-    0xce,
-    0xe2,
-    0x4e,
-    0xff,
-    0x3f,
-    0xfc,
-    0xfc,
-    0x45,
-    0xbe,
-    0xc2,
-    0x19,
-    0xdd,
-    0x68,
-    0xb5,
-    0xb7,
-    0xe5,
-    0xed,
-    0x8b,
-    0x3f,
-    0x6d,
-    0x2f,
-    0x76,
-    0xab,
-    0xdc,
-    0x0c,
-    0xa9,
-    0xf6,
-    0x8e,
-    0x77,
-    0x19,
-    0xd1,
-    0xc2,
-    0xce,
-    0x80,
-    0x98,
-    0xb4,
-    0x67,
-    0xa8,
-    0x84,
-    0x06,
-    0x6d,
-    0xe6,
-    0x22,
-    0x64,
-    0xea,
-    0xe4,
-    0x04,
-    0x68,
-    0x24,
-    0xa4,
-    0xb6,
-    0xbb,
-    0x2d,
-    0xc2,
-    0xf3,
-    0x7e,
-    0xb6,
-    0xfa,
-    0x19,
-    0xe8,
-    0x24,
-    0xe9,
-    0xdb,
-    0x30,
-    0xe6,
-    0x18,
-    0x36,
-    0xad,
-    0x05,
-    0x36,
-    0xa6,
-    0x3c,
-    0xfc,
-    0xa5,
-    0x99,
-    0xe2,
-    0xcb,
-    0x39,
-    0x24,
-    0xb2,
-    0x47,
-    0x3c,
-    0xf5,
-    0xf1,
-    0xb4,
-    0xb5,
-    0x89,
-    0x79,
-    0x95,
-    0xe9,
-    0x9f,
-    0x5b,
-    0xc3,
-    0x23,
-    0xec,
-    0xc8,
-    0xbd,
-    0xb1,
-    0x10,
-    0x32,
-    0x3f,
-    0x2f,
-    0xc9,
-    0xae,
-    0x16,
-    0x08,
-    0x66,
-    0x9d,
-    0x32,
-    0x39,
-    0x7f,
-    0x8b,
-    0xfd,
-    0x58,
-    0xe4,
-    0x57,
-    0xeb,
-    0xd5,
-    0xd3,
-    0x94,
-    0x52,
-    0x81,
-    0x6e,
-    0x30,
-    0x7d,
-    0x4c,
-    0x6b,
-    0x53,
-    0xfc,
-    0x53,
-    0x0e,
-    0x8a,
-    0x3d,
-    0x1a,
-    0x54,
-    0x25,
-    0x61,
-    0x15,
-    0x72,
-    0xde,
-    0x48,
-    0x6e,
-    0x7d,
-    0xbb,
-    0xee,
-    0x02,
-    0x6b,
-    0x35,
-    0xfb,
-    0xad,
-    0x3a,
-    0x99,
-    0x95,
-    0xc7,
-    0x6f,
-    0xaf,
-    0x79,
-    0xee,
-    0xc2,
-    0x9a,
-    0x4a,
-    0x06,
-    0x18,
-    0xff,
-    0x28,
-    0x7f,
-    0xb1,
-    0x69,
-    0x85,
-    0xd6,
-    0xa3,
-    0xec,
-    0x34,
-    0x5f,
-    0x87,
-    0x09,
-    0xc3,
-    0x41,
-    0x72,
-    0xd2,
-    0x0b,
-    0xc2,
-    0x27,
-    0x4e,
-    0x05,
-    0xc5,
-    0x8a,
-    0x1f,
-    0xe0,
-    0x90,
-    0x58,
-    0x62,
-    0x50,
-    0xd3,
-    0x16,
-    0xd7,
-    0x28,
-    0xe6,
-    0x47,
-    0x42,
-    0x2b,
-    0x53,
-    0xe2,
-    0x11,
-    0x1f,
-    0x94,
-    0x03,
-    0x3e,
-    0x24,
-    0x1e,
-    0xe1,
-    0x77,
-    0x44,
-    0x9e,
-    0x00,
-    0x7d,
-    0x4b,
-    0x82,
-    0xa8,
-    0xca,
-    0xd9,
-    0xbb,
-    0x95,
-    0x76,
-    0xb5,
-    0xc1,
-    0xf0,
-    0x5b,
-    0x64,
-    0xd8,
-    0x7e,
-    0x78,
-    0xfb,
-    0x93,
-    0x18,
-    0x93,
-    0x31,
-    0x96,
-    0x5b,
-    0x22,
-    0xb8,
-    0x9f,
-    0xa0,
-    0x6c,
-    0xce,
-    0xc8,
-    0x2e,
-    0xec,
-    0x0f,
-    0x06,
-    0xaf,
-    0xf6,
-    0x8d,
-    0xf6,
-    0xe1,
-    0x9d,
-    0x22,
-    0xd9,
-    0x8e,
-    0xd3,
-    0x05,
-    0xdc,
-    0xbe,
-    0xd2,
-    0x9c,
-    0x9e,
-    0x2b,
-    0xbb,
-    0x91,
-    0xec,
-    0xf5,
-    0x7d,
-    0x28,
-    0xcf,
-    0x97,
-    0xf9,
-    0xd0,
-    0xc8,
-    0x1a,
-    0x64,
-    0xf8,
-    0x5a,
-    0x89,
-    0xec,
-    0x23,
-    0xc9,
-    0xa4,
-    0x9e,
-    0x3f,
-    0x22,
-    0xd8,
-    0x87,
-    0x32,
-    0x7b,
-    0x6f,
-    0x19,
-    0xb7,
-    0x7c,
-    0x05,
-    0xd1,
-    0x68,
-    0x1e,
-    0x3b,
-    0x17,
-    0x1b,
-    0xb3,
-    0xaf,
-    0x66,
-    0x72,
-    0x27,
-    0x2b,
-    0xac,
-    0xae,
-    0x85,
-    0x1c,
-    0xf4,
-    0xc4,
-    0xbc,
-    0x46,
-    0x42,
-    0xb3,
-    0xa4,
-    0xb7,
-    0xbe,
-    0x14,
-    0x3c,
-    0xf9,
-    0x15,
-    0xf3,
-    0x36,
-    0x8c,
-    0x1d,
-    0xdd,
-    0xb5,
-    0x93,
-    0xb8,
-    0x3a,
-    0x55,
-    0xce,
-    0xfa,
-    0xde,
-    0x6c,
-    0xc8,
-    0x8e,
-    0xda,
-    0x8f,
-    0x52,
-    0x55,
-    0x98,
-    0x58,
-    0x2f,
-    0x51,
-    0x27,
-    0x67,
-    0x11,
-    0xc2,
-    0xd3,
-    0xa7,
-    0xc5,
-    0x8e,
-    0xf9,
-    0xd2,
-    0xaa,
-    0xe6,
-    0x19,
-    0x38,
-    0x67,
-    0x27,
-    0x2d,
-    0xbc,
-    0xdd,
-    0xfe,
-    0x39,
-    0x1f,
-    0x5b,
-    0xd0,
-    0x24,
-    0x81,
-    0x11,
-    0x59,
-    0xc6,
-    0x24,
-    0xc8,
-    0x93,
-    0x42,
-    0x74,
-    0xd0,
-    0xd9,
-    0x96,
-    0x44,
-    0x39,
-    0x4c,
-    0x70,
-    0x5b,
-    0x46,
-    0x76,
-    0x44,
-    0x2f,
-    0x1e,
-    0x2d,
-    0x9b,
-    0xf0,
-    0xc5,
-    0xba,
-    0xae,
-    0xc8,
-    0x4b,
-    0x3b,
-    0x33,
-    0x62,
-    0x43,
-    0x46,
-    0x77,
-    0xa9,
-    0x77,
-    0xcf,
-    0xad,
-    0xd2,
-    0xda,
-    0x4c,
-    0x85,
-    0x9c,
-    0xbe,
-    0x16,
-    0x01,
-    0xd6,
-    0x47,
-    0x13,
-    0x85,
-    0x22,
-    0x20,
-    0x92,
-    0x2d,
-    0xfa,
-    0x6c,
-    0x76,
-    0x62,
-    0xf0,
-    0x00,
-    0x97,
-    0xb0,
-    0x3a,
-    0xcf,
-    0x65,
-    0xd2,
-    0x6d,
-    0xa5,
-    0xcf,
-    0x0f,
-    0x89,
-    0x19,
-    0x63,
-    0xca,
-    0x36,
-    0xbd,
-    0xb6,
-    0x54,
-    0x4d,
-    0x97,
-    0x06,
-    0x04,
-    0x9a,
-    0xd5,
-    0x1e,
-    0x8a,
-    0xe1,
-    0xbc,
-    0x7a,
-    0x80,
-    0x1e,
-    0xe2,
-    0xac,
-    0x42,
-    0x11,
-    0x9d,
-    0xfe,
-    0x00,
-    0xfa,
-    0xbb,
-    0x59,
-    0x11,
-    0xa2,
-    0x73,
-    0x65,
-    0x8a,
-    0x9a,
-    0x9c,
-    0xf2,
-    0x10,
-    0xc7,
-    0x1d,
-    0x97,
-    0xea,
-    0x1f,
-    0xa5,
-    0x98,
-    0x5a,
-    0xad,
-    0x9c,
-    0x0d,
-    0x2e,
-    0xdb,
-    0x59,
-    0x41,
-    0x92,
-    0xf0,
-    0x95,
-    0x59,
-    0x28,
-    0xd8,
-    0x1f,
-    0x36,
-    0x5b,
-    0x24,
-    0xd2,
-    0x9c,
-    0xf0,
-    0x51,
-    0xc5,
-    0x93,
-    0xdd,
-    0x4d,
-    0xc1,
-    0x0d,
-    0x5f,
-    0x37,
-    0xf8,
-    0xca,
-    0x47,
-    0x66,
-    0xf3,
-    0x79,
-    0x94,
-    0xae,
-    0xcd,
-    0x20,
-    0x47,
-    0xde,
-    0x9f,
-    0xbd,
-    0x73,
-    0x8d,
-    0x3b,
-    0x2e,
-    0x94,
-    0x17,
-    0x1d,
-    0x4e,
-    0x21,
-    0xe2,
-    0x9e,
-    0x61,
-    0x65,
-    0xe6,
-    0x6b,
-    0xb2,
-    0x8a,
-    0x6c,
-    0x36,
-    0x7a,
-    0xf7,
-    0x15,
-    0xab,
-    0x04,
-    0xdc,
-    0x1f,
-    0xa6,
-    0x0f,
-    0x0a,
-    0xe4,
-    0xa3,
-    0x74,
-    0x09,
-    0xa3,
-    0x76,
-    0x08,
-    0x64,
-    0x83,
-    0x3c,
-    0xc4,
-    0x48,
-    0xd5,
-    0x91,
-    0x23,
-    0x4d,
-    0x9a,
-    0x03,
-    0xcc,
-    0x94,
-    0x45,
-    0xc7,
-    0x71,
-    0x12,
-    0xc2,
-    0xab,
-    0xf7,
-    0x2b,
-    0xb6,
-    0x4c,
-    0xd7,
-    0x83,
-    0x09,
-    0x89,
-    0xc4,
-    0x11,
-    0xa2,
-    0x37,
-    0x8e,
-    0x75,
-    0x71,
-    0x16,
-    0x46,
-    0x8b,
-    0xb3,
-    0x04,
-    0xa3,
-    0x40,
-    0x71,
-    0x71,
-    0xa4,
-    0xa4,
-    0x4a,
-    0x13,
-    0x77,
-    0x41,
-    0x73,
-    0xdb,
-    0x9a,
-    0xac,
-    0xfc,
-    0x27,
-    0x40,
-    0x59,
-    0x55
-  ],
-  const [
-    0xf7,
-    0xa5,
-    0x09,
-    0x8b,
-    0x2a,
-    0x4d,
-    0x92,
-    0xa7,
-    0xe7,
-    0x1e,
-    0x46,
-    0x58,
-    0xb4,
-    0x58,
-    0xf4,
-    0x7a,
-    0x0b,
-    0x5e,
-    0x04,
-    0x27,
-    0xad,
-    0xb9,
-    0x67,
-    0xda,
-    0x3a,
-    0x60,
-    0xce,
-    0xd4,
-    0xff,
-    0x36,
-    0x1a,
-    0xbf,
-    0x0f,
-    0xd5,
-    0x14,
-    0x92,
-    0x95,
-    0x8a,
-    0x5f,
-    0xb4,
-    0x68,
-    0xa0,
-    0xab,
-    0x64,
-    0xe0,
-    0xe2,
-    0x2a,
-    0x58,
-    0xe9,
-    0x5b,
-    0x48,
-    0xa4,
-    0x55,
-    0x60,
-    0x97,
-    0xde,
-    0x77,
-    0xd1,
-    0x08,
-    0x80,
-    0xed,
-    0x9b,
-    0x61,
-    0x8d,
-    0xbd,
-    0x81,
-    0xeb,
-    0x78,
-    0xa4,
-    0x1d,
-    0x6b,
-    0x41,
-    0xaa,
-    0x21,
-    0x54,
-    0xe1,
-    0xfa,
-    0xe3,
-    0x3b,
-    0xe8,
-    0xf1,
-    0x19,
-    0x8b,
-    0x65,
-    0x75,
-    0xe0,
-    0x7a,
-    0x06,
-    0x88,
-    0x04,
-    0x3c,
-    0x80,
-    0x1c,
-    0x7b,
-    0x76,
-    0x31,
-    0x29,
-    0x32,
-    0xf5,
-    0x04,
-    0xfe,
-    0x0d,
-    0xa0,
-    0x96,
-    0xd5,
-    0x29,
-    0xab,
-    0x97,
-    0xa9,
-    0x64,
-    0x0e,
-    0x72,
-    0x4c,
-    0x1f,
-    0x36,
-    0x30,
-    0xb4,
-    0x42,
-    0xfa,
-    0x99,
-    0x95,
-    0x81,
-    0xd0,
-    0x9d,
-    0x36,
-    0xde,
-    0x41,
-    0xf3,
-    0x7d,
-    0x6f,
-    0x9a,
-    0x00,
-    0x4b,
-    0x62,
-    0xe5,
-    0xfa,
-    0x10,
-    0x3e,
-    0x17,
-    0x4d,
-    0x96,
-    0x6b,
-    0x8b,
-    0x3e,
-    0x21,
-    0xf5,
-    0xaf,
-    0xce,
-    0xba,
-    0x8d,
-    0xfe,
-    0xe1,
-    0xc8,
-    0xd1,
-    0x2e,
-    0x9f,
-    0xe0,
-    0xcd,
-    0xaa,
-    0x1b,
-    0xde,
-    0xc1,
-    0x42,
-    0x32,
-    0x35,
-    0x24,
-    0x21,
-    0xb7,
-    0x83,
-    0xea,
-    0x00,
-    0xcd,
-    0x69,
-    0x03,
-    0x9a,
-    0x93,
-    0x99,
-    0x24,
-    0x60,
-    0x07,
-    0x30,
-    0xc9,
-    0x6d,
-    0x24,
-    0x47,
-    0x7b,
-    0xbc,
-    0x4e,
-    0xc4,
-    0x4e,
-    0x99,
-    0xf0,
-    0x76,
-    0xaf,
-    0x55,
-    0x64,
-    0x62,
-    0x5c,
-    0x3e,
-    0x13,
-    0x57,
-    0xb4,
-    0xce,
-    0xdd,
-    0xc9,
-    0x31,
-    0x23,
-    0xbb,
-    0xdc,
-    0x33,
-    0xaf,
-    0xa2,
-    0xbe,
-    0xff,
-    0x31,
-    0xab,
-    0x3a,
-    0x07,
-    0xe4,
-    0x72,
-    0x8a,
-    0x6c,
-    0xf6,
-    0xbb,
-    0x6d,
-    0xc1,
-    0x3b,
-    0x5c,
-    0x7a,
-    0x12,
-    0x23,
-    0x57,
-    0xb4,
-    0x24,
-    0xea,
-    0x46,
-    0x5e,
-    0xff,
-    0x0e,
-    0xfc,
-    0x11,
-    0xaa,
-    0x06,
-    0x69,
-    0x0b,
-    0x36,
-    0x31,
-    0xbe,
-    0xca,
-    0xfd,
-    0x0d,
-    0xd2,
-    0xda,
-    0x2c,
-    0xa9,
-    0xc4,
-    0xeb,
-    0x7f,
-    0x5d,
-    0xe3,
-    0x26,
-    0x4c,
-    0xb8,
-    0xca,
-    0xc1,
-    0xc3,
-    0xba,
-    0xcf,
-    0xd1,
-    0x74,
-    0x43,
-    0x9f,
-    0x60,
-    0x12,
-    0xcc,
-    0x22,
-    0xc0,
-    0x76,
-    0x55,
-    0xa5,
-    0x1e,
-    0xe6,
-    0x9e,
-    0x37,
-    0x5a,
-    0x98,
-    0x9a,
-    0x53,
-    0x17,
-    0x72,
-    0x21,
-    0xc0,
-    0x0e,
-    0x14,
-    0xe5,
-    0xb6,
-    0xa7,
-    0x18,
-    0xa7,
-    0x42,
-    0xca,
-    0x98,
-    0xab,
-    0xeb,
-    0xf2,
-    0xf1,
-    0x69,
-    0x96,
-    0x84,
-    0xc7,
-    0x85,
-    0xa7,
-    0x60,
-    0x4a,
-    0x01,
-    0x69,
-    0xb5,
-    0xb7,
-    0xb2,
-    0xb0,
-    0x19,
-    0x21,
-    0xf0,
-    0xbd,
-    0xd9,
-    0x71,
-    0x92,
-    0x61,
-    0x8d,
-    0xac,
-    0x1a,
-    0x66,
-    0xf0,
-    0x74,
-    0x2c,
-    0x2a,
-    0xef,
-    0xd2,
-    0x45,
-    0x8d,
-    0x00,
-    0x32,
-    0xa9,
-    0x0d,
-    0xb5,
-    0xaf,
-    0x9d,
-    0x30,
-    0x91,
-    0x91,
-    0xd7,
-    0x23,
-    0x1a,
-    0x14,
-    0x33,
-    0xa0,
-    0x2f,
-    0x6c,
-    0xa7,
-    0x14,
-    0x9c,
-    0x05,
-    0x79,
-    0x02,
-    0xec,
-    0x0f,
-    0xaf,
-    0xa2,
-    0x7f,
-    0x3a,
-    0xc8,
-    0xcf,
-    0xdc,
-    0xbe,
-    0xa9,
-    0x20,
-    0x47,
-    0x9f,
-    0xda,
-    0x54,
-    0x97,
-    0x2f,
-    0xf2,
-    0xf3,
-    0x42,
-    0xd4,
-    0x50,
-    0x32,
-    0xba,
-    0x0b,
-    0x0c,
-    0x17,
-    0xfc,
-    0xad,
-    0x2d,
-    0xdf,
-    0x65,
-    0x72,
-    0x1d,
-    0x9d,
-    0xc8,
-    0xb3,
-    0x5a,
-    0x23,
-    0xbf,
-    0x74,
-    0x6d,
-    0x25,
-    0x3e,
-    0xa1,
-    0x20,
-    0x9c,
-    0x6e,
-    0x98,
-    0xec,
-    0x69,
-    0xb8,
-    0xe8,
-    0xb1,
-    0x3b,
-    0x1f,
-    0x58,
-    0xaa,
-    0xb2,
-    0xd4,
-    0x2c,
-    0x9f,
-    0xc5,
-    0x04,
-    0xa3,
-    0x5c,
-    0x61,
-    0xf5,
-    0xc4,
-    0x63,
-    0x52,
-    0x51,
-    0x5a,
-    0xde,
-    0x67,
-    0xc2,
-    0x3e,
-    0xd7,
-    0xd1,
-    0xbe,
-    0xd4,
-    0xab,
-    0xcd,
-    0xa5,
-    0xd8,
-    0xbc,
-    0x83,
-    0x09,
-    0x5b,
-    0x67,
-    0x2d,
-    0x4c,
-    0x08,
-    0x36,
-    0x7b,
-    0x71,
-    0xac,
-    0x56,
-    0x36,
-    0x2c,
-    0xf6,
-    0x4b,
-    0x25,
-    0x3b,
-    0x7b,
-    0xe2,
-    0x2d,
-    0xf9,
-    0xfc,
-    0x67,
-    0xbb,
-    0x31,
-    0xec,
-    0x19,
-    0x67,
-    0x30,
-    0x2d,
-    0xdb,
-    0xd1,
-    0x1e,
-    0x1b,
-    0x2c,
-    0xcf,
-    0x8e,
-    0xcb,
-    0x59,
-    0xcb,
-    0x53,
-    0x94,
-    0xf1,
-    0x66,
-    0x95,
-    0xcf,
-    0x7a,
-    0x61,
-    0x25,
-    0xdc,
-    0x62,
-    0xbe,
-    0x0e,
-    0x66,
-    0x39,
-    0x22,
-    0x6d,
-    0xe7,
-    0x1d,
-    0x7e,
-    0x82,
-    0x6e,
-    0x75,
-    0xee,
-    0x06,
-    0xa0,
-    0xe2,
-    0xe2,
-    0xbf,
-    0xfc,
-    0x72,
-    0x7b,
-    0x53,
-    0x64,
-    0x17,
-    0x38,
-    0x5a,
-    0xd9,
-    0x58,
-    0xd1,
-    0xb6,
-    0x87,
-    0x47,
-    0x63,
-    0x27,
-    0x01,
-    0xb3,
-    0xce,
-    0x1a,
-    0xcd,
-    0x9e,
-    0x5b,
-    0xc2,
-    0x23,
-    0xf1,
-    0xa3,
-    0x6a,
-    0xf2,
-    0x6f,
-    0xac,
-    0x0a,
-    0x24,
-    0xe8,
-    0x54,
-    0x18,
-    0x23,
-    0xaf,
-    0xf3,
-    0xa0,
-    0x9c,
-    0x4e,
-    0x3c,
-    0x97,
-    0x83,
-    0x77,
-    0x64,
-    0x6d,
-    0x57,
-    0x3e,
-    0x87,
-    0xe1,
-    0xa7,
-    0x86,
-    0x47,
-    0x19,
-    0xd5,
-    0xb9,
-    0xb6,
-    0xf2,
-    0x1a,
-    0xbd,
-    0x76,
-    0x95,
-    0xca,
-    0x23,
-    0x1e,
-    0x4b,
-    0xd9,
-    0xa1,
-    0xe0,
-    0x92,
-    0x9f,
-    0xc2,
-    0x69,
-    0x70,
-    0xd8,
-    0xdc,
-    0x09,
-    0x07,
-    0xef,
-    0x43,
-    0x14,
-    0x6a,
-    0x7c,
-    0xbc,
-    0x88,
-    0xaf,
-    0x0b,
-    0x34,
-    0xef,
-    0x45,
-    0x1f,
-    0xb2,
-    0x87,
-    0x88,
-    0x76,
-    0x8b,
-    0xa1,
-    0x93,
-    0x8f,
-    0xd5,
-    0x47,
-    0x55,
-    0x6a,
-    0x1d,
-    0x21,
-    0xe8,
-    0x8f,
-    0x5d,
-    0x9a,
-    0x1d,
-    0x51,
-    0x28,
-    0x3e,
-    0x5c,
-    0x54,
-    0x28,
-    0x66,
-    0xab,
-    0x4d,
-    0xca,
-    0x18,
-    0x0c,
-    0x09,
-    0x38,
-    0x29,
-    0x0c,
-    0xb1,
-    0x88,
-    0xa4,
-    0x99,
-    0x4c,
-    0x32,
-    0x70,
-    0x14,
-    0x85,
-    0xc8,
-    0x2c,
-    0xa7,
-    0xae,
-    0xe1,
-    0x5e,
-    0xd9,
-    0x06,
-    0x57,
-    0xcd,
-    0x5f,
-    0x37,
-    0xb2,
-    0x2b,
-    0x35,
-    0x23,
-    0xe3,
-    0xf7,
-    0xee,
-    0xe0,
-    0x36,
-    0xa2,
-    0x49,
-    0x01,
-    0x82,
-    0xf1,
-    0x04,
-    0x18,
-    0xa2,
-    0xa2,
-    0xf5,
-    0x79,
-    0x29,
-    0x52,
-    0x56,
-    0x40,
-    0x52,
-    0x9e,
-    0x61,
-    0x95,
-    0x36,
-    0x89,
-    0x1d,
-    0x2e,
-    0x42,
-    0x1d,
-    0x77,
-    0x16,
-    0xe7,
-    0x56,
-    0x94,
-    0xad,
-    0x93,
-    0x3b,
-    0x66,
-    0xf1,
-    0xe1,
-    0x4e,
-    0x7d,
-    0xfb,
-    0x0d,
-    0x26,
-    0x20,
-    0xcc,
-    0xaa,
-    0x5b,
-    0x9d,
-    0x4a,
-    0x97,
-    0xa2,
-    0xdd,
-    0x86,
-    0x2f,
-    0x39,
-    0x3b,
-    0x40,
-    0xc0,
-    0x86,
-    0x96,
-    0xad,
-    0x3e,
-    0xfb,
-    0xa5,
-    0x78,
-    0x39,
-    0x3c,
-    0x8b,
-    0x06,
-    0x0d,
-    0x84,
-    0xac,
-    0xfe,
-    0x59,
-    0x45,
-    0xbe,
-    0x09,
-    0xb2,
-    0x0e,
-    0x23,
-    0xd6,
-    0x98,
-    0xb2,
-    0x76,
-    0x62,
-    0xa8,
-    0xa7,
-    0x64,
-    0x76,
-    0x14,
-    0xac,
-    0xbd,
-    0x71,
-    0x51,
-    0xae,
-    0xca,
-    0x47,
-    0x0f,
-    0xed,
-    0xe2,
-    0xca,
-    0x6e,
-    0x5b,
-    0x38,
-    0x28,
-    0x6f,
-    0x44,
-    0xf7,
-    0xb5,
-    0xa8,
-    0x34,
-    0x91,
-    0xeb,
-    0x3d,
-    0x16,
-    0x53,
-    0xaf,
-    0x0b,
-    0x99,
-    0x3e,
-    0xd6,
-    0x26,
-    0xd8,
-    0x12,
-    0xe8,
-    0x86,
-    0x39,
-    0xab,
-    0x24,
-    0xfd,
-    0x95,
-    0x90,
-    0xc4,
-    0x6c,
-    0x9a,
-    0xca,
-    0x82,
-    0x37,
-    0x6e,
-    0xf2,
-    0x5a,
-    0xf6,
-    0x95,
-    0x8e,
-    0x92,
-    0x6e,
-    0x15,
-    0x9e,
-    0xf8,
-    0xbf,
-    0xd8,
-    0x71,
-    0x6b,
-    0xde,
-    0x51,
-    0xbd,
-    0x9c,
-    0x46,
-    0x63,
-    0xef,
-    0x16,
-    0xeb,
-    0x7e,
-    0xc0,
-    0x7c,
-    0x70,
-    0x0b,
-    0x09,
-    0x12,
-    0x99,
-    0x0a,
-    0xd8,
-    0x7f,
-    0x03,
-    0xf9,
-    0xc3,
-    0xd2,
-    0x13,
-    0xf8,
-    0x7c,
-    0xc2,
-    0x2c,
-    0x2c,
-    0xa6,
-    0x3a,
-    0x25,
-    0x61,
-    0xe7,
-    0x15,
-    0xfa,
-    0xf3,
-    0x3f,
-    0x26,
-    0xc1,
-    0xee,
-    0x98,
-    0x7b,
-    0xe0,
-    0x74,
-    0x9e,
-    0xe2,
-    0x7e,
-    0x5f,
-    0xd0,
-    0xad,
-    0x37,
-    0x28,
-    0xd7,
-    0xb3,
-    0x14,
-    0x08,
-    0x17,
-    0x97,
-    0xba,
-    0x5c,
-    0x85,
-    0x4d,
-    0xe1,
-    0x4e,
-    0xb8,
-    0xd9,
-    0x08,
-    0xb2,
-    0x42,
-    0x5a,
-    0x67,
-    0x2e,
-    0x40,
-    0x48,
-    0x26,
-    0x9e,
-    0x30,
-    0xfa,
-    0xcc,
-    0xb6,
-    0x03,
-    0x6b,
-    0xfa,
-    0xe9,
-    0x73,
-    0x3d,
-    0x59,
-    0x8a,
-    0x97,
-    0xfe,
-    0xd1,
-    0x32,
-    0xb5,
-    0xab,
-    0xfc,
-    0x61,
-    0x57,
-    0x72,
-    0xda,
-    0x68,
-    0xa1,
-    0xbc,
-    0xc6,
-    0x86,
-    0xe1,
-    0x6b,
-    0xa8,
-    0x51,
-    0x68,
-    0x60,
-    0x6d,
-    0x57,
-    0x99,
-    0x41,
-    0xb4,
-    0x06,
-    0x3f,
-    0x79,
-    0xca,
-    0xc9,
-    0x24,
-    0x80,
-    0xd9,
-    0x74,
-    0xdf,
-    0x5c,
-    0x5c,
-    0xe2,
-    0xed,
-    0x68,
-    0xd6,
-    0xdc,
-    0x03,
-    0x54,
-    0xc4,
-    0x3d,
-    0xa3,
-    0x6d,
-    0xd0,
-    0x54,
-    0xee,
-    0x1e,
-    0x47,
-    0x8a,
-    0xb9,
-    0xb7,
-    0xcd,
-    0x45,
-    0xe2,
-    0x6e,
-    0x50,
-    0x0c,
-    0xe4,
-    0xa4,
-    0x3a,
-    0xeb,
-    0xaa,
-    0x69,
-    0xeb,
-    0x19,
-    0xa1,
-    0x41,
-    0x66,
-    0xd8,
-    0x11,
-    0x28,
-    0x4a,
-    0x9d,
-    0xad,
-    0xd5,
-    0x05,
-    0x71,
-    0x69,
-    0x3c,
-    0x44,
-    0x97,
-    0x8b,
-    0x56,
-    0xad,
-    0x6f,
-    0x05,
-    0x24,
-    0xd1,
-    0x9a,
-    0x02,
-    0xf2,
-    0x5c,
-    0x5f,
-    0xbf,
-    0xd9,
-    0x8f,
-    0x4d,
-    0x9c,
-    0x87,
-    0xf1,
-    0x22,
-    0x73,
-    0x43,
-    0x41,
-    0xec,
-    0x28,
-    0x2b,
-    0xae,
-    0x6e,
-    0x81,
-    0xc0,
-    0x4b,
-    0xc5,
-    0x38,
-    0xa5,
-    0xbd,
-    0x4c,
-    0x4f,
-    0xa4,
-    0x36,
-    0xbc,
-    0xa4,
-    0xf2,
-    0xa8,
-    0x98,
-    0xc5,
-    0xb4,
-    0x32,
-    0xc8,
-    0x05,
-    0xc1,
-    0xdf,
-    0x83,
-    0xd0,
-    0xaa,
-    0x8f,
-    0x73,
-    0x3b,
-    0xf8,
-    0x35,
-    0x14,
-    0xdf,
-    0xb4,
-    0x43,
-    0x5e,
-    0xe8,
-    0x2d,
-    0x63,
-    0xa3,
-    0x69,
-    0xf5,
-    0x68,
-    0xba,
-    0xf3,
-    0x2d,
-    0x84,
-    0x5d,
-    0x65,
-    0x02,
-    0xbb,
-    0xd0,
-    0x05,
-    0x78,
-    0x97,
-    0xc3,
-    0xd0,
-    0x67,
-    0x1e,
-    0x7a,
-    0x0f,
-    0xc2,
-    0x01,
-    0x2b,
-    0x2b,
-    0x1f,
-    0x16,
-    0xa8,
-    0xc2,
-    0x74,
-    0x08,
-    0x3d,
-    0xfa,
-    0x1f,
-    0x4e,
-    0xdc,
-    0x16,
-    0x2a,
-    0x59,
-    0x77,
-    0x47,
-    0xcc,
-    0x12,
-    0xae,
-    0xc4,
-    0x33,
-    0x83,
-    0xaa,
-    0x1c,
-    0x80,
-    0xd4,
-    0x49,
-    0xcb,
-    0x14,
-    0x7a,
-    0x7b,
-    0x0c,
-    0x0a,
-    0xab,
-    0xec,
-    0xef,
-    0x04,
-    0x15,
-    0xe3,
-    0xab,
-    0x2b,
-    0xcf,
-    0x6a,
-    0x35,
-    0x71,
-    0x90,
-    0xaf,
-    0x12,
-    0x1a,
-    0x1f,
-    0xaa,
-    0x69,
-    0x7a,
-    0x0a,
-    0x00,
-    0x5c,
-    0x00,
-    0x9b,
-    0x27,
-    0x98,
-    0x73,
-    0x08,
-    0xcb,
-    0x2b,
-    0x7c,
-    0xea,
-    0x71,
-    0x97,
-    0x65,
-    0xf0,
-    0x5b,
-    0x24,
-    0x20,
-    0xd5,
-    0xab,
-    0x7a,
-    0x8b,
-    0x8f,
-    0xcb,
-    0x6e,
-    0xf2,
-    0xca,
-    0x0b,
-    0x1d,
-    0xd5,
-    0x94,
-    0x8c,
-    0x37,
-    0xec,
-    0x5a,
-    0x5e,
-    0x9e,
-    0x69,
-    0x13,
-    0xe5,
-    0x30,
-    0x7d,
-    0xbb,
-    0x81,
-    0xe0,
-    0x1d,
-    0x03,
-    0x6d,
-    0x0c,
-    0x06,
-    0x47,
-    0xe8,
-    0x0b,
-    0xff,
-    0xc0,
-    0x93,
-    0x05,
-    0x5e,
-    0xfb,
-    0x1b,
-    0x07,
-    0xcd,
-    0x89,
-    0x17,
-    0x56,
-    0x4e,
-    0xf9,
-    0x34,
-    0x04,
-    0x7d,
-    0x03,
-    0x8f,
-    0xc2,
-    0x15,
-    0x06,
-    0x62,
-    0xf5,
-    0xb6,
-    0xb5,
-    0xe3,
-    0x0c,
-    0xe6,
-    0x0c,
-    0x69,
-    0x10,
-    0x55,
-    0x8a,
-    0xd1,
-    0x7c,
-    0x65,
-    0x9a,
-    0x20,
-    0x50,
-    0xe9,
-    0x52,
-    0x69,
-    0x61,
-    0x2d,
-    0x5f,
-    0xf2,
-    0xf3,
-    0x38,
-    0x40,
-    0x92,
-    0x89,
-    0x4d,
-    0xb3,
-    0x5d,
-    0xfc,
-    0xb8,
-    0x6d,
-    0x84,
-    0xcb,
-    0xc7,
-    0x0e,
-    0x76,
-    0xb2,
-    0x16,
-    0x54,
-    0x4b,
-    0x7e,
-    0x0f,
-    0x8f,
-    0x63,
-    0x1f,
-    0xb2,
-    0x55,
-    0x4a,
-    0xff,
-    0x92,
-    0x76,
-    0xdf,
-    0x92,
-    0x20,
-    0x32,
-    0xb6,
-    0x2f,
-    0x2c,
-    0xaa,
-    0xba,
-    0x1e,
-    0xa9,
-    0x95,
-    0x17,
-    0xf2,
-    0xb1,
-    0x34,
-    0x57,
-    0x18,
-    0xc9,
-    0x88,
-    0xca,
-    0xb1,
-    0x65,
-    0xc2,
-    0x2c,
-    0x9d,
-    0xaf,
-    0xfb,
-    0x82,
-    0xd8,
-    0x84,
-    0x25,
-    0x45,
-    0x0a,
-    0xbf,
-    0x42,
-    0xc2,
-    0x59,
-    0xbb,
-    0xd4,
-    0xc1,
-    0x82,
-    0x13,
-    0x94,
-    0x65,
-    0x28,
-    0xac,
-    0x66,
-    0x53,
-    0x6c,
-    0xf6,
-    0x8d,
-    0x16,
-    0xbd,
-    0x6e,
-    0x1b,
-    0xc3,
-    0xf1,
-    0x68,
-    0xac,
-    0xd8,
-    0x95,
-    0x0b,
-    0x54,
-    0x6a,
-    0x82,
-    0x9d,
-    0xd6,
-    0x80,
-    0xb1,
-    0x01,
-    0x17,
-    0xba,
-    0x51,
-    0x7d,
-    0xd2,
-    0x36,
-    0x16,
-    0xc1,
-    0x8c,
-    0xb3,
-    0xd3,
-    0x25,
-    0xcb,
-    0xf7,
-    0x4b,
-    0x33,
-    0x83,
-    0x6f,
-    0x45,
-    0x65,
-    0xd1,
-    0x16,
-    0xde,
-    0x2f,
-    0xeb,
-    0x97,
-    0x23,
-    0x40,
-    0x58,
-    0xb6,
-    0xdf,
-    0x06,
-    0x5c,
-    0xec,
-    0xb2,
-    0x70,
-    0xb7,
-    0x51,
-    0x63,
-    0xf7,
-    0x8f,
-    0xc0,
-    0x77,
-    0xdf,
-    0xaa,
-    0x35,
-    0x03,
-    0xba,
-    0xe0,
-    0x79,
-    0xbe,
-    0x2f,
-    0xd0,
-    0x02,
-    0x5a,
-    0xf9,
-    0xd3,
-    0x14,
-    0x15,
-    0x32,
-    0x2e,
-    0x2d,
-    0x8b,
-    0xd2,
-    0x8c,
-    0xa0,
-    0xce,
-    0x73,
-    0xab,
-    0x80,
-    0xb8,
-    0x57,
-    0x55,
-    0xbf,
-    0x80,
-    0xab,
-    0x92,
-    0x97,
-    0x8c,
-    0x0d,
-    0x1c,
-    0x29,
-    0x86,
-    0x4d,
-    0x13,
-    0x65,
-    0xb2,
-    0x70,
-    0xf2,
-    0x29,
-    0x7f,
-    0xfb,
-    0xc2,
-    0xad,
-    0x5c,
-    0x6e,
-    0x8d,
-    0x1e,
-    0xcc,
-    0x0e,
-    0x16,
-    0x89,
-    0xbd,
-    0xe7,
-    0xc7,
-    0xfb,
-    0x16,
-    0x12,
-    0xeb,
-    0xe7,
-    0x8f,
-    0x34,
-    0x1d,
-    0xc7,
-    0xc5,
-    0x47,
-    0x00,
-    0x06,
-    0x8e,
-    0x9d,
-    0x31,
-    0x1e,
-    0x89,
-    0x21,
-    0x7a,
-    0xfe,
-    0xfa,
-    0xe1,
-    0x49,
-    0xae,
-    0xd5,
-    0xc9,
-    0x60,
-    0x35,
-    0x19,
-    0xb1,
-    0xcd,
-    0xbb,
-    0x5f,
-    0x9b,
-    0x1d,
-    0xeb,
-    0xb3,
-    0x35,
-    0xcd,
-    0x9b,
-    0xa2,
-    0xa6,
-    0x01,
-    0xaf,
-    0x94,
-    0x86,
-    0x78,
-    0x3a,
-    0x5d,
-    0x2e,
-    0xc0,
-    0xe7,
-    0x0e,
-    0x33,
-    0xa6,
-    0x98,
-    0x11,
-    0x2d,
-    0xf1,
-    0x4c,
-    0x75,
-    0xbd,
-    0x50,
-    0x46,
-    0x86,
-    0xce,
-    0x90,
-    0x6c,
-    0xa1,
-    0x1a,
-    0x12,
-    0xed,
-    0x46,
-    0xf0,
-    0x7d,
-    0x26,
-    0x6f,
-    0x35,
-    0xb0,
-    0xc7,
-    0x20,
-    0xaa,
-    0xfb,
-    0x31,
-    0x40,
-    0x6c,
-    0x8e,
-    0x23,
-    0xa7,
-    0xc1,
-    0x31,
-    0x96,
-    0x78,
-    0x11,
-    0x36,
-    0xe5,
-    0xb1,
-    0x33,
-    0xac,
-    0x31,
-    0x00,
-    0xeb,
-    0xd6,
-    0x04,
-    0xd9,
-    0xb0,
-    0xdc,
-    0x34,
-    0xc5,
-    0xb2,
-    0xbf,
-    0x0b,
-    0xfd,
-    0x1b,
-    0x92,
-    0xa4,
-    0x37,
-    0x95,
-    0xe8,
-    0x98,
-    0xc0,
-    0x0d,
-    0x89,
-    0xdb,
-    0xcb,
-    0xb7,
-    0x69,
-    0xe0,
-    0x09,
-    0x53,
-    0xda,
-    0x04,
-    0x79,
-    0xae,
-    0x00,
-    0x29,
-    0x82,
-    0x6b,
-    0x85,
-    0xa1,
-    0x3f,
-    0x03,
-    0x8f,
-    0x4f,
-    0x1a,
-    0x0b,
-    0xef,
-    0x08,
-    0x9c,
-    0xb6,
-    0x9c,
-    0x3f,
-    0x83,
-    0x9a,
-    0x5f,
-    0xe2,
-    0x15,
-    0xb7,
-    0xcf,
-    0x7f,
-    0xb5,
-    0xb5,
-    0x80,
-    0xab,
-    0xb4,
-    0x6d,
-    0x78,
-    0xa4,
-    0x69,
-    0xab,
-    0xe2,
-    0x35,
-    0x84,
-    0x32,
-    0x07,
-    0xda,
-    0x9f,
-    0x01,
-    0x79,
-    0x25,
-    0x16,
-    0xd5,
-    0x91,
-    0x60,
-    0x19,
-    0xef,
-    0x1c,
-    0x74,
-    0xff,
-    0x17,
-    0x52,
-    0x0a,
-    0xdd,
-    0xe1,
-    0x08,
-    0xef,
-    0x58,
-    0x2f,
-    0x26,
-    0xbd,
-    0xb7,
-    0xf7,
-    0x5a,
-    0xb8,
-    0x3d,
-    0x47,
-    0x0e,
-    0xf6,
-    0xb5,
-    0x86,
-    0x98,
-    0xc3,
-    0x4e,
-    0xfc,
-    0xb1,
-    0x43,
-    0xa9,
-    0x95,
-    0x29,
-    0x59,
-    0x31,
-    0xe1,
-    0xd9,
-    0xc8,
-    0xab,
-    0x60,
-    0xd8,
-    0x98,
-    0x0d,
-    0xfd,
-    0xf2,
-    0xbc,
-    0x94,
-    0xd8,
-    0x55,
-    0xf1,
-    0x11,
-    0x48,
-    0x8e,
-    0xe9,
-    0x84,
-    0x21,
-    0xb4,
-    0xa9,
-    0xeb,
-    0x32,
-    0xe3,
-    0x30,
-    0x5c,
-    0x12,
-    0xec,
-    0x59,
-    0x52,
-    0x1d,
-    0x4b,
-    0x02,
-    0x45,
-    0xb9,
-    0x5a,
-    0x6e,
-    0x7d,
-    0xde,
-    0xc4,
-    0xe8,
-    0x27,
-    0xd5,
-    0x3b,
-    0xa9,
-    0xa9,
-    0x3f,
-    0x6e,
-    0xfc,
-    0x33,
-    0x5a,
-    0x35,
-    0xa0,
-    0x96,
-    0x80,
-    0x0f,
-    0x6e,
-    0x5a,
-    0xf0,
-    0xcf,
-    0x3b,
-    0x0a,
-    0xd1,
-    0x92,
-    0x00,
-    0xd3,
-    0x74,
-    0xf4,
-    0x39,
-    0x4e,
-    0xda,
-    0x84,
-    0x8a,
-    0x99,
-    0x76,
-    0x75,
-    0xa8,
-    0xac,
-    0x33,
-    0x96,
-    0x77,
-    0xea,
-    0xb9,
-    0x84,
-    0x70,
-    0xf7,
-    0xec,
-    0x1d,
-    0x46,
-    0xca,
-    0xb6,
-    0x39,
-    0xc9,
-    0x03,
-    0x07,
-    0x95,
-    0x0a,
-    0x7e,
-    0x1a,
-    0x10,
-    0xc0,
-    0x28,
-    0xf9,
-    0x1a,
-    0xea,
-    0x11,
-    0x43,
-    0x69,
-    0xb6,
-    0xc3,
-    0x2d,
-    0xed,
-    0xa2,
-    0xd3,
-    0xc7,
-    0x07,
-    0xe1,
-    0xb5,
-    0x81,
-    0xf6,
-    0x00,
-    0xd4,
-    0xed,
-    0x92,
-    0xc9,
-    0xe2,
-    0xc6,
-    0x3c,
-    0x68,
-    0x6d,
-    0x32,
-    0x15,
-    0xcc,
-    0xb4,
-    0x44,
-    0x6e,
-    0x50,
-    0xb8,
-    0xc5,
-    0x80,
-    0x9b,
-    0x96,
-    0x34,
-    0x5d,
-    0xc4,
-    0x13,
-    0x0b,
-    0x27,
-    0xba,
-    0x79,
-    0x44,
-    0x80,
-    0xe4,
-    0xa2,
-    0x1c,
-    0x41,
-    0x04,
-    0x52,
-    0x17,
-    0x6f,
-    0x61,
-    0xca,
-    0x44,
-    0x6b,
-    0x25,
-    0x99,
-    0xc2,
-    0x68,
-    0x04,
-    0xb6,
-    0x83,
-    0x22,
-    0x1e,
-    0xcc,
-    0x50,
-    0xce,
-    0x27,
-    0xd5,
-    0x0d,
-    0x4c,
-    0xc5,
-    0xea,
-    0x3f,
-    0xa4,
-    0x39,
-    0x59,
-    0xcb,
-    0xb0,
-    0x42,
-    0xf9,
-    0x00,
-    0x16,
-    0x3e,
-    0xba,
-    0xd8,
-    0x7a,
-    0x93,
-    0x80,
-    0x7b,
-    0xf1,
-    0x4d,
-    0x32,
-    0x05,
-    0xb8,
-    0x09,
-    0x0d,
-    0x89,
-    0x26,
-    0x11,
-    0x3f,
-    0x56,
-    0xdf,
-    0xc8,
-    0xb1,
-    0x79,
-    0x4b,
-    0x49,
-    0x24,
-    0x83,
-    0x46,
-    0x4b,
-    0x7f,
-    0x8c,
-    0x19,
-    0x48,
-    0x67,
-    0x77,
-    0xa9,
-    0xde,
-    0x11,
-    0x78,
-    0xef,
-    0x75,
-    0x54,
-    0xd4,
-    0xa8,
-    0x22,
-    0x03,
-    0xe8,
-    0x4e,
-    0xcb,
-    0x79,
-    0x6d,
-    0x46,
-    0x8c,
-    0x75,
-    0xfa,
-    0x5b,
-    0x5a,
-    0x29,
-    0xca,
-    0x6b,
-    0xe6,
-    0x8d,
-    0xc0,
-    0x60,
-    0xc4,
-    0xf9,
-    0xa8,
-    0x62,
-    0xcd,
-    0xf3,
-    0xc0,
-    0x4c,
-    0xc2,
-    0x46,
-    0x77,
-    0x5c,
-    0x32,
-    0x54,
-    0x74,
-    0x2e,
-    0x9d,
-    0xac,
-    0xda,
-    0xeb,
-    0xd9,
-    0xdf,
-    0xcb,
-    0xbe,
-    0xb5,
-    0x90,
-    0x2b,
-    0x87,
-    0xdd,
-    0xcb,
-    0xa6,
-    0xd4,
-    0xfd,
-    0x98,
-    0xf4,
-    0x0d,
-    0x29,
-    0xcf,
-    0x5b,
-    0xee,
-    0x7d,
-    0x2d,
-    0x76,
-    0x3a,
-    0x00,
-    0xa8,
-    0x36,
-    0xae,
-    0xce,
-    0x00,
-    0x26,
-    0x34,
-    0x77,
-    0x97,
-    0xf3,
-    0x5a,
-    0xa2,
-    0x82,
-    0x2b,
-    0x02,
-    0xf6,
-    0xe0,
-    0x45,
-    0x5b,
-    0x3a,
-    0x6a,
-    0xe2,
-    0x10,
-    0xba,
-    0x4c,
-    0x52,
-    0xbf,
-    0xed,
-    0x34,
-    0x5a,
-    0xac,
-    0x56,
-    0xa8,
-    0x34,
-    0xb7,
-    0xa8,
-    0x9c,
-    0xd8,
-    0x8b,
-    0x2d,
-    0x44,
-    0x7a,
-    0x19,
-    0x68,
-    0x27,
-    0x54,
-    0x45,
-    0xfa,
-    0x75,
-    0xa5,
-    0xde,
-    0xc2,
-    0x9a,
-    0xfa,
-    0xd4,
-    0x48,
-    0x13,
-    0xac,
-    0xa5,
-    0x5c,
-    0x80,
-    0xaa,
-    0x19,
-    0xfa,
-    0xfb,
-    0x78,
-    0x2f,
-    0x71,
-    0xa9,
-    0x78,
-    0x57,
-    0xc4,
-    0x8e,
-    0x69,
-    0xe1,
-    0x51,
-    0xa6,
-    0x2d,
-    0xb6,
-    0xb0,
-    0x31,
-    0xcf,
-    0x46,
-    0xde,
-    0x4e,
-    0xc4,
-    0xc1,
-    0x9b,
-    0xcb,
-    0x71,
-    0x8a,
-    0x10,
-    0x3c,
-    0xee,
-    0xe9,
-    0xb5,
-    0x4a,
-    0x0a,
-    0x00,
-    0x72,
-    0x4e,
-    0x8f,
-    0x00,
-    0x05,
-    0x1f,
-    0xc7,
-    0x9c,
-    0xa3,
-    0x27,
-    0x3e,
-    0xbe,
-    0xe2,
-    0xbd,
-    0xca,
-    0x79,
-    0xd6,
-    0xaf,
-    0xc9,
-    0x40,
-    0x7a,
-    0x1d,
-    0xaa,
-    0x55,
-    0x52,
-    0x8e,
-    0xaf,
-    0x83,
-    0x4f,
-    0x3d,
-    0xf0,
-    0x10,
-    0xf3,
-    0xb4,
-    0xa4,
-    0xee,
-    0xb5,
-    0x9c,
-    0x9c,
-    0x31,
-    0xa7,
-    0xd4,
-    0x10,
-    0xc6,
-    0x56,
-    0xc0,
-    0x9e,
-    0x61,
-    0xf2,
-    0xe4,
-    0x90,
-    0xb7,
-    0xaf,
-    0xb1,
-    0x5e,
-    0xee,
-    0x6a,
-    0x9e,
-    0x73,
-    0x51,
-    0x90,
-    0x7b,
-    0x34,
-    0x49,
-    0x3c,
-    0x02,
-    0x3f,
-    0x88,
-    0x9f,
-    0xb0,
-    0xf0,
-    0x88,
-    0xa5,
-    0xd3,
-    0x2a,
-    0x34,
-    0xd5,
-    0xe3,
-    0x54,
-    0xe5,
-    0x7a,
-    0x15,
-    0xa1,
-    0x8f,
-    0x00,
-    0x2e,
-    0x95,
-    0x3d,
-    0xa0,
-    0x95,
-    0xc5,
-    0xba,
-    0x40,
-    0xad,
-    0xde,
-    0x91,
-    0x94,
-    0x61,
-    0xe8,
-    0x38,
-    0x8a,
-    0x01,
-    0xcc,
-    0x89,
-    0xe5,
-    0x4c,
-    0x14,
-    0x71,
-    0x27,
-    0xce,
-    0xf3,
-    0xec,
-    0xb5,
-    0x6c,
-    0x85,
-    0x31,
-    0x36,
-    0x3d,
-    0x57,
-    0x29,
-    0x3c,
-    0x9b,
-    0x2a,
-    0x26,
-    0x26,
-    0x7a,
-    0xf4,
-    0xd2,
-    0x45,
-    0xf9,
-    0x28,
-    0x66,
-    0x3d,
-    0x37,
-    0x37,
-    0x1c,
-    0xae,
-    0x68,
-    0x57,
-    0xe6,
-    0x14,
-    0x28,
-    0x83,
-    0x60,
-    0xec,
-    0x0e,
-    0xc3,
-    0x03,
-    0x19,
-    0x85,
-    0xad,
-    0x9c,
-    0x85,
-    0xd7,
-    0x2c,
-    0xfd,
-    0x0b,
-    0x8b,
-    0x80,
-    0xf3,
-    0x95,
-    0xf1,
-    0x86,
-    0x78,
-    0x81,
-    0xfb,
-    0x3a,
-    0x29,
-    0x4a,
-    0x4e,
-    0x7a,
-    0xfa,
-    0x64,
-    0x99,
-    0x0d,
-    0x28,
-    0x67,
-    0x26,
-    0xe3,
-    0x6f,
-    0x70,
-    0xaf,
-    0x9e,
-    0x7e,
-    0xc4,
-    0x72,
-    0x52,
-    0xa8,
-    0xb7,
-    0x87,
-    0x89,
-    0xdc,
-    0xcd,
-    0x72,
-    0x8b,
-    0xd7,
-    0x1e,
-    0xf5,
-    0xdc,
-    0x98,
-    0xff,
-    0x28,
-    0x05,
-    0x14,
-    0xde,
-    0xcb,
-    0x97,
-    0x2c,
-    0x6e,
-    0xda,
-    0x6e,
-    0xdc,
-    0x05,
-    0x62,
-    0x33,
-    0xb5,
-    0x42,
-    0x94,
-    0x24,
-    0x8d,
-    0xf2,
-    0x17,
-    0x18,
-    0x75,
-    0x34,
-    0xa3,
-    0xbd,
-    0xeb,
-    0xdc,
-    0xcc,
-    0x25,
-    0x51,
-    0x16,
-    0x1b,
-    0x81,
-    0x9e,
-    0x4c,
-    0x63,
-    0x2c,
-    0x54,
-    0x49,
-    0x52,
-    0xeb,
-    0xb2,
-    0x9e,
-    0x47,
-    0x73,
-    0x2a,
-    0x44,
-    0x63,
-    0x2b,
-    0x15,
-    0x84,
-    0xe3,
-    0x34,
-    0xa6,
-    0x14,
-    0xad,
-    0xa7,
-    0x1c,
-    0x83,
-    0x28,
-    0x1d,
-    0x3c,
-    0xd6,
-    0x51,
-    0x75,
-    0xff,
-    0x74,
-    0x0c,
-    0xd1,
-    0x88,
-    0x3f,
-    0xb7,
-    0xe2,
-    0x58,
-    0x04,
-    0x05,
-    0x66,
-    0xc5,
-    0x15,
-    0x0a,
-    0xee,
-    0xa8,
-    0x34,
-    0x92,
-    0xe5,
-    0x57,
-    0xb3,
-    0xb7,
-    0xce,
-    0xd3,
-    0xda,
-    0xb3,
-    0xcd,
-    0x42,
-    0x89,
-    0xf2,
-    0x69,
-    0x9f,
-    0x1e,
-    0x6c,
-    0x90,
-    0xb0,
-    0x99,
-    0x31,
-    0xdb,
-    0x38,
-    0xff,
-    0x45,
-    0x14,
-    0x6f,
-    0xfc,
-    0xaf,
-    0xf6,
-    0xaf,
-    0xcb,
-    0xcd,
-    0x33,
-    0x70,
-    0x5b,
-    0xea,
-    0xbc,
-    0x76,
-    0xaa,
-    0x12,
-    0x3c,
-    0x49,
-    0x75,
-    0x25,
-    0xe5,
-    0xe6,
-    0x14,
-    0x2b,
-    0x70,
-    0xb4,
-    0xa0,
-    0xe7,
-    0x5f,
-    0xb9,
-    0x56,
-    0xaf,
-    0x86,
-    0x0e,
-    0x40,
-    0x7b,
-    0xc9,
-    0x90,
-    0x12,
-    0x3b,
-    0x27,
-    0xd9,
-    0x52,
-    0x6e,
-    0xf8,
-    0x6f,
-    0xbb,
-    0xf0,
-    0x72,
-    0x3a,
-    0xe4,
-    0x13,
-    0x72,
-    0x3c,
-    0x1d,
-    0xf2,
-    0x7a,
-    0x7c,
-    0x99,
-    0x02,
-    0xf5,
-    0x43,
-    0xd3,
-    0xea,
-    0xc3,
-    0x8b,
-    0x2a,
-    0x95,
-    0xf1,
-    0xb5,
-    0xce,
-    0x85,
-    0xc8,
-    0x7a,
-    0xe0,
-    0x6a,
-    0x0a,
-    0x24,
-    0xd5,
-    0xf3,
-    0x78,
-    0xfe,
-    0x1c,
-    0xe4,
-    0x97,
-    0x09,
-    0x00,
-    0x69,
-    0xb4,
-    0xf0,
-    0xcf,
-    0xa9,
-    0x26,
-    0x3e,
-    0x3c,
-    0x9f,
-    0xd3,
-    0xcf,
-    0x02,
-    0x25,
-    0xf6,
-    0x84,
-    0xca,
-    0x52,
-    0x1f,
-    0x3b,
-    0x4f,
-    0x06,
-    0x7b,
-    0xff,
-    0xc0,
-    0xc3,
-    0x55,
-    0x7b,
-    0x66,
-    0xbf,
-    0xdd,
-    0xb5,
-    0x86,
-    0x37,
-    0x28,
-    0xf9,
-    0x89,
-    0x05,
-    0x79,
-    0x12,
-    0x5a,
-    0x75,
-    0xbf,
-    0xc1,
-    0x10,
-    0x55,
-    0x5e,
-    0x67,
-    0xcd,
-    0x4b,
-    0x32,
-    0x05,
-    0xe5,
-    0x6c,
-    0xd1,
-    0x66,
-    0x43,
-    0x09,
-    0x11,
-    0x9b,
-    0x09,
-    0xcc,
-    0xcb,
-    0xa8,
-    0x77,
-    0x04,
-    0xde,
-    0x7d,
-    0x0e,
-    0x3e,
-    0x76,
-    0x28,
-    0xf5,
-    0x15,
-    0x8e,
-    0x48,
-    0x9b,
-    0x4b,
-    0xb3,
-    0xc5,
-    0x9e,
-    0x18,
-    0x0b,
-    0xbe,
-    0xec,
-    0xc1,
-    0x97,
-    0xc3,
-    0x28,
-    0x6d,
-    0xb5,
-    0x45,
-    0x4f,
-    0x35,
-    0xe9,
-    0x4a,
-    0x9b,
-    0x7a,
-    0xdc,
-    0x65,
-    0xa7,
-    0x7b,
-    0xa5,
-    0xe6,
-    0xd5,
-    0x26,
-    0x48,
-    0x4e,
-    0xed,
-    0x2f,
-    0x7c,
-    0x06,
-    0x06,
-    0x60,
-    0xb2,
-    0x50,
-    0xaa,
-    0x30,
-    0x52,
-    0x7d,
-    0x35,
-    0x96,
-    0x48,
-    0x61,
-    0x7e,
-    0x1f,
-    0xbf,
-    0x04,
-    0xb9,
-    0x3f,
-    0x2c,
-    0x9a,
-    0x9c,
-    0xe4,
-    0x8f,
-    0xb5,
-    0xc1,
-    0x51,
-    0xf6,
-    0xba,
-    0x4c,
-    0x2a,
-    0x42,
-    0x91,
-    0xcd,
-    0xcb,
-    0x2d,
-    0xa1,
-    0x68,
-    0xde,
-    0x8c,
-    0xfc,
-    0x33,
-    0x2d,
-    0xd2,
-    0xd6,
-    0xdf,
-    0xb4,
-    0xd6,
-    0x3c,
-    0x9b,
-    0xfb,
-    0xd6,
-    0x03,
-    0x35,
-    0xa3,
-    0xbb,
-    0xfe,
-    0x82,
-    0x3e,
-    0x9e,
-    0x74,
-    0x01,
-    0x64,
-    0x8c,
-    0xd0,
-    0xbb,
-    0x03,
-    0x86,
-    0x9b,
-    0x6d,
-    0xf6,
-    0xcc,
-    0xa8,
-    0xe9,
-    0xd9,
-    0x5c,
-    0x8e,
-    0xba,
-    0x1c,
-    0xb5,
-    0x5b,
-    0x07,
-    0x57,
-    0xe0,
-    0x87,
-    0xba,
-    0xdd,
-    0xb1,
-    0x27,
-    0xe0,
-    0x94,
-    0x4b,
-    0x63,
-    0x53,
-    0x04,
-    0xe2,
-    0x2a,
-    0x97,
-    0xad,
-    0xc5,
-    0x25,
-    0x03,
-    0x9e,
-    0x9b,
-    0xe9,
-    0x21,
-    0x43,
-    0xec,
-    0x70,
-    0x57,
-    0x7f,
-    0xe4,
-    0xca,
-    0xc6,
-    0xfa,
-    0x54,
-    0x10,
-    0x72,
-    0xbd,
-    0xfa,
-    0x9a,
-    0xa3,
-    0xfc,
-    0x02,
-    0x71,
-    0x8c,
-    0x32,
-    0xcc,
-    0x07,
-    0x2b,
-    0x74,
-    0xf0,
-    0x26,
-    0x70,
-    0xfe,
-    0x80,
-    0x27,
-    0xa1,
-    0x13,
-    0x8d,
-    0x64,
-    0xfd,
-    0x04,
-    0xec,
-    0xf0,
-    0xa0,
-    0x8e,
-    0x39,
-    0x85,
-    0xa6,
-    0x68,
-    0x1d,
-    0xbd,
-    0x93,
-    0x1d,
-    0xcd,
-    0x85,
-    0xf3,
-    0x18,
-    0xd3,
-    0xcf,
-    0x3d,
-    0xfd,
-    0x11,
-    0x88,
-    0xfd,
-    0x40,
-    0x03,
-    0xca,
-    0x32,
-    0xf0,
-    0x44,
-    0x52,
-    0xf5,
-    0xd3,
-    0x54,
-    0x34,
-    0x5c,
-    0xb8,
-    0x98,
-    0xcd,
-    0x9e,
-    0x09,
-    0xa2,
-    0xfa,
-    0x78,
-    0xa0,
-    0xb3,
-    0x87,
-    0xcf,
-    0xdb,
-    0x7e,
-    0xeb,
-    0x96,
-    0xf3,
-    0x2f,
-    0x32,
-    0xf2,
-    0x89,
-    0xac,
-    0x3a,
-    0x9c,
-    0x82,
-    0x1b,
-    0x22,
-    0x88,
-    0x15,
-    0xa4,
-    0x00,
-    0xc4,
-    0x22,
-    0x78,
-    0xd2,
-    0xa2,
-    0xc6,
-    0x12,
-    0xb8,
-    0x19,
-    0x2c,
-    0xbd,
-    0x60,
-    0x69,
-    0xa6,
-    0x56,
-    0xc1,
-    0xfe,
-    0xfc,
-    0x53,
-    0x0c,
-    0x97,
-    0x04,
-    0x04,
-    0xdf,
-    0xa7,
-    0x72,
-    0x19,
-    0xbc,
-    0xfb,
-    0xf2,
-    0x65,
-    0xbb,
-    0x9e,
-    0x74,
-    0xe1,
-    0x7b,
-    0xfa,
-    0xc7,
-    0xf4,
-    0x5e,
-    0x3f,
-    0x6a,
-    0xf1,
-    0xf6,
-    0x09,
-    0x9f,
-    0xe2,
-    0xba,
-    0x3d,
-    0xc0,
-    0x84,
-    0xfe,
-    0x33,
-    0xd6,
-    0x92,
-    0x22,
-    0x1b,
-    0x68,
-    0x46,
-    0x09,
-    0x99,
-    0x91,
-    0x1e,
-    0xcc,
-    0xb3,
-    0x55,
-    0xdc,
-    0xb0,
-    0xed,
-    0x35,
-    0xd0,
-    0x56,
-    0xb2,
-    0x01,
-    0x59,
-    0x32,
-    0xf6,
-    0xee,
-    0xaa,
-    0x3e,
-    0x1a,
-    0xe9,
-    0xca,
-    0xf0,
-    0x10,
-    0x2a,
-    0xde,
-    0x69,
-    0xbf,
-    0x0b,
-    0xab,
-    0xef,
-    0xa9,
-    0x1b,
-    0x57,
-    0x9d,
-    0xcb,
-    0x6e,
-    0x6f,
-    0x59,
-    0xc4,
-    0x38,
-    0x2f,
-    0x07,
-    0x3a,
-    0x9a,
-    0xfd,
-    0xfc,
-    0x7a,
-    0xbc,
-    0x36,
-    0xb6,
-    0x5e,
-    0x1c,
-    0x2d,
-    0xca,
-    0x74,
-    0x26,
-    0x71,
-    0x1d,
-    0x5c,
-    0x04,
-    0x4f,
-    0x57,
-    0x72,
-    0xb7,
-    0x98,
-    0x95,
-    0xae,
-    0x67,
-    0xa5,
-    0x5f,
-    0xc8,
-    0xf7,
-    0x97,
-    0xd9,
-    0x9f,
-    0xdd,
-    0xe3,
-    0x3d,
-    0xdb,
-    0x31,
-    0x0f,
-    0x88,
-    0xd1,
-    0x03,
-    0xb6,
-    0x74,
-    0xa8,
-    0xf2,
-    0xd2,
-    0xa7,
-    0xba,
-    0xfa,
-    0x3b,
-    0x2a,
-    0x3d,
-    0x8e,
-    0x6a,
-    0x1c,
-    0x23,
-    0xe7,
-    0x83,
-    0xa8,
-    0x3e,
-    0x9b,
-    0x93,
-    0x34,
-    0xa8,
-    0x71,
-    0x15,
-    0xdb,
-    0x62,
-    0x74,
-    0xbc,
-    0x1e,
-    0x3b,
-    0x46,
-    0x6c,
-    0xd6,
-    0xf4,
-    0xb7,
-    0x89,
-    0x6d,
-    0xa1,
-    0x96,
-    0x75,
-    0x4e,
-    0x52,
-    0xc8,
-    0x54,
-    0x9a,
-    0xf3,
-    0x96,
-    0x13,
-    0x1d,
-    0x71,
-    0x4b,
-    0xa8,
-    0x80,
-    0x1f,
-    0xff,
-    0x9b,
-    0xc0,
-    0x57,
-    0xae,
-    0xc5,
-    0xdf,
-    0x64,
-    0x8d,
-    0x58,
-    0xd9,
-    0x9f,
-    0x9d,
-    0x1f,
-    0xd9,
-    0xd9,
-    0x80,
-    0x07,
-    0xad,
-    0xf9,
-    0x8c,
-    0xdf,
-    0x77,
-    0xe6,
-    0x1e,
-    0x5c,
-    0xa6,
-    0xa8,
-    0x30,
-    0x60,
-    0x25,
-    0xca,
-    0x2e,
-    0x7b,
-    0xd2,
-    0x02,
-    0x06,
-    0xb3,
-    0x32,
-    0x14,
-    0x7f,
-    0x80,
-    0x63,
-    0xf3,
-    0xcb,
-    0x1b,
-    0x52,
-    0x29,
-    0x5f,
-    0xf8,
-    0x2e,
-    0x7a,
-    0x02,
-    0x91,
-    0x1c,
-    0xc4,
-    0x24,
-    0x66,
-    0x2c,
-    0x2a,
-    0x72,
-    0x42,
-    0x8b,
-    0x71,
-    0xa7,
-    0xbf,
-    0xfb,
-    0xaa,
-    0xa5,
-    0x0c,
-    0x81,
-    0x12,
-    0xc4,
-    0xee,
-    0x5d,
-    0x36,
-    0x6a,
-    0x05,
-    0x3f,
-    0x5b,
-    0xdc,
-    0x51,
-    0xb8,
-    0x1c,
-    0x53,
-    0xf5,
-    0xef,
-    0x55,
-    0x53,
-    0x3a,
-    0x95,
-    0x40,
-    0x38,
-    0xd6,
-    0x1b,
-    0xde,
-    0x12,
-    0x6f,
-    0x22,
-    0x99,
-    0xb2,
-    0x5b,
-    0x33,
-    0x27,
-    0x05,
-    0xaa,
-    0xb0,
-    0xb1,
-    0xa1,
-    0x66,
-    0x0a,
-    0x35,
-    0x9e,
-    0x19,
-    0x35,
-    0x29,
-    0xa7,
-    0x90,
-    0x59,
-    0x61,
-    0x50,
-    0xdf,
-    0xcb,
-    0x32,
-    0xaa,
-    0xa5,
-    0x3b,
-    0xd8,
-    0x16,
-    0x91,
-    0x2f,
-    0x15,
-    0x56,
-    0x25,
-    0xb0,
-    0x1b,
-    0xea,
-    0xba,
-    0x42,
-    0xac,
-    0x99,
-    0xc5,
-    0x1a,
-    0x80,
-    0x4e,
-    0x58,
-    0x8c,
-    0xe7,
-    0x25,
-    0xec,
-    0xc3,
-    0xaf,
-    0xc6,
-    0x5d,
-    0xb4,
-    0x48,
-    0xf2,
-    0x36,
-    0x54,
-    0x26,
-    0x5b,
-    0x2f,
-    0x09,
-    0x67,
-    0xb9,
-    0xf4,
-    0x5f,
-    0xb6,
-    0x1a,
-    0x28,
-    0xfd,
-    0x6f,
-    0x79,
-    0xaa,
-    0xd7,
-    0x03,
-    0x93,
-    0x17,
-    0xa5,
-    0x9f,
-    0xf6,
-    0x90,
-    0x93,
-    0x08,
-    0x5b,
-    0xbd,
-    0x3a,
-    0xca,
-    0x35,
-    0x11,
-    0xcf,
-    0x91,
-    0x8a,
-    0x50,
-    0x9a,
-    0xd7,
-    0x02,
-    0x4f,
-    0xaa,
-    0xbf,
-    0x3e,
-    0xfc,
-    0xc8,
-    0x41,
-    0x6a,
-    0x9d,
-    0xa9,
-    0x88,
-    0x16,
-    0x5d,
-    0x68,
-    0x98,
-    0x41,
-    0x04,
-    0x33,
-    0x34,
-    0xb7,
-    0x06,
-    0x44,
-    0xff,
-    0x9e,
-    0xbf,
-    0x12,
-    0xe1,
-    0x4b,
-    0xfd,
-    0xc9,
-    0xac,
-    0x5a,
-    0xbf,
-    0xf8,
-    0x00,
-    0xfd,
-    0x3c,
-    0x8a,
-    0x6c,
-    0x94,
-    0x27,
-    0xf8,
-    0xd5,
-    0x7e,
-    0x32,
-    0xbd,
-    0x1c,
-    0x2f,
-    0xd1,
-    0x09,
-    0xfb,
-    0x83,
-    0x40,
-    0xb9,
-    0x30,
-    0x52,
-    0xc7,
-    0x87,
-    0xde,
-    0x45,
-    0x3d,
-    0x7e,
-    0x30,
-    0xe8,
-    0xcb,
-    0xb2,
-    0x3f,
-    0x00,
-    0xf2,
-    0x2d,
-    0x36,
-    0x1e,
-    0xcf,
-    0x2c,
-    0xb4,
-    0x74,
-    0x9e,
-    0x8c,
-    0x71,
-    0xe8,
-    0x7e,
-    0x7f,
-    0x25,
-    0x67,
-    0x73,
-    0x83,
-    0xa5,
-    0x7c,
-    0xb1,
-    0x95,
-    0x4f,
-    0x21,
-    0x18,
-    0xa1,
-    0xa9,
-    0xd5,
-    0xfb,
-    0x3e,
-    0x45,
-    0xee,
-    0x25,
-    0x98,
-    0xe8,
-    0x31,
-    0x1e,
-    0xad,
-    0xea,
-    0xa0,
-    0xaa,
-    0xbd,
-    0xe0,
-    0x93,
-    0x93,
-    0xfb,
-    0x79,
-    0x0a,
-    0xa8,
-    0x89,
-    0xa6,
-    0x42,
-    0x06,
-    0xa3,
-    0xfe,
-    0x86,
-    0x96,
-    0x1b,
-    0x60,
-    0x48,
-    0xd7,
-    0x05,
-    0xda,
-    0x70,
-    0xde,
-    0xb3,
-    0xc9,
-    0xf4,
-    0x9b,
-    0xe4,
-    0x42,
-    0xa9,
-    0x5d,
-    0x38,
-    0xb1,
-    0x59,
-    0x98,
-    0xe7,
-    0xc0,
-    0x15,
-    0xe7,
-    0xb3,
-    0x7b,
-    0xcc,
-    0x4d,
-    0x1b,
-    0xb1,
-    0x1d,
-    0xc0,
-    0xd2,
-    0x9d,
-    0x6a,
-    0xe8,
-    0x6f,
-    0xc5,
-    0x2e,
-    0x24,
-    0x66,
-    0x23,
-    0x90,
-    0xce,
-    0x37,
-    0x83,
-    0x38,
-    0xc0,
-    0xe5,
-    0x2c,
-    0x61,
-    0x16,
-    0xaa,
-    0xc2,
-    0x2f,
-    0x36,
-    0xe9,
-    0x6b,
-    0x43,
-    0x0e,
-    0x64,
-    0x31,
-    0x8e,
-    0x9d,
-    0xaf,
-    0xa8,
-    0x62,
-    0xb5,
-    0xe5,
-    0xd0,
-    0xcf,
-    0xff,
-    0x99,
-    0x3c,
-    0x2c,
-    0x3f,
-    0x0f,
-    0x74,
-    0xf4,
-    0xd9,
-    0xac,
-    0x99,
-    0xd4,
-    0x95,
-    0xac,
-    0x47,
-    0x01,
-    0x9f,
-    0x13,
-    0xbf,
-    0xcf,
-    0xd2,
-    0xe6,
-    0x46,
-    0x80,
-    0x35,
-    0x9a,
-    0xc8,
-    0x59,
-    0xc6,
-    0xcd,
-    0xc1,
-    0xfc,
-    0x77,
-    0x34,
-    0x5e,
-    0xf1,
-    0x77,
-    0xd5,
-    0xdf,
-    0x86,
-    0xb2,
-    0x76,
-    0x3f,
-    0xd9,
-    0x9b,
-    0x55,
-    0x17,
-    0x33,
-    0x29,
-    0x19,
-    0xc0,
-    0x97,
-    0x1f,
-    0x09,
-    0xb7,
-    0x9b,
-    0x91,
-    0x7c,
-    0x46,
-    0x77,
-    0xa4,
-    0x90,
-    0x61,
-    0x5c,
-    0x95,
-    0x1f,
-    0xcf,
-    0x07,
-    0xfd,
-    0xef,
-    0x8a,
-    0x95,
-    0x53,
-    0x29,
-    0x67,
-    0x99,
-    0xb2,
-    0x0d,
-    0xf9,
-    0x6c,
-    0xdc,
-    0xe3,
-    0xb3,
-    0xc4,
-    0x80,
-    0x35,
-    0x4e,
-    0x88,
-    0xb8,
-    0x3b,
-    0x6a,
-    0xe3,
-    0xd6,
-    0x97,
-    0x78,
-    0x98,
-    0x60,
-    0x43,
-    0xd7,
-    0x95,
-    0x59,
-    0xc7,
-    0x3d,
-    0xca,
-    0xc2,
-    0xaf,
-    0x59,
-    0x3b,
-    0x61,
-    0x3c,
-    0xb7,
-    0x54,
-    0xc1,
-    0x5a,
-    0xe3,
-    0x7d,
-    0x7a,
-    0xd2,
-    0xd1,
-    0xef,
-    0xb2,
-    0xc1,
-    0x7c,
-    0xc6,
-    0xe4,
-    0x49,
-    0xce,
-    0x57,
-    0xe1,
-    0x86,
-    0xc0,
-    0xc3,
-    0x14,
-    0xc3,
-    0xc2,
-    0xcd,
-    0x09,
-    0xee,
-    0x5d,
-    0xe8,
-    0x31,
-    0x4a,
-    0x17,
-    0x94,
-    0xdf,
-    0x64,
-    0x97,
-    0xeb,
-    0x97,
-    0x48,
-    0x09,
-    0x77,
-    0x88,
-    0xf4,
-    0xc4,
-    0x47,
-    0x57,
-    0x0d,
-    0x2a,
-    0x42,
-    0x1e,
-    0xd1,
-    0xd0,
-    0xbb,
-    0xb5,
-    0x4d,
-    0xe0,
-    0x45,
-    0x30,
-    0xd0,
-    0xbb,
-    0xc8,
-    0xa8,
-    0x9f,
-    0xe2,
-    0xd4,
-    0x3f,
-    0xea,
-    0x16,
-    0x36,
-    0x5e,
-    0xff,
-    0xbe,
-    0xc9,
-    0x41,
-    0xbe,
-    0x8a,
-    0x8f,
-    0xb6,
-    0x4d,
-    0x56,
-    0x00,
-    0x21,
-    0x0d,
-    0x51,
-    0xa2,
-    0xc4,
-    0xcc,
-    0x5e,
-    0xda,
-    0x3d,
-    0x3c,
-    0xba,
-    0x02,
-    0x50,
-    0xa3,
-    0xdf,
-    0xbb,
-    0xe7,
-    0xd5,
-    0xa9,
-    0x85,
-    0x57,
-    0x60,
-    0xb8,
-    0x8d,
-    0xe5,
-    0x06,
-    0x15,
-    0xc5,
-    0x89,
-    0x70,
-    0x18,
-    0x3a,
-    0xf2,
-    0x20,
-    0x89,
-    0xa3,
-    0xc9,
-    0xa8,
-    0x05,
-    0x35,
-    0x3a,
-    0x19,
-    0xa3,
-    0xbf,
-    0xb1,
-    0xbf,
-    0xd8,
-    0xf2,
-    0xe1,
-    0x0b,
-    0x98,
-    0x00,
-    0x0b,
-    0xd1,
-    0xbe,
-    0x6a,
-    0x7d,
-    0xb4,
-    0xae,
-    0x12,
-    0x59,
-    0xde,
-    0x39,
-    0x98,
-    0x97,
-    0xf4,
-    0xc1,
-    0xe3,
-    0x4d,
-    0x48,
-    0x9d,
-    0xfe,
-    0x2e,
-    0x51,
-    0xbe,
-    0x26,
-    0x51,
-    0x59,
-    0x93,
-    0x21,
-    0x35,
-    0x76,
-    0x2b,
-    0xd1,
-    0x01,
-    0xbb,
-    0x9a,
-    0x08,
-    0x10,
-    0xaf,
-    0x9d,
-    0x9e,
-    0xac,
-    0xfe,
-    0x81,
-    0xc1,
-    0x1a,
-    0x6f,
-    0x40,
-    0x8d,
-    0xd8,
-    0x16,
-    0xee,
-    0xdc,
-    0x22,
-    0xcb,
-    0x53,
-    0x60,
-    0xba,
-    0xdb,
-    0xda,
-    0xef,
-    0xe9,
-    0xfd,
-    0xaa,
-    0x1d,
-    0xc1,
-    0x87,
-    0x12,
-    0x10,
-    0xa6,
-    0xe1,
-    0x2a,
-    0x90,
-    0x0d,
-    0x3a,
-    0xb7,
-    0x5e,
-    0x82,
-    0x7b,
-    0x50,
-    0xc7,
-    0xf0,
-    0x79,
-    0xbf,
-    0x78,
-    0x1d,
-    0x6f
-  ],
-  const [
-    0xca,
-    0xa5,
-    0xcc,
-    0x5d,
-    0x0d,
-    0x87,
-    0x68,
-    0x0e,
-    0xaf,
-    0xc2,
-    0x94,
-    0x29,
-    0xba,
-    0xc5,
-    0x5c,
-    0x9e,
-    0x33,
-    0x16,
-    0x7d,
-    0x48,
-    0x57,
-    0x89,
-    0xc7,
-    0xc1,
-    0x24,
-    0xb5,
-    0xc5,
-    0x7a,
-    0x1b,
-    0xa8,
-    0xa0,
-    0x0b,
-    0x45,
-    0xda,
-    0x41,
-    0xc7,
-    0x74,
-    0x60,
-    0xb6,
-    0x94,
-    0xcb,
-    0x62,
-    0xd7,
-    0xfa,
-    0x80,
-    0xcf,
-    0x29,
-    0x79,
-    0xe1,
-    0x4f,
-    0x02,
-    0x20,
-    0x95,
-    0x7a,
-    0xee,
-    0x5b,
-    0x25,
-    0x47,
-    0x52,
-    0x0d,
-    0xbb,
-    0xc7,
-    0x4f,
-    0xde,
-    0x29,
-    0x13,
-    0xe9,
-    0xd7,
-    0x2c,
-    0x83,
-    0x69,
-    0x2c,
-    0xf2,
-    0x20,
-    0xff,
-    0x58,
-    0xdb,
-    0x5c,
-    0xac,
-    0x6f,
-    0x7d,
-    0x01,
-    0x5f,
-    0xb0,
-    0xea,
-    0x68,
-    0x5f,
-    0x5a,
-    0x35,
-    0xeb,
-    0xe8,
-    0xc2,
-    0x32,
-    0x9c,
-    0x19,
-    0xa1,
-    0x7e,
-    0x38,
-    0x0e,
-    0xb2,
-    0xbf,
-    0x56,
-    0x49,
-    0x7d,
-    0x2d,
-    0xe4,
-    0x56,
-    0x6d,
-    0x52,
-    0xd4,
-    0xae,
-    0x29,
-    0x0d,
-    0x13,
-    0xdd,
-    0x21,
-    0xdd,
-    0xbb,
-    0xe0,
-    0x67,
-    0x5c,
-    0x89,
-    0xd1,
-    0xc1,
-    0x0a,
-    0x91,
-    0xc6,
-    0xfc,
-    0x4c,
-    0x30,
-    0xf6,
-    0x83,
-    0xb5,
-    0x43,
-    0x1d,
-    0x30,
-    0x83,
-    0x96,
-    0x22,
-    0x61,
-    0x6d,
-    0xa0,
-    0xf7,
-    0x4f,
-    0x9c,
-    0x6d,
-    0xc2,
-    0x9b,
-    0xf7,
-    0xdb,
-    0x3a,
-    0x2a,
-    0xa3,
-    0x09,
-    0x53,
-    0x33,
-    0xca,
-    0x0d,
-    0x1d,
-    0x96,
-    0x9c,
-    0xe5,
-    0xe9,
-    0x70,
-    0x94,
-    0xb0,
-    0xaf,
-    0xec,
-    0xfd,
-    0x1f,
-    0xac,
-    0x5c,
-    0xb4,
-    0x26,
-    0x4f,
-    0x88,
-    0x2f,
-    0xf7,
-    0x56,
-    0x45,
-    0xbe,
-    0x30,
-    0x35,
-    0x4a,
-    0x11,
-    0x53,
-    0xb7,
-    0x40,
-    0xfb,
-    0x78,
-    0xe7,
-    0x18,
-    0x75,
-    0x3e,
-    0x31,
-    0xa1,
-    0xe6,
-    0x07,
-    0xc5,
-    0x5a,
-    0xa2,
-    0x65,
-    0x3c,
-    0x85,
-    0xb0,
-    0xcf,
-    0x7e,
-    0x7c,
-    0xd0,
-    0x99,
-    0xe3,
-    0x48,
-    0xbc,
-    0x23,
-    0x98,
-    0x70,
-    0xaf,
-    0x50,
-    0x45,
-    0x0f,
-    0x24,
-    0x39,
-    0xec,
-    0x29,
-    0xe0,
-    0x23,
-    0x15,
-    0x3f,
-    0x32,
-    0xaf,
-    0x28,
-    0x21,
-    0x7a,
-    0x51,
-    0x1a,
-    0x04,
-    0xe8,
-    0x03,
-    0x4b,
-    0xd4,
-    0x86,
-    0x3b,
-    0xaf,
-    0xcc,
-    0x79,
-    0x1a,
-    0x2d,
-    0x43,
-    0x84,
-    0xe6,
-    0x44,
-    0xc9,
-    0xcd,
-    0xba,
-    0xf4,
-    0x72,
-    0xe4,
-    0x7c,
-    0xdc,
-    0x72,
-    0x01,
-    0x10,
-    0xa0,
-    0xea,
-    0x8d,
-    0xcb,
-    0x8d,
-    0x02,
-    0xe4,
-    0x2b,
-    0x80,
-    0x38,
-    0x5a,
-    0xc5,
-    0x03,
-    0xf8,
-    0x7c,
-    0x7e,
-    0xba,
-    0x6c,
-    0x98,
-    0xfe,
-    0xfe,
-    0x95,
-    0x7f,
-    0x62,
-    0xc7,
-    0x9b,
-    0x89,
-    0x31,
-    0xcf,
-    0x61,
-    0xda,
-    0x92,
-    0xf4,
-    0x5d,
-    0xe4,
-    0xbc,
-    0xde,
-    0xa7,
-    0x2d,
-    0xad,
-    0xe3,
-    0x4f,
-    0x52,
-    0x1f,
-    0x27,
-    0xf4,
-    0x4d,
-    0xb8,
-    0x08,
-    0x92,
-    0xf3,
-    0x81,
-    0xb9,
-    0x9c,
-    0xc0,
-    0x99,
-    0x2c,
-    0x4b,
-    0xd7,
-    0x2b,
-    0x36,
-    0x35,
-    0x45,
-    0x9d,
-    0xee,
-    0x21,
-    0x86,
-    0x0a,
-    0x56,
-    0x1a,
-    0x4a,
-    0xf3,
-    0x3d,
-    0xc2,
-    0x79,
-    0x31,
-    0x63,
-    0xe9,
-    0x74,
-    0x2e,
-    0xdf,
-    0x5e,
-    0x9e,
-    0x55,
-    0xbe,
-    0x05,
-    0x1b,
-    0xc7,
-    0xed,
-    0x2a,
-    0xd7,
-    0x50,
-    0x59,
-    0x15,
-    0xca,
-    0x99,
-    0x54,
-    0xdf,
-    0x7b,
-    0x9f,
-    0x3b,
-    0x84,
-    0xc3,
-    0x63,
-    0x55,
-    0x38,
-    0xd4,
-    0xe4,
-    0xff,
-    0xff,
-    0x79,
-    0x4a,
-    0x06,
-    0x78,
-    0xa0,
-    0x64,
-    0x55,
-    0xf9,
-    0x15,
-    0x54,
-    0xd0,
-    0xe1,
-    0x90,
-    0x89,
-    0x7f,
-    0x2a,
-    0xf2,
-    0xee,
-    0xef,
-    0x3e,
-    0xcc,
-    0x61,
-    0xd5,
-    0x0c,
-    0x21,
-    0x67,
-    0xf5,
-    0x5a,
-    0x6d,
-    0x1e,
-    0x42,
-    0x5d,
-    0xe5,
-    0x73,
-    0x47,
-    0x87,
-    0x01,
-    0x94,
-    0xc5,
-    0xa0,
-    0x38,
-    0xa9,
-    0x9e,
-    0x18,
-    0x0a,
-    0xbf,
-    0xf1,
-    0x9c,
-    0x44,
-    0x04,
-    0x87,
-    0xe7,
-    0x80,
-    0x3a,
-    0x6e,
-    0xdb,
-    0xeb,
-    0x66,
-    0xe3,
-    0xd0,
-    0x4b,
-    0xc8,
-    0x76,
-    0x2c,
-    0x40,
-    0x10,
-    0x68,
-    0x33,
-    0xc9,
-    0xcf,
-    0x58,
-    0x21,
-    0x0b,
-    0x2c,
-    0x1e,
-    0x76,
-    0x4e,
-    0xd8,
-    0xf8,
-    0x92,
-    0x49,
-    0x44,
-    0xe4,
-    0x81,
-    0x9f,
-    0x11,
-    0x4c,
-    0x18,
-    0xa9,
-    0xc8,
-    0xe8,
-    0x41,
-    0x76,
-    0xcb,
-    0xe1,
-    0x93,
-    0x10,
-    0x8b,
-    0x32,
-    0x26,
-    0x01,
-    0xfc,
-    0x54,
-    0xa5,
-    0x16,
-    0x46,
-    0x1a,
-    0xa4,
-    0x63,
-    0xbe,
-    0xda,
-    0x34,
-    0x87,
-    0x14,
-    0xcd,
-    0xb5,
-    0x32,
-    0xcd,
-    0xb8,
-    0xec,
-    0xe4,
-    0xf4,
-    0xcc,
-    0x56,
-    0xf7,
-    0x0d,
-    0xcb,
-    0xbb,
-    0xdf,
-    0x4b,
-    0x6d,
-    0x05,
-    0xb1,
-    0x03,
-    0x02,
-    0x53,
-    0xe2,
-    0x5f,
-    0x58,
-    0x4a,
-    0x51,
-    0x57,
-    0xdf,
-    0xab,
-    0x88,
-    0xdd,
-    0x0b,
-    0x2b,
-    0x3f,
-    0x58,
-    0xfa,
-    0x7f,
-    0x22,
-    0x54,
-    0x57,
-    0xb6,
-    0xd5,
-    0x78,
-    0x7e,
-    0xcb,
-    0x34,
-    0xb8,
-    0xe1,
-    0x7b,
-    0xdf,
-    0xcc,
-    0xaa,
-    0x54,
-    0xf6,
-    0xe0,
-    0xa2,
-    0x0f,
-    0x21,
-    0x8d,
-    0x51,
-    0x1f,
-    0xd4,
-    0x08,
-    0x67,
-    0x8a,
-    0xd1,
-    0x99,
-    0x5a,
-    0xf8,
-    0xee,
-    0x4f,
-    0x51,
-    0x09,
-    0x18,
-    0xf3,
-    0x41,
-    0xec,
-    0x98,
-    0x3a,
-    0x55,
-    0x2e,
-    0x95,
-    0x3e,
-    0x94,
-    0xcf,
-    0xda,
-    0x2f,
-    0xbe,
-    0x9b,
-    0xda,
-    0x46,
-    0x76,
-    0xb7,
-    0xf1,
-    0xfb,
-    0xa6,
-    0x7b,
-    0xed,
-    0x78,
-    0x20,
-    0x7f,
-    0xcd,
-    0x4d,
-    0x81,
-    0xf9,
-    0xc9,
-    0x65,
-    0x5b,
-    0x46,
-    0x92,
-    0x39,
-    0x93,
-    0xc6,
-    0xda,
-    0x43,
-    0x07,
-    0xed,
-    0x17,
-    0xb6,
-    0x74,
-    0x97,
-    0x84,
-    0x6c,
-    0x98,
-    0x9c,
-    0x69,
-    0x20,
-    0x93,
-    0xa5,
-    0x9d,
-    0xdd,
-    0x93,
-    0x3e,
-    0x49,
-    0xb6,
-    0xb0,
-    0x2c,
-    0xee,
-    0xb8,
-    0x15,
-    0x00,
-    0xaa,
-    0x1d,
-    0x61,
-    0xec,
-    0xb7,
-    0xc2,
-    0x4d,
-    0xd6,
-    0x34,
-    0xdc,
-    0x8e,
-    0xab,
-    0x28,
-    0xe6,
-    0xfd,
-    0xf6,
-    0xc4,
-    0xde,
-    0xf5,
-    0xb1,
-    0xe8,
-    0xb0,
-    0xfc,
-    0x5a,
-    0xe9,
-    0xf3,
-    0xa6,
-    0x4a,
-    0x92,
-    0xd3,
-    0xb7,
-    0x43,
-    0x68,
-    0x4e,
-    0x88,
-    0x48,
-    0x32,
-    0xa4,
-    0xac,
-    0xb1,
-    0xb9,
-    0x08,
-    0xd2,
-    0x7e,
-    0xcd,
-    0x9c,
-    0xed,
-    0xec,
-    0x88,
-    0x9c,
-    0x93,
-    0x46,
-    0xd7,
-    0xd9,
-    0xa3,
-    0xfe,
-    0x35,
-    0x6a,
-    0x2b,
-    0xfc,
-    0xba,
-    0x9e,
-    0x89,
-    0x36,
-    0x55,
-    0x35,
-    0xd0,
-    0x81,
-    0x56,
-    0xcf,
-    0x6d,
-    0xa6,
-    0x2f,
-    0xa4,
-    0x0a,
-    0xb9,
-    0x7b,
-    0x76,
-    0xb2,
-    0xa6,
-    0x3f,
-    0xc4,
-    0x36,
-    0x0d,
-    0x70,
-    0x41,
-    0xd0,
-    0x50,
-    0xb6,
-    0x84,
-    0x07,
-    0xea,
-    0x70,
-    0x01,
-    0xd2,
-    0x02,
-    0xf8,
-    0x38,
-    0x00,
-    0x3f,
-    0x28,
-    0x2c,
-    0xd7,
-    0xdf,
-    0x1d,
-    0x17,
-    0xfc,
-    0x03,
-    0x3a,
-    0x5c,
-    0x93,
-    0x4d,
-    0x70,
-    0xbd,
-    0xa6,
-    0xad,
-    0xbd,
-    0xce,
-    0xcb,
-    0x78,
-    0xf3,
-    0xa9,
-    0x01,
-    0xbb,
-    0xbb,
-    0xe4,
-    0xdc,
-    0xce,
-    0xd9,
-    0xc0,
-    0xe2,
-    0x2c,
-    0xb2,
-    0xa3,
-    0x34,
-    0x81,
-    0x0b,
-    0xc9,
-    0x71,
-    0x05,
-    0x13,
-    0x36,
-    0xd7,
-    0x09,
-    0xa4,
-    0xef,
-    0xab,
-    0xcf,
-    0xc6,
-    0x69,
-    0xdb,
-    0x9f,
-    0x75,
-    0x42,
-    0xe3,
-    0x17,
-    0xa4,
-    0x2f,
-    0xed,
-    0xc3,
-    0x81,
-    0x36,
-    0x3c,
-    0xee,
-    0xfb,
-    0x1d,
-    0xca,
-    0xb7,
-    0x81,
-    0x22,
-    0x30,
-    0x67,
-    0x0d,
-    0xec,
-    0xc7,
-    0x01,
-    0x62,
-    0xc2,
-    0x0d,
-    0x1b,
-    0x92,
-    0xfb,
-    0x4a,
-    0xed,
-    0xc2,
-    0xb5,
-    0x73,
-    0xa8,
-    0x31,
-    0xca,
-    0x4e,
-    0x09,
-    0x77,
-    0x00,
-    0xd7,
-    0x2d,
-    0x0b,
-    0x80,
-    0xe3,
-    0xa7,
-    0x08,
-    0x8a,
-    0x03,
-    0xd0,
-    0x31,
-    0x66,
-    0xab,
-    0x5e,
-    0x32,
-    0x9e,
-    0x93,
-    0x38,
-    0x29,
-    0x6a,
-    0x5e,
-    0x89,
-    0x64,
-    0x6c,
-    0x7a,
-    0x13,
-    0x6c,
-    0x9d,
-    0x47,
-    0xc7,
-    0x43,
-    0x88,
-    0x7b,
-    0x92,
-    0xeb,
-    0xb6,
-    0xc5,
-    0x79,
-    0x27,
-    0x69,
-    0xb0,
-    0xe8,
-    0x86,
-    0x8d,
-    0xcb,
-    0x47,
-    0x9c,
-    0xeb,
-    0x07,
-    0xcf,
-    0x93,
-    0xa0,
-    0x60,
-    0x9c,
-    0xe3,
-    0xcd,
-    0xbf,
-    0x03,
-    0x5d,
-    0x91,
-    0x1f,
-    0x25,
-    0x6e,
-    0x34,
-    0xef,
-    0xc4,
-    0xa2,
-    0xa5,
-    0xb8,
-    0x56,
-    0x67,
-    0x27,
-    0x00,
-    0x58,
-    0x14,
-    0x47,
-    0x6e,
-    0xe5,
-    0x29,
-    0x11,
-    0x2f,
-    0x87,
-    0xd8,
-    0x83,
-    0x97,
-    0x4d,
-    0xc5,
-    0x42,
-    0x0c,
-    0x1e,
-    0x0b,
-    0x8c,
-    0x20,
-    0x4c,
-    0x7f,
-    0x6e,
-    0xfd,
-    0x6c,
-    0x38,
-    0x37,
-    0x06,
-    0x66,
-    0x4f,
-    0x2c,
-    0xbb,
-    0xc8,
-    0xe3,
-    0x7d,
-    0xdd,
-    0x60,
-    0x60,
-    0x78,
-    0xd3,
-    0x09,
-    0x01,
-    0xfd,
-    0x4d,
-    0xc5,
-    0x94,
-    0x32,
-    0x27,
-    0x0c,
-    0x7e,
-    0x77,
-    0x90,
-    0x64,
-    0xfe,
-    0x9d,
-    0x6b,
-    0x32,
-    0xb6,
-    0x52,
-    0xf5,
-    0xd0,
-    0x67,
-    0xe0,
-    0xa9,
-    0xdf,
-    0xfc,
-    0x18,
-    0x61,
-    0xdf,
-    0xca,
-    0x88,
-    0xbd,
-    0xfd,
-    0x16,
-    0xf5,
-    0xc8,
-    0x2b,
-    0xd7,
-    0x05,
-    0xd9,
-    0x76,
-    0xbe,
-    0x3b,
-    0xb8,
-    0x94,
-    0x74,
-    0x28,
-    0x02,
-    0xbd,
-    0x23,
-    0xe0,
-    0xcf,
-    0xbd,
-    0x37,
-    0xac,
-    0x91,
-    0x46,
-    0x66,
-    0xfe,
-    0x40,
-    0x8a,
-    0xed,
-    0xaa,
-    0xb4,
-    0x09,
-    0x1d,
-    0x52,
-    0x52,
-    0xa8,
-    0x17,
-    0x22,
-    0xea,
-    0x04,
-    0xd4,
-    0xbe,
-    0xe0,
-    0x05,
-    0x68,
-    0x79,
-    0x8a,
-    0xb6,
-    0x87,
-    0xc8,
-    0xda,
-    0x54,
-    0x48,
-    0xf6,
-    0x3d,
-    0xa5,
-    0x29,
-    0x19,
-    0xc2,
-    0x8a,
-    0x53,
-    0x44,
-    0x7f,
-    0xd8,
-    0x20,
-    0xfe,
-    0x31,
-    0x64,
-    0xdb,
-    0xf3,
-    0x22,
-    0x5d,
-    0xc7,
-    0xea,
-    0x50,
-    0xdf,
-    0x62,
-    0xf7,
-    0xcb,
-    0xc4,
-    0xea,
-    0xf2,
-    0x5f,
-    0xbe,
-    0x21,
-    0x27,
-    0x73,
-    0xa3,
-    0x4e,
-    0x4f,
-    0x31,
-    0x07,
-    0x84,
-    0xc0,
-    0xe7,
-    0x10,
-    0x26,
-    0xe0,
-    0xad,
-    0x86,
-    0xab,
-    0xdf,
-    0x49,
-    0x2a,
-    0x9f,
-    0xa6,
-    0x4f,
-    0x49,
-    0xea,
-    0x0a,
-    0x8d,
-    0x90,
-    0x55,
-    0x46,
-    0xa5,
-    0x22,
-    0x4a,
-    0xa8,
-    0xfc,
-    0xe8,
-    0xdb,
-    0x8a,
-    0xd3,
-    0x28,
-    0x07,
-    0x84,
-    0xb4,
-    0x5a,
-    0x38,
-    0xe0,
-    0x10,
-    0x37,
-    0x0f,
-    0x4e,
-    0x26,
-    0x12,
-    0x64,
-    0xd9,
-    0x26,
-    0x6b,
-    0x89,
-    0x1a,
-    0x97,
-    0xc2,
-    0xcf,
-    0xac,
-    0xf6,
-    0xa9,
-    0x4c,
-    0xe0,
-    0xa0,
-    0x1d,
-    0xdb,
-    0xb1,
-    0xf2,
-    0x16,
-    0x63,
-    0xfa,
-    0xae,
-    0x5d,
-    0x5d,
-    0xe6,
-    0xa0,
-    0x9e,
-    0x90,
-    0xa8,
-    0x82,
-    0xbe,
-    0x1f,
-    0x6d,
-    0x1e,
-    0x6e,
-    0xc6,
-    0x8f,
-    0xb2,
-    0x01,
-    0x61,
-    0x0c,
-    0x98,
-    0x7a,
-    0xae,
-    0x36,
-    0x26,
-    0xea,
-    0x53,
-    0xac,
-    0xd4,
-    0xf9,
-    0x23,
-    0x88,
-    0x9c,
-    0xc2,
-    0x9d,
-    0xda,
-    0xa7,
-    0xe4,
-    0xb5,
-    0x56,
-    0x25,
-    0xd5,
-    0xd8,
-    0x49,
-    0x7d,
-    0x7a,
-    0x2a,
-    0xd2,
-    0xa6,
-    0xf5,
-    0x12,
-    0x4e,
-    0xd4,
-    0xbf,
-    0xf8,
-    0x14,
-    0x58,
-    0xf6,
-    0x4d,
-    0x63,
-    0xc1,
-    0xf8,
-    0xcc,
-    0x98,
-    0x48,
-    0x30,
-    0x00,
-    0xa4,
-    0x6b,
-    0x30,
-    0x07,
-    0xbe,
-    0xd7,
-    0x00,
-    0x95,
-    0x55,
-    0x8b,
-    0xb6,
-    0x3c,
-    0x49,
-    0x3b,
-    0x47,
-    0xea,
-    0x5a,
-    0xf2,
-    0x9d,
-    0xb3,
-    0xe1,
-    0xfc,
-    0xea,
-    0xd0,
-    0xbe,
-    0x03,
-    0x3b,
-    0xe8,
-    0x91,
-    0x78,
-    0x50,
-    0x8f,
-    0x2d,
-    0x35,
-    0xab,
-    0x0d,
-    0x49,
-    0x60,
-    0xe7,
-    0x60,
-    0x79,
-    0x92,
-    0x4b,
-    0x84,
-    0x5d,
-    0x38,
-    0x9f,
-    0xf1,
-    0x18,
-    0x3a,
-    0x3e,
-    0x66,
-    0x04,
-    0xdb,
-    0x6d,
-    0xe5,
-    0xa5,
-    0xe1,
-    0xeb,
-    0xfe,
-    0xdb,
-    0xf5,
-    0xca,
-    0x51,
-    0x5b,
-    0x4c,
-    0x7c,
-    0x4f,
-    0x5f,
-    0x87,
-    0x31,
-    0x40,
-    0x9d,
-    0xd8,
-    0x61,
-    0x8a,
-    0x76,
-    0x67,
-    0xa4,
-    0x30,
-    0x71,
-    0xf4,
-    0xca,
-    0x99,
-    0xe7,
-    0xbd,
-    0x28,
-    0x93,
-    0x00,
-    0xa2,
-    0x30,
-    0x97,
-    0xde,
-    0x87,
-    0x45,
-    0x4f,
-    0x17,
-    0xfa,
-    0xcd,
-    0x55,
-    0x69,
-    0x15,
-    0x87,
-    0x3e,
-    0xa9,
-    0xa6,
-    0x1e,
-    0xd7,
-    0xfd,
-    0x8e,
-    0xff,
-    0xae,
-    0x4b,
-    0x67,
-    0x68,
-    0xd4,
-    0xf1,
-    0x6a,
-    0xc2,
-    0xe2,
-    0xb7,
-    0x8f,
-    0x31,
-    0x3a,
-    0x01,
-    0xf5,
-    0x69,
-    0x8f,
-    0x4a,
-    0x85,
-    0xc3,
-    0xa8,
-    0xcd,
-    0xd3,
-    0x90,
-    0x60,
-    0x85,
-    0x44,
-    0xad,
-    0xf2,
-    0x58,
-    0x76,
-    0x58,
-    0x73,
-    0x90,
-    0xdc,
-    0x41,
-    0xa0,
-    0x8a,
-    0xa9,
-    0xe4,
-    0xda,
-    0xb2,
-    0xf0,
-    0x17,
-    0x6f,
-    0xaf,
-    0x09,
-    0xdf,
-    0x1b,
-    0xda,
-    0x36,
-    0x88,
-    0xcf,
-    0xf5,
-    0x86,
-    0xf5,
-    0xb0,
-    0x1a,
-    0xfa,
-    0x34,
-    0x63,
-    0xf1,
-    0xe7,
-    0x55,
-    0x88,
-    0x26,
-    0x9b,
-    0x7d,
-    0x84,
-    0x1a,
-    0x43,
-    0x36,
-    0x84,
-    0xd9,
-    0x0d,
-    0x09,
-    0xbf,
-    0x4d,
-    0x89,
-    0x4f,
-    0xfb,
-    0xb1,
-    0x55,
-    0x44,
-    0x52,
-    0x47,
-    0xf9,
-    0x5d,
-    0x36,
-    0x4e,
-    0x10,
-    0xdc,
-    0xb3,
-    0x2f,
-    0xa9,
-    0xa1,
-    0xf4,
-    0xf7,
-    0xec,
-    0x43,
-    0x09,
-    0x09,
-    0x01,
-    0x5f,
-    0xe7,
-    0x15,
-    0x2d,
-    0x30,
-    0xb0,
-    0x44,
-    0x3e,
-    0x60,
-    0x35,
-    0xb5,
-    0x2a,
-    0x1e,
-    0xba,
-    0x2d,
-    0xf3,
-    0x71,
-    0xf9,
-    0x0a,
-    0xcd,
-    0xcc,
-    0x69,
-    0x79,
-    0x83,
-    0xe2,
-    0xbf,
-    0xe9,
-    0x17,
-    0xbb,
-    0xb5,
-    0xc0,
-    0xa9,
-    0x08,
-    0x0b,
-    0x4c,
-    0x99,
-    0xb4,
-    0xcc,
-    0xfc,
-    0xf0,
-    0xbb,
-    0xd3,
-    0xd0,
-    0xfc,
-    0x3f,
-    0x8d,
-    0x0e,
-    0x3b,
-    0xd9,
-    0x01,
-    0x37,
-    0x7b,
-    0x2d,
-    0x0d,
-    0x39,
-    0x3e,
-    0xc1,
-    0xf2,
-    0xe6,
-    0x63,
-    0x0f,
-    0x13,
-    0xa5,
-    0x03,
-    0xd8,
-    0xf9,
-    0x67,
-    0x9a,
-    0xbc,
-    0x9b,
-    0xdd,
-    0x67,
-    0x08,
-    0xdc,
-    0xe9,
-    0x15,
-    0xcf,
-    0x56,
-    0x52,
-    0x9a,
-    0x3c,
-    0x56,
-    0xbb,
-    0x60,
-    0x26,
-    0x27,
-    0xd6,
-    0xa2,
-    0xe5,
-    0x94,
-    0xd5,
-    0x1a,
-    0x64,
-    0xa8,
-    0x21,
-    0xd9,
-    0x78,
-    0xb8,
-    0x4f,
-    0x76,
-    0x70,
-    0xa4,
-    0x50,
-    0x6a,
-    0xee,
-    0x59,
-    0xe7,
-    0xbb,
-    0xf5,
-    0x9a,
-    0x60,
-    0xd8,
-    0x42,
-    0x01,
-    0x80,
-    0xc4,
-    0xe0,
-    0x40,
-    0xb8,
-    0x77,
-    0xf7,
-    0xad,
-    0x9d,
-    0x82,
-    0xe5,
-    0xfe,
-    0x9d,
-    0xf1,
-    0x8f,
-    0x50,
-    0xea,
-    0x75,
-    0xf9,
-    0x6f,
-    0xbb,
-    0xc3,
-    0x15,
-    0x51,
-    0xb4,
-    0x37,
-    0xd9,
-    0xe3,
-    0xa2,
-    0xbd,
-    0x94,
-    0x09,
-    0x6c,
-    0xf1,
-    0x82,
-    0xdf,
-    0x47,
-    0x85,
-    0x9e,
-    0x46,
-    0x28,
-    0xe3,
-    0xb7,
-    0x9c,
-    0x7f,
-    0x14,
-    0xc6,
-    0xca,
-    0x22,
-    0xe1,
-    0x7f,
-    0x84,
-    0x87,
-    0x38,
-    0x26,
-    0xcc,
-    0x37,
-    0xd1,
-    0xa4,
-    0xb8,
-    0x7f,
-    0x10,
-    0xda,
-    0x76,
-    0x69,
-    0x2e,
-    0x35,
-    0x8d,
-    0xeb,
-    0x94,
-    0x83,
-    0x65,
-    0x5d,
-    0x87,
-    0x05,
-    0x0a,
-    0x30,
-    0x0a,
-    0xc5,
-    0x2d,
-    0xde,
-    0x00,
-    0x29,
-    0x6c,
-    0x1d,
-    0x92,
-    0xc9,
-    0xd3,
-    0x58,
-    0xd0,
-    0x7e,
-    0xa2,
-    0x5f,
-    0x9b,
-    0xbb,
-    0x50,
-    0x5e,
-    0xc2,
-    0x21,
-    0xd1,
-    0x0c,
-    0x6b,
-    0x4d,
-    0x15,
-    0x24,
-    0xb5,
-    0xf5,
-    0xd1,
-    0x19,
-    0x9b,
-    0x33,
-    0x81,
-    0x06,
-    0x1c,
-    0x20,
-    0xae,
-    0xe3,
-    0x98,
-    0xa5,
-    0x6c,
-    0xff,
-    0x7e,
-    0x8e,
-    0x28,
-    0xaa,
-    0x24,
-    0xe0,
-    0xa0,
-    0x32,
-    0xf6,
-    0x6d,
-    0x33,
-    0x12,
-    0xd3,
-    0xa5,
-    0x5b,
-    0x65,
-    0xb4,
-    0xaf,
-    0x78,
-    0xa1,
-    0x8f,
-    0xb9,
-    0xcf,
-    0x81,
-    0x7b,
-    0x8c,
-    0xd2,
-    0x43,
-    0x14,
-    0x63,
-    0xa2,
-    0x14,
-    0x21,
-    0xfd,
-    0xd2,
-    0xc9,
-    0x74,
-    0xf1,
-    0x6e,
-    0xcf,
-    0x12,
-    0x42,
-    0x3b,
-    0x65,
-    0x94,
-    0x33,
-    0x41,
-    0x08,
-    0xcd,
-    0x5c,
-    0x87,
-    0x2f,
-    0xad,
-    0xfe,
-    0x1e,
-    0x39,
-    0x65,
-    0x94,
-    0x60,
-    0xa4,
-    0xcc,
-    0xaa,
-    0x7a,
-    0x7f,
-    0x02,
-    0xf2,
-    0x28,
-    0x22,
-    0x53,
-    0x95,
-    0xc0,
-    0x1c,
-    0x5e,
-    0xc7,
-    0x72,
-    0x6d,
-    0x76,
-    0x9e,
-    0xce,
-    0xf6,
-    0x48,
-    0x24,
-    0x86,
-    0x2d,
-    0xbe,
-    0xab,
-    0x76,
-    0x15,
-    0x24,
-    0x60,
-    0xe1,
-    0x6e,
-    0x8a,
-    0x23,
-    0xfe,
-    0x28,
-    0x69,
-    0x96,
-    0xb3,
-    0x1e,
-    0x89,
-    0x74,
-    0xa0,
-    0x01,
-    0x21,
-    0x25,
-    0x5f,
-    0x92,
-    0x41,
-    0x8f,
-    0x0a,
-    0x15,
-    0x6d,
-    0x2e,
-    0xfe,
-    0x02,
-    0x8a,
-    0x67,
-    0xdf,
-    0xfd,
-    0xff,
-    0x19,
-    0xdd,
-    0x08,
-    0x14,
-    0x76,
-    0x35,
-    0xf8,
-    0x9d,
-    0x11,
-    0xfa,
-    0x25,
-    0xdd,
-    0x37,
-    0x15,
-    0x66,
-    0xa5,
-    0x83,
-    0x8b,
-    0x3d,
-    0xbc,
-    0xad,
-    0xfe,
-    0x4e,
-    0x83,
-    0xa3,
-    0x77,
-    0x16,
-    0xd9,
-    0xdb,
-    0x62,
-    0xd9,
-    0x3d,
-    0xe7,
-    0xda,
-    0xdc,
-    0x32,
-    0x4a,
-    0x27,
-    0xd5,
-    0xe8,
-    0x8a,
-    0x85,
-    0xa0,
-    0x18,
-    0x86,
-    0x27,
-    0x33,
-    0x30,
-    0x0a,
-    0x7c,
-    0xd4,
-    0xb0,
-    0xa1,
-    0xb1,
-    0x8a,
-    0xd4,
-    0xaa,
-    0x77,
-    0xd1,
-    0x73,
-    0xae,
-    0x06,
-    0x91,
-    0x27,
-    0xf1,
-    0x62,
-    0x51,
-    0xae,
-    0x47,
-    0xdd,
-    0xa8,
-    0x90,
-    0x29,
-    0xdd,
-    0xf5,
-    0x02,
-    0x08,
-    0xdf,
-    0x50,
-    0x0b,
-    0xe1,
-    0xbc,
-    0xc1,
-    0xe5,
-    0x12,
-    0x2b,
-    0xaf,
-    0xa6,
-    0x6c,
-    0x88,
-    0x9b,
-    0x20,
-    0x89,
-    0xd4,
-    0x0e,
-    0x05,
-    0x60,
-    0xfc,
-    0xcf,
-    0x4f,
-    0x16,
-    0x5e,
-    0x5a,
-    0xde,
-    0x18,
-    0x89,
-    0x8e,
-    0x63,
-    0x66,
-    0x44,
-    0xa6,
-    0x7e,
-    0x32,
-    0xd3,
-    0x6a,
-    0x23,
-    0xa9,
-    0x75,
-    0xa6,
-    0x42,
-    0x11,
-    0x31,
-    0xdc,
-    0xa7,
-    0x14,
-    0xd2,
-    0x36,
-    0x1f,
-    0x5b,
-    0x31,
-    0xbe,
-    0xdc,
-    0x5f,
-    0xb2,
-    0xd1,
-    0x1a,
-    0x7c,
-    0x11,
-    0xd1,
-    0x03,
-    0x48,
-    0x5f,
-    0x1b,
-    0xd0,
-    0x22,
-    0x47,
-    0x39,
-    0x32,
-    0x0e,
-    0x96,
-    0x58,
-    0xf0,
-    0xc0,
-    0xfb,
-    0xfc,
-    0xd1,
-    0xf6,
-    0x0a,
-    0xf2,
-    0xbc,
-    0x0b,
-    0x87,
-    0x87,
-    0x1e,
-    0xc9,
-    0xe2,
-    0xf7,
-    0x8c,
-    0x80,
-    0xfe,
-    0x28,
-    0xaa,
-    0x54,
-    0x36,
-    0x98,
-    0x4b,
-    0xdb,
-    0xa2,
-    0x94,
-    0xd9,
-    0xe8,
-    0x96,
-    0xac,
-    0xf8,
-    0xa1,
-    0x6c,
-    0x63,
-    0x66,
-    0xd8,
-    0x84,
-    0x2b,
-    0x25,
-    0x98,
-    0x88,
-    0x90,
-    0xdd,
-    0xfd,
-    0xf5,
-    0xb3,
-    0x7c,
-    0x49,
-    0xd7,
-    0xfa,
-    0x1f,
-    0x35,
-    0xd4,
-    0x06,
-    0x35,
-    0x85,
-    0x6b,
-    0xe5,
-    0xe1,
-    0xdf,
-    0x7e,
-    0x89,
-    0xa1,
-    0xdd,
-    0x0e,
-    0x79,
-    0x2e,
-    0x61,
-    0x47,
-    0xc7,
-    0xa3,
-    0x29,
-    0xbc,
-    0x42,
-    0xe0,
-    0xa3,
-    0xf3,
-    0xec,
-    0x31,
-    0x02,
-    0x24,
-    0xaf,
-    0x2b,
-    0x91,
-    0x3e,
-    0x4b,
-    0xd7,
-    0x47,
-    0x2b,
-    0x93,
-    0x13,
-    0x9c,
-    0x55,
-    0xd9,
-    0x34,
-    0x9c,
-    0x69,
-    0xa7,
-    0xf0,
-    0x3a,
-    0x5b,
-    0xb0,
-    0x7c,
-    0xe6,
-    0xaa,
-    0x05,
-    0xf1,
-    0x62,
-    0xe5,
-    0x8c,
-    0xf4,
-    0xd1,
-    0x6e,
-    0xaf,
-    0x96,
-    0x11,
-    0x7e,
-    0x51,
-    0x79,
-    0x4a,
-    0x69,
-    0x06,
-    0x35,
-    0xc7,
-    0x23,
-    0x83,
-    0xf9,
-    0x05,
-    0x03,
-    0x53,
-    0x76,
-    0x0a,
-    0xc8,
-    0xcc,
-    0xf8,
-    0xf8,
-    0xda,
-    0x42,
-    0xd6,
-    0xe2,
-    0xd2,
-    0x7a,
-    0x0d,
-    0xde,
-    0x3b,
-    0x61,
-    0x28,
-    0x5c,
-    0x9a,
-    0xfe,
-    0x63,
-    0xb6,
-    0xad,
-    0xa6,
-    0x0f,
-    0x08,
-    0xf1,
-    0x6f,
-    0x38,
-    0x41,
-    0x66,
-    0xe7,
-    0x86,
-    0x7a,
-    0x96,
-    0x05,
-    0x61,
-    0x87,
-    0xd4,
-    0x5f,
-    0x58,
-    0xcc,
-    0xc2,
-    0x9e,
-    0xc4,
-    0x52,
-    0x16,
-    0x2f,
-    0xa8,
-    0x1b,
-    0x9d,
-    0x3c,
-    0xdc,
-    0xb2,
-    0x80,
-    0xdb,
-    0x6b,
-    0x05,
-    0xc6,
-    0x85,
-    0x39,
-    0x77,
-    0x1a,
-    0xc9,
-    0xe9,
-    0x32,
-    0xce,
-    0x41,
-    0xfd,
-    0xba,
-    0x21,
-    0xc6,
-    0x3f,
-    0xc8,
-    0xbd,
-    0xe0,
-    0x60,
-    0x55,
-    0x84,
-    0x80,
-    0xe0,
-    0xf5,
-    0x8c,
-    0xf2,
-    0x2d,
-    0x66,
-    0x68,
-    0x0d,
-    0x0f,
-    0x69,
-    0xaa,
-    0xad,
-    0x43,
-    0xd0,
-    0xa5,
-    0x63,
-    0x67,
-    0xd9,
-    0x78,
-    0x6a,
-    0x16,
-    0xba,
-    0x48,
-    0xdd,
-    0x53,
-    0x7d,
-    0xcc,
-    0x28,
-    0x2b,
-    0x0e,
-    0x0f,
-    0xbd,
-    0x96,
-    0x93,
-    0x71,
-    0x08,
-    0x9f,
-    0xfb,
-    0xef,
-    0xa4,
-    0xc4,
-    0xda,
-    0xa5,
-    0xcf,
-    0xa0,
-    0x74,
-    0x91,
-    0x1b,
-    0xc7,
-    0x17,
-    0x9a,
-    0x67,
-    0xf2,
-    0xaf,
-    0xd1,
-    0x0e,
-    0x5c,
-    0x94,
-    0xf6,
-    0x5e,
-    0x6b,
-    0xa6,
-    0x3e,
-    0x4c,
-    0x93,
-    0x9c,
-    0x53,
-    0x65,
-    0x78,
-    0x99,
-    0x9d,
-    0x08,
-    0x52,
-    0x00,
-    0xc0,
-    0xd3,
-    0x96,
-    0x8a,
-    0x66,
-    0x5b,
-    0xd3,
-    0x96,
-    0x3e,
-    0x20,
-    0xd9,
-    0xc0,
-    0x45,
-    0xc0,
-    0x21,
-    0xb4,
-    0x44,
-    0x6a,
-    0x69,
-    0x45,
-    0x99,
-    0x96,
-    0x9f,
-    0xb9,
-    0x3b,
-    0xf3,
-    0x00,
-    0x67,
-    0xf9,
-    0xa1,
-    0x81,
-    0x85,
-    0x02,
-    0xa1,
-    0x6e,
-    0x3b,
-    0xaa,
-    0x8a,
-    0x51,
-    0xfb,
-    0x6b,
-    0x7d,
-    0x15,
-    0x15,
-    0x2a,
-    0x5a,
-    0x6b,
-    0x86,
-    0xbc,
-    0x34,
-    0x6d,
-    0x11,
-    0xa9,
-    0x03,
-    0x81,
-    0x92,
-    0x30,
-    0x99,
-    0x81,
-    0x8e,
-    0x8b,
-    0xd8,
-    0x19,
-    0x0e,
-    0x74,
-    0x21,
-    0x70,
-    0xae,
-    0xe7,
-    0x0f,
-    0x0a,
-    0xf1,
-    0x2a,
-    0x66,
-    0xed,
-    0xd7,
-    0x0b,
-    0x46,
-    0x02,
-    0xb2,
-    0x69,
-    0xa5,
-    0xbf,
-    0x35,
-    0xf5,
-    0xfc,
-    0x03,
-    0xce,
-    0x3a,
-    0x3f,
-    0x41,
-    0x36,
-    0xdb,
-    0x13,
-    0xe1,
-    0x46,
-    0x1c,
-    0x3c,
-    0xe3,
-    0x0c,
-    0xa4,
-    0x54,
-    0xc6,
-    0x1e,
-    0x82,
-    0xc3,
-    0xa8,
-    0x2e,
-    0x6d,
-    0xeb,
-    0xae,
-    0xdf,
-    0x50,
-    0xa3,
-    0xa6,
-    0xd7,
-    0x06,
-    0xe7,
-    0xeb,
-    0x15,
-    0x61,
-    0xcd,
-    0x89,
-    0x85,
-    0x72,
-    0xbb,
-    0xa2,
-    0xd2,
-    0x04,
-    0xd8,
-    0x11,
-    0x7c,
-    0x6a,
-    0xc0,
-    0x4c,
-    0x2a,
-    0x7b,
-    0x7c,
-    0x8f,
-    0x41,
-    0xda,
-    0xb1,
-    0x37,
-    0xb5,
-    0x7b,
-    0x17,
-    0x6c,
-    0x20,
-    0x62,
-    0x2d,
-    0x02,
-    0x11,
-    0xae,
-    0x2c,
-    0xa1,
-    0xa6,
-    0xd7,
-    0x39,
-    0x24,
-    0x5d,
-    0x34,
-    0xde,
-    0x40,
-    0x27,
-    0xc0,
-    0xbb,
-    0x66,
-    0xbe,
-    0x1d,
-    0x79,
-    0xea,
-    0x39,
-    0xd9,
-    0x00,
-    0x64,
-    0xde,
-    0xf1,
-    0xea,
-    0x57,
-    0x37,
-    0x93,
-    0x37,
-    0x10,
-    0x68,
-    0x28,
-    0x42,
-    0xd1,
-    0xbf,
-    0x92,
-    0xf3,
-    0x2f,
-    0x8d,
-    0xb2,
-    0x37,
-    0xb9,
-    0x34,
-    0x2e,
-    0xad,
-    0xda,
-    0x82,
-    0x71,
-    0xa3,
-    0x01,
-    0x3d,
-    0xf3,
-    0x40,
-    0xfe,
-    0xff,
-    0xba,
-    0x02,
-    0xb0,
-    0x44,
-    0x21,
-    0x6c,
-    0xdd,
-    0xc2,
-    0xd8,
-    0xf8,
-    0x61,
-    0xf9,
-    0x2c,
-    0x53,
-    0x8b,
-    0x0a,
-    0x88,
-    0xc9,
-    0xc4,
-    0xcc,
-    0x3c,
-    0xfe,
-    0x71,
-    0x1d,
-    0x7e,
-    0xe0,
-    0x1b,
-    0x76,
-    0xae,
-    0xd9,
-    0xcd,
-    0xc3,
-    0xdf,
-    0x49,
-    0xbe,
-    0x71,
-    0x92,
-    0x33,
-    0x30,
-    0xc8,
-    0xc4,
-    0x37,
-    0x98,
-    0x7b,
-    0x2c,
-    0xc0,
-    0xff,
-    0x7d,
-    0xbe,
-    0x7e,
-    0xa8,
-    0x17,
-    0x73,
-    0x17,
-    0xf3,
-    0x38,
-    0x4c,
-    0x19,
-    0x81,
-    0x0c,
-    0x95,
-    0x34,
-    0x99,
-    0xcf,
-    0x67,
-    0xa6,
-    0xcb,
-    0xe4,
-    0x70,
-    0xf6,
-    0xd3,
-    0x21,
-    0xf6,
-    0xe5,
-    0xc0,
-    0x6e,
-    0x1a,
-    0xa2,
-    0x55,
-    0x8e,
-    0x5a,
-    0x3d,
-    0xaf,
-    0x3c,
-    0x5a,
-    0x5e,
-    0x28,
-    0x7a,
-    0xe4,
-    0x37,
-    0x7c,
-    0x26,
-    0x2d,
-    0xb7,
-    0x2a,
-    0xce,
-    0x5a,
-    0x00,
-    0x1d,
-    0xc5,
-    0x42,
-    0x1c,
-    0x8c,
-    0x76,
-    0x76,
-    0xeb,
-    0x1f,
-    0xf9,
-    0x7f,
-    0x60,
-    0x53,
-    0xe4,
-    0x66,
-    0xed,
-    0x1f,
-    0x64,
-    0x7a,
-    0x3c,
-    0xd8,
-    0x8c,
-    0x4d,
-    0x20,
-    0x52,
-    0xec,
-    0x00,
-    0xcb,
-    0x48,
-    0x66,
-    0xc0,
-    0x41,
-    0xfd,
-    0x3d,
-    0x91,
-    0x0d,
-    0x24,
-    0x6f,
-    0x4a,
-    0x32,
-    0xfd,
-    0x45,
-    0xe1,
-    0x64,
-    0xc2,
-    0x28,
-    0xe9,
-    0x78,
-    0x41,
-    0xb6,
-    0x59,
-    0x1a,
-    0xca,
-    0x15,
-    0x8f,
-    0xbe,
-    0x4b,
-    0x87,
-    0x95,
-    0xd9,
-    0xba,
-    0x3f,
-    0xa2,
-    0x50,
-    0xb3,
-    0x74,
-    0xe4,
-    0x30,
-    0x63,
-    0xb3,
-    0x7c,
-    0xa1,
-    0xa4,
-    0x79,
-    0xcb,
-    0x15,
-    0x69,
-    0x01,
-    0xec,
-    0xc5,
-    0x5d,
-    0x5b,
-    0x81,
-    0x5e,
-    0xc7,
-    0xbe,
-    0xb3,
-    0xf7,
-    0xb1,
-    0x1f,
-    0x74,
-    0x47,
-    0x49,
-    0x02,
-    0x07,
-    0x15,
-    0x87,
-    0x91,
-    0xc3,
-    0xef,
-    0x10,
-    0xeb,
-    0x14,
-    0x1f,
-    0x5b,
-    0xbe,
-    0xc2,
-    0xdb,
-    0x12,
-    0x18,
-    0x76,
-    0xbc,
-    0xbb,
-    0x7a,
-    0x7a,
-    0x72,
-    0x97,
-    0x2f,
-    0xc0,
-    0xb5,
-    0xca,
-    0xdb,
-    0x26,
-    0x7e,
-    0xbd,
-    0x57,
-    0xf8,
-    0x78,
-    0xc1,
-    0xbc,
-    0xb6,
-    0xb1,
-    0xf5,
-    0xbe,
-    0x18,
-    0x96,
-    0x69,
-    0x3c,
-    0x50,
-    0x1e,
-    0x83,
-    0x14,
-    0x8f,
-    0x45,
-    0xa2,
-    0x3c,
-    0xca,
-    0xbc,
-    0x02,
-    0x0f,
-    0xbe,
-    0xdf,
-    0xe0,
-    0xe4,
-    0x32,
-    0xe7,
-    0xde,
-    0xe5,
-    0x7c,
-    0x61,
-    0xa8,
-    0x1f,
-    0x46,
-    0xdf,
-    0xd8,
-    0xd5,
-    0x92,
-    0xed,
-    0x17,
-    0x1a,
-    0xfc,
-    0x46,
-    0x85,
-    0x9f,
-    0x3f,
-    0x48,
-    0x5c,
-    0xc9,
-    0xfb,
-    0xa6,
-    0xd0,
-    0x06,
-    0xb6,
-    0x5d,
-    0x39,
-    0x62,
-    0x20,
-    0xe9,
-    0x73,
-    0x55,
-    0x9b,
-    0xb8,
-    0x85,
-    0xdf,
-    0xfa,
-    0xdf,
-    0x82,
-    0xd7,
-    0x89,
-    0x0c,
-    0xad,
-    0x81,
-    0x4e,
-    0xbb,
-    0xe0,
-    0x5e,
-    0x8f,
-    0xad,
-    0x2f,
-    0x48,
-    0x95,
-    0x96,
-    0xc8,
-    0xbe,
-    0xaf,
-    0x17,
-    0x1d,
-    0x7c,
-    0x79,
-    0xeb,
-    0x46,
-    0x4e,
-    0x5d,
-    0x65,
-    0xa0,
-    0x27,
-    0x5b,
-    0x1a,
-    0xbb,
-    0x6d,
-    0x06,
-    0xdb,
-    0x73,
-    0x98,
-    0xcf,
-    0xe6,
-    0x5c,
-    0xfb,
-    0x86,
-    0x5c,
-    0x64,
-    0xe1,
-    0x1e,
-    0xf6,
-    0xb3,
-    0xdc,
-    0xb1,
-    0xf4,
-    0xd6,
-    0x5a,
-    0xc3,
-    0x57,
-    0x1d,
-    0x79,
-    0xcb,
-    0x50,
-    0x41,
-    0x1d,
-    0xf0,
-    0xf8,
-    0x4a,
-    0x3f,
-    0x10,
-    0x41,
-    0xb0,
-    0x88,
-    0x06,
-    0x2d,
-    0xc1,
-    0x1e,
-    0x2d,
-    0x3e,
-    0x42,
-    0xbe,
-    0x20,
-    0x2d,
-    0x59,
-    0x0b,
-    0xc4,
-    0xdf,
-    0xab,
-    0x25,
-    0x89,
-    0x94,
-    0xc1,
-    0x7e,
-    0xec,
-    0x62,
-    0xb0,
-    0xe9,
-    0x41,
-    0xe2,
-    0xf9,
-    0xf4,
-    0xaf,
-    0x29,
-    0xae,
-    0x78,
-    0x7c,
-    0xf9,
-    0xd6,
-    0x6e,
-    0x8a,
-    0x39,
-    0x13,
-    0x04,
-    0x22,
-    0xa3,
-    0x82,
-    0xf1,
-    0xf1,
-    0xbd,
-    0xe3,
-    0x05,
-    0x50,
-    0x0a,
-    0xfa,
-    0x04,
-    0xc9,
-    0x81,
-    0x34,
-    0xb4,
-    0xd6,
-    0x3e,
-    0x8e,
-    0x35,
-    0xeb,
-    0x78,
-    0xb3,
-    0x91,
-    0xb7,
-    0xb3,
-    0x64,
-    0x94,
-    0xa8,
-    0x36,
-    0x1d,
-    0xde,
-    0xad,
-    0xc0,
-    0xf6,
-    0x36,
-    0x3f,
-    0x77,
-    0xc7,
-    0x21,
-    0xa2,
-    0x21,
-    0x8f,
-    0xb3,
-    0x68,
-    0x96,
-    0x17,
-    0xa6,
-    0x38,
-    0x75,
-    0xd2,
-    0xa9,
-    0xcd,
-    0x17,
-    0x08,
-    0xfa,
-    0x41,
-    0xc1,
-    0x33,
-    0x37,
-    0x8c,
-    0x1e,
-    0xaa,
-    0x72,
-    0x48,
-    0xec,
-    0x7c,
-    0x83,
-    0xb7,
-    0xf5,
-    0x9f,
-    0xa2,
-    0x06,
-    0x41,
-    0x4a,
-    0x35,
-    0xd3,
-    0x8a,
-    0x9f,
-    0xe6,
-    0xee,
-    0xf0,
-    0x8d,
-    0xf9,
-    0x5c,
-    0xee,
-    0xf5,
-    0xdc,
-    0xa2,
-    0x8d,
-    0x0b,
-    0x00,
-    0x40,
-    0xd7,
-    0x00,
-    0xe8,
-    0x7b,
-    0x8f,
-    0xde,
-    0x80,
-    0x5f,
-    0x1f,
-    0xb3,
-    0xaf,
-    0x05,
-    0xd2,
-    0xf1,
-    0x2f,
-    0x12,
-    0x43,
-    0x15,
-    0x9d,
-    0x80,
-    0x16,
-    0x87,
-    0xcc,
-    0xa1,
-    0xe5,
-    0xc1,
-    0x5f,
-    0x60,
-    0x7d,
-    0xb4,
-    0x97,
-    0xcb,
-    0x4b,
-    0x67,
-    0x69,
-    0xce,
-    0x11,
-    0xe2,
-    0xd4,
-    0x41,
-    0xdd,
-    0x4a,
-    0x71,
-    0x26,
-    0x3c,
-    0x4d,
-    0x4c,
-    0x2b,
-    0xab,
-    0xc1,
-    0xf2,
-    0x77,
-    0x4e,
-    0x87,
-    0xcb,
-    0xa2,
-    0xe5,
-    0xb6,
-    0xaa,
-    0x05,
-    0xfb,
-    0xf5,
-    0xa3,
-    0x35,
-    0x60,
-    0x29,
-    0x1d,
-    0xca,
-    0xda,
-    0x51,
-    0x27,
-    0x65,
-    0x18,
-    0xad,
-    0x10,
-    0xf1,
-    0xe7,
-    0x26,
-    0x31,
-    0x28,
-    0xa9,
-    0xea,
-    0x0e,
-    0x59,
-    0x02,
-    0x57,
-    0x9e,
-    0x69,
-    0xd4,
-    0x1a,
-    0xe6,
-    0x19,
-    0x6e,
-    0x98,
-    0xcd,
-    0x86,
-    0x00,
-    0x8d,
-    0x2b,
-    0xf6,
-    0x52,
-    0xf2,
-    0x23,
-    0xd1,
-    0xb6,
-    0x25,
-    0xb3,
-    0xee,
-    0x3c,
-    0x44,
-    0x89,
-    0x10,
-    0x24,
-    0xd9,
-    0x18,
-    0xb1,
-    0x99,
-    0xbd,
-    0xec,
-    0xfe,
-    0x9c,
-    0x36,
-    0x3a,
-    0x22,
-    0x3e,
-    0x63,
-    0xbc,
-    0xc7,
-    0x12,
-    0xda,
-    0xbb,
-    0xda,
-    0xe2,
-    0x8f,
-    0x6e,
-    0x8f,
-    0xa1,
-    0xf8,
-    0x82,
-    0xa6,
-    0xa1,
-    0x6e,
-    0xfa,
-    0xec,
-    0x06,
-    0xd7,
-    0x39,
-    0x04,
-    0x7b,
-    0x82,
-    0x5d,
-    0x67,
-    0x23,
-    0x52,
-    0xcf,
-    0xaa,
-    0xd2,
-    0x1f,
-    0x18,
-    0x00,
-    0x7e,
-    0x59,
-    0xf7,
-    0xff,
-    0xf0,
-    0xee,
-    0xb0,
-    0xa7,
-    0xbf,
-    0x6e,
-    0xa6,
-    0xa0,
-    0x7f,
-    0x6e,
-    0x2c,
-    0xc3,
-    0x36,
-    0x2a,
-    0x99,
-    0xdc,
-    0x0f,
-    0x6e,
-    0x9a,
-    0xae,
-    0x53,
-    0xb6,
-    0xcd,
-    0x38,
-    0x94,
-    0x94,
-    0x8b,
-    0x37,
-    0x2c,
-    0x52,
-    0x05,
-    0xec,
-    0xe6,
-    0xd8,
-    0x92,
-    0x1f,
-    0xfa,
-    0xd1,
-    0x47,
-    0x64,
-    0x3f,
-    0x0a,
-    0xc9,
-    0x9d,
-    0x9c,
-    0x1a,
-    0x5f,
-    0xc0,
-    0xbf,
-    0x48,
-    0x4b,
-    0xdb,
-    0x12,
-    0xa9,
-    0x5b,
-    0x55,
-    0xeb,
-    0x89,
-    0xbb,
-    0x76,
-    0x04,
-    0x0c,
-    0x0d,
-    0x29,
-    0x2a,
-    0x15,
-    0xbb,
-    0x01,
-    0x39,
-    0x67,
-    0x8c,
-    0x7b,
-    0x47,
-    0x0b,
-    0x76,
-    0x83,
-    0x20,
-    0xf1,
-    0xb4,
-    0x39,
-    0xf3,
-    0xda,
-    0x18,
-    0xf4,
-    0x4a,
-    0x74,
-    0xa1,
-    0x87,
-    0x3f,
-    0xc7,
-    0x50,
-    0xc4,
-    0xed,
-    0xd1,
-    0x38,
-    0x3f,
-    0x26,
-    0x6d,
-    0xd5,
-    0x55,
-    0x64,
-    0x7a,
-    0x9e,
-    0x6c,
-    0x01,
-    0x38,
-    0xdd,
-    0x7b,
-    0xaa,
-    0xf5,
-    0xbf,
-    0xce,
-    0x11,
-    0xea,
-    0xa7,
-    0x03,
-    0xe2,
-    0x60,
-    0xc8,
-    0x59,
-    0xf9,
-    0x17,
-    0xf3,
-    0x2a,
-    0xd2,
-    0xe7,
-    0xad,
-    0xb5,
-    0x40,
-    0xa8,
-    0x85,
-    0x21,
-    0x62,
-    0x50,
-    0xa5,
-    0xbf,
-    0xd3,
-    0x5b,
-    0xa6,
-    0x90,
-    0x22,
-    0x70,
-    0xa9,
-    0x07,
-    0x82,
-    0x41,
-    0xa3,
-    0x0f,
-    0xc2,
-    0xb3,
-    0xf8,
-    0x50,
-    0x7f,
-    0x3f,
-    0x4c,
-    0xae,
-    0x98,
-    0x97,
-    0x95,
-    0x13,
-    0xe2,
-    0x8d,
-    0x75,
-    0x6f,
-    0x1d,
-    0x31,
-    0xc8,
-    0xfd,
-    0x27,
-    0x3a,
-    0x79,
-    0xc7,
-    0x70,
-    0xa8,
-    0x99,
-    0x6c,
-    0xae,
-    0xa7,
-    0xb2,
-    0x21,
-    0xd2,
-    0xb5,
-    0x58,
-    0xf6,
-    0x3a,
-    0x07,
-    0x02,
-    0x5b,
-    0x28,
-    0x29,
-    0x18,
-    0xe2,
-    0x73,
-    0xe6,
-    0x4d,
-    0x46,
-    0x7c,
-    0x67,
-    0x2f,
-    0xad,
-    0x64,
-    0x9f,
-    0xfc,
-    0x2a,
-    0x7c,
-    0xe6,
-    0xb8,
-    0x86,
-    0xfd,
-    0xe3,
-    0x7c,
-    0x40,
-    0xfa,
-    0xb0,
-    0x11,
-    0xd2,
-    0x92,
-    0x39,
-    0xbe,
-    0x36,
-    0x6a,
-    0xe5,
-    0x5d,
-    0xa9,
-    0x5b,
-    0x79,
-    0xb4,
-    0xaf,
-    0x67,
-    0x39,
-    0x03,
-    0x57,
-    0xf2,
-    0x50,
-    0xda,
-    0xc0,
-    0x2e,
-    0x71,
-    0x2d,
-    0xdc,
-    0xd8,
-    0xbf,
-    0xaa,
-    0x74,
-    0x22,
-    0xea,
-    0x4a,
-    0x6c,
-    0xf0,
-    0x9b,
-    0x27,
-    0x49,
-    0x46,
-    0x13,
-    0x8d,
-    0xf0,
-    0x01,
-    0x0f,
-    0x53,
-    0xb0,
-    0xc6,
-    0xee,
-    0x6c,
-    0x83,
-    0x39,
-    0x15,
-    0xb9,
-    0x91,
-    0x6f,
-    0x93,
-    0x21,
-    0xf6,
-    0xa5,
-    0x01,
-    0xe4,
-    0xc5,
-    0x32,
-    0xac,
-    0x2c,
-    0x4d,
-    0xba,
-    0xf7,
-    0xe6,
-    0x9b,
-    0xa5,
-    0xfa,
-    0xcf,
-    0x40,
-    0xcf,
-    0x6f,
-    0xd2,
-    0x54,
-    0x81,
-    0xcf,
-    0x91,
-    0xba,
-    0xa1,
-    0xb8,
-    0x42,
-    0xa6,
-    0x25,
-    0x92,
-    0xbc,
-    0x5d,
-    0xcd,
-    0x72,
-    0xd1,
-    0x3c,
-    0x12,
-    0x3e,
-    0xdf,
-    0xfc,
-    0x5a,
-    0x13,
-    0xa2,
-    0x34,
-    0x6d,
-    0xe3,
-    0x4c,
-    0x1f,
-    0x2c,
-    0x63,
-    0xd8,
-    0xa0,
-    0x81,
-    0x24,
-    0x9b,
-    0x83,
-    0x92,
-    0xff,
-    0x1c,
-    0x06,
-    0x3a,
-    0xb7,
-    0x25,
-    0x98,
-    0xb9,
-    0xda,
-    0x1a,
-    0xe0,
-    0xaa,
-    0xe8,
-    0x8a,
-    0x01,
-    0x36,
-    0xb7,
-    0x04,
-    0x1d,
-    0x88,
-    0x16,
-    0x2c,
-    0x18,
-    0x80,
-    0xb1,
-    0x0d,
-    0x9e,
-    0xac,
-    0x35,
-    0xb1,
-    0x67,
-    0x74,
-    0xb4,
-    0xef,
-    0xb9,
-    0x94,
-    0x4a,
-    0x85,
-    0x2f,
-    0xd0,
-    0x01,
-    0x67,
-    0xba,
-    0xe2,
-    0xf2,
-    0x56,
-    0xe5,
-    0xb8,
-    0xad,
-    0xb3,
-    0x5d,
-    0xdc,
-    0xdb,
-    0x96,
-    0xb0,
-    0x34,
-    0x22,
-    0x1b,
-    0x55,
-    0xeb,
-    0x49,
-    0xfc,
-    0xed,
-    0xaf,
-    0x9d,
-    0x65,
-    0xc8,
-    0x1d,
-    0x93,
-    0x03,
-    0xab,
-    0x79,
-    0xae,
-    0x5f,
-    0xd0,
-    0xa3,
-    0xa3,
-    0x6a,
-    0x2f,
-    0x46,
-    0xbc,
-    0x58,
-    0xfc,
-    0x53,
-    0x7a,
-    0xb2,
-    0x71,
-    0xae,
-    0x7e,
-    0xa7,
-    0xcd,
-    0x27,
-    0xa9,
-    0xa4,
-    0x9d,
-    0xab,
-    0x83,
-    0x24,
-    0x3a,
-    0xbb,
-    0xd9,
-    0xc8,
-    0x93,
-    0x1e,
-    0xab,
-    0xaa,
-    0x2c,
-    0xd3,
-    0x45,
-    0xef,
-    0x67,
-    0x4a,
-    0xab,
-    0x9b,
-    0x03,
-    0xd4,
-    0x3a,
-    0xa9,
-    0xe2,
-    0x57,
-    0x8d,
-    0x5c,
-    0x0f,
-    0x46,
-    0x9e,
-    0xd0,
-    0xff,
-    0xd0,
-    0x2d,
-    0xd4,
-    0x17,
-    0x58,
-    0x66,
-    0xfc,
-    0x6f,
-    0x26,
-    0xbe,
-    0xf1,
-    0xd6,
-    0x5c,
-    0x1e,
-    0x0c,
-    0x16,
-    0x2b,
-    0x43,
-    0x23,
-    0x79,
-    0x46,
-    0x65,
-    0xa3,
-    0x8b,
-    0x97,
-    0x16,
-    0xdf,
-    0x22,
-    0x32,
-    0x6e,
-    0xa8,
-    0x9c,
-    0x87,
-    0x65,
-    0x1e,
-    0x68,
-    0xdb,
-    0x80,
-    0xc5,
-    0xc8,
-    0xf9,
-    0xb0,
-    0xdc,
-    0xd4,
-    0x24,
-    0x77,
-    0xea,
-    0xc3,
-    0x51,
-    0x4c,
-    0x99,
-    0x66,
-    0x93,
-    0x41,
-    0xc7,
-    0xf5,
-    0xd7,
-    0xe3,
-    0xdb,
-    0x0e,
-    0xd1,
-    0x61,
-    0x55,
-    0xfb,
-    0x36,
-    0xf1,
-    0xaa,
-    0x34,
-    0x2c,
-    0x70,
-    0x4e,
-    0x24,
-    0xff,
-    0x48,
-    0x12,
-    0x30,
-    0x15,
-    0x97,
-    0xb0,
-    0xf6,
-    0x24,
-    0x8e,
-    0xa4,
-    0xd2,
-    0xa2,
-    0x17,
-    0x3e,
-    0xa7,
-    0x7d,
-    0xba,
-    0xf6,
-    0xdc,
-    0x0d,
-    0xc1,
-    0xff,
-    0xa4,
-    0x47,
-    0x9a,
-    0x1f,
-    0x83,
-    0x33,
-    0x7e,
-    0xbd,
-    0x0e,
-    0xa0,
-    0x50,
-    0x3c,
-    0xf2,
-    0x16,
-    0xc8,
-    0x87,
-    0x37,
-    0x0c,
-    0xd0,
-    0xed,
-    0xc6,
-    0x5b,
-    0x2e,
-    0x30,
-    0x29,
-    0xf3,
-    0x64,
-    0xd8,
-    0x93,
-    0xcc,
-    0xd4,
-    0xcd,
-    0x20,
-    0x20,
-    0x28,
-    0x25,
-    0x5d,
-    0xd8,
-    0xf1,
-    0x3b,
-    0x0b,
-    0x44,
-    0x8e,
-    0x01,
-    0x20,
-    0x0e,
-    0x50,
-    0x97,
-    0x0f,
-    0x71,
-    0xdc,
-    0x1c,
-    0x49,
-    0xa6,
-    0xd0,
-    0xc4,
-    0x04,
-    0x9f,
-    0xa9,
-    0x2a,
-    0x3b,
-    0xf8,
-    0xe4,
-    0xe8,
-    0xf6,
-    0x2b,
-    0x63,
-    0x66,
-    0xcb,
-    0x03,
-    0x13,
-    0xef,
-    0xa5,
-    0x53,
-    0xcc,
-    0x0a,
-    0xc4,
-    0xe7,
-    0x78,
-    0x07,
-    0x05,
-    0xbb,
-    0x78,
-    0xd8,
-    0x64,
-    0x6b,
-    0x43,
-    0x22,
-    0xbf,
-    0xeb,
-    0x50,
-    0x94,
-    0xdd,
-    0x78,
-    0x37,
-    0x78,
-    0xae,
-    0xce,
-    0x13,
-    0x87,
-    0xd4,
-    0x9c,
-    0x2a,
-    0x02,
-    0x63,
-    0x35,
-    0xd0,
-    0xfe,
-    0xe5,
-    0x88,
-    0x88,
-    0x00,
-    0xa2,
-    0x52,
-    0x6d,
-    0xc9,
-    0x1e,
-    0x92,
-    0xd0,
-    0x73,
-    0xe2,
-    0x3e,
-    0x23,
-    0xbd,
-    0x7f,
-    0x34,
-    0x15,
-    0xa4,
-    0xd1,
-    0x73,
-    0xff,
-    0x33,
-    0x81,
-    0x8b,
-    0x7f,
-    0x9b,
-    0xcd,
-    0x52,
-    0x62,
-    0x86,
-    0x8c,
-    0xd9,
-    0xc8,
-    0xa9,
-    0x6c,
-    0x9e,
-    0x82,
-    0x98,
-    0x7f,
-    0x03,
-    0xbf,
-    0xdf,
-    0xf6,
-    0xff,
-    0xe8,
-    0x4e,
-    0x2c,
-    0x14,
-    0xc8,
-    0x94,
-    0xe6,
-    0x81,
-    0xf0,
-    0x10,
-    0xd9,
-    0xb8,
-    0x5a,
-    0xe3,
-    0x6c,
-    0x12,
-    0x4c,
-    0x4a,
-    0xc0,
-    0xc2,
-    0x7f,
-    0x2b,
-    0xed,
-    0x08,
-    0x81,
-    0xed,
-    0x8f,
-    0xa7,
-    0x58,
-    0x8d,
-    0x82,
-    0x98,
-    0x68,
-    0xee,
-    0xe9,
-    0x00,
-    0x97,
-    0x71,
-    0x75,
-    0x60,
-    0xae,
-    0xc6,
-    0xe4,
-    0x0b,
-    0x02,
-    0x02,
-    0xc7,
-    0xde,
-    0x55,
-    0xf1,
-    0x89,
-    0x2b
-  ],
-  const [
-    0x14,
-    0x1f,
-    0xd0,
-    0xb3,
-    0xd1,
-    0x11,
-    0xb5,
-    0x10,
-    0xdd,
-    0xcb,
-    0x31,
-    0xde,
-    0xe8,
-    0x87,
-    0xa3,
-    0xd4,
-    0x63,
-    0x46,
-    0x1a,
-    0x95,
-    0xef,
-    0x72,
-    0x68,
-    0x7a,
-    0x15,
-    0xc1,
-    0x78,
-    0x92,
-    0x37,
-    0x5c,
-    0xe1,
-    0xe7,
-    0xc6,
-    0x41,
-    0xba,
-    0x03,
-    0xb6,
-    0xe5,
-    0xb1,
-    0xb3,
-    0x2f,
-    0x1e,
-    0x57,
-    0x0b,
-    0x86,
-    0x41,
-    0xbe,
-    0xaa,
-    0x6b,
-    0x87,
-    0x46,
-    0x40,
-    0x64,
-    0xb6,
-    0xb4,
-    0x4d,
-    0x7a,
-    0xfd,
-    0x84,
-    0x2b,
-    0x31,
-    0x1f,
-    0x81,
-    0x4e,
-    0xbe,
-    0xd4,
-    0x92,
-    0xcb,
-    0x75,
-    0x6c,
-    0xd7,
-    0x17,
-    0x81,
-    0xb5,
-    0xf4,
-    0x11,
-    0xd7,
-    0x1f,
-    0xad,
-    0x43,
-    0x6d,
-    0x1e,
-    0xb4,
-    0x65,
-    0xa6,
-    0xd0,
-    0xbe,
-    0x23,
-    0x11,
-    0xe0,
-    0xdc,
-    0x21,
-    0x54,
-    0xaa,
-    0x09,
-    0x3b,
-    0x63,
-    0x9f,
-    0xff,
-    0x11,
-    0xf6,
-    0xeb,
-    0x50,
-    0xc3,
-    0x39,
-    0x56,
-    0xb1,
-    0xf9,
-    0xc5,
-    0x68,
-    0x99,
-    0x27,
-    0xcf,
-    0xd1,
-    0x0b,
-    0x0f,
-    0x9f,
-    0x08,
-    0xaf,
-    0x87,
-    0x44,
-    0x31,
-    0x28,
-    0x7c,
-    0x87,
-    0x44,
-    0xa2,
-    0x37,
-    0x1d,
-    0x6c,
-    0xaa,
-    0xdf,
-    0x21,
-    0xad,
-    0x43,
-    0x3f,
-    0xc1,
-    0xca,
-    0x36,
-    0xca,
-    0x37,
-    0x66,
-    0xa9,
-    0xdc,
-    0xfb,
-    0x69,
-    0xf3,
-    0x43,
-    0x36,
-    0xa5,
-    0xaf,
-    0xfe,
-    0x7a,
-    0xba,
-    0x0f,
-    0x44,
-    0xb1,
-    0x36,
-    0x74,
-    0xc9,
-    0x54,
-    0x01,
-    0x3b,
-    0x3c,
-    0xde,
-    0xf9,
-    0xd9,
-    0x14,
-    0x7f,
-    0xd9,
-    0x2a,
-    0x8c,
-    0x14,
-    0x5f,
-    0x06,
-    0xec,
-    0x57,
-    0xae,
-    0x16,
-    0x0b,
-    0x53,
-    0xf1,
-    0xe5,
-    0x12,
-    0x1c,
-    0x41,
-    0x3a,
-    0x82,
-    0xbc,
-    0xc9,
-    0xa6,
-    0x79,
-    0x70,
-    0x27,
-    0x59,
-    0x31,
-    0x15,
-    0x16,
-    0x39,
-    0xc9,
-    0xdd,
-    0x4a,
-    0x36,
-    0x48,
-    0x46,
-    0x9c,
-    0xd7,
-    0xdf,
-    0x4d,
-    0x67,
-    0x19,
-    0x6e,
-    0xde,
-    0x32,
-    0x7a,
-    0x4a,
-    0x90,
-    0x8f,
-    0x51,
-    0x3e,
-    0x8f,
-    0x42,
-    0x60,
-    0xcf,
-    0xd9,
-    0xa6,
-    0xac,
-    0xc4,
-    0xae,
-    0x4d,
-    0x8d,
-    0xe6,
-    0x41,
-    0xe7,
-    0x01,
-    0x05,
-    0xb4,
-    0x65,
-    0x45,
-    0x3b,
-    0x43,
-    0x5e,
-    0xa7,
-    0x75,
-    0xc0,
-    0xb1,
-    0x96,
-    0x2e,
-    0x3f,
-    0x6c,
-    0xfb,
-    0x7e,
-    0x12,
-    0xec,
-    0xcc,
-    0x54,
-    0xf8,
-    0x46,
-    0xdd,
-    0xff,
-    0x91,
-    0xe6,
-    0xfa,
-    0xf4,
-    0x15,
-    0x76,
-    0x34,
-    0xcb,
-    0x46,
-    0x02,
-    0x78,
-    0x8a,
-    0xa3,
-    0x59,
-    0x66,
-    0x26,
-    0xdf,
-    0xb6,
-    0x5f,
-    0x47,
-    0x91,
-    0x9f,
-    0xe0,
-    0x4c,
-    0x2d,
-    0x0e,
-    0x0f,
-    0x8f,
-    0x33,
-    0xcf,
-    0x94,
-    0xea,
-    0xa6,
-    0x29,
-    0xaa,
-    0x7a,
-    0xc0,
-    0xc0,
-    0x76,
-    0xa2,
-    0xe4,
-    0xba,
-    0x97,
-    0x53,
-    0xd4,
-    0x21,
-    0xfe,
-    0x8b,
-    0x24,
-    0x88,
-    0x00,
-    0x1c,
-    0xef,
-    0xf2,
-    0xa9,
-    0xaf,
-    0xc8,
-    0xef,
-    0x54,
-    0x08,
-    0xf3,
-    0x08,
-    0x78,
-    0x8c,
-    0xd6,
-    0x5d,
-    0xc5,
-    0x00,
-    0xaa,
-    0x8d,
-    0x70,
-    0x93,
-    0x76,
-    0xd6,
-    0xcb,
-    0x1f,
-    0x3e,
-    0x7e,
-    0x18,
-    0xac,
-    0x77,
-    0x71,
-    0x9f,
-    0x36,
-    0xbf,
-    0x2b,
-    0xfe,
-    0xb0,
-    0xcb,
-    0xd8,
-    0xc1,
-    0x48,
-    0xa1,
-    0xba,
-    0x32,
-    0xed,
-    0x07,
-    0xcc,
-    0x72,
-    0x0e,
-    0x3b,
-    0xa5,
-    0xc9,
-    0xa5,
-    0xe4,
-    0x9e,
-    0x3b,
-    0x75,
-    0x49,
-    0x37,
-    0x5c,
-    0x8f,
-    0xc1,
-    0xb7,
-    0x65,
-    0x1b,
-    0x6a,
-    0x13,
-    0x86,
-    0x55,
-    0x1e,
-    0x11,
-    0x7e,
-    0xd6,
-    0xa3,
-    0xad,
-    0x6a,
-    0x15,
-    0x22,
-    0xbc,
-    0xda,
-    0x2d,
-    0xdb,
-    0xcf,
-    0x2a,
-    0xe1,
-    0x16,
-    0x5a,
-    0x10,
-    0xdd,
-    0x5d,
-    0x16,
-    0x71,
-    0x3e,
-    0xe8,
-    0xa3,
-    0x79,
-    0x55,
-    0x59,
-    0x72,
-    0xea,
-    0xa8,
-    0xaa,
-    0xe2,
-    0xb4,
-    0x3a,
-    0x63,
-    0xa9,
-    0xc7,
-    0x0d,
-    0x10,
-    0x76,
-    0x25,
-    0xe4,
-    0xf2,
-    0xd5,
-    0x3b,
-    0x4d,
-    0xf5,
-    0x52,
-    0x71,
-    0xdf,
-    0xe2,
-    0xe1,
-    0x00,
-    0xc1,
-    0xd6,
-    0x7d,
-    0x03,
-    0x6c,
-    0xf3,
-    0x10,
-    0xd2,
-    0xb1,
-    0x55,
-    0x93,
-    0x8b,
-    0xfd,
-    0x47,
-    0x76,
-    0xf1,
-    0xdc,
-    0xb7,
-    0x42,
-    0x7a,
-    0xbc,
-    0xe8,
-    0x7d,
-    0xa3,
-    0xf4,
-    0x67,
-    0xce,
-    0x87,
-    0x04,
-    0x40,
-    0x61,
-    0xb0,
-    0x1e,
-    0x71,
-    0x8d,
-    0x2d,
-    0xe6,
-    0x9f,
-    0xb4,
-    0xe4,
-    0x77,
-    0x08,
-    0x6b,
-    0x2a,
-    0xa6,
-    0xb9,
-    0xdb,
-    0x91,
-    0x8a,
-    0x01,
-    0x67,
-    0x01,
-    0x3c,
-    0x25,
-    0x90,
-    0x0b,
-    0xdb,
-    0x55,
-    0x15,
-    0x79,
-    0xd3,
-    0xdf,
-    0x5e,
-    0x2a,
-    0x5f,
-    0xa3,
-    0x1a,
-    0x1d,
-    0x4d,
-    0xc7,
-    0x28,
-    0xcb,
-    0x02,
-    0xac,
-    0xb3,
-    0xba,
-    0xbd,
-    0x20,
-    0xa2,
-    0x4f,
-    0x20,
-    0xd5,
-    0x2f,
-    0xe4,
-    0xec,
-    0x11,
-    0xd5,
-    0x1a,
-    0x0c,
-    0xa8,
-    0x70,
-    0x70,
-    0xd5,
-    0x28,
-    0xa0,
-    0x15,
-    0x8c,
-    0x53,
-    0x6e,
-    0xfb,
-    0x28,
-    0xd2,
-    0x32,
-    0x2d,
-    0x5a,
-    0x27,
-    0xb4,
-    0x62,
-    0xcb,
-    0xe4,
-    0x91,
-    0xd2,
-    0xa5,
-    0x1a,
-    0xe0,
-    0x48,
-    0x54,
-    0x15,
-    0x16,
-    0x79,
-    0x8e,
-    0x46,
-    0x27,
-    0x94,
-    0x90,
-    0x81,
-    0xee,
-    0x1a,
-    0xab,
-    0x69,
-    0xcf,
-    0xf0,
-    0x00,
-    0x28,
-    0x9b,
-    0xb3,
-    0x88,
-    0x63,
-    0xb3,
-    0x4b,
-    0x57,
-    0x6c,
-    0x71,
-    0xc3,
-    0x21,
-    0xba,
-    0xc3,
-    0x57,
-    0xfd,
-    0x97,
-    0x19,
-    0xcf,
-    0x69,
-    0x19,
-    0x82,
-    0x0c,
-    0x8e,
-    0x53,
-    0x11,
-    0xe1,
-    0xc6,
-    0xcc,
-    0x86,
-    0x24,
-    0x5c,
-    0x31,
-    0x2a,
-    0x04,
-    0x93,
-    0x46,
-    0xfb,
-    0x9c,
-    0xe9,
-    0x22,
-    0x09,
-    0xc9,
-    0x9c,
-    0x9c,
-    0x20,
-    0x39,
-    0x6e,
-    0x01,
-    0xa7,
-    0xc5,
-    0xa5,
-    0x08,
-    0xc8,
-    0x01,
-    0x57,
-    0x07,
-    0xd2,
-    0x11,
-    0xe4,
-    0x66,
-    0xdb,
-    0xbe,
-    0xc4,
-    0x54,
-    0xa9,
-    0xc9,
-    0x83,
-    0xba,
-    0xd3,
-    0x7e,
-    0x09,
-    0x6d,
-    0x23,
-    0x8d,
-    0x1f,
-    0xa8,
-    0x3f,
-    0x16,
-    0x2f,
-    0xb9,
-    0x88,
-    0x03,
-    0x4b,
-    0xfa,
-    0x43,
-    0x9a,
-    0x71,
-    0x03,
-    0xf7,
-    0x52,
-    0x0e,
-    0x1e,
-    0x15,
-    0xe6,
-    0xc0,
-    0xfc,
-    0xde,
-    0xa9,
-    0x60,
-    0xa6,
-    0x82,
-    0x19,
-    0x40,
-    0xb5,
-    0x85,
-    0xb6,
-    0xb1,
-    0xc6,
-    0x67,
-    0x15,
-    0xc9,
-    0x29,
-    0x84,
-    0x30,
-    0x63,
-    0xd9,
-    0x39,
-    0x00,
-    0x66,
-    0xb1,
-    0x48,
-    0x4e,
-    0x4b,
-    0xdc,
-    0x7e,
-    0xc6,
-    0xd9,
-    0x8e,
-    0x93,
-    0x4d,
-    0x33,
-    0xf1,
-    0x51,
-    0x94,
-    0x15,
-    0x63,
-    0xf8,
-    0xed,
-    0x5b,
-    0xde,
-    0xe2,
-    0x5e,
-    0xc3,
-    0xb7,
-    0x63,
-    0xf4,
-    0xf3,
-    0x8c,
-    0xf3,
-    0x5a,
-    0xbe,
-    0x78,
-    0x8f,
-    0xaa,
-    0xa3,
-    0x88,
-    0x5c,
-    0x83,
-    0x96,
-    0x73,
-    0x8e,
-    0x5c,
-    0x04,
-    0x85,
-    0x88,
-    0x18,
-    0x11,
-    0xdd,
-    0x44,
-    0xda,
-    0x24,
-    0xd8,
-    0xf6,
-    0x1a,
-    0xa5,
-    0xcd,
-    0xec,
-    0xf9,
-    0x05,
-    0xfb,
-    0xb9,
-    0xd1,
-    0xff,
-    0xbf,
-    0x92,
-    0x11,
-    0x1e,
-    0x0b,
-    0xf8,
-    0x48,
-    0x80,
-    0x13,
-    0x98,
-    0x7f,
-    0xd9,
-    0x49,
-    0x6f,
-    0xcc,
-    0xba,
-    0x8c,
-    0x31,
-    0x24,
-    0x14,
-    0x9c,
-    0xec,
-    0x71,
-    0xf8,
-    0xd2,
-    0xe8,
-    0xe4,
-    0xa0,
-    0x0e,
-    0xd3,
-    0x8d,
-    0xb3,
-    0xf0,
-    0x1a,
-    0x29,
-    0xc5,
-    0x4b,
-    0x9a,
-    0x3b,
-    0x1d,
-    0xd6,
-    0x78,
-    0x5e,
-    0xbc,
-    0x25,
-    0x4d,
-    0xd9,
-    0x9b,
-    0xd8,
-    0x87,
-    0x74,
-    0x33,
-    0x13,
-    0x0c,
-    0x8a,
-    0x42,
-    0x2e,
-    0x20,
-    0x60,
-    0xcd,
-    0xad,
-    0x88,
-    0xb5,
-    0x61,
-    0x72,
-    0xef,
-    0x9a,
-    0x9f,
-    0x31,
-    0x8a,
-    0x84,
-    0xf8,
-    0x25,
-    0xf8,
-    0xa0,
-    0xb4,
-    0x01,
-    0x6c,
-    0x66,
-    0x39,
-    0x2a,
-    0x0d,
-    0x71,
-    0x8a,
-    0x23,
-    0x9d,
-    0x8e,
-    0x0e,
-    0x48,
-    0x59,
-    0x13,
-    0x93,
-    0xc0,
-    0x21,
-    0x72,
-    0x92,
-    0xad,
-    0xd9,
-    0x0d,
-    0xb4,
-    0xa5,
-    0x0f,
-    0x4c,
-    0x96,
-    0x66,
-    0xde,
-    0xed,
-    0xc9,
-    0xc5,
-    0x12,
-    0x9c,
-    0x1e,
-    0xe8,
-    0x8c,
-    0xc4,
-    0x20,
-    0xb5,
-    0xe9,
-    0xa4,
-    0xe1,
-    0x8a,
-    0x5e,
-    0xa5,
-    0xfa,
-    0x2f,
-    0xe6,
-    0xeb,
-    0xcd,
-    0x09,
-    0xa0,
-    0x2a,
-    0x0d,
-    0x90,
-    0x72,
-    0xbb,
-    0x81,
-    0x03,
-    0xf3,
-    0xef,
-    0x04,
-    0x5a,
-    0x88,
-    0xa3,
-    0xd1,
-    0x7c,
-    0xcd,
-    0x14,
-    0xfd,
-    0xb2,
-    0x36,
-    0xf5,
-    0x45,
-    0x5b,
-    0xf6,
-    0xbf,
-    0x0a,
-    0xe2,
-    0x1f,
-    0x49,
-    0x9a,
-    0xee,
-    0x0b,
-    0x98,
-    0xb1,
-    0xd8,
-    0xfc,
-    0xf8,
-    0x40,
-    0x62,
-    0xff,
-    0x4b,
-    0x6c,
-    0xa6,
-    0x16,
-    0xa2,
-    0xda,
-    0x4c,
-    0x95,
-    0x0a,
-    0x2a,
-    0x00,
-    0xcd,
-    0xa9,
-    0xc1,
-    0x23,
-    0xe8,
-    0x09,
-    0xcc,
-    0xc1,
-    0x14,
-    0xb3,
-    0x81,
-    0xc4,
-    0xe4,
-    0x00,
-    0xa8,
-    0x67,
-    0xf2,
-    0x2c,
-    0x5b,
-    0xed,
-    0xca,
-    0xac,
-    0x0a,
-    0x92,
-    0x03,
-    0xc1,
-    0xc2,
-    0xc2,
-    0xaf,
-    0x4e,
-    0xae,
-    0x89,
-    0xf6,
-    0xe7,
-    0xde,
-    0x4b,
-    0xfd,
-    0x2a,
-    0x47,
-    0xb5,
-    0x0d,
-    0x52,
-    0x0b,
-    0xf3,
-    0xf1,
-    0x09,
-    0xfb,
-    0x23,
-    0x9f,
-    0x7e,
-    0x5a,
-    0x0a,
-    0x1b,
-    0xb8,
-    0xe4,
-    0x06,
-    0x99,
-    0x2a,
-    0x0f,
-    0x44,
-    0xe2,
-    0x87,
-    0x91,
-    0x33,
-    0xf8,
-    0xd7,
-    0x22,
-    0x39,
-    0xfd,
-    0xcb,
-    0x83,
-    0xa4,
-    0x51,
-    0x4d,
-    0xbf,
-    0xe3,
-    0xfb,
-    0x5c,
-    0xb1,
-    0xf6,
-    0x4a,
-    0x17,
-    0xc6,
-    0x23,
-    0xbb,
-    0x17,
-    0x05,
-    0xeb,
-    0x1e,
-    0x02,
-    0x4c,
-    0x3c,
-    0xf5,
-    0x5d,
-    0xdc,
-    0xe8,
-    0x1d,
-    0xa2,
-    0x17,
-    0x56,
-    0xb0,
-    0x93,
-    0x89,
-    0x78,
-    0x29,
-    0xcd,
-    0x26,
-    0xfc,
-    0xc9,
-    0xa0,
-    0xd2,
-    0xc7,
-    0x3a,
-    0x1e,
-    0x27,
-    0x9f,
-    0x73,
-    0x72,
-    0x72,
-    0x27,
-    0xdb,
-    0x74,
-    0xfe,
-    0x11,
-    0xb1,
-    0x7a,
-    0x96,
-    0x8f,
-    0xab,
-    0x70,
-    0x45,
-    0x0a,
-    0xdd,
-    0x2b,
-    0x60,
-    0x17,
-    0xdd,
-    0xfa,
-    0xc6,
-    0xa7,
-    0x25,
-    0x7e,
-    0x67,
-    0x7d,
-    0xb8,
-    0xbc,
-    0x03,
-    0xe6,
-    0x09,
-    0x71,
-    0x34,
-    0xa4,
-    0x18,
-    0xa5,
-    0xaf,
-    0x2b,
-    0xde,
-    0x83,
-    0xc7,
-    0x10,
-    0xeb,
-    0x68,
-    0x33,
-    0xbe,
-    0x4e,
-    0x3a,
-    0x10,
-    0x6b,
-    0xb5,
-    0xfb,
-    0x2a,
-    0x4a,
-    0xd5,
-    0x9e,
-    0x77,
-    0x02,
-    0x0c,
-    0x19,
-    0xe4,
-    0x60,
-    0x45,
-    0xbb,
-    0x54,
-    0x48,
-    0x1d,
-    0xc0,
-    0xe6,
-    0xf2,
-    0x44,
-    0x23,
-    0x77,
-    0x53,
-    0x25,
-    0xb3,
-    0x69,
-    0xd8,
-    0xc9,
-    0x69,
-    0xa2,
-    0x5a,
-    0xf8,
-    0xf9,
-    0xd7,
-    0x4f,
-    0xa2,
-    0xa7,
-    0x0a,
-    0x3d,
-    0x7e,
-    0x5c,
-    0x51,
-    0x75,
-    0xf1,
-    0xf9,
-    0xda,
-    0xfd,
-    0x31,
-    0xeb,
-    0x2c,
-    0xce,
-    0xaa,
-    0x00,
-    0xaf,
-    0x3f,
-    0xa1,
-    0x78,
-    0x6f,
-    0xc2,
-    0x17,
-    0x60,
-    0x1d,
-    0xce,
-    0xf0,
-    0x1b,
-    0x57,
-    0x1c,
-    0x54,
-    0x42,
-    0x28,
-    0x16,
-    0x56,
-    0xae,
-    0xd3,
-    0x8d,
-    0xd3,
-    0xd2,
-    0xcc,
-    0xaa,
-    0x9d,
-    0x4e,
-    0x08,
-    0x27,
-    0xd9,
-    0xc2,
-    0x76,
-    0xbe,
-    0xa6,
-    0xe0,
-    0xce,
-    0xe2,
-    0x00,
-    0xc6,
-    0x89,
-    0xae,
-    0xe3,
-    0x8a,
-    0x30,
-    0x1b,
-    0xb3,
-    0x16,
-    0xda,
-    0x75,
-    0xdb,
-    0x36,
-    0xf1,
-    0x10,
-    0xb5,
-    0xef,
-    0x34,
-    0x37,
-    0xaa,
-    0x13,
-    0x02,
-    0x65,
-    0x9a,
-    0x12,
-    0xd5,
-    0xb8,
-    0x7d,
-    0x13,
-    0x0d,
-    0xa2,
-    0x4b,
-    0x43,
-    0xef,
-    0xe2,
-    0x1a,
-    0x6d,
-    0xed,
-    0xb2,
-    0x86,
-    0xcc,
-    0x27,
-    0x42,
-    0x56,
-    0x1d,
-    0x33,
-    0x66,
-    0x5d,
-    0xf7,
-    0x19,
-    0x8b,
-    0x9d,
-    0x5f,
-    0xa2,
-    0xf0,
-    0xb3,
-    0x98,
-    0xd3,
-    0x13,
-    0x6f,
-    0x38,
-    0xb4,
-    0x69,
-    0xc2,
-    0x81,
-    0x56,
-    0x51,
-    0xdd,
-    0xed,
-    0x13,
-    0x4b,
-    0x97,
-    0x0b,
-    0x18,
-    0x65,
-    0x0f,
-    0x8a,
-    0x21,
-    0xf7,
-    0x93,
-    0x93,
-    0x84,
-    0x90,
-    0xc1,
-    0x5d,
-    0x71,
-    0x30,
-    0xec,
-    0xfb,
-    0x78,
-    0xb8,
-    0xc2,
-    0x78,
-    0x4b,
-    0x9e,
-    0x2b,
-    0x25,
-    0xc6,
-    0xe5,
-    0x74,
-    0x32,
-    0x2c,
-    0x4d,
-    0xac,
-    0x7c,
-    0xb4,
-    0xc7,
-    0x4e,
-    0xa6,
-    0x44,
-    0x2b,
-    0x21,
-    0x6b,
-    0x7c,
-    0x2d,
-    0x5d,
-    0x32,
-    0xf6,
-    0x8e,
-    0x0f,
-    0xe3,
-    0xcc,
-    0x8f,
-    0xbe,
-    0xfa,
-    0x5b,
-    0xab,
-    0x4f,
-    0xda,
-    0x47,
-    0x85,
-    0x26,
-    0x63,
-    0xc0,
-    0x20,
-    0x8e,
-    0xc6,
-    0x03,
-    0x4e,
-    0x5b,
-    0x98,
-    0x23,
-    0x6b,
-    0xce,
-    0x26,
-    0x09,
-    0x4a,
-    0xb8,
-    0x09,
-    0xb9,
-    0x70,
-    0xe2,
-    0xfa,
-    0xd8,
-    0x80,
-    0xad,
-    0xe7,
-    0x6b,
-    0xf7,
-    0xf6,
-    0x46,
-    0xe2,
-    0x19,
-    0x3c,
-    0xa9,
-    0x55,
-    0x2c,
-    0x05,
-    0x92,
-    0x0d,
-    0xe3,
-    0x7d,
-    0x89,
-    0x46,
-    0x1d,
-    0x61,
-    0x6d,
-    0x33,
-    0xd0,
-    0x1b,
-    0x08,
-    0x43,
-    0x3f,
-    0x2f,
-    0xe5,
-    0xa3,
-    0x74,
-    0xd5,
-    0x66,
-    0x04,
-    0xea,
-    0xe7,
-    0x11,
-    0x9e,
-    0x8a,
-    0xfe,
-    0x2b,
-    0x75,
-    0xd8,
-    0xd9,
-    0x88,
-    0xdb,
-    0x6f,
-    0xfe,
-    0xa1,
-    0x36,
-    0xab,
-    0xa3,
-    0xe7,
-    0x03,
-    0xa5,
-    0xce,
-    0x57,
-    0x1b,
-    0x64,
-    0xbc,
-    0x4f,
-    0x35,
-    0x51,
-    0x80,
-    0xa0,
-    0xad,
-    0xec,
-    0xec,
-    0xe4,
-    0x84,
-    0xbe,
-    0xb4,
-    0x12,
-    0xa7,
-    0x8e,
-    0xd1,
-    0x4f,
-    0x74,
-    0xd8,
-    0x24,
-    0x07,
-    0x7a,
-    0x7b,
-    0x5c,
-    0x3d,
-    0x80,
-    0xb2,
-    0x19,
-    0x1f,
-    0xc9,
-    0x45,
-    0x51,
-    0xde,
-    0x97,
-    0x01,
-    0xf4,
-    0xbc,
-    0xee,
-    0x65,
-    0xcb,
-    0x67,
-    0x9a,
-    0x9e,
-    0xa6,
-    0x85,
-    0x74,
-    0xb6,
-    0xb6,
-    0x90,
-    0xe0,
-    0x08,
-    0x38,
-    0xe4,
-    0x9a,
-    0xf7,
-    0x53,
-    0x16,
-    0xb3,
-    0xdf,
-    0x44,
-    0x88,
-    0xd6,
-    0x4c,
-    0xb8,
-    0x3a,
-    0xd0,
-    0x6a,
-    0x79,
-    0xe3,
-    0x4f,
-    0xbd,
-    0x4d,
-    0x41,
-    0xea,
-    0x12,
-    0x1c,
-    0xad,
-    0x62,
-    0xb6,
-    0x50,
-    0xf2,
-    0x28,
-    0xe5,
-    0x81,
-    0x5f,
-    0x1f,
-    0x85,
-    0x52,
-    0x1b,
-    0xa2,
-    0x15,
-    0x96,
-    0xb9,
-    0xc9,
-    0xe0,
-    0xb8,
-    0x0c,
-    0xe8,
-    0x76,
-    0x59,
-    0x3d,
-    0x59,
-    0x5c,
-    0x3a,
-    0x1a,
-    0x7c,
-    0x03,
-    0x5d,
-    0xb1,
-    0xfb,
-    0xf7,
-    0x67,
-    0x1e,
-    0x53,
-    0x59,
-    0x49,
-    0xa1,
-    0x90,
-    0x8f,
-    0x1f,
-    0xf4,
-    0x57,
-    0x3a,
-    0x58,
-    0xdb,
-    0x2a,
-    0x68,
-    0x18,
-    0xfc,
-    0xe8,
-    0x0c,
-    0xda,
-    0xf1,
-    0x93,
-    0xab,
-    0x5a,
-    0x9c,
-    0x56,
-    0x57,
-    0xb2,
-    0xba,
-    0xc7,
-    0xe1,
-    0xc3,
-    0xbb,
-    0x69,
-    0x4b,
-    0xd6,
-    0xd2,
-    0x75,
-    0x7c,
-    0x83,
-    0x48,
-    0xda,
-    0x37,
-    0xd3,
-    0x15,
-    0x82,
-    0x4e,
-    0xa1,
-    0xb1,
-    0xd7,
-    0x13,
-    0x46,
-    0x28,
-    0x86,
-    0x10,
-    0x75,
-    0x6d,
-    0x82,
-    0xf8,
-    0x63,
-    0xf0,
-    0x4d,
-    0xdd,
-    0x2b,
-    0x72,
-    0x73,
-    0xa2,
-    0x72,
-    0x18,
-    0x57,
-    0xb4,
-    0x46,
-    0xbf,
-    0x31,
-    0xf5,
-    0x4c,
-    0x90,
-    0x58,
-    0xf9,
-    0x1b,
-    0xd4,
-    0xbd,
-    0x75,
-    0xe3,
-    0x09,
-    0xb8,
-    0xf4,
-    0x52,
-    0x35,
-    0x08,
-    0xcc,
-    0xb8,
-    0x7a,
-    0x15,
-    0x51,
-    0x69,
-    0xeb,
-    0x77,
-    0x48,
-    0x63,
-    0x9e,
-    0xbc,
-    0x9f,
-    0x30,
-    0x02,
-    0x66,
-    0x5b,
-    0x0e,
-    0x73,
-    0x34,
-    0xd1,
-    0x4e,
-    0x0c,
-    0xa3,
-    0x19,
-    0xfa,
-    0xbd,
-    0xb3,
-    0xc0,
-    0xba,
-    0x9d,
-    0xee,
-    0xbd,
-    0xf8,
-    0x81,
-    0xa7,
-    0xa6,
-    0x43,
-    0xcd,
-    0x80,
-    0x24,
-    0xf1,
-    0x8a,
-    0x2f,
-    0xa5,
-    0x09,
-    0xb9,
-    0x81,
-    0x50,
-    0x60,
-    0xe7,
-    0x9e,
-    0x3e,
-    0x01,
-    0x02,
-    0x90,
-    0xe7,
-    0xd2,
-    0x6b,
-    0xff,
-    0xda,
-    0x75,
-    0x4c,
-    0x3e,
-    0xb2,
-    0x6d,
-    0x2c,
-    0x8c,
-    0x45,
-    0x82,
-    0xc1,
-    0x93,
-    0x1e,
-    0x66,
-    0x05,
-    0x35,
-    0x2e,
-    0x98,
-    0x8c,
-    0x88,
-    0xbe,
-    0x89,
-    0x14,
-    0x1f,
-    0xa8,
-    0xfe,
-    0x5e,
-    0x8c,
-    0xc7,
-    0xb5,
-    0x3c,
-    0x22,
-    0xac,
-    0x4b,
-    0xec,
-    0x00,
-    0x92,
-    0x5d,
-    0xa4,
-    0x4b,
-    0x94,
-    0xee,
-    0x6e,
-    0xba,
-    0x1e,
-    0x08,
-    0x36,
-    0x58,
-    0xa2,
-    0xa6,
-    0x21,
-    0x85,
-    0x8c,
-    0xd2,
-    0x21,
-    0x3e,
-    0x77,
-    0x0b,
-    0xc7,
-    0x9f,
-    0xa1,
-    0xe9,
-    0x58,
-    0xa6,
-    0x9c,
-    0x04,
-    0x22,
-    0x3a,
-    0x47,
-    0x11,
-    0x10,
-    0x6c,
-    0xfd,
-    0x4e,
-    0x7d,
-    0xfc,
-    0x0c,
-    0x21,
-    0x46,
-    0x1f,
-    0x69,
-    0xfb,
-    0x23,
-    0x7f,
-    0xa2,
-    0x83,
-    0x37,
-    0x84,
-    0x13,
-    0xf1,
-    0xe5,
-    0xd2,
-    0x5d,
-    0xb7,
-    0xe6,
-    0x13,
-    0x14,
-    0x67,
-    0x98,
-    0xf6,
-    0xb8,
-    0xd1,
-    0x99,
-    0x77,
-    0xe7,
-    0x6b,
-    0x95,
-    0x62,
-    0xd0,
-    0xf7,
-    0x5c,
-    0x12,
-    0xeb,
-    0x5f,
-    0x38,
-    0x7f,
-    0xe8,
-    0xe4,
-    0x7d,
-    0x78,
-    0xe5,
-    0x77,
-    0x61,
-    0x2c,
-    0xe3,
-    0x67,
-    0x0e,
-    0xef,
-    0x7b,
-    0x3d,
-    0xf6,
-    0x3b,
-    0xcd,
-    0xe5,
-    0x67,
-    0xf5,
-    0xba,
-    0x0e,
-    0x5f,
-    0xf2,
-    0x53,
-    0xd2,
-    0xa1,
-    0xba,
-    0x90,
-    0x9a,
-    0x08,
-    0x8c,
-    0x46,
-    0x3c,
-    0x1c,
-    0xa2,
-    0x53,
-    0x67,
-    0xe3,
-    0xb5,
-    0x1b,
-    0x41,
-    0xfa,
-    0xc4,
-    0x39,
-    0x4e,
-    0xe3,
-    0x12,
-    0x6e,
-    0x94,
-    0xa1,
-    0x6e,
-    0xdd,
-    0xfd,
-    0x82,
-    0xb6,
-    0x7b,
-    0xfc,
-    0x3d,
-    0x9e,
-    0xc1,
-    0x73,
-    0x3c,
-    0xae,
-    0xa4,
-    0xd5,
-    0x3b,
-    0x8a,
-    0xc6,
-    0x88,
-    0x12,
-    0x76,
-    0xee,
-    0x8d,
-    0xcf,
-    0x19,
-    0xb6,
-    0x62,
-    0x08,
-    0x81,
-    0x83,
-    0x27,
-    0x70,
-    0x68,
-    0xba,
-    0x01,
-    0xa7,
-    0xb6,
-    0x31,
-    0xbc,
-    0x57,
-    0x47,
-    0xe4,
-    0xb4,
-    0x7c,
-    0xed,
-    0xea,
-    0xf5,
-    0x03,
-    0xb9,
-    0xa7,
-    0xa1,
-    0x97,
-    0x76,
-    0x42,
-    0x92,
-    0xb8,
-    0x77,
-    0x59,
-    0x41,
-    0x0d,
-    0x93,
-    0xf4,
-    0xe6,
-    0xfb,
-    0x6d,
-    0xb8,
-    0xe1,
-    0x76,
-    0xf9,
-    0x5e,
-    0x59,
-    0x17,
-    0x3b,
-    0x63,
-    0x23,
-    0x6f,
-    0x52,
-    0x00,
-    0xe5,
-    0x9c,
-    0xb6,
-    0x5c,
-    0x7b,
-    0x19,
-    0xbe,
-    0x01,
-    0x99,
-    0xdb,
-    0x65,
-    0x8c,
-    0xb2,
-    0x99,
-    0x4d,
-    0xa9,
-    0x19,
-    0x6b,
-    0x04,
-    0x3f,
-    0x67,
-    0x96,
-    0x87,
-    0xe8,
-    0x1c,
-    0xa6,
-    0x04,
-    0xa4,
-    0x89,
-    0xbe,
-    0xe4,
-    0xce,
-    0xed,
-    0x2d,
-    0x09,
-    0x4f,
-    0xde,
-    0x41,
-    0x54,
-    0x11,
-    0xea,
-    0x60,
-    0x6b,
-    0xb7,
-    0x7f,
-    0x54,
-    0xb9,
-    0x8b,
-    0x08,
-    0xe7,
-    0xb6,
-    0xb7,
-    0x59,
-    0xb0,
-    0x68,
-    0xb9,
-    0x4d,
-    0x2c,
-    0x2a,
-    0x11,
-    0xad,
-    0x11,
-    0xac,
-    0x3c,
-    0x54,
-    0xde,
-    0x3b,
-    0xe6,
-    0x91,
-    0xb7,
-    0x42,
-    0x5c,
-    0xcd,
-    0x70,
-    0x11,
-    0x40,
-    0x6e,
-    0xe8,
-    0xde,
-    0x80,
-    0xfb,
-    0x98,
-    0x09,
-    0x88,
-    0x80,
-    0x6b,
-    0xa5,
-    0xb7,
-    0x34,
-    0xd0,
-    0x33,
-    0x10,
-    0x59,
-    0x0e,
-    0xb0,
-    0x33,
-    0x64,
-    0xd9,
-    0xd3,
-    0x8b,
-    0x5e,
-    0x22,
-    0x90,
-    0xc8,
-    0x8a,
-    0x33,
-    0xe0,
-    0x90,
-    0x48,
-    0xfa,
-    0xc4,
-    0x71,
-    0x39,
-    0xa5,
-    0x87,
-    0x1b,
-    0xa4,
-    0x70,
-    0x44,
-    0xcc,
-    0x18,
-    0xbb,
-    0xa9,
-    0x0b,
-    0x53,
-    0x60,
-    0xfa,
-    0x99,
-    0x63,
-    0x43,
-    0x59,
-    0xa5,
-    0x0b,
-    0x2b,
-    0x44,
-    0x3f,
-    0x68,
-    0xd0,
-    0x5f,
-    0x0f,
-    0xd4,
-    0x35,
-    0x74,
-    0x47,
-    0x0b,
-    0x37,
-    0xb8,
-    0xd6,
-    0x8d,
-    0x66,
-    0x50,
-    0xdf,
-    0x43,
-    0x15,
-    0x13,
-    0x69,
-    0x64,
-    0xad,
-    0x92,
-    0x58,
-    0x9a,
-    0x47,
-    0x55,
-    0x9c,
-    0x61,
-    0x79,
-    0x68,
-    0xa8,
-    0xb0,
-    0x6f,
-    0x17,
-    0x25,
-    0xdc,
-    0x3e,
-    0xf5,
-    0xe8,
-    0xb9,
-    0x76,
-    0x23,
-    0x22,
-    0x02,
-    0xf6,
-    0xce,
-    0xd7,
-    0xfb,
-    0x05,
-    0xfa,
-    0x92,
-    0x54,
-    0x9e,
-    0x7e,
-    0x56,
-    0x51,
-    0x0a,
-    0x50,
-    0xd7,
-    0x28,
-    0xb5,
-    0x03,
-    0xea,
-    0xab,
-    0x3a,
-    0x8e,
-    0x3b,
-    0x26,
-    0xc0,
-    0x4f,
-    0x3e,
-    0x8b,
-    0x89,
-    0x50,
-    0x68,
-    0xcc,
-    0xc8,
-    0xc8,
-    0x9e,
-    0x89,
-    0xb3,
-    0xe5,
-    0xee,
-    0xeb,
-    0xda,
-    0xc8,
-    0x7d,
-    0xd0,
-    0xb7,
-    0xd2,
-    0xc0,
-    0x28,
-    0x86,
-    0x1e,
-    0xef,
-    0x9e,
-    0x57,
-    0x4e,
-    0xb7,
-    0x7c,
-    0x61,
-    0x8b,
-    0x30,
-    0xc8,
-    0x99,
-    0xc7,
-    0x0e,
-    0xb3,
-    0x83,
-    0x45,
-    0x1b,
-    0x35,
-    0x48,
-    0x5c,
-    0xe5,
-    0xf1,
-    0x0a,
-    0x78,
-    0xb3,
-    0x5e,
-    0x74,
-    0x61,
-    0xbe,
-    0x28,
-    0x95,
-    0xc0,
-    0x9e,
-    0xd4,
-    0xee,
-    0xdf,
-    0x03,
-    0xa4,
-    0xc9,
-    0xb0,
-    0xa5,
-    0xba,
-    0xcd,
-    0x11,
-    0x7e,
-    0x7f,
-    0xd0,
-    0x4e,
-    0x36,
-    0x46,
-    0xec,
-    0xe7,
-    0xdf,
-    0x2d,
-    0xd5,
-    0x94,
-    0xe2,
-    0x44,
-    0x69,
-    0x87,
-    0x39,
-    0xf2,
-    0x89,
-    0xf1,
-    0xdf,
-    0x94,
-    0x28,
-    0xc7,
-    0x85,
-    0x66,
-    0xa1,
-    0xc6,
-    0x87,
-    0xa7,
-    0x4e,
-    0xb5,
-    0x1e,
-    0xf8,
-    0x56,
-    0xea,
-    0xd7,
-    0x06,
-    0xc6,
-    0x0f,
-    0x44,
-    0x68,
-    0xe4,
-    0x26,
-    0xf1,
-    0xcb,
-    0xc0,
-    0xcb,
-    0x99,
-    0x4c,
-    0x0b,
-    0xb9,
-    0x9a,
-    0x25,
-    0x2c,
-    0x90,
-    0xa7,
-    0x8c,
-    0x91,
-    0xd6,
-    0xbd,
-    0xd8,
-    0x43,
-    0x3b,
-    0x58,
-    0xe6,
-    0xbe,
-    0x21,
-    0xe6,
-    0xbb,
-    0xff,
-    0x5b,
-    0x7c,
-    0x6a,
-    0xde,
-    0x35,
-    0xc8,
-    0x38,
-    0x9e,
-    0xb5,
-    0x47,
-    0xff,
-    0xc3,
-    0x21,
-    0xb7,
-    0xd0,
-    0x23,
-    0xc1,
-    0xd0,
-    0xdc,
-    0x40,
-    0xe6,
-    0x2f,
-    0x95,
-    0xd5,
-    0x2c,
-    0x93,
-    0x10,
-    0xaf,
-    0xfb,
-    0x4b,
-    0xae,
-    0xbe,
-    0x54,
-    0xef,
-    0xfb,
-    0x6c,
-    0xca,
-    0x4f,
-    0xd6,
-    0x2d,
-    0xce,
-    0xa9,
-    0xd3,
-    0x58,
-    0x30,
-    0x1f,
-    0xdd,
-    0x35,
-    0xe3,
-    0x67,
-    0x20,
-    0x57,
-    0x01,
-    0xc5,
-    0x26,
-    0x2c,
-    0x0e,
-    0x36,
-    0x3f,
-    0xd2,
-    0x81,
-    0xee,
-    0x27,
-    0x2c,
-    0x80,
-    0x05,
-    0xe3,
-    0x36,
-    0xec,
-    0x6e,
-    0xec,
-    0x95,
-    0x9d,
-    0x28,
-    0x8f,
-    0x73,
-    0xef,
-    0xb8,
-    0x94,
-    0x89,
-    0x7d,
-    0xd6,
-    0x1e,
-    0x7d,
-    0x2c,
-    0x67,
-    0xd2,
-    0x6f,
-    0x6c,
-    0xab,
-    0x3b,
-    0xcf,
-    0xba,
-    0xb8,
-    0x6d,
-    0x71,
-    0x69,
-    0x27,
-    0xe9,
-    0xe3,
-    0xa3,
-    0x0d,
-    0xc1,
-    0xfe,
-    0xab,
-    0x2d,
-    0xfd,
-    0xbb,
-    0x64,
-    0x6b,
-    0x3c,
-    0x48,
-    0x17,
-    0x84,
-    0x9f,
-    0x5b,
-    0x71,
-    0xfd,
-    0xe2,
-    0xc7,
-    0xcb,
-    0x59,
-    0xcc,
-    0x4d,
-    0xaf,
-    0x8f,
-    0xca,
-    0xb4,
-    0x97,
-    0xbb,
-    0xd7,
-    0x1b,
-    0xf7,
-    0x14,
-    0x9e,
-    0x8f,
-    0x7e,
-    0x1e,
-    0xe3,
-    0xd9,
-    0x99,
-    0x21,
-    0x1f,
-    0x99,
-    0x3a,
-    0xd9,
-    0x6a,
-    0x99,
-    0xd7,
-    0x6f,
-    0x9e,
-    0x5b,
-    0xb5,
-    0xa8,
-    0xba,
-    0xf4,
-    0x66,
-    0x5d,
-    0x84,
-    0x1d,
-    0x91,
-    0x2b,
-    0x73,
-    0x88,
-    0xf1,
-    0x6b,
-    0xcb,
-    0x70,
-    0xa0,
-    0x64,
-    0x0a,
-    0x74,
-    0x96,
-    0xc0,
-    0x83,
-    0xa5,
-    0x6c,
-    0x3d,
-    0x49,
-    0xde,
-    0x66,
-    0xa5,
-    0x4e,
-    0x54,
-    0xb1,
-    0x00,
-    0xcc,
-    0x6d,
-    0xe9,
-    0x08,
-    0xe4,
-    0xd6,
-    0xdf,
-    0xdd,
-    0x86,
-    0xd0,
-    0x98,
-    0xfa,
-    0x90,
-    0xca,
-    0x99,
-    0x68,
-    0x3a,
-    0x35,
-    0x61,
-    0x31,
-    0xb1,
-    0x94,
-    0x38,
-    0x18,
-    0x02,
-    0xd2,
-    0x27,
-    0x87,
-    0x3a,
-    0xd9,
-    0x48,
-    0xc9,
-    0xcb,
-    0x60,
-    0x40,
-    0x79,
-    0x32,
-    0x04,
-    0x09,
-    0x3b,
-    0xd7,
-    0x9b,
-    0xf5,
-    0xaa,
-    0x35,
-    0xc5,
-    0xef,
-    0x91,
-    0x3a,
-    0xc3,
-    0x04,
-    0x5d,
-    0xf1,
-    0x8d,
-    0x23,
-    0xd2,
-    0x5e,
-    0x1e,
-    0x21,
-    0xfe,
-    0xaa,
-    0x13,
-    0x00,
-    0x6b,
-    0x80,
-    0x74,
-    0x71,
-    0x99,
-    0xb6,
-    0xd2,
-    0x97,
-    0xab,
-    0x30,
-    0x92,
-    0x0e,
-    0x61,
-    0x01,
-    0x88,
-    0x2c,
-    0x46,
-    0xd4,
-    0xc8,
-    0x87,
-    0x2b,
-    0x8b,
-    0xb8,
-    0xb7,
-    0xd3,
-    0x25,
-    0x6a,
-    0x5d,
-    0xf0,
-    0xe5,
-    0x29,
-    0x64,
-    0x4e,
-    0xb0,
-    0x52,
-    0x86,
-    0x4f,
-    0xb8,
-    0x66,
-    0x12,
-    0x97,
-    0x57,
-    0x5c,
-    0xed,
-    0x08,
-    0x3d,
-    0x3c,
-    0xd7,
-    0xf1,
-    0xce,
-    0xe9,
-    0xf0,
-    0x82,
-    0xc6,
-    0x3e,
-    0x7b,
-    0x84,
-    0x1f,
-    0x5d,
-    0xe1,
-    0x47,
-    0x34,
-    0x44,
-    0xf9,
-    0xdb,
-    0x26,
-    0xa2,
-    0x86,
-    0x82,
-    0x7f,
-    0xe8,
-    0x02,
-    0x66,
-    0x15,
-    0xa2,
-    0x9a,
-    0x88,
-    0x32,
-    0x08,
-    0x79,
-    0xf9,
-    0xf1,
-    0xd0,
-    0x49,
-    0x4c,
-    0xeb,
-    0x47,
-    0xf7,
-    0x4b,
-    0x13,
-    0xa0,
-    0xb7,
-    0xe9,
-    0xdf,
-    0x8c,
-    0x49,
-    0x78,
-    0xa9,
-    0x0b,
-    0x7a,
-    0x1c,
-    0x54,
-    0x81,
-    0xed,
-    0x80,
-    0x32,
-    0x0c,
-    0x1b,
-    0xc7,
-    0x25,
-    0x15,
-    0x99,
-    0xc6,
-    0x05,
-    0x25,
-    0x9a,
-    0x70,
-    0x42,
-    0xfa,
-    0xb4,
-    0x91,
-    0xcb,
-    0xdb,
-    0xe7,
-    0xc0,
-    0x2e,
-    0x28,
-    0xdb,
-    0x8e,
-    0x00,
-    0x35,
-    0x69,
-    0x04,
-    0x7f,
-    0x58,
-    0x5d,
-    0x4d,
-    0x76,
-    0x41,
-    0x7a,
-    0xaf,
-    0x61,
-    0x8a,
-    0xbf,
-    0xc0,
-    0xd2,
-    0x8f,
-    0xe9,
-    0xd6,
-    0x13,
-    0x80,
-    0x39,
-    0xbf,
-    0x0d,
-    0xb5,
-    0x77,
-    0xb2,
-    0x68,
-    0x41,
-    0x37,
-    0x86,
-    0xf4,
-    0xc9,
-    0x5b,
-    0x22,
-    0x48,
-    0x97,
-    0xd9,
-    0x35,
-    0xa9,
-    0xea,
-    0xbf,
-    0x27,
-    0x2d,
-    0x90,
-    0x74,
-    0x4f,
-    0x1f,
-    0xb7,
-    0x40,
-    0x66,
-    0xa6,
-    0x01,
-    0x0e,
-    0x3b,
-    0xa2,
-    0xd6,
-    0x71,
-    0xa9,
-    0xd7,
-    0xfe,
-    0xe6,
-    0xc6,
-    0x4d,
-    0x6f,
-    0x59,
-    0x5e,
-    0xf6,
-    0x63,
-    0xea,
-    0xa0,
-    0x92,
-    0xae,
-    0xf0,
-    0x16,
-    0xd0,
-    0x4f,
-    0x3e,
-    0xdb,
-    0xb6,
-    0x45,
-    0xa6,
-    0x08,
-    0x42,
-    0xa4,
-    0xbc,
-    0x6f,
-    0x52,
-    0xe7,
-    0xdc,
-    0x8c,
-    0xc1,
-    0x88,
-    0x6f,
-    0xb8,
-    0xd3,
-    0xce,
-    0x69,
-    0xa0,
-    0xd3,
-    0xe7,
-    0x16,
-    0xf6,
-    0xfa,
-    0x36,
-    0x17,
-    0x66,
-    0x93,
-    0xee,
-    0xa8,
-    0xcc,
-    0x5d,
-    0xe0,
-    0x24,
-    0xa4,
-    0x31,
-    0x91,
-    0xca,
-    0xc1,
-    0xe4,
-    0x90,
-    0xc1,
-    0x43,
-    0x6f,
-    0x06,
-    0x5a,
-    0xc3,
-    0x4d,
-    0x8f,
-    0x96,
-    0xd0,
-    0x25,
-    0x48,
-    0xe8,
-    0x9f,
-    0xa9,
-    0x2a,
-    0x3b,
-    0xfe,
-    0xbe,
-    0x96,
-    0x37,
-    0x8a,
-    0xdd,
-    0x30,
-    0xc0,
-    0x22,
-    0xb9,
-    0xf1,
-    0xc0,
-    0x9b,
-    0x22,
-    0x78,
-    0x27,
-    0xb5,
-    0x29,
-    0xa1,
-    0x30,
-    0x4e,
-    0x85,
-    0x59,
-    0xe5,
-    0xd6,
-    0x35,
-    0xb1,
-    0xe5,
-    0x03,
-    0x67,
-    0x31,
-    0x65,
-    0xc6,
-    0x99,
-    0x6e,
-    0x75,
-    0x7d,
-    0xfe,
-    0xde,
-    0x84,
-    0x6a,
-    0x23,
-    0xec,
-    0x27,
-    0x64,
-    0xd2,
-    0x48,
-    0x16,
-    0xcc,
-    0x37,
-    0x81,
-    0x77,
-    0xc3,
-    0x41,
-    0xd5,
-    0x60,
-    0x9a,
-    0x4b,
-    0x48,
-    0x97,
-    0x8a,
-    0xfc,
-    0xf3,
-    0x9c,
-    0xa6,
-    0x6b,
-    0x9f,
-    0xe9,
-    0x0d,
-    0x87,
-    0x92,
-    0x78,
-    0x64,
-    0xb7,
-    0xa9,
-    0x86,
-    0x84,
-    0xbd,
-    0xa7,
-    0x97,
-    0x6f,
-    0xe0,
-    0xcd,
-    0xba,
-    0x89,
-    0x4a,
-    0xab,
-    0x0e,
-    0x05,
-    0xaf,
-    0x35,
-    0x85,
-    0x9d,
-    0x2f,
-    0x19,
-    0xe8,
-    0x86,
-    0x7e,
-    0x50,
-    0x1b,
-    0xa3,
-    0x42,
-    0xf3,
-    0xa3,
-    0xf9,
-    0xbc,
-    0x51,
-    0x65,
-    0x63,
-    0xab,
-    0x3e,
-    0xb0,
-    0x86,
-    0x6d,
-    0xae,
-    0x7e,
-    0x08,
-    0x68,
-    0x82,
-    0xf7,
-    0xfd,
-    0xa8,
-    0xa1,
-    0x37,
-    0xa2,
-    0xc9,
-    0x4b,
-    0x51,
-    0x4e,
-    0x18,
-    0xaa,
-    0x94,
-    0xa5,
-    0xf5,
-    0xaa,
-    0x0d,
-    0x0f,
-    0x7c,
-    0x0b,
-    0x4c,
-    0x69,
-    0x64,
-    0xb5,
-    0x6b,
-    0xfa,
-    0x26,
-    0x4b,
-    0x4d,
-    0xa8,
-    0x62,
-    0x02,
-    0x24,
-    0x6b,
-    0x7f,
-    0xb4,
-    0x36,
-    0x03,
-    0x93,
-    0x30,
-    0xe0,
-    0xe6,
-    0x82,
-    0xd5,
-    0xdb,
-    0x7d,
-    0x69,
-    0x5f,
-    0xbe,
-    0x8f,
-    0x3d,
-    0x00,
-    0xc4,
-    0xfe,
-    0xaf,
-    0xb3,
-    0xd0,
-    0xb1,
-    0x53,
-    0xcd,
-    0xae,
-    0xd1,
-    0x02,
-    0xd4,
-    0x9c,
-    0x38,
-    0x7d,
-    0x95,
-    0x09,
-    0x26,
-    0x52,
-    0x71,
-    0x9c,
-    0x36,
-    0x04,
-    0xf8,
-    0x78,
-    0x91,
-    0x66,
-    0xb9,
-    0xbf,
-    0x62,
-    0x48,
-    0x57,
-    0x54,
-    0x8a,
-    0x55,
-    0xe0,
-    0xe6,
-    0x94,
-    0x3c,
-    0x5b,
-    0x2a,
-    0xeb,
-    0x0e,
-    0xa0,
-    0x67,
-    0x4a,
-    0xe7,
-    0x6d,
-    0x38,
-    0x75,
-    0xd1,
-    0xb5,
-    0x8e,
-    0x27,
-    0xe5,
-    0x3b,
-    0xf4,
-    0x4b,
-    0xb4,
-    0x60,
-    0x17,
-    0x6e,
-    0xe5,
-    0x39,
-    0x85,
-    0x75,
-    0x1f,
-    0xe5,
-    0xb5,
-    0x8b,
-    0x29,
-    0x1e,
-    0x48,
-    0x5e,
-    0x4f,
-    0x0d,
-    0x8e,
-    0x8b,
-    0x08,
-    0x63,
-    0x4c,
-    0x56,
-    0xd7,
-    0xa5,
-    0xbc,
-    0x9f,
-    0x6f,
-    0xc7,
-    0xd6,
-    0x12,
-    0x1a,
-    0xfd,
-    0xce,
-    0x9d,
-    0x5b,
-    0xce,
-    0xde,
-    0x27,
-    0xd2,
-    0x6a,
-    0x45,
-    0x7f,
-    0x61,
-    0x3d,
-    0x90,
-    0x92,
-    0x8d,
-    0xc4,
-    0x18,
-    0xe2,
-    0x27,
-    0xa0,
-    0xcc,
-    0x33,
-    0x2b,
-    0xe9,
-    0x30,
-    0x87,
-    0xe8,
-    0xc4,
-    0xa6,
-    0x4d,
-    0x61,
-    0x38,
-    0xed,
-    0xd6,
-    0xf4,
-    0x3d,
-    0xe7,
-    0x08,
-    0x39,
-    0x16,
-    0x9f,
-    0x56,
-    0x2d,
-    0xe1,
-    0x8a,
-    0xf0,
-    0x90,
-    0x6d,
-    0x0d,
-    0x36,
-    0x8b,
-    0x4b,
-    0x40,
-    0x73,
-    0x96,
-    0x28,
-    0xf2,
-    0xc8,
-    0x99,
-    0x5a,
-    0xed,
-    0x66,
-    0x51,
-    0xb8,
-    0x7a,
-    0x00,
-    0xf6,
-    0xaf,
-    0x28,
-    0x81,
-    0x1b,
-    0x92,
-    0xca,
-    0xfa,
-    0xd5,
-    0x32,
-    0xbf,
-    0xde,
-    0x1f,
-    0xaf,
-    0x76,
-    0x71,
-    0x7d,
-    0x8d,
-    0x30,
-    0x7e,
-    0xe0,
-    0x0a,
-    0x08,
-    0x48,
-    0xca,
-    0xaf,
-    0x31,
-    0xc4,
-    0xb2,
-    0x26,
-    0x80,
-    0x05,
-    0xaa,
-    0x4b,
-    0x2a,
-    0xf8,
-    0x3f,
-    0x85,
-    0xce,
-    0x51,
-    0xa1,
-    0x57,
-    0xb6,
-    0xc5,
-    0x04,
-    0x32,
-    0x5a,
-    0x7a,
-    0x45,
-    0x8e,
-    0x25,
-    0xbc,
-    0xd1,
-    0x39,
-    0x7c,
-    0xf1,
-    0xc3,
-    0xee,
-    0xfd,
-    0xcf,
-    0x4c,
-    0x29,
-    0x04,
-    0xcc,
-    0x58,
-    0x3a,
-    0x74,
-    0xd6,
-    0x6e,
-    0x98,
-    0xb4,
-    0x45,
-    0xd8,
-    0x79,
-    0xf7,
-    0x0e,
-    0x05,
-    0x9f,
-    0xc1,
-    0x39,
-    0x2b,
-    0x75,
-    0xa7,
-    0x95,
-    0x30,
-    0x5a,
-    0x56,
-    0xaa,
-    0xcb,
-    0x3d,
-    0xd6,
-    0xef,
-    0xe7,
-    0x6a,
-    0x10,
-    0x3d,
-    0x48,
-    0xa3,
-    0x8e,
-    0x84,
-    0x70,
-    0x73,
-    0x83,
-    0xbd,
-    0xc4,
-    0xbf,
-    0x0b,
-    0x1f,
-    0xeb,
-    0x9e,
-    0xb3,
-    0x96,
-    0x77,
-    0x6b,
-    0x3c,
-    0x71,
-    0xc7,
-    0x18,
-    0x9c,
-    0x5a,
-    0x2b,
-    0xc4,
-    0x46,
-    0x8c,
-    0x4a,
-    0x90,
-    0xab,
-    0x40,
-    0xc1,
-    0xaf,
-    0x01,
-    0x68,
-    0x0d,
-    0xbd,
-    0x43,
-    0xa0,
-    0xab,
-    0x52,
-    0x79,
-    0x62,
-    0x7d,
-    0xd6,
-    0x39,
-    0x79,
-    0x70,
-    0x97,
-    0x6e,
-    0xb8,
-    0x5c,
-    0x18,
-    0x58,
-    0xeb,
-    0x2c,
-    0xad,
-    0xd4,
-    0x0e,
-    0x3e,
-    0x44,
-    0xde,
-    0xbd,
-    0x0d,
-    0x86,
-    0x54,
-    0xec,
-    0x0d,
-    0x1f,
-    0xfc,
-    0xd8,
-    0xd6,
-    0x59,
-    0xc9,
-    0x3d,
-    0x85,
-    0xf0,
-    0x5a,
-    0xca,
-    0x5f,
-    0x22,
-    0xc4,
-    0xd2,
-    0xb8,
-    0x05,
-    0x91,
-    0x44,
-    0x14,
-    0x1d,
-    0x09,
-    0xdd,
-    0x8b,
-    0x2e,
-    0xb0,
-    0x9c,
-    0x72,
-    0x4f,
-    0x0f,
-    0x77,
-    0x37,
-    0x40,
-    0xb7,
-    0x4c,
-    0x8d,
-    0xfd,
-    0x84,
-    0x1a,
-    0xc9,
-    0x93,
-    0x1f,
-    0x71,
-    0x8c,
-    0x33,
-    0xc6,
-    0x27,
-    0xa3,
-    0x85,
-    0x50,
-    0x4d,
-    0x2b,
-    0x3e,
-    0x6b,
-    0x61,
-    0xf9,
-    0xf5,
-    0x29,
-    0xc5,
-    0x39,
-    0x33,
-    0xbb,
-    0x70,
-    0x54,
-    0xc9,
-    0x7c,
-    0xe4,
-    0x18,
-    0x66,
-    0x31,
-    0x60,
-    0x13,
-    0x68,
-    0x8e,
-    0x56,
-    0x3f,
-    0xf3,
-    0xfd,
-    0x1f,
-    0xe5,
-    0x40,
-    0x9c,
-    0xee,
-    0xbb,
-    0x38,
-    0x84,
-    0x03,
-    0x4f,
-    0x42,
-    0x51,
-    0x21,
-    0xa9,
-    0x59,
-    0xdf,
-    0x41,
-    0x2c,
-    0x61,
-    0x51,
-    0x88,
-    0xbe,
-    0xbb,
-    0x58,
-    0x77,
-    0x29,
-    0x17,
-    0xb2,
-    0x62,
-    0xc0,
-    0x89,
-    0xf0,
-    0x23,
-    0x45,
-    0xe0,
-    0x7d,
-    0x0f,
-    0x0a,
-    0x33,
-    0xdc,
-    0x29,
-    0x57,
-    0xbc,
-    0x31,
-    0x96,
-    0x0c,
-    0xe9,
-    0x03,
-    0x51,
-    0x87,
-    0xb1,
-    0x40,
-    0x20,
-    0xc8,
-    0x25,
-    0x81,
-    0xc7,
-    0xd3,
-    0x47,
-    0x90,
-    0x7b,
-    0x56,
-    0x1e,
-    0x28,
-    0x99,
-    0x8c,
-    0x0a,
-    0xfb,
-    0x98,
-    0x61,
-    0x56,
-    0xf9,
-    0x3d,
-    0xd7,
-    0x0c,
-    0xd0,
-    0x0d,
-    0xa8,
-    0x0d,
-    0xaf,
-    0x08,
-    0x2d,
-    0x60,
-    0x50,
-    0x94,
-    0x7e,
-    0xcb,
-    0x35,
-    0xb8,
-    0xdb,
-    0xa0,
-    0x32,
-    0x8a,
-    0x4b,
-    0xda,
-    0x2b,
-    0xeb,
-    0x82,
-    0x68,
-    0x1f,
-    0x71,
-    0x08,
-    0xc9,
-    0x65,
-    0xa5,
-    0x98,
-    0xd9,
-    0x36,
-    0x6f,
-    0xc7,
-    0xeb,
-    0x6c,
-    0xce,
-    0xe6,
-    0x17,
-    0x89,
-    0xcc,
-    0x28,
-    0xd6,
-    0xfb,
-    0xb2,
-    0x08,
-    0xcc,
-    0x9f,
-    0x78,
-    0xe5,
-    0xe4,
-    0x83,
-    0x7f,
-    0xef,
-    0xa2,
-    0xf0,
-    0x83,
-    0x47,
-    0xb5,
-    0xa8,
-    0xcb,
-    0x62,
-    0xcc,
-    0x6c,
-    0xa2,
-    0xaf,
-    0xab,
-    0xc1,
-    0x0b,
-    0x79,
-    0x7e,
-    0xf4,
-    0xb1,
-    0x0e,
-    0x6d,
-    0x5c,
-    0x1d,
-    0x21,
-    0x70,
-    0xdf,
-    0x2b,
-    0x6d,
-    0x65,
-    0xb7,
-    0xbf,
-    0x9b,
-    0x60,
-    0x76,
-    0xb4,
-    0x66,
-    0x42,
-    0x48,
-    0x15,
-    0xfd,
-    0x8d,
-    0x79,
-    0x90,
-    0xa8,
-    0x76,
-    0x37,
-    0x27,
-    0xaf,
-    0x3c,
-    0x98,
-    0x29,
-    0x78,
-    0xb9,
-    0xdf,
-    0x61,
-    0xef,
-    0x37,
-    0xfb,
-    0x8d,
-    0x2a,
-    0x84,
-    0x50,
-    0x12,
-    0x4e,
-    0x49,
-    0xba,
-    0xed,
-    0xac,
-    0x97,
-    0xcf,
-    0xed,
-    0x30,
-    0xc3,
-    0x65,
-    0x1f,
-    0xfc,
-    0x74,
-    0x55,
-    0x8a,
-    0x50,
-    0xfa,
-    0x7e,
-    0x1d,
-    0xad,
-    0xe1,
-    0x0c,
-    0xe6,
-    0x3a,
-    0xc6,
-    0xfa,
-    0x85,
-    0x66,
-    0x6a,
-    0xd5,
-    0xdf,
-    0xcf,
-    0x05,
-    0xc3,
-    0x17,
-    0x63,
-    0xdd,
-    0xc5,
-    0xba,
-    0xc4,
-    0x16,
-    0x39,
-    0x39,
-    0xf1,
-    0xcc,
-    0xa3,
-    0x9d,
-    0x24,
-    0x5f,
-    0xac,
-    0x76,
-    0xf6,
-    0x0e,
-    0x6b,
-    0x14,
-    0xc9,
-    0xc8,
-    0xe4,
-    0xfa,
-    0x67,
-    0x3e,
-    0xce,
-    0x90,
-    0xe7,
-    0x3d,
-    0x9a,
-    0x18,
-    0xd1,
-    0x3b,
-    0xb0,
-    0xe3,
-    0x82,
-    0x30,
-    0xfc,
-    0xc5,
-    0xd1,
-    0xa7,
-    0xa9,
-    0xc6,
-    0xf2,
-    0x14,
-    0x2c,
-    0x1a,
-    0x9b,
-    0x68,
-    0x85,
-    0x54,
-    0x66,
-    0xe3,
-    0xc1,
-    0xd6,
-    0x77,
-    0x29,
-    0xc4,
-    0x8c,
-    0x5e,
-    0x99,
-    0x45,
-    0xda,
-    0x3e,
-    0xda,
-    0x1a,
-    0xd2,
-    0x2f,
-    0xb6,
-    0xb6,
-    0xab,
-    0xe2,
-    0x2c,
-    0xf0,
-    0x6e,
-    0x84,
-    0xc0,
-    0x06,
-    0xf3,
-    0xe4,
-    0x16,
-    0xe1,
-    0x0c,
-    0xd7,
-    0xbf,
-    0x9a,
-    0x00,
-    0xdc,
-    0x53,
-    0x3e,
-    0x3b,
-    0xfc,
-    0xc0,
-    0xce,
-    0x43,
-    0xf4,
-    0xe1,
-    0x8a,
-    0xee,
-    0x96,
-    0x53,
-    0x6f,
-    0xd3,
-    0x6d,
-    0x84,
-    0xff,
-    0xfe,
-    0xa0,
-    0x0c,
-    0x40,
-    0xe8,
-    0x18,
-    0x41,
-    0x07,
-    0xa6,
-    0xe5,
-    0x05,
-    0x76,
-    0x60,
-    0xde,
-    0xe3,
-    0xc4,
-    0x05,
-    0x88,
-    0x5b,
-    0x3c,
-    0x3d,
-    0x3a,
-    0x79,
-    0x89,
-    0x9f,
-    0x7e,
-    0xad,
-    0x30,
-    0x25,
-    0xb9,
-    0xd6,
-    0x5e,
-    0xdc,
-    0x0f,
-    0xa0,
-    0xe4,
-    0xe0,
-    0x81,
-    0x10,
-    0x80,
-    0x88,
-    0x58,
-    0x5d,
-    0x5e,
-    0xde,
-    0xc7,
-    0x02,
-    0xde,
-    0x52,
-    0xcc,
-    0x11,
-    0x98,
-    0xaf,
-    0x57,
-    0xca,
-    0x9e,
-    0x4d,
-    0xae,
-    0x6c,
-    0x00,
-    0x89,
-    0x10,
-    0x4b,
-    0x96,
-    0x72,
-    0x98,
-    0x23,
-    0xf9,
-    0xc5,
-    0x65,
-    0xac,
-    0xd3,
-    0x1c,
-    0xf8,
-    0x6e,
-    0x59,
-    0x62,
-    0xdd,
-    0xd7,
-    0x15,
-    0x8a,
-    0x8e,
-    0x8b,
-    0xe9,
-    0x80,
-    0x94,
-    0xfb,
-    0x51,
-    0x60,
-    0xef,
-    0x39,
-    0xe8,
-    0xe7,
-    0xb8,
-    0x0b,
-    0x2e,
-    0x27,
-    0x05,
-    0x3e,
-    0x88,
-    0x7e,
-    0x0d,
-    0x3c,
-    0x88,
-    0xc8,
-    0x8d,
-    0xe1,
-    0x6f,
-    0xd4,
-    0x6a,
-    0x8b,
-    0xf0,
-    0x15,
-    0x97,
-    0x70,
-    0x37,
-    0x9a,
-    0x39,
-    0x35,
-    0x2a,
-    0x40,
-    0x09,
-    0xbc,
-    0xef,
-    0x27,
-    0xfa,
-    0x3d,
-    0xae,
-    0x62,
-    0x1d,
-    0x98,
-    0x98,
-    0xf3,
-    0xc1,
-    0xe9,
-    0x28,
-    0xf6,
-    0xde,
-    0x5d,
-    0xa8,
-    0x1c,
-    0xb4,
-    0x45,
-    0xf8,
-    0x5b,
-    0xaf,
-    0x69,
-    0x8b,
-    0xe4,
-    0x8e,
-    0x9f,
-    0xb2,
-    0x56,
-    0xc4,
-    0x9c,
-    0x1d,
-    0x31,
-    0x1e,
-    0x09,
-    0x9e,
-    0x8d,
-    0xa7,
-    0xda,
-    0x31,
-    0x0c,
-    0xc9,
-    0xdb,
-    0x3a,
-    0x0d,
-    0xb4,
-    0x8b,
-    0x0d,
-    0x22,
-    0x04,
-    0x2e,
-    0xb3,
-    0xc5,
-    0x9d,
-    0x1e,
-    0xec,
-    0x46,
-    0xda,
-    0x62,
-    0x70,
-    0x08,
-    0xe8,
-    0x81,
-    0x7a,
-    0xed,
-    0x6c,
-    0x98,
-    0x87,
-    0x0f,
-    0x6c,
-    0xab,
-    0x5b,
-    0xb1,
-    0x6c,
-    0x39,
-    0x46,
-    0x75,
-    0xd7,
-    0x13,
-    0xa5,
-    0xcf,
-    0xa1,
-    0x6e,
-    0xab,
-    0xb9,
-    0x2b,
-    0x36,
-    0x62,
-    0xa8,
-    0x67,
-    0xa5,
-    0xec,
-    0xbf,
-    0x3c,
-    0x15,
-    0x0f,
-    0x43,
-    0x2c,
-    0x12,
-    0xf1,
-    0x50,
-    0x34,
-    0xb4,
-    0x1f,
-    0xca,
-    0xf3,
-    0x2b,
-    0xd4,
-    0x95,
-    0x0f,
-    0x9c,
-    0x79,
-    0x09
-  ],
-  const [
-    0xb8,
-    0x5e,
-    0x29,
-    0x87,
-    0x5f,
-    0x6e,
-    0x2a,
-    0x2a,
-    0xc2,
-    0xa2,
-    0xb8,
-    0x47,
-    0x53,
-    0x76,
-    0xea,
-    0xec,
-    0xfa,
-    0xff,
-    0x0f,
-    0x76,
-    0xad,
-    0x2f,
-    0xe6,
-    0xfa,
-    0x41,
-    0x55,
-    0x12,
-    0xe4,
-    0x80,
-    0xe3,
-    0xc8,
-    0xde,
-    0x7b,
-    0x74,
-    0xcb,
-    0xf4,
-    0x22,
-    0x0d,
-    0x9a,
-    0xf5,
-    0x11,
-    0xa3,
-    0xe7,
-    0x1c,
-    0xad,
-    0xde,
-    0x4c,
-    0xef,
-    0x70,
-    0x1d,
-    0x3a,
-    0x68,
-    0x81,
-    0xba,
-    0x32,
-    0x53,
-    0x88,
-    0x8f,
-    0x37,
-    0xf7,
-    0xc0,
-    0xb9,
-    0x83,
-    0xf8,
-    0x4e,
-    0x9b,
-    0x79,
-    0x7c,
-    0xd1,
-    0x26,
-    0xdb,
-    0x8d,
-    0x3a,
-    0x58,
-    0x3d,
-    0xbf,
-    0xde,
-    0x03,
-    0xb9,
-    0x12,
-    0xc9,
-    0xd0,
-    0xe5,
-    0x19,
-    0x55,
-    0x83,
-    0x02,
-    0x5c,
-    0xfc,
-    0x81,
-    0x76,
-    0xfc,
-    0x6b,
-    0x8f,
-    0x7d,
-    0x95,
-    0xd7,
-    0xdc,
-    0x1b,
-    0x68,
-    0x94,
-    0x42,
-    0x55,
-    0xba,
-    0xe4,
-    0xc9,
-    0xa0,
-    0x77,
-    0x0d,
-    0x6d,
-    0x9a,
-    0x1b,
-    0xae,
-    0x21,
-    0xf8,
-    0xd2,
-    0x52,
-    0x13,
-    0xbf,
-    0xde,
-    0x46,
-    0x32,
-    0xb8,
-    0x3a,
-    0xa8,
-    0xee,
-    0x1d,
-    0x7d,
-    0xc1,
-    0x3e,
-    0x99,
-    0x00,
-    0x95,
-    0xe8,
-    0x70,
-    0x43,
-    0xb7,
-    0xfd,
-    0xf9,
-    0x8d,
-    0x62,
-    0xa2,
-    0x55,
-    0xd3,
-    0xc6,
-    0x16,
-    0x5b,
-    0xdb,
-    0xa0,
-    0xf1,
-    0xd2,
-    0xa2,
-    0x0d,
-    0xaa,
-    0xe3,
-    0xfa,
-    0xa0,
-    0x5c,
-    0xcd,
-    0x77,
-    0xb2,
-    0xca,
-    0xdb,
-    0x8c,
-    0xf9,
-    0xa0,
-    0x94,
-    0xf2,
-    0x5d,
-    0xfc,
-    0x31,
-    0x49,
-    0x06,
-    0x2c,
-    0x54,
-    0x02,
-    0xba,
-    0xba,
-    0xf6,
-    0x7c,
-    0x66,
-    0xa5,
-    0xa1,
-    0x6d,
-    0xfa,
-    0xf2,
-    0xe0,
-    0x84,
-    0x7a,
-    0x63,
-    0xf5,
-    0x4d,
-    0x52,
-    0x87,
-    0xc9,
-    0x54,
-    0xeb,
-    0xf3,
-    0x29,
-    0x8d,
-    0x7b,
-    0xce,
-    0x2e,
-    0xf3,
-    0x21,
-    0x93,
-    0xfd,
-    0x70,
-    0x31,
-    0x12,
-    0xb1,
-    0xfd,
-    0xcd,
-    0xb8,
-    0x96,
-    0x0a,
-    0xb5,
-    0x11,
-    0x98,
-    0x20,
-    0x5f,
-    0x8b,
-    0xfb,
-    0xc5,
-    0x4b,
-    0x7d,
-    0x4c,
-    0xa0,
-    0x91,
-    0x67,
-    0x97,
-    0xdd,
-    0xbc,
-    0x7c,
-    0xda,
-    0xd3,
-    0xda,
-    0x5d,
-    0xba,
-    0xe4,
-    0xd4,
-    0x28,
-    0x75,
-    0xa5,
-    0xfc,
-    0xb1,
-    0x18,
-    0x3f,
-    0xe5,
-    0x0f,
-    0xf2,
-    0x16,
-    0x77,
-    0x5b,
-    0x48,
-    0xa8,
-    0x42,
-    0xb4,
-    0x4a,
-    0xb7,
-    0x13,
-    0x86,
-    0x46,
-    0xaa,
-    0xc5,
-    0x0c,
-    0x1c,
-    0x31,
-    0x5a,
-    0x14,
-    0xf2,
-    0x28,
-    0x4b,
-    0x03,
-    0x28,
-    0xbe,
-    0x1b,
-    0x18,
-    0x8e,
-    0xd6,
-    0x32,
-    0xf5,
-    0xd5,
-    0xad,
-    0xe9,
-    0x5b,
-    0x44,
-    0xbd,
-    0xe2,
-    0x35,
-    0xac,
-    0xe2,
-    0x9a,
-    0xd8,
-    0x9e,
-    0xbc,
-    0x41,
-    0x89,
-    0xdb,
-    0x54,
-    0xc9,
-    0x3f,
-    0x0c,
-    0x02,
-    0x3d,
-    0xab,
-    0xb4,
-    0x8e,
-    0x54,
-    0x76,
-    0x62,
-    0x95,
-    0x46,
-    0xca,
-    0x2b,
-    0x2e,
-    0xde,
-    0x13,
-    0x57,
-    0xce,
-    0xd0,
-    0x07,
-    0x5b,
-    0x69,
-    0x4e,
-    0xe4,
-    0x08,
-    0xda,
-    0xd6,
-    0xf8,
-    0x01,
-    0x85,
-    0x4e,
-    0x67,
-    0x72,
-    0x3b,
-    0x52,
-    0x29,
-    0xff,
-    0x5e,
-    0xcd,
-    0x52,
-    0xfb,
-    0x45,
-    0xc6,
-    0x96,
-    0xdb,
-    0xe1,
-    0x7d,
-    0x0c,
-    0xea,
-    0xa1,
-    0xb7,
-    0x32,
-    0x3e,
-    0x94,
-    0x56,
-    0x32,
-    0xea,
-    0xce,
-    0x2c,
-    0x63,
-    0x75,
-    0x0c,
-    0x11,
-    0x13,
-    0x8b,
-    0x9b,
-    0x33,
-    0x84,
-    0xf3,
-    0x75,
-    0xae,
-    0x34,
-    0xc1,
-    0xae,
-    0x5d,
-    0x61,
-    0xcd,
-    0x0e,
-    0xef,
-    0xcd,
-    0x63,
-    0x00,
-    0x3d,
-    0xbf,
-    0x3c,
-    0xaa,
-    0xda,
-    0x4a,
-    0xad,
-    0x5e,
-    0xec,
-    0xd1,
-    0x1f,
-    0x31,
-    0x3b,
-    0xcb,
-    0xbf,
-    0xe9,
-    0x88,
-    0xc4,
-    0x77,
-    0x1d,
-    0x20,
-    0xa4,
-    0x1c,
-    0x97,
-    0xb1,
-    0x34,
-    0xe9,
-    0xfd,
-    0x5b,
-    0xde,
-    0x2c,
-    0xb1,
-    0x0a,
-    0xb5,
-    0x3f,
-    0xf5,
-    0x04,
-    0xb5,
-    0xba,
-    0x53,
-    0xbe,
-    0x4b,
-    0xe7,
-    0x3c,
-    0xf4,
-    0x18,
-    0x76,
-    0xef,
-    0xf8,
-    0xf2,
-    0x72,
-    0x9c,
-    0x4b,
-    0x2b,
-    0x74,
-    0xc9,
-    0x6a,
-    0x16,
-    0x17,
-    0xf6,
-    0xea,
-    0xc8,
-    0xab,
-    0x7c,
-    0xc7,
-    0x1c,
-    0x2e,
-    0xbb,
-    0xfa,
-    0xfa,
-    0x78,
-    0x74,
-    0x49,
-    0xd8,
-    0xb5,
-    0x74,
-    0x63,
-    0x80,
-    0x18,
-    0x73,
-    0x2c,
-    0x14,
-    0xce,
-    0x3b,
-    0x56,
-    0x50,
-    0x31,
-    0x0d,
-    0x31,
-    0x10,
-    0x3f,
-    0x40,
-    0xc4,
-    0x12,
-    0x4a,
-    0x2b,
-    0x1c,
-    0xfc,
-    0xf0,
-    0x45,
-    0xe4,
-    0xa1,
-    0x4e,
-    0x8b,
-    0x36,
-    0x80,
-    0x71,
-    0x22,
-    0xb1,
-    0x8d,
-    0x0d,
-    0x3e,
-    0xcc,
-    0x35,
-    0x72,
-    0x42,
-    0x69,
-    0x9c,
-    0xbb,
-    0x29,
-    0xae,
-    0x29,
-    0x49,
-    0x24,
-    0x10,
-    0x44,
-    0x70,
-    0x84,
-    0xb0,
-    0x5e,
-    0x6f,
-    0xdb,
-    0xeb,
-    0x32,
-    0xa6,
-    0x5e,
-    0x2c,
-    0x4b,
-    0x03,
-    0x8e,
-    0x05,
-    0xc7,
-    0xbe,
-    0x18,
-    0x7f,
-    0x5a,
-    0x46,
-    0xf9,
-    0xae,
-    0x96,
-    0x7b,
-    0xe5,
-    0x88,
-    0x69,
-    0x1d,
-    0xea,
-    0xf7,
-    0xe7,
-    0x84,
-    0x51,
-    0x2c,
-    0x49,
-    0x92,
-    0xc5,
-    0x37,
-    0x36,
-    0xe7,
-    0xb7,
-    0xd4,
-    0x42,
-    0x53,
-    0x00,
-    0x88,
-    0xb5,
-    0x91,
-    0xc8,
-    0xed,
-    0x8d,
-    0x32,
-    0xa7,
-    0x4a,
-    0xc6,
-    0xd7,
-    0x0b,
-    0x67,
-    0xd8,
-    0xa3,
-    0xda,
-    0xa0,
-    0x82,
-    0xf0,
-    0x58,
-    0x37,
-    0xc6,
-    0x41,
-    0x4a,
-    0xef,
-    0x35,
-    0x78,
-    0x5c,
-    0xd6,
-    0x6c,
-    0x4a,
-    0xc0,
-    0x62,
-    0xdf,
-    0xef,
-    0x18,
-    0xbf,
-    0xd5,
-    0x1e,
-    0x96,
-    0x68,
-    0xb4,
-    0x38,
-    0x61,
-    0xf5,
-    0x7f,
-    0xc4,
-    0x3b,
-    0x33,
-    0x9d,
-    0x1b,
-    0x62,
-    0x7a,
-    0xdc,
-    0x64,
-    0xb3,
-    0x3b,
-    0xb5,
-    0xc3,
-    0x15,
-    0xd9,
-    0xd2,
-    0xce,
-    0x15,
-    0xba,
-    0xcd,
-    0x41,
-    0xce,
-    0x9d,
-    0x3b,
-    0xf2,
-    0x0c,
-    0x2e,
-    0xe9,
-    0x07,
-    0xb1,
-    0xd7,
-    0x65,
-    0x66,
-    0x57,
-    0xda,
-    0xc0,
-    0x6d,
-    0x36,
-    0x9d,
-    0x93,
-    0xe4,
-    0x48,
-    0x44,
-    0x40,
-    0x2f,
-    0xac,
-    0x85,
-    0x7a,
-    0xc8,
-    0x49,
-    0xb8,
-    0x08,
-    0xed,
-    0xb3,
-    0x2e,
-    0xc5,
-    0x96,
-    0x52,
-    0xc4,
-    0xec,
-    0xaa,
-    0xc1,
-    0xb8,
-    0x92,
-    0x72,
-    0x74,
-    0xbb,
-    0x74,
-    0x4e,
-    0x9e,
-    0x47,
-    0xf3,
-    0xa7,
-    0x51,
-    0x32,
-    0x5d,
-    0x24,
-    0xe7,
-    0x84,
-    0x6e,
-    0x21,
-    0xa2,
-    0x86,
-    0x17,
-    0x5d,
-    0x8f,
-    0x1b,
-    0x7d,
-    0xf2,
-    0xb0,
-    0x53,
-    0x45,
-    0x8b,
-    0x59,
-    0x3e,
-    0x0f,
-    0xd1,
-    0xdb,
-    0xfe,
-    0x40,
-    0x26,
-    0x60,
-    0x20,
-    0x05,
-    0x96,
-    0x16,
-    0x2d,
-    0x95,
-    0x0a,
-    0x90,
-    0x7b,
-    0xb6,
-    0xbf,
-    0x69,
-    0x49,
-    0x82,
-    0xf7,
-    0x2a,
-    0x0b,
-    0x6b,
-    0xef,
-    0x6d,
-    0x03,
-    0x7d,
-    0x10,
-    0x43,
-    0x11,
-    0xe3,
-    0x69,
-    0xd4,
-    0xcc,
-    0xad,
-    0x5d,
-    0x45,
-    0xd1,
-    0xd0,
-    0x99,
-    0xdf,
-    0x5c,
-    0x6e,
-    0x4a,
-    0x6d,
-    0x15,
-    0x58,
-    0x8c,
-    0xe5,
-    0x2c,
-    0xd2,
-    0x25,
-    0x4b,
-    0xa7,
-    0x96,
-    0x73,
-    0xd3,
-    0xfb,
-    0x1b,
-    0xa3,
-    0x46,
-    0xda,
-    0x16,
-    0x24,
-    0xa6,
-    0x4d,
-    0x42,
-    0x5b,
-    0x15,
-    0x02,
-    0x5c,
-    0x99,
-    0xf3,
-    0xe7,
-    0x72,
-    0x4a,
-    0x47,
-    0xf8,
-    0x5e,
-    0x6f,
-    0x60,
-    0x54,
-    0x8e,
-    0x4e,
-    0xbc,
-    0x97,
-    0x06,
-    0x67,
-    0x28,
-    0x64,
-    0xa7,
-    0xab,
-    0x29,
-    0x41,
-    0xb1,
-    0xe9,
-    0x9b,
-    0xa8,
-    0x87,
-    0x89,
-    0x98,
-    0x5a,
-    0xb2,
-    0x7c,
-    0x9b,
-    0xf7,
-    0x29,
-    0x73,
-    0xe5,
-    0xcc,
-    0xcf,
-    0x4f,
-    0x20,
-    0xec,
-    0x3e,
-    0xd9,
-    0x43,
-    0x82,
-    0xc3,
-    0xb4,
-    0xb5,
-    0x65,
-    0xa9,
-    0x90,
-    0xb5,
-    0xed,
-    0xbb,
-    0x9f,
-    0xf9,
-    0x06,
-    0x04,
-    0x4d,
-    0x95,
-    0x82,
-    0xd9,
-    0x2c,
-    0x1f,
-    0xb4,
-    0x1a,
-    0x2d,
-    0x11,
-    0x3a,
-    0xb4,
-    0x16,
-    0x6e,
-    0x1a,
-    0x6a,
-    0x30,
-    0xa9,
-    0x11,
-    0xd6,
-    0x40,
-    0xc2,
-    0x27,
-    0xaa,
-    0xb9,
-    0xb2,
-    0x87,
-    0x3c,
-    0x30,
-    0x09,
-    0x8e,
-    0x42,
-    0x10,
-    0xd6,
-    0x22,
-    0xd9,
-    0x8f,
-    0xc7,
-    0x45,
-    0xcd,
-    0xe1,
-    0x91,
-    0xe9,
-    0x14,
-    0xab,
-    0x92,
-    0x06,
-    0x9b,
-    0xba,
-    0xb5,
-    0xeb,
-    0x46,
-    0xf5,
-    0x97,
-    0xd2,
-    0x32,
-    0x90,
-    0xe8,
-    0xb6,
-    0x3d,
-    0x83,
-    0x13,
-    0x69,
-    0xc8,
-    0x3b,
-    0x21,
-    0xe1,
-    0xbb,
-    0x8f,
-    0xda,
-    0xd2,
-    0xca,
-    0xf5,
-    0x2e,
-    0x83,
-    0xf7,
-    0xf6,
-    0xd4,
-    0xda,
-    0x58,
-    0xdf,
-    0x31,
-    0xb8,
-    0x1b,
-    0xba,
-    0x7b,
-    0x8d,
-    0xc7,
-    0x7c,
-    0x1e,
-    0x23,
-    0xc4,
-    0x80,
-    0x5f,
-    0xbe,
-    0x1e,
-    0x34,
-    0x3f,
-    0x67,
-    0x86,
-    0x13,
-    0xa2,
-    0x85,
-    0x9a,
-    0xd3,
-    0xb0,
-    0xad,
-    0x66,
-    0xdf,
-    0x7c,
-    0xbb,
-    0x2a,
-    0x07,
-    0xe3,
-    0x22,
-    0x5d,
-    0x76,
-    0xb8,
-    0x80,
-    0xf3,
-    0xe5,
-    0x1e,
-    0x76,
-    0xdc,
-    0x0f,
-    0x34,
-    0xb6,
-    0xcd,
-    0x65,
-    0xf8,
-    0x5d,
-    0x42,
-    0x02,
-    0x65,
-    0x84,
-    0xc4,
-    0xe1,
-    0xdf,
-    0x11,
-    0x67,
-    0x4e,
-    0xd1,
-    0xd3,
-    0x98,
-    0x9a,
-    0x95,
-    0xcf,
-    0x15,
-    0x13,
-    0x94,
-    0xd4,
-    0x3d,
-    0x33,
-    0xae,
-    0x56,
-    0x8a,
-    0x18,
-    0xdc,
-    0x79,
-    0x5c,
-    0x34,
-    0x13,
-    0x6b,
-    0xf8,
-    0x46,
-    0x6c,
-    0xf7,
-    0xd0,
-    0x89,
-    0x83,
-    0x57,
-    0x05,
-    0x2b,
-    0x1c,
-    0x4a,
-    0x2a,
-    0x00,
-    0x0d,
-    0x67,
-    0x4b,
-    0x78,
-    0x58,
-    0xb1,
-    0x2d,
-    0xcf,
-    0x97,
-    0x6b,
-    0xd8,
-    0x83,
-    0x9d,
-    0x2e,
-    0x53,
-    0x0b,
-    0x5a,
-    0x38,
-    0xaf,
-    0xc6,
-    0xff,
-    0x07,
-    0x46,
-    0x32,
-    0x63,
-    0x27,
-    0x45,
-    0x5e,
-    0xa5,
-    0x48,
-    0x68,
-    0xa2,
-    0x14,
-    0x93,
-    0x05,
-    0x8d,
-    0x4b,
-    0x3e,
-    0x4c,
-    0x1f,
-    0xa0,
-    0x5e,
-    0xcd,
-    0x38,
-    0xc0,
-    0xfd,
-    0x3b,
-    0x51,
-    0x93,
-    0x6d,
-    0x6f,
-    0x6a,
-    0x66,
-    0xdb,
-    0xaf,
-    0x43,
-    0x48,
-    0x27,
-    0x31,
-    0xcf,
-    0xb4,
-    0xf4,
-    0xdb,
-    0xe6,
-    0x71,
-    0xfb,
-    0x4d,
-    0x3a,
-    0xb7,
-    0xa4,
-    0x21,
-    0x8c,
-    0x93,
-    0xd7,
-    0x71,
-    0x20,
-    0x8c,
-    0x0f,
-    0x9a,
-    0x6e,
-    0x87,
-    0xb1,
-    0x40,
-    0x1a,
-    0xe8,
-    0x9d,
-    0x93,
-    0x26,
-    0xfa,
-    0x02,
-    0xd0,
-    0x67,
-    0x91,
-    0x76,
-    0x0a,
-    0x35,
-    0xee,
-    0x46,
-    0x2a,
-    0x67,
-    0xe2,
-    0x0a,
-    0x35,
-    0x7f,
-    0x37,
-    0x7d,
-    0xcd,
-    0x21,
-    0x4b,
-    0x8c,
-    0xfb,
-    0xca,
-    0xfe,
-    0xad,
-    0x2b,
-    0xbe,
-    0xce,
-    0x72,
-    0x78,
-    0x42,
-    0x41,
-    0x5e,
-    0x2a,
-    0x0c,
-    0x84,
-    0xf7,
-    0x7d,
-    0xf8,
-    0x51,
-    0x1c,
-    0xa5,
-    0xfc,
-    0x15,
-    0x99,
-    0x0e,
-    0x5e,
-    0x53,
-    0xf9,
-    0xe8,
-    0x24,
-    0x43,
-    0x9c,
-    0xe3,
-    0xcd,
-    0xc0,
-    0x09,
-    0x37,
-    0x3e,
-    0x61,
-    0x84,
-    0xe8,
-    0xff,
-    0xe5,
-    0xe4,
-    0x48,
-    0xa7,
-    0xd4,
-    0x9f,
-    0xbd,
-    0x95,
-    0x63,
-    0x27,
-    0xc4,
-    0xe1,
-    0x98,
-    0x79,
-    0x36,
-    0x92,
-    0xb0,
-    0xf2,
-    0xcb,
-    0x12,
-    0xbe,
-    0x65,
-    0xdc,
-    0xdf,
-    0x94,
-    0x6c,
-    0x6d,
-    0x82,
-    0xe6,
-    0xfb,
-    0x6a,
-    0xc5,
-    0xad,
-    0x3b,
-    0x31,
-    0x21,
-    0xca,
-    0x95,
-    0x51,
-    0x76,
-    0xec,
-    0x0c,
-    0x91,
-    0xff,
-    0xb3,
-    0xd1,
-    0x35,
-    0x84,
-    0x16,
-    0x11,
-    0x7c,
-    0xd1,
-    0x02,
-    0x12,
-    0x6d,
-    0x68,
-    0x43,
-    0x7e,
-    0xd3,
-    0x73,
-    0xa8,
-    0xff,
-    0x87,
-    0xfc,
-    0x62,
-    0x0b,
-    0xed,
-    0x60,
-    0xae,
-    0x02,
-    0xc1,
-    0x01,
-    0xb4,
-    0x76,
-    0x14,
-    0x3c,
-    0xae,
-    0xc9,
-    0x91,
-    0x9b,
-    0x4c,
-    0xfe,
-    0x05,
-    0x4b,
-    0x57,
-    0xc9,
-    0x1f,
-    0xd0,
-    0x96,
-    0xe8,
-    0x74,
-    0xf7,
-    0xee,
-    0xb6,
-    0xc5,
-    0x0c,
-    0xcc,
-    0xfe,
-    0x85,
-    0x4e,
-    0xc8,
-    0x0d,
-    0x96,
-    0xa0,
-    0x82,
-    0x0b,
-    0x54,
-    0x81,
-    0xd0,
-    0x8b,
-    0xd4,
-    0x3e,
-    0x1c,
-    0x60,
-    0x6d,
-    0x66,
-    0x07,
-    0xb2,
-    0x78,
-    0x7f,
-    0x52,
-    0x52,
-    0x55,
-    0xf7,
-    0xff,
-    0x4b,
-    0xaf,
-    0x5e,
-    0xb3,
-    0xba,
-    0x00,
-    0xd2,
-    0x5f,
-    0xdf,
-    0x57,
-    0xba,
-    0x1f,
-    0x73,
-    0x59,
-    0xb7,
-    0x63,
-    0x3c,
-    0x85,
-    0xd7,
-    0x4c,
-    0xe0,
-    0xbd,
-    0x0c,
-    0x59,
-    0xf7,
-    0x02,
-    0xdd,
-    0x42,
-    0x63,
-    0x80,
-    0x5c,
-    0x24,
-    0xe4,
-    0xca,
-    0x58,
-    0xdf,
-    0xe7,
-    0x66,
-    0xd3,
-    0xbc,
-    0x9f,
-    0x8c,
-    0xb6,
-    0x54,
-    0x57,
-    0x2b,
-    0xc4,
-    0xad,
-    0x07,
-    0x2d,
-    0xcd,
-    0xa5,
-    0x25,
-    0xfc,
-    0x24,
-    0x94,
-    0xbd,
-    0x45,
-    0x53,
-    0x2d,
-    0xc4,
-    0xfc,
-    0x0c,
-    0xa5,
-    0xaa,
-    0xa0,
-    0x63,
-    0x18,
-    0x2e,
-    0xc0,
-    0x3b,
-    0x28,
-    0x76,
-    0xbe,
-    0xfe,
-    0xe7,
-    0x5f,
-    0xd3,
-    0x92,
-    0xf7,
-    0x12,
-    0x53,
-    0x88,
-    0xef,
-    0xd8,
-    0x32,
-    0x96,
-    0x01,
-    0x2f,
-    0xc8,
-    0x47,
-    0xda,
-    0x1d,
-    0xd1,
-    0xf1,
-    0xca,
-    0xc4,
-    0xb8,
-    0xe8,
-    0x25,
-    0x37,
-    0x15,
-    0xf1,
-    0xe9,
-    0x8c,
-    0x74,
-    0xf9,
-    0xa0,
-    0x32,
-    0x58,
-    0x07,
-    0x88,
-    0x85,
-    0x7f,
-    0x70,
-    0xf2,
-    0xa0,
-    0x68,
-    0x4a,
-    0xe8,
-    0x72,
-    0x13,
-    0x22,
-    0x12,
-    0x15,
-    0x08,
-    0xf2,
-    0xdb,
-    0x5a,
-    0x9a,
-    0x4d,
-    0xcf,
-    0xa9,
-    0x6d,
-    0xdd,
-    0x47,
-    0x08,
-    0x36,
-    0x0f,
-    0x49,
-    0x79,
-    0xc2,
-    0x0d,
-    0xaa,
-    0x89,
-    0x3a,
-    0xed,
-    0x75,
-    0x26,
-    0xa5,
-    0x27,
-    0x91,
-    0xb1,
-    0xae,
-    0x4d,
-    0x9d,
-    0x54,
-    0xa7,
-    0xf6,
-    0x1f,
-    0x96,
-    0xcf,
-    0xfc,
-    0xde,
-    0x2c,
-    0xd0,
-    0xe7,
-    0x8c,
-    0x12,
-    0x8c,
-    0xa8,
-    0xa8,
-    0xdb,
-    0x19,
-    0x8b,
-    0xa3,
-    0x46,
-    0x0a,
-    0x67,
-    0x42,
-    0x11,
-    0xf1,
-    0x17,
-    0x43,
-    0x12,
-    0x22,
-    0x2e,
-    0x43,
-    0x83,
-    0xb9,
-    0xe7,
-    0xdf,
-    0x9e,
-    0xde,
-    0x5b,
-    0x1a,
-    0x6a,
-    0x47,
-    0xf7,
-    0xfe,
-    0xd4,
-    0xff,
-    0x2c,
-    0x87,
-    0x01,
-    0x66,
-    0x68,
-    0xbc,
-    0xe3,
-    0x7a,
-    0x46,
-    0x1f,
-    0x0a,
-    0x54,
-    0x02,
-    0x47,
-    0xbd,
-    0xf5,
-    0x2f,
-    0xcc,
-    0x4a,
-    0x43,
-    0xac,
-    0x63,
-    0x9a,
-    0x4f,
-    0xd4,
-    0x4a,
-    0x08,
-    0xd9,
-    0xf5,
-    0xe7,
-    0x73,
-    0x16,
-    0x03,
-    0xac,
-    0x92,
-    0xb1,
-    0x8e,
-    0x3d,
-    0x88,
-    0x0f,
-    0xf2,
-    0xd5,
-    0xb9,
-    0xd7,
-    0xce,
-    0xe6,
-    0xdb,
-    0xb2,
-    0xb7,
-    0xff,
-    0x50,
-    0x4f,
-    0x2d,
-    0xf3,
-    0xb3,
-    0xab,
-    0xcd,
-    0x38,
-    0xb1,
-    0x8f,
-    0xc9,
-    0x8d,
-    0x1a,
-    0x5a,
-    0x96,
-    0xdf,
-    0x37,
-    0x00,
-    0xe4,
-    0x6e,
-    0x5f,
-    0x53,
-    0xd3,
-    0x2c,
-    0xc5,
-    0x81,
-    0x64,
-    0x65,
-    0x94,
-    0xde,
-    0x2d,
-    0xa5,
-    0x3e,
-    0xe4,
-    0x52,
-    0xd7,
-    0x10,
-    0x78,
-    0xb0,
-    0xaa,
-    0x0b,
-    0x6f,
-    0x5b,
-    0x39,
-    0xef,
-    0x51,
-    0x4b,
-    0xea,
-    0x98,
-    0x5d,
-    0x52,
-    0x96,
-    0x8d,
-    0xcd,
-    0x51,
-    0xeb,
-    0xd7,
-    0x5b,
-    0xac,
-    0x0f,
-    0x0f,
-    0x03,
-    0xfb,
-    0x86,
-    0xbb,
-    0x0b,
-    0x03,
-    0x56,
-    0xdb,
-    0x41,
-    0xe4,
-    0x69,
-    0xbe,
-    0x84,
-    0x93,
-    0x32,
-    0x1a,
-    0x85,
-    0x8b,
-    0x94,
-    0x5c,
-    0xcf,
-    0xc0,
-    0xff,
-    0x3d,
-    0x05,
-    0xd5,
-    0xdc,
-    0x96,
-    0x6b,
-    0x8e,
-    0x2b,
-    0x75,
-    0xa8,
-    0x88,
-    0x6a,
-    0x70,
-    0xcb,
-    0x28,
-    0xb9,
-    0x39,
-    0x8b,
-    0xd1,
-    0x3d,
-    0x73,
-    0xd3,
-    0x5a,
-    0xc2,
-    0xc4,
-    0x7e,
-    0xbf,
-    0xa4,
-    0x2c,
-    0x5f,
-    0x16,
-    0xef,
-    0x95,
-    0x84,
-    0xc5,
-    0xc5,
-    0xab,
-    0xbb,
-    0xf3,
-    0x00,
-    0xed,
-    0x56,
-    0x3c,
-    0x19,
-    0x04,
-    0x2c,
-    0xa9,
-    0x49,
-    0x54,
-    0xe0,
-    0xdf,
-    0xed,
-    0xd2,
-    0x66,
-    0x96,
-    0x2f,
-    0x15,
-    0xc2,
-    0x4d,
-    0xe3,
-    0xaf,
-    0x13,
-    0x3c,
-    0xaf,
-    0xbd,
-    0xd1,
-    0x8b,
-    0x6f,
-    0xbd,
-    0x53,
-    0xc1,
-    0xd7,
-    0xa0,
-    0x94,
-    0x7f,
-    0x5a,
-    0x20,
-    0x36,
-    0x6e,
-    0x4b,
-    0x54,
-    0xc7,
-    0x76,
-    0x43,
-    0x82,
-    0x44,
-    0x31,
-    0xc2,
-    0x34,
-    0xdb,
-    0x9f,
-    0x19,
-    0x8e,
-    0xf5,
-    0x1b,
-    0x87,
-    0xde,
-    0x74,
-    0x8d,
-    0xa2,
-    0x75,
-    0x39,
-    0xe2,
-    0xf8,
-    0xb6,
-    0xea,
-    0xb9,
-    0xf7,
-    0x6c,
-    0xf2,
-    0x5f,
-    0x0a,
-    0x61,
-    0xc9,
-    0xfe,
-    0x05,
-    0x2c,
-    0x75,
-    0x11,
-    0xc3,
-    0x4a,
-    0x51,
-    0x1b,
-    0x0d,
-    0x70,
-    0x0d,
-    0x99,
-    0xbe,
-    0x20,
-    0xf6,
-    0x35,
-    0x25,
-    0x7b,
-    0x77,
-    0x3c,
-    0xab,
-    0x56,
-    0xe0,
-    0x52,
-    0xb6,
-    0x8f,
-    0x67,
-    0x65,
-    0xcd,
-    0xa1,
-    0x6d,
-    0xdf,
-    0xfc,
-    0x77,
-    0x02,
-    0x20,
-    0x7a,
-    0x7e,
-    0xaa,
-    0x2b,
-    0x89,
-    0xfe,
-    0x61,
-    0x9f,
-    0x9e,
-    0xaa,
-    0xde,
-    0xea,
-    0xc2,
-    0x76,
-    0x15,
-    0xb9,
-    0x38,
-    0xa8,
-    0xff,
-    0xb2,
-    0x60,
-    0x32,
-    0x9d,
-    0x66,
-    0xdb,
-    0x3f,
-    0x3b,
-    0x81,
-    0xf0,
-    0x0c,
-    0xf2,
-    0x44,
-    0x2e,
-    0xf9,
-    0x70,
-    0x36,
-    0x53,
-    0xe0,
-    0xfc,
-    0x16,
-    0x6d,
-    0xa5,
-    0xb4,
-    0x13,
-    0x3f,
-    0x0e,
-    0x19,
-    0x40,
-    0xe6,
-    0xd5,
-    0xce,
-    0x42,
-    0xbd,
-    0xfc,
-    0x9d,
-    0x4b,
-    0x7d,
-    0x61,
-    0xbb,
-    0x4d,
-    0xa9,
-    0x92,
-    0x4d,
-    0x67,
-    0x29,
-    0xe2,
-    0x2a,
-    0xa4,
-    0x34,
-    0xbd,
-    0xe3,
-    0xe4,
-    0x74,
-    0x38,
-    0x01,
-    0x1a,
-    0x65,
-    0xec,
-    0x8d,
-    0xb8,
-    0xff,
-    0x05,
-    0xd6,
-    0x68,
-    0x94,
-    0x96,
-    0x6e,
-    0xfd,
-    0xfb,
-    0x30,
-    0x76,
-    0xa9,
-    0xee,
-    0xb2,
-    0x1b,
-    0x70,
-    0xb1,
-    0x62,
-    0x61,
-    0xdc,
-    0xf4,
-    0x3d,
-    0x20,
-    0xf3,
-    0xfb,
-    0x8c,
-    0x4b,
-    0x66,
-    0xfc,
-    0xb8,
-    0x78,
-    0x0b,
-    0xc9,
-    0x5f,
-    0x9d,
-    0x8d,
-    0xae,
-    0xa7,
-    0x18,
-    0x63,
-    0x9d,
-    0xd3,
-    0xf3,
-    0xfe,
-    0x88,
-    0x14,
-    0x65,
-    0x47,
-    0x0f,
-    0xa1,
-    0x9c,
-    0x48,
-    0x5b,
-    0x09,
-    0xb9,
-    0x29,
-    0x4a,
-    0xc8,
-    0x1d,
-    0x5f,
-    0xcc,
-    0x19,
-    0xe3,
-    0x20,
-    0x8d,
-    0x0c,
-    0xad,
-    0x1a,
-    0xd4,
-    0xd8,
-    0xa4,
-    0x64,
-    0xab,
-    0x72,
-    0xba,
-    0xb5,
-    0x40,
-    0x5f,
-    0x33,
-    0xd4,
-    0x8b,
-    0xc6,
-    0x63,
-    0x4f,
-    0x31,
-    0xc9,
-    0xb9,
-    0x70,
-    0xa8,
-    0x15,
-    0xfc,
-    0x6d,
-    0x9c,
-    0xb8,
-    0xd5,
-    0xdf,
-    0x92,
-    0x34,
-    0x8e,
-    0x75,
-    0xcc,
-    0xd1,
-    0x19,
-    0xea,
-    0x6c,
-    0x37,
-    0x54,
-    0x34,
-    0xdc,
-    0x3b,
-    0x8b,
-    0xff,
-    0x6c,
-    0xfa,
-    0x3e,
-    0x59,
-    0x3d,
-    0x24,
-    0x25,
-    0xaf,
-    0x5f,
-    0x9b,
-    0x72,
-    0xf8,
-    0x36,
-    0x3d,
-    0x56,
-    0x30,
-    0x22,
-    0xfd,
-    0xc6,
-    0x08,
-    0x5e,
-    0x39,
-    0x7f,
-    0xdc,
-    0x29,
-    0x48,
-    0x48,
-    0xe5,
-    0x24,
-    0x52,
-    0x77,
-    0xb0,
-    0xfc,
-    0x64,
-    0xb6,
-    0xce,
-    0x48,
-    0xc3,
-    0x07,
-    0xce,
-    0xb5,
-    0x81,
-    0x06,
-    0x68,
-    0x60,
-    0x4f,
-    0x6e,
-    0xfb,
-    0x83,
-    0x92,
-    0xdf,
-    0x3a,
-    0x54,
-    0xb9,
-    0xdf,
-    0x21,
-    0x2a,
-    0xcd,
-    0x1e,
-    0x2f,
-    0xe2,
-    0x49,
-    0xfe,
-    0xcf,
-    0x81,
-    0x2d,
-    0x52,
-    0x17,
-    0x1a,
-    0x4e,
-    0x66,
-    0xb4,
-    0xf3,
-    0xf0,
-    0x41,
-    0x25,
-    0xe3,
-    0x96,
-    0x26,
-    0x28,
-    0xfe,
-    0x19,
-    0x61,
-    0x72,
-    0x75,
-    0xf8,
-    0x40,
-    0xa3,
-    0xb7,
-    0xef,
-    0x5f,
-    0x79,
-    0xdc,
-    0xcb,
-    0x28,
-    0x44,
-    0x44,
-    0x7c,
-    0x9b,
-    0x9a,
-    0x7b,
-    0x6c,
-    0x4b,
-    0x4b,
-    0x60,
-    0x0f,
-    0xa9,
-    0x97,
-    0x87,
-    0xbc,
-    0x85,
-    0x9f,
-    0xdb,
-    0xbb,
-    0xd2,
-    0x1a,
-    0x88,
-    0x9f,
-    0xaa,
-    0x49,
-    0x18,
-    0xd5,
-    0x92,
-    0x2d,
-    0xdb,
-    0x7e,
-    0xfe,
-    0xf7,
-    0x8d,
-    0x7a,
-    0x18,
-    0xc0,
-    0x33,
-    0xc5,
-    0xbd,
-    0x7a,
-    0x46,
-    0x07,
-    0xc8,
-    0x27,
-    0x13,
-    0x66,
-    0x94,
-    0x49,
-    0x62,
-    0x9f,
-    0xbc,
-    0x99,
-    0x56,
-    0x55,
-    0x25,
-    0xfb,
-    0x94,
-    0xa9,
-    0x3f,
-    0xb2,
-    0xa7,
-    0x0a,
-    0x87,
-    0xd0,
-    0xa4,
-    0x4e,
-    0x51,
-    0xf1,
-    0x09,
-    0x02,
-    0xc4,
-    0x29,
-    0xeb,
-    0xff,
-    0x26,
-    0x3b,
-    0x51,
-    0x3e,
-    0x5a,
-    0x0c,
-    0xdb,
-    0xee,
-    0xa6,
-    0x57,
-    0xa7,
-    0xc3,
-    0xba,
-    0xa1,
-    0x74,
-    0x90,
-    0xee,
-    0x70,
-    0x08,
-    0x18,
-    0xcc,
-    0xb8,
-    0xd0,
-    0x22,
-    0xce,
-    0x96,
-    0xc7,
-    0xcb,
-    0x68,
-    0x40,
-    0x98,
-    0x20,
-    0x49,
-    0x3d,
-    0x07,
-    0xec,
-    0xdf,
-    0xd1,
-    0x8d,
-    0xcf,
-    0x19,
-    0xbc,
-    0x42,
-    0x90,
-    0x70,
-    0x24,
-    0x01,
-    0xb4,
-    0x28,
-    0xcf,
-    0xc6,
-    0x50,
-    0xd3,
-    0x95,
-    0x5a,
-    0x1b,
-    0x18,
-    0x15,
-    0x33,
-    0xc7,
-    0xb2,
-    0xa8,
-    0x95,
-    0x92,
-    0xbb,
-    0x93,
-    0xfe,
-    0x18,
-    0x2b,
-    0x81,
-    0xc1,
-    0x6b,
-    0x9c,
-    0x30,
-    0xf1,
-    0x65,
-    0x50,
-    0x6a,
-    0x80,
-    0x3d,
-    0x74,
-    0x37,
-    0xa8,
-    0x59,
-    0xa6,
-    0x51,
-    0x8a,
-    0x63,
-    0xb6,
-    0xd8,
-    0x16,
-    0x9f,
-    0xa9,
-    0x47,
-    0x2a,
-    0x7c,
-    0x04,
-    0xa7,
-    0xfe,
-    0x69,
-    0x47,
-    0x02,
-    0xbf,
-    0xe9,
-    0xb7,
-    0x1b,
-    0x7a,
-    0xea,
-    0x60,
-    0x5c,
-    0x3c,
-    0x53,
-    0x5b,
-    0x10,
-    0x78,
-    0xdc,
-    0x4d,
-    0xd2,
-    0xa8,
-    0x22,
-    0x30,
-    0x45,
-    0x37,
-    0xfb,
-    0x56,
-    0x06,
-    0x9f,
-    0x06,
-    0xaa,
-    0xdf,
-    0xcf,
-    0x87,
-    0x3a,
-    0x3e,
-    0xcf,
-    0x72,
-    0xf2,
-    0xe5,
-    0xa6,
-    0xc6,
-    0xaa,
-    0xe2,
-    0x7c,
-    0x1c,
-    0x64,
-    0xc2,
-    0xfc,
-    0x80,
-    0xce,
-    0x02,
-    0xfc,
-    0x7f,
-    0x0f,
-    0xc6,
-    0x60,
-    0x81,
-    0xbf,
-    0xcd,
-    0x3b,
-    0x5a,
-    0x37,
-    0xa5,
-    0x38,
-    0x1b,
-    0x0c,
-    0x1b,
-    0x39,
-    0x2e,
-    0xd6,
-    0xf6,
-    0x3d,
-    0xa2,
-    0x36,
-    0xe5,
-    0x87,
-    0xc3,
-    0x17,
-    0xb5,
-    0xfd,
-    0xee,
-    0x33,
-    0xc7,
-    0xce,
-    0xa3,
-    0xd9,
-    0xc2,
-    0x57,
-    0xdc,
-    0xee,
-    0x85,
-    0x48,
-    0x9d,
-    0x33,
-    0x60,
-    0x02,
-    0xcd,
-    0xc5,
-    0x83,
-    0x44,
-    0x44,
-    0xea,
-    0xb6,
-    0x07,
-    0x25,
-    0x0a,
-    0x4b,
-    0xa6,
-    0x6e,
-    0xfc,
-    0x51,
-    0x42,
-    0xcd,
-    0x84,
-    0x0b,
-    0x65,
-    0xb6,
-    0x19,
-    0xa1,
-    0xe5,
-    0xb2,
-    0xeb,
-    0x14,
-    0x0c,
-    0xfa,
-    0x24,
-    0x77,
-    0xf5,
-    0x44,
-    0x6e,
-    0x5d,
-    0x39,
-    0xdd,
-    0xb6,
-    0x8e,
-    0xcc,
-    0xf8,
-    0x30,
-    0xfe,
-    0x21,
-    0x46,
-    0x9c,
-    0xff,
-    0x95,
-    0xc6,
-    0xc7,
-    0xb5,
-    0x0a,
-    0xdf,
-    0x54,
-    0xca,
-    0xd2,
-    0xac,
-    0xbc,
-    0x64,
-    0xd0,
-    0x97,
-    0x94,
-    0x54,
-    0xd9,
-    0x29,
-    0x0f,
-    0x91,
-    0x60,
-    0x20,
-    0xc3,
-    0xe4,
-    0x53,
-    0xc2,
-    0xb0,
-    0xe4,
-    0x40,
-    0x72,
-    0x7e,
-    0x25,
-    0xbc,
-    0x81,
-    0x06,
-    0xad,
-    0x05,
-    0x46,
-    0x14,
-    0xa7,
-    0xe6,
-    0x71,
-    0x6b,
-    0x5c,
-    0xdb,
-    0x9c,
-    0x0a,
-    0x5e,
-    0x76,
-    0x23,
-    0xae,
-    0x06,
-    0x01,
-    0x36,
-    0x98,
-    0x21,
-    0x65,
-    0x2c,
-    0x90,
-    0xe7,
-    0x4b,
-    0x1a,
-    0x2a,
-    0x2d,
-    0x80,
-    0xa5,
-    0x48,
-    0xdb,
-    0x9e,
-    0x14,
-    0xe0,
-    0x9f,
-    0xe9,
-    0xaa,
-    0x00,
-    0xe3,
-    0x77,
-    0x32,
-    0x0f,
-    0xfd,
-    0x94,
-    0xdb,
-    0x55,
-    0xa6,
-    0x64,
-    0x46,
-    0xbe,
-    0xae,
-    0xca,
-    0xde,
-    0xda,
-    0xee,
-    0x89,
-    0x68,
-    0x29,
-    0x7d,
-    0xa9,
-    0xda,
-    0x96,
-    0x27,
-    0x1d,
-    0x71,
-    0x41,
-    0x1a,
-    0xa2,
-    0xfe,
-    0x81,
-    0xe3,
-    0xea,
-    0x81,
-    0x2a,
-    0x99,
-    0xfa,
-    0xf8,
-    0x0b,
-    0x58,
-    0xd1,
-    0x79,
-    0xbb,
-    0xf1,
-    0x4a,
-    0x7f,
-    0x96,
-    0xe0,
-    0x43,
-    0x82,
-    0x02,
-    0x7f,
-    0xff,
-    0xca,
-    0xf7,
-    0x79,
-    0xc9,
-    0x84,
-    0xbe,
-    0x80,
-    0xda,
-    0x16,
-    0xf8,
-    0x43,
-    0x7d,
-    0xb0,
-    0xe3,
-    0x9a,
-    0x71,
-    0x23,
-    0xd9,
-    0x04,
-    0x8f,
-    0xf7,
-    0x19,
-    0x54,
-    0xac,
-    0xb7,
-    0xca,
-    0xa7,
-    0xc1,
-    0x90,
-    0x3d,
-    0x99,
-    0x4a,
-    0x1b,
-    0x73,
-    0xb9,
-    0xeb,
-    0x76,
-    0xdf,
-    0x3a,
-    0x59,
-    0x99,
-    0x6c,
-    0xeb,
-    0x78,
-    0xe7,
-    0xc2,
-    0x69,
-    0xc1,
-    0x04,
-    0xc5,
-    0x92,
-    0xe7,
-    0xe7,
-    0x5f,
-    0x3e,
-    0xba,
-    0x30,
-    0x80,
-    0x2a,
-    0x4b,
-    0xbb,
-    0x63,
-    0x35,
-    0x51,
-    0x75,
-    0x12,
-    0xcf,
-    0xcb,
-    0x6e,
-    0x2c,
-    0xae,
-    0xe7,
-    0x30,
-    0xe6,
-    0xc2,
-    0x23,
-    0x50,
-    0x50,
-    0x6c,
-    0xb2,
-    0x42,
-    0xda,
-    0xeb,
-    0x21,
-    0x71,
-    0x16,
-    0x17,
-    0x3a,
-    0x8f,
-    0xbf,
-    0x51,
-    0x29,
-    0x2a,
-    0xfb,
-    0xba,
-    0xdd,
-    0x81,
-    0xdd,
-    0xa3,
-    0xb1,
-    0x95,
-    0x2e,
-    0x45,
-    0x4c,
-    0x83,
-    0x6d,
-    0xb2,
-    0xc5,
-    0x10,
-    0x14,
-    0x0c,
-    0x0b,
-    0x86,
-    0x1d,
-    0xf5,
-    0x85,
-    0xbf,
-    0xc5,
-    0x46,
-    0xf5,
-    0x7f,
-    0x90,
-    0x04,
-    0xa2,
-    0x07,
-    0x8d,
-    0x90,
-    0xb6,
-    0xe6,
-    0xdb,
-    0x1d,
-    0xe5,
-    0x13,
-    0x6c,
-    0x67,
-    0x4f,
-    0x39,
-    0x09,
-    0xa3,
-    0xa8,
-    0x52,
-    0x96,
-    0xb1,
-    0x96,
-    0x77,
-    0x98,
-    0x99,
-    0x5a,
-    0xf6,
-    0xf4,
-    0x35,
-    0xb3,
-    0xa6,
-    0xf9,
-    0x2b,
-    0xff,
-    0x77,
-    0xa1,
-    0x1f,
-    0xa4,
-    0x4d,
-    0x14,
-    0x26,
-    0xae,
-    0x0f,
-    0x6e,
-    0x7d,
-    0xba,
-    0xfa,
-    0xc2,
-    0x7b,
-    0x12,
-    0x3c,
-    0x5f,
-    0xc4,
-    0x19,
-    0xbe,
-    0x52,
-    0xc0,
-    0xea,
-    0x41,
-    0x2c,
-    0x4b,
-    0x3c,
-    0xac,
-    0x05,
-    0xae,
-    0x89,
-    0xa4,
-    0xc0,
-    0xce,
-    0x6f,
-    0x5e,
-    0x91,
-    0xa4,
-    0x56,
-    0xb1,
-    0xbd,
-    0xed,
-    0x53,
-    0x70,
-    0xa1,
-    0x23,
-    0x4c,
-    0xf6,
-    0xf6,
-    0xab,
-    0x5d,
-    0x02,
-    0x53,
-    0x50,
-    0x7b,
-    0xc6,
-    0xf3,
-    0xf0,
-    0x57,
-    0x3a,
-    0xb9,
-    0x75,
-    0x85,
-    0xb6,
-    0x71,
-    0x07,
-    0xde,
-    0xc0,
-    0x59,
-    0x81,
-    0x23,
-    0x23,
-    0xe0,
-    0x21,
-    0xe3,
-    0x41,
-    0xad,
-    0x83,
-    0x9e,
-    0xa9,
-    0xe3,
-    0xd0,
-    0x2a,
-    0xec,
-    0xa4,
-    0x33,
-    0x56,
-    0xad,
-    0xd4,
-    0x8c,
-    0xce,
-    0xf8,
-    0x1f,
-    0x69,
-    0x3e,
-    0xd5,
-    0x3d,
-    0x32,
-    0xba,
-    0x1c,
-    0x74,
-    0xa3,
-    0x5e,
-    0x8a,
-    0x5f,
-    0x7f,
-    0x31,
-    0x15,
-    0xef,
-    0x83,
-    0x4f,
-    0x7d,
-    0xaf,
-    0x99,
-    0x48,
-    0x24,
-    0x4c,
-    0x4f,
-    0xc3,
-    0x1f,
-    0x54,
-    0x87,
-    0x67,
-    0x8d,
-    0x3e,
-    0x70,
-    0xfb,
-    0x27,
-    0xab,
-    0xb5,
-    0xcb,
-    0x19,
-    0xeb,
-    0xf4,
-    0x4e,
-    0x11,
-    0xc3,
-    0x71,
-    0x07,
-    0x95,
-    0x6d,
-    0x0c,
-    0xa9,
-    0x99,
-    0xe1,
-    0x70,
-    0x7e,
-    0x51,
-    0x53,
-    0x8e,
-    0x09,
-    0x44,
-    0xfd,
-    0x4a,
-    0xeb,
-    0xa2,
-    0x1e,
-    0x73,
-    0x03,
-    0xd7,
-    0x43,
-    0xf9,
-    0xd9,
-    0x60,
-    0xc5,
-    0x5a,
-    0x3d,
-    0xdd,
-    0x93,
-    0x5e,
-    0x2b,
-    0x68,
-    0x31,
-    0x04,
-    0xf2,
-    0x26,
-    0x01,
-    0xbc,
-    0x95,
-    0x1b,
-    0xc2,
-    0xd6,
-    0x72,
-    0x43,
-    0x56,
-    0x3b,
-    0x21,
-    0xde,
-    0xc8,
-    0x5b,
-    0x9f,
-    0x0b,
-    0x8d,
-    0x66,
-    0xac,
-    0x98,
-    0x0a,
-    0xbf,
-    0x71,
-    0x19,
-    0x57,
-    0xae,
-    0x66,
-    0x37,
-    0x43,
-    0x55,
-    0x73,
-    0x4b,
-    0x98,
-    0xe5,
-    0x56,
-    0x2c,
-    0xa0,
-    0x11,
-    0x44,
-    0x44,
-    0xe7,
-    0xc3,
-    0xd3,
-    0xea,
-    0x43,
-    0x0e,
-    0x17,
-    0xec,
-    0x12,
-    0x65,
-    0x0b,
-    0x6a,
-    0xc3,
-    0x0a,
-    0x33,
-    0xeb,
-    0x98,
-    0xc8,
-    0x80,
-    0xaa,
-    0xa9,
-    0xe5,
-    0x74,
-    0x31,
-    0x2d,
-    0x53,
-    0x86,
-    0x29,
-    0xf5,
-    0x26,
-    0xc8,
-    0x71,
-    0x39,
-    0x4b,
-    0xc7,
-    0x6d,
-    0x97,
-    0x76,
-    0xb3,
-    0xa1,
-    0x59,
-    0x5c,
-    0xc0,
-    0x7e,
-    0xf7,
-    0x23,
-    0xcb,
-    0x7b,
-    0xdc,
-    0x16,
-    0x41,
-    0x68,
-    0x6d,
-    0x9e,
-    0x3d,
-    0xff,
-    0x48,
-    0x6d,
-    0xf0,
-    0xbd,
-    0xc9,
-    0xfd,
-    0x46,
-    0xf0,
-    0xd3,
-    0x39,
-    0xc6,
-    0x10,
-    0xcd,
-    0x7a,
-    0xbb,
-    0x52,
-    0xea,
-    0xb4,
-    0x91,
-    0x7b,
-    0xae,
-    0xf2,
-    0x81,
-    0xf2,
-    0xae,
-    0xff,
-    0x71,
-    0x1a,
-    0x97,
-    0x66,
-    0x15,
-    0xde,
-    0x71,
-    0x9d,
-    0x5b,
-    0x8e,
-    0x25,
-    0x7e,
-    0x06,
-    0xe9,
-    0x3d,
-    0xf6,
-    0x98,
-    0x7b,
-    0xec,
-    0x01,
-    0x76,
-    0x29,
-    0x4e,
-    0xd6,
-    0x47,
-    0x0a,
-    0xf0,
-    0x5e,
-    0x9d,
-    0x78,
-    0x93,
-    0xeb,
-    0xd7,
-    0x67,
-    0x2d,
-    0x27,
-    0x46,
-    0xf6,
-    0x31,
-    0x4b,
-    0x8e,
-    0x44,
-    0x10,
-    0x91,
-    0x4f,
-    0x85,
-    0x00,
-    0xeb,
-    0x05,
-    0x55,
-    0xfc,
-    0xf5,
-    0x2d,
-    0x4b,
-    0x0c,
-    0x28,
-    0xaa,
-    0xd2,
-    0xc6,
-    0x51,
-    0x66,
-    0x34,
-    0x15,
-    0x42,
-    0x3c,
-    0xf8,
-    0x39,
-    0xc8,
-    0x16,
-    0x6e,
-    0x0f,
-    0xdd,
-    0x52,
-    0x88,
-    0x93,
-    0x1e,
-    0x6b,
-    0xeb,
-    0xa3,
-    0x7f,
-    0xd5,
-    0x46,
-    0x06,
-    0x3d,
-    0x28,
-    0xe3,
-    0xac,
-    0x14,
-    0x81,
-    0x7c,
-    0x37,
-    0xb3,
-    0x25,
-    0x4f,
-    0xbb,
-    0x6d,
-    0x68,
-    0x74,
-    0xc2,
-    0x31,
-    0xce,
-    0x6f,
-    0x94,
-    0xbc,
-    0x6f,
-    0x02,
-    0xb5,
-    0x0d,
-    0xa0,
-    0x45,
-    0xae,
-    0x19,
-    0xcf,
-    0xf8,
-    0x10,
-    0xc1,
-    0xaf,
-    0x17,
-    0xb7,
-    0x01,
-    0x96,
-    0xaf,
-    0x4c,
-    0x6a,
-    0x23,
-    0xf1,
-    0x0d,
-    0xd2,
-    0x23,
-    0x84,
-    0xd1,
-    0x4a,
-    0xb5,
-    0x20,
-    0x46,
-    0x50,
-    0xad,
-    0x59,
-    0x7e,
-    0x46,
-    0x37,
-    0xb8,
-    0xaa,
-    0x23,
-    0xbd,
-    0x10,
-    0x25,
-    0x69,
-    0x0a,
-    0x0f,
-    0xb4,
-    0x57,
-    0xaf,
-    0x14,
-    0x0c,
-    0x5f,
-    0xa5,
-    0x40,
-    0x94,
-    0xda,
-    0x35,
-    0xd0,
-    0x6d,
-    0xfb,
-    0x15,
-    0xaa,
-    0xb0,
-    0x01,
-    0xd4,
-    0x35,
-    0xf6,
-    0xb1,
-    0x77,
-    0x6e,
-    0x1e,
-    0x04,
-    0x65,
-    0x39,
-    0x4a,
-    0x1d,
-    0x80,
-    0xf4,
-    0x2b,
-    0x7d,
-    0x95,
-    0x52,
-    0x7f,
-    0x7a,
-    0xf6,
-    0x67,
-    0xd7,
-    0xed,
-    0x65,
-    0xff,
-    0x9e,
-    0x2c,
-    0x34,
-    0x34,
-    0x57,
-    0x38,
-    0xab,
-    0x40,
-    0x26,
-    0x37,
-    0xaa,
-    0x8f,
-    0x92,
-    0x24,
-    0x8f,
-    0x19,
-    0x89,
-    0xc5,
-    0x5a,
-    0xee,
-    0xa4,
-    0xdd,
-    0x10,
-    0x12,
-    0xad,
-    0xa4,
-    0x5d,
-    0x8c,
-    0x5f,
-    0x74,
-    0x7c,
-    0xba,
-    0x6c,
-    0xc5,
-    0x5c,
-    0xe7,
-    0xc5,
-    0x5b,
-    0xfb,
-    0x1f,
-    0x15,
-    0xbe,
-    0x16,
-    0x42,
-    0x8e,
-    0xeb,
-    0x05,
-    0x58,
-    0xe9,
-    0x49,
-    0xe1,
-    0x24,
-    0xa8,
-    0xde,
-    0xe7,
-    0xfc,
-    0x9f,
-    0xc3,
-    0x21,
-    0xd8,
-    0xb2,
-    0xd5,
-    0x43,
-    0xa8,
-    0xe0,
-    0xae,
-    0xd3,
-    0xeb,
-    0x81,
-    0xd4,
-    0x8c,
-    0x7d,
-    0xcb,
-    0x2f,
-    0x05,
-    0xb0,
-    0x9b,
-    0xc1,
-    0x8e,
-    0x9f,
-    0x73,
-    0x91,
-    0x5a,
-    0xbf,
-    0xbe,
-    0xe8,
-    0xe4,
-    0xb7,
-    0x5c,
-    0xc0,
-    0x8b,
-    0x72,
-    0x5a,
-    0x7a,
-    0x7f,
-    0x72,
-    0x01,
-    0xcf,
-    0xe1,
-    0x67,
-    0x13,
-    0x09,
-    0x26,
-    0x00,
-    0x51,
-    0x73,
-    0xbd,
-    0x01,
-    0x40,
-    0x0e,
-    0xf1,
-    0x96,
-    0x2d,
-    0x85,
-    0x10,
-    0xe6,
-    0x6f,
-    0x63,
-    0xcd,
-    0xec,
-    0xec,
-    0x84,
-    0xe3,
-    0x82,
-    0xdf,
-    0xc9,
-    0xfb,
-    0xbf,
-    0xd8,
-    0x10,
-    0xd0,
-    0x83,
-    0x04,
-    0x64,
-    0x91,
-    0x50,
-    0xae,
-    0x70,
-    0x87,
-    0x5c,
-    0x06,
-    0x3a,
-    0xf7,
-    0xe4,
-    0x21,
-    0x0e,
-    0x4a,
-    0xc2,
-    0x42,
-    0xb7,
-    0x6b,
-    0x42,
-    0x58,
-    0xf6,
-    0x71,
-    0x32,
-    0xc7,
-    0x2c,
-    0x7e,
-    0x38,
-    0x6b,
-    0x5a,
-    0xe6,
-    0x69,
-    0xda,
-    0x4b,
-    0x94,
-    0x16,
-    0xea,
-    0x10,
-    0xaa,
-    0xe9,
-    0x74,
-    0xad,
-    0x68,
-    0x31,
-    0x57,
-    0x12,
-    0x4f,
-    0x7b,
-    0xbf,
-    0x4d,
-    0x86,
-    0x62,
-    0xa7,
-    0xfd,
-    0x7c,
-    0xa8,
-    0x9c,
-    0x0a,
-    0xcf,
-    0x85,
-    0xc4,
-    0x93,
-    0x6d,
-    0x3e,
-    0x20,
-    0x28,
-    0xf9,
-    0xfa,
-    0x0e,
-    0x3a,
-    0x70,
-    0xd2,
-    0x12,
-    0xcf,
-    0x0c,
-    0x27,
-    0xd5,
-    0x7a,
-    0x68,
-    0x38,
-    0x6e,
-    0x8b,
-    0xe6,
-    0xf3,
-    0xe1,
-    0x83,
-    0x4e,
-    0x0c,
-    0xe5,
-    0xcb,
-    0xb7,
-    0x4d,
-    0xeb,
-    0xa5,
-    0xab,
-    0x2d,
-    0x5b,
-    0x62,
-    0x86,
-    0xa3,
-    0x21,
-    0xd6,
-    0x1f,
-    0x3c,
-    0x68,
-    0x09,
-    0xaa,
-    0x6c,
-    0xa5,
-    0x2f,
-    0xdd,
-    0x21,
-    0xd8,
-    0xda,
-    0x52,
-    0x9e,
-    0x0f,
-    0x6f,
-    0x2d,
-    0x87,
-    0x2b,
-    0xd6,
-    0xfe,
-    0x38,
-    0xe6,
-    0x76,
-    0xe9,
-    0x5b,
-    0x15,
-    0x61,
-    0x04,
-    0xba,
-    0x2b,
-    0xcb,
-    0x00,
-    0x51,
-    0xff,
-    0xc1,
-    0x0c,
-    0xa8,
-    0xcf,
-    0x18,
-    0xf6,
-    0x60,
-    0x84,
-    0xa3,
-    0x93,
-    0x0b,
-    0x37,
-    0xa9,
-    0x62,
-    0x41,
-    0xf5,
-    0x95,
-    0x6c,
-    0xf0,
-    0xbf,
-    0xf0,
-    0x6e,
-    0xf3,
-    0xd5,
-    0x8d,
-    0x3a,
-    0xe6,
-    0x35,
-    0x03,
-    0x5b,
-    0x39,
-    0x5e,
-    0x60,
-    0xf8,
-    0x84,
-    0x59,
-    0x1c,
-    0xfb,
-    0x1a,
-    0xfa,
-    0x4c,
-    0x71,
-    0xe1,
-    0x64,
-    0x18,
-    0x34,
-    0x61,
-    0xcb,
-    0x6f,
-    0xc8,
-    0x1a,
-    0x7e,
-    0xfa,
-    0x84,
-    0x1b,
-    0x24,
-    0x4e,
-    0xf2,
-    0xd0,
-    0x45,
-    0x65,
-    0x78,
-    0x1c,
-    0x0d,
-    0x4f,
-    0x37,
-    0xa7,
-    0x4d,
-    0x25,
-    0x33,
-    0x7a,
-    0xc3,
-    0x3f,
-    0xb4,
-    0xc9,
-    0x9b,
-    0xa6,
-    0xed,
-    0x0f,
-    0x35,
-    0xcc,
-    0xdc,
-    0x61,
-    0x29,
-    0x7b,
-    0x71,
-    0xfb,
-    0x89,
-    0x0c,
-    0xf2,
-    0x20,
-    0x66,
-    0xd9,
-    0x9e,
-    0x21,
-    0x95,
-    0xf5,
-    0x91,
-    0xbb,
-    0xb2,
-    0x1a,
-    0xe7,
-    0xa5,
-    0x66,
-    0xe2,
-    0x24,
-    0x6a,
-    0xe6,
-    0x3a,
-    0xd4,
-    0x75,
-    0xbc,
-    0x14,
-    0x6e,
-    0x6a,
-    0xca,
-    0x5d,
-    0x7e,
-    0xbd,
-    0x8c,
-    0x2f,
-    0x03,
-    0x7d,
-    0x9d,
-    0x47,
-    0x16,
-    0x70,
-    0x7d,
-    0xb9,
-    0xcd,
-    0x65,
-    0x91,
-    0xe2,
-    0x5f,
-    0xc6,
-    0x6b,
-    0x9f,
-    0x89,
-    0x6d,
-    0x4c,
-    0xbc,
-    0x30,
-    0xb8,
-    0xe7,
-    0xb0,
-    0x47,
-    0xe0,
-    0x68,
-    0x87,
-    0xf3,
-    0x86,
-    0xb5,
-    0x1f,
-    0xed,
-    0x8f,
-    0xf4,
-    0x97,
-    0x29,
-    0x32,
-    0x4d,
-    0x05,
-    0xb5,
-    0x4f,
-    0xf1,
-    0x67,
-    0xe3,
-    0x03,
-    0x5b,
-    0xdd,
-    0xaa,
-    0x79,
-    0xd6,
-    0x15,
-    0x4a,
-    0x03,
-    0x3f,
-    0x06,
-    0x2f,
-    0x69,
-    0x0c,
-    0xe1,
-    0x18,
-    0x81,
-    0x8d,
-    0x44,
-    0x78,
-    0xff,
-    0x72,
-    0xb1,
-    0x1c,
-    0x8f,
-    0x8e,
-    0x40,
-    0x0f,
-    0x21,
-    0xda,
-    0x90,
-    0xbb,
-    0x84,
-    0xbd,
-    0x03,
-    0x50,
-    0x37,
-    0x8a,
-    0x2b,
-    0x6a,
-    0x7c,
-    0x4b,
-    0x7f,
-    0xee,
-    0xad,
-    0xbd,
-    0x53,
-    0x34,
-    0xd3,
-    0x9b,
-    0x07,
-    0x6c,
-    0x75,
-    0x1f,
-    0x7e,
-    0x3a,
-    0xae,
-    0xc7,
-    0xd1,
-    0xa4,
-    0x82,
-    0x55,
-    0x45,
-    0x2e,
-    0x72,
-    0x19,
-    0x7b,
-    0x43,
-    0x4e,
-    0x72,
-    0xe7,
-    0xd7,
-    0x4b,
-    0x93,
-    0x83,
-    0x4b,
-    0x56,
-    0x83,
-    0xc5,
-    0x91,
-    0xa7,
-    0x67,
-    0xce,
-    0x90,
-    0x98,
-    0x04,
-    0xe4,
-    0xca,
-    0xb8,
-    0x80,
-    0x22,
-    0x3c,
-    0x1b,
-    0x68,
-    0x6e,
-    0x85,
-    0xf5,
-    0xf8,
-    0xac,
-    0x4b,
-    0x67,
-    0x96,
-    0x31,
-    0xdb,
-    0x99,
-    0x9f,
-    0x7b,
-    0x0f,
-    0x09,
-    0x66,
-    0x1f,
-    0x75,
-    0x23,
-    0x7a,
-    0x02,
-    0xad,
-    0x11,
-    0x28,
-    0xcc,
-    0x13,
-    0xd4,
-    0x41,
-    0x9a,
-    0x9f,
-    0x94,
-    0x1e,
-    0xf4,
-    0x09,
-    0x34,
-    0xe0,
-    0xfe,
-    0x30,
-    0x2a,
-    0xfc,
-    0xf2,
-    0xbc,
-    0x8e,
-    0xf8,
-    0xcd,
-    0x02,
-    0x70,
-    0x6f,
-    0x49,
-    0x29,
-    0x6f,
-    0x5b,
-    0x0c,
-    0x8b,
-    0x87,
-    0x94,
-    0x1f,
-    0x5e,
-    0x2b,
-    0x93,
-    0xa1,
-    0x94,
-    0x94,
-    0x7c,
-    0xbd,
-    0xff,
-    0x58,
-    0x5c,
-    0xd9,
-    0xb9,
-    0x3e,
-    0xae,
-    0x10,
-    0xc3,
-    0x51,
-    0x25,
-    0xe3,
-    0xec,
-    0x33,
-    0xa5,
-    0x2b,
-    0xf5,
-    0xb4,
-    0x92,
-    0x52,
-    0xf2,
-    0xa3,
-    0x4e,
-    0xc3,
-    0xf3,
-    0xe5,
-    0xfd,
-    0x9f,
-    0xe4,
-    0xc3,
-    0x8c,
-    0xb2,
-    0xb2,
-    0x88,
-    0xf1,
-    0xa5,
-    0xb0,
-    0x4c,
-    0xb4,
-    0x75,
-    0x38,
-    0x0b,
-    0xae,
-    0x24,
-    0x95,
-    0xfa,
-    0x11,
-    0xae,
-    0x20,
-    0x1a,
-    0xa8,
-    0x3e,
-    0xaa,
-    0x0d,
-    0x60,
-    0xa2,
-    0x1a,
-    0x29,
-    0x08,
-    0xfc,
-    0x57,
-    0xcb,
-    0x55,
-    0xbb,
-    0x69,
-    0xed,
-    0x29,
-    0xca,
-    0xdb,
-    0xfb,
-    0x14,
-    0x07,
-    0x63,
-    0xe3,
-    0x1c,
-    0xf7,
-    0xc5,
-    0x6c,
-    0xb9,
-    0xb8,
-    0xf4,
-    0xc8,
-    0x24,
-    0x37,
-    0x7a,
-    0x6c,
-    0xd1,
-    0xa3,
-    0x1b,
-    0x1f,
-    0x3a,
-    0x21,
-    0xb5,
-    0x51,
-    0xdf,
-    0xc1,
-    0x6b,
-    0xaf,
-    0x8b,
-    0xb0,
-    0x02,
-    0xf4,
-    0xd8,
-    0xb0,
-    0x8b,
-    0x02,
-    0xf5,
-    0xc6,
-    0x43,
-    0x31,
-    0xa7,
-    0x32,
-    0xb7,
-    0xe7,
-    0x8e,
-    0xa4,
-    0x2c,
-    0x69,
-    0xaa,
-    0xad,
-    0x3d,
-    0xf0,
-    0x1e,
-    0x74,
-    0xc6,
-    0x00,
-    0x33,
-    0xaa,
-    0x01,
-    0xf5,
-    0x9f,
-    0xc0,
-    0xef,
-    0xdf,
-    0x08,
-    0x57,
-    0xfa,
-    0x8f,
-    0xc4,
-    0xf8,
-    0xd8,
-    0xf2,
-    0xe3,
-    0x05,
-    0xb2,
-    0x9e,
-    0x6f,
-    0xef,
-    0x86,
-    0xab,
-    0xf2,
-    0xaa,
-    0xca,
-    0xc4,
-    0x39,
-    0x5e,
-    0x52,
-    0x7d,
-    0x58,
-    0x60,
-    0x73,
-    0xe7,
-    0xee,
-    0x60,
-    0x69,
-    0x63,
-    0xaa,
-    0xe4,
-    0xf6,
-    0xb3,
-    0x0e,
-    0xf5,
-    0x4c,
-    0x57,
-    0x73,
-    0x17,
-    0x2d,
-    0x16,
-    0x4e,
-    0x7f,
-    0x51,
-    0xdb,
-    0xb1,
-    0x81,
-    0x08,
-    0xc2,
-    0x15,
-    0x48,
-    0x20,
-    0x73,
-    0x56,
-    0xc9,
-    0x09,
-    0xaf,
-    0xff,
-    0xf9,
-    0x37,
-    0x28,
-    0xc8,
-    0x3e,
-    0xc8,
-    0x96,
-    0x5d,
-    0x24,
-    0x67,
-    0x07,
-    0x61,
-    0x52,
-    0x70,
-    0x76,
-    0xb3,
-    0xbc,
-    0x54,
-    0xa0,
-    0xf0,
-    0x1a,
-    0x40,
-    0x13,
-    0x39,
-    0x98,
-    0xf9,
-    0x88,
-    0x36,
-    0xcf,
-    0x0b,
-    0x72,
-    0x5a,
-    0xf4,
-    0x22,
-    0xd7,
-    0x69,
-    0x4f,
-    0xb8,
-    0x5f,
-    0x38,
-    0xef,
-    0xf0,
-    0xab,
-    0xb5,
-    0x9d,
-    0xc2,
-    0xe7,
-    0x26,
-    0x0e,
-    0x59,
-    0xa3,
-    0xb6,
-    0x5d,
-    0xb9,
-    0xde,
-    0x2d,
-    0xb8,
-    0xa5,
-    0x64,
-    0xff,
-    0x59,
-    0xc0,
-    0x5b,
-    0x88,
-    0xb7,
-    0xf2,
-    0x18,
-    0x96,
-    0xfe,
-    0x0d,
-    0x37,
-    0x28,
-    0xbd,
-    0xb1,
-    0xea,
-    0x75,
-    0xdf,
-    0x6d,
-    0x91,
-    0x30,
-    0xdd,
-    0x26
-  ],
-  const [
-    0xff,
-    0x5b,
-    0xe1,
-    0xec,
-    0xa7,
-    0xd4,
-    0x5e,
-    0xff,
-    0x12,
-    0xe9,
-    0x64,
-    0x5d,
-    0xdf,
-    0x05,
-    0xc1,
-    0x73,
-    0x5b,
-    0x97,
-    0x3b,
-    0xb8,
-    0xb0,
-    0x6f,
-    0x6c,
-    0x32,
-    0x59,
-    0x6b,
-    0xd1,
-    0x3c,
-    0xd9,
-    0x54,
-    0x1d,
-    0x86,
-    0xad,
-    0x03,
-    0xd3,
-    0x5d,
-    0x7f,
-    0xc8,
-    0x13,
-    0x2d,
-    0x9c,
-    0x0c,
-    0xb4,
-    0x44,
-    0xa8,
-    0x34,
-    0x94,
-    0xd8,
-    0x91,
-    0xc9,
-    0x2c,
-    0x4c,
-    0xc1,
-    0xd6,
-    0x68,
-    0xaf,
-    0x98,
-    0x92,
-    0xb5,
-    0x86,
-    0x19,
-    0x3f,
-    0x5b,
-    0xcb,
-    0xe3,
-    0x52,
-    0x0d,
-    0x35,
-    0x63,
-    0xd4,
-    0xbe,
-    0xba,
-    0x49,
-    0x08,
-    0xb7,
-    0x53,
-    0x38,
-    0x4e,
-    0xe7,
-    0xff,
-    0xc2,
-    0x47,
-    0x7a,
-    0x0a,
-    0x93,
-    0x3a,
-    0xad,
-    0x8f,
-    0xec,
-    0xb7,
-    0xe0,
-    0x3c,
-    0x54,
-    0x7a,
-    0xec,
-    0x55,
-    0x8a,
-    0x91,
-    0xb8,
-    0xfb,
-    0xbd,
-    0xc2,
-    0x07,
-    0xaf,
-    0xff,
-    0x27,
-    0x94,
-    0x12,
-    0xf8,
-    0x1b,
-    0x61,
-    0xee,
-    0xd7,
-    0x5a,
-    0x4c,
-    0x7a,
-    0x8e,
-    0x63,
-    0xe3,
-    0xda,
-    0x3f,
-    0x21,
-    0x79,
-    0xe6,
-    0xf1,
-    0xcb,
-    0x7a,
-    0x2c,
-    0x88,
-    0x09,
-    0xfb,
-    0x38,
-    0xf4,
-    0x58,
-    0x95,
-    0x13,
-    0xa8,
-    0xaf,
-    0x74,
-    0x09,
-    0x4e,
-    0x63,
-    0xab,
-    0xaf,
-    0xb9,
-    0x48,
-    0xca,
-    0x25,
-    0x1b,
-    0x19,
-    0xb3,
-    0x99,
-    0x78,
-    0x19,
-    0xa9,
-    0x0c,
-    0x5a,
-    0xfb,
-    0xaa,
-    0x59,
-    0xc7,
-    0xff,
-    0xff,
-    0x73,
-    0x70,
-    0x5f,
-    0x11,
-    0xee,
-    0x2b,
-    0xe9,
-    0x7e,
-    0xc1,
-    0xa3,
-    0xed,
-    0x6c,
-    0x4a,
-    0x4e,
-    0x59,
-    0x1e,
-    0x92,
-    0xa0,
-    0x23,
-    0xc5,
-    0xd3,
-    0x7f,
-    0xe7,
-    0x98,
-    0x37,
-    0xf6,
-    0xd2,
-    0x26,
-    0xe3,
-    0x2d,
-    0xbe,
-    0xeb,
-    0x34,
-    0x99,
-    0x9e,
-    0x22,
-    0x48,
-    0x70,
-    0x1d,
-    0xdb,
-    0xc1,
-    0x60,
-    0x82,
-    0x4d,
-    0xc5,
-    0x80,
-    0xd7,
-    0x6d,
-    0x49,
-    0x87,
-    0x4a,
-    0xc0,
-    0x90,
-    0x3c,
-    0xd3,
-    0x6d,
-    0xee,
-    0x2d,
-    0x17,
-    0x96,
-    0xd2,
-    0xa4,
-    0x8d,
-    0xe8,
-    0x04,
-    0xd7,
-    0xdf,
-    0x71,
-    0x2a,
-    0x5f,
-    0x93,
-    0xb2,
-    0x91,
-    0xeb,
-    0xea,
-    0xf6,
-    0x2a,
-    0x36,
-    0x08,
-    0xe2,
-    0xd3,
-    0x36,
-    0x56,
-    0x4c,
-    0xd8,
-    0x97,
-    0x25,
-    0x51,
-    0xba,
-    0x67,
-    0x94,
-    0xa1,
-    0x2f,
-    0x13,
-    0xb3,
-    0x1e,
-    0x69,
-    0x92,
-    0xe8,
-    0xa6,
-    0x9b,
-    0xe0,
-    0x92,
-    0x2c,
-    0xba,
-    0xae,
-    0xed,
-    0x0e,
-    0x81,
-    0x58,
-    0x36,
-    0xa2,
-    0xb7,
-    0x17,
-    0x0f,
-    0x12,
-    0xb4,
-    0x78,
-    0x24,
-    0x6b,
-    0x22,
-    0x0c,
-    0x0f,
-    0xf0,
-    0x01,
-    0x61,
-    0x79,
-    0xb4,
-    0xed,
-    0x32,
-    0x82,
-    0x68,
-    0xa4,
-    0xdb,
-    0x63,
-    0x71,
-    0xc3,
-    0x0f,
-    0x52,
-    0x3e,
-    0xd0,
-    0xcd,
-    0xa7,
-    0xd8,
-    0x7d,
-    0x90,
-    0x3c,
-    0xba,
-    0x2b,
-    0xc7,
-    0x19,
-    0xe4,
-    0xae,
-    0x84,
-    0x51,
-    0x2b,
-    0x50,
-    0x78,
-    0x27,
-    0xd3,
-    0x18,
-    0x1f,
-    0x75,
-    0x5f,
-    0x4c,
-    0x38,
-    0x4f,
-    0xa8,
-    0x34,
-    0x78,
-    0xe3,
-    0x2d,
-    0x21,
-    0x7f,
-    0xa3,
-    0xaa,
-    0xae,
-    0x0b,
-    0xa7,
-    0xec,
-    0x46,
-    0x6c,
-    0x4c,
-    0xe3,
-    0xe6,
-    0x38,
-    0x22,
-    0xf9,
-    0x24,
-    0x3f,
-    0x05,
-    0xa2,
-    0x71,
-    0xc1,
-    0x89,
-    0x34,
-    0x9b,
-    0xdf,
-    0x9c,
-    0xfa,
-    0x96,
-    0x50,
-    0x66,
-    0x83,
-    0x7b,
-    0x55,
-    0x74,
-    0x40,
-    0xd1,
-    0xef,
-    0x16,
-    0x4f,
-    0x0c,
-    0x4f,
-    0x05,
-    0x91,
-    0x53,
-    0x8e,
-    0x49,
-    0x02,
-    0x86,
-    0x9e,
-    0x5a,
-    0x4a,
-    0x80,
-    0x81,
-    0x86,
-    0x8f,
-    0x99,
-    0xb8,
-    0x92,
-    0x8e,
-    0x6f,
-    0xff,
-    0xa4,
-    0xea,
-    0xe7,
-    0x37,
-    0x61,
-    0xc3,
-    0x6e,
-    0xa4,
-    0x52,
-    0x8b,
-    0x85,
-    0x58,
-    0x8c,
-    0x15,
-    0x7c,
-    0xef,
-    0x90,
-    0xef,
-    0x7d,
-    0x7d,
-    0x70,
-    0xf2,
-    0xcd,
-    0xc5,
-    0x33,
-    0x17,
-    0x4f,
-    0xac,
-    0x7b,
-    0x8d,
-    0x4a,
-    0xed,
-    0x65,
-    0x08,
-    0x6b,
-    0x0d,
-    0xb1,
-    0x5b,
-    0x0e,
-    0x92,
-    0x23,
-    0x49,
-    0xb9,
-    0x70,
-    0x28,
-    0x98,
-    0xe9,
-    0xc4,
-    0xbd,
-    0x68,
-    0x12,
-    0xc4,
-    0x8d,
-    0xc3,
-    0xe1,
-    0xf6,
-    0x59,
-    0x75,
-    0xc4,
-    0xa1,
-    0x9d,
-    0x1e,
-    0xac,
-    0x82,
-    0x71,
-    0x85,
-    0x12,
-    0xbf,
-    0xad,
-    0x2f,
-    0x38,
-    0x21,
-    0x50,
-    0x31,
-    0xb1,
-    0x7d,
-    0x23,
-    0x42,
-    0x23,
-    0x73,
-    0x99,
-    0x14,
-    0x4c,
-    0x5b,
-    0xfa,
-    0xe5,
-    0x43,
-    0x7d,
-    0xc0,
-    0x51,
-    0x00,
-    0x80,
-    0x42,
-    0x6a,
-    0x1f,
-    0x26,
-    0x8f,
-    0x0a,
-    0xe1,
-    0x36,
-    0x9d,
-    0x68,
-    0x74,
-    0xb9,
-    0xa3,
-    0xea,
-    0x74,
-    0x68,
-    0xc3,
-    0x3a,
-    0xb1,
-    0x66,
-    0xec,
-    0x9c,
-    0x33,
-    0x2b,
-    0xff,
-    0x7f,
-    0x7b,
-    0xc0,
-    0x30,
-    0x51,
-    0x0c,
-    0x32,
-    0xb0,
-    0x98,
-    0x2a,
-    0x41,
-    0x89,
-    0x3f,
-    0xe2,
-    0x58,
-    0xc9,
-    0x2d,
-    0x4a,
-    0xc2,
-    0xe2,
-    0x1d,
-    0x0a,
-    0x1a,
-    0x51,
-    0xa9,
-    0x1b,
-    0x03,
-    0x7e,
-    0xa7,
-    0xcf,
-    0x1a,
-    0xe3,
-    0xb9,
-    0x12,
-    0x29,
-    0x71,
-    0x20,
-    0xef,
-    0x9e,
-    0x2f,
-    0xd1,
-    0x56,
-    0x3b,
-    0x25,
-    0xcb,
-    0x1c,
-    0x0e,
-    0x78,
-    0xa7,
-    0x43,
-    0xa4,
-    0xd6,
-    0x71,
-    0x7c,
-    0x7a,
-    0x14,
-    0xb6,
-    0xea,
-    0xb4,
-    0x16,
-    0xde,
-    0x29,
-    0x11,
-    0xf0,
-    0xbc,
-    0x8f,
-    0x1f,
-    0x4a,
-    0x64,
-    0xb1,
-    0xab,
-    0x09,
-    0x3d,
-    0x29,
-    0x7c,
-    0x2c,
-    0x57,
-    0x97,
-    0x41,
-    0xf3,
-    0xfe,
-    0xe6,
-    0xc7,
-    0x47,
-    0x8f,
-    0xd1,
-    0x6f,
-    0x56,
-    0x8a,
-    0xa5,
-    0xe0,
-    0x7e,
-    0xe9,
-    0x48,
-    0xf9,
-    0x6c,
-    0xb0,
-    0x7a,
-    0x09,
-    0x85,
-    0xc6,
-    0x5b,
-    0x43,
-    0x84,
-    0x03,
-    0x2d,
-    0x6c,
-    0x65,
-    0x8a,
-    0x5c,
-    0xd7,
-    0x83,
-    0x59,
-    0xbb,
-    0x93,
-    0xfd,
-    0x1e,
-    0x11,
-    0xe3,
-    0x5d,
-    0x4c,
-    0xd4,
-    0xee,
-    0x7c,
-    0x6f,
-    0x34,
-    0xb8,
-    0xa0,
-    0xbd,
-    0x5c,
-    0x51,
-    0xe8,
-    0xed,
-    0xf4,
-    0x4d,
-    0xea,
-    0x4c,
-    0xea,
-    0x73,
-    0x9a,
-    0x0d,
-    0x72,
-    0xba,
-    0x6e,
-    0xe0,
-    0x4b,
-    0x71,
-    0xbf,
-    0xc7,
-    0x44,
-    0xbd,
-    0x73,
-    0x25,
-    0x00,
-    0x48,
-    0xd9,
-    0x18,
-    0xf6,
-    0x38,
-    0xd4,
-    0x09,
-    0xbb,
-    0x5e,
-    0x3c,
-    0x82,
-    0x84,
-    0xb0,
-    0x81,
-    0x3f,
-    0xe7,
-    0xfa,
-    0x91,
-    0x87,
-    0xe1,
-    0xd0,
-    0xfc,
-    0xbd,
-    0x1d,
-    0xc7,
-    0x56,
-    0x32,
-    0x73,
-    0xe5,
-    0xde,
-    0x3d,
-    0xb0,
-    0x55,
-    0x5c,
-    0x8e,
-    0x95,
-    0x5f,
-    0x50,
-    0xbf,
-    0x22,
-    0x98,
-    0x48,
-    0x2c,
-    0x14,
-    0x56,
-    0x92,
-    0x05,
-    0xac,
-    0x67,
-    0x13,
-    0xa1,
-    0xb2,
-    0x03,
-    0x77,
-    0x15,
-    0xba,
-    0xfe,
-    0x8b,
-    0x06,
-    0xa6,
-    0x42,
-    0xe6,
-    0xbb,
-    0x6c,
-    0x7d,
-    0xcf,
-    0x76,
-    0x19,
-    0x17,
-    0x5b,
-    0x05,
-    0x16,
-    0x67,
-    0xd6,
-    0x94,
-    0xaa,
-    0x26,
-    0x64,
-    0xc5,
-    0xc1,
-    0x24,
-    0xe8,
-    0x03,
-    0xec,
-    0x39,
-    0x25,
-    0x13,
-    0xa8,
-    0x7f,
-    0x24,
-    0xeb,
-    0xe3,
-    0xbe,
-    0xd5,
-    0xc8,
-    0xbc,
-    0x28,
-    0xf8,
-    0x7b,
-    0x8b,
-    0x47,
-    0x3e,
-    0x03,
-    0x21,
-    0x33,
-    0xac,
-    0x61,
-    0x51,
-    0x08,
-    0x41,
-    0xa8,
-    0xaf,
-    0x97,
-    0xd8,
-    0x54,
-    0x97,
-    0x5c,
-    0x50,
-    0xdc,
-    0x71,
-    0xb1,
-    0xe9,
-    0x8b,
-    0x34,
-    0x40,
-    0xf1,
-    0x8b,
-    0x29,
-    0xbe,
-    0xa1,
-    0x43,
-    0xf2,
-    0xd7,
-    0x42,
-    0xe3,
-    0xca,
-    0x64,
-    0x93,
-    0x3c,
-    0x0e,
-    0xe4,
-    0x6f,
-    0xd6,
-    0xfd,
-    0x2a,
-    0xab,
-    0x3c,
-    0xbc,
-    0x53,
-    0x3e,
-    0x9b,
-    0x9c,
-    0xfb,
-    0xa4,
-    0x8b,
-    0xa0,
-    0xb1,
-    0x84,
-    0x2d,
-    0x3a,
-    0xa7,
-    0x90,
-    0x76,
-    0x56,
-    0xae,
-    0xac,
-    0xca,
-    0x99,
-    0x62,
-    0x53,
-    0xcd,
-    0xeb,
-    0xa2,
-    0x37,
-    0x76,
-    0x33,
-    0x44,
-    0x28,
-    0x65,
-    0x61,
-    0x06,
-    0x37,
-    0x76,
-    0xb2,
-    0xc7,
-    0x1b,
-    0x96,
-    0x2f,
-    0xf7,
-    0xd4,
-    0xd5,
-    0x78,
-    0x4c,
-    0x8e,
-    0xbd,
-    0xbf,
-    0xb6,
-    0xc7,
-    0xe2,
-    0x17,
-    0x96,
-    0xb4,
-    0xbb,
-    0xef,
-    0x2b,
-    0xe1,
-    0xb0,
-    0xd9,
-    0x4c,
-    0x19,
-    0x74,
-    0x91,
-    0x5d,
-    0x85,
-    0x95,
-    0x3a,
-    0x7c,
-    0x17,
-    0x52,
-    0xea,
-    0xfb,
-    0x2a,
-    0xac,
-    0x69,
-    0x13,
-    0x62,
-    0xc0,
-    0x36,
-    0xd6,
-    0xda,
-    0x53,
-    0xcb,
-    0x66,
-    0x7e,
-    0xaf,
-    0x22,
-    0x65,
-    0xb5,
-    0xae,
-    0x78,
-    0xac,
-    0x44,
-    0x14,
-    0x51,
-    0x40,
-    0x6f,
-    0x21,
-    0xbc,
-    0x81,
-    0x60,
-    0x67,
-    0xd8,
-    0xa5,
-    0xcd,
-    0xda,
-    0x97,
-    0x65,
-    0xd6,
-    0x26,
-    0xc2,
-    0xf6,
-    0x2c,
-    0x45,
-    0x3e,
-    0x3b,
-    0x78,
-    0x50,
-    0x8d,
-    0x39,
-    0xfb,
-    0x95,
-    0x97,
-    0xcb,
-    0x71,
-    0xeb,
-    0xab,
-    0x97,
-    0x3c,
-    0x42,
-    0xc1,
-    0x40,
-    0xbe,
-    0x7e,
-    0x02,
-    0xde,
-    0x07,
-    0x86,
-    0x8a,
-    0xab,
-    0xb0,
-    0x97,
-    0x6c,
-    0xfe,
-    0x06,
-    0xdf,
-    0xf6,
-    0x7e,
-    0x6c,
-    0x47,
-    0x37,
-    0x8f,
-    0xfa,
-    0x90,
-    0xbf,
-    0x11,
-    0x6a,
-    0xa1,
-    0xa6,
-    0x4a,
-    0x35,
-    0x1f,
-    0xd0,
-    0x20,
-    0xf9,
-    0x3f,
-    0x6e,
-    0x8c,
-    0x1e,
-    0xd8,
-    0xc8,
-    0x4b,
-    0xb9,
-    0xbd,
-    0x3b,
-    0xd7,
-    0xb0,
-    0x49,
-    0x7d,
-    0x95,
-    0x20,
-    0x3b,
-    0x29,
-    0x50,
-    0xfb,
-    0xc4,
-    0x77,
-    0xe6,
-    0xf6,
-    0xdf,
-    0x4a,
-    0x41,
-    0xa2,
-    0xe1,
-    0x71,
-    0x89,
-    0xd8,
-    0x51,
-    0x26,
-    0x98,
-    0x5b,
-    0xf9,
-    0xdb,
-    0xaf,
-    0xb9,
-    0x3d,
-    0x37,
-    0x67,
-    0x72,
-    0xac,
-    0x5b,
-    0xea,
-    0x5c,
-    0xd5,
-    0x69,
-    0x62,
-    0x46,
-    0x5c,
-    0x47,
-    0xb2,
-    0xdc,
-    0x4d,
-    0xa0,
-    0x65,
-    0xcb,
-    0xaf,
-    0x2c,
-    0xe3,
-    0x25,
-    0x5d,
-    0x32,
-    0xeb,
-    0x06,
-    0x11,
-    0x4b,
-    0x3d,
-    0x78,
-    0xc2,
-    0x68,
-    0x97,
-    0x94,
-    0x30,
-    0x16,
-    0xe3,
-    0xea,
-    0xbd,
-    0x01,
-    0xaf,
-    0x23,
-    0x7e,
-    0xb7,
-    0xdd,
-    0xe5,
-    0x92,
-    0xaf,
-    0x9c,
-    0xf7,
-    0xb2,
-    0x8a,
-    0x97,
-    0xa6,
-    0x0a,
-    0x98,
-    0x6c,
-    0x67,
-    0x47,
-    0x9e,
-    0x5f,
-    0xbd,
-    0xf2,
-    0xd7,
-    0x50,
-    0x5d,
-    0xfc,
-    0x38,
-    0xea,
-    0x91,
-    0x9a,
-    0xf8,
-    0x1e,
-    0xda,
-    0x53,
-    0x50,
-    0xcf,
-    0xd9,
-    0x56,
-    0x80,
-    0xcf,
-    0x6f,
-    0x12,
-    0x12,
-    0x0b,
-    0x24,
-    0x01,
-    0x62,
-    0x02,
-    0xc5,
-    0xc4,
-    0x5e,
-    0x7c,
-    0x51,
-    0x75,
-    0x8b,
-    0x78,
-    0x17,
-    0x39,
-    0x49,
-    0x66,
-    0x18,
-    0x14,
-    0x57,
-    0x96,
-    0xb2,
-    0x02,
-    0x99,
-    0xf1,
-    0x80,
-    0x43,
-    0x19,
-    0xe7,
-    0x7c,
-    0xf6,
-    0x4d,
-    0xa8,
-    0x66,
-    0xe9,
-    0x98,
-    0x97,
-    0x6a,
-    0xb0,
-    0x12,
-    0xfb,
-    0xfd,
-    0xf4,
-    0x8c,
-    0xf8,
-    0x08,
-    0x0e,
-    0xcf,
-    0xbf,
-    0x48,
-    0xd4,
-    0x25,
-    0x01,
-    0xf4,
-    0xb3,
-    0x1b,
-    0xa9,
-    0xa1,
-    0xff,
-    0x84,
-    0xca,
-    0x64,
-    0x86,
-    0xc1,
-    0xd6,
-    0x36,
-    0x6b,
-    0x40,
-    0x12,
-    0x9c,
-    0x32,
-    0x43,
-    0x46,
-    0x87,
-    0x17,
-    0xe3,
-    0xb9,
-    0x78,
-    0xa4,
-    0x54,
-    0x5c,
-    0xe9,
-    0x82,
-    0x6a,
-    0x46,
-    0xe9,
-    0x90,
-    0x5c,
-    0x60,
-    0x06,
-    0x32,
-    0xc9,
-    0x62,
-    0x6f,
-    0xec,
-    0xf8,
-    0xfe,
-    0x5a,
-    0x2f,
-    0x64,
-    0x5a,
-    0xa4,
-    0x72,
-    0x78,
-    0xc4,
-    0xb7,
-    0x85,
-    0x97,
-    0xa2,
-    0xb1,
-    0x22,
-    0x5f,
-    0xa7,
-    0xc3,
-    0xc6,
-    0x2f,
-    0x4d,
-    0xd6,
-    0xbe,
-    0xe6,
-    0x7f,
-    0x75,
-    0x85,
-    0xee,
-    0x95,
-    0xe7,
-    0x4d,
-    0x7a,
-    0x86,
-    0x9b,
-    0xdc,
-    0x0b,
-    0x59,
-    0xca,
-    0x99,
-    0x39,
-    0xdd,
-    0x57,
-    0xe7,
-    0xb0,
-    0x9a,
-    0xfa,
-    0xb1,
-    0x79,
-    0x07,
-    0x9d,
-    0x46,
-    0x7b,
-    0xfe,
-    0x06,
-    0x68,
-    0x41,
-    0x6c,
-    0xb7,
-    0x9f,
-    0xfd,
-    0x4d,
-    0x12,
-    0xd4,
-    0xcd,
-    0xd8,
-    0xc1,
-    0x1a,
-    0x3e,
-    0xf6,
-    0x55,
-    0xcf,
-    0x0f,
-    0xf9,
-    0x2d,
-    0xe4,
-    0x37,
-    0x8b,
-    0x9a,
-    0x79,
-    0x28,
-    0xe4,
-    0x40,
-    0xad,
-    0x56,
-    0x41,
-    0xc0,
-    0xb4,
-    0xf3,
-    0x91,
-    0x94,
-    0x2a,
-    0xfd,
-    0x71,
-    0x3a,
-    0xa6,
-    0x7b,
-    0x5a,
-    0x94,
-    0x93,
-    0x04,
-    0x19,
-    0x8f,
-    0x3b,
-    0x80,
-    0x80,
-    0x03,
-    0x25,
-    0x33,
-    0x5c,
-    0xda,
-    0xa1,
-    0xf7,
-    0xa7,
-    0x75,
-    0xa1,
-    0xc8,
-    0xfe,
-    0x4b,
-    0xca,
-    0x86,
-    0x55,
-    0xd3,
-    0xcb,
-    0xf7,
-    0xe9,
-    0xa5,
-    0xee,
-    0x0c,
-    0x76,
-    0xdc,
-    0xec,
-    0x65,
-    0xaa,
-    0xbe,
-    0x06,
-    0x16,
-    0xda,
-    0x9f,
-    0x51,
-    0xac,
-    0xf5,
-    0x02,
-    0x52,
-    0x6b,
-    0xb6,
-    0x02,
-    0xca,
-    0xda,
-    0x1d,
-    0xf0,
-    0xd3,
-    0x82,
-    0x1f,
-    0x3e,
-    0x2c,
-    0xf2,
-    0x9d,
-    0x9b,
-    0xd2,
-    0x06,
-    0x93,
-    0x60,
-    0xd0,
-    0x69,
-    0x92,
-    0x2b,
-    0x57,
-    0x59,
-    0x70,
-    0xc9,
-    0x11,
-    0xaa,
-    0x3e,
-    0x5a,
-    0xb3,
-    0x0e,
-    0x7a,
-    0xaf,
-    0xd2,
-    0x93,
-    0x86,
-    0xf7,
-    0xf7,
-    0x6d,
-    0x59,
-    0x9b,
-    0xf5,
-    0xf6,
-    0x75,
-    0x66,
-    0x7a,
-    0xf3,
-    0x18,
-    0xe9,
-    0xe5,
-    0x19,
-    0xb7,
-    0x1e,
-    0x57,
-    0xd0,
-    0xa8,
-    0x4b,
-    0x0d,
-    0x36,
-    0x1f,
-    0x29,
-    0xed,
-    0x67,
-    0x5b,
-    0x46,
-    0x5e,
-    0xfc,
-    0x21,
-    0xa8,
-    0x5d,
-    0xd1,
-    0x6a,
-    0xb3,
-    0xce,
-    0x0c,
-    0x59,
-    0x4d,
-    0x0f,
-    0x5a,
-    0x6f,
-    0x3f,
-    0xd3,
-    0x7c,
-    0x02,
-    0xde,
-    0x2e,
-    0x03,
-    0xeb,
-    0xec,
-    0xec,
-    0x57,
-    0x80,
-    0xb9,
-    0x27,
-    0xfe,
-    0xc2,
-    0x8d,
-    0x19,
-    0x1b,
-    0xd7,
-    0x4a,
-    0x2e,
-    0x35,
-    0xba,
-    0x4e,
-    0x5d,
-    0x3a,
-    0x31,
-    0x97,
-    0xb9,
-    0xc4,
-    0xff,
-    0x2a,
-    0x43,
-    0x9a,
-    0x5b,
-    0xb5,
-    0x03,
-    0x7a,
-    0xa2,
-    0x73,
-    0x57,
-    0x16,
-    0x49,
-    0x50,
-    0x8a,
-    0x5c,
-    0x15,
-    0x4e,
-    0xa8,
-    0xfa,
-    0x8e,
-    0x27,
-    0x91,
-    0x22,
-    0xb1,
-    0x34,
-    0x4d,
-    0x8a,
-    0xe5,
-    0x8d,
-    0x9f,
-    0xb8,
-    0x30,
-    0x72,
-    0xdd,
-    0x7c,
-    0xab,
-    0xe9,
-    0xfe,
-    0xbe,
-    0x33,
-    0xa9,
-    0xf5,
-    0x79,
-    0x62,
-    0x37,
-    0x3e,
-    0x08,
-    0xbd,
-    0x4f,
-    0xb6,
-    0xa1,
-    0x2f,
-    0x85,
-    0xaf,
-    0x1f,
-    0xb7,
-    0x2c,
-    0x44,
-    0x04,
-    0x5d,
-    0x77,
-    0xea,
-    0xbe,
-    0x6a,
-    0xde,
-    0x48,
-    0x29,
-    0xd8,
-    0xc3,
-    0x49,
-    0x56,
-    0x08,
-    0x56,
-    0x6f,
-    0x8b,
-    0xb3,
-    0xb6,
-    0x6a,
-    0x8a,
-    0x23,
-    0x59,
-    0xe9,
-    0x16,
-    0xa3,
-    0xad,
-    0xb0,
-    0xb4,
-    0x34,
-    0xff,
-    0xea,
-    0xaf,
-    0x81,
-    0x9d,
-    0xc1,
-    0x5e,
-    0x15,
-    0x37,
-    0x2d,
-    0xa9,
-    0xcc,
-    0x8b,
-    0x09,
-    0xca,
-    0x87,
-    0x42,
-    0x6c,
-    0x51,
-    0x24,
-    0x14,
-    0x36,
-    0x6b,
-    0xae,
-    0x33,
-    0xe9,
-    0x63,
-    0xd0,
-    0xe7,
-    0xbb,
-    0x69,
-    0x90,
-    0x75,
-    0xe9,
-    0x93,
-    0x3a,
-    0x46,
-    0x4d,
-    0x21,
-    0x99,
-    0x45,
-    0x33,
-    0x05,
-    0x6d,
-    0x89,
-    0x69,
-    0xa3,
-    0x1a,
-    0x34,
-    0x95,
-    0xd5,
-    0x9e,
-    0x9b,
-    0xcb,
-    0x32,
-    0xc5,
-    0xa7,
-    0x5f,
-    0x90,
-    0xa0,
-    0x7b,
-    0xf8,
-    0xc7,
-    0x33,
-    0x56,
-    0xe6,
-    0xb8,
-    0x6e,
-    0xbb,
-    0xb6,
-    0x8e,
-    0x5f,
-    0xd0,
-    0x03,
-    0x44,
-    0xa5,
-    0x05,
-    0x8f,
-    0x68,
-    0x28,
-    0xf5,
-    0x92,
-    0x1e,
-    0x07,
-    0x91,
-    0x51,
-    0x67,
-    0xd2,
-    0x7b,
-    0xf3,
-    0xa3,
-    0xfa,
-    0xb0,
-    0x90,
-    0x55,
-    0x85,
-    0x6a,
-    0x8c,
-    0x27,
-    0x06,
-    0x45,
-    0x23,
-    0x2e,
-    0xcd,
-    0xa0,
-    0x44,
-    0x6e,
-    0x5b,
-    0x46,
-    0xa3,
-    0xa1,
-    0x19,
-    0x4e,
-    0x0a,
-    0x34,
-    0x49,
-    0x3f,
-    0xef,
-    0x93,
-    0x3c,
-    0x78,
-    0x4c,
-    0xa6,
-    0xc5,
-    0xcf,
-    0xab,
-    0x9b,
-    0xef,
-    0x79,
-    0x80,
-    0xe7,
-    0xeb,
-    0x2a,
-    0xbc,
-    0x87,
-    0x4c,
-    0x7c,
-    0x9f,
-    0x8c,
-    0x77,
-    0x95,
-    0xce,
-    0xd6,
-    0x54,
-    0x04,
-    0xa5,
-    0x20,
-    0x4a,
-    0xed,
-    0xce,
-    0x3d,
-    0x6b,
-    0x66,
-    0x13,
-    0xa0,
-    0xeb,
-    0x20,
-    0x70,
-    0x22,
-    0xd7,
-    0x4a,
-    0x6d,
-    0x00,
-    0x03,
-    0xb2,
-    0xab,
-    0x23,
-    0x45,
-    0x2e,
-    0xbc,
-    0xa5,
-    0xe0,
-    0x3a,
-    0x37,
-    0x90,
-    0x43,
-    0xe2,
-    0x0c,
-    0xe9,
-    0xf4,
-    0xe3,
-    0x16,
-    0xed,
-    0xc7,
-    0x0d,
-    0xef,
-    0x9a,
-    0x53,
-    0xeb,
-    0x08,
-    0x71,
-    0xa6,
-    0xa6,
-    0xf9,
-    0x7b,
-    0x38,
-    0x27,
-    0x15,
-    0x8a,
-    0x1e,
-    0x7c,
-    0x42,
-    0xc1,
-    0x80,
-    0x7d,
-    0x08,
-    0x56,
-    0x4d,
-    0xaf,
-    0xe7,
-    0x97,
-    0x2d,
-    0x68,
-    0xee,
-    0x2b,
-    0xb8,
-    0x34,
-    0x89,
-    0x9b,
-    0xe5,
-    0x78,
-    0x9b,
-    0x11,
-    0xc5,
-    0x55,
-    0xcc,
-    0x5f,
-    0x71,
-    0xcf,
-    0x25,
-    0x42,
-    0x41,
-    0x2f,
-    0xda,
-    0xe8,
-    0x3e,
-    0xa5,
-    0x66,
-    0xb1,
-    0xda,
-    0x32,
-    0xdd,
-    0x33,
-    0xdf,
-    0xc5,
-    0x7e,
-    0x80,
-    0xa6,
-    0xa5,
-    0x88,
-    0xab,
-    0x89,
-    0x0e,
-    0x50,
-    0x88,
-    0x9a,
-    0x1f,
-    0x8f,
-    0xb4,
-    0x96,
-    0xf4,
-    0x00,
-    0xd5,
-    0x14,
-    0x0f,
-    0x2b,
-    0x23,
-    0x02,
-    0xfc,
-    0x7b,
-    0x28,
-    0x52,
-    0x34,
-    0x97,
-    0xc3,
-    0xf1,
-    0x43,
-    0xef,
-    0x73,
-    0xf9,
-    0x26,
-    0x95,
-    0xd2,
-    0x27,
-    0xf7,
-    0x4f,
-    0x60,
-    0x8f,
-    0xcc,
-    0xea,
-    0x82,
-    0x8e,
-    0xdc,
-    0xd1,
-    0xcb,
-    0x01,
-    0xe3,
-    0xde,
-    0x79,
-    0xb4,
-    0xc8,
-    0x6f,
-    0x43,
-    0x1e,
-    0x7d,
-    0xbd,
-    0x52,
-    0x4b,
-    0x28,
-    0x69,
-    0x8d,
-    0x19,
-    0x80,
-    0x58,
-    0x19,
-    0xa7,
-    0x79,
-    0xc1,
-    0x20,
-    0x0b,
-    0x23,
-    0x84,
-    0xd2,
-    0x43,
-    0xcf,
-    0xbe,
-    0xaa,
-    0x6e,
-    0x75,
-    0x9a,
-    0xf3,
-    0x3d,
-    0x52,
-    0x6a,
-    0x8a,
-    0xa4,
-    0xd5,
-    0xf6,
-    0xe5,
-    0xd5,
-    0xbc,
-    0x13,
-    0x54,
-    0x6e,
-    0x7b,
-    0x78,
-    0x87,
-    0xf1,
-    0xdd,
-    0xce,
-    0x51,
-    0x76,
-    0xed,
-    0x06,
-    0xab,
-    0x9c,
-    0x17,
-    0xef,
-    0xfc,
-    0xc5,
-    0x8b,
-    0x08,
-    0x98,
-    0x83,
-    0xe2,
-    0x93,
-    0x86,
-    0x4d,
-    0x04,
-    0xea,
-    0x86,
-    0x77,
-    0x49,
-    0x16,
-    0x52,
-    0x61,
-    0xde,
-    0x9e,
-    0x25,
-    0xee,
-    0x6b,
-    0x9d,
-    0x7a,
-    0x37,
-    0xf2,
-    0x17,
-    0x16,
-    0x81,
-    0xfb,
-    0x8d,
-    0x48,
-    0x6d,
-    0xee,
-    0xcf,
-    0x70,
-    0x6f,
-    0xc0,
-    0x12,
-    0xbe,
-    0x81,
-    0xd1,
-    0x42,
-    0x3c,
-    0x19,
-    0x15,
-    0x9a,
-    0x0f,
-    0x58,
-    0x73,
-    0x71,
-    0xfa,
-    0x84,
-    0x6a,
-    0x57,
-    0x23,
-    0xb8,
-    0xfa,
-    0x60,
-    0x1a,
-    0xda,
-    0xc2,
-    0xc0,
-    0x17,
-    0xce,
-    0x66,
-    0x98,
-    0x83,
-    0xe9,
-    0x33,
-    0x10,
-    0xba,
-    0xa9,
-    0x06,
-    0xa6,
-    0x10,
-    0xa3,
-    0x69,
-    0xc6,
-    0x12,
-    0xbc,
-    0x00,
-    0x9a,
-    0x0e,
-    0x9c,
-    0x24,
-    0x23,
-    0xd5,
-    0x60,
-    0xcd,
-    0x89,
-    0xbf,
-    0x8f,
-    0xb5,
-    0xaf,
-    0xf0,
-    0x50,
-    0xba,
-    0x0b,
-    0xda,
-    0xda,
-    0x84,
-    0xb5,
-    0x03,
-    0x2b,
-    0x69,
-    0xbd,
-    0x08,
-    0xfd,
-    0x8d,
-    0xc2,
-    0xe3,
-    0xf6,
-    0x4e,
-    0xc0,
-    0x69,
-    0x1f,
-    0xdf,
-    0x2a,
-    0x16,
-    0x97,
-    0x32,
-    0x39,
-    0x0d,
-    0x89,
-    0x1c,
-    0x83,
-    0x5b,
-    0x5b,
-    0xb4,
-    0xcf,
-    0x7c,
-    0x28,
-    0xfc,
-    0x28,
-    0x20,
-    0x71,
-    0xc3,
-    0x30,
-    0x2f,
-    0x0f,
-    0xc9,
-    0xb7,
-    0x0a,
-    0x6c,
-    0x25,
-    0x8c,
-    0x14,
-    0xf3,
-    0xe4,
-    0x93,
-    0x71,
-    0xc5,
-    0xf3,
-    0x18,
-    0x0d,
-    0xae,
-    0x3f,
-    0x63,
-    0xe0,
-    0x57,
-    0x1a,
-    0x8d,
-    0x71,
-    0xbd,
-    0xe1,
-    0x92,
-    0x99,
-    0xe1,
-    0xdb,
-    0xa6,
-    0x8a,
-    0xc2,
-    0x65,
-    0xcd,
-    0x0f,
-    0x88,
-    0x4c,
-    0xa6,
-    0x16,
-    0x02,
-    0x7b,
-    0x87,
-    0x6b,
-    0x52,
-    0xd6,
-    0xcf,
-    0xc6,
-    0xe7,
-    0x65,
-    0x78,
-    0x08,
-    0xac,
-    0xb5,
-    0xec,
-    0xc2,
-    0x7f,
-    0x7b,
-    0x1a,
-    0xf7,
-    0xe5,
-    0x7b,
-    0xc8,
-    0x23,
-    0xfc,
-    0xa8,
-    0x2b,
-    0x7b,
-    0xb1,
-    0x8d,
-    0xb5,
-    0x77,
-    0x32,
-    0xeb,
-    0x2e,
-    0x8e,
-    0xa7,
-    0xa4,
-    0x06,
-    0x40,
-    0x1d,
-    0xd7,
-    0xea,
-    0x5a,
-    0xc2,
-    0x4d,
-    0x95,
-    0x76,
-    0x58,
-    0x14,
-    0xe9,
-    0xc1,
-    0xe4,
-    0x69,
-    0x3e,
-    0x01,
-    0xa6,
-    0xdc,
-    0xfa,
-    0xd6,
-    0x4e,
-    0xae,
-    0x61,
-    0x3f,
-    0x6d,
-    0x7e,
-    0xaf,
-    0x61,
-    0x2a,
-    0x24,
-    0x64,
-    0x84,
-    0x36,
-    0xde,
-    0xe0,
-    0x5f,
-    0x02,
-    0xaa,
-    0x2f,
-    0x95,
-    0x2f,
-    0xf2,
-    0x26,
-    0x7f,
-    0x46,
-    0x6e,
-    0xaf,
-    0x2c,
-    0xa9,
-    0x47,
-    0x61,
-    0xa6,
-    0xc9,
-    0x78,
-    0x54,
-    0x77,
-    0x9a,
-    0x7a,
-    0x33,
-    0x6c,
-    0x44,
-    0x20,
-    0x92,
-    0x99,
-    0x1c,
-    0xc0,
-    0x82,
-    0x9d,
-    0xd2,
-    0x93,
-    0x63,
-    0x28,
-    0xeb,
-    0x5e,
-    0xfa,
-    0xba,
-    0x72,
-    0x52,
-    0xc4,
-    0xad,
-    0xeb,
-    0x31,
-    0x89,
-    0x75,
-    0x89,
-    0xb3,
-    0x33,
-    0x27,
-    0xa1,
-    0x28,
-    0xe1,
-    0x38,
-    0x5d,
-    0x5e,
-    0x38,
-    0x87,
-    0xb5,
-    0xc5,
-    0xf9,
-    0x9e,
-    0x9b,
-    0xd1,
-    0xd9,
-    0x35,
-    0x76,
-    0xa0,
-    0x8d,
-    0xf8,
-    0xd2,
-    0xdd,
-    0x24,
-    0x8b,
-    0x56,
-    0xe4,
-    0x99,
-    0xca,
-    0xf6,
-    0x27,
-    0xa9,
-    0x55,
-    0x6a,
-    0xd0,
-    0xe2,
-    0x4c,
-    0xde,
-    0xa8,
-    0xfd,
-    0x57,
-    0xeb,
-    0x37,
-    0x6d,
-    0xea,
-    0xc6,
-    0x2d,
-    0x38,
-    0xc7,
-    0xb7,
-    0x00,
-    0x06,
-    0xc4,
-    0xcd,
-    0xd7,
-    0x77,
-    0xce,
-    0xd1,
-    0xa7,
-    0xba,
-    0x2e,
-    0x78,
-    0x9b,
-    0x5c,
-    0x0b,
-    0xdc,
-    0xba,
-    0x5d,
-    0x30,
-    0x2d,
-    0xc4,
-    0x89,
-    0x10,
-    0xa4,
-    0x5c,
-    0x05,
-    0x07,
-    0xb9,
-    0x6c,
-    0x29,
-    0xe3,
-    0x96,
-    0xc6,
-    0x8d,
-    0xa3,
-    0xcb,
-    0x07,
-    0x67,
-    0x7f,
-    0x43,
-    0xc1,
-    0x14,
-    0x28,
-    0x77,
-    0xd9,
-    0xf4,
-    0x50,
-    0xe1,
-    0x2d,
-    0x7b,
-    0x6d,
-    0xb4,
-    0x7a,
-    0x85,
-    0xba,
-    0xca,
-    0x7e,
-    0xea,
-    0x7f,
-    0xde,
-    0x59,
-    0x53,
-    0x93,
-    0xfb,
-    0x39,
-    0x4c,
-    0x1f,
-    0x34,
-    0x36,
-    0x9a,
-    0xa4,
-    0x96,
-    0x7b,
-    0xce,
-    0x40,
-    0x5b,
-    0xa7,
-    0x1a,
-    0x2d,
-    0x60,
-    0x73,
-    0x64,
-    0x8a,
-    0xda,
-    0x94,
-    0x99,
-    0x5e,
-    0x44,
-    0xe3,
-    0x44,
-    0xda,
-    0x9c,
-    0xbb,
-    0x5f,
-    0xde,
-    0xce,
-    0xa2,
-    0x68,
-    0xbf,
-    0x71,
-    0x2c,
-    0xb8,
-    0x48,
-    0xb1,
-    0x1d,
-    0x11,
-    0xfe,
-    0x8c,
-    0xce,
-    0x76,
-    0xa8,
-    0x42,
-    0xd2,
-    0x3f,
-    0x0f,
-    0x06,
-    0xd8,
-    0x6c,
-    0x03,
-    0xfa,
-    0xd3,
-    0x3a,
-    0x9e,
-    0x5a,
-    0x59,
-    0xf4,
-    0xcd,
-    0xf7,
-    0x49,
-    0x0c,
-    0x0b,
-    0xe8,
-    0xb1,
-    0x6a,
-    0x70,
-    0x7c,
-    0xef,
-    0x04,
-    0xeb,
-    0x73,
-    0x16,
-    0xaf,
-    0xcc,
-    0x6d,
-    0x93,
-    0x34,
-    0x85,
-    0xa2,
-    0x10,
-    0xa7,
-    0xb1,
-    0xd4,
-    0x98,
-    0xf4,
-    0x55,
-    0x82,
-    0xfc,
-    0xbb,
-    0x66,
-    0x5f,
-    0x76,
-    0x5e,
-    0x8c,
-    0x02,
-    0x8d,
-    0x58,
-    0x26,
-    0xdf,
-    0x38,
-    0xd0,
-    0x8e,
-    0x76,
-    0x46,
-    0x6d,
-    0x9e,
-    0xca,
-    0xfd,
-    0x6d,
-    0x73,
-    0x15,
-    0x02,
-    0xf1,
-    0x70,
-    0xba,
-    0x79,
-    0x9b,
-    0x86,
-    0x7b,
-    0x6c,
-    0x5b,
-    0xb3,
-    0xec,
-    0x71,
-    0x86,
-    0xc9,
-    0x27,
-    0x87,
-    0x29,
-    0x71,
-    0xc2,
-    0x42,
-    0x9c,
-    0x6f,
-    0xfe,
-    0x28,
-    0x5a,
-    0x28,
-    0x41,
-    0x5a,
-    0x0f,
-    0x61,
-    0xc7,
-    0x77,
-    0xf3,
-    0x49,
-    0x94,
-    0xbd,
-    0x57,
-    0xba,
-    0xad,
-    0x71,
-    0x7d,
-    0xbc,
-    0x87,
-    0x81,
-    0xad,
-    0x4b,
-    0xc0,
-    0x69,
-    0x85,
-    0x5a,
-    0x0d,
-    0x53,
-    0x91,
-    0x17,
-    0x74,
-    0x82,
-    0x1c,
-    0x71,
-    0xbb,
-    0xf0,
-    0x45,
-    0xd7,
-    0x20,
-    0x36,
-    0x55,
-    0x43,
-    0x4a,
-    0xad,
-    0x4f,
-    0x78,
-    0x80,
-    0xd3,
-    0xc9,
-    0x88,
-    0x19,
-    0xf0,
-    0xfb,
-    0x98,
-    0x33,
-    0xf9,
-    0x16,
-    0xe7,
-    0xa8,
-    0xb4,
-    0xd7,
-    0x0d,
-    0x3e,
-    0x1d,
-    0x5b,
-    0x81,
-    0x1e,
-    0x09,
-    0x35,
-    0x5e,
-    0x88,
-    0x09,
-    0xbe,
-    0x67,
-    0xc4,
-    0x91,
-    0xac,
-    0x48,
-    0x5c,
-    0x59,
-    0xe6,
-    0x1f,
-    0x88,
-    0x04,
-    0x97,
-    0x3a,
-    0xea,
-    0x00,
-    0x81,
-    0x22,
-    0x7b,
-    0xad,
-    0x95,
-    0xd9,
-    0xc6,
-    0xc1,
-    0xc0,
-    0x61,
-    0x54,
-    0xeb,
-    0x07,
-    0x7d,
-    0x67,
-    0xb6,
-    0xd6,
-    0xbc,
-    0xeb,
-    0xb1,
-    0x95,
-    0xb2,
-    0xa9,
-    0xcd,
-    0x7d,
-    0x89,
-    0xbe,
-    0x06,
-    0xaa,
-    0xb9,
-    0x4b,
-    0x45,
-    0x71,
-    0x13,
-    0x6f,
-    0x85,
-    0xf3,
-    0x04,
-    0x72,
-    0x35,
-    0xf2,
-    0x18,
-    0x43,
-    0xde,
-    0xe4,
-    0xbd,
-    0x25,
-    0x06,
-    0x46,
-    0x4a,
-    0xa5,
-    0x54,
-    0x33,
-    0x3f,
-    0xcf,
-    0xf5,
-    0x35,
-    0xce,
-    0xa1,
-    0x3d,
-    0x5b,
-    0x9b,
-    0xc0,
-    0x92,
-    0x8c,
-    0xc1,
-    0x6a,
-    0x86,
-    0x1a,
-    0x15,
-    0xac,
-    0x43,
-    0x9a,
-    0xae,
-    0xd5,
-    0x2c,
-    0xf4,
-    0xa5,
-    0x2a,
-    0xc1,
-    0xb6,
-    0x19,
-    0xdb,
-    0xc3,
-    0xae,
-    0x76,
-    0x36,
-    0x99,
-    0xb7,
-    0xf7,
-    0x1b,
-    0xf3,
-    0xd3,
-    0x6a,
-    0xb0,
-    0xad,
-    0x7a,
-    0x34,
-    0x55,
-    0xf6,
-    0x32,
-    0x94,
-    0xdb,
-    0xb1,
-    0x60,
-    0x2c,
-    0xf0,
-    0x1b,
-    0x5e,
-    0xbd,
-    0xde,
-    0xaf,
-    0xcd,
-    0x32,
-    0x76,
-    0x47,
-    0x2d,
-    0xe0,
-    0x46,
-    0x83,
-    0xab,
-    0x0c,
-    0x13,
-    0x6e,
-    0x39,
-    0xad,
-    0x83,
-    0x5f,
-    0xe4,
-    0x74,
-    0x19,
-    0x1e,
-    0x62,
-    0x0a,
-    0x66,
-    0x48,
-    0xeb,
-    0x99,
-    0x7e,
-    0xf5,
-    0x4b,
-    0x8d,
-    0xaa,
-    0x97,
-    0x34,
-    0x9c,
-    0x5c,
-    0x26,
-    0xd8,
-    0x03,
-    0x68,
-    0x7a,
-    0xb7,
-    0x13,
-    0x70,
-    0xf8,
-    0xb6,
-    0xed,
-    0xa0,
-    0x70,
-    0x72,
-    0x8a,
-    0x9c,
-    0x46,
-    0xd3,
-    0xfe,
-    0xb7,
-    0xd0,
-    0xe4,
-    0xfd,
-    0x66,
-    0x00,
-    0xe2,
-    0x9e,
-    0xf4,
-    0x43,
-    0x93,
-    0x5f,
-    0x77,
-    0xa8,
-    0xd8,
-    0x69,
-    0x02,
-    0x45,
-    0x86,
-    0x16,
-    0x1c,
-    0xd7,
-    0x72,
-    0xb1,
-    0x71,
-    0xa8,
-    0xcb,
-    0x7d,
-    0xc8,
-    0xb6,
-    0xad,
-    0xf8,
-    0x35,
-    0x11,
-    0xf2,
-    0x60,
-    0x90,
-    0x85,
-    0x4c,
-    0x77,
-    0x25,
-    0x79,
-    0x91,
-    0x84,
-    0xad,
-    0x17,
-    0x55,
-    0x9a,
-    0x7e,
-    0xad,
-    0xbe,
-    0x1c,
-    0xfe,
-    0x53,
-    0x94,
-    0x81,
-    0x5d,
-    0xcf,
-    0x98,
-    0x55,
-    0x84,
-    0xb5,
-    0x17,
-    0x80,
-    0x48,
-    0xd3,
-    0xbe,
-    0xcb,
-    0xe4,
-    0xcb,
-    0xb0,
-    0xa0,
-    0xa6,
-    0x02,
-    0xd6,
-    0x11,
-    0xe8,
-    0xb9,
-    0x76,
-    0x1d,
-    0x42,
-    0x7a,
-    0x08,
-    0x2e,
-    0xfe,
-    0xb6,
-    0x45,
-    0xe5,
-    0xcc,
-    0xac,
-    0x80,
-    0x1a,
-    0xb7,
-    0x8c,
-    0x39,
-    0x1f,
-    0x58,
-    0xdd,
-    0xf0,
-    0x45,
-    0x4a,
-    0x1c,
-    0x37,
-    0xa2,
-    0xde,
-    0xa6,
-    0x0b,
-    0x11,
-    0x0f,
-    0xd8,
-    0x64,
-    0x79,
-    0xb8,
-    0x74,
-    0x0b,
-    0x53,
-    0x04,
-    0x46,
-    0xac,
-    0x66,
-    0x26,
-    0x08,
-    0x2c,
-    0xd5,
-    0x4b,
-    0x84,
-    0x3c,
-    0x5c,
-    0xcd,
-    0xf8,
-    0x2f,
-    0xd7,
-    0xaa,
-    0xbe,
-    0x08,
-    0x04,
-    0x34,
-    0x2c,
-    0xd8,
-    0x89,
-    0x0a,
-    0xba,
-    0x47,
-    0x39,
-    0x46,
-    0x62,
-    0x70,
-    0x93,
-    0xf8,
-    0x4d,
-    0xf2,
-    0x8b,
-    0xd4,
-    0xab,
-    0x43,
-    0x8e,
-    0x27,
-    0xe3,
-    0x48,
-    0xc0,
-    0x10,
-    0xec,
-    0x23,
-    0x88,
-    0xec,
-    0xfa,
-    0x4d,
-    0x4e,
-    0x12,
-    0x5e,
-    0xe4,
-    0x83,
-    0xc1,
-    0xa7,
-    0x46,
-    0xe2,
-    0x56,
-    0x0e,
-    0xde,
-    0xf6,
-    0xc2,
-    0x11,
-    0x3e,
-    0xdd,
-    0x3c,
-    0x5d,
-    0x6e,
-    0x4b,
-    0x33,
-    0xf1,
-    0x84,
-    0xd2,
-    0x87,
-    0x81,
-    0x75,
-    0x60,
-    0xf8,
-    0x18,
-    0x2b,
-    0x09,
-    0xdf,
-    0x02,
-    0xd8,
-    0x06,
-    0x1c,
-    0xe9,
-    0x89,
-    0xfe,
-    0x4f,
-    0x3e,
-    0xfe,
-    0x85,
-    0x4b,
-    0xdb,
-    0xb9,
-    0xe3,
-    0xc7,
-    0xe6,
-    0x55,
-    0x16,
-    0x57,
-    0xf8,
-    0x19,
-    0x1a,
-    0x9b,
-    0x7e,
-    0xcd,
-    0x67,
-    0xb6,
-    0x60,
-    0xcc,
-    0xbc,
-    0x02,
-    0xe1,
-    0x5b,
-    0x1b,
-    0x03,
-    0xc7,
-    0x39,
-    0x14,
-    0x99,
-    0xbb,
-    0x78,
-    0x47,
-    0x79,
-    0xf2,
-    0x8a,
-    0x25,
-    0xdd,
-    0x0d,
-    0x9f,
-    0xf6,
-    0x7b,
-    0x3e,
-    0x2f,
-    0x20,
-    0xb4,
-    0xad,
-    0xd2,
-    0xa6,
-    0x0f,
-    0x1a,
-    0x58,
-    0xef,
-    0xe5,
-    0xc3,
-    0x16,
-    0xc9,
-    0x5e,
-    0x88,
-    0x7e,
-    0xad,
-    0x9c,
-    0x4d,
-    0xf3,
-    0x45,
-    0x35,
-    0xa0,
-    0xdb,
-    0x2b,
-    0xe7,
-    0x9b,
-    0xf5,
-    0xf4,
-    0x87,
-    0x0c,
-    0xec,
-    0x6d,
-    0x3b,
-    0xd4,
-    0x2d,
-    0x24,
-    0xe9,
-    0x8d,
-    0xf6,
-    0x2a,
-    0xef,
-    0x70,
-    0xb0,
-    0x18,
-    0x15,
-    0x75,
-    0x7f,
-    0x50,
-    0xbf,
-    0xbb,
-    0x17,
-    0x85,
-    0x68,
-    0x2b,
-    0xd1,
-    0x7e,
-    0x4b,
-    0x59,
-    0xfe,
-    0x16,
-    0x63,
-    0xaa,
-    0x7b,
-    0x88,
-    0x96,
-    0xbc,
-    0x86,
-    0xe9,
-    0x2e,
-    0x02,
-    0xcf,
-    0xf6,
-    0x88,
-    0xaf,
-    0xd2,
-    0x10,
-    0x10,
-    0xd6,
-    0x65,
-    0x85,
-    0x6d,
-    0xcf,
-    0x8d,
-    0x11,
-    0xf8,
-    0xdc,
-    0x96,
-    0xa5,
-    0x73,
-    0x0c,
-    0x63,
-    0x66,
-    0xf8,
-    0x60,
-    0x02,
-    0xf9,
-    0x2f,
-    0x2d,
-    0x83,
-    0xfe,
-    0xc4,
-    0xc1,
-    0x0b,
-    0xda,
-    0x18,
-    0x49,
-    0x24,
-    0xba,
-    0x37,
-    0xf3,
-    0x57,
-    0xd5,
-    0x0b,
-    0x4f,
-    0xfd,
-    0xf1,
-    0xcf,
-    0xfb,
-    0x52,
-    0x28,
-    0xc5,
-    0x7f,
-    0xcb,
-    0xec,
-    0x2c,
-    0x76,
-    0xaa,
-    0x49,
-    0x6d,
-    0xef,
-    0xcf,
-    0x6a,
-    0x95,
-    0x12,
-    0xd1,
-    0x5f,
-    0x07,
-    0x07,
-    0x4d,
-    0x1d,
-    0x73,
-    0x13,
-    0x7e,
-    0xc6,
-    0x02,
-    0x04,
-    0x0e,
-    0x2b,
-    0xd3,
-    0xd0,
-    0x2c,
-    0x90,
-    0xab,
-    0x79,
-    0xdf,
-    0xaf,
-    0xe8,
-    0x33,
-    0x9a,
-    0xff,
-    0xb7,
-    0xc9,
-    0x10,
-    0x35,
-    0x87,
-    0x3d,
-    0x49,
-    0x0b,
-    0xbe,
-    0xaf,
-    0xf6,
-    0x41,
-    0xaa,
-    0x7f,
-    0x02,
-    0xe2,
-    0xba,
-    0xb6,
-    0x69,
-    0xc9,
-    0xee,
-    0xa2,
-    0x4d,
-    0x63,
-    0x8c,
-    0xc1,
-    0x47,
-    0xb7,
-    0x15,
-    0xe1,
-    0xfb,
-    0xa3,
-    0x77,
-    0x84,
-    0xef,
-    0x68,
-    0x84,
-    0x89,
-    0x9d,
-    0x69,
-    0xa3,
-    0x09,
-    0xc6,
-    0x2f,
-    0xc5,
-    0x80,
-    0x0a,
-    0xb1,
-    0x9b,
-    0x2d,
-    0xb6,
-    0xd2,
-    0x07,
-    0xbb,
-    0xdd,
-    0x2c,
-    0xd0,
-    0x20,
-    0xaa,
-    0x0c,
-    0x99,
-    0xc6,
-    0xf4,
-    0xbd,
-    0x14,
-    0xe8,
-    0x13,
-    0x0a,
-    0x73,
-    0x40,
-    0xf2,
-    0xfe,
-    0x1f,
-    0xdf,
-    0x66,
-    0xee,
-    0xad,
-    0x5c,
-    0xbe,
-    0xba,
-    0x0e,
-    0x30,
-    0x9c,
-    0x4f,
-    0x05,
-    0x61,
-    0x03,
-    0x70,
-    0xde,
-    0x5e,
-    0xb0,
-    0xb7,
-    0x5e,
-    0x2a,
-    0xae,
-    0xd6,
-    0xf6,
-    0xbd,
-    0x25,
-    0x23,
-    0x3b,
-    0xa8,
-    0x73,
-    0x54,
-    0x9b,
-    0xf7,
-    0x7d,
-    0x86,
-    0x48,
-    0x5b,
-    0x47,
-    0x85,
-    0x79,
-    0x89,
-    0xc3,
-    0x47,
-    0xd2,
-    0xdd,
-    0xe7,
-    0xb9,
-    0x20,
-    0x43,
-    0x02,
-    0xbf,
-    0x4a,
-    0x57,
-    0x50,
-    0x75,
-    0x85,
-    0xcb,
-    0xcc,
-    0xbc,
-    0xc6,
-    0x09,
-    0x45,
-    0xf2,
-    0x7d,
-    0x1a,
-    0xb4,
-    0x00,
-    0x80,
-    0xc7,
-    0xcd,
-    0x9a,
-    0x45,
-    0xfe,
-    0xd4,
-    0xc2,
-    0x55,
-    0x77,
-    0xb2,
-    0x8e,
-    0xfd,
-    0x96,
-    0x48,
-    0x2c,
-    0x47,
-    0x94,
-    0x03,
-    0x23,
-    0x29,
-    0xda,
-    0xb1,
-    0xdb,
-    0xfb,
-    0xad,
-    0x93,
-    0x60,
-    0x2e,
-    0x10,
-    0xb3,
-    0x63,
-    0x3c,
-    0xe6,
-    0x77,
-    0x82,
-    0xdb,
-    0x58,
-    0x77,
-    0xc9,
-    0x76,
-    0x76,
-    0x8c,
-    0x78,
-    0xdd,
-    0x21,
-    0x29,
-    0x06,
-    0x3c,
-    0x28,
-    0xef,
-    0x67,
-    0x4a,
-    0xb1,
-    0x7b,
-    0x8b,
-    0xc2,
-    0xdb,
-    0x83,
-    0x27,
-    0x17,
-    0xa1,
-    0x21,
-    0xb7,
-    0x64,
-    0x02,
-    0x6e,
-    0xc4,
-    0xa1,
-    0x5e,
-    0x53,
-    0x62,
-    0x1d,
-    0x24,
-    0x9c,
-    0xfe,
-    0x28,
-    0xaa,
-    0x4e,
-    0x56,
-    0x10,
-    0x5c,
-    0x3b,
-    0xc9,
-    0x50,
-    0x19,
-    0xd3,
-    0xd1,
-    0x03,
-    0xda,
-    0x3d,
-    0xce,
-    0x9f,
-    0x95,
-    0xa7,
-    0x05,
-    0xdf,
-    0x61,
-    0xda,
-    0xe8,
-    0x01,
-    0xda,
-    0x11,
-    0x98,
-    0x32,
-    0xc7,
-    0x0b,
-    0xa8,
-    0x47,
-    0xfa,
-    0x5f,
-    0x24,
-    0xad,
-    0x78,
-    0x10,
-    0xd1,
-    0xa3,
-    0xda,
-    0x61,
-    0xb7,
-    0xa6,
-    0xf3,
-    0xea,
-    0xdd,
-    0x2d,
-    0xb3,
-    0xec,
-    0x54,
-    0x97,
-    0x4b,
-    0xe2,
-    0x76,
-    0x62,
-    0x92,
-    0x58,
-    0x70,
-    0x9d,
-    0xa8,
-    0x00,
-    0xfe,
-    0xa0,
-    0xd9,
-    0x03,
-    0x76,
-    0xfa,
-    0xc4,
-    0x95,
-    0x08,
-    0xab,
-    0xbc,
-    0xcc,
-    0x44,
-    0x94,
-    0x6e,
-    0xb2,
-    0xdc,
-    0x2b,
-    0xc4,
-    0x99,
-    0xac,
-    0x73,
-    0x0a,
-    0xae,
-    0xf7,
-    0x2c,
-    0x50,
-    0xd1,
-    0xf4,
-    0x46,
-    0x0f,
-    0xa4,
-    0x89,
-    0x9c,
-    0x0f,
-    0xe2,
-    0x56,
-    0xdf,
-    0x87,
-    0xf3,
-    0xf5,
-    0xd0,
-    0x87,
-    0xbd,
-    0x80,
-    0xb3,
-    0x93,
-    0xbc,
-    0x54,
-    0x00,
-    0x90,
-    0x55,
-    0x15,
-    0x5b,
-    0xe5,
-    0x67,
-    0xf3,
-    0xc6,
-    0xda,
-    0x24,
-    0x2b,
-    0x16,
-    0x43,
-    0x1f,
-    0xd0,
-    0xa3,
-    0x63,
-    0xa5,
-    0xcb,
-    0x44,
-    0x0b,
-    0x51,
-    0x21,
-    0x7b,
-    0x02,
-    0xdb,
-    0x74,
-    0xec,
-    0xa9,
-    0x31,
-    0xcd,
-    0x14,
-    0xdf,
-    0xc9,
-    0x98,
-    0x37,
-    0x23,
-    0x35,
-    0xf0,
-    0x9a,
-    0xf8,
-    0xf8,
-    0x1d,
-    0xf3,
-    0x8e,
-    0x98,
-    0x5b,
-    0x1e,
-    0x9e,
-    0xf4,
-    0xdd,
-    0x11,
-    0x96,
-    0xd8,
-    0x12,
-    0x12,
-    0xf6,
-    0xcf,
-    0x27,
-    0x28,
-    0xfa,
-    0x38,
-    0xcd,
-    0xcf,
-    0x79,
-    0x9c,
-    0x3c,
-    0xef,
-    0x0d,
-    0x3f,
-    0x78,
-    0x0f,
-    0x74,
-    0xf5,
-    0xd3,
-    0xc6,
-    0x36,
-    0x37,
-    0xb3,
-    0x73,
-    0x88,
-    0x76,
-    0x95,
-    0x2e,
-    0x71,
-    0xaf,
-    0x52,
-    0xff,
-    0x2b,
-    0x40,
-    0xa1,
-    0x4d,
-    0xcc,
-    0xfa,
-    0xde,
-    0x99,
-    0x26,
-    0x77,
-    0x0a,
-    0x6c,
-    0xeb,
-    0xae,
-    0x12,
-    0x8d,
-    0x15,
-    0xc4,
-    0x54,
-    0x78,
-    0x84,
-    0x26,
-    0x5f,
-    0x0c,
-    0xe9,
-    0xd4,
-    0xfa,
-    0x84,
-    0xe4,
-    0x00,
-    0x69,
-    0xa8,
-    0x69,
-    0xd7,
-    0xeb,
-    0x44,
-    0x68,
-    0x9f,
-    0x87,
-    0xda,
-    0xad,
-    0x02,
-    0x08,
-    0x94,
-    0x05,
-    0xa9,
-    0x47,
-    0x7c,
-    0xa2,
-    0x0d,
-    0xa8,
-    0xef,
-    0xc0,
-    0x8a,
-    0xe7,
-    0x4f,
-    0x89,
-    0xb6,
-    0x15,
-    0xf9,
-    0x36,
-    0xf0,
-    0xdd,
-    0x77,
-    0x78,
-    0x3c,
-    0x0c,
-    0xf6,
-    0x16,
-    0x4e,
-    0x51,
-    0xfa,
-    0xd7,
-    0xe4,
-    0x40,
-    0x50,
-    0xa2,
-    0x59,
-    0x9d,
-    0x45,
-    0xe4,
-    0x77,
-    0xd8,
-    0x15,
-    0x32,
-    0x8e,
-    0xd4,
-    0xa6,
-    0x30,
-    0xc2,
-    0xec,
-    0x76,
-    0xb1,
-    0xa9,
-    0x38,
-    0xd2,
-    0x1f,
-    0x16,
-    0x0c,
-    0x4a,
-    0x1e,
-    0x2f,
-    0xc2,
-    0x61,
-    0x6c,
-    0xc6,
-    0xba,
-    0x89,
-    0x0b,
-    0xe6,
-    0x9e,
-    0x4e,
-    0xa3,
-    0xab,
-    0xeb,
-    0xd1,
-    0x22,
-    0x57,
-    0xad,
-    0x78,
-    0xa5,
-    0xa3,
-    0x8a,
-    0xe4,
-    0x9b,
-    0x53,
-    0x01,
-    0x23,
-    0x27,
-    0x0d,
-    0xf4,
-    0x27,
-    0xc7,
-    0x6b,
-    0x64,
-    0x77,
-    0x34,
-    0x4f,
-    0x7d,
-    0x25,
-    0x89,
-    0x77,
-    0xd2,
-    0x00,
-    0xa6,
-    0x51,
-    0xe9,
-    0x0a,
-    0xd7,
-    0x10,
-    0xfa,
-    0x2d,
-    0xb1,
-    0xff,
-    0xf4,
-    0x29,
-    0x3d,
-    0x15,
-    0xc1,
-    0xd1,
-    0x59,
-    0xca,
-    0xcb,
-    0x77,
-    0x5a,
-    0x2a,
-    0xbf,
-    0xa5,
-    0xf6,
-    0x28,
-    0x91,
-    0x0e,
-    0x62,
-    0x34,
-    0xc0,
-    0xc3,
-    0xb7,
-    0x10,
-    0xdb,
-    0xaa,
-    0x9a,
-    0xdf,
-    0x44,
-    0x2d,
-    0x1c,
-    0x7f,
-    0x34,
-    0x2f,
-    0xdf,
-    0x18,
-    0xff,
-    0x44,
-    0x7b,
-    0xf5,
-    0x99,
-    0x21,
-    0x1f,
-    0x93,
-    0x59,
-    0x51,
-    0x7c,
-    0xf8,
-    0xfe,
-    0x2a,
-    0xde,
-    0x46,
-    0xf0,
-    0x00,
-    0x9c,
-    0x90,
-    0xc8,
-    0x98,
-    0xb3,
-    0xec,
-    0x11,
-    0xdf,
-    0xae,
-    0xca,
-    0x50,
-    0xdc,
-    0xc9,
-    0x84,
-    0x43,
-    0xe4,
-    0x55,
-    0x36,
-    0x67,
-    0x0d,
-    0x5e,
-    0xcf,
-    0xbc,
-    0xe5,
-    0x8c,
-    0x68,
-    0xcc,
-    0x63,
-    0x47,
-    0xd5,
-    0xea,
-    0x1d,
-    0x1e,
-    0x7a,
-    0xb8,
-    0xbc,
-    0x6a,
-    0x60,
-    0xec,
-    0xad,
-    0x2e,
-    0x89,
-    0x53,
-    0x1a,
-    0x42,
-    0x80,
-    0x16,
-    0x19,
-    0xb1,
-    0x33,
-    0x3c,
-    0x23,
-    0x5f,
-    0x05,
-    0x70,
-    0xc7,
-    0xef,
-    0x20,
-    0x04,
-    0x9f,
-    0xe3,
-    0x08,
-    0x37,
-    0x84,
-    0x05,
-    0x76,
-    0xb3,
-    0xfe,
-    0x06,
-    0x63,
-    0x5a,
-    0xfe,
-    0x66,
-    0x63,
-    0x42,
-    0xd0,
-    0x93,
-    0x34,
-    0xfe,
-    0x4b,
-    0x55,
-    0x97,
-    0x20,
-    0x4b,
-    0x69,
-    0x5e,
-    0xfb,
-    0x61,
-    0x6d,
-    0xc7,
-    0xae,
-    0xc8,
-    0xfc,
-    0x08,
-    0x5e,
-    0x9b,
-    0x19,
-    0x2b,
-    0xc2,
-    0x46,
-    0xd1,
-    0x1c,
-    0xe5,
-    0x3b,
-    0x1c,
-    0x01,
-    0x27,
-    0xe6,
-    0x05,
-    0xc9,
-    0x85,
-    0xe2,
-    0x0a,
-    0x08,
-    0x1b,
-    0x6d,
-    0xc6,
-    0x02,
-    0xe7,
-    0x19,
-    0xcd,
-    0x05,
-    0xd0,
-    0xc5,
-    0xd8,
-    0xfd,
-    0xe7,
-    0xcc,
-    0x22,
-    0x42,
-    0xec,
-    0x7c,
-    0x11,
-    0xb4,
-    0x14,
-    0xca,
-    0x19,
-    0x0a,
-    0x09,
-    0x43,
-    0xde,
-    0x67,
-    0x33,
-    0x46,
-    0x98,
-    0x2e,
-    0x36,
-    0x71,
-    0xbc,
-    0x18,
-    0xbc,
-    0x59,
-    0xd9,
-    0x84,
-    0x74,
-    0x7e,
-    0xbf,
-    0x0e,
-    0x5b,
-    0x7e,
-    0xe7,
-    0x62,
-    0x3a,
-    0x88,
-    0x0f,
-    0x53,
-    0x6f,
-    0x14,
-    0x25,
-    0x27,
-    0xf1,
-    0xd1,
-    0x66,
-    0x35,
-    0x8f,
-    0xdf,
-    0xc7,
-    0xb3,
-    0x78,
-    0x3f,
-    0x94,
-    0xc9,
-    0x00,
-    0x88,
-    0x57,
-    0xe9,
-    0xa1,
-    0xdb,
-    0xfb,
-    0x63,
-    0x40,
-    0x18,
-    0x31,
-    0x34,
-    0xb2,
-    0x52,
-    0x13,
-    0x1f,
-    0x7f,
-    0x81,
-    0x07,
-    0x00,
-    0xe6,
-    0x77,
-    0xe7,
-    0x5c,
-    0x21,
-    0x16,
-    0x5f,
-    0x3c,
-    0xea,
-    0xbf,
-    0x96,
-    0x3c,
-    0x3d,
-    0x0d,
-    0x10,
-    0xdf,
-    0x60,
-    0xc4,
-    0xd3,
-    0x25,
-    0x21,
-    0x04,
-    0xc8,
-    0x60,
-    0x5f,
-    0xc3,
-    0x65,
-    0x43,
-    0xcb,
-    0x7a,
-    0x89,
-    0x3c,
-    0xf0,
-    0x1d,
-    0xa7,
-    0x04,
-    0x71,
-    0x51,
-    0x27,
-    0x74,
-    0x92,
-    0xda,
-    0x09,
-    0x9a,
-    0xfa,
-    0x52,
-    0xcc,
-    0x0c,
-    0xb8,
-    0x21,
-    0x8e,
-    0x7c,
-    0x83,
-    0xa9,
-    0x74,
-    0x8d,
-    0x46,
-    0xc1,
-    0x4c,
-    0xe5,
-    0xdc,
-    0x65,
-    0x71,
-    0x83,
-    0x17,
-    0xab,
-    0xef,
-    0x53,
-    0x08,
-    0xf9,
-    0xe8,
-    0x00,
-    0x7a,
-    0x76,
-    0x37,
-    0x0a,
-    0xc0,
-    0xbe,
-    0x52,
-    0x18,
-    0xb1,
-    0xda,
-    0x75,
-    0x8f,
-    0xf0,
-    0x6f,
-    0xfd,
-    0x63,
-    0x71,
-    0x35,
-    0x12,
-    0x2e,
-    0x38,
-    0xab,
-    0x88,
-    0x7f,
-    0x64,
-    0x0a,
-    0x07,
-    0x74,
-    0x6d,
-    0x77,
-    0x6a,
-    0x8b,
-    0xaa,
-    0x7c,
-    0x66,
-    0xb5,
-    0x16,
-    0xb9,
-    0x6c,
-    0xac,
-    0x53,
-    0xd7,
-    0xd0,
-    0x87,
-    0xef,
-    0xbe,
-    0x2a,
-    0x8c,
-    0xe7,
-    0x08,
-    0xfd,
-    0x45,
-    0x69,
-    0xb5,
-    0x96,
-    0xd6,
-    0xde,
-    0x20,
-    0x37,
-    0x8d,
-    0x28,
-    0x31,
-    0x75,
-    0xbb,
-    0x28,
-    0xd5,
-    0xdf,
-    0xc2,
-    0x84,
-    0xab,
-    0xe0,
-    0x70,
-    0xa7,
-    0x01,
-    0xe7,
-    0x8b,
-    0x09,
-    0xfe,
-    0xc4,
-    0xad,
-    0xb0,
-    0x20,
-    0x56,
-    0x52
-  ],
-  const [
-    0x9c,
-    0xef,
-    0x28,
-    0x54,
-    0xf7,
-    0x87,
-    0x9c,
-    0x83,
-    0x0b,
-    0xa8,
-    0x61,
-    0xf6,
-    0xa9,
-    0x2e,
-    0xf7,
-    0x02,
-    0x5f,
-    0xb9,
-    0x8a,
-    0xec,
-    0xf1,
-    0x52,
-    0x0f,
-    0xac,
-    0x07,
-    0x51,
-    0x90,
-    0xf0,
-    0x24,
-    0x7d,
-    0xc4,
-    0x64,
-    0xd7,
-    0x76,
-    0xe3,
-    0x31,
-    0x35,
-    0x50,
-    0xb8,
-    0xc3,
-    0x86,
-    0x81,
-    0xf8,
-    0xd0,
-    0x3f,
-    0xfd,
-    0xd2,
-    0x96,
-    0x31,
-    0x9f,
-    0xc7,
-    0x64,
-    0xff,
-    0xcb,
-    0xbc,
-    0x5b,
-    0xd5,
-    0x52,
-    0x4e,
-    0x76,
-    0x57,
-    0x95,
-    0x65,
-    0xc8,
-    0xd8,
-    0xee,
-    0x0c,
-    0x05,
-    0xcd,
-    0x4b,
-    0x80,
-    0x44,
-    0x81,
-    0x1c,
-    0x86,
-    0x03,
-    0x0a,
-    0x70,
-    0x02,
-    0x6c,
-    0x7b,
-    0x5a,
-    0xc6,
-    0xd7,
-    0x5b,
-    0x9a,
-    0xa8,
-    0x8f,
-    0x56,
-    0x79,
-    0xd7,
-    0xd9,
-    0x33,
-    0xf5,
-    0x6f,
-    0x32,
-    0x06,
-    0x1e,
-    0x4a,
-    0xd9,
-    0xa7,
-    0xc0,
-    0x1a,
-    0x8d,
-    0x62,
-    0x42,
-    0xb4,
-    0x98,
-    0xf0,
-    0xce,
-    0xaf,
-    0x0c,
-    0xa6,
-    0xb3,
-    0x2e,
-    0x4d,
-    0xed,
-    0x07,
-    0xfa,
-    0xcf,
-    0xf2,
-    0x90,
-    0xd4,
-    0x21,
-    0x9f,
-    0xe5,
-    0x09,
-    0x2b,
-    0xc9,
-    0xd0,
-    0x46,
-    0xb4,
-    0xab,
-    0xf7,
-    0xae,
-    0x27,
-    0x93,
-    0xbb,
-    0x2a,
-    0x96,
-    0xdb,
-    0x61,
-    0x00,
-    0xff,
-    0x1b,
-    0x6f,
-    0xa8,
-    0xce,
-    0x9d,
-    0x59,
-    0xdb,
-    0xa4,
-    0x11,
-    0x5d,
-    0xec,
-    0x57,
-    0x82,
-    0xac,
-    0x5b,
-    0x3a,
-    0x89,
-    0xca,
-    0xa8,
-    0x9e,
-    0xc1,
-    0x37,
-    0x65,
-    0x98,
-    0x7a,
-    0x4f,
-    0x8f,
-    0x05,
-    0xb2,
-    0x6f,
-    0x1e,
-    0xcc,
-    0x41,
-    0x59,
-    0xdb,
-    0x63,
-    0x53,
-    0xda,
-    0x72,
-    0x95,
-    0x1b,
-    0xaa,
-    0xc8,
-    0x82,
-    0xc6,
-    0x93,
-    0x8e,
-    0xe7,
-    0xae,
-    0xd5,
-    0x17,
-    0x9f,
-    0xd1,
-    0xca,
-    0x66,
-    0x6a,
-    0x81,
-    0xc6,
-    0x8c,
-    0xee,
-    0x5d,
-    0x41,
-    0x31,
-    0xfb,
-    0x7f,
-    0x38,
-    0x70,
-    0x13,
-    0xf7,
-    0xd0,
-    0xe8,
-    0x2a,
-    0x78,
-    0x3d,
-    0x0f,
-    0xaa,
-    0x52,
-    0xe2,
-    0xca,
-    0xba,
-    0xa0,
-    0xb9,
-    0x3b,
-    0xc0,
-    0xc3,
-    0xf6,
-    0xda,
-    0x24,
-    0x0f,
-    0xe7,
-    0xc8,
-    0x58,
-    0xc3,
-    0x1f,
-    0x60,
-    0x15,
-    0x3f,
-    0xd3,
-    0x0e,
-    0xe7,
-    0x71,
-    0x84,
-    0x64,
-    0xeb,
-    0x91,
-    0xde,
-    0x6a,
-    0xd7,
-    0x0e,
-    0xe1,
-    0x36,
-    0x3c,
-    0xc8,
-    0x3e,
-    0xbd,
-    0x08,
-    0x7f,
-    0x04,
-    0xe9,
-    0x4f,
-    0x8b,
-    0x7b,
-    0xec,
-    0x4b,
-    0xce,
-    0x50,
-    0xd3,
-    0xa1,
-    0xe8,
-    0xf3,
-    0x5e,
-    0xe5,
-    0xa9,
-    0x3e,
-    0x0f,
-    0x61,
-    0xcc,
-    0x57,
-    0x81,
-    0x12,
-    0xe2,
-    0xd7,
-    0xfb,
-    0xf4,
-    0x8c,
-    0x2c,
-    0x45,
-    0x80,
-    0xed,
-    0x3c,
-    0xba,
-    0x72,
-    0x5f,
-    0x4a,
-    0x9f,
-    0xcf,
-    0x65,
-    0x1e,
-    0xb3,
-    0x27,
-    0xe2,
-    0x60,
-    0x07,
-    0x17,
-    0x88,
-    0x46,
-    0x10,
-    0x13,
-    0x92,
-    0x6f,
-    0xfb,
-    0x62,
-    0xb6,
-    0x0e,
-    0x40,
-    0x6a,
-    0x55,
-    0x4a,
-    0x7a,
-    0x2e,
-    0xf6,
-    0xe5,
-    0x76,
-    0x15,
-    0xf2,
-    0x1c,
-    0x8a,
-    0xed,
-    0x70,
-    0xcf,
-    0x28,
-    0x2f,
-    0x94,
-    0xe2,
-    0xb2,
-    0x85,
-    0xf4,
-    0xe3,
-    0x90,
-    0x89,
-    0x4c,
-    0xed,
-    0x81,
-    0xd0,
-    0x72,
-    0xcc,
-    0x2e,
-    0x27,
-    0x8c,
-    0x61,
-    0x05,
-    0x1c,
-    0x80,
-    0x48,
-    0x44,
-    0xc1,
-    0xac,
-    0xb9,
-    0x54,
-    0xac,
-    0xd8,
-    0xac,
-    0x59,
-    0x42,
-    0x68,
-    0x41,
-    0x07,
-    0x36,
-    0xd6,
-    0x5e,
-    0xb7,
-    0x4c,
-    0x60,
-    0x9a,
-    0xba,
-    0x63,
-    0xfe,
-    0x5a,
-    0xed,
-    0xb2,
-    0x97,
-    0x39,
-    0x8d,
-    0x52,
-    0x74,
-    0xae,
-    0x4d,
-    0xfc,
-    0xf5,
-    0xe9,
-    0xa6,
-    0x15,
-    0x83,
-    0xfd,
-    0x6f,
-    0xe7,
-    0xc5,
-    0x44,
-    0xad,
-    0x32,
-    0x17,
-    0xff,
-    0xac,
-    0xe3,
-    0x38,
-    0x3e,
-    0x4f,
-    0x23,
-    0x42,
-    0x00,
-    0xa4,
-    0x93,
-    0xe0,
-    0x9a,
-    0xbb,
-    0xd6,
-    0xbb,
-    0x5d,
-    0xb9,
-    0x51,
-    0x35,
-    0x73,
-    0x28,
-    0x2e,
-    0x5a,
-    0x0a,
-    0x91,
-    0xa7,
-    0x13,
-    0xb5,
-    0x4d,
-    0x81,
-    0x9d,
-    0x0e,
-    0x98,
-    0xd6,
-    0x3a,
-    0xa1,
-    0xe7,
-    0x18,
-    0x27,
-    0x05,
-    0x7c,
-    0x53,
-    0xcd,
-    0x4c,
-    0x37,
-    0xb2,
-    0x3b,
-    0x9e,
-    0xaf,
-    0x45,
-    0xd4,
-    0x20,
-    0x81,
-    0x01,
-    0x45,
-    0x1a,
-    0xe8,
-    0x09,
-    0xbb,
-    0x5a,
-    0x8e,
-    0x2c,
-    0x52,
-    0xd3,
-    0xa2,
-    0xae,
-    0xd0,
-    0x8a,
-    0x2b,
-    0x4b,
-    0x93,
-    0xb3,
-    0x9c,
-    0x79,
-    0xc8,
-    0x16,
-    0xa8,
-    0xee,
-    0xde,
-    0xb8,
-    0x57,
-    0x62,
-    0x3a,
-    0xb8,
-    0x5a,
-    0x96,
-    0x2d,
-    0x77,
-    0x9c,
-    0x95,
-    0x23,
-    0xfb,
-    0x19,
-    0x39,
-    0x1d,
-    0x96,
-    0xf3,
-    0xf2,
-    0x61,
-    0xc2,
-    0xc2,
-    0xc3,
-    0x6f,
-    0x50,
-    0x2c,
-    0x8d,
-    0x38,
-    0xc2,
-    0xb7,
-    0x90,
-    0x8b,
-    0xf5,
-    0xda,
-    0x2f,
-    0xd0,
-    0x03,
-    0x5a,
-    0xf3,
-    0xf8,
-    0x67,
-    0xd4,
-    0xd3,
-    0xb4,
-    0x62,
-    0x95,
-    0xb3,
-    0xe5,
-    0x9e,
-    0xb2,
-    0x2a,
-    0x54,
-    0x12,
-    0x56,
-    0x88,
-    0xa4,
-    0x25,
-    0x56,
-    0x18,
-    0x85,
-    0x16,
-    0x0b,
-    0xa2,
-    0x2a,
-    0x9b,
-    0x60,
-    0x34,
-    0xfc,
-    0xc8,
-    0x2a,
-    0x22,
-    0x90,
-    0x33,
-    0xb8,
-    0x4c,
-    0xd6,
-    0x56,
-    0xab,
-    0x9f,
-    0x94,
-    0x34,
-    0x08,
-    0xdf,
-    0x13,
-    0x40,
-    0x8c,
-    0xa3,
-    0x19,
-    0x7a,
-    0x40,
-    0xa1,
-    0x16,
-    0xdb,
-    0x4d,
-    0x2b,
-    0xa2,
-    0xf3,
-    0x10,
-    0xfa,
-    0x27,
-    0xd1,
-    0x71,
-    0x2b,
-    0xdb,
-    0x23,
-    0x71,
-    0x87,
-    0xf2,
-    0x9e,
-    0x03,
-    0x07,
-    0x11,
-    0xa0,
-    0x1d,
-    0x97,
-    0x05,
-    0x14,
-    0x0e,
-    0x1b,
-    0xb5,
-    0x97,
-    0x12,
-    0xb0,
-    0x55,
-    0xd8,
-    0x24,
-    0x34,
-    0xdd,
-    0x45,
-    0x13,
-    0x08,
-    0xba,
-    0xe4,
-    0xd8,
-    0x14,
-    0xc3,
-    0x7e,
-    0x27,
-    0x0c,
-    0x6e,
-    0x03,
-    0x44,
-    0xf2,
-    0x44,
-    0x2a,
-    0x18,
-    0xdd,
-    0x92,
-    0x58,
-    0x84,
-    0xf8,
-    0x62,
-    0xc3,
-    0xf5,
-    0xcd,
-    0xa9,
-    0xd7,
-    0x39,
-    0xc4,
-    0xc2,
-    0xd9,
-    0x91,
-    0xe6,
-    0x1b,
-    0xca,
-    0x07,
-    0xe7,
-    0x2f,
-    0x8e,
-    0x01,
-    0x64,
-    0xb4,
-    0x4d,
-    0x17,
-    0x69,
-    0x15,
-    0x1a,
-    0x22,
-    0x36,
-    0x22,
-    0xd2,
-    0x95,
-    0x43,
-    0x07,
-    0x47,
-    0x11,
-    0x81,
-    0x7a,
-    0x9e,
-    0x33,
-    0xe3,
-    0x39,
-    0xf6,
-    0xb1,
-    0x1d,
-    0xb4,
-    0x4b,
-    0xa5,
-    0xac,
-    0x06,
-    0x99,
-    0x28,
-    0x16,
-    0x2a,
-    0x44,
-    0x23,
-    0x73,
-    0x6c,
-    0xb7,
-    0x62,
-    0x2c,
-    0x1d,
-    0x4b,
-    0xea,
-    0x03,
-    0x8b,
-    0x6b,
-    0x8d,
-    0x53,
-    0x31,
-    0xf7,
-    0xbb,
-    0x99,
-    0x2a,
-    0xe5,
-    0x9b,
-    0x34,
-    0xec,
-    0x2e,
-    0x5a,
-    0x69,
-    0x32,
-    0xe8,
-    0xc4,
-    0xaa,
-    0x3a,
-    0xaf,
-    0x11,
-    0x18,
-    0x31,
-    0x4a,
-    0x01,
-    0x46,
-    0xec,
-    0x8c,
-    0x2b,
-    0x40,
-    0xd8,
-    0x77,
-    0x91,
-    0xcc,
-    0x34,
-    0xa8,
-    0x79,
-    0xef,
-    0x7d,
-    0xef,
-    0x78,
-    0xb3,
-    0x2a,
-    0x3d,
-    0xd0,
-    0x28,
-    0x9a,
-    0xc3,
-    0xfc,
-    0xa9,
-    0x4b,
-    0x58,
-    0x88,
-    0x60,
-    0x4c,
-    0x1b,
-    0x26,
-    0x0d,
-    0xf5,
-    0x5a,
-    0xff,
-    0x02,
-    0xd5,
-    0xb3,
-    0x47,
-    0x72,
-    0xec,
-    0x79,
-    0x14,
-    0xec,
-    0x1a,
-    0x5a,
-    0x70,
-    0x23,
-    0xd8,
-    0x3e,
-    0xac,
-    0xf0,
-    0x26,
-    0x71,
-    0xf8,
-    0x9a,
-    0xc4,
-    0x05,
-    0x31,
-    0x54,
-    0xa5,
-    0x72,
-    0xfa,
-    0x07,
-    0xa1,
-    0x80,
-    0x0e,
-    0x52,
-    0x6a,
-    0x67,
-    0xd5,
-    0xd0,
-    0xc1,
-    0x34,
-    0x35,
-    0x99,
-    0xea,
-    0x6e,
-    0xaa,
-    0x0b,
-    0x5d,
-    0xfa,
-    0x99,
-    0xca,
-    0xbe,
-    0x3c,
-    0xe1,
-    0x05,
-    0x0f,
-    0x7f,
-    0xb4,
-    0xfb,
-    0x25,
-    0x97,
-    0xa5,
-    0xbe,
-    0x58,
-    0xc4,
-    0x01,
-    0x37,
-    0x7f,
-    0xda,
-    0x63,
-    0x6b,
-    0x1c,
-    0x9f,
-    0x83,
-    0xfc,
-    0xd3,
-    0x75,
-    0x4f,
-    0xf3,
-    0x21,
-    0x39,
-    0x3d,
-    0xbc,
-    0x4a,
-    0x6a,
-    0xdf,
-    0x72,
-    0x93,
-    0x8e,
-    0xb8,
-    0x5e,
-    0xb2,
-    0xd1,
-    0x4e,
-    0xba,
-    0x83,
-    0xf0,
-    0x80,
-    0xba,
-    0xfc,
-    0x55,
-    0x1a,
-    0xcd,
-    0x63,
-    0x84,
-    0xa7,
-    0x20,
-    0xbe,
-    0xb5,
-    0x86,
-    0x63,
-    0x8c,
-    0xc2,
-    0x40,
-    0xd1,
-    0xb2,
-    0x44,
-    0x19,
-    0x6a,
-    0xb8,
-    0xf9,
-    0xe5,
-    0x83,
-    0x35,
-    0x6a,
-    0x1d,
-    0x81,
-    0x88,
-    0xca,
-    0x32,
-    0xe2,
-    0xc9,
-    0x20,
-    0x21,
-    0x7d,
-    0x00,
-    0xa9,
-    0x48,
-    0x0a,
-    0x94,
-    0x77,
-    0x78,
-    0xe4,
-    0x06,
-    0x5f,
-    0x4b,
-    0x0e,
-    0xde,
-    0x12,
-    0xb8,
-    0x74,
-    0xe6,
-    0x8a,
-    0xe4,
-    0x74,
-    0x97,
-    0xa8,
-    0x3b,
-    0x9d,
-    0xd1,
-    0x1b,
-    0xc0,
-    0xb7,
-    0xcf,
-    0x83,
-    0xa1,
-    0x03,
-    0x59,
-    0xd6,
-    0x0f,
-    0xc4,
-    0x3b,
-    0x03,
-    0x4c,
-    0xfd,
-    0xf7,
-    0xd6,
-    0x06,
-    0x7d,
-    0xb7,
-    0x1c,
-    0xe3,
-    0x19,
-    0x85,
-    0x07,
-    0x5d,
-    0x39,
-    0xbe,
-    0xd4,
-    0xd0,
-    0x96,
-    0xc4,
-    0xaa,
-    0xd1,
-    0x41,
-    0xf4,
-    0xc6,
-    0xc2,
-    0xe8,
-    0xd8,
-    0xd5,
-    0xa3,
-    0x55,
-    0x9d,
-    0xa1,
-    0x2b,
-    0x37,
-    0xc7,
-    0xf0,
-    0x18,
-    0x25,
-    0x23,
-    0xa9,
-    0xc3,
-    0xe0,
-    0xfd,
-    0x39,
-    0xf7,
-    0xd8,
-    0x94,
-    0x35,
-    0x03,
-    0xf2,
-    0xcb,
-    0x41,
-    0x0e,
-    0x89,
-    0x21,
-    0x30,
-    0xab,
-    0xb3,
-    0xe3,
-    0x6d,
-    0xae,
-    0xc5,
-    0xa1,
-    0x99,
-    0x3d,
-    0x19,
-    0xde,
-    0x75,
-    0x2a,
-    0x0e,
-    0x0b,
-    0x03,
-    0x80,
-    0x51,
-    0xb7,
-    0xe8,
-    0x5b,
-    0x5b,
-    0x00,
-    0x15,
-    0xfd,
-    0x3b,
-    0x4d,
-    0xa6,
-    0x1f,
-    0x96,
-    0x3f,
-    0x0a,
-    0x85,
-    0xec,
-    0xe4,
-    0x65,
-    0xd5,
-    0x1c,
-    0x2e,
-    0x32,
-    0xa9,
-    0x2b,
-    0xa4,
-    0x2d,
-    0xe3,
-    0x41,
-    0x58,
-    0x70,
-    0x41,
-    0xf4,
-    0x19,
-    0xdc,
-    0x31,
-    0xc9,
-    0xe9,
-    0xba,
-    0xe6,
-    0xf8,
-    0xb2,
-    0xa2,
-    0xab,
-    0x70,
-    0x34,
-    0x9c,
-    0x77,
-    0x1b,
-    0x42,
-    0x86,
-    0xc2,
-    0x63,
-    0x2e,
-    0xb6,
-    0x98,
-    0xf5,
-    0x82,
-    0xe0,
-    0xec,
-    0xc5,
-    0xf0,
-    0x39,
-    0x2e,
-    0x52,
-    0x8c,
-    0xdc,
-    0x20,
-    0x2b,
-    0x39,
-    0x6d,
-    0xe5,
-    0xb2,
-    0x61,
-    0xfd,
-    0x5a,
-    0x20,
-    0xea,
-    0x2e,
-    0xaa,
-    0xc9,
-    0x65,
-    0x98,
-    0x1d,
-    0xa2,
-    0x88,
-    0x6b,
-    0x31,
-    0x00,
-    0xde,
-    0x55,
-    0xec,
-    0xa2,
-    0xbd,
-    0xa6,
-    0x70,
-    0xf2,
-    0x79,
-    0xb2,
-    0xd0,
-    0x88,
-    0xd7,
-    0x76,
-    0x22,
-    0xf0,
-    0xc4,
-    0x7f,
-    0xd6,
-    0xad,
-    0x47,
-    0x08,
-    0x46,
-    0x7d,
-    0xb5,
-    0x63,
-    0x8d,
-    0xdf,
-    0x24,
-    0x9a,
-    0x9d,
-    0xd3,
-    0x21,
-    0x55,
-    0x8c,
-    0xe1,
-    0xa6,
-    0xfe,
-    0x2f,
-    0x5c,
-    0x46,
-    0x24,
-    0xea,
-    0xe8,
-    0xab,
-    0x1d,
-    0xc6,
-    0x3a,
-    0x42,
-    0xf0,
-    0xc4,
-    0x1f,
-    0x35,
-    0x72,
-    0x72,
-    0xc0,
-    0x9a,
-    0xae,
-    0xbb,
-    0x24,
-    0xea,
-    0x8a,
-    0x03,
-    0xf6,
-    0xb4,
-    0xa8,
-    0x74,
-    0x89,
-    0x92,
-    0x8b,
-    0x92,
-    0x19,
-    0x5d,
-    0xfb,
-    0x16,
-    0x54,
-    0x9d,
-    0xaa,
-    0xf9,
-    0x18,
-    0x43,
-    0x17,
-    0xcf,
-    0x7f,
-    0x9b,
-    0xb3,
-    0x56,
-    0x19,
-    0x7c,
-    0x43,
-    0x4f,
-    0x78,
-    0xc2,
-    0x85,
-    0x8c,
-    0xf2,
-    0xfd,
-    0x16,
-    0x4b,
-    0xa2,
-    0x6b,
-    0x93,
-    0xc2,
-    0xb0,
-    0x24,
-    0xfe,
-    0xfb,
-    0xd2,
-    0x95,
-    0x64,
-    0xe2,
-    0x13,
-    0x2f,
-    0xbd,
-    0x9d,
-    0xd4,
-    0x60,
-    0x14,
-    0x1b,
-    0x10,
-    0xc3,
-    0xe8,
-    0xf0,
-    0xe4,
-    0x94,
-    0xd1,
-    0x60,
-    0x4e,
-    0x66,
-    0x67,
-    0xb9,
-    0x35,
-    0x18,
-    0x5f,
-    0xe7,
-    0xa9,
-    0x05,
-    0xf7,
-    0x42,
-    0x6d,
-    0x7b,
-    0x95,
-    0xaa,
-    0xb2,
-    0x6f,
-    0xaa,
-    0xd6,
-    0x26,
-    0x6e,
-    0xdd,
-    0xe9,
-    0x2d,
-    0xd7,
-    0x66,
-    0x46,
-    0x6e,
-    0x48,
-    0xb7,
-    0xa6,
-    0x92,
-    0x56,
-    0x62,
-    0x68,
-    0x48,
-    0x81,
-    0x37,
-    0x28,
-    0x8d,
-    0x66,
-    0xac,
-    0x92,
-    0x2a,
-    0x37,
-    0x83,
-    0x78,
-    0x7e,
-    0x69,
-    0xa6,
-    0x23,
-    0x7d,
-    0xac,
-    0x56,
-    0xe7,
-    0xf9,
-    0x20,
-    0x84,
-    0xfa,
-    0x21,
-    0xc6,
-    0x7f,
-    0x87,
-    0x47,
-    0x35,
-    0xd0,
-    0xfd,
-    0xe6,
-    0x8e,
-    0x62,
-    0xad,
-    0xe3,
-    0xb1,
-    0xe7,
-    0x94,
-    0x13,
-    0xb1,
-    0x76,
-    0x75,
-    0xfe,
-    0x86,
-    0x79,
-    0x2c,
-    0xe2,
-    0x02,
-    0xc6,
-    0x3e,
-    0xfb,
-    0x07,
-    0x0c,
-    0xb4,
-    0x02,
-    0xf6,
-    0x71,
-    0x2a,
-    0xf4,
-    0x6a,
-    0x79,
-    0x23,
-    0x14,
-    0x27,
-    0x2a,
-    0x9f,
-    0x33,
-    0x4d,
-    0x6e,
-    0xf0,
-    0x2f,
-    0xd2,
-    0xb8,
-    0xc9,
-    0xba,
-    0x2e,
-    0xea,
-    0x98,
-    0x5c,
-    0x58,
-    0x77,
-    0x15,
-    0xbb,
-    0xf2,
-    0xc4,
-    0x1b,
-    0x1b,
-    0xc0,
-    0xd5,
-    0xb8,
-    0x21,
-    0x5f,
-    0x25,
-    0x80,
-    0xdc,
-    0x34,
-    0xd5,
-    0x26,
-    0x06,
-    0xa2,
-    0x09,
-    0x4d,
-    0x86,
-    0x80,
-    0x90,
-    0x9b,
-    0x3a,
-    0xca,
-    0xc3,
-    0x0f,
-    0xf4,
-    0x96,
-    0xaf,
-    0x95,
-    0xc2,
-    0x4a,
-    0x76,
-    0xd8,
-    0x73,
-    0x0d,
-    0xf2,
-    0x58,
-    0x56,
-    0x7b,
-    0x9c,
-    0xbc,
-    0x45,
-    0x9d,
-    0xac,
-    0x69,
-    0xe2,
-    0x18,
-    0x82,
-    0x53,
-    0x21,
-    0xa4,
-    0x45,
-    0x13,
-    0x07,
-    0xc0,
-    0xca,
-    0x3b,
-    0xb1,
-    0xa5,
-    0xb7,
-    0xe6,
-    0x97,
-    0x78,
-    0xe8,
-    0x93,
-    0x12,
-    0xc3,
-    0x11,
-    0x33,
-    0x1c,
-    0x26,
-    0xa5,
-    0x80,
-    0x57,
-    0x4a,
-    0xf7,
-    0x91,
-    0x52,
-    0x17,
-    0xa0,
-    0xab,
-    0x07,
-    0x27,
-    0x20,
-    0x5b,
-    0xa8,
-    0x7a,
-    0xc8,
-    0xc1,
-    0x9b,
-    0x6b,
-    0xd7,
-    0x2f,
-    0xc3,
-    0xe2,
-    0xe3,
-    0xf3,
-    0x01,
-    0xcc,
-    0x7a,
-    0x70,
-    0xfa,
-    0xc8,
-    0x0a,
-    0x74,
-    0x1b,
-    0x23,
-    0xfe,
-    0xc5,
-    0xdb,
-    0x07,
-    0x2a,
-    0xfd,
-    0x40,
-    0xef,
-    0x69,
-    0x98,
-    0xa5,
-    0x5e,
-    0x84,
-    0x4c,
-    0xba,
-    0xd1,
-    0x56,
-    0x99,
-    0xcc,
-    0xf2,
-    0x2e,
-    0xa0,
-    0x47,
-    0x0e,
-    0x75,
-    0x38,
-    0x79,
-    0xc9,
-    0x91,
-    0x3f,
-    0x98,
-    0x11,
-    0x08,
-    0x2e,
-    0x07,
-    0x50,
-    0xe9,
-    0xf0,
-    0xd5,
-    0xe6,
-    0x68,
-    0xf5,
-    0x87,
-    0xd6,
-    0xc8,
-    0x82,
-    0x17,
-    0xbf,
-    0x7e,
-    0x4b,
-    0x3c,
-    0x0f,
-    0x93,
-    0x43,
-    0xec,
-    0x73,
-    0x4a,
-    0xb3,
-    0x1f,
-    0x92,
-    0x03,
-    0x89,
-    0xd7,
-    0xfa,
-    0x5f,
-    0xf3,
-    0x5d,
-    0x5a,
-    0xa5,
-    0x2d,
-    0xcd,
-    0xf3,
-    0x64,
-    0x98,
-    0xd4,
-    0x49,
-    0x5a,
-    0x0b,
-    0xb9,
-    0x1e,
-    0x95,
-    0x6d,
-    0x9a,
-    0xa0,
-    0xd8,
-    0x84,
-    0xf9,
-    0xe2,
-    0x40,
-    0x08,
-    0x77,
-    0x89,
-    0x27,
-    0xfc,
-    0xde,
-    0xc8,
-    0x49,
-    0x3e,
-    0x65,
-    0x8e,
-    0x25,
-    0x5c,
-    0x30,
-    0xfd,
-    0xa7,
-    0xa9,
-    0x17,
-    0x1f,
-    0x03,
-    0x90,
-    0xa8,
-    0xd4,
-    0xe4,
-    0x29,
-    0x6f,
-    0x0f,
-    0xc6,
-    0x0a,
-    0x75,
-    0x42,
-    0xa0,
-    0x60,
-    0x06,
-    0x17,
-    0xc7,
-    0x3e,
-    0xb7,
-    0x61,
-    0x0f,
-    0x34,
-    0xa8,
-    0x52,
-    0x33,
-    0x24,
-    0x07,
-    0xee,
-    0x77,
-    0x51,
-    0xd5,
-    0xbf,
-    0x8b,
-    0xb9,
-    0xed,
-    0xcb,
-    0xb3,
-    0xa5,
-    0x42,
-    0xc3,
-    0x25,
-    0x7e,
-    0x68,
-    0x7d,
-    0xb2,
-    0xe2,
-    0x56,
-    0xa4,
-    0xa9,
-    0xf7,
-    0x6a,
-    0xaf,
-    0xf9,
-    0xff,
-    0xad,
-    0x0f,
-    0x95,
-    0x2d,
-    0x59,
-    0xad,
-    0x1d,
-    0xb7,
-    0x98,
-    0x93,
-    0xba,
-    0x2d,
-    0x8f,
-    0xe9,
-    0x4a,
-    0x09,
-    0x9b,
-    0x24,
-    0xbd,
-    0x87,
-    0xda,
-    0x7a,
-    0xbe,
-    0xb7,
-    0xee,
-    0x99,
-    0x96,
-    0xd0,
-    0xfd,
-    0x98,
-    0x4e,
-    0xc7,
-    0xfc,
-    0x2e,
-    0x14,
-    0x20,
-    0x2e,
-    0x22,
-    0xe1,
-    0x05,
-    0xe7,
-    0x02,
-    0x58,
-    0x95,
-    0x96,
-    0x18,
-    0xf0,
-    0x7e,
-    0x02,
-    0x9a,
-    0x55,
-    0xce,
-    0xd4,
-    0x21,
-    0x0c,
-    0x06,
-    0x56,
-    0x5c,
-    0x56,
-    0x70,
-    0x7a,
-    0x06,
-    0x58,
-    0xb3,
-    0x1e,
-    0x15,
-    0x78,
-    0xa5,
-    0x8e,
-    0x35,
-    0x0a,
-    0x60,
-    0x4b,
-    0x74,
-    0x2c,
-    0x98,
-    0x0b,
-    0x3f,
-    0xee,
-    0x2c,
-    0x00,
-    0x8d,
-    0xb7,
-    0xfa,
-    0x5d,
-    0x5a,
-    0xe4,
-    0xf8,
-    0x17,
-    0x57,
-    0xb1,
-    0x81,
-    0xe8,
-    0xe0,
-    0x5d,
-    0xec,
-    0x9a,
-    0x2e,
-    0x89,
-    0x63,
-    0x82,
-    0xce,
-    0xe2,
-    0xf2,
-    0x4b,
-    0x51,
-    0xff,
-    0xdf,
-    0xf5,
-    0x46,
-    0x8c,
-    0x3a,
-    0x1c,
-    0x65,
-    0xa9,
-    0xb4,
-    0x7e,
-    0x0d,
-    0x8d,
-    0xb5,
-    0xb8,
-    0xf1,
-    0x6f,
-    0xa8,
-    0x50,
-    0x0e,
-    0xa6,
-    0x9a,
-    0xf8,
-    0xe0,
-    0x0f,
-    0x03,
-    0x11,
-    0xd5,
-    0xaf,
-    0xe3,
-    0x6f,
-    0x02,
-    0x99,
-    0x11,
-    0x5c,
-    0x14,
-    0x12,
-    0xd0,
-    0xdf,
-    0x8a,
-    0xf4,
-    0xa4,
-    0x3e,
-    0x22,
-    0x50,
-    0x64,
-    0xc1,
-    0x91,
-    0x57,
-    0x8f,
-    0xb9,
-    0x77,
-    0x7b,
-    0xe3,
-    0xc1,
-    0x92,
-    0xd1,
-    0x2c,
-    0x44,
-    0x32,
-    0xba,
-    0x5b,
-    0x3f,
-    0xed,
-    0xc2,
-    0xd7,
-    0x48,
-    0x93,
-    0xc8,
-    0x18,
-    0xd0,
-    0x65,
-    0x60,
-    0x71,
-    0xa5,
-    0x81,
-    0x75,
-    0x2d,
-    0xba,
-    0xa1,
-    0x33,
-    0xde,
-    0x2b,
-    0x05,
-    0x23,
-    0xf2,
-    0x7c,
-    0xae,
-    0x98,
-    0x87,
-    0x22,
-    0xcd,
-    0x4b,
-    0x81,
-    0x44,
-    0x7b,
-    0x42,
-    0xd9,
-    0xc2,
-    0xaa,
-    0xf6,
-    0x37,
-    0x77,
-    0x5c,
-    0xb4,
-    0xc4,
-    0xbb,
-    0x13,
-    0x44,
-    0x39,
-    0x2c,
-    0x88,
-    0xc9,
-    0x3d,
-    0xaf,
-    0x9f,
-    0xe8,
-    0xed,
-    0xb1,
-    0x9b,
-    0x2c,
-    0xbc,
-    0xb3,
-    0x8e,
-    0xa9,
-    0x7d,
-    0x05,
-    0x14,
-    0xe0,
-    0xbe,
-    0xd1,
-    0x41,
-    0xe3,
-    0x58,
-    0x5c,
-    0xd8,
-    0xba,
-    0x44,
-    0x89,
-    0xbe,
-    0x04,
-    0xb0,
-    0x9f,
-    0xae,
-    0xe1,
-    0x52,
-    0x4b,
-    0x2d,
-    0x10,
-    0xfd,
-    0xe9,
-    0xc1,
-    0x55,
-    0x72,
-    0xff,
-    0x5e,
-    0x1e,
-    0x78,
-    0x0a,
-    0x21,
-    0x65,
-    0x2f,
-    0x7e,
-    0x41,
-    0xd8,
-    0xa1,
-    0x08,
-    0x42,
-    0x38,
-    0x9a,
-    0x16,
-    0x6b,
-    0xff,
-    0xba,
-    0x99,
-    0x7b,
-    0x45,
-    0xc8,
-    0x09,
-    0x98,
-    0xe4,
-    0x49,
-    0xaa,
-    0x88,
-    0xdb,
-    0x51,
-    0x0f,
-    0x23,
-    0xf0,
-    0x9a,
-    0xdc,
-    0x08,
-    0x9a,
-    0xd3,
-    0xd0,
-    0x90,
-    0x1d,
-    0x3a,
-    0x02,
-    0x00,
-    0xf7,
-    0x6d,
-    0x6a,
-    0x03,
-    0x7b,
-    0x7d,
-    0xa4,
-    0x57,
-    0xbc,
-    0x45,
-    0xf1,
-    0xc6,
-    0xac,
-    0xfa,
-    0x7f,
-    0x58,
-    0x85,
-    0x03,
-    0xea,
-    0xc7,
-    0x68,
-    0x0a,
-    0x02,
-    0x33,
-    0x44,
-    0x53,
-    0xcf,
-    0x17,
-    0xfa,
-    0x4c,
-    0xd2,
-    0x7c,
-    0xbf,
-    0x66,
-    0x8e,
-    0x6c,
-    0xc1,
-    0x24,
-    0x47,
-    0xaa,
-    0x0d,
-    0x71,
-    0x0a,
-    0xa0,
-    0xb0,
-    0x37,
-    0xed,
-    0x99,
-    0x1c,
-    0x2d,
-    0x98,
-    0x30,
-    0xce,
-    0xf1,
-    0x04,
-    0x08,
-    0x2e,
-    0x56,
-    0x83,
-    0xbe,
-    0xb7,
-    0xff,
-    0x01,
-    0x1c,
-    0x57,
-    0x2d,
-    0x89,
-    0x90,
-    0x19,
-    0xd5,
-    0x0b,
-    0xdc,
-    0x01,
-    0xf6,
-    0x5c,
-    0x0e,
-    0x37,
-    0x29,
-    0x7e,
-    0xb3,
-    0x69,
-    0x7a,
-    0x22,
-    0x48,
-    0x6a,
-    0x76,
-    0x6b,
-    0xf1,
-    0x1f,
-    0x85,
-    0xf5,
-    0x6e,
-    0x9b,
-    0x7a,
-    0x16,
-    0x4a,
-    0x89,
-    0x69,
-    0x63,
-    0x55,
-    0xca,
-    0xb8,
-    0x76,
-    0x55,
-    0x60,
-    0x79,
-    0xef,
-    0xf9,
-    0x8b,
-    0xf7,
-    0xb9,
-    0x0e,
-    0x31,
-    0x8f,
-    0x8f,
-    0xf5,
-    0x83,
-    0xc2,
-    0xbe,
-    0x55,
-    0xde,
-    0x88,
-    0x2c,
-    0x0d,
-    0xef,
-    0xe6,
-    0x99,
-    0x6d,
-    0x1b,
-    0xc2,
-    0x25,
-    0xa5,
-    0x1e,
-    0xf7,
-    0x12,
-    0x7d,
-    0xf2,
-    0xa5,
-    0xcc,
-    0x47,
-    0xf2,
-    0xca,
-    0x26,
-    0x12,
-    0x3f,
-    0x17,
-    0xe7,
-    0x21,
-    0x63,
-    0xfc,
-    0x85,
-    0x9c,
-    0x34,
-    0x06,
-    0x30,
-    0x84,
-    0xfb,
-    0x6a,
-    0x12,
-    0xec,
-    0xd6,
-    0xe2,
-    0xd6,
-    0x67,
-    0x5b,
-    0xb7,
-    0x67,
-    0xbd,
-    0x7e,
-    0x1f,
-    0xfa,
-    0xe2,
-    0xb5,
-    0xca,
-    0x4e,
-    0x28,
-    0x5a,
-    0xb8,
-    0x32,
-    0xb3,
-    0x50,
-    0x4d,
-    0x49,
-    0x2d,
-    0xe9,
-    0xa7,
-    0x0a,
-    0xbc,
-    0x07,
-    0x2f,
-    0x0a,
-    0x31,
-    0x82,
-    0x6e,
-    0x7e,
-    0x83,
-    0xca,
-    0x23,
-    0xfb,
-    0x7b,
-    0xce,
-    0x92,
-    0x81,
-    0xb0,
-    0x1c,
-    0x1e,
-    0xb8,
-    0xb6,
-    0x49,
-    0x1a,
-    0x79,
-    0x93,
-    0x93,
-    0xdd,
-    0x90,
-    0x72,
-    0xc5,
-    0x14,
-    0xc1,
-    0x9c,
-    0x5b,
-    0x5d,
-    0x09,
-    0xa3,
-    0xe7,
-    0x11,
-    0x25,
-    0xe0,
-    0xb3,
-    0x60,
-    0x59,
-    0x20,
-    0xa8,
-    0xa4,
-    0x6a,
-    0x9b,
-    0x6e,
-    0xef,
-    0xec,
-    0x26,
-    0xd5,
-    0xe6,
-    0xc4,
-    0xa9,
-    0x74,
-    0xd3,
-    0xe5,
-    0xd2,
-    0x90,
-    0xf5,
-    0x5d,
-    0x0b,
-    0x3f,
-    0x1b,
-    0x95,
-    0xaa,
-    0xcc,
-    0x71,
-    0xd4,
-    0x68,
-    0x5e,
-    0x99,
-    0x06,
-    0x15,
-    0xd5,
-    0xfd,
-    0xbc,
-    0x8a,
-    0xf5,
-    0x64,
-    0x73,
-    0xde,
-    0xc6,
-    0xc4,
-    0x19,
-    0xdd,
-    0x3a,
-    0x57,
-    0xcd,
-    0xb5,
-    0x11,
-    0xf1,
-    0xe7,
-    0xf3,
-    0xfa,
-    0x91,
-    0x38,
-    0xae,
-    0xfb,
-    0x36,
-    0x93,
-    0x02,
-    0x12,
-    0xf4,
-    0x8b,
-    0xc1,
-    0x1d,
-    0x46,
-    0x7f,
-    0x64,
-    0xf7,
-    0xa6,
-    0xd4,
-    0x48,
-    0xe4,
-    0x5b,
-    0x82,
-    0x17,
-    0x2f,
-    0x93,
-    0xd2,
-    0x83,
-    0x11,
-    0xb1,
-    0x66,
-    0x3b,
-    0xd5,
-    0xe8,
-    0x79,
-    0x17,
-    0x3a,
-    0x09,
-    0x68,
-    0x96,
-    0x19,
-    0x99,
-    0x71,
-    0x8b,
-    0x47,
-    0x27,
-    0xbb,
-    0x13,
-    0xbd,
-    0xdc,
-    0x97,
-    0xca,
-    0xf6,
-    0x54,
-    0x06,
-    0x3f,
-    0x99,
-    0xac,
-    0x7b,
-    0xa5,
-    0x58,
-    0xdd,
-    0xe2,
-    0xcb,
-    0x18,
-    0x48,
-    0xe0,
-    0x4e,
-    0x52,
-    0x92,
-    0x5d,
-    0x0d,
-    0xb9,
-    0xb1,
-    0x40,
-    0xdd,
-    0x1d,
-    0x47,
-    0x79,
-    0x7e,
-    0x8f,
-    0x2f,
-    0x45,
-    0xce,
-    0xc6,
-    0x56,
-    0xad,
-    0x3d,
-    0xc1,
-    0xcd,
-    0x50,
-    0x81,
-    0xae,
-    0x1c,
-    0x63,
-    0x8b,
-    0x0b,
-    0xd8,
-    0xf6,
-    0xb9,
-    0x0b,
-    0x78,
-    0x79,
-    0x4d,
-    0x3b,
-    0x64,
-    0x7e,
-    0x1e,
-    0x65,
-    0x4f,
-    0xc1,
-    0x8d,
-    0xb4,
-    0xc7,
-    0x65,
-    0xbb,
-    0x1a,
-    0x0a,
-    0x80,
-    0xf9,
-    0xef,
-    0x1c,
-    0xda,
-    0x80,
-    0xdb,
-    0x16,
-    0xf2,
-    0x63,
-    0xf5,
-    0xc1,
-    0x42,
-    0xc1,
-    0x2c,
-    0x63,
-    0xc4,
-    0x3f,
-    0xe7,
-    0xd9,
-    0xb5,
-    0xb5,
-    0xe8,
-    0xe6,
-    0x99,
-    0x28,
-    0x76,
-    0xcb,
-    0x7f,
-    0xf9,
-    0xbb,
-    0x18,
-    0x86,
-    0x5b,
-    0x6b,
-    0xc1,
-    0xa0,
-    0x0a,
-    0xa6,
-    0x74,
-    0x96,
-    0x3b,
-    0x20,
-    0x2a,
-    0x4d,
-    0xce,
-    0x7f,
-    0xfd,
-    0x47,
-    0xcb,
-    0x04,
-    0x39,
-    0x6c,
-    0x0c,
-    0x6e,
-    0xb5,
-    0x0b,
-    0x37,
-    0x1b,
-    0x64,
-    0x1c,
-    0xf0,
-    0x71,
-    0x27,
-    0xc8,
-    0x4c,
-    0x7c,
-    0xe5,
-    0x2b,
-    0x88,
-    0xd8,
-    0xde,
-    0x58,
-    0xfb,
-    0xd2,
-    0x3c,
-    0x9d,
-    0x49,
-    0xca,
-    0xeb,
-    0x09,
-    0xda,
-    0xdc,
-    0xab,
-    0x2c,
-    0x8a,
-    0xbf,
-    0x64,
-    0x1e,
-    0xa2,
-    0xec,
-    0xb9,
-    0xc3,
-    0x08,
-    0x03,
-    0xdf,
-    0x4c,
-    0xb2,
-    0x6b,
-    0xb0,
-    0x01,
-    0x60,
-    0x39,
-    0xfb,
-    0x3e,
-    0x8b,
-    0x54,
-    0x1f,
-    0xbc,
-    0x98,
-    0xd6,
-    0xd8,
-    0x12,
-    0x52,
-    0xb5,
-    0x58,
-    0x7c,
-    0x97,
-    0xa2,
-    0x9a,
-    0xda,
-    0x51,
-    0x31,
-    0xf3,
-    0xfc,
-    0xa9,
-    0x3b,
-    0xea,
-    0x1c,
-    0x77,
-    0x81,
-    0x49,
-    0xac,
-    0xfc,
-    0x91,
-    0x74,
-    0x53,
-    0xd3,
-    0xee,
-    0xfa,
-    0x32,
-    0x25,
-    0x6b,
-    0x6a,
-    0x6b,
-    0x1d,
-    0xd8,
-    0x68,
-    0xe4,
-    0x9b,
-    0xe0,
-    0xff,
-    0x48,
-    0x2d,
-    0x32,
-    0x39,
-    0x4f,
-    0x3b,
-    0xdf,
-    0xed,
-    0x40,
-    0x81,
-    0x03,
-    0xd9,
-    0xb4,
-    0xc2,
-    0xa8,
-    0xf0,
-    0x9c,
-    0xbb,
-    0xe7,
-    0xf5,
-    0x85,
-    0x57,
-    0x50,
-    0x49,
-    0x1b,
-    0x21,
-    0x8d,
-    0x02,
-    0xec,
-    0xfe,
-    0x41,
-    0x3c,
-    0x6f,
-    0x1c,
-    0x36,
-    0xb4,
-    0x45,
-    0x26,
-    0xb8,
-    0x93,
-    0xbe,
-    0xba,
-    0x3c,
-    0x87,
-    0x9f,
-    0x1c,
-    0x46,
-    0x18,
-    0x23,
-    0x2c,
-    0x89,
-    0x3a,
-    0x3f,
-    0x95,
-    0x4f,
-    0x1e,
-    0x2a,
-    0x48,
-    0x1b,
-    0x4e,
-    0x1d,
-    0x29,
-    0x8d,
-    0xf9,
-    0x58,
-    0x07,
-    0x87,
-    0x8b,
-    0x65,
-    0xd2,
-    0x8e,
-    0x81,
-    0xa0,
-    0x08,
-    0x73,
-    0x7c,
-    0xf7,
-    0x71,
-    0x32,
-    0x94,
-    0xef,
-    0x0c,
-    0x1a,
-    0xee,
-    0xe7,
-    0x49,
-    0x2e,
-    0x91,
-    0xa1,
-    0x78,
-    0xcc,
-    0x75,
-    0xfe,
-    0x82,
-    0x8c,
-    0xdd,
-    0x09,
-    0xd7,
-    0x6b,
-    0xe7,
-    0x37,
-    0xa7,
-    0x29,
-    0x62,
-    0xee,
-    0x55,
-    0xef,
-    0xdf,
-    0x43,
-    0x29,
-    0x35,
-    0x0b,
-    0x08,
-    0x45,
-    0xe3,
-    0x3c,
-    0x06,
-    0xda,
-    0xb6,
-    0x49,
-    0x87,
-    0x9b,
-    0xe6,
-    0x9f,
-    0x18,
-    0x72,
-    0x06,
-    0x91,
-    0x8c,
-    0x72,
-    0x2b,
-    0xf0,
-    0x44,
-    0x0e,
-    0x50,
-    0xdc,
-    0xae,
-    0x88,
-    0xf9,
-    0xd9,
-    0x0c,
-    0xac,
-    0x17,
-    0x26,
-    0x77,
-    0xbd,
-    0x2c,
-    0x4a,
-    0x23,
-    0xb0,
-    0xaf,
-    0xef,
-    0xe4,
-    0x98,
-    0xb2,
-    0xf3,
-    0xf1,
-    0x62,
-    0xc2,
-    0xbd,
-    0xe9,
-    0xc2,
-    0x0f,
-    0xcd,
-    0x13,
-    0x6d,
-    0xcd,
-    0x97,
-    0xea,
-    0x89,
-    0xd9,
-    0x92,
-    0xd9,
-    0x61,
-    0xa0,
-    0x8c,
-    0x43,
-    0x5e,
-    0x3d,
-    0x40,
-    0xc6,
-    0x33,
-    0xe1,
-    0x2a,
-    0xc1,
-    0x57,
-    0x78,
-    0x9a,
-    0x13,
-    0xb8,
-    0x89,
-    0x08,
-    0x26,
-    0xae,
-    0x5e,
-    0xa7,
-    0x2d,
-    0x2d,
-    0x66,
-    0x3c,
-    0xa9,
-    0x40,
-    0xd7,
-    0x31,
-    0x32,
-    0xb2,
-    0x97,
-    0xe5,
-    0x74,
-    0x0e,
-    0x5d,
-    0x47,
-    0x78,
-    0xcb,
-    0x14,
-    0xa3,
-    0x25,
-    0xc0,
-    0x80,
-    0xbc,
-    0x06,
-    0xde,
-    0x23,
-    0x1a,
-    0x4d,
-    0x1d,
-    0x62,
-    0xa5,
-    0x18,
-    0xb7,
-    0xe4,
-    0x73,
-    0xf4,
-    0x95,
-    0x3b,
-    0xdf,
-    0x9f,
-    0x06,
-    0xc6,
-    0xdb,
-    0x13,
-    0xb7,
-    0xd5,
-    0x87,
-    0xbf,
-    0xe0,
-    0x0f,
-    0x02,
-    0x18,
-    0xbb,
-    0x11,
-    0x7f,
-    0x50,
-    0x3a,
-    0x58,
-    0x9c,
-    0x65,
-    0xf9,
-    0x61,
-    0xf0,
-    0x5e,
-    0x72,
-    0x0e,
-    0xe3,
-    0xd2,
-    0x70,
-    0x4c,
-    0xc3,
-    0xa9,
-    0xc6,
-    0xf3,
-    0x14,
-    0x26,
-    0x40,
-    0xee,
-    0x27,
-    0x26,
-    0xda,
-    0x9b,
-    0xee,
-    0xa2,
-    0x30,
-    0x74,
-    0x0e,
-    0x7b,
-    0x36,
-    0xf0,
-    0x36,
-    0x77,
-    0x29,
-    0xa4,
-    0xaf,
-    0x86,
-    0xc5,
-    0xae,
-    0x35,
-    0x4b,
-    0xb9,
-    0x53,
-    0x06,
-    0xd7,
-    0x58,
-    0xe7,
-    0x38,
-    0xb8,
-    0x91,
-    0xed,
-    0x4f,
-    0x32,
-    0x21,
-    0x80,
-    0x0f,
-    0xcc,
-    0x07,
-    0xf2,
-    0x8f,
-    0x0f,
-    0x38,
-    0xb2,
-    0x8f,
-    0x8a,
-    0x95,
-    0x73,
-    0x0b,
-    0x19,
-    0x1a,
-    0x8a,
-    0x11,
-    0x67,
-    0x58,
-    0x98,
-    0xcf,
-    0xb2,
-    0x25,
-    0x6a,
-    0xf0,
-    0xce,
-    0x92,
-    0x1d,
-    0x29,
-    0x6d,
-    0x1d,
-    0x86,
-    0x0e,
-    0x9d,
-    0x28,
-    0xd1,
-    0x2b,
-    0x92,
-    0xaa,
-    0x67,
-    0x50,
-    0xa6,
-    0x25,
-    0x16,
-    0x2c,
-    0x9e,
-    0xd8,
-    0x6c,
-    0x1d,
-    0x2f,
-    0x35,
-    0x63,
-    0x47,
-    0xc1,
-    0x95,
-    0x44,
-    0xe4,
-    0x72,
-    0x2b,
-    0xc5,
-    0xda,
-    0x5e,
-    0x36,
-    0x74,
-    0x93,
-    0x1e,
-    0x7b,
-    0x59,
-    0x09,
-    0x8e,
-    0xf3,
-    0xd7,
-    0x20,
-    0xd3,
-    0xc1,
-    0xd4,
-    0x39,
-    0x9d,
-    0x66,
-    0x1a,
-    0x04,
-    0xaa,
-    0x38,
-    0xfc,
-    0x95,
-    0x8c,
-    0x11,
-    0x3c,
-    0xbb,
-    0xab,
-    0x44,
-    0x2c,
-    0x8d,
-    0x8d,
-    0xd5,
-    0x14,
-    0x45,
-    0x55,
-    0xe9,
-    0xd4,
-    0x52,
-    0x8a,
-    0x7b,
-    0xca,
-    0xa8,
-    0x1a,
-    0x51,
-    0xf6,
-    0x5b,
-    0x9f,
-    0x2e,
-    0x5c,
-    0x6c,
-    0xe0,
-    0x4a,
-    0xaa,
-    0xe3,
-    0x9b,
-    0xff,
-    0x1b,
-    0x1d,
-    0x82,
-    0xc5,
-    0x9b,
-    0x68,
-    0x83,
-    0x60,
-    0x2c,
-    0xcd,
-    0x4c,
-    0x58,
-    0x88,
-    0x2d,
-    0x0f,
-    0xaa,
-    0x08,
-    0x90,
-    0x82,
-    0xbd,
-    0xc4,
-    0xb9,
-    0x2b,
-    0x97,
-    0xfc,
-    0xfe,
-    0xda,
-    0x51,
-    0xb7,
-    0x56,
-    0x77,
-    0xc8,
-    0xa9,
-    0xb4,
-    0xfd,
-    0x96,
-    0x5a,
-    0x93,
-    0xc7,
-    0x41,
-    0x85,
-    0xd2,
-    0x0b,
-    0xb1,
-    0xbe,
-    0xc3,
-    0xa4,
-    0xe8,
-    0x58,
-    0x7f,
-    0x14,
-    0xed,
-    0x86,
-    0x7c,
-    0xc9,
-    0x09,
-    0xc0,
-    0x61,
-    0x9f,
-    0x36,
-    0x69,
-    0x18,
-    0xa7,
-    0xd5,
-    0xae,
-    0x25,
-    0x27,
-    0x9f,
-    0xb1,
-    0x37,
-    0xe1,
-    0xde,
-    0xe7,
-    0xfd,
-    0x98,
-    0xdd,
-    0xbe,
-    0x3b,
-    0xd1,
-    0x9d,
-    0x84,
-    0x1d,
-    0xd7,
-    0xc9,
-    0x84,
-    0xcb,
-    0x01,
-    0xec,
-    0x72,
-    0x3d,
-    0x37,
-    0xe2,
-    0x09,
-    0x51,
-    0xb3,
-    0x8d,
-    0xf2,
-    0x1b,
-    0x05,
-    0xc9,
-    0xe8,
-    0x7c,
-    0x5a,
-    0xa1,
-    0x1a,
-    0xf6,
-    0xfd,
-    0xc3,
-    0xd0,
-    0xbe,
-    0x1e,
-    0x31,
-    0x52,
-    0x13,
-    0xd3,
-    0x3a,
-    0x06,
-    0xcf,
-    0x5c,
-    0xa9,
-    0xd8,
-    0x3c,
-    0xab,
-    0x3c,
-    0xde,
-    0x28,
-    0x24,
-    0x57,
-    0x3c,
-    0x3c,
-    0xa1,
-    0xfa,
-    0x46,
-    0x89,
-    0xb9,
-    0xf1,
-    0xe5,
-    0x64,
-    0x42,
-    0x4a,
-    0x3c,
-    0x74,
-    0x14,
-    0x0c,
-    0x8b,
-    0x09,
-    0x10,
-    0x26,
-    0x53,
-    0xaf,
-    0x61,
-    0xa6,
-    0xbb,
-    0x04,
-    0x02,
-    0x2b,
-    0x32,
-    0xc6,
-    0x80,
-    0x9d,
-    0x56,
-    0x30,
-    0x02,
-    0x1b,
-    0x14,
-    0x87,
-    0x86,
-    0x35,
-    0x11,
-    0xf0,
-    0x6d,
-    0x5c,
-    0x49,
-    0x84,
-    0x3a,
-    0x96,
-    0xf7,
-    0xa6,
-    0x97,
-    0x77,
-    0xb4,
-    0x94,
-    0x99,
-    0x4c,
-    0xe2,
-    0x3d,
-    0x44,
-    0x99,
-    0x4b,
-    0x53,
-    0x52,
-    0xc6,
-    0x06,
-    0xa0,
-    0x30,
-    0x15,
-    0x9b,
-    0x9d,
-    0x4a,
-    0xd7,
-    0x66,
-    0x41,
-    0x88,
-    0xe0,
-    0x41,
-    0x17,
-    0x18,
-    0x38,
-    0x5d,
-    0x93,
-    0x6f,
-    0x13,
-    0x71,
-    0xa6,
-    0x8a,
-    0x03,
-    0x17,
-    0x90,
-    0x7a,
-    0x6d,
-    0x72,
-    0xf6,
-    0x1f,
-    0x3a,
-    0x15,
-    0x34,
-    0x34,
-    0xce,
-    0x20,
-    0xf4,
-    0x8b,
-    0x3e,
-    0xac,
-    0x00,
-    0x9a,
-    0xbd,
-    0x6a,
-    0x54,
-    0x37,
-    0x58,
-    0x86,
-    0x78,
-    0xa0,
-    0xe4,
-    0xd2,
-    0x0c,
-    0xbe,
-    0x34,
-    0x20,
-    0xa4,
-    0xab,
-    0x8f,
-    0xef,
-    0xd7,
-    0x71,
-    0x60,
-    0x4b,
-    0x93,
-    0x15,
-    0x30,
-    0xee,
-    0xb3,
-    0xd4,
-    0xd2,
-    0xab,
-    0xd4,
-    0xac,
-    0xdd,
-    0x0d,
-    0x64,
-    0x1e,
-    0x60,
-    0x3b,
-    0xfb,
-    0x33,
-    0xd0,
-    0x1e,
-    0xef,
-    0xbd,
-    0x45,
-    0xc6,
-    0x23,
-    0xdf,
-    0xe6,
-    0x0a,
-    0x1f,
-    0xcf,
-    0xa2,
-    0x6f,
-    0x66,
-    0xdb,
-    0x22,
-    0x4c,
-    0x03,
-    0xaa,
-    0xfb,
-    0x2b,
-    0x66,
-    0xc5,
-    0x27,
-    0x71,
-    0x6e,
-    0x55,
-    0xb6,
-    0x42,
-    0xc7,
-    0x2f,
-    0xc1,
-    0x9f,
-    0x76,
-    0x0d,
-    0xa0,
-    0xd1,
-    0xb2,
-    0x1e,
-    0x5c,
-    0x0b,
-    0xf6,
-    0xc2,
-    0x67,
-    0x4b,
-    0x54,
-    0x8e,
-    0x8b,
-    0x81,
-    0x0c,
-    0x97,
-    0x21,
-    0xf3,
-    0x5d,
-    0xed,
-    0x83,
-    0xe0,
-    0x9b,
-    0x65,
-    0xc4,
-    0x63,
-    0x82,
-    0x9c,
-    0x9e,
-    0x9b,
-    0xca,
-    0x38,
-    0xab,
-    0x09,
-    0xfb,
-    0x71,
-    0xd8,
-    0x39,
-    0x83,
-    0xd1,
-    0x18,
-    0xa5,
-    0x06,
-    0x37,
-    0x55,
-    0xd6,
-    0xf5,
-    0x22,
-    0xac,
-    0xcc,
-    0x62,
-    0x2c,
-    0xd9,
-    0xa0,
-    0x13,
-    0xd5,
-    0xf0,
-    0x68,
-    0xd5,
-    0x82,
-    0x4f,
-    0x5b,
-    0x12,
-    0xc6,
-    0xd0,
-    0x36,
-    0xa6,
-    0xdf,
-    0x43,
-    0xde,
-    0xef,
-    0x84,
-    0x1b,
-    0x46,
-    0x23,
-    0xde,
-    0x67,
-    0x93,
-    0xe7,
-    0xd4,
-    0x04,
-    0x7e,
-    0x1d,
-    0x8b,
-    0x11,
-    0xfa,
-    0xfd,
-    0x2d,
-    0xa4,
-    0x17,
-    0x67,
-    0xea,
-    0xbb,
-    0x27,
-    0x77,
-    0x3d,
-    0x76,
-    0x1f,
-    0x5b,
-    0x71,
-    0x83,
-    0x40,
-    0x61,
-    0x63,
-    0xd9,
-    0xf6,
-    0x54,
-    0x89,
-    0xa9,
-    0x00,
-    0x09,
-    0x33,
-    0x91,
-    0xd1,
-    0x35,
-    0x11,
-    0x14,
-    0x36,
-    0x81,
-    0xf6,
-    0x47,
-    0x3a,
-    0xe1,
-    0xdb,
-    0xcc,
-    0x47,
-    0x21,
-    0x27,
-    0x04,
-    0x8d,
-    0xc1,
-    0x2e,
-    0x81,
-    0xa7,
-    0x02,
-    0xf7,
-    0xba,
-    0x7c,
-    0x41,
-    0x42,
-    0x03,
-    0x64,
-    0x84,
-    0xc9,
-    0xbc,
-    0x8d,
-    0x53,
-    0xc7,
-    0xc8,
-    0x9c,
-    0xc9,
-    0xb7,
-    0x41,
-    0x97,
-    0xea,
-    0x5e,
-    0x69,
-    0x02,
-    0x37,
-    0x0b,
-    0xe4,
-    0x48,
-    0x80,
-    0x1e,
-    0x25,
-    0x5d,
-    0xfa,
-    0xc7,
-    0x27,
-    0xa2,
-    0x91,
-    0x10,
-    0x5d,
-    0x09,
-    0x7f,
-    0x1e,
-    0xeb,
-    0x79,
-    0x1e,
-    0xb3,
-    0x16,
-    0x74,
-    0xfa,
-    0xf8,
-    0xf9,
-    0xf7,
-    0x2b,
-    0x7a,
-    0x7a,
-    0xa1,
-    0xe2,
-    0x72,
-    0x7d,
-    0x18,
-    0x41,
-    0x49,
-    0x58,
-    0xa9,
-    0x70,
-    0x5b,
-    0x86,
-    0x2e,
-    0xed,
-    0xfc,
-    0x9f,
-    0x35,
-    0x23,
-    0xb8,
-    0x87,
-    0x5e,
-    0x3f,
-    0xdf,
-    0xe6,
-    0x05,
-    0x3f,
-    0x42,
-    0xd9,
-    0x21,
-    0x4b,
-    0x37,
-    0xe8,
-    0x6c,
-    0x49,
-    0xe3,
-    0x37,
-    0xc5,
-    0xac,
-    0xb8,
-    0x00,
-    0xd2,
-    0x8c,
-    0x3c,
-    0x40,
-    0xe9,
-    0xfc,
-    0x0c,
-    0xb1,
-    0x31,
-    0x98,
-    0x21,
-    0xf9,
-    0x04,
-    0x5d,
-    0x53,
-    0x21,
-    0x98,
-    0xbe,
-    0x1b,
-    0x48,
-    0xdf,
-    0xf3,
-    0x9d,
-    0x99,
-    0xab,
-    0x95,
-    0xe6,
-    0x7a,
-    0x16,
-    0x68,
-    0x72,
-    0x06,
-    0x21,
-    0x78,
-    0xf1,
-    0xbe,
-    0x9b,
-    0x67,
-    0x4a,
-    0x7b,
-    0x45,
-    0x05,
-    0xe1,
-    0xa8,
-    0x33,
-    0x21,
-    0x16,
-    0xad,
-    0x75,
-    0x9f,
-    0x0e,
-    0xae,
-    0xf7,
-    0xcb,
-    0xb5,
-    0x76,
-    0xa6,
-    0xed,
-    0x03,
-    0xae,
-    0xd4,
-    0x1e,
-    0x7f,
-    0x53,
-    0xde,
-    0x59,
-    0x02,
-    0x67,
-    0x0c,
-    0xd5,
-    0xbe,
-    0xe6,
-    0xb8,
-    0x92,
-    0x7e,
-    0xfb,
-    0xb3,
-    0x32,
-    0x2f,
-    0x74,
-    0xe4,
-    0x0b,
-    0xa0,
-    0x74,
-    0x32,
-    0x7a,
-    0x86,
-    0x67,
-    0xa5,
-    0x7a,
-    0xc3,
-    0x3b,
-    0xc7,
-    0x75,
-    0xe8,
-    0xce,
-    0x51,
-    0x5a,
-    0xf8,
-    0xa2,
-    0x03,
-    0xef,
-    0x6f,
-    0xd8,
-    0xd4,
-    0x69,
-    0x82,
-    0x5c,
-    0x4b,
-    0x3a,
-    0xa9,
-    0x5d,
-    0x2d,
-    0x2a,
-    0x5b,
-    0x00,
-    0x58,
-    0xa9,
-    0x18,
-    0x55,
-    0xef,
-    0x63,
-    0xad,
-    0x8a,
-    0xb7,
-    0x16,
-    0xb4,
-    0x5e,
-    0xc1,
-    0xa0,
-    0x5a,
-    0xd9,
-    0x4a,
-    0x5d,
-    0x65,
-    0x3a,
-    0xdf,
-    0xaf,
-    0x75,
-    0x32,
-    0xc5,
-    0xde,
-    0x89,
-    0x4f,
-    0x97,
-    0x23,
-    0xc6,
-    0xbb,
-    0x31,
-    0xff,
-    0x74,
-    0x26,
-    0xcd,
-    0xd1,
-    0x4a,
-    0x01,
-    0x6c,
-    0xa8,
-    0xeb,
-    0xed,
-    0x78,
-    0x56,
-    0xb0,
-    0x73,
-    0xa7,
-    0xc6,
-    0xa8,
-    0xf5,
-    0x22,
-    0x8f,
-    0xdd,
-    0xe4,
-    0xe7,
-    0xc8,
-    0xd9,
-    0x34,
-    0x6b,
-    0x1f,
-    0x69,
-    0x0d,
-    0x84,
-    0x25,
-    0xa1,
-    0xc4,
-    0x87,
-    0xec,
-    0x20,
-    0x09,
-    0xad,
-    0xd4,
-    0x96,
-    0x62,
-    0xbc,
-    0xa2,
-    0x83,
-    0xd8,
-    0xe3,
-    0xd2,
-    0x41,
-    0xef,
-    0xe5,
-    0x2f,
-    0x44,
-    0xdc,
-    0x7a,
-    0xa0,
-    0xa1,
-    0xf3,
-    0xf2,
-    0x45,
-    0xcd,
-    0x5f,
-    0x1b,
-    0xc2,
-    0xa7,
-    0x15,
-    0x65,
-    0xdb,
-    0xb9,
-    0x0b,
-    0x44,
-    0x42,
-    0xbb,
-    0xa4,
-    0xd6,
-    0xac,
-    0x59,
-    0x6f,
-    0xc6,
-    0x2a,
-    0x37,
-    0x12,
-    0x70,
-    0xb7,
-    0x31,
-    0x81,
-    0x45,
-    0x0d,
-    0xe7,
-    0x74,
-    0x71,
-    0xbe,
-    0x79,
-    0x17,
-    0xbc,
-    0x7f,
-    0x8f,
-    0x03,
-    0xae,
-    0xc7,
-    0x9d,
-    0x6d,
-    0xf7,
-    0x99,
-    0x65,
-    0x9d,
-    0x0e,
-    0x9d,
-    0xbd,
-    0xa2,
-    0x17,
-    0x76,
-    0x92,
-    0x45,
-    0x0a,
-    0x50,
-    0x2d,
-    0x3b,
-    0x12,
-    0xb8,
-    0xb5,
-    0x9f,
-    0x33,
-    0xb1,
-    0xf5,
-    0x9f,
-    0x30,
-    0x04,
-    0x60,
-    0x75,
-    0xac,
-    0xd7,
-    0x52,
-    0x99,
-    0x8f,
-    0x81,
-    0x99,
-    0x34,
-    0xab,
-    0x9d,
-    0x34,
-    0xd8,
-    0xa0,
-    0x5d,
-    0x5a,
-    0x6f,
-    0xfc,
-    0x22,
-    0xbf,
-    0x72,
-    0xa7,
-    0x49,
-    0x12,
-    0x5c,
-    0x7f,
-    0x47,
-    0xca,
-    0x5d,
-    0x3f,
-    0xf8,
-    0x22,
-    0x52,
-    0xa5,
-    0x34,
-    0x62,
-    0xf5,
-    0xd4,
-    0xa4,
-    0x61,
-    0x51,
-    0xf7,
-    0xd3,
-    0x48,
-    0x7a,
-    0x27,
-    0x88,
-    0x98,
-    0x7a,
-    0x8f,
-    0x54,
-    0x6f,
-    0x8e,
-    0xcd,
-    0x67,
-    0x07,
-    0x93,
-    0x9c,
-    0xa7,
-    0x7f,
-    0xbb,
-    0xb0,
-    0x04,
-    0xde,
-    0x84,
-    0xe2,
-    0x05,
-    0x55,
-    0xeb,
-    0x8d,
-    0xa7,
-    0xc4,
-    0xdc,
-    0x38,
-    0x68,
-    0x80,
-    0xee,
-    0x75,
-    0x9f,
-    0x54,
-    0x4d,
-    0x08,
-    0x0e,
-    0xc5,
-    0xf7,
-    0x4c,
-    0xba,
-    0x9a,
-    0x2c,
-    0xd3,
-    0xfb,
-    0x9c,
-    0x1f,
-    0x4d,
-    0xcf,
-    0x9b,
-    0xf2,
-    0xab,
-    0x73,
-    0xb1,
-    0xe1,
-    0x84,
-    0x35,
-    0xcb,
-    0xbe,
-    0xb7,
-    0x84,
-    0x64,
-    0x9d,
-    0x52,
-    0x49,
-    0x94,
-    0xd0,
-    0xb2,
-    0x7a,
-    0x4a,
-    0x16,
-    0xec,
-    0xeb,
-    0xd5,
-    0x0f,
-    0x6c,
-    0x68,
-    0xaa,
-    0xf3,
-    0xdc,
-    0x02,
-    0x61,
-    0x84,
-    0x48,
-    0xa6,
-    0x00,
-    0x41,
-    0x7f,
-    0xf4,
-    0x7c,
-    0xdd,
-    0xbc,
-    0x4d,
-    0x7d,
-    0xef,
-    0x85,
-    0x2e,
-    0x62,
-    0xeb,
-    0xd4,
-    0xbd,
-    0x85,
-    0x51,
-    0x75,
-    0xa2,
-    0xc0,
-    0x24,
-    0xaf,
-    0x18,
-    0x30,
-    0x9e,
-    0x26,
-    0x44,
-    0x38,
-    0x22,
-    0x00,
-    0xc5,
-    0xc9,
-    0x72,
-    0x47,
-    0x8c,
-    0xe1,
-    0x22,
-    0x8e,
-    0xee,
-    0x52,
-    0x4d,
-    0xd8,
-    0xf7,
-    0xc5,
-    0x86,
-    0xb5,
-    0x02,
-    0xfe,
-    0x11,
-    0xae,
-    0x86,
-    0x62,
-    0x54,
-    0xe3,
-    0x33,
-    0xb6,
-    0x88,
-    0xf3,
-    0x3e,
-    0x29,
-    0xb4,
-    0x1c,
-    0xf9,
-    0x95,
-    0xdc,
-    0xa4,
-    0xa6,
-    0x02,
-    0x75,
-    0x77,
-    0x8d,
-    0x6c,
-    0x1d,
-    0x11,
-    0x4c,
-    0xc6,
-    0x89,
-    0x9e,
-    0x6f,
-    0x3e,
-    0xbf,
-    0x60,
-    0x40,
-    0xc3,
-    0x85,
-    0x52,
-    0xe0,
-    0xc4,
-    0x19,
-    0x0b,
-    0x97,
-    0x3b,
-    0x22,
-    0xe4,
-    0x69,
-    0xeb,
-    0xe7,
-    0x5d,
-    0xea,
-    0xe5,
-    0xbf,
-    0xbd,
-    0x53,
-    0x51,
-    0xc8,
-    0xf9,
-    0xd4,
-    0x6b,
-    0xdc,
-    0xd7,
-    0x2c,
-    0xcc,
-    0xc1,
-    0x53,
-    0x78,
-    0xeb,
-    0xa0,
-    0x42,
-    0x48,
-    0xe3,
-    0xb9,
-    0x35,
-    0xf8,
-    0x77,
-    0x54,
-    0xa0,
-    0x3e,
-    0x53,
-    0xfb,
-    0x3c,
-    0xff,
-    0x94,
-    0xe6,
-    0xa9,
-    0x67,
-    0x8b,
-    0xb7,
-    0x58,
-    0x38,
-    0xbe,
-    0x68,
-    0xa8,
-    0x62,
-    0x30,
-    0x81,
-    0x4f,
-    0xd5,
-    0xe3,
-    0x8e,
-    0xfc,
-    0x93,
-    0x9a,
-    0xd0,
-    0x3b,
-    0x09,
-    0xe3,
-    0x33,
-    0x98,
-    0x9f,
-    0x55,
-    0x80,
-    0x07,
-    0x8e,
-    0x17,
-    0xd4,
-    0x83,
-    0xf1,
-    0xa2,
-    0x51,
-    0xf6,
-    0x20,
-    0xc7,
-    0x13,
-    0x59,
-    0x39,
-    0xf3,
-    0x65,
-    0x1c,
-    0xff,
-    0xb2,
-    0x35,
-    0xc8,
-    0xe8,
-    0x72,
-    0xc6,
-    0xe3,
-    0x71,
-    0x8a,
-    0xa5,
-    0x14,
-    0xb5,
-    0x7a,
-    0xde,
-    0x87,
-    0x3e,
-    0x74,
-    0x6f,
-    0x93,
-    0x1b,
-    0x1c,
-    0xfd,
-    0x9a,
-    0x32,
-    0x8d,
-    0xc6,
-    0x31,
-    0xd8,
-    0x9c,
-    0xd7,
-    0x81,
-    0x9f,
-    0x60,
-    0x7f,
-    0xed,
-    0x6f,
-    0xf2,
-    0x03,
-    0xf6,
-    0xd9,
-    0x71,
-    0x93,
-    0x5b,
-    0xa7,
-    0x49,
-    0x7d,
-    0x84,
-    0xb8,
-    0xb5,
-    0xa1,
-    0x20,
-    0x0b,
-    0x83,
-    0x25,
-    0x0e,
-    0x19,
-    0x18,
-    0x6a,
-    0x79,
-    0x68,
-    0xb3,
-    0x3e,
-    0x48,
-    0x5d,
-    0xf6,
-    0x53,
-    0xb5,
-    0x52,
-    0xa2,
-    0xef,
-    0x3b,
-    0xe8,
-    0xa2,
-    0xe6,
-    0xb6,
-    0x9e,
-    0x4b,
-    0xc6,
-    0xc6,
-    0xa3,
-    0xe2,
-    0x51,
-    0x74,
-    0xe9,
-    0x5e,
-    0x30,
-    0x18,
-    0x7b,
-    0x70,
-    0xe5,
-    0x7a,
-    0x10,
-    0xc1,
-    0x02,
-    0x37,
-    0xe0,
-    0x7b,
-    0x98,
-    0x66,
-    0xb6,
-    0x0a,
-    0xf3,
-    0x7c,
-    0x47,
-    0x24,
-    0x84,
-    0x6d,
-    0xc2,
-    0x06,
-    0x1f,
-    0x14,
-    0xa8,
-    0x01,
-    0x67,
-    0xd5,
-    0xde,
-    0x36,
-    0x86,
-    0x81,
-    0x01,
-    0x9e,
-    0x21,
-    0x79,
-    0xf9,
-    0x4d,
-    0x8a,
-    0x17,
-    0xd1,
-    0xf7,
-    0x38,
-    0x49,
-    0xc5,
-    0xb3,
-    0x75,
-    0x7f,
-    0x9d,
-    0xff,
-    0x57,
-    0xc8,
-    0x3a,
-    0x04,
-    0xf1,
-    0x37,
-    0x6f,
-    0x1c,
-    0xca,
-    0x8c,
-    0x12,
-    0x92,
-    0x8f,
-    0x10,
-    0x52,
-    0xa9,
-    0x04,
-    0xc1,
-    0x4a,
-    0xdf,
-    0x40,
-    0xaf,
-    0xd7,
-    0x72,
-    0x1a,
-    0xa6,
-    0xa7,
-    0x24,
-    0xdf,
-    0x0d,
-    0x93,
-    0x3b,
-    0x46,
-    0x0e,
-    0x2f,
-    0xcd,
-    0xa5,
-    0xf8,
-    0x9f,
-    0x3a,
-    0x64,
-    0xe1,
-    0xac,
-    0xfa,
-    0xb2,
-    0x8f,
-    0x17,
-    0x99,
-    0x78,
-    0x99
-  ],
-  const [
-    0x1d,
-    0x91,
-    0xb8,
-    0x6a,
-    0xcc,
-    0x6e,
-    0xa1,
-    0x70,
-    0xbf,
-    0xcf,
-    0x18,
-    0x7f,
-    0x77,
-    0x3b,
-    0x57,
-    0x7b,
-    0x95,
-    0xe2,
-    0x9d,
-    0x36,
-    0xfb,
-    0x30,
-    0x77,
-    0x9d,
-    0x2e,
-    0xa2,
-    0x3e,
-    0x2f,
-    0xfe,
-    0xd9,
-    0xe1,
-    0xb4,
-    0x6a,
-    0xed,
-    0xe4,
-    0x2b,
-    0xbe,
-    0x03,
-    0xa9,
-    0x04,
-    0xfe,
-    0x22,
-    0xef,
-    0x8f,
-    0x87,
-    0x42,
-    0x98,
-    0xb5,
-    0xf4,
-    0xa6,
-    0xaf,
-    0xe6,
-    0x3f,
-    0x6c,
-    0xa9,
-    0x52,
-    0x28,
-    0x63,
-    0xeb,
-    0x5c,
-    0xdb,
-    0x1c,
-    0x8d,
-    0x4b,
-    0xcd,
-    0x44,
-    0x5e,
-    0x43,
-    0xe7,
-    0x30,
-    0x28,
-    0x75,
-    0xe6,
-    0xba,
-    0x35,
-    0x92,
-    0x02,
-    0x4c,
-    0x11,
-    0x85,
-    0xcd,
-    0x3a,
-    0x92,
-    0x61,
-    0x5f,
-    0x55,
-    0x16,
-    0x98,
-    0xb0,
-    0xbd,
-    0x0c,
-    0x6f,
-    0x45,
-    0xf6,
-    0xb6,
-    0xae,
-    0x0f,
-    0x3e,
-    0x2c,
-    0x9c,
-    0x90,
-    0x1e,
-    0xa5,
-    0x2a,
-    0x3f,
-    0x40,
-    0xf2,
-    0x6f,
-    0x2e,
-    0x80,
-    0x4b,
-    0x54,
-    0xea,
-    0x45,
-    0x4e,
-    0x91,
-    0xa2,
-    0x12,
-    0x45,
-    0xd8,
-    0x8c,
-    0x58,
-    0xa8,
-    0x4f,
-    0x85,
-    0x8f,
-    0xe3,
-    0x44,
-    0xf8,
-    0x84,
-    0x58,
-    0x1d,
-    0x00,
-    0xf5,
-    0xa8,
-    0x8d,
-    0xd1,
-    0x5b,
-    0x2e,
-    0x0e,
-    0x54,
-    0x07,
-    0xcd,
-    0x8b,
-    0x11,
-    0x70,
-    0xec,
-    0x5c,
-    0x52,
-    0xcc,
-    0xbe,
-    0x78,
-    0x85,
-    0xdd,
-    0xc7,
-    0xe6,
-    0xe3,
-    0x0e,
-    0x9c,
-    0x75,
-    0x4f,
-    0xbe,
-    0xea,
-    0xad,
-    0x81,
-    0xdc,
-    0xb9,
-    0x05,
-    0x63,
-    0xb4,
-    0xf2,
-    0x57,
-    0xbb,
-    0x08,
-    0x1f,
-    0x90,
-    0x0b,
-    0x63,
-    0x73,
-    0xac,
-    0xb5,
-    0xaa,
-    0x0a,
-    0xe2,
-    0x63,
-    0xf4,
-    0x71,
-    0x1b,
-    0xa6,
-    0x9b,
-    0x69,
-    0xa9,
-    0xde,
-    0x94,
-    0xe8,
-    0x36,
-    0x59,
-    0xfb,
-    0x61,
-    0xfa,
-    0xbf,
-    0xf2,
-    0x45,
-    0x32,
-    0xad,
-    0xac,
-    0xca,
-    0xcd,
-    0xa0,
-    0xc5,
-    0xeb,
-    0x68,
-    0x15,
-    0xd5,
-    0xb0,
-    0x7c,
-    0xee,
-    0x44,
-    0xaf,
-    0xd6,
-    0x18,
-    0x60,
-    0xd3,
-    0x48,
-    0x6b,
-    0xac,
-    0x5c,
-    0x9f,
-    0xd1,
-    0x7b,
-    0x27,
-    0xd4,
-    0xab,
-    0xbe,
-    0x30,
-    0x87,
-    0x70,
-    0x1b,
-    0x55,
-    0xa8,
-    0x97,
-    0x3f,
-    0x5d,
-    0x78,
-    0xb8,
-    0x74,
-    0x38,
-    0xb0,
-    0xee,
-    0x76,
-    0x88,
-    0xff,
-    0x7f,
-    0x82,
-    0x61,
-    0xba,
-    0xbf,
-    0xb1,
-    0x4d,
-    0xd0,
-    0x31,
-    0x84,
-    0x94,
-    0xfc,
-    0xf0,
-    0xc0,
-    0xba,
-    0x3e,
-    0x4d,
-    0x7c,
-    0x48,
-    0x8b,
-    0xba,
-    0x78,
-    0xd0,
-    0xc4,
-    0xe7,
-    0xb0,
-    0x2b,
-    0xe5,
-    0x2a,
-    0x31,
-    0x05,
-    0x7f,
-    0x24,
-    0x2c,
-    0x9c,
-    0x68,
-    0xa2,
-    0x49,
-    0xc4,
-    0xb0,
-    0xc1,
-    0x3d,
-    0x2f,
-    0xd8,
-    0x56,
-    0x9f,
-    0xeb,
-    0x3f,
-    0x8c,
-    0xf7,
-    0x2c,
-    0xdd,
-    0xcf,
-    0x19,
-    0x4c,
-    0x33,
-    0xe9,
-    0xb1,
-    0x10,
-    0x82,
-    0x6b,
-    0x1e,
-    0x2d,
-    0x3c,
-    0x4f,
-    0x84,
-    0x0a,
-    0xb8,
-    0xdb,
-    0x1c,
-    0xc8,
-    0x29,
-    0xc9,
-    0xcf,
-    0x80,
-    0xd1,
-    0xa4,
-    0x04,
-    0xcb,
-    0x72,
-    0x75,
-    0xb6,
-    0x88,
-    0x06,
-    0x9f,
-    0xc9,
-    0xd9,
-    0xaf,
-    0x08,
-    0x9e,
-    0x6f,
-    0xf1,
-    0x79,
-    0xe5,
-    0x08,
-    0x1f,
-    0x48,
-    0xb2,
-    0x35,
-    0x13,
-    0x34,
-    0xd3,
-    0x61,
-    0x22,
-    0x90,
-    0x62,
-    0x0f,
-    0x50,
-    0xa4,
-    0x96,
-    0x63,
-    0xbf,
-    0x50,
-    0xde,
-    0xe4,
-    0x6e,
-    0xf2,
-    0x31,
-    0x80,
-    0x20,
-    0x8a,
-    0x9f,
-    0xd1,
-    0x99,
-    0x1c,
-    0x2d,
-    0x9e,
-    0x10,
-    0x56,
-    0xdf,
-    0xa5,
-    0xe2,
-    0x73,
-    0x16,
-    0x97,
-    0x84,
-    0x5f,
-    0x1c,
-    0x65,
-    0xbb,
-    0x1c,
-    0xfe,
-    0xba,
-    0x0f,
-    0x64,
-    0x9a,
-    0xc8,
-    0x7d,
-    0x90,
-    0xf8,
-    0x48,
-    0x6c,
-    0xb8,
-    0xde,
-    0xbc,
-    0xe2,
-    0x1c,
-    0x9e,
-    0xf8,
-    0xf8,
-    0xc2,
-    0x33,
-    0xe0,
-    0x8b,
-    0x61,
-    0x8c,
-    0x73,
-    0x35,
-    0x7e,
-    0x28,
-    0x09,
-    0x7b,
-    0xd5,
-    0xe3,
-    0xd8,
-    0x48,
-    0xfa,
-    0x10,
-    0xbd,
-    0x9b,
-    0x40,
-    0xc7,
-    0x3a,
-    0x7c,
-    0xda,
-    0x80,
-    0xbb,
-    0x34,
-    0x40,
-    0xe1,
-    0x1d,
-    0xbd,
-    0xd5,
-    0xd5,
-    0x70,
-    0x78,
-    0xc6,
-    0xde,
-    0xfc,
-    0x1e,
-    0x35,
-    0xac,
-    0x83,
-    0xf9,
-    0x97,
-    0xee,
-    0xc6,
-    0x54,
-    0x5a,
-    0x68,
-    0x4a,
-    0x30,
-    0xcb,
-    0x46,
-    0x5c,
-    0x38,
-    0x38,
-    0xb0,
-    0x53,
-    0xf7,
-    0x51,
-    0x9e,
-    0x15,
-    0x49,
-    0xd4,
-    0xee,
-    0xdd,
-    0x0f,
-    0x6a,
-    0xb4,
-    0x3b,
-    0x27,
-    0xcc,
-    0xd1,
-    0x5c,
-    0x9c,
-    0x29,
-    0xc7,
-    0x8b,
-    0x19,
-    0xcc,
-    0xcb,
-    0xf8,
-    0xa4,
-    0xfa,
-    0x1c,
-    0xb8,
-    0x88,
-    0x19,
-    0x94,
-    0x0e,
-    0x93,
-    0x18,
-    0x7c,
-    0xe9,
-    0x82,
-    0x0a,
-    0xa5,
-    0xad,
-    0xba,
-    0x14,
-    0xb4,
-    0x36,
-    0x39,
-    0x8a,
-    0xbe,
-    0x1b,
-    0xcb,
-    0x55,
-    0x15,
-    0x2f,
-    0x81,
-    0x98,
-    0x61,
-    0x4e,
-    0x5f,
-    0x93,
-    0xf2,
-    0x56,
-    0x55,
-    0xc7,
-    0x54,
-    0x73,
-    0x71,
-    0x5a,
-    0x24,
-    0xa0,
-    0x52,
-    0xbe,
-    0x23,
-    0x6a,
-    0xe0,
-    0x8e,
-    0x89,
-    0xf7,
-    0x3a,
-    0xb8,
-    0x9c,
-    0x48,
-    0xf0,
-    0xe1,
-    0x80,
-    0xbb,
-    0x73,
-    0x05,
-    0x51,
-    0xd4,
-    0xc9,
-    0x5e,
-    0x6f,
-    0x3c,
-    0x85,
-    0x88,
-    0x19,
-    0x0a,
-    0xf7,
-    0xe2,
-    0x3e,
-    0x42,
-    0xa0,
-    0x37,
-    0x8f,
-    0x9b,
-    0xe8,
-    0x9e,
-    0xd9,
-    0x86,
-    0x14,
-    0x9e,
-    0x92,
-    0x6b,
-    0x72,
-    0x96,
-    0xb2,
-    0x36,
-    0xd6,
-    0x5c,
-    0xc4,
-    0x12,
-    0x4a,
-    0x25,
-    0x3c,
-    0x74,
-    0x02,
-    0xa5,
-    0x0b,
-    0x5c,
-    0x8e,
-    0x77,
-    0x71,
-    0xd8,
-    0x53,
-    0xbe,
-    0x12,
-    0xc9,
-    0x3c,
-    0x0d,
-    0x4d,
-    0xe9,
-    0xad,
-    0x84,
-    0xc9,
-    0x0d,
-    0xb9,
-    0x3c,
-    0x50,
-    0xa8,
-    0x94,
-    0xe6,
-    0xe1,
-    0x91,
-    0x4b,
-    0xae,
-    0x00,
-    0x06,
-    0xb2,
-    0x66,
-    0x51,
-    0xf0,
-    0x9e,
-    0xe0,
-    0x65,
-    0x68,
-    0x55,
-    0x9b,
-    0xd4,
-    0x7b,
-    0x43,
-    0xa2,
-    0x8c,
-    0x2a,
-    0xef,
-    0xb2,
-    0x68,
-    0xb5,
-    0x2d,
-    0x9b,
-    0x05,
-    0x1a,
-    0x94,
-    0xe8,
-    0xd1,
-    0xd8,
-    0x32,
-    0xc2,
-    0x64,
-    0xf8,
-    0x7f,
-    0x12,
-    0x14,
-    0x4e,
-    0x90,
-    0xe6,
-    0xc3,
-    0xfd,
-    0x8d,
-    0x16,
-    0xfc,
-    0x39,
-    0x65,
-    0x27,
-    0x3f,
-    0x51,
-    0xc0,
-    0x6f,
-    0x98,
-    0xec,
-    0x36,
-    0x7a,
-    0x76,
-    0x92,
-    0xbe,
-    0xad,
-    0xbb,
-    0x6f,
-    0x69,
-    0x29,
-    0x10,
-    0x54,
-    0x50,
-    0xf3,
-    0x7b,
-    0xff,
-    0xca,
-    0x51,
-    0x33,
-    0x9c,
-    0xe3,
-    0x77,
-    0xb3,
-    0x8c,
-    0x0a,
-    0x62,
-    0x0d,
-    0x64,
-    0x0a,
-    0x05,
-    0x81,
-    0x39,
-    0x3c,
-    0xa3,
-    0x4e,
-    0x1b,
-    0xfa,
-    0x7c,
-    0xc8,
-    0xdf,
-    0x56,
-    0xab,
-    0xab,
-    0x22,
-    0x0c,
-    0x4f,
-    0xaf,
-    0x8a,
-    0xb6,
-    0xe9,
-    0x5c,
-    0x4f,
-    0x3f,
-    0x05,
-    0x20,
-    0xfa,
-    0x9a,
-    0x1d,
-    0x9f,
-    0x6d,
-    0xb4,
-    0xba,
-    0x4a,
-    0x24,
-    0xa7,
-    0xdc,
-    0x33,
-    0xba,
-    0x30,
-    0x9c,
-    0x1f,
-    0xaf,
-    0x63,
-    0x10,
-    0xdd,
-    0x68,
-    0x9d,
-    0x6f,
-    0xd7,
-    0x77,
-    0xbb,
-    0x75,
-    0xe7,
-    0x1d,
-    0x89,
-    0x09,
-    0x6c,
-    0x0d,
-    0x7d,
-    0x1e,
-    0x9c,
-    0x73,
-    0xa6,
-    0xd7,
-    0x1c,
-    0x35,
-    0xdf,
-    0xee,
-    0xce,
-    0x79,
-    0x48,
-    0x56,
-    0xea,
-    0x67,
-    0xf7,
-    0x1f,
-    0x50,
-    0x30,
-    0xea,
-    0x9b,
-    0x1c,
-    0x4f,
-    0x40,
-    0xbf,
-    0x7b,
-    0x0f,
-    0xa9,
-    0xcb,
-    0xbe,
-    0x4d,
-    0x1c,
-    0x2e,
-    0xad,
-    0x7f,
-    0xc8,
-    0xa3,
-    0x1e,
-    0xf5,
-    0x4c,
-    0xa1,
-    0xc6,
-    0x5f,
-    0x2a,
-    0xf2,
-    0x4e,
-    0x90,
-    0x79,
-    0xa1,
-    0xa9,
-    0x81,
-    0xdb,
-    0x1a,
-    0xa6,
-    0x99,
-    0xaf,
-    0x8d,
-    0xc1,
-    0x2b,
-    0x88,
-    0x93,
-    0x3f,
-    0x41,
-    0xdd,
-    0x14,
-    0x7a,
-    0x98,
-    0x02,
-    0x68,
-    0x79,
-    0xeb,
-    0x56,
-    0xbc,
-    0xc3,
-    0x74,
-    0xbf,
-    0xb8,
-    0x75,
-    0xb1,
-    0x53,
-    0x5f,
-    0x93,
-    0x64,
-    0x58,
-    0x36,
-    0x9c,
-    0xdd,
-    0x6f,
-    0xa8,
-    0x61,
-    0x7b,
-    0x0c,
-    0xa9,
-    0x16,
-    0x71,
-    0x29,
-    0x9a,
-    0xaa,
-    0xc6,
-    0x3c,
-    0x6c,
-    0x54,
-    0xa0,
-    0x66,
-    0x09,
-    0x6f,
-    0xc1,
-    0xed,
-    0xef,
-    0x87,
-    0x52,
-    0xec,
-    0x1e,
-    0xb4,
-    0xdf,
-    0x49,
-    0x35,
-    0x26,
-    0xa4,
-    0xe8,
-    0xd8,
-    0x02,
-    0x07,
-    0x1e,
-    0x54,
-    0x6d,
-    0x65,
-    0x69,
-    0x86,
-    0xe5,
-    0x11,
-    0x5e,
-    0xf9,
-    0xd8,
-    0x9a,
-    0xe2,
-    0x4e,
-    0x6f,
-    0x4d,
-    0x9d,
-    0xe1,
-    0xab,
-    0xfb,
-    0xac,
-    0xa9,
-    0xb4,
-    0xfd,
-    0x96,
-    0x60,
-    0x6e,
-    0x74,
-    0x82,
-    0xe4,
-    0x4c,
-    0xd5,
-    0xa7,
-    0xde,
-    0x69,
-    0xa6,
-    0x03,
-    0xa1,
-    0xd5,
-    0x82,
-    0x50,
-    0x55,
-    0x2c,
-    0x63,
-    0x34,
-    0x54,
-    0x6e,
-    0x21,
-    0xb8,
-    0xd4,
-    0x0a,
-    0x35,
-    0xfb,
-    0xc7,
-    0x3c,
-    0xc3,
-    0x28,
-    0xff,
-    0x99,
-    0xd8,
-    0xa5,
-    0x96,
-    0xe9,
-    0xf0,
-    0x8d,
-    0x8d,
-    0x34,
-    0xbb,
-    0x61,
-    0xb3,
-    0x20,
-    0x20,
-    0xfa,
-    0xc8,
-    0x7a,
-    0x83,
-    0xc2,
-    0xe3,
-    0x12,
-    0x43,
-    0x24,
-    0x11,
-    0xcc,
-    0x87,
-    0x41,
-    0x3f,
-    0xf4,
-    0x3b,
-    0xe5,
-    0x5a,
-    0xd2,
-    0x55,
-    0xb9,
-    0xb4,
-    0x7e,
-    0x5d,
-    0xba,
-    0xaa,
-    0xf6,
-    0x2c,
-    0xe9,
-    0x84,
-    0x6e,
-    0xf4,
-    0x44,
-    0x9c,
-    0xe7,
-    0x80,
-    0xf6,
-    0xc3,
-    0x03,
-    0xbd,
-    0xcb,
-    0xe0,
-    0x18,
-    0x7a,
-    0xe6,
-    0xda,
-    0x83,
-    0x6c,
-    0xb6,
-    0xb8,
-    0x3f,
-    0x75,
-    0x26,
-    0x07,
-    0xb6,
-    0x25,
-    0x14,
-    0x7c,
-    0xd6,
-    0x82,
-    0x05,
-    0xdb,
-    0x68,
-    0x04,
-    0x17,
-    0x17,
-    0x9d,
-    0xe4,
-    0x37,
-    0xbb,
-    0xea,
-    0x97,
-    0x93,
-    0x88,
-    0x16,
-    0x95,
-    0x52,
-    0x60,
-    0x92,
-    0x5e,
-    0x83,
-    0x63,
-    0x08,
-    0xbf,
-    0x54,
-    0x57,
-    0x36,
-    0x51,
-    0x85,
-    0x4d,
-    0xfd,
-    0x44,
-    0x1c,
-    0x81,
-    0xb5,
-    0x5a,
-    0x59,
-    0x83,
-    0xc4,
-    0x36,
-    0xec,
-    0x94,
-    0x6f,
-    0xd7,
-    0x66,
-    0x53,
-    0xf0,
-    0x60,
-    0xee,
-    0x99,
-    0xc8,
-    0x1a,
-    0x35,
-    0xa1,
-    0x56,
-    0xbb,
-    0xac,
-    0x6c,
-    0xa9,
-    0xe9,
-    0xf4,
-    0x63,
-    0x93,
-    0xfa,
-    0x95,
-    0x3f,
-    0xfe,
-    0xfe,
-    0xf4,
-    0x26,
-    0x83,
-    0xff,
-    0x7f,
-    0x16,
-    0x39,
-    0x87,
-    0x2b,
-    0x87,
-    0xcb,
-    0x63,
-    0x20,
-    0x4c,
-    0xce,
-    0xa7,
-    0xb2,
-    0xbb,
-    0x51,
-    0xf2,
-    0x94,
-    0x0d,
-    0xb5,
-    0xf3,
-    0x48,
-    0x08,
-    0xbf,
-    0x2c,
-    0xda,
-    0xdb,
-    0xeb,
-    0xf6,
-    0xce,
-    0x49,
-    0x03,
-    0xc6,
-    0x57,
-    0x09,
-    0xf1,
-    0xae,
-    0xca,
-    0x6d,
-    0xd2,
-    0x27,
-    0x51,
-    0x43,
-    0x4b,
-    0x0d,
-    0xe4,
-    0xf9,
-    0x20,
-    0xeb,
-    0x75,
-    0x04,
-    0x02,
-    0x79,
-    0x6b,
-    0x81,
-    0xa9,
-    0x63,
-    0x52,
-    0x1d,
-    0x23,
-    0x4c,
-    0xd1,
-    0x33,
-    0x6c,
-    0x13,
-    0xdc,
-    0x35,
-    0x3e,
-    0x55,
-    0x2a,
-    0x4d,
-    0x2a,
-    0x33,
-    0xea,
-    0x44,
-    0xe8,
-    0x55,
-    0xb2,
-    0xa2,
-    0xec,
-    0x2e,
-    0xb8,
-    0x17,
-    0x39,
-    0x82,
-    0x44,
-    0x19,
-    0x7a,
-    0x26,
-    0x65,
-    0xcf,
-    0x4f,
-    0x08,
-    0xe4,
-    0x2e,
-    0xe5,
-    0x6f,
-    0x76,
-    0x62,
-    0xc9,
-    0x83,
-    0x35,
-    0x6f,
-    0xfe,
-    0x0f,
-    0x51,
-    0x18,
-    0x4d,
-    0x86,
-    0x03,
-    0x00,
-    0xdc,
-    0x44,
-    0xc3,
-    0x0f,
-    0x02,
-    0x17,
-    0xbb,
-    0x17,
-    0x5a,
-    0xfe,
-    0x7b,
-    0xb7,
-    0x16,
-    0x30,
-    0xee,
-    0x80,
-    0x96,
-    0x60,
-    0x8d,
-    0x57,
-    0x3a,
-    0x40,
-    0xd2,
-    0x1a,
-    0x74,
-    0x44,
-    0xf0,
-    0x87,
-    0x21,
-    0xa8,
-    0xc1,
-    0x59,
-    0x19,
-    0xb4,
-    0x00,
-    0xb3,
-    0x04,
-    0x3f,
-    0xb8,
-    0xc2,
-    0x70,
-    0x72,
-    0xfc,
-    0x9f,
-    0x21,
-    0xce,
-    0xd9,
-    0x72,
-    0xa8,
-    0x70,
-    0x89,
-    0xdd,
-    0x38,
-    0x94,
-    0xe9,
-    0x98,
-    0xb4,
-    0x59,
-    0x2e,
-    0x58,
-    0x0c,
-    0xc4,
-    0xd3,
-    0xf6,
-    0xca,
-    0x06,
-    0xd5,
-    0xcd,
-    0xe8,
-    0x02,
-    0x23,
-    0x64,
-    0xe5,
-    0x0a,
-    0x50,
-    0x4d,
-    0x18,
-    0xe9,
-    0x8c,
-    0x4c,
-    0x43,
-    0x27,
-    0xd2,
-    0xbc,
-    0x6b,
-    0x88,
-    0x63,
-    0x2f,
-    0xe7,
-    0xd6,
-    0x72,
-    0x55,
-    0xb8,
-    0xe0,
-    0x21,
-    0x1f,
-    0x18,
-    0xc3,
-    0xac,
-    0x23,
-    0x55,
-    0x68,
-    0xe4,
-    0x43,
-    0xe0,
-    0x4e,
-    0xe0,
-    0x89,
-    0xa1,
-    0x8a,
-    0xef,
-    0x56,
-    0x8e,
-    0x0c,
-    0xd0,
-    0xbc,
-    0x7c,
-    0x23,
-    0x26,
-    0x28,
-    0x35,
-    0x44,
-    0x26,
-    0x44,
-    0xca,
-    0x07,
-    0x93,
-    0x1b,
-    0x2b,
-    0x72,
-    0xec,
-    0x7f,
-    0xf4,
-    0x7a,
-    0xe4,
-    0xa7,
-    0x8a,
-    0xc7,
-    0x12,
-    0x1d,
-    0x67,
-    0xb8,
-    0xea,
-    0xd8,
-    0xb2,
-    0xa7,
-    0xec,
-    0xa4,
-    0x13,
-    0x6e,
-    0x1b,
-    0xcb,
-    0xc5,
-    0x29,
-    0xb1,
-    0xee,
-    0xed,
-    0x3e,
-    0x11,
-    0x34,
-    0x2a,
-    0x9b,
-    0xfd,
-    0xa7,
-    0x6d,
-    0x3f,
-    0x09,
-    0xda,
-    0x0b,
-    0xfc,
-    0x4f,
-    0xcf,
-    0x10,
-    0x7b,
-    0x65,
-    0x19,
-    0xd7,
-    0x80,
-    0x8c,
-    0x3e,
-    0xd7,
-    0x6f,
-    0x2a,
-    0x5f,
-    0xc0,
-    0x10,
-    0x7b,
-    0x1b,
-    0xc7,
-    0x8f,
-    0x83,
-    0xb0,
-    0x3d,
-    0xc7,
-    0x47,
-    0x63,
-    0x67,
-    0xbf,
-    0x3c,
-    0x23,
-    0x8a,
-    0x75,
-    0x00,
-    0x69,
-    0x45,
-    0xdb,
-    0x48,
-    0x62,
-    0x23,
-    0x20,
-    0x1a,
-    0x50,
-    0x71,
-    0x30,
-    0x3c,
-    0x2e,
-    0x4d,
-    0x7e,
-    0xec,
-    0x92,
-    0x00,
-    0x01,
-    0xd1,
-    0xd8,
-    0x8e,
-    0x7c,
-    0x32,
-    0x7d,
-    0x8b,
-    0x03,
-    0x66,
-    0xc9,
-    0x2f,
-    0xbb,
-    0x8b,
-    0xb1,
-    0xad,
-    0xe1,
-    0x7b,
-    0xfb,
-    0xc1,
-    0x0e,
-    0xfc,
-    0xa3,
-    0x88,
-    0xb9,
-    0x37,
-    0x7e,
-    0x95,
-    0xfd,
-    0x6c,
-    0x1d,
-    0x41,
-    0x9c,
-    0xe3,
-    0xf4,
-    0x42,
-    0x45,
-    0x26,
-    0xbb,
-    0x80,
-    0x12,
-    0x6d,
-    0x15,
-    0x24,
-    0x55,
-    0x5a,
-    0x70,
-    0xf1,
-    0x94,
-    0xe6,
-    0x2c,
-    0xd7,
-    0xd2,
-    0x9c,
-    0xff,
-    0xc5,
-    0x10,
-    0x05,
-    0x98,
-    0xc0,
-    0x14,
-    0x63,
-    0x82,
-    0x32,
-    0x69,
-    0xa1,
-    0x4c,
-    0x84,
-    0xa7,
-    0x8b,
-    0xe7,
-    0xee,
-    0xf5,
-    0x3b,
-    0x4f,
-    0x8e,
-    0xcb,
-    0xd3,
-    0x6d,
-    0xb8,
-    0xfd,
-    0x72,
-    0x3d,
-    0x8e,
-    0xf5,
-    0x60,
-    0x2c,
-    0xd0,
-    0x3f,
-    0x8c,
-    0xc4,
-    0xf5,
-    0x4c,
-    0x39,
-    0x8a,
-    0x7a,
-    0x6f,
-    0xf4,
-    0x27,
-    0x7a,
-    0x2c,
-    0xc9,
-    0xc7,
-    0x7f,
-    0xb2,
-    0xb6,
-    0xbf,
-    0x98,
-    0xa6,
-    0x60,
-    0x72,
-    0xab,
-    0x22,
-    0x05,
-    0x75,
-    0x0d,
-    0xfe,
-    0xb2,
-    0xf1,
-    0x50,
-    0x4e,
-    0xb6,
-    0x49,
-    0x5c,
-    0x2b,
-    0x56,
-    0xfd,
-    0xc1,
-    0xb7,
-    0xc2,
-    0xcf,
-    0x4c,
-    0x5b,
-    0x48,
-    0x24,
-    0xd9,
-    0x53,
-    0xc8,
-    0xac,
-    0x67,
-    0x6d,
-    0x68,
-    0x45,
-    0x72,
-    0x0d,
-    0x88,
-    0x1d,
-    0x7d,
-    0x75,
-    0xf9,
-    0x17,
-    0xee,
-    0x43,
-    0x69,
-    0x71,
-    0x1e,
-    0x3b,
-    0x22,
-    0xa3,
-    0xb1,
-    0x47,
-    0xf5,
-    0x8a,
-    0x23,
-    0xbc,
-    0x70,
-    0xc5,
-    0xa4,
-    0xdf,
-    0x58,
-    0x60,
-    0x26,
-    0xa8,
-    0x53,
-    0xaf,
-    0xb4,
-    0xc6,
-    0xe4,
-    0x7d,
-    0x05,
-    0xe2,
-    0x9c,
-    0x67,
-    0x51,
-    0x28,
-    0x8f,
-    0x82,
-    0x63,
-    0x04,
-    0x06,
-    0x44,
-    0xf0,
-    0x29,
-    0x73,
-    0xa1,
-    0x27,
-    0xd8,
-    0xaa,
-    0x74,
-    0x89,
-    0x5f,
-    0x4d,
-    0x21,
-    0xfb,
-    0xe0,
-    0x88,
-    0x78,
-    0x19,
-    0x53,
-    0xff,
-    0xdd,
-    0xce,
-    0xce,
-    0x05,
-    0xa6,
-    0x21,
-    0x04,
-    0x0f,
-    0xc5,
-    0x52,
-    0x0d,
-    0x68,
-    0xa7,
-    0x26,
-    0x65,
-    0x26,
-    0x5c,
-    0x7f,
-    0x36,
-    0x5c,
-    0xf7,
-    0x2f,
-    0xda,
-    0x91,
-    0x38,
-    0x0e,
-    0x9b,
-    0x71,
-    0x68,
-    0x4b,
-    0xbe,
-    0xc3,
-    0x85,
-    0xff,
-    0xc1,
-    0x9b,
-    0x9f,
-    0x08,
-    0xe0,
-    0xd1,
-    0x82,
-    0x14,
-    0xde,
-    0xb1,
-    0x95,
-    0xfc,
-    0x01,
-    0xf4,
-    0x02,
-    0x54,
-    0x5f,
-    0xf0,
-    0x17,
-    0x40,
-    0x58,
-    0x0b,
-    0xed,
-    0x88,
-    0x64,
-    0x75,
-    0x47,
-    0xef,
-    0x0f,
-    0x17,
-    0xbc,
-    0xc1,
-    0x41,
-    0xc6,
-    0x19,
-    0xac,
-    0xc3,
-    0xbd,
-    0x01,
-    0xd0,
-    0xff,
-    0x4a,
-    0xd6,
-    0x19,
-    0x07,
-    0xc7,
-    0xdd,
-    0xcd,
-    0xd9,
-    0xcc,
-    0x9c,
-    0x61,
-    0xe2,
-    0xa3,
-    0x87,
-    0x91,
-    0xc0,
-    0xfc,
-    0xdc,
-    0xb0,
-    0x4c,
-    0xe2,
-    0xcc,
-    0x3c,
-    0xd8,
-    0xee,
-    0xdb,
-    0xb5,
-    0xb5,
-    0xbb,
-    0x89,
-    0xaf,
-    0xf9,
-    0x99,
-    0x32,
-    0x27,
-    0x7e,
-    0x86,
-    0x33,
-    0x13,
-    0x2e,
-    0x5a,
-    0x4e,
-    0x3c,
-    0x7e,
-    0x41,
-    0x50,
-    0x50,
-    0x39,
-    0x6e,
-    0xf0,
-    0x33,
-    0x7f,
-    0x0e,
-    0xfb,
-    0x97,
-    0x0d,
-    0x7b,
-    0xae,
-    0xcc,
-    0xbf,
-    0xb3,
-    0x63,
-    0xd9,
-    0x52,
-    0x08,
-    0x71,
-    0xcb,
-    0x6f,
-    0x19,
-    0x4d,
-    0x4d,
-    0xe5,
-    0x00,
-    0xf5,
-    0x79,
-    0x37,
-    0xcd,
-    0x8e,
-    0xee,
-    0x56,
-    0x34,
-    0x4b,
-    0x23,
-    0xaf,
-    0x82,
-    0x92,
-    0xfb,
-    0x68,
-    0xd5,
-    0x5a,
-    0x99,
-    0xe7,
-    0x8d,
-    0xd8,
-    0x75,
-    0x95,
-    0xfe,
-    0x5a,
-    0xaf,
-    0xe1,
-    0x67,
-    0x73,
-    0xa4,
-    0x87,
-    0x28,
-    0x58,
-    0xc0,
-    0x12,
-    0x2f,
-    0x8a,
-    0x93,
-    0x9f,
-    0xb4,
-    0xb5,
-    0x26,
-    0xe5,
-    0x26,
-    0xd8,
-    0x8f,
-    0x72,
-    0x65,
-    0xa7,
-    0xc3,
-    0x37,
-    0x31,
-    0x2e,
-    0xac,
-    0x47,
-    0xe3,
-    0xb6,
-    0x7b,
-    0xdc,
-    0x5a,
-    0xec,
-    0x40,
-    0x9b,
-    0x39,
-    0x40,
-    0xb7,
-    0x19,
-    0x50,
-    0x8c,
-    0x65,
-    0x9d,
-    0x57,
-    0xf6,
-    0xe4,
-    0x28,
-    0xe2,
-    0x17,
-    0x7c,
-    0xb2,
-    0x91,
-    0x5d,
-    0xf3,
-    0xb7,
-    0x87,
-    0xad,
-    0xa5,
-    0xf2,
-    0x1e,
-    0x4d,
-    0xd7,
-    0x69,
-    0xd9,
-    0x02,
-    0x48,
-    0xa9,
-    0x9b,
-    0x75,
-    0x09,
-    0x53,
-    0x16,
-    0xdb,
-    0x8f,
-    0xd7,
-    0x85,
-    0xd5,
-    0x07,
-    0x80,
-    0x9e,
-    0x95,
-    0xe9,
-    0xb1,
-    0xc2,
-    0x43,
-    0xd0,
-    0x6e,
-    0x78,
-    0x9f,
-    0x89,
-    0x1d,
-    0x19,
-    0xe7,
-    0x69,
-    0x8e,
-    0xcd,
-    0xfb,
-    0xe4,
-    0x3a,
-    0xb5,
-    0xbf,
-    0x5c,
-    0xc8,
-    0x6a,
-    0xc1,
-    0x37,
-    0xd6,
-    0xa7,
-    0x1c,
-    0x34,
-    0xf5,
-    0x42,
-    0x9c,
-    0xff,
-    0xf5,
-    0x61,
-    0x22,
-    0x03,
-    0x64,
-    0xea,
-    0x4a,
-    0x7f,
-    0x51,
-    0x3b,
-    0x4c,
-    0xdc,
-    0x55,
-    0x1c,
-    0x20,
-    0x3e,
-    0xd5,
-    0xf1,
-    0xe6,
-    0x59,
-    0x81,
-    0x35,
-    0x84,
-    0x86,
-    0x20,
-    0x23,
-    0x91,
-    0x15,
-    0x90,
-    0xb6,
-    0x72,
-    0xe5,
-    0x08,
-    0xd4,
-    0xc2,
-    0x33,
-    0xa1,
-    0xc6,
-    0xf8,
-    0xb0,
-    0x15,
-    0xec,
-    0x43,
-    0xd6,
-    0xc6,
-    0xaf,
-    0xb9,
-    0x7b,
-    0x02,
-    0xb6,
-    0xb1,
-    0xa7,
-    0x85,
-    0x5d,
-    0x6d,
-    0xa3,
-    0x3f,
-    0x63,
-    0xfd,
-    0x52,
-    0x58,
-    0xe2,
-    0x5f,
-    0xc4,
-    0x72,
-    0x85,
-    0xeb,
-    0x09,
-    0x2e,
-    0xf5,
-    0xef,
-    0x43,
-    0xf1,
-    0x94,
-    0x96,
-    0xff,
-    0xe8,
-    0x6e,
-    0x0e,
-    0xc6,
-    0x49,
-    0x6d,
-    0xe9,
-    0xee,
-    0xdc,
-    0xcc,
-    0xc4,
-    0xb6,
-    0xbb,
-    0xcd,
-    0x27,
-    0x93,
-    0x56,
-    0xaf,
-    0xad,
-    0xc4,
-    0xb9,
-    0xda,
-    0x65,
-    0x2c,
-    0x12,
-    0x5e,
-    0x77,
-    0x61,
-    0x6d,
-    0x9b,
-    0x0b,
-    0x01,
-    0xc3,
-    0x41,
-    0x66,
-    0x45,
-    0x33,
-    0x7c,
-    0x56,
-    0xd8,
-    0x8f,
-    0x68,
-    0xd1,
-    0xe9,
-    0x1a,
-    0xcb,
-    0xd9,
-    0x7f,
-    0x90,
-    0x03,
-    0xa2,
-    0x0c,
-    0x67,
-    0x3d,
-    0xf7,
-    0x46,
-    0x55,
-    0xe8,
-    0xda,
-    0x32,
-    0x12,
-    0x6a,
-    0x6b,
-    0x81,
-    0x5f,
-    0x11,
-    0x0b,
-    0x20,
-    0x47,
-    0x4c,
-    0xc0,
-    0x0b,
-    0xa5,
-    0x1b,
-    0xdb,
-    0x62,
-    0xe6,
-    0xc4,
-    0xd9,
-    0xbe,
-    0x10,
-    0xc8,
-    0x88,
-    0xc5,
-    0x03,
-    0x15,
-    0x6b,
-    0xfc,
-    0x00,
-    0x7d,
-    0x5e,
-    0xdd,
-    0x67,
-    0x67,
-    0x7d,
-    0x2a,
-    0xc5,
-    0xc4,
-    0x43,
-    0x80,
-    0x0d,
-    0x45,
-    0xef,
-    0x2f,
-    0x26,
-    0xcb,
-    0x2c,
-    0x49,
-    0xa6,
-    0x20,
-    0xf0,
-    0xf9,
-    0xde,
-    0xe4,
-    0xa5,
-    0x16,
-    0x16,
-    0xca,
-    0x87,
-    0xf8,
-    0x19,
-    0x04,
-    0x4d,
-    0x8b,
-    0xf5,
-    0xfb,
-    0x0b,
-    0xa1,
-    0xfc,
-    0x44,
-    0x57,
-    0x8d,
-    0x0e,
-    0xcf,
-    0xab,
-    0xed,
-    0x1b,
-    0x62,
-    0x0a,
-    0xc7,
-    0xe3,
-    0x46,
-    0xe6,
-    0xd8,
-    0x00,
-    0x41,
-    0x42,
-    0x28,
-    0x27,
-    0xc4,
-    0x14,
-    0xe2,
-    0xab,
-    0x64,
-    0xed,
-    0x63,
-    0x42,
-    0x8e,
-    0xdb,
-    0x91,
-    0x0c,
-    0x77,
-    0x8f,
-    0x6e,
-    0xd1,
-    0x53,
-    0xbb,
-    0xed,
-    0x8b,
-    0xc7,
-    0xbe,
-    0x04,
-    0x24,
-    0xa0,
-    0x83,
-    0x02,
-    0x80,
-    0xc5,
-    0xa6,
-    0x23,
-    0xbe,
-    0x6a,
-    0xd9,
-    0x61,
-    0xbb,
-    0x87,
-    0x87,
-    0x8e,
-    0xd8,
-    0x89,
-    0xb7,
-    0xa0,
-    0xfe,
-    0x47,
-    0x32,
-    0x4c,
-    0xdf,
-    0x37,
-    0xe8,
-    0xd6,
-    0x7e,
-    0xe2,
-    0x90,
-    0x27,
-    0xf1,
-    0x95,
-    0x8f,
-    0x20,
-    0x65,
-    0x5a,
-    0x1b,
-    0x2e,
-    0x64,
-    0x26,
-    0xa0,
-    0x1e,
-    0x53,
-    0x54,
-    0x62,
-    0x33,
-    0x3f,
-    0x52,
-    0x65,
-    0x76,
-    0xd9,
-    0x9b,
-    0x8a,
-    0x4e,
-    0xbe,
-    0xe5,
-    0xfa,
-    0x50,
-    0xfc,
-    0x9b,
-    0xc7,
-    0x58,
-    0xd2,
-    0x8d,
-    0xd1,
-    0xd9,
-    0xb8,
-    0xe7,
-    0xe7,
-    0x71,
-    0x9f,
-    0x5f,
-    0x2f,
-    0xc1,
-    0x7a,
-    0xb3,
-    0xc8,
-    0x7b,
-    0xfd,
-    0x53,
-    0xad,
-    0xbc,
-    0xa5,
-    0x5a,
-    0xdd,
-    0x9d,
-    0xf8,
-    0xc3,
-    0xb9,
-    0x05,
-    0x0e,
-    0xda,
-    0xad,
-    0xc1,
-    0x50,
-    0xf0,
-    0x12,
-    0xd6,
-    0x80,
-    0x53,
-    0x53,
-    0x15,
-    0xfa,
-    0x7e,
-    0x4f,
-    0xf1,
-    0x39,
-    0x8c,
-    0xff,
-    0x8e,
-    0x9c,
-    0xf3,
-    0x59,
-    0x1a,
-    0x6a,
-    0x6e,
-    0x74,
-    0x60,
-    0x15,
-    0x3b,
-    0xec,
-    0x9a,
-    0xbb,
-    0x87,
-    0x88,
-    0x87,
-    0xf2,
-    0x27,
-    0x1a,
-    0xbe,
-    0xc5,
-    0x88,
-    0xa7,
-    0x42,
-    0xfa,
-    0xe9,
-    0xc8,
-    0x56,
-    0x97,
-    0xc7,
-    0x50,
-    0x93,
-    0xa4,
-    0x99,
-    0x2f,
-    0x37,
-    0x31,
-    0xbe,
-    0x97,
-    0xc0,
-    0x9b,
-    0xb4,
-    0x5d,
-    0xba,
-    0x0c,
-    0x8a,
-    0xa1,
-    0xd5,
-    0x41,
-    0x98,
-    0xb1,
-    0x3a,
-    0x90,
-    0x6d,
-    0x2b,
-    0x1f,
-    0x29,
-    0x09,
-    0x62,
-    0x99,
-    0x9c,
-    0x4d,
-    0x03,
-    0xb2,
-    0x9b,
-    0xaf,
-    0xf9,
-    0xbc,
-    0x01,
-    0x32,
-    0x8d,
-    0xe5,
-    0x14,
-    0x96,
-    0xd2,
-    0x0b,
-    0x07,
-    0xcb,
-    0x40,
-    0xd1,
-    0xc4,
-    0xac,
-    0x9f,
-    0xf2,
-    0xe8,
-    0xea,
-    0x27,
-    0xd5,
-    0x0e,
-    0x46,
-    0xe5,
-    0x62,
-    0x50,
-    0x04,
-    0x60,
-    0x15,
-    0x0b,
-    0x9c,
-    0x7d,
-    0x50,
-    0xe3,
-    0xb2,
-    0xa0,
-    0xf6,
-    0x07,
-    0x48,
-    0x14,
-    0x35,
-    0xb6,
-    0x33,
-    0xad,
-    0xa3,
-    0x03,
-    0xcb,
-    0xab,
-    0x8d,
-    0xd5,
-    0xe7,
-    0xe2,
-    0x8b,
-    0x31,
-    0x09,
-    0x18,
-    0x58,
-    0xbc,
-    0xd5,
-    0xaf,
-    0xe1,
-    0x7b,
-    0xc8,
-    0x84,
-    0x9c,
-    0xde,
-    0x26,
-    0x16,
-    0x1b,
-    0xfd,
-    0x34,
-    0xeb,
-    0xe1,
-    0x21,
-    0xa8,
-    0x2f,
-    0x74,
-    0x86,
-    0x5e,
-    0x9f,
-    0xb4,
-    0x5f,
-    0x4c,
-    0xa5,
-    0x6a,
-    0x1b,
-    0xb8,
-    0xc4,
-    0x24,
-    0xe7,
-    0xa8,
-    0x37,
-    0x41,
-    0x74,
-    0x9b,
-    0xd5,
-    0x48,
-    0xfa,
-    0x76,
-    0x38,
-    0x7e,
-    0x7d,
-    0xc1,
-    0x1e,
-    0xb7,
-    0x4f,
-    0x13,
-    0x0f,
-    0x6c,
-    0xd6,
-    0xcb,
-    0x41,
-    0x0e,
-    0x8f,
-    0x01,
-    0xb8,
-    0x9a,
-    0x53,
-    0xbd,
-    0xb1,
-    0x6e,
-    0xd9,
-    0x66,
-    0x41,
-    0x5b,
-    0x7d,
-    0x7d,
-    0x3a,
-    0xfb,
-    0x3f,
-    0x8b,
-    0x4e,
-    0x44,
-    0x0f,
-    0x57,
-    0x77,
-    0x5e,
-    0x48,
-    0x5d,
-    0x96,
-    0xb2,
-    0x7a,
-    0x7c,
-    0x5a,
-    0x44,
-    0x6c,
-    0xef,
-    0x63,
-    0x42,
-    0x61,
-    0x7e,
-    0xa7,
-    0xdd,
-    0x9b,
-    0xf5,
-    0x15,
-    0x57,
-    0x1e,
-    0xd6,
-    0x79,
-    0x5d,
-    0xb6,
-    0x4b,
-    0xa0,
-    0x98,
-    0x3b,
-    0x5e,
-    0xbc,
-    0x7f,
-    0x14,
-    0x6c,
-    0x09,
-    0x6f,
-    0xfa,
-    0xd7,
-    0xb1,
-    0xfd,
-    0xfe,
-    0xfc,
-    0xee,
-    0x8b,
-    0xce,
-    0x65,
-    0x6e,
-    0x19,
-    0x34,
-    0x3f,
-    0xfb,
-    0x5e,
-    0xdf,
-    0x0e,
-    0x5b,
-    0x17,
-    0x66,
-    0x9f,
-    0x75,
-    0xa0,
-    0x8a,
-    0x3e,
-    0xb6,
-    0xc1,
-    0xbc,
-    0x2a,
-    0xb3,
-    0xca,
-    0xdf,
-    0x46,
-    0x10,
-    0xe2,
-    0x4e,
-    0x11,
-    0xa0,
-    0x9c,
-    0x21,
-    0xd8,
-    0xcd,
-    0xcb,
-    0xac,
-    0x2b,
-    0x3b,
-    0x98,
-    0x49,
-    0x8d,
-    0xa8,
-    0xd1,
-    0x58,
-    0x6f,
-    0x17,
-    0x84,
-    0x83,
-    0x60,
-    0x2d,
-    0xcd,
-    0x47,
-    0x7e,
-    0xdb,
-    0xec,
-    0xaf,
-    0x30,
-    0x3d,
-    0x9a,
-    0x63,
-    0x17,
-    0xc2,
-    0x9e,
-    0xe2,
-    0x41,
-    0x8e,
-    0x9b,
-    0x0c,
-    0xa0,
-    0x1c,
-    0x2c,
-    0xe3,
-    0xbb,
-    0x28,
-    0x32,
-    0x92,
-    0xa4,
-    0xcc,
-    0x6d,
-    0xaf,
-    0x2a,
-    0xe9,
-    0x4a,
-    0xbd,
-    0x4f,
-    0xc8,
-    0xfc,
-    0xf5,
-    0xfd,
-    0x01,
-    0xce,
-    0x46,
-    0xf4,
-    0x9c,
-    0xb8,
-    0x9a,
-    0x07,
-    0x77,
-    0x30,
-    0x5b,
-    0x88,
-    0xe7,
-    0x42,
-    0x35,
-    0x01,
-    0xa2,
-    0xe3,
-    0x1e,
-    0x24,
-    0xdd,
-    0x83,
-    0x94,
-    0x05,
-    0xb1,
-    0xe1,
-    0x26,
-    0x87,
-    0xc3,
-    0x23,
-    0x36,
-    0x14,
-    0x24,
-    0x26,
-    0xfd,
-    0x92,
-    0x76,
-    0x13,
-    0xd0,
-    0x92,
-    0x51,
-    0x33,
-    0xa1,
-    0xca,
-    0xe5,
-    0x04,
-    0xc8,
-    0xc5,
-    0xe0,
-    0x8c,
-    0x04,
-    0xd9,
-    0x92,
-    0xed,
-    0xbc,
-    0x5a,
-    0x4e,
-    0x3a,
-    0x8b,
-    0x0d,
-    0x14,
-    0x89,
-    0xfc,
-    0xdf,
-    0x6e,
-    0x49,
-    0x92,
-    0xd7,
-    0x98,
-    0xd6,
-    0x0c,
-    0x4a,
-    0xe3,
-    0x4b,
-    0xe6,
-    0x4e,
-    0x5b,
-    0x98,
-    0x23,
-    0x70,
-    0xa8,
-    0xd4,
-    0x4a,
-    0xaa,
-    0x32,
-    0xd4,
-    0xaf,
-    0x8f,
-    0x89,
-    0xfc,
-    0xf3,
-    0xc9,
-    0x03,
-    0x55,
-    0xce,
-    0xc5,
-    0xa7,
-    0xe0,
-    0x0c,
-    0xad,
-    0x49,
-    0x2a,
-    0xd6,
-    0x97,
-    0xf7,
-    0x21,
-    0x33,
-    0xfc,
-    0x94,
-    0x26,
-    0xcf,
-    0x6b,
-    0xc3,
-    0x63,
-    0xfa,
-    0x7e,
-    0x07,
-    0x5f,
-    0xf3,
-    0x0e,
-    0x28,
-    0xcf,
-    0x67,
-    0xa3,
-    0xd8,
-    0xb0,
-    0x35,
-    0x2e,
-    0x96,
-    0x92,
-    0x74,
-    0xfb,
-    0xd3,
-    0x37,
-    0xb7,
-    0xe1,
-    0x53,
-    0x5c,
-    0x8f,
-    0xbc,
-    0xd7,
-    0xd7,
-    0x52,
-    0x1d,
-    0xf9,
-    0xe2,
-    0x1b,
-    0x3f,
-    0x57,
-    0xb7,
-    0x12,
-    0x3d,
-    0xf3,
-    0x5d,
-    0xee,
-    0x83,
-    0xda,
-    0xc1,
-    0xb8,
-    0x82,
-    0x04,
-    0x08,
-    0xd1,
-    0xa9,
-    0x7c,
-    0x24,
-    0x36,
-    0x90,
-    0xc0,
-    0xa5,
-    0x03,
-    0x76,
-    0x6b,
-    0xd2,
-    0x36,
-    0xed,
-    0x11,
-    0xf9,
-    0xb6,
-    0xd4,
-    0x6b,
-    0x03,
-    0x94,
-    0x86,
-    0xb4,
-    0x4b,
-    0x90,
-    0x51,
-    0x52,
-    0xb1,
-    0xdf,
-    0x2a,
-    0xb9,
-    0xea,
-    0x2b,
-    0x9e,
-    0x8d,
-    0x1a,
-    0xdc,
-    0x0c,
-    0x06,
-    0xa4,
-    0x96,
-    0x12,
-    0x99,
-    0x40,
-    0x02,
-    0x45,
-    0xd5,
-    0x4f,
-    0xd2,
-    0x25,
-    0x8b,
-    0x6c,
-    0xff,
-    0x50,
-    0x31,
-    0x44,
-    0x55,
-    0xf5,
-    0x88,
-    0xa7,
-    0x32,
-    0x8c,
-    0x7d,
-    0xdf,
-    0x8b,
-    0xc4,
-    0x4d,
-    0x40,
-    0x2f,
-    0xbd,
-    0xed,
-    0x00,
-    0x50,
-    0x78,
-    0xa9,
-    0x49,
-    0x3f,
-    0x8c,
-    0x0b,
-    0x8d,
-    0x77,
-    0x1a,
-    0xfe,
-    0x1a,
-    0xdd,
-    0x02,
-    0x33,
-    0xee,
-    0x46,
-    0x57,
-    0xc4,
-    0xcc,
-    0x3a,
-    0x11,
-    0x18,
-    0x8f,
-    0xf8,
-    0x02,
-    0x06,
-    0xbf,
-    0xb9,
-    0x0c,
-    0x3d,
-    0x62,
-    0x39,
-    0x90,
-    0xe3,
-    0x14,
-    0x74,
-    0x29,
-    0x7c,
-    0x5a,
-    0xad,
-    0x9b,
-    0x0e,
-    0x34,
-    0xb5,
-    0x06,
-    0x82,
-    0xf1,
-    0x6a,
-    0x60,
-    0x4e,
-    0x47,
-    0x7e,
-    0x21,
-    0x51,
-    0xa3,
-    0x7a,
-    0x40,
-    0xfe,
-    0xbe,
-    0x02,
-    0x5f,
-    0xbd,
-    0x71,
-    0x5a,
-    0x43,
-    0x8e,
-    0xca,
-    0x29,
-    0x86,
-    0xf0,
-    0x5f,
-    0x7d,
-    0x90,
-    0x01,
-    0xe2,
-    0x10,
-    0xc3,
-    0xe6,
-    0xf6,
-    0xca,
-    0xf6,
-    0x6d,
-    0x41,
-    0x86,
-    0x25,
-    0xf1,
-    0xc3,
-    0x19,
-    0x66,
-    0x7f,
-    0x66,
-    0x90,
-    0x1f,
-    0x36,
-    0xd6,
-    0xba,
-    0x77,
-    0xf4,
-    0x92,
-    0xe7,
-    0x0a,
-    0x2f,
-    0x44,
-    0xee,
-    0xe1,
-    0x20,
-    0x4e,
-    0x75,
-    0xa1,
-    0x27,
-    0xa5,
-    0x6c,
-    0x02,
-    0x6b,
-    0xe2,
-    0xdb,
-    0x83,
-    0xc1,
-    0x96,
-    0xde,
-    0x5d,
-    0xcf,
-    0xde,
-    0xed,
-    0xb5,
-    0x71,
-    0x38,
-    0x61,
-    0x15,
-    0x5b,
-    0x95,
-    0x34,
-    0x1d,
-    0x00,
-    0xb0,
-    0x09,
-    0x76,
-    0xb3,
-    0x9d,
-    0x6c,
-    0x08,
-    0x0c,
-    0xa5,
-    0x5a,
-    0x6d,
-    0x8e,
-    0x51,
-    0x04,
-    0xa5,
-    0x86,
-    0xc5,
-    0xd0,
-    0x0b,
-    0x36,
-    0x4f,
-    0xa1,
-    0x87,
-    0x33,
-    0x40,
-    0x58,
-    0x06,
-    0x0c,
-    0xfb,
-    0x9b,
-    0x27,
-    0x2c,
-    0x4b,
-    0xd5,
-    0x37,
-    0x02,
-    0xfa,
-    0x7d,
-    0x60,
-    0x5f,
-    0x9f,
-    0x9c,
-    0x1d,
-    0x1f,
-    0xb7,
-    0x89,
-    0xf1,
-    0x0b,
-    0xf7,
-    0xf7,
-    0x59,
-    0xfe,
-    0xe1,
-    0x32,
-    0xff,
-    0x47,
-    0x96,
-    0xa6,
-    0x30,
-    0x4f,
-    0xeb,
-    0xa1,
-    0x90,
-    0x7c,
-    0xbe,
-    0x5a,
-    0x0d,
-    0x54,
-    0x8b,
-    0x31,
-    0x11,
-    0xe6,
-    0x3a,
-    0x38,
-    0xfc,
-    0x65,
-    0x3b,
-    0xf3,
-    0xd1,
-    0x17,
-    0xd5,
-    0x5c,
-    0x2f,
-    0x6d,
-    0xbb,
-    0x2a,
-    0x84,
-    0x74,
-    0xe1,
-    0x53,
-    0x7d,
-    0x6c,
-    0x8d,
-    0xd0,
-    0xc1,
-    0xb5,
-    0xb1,
-    0xa0,
-    0xde,
-    0xf3,
-    0x78,
-    0x0f,
-    0x83,
-    0x6a,
-    0x1f,
-    0x38,
-    0xf1,
-    0xaa,
-    0x06,
-    0xc9,
-    0xac,
-    0x71,
-    0x07,
-    0x06,
-    0x76,
-    0xcd,
-    0x06,
-    0x11,
-    0x7d,
-    0x81,
-    0xc9,
-    0x68,
-    0xd4,
-    0xaa,
-    0x0a,
-    0xaf,
-    0x20,
-    0xa2,
-    0xcb,
-    0xb0,
-    0x94,
-    0x25,
-    0xea,
-    0xa0,
-    0x1f,
-    0xb2,
-    0xf5,
-    0xa3,
-    0xe3,
-    0x34,
-    0x3f,
-    0x93,
-    0xea,
-    0xe2,
-    0x34,
-    0xfd,
-    0x14,
-    0x64,
-    0xe9,
-    0x6d,
-    0x54,
-    0x37,
-    0xf8,
-    0xec,
-    0x1c,
-    0x52,
-    0x8a,
-    0xc6,
-    0x16,
-    0x0a,
-    0xb5,
-    0x91,
-    0x15,
-    0x33,
-    0x09,
-    0x6a,
-    0x4b,
-    0x88,
-    0x65,
-    0x82,
-    0xbc,
-    0x4d,
-    0x0f,
-    0xda,
-    0xf2,
-    0x32,
-    0x04,
-    0x4a,
-    0xf3,
-    0x7b,
-    0x8d,
-    0xc8,
-    0x70,
-    0x5e,
-    0x13,
-    0xe7,
-    0x3f,
-    0xac,
-    0x34,
-    0x9e,
-    0x0c,
-    0xb4,
-    0x17,
-    0x4b,
-    0x4b,
-    0x65,
-    0xfc,
-    0xf7,
-    0x70,
-    0xb2,
-    0x17,
-    0xdc,
-    0x63,
-    0x3b,
-    0x9e,
-    0x24,
-    0x2e,
-    0x29,
-    0x21,
-    0xf4,
-    0xf9,
-    0x59,
-    0x1a,
-    0xa9,
-    0x39,
-    0xbe,
-    0xc5,
-    0x62,
-    0x24,
-    0x00,
-    0x31,
-    0xbe,
-    0x68,
-    0x69,
-    0x97,
-    0xe7,
-    0x1c,
-    0x02,
-    0xec,
-    0xcf,
-    0xf7,
-    0xf9,
-    0xb2,
-    0xb9,
-    0xc0,
-    0x46,
-    0x13,
-    0xfc,
-    0x05,
-    0x8e,
-    0x30,
-    0x03,
-    0x10,
-    0x48,
-    0xb7,
-    0x99,
-    0x17,
-    0x1e,
-    0xb3,
-    0x63,
-    0xb3,
-    0x96,
-    0xa9,
-    0xae,
-    0x93,
-    0xf1,
-    0xe0,
-    0x6c,
-    0x72,
-    0x54,
-    0x00,
-    0x78,
-    0x46,
-    0x25,
-    0xdf,
-    0x22,
-    0xbb,
-    0xb8,
-    0x97,
-    0xe7,
-    0xdf,
-    0x2b,
-    0xdc,
-    0x80,
-    0x1f,
-    0x8e,
-    0x8c,
-    0x1f,
-    0x72,
-    0x47,
-    0x88,
-    0xf5,
-    0xd4,
-    0xb5,
-    0xc3,
-    0xf7,
-    0xf6,
-    0x14,
-    0x98,
-    0xe2,
-    0x34,
-    0xa1,
-    0x61,
-    0x7c,
-    0xc7,
-    0xfe,
-    0x45,
-    0x1d,
-    0x3c,
-    0xd7,
-    0x51,
-    0x6f,
-    0x24,
-    0xc6,
-    0xca,
-    0x72,
-    0x0e,
-    0x74,
-    0xc2,
-    0xc3,
-    0xb2,
-    0x02,
-    0xea,
-    0x1d,
-    0x6f,
-    0xa7,
-    0xa7,
-    0x20,
-    0xf8,
-    0x9a,
-    0x68,
-    0x51,
-    0x4a,
-    0x32,
-    0x36,
-    0x63,
-    0xe1,
-    0x4b,
-    0x8d,
-    0xb5,
-    0x2b,
-    0xed,
-    0x6a,
-    0x1b,
-    0x3d,
-    0x28,
-    0xa5,
-    0xe1,
-    0xc5,
-    0x42,
-    0x81,
-    0x0d,
-    0x3f,
-    0x15,
-    0x82,
-    0xe5,
-    0x6c,
-    0xb2,
-    0x7e,
-    0xb1,
-    0x00,
-    0x4a,
-    0xf7,
-    0xc2,
-    0x9b,
-    0x4f,
-    0xa8,
-    0xb3,
-    0xfb,
-    0xd6,
-    0x5e,
-    0xef,
-    0x70,
-    0x40,
-    0x09,
-    0x73,
-    0x90,
-    0x19,
-    0x13,
-    0xd6,
-    0x2b,
-    0x40,
-    0xf0,
-    0x86,
-    0x82,
-    0x48,
-    0xf7,
-    0x54,
-    0xb3,
-    0x1f,
-    0x70,
-    0x33,
-    0x78,
-    0xed,
-    0xee,
-    0x3c,
-    0x11,
-    0x3f,
-    0xdf,
-    0xf6,
-    0x7f,
-    0x65,
-    0x61,
-    0xd5,
-    0xf3,
-    0x18,
-    0x57,
-    0x00,
-    0x86,
-    0x61,
-    0xbc,
-    0x57,
-    0x2a,
-    0xb6,
-    0x38,
-    0xb5,
-    0xe1,
-    0x65,
-    0xf1,
-    0x72,
-    0x2d,
-    0x36,
-    0xa4,
-    0x2d,
-    0xc7,
-    0x4b,
-    0xf4,
-    0xc8,
-    0x93,
-    0x4c,
-    0x02,
-    0xb3,
-    0xd4,
-    0xc1,
-    0x3d,
-    0x6e,
-    0x9d,
-    0xbf,
-    0x7c,
-    0x49,
-    0x88,
-    0xc7,
-    0x4a,
-    0x6f,
-    0xa9,
-    0xeb,
-    0x80,
-    0x22,
-    0xc5,
-    0x32,
-    0x1a,
-    0x48,
-    0xc0,
-    0x3e,
-    0x43,
-    0x27,
-    0x55,
-    0x2c,
-    0xb2,
-    0x6d,
-    0x0a,
-    0xbc,
-    0x39,
-    0x73,
-    0x62,
-    0xb2,
-    0x9b,
-    0xc2,
-    0x54,
-    0x7c,
-    0x9f,
-    0xd7,
-    0xfc,
-    0x14,
-    0x62,
-    0x23,
-    0x91,
-    0x28,
-    0xf1,
-    0x56,
-    0x97,
-    0x79,
-    0x17,
-    0xdd,
-    0x55,
-    0x81,
-    0x74,
-    0xa9,
-    0x8a,
-    0x58,
-    0xcf,
-    0x33,
-    0x5c,
-    0xd8,
-    0xae,
-    0xbd,
-    0x91,
-    0x00,
-    0x23,
-    0xda,
-    0x01,
-    0x96,
-    0xe8,
-    0x30,
-    0x4b,
-    0x10,
-    0xae,
-    0x7d,
-    0xc8,
-    0xb5,
-    0xb3,
-    0xd8,
-    0xbd,
-    0x00,
-    0x93,
-    0x3a,
-    0xd5,
-    0x45,
-    0x60,
-    0x3c,
-    0xce,
-    0x96,
-    0xf4,
-    0x22,
-    0x72,
-    0xe8,
-    0x86,
-    0x19,
-    0xc9,
-    0x72,
-    0x7c,
-    0xbd,
-    0x8d,
-    0x56,
-    0x80,
-    0xde,
-    0xde,
-    0x83,
-    0xd6,
-    0x84,
-    0x37,
-    0xda,
-    0xed,
-    0x30,
-    0xa1,
-    0x90,
-    0x34,
-    0x65,
-    0x26,
-    0xd3,
-    0x2e,
-    0x67,
-    0x89,
-    0xb0,
-    0xc9,
-    0x43,
-    0x34,
-    0x34,
-    0xec,
-    0x0f,
-    0x72,
-    0xd1,
-    0x4f,
-    0x73,
-    0xde,
-    0x04,
-    0x8f,
-    0x69,
-    0x1c,
-    0x35,
-    0x82,
-    0x40,
-    0xc6,
-    0xdf,
-    0xc8,
-    0xe7,
-    0xa9,
-    0xf0,
-    0xa2,
-    0x68,
-    0x32,
-    0x73,
-    0x07,
-    0xb3,
-    0x23,
-    0x6c,
-    0xf5,
-    0x9d,
-    0x8a,
-    0x03,
-    0x06,
-    0x28,
-    0xf4,
-    0xe5,
-    0x43,
-    0x05,
-    0xde,
-    0xe8,
-    0x3c,
-    0x57,
-    0x6c,
-    0xee,
-    0x59,
-    0xba,
-    0x5e,
-    0x0b,
-    0x6b,
-    0x84,
-    0x3f,
-    0xea,
-    0x86,
-    0x4b,
-    0xdf,
-    0x6c,
-    0x13,
-    0xa7,
-    0x04,
-    0x93,
-    0x21,
-    0x38,
-    0x5d,
-    0x9f,
-    0xfc,
-    0xeb,
-    0xb7,
-    0x76,
-    0x01,
-    0x7a,
-    0x73,
-    0x49,
-    0xb0,
-    0x32,
-    0x38,
-    0x75,
-    0x03,
-    0xf9,
-    0xe5,
-    0xa7,
-    0xfe,
-    0x8f,
-    0xca,
-    0x44,
-    0x88,
-    0x14,
-    0x17,
-    0x08,
-    0x79,
-    0xcb,
-    0x94,
-    0xed,
-    0xf4,
-    0x1d,
-    0x93,
-    0x4e,
-    0xf7,
-    0xe1,
-    0x24,
-    0x4c,
-    0x30,
-    0xda,
-    0x87,
-    0x71,
-    0x13,
-    0x81,
-    0xe7,
-    0x93,
-    0x29,
-    0x05,
-    0x45,
-    0xfb,
-    0xab,
-    0x91,
-    0xb2,
-    0xc7,
-    0x4f,
-    0xcd,
-    0xc1,
-    0x8d,
-    0x62,
-    0xa7,
-    0x3c,
-    0x41,
-    0x17,
-    0x53,
-    0x16,
-    0x59,
-    0x1f,
-    0x90,
-    0xa1,
-    0x2e,
-    0x79,
-    0x2e,
-    0x01,
-    0xa6,
-    0x8c,
-    0xcd,
-    0xe1,
-    0x10,
-    0x73,
-    0xe7,
-    0x64,
-    0x4f,
-    0x98,
-    0x11,
-    0x5e,
-    0x3b,
-    0x84,
-    0x7d,
-    0xc5,
-    0x44,
-    0xf5,
-    0xc4,
-    0x62,
-    0x59,
-    0x31,
-    0xe2,
-    0xcc,
-    0x08,
-    0x9b,
-    0x82,
-    0x97,
-    0xe6,
-    0x84,
-    0x7d,
-    0xc9,
-    0x31,
-    0x43,
-    0x9d,
-    0x8d,
-    0xb4,
-    0x88,
-    0xa6,
-    0x2c,
-    0xeb,
-    0xed,
-    0x97,
-    0x38,
-    0x68,
-    0xce,
-    0x2d,
-    0x0b,
-    0x75,
-    0x5b,
-    0xa9,
-    0x70,
-    0xfb,
-    0xeb,
-    0xd3,
-    0x9f,
-    0xa2,
-    0x94,
-    0x3f,
-    0x6f,
-    0x3a,
-    0xf8,
-    0xcf,
-    0xc7,
-    0x5a,
-    0x61,
-    0x79,
-    0x55,
-    0x46,
-    0x11,
-    0x4a,
-    0x83,
-    0x16,
-    0xd3,
-    0xab,
-    0xa7,
-    0x15,
-    0xd6,
-    0xe4,
-    0x7a,
-    0x68,
-    0xbb,
-    0xde,
-    0xcc,
-    0xf0,
-    0xed,
-    0x2d,
-    0x76,
-    0x71,
-    0x31,
-    0x4d,
-    0x8f,
-    0xf3,
-    0x7e,
-    0x2c,
-    0xe3,
-    0x68,
-    0x0e,
-    0xe9,
-    0xa0,
-    0x90,
-    0xb5,
-    0xdc,
-    0x53,
-    0x1a,
-    0x72,
-    0xd6,
-    0x13,
-    0x0c,
-    0x44,
-    0xaa,
-    0xfc,
-    0x64,
-    0x3e,
-    0xec,
-    0xe0,
-    0xff,
-    0xde,
-    0xf8,
-    0x38,
-    0xbb,
-    0x9b,
-    0x36,
-    0x61,
-    0xd9,
-    0xbd,
-    0x9d,
-    0x05,
-    0xa5,
-    0x71,
-    0x76,
-    0xd7,
-    0x58,
-    0x1d,
-    0x63,
-    0x83,
-    0x3d,
-    0xf1,
-    0x9f,
-    0xe4,
-    0x13,
-    0xbf,
-    0x87,
-    0x78,
-    0xb3,
-    0x0c,
-    0x5a,
-    0x12,
-    0xf2,
-    0x67,
-    0x3d,
-    0xcf,
-    0xc9,
-    0xf9,
-    0x82,
-    0x4b,
-    0xb3,
-    0x5e,
-    0x29,
-    0x15,
-    0x57,
-    0xb3,
-    0xa7,
-    0x60,
-    0x67,
-    0xf0,
-    0xe7,
-    0xfb,
-    0xc8,
-    0x78,
-    0x8f,
-    0x83,
-    0xf3,
-    0xef,
-    0x84,
-    0xd7,
-    0x9b,
-    0x4c,
-    0xb0,
-    0xcc,
-    0x90,
-    0x2f,
-    0x03,
-    0x22,
-    0xe3,
-    0x74,
-    0xb7,
-    0xb7,
-    0x4b,
-    0x08,
-    0xd9,
-    0xfb,
-    0xc7,
-    0xfb,
-    0x05,
-    0xa4,
-    0x85,
-    0xd7,
-    0x71,
-    0xa3,
-    0x03,
-    0x31,
-    0x2c,
-    0x56,
-    0x74,
-    0x7d,
-    0xa8,
-    0xff,
-    0x65,
-    0x27,
-    0x77,
-    0x75,
-    0xa0,
-    0xdf,
-    0x52,
-    0x19,
-    0x50,
-    0x34,
-    0x5f,
-    0x0c,
-    0x67,
-    0x64,
-    0xb4,
-    0x9f,
-    0x3d,
-    0x72,
-    0x17,
-    0x0b,
-    0x79,
-    0x7a,
-    0x07,
-    0x63,
-    0x35,
-    0x42,
-    0x01,
-    0xc6,
-    0x5d,
-    0x11,
-    0xfc,
-    0xd9,
-    0x58,
-    0xc4,
-    0x36,
-    0x74,
-    0xeb,
-    0x1e,
-    0x32,
-    0x9c,
-    0x5a,
-    0x60,
-    0x01,
-    0xb2,
-    0xd0,
-    0x19,
-    0xc2,
-    0xe9,
-    0x00,
-    0x40,
-    0x65,
-    0xfe,
-    0x0d,
-    0x80,
-    0xb4,
-    0x23,
-    0xa7,
-    0xd3,
-    0x93,
-    0x3c,
-    0x78,
-    0x52,
-    0x86,
-    0x4d,
-    0xbe,
-    0x4c,
-    0x75,
-    0x33,
-    0x39,
-    0x95,
-    0xac,
-    0x93,
-    0x47,
-    0x20,
-    0x26,
-    0x11,
-    0x4e,
-    0xd0,
-    0x0b,
-    0xc2,
-    0x5a,
-    0x8c,
-    0x77,
-    0xe3,
-    0x07,
-    0x92,
-    0x7d,
-    0xcb,
-    0xa2,
-    0x0d,
-    0x6c,
-    0x1e,
-    0x8b,
-    0xe9,
-    0x50,
-    0x44,
-    0xdd,
-    0xe6,
-    0xbc,
-    0x19,
-    0x51,
-    0xeb,
-    0xc7,
-    0xe6,
-    0x60,
-    0x9e,
-    0x55,
-    0x91,
-    0xa8,
-    0x31,
-    0x98,
-    0x10,
-    0x91,
-    0x7e,
-    0xd6,
-    0x23,
-    0x30,
-    0x57,
-    0x6c,
-    0x43,
-    0x6c,
-    0x17,
-    0x13,
-    0xd5,
-    0x5f,
-    0x7d,
-    0x62,
-    0xa4,
-    0xff,
-    0xbb,
-    0x94,
-    0x8e,
-    0xfd,
-    0xc9,
-    0x8c,
-    0x7e,
-    0xed,
-    0xff,
-    0x16,
-    0x9a,
-    0xa8,
-    0xe3,
-    0x70,
-    0xbd,
-    0xee,
-    0x40,
-    0x09,
-    0x27,
-    0x50,
-    0x78,
-    0x88,
-    0x73,
-    0x4d,
-    0x1a,
-    0x10,
-    0xca,
-    0xbc,
-    0xb7,
-    0xc2,
-    0x57,
-    0x6a,
-    0xf2,
-    0x84,
-    0xfa,
-    0x03,
-    0xd7,
-    0x01,
-    0x41,
-    0x36,
-    0x6e,
-    0xf1,
-    0x94,
-    0x14,
-    0x8f,
-    0x9b,
-    0xaf,
-    0xb9,
-    0xf7,
-    0x98,
-    0x56,
-    0x2f,
-    0x9c,
-    0xd9,
-    0x43,
-    0x8f,
-    0x3e,
-    0xec,
-    0x64,
-    0x69,
-    0x3f,
-    0x7a,
-    0x43,
-    0x66,
-    0xb4,
-    0x15,
-    0xc6,
-    0x2c,
-    0xbc,
-    0x30,
-    0x18,
-    0x82,
-    0x11,
-    0x6f,
-    0xe7,
-    0xb5,
-    0xdc,
-    0x22,
-    0xd0,
-    0x3a,
-    0xce,
-    0x0c,
-    0x17,
-    0x94,
-    0x6c,
-    0x68,
-    0x9c,
-    0x79,
-    0xaa,
-    0x2e,
-    0x0a,
-    0x30,
-    0xbc,
-    0x92,
-    0x52,
-    0x3d,
-    0x29,
-    0xcd,
-    0x58,
-    0x40,
-    0x21,
-    0x21,
-    0xeb,
-    0x1b,
-    0x10,
-    0x17,
-    0xfb,
-    0x53,
-    0x73,
-    0x0c,
-    0x06,
-    0xb9,
-    0xeb,
-    0xeb,
-    0xd4,
-    0x49,
-    0x8f,
-    0x3c,
-    0x64,
-    0x52,
-    0x87,
-    0x5e,
-    0x26,
-    0xd7,
-    0xd7,
-    0x10,
-    0x6b,
-    0x35,
-    0x78,
-    0x37,
-    0x19,
-    0x07,
-    0xad,
-    0xdb,
-    0xa3,
-    0x47,
-    0x94,
-    0x72,
-    0x38,
-    0xb6,
-    0xfb,
-    0x61,
-    0x3b,
-    0x7d,
-    0x76,
-    0xc0,
-    0xf4,
-    0x14,
-    0xae,
-    0x5d,
-    0x85,
-    0x63,
-    0xfc,
-    0x04,
-    0x1f,
-    0x27,
-    0x37,
-    0xfe,
-    0x75,
-    0x98,
-    0xca,
-    0xd8,
-    0x71,
-    0x49,
-    0x09,
-    0x66,
-    0x26,
-    0x4f,
-    0xc5,
-    0x06,
-    0x07,
-    0xa5,
-    0x1d,
-    0x29,
-    0x56,
-    0xcf,
-    0x98,
-    0x10,
-    0xdf,
-    0xbe,
-    0x71,
-    0xd4,
-    0xe5,
-    0xf4,
-    0x32,
-    0xa9,
-    0x5d,
-    0xe8,
-    0x84,
-    0x63,
-    0x5a,
-    0xac,
-    0x46,
-    0x3a,
-    0xc9,
-    0xcd,
-    0xdc,
-    0xca,
-    0x5e,
-    0x7b,
-    0xca,
-    0x5e,
-    0xce,
-    0xe9,
-    0x81,
-    0x6d,
-    0x3f,
-    0xf7,
-    0x78,
-    0x65,
-    0xfc,
-    0x0f,
-    0x7f,
-    0xa8,
-    0x6e,
-    0x4c,
-    0x51,
-    0xd4,
-    0x48,
-    0xe2,
-    0x68,
-    0x48,
-    0x01,
-    0xba,
-    0x15,
-    0xe4,
-    0x87,
-    0x5c,
-    0xcf,
-    0x0f,
-    0x32,
-    0x12,
-    0xcc,
-    0xff,
-    0xf6,
-    0x4a,
-    0xce,
-    0x35,
-    0xde,
-    0x3d,
-    0x40,
-    0x46,
-    0xb5,
-    0xce,
-    0x81,
-    0xe1,
-    0x06,
-    0xb5,
-    0x80,
-    0x0e,
-    0x48,
-    0xdc,
-    0x89,
-    0xb4,
-    0x52,
-    0x09,
-    0x5e,
-    0x5e,
-    0x15,
-    0xbe,
-    0x8a,
-    0x3e,
-    0x89,
-    0x5e,
-    0xf2,
-    0x73,
-    0xe8,
-    0x90,
-    0xad,
-    0x87,
-    0x1b,
-    0xe8,
-    0x15,
-    0x3c,
-    0x71,
-    0xc5,
-    0x1e,
-    0x88,
-    0x97,
-    0x75,
-    0xe7,
-    0xde,
-    0xc5,
-    0xa0,
-    0x8f,
-    0xaf,
-    0x35,
-    0xe3,
-    0x4a,
-    0x31,
-    0xd9,
-    0xbb,
-    0xb4,
-    0x5f,
-    0x4d,
-    0xa5,
-    0x65,
-    0x41,
-    0x0b,
-    0x83,
-    0xc5,
-    0x6d,
-    0xde,
-    0x42,
-    0x21,
-    0xce,
-    0x99,
-    0xba
-  ],
-  const [
-    0xa2,
-    0x4a,
-    0x4c,
-    0xc2,
-    0x9e,
-    0x44,
-    0xd5,
-    0x03,
-    0x86,
-    0xc9,
-    0xca,
-    0xda,
-    0x21,
-    0xd7,
-    0x41,
-    0xd3,
-    0x5c,
-    0xf8,
-    0xaa,
-    0x71,
-    0x3c,
-    0x6a,
-    0x5f,
-    0x72,
-    0x16,
-    0x7e,
-    0x7c,
-    0x55,
-    0x02,
-    0x3e,
-    0xf0,
-    0x1a,
-    0x8d,
-    0x52,
-    0xd4,
-    0x49,
-    0xae,
-    0x25,
-    0xfc,
-    0x35,
-    0xfc,
-    0x43,
-    0xcc,
-    0x82,
-    0x1d,
-    0x06,
-    0x4d,
-    0xe5,
-    0x82,
-    0x71,
-    0x80,
-    0x2b,
-    0x51,
-    0x5c,
-    0xf3,
-    0x7d,
-    0xa3,
-    0xd1,
-    0x91,
-    0xe2,
-    0xf0,
-    0xb7,
-    0xbe,
-    0x05,
-    0xc7,
-    0xad,
-    0xa4,
-    0x39,
-    0xc3,
-    0x39,
-    0xc7,
-    0xba,
-    0xba,
-    0x22,
-    0xe0,
-    0x35,
-    0x37,
-    0x1a,
-    0xe8,
-    0x8b,
-    0x2b,
-    0xa0,
-    0x73,
-    0xd3,
-    0xdf,
-    0x25,
-    0x3f,
-    0x9e,
-    0x2d,
-    0x6e,
-    0x0d,
-    0x7e,
-    0xf0,
-    0x39,
-    0xaf,
-    0xc9,
-    0xb9,
-    0x23,
-    0x63,
-    0x9a,
-    0xc4,
-    0xc9,
-    0x5f,
-    0x19,
-    0x2a,
-    0x2e,
-    0xad,
-    0xfc,
-    0x57,
-    0x5d,
-    0x39,
-    0x4e,
-    0xbf,
-    0x4f,
-    0x29,
-    0x6f,
-    0xcd,
-    0x0e,
-    0x6c,
-    0x5d,
-    0x1c,
-    0x1b,
-    0x96,
-    0x31,
-    0xea,
-    0x0d,
-    0xeb,
-    0xed,
-    0xca,
-    0x7c,
-    0xb9,
-    0x74,
-    0x98,
-    0x1d,
-    0xec,
-    0xda,
-    0xb2,
-    0x2e,
-    0xdc,
-    0xde,
-    0x65,
-    0x15,
-    0x69,
-    0xb5,
-    0xa6,
-    0x44,
-    0x4a,
-    0x0a,
-    0x03,
-    0x5f,
-    0xa2,
-    0x42,
-    0xd9,
-    0xa1,
-    0xd4,
-    0x04,
-    0xc6,
-    0x7c,
-    0x99,
-    0xf9,
-    0x61,
-    0x7f,
-    0x50,
-    0xd0,
-    0x29,
-    0x7d,
-    0x95,
-    0x86,
-    0xbc,
-    0xec,
-    0x14,
-    0xe4,
-    0x4a,
-    0x8b,
-    0x9f,
-    0x49,
-    0x48,
-    0x48,
-    0x7f,
-    0xa9,
-    0x69,
-    0x60,
-    0x08,
-    0xd6,
-    0xca,
-    0xc8,
-    0x71,
-    0xfe,
-    0x6c,
-    0xcc,
-    0xe2,
-    0x75,
-    0xe8,
-    0xf6,
-    0xcd,
-    0xb5,
-    0x5e,
-    0x31,
-    0x82,
-    0xa4,
-    0xaf,
-    0x2e,
-    0xfe,
-    0x15,
-    0xec,
-    0x07,
-    0x04,
-    0x90,
-    0x0e,
-    0x22,
-    0x70,
-    0x56,
-    0xe7,
-    0x59,
-    0xc7,
-    0xa0,
-    0x58,
-    0x57,
-    0x12,
-    0x28,
-    0xc5,
-    0x45,
-    0xed,
-    0xea,
-    0xc6,
-    0xa7,
-    0xdb,
-    0x2c,
-    0x1f,
-    0x80,
-    0xdc,
-    0xbc,
-    0xf3,
-    0xbd,
-    0x42,
-    0x79,
-    0x34,
-    0xd0,
-    0xc0,
-    0x14,
-    0x5e,
-    0x9c,
-    0xc4,
-    0x18,
-    0x65,
-    0x91,
-    0x06,
-    0x28,
-    0xeb,
-    0x18,
-    0x61,
-    0x88,
-    0xb7,
-    0x31,
-    0xe3,
-    0xe0,
-    0x63,
-    0x5a,
-    0x20,
-    0x3c,
-    0x54,
-    0xb4,
-    0xcb,
-    0x56,
-    0xf0,
-    0x61,
-    0x87,
-    0x18,
-    0x0a,
-    0x30,
-    0xfa,
-    0x5d,
-    0xa1,
-    0x7c,
-    0x23,
-    0xf8,
-    0xcb,
-    0x51,
-    0xee,
-    0xf7,
-    0xec,
-    0xd1,
-    0x06,
-    0x29,
-    0x2b,
-    0xd6,
-    0xeb,
-    0xdd,
-    0x27,
-    0xd9,
-    0x44,
-    0xed,
-    0xe5,
-    0x13,
-    0x76,
-    0xfb,
-    0x0e,
-    0xe1,
-    0x75,
-    0xfb,
-    0x57,
-    0x6d,
-    0xdb,
-    0xf1,
-    0x40,
-    0x8b,
-    0x37,
-    0xfc,
-    0x01,
-    0xe1,
-    0xa7,
-    0x94,
-    0xc1,
-    0x4b,
-    0xa9,
-    0x10,
-    0x0a,
-    0x7e,
-    0x2e,
-    0x6b,
-    0x7a,
-    0xeb,
-    0xf0,
-    0x47,
-    0xbb,
-    0xe6,
-    0x06,
-    0x32,
-    0xb5,
-    0x07,
-    0xb5,
-    0x29,
-    0x01,
-    0xd0,
-    0x8a,
-    0x5a,
-    0xa1,
-    0x91,
-    0xa5,
-    0x2e,
-    0xef,
-    0x89,
-    0x58,
-    0x87,
-    0xd4,
-    0x4e,
-    0xf1,
-    0x47,
-    0x3a,
-    0x6f,
-    0xd3,
-    0x11,
-    0xc4,
-    0x57,
-    0xcc,
-    0x53,
-    0xbc,
-    0x74,
-    0xa2,
-    0x84,
-    0x4d,
-    0x99,
-    0xef,
-    0xaa,
-    0xf2,
-    0xa1,
-    0x2f,
-    0x20,
-    0x2e,
-    0x56,
-    0x18,
-    0x96,
-    0x7e,
-    0x91,
-    0x2a,
-    0x59,
-    0x8c,
-    0xa2,
-    0x86,
-    0xd5,
-    0xa5,
-    0xf1,
-    0x03,
-    0x58,
-    0x6d,
-    0xe6,
-    0x7f,
-    0x18,
-    0xd1,
-    0x07,
-    0x73,
-    0x78,
-    0x3e,
-    0x60,
-    0xca,
-    0x87,
-    0x10,
-    0x28,
-    0xf4,
-    0xc9,
-    0x4e,
-    0xa1,
-    0x36,
-    0x3b,
-    0x94,
-    0x40,
-    0x44,
-    0x91,
-    0x50,
-    0x0e,
-    0x11,
-    0xc2,
-    0x31,
-    0x4e,
-    0xe6,
-    0xc6,
-    0xdd,
-    0x60,
-    0xb2,
-    0x9e,
-    0xe3,
-    0xe5,
-    0xa1,
-    0x96,
-    0xf0,
-    0x24,
-    0xef,
-    0xc7,
-    0x45,
-    0xad,
-    0xff,
-    0xdf,
-    0x68,
-    0x3b,
-    0xa7,
-    0x25,
-    0x1a,
-    0xdf,
-    0xce,
-    0xb7,
-    0x8a,
-    0x5b,
-    0x3a,
-    0x16,
-    0xc8,
-    0xcc,
-    0xa3,
-    0xe5,
-    0x7c,
-    0x8d,
-    0x0c,
-    0xee,
-    0xd8,
-    0x57,
-    0x53,
-    0x66,
-    0xcb,
-    0xad,
-    0x06,
-    0x72,
-    0x78,
-    0x77,
-    0x78,
-    0xea,
-    0xe6,
-    0xed,
-    0x14,
-    0x5c,
-    0xf9,
-    0xb6,
-    0xf2,
-    0x54,
-    0xa1,
-    0x51,
-    0xa8,
-    0xda,
-    0x51,
-    0xb5,
-    0x63,
-    0x3d,
-    0xb3,
-    0x34,
-    0x36,
-    0x0f,
-    0x9a,
-    0xa5,
-    0xb1,
-    0x71,
-    0x38,
-    0xc2,
-    0xb6,
-    0x91,
-    0x91,
-    0xcf,
-    0x88,
-    0x70,
-    0x2f,
-    0x7d,
-    0x25,
-    0xe9,
-    0x17,
-    0x0d,
-    0xd6,
-    0xef,
-    0xfd,
-    0xb8,
-    0x04,
-    0x16,
-    0xb4,
-    0x4f,
-    0x4d,
-    0x54,
-    0xe8,
-    0x1f,
-    0xd7,
-    0x09,
-    0x0f,
-    0x17,
-    0xe4,
-    0x3e,
-    0x9d,
-    0x2d,
-    0xa7,
-    0x2a,
-    0x77,
-    0xfd,
-    0x57,
-    0xfb,
-    0xab,
-    0xb3,
-    0x81,
-    0xd3,
-    0x5e,
-    0x2c,
-    0xa2,
-    0x10,
-    0x06,
-    0x58,
-    0xf5,
-    0xd0,
-    0xd9,
-    0xe3,
-    0x8a,
-    0xb4,
-    0x84,
-    0x14,
-    0x98,
-    0xe5,
-    0x21,
-    0xf5,
-    0x14,
-    0x55,
-    0x63,
-    0xb4,
-    0x82,
-    0x48,
-    0x14,
-    0x49,
-    0x0c,
-    0x12,
-    0xc2,
-    0x59,
-    0xd1,
-    0x22,
-    0xb5,
-    0x5a,
-    0x7f,
-    0x3f,
-    0x24,
-    0xf9,
-    0x24,
-    0x12,
-    0xa8,
-    0xb8,
-    0x41,
-    0xe5,
-    0xf0,
-    0xdc,
-    0x21,
-    0xaa,
-    0xb7,
-    0x86,
-    0x68,
-    0x3f,
-    0xf3,
-    0x20,
-    0xef,
-    0xf0,
-    0x4f,
-    0xfa,
-    0xcf,
-    0x3e,
-    0xdc,
-    0x35,
-    0xbc,
-    0xde,
-    0x03,
-    0xe1,
-    0x95,
-    0x05,
-    0xbf,
-    0x62,
-    0x38,
-    0xe3,
-    0x09,
-    0x18,
-    0x9b,
-    0x6d,
-    0x93,
-    0x3f,
-    0x19,
-    0x60,
-    0xb8,
-    0x13,
-    0x09,
-    0x83,
-    0xb3,
-    0x38,
-    0x95,
-    0x2c,
-    0x10,
-    0x5a,
-    0xca,
-    0x05,
-    0x61,
-    0x11,
-    0xeb,
-    0x10,
-    0x32,
-    0x07,
-    0x0b,
-    0xe9,
-    0x3f,
-    0x5c,
-    0xda,
-    0x4c,
-    0xe4,
-    0x49,
-    0xc0,
-    0xd6,
-    0xd4,
-    0x04,
-    0x28,
-    0x10,
-    0x0e,
-    0xe4,
-    0x1f,
-    0xa9,
-    0x0d,
-    0xc6,
-    0x1d,
-    0x03,
-    0x3f,
-    0xaf,
-    0x22,
-    0xf2,
-    0xb9,
-    0xb3,
-    0x05,
-    0xc0,
-    0x29,
-    0x15,
-    0x09,
-    0x74,
-    0x0c,
-    0xaf,
-    0xb2,
-    0x53,
-    0x21,
-    0x94,
-    0xd7,
-    0xa8,
-    0x1d,
-    0xf5,
-    0xf7,
-    0xc1,
-    0xa0,
-    0x41,
-    0xd1,
-    0x3a,
-    0x68,
-    0x90,
-    0x2e,
-    0x7e,
-    0xc5,
-    0x42,
-    0x02,
-    0x8a,
-    0x4c,
-    0xe3,
-    0xb3,
-    0xf4,
-    0xd0,
-    0x52,
-    0xb9,
-    0x2c,
-    0x8e,
-    0x23,
-    0x67,
-    0x03,
-    0xa8,
-    0x41,
-    0x08,
-    0x69,
-    0xd5,
-    0xd8,
-    0x2e,
-    0x7b,
-    0x56,
-    0x72,
-    0x47,
-    0xbd,
-    0x2c,
-    0x60,
-    0x71,
-    0xa3,
-    0x88,
-    0x5b,
-    0x90,
-    0x57,
-    0x83,
-    0x6b,
-    0x9d,
-    0xb6,
-    0x0f,
-    0x08,
-    0x41,
-    0x9b,
-    0x2d,
-    0x7f,
-    0xa2,
-    0x61,
-    0x61,
-    0x98,
-    0x7d,
-    0xa3,
-    0x63,
-    0x76,
-    0x75,
-    0x46,
-    0x18,
-    0xbe,
-    0xaa,
-    0xba,
-    0xc0,
-    0xfc,
-    0x8e,
-    0x7c,
-    0x71,
-    0x42,
-    0xf4,
-    0xe0,
-    0xc4,
-    0x12,
-    0x6a,
-    0x0d,
-    0xce,
-    0x7d,
-    0xc9,
-    0x49,
-    0x52,
-    0x8d,
-    0x0a,
-    0x77,
-    0x34,
-    0xe1,
-    0x5b,
-    0xdd,
-    0x31,
-    0x97,
-    0x72,
-    0x2b,
-    0xce,
-    0x6f,
-    0x22,
-    0xb9,
-    0x8e,
-    0x2c,
-    0x2c,
-    0x11,
-    0x68,
-    0x3e,
-    0x57,
-    0xad,
-    0x78,
-    0x9f,
-    0xc3,
-    0x02,
-    0xf5,
-    0xfb,
-    0x7a,
-    0xbd,
-    0x63,
-    0x13,
-    0x48,
-    0x4c,
-    0x0a,
-    0x63,
-    0xcd,
-    0xa0,
-    0xa6,
-    0x02,
-    0xd0,
-    0x31,
-    0x60,
-    0xcb,
-    0xd6,
-    0x43,
-    0xfd,
-    0xba,
-    0xf3,
-    0x68,
-    0x56,
-    0x98,
-    0xe1,
-    0x47,
-    0x08,
-    0xdb,
-    0x4f,
-    0x9b,
-    0x6c,
-    0xc8,
-    0x7b,
-    0x7f,
-    0xca,
-    0xda,
-    0x03,
-    0xe8,
-    0xc9,
-    0x67,
-    0xf9,
-    0x73,
-    0x2a,
-    0x81,
-    0x35,
-    0x61,
-    0xb6,
-    0x1b,
-    0xef,
-    0xdf,
-    0x75,
-    0x6c,
-    0x8d,
-    0x8b,
-    0x21,
-    0x99,
-    0xb9,
-    0x35,
-    0xda,
-    0x8e,
-    0xb7,
-    0xe2,
-    0x1b,
-    0x2c,
-    0xf5,
-    0x17,
-    0xed,
-    0xaa,
-    0xe4,
-    0x54,
-    0x5b,
-    0x35,
-    0x07,
-    0xde,
-    0x25,
-    0xda,
-    0x4a,
-    0xc1,
-    0xb9,
-    0xa6,
-    0x94,
-    0x16,
-    0x5e,
-    0x0c,
-    0x9f,
-    0x82,
-    0xb3,
-    0x86,
-    0x08,
-    0xff,
-    0x58,
-    0x7f,
-    0xa2,
-    0xdf,
-    0xeb,
-    0x71,
-    0x10,
-    0x0e,
-    0x36,
-    0x4b,
-    0x93,
-    0x97,
-    0xa6,
-    0x15,
-    0x20,
-    0x69,
-    0xff,
-    0xd6,
-    0xb6,
-    0x5c,
-    0x4f,
-    0xb6,
-    0xee,
-    0x6f,
-    0x21,
-    0x60,
-    0xd4,
-    0x53,
-    0xf2,
-    0xaa,
-    0xf5,
-    0x2e,
-    0xe9,
-    0x78,
-    0xb9,
-    0x99,
-    0xc2,
-    0xdd,
-    0xf3,
-    0xea,
-    0x0c,
-    0x84,
-    0xb7,
-    0xb9,
-    0x94,
-    0x4f,
-    0x6c,
-    0x9d,
-    0x21,
-    0x3d,
-    0x21,
-    0x37,
-    0x61,
-    0x91,
-    0x25,
-    0x72,
-    0x24,
-    0x31,
-    0xd1,
-    0x08,
-    0xc8,
-    0x4c,
-    0xa9,
-    0x49,
-    0xf4,
-    0x3f,
-    0xa4,
-    0x18,
-    0x8a,
-    0xba,
-    0xc7,
-    0x36,
-    0xd6,
-    0x1e,
-    0xf8,
-    0xc3,
-    0x0c,
-    0x2a,
-    0x12,
-    0x01,
-    0xf1,
-    0xd7,
-    0x35,
-    0x5c,
-    0xd8,
-    0x80,
-    0x60,
-    0xa7,
-    0xd0,
-    0x46,
-    0x41,
-    0xa9,
-    0x1c,
-    0xb3,
-    0x4b,
-    0xd8,
-    0xe3,
-    0x9e,
-    0x0a,
-    0x64,
-    0x29,
-    0x4e,
-    0xb3,
-    0x77,
-    0xfe,
-    0xe2,
-    0x00,
-    0xbc,
-    0xf5,
-    0xef,
-    0x3a,
-    0x1e,
-    0xd8,
-    0x6c,
-    0x97,
-    0xd2,
-    0x9a,
-    0xcb,
-    0xc7,
-    0x97,
-    0x8d,
-    0x69,
-    0xca,
-    0x3c,
-    0xd5,
-    0x28,
-    0x04,
-    0x63,
-    0x1d,
-    0x5a,
-    0x93,
-    0x86,
-    0x89,
-    0xe2,
-    0xe0,
-    0x37,
-    0xeb,
-    0x95,
-    0x74,
-    0xac,
-    0x39,
-    0xe7,
-    0x0e,
-    0x7a,
-    0x3f,
-    0xc3,
-    0xf2,
-    0xa1,
-    0x91,
-    0xba,
-    0x83,
-    0xc9,
-    0xc4,
-    0x60,
-    0x14,
-    0xcb,
-    0xdd,
-    0xf3,
-    0xfc,
-    0x73,
-    0x0a,
-    0x3e,
-    0xe8,
-    0x85,
-    0x90,
-    0xbd,
-    0x76,
-    0xfd,
-    0x05,
-    0x02,
-    0xff,
-    0x9b,
-    0xbf,
-    0x57,
-    0xb3,
-    0x9f,
-    0x8c,
-    0xa5,
-    0xec,
-    0xd2,
-    0xa3,
-    0x95,
-    0xbc,
-    0xc5,
-    0xdb,
-    0xf4,
-    0xc8,
-    0x5d,
-    0x1b,
-    0x5c,
-    0x5a,
-    0x8f,
-    0x12,
-    0x11,
-    0xb1,
-    0x69,
-    0x28,
-    0x29,
-    0x9c,
-    0x52,
-    0xb4,
-    0xf0,
-    0x47,
-    0x92,
-    0x6f,
-    0x8a,
-    0x54,
-    0x15,
-    0x29,
-    0xda,
-    0x2d,
-    0x6b,
-    0xba,
-    0xa3,
-    0x99,
-    0x14,
-    0x3c,
-    0xed,
-    0x8e,
-    0xfb,
-    0x77,
-    0xab,
-    0x47,
-    0x40,
-    0x9d,
-    0x9a,
-    0x95,
-    0x3a,
-    0x38,
-    0x6c,
-    0x7a,
-    0xbd,
-    0x60,
-    0x26,
-    0xf4,
-    0x98,
-    0x31,
-    0xc7,
-    0x17,
-    0x62,
-    0x7c,
-    0x2a,
-    0x5e,
-    0x77,
-    0xbd,
-    0x2d,
-    0x43,
-    0x3d,
-    0x4d,
-    0x13,
-    0x0d,
-    0xac,
-    0xd9,
-    0x27,
-    0xea,
-    0x0d,
-    0x13,
-    0xa2,
-    0x3d,
-    0x01,
-    0xa7,
-    0xcf,
-    0x39,
-    0xc6,
-    0x71,
-    0x6d,
-    0xaf,
-    0xb6,
-    0xed,
-    0x55,
-    0x24,
-    0x10,
-    0xef,
-    0x5d,
-    0x27,
-    0xfb,
-    0x94,
-    0x7b,
-    0xe2,
-    0xc8,
-    0x78,
-    0x2e,
-    0xee,
-    0x78,
-    0x29,
-    0x19,
-    0x6c,
-    0x7e,
-    0xdc,
-    0xf1,
-    0x51,
-    0xc6,
-    0x5f,
-    0x9a,
-    0x01,
-    0xf5,
-    0x4f,
-    0x8d,
-    0x20,
-    0xf3,
-    0x8b,
-    0x7d,
-    0xa4,
-    0xa7,
-    0xe8,
-    0x3a,
-    0x2f,
-    0x01,
-    0x27,
-    0xd5,
-    0x9d,
-    0x3e,
-    0x24,
-    0x05,
-    0xd8,
-    0x67,
-    0x4f,
-    0xc9,
-    0xf4,
-    0x1b,
-    0x60,
-    0x4f,
-    0x78,
-    0x8f,
-    0x47,
-    0x15,
-    0xf9,
-    0xd3,
-    0x62,
-    0x4e,
-    0xee,
-    0x57,
-    0xf3,
-    0x87,
-    0xbf,
-    0xad,
-    0xd1,
-    0x8a,
-    0x1f,
-    0x90,
-    0x5e,
-    0x83,
-    0x9c,
-    0x26,
-    0xb8,
-    0x61,
-    0x74,
-    0x82,
-    0x34,
-    0x7f,
-    0xab,
-    0x6d,
-    0x08,
-    0x84,
-    0x5a,
-    0x66,
-    0x47,
-    0x88,
-    0x4a,
-    0xe7,
-    0x13,
-    0x78,
-    0xc1,
-    0xea,
-    0x0e,
-    0xbb,
-    0x9c,
-    0xac,
-    0x11,
-    0x15,
-    0x9e,
-    0xb1,
-    0x21,
-    0xcc,
-    0x08,
-    0x08,
-    0x9e,
-    0x0a,
-    0x6a,
-    0xd0,
-    0xbe,
-    0x83,
-    0xb8,
-    0xfb,
-    0x3a,
-    0x57,
-    0xa0,
-    0x52,
-    0x47,
-    0x3a,
-    0x1b,
-    0xb9,
-    0xc8,
-    0xd2,
-    0x43,
-    0xb5,
-    0xc2,
-    0x60,
-    0x64,
-    0x2b,
-    0x10,
-    0xa3,
-    0x55,
-    0x6b,
-    0x58,
-    0xfa,
-    0x09,
-    0x6c,
-    0x3d,
-    0xc8,
-    0x61,
-    0x59,
-    0xd6,
-    0x1c,
-    0x44,
-    0x4d,
-    0x5f,
-    0x92,
-    0xf2,
-    0x5c,
-    0x2f,
-    0x74,
-    0x95,
-    0xd2,
-    0xea,
-    0x25,
-    0x1a,
-    0xbf,
-    0xf8,
-    0xc0,
-    0x3e,
-    0xb3,
-    0x36,
-    0xfc,
-    0xec,
-    0xc6,
-    0xeb,
-    0x53,
-    0xc6,
-    0xdb,
-    0xfd,
-    0x63,
-    0x02,
-    0x26,
-    0x65,
-    0x94,
-    0x77,
-    0xec,
-    0xe0,
-    0xfb,
-    0xf7,
-    0x8a,
-    0xe7,
-    0x7e,
-    0xe0,
-    0xb9,
-    0xe2,
-    0x39,
-    0xee,
-    0x10,
-    0x99,
-    0x21,
-    0x53,
-    0xcb,
-    0xeb,
-    0xe7,
-    0x0a,
-    0xca,
-    0xc2,
-    0x20,
-    0x68,
-    0xdd,
-    0x46,
-    0xa2,
-    0xf4,
-    0x3e,
-    0x51,
-    0x31,
-    0x78,
-    0x5f,
-    0x23,
-    0x5b,
-    0x58,
-    0xe6,
-    0x58,
-    0xa0,
-    0x23,
-    0xf6,
-    0x17,
-    0xd6,
-    0x68,
-    0xb1,
-    0x8b,
-    0xcc,
-    0xcb,
-    0xfb,
-    0x97,
-    0x2e,
-    0x57,
-    0x80,
-    0xc5,
-    0xa8,
-    0x16,
-    0xf8,
-    0x80,
-    0x4e,
-    0xdf,
-    0xaa,
-    0x84,
-    0x3c,
-    0x70,
-    0x2e,
-    0x92,
-    0x79,
-    0xbd,
-    0x78,
-    0x68,
-    0x22,
-    0x87,
-    0x12,
-    0xf0,
-    0xc4,
-    0x2f,
-    0xa9,
-    0xb8,
-    0x09,
-    0xcd,
-    0xcb,
-    0xa2,
-    0x97,
-    0x7d,
-    0xef,
-    0xdd,
-    0x35,
-    0xf9,
-    0xb6,
-    0x13,
-    0x2f,
-    0x6d,
-    0x70,
-    0xe4,
-    0xfc,
-    0x86,
-    0xe2,
-    0x94,
-    0x1f,
-    0xcc,
-    0x47,
-    0x00,
-    0x4b,
-    0x33,
-    0x94,
-    0xd7,
-    0xca,
-    0xec,
-    0x00,
-    0x06,
-    0x20,
-    0x81,
-    0xc4,
-    0x74,
-    0xeb,
-    0x21,
-    0x1f,
-    0xf0,
-    0x0d,
-    0x39,
-    0x9e,
-    0x68,
-    0x0d,
-    0x44,
-    0x9a,
-    0x5b,
-    0xbb,
-    0xe3,
-    0x02,
-    0x90,
-    0x13,
-    0x30,
-    0x5b,
-    0x09,
-    0x64,
-    0x4f,
-    0x04,
-    0x33,
-    0xb2,
-    0x47,
-    0xbf,
-    0x5f,
-    0x58,
-    0x10,
-    0x6d,
-    0x75,
-    0xf1,
-    0xee,
-    0x19,
-    0xe7,
-    0x79,
-    0xfd,
-    0x38,
-    0xe5,
-    0xb0,
-    0x0c,
-    0x2f,
-    0xd0,
-    0xbf,
-    0xae,
-    0x16,
-    0xf0,
-    0x1e,
-    0x8f,
-    0xbc,
-    0x69,
-    0xb5,
-    0x05,
-    0xeb,
-    0x6b,
-    0x42,
-    0xe7,
-    0xed,
-    0xaa,
-    0xfa,
-    0xa2,
-    0x4e,
-    0x0e,
-    0x73,
-    0x89,
-    0xe4,
-    0xab,
-    0xc1,
-    0x6d,
-    0x0d,
-    0xf3,
-    0xe0,
-    0x6e,
-    0x38,
-    0x2a,
-    0x52,
-    0x10,
-    0xa7,
-    0x1b,
-    0x08,
-    0x92,
-    0x73,
-    0x0a,
-    0x86,
-    0x7b,
-    0xd0,
-    0xe9,
-    0x43,
-    0x75,
-    0x92,
-    0xcf,
-    0x4e,
-    0x5e,
-    0xf0,
-    0xa5,
-    0x37,
-    0x9d,
-    0x88,
-    0x23,
-    0x2d,
-    0xb2,
-    0xa4,
-    0xfb,
-    0x64,
-    0x11,
-    0xbc,
-    0x53,
-    0xba,
-    0x31,
-    0x3c,
-    0x79,
-    0x99,
-    0xe0,
-    0x86,
-    0xd2,
-    0x1f,
-    0xd9,
-    0x3b,
-    0x14,
-    0x7c,
-    0x98,
-    0xb7,
-    0xb5,
-    0x9c,
-    0x6d,
-    0xda,
-    0xa4,
-    0x07,
-    0xd0,
-    0x0e,
-    0x36,
-    0x05,
-    0xf4,
-    0x85,
-    0x63,
-    0x05,
-    0x9f,
-    0xc3,
-    0x32,
-    0x3f,
-    0x38,
-    0x5d,
-    0x72,
-    0x99,
-    0x22,
-    0x00,
-    0xab,
-    0xc7,
-    0x48,
-    0xb4,
-    0x54,
-    0xb7,
-    0xf9,
-    0x62,
-    0x46,
-    0x2c,
-    0xf7,
-    0x94,
-    0x71,
-    0xa9,
-    0xca,
-    0x7d,
-    0xce,
-    0x90,
-    0x5a,
-    0x39,
-    0x94,
-    0x8b,
-    0xbd,
-    0x56,
-    0xaf,
-    0x2b,
-    0x4e,
-    0x92,
-    0x6e,
-    0xcf,
-    0xff,
-    0xe6,
-    0x7c,
-    0xc8,
-    0xf0,
-    0xc4,
-    0x11,
-    0xba,
-    0x40,
-    0x9e,
-    0x69,
-    0x45,
-    0x23,
-    0xa7,
-    0x76,
-    0xe5,
-    0x34,
-    0xdd,
-    0xd2,
-    0x17,
-    0x0d,
-    0x47,
-    0xf7,
-    0xbe,
-    0x15,
-    0x7b,
-    0xb2,
-    0xc4,
-    0x9a,
-    0x64,
-    0xd5,
-    0x04,
-    0x20,
-    0x42,
-    0x2d,
-    0x68,
-    0xf8,
-    0xf2,
-    0xb3,
-    0x4e,
-    0x14,
-    0x70,
-    0x06,
-    0x31,
-    0x19,
-    0x9a,
-    0x19,
-    0x85,
-    0xb6,
-    0x37,
-    0x29,
-    0xe2,
-    0x35,
-    0x37,
-    0xf3,
-    0x65,
-    0x4f,
-    0x3c,
-    0x23,
-    0x54,
-    0x45,
-    0x5a,
-    0x0f,
-    0x00,
-    0x2c,
-    0x1b,
-    0xa5,
-    0xf0,
-    0x88,
-    0xc7,
-    0xa2,
-    0x3b,
-    0x1d,
-    0xe2,
-    0x06,
-    0x36,
-    0x02,
-    0xf5,
-    0xc4,
-    0x4f,
-    0xf7,
-    0x92,
-    0xbd,
-    0x39,
-    0xf8,
-    0x92,
-    0xef,
-    0x4a,
-    0x13,
-    0xa1,
-    0xea,
-    0x21,
-    0x76,
-    0xfd,
-    0x84,
-    0x8b,
-    0xcc,
-    0x7a,
-    0xce,
-    0xa8,
-    0xca,
-    0xca,
-    0x47,
-    0x49,
-    0x04,
-    0xfb,
-    0x4f,
-    0x9d,
-    0x06,
-    0x41,
-    0xde,
-    0x0d,
-    0xa0,
-    0xf6,
-    0x75,
-    0x64,
-    0x81,
-    0xdf,
-    0x55,
-    0x33,
-    0x07,
-    0xb1,
-    0xf0,
-    0x74,
-    0x56,
-    0xd3,
-    0x9d,
-    0x6d,
-    0xa8,
-    0x66,
-    0x8f,
-    0xd7,
-    0xe4,
-    0x83,
-    0x08,
-    0x40,
-    0x71,
-    0xc3,
-    0xca,
-    0xae,
-    0x4c,
-    0x05,
-    0xcf,
-    0x85,
-    0x58,
-    0x6b,
-    0x39,
-    0xaa,
-    0xf6,
-    0xa6,
-    0x8c,
-    0xe9,
-    0xd6,
-    0x74,
-    0x1b,
-    0x94,
-    0x0d,
-    0x66,
-    0xc0,
-    0x6d,
-    0x67,
-    0xe7,
-    0xd0,
-    0xc6,
-    0xfe,
-    0x7a,
-    0x4e,
-    0xe7,
-    0x0b,
-    0x43,
-    0x5f,
-    0xb0,
-    0xfd,
-    0xc9,
-    0xfe,
-    0x80,
-    0xc8,
-    0xfa,
-    0xf1,
-    0x55,
-    0x80,
-    0x70,
-    0xfc,
-    0x34,
-    0x26,
-    0xf2,
-    0x54,
-    0xcb,
-    0xc2,
-    0x3e,
-    0x56,
-    0x55,
-    0xb1,
-    0x05,
-    0x79,
-    0xbe,
-    0x41,
-    0x38,
-    0x82,
-    0x07,
-    0x7b,
-    0x82,
-    0xf7,
-    0xed,
-    0x40,
-    0x16,
-    0xd5,
-    0xc5,
-    0x98,
-    0xaa,
-    0x85,
-    0xab,
-    0x46,
-    0xc3,
-    0x0d,
-    0xdb,
-    0xa0,
-    0x34,
-    0x84,
-    0x5f,
-    0x9d,
-    0xe1,
-    0xc8,
-    0xeb,
-    0x30,
-    0xc9,
-    0x73,
-    0x05,
-    0xd4,
-    0x44,
-    0x0a,
-    0x68,
-    0x68,
-    0x88,
-    0x78,
-    0xab,
-    0x3e,
-    0x72,
-    0xbb,
-    0x1e,
-    0x6f,
-    0x84,
-    0xde,
-    0xf5,
-    0x71,
-    0x2a,
-    0x27,
-    0xa8,
-    0xeb,
-    0x41,
-    0x91,
-    0x99,
-    0xc7,
-    0xd9,
-    0x7c,
-    0xf8,
-    0x89,
-    0x3a,
-    0xa4,
-    0xe3,
-    0xe0,
-    0x26,
-    0x50,
-    0xd2,
-    0x7b,
-    0x5e,
-    0xcc,
-    0x33,
-    0x1e,
-    0x68,
-    0x18,
-    0x51,
-    0xf5,
-    0x8e,
-    0xe2,
-    0x7a,
-    0x28,
-    0x2a,
-    0xb2,
-    0x61,
-    0xaf,
-    0x21,
-    0x65,
-    0xc1,
-    0x68,
-    0xae,
-    0xdc,
-    0x43,
-    0x67,
-    0x61,
-    0xf5,
-    0xa2,
-    0x8d,
-    0x67,
-    0xba,
-    0x0d,
-    0x5c,
-    0x0b,
-    0xd9,
-    0xcd,
-    0x09,
-    0x7d,
-    0x55,
-    0x27,
-    0xd3,
-    0xd2,
-    0x7a,
-    0x84,
-    0x94,
-    0x4d,
-    0x16,
-    0xcf,
-    0x96,
-    0xdd,
-    0xe6,
-    0x1f,
-    0xa7,
-    0xe6,
-    0x4f,
-    0x96,
-    0x70,
-    0x44,
-    0x4e,
-    0x89,
-    0x02,
-    0x8e,
-    0xb2,
-    0xe0,
-    0xb2,
-    0x97,
-    0x89,
-    0xc0,
-    0x27,
-    0x3b,
-    0xd8,
-    0x68,
-    0xb1,
-    0x58,
-    0x8f,
-    0x59,
-    0xdc,
-    0x1a,
-    0xbb,
-    0xba,
-    0x46,
-    0x7c,
-    0xfe,
-    0xfa,
-    0xad,
-    0x0b,
-    0x3c,
-    0xb7,
-    0x4c,
-    0xed,
-    0x98,
-    0xdf,
-    0x68,
-    0x23,
-    0x9f,
-    0x15,
-    0x26,
-    0x0b,
-    0xc2,
-    0x56,
-    0x9f,
-    0x29,
-    0x0a,
-    0xdc,
-    0x36,
-    0x26,
-    0x07,
-    0x42,
-    0x2a,
-    0x19,
-    0x0a,
-    0xea,
-    0x67,
-    0x06,
-    0x94,
-    0x9c,
-    0xa2,
-    0xa4,
-    0x0d,
-    0x6f,
-    0xa4,
-    0x64,
-    0xb9,
-    0xed,
-    0xe6,
-    0xae,
-    0xe9,
-    0x72,
-    0x5f,
-    0x6e,
-    0x6e,
-    0xd5,
-    0x9a,
-    0xcf,
-    0x53,
-    0x4a,
-    0x0b,
-    0x46,
-    0xcc,
-    0x87,
-    0xa3,
-    0xd3,
-    0x69,
-    0x26,
-    0xa2,
-    0x84,
-    0x8f,
-    0x4b,
-    0xad,
-    0x3a,
-    0x29,
-    0x86,
-    0x20,
-    0xaf,
-    0x9b,
-    0xfb,
-    0xa5,
-    0xb8,
-    0xf7,
-    0xc0,
-    0x06,
-    0xc8,
-    0x74,
-    0x86,
-    0x3f,
-    0xb6,
-    0x1c,
-    0x7c,
-    0xd8,
-    0xc0,
-    0xc4,
-    0x70,
-    0x71,
-    0xcf,
-    0x41,
-    0x37,
-    0x9f,
-    0xfd,
-    0xd9,
-    0x50,
-    0xf6,
-    0x54,
-    0xf8,
-    0xc4,
-    0x67,
-    0xd8,
-    0x24,
-    0x50,
-    0xcd,
-    0xc8,
-    0x33,
-    0xc6,
-    0xc2,
-    0x22,
-    0xbc,
-    0xb1,
-    0xb7,
-    0x65,
-    0xcb,
-    0x38,
-    0x44,
-    0x9a,
-    0xd9,
-    0x45,
-    0xbc,
-    0x95,
-    0xfb,
-    0xe6,
-    0x05,
-    0x79,
-    0x59,
-    0xf3,
-    0xa6,
-    0x7a,
-    0xe2,
-    0xf1,
-    0x22,
-    0xe7,
-    0x3e,
-    0x36,
-    0x85,
-    0x67,
-    0x04,
-    0x4e,
-    0x3c,
-    0x83,
-    0x2e,
-    0x9e,
-    0x29,
-    0x64,
-    0xca,
-    0x47,
-    0xf7,
-    0xde,
-    0xf2,
-    0x4d,
-    0xab,
-    0xae,
-    0xfd,
-    0xf9,
-    0x7c,
-    0x00,
-    0xf7,
-    0x7b,
-    0xe5,
-    0x35,
-    0x4f,
-    0xd4,
-    0xf8,
-    0xe2,
-    0xd0,
-    0xf3,
-    0xf5,
-    0x1c,
-    0xd2,
-    0x1e,
-    0x1b,
-    0xf3,
-    0xb2,
-    0x94,
-    0xbe,
-    0x3c,
-    0x7f,
-    0x71,
-    0x9a,
-    0x94,
-    0xf6,
-    0xd1,
-    0x67,
-    0xa1,
-    0xb1,
-    0x38,
-    0xae,
-    0x9b,
-    0x9b,
-    0x32,
-    0xda,
-    0x0b,
-    0xa7,
-    0x36,
-    0x92,
-    0xd3,
-    0xc2,
-    0xd0,
-    0x46,
-    0x6f,
-    0x06,
-    0x00,
-    0x08,
-    0x7a,
-    0x30,
-    0xdd,
-    0x9e,
-    0x74,
-    0x54,
-    0x7d,
-    0xd5,
-    0xc2,
-    0xcf,
-    0x19,
-    0x18,
-    0xf6,
-    0x7e,
-    0x6d,
-    0x40,
-    0x51,
-    0x2d,
-    0x5e,
-    0xae,
-    0x86,
-    0x52,
-    0xdf,
-    0x97,
-    0xc1,
-    0xfc,
-    0x15,
-    0xa0,
-    0xe8,
-    0x06,
-    0xb9,
-    0xab,
-    0x21,
-    0x90,
-    0xbf,
-    0xf0,
-    0x94,
-    0xaf,
-    0x35,
-    0x4f,
-    0x72,
-    0x64,
-    0x6d,
-    0xe4,
-    0x36,
-    0xcb,
-    0x5e,
-    0xdd,
-    0x2b,
-    0x95,
-    0x48,
-    0x88,
-    0x2e,
-    0xb8,
-    0x97,
-    0xb0,
-    0xb5,
-    0x65,
-    0x0a,
-    0x2a,
-    0x10,
-    0x3b,
-    0x14,
-    0xab,
-    0xef,
-    0xba,
-    0x83,
-    0xdd,
-    0x25,
-    0xfa,
-    0x5f,
-    0xb1,
-    0xab,
-    0x9d,
-    0x15,
-    0xf6,
-    0xe8,
-    0x02,
-    0xd4,
-    0x2b,
-    0x2f,
-    0xbb,
-    0x38,
-    0x91,
-    0x8a,
-    0x42,
-    0x26,
-    0x85,
-    0xb6,
-    0xe7,
-    0xf7,
-    0x0d,
-    0x6e,
-    0x0d,
-    0xd8,
-    0xb1,
-    0xed,
-    0x96,
-    0x70,
-    0x8c,
-    0xae,
-    0x9c,
-    0xc4,
-    0xa2,
-    0x76,
-    0x62,
-    0x58,
-    0x74,
-    0x94,
-    0x8a,
-    0x97,
-    0xd2,
-    0x67,
-    0x88,
-    0x75,
-    0xf1,
-    0x22,
-    0x56,
-    0x53,
-    0xbd,
-    0xcc,
-    0x69,
-    0x23,
-    0x70,
-    0x8b,
-    0xe5,
-    0xcc,
-    0x64,
-    0x21,
-    0x0d,
-    0xd0,
-    0x25,
-    0xb7,
-    0xfd,
-    0x2c,
-    0xcb,
-    0xda,
-    0x9b,
-    0x80,
-    0x87,
-    0xc3,
-    0xcb,
-    0x6f,
-    0x7b,
-    0xdb,
-    0xe2,
-    0x49,
-    0xcf,
-    0x7e,
-    0x5e,
-    0xe7,
-    0x01,
-    0xff,
-    0xd4,
-    0xd7,
-    0x7c,
-    0xed,
-    0x29,
-    0xba,
-    0x6d,
-    0x95,
-    0x05,
-    0xe9,
-    0xd2,
-    0xc8,
-    0x85,
-    0x5f,
-    0xd3,
-    0xdf,
-    0x30,
-    0xd3,
-    0x56,
-    0xfb,
-    0x2d,
-    0x24,
-    0xce,
-    0x92,
-    0xb3,
-    0xfa,
-    0x53,
-    0x27,
-    0xc0,
-    0xab,
-    0xf8,
-    0x58,
-    0x0e,
-    0x5b,
-    0x59,
-    0x1e,
-    0x43,
-    0x68,
-    0x73,
-    0x51,
-    0x67,
-    0x05,
-    0xb9,
-    0x6a,
-    0x9c,
-    0x24,
-    0x64,
-    0x8d,
-    0x09,
-    0x9a,
-    0x0a,
-    0xc7,
-    0x18,
-    0x7d,
-    0x72,
-    0x94,
-    0xe1,
-    0xd1,
-    0xa7,
-    0xa4,
-    0xe6,
-    0x64,
-    0x4b,
-    0xde,
-    0x00,
-    0xf7,
-    0x2e,
-    0xa6,
-    0x99,
-    0x9e,
-    0x1f,
-    0x5b,
-    0x1c,
-    0x6a,
-    0x02,
-    0x24,
-    0xaa,
-    0x44,
-    0x23,
-    0xed,
-    0x0f,
-    0x1c,
-    0xca,
-    0xac,
-    0xf4,
-    0x44,
-    0x10,
-    0xe9,
-    0x55,
-    0x16,
-    0xf0,
-    0x7d,
-    0x36,
-    0xdd,
-    0xa1,
-    0x9a,
-    0x92,
-    0xf3,
-    0x23,
-    0x0b,
-    0x95,
-    0x26,
-    0x19,
-    0xbd,
-    0x0b,
-    0x60,
-    0xd6,
-    0x7f,
-    0x17,
-    0x88,
-    0xba,
-    0x06,
-    0x28,
-    0xa3,
-    0xbf,
-    0x34,
-    0x29,
-    0x3f,
-    0x4f,
-    0x9a,
-    0xf8,
-    0x11,
-    0x59,
-    0x3b,
-    0x1a,
-    0xdd,
-    0xa3,
-    0x92,
-    0xad,
-    0x96,
-    0x62,
-    0xd7,
-    0x9d,
-    0xc7,
-    0x08,
-    0x7f,
-    0x1b,
-    0x31,
-    0x5d,
-    0x02,
-    0x4b,
-    0xb5,
-    0xd1,
-    0xe0,
-    0x3d,
-    0x75,
-    0x10,
-    0xe6,
-    0x1f,
-    0x37,
-    0xd8,
-    0xad,
-    0xb1,
-    0x0a,
-    0x07,
-    0x65,
-    0xf9,
-    0x2b,
-    0xf9,
-    0xd0,
-    0x37,
-    0x29,
-    0x10,
-    0x91,
-    0x1b,
-    0x48,
-    0x94,
-    0xa7,
-    0x36,
-    0x23,
-    0xbe,
-    0x35,
-    0xaf,
-    0x96,
-    0x0f,
-    0x84,
-    0x37,
-    0xdb,
-    0xe6,
-    0x4a,
-    0x3e,
-    0xf3,
-    0x52,
-    0x2d,
-    0x67,
-    0x48,
-    0x25,
-    0x83,
-    0x3a,
-    0x90,
-    0x4a,
-    0x5c,
-    0x1a,
-    0xf4,
-    0x58,
-    0xc2,
-    0x76,
-    0x72,
-    0x66,
-    0x3f,
-    0x43,
-    0x80,
-    0x22,
-    0xa0,
-    0xa9,
-    0xf2,
-    0x1d,
-    0xf9,
-    0xfc,
-    0x1d,
-    0x69,
-    0xe9,
-    0xef,
-    0x3d,
-    0x66,
-    0x1f,
-    0x04,
-    0x14,
-    0xd9,
-    0x1d,
-    0x47,
-    0xd4,
-    0x3e,
-    0x3c,
-    0x3c,
-    0x3f,
-    0x60,
-    0xf1,
-    0x16,
-    0x0d,
-    0x26,
-    0x4e,
-    0x29,
-    0x8e,
-    0xb0,
-    0xcc,
-    0xa2,
-    0x90,
-    0xa2,
-    0x47,
-    0x76,
-    0x83,
-    0xc0,
-    0x4a,
-    0x98,
-    0xdb,
-    0xbc,
-    0x8d,
-    0x6f,
-    0xb6,
-    0x4b,
-    0xbc,
-    0x87,
-    0xbf,
-    0x7e,
-    0x7a,
-    0x87,
-    0x52,
-    0x50,
-    0xa6,
-    0x63,
-    0xe1,
-    0x7c,
-    0xdd,
-    0xd2,
-    0x96,
-    0x91,
-    0x40,
-    0x03,
-    0x39,
-    0x47,
-    0x77,
-    0x8b,
-    0x55,
-    0x14,
-    0xf6,
-    0xa3,
-    0x96,
-    0xfb,
-    0x7e,
-    0x90,
-    0x76,
-    0xa5,
-    0xe7,
-    0x62,
-    0x18,
-    0xb2,
-    0x1e,
-    0xe1,
-    0x74,
-    0x51,
-    0x6a,
-    0xc5,
-    0xb5,
-    0x0e,
-    0xf3,
-    0x25,
-    0xdf,
-    0xec,
-    0x84,
-    0x32,
-    0xb5,
-    0xb4,
-    0x90,
-    0x25,
-    0xda,
-    0x8c,
-    0x73,
-    0x76,
-    0x36,
-    0xcb,
-    0xfb,
-    0x4f,
-    0x9b,
-    0x0c,
-    0x27,
-    0x40,
-    0xa9,
-    0x82,
-    0x2e,
-    0x34,
-    0xef,
-    0x8b,
-    0xc3,
-    0xa4,
-    0x52,
-    0x87,
-    0x98,
-    0x0a,
-    0xb3,
-    0xea,
-    0x21,
-    0x99,
-    0xcc,
-    0x90,
-    0x9a,
-    0x2b,
-    0x5b,
-    0x51,
-    0x4b,
-    0x7b,
-    0x83,
-    0xd6,
-    0x0b,
-    0x94,
-    0x6f,
-    0xaa,
-    0x03,
-    0x89,
-    0x38,
-    0x94,
-    0xb4,
-    0x67,
-    0x09,
-    0x25,
-    0x3c,
-    0x68,
-    0x81,
-    0x8d,
-    0xd4,
-    0x69,
-    0x58,
-    0xb3,
-    0x9e,
-    0x9e,
-    0x46,
-    0x84,
-    0x9e,
-    0x85,
-    0x20,
-    0x8a,
-    0x05,
-    0x18,
-    0x45,
-    0xc1,
-    0xb6,
-    0x47,
-    0x38,
-    0xa7,
-    0x03,
-    0xa5,
-    0x8e,
-    0x93,
-    0xb7,
-    0x62,
-    0x0b,
-    0x47,
-    0x5a,
-    0x79,
-    0x08,
-    0xc8,
-    0xb0,
-    0x2a,
-    0x17,
-    0x6e,
-    0x83,
-    0xab,
-    0xea,
-    0x37,
-    0xa2,
-    0x1b,
-    0x71,
-    0x60,
-    0x2a,
-    0xb7,
-    0x43,
-    0x37,
-    0x04,
-    0x50,
-    0x3f,
-    0x2b,
-    0xaf,
-    0xfd,
-    0x73,
-    0x25,
-    0x40,
-    0x0d,
-    0x3d,
-    0x1b,
-    0xa7,
-    0x3f,
-    0xaf,
-    0xe2,
-    0x33,
-    0x36,
-    0x38,
-    0x43,
-    0x59,
-    0x27,
-    0x81,
-    0x52,
-    0xb1,
-    0xd5,
-    0x96,
-    0xfb,
-    0x41,
-    0xbf,
-    0x46,
-    0xde,
-    0xfe,
-    0x97,
-    0xcc,
-    0x5d,
-    0x90,
-    0xf7,
-    0xaf,
-    0xf2,
-    0x56,
-    0x50,
-    0xe6,
-    0xc6,
-    0xaa,
-    0x23,
-    0x40,
-    0x80,
-    0x66,
-    0x73,
-    0x03,
-    0x5b,
-    0xa6,
-    0x7a,
-    0xd3,
-    0x7c,
-    0xd0,
-    0x9b,
-    0xd6,
-    0x82,
-    0xd2,
-    0x98,
-    0x16,
-    0x5e,
-    0xab,
-    0x05,
-    0x27,
-    0x65,
-    0x2d,
-    0xfc,
-    0x09,
-    0xa3,
-    0x01,
-    0x13,
-    0x4f,
-    0x73,
-    0xeb,
-    0x8b,
-    0x81,
-    0x4d,
-    0x4f,
-    0xca,
-    0xc0,
-    0xde,
-    0xf5,
-    0x0b,
-    0xa8,
-    0x5e,
-    0x09,
-    0x55,
-    0x7b,
-    0x1e,
-    0x66,
-    0xa9,
-    0x7b,
-    0x60,
-    0x14,
-    0x80,
-    0x97,
-    0x6c,
-    0x0e,
-    0x75,
-    0x4a,
-    0xe0,
-    0x49,
-    0x3e,
-    0xc1,
-    0x48,
-    0xf3,
-    0xe0,
-    0x3c,
-    0xee,
-    0xf8,
-    0x23,
-    0xb6,
-    0xf4,
-    0xcb,
-    0x44,
-    0xc8,
-    0x9f,
-    0x63,
-    0xeb,
-    0xcb,
-    0xf6,
-    0x84,
-    0x5c,
-    0x3d,
-    0x8c,
-    0x3f,
-    0xf1,
-    0x65,
-    0x9a,
-    0xbc,
-    0xc8,
-    0x3a,
-    0x50,
-    0x37,
-    0xb9,
-    0x82,
-    0x6d,
-    0x49,
-    0x8b,
-    0x37,
-    0x0e,
-    0x69,
-    0x67,
-    0x2e,
-    0xc3,
-    0xb2,
-    0x8c,
-    0xfb,
-    0xe8,
-    0xe7,
-    0x45,
-    0x0f,
-    0x33,
-    0xb4,
-    0x18,
-    0x23,
-    0x89,
-    0x36,
-    0x41,
-    0xda,
-    0x16,
-    0xbe,
-    0x5f,
-    0xa1,
-    0x9c,
-    0xd2,
-    0x6c,
-    0xda,
-    0x0b,
-    0x75,
-    0xf2,
-    0x3b,
-    0x53,
-    0xa9,
-    0x7c,
-    0x70,
-    0x76,
-    0x31,
-    0x4b,
-    0x08,
-    0xe1,
-    0x9b,
-    0x4b,
-    0x8e,
-    0xfc,
-    0x7e,
-    0x46,
-    0xf6,
-    0x00,
-    0x01,
-    0x56,
-    0x3c,
-    0x09,
-    0x9c,
-    0xa0,
-    0x47,
-    0x6c,
-    0x23,
-    0x3f,
-    0x13,
-    0x4a,
-    0x00,
-    0x7f,
-    0x0f,
-    0x65,
-    0xbf,
-    0x4c,
-    0xc4,
-    0x33,
-    0xd1,
-    0xea,
-    0xb8,
-    0x31,
-    0x89,
-    0xe6,
-    0x92,
-    0x7a,
-    0x6b,
-    0x4c,
-    0x7e,
-    0x98,
-    0xa6,
-    0x1a,
-    0xd3,
-    0x9a,
-    0xdf,
-    0xf5,
-    0xf4,
-    0x66,
-    0x30,
-    0x1b,
-    0x74,
-    0x51,
-    0x71,
-    0x99,
-    0x7d,
-    0xed,
-    0xb6,
-    0xbe,
-    0x72,
-    0x22,
-    0x18,
-    0xcf,
-    0xd3,
-    0x81,
-    0xb9,
-    0xfc,
-    0x61,
-    0xd4,
-    0x02,
-    0x93,
-    0x83,
-    0xfa,
-    0x2f,
-    0x74,
-    0xe9,
-    0xf2,
-    0x0e,
-    0xc5,
-    0x6f,
-    0x35,
-    0x03,
-    0xe6,
-    0x44,
-    0x49,
-    0x50,
-    0xa7,
-    0x4b,
-    0x93,
-    0x93,
-    0xb9,
-    0xc1,
-    0x6d,
-    0x90,
-    0x63,
-    0x21,
-    0x78,
-    0x31,
-    0x76,
-    0x44,
-    0x33,
-    0xcb,
-    0x83,
-    0xcd,
-    0xcd,
-    0xa3,
-    0x4b,
-    0xc4,
-    0x38,
-    0xb1,
-    0x77,
-    0x81,
-    0x7f,
-    0xa4,
-    0x8a,
-    0xcc,
-    0x59,
-    0x26,
-    0x13,
-    0x42,
-    0xfe,
-    0x60,
-    0x27,
-    0xfb,
-    0x39,
-    0xc1,
-    0x0e,
-    0x69,
-    0xbf,
-    0xfb,
-    0x3d,
-    0x83,
-    0xbf,
-    0x4f,
-    0x84,
-    0x23,
-    0xba,
-    0x0b,
-    0x89,
-    0xad,
-    0x95,
-    0x51,
-    0x75,
-    0xf2,
-    0xed,
-    0x19,
-    0xed,
-    0x54,
-    0xaa,
-    0x79,
-    0x44,
-    0x2a,
-    0xd7,
-    0x25,
-    0xef,
-    0x66,
-    0xb1,
-    0x32,
-    0x39,
-    0x75,
-    0xfd,
-    0x1f,
-    0x38,
-    0x66,
-    0x9f,
-    0x15,
-    0xff,
-    0x4f,
-    0x69,
-    0x6e,
-    0x15,
-    0xec,
-    0x31,
-    0x75,
-    0x26,
-    0x8a,
-    0x26,
-    0x6c,
-    0xf9,
-    0x23,
-    0x64,
-    0xd4,
-    0xa2,
-    0xcb,
-    0xc5,
-    0xe8,
-    0xf9,
-    0x4a,
-    0xfa,
-    0x6b,
-    0x4a,
-    0x0b,
-    0xdb,
-    0xa3,
-    0x4e,
-    0x35,
-    0xfc,
-    0xa6,
-    0x5a,
-    0x17,
-    0x81,
-    0xd4,
-    0xd7,
-    0xc9,
-    0x33,
-    0xa5,
-    0xf2,
-    0x10,
-    0xd3,
-    0xa5,
-    0x94,
-    0x83,
-    0xae,
-    0xbc,
-    0x95,
-    0xec,
-    0x71,
-    0xb3,
-    0x2d,
-    0xf1,
-    0x3f,
-    0xf4,
-    0xab,
-    0xf4,
-    0x01,
-    0x91,
-    0x69,
-    0x37,
-    0xfd,
-    0x88,
-    0xff,
-    0x44,
-    0xab,
-    0x46,
-    0xb7,
-    0x8c,
-    0xc3,
-    0x69,
-    0x41,
-    0x4e,
-    0x9b,
-    0xca,
-    0xa8,
-    0xba,
-    0xb0,
-    0xbb,
-    0x85,
-    0x57,
-    0x82,
-    0x8d,
-    0x73,
-    0xa2,
-    0xa6,
-    0x56,
-    0xc2,
-    0xf8,
-    0x16,
-    0xf0,
-    0x70,
-    0xb5,
-    0xcb,
-    0x45,
-    0x54,
-    0x9e,
-    0x8e,
-    0xca,
-    0x9d,
-    0x7c,
-    0x0b,
-    0x4a,
-    0x7b,
-    0x0a,
-    0x27,
-    0xe5,
-    0x1c,
-    0x11,
-    0x93,
-    0x58,
-    0xda,
-    0xd2,
-    0xa1,
-    0x7f,
-    0xb3,
-    0xa4,
-    0x57,
-    0x18,
-    0xf9,
-    0xde,
-    0xc3,
-    0xc9,
-    0x4a,
-    0xf7,
-    0x8d,
-    0x65,
-    0xc3,
-    0xec,
-    0xd3,
-    0x6b,
-    0x71,
-    0xe2,
-    0x30,
-    0xcf,
-    0x08,
-    0x0d,
-    0x1e,
-    0xfd,
-    0xd8,
-    0xd0,
-    0x7f,
-    0x1c,
-    0xfc,
-    0x26,
-    0x76,
-    0x8f,
-    0xd5,
-    0x40,
-    0x7b,
-    0xc2,
-    0xb7,
-    0x70,
-    0xaf,
-    0x23,
-    0xe1,
-    0x45,
-    0x6c,
-    0x6e,
-    0xb3,
-    0xf8,
-    0x21,
-    0x2e,
-    0x1b,
-    0x06,
-    0x5d,
-    0x81,
-    0x51,
-    0x1f,
-    0x29,
-    0x1b,
-    0xc4,
-    0x3f,
-    0x9b,
-    0x8d,
-    0x54,
-    0x1b,
-    0xa8,
-    0xc7,
-    0xc1,
-    0xbe,
-    0x3a,
-    0xdc,
-    0x63,
-    0x74,
-    0x82,
-    0x06,
-    0x1c,
-    0xe7,
-    0x90,
-    0xea,
-    0x8c,
-    0x88,
-    0x21,
-    0x1d,
-    0x83,
-    0x30,
-    0xb8,
-    0xe6,
-    0xbc,
-    0x07,
-    0xf0,
-    0x46,
-    0xc8,
-    0xa6,
-    0x10,
-    0x35,
-    0x48,
-    0x78,
-    0xe0,
-    0x2f,
-    0x5f,
-    0x66,
-    0xbb,
-    0xef,
-    0x67,
-    0xb3,
-    0xe6,
-    0x7b,
-    0xe3,
-    0x24,
-    0x20,
-    0x60,
-    0xb5,
-    0x65,
-    0x7a,
-    0x3f,
-    0x92,
-    0xa8,
-    0x69,
-    0x88,
-    0xb2,
-    0x8f,
-    0x1a,
-    0x86,
-    0xcc,
-    0x4c,
-    0x05,
-    0x9c,
-    0x41,
-    0x07,
-    0xc5,
-    0xce,
-    0x98,
-    0x7f,
-    0x27,
-    0x82,
-    0x2a,
-    0xf5,
-    0x81,
-    0x88,
-    0x1e,
-    0x46,
-    0x45,
-    0x59,
-    0x98,
-    0x57,
-    0xd5,
-    0x9c,
-    0x2e,
-    0xb5,
-    0x99,
-    0xef,
-    0x9c,
-    0x7d,
-    0x50,
-    0xe3,
-    0xb8,
-    0x7a,
-    0xa3,
-    0x48,
-    0xa8,
-    0x8e,
-    0x00,
-    0xac,
-    0x52,
-    0x53,
-    0xa5,
-    0x1e,
-    0x14,
-    0x01,
-    0xfb,
-    0x38,
-    0xb5,
-    0x93,
-    0x26,
-    0x5c,
-    0x9c,
-    0x25,
-    0xda,
-    0x3d,
-    0x40,
-    0xa1,
-    0x70,
-    0xa1,
-    0xe0,
-    0x9a,
-    0x39,
-    0x66,
-    0x74,
-    0x78,
-    0x12,
-    0xc3,
-    0xe3,
-    0xd6,
-    0x38,
-    0xd1,
-    0x76,
-    0x28,
-    0x5e,
-    0x4a,
-    0x8d,
-    0xa1,
-    0xfd,
-    0x90,
-    0x91,
-    0x54,
-    0xec,
-    0xf1,
-    0x29,
-    0x99,
-    0x30,
-    0x29,
-    0xb1,
-    0xb2,
-    0x15,
-    0x28,
-    0xe8,
-    0xae,
-    0x7e,
-    0x16,
-    0xe8,
-    0x8e,
-    0x79,
-    0x95,
-    0x5c,
-    0xa7,
-    0x16,
-    0x46,
-    0xed,
-    0x47,
-    0x7a,
-    0x8e,
-    0xfd,
-    0x9b,
-    0x2f,
-    0x9a,
-    0x98,
-    0xd0,
-    0xbe,
-    0xa0,
-    0xa7,
-    0x79,
-    0x80,
-    0x68,
-    0x67,
-    0x31,
-    0xb1,
-    0x0c,
-    0x1a,
-    0x81,
-    0xc6,
-    0xfc,
-    0xfd,
-    0x04,
-    0x00,
-    0x44,
-    0x79,
-    0xc8,
-    0x42,
-    0x12,
-    0x9d,
-    0xf8,
-    0x20,
-    0x72,
-    0xcc,
-    0xb8,
-    0x38,
-    0x5d,
-    0xb3,
-    0x51,
-    0xc5,
-    0xf2,
-    0x7e,
-    0x8e,
-    0x71,
-    0x03,
-    0x4c,
-    0x66,
-    0x6b,
-    0xd3,
-    0xe0,
-    0xda,
-    0xba,
-    0x1e,
-    0x99,
-    0x21,
-    0xd1,
-    0x5a,
-    0xa4,
-    0x03,
-    0x63,
-    0x3d,
-    0x70,
-    0x83,
-    0x78,
-    0x7f,
-    0x62,
-    0xc0,
-    0xc1,
-    0xe1,
-    0xcb,
-    0x1d,
-    0x28,
-    0x6e,
-    0x17,
-    0xa0,
-    0xac,
-    0x01,
-    0x47,
-    0x98,
-    0x6c,
-    0x07,
-    0xa1,
-    0x83,
-    0x01,
-    0x86,
-    0xa5,
-    0x2e,
-    0x11,
-    0x5f,
-    0x44,
-    0x1e,
-    0x21,
-    0xd0,
-    0x4d,
-    0x2f,
-    0xab,
-    0x3c,
-    0x28,
-    0x7b,
-    0x71,
-    0x2f,
-    0xc6,
-    0x7d,
-    0x10,
-    0x9d,
-    0xd8,
-    0x77,
-    0xd8,
-    0x6a,
-    0x3f,
-    0x10,
-    0xdb,
-    0x2f,
-    0xc4,
-    0x42,
-    0x44,
-    0x3c,
-    0x0a,
-    0x73,
-    0xeb,
-    0xd9,
-    0xc0,
-    0xe2,
-    0x26,
-    0xd2,
-    0x1b,
-    0x45,
-    0xe1,
-    0x32,
-    0x84,
-    0xb1,
-    0xf1,
-    0x4e,
-    0x8e,
-    0xb9,
-    0xa5,
-    0x05,
-    0x2a,
-    0xda,
-    0x9e,
-    0x47,
-    0x1e,
-    0x17,
-    0xe1,
-    0xd4,
-    0xb3,
-    0xe0,
-    0x2b,
-    0x46,
-    0xae,
-    0x38,
-    0x85,
-    0x52,
-    0x82,
-    0x17,
-    0x17,
-    0x4b,
-    0xc4,
-    0x0d,
-    0x41,
-    0xe7,
-    0xdf,
-    0x29,
-    0xe8,
-    0x46,
-    0x09,
-    0x19,
-    0x0e,
-    0x30,
-    0x76,
-    0x92,
-    0xa6,
-    0x9f,
-    0xcb,
-    0xf3,
-    0xa6,
-    0x7d,
-    0xd5,
-    0x25,
-    0x5d,
-    0xae,
-    0x7b,
-    0xc5,
-    0x07,
-    0x51,
-    0xf1,
-    0x85,
-    0x9f,
-    0x43,
-    0x2f,
-    0xcf,
-    0xf4,
-    0xe5,
-    0xa2,
-    0xac,
-    0xff,
-    0x20,
-    0x21,
-    0xe5,
-    0x74,
-    0xa6,
-    0x22,
-    0x68,
-    0x97,
-    0x7a,
-    0x2e,
-    0xec,
-    0x51,
-    0xb2,
-    0x92,
-    0xd8,
-    0x83,
-    0x7c,
-    0x58,
-    0x61,
-    0x9a,
-    0x5f,
-    0x75,
-    0xf3,
-    0x64,
-    0xc3,
-    0x44,
-    0xd3,
-    0x22,
-    0xb4,
-    0x33,
-    0x02,
-    0xde,
-    0xe3,
-    0xbd,
-    0x64,
-    0xfe,
-    0xed,
-    0x98,
-    0x21,
-    0x1a,
-    0xe0,
-    0x2f,
-    0x4c,
-    0x0b,
-    0xfc,
-    0x52,
-    0xc3,
-    0x44,
-    0xb6,
-    0x2c,
-    0x56,
-    0x66,
-    0x03,
-    0x76,
-    0x2b,
-    0x0e,
-    0xd2,
-    0xeb,
-    0x60,
-    0xf1,
-    0xda,
-    0xfc,
-    0xf3,
-    0x2c,
-    0x97,
-    0xc4,
-    0xdf,
-    0xd5,
-    0x8f,
-    0x3e,
-    0x88,
-    0xd6,
-    0xda,
-    0xb6,
-    0x59,
-    0xfb,
-    0xe1,
-    0x7d,
-    0xac,
-    0x49,
-    0x66,
-    0xe1,
-    0xea,
-    0x92,
-    0xc5,
-    0x5c,
-    0xf3,
-    0x46,
-    0x79,
-    0x0c,
-    0xc0,
-    0x8c,
-    0xe1,
-    0x63,
-    0x47,
-    0x91,
-    0x44,
-    0x20,
-    0x9e,
-    0x20,
-    0x14,
-    0x7e,
-    0x64,
-    0x74,
-    0x6f,
-    0xab,
-    0x5d,
-    0x4a,
-    0xeb,
-    0x7b,
-    0x5c,
-    0x3a,
-    0x93,
-    0x5e,
-    0x66,
-    0x46,
-    0x2d,
-    0x90,
-    0x14,
-    0xb4,
-    0xbf,
-    0x8f,
-    0x39,
-    0x19,
-    0x51,
-    0xd2,
-    0xc5,
-    0xb7,
-    0xf3,
-    0xb8,
-    0xe9,
-    0x08,
-    0x02,
-    0xbf,
-    0x7c,
-    0x9b,
-    0xa8,
-    0xf6,
-    0x9e,
-    0x1f,
-    0xa2,
-    0xb5,
-    0x9b,
-    0xbe,
-    0x46,
-    0x8b,
-    0x12,
-    0xac,
-    0xc4,
-    0x78,
-    0x56,
-    0xff,
-    0xac,
-    0x5c,
-    0x14,
-    0xc1,
-    0xb0,
-    0xb0,
-    0x36,
-    0x43,
-    0xac,
-    0x74,
-    0x08,
-    0xb5,
-    0xe3,
-    0x68,
-    0x99,
-    0xf4,
-    0x8b,
-    0x7f,
-    0x65,
-    0xa3,
-    0x8d,
-    0x91,
-    0x30,
-    0x7d,
-    0x86,
-    0x50,
-    0x35,
-    0xe9,
-    0x11,
-    0x7d,
-    0x80,
-    0xcf,
-    0x48,
-    0x5c,
-    0x99,
-    0xab,
-    0x88,
-    0x65,
-    0x62,
-    0xe0,
-    0x75,
-    0x3c,
-    0x42,
-    0x4e,
-    0x3e,
-    0xe3,
-    0x83,
-    0x26,
-    0x23,
-    0x2f,
-    0xf9,
-    0xfd,
-    0x34,
-    0x78,
-    0xe5,
-    0x20,
-    0x5b,
-    0x95,
-    0x18,
-    0x28,
-    0x9c,
-    0x07,
-    0x5c,
-    0xce,
-    0x9c,
-    0x75,
-    0x0f,
-    0x00,
-    0x60,
-    0x59,
-    0x11,
-    0x34,
-    0x58,
-    0xf8,
-    0xe1,
-    0xfc,
-    0x9c,
-    0x97,
-    0x02,
-    0xda,
-    0x75,
-    0xec,
-    0xa4,
-    0x56,
-    0x1f,
-    0xd3,
-    0x80,
-    0x4f,
-    0xcd,
-    0x42,
-    0x04,
-    0x8f,
-    0xee,
-    0x7f,
-    0xb0,
-    0xa2,
-    0xaf,
-    0x90,
-    0xc0,
-    0xe7,
-    0xc1,
-    0xf4,
-    0x0b,
-    0xe7,
-    0x5c,
-    0x90,
-    0x2b,
-    0xe6,
-    0x84,
-    0xec,
-    0xde,
-    0xb8,
-    0x8b,
-    0x9f,
-    0xac,
-    0xd6,
-    0xd7,
-    0x08,
-    0xca,
-    0xb1,
-    0xe5,
-    0x3f,
-    0x3f,
-    0x46,
-    0x8e,
-    0x4b,
-    0x45,
-    0xf3,
-    0x89,
-    0x96,
-    0xf2,
-    0x89,
-    0x32,
-    0x9e,
-    0x17,
-    0xa2,
-    0x89,
-    0xec,
-    0x69,
-    0x35,
-    0x7e,
-    0x4a,
-    0xde,
-    0x67,
-    0x6c,
-    0x31,
-    0x5a,
-    0xa4,
-    0xe3,
-    0x81,
-    0x8b,
-    0xef,
-    0xaa,
-    0x74,
-    0x11,
-    0x76,
-    0x04,
-    0xd5,
-    0xe3,
-    0x6a,
-    0x33,
-    0x6d,
-    0xee,
-    0x0d,
-    0x3b,
-    0xbf,
-    0xff,
-    0x0d,
-    0xe8,
-    0xf5,
-    0xe2,
-    0x10,
-    0x12,
-    0x19,
-    0xcc,
-    0x90,
-    0x20,
-    0x88,
-    0xf6,
-    0xe9,
-    0xcb,
-    0xa4,
-    0x8b,
-    0xb0,
-    0x25,
-    0xca,
-    0xc4,
-    0x47,
-    0xd9,
-    0x84,
-    0x51,
-    0xae,
-    0xb4,
-    0xff,
-    0xfc,
-    0x9c,
-    0x64,
-    0xbf,
-    0x89,
-    0xcf,
-    0x80,
-    0x91,
-    0xe0,
-    0xa0,
-    0xc9,
-    0xc1,
-    0x6e,
-    0xda,
-    0xb0,
-    0x8e,
-    0xc8,
-    0xcc,
-    0x18,
-    0xdb,
-    0x91,
-    0x9d,
-    0x5c,
-    0x27,
-    0x9f,
-    0xe0,
-    0x94,
-    0xbf,
-    0x59,
-    0x68,
-    0x14,
-    0x32,
-    0x63,
-    0x5e,
-    0x36,
-    0x06,
-    0x7e,
-    0x90,
-    0x5a,
-    0xa9,
-    0xa9,
-    0x0c,
-    0x2a,
-    0xaa,
-    0x8c,
-    0xee,
-    0x23,
-    0x29,
-    0x17,
-    0x76,
-    0x51,
-    0x8d,
-    0x67,
-    0x5e,
-    0x59,
-    0x75,
-    0xe9,
-    0x6a,
-    0xbd,
-    0xf0,
-    0xc1,
-    0x40,
-    0x5c,
-    0xf0,
-    0x6d,
-    0x7a,
-    0x38,
-    0xfc,
-    0xa5,
-    0xfa,
-    0x7c,
-    0x26,
-    0x86,
-    0x7d,
-    0xbe,
-    0x3d,
-    0xf0,
-    0x73,
-    0x81,
-    0x43,
-    0x2d,
-    0x0f,
-    0xfe,
-    0x21,
-    0xd3,
-    0x9a,
-    0x24,
-    0x9a,
-    0xeb,
-    0x0c,
-    0xdd,
-    0x7e,
-    0x52,
-    0xdd,
-    0x93,
-    0x20,
-    0x60,
-    0x19,
-    0xf3,
-    0x09,
-    0xc8,
-    0xb3,
-    0xf0,
-    0xee,
-    0xbf,
-    0x1b,
-    0x0b,
-    0xe0,
-    0x61,
-    0x12,
-    0xd2,
-    0xc3,
-    0x50,
-    0xbe,
-    0xa7,
-    0x01,
-    0x9e,
-    0xf9,
-    0xc3,
-    0x80,
-    0xed,
-    0xef,
-    0x7b,
-    0xd1,
-    0xd4,
-    0xe8,
-    0xc1,
-    0xaa,
-    0x85,
-    0x62,
-    0xed,
-    0x96,
-    0xad,
-    0x63,
-    0xbe,
-    0xeb,
-    0x9c,
-    0x0d,
-    0x9b,
-    0xfc,
-    0xa6,
-    0x73,
-    0x1f,
-    0x91,
-    0xc9,
-    0xab,
-    0xd5,
-    0x94,
-    0x90,
-    0x25,
-    0x40,
-    0x0d,
-    0x36,
-    0x3a,
-    0x1f,
-    0x51,
-    0x0f,
-    0x08,
-    0xee,
-    0x75,
-    0x24,
-    0x7e,
-    0xb0,
-    0x09,
-    0x1d,
-    0xb3,
-    0xec,
-    0x03,
-    0x65,
-    0x7c,
-    0xf6,
-    0xfa,
-    0x88,
-    0x3d,
-    0x6f,
-    0x95,
-    0xe0,
-    0xff,
-    0x0f,
-    0x42,
-    0x70,
-    0xc3,
-    0xa2,
-    0x2b,
-    0x10,
-    0x16,
-    0x51,
-    0x66,
-    0xcb,
-    0xe6,
-    0x23,
-    0x6b,
-    0x85,
-    0x94,
-    0xc4,
-    0xcc,
-    0xe0,
-    0x4a,
-    0x84,
-    0x20,
-    0x61,
-    0x8f,
-    0xa2,
-    0x40,
-    0xcf,
-    0x19,
-    0xcb,
-    0xb7,
-    0xdc,
-    0xe2,
-    0xde,
-    0x73,
-    0x08,
-    0x7e,
-    0xf2,
-    0xc1,
-    0xc1,
-    0xab,
-    0x9a,
-    0x78,
-    0xcf,
-    0x2a,
-    0x68,
-    0x73,
-    0xef,
-    0xcd,
-    0xaf,
-    0x45,
-    0xbe,
-    0xd2,
-    0x8d,
-    0x29,
-    0xd9,
-    0x6f,
-    0x29,
-    0x38,
-    0x43,
-    0xae,
-    0x3a,
-    0xdf,
-    0x07,
-    0x7b,
-    0xc9,
-    0x8f,
-    0x1e,
-    0xfb,
-    0x37,
-    0xb6,
-    0x92,
-    0x20,
-    0x81,
-    0xef,
-    0xe4,
-    0x7b,
-    0xc3,
-    0x75,
-    0xac,
-    0x51,
-    0xfb,
-    0xde,
-    0x7f,
-    0xf0,
-    0x10,
-    0x06,
-    0x15,
-    0x43,
-    0x13,
-    0x49,
-    0xab,
-    0xa5,
-    0xc4,
-    0xf5,
-    0xa7,
-    0xf3,
-    0x58,
-    0xfe,
-    0x7b,
-    0xe5,
-    0x79,
-    0xf4,
-    0xcb,
-    0x9e,
-    0x8f,
-    0x33,
-    0xd2,
-    0x81,
-    0x3e,
-    0x5a,
-    0x02,
-    0x47,
-    0x2f,
-    0xfe,
-    0xea,
-    0x4e,
-    0x14,
-    0x9f,
-    0x5d,
-    0x34,
-    0xe6,
-    0xda,
-    0xd1,
-    0xa5,
-    0x71,
-    0xe1,
-    0x05,
-    0x71,
-    0x13,
-    0x29,
-    0xe7,
-    0xe2,
-    0xc1,
-    0x62,
-    0xb4,
-    0x4c,
-    0x4a,
-    0xac,
-    0x61,
-    0xe5,
-    0xe0,
-    0x08,
-    0x3a,
-    0xd7,
-    0xd4,
-    0x0c,
-    0xc9,
-    0x94,
-    0xa1,
-    0xdc,
-    0xf9,
-    0x6a,
-    0x2c,
-    0x55,
-    0x7b,
-    0x57,
-    0x4a,
-    0x8b,
-    0x69,
-    0x1e,
-    0x83,
-    0x76,
-    0x29,
-    0x9a,
-    0x16,
-    0xe8,
-    0x95,
-    0x53,
-    0x3c,
-    0xc2,
-    0x58,
-    0x4f,
-    0xb1,
-    0x68,
-    0x9b,
-    0x2b,
-    0x71,
-    0x72,
-    0xe2,
-    0x6a,
-    0xbf,
-    0xa5,
-    0x30,
-    0x0c,
-    0x6c,
-    0x21,
-    0x72,
-    0x62,
-    0x56,
-    0xdb,
-    0x1a,
-    0x22,
-    0x2f,
-    0x4e,
-    0x0b,
-    0xb7,
-    0x80,
-    0x6e,
-    0xb5,
-    0xda,
-    0xed,
-    0xde,
-    0x81,
-    0x66,
-    0xba,
-    0x62,
-    0x6f,
-    0x68,
-    0x8e,
-    0x97,
-    0xfd,
-    0x76,
-    0x77,
-    0xe2,
-    0x4c,
-    0x43,
-    0x2f,
-    0xa6,
-    0x7e,
-    0x70,
-    0x9e,
-    0xba,
-    0x62,
-    0xa4,
-    0x9f,
-    0x1a,
-    0x53,
-    0xde,
-    0x07,
-    0xdc,
-    0x5d,
-    0x0a,
-    0xe4,
-    0x66,
-    0xa2,
-    0xd3,
-    0x02,
-    0xdf,
-    0xfc,
-    0xb9,
-    0xb4,
-    0xe3,
-    0xe4,
-    0x63,
-    0xd0,
-    0x7b,
-    0x93,
-    0x36,
-    0xfc,
-    0x4c,
-    0x66,
-    0x26,
-    0x28,
-    0x0e,
-    0x87,
-    0xcc,
-    0x5c,
-    0x40,
-    0xca,
-    0xb9,
-    0xb4,
-    0x1a,
-    0xd5,
-    0x0b,
-    0xa9,
-    0xc4,
-    0x84,
-    0x3e,
-    0x91,
-    0xc5,
-    0x8c,
-    0x44,
-    0x69,
-    0xbe,
-    0x5e,
-    0xd7,
-    0xd3
-  ],
-  const [
-    0x0e,
-    0x2f,
-    0xce,
-    0x9e,
-    0x12,
-    0x3c,
-    0x9e,
-    0x83,
-    0xa8,
-    0xed,
-    0x6f,
-    0xa9,
-    0xaa,
-    0xc8,
-    0x79,
-    0xf9,
-    0xb1,
-    0x12,
-    0xc0,
-    0xf7,
-    0x7c,
-    0x9f,
-    0x96,
-    0x3e,
-    0x91,
-    0xe8,
-    0x61,
-    0x2a,
-    0x26,
-    0x5e,
-    0x9e,
-    0xd4,
-    0x41,
-    0xfe,
-    0x26,
-    0x43,
-    0x1f,
-    0x26,
-    0xb0,
-    0xe0,
-    0xd3,
-    0xa7,
-    0x98,
-    0x2b,
-    0x2f,
-    0x1b,
-    0xdf,
-    0xad,
-    0xe7,
-    0x79,
-    0x72,
-    0x2d,
-    0xf4,
-    0xe6,
-    0xaf,
-    0x27,
-    0x37,
-    0xce,
-    0x25,
-    0x7a,
-    0x5f,
-    0x34,
-    0x9b,
-    0x61,
-    0x0c,
-    0x46,
-    0x54,
-    0xa4,
-    0x34,
-    0x35,
-    0x92,
-    0x10,
-    0xc7,
-    0x43,
-    0x59,
-    0x24,
-    0x8e,
-    0x1e,
-    0x75,
-    0x0d,
-    0x59,
-    0x6c,
-    0xbf,
-    0xd5,
-    0x59,
-    0xa7,
-    0x9b,
-    0xd7,
-    0xcb,
-    0x2b,
-    0xc5,
-    0x76,
-    0xd6,
-    0x8d,
-    0x4e,
-    0x0e,
-    0xb7,
-    0x2f,
-    0xe1,
-    0x2b,
-    0x1b,
-    0x11,
-    0x4b,
-    0xf9,
-    0xcc,
-    0xea,
-    0x3a,
-    0xfc,
-    0x90,
-    0x78,
-    0x45,
-    0x01,
-    0x4f,
-    0x14,
-    0x2d,
-    0x55,
-    0x73,
-    0x89,
-    0x63,
-    0x34,
-    0x94,
-    0x26,
-    0xca,
-    0x84,
-    0x55,
-    0x12,
-    0xbd,
-    0xc4,
-    0x89,
-    0xe0,
-    0x54,
-    0x3f,
-    0x9b,
-    0x63,
-    0xe3,
-    0x85,
-    0x2c,
-    0xc4,
-    0xc4,
-    0x1b,
-    0xfd,
-    0xd1,
-    0x57,
-    0x72,
-    0x10,
-    0x98,
-    0x46,
-    0x16,
-    0x0a,
-    0x35,
-    0x0e,
-    0x28,
-    0xdc,
-    0xe8,
-    0xbb,
-    0x0e,
-    0xa2,
-    0x6b,
-    0xf2,
-    0x69,
-    0xcb,
-    0x82,
-    0x35,
-    0x47,
-    0x7b,
-    0xd3,
-    0x63,
-    0x9b,
-    0x2d,
-    0xf8,
-    0x7e,
-    0xea,
-    0x9d,
-    0xd3,
-    0xb1,
-    0x46,
-    0xe5,
-    0x21,
-    0x92,
-    0x80,
-    0xe6,
-    0x52,
-    0xa4,
-    0x9a,
-    0xe9,
-    0x99,
-    0x20,
-    0x7b,
-    0x86,
-    0x3f,
-    0xf5,
-    0xe6,
-    0xc6,
-    0x3c,
-    0x0d,
-    0xad,
-    0x84,
-    0x08,
-    0xd2,
-    0x22,
-    0x19,
-    0xaf,
-    0xf1,
-    0xcf,
-    0x38,
-    0x24,
-    0x5d,
-    0x67,
-    0x16,
-    0xd7,
-    0x98,
-    0xfc,
-    0xce,
-    0x89,
-    0x2e,
-    0x71,
-    0x05,
-    0x5f,
-    0x82,
-    0x33,
-    0xc9,
-    0x36,
-    0xcc,
-    0x24,
-    0xbf,
-    0x37,
-    0x63,
-    0xd8,
-    0x7e,
-    0xab,
-    0x38,
-    0x04,
-    0x36,
-    0x10,
-    0xa3,
-    0x33,
-    0x95,
-    0x6c,
-    0x63,
-    0xbb,
-    0xeb,
-    0xe1,
-    0xe0,
-    0xf0,
-    0x8c,
-    0x82,
-    0xb2,
-    0x97,
-    0x76,
-    0x65,
-    0x67,
-    0x9e,
-    0x33,
-    0xf9,
-    0x81,
-    0x0a,
-    0x01,
-    0x9a,
-    0xbf,
-    0x30,
-    0x31,
-    0x63,
-    0x9e,
-    0x28,
-    0xcd,
-    0x44,
-    0x1e,
-    0x7f,
-    0x7d,
-    0x54,
-    0xc9,
-    0x2c,
-    0xab,
-    0x68,
-    0xf2,
-    0xc5,
-    0xe6,
-    0xe4,
-    0x3b,
-    0xf3,
-    0x84,
-    0xd1,
-    0x5a,
-    0x24,
-    0x8c,
-    0x30,
-    0x1c,
-    0x7f,
-    0xd3,
-    0x8e,
-    0xa9,
-    0x1d,
-    0x64,
-    0xd9,
-    0x0b,
-    0x76,
-    0x25,
-    0x72,
-    0xea,
-    0x19,
-    0xb8,
-    0x83,
-    0x99,
-    0xa1,
-    0xa0,
-    0x93,
-    0x57,
-    0xe4,
-    0xa5,
-    0x58,
-    0xce,
-    0x6d,
-    0x79,
-    0xcc,
-    0xe0,
-    0x2d,
-    0x9b,
-    0x83,
-    0xa3,
-    0x6d,
-    0x7c,
-    0x3b,
-    0xaa,
-    0x07,
-    0xe1,
-    0xb5,
-    0x87,
-    0xd6,
-    0x88,
-    0xc3,
-    0x8d,
-    0x6b,
-    0x0e,
-    0xa3,
-    0xdb,
-    0x01,
-    0x10,
-    0x8b,
-    0x96,
-    0xb3,
-    0x91,
-    0x85,
-    0x75,
-    0xed,
-    0x9b,
-    0x7d,
-    0x83,
-    0x21,
-    0x29,
-    0x98,
-    0x20,
-    0xbb,
-    0x45,
-    0xc8,
-    0x49,
-    0x56,
-    0x6e,
-    0x9e,
-    0x1a,
-    0x30,
-    0x3c,
-    0x5f,
-    0x91,
-    0xdb,
-    0x47,
-    0x59,
-    0x95,
-    0x36,
-    0x44,
-    0x77,
-    0x37,
-    0x9c,
-    0x71,
-    0x14,
-    0x37,
-    0x5b,
-    0x34,
-    0x0d,
-    0xca,
-    0x68,
-    0xfe,
-    0x1a,
-    0x9a,
-    0x51,
-    0x76,
-    0x5e,
-    0x0f,
-    0x72,
-    0xd4,
-    0x3c,
-    0xcd,
-    0x6c,
-    0x8a,
-    0x6d,
-    0x7e,
-    0xd3,
-    0x2a,
-    0x4f,
-    0xd1,
-    0x27,
-    0x84,
-    0x80,
-    0xc2,
-    0x06,
-    0x0e,
-    0xac,
-    0x1d,
-    0x9f,
-    0x8a,
-    0xa3,
-    0x3d,
-    0x6a,
-    0xe2,
-    0xaf,
-    0x1a,
-    0x17,
-    0x57,
-    0x24,
-    0x83,
-    0xc4,
-    0xda,
-    0x38,
-    0xa7,
-    0x72,
-    0xba,
-    0x15,
-    0xda,
-    0xba,
-    0x80,
-    0x2d,
-    0x96,
-    0xbc,
-    0x18,
-    0xce,
-    0xc0,
-    0x59,
-    0x31,
-    0xf6,
-    0x2d,
-    0xa2,
-    0xe5,
-    0x68,
-    0x65,
-    0x8f,
-    0x9d,
-    0xff,
-    0xa7,
-    0xf5,
-    0x2f,
-    0x43,
-    0x2d,
-    0xb2,
-    0x4a,
-    0x3a,
-    0xb0,
-    0x2a,
-    0x14,
-    0x81,
-    0x2f,
-    0xf8,
-    0x11,
-    0x9a,
-    0xed,
-    0xdd,
-    0x47,
-    0x88,
-    0xb9,
-    0xfc,
-    0xa0,
-    0x99,
-    0x71,
-    0x4a,
-    0x8f,
-    0x84,
-    0xc9,
-    0x40,
-    0xf6,
-    0xb3,
-    0x49,
-    0xd3,
-    0x48,
-    0xe2,
-    0x95,
-    0xa5,
-    0xeb,
-    0xe9,
-    0xf1,
-    0x7d,
-    0xe0,
-    0xd6,
-    0x04,
-    0xf5,
-    0xa5,
-    0x3f,
-    0xdc,
-    0x72,
-    0x5a,
-    0xd7,
-    0x33,
-    0x59,
-    0x24,
-    0x3e,
-    0xf1,
-    0x80,
-    0xcf,
-    0x1e,
-    0xf2,
-    0xe3,
-    0xb7,
-    0x73,
-    0x08,
-    0x99,
-    0xe8,
-    0x2a,
-    0x44,
-    0x06,
-    0x84,
-    0xee,
-    0x71,
-    0x51,
-    0x65,
-    0x3f,
-    0xe2,
-    0x18,
-    0x04,
-    0xc4,
-    0x6e,
-    0x63,
-    0x99,
-    0xe2,
-    0xb8,
-    0xd7,
-    0x84,
-    0x8d,
-    0xb4,
-    0x2d,
-    0xec,
-    0x5e,
-    0x66,
-    0xe2,
-    0xa6,
-    0xe6,
-    0xed,
-    0x2f,
-    0x58,
-    0x43,
-    0xc1,
-    0x3b,
-    0xde,
-    0xf0,
-    0x39,
-    0x90,
-    0xec,
-    0xe2,
-    0x50,
-    0xcb,
-    0xf5,
-    0xd0,
-    0xa8,
-    0x98,
-    0x4c,
-    0xd2,
-    0xcf,
-    0xde,
-    0x8a,
-    0x2d,
-    0xc2,
-    0x37,
-    0x2f,
-    0x6d,
-    0xaf,
-    0xa3,
-    0x8c,
-    0xb5,
-    0xff,
-    0x7d,
-    0xe0,
-    0x54,
-    0x94,
-    0xae,
-    0xc1,
-    0x98,
-    0x4f,
-    0x20,
-    0xbd,
-    0xe7,
-    0xd6,
-    0x76,
-    0x42,
-    0x0b,
-    0x94,
-    0xfa,
-    0xbb,
-    0xce,
-    0x01,
-    0xd6,
-    0xfc,
-    0xc7,
-    0x23,
-    0x88,
-    0xe0,
-    0x73,
-    0x55,
-    0x90,
-    0x30,
-    0x88,
-    0x47,
-    0x6b,
-    0xc7,
-    0x85,
-    0x46,
-    0xc5,
-    0xf4,
-    0x8e,
-    0xbd,
-    0xeb,
-    0x20,
-    0x77,
-    0xfc,
-    0x7f,
-    0xb1,
-    0x1f,
-    0x39,
-    0x6f,
-    0x2e,
-    0xff,
-    0xd4,
-    0x27,
-    0xa3,
-    0x02,
-    0xe0,
-    0x06,
-    0x47,
-    0x97,
-    0xde,
-    0x0f,
-    0x5c,
-    0x05,
-    0xcb,
-    0xe2,
-    0x57,
-    0x00,
-    0x5e,
-    0xea,
-    0x41,
-    0x79,
-    0x8b,
-    0xd7,
-    0x5d,
-    0xba,
-    0x4b,
-    0x4f,
-    0x0b,
-    0xb1,
-    0x9f,
-    0xe0,
-    0xec,
-    0x8c,
-    0xd2,
-    0x3a,
-    0x47,
-    0x87,
-    0xff,
-    0x9b,
-    0xab,
-    0x02,
-    0xd4,
-    0x8a,
-    0xd6,
-    0xd7,
-    0x95,
-    0xc8,
-    0xd6,
-    0xea,
-    0x64,
-    0x84,
-    0x6e,
-    0x02,
-    0xbf,
-    0xce,
-    0xbb,
-    0xd7,
-    0x4a,
-    0x4e,
-    0x17,
-    0x6c,
-    0xcf,
-    0x36,
-    0x3e,
-    0x9e,
-    0x83,
-    0x75,
-    0xb0,
-    0xfd,
-    0x8b,
-    0x2e,
-    0x56,
-    0xdc,
-    0xbe,
-    0x68,
-    0x67,
-    0xa4,
-    0xad,
-    0x07,
-    0x8d,
-    0x6e,
-    0xe0,
-    0xfb,
-    0x44,
-    0xd0,
-    0x63,
-    0xb7,
-    0x83,
-    0xf6,
-    0x82,
-    0xe4,
-    0x9f,
-    0xf5,
-    0xd0,
-    0x57,
-    0x6c,
-    0x5d,
-    0x6e,
-    0x41,
-    0xa5,
-    0x0d,
-    0x89,
-    0xa6,
-    0x8e,
-    0x4c,
-    0x25,
-    0x11,
-    0xd7,
-    0x15,
-    0x19,
-    0x85,
-    0xc4,
-    0xb1,
-    0x5b,
-    0xb6,
-    0x8b,
-    0x8c,
-    0x7e,
-    0x79,
-    0xfe,
-    0x41,
-    0x79,
-    0x7a,
-    0x69,
-    0xf7,
-    0xaa,
-    0x2d,
-    0xbe,
-    0xf0,
-    0x1b,
-    0x07,
-    0xef,
-    0x5f,
-    0x03,
-    0xed,
-    0x9c,
-    0x7a,
-    0x90,
-    0xed,
-    0xee,
-    0xd1,
-    0xe3,
-    0x2c,
-    0xc3,
-    0xde,
-    0x5d,
-    0x1f,
-    0x0b,
-    0xdd,
-    0x19,
-    0xfe,
-    0x71,
-    0xde,
-    0xb9,
-    0x76,
-    0x3f,
-    0x18,
-    0x66,
-    0x9f,
-    0x7b,
-    0x80,
-    0x12,
-    0x2d,
-    0x56,
-    0x9a,
-    0x00,
-    0xea,
-    0xc8,
-    0x8f,
-    0x87,
-    0x64,
-    0x74,
-    0x81,
-    0x13,
-    0xe2,
-    0xd1,
-    0x1b,
-    0x6c,
-    0x9d,
-    0x8b,
-    0x6c,
-    0x3b,
-    0x2d,
-    0x27,
-    0xf5,
-    0xca,
-    0x42,
-    0xe7,
-    0x00,
-    0x0b,
-    0x94,
-    0xed,
-    0x34,
-    0xdc,
-    0x1d,
-    0xa2,
-    0x67,
-    0x89,
-    0x85,
-    0x59,
-    0xb3,
-    0x92,
-    0xde,
-    0x30,
-    0xcc,
-    0xaf,
-    0x91,
-    0x37,
-    0x90,
-    0x12,
-    0x98,
-    0xd5,
-    0xe0,
-    0xec,
-    0xee,
-    0x67,
-    0xaf,
-    0x32,
-    0x44,
-    0x29,
-    0x58,
-    0xa1,
-    0xf6,
-    0x5a,
-    0x35,
-    0x00,
-    0x3d,
-    0x9b,
-    0x6d,
-    0xa5,
-    0xa6,
-    0x99,
-    0x0d,
-    0x3a,
-    0xc3,
-    0xeb,
-    0x5b,
-    0xc1,
-    0x20,
-    0x3e,
-    0x67,
-    0xd6,
-    0x78,
-    0xaf,
-    0xe2,
-    0x34,
-    0x29,
-    0x78,
-    0x33,
-    0x7b,
-    0xe6,
-    0xcf,
-    0xc8,
-    0x31,
-    0xac,
-    0x0b,
-    0xaa,
-    0x06,
-    0xf7,
-    0x09,
-    0x55,
-    0x5c,
-    0x35,
-    0xce,
-    0xc6,
-    0x06,
-    0x7b,
-    0x6d,
-    0xd5,
-    0x50,
-    0x77,
-    0x2b,
-    0xc5,
-    0x40,
-    0xa6,
-    0xe2,
-    0x1a,
-    0x1c,
-    0xc6,
-    0xa3,
-    0xaa,
-    0x2c,
-    0x8f,
-    0x9f,
-    0xf7,
-    0xc1,
-    0x9e,
-    0x48,
-    0xbc,
-    0x77,
-    0xb2,
-    0xb3,
-    0xc6,
-    0xb6,
-    0x1a,
-    0x41,
-    0x05,
-    0x7f,
-    0x6e,
-    0x7e,
-    0xe3,
-    0x65,
-    0x7e,
-    0x49,
-    0xd4,
-    0xd9,
-    0x88,
-    0x36,
-    0x2f,
-    0xab,
-    0xae,
-    0x30,
-    0x3c,
-    0xce,
-    0xa6,
-    0x63,
-    0x8e,
-    0x5c,
-    0xb4,
-    0x59,
-    0x93,
-    0xd9,
-    0xd5,
-    0x62,
-    0x69,
-    0xbc,
-    0x3d,
-    0x3a,
-    0xf3,
-    0x2b,
-    0x04,
-    0xe6,
-    0x2d,
-    0x07,
-    0x1d,
-    0xdf,
-    0xbc,
-    0x28,
-    0x87,
-    0x72,
-    0xca,
-    0xea,
-    0xc7,
-    0x67,
-    0x10,
-    0xe8,
-    0x95,
-    0xe1,
-    0x34,
-    0x07,
-    0xd6,
-    0x85,
-    0x56,
-    0xb7,
-    0xca,
-    0xde,
-    0xe6,
-    0x75,
-    0x87,
-    0x00,
-    0xb8,
-    0x94,
-    0xa6,
-    0x6c,
-    0x5a,
-    0x3e,
-    0x3c,
-    0x34,
-    0xa5,
-    0xb6,
-    0x0c,
-    0x60,
-    0x92,
-    0xdf,
-    0xfa,
-    0x8f,
-    0x4f,
-    0x02,
-    0xc3,
-    0xe2,
-    0x92,
-    0xcc,
-    0xec,
-    0x15,
-    0x2e,
-    0x96,
-    0xf8,
-    0xef,
-    0xe4,
-    0xea,
-    0xde,
-    0xdd,
-    0x7b,
-    0x42,
-    0xba,
-    0xda,
-    0x12,
-    0x12,
-    0xc3,
-    0x91,
-    0xb6,
-    0x09,
-    0x7d,
-    0xc6,
-    0x30,
-    0x94,
-    0x30,
-    0xf2,
-    0x20,
-    0xa5,
-    0x98,
-    0x2d,
-    0x50,
-    0xb2,
-    0xde,
-    0x51,
-    0x42,
-    0x00,
-    0xc7,
-    0x5d,
-    0x0b,
-    0x21,
-    0x2c,
-    0x17,
-    0x64,
-    0xbc,
-    0xaa,
-    0xf6,
-    0xff,
-    0x8c,
-    0x9a,
-    0x3e,
-    0x17,
-    0xab,
-    0x43,
-    0x6d,
-    0x4b,
-    0x11,
-    0x4f,
-    0xd6,
-    0xac,
-    0x57,
-    0x7c,
-    0x8c,
-    0x15,
-    0xc1,
-    0x94,
-    0x81,
-    0xbb,
-    0x7c,
-    0x9f,
-    0xef,
-    0x04,
-    0x24,
-    0x57,
-    0xf7,
-    0x9d,
-    0x8a,
-    0xdc,
-    0x89,
-    0xc7,
-    0xb3,
-    0xa9,
-    0x83,
-    0xf1,
-    0x24,
-    0xc7,
-    0x1d,
-    0x8c,
-    0x5c,
-    0x40,
-    0x84,
-    0x1b,
-    0xa3,
-    0xd7,
-    0xc5,
-    0x89,
-    0x02,
-    0xf6,
-    0xed,
-    0xc0,
-    0x93,
-    0xe8,
-    0x6e,
-    0x77,
-    0xfb,
-    0x48,
-    0xc5,
-    0x4b,
-    0x34,
-    0xba,
-    0x5a,
-    0x12,
-    0x90,
-    0xd9,
-    0xa8,
-    0x6c,
-    0xfa,
-    0x70,
-    0x9d,
-    0x9a,
-    0x7f,
-    0xec,
-    0x44,
-    0x94,
-    0x0e,
-    0x11,
-    0xa1,
-    0x55,
-    0x7c,
-    0xed,
-    0xdd,
-    0x7a,
-    0xcb,
-    0x0a,
-    0xa3,
-    0x0b,
-    0xac,
-    0xe8,
-    0xc9,
-    0x99,
-    0x42,
-    0xaa,
-    0x33,
-    0x89,
-    0x29,
-    0x10,
-    0xf4,
-    0xaf,
-    0xb7,
-    0xa5,
-    0xb7,
-    0x1f,
-    0x82,
-    0x3a,
-    0x5e,
-    0x3f,
-    0x22,
-    0x92,
-    0xe8,
-    0x21,
-    0x38,
-    0x5f,
-    0x98,
-    0x10,
-    0xaf,
-    0x6d,
-    0x53,
-    0x69,
-    0x41,
-    0x1e,
-    0x4b,
-    0xad,
-    0x3d,
-    0x16,
-    0xda,
-    0xd3,
-    0x88,
-    0x37,
-    0xb0,
-    0xe3,
-    0xe2,
-    0xd0,
-    0x31,
-    0xc0,
-    0x6b,
-    0x11,
-    0x19,
-    0x45,
-    0x66,
-    0xc3,
-    0x62,
-    0x94,
-    0x3c,
-    0x36,
-    0x67,
-    0xab,
-    0xc4,
-    0x7a,
-    0x49,
-    0x39,
-    0xc1,
-    0xd1,
-    0x92,
-    0xaf,
-    0xad,
-    0x65,
-    0x18,
-    0x99,
-    0xb5,
-    0x37,
-    0x25,
-    0x2f,
-    0x04,
-    0x58,
-    0xd4,
-    0x27,
-    0x44,
-    0x5b,
-    0xbe,
-    0xce,
-    0x62,
-    0x0a,
-    0xd6,
-    0x57,
-    0x92,
-    0x58,
-    0x92,
-    0x73,
-    0x94,
-    0x97,
-    0x4c,
-    0x22,
-    0x35,
-    0xeb,
-    0xe7,
-    0xc8,
-    0x18,
-    0xff,
-    0xb5,
-    0x83,
-    0xb6,
-    0xf6,
-    0x98,
-    0xbc,
-    0xa4,
-    0xa5,
-    0x68,
-    0xfc,
-    0x15,
-    0xff,
-    0x95,
-    0x01,
-    0x9f,
-    0xd0,
-    0x0e,
-    0x12,
-    0x42,
-    0xaf,
-    0x61,
-    0x8f,
-    0xa6,
-    0x2d,
-    0x23,
-    0xcc,
-    0xa4,
-    0x53,
-    0x92,
-    0x1f,
-    0x08,
-    0x4c,
-    0x79,
-    0x38,
-    0x95,
-    0x5e,
-    0x54,
-    0xb1,
-    0x4a,
-    0x1f,
-    0xb5,
-    0xe6,
-    0xe4,
-    0xe5,
-    0xe6,
-    0x07,
-    0xa4,
-    0x7e,
-    0xd0,
-    0x6c,
-    0x52,
-    0x21,
-    0x1b,
-    0x28,
-    0x82,
-    0xa5,
-    0x97,
-    0xe0,
-    0x16,
-    0xf1,
-    0xdb,
-    0xde,
-    0x04,
-    0xb4,
-    0x2c,
-    0x61,
-    0x5a,
-    0x56,
-    0xa0,
-    0x37,
-    0x7f,
-    0x2e,
-    0x82,
-    0x8e,
-    0xbb,
-    0xf5,
-    0xf9,
-    0x08,
-    0xf9,
-    0x7a,
-    0xe5,
-    0x0d,
-    0xcc,
-    0x98,
-    0x0a,
-    0x65,
-    0xb1,
-    0x65,
-    0x70,
-    0x06,
-    0x94,
-    0xad,
-    0x09,
-    0x2a,
-    0x95,
-    0x9f,
-    0x95,
-    0xa5,
-    0x0b,
-    0xc5,
-    0xc3,
-    0x76,
-    0xc9,
-    0x3a,
-    0x99,
-    0x9c,
-    0xa1,
-    0x17,
-    0x15,
-    0x2b,
-    0x27,
-    0x2e,
-    0x15,
-    0x9e,
-    0xb7,
-    0xfb,
-    0x74,
-    0x6f,
-    0xba,
-    0xd7,
-    0x76,
-    0xe5,
-    0x24,
-    0x6f,
-    0x66,
-    0x2e,
-    0x41,
-    0x75,
-    0x7d,
-    0xad,
-    0xb2,
-    0x95,
-    0x06,
-    0x95,
-    0xb3,
-    0xab,
-    0xc0,
-    0xb7,
-    0x9f,
-    0x33,
-    0x84,
-    0x98,
-    0xb5,
-    0x00,
-    0x27,
-    0xc7,
-    0x1c,
-    0x32,
-    0xa2,
-    0x6d,
-    0x25,
-    0x62,
-    0x70,
-    0x26,
-    0xd1,
-    0x1f,
-    0x38,
-    0x0f,
-    0x93,
-    0x9e,
-    0xac,
-    0x21,
-    0x56,
-    0xad,
-    0xb1,
-    0xbd,
-    0xc2,
-    0xe9,
-    0xc0,
-    0x87,
-    0xbb,
-    0x31,
-    0x8c,
-    0x78,
-    0x2b,
-    0x5a,
-    0xe5,
-    0x2f,
-    0x02,
-    0x24,
-    0xdc,
-    0x88,
-    0x7b,
-    0x6d,
-    0x28,
-    0x70,
-    0xa0,
-    0xa5,
-    0xc8,
-    0xf8,
-    0x10,
-    0x82,
-    0xea,
-    0xa8,
-    0x00,
-    0xf5,
-    0x0c,
-    0x15,
-    0x80,
-    0x5c,
-    0x61,
-    0xb5,
-    0xff,
-    0xf9,
-    0x76,
-    0xf3,
-    0x12,
-    0xa3,
-    0x15,
-    0x7f,
-    0x71,
-    0xbb,
-    0x6a,
-    0xe8,
-    0x42,
-    0x62,
-    0x64,
-    0x6c,
-    0x9b,
-    0xe9,
-    0x5e,
-    0x0f,
-    0x42,
-    0x89,
-    0xff,
-    0xea,
-    0xb7,
-    0x55,
-    0x5e,
-    0xc6,
-    0x74,
-    0x6c,
-    0x6a,
-    0xe9,
-    0x73,
-    0x73,
-    0x8a,
-    0x30,
-    0xf1,
-    0x43,
-    0x80,
-    0x5e,
-    0x72,
-    0xde,
-    0x93,
-    0xb4,
-    0x05,
-    0xa8,
-    0xed,
-    0xc2,
-    0xc9,
-    0xd4,
-    0x42,
-    0x7c,
-    0xb0,
-    0x1c,
-    0xb2,
-    0x90,
-    0x83,
-    0xb5,
-    0xf1,
-    0xf7,
-    0x26,
-    0x82,
-    0xa5,
-    0xca,
-    0x1e,
-    0x88,
-    0x0f,
-    0x58,
-    0x50,
-    0xa2,
-    0xee,
-    0x75,
-    0x0b,
-    0x75,
-    0xa0,
-    0x15,
-    0x49,
-    0xa7,
-    0x8b,
-    0x19,
-    0x32,
-    0x4c,
-    0xbb,
-    0x68,
-    0xe2,
-    0xa1,
-    0xcc,
-    0x42,
-    0x6c,
-    0xfd,
-    0x0b,
-    0xd1,
-    0x1f,
-    0x04,
-    0xd8,
-    0x01,
-    0x08,
-    0x1e,
-    0x4f,
-    0x92,
-    0xb7,
-    0x28,
-    0x27,
-    0x6c,
-    0x46,
-    0x69,
-    0xd9,
-    0x32,
-    0x98,
-    0xc7,
-    0x05,
-    0x19,
-    0xdf,
-    0x3a,
-    0x12,
-    0xfb,
-    0x61,
-    0x82,
-    0x16,
-    0xa7,
-    0x7b,
-    0x15,
-    0xf5,
-    0x7c,
-    0xe6,
-    0x5c,
-    0xcc,
-    0x36,
-    0x39,
-    0x1e,
-    0x90,
-    0x07,
-    0xaf,
-    0x3d,
-    0xf2,
-    0xea,
-    0x2b,
-    0xa0,
-    0x86,
-    0x34,
-    0x79,
-    0x70,
-    0x25,
-    0x6b,
-    0xd7,
-    0x87,
-    0x90,
-    0x5c,
-    0xb4,
-    0x25,
-    0x55,
-    0x68,
-    0xb7,
-    0xe5,
-    0xf7,
-    0x1f,
-    0x03,
-    0xf0,
-    0x49,
-    0x10,
-    0xba,
-    0x71,
-    0x1b,
-    0xde,
-    0xbf,
-    0x49,
-    0x18,
-    0x97,
-    0xc1,
-    0x03,
-    0xef,
-    0x42,
-    0x75,
-    0x0a,
-    0xb1,
-    0xb7,
-    0x22,
-    0x19,
-    0x7a,
-    0xb4,
-    0x63,
-    0xf4,
-    0x54,
-    0x2c,
-    0x29,
-    0x56,
-    0x58,
-    0xe2,
-    0xff,
-    0x2a,
-    0x17,
-    0x37,
-    0x92,
-    0xfd,
-    0x38,
-    0x40,
-    0x70,
-    0xb4,
-    0x62,
-    0x1c,
-    0x10,
-    0x7a,
-    0x5c,
-    0x85,
-    0x13,
-    0xfd,
-    0x72,
-    0xa4,
-    0xc9,
-    0xda,
-    0x1b,
-    0x2a,
-    0xf7,
-    0x55,
-    0xda,
-    0x9c,
-    0xd7,
-    0x4e,
-    0x62,
-    0xee,
-    0x61,
-    0x71,
-    0xfd,
-    0x54,
-    0xc9,
-    0xac,
-    0x2e,
-    0x55,
-    0x49,
-    0xe6,
-    0x95,
-    0x21,
-    0x20,
-    0xee,
-    0x14,
-    0x24,
-    0xdb,
-    0xb1,
-    0x30,
-    0xdb,
-    0xd3,
-    0xb1,
-    0xba,
-    0xe7,
-    0xf7,
-    0xb2,
-    0xae,
-    0x60,
-    0xcb,
-    0xb6,
-    0x5b,
-    0x6b,
-    0xb1,
-    0x2c,
-    0xc4,
-    0x0f,
-    0x68,
-    0x65,
-    0x47,
-    0x44,
-    0xd2,
-    0x47,
-    0x7c,
-    0x4d,
-    0xfa,
-    0x45,
-    0x60,
-    0x48,
-    0x55,
-    0x8f,
-    0xb3,
-    0x04,
-    0x48,
-    0x85,
-    0x9e,
-    0x12,
-    0xeb,
-    0x72,
-    0x99,
-    0x1f,
-    0x0d,
-    0x77,
-    0x8c,
-    0x81,
-    0x78,
-    0xc5,
-    0x34,
-    0x0f,
-    0x75,
-    0x0f,
-    0xc9,
-    0x36,
-    0x93,
-    0x40,
-    0xde,
-    0x49,
-    0xa5,
-    0x69,
-    0x88,
-    0x19,
-    0x0a,
-    0xfd,
-    0xc2,
-    0xc6,
-    0x31,
-    0x40,
-    0x10,
-    0xd4,
-    0x5b,
-    0xfd,
-    0x63,
-    0x81,
-    0xa3,
-    0x77,
-    0x3d,
-    0x56,
-    0x3c,
-    0xa3,
-    0x15,
-    0xfd,
-    0xfb,
-    0x94,
-    0xfd,
-    0x52,
-    0x15,
-    0x37,
-    0x82,
-    0xbc,
-    0x29,
-    0x40,
-    0xd4,
-    0xbe,
-    0x81,
-    0x64,
-    0x27,
-    0xc9,
-    0x95,
-    0xc9,
-    0x58,
-    0x55,
-    0xd0,
-    0xbb,
-    0xd4,
-    0x30,
-    0x97,
-    0xa0,
-    0xb6,
-    0x15,
-    0x88,
-    0x2e,
-    0x2f,
-    0x80,
-    0xff,
-    0xdb,
-    0x2b,
-    0xc1,
-    0xdf,
-    0x95,
-    0x31,
-    0x4f,
-    0x8f,
-    0xb4,
-    0x8b,
-    0x60,
-    0x42,
-    0x2d,
-    0xa8,
-    0xb6,
-    0x7c,
-    0x08,
-    0xbe,
-    0xbc,
-    0xd2,
-    0x14,
-    0xb3,
-    0xd1,
-    0xf1,
-    0xd9,
-    0x3e,
-    0xe4,
-    0xe1,
-    0xce,
-    0x4a,
-    0x41,
-    0x8b,
-    0xcc,
-    0x9b,
-    0xaa,
-    0x79,
-    0xc3,
-    0xb3,
-    0xaa,
-    0xde,
-    0xac,
-    0xf7,
-    0x26,
-    0xd6,
-    0xbe,
-    0x0e,
-    0x35,
-    0xee,
-    0xe5,
-    0x8a,
-    0x32,
-    0xe7,
-    0x70,
-    0xca,
-    0x0f,
-    0xb7,
-    0x09,
-    0x1e,
-    0xeb,
-    0xd1,
-    0xeb,
-    0x2d,
-    0xe7,
-    0xa6,
-    0x4f,
-    0x94,
-    0x36,
-    0x6c,
-    0x27,
-    0xd0,
-    0x74,
-    0x1e,
-    0x0f,
-    0x5e,
-    0x39,
-    0xc4,
-    0x81,
-    0x20,
-    0xed,
-    0xf4,
-    0x48,
-    0x03,
-    0xde,
-    0x99,
-    0x37,
-    0xdf,
-    0x8f,
-    0xf3,
-    0x1a,
-    0x9f,
-    0x54,
-    0xdf,
-    0xed,
-    0xa1,
-    0x1b,
-    0x59,
-    0x4c,
-    0x60,
-    0x8d,
-    0x3f,
-    0x2b,
-    0x50,
-    0x56,
-    0x57,
-    0xc7,
-    0x09,
-    0xc0,
-    0x94,
-    0xdc,
-    0xa8,
-    0x87,
-    0x95,
-    0x19,
-    0x72,
-    0xe9,
-    0x6f,
-    0xd1,
-    0xbb,
-    0xfc,
-    0xac,
-    0xf3,
-    0x07,
-    0x44,
-    0x94,
-    0x3c,
-    0x6e,
-    0x85,
-    0xab,
-    0xab,
-    0x45,
-    0xd6,
-    0x7a,
-    0x36,
-    0xfa,
-    0xf7,
-    0x92,
-    0xbb,
-    0x40,
-    0xe4,
-    0xcf,
-    0x39,
-    0x6c,
-    0xaa,
-    0xda,
-    0x40,
-    0x1f,
-    0x7a,
-    0xf1,
-    0xa6,
-    0x26,
-    0xfc,
-    0xeb,
-    0x7c,
-    0x9e,
-    0xe5,
-    0x76,
-    0x40,
-    0x5c,
-    0xcc,
-    0xa4,
-    0x54,
-    0x8c,
-    0x3a,
-    0xa6,
-    0xaf,
-    0x97,
-    0x00,
-    0xd7,
-    0xd3,
-    0x4b,
-    0xcd,
-    0xfc,
-    0xff,
-    0x36,
-    0xff,
-    0xc9,
-    0xa5,
-    0x52,
-    0xba,
-    0xa8,
-    0x1e,
-    0xe8,
-    0x37,
-    0xb7,
-    0x9d,
-    0xae,
-    0x5f,
-    0x0f,
-    0x62,
-    0x32,
-    0x99,
-    0x4c,
-    0x30,
-    0x7c,
-    0xe0,
-    0x4a,
-    0x00,
-    0xef,
-    0x18,
-    0x2c,
-    0xf7,
-    0x71,
-    0xa2,
-    0xa3,
-    0x96,
-    0xcc,
-    0x2e,
-    0x6d,
-    0x31,
-    0x53,
-    0xd0,
-    0x1b,
-    0xa2,
-    0xc8,
-    0x57,
-    0x18,
-    0x3e,
-    0x7d,
-    0xda,
-    0xe7,
-    0x08,
-    0xba,
-    0x93,
-    0xac,
-    0x25,
-    0x5f,
-    0xf0,
-    0xee,
-    0x90,
-    0xca,
-    0xe8,
-    0x9b,
-    0x0f,
-    0xfb,
-    0x8c,
-    0x4c,
-    0x66,
-    0xf6,
-    0xde,
-    0xcb,
-    0xca,
-    0x69,
-    0xe5,
-    0xd3,
-    0x98,
-    0x8f,
-    0x01,
-    0x16,
-    0x47,
-    0x54,
-    0x7d,
-    0x84,
-    0x9c,
-    0xba,
-    0x63,
-    0xcb,
-    0x1c,
-    0x7b,
-    0x94,
-    0x1a,
-    0xc7,
-    0xf0,
-    0x17,
-    0x2b,
-    0x03,
-    0x31,
-    0xb2,
-    0x80,
-    0xd7,
-    0x7e,
-    0xb7,
-    0xed,
-    0x59,
-    0xde,
-    0x21,
-    0x56,
-    0x6a,
-    0x05,
-    0xdf,
-    0xba,
-    0xa0,
-    0x7b,
-    0x70,
-    0x70,
-    0x84,
-    0xfb,
-    0xb0,
-    0xb1,
-    0xfe,
-    0x1a,
-    0xf2,
-    0x57,
-    0x0d,
-    0x29,
-    0x4e,
-    0xe4,
-    0xbb,
-    0x5b,
-    0x3d,
-    0xc6,
-    0x51,
-    0x2b,
-    0x63,
-    0xda,
-    0xc7,
-    0xf8,
-    0xab,
-    0x2e,
-    0x7e,
-    0xf2,
-    0x99,
-    0x0b,
-    0x32,
-    0x3a,
-    0xdc,
-    0x33,
-    0x2a,
-    0x45,
-    0x23,
-    0x67,
-    0xb1,
-    0x82,
-    0x32,
-    0x2c,
-    0xca,
-    0x3c,
-    0x35,
-    0xcf,
-    0x20,
-    0xc1,
-    0x54,
-    0xa7,
-    0x3c,
-    0xc4,
-    0x87,
-    0x9a,
-    0xfa,
-    0x00,
-    0xac,
-    0xe2,
-    0x3e,
-    0x1e,
-    0xd7,
-    0x11,
-    0xe3,
-    0xd9,
-    0xe9,
-    0x53,
-    0xf4,
-    0x60,
-    0x64,
-    0xf4,
-    0x1f,
-    0xfb,
-    0x7d,
-    0x22,
-    0x66,
-    0xf2,
-    0x73,
-    0xf3,
-    0x18,
-    0xab,
-    0x20,
-    0xaa,
-    0x00,
-    0x12,
-    0xce,
-    0x36,
-    0xdc,
-    0x3d,
-    0x4b,
-    0xfb,
-    0x11,
-    0x51,
-    0x40,
-    0xd5,
-    0x9c,
-    0x9f,
-    0xbe,
-    0x5a,
-    0x4c,
-    0x13,
-    0x1a,
-    0x60,
-    0x2e,
-    0xcf,
-    0xfb,
-    0xc0,
-    0x49,
-    0x13,
-    0xb1,
-    0x59,
-    0x8c,
-    0x60,
-    0xc8,
-    0x57,
-    0x05,
-    0xdd,
-    0xdd,
-    0xb5,
-    0x54,
-    0xf9,
-    0xb1,
-    0x00,
-    0x5e,
-    0x52,
-    0x7c,
-    0x5e,
-    0x46,
-    0xd6,
-    0x84,
-    0xd0,
-    0x99,
-    0x27,
-    0xed,
-    0xb4,
-    0xc8,
-    0x44,
-    0xd3,
-    0x8e,
-    0xdc,
-    0x67,
-    0x96,
-    0x07,
-    0x65,
-    0x29,
-    0x75,
-    0x36,
-    0xb3,
-    0xec,
-    0x5f,
-    0x1f,
-    0x49,
-    0x7a,
-    0x05,
-    0x79,
-    0x8f,
-    0xea,
-    0x34,
-    0xb5,
-    0xc7,
-    0xc4,
-    0x62,
-    0x3b,
-    0x42,
-    0x65,
-    0x87,
-    0xf7,
-    0xd4,
-    0xa4,
-    0x2e,
-    0x14,
-    0x85,
-    0xb5,
-    0xcb,
-    0x07,
-    0x89,
-    0x4e,
-    0x4f,
-    0xd0,
-    0x73,
-    0x09,
-    0xfa,
-    0x7c,
-    0xa5,
-    0x0a,
-    0x70,
-    0xef,
-    0x0b,
-    0xe1,
-    0x10,
-    0xe0,
-    0x09,
-    0xb1,
-    0x81,
-    0x25,
-    0xb1,
-    0x92,
-    0x8d,
-    0x31,
-    0x3a,
-    0x35,
-    0x33,
-    0xdb,
-    0xad,
-    0xc7,
-    0xf7,
-    0x61,
-    0xe2,
-    0x17,
-    0x7d,
-    0xac,
-    0xab,
-    0xfa,
-    0x56,
-    0xd5,
-    0x4f,
-    0xef,
-    0x1a,
-    0xe9,
-    0x3a,
-    0xff,
-    0xb7,
-    0xe9,
-    0xf2,
-    0xe7,
-    0x08,
-    0x15,
-    0x4d,
-    0x79,
-    0xaa,
-    0x6a,
-    0xe2,
-    0x40,
-    0x0b,
-    0x6a,
-    0xbd,
-    0x63,
-    0xc3,
-    0x1b,
-    0x57,
-    0xcb,
-    0x28,
-    0x52,
-    0xc5,
-    0x88,
-    0x1c,
-    0x31,
-    0x2f,
-    0x71,
-    0x2a,
-    0xef,
-    0x84,
-    0x0b,
-    0xd2,
-    0xd7,
-    0x6c,
-    0xad,
-    0x20,
-    0x94,
-    0x7e,
-    0xe1,
-    0x84,
-    0xab,
-    0xb4,
-    0x0c,
-    0xdd,
-    0x49,
-    0x1b,
-    0x52,
-    0xd7,
-    0x3f,
-    0xcf,
-    0xb4,
-    0x77,
-    0x4b,
-    0x27,
-    0x7b,
-    0xf4,
-    0x99,
-    0x2d,
-    0xda,
-    0xc9,
-    0x89,
-    0x51,
-    0xcf,
-    0x08,
-    0xb3,
-    0x5e,
-    0x4a,
-    0xf1,
-    0x29,
-    0xac,
-    0x91,
-    0xc3,
-    0xfb,
-    0x98,
-    0xe3,
-    0xd2,
-    0x01,
-    0x31,
-    0x5b,
-    0xda,
-    0xd4,
-    0x34,
-    0x18,
-    0x93,
-    0x1e,
-    0x3b,
-    0x9b,
-    0x85,
-    0x14,
-    0x31,
-    0x70,
-    0x1e,
-    0x40,
-    0x09,
-    0x11,
-    0x02,
-    0x84,
-    0xaf,
-    0x07,
-    0xa2,
-    0x5c,
-    0x3f,
-    0x52,
-    0x10,
-    0x63,
-    0x76,
-    0x0b,
-    0x12,
-    0x19,
-    0x66,
-    0x48,
-    0x75,
-    0xe3,
-    0x6d,
-    0x40,
-    0xa3,
-    0x53,
-    0x67,
-    0xb0,
-    0x78,
-    0xaa,
-    0x23,
-    0x7d,
-    0x52,
-    0x9b,
-    0x14,
-    0x9a,
-    0x67,
-    0x52,
-    0x49,
-    0x2c,
-    0x5c,
-    0xb5,
-    0x9f,
-    0xec,
-    0x13,
-    0xea,
-    0x36,
-    0xcd,
-    0xc4,
-    0x19,
-    0x21,
-    0xe0,
-    0x4f,
-    0x73,
-    0x62,
-    0x74,
-    0xd0,
-    0x73,
-    0x15,
-    0x81,
-    0x74,
-    0x63,
-    0xeb,
-    0x47,
-    0x8c,
-    0x23,
-    0xda,
-    0x32,
-    0xe0,
-    0x26,
-    0x13,
-    0x01,
-    0x46,
-    0xbd,
-    0x35,
-    0x27,
-    0x73,
-    0x98,
-    0xc0,
-    0x71,
-    0x10,
-    0x89,
-    0xcc,
-    0xea,
-    0x11,
-    0x8c,
-    0xfb,
-    0xfc,
-    0x42,
-    0x05,
-    0xac,
-    0xd7,
-    0x22,
-    0x48,
-    0x71,
-    0x17,
-    0xf5,
-    0x5e,
-    0xc4,
-    0xa0,
-    0x15,
-    0x07,
-    0xf5,
-    0xcd,
-    0x89,
-    0xfb,
-    0x67,
-    0xcb,
-    0xd8,
-    0x75,
-    0xfc,
-    0x3f,
-    0x1f,
-    0xf2,
-    0xce,
-    0x2f,
-    0x62,
-    0x36,
-    0x20,
-    0x1f,
-    0x20,
-    0x91,
-    0x94,
-    0x7a,
-    0x2a,
-    0x60,
-    0x9e,
-    0x34,
-    0xb5,
-    0xd6,
-    0x38,
-    0xae,
-    0xad,
-    0xfd,
-    0xd7,
-    0xda,
-    0x4c,
-    0xf7,
-    0x9e,
-    0x9f,
-    0xec,
-    0x8a,
-    0xd2,
-    0x7f,
-    0x19,
-    0xdc,
-    0x8f,
-    0x77,
-    0xeb,
-    0x7a,
-    0xb9,
-    0x26,
-    0x92,
-    0x9f,
-    0x34,
-    0x32,
-    0x33,
-    0xb4,
-    0x58,
-    0xe8,
-    0xf3,
-    0x13,
-    0x9f,
-    0x22,
-    0x51,
-    0x10,
-    0xa1,
-    0x6e,
-    0xb8,
-    0x3a,
-    0x43,
-    0x6c,
-    0x54,
-    0xde,
-    0x2b,
-    0x78,
-    0x26,
-    0xcd,
-    0x77,
-    0x89,
-    0x53,
-    0x5f,
-    0xae,
-    0x59,
-    0xc2,
-    0xb8,
-    0xf6,
-    0xc7,
-    0xe5,
-    0x4a,
-    0x88,
-    0x79,
-    0xd7,
-    0x9b,
-    0x62,
-    0xc5,
-    0xa8,
-    0x49,
-    0x3b,
-    0xd2,
-    0xf5,
-    0x4b,
-    0xbc,
-    0xfa,
-    0xbb,
-    0x79,
-    0xed,
-    0x73,
-    0x6c,
-    0x4f,
-    0xee,
-    0x2f,
-    0x43,
-    0xee,
-    0xe7,
-    0x00,
-    0xd5,
-    0x63,
-    0x41,
-    0x00,
-    0xea,
-    0x2c,
-    0x17,
-    0x30,
-    0x8a,
-    0xf8,
-    0xe7,
-    0x5f,
-    0x5b,
-    0xaf,
-    0x8e,
-    0x4e,
-    0x2a,
-    0xb2,
-    0x73,
-    0x11,
-    0xc7,
-    0x64,
-    0x02,
-    0xb8,
-    0x16,
-    0xe9,
-    0x5c,
-    0x2f,
-    0x63,
-    0x2e,
-    0x4c,
-    0x63,
-    0xf6,
-    0x29,
-    0x7e,
-    0xa6,
-    0xe7,
-    0x62,
-    0xeb,
-    0x55,
-    0x34,
-    0xb2,
-    0x98,
-    0xb8,
-    0x11,
-    0x4a,
-    0x80,
-    0x29,
-    0x7f,
-    0xf8,
-    0xce,
-    0x79,
-    0x20,
-    0xa6,
-    0x50,
-    0x8f,
-    0x4a,
-    0x24,
-    0x29,
-    0x52,
-    0x5a,
-    0x27,
-    0xc6,
-    0xca,
-    0x4b,
-    0x91,
-    0x13,
-    0x81,
-    0x87,
-    0xf2,
-    0xee,
-    0x30,
-    0xfc,
-    0x4f,
-    0xdc,
-    0x97,
-    0x73,
-    0x23,
-    0xfa,
-    0xad,
-    0x1d,
-    0xa4,
-    0x37,
-    0xf9,
-    0x6f,
-    0x47,
-    0xc1,
-    0x40,
-    0x30,
-    0x86,
-    0xbd,
-    0x60,
-    0xd1,
-    0xe1,
-    0x3b,
-    0x7c,
-    0xfc,
-    0x23,
-    0x69,
-    0x59,
-    0x6f,
-    0xe6,
-    0x06,
-    0x08,
-    0x0b,
-    0x59,
-    0x1a,
-    0xc6,
-    0x28,
-    0x41,
-    0xe5,
-    0x20,
-    0x2c,
-    0x3e,
-    0x15,
-    0x5b,
-    0x5c,
-    0x50,
-    0x3c,
-    0x12,
-    0xf2,
-    0x99,
-    0x80,
-    0x21,
-    0x6f,
-    0x65,
-    0x95,
-    0xc2,
-    0x32,
-    0x67,
-    0xe8,
-    0xf6,
-    0x4a,
-    0x45,
-    0x1d,
-    0x27,
-    0x89,
-    0x58,
-    0xbc,
-    0x0b,
-    0xd9,
-    0xad,
-    0x27,
-    0xcb,
-    0xd3,
-    0x4f,
-    0xd0,
-    0x65,
-    0x8e,
-    0xc8,
-    0xa8,
-    0x4f,
-    0xb5,
-    0xe5,
-    0xdb,
-    0x5d,
-    0xdd,
-    0xba,
-    0xba,
-    0xe4,
-    0x15,
-    0xe6,
-    0xf8,
-    0x20,
-    0xbe,
-    0x18,
-    0x1a,
-    0xd3,
-    0x9d,
-    0xd2,
-    0x29,
-    0x2f,
-    0x2e,
-    0x6d,
-    0xaa,
-    0xf6,
-    0x3b,
-    0x5e,
-    0xd0,
-    0xe0,
-    0xae,
-    0xb7,
-    0xef,
-    0x3d,
-    0xa4,
-    0xf1,
-    0x34,
-    0xdb,
-    0xc2,
-    0xe8,
-    0x94,
-    0x2a,
-    0xcc,
-    0x27,
-    0x02,
-    0x9e,
-    0x73,
-    0x66,
-    0xe5,
-    0x55,
-    0x6f,
-    0x51,
-    0xc9,
-    0xfa,
-    0xce,
-    0x8b,
-    0x54,
-    0xe9,
-    0x8c,
-    0xf3,
-    0x7c,
-    0x93,
-    0x63,
-    0x26,
-    0xf8,
-    0x24,
-    0xe4,
-    0x45,
-    0xf4,
-    0x64,
-    0xc7,
-    0xf8,
-    0x09,
-    0xdb,
-    0x80,
-    0xb2,
-    0x6c,
-    0x39,
-    0x13,
-    0x37,
-    0x66,
-    0xf5,
-    0x28,
-    0x5c,
-    0x04,
-    0x33,
-    0x62,
-    0x0e,
-    0x0f,
-    0xeb,
-    0xed,
-    0x96,
-    0x3e,
-    0x48,
-    0x56,
-    0x1b,
-    0xab,
-    0x4e,
-    0xa0,
-    0x69,
-    0x84,
-    0xc0,
-    0x94,
-    0xf1,
-    0x03,
-    0x41,
-    0x58,
-    0x10,
-    0xa0,
-    0xb9,
-    0x43,
-    0x94,
-    0x85,
-    0xfa,
-    0xf0,
-    0x7c,
-    0x42,
-    0xa4,
-    0x91,
-    0xff,
-    0xc2,
-    0x45,
-    0x86,
-    0xd0,
-    0x7d,
-    0xc5,
-    0x2f,
-    0xa1,
-    0xf0,
-    0x02,
-    0xfe,
-    0xe6,
-    0x4a,
-    0xb7,
-    0xd0,
-    0xdb,
-    0x69,
-    0xa2,
-    0x7d,
-    0xc8,
-    0x04,
-    0xe6,
-    0xad,
-    0x83,
-    0x2a,
-    0xae,
-    0xee,
-    0x37,
-    0xeb,
-    0x13,
-    0x04,
-    0x65,
-    0x55,
-    0x40,
-    0x80,
-    0x28,
-    0xa2,
-    0xd3,
-    0x95,
-    0xbd,
-    0xaf,
-    0x87,
-    0x26,
-    0x42,
-    0xb0,
-    0x10,
-    0x23,
-    0xbe,
-    0x23,
-    0x47,
-    0x16,
-    0x62,
-    0x02,
-    0x87,
-    0xf9,
-    0x0f,
-    0x3d,
-    0x57,
-    0x4b,
-    0x18,
-    0x67,
-    0x49,
-    0x63,
-    0x48,
-    0xaf,
-    0x22,
-    0x03,
-    0x27,
-    0x13,
-    0x3a,
-    0x30,
-    0x79,
-    0xd0,
-    0x26,
-    0x41,
-    0x08,
-    0x1d,
-    0x95,
-    0x37,
-    0xa3,
-    0x18,
-    0x78,
-    0x4c,
-    0x67,
-    0x01,
-    0x66,
-    0xcf,
-    0x3d,
-    0xa6,
-    0x3e,
-    0x2e,
-    0xa4,
-    0x1e,
-    0x0e,
-    0x55,
-    0xb1,
-    0xba,
-    0x33,
-    0x36,
-    0x53,
-    0x39,
-    0xc2,
-    0xa9,
-    0xdc,
-    0x3b,
-    0x27,
-    0x77,
-    0xbd,
-    0xf9,
-    0x0c,
-    0xb1,
-    0x91,
-    0x32,
-    0x7d,
-    0x47,
-    0x5e,
-    0x69,
-    0x49,
-    0xd5,
-    0x17,
-    0x4d,
-    0xab,
-    0xc0,
-    0x65,
-    0x79,
-    0x29,
-    0x82,
-    0xa6,
-    0x5d,
-    0xbd,
-    0x42,
-    0x37,
-    0x7c,
-    0x33,
-    0xa8,
-    0xee,
-    0xd9,
-    0xd2,
-    0xef,
-    0xeb,
-    0xab,
-    0x3e,
-    0x3c,
-    0x91,
-    0x58,
-    0x9d,
-    0x2e,
-    0xcf,
-    0xa1,
-    0xf9,
-    0xb6,
-    0xa4,
-    0x1a,
-    0xe5,
-    0x29,
-    0xe2,
-    0xde,
-    0x64,
-    0x93,
-    0x32,
-    0x80,
-    0x06,
-    0x4f,
-    0x58,
-    0x45,
-    0x54,
-    0xd4,
-    0xb8,
-    0x90,
-    0x6e,
-    0xd2,
-    0x19,
-    0x9d,
-    0xf3,
-    0x7e,
-    0xaa,
-    0x72,
-    0x21,
-    0x29,
-    0x42,
-    0x13,
-    0x3e,
-    0x18,
-    0xec,
-    0xf6,
-    0x36,
-    0x90,
-    0xa3,
-    0xb6,
-    0x85,
-    0x30,
-    0x5a,
-    0x0b,
-    0x57,
-    0x84,
-    0x40,
-    0xfa,
-    0xee,
-    0xd6,
-    0x41,
-    0x49,
-    0x45,
-    0x47,
-    0xd0,
-    0x36,
-    0xf3,
-    0x1f,
-    0xe4,
-    0x69,
-    0x51,
-    0x62,
-    0x40,
-    0x26,
-    0xdf,
-    0xa4,
-    0xf8,
-    0xc7,
-    0xe4,
-    0x1d,
-    0x31,
-    0x6a,
-    0x55,
-    0x00,
-    0x28,
-    0xe7,
-    0xf8,
-    0x09,
-    0x76,
-    0x05,
-    0xc9,
-    0x55,
-    0x92,
-    0xed,
-    0x9d,
-    0x77,
-    0x97,
-    0xde,
-    0x05,
-    0xc8,
-    0x47,
-    0x23,
-    0x75,
-    0xfe,
-    0x50,
-    0x42,
-    0xa6,
-    0x01,
-    0xcf,
-    0x77,
-    0x38,
-    0xfa,
-    0x13,
-    0x60,
-    0x9c,
-    0xac,
-    0xa3,
-    0xfa,
-    0x31,
-    0x07,
-    0x82,
-    0xcc,
-    0xad,
-    0xfa,
-    0xb1,
-    0x62,
-    0xbf,
-    0x8a,
-    0xf6,
-    0xfd,
-    0xf3,
-    0x21,
-    0xdc,
-    0x89,
-    0xd5,
-    0x28,
-    0xfb,
-    0xcf,
-    0x59,
-    0xd7,
-    0x79,
-    0xec,
-    0x7a,
-    0x4c,
-    0xd1,
-    0x02,
-    0x22,
-    0xdb,
-    0xd3,
-    0x2d,
-    0x4a,
-    0xa6,
-    0xed,
-    0xb9,
-    0x62,
-    0x6d,
-    0xa8,
-    0x92,
-    0xf3,
-    0xa7,
-    0x75,
-    0xfb,
-    0x83,
-    0xd1,
-    0xaa,
-    0x83,
-    0xb9,
-    0x06,
-    0xc8,
-    0x35,
-    0xc1,
-    0xd0,
-    0xff,
-    0x10,
-    0xf2,
-    0x3e,
-    0xf4,
-    0xb7,
-    0xae,
-    0x36,
-    0xc1,
-    0x69,
-    0x8a,
-    0x0d,
-    0x3d,
-    0x32,
-    0xaf,
-    0x55,
-    0x7f,
-    0x63,
-    0x81,
-    0xf6,
-    0x9d,
-    0x41,
-    0x7e,
-    0x81,
-    0xb9,
-    0xfa,
-    0x68,
-    0xc0,
-    0x3f,
-    0xdd,
-    0xa6,
-    0x92,
-    0x68,
-    0xc9,
-    0xe8,
-    0xf5,
-    0x03,
-    0xe6,
-    0x0a,
-    0x65,
-    0x74,
-    0x94,
-    0x3b,
-    0x65,
-    0xfd,
-    0xa1,
-    0x5e,
-    0x5b,
-    0x3c,
-    0xbf,
-    0xb0,
-    0xa0,
-    0xf5,
-    0x35,
-    0xab,
-    0xd8,
-    0x12,
-    0xd4,
-    0x2b,
-    0x7f,
-    0xe8,
-    0x2d,
-    0xd0,
-    0xc5,
-    0xbc,
-    0x01,
-    0xa3,
-    0x9c,
-    0x86,
-    0xf9,
-    0xfc,
-    0x0f,
-    0xf4,
-    0x97,
-    0xa3,
-    0xd5,
-    0xb2,
-    0x6d,
-    0x35,
-    0x26,
-    0xe9,
-    0x8d,
-    0xc9,
-    0xcd,
-    0x06,
-    0x40,
-    0xd4,
-    0x7f,
-    0xbc,
-    0xfb,
-    0x4a,
-    0x6b,
-    0x4c,
-    0x8e,
-    0x06,
-    0x12,
-    0x04,
-    0x9f,
-    0x6c,
-    0x59,
-    0x05,
-    0x57,
-    0x4d,
-    0xdc,
-    0x4a,
-    0x5b,
-    0x0a,
-    0x86,
-    0xe6,
-    0xfe,
-    0xfd,
-    0x5f,
-    0x8d,
-    0xb5,
-    0x14,
-    0xa4,
-    0x56,
-    0xcb,
-    0xbf,
-    0x1d,
-    0xbf,
-    0x55,
-    0x0d,
-    0xab,
-    0xf2,
-    0x69,
-    0x12,
-    0x21,
-    0x47,
-    0x8b,
-    0x8b,
-    0x54,
-    0x09,
-    0x68,
-    0xc5,
-    0x76,
-    0x7d,
-    0xc7,
-    0xba,
-    0x9f,
-    0x20,
-    0xbc,
-    0x7d,
-    0xad,
-    0x31,
-    0x1e,
-    0xd9,
-    0x4e,
-    0x6f,
-    0x3c,
-    0x35,
-    0x5b,
-    0x24,
-    0xcc,
-    0xbb,
-    0x68,
-    0x62,
-    0x24,
-    0xba,
-    0x99,
-    0x8d,
-    0xad,
-    0x48,
-    0xb7,
-    0x19,
-    0x94,
-    0x2b,
-    0x82,
-    0x95,
-    0xc2,
-    0xfa,
-    0x49,
-    0xe9,
-    0x0f,
-    0x7f,
-    0xb9,
-    0xdc,
-    0xb2,
-    0x60,
-    0xf3,
-    0xd9,
-    0xfc,
-    0xfe,
-    0xe1,
-    0xf2,
-    0x47,
-    0x9e,
-    0xc9,
-    0x25,
-    0x29,
-    0xc7,
-    0x22,
-    0xde,
-    0xed,
-    0xea,
-    0xa7,
-    0xbe,
-    0x43,
-    0x49,
-    0xab,
-    0x9b,
-    0x36,
-    0x11,
-    0xac,
-    0xc8,
-    0x5f,
-    0xc9,
-    0x2a,
-    0x96,
-    0x58,
-    0xf0,
-    0xb9,
-    0x1a,
-    0x74,
-    0xe2,
-    0x56,
-    0x31,
-    0xad,
-    0xfc,
-    0xf7,
-    0xc2,
-    0xde,
-    0x00,
-    0x66,
-    0x43,
-    0x33,
-    0xbb,
-    0x4e,
-    0x7f,
-    0xdd,
-    0xe5,
-    0x96,
-    0x96,
-    0x0a,
-    0x48,
-    0xef,
-    0x45,
-    0x14,
-    0x25,
-    0xa9,
-    0x67,
-    0xf8,
-    0xd3,
-    0xcb,
-    0xbc,
-    0x0b,
-    0xa9,
-    0x62,
-    0xea,
-    0xe8,
-    0x1e,
-    0x19,
-    0xc1,
-    0xad,
-    0x2f,
-    0x0a,
-    0xc3,
-    0x67,
-    0x01,
-    0xd4,
-    0xe4,
-    0xca,
-    0xc8,
-    0xee,
-    0x8e,
-    0x26,
-    0xe7,
-    0x3b,
-    0xe8,
-    0x96,
-    0x59,
-    0xde,
-    0x58,
-    0x7b,
-    0x4f,
-    0x4f,
-    0x47,
-    0x28,
-    0x1a,
-    0xae,
-    0x24,
-    0xdf,
-    0x4c,
-    0x58,
-    0xab,
-    0xfd,
-    0x1a,
-    0xb9,
-    0x67,
-    0x71,
-    0x05,
-    0x61,
-    0x75,
-    0x72,
-    0xba,
-    0x59,
-    0x8c,
-    0x72,
-    0x36,
-    0xb7,
-    0x3a,
-    0x4d,
-    0x2d,
-    0x70,
-    0x70,
-    0xc7,
-    0xad,
-    0x6e,
-    0x41,
-    0x35,
-    0xff,
-    0xe2,
-    0xe7,
-    0x7a,
-    0xce,
-    0xdc,
-    0x07,
-    0x35,
-    0x8a,
-    0x19,
-    0x36,
-    0x39,
-    0x0f,
-    0x1b,
-    0xbb,
-    0x3e,
-    0x82,
-    0x7f,
-    0x96,
-    0xd6,
-    0x7c,
-    0x8c,
-    0xc2,
-    0xa2,
-    0x6b,
-    0x08,
-    0xb8,
-    0xc5,
-    0x35,
-    0x4f,
-    0x34,
-    0x99,
-    0x1e,
-    0xa6,
-    0x3b,
-    0xa1,
-    0xeb,
-    0xcc,
-    0x5d,
-    0xbf,
-    0x47,
-    0xd2,
-    0x38,
-    0xa7,
-    0x67,
-    0x2d,
-    0x3d,
-    0x94,
-    0xea,
-    0x0a,
-    0xb7,
-    0x3a,
-    0x03,
-    0xe1,
-    0x08,
-    0xfb,
-    0xd9,
-    0x4d,
-    0x36,
-    0x5d,
-    0x2e,
-    0x1b,
-    0xa7,
-    0xbc,
-    0x3f,
-    0xa0,
-    0x29,
-    0x3c,
-    0xec,
-    0x50,
-    0x36,
-    0x02,
-    0x19,
-    0x8d,
-    0x75,
-    0xa4,
-    0x54,
-    0xbd,
-    0x83,
-    0xdd,
-    0xb8,
-    0x9f,
-    0xf4,
-    0x86,
-    0x11,
-    0xdf,
-    0x95,
-    0xc1,
-    0x41,
-    0xe8,
-    0xf4,
-    0x78,
-    0xe2,
-    0xf9,
-    0x23,
-    0x06,
-    0x2c,
-    0x7b,
-    0xb8,
-    0x33,
-    0x19,
-    0x92,
-    0x18,
-    0x66,
-    0xc8,
-    0xf2,
-    0xf6,
-    0x16,
-    0x1f,
-    0xf4,
-    0x16,
-    0x82,
-    0xb5,
-    0xe8,
-    0x57,
-    0xa2,
-    0xef,
-    0xad,
-    0xf0,
-    0x5d,
-    0x69,
-    0x80,
-    0xfa,
-    0xfc,
-    0x97,
-    0x12,
-    0x2f,
-    0xdf,
-    0xac,
-    0xdd,
-    0xf1,
-    0x6e,
-    0xba,
-    0xb7,
-    0x8e,
-    0x53,
-    0x1b,
-    0xa8,
-    0xc2,
-    0xe7,
-    0x11,
-    0xf9,
-    0x7d,
-    0xe9,
-    0xa9,
-    0x8d,
-    0xe7,
-    0x76,
-    0xe5,
-    0x75,
-    0xa1,
-    0x35,
-    0x19,
-    0xbe,
-    0x4e,
-    0xd3,
-    0x96,
-    0x8d,
-    0x53,
-    0xaf,
-    0x86,
-    0x6f,
-    0xda,
-    0xd6,
-    0x17,
-    0xea,
-    0x1d,
-    0x31,
-    0xdc,
-    0x58,
-    0xe1,
-    0xfd,
-    0x70,
-    0xf5,
-    0x40,
-    0x7c,
-    0x5c,
-    0x36,
-    0xac,
-    0xea,
-    0x3a,
-    0x5c,
-    0x31,
-    0xb3,
-    0x1b,
-    0x4a,
-    0xfa,
-    0xe3,
-    0x27,
-    0x93,
-    0x17,
-    0xde,
-    0x83,
-    0xd8,
-    0x7e,
-    0x51,
-    0x78,
-    0x51,
-    0x4f,
-    0x68,
-    0xd1,
-    0xa9,
-    0x5c,
-    0x42,
-    0x84,
-    0x0f,
-    0xe8,
-    0xa2,
-    0x95,
-    0x8a,
-    0xaf,
-    0xe7,
-    0x38,
-    0x8c,
-    0x27,
-    0x3e,
-    0x36,
-    0xcb,
-    0x06,
-    0x16,
-    0x91,
-    0x4c,
-    0x04,
-    0xd4,
-    0x6b,
-    0xc0,
-    0xe2,
-    0xc8,
-    0x24,
-    0x14,
-    0xab,
-    0x60,
-    0xc3,
-    0x44,
-    0x3a,
-    0x9c,
-    0x97,
-    0x70,
-    0xfc,
-    0xc2,
-    0x1e,
-    0x31,
-    0xf7,
-    0x53,
-    0x25,
-    0x2d,
-    0x0b,
-    0x3d,
-    0x31,
-    0xe9,
-    0x78,
-    0x52,
-    0x1e,
-    0xdf,
-    0xa1,
-    0xf9,
-    0x06,
-    0xd1,
-    0x10,
-    0x24,
-    0x64,
-    0x5c,
-    0xb9,
-    0x82,
-    0x79,
-    0xd0,
-    0x83,
-    0xf5,
-    0xef,
-    0x3f,
-    0x04,
-    0x46,
-    0xbd,
-    0xd4,
-    0x8c,
-    0x18,
-    0x4a,
-    0x66,
-    0x66,
-    0x1a,
-    0xd5,
-    0x4d,
-    0x5a,
-    0x81,
-    0x14,
-    0x75,
-    0x76,
-    0xb6,
-    0x1b,
-    0xb1,
-    0x0f,
-    0x4b,
-    0x80,
-    0x51,
-    0x02,
-    0x34,
-    0xbd,
-    0xf6,
-    0x3f,
-    0x34,
-    0xd5,
-    0xa5,
-    0x89,
-    0x95,
-    0x3b,
-    0x1b,
-    0x77,
-    0x1c,
-    0xef,
-    0x60,
-    0xbf,
-    0x3c,
-    0xea,
-    0x9f,
-    0xb3,
-    0x8a,
-    0xbc,
-    0x35,
-    0x0c,
-    0x71,
-    0x74,
-    0x08,
-    0xe7,
-    0x27,
-    0xc0,
-    0x1a,
-    0x0d,
-    0xdf,
-    0x55,
-    0x5e,
-    0x77,
-    0x41,
-    0x91,
-    0xca,
-    0x12,
-    0x17,
-    0x5f,
-    0xad,
-    0xbf,
-    0x49,
-    0x5c,
-    0x43,
-    0x9e,
-    0x0b,
-    0x38,
-    0x86,
-    0x8c,
-    0x55,
-    0x5e,
-    0x48,
-    0xea,
-    0x93,
-    0xd7,
-    0x7f,
-    0xa1,
-    0x9f,
-    0x6b,
-    0xe0,
-    0x62,
-    0xec,
-    0x0a,
-    0xaf,
-    0x33,
-    0x04,
-    0x6b,
-    0xd5,
-    0x27,
-    0x34,
-    0xf3,
-    0x33,
-    0x6c,
-    0x85,
-    0xd8,
-    0x36,
-    0x8b,
-    0xef,
-    0x86,
-    0xab,
-    0xec,
-    0xca,
-    0x42,
-    0xd5,
-    0x99,
-    0x85,
-    0x0d,
-    0xbd,
-    0x43,
-    0x9a,
-    0xcb,
-    0xca,
-    0x8a,
-    0xc1,
-    0xa4,
-    0x91,
-    0x79,
-    0x65,
-    0xab,
-    0xee,
-    0x50,
-    0x54,
-    0xbd,
-    0x54,
-    0x87,
-    0xba,
-    0xac,
-    0x61,
-    0x0f,
-    0x50,
-    0x9d,
-    0xb6,
-    0xdb,
-    0xd1,
-    0xaf,
-    0x05,
-    0x9f,
-    0xae,
-    0xde,
-    0x6b,
-    0xd8,
-    0x02,
-    0x26,
-    0x01,
-    0x0c,
-    0xc8,
-    0xeb,
-    0xae,
-    0x53,
-    0x4c,
-    0x98,
-    0x3f,
-    0x16,
-    0xdf,
-    0x87,
-    0xb9,
-    0x17,
-    0xcf,
-    0x21,
-    0xed,
-    0xb1,
-    0x96,
-    0x46,
-    0x4e,
-    0x62,
-    0x52,
-    0xef,
-    0x00,
-    0x86,
-    0x75,
-    0x11,
-    0x31,
-    0x65,
-    0xbe,
-    0xc5,
-    0xac,
-    0x70,
-    0x68,
-    0xa7,
-    0xab,
-    0xc8,
-    0xa1,
-    0x7b,
-    0xed,
-    0x00,
-    0x3d,
-    0x17,
-    0x09,
-    0x24,
-    0xac,
-    0x7d,
-    0x02,
-    0xfa,
-    0x29,
-    0x47,
-    0x1b,
-    0x87,
-    0x35,
-    0x48,
-    0xed,
-    0xd5,
-    0x44,
-    0x70,
-    0xb6,
-    0xf4,
-    0xb6,
-    0xf0,
-    0xf4,
-    0x3f,
-    0x08,
-    0x9f,
-    0x33,
-    0xe0,
-    0x4c,
-    0x9c,
-    0x23,
-    0x97,
-    0xd6,
-    0x35,
-    0xed,
-    0xb7,
-    0x39,
-    0x08,
-    0xc7,
-    0x71,
-    0x72,
-    0x68,
-    0xc7,
-    0x54,
-    0x62,
-    0x03,
-    0xf4,
-    0x15,
-    0x82,
-    0xc1,
-    0xa3,
-    0x8c,
-    0xd2,
-    0xef,
-    0x01,
-    0x00,
-    0x12,
-    0x9c,
-    0xec,
-    0xa4,
-    0x35,
-    0x43,
-    0x07,
-    0x61,
-    0x13,
-    0xab,
-    0x0d,
-    0xd6,
-    0x5e,
-    0x0c,
-    0x65,
-    0x9e,
-    0xd7,
-    0x73,
-    0xf7,
-    0xd1,
-    0xc1,
-    0x67,
-    0x3f,
-    0xcd,
-    0x96,
-    0xcd,
-    0x9f,
-    0x36,
-    0xfa,
-    0x09,
-    0xfa,
-    0x3b,
-    0xed,
-    0x66,
-    0x7e,
-    0x1b,
-    0x44,
-    0xb8,
-    0xc1,
-    0xe8,
-    0x5a,
-    0x40,
-    0x10,
-    0x8c,
-    0x03,
-    0xcf,
-    0x04,
-    0x09,
-    0xc1,
-    0x2e,
-    0x55,
-    0x05,
-    0x3b,
-    0xbe,
-    0xf3,
-    0x85,
-    0xea,
-    0x5c,
-    0x53,
-    0xf9,
-    0x16,
-    0x87,
-    0x07,
-    0x79,
-    0x01,
-    0xc5,
-    0x92,
-    0x4e,
-    0x62,
-    0x42,
-    0x7a,
-    0xb4,
-    0x14,
-    0xbb,
-    0x9f,
-    0xde,
-    0x10,
-    0x9a,
-    0xca,
-    0x3b,
-    0x99,
-    0x63,
-    0x89,
-    0xf8,
-    0xb6,
-    0x4e,
-    0x3b,
-    0xc6,
-    0xe5,
-    0x36,
-    0x67,
-    0xdd,
-    0x0e,
-    0xb1,
-    0x52,
-    0x40,
-    0xb6,
-    0x81,
-    0xd0,
-    0x43,
-    0x75,
-    0x2b,
-    0x5a,
-    0x4b,
-    0xaa,
-    0xe5,
-    0x61,
-    0xd6,
-    0x6d,
-    0xb5,
-    0xe2,
-    0xbb,
-    0xc5,
-    0xd8,
-    0x3b,
-    0xb2,
-    0x1b,
-    0x61,
-    0x3d,
-    0x16,
-    0xef,
-    0x22,
-    0x82,
-    0xea,
-    0xca,
-    0xcf,
-    0x00,
-    0x1b,
-    0x74,
-    0x61,
-    0xdf,
-    0x04,
-    0x66,
-    0xb9,
-    0x88,
-    0x37,
-    0x82,
-    0x86,
-    0xff,
-    0x7b,
-    0x02,
-    0x68,
-    0x72,
-    0x11,
-    0xaf,
-    0x56,
-    0x12,
-    0x3c,
-    0x53,
-    0x3d,
-    0x21,
-    0x00,
-    0x70,
-    0xe9,
-    0x4c,
-    0x29,
-    0x32,
-    0x29,
-    0x3c,
-    0x8f,
-    0xa3,
-    0x2e,
-    0x68,
-    0x99,
-    0x1e,
-    0x35,
-    0x2d,
-    0x00,
-    0x06,
-    0x66,
-    0x20,
-    0xd5,
-    0xb7,
-    0xfb,
-    0xa3,
-    0xc6,
-    0xbd,
-    0xa4,
-    0xb6,
-    0x9d,
-    0x45,
-    0x2a,
-    0x10,
-    0x09,
-    0xd0,
-    0x53,
-    0x6f,
-    0xa1,
-    0x2f,
-    0x07,
-    0x2c,
-    0x26,
-    0xab,
-    0xb0,
-    0x12,
-    0x08,
-    0x84,
-    0xe7,
-    0x70,
-    0x2c,
-    0x9d,
-    0x4c,
-    0x6d,
-    0xed,
-    0x75,
-    0xb5,
-    0x9c,
-    0x61,
-    0x59,
-    0x8c,
-    0xd0,
-    0xdd,
-    0xd8,
-    0x72,
-    0x32,
-    0xbb,
-    0x78,
-    0x28,
-    0x90,
-    0x5a,
-    0xa7,
-    0xb0,
-    0xf8,
-    0x67,
-    0xf4,
-    0xaf,
-    0x86,
-    0x5b,
-    0x7f,
-    0x16,
-    0x7a,
-    0x45,
-    0xae,
-    0x01,
-    0x8d,
-    0xca,
-    0x22,
-    0xe0,
-    0x86,
-    0x6a,
-    0xea,
-    0xd4,
-    0x08,
-    0x05,
-    0xf6,
-    0x5c,
-    0xae,
-    0x9d,
-    0xce,
-    0x30,
-    0x5a,
-    0x5d,
-    0x84,
-    0x6d,
-    0xc9,
-    0xda,
-    0xe6,
-    0xf3,
-    0x6b,
-    0x9a,
-    0xf9,
-    0x0b,
-    0x72,
-    0xd3,
-    0xa3,
-    0x4e,
-    0x29,
-    0x74,
-    0xa8,
-    0xc2,
-    0x88,
-    0x69,
-    0xd8,
-    0x45,
-    0x05,
-    0x1b,
-    0x86,
-    0x2f,
-    0xac,
-    0x37,
-    0x3b,
-    0x33,
-    0x72,
-    0xb1,
-    0xac,
-    0x86,
-    0xc7,
-    0x08,
-    0xea,
-    0x43,
-    0x6a,
-    0xcb,
-    0xd9,
-    0x0f,
-    0x81,
-    0x5c,
-    0xe3,
-    0xf9,
-    0xe9,
-    0xf4,
-    0xed,
-    0xa3,
-    0xcb,
-    0xe7,
-    0x8a,
-    0xa7,
-    0x70,
-    0x2a,
-    0x6f,
-    0x34,
-    0x56,
-    0x12,
-    0x28,
-    0xf8,
-    0x83,
-    0x5e,
-    0x09,
-    0x43,
-    0x19,
-    0x78,
-    0x66,
-    0x69,
-    0x2b,
-    0xf8,
-    0x07,
-    0x68,
-    0xcf,
-    0x6a,
-    0xd6,
-    0xca,
-    0x74,
-    0x51,
-    0xdb,
-    0xcd,
-    0x76,
-    0x6c,
-    0x6a,
-    0xc2,
-    0xf0,
-    0x37,
-    0x9b,
-    0xb3,
-    0xd2,
-    0xb5,
-    0xfb,
-    0x48,
-    0x33,
-    0x6d,
-    0x81,
-    0xeb,
-    0xe8,
-    0xb2,
-    0xc4,
-    0x2b,
-    0x55,
-    0x28,
-    0x6a,
-    0x5e,
-    0x83,
-    0x84,
-    0xe4,
-    0x8b,
-    0x73,
-    0x93,
-    0x59,
-    0x87,
-    0xb2,
-    0x7e,
-    0xdf,
-    0x5d,
-    0x2e,
-    0x4c,
-    0xf1,
-    0xf3,
-    0x48,
-    0xa8,
-    0x1e,
-    0xeb,
-    0x2a,
-    0xe5,
-    0xfe,
-    0xc8,
-    0x5b,
-    0x3f,
-    0x6a,
-    0x52,
-    0x90,
-    0x64,
-    0xec,
-    0x3b,
-    0xc6,
-    0x33,
-    0x75,
-    0x02,
-    0x8d,
-    0xc3,
-    0x4e,
-    0x18,
-    0xa7,
-    0xa7,
-    0x51,
-    0x42,
-    0xd1,
-    0x70,
-    0x59,
-    0x3e,
-    0xe1,
-    0x74,
-    0xf7,
-    0xa9,
-    0x11,
-    0xce,
-    0x67,
-    0x20,
-    0x9b,
-    0xa6,
-    0xc2,
-    0xa6,
-    0x86,
-    0xb3,
-    0x74,
-    0x45,
-    0xbf,
-    0xfd,
-    0xf1,
-    0xf8,
-    0x6b,
-    0xe8,
-    0xa4,
-    0xc9,
-    0x7c,
-    0x6e,
-    0x28,
-    0x37,
-    0x82,
-    0xac,
-    0xbb,
-    0xda,
-    0xc4,
-    0xa0,
-    0xf0,
-    0x4a,
-    0x90,
-    0x31,
-    0xa4,
-    0x3c,
-    0xcf,
-    0x6f,
-    0x32,
-    0xee,
-    0xdc,
-    0x1d,
-    0xeb,
-    0xc6,
-    0x97,
-    0x6d,
-    0xc0,
-    0x36,
-    0xb5,
-    0x0a,
-    0x42,
-    0xe2,
-    0x5a,
-    0x5b,
-    0xcd,
-    0x05,
-    0xe9,
-    0x07,
-    0xff,
-    0x10,
-    0x1b,
-    0xb4,
-    0x6f,
-    0x95,
-    0x4e,
-    0x15,
-    0x9c,
-    0x64,
-    0x20,
-    0x23,
-    0x24,
-    0xf4,
-    0x3d,
-    0xaa,
-    0x37,
-    0x04,
-    0x75,
-    0x08,
-    0x4a,
-    0x81,
-    0x12,
-    0x31,
-    0x10,
-    0xab,
-    0x68,
-    0xf7,
-    0xa6,
-    0x74,
-    0xad,
-    0x89
-  ],
-  const [
-    0xb3,
-    0xf1,
-    0x97,
-    0xb9,
-    0x84,
-    0x41,
-    0xa1,
-    0xef,
-    0x2b,
-    0xb3,
-    0x53,
-    0xf6,
-    0xf7,
-    0xea,
-    0x1c,
-    0x97,
-    0x5d,
-    0x1b,
-    0xa5,
-    0xe6,
-    0xf5,
-    0x09,
-    0xfa,
-    0xcf,
-    0xc5,
-    0x33,
-    0xea,
-    0xf2,
-    0xc2,
-    0x4b,
-    0xb0,
-    0xb1,
-    0x94,
-    0xeb,
-    0xd3,
-    0x86,
-    0x9a,
-    0x84,
-    0x4a,
-    0x9a,
-    0x2e,
-    0x97,
-    0xe4,
-    0x94,
-    0x2a,
-    0x27,
-    0xe7,
-    0xaf,
-    0xaa,
-    0x6e,
-    0xf7,
-    0x10,
-    0x14,
-    0xcf,
-    0x3a,
-    0x56,
-    0x56,
-    0x0c,
-    0xba,
-    0x72,
-    0x6f,
-    0xb9,
-    0x0b,
-    0xb9,
-    0x31,
-    0xf0,
-    0x2d,
-    0x37,
-    0x45,
-    0x47,
-    0xb3,
-    0x47,
-    0x6f,
-    0xff,
-    0x25,
-    0x61,
-    0x13,
-    0x7e,
-    0xa4,
-    0x32,
-    0xf9,
-    0xff,
-    0xcc,
-    0xf2,
-    0x4d,
-    0x89,
-    0xdf,
-    0xf2,
-    0xea,
-    0x1d,
-    0x1f,
-    0x74,
-    0xd8,
-    0x34,
-    0x7b,
-    0xc0,
-    0x12,
-    0x69,
-    0x6e,
-    0x74,
-    0x8d,
-    0x72,
-    0x25,
-    0x1c,
-    0x77,
-    0x54,
-    0xe0,
-    0x02,
-    0xbc,
-    0xd7,
-    0x9a,
-    0x48,
-    0xcf,
-    0x38,
-    0xec,
-    0x33,
-    0xa7,
-    0x1f,
-    0x2f,
-    0xca,
-    0x08,
-    0xd0,
-    0xe1,
-    0xa0,
-    0x03,
-    0xa5,
-    0x49,
-    0xee,
-    0xc0,
-    0xbc,
-    0x5e,
-    0xe4,
-    0x7b,
-    0xed,
-    0xe6,
-    0x41,
-    0xcd,
-    0xff,
-    0xdb,
-    0x22,
-    0x2d,
-    0x1b,
-    0x12,
-    0x17,
-    0xb6,
-    0x80,
-    0x1f,
-    0x7c,
-    0x2b,
-    0x79,
-    0x73,
-    0x07,
-    0x38,
-    0x8c,
-    0xc7,
-    0x9d,
-    0xfa,
-    0xf5,
-    0xbe,
-    0x6a,
-    0xc2,
-    0x53,
-    0xc5,
-    0x30,
-    0x16,
-    0xa0,
-    0x3e,
-    0xdf,
-    0xf9,
-    0x66,
-    0xdf,
-    0x67,
-    0x6d,
-    0x30,
-    0x54,
-    0xca,
-    0x35,
-    0x3f,
-    0x2c,
-    0x75,
-    0xdf,
-    0x7f,
-    0xf2,
-    0xd0,
-    0x02,
-    0xba,
-    0x9a,
-    0x14,
-    0xc5,
-    0x0a,
-    0x20,
-    0x5d,
-    0xa0,
-    0x94,
-    0x6b,
-    0x00,
-    0x67,
-    0x73,
-    0x77,
-    0x1e,
-    0x84,
-    0xf3,
-    0xb3,
-    0x79,
-    0x83,
-    0x00,
-    0xa8,
-    0x87,
-    0xd5,
-    0xde,
-    0xdc,
-    0xc5,
-    0xcd,
-    0x1a,
-    0xf6,
-    0x4e,
-    0xef,
-    0xc0,
-    0x22,
-    0xac,
-    0x6a,
-    0xce,
-    0xb7,
-    0xee,
-    0xe3,
-    0xe9,
-    0x18,
-    0xfa,
-    0x74,
-    0x4f,
-    0xd8,
-    0x25,
-    0xf5,
-    0x0d,
-    0x21,
-    0x01,
-    0x7a,
-    0x72,
-    0x56,
-    0x76,
-    0x1c,
-    0xc3,
-    0xf7,
-    0x15,
-    0xfd,
-    0x30,
-    0xc5,
-    0xa8,
-    0x86,
-    0x07,
-    0x27,
-    0x0e,
-    0xf3,
-    0x28,
-    0xcd,
-    0x46,
-    0x12,
-    0xb9,
-    0x93,
-    0xc9,
-    0x47,
-    0x1a,
-    0xa8,
-    0x1d,
-    0xd4,
-    0x1b,
-    0xef,
-    0xa7,
-    0x57,
-    0x6d,
-    0xa5,
-    0xc1,
-    0x94,
-    0x57,
-    0x45,
-    0x0c,
-    0x75,
-    0xaa,
-    0xa8,
-    0x07,
-    0x4f,
-    0xf7,
-    0x71,
-    0xe1,
-    0x67,
-    0xff,
-    0xa8,
-    0x8c,
-    0xb5,
-    0x6b,
-    0xa5,
-    0x13,
-    0xe8,
-    0xbe,
-    0x30,
-    0x2d,
-    0xaa,
-    0x87,
-    0xe6,
-    0x12,
-    0x24,
-    0xdb,
-    0xdf,
-    0x8d,
-    0xc5,
-    0x02,
-    0x8d,
-    0x53,
-    0x3f,
-    0x71,
-    0xe7,
-    0x93,
-    0xd3,
-    0xf8,
-    0xc7,
-    0xce,
-    0xcf,
-    0x3d,
-    0x91,
-    0xe9,
-    0x55,
-    0x69,
-    0x16,
-    0x81,
-    0x5d,
-    0x21,
-    0xb8,
-    0x7e,
-    0xfd,
-    0xb8,
-    0xce,
-    0xeb,
-    0xe9,
-    0xa3,
-    0x4a,
-    0x05,
-    0x36,
-    0x2d,
-    0x99,
-    0x91,
-    0x63,
-    0x6c,
-    0xca,
-    0x73,
-    0x99,
-    0x73,
-    0xf3,
-    0x7d,
-    0x32,
-    0xc9,
-    0xd0,
-    0x85,
-    0x79,
-    0x1a,
-    0xae,
-    0xba,
-    0xb0,
-    0x2d,
-    0x87,
-    0x38,
-    0x58,
-    0x16,
-    0x6f,
-    0xd9,
-    0xac,
-    0xad,
-    0x2e,
-    0x4e,
-    0x6f,
-    0x3e,
-    0x2f,
-    0x6f,
-    0xe7,
-    0x82,
-    0x99,
-    0xd0,
-    0x2a,
-    0xce,
-    0xbb,
-    0x95,
-    0x98,
-    0x8b,
-    0xad,
-    0x87,
-    0xa9,
-    0xe6,
-    0x34,
-    0x67,
-    0xe9,
-    0xc8,
-    0xe7,
-    0x82,
-    0x40,
-    0x09,
-    0x90,
-    0x85,
-    0x77,
-    0xe1,
-    0xd5,
-    0x93,
-    0xf8,
-    0x9f,
-    0x18,
-    0x95,
-    0xd5,
-    0x9d,
-    0x9b,
-    0xd1,
-    0x0c,
-    0x73,
-    0xe8,
-    0xbf,
-    0x0a,
-    0x6b,
-    0x70,
-    0x17,
-    0x6d,
-    0x35,
-    0x72,
-    0x2f,
-    0x0e,
-    0xdc,
-    0x1e,
-    0x84,
-    0x3f,
-    0xf9,
-    0xfb,
-    0x96,
-    0x51,
-    0x27,
-    0x86,
-    0xfa,
-    0x5a,
-    0xb6,
-    0x1c,
-    0xaa,
-    0x34,
-    0xa4,
-    0x19,
-    0x9f,
-    0xc9,
-    0xc8,
-    0x42,
-    0xa2,
-    0x8e,
-    0x51,
-    0x60,
-    0x5f,
-    0x4e,
-    0x6f,
-    0x2e,
-    0xbb,
-    0x29,
-    0x50,
-    0x75,
-    0x67,
-    0xdc,
-    0x4e,
-    0x76,
-    0xb5,
-    0x43,
-    0x67,
-    0x88,
-    0xab,
-    0x1c,
-    0xed,
-    0x02,
-    0x57,
-    0x0d,
-    0x7e,
-    0x5b,
-    0x61,
-    0xe9,
-    0x37,
-    0x90,
-    0xe7,
-    0x2f,
-    0x25,
-    0xc6,
-    0x84,
-    0xd3,
-    0xfc,
-    0x31,
-    0xb2,
-    0x41,
-    0x0c,
-    0x34,
-    0x53,
-    0xa0,
-    0x70,
-    0xca,
-    0x8a,
-    0x53,
-    0x89,
-    0x24,
-    0xcf,
-    0xc6,
-    0xab,
-    0x94,
-    0x43,
-    0x67,
-    0x15,
-    0xa9,
-    0x40,
-    0xf2,
-    0x27,
-    0x9c,
-    0x35,
-    0xf2,
-    0xcf,
-    0xea,
-    0xb1,
-    0x85,
-    0x45,
-    0x43,
-    0xbd,
-    0x5f,
-    0xf8,
-    0xa3,
-    0x6f,
-    0x11,
-    0xc8,
-    0xbf,
-    0xbc,
-    0x8b,
-    0x75,
-    0xa2,
-    0x8e,
-    0xe0,
-    0x57,
-    0x98,
-    0x16,
-    0x4a,
-    0x50,
-    0x4b,
-    0x64,
-    0x6e,
-    0x00,
-    0x2c,
-    0x35,
-    0xe1,
-    0x37,
-    0x14,
-    0x0c,
-    0xea,
-    0xb0,
-    0x2b,
-    0x84,
-    0x8a,
-    0xfc,
-    0x0a,
-    0xe4,
-    0xb9,
-    0xbc,
-    0x1c,
-    0xf4,
-    0xf3,
-    0x13,
-    0x4a,
-    0x0f,
-    0xf3,
-    0x5b,
-    0xd7,
-    0x7a,
-    0xbf,
-    0x17,
-    0x88,
-    0xf4,
-    0xe4,
-    0x29,
-    0x09,
-    0x8e,
-    0x03,
-    0x46,
-    0x8c,
-    0xbd,
-    0x8c,
-    0xa6,
-    0xb3,
-    0xae,
-    0xca,
-    0x00,
-    0xb0,
-    0xd9,
-    0x20,
-    0xb5,
-    0xab,
-    0xd9,
-    0x92,
-    0x4c,
-    0x63,
-    0x7b,
-    0x86,
-    0x1e,
-    0x19,
-    0x15,
-    0xcc,
-    0x52,
-    0xaa,
-    0x19,
-    0xdd,
-    0x0c,
-    0xfb,
-    0xe9,
-    0x60,
-    0xe2,
-    0x99,
-    0xed,
-    0xf3,
-    0x90,
-    0xa1,
-    0xe4,
-    0x27,
-    0xec,
-    0xde,
-    0x77,
-    0xcc,
-    0x1c,
-    0x32,
-    0x14,
-    0x70,
-    0x06,
-    0x37,
-    0xf9,
-    0x22,
-    0x08,
-    0x25,
-    0x8f,
-    0x7c,
-    0xe9,
-    0xf7,
-    0xfa,
-    0xe0,
-    0x10,
-    0xc9,
-    0xee,
-    0x01,
-    0xf4,
-    0x85,
-    0xc4,
-    0xa5,
-    0xd4,
-    0xbe,
-    0xcd,
-    0xaa,
-    0xa8,
-    0xdc,
-    0xe6,
-    0x47,
-    0x57,
-    0x7a,
-    0x4c,
-    0x95,
-    0x2a,
-    0x0c,
-    0xb2,
-    0x4e,
-    0x81,
-    0xc5,
-    0x91,
-    0xd4,
-    0xc5,
-    0xb8,
-    0xc0,
-    0x75,
-    0x9d,
-    0x3d,
-    0x44,
-    0xed,
-    0x65,
-    0x96,
-    0x69,
-    0x2c,
-    0xdc,
-    0xd2,
-    0x12,
-    0x5a,
-    0x1c,
-    0xf2,
-    0x4d,
-    0x19,
-    0xd0,
-    0x4b,
-    0x2a,
-    0x0a,
-    0xa1,
-    0x2b,
-    0xce,
-    0x92,
-    0xf1,
-    0xbf,
-    0xc3,
-    0xde,
-    0xcc,
-    0x34,
-    0x92,
-    0x24,
-    0x1b,
-    0x1d,
-    0x94,
-    0x2c,
-    0x1b,
-    0x15,
-    0x05,
-    0x10,
-    0x0e,
-    0xa5,
-    0x5a,
-    0x40,
-    0x31,
-    0x68,
-    0xd4,
-    0xc8,
-    0xed,
-    0x6c,
-    0x56,
-    0xd6,
-    0x51,
-    0xdc,
-    0x74,
-    0x76,
-    0xc0,
-    0xdc,
-    0xcc,
-    0xa1,
-    0xe7,
-    0xb5,
-    0x99,
-    0x76,
-    0xf2,
-    0x32,
-    0x85,
-    0xc7,
-    0x00,
-    0x4a,
-    0xbf,
-    0xd7,
-    0xd4,
-    0xfe,
-    0x4e,
-    0x62,
-    0xcd,
-    0x85,
-    0xa5,
-    0xde,
-    0x18,
-    0xa7,
-    0x77,
-    0x01,
-    0x24,
-    0x67,
-    0xcc,
-    0x83,
-    0x56,
-    0xe4,
-    0x55,
-    0x25,
-    0xff,
-    0x81,
-    0xfc,
-    0xf2,
-    0x8b,
-    0x44,
-    0xc0,
-    0xc5,
-    0xfb,
-    0x7c,
-    0xc0,
-    0x0b,
-    0x95,
-    0xa7,
-    0x95,
-    0xca,
-    0xd9,
-    0x92,
-    0xe5,
-    0xe3,
-    0xb8,
-    0xc2,
-    0x35,
-    0x94,
-    0x01,
-    0x13,
-    0xff,
-    0x40,
-    0x1c,
-    0x9f,
-    0x05,
-    0x73,
-    0xfa,
-    0xe1,
-    0xe4,
-    0x21,
-    0x4c,
-    0x1b,
-    0xec,
-    0x2e,
-    0xf3,
-    0xf4,
-    0x2f,
-    0x33,
-    0xb8,
-    0x66,
-    0xd8,
-    0x80,
-    0x3e,
-    0xd7,
-    0xbf,
-    0x5d,
-    0x34,
-    0x86,
-    0x3a,
-    0x96,
-    0xcf,
-    0x29,
-    0x35,
-    0x36,
-    0x78,
-    0xd5,
-    0x85,
-    0x92,
-    0xc2,
-    0x1d,
-    0x79,
-    0x89,
-    0x9e,
-    0x7e,
-    0xb2,
-    0x0b,
-    0xd2,
-    0xfb,
-    0x35,
-    0xd8,
-    0xa7,
-    0x04,
-    0xbf,
-    0x8a,
-    0xe2,
-    0x9c,
-    0x59,
-    0xd6,
-    0xf6,
-    0xbb,
-    0x2b,
-    0x0f,
-    0x78,
-    0xf1,
-    0x95,
-    0xeb,
-    0xd3,
-    0x4d,
-    0x7c,
-    0x8a,
-    0x3d,
-    0x7d,
-    0xe2,
-    0xb4,
-    0xea,
-    0x36,
-    0xba,
-    0x63,
-    0x7f,
-    0xd7,
-    0xfa,
-    0x81,
-    0xc9,
-    0x49,
-    0xf1,
-    0xf2,
-    0xaf,
-    0x29,
-    0xdb,
-    0xd5,
-    0x65,
-    0x29,
-    0xb3,
-    0x07,
-    0xe3,
-    0xb3,
-    0x48,
-    0xe9,
-    0x96,
-    0xd0,
-    0x93,
-    0x64,
-    0x55,
-    0x49,
-    0x48,
-    0x2a,
-    0x96,
-    0x0c,
-    0xab,
-    0x3e,
-    0xe2,
-    0xd0,
-    0xa5,
-    0xb6,
-    0x86,
-    0xfc,
-    0x17,
-    0xc0,
-    0x8c,
-    0xc5,
-    0x6e,
-    0xe3,
-    0xe9,
-    0x97,
-    0x78,
-    0x87,
-    0xf8,
-    0xb7,
-    0x76,
-    0xb8,
-    0x27,
-    0x26,
-    0x72,
-    0x27,
-    0xf1,
-    0xc8,
-    0xd2,
-    0x71,
-    0x0c,
-    0xc5,
-    0x2e,
-    0xa4,
-    0xe3,
-    0x30,
-    0x5f,
-    0x00,
-    0x46,
-    0xe7,
-    0xd8,
-    0xfa,
-    0x60,
-    0xba,
-    0x3a,
-    0x87,
-    0xea,
-    0xcf,
-    0x22,
-    0x96,
-    0x9f,
-    0x44,
-    0x45,
-    0xde,
-    0xf0,
-    0x17,
-    0xc0,
-    0xdb,
-    0xf8,
-    0x43,
-    0xa9,
-    0x13,
-    0xb2,
-    0x2c,
-    0xea,
-    0x9e,
-    0x6a,
-    0x3d,
-    0x4f,
-    0xe5,
-    0x71,
-    0xd0,
-    0xdd,
-    0xaa,
-    0x15,
-    0x4e,
-    0x66,
-    0x49,
-    0xd0,
-    0x97,
-    0x5a,
-    0x3d,
-    0xc0,
-    0xa4,
-    0xe0,
-    0xe5,
-    0x57,
-    0x6b,
-    0x25,
-    0x88,
-    0x54,
-    0x02,
-    0xf4,
-    0x98,
-    0xf2,
-    0x08,
-    0x88,
-    0x33,
-    0x5f,
-    0x41,
-    0x9e,
-    0xef,
-    0x6f,
-    0x80,
-    0xce,
-    0xd7,
-    0x92,
-    0xca,
-    0x1a,
-    0xb1,
-    0x04,
-    0xb8,
-    0xc8,
-    0x83,
-    0x43,
-    0x1d,
-    0x6d,
-    0x55,
-    0xc6,
-    0xe9,
-    0x4b,
-    0x37,
-    0xec,
-    0x4d,
-    0xdc,
-    0x86,
-    0x33,
-    0x20,
-    0xaf,
-    0x6c,
-    0xaa,
-    0x82,
-    0x73,
-    0xa6,
-    0xa9,
-    0xbf,
-    0x52,
-    0x8a,
-    0xbf,
-    0x76,
-    0x80,
-    0x48,
-    0xec,
-    0xfa,
-    0x13,
-    0x70,
-    0x10,
-    0xf8,
-    0x15,
-    0xb4,
-    0xa4,
-    0x5a,
-    0xd7,
-    0xf0,
-    0xa8,
-    0x6c,
-    0x89,
-    0x67,
-    0xdc,
-    0x3d,
-    0x08,
-    0x4f,
-    0x33,
-    0x49,
-    0xf7,
-    0x91,
-    0x85,
-    0x54,
-    0x11,
-    0xca,
-    0x84,
-    0x99,
-    0xbd,
-    0x95,
-    0xf1,
-    0x24,
-    0xe3,
-    0x0c,
-    0x10,
-    0x7d,
-    0xff,
-    0x8c,
-    0x59,
-    0x86,
-    0x74,
-    0xb9,
-    0x70,
-    0xa6,
-    0x22,
-    0xc2,
-    0x57,
-    0x27,
-    0x3a,
-    0xe7,
-    0xe3,
-    0xdd,
-    0x51,
-    0x38,
-    0x6c,
-    0x09,
-    0xb4,
-    0x9f,
-    0xc9,
-    0x7c,
-    0xfc,
-    0x20,
-    0x7b,
-    0x00,
-    0xe2,
-    0x60,
-    0x29,
-    0xf3,
-    0x54,
-    0x64,
-    0x4d,
-    0x35,
-    0xc8,
-    0x9c,
-    0x2c,
-    0x45,
-    0xd0,
-    0x20,
-    0x0b,
-    0xa6,
-    0xee,
-    0x39,
-    0xa0,
-    0x88,
-    0xaa,
-    0x23,
-    0xc7,
-    0xa4,
-    0xe3,
-    0x11,
-    0x76,
-    0x68,
-    0x63,
-    0x72,
-    0xf3,
-    0x54,
-    0xb6,
-    0x73,
-    0x44,
-    0xa4,
-    0x3b,
-    0xc5,
-    0xe8,
-    0x2f,
-    0x7b,
-    0xa0,
-    0xc4,
-    0x8f,
-    0xba,
-    0x08,
-    0x60,
-    0x82,
-    0xcc,
-    0x4f,
-    0x53,
-    0x90,
-    0x2a,
-    0xdb,
-    0xfc,
-    0xee,
-    0x45,
-    0x29,
-    0x73,
-    0xa3,
-    0x1a,
-    0x12,
-    0xbf,
-    0xe9,
-    0x07,
-    0x4d,
-    0x4a,
-    0xd6,
-    0xdd,
-    0x36,
-    0x92,
-    0x3b,
-    0x36,
-    0xcd,
-    0x20,
-    0xcd,
-    0x09,
-    0x02,
-    0xbe,
-    0x82,
-    0x7b,
-    0x30,
-    0xe5,
-    0x3e,
-    0xf8,
-    0xe7,
-    0x75,
-    0xaf,
-    0x83,
-    0xee,
-    0xa8,
-    0x75,
-    0x4a,
-    0x88,
-    0x49,
-    0x87,
-    0x7e,
-    0xf7,
-    0x21,
-    0xd2,
-    0x61,
-    0x3f,
-    0xb3,
-    0x23,
-    0xa1,
-    0x2c,
-    0x29,
-    0x46,
-    0xe4,
-    0x96,
-    0x8d,
-    0x70,
-    0xa4,
-    0xe4,
-    0x3c,
-    0xda,
-    0x3d,
-    0xcf,
-    0x98,
-    0xaf,
-    0x44,
-    0x69,
-    0xfe,
-    0x28,
-    0x1b,
-    0x5d,
-    0xf8,
-    0xf5,
-    0xc2,
-    0x78,
-    0xb3,
-    0xe0,
-    0xf0,
-    0x68,
-    0xb3,
-    0xad,
-    0x63,
-    0xc4,
-    0xc5,
-    0x44,
-    0x74,
-    0x4d,
-    0x35,
-    0x12,
-    0xee,
-    0x74,
-    0x42,
-    0xac,
-    0x20,
-    0x1c,
-    0xcf,
-    0xb5,
-    0x31,
-    0xa0,
-    0x5b,
-    0x03,
-    0xb4,
-    0x18,
-    0x33,
-    0xfd,
-    0x7c,
-    0xd8,
-    0xe6,
-    0x47,
-    0xb2,
-    0x3a,
-    0xfa,
-    0xa2,
-    0x24,
-    0x9e,
-    0xdd,
-    0x0d,
-    0xe0,
-    0xae,
-    0x1e,
-    0x30,
-    0x02,
-    0xe7,
-    0xdd,
-    0xfb,
-    0xca,
-    0x55,
-    0x81,
-    0x8b,
-    0xf2,
-    0x9d,
-    0xa9,
-    0x4d,
-    0x3e,
-    0x41,
-    0x64,
-    0x65,
-    0x54,
-    0x20,
-    0xa4,
-    0x51,
-    0xce,
-    0x3c,
-    0xf0,
-    0xc9,
-    0x8e,
-    0xc0,
-    0x5a,
-    0xea,
-    0x51,
-    0x42,
-    0xb1,
-    0x94,
-    0x87,
-    0x45,
-    0xf7,
-    0x11,
-    0x63,
-    0x02,
-    0x15,
-    0xf7,
-    0x2e,
-    0x68,
-    0xce,
-    0x4f,
-    0xe0,
-    0x61,
-    0xf2,
-    0xf6,
-    0xf1,
-    0x57,
-    0xd4,
-    0x44,
-    0x6d,
-    0xf7,
-    0xfd,
-    0xec,
-    0x47,
-    0x34,
-    0x22,
-    0x23,
-    0xef,
-    0x8f,
-    0x54,
-    0x05,
-    0x26,
-    0x96,
-    0x77,
-    0x34,
-    0x12,
-    0xab,
-    0xf5,
-    0xc2,
-    0x8d,
-    0x07,
-    0xb4,
-    0x51,
-    0xc3,
-    0xff,
-    0x45,
-    0x78,
-    0xfc,
-    0x85,
-    0x5e,
-    0x69,
-    0xb6,
-    0xf1,
-    0x8a,
-    0xd1,
-    0xf7,
-    0x02,
-    0x1f,
-    0x00,
-    0xe1,
-    0x1f,
-    0x70,
-    0x4a,
-    0x87,
-    0xe3,
-    0x45,
-    0xad,
-    0xff,
-    0xd9,
-    0x88,
-    0xb4,
-    0xb9,
-    0x84,
-    0x41,
-    0x9a,
-    0x0e,
-    0xa3,
-    0xc5,
-    0xb3,
-    0x1c,
-    0xb2,
-    0x29,
-    0x08,
-    0xd2,
-    0xb4,
-    0xfd,
-    0x41,
-    0x47,
-    0x30,
-    0x37,
-    0xc9,
-    0x50,
-    0x7a,
-    0x6e,
-    0x2c,
-    0x51,
-    0x33,
-    0x49,
-    0xc4,
-    0x53,
-    0x13,
-    0x36,
-    0x94,
-    0x57,
-    0xe6,
-    0x5f,
-    0x74,
-    0xea,
-    0xd5,
-    0xda,
-    0x6f,
-    0xfa,
-    0xe7,
-    0x1f,
-    0x69,
-    0xe8,
-    0xc8,
-    0xc0,
-    0x04,
-    0xde,
-    0xc8,
-    0x54,
-    0xc5,
-    0x63,
-    0x26,
-    0xb4,
-    0x73,
-    0x2d,
-    0x8f,
-    0x6b,
-    0xc0,
-    0x36,
-    0xe2,
-    0x67,
-    0x2c,
-    0x12,
-    0x36,
-    0xf5,
-    0x25,
-    0x7f,
-    0x1e,
-    0xec,
-    0x73,
-    0x3e,
-    0x2c,
-    0x27,
-    0xd3,
-    0x21,
-    0xb3,
-    0x39,
-    0xe2,
-    0x66,
-    0xd1,
-    0x5d,
-    0x3d,
-    0x43,
-    0xad,
-    0xac,
-    0xe7,
-    0xc2,
-    0xfe,
-    0x93,
-    0xeb,
-    0xcf,
-    0xcd,
-    0x83,
-    0x42,
-    0x8f,
-    0x7b,
-    0xea,
-    0xf6,
-    0xf4,
-    0x05,
-    0x63,
-    0x88,
-    0x8f,
-    0x87,
-    0x29,
-    0x90,
-    0xa5,
-    0xff,
-    0xd2,
-    0xa3,
-    0x84,
-    0x54,
-    0x3a,
-    0x79,
-    0x17,
-    0x97,
-    0xbd,
-    0x4f,
-    0xb9,
-    0x88,
-    0xa9,
-    0x8b,
-    0x47,
-    0x5c,
-    0xf2,
-    0x9f,
-    0x79,
-    0xbd,
-    0x28,
-    0x2f,
-    0x72,
-    0x13,
-    0xa7,
-    0x76,
-    0x95,
-    0x02,
-    0x0e,
-    0xe6,
-    0x9b,
-    0x33,
-    0xf2,
-    0x0e,
-    0xe2,
-    0x58,
-    0xd3,
-    0xc1,
-    0x08,
-    0x6a,
-    0x4e,
-    0x75,
-    0xb9,
-    0x35,
-    0x95,
-    0xe9,
-    0xc5,
-    0x17,
-    0x1d,
-    0x0b,
-    0x76,
-    0x05,
-    0x96,
-    0x18,
-    0x20,
-    0xce,
-    0x20,
-    0x05,
-    0xf9,
-    0xa4,
-    0xbc,
-    0x1e,
-    0x2b,
-    0xd8,
-    0x00,
-    0xed,
-    0x28,
-    0xe5,
-    0x10,
-    0x5d,
-    0x3e,
-    0xb0,
-    0xc9,
-    0x1f,
-    0x6b,
-    0x0e,
-    0x3f,
-    0x4d,
-    0x72,
-    0x87,
-    0x6a,
-    0x4d,
-    0x2e,
-    0x5a,
-    0x1c,
-    0xf9,
-    0x27,
-    0xc0,
-    0x36,
-    0xfc,
-    0x63,
-    0x75,
-    0x1c,
-    0x7f,
-    0x7f,
-    0x75,
-    0x66,
-    0x06,
-    0xfe,
-    0x03,
-    0xd9,
-    0x94,
-    0xe0,
-    0xf0,
-    0x95,
-    0x16,
-    0x76,
-    0x1a,
-    0x8f,
-    0xfe,
-    0x76,
-    0x33,
-    0x42,
-    0x2f,
-    0x4b,
-    0xc4,
-    0xa2,
-    0x19,
-    0xae,
-    0x71,
-    0x52,
-    0x25,
-    0x7a,
-    0x7e,
-    0x16,
-    0x53,
-    0xbc,
-    0x92,
-    0x8b,
-    0x21,
-    0x0a,
-    0xbb,
-    0x16,
-    0xb0,
-    0x17,
-    0xb3,
-    0x1a,
-    0x22,
-    0x84,
-    0x62,
-    0x6e,
-    0x46,
-    0xf8,
-    0xa3,
-    0x0e,
-    0x77,
-    0x72,
-    0x4b,
-    0x10,
-    0xc1,
-    0xde,
-    0x68,
-    0xda,
-    0x46,
-    0xe7,
-    0xc6,
-    0x93,
-    0xe0,
-    0x0d,
-    0xb8,
-    0xd7,
-    0x08,
-    0xf7,
-    0x14,
-    0xaf,
-    0xf7,
-    0x0a,
-    0x80,
-    0xc0,
-    0x0a,
-    0x3a,
-    0xec,
-    0xc2,
-    0x6b,
-    0x20,
-    0x60,
-    0x34,
-    0xee,
-    0x4d,
-    0xf8,
-    0x4e,
-    0x39,
-    0xdf,
-    0x2d,
-    0x38,
-    0x28,
-    0x52,
-    0x55,
-    0x79,
-    0x70,
-    0x98,
-    0x6d,
-    0xb2,
-    0x82,
-    0x6b,
-    0x17,
-    0x8c,
-    0xb2,
-    0xe2,
-    0xdf,
-    0xef,
-    0x98,
-    0x42,
-    0xc2,
-    0x75,
-    0xb6,
-    0x17,
-    0xf1,
-    0x1e,
-    0x5c,
-    0x84,
-    0xd2,
-    0x45,
-    0xc9,
-    0xd8,
-    0x48,
-    0xd2,
-    0x93,
-    0x61,
-    0x34,
-    0xb2,
-    0x49,
-    0x85,
-    0x3c,
-    0x84,
-    0x56,
-    0x0e,
-    0xcb,
-    0x95,
-    0x28,
-    0xc6,
-    0x58,
-    0x0f,
-    0x92,
-    0x44,
-    0xec,
-    0x6d,
-    0x6f,
-    0x05,
-    0xde,
-    0x32,
-    0x89,
-    0xbf,
-    0xe1,
-    0xdb,
-    0xb9,
-    0xf1,
-    0x42,
-    0x12,
-    0x4f,
-    0xbf,
-    0x6a,
-    0x24,
-    0xb3,
-    0xfd,
-    0xaa,
-    0xb5,
-    0x4d,
-    0x8a,
-    0x38,
-    0xb3,
-    0xa3,
-    0xdf,
-    0x74,
-    0x88,
-    0xc1,
-    0xe7,
-    0x70,
-    0x94,
-    0xde,
-    0x12,
-    0xb0,
-    0xda,
-    0x3c,
-    0xa5,
-    0x2e,
-    0xf9,
-    0x50,
-    0x54,
-    0xa1,
-    0x5f,
-    0x23,
-    0x12,
-    0xff,
-    0xb9,
-    0xf8,
-    0x28,
-    0x41,
-    0xad,
-    0x2f,
-    0x84,
-    0x66,
-    0xcc,
-    0x69,
-    0x54,
-    0xba,
-    0xc2,
-    0xed,
-    0xd4,
-    0x58,
-    0xd0,
-    0x4b,
-    0x64,
-    0xee,
-    0x7d,
-    0x3f,
-    0xde,
-    0xc0,
-    0x88,
-    0xd7,
-    0x26,
-    0xf0,
-    0x20,
-    0xd8,
-    0x03,
-    0xfc,
-    0x57,
-    0x5f,
-    0x2d,
-    0x88,
-    0xd5,
-    0xc4,
-    0xa7,
-    0x5e,
-    0xc9,
-    0xc3,
-    0x4e,
-    0xb3,
-    0x26,
-    0xde,
-    0xb3,
-    0xac,
-    0x0b,
-    0xfd,
-    0x26,
-    0x20,
-    0x82,
-    0x58,
-    0x13,
-    0xa0,
-    0x6e,
-    0x96,
-    0x92,
-    0xb4,
-    0xbf,
-    0x36,
-    0x39,
-    0x68,
-    0xe8,
-    0x2f,
-    0x34,
-    0x07,
-    0x93,
-    0xd3,
-    0x98,
-    0x27,
-    0x93,
-    0xf9,
-    0xf5,
-    0xe5,
-    0x1a,
-    0x5b,
-    0x2b,
-    0x72,
-    0x2c,
-    0x3d,
-    0x7e,
-    0xcf,
-    0x53,
-    0x50,
-    0xec,
-    0xd4,
-    0x95,
-    0xd5,
-    0xbd,
-    0x77,
-    0xa3,
-    0x05,
-    0x5d,
-    0x4b,
-    0x53,
-    0xb1,
-    0x67,
-    0x47,
-    0x50,
-    0x26,
-    0x02,
-    0xc9,
-    0x10,
-    0x53,
-    0x70,
-    0xda,
-    0x07,
-    0x2e,
-    0xe4,
-    0xb4,
-    0x1b,
-    0x53,
-    0x94,
-    0x82,
-    0x57,
-    0xee,
-    0x10,
-    0x66,
-    0xe3,
-    0xdc,
-    0xd2,
-    0xc0,
-    0x34,
-    0x0d,
-    0x16,
-    0xae,
-    0x80,
-    0x2d,
-    0xec,
-    0xcf,
-    0x75,
-    0x83,
-    0x8b,
-    0x4d,
-    0x2a,
-    0x19,
-    0xe8,
-    0x1a,
-    0x56,
-    0x1d,
-    0x87,
-    0x79,
-    0xc0,
-    0x87,
-    0x91,
-    0xc1,
-    0xf6,
-    0xfc,
-    0x28,
-    0x5d,
-    0x42,
-    0xf2,
-    0xf7,
-    0x18,
-    0xda,
-    0x16,
-    0x0d,
-    0x98,
-    0x57,
-    0xea,
-    0xeb,
-    0x27,
-    0x68,
-    0xb3,
-    0xdb,
-    0xba,
-    0xc8,
-    0x92,
-    0x84,
-    0x2b,
-    0x6d,
-    0xf1,
-    0xbc,
-    0xca,
-    0x03,
-    0x20,
-    0x9d,
-    0x14,
-    0x98,
-    0x40,
-    0xdb,
-    0xc2,
-    0x99,
-    0x61,
-    0x54,
-    0x06,
-    0xfd,
-    0xe7,
-    0xe9,
-    0x11,
-    0xc0,
-    0x32,
-    0x8d,
-    0xd8,
-    0x93,
-    0x7e,
-    0x9b,
-    0x18,
-    0xd2,
-    0x07,
-    0x6d,
-    0x97,
-    0xb6,
-    0x71,
-    0x2a,
-    0xae,
-    0xcc,
-    0x68,
-    0xdf,
-    0x04,
-    0xa5,
-    0x84,
-    0xd2,
-    0x9c,
-    0xcf,
-    0x6f,
-    0x13,
-    0x12,
-    0x05,
-    0x49,
-    0x53,
-    0x21,
-    0xa3,
-    0x4b,
-    0xf9,
-    0x69,
-    0x5d,
-    0xab,
-    0x73,
-    0x6f,
-    0x2f,
-    0xc0,
-    0xca,
-    0xe6,
-    0x97,
-    0x67,
-    0x7a,
-    0x2d,
-    0x03,
-    0xa5,
-    0x80,
-    0x18,
-    0x85,
-    0x8e,
-    0xb4,
-    0xf3,
-    0xce,
-    0x65,
-    0x59,
-    0xc4,
-    0x5a,
-    0x04,
-    0xf3,
-    0xd1,
-    0xe8,
-    0x7e,
-    0x58,
-    0x62,
-    0x2d,
-    0x04,
-    0x0a,
-    0xc8,
-    0xc9,
-    0x05,
-    0xc4,
-    0x9e,
-    0x7a,
-    0x99,
-    0x53,
-    0x4f,
-    0x90,
-    0x20,
-    0xa7,
-    0xd9,
-    0xa1,
-    0x26,
-    0x2a,
-    0xd0,
-    0x7d,
-    0x8b,
-    0x51,
-    0xa5,
-    0x64,
-    0xe0,
-    0x70,
-    0x28,
-    0x77,
-    0x13,
-    0xd2,
-    0x4c,
-    0x6d,
-    0x4f,
-    0x09,
-    0x2a,
-    0x87,
-    0x1e,
-    0x83,
-    0x49,
-    0xc6,
-    0xd1,
-    0x5e,
-    0x1d,
-    0x5b,
-    0x21,
-    0x7d,
-    0xcd,
-    0x5f,
-    0x16,
-    0xdc,
-    0x3a,
-    0xc4,
-    0x28,
-    0x20,
-    0x3c,
-    0x8c,
-    0xa5,
-    0x73,
-    0x2e,
-    0x38,
-    0x52,
-    0x8e,
-    0xae,
-    0x84,
-    0x55,
-    0x17,
-    0x9e,
-    0x51,
-    0x52,
-    0x2e,
-    0x6e,
-    0xe3,
-    0xd5,
-    0x43,
-    0x9e,
-    0x4c,
-    0xf0,
-    0x2a,
-    0x7e,
-    0x28,
-    0x25,
-    0x71,
-    0x39,
-    0x8b,
-    0x85,
-    0xf1,
-    0x11,
-    0x38,
-    0x1a,
-    0xa3,
-    0xec,
-    0x14,
-    0x83,
-    0xb5,
-    0x10,
-    0xda,
-    0xde,
-    0xdd,
-    0x2b,
-    0x0f,
-    0xeb,
-    0xee,
-    0x96,
-    0x39,
-    0x6d,
-    0xa9,
-    0xda,
-    0x4c,
-    0xd4,
-    0xd5,
-    0x74,
-    0x65,
-    0x1a,
-    0x92,
-    0xd5,
-    0xba,
-    0xeb,
-    0xea,
-    0xad,
-    0xd1,
-    0x08,
-    0xa9,
-    0x69,
-    0xf1,
-    0xed,
-    0x6e,
-    0xfa,
-    0xd7,
-    0xb2,
-    0x03,
-    0xd9,
-    0xa9,
-    0x2f,
-    0xea,
-    0x48,
-    0x30,
-    0x63,
-    0x38,
-    0xda,
-    0x41,
-    0x17,
-    0xa7,
-    0x35,
-    0x7c,
-    0xbe,
-    0xe6,
-    0x17,
-    0x3a,
-    0xa0,
-    0x33,
-    0x97,
-    0xc0,
-    0x37,
-    0x2c,
-    0xae,
-    0xb9,
-    0xd9,
-    0xe2,
-    0xf5,
-    0xe3,
-    0x98,
-    0x30,
-    0xb0,
-    0x08,
-    0x67,
-    0x4b,
-    0x0c,
-    0x30,
-    0x7e,
-    0x99,
-    0xa5,
-    0x15,
-    0xff,
-    0xc7,
-    0x4b,
-    0xd7,
-    0xd9,
-    0x16,
-    0x06,
-    0xf1,
-    0xec,
-    0xf5,
-    0x57,
-    0x6c,
-    0x6f,
-    0xd5,
-    0xc1,
-    0x52,
-    0x8f,
-    0x39,
-    0x88,
-    0x66,
-    0x59,
-    0x0c,
-    0xb9,
-    0x12,
-    0xda,
-    0x38,
-    0x6a,
-    0xa1,
-    0x85,
-    0x74,
-    0x43,
-    0xae,
-    0xd5,
-    0x5d,
-    0x3e,
-    0xdc,
-    0x33,
-    0xc9,
-    0xaa,
-    0xc8,
-    0x19,
-    0x58,
-    0x76,
-    0x3c,
-    0x78,
-    0x4c,
-    0xac,
-    0xa6,
-    0x57,
-    0x9a,
-    0x3c,
-    0xc8,
-    0xbd,
-    0x40,
-    0xfb,
-    0xb0,
-    0xd2,
-    0xda,
-    0xeb,
-    0xeb,
-    0x41,
-    0x70,
-    0xbd,
-    0xf6,
-    0xe0,
-    0x93,
-    0x94,
-    0xf5,
-    0x93,
-    0xa8,
-    0x0c,
-    0xa7,
-    0x6e,
-    0x83,
-    0x7b,
-    0x9a,
-    0x19,
-    0x38,
-    0x77,
-    0x9b,
-    0x79,
-    0x2d,
-    0x98,
-    0x71,
-    0x8c,
-    0x74,
-    0x7e,
-    0xcb,
-    0x95,
-    0x58,
-    0x16,
-    0x76,
-    0x7a,
-    0x36,
-    0x1a,
-    0xd3,
-    0x6a,
-    0x8f,
-    0xd7,
-    0x89,
-    0xc2,
-    0x5a,
-    0x33,
-    0x77,
-    0x32,
-    0x9f,
-    0xee,
-    0xed,
-    0x1c,
-    0x41,
-    0x28,
-    0x1b,
-    0x3c,
-    0x1c,
-    0x24,
-    0xc9,
-    0x8e,
-    0x4f,
-    0x4b,
-    0x49,
-    0x6c,
-    0xdb,
-    0x74,
-    0xaa,
-    0xf7,
-    0x6e,
-    0x62,
-    0x2f,
-    0xb9,
-    0x79,
-    0x8e,
-    0xff,
-    0x89,
-    0x88,
-    0x27,
-    0x1e,
-    0xae,
-    0xd3,
-    0x58,
-    0x9c,
-    0x47,
-    0x10,
-    0xc9,
-    0x0d,
-    0xea,
-    0x8c,
-    0x68,
-    0x39,
-    0x8b,
-    0x7a,
-    0x69,
-    0x14,
-    0x9f,
-    0x8b,
-    0x8b,
-    0xf0,
-    0x82,
-    0xbf,
-    0x9e,
-    0xf1,
-    0x16,
-    0x7a,
-    0x42,
-    0xc1,
-    0xae,
-    0xda,
-    0xf1,
-    0x86,
-    0x2a,
-    0x48,
-    0x40,
-    0x11,
-    0x63,
-    0x4d,
-    0x61,
-    0x58,
-    0xc9,
-    0xa7,
-    0xed,
-    0x27,
-    0x4a,
-    0x9d,
-    0xe0,
-    0x12,
-    0x76,
-    0x8f,
-    0xe6,
-    0xae,
-    0xe1,
-    0xd1,
-    0xd5,
-    0x01,
-    0xc9,
-    0xba,
-    0x7a,
-    0x36,
-    0xf9,
-    0xf7,
-    0x98,
-    0x95,
-    0xed,
-    0x25,
-    0x2e,
-    0xb3,
-    0x37,
-    0xa0,
-    0xf9,
-    0xe6,
-    0x22,
-    0x95,
-    0x3a,
-    0xfc,
-    0x94,
-    0x5f,
-    0xb9,
-    0x2d,
-    0x39,
-    0x10,
-    0x0a,
-    0x4d,
-    0xdd,
-    0x4d,
-    0x0f,
-    0x47,
-    0x1a,
-    0x60,
-    0xbe,
-    0xc6,
-    0x34,
-    0x88,
-    0x24,
-    0x35,
-    0x41,
-    0x93,
-    0xaa,
-    0xea,
-    0x8d,
-    0xaf,
-    0x98,
-    0x9e,
-    0x3c,
-    0x7e,
-    0xd7,
-    0x21,
-    0x31,
-    0x68,
-    0xfb,
-    0x4b,
-    0x2f,
-    0x35,
-    0x81,
-    0x36,
-    0x3e,
-    0xdb,
-    0x54,
-    0xaa,
-    0x51,
-    0x94,
-    0x96,
-    0xd9,
-    0x25,
-    0x34,
-    0x9e,
-    0x4d,
-    0x6c,
-    0xba,
-    0x3d,
-    0x1e,
-    0x2b,
-    0x25,
-    0x46,
-    0x68,
-    0x61,
-    0x89,
-    0x4d,
-    0xfc,
-    0xe9,
-    0x61,
-    0xae,
-    0x56,
-    0xa1,
-    0x27,
-    0xd2,
-    0xd0,
-    0xcc,
-    0x22,
-    0xad,
-    0x15,
-    0xb5,
-    0x80,
-    0x8b,
-    0xd7,
-    0x96,
-    0xa4,
-    0x0d,
-    0xc5,
-    0xb7,
-    0xc1,
-    0x6e,
-    0xb7,
-    0xda,
-    0xa8,
-    0x0b,
-    0x2c,
-    0xd7,
-    0xde,
-    0x23,
-    0xf7,
-    0x84,
-    0xf2,
-    0xdb,
-    0x35,
-    0xd7,
-    0x0d,
-    0x85,
-    0x82,
-    0x4f,
-    0xcb,
-    0x21,
-    0x6d,
-    0x8f,
-    0x49,
-    0x24,
-    0x29,
-    0x4d,
-    0x80,
-    0x79,
-    0x85,
-    0x6a,
-    0xd1,
-    0xc6,
-    0x1d,
-    0x62,
-    0xe0,
-    0xf0,
-    0xd2,
-    0xe7,
-    0xa6,
-    0xe1,
-    0x79,
-    0xc9,
-    0xc2,
-    0x89,
-    0xd0,
-    0x19,
-    0x10,
-    0x22,
-    0xb6,
-    0x8e,
-    0x7d,
-    0xb9,
-    0x9b,
-    0x27,
-    0x1a,
-    0xea,
-    0x35,
-    0x12,
-    0x6f,
-    0xeb,
-    0x74,
-    0xcd,
-    0x11,
-    0xcc,
-    0xb9,
-    0x8b,
-    0x77,
-    0xfc,
-    0x43,
-    0xd9,
-    0x09,
-    0x10,
-    0xe9,
-    0x81,
-    0x7a,
-    0xc0,
-    0x0f,
-    0xaf,
-    0x58,
-    0x32,
-    0xd3,
-    0x52,
-    0xe1,
-    0x7c,
-    0x87,
-    0xc5,
-    0x19,
-    0x64,
-    0x64,
-    0xaf,
-    0x19,
-    0x69,
-    0x7c,
-    0x28,
-    0xaa,
-    0x08,
-    0xf1,
-    0x1d,
-    0x12,
-    0x38,
-    0x65,
-    0xf5,
-    0x2e,
-    0x37,
-    0xb1,
-    0x74,
-    0xc1,
-    0x88,
-    0xda,
-    0xe0,
-    0x0c,
-    0x3d,
-    0x41,
-    0x63,
-    0x9f,
-    0x72,
-    0x19,
-    0xb1,
-    0x6e,
-    0x1a,
-    0x1e,
-    0xea,
-    0x27,
-    0xfe,
-    0x84,
-    0xc2,
-    0xc3,
-    0x02,
-    0x2e,
-    0xdf,
-    0x5c,
-    0xaa,
-    0x21,
-    0x83,
-    0x3e,
-    0xde,
-    0x38,
-    0x6a,
-    0x40,
-    0xea,
-    0x19,
-    0xf6,
-    0x55,
-    0xc9,
-    0x67,
-    0x89,
-    0x5e,
-    0xa3,
-    0x3a,
-    0x32,
-    0x42,
-    0x94,
-    0xcc,
-    0x8d,
-    0x41,
-    0xaf,
-    0x75,
-    0xe4,
-    0x85,
-    0x43,
-    0xd9,
-    0x9a,
-    0xfa,
-    0x5c,
-    0x60,
-    0xca,
-    0x60,
-    0x8d,
-    0xe6,
-    0x2b,
-    0x9f,
-    0xed,
-    0xb4,
-    0x37,
-    0x5a,
-    0x60,
-    0xaf,
-    0x8c,
-    0xc6,
-    0x18,
-    0xd0,
-    0x92,
-    0xbd,
-    0x5b,
-    0xd4,
-    0x5e,
-    0x0e,
-    0x86,
-    0x35,
-    0xd6,
-    0x18,
-    0x52,
-    0x58,
-    0x16,
-    0x97,
-    0x56,
-    0x08,
-    0x13,
-    0xbd,
-    0xcd,
-    0x23,
-    0x7e,
-    0x85,
-    0x9a,
-    0x93,
-    0xec,
-    0x44,
-    0x89,
-    0x80,
-    0x33,
-    0x80,
-    0xd8,
-    0xc4,
-    0x17,
-    0x06,
-    0xf6,
-    0xa0,
-    0x26,
-    0x37,
-    0x8a,
-    0xad,
-    0xe0,
-    0xa3,
-    0xb7,
-    0x15,
-    0x1b,
-    0xd9,
-    0x9e,
-    0x02,
-    0xa6,
-    0x7c,
-    0x25,
-    0x57,
-    0x2d,
-    0x9a,
-    0xf7,
-    0x9f,
-    0x5c,
-    0x3a,
-    0xcd,
-    0x42,
-    0x47,
-    0x34,
-    0xeb,
-    0xff,
-    0x0a,
-    0x46,
-    0xed,
-    0x96,
-    0xac,
-    0x63,
-    0xc3,
-    0xc5,
-    0x4a,
-    0x4e,
-    0xfb,
-    0x76,
-    0x71,
-    0x68,
-    0x3e,
-    0x37,
-    0xcb,
-    0xc7,
-    0x1e,
-    0xea,
-    0xfe,
-    0x87,
-    0x0f,
-    0xbe,
-    0xd1,
-    0x65,
-    0xb2,
-    0x5e,
-    0x91,
-    0x89,
-    0x5a,
-    0x68,
-    0xb3,
-    0xa4,
-    0xc9,
-    0x20,
-    0xba,
-    0x3b,
-    0x3a,
-    0x66,
-    0x5b,
-    0x43,
-    0xa5,
-    0xe5,
-    0xdf,
-    0xed,
-    0x3e,
-    0x8e,
-    0xca,
-    0xc3,
-    0x3e,
-    0x45,
-    0xba,
-    0xf4,
-    0xe7,
-    0xd9,
-    0x91,
-    0xec,
-    0xc2,
-    0x3a,
-    0xd6,
-    0x28,
-    0x2c,
-    0xe6,
-    0x59,
-    0x49,
-    0x10,
-    0xa5,
-    0x16,
-    0x67,
-    0xf6,
-    0x76,
-    0x5c,
-    0xa7,
-    0x3d,
-    0xc9,
-    0x2f,
-    0x10,
-    0xa4,
-    0xee,
-    0xea,
-    0x9a,
-    0x10,
-    0xce,
-    0x29,
-    0x88,
-    0x89,
-    0xd9,
-    0xe5,
-    0xf8,
-    0x85,
-    0x3f,
-    0xe1,
-    0xb9,
-    0x69,
-    0x63,
-    0x45,
-    0x5c,
-    0x4d,
-    0x8d,
-    0x89,
-    0x8e,
-    0xff,
-    0xde,
-    0x95,
-    0xa5,
-    0x4b,
-    0x8a,
-    0x27,
-    0x78,
-    0x7a,
-    0x41,
-    0x74,
-    0x74,
-    0x19,
-    0xee,
-    0x12,
-    0xec,
-    0xfc,
-    0xa4,
-    0x15,
-    0xb1,
-    0x82,
-    0xd5,
-    0x79,
-    0xe3,
-    0x19,
-    0xc6,
-    0xc0,
-    0x06,
-    0x05,
-    0x3f,
-    0xdb,
-    0x58,
-    0x5e,
-    0x87,
-    0x4e,
-    0x62,
-    0x58,
-    0x90,
-    0x90,
-    0xce,
-    0xc8,
-    0x6e,
-    0xb0,
-    0x78,
-    0xe3,
-    0x0d,
-    0x3e,
-    0xc8,
-    0x48,
-    0x24,
-    0x69,
-    0x3e,
-    0x41,
-    0x65,
-    0x65,
-    0x4e,
-    0x45,
-    0xf7,
-    0x10,
-    0x6f,
-    0xc2,
-    0x25,
-    0xd4,
-    0x6f,
-    0x1a,
-    0x58,
-    0xcf,
-    0x09,
-    0xeb,
-    0x42,
-    0x31,
-    0xb9,
-    0x94,
-    0x5d,
-    0xe6,
-    0xcf,
-    0xf5,
-    0x94,
-    0x76,
-    0xc3,
-    0x76,
-    0x3f,
-    0x29,
-    0xc8,
-    0x4a,
-    0x55,
-    0x6e,
-    0xa3,
-    0xf5,
-    0xdd,
-    0x7d,
-    0xbe,
-    0x0b,
-    0xa6,
-    0x3c,
-    0x78,
-    0x3b,
-    0x38,
-    0x5f,
-    0xc0,
-    0x8d,
-    0x0a,
-    0xd4,
-    0xe2,
-    0xe8,
-    0xf6,
-    0x5e,
-    0xa0,
-    0xd7,
-    0xe9,
-    0x80,
-    0x85,
-    0x8c,
-    0xdf,
-    0x9c,
-    0x76,
-    0x26,
-    0x0f,
-    0x5c,
-    0x8a,
-    0x2f,
-    0x62,
-    0x51,
-    0x1c,
-    0x69,
-    0x2a,
-    0xda,
-    0x1e,
-    0xca,
-    0x11,
-    0x48,
-    0xaf,
-    0xc5,
-    0x4f,
-    0x3f,
-    0xf0,
-    0xcb,
-    0x21,
-    0x5f,
-    0x14,
-    0x12,
-    0x76,
-    0x24,
-    0xb7,
-    0x95,
-    0xeb,
-    0x0b,
-    0x71,
-    0x5c,
-    0xf9,
-    0xf7,
-    0xaa,
-    0xfd,
-    0x6d,
-    0xd2,
-    0xb0,
-    0x63,
-    0x19,
-    0x77,
-    0x06,
-    0xce,
-    0xca,
-    0xd0,
-    0x00,
-    0x1b,
-    0x7a,
-    0x3b,
-    0x8c,
-    0x46,
-    0xc6,
-    0x33,
-    0x53,
-    0x2d,
-    0xa2,
-    0x2c,
-    0x01,
-    0x96,
-    0x4b,
-    0xbe,
-    0xe0,
-    0x74,
-    0x7d,
-    0x06,
-    0xac,
-    0x66,
-    0xe7,
-    0x4a,
-    0xa3,
-    0x81,
-    0xdc,
-    0xdb,
-    0xdb,
-    0x4f,
-    0x4b,
-    0x40,
-    0xd8,
-    0x17,
-    0xf1,
-    0x90,
-    0x5e,
-    0x5f,
-    0xcd,
-    0x20,
-    0x84,
-    0xb0,
-    0xd4,
-    0x5e,
-    0x0a,
-    0x99,
-    0xe7,
-    0xfd,
-    0xec,
-    0xf6,
-    0x02,
-    0x53,
-    0x37,
-    0x73,
-    0xb6,
-    0xff,
-    0x1c,
-    0x4b,
-    0xd9,
-    0xce,
-    0x43,
-    0x56,
-    0x7c,
-    0xe0,
-    0x62,
-    0x42,
-    0x1d,
-    0x06,
-    0x0d,
-    0x20,
-    0x1e,
-    0x6f,
-    0xd0,
-    0x23,
-    0x76,
-    0x84,
-    0x7b,
-    0xa5,
-    0xa7,
-    0x10,
-    0xbd,
-    0x6b,
-    0xf0,
-    0xa4,
-    0xf4,
-    0x2a,
-    0xc3,
-    0x3a,
-    0x44,
-    0x4a,
-    0x79,
-    0x18,
-    0xe6,
-    0xe9,
-    0x45,
-    0xf7,
-    0xc3,
-    0x23,
-    0x66,
-    0x65,
-    0x42,
-    0x91,
-    0xa1,
-    0x68,
-    0x5e,
-    0x0f,
-    0xef,
-    0x64,
-    0xfb,
-    0xc3,
-    0x73,
-    0x3e,
-    0x7a,
-    0x5b,
-    0xae,
-    0xc2,
-    0x8b,
-    0x95,
-    0xf6,
-    0x42,
-    0x42,
-    0x05,
-    0x24,
-    0x80,
-    0x6e,
-    0x13,
-    0x8e,
-    0xcf,
-    0x26,
-    0x43,
-    0x35,
-    0x74,
-    0xa4,
-    0xb9,
-    0x3f,
-    0x52,
-    0x57,
-    0xfc,
-    0xa7,
-    0xc7,
-    0x33,
-    0xfa,
-    0x33,
-    0xd1,
-    0x4c,
-    0x4c,
-    0xa6,
-    0x75,
-    0xa3,
-    0xbc,
-    0x37,
-    0x61,
-    0x3f,
-    0x04,
-    0x43,
-    0xd0,
-    0x80,
-    0xd9,
-    0x3f,
-    0xae,
-    0xb1,
-    0x28,
-    0xf0,
-    0xfc,
-    0xdc,
-    0xa0,
-    0xde,
-    0x77,
-    0xe2,
-    0x70,
-    0x06,
-    0x74,
-    0xca,
-    0x52,
-    0xcf,
-    0x0f,
-    0x5a,
-    0xc8,
-    0x3f,
-    0x84,
-    0xe4,
-    0xa5,
-    0x6f,
-    0xdd,
-    0x63,
-    0xd0,
-    0x3c,
-    0xce,
-    0xc7,
-    0x45,
-    0x40,
-    0xdd,
-    0x8c,
-    0x5c,
-    0x01,
-    0xc5,
-    0x91,
-    0x4e,
-    0x67,
-    0x1d,
-    0x28,
-    0xf5,
-    0x74,
-    0x35,
-    0x69,
-    0xd3,
-    0x2f,
-    0x41,
-    0xcd,
-    0x56,
-    0xe1,
-    0xb9,
-    0xf8,
-    0x5a,
-    0x84,
-    0xff,
-    0xd5,
-    0xf0,
-    0x79,
-    0x43,
-    0xe8,
-    0x5e,
-    0x79,
-    0xa4,
-    0xe0,
-    0x67,
-    0xce,
-    0x97,
-    0x6c,
-    0xcc,
-    0xc3,
-    0x8d,
-    0x50,
-    0x12,
-    0x59,
-    0xd0,
-    0xb8,
-    0x86,
-    0x3b,
-    0xae,
-    0xcc,
-    0x7f,
-    0xf4,
-    0xda,
-    0x84,
-    0xe3,
-    0x60,
-    0x0f,
-    0xbe,
-    0xec,
-    0x60,
-    0xf6,
-    0x8e,
-    0x2c,
-    0xd2,
-    0x4a,
-    0xd5,
-    0xcf,
-    0xc1,
-    0x3a,
-    0x15,
-    0x21,
-    0xd8,
-    0x0f,
-    0x83,
-    0x50,
-    0x1d,
-    0x0e,
-    0x5e,
-    0x72,
-    0xdc,
-    0xa0,
-    0x80,
-    0xc9,
-    0xe0,
-    0xb0,
-    0x33,
-    0x46,
-    0xe9,
-    0x55,
-    0x45,
-    0x4d,
-    0x5b,
-    0xb1,
-    0x5f,
-    0xb8,
-    0x34,
-    0x19,
-    0x92,
-    0x1e,
-    0x40,
-    0x75,
-    0x33,
-    0x55,
-    0x90,
-    0xea,
-    0xe9,
-    0x35,
-    0x28,
-    0xb7,
-    0x04,
-    0x9f,
-    0xf8,
-    0x5d,
-    0x10,
-    0xbe,
-    0x0e,
-    0x03,
-    0xaa,
-    0x8d,
-    0x09,
-    0x18,
-    0x93,
-    0x9a,
-    0xd1,
-    0x3a,
-    0x03,
-    0x09,
-    0x85,
-    0x57,
-    0x40,
-    0xdb,
-    0xb5,
-    0x12,
-    0x6e,
-    0x71,
-    0xd2,
-    0x68,
-    0xa9,
-    0x4b,
-    0xe2,
-    0x93,
-    0x51,
-    0x16,
-    0x78,
-    0x2e,
-    0xa5,
-    0xe6,
-    0xe4,
-    0x9b,
-    0x94,
-    0xc0,
-    0xa7,
-    0xa2,
-    0xcf,
-    0x5b,
-    0x2a,
-    0x5a,
-    0x23,
-    0x27,
-    0xaf,
-    0x4d,
-    0x06,
-    0x8f,
-    0x87,
-    0xd7,
-    0x70,
-    0x7b,
-    0x85,
-    0xcf,
-    0xec,
-    0x1a,
-    0xb4,
-    0x69,
-    0xee,
-    0xde,
-    0x45,
-    0x5b,
-    0x67,
-    0xc8,
-    0xcb,
-    0x3f,
-    0x97,
-    0xe5,
-    0xab,
-    0x39,
-    0x22,
-    0x19,
-    0xcd,
-    0xd9,
-    0x67,
-    0x1b,
-    0x98,
-    0x43,
-    0x0d,
-    0xc1,
-    0x1e,
-    0x8d,
-    0xde,
-    0x7e,
-    0x93,
-    0x68,
-    0xd9,
-    0x29,
-    0x04,
-    0x03,
-    0x82,
-    0xff,
-    0x45,
-    0x2c,
-    0x7d,
-    0xec,
-    0x2c,
-    0xb9,
-    0x5b,
-    0x06,
-    0xfc,
-    0x26,
-    0xb4,
-    0x5a,
-    0x24,
-    0x7f,
-    0x76,
-    0xec,
-    0x2a,
-    0x80,
-    0x7c,
-    0xf9,
-    0xe2,
-    0xfc,
-    0x63,
-    0x7f,
-    0xe3,
-    0x7b,
-    0x99,
-    0x00,
-    0x3b,
-    0x27,
-    0xb6,
-    0x82,
-    0x62,
-    0xe9,
-    0x10,
-    0xda,
-    0x6d,
-    0xcf,
-    0x89,
-    0x2a,
-    0x84,
-    0xb1,
-    0xac,
-    0xa9,
-    0x96,
-    0x14,
-    0xf9,
-    0xa2,
-    0x4b,
-    0x4e,
-    0x7c,
-    0xc0,
-    0x3b,
-    0xeb,
-    0xa5,
-    0x88,
-    0x5d,
-    0x50,
-    0x53,
-    0x27,
-    0xc2,
-    0x9e,
-    0x32,
-    0x6e,
-    0x83,
-    0xd9,
-    0x47,
-    0x1b,
-    0xf8,
-    0x4a,
-    0xc9,
-    0x5a,
-    0x2a,
-    0x21,
-    0x33,
-    0x8b,
-    0x8b,
-    0x5f,
-    0x97,
-    0x46,
-    0xe5,
-    0xf3,
-    0x35,
-    0x9c,
-    0x91,
-    0x23,
-    0x4c,
-    0xa0,
-    0xe9,
-    0x2e,
-    0x30,
-    0x27,
-    0xff,
-    0x30,
-    0x9d,
-    0xcb,
-    0x90,
-    0x45,
-    0x4b,
-    0x36,
-    0x33,
-    0xf1,
-    0xc2,
-    0x9d,
-    0xd6,
-    0xc0,
-    0x70,
-    0x8a,
-    0x6b,
-    0x29,
-    0xf9,
-    0xdf,
-    0xdf,
-    0xb8,
-    0xce,
-    0x18,
-    0x4c,
-    0x6d,
-    0x01,
-    0xd0,
-    0x6f,
-    0x5f,
-    0x58,
-    0x86,
-    0x5c,
-    0xa4,
-    0xa0,
-    0xa2,
-    0x70,
-    0x75,
-    0x43,
-    0xb3,
-    0x88,
-    0x8e,
-    0x1d,
-    0xfb,
-    0x70,
-    0xd4,
-    0x8c,
-    0x2d,
-    0x9f,
-    0x3a,
-    0xc6,
-    0x75,
-    0x21,
-    0xe5,
-    0x70,
-    0xb9,
-    0xd4,
-    0x8f,
-    0x6c,
-    0x1f,
-    0xd7,
-    0x29,
-    0xf2,
-    0xcf,
-    0x40,
-    0xc4,
-    0xe2,
-    0xfa,
-    0x0d,
-    0xb1,
-    0x58,
-    0x1b,
-    0x5e,
-    0xe7,
-    0x81,
-    0x7c,
-    0xe1,
-    0xa6,
-    0xae,
-    0xfc,
-    0x8d,
-    0x5a,
-    0xa7,
-    0x11,
-    0x93,
-    0xc2,
-    0x42,
-    0x09,
-    0x91,
-    0x51,
-    0x34,
-    0x95,
-    0x09,
-    0xd5,
-    0x26,
-    0x87,
-    0x13,
-    0x56,
-    0x0c,
-    0xdb,
-    0x4e,
-    0x41,
-    0xb2,
-    0xf4,
-    0x1c,
-    0xc6,
-    0x97,
-    0x29,
-    0x0f,
-    0x7e,
-    0xff,
-    0x80,
-    0x9e,
-    0x51,
-    0x44,
-    0xb9,
-    0x1d,
-    0x97,
-    0x6d,
-    0x8f,
-    0xec,
-    0x7d,
-    0x01,
-    0x3a,
-    0xee,
-    0xaa,
-    0x1e,
-    0x38,
-    0x3c,
-    0x23,
-    0xc5,
-    0x4d,
-    0x1b,
-    0x6c,
-    0x78,
-    0xc9,
-    0x2c,
-    0xf1,
-    0x07,
-    0x09,
-    0xe3,
-    0xa4,
-    0xa7,
-    0x40,
-    0x3a,
-    0xe6,
-    0x44,
-    0x78,
-    0xa7,
-    0xab,
-    0x18,
-    0xd3,
-    0x4b,
-    0xd9,
-    0x7d,
-    0x17,
-    0x6c,
-    0xf2,
-    0xff,
-    0x69,
-    0x25,
-    0xf3,
-    0xb6,
-    0x59,
-    0x5c,
-    0x7c,
-    0xd3,
-    0x1f,
-    0xf5,
-    0x30,
-    0x78,
-    0x24,
-    0x45,
-    0x5f,
-    0xcd,
-    0xc5,
-    0xca,
-    0xe3,
-    0x50,
-    0x53,
-    0x19,
-    0x47,
-    0x6c,
-    0x5e,
-    0x17,
-    0x2f,
-    0x4e,
-    0x33,
-    0x6c,
-    0xf3,
-    0xf4,
-    0xa3,
-    0x35,
-    0x8e,
-    0x86,
-    0x06,
-    0xf9,
-    0xb7,
-    0xea,
-    0x80,
-    0xdf,
-    0x4d,
-    0x93,
-    0x83,
-    0x1e,
-    0xf8,
-    0x99,
-    0x95,
-    0xb4,
-    0x0e,
-    0x0f,
-    0x54,
-    0x5b,
-    0xb3,
-    0x91,
-    0xb7,
-    0xb9,
-    0x45,
-    0x1c,
-    0x96,
-    0xd7,
-    0xf7,
-    0x22,
-    0x6d,
-    0xd4,
-    0xbb,
-    0xde,
-    0x5d,
-    0xdb,
-    0x66,
-    0xe6,
-    0x73,
-    0x52,
-    0x0e,
-    0xff,
-    0x2d,
-    0x54,
-    0xb7,
-    0x34,
-    0x3a,
-    0x62,
-    0x2f,
-    0x2a,
-    0x82,
-    0x55,
-    0x37,
-    0xae,
-    0x66,
-    0x97,
-    0xe3,
-    0x90,
-    0x49,
-    0x93,
-    0x44,
-    0xb4,
-    0x4f,
-    0x6a,
-    0x44,
-    0x66,
-    0x64,
-    0xe8,
-    0xd0,
-    0xee,
-    0x81,
-    0xb6,
-    0x3d,
-    0x64,
-    0x2a,
-    0xd1,
-    0xe4,
-    0xc6,
-    0x3c,
-    0x3a,
-    0x10,
-    0x48,
-    0xe5,
-    0xf0,
-    0x1b,
-    0xeb,
-    0xf4,
-    0x1b,
-    0xd3,
-    0x51,
-    0x53,
-    0x8a,
-    0x22,
-    0xd0,
-    0xd1,
-    0x5f,
-    0xef,
-    0xc5,
-    0x25,
-    0x09,
-    0x3f,
-    0x2b,
-    0x30,
-    0x73,
-    0xa0,
-    0x6c,
-    0x83,
-    0x7b,
-    0xc7,
-    0x76,
-    0x21,
-    0xa6,
-    0x78,
-    0x12,
-    0x86,
-    0x12,
-    0xa6,
-    0x71,
-    0xe8,
-    0xac,
-    0xdc,
-    0x08,
-    0xbc,
-    0xa2,
-    0xdb,
-    0x9f,
-    0x7c,
-    0x1c,
-    0x85,
-    0xa4,
-    0xa8,
-    0x27,
-    0xf9,
-    0xc4,
-    0x0b,
-    0xf1,
-    0x00,
-    0xbd,
-    0x3f,
-    0x3c,
-    0xa8,
-    0x6d,
-    0x73,
-    0x0d,
-    0x2e,
-    0x2f,
-    0x6c,
-    0xa4,
-    0x21,
-    0x68,
-    0xca,
-    0xb1,
-    0xc5,
-    0x5d,
-    0x8d,
-    0xc5,
-    0xb6,
-    0x48,
-    0xd7,
-    0x07,
-    0xcd,
-    0xaa,
-    0xf3,
-    0x28,
-    0x47,
-    0xe2,
-    0x97,
-    0x99,
-    0x24,
-    0xff,
-    0x66,
-    0xfb,
-    0xce,
-    0xd3,
-    0xb9,
-    0xd7,
-    0xfb,
-    0x48,
-    0x9f,
-    0x8f,
-    0xd4,
-    0xf8,
-    0x23,
-    0x94,
-    0x57,
-    0xf7,
-    0xcd,
-    0xda,
-    0xfa,
-    0xf3,
-    0x6b,
-    0x89,
-    0x91,
-    0x80,
-    0x10,
-    0xf6,
-    0x71,
-    0xad,
-    0x5e,
-    0xd1,
-    0xd6,
-    0xdb,
-    0x01,
-    0xa0,
-    0x82,
-    0xcf,
-    0x7c,
-    0x6b,
-    0xa7,
-    0x05,
-    0x28,
-    0xb9,
-    0x07,
-    0x47,
-    0x79,
-    0xbc,
-    0x5a,
-    0x7f,
-    0x84,
-    0xc9,
-    0xf0,
-    0xca,
-    0xbe,
-    0x0b,
-    0x97,
-    0xcd,
-    0x07,
-    0x77,
-    0xbf,
-    0x4c,
-    0xe7,
-    0x02,
-    0xdc,
-    0xf8,
-    0x17,
-    0x12,
-    0x0c,
-    0x89,
-    0x43,
-    0x33,
-    0xfa,
-    0x0d,
-    0x0e,
-    0x0c,
-    0x02,
-    0x80,
-    0x57,
-    0x91,
-    0x96,
-    0x9c,
-    0xba,
-    0x7a,
-    0xe0,
-    0xf2,
-    0x5a,
-    0xf3,
-    0xa8,
-    0x3a,
-    0xde,
-    0x95,
-    0x79,
-    0xe8,
-    0xba,
-    0x95,
-    0xff,
-    0x00,
-    0xb0,
-    0x3b,
-    0xb4,
-    0x2a,
-    0x96,
-    0x96,
-    0xbc,
-    0x09,
-    0x59,
-    0x6f,
-    0x0c,
-    0xc9,
-    0x42,
-    0x7b,
-    0xd2,
-    0xf7,
-    0x78,
-    0xd4,
-    0x11,
-    0x96,
-    0xc7,
-    0xaa,
-    0x8c,
-    0x6f,
-    0x9f,
-    0x36,
-    0xe6,
-    0xa8,
-    0x60,
-    0xf0,
-    0x07,
-    0x98,
-    0xd4,
-    0x02,
-    0xc2,
-    0xda,
-    0xfd,
-    0xfc,
-    0xb4,
-    0xa0,
-    0x12,
-    0xc9,
-    0x6f,
-    0x4a,
-    0xc4,
-    0xe2,
-    0xd8,
-    0x38,
-    0xc5,
-    0xc1,
-    0xcd,
-    0xdc,
-    0x8b,
-    0x99,
-    0x0b,
-    0x13,
-    0x52,
-    0x44,
-    0x4f,
-    0xb5,
-    0x60,
-    0x7d,
-    0xbc,
-    0x6a,
-    0x8c,
-    0x4f,
-    0x7d,
-    0xc0,
-    0x01,
-    0xcd,
-    0xab,
-    0x7b,
-    0x40,
-    0x04,
-    0x71,
-    0x2d,
-    0x64,
-    0x2e,
-    0x6e,
-    0x06,
-    0xaa,
-    0x29,
-    0x5a,
-    0xec,
-    0x30,
-    0x27,
-    0xed,
-    0xce,
-    0xfd,
-    0xa6,
-    0xfc,
-    0x36,
-    0x42,
-    0xa3,
-    0xe6,
-    0x1e,
-    0xdf,
-    0x0a,
-    0x2e,
-    0x05,
-    0x29,
-    0x72,
-    0x69,
-    0x42,
-    0xeb,
-    0x07,
-    0x5b,
-    0x97,
-    0xab,
-    0xc7,
-    0x5d,
-    0x09,
-    0x2e,
-    0xf2,
-    0x01,
-    0xef,
-    0x3e,
-    0xbb,
-    0xf9,
-    0x4a,
-    0xaa,
-    0x44,
-    0x35,
-    0x54,
-    0x8f,
-    0xc9,
-    0x4c,
-    0x5c,
-    0xd6,
-    0x1c,
-    0x1d,
-    0xd0,
-    0xfe,
-    0x51,
-    0xb6,
-    0x9c,
-    0x1b,
-    0xba,
-    0x75,
-    0xb2,
-    0x1f,
-    0x16,
-    0x6c,
-    0xea,
-    0x59,
-    0x05,
-    0x0a,
-    0x0d,
-    0x3b,
-    0xbf,
-    0xf8,
-    0x2c,
-    0x60,
-    0x06,
-    0x42,
-    0x37,
-    0xce,
-    0x59,
-    0xb7,
-    0xcb,
-    0x78,
-    0x6b,
-    0x92,
-    0x4a,
-    0x07,
-    0xd3,
-    0x5a,
-    0x31,
-    0xd9,
-    0x05,
-    0x06,
-    0xa6,
-    0x4a,
-    0x81,
-    0x65,
-    0x51,
-    0x33,
-    0x4a,
-    0xbd,
-    0x6d,
-    0xb1,
-    0x9a,
-    0xb3,
-    0x1f,
-    0x28,
-    0xd4,
-    0x6a,
-    0x06,
-    0x87,
-    0xba,
-    0xef,
-    0x13,
-    0xcd,
-    0xe0,
-    0xd5,
-    0x9b,
-    0xcc,
-    0x60,
-    0x1c,
-    0xaa,
-    0x2c,
-    0xd0,
-    0x58,
-    0x9b,
-    0xb4,
-    0x71,
-    0x0e,
-    0xe5,
-    0xc5,
-    0xa9,
-    0x62,
-    0x38,
-    0x27,
-    0xb4,
-    0xef,
-    0xc9,
-    0x09,
-    0x96,
-    0xf7,
-    0xea,
-    0x42,
-    0x54,
-    0xbc,
-    0xdd,
-    0xdd,
-    0x63,
-    0x2d,
-    0xea,
-    0xd5,
-    0x61,
-    0xc5,
-    0xaf,
-    0x1d,
-    0x03,
-    0xb1,
-    0xb8,
-    0xe3,
-    0x4f,
-    0x31,
-    0x4f,
-    0x16,
-    0x0b,
-    0x40,
-    0x95,
-    0x26,
-    0x75,
-    0x77,
-    0xd2,
-    0x0b,
-    0x34,
-    0x2f,
-    0x0a,
-    0x88,
-    0x8f,
-    0xe6,
-    0xd1,
-    0xb1,
-    0xdd,
-    0xe4,
-    0x5f,
-    0xab,
-    0x3c,
-    0x1d,
-    0xe7,
-    0xb3,
-    0x86,
-    0x5a,
-    0x25,
-    0x61,
-    0x81,
-    0x94,
-    0x37,
-    0x2e,
-    0x56,
-    0xa0,
-    0xad,
-    0x35,
-    0x45,
-    0x12,
-    0xe3,
-    0x36,
-    0x96,
-    0x5b,
-    0x8f,
-    0xe0,
-    0xd3,
-    0x34,
-    0x96,
-    0x50,
-    0x34,
-    0x40,
-    0x24,
-    0xd5,
-    0x5b,
-    0xec,
-    0xfb,
-    0xf6,
-    0x41,
-    0x9b,
-    0x0b,
-    0xb6,
-    0x71,
-    0x00,
-    0x43,
-    0x16,
-    0x74,
-    0xca,
-    0xa8,
-    0xdc,
-    0x8c,
-    0x87,
-    0xa4,
-    0x93,
-    0xa5,
-    0xc2,
-    0xa0,
-    0xd3,
-    0x88,
-    0x6f,
-    0xd5,
-    0xc2,
-    0x52,
-    0x8a,
-    0x5e,
-    0xdb,
-    0x24,
-    0xfa,
-    0x92,
-    0xee,
-    0x1d,
-    0xbb,
-    0x92,
-    0x68,
-    0x85,
-    0x3c,
-    0x1e,
-    0xd5,
-    0x4b,
-    0x06,
-    0xad,
-    0xa3,
-    0xb2,
-    0x9f,
-    0xbc,
-    0x29,
-    0x47,
-    0xae,
-    0x66,
-    0xe8,
-    0x16,
-    0x5f,
-    0x35,
-    0x10,
-    0x1d,
-    0x09,
-    0x38,
-    0x46,
-    0x01,
-    0x0f,
-    0x55,
-    0xa4,
-    0x00,
-    0x04,
-    0xe1,
-    0x01,
-    0x27,
-    0x12,
-    0x6e,
-    0x73,
-    0xc5,
-    0x9c,
-    0xe4,
-    0x13,
-    0x1f,
-    0x22,
-    0xd4,
-    0x00,
-    0x65,
-    0x65,
-    0x08,
-    0xa7,
-    0xe5,
-    0xcc,
-    0x5f,
-    0x41,
-    0x7f,
-    0x07,
-    0xd8,
-    0x9c,
-    0x59,
-    0xf2,
-    0xec,
-    0x1f,
-    0xd4,
-    0xbc,
-    0x21,
-    0x09,
-    0xbe,
-    0x48,
-    0xdc,
-    0xf9,
-    0xc9,
-    0xd3,
-    0x76,
-    0xb3,
-    0x3b,
-    0xd8,
-    0x93,
-    0x21,
-    0xe8,
-    0x30,
-    0xaf,
-    0x98,
-    0x5d,
-    0x7e,
-    0xfa,
-    0x5d,
-    0x5f,
-    0xca,
-    0x66,
-    0x68,
-    0x94,
-    0x6c,
-    0xfe,
-    0x67,
-    0x7f,
-    0x2c,
-    0x79,
-    0x06,
-    0xb2,
-    0xa7,
-    0x0f,
-    0x6e,
-    0x3e,
-    0xf5,
-    0x8b,
-    0x0b,
-    0x6f,
-    0x88,
-    0xa2,
-    0x93,
-    0xb6,
-    0x57,
-    0x83,
-    0x44,
-    0xe7,
-    0x3c,
-    0xaf,
-    0x6d,
-    0xa4,
-    0x9b,
-    0x0b,
-    0x2f,
-    0x19,
-    0x45,
-    0x33,
-    0x85,
-    0xeb,
-    0x9c,
-    0x12,
-    0x82,
-    0x6a,
-    0xf7,
-    0xb0,
-    0xda,
-    0x0e,
-    0x48,
-    0x4a,
-    0xa4,
-    0x21,
-    0xfc,
-    0xa8,
-    0x5e,
-    0xb9,
-    0x22,
-    0xab,
-    0x32,
-    0xe9,
-    0xd0,
-    0x26,
-    0x77,
-    0x38,
-    0xc2,
-    0xee,
-    0x7b,
-    0x52,
-    0x45,
-    0x35,
-    0x80,
-    0xfe,
-    0x53,
-    0x13,
-    0x04,
-    0x50,
-    0x00,
-    0x66,
-    0x46,
-    0x20,
-    0x15,
-    0xdc,
-    0x05,
-    0xbb,
-    0xfa,
-    0x4e,
-    0x8b,
-    0xd7,
-    0xd9,
-    0x50,
-    0xea,
-    0xcd,
-    0x00,
-    0x06,
-    0x86,
-    0x02,
-    0x87,
-    0x39,
-    0xd3,
-    0xa6,
-    0x33,
-    0xa9,
-    0x60,
-    0xa2,
-    0x9b,
-    0xa5,
-    0x15,
-    0xcb,
-    0x89,
-    0xda,
-    0xb9,
-    0x5c,
-    0xa3,
-    0x69,
-    0xb6,
-    0xa3,
-    0x4b,
-    0x3c,
-    0x21,
-    0xfa,
-    0xc3,
-    0x99,
-    0xf5,
-    0xf9,
-    0x95,
-    0xf7,
-    0x9f,
-    0xea,
-    0x32,
-    0x11,
-    0xc0,
-    0x7d,
-    0xd9,
-    0x3a,
-    0x2e,
-    0xbe,
-    0xba,
-    0xf0,
-    0x3c,
-    0x43,
-    0x5c,
-    0xb3,
-    0x3b,
-    0xaa,
-    0x3c,
-    0x18,
-    0x40,
-    0x43,
-    0xb7,
-    0x19,
-    0x28,
-    0x09,
-    0x29,
-    0xaf,
-    0xda,
-    0xd7,
-    0x57,
-    0xa3,
-    0xcc,
-    0xd8,
-    0x0a,
-    0xa0,
-    0xc9,
-    0x40,
-    0xfd,
-    0x8e,
-    0xf1,
-    0x39,
-    0xf9,
-    0x1b,
-    0x01,
-    0x20,
-    0x3f,
-    0x9a,
-    0xd4,
-    0xf2,
-    0x26,
-    0x11,
-    0x2a,
-    0x01,
-    0x05,
-    0x8d,
-    0xa9,
-    0xec,
-    0x53,
-    0xb9,
-    0x21,
-    0xcd,
-    0x0d,
-    0xaf,
-    0x14,
-    0xb4,
-    0x58,
-    0x0e,
-    0x76,
-    0x55,
-    0x68,
-    0x4d,
-    0xb1,
-    0xfd,
-    0xa0,
-    0x4f,
-    0xec,
-    0xcb,
-    0xfb,
-    0x37,
-    0x8d,
-    0x1c,
-    0xaa,
-    0x7d,
-    0xfc,
-    0x47,
-    0xff,
-    0x42,
-    0xaa,
-    0x8b,
-    0x89,
-    0xe0,
-    0x53,
-    0x45,
-    0x81,
-    0xc6,
-    0x80,
-    0x66,
-    0x64,
-    0x83,
-    0x4f,
-    0x25,
-    0xe2,
-    0x20,
-    0x76,
-    0xf1,
-    0xf7,
-    0xb3,
-    0x86,
-    0xaa
-  ],
-  const [
-    0x16,
-    0x00,
-    0xa3,
-    0x49,
-    0x99,
-    0x0d,
-    0xf4,
-    0x2a,
-    0xba,
-    0x9f,
-    0xa0,
-    0x3f,
-    0x70,
-    0xde,
-    0xff,
-    0x0f,
-    0x75,
-    0xae,
-    0x35,
-    0xc1,
-    0xa8,
-    0x82,
-    0xb4,
-    0x8c,
-    0xaf,
-    0x75,
-    0x02,
-    0x6e,
-    0xe0,
-    0x97,
-    0xbd,
-    0x21,
-    0x62,
-    0x84,
-    0xdc,
-    0x4b,
-    0x8f,
-    0x3c,
-    0x37,
-    0xf5,
-    0x9d,
-    0x2e,
-    0x4a,
-    0x3e,
-    0x7e,
-    0x96,
-    0x35,
-    0x50,
-    0x04,
-    0x09,
-    0x08,
-    0x94,
-    0x49,
-    0x4e,
-    0x3e,
-    0x22,
-    0x4e,
-    0x70,
-    0x87,
-    0x7c,
-    0xe2,
-    0x11,
-    0xcb,
-    0x7b,
-    0xc6,
-    0x01,
-    0x6b,
-    0x89,
-    0x0e,
-    0x10,
-    0xca,
-    0x11,
-    0xca,
-    0x20,
-    0x0c,
-    0x34,
-    0xe6,
-    0x7e,
-    0x1d,
-    0xbe,
-    0x4f,
-    0x72,
-    0xf5,
-    0x58,
-    0x57,
-    0x14,
-    0x1b,
-    0xff,
-    0x5b,
-    0x62,
-    0x68,
-    0xb4,
-    0xa3,
-    0x90,
-    0x0e,
-    0x75,
-    0x89,
-    0x9f,
-    0xd9,
-    0x6d,
-    0xde,
-    0x31,
-    0xb4,
-    0x68,
-    0x89,
-    0x9c,
-    0x6e,
-    0x89,
-    0x71,
-    0x3d,
-    0xbe,
-    0x3f,
-    0x9e,
-    0x0f,
-    0x85,
-    0x75,
-    0x9b,
-    0x7b,
-    0x54,
-    0x09,
-    0x1e,
-    0x72,
-    0x2e,
-    0x80,
-    0xea,
-    0xba,
-    0x8f,
-    0xf8,
-    0xf5,
-    0x85,
-    0xac,
-    0x5d,
-    0xc6,
-    0x48,
-    0xfd,
-    0xe0,
-    0x22,
-    0xca,
-    0xf9,
-    0xa5,
-    0xe7,
-    0x7c,
-    0x21,
-    0xbc,
-    0x38,
-    0x08,
-    0x3f,
-    0x53,
-    0xda,
-    0x2c,
-    0xf0,
-    0x2a,
-    0xde,
-    0xc9,
-    0x60,
-    0x47,
-    0x81,
-    0x37,
-    0x55,
-    0xea,
-    0x50,
-    0xdc,
-    0x6f,
-    0xc3,
-    0x90,
-    0xfd,
-    0xae,
-    0x63,
-    0xdc,
-    0xd3,
-    0x34,
-    0xf1,
-    0x10,
-    0xe2,
-    0x4c,
-    0x1e,
-    0x66,
-    0x86,
-    0xac,
-    0x5a,
-    0xdf,
-    0xcf,
-    0xf7,
-    0x49,
-    0xe5,
-    0x8e,
-    0x86,
-    0x70,
-    0x2e,
-    0xb0,
-    0x68,
-    0x35,
-    0xe3,
-    0xcb,
-    0xa7,
-    0x06,
-    0x02,
-    0xf7,
-    0xcd,
-    0xd8,
-    0x01,
-    0xdf,
-    0xa7,
-    0xd3,
-    0xb4,
-    0x18,
-    0x49,
-    0x4b,
-    0x70,
-    0xb1,
-    0x52,
-    0xf3,
-    0x71,
-    0x0b,
-    0x72,
-    0x4d,
-    0x79,
-    0xea,
-    0x29,
-    0x65,
-    0xba,
-    0xcd,
-    0xd1,
-    0xbf,
-    0xf6,
-    0x7b,
-    0xde,
-    0x8e,
-    0xe5,
-    0xdf,
-    0x65,
-    0x26,
-    0xd7,
-    0x15,
-    0xdb,
-    0xb4,
-    0x9a,
-    0xc5,
-    0x20,
-    0x2d,
-    0x9e,
-    0xb0,
-    0xbb,
-    0x84,
-    0x57,
-    0x88,
-    0x68,
-    0x20,
-    0xe3,
-    0x05,
-    0xd0,
-    0x8d,
-    0xed,
-    0x35,
-    0x97,
-    0x72,
-    0xd1,
-    0x14,
-    0x9b,
-    0xc3,
-    0x00,
-    0x5c,
-    0x7b,
-    0x37,
-    0xa7,
-    0x9e,
-    0x57,
-    0xfd,
-    0x8b,
-    0x92,
-    0xd7,
-    0xab,
-    0x37,
-    0xac,
-    0x6f,
-    0x77,
-    0x5a,
-    0xef,
-    0xe1,
-    0xa9,
-    0x6b,
-    0x06,
-    0x03,
-    0x50,
-    0x8e,
-    0x91,
-    0xc2,
-    0x34,
-    0xbb,
-    0xbd,
-    0x67,
-    0x0d,
-    0x1d,
-    0x17,
-    0x19,
-    0xf2,
-    0xb8,
-    0xa2,
-    0xa3,
-    0x14,
-    0x4f,
-    0x26,
-    0x78,
-    0xac,
-    0x85,
-    0xcc,
-    0xf4,
-    0x32,
-    0x42,
-    0xe8,
-    0xe5,
-    0xd0,
-    0x58,
-    0x16,
-    0x4a,
-    0x16,
-    0x67,
-    0x88,
-    0x5b,
-    0xef,
-    0xfe,
-    0x9e,
-    0xc9,
-    0xd4,
-    0x02,
-    0xb7,
-    0x46,
-    0x3f,
-    0x54,
-    0x48,
-    0x48,
-    0x63,
-    0xae,
-    0x2b,
-    0x0a,
-    0x1a,
-    0xce,
-    0x39,
-    0xd4,
-    0x1f,
-    0xd7,
-    0x1a,
-    0x7d,
-    0x7d,
-    0xf4,
-    0x5c,
-    0x2e,
-    0x47,
-    0x3e,
-    0xc3,
-    0x68,
-    0x8a,
-    0xe0,
-    0xe0,
-    0x49,
-    0x80,
-    0x78,
-    0xe5,
-    0x0b,
-    0x06,
-    0xc1,
-    0xb8,
-    0xcd,
-    0x50,
-    0x70,
-    0x46,
-    0x96,
-    0xdc,
-    0x5b,
-    0x1a,
-    0x97,
-    0xa4,
-    0xe0,
-    0x2e,
-    0xb0,
-    0x98,
-    0x85,
-    0x01,
-    0x36,
-    0x4b,
-    0xdc,
-    0xe9,
-    0xf4,
-    0xed,
-    0xaa,
-    0xab,
-    0x6f,
-    0x79,
-    0x47,
-    0x49,
-    0x6f,
-    0x2f,
-    0x48,
-    0x1b,
-    0xba,
-    0x45,
-    0x5c,
-    0x21,
-    0x23,
-    0xda,
-    0x74,
-    0x98,
-    0xc3,
-    0x2b,
-    0x27,
-    0xcb,
-    0x87,
-    0x09,
-    0x54,
-    0x2c,
-    0xeb,
-    0x8b,
-    0x09,
-    0xa3,
-    0x04,
-    0x00,
-    0xa3,
-    0x26,
-    0xc4,
-    0x27,
-    0x37,
-    0x8a,
-    0x7a,
-    0xa3,
-    0x31,
-    0x99,
-    0x98,
-    0xa9,
-    0x3b,
-    0x64,
-    0xb9,
-    0xfc,
-    0x61,
-    0xdb,
-    0xe2,
-    0x1b,
-    0x72,
-    0x9a,
-    0x08,
-    0xb8,
-    0xa9,
-    0x06,
-    0xd3,
-    0x6d,
-    0x8c,
-    0x99,
-    0xa2,
-    0xab,
-    0x15,
-    0x7a,
-    0xcf,
-    0xf3,
-    0x10,
-    0x51,
-    0x34,
-    0x48,
-    0xc4,
-    0x59,
-    0xee,
-    0xe4,
-    0xd5,
-    0xb7,
-    0x60,
-    0x2a,
-    0x69,
-    0x0a,
-    0x7b,
-    0xdc,
-    0x8a,
-    0x43,
-    0x3d,
-    0x8e,
-    0xcc,
-    0xb7,
-    0x78,
-    0x5a,
-    0x2f,
-    0x72,
-    0xd5,
-    0xd6,
-    0x46,
-    0xce,
-    0x18,
-    0x43,
-    0x99,
-    0x45,
-    0xa6,
-    0x07,
-    0x49,
-    0x84,
-    0x44,
-    0x5e,
-    0xf2,
-    0xc0,
-    0x21,
-    0x4c,
-    0xd5,
-    0x4d,
-    0x17,
-    0xd6,
-    0x37,
-    0x6d,
-    0x2e,
-    0x71,
-    0x04,
-    0x66,
-    0x62,
-    0xbb,
-    0xb8,
-    0xd7,
-    0xa6,
-    0x69,
-    0x7f,
-    0x4b,
-    0x28,
-    0x80,
-    0x9b,
-    0x0f,
-    0xd7,
-    0xc9,
-    0x07,
-    0x41,
-    0x23,
-    0x7e,
-    0x5a,
-    0x2a,
-    0x03,
-    0x4a,
-    0xed,
-    0xce,
-    0x3d,
-    0x71,
-    0x40,
-    0xc0,
-    0xe2,
-    0x4a,
-    0x9a,
-    0x3b,
-    0x17,
-    0xf6,
-    0xf0,
-    0x6f,
-    0x1b,
-    0x4c,
-    0x08,
-    0x19,
-    0x86,
-    0x13,
-    0xdf,
-    0x56,
-    0xcf,
-    0x74,
-    0x47,
-    0xb9,
-    0x11,
-    0xae,
-    0xd4,
-    0x9b,
-    0x0f,
-    0x0c,
-    0xf9,
-    0xb2,
-    0x75,
-    0x15,
-    0x6f,
-    0xe6,
-    0x61,
-    0x02,
-    0xd6,
-    0x5f,
-    0x21,
-    0x75,
-    0x9f,
-    0xe3,
-    0x3f,
-    0x67,
-    0x29,
-    0x5f,
-    0xba,
-    0x62,
-    0x2a,
-    0xc3,
-    0x97,
-    0xf1,
-    0x51,
-    0x13,
-    0x98,
-    0x56,
-    0x2a,
-    0xbb,
-    0x4c,
-    0x7a,
-    0x41,
-    0x24,
-    0x48,
-    0x2a,
-    0x8a,
-    0x84,
-    0xb3,
-    0x7f,
-    0x00,
-    0xfa,
-    0x08,
-    0x9e,
-    0x8d,
-    0xda,
-    0x17,
-    0xa2,
-    0x2a,
-    0x46,
-    0x4d,
-    0xd7,
-    0x47,
-    0xfe,
-    0x36,
-    0x29,
-    0x6d,
-    0x78,
-    0x40,
-    0xdc,
-    0x22,
-    0x34,
-    0xc2,
-    0x7d,
-    0x0d,
-    0x4a,
-    0x3c,
-    0x18,
-    0x5a,
-    0x45,
-    0xe1,
-    0xab,
-    0x60,
-    0x33,
-    0x52,
-    0xdb,
-    0x81,
-    0xfd,
-    0xad,
-    0xe6,
-    0x52,
-    0xf5,
-    0xc6,
-    0xd9,
-    0xfc,
-    0xae,
-    0xb4,
-    0x03,
-    0xe3,
-    0x10,
-    0x90,
-    0xa9,
-    0x85,
-    0xab,
-    0x79,
-    0xfb,
-    0xa4,
-    0x4c,
-    0xdb,
-    0x47,
-    0xa7,
-    0xce,
-    0xf1,
-    0x6d,
-    0x3e,
-    0x33,
-    0x89,
-    0x93,
-    0x45,
-    0xf4,
-    0x08,
-    0x19,
-    0xeb,
-    0x94,
-    0xad,
-    0xcf,
-    0x13,
-    0x7b,
-    0x1a,
-    0x66,
-    0xfa,
-    0x02,
-    0x10,
-    0x25,
-    0x1a,
-    0xcb,
-    0x7a,
-    0xdd,
-    0x4f,
-    0x53,
-    0xad,
-    0x1f,
-    0x39,
-    0xca,
-    0xee,
-    0xac,
-    0xe1,
-    0x22,
-    0x34,
-    0x2d,
-    0x9f,
-    0x66,
-    0x30,
-    0x25,
-    0x3b,
-    0x4d,
-    0x8b,
-    0x23,
-    0x52,
-    0x0f,
-    0x6f,
-    0x3c,
-    0xfb,
-    0x77,
-    0x48,
-    0xb8,
-    0xab,
-    0x39,
-    0xcc,
-    0x0c,
-    0x56,
-    0x87,
-    0x39,
-    0x09,
-    0xd7,
-    0xdf,
-    0xdd,
-    0x52,
-    0x92,
-    0x27,
-    0xdc,
-    0x13,
-    0x58,
-    0xfb,
-    0x2e,
-    0xf0,
-    0x8b,
-    0x46,
-    0xe7,
-    0x3c,
-    0x82,
-    0x0f,
-    0xbb,
-    0x6c,
-    0x2e,
-    0x96,
-    0xc1,
-    0xcb,
-    0xfe,
-    0xa0,
-    0x77,
-    0x6f,
-    0x01,
-    0x0f,
-    0x07,
-    0x6b,
-    0x4b,
-    0xb5,
-    0xc8,
-    0x46,
-    0x99,
-    0x6a,
-    0x08,
-    0xac,
-    0x38,
-    0x5c,
-    0x09,
-    0x64,
-    0x22,
-    0xa7,
-    0x49,
-    0x82,
-    0x6b,
-    0x26,
-    0x06,
-    0xde,
-    0xdb,
-    0x88,
-    0x02,
-    0xc4,
-    0xdd,
-    0xa6,
-    0x84,
-    0xed,
-    0x97,
-    0x13,
-    0x9f,
-    0xae,
-    0x5b,
-    0xf5,
-    0xb6,
-    0x70,
-    0x3e,
-    0x14,
-    0x40,
-    0x60,
-    0x06,
-    0x31,
-    0xc9,
-    0x68,
-    0x4a,
-    0x99,
-    0x39,
-    0x5d,
-    0xd4,
-    0xfa,
-    0x59,
-    0x7a,
-    0x4a,
-    0x74,
-    0x93,
-    0x0d,
-    0x0e,
-    0xf3,
-    0xfa,
-    0x70,
-    0x62,
-    0xbd,
-    0x8a,
-    0x3b,
-    0xd0,
-    0x47,
-    0xb0,
-    0xb8,
-    0xc9,
-    0x4d,
-    0x0d,
-    0x97,
-    0x8c,
-    0x21,
-    0x77,
-    0xe3,
-    0x49,
-    0x44,
-    0x40,
-    0x35,
-    0x86,
-    0x33,
-    0xbb,
-    0x28,
-    0xc3,
-    0x83,
-    0xfd,
-    0x0c,
-    0x59,
-    0x30,
-    0xe1,
-    0xdf,
-    0xa8,
-    0x33,
-    0x4f,
-    0x79,
-    0x71,
-    0x52,
-    0xbd,
-    0x06,
-    0x81,
-    0x3c,
-    0xf5,
-    0xb9,
-    0x90,
-    0xd5,
-    0x19,
-    0xbf,
-    0x68,
-    0xcf,
-    0xe5,
-    0x72,
-    0x4a,
-    0x7a,
-    0x35,
-    0xd0,
-    0x8d,
-    0xdd,
-    0xc7,
-    0x2b,
-    0x88,
-    0x05,
-    0x41,
-    0x21,
-    0xb2,
-    0x9d,
-    0x76,
-    0xcf,
-    0x08,
-    0xbf,
-    0xe5,
-    0x42,
-    0xaf,
-    0x0a,
-    0x82,
-    0x2e,
-    0xdb,
-    0xf5,
-    0xba,
-    0xe3,
-    0xef,
-    0x62,
-    0xb1,
-    0x7c,
-    0xe6,
-    0x77,
-    0xce,
-    0x5a,
-    0xf1,
-    0xa9,
-    0x79,
-    0xd1,
-    0x61,
-    0x19,
-    0x23,
-    0x20,
-    0xc8,
-    0x24,
-    0x87,
-    0xa7,
-    0x5b,
-    0x35,
-    0x30,
-    0x54,
-    0x9b,
-    0xde,
-    0x3c,
-    0x5f,
-    0x35,
-    0x28,
-    0x5f,
-    0x37,
-    0x26,
-    0x27,
-    0x2b,
-    0xbc,
-    0x22,
-    0xd1,
-    0x8e,
-    0xae,
-    0x37,
-    0x10,
-    0x9c,
-    0x65,
-    0xae,
-    0x15,
-    0x8e,
-    0xc3,
-    0x32,
-    0xf0,
-    0x0b,
-    0x68,
-    0x34,
-    0x5d,
-    0xa7,
-    0x24,
-    0x8d,
-    0xe1,
-    0xaa,
-    0xb2,
-    0x65,
-    0x16,
-    0x12,
-    0xa3,
-    0x54,
-    0x43,
-    0xdb,
-    0x98,
-    0xc8,
-    0x30,
-    0x7d,
-    0xb4,
-    0xa7,
-    0x39,
-    0xb7,
-    0x51,
-    0x35,
-    0xa0,
-    0x8b,
-    0xf2,
-    0x37,
-    0x28,
-    0x8a,
-    0x79,
-    0x59,
-    0xdf,
-    0x51,
-    0x9b,
-    0xcd,
-    0x3b,
-    0x54,
-    0x90,
-    0x35,
-    0x68,
-    0xda,
-    0x0f,
-    0xc3,
-    0xe1,
-    0x49,
-    0x79,
-    0x9e,
-    0x3e,
-    0xa4,
-    0x55,
-    0x88,
-    0x4c,
-    0x52,
-    0xfc,
-    0xbf,
-    0x63,
-    0x21,
-    0x95,
-    0x20,
-    0xf4,
-    0x8a,
-    0x44,
-    0x92,
-    0x62,
-    0x37,
-    0x9f,
-    0xa2,
-    0x13,
-    0xc2,
-    0x62,
-    0x6b,
-    0xc6,
-    0xc0,
-    0x63,
-    0xb9,
-    0x27,
-    0xfe,
-    0xc8,
-    0x6e,
-    0xa0,
-    0x0a,
-    0x77,
-    0x24,
-    0x73,
-    0xf5,
-    0xce,
-    0x13,
-    0x06,
-    0x58,
-    0x95,
-    0x35,
-    0x7d,
-    0x95,
-    0x30,
-    0xa9,
-    0x8e,
-    0x5f,
-    0x19,
-    0x56,
-    0x91,
-    0x7d,
-    0x8e,
-    0xd0,
-    0xd7,
-    0xca,
-    0x87,
-    0x7f,
-    0x3d,
-    0x81,
-    0xeb,
-    0xfe,
-    0x01,
-    0xb7,
-    0x03,
-    0xc1,
-    0xd4,
-    0x29,
-    0x2f,
-    0xfb,
-    0x30,
-    0x38,
-    0xd8,
-    0xbe,
-    0xeb,
-    0x32,
-    0xa5,
-    0x64,
-    0x0d,
-    0xd3,
-    0xf2,
-    0x2f,
-    0xdf,
-    0x0c,
-    0x7e,
-    0x2c,
-    0x44,
-    0x02,
-    0x63,
-    0x5d,
-    0x4c,
-    0x5a,
-    0x4c,
-    0x16,
-    0x07,
-    0xb4,
-    0xe2,
-    0xa8,
-    0x97,
-    0x75,
-    0x87,
-    0x3d,
-    0x89,
-    0xca,
-    0x47,
-    0x03,
-    0x66,
-    0xea,
-    0x0b,
-    0x8d,
-    0x84,
-    0x9b,
-    0x10,
-    0x76,
-    0x22,
-    0xf7,
-    0x98,
-    0x47,
-    0xb4,
-    0x70,
-    0xe0,
-    0x9a,
-    0x7c,
-    0x12,
-    0x51,
-    0x80,
-    0x5a,
-    0x08,
-    0xfa,
-    0x21,
-    0xe5,
-    0x62,
-    0x3e,
-    0xa2,
-    0xba,
-    0x15,
-    0xca,
-    0x4c,
-    0x15,
-    0x43,
-    0xcb,
-    0xea,
-    0x9e,
-    0xbd,
-    0x5d,
-    0x72,
-    0x85,
-    0xc7,
-    0x46,
-    0xe8,
-    0xd0,
-    0x1b,
-    0xe4,
-    0x80,
-    0xf4,
-    0x30,
-    0x64,
-    0x03,
-    0xa3,
-    0xbb,
-    0x35,
-    0x73,
-    0xe6,
-    0x77,
-    0xbc,
-    0xf2,
-    0x6b,
-    0x21,
-    0x4a,
-    0xe0,
-    0x20,
-    0xc7,
-    0x4b,
-    0x44,
-    0x01,
-    0x43,
-    0xc0,
-    0x6d,
-    0x2d,
-    0x03,
-    0xef,
-    0xd9,
-    0x40,
-    0x0b,
-    0x58,
-    0x55,
-    0xdd,
-    0x3c,
-    0xec,
-    0x66,
-    0x8a,
-    0xd6,
-    0x7a,
-    0xe8,
-    0xc1,
-    0x3c,
-    0x6a,
-    0xf5,
-    0x43,
-    0xf7,
-    0xad,
-    0x08,
-    0xb0,
-    0xfe,
-    0xf4,
-    0x62,
-    0x55,
-    0x34,
-    0x20,
-    0xad,
-    0x45,
-    0x33,
-    0xfa,
-    0xe0,
-    0xab,
-    0x48,
-    0x25,
-    0x62,
-    0x5e,
-    0xbe,
-    0x51,
-    0x72,
-    0xb6,
-    0x60,
-    0xb0,
-    0xc6,
-    0x9f,
-    0x39,
-    0xae,
-    0x72,
-    0xeb,
-    0x9e,
-    0xdd,
-    0x0c,
-    0xed,
-    0x6f,
-    0x2e,
-    0x0e,
-    0x43,
-    0x99,
-    0x67,
-    0x7b,
-    0xf3,
-    0xdf,
-    0xd1,
-    0xc6,
-    0xba,
-    0xdb,
-    0x31,
-    0xef,
-    0xa0,
-    0x3f,
-    0xfa,
-    0xef,
-    0xd0,
-    0x61,
-    0xc1,
-    0x56,
-    0xa7,
-    0xf7,
-    0xf1,
-    0x33,
-    0x0b,
-    0x1e,
-    0xc0,
-    0x34,
-    0xfe,
-    0xa2,
-    0x62,
-    0x0e,
-    0x72,
-    0x79,
-    0x7c,
-    0x1f,
-    0x5f,
-    0x90,
-    0xdb,
-    0x52,
-    0x14,
-    0xcb,
-    0x66,
-    0x44,
-    0xcb,
-    0x47,
-    0x51,
-    0xa5,
-    0x7f,
-    0xe2,
-    0x94,
-    0xe0,
-    0x02,
-    0xfd,
-    0x9c,
-    0xfe,
-    0x4a,
-    0x80,
-    0x40,
-    0xc7,
-    0x0b,
-    0x1f,
-    0xf6,
-    0x2b,
-    0x8c,
-    0xdc,
-    0x47,
-    0xe1,
-    0xb3,
-    0xcd,
-    0x80,
-    0x4e,
-    0x61,
-    0x20,
-    0xab,
-    0xa8,
-    0x06,
-    0x5c,
-    0xbd,
-    0x5b,
-    0x6c,
-    0xe9,
-    0x11,
-    0xac,
-    0xd7,
-    0xd3,
-    0x15,
-    0x9c,
-    0x50,
-    0xcb,
-    0x44,
-    0x0f,
-    0x3e,
-    0x6f,
-    0x54,
-    0x2d,
-    0x36,
-    0xcb,
-    0xb0,
-    0x09,
-    0x14,
-    0x1f,
-    0x28,
-    0x80,
-    0x4b,
-    0xe2,
-    0xe7,
-    0x65,
-    0x79,
-    0x08,
-    0xa6,
-    0xdb,
-    0x3f,
-    0x81,
-    0x20,
-    0x01,
-    0x4f,
-    0x02,
-    0xc6,
-    0xd5,
-    0xc6,
-    0x07,
-    0xb3,
-    0x52,
-    0xbd,
-    0x19,
-    0xe2,
-    0xdc,
-    0x1a,
-    0x4c,
-    0x9f,
-    0xde,
-    0xac,
-    0x0d,
-    0x3b,
-    0xb2,
-    0x78,
-    0x1a,
-    0x04,
-    0xc1,
-    0x4d,
-    0xd2,
-    0x74,
-    0xeb,
-    0x9f,
-    0xaf,
-    0xa9,
-    0x29,
-    0x92,
-    0x11,
-    0x15,
-    0x70,
-    0x54,
-    0x3d,
-    0x77,
-    0xd9,
-    0xb0,
-    0xa5,
-    0x0a,
-    0x00,
-    0xe0,
-    0x6a,
-    0xfc,
-    0xa9,
-    0xa3,
-    0x1f,
-    0x21,
-    0xaa,
-    0x90,
-    0xd0,
-    0xe9,
-    0x05,
-    0xaa,
-    0x42,
-    0x90,
-    0x54,
-    0x34,
-    0x7d,
-    0x94,
-    0x6a,
-    0xc7,
-    0x88,
-    0x6c,
-    0x37,
-    0xa1,
-    0x74,
-    0x77,
-    0xec,
-    0x40,
-    0x9b,
-    0x33,
-    0x60,
-    0x30,
-    0x2a,
-    0xaf,
-    0xb2,
-    0x21,
-    0xdd,
-    0x43,
-    0x31,
-    0x3c,
-    0x0a,
-    0x7e,
-    0x78,
-    0xb7,
-    0xe1,
-    0x60,
-    0xdd,
-    0xa7,
-    0xf2,
-    0xc9,
-    0x0d,
-    0x16,
-    0xf0,
-    0x32,
-    0xf0,
-    0x56,
-    0xb4,
-    0x9b,
-    0xd3,
-    0x94,
-    0x84,
-    0xc4,
-    0xc5,
-    0xb0,
-    0x96,
-    0xa0,
-    0x41,
-    0x4d,
-    0xd0,
-    0x07,
-    0x0e,
-    0x24,
-    0xd2,
-    0xab,
-    0x64,
-    0x9d,
-    0x36,
-    0x4d,
-    0x50,
-    0xa0,
-    0x16,
-    0x31,
-    0x59,
-    0xa8,
-    0xcf,
-    0xcf,
-    0x64,
-    0x1a,
-    0x05,
-    0xcb,
-    0xd5,
-    0xd6,
-    0xe8,
-    0x27,
-    0xf7,
-    0x0b,
-    0xb5,
-    0xb8,
-    0x9e,
-    0x4f,
-    0x7f,
-    0xd6,
-    0x0b,
-    0xef,
-    0x2f,
-    0x58,
-    0x0f,
-    0x83,
-    0xca,
-    0xc0,
-    0x74,
-    0xc6,
-    0xf2,
-    0xb2,
-    0x98,
-    0xa5,
-    0xb0,
-    0xab,
-    0x5b,
-    0x96,
-    0x70,
-    0xef,
-    0x3b,
-    0x2b,
-    0x4d,
-    0xc3,
-    0xbe,
-    0xe7,
-    0x8f,
-    0xdd,
-    0x11,
-    0x50,
-    0x72,
-    0x19,
-    0xee,
-    0x45,
-    0x2a,
-    0x6d,
-    0xc2,
-    0x92,
-    0x23,
-    0x1f,
-    0x10,
-    0xc2,
-    0x8d,
-    0x35,
-    0x10,
-    0x35,
-    0x18,
-    0x2e,
-    0x9d,
-    0x72,
-    0xfc,
-    0xef,
-    0x4e,
-    0xbd,
-    0x3d,
-    0x00,
-    0xe2,
-    0xed,
-    0x2d,
-    0xf8,
-    0xe1,
-    0x78,
-    0x32,
-    0x36,
-    0x80,
-    0xd0,
-    0xc9,
-    0xd2,
-    0xc5,
-    0xf2,
-    0xcb,
-    0xd3,
-    0xed,
-    0x3b,
-    0xf0,
-    0xa3,
-    0x0b,
-    0x7e,
-    0x91,
-    0xc0,
-    0xf1,
-    0x55,
-    0xb2,
-    0xb3,
-    0x53,
-    0xb4,
-    0x3f,
-    0x46,
-    0x2a,
-    0xc4,
-    0x96,
-    0xf2,
-    0x57,
-    0xee,
-    0x46,
-    0x97,
-    0x89,
-    0x35,
-    0x16,
-    0x70,
-    0x60,
-    0xca,
-    0x4a,
-    0x45,
-    0xd3,
-    0xda,
-    0x21,
-    0xe2,
-    0xcf,
-    0xab,
-    0xa2,
-    0xc9,
-    0x20,
-    0xe7,
-    0x98,
-    0x24,
-    0x95,
-    0x38,
-    0xdc,
-    0xfd,
-    0x5f,
-    0x14,
-    0xd2,
-    0xb1,
-    0xbb,
-    0xdb,
-    0x36,
-    0xa2,
-    0xd1,
-    0x1f,
-    0x19,
-    0x2d,
-    0xdb,
-    0x42,
-    0x26,
-    0xdc,
-    0x89,
-    0x47,
-    0x2a,
-    0xdc,
-    0xa4,
-    0xe2,
-    0xd4,
-    0xb1,
-    0xf3,
-    0xd1,
-    0xb9,
-    0x28,
-    0x5b,
-    0x6f,
-    0x9a,
-    0x8d,
-    0x49,
-    0x87,
-    0xea,
-    0x1f,
-    0x55,
-    0x66,
-    0x8b,
-    0xc1,
-    0x1f,
-    0x34,
-    0xd9,
-    0xf2,
-    0x7d,
-    0x84,
-    0xe9,
-    0xff,
-    0xd9,
-    0x29,
-    0x12,
-    0x77,
-    0xd4,
-    0x4b,
-    0xad,
-    0xe0,
-    0x2f,
-    0xbb,
-    0x1a,
-    0xa8,
-    0xec,
-    0x84,
-    0x04,
-    0x5f,
-    0xb0,
-    0xc3,
-    0xe5,
-    0x23,
-    0x6c,
-    0xb8,
-    0xcc,
-    0x5b,
-    0x3c,
-    0x1c,
-    0x5e,
-    0xa8,
-    0x90,
-    0xb5,
-    0x1a,
-    0x18,
-    0x89,
-    0x29,
-    0xe2,
-    0x9d,
-    0xa6,
-    0x10,
-    0xb7,
-    0xbe,
-    0x9f,
-    0x4c,
-    0xc5,
-    0x8d,
-    0x91,
-    0x9d,
-    0x9f,
-    0xd9,
-    0x5c,
-    0x70,
-    0xcb,
-    0xa4,
-    0x49,
-    0xf8,
-    0x81,
-    0xd7,
-    0xf1,
-    0x80,
-    0xb0,
-    0x35,
-    0x5a,
-    0x00,
-    0x42,
-    0x8e,
-    0x62,
-    0xee,
-    0xa1,
-    0x35,
-    0x61,
-    0x56,
-    0x7a,
-    0xb4,
-    0x0a,
-    0x2d,
-    0xc1,
-    0xbd,
-    0x92,
-    0xe3,
-    0xf5,
-    0x64,
-    0x15,
-    0x37,
-    0xa5,
-    0x8c,
-    0x35,
-    0x4f,
-    0x33,
-    0x9f,
-    0x04,
-    0x08,
-    0xd8,
-    0x83,
-    0x24,
-    0x8b,
-    0xe8,
-    0xc9,
-    0x2c,
-    0x21,
-    0x57,
-    0x27,
-    0x4e,
-    0x48,
-    0x7d,
-    0x28,
-    0x37,
-    0x06,
-    0x16,
-    0x22,
-    0x37,
-    0x7d,
-    0x8d,
-    0x69,
-    0xa2,
-    0xc0,
-    0x7a,
-    0xc2,
-    0x76,
-    0xe5,
-    0x69,
-    0x1a,
-    0x3d,
-    0x5b,
-    0xdd,
-    0x78,
-    0x35,
-    0x7e,
-    0x94,
-    0x31,
-    0xaf,
-    0x69,
-    0x0d,
-    0x5b,
-    0xb5,
-    0x0b,
-    0x48,
-    0x83,
-    0xef,
-    0x7e,
-    0xcd,
-    0xa3,
-    0xc8,
-    0x93,
-    0xef,
-    0x4e,
-    0xcc,
-    0xb2,
-    0x52,
-    0x2e,
-    0x54,
-    0xe1,
-    0xab,
-    0xb0,
-    0x66,
-    0x22,
-    0xc7,
-    0xfe,
-    0xd7,
-    0x02,
-    0xcf,
-    0x2e,
-    0xb2,
-    0x6f,
-    0xca,
-    0xb8,
-    0xde,
-    0xca,
-    0x63,
-    0x2e,
-    0xfa,
-    0x3d,
-    0xec,
-    0x27,
-    0x8c,
-    0x4f,
-    0xa4,
-    0x7d,
-    0x5b,
-    0xb5,
-    0x35,
-    0xb8,
-    0x19,
-    0x6b,
-    0x81,
-    0xc9,
-    0x45,
-    0x04,
-    0x9e,
-    0xfc,
-    0x50,
-    0x3f,
-    0x1f,
-    0x28,
-    0xff,
-    0xda,
-    0x96,
-    0x28,
-    0x10,
-    0xab,
-    0x57,
-    0x8f,
-    0x20,
-    0xec,
-    0x7e,
-    0x98,
-    0xcc,
-    0xd7,
-    0x33,
-    0x5c,
-    0x17,
-    0x73,
-    0x2c,
-    0x48,
-    0x0b,
-    0xad,
-    0x74,
-    0xcd,
-    0xa4,
-    0xaa,
-    0x6b,
-    0x59,
-    0xe9,
-    0x5c,
-    0x0f,
-    0x87,
-    0x5c,
-    0x53,
-    0x79,
-    0x93,
-    0x94,
-    0xd6,
-    0xaa,
-    0x10,
-    0x29,
-    0x33,
-    0x88,
-    0xdd,
-    0xd0,
-    0x53,
-    0x24,
-    0x55,
-    0xc7,
-    0x91,
-    0x3e,
-    0xc6,
-    0x74,
-    0xcc,
-    0x0b,
-    0x24,
-    0x49,
-    0xbb,
-    0x36,
-    0xff,
-    0xea,
-    0x81,
-    0x24,
-    0xb3,
-    0x92,
-    0x82,
-    0x7c,
-    0xdf,
-    0xb3,
-    0x74,
-    0xe7,
-    0x18,
-    0xdc,
-    0xb9,
-    0x14,
-    0xde,
-    0xe0,
-    0xec,
-    0x00,
-    0xce,
-    0x35,
-    0xba,
-    0x74,
-    0x1a,
-    0x9a,
-    0xf3,
-    0xcf,
-    0x37,
-    0xfc,
-    0xe0,
-    0x05,
-    0xd5,
-    0x9b,
-    0xd8,
-    0xe8,
-    0x14,
-    0x69,
-    0x0e,
-    0xa6,
-    0xf5,
-    0xb2,
-    0xad,
-    0x93,
-    0x0e,
-    0x02,
-    0x27,
-    0x29,
-    0x83,
-    0x44,
-    0xc9,
-    0x4d,
-    0x31,
-    0x27,
-    0x94,
-    0xd4,
-    0x2c,
-    0xc6,
-    0x48,
-    0x46,
-    0x6c,
-    0x87,
-    0xc1,
-    0xe2,
-    0xc3,
-    0x43,
-    0x86,
-    0xe2,
-    0x12,
-    0xa8,
-    0xa0,
-    0x00,
-    0xbd,
-    0xdc,
-    0xa8,
-    0x38,
-    0x5c,
-    0x63,
-    0x24,
-    0xd0,
-    0xb4,
-    0x43,
-    0x14,
-    0x96,
-    0xe5,
-    0x66,
-    0xc7,
-    0x69,
-    0xe4,
-    0x3f,
-    0xf3,
-    0xfa,
-    0x2c,
-    0xb1,
-    0x05,
-    0xd4,
-    0xb1,
-    0x2c,
-    0xb6,
-    0x9a,
-    0x16,
-    0x19,
-    0xdf,
-    0x90,
-    0x1f,
-    0x78,
-    0x8e,
-    0x5d,
-    0x69,
-    0xc7,
-    0x59,
-    0x10,
-    0x59,
-    0x26,
-    0xf2,
-    0x60,
-    0x52,
-    0xba,
-    0xfc,
-    0x38,
-    0x2b,
-    0x4f,
-    0x1d,
-    0x73,
-    0xe0,
-    0x41,
-    0x55,
-    0xe4,
-    0x87,
-    0x9c,
-    0x8e,
-    0x99,
-    0x86,
-    0x82,
-    0x74,
-    0x60,
-    0x04,
-    0xcd,
-    0x86,
-    0x8b,
-    0x9d,
-    0xf6,
-    0x6d,
-    0xf1,
-    0x5a,
-    0x36,
-    0x8d,
-    0x35,
-    0xe0,
-    0xea,
-    0xdb,
-    0x4b,
-    0xe7,
-    0x3c,
-    0xee,
-    0x37,
-    0xee,
-    0x00,
-    0x58,
-    0x18,
-    0x2d,
-    0xdc,
-    0x36,
-    0x66,
-    0xcc,
-    0xac,
-    0x06,
-    0x78,
-    0x52,
-    0x24,
-    0xb9,
-    0x49,
-    0x60,
-    0xb7,
-    0x09,
-    0x7b,
-    0x9f,
-    0xb8,
-    0x0d,
-    0x9c,
-    0xf7,
-    0xc0,
-    0x0b,
-    0xa9,
-    0x02,
-    0x4f,
-    0x8d,
-    0xd0,
-    0xc0,
-    0xb6,
-    0xb7,
-    0x7a,
-    0x8c,
-    0x34,
-    0xd7,
-    0x89,
-    0x4e,
-    0x5f,
-    0x3e,
-    0xde,
-    0xf3,
-    0xc5,
-    0x4f,
-    0x1f,
-    0x1a,
-    0xd4,
-    0xd5,
-    0xb7,
-    0x10,
-    0xf7,
-    0x9a,
-    0x1e,
-    0xff,
-    0x02,
-    0x35,
-    0x5a,
-    0x62,
-    0xd0,
-    0x23,
-    0xc6,
-    0xbc,
-    0x2a,
-    0x19,
-    0x12,
-    0x8a,
-    0xeb,
-    0x99,
-    0x8b,
-    0x76,
-    0x62,
-    0xc4,
-    0x9c,
-    0xcd,
-    0xf8,
-    0x6f,
-    0x95,
-    0x33,
-    0x13,
-    0x78,
-    0xac,
-    0x96,
-    0x3a,
-    0x5a,
-    0x42,
-    0x60,
-    0x79,
-    0x00,
-    0x67,
-    0xf1,
-    0x07,
-    0xd7,
-    0x9f,
-    0x4c,
-    0x26,
-    0x27,
-    0xe6,
-    0x10,
-    0x4b,
-    0xa3,
-    0xf3,
-    0xab,
-    0x7f,
-    0x3f,
-    0xba,
-    0xca,
-    0x05,
-    0x41,
-    0x34,
-    0x13,
-    0x3d,
-    0x9b,
-    0x62,
-    0x17,
-    0xc8,
-    0x78,
-    0x90,
-    0x82,
-    0xed,
-    0x15,
-    0xd7,
-    0x95,
-    0x3b,
-    0xd2,
-    0xe5,
-    0xd7,
-    0x70,
-    0x89,
-    0x01,
-    0x07,
-    0x9a,
-    0x1e,
-    0x49,
-    0x54,
-    0x7c,
-    0x57,
-    0x3e,
-    0xd1,
-    0x33,
-    0xee,
-    0x83,
-    0x23,
-    0x1a,
-    0xe5,
-    0xe2,
-    0x7c,
-    0xea,
-    0x1a,
-    0x90,
-    0xce,
-    0x26,
-    0x1b,
-    0xb2,
-    0x38,
-    0xb6,
-    0x3b,
-    0x1f,
-    0xc5,
-    0xd1,
-    0xe6,
-    0x68,
-    0x55,
-    0x21,
-    0x31,
-    0x16,
-    0xdb,
-    0x22,
-    0xb5,
-    0x32,
-    0xc9,
-    0xcc,
-    0x9e,
-    0x0b,
-    0xc9,
-    0x71,
-    0xff,
-    0x33,
-    0xae,
-    0xe8,
-    0x69,
-    0xcb,
-    0xaa,
-    0xeb,
-    0xbb,
-    0x00,
-    0xc1,
-    0xbe,
-    0x3b,
-    0xd6,
-    0x7d,
-    0x11,
-    0xe6,
-    0x25,
-    0xe4,
-    0x28,
-    0x05,
-    0xe0,
-    0xa7,
-    0x39,
-    0x01,
-    0x9d,
-    0x9c,
-    0x16,
-    0x78,
-    0x52,
-    0x6e,
-    0x0b,
-    0x90,
-    0x5d,
-    0x94,
-    0x0a,
-    0x8c,
-    0xc8,
-    0x7f,
-    0x05,
-    0x9d,
-    0xca,
-    0x18,
-    0x9c,
-    0xfa,
-    0x91,
-    0x69,
-    0xf8,
-    0x32,
-    0x3e,
-    0x9a,
-    0xf7,
-    0xc1,
-    0x32,
-    0x20,
-    0x89,
-    0xe2,
-    0x88,
-    0x31,
-    0x5a,
-    0xa5,
-    0xe2,
-    0x7b,
-    0xb1,
-    0x41,
-    0x69,
-    0x15,
-    0x98,
-    0xab,
-    0x0f,
-    0xb6,
-    0x3d,
-    0x68,
-    0x18,
-    0x25,
-    0x98,
-    0x9f,
-    0xd8,
-    0xf0,
-    0x4e,
-    0x72,
-    0xbe,
-    0x61,
-    0xd5,
-    0x8e,
-    0x91,
-    0xae,
-    0xd9,
-    0x01,
-    0xfa,
-    0x70,
-    0xdf,
-    0x4d,
-    0x43,
-    0x56,
-    0x29,
-    0xba,
-    0x5e,
-    0x1b,
-    0xd9,
-    0xf0,
-    0x29,
-    0xb5,
-    0x59,
-    0xc4,
-    0xf0,
-    0xd0,
-    0xf9,
-    0x53,
-    0x33,
-    0x7a,
-    0xda,
-    0x4d,
-    0xaa,
-    0x20,
-    0x0c,
-    0x94,
-    0x87,
-    0xb9,
-    0xf3,
-    0x06,
-    0xfb,
-    0x41,
-    0xef,
-    0x96,
-    0xfb,
-    0x69,
-    0x3b,
-    0xa2,
-    0x44,
-    0x8d,
-    0x16,
-    0x81,
-    0x9d,
-    0xe6,
-    0x21,
-    0x5b,
-    0x5c,
-    0x01,
-    0x09,
-    0x3d,
-    0x2b,
-    0x6f,
-    0x65,
-    0x6c,
-    0x0c,
-    0xbf,
-    0xe2,
-    0xfa,
-    0x9b,
-    0xa9,
-    0x9d,
-    0x98,
-    0x93,
-    0x8c,
-    0xd0,
-    0xab,
-    0x94,
-    0x1b,
-    0xb1,
-    0xa2,
-    0x24,
-    0x52,
-    0x97,
-    0x86,
-    0xf3,
-    0xb0,
-    0x5f,
-    0xd2,
-    0x63,
-    0xa0,
-    0x0e,
-    0x86,
-    0x47,
-    0x38,
-    0xb7,
-    0x77,
-    0xeb,
-    0x25,
-    0xa0,
-    0xe9,
-    0x56,
-    0xe6,
-    0xa0,
-    0x5f,
-    0xcb,
-    0x39,
-    0xcb,
-    0xb2,
-    0x96,
-    0xd3,
-    0x52,
-    0x61,
-    0x05,
-    0x54,
-    0xa4,
-    0x28,
-    0xb4,
-    0x7a,
-    0xd9,
-    0xd4,
-    0x0d,
-    0x95,
-    0x51,
-    0x55,
-    0x10,
-    0x3b,
-    0x98,
-    0x15,
-    0x50,
-    0x3c,
-    0x8d,
-    0x88,
-    0x3e,
-    0xd8,
-    0xc4,
-    0x05,
-    0xaa,
-    0x30,
-    0x28,
-    0xd4,
-    0x87,
-    0xfb,
-    0xe5,
-    0x88,
-    0xef,
-    0x7a,
-    0x85,
-    0x8e,
-    0x67,
-    0xae,
-    0x58,
-    0x07,
-    0x63,
-    0xc8,
-    0x1a,
-    0xd3,
-    0x0d,
-    0xe1,
-    0xd0,
-    0xee,
-    0x42,
-    0xeb,
-    0xf3,
-    0x00,
-    0xdd,
-    0xe8,
-    0xd0,
-    0x2f,
-    0x39,
-    0x5a,
-    0x2f,
-    0x38,
-    0xf1,
-    0xfa,
-    0x33,
-    0xbe,
-    0xea,
-    0xac,
-    0x81,
-    0xe2,
-    0x94,
-    0xb3,
-    0xa4,
-    0x13,
-    0x6c,
-    0x21,
-    0xb1,
-    0x27,
-    0xc6,
-    0x92,
-    0x26,
-    0xab,
-    0xc9,
-    0x1a,
-    0x18,
-    0x78,
-    0xbb,
-    0x7c,
-    0x8e,
-    0x87,
-    0x7f,
-    0x9d,
-    0x28,
-    0x07,
-    0x5b,
-    0x38,
-    0x04,
-    0xac,
-    0xff,
-    0xd2,
-    0xe1,
-    0x49,
-    0xc3,
-    0xf1,
-    0x85,
-    0xa1,
-    0x31,
-    0x89,
-    0x5d,
-    0x7b,
-    0xc3,
-    0xb7,
-    0x64,
-    0xf4,
-    0xed,
-    0xb1,
-    0x45,
-    0x19,
-    0x5e,
-    0xfe,
-    0xc4,
-    0xb5,
-    0x84,
-    0xe2,
-    0x5a,
-    0x68,
-    0x4e,
-    0x1d,
-    0x1f,
-    0xf9,
-    0x35,
-    0xd5,
-    0xee,
-    0xed,
-    0x7d,
-    0xd0,
-    0xc3,
-    0x59,
-    0xb8,
-    0xe6,
-    0x67,
-    0xf4,
-    0x8d,
-    0xb6,
-    0x50,
-    0x70,
-    0xb7,
-    0x99,
-    0xc2,
-    0x0b,
-    0x50,
-    0xd4,
-    0x3b,
-    0x61,
-    0x50,
-    0x12,
-    0x0e,
-    0x84,
-    0x51,
-    0x11,
-    0x4e,
-    0x4e,
-    0x95,
-    0x9b,
-    0xed,
-    0xf6,
-    0x49,
-    0xb8,
-    0x25,
-    0xe2,
-    0x0b,
-    0x22,
-    0x17,
-    0xbc,
-    0xab,
-    0xf9,
-    0xb3,
-    0xc8,
-    0x2e,
-    0xb8,
-    0xd7,
-    0x75,
-    0x19,
-    0x68,
-    0xbb,
-    0x32,
-    0xec,
-    0x13,
-    0x8c,
-    0x82,
-    0xec,
-    0x7c,
-    0x57,
-    0x53,
-    0x25,
-    0x0d,
-    0x29,
-    0x8c,
-    0xb0,
-    0x11,
-    0x75,
-    0xe5,
-    0x32,
-    0x23,
-    0xb5,
-    0xfb,
-    0xa5,
-    0xe6,
-    0x54,
-    0xa4,
-    0x5b,
-    0xf7,
-    0xcc,
-    0x7f,
-    0x3f,
-    0x20,
-    0x0c,
-    0xd0,
-    0x5f,
-    0xcf,
-    0x1c,
-    0x8b,
-    0xa7,
-    0xc6,
-    0x03,
-    0xaf,
-    0xef,
-    0x13,
-    0xe9,
-    0xd5,
-    0x39,
-    0x43,
-    0x79,
-    0x09,
-    0x33,
-    0xd3,
-    0x89,
-    0xd8,
-    0x04,
-    0xe7,
-    0xfd,
-    0xaa,
-    0x44,
-    0x3e,
-    0xe8,
-    0x53,
-    0x4c,
-    0x66,
-    0xf5,
-    0xe4,
-    0xb1,
-    0x2c,
-    0x06,
-    0xc7,
-    0x0b,
-    0x57,
-    0x1a,
-    0x0b,
-    0xfb,
-    0x96,
-    0x74,
-    0xfc,
-    0x6c,
-    0xb6,
-    0xfa,
-    0xf7,
-    0x18,
-    0x18,
-    0xdb,
-    0x7c,
-    0x4e,
-    0x63,
-    0x74,
-    0x85,
-    0xf3,
-    0x76,
-    0x75,
-    0x16,
-    0xc8,
-    0xa1,
-    0x3f,
-    0x16,
-    0xea,
-    0x14,
-    0x91,
-    0x5d,
-    0x9f,
-    0x97,
-    0x64,
-    0x0e,
-    0x4f,
-    0x7c,
-    0x13,
-    0x27,
-    0xd1,
-    0xd2,
-    0xbf,
-    0x56,
-    0xe9,
-    0xdc,
-    0xf2,
-    0x0f,
-    0x0e,
-    0xc2,
-    0x82,
-    0xdb,
-    0x70,
-    0x85,
-    0xb9,
-    0xf3,
-    0x39,
-    0x38,
-    0xb2,
-    0x0d,
-    0x13,
-    0x6e,
-    0x06,
-    0x76,
-    0xeb,
-    0xef,
-    0xa9,
-    0x61,
-    0xf5,
-    0xaf,
-    0x0e,
-    0x7f,
-    0xf1,
-    0x00,
-    0x92,
-    0xcf,
-    0xac,
-    0x06,
-    0x17,
-    0xb8,
-    0xc9,
-    0x6b,
-    0xef,
-    0x55,
-    0xc1,
-    0x55,
-    0xfd,
-    0x10,
-    0x29,
-    0x95,
-    0x16,
-    0x72,
-    0x34,
-    0x22,
-    0xad,
-    0x39,
-    0x78,
-    0xc5,
-    0xb0,
-    0xab,
-    0xf5,
-    0x15,
-    0xad,
-    0x2b,
-    0x53,
-    0xa6,
-    0x39,
-    0x0a,
-    0x6b,
-    0x7e,
-    0x92,
-    0x9f,
-    0x09,
-    0xc8,
-    0x83,
-    0x9a,
-    0xf0,
-    0xcd,
-    0x88,
-    0x95,
-    0x1f,
-    0x1f,
-    0x33,
-    0xec,
-    0x53,
-    0x17,
-    0xce,
-    0xcf,
-    0xcd,
-    0x82,
-    0x42,
-    0x95,
-    0x55,
-    0x98,
-    0x38,
-    0x53,
-    0x7f,
-    0x2e,
-    0x7d,
-    0xae,
-    0x2d,
-    0x2c,
-    0xab,
-    0xed,
-    0x55,
-    0x40,
-    0x06,
-    0x53,
-    0x05,
-    0xd4,
-    0xa4,
-    0xab,
-    0xa4,
-    0x3e,
-    0xd1,
-    0x24,
-    0x7a,
-    0x37,
-    0xb1,
-    0x5f,
-    0x73,
-    0x8f,
-    0x27,
-    0xc7,
-    0x1f,
-    0x1f,
-    0xf6,
-    0x21,
-    0xfe,
-    0xfe,
-    0x26,
-    0x63,
-    0xfb,
-    0xf8,
-    0xaa,
-    0xca,
-    0x36,
-    0x3b,
-    0x3f,
-    0x27,
-    0x06,
-    0x54,
-    0x97,
-    0x7a,
-    0x3f,
-    0x5a,
-    0xb7,
-    0xc1,
-    0xb0,
-    0x69,
-    0x9e,
-    0x12,
-    0xf0,
-    0x52,
-    0x27,
-    0xe8,
-    0x5b,
-    0x91,
-    0x30,
-    0xbb,
-    0x57,
-    0x80,
-    0xfc,
-    0xd3,
-    0xdc,
-    0xca,
-    0xd6,
-    0x5d,
-    0x33,
-    0x21,
-    0xf7,
-    0xbf,
-    0xfd,
-    0x34,
-    0xaa,
-    0x29,
-    0x78,
-    0xdb,
-    0xae,
-    0x6c,
-    0xfe,
-    0x95,
-    0xdc,
-    0x10,
-    0xce,
-    0x35,
-    0x09,
-    0xa0,
-    0x0f,
-    0xd8,
-    0x2e,
-    0x49,
-    0x12,
-    0x1a,
-    0xc7,
-    0xa4,
-    0xd8,
-    0x8a,
-    0x78,
-    0xcf,
-    0xd4,
-    0x5b,
-    0xf6,
-    0xc2,
-    0xf1,
-    0x5c,
-    0x25,
-    0xe0,
-    0xd7,
-    0x2a,
-    0x7e,
-    0xcd,
-    0x6a,
-    0xa3,
-    0xb4,
-    0x80,
-    0x94,
-    0x9f,
-    0x97,
-    0x99,
-    0x45,
-    0xdb,
-    0x38,
-    0xf4,
-    0xb8,
-    0x36,
-    0x4e,
-    0x7e,
-    0xf7,
-    0x20,
-    0xd8,
-    0x47,
-    0xa1,
-    0x4f,
-    0x04,
-    0xd9,
-    0xeb,
-    0xb3,
-    0x50,
-    0xc9,
-    0xe5,
-    0xad,
-    0xef,
-    0x8b,
-    0xff,
-    0x7c,
-    0x6e,
-    0x8a,
-    0xcb,
-    0xf8,
-    0x97,
-    0x78,
-    0x04,
-    0x82,
-    0x96,
-    0xe3,
-    0xd0,
-    0x3b,
-    0x5a,
-    0x0a,
-    0x42,
-    0x74,
-    0x3e,
-    0xee,
-    0x23,
-    0x66,
-    0xe9,
-    0xac,
-    0xf2,
-    0x23,
-    0x72,
-    0x09,
-    0x29,
-    0xcd,
-    0xc8,
-    0x4f,
-    0xc2,
-    0x06,
-    0x52,
-    0x58,
-    0xfa,
-    0xa7,
-    0xd2,
-    0xe8,
-    0x55,
-    0xb5,
-    0x8f,
-    0x40,
-    0xe2,
-    0x91,
-    0xb3,
-    0xef,
-    0xc0,
-    0x6e,
-    0xf2,
-    0xec,
-    0xe1,
-    0x08,
-    0x6c,
-    0xe2,
-    0x0e,
-    0x94,
-    0xd5,
-    0xcb,
-    0x2b,
-    0xf2,
-    0xd3,
-    0xc0,
-    0xbd,
-    0x2a,
-    0xa7,
-    0x0f,
-    0xa9,
-    0x16,
-    0x10,
-    0x8f,
-    0x3e,
-    0x5c,
-    0x6c,
-    0x30,
-    0x76,
-    0xa0,
-    0x21,
-    0xd6,
-    0x79,
-    0xf7,
-    0x3b,
-    0x68,
-    0x63,
-    0x9e,
-    0x57,
-    0x23,
-    0x47,
-    0xec,
-    0xbf,
-    0x35,
-    0x74,
-    0x85,
-    0xd6,
-    0x87,
-    0xf7,
-    0xd1,
-    0xb7,
-    0xda,
-    0x61,
-    0xac,
-    0x19,
-    0x15,
-    0xca,
-    0x5f,
-    0x76,
-    0xdd,
-    0x15,
-    0xcf,
-    0x6c,
-    0x67,
-    0x76,
-    0xf5,
-    0x63,
-    0x8a,
-    0x32,
-    0x8e,
-    0x70,
-    0x19,
-    0xa6,
-    0x14,
-    0x79,
-    0x6f,
-    0x8b,
-    0xec,
-    0x9a,
-    0x4b,
-    0x78,
-    0xe1,
-    0xc8,
-    0xdf,
-    0xa8,
-    0xd1,
-    0xb4,
-    0x23,
-    0xfe,
-    0xa6,
-    0xf2,
-    0x6f,
-    0x46,
-    0x88,
-    0x5b,
-    0x49,
-    0xbe,
-    0x52,
-    0xb0,
-    0x7c,
-    0xd5,
-    0x42,
-    0x80,
-    0x6a,
-    0x32,
-    0xf4,
-    0x4b,
-    0xa2,
-    0xf8,
-    0x91,
-    0xe7,
-    0xb5,
-    0x49,
-    0x44,
-    0x23,
-    0x46,
-    0x09,
-    0xed,
-    0xab,
-    0x61,
-    0xe4,
-    0x1a,
-    0x2b,
-    0x0e,
-    0x92,
-    0x33,
-    0xb7,
-    0x25,
-    0x59,
-    0xf4,
-    0x6b,
-    0x63,
-    0xd4,
-    0x20,
-    0x4e,
-    0xbe,
-    0xf4,
-    0x74,
-    0x7c,
-    0xf6,
-    0x44,
-    0xda,
-    0x85,
-    0x6d,
-    0x71,
-    0xe0,
-    0x10,
-    0x38,
-    0x09,
-    0x68,
-    0xc4,
-    0x76,
-    0x83,
-    0xa1,
-    0x68,
-    0xe0,
-    0x80,
-    0x36,
-    0x48,
-    0xa2,
-    0x50,
-    0xc5,
-    0xdb,
-    0x6a,
-    0xb8,
-    0x92,
-    0xa4,
-    0xbe,
-    0xf2,
-    0x7d,
-    0x56,
-    0x92,
-    0xf6,
-    0x31,
-    0x3b,
-    0x1a,
-    0xf8,
-    0x9f,
-    0xd6,
-    0xdd,
-    0x32,
-    0xab,
-    0xc8,
-    0x0b,
-    0xe3,
-    0x24,
-    0xf0,
-    0x10,
-    0x98,
-    0xfa,
-    0xd6,
-    0x69,
-    0xaa,
-    0xab,
-    0x4a,
-    0xb6,
-    0x08,
-    0xff,
-    0x48,
-    0x11,
-    0x36,
-    0xf5,
-    0x1f,
-    0x9f,
-    0x96,
-    0xfd,
-    0xd2,
-    0x64,
-    0xe7,
-    0x67,
-    0xbf,
-    0x5c,
-    0x0b,
-    0x1c,
-    0x7e,
-    0xc7,
-    0x0d,
-    0x8c,
-    0x0c,
-    0xc4,
-    0x62,
-    0xe7,
-    0x29,
-    0x21,
-    0x6f,
-    0x90,
-    0xfe,
-    0x72,
-    0x4c,
-    0xcf,
-    0x03,
-    0x60,
-    0xc8,
-    0xc6,
-    0x20,
-    0x44,
-    0xad,
-    0xa6,
-    0x13,
-    0xf5,
-    0x45,
-    0x22,
-    0x11,
-    0xdd,
-    0x1c,
-    0x24,
-    0xb0,
-    0x53,
-    0x08,
-    0xbf,
-    0x04,
-    0x25,
-    0x67,
-    0x66,
-    0x08,
-    0x73,
-    0xa8,
-    0x5b,
-    0x40,
-    0xc4,
-    0x0d,
-    0x69,
-    0x9d,
-    0x53,
-    0xae,
-    0xd6,
-    0xa1,
-    0xaa,
-    0xc2,
-    0x94,
-    0xc3,
-    0x72,
-    0x1a,
-    0xb7,
-    0x15,
-    0x8a,
-    0xee,
-    0x2c,
-    0x24,
-    0x56,
-    0xdc,
-    0xa7,
-    0x20,
-    0x5a,
-    0x2e,
-    0xdd,
-    0x3d,
-    0x07,
-    0x5c,
-    0xf4,
-    0x58,
-    0xd4,
-    0xd1,
-    0x37,
-    0xde,
-    0x91,
-    0xf2,
-    0x0f,
-    0xea,
-    0xf8,
-    0x5d,
-    0x2e,
-    0xad,
-    0x86,
-    0x6e,
-    0x0e,
-    0x13,
-    0x89,
-    0x08,
-    0x9a,
-    0xa3,
-    0x79,
-    0x92,
-    0x2b,
-    0xa8,
-    0x8b,
-    0x3f,
-    0xb5,
-    0x8e,
-    0x84,
-    0x93,
-    0x43,
-    0x8e,
-    0xcb,
-    0x23,
-    0xa0,
-    0x8e,
-    0xc3,
-    0x9c,
-    0x57,
-    0x42,
-    0x57,
-    0x06,
-    0xde,
-    0x98,
-    0xd7,
-    0x4a,
-    0x0f,
-    0x53,
-    0x02,
-    0xf2,
-    0xd7,
-    0xf5,
-    0x64,
-    0x31,
-    0x32,
-    0xe3,
-    0xe2,
-    0x23,
-    0x57,
-    0xc4,
-    0x93,
-    0x55,
-    0x2f,
-    0x2a,
-    0xd1,
-    0x88,
-    0x0c,
-    0x74,
-    0x90,
-    0xb2,
-    0x98,
-    0xf3,
-    0xef,
-    0x46,
-    0x0c,
-    0x4b,
-    0x0d,
-    0xb5,
-    0xa2,
-    0x1c,
-    0x1e,
-    0x35,
-    0x4c,
-    0xe2,
-    0xbe,
-    0xc1,
-    0xa6,
-    0x1a,
-    0x84,
-    0x61,
-    0x29,
-    0xa7,
-    0xdb,
-    0xab,
-    0xa2,
-    0x73,
-    0x0d,
-    0x8a,
-    0xe3,
-    0x59,
-    0xa1,
-    0x3e,
-    0xb9,
-    0x43,
-    0xe7,
-    0xa4,
-    0x1e,
-    0x8f,
-    0xd1,
-    0xb8,
-    0xaf,
-    0xb8,
-    0x04,
-    0x58,
-    0x60,
-    0x32,
-    0x2f,
-    0x4b,
-    0x6e,
-    0x95,
-    0x9c,
-    0x81,
-    0x95,
-    0xfe,
-    0x05,
-    0x9c,
-    0x84,
-    0xb2,
-    0xa8,
-    0xb0,
-    0x8e,
-    0x05,
-    0x9d,
-    0x47,
-    0xa2,
-    0x7b,
-    0x68,
-    0xa9,
-    0x7d,
-    0x2c,
-    0xcb,
-    0x5a,
-    0x1e,
-    0x6d,
-    0xde,
-    0xe3,
-    0x7a,
-    0xac,
-    0x61,
-    0xd5,
-    0x72,
-    0x9c,
-    0x50,
-    0x0c,
-    0x02,
-    0x93,
-    0xb8,
-    0x31,
-    0xbb,
-    0x30,
-    0xca,
-    0x82,
-    0x73,
-    0x40,
-    0x2d,
-    0xd6,
-    0x3b,
-    0xe2,
-    0x99,
-    0xdb,
-    0x91,
-    0xea,
-    0xa2,
-    0xa3,
-    0xd7,
-    0x84,
-    0xd1,
-    0x5f,
-    0x04,
-    0x1a,
-    0xf9,
-    0x6a,
-    0x9a,
-    0x77,
-    0xc8,
-    0x89,
-    0xd8,
-    0x2c,
-    0x9d,
-    0x71,
-    0x30,
-    0x32,
-    0x99,
-    0x89,
-    0xfb,
-    0xd2,
-    0xf9,
-    0xf2,
-    0x6c,
-    0xc2,
-    0xa3,
-    0xc5,
-    0xc2,
-    0x91,
-    0xfe,
-    0x9b,
-    0xc2,
-    0x44,
-    0x07,
-    0x53,
-    0x65,
-    0x42,
-    0xa2,
-    0x0f,
-    0xce,
-    0x6d,
-    0x2d,
-    0x80,
-    0x7e,
-    0x92,
-    0x5b,
-    0x64,
-    0xcb,
-    0x03,
-    0x40,
-    0x4c,
-    0x8e,
-    0x82,
-    0xa8,
-    0xa3,
-    0x1d,
-    0x61,
-    0xad,
-    0xec,
-    0x79,
-    0xe8,
-    0x89,
-    0x4b,
-    0xc8,
-    0xf7,
-    0xa8,
-    0x47,
-    0x05,
-    0xec,
-    0x02,
-    0xce,
-    0xf6,
-    0xc7,
-    0xa7,
-    0x79,
-    0x5e,
-    0x8d,
-    0x9b,
-    0x12,
-    0x75,
-    0xea,
-    0xe5,
-    0x54,
-    0x95,
-    0x19,
-    0xe3,
-    0xf1,
-    0x36,
-    0x09,
-    0xe0,
-    0xda,
-    0x1c,
-    0xb8,
-    0xe8,
-    0xba,
-    0xcf,
-    0xe3,
-    0xdb,
-    0xc3,
-    0x4c,
-    0xe2,
-    0xc1,
-    0xae,
-    0xfa,
-    0xce,
-    0x5d,
-    0xfd,
-    0xdf,
-    0xe4,
-    0x05,
-    0x84,
-    0x14,
-    0x2e,
-    0xb1,
-    0x27,
-    0x76,
-    0x60,
-    0x51,
-    0xe5,
-    0x9f,
-    0x00,
-    0x64,
-    0x16,
-    0x15,
-    0xc9,
-    0xc6,
-    0xf0,
-    0xc0,
-    0x52,
-    0xc9,
-    0x50,
-    0xa2,
-    0xeb,
-    0x88,
-    0xb8,
-    0xc2,
-    0xc7,
-    0x78,
-    0x93,
-    0x69,
-    0x61,
-    0x40,
-    0xc1,
-    0x91,
-    0x18,
-    0xcb,
-    0x4f,
-    0x9b,
-    0x1c,
-    0x9b,
-    0x86,
-    0x40,
-    0x8e,
-    0x60,
-    0x28,
-    0xca,
-    0xe3,
-    0xc9,
-    0xf6,
-    0x84,
-    0x8a,
-    0x9a,
-    0x75,
-    0x6f,
-    0xce,
-    0xff,
-    0xf2,
-    0x36,
-    0xfd,
-    0x1f,
-    0xc4,
-    0x64,
-    0xca,
-    0xf5,
-    0xd1,
-    0xd5,
-    0xf0,
-    0x5b,
-    0x54,
-    0x6a,
-    0x18,
-    0x68,
-    0xdd,
-    0x01,
-    0xfd,
-    0xfc,
-    0x99,
-    0xa5,
-    0xce,
-    0x99,
-    0xd3,
-    0x01,
-    0xd4,
-    0x75,
-    0xbb,
-    0x1b,
-    0x54,
-    0xcd,
-    0x66,
-    0x3f,
-    0xb7,
-    0x7b,
-    0x17,
-    0x38,
-    0xe8,
-    0xcb,
-    0xbd,
-    0xc7,
-    0xfe,
-    0x8b,
-    0xbc,
-    0x4d,
-    0x1b,
-    0x61,
-    0xf0,
-    0xcb,
-    0x93,
-    0x62,
-    0xef,
-    0x0c,
-    0x51,
-    0xdf,
-    0x8f,
-    0x21,
-    0x77,
-    0x82,
-    0xa9,
-    0x0e,
-    0x45,
-    0x9a,
-    0x1c,
-    0xc3,
-    0x3c,
-    0xb4,
-    0x14,
-    0x4e,
-    0x83,
-    0x6b,
-    0x8c,
-    0x4e,
-    0x89,
-    0x81,
-    0x11,
-    0xab,
-    0xec,
-    0x2e,
-    0xc9,
-    0x84,
-    0x9a,
-    0xb7,
-    0xb5,
-    0x69,
-    0x36,
-    0x43,
-    0x33,
-    0xcb,
-    0xbd,
-    0xeb,
-    0xc7,
-    0xb0,
-    0x69,
-    0x10,
-    0x1a,
-    0xab,
-    0xd5,
-    0xf1,
-    0x43,
-    0x0c,
-    0x63,
-    0x7c,
-    0x46,
-    0x54,
-    0xdb,
-    0x65,
-    0xda,
-    0xec,
-    0x54,
-    0x76,
-    0x70,
-    0x16,
-    0x58,
-    0x26,
-    0x70,
-    0x23,
-    0x43,
-    0x6c,
-    0xc6,
-    0xe7,
-    0xec,
-    0xd5,
-    0x9d,
-    0x6a,
-    0x87,
-    0xd5,
-    0x6a,
-    0xe0,
-    0xca,
-    0x5a,
-    0x2d,
-    0xdb,
-    0x4f,
-    0xa7,
-    0xf4,
-    0xc0,
-    0x3a,
-    0x60,
-    0xa0,
-    0x77,
-    0x1b,
-    0xe1,
-    0xeb,
-    0x67,
-    0x16,
-    0xd4,
-    0xaa,
-    0xa2,
-    0x41,
-    0x03,
-    0x50,
-    0x5c,
-    0x4d,
-    0x6a,
-    0xb4,
-    0xa2,
-    0x69,
-    0x91,
-    0x14,
-    0x49,
-    0x63,
-    0x19,
-    0x59,
-    0x24,
-    0x10,
-    0x94,
-    0x9c,
-    0x7a,
-    0xef,
-    0x9a,
-    0xea,
-    0xb6,
-    0x09,
-    0x19,
-    0x44,
-    0x61,
-    0x1b,
-    0xec,
-    0xea,
-    0x4e,
-    0xf7,
-    0xaf,
-    0xda,
-    0x14,
-    0x28,
-    0xd2,
-    0x93,
-    0xc1,
-    0xd5,
-    0xed,
-    0x1e,
-    0xcd,
-    0xe8,
-    0x53,
-    0x4f,
-    0x4d,
-    0x6e,
-    0xea,
-    0x49,
-    0x69,
-    0x41,
-    0x3a,
-    0x40,
-    0x10,
-    0xe5,
-    0xc3,
-    0x83,
-    0xeb,
-    0xb1,
-    0x94,
-    0xb9,
-    0x8f,
-    0x2f,
-    0x19,
-    0x6a,
-    0xf6,
-    0xc5,
-    0x35,
-    0xc2,
-    0x30,
-    0x94,
-    0x90,
-    0x92,
-    0x56,
-    0xa0,
-    0x33,
-    0x98,
-    0xc0,
-    0x31,
-    0x52,
-    0x00,
-    0x77,
-    0x7a,
-    0x68,
-    0x2a,
-    0xed,
-    0x79,
-    0x8a,
-    0xae,
-    0xec,
-    0x1e,
-    0xf4,
-    0x9e,
-    0xcd,
-    0xaf,
-    0xe9,
-    0x0b,
-    0xea,
-    0x6b,
-    0xba,
-    0xca,
-    0x56,
-    0x6e,
-    0x24,
-    0x77,
-    0xcb,
-    0xd4,
-    0xde,
-    0xbb,
-    0xe3,
-    0x21,
-    0x73,
-    0xcb,
-    0x8b,
-    0xe1,
-    0x4e,
-    0x31,
-    0xb5,
-    0x8b,
-    0x13,
-    0xcf,
-    0x4e,
-    0xab,
-    0x36,
-    0x21,
-    0x70,
-    0x40,
-    0xc6,
-    0xc2,
-    0xd8,
-    0x63,
-    0x89,
-    0x32,
-    0x9a,
-    0x2a,
-    0x4e,
-    0xd6,
-    0x13,
-    0xcc,
-    0x7f,
-    0x40,
-    0x20,
-    0x06,
-    0xf6,
-    0xb1,
-    0x8d,
-    0xbd,
-    0x11,
-    0xdc,
-    0xd1,
-    0xe4,
-    0x09,
-    0xed,
-    0xf8,
-    0xa0,
-    0x7f,
-    0xca,
-    0xe0,
-    0xaa,
-    0x58,
-    0x99,
-    0xa8,
-    0xf6,
-    0xcb,
-    0x82,
-    0x66,
-    0x92,
-    0xb8,
-    0xb6,
-    0x18,
-    0xd0,
-    0x3c,
-    0xb0,
-    0xde,
-    0xa7,
-    0x82,
-    0xbb,
-    0x66,
-    0x57,
-    0xdc,
-    0xb4,
-    0xa7,
-    0x4c,
-    0x12,
-    0x11,
-    0xd2,
-    0x45,
-    0xfa,
-    0x22,
-    0x85,
-    0xb5,
-    0x48,
-    0x97,
-    0x42,
-    0x69,
-    0xa8,
-    0x43,
-    0x21,
-    0x6c,
-    0x0a,
-    0x1f,
-    0xc1,
-    0x28,
-    0x3d,
-    0x92,
-    0x84,
-    0xcd,
-    0xc0,
-    0xef,
-    0xfc,
-    0xf7,
-    0xd5,
-    0x40,
-    0xa0,
-    0x8b,
-    0xd6,
-    0x42,
-    0xc4,
-    0xe1,
-    0xcc,
-    0xb0,
-    0xc8,
-    0x29,
-    0x3e,
-    0xc4,
-    0x8f,
-    0x07,
-    0x47,
-    0xfc,
-    0x32,
-    0x81,
-    0xeb,
-    0x1a,
-    0xf6,
-    0x1b,
-    0xab,
-    0x6e,
-    0x7c,
-    0x40,
-    0x57,
-    0x57,
-    0x38,
-    0xe4,
-    0x24,
-    0x08,
-    0x24,
-    0x68,
-    0xff,
-    0x88,
-    0xb6,
-    0xbe,
-    0x20,
-    0xfc,
-    0x0f,
-    0xcd,
-    0xe1,
-    0x29,
-    0x75,
-    0x17,
-    0xd1,
-    0x35,
-    0x03,
-    0x99,
-    0x04,
-    0xad,
-    0x9f,
-    0xf2,
-    0xae,
-    0xcd,
-    0x2d,
-    0xc8,
-    0xf0,
-    0xfb,
-    0x02,
-    0x68,
-    0xf2,
-    0x94,
-    0x9c,
-    0xac,
-    0x32,
-    0xeb,
-    0x90,
-    0x22,
-    0x1c,
-    0x8f,
-    0xc3,
-    0x6a,
-    0xda,
-    0xcd,
-    0xdd,
-    0xe0,
-    0x6d,
-    0x76,
-    0xfb,
-    0x7c,
-    0xfd,
-    0xe3,
-    0xa5,
-    0xf6,
-    0x6d,
-    0x35,
-    0xff,
-    0x2d,
-    0x33,
-    0xe1,
-    0x43,
-    0xc9,
-    0x67,
-    0x6d,
-    0x6e,
-    0x1f,
-    0x19,
-    0x74,
-    0x3a,
-    0x56,
-    0xe8,
-    0xf0,
-    0x4d,
-    0xc8,
-    0xd0,
-    0xb9,
-    0xb0,
-    0xab,
-    0x44,
-    0x48,
-    0x82,
-    0xf1,
-    0x7d,
-    0xc1,
-    0xee,
-    0x6c,
-    0x11,
-    0x31,
-    0x5a,
-    0x36,
-    0xc7,
-    0x13,
-    0xe1,
-    0x50,
-    0xaa,
-    0x1a,
-    0x04,
-    0x89,
-    0x5c,
-    0x2a,
-    0x9c,
-    0xa2,
-    0xad,
-    0xa7,
-    0x13,
-    0xaf,
-    0x6c,
-    0xf3,
-    0xd4,
-    0xc0,
-    0x7e,
-    0x32,
-    0x00,
-    0xc1,
-    0x2c,
-    0x51,
-    0x63,
-    0x9f,
-    0xc1,
-    0x46,
-    0xa6,
-    0xad,
-    0x55,
-    0x99,
-    0xc6,
-    0x45,
-    0xe4,
-    0x23,
-    0xc5,
-    0xb2,
-    0xa3,
-    0x16,
-    0x9f,
-    0x4d,
-    0x93,
-    0x3d,
-    0x7f,
-    0xe7,
-    0x56,
-    0x85,
-    0x33,
-    0x67,
-    0x42,
-    0xbd,
-    0xdd,
-    0xb4,
-    0xb4,
-    0x9a,
-    0xec,
-    0xd6,
-    0xa6,
-    0xfe,
-    0x4b,
-    0x58,
-    0x84,
-    0x79,
-    0xd8,
-    0xf0,
-    0x3c,
-    0x11,
-    0x18,
-    0x62,
-    0x95,
-    0x3e,
-    0x29,
-    0xa1,
-    0xc1,
-    0x39,
-    0xf8,
-    0x37,
-    0x35,
-    0x76,
-    0xb4,
-    0xe8,
-    0xb8,
-    0x6f,
-    0x82,
-    0x92,
-    0xba,
-    0xa4,
-    0x72,
-    0x58,
-    0xe8,
-    0xe0,
-    0xb1,
-    0xff,
-    0xfd,
-    0xbd,
-    0x01,
-    0x98,
-    0xdb,
-    0x6a,
-    0x67,
-    0x60,
-    0xda,
-    0xac,
-    0x23,
-    0xe4,
-    0x60,
-    0x23,
-    0xe5,
-    0x69,
-    0xb2,
-    0xcf,
-    0x3e,
-    0x8a,
-    0x09,
-    0xd3,
-    0x55,
-    0x23,
-    0xe9,
-    0x78,
-    0xdb,
-    0x6e,
-    0xae,
-    0x74,
-    0x41,
-    0x6c,
-    0x68,
-    0x6d,
-    0x28,
-    0x87,
-    0xe8,
-    0xb9,
-    0x19,
-    0x75,
-    0x1b,
-    0x68,
-    0x76,
-    0x5f,
-    0x97,
-    0x84,
-    0xb0,
-    0x43,
-    0x74,
-    0x97,
-    0xbb,
-    0x97,
-    0x5d,
-    0x6e,
-    0xbf,
-    0x2f,
-    0xe6,
-    0x1d,
-    0x11,
-    0x60,
-    0x20,
-    0x43,
-    0x61,
-    0x66,
-    0x6c,
-    0x8f,
-    0x35,
-    0x03,
-    0x8c,
-    0x83,
-    0x96,
-    0x69,
-    0x00,
-    0x78,
-    0x08,
-    0x5a,
-    0x8f,
-    0xe3,
-    0xc0,
-    0x8e,
-    0x24,
-    0xd6,
-    0x12,
-    0x55,
-    0xdb,
-    0xca,
-    0x29,
-    0x7d,
-    0x5c,
-    0x9b,
-    0xfa,
-    0x76,
-    0x68,
-    0xd4,
-    0x7a,
-    0xb4,
-    0xb1,
-    0x2d,
-    0x0f,
-    0x55,
-    0xef,
-    0x52,
-    0x45,
-    0x04,
-    0x30,
-    0xe6,
-    0xc3,
-    0x1d,
-    0x6f,
-    0xc8,
-    0x7d,
-    0x11,
-    0x69,
-    0x95,
-    0x2b,
-    0x0d,
-    0xac,
-    0x6e,
-    0xf9,
-    0xd6,
-    0xf1,
-    0xfb,
-    0x80,
-    0xf8,
-    0xab,
-    0xaf,
-    0xf5,
-    0x1f,
-    0xe0,
-    0x4e,
-    0xa0,
-    0xc5,
-    0x38,
-    0xad,
-    0x90,
-    0x0d,
-    0x54,
-    0xba,
-    0x8e,
-    0xef,
-    0x60,
-    0xbb,
-    0x4f,
-    0x96,
-    0xec,
-    0xdb,
-    0xee,
-    0x06,
-    0xf7,
-    0xe2,
-    0x99,
-    0x02,
-    0x4d,
-    0x44,
-    0x8a,
-    0x2d,
-    0x14,
-    0x5d,
-    0x38,
-    0x6f,
-    0xa1,
-    0xfb,
-    0xcf,
-    0x9a,
-    0x90,
-    0x1d,
-    0xde,
-    0x4e,
-    0x13,
-    0xfa,
-    0x50,
-    0x1a,
-    0x8a,
-    0x45,
-    0x9e,
-    0xe3,
-    0x54,
-    0xb0,
-    0x43,
-    0x8a,
-    0xe5,
-    0xaf,
-    0x6f,
-    0xc9,
-    0x19,
-    0x7e,
-    0xff,
-    0x5e,
-    0xc8,
-    0x65,
-    0xad,
-    0x6c,
-    0x9b,
-    0x3b,
-    0x84,
-    0x1e,
-    0x1e,
-    0x29,
-    0x98,
-    0x8d,
-    0x16,
-    0xb0,
-    0xf3,
-    0xe4,
-    0x14,
-    0xed,
-    0xd2,
-    0xc2,
-    0x4a,
-    0x1c,
-    0x12,
-    0xdf,
-    0x9e,
-    0x5c,
-    0xe5,
-    0xf3,
-    0xfd,
-    0xb1,
-    0xc9,
-    0xd3,
-    0xf2,
-    0x4f,
-    0xbb,
-    0xdd,
-    0x77,
-    0x16,
-    0xa7,
-    0x97,
-    0x0b,
-    0x59,
-    0x24,
-    0x93,
-    0x04,
-    0xe3,
-    0x5e,
-    0x96,
-    0x27,
-    0x3c,
-    0x53,
-    0xf8,
-    0x76,
-    0x28,
-    0x43,
-    0x4e,
-    0x49,
-    0x71,
-    0x61,
-    0x47,
-    0xa0,
-    0xe6,
-    0xcf,
-    0xd4,
-    0xb8,
-    0xa4,
-    0xc9,
-    0x8c,
-    0xdc,
-    0x94,
-    0x21,
-    0x4e,
-    0x7e,
-    0x35,
-    0xeb,
-    0x28,
-    0x86,
-    0x9c,
-    0x79,
-    0x77,
-    0xea,
-    0xb9,
-    0x8a,
-    0x50,
-    0x7f,
-    0xdb,
-    0xbe,
-    0x1f,
-    0x0f,
-    0x76,
-    0x4d,
-    0x8e,
-    0xab,
-    0x25,
-    0xf9,
-    0xa9,
-    0x42,
-    0xeb,
-    0x41,
-    0x3f,
-    0x73,
-    0xbe,
-    0xd8,
-    0x8b,
-    0xa0,
-    0x46,
-    0x55,
-    0x13,
-    0x44,
-    0xe2,
-    0x2c,
-    0xd1,
-    0x86,
-    0xec,
-    0xdd,
-    0x91,
-    0x0e,
-    0x3e,
-    0x6b,
-    0x9a,
-    0x17,
-    0xf4,
-    0x10,
-    0x90,
-    0xc5,
-    0x74,
-    0x2f,
-    0x99,
-    0xb9,
-    0xac,
-    0x8a,
-    0xbf,
-    0xe4,
-    0x9b,
-    0xb5,
-    0x96,
-    0x98,
-    0x13,
-    0xcb,
-    0x1e,
-    0xe5,
-    0xbd,
-    0x5f,
-    0xea,
-    0x22,
-    0x5d,
-    0xb5,
-    0x82,
-    0xca,
-    0x57,
-    0x32,
-    0x07,
-    0x8a,
-    0x73,
-    0x12,
-    0x15,
-    0x97,
-    0xdd,
-    0x59,
-    0xed,
-    0x45,
-    0x70,
-    0x0c,
-    0xd4,
-    0xd6,
-    0x33,
-    0xa0,
-    0xb6,
-    0x8f,
-    0x24,
-    0xb3,
-    0x0f,
-    0x12,
-    0x35,
-    0xfa,
-    0x0c,
-    0xe7,
-    0x95,
-    0x7b,
-    0xed,
-    0x5c,
-    0x30,
-    0xfc,
-    0xad,
-    0x8f,
-    0x79,
-    0xbb,
-    0xe5,
-    0xc9,
-    0x67,
-    0x5f,
-    0xee,
-    0x0d,
-    0xbd,
-    0x2f,
-    0x45,
-    0xf1,
-    0x8f,
-    0x82,
-    0x34,
-    0xad,
-    0x02,
-    0x76,
-    0xaf,
-    0x72,
-    0x53,
-    0xe5,
-    0x7d,
-    0xfd,
-    0x1b,
-    0x95,
-    0x98,
-    0x6b,
-    0xd1,
-    0xaf,
-    0xd5,
-    0x4f,
-    0x90,
-    0x73,
-    0xc7,
-    0x02,
-    0x1a,
-    0x29,
-    0xe1,
-    0x3a,
-    0x1e,
-    0x5b,
-    0xdc,
-    0xde,
-    0xb6,
-    0x41,
-    0x58,
-    0x19,
-    0x34,
-    0x7d,
-    0xc6,
-    0xae,
-    0x1e,
-    0x09,
-    0x85,
-    0x8b,
-    0x77,
-    0x6d,
-    0x4b,
-    0xa0,
-    0x40,
-    0x35,
-    0xc7,
-    0xf1,
-    0x3f,
-    0xa2,
-    0x85,
-    0xea,
-    0xff,
-    0xa0,
-    0x11,
-    0xf3,
-    0x18,
-    0xf8,
-    0x5f,
-    0x45,
-    0xb0,
-    0xc7,
-    0x6a,
-    0xfc,
-    0x42,
-    0x2f,
-    0x1c,
-    0x6d,
-    0x9f,
-    0x4c,
-    0x6e,
-    0xb9,
-    0x32,
-    0x69,
-    0xd0,
-    0xa3,
-    0x87,
-    0x74,
-    0xcb,
-    0x9e,
-    0x0f,
-    0xb0,
-    0xe5
-  ],
-  const [
-    0xa4,
-    0x89,
-    0xcc,
-    0x5f,
-    0x00,
-    0xc1,
-    0x83,
-    0x5d,
-    0xda,
-    0xf2,
-    0xf0,
-    0x58,
-    0x67,
-    0x10,
-    0x85,
-    0x07,
-    0x52,
-    0xab,
-    0xe6,
-    0x8d,
-    0x00,
-    0x1f,
-    0x4e,
-    0x4e,
-    0x18,
-    0x0b,
-    0x2f,
-    0x00,
-    0x43,
-    0x04,
-    0x18,
-    0x05,
-    0x30,
-    0x8a,
-    0xdc,
-    0xf8,
-    0xdc,
-    0x3a,
-    0xf1,
-    0x86,
-    0x10,
-    0x46,
-    0x16,
-    0x7f,
-    0x2b,
-    0x23,
-    0x38,
-    0x2c,
-    0x21,
-    0x81,
-    0x97,
-    0xe4,
-    0xc4,
-    0x80,
-    0x25,
-    0xda,
-    0x42,
-    0x21,
-    0x2e,
-    0x39,
-    0xef,
-    0xfa,
-    0x3e,
-    0x73,
-    0x45,
-    0x2f,
-    0x40,
-    0xd5,
-    0x29,
-    0x9d,
-    0xe3,
-    0x60,
-    0x70,
-    0x58,
-    0x42,
-    0xd4,
-    0xa2,
-    0x58,
-    0xc3,
-    0x0d,
-    0xfe,
-    0x6f,
-    0x3f,
-    0x92,
-    0xbe,
-    0x7e,
-    0x64,
-    0x6c,
-    0x9c,
-    0xe9,
-    0x58,
-    0x34,
-    0x94,
-    0x48,
-    0x9f,
-    0x70,
-    0xec,
-    0x60,
-    0x3f,
-    0x20,
-    0x72,
-    0x51,
-    0x22,
-    0x93,
-    0x05,
-    0x10,
-    0xbb,
-    0x7f,
-    0x56,
-    0x18,
-    0xed,
-    0x51,
-    0xf0,
-    0x5d,
-    0x28,
-    0xc2,
-    0x76,
-    0x82,
-    0xd5,
-    0xab,
-    0x2c,
-    0x4b,
-    0xf4,
-    0x1a,
-    0xb9,
-    0x55,
-    0x03,
-    0xa5,
-    0x2c,
-    0x05,
-    0x22,
-    0xfe,
-    0x3c,
-    0xbe,
-    0x76,
-    0xc8,
-    0xd4,
-    0x57,
-    0xcb,
-    0xa9,
-    0xcf,
-    0xcc,
-    0x7d,
-    0xa1,
-    0x00,
-    0x33,
-    0x98,
-    0x9a,
-    0x75,
-    0xf2,
-    0x3e,
-    0x40,
-    0xfc,
-    0x30,
-    0x49,
-    0x12,
-    0xe7,
-    0x89,
-    0x32,
-    0xb9,
-    0x0d,
-    0x06,
-    0x32,
-    0x99,
-    0x11,
-    0x4c,
-    0xa6,
-    0xa7,
-    0xe7,
-    0x13,
-    0xb8,
-    0x7a,
-    0x93,
-    0xda,
-    0x3c,
-    0xa4,
-    0x34,
-    0xd9,
-    0xd8,
-    0x42,
-    0x42,
-    0x38,
-    0x68,
-    0xd2,
-    0x14,
-    0x7e,
-    0xa0,
-    0x45,
-    0xa5,
-    0x4c,
-    0xf3,
-    0x55,
-    0x97,
-    0x4b,
-    0xb4,
-    0x19,
-    0x78,
-    0x63,
-    0x7c,
-    0xd7,
-    0x45,
-    0x2e,
-    0xcb,
-    0x19,
-    0x2c,
-    0xac,
-    0xf2,
-    0x03,
-    0x96,
-    0x38,
-    0x30,
-    0xe3,
-    0x65,
-    0xba,
-    0x1b,
-    0x0a,
-    0x7a,
-    0x1f,
-    0x41,
-    0xdb,
-    0x7b,
-    0x06,
-    0x10,
-    0x21,
-    0xd3,
-    0xbc,
-    0xf3,
-    0xa6,
-    0xfa,
-    0x6b,
-    0xbe,
-    0x01,
-    0xf6,
-    0x8e,
-    0x4c,
-    0xaf,
-    0x22,
-    0xa8,
-    0x66,
-    0x65,
-    0x2e,
-    0x36,
-    0xe7,
-    0xa5,
-    0x67,
-    0xe2,
-    0x1e,
-    0x90,
-    0x38,
-    0xf9,
-    0x74,
-    0xfb,
-    0xf1,
-    0x1f,
-    0x4f,
-    0xc4,
-    0xc8,
-    0x42,
-    0x36,
-    0x66,
-    0x1e,
-    0xcc,
-    0x35,
-    0xcc,
-    0x03,
-    0x1d,
-    0x83,
-    0x63,
-    0xfb,
-    0x38,
-    0x62,
-    0x73,
-    0x02,
-    0xbc,
-    0x47,
-    0xaf,
-    0xcf,
-    0x17,
-    0x3b,
-    0x0b,
-    0x56,
-    0xf6,
-    0x81,
-    0xcd,
-    0x90,
-    0xff,
-    0x79,
-    0xe7,
-    0x7e,
-    0xc3,
-    0xc4,
-    0x84,
-    0x6c,
-    0xee,
-    0xa9,
-    0xe1,
-    0x73,
-    0xc1,
-    0xb7,
-    0x5e,
-    0x41,
-    0xc3,
-    0xac,
-    0xd5,
-    0x1d,
-    0xb3,
-    0x96,
-    0x2a,
-    0x25,
-    0xc0,
-    0x38,
-    0x23,
-    0xda,
-    0xfd,
-    0xaf,
-    0x7a,
-    0xdf,
-    0x0f,
-    0x56,
-    0x31,
-    0xfe,
-    0x28,
-    0xe6,
-    0x26,
-    0x6c,
-    0x3a,
-    0xe2,
-    0xe7,
-    0x4e,
-    0x64,
-    0x32,
-    0xc7,
-    0x7b,
-    0xb1,
-    0x0d,
-    0x32,
-    0x84,
-    0x01,
-    0x1d,
-    0x3d,
-    0xf2,
-    0x47,
-    0xde,
-    0x81,
-    0xce,
-    0xf5,
-    0x48,
-    0x2a,
-    0x67,
-    0xb5,
-    0xad,
-    0x4b,
-    0x4f,
-    0x5a,
-    0xe4,
-    0x75,
-    0xa7,
-    0x16,
-    0xa7,
-    0x87,
-    0x9c,
-    0xed,
-    0x3a,
-    0xc7,
-    0x32,
-    0x69,
-    0x4d,
-    0x32,
-    0x41,
-    0x90,
-    0x24,
-    0x11,
-    0xbc,
-    0x13,
-    0xf5,
-    0xcd,
-    0x39,
-    0xc8,
-    0x92,
-    0x04,
-    0xae,
-    0x5a,
-    0x47,
-    0xdc,
-    0x79,
-    0x40,
-    0x06,
-    0x98,
-    0xa4,
-    0xeb,
-    0xc1,
-    0x69,
-    0x66,
-    0x44,
-    0x18,
-    0x86,
-    0xed,
-    0x55,
-    0x34,
-    0x7e,
-    0x5a,
-    0x46,
-    0xf3,
-    0xcd,
-    0x0e,
-    0x8c,
-    0x45,
-    0xae,
-    0x24,
-    0x5d,
-    0xd6,
-    0x31,
-    0x3e,
-    0x67,
-    0xed,
-    0x8d,
-    0x85,
-    0xc1,
-    0x94,
-    0xb7,
-    0xeb,
-    0x22,
-    0xf9,
-    0x34,
-    0xb4,
-    0x51,
-    0x14,
-    0x2b,
-    0x34,
-    0xdc,
-    0x8a,
-    0xbe,
-    0xda,
-    0x0d,
-    0xd1,
-    0x9a,
-    0x6d,
-    0x1a,
-    0x95,
-    0xcd,
-    0x96,
-    0x9c,
-    0x5b,
-    0xd9,
-    0x9f,
-    0x42,
-    0x65,
-    0x06,
-    0x7a,
-    0xc7,
-    0xd5,
-    0xfc,
-    0x05,
-    0x21,
-    0x15,
-    0x90,
-    0x8c,
-    0xfc,
-    0x75,
-    0xdf,
-    0x8f,
-    0x66,
-    0x16,
-    0x99,
-    0xc6,
-    0xcc,
-    0x08,
-    0xa0,
-    0x63,
-    0x25,
-    0xaf,
-    0xd2,
-    0x97,
-    0x6d,
-    0x6b,
-    0x22,
-    0x57,
-    0x55,
-    0x77,
-    0xee,
-    0x60,
-    0x39,
-    0x12,
-    0x8d,
-    0x79,
-    0x52,
-    0xdd,
-    0x27,
-    0xf8,
-    0x2d,
-    0x85,
-    0xc9,
-    0x87,
-    0x5b,
-    0xa1,
-    0xb8,
-    0x28,
-    0x6b,
-    0xde,
-    0x06,
-    0x77,
-    0x15,
-    0x59,
-    0x64,
-    0x2f,
-    0xb8,
-    0x4c,
-    0x37,
-    0xf0,
-    0x07,
-    0xed,
-    0xee,
-    0x40,
-    0xfe,
-    0x93,
-    0x92,
-    0xcf,
-    0x1c,
-    0x1b,
-    0x9e,
-    0xff,
-    0xcc,
-    0x8a,
-    0x12,
-    0xa3,
-    0x24,
-    0xf3,
-    0xc3,
-    0x07,
-    0xd1,
-    0x9c,
-    0xf5,
-    0x32,
-    0x52,
-    0x5c,
-    0x2b,
-    0x67,
-    0x65,
-    0x47,
-    0x3e,
-    0xf2,
-    0xbf,
-    0x8e,
-    0xad,
-    0x21,
-    0x00,
-    0xa0,
-    0x34,
-    0x90,
-    0xe6,
-    0x95,
-    0xa0,
-    0xa9,
-    0xc1,
-    0xcd,
-    0xe1,
-    0x6c,
-    0x27,
-    0xd4,
-    0x61,
-    0x6c,
-    0xe8,
-    0x89,
-    0x94,
-    0x1a,
-    0x44,
-    0x80,
-    0xd1,
-    0x46,
-    0x5c,
-    0xa4,
-    0x60,
-    0xe3,
-    0xe7,
-    0x21,
-    0xd4,
-    0x0b,
-    0x26,
-    0x81,
-    0x9a,
-    0x43,
-    0x1a,
-    0x14,
-    0xd3,
-    0xff,
-    0xf4,
-    0x96,
-    0x5f,
-    0x69,
-    0xcd,
-    0x0c,
-    0x3a,
-    0x5e,
-    0x97,
-    0xef,
-    0x0c,
-    0xb9,
-    0x54,
-    0x8c,
-    0xfb,
-    0xd5,
-    0x86,
-    0xab,
-    0xc4,
-    0x4d,
-    0xe6,
-    0x6f,
-    0x0a,
-    0x06,
-    0x58,
-    0x7d,
-    0xee,
-    0x70,
-    0x1f,
-    0x60,
-    0xdf,
-    0x08,
-    0x4d,
-    0x2d,
-    0xb3,
-    0x22,
-    0x7e,
-    0x62,
-    0xf7,
-    0xe5,
-    0xc6,
-    0x14,
-    0x84,
-    0x97,
-    0xe8,
-    0x4a,
-    0x53,
-    0x1b,
-    0xc9,
-    0xa4,
-    0x93,
-    0xb7,
-    0x24,
-    0x40,
-    0xf8,
-    0x1b,
-    0x7e,
-    0xdd,
-    0x55,
-    0x9f,
-    0x5d,
-    0x41,
-    0x6d,
-    0xcd,
-    0xb5,
-    0xd9,
-    0x07,
-    0x1f,
-    0xa3,
-    0xa0,
-    0x40,
-    0x09,
-    0x5d,
-    0x41,
-    0x25,
-    0x3a,
-    0x6a,
-    0x80,
-    0x81,
-    0x20,
-    0x0e,
-    0xd6,
-    0xf4,
-    0xaa,
-    0x09,
-    0x5b,
-    0x45,
-    0x51,
-    0x81,
-    0xea,
-    0xf9,
-    0x59,
-    0x3c,
-    0x7f,
-    0x25,
-    0x54,
-    0x12,
-    0xe3,
-    0x80,
-    0xe9,
-    0xa2,
-    0x8c,
-    0xbc,
-    0xd3,
-    0x45,
-    0xbe,
-    0x17,
-    0x2c,
-    0x40,
-    0xf7,
-    0x2d,
-    0xec,
-    0x3e,
-    0x8a,
-    0x10,
-    0xad,
-    0xfd,
-    0x8a,
-    0x9a,
-    0xb1,
-    0x47,
-    0xe9,
-    0x02,
-    0x25,
-    0x24,
-    0xe1,
-    0xae,
-    0xa7,
-    0x4e,
-    0x93,
-    0x48,
-    0x07,
-    0xe5,
-    0xef,
-    0x14,
-    0x4a,
-    0x64,
-    0xd3,
-    0x81,
-    0xf5,
-    0xd4,
-    0x77,
-    0xfe,
-    0x88,
-    0x3f,
-    0x08,
-    0x0e,
-    0x48,
-    0x68,
-    0x93,
-    0x9f,
-    0x41,
-    0xb9,
-    0x25,
-    0x98,
-    0x8c,
-    0x7d,
-    0x31,
-    0xb1,
-    0xce,
-    0x4f,
-    0x31,
-    0x87,
-    0x01,
-    0xd2,
-    0x90,
-    0xf0,
-    0x77,
-    0xa3,
-    0xc8,
-    0x8b,
-    0x1b,
-    0x8c,
-    0xc8,
-    0x9c,
-    0xfb,
-    0xfb,
-    0x98,
-    0x17,
-    0x03,
-    0xb2,
-    0x3f,
-    0xfb,
-    0x0b,
-    0xbf,
-    0xe5,
-    0xe1,
-    0x15,
-    0xaf,
-    0x35,
-    0xd5,
-    0xcf,
-    0xff,
-    0x05,
-    0x64,
-    0x60,
-    0xd3,
-    0x39,
-    0xf6,
-    0x60,
-    0xea,
-    0xe4,
-    0x5f,
-    0x28,
-    0xd2,
-    0xb1,
-    0xb0,
-    0x4d,
-    0x58,
-    0x82,
-    0x53,
-    0x67,
-    0x43,
-    0x56,
-    0x57,
-    0x17,
-    0x42,
-    0x70,
-    0x08,
-    0x48,
-    0x22,
-    0xb6,
-    0xc3,
-    0xb4,
-    0x44,
-    0x57,
-    0x08,
-    0xaa,
-    0x4f,
-    0xb0,
-    0xd1,
-    0x0f,
-    0x22,
-    0x71,
-    0x22,
-    0xa4,
-    0x0d,
-    0xfb,
-    0xe2,
-    0x86,
-    0x40,
-    0x0d,
-    0xe9,
-    0xfb,
-    0x83,
-    0xa0,
-    0x5a,
-    0x6b,
-    0x28,
-    0x0f,
-    0x33,
-    0xad,
-    0x3e,
-    0x7b,
-    0x22,
-    0x85,
-    0x08,
-    0x6e,
-    0x9b,
-    0x6a,
-    0xae,
-    0xbe,
-    0x27,
-    0x8c,
-    0x31,
-    0xb5,
-    0xff,
-    0x15,
-    0xa4,
-    0x6e,
-    0xd9,
-    0xaf,
-    0x9a,
-    0x82,
-    0x02,
-    0x47,
-    0xdb,
-    0xe5,
-    0xad,
-    0x11,
-    0x5b,
-    0x0a,
-    0x8b,
-    0xcd,
-    0x6c,
-    0x4e,
-    0x9b,
-    0x48,
-    0x32,
-    0x93,
-    0x44,
-    0x25,
-    0x57,
-    0x2b,
-    0xa1,
-    0xdd,
-    0x01,
-    0xf9,
-    0x1c,
-    0x05,
-    0x01,
-    0xd2,
-    0x3e,
-    0xd0,
-    0x4e,
-    0x29,
-    0xc5,
-    0xd4,
-    0xb1,
-    0xec,
-    0xf7,
-    0x11,
-    0xc1,
-    0xa9,
-    0x37,
-    0x2f,
-    0x12,
-    0xf5,
-    0xd6,
-    0x07,
-    0xaa,
-    0x0e,
-    0x2b,
-    0x65,
-    0xb4,
-    0xbf,
-    0xe6,
-    0x0c,
-    0x79,
-    0x84,
-    0xa1,
-    0xfb,
-    0x8b,
-    0xef,
-    0xb8,
-    0xef,
-    0x43,
-    0x4a,
-    0x5b,
-    0x29,
-    0x6e,
-    0x7e,
-    0xe1,
-    0x71,
-    0x44,
-    0x34,
-    0x5f,
-    0x5b,
-    0x9a,
-    0x39,
-    0x7a,
-    0xc9,
-    0x58,
-    0x27,
-    0x79,
-    0xb1,
-    0x2c,
-    0x42,
-    0x9f,
-    0x21,
-    0x80,
-    0xa0,
-    0xb7,
-    0x80,
-    0xaa,
-    0x8d,
-    0xf0,
-    0x16,
-    0x63,
-    0x2d,
-    0xeb,
-    0xcf,
-    0x7b,
-    0x63,
-    0x13,
-    0x3b,
-    0xcb,
-    0xf2,
-    0x2d,
-    0xda,
-    0x6a,
-    0xe2,
-    0x2f,
-    0x97,
-    0x24,
-    0x26,
-    0x56,
-    0x92,
-    0x27,
-    0x7b,
-    0x73,
-    0x22,
-    0x00,
-    0x93,
-    0x86,
-    0x1b,
-    0xc6,
-    0x73,
-    0x8d,
-    0x4c,
-    0x95,
-    0x1a,
-    0x9e,
-    0x4c,
-    0x3e,
-    0x63,
-    0x34,
-    0x77,
-    0x3d,
-    0x2c,
-    0xc7,
-    0x33,
-    0xec,
-    0xb8,
-    0x9f,
-    0x78,
-    0xf6,
-    0x52,
-    0xe9,
-    0x8f,
-    0x0d,
-    0x33,
-    0x0b,
-    0x19,
-    0xe0,
-    0xa6,
-    0x35,
-    0x54,
-    0x47,
-    0x6a,
-    0x38,
-    0x9a,
-    0xc1,
-    0x58,
-    0x9c,
-    0x2a,
-    0x21,
-    0x45,
-    0xec,
-    0x2b,
-    0x84,
-    0x2a,
-    0x55,
-    0xee,
-    0x86,
-    0x83,
-    0x70,
-    0x74,
-    0xb6,
-    0xf4,
-    0x5b,
-    0x30,
-    0x47,
-    0x32,
-    0x0e,
-    0x0d,
-    0x08,
-    0x21,
-    0xec,
-    0xb3,
-    0x96,
-    0x3a,
-    0x99,
-    0x06,
-    0xcf,
-    0x30,
-    0x0c,
-    0xf0,
-    0x8b,
-    0xd3,
-    0xe5,
-    0x61,
-    0x87,
-    0x34,
-    0x00,
-    0x94,
-    0xa2,
-    0x0a,
-    0x4a,
-    0x93,
-    0x4c,
-    0x54,
-    0xd3,
-    0xfd,
-    0x3b,
-    0x40,
-    0x25,
-    0x07,
-    0x5f,
-    0x4c,
-    0xd5,
-    0xc1,
-    0x19,
-    0xab,
-    0x57,
-    0x9b,
-    0xa8,
-    0xea,
-    0x16,
-    0x27,
-    0xe4,
-    0xd3,
-    0xc4,
-    0x20,
-    0x2e,
-    0x92,
-    0xef,
-    0xac,
-    0xa7,
-    0x16,
-    0xd6,
-    0xde,
-    0xa0,
-    0xba,
-    0x7a,
-    0x7f,
-    0x52,
-    0x25,
-    0xf8,
-    0x0e,
-    0xcf,
-    0x6e,
-    0x15,
-    0x05,
-    0x39,
-    0x84,
-    0x1b,
-    0x5e,
-    0x32,
-    0xce,
-    0xe4,
-    0x56,
-    0x93,
-    0x0e,
-    0x34,
-    0x71,
-    0x61,
-    0x8b,
-    0x4c,
-    0xbe,
-    0xfd,
-    0x6f,
-    0xbb,
-    0x5c,
-    0x9a,
-    0x6e,
-    0x78,
-    0x3d,
-    0xf4,
-    0xa8,
-    0x2e,
-    0x2a,
-    0x40,
-    0xd1,
-    0xd7,
-    0x07,
-    0x5e,
-    0x8f,
-    0x8c,
-    0x59,
-    0x56,
-    0x23,
-    0x9b,
-    0x05,
-    0x02,
-    0x4c,
-    0xdb,
-    0x5a,
-    0x08,
-    0x68,
-    0x3c,
-    0x52,
-    0x0c,
-    0xdd,
-    0xa2,
-    0x15,
-    0x23,
-    0xb7,
-    0xf4,
-    0xbf,
-    0x8a,
-    0x93,
-    0x6f,
-    0x63,
-    0x98,
-    0xbb,
-    0x41,
-    0x50,
-    0xf1,
-    0x92,
-    0x53,
-    0x93,
-    0xfd,
-    0x33,
-    0x66,
-    0xbd,
-    0x98,
-    0x55,
-    0x61,
-    0xe6,
-    0x0b,
-    0x72,
-    0xe9,
-    0xf1,
-    0x3b,
-    0x28,
-    0x33,
-    0x12,
-    0x21,
-    0xdf,
-    0x16,
-    0x8e,
-    0x7a,
-    0xac,
-    0x65,
-    0xc2,
-    0xc0,
-    0x75,
-    0x7b,
-    0x67,
-    0x58,
-    0x56,
-    0x17,
-    0x14,
-    0x0d,
-    0x44,
-    0x6b,
-    0x04,
-    0xbd,
-    0xf0,
-    0x6f,
-    0x1a,
-    0x52,
-    0xee,
-    0x7b,
-    0x22,
-    0xf4,
-    0x17,
-    0x15,
-    0x5a,
-    0x7e,
-    0x2c,
-    0x08,
-    0x31,
-    0x2e,
-    0xbc,
-    0xb6,
-    0x4e,
-    0xa0,
-    0x47,
-    0xae,
-    0xd4,
-    0xfd,
-    0xa3,
-    0x81,
-    0xe5,
-    0x70,
-    0x9f,
-    0xd2,
-    0x65,
-    0xd9,
-    0xe7,
-    0xad,
-    0x00,
-    0xc6,
-    0x27,
-    0x1a,
-    0x6e,
-    0x9f,
-    0x73,
-    0xf1,
-    0xf5,
-    0x20,
-    0xe7,
-    0xef,
-    0x30,
-    0x0c,
-    0x8a,
-    0x0a,
-    0x10,
-    0x20,
-    0x78,
-    0x02,
-    0x20,
-    0x46,
-    0x41,
-    0x39,
-    0x0d,
-    0x0c,
-    0x8c,
-    0xc4,
-    0x65,
-    0x54,
-    0x00,
-    0xc2,
-    0x9f,
-    0x4d,
-    0x64,
-    0xec,
-    0x5c,
-    0xa2,
-    0x04,
-    0x6e,
-    0xec,
-    0xf1,
-    0x57,
-    0xf6,
-    0x14,
-    0x7e,
-    0xe0,
-    0x0a,
-    0x0e,
-    0x29,
-    0x52,
-    0x9e,
-    0xd2,
-    0x9d,
-    0xf7,
-    0xe6,
-    0x94,
-    0xcb,
-    0x52,
-    0x69,
-    0x8e,
-    0x97,
-    0x04,
-    0x57,
-    0xff,
-    0xd0,
-    0xec,
-    0x1c,
-    0x74,
-    0x66,
-    0x92,
-    0x35,
-    0x46,
-    0xd7,
-    0xc6,
-    0x42,
-    0x64,
-    0xeb,
-    0x84,
-    0x5d,
-    0x52,
-    0xa1,
-    0x1b,
-    0xab,
-    0x72,
-    0x69,
-    0x8e,
-    0x30,
-    0x83,
-    0x93,
-    0x3b,
-    0xe8,
-    0x67,
-    0x08,
-    0xba,
-    0x13,
-    0x29,
-    0x38,
-    0x08,
-    0xd0,
-    0x3e,
-    0x53,
-    0xe5,
-    0xed,
-    0x0b,
-    0xbc,
-    0x7a,
-    0xfe,
-    0xa8,
-    0xbb,
-    0x3f,
-    0xac,
-    0xe4,
-    0x72,
-    0x1c,
-    0x50,
-    0x89,
-    0x12,
-    0xcf,
-    0xc1,
-    0xe1,
-    0x4e,
-    0x8d,
-    0x69,
-    0x78,
-    0x10,
-    0xec,
-    0x9f,
-    0x24,
-    0x6b,
-    0x00,
-    0x31,
-    0x43,
-    0xd2,
-    0xc4,
-    0x3f,
-    0x44,
-    0x87,
-    0xbc,
-    0x50,
-    0x69,
-    0x55,
-    0xd9,
-    0x9f,
-    0xca,
-    0x82,
-    0x9d,
-    0xb6,
-    0x9e,
-    0x00,
-    0x7f,
-    0x3e,
-    0xb6,
-    0xe3,
-    0x91,
-    0x16,
-    0x4a,
-    0x18,
-    0x60,
-    0xa2,
-    0xf8,
-    0x53,
-    0x1c,
-    0x66,
-    0x0a,
-    0x49,
-    0xf9,
-    0xd3,
-    0xf8,
-    0x20,
-    0xd4,
-    0x60,
-    0x2d,
-    0x23,
-    0x1a,
-    0xdd,
-    0x0e,
-    0xbb,
-    0xe6,
-    0x04,
-    0x39,
-    0x9a,
-    0x69,
-    0x52,
-    0x0a,
-    0x3a,
-    0x8f,
-    0x15,
-    0x64,
-    0x86,
-    0xdf,
-    0xc5,
-    0xae,
-    0xd7,
-    0xa4,
-    0x97,
-    0x1b,
-    0x21,
-    0x4a,
-    0x50,
-    0x2f,
-    0x6f,
-    0x0a,
-    0x57,
-    0x7f,
-    0x8c,
-    0xca,
-    0x0f,
-    0xb8,
-    0x03,
-    0x3e,
-    0x63,
-    0xe2,
-    0x4a,
-    0x54,
-    0xa3,
-    0xe6,
-    0x3b,
-    0xcf,
-    0x8e,
-    0x4e,
-    0xc3,
-    0x31,
-    0xb0,
-    0x4d,
-    0xde,
-    0xdf,
-    0xee,
-    0xff,
-    0xc3,
-    0x80,
-    0x5f,
-    0xf1,
-    0x5b,
-    0xa6,
-    0x5d,
-    0xe4,
-    0xf8,
-    0xb0,
-    0xdc,
-    0xce,
-    0x44,
-    0xef,
-    0xfb,
-    0x22,
-    0x78,
-    0x07,
-    0xd9,
-    0x51,
-    0xce,
-    0x98,
-    0xaa,
-    0x91,
-    0x38,
-    0x1e,
-    0x0a,
-    0xdd,
-    0x52,
-    0x16,
-    0x90,
-    0x3d,
-    0x95,
-    0x63,
-    0xa7,
-    0x47,
-    0xce,
-    0xef,
-    0x99,
-    0xe6,
-    0xcf,
-    0x95,
-    0xed,
-    0x5a,
-    0x65,
-    0x3f,
-    0xf3,
-    0x80,
-    0x8a,
-    0x4b,
-    0x9d,
-    0x54,
-    0xdb,
-    0x34,
-    0x90,
-    0xb4,
-    0x4c,
-    0x6e,
-    0x7b,
-    0x67,
-    0x1a,
-    0x91,
-    0xa8,
-    0x5d,
-    0x01,
-    0xba,
-    0xd1,
-    0x38,
-    0xb0,
-    0x2e,
-    0x34,
-    0x0c,
-    0x7a,
-    0x41,
-    0xe9,
-    0x63,
-    0x4e,
-    0x77,
-    0x74,
-    0x85,
-    0xe9,
-    0xe8,
-    0x97,
-    0xf6,
-    0x4a,
-    0xe9,
-    0x6a,
-    0x3f,
-    0x66,
-    0xe8,
-    0xad,
-    0xf1,
-    0x1e,
-    0x98,
-    0x5c,
-    0xe8,
-    0x6e,
-    0x4f,
-    0x84,
-    0xcd,
-    0xe7,
-    0xac,
-    0x56,
-    0xde,
-    0x5f,
-    0x7c,
-    0x79,
-    0xf2,
-    0xe7,
-    0xde,
-    0xa5,
-    0xb7,
-    0xfd,
-    0xa6,
-    0x6e,
-    0x3f,
-    0x03,
-    0x00,
-    0x5d,
-    0xbb,
-    0xf0,
-    0x56,
-    0x45,
-    0x86,
-    0x46,
-    0x73,
-    0xd4,
-    0x65,
-    0x44,
-    0xe8,
-    0x69,
-    0x0d,
-    0x5c,
-    0xae,
-    0x25,
-    0xe5,
-    0xe7,
-    0x0e,
-    0x45,
-    0x0e,
-    0x18,
-    0xbe,
-    0xaf,
-    0xa1,
-    0x2e,
-    0x4d,
-    0xca,
-    0x37,
-    0xee,
-    0xc0,
-    0x93,
-    0xaf,
-    0x51,
-    0x7e,
-    0xee,
-    0x2b,
-    0x7a,
-    0x69,
-    0x39,
-    0x5c,
-    0xea,
-    0x4e,
-    0x27,
-    0x00,
-    0xf7,
-    0x7f,
-    0xcc,
-    0xa8,
-    0x7a,
-    0xbe,
-    0xf4,
-    0xbf,
-    0xc9,
-    0x5d,
-    0xb9,
-    0xc8,
-    0xe5,
-    0xa4,
-    0x55,
-    0xe7,
-    0xf4,
-    0x73,
-    0x34,
-    0xa3,
-    0xf1,
-    0x28,
-    0x4e,
-    0xea,
-    0xa2,
-    0xc3,
-    0xb3,
-    0x55,
-    0xca,
-    0x49,
-    0x67,
-    0xae,
-    0xa1,
-    0x66,
-    0x71,
-    0xb0,
-    0x81,
-    0x55,
-    0x2f,
-    0x0d,
-    0xe2,
-    0x05,
-    0xec,
-    0xb6,
-    0x88,
-    0x74,
-    0xb4,
-    0x56,
-    0xfb,
-    0x5f,
-    0x67,
-    0x1f,
-    0x38,
-    0x1e,
-    0x0d,
-    0xca,
-    0xa6,
-    0xca,
-    0x69,
-    0xd9,
-    0x4b,
-    0xa0,
-    0xd1,
-    0x20,
-    0x40,
-    0xaa,
-    0x3d,
-    0x83,
-    0x62,
-    0x9c,
-    0x9d,
-    0x01,
-    0x4b,
-    0xfc,
-    0x70,
-    0xf2,
-    0x81,
-    0x85,
-    0x92,
-    0x8c,
-    0xec,
-    0xce,
-    0x55,
-    0xac,
-    0x8e,
-    0x27,
-    0xd4,
-    0xd4,
-    0x6e,
-    0xc3,
-    0x84,
-    0x6f,
-    0xd5,
-    0x1d,
-    0x0c,
-    0x5d,
-    0xbd,
-    0x94,
-    0x57,
-    0xab,
-    0x87,
-    0x58,
-    0xe7,
-    0xa2,
-    0xec,
-    0x8a,
-    0x6c,
-    0x04,
-    0x36,
-    0x9f,
-    0x95,
-    0x92,
-    0xb0,
-    0x06,
-    0x26,
-    0xd1,
-    0x5b,
-    0x0a,
-    0x4b,
-    0x0e,
-    0xe2,
-    0xf9,
-    0x2b,
-    0xa0,
-    0xd0,
-    0x86,
-    0xc1,
-    0x6d,
-    0x01,
-    0x6c,
-    0xe7,
-    0xb0,
-    0x56,
-    0x54,
-    0xb4,
-    0xf9,
-    0xad,
-    0xf9,
-    0x08,
-    0x75,
-    0x11,
-    0x8a,
-    0x65,
-    0x6f,
-    0x2d,
-    0x50,
-    0x01,
-    0x17,
-    0x07,
-    0x90,
-    0x19,
-    0x82,
-    0xeb,
-    0xb3,
-    0x87,
-    0xf3,
-    0xa4,
-    0xa4,
-    0x97,
-    0x59,
-    0xf3,
-    0x7a,
-    0x17,
-    0x18,
-    0x39,
-    0x57,
-    0xad,
-    0x0c,
-    0x77,
-    0x8f,
-    0x6e,
-    0xcb,
-    0x78,
-    0x0d,
-    0xab,
-    0x2b,
-    0x4d,
-    0xf3,
-    0x0e,
-    0x05,
-    0xfa,
-    0x81,
-    0xe6,
-    0x38,
-    0x6f,
-    0x38,
-    0xc0,
-    0xf0,
-    0xba,
-    0x3f,
-    0x37,
-    0x28,
-    0x7a,
-    0x05,
-    0x0d,
-    0x6d,
-    0x97,
-    0x28,
-    0x7a,
-    0xe5,
-    0x30,
-    0x96,
-    0xc3,
-    0x91,
-    0xd5,
-    0xf2,
-    0x0f,
-    0xcf,
-    0xf7,
-    0x39,
-    0x77,
-    0x23,
-    0x9c,
-    0xa5,
-    0x5c,
-    0x36,
-    0x57,
-    0xd1,
-    0xfd,
-    0x1f,
-    0x78,
-    0x1f,
-    0x48,
-    0xe2,
-    0x80,
-    0x57,
-    0xf1,
-    0x36,
-    0xd8,
-    0x90,
-    0xc2,
-    0x8c,
-    0xc2,
-    0x54,
-    0x32,
-    0x4c,
-    0x8f,
-    0xff,
-    0x38,
-    0x62,
-    0x13,
-    0x68,
-    0x61,
-    0xf9,
-    0x56,
-    0xc3,
-    0x21,
-    0x86,
-    0x8c,
-    0xc6,
-    0x66,
-    0x09,
-    0x47,
-    0x0b,
-    0x73,
-    0x90,
-    0xec,
-    0xb6,
-    0xec,
-    0xfc,
-    0x63,
-    0x57,
-    0x2d,
-    0x07,
-    0x13,
-    0x12,
-    0xe0,
-    0x86,
-    0x0e,
-    0xfd,
-    0xcf,
-    0xec,
-    0x88,
-    0xc9,
-    0xf6,
-    0x10,
-    0x8e,
-    0xa5,
-    0xdd,
-    0x30,
-    0xf5,
-    0x5f,
-    0x25,
-    0x35,
-    0x90,
-    0xcc,
-    0x60,
-    0x38,
-    0xa6,
-    0x6b,
-    0x26,
-    0x46,
-    0xa2,
-    0x45,
-    0x65,
-    0x60,
-    0x0d,
-    0x17,
-    0xf8,
-    0xc6,
-    0xba,
-    0xb3,
-    0x7b,
-    0x76,
-    0x40,
-    0xa4,
-    0x5e,
-    0xef,
-    0xad,
-    0x11,
-    0x39,
-    0x3a,
-    0x79,
-    0xe4,
-    0x5f,
-    0x2b,
-    0xb9,
-    0x2a,
-    0xb6,
-    0xe5,
-    0x95,
-    0xbd,
-    0xc6,
-    0x9c,
-    0xfc,
-    0x21,
-    0x0f,
-    0x9f,
-    0x97,
-    0xad,
-    0xa0,
-    0x95,
-    0xfb,
-    0xeb,
-    0xe5,
-    0x06,
-    0x22,
-    0x41,
-    0xc1,
-    0x1e,
-    0x1c,
-    0xd0,
-    0xdc,
-    0xae,
-    0x02,
-    0x9c,
-    0x3f,
-    0x74,
-    0x2c,
-    0xed,
-    0x1e,
-    0x9c,
-    0xa3,
-    0xf6,
-    0xf4,
-    0x86,
-    0xd9,
-    0xb5,
-    0xd6,
-    0xca,
-    0x98,
-    0x1a,
-    0x00,
-    0x7a,
-    0x39,
-    0x6b,
-    0xb5,
-    0xa7,
-    0x16,
-    0xe7,
-    0x46,
-    0x26,
-    0x42,
-    0xaa,
-    0x70,
-    0x93,
-    0x77,
-    0xd0,
-    0xea,
-    0x97,
-    0x4f,
-    0xdd,
-    0x3f,
-    0x67,
-    0xb7,
-    0x5d,
-    0xda,
-    0x8d,
-    0xa1,
-    0xc7,
-    0x5f,
-    0xeb,
-    0xfa,
-    0xa7,
-    0x42,
-    0xfd,
-    0xdc,
-    0xfc,
-    0x92,
-    0x5e,
-    0x04,
-    0xdf,
-    0x15,
-    0x8e,
-    0x86,
-    0x66,
-    0x9a,
-    0xf2,
-    0xbf,
-    0xc8,
-    0x8b,
-    0x1c,
-    0x8c,
-    0xc2,
-    0xc2,
-    0x4d,
-    0xb9,
-    0x39,
-    0x9d,
-    0x38,
-    0xbd,
-    0x20,
-    0x55,
-    0x09,
-    0xa4,
-    0x9c,
-    0x8b,
-    0xa6,
-    0x4c,
-    0x66,
-    0x24,
-    0x35,
-    0xd4,
-    0x72,
-    0x57,
-    0xde,
-    0x52,
-    0xce,
-    0x04,
-    0xd2,
-    0xc4,
-    0xcc,
-    0x48,
-    0x8c,
-    0x4a,
-    0x63,
-    0x4e,
-    0x57,
-    0x92,
-    0xd3,
-    0x68,
-    0x10,
-    0x93,
-    0x88,
-    0x5e,
-    0x2d,
-    0x7e,
-    0x41,
-    0x06,
-    0xfe,
-    0xf1,
-    0x71,
-    0x14,
-    0x33,
-    0x6e,
-    0xe5,
-    0x34,
-    0x9f,
-    0x0d,
-    0xa8,
-    0x56,
-    0x3b,
-    0x6d,
-    0x24,
-    0x49,
-    0x6e,
-    0xf0,
-    0x89,
-    0x8c,
-    0x8b,
-    0x28,
-    0x73,
-    0x61,
-    0x9c,
-    0x8c,
-    0xc7,
-    0x22,
-    0x5e,
-    0x70,
-    0xdd,
-    0xd8,
-    0x8c,
-    0x34,
-    0xe5,
-    0x0a,
-    0x60,
-    0xbb,
-    0x83,
-    0xd3,
-    0x58,
-    0x1e,
-    0xbd,
-    0x37,
-    0x36,
-    0xa2,
-    0x17,
-    0xb7,
-    0x4a,
-    0xe8,
-    0xfc,
-    0x23,
-    0xf3,
-    0x64,
-    0x60,
-    0xb0,
-    0x64,
-    0x10,
-    0xa4,
-    0x4b,
-    0xa4,
-    0x62,
-    0xba,
-    0x2c,
-    0xd8,
-    0x7b,
-    0x89,
-    0xad,
-    0xc5,
-    0xa1,
-    0x93,
-    0x5d,
-    0x91,
-    0xef,
-    0xd5,
-    0x50,
-    0xc9,
-    0x4b,
-    0xee,
-    0xba,
-    0xa9,
-    0x99,
-    0x84,
-    0xbc,
-    0x97,
-    0x2e,
-    0xe4,
-    0x7e,
-    0xf0,
-    0x88,
-    0xe8,
-    0x7e,
-    0x07,
-    0x3c,
-    0x1e,
-    0x28,
-    0x6b,
-    0x2f,
-    0x26,
-    0xa6,
-    0x69,
-    0x09,
-    0x5c,
-    0xf9,
-    0xd2,
-    0xe7,
-    0xb8,
-    0x49,
-    0xff,
-    0x51,
-    0xf2,
-    0x79,
-    0x11,
-    0x6b,
-    0xe9,
-    0xff,
-    0x7d,
-    0x6f,
-    0x45,
-    0xf3,
-    0xc9,
-    0x5a,
-    0x5b,
-    0x65,
-    0x90,
-    0xe6,
-    0x52,
-    0xf4,
-    0xcc,
-    0xb9,
-    0x84,
-    0x9c,
-    0x55,
-    0xdc,
-    0x27,
-    0xd0,
-    0xa4,
-    0x6e,
-    0x2d,
-    0xc9,
-    0xdd,
-    0x9a,
-    0x68,
-    0x1d,
-    0x0d,
-    0xc6,
-    0xf2,
-    0x93,
-    0xaf,
-    0x0d,
-    0xcc,
-    0x36,
-    0x76,
-    0xf0,
-    0xc5,
-    0xa8,
-    0x46,
-    0x48,
-    0x9e,
-    0xb9,
-    0x83,
-    0x7f,
-    0x6b,
-    0x38,
-    0x8f,
-    0x00,
-    0x3c,
-    0x0a,
-    0x8e,
-    0xec,
-    0xfd,
-    0x78,
-    0x6d,
-    0x0f,
-    0x9b,
-    0xcd,
-    0x22,
-    0x12,
-    0x69,
-    0x21,
-    0x35,
-    0xf2,
-    0xc1,
-    0x70,
-    0x7f,
-    0xb1,
-    0xee,
-    0xef,
-    0x32,
-    0x4b,
-    0x49,
-    0x9f,
-    0x19,
-    0xeb,
-    0xa3,
-    0x22,
-    0x21,
-    0x5f,
-    0xe3,
-    0xce,
-    0x19,
-    0xc9,
-    0xf0,
-    0x00,
-    0xb6,
-    0x98,
-    0xd2,
-    0xb2,
-    0xda,
-    0xb7,
-    0x14,
-    0x50,
-    0x15,
-    0x04,
-    0x6c,
-    0xc8,
-    0x6d,
-    0x04,
-    0x9e,
-    0xe1,
-    0x5a,
-    0xd5,
-    0x9d,
-    0xcd,
-    0x15,
-    0x64,
-    0xf3,
-    0x01,
-    0x12,
-    0xe0,
-    0x64,
-    0x44,
-    0xcb,
-    0x6e,
-    0xce,
-    0x06,
-    0xc0,
-    0x1e,
-    0x54,
-    0xf4,
-    0xbc,
-    0x1d,
-    0xbb,
-    0xc9,
-    0x59,
-    0x2d,
-    0x14,
-    0x67,
-    0xc6,
-    0x53,
-    0x9c,
-    0x26,
-    0xc8,
-    0xcf,
-    0xe0,
-    0x6c,
-    0xff,
-    0x51,
-    0x25,
-    0x7e,
-    0x6b,
-    0x6a,
-    0x06,
-    0x95,
-    0x2f,
-    0x41,
-    0x5f,
-    0x35,
-    0x94,
-    0x87,
-    0x6a,
-    0xba,
-    0x50,
-    0xad,
-    0x28,
-    0x34,
-    0x09,
-    0x54,
-    0x03,
-    0x74,
-    0x15,
-    0x05,
-    0xb1,
-    0x67,
-    0x84,
-    0x22,
-    0x5b,
-    0xa3,
-    0x60,
-    0x1c,
-    0xff,
-    0x40,
-    0x33,
-    0xe7,
-    0x13,
-    0xe9,
-    0xca,
-    0xab,
-    0x6b,
-    0x32,
-    0x39,
-    0xbd,
-    0x5c,
-    0x2c,
-    0x1f,
-    0xcd,
-    0x22,
-    0x38,
-    0x2b,
-    0x61,
-    0x7f,
-    0x18,
-    0xdf,
-    0x82,
-    0xa5,
-    0x4c,
-    0x94,
-    0xb4,
-    0x56,
-    0x9b,
-    0xbf,
-    0x2c,
-    0x4a,
-    0xf0,
-    0x72,
-    0x3e,
-    0xd1,
-    0x67,
-    0x26,
-    0x15,
-    0xb9,
-    0xa8,
-    0xb7,
-    0xa6,
-    0x72,
-    0x74,
-    0xb0,
-    0xe6,
-    0x70,
-    0x7d,
-    0xc9,
-    0x3b,
-    0xd1,
-    0x7b,
-    0xae,
-    0x31,
-    0x40,
-    0x7c,
-    0x02,
-    0x6f,
-    0x19,
-    0x7b,
-    0xa4,
-    0xe9,
-    0xcd,
-    0x35,
-    0x31,
-    0x57,
-    0x89,
-    0x38,
-    0xca,
-    0xe5,
-    0x12,
-    0x3d,
-    0x17,
-    0x2c,
-    0xf4,
-    0xb7,
-    0x8b,
-    0x61,
-    0xdb,
-    0xac,
-    0xea,
-    0xcc,
-    0x41,
-    0xc4,
-    0x09,
-    0x7c,
-    0x49,
-    0xa0,
-    0xd6,
-    0x3a,
-    0xeb,
-    0x6c,
-    0x97,
-    0xbb,
-    0x52,
-    0xb8,
-    0x77,
-    0x1a,
-    0x82,
-    0x83,
-    0x3e,
-    0x85,
-    0x3e,
-    0x99,
-    0x60,
-    0x36,
-    0x29,
-    0x20,
-    0x39,
-    0xa4,
-    0x2b,
-    0x6d,
-    0x97,
-    0xfb,
-    0x16,
-    0x1c,
-    0x79,
-    0xca,
-    0x8a,
-    0x5f,
-    0x16,
-    0xfc,
-    0x16,
-    0x96,
-    0x21,
-    0x0a,
-    0x9f,
-    0x20,
-    0x4c,
-    0x6f,
-    0x06,
-    0x71,
-    0x0b,
-    0x5b,
-    0x05,
-    0x65,
-    0x9a,
-    0xab,
-    0x5a,
-    0xd4,
-    0x41,
-    0x19,
-    0x28,
-    0x67,
-    0xd7,
-    0xb0,
-    0x9a,
-    0xaa,
-    0x85,
-    0x84,
-    0xc9,
-    0x62,
-    0xcc,
-    0x9f,
-    0xe0,
-    0x20,
-    0xc9,
-    0x3e,
-    0x7e,
-    0x16,
-    0xb8,
-    0x3e,
-    0x5b,
-    0x2a,
-    0xb8,
-    0xd1,
-    0x2f,
-    0x49,
-    0xcd,
-    0x75,
-    0xcf,
-    0xfe,
-    0x2b,
-    0x27,
-    0x99,
-    0x43,
-    0xb2,
-    0xd3,
-    0x13,
-    0x97,
-    0xb5,
-    0x10,
-    0xcf,
-    0x50,
-    0xff,
-    0x0a,
-    0x92,
-    0x33,
-    0x18,
-    0xbf,
-    0xb4,
-    0x42,
-    0xc4,
-    0x6f,
-    0xca,
-    0xd5,
-    0xcd,
-    0x4d,
-    0x83,
-    0xec,
-    0x02,
-    0x7b,
-    0xd0,
-    0xc4,
-    0x80,
-    0x35,
-    0x48,
-    0xa8,
-    0x30,
-    0x4d,
-    0xca,
-    0x0a,
-    0x91,
-    0xd7,
-    0x64,
-    0xd2,
-    0xb8,
-    0x25,
-    0x73,
-    0xf6,
-    0x95,
-    0xf6,
-    0x0c,
-    0x4b,
-    0x77,
-    0xea,
-    0x9b,
-    0x9b,
-    0xd2,
-    0x39,
-    0xca,
-    0xf7,
-    0x41,
-    0xa5,
-    0xa5,
-    0x4e,
-    0xc7,
-    0xad,
-    0xfb,
-    0x3f,
-    0x5a,
-    0x04,
-    0x07,
-    0x2c,
-    0xa2,
-    0x41,
-    0x4f,
-    0x90,
-    0xfe,
-    0xd8,
-    0xcd,
-    0x92,
-    0xc8,
-    0x49,
-    0x4d,
-    0xda,
-    0xda,
-    0x97,
-    0x16,
-    0xa3,
-    0x50,
-    0xfc,
-    0xcc,
-    0x11,
-    0x90,
-    0xdb,
-    0x95,
-    0xc5,
-    0x88,
-    0xf6,
-    0x7b,
-    0xb0,
-    0x37,
-    0xe1,
-    0x12,
-    0x24,
-    0x6f,
-    0xb7,
-    0x5a,
-    0x31,
-    0xd9,
-    0x0b,
-    0xe6,
-    0x2e,
-    0x39,
-    0x21,
-    0x3e,
-    0x96,
-    0xf3,
-    0x5e,
-    0x83,
-    0x16,
-    0xcf,
-    0xfe,
-    0x51,
-    0xe3,
-    0xf9,
-    0x05,
-    0xe9,
-    0x51,
-    0x4c,
-    0x78,
-    0x90,
-    0xa2,
-    0xcf,
-    0xcc,
-    0x32,
-    0x1b,
-    0x80,
-    0x9f,
-    0x4b,
-    0x5e,
-    0x51,
-    0xa6,
-    0x08,
-    0xf3,
-    0x71,
-    0xe7,
-    0xa9,
-    0x28,
-    0xcc,
-    0x28,
-    0x29,
-    0x1b,
-    0xd5,
-    0xa7,
-    0x21,
-    0x15,
-    0x83,
-    0x0b,
-    0xea,
-    0x19,
-    0x99,
-    0x9b,
-    0x01,
-    0xbd,
-    0x2b,
-    0xae,
-    0xb0,
-    0x39,
-    0x5e,
-    0x62,
-    0xeb,
-    0xbe,
-    0x6f,
-    0x91,
-    0x79,
-    0x09,
-    0xf7,
-    0x01,
-    0x54,
-    0x37,
-    0x6d,
-    0xdb,
-    0x51,
-    0xdb,
-    0xec,
-    0x5f,
-    0x03,
-    0x4e,
-    0x36,
-    0xd5,
-    0xdd,
-    0x46,
-    0xfa,
-    0xc7,
-    0x98,
-    0xaa,
-    0x52,
-    0x6d,
-    0xd4,
-    0xa5,
-    0x90,
-    0x69,
-    0x02,
-    0xfa,
-    0x3a,
-    0xb5,
-    0x81,
-    0x97,
-    0x53,
-    0xd9,
-    0x07,
-    0x6c,
-    0xdc,
-    0x61,
-    0x43,
-    0x7d,
-    0x9b,
-    0x8e,
-    0xc1,
-    0x36,
-    0x1b,
-    0x4c,
-    0x0d,
-    0xff,
-    0xf4,
-    0x64,
-    0x1b,
-    0x11,
-    0x4c,
-    0xf3,
-    0xe6,
-    0x88,
-    0x9e,
-    0x1b,
-    0x58,
-    0xb9,
-    0xbb,
-    0xf8,
-    0x6a,
-    0xc5,
-    0x0e,
-    0xd5,
-    0x8c,
-    0x6f,
-    0x23,
-    0xa0,
-    0x47,
-    0x2a,
-    0x6b,
-    0x9c,
-    0x21,
-    0x76,
-    0x39,
-    0x56,
-    0xc1,
-    0x6d,
-    0x11,
-    0xda,
-    0x53,
-    0x99,
-    0x22,
-    0x26,
-    0x2e,
-    0x09,
-    0x11,
-    0xdf,
-    0xb4,
-    0xa4,
-    0xf8,
-    0x43,
-    0x7a,
-    0xbd,
-    0xaf,
-    0x5f,
-    0xaa,
-    0xe7,
-    0x4a,
-    0x82,
-    0xa5,
-    0x0a,
-    0xe2,
-    0xf1,
-    0xec,
-    0xb6,
-    0x99,
-    0xdc,
-    0x40,
-    0xb8,
-    0xd8,
-    0x91,
-    0x08,
-    0xeb,
-    0xdb,
-    0xf0,
-    0xf4,
-    0x51,
-    0x70,
-    0x1f,
-    0xe0,
-    0x62,
-    0xfb,
-    0x7f,
-    0xfb,
-    0xa4,
-    0xbe,
-    0xde,
-    0x28,
-    0x7c,
-    0x57,
-    0xee,
-    0xa4,
-    0x44,
-    0x8a,
-    0xf5,
-    0xe9,
-    0x9d,
-    0x41,
-    0xc7,
-    0xd3,
-    0x07,
-    0xd1,
-    0xf2,
-    0x02,
-    0xaf,
-    0x7f,
-    0x38,
-    0x7f,
-    0x87,
-    0x43,
-    0x42,
-    0xa2,
-    0x9c,
-    0xcc,
-    0x92,
-    0x33,
-    0xa5,
-    0xc3,
-    0xba,
-    0xcf,
-    0xd7,
-    0x54,
-    0xcb,
-    0x8d,
-    0x01,
-    0xeb,
-    0x11,
-    0xe2,
-    0xd4,
-    0x3b,
-    0xfd,
-    0xc2,
-    0x82,
-    0x85,
-    0x63,
-    0x08,
-    0x8c,
-    0x17,
-    0xe6,
-    0x18,
-    0xd4,
-    0x13,
-    0xb0,
-    0xc3,
-    0xfa,
-    0x71,
-    0x66,
-    0x6b,
-    0xe5,
-    0x47,
-    0x5a,
-    0x67,
-    0xa0,
-    0x48,
-    0x03,
-    0xa8,
-    0x68,
-    0x8b,
-    0xab,
-    0x9d,
-    0x03,
-    0x8f,
-    0x68,
-    0x55,
-    0x53,
-    0x7b,
-    0x4d,
-    0xe4,
-    0x2a,
-    0xaa,
-    0xe1,
-    0x07,
-    0x60,
-    0x66,
-    0xd0,
-    0x0b,
-    0x23,
-    0xf4,
-    0xe1,
-    0xea,
-    0x8f,
-    0xd2,
-    0x28,
-    0xb8,
-    0x7e,
-    0x3c,
-    0x7d,
-    0x3d,
-    0xa2,
-    0xf4,
-    0x2d,
-    0xe4,
-    0xd1,
-    0x43,
-    0xef,
-    0xd4,
-    0x9f,
-    0x3b,
-    0x19,
-    0x5c,
-    0x32,
-    0x40,
-    0x13,
-    0x94,
-    0x52,
-    0xc7,
-    0x0c,
-    0x41,
-    0xc0,
-    0x5c,
-    0xed,
-    0xfa,
-    0xc9,
-    0xea,
-    0x8b,
-    0x89,
-    0x1a,
-    0x37,
-    0x21,
-    0x94,
-    0xd6,
-    0xae,
-    0xfd,
-    0x7d,
-    0xe6,
-    0x61,
-    0x79,
-    0x86,
-    0x91,
-    0x4e,
-    0x2d,
-    0x39,
-    0x4c,
-    0xe1,
-    0x63,
-    0x07,
-    0xd3,
-    0xbb,
-    0xcb,
-    0x2f,
-    0x78,
-    0xb2,
-    0x71,
-    0xe1,
-    0xbb,
-    0x19,
-    0xeb,
-    0xa3,
-    0x1c,
-    0x41,
-    0xd7,
-    0xf5,
-    0x2d,
-    0x3f,
-    0x85,
-    0x30,
-    0xeb,
-    0xf0,
-    0xf0,
-    0xb4,
-    0x4e,
-    0x3b,
-    0xf3,
-    0x42,
-    0x1f,
-    0x96,
-    0xb9,
-    0xa7,
-    0x0a,
-    0xcc,
-    0x76,
-    0x9b,
-    0xf4,
-    0xfd,
-    0x54,
-    0xe8,
-    0x8f,
-    0xe6,
-    0xb1,
-    0xcf,
-    0x2b,
-    0x62,
-    0x87,
-    0xa7,
-    0xcf,
-    0x31,
-    0x2b,
-    0xc7,
-    0x88,
-    0xf9,
-    0x3b,
-    0xa6,
-    0x01,
-    0x8a,
-    0xd1,
-    0x41,
-    0x54,
-    0x66,
-    0xfd,
-    0xbd,
-    0x20,
-    0x81,
-    0x73,
-    0x4e,
-    0xdc,
-    0x45,
-    0x80,
-    0x57,
-    0x6a,
-    0xd9,
-    0x43,
-    0xd3,
-    0xef,
-    0xa3,
-    0x19,
-    0xf3,
-    0xe3,
-    0x0c,
-    0x59,
-    0x08,
-    0x64,
-    0x83,
-    0x42,
-    0xa4,
-    0xd0,
-    0xc4,
-    0x31,
-    0xfc,
-    0x92,
-    0x5a,
-    0x17,
-    0x91,
-    0x3c,
-    0x62,
-    0x2b,
-    0x10,
-    0xd7,
-    0x93,
-    0xdc,
-    0x76,
-    0x76,
-    0x7b,
-    0x0a,
-    0x77,
-    0x12,
-    0x0b,
-    0x75,
-    0x21,
-    0x91,
-    0x56,
-    0x76,
-    0xbd,
-    0x28,
-    0x96,
-    0xed,
-    0xf6,
-    0xe3,
-    0x70,
-    0x7a,
-    0x3d,
-    0x82,
-    0x79,
-    0xf0,
-    0x6b,
-    0x87,
-    0xf8,
-    0x06,
-    0xa8,
-    0x8d,
-    0xee,
-    0x50,
-    0x8c,
-    0xdb,
-    0x53,
-    0x6e,
-    0x85,
-    0x39,
-    0xa3,
-    0x84,
-    0x79,
-    0x03,
-    0x99,
-    0xea,
-    0xac,
-    0x7b,
-    0x3a,
-    0x24,
-    0xe3,
-    0x63,
-    0x16,
-    0x14,
-    0xca,
-    0xcc,
-    0xcb,
-    0x6e,
-    0x93,
-    0x29,
-    0xca,
-    0x6d,
-    0xe0,
-    0xa7,
-    0x5e,
-    0xc4,
-    0xe3,
-    0xc1,
-    0xea,
-    0xd8,
-    0xc3,
-    0x0e,
-    0x72,
-    0x2c,
-    0x42,
-    0x5e,
-    0x5c,
-    0x1c,
-    0x9e,
-    0x06,
-    0x78,
-    0xcf,
-    0xb4,
-    0x78,
-    0x3f,
-    0x67,
-    0x6b,
-    0x17,
-    0x58,
-    0x7a,
-    0x50,
-    0x49,
-    0x61,
-    0xc6,
-    0x7e,
-    0xcd,
-    0xeb,
-    0x20,
-    0xc1,
-    0x4f,
-    0xc6,
-    0xae,
-    0xfb,
-    0x39,
-    0x80,
-    0x56,
-    0xc6,
-    0xcd,
-    0x28,
-    0x76,
-    0x5a,
-    0x71,
-    0x57,
-    0xd6,
-    0xb2,
-    0x49,
-    0x72,
-    0xdb,
-    0xea,
-    0x0b,
-    0x29,
-    0xfd,
-    0xec,
-    0x0f,
-    0x43,
-    0x7a,
-    0x4b,
-    0xa6,
-    0x9e,
-    0x4c,
-    0x6f,
-    0xad,
-    0x71,
-    0x59,
-    0xf3,
-    0x62,
-    0xd5,
-    0xeb,
-    0x4b,
-    0x76,
-    0x84,
-    0x5f,
-    0xaa,
-    0x63,
-    0xe0,
-    0x21,
-    0x22,
-    0xff,
-    0x37,
-    0xd8,
-    0x0e,
-    0x51,
-    0x45,
-    0xdd,
-    0xad,
-    0xa4,
-    0xfa,
-    0xf2,
-    0x0f,
-    0xdb,
-    0x7e,
-    0x31,
-    0x35,
-    0x04,
-    0x73,
-    0x42,
-    0x74,
-    0x30,
-    0x7a,
-    0xd1,
-    0x1a,
-    0x81,
-    0xf8,
-    0x3f,
-    0x54,
-    0x84,
-    0x1a,
-    0x98,
-    0x4f,
-    0xc1,
-    0x16,
-    0xc6,
-    0x9e,
-    0x91,
-    0xb4,
-    0x04,
-    0xdc,
-    0x30,
-    0x0e,
-    0x95,
-    0x92,
-    0x13,
-    0x93,
-    0xb5,
-    0x5a,
-    0x7c,
-    0x52,
-    0xd0,
-    0x45,
-    0x4b,
-    0x76,
-    0xf2,
-    0x7b,
-    0x17,
-    0x0c,
-    0x7f,
-    0x21,
-    0x7d,
-    0x0d,
-    0x24,
-    0x80,
-    0xb8,
-    0x98,
-    0x0d,
-    0x63,
-    0x72,
-    0x7f,
-    0x58,
-    0xc0,
-    0xda,
-    0x05,
-    0xca,
-    0x9b,
-    0xf7,
-    0xe6,
-    0xc1,
-    0x28,
-    0x3c,
-    0x98,
-    0x6a,
-    0x30,
-    0x5c,
-    0xd1,
-    0x34,
-    0xb5,
-    0x60,
-    0x49,
-    0x85,
-    0xd9,
-    0xf6,
-    0xc1,
-    0xab,
-    0xfc,
-    0x0c,
-    0x44,
-    0x15,
-    0x25,
-    0x9d,
-    0xad,
-    0xc3,
-    0xa3,
-    0xcb,
-    0x69,
-    0xfb,
-    0xf4,
-    0x2f,
-    0x7e,
-    0x3e,
-    0xe5,
-    0x6d,
-    0xcc,
-    0x7a,
-    0xfb,
-    0x0b,
-    0x93,
-    0x81,
-    0x12,
-    0x83,
-    0x36,
-    0xba,
-    0x44,
-    0x96,
-    0x3f,
-    0x16,
-    0x0c,
-    0xe4,
-    0xa2,
-    0x46,
-    0xab,
-    0xba,
-    0x46,
-    0x2c,
-    0xcb,
-    0x2b,
-    0xc1,
-    0x8f,
-    0x63,
-    0x62,
-    0x64,
-    0x12,
-    0xda,
-    0x36,
-    0x77,
-    0x67,
-    0x6f,
-    0xff,
-    0xc5,
-    0xc0,
-    0xd8,
-    0xa8,
-    0x5c,
-    0x86,
-    0x29,
-    0x06,
-    0x8e,
-    0x4e,
-    0xf8,
-    0x68,
-    0x3b,
-    0x09,
-    0xbf,
-    0x70,
-    0x53,
-    0x7a,
-    0x81,
-    0x21,
-    0x96,
-    0xee,
-    0xb1,
-    0x38,
-    0x9e,
-    0x27,
-    0x4f,
-    0xc0,
-    0x20,
-    0x99,
-    0x54,
-    0xe1,
-    0x6f,
-    0xd9,
-    0x50,
-    0xf9,
-    0x41,
-    0x52,
-    0x52,
-    0xee,
-    0xb6,
-    0x3a,
-    0x08,
-    0xc2,
-    0x96,
-    0xc4,
-    0x27,
-    0x67,
-    0xda,
-    0x97,
-    0x0d,
-    0xd5,
-    0x6f,
-    0x80,
-    0xa6,
-    0x5b,
-    0x36,
-    0x63,
-    0x8c,
-    0x32,
-    0x4f,
-    0x78,
-    0x72,
-    0x58,
-    0x97,
-    0xb3,
-    0xc2,
-    0x9b,
-    0x6f,
-    0x84,
-    0x85,
-    0xf4,
-    0xc0,
-    0xc1,
-    0x84,
-    0x17,
-    0x3c,
-    0xe1,
-    0xac,
-    0x48,
-    0xe6,
-    0x6a,
-    0xb7,
-    0x70,
-    0xd4,
-    0xac,
-    0x09,
-    0x70,
-    0x33,
-    0xb0,
-    0xd8,
-    0xb5,
-    0x8d,
-    0x6c,
-    0x90,
-    0x0d,
-    0x47,
-    0x38,
-    0x76,
-    0xb9,
-    0x6e,
-    0x86,
-    0x8b,
-    0xc3,
-    0xb3,
-    0xcd,
-    0xb3,
-    0x92,
-    0xb3,
-    0xc6,
-    0x16,
-    0xbb,
-    0x7c,
-    0xdb,
-    0xc7,
-    0x1a,
-    0x4d,
-    0xdd,
-    0xa4,
-    0x22,
-    0x9e,
-    0xf5,
-    0x7d,
-    0x71,
-    0x60,
-    0xdd,
-    0x78,
-    0xa7,
-    0x86,
-    0x4f,
-    0xb3,
-    0x79,
-    0xc4,
-    0xbe,
-    0x2c,
-    0x01,
-    0x97,
-    0x45,
-    0xde,
-    0x58,
-    0x85,
-    0xdd,
-    0x2d,
-    0x67,
-    0xa6,
-    0xd2,
-    0x84,
-    0xfa,
-    0x63,
-    0x78,
-    0x3d,
-    0x16,
-    0x7e,
-    0x1a,
-    0xc1,
-    0x8d,
-    0x53,
-    0x33,
-    0xf0,
-    0xcf,
-    0x5d,
-    0xe0,
-    0xc3,
-    0x03,
-    0xfb,
-    0x96,
-    0x2f,
-    0x57,
-    0x74,
-    0x10,
-    0x4d,
-    0x94,
-    0x39,
-    0x8c,
-    0xb9,
-    0xf5,
-    0x6b,
-    0x37,
-    0x38,
-    0x39,
-    0x9d,
-    0xe6,
-    0x9d,
-    0xf7,
-    0xdb,
-    0x06,
-    0xed,
-    0x32,
-    0xeb,
-    0xd6,
-    0xc1,
-    0x2d,
-    0xd2,
-    0xd4,
-    0xec,
-    0x80,
-    0x9b,
-    0x74,
-    0x5e,
-    0x6c,
-    0x53,
-    0x18,
-    0x48,
-    0x6c,
-    0x58,
-    0x3d,
-    0x81,
-    0x0c,
-    0xd4,
-    0xf2,
-    0x29,
-    0xfe,
-    0x84,
-    0x8f,
-    0x8c,
-    0x6b,
-    0xbe,
-    0xa3,
-    0x48,
-    0x87,
-    0xb2,
-    0x2e,
-    0xb3,
-    0x68,
-    0xf0,
-    0x11,
-    0x77,
-    0x18,
-    0x2a,
-    0xc2,
-    0x7f,
-    0xe9,
-    0x3b,
-    0x44,
-    0x17,
-    0x08,
-    0x69,
-    0x57,
-    0x4e,
-    0x55,
-    0xe7,
-    0xec,
-    0x9f,
-    0x72,
-    0x9e,
-    0xdb,
-    0xd1,
-    0x1a,
-    0x2e,
-    0xd8,
-    0x1c,
-    0xb5,
-    0x2f,
-    0xa4,
-    0x8d,
-    0x29,
-    0xbc,
-    0x80,
-    0xac,
-    0xf2,
-    0x32,
-    0xe7,
-    0x5b,
-    0x75,
-    0x35,
-    0x7c,
-    0x01,
-    0x91,
-    0xf4,
-    0x42,
-    0xe8,
-    0x78,
-    0xae,
-    0x0b,
-    0xe4,
-    0xbd,
-    0x76,
-    0x33,
-    0x36,
-    0xae,
-    0x33,
-    0x8d,
-    0xaf,
-    0xe3,
-    0xea,
-    0x9e,
-    0x19,
-    0x17,
-    0x40,
-    0x09,
-    0xd2,
-    0x37,
-    0x3a,
-    0x4b,
-    0xba,
-    0xb9,
-    0x48,
-    0xa8,
-    0x4f,
-    0x2f,
-    0x82,
-    0x65,
-    0x17,
-    0x1c,
-    0x31,
-    0x38,
-    0x3f,
-    0x06,
-    0x91,
-    0xfd,
-    0x81,
-    0xcc,
-    0xd5,
-    0xaa,
-    0x4b,
-    0x3a,
-    0x6c,
-    0x85,
-    0x1d,
-    0xdb,
-    0x83,
-    0x95,
-    0x32,
-    0x0e,
-    0xcb,
-    0x56,
-    0x64,
-    0x5c,
-    0x7c,
-    0xb1,
-    0x4a,
-    0x09,
-    0x9a,
-    0x2a,
-    0xa3,
-    0xe9,
-    0x77,
-    0x5c,
-    0xf7,
-    0x75,
-    0x79,
-    0xa2,
-    0x7b,
-    0x1e,
-    0x1d,
-    0x18,
-    0x36,
-    0xe2,
-    0x3c,
-    0xc2,
-    0x62,
-    0x1c,
-    0x8d,
-    0x0a,
-    0x15,
-    0xa0,
-    0x6c,
-    0x70,
-    0x20,
-    0x07,
-    0xd9,
-    0x7d,
-    0x37,
-    0x48,
-    0xc4,
-    0xf8,
-    0x53,
-    0x89,
-    0x88,
-    0x5d,
-    0x55,
-    0x34,
-    0xb5,
-    0x8b,
-    0xec,
-    0x4c,
-    0x12,
-    0xbd,
-    0xb8,
-    0x02,
-    0xe2,
-    0xbb,
-    0xb0,
-    0x83,
-    0x67,
-    0x52,
-    0xc1,
-    0x15,
-    0xa5,
-    0x01,
-    0xb7,
-    0x62,
-    0x68,
-    0xf5,
-    0x61,
-    0x13,
-    0x88,
-    0x38,
-    0xf0,
-    0xa1,
-    0x6c,
-    0x25,
-    0xa1,
-    0x68,
-    0xcd,
-    0x1f,
-    0x9c,
-    0xfe,
-    0xbc,
-    0x82,
-    0x1b,
-    0xc2,
-    0xe7,
-    0xda,
-    0xce,
-    0xb8,
-    0x18,
-    0x53,
-    0x7f,
-    0x94,
-    0xfe,
-    0x71,
-    0xf2,
-    0x14,
-    0x30,
-    0x01,
-    0x0f,
-    0x93,
-    0x6f,
-    0x50,
-    0x42,
-    0xdc,
-    0x2b,
-    0x9a,
-    0x23,
-    0x3c,
-    0x49,
-    0xc5,
-    0x52,
-    0xdb,
-    0x24,
-    0x4f,
-    0xa5,
-    0x4b,
-    0xd2,
-    0x86,
-    0x86,
-    0x62,
-    0xa8,
-    0xf7,
-    0x96,
-    0x45,
-    0x00,
-    0x28,
-    0x97,
-    0xc6,
-    0x39,
-    0x8a,
-    0x88,
-    0xf0,
-    0x00,
-    0xa9,
-    0x11,
-    0xdf,
-    0xce,
-    0xa6,
-    0x22,
-    0xd6,
-    0xb2,
-    0xe7,
-    0xd8,
-    0x8b,
-    0x51,
-    0x0d,
-    0xa0,
-    0xc5,
-    0x2b,
-    0x26,
-    0x9e,
-    0x29,
-    0x20,
-    0x24,
-    0x50,
-    0x51,
-    0x32,
-    0x8f,
-    0x6e,
-    0x1f,
-    0x8c,
-    0x76,
-    0x15,
-    0x51,
-    0xc4,
-    0xab,
-    0x25,
-    0x55,
-    0x5d,
-    0x30,
-    0xe8,
-    0x5e,
-    0x90,
-    0xec,
-    0xf4,
-    0xb7,
-    0x4b,
-    0xa2,
-    0x52,
-    0x58,
-    0x7b,
-    0x24,
-    0xdf,
-    0xb7,
-    0x87,
-    0xc4,
-    0xf3,
-    0xe0,
-    0x1c,
-    0x0c,
-    0x41,
-    0xc8,
-    0x30,
-    0xaf,
-    0xfe,
-    0xde,
-    0x41,
-    0xbe,
-    0x46,
-    0xe4,
-    0xde,
-    0x1f,
-    0xbb,
-    0xfd,
-    0x69,
-    0x3c,
-    0x6f,
-    0x07,
-    0x1b,
-    0xf8,
-    0x04,
-    0x2a,
-    0x48,
-    0xe7,
-    0x11,
-    0xb1,
-    0xe5,
-    0xbe,
-    0xc8,
-    0x19,
-    0x47,
-    0x08,
-    0xd6,
-    0x68,
-    0x2d,
-    0x1b,
-    0x8b,
-    0xc1,
-    0x01,
-    0x4b,
-    0x3b,
-    0x34,
-    0x5b,
-    0x5d,
-    0xe4,
-    0xda,
-    0xc7,
-    0x3f,
-    0x10,
-    0x22,
-    0xc8,
-    0xf6,
-    0xfd,
-    0x66,
-    0x1d,
-    0xd7,
-    0xfc,
-    0xc2,
-    0x42,
-    0xfa,
-    0x17,
-    0x25,
-    0x3a,
-    0xec,
-    0xf6,
-    0xa8,
-    0x8c,
-    0xa4,
-    0x04,
-    0x1f,
-    0x8c,
-    0xb8,
-    0xcd,
-    0xee,
-    0xdb,
-    0xd1,
-    0xaa,
-    0x1f,
-    0x31,
-    0x5d,
-    0xa1,
-    0xb1,
-    0x5a,
-    0x83,
-    0x87,
-    0x32,
-    0x7f,
-    0x5c,
-    0x67,
-    0x90,
-    0xa7,
-    0x60,
-    0x28,
-    0x2c,
-    0x7d,
-    0x1e,
-    0x69,
-    0x30,
-    0x54,
-    0x31,
-    0xb0,
-    0x23,
-    0x68,
-    0x6f,
-    0xc4,
-    0xba,
-    0x67,
-    0x63,
-    0x57,
-    0xf1,
-    0x30,
-    0xfe,
-    0xe8,
-    0x5b,
-    0xda,
-    0x89,
-    0xe8,
-    0xb6,
-    0xf8,
-    0xde,
-    0x1c,
-    0xc3,
-    0x1b,
-    0xd8,
-    0x42,
-    0x55,
-    0x99,
-    0x08,
-    0xf7,
-    0xa7,
-    0x8d,
-    0xa9,
-    0xd8,
-    0xf2,
-    0x1f,
-    0xd6,
-    0xe8,
-    0x3f,
-    0x06,
-    0xfb,
-    0x32,
-    0x7a,
-    0x4b,
-    0x8a,
-    0xaf,
-    0xc9,
-    0x4f,
-    0xef,
-    0x69,
-    0x1c,
-    0x0f,
-    0xc5,
-    0xe1,
-    0x04,
-    0xa7,
-    0x4a,
-    0xae,
-    0xc8,
-    0x15,
-    0x10,
-    0x68,
-    0xb6,
-    0x40,
-    0xf6,
-    0xc4,
-    0xb7,
-    0x39,
-    0x57,
-    0x00,
-    0x26,
-    0xc0,
-    0x81,
-    0x82,
-    0xe2,
-    0x0a,
-    0x69,
-    0xbc,
-    0xa2,
-    0xc1,
-    0x9d,
-    0x52,
-    0x89,
-    0x4d,
-    0x79,
-    0x7f,
-    0xfb,
-    0x52,
-    0x9e,
-    0xb5,
-    0xae,
-    0x79,
-    0xa0,
-    0x83,
-    0x04,
-    0x74,
-    0xff,
-    0xbc,
-    0x98,
-    0x3c,
-    0x59,
-    0xd6,
-    0x16,
-    0x9d,
-    0xdd,
-    0x90,
-    0x51,
-    0xf5,
-    0x03,
-    0xd7,
-    0x8f,
-    0x39,
-    0x7a,
-    0xeb,
-    0x27,
-    0x38,
-    0x62,
-    0xbe,
-    0x4f,
-    0x24,
-    0xbc,
-    0x9d,
-    0x2f,
-    0x4e,
-    0x1f,
-    0x11,
-    0x3a,
-    0x31,
-    0xac,
-    0x08,
-    0xbd,
-    0xb2,
-    0x44,
-    0x30,
-    0xb8,
-    0xa6,
-    0xf8,
-    0xa4,
-    0xee,
-    0x95,
-    0xc0,
-    0xca,
-    0x38,
-    0xbd,
-    0x70,
-    0x7b,
-    0x1e,
-    0x5a,
-    0xe9,
-    0x65,
-    0xa8,
-    0x25,
-    0x8c,
-    0xae,
-    0x72,
-    0x1b,
-    0xf5,
-    0xda,
-    0xff,
-    0x7f,
-    0xe5,
-    0xef,
-    0x4f,
-    0x22,
-    0x7f,
-    0xd7,
-    0xb4,
-    0xe2,
-    0xb8,
-    0x05,
-    0xe1,
-    0x71,
-    0x09,
-    0x5c,
-    0x44,
-    0x58,
-    0x66,
-    0x4c,
-    0x96,
-    0x3b,
-    0x74,
-    0x3e,
-    0xb0,
-    0x5e,
-    0xf7,
-    0x32,
-    0xa0,
-    0x68,
-    0x89,
-    0xa6,
-    0xfc,
-    0x67,
-    0x92,
-    0xba,
-    0x76,
-    0x15,
-    0x74,
-    0x93,
-    0xb1,
-    0x5a,
-    0x06,
-    0xfd,
-    0x53,
-    0x11,
-    0x44,
-    0x54,
-    0x5c,
-    0x0f,
-    0x45,
-    0xa4,
-    0xb6,
-    0x61,
-    0x6d,
-    0x0f,
-    0x0c,
-    0xd6,
-    0xe3,
-    0x6f,
-    0xe0,
-    0xbe,
-    0x45,
-    0x3d,
-    0xd8,
-    0xf0,
-    0x9b,
-    0xb2,
-    0x59,
-    0x12,
-    0x8a,
-    0x2b,
-    0x57,
-    0x14,
-    0xcb,
-    0xd2,
-    0x6c,
-    0xfe,
-    0xdb,
-    0x7b,
-    0x27,
-    0xec,
-    0xf3,
-    0xcc,
-    0xa6,
-    0x56,
-    0x3a,
-    0xa1,
-    0x67,
-    0x95,
-    0x3a,
-    0xae,
-    0x5b,
-    0xa3,
-    0x90,
-    0x67,
-    0x3c,
-    0x23,
-    0xe8,
-    0x1c,
-    0x21,
-    0xa1,
-    0x29,
-    0x69,
-    0x50,
-    0x1a,
-    0xed,
-    0xcd,
-    0x53,
-    0xbf,
-    0x34,
-    0x99,
-    0x4e,
-    0xf6,
-    0x59,
-    0x0c,
-    0x8f,
-    0xa2,
-    0x45,
-    0xbc,
-    0x67,
-    0xa4,
-    0xe2,
-    0x37,
-    0x38,
-    0xa2,
-    0xd2,
-    0xeb,
-    0xd0,
-    0x06,
-    0x62,
-    0x43,
-    0xf5,
-    0x4a,
-    0xb9,
-    0x13,
-    0x41,
-    0x74,
-    0x56,
-    0x36,
-    0x31,
-    0xdc,
-    0xb9,
-    0x76,
-    0x78,
-    0x35,
-    0x5f,
-    0xab,
-    0x99,
-    0xcb,
-    0xf4,
-    0x27,
-    0xb4,
-    0x0a,
-    0xc5,
-    0x52,
-    0xa0,
-    0x40,
-    0x74,
-    0x92,
-    0x3b,
-    0xa4,
-    0xef,
-    0x6e,
-    0xfe,
-    0x96,
-    0xa2,
-    0xf2,
-    0xd5,
-    0x28,
-    0xec,
-    0x55,
-    0x2d,
-    0xde,
-    0xd0,
-    0xd9,
-    0x4e,
-    0xb2,
-    0xee,
-    0xf3,
-    0xeb,
-    0x5b,
-    0xb1,
-    0xac,
-    0xf7,
-    0xcf,
-    0xc9,
-    0x47,
-    0xbb,
-    0x07,
-    0xdc,
-    0x24,
-    0x26,
-    0x02,
-    0x78,
-    0xe4,
-    0x64,
-    0x0c,
-    0x4d,
-    0xce,
-    0xb2,
-    0x40,
-    0x99,
-    0x71,
-    0x70,
-    0x4c,
-    0xe3,
-    0x8b,
-    0x77,
-    0x74,
-    0xec,
-    0x2a,
-    0xae,
-    0xda,
-    0xe3,
-    0x11,
-    0xd8,
-    0xfc,
-    0xd8,
-    0x5d,
-    0xb0,
-    0x7e,
-    0x73,
-    0x69,
-    0x38,
-    0x2a,
-    0xe6,
-    0xee,
-    0x4e,
-    0x35,
-    0x20,
-    0x6f,
-    0x80,
-    0xc3,
-    0x43,
-    0xd4,
-    0x21,
-    0xae,
-    0x59,
-    0x55,
-    0x9c,
-    0x83,
-    0x43,
-    0x99,
-    0x09,
-    0xce,
-    0xf1,
-    0x1f,
-    0xfe,
-    0x98,
-    0xd9,
-    0xde,
-    0xa8,
-    0x2d,
-    0xa1,
-    0x28,
-    0x1a,
-    0x23,
-    0x1f,
-    0xd4,
-    0xe4,
-    0x97,
-    0x84,
-    0x9c,
-    0xe8,
-    0xba,
-    0xd4,
-    0xc4,
-    0x69,
-    0x8d,
-    0x9a,
-    0xfd,
-    0x65,
-    0xe8,
-    0xd9,
-    0x88,
-    0x25,
-    0xc1,
-    0x45,
-    0x9e,
-    0x12,
-    0xab,
-    0xb3,
-    0x10,
-    0xca,
-    0x9d,
-    0xcf,
-    0x2b,
-    0x73,
-    0xf5,
-    0x0d,
-    0xde,
-    0x50,
-    0xbc,
-    0xe2,
-    0x1f,
-    0x91,
-    0x2c,
-    0x33,
-    0x8a,
-    0x70,
-    0x6f,
-    0x0e,
-    0x4b,
-    0x79,
-    0xaa,
-    0x98,
-    0x3f,
-    0x29,
-    0x3a,
-    0x46,
-    0x56,
-    0xbb,
-    0x3e,
-    0x50,
-    0x3c,
-    0x3f,
-    0x55,
-    0x63,
-    0x38,
-    0xec,
-    0xa9,
-    0x97,
-    0x54,
-    0xb7,
-    0x2c,
-    0xa0,
-    0xbe,
-    0x25,
-    0x21,
-    0x48,
-    0x6e,
-    0x5d,
-    0xdf,
-    0x1d,
-    0x09,
-    0x81,
-    0xd1,
-    0x66,
-    0x05,
-    0x3e,
-    0xc2,
-    0x5c,
-    0x0f,
-    0xa2,
-    0x57,
-    0x97,
-    0xa9,
-    0x2e,
-    0xdd,
-    0xc7,
-    0x18,
-    0x2d,
-    0x45,
-    0xa4,
-    0x7d,
-    0x44,
-    0x6d,
-    0x28,
-    0x42,
-    0x49,
-    0xa2,
-    0xfb,
-    0xb7,
-    0x58,
-    0x62,
-    0x2f,
-    0xfd,
-    0x24,
-    0x66,
-    0x2d,
-    0x24,
-    0x8c,
-    0xe0,
-    0xef,
-    0x90,
-    0x6f,
-    0x01,
-    0x70,
-    0xa1,
-    0xc0,
-    0xbe,
-    0x61,
-    0x93,
-    0xdd,
-    0xd4,
-    0x1e,
-    0xa2,
-    0x1c,
-    0x09,
-    0xe0,
-    0x72,
-    0xa7,
-    0xb5,
-    0x34,
-    0xaf,
-    0x8b,
-    0x82,
-    0xac,
-    0xf0,
-    0x0b,
-    0x70,
-    0xd4,
-    0xe2,
-    0x3a,
-    0x1c,
-    0x67,
-    0xa2,
-    0xc9,
-    0x41,
-    0xc3,
-    0x6a,
-    0x1d,
-    0x7f,
-    0x9b,
-    0x70,
-    0xa4,
-    0x5b,
-    0xec,
-    0x0b,
-    0x6a,
-    0x88,
-    0x32,
-    0x18,
-    0xe7,
-    0x65,
-    0xdb,
-    0x9c,
-    0x1c,
-    0xc6,
-    0xfc,
-    0xab,
-    0xde,
-    0xf7,
-    0x43,
-    0x88,
-    0x71,
-    0xfe,
-    0x2d,
-    0x0d,
-    0x58,
-    0x21,
-    0x78,
-    0x4d,
-    0x6c,
-    0xa8,
-    0xdc,
-    0x79,
-    0x2c,
-    0xe4,
-    0xf6,
-    0x00,
-    0x54,
-    0x70,
-    0x85,
-    0xfa,
-    0xb1,
-    0xb7,
-    0xd8,
-    0xc7,
-    0x33,
-    0xb6,
-    0x87,
-    0xf3,
-    0x44,
-    0x04,
-    0x62,
-    0x5d,
-    0x58,
-    0x0f,
-    0xa7,
-    0x99,
-    0xc5,
-    0xa8,
-    0x78,
-    0x92,
-    0xd6,
-    0xc2,
-    0x8b,
-    0x74,
-    0x1a,
-    0x76,
-    0x24,
-    0xc9,
-    0x02,
-    0x4b,
-    0x40,
-    0xe2,
-    0xab,
-    0xb5,
-    0x13,
-    0x78,
-    0xf9,
-    0xdb,
-    0xb5,
-    0x93,
-    0xe5,
-    0x9d,
-    0x19,
-    0xab,
-    0x18,
-    0xd6,
-    0x3e,
-    0x0d,
-    0xb8,
-    0xde,
-    0xa9,
-    0x81,
-    0x82,
-    0x54,
-    0x12,
-    0x2a,
-    0x19,
-    0x1a,
-    0x5e,
-    0xad,
-    0x9d,
-    0xa0,
-    0xcd,
-    0x96,
-    0x80,
-    0x66,
-    0x75,
-    0xf7,
-    0x95,
-    0xbc,
-    0xef,
-    0x51,
-    0x6a,
-    0xcd,
-    0x50,
-    0xb8,
-    0xd8,
-    0xdb,
-    0x5a,
-    0x33,
-    0xd8,
-    0xcc,
-    0xf4,
-    0x62,
-    0x98,
-    0xe6,
-    0xd8,
-    0x63,
-    0xcf,
-    0xd7,
-    0x8c,
-    0xf5,
-    0x4d,
-    0xf8,
-    0x93,
-    0xde,
-    0xd6,
-    0xd2,
-    0xe4,
-    0x8b,
-    0x30,
-    0xe2,
-    0x9b,
-    0xf7,
-    0x7b,
-    0x99,
-    0xef,
-    0xce,
-    0xc1,
-    0xa7,
-    0x64,
-    0xd1,
-    0xce,
-    0x79,
-    0x41,
-    0x7c,
-    0x42,
-    0x00,
-    0x45,
-    0xe6,
-    0xe4,
-    0xb5,
-    0x96,
-    0xea,
-    0x39,
-    0xda,
-    0xfa,
-    0x84,
-    0x56,
-    0x02,
-    0x49,
-    0x7d,
-    0xf2,
-    0xd3,
-    0x23,
-    0x4b,
-    0xbf,
-    0x0b,
-    0xde,
-    0x33,
-    0xfb,
-    0xc1,
-    0xc2,
-    0xb0,
-    0x41,
-    0xee,
-    0x79,
-    0x18,
-    0xa6,
-    0x2b,
-    0xc1,
-    0x7d,
-    0x01,
-    0xbc,
-    0x64,
-    0xd1,
-    0x8a,
-    0xce,
-    0x6a,
-    0x4e,
-    0xa7,
-    0xfd,
-    0x8d,
-    0x15,
-    0x02,
-    0x19,
-    0xed,
-    0x16,
-    0xdf
-  ],
-  const [
-    0xe0,
-    0x22,
-    0x1d,
-    0x19,
-    0xcf,
-    0x61,
-    0x7e,
-    0xd8,
-    0x27,
-    0xd8,
-    0xd8,
-    0xcb,
-    0x8d,
-    0x2c,
-    0x8e,
-    0xd8,
-    0x1b,
-    0x9b,
-    0x33,
-    0x54,
-    0xa8,
-    0x32,
-    0xf1,
-    0xd1,
-    0x4a,
-    0x40,
-    0x2b,
-    0x37,
-    0x1a,
-    0x0a,
-    0x61,
-    0x17,
-    0x37,
-    0xc0,
-    0x54,
-    0x3b,
-    0x0e,
-    0xb0,
-    0x6b,
-    0x82,
-    0xd8,
-    0xba,
-    0x56,
-    0xeb,
-    0x63,
-    0x04,
-    0xf1,
-    0xef,
-    0x16,
-    0xef,
-    0x6b,
-    0x14,
-    0x30,
-    0x49,
-    0xa7,
-    0xbf,
-    0x50,
-    0xc4,
-    0xe2,
-    0x49,
-    0x3a,
-    0xa6,
-    0x97,
-    0x56,
-    0xd8,
-    0xc3,
-    0x9f,
-    0x62,
-    0x7f,
-    0xa8,
-    0x9d,
-    0x9d,
-    0x74,
-    0x1a,
-    0x99,
-    0xf9,
-    0xaf,
-    0xbf,
-    0xeb,
-    0x81,
-    0xde,
-    0x1a,
-    0x5b,
-    0xec,
-    0xad,
-    0xbd,
-    0x86,
-    0x72,
-    0x45,
-    0xb9,
-    0x84,
-    0xde,
-    0x12,
-    0x5a,
-    0xc7,
-    0xe5,
-    0xca,
-    0x11,
-    0x46,
-    0xb6,
-    0xab,
-    0xb2,
-    0xdb,
-    0xd2,
-    0x04,
-    0xdf,
-    0xea,
-    0x1e,
-    0xf6,
-    0xc4,
-    0x44,
-    0x36,
-    0x7c,
-    0x06,
-    0x4b,
-    0x05,
-    0xa9,
-    0xf5,
-    0x56,
-    0x93,
-    0x31,
-    0x09,
-    0x57,
-    0x1d,
-    0x2b,
-    0x8c,
-    0xbb,
-    0x6b,
-    0x15,
-    0x94,
-    0x91,
-    0x5e,
-    0x19,
-    0x34,
-    0xef,
-    0xc9,
-    0x8e,
-    0xf3,
-    0x91,
-    0x81,
-    0xc2,
-    0x7d,
-    0xc4,
-    0xb8,
-    0xf7,
-    0x99,
-    0x82,
-    0x86,
-    0xab,
-    0x5b,
-    0xdf,
-    0xc9,
-    0x1d,
-    0x9b,
-    0xa4,
-    0x2f,
-    0x0c,
-    0xa6,
-    0x39,
-    0x91,
-    0xc2,
-    0x32,
-    0xc8,
-    0x83,
-    0x51,
-    0x98,
-    0x9f,
-    0x29,
-    0x1d,
-    0x3d,
-    0xd6,
-    0x4c,
-    0x9a,
-    0x51,
-    0x32,
-    0xac,
-    0x57,
-    0xbd,
-    0x4a,
-    0x98,
-    0x3c,
-    0x56,
-    0xe8,
-    0xbd,
-    0x10,
-    0x57,
-    0xb2,
-    0x3c,
-    0x3d,
-    0x0e,
-    0x0a,
-    0xff,
-    0xd8,
-    0xd5,
-    0x32,
-    0x4c,
-    0xdc,
-    0x44,
-    0xb4,
-    0x9a,
-    0xb6,
-    0xa5,
-    0x01,
-    0xa4,
-    0x07,
-    0xa8,
-    0x58,
-    0xbd,
-    0xa5,
-    0x59,
-    0xe9,
-    0x63,
-    0xe3,
-    0x4e,
-    0x3b,
-    0x16,
-    0x12,
-    0x25,
-    0xcb,
-    0x6b,
-    0x47,
-    0x2e,
-    0xf6,
-    0x5c,
-    0x5f,
-    0x64,
-    0x18,
-    0xe2,
-    0x41,
-    0xa2,
-    0xf6,
-    0xc6,
-    0x63,
-    0x13,
-    0x59,
-    0xb3,
-    0x90,
-    0xeb,
-    0xfc,
-    0x91,
-    0xe8,
-    0x54,
-    0xa8,
-    0x0e,
-    0x28,
-    0xab,
-    0x9e,
-    0x7d,
-    0x2b,
-    0xed,
-    0x35,
-    0xe4,
-    0xb1,
-    0x6c,
-    0xc4,
-    0x50,
-    0x60,
-    0xc7,
-    0xc2,
-    0x6c,
-    0x08,
-    0x18,
-    0x2c,
-    0x52,
-    0x2b,
-    0x6f,
-    0x27,
-    0xa1,
-    0xbd,
-    0x80,
-    0xe7,
-    0xd0,
-    0x28,
-    0x98,
-    0xcf,
-    0xc2,
-    0x93,
-    0xd6,
-    0xda,
-    0x9a,
-    0x64,
-    0x97,
-    0x39,
-    0xd0,
-    0x03,
-    0x32,
-    0x3e,
-    0x85,
-    0xe1,
-    0xe6,
-    0x78,
-    0x13,
-    0xba,
-    0x10,
-    0x20,
-    0xe9,
-    0x17,
-    0xa1,
-    0xb3,
-    0x96,
-    0x16,
-    0xd0,
-    0xe1,
-    0x23,
-    0x6d,
-    0x0c,
-    0xa6,
-    0xa6,
-    0xad,
-    0x35,
-    0xb7,
-    0x14,
-    0xc4,
-    0x0b,
-    0x1f,
-    0x57,
-    0xc6,
-    0xe7,
-    0x2a,
-    0xa0,
-    0xed,
-    0xa9,
-    0x82,
-    0xff,
-    0xde,
-    0xf1,
-    0x98,
-    0x31,
-    0x2d,
-    0x92,
-    0x45,
-    0xb9,
-    0x24,
-    0x43,
-    0xb2,
-    0x32,
-    0xc0,
-    0x98,
-    0x75,
-    0xe3,
-    0xfd,
-    0x31,
-    0xfc,
-    0x94,
-    0x53,
-    0x32,
-    0x2f,
-    0xa0,
-    0x81,
-    0xf2,
-    0x51,
-    0x4c,
-    0x89,
-    0xf8,
-    0x27,
-    0x57,
-    0xfc,
-    0x23,
-    0x5d,
-    0xd2,
-    0x77,
-    0x28,
-    0x25,
-    0x32,
-    0x6e,
-    0x42,
-    0x21,
-    0xa4,
-    0x28,
-    0x24,
-    0x83,
-    0xa0,
-    0x0b,
-    0x33,
-    0x73,
-    0xc1,
-    0x1a,
-    0xf2,
-    0xb1,
-    0xd4,
-    0xbc,
-    0xbd,
-    0x7b,
-    0x2f,
-    0xbf,
-    0xbb,
-    0xb1,
-    0x44,
-    0x9c,
-    0x0e,
-    0x37,
-    0x75,
-    0xfd,
-    0x4c,
-    0x9b,
-    0x2a,
-    0x7c,
-    0x33,
-    0xf7,
-    0x21,
-    0xae,
-    0x98,
-    0x19,
-    0x06,
-    0x60,
-    0xa1,
-    0xe2,
-    0x44,
-    0x20,
-    0x34,
-    0xec,
-    0x1a,
-    0x00,
-    0xaf,
-    0x6f,
-    0xf1,
-    0x96,
-    0xda,
-    0x66,
-    0xed,
-    0x47,
-    0x1a,
-    0xed,
-    0xc2,
-    0xc6,
-    0xe7,
-    0xee,
-    0xc9,
-    0xd7,
-    0x7f,
-    0xfc,
-    0x53,
-    0x59,
-    0xdc,
-    0x7f,
-    0x3d,
-    0x83,
-    0xe4,
-    0x12,
-    0xc4,
-    0x6e,
-    0xe1,
-    0x29,
-    0x9b,
-    0xd3,
-    0x30,
-    0xf7,
-    0x3b,
-    0x17,
-    0x3d,
-    0x8f,
-    0x7b,
-    0x84,
-    0xaf,
-    0x49,
-    0x60,
-    0xda,
-    0xdf,
-    0x67,
-    0x36,
-    0x06,
-    0x8f,
-    0xf8,
-    0xdf,
-    0x31,
-    0xd9,
-    0xfd,
-    0x6c,
-    0xfc,
-    0x65,
-    0xcb,
-    0xea,
-    0x0a,
-    0xdf,
-    0xb0,
-    0x7e,
-    0xc0,
-    0xa8,
-    0xd9,
-    0xb5,
-    0x48,
-    0xcc,
-    0x73,
-    0x15,
-    0xdc,
-    0x35,
-    0x11,
-    0xf8,
-    0x41,
-    0x1e,
-    0x4e,
-    0x9a,
-    0x91,
-    0xca,
-    0xb3,
-    0x70,
-    0x3e,
-    0x75,
-    0xdb,
-    0xbb,
-    0x54,
-    0x8b,
-    0xd4,
-    0x5e,
-    0xfe,
-    0x18,
-    0xc9,
-    0xec,
-    0x4c,
-    0x7f,
-    0xde,
-    0x06,
-    0x33,
-    0x70,
-    0x5c,
-    0xe4,
-    0xd6,
-    0x14,
-    0x0e,
-    0x31,
-    0x03,
-    0x8a,
-    0xeb,
-    0x1c,
-    0x01,
-    0x97,
-    0xf4,
-    0xac,
-    0x89,
-    0x99,
-    0x60,
-    0x53,
-    0x12,
-    0xbd,
-    0xf7,
-    0xc7,
-    0x52,
-    0x72,
-    0xbc,
-    0x0d,
-    0x01,
-    0x1e,
-    0xce,
-    0xd6,
-    0xe0,
-    0x0f,
-    0x90,
-    0x0f,
-    0xfa,
-    0xb4,
-    0x08,
-    0xb4,
-    0x29,
-    0x0d,
-    0x85,
-    0xe5,
-    0xdd,
-    0x60,
-    0x85,
-    0x3b,
-    0x19,
-    0x2e,
-    0xd5,
-    0x5c,
-    0xbe,
-    0x65,
-    0xfa,
-    0xcd,
-    0x0c,
-    0xd7,
-    0xd0,
-    0x08,
-    0x66,
-    0xeb,
-    0x71,
-    0xcf,
-    0x55,
-    0x92,
-    0x58,
-    0xbf,
-    0xd0,
-    0x7d,
-    0xc7,
-    0x28,
-    0xbb,
-    0x8e,
-    0x65,
-    0x1c,
-    0xad,
-    0x8c,
-    0x2c,
-    0xc6,
-    0xf6,
-    0x1a,
-    0x82,
-    0xfd,
-    0xe1,
-    0xea,
-    0xa6,
-    0x19,
-    0x36,
-    0x2e,
-    0x4e,
-    0x06,
-    0x03,
-    0x4f,
-    0x8f,
-    0x97,
-    0x9c,
-    0xe2,
-    0xfc,
-    0x1c,
-    0xe1,
-    0xd8,
-    0x12,
-    0x36,
-    0xbf,
-    0xf4,
-    0xd4,
-    0xea,
-    0xfa,
-    0x83,
-    0xb2,
-    0xf5,
-    0x29,
-    0x47,
-    0xaf,
-    0x5f,
-    0x02,
-    0xb4,
-    0xc3,
-    0x53,
-    0xd7,
-    0x5f,
-    0x7e,
-    0x2e,
-    0x61,
-    0xb3,
-    0xef,
-    0xd6,
-    0xbd,
-    0xe5,
-    0xc4,
-    0x4d,
-    0xb4,
-    0x2b,
-    0xb2,
-    0x86,
-    0x3f,
-    0x29,
-    0x18,
-    0x77,
-    0x4a,
-    0xac,
-    0xdf,
-    0x6f,
-    0xb9,
-    0x9b,
-    0xa4,
-    0xaa,
-    0xa9,
-    0x2b,
-    0x19,
-    0x23,
-    0xf8,
-    0x51,
-    0xa8,
-    0xa9,
-    0x07,
-    0x7d,
-    0x5a,
-    0x35,
-    0xbe,
-    0x85,
-    0xf8,
-    0x7b,
-    0xd1,
-    0xdf,
-    0x70,
-    0xbf,
-    0x42,
-    0x14,
-    0x79,
-    0xea,
-    0x28,
-    0x71,
-    0x7a,
-    0xdd,
-    0xae,
-    0x00,
-    0xa8,
-    0x05,
-    0x5e,
-    0xb7,
-    0x6f,
-    0x2f,
-    0xa0,
-    0xee,
-    0x14,
-    0x9e,
-    0x7d,
-    0x17,
-    0x98,
-    0x5b,
-    0xa9,
-    0xa9,
-    0xdf,
-    0xcd,
-    0xc1,
-    0x5d,
-    0x12,
-    0x89,
-    0xd1,
-    0x9d,
-    0x41,
-    0x6b,
-    0x19,
-    0x39,
-    0x4d,
-    0xe6,
-    0x11,
-    0x5d,
-    0x05,
-    0x98,
-    0xaa,
-    0xc0,
-    0x8f,
-    0x22,
-    0xd7,
-    0x1d,
-    0x0a,
-    0x36,
-    0x4c,
-    0xe7,
-    0x71,
-    0xf2,
-    0x85,
-    0x39,
-    0xc2,
-    0x6c,
-    0x0b,
-    0x0c,
-    0x60,
-    0x8e,
-    0xf3,
-    0xac,
-    0xb6,
-    0x24,
-    0xa7,
-    0x6d,
-    0x1e,
-    0x33,
-    0xe9,
-    0x99,
-    0x01,
-    0x8c,
-    0x14,
-    0xae,
-    0x3f,
-    0xa2,
-    0xa5,
-    0xc6,
-    0xd1,
-    0x99,
-    0xfb,
-    0x57,
-    0xad,
-    0x9f,
-    0x5b,
-    0x1c,
-    0xe9,
-    0x7f,
-    0x37,
-    0x53,
-    0x24,
-    0x73,
-    0xb0,
-    0x29,
-    0x22,
-    0x3a,
-    0x59,
-    0x73,
-    0xb6,
-    0x6b,
-    0x3e,
-    0x9e,
-    0xe5,
-    0x09,
-    0x25,
-    0xe9,
-    0x48,
-    0x57,
-    0x13,
-    0xd1,
-    0xb2,
-    0xee,
-    0x12,
-    0xcd,
-    0x13,
-    0x0c,
-    0x32,
-    0x3c,
-    0x9c,
-    0x2f,
-    0xce,
-    0x9c,
-    0x24,
-    0xe3,
-    0x10,
-    0xfc,
-    0xcb,
-    0xd8,
-    0xb7,
-    0xb4,
-    0xdd,
-    0x37,
-    0x18,
-    0x53,
-    0xf9,
-    0x36,
-    0x63,
-    0xd9,
-    0x72,
-    0xeb,
-    0x28,
-    0x27,
-    0xf5,
-    0x5d,
-    0x1a,
-    0xb3,
-    0x6c,
-    0xe1,
-    0x12,
-    0x80,
-    0x23,
-    0xa4,
-    0x57,
-    0x4e,
-    0x29,
-    0x84,
-    0x1c,
-    0x0e,
-    0xfa,
-    0x24,
-    0x4a,
-    0x98,
-    0x5a,
-    0x3f,
-    0x80,
-    0xa0,
-    0x84,
-    0x3c,
-    0x58,
-    0xe6,
-    0x84,
-    0x03,
-    0xed,
-    0xae,
-    0xe2,
-    0x10,
-    0x9a,
-    0x70,
-    0x80,
-    0xc5,
-    0x04,
-    0xd0,
-    0xc5,
-    0x05,
-    0x5a,
-    0xd0,
-    0xfb,
-    0xfe,
-    0xdb,
-    0x45,
-    0xf6,
-    0x46,
-    0x99,
-    0x88,
-    0xf7,
-    0x2a,
-    0x7d,
-    0x6d,
-    0xd0,
-    0x43,
-    0x8c,
-    0x79,
-    0x48,
-    0x4a,
-    0x68,
-    0x4f,
-    0xc0,
-    0x2c,
-    0x1a,
-    0x6c,
-    0x17,
-    0x61,
-    0x0e,
-    0x14,
-    0xcc,
-    0x7a,
-    0x5f,
-    0x8c,
-    0x62,
-    0xfa,
-    0x56,
-    0x8a,
-    0x09,
-    0x67,
-    0x2d,
-    0xea,
-    0x7a,
-    0xa1,
-    0x18,
-    0xa2,
-    0x23,
-    0x72,
-    0x86,
-    0xf8,
-    0x84,
-    0x65,
-    0xa3,
-    0xf3,
-    0xd9,
-    0xdc,
-    0x22,
-    0x0f,
-    0xf9,
-    0x5d,
-    0x3b,
-    0x34,
-    0x7e,
-    0x2d,
-    0xef,
-    0xe9,
-    0x26,
-    0x20,
-    0x93,
-    0xc6,
-    0x79,
-    0xaf,
-    0x8c,
-    0x27,
-    0xac,
-    0x4b,
-    0x58,
-    0x28,
-    0xc6,
-    0xf1,
-    0xce,
-    0xcd,
-    0x01,
-    0xff,
-    0xa6,
-    0x80,
-    0x73,
-    0x46,
-    0x3b,
-    0xc1,
-    0xed,
-    0x60,
-    0x90,
-    0x19,
-    0x24,
-    0x43,
-    0x91,
-    0x4f,
-    0x0e,
-    0x17,
-    0x9c,
-    0xdf,
-    0x8f,
-    0x45,
-    0x40,
-    0xa8,
-    0x55,
-    0xd1,
-    0x45,
-    0xe5,
-    0x01,
-    0xe9,
-    0xec,
-    0x5e,
-    0x87,
-    0xbe,
-    0x77,
-    0xe0,
-    0xd7,
-    0x92,
-    0xec,
-    0xea,
-    0xbd,
-    0x12,
-    0x17,
-    0xa9,
-    0x05,
-    0xe7,
-    0xce,
-    0x26,
-    0xe4,
-    0x88,
-    0x79,
-    0xbf,
-    0x93,
-    0x52,
-    0xd1,
-    0xd4,
-    0x3d,
-    0xda,
-    0xe7,
-    0xc2,
-    0x1b,
-    0x82,
-    0x68,
-    0x15,
-    0xde,
-    0x4a,
-    0x20,
-    0xf9,
-    0x4d,
-    0xe9,
-    0xbe,
-    0xf2,
-    0x2f,
-    0x1d,
-    0xd7,
-    0xcd,
-    0x6b,
-    0x3f,
-    0x2d,
-    0xd7,
-    0x6e,
-    0x1a,
-    0x30,
-    0x4c,
-    0xcd,
-    0xfd,
-    0xc5,
-    0x12,
-    0x2b,
-    0x0f,
-    0x47,
-    0xa7,
-    0x5e,
-    0xe3,
-    0xcb,
-    0x59,
-    0xcd,
-    0x4c,
-    0xa9,
-    0xb5,
-    0x1c,
-    0x73,
-    0x38,
-    0x41,
-    0x0c,
-    0x26,
-    0xd8,
-    0x6e,
-    0x9c,
-    0x73,
-    0x36,
-    0xc8,
-    0x75,
-    0x76,
-    0xcb,
-    0x70,
-    0x84,
-    0x6f,
-    0xa6,
-    0xcc,
-    0xe9,
-    0x17,
-    0x6c,
-    0x7d,
-    0x10,
-    0x35,
-    0x9d,
-    0x91,
-    0x1d,
-    0x6c,
-    0x18,
-    0xfa,
-    0x8e,
-    0x57,
-    0xe2,
-    0x3f,
-    0x1b,
-    0xd8,
-    0x23,
-    0x72,
-    0xe1,
-    0xac,
-    0x71,
-    0x62,
-    0xc0,
-    0x43,
-    0x51,
-    0x11,
-    0x02,
-    0xcf,
-    0xfb,
-    0x69,
-    0x3d,
-    0x9c,
-    0x5e,
-    0x2a,
-    0x7a,
-    0x9f,
-    0x64,
-    0x27,
-    0x96,
-    0x51,
-    0x77,
-    0xb2,
-    0xe9,
-    0xbe,
-    0x44,
-    0x55,
-    0x26,
-    0xd8,
-    0xbf,
-    0xc3,
-    0x82,
-    0x12,
-    0x67,
-    0x0d,
-    0x19,
-    0x2a,
-    0xcb,
-    0x19,
-    0x8d,
-    0x46,
-    0x4d,
-    0x51,
-    0xf0,
-    0x43,
-    0x26,
-    0x98,
-    0xe4,
-    0x4a,
-    0xaa,
-    0x82,
-    0x00,
-    0xa4,
-    0xcd,
-    0xc4,
-    0x76,
-    0xcf,
-    0xe7,
-    0xe9,
-    0xf3,
-    0xd1,
-    0xb4,
-    0x47,
-    0xc7,
-    0xcc,
-    0x9f,
-    0x32,
-    0x46,
-    0xd3,
-    0x40,
-    0x6f,
-    0x6e,
-    0xfc,
-    0x23,
-    0xeb,
-    0xca,
-    0xb6,
-    0xcb,
-    0xad,
-    0x95,
-    0x5d,
-    0xf6,
-    0x0a,
-    0x23,
-    0x0c,
-    0x23,
-    0x18,
-    0x7d,
-    0xb3,
-    0x52,
-    0x65,
-    0x4c,
-    0x69,
-    0x0b,
-    0xe8,
-    0xf8,
-    0x03,
-    0xa1,
-    0x37,
-    0x10,
-    0xe5,
-    0xb8,
-    0xfb,
-    0xed,
-    0x18,
-    0x05,
-    0xa1,
-    0x92,
-    0x9d,
-    0x55,
-    0x53,
-    0xd7,
-    0x01,
-    0xd1,
-    0x27,
-    0xc7,
-    0x32,
-    0x80,
-    0x96,
-    0x46,
-    0x91,
-    0x0d,
-    0x2f,
-    0xf7,
-    0x48,
-    0xcb,
-    0x8c,
-    0x5c,
-    0xde,
-    0xf6,
-    0x86,
-    0x3f,
-    0x09,
-    0x3c,
-    0xa5,
-    0x51,
-    0xc3,
-    0x7b,
-    0xda,
-    0x12,
-    0x9f,
-    0xcd,
-    0x71,
-    0xf0,
-    0x5e,
-    0xc2,
-    0x41,
-    0xb3,
-    0xbd,
-    0xec,
-    0x26,
-    0x18,
-    0x92,
-    0xa1,
-    0xb1,
-    0xbc,
-    0x17,
-    0xfc,
-    0x1d,
-    0x3c,
-    0x86,
-    0x25,
-    0x85,
-    0x9b,
-    0xe6,
-    0xd2,
-    0x55,
-    0xe4,
-    0x24,
-    0x0e,
-    0xff,
-    0x10,
-    0x65,
-    0x3a,
-    0xef,
-    0x29,
-    0x9b,
-    0x51,
-    0xc0,
-    0xb0,
-    0x56,
-    0x70,
-    0xb0,
-    0x3d,
-    0xde,
-    0x95,
-    0x51,
-    0x65,
-    0x7e,
-    0xa6,
-    0x82,
-    0xe0,
-    0x22,
-    0xb6,
-    0x9e,
-    0xeb,
-    0x25,
-    0x85,
-    0xf3,
-    0xec,
-    0x64,
-    0x45,
-    0x76,
-    0x55,
-    0x97,
-    0xa4,
-    0xb4,
-    0xca,
-    0xe1,
-    0x06,
-    0x0c,
-    0x86,
-    0xa5,
-    0x12,
-    0x1c,
-    0xfb,
-    0x9c,
-    0x71,
-    0x79,
-    0xb8,
-    0x24,
-    0xd2,
-    0xa3,
-    0x90,
-    0xdb,
-    0x32,
-    0x38,
-    0xf9,
-    0x6d,
-    0x5a,
-    0x67,
-    0xb2,
-    0xaa,
-    0xa9,
-    0xa8,
-    0xa9,
-    0xdc,
-    0x13,
-    0xaa,
-    0x1b,
-    0x57,
-    0x6a,
-    0x8d,
-    0xfd,
-    0x51,
-    0xdc,
-    0x52,
-    0x9b,
-    0xf4,
-    0xbe,
-    0x90,
-    0x7f,
-    0xb2,
-    0x88,
-    0x68,
-    0x94,
-    0xd9,
-    0x20,
-    0xba,
-    0x8b,
-    0x67,
-    0x5b,
-    0x99,
-    0x7e,
-    0x1f,
-    0xc1,
-    0xfd,
-    0xd3,
-    0xdc,
-    0x90,
-    0xb8,
-    0x64,
-    0x26,
-    0x04,
-    0xac,
-    0xdc,
-    0x03,
-    0xd6,
-    0x3a,
-    0x64,
-    0x0f,
-    0x02,
-    0xfe,
-    0x80,
-    0xcf,
-    0xce,
-    0xb9,
-    0x33,
-    0x43,
-    0x08,
-    0x8e,
-    0x6a,
-    0xba,
-    0x8f,
-    0x72,
-    0x98,
-    0xea,
-    0x15,
-    0xde,
-    0x9d,
-    0x40,
-    0x22,
-    0xc6,
-    0xec,
-    0x75,
-    0x5c,
-    0xcf,
-    0xed,
-    0x62,
-    0x07,
-    0xbd,
-    0xa0,
-    0x15,
-    0xc8,
-    0x2a,
-    0x84,
-    0x24,
-    0xae,
-    0x7e,
-    0xb7,
-    0x41,
-    0x72,
-    0x1b,
-    0x5e,
-    0x0f,
-    0xfe,
-    0xd8,
-    0x47,
-    0x35,
-    0x2d,
-    0xb1,
-    0xcd,
-    0xb0,
-    0xd2,
-    0xbd,
-    0xfc,
-    0x6d,
-    0xfb,
-    0x60,
-    0xf6,
-    0x17,
-    0x77,
-    0xc1,
-    0x95,
-    0x2e,
-    0x95,
-    0x7e,
-    0x52,
-    0x59,
-    0x2f,
-    0x9f,
-    0x66,
-    0xfd,
-    0xe7,
-    0xc9,
-    0x2f,
-    0x0e,
-    0xb1,
-    0xb4,
-    0xd4,
-    0x25,
-    0x92,
-    0xdf,
-    0x2c,
-    0xd3,
-    0xa7,
-    0x83,
-    0xdc,
-    0x36,
-    0x68,
-    0xc5,
-    0xc0,
-    0xc9,
-    0x2e,
-    0x2f,
-    0x8d,
-    0x80,
-    0xf3,
-    0x61,
-    0xb4,
-    0x15,
-    0x59,
-    0x04,
-    0x89,
-    0x9c,
-    0xee,
-    0x00,
-    0xa4,
-    0x5e,
-    0xaf,
-    0xef,
-    0x87,
-    0xe4,
-    0xcb,
-    0xd1,
-    0x82,
-    0x52,
-    0xa9,
-    0x01,
-    0xd4,
-    0xf7,
-    0x2b,
-    0x68,
-    0x13,
-    0x21,
-    0x35,
-    0xf0,
-    0xce,
-    0x36,
-    0x69,
-    0x3b,
-    0x70,
-    0x00,
-    0x35,
-    0x96,
-    0x67,
-    0x49,
-    0x10,
-    0x28,
-    0x86,
-    0xa8,
-    0x00,
-    0x6f,
-    0xa8,
-    0x9a,
-    0x60,
-    0xee,
-    0x97,
-    0xd4,
-    0xe0,
-    0x1f,
-    0x2c,
-    0xd8,
-    0xcd,
-    0xaf,
-    0xb7,
-    0xc7,
-    0x93,
-    0xea,
-    0xa0,
-    0x76,
-    0x80,
-    0x75,
-    0x4f,
-    0xc3,
-    0xca,
-    0x3b,
-    0x4a,
-    0x2a,
-    0xd4,
-    0xa9,
-    0x9d,
-    0x93,
-    0xad,
-    0x1e,
-    0x7f,
-    0x6e,
-    0xd9,
-    0x9d,
-    0x32,
-    0x02,
-    0x55,
-    0xc6,
-    0x2b,
-    0x02,
-    0xd5,
-    0x04,
-    0x73,
-    0x62,
-    0x50,
-    0x07,
-    0x4d,
-    0x68,
-    0xbe,
-    0x75,
-    0x19,
-    0x06,
-    0x21,
-    0xdc,
-    0x78,
-    0x67,
-    0xc2,
-    0xec,
-    0xb1,
-    0xc8,
-    0xbd,
-    0xe3,
-    0x54,
-    0x89,
-    0xbf,
-    0x48,
-    0x1d,
-    0x84,
-    0x0f,
-    0xdc,
-    0x1a,
-    0x9d,
-    0xcb,
-    0xce,
-    0x10,
-    0x9a,
-    0x75,
-    0x2e,
-    0x1c,
-    0x36,
-    0xae,
-    0xa4,
-    0x96,
-    0x70,
-    0x40,
-    0x62,
-    0x3a,
-    0x29,
-    0x62,
-    0x57,
-    0x8a,
-    0xee,
-    0x38,
-    0xa5,
-    0x6e,
-    0x13,
-    0x9a,
-    0x56,
-    0x1e,
-    0x01,
-    0x16,
-    0x4a,
-    0x41,
-    0xd0,
-    0x38,
-    0x74,
-    0x57,
-    0x19,
-    0x08,
-    0x47,
-    0x54,
-    0x05,
-    0xd5,
-    0x6a,
-    0x8d,
-    0xaa,
-    0x31,
-    0xb3,
-    0xd8,
-    0x98,
-    0x3d,
-    0x53,
-    0xef,
-    0xae,
-    0x27,
-    0x4e,
-    0x16,
-    0x33,
-    0xf0,
-    0x2f,
-    0xfe,
-    0x22,
-    0x73,
-    0xf9,
-    0xe8,
-    0xc4,
-    0xa3,
-    0x60,
-    0x0d,
-    0x84,
-    0x14,
-    0x39,
-    0x3e,
-    0x00,
-    0xbd,
-    0x30,
-    0xc8,
-    0x5c,
-    0xfc,
-    0xb9,
-    0x9a,
-    0xdb,
-    0xda,
-    0x49,
-    0xaa,
-    0xb0,
-    0x91,
-    0xc5,
-    0x94,
-    0x11,
-    0x4b,
-    0x3b,
-    0x84,
-    0x8e,
-    0x2d,
-    0xd0,
-    0x57,
-    0xa1,
-    0x94,
-    0xf9,
-    0xfd,
-    0x86,
-    0x9e,
-    0xee,
-    0x22,
-    0x4c,
-    0xed,
-    0x5c,
-    0x0d,
-    0x2d,
-    0xa7,
-    0x5a,
-    0xc8,
-    0x1b,
-    0xc1,
-    0x9f,
-    0x81,
-    0x9b,
-    0x7e,
-    0xf2,
-    0x30,
-    0xd6,
-    0x32,
-    0xe1,
-    0x7a,
-    0xed,
-    0x4c,
-    0xb6,
-    0xd5,
-    0x8e,
-    0x93,
-    0xa7,
-    0xee,
-    0xc5,
-    0xb0,
-    0x4d,
-    0x48,
-    0x14,
-    0xed,
-    0x58,
-    0x25,
-    0xc5,
-    0x3c,
-    0x80,
-    0xa9,
-    0x7f,
-    0x7b,
-    0xbf,
-    0x3d,
-    0x18,
-    0xf6,
-    0xbd,
-    0x32,
-    0xaa,
-    0x2e,
-    0x8c,
-    0xa6,
-    0xe9,
-    0xd9,
-    0x95,
-    0xac,
-    0xb3,
-    0x29,
-    0xd2,
-    0xa7,
-    0xe9,
-    0x51,
-    0x3e,
-    0xf7,
-    0x7e,
-    0x46,
-    0x8a,
-    0xd8,
-    0xcd,
-    0xc2,
-    0x12,
-    0x86,
-    0x30,
-    0x8f,
-    0x0f,
-    0xa6,
-    0xce,
-    0x02,
-    0x0e,
-    0xe1,
-    0xb4,
-    0xc6,
-    0xa1,
-    0xd2,
-    0x28,
-    0xda,
-    0x54,
-    0x22,
-    0x39,
-    0xdd,
-    0xe2,
-    0xf1,
-    0x9b,
-    0x8a,
-    0xa9,
-    0x78,
-    0xb2,
-    0x7f,
-    0x5c,
-    0xed,
-    0xed,
-    0x42,
-    0xf8,
-    0xa7,
-    0x55,
-    0x85,
-    0xf9,
-    0x83,
-    0x66,
-    0xa9,
-    0xcd,
-    0x86,
-    0x1d,
-    0x82,
-    0x89,
-    0xc4,
-    0x52,
-    0x5a,
-    0xdb,
-    0x80,
-    0x48,
-    0x38,
-    0x3f,
-    0x94,
-    0x83,
-    0x62,
-    0x76,
-    0x14,
-    0xd9,
-    0x20,
-    0x35,
-    0x2e,
-    0xcc,
-    0xc3,
-    0x1a,
-    0x54,
-    0x17,
-    0xe6,
-    0xe3,
-    0x9e,
-    0x87,
-    0xf4,
-    0xe2,
-    0x69,
-    0x0c,
-    0xea,
-    0xac,
-    0x45,
-    0x10,
-    0x5e,
-    0x12,
-    0x0e,
-    0x07,
-    0xc1,
-    0x52,
-    0x58,
-    0x48,
-    0xe1,
-    0x8e,
-    0x10,
-    0x1b,
-    0xb1,
-    0x7c,
-    0x61,
-    0x13,
-    0x4d,
-    0x60,
-    0xd5,
-    0x9e,
-    0x39,
-    0x37,
-    0xbd,
-    0xda,
-    0xe9,
-    0x35,
-    0xd2,
-    0xaa,
-    0x87,
-    0x72,
-    0x1c,
-    0x0a,
-    0xf0,
-    0xe1,
-    0x13,
-    0x9f,
-    0x00,
-    0x81,
-    0x05,
-    0x92,
-    0x0f,
-    0xd7,
-    0xb7,
-    0x9f,
-    0xbb,
-    0x9b,
-    0x4f,
-    0x69,
-    0xe8,
-    0xb2,
-    0x71,
-    0x11,
-    0x06,
-    0x5c,
-    0xa9,
-    0x06,
-    0x93,
-    0xaf,
-    0x09,
-    0x1f,
-    0xe0,
-    0x44,
-    0x13,
-    0xe7,
-    0x17,
-    0x30,
-    0xd9,
-    0x38,
-    0x7d,
-    0x35,
-    0x62,
-    0x0b,
-    0xf5,
-    0x3a,
-    0x50,
-    0x8e,
-    0xc6,
-    0xf9,
-    0xc0,
-    0x77,
-    0x9d,
-    0xf8,
-    0x72,
-    0x98,
-    0xd6,
-    0xba,
-    0x2a,
-    0xb4,
-    0xf7,
-    0x36,
-    0x55,
-    0x92,
-    0x7d,
-    0x88,
-    0xf0,
-    0x4f,
-    0xdc,
-    0xe7,
-    0xa6,
-    0xf8,
-    0xc1,
-    0xd7,
-    0x38,
-    0x59,
-    0x9a,
-    0x9f,
-    0x22,
-    0x0f,
-    0x58,
-    0xfe,
-    0x7c,
-    0xe5,
-    0x73,
-    0x1a,
-    0x1e,
-    0x5d,
-    0x2f,
-    0xb9,
-    0x07,
-    0x8c,
-    0x1f,
-    0xb3,
-    0x00,
-    0x2b,
-    0xe7,
-    0xa8,
-    0x7c,
-    0xec,
-    0x45,
-    0xee,
-    0xc3,
-    0x0a,
-    0x53,
-    0xcd,
-    0x4f,
-    0x24,
-    0x06,
-    0xef,
-    0x76,
-    0x4b,
-    0xfb,
-    0x12,
-    0x4a,
-    0x5a,
-    0x73,
-    0x00,
-    0xbe,
-    0x85,
-    0x9c,
-    0xc1,
-    0x0a,
-    0x35,
-    0x12,
-    0x0f,
-    0x50,
-    0x14,
-    0xa5,
-    0x0a,
-    0x7f,
-    0x63,
-    0x5d,
-    0x2d,
-    0x78,
-    0x94,
-    0xbb,
-    0x81,
-    0x6f,
-    0x15,
-    0x42,
-    0x10,
-    0x94,
-    0x6a,
-    0x36,
-    0x9d,
-    0xf3,
-    0x7e,
-    0xa4,
-    0x92,
-    0x99,
-    0x3b,
-    0xa2,
-    0x3a,
-    0xf9,
-    0x58,
-    0xd8,
-    0x30,
-    0x8e,
-    0x72,
-    0x3f,
-    0x18,
-    0xc1,
-    0x5f,
-    0x29,
-    0x8c,
-    0x0c,
-    0xbf,
-    0x82,
-    0x59,
-    0x60,
-    0xd3,
-    0x55,
-    0xec,
-    0xc4,
-    0x93,
-    0x91,
-    0x07,
-    0x40,
-    0xfa,
-    0x0e,
-    0xb9,
-    0xf9,
-    0xa5,
-    0xcb,
-    0x8c,
-    0x9d,
-    0x9c,
-    0x7a,
-    0x00,
-    0x01,
-    0x70,
-    0x3e,
-    0x38,
-    0x09,
-    0x86,
-    0xb3,
-    0xf4,
-    0xc9,
-    0xb2,
-    0x2f,
-    0xbf,
-    0xe9,
-    0x07,
-    0x47,
-    0x6a,
-    0x4e,
-    0xee,
-    0x95,
-    0xb8,
-    0xf6,
-    0x76,
-    0xb9,
-    0x5b,
-    0x24,
-    0xeb,
-    0x9e,
-    0x1f,
-    0xbe,
-    0xaa,
-    0xff,
-    0x66,
-    0xf3,
-    0x33,
-    0x29,
-    0xd4,
-    0x20,
-    0x80,
-    0x02,
-    0x4b,
-    0xf5,
-    0x96,
-    0x4a,
-    0x1a,
-    0xd4,
-    0x59,
-    0x21,
-    0x71,
-    0x79,
-    0xa4,
-    0xc9,
-    0x19,
-    0xe0,
-    0x99,
-    0xae,
-    0x61,
-    0x63,
-    0x36,
-    0xa3,
-    0x5c,
-    0x24,
-    0x29,
-    0x6f,
-    0x49,
-    0xaa,
-    0xe6,
-    0x88,
-    0x53,
-    0xcf,
-    0xf6,
-    0x1e,
-    0x7b,
-    0xd9,
-    0x92,
-    0x5b,
-    0xd2,
-    0xe7,
-    0x70,
-    0xea,
-    0xeb,
-    0x8f,
-    0xdd,
-    0xb6,
-    0x90,
-    0xc5,
-    0x0c,
-    0xf4,
-    0xb4,
-    0xfe,
-    0xae,
-    0x63,
-    0xa9,
-    0x96,
-    0xc2,
-    0xd2,
-    0x93,
-    0x6f,
-    0xaf,
-    0xe4,
-    0x1d,
-    0xdc,
-    0x90,
-    0x10,
-    0x6a,
-    0xbd,
-    0xcf,
-    0xeb,
-    0x4f,
-    0xeb,
-    0xf5,
-    0xaa,
-    0xbf,
-    0xd6,
-    0xc0,
-    0xe2,
-    0x86,
-    0x6c,
-    0x77,
-    0x93,
-    0x3a,
-    0x3d,
-    0x7a,
-    0x65,
-    0x6f,
-    0xdd,
-    0x1d,
-    0x31,
-    0x2b,
-    0x8a,
-    0xb6,
-    0xc3,
-    0x9a,
-    0x0f,
-    0xf5,
-    0xdf,
-    0x02,
-    0xe8,
-    0x74,
-    0x81,
-    0xf8,
-    0xa7,
-    0x8f,
-    0x69,
-    0xd5,
-    0x97,
-    0x76,
-    0xd7,
-    0x64,
-    0x9e,
-    0x80,
-    0x94,
-    0xdd,
-    0x68,
-    0xc3,
-    0x31,
-    0x17,
-    0xc1,
-    0xe1,
-    0x93,
-    0xf9,
-    0x43,
-    0x24,
-    0xb0,
-    0x32,
-    0x32,
-    0xce,
-    0x93,
-    0x29,
-    0xa4,
-    0xaa,
-    0xa6,
-    0x37,
-    0xe5,
-    0xe7,
-    0x30,
-    0x15,
-    0x19,
-    0x26,
-    0x1d,
-    0x90,
-    0x23,
-    0xd2,
-    0xfe,
-    0x84,
-    0xc6,
-    0xb0,
-    0x50,
-    0x07,
-    0x0a,
-    0xb7,
-    0x01,
-    0xe5,
-    0xe2,
-    0x21,
-    0x30,
-    0x4d,
-    0x0b,
-    0xc2,
-    0x35,
-    0xc9,
-    0x37,
-    0x99,
-    0xe1,
-    0x73,
-    0x6b,
-    0xa5,
-    0x06,
-    0x67,
-    0xa6,
-    0xf9,
-    0x3a,
-    0x74,
-    0xc3,
-    0x13,
-    0xd9,
-    0x17,
-    0xa0,
-    0x6a,
-    0x49,
-    0xa9,
-    0x80,
-    0x46,
-    0x82,
-    0xd7,
-    0xae,
-    0xd4,
-    0xcd,
-    0x53,
-    0x64,
-    0x7a,
-    0xcb,
-    0xc9,
-    0xea,
-    0x68,
-    0xba,
-    0x15,
-    0x02,
-    0x70,
-    0xf4,
-    0xb3,
-    0x84,
-    0x17,
-    0xb8,
-    0x76,
-    0x46,
-    0xec,
-    0x2d,
-    0x7d,
-    0x3e,
-    0x18,
-    0xa4,
-    0x64,
-    0xeb,
-    0x37,
-    0x1e,
-    0xb7,
-    0xf0,
-    0x66,
-    0x0e,
-    0xac,
-    0x03,
-    0x9d,
-    0x60,
-    0x11,
-    0x05,
-    0x40,
-    0xb9,
-    0x83,
-    0x72,
-    0xf0,
-    0x01,
-    0xe1,
-    0xfc,
-    0xa7,
-    0x1f,
-    0x00,
-    0x73,
-    0x04,
-    0x03,
-    0xa0,
-    0xe8,
-    0xe3,
-    0xea,
-    0x9f,
-    0x12,
-    0x31,
-    0xdd,
-    0x6d,
-    0xf1,
-    0xff,
-    0x7b,
-    0xc0,
-    0xb0,
-    0xd4,
-    0xf9,
-    0x89,
-    0xd0,
-    0x48,
-    0x67,
-    0x26,
-    0x83,
-    0xce,
-    0x35,
-    0xd9,
-    0x56,
-    0xd2,
-    0xf5,
-    0x79,
-    0x13,
-    0x04,
-    0x62,
-    0x67,
-    0xe6,
-    0xf3,
-    0xa2,
-    0xc4,
-    0xbe,
-    0xdd,
-    0xc8,
-    0xe1,
-    0xf6,
-    0xc5,
-    0x9d,
-    0xf7,
-    0x35,
-    0xc7,
-    0xa0,
-    0x19,
-    0x93,
-    0xa9,
-    0x4b,
-    0x66,
-    0xfd,
-    0xb2,
-    0x98,
-    0x83,
-    0xda,
-    0xbf,
-    0xc4,
-    0x49,
-    0xee,
-    0x93,
-    0x53,
-    0xba,
-    0x7f,
-    0x6f,
-    0x54,
-    0x3a,
-    0xb7,
-    0xe2,
-    0xe6,
-    0xfc,
-    0x4a,
-    0xe3,
-    0xfb,
-    0xba,
-    0x59,
-    0x1d,
-    0x5c,
-    0xa9,
-    0x95,
-    0x8a,
-    0xee,
-    0xac,
-    0xa7,
-    0x43,
-    0x33,
-    0xc7,
-    0xd0,
-    0x97,
-    0x13,
-    0xd7,
-    0xcc,
-    0x5a,
-    0xdd,
-    0x81,
-    0xfd,
-    0x7f,
-    0x89,
-    0x69,
-    0xc5,
-    0xea,
-    0x40,
-    0xa4,
-    0x34,
-    0x7f,
-    0x1e,
-    0x6f,
-    0xe3,
-    0x7f,
-    0x36,
-    0x21,
-    0x1f,
-    0x14,
-    0xd6,
-    0x5e,
-    0x4a,
-    0x2a,
-    0x0d,
-    0x8e,
-    0x7f,
-    0x81,
-    0x6b,
-    0x8d,
-    0x75,
-    0x00,
-    0x08,
-    0xa4,
-    0xa6,
-    0x4d,
-    0xc7,
-    0xb9,
-    0xb0,
-    0x9a,
-    0xdc,
-    0xc2,
-    0xfb,
-    0xc2,
-    0x8c,
-    0x80,
-    0x9c,
-    0x94,
-    0x34,
-    0x69,
-    0x79,
-    0x6e,
-    0x8d,
-    0xe6,
-    0xae,
-    0x0f,
-    0x2e,
-    0xbe,
-    0x30,
-    0xa6,
-    0x53,
-    0xd2,
-    0xb0,
-    0x2e,
-    0xdc,
-    0x0c,
-    0xc3,
-    0xfe,
-    0x99,
-    0x92,
-    0x3f,
-    0x9c,
-    0xc4,
-    0x3f,
-    0xe8,
-    0xd3,
-    0xcf,
-    0x53,
-    0x4c,
-    0x05,
-    0x61,
-    0x69,
-    0xeb,
-    0xc2,
-    0x9b,
-    0xaa,
-    0x9b,
-    0x98,
-    0x9f,
-    0x41,
-    0x2b,
-    0x2d,
-    0x53,
-    0x0e,
-    0x47,
-    0x8c,
-    0x62,
-    0x9f,
-    0x9b,
-    0xbd,
-    0x84,
-    0x5c,
-    0x3c,
-    0x98,
-    0x00,
-    0x01,
-    0x43,
-    0xda,
-    0x6f,
-    0x52,
-    0xbb,
-    0x79,
-    0xc2,
-    0x0a,
-    0xbd,
-    0x35,
-    0x86,
-    0x14,
-    0xd9,
-    0x70,
-    0x67,
-    0xfd,
-    0xb8,
-    0x3f,
-    0xf3,
-    0xaa,
-    0x00,
-    0xc1,
-    0xa1,
-    0x46,
-    0x78,
-    0xb0,
-    0x12,
-    0x7f,
-    0x6d,
-    0x35,
-    0x96,
-    0xf2,
-    0x54,
-    0x01,
-    0xf2,
-    0xe3,
-    0xb0,
-    0x99,
-    0x61,
-    0x32,
-    0x36,
-    0xf1,
-    0xd8,
-    0x8a,
-    0x2f,
-    0x3d,
-    0x8e,
-    0xdc,
-    0x1f,
-    0x04,
-    0xbc,
-    0x0c,
-    0xa4,
-    0x76,
-    0xa1,
-    0xea,
-    0xa0,
-    0xff,
-    0xca,
-    0x63,
-    0x9a,
-    0x1c,
-    0x90,
-    0xf9,
-    0x62,
-    0x6e,
-    0xe2,
-    0x70,
-    0xf4,
-    0x0d,
-    0x45,
-    0xca,
-    0x9f,
-    0x1e,
-    0x18,
-    0x76,
-    0x67,
-    0xa8,
-    0x1d,
-    0xc5,
-    0xa7,
-    0xa3,
-    0x35,
-    0x9d,
-    0xfb,
-    0x52,
-    0x6b,
-    0x71,
-    0x5c,
-    0xd3,
-    0x34,
-    0x70,
-    0x8d,
-    0xf5,
-    0xf5,
-    0xfd,
-    0xb7,
-    0x49,
-    0xc6,
-    0x60,
-    0x50,
-    0x7c,
-    0x76,
-    0xbb,
-    0x40,
-    0xe3,
-    0xcf,
-    0x3f,
-    0x47,
-    0x58,
-    0x1b,
-    0x9f,
-    0x99,
-    0x45,
-    0xe7,
-    0xc5,
-    0xcc,
-    0xfe,
-    0x06,
-    0xc5,
-    0xf4,
-    0x54,
-    0xd9,
-    0x0f,
-    0x0d,
-    0x67,
-    0xce,
-    0xe8,
-    0x99,
-    0xbb,
-    0x27,
-    0x1b,
-    0x89,
-    0x8e,
-    0xfd,
-    0xeb,
-    0x61,
-    0x69,
-    0x84,
-    0x4d,
-    0x98,
-    0xf6,
-    0x90,
-    0x54,
-    0x3d,
-    0x11,
-    0x58,
-    0xed,
-    0xe1,
-    0x21,
-    0x7a,
-    0xcc,
-    0xb0,
-    0xa9,
-    0x40,
-    0xa6,
-    0xe1,
-    0x1a,
-    0x22,
-    0xa1,
-    0x51,
-    0xec,
-    0x8c,
-    0x09,
-    0x6a,
-    0xec,
-    0xe1,
-    0x44,
-    0x4a,
-    0xd8,
-    0xbf,
-    0x08,
-    0x21,
-    0x29,
-    0x85,
-    0xcb,
-    0xdb,
-    0x30,
-    0x12,
-    0x7b,
-    0x00,
-    0x64,
-    0xd0,
-    0x70,
-    0xd8,
-    0xfb,
-    0xf2,
-    0x9f,
-    0xd2,
-    0xb7,
-    0xf9,
-    0x10,
-    0x26,
-    0x03,
-    0x7d,
-    0x92,
-    0xba,
-    0x3e,
-    0x2a,
-    0xad,
-    0x43,
-    0x57,
-    0x09,
-    0xd8,
-    0xac,
-    0x9a,
-    0x00,
-    0xec,
-    0xbb,
-    0xc9,
-    0x9d,
-    0xd9,
-    0xf2,
-    0x6f,
-    0x0f,
-    0x97,
-    0xb3,
-    0x71,
-    0x75,
-    0x60,
-    0xa8,
-    0xe6,
-    0x5c,
-    0x1d,
-    0x62,
-    0x28,
-    0x82,
-    0x1e,
-    0x40,
-    0x2b,
-    0xe0,
-    0x0d,
-    0x93,
-    0x0e,
-    0xe8,
-    0x25,
-    0xff,
-    0xf0,
-    0x0c,
-    0x9f,
-    0x25,
-    0x05,
-    0x7f,
-    0x6d,
-    0x7e,
-    0xe9,
-    0x3f,
-    0x2b,
-    0x8a,
-    0x34,
-    0x53,
-    0x53,
-    0x2b,
-    0x4e,
-    0x51,
-    0xb0,
-    0x4b,
-    0x85,
-    0x24,
-    0x15,
-    0xc5,
-    0x5c,
-    0x0c,
-    0x4e,
-    0x83,
-    0x26,
-    0xe6,
-    0x57,
-    0xe4,
-    0xd4,
-    0xae,
-    0xcc,
-    0x60,
-    0x0c,
-    0x42,
-    0xa1,
-    0x6e,
-    0x7b,
-    0x69,
-    0x13,
-    0xa5,
-    0x6b,
-    0x13,
-    0xde,
-    0x22,
-    0x98,
-    0xe3,
-    0xb1,
-    0x2b,
-    0x3f,
-    0xea,
-    0xdf,
-    0x11,
-    0x79,
-    0xb6,
-    0x57,
-    0x5b,
-    0xc7,
-    0x8b,
-    0xd6,
-    0x20,
-    0xee,
-    0xf0,
-    0x5b,
-    0xb5,
-    0x05,
-    0x6d,
-    0xdc,
-    0x89,
-    0xcc,
-    0x94,
-    0x37,
-    0x4c,
-    0x3f,
-    0x3e,
-    0x6b,
-    0x57,
-    0x6b,
-    0x17,
-    0x08,
-    0x48,
-    0x81,
-    0x5d,
-    0xe4,
-    0xec,
-    0x29,
-    0xe4,
-    0x10,
-    0x63,
-    0x18,
-    0x5e,
-    0x0a,
-    0x7e,
-    0xe5,
-    0xd9,
-    0x34,
-    0x6c,
-    0x18,
-    0x89,
-    0x85,
-    0x96,
-    0x85,
-    0xc8,
-    0x7f,
-    0xc7,
-    0xd8,
-    0x5b,
-    0x61,
-    0x90,
-    0x70,
-    0xf7,
-    0x9d,
-    0xeb,
-    0x71,
-    0x03,
-    0x8c,
-    0x1e,
-    0x14,
-    0xa0,
-    0x61,
-    0xe2,
-    0x42,
-    0xe7,
-    0x5c,
-    0xc5,
-    0x62,
-    0x71,
-    0x40,
-    0xcd,
-    0x6f,
-    0x1d,
-    0x06,
-    0x5e,
-    0x4d,
-    0x0d,
-    0xd3,
-    0x5d,
-    0x5d,
-    0xf2,
-    0x28,
-    0x96,
-    0x4f,
-    0x8a,
-    0x58,
-    0x5b,
-    0x37,
-    0x67,
-    0x40,
-    0x6e,
-    0xe3,
-    0xf1,
-    0x32,
-    0x22,
-    0x6c,
-    0xae,
-    0x32,
-    0xbc,
-    0x0c,
-    0xc1,
-    0x65,
-    0x1f,
-    0x2f,
-    0xb1,
-    0xc6,
-    0xa9,
-    0xcd,
-    0x6c,
-    0x1b,
-    0x58,
-    0xf6,
-    0x8c,
-    0x28,
-    0x31,
-    0xaf,
-    0xd8,
-    0x22,
-    0xe2,
-    0xfc,
-    0x0e,
-    0x66,
-    0xa6,
-    0x3e,
-    0xe0,
-    0x6b,
-    0x69,
-    0xbf,
-    0x3c,
-    0xf5,
-    0x2d,
-    0x8c,
-    0xd0,
-    0x8c,
-    0xac,
-    0x83,
-    0xce,
-    0x2d,
-    0x3e,
-    0xac,
-    0xec,
-    0x3f,
-    0xfe,
-    0xcd,
-    0xb0,
-    0xc8,
-    0x28,
-    0x38,
-    0xea,
-    0xe1,
-    0xc6,
-    0xe8,
-    0x82,
-    0x68,
-    0x8c,
-    0xcc,
-    0x73,
-    0xf4,
-    0x00,
-    0x63,
-    0x18,
-    0x0e,
-    0xde,
-    0x89,
-    0xa7,
-    0x9e,
-    0xba,
-    0x91,
-    0xfb,
-    0xa3,
-    0xe7,
-    0x93,
-    0x96,
-    0x27,
-    0x98,
-    0x07,
-    0xe6,
-    0x73,
-    0x45,
-    0x93,
-    0xc7,
-    0x7f,
-    0x50,
-    0x22,
-    0x4a,
-    0xac,
-    0xe9,
-    0x36,
-    0xb4,
-    0xb5,
-    0x2f,
-    0x7f,
-    0xca,
-    0xe3,
-    0x97,
-    0xac,
-    0x4c,
-    0x81,
-    0x92,
-    0x81,
-    0xc0,
-    0x90,
-    0x6a,
-    0x2a,
-    0x70,
-    0xbc,
-    0x6d,
-    0xcf,
-    0xb6,
-    0x8e,
-    0x4e,
-    0x68,
-    0x77,
-    0xe2,
-    0xc8,
-    0xd3,
-    0xee,
-    0x9c,
-    0x84,
-    0x23,
-    0xab,
-    0x97,
-    0x3d,
-    0x3c,
-    0xdb,
-    0xde,
-    0x22,
-    0x9d,
-    0xc9,
-    0x1f,
-    0x7c,
-    0x7c,
-    0xa5,
-    0x5c,
-    0x90,
-    0x18,
-    0x85,
-    0xe4,
-    0xc7,
-    0x4b,
-    0xa9,
-    0x82,
-    0x0c,
-    0x5e,
-    0x03,
-    0xf4,
-    0x76,
-    0x22,
-    0xf6,
-    0x9e,
-    0x27,
-    0x3c,
-    0x5f,
-    0x80,
-    0x74,
-    0xc1,
-    0xd2,
-    0x66,
-    0x46,
-    0x03,
-    0x26,
-    0x5e,
-    0xbf,
-    0xaa,
-    0x33,
-    0x6f,
-    0x21,
-    0x06,
-    0xda,
-    0x88,
-    0xec,
-    0xa3,
-    0x46,
-    0xb7,
-    0x47,
-    0x1e,
-    0x72,
-    0x9b,
-    0xa1,
-    0x38,
-    0xeb,
-    0x1c,
-    0x98,
-    0x29,
-    0xd8,
-    0x59,
-    0x1a,
-    0x37,
-    0x37,
-    0xe2,
-    0xca,
-    0x86,
-    0x69,
-    0x28,
-    0xa5,
-    0x32,
-    0xf1,
-    0x32,
-    0xe5,
-    0x9b,
-    0x79,
-    0x91,
-    0x25,
-    0x00,
-    0x15,
-    0x95,
-    0xc7,
-    0x50,
-    0xcc,
-    0xc1,
-    0x93,
-    0x3c,
-    0x55,
-    0x7d,
-    0xa0,
-    0x91,
-    0x1e,
-    0x0b,
-    0x78,
-    0xc5,
-    0x93,
-    0xbc,
-    0x77,
-    0xcf,
-    0x9c,
-    0x64,
-    0x74,
-    0x3c,
-    0x67,
-    0x0b,
-    0xa4,
-    0x80,
-    0x69,
-    0xe5,
-    0xba,
-    0x8a,
-    0x9f,
-    0x85,
-    0x53,
-    0x9b,
-    0x1a,
-    0x4d,
-    0x92,
-    0x57,
-    0xba,
-    0x29,
-    0x07,
-    0x1d,
-    0x3a,
-    0x7d,
-    0xd6,
-    0x94,
-    0x6c,
-    0x5b,
-    0x15,
-    0x86,
-    0xc6,
-    0xfa,
-    0x75,
-    0xf2,
-    0x1e,
-    0x63,
-    0x25,
-    0x5c,
-    0xb2,
-    0x6e,
-    0xf3,
-    0x68,
-    0x6b,
-    0xed,
-    0xb5,
-    0xa7,
-    0x63,
-    0x27,
-    0xe7,
-    0xb1,
-    0xa4,
-    0x88,
-    0x95,
-    0x74,
-    0x33,
-    0x96,
-    0x7c,
-    0xcb,
-    0x4d,
-    0x27,
-    0x6c,
-    0x53,
-    0xf0,
-    0xd1,
-    0xf0,
-    0x7a,
-    0x9d,
-    0xa3,
-    0x31,
-    0xd8,
-    0x5d,
-    0x12,
-    0x18,
-    0xc3,
-    0x02,
-    0x36,
-    0xb3,
-    0x1d,
-    0xaf,
-    0x37,
-    0xda,
-    0x71,
-    0x9a,
-    0x02,
-    0x12,
-    0x3e,
-    0x11,
-    0x40,
-    0xb1,
-    0x93,
-    0xbb,
-    0x88,
-    0x43,
-    0xdc,
-    0x21,
-    0xd3,
-    0x2d,
-    0xfc,
-    0x6c,
-    0x31,
-    0x90,
-    0x9c,
-    0x70,
-    0xbb,
-    0x70,
-    0xc2,
-    0xea,
-    0xc9,
-    0x16,
-    0xa5,
-    0x06,
-    0x65,
-    0xb2,
-    0xc0,
-    0x25,
-    0xff,
-    0x45,
-    0x25,
-    0xdc,
-    0x62,
-    0xbe,
-    0x14,
-    0x40,
-    0xe6,
-    0x63,
-    0xcc,
-    0x61,
-    0xe7,
-    0x73,
-    0xa1,
-    0x14,
-    0x77,
-    0x0a,
-    0x4f,
-    0xf6,
-    0x50,
-    0x44,
-    0x8e,
-    0xad,
-    0x0c,
-    0xa5,
-    0xe6,
-    0x71,
-    0x99,
-    0xb9,
-    0xc5,
-    0xcc,
-    0xe7,
-    0xf7,
-    0xcf,
-    0x9d,
-    0xe3,
-    0xeb,
-    0x75,
-    0x63,
-    0xa9,
-    0x95,
-    0xc9,
-    0xb8,
-    0xf5,
-    0x0c,
-    0x90,
-    0x1c,
-    0xdb,
-    0x66,
-    0x99,
-    0xf4,
-    0xb9,
-    0xdc,
-    0x4e,
-    0xd2,
-    0x69,
-    0x2a,
-    0x89,
-    0xf7,
-    0xbb,
-    0x35,
-    0xa9,
-    0x17,
-    0x22,
-    0xf0,
-    0xe4,
-    0x5c,
-    0xad,
-    0x80,
-    0xdf,
-    0xad,
-    0x39,
-    0x9f,
-    0x7b,
-    0x2f,
-    0xe6,
-    0x3e,
-    0xf2,
-    0x0c,
-    0xc7,
-    0x6e,
-    0x24,
-    0x74,
-    0xde,
-    0x80,
-    0x2b,
-    0xe2,
-    0x47,
-    0x6b,
-    0x35,
-    0xa1,
-    0xb3,
-    0x6f,
-    0x93,
-    0x8e,
-    0x18,
-    0xf8,
-    0x0d,
-    0x1f,
-    0xa7,
-    0xc5,
-    0x79,
-    0xa4,
-    0xff,
-    0x49,
-    0x8c,
-    0xcd,
-    0xa0,
-    0x52,
-    0xef,
-    0x6d,
-    0xa2,
-    0xe8,
-    0x95,
-    0x7d,
-    0xa7,
-    0x78,
-    0x4d,
-    0x64,
-    0x0e,
-    0x32,
-    0x93,
-    0x76,
-    0x69,
-    0xaf,
-    0xac,
-    0xba,
-    0x31,
-    0xd7,
-    0xf2,
-    0xf0,
-    0xb9,
-    0x02,
-    0x6c,
-    0xd2,
-    0x61,
-    0x5d,
-    0xa1,
-    0x9b,
-    0x0c,
-    0x90,
-    0xae,
-    0xc6,
-    0xd4,
-    0x9d,
-    0x97,
-    0x18,
-    0xfc,
-    0x0b,
-    0xdb,
-    0xe0,
-    0x25,
-    0x45,
-    0x4b,
-    0x7e,
-    0xc5,
-    0x3d,
-    0x1b,
-    0x22,
-    0xd6,
-    0x54,
-    0x3a,
-    0xd6,
-    0xcb,
-    0x7e,
-    0xdf,
-    0xbf,
-    0xc8,
-    0xa1,
-    0x65,
-    0x9f,
-    0x12,
-    0x3f,
-    0x58,
-    0x9f,
-    0xc5,
-    0x55,
-    0xd0,
-    0x4c,
-    0xc5,
-    0x83,
-    0xfd,
-    0xdf,
-    0xf6,
-    0x6c,
-    0x04,
-    0xc1,
-    0xb0,
-    0x60,
-    0x09,
-    0x4e,
-    0x6d,
-    0x39,
-    0x8d,
-    0xda,
-    0xc5,
-    0x82,
-    0xfb,
-    0xf1,
-    0x9d,
-    0xdf,
-    0x7d,
-    0xe3,
-    0x9b,
-    0xa8,
-    0x14,
-    0x80,
-    0xdd,
-    0xd8,
-    0xe8,
-    0x21,
-    0xea,
-    0x26,
-    0xdd,
-    0xe8,
-    0xe8,
-    0x71,
-    0x66,
-    0x48,
-    0x10,
-    0x61,
-    0x9e,
-    0xc7,
-    0x60,
-    0x4c,
-    0x95,
-    0x02,
-    0x8f,
-    0x56,
-    0xe7,
-    0xf2,
-    0x46,
-    0xdd,
-    0x94,
-    0x6f,
-    0x8d,
-    0x14,
-    0x0b,
-    0xf2,
-    0x84,
-    0xed,
-    0x88,
-    0x9f,
-    0x53,
-    0x3d,
-    0xa0,
-    0x83,
-    0x63,
-    0x1b,
-    0x1b,
-    0x1a,
-    0xcf,
-    0x88,
-    0x01,
-    0x14,
-    0x15,
-    0x56,
-    0xf7,
-    0x58,
-    0x12,
-    0x42,
-    0xcc,
-    0x4a,
-    0x2d,
-    0x64,
-    0x50,
-    0x49,
-    0xd2,
-    0xc9,
-    0x65,
-    0x7c,
-    0x22,
-    0x5e,
-    0x58,
-    0xcf,
-    0xe8,
-    0x0f,
-    0x71,
-    0x38,
-    0xcf,
-    0x31,
-    0xc8,
-    0x3f,
-    0xd3,
-    0x1d,
-    0x5b,
-    0xbd,
-    0xf6,
-    0x1e,
-    0x5e,
-    0xe4,
-    0x34,
-    0x8e,
-    0xd2,
-    0x7f,
-    0xb8,
-    0x3b,
-    0x59,
-    0x7b,
-    0x50,
-    0x10,
-    0x49,
-    0xa7,
-    0x1f,
-    0xf1,
-    0xff,
-    0xb8,
-    0x92,
-    0xe6,
-    0x76,
-    0x90,
-    0x95,
-    0x7c,
-    0x18,
-    0xc0,
-    0x06,
-    0x68,
-    0xd3,
-    0x4b,
-    0x69,
-    0x6e,
-    0x70,
-    0xad,
-    0xde,
-    0x81,
-    0x20,
-    0x1b,
-    0x51,
-    0x2c,
-    0x58,
-    0x0d,
-    0xf1,
-    0x30,
-    0xdf,
-    0xfa,
-    0xe3,
-    0x6f,
-    0x26,
-    0x62,
-    0x37,
-    0x08,
-    0xd7,
-    0x12,
-    0x1b,
-    0xc4,
-    0xb0,
-    0xa4,
-    0x4e,
-    0xb1,
-    0x92,
-    0x45,
-    0xd8,
-    0x0c,
-    0xd5,
-    0xbb,
-    0xf9,
-    0x64,
-    0xdf,
-    0xa6,
-    0x5f,
-    0xfd,
-    0xf5,
-    0x05,
-    0x9b,
-    0x73,
-    0x50,
-    0xfd,
-    0xd6,
-    0x9f,
-    0x74,
-    0xd6,
-    0xc0,
-    0xbe,
-    0xbd,
-    0x47,
-    0xca,
-    0xd0,
-    0x3b,
-    0xf3,
-    0x95,
-    0x3f,
-    0xc0,
-    0x33,
-    0xaa,
-    0xc1,
-    0x36,
-    0x16,
-    0x6b,
-    0x7f,
-    0x36,
-    0xa6,
-    0x4a,
-    0x77,
-    0xd7,
-    0x6d,
-    0x38,
-    0x1f,
-    0xc4,
-    0x38,
-    0x60,
-    0x4b,
-    0x92,
-    0x1b,
-    0x16,
-    0x50,
-    0x50,
-    0xb5,
-    0x0a,
-    0x6a,
-    0x5f,
-    0xb5,
-    0xc2,
-    0x5b,
-    0x84,
-    0x9d,
-    0x47,
-    0x55,
-    0x3b,
-    0xc7,
-    0x1e,
-    0x1a,
-    0x4e,
-    0xa5,
-    0x79,
-    0x62,
-    0xa7,
-    0x4c,
-    0xaf,
-    0x7d,
-    0x62,
-    0x34,
-    0xea,
-    0x39,
-    0x27,
-    0x39,
-    0x1f,
-    0x06,
-    0xb7,
-    0xe6,
-    0x44,
-    0x58,
-    0xc4,
-    0xf3,
-    0xbd,
-    0x4d,
-    0x06,
-    0x0c,
-    0x17,
-    0x90,
-    0x8b,
-    0xd5,
-    0xf8,
-    0x7d,
-    0x4f,
-    0x2a,
-    0x56,
-    0x86,
-    0x0c,
-    0xab,
-    0xe8,
-    0xd5,
-    0x53,
-    0x78,
-    0xda,
-    0x32,
-    0xdc,
-    0x39,
-    0xc5,
-    0x28,
-    0x1b,
-    0x62,
-    0xde,
-    0x63,
-    0x13,
-    0xb5,
-    0x6e,
-    0x5d,
-    0x6f,
-    0x08,
-    0x82,
-    0x3a,
-    0xcf,
-    0x48,
-    0xe3,
-    0xf0,
-    0x60,
-    0xbe,
-    0x48,
-    0xaa,
-    0xaf,
-    0x91,
-    0xcb,
-    0x6f,
-    0xbf,
-    0x8c,
-    0x9a,
-    0xfe,
-    0x59,
-    0x22,
-    0xef,
-    0xfd,
-    0xa3,
-    0xaf,
-    0x42,
-    0x53,
-    0xf4,
-    0x01,
-    0xbd,
-    0xd3,
-    0xe7,
-    0x17,
-    0xf0,
-    0x1a,
-    0xae,
-    0x28,
-    0xc6,
-    0xba,
-    0xa9,
-    0xe8,
-    0xb7,
-    0x98,
-    0x37,
-    0x06,
-    0x40,
-    0x92,
-    0xcd,
-    0xf9,
-    0x90,
-    0x65,
-    0x45,
-    0xfc,
-    0x85,
-    0xce,
-    0x78,
-    0x57,
-    0xd6,
-    0xf0,
-    0x0e,
-    0xe1,
-    0x92,
-    0xf6,
-    0x95,
-    0xc3,
-    0xc9,
-    0xf9,
-    0xd1,
-    0x7e,
-    0x88,
-    0x24,
-    0x53,
-    0x30,
-    0x0b,
-    0x16,
-    0x4d,
-    0x13,
-    0x2f,
-    0x87,
-    0xa5,
-    0x46,
-    0x26,
-    0x2f,
-    0x48,
-    0xd0,
-    0x6e,
-    0xe3,
-    0xc1,
-    0xe2,
-    0x04,
-    0x02,
-    0x0a,
-    0x5c,
-    0xd5,
-    0x0f,
-    0xa2,
-    0x93,
-    0x75,
-    0x9f,
-    0xdf,
-    0x51,
-    0x13,
-    0x76,
-    0x86,
-    0x1e,
-    0xad,
-    0xed,
-    0x99,
-    0xbe,
-    0x80,
-    0x97,
-    0x70,
-    0xfb,
-    0xc3,
-    0x23,
-    0x0b,
-    0xa5,
-    0x94,
-    0x84,
-    0xa7,
-    0xd6,
-    0x33,
-    0x50,
-    0x8f,
-    0x7a,
-    0x6e,
-    0x66,
-    0x35,
-    0x0f,
-    0x5c,
-    0xd4,
-    0x81,
-    0xaa,
-    0x4e,
-    0xf8,
-    0x69,
-    0x3b,
-    0x03,
-    0xe5,
-    0xc2,
-    0x11,
-    0x1b,
-    0x07,
-    0x56,
-    0xa1,
-    0xce,
-    0x0b,
-    0x36,
-    0x83,
-    0xde,
-    0xf9,
-    0x52,
-    0xbd,
-    0xca,
-    0xa3,
-    0x46,
-    0x44,
-    0x45,
-    0x43,
-    0x77,
-    0xc0,
-    0xe6,
-    0x60,
-    0x5f,
-    0x90,
-    0x21,
-    0xf1,
-    0x25,
-    0x0e,
-    0x76,
-    0xc5,
-    0x71,
-    0x14,
-    0xe8,
-    0x22,
-    0x7e,
-    0xbf,
-    0xb1,
-    0xad,
-    0x71,
-    0x72,
-    0x34,
-    0x89,
-    0xe9,
-    0x1e,
-    0x33,
-    0xc3,
-    0xd7,
-    0xc1,
-    0x42,
-    0xee,
-    0x90,
-    0x2d,
-    0x7c,
-    0x0a,
-    0x20,
-    0x0b,
-    0x74,
-    0xab,
-    0xe1,
-    0x1f,
-    0x6f,
-    0x57,
-    0x4d,
-    0xce,
-    0xd0,
-    0x2f,
-    0x11,
-    0xdd,
-    0xd3,
-    0xd1,
-    0x62,
-    0x7b,
-    0x7e,
-    0x7e,
-    0x94,
-    0x82,
-    0xd5,
-    0x78,
-    0xe9,
-    0xfa,
-    0x4e,
-    0xae,
-    0xa7,
-    0xdf,
-    0x84,
-    0x9b,
-    0x6d,
-    0x23,
-    0x2f,
-    0x6c,
-    0xc6,
-    0xf7,
-    0x54,
-    0x61,
-    0xff,
-    0x47,
-    0xb9,
-    0x75,
-    0x36,
-    0x83,
-    0x9c,
-    0x41,
-    0xb4,
-    0xa5,
-    0xa4,
-    0x1e,
-    0x7d,
-    0x70,
-    0x18,
-    0x8a,
-    0x24,
-    0xf5,
-    0x4f,
-    0xcd,
-    0xe4,
-    0x5c,
-    0x68,
-    0xdc,
-    0xed,
-    0xe1,
-    0x3b,
-    0x7d,
-    0xfc,
-    0x1d,
-    0x8e,
-    0xac,
-    0x2e,
-    0x87,
-    0x8d,
-    0x3d,
-    0x16,
-    0x3a,
-    0x74,
-    0xc4,
-    0x0d,
-    0xf9,
-    0x8f,
-    0xb2,
-    0xc9,
-    0x70,
-    0x64,
-    0xc0,
-    0x32,
-    0xbc,
-    0x2f,
-    0x91,
-    0x70,
-    0x2e,
-    0x8e,
-    0x92,
-    0x49,
-    0x4c,
-    0x7e,
-    0x26,
-    0xaa,
-    0x19,
-    0x86,
-    0x00,
-    0x83,
-    0x97,
-    0x32,
-    0xcf,
-    0xd8,
-    0x89,
-    0xc3,
-    0x21,
-    0x16,
-    0x7d,
-    0x25,
-    0x81,
-    0xa3,
-    0x0a,
-    0x21,
-    0xe3,
-    0xb8,
-    0x57,
-    0xd4,
-    0x43,
-    0x73,
-    0xdc,
-    0x60,
-    0x88,
-    0x28,
-    0x6d,
-    0xe1,
-    0xae,
-    0xf9,
-    0x74,
-    0xa3,
-    0x24,
-    0xa6,
-    0x7e,
-    0x92,
-    0x73,
-    0xa6,
-    0xf9,
-    0xf1,
-    0x21,
-    0x76,
-    0x3b,
-    0x4f,
-    0xd5,
-    0x31,
-    0xc7,
-    0xb7,
-    0xbb,
-    0x61,
-    0xcc,
-    0x28,
-    0x2a,
-    0x14,
-    0xef,
-    0x44,
-    0x85,
-    0x33,
-    0x4a,
-    0x4c,
-    0x5f,
-    0x10,
-    0xb5,
-    0x4c,
-    0xe2,
-    0x3e,
-    0x44,
-    0x93,
-    0x71,
-    0xa5,
-    0x11,
-    0x66,
-    0x8c,
-    0xd5,
-    0x3b,
-    0xf6,
-    0xf4,
-    0x9b,
-    0x2e,
-    0x8f,
-    0x10,
-    0xd2,
-    0x25,
-    0x11,
-    0x90,
-    0x7c,
-    0xee,
-    0xa4,
-    0x50,
-    0x12,
-    0xed,
-    0xa8,
-    0x7f,
-    0x18,
-    0x64,
-    0xeb,
-    0x00,
-    0xf3,
-    0xf2,
-    0x1f,
-    0x10,
-    0xff,
-    0x59,
-    0x8b,
-    0x2a,
-    0xdd,
-    0x84,
-    0x00,
-    0x27,
-    0x0a,
-    0xc8,
-    0x0f,
-    0xaa,
-    0xb6,
-    0x6a,
-    0x79,
-    0xbb,
-    0xd3,
-    0x61,
-    0xe7,
-    0xb2,
-    0x6c,
-    0x5e,
-    0xdb,
-    0x57,
-    0x38,
-    0x0a,
-    0xe7,
-    0x47,
-    0x6f,
-    0x8e,
-    0x1d,
-    0x9a,
-    0xdc,
-    0x59,
-    0xc6,
-    0xc2,
-    0x34,
-    0x1d,
-    0x57,
-    0xb6,
-    0xa6,
-    0x1b,
-    0xa0,
-    0x51,
-    0xb3,
-    0xa1,
-    0x47,
-    0xf4,
-    0x40,
-    0xd1,
-    0x75,
-    0x73,
-    0xe9,
-    0xa3,
-    0xcf,
-    0x2f,
-    0x99,
-    0x2e,
-    0xa8,
-    0x7f,
-    0x57,
-    0x23,
-    0x74,
-    0x55,
-    0x63,
-    0x9a,
-    0x80,
-    0x1e,
-    0x82,
-    0x11,
-    0xe1,
-    0xe9,
-    0x96,
-    0xb1,
-    0xab,
-    0xcc,
-    0x71,
-    0xd4,
-    0x63,
-    0x83,
-    0xeb,
-    0xc5,
-    0xb6,
-    0x5b,
-    0x32,
-    0xc6,
-    0x6a,
-    0x4f,
-    0x62,
-    0x58,
-    0x96,
-    0x70,
-    0x56,
-    0xb6,
-    0x0e,
-    0x8a,
-    0xbd,
-    0xa3,
-    0x22,
-    0x04,
-    0x70,
-    0x65,
-    0x88,
-    0x08,
-    0x03,
-    0x12,
-    0x96,
-    0xe4,
-    0x99,
-    0x0a,
-    0xb4,
-    0xb0,
-    0xfd,
-    0xc5,
-    0x12,
-    0x31,
-    0xef,
-    0xcf,
-    0x96,
-    0xfe,
-    0xbc,
-    0x10,
-    0x19,
-    0xe1,
-    0x12,
-    0x51,
-    0xd2,
-    0x80,
-    0x11,
-    0xfc,
-    0x12,
-    0x3d,
-    0xa5,
-    0x23,
-    0x32,
-    0x5a,
-    0x14,
-    0xc4,
-    0xca,
-    0x61,
-    0xd3,
-    0x4c,
-    0x24,
-    0xc3,
-    0x9e,
-    0x59,
-    0xf1,
-    0xbf,
-    0xc7,
-    0xc4,
-    0x3a,
-    0x85,
-    0xcf,
-    0xdf,
-    0x99,
-    0x9c,
-    0x33,
-    0xfb,
-    0xa8,
-    0x81,
-    0x88,
-    0x2e,
-    0xba,
-    0x91,
-    0xca,
-    0x53,
-    0xc9,
-    0x28,
-    0xf2,
-    0x51,
-    0xb0,
-    0x0b,
-    0xc6,
-    0xa1,
-    0x9a,
-    0x03,
-    0xf5,
-    0x0a,
-    0xbb,
-    0xcb,
-    0x63,
-    0xaf,
-    0x3e,
-    0x2c,
-    0xc2,
-    0x4c,
-    0x7e,
-    0x67,
-    0x62,
-    0xbd,
-    0x78,
-    0xd3,
-    0x4a,
-    0xc0,
-    0x81,
-    0xc7,
-    0x87,
-    0xfb,
-    0x34,
-    0xba,
-    0xc4,
-    0x41,
-    0xaf,
-    0xa9,
-    0x1b,
-    0x11,
-    0xff,
-    0xba,
-    0x2b,
-    0x5f,
-    0xd8,
-    0x1e,
-    0x6b,
-    0x97,
-    0x89,
-    0x3b,
-    0xbd,
-    0xe0,
-    0x30,
-    0x0b,
-    0x47,
-    0x9e,
-    0x2a,
-    0xbf,
-    0x7e,
-    0x3a,
-    0xce,
-    0xa9,
-    0x83,
-    0x25,
-    0x5b,
-    0x58,
-    0xb3,
-    0x1a,
-    0x2e,
-    0x05,
-    0x7a,
-    0xa4,
-    0x39,
-    0x2e,
-    0x67,
-    0xe1,
-    0xb0,
-    0x80,
-    0x86,
-    0x85,
-    0x05,
-    0xfa,
-    0xea,
-    0x21,
-    0x17,
-    0x50,
-    0x89,
-    0xa6,
-    0xa7,
-    0x8d,
-    0x4d,
-    0x25,
-    0x0b,
-    0xfd,
-    0x67,
-    0xd8,
-    0x26,
-    0x4a,
-    0xe7,
-    0x66,
-    0x97,
-    0xe5,
-    0x89,
-    0x63,
-    0x31,
-    0xa7,
-    0xd2,
-    0x16,
-    0xab,
-    0xb9,
-    0x5c,
-    0x80,
-    0x99,
-    0xb1,
-    0x6f,
-    0x99,
-    0x9b,
-    0xfd,
-    0xd0,
-    0xdd,
-    0xd5,
-    0x85,
-    0xde,
-    0x07,
-    0x9f,
-    0x8c,
-    0xda,
-    0x1d,
-    0x7d,
-    0xd7,
-    0x87,
-    0xac,
-    0x51,
-    0x12,
-    0xf3,
-    0x55,
-    0xcf,
-    0x6f,
-    0x94,
-    0x88,
-    0x32,
-    0x90,
-    0x96,
-    0x90,
-    0x2d,
-    0xa7,
-    0x74,
-    0xd0,
-    0x25,
-    0xdc,
-    0xc6,
-    0x4c,
-    0x9d,
-    0xef,
-    0x5a,
-    0x6b,
-    0xf2,
-    0x1e,
-    0x85,
-    0xfb,
-    0x48,
-    0x49,
-    0xbb,
-    0x75,
-    0xc4,
-    0x54,
-    0x5e,
-    0x82,
-    0xfc,
-    0xcd,
-    0xd4,
-    0xbf,
-    0xab,
-    0xce,
-    0xdc,
-    0xbd,
-    0xaa,
-    0x25,
-    0x22,
-    0x4d,
-    0x1b,
-    0xb3,
-    0x11,
-    0xfa,
-    0xe7,
-    0x12,
-    0xe8,
-    0xd6,
-    0x6c,
-    0x7b,
-    0x10,
-    0x7a,
-    0x6f,
-    0xe6,
-    0xad,
-    0x48,
-    0x58,
-    0x72,
-    0x73,
-    0xf3,
-    0x9e,
-    0x08,
-    0xba,
-    0x42,
-    0x80,
-    0x3b,
-    0xd5,
-    0x10,
-    0xf6,
-    0x73,
-    0xa0,
-    0x98,
-    0xe7,
-    0x4b,
-    0x59,
-    0xef,
-    0x9c,
-    0x37,
-    0xb1,
-    0xd2,
-    0x75,
-    0x6a,
-    0x22,
-    0xa2,
-    0xda,
-    0xf7,
-    0x82,
-    0xad,
-    0x75,
-    0x36,
-    0xd9,
-    0xaf,
-    0x9e,
-    0x69,
-    0x70,
-    0x99,
-    0x17,
-    0x9f,
-    0x2a,
-    0x90,
-    0xfa,
-    0xd9,
-    0x17,
-    0x39,
-    0xef,
-    0x6c,
-    0x47,
-    0x34,
-    0xa2,
-    0xa6,
-    0xdc,
-    0xe6,
-    0x75,
-    0xb4,
-    0x63,
-    0x7c,
-    0x72,
-    0xc3,
-    0x65,
-    0x2c,
-    0x83,
-    0x66,
-    0x38,
-    0xbe,
-    0xe5,
-    0x38,
-    0x1b,
-    0x4c,
-    0xda,
-    0xc2,
-    0x83,
-    0x46,
-    0x9e,
-    0x9f,
-    0xaf,
-    0xb8,
-    0x9d,
-    0xdd,
-    0x82,
-    0xd0,
-    0xe3,
-    0xa7,
-    0x92,
-    0x9b,
-    0xd4,
-    0x21,
-    0x7d,
-    0x0f,
-    0x1d,
-    0x94,
-    0x7c,
-    0x4e,
-    0xea,
-    0xcb,
-    0x3a,
-    0x29,
-    0x5a,
-    0xbd,
-    0xe6,
-    0xe3,
-    0x2f,
-    0x6c,
-    0x86,
-    0x38,
-    0xcb,
-    0x0c,
-    0x8f,
-    0x9e,
-    0x58,
-    0x68,
-    0xb3,
-    0xcb,
-    0x46,
-    0x82,
-    0xfb,
-    0x77,
-    0xfa,
-    0x79,
-    0x15,
-    0x63,
-    0xc4,
-    0xb0,
-    0xef,
-    0x9a,
-    0x12,
-    0x2d,
-    0x85,
-    0xf7,
-    0xe4,
-    0x3f,
-    0xf7,
-    0xe7,
-    0x80,
-    0x64,
-    0xde,
-    0x70,
-    0x67,
-    0x69,
-    0xe0,
-    0x73,
-    0x87,
-    0xd3,
-    0x82,
-    0x2e,
-    0xb2,
-    0x7e,
-    0x3e,
-    0x04,
-    0x4f,
-    0x84,
-    0xd6,
-    0x81,
-    0x50,
-    0x60,
-    0xe7,
-    0x99,
-    0x64,
-    0x54,
-    0xc1,
-    0x30,
-    0x6d,
-    0x08,
-    0x76,
-    0xe0,
-    0x34,
-    0x73,
-    0x31,
-    0xf6,
-    0x5b,
-    0xfe,
-    0xc9,
-    0xbd,
-    0x94,
-    0xe7,
-    0x96,
-    0x00,
-    0x11,
-    0xe4,
-    0x84,
-    0xca,
-    0x3c,
-    0x0a,
-    0x65,
-    0x70,
-    0xa7,
-    0xec,
-    0x8c,
-    0xd1,
-    0x46,
-    0x07,
-    0x97,
-    0xdd,
-    0xdc,
-    0x5e,
-    0x8c,
-    0x54,
-    0xb3,
-    0x61,
-    0x28,
-    0xd0,
-    0x90,
-    0x13,
-    0x73,
-    0x06,
-    0xe6,
-    0x6c,
-    0x98,
-    0x49,
-    0x4a,
-    0xfc,
-    0xf4,
-    0x50,
-    0x27,
-    0xd2,
-    0x6d,
-    0x38,
-    0xb3,
-    0x9c,
-    0x05,
-    0xcc,
-    0x21,
-    0x10,
-    0xae,
-    0x05,
-    0x19,
-    0x8a,
-    0x61,
-    0xcd,
-    0x65,
-    0xf6,
-    0x6a,
-    0x08,
-    0xed,
-    0xf0,
-    0x06,
-    0xd5,
-    0xe5,
-    0x2a,
-    0x2f,
-    0x11,
-    0x45,
-    0x0e,
-    0xb7,
-    0x1e,
-    0x79,
-    0xa5,
-    0x94,
-    0xe2,
-    0x5a,
-    0xb8,
-    0x7b,
-    0x12,
-    0x5e,
-    0x35,
-    0xb0,
-    0xb0,
-    0x0b,
-    0xd3,
-    0x1c,
-    0xd2,
-    0xb2,
-    0xf9,
-    0xa0,
-    0xa6,
-    0x59,
-    0xdd,
-    0xa9,
-    0xb3,
-    0xf9,
-    0xe9,
-    0x04,
-    0x61,
-    0xea,
-    0x62,
-    0xf4,
-    0xbc,
-    0x9b,
-    0x4b,
-    0x82,
-    0x75,
-    0x86,
-    0x87,
-    0x15,
-    0x29,
-    0x63,
-    0x3f,
-    0x42,
-    0xe6,
-    0x9c,
-    0x83,
-    0xe5,
-    0xec,
-    0x02,
-    0x34,
-    0x71,
-    0xb0,
-    0xbe,
-    0x21,
-    0x84,
-    0x27,
-    0x8a,
-    0x70,
-    0xbf,
-    0x40,
-    0x21,
-    0x40,
-    0xd4,
-    0xb3,
-    0xf3,
-    0x8c,
-    0xe0,
-    0xf9,
-    0x1e,
-    0x52,
-    0xfc,
-    0x9b,
-    0x9a,
-    0xf5,
-    0x0e,
-    0xb0,
-    0xb3,
-    0xe1,
-    0xe6,
-    0xa1,
-    0xbd,
-    0x6d,
-    0x86,
-    0x30,
-    0x03,
-    0x05,
-    0xc0,
-    0xb9,
-    0x00,
-    0x88,
-    0x07,
-    0xb7,
-    0xd2,
-    0xef,
-    0x7f,
-    0x89,
-    0xeb,
-    0x30,
-    0x56,
-    0x77,
-    0x0a,
-    0x61,
-    0x57,
-    0xf0,
-    0x69,
-    0x21,
-    0xbc,
-    0x15,
-    0x38,
-    0x34,
-    0x44,
-    0x7c,
-    0x4b,
-    0x6d,
-    0x86,
-    0x2d,
-    0x10,
-    0xd1,
-    0x85,
-    0xf1,
-    0xc3,
-    0xf9,
-    0x84,
-    0xcd,
-    0xe5,
-    0xb8,
-    0x1c,
-    0xc9,
-    0xea,
-    0xfe,
-    0x8b,
-    0xf5,
-    0x32,
-    0xfc,
-    0x4f,
-    0xae,
-    0x3a,
-    0x89,
-    0xf4,
-    0x1e,
-    0x14,
-    0xc5,
-    0x2a,
-    0x02,
-    0x14,
-    0xfc,
-    0x1a,
-    0xb0,
-    0xcd,
-    0xcd
-  ],
-  const [
-    0xd2,
-    0x79,
-    0x94,
-    0x41,
-    0xab,
-    0xcc,
-    0x3b,
-    0xa3,
-    0xbd,
-    0x2a,
-    0xa7,
-    0x15,
-    0x89,
-    0x9e,
-    0xff,
-    0x2f,
-    0x18,
-    0xa1,
-    0x2c,
-    0x45,
-    0x3c,
-    0x48,
-    0x3e,
-    0x3a,
-    0x18,
-    0xbb,
-    0x0c,
-    0x99,
-    0xe2,
-    0xe9,
-    0x1b,
-    0xe1,
-    0xe8,
-    0x7a,
-    0xc2,
-    0x21,
-    0xd1,
-    0x05,
-    0x8b,
-    0xc5,
-    0x26,
-    0x84,
-    0xdb,
-    0xb0,
-    0x11,
-    0x05,
-    0xd6,
-    0x8b,
-    0x64,
-    0xa2,
-    0x7d,
-    0x5c,
-    0xdc,
-    0xb2,
-    0x19,
-    0x5a,
-    0xa8,
-    0x41,
-    0xdd,
-    0x00,
-    0x25,
-    0xbe,
-    0xc7,
-    0x60,
-    0xec,
-    0xf4,
-    0xc7,
-    0xba,
-    0x0e,
-    0x3c,
-    0x23,
-    0x4d,
-    0x9e,
-    0xf0,
-    0x1a,
-    0x6d,
-    0x70,
-    0x22,
-    0xc8,
-    0xd6,
-    0x21,
-    0x8e,
-    0x49,
-    0x40,
-    0x57,
-    0xce,
-    0x21,
-    0x33,
-    0x4a,
-    0xcd,
-    0xdb,
-    0x1d,
-    0x84,
-    0x7e,
-    0xf1,
-    0xa2,
-    0xe5,
-    0xce,
-    0xec,
-    0x33,
-    0xe9,
-    0xd7,
-    0xcc,
-    0xe2,
-    0x2e,
-    0x56,
-    0xaa,
-    0x74,
-    0x30,
-    0x5f,
-    0x9c,
-    0xb8,
-    0x57,
-    0x4f,
-    0xd9,
-    0x18,
-    0x35,
-    0x03,
-    0x1e,
-    0x6e,
-    0x08,
-    0x47,
-    0x50,
-    0x19,
-    0x87,
-    0x91,
-    0x62,
-    0x4f,
-    0xdb,
-    0xf0,
-    0x79,
-    0xb4,
-    0xeb,
-    0x3f,
-    0x4e,
-    0x2c,
-    0xdc,
-    0x9e,
-    0xd4,
-    0xee,
-    0xd8,
-    0x23,
-    0x1c,
-    0xdb,
-    0x0f,
-    0xcc,
-    0x75,
-    0x0d,
-    0xfc,
-    0xb8,
-    0xd7,
-    0xb2,
-    0xea,
-    0x97,
-    0x82,
-    0x1b,
-    0xb6,
-    0x60,
-    0xe2,
-    0x10,
-    0xd6,
-    0x42,
-    0xb6,
-    0x67,
-    0x9a,
-    0xdc,
-    0x71,
-    0xd5,
-    0xb2,
-    0xb0,
-    0xe0,
-    0x03,
-    0xf1,
-    0xd5,
-    0x0e,
-    0xe4,
-    0x51,
-    0xed,
-    0x65,
-    0x47,
-    0x36,
-    0x57,
-    0x15,
-    0xa8,
-    0xf7,
-    0xa6,
-    0xba,
-    0x4c,
-    0x9a,
-    0x51,
-    0x39,
-    0x8d,
-    0xdf,
-    0xab,
-    0xea,
-    0x72,
-    0x81,
-    0x16,
-    0xfd,
-    0x82,
-    0xb8,
-    0x74,
-    0x16,
-    0xda,
-    0x02,
-    0xdf,
-    0x3b,
-    0x7e,
-    0x23,
-    0x9a,
-    0xf0,
-    0xed,
-    0x6a,
-    0x47,
-    0xa0,
-    0xf8,
-    0x37,
-    0x5a,
-    0x3f,
-    0xd3,
-    0xba,
-    0xcd,
-    0x2e,
-    0x6d,
-    0xfd,
-    0x16,
-    0x5f,
-    0xfd,
-    0x25,
-    0x56,
-    0xb9,
-    0xdd,
-    0xf5,
-    0xd3,
-    0xbe,
-    0x9c,
-    0x93,
-    0xa8,
-    0x6b,
-    0x4f,
-    0x8f,
-    0xbb,
-    0x5f,
-    0x27,
-    0x21,
-    0xf0,
-    0x40,
-    0x49,
-    0xb2,
-    0x9c,
-    0x5b,
-    0xd9,
-    0x9e,
-    0x3d,
-    0x8a,
-    0x58,
-    0x39,
-    0x68,
-    0x5b,
-    0x31,
-    0x10,
-    0x02,
-    0x6e,
-    0x8e,
-    0x71,
-    0xb3,
-    0x1f,
-    0x70,
-    0x2d,
-    0x98,
-    0x65,
-    0xff,
-    0x9c,
-    0x38,
-    0xfa,
-    0x1f,
-    0xe2,
-    0xba,
-    0xbd,
-    0x43,
-    0x71,
-    0x55,
-    0x54,
-    0x86,
-    0xcf,
-    0x07,
-    0x15,
-    0xf8,
-    0x9a,
-    0x8a,
-    0x27,
-    0x35,
-    0xc9,
-    0x84,
-    0xe4,
-    0x3d,
-    0x34,
-    0xfe,
-    0x82,
-    0x7f,
-    0x57,
-    0x17,
-    0xf3,
-    0x37,
-    0x52,
-    0xf9,
-    0x09,
-    0xfa,
-    0x35,
-    0x0d,
-    0xde,
-    0x8f,
-    0x7b,
-    0x6b,
-    0x73,
-    0x01,
-    0xd4,
-    0x95,
-    0x97,
-    0xf2,
-    0x28,
-    0x64,
-    0x0b,
-    0x32,
-    0xd8,
-    0x42,
-    0xe3,
-    0x91,
-    0x47,
-    0x9a,
-    0x2f,
-    0xf1,
-    0x99,
-    0x8d,
-    0xdb,
-    0x9f,
-    0xba,
-    0xe7,
-    0xd4,
-    0xe3,
-    0xa2,
-    0x51,
-    0x6c,
-    0xd5,
-    0xd8,
-    0xc8,
-    0x00,
-    0x73,
-    0x35,
-    0x4d,
-    0xd8,
-    0xf1,
-    0xeb,
-    0xde,
-    0x4e,
-    0x50,
-    0xc6,
-    0xa6,
-    0x33,
-    0x32,
-    0xb1,
-    0x71,
-    0x6e,
-    0xed,
-    0x7b,
-    0x62,
-    0xe6,
-    0xde,
-    0xdb,
-    0xe8,
-    0xa3,
-    0x00,
-    0xb2,
-    0xee,
-    0x30,
-    0xbc,
-    0x91,
-    0x52,
-    0x43,
-    0x03,
-    0x7b,
-    0x99,
-    0x9f,
-    0x9b,
-    0xec,
-    0xe1,
-    0x3a,
-    0xb6,
-    0x19,
-    0x16,
-    0x9b,
-    0xc9,
-    0x7a,
-    0x69,
-    0x87,
-    0x9b,
-    0x86,
-    0xfe,
-    0xdc,
-    0x9d,
-    0xbe,
-    0xe5,
-    0xbd,
-    0x79,
-    0xec,
-    0x4c,
-    0xef,
-    0xed,
-    0xad,
-    0xf3,
-    0x83,
-    0xda,
-    0x2d,
-    0xe0,
-    0xb6,
-    0x98,
-    0x32,
-    0x53,
-    0x15,
-    0x8d,
-    0x5c,
-    0xfc,
-    0xe5,
-    0xfe,
-    0xab,
-    0x6c,
-    0xc1,
-    0x24,
-    0x41,
-    0xca,
-    0x85,
-    0x83,
-    0x69,
-    0xc7,
-    0x6b,
-    0x77,
-    0xd9,
-    0xd3,
-    0x74,
-    0x10,
-    0x34,
-    0x92,
-    0x0a,
-    0x1f,
-    0xd3,
-    0x89,
-    0xe3,
-    0x91,
-    0xc5,
-    0x1e,
-    0x28,
-    0xfc,
-    0x14,
-    0xbf,
-    0xd7,
-    0x78,
-    0x4a,
-    0x61,
-    0x66,
-    0xb0,
-    0x34,
-    0x2c,
-    0xa9,
-    0x39,
-    0xe6,
-    0x74,
-    0xf5,
-    0x22,
-    0xff,
-    0xec,
-    0x86,
-    0xcc,
-    0x2f,
-    0x16,
-    0x1e,
-    0xfb,
-    0xf6,
-    0xfe,
-    0xef,
-    0x2e,
-    0xae,
-    0x28,
-    0xbb,
-    0x2c,
-    0xcb,
-    0xc7,
-    0x3a,
-    0xe0,
-    0x62,
-    0x2f,
-    0xbc,
-    0x66,
-    0xe8,
-    0x8d,
-    0x0f,
-    0x66,
-    0x3d,
-    0xd6,
-    0xa3,
-    0xa1,
-    0xe8,
-    0xfd,
-    0xec,
-    0xc9,
-    0xa5,
-    0x69,
-    0x08,
-    0x96,
-    0x1d,
-    0xa6,
-    0xa2,
-    0x16,
-    0xf4,
-    0x5b,
-    0x16,
-    0x45,
-    0x08,
-    0x7c,
-    0xd5,
-    0xdd,
-    0xf8,
-    0xc0,
-    0x0c,
-    0x6f,
-    0xe4,
-    0x56,
-    0x80,
-    0xb3,
-    0x74,
-    0xd4,
-    0xbc,
-    0x1d,
-    0x1c,
-    0x70,
-    0x6f,
-    0xb0,
-    0x9e,
-    0x72,
-    0x10,
-    0x17,
-    0xd0,
-    0xe9,
-    0xc3,
-    0xf2,
-    0x9f,
-    0x9d,
-    0x80,
-    0x6e,
-    0x54,
-    0x46,
-    0x72,
-    0x18,
-    0x16,
-    0xfb,
-    0x9d,
-    0xf3,
-    0xb0,
-    0xed,
-    0xc4,
-    0xc7,
-    0x95,
-    0x55,
-    0x8a,
-    0xbd,
-    0x21,
-    0xab,
-    0xd7,
-    0x29,
-    0x22,
-    0x19,
-    0x7d,
-    0xa7,
-    0x97,
-    0x2f,
-    0x1c,
-    0x69,
-    0xb8,
-    0xd8,
-    0x43,
-    0xcf,
-    0x36,
-    0x8d,
-    0xd7,
-    0x38,
-    0xc3,
-    0xc8,
-    0xb9,
-    0x19,
-    0xd5,
-    0xbc,
-    0xa3,
-    0x4c,
-    0xa7,
-    0x43,
-    0x53,
-    0xaa,
-    0x81,
-    0x18,
-    0xec,
-    0xdb,
-    0x3a,
-    0x46,
-    0x99,
-    0x6d,
-    0xfb,
-    0xe0,
-    0x73,
-    0x24,
-    0x45,
-    0xf3,
-    0xa5,
-    0x91,
-    0x36,
-    0xb9,
-    0xcd,
-    0xe6,
-    0x08,
-    0x0f,
-    0xa6,
-    0x09,
-    0xda,
-    0x29,
-    0xe5,
-    0xe7,
-    0xb3,
-    0x85,
-    0x60,
-    0x0b,
-    0xc4,
-    0x1d,
-    0x75,
-    0x6f,
-    0xed,
-    0xe1,
-    0xaa,
-    0x92,
-    0x83,
-    0x64,
-    0x91,
-    0xca,
-    0x51,
-    0xd6,
-    0xef,
-    0xdc,
-    0xdc,
-    0x32,
-    0x1c,
-    0xca,
-    0xec,
-    0xb8,
-    0xad,
-    0xec,
-    0x47,
-    0x9e,
-    0x51,
-    0x42,
-    0xc0,
-    0x03,
-    0xf9,
-    0x09,
-    0x70,
-    0x24,
-    0x3c,
-    0x8c,
-    0x44,
-    0xd2,
-    0xf9,
-    0x3d,
-    0xb8,
-    0x24,
-    0x3e,
-    0x04,
-    0xe1,
-    0x69,
-    0x68,
-    0xd7,
-    0xb1,
-    0x60,
-    0x8c,
-    0x8b,
-    0x77,
-    0xac,
-    0x16,
-    0xea,
-    0xa5,
-    0x82,
-    0xb0,
-    0x05,
-    0xd6,
-    0xa5,
-    0x66,
-    0xcc,
-    0x0f,
-    0x94,
-    0x07,
-    0xdb,
-    0x45,
-    0x01,
-    0xce,
-    0x97,
-    0x20,
-    0x86,
-    0x41,
-    0x7a,
-    0xff,
-    0x94,
-    0x5a,
-    0xab,
-    0x3c,
-    0xac,
-    0xe5,
-    0xd2,
-    0xb1,
-    0xd1,
-    0x29,
-    0x2a,
-    0x7b,
-    0x3d,
-    0xca,
-    0xd8,
-    0xfd,
-    0x53,
-    0xee,
-    0x7b,
-    0x28,
-    0xd5,
-    0x9f,
-    0x04,
-    0xfa,
-    0x57,
-    0x71,
-    0xc8,
-    0x45,
-    0xf3,
-    0x64,
-    0xd3,
-    0xb2,
-    0x3f,
-    0x0b,
-    0x7f,
-    0x05,
-    0x7c,
-    0xee,
-    0x46,
-    0xa3,
-    0x10,
-    0x2e,
-    0xd5,
-    0x51,
-    0x37,
-    0x67,
-    0x61,
-    0x3e,
-    0xf5,
-    0xda,
-    0x3e,
-    0x44,
-    0x4f,
-    0xcc,
-    0xae,
-    0x6b,
-    0xba,
-    0x29,
-    0xf7,
-    0xaf,
-    0xd4,
-    0x6d,
-    0xb8,
-    0x03,
-    0x52,
-    0xc4,
-    0x7c,
-    0x95,
-    0x39,
-    0x70,
-    0x90,
-    0x54,
-    0x52,
-    0x6c,
-    0x12,
-    0xb0,
-    0xd7,
-    0x4f,
-    0x4b,
-    0xa0,
-    0x73,
-    0x72,
-    0x3f,
-    0xea,
-    0x6a,
-    0x55,
-    0x81,
-    0x9f,
-    0x13,
-    0x3f,
-    0x4c,
-    0xe4,
-    0x8f,
-    0x25,
-    0xd0,
-    0xf8,
-    0xb5,
-    0xcd,
-    0xca,
-    0x73,
-    0x4c,
-    0x34,
-    0x57,
-    0xcc,
-    0x7d,
-    0x2c,
-    0x0a,
-    0x1e,
-    0x87,
-    0x49,
-    0x3c,
-    0x2c,
-    0xb5,
-    0xfe,
-    0xa3,
-    0xa2,
-    0x8e,
-    0x04,
-    0x27,
-    0x9e,
-    0x4b,
-    0xfb,
-    0xf0,
-    0x6e,
-    0x8e,
-    0x54,
-    0xc4,
-    0x9c,
-    0x50,
-    0x6e,
-    0x90,
-    0x27,
-    0x1b,
-    0xff,
-    0x44,
-    0x14,
-    0x7a,
-    0xb6,
-    0xe4,
-    0x25,
-    0xaf,
-    0x1f,
-    0xdc,
-    0xe9,
-    0xa3,
-    0xc6,
-    0x95,
-    0xf5,
-    0x23,
-    0x9f,
-    0x45,
-    0x70,
-    0x48,
-    0xa5,
-    0x0b,
-    0xd5,
-    0x37,
-    0xc2,
-    0x3b,
-    0xf4,
-    0x0b,
-    0xef,
-    0xf7,
-    0x3a,
-    0x10,
-    0x9c,
-    0xff,
-    0x33,
-    0x32,
-    0x52,
-    0xc9,
-    0x4d,
-    0xb5,
-    0x97,
-    0xd5,
-    0xdf,
-    0x26,
-    0x12,
-    0x3b,
-    0x69,
-    0x91,
-    0xef,
-    0x86,
-    0x1e,
-    0xf4,
-    0x85,
-    0xc4,
-    0x9f,
-    0xf4,
-    0x36,
-    0xde,
-    0x0a,
-    0xcf,
-    0x97,
-    0x26,
-    0x33,
-    0x92,
-    0xd1,
-    0x2f,
-    0x31,
-    0x8c,
-    0x48,
-    0xe1,
-    0x1d,
-    0x02,
-    0x7a,
-    0xcc,
-    0x16,
-    0x24,
-    0x29,
-    0xbd,
-    0x88,
-    0x40,
-    0xbc,
-    0x8f,
-    0xae,
-    0x36,
-    0xe3,
-    0x44,
-    0x56,
-    0x2c,
-    0x7a,
-    0x55,
-    0xe5,
-    0x82,
-    0xb0,
-    0x45,
-    0x9a,
-    0x08,
-    0x68,
-    0x7c,
-    0x17,
-    0x6f,
-    0xdf,
-    0x53,
-    0x1d,
-    0xfe,
-    0x8f,
-    0x6c,
-    0x97,
-    0x86,
-    0x54,
-    0x44,
-    0xda,
-    0x98,
-    0xce,
-    0x0b,
-    0x2b,
-    0xf5,
-    0x06,
-    0xb3,
-    0x81,
-    0x46,
-    0x54,
-    0x47,
-    0x8d,
-    0x0e,
-    0x80,
-    0x7e,
-    0xf8,
-    0xdc,
-    0x27,
-    0x90,
-    0xec,
-    0xc5,
-    0x60,
-    0x48,
-    0xd5,
-    0x11,
-    0xa0,
-    0x5a,
-    0x69,
-    0x35,
-    0xdb,
-    0xf8,
-    0xe6,
-    0x02,
-    0xec,
-    0xa0,
-    0x9a,
-    0x1b,
-    0x37,
-    0x38,
-    0xa9,
-    0xac,
-    0x8d,
-    0x5c,
-    0x0b,
-    0x59,
-    0x50,
-    0xf7,
-    0xd4,
-    0x75,
-    0xd7,
-    0x10,
-    0xb8,
-    0x75,
-    0x13,
-    0xe7,
-    0xce,
-    0xa4,
-    0x73,
-    0x41,
-    0x94,
-    0x18,
-    0x06,
-    0x00,
-    0x34,
-    0xe4,
-    0xe0,
-    0xf6,
-    0x05,
-    0x8f,
-    0xbe,
-    0xfb,
-    0x55,
-    0xc5,
-    0xed,
-    0x3d,
-    0x66,
-    0x4d,
-    0x67,
-    0xd8,
-    0xb6,
-    0x3b,
-    0x40,
-    0xa7,
-    0x83,
-    0x67,
-    0x40,
-    0x59,
-    0x8f,
-    0x1d,
-    0xd2,
-    0xc7,
-    0x21,
-    0x16,
-    0x1c,
-    0x84,
-    0x4c,
-    0xa7,
-    0x70,
-    0xb6,
-    0x73,
-    0x39,
-    0xe3,
-    0x25,
-    0x0d,
-    0xf9,
-    0x3b,
-    0x92,
-    0xa6,
-    0xd1,
-    0x0f,
-    0x4a,
-    0x26,
-    0x96,
-    0x29,
-    0xfb,
-    0x56,
-    0x83,
-    0x2f,
-    0xc5,
-    0xa0,
-    0xe6,
-    0x83,
-    0x94,
-    0x17,
-    0x19,
-    0x67,
-    0xae,
-    0xb7,
-    0xb4,
-    0x65,
-    0x88,
-    0xed,
-    0x01,
-    0xee,
-    0xde,
-    0x5a,
-    0xb0,
-    0x41,
-    0x02,
-    0xd4,
-    0xcc,
-    0x8e,
-    0x75,
-    0xad,
-    0xee,
-    0x5b,
-    0xb4,
-    0x38,
-    0xb1,
-    0x28,
-    0x54,
-    0x8a,
-    0x65,
-    0x4e,
-    0x51,
-    0x7e,
-    0x08,
-    0x2d,
-    0xa4,
-    0xfc,
-    0x72,
-    0x86,
-    0x13,
-    0x7a,
-    0xcf,
-    0x26,
-    0x4d,
-    0xc2,
-    0x52,
-    0xc5,
-    0x36,
-    0xf6,
-    0x28,
-    0x2d,
-    0x80,
-    0xd2,
-    0xab,
-    0x9f,
-    0x7b,
-    0x32,
-    0xd9,
-    0x72,
-    0x2e,
-    0xd4,
-    0x04,
-    0xfd,
-    0xa6,
-    0x5e,
-    0xca,
-    0xb7,
-    0x8e,
-    0xa3,
-    0x48,
-    0x9d,
-    0x00,
-    0x22,
-    0x8b,
-    0xd4,
-    0x9b,
-    0xcf,
-    0x47,
-    0x90,
-    0xd6,
-    0x17,
-    0xcc,
-    0x34,
-    0x93,
-    0x1e,
-    0x35,
-    0xbb,
-    0xf8,
-    0x4b,
-    0xe3,
-    0x56,
-    0x7a,
-    0x06,
-    0x2a,
-    0x56,
-    0x3a,
-    0xc0,
-    0x49,
-    0x4d,
-    0x95,
-    0x34,
-    0xa0,
-    0x70,
-    0xf6,
-    0xed,
-    0x1d,
-    0x40,
-    0xef,
-    0x09,
-    0xf8,
-    0x6a,
-    0x89,
-    0x3c,
-    0xa0,
-    0xeb,
-    0xd8,
-    0x18,
-    0xf5,
-    0x77,
-    0xd2,
-    0x8b,
-    0xb7,
-    0x1c,
-    0x61,
-    0xa9,
-    0x3e,
-    0x23,
-    0xb6,
-    0xab,
-    0x6c,
-    0x37,
-    0xe1,
-    0x38,
-    0xe1,
-    0xc9,
-    0x9e,
-    0xe4,
-    0x6d,
-    0xb2,
-    0x72,
-    0xf7,
-    0xcb,
-    0x1a,
-    0xf7,
-    0x6f,
-    0x8c,
-    0x99,
-    0x74,
-    0x48,
-    0x51,
-    0x9d,
-    0xb1,
-    0xfa,
-    0x3d,
-    0x0c,
-    0x0a,
-    0x44,
-    0xaa,
-    0x2a,
-    0xc1,
-    0x28,
-    0x1b,
-    0xbc,
-    0x99,
-    0x37,
-    0x72,
-    0x6e,
-    0xa0,
-    0x0e,
-    0x64,
-    0x72,
-    0x4c,
-    0x21,
-    0x29,
-    0x6a,
-    0xc9,
-    0xb7,
-    0x78,
-    0x88,
-    0x92,
-    0x36,
-    0xb2,
-    0xf3,
-    0x3f,
-    0xa1,
-    0x5e,
-    0x6d,
-    0x9d,
-    0x5f,
-    0xd5,
-    0x34,
-    0x04,
-    0x3e,
-    0x3e,
-    0x25,
-    0xe5,
-    0xb7,
-    0xbd,
-    0x27,
-    0xa3,
-    0x74,
-    0xe8,
-    0xc7,
-    0xa4,
-    0x0f,
-    0x7b,
-    0x20,
-    0xa7,
-    0x1d,
-    0x4c,
-    0xfe,
-    0x58,
-    0x6b,
-    0x81,
-    0x43,
-    0x21,
-    0x87,
-    0x00,
-    0x89,
-    0x44,
-    0x82,
-    0x27,
-    0x08,
-    0x27,
-    0xf5,
-    0xbe,
-    0xba,
-    0xee,
-    0x42,
-    0x29,
-    0xbe,
-    0x4f,
-    0x1c,
-    0xe2,
-    0xfb,
-    0xa2,
-    0x4a,
-    0x27,
-    0x05,
-    0x38,
-    0xa7,
-    0xf0,
-    0x44,
-    0xee,
-    0x6e,
-    0x24,
-    0x53,
-    0x02,
-    0xb4,
-    0x0c,
-    0xa6,
-    0x25,
-    0x36,
-    0x08,
-    0x70,
-    0xd1,
-    0x55,
-    0x81,
-    0xc3,
-    0xdc,
-    0x5f,
-    0x1e,
-    0xf9,
-    0x4e,
-    0x10,
-    0x3b,
-    0x54,
-    0x70,
-    0x59,
-    0x97,
-    0xe1,
-    0x25,
-    0x5f,
-    0x4c,
-    0xa2,
-    0x7d,
-    0xc7,
-    0x05,
-    0xeb,
-    0x88,
-    0x31,
-    0x6b,
-    0x0d,
-    0x68,
-    0x02,
-    0xe0,
-    0x32,
-    0xaa,
-    0x67,
-    0x70,
-    0x88,
-    0xd7,
-    0x97,
-    0x04,
-    0xa2,
-    0x45,
-    0x58,
-    0xd9,
-    0x1b,
-    0x33,
-    0xc4,
-    0x31,
-    0x7c,
-    0x15,
-    0x4d,
-    0x49,
-    0x5f,
-    0x2d,
-    0xff,
-    0x8a,
-    0xd5,
-    0x5b,
-    0x05,
-    0x03,
-    0x06,
-    0x36,
-    0x6f,
-    0x17,
-    0x17,
-    0x5b,
-    0x32,
-    0x73,
-    0x51,
-    0x06,
-    0x70,
-    0x44,
-    0x7f,
-    0xdf,
-    0xfa,
-    0xa6,
-    0x97,
-    0x16,
-    0x14,
-    0x5f,
-    0x9d,
-    0xb1,
-    0x78,
-    0xcd,
-    0xc5,
-    0x25,
-    0x9d,
-    0x1d,
-    0xd8,
-    0x24,
-    0x38,
-    0xbe,
-    0xd8,
-    0xb7,
-    0x04,
-    0x15,
-    0xe7,
-    0x8c,
-    0xbe,
-    0x73,
-    0x65,
-    0x91,
-    0x74,
-    0x44,
-    0x59,
-    0xc2,
-    0x00,
-    0x89,
-    0x12,
-    0x3e,
-    0xd0,
-    0x88,
-    0x0e,
-    0xa1,
-    0xe8,
-    0xc1,
-    0x1a,
-    0x8e,
-    0x29,
-    0x25,
-    0xbb,
-    0x8b,
-    0xd3,
-    0x83,
-    0xcd,
-    0x12,
-    0x49,
-    0x43,
-    0x6a,
-    0xe4,
-    0x14,
-    0x56,
-    0x0d,
-    0xa1,
-    0x2b,
-    0x6d,
-    0xf7,
-    0x96,
-    0x71,
-    0x69,
-    0xd2,
-    0xd6,
-    0x80,
-    0x13,
-    0x95,
-    0x8c,
-    0xa5,
-    0x0e,
-    0xa7,
-    0x8f,
-    0x2b,
-    0x0a,
-    0x47,
-    0x37,
-    0xdd,
-    0x39,
-    0x2b,
-    0x70,
-    0xc6,
-    0x07,
-    0x67,
-    0x0c,
-    0x3b,
-    0x06,
-    0x91,
-    0x5e,
-    0x1c,
-    0x27,
-    0x23,
-    0x04,
-    0x56,
-    0x30,
-    0x20,
-    0x04,
-    0xac,
-    0x6a,
-    0xfb,
-    0x1b,
-    0xb8,
-    0x9a,
-    0xb4,
-    0x51,
-    0x2c,
-    0x33,
-    0x44,
-    0xd1,
-    0x5e,
-    0xca,
-    0x3b,
-    0xf8,
-    0x04,
-    0xca,
-    0xa8,
-    0xac,
-    0x3b,
-    0x69,
-    0x39,
-    0xef,
-    0xcf,
-    0xdb,
-    0xa3,
-    0xb3,
-    0xb6,
-    0xc5,
-    0x44,
-    0xf0,
-    0xdd,
-    0xf4,
-    0x07,
-    0xf5,
-    0x28,
-    0x4f,
-    0x89,
-    0xfc,
-    0xb4,
-    0x0a,
-    0x7a,
-    0x00,
-    0x5f,
-    0x1d,
-    0x45,
-    0xd3,
-    0x8a,
-    0xf5,
-    0xf3,
-    0x6b,
-    0x1d,
-    0x69,
-    0x4c,
-    0x7c,
-    0xcc,
-    0xef,
-    0x40,
-    0x4d,
-    0x99,
-    0x10,
-    0x86,
-    0xc4,
-    0x9a,
-    0x19,
-    0x83,
-    0xc2,
-    0xfd,
-    0x14,
-    0x6d,
-    0xb7,
-    0x49,
-    0xf6,
-    0xb0,
-    0x6d,
-    0xe6,
-    0x1a,
-    0x91,
-    0x28,
-    0xe0,
-    0xee,
-    0x11,
-    0xf1,
-    0xe8,
-    0xed,
-    0x14,
-    0x2f,
-    0x9c,
-    0xcd,
-    0xc2,
-    0x77,
-    0x08,
-    0xf9,
-    0x2e,
-    0xa5,
-    0x6c,
-    0x41,
-    0x35,
-    0x2c,
-    0x3f,
-    0xd0,
-    0xaa,
-    0xaa,
-    0x75,
-    0x5f,
-    0xb0,
-    0xc0,
-    0xfe,
-    0xa9,
-    0x66,
-    0x20,
-    0x8f,
-    0x1f,
-    0xca,
-    0xe7,
-    0xa4,
-    0xdc,
-    0xd7,
-    0x2e,
-    0xc6,
-    0xdb,
-    0xf1,
-    0xdb,
-    0x09,
-    0x68,
-    0x83,
-    0xbd,
-    0xda,
-    0xd4,
-    0xe7,
-    0xd9,
-    0xf7,
-    0x6d,
-    0x86,
-    0xfe,
-    0xbf,
-    0xad,
-    0x40,
-    0xa0,
-    0xac,
-    0xb2,
-    0x0e,
-    0xe3,
-    0x1e,
-    0xee,
-    0xe5,
-    0xf5,
-    0x5a,
-    0x20,
-    0xde,
-    0xa1,
-    0xd2,
-    0x83,
-    0x95,
-    0x21,
-    0xa7,
-    0x45,
-    0xce,
-    0x34,
-    0x6c,
-    0x3a,
-    0x5f,
-    0x71,
-    0x2d,
-    0xd2,
-    0x4a,
-    0xdb,
-    0xaf,
-    0x49,
-    0x29,
-    0xb5,
-    0xfa,
-    0x1d,
-    0xcf,
-    0x98,
-    0x15,
-    0xc5,
-    0x2c,
-    0xc2,
-    0x11,
-    0xa0,
-    0x71,
-    0xb1,
-    0x48,
-    0x2c,
-    0x75,
-    0xf1,
-    0xe7,
-    0x78,
-    0x57,
-    0x32,
-    0xaa,
-    0xdc,
-    0x66,
-    0x9d,
-    0xe7,
-    0xe7,
-    0x3d,
-    0x68,
-    0xce,
-    0x99,
-    0x32,
-    0xa8,
-    0xef,
-    0xd2,
-    0xf2,
-    0x67,
-    0xfd,
-    0x0b,
-    0x65,
-    0xf7,
-    0xd1,
-    0x44,
-    0xd8,
-    0x85,
-    0xb1,
-    0x3d,
-    0x5a,
-    0xf1,
-    0xd3,
-    0xe9,
-    0x66,
-    0xde,
-    0x1d,
-    0x20,
-    0xc3,
-    0x05,
-    0x2f,
-    0x94,
-    0xa9,
-    0xce,
-    0xa3,
-    0x06,
-    0x25,
-    0x21,
-    0x93,
-    0xba,
-    0xbe,
-    0x79,
-    0x5c,
-    0x28,
-    0x59,
-    0x3b,
-    0xa2,
-    0xf4,
-    0x5a,
-    0x47,
-    0x95,
-    0x20,
-    0x0c,
-    0xcc,
-    0x72,
-    0x81,
-    0x43,
-    0x60,
-    0x4c,
-    0x6f,
-    0x40,
-    0x50,
-    0x0c,
-    0xc1,
-    0xd4,
-    0x34,
-    0xb7,
-    0xf9,
-    0xc9,
-    0xc7,
-    0xef,
-    0xbb,
-    0x7d,
-    0xf6,
-    0xbd,
-    0x84,
-    0xd0,
-    0x37,
-    0x8d,
-    0x98,
-    0x40,
-    0x1c,
-    0x7a,
-    0x3c,
-    0x53,
-    0x28,
-    0xcc,
-    0x26,
-    0x36,
-    0xe1,
-    0xbf,
-    0x32,
-    0xa3,
-    0x26,
-    0x87,
-    0x56,
-    0x07,
-    0xc3,
-    0x90,
-    0xd8,
-    0xe5,
-    0x43,
-    0x0a,
-    0xbe,
-    0x75,
-    0x06,
-    0xa5,
-    0x87,
-    0x92,
-    0x93,
-    0x99,
-    0x18,
-    0xd3,
-    0x2e,
-    0xea,
-    0xf9,
-    0xf7,
-    0xae,
-    0xea,
-    0xc1,
-    0x86,
-    0x89,
-    0xff,
-    0xcf,
-    0xb5,
-    0x31,
-    0xa6,
-    0x3b,
-    0x8a,
-    0xa3,
-    0xb8,
-    0x0c,
-    0x42,
-    0x3c,
-    0xed,
-    0xac,
-    0xf0,
-    0xcf,
-    0x9e,
-    0x99,
-    0x66,
-    0xf6,
-    0xcf,
-    0x5c,
-    0x58,
-    0xa5,
-    0x6c,
-    0xbf,
-    0xbf,
-    0x05,
-    0xd3,
-    0x3b,
-    0x7c,
-    0x7f,
-    0x93,
-    0xb0,
-    0x3e,
-    0x16,
-    0x73,
-    0x59,
-    0xa5,
-    0xfb,
-    0xb7,
-    0xfe,
-    0xa8,
-    0x5b,
-    0x9e,
-    0x6b,
-    0x34,
-    0x7c,
-    0x2f,
-    0x22,
-    0x15,
-    0x08,
-    0x35,
-    0x4d,
-    0x1a,
-    0xa9,
-    0x89,
-    0xf6,
-    0x74,
-    0xd5,
-    0x8f,
-    0x7a,
-    0x60,
-    0xec,
-    0x03,
-    0x3b,
-    0x06,
-    0x80,
-    0xf6,
-    0x96,
-    0xa0,
-    0xf3,
-    0x13,
-    0x15,
-    0xde,
-    0x48,
-    0x27,
-    0xe5,
-    0x89,
-    0x33,
-    0xe1,
-    0x8a,
-    0x68,
-    0x72,
-    0xd6,
-    0xd1,
-    0x60,
-    0x60,
-    0xc7,
-    0x06,
-    0xde,
-    0xc8,
-    0x27,
-    0x68,
-    0x7a,
-    0xf7,
-    0xd8,
-    0xda,
-    0xd4,
-    0x15,
-    0x36,
-    0xdb,
-    0xc2,
-    0xb5,
-    0x56,
-    0xb8,
-    0xae,
-    0xaa,
-    0x8f,
-    0x00,
-    0x39,
-    0x1c,
-    0x3a,
-    0x39,
-    0x24,
-    0xdc,
-    0xb7,
-    0xd1,
-    0x71,
-    0xf5,
-    0xb1,
-    0x58,
-    0xc5,
-    0x84,
-    0xa2,
-    0xec,
-    0x11,
-    0xc9,
-    0x99,
-    0xf4,
-    0x71,
-    0x7d,
-    0x3b,
-    0x11,
-    0x55,
-    0x66,
-    0x07,
-    0x51,
-    0xde,
-    0x2a,
-    0xdf,
-    0xa6,
-    0x8b,
-    0x61,
-    0xc4,
-    0x97,
-    0x14,
-    0xed,
-    0xe2,
-    0x36,
-    0x96,
-    0x8e,
-    0xcc,
-    0x52,
-    0xf1,
-    0xb1,
-    0x08,
-    0xed,
-    0x6e,
-    0x89,
-    0xce,
-    0xf0,
-    0xa6,
-    0x61,
-    0x0d,
-    0x1e,
-    0x9f,
-    0x31,
-    0xaf,
-    0x47,
-    0x37,
-    0x6f,
-    0x1e,
-    0xbe,
-    0xc6,
-    0x27,
-    0x07,
-    0x0d,
-    0xff,
-    0x4e,
-    0x5e,
-    0xe6,
-    0x17,
-    0x54,
-    0xa2,
-    0x5d,
-    0x2a,
-    0xf8,
-    0x62,
-    0x55,
-    0xda,
-    0x60,
-    0x00,
-    0x38,
-    0x39,
-    0x69,
-    0xb5,
-    0xec,
-    0xe9,
-    0x3c,
-    0xd5,
-    0x02,
-    0x81,
-    0x22,
-    0x54,
-    0x30,
-    0x33,
-    0x99,
-    0x8a,
-    0x01,
-    0xac,
-    0xa7,
-    0x33,
-    0xcb,
-    0x3c,
-    0x6e,
-    0xba,
-    0xe2,
-    0x37,
-    0x01,
-    0xb7,
-    0x0b,
-    0x9b,
-    0x76,
-    0xb6,
-    0x33,
-    0xf2,
-    0x3c,
-    0x3a,
-    0x61,
-    0x7a,
-    0xaf,
-    0x01,
-    0xea,
-    0x84,
-    0xea,
-    0x8a,
-    0xe4,
-    0x1a,
-    0xdc,
-    0xd5,
-    0xdc,
-    0xe4,
-    0x9f,
-    0x6a,
-    0xcc,
-    0x4d,
-    0x04,
-    0x9c,
-    0x47,
-    0xe1,
-    0x73,
-    0x0f,
-    0xf7,
-    0xf9,
-    0xf2,
-    0x78,
-    0x49,
-    0x9b,
-    0x83,
-    0xa4,
-    0x67,
-    0x9c,
-    0xb3,
-    0xbc,
-    0x67,
-    0x07,
-    0x70,
-    0xc7,
-    0xc1,
-    0xc3,
-    0x1b,
-    0x70,
-    0x07,
-    0x6f,
-    0xde,
-    0x09,
-    0xd0,
-    0x91,
-    0x40,
-    0xd1,
-    0xf6,
-    0xf0,
-    0xf6,
-    0x72,
-    0x01,
-    0x3e,
-    0xfc,
-    0xce,
-    0xe2,
-    0xfa,
-    0xe5,
-    0xfb,
-    0xe5,
-    0x95,
-    0x70,
-    0x8c,
-    0xe1,
-    0xd4,
-    0x5b,
-    0x13,
-    0xb1,
-    0x75,
-    0x7c,
-    0xe4,
-    0xe8,
-    0x15,
-    0x0d,
-    0x1b,
-    0xc1,
-    0x51,
-    0x48,
-    0xe0,
-    0x55,
-    0x2c,
-    0x34,
-    0xe9,
-    0x11,
-    0xb0,
-    0xbe,
-    0x41,
-    0x66,
-    0xd9,
-    0x0b,
-    0x48,
-    0xc2,
-    0xae,
-    0x0d,
-    0xfc,
-    0xc0,
-    0xb1,
-    0x54,
-    0x76,
-    0x9c,
-    0x79,
-    0x27,
-    0xb7,
-    0xe9,
-    0x9e,
-    0xd4,
-    0xa5,
-    0x86,
-    0xd5,
-    0x44,
-    0x51,
-    0xce,
-    0x5c,
-    0xd2,
-    0x7b,
-    0x0f,
-    0x99,
-    0x5d,
-    0x58,
-    0x3d,
-    0xfe,
-    0x9c,
-    0x93,
-    0xe8,
-    0x2f,
-    0xb2,
-    0x91,
-    0x6c,
-    0x67,
-    0x03,
-    0xf9,
-    0x68,
-    0x18,
-    0x45,
-    0x74,
-    0x71,
-    0xd1,
-    0xda,
-    0xb1,
-    0x07,
-    0x65,
-    0x5d,
-    0xad,
-    0xc7,
-    0x4a,
-    0x7b,
-    0x31,
-    0xe3,
-    0x3f,
-    0x04,
-    0x9c,
-    0xd0,
-    0x31,
-    0x41,
-    0xe2,
-    0x3e,
-    0x60,
-    0x89,
-    0xd5,
-    0x4d,
-    0xbe,
-    0x0f,
-    0xa3,
-    0xfe,
-    0x97,
-    0xfe,
-    0xa0,
-    0xe7,
-    0x77,
-    0xc8,
-    0x46,
-    0x2c,
-    0x49,
-    0xba,
-    0x7a,
-    0xaa,
-    0xbc,
-    0xd5,
-    0x11,
-    0x75,
-    0xeb,
-    0xd9,
-    0x93,
-    0x85,
-    0x3c,
-    0xa2,
-    0x3f,
-    0xac,
-    0x88,
-    0xb7,
-    0x4f,
-    0xcb,
-    0x7d,
-    0x21,
-    0x7d,
-    0x46,
-    0x41,
-    0x79,
-    0xc5,
-    0xb5,
-    0x58,
-    0x45,
-    0x6d,
-    0xdd,
-    0xc8,
-    0x85,
-    0x43,
-    0xde,
-    0x7b,
-    0x88,
-    0x26,
-    0xad,
-    0xe4,
-    0x04,
-    0xc7,
-    0xc5,
-    0xe6,
-    0x66,
-    0xb1,
-    0x1a,
-    0xf1,
-    0x67,
-    0x87,
-    0x4f,
-    0x6e,
-    0xe0,
-    0x8d,
-    0x28,
-    0x5d,
-    0xdf,
-    0x6a,
-    0x42,
-    0x3c,
-    0xfa,
-    0x2d,
-    0x02,
-    0x2b,
-    0xe3,
-    0x8d,
-    0xcb,
-    0x4f,
-    0x3d,
-    0x75,
-    0x74,
-    0x74,
-    0xae,
-    0xc0,
-    0xf9,
-    0xf6,
-    0x36,
-    0x41,
-    0x70,
-    0xe1,
-    0xbf,
-    0x06,
-    0x3f,
-    0x57,
-    0xf5,
-    0xdd,
-    0x8d,
-    0x32,
-    0x57,
-    0x18,
-    0xf6,
-    0xeb,
-    0x8e,
-    0x8e,
-    0x83,
-    0xbb,
-    0xfe,
-    0xe2,
-    0xd9,
-    0xff,
-    0x9c,
-    0x08,
-    0xb0,
-    0xe1,
-    0xff,
-    0x04,
-    0x87,
-    0x35,
-    0xb9,
-    0xf5,
-    0x96,
-    0xa1,
-    0xe7,
-    0x53,
-    0x05,
-    0x01,
-    0x07,
-    0x75,
-    0x5b,
-    0x09,
-    0x0a,
-    0x56,
-    0x39,
-    0x2c,
-    0xaa,
-    0x98,
-    0x48,
-    0xbd,
-    0xfe,
-    0xc9,
-    0x70,
-    0x55,
-    0x4c,
-    0xe6,
-    0x4b,
-    0x74,
-    0x1e,
-    0x1d,
-    0xd9,
-    0x6b,
-    0x98,
-    0xd7,
-    0x75,
-    0x79,
-    0x08,
-    0xf6,
-    0x07,
-    0x34,
-    0xbf,
-    0x5b,
-    0x7c,
-    0x2a,
-    0x20,
-    0xac,
-    0x73,
-    0xc9,
-    0xf6,
-    0x54,
-    0x39,
-    0x7c,
-    0x0b,
-    0xcb,
-    0xf8,
-    0x17,
-    0xf6,
-    0x17,
-    0x2b,
-    0x75,
-    0x34,
-    0x93,
-    0x55,
-    0x5f,
-    0x7a,
-    0xef,
-    0xf3,
-    0xb0,
-    0x4a,
-    0x78,
-    0xaf,
-    0xb7,
-    0xc5,
-    0x99,
-    0xd6,
-    0xdd,
-    0xc0,
-    0xa2,
-    0x0c,
-    0x88,
-    0x19,
-    0xc9,
-    0x3f,
-    0x3f,
-    0x4b,
-    0x6f,
-    0xd9,
-    0x0e,
-    0x41,
-    0xa4,
-    0x3a,
-    0x2c,
-    0x68,
-    0xec,
-    0x65,
-    0xdb,
-    0x08,
-    0x43,
-    0xf9,
-    0x90,
-    0xd4,
-    0x60,
-    0x64,
-    0x54,
-    0xc0,
-    0x37,
-    0x53,
-    0x6a,
-    0x12,
-    0xc1,
-    0x6c,
-    0x32,
-    0xbc,
-    0xff,
-    0x40,
-    0x4d,
-    0xe9,
-    0x3d,
-    0x7b,
-    0x02,
-    0xd6,
-    0x94,
-    0x5e,
-    0xe0,
-    0xe3,
-    0xb2,
-    0x70,
-    0xa5,
-    0xea,
-    0xde,
-    0x70,
-    0x5f,
-    0xcf,
-    0x36,
-    0x8d,
-    0xd1,
-    0x58,
-    0x3b,
-    0xda,
-    0x18,
-    0x3f,
-    0x90,
-    0xfc,
-    0x8f,
-    0x86,
-    0xff,
-    0x25,
-    0xef,
-    0x0b,
-    0xbd,
-    0x47,
-    0xbb,
-    0x5c,
-    0xef,
-    0x81,
-    0xdb,
-    0xcc,
-    0x6c,
-    0xde,
-    0x86,
-    0xc7,
-    0xc5,
-    0x3e,
-    0x66,
-    0x62,
-    0x83,
-    0x94,
-    0xf7,
-    0x36,
-    0xaf,
-    0x52,
-    0x31,
-    0x6f,
-    0x98,
-    0x22,
-    0x66,
-    0x20,
-    0xd0,
-    0xd7,
-    0x6d,
-    0xda,
-    0x78,
-    0xa3,
-    0x00,
-    0x7c,
-    0xbd,
-    0x8a,
-    0x63,
-    0x4c,
-    0xa3,
-    0x16,
-    0x46,
-    0x47,
-    0x02,
-    0x4d,
-    0xed,
-    0xb6,
-    0xcd,
-    0xe0,
-    0x8e,
-    0x02,
-    0x9a,
-    0xa5,
-    0xfb,
-    0xc9,
-    0x5f,
-    0x47,
-    0x80,
-    0x31,
-    0x7a,
-    0x3d,
-    0x0f,
-    0x7d,
-    0xf5,
-    0xf8,
-    0x9a,
-    0xde,
-    0x07,
-    0x61,
-    0xc1,
-    0x8b,
-    0xde,
-    0x82,
-    0xad,
-    0x13,
-    0x9b,
-    0x83,
-    0x3c,
-    0xf2,
-    0x9f,
-    0xd9,
-    0x5e,
-    0x63,
-    0x05,
-    0xba,
-    0xbf,
-    0x76,
-    0x6f,
-    0xd4,
-    0xa6,
-    0x62,
-    0x06,
-    0x3e,
-    0x1d,
-    0x1c,
-    0xbc,
-    0xaf,
-    0x52,
-    0x29,
-    0xd5,
-    0xee,
-    0x3d,
-    0xb0,
-    0xa5,
-    0x89,
-    0x83,
-    0xd3,
-    0x9b,
-    0xca,
-    0x9a,
-    0x3f,
-    0x7e,
-    0xe7,
-    0x2e,
-    0x02,
-    0xf7,
-    0x79,
-    0xc4,
-    0x9e,
-    0x50,
-    0x2f,
-    0x9e,
-    0x5b,
-    0x7b,
-    0xc4,
-    0xde,
-    0xe1,
-    0x56,
-    0x2e,
-    0xee,
-    0x05,
-    0x2d,
-    0x19,
-    0x1e,
-    0xe4,
-    0x80,
-    0x93,
-    0x8f,
-    0x2e,
-    0x07,
-    0x09,
-    0x51,
-    0xc5,
-    0xf4,
-    0x72,
-    0xc8,
-    0x87,
-    0x78,
-    0xca,
-    0x54,
-    0x67,
-    0x88,
-    0xc2,
-    0x30,
-    0xc3,
-    0xe1,
-    0xb6,
-    0x9b,
-    0xf2,
-    0x4a,
-    0xdf,
-    0x36,
-    0x1c,
-    0x19,
-    0xca,
-    0xae,
-    0x4e,
-    0xf8,
-    0x08,
-    0x9a,
-    0xcd,
-    0xe9,
-    0x28,
-    0xa7,
-    0xab,
-    0x88,
-    0xe2,
-    0xf2,
-    0x99,
-    0x90,
-    0x95,
-    0xb5,
-    0xfc,
-    0xa1,
-    0xf4,
-    0x26,
-    0x43,
-    0x41,
-    0xfb,
-    0x9c,
-    0x77,
-    0x20,
-    0x29,
-    0xf4,
-    0x13,
-    0xa0,
-    0xe9,
-    0x33,
-    0x17,
-    0x94,
-    0x51,
-    0x6c,
-    0x58,
-    0x48,
-    0x0e,
-    0xe5,
-    0x1a,
-    0xc3,
-    0x9f,
-    0x75,
-    0xe0,
-    0x48,
-    0xc2,
-    0x30,
-    0x83,
-    0x23,
-    0x2c,
-    0x47,
-    0x82,
-    0xa2,
-    0x7d,
-    0x29,
-    0x99,
-    0x61,
-    0x73,
-    0xee,
-    0x95,
-    0xca,
-    0x5e,
-    0xf6,
-    0x66,
-    0xdd,
-    0xd4,
-    0xcd,
-    0x76,
-    0x2d,
-    0xa5,
-    0x52,
-    0x39,
-    0x2b,
-    0x11,
-    0x19,
-    0x06,
-    0xa7,
-    0x39,
-    0x0d,
-    0x25,
-    0x94,
-    0xd4,
-    0x5a,
-    0x29,
-    0x0c,
-    0x23,
-    0x8a,
-    0x7f,
-    0x94,
-    0x27,
-    0xed,
-    0x48,
-    0xa0,
-    0x11,
-    0x3f,
-    0x64,
-    0x5a,
-    0xfa,
-    0x85,
-    0xcf,
-    0x9f,
-    0xd4,
-    0x38,
-    0x31,
-    0x4a,
-    0xa1,
-    0xa5,
-    0xb0,
-    0xb6,
-    0xe3,
-    0x94,
-    0x09,
-    0x7e,
-    0x53,
-    0x28,
-    0xdf,
-    0x87,
-    0xd5,
-    0x06,
-    0x53,
-    0x41,
-    0xac,
-    0xb9,
-    0xd4,
-    0x29,
-    0xea,
-    0x56,
-    0x38,
-    0x93,
-    0x2b,
-    0x5b,
-    0x0c,
-    0xa6,
-    0x83,
-    0xdd,
-    0x29,
-    0xa8,
-    0xb5,
-    0xe3,
-    0x88,
-    0x7c,
-    0xa6,
-    0x0d,
-    0x58,
-    0x68,
-    0x11,
-    0x79,
-    0x4d,
-    0x1c,
-    0x7b,
-    0xe6,
-    0x3a,
-    0xf0,
-    0x6a,
-    0x1a,
-    0xe2,
-    0x6e,
-    0xd2,
-    0x82,
-    0x0c,
-    0x10,
-    0xd0,
-    0x19,
-    0xd5,
-    0x4a,
-    0x9a,
-    0x8a,
-    0x4a,
-    0xcb,
-    0xb7,
-    0x99,
-    0x36,
-    0x01,
-    0x6b,
-    0xbf,
-    0x39,
-    0xdb,
-    0x76,
-    0x14,
-    0x1a,
-    0xd2,
-    0xfe,
-    0x73,
-    0x5e,
-    0x2a,
-    0xc9,
-    0xd8,
-    0x1a,
-    0x75,
-    0xaf,
-    0x0c,
-    0x05,
-    0x5a,
-    0x4f,
-    0x85,
-    0xd1,
-    0x94,
-    0x02,
-    0x87,
-    0xbc,
-    0x3d,
-    0x0d,
-    0x90,
-    0x62,
-    0x4d,
-    0x1b,
-    0xf3,
-    0xd5,
-    0x5e,
-    0xea,
-    0xc3,
-    0xef,
-    0xb2,
-    0x44,
-    0xf2,
-    0xe7,
-    0x76,
-    0x31,
-    0xba,
-    0x23,
-    0x48,
-    0x6b,
-    0x3c,
-    0x4d,
-    0xf8,
-    0x12,
-    0x68,
-    0xa9,
-    0x8b,
-    0xa1,
-    0x1c,
-    0xa6,
-    0x86,
-    0x21,
-    0x90,
-    0xb3,
-    0x69,
-    0x9c,
-    0xf1,
-    0x53,
-    0x79,
-    0xd5,
-    0x4c,
-    0x74,
-    0xc2,
-    0x36,
-    0xae,
-    0xfd,
-    0x5d,
-    0x0a,
-    0x8a,
-    0xa6,
-    0xef,
-    0xec,
-    0x5a,
-    0x0c,
-    0x72,
-    0x7f,
-    0x89,
-    0x05,
-    0x38,
-    0x60,
-    0x91,
-    0x30,
-    0x2c,
-    0x59,
-    0x61,
-    0xd1,
-    0x5c,
-    0xd8,
-    0x01,
-    0xdc,
-    0xb4,
-    0x9f,
-    0x78,
-    0x50,
-    0x0c,
-    0xbc,
-    0xee,
-    0xc6,
-    0x66,
-    0xbc,
-    0x0e,
-    0x4a,
-    0x70,
-    0x1c,
-    0xae,
-    0x69,
-    0x51,
-    0x00,
-    0xb2,
-    0x8b,
-    0xa1,
-    0x27,
-    0x2d,
-    0x84,
-    0xb9,
-    0x1f,
-    0xca,
-    0x65,
-    0x2e,
-    0xb5,
-    0x6b,
-    0x98,
-    0x98,
-    0xb0,
-    0x0f,
-    0x2c,
-    0x98,
-    0xbf,
-    0xf9,
-    0x6d,
-    0x19,
-    0xaf,
-    0x0f,
-    0xb8,
-    0xd5,
-    0xe1,
-    0x80,
-    0x8d,
-    0x1b,
-    0xfc,
-    0xa9,
-    0xe6,
-    0xd0,
-    0xdf,
-    0x3a,
-    0xc7,
-    0xb5,
-    0xda,
-    0x94,
-    0x17,
-    0xe7,
-    0x1d,
-    0x76,
-    0xae,
-    0xac,
-    0x70,
-    0xd9,
-    0xaf,
-    0x6c,
-    0x25,
-    0x18,
-    0x18,
-    0xfe,
-    0x4b,
-    0x54,
-    0x97,
-    0x26,
-    0x25,
-    0x17,
-    0xa0,
-    0x5b,
-    0xdb,
-    0x37,
-    0xbc,
-    0xcd,
-    0x6e,
-    0xfe,
-    0x24,
-    0xa6,
-    0xf1,
-    0x87,
-    0x8e,
-    0x90,
-    0xf7,
-    0x6b,
-    0x47,
-    0x78,
-    0x48,
-    0x9e,
-    0x82,
-    0x92,
-    0xd8,
-    0x93,
-    0xf0,
-    0x9e,
-    0xf9,
-    0xa7,
-    0x90,
-    0x69,
-    0xcf,
-    0xbc,
-    0xc9,
-    0x96,
-    0x04,
-    0x24,
-    0xb6,
-    0x9e,
-    0xbe,
-    0xc2,
-    0xc1,
-    0x16,
-    0xce,
-    0x6b,
-    0x73,
-    0x31,
-    0x2b,
-    0x92,
-    0x8a,
-    0x85,
-    0x9e,
-    0x25,
-    0x4c,
-    0x12,
-    0xbe,
-    0xb2,
-    0x1c,
-    0x80,
-    0x1f,
-    0xce,
-    0x4b,
-    0xa8,
-    0xc7,
-    0xb7,
-    0x30,
-    0x56,
-    0xe1,
-    0x38,
-    0x7b,
-    0x4d,
-    0xb6,
-    0xcd,
-    0xc6,
-    0x8c,
-    0xd8,
-    0x08,
-    0x6d,
-    0xd0,
-    0xa0,
-    0x33,
-    0xa0,
-    0x5a,
-    0xdb,
-    0x37,
-    0xb6,
-    0xf2,
-    0xc1,
-    0xbd,
-    0xc4,
-    0x2c,
-    0x27,
-    0x92,
-    0x6f,
-    0xea,
-    0xf5,
-    0x50,
-    0xfe,
-    0x22,
-    0xd9,
-    0x3b,
-    0xb4,
-    0xe2,
-    0x3d,
-    0x69,
-    0x5c,
-    0x91,
-    0x77,
-    0x26,
-    0x25,
-    0x77,
-    0x40,
-    0x96,
-    0xb0,
-    0x80,
-    0x68,
-    0x9c,
-    0x68,
-    0x3c,
-    0xc8,
-    0xfb,
-    0x12,
-    0x2b,
-    0x77,
-    0xbb,
-    0xa4,
-    0x38,
-    0x41,
-    0xcf,
-    0x5b,
-    0x83,
-    0x54,
-    0xf4,
-    0x08,
-    0x63,
-    0x3d,
-    0xdc,
-    0xab,
-    0xac,
-    0x13,
-    0x8c,
-    0x42,
-    0x2d,
-    0xf2,
-    0x03,
-    0xe3,
-    0x7d,
-    0xab,
-    0x1c,
-    0x09,
-    0xf8,
-    0xba,
-    0xb5,
-    0x2c,
-    0x04,
-    0x79,
-    0x11,
-    0x94,
-    0x99,
-    0x93,
-    0x7b,
-    0x6e,
-    0x00,
-    0xba,
-    0x2c,
-    0x20,
-    0xda,
-    0x9d,
-    0x6f,
-    0xda,
-    0x65,
-    0x14,
-    0x03,
-    0x6d,
-    0xfb,
-    0x9e,
-    0xc1,
-    0x61,
-    0xdb,
-    0x0e,
-    0x7e,
-    0x41,
-    0x2c,
-    0x81,
-    0x33,
-    0x3a,
-    0x3f,
-    0x93,
-    0x5c,
-    0xe5,
-    0x15,
-    0xd3,
-    0x9d,
-    0x60,
-    0x21,
-    0x74,
-    0xab,
-    0xa3,
-    0x4e,
-    0x45,
-    0x6a,
-    0x11,
-    0x44,
-    0xe3,
-    0x53,
-    0x4e,
-    0xe7,
-    0x2c,
-    0x19,
-    0x51,
-    0x21,
-    0xf8,
-    0x8c,
-    0xba,
-    0xe2,
-    0x04,
-    0xbd,
-    0x65,
-    0x65,
-    0x2f,
-    0x63,
-    0x3f,
-    0xb4,
-    0xe9,
-    0x7d,
-    0x58,
-    0x6e,
-    0xe8,
-    0x39,
-    0x3a,
-    0xc8,
-    0x1c,
-    0x15,
-    0x7a,
-    0xd2,
-    0xe6,
-    0x44,
-    0x8c,
-    0xfc,
-    0x85,
-    0x53,
-    0xdb,
-    0xd8,
-    0xd1,
-    0x0c,
-    0x19,
-    0x21,
-    0x2b,
-    0x9b,
-    0xd4,
-    0xfd,
-    0xb4,
-    0xef,
-    0x4b,
-    0x7f,
-    0xbd,
-    0x63,
-    0x7f,
-    0x70,
-    0x7f,
-    0x9e,
-    0x8d,
-    0x4f,
-    0x0c,
-    0xb7,
-    0x3a,
-    0x96,
-    0x86,
-    0x9d,
-    0xd0,
-    0x3f,
-    0x8f,
-    0xb7,
-    0x29,
-    0x87,
-    0x00,
-    0xc7,
-    0x09,
-    0xf2,
-    0xde,
-    0x14,
-    0xb1,
-    0x8f,
-    0x8a,
-    0xc8,
-    0xb0,
-    0x7d,
-    0x37,
-    0x97,
-    0xfd,
-    0xae,
-    0xa1,
-    0xa1,
-    0x43,
-    0xeb,
-    0xfd,
-    0x9a,
-    0x7c,
-    0x18,
-    0x2b,
-    0x28,
-    0xc1,
-    0xba,
-    0x33,
-    0x8c,
-    0x60,
-    0xb6,
-    0xef,
-    0x85,
-    0x30,
-    0x5b,
-    0x05,
-    0x71,
-    0x21,
-    0xa3,
-    0x19,
-    0xb6,
-    0x17,
-    0xb6,
-    0x40,
-    0x60,
-    0xf9,
-    0xb0,
-    0xb7,
-    0x0c,
-    0x04,
-    0xa4,
-    0xd5,
-    0x04,
-    0x66,
-    0xe1,
-    0x3e,
-    0xab,
-    0x08,
-    0x74,
-    0x5a,
-    0x1c,
-    0xab,
-    0xee,
-    0x05,
-    0x0e,
-    0x36,
-    0x67,
-    0x88,
-    0xfb,
-    0x4e,
-    0xc2,
-    0xc8,
-    0x81,
-    0x28,
-    0x33,
-    0xbe,
-    0x08,
-    0x9b,
-    0xff,
-    0x27,
-    0xa5,
-    0x7a,
-    0x83,
-    0x7d,
-    0x3e,
-    0x20,
-    0x78,
-    0x25,
-    0xef,
-    0x4c,
-    0x75,
-    0xea,
-    0xad,
-    0x30,
-    0xb5,
-    0xaa,
-    0x29,
-    0xc4,
-    0x1b,
-    0x4f,
-    0xf7,
-    0x60,
-    0x73,
-    0x01,
-    0xf0,
-    0x8a,
-    0xfb,
-    0x9b,
-    0xd5,
-    0x0d,
-    0x22,
-    0x5b,
-    0x35,
-    0x4b,
-    0x8f,
-    0xdd,
-    0x90,
-    0xd3,
-    0x65,
-    0x4a,
-    0xbc,
-    0x36,
-    0xc6,
-    0xcd,
-    0x88,
-    0x17,
-    0x96,
-    0x46,
-    0xa0,
-    0x82,
-    0x81,
-    0x43,
-    0xb0,
-    0x7f,
-    0x3f,
-    0x2c,
-    0xcc,
-    0xe6,
-    0x16,
-    0xbd,
-    0x10,
-    0x74,
-    0xa1,
-    0xb9,
-    0x83,
-    0x1f,
-    0xd1,
-    0xdd,
-    0x41,
-    0xa7,
-    0x31,
-    0x13,
-    0xda,
-    0x6e,
-    0x6e,
-    0xe9,
-    0xf5,
-    0x89,
-    0x16,
-    0x41,
-    0x39,
-    0x17,
-    0xa0,
-    0x4a,
-    0x6d,
-    0xd1,
-    0xad,
-    0xaf,
-    0xdd,
-    0xe3,
-    0x8d,
-    0x0e,
-    0x00,
-    0xfb,
-    0x05,
-    0xab,
-    0x59,
-    0x9f,
-    0x4f,
-    0x66,
-    0x9b,
-    0xc3,
-    0x63,
-    0xea,
-    0x10,
-    0x9b,
-    0x75,
-    0x28,
-    0x3b,
-    0xae,
-    0xbf,
-    0x04,
-    0xbd,
-    0x2c,
-    0x80,
-    0x4d,
-    0x75,
-    0x81,
-    0x45,
-    0xf3,
-    0xeb,
-    0x2a,
-    0x67,
-    0x74,
-    0xef,
-    0xc7,
-    0xd5,
-    0x98,
-    0x7d,
-    0x72,
-    0x13,
-    0x5e,
-    0xe4,
-    0x50,
-    0x83,
-    0x36,
-    0x27,
-    0x65,
-    0xe4,
-    0x70,
-    0xa4,
-    0xad,
-    0x18,
-    0xf5,
-    0xf3,
-    0x68,
-    0x2a,
-    0x35,
-    0x11,
-    0xb5,
-    0x8f,
-    0x60,
-    0xbe,
-    0x62,
-    0xac,
-    0xd9,
-    0x23,
-    0x03,
-    0x99,
-    0xe8,
-    0xb8,
-    0x41,
-    0x25,
-    0xaf,
-    0x65,
-    0x75,
-    0x1a,
-    0x5f,
-    0xe8,
-    0x76,
-    0xc2,
-    0xab,
-    0x76,
-    0xae,
-    0xa9,
-    0x7d,
-    0xa5,
-    0x74,
-    0xa5,
-    0xe8,
-    0x89,
-    0x96,
-    0x14,
-    0x5f,
-    0x1d,
-    0x34,
-    0x65,
-    0x24,
-    0xe5,
-    0xd5,
-    0xda,
-    0x02,
-    0xd2,
-    0xb4,
-    0x8b,
-    0x3f,
-    0x66,
-    0x5b,
-    0xaf,
-    0xcd,
-    0x18,
-    0x73,
-    0x17,
-    0xc0,
-    0xfa,
-    0xdb,
-    0xfb,
-    0x05,
-    0x99,
-    0xf7,
-    0xf9,
-    0x50,
-    0x25,
-    0x4b,
-    0x5b,
-    0x56,
-    0xd2,
-    0x48,
-    0x99,
-    0x3d,
-    0x7d,
-    0x65,
-    0x1e,
-    0x50,
-    0x93,
-    0x72,
-    0x4f,
-    0xf8,
-    0x2f,
-    0x29,
-    0xca,
-    0xe7,
-    0x82,
-    0x07,
-    0xeb,
-    0x97,
-    0x78,
-    0x5a,
-    0x95,
-    0xf3,
-    0x98,
-    0x9a,
-    0x2f,
-    0x54,
-    0x2d,
-    0xfc,
-    0xec,
-    0xae,
-    0xa3,
-    0x45,
-    0x50,
-    0x0c,
-    0x33,
-    0xdc,
-    0xf0,
-    0x39,
-    0xc3,
-    0x24,
-    0x79,
-    0xc0,
-    0x07,
-    0x08,
-    0xf3,
-    0x17,
-    0xed,
-    0xd8,
-    0x47,
-    0x18,
-    0x38,
-    0x53,
-    0xff,
-    0xb0,
-    0x6a,
-    0x05,
-    0x4e,
-    0xdb,
-    0xe8,
-    0xd3,
-    0x50,
-    0xd0,
-    0x59,
-    0xd4,
-    0x92,
-    0x78,
-    0x4f,
-    0x62,
-    0xd5,
-    0x25,
-    0x29,
-    0x71,
-    0x0f,
-    0x81,
-    0x38,
-    0x20,
-    0xb3,
-    0xc5,
-    0x20,
-    0x8e,
-    0x32,
-    0x2b,
-    0x81,
-    0xef,
-    0xc2,
-    0xa5,
-    0xd7,
-    0xdf,
-    0x5e,
-    0xcf,
-    0x9f,
-    0xf5,
-    0x0e,
-    0x22,
-    0xbc,
-    0x9c,
-    0x68,
-    0x6b,
-    0x18,
-    0x1e,
-    0x57,
-    0x7c,
-    0x8e,
-    0x02,
-    0x1b,
-    0x22,
-    0x08,
-    0x98,
-    0x91,
-    0x57,
-    0xe4,
-    0xd2,
-    0xb5,
-    0xb8,
-    0x9d,
-    0x55,
-    0x65,
-    0x39,
-    0xa7,
-    0xd0,
-    0x68,
-    0x17,
-    0x9a,
-    0x8d,
-    0xae,
-    0x0e,
-    0x93,
-    0x46,
-    0xd9,
-    0xcd,
-    0xd7,
-    0x39,
-    0xfd,
-    0xa7,
-    0xba,
-    0x7e,
-    0xa4,
-    0x8b,
-    0xc0,
-    0x99,
-    0x16,
-    0x36,
-    0x01,
-    0x4c,
-    0xd7,
-    0xa7,
-    0xd2,
-    0xaf,
-    0x70,
-    0xd3,
-    0xa1,
-    0x82,
-    0x72,
-    0x9b,
-    0x21,
-    0xc1,
-    0xb9,
-    0xfb,
-    0xa8,
-    0x79,
-    0xee,
-    0x84,
-    0xd5,
-    0xdb,
-    0x4f,
-    0x0c,
-    0x75,
-    0x8e,
-    0xb3,
-    0xa4,
-    0xa7,
-    0x4a,
-    0xc8,
-    0xca,
-    0x3f,
-    0xa3,
-    0xa0,
-    0xe0,
-    0x69,
-    0x22,
-    0x6c,
-    0xdd,
-    0x8f,
-    0x9a,
-    0x87,
-    0x43,
-    0x7c,
-    0xb9,
-    0xb6,
-    0x51,
-    0xc1,
-    0xde,
-    0xae,
-    0x79,
-    0x57,
-    0x2a,
-    0xd6,
-    0x14,
-    0x87,
-    0xda,
-    0x4f,
-    0x55,
-    0x07,
-    0xd4,
-    0x32,
-    0x7b,
-    0x66,
-    0x7f,
-    0x18,
-    0x4b,
-    0xa9,
-    0xd8,
-    0xe0,
-    0xbe,
-    0x37,
-    0xc3,
-    0xac,
-    0xf7,
-    0xf2,
-    0x9e,
-    0x2d,
-    0x77,
-    0xa7,
-    0x1c,
-    0x21,
-    0x94,
-    0xa8,
-    0x51,
-    0x19,
-    0x27,
-    0xb7,
-    0x09,
-    0x80,
-    0x86,
-    0x26,
-    0x5e,
-    0xd9,
-    0xb2,
-    0x3d,
-    0x8a,
-    0x48,
-    0xd1,
-    0xdc,
-    0xf9,
-    0x54,
-    0xde,
-    0x61,
-    0xa3,
-    0xeb,
-    0x9f,
-    0xcc,
-    0x98,
-    0xa6,
-    0xd7,
-    0x22,
-    0xdc,
-    0x4f,
-    0xbe,
-    0x0f,
-    0x76,
-    0xa1,
-    0xae,
-    0xce,
-    0xc4,
-    0x4e,
-    0x1f,
-    0x4e,
-    0x11,
-    0x47,
-    0xd5,
-    0x8d,
-    0x69,
-    0x37,
-    0x58,
-    0x48,
-    0xac,
-    0x50,
-    0xa5,
-    0xd7,
-    0xe2,
-    0x4b,
-    0x23,
-    0x53,
-    0xce,
-    0xaa,
-    0xd8,
-    0xf9,
-    0xc6,
-    0x41,
-    0xdd,
-    0xd3,
-    0xc2,
-    0xf4,
-    0x0f,
-    0x95,
-    0xb2,
-    0xc2,
-    0x08,
-    0xc5,
-    0x15,
-    0x03,
-    0x4e,
-    0x1e,
-    0xc7,
-    0xed,
-    0xc9,
-    0x37,
-    0x1a,
-    0x5d,
-    0x7b,
-    0x60,
-    0x29,
-    0xd5,
-    0x6b,
-    0xcc,
-    0x69,
-    0xc0,
-    0xe2,
-    0xf6,
-    0x81,
-    0xfe,
-    0xda,
-    0x3d,
-    0x5c,
-    0x9c,
-    0xb4,
-    0xd1,
-    0x7c,
-    0xe3,
-    0x29,
-    0xd3,
-    0x91,
-    0x95,
-    0x83,
-    0xb8,
-    0x4a,
-    0x73,
-    0x0d,
-    0xef,
-    0x6b,
-    0x02,
-    0xc8,
-    0xc3,
-    0x20,
-    0x8f,
-    0x5f,
-    0x82,
-    0x90,
-    0x71,
-    0x5d,
-    0xdf,
-    0xb6,
-    0x8e,
-    0x9e,
-    0x95,
-    0x6c,
-    0x21,
-    0x03,
-    0x4d,
-    0xc9,
-    0xba,
-    0x6a,
-    0xc2,
-    0xad,
-    0x86,
-    0xde,
-    0x23,
-    0x9a,
-    0xd0,
-    0x0a,
-    0xb9,
-    0xc6,
-    0xc8,
-    0xf4,
-    0xc9,
-    0x6e,
-    0x83,
-    0xe8,
-    0xbc,
-    0x6c,
-    0x44,
-    0xb1,
-    0x7d,
-    0x0c,
-    0xfa,
-    0x10,
-    0x23,
-    0x1c,
-    0x09,
-    0x66,
-    0xd0,
-    0x42,
-    0x4d,
-    0xb4,
-    0xd8,
-    0x93,
-    0x5c,
-    0xc5,
-    0x26,
-    0x60,
-    0x0c,
-    0xaa,
-    0xdc,
-    0x53,
-    0x36,
-    0x67,
-    0x3a,
-    0xbb,
-    0xb9,
-    0xec,
-    0xc1,
-    0x25,
-    0xc1,
-    0x47,
-    0x98,
-    0x2c,
-    0x49,
-    0x17,
-    0x2e,
-    0x92,
-    0xde,
-    0x44,
-    0x21,
-    0x8f,
-    0xa6,
-    0xed,
-    0x5f,
-    0x68,
-    0xa2,
-    0xa2,
-    0x8b,
-    0x44,
-    0x30,
-    0xd4,
-    0xa2,
-    0x3c,
-    0xd4,
-    0x89,
-    0xde,
-    0xb1,
-    0x37,
-    0x54,
-    0xda,
-    0xe2,
-    0x70,
-    0x85,
-    0xf8,
-    0xbd,
-    0x83,
-    0x9d,
-    0x00,
-    0xf6,
-    0x27,
-    0x05,
-    0x09,
-    0x57,
-    0xcd,
-    0xff,
-    0x9d,
-    0x57,
-    0xdd,
-    0xdc,
-    0x18,
-    0xed,
-    0x43,
-    0x70,
-    0x51,
-    0xa6,
-    0x2a,
-    0xc3,
-    0x7c,
-    0xf6,
-    0x07,
-    0x09,
-    0x4f,
-    0xcb,
-    0xda,
-    0xd4,
-    0x64,
-    0x68,
-    0xb1,
-    0x89,
-    0xdf,
-    0x71,
-    0x6d,
-    0x10,
-    0x50,
-    0x42,
-    0xc8,
-    0xd0,
-    0xdb,
-    0x85,
-    0x97,
-    0xdb,
-    0x96,
-    0x04,
-    0x4d,
-    0x65,
-    0x32,
-    0xbb,
-    0xc1,
-    0x7b,
-    0xde,
-    0x32,
-    0x31,
-    0xf2,
-    0x68,
-    0x0a,
-    0x86,
-    0x9d,
-    0xa5,
-    0xd5,
-    0xd9,
-    0xc3,
-    0x14,
-    0x2b,
-    0x37,
-    0xcf,
-    0xbe,
-    0xfa,
-    0xa1,
-    0x4a,
-    0x60,
-    0x1d,
-    0x57,
-    0x07,
-    0xcc,
-    0x30,
-    0x57,
-    0x9d,
-    0x8d,
-    0xa3,
-    0x20,
-    0x1a,
-    0xca,
-    0x0e,
-    0xbb,
-    0xf6,
-    0x6d,
-    0xc4,
-    0xfc,
-    0x46,
-    0x83,
-    0xab,
-    0x06,
-    0x32,
-    0xe6,
-    0x4b,
-    0x0d,
-    0xa9,
-    0x1a,
-    0x24,
-    0x60,
-    0x54,
-    0x76,
-    0x45,
-    0xa6,
-    0xc8,
-    0x84,
-    0x1a,
-    0x67,
-    0xff,
-    0xaa,
-    0x86,
-    0xcf,
-    0x09,
-    0x09,
-    0x31,
-    0xaf,
-    0xff,
-    0xa5,
-    0x24,
-    0xc5,
-    0x39,
-    0xc6,
-    0x93,
-    0x3d,
-    0xc0,
-    0x9f,
-    0xf9,
-    0x77,
-    0x06,
-    0x2e,
-    0x6b,
-    0x0b,
-    0xd5,
-    0x63,
-    0x25,
-    0x0b,
-    0x86,
-    0x84,
-    0x6a,
-    0x88,
-    0x73,
-    0xd0,
-    0x8b,
-    0x57,
-    0xaf,
-    0x63,
-    0x45,
-    0x14,
-    0xf4,
-    0x59,
-    0x4f,
-    0x68,
-    0xdc,
-    0x36,
-    0x34,
-    0x88,
-    0x54,
-    0x86,
-    0x5f,
-    0xfe,
-    0x4e,
-    0xc0,
-    0x74,
-    0xac,
-    0xb7,
-    0x70,
-    0xe7,
-    0x0e,
-    0xa9,
-    0x95,
-    0xc7,
-    0xbf,
-    0xe1,
-    0x48,
-    0xda,
-    0x3f,
-    0x73,
-    0x9f,
-    0xef,
-    0xf3,
-    0xbc,
-    0xd1,
-    0x70,
-    0x6d,
-    0x99,
-    0x9b,
-    0x37,
-    0xee,
-    0xd6,
-    0xe2,
-    0xa2,
-    0x29,
-    0xea,
-    0x99,
-    0xea,
-    0x4a,
-    0xe1,
-    0xe5,
-    0xb0,
-    0x37,
-    0x99,
-    0x7f,
-    0xd9,
-    0x16,
-    0x31,
-    0x5b,
-    0x9c,
-    0x0f,
-    0xbf,
-    0x87,
-    0xd9,
-    0x53,
-    0x41,
-    0x55,
-    0xad,
-    0x5d,
-    0xd7,
-    0xbc,
-    0x43,
-    0x78,
-    0x2f,
-    0xfc,
-    0xed,
-    0x81,
-    0x40,
-    0x81,
-    0x73,
-    0xee,
-    0x3b,
-    0x0a,
-    0xab,
-    0x0f,
-    0xbe,
-    0x0a,
-    0x49,
-    0x94,
-    0x4b,
-    0x4e,
-    0xf9,
-    0x50,
-    0xfa,
-    0xe1,
-    0xab,
-    0x3c,
-    0x6a,
-    0x2d,
-    0x2e,
-    0xbf,
-    0xfd,
-    0x62,
-    0x01,
-    0x2c,
-    0x45,
-    0x1c,
-    0x66,
-    0x8d,
-    0xb9,
-    0x40,
-    0xb7,
-    0x9f,
-    0xad,
-    0x26,
-    0xfd,
-    0x1d,
-    0x81,
-    0xfe,
-    0xbf,
-    0x41,
-    0x18,
-    0x6c,
-    0x18,
-    0x89,
-    0x8b,
-    0x76,
-    0x0c,
-    0xb7,
-    0x1f,
-    0xa0,
-    0x1c,
-    0x1b,
-    0x75,
-    0x55,
-    0x18,
-    0x14,
-    0x01,
-    0x89,
-    0x35,
-    0xd5,
-    0xbd,
-    0x9d,
-    0x60,
-    0x65,
-    0x1f,
-    0x83,
-    0xd1,
-    0xe9,
-    0x48,
-    0x22,
-    0xe2,
-    0x26,
-    0x7e,
-    0xfc,
-    0x22,
-    0x42,
-    0xdc,
-    0x0e,
-    0xa5,
-    0xca,
-    0x48,
-    0xf7,
-    0x9f,
-    0xfa,
-    0xa6,
-    0x5d,
-    0x31,
-    0x38,
-    0x4b,
-    0x8d,
-    0x83,
-    0xe1,
-    0xb5,
-    0x61,
-    0x13,
-    0x48,
-    0x79,
-    0x67,
-    0x4d,
-    0xfc,
-    0x7c,
-    0x3f,
-    0x5b,
-    0x4a,
-    0x66,
-    0x45,
-    0x3e,
-    0x03,
-    0x54,
-    0x71,
-    0x1e,
-    0x80,
-    0xce,
-    0x7b,
-    0xde,
-    0xe2,
-    0xf8,
-    0x42,
-    0xf4,
-    0x9e,
-    0x0c,
-    0x6e,
-    0x78,
-    0x3a,
-    0x07,
-    0x54,
-    0x7a,
-    0x51,
-    0xa3,
-    0x1b,
-    0x99,
-    0xdd,
-    0x86,
-    0x1d,
-    0xd1,
-    0xb6,
-    0xb9,
-    0x90,
-    0x95,
-    0x55,
-    0x5b,
-    0x66,
-    0x1e,
-    0xde,
-    0x97,
-    0x71,
-    0x02,
-    0x5e,
-    0xd3,
-    0xcb,
-    0x08,
-    0x50,
-    0x2a,
-    0x75,
-    0x3b,
-    0x67,
-    0x1d,
-    0x3e,
-    0x3d,
-    0x87,
-    0x85,
-    0xe7,
-    0xde,
-    0x14,
-    0xcc,
-    0x84,
-    0xed,
-    0x70,
-    0x5d,
-    0x25,
-    0x4f,
-    0xbf,
-    0x59,
-    0xb6,
-    0x4d,
-    0xee,
-    0x8c,
-    0x24,
-    0x32,
-    0xf3,
-    0x9f,
-    0xc2,
-    0x16,
-    0x56,
-    0x8f,
-    0xea,
-    0xf5,
-    0xf0,
-    0x5e,
-    0xe7,
-    0x04,
-    0xf3,
-    0x08,
-    0x12,
-    0x44,
-    0x2a,
-    0xb8,
-    0x3c,
-    0x57,
-    0x82,
-    0x3c,
-    0x4c,
-    0x93,
-    0xca,
-    0xb6,
-    0x29,
-    0x55,
-    0xb7,
-    0x95,
-    0xdb,
-    0x97,
-    0x2b,
-    0xc4,
-    0xed,
-    0xc5,
-    0xb6,
-    0x21,
-    0x15,
-    0xcd,
-    0x5e,
-    0x31,
-    0x17,
-    0x76,
-    0x9b,
-    0x12,
-    0xe6,
-    0xf2,
-    0xa6,
-    0xb1,
-    0x0c,
-    0xb6,
-    0xf3,
-    0x3d,
-    0x4d,
-    0x89,
-    0xfc,
-    0xdb,
-    0x87,
-    0xdb,
-    0x41,
-    0x9b,
-    0xdd,
-    0x59,
-    0x8d,
-    0xaa,
-    0x14,
-    0xbe,
-    0x7a,
-    0xca,
-    0x3d,
-    0xec,
-    0x37,
-    0x00,
-    0x95,
-    0x3b,
-    0x89,
-    0x8c,
-    0xa9,
-    0x11,
-    0x10,
-    0x1e,
-    0xbe,
-    0xb3,
-    0xcc,
-    0x47,
-    0x6f,
-    0x5a,
-    0xe0,
-    0x2e,
-    0x98,
-    0x8a,
-    0x95,
-    0x84,
-    0x73,
-    0x9f,
-    0xa1,
-    0xba,
-    0x01,
-    0xa9,
-    0xaa,
-    0x71,
-    0xac,
-    0x79,
-    0x06,
-    0x32,
-    0x2a,
-    0xfc,
-    0xc5,
-    0x5f,
-    0xa4,
-    0xc8,
-    0xf1,
-    0x69,
-    0x18,
-    0xf5,
-    0x14,
-    0x44,
-    0xfc,
-    0x2e,
-    0xfb,
-    0x18,
-    0x24,
-    0x07,
-    0xba,
-    0x3a,
-    0xe5,
-    0x91,
-    0xf0,
-    0x5a,
-    0x7b,
-    0x2d,
-    0x4c,
-    0xfe,
-    0xa8,
-    0x9d,
-    0x50,
-    0x2f,
-    0x9e,
-    0x61,
-    0x55,
-    0x71,
-    0x1f,
-    0x40,
-    0xd0,
-    0xf9,
-    0xe3,
-    0x25,
-    0xd3,
-    0x1b,
-    0x3a,
-    0x2c,
-    0xd7,
-    0x02,
-    0xf2,
-    0xfd,
-    0xb8,
-    0xa3,
-    0x7b,
-    0x59,
-    0x01,
-    0xf3,
-    0x49,
-    0xf2,
-    0x6a,
-    0x58,
-    0x7a,
-    0x80,
-    0x9f,
-    0x5e,
-    0xb9,
-    0x11,
-    0x43,
-    0xac,
-    0x62,
-    0xa0,
-    0x35,
-    0x36,
-    0xe6,
-    0xea,
-    0x12,
-    0xb4,
-    0x72,
-    0x7d,
-    0xfb,
-    0x52,
-    0xcb,
-    0x12,
-    0x98,
-    0xa9,
-    0x7d,
-    0x1c,
-    0x5c,
-    0xee,
-    0x34,
-    0xa1,
-    0x0b,
-    0x69,
-    0x6a,
-    0x49,
-    0x7a,
-    0x29,
-    0x42,
-    0xb5,
-    0x97,
-    0xf7,
-    0xb4,
-    0x11,
-    0xa8,
-    0x88,
-    0xeb,
-    0xed,
-    0xd8,
-    0xf7,
-    0xeb,
-    0x48,
-    0xef,
-    0x72,
-    0x77,
-    0xee,
-    0x61,
-    0x33,
-    0x32,
-    0x05,
-    0x8a,
-    0xb1,
-    0x04,
-    0xe2,
-    0x38,
-    0x18,
-    0xbf,
-    0x21,
-    0x6a,
-    0xf7,
-    0x03,
-    0xf4,
-    0x57,
-    0x39,
-    0x5f,
-    0xbb,
-    0xb2,
-    0x57,
-    0xb8,
-    0xd5,
-    0x2d,
-    0xcc,
-    0xef,
-    0xb6,
-    0x3c,
-    0xc8,
-    0xbe,
-    0x3a,
-    0x1b,
-    0x28,
-    0xe3,
-    0x39,
-    0x12,
-    0xa6,
-    0x81,
-    0x5c,
-    0xf8,
-    0x4d,
-    0xc3,
-    0x2f,
-    0xf6,
-    0x31,
-    0xc2,
-    0x77,
-    0x8d,
-    0x5c,
-    0xa9,
-    0xc5,
-    0xda,
-    0x0b,
-    0x17,
-    0x4b,
-    0x19,
-    0x1b,
-    0xc4,
-    0xef,
-    0x69,
-    0xbe,
-    0x68,
-    0x9e,
-    0xce,
-    0x72,
-    0xd8,
-    0xe3,
-    0x7c,
-    0x34,
-    0x72,
-    0xb8,
-    0x53,
-    0xf0,
-    0xbc,
-    0x9c,
-    0xa6,
-    0x3d,
-    0x48,
-    0xe5,
-    0x40,
-    0x47,
-    0xdb,
-    0x58,
-    0xa9,
-    0x0c,
-    0xcd,
-    0xf7,
-    0xa5,
-    0xcc,
-    0xb3,
-    0x1a,
-    0xfe,
-    0xba,
-    0x3c,
-    0xc1,
-    0x83,
-    0xf8,
-    0x59,
-    0x29,
-    0x51,
-    0xc2,
-    0xa1,
-    0x9d,
-    0x51,
-    0xea,
-    0xf3,
-    0x8f,
-    0x02,
-    0x84,
-    0x5d,
-    0xe7,
-    0x79,
-    0xe2,
-    0x3c,
-    0x9b,
-    0xa6,
-    0xc3,
-    0xa5,
-    0x80,
-    0xd8,
-    0xc7,
-    0x04,
-    0x60,
-    0x83,
-    0x26,
-    0x03,
-    0x4c,
-    0x42,
-    0xa2,
-    0xae,
-    0x33,
-    0x18,
-    0xba,
-    0xd4,
-    0xb4,
-    0xfb,
-    0x21,
-    0xb0,
-    0x31,
-    0x93,
-    0x6e,
-    0xc8,
-    0x25,
-    0x3f,
-    0x15,
-    0x16,
-    0xb7,
-    0x59,
-    0x96,
-    0x66,
-    0x8f,
-    0xbb,
-    0xf4,
-    0xff,
-    0xe8,
-    0x81,
-    0x69,
-    0x85,
-    0xe6,
-    0x11,
-    0x58,
-    0x1e,
-    0x2a,
-    0x59,
-    0x83,
-    0xd4,
-    0xa5,
-    0x58,
-    0x7e,
-    0x3b,
-    0xa9,
-    0xe0,
-    0x64,
-    0x53,
-    0x46,
-    0x9a,
-    0xc8,
-    0xaf,
-    0xd3,
-    0x4a,
-    0xee,
-    0xd7,
-    0xcb,
-    0x54,
-    0x3b,
-    0xec,
-    0xdb,
-    0x80,
-    0xeb,
-    0x8a,
-    0x38,
-    0xfa,
-    0x02,
-    0xf2,
-    0x36,
-    0x9d,
-    0x85,
-    0x69,
-    0x17,
-    0x70,
-    0xe9,
-    0xdb,
-    0x20,
-    0x71,
-    0xcc,
-    0xc4,
-    0xf3,
-    0x92,
-    0xe3,
-    0x51,
-    0x18,
-    0x02,
-    0x34,
-    0xc2,
-    0xdd,
-    0xad,
-    0x85,
-    0x12,
-    0x60,
-    0x06,
-    0x14,
-    0xda,
-    0xea,
-    0x04,
-    0x88,
-    0x73,
-    0x7e,
-    0x6a,
-    0x28,
-    0x5a,
-    0xb2,
-    0x4c,
-    0x4b,
-    0xd9,
-    0xbe,
-    0xcf,
-    0x0f,
-    0xe4,
-    0xd3,
-    0x30,
-    0x4e,
-    0x42,
-    0xae,
-    0x08,
-    0xce,
-    0xed,
-    0x6c,
-    0xce,
-    0xb8,
-    0xba,
-    0xa0,
-    0x9d,
-    0x4c,
-    0x3c,
-    0xa3,
-    0x37,
-    0xd2,
-    0xe6,
-    0x2b,
-    0x4b,
-    0xd4,
-    0x71,
-    0x1f,
-    0xf3,
-    0x8a,
-    0x7d,
-    0xaa,
-    0x81,
-    0x96,
-    0x7b,
-    0x8f,
-    0x7b,
-    0xf2,
-    0xca,
-    0xbc,
-    0xe4,
-    0x26,
-    0x20,
-    0x21,
-    0xbd,
-    0xbe,
-    0x2c,
-    0xc2,
-    0xcc,
-    0xfb,
-    0x7a,
-    0x0b,
-    0x9c,
-    0xc9,
-    0x96,
-    0x64,
-    0xc5,
-    0xf1,
-    0x74,
-    0x06,
-    0x6d,
-    0x90,
-    0x0f,
-    0x0d,
-    0x0f,
-    0xc8,
-    0x51,
-    0xce,
-    0x7c,
-    0xb5,
-    0x33,
-    0x6a,
-    0x1f,
-    0xa2,
-    0x25,
-    0xa4,
-    0x84,
-    0x7d,
-    0xb0,
-    0xef,
-    0x1c,
-    0x89,
-    0x5a,
-    0xcb,
-    0x3a,
-    0x53,
-    0xca,
-    0x52,
-    0x62,
-    0xe7,
-    0x2c,
-    0x0e,
-    0xc3,
-    0x43,
-    0xd7,
-    0x0e,
-    0x02,
-    0x0c,
-    0x2d,
-    0x39,
-    0x39,
-    0x80,
-    0xc3,
-    0xe2,
-    0x40,
-    0xac,
-    0xc3,
-    0x9c,
-    0x2b,
-    0xdf,
-    0x8e,
-    0x4f,
-    0x13,
-    0x5e,
-    0xa5,
-    0x8b,
-    0x1a,
-    0x59,
-    0xc9,
-    0x1d,
-    0xa9,
-    0x1e
-  ],
-  const [
-    0x9c,
-    0x4a,
-    0xe2,
-    0x21,
-    0x7c,
-    0x92,
-    0x8d,
-    0xd5,
-    0x86,
-    0x48,
-    0x36,
-    0xbe,
-    0x5d,
-    0x4e,
-    0xc2,
-    0x81,
-    0x21,
-    0x14,
-    0x71,
-    0xaa,
-    0x44,
-    0x1a,
-    0x59,
-    0x4b,
-    0x99,
-    0xb0,
-    0x13,
-    0xe5,
-    0xae,
-    0x01,
-    0xb4,
-    0x8c,
-    0x5c,
-    0x4f,
-    0xfe,
-    0x47,
-    0x9c,
-    0x80,
-    0xd8,
-    0xb6,
-    0x9c,
-    0xda,
-    0xfc,
-    0xf7,
-    0x13,
-    0x0b,
-    0xf0,
-    0xc9,
-    0xd1,
-    0x6c,
-    0x37,
-    0xf2,
-    0x9a,
-    0x86,
-    0xc8,
-    0xdf,
-    0x34,
-    0xd6,
-    0xbf,
-    0x8b,
-    0xbf,
-    0xcd,
-    0x53,
-    0xa2,
-    0x45,
-    0x1b,
-    0x08,
-    0xe5,
-    0x92,
-    0x2d,
-    0x25,
-    0xd0,
-    0x46,
-    0xf4,
-    0x69,
-    0x7a,
-    0x28,
-    0xe9,
-    0xfa,
-    0xbe,
-    0xbd,
-    0x4e,
-    0x9e,
-    0x98,
-    0x1a,
-    0xb6,
-    0x2d,
-    0xd1,
-    0xf6,
-    0xc7,
-    0x47,
-    0xdf,
-    0x03,
-    0x3f,
-    0x42,
-    0x07,
-    0x7f,
-    0x35,
-    0x66,
-    0xc4,
-    0x05,
-    0xa2,
-    0x5d,
-    0x6c,
-    0xaa,
-    0x1f,
-    0xe5,
-    0x11,
-    0x45,
-    0xf0,
-    0xc8,
-    0xa5,
-    0x0e,
-    0x42,
-    0x0e,
-    0x62,
-    0x6b,
-    0xb1,
-    0x71,
-    0x69,
-    0x06,
-    0x0d,
-    0x11,
-    0xaa,
-    0x23,
-    0x5e,
-    0x69,
-    0x03,
-    0x31,
-    0x25,
-    0x82,
-    0xac,
-    0x9e,
-    0xe5,
-    0x66,
-    0xd2,
-    0xf0,
-    0xe2,
-    0xd8,
-    0x82,
-    0x12,
-    0x29,
-    0x42,
-    0xc9,
-    0xeb,
-    0xd0,
-    0xef,
-    0x1a,
-    0x35,
-    0x7f,
-    0x7a,
-    0xef,
-    0x8d,
-    0x30,
-    0x87,
-    0xb3,
-    0xc6,
-    0x32,
-    0xb0,
-    0xe0,
-    0x83,
-    0x74,
-    0xc3,
-    0x65,
-    0x05,
-    0x00,
-    0x2a,
-    0x4a,
-    0x41,
-    0xc6,
-    0xaa,
-    0x96,
-    0x36,
-    0x9b,
-    0x51,
-    0x71,
-    0x7d,
-    0x81,
-    0xa9,
-    0x86,
-    0x22,
-    0x29,
-    0x32,
-    0xab,
-    0xb2,
-    0xb6,
-    0x0f,
-    0xc4,
-    0x95,
-    0xc4,
-    0x00,
-    0xe4,
-    0x9e,
-    0xa9,
-    0x90,
-    0xb6,
-    0xe1,
-    0xfa,
-    0x90,
-    0x1c,
-    0xc5,
-    0x52,
-    0xc3,
-    0x15,
-    0x5a,
-    0x4e,
-    0xdb,
-    0xe4,
-    0xec,
-    0xdc,
-    0xa4,
-    0x6f,
-    0xd8,
-    0xb6,
-    0x80,
-    0xe5,
-    0x9e,
-    0x29,
-    0x13,
-    0xa3,
-    0x38,
-    0x1b,
-    0x3f,
-    0x59,
-    0xaa,
-    0x4c,
-    0x53,
-    0x68,
-    0xdb,
-    0xdc,
-    0x7f,
-    0x8f,
-    0xa3,
-    0x0e,
-    0x8c,
-    0xc7,
-    0x25,
-    0x4b,
-    0xc9,
-    0x6b,
-    0x5f,
-    0x6a,
-    0x49,
-    0x9c,
-    0xff,
-    0x2e,
-    0x4b,
-    0xe4,
-    0x78,
-    0x10,
-    0xfa,
-    0x19,
-    0x56,
-    0x3f,
-    0x57,
-    0x85,
-    0xce,
-    0xe6,
-    0x73,
-    0x43,
-    0x9a,
-    0xad,
-    0xe1,
-    0xec,
-    0x04,
-    0x82,
-    0x6b,
-    0x74,
-    0x40,
-    0x99,
-    0x04,
-    0x4e,
-    0xfe,
-    0xb1,
-    0xfe,
-    0xd7,
-    0x40,
-    0x9a,
-    0x7d,
-    0xf1,
-    0x69,
-    0xf4,
-    0x2c,
-    0xee,
-    0x97,
-    0x39,
-    0x2e,
-    0xb1,
-    0x33,
-    0xfe,
-    0x58,
-    0x0f,
-    0xc7,
-    0x75,
-    0x9d,
-    0x7b,
-    0x0f,
-    0x37,
-    0xc9,
-    0xe3,
-    0x52,
-    0x40,
-    0x73,
-    0xd5,
-    0xf2,
-    0x3b,
-    0x2c,
-    0xe6,
-    0x43,
-    0x01,
-    0xfd,
-    0x54,
-    0x99,
-    0x5c,
-    0x11,
-    0xea,
-    0xa5,
-    0x10,
-    0xae,
-    0x24,
-    0x01,
-    0x1c,
-    0x6a,
-    0x94,
-    0x09,
-    0x3d,
-    0x9b,
-    0x84,
-    0xed,
-    0xb4,
-    0x0f,
-    0xdd,
-    0x04,
-    0x49,
-    0xfd,
-    0x48,
-    0x63,
-    0x90,
-    0x3c,
-    0x92,
-    0xaf,
-    0x6b,
-    0xb3,
-    0x55,
-    0x2f,
-    0xd0,
-    0x11,
-    0xd5,
-    0x25,
-    0xcc,
-    0xbe,
-    0x28,
-    0x5f,
-    0xc8,
-    0x11,
-    0x9a,
-    0x09,
-    0x0c,
-    0xc3,
-    0x4f,
-    0xc5,
-    0x81,
-    0xa3,
-    0x2a,
-    0xfe,
-    0xbb,
-    0x8c,
-    0xee,
-    0x78,
-    0x36,
-    0x94,
-    0xa3,
-    0x2c,
-    0xe0,
-    0x87,
-    0x3c,
-    0x54,
-    0xd8,
-    0x94,
-    0x76,
-    0xc2,
-    0x76,
-    0x45,
-    0x03,
-    0x75,
-    0x8b,
-    0xb5,
-    0xe8,
-    0x6e,
-    0xea,
-    0xfd,
-    0x24,
-    0xc0,
-    0x27,
-    0xef,
-    0x92,
-    0xe7,
-    0x9e,
-    0x07,
-    0x10,
-    0x5a,
-    0xb7,
-    0x9e,
-    0xe1,
-    0x64,
-    0x69,
-    0x61,
-    0x50,
-    0x2f,
-    0xfd,
-    0x02,
-    0x96,
-    0x22,
-    0x15,
-    0x2d,
-    0xfe,
-    0x6c,
-    0xec,
-    0xbe,
-    0x47,
-    0xe1,
-    0xdf,
-    0x31,
-    0x4a,
-    0x06,
-    0x2d,
-    0x59,
-    0xdd,
-    0x67,
-    0xfb,
-    0x55,
-    0xf6,
-    0x31,
-    0x9b,
-    0xc1,
-    0x14,
-    0xfc,
-    0x0d,
-    0x29,
-    0xda,
-    0xe9,
-    0xc6,
-    0xc3,
-    0xfd,
-    0xed,
-    0xb1,
-    0x5d,
-    0x61,
-    0x6c,
-    0x74,
-    0x94,
-    0x7f,
-    0x0a,
-    0xf4,
-    0x47,
-    0x0a,
-    0xbe,
-    0x1b,
-    0x4b,
-    0xd2,
-    0x28,
-    0xd9,
-    0x60,
-    0xe8,
-    0x24,
-    0x68,
-    0x64,
-    0x03,
-    0x9f,
-    0xd5,
-    0xc7,
-    0x22,
-    0xa9,
-    0xbc,
-    0x3f,
-    0x73,
-    0xcc,
-    0x53,
-    0xbd,
-    0x74,
-    0x9c,
-    0xa9,
-    0x9f,
-    0x58,
-    0x90,
-    0x30,
-    0x27,
-    0xac,
-    0x10,
-    0x7a,
-    0x2c,
-    0x3a,
-    0xcf,
-    0x40,
-    0x0f,
-    0x2e,
-    0x5b,
-    0xa8,
-    0xf1,
-    0x77,
-    0xf3,
-    0xc7,
-    0x23,
-    0x70,
-    0x98,
-    0x65,
-    0xde,
-    0xc0,
-    0x66,
-    0x01,
-    0x35,
-    0x7f,
-    0x25,
-    0x15,
-    0x47,
-    0x9a,
-    0x1c,
-    0x9c,
-    0xb9,
-    0x78,
-    0x25,
-    0xd0,
-    0x64,
-    0xdd,
-    0x07,
-    0x38,
-    0x4a,
-    0x0f,
-    0xff,
-    0xe2,
-    0xcf,
-    0x38,
-    0xa0,
-    0xee,
-    0x26,
-    0x0c,
-    0xde,
-    0x4c,
-    0x09,
-    0xab,
-    0x65,
-    0xc5,
-    0xad,
-    0xc9,
-    0x2f,
-    0x40,
-    0xf5,
-    0x0c,
-    0x55,
-    0x3e,
-    0xe6,
-    0xb5,
-    0x25,
-    0xa8,
-    0x5b,
-    0x83,
-    0x76,
-    0xca,
-    0xf9,
-    0xd4,
-    0x38,
-    0x9f,
-    0x66,
-    0x0e,
-    0x4f,
-    0x4f,
-    0xb6,
-    0x3d,
-    0xa2,
-    0xf6,
-    0x26,
-    0xfe,
-    0x6e,
-    0xa7,
-    0x0d,
-    0x9b,
-    0xe1,
-    0xb1,
-    0x0f,
-    0x77,
-    0xe4,
-    0x20,
-    0x94,
-    0xad,
-    0x38,
-    0x87,
-    0x78,
-    0xf4,
-    0xc4,
-    0xfd,
-    0x05,
-    0xc6,
-    0x2d,
-    0x66,
-    0x1e,
-    0xc1,
-    0xa8,
-    0xf4,
-    0xbc,
-    0x4d,
-    0x0c,
-    0xed,
-    0x9f,
-    0x7f,
-    0x2c,
-    0xae,
-    0x3d,
-    0x3d,
-    0x63,
-    0xf0,
-    0xff,
-    0xa3,
-    0x70,
-    0x4a,
-    0xac,
-    0xa6,
-    0x84,
-    0xf7,
-    0x25,
-    0xf7,
-    0x9a,
-    0xda,
-    0x54,
-    0x2a,
-    0x07,
-    0xbf,
-    0x5f,
-    0x18,
-    0x52,
-    0xe4,
-    0x21,
-    0x82,
-    0x45,
-    0xb8,
-    0xda,
-    0xf7,
-    0x44,
-    0xe2,
-    0x25,
-    0xf7,
-    0xde,
-    0x85,
-    0x2b,
-    0x58,
-    0xa2,
-    0xc2,
-    0x17,
-    0xe9,
-    0x34,
-    0x7f,
-    0xca,
-    0x56,
-    0xa0,
-    0x67,
-    0xcf,
-    0x4b,
-    0xed,
-    0x32,
-    0x91,
-    0xdc,
-    0xf6,
-    0x27,
-    0xcb,
-    0x25,
-    0x75,
-    0xdf,
-    0x41,
-    0x2d,
-    0x61,
-    0x4b,
-    0xae,
-    0x11,
-    0x7a,
-    0xf9,
-    0xfd,
-    0x5e,
-    0x22,
-    0x92,
-    0xbb,
-    0xbe,
-    0x6e,
-    0xa8,
-    0xcd,
-    0xd7,
-    0x7d,
-    0xae,
-    0x5e,
-    0x70,
-    0x08,
-    0x48,
-    0x1c,
-    0xd5,
-    0x3b,
-    0xc6,
-    0xa4,
-    0x7d,
-    0xc3,
-    0xea,
-    0x3a,
-    0xeb,
-    0x29,
-    0xf2,
-    0xbe,
-    0xd2,
-    0x5e,
-    0xd2,
-    0xdb,
-    0x7c,
-    0x97,
-    0xc2,
-    0x82,
-    0x6c,
-    0x5a,
-    0xf8,
-    0x97,
-    0x43,
-    0xd9,
-    0xb7,
-    0xea,
-    0xe0,
-    0x80,
-    0x88,
-    0x68,
-    0xcb,
-    0xca,
-    0xc8,
-    0x93,
-    0xd4,
-    0x58,
-    0x62,
-    0x2f,
-    0xf7,
-    0x44,
-    0xde,
-    0x3e,
-    0x83,
-    0xb3,
-    0x9b,
-    0x2f,
-    0x7c,
-    0xa9,
-    0x58,
-    0x53,
-    0x3d,
-    0x22,
-    0xf9,
-    0x90,
-    0x61,
-    0x5e,
-    0x88,
-    0x59,
-    0xe4,
-    0x7c,
-    0x7b,
-    0xdd,
-    0x86,
-    0x4a,
-    0x35,
-    0x7f,
-    0x70,
-    0x5c,
-    0xcf,
-    0x87,
-    0x1a,
-    0x5b,
-    0x17,
-    0x17,
-    0x6c,
-    0xa0,
-    0xd9,
-    0x60,
-    0x24,
-    0x01,
-    0x5e,
-    0x15,
-    0x77,
-    0xeb,
-    0x33,
-    0x20,
-    0xfb,
-    0xb2,
-    0x2b,
-    0x95,
-    0xc4,
-    0x24,
-    0xa7,
-    0xe4,
-    0xcd,
-    0x64,
-    0x15,
-    0x52,
-    0x9a,
-    0xf6,
-    0xb7,
-    0xaa,
-    0x1c,
-    0x16,
-    0xa6,
-    0x2f,
-    0xd5,
-    0x4e,
-    0x16,
-    0xd6,
-    0x3d,
-    0x47,
-    0xdb,
-    0xb2,
-    0x63,
-    0xe0,
-    0x2d,
-    0xb0,
-    0xd7,
-    0x7d,
-    0xa8,
-    0x84,
-    0xc8,
-    0xa1,
-    0x96,
-    0xe3,
-    0x6a,
-    0xc0,
-    0x71,
-    0xf3,
-    0x9a,
-    0x4e,
-    0xa4,
-    0x00,
-    0xc5,
-    0x1c,
-    0x92,
-    0x70,
-    0x06,
-    0xe4,
-    0xd9,
-    0xf9,
-    0x8e,
-    0x23,
-    0xd8,
-    0x11,
-    0x49,
-    0x26,
-    0x6f,
-    0xa6,
-    0xbf,
-    0x68,
-    0x05,
-    0x10,
-    0x38,
-    0x1b,
-    0xd0,
-    0x44,
-    0x23,
-    0x05,
-    0x50,
-    0x4a,
-    0xb8,
-    0x8d,
-    0x1d,
-    0xf1,
-    0xdd,
-    0x16,
-    0xe3,
-    0xc1,
-    0x46,
-    0x8b,
-    0xab,
-    0x31,
-    0xe1,
-    0x3b,
-    0x5c,
-    0x1a,
-    0x71,
-    0xe8,
-    0x81,
-    0x6c,
-    0x78,
-    0x1a,
-    0x4c,
-    0x20,
-    0x5b,
-    0xb9,
-    0xdb,
-    0x6d,
-    0xc1,
-    0xdb,
-    0xbb,
-    0x3f,
-    0x3c,
-    0xdb,
-    0xab,
-    0xe5,
-    0x2b,
-    0xab,
-    0xa2,
-    0x09,
-    0xdf,
-    0x6b,
-    0x13,
-    0xe6,
-    0xfc,
-    0x3a,
-    0x6f,
-    0xb5,
-    0x22,
-    0x4c,
-    0xec,
-    0x68,
-    0xcd,
-    0x3c,
-    0x85,
-    0x9b,
-    0x7a,
-    0xa4,
-    0x41,
-    0xc8,
-    0x0c,
-    0xec,
-    0xb9,
-    0xba,
-    0x6d,
-    0x5f,
-    0xd4,
-    0x44,
-    0x78,
-    0x84,
-    0xd6,
-    0x32,
-    0x17,
-    0xab,
-    0x99,
-    0x80,
-    0xa8,
-    0xc6,
-    0x19,
-    0xca,
-    0xa6,
-    0x7a,
-    0x37,
-    0x04,
-    0x85,
-    0x76,
-    0xb6,
-    0x6b,
-    0xdd,
-    0x04,
-    0x8a,
-    0xbb,
-    0xcb,
-    0xdd,
-    0x52,
-    0xa3,
-    0x95,
-    0x42,
-    0x23,
-    0x76,
-    0x8c,
-    0x48,
-    0x87,
-    0x23,
-    0x37,
-    0x74,
-    0xc5,
-    0x67,
-    0xad,
-    0x87,
-    0x63,
-    0x41,
-    0x43,
-    0x9b,
-    0xea,
-    0xa7,
-    0x67,
-    0x6f,
-    0xe9,
-    0x77,
-    0xcc,
-    0x00,
-    0x3c,
-    0xb0,
-    0xc8,
-    0x59,
-    0x8e,
-    0xe2,
-    0xfa,
-    0xab,
-    0x1d,
-    0xe3,
-    0x2f,
-    0xa0,
-    0xbd,
-    0xc4,
-    0x86,
-    0xed,
-    0x20,
-    0x03,
-    0xd3,
-    0x27,
-    0x54,
-    0x02,
-    0x42,
-    0xd7,
-    0x8d,
-    0xb8,
-    0x3d,
-    0xd0,
-    0x25,
-    0xa7,
-    0x8f,
-    0xc0,
-    0xe1,
-    0x0e,
-    0xc9,
-    0x06,
-    0x76,
-    0x5f,
-    0xe4,
-    0xc3,
-    0x4c,
-    0xf3,
-    0x29,
-    0x34,
-    0x81,
-    0xfd,
-    0x4e,
-    0x3f,
-    0x31,
-    0xbd,
-    0xe2,
-    0x4b,
-    0xf5,
-    0xf6,
-    0xeb,
-    0x55,
-    0xa9,
-    0xa1,
-    0xcd,
-    0x40,
-    0x73,
-    0xe3,
-    0x6d,
-    0x6d,
-    0x00,
-    0x3d,
-    0x97,
-    0x8c,
-    0x11,
-    0x03,
-    0x9d,
-    0xb2,
-    0x37,
-    0x0f,
-    0x41,
-    0xab,
-    0xda,
-    0xb6,
-    0xd5,
-    0x91,
-    0x80,
-    0xfb,
-    0xa1,
-    0x9d,
-    0x4c,
-    0x03,
-    0x85,
-    0x3e,
-    0xc5,
-    0xc9,
-    0xe0,
-    0x68,
-    0xda,
-    0x13,
-    0xb0,
-    0x2f,
-    0x22,
-    0xa5,
-    0xfa,
-    0x94,
-    0x68,
-    0xb4,
-    0x6c,
-    0x9f,
-    0x66,
-    0x9d,
-    0x41,
-    0xae,
-    0xd1,
-    0xd7,
-    0x65,
-    0x0c,
-    0x96,
-    0x26,
-    0xd9,
-    0xc5,
-    0x64,
-    0x12,
-    0x5a,
-    0xb9,
-    0x6a,
-    0x98,
-    0x3d,
-    0xf0,
-    0x62,
-    0x1f,
-    0x9e,
-    0x2d,
-    0xce,
-    0xae,
-    0xb9,
-    0xc6,
-    0x81,
-    0x5b,
-    0x98,
-    0xb2,
-    0x62,
-    0x07,
-    0xef,
-    0xe4,
-    0x6d,
-    0x48,
-    0x44,
-    0xd7,
-    0xfa,
-    0xa7,
-    0x52,
-    0x6b,
-    0x42,
-    0x0c,
-    0xb0,
-    0xef,
-    0x1f,
-    0x76,
-    0xae,
-    0x7f,
-    0x13,
-    0xef,
-    0x80,
-    0x90,
-    0x8c,
-    0xc0,
-    0x9e,
-    0xc9,
-    0x66,
-    0xe1,
-    0x6a,
-    0x15,
-    0xb2,
-    0xb3,
-    0x13,
-    0xf6,
-    0xb6,
-    0xf1,
-    0xba,
-    0x1c,
-    0x34,
-    0xe4,
-    0xd4,
-    0x36,
-    0xf0,
-    0xd7,
-    0xd0,
-    0x08,
-    0x6c,
-    0xcb,
-    0xf9,
-    0xbd,
-    0xf6,
-    0x6c,
-    0x9d,
-    0x7f,
-    0xe4,
-    0x43,
-    0x6f,
-    0x46,
-    0x1f,
-    0x2c,
-    0x2a,
-    0xed,
-    0xde,
-    0x0b,
-    0x77,
-    0x8b,
-    0xb4,
-    0xbb,
-    0x11,
-    0x00,
-    0xcd,
-    0x47,
-    0x27,
-    0xce,
-    0x75,
-    0x5d,
-    0x02,
-    0x2b,
-    0xd9,
-    0xff,
-    0xe7,
-    0x54,
-    0x12,
-    0x7c,
-    0x3f,
-    0x23,
-    0x5f,
-    0x9f,
-    0xf5,
-    0xe4,
-    0xb2,
-    0x26,
-    0x20,
-    0x65,
-    0x6f,
-    0x75,
-    0xe2,
-    0x4c,
-    0x70,
-    0x8c,
-    0x8f,
-    0xad,
-    0x4c,
-    0x37,
-    0x12,
-    0xdc,
-    0xd9,
-    0x84,
-    0x8d,
-    0x80,
-    0xef,
-    0x7a,
-    0x40,
-    0xe9,
-    0x6f,
-    0x08,
-    0xac,
-    0xa4,
-    0x84,
-    0x3c,
-    0xf8,
-    0x4c,
-    0x29,
-    0xb6,
-    0x93,
-    0xa2,
-    0xec,
-    0x5b,
-    0x1b,
-    0xe0,
-    0xf1,
-    0x4e,
-    0x7e,
-    0x4b,
-    0x39,
-    0x1c,
-    0x5f,
-    0x08,
-    0x24,
-    0x36,
-    0xbb,
-    0x30,
-    0x35,
-    0xa5,
-    0xcc,
-    0x27,
-    0x16,
-    0xf9,
-    0x2d,
-    0x29,
-    0xdc,
-    0x82,
-    0x40,
-    0x25,
-    0x8b,
-    0xc3,
-    0xcd,
-    0xcf,
-    0xdd,
-    0x24,
-    0xeb,
-    0xf1,
-    0x3f,
-    0xe7,
-    0x24,
-    0x01,
-    0x1d,
-    0x5d,
-    0xd4,
-    0xf9,
-    0x5f,
-    0x5a,
-    0xd2,
-    0x63,
-    0x34,
-    0xe6,
-    0x52,
-    0xb3,
-    0x0e,
-    0x35,
-    0x0a,
-    0xda,
-    0xee,
-    0xda,
-    0x94,
-    0x18,
-    0xe1,
-    0x37,
-    0x14,
-    0x12,
-    0xca,
-    0x38,
-    0x1a,
-    0x24,
-    0x63,
-    0x41,
-    0xca,
-    0xf8,
-    0x7f,
-    0x64,
-    0x3a,
-    0x58,
-    0x92,
-    0xd8,
-    0x1b,
-    0x40,
-    0x72,
-    0xa6,
-    0x9c,
-    0x38,
-    0x5f,
-    0xa6,
-    0x8b,
-    0xe0,
-    0x42,
-    0xaa,
-    0xbd,
-    0xcd,
-    0x32,
-    0xf9,
-    0xb1,
-    0x93,
-    0x3c,
-    0xff,
-    0x70,
-    0x23,
-    0x64,
-    0x42,
-    0xb7,
-    0x58,
-    0xe7,
-    0x98,
-    0x58,
-    0xcc,
-    0xc3,
-    0x98,
-    0xde,
-    0xf0,
-    0x79,
-    0x4e,
-    0x70,
-    0x5c,
-    0x12,
-    0x33,
-    0xf8,
-    0x63,
-    0x60,
-    0x5b,
-    0x84,
-    0xeb,
-    0x86,
-    0xf1,
-    0xec,
-    0x7b,
-    0xbb,
-    0xe1,
-    0xb5,
-    0x96,
-    0x4a,
-    0xd4,
-    0x35,
-    0x48,
-    0xdd,
-    0x61,
-    0xf8,
-    0xfe,
-    0xfc,
-    0x81,
-    0x63,
-    0x9b,
-    0xd1,
-    0x44,
-    0x97,
-    0xc7,
-    0x2e,
-    0xc3,
-    0x98,
-    0x8a,
-    0xd1,
-    0x56,
-    0xaf,
-    0x1b,
-    0xe6,
-    0x07,
-    0x0c,
-    0xf2,
-    0xcd,
-    0x46,
-    0xb0,
-    0x24,
-    0x1e,
-    0xde,
-    0x8a,
-    0xf0,
-    0xea,
-    0x27,
-    0xe0,
-    0x95,
-    0x44,
-    0x7d,
-    0xf1,
-    0x67,
-    0x00,
-    0xf2,
-    0xd9,
-    0x22,
-    0xbb,
-    0x40,
-    0xb4,
-    0x7e,
-    0x1c,
-    0x02,
-    0x06,
-    0x04,
-    0x58,
-    0x23,
-    0x5b,
-    0x1f,
-    0xfc,
-    0x96,
-    0x2a,
-    0x76,
-    0xe7,
-    0x47,
-    0xff,
-    0x79,
-    0x95,
-    0x52,
-    0xd9,
-    0x3a,
-    0xa4,
-    0x74,
-    0xd1,
-    0x7f,
-    0x90,
-    0xbe,
-    0xfd,
-    0x15,
-    0xc2,
-    0x91,
-    0x94,
-    0x67,
-    0xc9,
-    0xc6,
-    0x53,
-    0x4f,
-    0xe7,
-    0x2d,
-    0x1f,
-    0x2b,
-    0xcf,
-    0x39,
-    0xeb,
-    0x34,
-    0xad,
-    0xf9,
-    0xdc,
-    0x0b,
-    0x67,
-    0x4a,
-    0xab,
-    0x95,
-    0x22,
-    0x4c,
-    0x4c,
-    0x09,
-    0x09,
-    0x12,
-    0xcd,
-    0x47,
-    0x49,
-    0x9e,
-    0x80,
-    0x6c,
-    0x60,
-    0x0c,
-    0x5c,
-    0xa3,
-    0x98,
-    0x0d,
-    0xa1,
-    0x3e,
-    0xce,
-    0x97,
-    0xbb,
-    0x05,
-    0x78,
-    0xdb,
-    0x69,
-    0xcd,
-    0xe7,
-    0x78,
-    0x1e,
-    0x4d,
-    0xc9,
-    0xee,
-    0xa8,
-    0x2e,
-    0xf1,
-    0x55,
-    0x0f,
-    0x61,
-    0x5b,
-    0x4f,
-    0xc0,
-    0xb5,
-    0x6a,
-    0x3b,
-    0xea,
-    0xa9,
-    0x75,
-    0xab,
-    0x29,
-    0x7e,
-    0x82,
-    0x18,
-    0x62,
-    0x91,
-    0x51,
-    0xd5,
-    0xee,
-    0xe8,
-    0x9d,
-    0x42,
-    0xfa,
-    0x0b,
-    0x9e,
-    0x42,
-    0x2d,
-    0x15,
-    0xd2,
-    0xef,
-    0x8c,
-    0x0a,
-    0xfd,
-    0x8c,
-    0x9b,
-    0x6b,
-    0x6f,
-    0xba,
-    0xc5,
-    0x08,
-    0x85,
-    0xef,
-    0xfe,
-    0x16,
-    0x72,
-    0x25,
-    0xa7,
-    0x81,
-    0x3f,
-    0xcf,
-    0xb2,
-    0x84,
-    0x11,
-    0x11,
-    0x06,
-    0x76,
-    0xab,
-    0x30,
-    0x25,
-    0xe7,
-    0x33,
-    0x48,
-    0x0c,
-    0xeb,
-    0x39,
-    0x3d,
-    0x5b,
-    0xb6,
-    0xf5,
-    0xf3,
-    0xb5,
-    0x69,
-    0xd0,
-    0xc2,
-    0x6a,
-    0x2c,
-    0x27,
-    0x24,
-    0x53,
-    0x7d,
-    0x4b,
-    0xb1,
-    0xfe,
-    0xc7,
-    0xcc,
-    0x4e,
-    0x0b,
-    0x37,
-    0xf7,
-    0xa1,
-    0xd6,
-    0xcb,
-    0x9d,
-    0xc8,
-    0x57,
-    0xac,
-    0x16,
-    0x4a,
-    0x46,
-    0xbd,
-    0x86,
-    0x4d,
-    0x82,
-    0x74,
-    0x5f,
-    0x0a,
-    0xb3,
-    0xe9,
-    0x27,
-    0x7f,
-    0x2e,
-    0x2c,
-    0x7c,
-    0x63,
-    0x1a,
-    0xdc,
-    0x55,
-    0x5f,
-    0xd1,
-    0xf5,
-    0x8a,
-    0x7b,
-    0x89,
-    0xea,
-    0x97,
-    0xd7,
-    0x34,
-    0xf4,
-    0x9d,
-    0x9b,
-    0xa5,
-    0xa9,
-    0xa9,
-    0x30,
-    0xf3,
-    0xd0,
-    0x39,
-    0xb1,
-    0x22,
-    0x74,
-    0xfc,
-    0x9c,
-    0x00,
-    0x37,
-    0xda,
-    0xce,
-    0x4e,
-    0xe9,
-    0x34,
-    0xae,
-    0x20,
-    0x59,
-    0x6d,
-    0xa8,
-    0x87,
-    0x6b,
-    0xa9,
-    0xdd,
-    0x6c,
-    0x6b,
-    0xd4,
-    0x18,
-    0xbf,
-    0xa1,
-    0xe7,
-    0x04,
-    0xd2,
-    0x26,
-    0x66,
-    0x9d,
-    0xff,
-    0xf6,
-    0x2d,
-    0xe5,
-    0x91,
-    0x45,
-    0x6d,
-    0xd8,
-    0xe2,
-    0x17,
-    0xf2,
-    0xa1,
-    0xc0,
-    0x0b,
-    0xa7,
-    0x0e,
-    0x15,
-    0x77,
-    0x5b,
-    0x42,
-    0xc7,
-    0xba,
-    0xc5,
-    0xaa,
-    0xde,
-    0xce,
-    0xc6,
-    0x32,
-    0xe5,
-    0x1d,
-    0xef,
-    0xb8,
-    0x92,
-    0x96,
-    0x43,
-    0xc0,
-    0xa9,
-    0xff,
-    0x3e,
-    0x6a,
-    0x1d,
-    0x8d,
-    0x16,
-    0xa2,
-    0x78,
-    0xb2,
-    0x40,
-    0x97,
-    0x7e,
-    0x36,
-    0x36,
-    0x6e,
-    0x0d,
-    0x89,
-    0x78,
-    0x37,
-    0x48,
-    0x58,
-    0xd0,
-    0x20,
-    0xf5,
-    0x5e,
-    0xdb,
-    0xe8,
-    0x22,
-    0x7d,
-    0xc5,
-    0x97,
-    0x0f,
-    0x0d,
-    0x54,
-    0x6d,
-    0x48,
-    0x74,
-    0x28,
-    0x18,
-    0x12,
-    0xf6,
-    0x41,
-    0x2a,
-    0x08,
-    0xcf,
-    0xc1,
-    0xc9,
-    0x06,
-    0x7f,
-    0xf3,
-    0xa8,
-    0x46,
-    0x66,
-    0x8d,
-    0x37,
-    0xc9,
-    0x90,
-    0x32,
-    0x17,
-    0xf9,
-    0xd2,
-    0x3b,
-    0xd1,
-    0x8c,
-    0x16,
-    0xb7,
-    0xc7,
-    0xab,
-    0xf3,
-    0xb0,
-    0x6b,
-    0x54,
-    0x81,
-    0xb1,
-    0xae,
-    0xfd,
-    0x6b,
-    0x84,
-    0xbc,
-    0x7a,
-    0x45,
-    0x40,
-    0xe6,
-    0x20,
-    0x20,
-    0x84,
-    0xdf,
-    0x2b,
-    0x5c,
-    0xfd,
-    0x2c,
-    0x5d,
-    0xbe,
-    0x2e,
-    0xd6,
-    0xe8,
-    0xc2,
-    0x70,
-    0x62,
-    0x8e,
-    0x33,
-    0x37,
-    0x02,
-    0x07,
-    0xf8,
-    0x98,
-    0x0d,
-    0xa3,
-    0x31,
-    0x08,
-    0xad,
-    0x30,
-    0x83,
-    0x67,
-    0xd8,
-    0x1e,
-    0xaf,
-    0x3d,
-    0x81,
-    0xe1,
-    0x6a,
-    0x43,
-    0x0f,
-    0x97,
-    0x69,
-    0x25,
-    0x0e,
-    0xeb,
-    0xbb,
-    0x86,
-    0x24,
-    0x39,
-    0x5b,
-    0x44,
-    0x47,
-    0xf3,
-    0x06,
-    0xfe,
-    0x2e,
-    0x43,
-    0x4a,
-    0xd4,
-    0x05,
-    0xf1,
-    0xe0,
-    0x6e,
-    0x65,
-    0x88,
-    0x3b,
-    0x40,
-    0x83,
-    0xb4,
-    0x61,
-    0x0c,
-    0xa8,
-    0xef,
-    0xfa,
-    0xa8,
-    0xe1,
-    0x5c,
-    0xa6,
-    0x01,
-    0xf7,
-    0xf3,
-    0x94,
-    0x60,
-    0xa1,
-    0xdf,
-    0x51,
-    0xec,
-    0xf9,
-    0x24,
-    0xdd,
-    0x71,
-    0x2d,
-    0x85,
-    0x04,
-    0x5f,
-    0x77,
-    0xa5,
-    0xeb,
-    0x16,
-    0x4f,
-    0x6c,
-    0xea,
-    0x60,
-    0xdf,
-    0xac,
-    0x99,
-    0x3f,
-    0xb7,
-    0x05,
-    0x2e,
-    0xea,
-    0xc2,
-    0x06,
-    0x06,
-    0x12,
-    0x78,
-    0x94,
-    0x81,
-    0x69,
-    0x56,
-    0x90,
-    0x13,
-    0x65,
-    0x8b,
-    0xb4,
-    0x98,
-    0x41,
-    0xf5,
-    0xbe,
-    0xe8,
-    0x46,
-    0x4b,
-    0xd1,
-    0xac,
-    0x48,
-    0x9c,
-    0x18,
-    0x70,
-    0x73,
-    0xf8,
-    0xac,
-    0xf9,
-    0x48,
-    0x6d,
-    0xb8,
-    0xd8,
-    0xe2,
-    0x35,
-    0xdb,
-    0x3f,
-    0x7e,
-    0x2d,
-    0xcd,
-    0x14,
-    0x3a,
-    0x89,
-    0x46,
-    0x44,
-    0x1d,
-    0xc6,
-    0x1b,
-    0x5a,
-    0x58,
-    0xe1,
-    0xaa,
-    0x50,
-    0xcb,
-    0xc7,
-    0x79,
-    0xa4,
-    0xcb,
-    0x0c,
-    0x1a,
-    0xaf,
-    0x23,
-    0xdf,
-    0x52,
-    0x33,
-    0x58,
-    0x3e,
-    0x7a,
-    0x33,
-    0x32,
-    0x66,
-    0x24,
-    0x07,
-    0x77,
-    0x8e,
-    0x02,
-    0xaf,
-    0xfa,
-    0xd4,
-    0x04,
-    0x68,
-    0xd4,
-    0x78,
-    0xc1,
-    0x7d,
-    0xf2,
-    0x48,
-    0x18,
-    0x60,
-    0xd0,
-    0x5b,
-    0x17,
-    0xf9,
-    0x83,
-    0x02,
-    0x1b,
-    0x3e,
-    0xfd,
-    0xfc,
-    0x39,
-    0x04,
-    0x8d,
-    0xe9,
-    0xdd,
-    0x14,
-    0xa5,
-    0x01,
-    0xb1,
-    0x82,
-    0xe0,
-    0x06,
-    0xc1,
-    0x3a,
-    0x43,
-    0x77,
-    0xdc,
-    0xdc,
-    0xc4,
-    0x07,
-    0x3d,
-    0xca,
-    0x08,
-    0x4e,
-    0x6b,
-    0x7f,
-    0x71,
-    0xbd,
-    0x5d,
-    0x22,
-    0x58,
-    0xd7,
-    0xe2,
-    0x5a,
-    0x97,
-    0x9e,
-    0x40,
-    0x65,
-    0x4b,
-    0x4c,
-    0x1b,
-    0x64,
-    0xd8,
-    0x44,
-    0x99,
-    0xf9,
-    0x2d,
-    0x48,
-    0xc4,
-    0x14,
-    0x49,
-    0xec,
-    0x30,
-    0x0a,
-    0xfd,
-    0x4b,
-    0xdd,
-    0xe8,
-    0xf4,
-    0xf8,
-    0x5e,
-    0x06,
-    0xf2,
-    0x38,
-    0x3b,
-    0xdf,
-    0x59,
-    0x6e,
-    0x95,
-    0x1f,
-    0xf1,
-    0xd6,
-    0x08,
-    0xfe,
-    0xe8,
-    0x76,
-    0xd6,
-    0xcd,
-    0x18,
-    0x52,
-    0x41,
-    0xce,
-    0x89,
-    0xe0,
-    0x38,
-    0x49,
-    0x37,
-    0xbb,
-    0x36,
-    0xdc,
-    0x15,
-    0x9b,
-    0x68,
-    0x13,
-    0x51,
-    0x85,
-    0x0e,
-    0x39,
-    0xda,
-    0x3f,
-    0x23,
-    0x6d,
-    0x20,
-    0x07,
-    0x40,
-    0xf8,
-    0x1b,
-    0x84,
-    0xbe,
-    0xdd,
-    0x8e,
-    0xfd,
-    0x1b,
-    0xb2,
-    0x8d,
-    0xc9,
-    0x9e,
-    0xaf,
-    0x3d,
-    0x07,
-    0x3e,
-    0x05,
-    0xdb,
-    0x8f,
-    0xc1,
-    0x70,
-    0xff,
-    0x28,
-    0x21,
-    0x10,
-    0x22,
-    0xfb,
-    0x33,
-    0x75,
-    0x5e,
-    0x47,
-    0x8a,
-    0xf9,
-    0x76,
-    0x57,
-    0x9a,
-    0x52,
-    0x16,
-    0xb1,
-    0x19,
-    0x67,
-    0x5c,
-    0x91,
-    0xab,
-    0x63,
-    0x96,
-    0x95,
-    0xbd,
-    0x08,
-    0x4e,
-    0xba,
-    0xb1,
-    0x47,
-    0x84,
-    0x87,
-    0x3c,
-    0x0d,
-    0x3a,
-    0x88,
-    0x0d,
-    0x5f,
-    0x36,
-    0xfe,
-    0xb0,
-    0xa9,
-    0x03,
-    0xd5,
-    0xb1,
-    0x53,
-    0x39,
-    0xd6,
-    0x04,
-    0x96,
-    0xfe,
-    0x1e,
-    0xa4,
-    0x8e,
-    0xcd,
-    0xcf,
-    0x7b,
-    0x90,
-    0x76,
-    0x05,
-    0x82,
-    0xbd,
-    0x66,
-    0x0c,
-    0x29,
-    0xd7,
-    0x29,
-    0xd0,
-    0xf9,
-    0x54,
-    0x2d,
-    0x94,
-    0x78,
-    0xb1,
-    0xc9,
-    0xe7,
-    0x4d,
-    0x09,
-    0x7d,
-    0xd4,
-    0xa4,
-    0xe6,
-    0x7c,
-    0x5a,
-    0xd4,
-    0x57,
-    0x67,
-    0x1c,
-    0x3f,
-    0x43,
-    0x5c,
-    0x58,
-    0x7a,
-    0xfc,
-    0x2f,
-    0x1d,
-    0xaf,
-    0x17,
-    0xf7,
-    0xb9,
-    0x3f,
-    0x7c,
-    0xcd,
-    0x71,
-    0xab,
-    0xb9,
-    0xd0,
-    0x76,
-    0xb4,
-    0x9c,
-    0x6d,
-    0x14,
-    0xc1,
-    0x00,
-    0xdd,
-    0x2b,
-    0x82,
-    0xe7,
-    0xee,
-    0xe3,
-    0xd3,
-    0xc9,
-    0x07,
-    0x9c,
-    0xe3,
-    0x2c,
-    0x66,
-    0x24,
-    0x95,
-    0x75,
-    0xad,
-    0x2d,
-    0x26,
-    0xfe,
-    0x9d,
-    0xfe,
-    0x11,
-    0x68,
-    0x21,
-    0x68,
-    0x2f,
-    0x33,
-    0x8e,
-    0xfc,
-    0x23,
-    0x8b,
-    0x29,
-    0x7b,
-    0xf5,
-    0x65,
-    0xea,
-    0x8e,
-    0xfd,
-    0xcb,
-    0x7f,
-    0xb7,
-    0x03,
-    0x74,
-    0x94,
-    0x88,
-    0xa4,
-    0x98,
-    0x52,
-    0x13,
-    0xf7,
-    0x02,
-    0x25,
-    0xa1,
-    0x71,
-    0x67,
-    0xc3,
-    0xa7,
-    0x06,
-    0xf6,
-    0x6a,
-    0xf5,
-    0x91,
-    0x30,
-    0x68,
-    0x31,
-    0x76,
-    0xfa,
-    0xe1,
-    0x84,
-    0x86,
-    0xf1,
-    0xcd,
-    0x93,
-    0x23,
-    0xfd,
-    0x40,
-    0xb1,
-    0xa4,
-    0x29,
-    0xee,
-    0x52,
-    0xfb,
-    0xb2,
-    0xee,
-    0xc3,
-    0x94,
-    0x5d,
-    0xbe,
-    0x19,
-    0x81,
-    0x0e,
-    0x88,
-    0x68,
-    0xd5,
-    0x97,
-    0xa3,
-    0x35,
-    0x4d,
-    0xce,
-    0x5d,
-    0x2d,
-    0x36,
-    0xe2,
-    0xf8,
-    0x17,
-    0x8a,
-    0xef,
-    0xf2,
-    0x07,
-    0x5d,
-    0xcf,
-    0x8a,
-    0xd4,
-    0x77,
-    0x34,
-    0x7f,
-    0xcd,
-    0x43,
-    0xf3,
-    0x1b,
-    0xa8,
-    0xe8,
-    0xa3,
-    0x70,
-    0xbb,
-    0xb5,
-    0x67,
-    0xe2,
-    0x6f,
-    0xc2,
-    0x08,
-    0xe5,
-    0xf1,
-    0xd4,
-    0x47,
-    0x08,
-    0x2a,
-    0x82,
-    0x71,
-    0x33,
-    0xf2,
-    0x96,
-    0x33,
-    0x2c,
-    0x80,
-    0xb6,
-    0xb0,
-    0x60,
-    0x25,
-    0x44,
-    0xd1,
-    0xe1,
-    0x3b,
-    0x82,
-    0xdc,
-    0xab,
-    0x58,
-    0xfa,
-    0x49,
-    0x2b,
-    0xc7,
-    0x1d,
-    0xd1,
-    0x02,
-    0x38,
-    0x2a,
-    0xc7,
-    0x06,
-    0xb6,
-    0x51,
-    0xab,
-    0x89,
-    0xda,
-    0x19,
-    0xfd,
-    0xdf,
-    0x3e,
-    0xff,
-    0x4f,
-    0x1a,
-    0x35,
-    0x5f,
-    0x9e,
-    0x18,
-    0xb9,
-    0x98,
-    0xe2,
-    0xc0,
-    0xa5,
-    0x6c,
-    0xe4,
-    0x88,
-    0x25,
-    0xa5,
-    0x50,
-    0x3a,
-    0x6a,
-    0xfe,
-    0x0b,
-    0xf9,
-    0xa2,
-    0x40,
-    0xc6,
-    0x7f,
-    0x27,
-    0xac,
-    0xd4,
-    0xa8,
-    0xf6,
-    0x99,
-    0x38,
-    0x34,
-    0x64,
-    0x5e,
-    0x03,
-    0xc8,
-    0x0c,
-    0x72,
-    0xdd,
-    0x37,
-    0x0c,
-    0xd2,
-    0xe1,
-    0x00,
-    0x71,
-    0xa3,
-    0xae,
-    0x18,
-    0xef,
-    0x19,
-    0xba,
-    0xe9,
-    0xd6,
-    0x97,
-    0xea,
-    0x9a,
-    0x41,
-    0x18,
-    0x60,
-    0x91,
-    0x90,
-    0xcd,
-    0x95,
-    0x36,
-    0x19,
-    0x07,
-    0xa7,
-    0xfa,
-    0x1b,
-    0x58,
-    0xf4,
-    0x99,
-    0xf3,
-    0xf5,
-    0xe7,
-    0x9b,
-    0x93,
-    0x5f,
-    0x12,
-    0x21,
-    0x2f,
-    0x43,
-    0x7d,
-    0xde,
-    0x39,
-    0x9e,
-    0x3e,
-    0x64,
-    0x90,
-    0x24,
-    0x4a,
-    0xa1,
-    0xf5,
-    0xe3,
-    0x8b,
-    0xa9,
-    0xbe,
-    0x24,
-    0x33,
-    0xb6,
-    0xce,
-    0x92,
-    0x4f,
-    0x6c,
-    0xc4,
-    0x9e,
-    0x9f,
-    0x62,
-    0x73,
-    0x21,
-    0xa5,
-    0xdf,
-    0x93,
-    0x43,
-    0xfc,
-    0xe1,
-    0xb5,
-    0x9d,
-    0xeb,
-    0x64,
-    0x7d,
-    0x9a,
-    0x3a,
-    0xe0,
-    0x0b,
-    0x23,
-    0x44,
-    0x14,
-    0xba,
-    0x7b,
-    0x4e,
-    0x02,
-    0x0d,
-    0x67,
-    0x17,
-    0x3b,
-    0xe6,
-    0x93,
-    0xb0,
-    0x5c,
-    0xf9,
-    0x31,
-    0x8e,
-    0xd9,
-    0x81,
-    0xe3,
-    0xde,
-    0xf9,
-    0x31,
-    0xdb,
-    0x18,
-    0x22,
-    0x6e,
-    0x40,
-    0xd7,
-    0x57,
-    0xbb,
-    0xd4,
-    0xe8,
-    0xff,
-    0x75,
-    0xd5,
-    0xa1,
-    0xe8,
-    0xc0,
-    0x21,
-    0x74,
-    0x8b,
-    0xc1,
-    0x9d,
-    0xc4,
-    0x92,
-    0x0e,
-    0xd6,
-    0xf6,
-    0x97,
-    0x62,
-    0xe9,
-    0xcc,
-    0x2f,
-    0x96,
-    0xa1,
-    0xee,
-    0x27,
-    0xcc,
-    0xe0,
-    0xca,
-    0x0d,
-    0xee,
-    0x40,
-    0x9e,
-    0xf2,
-    0x57,
-    0xf9,
-    0xd3,
-    0x6f,
-    0xcf,
-    0x06,
-    0x8d,
-    0xe6,
-    0xbd,
-    0x83,
-    0x80,
-    0x0a,
-    0x98,
-    0x5a,
-    0x05,
-    0xa2,
-    0x9f,
-    0x1e,
-    0x6d,
-    0x8a,
-    0xca,
-    0x37,
-    0x95,
-    0xfa,
-    0x00,
-    0x40,
-    0xba,
-    0x0a,
-    0x8a,
-    0xad,
-    0x8f,
-    0x76,
-    0xc8,
-    0xb1,
-    0x8d,
-    0x9f,
-    0x22,
-    0x5f,
-    0x8b,
-    0xd3,
-    0x42,
-    0x0f,
-    0x8e,
-    0xce,
-    0x80,
-    0x03,
-    0xe2,
-    0x81,
-    0x9e,
-    0x4a,
-    0x6a,
-    0x12,
-    0xb6,
-    0xe5,
-    0x34,
-    0x23,
-    0x70,
-    0x29,
-    0x50,
-    0x57,
-    0x78,
-    0x64,
-    0xe3,
-    0x12,
-    0x30,
-    0xc3,
-    0x77,
-    0x81,
-    0xa2,
-    0x73,
-    0x95,
-    0xdb,
-    0xb8,
-    0x07,
-    0x96,
-    0xe6,
-    0xaf,
-    0x1a,
-    0xb6,
-    0xbc,
-    0xc9,
-    0x35,
-    0x6a,
-    0xcf,
-    0x42,
-    0xf3,
-    0xf4,
-    0x2b,
-    0x86,
-    0x62,
-    0x34,
-    0xfb,
-    0xa1,
-    0xad,
-    0xc1,
-    0x4f,
-    0xf7,
-    0xf8,
-    0x38,
-    0x1c,
-    0x35,
-    0x8c,
-    0xd4,
-    0x84,
-    0x87,
-    0x34,
-    0x3f,
-    0x58,
-    0x0c,
-    0xe6,
-    0xa8,
-    0xdc,
-    0x87,
-    0xa6,
-    0x16,
-    0xca,
-    0x57,
-    0xa8,
-    0xfc,
-    0x99,
-    0xa9,
-    0xb5,
-    0x0d,
-    0xfe,
-    0xec,
-    0xcf,
-    0x51,
-    0xb4,
-    0x85,
-    0x18,
-    0x79,
-    0x79,
-    0xc4,
-    0xf0,
-    0x70,
-    0x59,
-    0x17,
-    0x5e,
-    0x32,
-    0x2e,
-    0x7e,
-    0xb1,
-    0xe1,
-    0x68,
-    0x3f,
-    0x67,
-    0x16,
-    0x0a,
-    0xdb,
-    0x4d,
-    0x75,
-    0xf5,
-    0x40,
-    0xe8,
-    0x84,
-    0x69,
-    0x40,
-    0x14,
-    0xbd,
-    0xc9,
-    0x42,
-    0xeb,
-    0xe1,
-    0x9e,
-    0x38,
-    0xe8,
-    0x90,
-    0xdf,
-    0xd1,
-    0x4c,
-    0x17,
-    0x70,
-    0xef,
-    0xc1,
-    0x89,
-    0xe8,
-    0x5b,
-    0x3e,
-    0x11,
-    0x97,
-    0xb8,
-    0x2a,
-    0x86,
-    0xc8,
-    0xb5,
-    0xc4,
-    0x40,
-    0x43,
-    0x87,
-    0xc2,
-    0x2a,
-    0x16,
-    0x97,
-    0x38,
-    0x19,
-    0x95,
-    0x77,
-    0xbc,
-    0x5c,
-    0xa0,
-    0x1b,
-    0xc8,
-    0x95,
-    0x24,
-    0x46,
-    0x60,
-    0xc7,
-    0xe4,
-    0x42,
-    0xf4,
-    0xaf,
-    0x7a,
-    0xd4,
-    0x87,
-    0x58,
-    0x98,
-    0x6f,
-    0x11,
-    0xea,
-    0x94,
-    0xa8,
-    0x22,
-    0xc2,
-    0x24,
-    0xea,
-    0xc9,
-    0xc8,
-    0x66,
-    0x6b,
-    0xb4,
-    0xfd,
-    0x23,
-    0x5e,
-    0x98,
-    0x54,
-    0x54,
-    0x6b,
-    0xd4,
-    0xc3,
-    0xe5,
-    0x5c,
-    0x51,
-    0x99,
-    0xba,
-    0x19,
-    0xac,
-    0x12,
-    0xf0,
-    0xd6,
-    0x97,
-    0x29,
-    0x65,
-    0x8b,
-    0x7c,
-    0xad,
-    0x7a,
-    0xa4,
-    0x64,
-    0x97,
-    0x17,
-    0xfa,
-    0x18,
-    0x9b,
-    0xf0,
-    0x03,
-    0x85,
-    0xfd,
-    0x07,
-    0x45,
-    0x65,
-    0xa6,
-    0x72,
-    0x11,
-    0x1c,
-    0x77,
-    0x5f,
-    0x6d,
-    0xe0,
-    0xdd,
-    0x55,
-    0x52,
-    0x1d,
-    0xa6,
-    0xbd,
-    0x18,
-    0x18,
-    0x13,
-    0xa0,
-    0x2e,
-    0xd2,
-    0x2e,
-    0xb2,
-    0x0e,
-    0x2f,
-    0x5d,
-    0x90,
-    0x70,
-    0x57,
-    0x38,
-    0x46,
-    0xbe,
-    0x5d,
-    0x98,
-    0x14,
-    0xc9,
-    0x1f,
-    0xf0,
-    0x72,
-    0xba,
-    0x6d,
-    0xe1,
-    0x51,
-    0x4b,
-    0x6d,
-    0x08,
-    0xa4,
-    0x37,
-    0x3d,
-    0x1b,
-    0x1f,
-    0xee,
-    0xdb,
-    0x34,
-    0x3e,
-    0x8e,
-    0x42,
-    0x6c,
-    0x8a,
-    0x0f,
-    0xd6,
-    0xac,
-    0x18,
-    0xbd,
-    0x02,
-    0xc0,
-    0x52,
-    0xec,
-    0x20,
-    0xad,
-    0xf9,
-    0xe7,
-    0x99,
-    0x45,
-    0x6b,
-    0x29,
-    0x4d,
-    0xf8,
-    0x22,
-    0xd0,
-    0x35,
-    0xed,
-    0x7e,
-    0x4e,
-    0x46,
-    0x52,
-    0xc4,
-    0x62,
-    0x99,
-    0xf0,
-    0x66,
-    0x47,
-    0xca,
-    0x02,
-    0x85,
-    0x2b,
-    0x9e,
-    0x47,
-    0xb4,
-    0xe2,
-    0xe8,
-    0x56,
-    0xff,
-    0xdc,
-    0xad,
-    0x32,
-    0x2c,
-    0x54,
-    0x86,
-    0x1e,
-    0x40,
-    0xcb,
-    0x46,
-    0xb2,
-    0x45,
-    0xb5,
-    0xdd,
-    0x2f,
-    0x4b,
-    0x72,
-    0x7c,
-    0x10,
-    0xad,
-    0x7f,
-    0xfa,
-    0xe1,
-    0x95,
-    0xee,
-    0x77,
-    0x54,
-    0xc2,
-    0x13,
-    0x3f,
-    0x92,
-    0x89,
-    0x81,
-    0xf0,
-    0xcf,
-    0x1a,
-    0x35,
-    0xe0,
-    0x21,
-    0x05,
-    0x10,
-    0xb9,
-    0x92,
-    0xfd,
-    0x8b,
-    0x66,
-    0x74,
-    0xdb,
-    0xa6,
-    0x33,
-    0xf4,
-    0xe6,
-    0x21,
-    0x2f,
-    0xf2,
-    0x51,
-    0xef,
-    0xd5,
-    0x10,
-    0x05,
-    0xe8,
-    0xec,
-    0x09,
-    0xa1,
-    0xbe,
-    0xac,
-    0x45,
-    0xbf,
-    0x32,
-    0x22,
-    0xaa,
-    0x7a,
-    0x87,
-    0xd6,
-    0xb4,
-    0x2d,
-    0x37,
-    0xaa,
-    0xc8,
-    0x7c,
-    0xe6,
-    0x05,
-    0xc5,
-    0x99,
-    0x94,
-    0x31,
-    0xdd,
-    0xc0,
-    0x16,
-    0x02,
-    0xa3,
-    0x04,
-    0xc7,
-    0xb9,
-    0x64,
-    0x4e,
-    0x7b,
-    0x27,
-    0xbb,
-    0xa3,
-    0xb4,
-    0x16,
-    0x60,
-    0xa5,
-    0x19,
-    0xe4,
-    0x41,
-    0x5d,
-    0x23,
-    0x71,
-    0xd4,
-    0x37,
-    0x1a,
-    0x3c,
-    0xab,
-    0x4e,
-    0x40,
-    0xc8,
-    0x49,
-    0xea,
-    0x4c,
-    0x45,
-    0x34,
-    0x47,
-    0x19,
-    0x6c,
-    0x4b,
-    0x99,
-    0xa0,
-    0xab,
-    0x5a,
-    0x4c,
-    0x24,
-    0x82,
-    0xec,
-    0x90,
-    0xac,
-    0x2d,
-    0x60,
-    0x15,
-    0xb6,
-    0x83,
-    0x3f,
-    0x13,
-    0x2a,
-    0x1e,
-    0xcd,
-    0x8e,
-    0x8d,
-    0xbc,
-    0xde,
-    0xd8,
-    0x77,
-    0xe5,
-    0xeb,
-    0x57,
-    0x47,
-    0xce,
-    0x65,
-    0x88,
-    0x15,
-    0x7e,
-    0x49,
-    0x44,
-    0xe8,
-    0x2f,
-    0xf5,
-    0x43,
-    0x29,
-    0xf7,
-    0x3a,
-    0xde,
-    0x58,
-    0xa7,
-    0xb2,
-    0x19,
-    0xfe,
-    0xf4,
-    0x54,
-    0xe0,
-    0xe3,
-    0xd4,
-    0x45,
-    0x91,
-    0x80,
-    0x2b,
-    0xf1,
-    0xbb,
-    0xb7,
-    0xa7,
-    0x5b,
-    0x26,
-    0xc2,
-    0xe8,
-    0xb1,
-    0x13,
-    0x6a,
-    0xe5,
-    0x24,
-    0xc4,
-    0x79,
-    0x8b,
-    0xf7,
-    0x3f,
-    0x71,
-    0xa7,
-    0xd5,
-    0x50,
-    0x7e,
-    0x05,
-    0x67,
-    0xcd,
-    0xaa,
-    0xd9,
-    0x26,
-    0x1d,
-    0x50,
-    0x5f,
-    0x6e,
-    0xfb,
-    0xd3,
-    0xbf,
-    0xd4,
-    0x78,
-    0x8f,
-    0x33,
-    0xba,
-    0x3f,
-    0x10,
-    0x6b,
-    0x21,
-    0x1d,
-    0x82,
-    0x31,
-    0xbe,
-    0xc1,
-    0x69,
-    0x49,
-    0x4f,
-    0xc0,
-    0x93,
-    0x9b,
-    0x2f,
-    0xdc,
-    0x4a,
-    0x94,
-    0x28,
-    0x85,
-    0xce,
-    0xc9,
-    0x89,
-    0xa0,
-    0x02,
-    0xdd,
-    0x79,
-    0x88,
-    0x65,
-    0xa5,
-    0x8b,
-    0x52,
-    0x44,
-    0x8b,
-    0x93,
-    0x56,
-    0x2e,
-    0x30,
-    0xb7,
-    0xea,
-    0xa9,
-    0x56,
-    0xc9,
-    0x71,
-    0x23,
-    0xfc,
-    0xd4,
-    0x95,
-    0x2b,
-    0xca,
-    0xf4,
-    0xd0,
-    0xe1,
-    0xb0,
-    0x6b,
-    0x31,
-    0xab,
-    0xcb,
-    0xf2,
-    0x5d,
-    0x2a,
-    0x88,
-    0x4d,
-    0xd4,
-    0x6d,
-    0x0b,
-    0x22,
-    0x75,
-    0x64,
-    0xd2,
-    0x0b,
-    0x45,
-    0x97,
-    0x95,
-    0xea,
-    0x6c,
-    0x17,
-    0x71,
-    0x7d,
-    0x80,
-    0xb5,
-    0x46,
-    0x32,
-    0x06,
-    0x73,
-    0x5e,
-    0x3c,
-    0x36,
-    0x38,
-    0x4f,
-    0xe6,
-    0xff,
-    0xc8,
-    0x22,
-    0x27,
-    0x4b,
-    0xf2,
-    0xb4,
-    0x77,
-    0x84,
-    0x0c,
-    0x5d,
-    0xe2,
-    0x57,
-    0x9c,
-    0xd0,
-    0x5b,
-    0xb8,
-    0x58,
-    0x42,
-    0x52,
-    0x26,
-    0x51,
-    0xcf,
-    0x89,
-    0x30,
-    0x6b,
-    0x19,
-    0x23,
-    0x38,
-    0x10,
-    0x32,
-    0xfe,
-    0x77,
-    0x25,
-    0xbc,
-    0x42,
-    0x41,
-    0x3d,
-    0x4e,
-    0x3a,
-    0x8a,
-    0x0d,
-    0x1a,
-    0x63,
-    0xaa,
-    0x21,
-    0xcd,
-    0xc3,
-    0x5d,
-    0xcd,
-    0xb7,
-    0x7c,
-    0x0e,
-    0x65,
-    0x2c,
-    0xa1,
-    0x55,
-    0xb0,
-    0x2a,
-    0x48,
-    0xbe,
-    0x9b,
-    0x3b,
-    0xe1,
-    0xcc,
-    0x2b,
-    0x9d,
-    0xc6,
-    0x3d,
-    0xb5,
-    0xa1,
-    0x13,
-    0x90,
-    0x51,
-    0x51,
-    0xb7,
-    0xc5,
-    0x8c,
-    0x55,
-    0xcb,
-    0x64,
-    0x5d,
-    0x18,
-    0x23,
-    0xc0,
-    0x5b,
-    0x26,
-    0x23,
-    0x7d,
-    0x2c,
-    0xd9,
-    0xd4,
-    0x50,
-    0x41,
-    0x34,
-    0x37,
-    0x06,
-    0xc0,
-    0x0f,
-    0xda,
-    0xc8,
-    0xc2,
-    0x74,
-    0xa8,
-    0x9d,
-    0xbf,
-    0x4a,
-    0x05,
-    0x30,
-    0x46,
-    0x30,
-    0x1b,
-    0xd4,
-    0xf2,
-    0xac,
-    0x6e,
-    0xc5,
-    0x99,
-    0x85,
-    0xb7,
-    0xb0,
-    0xc6,
-    0x6d,
-    0xef,
-    0x76,
-    0x6a,
-    0xe3,
-    0xaa,
-    0x2e,
-    0xce,
-    0x58,
-    0xa6,
-    0x69,
-    0xcc,
-    0x91,
-    0xa4,
-    0xb9,
-    0x3f,
-    0x4c,
-    0x76,
-    0x74,
-    0xb8,
-    0x26,
-    0x5a,
-    0xb5,
-    0x73,
-    0xbc,
-    0x86,
-    0xa4,
-    0x89,
-    0x11,
-    0x04,
-    0xf7,
-    0x66,
-    0x30,
-    0xc0,
-    0xb9,
-    0x7e,
-    0x12,
-    0xe0,
-    0x4a,
-    0x3c,
-    0xc1,
-    0x53,
-    0xa8,
-    0x3b,
-    0xbe,
-    0xad,
-    0xec,
-    0xb9,
-    0xa0,
-    0x32,
-    0x18,
-    0x49,
-    0xff,
-    0x30,
-    0x0f,
-    0xc7,
-    0x90,
-    0x93,
-    0xe5,
-    0x91,
-    0x91,
-    0xb3,
-    0x59,
-    0xf4,
-    0x68,
-    0x70,
-    0xa0,
-    0xe5,
-    0x87,
-    0x81,
-    0x65,
-    0xf2,
-    0x92,
-    0x09,
-    0x0d,
-    0x78,
-    0xc4,
-    0x6b,
-    0x3f,
-    0x15,
-    0x8f,
-    0x60,
-    0xa4,
-    0x60,
-    0x82,
-    0x47,
-    0xeb,
-    0xd8,
-    0x70,
-    0xbc,
-    0x11,
-    0x1b,
-    0xcf,
-    0x6b,
-    0xdf,
-    0x59,
-    0x5e,
-    0x26,
-    0xb4,
-    0x07,
-    0x0b,
-    0x36,
-    0x84,
-    0xd8,
-    0x13,
-    0xef,
-    0x21,
-    0xe9,
-    0x6b,
-    0x88,
-    0xb9,
-    0x3b,
-    0x5f,
-    0x29,
-    0xa0,
-    0x67,
-    0x79,
-    0x44,
-    0x50,
-    0x8d,
-    0xa4,
-    0x29,
-    0xaf,
-    0x8e,
-    0x91,
-    0xd5,
-    0x90,
-    0x7b,
-    0x5a,
-    0x0b,
-    0x7b,
-    0x4d,
-    0x65,
-    0xa7,
-    0xb1,
-    0xd6,
-    0x8c,
-    0x2e,
-    0x6b,
-    0xf7,
-    0x7a,
-    0xa9,
-    0x63,
-    0x14,
-    0x58,
-    0xb4,
-    0x95,
-    0xc5,
-    0xaa,
-    0xd2,
-    0x47,
-    0xce,
-    0x73,
-    0x03,
-    0x47,
-    0x52,
-    0xa0,
-    0x99,
-    0x74,
-    0x43,
-    0xa3,
-    0x47,
-    0x7f,
-    0x1d,
-    0x5f,
-    0x7b,
-    0xf3,
-    0xd4,
-    0x44,
-    0xed,
-    0x73,
-    0x0a,
-    0xbb,
-    0x78,
-    0x43,
-    0x86,
-    0xc4,
-    0x2a,
-    0x0b,
-    0xe2,
-    0xdd,
-    0x97,
-    0xd7,
-    0x83,
-    0x27,
-    0x72,
-    0x61,
-    0xcf,
-    0xc4,
-    0x5e,
-    0x93,
-    0x99,
-    0x83,
-    0x01,
-    0x48,
-    0xe0,
-    0xbf,
-    0x5a,
-    0x53,
-    0xba,
-    0x84,
-    0x55,
-    0xc2,
-    0x8b,
-    0xf4,
-    0x9d,
-    0x64,
-    0x7a,
-    0xe9,
-    0xb2,
-    0x88,
-    0x26,
-    0xdc,
-    0x3b,
-    0x08,
-    0x94,
-    0x06,
-    0x9d,
-    0x86,
-    0x6d,
-    0xc4,
-    0xcc,
-    0xf6,
-    0x66,
-    0x40,
-    0x62,
-    0x5c,
-    0xff,
-    0x4e,
-    0xee,
-    0xd7,
-    0x70,
-    0x94,
-    0x8e,
-    0xdf,
-    0xe0,
-    0xee,
-    0xc0,
-    0xcb,
-    0xd9,
-    0x11,
-    0x75,
-    0x96,
-    0xf9,
-    0x6e,
-    0x67,
-    0xe2,
-    0xea,
-    0x59,
-    0xad,
-    0x3d,
-    0x94,
-    0x6a,
-    0x8c,
-    0xa4,
-    0x90,
-    0x23,
-    0x91,
-    0x45,
-    0xe0,
-    0xd4,
-    0xdc,
-    0x89,
-    0xde,
-    0xbc,
-    0xbf,
-    0x52,
-    0x73,
-    0x71,
-    0x88,
-    0x82,
-    0x89,
-    0x82,
-    0x9a,
-    0xbc,
-    0xc3,
-    0x5a,
-    0xc3,
-    0x6e,
-    0x6b,
-    0x67,
-    0xc9,
-    0x0f,
-    0xac,
-    0x7c,
-    0x46,
-    0xa5,
-    0x01,
-    0x74,
-    0xb6,
-    0x8b,
-    0xed,
-    0x19,
-    0xcf,
-    0x71,
-    0xed,
-    0x44,
-    0x11,
-    0xa4,
-    0xab,
-    0x45,
-    0x9d,
-    0x90,
-    0x74,
-    0x84,
-    0x4a,
-    0x83,
-    0xec,
-    0x69,
-    0xf6,
-    0xb3,
-    0x00,
-    0x7a,
-    0x1a,
-    0x83,
-    0x1d,
-    0xc3,
-    0xa1,
-    0x02,
-    0x9f,
-    0x7b,
-    0xfb,
-    0xb4,
-    0x8d,
-    0xe4,
-    0x6d,
-    0x96,
-    0x83,
-    0x73,
-    0xab,
-    0x5c,
-    0xef,
-    0x31,
-    0xa8,
-    0xfd,
-    0x80,
-    0x61,
-    0xad,
-    0x71,
-    0xdc,
-    0x63,
-    0xa9,
-    0xb9,
-    0x92,
-    0xd8,
-    0xc8,
-    0x21,
-    0x4f,
-    0x07,
-    0x46,
-    0xc2,
-    0x54,
-    0x80,
-    0x86,
-    0x4a,
-    0x27,
-    0xfe,
-    0x5e,
-    0x00,
-    0x89,
-    0x92,
-    0xb5,
-    0x02,
-    0xa9,
-    0xfe,
-    0x51,
-    0xd1,
-    0x97,
-    0x5f,
-    0xea,
-    0x10,
-    0xfb,
-    0x10,
-    0x83,
-    0x89,
-    0x07,
-    0xca,
-    0xfa,
-    0x71,
-    0xaa,
-    0x10,
-    0xdd,
-    0xed,
-    0x07,
-    0xca,
-    0x7f,
-    0xd5,
-    0x25,
-    0x30,
-    0x4b,
-    0xb7,
-    0xe8,
-    0xe9,
-    0x59,
-    0x1f,
-    0x40,
-    0x74,
-    0x3f,
-    0x15,
-    0xa0,
-    0xc8,
-    0x2a,
-    0xe8,
-    0xb2,
-    0x37,
-    0x2d,
-    0x2a,
-    0x49,
-    0x98,
-    0xd8,
-    0xfc,
-    0x97,
-    0xa5,
-    0x0d,
-    0x8c,
-    0xa0,
-    0xa2,
-    0x0f,
-    0xdb,
-    0xee,
-    0x40,
-    0xdc,
-    0xc4,
-    0x86,
-    0xc0,
-    0xbd,
-    0x3a,
-    0x1c,
-    0x5b,
-    0x1b,
-    0xd1,
-    0x83,
-    0xe2,
-    0x94,
-    0x7f,
-    0x67,
-    0xa2,
-    0x4e,
-    0xa4,
-    0x3e,
-    0x8a,
-    0x8b,
-    0x49,
-    0x7c,
-    0x90,
-    0x7e,
-    0xa5,
-    0x06,
-    0x50,
-    0x5e,
-    0xe6,
-    0xea,
-    0xf6,
-    0xb8,
-    0x2e,
-    0x4d,
-    0x5f,
-    0x09,
-    0xdb,
-    0xa5,
-    0x7b,
-    0x8c,
-    0x0b,
-    0x28,
-    0xf6,
-    0x51,
-    0x5f,
-    0x83,
-    0x17,
-    0x8f,
-    0x00,
-    0xd0,
-    0xe8,
-    0x3b,
-    0xe0,
-    0xc2,
-    0x97,
-    0xd9,
-    0x43,
-    0x23,
-    0x1c,
-    0x93,
-    0x7d,
-    0x81,
-    0x1c,
-    0x88,
-    0xfd,
-    0x24,
-    0x0d,
-    0x66,
-    0x8a,
-    0x43,
-    0x9c,
-    0x3b,
-    0xcd,
-    0x77,
-    0x4b,
-    0x88,
-    0x10,
-    0x6f,
-    0x5f,
-    0x98,
-    0x45,
-    0xe6,
-    0xf9,
-    0x0f,
-    0x4a,
-    0xd2,
-    0x83,
-    0xc6,
-    0x6b,
-    0xde,
-    0x4d,
-    0xd6,
-    0x29,
-    0x1b,
-    0x78,
-    0xf3,
-    0x39,
-    0xf2,
-    0x14,
-    0xfc,
-    0xd0,
-    0x5e,
-    0x85,
-    0xcf,
-    0x1e,
-    0x58,
-    0x2b,
-    0x62,
-    0x18,
-    0x92,
-    0x42,
-    0x10,
-    0x7b,
-    0x67,
-    0x06,
-    0x30,
-    0x0e,
-    0x12,
-    0x1b,
-    0xec,
-    0x27,
-    0x1f,
-    0x2d,
-    0x51,
-    0x70,
-    0x20,
-    0xd4,
-    0xa2,
-    0xeb,
-    0xa1,
-    0xba,
-    0xf2,
-    0x34,
-    0x5e,
-    0xff,
-    0xf1,
-    0x07,
-    0xb3,
-    0xdc,
-    0x07,
-    0x01,
-    0x53,
-    0x87,
-    0x9f,
-    0xab,
-    0x3d,
-    0x57,
-    0xc6,
-    0xb4,
-    0xec,
-    0x29,
-    0xf4,
-    0x7e,
-    0xce,
-    0x02,
-    0x29,
-    0xdd,
-    0xf8,
-    0xf6,
-    0x3c,
-    0x1b,
-    0x18,
-    0x48,
-    0x70,
-    0x3f,
-    0xab,
-    0xd2,
-    0x49,
-    0x8e,
-    0x70,
-    0xa7,
-    0x9e,
-    0x53,
-    0x1c,
-    0xf8,
-    0xee,
-    0xdc,
-    0x4f,
-    0x34,
-    0xf8,
-    0xc5,
-    0xc7,
-    0x73,
-    0x85,
-    0x79,
-    0xd4,
-    0x15,
-    0x89,
-    0xf5,
-    0x0b,
-    0xa6,
-    0x6a,
-    0xcf,
-    0x3f,
-    0x05,
-    0xa0,
-    0x77,
-    0xad,
-    0xc6,
-    0x7e,
-    0xbe,
-    0x77,
-    0xd4,
-    0x4f,
-    0x94,
-    0x54,
-    0x5b,
-    0xa5,
-    0x16,
-    0x85,
-    0xe5,
-    0xee,
-    0xc8,
-    0x0b,
-    0xc3,
-    0x48,
-    0x1e,
-    0x17,
-    0xae,
-    0x97,
-    0x42,
-    0xc2,
-    0xae,
-    0xd4,
-    0x11,
-    0xfe,
-    0x3b,
-    0xa8,
-    0x66,
-    0xcc,
-    0xa2,
-    0x39,
-    0x9c,
-    0xb0,
-    0xab,
-    0x44,
-    0x4e,
-    0x62,
-    0x79,
-    0x6c,
-    0x61,
-    0xc7,
-    0xb1,
-    0xd1,
-    0x45,
-    0x1f,
-    0xdf,
-    0xe5,
-    0x77,
-    0x80,
-    0x15,
-    0x7b,
-    0x4b,
-    0x83,
-    0xd5,
-    0x21,
-    0xe8,
-    0x3d,
-    0x30,
-    0xb0,
-    0x94,
-    0x71,
-    0x30,
-    0x21,
-    0x32,
-    0x03,
-    0x74,
-    0xa2,
-    0x08,
-    0xb0,
-    0x1a,
-    0xe9,
-    0xc6,
-    0xfd,
-    0xe2,
-    0xc9,
-    0xc4,
-    0x6d,
-    0x8f,
-    0x03,
-    0x8c,
-    0xf7,
-    0x91,
-    0x5e,
-    0x98,
-    0xb7,
-    0xe2,
-    0xfa,
-    0x5d,
-    0xe4,
-    0x2e,
-    0xe1,
-    0x88,
-    0x02,
-    0x36,
-    0xdf,
-    0x87,
-    0x59,
-    0x76,
-    0x94,
-    0x4b,
-    0xa5,
-    0x05,
-    0xc7,
-    0x4c,
-    0x0f,
-    0xbe,
-    0xfd,
-    0xce,
-    0x5c,
-    0x9d,
-    0x4a,
-    0x63,
-    0x65,
-    0x6b,
-    0x68,
-    0xb2,
-    0xc7,
-    0x9e,
-    0x06,
-    0x76,
-    0xdb,
-    0x7b,
-    0x62,
-    0xca,
-    0xe9,
-    0x7d,
-    0x1a,
-    0xa3,
-    0x98,
-    0xfa,
-    0x40,
-    0x9e,
-    0xa9,
-    0x04,
-    0xac,
-    0xfc,
-    0xe5,
-    0x8e,
-    0x96,
-    0xea,
-    0x54,
-    0xcf,
-    0x64,
-    0x06,
-    0xb0,
-    0xec,
-    0xc0,
-    0x20,
-    0x19,
-    0xd1,
-    0xee,
-    0x3d,
-    0x0a,
-    0x5f,
-    0x5c,
-    0xe2,
-    0x8c,
-    0xcd,
-    0x7b,
-    0x8f,
-    0xaa,
-    0x48,
-    0xce,
-    0x89,
-    0x24,
-    0xdd,
-    0x41,
-    0xdc,
-    0x68,
-    0x99,
-    0xbb,
-    0xa1,
-    0xbd,
-    0xef,
-    0xf6,
-    0x7d,
-    0xc2,
-    0x59,
-    0x8f,
-    0x6a,
-    0x17,
-    0x42,
-    0x59,
-    0xba,
-    0x5a,
-    0x24,
-    0xf7,
-    0x59,
-    0x55,
-    0xee,
-    0xaa,
-    0x52,
-    0x75,
-    0xa8,
-    0x67,
-    0x94,
-    0x7e,
-    0x59,
-    0x2d,
-    0xf7,
-    0x7e,
-    0x29,
-    0x95,
-    0x7a,
-    0x00,
-    0xc3,
-    0xab,
-    0xce,
-    0x81,
-    0xfd,
-    0xfc,
-    0x19,
-    0x28,
-    0xbb,
-    0xf0,
-    0xf4,
-    0xb1,
-    0x10,
-    0x5a,
-    0xb5,
-    0xab,
-    0xa7,
-    0x4e,
-    0xf4,
-    0xe3,
-    0x62,
-    0x33,
-    0x48,
-    0x20,
-    0x40,
-    0x18,
-    0x52,
-    0x10,
-    0x84,
-    0x4c,
-    0xfd,
-    0x83,
-    0x14,
-    0x28,
-    0x03,
-    0xd7,
-    0x1f,
-    0x30,
-    0xb4,
-    0xb3,
-    0x02,
-    0x5b,
-    0xf3,
-    0xf9,
-    0x6d,
-    0xae,
-    0x81,
-    0xf5,
-    0xc1,
-    0x0f,
-    0x7e,
-    0xdb,
-    0xbd,
-    0x59,
-    0x2c,
-    0x70,
-    0x5a,
-    0xac,
-    0xf7,
-    0x07,
-    0xf3,
-    0x07,
-    0xb2,
-    0xaf,
-    0xa9,
-    0x18,
-    0x24,
-    0xab,
-    0x06,
-    0x52,
-    0xc3,
-    0x22,
-    0xe1,
-    0x41,
-    0xbf,
-    0x18,
-    0x81,
-    0x1a,
-    0x42,
-    0x9d,
-    0x05,
-    0x97,
-    0xf7,
-    0x44,
-    0x02,
-    0x01,
-    0xc9,
-    0xd7,
-    0x6f,
-    0x8e,
-    0xed,
-    0x49,
-    0xbe,
-    0xee,
-    0x22,
-    0xec,
-    0x4c,
-    0x21,
-    0x37,
-    0xe4,
-    0xfb,
-    0x8b,
-    0xce,
-    0xdc,
-    0x1d,
-    0x4a,
-    0x61,
-    0xf8,
-    0x95,
-    0xc7,
-    0x82,
-    0x0a,
-    0x38,
-    0x8b,
-    0x67,
-    0x08,
-    0x7a,
-    0x55,
-    0xa5,
-    0xbe,
-    0x46,
-    0x69,
-    0x3c,
-    0xc0,
-    0x2d,
-    0x2a,
-    0xd4,
-    0xa3,
-    0xc3,
-    0xeb,
-    0x46,
-    0x6c,
-    0x46,
-    0x03,
-    0x5e,
-    0x49,
-    0x81,
-    0x1f,
-    0xe0,
-    0x7f,
-    0xf0,
-    0xdd,
-    0xc8,
-    0xa4,
-    0x25,
-    0x96,
-    0xd6,
-    0x0e,
-    0x6a,
-    0x7a,
-    0x4a,
-    0x8b,
-    0xa8,
-    0xe3,
-    0xed,
-    0x52,
-    0x88,
-    0xe3,
-    0x50,
-    0x3a,
-    0xd7,
-    0x1f,
-    0x58,
-    0x2a,
-    0x2f,
-    0xe1,
-    0xfa,
-    0xd1,
-    0xd4,
-    0x68,
-    0x44,
-    0x97,
-    0xdc,
-    0x83,
-    0x9d,
-    0xd3,
-    0x93,
-    0x5e,
-    0x4d,
-    0x3e,
-    0x1d,
-    0x9b,
-    0x40,
-    0xa8,
-    0x5d,
-    0xa4,
-    0x06,
-    0xe9,
-    0x16,
-    0x40,
-    0x1f,
-    0x1b,
-    0x50,
-    0x65,
-    0x76,
-    0x06,
-    0xfe,
-    0x4e,
-    0x2b,
-    0xdc,
-    0xdd,
-    0xcc,
-    0x95,
-    0x27,
-    0x9f,
-    0xe1,
-    0x88,
-    0xff,
-    0x49,
-    0x8b,
-    0xd3,
-    0x80,
-    0xda,
-    0xde,
-    0x0d,
-    0x7b,
-    0x2d,
-    0x55,
-    0x92,
-    0x6c,
-    0x20,
-    0x6a,
-    0xc8,
-    0xac,
-    0xf6,
-    0x64,
-    0xa7,
-    0xe8,
-    0xfa,
-    0x71,
-    0x78,
-    0xd2,
-    0x65,
-    0xf4,
-    0xdc,
-    0x16,
-    0x82,
-    0x20,
-    0x11,
-    0x90,
-    0x10,
-    0xc6,
-    0x71,
-    0xbc,
-    0xe8,
-    0x6b,
-    0x3b,
-    0x6e,
-    0xe0,
-    0x9e,
-    0x96,
-    0xc3,
-    0xee,
-    0x89,
-    0xd3,
-    0x57,
-    0x91,
-    0xc5,
-    0xf3,
-    0xb8,
-    0x6c,
-    0x73,
-    0x69,
-    0x1b,
-    0x34,
-    0x88,
-    0x21,
-    0x4e,
-    0xcd,
-    0x68,
-    0xc0,
-    0xee,
-    0xb0,
-    0xb7,
-    0x2e,
-    0xda,
-    0x90,
-    0x6b,
-    0x52,
-    0xe7,
-    0x3d,
-    0x26,
-    0x1c,
-    0xd6,
-    0xc8,
-    0xc4,
-    0xc9,
-    0x83,
-    0xe8,
-    0x2f,
-    0x62,
-    0x5e,
-    0x9c,
-    0x7b,
-    0x86,
-    0x1f,
-    0x12,
-    0x2f,
-    0x6a,
-    0xb6,
-    0xc8,
-    0xe0,
-    0x1e,
-    0x81,
-    0xf1,
-    0x05,
-    0x12,
-    0xc2,
-    0x1a,
-    0x06,
-    0xd8,
-    0x50,
-    0x0d,
-    0x96,
-    0x2b,
-    0x8d,
-    0xf6,
-    0x43,
-    0x31,
-    0x97,
-    0xc4,
-    0x4b,
-    0xfd,
-    0xc3,
-    0xd2,
-    0xb2,
-    0x58,
-    0x47,
-    0xc7,
-    0x91,
-    0xc1,
-    0x36,
-    0xbb,
-    0xb1,
-    0xb2,
-    0xb2,
-    0x9b,
-    0x58,
-    0x25,
-    0x5d,
-    0xce,
-    0x63,
-    0x57,
-    0x10,
-    0x18,
-    0x95,
-    0xcc,
-    0xd0,
-    0xbf,
-    0x2f,
-    0x93,
-    0xfd,
-    0xed,
-    0xc1,
-    0xcb,
-    0xcd,
-    0x56,
-    0x3f,
-    0x66,
-    0xf9,
-    0x1a,
-    0x57,
-    0x2d,
-    0xb6,
-    0xed,
-    0x02,
-    0x04,
-    0xe7,
-    0x75,
-    0x5a,
-    0x70,
-    0x91,
-    0xf3,
-    0xab,
-    0x56,
-    0x8f,
-    0x26,
-    0xcc,
-    0x06,
-    0x87,
-    0x6d,
-    0xb0,
-    0x77,
-    0x1c,
-    0x2b,
-    0x38,
-    0xd4,
-    0x65,
-    0x6f,
-    0x4b,
-    0x38,
-    0x9e,
-    0xd5,
-    0x29,
-    0xb7,
-    0x1e,
-    0xa7,
-    0xfc,
-    0x9d,
-    0x89,
-    0x48,
-    0xb1,
-    0xfa,
-    0x47,
-    0xd3,
-    0x05,
-    0x5e,
-    0x35,
-    0xff,
-    0xe3,
-    0xe1,
-    0x9a,
-    0x46,
-    0xed,
-    0x66,
-    0x5c,
-    0x46,
-    0x59,
-    0x21,
-    0x74,
-    0x67,
-    0xfe,
-    0x57,
-    0x9f,
-    0xbe,
-    0xae,
-    0x65,
-    0x56,
-    0x31,
-    0xc7,
-    0x04,
-    0x01,
-    0xdc,
-    0x05,
-    0xcb,
-    0x68,
-    0xb4,
-    0x9a,
-    0xf6,
-    0x6a,
-    0x6a,
-    0x81,
-    0x65,
-    0xf1,
-    0x93,
-    0x0f,
-    0xe8,
-    0x25,
-    0x05,
-    0xcb,
-    0xb9,
-    0xe0,
-    0x84,
-    0x7f,
-    0x4a,
-    0x62,
-    0x9e,
-    0x8f,
-    0x41,
-    0x47,
-    0xd3,
-    0x8a,
-    0xc1,
-    0xb6,
-    0xf9,
-    0xff,
-    0xec,
-    0xda,
-    0xdf,
-    0x92,
-    0xa6,
-    0x96,
-    0x31,
-    0x4e,
-    0x9b,
-    0x74,
-    0x9b,
-    0x3d,
-    0x83,
-    0xdf,
-    0x31,
-    0x36,
-    0xa5,
-    0x93,
-    0x0f,
-    0xf7,
-    0x99,
-    0x51,
-    0x3c,
-    0x74,
-    0x53,
-    0xd7,
-    0xd5,
-    0x6e,
-    0x5d,
-    0x0f,
-    0x67,
-    0x46,
-    0x64,
-    0x87,
-    0x9c,
-    0x14,
-    0xf6,
-    0x21,
-    0x1a,
-    0xf4,
-    0x8a,
-    0x0c,
-    0xa8,
-    0xa0,
-    0xc1,
-    0xf2,
-    0x92,
-    0x44,
-    0xeb,
-    0x73,
-    0x4f,
-    0x8d,
-    0xcd,
-    0xd3,
-    0x62,
-    0x03,
-    0xa2,
-    0xef,
-    0x7e,
-    0x9a,
-    0x5f,
-    0x76,
-    0xed,
-    0x83,
-    0x3b,
-    0x55,
-    0x33,
-    0x48,
-    0x6f,
-    0x73,
-    0xee,
-    0x18,
-    0x3a,
-    0x9f,
-    0x00,
-    0x60,
-    0x29,
-    0xc7,
-    0xf0,
-    0x9b,
-    0x95,
-    0x6a,
-    0x8e,
-    0x6a,
-    0x6d,
-    0x4f,
-    0xd6,
-    0xe7,
-    0x36,
-    0x78,
-    0x17,
-    0x36,
-    0x4f,
-    0x52,
-    0x55,
-    0x5e,
-    0x7a,
-    0x2e,
-    0xeb,
-    0x57,
-    0x98,
-    0xf4,
-    0x74,
-    0x65,
-    0xb4,
-    0x16,
-    0xec,
-    0xa4,
-    0x43,
-    0xc4,
-    0x13,
-    0xe3,
-    0xaa,
-    0x5f,
-    0x12,
-    0xb5,
-    0x01,
-    0x2f,
-    0x61,
-    0xc6,
-    0x17,
-    0x58,
-    0xe8,
-    0x6c,
-    0xb6,
-    0x0a,
-    0x65,
-    0x7e,
-    0x28,
-    0xf9,
-    0x0d,
-    0x69,
-    0xf9,
-    0x0d,
-    0x76,
-    0x80,
-    0xff,
-    0x5a,
-    0xb4,
-    0x94,
-    0x98,
-    0x52,
-    0xc3,
-    0xc5,
-    0x33,
-    0x39,
-    0x25,
-    0x97,
-    0x12,
-    0xda,
-    0xcb,
-    0x49,
-    0x4e,
-    0x79,
-    0x39,
-    0x62,
-    0x1b,
-    0x08,
-    0xe6,
-    0x8c,
-    0x4d,
-    0x9e,
-    0xe1,
-    0xa5,
-    0x1b,
-    0x24,
-    0xba,
-    0x14,
-    0x23,
-    0x52,
-    0xa0,
-    0x59,
-    0xaf,
-    0xda,
-    0xc7,
-    0xe8,
-    0x37,
-    0xe2,
-    0x0d,
-    0x38,
-    0x27,
-    0xb8,
-    0xdc,
-    0x17,
-    0xe1,
-    0xc1,
-    0x52,
-    0x40,
-    0x06,
-    0xb3,
-    0x9f,
-    0x2f,
-    0xf2,
-    0x04,
-    0xaf,
-    0x34,
-    0x85,
-    0xa3,
-    0x0a,
-    0xc7,
-    0x29,
-    0xe5,
-    0xf8,
-    0x1b,
-    0x10,
-    0xc2,
-    0xe8,
-    0xf6,
-    0xbe,
-    0x41,
-    0x12,
-    0xbf,
-    0xc8,
-    0x31,
-    0x5c,
-    0xd9,
-    0xdb,
-    0x1a,
-    0x7a,
-    0x2f,
-    0xff,
-    0x73,
-    0x5a,
-    0x10,
-    0x1d,
-    0x15,
-    0xbf,
-    0x3e,
-    0xbf,
-    0xf0,
-    0x2c,
-    0x41,
-    0x18,
-    0xfd,
-    0x03,
-    0x01,
-    0x44,
-    0x73,
-    0xee,
-    0x94,
-    0xd1,
-    0x3e,
-    0x7e,
-    0x55,
-    0x7d,
-    0xad,
-    0x12,
-    0x36,
-    0x41,
-    0x6b,
-    0xfb,
-    0x57,
-    0x8f,
-    0xb0,
-    0xdd,
-    0xd7,
-    0xd9,
-    0xb8,
-    0x58,
-    0xea,
-    0x52,
-    0x75,
-    0xe8,
-    0x2b,
-    0xf8,
-    0x81,
-    0x0a,
-    0x34,
-    0xd2,
-    0x56,
-    0xa1,
-    0x6c,
-    0x76,
-    0xc1,
-    0x97,
-    0x21,
-    0xcf,
-    0x94,
-    0xc7,
-    0xd7,
-    0x1d,
-    0x9c,
-    0x1b,
-    0xdf,
-    0x3d,
-    0xd2,
-    0xf1,
-    0x2b,
-    0x2b,
-    0xd5,
-    0xc4,
-    0x60,
-    0xc5,
-    0x98,
-    0x08,
-    0x2d,
-    0xd2,
-    0x58,
-    0x55,
-    0xdc,
-    0x42,
-    0xd2,
-    0xc8,
-    0x26,
-    0xb7,
-    0xb2,
-    0xa7,
-    0x4c,
-    0x45,
-    0x4e,
-    0x43,
-    0x63,
-    0x76,
-    0x94,
-    0x23,
-    0xef,
-    0x92,
-    0x41,
-    0x5e,
-    0xb4,
-    0x1d,
-    0x55,
-    0x49,
-    0xc9,
-    0xa0,
-    0xc3,
-    0x52,
-    0xee,
-    0xad,
-    0x6c,
-    0x2c,
-    0x1f,
-    0x1d,
-    0x4e,
-    0x2d,
-    0x6a,
-    0x9c,
-    0xf9,
-    0xf4,
-    0xfd,
-    0x68,
-    0x43,
-    0x4e,
-    0x83,
-    0x55,
-    0x3d,
-    0x5b,
-    0xb1,
-    0x15,
-    0x66,
-    0xec,
-    0x1b,
-    0xb6,
-    0x1e,
-    0x30,
-    0x4d,
-    0x6c,
-    0x5d,
-    0x90,
-    0x17,
-    0x91,
-    0xa4,
-    0xd7,
-    0x28,
-    0xea,
-    0x34,
-    0x96,
-    0xde,
-    0x2c,
-    0x7f,
-    0xc7,
-    0x5d
-  ],
-  const [
-    0x19,
-    0x8a,
-    0x69,
-    0x6d,
-    0xe9,
-    0x89,
-    0x61,
-    0xe3,
-    0xad,
-    0x0f,
-    0x95,
-    0x33,
-    0x39,
-    0x35,
-    0x0b,
-    0x58,
-    0x71,
-    0xd8,
-    0x7a,
-    0x41,
-    0x54,
-    0x92,
-    0x67,
-    0x6d,
-    0x3a,
-    0xe8,
-    0x8e,
-    0xb8,
-    0x59,
-    0xc5,
-    0x83,
-    0x75,
-    0x8e,
-    0x28,
-    0x99,
-    0xbc,
-    0x5b,
-    0x19,
-    0x03,
-    0x05,
-    0x2c,
-    0xe1,
-    0x39,
-    0xf6,
-    0xde,
-    0x7a,
-    0x9e,
-    0x7a,
-    0x81,
-    0x45,
-    0x5f,
-    0x13,
-    0x5d,
-    0xfb,
-    0x9e,
-    0x71,
-    0x34,
-    0xe6,
-    0xd0,
-    0x43,
-    0xc7,
-    0x51,
-    0x63,
-    0x4d,
-    0x9b,
-    0x3d,
-    0xa4,
-    0xbb,
-    0xfd,
-    0x55,
-    0xe1,
-    0xb5,
-    0x44,
-    0x24,
-    0xca,
-    0x33,
-    0x56,
-    0x86,
-    0x1d,
-    0x13,
-    0x6e,
-    0x5c,
-    0x83,
-    0x69,
-    0x1c,
-    0x84,
-    0xb5,
-    0x16,
-    0x8d,
-    0x09,
-    0xe2,
-    0x9c,
-    0x0c,
-    0x96,
-    0x55,
-    0x30,
-    0xc9,
-    0x31,
-    0x53,
-    0x11,
-    0xd9,
-    0x25,
-    0x42,
-    0x19,
-    0x7f,
-    0x40,
-    0x11,
-    0x91,
-    0xaa,
-    0x3f,
-    0xd3,
-    0x4a,
-    0xbe,
-    0x87,
-    0xad,
-    0xe9,
-    0x97,
-    0x16,
-    0xf3,
-    0x83,
-    0xcc,
-    0xb8,
-    0x8e,
-    0x6a,
-    0x30,
-    0x7e,
-    0xa1,
-    0x46,
-    0x9f,
-    0x6c,
-    0x6c,
-    0x67,
-    0xf7,
-    0x72,
-    0x70,
-    0x59,
-    0x64,
-    0x9e,
-    0xd3,
-    0xb9,
-    0xe1,
-    0x8f,
-    0x07,
-    0x48,
-    0xfb,
-    0x2d,
-    0xa7,
-    0x3e,
-    0xd8,
-    0x97,
-    0xa1,
-    0xe1,
-    0x79,
-    0x5d,
-    0x9a,
-    0x55,
-    0x3c,
-    0xf0,
-    0x8e,
-    0xb6,
-    0xa5,
-    0x56,
-    0xb7,
-    0x64,
-    0x5d,
-    0x22,
-    0xb1,
-    0x9e,
-    0x7b,
-    0xa4,
-    0xdb,
-    0x53,
-    0x03,
-    0x5d,
-    0x00,
-    0x34,
-    0xac,
-    0xb5,
-    0x37,
-    0x0e,
-    0xe7,
-    0xf1,
-    0x07,
-    0x57,
-    0x1c,
-    0x5f,
-    0xcf,
-    0x07,
-    0x37,
-    0xd3,
-    0x65,
-    0xa9,
-    0x63,
-    0x57,
-    0xfe,
-    0xb1,
-    0x15,
-    0x1f,
-    0x4e,
-    0x10,
-    0x4d,
-    0xbb,
-    0xf0,
-    0x06,
-    0x19,
-    0x90,
-    0x07,
-    0x37,
-    0x5a,
-    0x89,
-    0x26,
-    0x02,
-    0xca,
-    0x0a,
-    0x6d,
-    0x0e,
-    0x3e,
-    0x26,
-    0xf5,
-    0x25,
-    0x29,
-    0x11,
-    0x6f,
-    0x46,
-    0x62,
-    0xd8,
-    0x07,
-    0xf5,
-    0x27,
-    0x4f,
-    0x8f,
-    0xd6,
-    0x61,
-    0x4b,
-    0xd9,
-    0x7a,
-    0x29,
-    0x12,
-    0x64,
-    0x79,
-    0x8c,
-    0x10,
-    0x3b,
-    0xc1,
-    0x8b,
-    0xcc,
-    0x1b,
-    0x2d,
-    0x66,
-    0x1a,
-    0xd4,
-    0x5a,
-    0x1b,
-    0x91,
-    0xf1,
-    0xb6,
-    0x29,
-    0x3f,
-    0x9b,
-    0xd9,
-    0x99,
-    0x9c,
-    0xbb,
-    0x19,
-    0x3f,
-    0xbd,
-    0x5f,
-    0x58,
-    0x3e,
-    0xca,
-    0x5f,
-    0x21,
-    0xca,
-    0xb2,
-    0x40,
-    0xf4,
-    0x32,
-    0x1d,
-    0x58,
-    0xdd,
-    0x1d,
-    0xa3,
-    0x33,
-    0x4b,
-    0x13,
-    0x3b,
-    0x36,
-    0x20,
-    0x40,
-    0xf6,
-    0x82,
-    0x05,
-    0x75,
-    0xed,
-    0x1c,
-    0x00,
-    0x70,
-    0x77,
-    0x4a,
-    0x48,
-    0x5d,
-    0xa0,
-    0x40,
-    0x58,
-    0x9d,
-    0xd7,
-    0xfb,
-    0x42,
-    0xc5,
-    0xe7,
-    0x6e,
-    0x46,
-    0xea,
-    0x29,
-    0xdc,
-    0xa3,
-    0x1c,
-    0xf7,
-    0x85,
-    0xad,
-    0x30,
-    0x63,
-    0x84,
-    0x20,
-    0xc3,
-    0x29,
-    0xf8,
-    0xb4,
-    0x7b,
-    0xe3,
-    0x62,
-    0xf1,
-    0x90,
-    0x7c,
-    0x4e,
-    0x45,
-    0x8b,
-    0xe7,
-    0x36,
-    0x54,
-    0x4e,
-    0x11,
-    0xa3,
-    0x8f,
-    0x55,
-    0x14,
-    0x95,
-    0x08,
-    0x3b,
-    0xad,
-    0x25,
-    0x84,
-    0x80,
-    0xf0,
-    0x69,
-    0xd2,
-    0x89,
-    0x3a,
-    0x98,
-    0x5c,
-    0xe8,
-    0x68,
-    0x6e,
-    0xfc,
-    0xde,
-    0x46,
-    0xd2,
-    0x11,
-    0x1e,
-    0x4a,
-    0xb7,
-    0xd1,
-    0xd4,
-    0x83,
-    0x40,
-    0xe1,
-    0xe6,
-    0xcc,
-    0x27,
-    0x23,
-    0x7a,
-    0x45,
-    0x5f,
-    0xcf,
-    0xb8,
-    0x04,
-    0xf8,
-    0xc5,
-    0xd1,
-    0x07,
-    0x44,
-    0x21,
-    0x40,
-    0x6d,
-    0x38,
-    0x10,
-    0x50,
-    0xe6,
-    0x14,
-    0xe3,
-    0xde,
-    0x69,
-    0x47,
-    0x62,
-    0x60,
-    0x25,
-    0x8c,
-    0x63,
-    0x26,
-    0xb9,
-    0x5a,
-    0x9b,
-    0xe0,
-    0xa7,
-    0x7b,
-    0xb3,
-    0x61,
-    0x06,
-    0xfa,
-    0x9e,
-    0xa2,
-    0x78,
-    0x43,
-    0x2b,
-    0x0a,
-    0x5c,
-    0x86,
-    0xd6,
-    0xec,
-    0x45,
-    0x5c,
-    0xe4,
-    0x52,
-    0xaa,
-    0xad,
-    0xaf,
-    0xf9,
-    0xdf,
-    0xd1,
-    0x3e,
-    0x9c,
-    0x43,
-    0xf5,
-    0x18,
-    0x75,
-    0xbc,
-    0xc1,
-    0x5a,
-    0x02,
-    0x60,
-    0x38,
-    0x08,
-    0x05,
-    0x75,
-    0xdf,
-    0xa1,
-    0xce,
-    0x9c,
-    0x21,
-    0xf6,
-    0xbc,
-    0x49,
-    0xf2,
-    0x3b,
-    0x02,
-    0x76,
-    0xb3,
-    0x5f,
-    0xa7,
-    0x99,
-    0x55,
-    0x99,
-    0xd1,
-    0xd3,
-    0xc2,
-    0x44,
-    0x42,
-    0x6a,
-    0x78,
-    0xec,
-    0x23,
-    0x79,
-    0x77,
-    0xa9,
-    0x00,
-    0xe6,
-    0x5e,
-    0xab,
-    0x15,
-    0x95,
-    0xd1,
-    0x17,
-    0xc8,
-    0xdb,
-    0x1d,
-    0x12,
-    0x76,
-    0x36,
-    0x1f,
-    0x1a,
-    0x72,
-    0x3b,
-    0x62,
-    0x9d,
-    0x4b,
-    0xcf,
-    0x87,
-    0xc4,
-    0x4e,
-    0x9a,
-    0xea,
-    0x90,
-    0x4c,
-    0xb9,
-    0x82,
-    0x29,
-    0x9e,
-    0xb3,
-    0x09,
-    0x73,
-    0x65,
-    0xaf,
-    0x5d,
-    0xe1,
-    0x16,
-    0xe4,
-    0x27,
-    0x8e,
-    0x37,
-    0x50,
-    0xba,
-    0x8a,
-    0x63,
-    0xad,
-    0x3e,
-    0x71,
-    0x94,
-    0xa1,
-    0x0d,
-    0x43,
-    0xa2,
-    0x35,
-    0x5d,
-    0x6f,
-    0x06,
-    0x88,
-    0x20,
-    0x31,
-    0xe4,
-    0xc5,
-    0x28,
-    0x1e,
-    0x49,
-    0x52,
-    0x8f,
-    0xfe,
-    0xb1,
-    0x4a,
-    0x56,
-    0xd9,
-    0xcc,
-    0x2e,
-    0x4c,
-    0x55,
-    0x81,
-    0xd7,
-    0x31,
-    0x3f,
-    0x34,
-    0xaf,
-    0x1c,
-    0x67,
-    0x44,
-    0x21,
-    0x1a,
-    0xb1,
-    0xd8,
-    0x4e,
-    0x18,
-    0x69,
-    0xdc,
-    0x02,
-    0x03,
-    0xd7,
-    0x46,
-    0xe6,
-    0x2d,
-    0x13,
-    0x9e,
-    0xf7,
-    0xf3,
-    0x1b,
-    0xbd,
-    0x36,
-    0x9d,
-    0x23,
-    0xd5,
-    0xa1,
-    0x85,
-    0x2c,
-    0xb1,
-    0x63,
-    0x7c,
-    0xd8,
-    0x3e,
-    0x48,
-    0x69,
-    0x7d,
-    0x4b,
-    0x73,
-    0x33,
-    0x78,
-    0x8d,
-    0x53,
-    0xe1,
-    0xc4,
-    0xe6,
-    0xd3,
-    0x00,
-    0xcb,
-    0xe6,
-    0xd1,
-    0x45,
-    0x7b,
-    0x93,
-    0xd2,
-    0x74,
-    0x9d,
-    0x65,
-    0xf4,
-    0x80,
-    0x62,
-    0x95,
-    0x24,
-    0xf4,
-    0x3f,
-    0x98,
-    0x90,
-    0x91,
-    0xfb,
-    0xe6,
-    0x5f,
-    0x39,
-    0x07,
-    0xff,
-    0xa0,
-    0x0c,
-    0x0d,
-    0xb0,
-    0x81,
-    0xd0,
-    0xcb,
-    0x92,
-    0xc2,
-    0x96,
-    0x22,
-    0xd5,
-    0x69,
-    0x9a,
-    0x6a,
-    0x3b,
-    0xb6,
-    0x6c,
-    0x09,
-    0x67,
-    0x59,
-    0x4d,
-    0x44,
-    0x58,
-    0xe3,
-    0xdc,
-    0x55,
-    0x31,
-    0x7b,
-    0xf2,
-    0xbd,
-    0x3b,
-    0xd2,
-    0xca,
-    0xdb,
-    0x2c,
-    0x59,
-    0x65,
-    0xbe,
-    0xaa,
-    0xb1,
-    0x2c,
-    0x38,
-    0x0b,
-    0x62,
-    0xd8,
-    0x33,
-    0x5f,
-    0xd1,
-    0x8f,
-    0x48,
-    0xb0,
-    0x6c,
-    0x4f,
-    0x8e,
-    0x88,
-    0x28,
-    0x90,
-    0xb0,
-    0xb4,
-    0x2d,
-    0x25,
-    0x43,
-    0x48,
-    0xcf,
-    0x64,
-    0x56,
-    0xe3,
-    0xc1,
-    0x86,
-    0x4a,
-    0x34,
-    0x85,
-    0x51,
-    0xe4,
-    0xbd,
-    0x27,
-    0xf4,
-    0xa0,
-    0xd7,
-    0x2b,
-    0x32,
-    0x48,
-    0xf7,
-    0xc4,
-    0xc2,
-    0xc6,
-    0x2f,
-    0x47,
-    0xf6,
-    0x37,
-    0xf8,
-    0xde,
-    0x9c,
-    0x40,
-    0x2e,
-    0x81,
-    0x22,
-    0xa5,
-    0x5c,
-    0x22,
-    0xfd,
-    0x17,
-    0x3a,
-    0x28,
-    0x4a,
-    0x4e,
-    0x74,
-    0x1f,
-    0xb6,
-    0x58,
-    0xad,
-    0xae,
-    0x9c,
-    0x31,
-    0xc4,
-    0xc9,
-    0x6e,
-    0x93,
-    0x56,
-    0x27,
-    0x56,
-    0x0f,
-    0x84,
-    0xf7,
-    0x1d,
-    0x5d,
-    0xf6,
-    0xcf,
-    0x4b,
-    0xf1,
-    0x1f,
-    0xe5,
-    0x90,
-    0xce,
-    0xc3,
-    0x81,
-    0x62,
-    0x9f,
-    0xb7,
-    0xb2,
-    0xe8,
-    0x04,
-    0xe9,
-    0x41,
-    0x17,
-    0x2a,
-    0xa0,
-    0xe3,
-    0x1b,
-    0x9e,
-    0x04,
-    0xb2,
-    0xf8,
-    0x63,
-    0xe0,
-    0xde,
-    0x71,
-    0x42,
-    0xa7,
-    0xa0,
-    0x29,
-    0x61,
-    0xb5,
-    0x70,
-    0x08,
-    0x17,
-    0xd8,
-    0x78,
-    0xe0,
-    0xff,
-    0x0f,
-    0x48,
-    0x50,
-    0x4b,
-    0x91,
-    0xcb,
-    0xe9,
-    0x5b,
-    0x11,
-    0x7a,
-    0x90,
-    0x8f,
-    0x41,
-    0xcf,
-    0x23,
-    0x59,
-    0x95,
-    0xfd,
-    0x60,
-    0x96,
-    0x49,
-    0xde,
-    0x02,
-    0x1e,
-    0xa5,
-    0x2d,
-    0x2c,
-    0x99,
-    0x80,
-    0xf5,
-    0x0b,
-    0x95,
-    0x03,
-    0x49,
-    0xb8,
-    0xd6,
-    0xaf,
-    0x36,
-    0x5b,
-    0xed,
-    0xa1,
-    0xf6,
-    0x96,
-    0x0d,
-    0x15,
-    0x66,
-    0x21,
-    0x19,
-    0x2a,
-    0xbb,
-    0xb1,
-    0x01,
-    0xe5,
-    0x70,
-    0x1f,
-    0x4f,
-    0x77,
-    0x82,
-    0xc6,
-    0xfd,
-    0xc3,
-    0xe0,
-    0x2d,
-    0x8a,
-    0x1b,
-    0x1d,
-    0xe6,
-    0x4d,
-    0x4a,
-    0x69,
-    0xb5,
-    0x08,
-    0xd8,
-    0xbf,
-    0xf5,
-    0xc0,
-    0x89,
-    0x60,
-    0x38,
-    0xcc,
-    0x27,
-    0x7f,
-    0x2e,
-    0x2d,
-    0x81,
-    0x3e,
-    0xc8,
-    0x1d,
-    0xb4,
-    0xd9,
-    0x9c,
-    0xea,
-    0xa9,
-    0x21,
-    0x8c,
-    0x05,
-    0xdf,
-    0x2d,
-    0xa2,
-    0x56,
-    0x6b,
-    0x4c,
-    0x3f,
-    0xd3,
-    0x3d,
-    0x3d,
-    0x75,
-    0x51,
-    0xa4,
-    0xa3,
-    0xb1,
-    0x9a,
-    0x15,
-    0xb3,
-    0x9d,
-    0xbf,
-    0x28,
-    0x30,
-    0x44,
-    0xb0,
-    0xe3,
-    0x99,
-    0x78,
-    0x09,
-    0x3b,
-    0xa1,
-    0x70,
-    0x2f,
-    0xd8,
-    0xdf,
-    0xb6,
-    0x9c,
-    0x19,
-    0xc7,
-    0x41,
-    0x77,
-    0x58,
-    0xd9,
-    0xdd,
-    0x68,
-    0x6f,
-    0x18,
-    0xd4,
-    0xaa,
-    0x7a,
-    0xbe,
-    0xc7,
-    0x62,
-    0xdf,
-    0x2e,
-    0xdd,
-    0x2f,
-    0x8c,
-    0x2a,
-    0x20,
-    0x02,
-    0x80,
-    0x46,
-    0x23,
-    0x30,
-    0x8d,
-    0x9c,
-    0xe8,
-    0xc5,
-    0x5c,
-    0xc2,
-    0x02,
-    0x1c,
-    0xb1,
-    0xf9,
-    0xf7,
-    0xac,
-    0xf0,
-    0xa7,
-    0xe8,
-    0x25,
-    0xe1,
-    0x08,
-    0x74,
-    0xbc,
-    0xb0,
-    0x20,
-    0xd9,
-    0xc2,
-    0x38,
-    0xf4,
-    0x5c,
-    0x7c,
-    0x80,
-    0xf9,
-    0xec,
-    0x2f,
-    0x86,
-    0xcd,
-    0x02,
-    0x7a,
-    0x3c,
-    0x25,
-    0xcb,
-    0xe8,
-    0xd1,
-    0x07,
-    0x89,
-    0xc6,
-    0x31,
-    0x39,
-    0x37,
-    0x32,
-    0xcf,
-    0xf9,
-    0x6b,
-    0x75,
-    0xa2,
-    0xee,
-    0x81,
-    0x93,
-    0x6d,
-    0x5f,
-    0xf6,
-    0x20,
-    0x44,
-    0xa3,
-    0x12,
-    0x54,
-    0x4c,
-    0xd8,
-    0xca,
-    0x62,
-    0xc2,
-    0xd8,
-    0xe4,
-    0x06,
-    0x3f,
-    0x69,
-    0x5c,
-    0x5d,
-    0x3a,
-    0xb4,
-    0x07,
-    0xfa,
-    0xce,
-    0xf9,
-    0x76,
-    0x36,
-    0xbd,
-    0x80,
-    0x1d,
-    0xc7,
-    0xb6,
-    0xd3,
-    0xb4,
-    0x95,
-    0xd3,
-    0x2a,
-    0xde,
-    0xc9,
-    0x66,
-    0x27,
-    0x09,
-    0x26,
-    0xf5,
-    0xc3,
-    0x95,
-    0x9c,
-    0x83,
-    0x89,
-    0x38,
-    0x1a,
-    0x11,
-    0x02,
-    0xa1,
-    0xa5,
-    0x65,
-    0x70,
-    0x5b,
-    0xa7,
-    0x0a,
-    0xbe,
-    0xf5,
-    0x89,
-    0x98,
-    0xb8,
-    0x60,
-    0x83,
-    0x36,
-    0x78,
-    0x98,
-    0xb3,
-    0x5c,
-    0x20,
-    0x86,
-    0x6d,
-    0xde,
-    0xcf,
-    0x26,
-    0xd3,
-    0x26,
-    0xcd,
-    0xe5,
-    0xa5,
-    0xc0,
-    0x09,
-    0x4d,
-    0x5a,
-    0x1d,
-    0xc6,
-    0xe3,
-    0x6f,
-    0x90,
-    0x91,
-    0x50,
-    0xff,
-    0x9d,
-    0x76,
-    0xc0,
-    0x94,
-    0x73,
-    0x73,
-    0x88,
-    0x3d,
-    0xb7,
-    0x2d,
-    0x0b,
-    0xe0,
-    0x83,
-    0xe2,
-    0xde,
-    0xd2,
-    0xaf,
-    0x9f,
-    0x2a,
-    0xa5,
-    0x4f,
-    0xb3,
-    0x52,
-    0x41,
-    0x7c,
-    0x63,
-    0xd6,
-    0x36,
-    0x58,
-    0xdf,
-    0x78,
-    0x51,
-    0x4c,
-    0x75,
-    0x9d,
-    0x6e,
-    0x94,
-    0x05,
-    0xf5,
-    0x8c,
-    0xfe,
-    0xb5,
-    0x5e,
-    0x27,
-    0xee,
-    0xe5,
-    0x06,
-    0xc2,
-    0xa6,
-    0x66,
-    0xd0,
-    0xc3,
-    0xc4,
-    0xe6,
-    0xfa,
-    0x83,
-    0x0c,
-    0xaf,
-    0xfc,
-    0xa6,
-    0x68,
-    0x92,
-    0xb3,
-    0xa8,
-    0x2d,
-    0x1d,
-    0xbe,
-    0xb9,
-    0xa0,
-    0x15,
-    0x29,
-    0xcb,
-    0xb9,
-    0x20,
-    0x48,
-    0xe9,
-    0x27,
-    0xc1,
-    0xe6,
-    0xca,
-    0x93,
-    0x89,
-    0xa0,
-    0xa6,
-    0x29,
-    0x8c,
-    0x8b,
-    0x48,
-    0x55,
-    0x13,
-    0x1d,
-    0x65,
-    0xca,
-    0x90,
-    0x4a,
-    0x2c,
-    0xc9,
-    0xd7,
-    0xed,
-    0x1e,
-    0xa0,
-    0x8a,
-    0x6a,
-    0x20,
-    0x71,
-    0xd5,
-    0x91,
-    0xce,
-    0x34,
-    0x5c,
-    0xc6,
-    0x13,
-    0xff,
-    0x72,
-    0x5f,
-    0xf6,
-    0x85,
-    0x8c,
-    0x4e,
-    0xb7,
-    0xde,
-    0xf5,
-    0x00,
-    0x1b,
-    0x86,
-    0xc3,
-    0x85,
-    0x04,
-    0xa7,
-    0x09,
-    0xf0,
-    0x44,
-    0x9b,
-    0x4e,
-    0x01,
-    0xb3,
-    0xac,
-    0x3e,
-    0x01,
-    0x80,
-    0x1f,
-    0xa0,
-    0xee,
-    0xc4,
-    0x72,
-    0x88,
-    0xd8,
-    0x5d,
-    0xe1,
-    0xce,
-    0x8b,
-    0xf9,
-    0x2f,
-    0xbe,
-    0x6e,
-    0x71,
-    0xa2,
-    0x11,
-    0xab,
-    0x59,
-    0x50,
-    0x1d,
-    0x90,
-    0xd5,
-    0x99,
-    0x48,
-    0x36,
-    0xad,
-    0xf5,
-    0xc2,
-    0x60,
-    0xa4,
-    0xf0,
-    0x74,
-    0xa5,
-    0x06,
-    0x72,
-    0x33,
-    0xd2,
-    0x81,
-    0x44,
-    0x3a,
-    0x8a,
-    0x35,
-    0xd0,
-    0xd7,
-    0x2f,
-    0x0e,
-    0x28,
-    0x64,
-    0x06,
-    0x52,
-    0x4a,
-    0x79,
-    0x95,
-    0x76,
-    0xa3,
-    0x60,
-    0x50,
-    0x36,
-    0xd1,
-    0xc9,
-    0x75,
-    0xe5,
-    0xad,
-    0xbf,
-    0x35,
-    0x01,
-    0x89,
-    0xdb,
-    0x14,
-    0x0a,
-    0xb6,
-    0xb8,
-    0x92,
-    0x94,
-    0x4a,
-    0xa6,
-    0x0b,
-    0x9c,
-    0x1f,
-    0xa3,
-    0xdc,
-    0x18,
-    0x1f,
-    0x87,
-    0xc7,
-    0xd1,
-    0xbf,
-    0x7e,
-    0x99,
-    0x75,
-    0xca,
-    0xbb,
-    0x09,
-    0xe8,
-    0x60,
-    0x6b,
-    0xe4,
-    0xdc,
-    0x3e,
-    0xe8,
-    0x67,
-    0xa1,
-    0x40,
-    0x30,
-    0xec,
-    0x3e,
-    0x23,
-    0x95,
-    0xca,
-    0xc0,
-    0x90,
-    0xb6,
-    0x76,
-    0xd2,
-    0x56,
-    0xad,
-    0xee,
-    0x8e,
-    0xf8,
-    0x8a,
-    0x57,
-    0x93,
-    0x67,
-    0x01,
-    0xe4,
-    0x58,
-    0x10,
-    0x5f,
-    0xfb,
-    0xc0,
-    0x19,
-    0xc2,
-    0x93,
-    0xee,
-    0xe8,
-    0x8a,
-    0xe1,
-    0x5a,
-    0xe6,
-    0x0b,
-    0x33,
-    0x24,
-    0x82,
-    0x84,
-    0x1c,
-    0xa9,
-    0x78,
-    0x55,
-    0xd1,
-    0x55,
-    0x53,
-    0x6c,
-    0xd3,
-    0xb8,
-    0x30,
-    0x01,
-    0xce,
-    0xdb,
-    0xc6,
-    0x83,
-    0xc1,
-    0xd4,
-    0xa3,
-    0xd2,
-    0x60,
-    0x98,
-    0xb8,
-    0xae,
-    0xb7,
-    0x11,
-    0x18,
-    0x70,
-    0x0f,
-    0x70,
-    0xfd,
-    0xf7,
-    0x15,
-    0xc5,
-    0x0c,
-    0xe6,
-    0x39,
-    0xcc,
-    0xda,
-    0x0d,
-    0x55,
-    0x0a,
-    0xae,
-    0x24,
-    0x8f,
-    0x19,
-    0x89,
-    0xbf,
-    0x80,
-    0x41,
-    0x63,
-    0x7e,
-    0x96,
-    0x48,
-    0xb8,
-    0x84,
-    0xb6,
-    0x8a,
-    0x43,
-    0x2b,
-    0x26,
-    0x4c,
-    0x0a,
-    0xf6,
-    0xab,
-    0x4d,
-    0x9a,
-    0xc8,
-    0xee,
-    0x9e,
-    0x94,
-    0x53,
-    0x24,
-    0xb4,
-    0x68,
-    0xd2,
-    0xee,
-    0xbc,
-    0x61,
-    0xfb,
-    0x7e,
-    0x2e,
-    0xe2,
-    0x2f,
-    0xfc,
-    0xa5,
-    0xef,
-    0xf5,
-    0x28,
-    0xee,
-    0xee,
-    0xa6,
-    0x40,
-    0x5e,
-    0xaf,
-    0x6a,
-    0x24,
-    0x69,
-    0xab,
-    0x62,
-    0xb8,
-    0x71,
-    0x89,
-    0x27,
-    0x8a,
-    0xdc,
-    0xe7,
-    0x74,
-    0xb5,
-    0x69,
-    0x56,
-    0x1f,
-    0x05,
-    0xc4,
-    0xa6,
-    0x4e,
-    0x5b,
-    0x58,
-    0x65,
-    0xe7,
-    0x53,
-    0x64,
-    0xa2,
-    0x48,
-    0x25,
-    0x51,
-    0xf6,
-    0x39,
-    0xc9,
-    0x43,
-    0xc6,
-    0x1e,
-    0x5f,
-    0xee,
-    0xc2,
-    0x72,
-    0xcd,
-    0xab,
-    0xb1,
-    0x70,
-    0xaa,
-    0xca,
-    0x71,
-    0x13,
-    0x5b,
-    0x2a,
-    0x39,
-    0x41,
-    0x7b,
-    0x08,
-    0x22,
-    0x43,
-    0x81,
-    0x15,
-    0xe6,
-    0x79,
-    0x9c,
-    0xcb,
-    0xe7,
-    0x4c,
-    0xe2,
-    0x00,
-    0x73,
-    0x63,
-    0xaa,
-    0xbc,
-    0x46,
-    0x1a,
-    0x36,
-    0x48,
-    0x50,
-    0x30,
-    0x96,
-    0x87,
-    0xb9,
-    0xbf,
-    0xc8,
-    0x89,
-    0x23,
-    0x72,
-    0x24,
-    0x5e,
-    0x2f,
-    0xf2,
-    0xf8,
-    0x28,
-    0x42,
-    0xa1,
-    0x6f,
-    0x74,
-    0x89,
-    0x8b,
-    0xb7,
-    0xcb,
-    0x3a,
-    0x9a,
-    0x62,
-    0x83,
-    0x1d,
-    0x09,
-    0x0d,
-    0xdb,
-    0x4c,
-    0x1a,
-    0x40,
-    0x48,
-    0x37,
-    0x0c,
-    0x96,
-    0x09,
-    0xea,
-    0x47,
-    0x1e,
-    0x01,
-    0x93,
-    0xdb,
-    0x00,
-    0xc6,
-    0x3e,
-    0x28,
-    0x64,
-    0xf6,
-    0xe4,
-    0xde,
-    0x8f,
-    0xca,
-    0xa4,
-    0x29,
-    0x4f,
-    0xed,
-    0x50,
-    0x25,
-    0x9a,
-    0x8e,
-    0x2b,
-    0x98,
-    0x72,
-    0xb4,
-    0xf1,
-    0xe0,
-    0x0b,
-    0xd1,
-    0x18,
-    0x2a,
-    0x30,
-    0x9b,
-    0x56,
-    0xe5,
-    0xe3,
-    0x17,
-    0x63,
-    0x77,
-    0x44,
-    0xf6,
-    0x00,
-    0x2e,
-    0xb4,
-    0x25,
-    0x38,
-    0x79,
-    0x39,
-    0xa0,
-    0xe6,
-    0x58,
-    0x24,
-    0x87,
-    0x77,
-    0x11,
-    0xf2,
-    0x73,
-    0xf1,
-    0x25,
-    0x71,
-    0x0a,
-    0x34,
-    0x82,
-    0x24,
-    0xd1,
-    0x81,
-    0xfa,
-    0xe7,
-    0x42,
-    0x38,
-    0xf4,
-    0xd6,
-    0x1f,
-    0xe6,
-    0x61,
-    0x6c,
-    0x05,
-    0x7e,
-    0xf2,
-    0xe8,
-    0x44,
-    0xe7,
-    0x88,
-    0xf5,
-    0xee,
-    0xb7,
-    0xed,
-    0x89,
-    0x2e,
-    0x3f,
-    0xc1,
-    0x0e,
-    0xdb,
-    0xc7,
-    0xb7,
-    0xc0,
-    0x4d,
-    0x1a,
-    0x01,
-    0x56,
-    0x70,
-    0x46,
-    0x08,
-    0xe4,
-    0x16,
-    0x9d,
-    0x61,
-    0x00,
-    0x92,
-    0xff,
-    0xfc,
-    0x24,
-    0x82,
-    0x5c,
-    0x9f,
-    0x53,
-    0xec,
-    0x74,
-    0x93,
-    0xff,
-    0x8d,
-    0xe1,
-    0x9e,
-    0x2b,
-    0x6d,
-    0x58,
-    0x31,
-    0xcd,
-    0xb7,
-    0x2c,
-    0xe1,
-    0x76,
-    0xc8,
-    0x13,
-    0x1b,
-    0x34,
-    0x86,
-    0x2d,
-    0x14,
-    0xb8,
-    0xf3,
-    0x42,
-    0x00,
-    0xb4,
-    0x02,
-    0x4c,
-    0x84,
-    0x87,
-    0xa9,
-    0x35,
-    0x6d,
-    0x1c,
-    0x37,
-    0xe1,
-    0xa2,
-    0x0f,
-    0xe8,
-    0x6f,
-    0x57,
-    0x12,
-    0xb6,
-    0xbc,
-    0x84,
-    0x90,
-    0x73,
-    0x29,
-    0x96,
-    0x90,
-    0x15,
-    0x9f,
-    0x64,
-    0xdb,
-    0x51,
-    0xd0,
-    0x64,
-    0x61,
-    0x6b,
-    0xbf,
-    0x1f,
-    0xd9,
-    0x4c,
-    0x82,
-    0xe2,
-    0xa8,
-    0xd5,
-    0x46,
-    0xb7,
-    0x04,
-    0x73,
-    0x95,
-    0x93,
-    0x59,
-    0xf3,
-    0xd4,
-    0xd1,
-    0xeb,
-    0x98,
-    0x10,
-    0xdf,
-    0xbe,
-    0x6b,
-    0xfa,
-    0x38,
-    0xb3,
-    0xd3,
-    0x2f,
-    0x92,
-    0xf3,
-    0x65,
-    0xbd,
-    0x58,
-    0x90,
-    0xfd,
-    0xe3,
-    0x5a,
-    0x6a,
-    0x0e,
-    0x19,
-    0xc4,
-    0x50,
-    0x36,
-    0x50,
-    0x4c,
-    0x68,
-    0x16,
-    0x7b,
-    0xb0,
-    0xd1,
-    0x60,
-    0x4e,
-    0x60,
-    0x86,
-    0x31,
-    0x46,
-    0x77,
-    0x86,
-    0xa2,
-    0xe9,
-    0xf0,
-    0x32,
-    0x9a,
-    0x4f,
-    0x17,
-    0xf6,
-    0xe6,
-    0xe1,
-    0x3d,
-    0x2b,
-    0x8b,
-    0x61,
-    0xb0,
-    0x3c,
-    0x5a,
-    0x2b,
-    0xeb,
-    0x08,
-    0xc6,
-    0xba,
-    0x09,
-    0x88,
-    0xf3,
-    0x6d,
-    0x80,
-    0xb2,
-    0x0f,
-    0x8b,
-    0x0b,
-    0x9d,
-    0xe5,
-    0x86,
-    0xe8,
-    0xe5,
-    0xaf,
-    0x7c,
-    0x44,
-    0x51,
-    0x2c,
-    0x03,
-    0xf4,
-    0xb3,
-    0xf3,
-    0x26,
-    0x65,
-    0x10,
-    0x07,
-    0xab,
-    0xd6,
-    0x01,
-    0xab,
-    0x98,
-    0xc4,
-    0x59,
-    0x78,
-    0xf5,
-    0xa6,
-    0x08,
-    0xac,
-    0xd2,
-    0xdb,
-    0x40,
-    0xc5,
-    0x8c,
-    0xe1,
-    0xd6,
-    0x4f,
-    0x4d,
-    0xc7,
-    0xea,
-    0xfa,
-    0xd2,
-    0xe5,
-    0xca,
-    0xef,
-    0x71,
-    0xca,
-    0x14,
-    0x64,
-    0x5a,
-    0x76,
-    0x1b,
-    0x6e,
-    0x1d,
-    0xca,
-    0x8c,
-    0x17,
-    0x6c,
-    0x3c,
-    0x52,
-    0xb1,
-    0x22,
-    0xcf,
-    0xb6,
-    0x6a,
-    0x85,
-    0x43,
-    0xcb,
-    0x20,
-    0xc8,
-    0x88,
-    0x09,
-    0x76,
-    0xd5,
-    0x79,
-    0x38,
-    0x27,
-    0x49,
-    0xc7,
-    0x90,
-    0x9a,
-    0xbf,
-    0x33,
-    0x1e,
-    0xb7,
-    0x51,
-    0x01,
-    0x69,
-    0xfa,
-    0x5c,
-    0xa9,
-    0x56,
-    0xc5,
-    0x84,
-    0xcf,
-    0x49,
-    0xfb,
-    0xf8,
-    0x75,
-    0x8d,
-    0xca,
-    0xf7,
-    0x70,
-    0xf6,
-    0xc8,
-    0x94,
-    0x18,
-    0xc4,
-    0x42,
-    0xb6,
-    0x44,
-    0xcb,
-    0xd0,
-    0x62,
-    0x76,
-    0xd1,
-    0x2d,
-    0x3d,
-    0x52,
-    0x38,
-    0x46,
-    0x4c,
-    0x55,
-    0xdd,
-    0x91,
-    0xff,
-    0xc3,
-    0x3f,
-    0xa0,
-    0x6e,
-    0xe1,
-    0xe4,
-    0xf6,
-    0xe2,
-    0x65,
-    0xf8,
-    0x19,
-    0x97,
-    0x2b,
-    0x38,
-    0xe9,
-    0xc0,
-    0x29,
-    0x0e,
-    0x2f,
-    0xcc,
-    0xa5,
-    0xfd,
-    0x79,
-    0xe8,
-    0xa5,
-    0x40,
-    0x26,
-    0xc5,
-    0xa8,
-    0xae,
-    0xbd,
-    0x9b,
-    0x93,
-    0xe1,
-    0x83,
-    0x6e,
-    0xee,
-    0x97,
-    0x4c,
-    0x90,
-    0x50,
-    0x58,
-    0x91,
-    0x67,
-    0x18,
-    0x5a,
-    0xc3,
-    0x70,
-    0x5e,
-    0xa1,
-    0xdf,
-    0x84,
-    0x2a,
-    0x6a,
-    0x43,
-    0x5a,
-    0xe3,
-    0xca,
-    0xc0,
-    0x4e,
-    0x0a,
-    0x93,
-    0xf0,
-    0x60,
-    0x28,
-    0x77,
-    0xc9,
-    0x80,
-    0x04,
-    0x70,
-    0x73,
-    0x09,
-    0x1a,
-    0x5f,
-    0x57,
-    0x8b,
-    0x49,
-    0xf3,
-    0x79,
-    0xcd,
-    0xcc,
-    0xcc,
-    0x07,
-    0x12,
-    0x6b,
-    0xe0,
-    0x32,
-    0x9c,
-    0xf2,
-    0x1e,
-    0x3c,
-    0x6f,
-    0xe3,
-    0x52,
-    0xd2,
-    0x57,
-    0x68,
-    0x49,
-    0x9d,
-    0x2c,
-    0x8b,
-    0x35,
-    0x14,
-    0x55,
-    0xa9,
-    0x52,
-    0x94,
-    0x8b,
-    0x24,
-    0xca,
-    0xb2,
-    0xdf,
-    0x59,
-    0xd7,
-    0xd0,
-    0xff,
-    0xd2,
-    0x27,
-    0xee,
-    0xb5,
-    0xbc,
-    0x84,
-    0xc3,
-    0xb0,
-    0x9b,
-    0xb4,
-    0x0c,
-    0x87,
-    0x3c,
-    0x9e,
-    0x25,
-    0xfb,
-    0xeb,
-    0xaf,
-    0xd6,
-    0x7d,
-    0xe7,
-    0x7c,
-    0x6f,
-    0xf0,
-    0x13,
-    0xa9,
-    0x17,
-    0xaf,
-    0xee,
-    0x09,
-    0x61,
-    0xd2,
-    0xc5,
-    0x06,
-    0x20,
-    0xad,
-    0x28,
-    0x44,
-    0x7d,
-    0x9a,
-    0x9a,
-    0x81,
-    0x46,
-    0xf9,
-    0x8c,
-    0xc0,
-    0x89,
-    0x74,
-    0x8d,
-    0xa6,
-    0x62,
-    0x88,
-    0xbb,
-    0x24,
-    0x11,
-    0x40,
-    0x7d,
-    0x56,
-    0x4f,
-    0x44,
-    0x74,
-    0xab,
-    0xe3,
-    0x13,
-    0xae,
-    0x47,
-    0x70,
-    0x8d,
-    0x1d,
-    0xa5,
-    0x91,
-    0xb4,
-    0x48,
-    0x81,
-    0x27,
-    0xb3,
-    0x41,
-    0xf5,
-    0xf2,
-    0x20,
-    0xd7,
-    0xe2,
-    0x5f,
-    0x7e,
-    0x0c,
-    0x91,
-    0xa1,
-    0x06,
-    0xca,
-    0x9a,
-    0x03,
-    0xa7,
-    0xd1,
-    0x05,
-    0x7d,
-    0x4b,
-    0xf4,
-    0xb0,
-    0x85,
-    0x5c,
-    0x85,
-    0xf0,
-    0x27,
-    0x86,
-    0x0e,
-    0x7b,
-    0x58,
-    0xbf,
-    0x41,
-    0x86,
-    0x88,
-    0x85,
-    0x32,
-    0x2a,
-    0x76,
-    0x67,
-    0xc4,
-    0x0c,
-    0x48,
-    0xc7,
-    0x61,
-    0x3d,
-    0xdb,
-    0xde,
-    0xef,
-    0x5f,
-    0x58,
-    0x01,
-    0xff,
-    0x0a,
-    0x08,
-    0x22,
-    0x47,
-    0x6e,
-    0x69,
-    0x99,
-    0x52,
-    0x39,
-    0x81,
-    0x25,
-    0x76,
-    0xbb,
-    0x72,
-    0x2d,
-    0x07,
-    0x47,
-    0x4f,
-    0x4c,
-    0xca,
-    0xdd,
-    0x2e,
-    0x0d,
-    0xac,
-    0x07,
-    0x7e,
-    0xf3,
-    0xb4,
-    0x01,
-    0x9b,
-    0xbd,
-    0x37,
-    0x1c,
-    0xa0,
-    0xe7,
-    0x4b,
-    0x64,
-    0x7d,
-    0x74,
-    0x7d,
-    0x81,
-    0x49,
-    0xeb,
-    0xc7,
-    0xdb,
-    0xd9,
-    0xa0,
-    0xbc,
-    0x02,
-    0x91,
-    0x34,
-    0x06,
-    0x4c,
-    0x7a,
-    0x5f,
-    0x12,
-    0xc0,
-    0x95,
-    0xed,
-    0x0a,
-    0x32,
-    0x6f,
-    0x07,
-    0x04,
-    0xb0,
-    0xf6,
-    0xb4,
-    0x79,
-    0x1d,
-    0x8b,
-    0xa0,
-    0xf8,
-    0x1c,
-    0x58,
-    0x1b,
-    0x1b,
-    0x30,
-    0xe4,
-    0x64,
-    0xbb,
-    0x21,
-    0xe4,
-    0x28,
-    0x60,
-    0xa1,
-    0x55,
-    0x46,
-    0xfb,
-    0x2f,
-    0xc7,
-    0xd5,
-    0xd8,
-    0x3c,
-    0xfc,
-    0x68,
-    0xce,
-    0x8c,
-    0xb1,
-    0x90,
-    0xb9,
-    0xe0,
-    0xbc,
-    0xa3,
-    0x2a,
-    0xd2,
-    0x57,
-    0xbc,
-    0x5c,
-    0x00,
-    0xbc,
-    0x03,
-    0x6a,
-    0x6c,
-    0xf2,
-    0x2f,
-    0xc0,
-    0x23,
-    0xe6,
-    0x49,
-    0xcf,
-    0x1d,
-    0xbd,
-    0xb2,
-    0x06,
-    0x65,
-    0x69,
-    0x67,
-    0xfd,
-    0x79,
-    0x7a,
-    0x84,
-    0xf3,
-    0xf4,
-    0x37,
-    0x07,
-    0x7a,
-    0x6a,
-    0xee,
-    0xd7,
-    0x71,
-    0x94,
-    0x88,
-    0x05,
-    0x33,
-    0xad,
-    0x60,
-    0x51,
-    0x0e,
-    0x1b,
-    0x56,
-    0xf0,
-    0xf7,
-    0x52,
-    0x1f,
-    0x8c,
-    0x7b,
-    0xf6,
-    0xdf,
-    0x8d,
-    0xf9,
-    0x3f,
-    0xf9,
-    0x97,
-    0x0f,
-    0xa2,
-    0x25,
-    0x53,
-    0x52,
-    0xae,
-    0xc4,
-    0x73,
-    0x42,
-    0x34,
-    0x71,
-    0xf0,
-    0x7d,
-    0xaa,
-    0xd9,
-    0x96,
-    0x32,
-    0xd1,
-    0xcc,
-    0xc3,
-    0xd9,
-    0x96,
-    0x94,
-    0x6c,
-    0x21,
-    0x36,
-    0x85,
-    0x60,
-    0x2a,
-    0xa6,
-    0xd5,
-    0xd1,
-    0xf5,
-    0x32,
-    0xae,
-    0x10,
-    0x19,
-    0x64,
-    0x82,
-    0x98,
-    0xb7,
-    0x27,
-    0x9f,
-    0x4e,
-    0xaf,
-    0x2c,
-    0x03,
-    0x07,
-    0x14,
-    0x8d,
-    0x71,
-    0x4b,
-    0xde,
-    0xb1,
-    0xc4,
-    0x59,
-    0xdf,
-    0x6f,
-    0x84,
-    0x6a,
-    0xf9,
-    0x76,
-    0xb7,
-    0x3a,
-    0x8d,
-    0xec,
-    0xf9,
-    0xc5,
-    0x36,
-    0x55,
-    0xcf,
-    0x4e,
-    0xb8,
-    0xb7,
-    0x39,
-    0xa6,
-    0x33,
-    0xfb,
-    0x86,
-    0xab,
-    0x9d,
-    0x97,
-    0x6c,
-    0x0f,
-    0x6e,
-    0x6a,
-    0x58,
-    0x5b,
-    0x9d,
-    0xe7,
-    0x03,
-    0x33,
-    0xcc,
-    0x76,
-    0x46,
-    0xdb,
-    0xc0,
-    0x17,
-    0x2f,
-    0xfa,
-    0x13,
-    0x49,
-    0x54,
-    0x9e,
-    0x2d,
-    0x2a,
-    0x67,
-    0x81,
-    0x70,
-    0xdf,
-    0x0b,
-    0x8b,
-    0xb3,
-    0x36,
-    0xe6,
-    0x97,
-    0xf2,
-    0x8a,
-    0xf8,
-    0x7a,
-    0x43,
-    0xe8,
-    0x2b,
-    0x41,
-    0x0c,
-    0x6f,
-    0x2b,
-    0xbb,
-    0x74,
-    0xfd,
-    0x77,
-    0x38,
-    0x17,
-    0x08,
-    0xb9,
-    0x8f,
-    0xfe,
-    0xc9,
-    0x53,
-    0x66,
-    0xce,
-    0xa0,
-    0x3a,
-    0xad,
-    0x3f,
-    0xb4,
-    0x07,
-    0x6c,
-    0xd0,
-    0xda,
-    0x4b,
-    0xbf,
-    0xba,
-    0xb8,
-    0x23,
-    0x1e,
-    0x22,
-    0x2a,
-    0x0d,
-    0xe2,
-    0x92,
-    0xe4,
-    0xfa,
-    0x05,
-    0xaa,
-    0x59,
-    0xa5,
-    0x2a,
-    0x13,
-    0xdc,
-    0x22,
-    0xdd,
-    0xb5,
-    0x05,
-    0xba,
-    0x1b,
-    0x2a,
-    0x57,
-    0xf6,
-    0x15,
-    0x72,
-    0x1f,
-    0xfa,
-    0x31,
-    0xe8,
-    0x9f,
-    0x14,
-    0x52,
-    0x74,
-    0x6c,
-    0x95,
-    0x59,
-    0x03,
-    0x15,
-    0xe0,
-    0xec,
-    0x34,
-    0x05,
-    0xc0,
-    0x76,
-    0x54,
-    0xab,
-    0xff,
-    0x6e,
-    0x8d,
-    0xd8,
-    0x34,
-    0xdd,
-    0x5a,
-    0x68,
-    0xdc,
-    0x1a,
-    0x3e,
-    0x24,
-    0xac,
-    0xd8,
-    0xb6,
-    0xe7,
-    0x26,
-    0x63,
-    0x6c,
-    0x00,
-    0x6b,
-    0x27,
-    0xad,
-    0xd8,
-    0x50,
-    0x72,
-    0x1d,
-    0xd5,
-    0xb3,
-    0x7b,
-    0xaa,
-    0x7d,
-    0x10,
-    0xa2,
-    0xbe,
-    0xdf,
-    0x4f,
-    0xf9,
-    0xb9,
-    0x2e,
-    0xe0,
-    0x04,
-    0x9e,
-    0xb0,
-    0x0a,
-    0xbd,
-    0x0c,
-    0xd6,
-    0x80,
-    0xdb,
-    0x71,
-    0xad,
-    0x36,
-    0x54,
-    0x7a,
-    0x75,
-    0x72,
-    0x21,
-    0xce,
-    0x8e,
-    0x26,
-    0x41,
-    0xfb,
-    0x9c,
-    0x7d,
-    0x00,
-    0xb0,
-    0xe3,
-    0xb4,
-    0x79,
-    0x2e,
-    0xf3,
-    0x2b,
-    0x5a,
-    0xf9,
-    0x8a,
-    0xbc,
-    0xe7,
-    0xd3,
-    0xb6,
-    0x4b,
-    0x42,
-    0xea,
-    0x3a,
-    0x9e,
-    0xe9,
-    0x51,
-    0x33,
-    0x6f,
-    0x80,
-    0xad,
-    0xfb,
-    0xc0,
-    0xd1,
-    0x31,
-    0x4e,
-    0x6f,
-    0x11,
-    0xcc,
-    0xab,
-    0x0a,
-    0x64,
-    0xa0,
-    0xfd,
-    0xe4,
-    0xa4,
-    0xb7,
-    0x7b,
-    0x69,
-    0x5e,
-    0xf1,
-    0xcd,
-    0xae,
-    0x1e,
-    0x41,
-    0x70,
-    0x4d,
-    0xed,
-    0x19,
-    0x5b,
-    0x6f,
-    0x17,
-    0x23,
-    0xe3,
-    0x2a,
-    0x32,
-    0x32,
-    0xdc,
-    0x0e,
-    0x5b,
-    0x78,
-    0x01,
-    0xfa,
-    0xc3,
-    0xf9,
-    0x96,
-    0x34,
-    0x6b,
-    0x3f,
-    0x4b,
-    0xb9,
-    0x2b,
-    0x50,
-    0x64,
-    0xd2,
-    0xf9,
-    0xdd,
-    0x17,
-    0xe8,
-    0x68,
-    0xbc,
-    0x35,
-    0x99,
-    0x6f,
-    0x99,
-    0x0d,
-    0x0c,
-    0x6c,
-    0xe8,
-    0x8e,
-    0x81,
-    0x68,
-    0x1d,
-    0xab,
-    0x2c,
-    0x9d,
-    0x20,
-    0x04,
-    0x43,
-    0x35,
-    0xfb,
-    0xc2,
-    0x56,
-    0x55,
-    0xd6,
-    0xc2,
-    0xdf,
-    0x5a,
-    0x26,
-    0xf7,
-    0x1a,
-    0x63,
-    0x21,
-    0x09,
-    0x16,
-    0x0f,
-    0x75,
-    0x42,
-    0x0c,
-    0x88,
-    0x39,
-    0xab,
-    0xf1,
-    0xc0,
-    0x24,
-    0x72,
-    0x47,
-    0xfa,
-    0xfd,
-    0x8f,
-    0x38,
-    0x8d,
-    0x52,
-    0xa7,
-    0xe5,
-    0xe4,
-    0x6d,
-    0x31,
-    0xfc,
-    0xca,
-    0x84,
-    0xd7,
-    0x88,
-    0xe4,
-    0x30,
-    0x1f,
-    0x0e,
-    0x7f,
-    0x20,
-    0x4a,
-    0xd5,
-    0x8d,
-    0x0f,
-    0x7d,
-    0x85,
-    0xe9,
-    0xf3,
-    0x1e,
-    0xf4,
-    0xe3,
-    0x78,
-    0x81,
-    0x3c,
-    0xf8,
-    0xac,
-    0xc4,
-    0x11,
-    0xe1,
-    0xfc,
-    0xf7,
-    0x51,
-    0xd0,
-    0x5f,
-    0x80,
-    0xdd,
-    0xf6,
-    0xd1,
-    0xbe,
-    0xa8,
-    0x48,
-    0x03,
-    0xed,
-    0x0d,
-    0x83,
-    0x51,
-    0x4a,
-    0x66,
-    0x6d,
-    0xf4,
-    0x77,
-    0xda,
-    0x5e,
-    0x79,
-    0x20,
-    0x76,
-    0x00,
-    0x71,
-    0xdf,
-    0x7f,
-    0x53,
-    0x6b,
-    0x5d,
-    0x07,
-    0xf4,
-    0x1f,
-    0xbb,
-    0xbf,
-    0x9e,
-    0xec,
-    0x30,
-    0x0c,
-    0xf1,
-    0x85,
-    0xf3,
-    0x5d,
-    0x72,
-    0xe7,
-    0x5b,
-    0xbb,
-    0xd4,
-    0x8e,
-    0x44,
-    0xa2,
-    0x76,
-    0xe8,
-    0xb6,
-    0x0f,
-    0x2c,
-    0x0a,
-    0xc1,
-    0xda,
-    0x42,
-    0xa2,
-    0xab,
-    0x46,
-    0xbe,
-    0x2c,
-    0x4e,
-    0xd7,
-    0xe6,
-    0x69,
-    0xbb,
-    0x63,
-    0x02,
-    0x0d,
-    0x23,
-    0x6c,
-    0x63,
-    0xb8,
-    0xf8,
-    0xad,
-    0xa4,
-    0x28,
-    0x4f,
-    0xf3,
-    0x30,
-    0xad,
-    0x89,
-    0x2e,
-    0x04,
-    0xdd,
-    0x32,
-    0xc8,
-    0xb7,
-    0x88,
-    0x29,
-    0x35,
-    0xb7,
-    0xef,
-    0x01,
-    0xcc,
-    0xd5,
-    0x30,
-    0xa8,
-    0xd5,
-    0x04,
-    0x05,
-    0x46,
-    0xe3,
-    0x5d,
-    0xae,
-    0x68,
-    0x64,
-    0x67,
-    0x2c,
-    0x5e,
-    0x76,
-    0x96,
-    0xb0,
-    0xe1,
-    0xfc,
-    0x11,
-    0x53,
-    0xfa,
-    0xf1,
-    0xb8,
-    0x07,
-    0x1f,
-    0xfd,
-    0x66,
-    0xce,
-    0x9e,
-    0x46,
-    0x73,
-    0x2a,
-    0x3f,
-    0x89,
-    0x7e,
-    0xd4,
-    0x24,
-    0x69,
-    0x69,
-    0xb0,
-    0xf5,
-    0x07,
-    0xa4,
-    0x01,
-    0x3a,
-    0xd2,
-    0xaf,
-    0xda,
-    0x08,
-    0xa1,
-    0xda,
-    0xd5,
-    0xe0,
-    0xff,
-    0x50,
-    0x06,
-    0xd4,
-    0xc5,
-    0x53,
-    0x32,
-    0xeb,
-    0xef,
-    0xc9,
-    0x3d,
-    0xc7,
-    0xa8,
-    0xf8,
-    0xe2,
-    0x85,
-    0xa7,
-    0x8e,
-    0xa7,
-    0xe5,
-    0xbe,
-    0xe4,
-    0x0f,
-    0xab,
-    0xb0,
-    0x83,
-    0x11,
-    0x45,
-    0x44,
-    0xe8,
-    0xc9,
-    0xad,
-    0x97,
-    0x84,
-    0x6e,
-    0x91,
-    0xb6,
-    0x07,
-    0x84,
-    0xb2,
-    0x6c,
-    0xde,
-    0x52,
-    0x8a,
-    0x59,
-    0xfa,
-    0x97,
-    0x31,
-    0x44,
-    0xd4,
-    0x79,
-    0x81,
-    0xb3,
-    0xae,
-    0xbe,
-    0x79,
-    0xb8,
-    0x1b,
-    0x3e,
-    0xdf,
-    0x0d,
-    0xc1,
-    0x98,
-    0x29,
-    0x63,
-    0x5e,
-    0x25,
-    0x9e,
-    0xf8,
-    0x09,
-    0x2a,
-    0xb9,
-    0x68,
-    0xbb,
-    0x52,
-    0xce,
-    0xc5,
-    0x0d,
-    0x5b,
-    0xef,
-    0xe9,
-    0x43,
-    0x0f,
-    0x11,
-    0x0b,
-    0x8a,
-    0x76,
-    0x6b,
-    0x91,
-    0x7e,
-    0x4a,
-    0x1f,
-    0x25,
-    0xef,
-    0xab,
-    0x1c,
-    0x0b,
-    0xe5,
-    0x14,
-    0x43,
-    0xb2,
-    0xe1,
-    0x8e,
-    0xc9,
-    0x89,
-    0x66,
-    0x23,
-    0xdc,
-    0x13,
-    0xb8,
-    0x96,
-    0x89,
-    0x3e,
-    0xe4,
-    0x51,
-    0xdd,
-    0xf1,
-    0x00,
-    0x9f,
-    0x4a,
-    0xe4,
-    0xb4,
-    0x1b,
-    0x4d,
-    0xb4,
-    0xfa,
-    0x69,
-    0x4e,
-    0x37,
-    0x21,
-    0x23,
-    0xc8,
-    0x0d,
-    0x18,
-    0x16,
-    0xa9,
-    0x77,
-    0xe9,
-    0xaf,
-    0xfc,
-    0x6c,
-    0x84,
-    0xb0,
-    0xc5,
-    0xea,
-    0xbe,
-    0x27,
-    0x2c,
-    0x8b,
-    0x99,
-    0xa1,
-    0xde,
-    0x58,
-    0xc6,
-    0x9b,
-    0xb1,
-    0xe1,
-    0x68,
-    0x39,
-    0x87,
-    0x8e,
-    0x1b,
-    0x3b,
-    0x74,
-    0x30,
-    0x35,
-    0x2c,
-    0x23,
-    0xdb,
-    0x4c,
-    0xdc,
-    0x75,
-    0xf8,
-    0xf8,
-    0x11,
-    0x6c,
-    0x96,
-    0xd9,
-    0x7a,
-    0x48,
-    0x01,
-    0xdc,
-    0xe4,
-    0xef,
-    0x96,
-    0xbb,
-    0xb0,
-    0x92,
-    0xd5,
-    0xc3,
-    0x85,
-    0x8e,
-    0xb8,
-    0xda,
-    0x42,
-    0x90,
-    0x43,
-    0xc0,
-    0x37,
-    0xfd,
-    0x5d,
-    0x95,
-    0x94,
-    0x91,
-    0xde,
-    0x9c,
-    0x21,
-    0x46,
-    0xe9,
-    0x3e,
-    0x30,
-    0x77,
-    0x7c,
-    0x52,
-    0xd1,
-    0x45,
-    0x45,
-    0x9b,
-    0x44,
-    0x3a,
-    0xb8,
-    0x92,
-    0xb4,
-    0x2c,
-    0x5e,
-    0x66,
-    0x22,
-    0x64,
-    0x70,
-    0x42,
-    0x9f,
-    0x00,
-    0xa4,
-    0xce,
-    0xbe,
-    0x96,
-    0x47,
-    0xf8,
-    0x49,
-    0x1a,
-    0x8c,
-    0xf4,
-    0x33,
-    0x02,
-    0x24,
-    0x81,
-    0xce,
-    0xa7,
-    0x0e,
-    0x6f,
-    0x3e,
-    0xef,
-    0xb1,
-    0x5e,
-    0x2e,
-    0x29,
-    0x28,
-    0xc8,
-    0xc1,
-    0x38,
-    0xdd,
-    0x42,
-    0xcb,
-    0xf4,
-    0x59,
-    0xfe,
-    0x42,
-    0xcd,
-    0x5a,
-    0x95,
-    0xef,
-    0xb2,
-    0x26,
-    0x03,
-    0x69,
-    0x31,
-    0x20,
-    0xf3,
-    0x44,
-    0xdf,
-    0x99,
-    0x3e,
-    0x86,
-    0xfa,
-    0xe8,
-    0xae,
-    0x5a,
-    0x4d,
-    0xbd,
-    0x07,
-    0x09,
-    0x54,
-    0xb2,
-    0x48,
-    0x25,
-    0xa1,
-    0x23,
-    0x2e,
-    0x08,
-    0x7e,
-    0x40,
-    0xfa,
-    0x7d,
-    0xd4,
-    0x60,
-    0x74,
-    0xbc,
-    0x4b,
-    0x99,
-    0x30,
-    0x9c,
-    0xb3,
-    0x8d,
-    0x10,
-    0x04,
-    0xa3,
-    0x86,
-    0x0a,
-    0xa2,
-    0x5f,
-    0xc6,
-    0x2b,
-    0xe0,
-    0xff,
-    0x18,
-    0xdc,
-    0x14,
-    0xce,
-    0xab,
-    0x65,
-    0xf7,
-    0xf1,
-    0x20,
-    0xaf,
-    0x59,
-    0x49,
-    0xe2,
-    0x4e,
-    0x13,
-    0x9a,
-    0xb6,
-    0xbe,
-    0x3c,
-    0xec,
-    0x93,
-    0xed,
-    0xa0,
-    0x31,
-    0xb3,
-    0xfa,
-    0x6d,
-    0x29,
-    0xea,
-    0x3d,
-    0x30,
-    0x83,
-    0x37,
-    0x87,
-    0x00,
-    0x45,
-    0x99,
-    0xab,
-    0xf9,
-    0x6d,
-    0x23,
-    0x3d,
-    0xed,
-    0xd8,
-    0x53,
-    0x99,
-    0x55,
-    0x64,
-    0xa0,
-    0x27,
-    0x8e,
-    0x52,
-    0x52,
-    0xde,
-    0x42,
-    0xee,
-    0x96,
-    0x07,
-    0x24,
-    0x71,
-    0xd2,
-    0x44,
-    0xe0,
-    0x26,
-    0x36,
-    0xd0,
-    0x51,
-    0xcc,
-    0x94,
-    0x08,
-    0xf5,
-    0x3c,
-    0x71,
-    0x2b,
-    0x9f,
-    0x4b,
-    0x5c,
-    0x5e,
-    0x6c,
-    0xf2,
-    0x7e,
-    0xf3,
-    0xf8,
-    0xac,
-    0x73,
-    0xea,
-    0xd2,
-    0x20,
-    0x58,
-    0xb8,
-    0x2d,
-    0x00,
-    0x25,
-    0x48,
-    0xd8,
-    0x31,
-    0x3d,
-    0x40,
-    0x70,
-    0x2c,
-    0x44,
-    0x85,
-    0xd4,
-    0xa4,
-    0x31,
-    0x01,
-    0xd9,
-    0x69,
-    0xa4,
-    0xa4,
-    0x3f,
-    0x8c,
-    0x79,
-    0xa8,
-    0xe4,
-    0xc4,
-    0x9d,
-    0x1a,
-    0x38,
-    0x10,
-    0x20,
-    0x96,
-    0xf1,
-    0x9e,
-    0x8c,
-    0x52,
-    0x00,
-    0xec,
-    0x76,
-    0x5d,
-    0xc3,
-    0x2d,
-    0x52,
-    0x29,
-    0x7c,
-    0xee,
-    0x8c,
-    0x48,
-    0x02,
-    0xf9,
-    0xd4,
-    0x73,
-    0xb6,
-    0x79,
-    0xb9,
-    0xd0,
-    0xb9,
-    0x60,
-    0x79,
-    0x75,
-    0x5c,
-    0x06,
-    0x17,
-    0x28,
-    0xd8,
-    0x12,
-    0xaf,
-    0x68,
-    0x40,
-    0x9e,
-    0x07,
-    0xb2,
-    0xb3,
-    0x96,
-    0x66,
-    0xfd,
-    0xd6,
-    0x61,
-    0xa9,
-    0x87,
-    0x81,
-    0xc4,
-    0x93,
-    0xd3,
-    0xb9,
-    0x03,
-    0x65,
-    0xf2,
-    0xdf,
-    0x49,
-    0xae,
-    0x03,
-    0x26,
-    0x49,
-    0x65,
-    0xf6,
-    0x4b,
-    0x26,
-    0x35,
-    0x95,
-    0x80,
-    0x90,
-    0x18,
-    0xc4,
-    0xa9,
-    0x31,
-    0x27,
-    0x07,
-    0xca,
-    0x47,
-    0xb1,
-    0x46,
-    0xc0,
-    0x92,
-    0x8a,
-    0xcd,
-    0x30,
-    0x70,
-    0xa5,
-    0x97,
-    0xbe,
-    0x47,
-    0xe5,
-    0xcc,
-    0x7f,
-    0x23,
-    0x31,
-    0x88,
-    0xb0,
-    0xa0,
-    0xc7,
-    0xde,
-    0xa8,
-    0x0b,
-    0xd2,
-    0x1d,
-    0x0b,
-    0xc4,
-    0x3e,
-    0x51,
-    0x41,
-    0xe6,
-    0xcb,
-    0x0d,
-    0x26,
-    0x2a,
-    0x60,
-    0x68,
-    0x03,
-    0x09,
-    0xa3,
-    0x46,
-    0xbe,
-    0x21,
-    0xc6,
-    0xd9,
-    0x4d,
-    0xda,
-    0xa3,
-    0x67,
-    0x70,
-    0x49,
-    0x0c,
-    0x4d,
-    0xa0,
-    0x55,
-    0x5c,
-    0x44,
-    0x42,
-    0x18,
-    0x52,
-    0xe3,
-    0x21,
-    0x88,
-    0x20,
-    0x65,
-    0x1b,
-    0x56,
-    0xbe,
-    0xad,
-    0x1b,
-    0x16,
-    0x84,
-    0x87,
-    0x47,
-    0xa1,
-    0xf8,
-    0x31,
-    0x7a,
-    0xb7,
-    0xe5,
-    0x1a,
-    0xf4,
-    0xe9,
-    0xad,
-    0xe9,
-    0x50,
-    0xb6,
-    0xdf,
-    0xc1,
-    0xb7,
-    0xf5,
-    0x0c,
-    0xc3,
-    0x54,
-    0x73,
-    0xd7,
-    0xd5,
-    0x07,
-    0xdc,
-    0x4c,
-    0xa2,
-    0x5e,
-    0xdf,
-    0x73,
-    0xe2,
-    0xc1,
-    0x8d,
-    0x24,
-    0xdc,
-    0xec,
-    0x02,
-    0x1c,
-    0x29,
-    0xa3,
-    0x48,
-    0x51,
-    0xba,
-    0xa0,
-    0x78,
-    0x83,
-    0x1d,
-    0xd1,
-    0x22,
-    0x14,
-    0xfb,
-    0xc0,
-    0xef,
-    0x19,
-    0xe6,
-    0x53,
-    0x85,
-    0xb1,
-    0x51,
-    0xb5,
-    0xab,
-    0x96,
-    0xe0,
-    0x94,
-    0xae,
-    0xf1,
-    0xe3,
-    0x8d,
-    0x03,
-    0x73,
-    0x1d,
-    0xe4,
-    0x2d,
-    0xa1,
-    0xc9,
-    0x79,
-    0xe2,
-    0x6f,
-    0xdf,
-    0xf7,
-    0x69,
-    0x11,
-    0x93,
-    0x4f,
-    0x46,
-    0x0e,
-    0x1e,
-    0x65,
-    0x19,
-    0x96,
-    0xc2,
-    0x08,
-    0xc4,
-    0x15,
-    0x08,
-    0x28,
-    0xcc,
-    0x08,
-    0x4d,
-    0x43,
-    0x02,
-    0x10,
-    0x7c,
-    0x21,
-    0x62,
-    0x44,
-    0x1d,
-    0xc1,
-    0x3b,
-    0xcc,
-    0x8f,
-    0x93,
-    0x90,
-    0xac,
-    0x91,
-    0xe8,
-    0xbe,
-    0xdd,
-    0x08,
-    0xa6,
-    0x60,
-    0xa2,
-    0xfc,
-    0x40,
-    0x70,
-    0x19,
-    0xe3,
-    0xe5,
-    0xaf,
-    0x10,
-    0x22,
-    0xf8,
-    0x46,
-    0x1b,
-    0xd1,
-    0xc1,
-    0xad,
-    0xe3,
-    0xbe,
-    0x62,
-    0xcc,
-    0xc1,
-    0xb5,
-    0x0c,
-    0x60,
-    0x8c,
-    0xff,
-    0x72,
-    0xa1,
-    0xaf,
-    0x29,
-    0x7e,
-    0x22,
-    0x7e,
-    0x07,
-    0x43,
-    0xf8,
-    0xca,
-    0xf7,
-    0x34,
-    0x1e,
-    0xb2,
-    0x6a,
-    0x93,
-    0x18,
-    0xbd,
-    0xa1,
-    0x2c,
-    0xd7,
-    0x26,
-    0xb5,
-    0x42,
-    0xdd,
-    0x77,
-    0xda,
-    0xca,
-    0xa1,
-    0x59,
-    0xe4,
-    0xd7,
-    0x35,
-    0xab,
-    0x0b,
-    0x56,
-    0x26,
-    0xd1,
-    0xeb,
-    0xfb,
-    0xa4,
-    0x4f,
-    0xcf,
-    0x7b,
-    0xe2,
-    0x96,
-    0x2e,
-    0xfc,
-    0xc0,
-    0x1d,
-    0x76,
-    0xc9,
-    0xa8,
-    0xb4,
-    0x09,
-    0x4b,
-    0xb5,
-    0x16,
-    0x85,
-    0x35,
-    0x1b,
-    0xbd,
-    0x49,
-    0xfe,
-    0xc3,
-    0xfa,
-    0x35,
-    0x94,
-    0x35,
-    0x44,
-    0xb0,
-    0x4f,
-    0xbb,
-    0xd1,
-    0xf0,
-    0x23,
-    0xc3,
-    0x63,
-    0x76,
-    0x1b,
-    0x86,
-    0x65,
-    0xd7,
-    0x02,
-    0xe7,
-    0x36,
-    0xc2,
-    0x63,
-    0x9e,
-    0xc5,
-    0x3f,
-    0xb5,
-    0x95,
-    0x5e,
-    0x35,
-    0xcf,
-    0x92,
-    0xc3,
-    0x2f,
-    0xa2,
-    0x17,
-    0x7f,
-    0x5f,
-    0x26,
-    0x87,
-    0x77,
-    0xe4,
-    0x95,
-    0x89,
-    0xc2,
-    0x48,
-    0xd8,
-    0xb1,
-    0xba,
-    0x4d,
-    0x3e,
-    0x5e,
-    0x53,
-    0xe9,
-    0x74,
-    0xde,
-    0xac,
-    0x8f,
-    0xb2,
-    0xd9,
-    0xe4,
-    0xb0,
-    0x32,
-    0xec,
-    0x2f,
-    0x82,
-    0xe6,
-    0x94,
-    0x29,
-    0x00,
-    0x6a,
-    0x4e,
-    0x6a,
-    0x32,
-    0x38,
-    0xfc,
-    0x5a,
-    0xae,
-    0x1b,
-    0x8b,
-    0x46,
-    0x5f,
-    0xe6,
-    0xd3,
-    0xb4,
-    0x85,
-    0x65,
-    0xbe,
-    0xf4,
-    0xfd,
-    0x94,
-    0xad,
-    0xf8,
-    0xc3,
-    0x0f,
-    0x17,
-    0x66,
-    0xb5,
-    0xca,
-    0x73,
-    0xea,
-    0x99,
-    0x02,
-    0x59,
-    0xd1,
-    0x62,
-    0x73,
-    0xe4,
-    0xd4,
-    0xaf,
-    0xcc,
-    0x5a,
-    0x31,
-    0x95,
-    0x60,
-    0x0f,
-    0x01,
-    0x9e,
-    0x1e,
-    0x86,
-    0xc5,
-    0x11,
-    0xc3,
-    0xda,
-    0x42,
-    0x74,
-    0x4e,
-    0x5c,
-    0x8f,
-    0x50,
-    0xb4,
-    0x7e,
-    0x6c,
-    0x34,
-    0xd6,
-    0xf0,
-    0xd5,
-    0xfc,
-    0xb0,
-    0x08,
-    0xd7,
-    0x53,
-    0xd3,
-    0x67,
-    0xa3,
-    0x77,
-    0x15,
-    0xda,
-    0xe1,
-    0x3d,
-    0x87,
-    0x7e,
-    0x46,
-    0x54,
-    0xa7,
-    0x28,
-    0x69,
-    0xcd,
-    0xd7,
-    0x03,
-    0xd2,
-    0xdb,
-    0x0e,
-    0x7b,
-    0x54,
-    0xd8,
-    0xce,
-    0x5a,
-    0x9e,
-    0x89,
-    0x56,
-    0x31,
-    0x0c,
-    0xa3,
-    0x18,
-    0xfa,
-    0xc3,
-    0x8e,
-    0x6d,
-    0xfb,
-    0xfc,
-    0x68,
-    0x88,
-    0xee,
-    0xa0,
-    0x4d,
-    0xa8,
-    0x5e,
-    0x16,
-    0xd6,
-    0x92,
-    0x54,
-    0x58,
-    0xdf,
-    0x3f,
-    0x33,
-    0x4d,
-    0x8e,
-    0xd2,
-    0xe1,
-    0x53,
-    0x91,
-    0xcd,
-    0x27,
-    0x1a,
-    0xa6,
-    0x83,
-    0x5b,
-    0xb9,
-    0x61,
-    0xd1,
-    0x3c,
-    0xfb,
-    0x2a,
-    0x09,
-    0x1d,
-    0xfa,
-    0x85,
-    0x2f,
-    0x46,
-    0xf0,
-    0x96,
-    0x68,
-    0x97,
-    0x49,
-    0xe4,
-    0xaf,
-    0x6e,
-    0xfd,
-    0x5d,
-    0xca,
-    0xcb,
-    0x1c,
-    0x9a,
-    0x7c,
-    0xb2,
-    0xab,
-    0x65,
-    0xfd,
-    0xd1,
-    0xae,
-    0x78,
-    0xa7,
-    0x63,
-    0x86,
-    0x88,
-    0xf2,
-    0x54,
-    0x7d,
-    0x82,
-    0xa2,
-    0xa6,
-    0xa0,
-    0x15,
-    0x3f,
-    0x13,
-    0xcd,
-    0x70,
-    0xc6,
-    0xf4,
-    0x0c,
-    0x4d,
-    0x9e,
-    0x61,
-    0x22,
-    0x2e,
-    0xcd,
-    0x9a,
-    0x64,
-    0xe6,
-    0x6c,
-    0xa5,
-    0xca,
-    0x5c,
-    0x58,
-    0x39,
-    0x44,
-    0x8c,
-    0x2b,
-    0xdb,
-    0x51,
-    0xce,
-    0x6b,
-    0x47,
-    0xcd,
-    0x5b,
-    0x01,
-    0x11,
-    0x0a,
-    0x0d,
-    0xec,
-    0x8c,
-    0x23,
-    0x66,
-    0x36,
-    0xeb,
-    0x8d,
-    0xd4,
-    0x27,
-    0xa6,
-    0xef,
-    0x33,
-    0xba,
-    0x20,
-    0x34,
-    0x94,
-    0x4d,
-    0x86,
-    0xde,
-    0x3d,
-    0x9c,
-    0xfa,
-    0x9d,
-    0xf1,
-    0xf0,
-    0xf1,
-    0x20,
-    0x71,
-    0x94,
-    0xd9,
-    0x2b,
-    0x42,
-    0x89,
-    0x00,
-    0xea,
-    0xb1,
-    0x7a,
-    0xb1,
-    0x85,
-    0x15,
-    0xf2,
-    0xa0,
-    0xf4,
-    0x54,
-    0xcd,
-    0x87,
-    0x15,
-    0xa8,
-    0xed,
-    0x12,
-    0xfb,
-    0xa3,
-    0x2e,
-    0xf9,
-    0x89,
-    0x71,
-    0x9b,
-    0x6b,
-    0x40,
-    0x5e,
-    0xe2,
-    0xb3,
-    0x56,
-    0x97,
-    0x05,
-    0x16,
-    0x08,
-    0x35,
-    0x53,
-    0xfa,
-    0x31,
-    0x77,
-    0x97,
-    0x4e,
-    0x1a,
-    0x4f,
-    0x8f,
-    0x25,
-    0x94,
-    0x21,
-    0x9f,
-    0xa4,
-    0x44,
-    0xc7,
-    0xc7,
-    0x1f,
-    0x3f,
-    0xd8,
-    0xd3,
-    0x7f,
-    0xd7,
-    0x2a,
-    0xd1,
-    0xe7,
-    0xb4,
-    0x95,
-    0xc8,
-    0x97,
-    0x26,
-    0xfa,
-    0xa7,
-    0x10,
-    0xb9,
-    0x84,
-    0x7c,
-    0x78,
-    0x0a,
-    0x2e,
-    0xe6,
-    0x41,
-    0xda,
-    0x86,
-    0xcd,
-    0x06,
-    0x61,
-    0xb0,
-    0x50,
-    0xb5,
-    0xe4,
-    0xad,
-    0xff,
-    0xf3,
-    0x8a,
-    0xde,
-    0x4b,
-    0xbc,
-    0x6c,
-    0xc3,
-    0x3a,
-    0x4a,
-    0xeb,
-    0x09,
-    0x60,
-    0x39,
-    0x46,
-    0xc4,
-    0x0a,
-    0xe8,
-    0x6c,
-    0xf9,
-    0xbc,
-    0x22,
-    0x0e,
-    0x5f,
-    0xde,
-    0xfe,
-    0xf9,
-    0x66,
-    0xb2,
-    0x03,
-    0xa3,
-    0x79,
-    0x89,
-    0x90,
-    0x03,
-    0x80,
-    0x37,
-    0x7b,
-    0xa6,
-    0xaa,
-    0xc4,
-    0xf9,
-    0x00,
-    0x69,
-    0x64,
-    0xbe,
-    0x00,
-    0xbe,
-    0xa9,
-    0x65,
-    0xe7,
-    0xb6,
-    0xf8,
-    0x11,
-    0x59,
-    0x35,
-    0x3a,
-    0x55,
-    0xb4,
-    0xf2,
-    0xd3,
-    0x51,
-    0xa2,
-    0xc3,
-    0xd8,
-    0x1e,
-    0xea,
-    0x1b,
-    0x7c,
-    0x6d,
-    0x8c,
-    0xd0,
-    0xcc,
-    0x6a,
-    0x0c,
-    0x22,
-    0x9d,
-    0xe7,
-    0x0e,
-    0xfa,
-    0xc2,
-    0xb6,
-    0x23,
-    0x6f,
-    0x82,
-    0x56,
-    0xe3,
-    0x8e,
-    0x49,
-    0xd3,
-    0x3c,
-    0x5b,
-    0x9d,
-    0xe7,
-    0x09,
-    0x13,
-    0x54,
-    0x65,
-    0xe6,
-    0xb4,
-    0x04,
-    0xd7,
-    0x43,
-    0xbf,
-    0xbc,
-    0x66,
-    0xb8,
-    0x3d,
-    0xf1,
-    0xfb,
-    0x98,
-    0x00,
-    0xbb,
-    0xa4,
-    0xc9,
-    0x2b,
-    0x42,
-    0x39,
-    0xd3,
-    0xf5,
-    0x72,
-    0x3f,
-    0x36,
-    0xa9,
-    0xf7,
-    0x0c,
-    0x01,
-    0xf1,
-    0x65,
-    0x2c,
-    0xa0,
-    0x55,
-    0xb6,
-    0x04,
-    0xf6,
-    0xff,
-    0xfa,
-    0xb5,
-    0xac,
-    0xc1,
-    0x4a,
-    0x44,
-    0xc8,
-    0x59,
-    0xfe,
-    0xf7,
-    0x81,
-    0xf3,
-    0x20,
-    0x02,
-    0x51,
-    0xef,
-    0x20,
-    0x62,
-    0x4d,
-    0xe5,
-    0xc8,
-    0x0a,
-    0xb2,
-    0xe6,
-    0x73,
-    0x3d,
-    0xc0,
-    0x05,
-    0x7a,
-    0x3b,
-    0xcb,
-    0x16,
-    0xf0,
-    0x1f,
-    0x8f,
-    0xb6,
-    0x8f,
-    0x08,
-    0xc4,
-    0x8c,
-    0xf1,
-    0x77,
-    0xf2,
-    0xce,
-    0x04,
-    0xf8,
-    0x87,
-    0x06,
-    0xb8,
-    0x05,
-    0x27,
-    0x16,
-    0xfa,
-    0x27,
-    0x43,
-    0x79,
-    0xe6,
-    0x5e,
-    0xed,
-    0xcd,
-    0x38,
-    0xc3,
-    0xea,
-    0x8e,
-    0x04,
-    0x6c,
-    0x09,
-    0x25,
-    0xa8,
-    0x90,
-    0xb4,
-    0x21,
-    0xfe,
-    0xeb,
-    0xc5,
-    0xc4,
-    0xd6,
-    0x64,
-    0x9b,
-    0xc1,
-    0xa3,
-    0xee,
-    0x6c,
-    0x44,
-    0x74,
-    0xac,
-    0xdc,
-    0x33,
-    0x26,
-    0x58,
-    0xcf,
-    0xb3,
-    0xd8,
-    0xe5,
-    0x7c,
-    0xef,
-    0xa0,
-    0x63,
-    0xc4,
-    0x15,
-    0x7c,
-    0x24,
-    0xc1,
-    0xa0,
-    0x8c,
-    0x1d,
-    0xa1,
-    0xdd,
-    0x7e,
-    0x8e,
-    0xb5,
-    0xa8,
-    0x49,
-    0xe6,
-    0xc5,
-    0x77,
-    0x1e,
-    0xe1,
-    0xa7,
-    0x9b,
-    0x9b,
-    0xf3,
-    0x0f,
-    0xc2,
-    0x43,
-    0xe9,
-    0xa9,
-    0xbf,
-    0x2b,
-    0xce,
-    0x65,
-    0x8e,
-    0xf5,
-    0x0b,
-    0x13,
-    0x92,
-    0x02,
-    0xd3,
-    0x2f,
-    0x22,
-    0xe4,
-    0xbe,
-    0xfe,
-    0x44,
-    0x12,
-    0xb4,
-    0xda,
-    0xb8,
-    0xe0,
-    0x0d,
-    0xc9,
-    0x39,
-    0xae,
-    0xf6,
-    0x55,
-    0xff,
-    0x5f,
-    0x17,
-    0x98,
-    0x88,
-    0x0d,
-    0x73,
-    0x97,
-    0x98,
-    0xfa,
-    0x8f,
-    0xd1,
-    0x7f,
-    0xca,
-    0xd6,
-    0x17,
-    0x9a,
-    0xf0,
-    0x3c,
-    0x9d,
-    0x1c,
-    0x67,
-    0x22,
-    0x52,
-    0x0e,
-    0xa2,
-    0x79,
-    0x6d,
-    0x95,
-    0xc5,
-    0x2b,
-    0x48,
-    0x74,
-    0x15,
-    0xb6,
-    0x72,
-    0xd1,
-    0xad,
-    0x1a,
-    0x00,
-    0x3c,
-    0x74,
-    0xf6,
-    0x23,
-    0xed,
-    0x4b,
-    0xee,
-    0x00,
-    0x4d,
-    0x8b,
-    0x4f,
-    0xbb,
-    0xb9,
-    0xae,
-    0xf6,
-    0xd5,
-    0x82,
-    0x4c,
-    0x6e,
-    0xb9,
-    0x38,
-    0x4a,
-    0x58,
-    0x91,
-    0x28,
-    0x4e,
-    0x10,
-    0x5e,
-    0x23,
-    0x75,
-    0x8d,
-    0x48,
-    0x81,
-    0x49,
-    0x89,
-    0x32,
-    0x66,
-    0xed,
-    0xe2,
-    0x92,
-    0x44,
-    0x9b,
-    0x41,
-    0x80,
-    0xa1,
-    0x51,
-    0xf9,
-    0x0d,
-    0x1b,
-    0xc6,
-    0x32,
-    0xd5,
-    0xa9,
-    0xa3,
-    0x46,
-    0xd8,
-    0x23,
-    0xf0,
-    0x6b,
-    0x85,
-    0x05,
-    0xcc,
-    0x93,
-    0x18,
-    0x70,
-    0x62,
-    0x90,
-    0x26,
-    0x71,
-    0x18,
-    0x7c,
-    0x76,
-    0x86,
-    0x09,
-    0x58,
-    0x13,
-    0x5e,
-    0xb6,
-    0xf3,
-    0x9f,
-    0xe1,
-    0xf8,
-    0x0d,
-    0xea,
-    0x70,
-    0x3a,
-    0xbd,
-    0xc4,
-    0x6e,
-    0xe4,
-    0x10,
-    0x0f,
-    0xff,
-    0x1a,
-    0xf3,
-    0x18,
-    0x0f,
-    0xa7,
-    0x53,
-    0x27,
-    0x97,
-    0x34,
-    0x82,
-    0x54,
-    0x1b,
-    0xbe,
-    0xdd,
-    0x9d,
-    0x78,
-    0x47,
-    0xac,
-    0x36,
-    0xdc,
-    0xcb,
-    0x49,
-    0x20,
-    0x16,
-    0x75,
-    0x85,
-    0xfd,
-    0x10,
-    0x13,
-    0x47,
-    0x23,
-    0x99,
-    0xc8,
-    0x76,
-    0xef,
-    0x68,
-    0x00,
-    0x19,
-    0x5b,
-    0x5e,
-    0xa9,
-    0xbd,
-    0xd3,
-    0x0c,
-    0xa1,
-    0x17,
-    0x45,
-    0x75,
-    0x6a,
-    0xeb,
-    0x78,
-    0x15,
-    0x25,
-    0x2d,
-    0x9e,
-    0x22,
-    0xbe,
-    0x65,
-    0x2c,
-    0x11,
-    0x64,
-    0x58,
-    0xe9,
-    0x5c,
-    0x3c,
-    0xe4,
-    0x45,
-    0x83,
-    0x56,
-    0x2c,
-    0xed,
-    0x51,
-    0xe0,
-    0xf5,
-    0x9c,
-    0x60,
-    0x99,
-    0x50,
-    0x34,
-    0xdf,
-    0x89,
-    0x7a,
-    0x0d,
-    0x93,
-    0xf0,
-    0x00,
-    0x8d,
-    0x1c,
-    0x7c,
-    0x26,
-    0xf9,
-    0x7a,
-    0xbe,
-    0x8a,
-    0x8a,
-    0xcf,
-    0xdf,
-    0x05,
-    0xc4,
-    0x66,
-    0x8f,
-    0xd2,
-    0x03,
-    0xf5,
-    0x3f,
-    0xf2,
-    0x57,
-    0x1f,
-    0x90,
-    0xce,
-    0x91,
-    0x3d,
-    0x0b,
-    0x1f,
-    0x9e,
-    0x5e,
-    0x12,
-    0x0b,
-    0x14,
-    0x8c,
-    0x16,
-    0x90,
-    0x0b,
-    0x52,
-    0x0b,
-    0x26,
-    0x2e,
-    0x7b,
-    0x19,
-    0xa0,
-    0x12,
-    0x1b,
-    0x95,
-    0x54,
-    0xc6,
-    0xd4,
-    0x2f,
-    0x7b,
-    0xab,
-    0x52,
-    0x6d,
-    0xdb,
-    0x85,
-    0x18,
-    0x58,
-    0xa3,
-    0xd3,
-    0x7f,
-    0x75,
-    0x96,
-    0x5c,
-    0xfb,
-    0xf6,
-    0x6b,
-    0x0b,
-    0xa1,
-    0x32,
-    0x74,
-    0xfc,
-    0xe6,
-    0x53,
-    0x7f,
-    0xd7,
-    0xaa,
-    0x4e,
-    0xfa,
-    0x5d,
-    0x75,
-    0x19,
-    0x5a,
-    0x40,
-    0x00,
-    0x18,
-    0xbd,
-    0x38,
-    0xf7,
-    0xd8,
-    0xcd,
-    0x53,
-    0xfd,
-    0xff,
-    0xe8,
-    0x8d,
-    0xf1,
-    0x83,
-    0x7f,
-    0xa0,
-    0x6f,
-    0x1b,
-    0xbc,
-    0x1d,
-    0x9a,
-    0xf3,
-    0x68,
-    0xbc,
-    0x19,
-    0xa4,
-    0x0b,
-    0xf0,
-    0x60,
-    0x63,
-    0x55,
-    0xbf,
-    0x31,
-    0x78,
-    0xbc,
-    0xd1,
-    0x62,
-    0xf3,
-    0x67,
-    0xc7,
-    0xe0,
-    0x9a,
-    0x4b,
-    0xce,
-    0xf4,
-    0x25,
-    0x94,
-    0x73,
-    0xc5,
-    0xae,
-    0x46,
-    0xb9,
-    0x1f,
-    0x63,
-    0x24,
-    0x68,
-    0x72,
-    0x7e,
-    0xd1,
-    0xa9,
-    0x1e,
-    0x77,
-    0x35,
-    0xd0,
-    0xed,
-    0x77,
-    0x22,
-    0x79,
-    0xe1,
-    0x11,
-    0x37,
-    0xd6,
-    0x31,
-    0x2d,
-    0x05,
-    0x47,
-    0x8e,
-    0x44,
-    0x71,
-    0x2b,
-    0xaa,
-    0xd3,
-    0x59,
-    0xf7,
-    0xfb,
-    0x09,
-    0x7b,
-    0x85,
-    0xbd,
-    0xc3,
-    0x92,
-    0xae,
-    0x36,
-    0xbb,
-    0xc1,
-    0x1a,
-    0x3d,
-    0xfc,
-    0x35,
-    0x57,
-    0xfd,
-    0x9a,
-    0x07,
-    0x29,
-    0xf7,
-    0x9f,
-    0x5f,
-    0x21,
-    0x46,
-    0x48,
-    0xdf,
-    0x71,
-    0x27,
-    0x72,
-    0x3f,
-    0xff,
-    0xb8,
-    0x4f,
-    0x34,
-    0xb8,
-    0x00,
-    0x5d,
-    0x97,
-    0x27,
-    0x30,
-    0x99,
-    0xc3,
-    0x46,
-    0x28,
-    0xf0,
-    0x3f,
-    0x94,
-    0x3d,
-    0xf6,
-    0x9d,
-    0x67,
-    0x3a,
-    0xda,
-    0xa1,
-    0x84,
-    0xa4,
-    0x9a,
-    0xa6,
-    0xed,
-    0x43,
-    0x73,
-    0x3e,
-    0xfa,
-    0xdd,
-    0x9c,
-    0x19,
-    0xab,
-    0x45,
-    0x33,
-    0x28,
-    0x3d,
-    0x95,
-    0x78,
-    0x01,
-    0xfb,
-    0xb7,
-    0x39,
-    0x86,
-    0x57,
-    0x2a,
-    0x8d,
-    0xc1,
-    0x39,
-    0x02,
-    0xc5,
-    0x13,
-    0x97,
-    0x31,
-    0xa0,
-    0x8e,
-    0x46,
-    0x06,
-    0xbe,
-    0x9f,
-    0x10,
-    0xf3,
-    0x57,
-    0xf0,
-    0x06,
-    0x93,
-    0x2d,
-    0x8c,
-    0x17,
-    0xeb,
-    0xbf,
-    0x45,
-    0xe2,
-    0xf1,
-    0xc0,
-    0x53,
-    0xc9,
-    0x4a,
-    0xc7,
-    0x3d,
-    0x47,
-    0x58,
-    0x48,
-    0xfd,
-    0x83,
-    0x74,
-    0xc3,
-    0x5f,
-    0x25,
-    0x78,
-    0x3b,
-    0xaa,
-    0x68,
-    0x81,
-    0xea,
-    0x82,
-    0x70,
-    0xf3,
-    0x33,
-    0x0d,
-    0xdf,
-    0xbd,
-    0xd8,
-    0x55,
-    0xa3,
-    0xde,
-    0x6d,
-    0xed,
-    0x11,
-    0x28,
-    0x0d,
-    0xd8,
-    0x38,
-    0x43,
-    0x4b,
-    0xa6,
-    0x6f,
-    0xf6,
-    0x6b,
-    0xe0,
-    0x31,
-    0xa2,
-    0xd3,
-    0xa6,
-    0x2b,
-    0x0f,
-    0xbc,
-    0x97,
-    0x92,
-    0x6b,
-    0x2d,
-    0xf1,
-    0xba,
-    0x90,
-    0x2a,
-    0xf9,
-    0xe5,
-    0x86,
-    0x29,
-    0x9e,
-    0x59,
-    0x49,
-    0xc5,
-    0x59,
-    0xb5,
-    0xcc,
-    0xb6,
-    0x57,
-    0x84,
-    0x3d,
-    0x01,
-    0xda,
-    0x13,
-    0x8b,
-    0x6c,
-    0xdd,
-    0x80,
-    0x26,
-    0x35,
-    0xf7,
-    0x14,
-    0x06,
-    0x03,
-    0x81,
-    0xd2,
-    0xee,
-    0x1d,
-    0xfb,
-    0x50,
-    0xf2,
-    0xda,
-    0xac,
-    0xc6,
-    0x37,
-    0x59,
-    0x89,
-    0x65,
-    0xfa,
-    0x71,
-    0x58,
-    0xea,
-    0xd3,
-    0xeb,
-    0x15,
-    0x72,
-    0x3b,
-    0xef,
-    0x95,
-    0x90,
-    0x4d,
-    0xbd,
-    0x69,
-    0x9d,
-    0xc9,
-    0x9e,
-    0x05,
-    0x4f,
-    0x5e,
-    0x19,
-    0x22,
-    0x8d,
-    0x29,
-    0x69,
-    0x60,
-    0x82,
-    0x79,
-    0x2f,
-    0x30,
-    0xf1,
-    0xd5,
-    0x65,
-    0xf1,
-    0xc8,
-    0x40,
-    0x93,
-    0x59,
-    0xf7,
-    0xbb,
-    0x45,
-    0x17,
-    0x82,
-    0x0c,
-    0xbc,
-    0xb6,
-    0xd5,
-    0xbe,
-    0xe4,
-    0xc5,
-    0x59,
-    0x69,
-    0x86,
-    0x35,
-    0x44,
-    0x33,
-    0xbf,
-    0x02,
-    0xb5,
-    0x97,
-    0xb1,
-    0x16,
-    0x00,
-    0x65,
-    0x78,
-    0x6a,
-    0x46,
-    0x0a,
-    0x5f,
-    0x6e,
-    0x4a
-  ],
-  const [
-    0xd2,
-    0xf6,
-    0x1e,
-    0x1a,
-    0x3e,
-    0x37,
-    0x0e,
-    0x78,
-    0xdb,
-    0x7a,
-    0x35,
-    0x6c,
-    0xff,
-    0x4e,
-    0x3e,
-    0x0a,
-    0x40,
-    0x80,
-    0x0a,
-    0xb9,
-    0x36,
-    0xd7,
-    0x9b,
-    0x89,
-    0x82,
-    0x01,
-    0x31,
-    0xc6,
-    0x0e,
-    0xce,
-    0xb2,
-    0xcd,
-    0x97,
-    0x9c,
-    0x4f,
-    0x1e,
-    0x69,
-    0x13,
-    0x65,
-    0xb3,
-    0x6a,
-    0x12,
-    0xa1,
-    0x90,
-    0x5a,
-    0xe8,
-    0x68,
-    0x9c,
-    0x59,
-    0xc8,
-    0x76,
-    0xaf,
-    0xaa,
-    0x77,
-    0xc5,
-    0xec,
-    0xb6,
-    0x48,
-    0xb0,
-    0x51,
-    0x54,
-    0x4a,
-    0x58,
-    0x8c,
-    0x47,
-    0xc0,
-    0x47,
-    0x10,
-    0x08,
-    0xd1,
-    0x53,
-    0x69,
-    0xc7,
-    0x81,
-    0xc5,
-    0xcc,
-    0xac,
-    0xe0,
-    0xbb,
-    0xf3,
-    0x62,
-    0x81,
-    0xcb,
-    0x28,
-    0xd6,
-    0x2e,
-    0xe9,
-    0x9f,
-    0x3c,
-    0xda,
-    0x8b,
-    0x08,
-    0x54,
-    0xd7,
-    0x0b,
-    0x65,
-    0xeb,
-    0x4a,
-    0x4c,
-    0x19,
-    0xa4,
-    0xdb,
-    0xa0,
-    0x42,
-    0xf8,
-    0xb1,
-    0xe9,
-    0x49,
-    0x7c,
-    0x9d,
-    0xff,
-    0xb8,
-    0x62,
-    0x95,
-    0x52,
-    0x4b,
-    0x43,
-    0x65,
-    0xd1,
-    0x49,
-    0x1c,
-    0xa1,
-    0x0a,
-    0x14,
-    0x96,
-    0xde,
-    0x92,
-    0xff,
-    0x8a,
-    0x21,
-    0xa7,
-    0x61,
-    0xc4,
-    0x98,
-    0x14,
-    0xe8,
-    0x07,
-    0x88,
-    0x55,
-    0x2f,
-    0x52,
-    0x87,
-    0xfc,
-    0x92,
-    0x62,
-    0xeb,
-    0x53,
-    0x41,
-    0x78,
-    0x82,
-    0x43,
-    0x93,
-    0x5c,
-    0x84,
-    0x74,
-    0x9d,
-    0xa2,
-    0xc5,
-    0xb6,
-    0x04,
-    0x2c,
-    0x2f,
-    0xa0,
-    0x0f,
-    0xf0,
-    0x70,
-    0x76,
-    0x00,
-    0xfb,
-    0xf0,
-    0x50,
-    0xa5,
-    0xb6,
-    0x06,
-    0x79,
-    0x2a,
-    0x69,
-    0x6b,
-    0x16,
-    0x31,
-    0xfd,
-    0xef,
-    0x08,
-    0x24,
-    0x06,
-    0x6a,
-    0x13,
-    0xca,
-    0x01,
-    0xf6,
-    0x3f,
-    0x19,
-    0xd9,
-    0x5b,
-    0x7e,
-    0x4c,
-    0xb1,
-    0xcb,
-    0x90,
-    0x35,
-    0xdd,
-    0xd0,
-    0x24,
-    0xd3,
-    0x31,
-    0x82,
-    0x40,
-    0x27,
-    0x7f,
-    0xfd,
-    0xe2,
-    0x44,
-    0x5b,
-    0x12,
-    0xe8,
-    0xa6,
-    0x21,
-    0x3d,
-    0x2d,
-    0xc4,
-    0x3a,
-    0xd7,
-    0xf5,
-    0xe8,
-    0x9a,
-    0x8d,
-    0x8b,
-    0x3f,
-    0x8d,
-    0x11,
-    0x28,
-    0x2c,
-    0xb4,
-    0x0f,
-    0x17,
-    0xe2,
-    0x4a,
-    0x63,
-    0x17,
-    0x32,
-    0xac,
-    0x89,
-    0x01,
-    0xa1,
-    0x19,
-    0x55,
-    0xaa,
-    0xbe,
-    0xb6,
-    0xe4,
-    0x0b,
-    0xb3,
-    0xd5,
-    0xd2,
-    0x9f,
-    0x19,
-    0x76,
-    0xad,
-    0x0d,
-    0x11,
-    0x0e,
-    0xaa,
-    0x07,
-    0x90,
-    0x88,
-    0x97,
-    0x72,
-    0xfa,
-    0x8a,
-    0x11,
-    0xc7,
-    0xf3,
-    0xf9,
-    0xf7,
-    0xb9,
-    0x72,
-    0xbf,
-    0x1f,
-    0x18,
-    0x16,
-    0xcc,
-    0x47,
-    0xf5,
-    0xbe,
-    0x5a,
-    0x4e,
-    0x07,
-    0x54,
-    0x76,
-    0xa4,
-    0x4d,
-    0xe9,
-    0xbc,
-    0xff,
-    0xf5,
-    0x07,
-    0x62,
-    0x4f,
-    0x7d,
-    0x42,
-    0x78,
-    0xf5,
-    0x18,
-    0x11,
-    0x6d,
-    0x2f,
-    0x53,
-    0xdc,
-    0xd6,
-    0xd7,
-    0xf8,
-    0x56,
-    0x6b,
-    0x4e,
-    0x32,
-    0x0d,
-    0x52,
-    0xb3,
-    0xf3,
-    0x40,
-    0xa1,
-    0x58,
-    0x93,
-    0xf0,
-    0x1e,
-    0x76,
-    0xba,
-    0x39,
-    0x49,
-    0x1f,
-    0x7f,
-    0xe3,
-    0x9c,
-    0x75,
-    0xd1,
-    0x35,
-    0x11,
-    0x1a,
-    0x16,
-    0x09,
-    0xe5,
-    0xe7,
-    0x13,
-    0x26,
-    0x9b,
-    0xe1,
-    0x0c,
-    0xc9,
-    0x45,
-    0x68,
-    0x2c,
-    0x85,
-    0xff,
-    0xb2,
-    0x27,
-    0x4d,
-    0xbc,
-    0x78,
-    0x1d,
-    0xd0,
-    0x45,
-    0xef,
-    0xc2,
-    0x05,
-    0x7e,
-    0xfa,
-    0xbc,
-    0x06,
-    0xeb,
-    0x9e,
-    0x4c,
-    0x21,
-    0x74,
-    0xb6,
-    0x31,
-    0x2c,
-    0x65,
-    0xe8,
-    0xc9,
-    0x1a,
-    0xb9,
-    0xd7,
-    0x7a,
-    0xcc,
-    0x98,
-    0x9a,
-    0x50,
-    0x29,
-    0x1e,
-    0x6e,
-    0xe7,
-    0x71,
-    0x5e,
-    0xa7,
-    0x8c,
-    0xce,
-    0xa7,
-    0xed,
-    0x9f,
-    0x2d,
-    0x06,
-    0xa4,
-    0x3b,
-    0x4b,
-    0x0b,
-    0xac,
-    0x1a,
-    0x13,
-    0xd0,
-    0x4b,
-    0xb2,
-    0x27,
-    0x38,
-    0x67,
-    0xa4,
-    0xbd,
-    0x75,
-    0xf9,
-    0x57,
-    0xac,
-    0xcd,
-    0xbe,
-    0xe0,
-    0xc6,
-    0x9d,
-    0x30,
-    0x26,
-    0x69,
-    0x9e,
-    0xb4,
-    0x43,
-    0x51,
-    0x67,
-    0x15,
-    0x2d,
-    0xb0,
-    0x33,
-    0x31,
-    0x95,
-    0x81,
-    0xe5,
-    0xf2,
-    0x0f,
-    0x19,
-    0x49,
-    0x80,
-    0x74,
-    0xff,
-    0x9d,
-    0xb5,
-    0x84,
-    0xfd,
-    0x50,
-    0xd2,
-    0xd0,
-    0x77,
-    0x09,
-    0x70,
-    0xd8,
-    0xfc,
-    0xeb,
-    0xb9,
-    0x70,
-    0x1b,
-    0x18,
-    0xd7,
-    0x68,
-    0x78,
-    0x73,
-    0xad,
-    0x6b,
-    0x1f,
-    0xab,
-    0xc5,
-    0x28,
-    0x17,
-    0x75,
-    0x8a,
-    0xb0,
-    0x3b,
-    0x18,
-    0xb8,
-    0x1f,
-    0x45,
-    0x2f,
-    0x10,
-    0x7f,
-    0x2c,
-    0xaa,
-    0x50,
-    0xe9,
-    0xb0,
-    0x17,
-    0x62,
-    0xed,
-    0x32,
-    0x20,
-    0xd4,
-    0x35,
-    0xca,
-    0x54,
-    0x88,
-    0x64,
-    0x94,
-    0x2a,
-    0xad,
-    0x44,
-    0x4a,
-    0x42,
-    0xed,
-    0x21,
-    0x18,
-    0xef,
-    0xe8,
-    0x70,
-    0xab,
-    0xf3,
-    0xe2,
-    0xb5,
-    0x8c,
-    0x89,
-    0xb8,
-    0xa3,
-    0xac,
-    0xa9,
-    0x19,
-    0x84,
-    0x40,
-    0x87,
-    0xf2,
-    0xdb,
-    0xce,
-    0x5d,
-    0x2a,
-    0x48,
-    0x88,
-    0x6a,
-    0x90,
-    0xad,
-    0xda,
-    0x3a,
-    0x12,
-    0x8f,
-    0x3f,
-    0x29,
-    0x2f,
-    0xbf,
-    0x58,
-    0x23,
-    0xaf,
-    0x39,
-    0x3f,
-    0xad,
-    0x91,
-    0x4c,
-    0x19,
-    0x29,
-    0x45,
-    0xfb,
-    0xea,
-    0x55,
-    0x1b,
-    0xa4,
-    0xae,
-    0x16,
-    0xfc,
-    0xdf,
-    0xa5,
-    0x74,
-    0x58,
-    0xa9,
-    0xee,
-    0xe5,
-    0x5f,
-    0xc2,
-    0x57,
-    0xce,
-    0x74,
-    0x53,
-    0x74,
-    0x47,
-    0xde,
-    0xd4,
-    0xee,
-    0x1f,
-    0xc1,
-    0x2d,
-    0x1e,
-    0x1f,
-    0x4d,
-    0x1b,
-    0xda,
-    0x93,
-    0x36,
-    0xd6,
-    0x8f,
-    0x07,
-    0x64,
-    0xf1,
-    0x90,
-    0x4f,
-    0xeb,
-    0x81,
-    0xae,
-    0xca,
-    0x3d,
-    0x81,
-    0x09,
-    0xe7,
-    0x9f,
-    0x75,
-    0x26,
-    0xe7,
-    0xd9,
-    0x4e,
-    0x41,
-    0xe5,
-    0x32,
-    0x8e,
-    0xe4,
-    0x14,
-    0x9b,
-    0xac,
-    0xb8,
-    0x49,
-    0x2b,
-    0xba,
-    0x9c,
-    0xb9,
-    0xcb,
-    0x45,
-    0xf4,
-    0x03,
-    0x33,
-    0x7d,
-    0x43,
-    0x71,
-    0x15,
-    0x95,
-    0xfd,
-    0x7a,
-    0x97,
-    0x6d,
-    0x96,
-    0x8c,
-    0x07,
-    0x6f,
-    0xdf,
-    0x09,
-    0xca,
-    0xb7,
-    0x92,
-    0x90,
-    0x96,
-    0x76,
-    0x2b,
-    0x7d,
-    0xe2,
-    0x98,
-    0xfa,
-    0xb3,
-    0x9a,
-    0xa4,
-    0x77,
-    0x99,
-    0x16,
-    0xe4,
-    0xd5,
-    0x62,
-    0x4d,
-    0xc7,
-    0xda,
-    0x92,
-    0x46,
-    0x83,
-    0xed,
-    0xbd,
-    0xd0,
-    0xfe,
-    0x71,
-    0x92,
-    0x73,
-    0xef,
-    0x51,
-    0x19,
-    0xa6,
-    0x40,
-    0xdc,
-    0x39,
-    0x42,
-    0xb8,
-    0xd4,
-    0x7d,
-    0x37,
-    0xd6,
-    0xc1,
-    0x18,
-    0x7e,
-    0x00,
-    0x8b,
-    0x26,
-    0x4f,
-    0xdd,
-    0x48,
-    0x34,
-    0x93,
-    0xff,
-    0x53,
-    0x03,
-    0x9c,
-    0xc5,
-    0x9e,
-    0x89,
-    0x14,
-    0x7f,
-    0x49,
-    0x39,
-    0x33,
-    0xd4,
-    0x73,
-    0x84,
-    0x35,
-    0x61,
-    0x50,
-    0xa0,
-    0x0c,
-    0xa3,
-    0x7b,
-    0x88,
-    0x52,
-    0x17,
-    0x8e,
-    0x44,
-    0x81,
-    0x9f,
-    0xf1,
-    0x6a,
-    0x66,
-    0x28,
-    0xef,
-    0xe5,
-    0xd3,
-    0x8a,
-    0x0f,
-    0xf5,
-    0x95,
-    0xaf,
-    0xa1,
-    0x77,
-    0xa5,
-    0xf8,
-    0x97,
-    0x67,
-    0xa3,
-    0xdc,
-    0x96,
-    0xa3,
-    0x7f,
-    0xd3,
-    0x4d,
-    0xf1,
-    0x7a,
-    0x72,
-    0x06,
-    0x44,
-    0x4d,
-    0xd7,
-    0x7a,
-    0x3b,
-    0xa7,
-    0x47,
-    0xea,
-    0xeb,
-    0xdd,
-    0x16,
-    0x6b,
-    0xde,
-    0xdd,
-    0xc7,
-    0x82,
-    0x5b,
-    0x65,
-    0x75,
-    0xf0,
-    0xe8,
-    0x72,
-    0x72,
-    0xcf,
-    0x0e,
-    0xfa,
-    0x2d,
-    0xde,
-    0x5c,
-    0xdd,
-    0x59,
-    0x1a,
-    0xaf,
-    0x1a,
-    0x4b,
-    0x8e,
-    0xb0,
-    0x3e,
-    0xa4,
-    0x6b,
-    0x9d,
-    0x23,
-    0x31,
-    0x5b,
-    0x4d,
-    0xd6,
-    0x0f,
-    0x13,
-    0x6e,
-    0xd9,
-    0x13,
-    0x27,
-    0x12,
-    0x8b,
-    0x68,
-    0x23,
-    0x6a,
-    0xe4,
-    0x7a,
-    0xd7,
-    0xd0,
-    0x65,
-    0x13,
-    0xf2,
-    0x0b,
-    0x4f,
-    0xc4,
-    0xd3,
-    0xcf,
-    0x14,
-    0x87,
-    0x9b,
-    0x84,
-    0x0b,
-    0xa2,
-    0x87,
-    0x48,
-    0x67,
-    0xcf,
-    0x7d,
-    0x37,
-    0x6a,
-    0x99,
-    0xe4,
-    0xea,
-    0xd6,
-    0x09,
-    0xb9,
-    0x3d,
-    0xa5,
-    0x82,
-    0xdf,
-    0x56,
-    0xf9,
-    0xea,
-    0xb7,
-    0xe3,
-    0x56,
-    0x0a,
-    0xf1,
-    0xa2,
-    0x0f,
-    0x38,
-    0xa2,
-    0x27,
-    0xfe,
-    0x33,
-    0x96,
-    0xda,
-    0x78,
-    0x4e,
-    0xe7,
-    0x3f,
-    0x80,
-    0xd1,
-    0xce,
-    0x7a,
-    0x3b,
-    0x9c,
-    0xba,
-    0x12,
-    0xa5,
-    0x0d,
-    0x9f,
-    0xf5,
-    0x81,
-    0x24,
-    0x91,
-    0xbc,
-    0x96,
-    0xe5,
-    0x91,
-    0x31,
-    0x18,
-    0xfe,
-    0xa7,
-    0x0e,
-    0x65,
-    0xaa,
-    0x31,
-    0x08,
-    0xf2,
-    0xd5,
-    0x7a,
-    0x0c,
-    0x84,
-    0x81,
-    0x8e,
-    0xc9,
-    0xa3,
-    0x68,
-    0x4d,
-    0x6e,
-    0x4b,
-    0xe3,
-    0xbf,
-    0xb5,
-    0xe6,
-    0x0a,
-    0xa7,
-    0x20,
-    0x77,
-    0x1d,
-    0x5b,
-    0x82,
-    0x18,
-    0x23,
-    0xd2,
-    0xc2,
-    0xa6,
-    0xd0,
-    0xff,
-    0xdc,
-    0xbb,
-    0xac,
-    0x5d,
-    0x28,
-    0xdc,
-    0x72,
-    0xcc,
-    0xdf,
-    0xf4,
-    0xb6,
-    0x9b,
-    0xdb,
-    0x01,
-    0xcb,
-    0xe6,
-    0x9e,
-    0x0e,
-    0xe4,
-    0x22,
-    0x96,
-    0x61,
-    0x79,
-    0xf6,
-    0xa0,
-    0xf5,
-    0xed,
-    0x4c,
-    0xca,
-    0x2b,
-    0x6d,
-    0xa9,
-    0x5d,
-    0xbc,
-    0x1b,
-    0xb9,
-    0x1b,
-    0xf2,
-    0x6c,
-    0x2f,
-    0xc5,
-    0x18,
-    0xce,
-    0xcc,
-    0xe0,
-    0x2f,
-    0x8f,
-    0xbc,
-    0xb9,
-    0xe2,
-    0xfa,
-    0x29,
-    0xa7,
-    0xbc,
-    0xc3,
-    0x0b,
-    0x90,
-    0x99,
-    0xa5,
-    0x3d,
-    0xae,
-    0x5a,
-    0x49,
-    0xd6,
-    0x93,
-    0xdd,
-    0x6a,
-    0xb6,
-    0x6b,
-    0x2d,
-    0x37,
-    0x5f,
-    0x82,
-    0xf5,
-    0xf8,
-    0x07,
-    0x06,
-    0x3b,
-    0xf5,
-    0xeb,
-    0x0d,
-    0x4a,
-    0x93,
-    0xe5,
-    0xd9,
-    0xf0,
-    0xc1,
-    0x41,
-    0x5b,
-    0xea,
-    0x92,
-    0xcd,
-    0xf7,
-    0x9d,
-    0x2b,
-    0x2f,
-    0x87,
-    0x07,
-    0xe0,
-    0x7b,
-    0xa2,
-    0xf4,
-    0x9a,
-    0x05,
-    0x1e,
-    0x75,
-    0x7c,
-    0x74,
-    0xd3,
-    0x8e,
-    0xc6,
-    0x18,
-    0xa2,
-    0x2f,
-    0xf9,
-    0x7e,
-    0xb7,
-    0x65,
-    0x3c,
-    0x41,
-    0x0a,
-    0xd2,
-    0xfe,
-    0x22,
-    0x2c,
-    0x5b,
-    0xdd,
-    0x5b,
-    0x40,
-    0x20,
-    0xc6,
-    0x31,
-    0x47,
-    0xb1,
-    0x5e,
-    0xc9,
-    0xa2,
-    0x7f,
-    0xa1,
-    0x3c,
-    0xd1,
-    0x90,
-    0xc9,
-    0xed,
-    0x81,
-    0x77,
-    0x72,
-    0x1b,
-    0xc6,
-    0x84,
-    0xfb,
-    0xb2,
-    0xa5,
-    0x38,
-    0x2f,
-    0x67,
-    0xd5,
-    0xfb,
-    0x25,
-    0x03,
-    0xc6,
-    0x11,
-    0x64,
-    0xff,
-    0xe3,
-    0xcb,
-    0x4b,
-    0x52,
-    0x15,
-    0xfa,
-    0xb1,
-    0x87,
-    0x88,
-    0xa9,
-    0xc8,
-    0x12,
-    0xb1,
-    0x0c,
-    0x47,
-    0xe4,
-    0x90,
-    0xb3,
-    0xc8,
-    0x3d,
-    0x32,
-    0x03,
-    0x6e,
-    0xc2,
-    0x7b,
-    0xe7,
-    0xcc,
-    0xcf,
-    0x22,
-    0xc3,
-    0x02,
-    0x0e,
-    0xfd,
-    0xaa,
-    0x29,
-    0x49,
-    0x7f,
-    0xd0,
-    0xf2,
-    0x7c,
-    0x7f,
-    0x42,
-    0x89,
-    0x2f,
-    0x3a,
-    0xd4,
-    0xc0,
-    0x02,
-    0x9c,
-    0x5b,
-    0x69,
-    0x8a,
-    0xbb,
-    0x1d,
-    0x03,
-    0x5b,
-    0xa5,
-    0x86,
-    0x9a,
-    0x66,
-    0x5b,
-    0x1d,
-    0xe8,
-    0x86,
-    0x1d,
-    0xb6,
-    0xc0,
-    0x55,
-    0xe8,
-    0xe8,
-    0xad,
-    0x44,
-    0x3e,
-    0xc1,
-    0xd6,
-    0xeb,
-    0x25,
-    0xb9,
-    0x24,
-    0x9d,
-    0x72,
-    0xe5,
-    0xa7,
-    0x40,
-    0x47,
-    0x6d,
-    0x36,
-    0x5b,
-    0xdb,
-    0x40,
-    0x56,
-    0x71,
-    0x79,
-    0x06,
-    0x5e,
-    0x8e,
-    0xcc,
-    0x57,
-    0xd8,
-    0x1f,
-    0x59,
-    0x2a,
-    0x29,
-    0x06,
-    0x4d,
-    0x90,
-    0x75,
-    0xee,
-    0x79,
-    0xa2,
-    0xbd,
-    0xdc,
-    0x9b,
-    0xb7,
-    0x4a,
-    0x07,
-    0xdf,
-    0xdb,
-    0x4f,
-    0xea,
-    0xa5,
-    0x7d,
-    0xca,
-    0x97,
-    0x85,
-    0x68,
-    0xab,
-    0x4e,
-    0x90,
-    0xf5,
-    0x38,
-    0x4e,
-    0xd9,
-    0x7e,
-    0xb0,
-    0xeb,
-    0x35,
-    0x15,
-    0x2e,
-    0xe1,
-    0x3e,
-    0x76,
-    0xd1,
-    0xe8,
-    0x9e,
-    0x3b,
-    0x1a,
-    0x89,
-    0x8a,
-    0x4f,
-    0x95,
-    0x2f,
-    0x8c,
-    0xa5,
-    0xbc,
-    0x81,
-    0x86,
-    0x2a,
-    0x18,
-    0xef,
-    0xf4,
-    0xf8,
-    0xa9,
-    0x8b,
-    0x71,
-    0xcc,
-    0x88,
-    0x1b,
-    0x7d,
-    0xba,
-    0xcb,
-    0x6c,
-    0x7d,
-    0x1f,
-    0xa9,
-    0xe9,
-    0x03,
-    0xd8,
-    0xdf,
-    0x6b,
-    0x50,
-    0xb1,
-    0x51,
-    0x53,
-    0x17,
-    0x20,
-    0xf5,
-    0xd7,
-    0x84,
-    0x34,
-    0xed,
-    0x99,
-    0x7d,
-    0xc8,
-    0xf3,
-    0x7e,
-    0x28,
-    0xfc,
-    0xfa,
-    0xbd,
-    0xad,
-    0xe6,
-    0x12,
-    0x36,
-    0x3d,
-    0x84,
-    0x8d,
-    0x06,
-    0x53,
-    0xf5,
-    0x60,
-    0x58,
-    0x39,
-    0xe9,
-    0xcc,
-    0x7d,
-    0xcf,
-    0x57,
-    0x3d,
-    0x40,
-    0x88,
-    0x6e,
-    0x72,
-    0x73,
-    0xb5,
-    0xcd,
-    0xde,
-    0xce,
-    0x06,
-    0xf6,
-    0x4e,
-    0xfa,
-    0x4d,
-    0x00,
-    0xcd,
-    0xe8,
-    0x86,
-    0x8d,
-    0xc4,
-    0x67,
-    0x15,
-    0xfc,
-    0x66,
-    0xf6,
-    0x4e,
-    0xe0,
-    0x4b,
-    0xd6,
-    0x3a,
-    0xb0,
-    0x5b,
-    0x64,
-    0x98,
-    0xc0,
-    0xee,
-    0xa6,
-    0x23,
-    0x6f,
-    0x32,
-    0x24,
-    0x13,
-    0xa2,
-    0xcc,
-    0xf9,
-    0xe6,
-    0x72,
-    0xc2,
-    0x29,
-    0x60,
-    0x22,
-    0x98,
-    0x35,
-    0xd1,
-    0x54,
-    0xb9,
-    0xed,
-    0x96,
-    0x7c,
-    0x19,
-    0x86,
-    0xe2,
-    0x94,
-    0x19,
-    0xec,
-    0xbf,
-    0x12,
-    0xab,
-    0x59,
-    0x4f,
-    0x17,
-    0xb6,
-    0x27,
-    0x58,
-    0xe9,
-    0xbc,
-    0xe3,
-    0xff,
-    0xa3,
-    0xba,
-    0xa2,
-    0xd4,
-    0x2b,
-    0x4f,
-    0x98,
-    0x0f,
-    0x65,
-    0x21,
-    0xe6,
-    0x19,
-    0xa6,
-    0x7d,
-    0xb4,
-    0x4f,
-    0x6c,
-    0x3d,
-    0x80,
-    0x02,
-    0x4c,
-    0xef,
-    0xb5,
-    0xc2,
-    0x2b,
-    0x33,
-    0x80,
-    0xdc,
-    0xb1,
-    0x65,
-    0xdf,
-    0x21,
-    0xfb,
-    0x7c,
-    0xfb,
-    0xe9,
-    0x90,
-    0x32,
-    0xb7,
-    0x58,
-    0x97,
-    0x66,
-    0x89,
-    0xe0,
-    0x47,
-    0xbe,
-    0x89,
-    0x07,
-    0x9e,
-    0x90,
-    0xc7,
-    0x6b,
-    0x56,
-    0x03,
-    0xe2,
-    0x03,
-    0x15,
-    0x71,
-    0xd6,
-    0xa7,
-    0xe4,
-    0x10,
-    0x16,
-    0xd3,
-    0xe2,
-    0xd2,
-    0xdb,
-    0xa8,
-    0x39,
-    0x89,
-    0xbb,
-    0x33,
-    0x52,
-    0x4f,
-    0x7d,
-    0xf2,
-    0x45,
-    0x25,
-    0x2c,
-    0x94,
-    0x94,
-    0xda,
-    0x6a,
-    0x01,
-    0x18,
-    0x2f,
-    0x07,
-    0x9a,
-    0x3b,
-    0x38,
-    0xd2,
-    0xc2,
-    0x68,
-    0x05,
-    0xaf,
-    0x9d,
-    0xc0,
-    0x82,
-    0xea,
-    0x17,
-    0x0f,
-    0x9c,
-    0xcb,
-    0x29,
-    0xfe,
-    0xa5,
-    0x6b,
-    0x58,
-    0x8a,
-    0xfa,
-    0xc5,
-    0x7e,
-    0xb4,
-    0xe3,
-    0x10,
-    0xcc,
-    0x7a,
-    0xba,
-    0x4d,
-    0x10,
-    0x07,
-    0x50,
-    0x1c,
-    0x34,
-    0x27,
-    0x8c,
-    0xd3,
-    0x07,
-    0xfd,
-    0x55,
-    0xd1,
-    0x41,
-    0xf8,
-    0xb2,
-    0x10,
-    0xc1,
-    0x03,
-    0x30,
-    0xfa,
-    0x18,
-    0xfc,
-    0x85,
-    0x7e,
-    0x4b,
-    0x68,
-    0x72,
-    0x62,
-    0xd5,
-    0x65,
-    0xee,
-    0xdb,
-    0xec,
-    0xdf,
-    0x80,
-    0x5b,
-    0x05,
-    0x07,
-    0xed,
-    0xaa,
-    0x9a,
-    0x01,
-    0x13,
-    0x38,
-    0x2b,
-    0xdd,
-    0x15,
-    0xb2,
-    0x83,
-    0xc9,
-    0xb8,
-    0xd3,
-    0x3c,
-    0x85,
-    0x0d,
-    0x7d,
-    0x85,
-    0x17,
-    0x51,
-    0x08,
-    0x23,
-    0xbf,
-    0x11,
-    0xda,
-    0xb6,
-    0x2d,
-    0x91,
-    0x37,
-    0x3e,
-    0xf2,
-    0x6f,
-    0x5b,
-    0xdd,
-    0x35,
-    0x84,
-    0xc6,
-    0xdf,
-    0xa7,
-    0x0b,
-    0xd8,
-    0xf7,
-    0xb9,
-    0x05,
-    0x9d,
-    0xcb,
-    0x0c,
-    0xdc,
-    0xea,
-    0xb3,
-    0x28,
-    0x46,
-    0xa9,
-    0xbe,
-    0x72,
-    0x6c,
-    0x71,
-    0xf7,
-    0x58,
-    0x4c,
-    0x5a,
-    0xe6,
-    0xcf,
-    0x5b,
-    0x0f,
-    0x59,
-    0xff,
-    0x6f,
-    0x24,
-    0x64,
-    0x3c,
-    0xdd,
-    0xaa,
-    0xa6,
-    0x39,
-    0xde,
-    0x01,
-    0xce,
-    0x78,
-    0x38,
-    0xee,
-    0x5e,
-    0x05,
-    0x1a,
-    0xed,
-    0xaf,
-    0x64,
-    0x47,
-    0xc9,
-    0x35,
-    0xc8,
-    0x76,
-    0x69,
-    0x05,
-    0x86,
-    0xf9,
-    0xed,
-    0x94,
-    0xc8,
-    0x9e,
-    0xfa,
-    0xc2,
-    0x86,
-    0xd3,
-    0x51,
-    0x17,
-    0xb2,
-    0x0d,
-    0xa7,
-    0x4c,
-    0xb3,
-    0x6a,
-    0xb1,
-    0x0d,
-    0x15,
-    0x95,
-    0x7e,
-    0xfd,
-    0x7f,
-    0xea,
-    0x09,
-    0xfb,
-    0xe5,
-    0xda,
-    0x0f,
-    0xa4,
-    0xfe,
-    0x91,
-    0x1e,
-    0x18,
-    0xf9,
-    0xd7,
-    0xef,
-    0x01,
-    0x6c,
-    0x34,
-    0xf5,
-    0xd2,
-    0x8d,
-    0x58,
-    0x36,
-    0x4d,
-    0xa4,
-    0xb9,
-    0x5a,
-    0x48,
-    0xc0,
-    0x7e,
-    0x01,
-    0xb0,
-    0xa9,
-    0x9c,
-    0x5a,
-    0xce,
-    0x17,
-    0x3f,
-    0xf2,
-    0xc9,
-    0x21,
-    0x6b,
-    0xc9,
-    0x6d,
-    0xf8,
-    0xe3,
-    0xab,
-    0x2a,
-    0xd5,
-    0x4a,
-    0xbd,
-    0x60,
-    0x30,
-    0x88,
-    0x57,
-    0xda,
-    0x33,
-    0x6f,
-    0x11,
-    0x98,
-    0x6e,
-    0x9f,
-    0x21,
-    0xd1,
-    0xcc,
-    0xa6,
-    0xe4,
-    0x38,
-    0xc6,
-    0x6c,
-    0xba,
-    0x7f,
-    0xd6,
-    0xcf,
-    0x17,
-    0x19,
-    0x2f,
-    0x8a,
-    0xd7,
-    0x45,
-    0xab,
-    0x5b,
-    0xd2,
-    0x48,
-    0x05,
-    0x65,
-    0xb1,
-    0xf9,
-    0x48,
-    0xd3,
-    0x00,
-    0x83,
-    0x87,
-    0xbe,
-    0x84,
-    0x67,
-    0xcf,
-    0x50,
-    0xce,
-    0xc0,
-    0x5a,
-    0x2a,
-    0x10,
-    0xcb,
-    0x05,
-    0x04,
-    0x30,
-    0xa6,
-    0x04,
-    0x93,
-    0x1b,
-    0x58,
-    0xd5,
-    0xb0,
-    0x5c,
-    0x12,
-    0x72,
-    0xb6,
-    0xed,
-    0xb5,
-    0xcb,
-    0x2c,
-    0x4c,
-    0x93,
-    0x73,
-    0xa4,
-    0xd2,
-    0x7a,
-    0x9a,
-    0xe2,
-    0x41,
-    0xef,
-    0x3b,
-    0x41,
-    0x9c,
-    0xb7,
-    0x96,
-    0x53,
-    0x3b,
-    0x9c,
-    0xe1,
-    0xc8,
-    0x1e,
-    0x6d,
-    0x3b,
-    0x91,
-    0x82,
-    0x47,
-    0xe1,
-    0x45,
-    0xb2,
-    0x13,
-    0xa4,
-    0xc3,
-    0x20,
-    0x50,
-    0x9b,
-    0x19,
-    0xb4,
-    0x13,
-    0x15,
-    0xa4,
-    0x64,
-    0x4b,
-    0xd1,
-    0x79,
-    0x05,
-    0x4a,
-    0x72,
-    0x04,
-    0x60,
-    0x81,
-    0x2d,
-    0xef,
-    0x89,
-    0x8b,
-    0xc5,
-    0x45,
-    0x6c,
-    0x6e,
-    0xb9,
-    0xd8,
-    0xa9,
-    0x1d,
-    0xbc,
-    0xe0,
-    0xa2,
-    0x41,
-    0x65,
-    0xe4,
-    0xd1,
-    0x38,
-    0x28,
-    0xde,
-    0x60,
-    0x5e,
-    0x85,
-    0x9a,
-    0xf3,
-    0x8c,
-    0x7f,
-    0x5f,
-    0xc9,
-    0xdf,
-    0x50,
-    0xd1,
-    0x03,
-    0xbb,
-    0x5b,
-    0x16,
-    0x43,
-    0x0f,
-    0x62,
-    0x38,
-    0x79,
-    0xda,
-    0xf9,
-    0xca,
-    0xfa,
-    0xee,
-    0x3a,
-    0xcf,
-    0xd3,
-    0xf4,
-    0xbb,
-    0xd7,
-    0x5c,
-    0xb0,
-    0xbd,
-    0x6b,
-    0x10,
-    0x86,
-    0xa6,
-    0xab,
-    0x9b,
-    0x3d,
-    0xb2,
-    0x36,
-    0x35,
-    0x04,
-    0xe5,
-    0x4a,
-    0x2f,
-    0xb2,
-    0x44,
-    0x2d,
-    0xcb,
-    0x52,
-    0x44,
-    0xcb,
-    0x51,
-    0xdf,
-    0x83,
-    0xa0,
-    0x5f,
-    0x4c,
-    0xb6,
-    0xd8,
-    0x81,
-    0xc7,
-    0xe2,
-    0xb5,
-    0x01,
-    0x3f,
-    0xd0,
-    0x32,
-    0x01,
-    0x24,
-    0xbb,
-    0xe6,
-    0xc6,
-    0x6e,
-    0x4b,
-    0x2a,
-    0x57,
-    0xe0,
-    0xc7,
-    0x7e,
-    0x47,
-    0x8e,
-    0x86,
-    0x29,
-    0xcf,
-    0x9d,
-    0xa6,
-    0x20,
-    0x20,
-    0x4a,
-    0x01,
-    0x29,
-    0xf6,
-    0x2d,
-    0x5d,
-    0x40,
-    0x71,
-    0xbf,
-    0xe3,
-    0x3a,
-    0x21,
-    0x1b,
-    0xd3,
-    0xa8,
-    0x5f,
-    0x01,
-    0x75,
-    0xfe,
-    0xe4,
-    0x20,
-    0x53,
-    0xf5,
-    0x94,
-    0x95,
-    0xa5,
-    0x2d,
-    0x9b,
-    0xaf,
-    0x0d,
-    0x17,
-    0xbb,
-    0xf5,
-    0x84,
-    0x12,
-    0xe4,
-    0x6a,
-    0x94,
-    0xd4,
-    0x06,
-    0x0f,
-    0xc9,
-    0x0c,
-    0x23,
-    0xaa,
-    0x62,
-    0x45,
-    0xa8,
-    0xc6,
-    0x4b,
-    0x0e,
-    0xfd,
-    0xfb,
-    0x50,
-    0x58,
-    0x5b,
-    0x6f,
-    0x8b,
-    0x1f,
-    0xde,
-    0x9d,
-    0x1e,
-    0x4d,
-    0xdb,
-    0x55,
-    0x28,
-    0xdb,
-    0x73,
-    0x04,
-    0xf1,
-    0x39,
-    0x68,
-    0x36,
-    0x68,
-    0xf0,
-    0x30,
-    0x59,
-    0xd0,
-    0x86,
-    0x48,
-    0xc4,
-    0xb6,
-    0xa1,
-    0xcb,
-    0xf8,
-    0x26,
-    0x70,
-    0x43,
-    0x25,
-    0x1e,
-    0x47,
-    0xbf,
-    0xf0,
-    0x43,
-    0x89,
-    0x26,
-    0x73,
-    0xd3,
-    0xcb,
-    0xca,
-    0x85,
-    0xdb,
-    0x36,
-    0x40,
-    0x3c,
-    0xaa,
-    0x2d,
-    0x70,
-    0xb1,
-    0x85,
-    0x30,
-    0xe8,
-    0x03,
-    0x9c,
-    0x01,
-    0x76,
-    0x9f,
-    0x3d,
-    0x05,
-    0xf5,
-    0xbe,
-    0x48,
-    0xec,
-    0x67,
-    0x2f,
-    0xe3,
-    0x95,
-    0x44,
-    0x56,
-    0x6e,
-    0x2b,
-    0x12,
-    0x75,
-    0xba,
-    0x95,
-    0x36,
-    0x2a,
-    0x75,
-    0x0d,
-    0x0a,
-    0x39,
-    0xe9,
-    0x0e,
-    0x2f,
-    0x8c,
-    0xe7,
-    0x74,
-    0x25,
-    0x78,
-    0xfd,
-    0xdf,
-    0x18,
-    0x42,
-    0xef,
-    0x58,
-    0xfd,
-    0xe2,
-    0x65,
-    0x37,
-    0xde,
-    0x06,
-    0xe2,
-    0x43,
-    0x72,
-    0x5a,
-    0xf5,
-    0x1c,
-    0xf1,
-    0x07,
-    0xb3,
-    0xd6,
-    0x26,
-    0x79,
-    0x64,
-    0xe7,
-    0xc6,
-    0x66,
-    0x7d,
-    0x43,
-    0x00,
-    0x0c,
-    0xcf,
-    0xc5,
-    0x55,
-    0xba,
-    0xfd,
-    0xd1,
-    0xaa,
-    0x91,
-    0x33,
-    0x38,
-    0x9c,
-    0x8c,
-    0x15,
-    0x5b,
-    0x13,
-    0xbe,
-    0xf6,
-    0x94,
-    0x1a,
-    0xdb,
-    0x4b,
-    0xd1,
-    0xee,
-    0xfa,
-    0x5f,
-    0x82,
-    0x54,
-    0x99,
-    0x48,
-    0xb6,
-    0x30,
-    0xe2,
-    0x19,
-    0x80,
-    0x54,
-    0x2d,
-    0x59,
-    0xa0,
-    0x96,
-    0xc5,
-    0xb4,
-    0x5f,
-    0x25,
-    0xef,
-    0xf1,
-    0xbb,
-    0x1d,
-    0x28,
-    0x24,
-    0xc4,
-    0x58,
-    0xaf,
-    0x25,
-    0x46,
-    0x88,
-    0x43,
-    0x40,
-    0xa8,
-    0x82,
-    0x2e,
-    0x2e,
-    0x14,
-    0xdd,
-    0x82,
-    0x44,
-    0xd9,
-    0xbc,
-    0xa3,
-    0xeb,
-    0x0d,
-    0xe8,
-    0x05,
-    0x50,
-    0x76,
-    0x22,
-    0x37,
-    0x5d,
-    0xab,
-    0xb7,
-    0x21,
-    0xe7,
-    0x76,
-    0x54,
-    0x8a,
-    0x29,
-    0x7d,
-    0x1c,
-    0xdd,
-    0x71,
-    0x21,
-    0xf8,
-    0x2c,
-    0x19,
-    0xa7,
-    0x2e,
-    0x75,
-    0xb9,
-    0x95,
-    0x36,
-    0x24,
-    0x9b,
-    0x5f,
-    0xc9,
-    0xda,
-    0x6f,
-    0x43,
-    0x3a,
-    0x6d,
-    0x40,
-    0x72,
-    0x09,
-    0x30,
-    0xa7,
-    0x70,
-    0xb6,
-    0x74,
-    0x3f,
-    0xbd,
-    0xd3,
-    0x4e,
-    0x58,
-    0xb5,
-    0x5d,
-    0x9b,
-    0xf0,
-    0xb5,
-    0x4c,
-    0x42,
-    0xdf,
-    0x7f,
-    0x69,
-    0xb9,
-    0x51,
-    0xe0,
-    0x60,
-    0xcb,
-    0x79,
-    0x90,
-    0x16,
-    0x98,
-    0x84,
-    0x59,
-    0x3c,
-    0xdd,
-    0xcc,
-    0x7b,
-    0x25,
-    0x75,
-    0x4f,
-    0x50,
-    0xd4,
-    0x20,
-    0x5f,
-    0x2c,
-    0x5a,
-    0x84,
-    0x9b,
-    0x87,
-    0x5f,
-    0x71,
-    0x1d,
-    0x5e,
-    0xfe,
-    0x69,
-    0xf5,
-    0xd6,
-    0xd6,
-    0x60,
-    0xd6,
-    0x23,
-    0x5d,
-    0xc0,
-    0x10,
-    0xa8,
-    0x78,
-    0xb0,
-    0xbe,
-    0x5f,
-    0x49,
-    0x96,
-    0x41,
-    0x7c,
-    0x48,
-    0xda,
-    0xed,
-    0x4d,
-    0x96,
-    0xee,
-    0x01,
-    0x65,
-    0x8e,
-    0x8b,
-    0xdd,
-    0xf9,
-    0x9c,
-    0x3d,
-    0x6f,
-    0x8a,
-    0x52,
-    0x21,
-    0xef,
-    0xc4,
-    0xb8,
-    0xed,
-    0xcc,
-    0xa7,
-    0xe4,
-    0x32,
-    0xe6,
-    0xe4,
-    0xcb,
-    0xde,
-    0xfd,
-    0x8a,
-    0x57,
-    0x05,
-    0x69,
-    0xe1,
-    0xba,
-    0xe1,
-    0x0c,
-    0x96,
-    0x01,
-    0x17,
-    0x86,
-    0x19,
-    0xec,
-    0x3b,
-    0xa7,
-    0x44,
-    0xfd,
-    0x97,
-    0x2a,
-    0x3d,
-    0xcf,
-    0x28,
-    0xa0,
-    0x9d,
-    0xa9,
-    0xea,
-    0xaa,
-    0xd2,
-    0x53,
-    0x56,
-    0x6b,
-    0xc2,
-    0x28,
-    0x28,
-    0x3d,
-    0xb0,
-    0x6d,
-    0x65,
-    0xa3,
-    0x64,
-    0xe1,
-    0x9d,
-    0x80,
-    0x86,
-    0x95,
-    0x6d,
-    0x86,
-    0x4c,
-    0xfe,
-    0x49,
-    0xf0,
-    0x55,
-    0x49,
-    0x78,
-    0x74,
-    0xd4,
-    0xee,
-    0x60,
-    0x73,
-    0xf0,
-    0x88,
-    0x04,
-    0x74,
-    0x6b,
-    0xe4,
-    0xcb,
-    0xd0,
-    0x82,
-    0x58,
-    0x83,
-    0xae,
-    0x15,
-    0x56,
-    0xa5,
-    0x32,
-    0x08,
-    0x40,
-    0xdb,
-    0xf2,
-    0xe9,
-    0x7e,
-    0xbf,
-    0xaa,
-    0xd3,
-    0xcf,
-    0xe6,
-    0x30,
-    0x92,
-    0xdc,
-    0x1d,
-    0xaa,
-    0x07,
-    0x13,
-    0xf2,
-    0xfe,
-    0xce,
-    0xb2,
-    0x77,
-    0x8a,
-    0x1f,
-    0x22,
-    0x42,
-    0x16,
-    0xf2,
-    0x87,
-    0xb8,
-    0x06,
-    0x67,
-    0x95,
-    0x8c,
-    0xd4,
-    0x64,
-    0xa5,
-    0x82,
-    0xbe,
-    0x80,
-    0x08,
-    0x79,
-    0xbc,
-    0x20,
-    0x9b,
-    0xa8,
-    0xb5,
-    0xdf,
-    0x9b,
-    0x28,
-    0xf2,
-    0x34,
-    0xbb,
-    0xb2,
-    0xd3,
-    0x4f,
-    0x74,
-    0xab,
-    0xc1,
-    0x43,
-    0x9d,
-    0x5d,
-    0x63,
-    0x6a,
-    0x3b,
-    0x88,
-    0x15,
-    0x05,
-    0x9a,
-    0x19,
-    0x96,
-    0x24,
-    0x9d,
-    0x39,
-    0x00,
-    0xc6,
-    0x52,
-    0x89,
-    0xfe,
-    0x40,
-    0xc9,
-    0xac,
-    0x39,
-    0xe3,
-    0x27,
-    0x07,
-    0x13,
-    0xd9,
-    0xf6,
-    0xc4,
-    0x98,
-    0x50,
-    0xbf,
-    0x1d,
-    0xb1,
-    0xdb,
-    0xdb,
-    0xd7,
-    0x9b,
-    0x14,
-    0x86,
-    0x0c,
-    0x98,
-    0x87,
-    0x35,
-    0x2e,
-    0xe5,
-    0xcb,
-    0x2a,
-    0x49,
-    0xeb,
-    0xf2,
-    0x45,
-    0x88,
-    0xb9,
-    0x24,
-    0x1d,
-    0xfb,
-    0xb2,
-    0x86,
-    0x4f,
-    0x97,
-    0x83,
-    0x60,
-    0x16,
-    0x7f,
-    0x59,
-    0x80,
-    0x1c,
-    0x82,
-    0x50,
-    0xd9,
-    0x90,
-    0xe4,
-    0x2e,
-    0x70,
-    0x79,
-    0x61,
-    0x51,
-    0x79,
-    0x4a,
-    0x6f,
-    0xe6,
-    0xbc,
-    0xb6,
-    0xc4,
-    0x5c,
-    0x3e,
-    0xc5,
-    0x18,
-    0x18,
-    0x1e,
-    0x28,
-    0x2c,
-    0x6b,
-    0xbd,
-    0xca,
-    0x0b,
-    0xc1,
-    0x21,
-    0xa7,
-    0x8f,
-    0x1b,
-    0x9c,
-    0xe1,
-    0x28,
-    0xbf,
-    0xa8,
-    0x10,
-    0xd9,
-    0x2d,
-    0x16,
-    0xda,
-    0x83,
-    0x56,
-    0x68,
-    0xc5,
-    0x66,
-    0x09,
-    0x7b,
-    0x48,
-    0xe5,
-    0xae,
-    0x69,
-    0x28,
-    0x89,
-    0x36,
-    0xad,
-    0x02,
-    0x49,
-    0x52,
-    0x88,
-    0x23,
-    0x09,
-    0xe3,
-    0xa4,
-    0xa0,
-    0x60,
-    0xb2,
-    0xf8,
-    0xa4,
-    0x9e,
-    0x62,
-    0xeb,
-    0x04,
-    0x0e,
-    0xa3,
-    0xbc,
-    0x19,
-    0x78,
-    0xa8,
-    0x21,
-    0xce,
-    0xea,
-    0xda,
-    0x2e,
-    0xf8,
-    0xb8,
-    0xce,
-    0x79,
-    0xe6,
-    0xc2,
-    0x74,
-    0x7c,
-    0x39,
-    0xf5,
-    0x92,
-    0x3a,
-    0xf6,
-    0x15,
-    0x71,
-    0x26,
-    0xda,
-    0xb9,
-    0xd7,
-    0x40,
-    0xee,
-    0x97,
-    0x34,
-    0x81,
-    0x5b,
-    0x01,
-    0x20,
-    0x79,
-    0x7e,
-    0xb0,
-    0x05,
-    0x37,
-    0x3f,
-    0xc1,
-    0x19,
-    0x69,
-    0x9f,
-    0xfd,
-    0x90,
-    0xc4,
-    0x91,
-    0x5d,
-    0x0f,
-    0xa6,
-    0x0b,
-    0xcd,
-    0x63,
-    0xfa,
-    0x5c,
-    0x31,
-    0x73,
-    0x5d,
-    0xc0,
-    0xa6,
-    0x73,
-    0x7e,
-    0x32,
-    0x0a,
-    0x5b,
-    0xcb,
-    0x81,
-    0xbe,
-    0x98,
-    0x4a,
-    0xa6,
-    0xaa,
-    0x01,
-    0xc4,
-    0x55,
-    0x82,
-    0x0c,
-    0x29,
-    0xd2,
-    0x48,
-    0x42,
-    0x30,
-    0x06,
-    0x13,
-    0xf0,
-    0x3e,
-    0xd2,
-    0x0e,
-    0x20,
-    0x89,
-    0xa3,
-    0xc3,
-    0xc7,
-    0x7d,
-    0x47,
-    0x9a,
-    0x40,
-    0x5f,
-    0xff,
-    0x9c,
-    0xf9,
-    0x30,
-    0xd5,
-    0x7d,
-    0x6d,
-    0xd4,
-    0x2f,
-    0xda,
-    0x52,
-    0x73,
-    0xa5,
-    0xbf,
-    0x13,
-    0x20,
-    0x10,
-    0x6c,
-    0x80,
-    0xb8,
-    0xe3,
-    0x59,
-    0xc5,
-    0x0d,
-    0xbf,
-    0x77,
-    0x98,
-    0x44,
-    0x41,
-    0xb9,
-    0xb7,
-    0x7c,
-    0x1f,
-    0xd3,
-    0x92,
-    0xb1,
-    0x73,
-    0x42,
-    0x44,
-    0xdf,
-    0x56,
-    0x8c,
-    0xc8,
-    0x6a,
-    0xb1,
-    0xc9,
-    0x6a,
-    0xbd,
-    0x50,
-    0x62,
-    0x7b,
-    0x31,
-    0x38,
-    0x19,
-    0x49,
-    0x31,
-    0x3b,
-    0x49,
-    0x4f,
-    0x9d,
-    0xc9,
-    0x6f,
-    0xa8,
-    0x6b,
-    0x09,
-    0xea,
-    0xca,
-    0x94,
-    0x28,
-    0xff,
-    0x70,
-    0x2e,
-    0xf2,
-    0x20,
-    0xd8,
-    0xd5,
-    0x9f,
-    0x6e,
-    0x2f,
-    0x50,
-    0xef,
-    0x7c,
-    0x4a,
-    0x72,
-    0x79,
-    0x56,
-    0x96,
-    0x3d,
-    0x3f,
-    0xc2,
-    0x52,
-    0x4e,
-    0x87,
-    0xc5,
-    0xfb,
-    0x75,
-    0xe6,
-    0x69,
-    0x08,
-    0xa3,
-    0x9e,
-    0xbe,
-    0xd8,
-    0x09,
-    0x2a,
-    0x1f,
-    0xe9,
-    0x7e,
-    0x16,
-    0xb6,
-    0x4a,
-    0x21,
-    0x14,
-    0x43,
-    0x53,
-    0x40,
-    0x4d,
-    0x18,
-    0x93,
-    0x79,
-    0xf5,
-    0x68,
-    0x0a,
-    0x1f,
-    0x22,
-    0xc2,
-    0x98,
-    0xe0,
-    0xde,
-    0xd9,
-    0xb6,
-    0xa4,
-    0x7a,
-    0x86,
-    0x64,
-    0xb7,
-    0x26,
-    0x10,
-    0x62,
-    0x2b,
-    0xbf,
-    0xaa,
-    0xa3,
-    0x78,
-    0xe8,
-    0x3d,
-    0xff,
-    0x66,
-    0x5c,
-    0x68,
-    0x28,
-    0x2d,
-    0x83,
-    0xc6,
-    0xdf,
-    0xda,
-    0x43,
-    0x6f,
-    0x68,
-    0xf4,
-    0x18,
-    0xc1,
-    0x3b,
-    0x60,
-    0x67,
-    0x60,
-    0xfc,
-    0x82,
-    0x0f,
-    0x7b,
-    0xad,
-    0xa5,
-    0x42,
-    0x51,
-    0x23,
-    0x9d,
-    0x93,
-    0xf4,
-    0xb6,
-    0xaa,
-    0x4f,
-    0x4d,
-    0x3d,
-    0xa0,
-    0x11,
-    0x61,
-    0x3a,
-    0x45,
-    0x91,
-    0xd2,
-    0x51,
-    0xfb,
-    0xbd,
-    0xa9,
-    0xff,
-    0x9f,
-    0x0b,
-    0x52,
-    0x88,
-    0xb0,
-    0x0d,
-    0xe8,
-    0x31,
-    0xb4,
-    0x46,
-    0xb4,
-    0xb0,
-    0xd7,
-    0x3c,
-    0xf0,
-    0xe1,
-    0xd6,
-    0xce,
-    0xd0,
-    0xba,
-    0x1b,
-    0xc8,
-    0xc3,
-    0x81,
-    0x2a,
-    0xb5,
-    0xf6,
-    0x3c,
-    0x3b,
-    0xf4,
-    0x19,
-    0x6a,
-    0x28,
-    0x0e,
-    0x67,
-    0xf0,
-    0x8a,
-    0x47,
-    0xe0,
-    0x56,
-    0x1f,
-    0x73,
-    0xd9,
-    0x33,
-    0x70,
-    0x0b,
-    0xb7,
-    0xe6,
-    0xb0,
-    0x80,
-    0xf8,
-    0x87,
-    0xe6,
-    0xcf,
-    0x73,
-    0x1e,
-    0x4f,
-    0x56,
-    0xe0,
-    0x12,
-    0xfd,
-    0xe6,
-    0x9a,
-    0xe4,
-    0xc5,
-    0x19,
-    0xa4,
-    0x1c,
-    0x58,
-    0xe6,
-    0xea,
-    0x84,
-    0xb0,
-    0x72,
-    0xca,
-    0x95,
-    0xae,
-    0x29,
-    0xd3,
-    0x2f,
-    0x01,
-    0x0e,
-    0xcd,
-    0x8d,
-    0x49,
-    0x4f,
-    0xf9,
-    0x77,
-    0x7c,
-    0x1d,
-    0x9a,
-    0xb9,
-    0x89,
-    0xba,
-    0xb3,
-    0xd5,
-    0x3c,
-    0xd4,
-    0x13,
-    0xf5,
-    0x62,
-    0x11,
-    0x8f,
-    0x23,
-    0x2d,
-    0xeb,
-    0x8f,
-    0xbc,
-    0xda,
-    0xbe,
-    0xcc,
-    0x22,
-    0x90,
-    0x1f,
-    0x57,
-    0xb2,
-    0x8c,
-    0x70,
-    0xde,
-    0xf6,
-    0x7b,
-    0xb1,
-    0x2b,
-    0x1b,
-    0x27,
-    0x99,
-    0xed,
-    0xa5,
-    0x56,
-    0xe6,
-    0xbb,
-    0x61,
-    0xef,
-    0xf1,
-    0x56,
-    0x9b,
-    0x5f,
-    0x85,
-    0x2e,
-    0x92,
-    0x3b,
-    0xf1,
-    0x28,
-    0x29,
-    0x27,
-    0x5c,
-    0x9f,
-    0xdf,
-    0xf6,
-    0x59,
-    0xa9,
-    0x01,
-    0x13,
-    0xbc,
-    0x9b,
-    0x1f,
-    0x1f,
-    0xab,
-    0xcf,
-    0xbc,
-    0xdb,
-    0xf8,
-    0xa4,
-    0x49,
-    0x49,
-    0xae,
-    0xc7,
-    0x55,
-    0x0e,
-    0xe9,
-    0xb1,
-    0xfe,
-    0x1b,
-    0xeb,
-    0x71,
-    0xab,
-    0x8c,
-    0x6d,
-    0xac,
-    0xfd,
-    0xd0,
-    0x33,
-    0xe2,
-    0x02,
-    0x0b,
-    0xe3,
-    0xf2,
-    0xac,
-    0xb8,
-    0x17,
-    0xe1,
-    0x82,
-    0x93,
-    0xb1,
-    0xd7,
-    0x96,
-    0xb6,
-    0x6f,
-    0x6a,
-    0xb7,
-    0x02,
-    0xbf,
-    0x1f,
-    0xe7,
-    0xc0,
-    0xd4,
-    0x2e,
-    0x10,
-    0x88,
-    0xf9,
-    0x86,
-    0xf2,
-    0x62,
-    0x25,
-    0x11,
-    0x60,
-    0x2c,
-    0xd0,
-    0x39,
-    0xac,
-    0x3c,
-    0x06,
-    0xab,
-    0x60,
-    0x46,
-    0xba,
-    0x5b,
-    0x2e,
-    0x7f,
-    0x5c,
-    0xc8,
-    0x2a,
-    0x02,
-    0xae,
-    0x81,
-    0x37,
-    0x73,
-    0xd3,
-    0xe8,
-    0xbf,
-    0xe3,
-    0xa8,
-    0x36,
-    0xa8,
-    0xf4,
-    0x58,
-    0xbf,
-    0x83,
-    0x3e,
-    0x2b,
-    0x78,
-    0x06,
-    0xf1,
-    0x9f,
-    0xb6,
-    0xbc,
-    0xbb,
-    0xba,
-    0x38,
-    0xfb,
-    0xec,
-    0x9e,
-    0x68,
-    0x17,
-    0xd8,
-    0x5e,
-    0xde,
-    0xd5,
-    0x7c,
-    0x10,
-    0x26,
-    0x22,
-    0x65,
-    0x24,
-    0xc3,
-    0x05,
-    0xce,
-    0xf4,
-    0x73,
-    0xd3,
-    0x09,
-    0x9b,
-    0xb5,
-    0xa2,
-    0x20,
-    0x0b,
-    0x89,
-    0xff,
-    0xbb,
-    0x5a,
-    0x77,
-    0xe4,
-    0x44,
-    0x5d,
-    0xd2,
-    0xe4,
-    0x4a,
-    0x78,
-    0x3e,
-    0xa9,
-    0x23,
-    0xb4,
-    0x70,
-    0xa0,
-    0xd6,
-    0x12,
-    0x35,
-    0xf3,
-    0x38,
-    0x20,
-    0xb6,
-    0xb8,
-    0x54,
-    0xc9,
-    0xfa,
-    0x68,
-    0x10,
-    0x71,
-    0xac,
-    0x92,
-    0x0e,
-    0x42,
-    0x1f,
-    0xd0,
-    0xd1,
-    0xc0,
-    0x8f,
-    0xfb,
-    0x21,
-    0xa4,
-    0xaa,
-    0x9b,
-    0xb0,
-    0xe7,
-    0x4e,
-    0xa1,
-    0xfd,
-    0x1d,
-    0x95,
-    0x59,
-    0x79,
-    0x04,
-    0x0f,
-    0x9a,
-    0xe9,
-    0x5d,
-    0x4e,
-    0x40,
-    0x0b,
-    0xfa,
-    0xa8,
-    0xdb,
-    0x7c,
-    0x19,
-    0x38,
-    0xa9,
-    0xd9,
-    0xf0,
-    0x26,
-    0xc2,
-    0x24,
-    0x89,
-    0x28,
-    0x93,
-    0x6a,
-    0xd0,
-    0x49,
-    0x8d,
-    0xa3,
-    0xeb,
-    0xea,
-    0x1e,
-    0xda,
-    0xc9,
-    0x06,
-    0xe1,
-    0x8e,
-    0xfe,
-    0xba,
-    0x12,
-    0x57,
-    0xce,
-    0x04,
-    0x44,
-    0xcd,
-    0x87,
-    0xcb,
-    0x56,
-    0xa5,
-    0x15,
-    0x1f,
-    0xa3,
-    0x1d,
-    0xd0,
-    0xc3,
-    0x79,
-    0x9b,
-    0x98,
-    0xe8,
-    0xcd,
-    0x90,
-    0x24,
-    0x3c,
-    0x2c,
-    0xa3,
-    0x97,
-    0x23,
-    0xf5,
-    0x0c,
-    0x54,
-    0x44,
-    0xc6,
-    0x3d,
-    0x14,
-    0x48,
-    0x34,
-    0xc8,
-    0x36,
-    0xde,
-    0xbf,
-    0x7d,
-    0x56,
-    0x03,
-    0x04,
-    0xd2,
-    0x20,
-    0x80,
-    0x35,
-    0x89,
-    0x66,
-    0xb4,
-    0xc7,
-    0x8c,
-    0x71,
-    0x93,
-    0x6a,
-    0x1c,
-    0x95,
-    0xef,
-    0x3e,
-    0x2a,
-    0x08,
-    0xf7,
-    0x44,
-    0x05,
-    0xf5,
-    0xfd,
-    0x13,
-    0x36,
-    0xcb,
-    0x7c,
-    0xcc,
-    0xa8,
-    0xdb,
-    0x59,
-    0x4f,
-    0x0d,
-    0x22,
-    0x69,
-    0xaf,
-    0x7c,
-    0x63,
-    0x34,
-    0xe4,
-    0x5f,
-    0x7a,
-    0xf8,
-    0xc0,
-    0x8c,
-    0xec,
-    0xf1,
-    0x25,
-    0xb2,
-    0xc2,
-    0xd8,
-    0x74,
-    0xf7,
-    0x98,
-    0xaa,
-    0x48,
-    0xdf,
-    0xf1,
-    0xaa,
-    0x65,
-    0x70,
-    0xcd,
-    0xa9,
-    0xeb,
-    0x94,
-    0x7e,
-    0x85,
-    0xd0,
-    0xbe,
-    0xb7,
-    0xf0,
-    0x8c,
-    0xd0,
-    0xe6,
-    0x72,
-    0x16,
-    0x3d,
-    0xc3,
-    0xb1,
-    0x10,
-    0x6a,
-    0x29,
-    0xf1,
-    0x3e,
-    0x5b,
-    0x26,
-    0xd7,
-    0x3d,
-    0x8b,
-    0x4e,
-    0x72,
-    0x72,
-    0x1b,
-    0x54,
-    0x7c,
-    0x40,
-    0x2f,
-    0xdb,
-    0xdc,
-    0x7e,
-    0x96,
-    0x89,
-    0x70,
-    0x28,
-    0xa9,
-    0x5d,
-    0x0a,
-    0x54,
-    0x75,
-    0x43,
-    0xb8,
-    0x68,
-    0x1c,
-    0xe6,
-    0x49,
-    0x8b,
-    0x78,
-    0xc6,
-    0x0c,
-    0x59,
-    0x02,
-    0x8a,
-    0xdb,
-    0xdb,
-    0xf2,
-    0x97,
-    0x58,
-    0xb6,
-    0xa8,
-    0xe1,
-    0x77,
-    0xa2,
-    0x4b,
-    0x01,
-    0x3d,
-    0x1e,
-    0xb0,
-    0x89,
-    0xc7,
-    0x63,
-    0x7d,
-    0x94,
-    0x8d,
-    0x96,
-    0x8e,
-    0xa1,
-    0xe8,
-    0x41,
-    0x97,
-    0xa1,
-    0xd2,
-    0x04,
-    0x0b,
-    0x4e,
-    0xed,
-    0x88,
-    0x3d,
-    0xbf,
-    0xc8,
-    0xb5,
-    0xc6,
-    0x39,
-    0x5d,
-    0x25,
-    0x26,
-    0x49,
-    0xde,
-    0xd8,
-    0xae,
-    0x0f,
-    0xb1,
-    0x29,
-    0x9d,
-    0xdd,
-    0xb9,
-    0x00,
-    0x89,
-    0x01,
-    0xd7,
-    0x4a,
-    0x00,
-    0xde,
-    0xb0,
-    0xa6,
-    0x70,
-    0x42,
-    0xb1,
-    0x61,
-    0x44,
-    0xf3,
-    0x51,
-    0xa5,
-    0x50,
-    0x8b,
-    0x96,
-    0xed,
-    0x6f,
-    0x86,
-    0xdb,
-    0xbc,
-    0x6a,
-    0x9a,
-    0xd0,
-    0x8f,
-    0x1c,
-    0x47,
-    0xc2,
-    0x10,
-    0xd4,
-    0xae,
-    0x1d,
-    0x8c,
-    0xfb,
-    0xa6,
-    0x2f,
-    0xa7,
-    0xf7,
-    0x0d,
-    0x2e,
-    0x4f,
-    0x4e,
-    0x5c,
-    0x7d,
-    0xee,
-    0x0f,
-    0x7e,
-    0x2b,
-    0xe4,
-    0x6e,
-    0xe3,
-    0xbd,
-    0x34,
-    0xae,
-    0xd0,
-    0x2d,
-    0x7d,
-    0x44,
-    0xf9,
-    0x32,
-    0x2d,
-    0x39,
-    0x51,
-    0xc2,
-    0xf1,
-    0xd0,
-    0x21,
-    0xd5,
-    0x70,
-    0x69,
-    0x57,
-    0x6d,
-    0x38,
-    0xa5,
-    0x21,
-    0xd3,
-    0xf8,
-    0xcb,
-    0xbb,
-    0x23,
-    0xf1,
-    0x6a,
-    0x86,
-    0x0a,
-    0xa7,
-    0x40,
-    0x59,
-    0xcf,
-    0xdc,
-    0x5b,
-    0x1b,
-    0x90,
-    0xbe,
-    0x7e,
-    0x92,
-    0xcf,
-    0x60,
-    0xc6,
-    0x76,
-    0x2d,
-    0x67,
-    0x8d,
-    0xca,
-    0x74,
-    0x06,
-    0x8f,
-    0x6c,
-    0xdb,
-    0x2c,
-    0x4b,
-    0xea,
-    0x86,
-    0xfb,
-    0xad,
-    0x97,
-    0x4d,
-    0x7d,
-    0xe9,
-    0xde,
-    0xbe,
-    0x92,
-    0xaa,
-    0xd7,
-    0x65,
-    0x2d,
-    0x6c,
-    0x18,
-    0x4b,
-    0xc0,
-    0x26,
-    0xce,
-    0xbc,
-    0xf5,
-    0x2d,
-    0x0c,
-    0x4d,
-    0x9f,
-    0x55,
-    0x62,
-    0x1e,
-    0xf0,
-    0x59,
-    0xb2,
-    0x5d,
-    0xec,
-    0x7d,
-    0x3f,
-    0x0b,
-    0x1d,
-    0x71,
-    0x07,
-    0x03,
-    0x89,
-    0x79,
-    0x53,
-    0x38,
-    0xe1,
-    0xcb,
-    0x8c,
-    0x3e,
-    0xfb,
-    0x38,
-    0x50,
-    0x0c,
-    0x82,
-    0x0f,
-    0xc5,
-    0x00,
-    0xed,
-    0x3f,
-    0x2d,
-    0x23,
-    0xad,
-    0xbb,
-    0xbb,
-    0xaf,
-    0xab,
-    0x23,
-    0xa5,
-    0xce,
-    0xf1,
-    0xa0,
-    0x7b,
-    0xa5,
-    0xa7,
-    0x10,
-    0xb7,
-    0x91,
-    0x42,
-    0x63,
-    0x95,
-    0xb0,
-    0xf8,
-    0x44,
-    0x25,
-    0xa4,
-    0x77,
-    0xfc,
-    0x9e,
-    0x93,
-    0xd6,
-    0x94,
-    0xf5,
-    0x72,
-    0xcc,
-    0x3a,
-    0xae,
-    0x84,
-    0x20,
-    0xe7,
-    0xf3,
-    0x1d,
-    0x60,
-    0x3e,
-    0xe3,
-    0xac,
-    0xd6,
-    0xb6,
-    0x2c,
-    0xf8,
-    0xb8,
-    0xfb,
-    0xdc,
-    0xaa,
-    0x9f,
-    0x92,
-    0x74,
-    0x0c,
-    0x3a,
-    0xbc,
-    0x3e,
-    0x10,
-    0x44,
-    0x9e,
-    0xe1,
-    0x94,
-    0xb3,
-    0x9e,
-    0x33,
-    0xe4,
-    0x33,
-    0x10,
-    0x4e,
-    0x81,
-    0xd2,
-    0x12,
-    0xe6,
-    0x21,
-    0xfd,
-    0xb4,
-    0xda,
-    0xf6,
-    0xab,
-    0x5d,
-    0x08,
-    0x33,
-    0xd8,
-    0x6a,
-    0x66,
-    0xcd,
-    0x35,
-    0x17,
-    0x4f,
-    0x7e,
-    0x1e,
-    0xa3,
-    0x1a,
-    0x10,
-    0xcc,
-    0xaf,
-    0xf1,
-    0xd8,
-    0xcc,
-    0xe8,
-    0xe0,
-    0x81,
-    0xaf,
-    0xe5,
-    0x2d,
-    0x0b,
-    0x04,
-    0x52,
-    0xe8,
-    0x12,
-    0x83,
-    0x4f,
-    0xc2,
-    0x54,
-    0x8b,
-    0x13,
-    0x23,
-    0x6e,
-    0xcf,
-    0xd5,
-    0x76,
-    0xe6,
-    0x4c,
-    0xec,
-    0xc8,
-    0x6e,
-    0x7e,
-    0x35,
-    0x91,
-    0x67,
-    0xd3,
-    0xb5,
-    0xd1,
-    0xa5,
-    0x60,
-    0x7f,
-    0x5f,
-    0x72,
-    0xd2,
-    0xd8,
-    0x7e,
-    0xd5,
-    0xa8,
-    0x9a,
-    0xb2,
-    0x14,
-    0xa0,
-    0xd6,
-    0xd2,
-    0x77,
-    0x6f,
-    0xbd,
-    0x5d,
-    0x4f,
-    0xb5,
-    0xc1,
-    0x11,
-    0x37,
-    0x30,
-    0xf7,
-    0xba,
-    0x9a,
-    0x30,
-    0xc0,
-    0x49,
-    0x75,
-    0x4b,
-    0xa8,
-    0x25,
-    0x5e,
-    0x51,
-    0x8e,
-    0xc6,
-    0xc6,
-    0x83,
-    0x06,
-    0x7f,
-    0x7b,
-    0xff,
-    0xfb,
-    0x9b,
-    0x70,
-    0x7f,
-    0x99,
-    0xac,
-    0xc1,
-    0x43,
-    0x69,
-    0x20,
-    0xf2,
-    0x4c,
-    0xbe,
-    0x15,
-    0x78,
-    0xcb,
-    0x51,
-    0x6f,
-    0x7a,
-    0xd9,
-    0x28,
-    0x27,
-    0xd8,
-    0x68,
-    0xbc,
-    0xe5,
-    0x6d,
-    0x7a,
-    0x5a,
-    0xd2,
-    0x91,
-    0x91,
-    0xca,
-    0xa7,
-    0xe2,
-    0x66,
-    0x2f,
-    0x0b,
-    0x45,
-    0xdd,
-    0x2e,
-    0x1b,
-    0x27,
-    0x39,
-    0x52,
-    0x4a,
-    0x09,
-    0x8c,
-    0xaf,
-    0x6b,
-    0x3b,
-    0x72,
-    0xc6,
-    0x0c,
-    0xe7,
-    0xff,
-    0xa9,
-    0x06,
-    0x52,
-    0xf6,
-    0x60,
-    0x52,
-    0x5f,
-    0x3c,
-    0x8a,
-    0x1e,
-    0x55,
-    0x8c,
-    0x47,
-    0x20,
-    0xe1,
-    0x6b,
-    0x56,
-    0x2b,
-    0x5f,
-    0x5f,
-    0x7b,
-    0x00,
-    0x55,
-    0x5c,
-    0x24,
-    0x66,
-    0x40,
-    0x7f,
-    0x4b,
-    0x7d,
-    0x94,
-    0xff,
-    0x9e,
-    0x4f,
-    0xfe,
-    0x60,
-    0xde,
-    0xa8,
-    0xec,
-    0xe9,
-    0x85,
-    0x28,
-    0x4f,
-    0x59,
-    0xab,
-    0x96,
-    0x9f,
-    0xd6,
-    0x2a,
-    0x77,
-    0x20,
-    0x26,
-    0x01,
-    0xdf,
-    0x65,
-    0x21,
-    0xf6,
-    0x88,
-    0x12,
-    0x66,
-    0x80,
-    0x21,
-    0xe6,
-    0x4e,
-    0xe3,
-    0xe8,
-    0xf8,
-    0x1e,
-    0x9d,
-    0x7b,
-    0x40,
-    0x81,
-    0x01,
-    0xeb,
-    0x5a,
-    0x35,
-    0x22,
-    0x13,
-    0x87,
-    0x04,
-    0xf2,
-    0x28,
-    0xf5,
-    0xf6,
-    0xab,
-    0x91,
-    0x40,
-    0xc5,
-    0x6e,
-    0xf8,
-    0x38,
-    0x91,
-    0x2a,
-    0xa1,
-    0xe5,
-    0xd5,
-    0xc0,
-    0xfa,
-    0xc8,
-    0x9a,
-    0x65,
-    0x74,
-    0x64,
-    0xea,
-    0x47,
-    0x92,
-    0xfd,
-    0x88,
-    0x73,
-    0x3f,
-    0xa0,
-    0xde,
-    0xf6,
-    0x65,
-    0x63,
-    0x37,
-    0x42,
-    0xbb,
-    0xee,
-    0x2e,
-    0xd4,
-    0xdf,
-    0x3a,
-    0x66,
-    0x14,
-    0xa4,
-    0x99,
-    0x7c,
-    0x7d,
-    0xad,
-    0xf7,
-    0x3a,
-    0xfd,
-    0x3b,
-    0x5f,
-    0x0e,
-    0x9f,
-    0x43,
-    0xc1,
-    0xba,
-    0x67,
-    0xc4,
-    0xf2,
-    0x4c,
-    0x7d,
-    0x57,
-    0xf4,
-    0x51,
-    0x8f,
-    0x08,
-    0x78,
-    0x46,
-    0x70,
-    0x64,
-    0xa1,
-    0x4f,
-    0x05,
-    0xd3,
-    0x0b,
-    0x2c,
-    0x61,
-    0x28,
-    0x0c,
-    0x68,
-    0x2f,
-    0x77,
-    0x39,
-    0xd3,
-    0x50,
-    0x26,
-    0x2c,
-    0x33,
-    0xc6,
-    0x47,
-    0x85,
-    0x37,
-    0xd1,
-    0x25,
-    0x2f,
-    0xac,
-    0x57,
-    0x1d,
-    0xe5,
-    0xf3,
-    0x89,
-    0xb0,
-    0xf4,
-    0xb3,
-    0xc4,
-    0xd6,
-    0x42,
-    0xcb,
-    0xb5,
-    0x94,
-    0x8f,
-    0x8b,
-    0xc1,
-    0xd0,
-    0xfb,
-    0x23,
-    0xa4,
-    0x65,
-    0xc8,
-    0x5b,
-    0x58,
-    0x73,
-    0x62,
-    0x85,
-    0x38,
-    0xf8,
-    0x9c,
-    0xb0,
-    0x65,
-    0xa5,
-    0x3d,
-    0x1f,
-    0x69,
-    0xea,
-    0xbb,
-    0xfa,
-    0x1a,
-    0x54,
-    0x46,
-    0x42,
-    0xc1,
-    0x18,
-    0x08,
-    0x0a,
-    0x7c,
-    0xf0,
-    0xac,
-    0xe5,
-    0xe1,
-    0x25,
-    0x1d,
-    0x9b,
-    0xe4,
-    0xed,
-    0x90,
-    0x20,
-    0xfb,
-    0xf8,
-    0xc4,
-    0xc6,
-    0x80,
-    0x46,
-    0x88,
-    0xb1,
-    0x56,
-    0x3b,
-    0x7f,
-    0x8b,
-    0xcf,
-    0xf5,
-    0x20,
-    0x7a,
-    0xcd,
-    0xdd,
-    0x00,
-    0x4f,
-    0x28,
-    0x7c,
-    0x54,
-    0x01,
-    0x50,
-    0x91,
-    0xb1,
-    0x59,
-    0x34,
-    0x60,
-    0x17,
-    0xee,
-    0x62,
-    0x4c,
-    0x2e,
-    0x54,
-    0x6f,
-    0xa8,
-    0xcf,
-    0x91,
-    0x99,
-    0xcb,
-    0xc6,
-    0xd0,
-    0xab,
-    0x62,
-    0xd7,
-    0x5a,
-    0x21,
-    0x0b,
-    0xff,
-    0xc1,
-    0x8d,
-    0x1f,
-    0xfb,
-    0x5e,
-    0x39,
-    0xce,
-    0x0f,
-    0xfe,
-    0x0e,
-    0x72,
-    0x00,
-    0xd9,
-    0xb4,
-    0x1d,
-    0x62,
-    0xc4,
-    0xfb,
-    0x74,
-    0x1a,
-    0xa7,
-    0x7a,
-    0xc1,
-    0x1b,
-    0x30,
-    0x76,
-    0x43,
-    0x73,
-    0xc9,
-    0x05,
-    0xc9,
-    0x8b,
-    0xc8,
-    0x72,
-    0x7f,
-    0xaa,
-    0xe6,
-    0xe4,
-    0x07,
-    0xbc,
-    0xf3,
-    0x3b,
-    0xcb,
-    0x52,
-    0xc8,
-    0x3b,
-    0x92,
-    0xe9,
-    0x7c,
-    0xec,
-    0x52,
-    0x6f,
-    0xdb,
-    0x40,
-    0x45,
-    0x03,
-    0x13,
-    0xf7,
-    0x3f,
-    0xfd,
-    0xb1,
-    0xc0,
-    0x3f,
-    0x2e,
-    0xcc,
-    0xa1,
-    0x44,
-    0x69,
-    0x80,
-    0x98,
-    0x62,
-    0x41,
-    0x9f,
-    0x83,
-    0x14,
-    0x15,
-    0xa2,
-    0x3d,
-    0xd4,
-    0x4a,
-    0xe6,
-    0x0a,
-    0xe9,
-    0xd8,
-    0x15,
-    0x35,
-    0x81,
-    0x08,
-    0xe1,
-    0xf7,
-    0xff,
-    0x7c,
-    0xf9,
-    0x9b,
-    0x96,
-    0x6f,
-    0x35,
-    0xe0,
-    0x17,
-    0x3e,
-    0x14,
-    0x9f,
-    0x07,
-    0x27,
-    0x69,
-    0xad,
-    0xf5,
-    0x51,
-    0x51,
-    0x03,
-    0x0a,
-    0x0d,
-    0x68,
-    0x1c,
-    0xe2,
-    0x5c,
-    0x3d,
-    0x9f,
-    0x9a,
-    0xb1,
-    0x03,
-    0x3e,
-    0x2b,
-    0xf8,
-    0x89,
-    0xde,
-    0xf6,
-    0xd6,
-    0x6c,
-    0xf8,
-    0xa0,
-    0x33,
-    0x8b,
-    0x3f,
-    0x1f,
-    0xf6,
-    0xbb,
-    0x83,
-    0x15,
-    0x0f,
-    0xbc,
-    0xd5,
-    0x5d,
-    0xbb,
-    0x6c,
-    0xec,
-    0xe4,
-    0x03,
-    0x3b,
-    0xc7,
-    0xbb,
-    0x86,
-    0xdf,
-    0x94,
-    0x6a,
-    0x79,
-    0x49,
-    0xd1,
-    0x86,
-    0xec,
-    0xd7,
-    0xb1,
-    0x86,
-    0x4f,
-    0xcb,
-    0xc1,
-    0xd2,
-    0x34,
-    0xfc,
-    0xcb,
-    0x1d,
-    0x57,
-    0xcb,
-    0xfa,
-    0xf5,
-    0xdb,
-    0x59,
-    0x40,
-    0x98,
-    0xd6,
-    0xf7,
-    0xf5,
-    0x0a,
-    0x10,
-    0xde,
-    0xc1,
-    0x64,
-    0x08,
-    0x21,
-    0xbb,
-    0x6f,
-    0x38,
-    0xdf,
-    0xd2,
-    0x71,
-    0x9a,
-    0xbd,
-    0x6d,
-    0x47,
-    0x6b,
-    0x93,
-    0x4e,
-    0xb4,
-    0x2f,
-    0x66,
-    0xbc,
-    0xf9,
-    0xf5,
-    0x97,
-    0xe1,
-    0xa6,
-    0xdc,
-    0x59,
-    0x71,
-    0xaf,
-    0xd6,
-    0x68,
-    0x8c,
-    0xc2,
-    0xac,
-    0xf9,
-    0xe6,
-    0xd8,
-    0x43,
-    0xec,
-    0x25,
-    0x0b,
-    0x1d,
-    0x49,
-    0x8a,
-    0xa7,
-    0x22,
-    0xea,
-    0xd4,
-    0x83,
-    0xa1,
-    0x75,
-    0x61,
-    0x92,
-    0x92,
-    0x8e,
-    0x97,
-    0xb5,
-    0x1e,
-    0x4a,
-    0x82,
-    0xd3,
-    0x61,
-    0xe6,
-    0xbe,
-    0x2c,
-    0x6e,
-    0xb9,
-    0x98,
-    0xea,
-    0x93,
-    0x67,
-    0x70,
-    0xf9,
-    0xdf,
-    0x58,
-    0x62,
-    0x19,
-    0xe2,
-    0x68,
-    0x25,
-    0x32,
-    0xb4,
-    0xe0,
-    0x32,
-    0xe7,
-    0x39,
-    0xa6,
-    0x29,
-    0x6d,
-    0xa2,
-    0xb0,
-    0x71,
-    0x9e,
-    0x37,
-    0xbe,
-    0x1f,
-    0x49,
-    0x54,
-    0x49,
-    0x1a,
-    0xcd,
-    0xb2,
-    0xb6,
-    0x7c,
-    0xe6,
-    0xe8,
-    0xd0,
-    0x3b,
-    0xc6,
-    0x32,
-    0x75,
-    0x08,
-    0x68,
-    0x70,
-    0x8f,
-    0x77,
-    0x21,
-    0x72,
-    0x47,
-    0x61,
-    0x78,
-    0x72,
-    0x75,
-    0x87,
-    0x37,
-    0xe2,
-    0x5a,
-    0x77,
-    0xc2,
-    0x69,
-    0x91,
-    0xb4,
-    0xa8,
-    0x28,
-    0x43,
-    0x11,
-    0x78,
-    0x41,
-    0x9b,
-    0x5e,
-    0xd6,
-    0x9a,
-    0x79,
-    0x46,
-    0xcd,
-    0xde,
-    0x6b,
-    0x78,
-    0x67,
-    0xc5,
-    0xd9,
-    0x05,
-    0x7b,
-    0x96,
-    0x7f,
-    0x09,
-    0xc7,
-    0xea,
-    0x20,
-    0x8e,
-    0x3e,
-    0xb2,
-    0x79,
-    0xad,
-    0xa3,
-    0x7b,
-    0x75,
-    0xf6,
-    0x57,
-    0xf1,
-    0x9f,
-    0x13,
-    0x70,
-    0xa2,
-    0xdc,
-    0xa7,
-    0x0a,
-    0x05,
-    0x5a,
-    0x7c,
-    0xe2,
-    0xbb,
-    0xc4,
-    0xde,
-    0x21,
-    0x14,
-    0xb8,
-    0x42,
-    0x75,
-    0xd5,
-    0x7a,
-    0x2c,
-    0x66,
-    0x39,
-    0xea,
-    0x4f,
-    0xe8,
-    0x35,
-    0xb3,
-    0xf5,
-    0x2c,
-    0x00,
-    0xc6,
-    0xa1,
-    0xbc,
-    0xd3,
-    0x07,
-    0xf3,
-    0xc7,
-    0xee,
-    0x45,
-    0xcd,
-    0xb9,
-    0xdb,
-    0x70,
-    0xb4,
-    0x0f,
-    0xf6,
-    0x06,
-    0x79,
-    0x6a,
-    0x2d,
-    0xcf,
-    0x18,
-    0xe2,
-    0x05,
-    0xca,
-    0xe0,
-    0x9c,
-    0xdd,
-    0x67,
-    0xd4,
-    0x9f,
-    0x77,
-    0xf6,
-    0x52,
-    0xe3,
-    0xb4,
-    0x60,
-    0xf2,
-    0xab,
-    0x9f,
-    0x15,
-    0xb1,
-    0x15,
-    0xad,
-    0x45,
-    0x4f,
-    0xf0,
-    0x44,
-    0x53,
-    0xf5,
-    0xcd,
-    0x79,
-    0x87,
-    0x1b,
-    0x59,
-    0x1e,
-    0x03,
-    0xa9,
-    0xea,
-    0xfc,
-    0xf8,
-    0x5c,
-    0x57,
-    0x5d,
-    0x19,
-    0x6c,
-    0x0d,
-    0xce,
-    0x50,
-    0x6c,
-    0x5f,
-    0x22,
-    0xb0,
-    0x71,
-    0x1e,
-    0xba,
-    0xac,
-    0x76,
-    0x6a,
-    0x04,
-    0x86,
-    0xff,
-    0xc7,
-    0x42,
-    0x0a,
-    0xfd,
-    0x74,
-    0x8d,
-    0x7b,
-    0xf2,
-    0xf8,
-    0x19,
-    0xce,
-    0x55,
-    0xfd,
-    0xba,
-    0x16,
-    0x38,
-    0x61,
-    0xa7,
-    0x40,
-    0x28,
-    0x8b,
-    0x7f,
-    0x00,
-    0x55,
-    0xfb,
-    0x89,
-    0x0b,
-    0xf3,
-    0x25,
-    0x40,
-    0x87,
-    0xdf,
-    0x80,
-    0x0f,
-    0xbf,
-    0x86,
-    0xda,
-    0x59,
-    0x1c,
-    0x03,
-    0xee,
-    0xbc,
-    0x51,
-    0x87,
-    0x38,
-    0x97,
-    0xd5,
-    0xfe,
-    0x08,
-    0xc9,
-    0x96,
-    0xef,
-    0xd6,
-    0xbc,
-    0xec,
-    0xa4,
-    0xd5,
-    0xa3,
-    0xcb,
-    0x8c,
-    0xca,
-    0xff,
-    0x3e,
-    0xdd,
-    0x1f,
-    0x68,
-    0x10,
-    0x7d,
-    0x33,
-    0x8a,
-    0xcc,
-    0x23,
-    0xf5,
-    0x6e,
-    0xe9,
-    0xba,
-    0xb1,
-    0xfb,
-    0x3e,
-    0x06,
-    0x2a,
-    0xbc,
-    0xbc,
-    0x89,
-    0xe8,
-    0xe3,
-    0x5b,
-    0xa8,
-    0xd3,
-    0x8e,
-    0x55,
-    0x0a,
-    0x01,
-    0x4a,
-    0x93,
-    0x41,
-    0xcd,
-    0xd5,
-    0x64,
-    0xac,
-    0x29,
-    0x29,
-    0x75,
-    0x9b,
-    0x35,
-    0xb5,
-    0xfe,
-    0xb5,
-    0x10,
-    0xee,
-    0x39,
-    0x97,
-    0xed,
-    0x06,
-    0x18,
-    0xbe,
-    0x6a,
-    0xfb,
-    0x37,
-    0xa7,
-    0x1e,
-    0xd4,
-    0x10,
-    0x34,
-    0x71,
-    0x28,
-    0x6e,
-    0x52,
-    0xb1,
-    0xdf,
-    0x24,
-    0xd9,
-    0x62,
-    0x3c,
-    0xfe,
-    0xb4,
-    0xd5,
-    0x1c,
-    0xf8,
-    0x41,
-    0xfc,
-    0x78,
-    0xae,
-    0xfa,
-    0x7c,
-    0x31,
-    0x14,
-    0x56,
-    0x04,
-    0x0d,
-    0x67,
-    0xea,
-    0xdd,
-    0xfc,
-    0x63,
-    0xd4,
-    0xc3,
-    0xa1,
-    0xb7,
-    0x59,
-    0xf4,
-    0x0d,
-    0xb6,
-    0xcd,
-    0x86,
-    0xce,
-    0x4f,
-    0xb3,
-    0xfd,
-    0x28,
-    0x3f,
-    0x26,
-    0x1d,
-    0xa2,
-    0x85,
-    0x78,
-    0xfd,
-    0xc5,
-    0x16,
-    0x18,
-    0x5d,
-    0x20,
-    0xd3,
-    0xb9,
-    0x39,
-    0x8f,
-    0xb8,
-    0xb0,
-    0x9f,
-    0xbd,
-    0x56,
-    0x9e,
-    0xbd,
-    0xe8,
-    0x83,
-    0x50,
-    0x3e,
-    0xe4,
-    0x50,
-    0xe3,
-    0xd7,
-    0x63,
-    0x3b,
-    0x2c,
-    0x1c,
-    0x73,
-    0xa6,
-    0x57,
-    0x99,
-    0x48,
-    0x88,
-    0xcd,
-    0x1e,
-    0x3c,
-    0x63,
-    0x5c,
-    0x5a,
-    0x14,
-    0x76,
-    0x92,
-    0xab,
-    0x85,
-    0x33,
-    0x69,
-    0x35,
-    0xf7,
-    0xf3,
-    0x2a,
-    0x32,
-    0x88,
-    0xe9,
-    0x8b,
-    0x88,
-    0x54,
-    0x54,
-    0x1a,
-    0xa1,
-    0xf4,
-    0xf9,
-    0xdf,
-    0x77,
-    0x44,
-    0xd1,
-    0x3d,
-    0xee,
-    0x69,
-    0xff,
-    0x1a,
-    0x67,
-    0x13,
-    0x04,
-    0x40,
-    0x92,
-    0x00,
-    0x36,
-    0x02,
-    0x83,
-    0xc2,
-    0x6f,
-    0x22,
-    0x09,
-    0xc1,
-    0x02,
-    0xf2,
-    0x3b,
-    0x83,
-    0xf3,
-    0xba,
-    0x53,
-    0x2b,
-    0x67,
-    0x5a,
-    0xc0,
-    0x40,
-    0x59,
-    0x30,
-    0x76,
-    0xb0,
-    0x8f,
-    0x3c,
-    0x89,
-    0x15,
-    0xcc,
-    0x82,
-    0xfa,
-    0x36,
-    0x48,
-    0xb0,
-    0xd1,
-    0xd1,
-    0x5d,
-    0x01,
-    0x6b,
-    0x98,
-    0x83,
-    0x61,
-    0x16,
-    0x79,
-    0x7e,
-    0xd2,
-    0xdb,
-    0x22,
-    0xd6,
-    0x0e,
-    0x9b,
-    0xc5,
-    0x88,
-    0x6e,
-    0x5e,
-    0x18,
-    0xfb,
-    0x0a,
-    0xe7,
-    0xa1,
-    0x35,
-    0x22,
-    0x8c,
-    0x30,
-    0x4f,
-    0xbd,
-    0x44,
-    0xad,
-    0x26,
-    0x8f,
-    0x02,
-    0x13,
-    0x54,
-    0x20,
-    0x41,
-    0xbd,
-    0x5f,
-    0x2b,
-    0xe0,
-    0xe1,
-    0x2f,
-    0x44,
-    0x31,
-    0x5a,
-    0xc6,
-    0xbe,
-    0x4d,
-    0xaa,
-    0x2b,
-    0xcc,
-    0xaa,
-    0x3f,
-    0xa7,
-    0xe6,
-    0xef,
-    0xf5,
-    0x34,
-    0x6f,
-    0x06,
-    0xdd,
-    0x33,
-    0x94,
-    0x73,
-    0x3d,
-    0x5d,
-    0x77,
-    0xe5,
-    0xd7,
-    0xfc,
-    0x8d,
-    0x0b,
-    0x6e,
-    0x5b,
-    0x44,
-    0xa9,
-    0x87,
-    0x7b,
-    0xea,
-    0xeb,
-    0x6d,
-    0x07,
-    0xca,
-    0xf9,
-    0x77,
-    0x8a,
-    0x98,
-    0xcb,
-    0x8d,
-    0xe0,
-    0x0f,
-    0x3f,
-    0xe9,
-    0xeb,
-    0xd8,
-    0x69,
-    0x1b,
-    0x87,
-    0xae,
-    0x2a,
-    0x50,
-    0xbf,
-    0xc0,
-    0x04,
-    0xd3,
-    0x41,
-    0x56,
-    0x2c,
-    0xd4,
-    0x0f,
-    0xb8,
-    0xe1,
-    0x69,
-    0x78,
-    0x4c,
-    0xfd,
-    0xd2,
-    0x47,
-    0xfe,
-    0xca,
-    0x01,
-    0x3a,
-    0xe4,
-    0x16,
-    0x5a,
-    0xb5,
-    0x22,
-    0x8a,
-    0xb7,
-    0xb8,
-    0x0c,
-    0x37,
-    0xaf,
-    0x0f,
-    0x8b,
-    0x72,
-    0x18,
-    0xc8,
-    0xc2,
-    0xe2,
-    0xca,
-    0xea,
-    0xf1,
-    0xd7,
-    0xa6,
-    0x64,
-    0x99,
-    0xdd,
-    0xd7,
-    0x44,
-    0xe1,
-    0x92,
-    0x58,
-    0x29,
-    0x38,
-    0xb4,
-    0xb6,
-    0xfb,
-    0x3c,
-    0x7e,
-    0x18,
-    0xd9,
-    0xda,
-    0x35,
-    0x7c,
-    0x53,
-    0xb7,
-    0xfe,
-    0x43,
-    0xda,
-    0xcf,
-    0xf2,
-    0xf0,
-    0x74,
-    0x5d,
-    0x74,
-    0x2d,
-    0xb5,
-    0xfa,
-    0xc2,
-    0x0f,
-    0xea,
-    0x08,
-    0xcb,
-    0x9a,
-    0x97,
-    0x51,
-    0x41,
-    0x88,
-    0x24,
-    0xec,
-    0xee,
-    0x46,
-    0xd3,
-    0x61,
-    0x4b,
-    0x40,
-    0xf5,
-    0x0c,
-    0x4f,
-    0x5e,
-    0x5e,
-    0xc7,
-    0x85,
-    0xce,
-    0x16,
-    0xc3,
-    0x61,
-    0x05,
-    0x51,
-    0xb7,
-    0xd4,
-    0x00,
-    0xa1,
-    0x3d,
-    0x1e,
-    0xd0,
-    0x6b,
-    0x78,
-    0xe4,
-    0x55,
-    0x98,
-    0xfb,
-    0x82,
-    0x4a,
-    0x8c,
-    0xe6,
-    0xa2,
-    0x81,
-    0x5c,
-    0x52,
-    0x0e,
-    0x70,
-    0x3b,
-    0xf0,
-    0xc2,
-    0xed,
-    0x36,
-    0xec,
-    0x46,
-    0x36,
-    0x22,
-    0x18,
-    0x3a,
-    0x34,
-    0xd2,
-    0x46,
-    0x32,
-    0x01,
-    0x8d,
-    0xf5,
-    0xc5,
-    0xa7,
-    0xbe,
-    0x31,
-    0xe1,
-    0x2b,
-    0xee,
-    0xb4,
-    0x61,
-    0xca,
-    0xf0,
-    0x51,
-    0xe2,
-    0x82,
-    0x5b,
-    0x93,
-    0xd2,
-    0xd4,
-    0x3e,
-    0xa1,
-    0xc9,
-    0xc9,
-    0x0e,
-    0x64,
-    0x1d,
-    0x33,
-    0xe3,
-    0xec,
-    0xb1,
-    0x35,
-    0xe4,
-    0x10,
-    0x0d,
-    0x05,
-    0x00,
-    0x55,
-    0xb4,
-    0xf1,
-    0xe0,
-    0x12,
-    0xb1,
-    0xa0,
-    0x19,
-    0xd1,
-    0x74,
-    0x9b,
-    0xa5,
-    0xf7,
-    0xdc,
-    0x0b,
-    0x94,
-    0xa8,
-    0x95,
-    0xc5,
-    0xff,
-    0xe5,
-    0xa4,
-    0x83,
-    0x3e,
-    0xf7
-  ],
-  const [
-    0x9b,
-    0x5f,
-    0x37,
-    0xf5,
-    0xdc,
-    0xed,
-    0xd9,
-    0x6d,
-    0x9b,
-    0x7f,
-    0xf6,
-    0xd8,
-    0x52,
-    0xb7,
-    0x7e,
-    0xf9,
-    0x04,
-    0x98,
-    0x31,
-    0x1d,
-    0x24,
-    0xdf,
-    0xa9,
-    0x06,
-    0xb2,
-    0x97,
-    0x9b,
-    0x28,
-    0xa7,
-    0xe8,
-    0x5a,
-    0x18,
-    0x93,
-    0x30,
-    0x9c,
-    0x41,
-    0x85,
-    0x55,
-    0x81,
-    0xd9,
-    0x2b,
-    0x59,
-    0xd1,
-    0x13,
-    0x3a,
-    0x2e,
-    0x85,
-    0x96,
-    0x10,
-    0xcc,
-    0x8a,
-    0x2f,
-    0x99,
-    0x82,
-    0xc1,
-    0xc2,
-    0x6f,
-    0x89,
-    0x4a,
-    0x87,
-    0x45,
-    0xdf,
-    0x02,
-    0x72,
-    0x85,
-    0x52,
-    0x4a,
-    0xf3,
-    0x38,
-    0xdb,
-    0x0b,
-    0xe0,
-    0x27,
-    0x2e,
-    0xf7,
-    0xb0,
-    0x3f,
-    0x8f,
-    0x11,
-    0xe9,
-    0x3a,
-    0xe7,
-    0x6f,
-    0xdb,
-    0x7c,
-    0x17,
-    0x3e,
-    0x8f,
-    0x3b,
-    0x8c,
-    0x08,
-    0xfb,
-    0xe3,
-    0x14,
-    0x32,
-    0x77,
-    0xb9,
-    0xf0,
-    0xc9,
-    0x75,
-    0xbe,
-    0x2a,
-    0x7e,
-    0x6c,
-    0xd6,
-    0x29,
-    0xee,
-    0x15,
-    0x29,
-    0x82,
-    0x27,
-    0xda,
-    0xca,
-    0x11,
-    0x68,
-    0x8c,
-    0x97,
-    0x49,
-    0x29,
-    0x54,
-    0x60,
-    0xc8,
-    0x5b,
-    0xec,
-    0x4b,
-    0x2e,
-    0xf1,
-    0x0e,
-    0x76,
-    0x30,
-    0x9f,
-    0x2d,
-    0xdf,
-    0xe8,
-    0xe2,
-    0x64,
-    0x81,
-    0x6f,
-    0x40,
-    0xac,
-    0xc0,
-    0xae,
-    0xd1,
-    0x51,
-    0x07,
-    0x71,
-    0xfe,
-    0xa7,
-    0xb0,
-    0xbd,
-    0x89,
-    0xf9,
-    0x24,
-    0x64,
-    0xce,
-    0xc2,
-    0x43,
-    0xd6,
-    0x48,
-    0x1f,
-    0x06,
-    0x3a,
-    0x56,
-    0x85,
-    0x62,
-    0xbe,
-    0x3f,
-    0xaf,
-    0x70,
-    0x2b,
-    0x74,
-    0xdb,
-    0xcc,
-    0xbc,
-    0x16,
-    0x36,
-    0x3b,
-    0x30,
-    0xb8,
-    0x95,
-    0x90,
-    0x1e,
-    0x66,
-    0x65,
-    0xd0,
-    0x89,
-    0xe6,
-    0xe5,
-    0x94,
-    0xb4,
-    0x3d,
-    0x93,
-    0xaf,
-    0x37,
-    0x76,
-    0xe3,
-    0x11,
-    0x53,
-    0x9e,
-    0x37,
-    0xeb,
-    0x83,
-    0x13,
-    0x0c,
-    0x14,
-    0x53,
-    0xff,
-    0x71,
-    0xac,
-    0x75,
-    0x1f,
-    0xbe,
-    0xff,
-    0x12,
-    0xc9,
-    0x82,
-    0xab,
-    0x5e,
-    0x2d,
-    0xbd,
-    0x06,
-    0x6f,
-    0xdb,
-    0x50,
-    0xba,
-    0x4f,
-    0x85,
-    0xb1,
-    0xb2,
-    0x50,
-    0x06,
-    0xe3,
-    0x3a,
-    0x9f,
-    0xa4,
-    0xa6,
-    0x61,
-    0x1c,
-    0x92,
-    0xeb,
-    0xa2,
-    0x69,
-    0xb9,
-    0x8a,
-    0xc4,
-    0x41,
-    0xb9,
-    0x37,
-    0xff,
-    0x0c,
-    0x2a,
-    0xb3,
-    0x60,
-    0xb0,
-    0x27,
-    0x3f,
-    0x6f,
-    0xa9,
-    0x0d,
-    0x56,
-    0x0e,
-    0x5c,
-    0x80,
-    0x9b,
-    0xa4,
-    0xa8,
-    0xaf,
-    0x11,
-    0x7b,
-    0xbf,
-    0xd9,
-    0x8a,
-    0x67,
-    0x34,
-    0x11,
-    0x62,
-    0xa9,
-    0x55,
-    0x3e,
-    0x6c,
-    0x12,
-    0xba,
-    0x65,
-    0x2d,
-    0x6c,
-    0x1e,
-    0x2b,
-    0x48,
-    0x15,
-    0x6e,
-    0x95,
-    0x3a,
-    0xed,
-    0x20,
-    0x13,
-    0x47,
-    0x72,
-    0xc6,
-    0xbd,
-    0xb4,
-    0x2a,
-    0xe3,
-    0xdc,
-    0x37,
-    0x42,
-    0xfd,
-    0xac,
-    0xac,
-    0x74,
-    0xf3,
-    0x60,
-    0x09,
-    0x2e,
-    0x91,
-    0x67,
-    0x94,
-    0xf0,
-    0x62,
-    0xee,
-    0x54,
-    0xf5,
-    0xc5,
-    0xa6,
-    0xc5,
-    0x17,
-    0x43,
-    0xc7,
-    0xd0,
-    0xed,
-    0x20,
-    0x55,
-    0xf9,
-    0x36,
-    0x30,
-    0xa2,
-    0xdb,
-    0x7a,
-    0xec,
-    0x14,
-    0xd1,
-    0xee,
-    0xc5,
-    0x28,
-    0xf7,
-    0x99,
-    0xb9,
-    0xb7,
-    0x51,
-    0xb5,
-    0x23,
-    0x78,
-    0x49,
-    0x58,
-    0xd7,
-    0xc7,
-    0x5f,
-    0x53,
-    0x6e,
-    0xa4,
-    0x1c,
-    0x5a,
-    0xdf,
-    0xff,
-    0x47,
-    0x66,
-    0x50,
-    0x33,
-    0x5c,
-    0x58,
-    0x2b,
-    0xd0,
-    0x3a,
-    0xdf,
-    0x73,
-    0x9d,
-    0x1c,
-    0x9b,
-    0x59,
-    0xdd,
-    0xca,
-    0x83,
-    0x0a,
-    0xd2,
-    0x11,
-    0x84,
-    0xcc,
-    0x80,
-    0x70,
-    0x6a,
-    0x49,
-    0xb3,
-    0x14,
-    0x04,
-    0x2a,
-    0x43,
-    0x07,
-    0x83,
-    0xe8,
-    0x97,
-    0xa4,
-    0x24,
-    0xdf,
-    0x68,
-    0x4e,
-    0x0f,
-    0xa5,
-    0xc7,
-    0x61,
-    0x7e,
-    0x99,
-    0x62,
-    0x69,
-    0x21,
-    0xbf,
-    0x03,
-    0x92,
-    0xc2,
-    0xcb,
-    0x59,
-    0x60,
-    0x25,
-    0x7b,
-    0xfb,
-    0xa0,
-    0x32,
-    0x2a,
-    0xaa,
-    0x9f,
-    0x55,
-    0xa3,
-    0xd6,
-    0x99,
-    0x26,
-    0x33,
-    0x64,
-    0x74,
-    0x45,
-    0x02,
-    0xaf,
-    0xae,
-    0x88,
-    0xa2,
-    0xcd,
-    0x95,
-    0x59,
-    0xe9,
-    0x13,
-    0xb6,
-    0x59,
-    0xfc,
-    0xdb,
-    0x97,
-    0x4a,
-    0xad,
-    0x84,
-    0xa9,
-    0x2b,
-    0x07,
-    0xbb,
-    0x78,
-    0xa4,
-    0x26,
-    0xf9,
-    0x25,
-    0xa5,
-    0x4d,
-    0x4d,
-    0x16,
-    0x4b,
-    0x32,
-    0x5c,
-    0xec,
-    0x03,
-    0x9c,
-    0xa6,
-    0xb5,
-    0xf1,
-    0x30,
-    0x0b,
-    0x63,
-    0x93,
-    0x88,
-    0x8d,
-    0x7e,
-    0xa1,
-    0x86,
-    0x57,
-    0x15,
-    0x38,
-    0xe8,
-    0xff,
-    0xfa,
-    0x38,
-    0x1c,
-    0x08,
-    0x2f,
-    0xeb,
-    0x55,
-    0xab,
-    0x9b,
-    0xe7,
-    0xde,
-    0xd6,
-    0x01,
-    0x35,
-    0xaf,
-    0x76,
-    0x33,
-    0xb2,
-    0x3e,
-    0xf2,
-    0x83,
-    0xb6,
-    0x97,
-    0xf7,
-    0x7b,
-    0xf4,
-    0xaf,
-    0x7b,
-    0xce,
-    0xa1,
-    0xf5,
-    0xfc,
-    0x8d,
-    0xd9,
-    0x2b,
-    0x09,
-    0x9e,
-    0x3e,
-    0x74,
-    0x04,
-    0x6b,
-    0xe2,
-    0xae,
-    0x26,
-    0xd7,
-    0x67,
-    0x01,
-    0xc3,
-    0x76,
-    0x64,
-    0xb8,
-    0xd0,
-    0xfd,
-    0x0b,
-    0x50,
-    0xa2,
-    0xf7,
-    0x09,
-    0xcf,
-    0xf8,
-    0xba,
-    0xae,
-    0x58,
-    0x3c,
-    0x9a,
-    0x4e,
-    0xfb,
-    0x06,
-    0x5c,
-    0xe7,
-    0xd1,
-    0xe2,
-    0xee,
-    0x03,
-    0x49,
-    0x53,
-    0x55,
-    0xe0,
-    0xbd,
-    0x18,
-    0xe6,
-    0xcf,
-    0x49,
-    0xad,
-    0xb9,
-    0xda,
-    0xdc,
-    0x15,
-    0x5b,
-    0xa9,
-    0x8f,
-    0xd7,
-    0xc3,
-    0xa7,
-    0x36,
-    0x47,
-    0x87,
-    0x60,
-    0x35,
-    0x06,
-    0x50,
-    0x2d,
-    0x96,
-    0xcc,
-    0x8c,
-    0x14,
-    0x58,
-    0x65,
-    0x62,
-    0xea,
-    0x09,
-    0xfa,
-    0xeb,
-    0xba,
-    0x97,
-    0x92,
-    0x9f,
-    0x6b,
-    0x63,
-    0xd8,
-    0x0d,
-    0x9c,
-    0x97,
-    0x1f,
-    0xd0,
-    0xd3,
-    0xba,
-    0xa3,
-    0xbe,
-    0xd7,
-    0x81,
-    0x12,
-    0x62,
-    0x5a,
-    0xe8,
-    0x4b,
-    0xad,
-    0xdb,
-    0x82,
-    0x65,
-    0xe8,
-    0xcb,
-    0x0d,
-    0xf3,
-    0xed,
-    0xef,
-    0x4a,
-    0x86,
-    0x97,
-    0x05,
-    0x0c,
-    0x74,
-    0x77,
-    0xaa,
-    0x8e,
-    0xd8,
-    0xc8,
-    0x7b,
-    0x09,
-    0xda,
-    0xa5,
-    0x7b,
-    0x86,
-    0x31,
-    0x7a,
-    0xb5,
-    0xf1,
-    0xe6,
-    0xb9,
-    0x22,
-    0x70,
-    0x5a,
-    0xce,
-    0xcc,
-    0xf3,
-    0x8a,
-    0x54,
-    0x34,
-    0x0b,
-    0x92,
-    0x89,
-    0xf1,
-    0xff,
-    0x70,
-    0xff,
-    0x9b,
-    0x1d,
-    0x0b,
-    0x95,
-    0xe7,
-    0x4e,
-    0x74,
-    0xa6,
-    0x13,
-    0xed,
-    0x6b,
-    0x80,
-    0x85,
-    0xd9,
-    0x25,
-    0x18,
-    0xaf,
-    0xc9,
-    0x4c,
-    0xfc,
-    0x35,
-    0xe0,
-    0x48,
-    0x88,
-    0x52,
-    0x82,
-    0xbd,
-    0x5d,
-    0x78,
-    0x65,
-    0x54,
-    0x0f,
-    0x36,
-    0xeb,
-    0xbf,
-    0x1e,
-    0x5f,
-    0xaf,
-    0xf7,
-    0x28,
-    0x69,
-    0x5d,
-    0xc8,
-    0x5c,
-    0x13,
-    0xc8,
-    0x90,
-    0x32,
-    0x4a,
-    0x36,
-    0x44,
-    0x59,
-    0x4e,
-    0xfe,
-    0xb3,
-    0xf1,
-    0x11,
-    0x56,
-    0x0f,
-    0xfb,
-    0xe0,
-    0x66,
-    0xa9,
-    0x0e,
-    0x44,
-    0xa1,
-    0xfc,
-    0x4b,
-    0x2b,
-    0x54,
-    0xed,
-    0x93,
-    0x43,
-    0x7f,
-    0x51,
-    0xf7,
-    0xa7,
-    0xe5,
-    0xb0,
-    0x6f,
-    0xbd,
-    0x5f,
-    0x48,
-    0xcf,
-    0x5e,
-    0x75,
-    0x55,
-    0xf8,
-    0x38,
-    0x2f,
-    0x90,
-    0x4b,
-    0x71,
-    0x29,
-    0xf6,
-    0x64,
-    0x8d,
-    0xe6,
-    0xca,
-    0x04,
-    0x92,
-    0x66,
-    0xdd,
-    0x4e,
-    0x6a,
-    0xfb,
-    0x0d,
-    0x37,
-    0x88,
-    0x58,
-    0x0c,
-    0x38,
-    0xcf,
-    0xeb,
-    0x63,
-    0x45,
-    0xaf,
-    0x6d,
-    0xb6,
-    0x03,
-    0x91,
-    0xb7,
-    0x49,
-    0x36,
-    0x75,
-    0xd7,
-    0xc3,
-    0x78,
-    0xd9,
-    0x63,
-    0x32,
-    0x31,
-    0xdd,
-    0x0d,
-    0x50,
-    0xc3,
-    0xa6,
-    0x78,
-    0x05,
-    0x05,
-    0x00,
-    0x4a,
-    0x2c,
-    0xf3,
-    0x47,
-    0x83,
-    0x9a,
-    0xa4,
-    0x87,
-    0x0d,
-    0x5c,
-    0x7c,
-    0xe2,
-    0x93,
-    0x41,
-    0xa2,
-    0x32,
-    0x97,
-    0x99,
-    0xb4,
-    0xf0,
-    0xbf,
-    0x3b,
-    0xba,
-    0x55,
-    0x70,
-    0xcd,
-    0x59,
-    0xbe,
-    0x9e,
-    0x3f,
-    0x4a,
-    0x55,
-    0xe3,
-    0x99,
-    0x0a,
-    0xee,
-    0xce,
-    0xf7,
-    0xd2,
-    0x2f,
-    0x7d,
-    0xd1,
-    0xc9,
-    0xf4,
-    0x6e,
-    0x80,
-    0x79,
-    0xf1,
-    0x92,
-    0xfe,
-    0x7f,
-    0x9a,
-    0xa3,
-    0xee,
-    0x87,
-    0x3f,
-    0xb8,
-    0xdc,
-    0x78,
-    0x7c,
-    0x17,
-    0xc5,
-    0xec,
-    0xd0,
-    0x4a,
-    0xda,
-    0xe3,
-    0x8c,
-    0x75,
-    0x81,
-    0xb8,
-    0xef,
-    0xe6,
-    0x9d,
-    0x54,
-    0x8f,
-    0xee,
-    0x0f,
-    0xa1,
-    0xfa,
-    0xef,
-    0x7d,
-    0x41,
-    0x9e,
-    0xb7,
-    0x51,
-    0x81,
-    0xe6,
-    0x0c,
-    0x05,
-    0x88,
-    0xa6,
-    0x88,
-    0x9f,
-    0xd5,
-    0xb9,
-    0xa8,
-    0x77,
-    0xe8,
-    0xe9,
-    0x1f,
-    0x40,
-    0x3e,
-    0x0e,
-    0x70,
-    0x46,
-    0x83,
-    0x7a,
-    0xbb,
-    0xf5,
-    0x04,
-    0x95,
-    0xd7,
-    0x9b,
-    0x63,
-    0xc5,
-    0xa2,
-    0x6f,
-    0x8e,
-    0x91,
-    0x95,
-    0xd1,
-    0xf1,
-    0x05,
-    0x9c,
-    0xd3,
-    0xeb,
-    0x58,
-    0x24,
-    0xf9,
-    0x7f,
-    0xcc,
-    0x75,
-    0x3d,
-    0x4d,
-    0xd6,
-    0x42,
-    0x56,
-    0xc0,
-    0x7f,
-    0x7e,
-    0x3a,
-    0x88,
-    0x0a,
-    0x72,
-    0xe2,
-    0x4b,
-    0xd7,
-    0x0d,
-    0x4d,
-    0x97,
-    0x87,
-    0x7b,
-    0xc7,
-    0x1c,
-    0x61,
-    0xf9,
-    0x6b,
-    0x18,
-    0xf4,
-    0xe7,
-    0xe7,
-    0x12,
-    0xfe,
-    0x1e,
-    0x7f,
-    0xcb,
-    0x8d,
-    0x85,
-    0x55,
-    0x72,
-    0x64,
-    0xdf,
-    0xe7,
-    0x17,
-    0xa0,
-    0xe7,
-    0xd9,
-    0x62,
-    0x9c,
-    0x9f,
-    0xf5,
-    0x85,
-    0x11,
-    0xe5,
-    0x70,
-    0x6f,
-    0x82,
-    0x47,
-    0x6e,
-    0x42,
-    0xd7,
-    0x18,
-    0xc9,
-    0x08,
-    0x48,
-    0xc3,
-    0x0e,
-    0xa2,
-    0x7c,
-    0x60,
-    0xc9,
-    0x00,
-    0xf2,
-    0x85,
-    0x03,
-    0x98,
-    0xa1,
-    0x5f,
-    0x08,
-    0x10,
-    0xdb,
-    0x01,
-    0x6e,
-    0x3e,
-    0x77,
-    0xfb,
-    0x52,
-    0x53,
-    0x2f,
-    0x2f,
-    0xe5,
-    0x53,
-    0x47,
-    0xe0,
-    0x28,
-    0xc9,
-    0x70,
-    0x0c,
-    0xf3,
-    0xb8,
-    0xeb,
-    0xfc,
-    0x3c,
-    0xd4,
-    0xf1,
-    0x19,
-    0x96,
-    0xf2,
-    0x53,
-    0x01,
-    0xf8,
-    0xbe,
-    0x5e,
-    0xda,
-    0xc0,
-    0xac,
-    0x01,
-    0xe7,
-    0xf7,
-    0x31,
-    0x32,
-    0x58,
-    0xd7,
-    0x32,
-    0x8d,
-    0x67,
-    0x8a,
-    0xbd,
-    0x3e,
-    0xa0,
-    0x35,
-    0xf7,
-    0x22,
-    0x80,
-    0x35,
-    0x55,
-    0x29,
-    0x42,
-    0xa9,
-    0x0f,
-    0xff,
-    0xf6,
-    0x30,
-    0xd2,
-    0xeb,
-    0xd3,
-    0xf4,
-    0xb6,
-    0xf7,
-    0xce,
-    0xe7,
-    0x6f,
-    0x51,
-    0x6c,
-    0x4c,
-    0xc7,
-    0xf1,
-    0xd4,
-    0x7a,
-    0x4c,
-    0x7c,
-    0x28,
-    0xdc,
-    0x45,
-    0x68,
-    0x15,
-    0x3d,
-    0xeb,
-    0x62,
-    0xa9,
-    0x42,
-    0xd6,
-    0xec,
-    0x65,
-    0x38,
-    0xb6,
-    0x4b,
-    0x94,
-    0x10,
-    0x43,
-    0xa0,
-    0xdb,
-    0xa8,
-    0x77,
-    0x55,
-    0x10,
-    0x4d,
-    0xfa,
-    0xba,
-    0x4f,
-    0x7d,
-    0xde,
-    0xf0,
-    0x4b,
-    0xf1,
-    0x8c,
-    0x07,
-    0xe3,
-    0xdb,
-    0xfe,
-    0x63,
-    0xf6,
-    0x6c,
-    0x2f,
-    0x64,
-    0x77,
-    0x99,
-    0xd0,
-    0x46,
-    0xc4,
-    0x1f,
-    0x3d,
-    0x45,
-    0x33,
-    0xc4,
-    0xaf,
-    0x05,
-    0xee,
-    0xe0,
-    0xb3,
-    0x32,
-    0x02,
-    0x1d,
-    0xdb,
-    0x63,
-    0xb2,
-    0x7b,
-    0xb3,
-    0x45,
-    0x11,
-    0x97,
-    0xf6,
-    0xf5,
-    0xd0,
-    0x2c,
-    0x02,
-    0xad,
-    0x54,
-    0xda,
-    0x8a,
-    0xa3,
-    0x0b,
-    0x26,
-    0x8b,
-    0x2e,
-    0x01,
-    0xc3,
-    0x81,
-    0x2b,
-    0xae,
-    0x10,
-    0xda,
-    0x9f,
-    0x13,
-    0xe1,
-    0xab,
-    0x9e,
-    0x05,
-    0x82,
-    0xa2,
-    0x6b,
-    0xc8,
-    0xf9,
-    0x3c,
-    0xe0,
-    0xdf,
-    0x8c,
-    0x37,
-    0x10,
-    0x23,
-    0x83,
-    0x4b,
-    0x2c,
-    0x13,
-    0x2f,
-    0x15,
-    0xa3,
-    0x6b,
-    0x2b,
-    0x54,
-    0x8d,
-    0xf8,
-    0xe2,
-    0x57,
-    0x4a,
-    0xaa,
-    0x51,
-    0xb6,
-    0x66,
-    0xeb,
-    0x0f,
-    0x41,
-    0xc0,
-    0x2f,
-    0x8a,
-    0x36,
-    0xec,
-    0xcc,
-    0x93,
-    0xb7,
-    0xd5,
-    0x0d,
-    0x1d,
-    0x7a,
-    0xa7,
-    0x81,
-    0x41,
-    0xc3,
-    0xec,
-    0x99,
-    0x86,
-    0x8f,
-    0xf5,
-    0x72,
-    0x60,
-    0x12,
-    0x7b,
-    0xf0,
-    0xf6,
-    0x64,
-    0x86,
-    0x0c,
-    0x28,
-    0x78,
-    0x8e,
-    0x6f,
-    0xd1,
-    0x4d,
-    0xe0,
-    0x3f,
-    0x49,
-    0x68,
-    0x44,
-    0x39,
-    0x2f,
-    0x81,
-    0xdd,
-    0x00,
-    0x65,
-    0x7d,
-    0x50,
-    0xb4,
-    0x5b,
-    0x9c,
-    0x29,
-    0xc7,
-    0x91,
-    0xf4,
-    0x7a,
-    0x0c,
-    0x57,
-    0x1e,
-    0xc4,
-    0x11,
-    0xd8,
-    0x2f,
-    0x1b,
-    0xaf,
-    0x56,
-    0xe9,
-    0x86,
-    0xdf,
-    0xb7,
-    0x33,
-    0xa5,
-    0xcf,
-    0x41,
-    0xc7,
-    0x96,
-    0x36,
-    0xa2,
-    0x2b,
-    0x18,
-    0xe4,
-    0x33,
-    0xe2,
-    0xf1,
-    0x9d,
-    0x7d,
-    0xe3,
-    0x8e,
-    0x27,
-    0xfd,
-    0x4a,
-    0xea,
-    0xa2,
-    0x24,
-    0x4e,
-    0xb1,
-    0x18,
-    0xa2,
-    0x73,
-    0xa4,
-    0x55,
-    0xe4,
-    0x00,
-    0x3f,
-    0xf9,
-    0xdb,
-    0xb4,
-    0x99,
-    0xcb,
-    0x00,
-    0xb5,
-    0x8d,
-    0x50,
-    0x95,
-    0xc9,
-    0x17,
-    0x9d,
-    0x2d,
-    0xc8,
-    0x00,
-    0x69,
-    0x6e,
-    0x52,
-    0xbe,
-    0x66,
-    0x16,
-    0xbd,
-    0x96,
-    0xd2,
-    0x3c,
-    0x51,
-    0x03,
-    0x48,
-    0xd9,
-    0xb8,
-    0x5b,
-    0xdd,
-    0x86,
-    0xb0,
-    0xb0,
-    0x68,
-    0x87,
-    0x03,
-    0xf4,
-    0x21,
-    0x09,
-    0xb9,
-    0x61,
-    0x6e,
-    0xa8,
-    0x8c,
-    0x18,
-    0xf9,
-    0x34,
-    0x9c,
-    0x09,
-    0x06,
-    0xb5,
-    0x64,
-    0x12,
-    0x04,
-    0xac,
-    0xed,
-    0x6b,
-    0x61,
-    0x9c,
-    0x41,
-    0x41,
-    0xa3,
-    0xc9,
-    0x23,
-    0xa1,
-    0xb5,
-    0x40,
-    0xfd,
-    0x98,
-    0x7e,
-    0x17,
-    0x1a,
-    0x99,
-    0xb8,
-    0xf6,
-    0x15,
-    0x1e,
-    0x00,
-    0xd7,
-    0x92,
-    0x92,
-    0x29,
-    0x09,
-    0x2b,
-    0x6f,
-    0xd6,
-    0x7b,
-    0xae,
-    0xa4,
-    0x48,
-    0x37,
-    0x85,
-    0x39,
-    0x74,
-    0x2d,
-    0x75,
-    0x35,
-    0x59,
-    0x32,
-    0x8c,
-    0xc0,
-    0x90,
-    0x48,
-    0x54,
-    0x85,
-    0x25,
-    0x20,
-    0x4d,
-    0x5a,
-    0xa5,
-    0xdd,
-    0x9a,
-    0x23,
-    0x78,
-    0x1b,
-    0xfb,
-    0xf3,
-    0x71,
-    0x30,
-    0xfb,
-    0x75,
-    0xa4,
-    0xb1,
-    0x6b,
-    0x8b,
-    0x78,
-    0x39,
-    0x0e,
-    0x34,
-    0xfd,
-    0x65,
-    0x96,
-    0xb3,
-    0x7f,
-    0x23,
-    0xcf,
-    0xee,
-    0x5b,
-    0x2d,
-    0x1b,
-    0x14,
-    0x11,
-    0xd0,
-    0x1e,
-    0x82,
-    0x9b,
-    0xf2,
-    0xba,
-    0xe8,
-    0xfd,
-    0x53,
-    0x3e,
-    0xa7,
-    0x1e,
-    0x13,
-    0xda,
-    0x7e,
-    0xd6,
-    0x75,
-    0x57,
-    0x66,
-    0x48,
-    0xe2,
-    0x04,
-    0xba,
-    0x72,
-    0x31,
-    0xf4,
-    0x9b,
-    0x02,
-    0x25,
-    0x66,
-    0x93,
-    0x6b,
-    0x37,
-    0x85,
-    0x78,
-    0x39,
-    0x96,
-    0x52,
-    0x94,
-    0xa1,
-    0x6d,
-    0xde,
-    0x02,
-    0x5d,
-    0x64,
-    0xbc,
-    0x5b,
-    0xb7,
-    0x69,
-    0xb6,
-    0x93,
-    0xe3,
-    0xb0,
-    0xbf,
-    0x1d,
-    0x91,
-    0xf8,
-    0x29,
-    0x56,
-    0xc3,
-    0x11,
-    0x18,
-    0x20,
-    0xdc,
-    0x9b,
-    0x37,
-    0xcd,
-    0xfa,
-    0x10,
-    0xa9,
-    0x40,
-    0x86,
-    0x05,
-    0x43,
-    0x4e,
-    0x0a,
-    0xac,
-    0xf8,
-    0x6a,
-    0x42,
-    0x9e,
-    0x94,
-    0x82,
-    0x75,
-    0xd7,
-    0xae,
-    0x24,
-    0x05,
-    0x02,
-    0xd7,
-    0xe5,
-    0x46,
-    0xf8,
-    0x18,
-    0x03,
-    0x8c,
-    0x83,
-    0x9c,
-    0x49,
-    0x88,
-    0x67,
-    0xa9,
-    0x33,
-    0xd4,
-    0xa3,
-    0xd5,
-    0x53,
-    0xcc,
-    0xf4,
-    0x76,
-    0xf3,
-    0xa0,
-    0x9b,
-    0x5a,
-    0xfc,
-    0xa7,
-    0x60,
-    0xb8,
-    0x17,
-    0xf6,
-    0xd7,
-    0x67,
-    0x11,
-    0x32,
-    0xe2,
-    0x4e,
-    0x84,
-    0xa2,
-    0x77,
-    0x1c,
-    0xb4,
-    0x88,
-    0xa3,
-    0x39,
-    0xb7,
-    0xb2,
-    0xcf,
-    0xfc,
-    0xd9,
-    0x4c,
-    0x43,
-    0x1e,
-    0x3e,
-    0xf8,
-    0xe8,
-    0x6e,
-    0xc9,
-    0x21,
-    0x52,
-    0xc7,
-    0x3d,
-    0x8b,
-    0xfd,
-    0x3f,
-    0xa2,
-    0x2f,
-    0xd7,
-    0xa2,
-    0xeb,
-    0x47,
-    0xff,
-    0x1f,
-    0xd5,
-    0xa5,
-    0xcd,
-    0x40,
-    0x12,
-    0x48,
-    0x12,
-    0x20,
-    0xa7,
-    0x31,
-    0xa1,
-    0xd8,
-    0x93,
-    0x73,
-    0x0e,
-    0x3a,
-    0xb1,
-    0x8a,
-    0xb5,
-    0xc2,
-    0xdf,
-    0xed,
-    0xfe,
-    0xc9,
-    0x60,
-    0xe7,
-    0xe0,
-    0xfc,
-    0x7f,
-    0xa2,
-    0xa4,
-    0x0d,
-    0x75,
-    0x85,
-    0xec,
-    0xa8,
-    0x8d,
-    0xbf,
-    0xf3,
-    0xa9,
-    0x86,
-    0x24,
-    0x16,
-    0x8c,
-    0x39,
-    0x39,
-    0x94,
-    0x24,
-    0x7c,
-    0x8a,
-    0x92,
-    0x90,
-    0x45,
-    0x44,
-    0x62,
-    0x6c,
-    0x13,
-    0xff,
-    0x04,
-    0x44,
-    0x89,
-    0xdc,
-    0xed,
-    0x4e,
-    0x5c,
-    0xd0,
-    0x08,
-    0x58,
-    0x70,
-    0x3f,
-    0xfb,
-    0xff,
-    0x3e,
-    0xcd,
-    0xab,
-    0x22,
-    0x79,
-    0x71,
-    0x02,
-    0x96,
-    0xf1,
-    0xcb,
-    0xf0,
-    0x1b,
-    0xb7,
-    0xb7,
-    0xaf,
-    0x8f,
-    0x82,
-    0x22,
-    0x4c,
-    0x62,
-    0x51,
-    0x1c,
-    0x63,
-    0x4a,
-    0x52,
-    0x2f,
-    0x2a,
-    0x38,
-    0x03,
-    0xef,
-    0xb0,
-    0x8a,
-    0x97,
-    0xd3,
-    0x67,
-    0x82,
-    0x9b,
-    0x43,
-    0xe1,
-    0xf7,
-    0xd9,
-    0xf2,
-    0xd7,
-    0x4a,
-    0x7d,
-    0x6e,
-    0x6f,
-    0x9c,
-    0x76,
-    0xf6,
-    0xbe,
-    0x3e,
-    0x1f,
-    0x8b,
-    0x8c,
-    0x69,
-    0x1f,
-    0x49,
-    0x58,
-    0x30,
-    0x8e,
-    0xf8,
-    0x9c,
-    0xb2,
-    0x59,
-    0xdf,
-    0x53,
-    0x94,
-    0xe7,
-    0xd8,
-    0xb7,
-    0xaf,
-    0xfc,
-    0xaa,
-    0x4f,
-    0x05,
-    0xde,
-    0x92,
-    0x29,
-    0xfa,
-    0xb7,
-    0x23,
-    0x65,
-    0xc1,
-    0x3b,
-    0x51,
-    0xf3,
-    0x14,
-    0x8a,
-    0xc8,
-    0x9c,
-    0x28,
-    0x58,
-    0x82,
-    0x47,
-    0xe0,
-    0x4b,
-    0x98,
-    0x75,
-    0x41,
-    0xa4,
-    0x58,
-    0x0f,
-    0x26,
-    0x22,
-    0x99,
-    0x61,
-    0x34,
-    0x23,
-    0x4b,
-    0x66,
-    0x11,
-    0x0d,
-    0x52,
-    0x46,
-    0xd1,
-    0xec,
-    0x95,
-    0x1d,
-    0xb1,
-    0x5d,
-    0x51,
-    0xfe,
-    0x08,
-    0xaa,
-    0xb4,
-    0x38,
-    0x7a,
-    0x36,
-    0xa7,
-    0xd7,
-    0x6f,
-    0x1c,
-    0xeb,
-    0x6e,
-    0xc3,
-    0x13,
-    0x67,
-    0x14,
-    0xc0,
-    0x95,
-    0xc0,
-    0xad,
-    0x49,
-    0x40,
-    0x2b,
-    0x6b,
-    0x57,
-    0x7c,
-    0x7f,
-    0x94,
-    0xaa,
-    0x5e,
-    0x8f,
-    0x85,
-    0xb8,
-    0xcc,
-    0xb6,
-    0xf7,
-    0xea,
-    0xe2,
-    0xb3,
-    0x81,
-    0x07,
-    0x95,
-    0xb7,
-    0x5e,
-    0xf0,
-    0x96,
-    0xbd,
-    0x71,
-    0x8f,
-    0x79,
-    0x1a,
-    0x86,
-    0x0a,
-    0x17,
-    0x55,
-    0xdb,
-    0x3c,
-    0x31,
-    0x38,
-    0xdf,
-    0x65,
-    0x56,
-    0x27,
-    0x39,
-    0x20,
-    0x06,
-    0xb1,
-    0x0c,
-    0x96,
-    0x17,
-    0x65,
-    0x79,
-    0xf2,
-    0x58,
-    0xe7,
-    0x66,
-    0x15,
-    0x75,
-    0x43,
-    0x7e,
-    0x8a,
-    0x1a,
-    0x80,
-    0x79,
-    0xbc,
-    0x5b,
-    0x79,
-    0x9e,
-    0x66,
-    0x54,
-    0xe8,
-    0x86,
-    0x4c,
-    0x0c,
-    0xc4,
-    0x22,
-    0x29,
-    0xa0,
-    0xcd,
-    0x00,
-    0xe8,
-    0x9d,
-    0x65,
-    0xc9,
-    0x16,
-    0xad,
-    0xa1,
-    0x0f,
-    0x98,
-    0x76,
-    0xa0,
-    0x45,
-    0x99,
-    0xbf,
-    0x1b,
-    0x0f,
-    0xc7,
-    0xd4,
-    0x3e,
-    0xbd,
-    0xbf,
-    0x2c,
-    0xb6,
-    0x11,
-    0xc5,
-    0x4a,
-    0x0c,
-    0x49,
-    0xb9,
-    0xe1,
-    0x31,
-    0x59,
-    0x46,
-    0x3b,
-    0x5a,
-    0x79,
-    0x5d,
-    0xdb,
-    0x0d,
-    0xdf,
-    0xe2,
-    0x62,
-    0x7c,
-    0xce,
-    0xa5,
-    0xaf,
-    0x13,
-    0xcf,
-    0x93,
-    0x4a,
-    0x4d,
-    0x3f,
-    0x2e,
-    0x03,
-    0xcb,
-    0x09,
-    0x3a,
-    0xd6,
-    0xa7,
-    0xb5,
-    0xb9,
-    0x12,
-    0x06,
-    0xa2,
-    0x1a,
-    0xbb,
-    0xec,
-    0x8f,
-    0xae,
-    0x2c,
-    0x55,
-    0x60,
-    0x5b,
-    0x00,
-    0x81,
-    0x1f,
-    0x94,
-    0x33,
-    0x8f,
-    0x42,
-    0x88,
-    0x85,
-    0x4d,
-    0x2c,
-    0x9a,
-    0x1f,
-    0x4f,
-    0xf6,
-    0x12,
-    0x79,
-    0x3e,
-    0x6e,
-    0x12,
-    0x7b,
-    0x73,
-    0x60,
-    0xcb,
-    0xe3,
-    0xc4,
-    0x15,
-    0xf0,
-    0xe6,
-    0x9e,
-    0x1a,
-    0x6b,
-    0x1a,
-    0x55,
-    0x42,
-    0x50,
-    0x93,
-    0xb7,
-    0xee,
-    0x0f,
-    0x4c,
-    0xe7,
-    0x8c,
-    0xed,
-    0xc9,
-    0x69,
-    0x5e,
-    0xb5,
-    0xfb,
-    0x79,
-    0x7d,
-    0xaa,
-    0x64,
-    0xa1,
-    0x1d,
-    0xc1,
-    0x7c,
-    0x8a,
-    0x12,
-    0x0d,
-    0x52,
-    0x13,
-    0x94,
-    0x7b,
-    0x76,
-    0xa0,
-    0x3f,
-    0xbf,
-    0x17,
-    0xb4,
-    0x5d,
-    0x8e,
-    0x69,
-    0xc3,
-    0x68,
-    0x0e,
-    0x49,
-    0x41,
-    0xcb,
-    0x8b,
-    0x24,
-    0xff,
-    0xe9,
-    0x6b,
-    0x15,
-    0xb7,
-    0x60,
-    0x64,
-    0x4d,
-    0xe6,
-    0x8f,
-    0xec,
-    0xb8,
-    0xd9,
-    0x56,
-    0xf1,
-    0xde,
-    0x0b,
-    0x1c,
-    0xcb,
-    0x07,
-    0xae,
-    0x17,
-    0x6f,
-    0xa2,
-    0x88,
-    0xc7,
-    0xe5,
-    0xe7,
-    0x00,
-    0xc4,
-    0xfc,
-    0xbc,
-    0x79,
-    0xba,
-    0x3c,
-    0xd5,
-    0xde,
-    0xb2,
-    0x1c,
-    0x20,
-    0x7e,
-    0x93,
-    0x75,
-    0x60,
-    0x1b,
-    0xe8,
-    0x37,
-    0x17,
-    0x3d,
-    0xe3,
-    0x5b,
-    0xaa,
-    0xcc,
-    0xa2,
-    0x18,
-    0xc0,
-    0xde,
-    0xb2,
-    0x5a,
-    0xeb,
-    0xce,
-    0xd2,
-    0x70,
-    0x8a,
-    0x8e,
-    0xf9,
-    0x04,
-    0xee,
-    0x3e,
-    0x9a,
-    0x51,
-    0xbb,
-    0xfd,
-    0x26,
-    0x90,
-    0x91,
-    0xff,
-    0xd3,
-    0xb3,
-    0xec,
-    0xdf,
-    0x9c,
-    0x56,
-    0x49,
-    0x37,
-    0x88,
-    0xf3,
-    0x8b,
-    0x6f,
-    0x30,
-    0x55,
-    0x9c,
-    0xd2,
-    0x7b,
-    0x4f,
-    0x57,
-    0xe7,
-    0xad,
-    0xad,
-    0xa6,
-    0xfe,
-    0xa0,
-    0x6b,
-    0xe7,
-    0x09,
-    0x50,
-    0x25,
-    0x95,
-    0xad,
-    0x9e,
-    0xcf,
-    0x24,
-    0x99,
-    0x4d,
-    0xa6,
-    0x2c,
-    0x17,
-    0x51,
-    0x66,
-    0xca,
-    0xe0,
-    0x49,
-    0xbe,
-    0x44,
-    0x35,
-    0x4a,
-    0x01,
-    0xeb,
-    0x2b,
-    0xde,
-    0x1e,
-    0x46,
-    0x47,
-    0x4c,
-    0xd2,
-    0x6c,
-    0x4a,
-    0x1a,
-    0x1c,
-    0xb2,
-    0x4e,
-    0xd1,
-    0xf2,
-    0x86,
-    0x12,
-    0x00,
-    0x32,
-    0x9b,
-    0x93,
-    0x83,
-    0xdb,
-    0x47,
-    0xdc,
-    0x05,
-    0x7d,
-    0x29,
-    0x1e,
-    0xc4,
-    0xee,
-    0x0e,
-    0x03,
-    0x94,
-    0x3f,
-    0x15,
-    0x40,
-    0x27,
-    0xee,
-    0x12,
-    0x6a,
-    0x8b,
-    0x5d,
-    0x31,
-    0x0a,
-    0xf4,
-    0x83,
-    0xdc,
-    0xf3,
-    0xbc,
-    0xe2,
-    0xde,
-    0xd3,
-    0xa8,
-    0xb9,
-    0xc8,
-    0x09,
-    0x6d,
-    0x7a,
-    0x93,
-    0xb6,
-    0x73,
-    0x7e,
-    0x88,
-    0x17,
-    0xd8,
-    0xf8,
-    0x5d,
-    0x12,
-    0xb8,
-    0x28,
-    0xa1,
-    0x0e,
-    0xac,
-    0xd1,
-    0x5a,
-    0x08,
-    0x90,
-    0xec,
-    0xec,
-    0xe3,
-    0x8a,
-    0x9e,
-    0x3c,
-    0x00,
-    0x47,
-    0x68,
-    0x16,
-    0x0f,
-    0x88,
-    0x9e,
-    0xcc,
-    0x25,
-    0xde,
-    0x1a,
-    0x20,
-    0x0e,
-    0xb1,
-    0x31,
-    0x64,
-    0xe4,
-    0x87,
-    0xe6,
-    0xe0,
-    0xe0,
-    0x83,
-    0x5e,
-    0x74,
-    0x71,
-    0x2c,
-    0x94,
-    0x7f,
-    0x8b,
-    0x71,
-    0x4e,
-    0xff,
-    0x42,
-    0xe9,
-    0x50,
-    0xf9,
-    0x97,
-    0x5f,
-    0xcf,
-    0x1b,
-    0x92,
-    0x8d,
-    0x28,
-    0xa0,
-    0x91,
-    0x28,
-    0xd2,
-    0x74,
-    0xdf,
-    0x1d,
-    0x91,
-    0x98,
-    0x88,
-    0x1b,
-    0xed,
-    0xc9,
-    0x6c,
-    0x51,
-    0xe3,
-    0x5c,
-    0x93,
-    0x79,
-    0xda,
-    0x6d,
-    0xc0,
-    0x15,
-    0xd9,
-    0x38,
-    0x49,
-    0xf8,
-    0xf6,
-    0xc7,
-    0x25,
-    0x09,
-    0x12,
-    0xce,
-    0x47,
-    0x44,
-    0xc3,
-    0xd3,
-    0x2a,
-    0x01,
-    0x92,
-    0x91,
-    0xae,
-    0x79,
-    0x67,
-    0x9f,
-    0x22,
-    0x86,
-    0x41,
-    0x4d,
-    0xa2,
-    0xaa,
-    0x2a,
-    0xcf,
-    0xa3,
-    0x53,
-    0x6b,
-    0x9d,
-    0xcc,
-    0x5d,
-    0xfc,
-    0x19,
-    0x08,
-    0xd9,
-    0x3e,
-    0x72,
-    0xd9,
-    0x0d,
-    0xec,
-    0xc9,
-    0xef,
-    0xbb,
-    0x4f,
-    0x93,
-    0xf9,
-    0xa7,
-    0xb2,
-    0x3f,
-    0xbb,
-    0x53,
-    0x16,
-    0x18,
-    0x60,
-    0x0d,
-    0x27,
-    0x6c,
-    0x12,
-    0x2b,
-    0x6e,
-    0xee,
-    0xc9,
-    0x96,
-    0xc7,
-    0x59,
-    0x60,
-    0x85,
-    0x16,
-    0x56,
-    0xee,
-    0x8b,
-    0x36,
-    0xa0,
-    0x53,
-    0xd4,
-    0x32,
-    0x66,
-    0x11,
-    0xac,
-    0xb8,
-    0xf1,
-    0x5e,
-    0x40,
-    0xca,
-    0x86,
-    0x77,
-    0xa9,
-    0xb7,
-    0x8e,
-    0x36,
-    0x26,
-    0x4a,
-    0xf4,
-    0xe7,
-    0xa9,
-    0x41,
-    0xcf,
-    0x58,
-    0x96,
-    0x00,
-    0x41,
-    0x2f,
-    0xc7,
-    0x87,
-    0x9e,
-    0x80,
-    0xd3,
-    0xa2,
-    0xd1,
-    0x9f,
-    0x90,
-    0x5f,
-    0xfc,
-    0x33,
-    0xd6,
-    0xc5,
-    0x5f,
-    0x8c,
-    0x86,
-    0xc3,
-    0x7b,
-    0x37,
-    0xcb,
-    0x67,
-    0x77,
-    0xcf,
-    0xa0,
-    0x51,
-    0xc2,
-    0x15,
-    0x93,
-    0x66,
-    0xfa,
-    0x43,
-    0xc8,
-    0xc9,
-    0x0d,
-    0x9e,
-    0x40,
-    0x07,
-    0x9e,
-    0x4b,
-    0x5b,
-    0x91,
-    0xaa,
-    0x63,
-    0x9c,
-    0x70,
-    0x6b,
-    0x4a,
-    0xad,
-    0x34,
-    0x7c,
-    0x3c,
-    0xa3,
-    0x2d,
-    0x3f,
-    0x28,
-    0x82,
-    0xde,
-    0x7c,
-    0xc2,
-    0x04,
-    0xaf,
-    0x4a,
-    0xd4,
-    0x96,
-    0xe2,
-    0x33,
-    0xd4,
-    0xa4,
-    0xc8,
-    0x93,
-    0xbc,
-    0x16,
-    0x35,
-    0x41,
-    0x16,
-    0x1b,
-    0x31,
-    0x71,
-    0x56,
-    0x25,
-    0xf0,
-    0xd9,
-    0x6d,
-    0x35,
-    0x05,
-    0x13,
-    0x9b,
-    0x58,
-    0xd2,
-    0x43,
-    0x85,
-    0x71,
-    0x43,
-    0xf9,
-    0x87,
-    0x3a,
-    0xbc,
-    0x59,
-    0x4b,
-    0x86,
-    0x4f,
-    0x79,
-    0x9b,
-    0xc9,
-    0x33,
-    0x0a,
-    0x73,
-    0xd9,
-    0x71,
-    0x3b,
-    0x5b,
-    0xf6,
-    0xe1,
-    0xda,
-    0xf3,
-    0x09,
-    0x55,
-    0xbc,
-    0xd0,
-    0x29,
-    0x14,
-    0x60,
-    0x86,
-    0x63,
-    0x8a,
-    0xcf,
-    0x06,
-    0xbb,
-    0x3d,
-    0xc6,
-    0x2b,
-    0x6e,
-    0x03,
-    0x17,
-    0x8f,
-    0x7a,
-    0x73,
-    0x4d,
-    0xa3,
-    0x60,
-    0x99,
-    0x8f,
-    0xff,
-    0x29,
-    0xee,
-    0xc7,
-    0xf6,
-    0xa7,
-    0x86,
-    0x03,
-    0x6e,
-    0xfd,
-    0x8c,
-    0x1b,
-    0xee,
-    0x62,
-    0xec,
-    0x94,
-    0xf9,
-    0x21,
-    0x4f,
-    0xc4,
-    0x9b,
-    0xe4,
-    0x4c,
-    0x37,
-    0x41,
-    0x33,
-    0xdc,
-    0x52,
-    0xce,
-    0x38,
-    0x0f,
-    0x36,
-    0xea,
-    0xc5,
-    0xfe,
-    0xe7,
-    0x9d,
-    0x98,
-    0x01,
-    0xae,
-    0x1e,
-    0xdd,
-    0x22,
-    0xbb,
-    0xe5,
-    0xf4,
-    0xd1,
-    0x0f,
-    0x07,
-    0x75,
-    0xd9,
-    0x99,
-    0xc3,
-    0x71,
-    0x92,
-    0x9f,
-    0x58,
-    0xfb,
-    0x58,
-    0x60,
-    0x1a,
-    0xe7,
-    0x3d,
-    0xf8,
-    0xc5,
-    0xd2,
-    0xfb,
-    0x83,
-    0x11,
-    0x63,
-    0x2d,
-    0x85,
-    0x87,
-    0xcf,
-    0xbe,
-    0x8a,
-    0x92,
-    0xa3,
-    0xa1,
-    0x09,
-    0xd9,
-    0xbe,
-    0xc2,
-    0x8e,
-    0xcc,
-    0x9c,
-    0x3d,
-    0x18,
-    0x7d,
-    0xdb,
-    0xcf,
-    0xc0,
-    0xb2,
-    0xf7,
-    0x89,
-    0x9c,
-    0x38,
-    0x59,
-    0xcc,
-    0xe3,
-    0x7a,
-    0x90,
-    0x71,
-    0x52,
-    0x52,
-    0xde,
-    0x48,
-    0xce,
-    0x1e,
-    0xf6,
-    0xc4,
-    0x4a,
-    0x17,
-    0x04,
-    0xf4,
-    0xeb,
-    0xde,
-    0xee,
-    0xb5,
-    0x6a,
-    0x58,
-    0xd9,
-    0x27,
-    0xbb,
-    0xbc,
-    0xf0,
-    0x5d,
-    0xec,
-    0xea,
-    0x60,
-    0x59,
-    0x4f,
-    0xff,
-    0xa7,
-    0x37,
-    0xdb,
-    0x26,
-    0x0f,
-    0xa8,
-    0xd0,
-    0xb1,
-    0x75,
-    0xa2,
-    0x9a,
-    0x68,
-    0x4f,
-    0x56,
-    0xf8,
-    0x20,
-    0xee,
-    0x63,
-    0x5d,
-    0x90,
-    0x00,
-    0x49,
-    0x97,
-    0x61,
-    0x58,
-    0x20,
-    0xae,
-    0x84,
-    0xf2,
-    0x8a,
-    0x0f,
-    0xc8,
-    0x31,
-    0xe6,
-    0xe9,
-    0xac,
-    0x6c,
-    0xc6,
-    0xd8,
-    0x71,
-    0xa9,
-    0xa3,
-    0xc1,
-    0x74,
-    0xa8,
-    0xd0,
-    0xfd,
-    0xbb,
-    0x24,
-    0xad,
-    0xb9,
-    0xce,
-    0x55,
-    0x1d,
-    0x9c,
-    0xc8,
-    0xb9,
-    0x3a,
-    0xab,
-    0xad,
-    0x14,
-    0x47,
-    0x6a,
-    0xfe,
-    0xb6,
-    0xe5,
-    0x44,
-    0x8b,
-    0xfc,
-    0x8a,
-    0x2d,
-    0x89,
-    0x19,
-    0x30,
-    0x86,
-    0xe4,
-    0x16,
-    0x4a,
-    0x41,
-    0xd7,
-    0x18,
-    0xfc,
-    0x45,
-    0xb9,
-    0xe2,
-    0x8b,
-    0x14,
-    0x1a,
-    0x9a,
-    0x13,
-    0xab,
-    0x0e,
-    0xd0,
-    0x78,
-    0xaa,
-    0xc9,
-    0xbc,
-    0x9e,
-    0xb4,
-    0x6c,
-    0xc7,
-    0xdd,
-    0x19,
-    0x1f,
-    0x4e,
-    0xaf,
-    0xb2,
-    0x60,
-    0xa2,
-    0xac,
-    0x0d,
-    0x9a,
-    0x53,
-    0xb9,
-    0xca,
-    0xfa,
-    0xae,
-    0x7c,
-    0x45,
-    0x7e,
-    0x84,
-    0x13,
-    0x76,
-    0x4f,
-    0x2d,
-    0x05,
-    0x15,
-    0x50,
-    0xcd,
-    0x78,
-    0x01,
-    0xf7,
-    0xd6,
-    0xa5,
-    0xe2,
-    0x5c,
-    0xce,
-    0x8a,
-    0x0d,
-    0x8f,
-    0x53,
-    0xde,
-    0xa9,
-    0x2f,
-    0x5c,
-    0x4a,
-    0x10,
-    0x38,
-    0xc1,
-    0xd6,
-    0x78,
-    0x1d,
-    0xfe,
-    0xa2,
-    0xd3,
-    0x17,
-    0x34,
-    0xd6,
-    0xf4,
-    0xbc,
-    0x70,
-    0xdb,
-    0xf2,
-    0xd3,
-    0x30,
-    0xcc,
-    0xd1,
-    0x67,
-    0x23,
-    0x27,
-    0x5f,
-    0x1a,
-    0x31,
-    0xc9,
-    0x5d,
-    0xbc,
-    0xbb,
-    0x19,
-    0xdf,
-    0x1c,
-    0x24,
-    0x83,
-    0xf6,
-    0x1e,
-    0x90,
-    0x28,
-    0x8b,
-    0x0e,
-    0xeb,
-    0xd3,
-    0x8e,
-    0x34,
-    0x2e,
-    0x2f,
-    0x51,
-    0xa9,
-    0xdd,
-    0x38,
-    0x2e,
-    0x69,
-    0xd4,
-    0xf0,
-    0x70,
-    0xa8,
-    0x44,
-    0x53,
-    0x71,
-    0x6a,
-    0xf9,
-    0x8c,
-    0xff,
-    0x4e,
-    0xde,
-    0x69,
-    0x04,
-    0xaa,
-    0xc2,
-    0x0d,
-    0x66,
-    0xdd,
-    0x5c,
-    0xe5,
-    0x2d,
-    0xe1,
-    0x8d,
-    0xdd,
-    0xe4,
-    0x20,
-    0xe6,
-    0xd3,
-    0x41,
-    0x89,
-    0x6a,
-    0x4b,
-    0x08,
-    0xe2,
-    0x95,
-    0x65,
-    0x2c,
-    0x60,
-    0x9d,
-    0x0d,
-    0x37,
-    0x75,
-    0xf7,
-    0x72,
-    0xed,
-    0xe9,
-    0x1d,
-    0xb9,
-    0x2c,
-    0x2c,
-    0x8f,
-    0xf2,
-    0x17,
-    0xeb,
-    0x17,
-    0x4b,
-    0x74,
-    0xe1,
-    0x52,
-    0x83,
-    0x51,
-    0xf0,
-    0x6c,
-    0xa2,
-    0xee,
-    0x70,
-    0x2b,
-    0xe8,
-    0xd7,
-    0xc7,
-    0x2f,
-    0x03,
-    0x51,
-    0x39,
-    0x78,
-    0x85,
-    0xf7,
-    0x02,
-    0x28,
-    0x94,
-    0xa5,
-    0xa2,
-    0x8a,
-    0xe3,
-    0x95,
-    0x79,
-    0x54,
-    0xe2,
-    0xc8,
-    0x93,
-    0x29,
-    0x32,
-    0xa8,
-    0xc5,
-    0x62,
-    0x5c,
-    0xeb,
-    0xf9,
-    0x0e,
-    0xc2,
-    0xba,
-    0xc6,
-    0x37,
-    0xd6,
-    0x13,
-    0x44,
-    0x68,
-    0x89,
-    0x6c,
-    0x1e,
-    0x6b,
-    0x07,
-    0x99,
-    0xe8,
-    0x57,
-    0xa1,
-    0xef,
-    0xb3,
-    0xcb,
-    0x0a,
-    0xaa,
-    0xdf,
-    0x74,
-    0xc7,
-    0x8c,
-    0x31,
-    0xd5,
-    0xe1,
-    0xc7,
-    0x25,
-    0x47,
-    0xdd,
-    0x1d,
-    0x86,
-    0x3e,
-    0xed,
-    0x46,
-    0x3b,
-    0xcf,
-    0x68,
-    0x92,
-    0x64,
-    0x6f,
-    0x78,
-    0xcf,
-    0xa6,
-    0xfe,
-    0x13,
-    0x6d,
-    0xc2,
-    0x04,
-    0x2c,
-    0xe0,
-    0x6d,
-    0x3a,
-    0x2a,
-    0x46,
-    0x5c,
-    0x4c,
-    0x99,
-    0x4a,
-    0x9e,
-    0xdd,
-    0x1f,
-    0x48,
-    0x2e,
-    0xcb,
-    0xb2,
-    0xb2,
-    0xc9,
-    0xb5,
-    0x09,
-    0xb2,
-    0xfd,
-    0xbb,
-    0x50,
-    0x10,
-    0x83,
-    0x85,
-    0x20,
-    0x57,
-    0xce,
-    0x87,
-    0xae,
-    0x33,
-    0xe4,
-    0x83,
-    0x43,
-    0x1e,
-    0x6d,
-    0x4f,
-    0xec,
-    0x3b,
-    0x09,
-    0xd8,
-    0x72,
-    0x82,
-    0xe7,
-    0x67,
-    0x8c,
-    0x1e,
-    0x94,
-    0x23,
-    0x54,
-    0x13,
-    0x10,
-    0xd8,
-    0xf8,
-    0x24,
-    0x27,
-    0xf6,
-    0xb2,
-    0xf4,
-    0xfe,
-    0xdd,
-    0xfa,
-    0x6b,
-    0xed,
-    0x57,
-    0xfa,
-    0x5b,
-    0x8c,
-    0x66,
-    0x42,
-    0x64,
-    0x11,
-    0x41,
-    0xbd,
-    0x15,
-    0xd9,
-    0x99,
-    0xe3,
-    0x53,
-    0x44,
-    0x20,
-    0x31,
-    0xff,
-    0xc6,
-    0x4c,
-    0xd6,
-    0xd3,
-    0x3b,
-    0x58,
-    0xb0,
-    0x8d,
-    0x7b,
-    0x8d,
-    0x76,
-    0x50,
-    0x2f,
-    0xbf,
-    0x37,
-    0x47,
-    0xe3,
-    0x1a,
-    0x03,
-    0x8b,
-    0x5c,
-    0x1f,
-    0xe8,
-    0x47,
-    0x2b,
-    0xe9,
-    0x20,
-    0x1a,
-    0x82,
-    0xb5,
-    0x88,
-    0xbc,
-    0x47,
-    0xa1,
-    0x54,
-    0xe5,
-    0x67,
-    0xb4,
-    0x01,
-    0x6a,
-    0x6d,
-    0x1f,
-    0x8c,
-    0xa9,
-    0x53,
-    0xc2,
-    0xe2,
-    0x28,
-    0x97,
-    0xf2,
-    0x97,
-    0x79,
-    0x92,
-    0x7a,
-    0xda,
-    0x61,
-    0x06,
-    0xdf,
-    0xa9,
-    0x39,
-    0xf6,
-    0xe9,
-    0x41,
-    0x93,
-    0xba,
-    0x5e,
-    0xd9,
-    0x21,
-    0x52,
-    0x11,
-    0x8f,
-    0xd3,
-    0xfb,
-    0x1b,
-    0xa3,
-    0x40,
-    0x00,
-    0x69,
-    0xe3,
-    0x47,
-    0xd3,
-    0x77,
-    0x66,
-    0xf6,
-    0x5c,
-    0x5a,
-    0x7d,
-    0xaa,
-    0x91,
-    0x04,
-    0xe7,
-    0x78,
-    0x47,
-    0xc4,
-    0x44,
-    0xcc,
-    0x47,
-    0x0c,
-    0xcc,
-    0x50,
-    0xa5,
-    0x77,
-    0x41,
-    0x10,
-    0x4d,
-    0x0a,
-    0x22,
-    0xdb,
-    0xdf,
-    0xbb,
-    0x22,
-    0xec,
-    0xbd,
-    0x2f,
-    0xd9,
-    0xca,
-    0x62,
-    0xc8,
-    0xb8,
-    0x6c,
-    0xf5,
-    0xdf,
-    0x42,
-    0xa1,
-    0x1d,
-    0x4e,
-    0x79,
-    0xaf,
-    0x18,
-    0x32,
-    0x97,
-    0x3a,
-    0x07,
-    0xef,
-    0xff,
-    0x68,
-    0x8c,
-    0x74,
-    0x73,
-    0x43,
-    0x97,
-    0xc0,
-    0x87,
-    0x5f,
-    0x7d,
-    0xa4,
-    0x56,
-    0xbc,
-    0x4b,
-    0xcb,
-    0x73,
-    0xed,
-    0x59,
-    0xf9,
-    0x23,
-    0x7a,
-    0x22,
-    0x90,
-    0xc9,
-    0x84,
-    0x52,
-    0x58,
-    0xa1,
-    0xa7,
-    0x21,
-    0x7f,
-    0xb1,
-    0x25,
-    0xe0,
-    0xdf,
-    0xfd,
-    0x40,
-    0xd1,
-    0x80,
-    0xfb,
-    0xe7,
-    0x3c,
-    0x5e,
-    0x46,
-    0x95,
-    0xbf,
-    0x6c,
-    0x96,
-    0x77,
-    0xe6,
-    0xd8,
-    0xf0,
-    0xcd,
-    0xfc,
-    0x91,
-    0x1a,
-    0x92,
-    0x20,
-    0x07,
-    0x52,
-    0x5f,
-    0x9b,
-    0x32,
-    0x3f,
-    0x8d,
-    0x70,
-    0xd5,
-    0x28,
-    0x9a,
-    0x35,
-    0x04,
-    0x64,
-    0xcd,
-    0x22,
-    0xe4,
-    0x12,
-    0x1d,
-    0x68,
-    0xb2,
-    0x0a,
-    0x50,
-    0xc3,
-    0x06,
-    0x13,
-    0x60,
-    0x53,
-    0x59,
-    0x56,
-    0x22,
-    0xa8,
-    0xc5,
-    0x12,
-    0x29,
-    0x1c,
-    0x0d,
-    0x92,
-    0xe9,
-    0x65,
-    0xdd,
-    0x5c,
-    0x18,
-    0x6a,
-    0x53,
-    0xac,
-    0x5a,
-    0x56,
-    0xbd,
-    0x20,
-    0x1c,
-    0xeb,
-    0xa5,
-    0xb5,
-    0xc0,
-    0x1a,
-    0x0b,
-    0xf2,
-    0xfb,
-    0xd0,
-    0xf1,
-    0x63,
-    0x7c,
-    0x12,
-    0x1d,
-    0x49,
-    0xcf,
-    0x4c,
-    0x1a,
-    0x90,
-    0x80,
-    0xe6,
-    0x80,
-    0x01,
-    0x83,
-    0x19,
-    0x75,
-    0xb9,
-    0xd3,
-    0x01,
-    0x74,
-    0xda,
-    0x5a,
-    0xf3,
-    0x4d,
-    0x80,
-    0x11,
-    0x10,
-    0x6d,
-    0xf7,
-    0x68,
-    0x1a,
-    0x60,
-    0x2b,
-    0xe8,
-    0x87,
-    0x94,
-    0x5f,
-    0x17,
-    0xd4,
-    0x60,
-    0x22,
-    0x9c,
-    0x1c,
-    0x44,
-    0x7f,
-    0xa3,
-    0xe9,
-    0x73,
-    0x75,
-    0x83,
-    0x4a,
-    0x8e,
-    0xa7,
-    0x9e,
-    0x26,
-    0xb3,
-    0x53,
-    0x89,
-    0xcf,
-    0xb6,
-    0x88,
-    0x6e,
-    0xda,
-    0xae,
-    0x94,
-    0xae,
-    0x2f,
-    0xb4,
-    0xbc,
-    0xca,
-    0x5c,
-    0xe7,
-    0x31,
-    0x83,
-    0x2f,
-    0xb4,
-    0x3f,
-    0x40,
-    0x83,
-    0x54,
-    0xc6,
-    0xb1,
-    0x5a,
-    0x95,
-    0xee,
-    0xb2,
-    0x2c,
-    0xde,
-    0x17,
-    0x72,
-    0x7f,
-    0x6d,
-    0x0f,
-    0xd4,
-    0xb8,
-    0xe4,
-    0x88,
-    0x15,
-    0x31,
-    0x04,
-    0xc9,
-    0xb0,
-    0x8b,
-    0xb8,
-    0xa3,
-    0x7e,
-    0x46,
-    0x55,
-    0xa7,
-    0x22,
-    0x8e,
-    0x20,
-    0x96,
-    0xa4,
-    0x58,
-    0x11,
-    0x19,
-    0x5c,
-    0xae,
-    0xd6,
-    0xb2,
-    0x12,
-    0x47,
-    0x1b,
-    0xf3,
-    0x63,
-    0x5b,
-    0x09,
-    0xee,
-    0x66,
-    0xb5,
-    0x0c,
-    0xec,
-    0x90,
-    0x0a,
-    0xda,
-    0x62,
-    0xd5,
-    0x89,
-    0xb1,
-    0x20,
-    0x10,
-    0xb3,
-    0xdf,
-    0xcc,
-    0xa5,
-    0x6d,
-    0x88,
-    0x8f,
-    0x65,
-    0x54,
-    0xa4,
-    0x0e,
-    0xb2,
-    0x50,
-    0x47,
-    0x9c,
-    0xe3,
-    0x6c,
-    0x25,
-    0xad,
-    0xea,
-    0xe5,
-    0x55,
-    0x8e,
-    0x33,
-    0x80,
-    0x55,
-    0x54,
-    0xd0,
-    0x21,
-    0x4f,
-    0x13,
-    0xd4,
-    0x9a,
-    0x9a,
-    0x50,
-    0xfc,
-    0xc1,
-    0x84,
-    0xb8,
-    0x95,
-    0xc5,
-    0x4f,
-    0x12,
-    0x99,
-    0xc2,
-    0x79,
-    0x72,
-    0x1c,
-    0x92,
-    0x41,
-    0xaf,
-    0xe6,
-    0xe7,
-    0x66,
-    0x18,
-    0x62,
-    0x96,
-    0x32,
-    0x63,
-    0xb7,
-    0x36,
-    0xb7,
-    0xe6,
-    0x34,
-    0xea,
-    0x59,
-    0x0a,
-    0xf1,
-    0x7b,
-    0x8c,
-    0xfc,
-    0xb3,
-    0xaa,
-    0xdf,
-    0xa5,
-    0x11,
-    0xc4,
-    0x3a,
-    0xdd,
-    0xd5,
-    0x76,
-    0x63,
-    0xdb,
-    0xa5,
-    0xe3,
-    0xc7,
-    0xf0,
-    0xe3,
-    0xf4,
-    0x78,
-    0x76,
-    0xd1,
-    0xef,
-    0x72,
-    0x03,
-    0xf9,
-    0x4c,
-    0x22,
-    0xe2,
-    0xcc,
-    0xc4,
-    0x29,
-    0xc3,
-    0x89,
-    0xaa,
-    0x5d,
-    0xb1,
-    0x60,
-    0x7e,
-    0x10,
-    0x45,
-    0xd8,
-    0xc0,
-    0x96,
-    0x19,
-    0x6e,
-    0x02,
-    0x01,
-    0x80,
-    0x7e,
-    0x41,
-    0x2f,
-    0x74,
-    0x67,
-    0x75,
-    0x07,
-    0xd0,
-    0xeb,
-    0x67,
-    0xff,
-    0xc0,
-    0xd4,
-    0xc3,
-    0xe1,
-    0x75,
-    0xdd,
-    0x6e,
-    0xd0,
-    0x1d,
-    0xcf,
-    0x19,
-    0x86,
-    0x12,
-    0xeb,
-    0x17,
-    0xdf,
-    0x51,
-    0x88,
-    0x6b,
-    0x9b,
-    0x2f,
-    0xfd,
-    0x26,
-    0x5f,
-    0x47,
-    0xc1,
-    0xf0,
-    0xfe,
-    0xb7,
-    0xd1,
-    0xe4,
-    0xf7,
-    0x8c,
-    0x52,
-    0xa1,
-    0x3f,
-    0x7a,
-    0x78,
-    0x9d,
-    0x40,
-    0xd1,
-    0xa6,
-    0xbd,
-    0x21,
-    0xac,
-    0xd7,
-    0x23,
-    0x48,
-    0x6b,
-    0x3c,
-    0x48,
-    0x1d,
-    0x64,
-    0x26,
-    0x4a,
-    0x11,
-    0xd6,
-    0x27,
-    0x87,
-    0xe0,
-    0x1e,
-    0x74,
-    0x6a,
-    0x12,
-    0x2e,
-    0x8e,
-    0x85,
-    0xc8,
-    0x3a,
-    0x22,
-    0xe0,
-    0xb5,
-    0xb4,
-    0x2d,
-    0x91,
-    0x6b,
-    0x7b,
-    0x63,
-    0x8d,
-    0xd8,
-    0x50,
-    0xd2,
-    0xbe,
-    0x10,
-    0x89,
-    0xc3,
-    0x56,
-    0x4d,
-    0x09,
-    0xe1,
-    0x62,
-    0x33,
-    0x6f,
-    0x9d,
-    0xa2,
-    0x59,
-    0x8e,
-    0xd0,
-    0x98,
-    0x06,
-    0x1e,
-    0xa2,
-    0xdf,
-    0x38,
-    0xb0,
-    0xac,
-    0xbe,
-    0xeb,
-    0xe8,
-    0x59,
-    0xfd,
-    0x97,
-    0xe6,
-    0x92,
-    0xf7,
-    0xfb,
-    0x05,
-    0x9a,
-    0xf1,
-    0x19,
-    0xc8,
-    0x36,
-    0xaa,
-    0x82,
-    0x11,
-    0x12,
-    0x33,
-    0xd3,
-    0x94,
-    0x60,
-    0x01,
-    0x80,
-    0x8c,
-    0xc2,
-    0x41,
-    0xd0,
-    0xac,
-    0x6a,
-    0x6b,
-    0x29,
-    0x59,
-    0x7f,
-    0x1a,
-    0x8e,
-    0x16,
-    0xc3,
-    0x1b,
-    0x66,
-    0x40,
-    0x74,
-    0xc4,
-    0x7f,
-    0xfb,
-    0x70,
-    0x87,
-    0x52,
-    0x6c,
-    0x9c,
-    0xc7,
-    0x89,
-    0x29,
-    0x85,
-    0xe9,
-    0xbe,
-    0xed,
-    0x48,
-    0xaf,
-    0x86,
-    0x91,
-    0xb0,
-    0xc1,
-    0xae,
-    0x37,
-    0x9f,
-    0x8d,
-    0xc4,
-    0xc9,
-    0xaf,
-    0x51,
-    0xd9,
-    0xa2,
-    0x18,
-    0x76,
-    0x86,
-    0x8a,
-    0xd5,
-    0x20,
-    0x2d,
-    0xe8,
-    0x02,
-    0x03,
-    0x81,
-    0x33,
-    0x89,
-    0x78,
-    0x49,
-    0xaa,
-    0xfd,
-    0xd0,
-    0x61,
-    0x45,
-    0xc6,
-    0xe8,
-    0x01,
-    0xeb,
-    0x7f,
-    0xfd,
-    0x41,
-    0xe5,
-    0x9c,
-    0xc2,
-    0xdd,
-    0x93,
-    0x50,
-    0xb0,
-    0x36,
-    0x5d,
-    0xae,
-    0x9e,
-    0x9a,
-    0xed,
-    0x0e,
-    0x91,
-    0xc5,
-    0x9b,
-    0xb2,
-    0xd5,
-    0xa8,
-    0x29,
-    0xa9,
-    0x4d,
-    0x69,
-    0xb1,
-    0xf4,
-    0x07,
-    0xaa,
-    0xdb,
-    0xe8,
-    0x13,
-    0x0e,
-    0x53,
-    0xd3,
-    0x96,
-    0xf9,
-    0x7b,
-    0xe2,
-    0x1a,
-    0x98,
-    0x5d,
-    0x42,
-    0x28,
-    0x22,
-    0xe3,
-    0x86,
-    0x19,
-    0x5d,
-    0x4a,
-    0x49,
-    0x29,
-    0x63,
-    0xd4,
-    0x14,
-    0xcd,
-    0xa6,
-    0xbd,
-    0x82,
-    0x47,
-    0x32,
-    0x71,
-    0xa1,
-    0x77,
-    0x32,
-    0xfc,
-    0x9c,
-    0xf4,
-    0xb6,
-    0xc2,
-    0x97,
-    0x5b,
-    0xb3,
-    0x70,
-    0xdb,
-    0xe7,
-    0x4b,
-    0x32,
-    0x33,
-    0x42,
-    0x4f,
-    0x27,
-    0x95,
-    0x9b,
-    0x03,
-    0x12,
-    0x05,
-    0xf9,
-    0x21,
-    0x52,
-    0xb7,
-    0xcf,
-    0x20,
-    0x14,
-    0x74,
-    0xd0,
-    0xb5,
-    0xc7,
-    0x3e,
-    0x04,
-    0x9b,
-    0xd0,
-    0x37,
-    0x1c,
-    0x90,
-    0x7f,
-    0xbf,
-    0x03,
-    0xa0,
-    0x42,
-    0xdd,
-    0xb5,
-    0xa5,
-    0x19,
-    0xe0,
-    0x54,
-    0x0f,
-    0x4a,
-    0x46,
-    0x79,
-    0xe1,
-    0x56,
-    0xdc,
-    0xc8,
-    0xfc,
-    0x2b,
-    0x27,
-    0xc7,
-    0xa0,
-    0x9b,
-    0x03,
-    0xf0,
-    0x30,
-    0x0d,
-    0x8a,
-    0x04,
-    0x35,
-    0x73,
-    0x37,
-    0xa3,
-    0xa6,
-    0x7c,
-    0x4b,
-    0x1a,
-    0x67,
-    0x0a,
-    0x70,
-    0x7c,
-    0x0f,
-    0xe6,
-    0x9d,
-    0xf4,
-    0xee,
-    0xb3,
-    0x39,
-    0x59,
-    0x4f,
-    0x20,
-    0x83,
-    0x03,
-    0xfa,
-    0x62,
-    0x31,
-    0xdd,
-    0xfd,
-    0xe2,
-    0x57,
-    0xbc,
-    0xac,
-    0x32,
-    0x8b,
-    0xef,
-    0xe7,
-    0x46,
-    0x47,
-    0x18,
-    0x9b,
-    0xe1,
-    0x8f,
-    0x3a,
-    0x8b,
-    0x4d,
-    0xd3,
-    0x12,
-    0x51,
-    0x4f,
-    0x16,
-    0xab,
-    0x9f,
-    0x5a,
-    0x50,
-    0x2d,
-    0xcb,
-    0x03,
-    0x11,
-    0xf5,
-    0x8b,
-    0xb5,
-    0x68,
-    0xeb,
-    0xfd,
-    0xa6,
-    0x03,
-    0x10,
-    0xea,
-    0x09,
-    0x97,
-    0x57,
-    0x4b,
-    0x86,
-    0x83,
-    0xb6,
-    0x0c,
-    0xe7,
-    0xb0,
-    0x7c,
-    0x11,
-    0x14,
-    0xbb,
-    0xe5,
-    0x77,
-    0x41,
-    0x56,
-    0xec,
-    0x1c,
-    0x66,
-    0xeb,
-    0x60,
-    0x61,
-    0xef,
-    0x83,
-    0x3a,
-    0x2e,
-    0xb5,
-    0xe7,
-    0x2e,
-    0x37,
-    0x2e,
-    0x04,
-    0x80,
-    0x7e,
-    0xe0,
-    0x94,
-    0x19,
-    0x19,
-    0x1c,
-    0xfb,
-    0xda,
-    0x36,
-    0xe8,
-    0x6f,
-    0x30,
-    0x5c,
-    0x3d,
-    0x5c,
-    0xe9,
-    0xf4,
-    0x73,
-    0x07,
-    0x46,
-    0x07,
-    0xf9,
-    0x71,
-    0x51,
-    0x49,
-    0x49,
-    0x7e,
-    0x70,
-    0x57,
-    0x1b,
-    0x56,
-    0x3b,
-    0x3d,
-    0xd9,
-    0x0c,
-    0x8b,
-    0x3b,
-    0x54,
-    0x7e,
-    0xd3,
-    0xc9,
-    0xb5,
-    0x7c,
-    0xb4,
-    0xd8,
-    0xb6,
-    0x2c,
-    0xcb,
-    0x5b,
-    0x12,
-    0xac,
-    0xce,
-    0x06,
-    0x39,
-    0xfa,
-    0xd7,
-    0x55,
-    0x49,
-    0x11,
-    0xff,
-    0xd1,
-    0x3a,
-    0x55,
-    0x2f,
-    0x8f,
-    0x58,
-    0x31,
-    0x33,
-    0xf9,
-    0xf7,
-    0xff,
-    0x10,
-    0xd0,
-    0x62,
-    0x28,
-    0x98,
-    0x72,
-    0x14,
-    0x8c,
-    0x3b,
-    0x59,
-    0x2b,
-    0x24,
-    0x20,
-    0xe5,
-    0x19,
-    0xe5,
-    0x75,
-    0x5b,
-    0x9d,
-    0xe8,
-    0x03,
-    0x2d,
-    0xf2,
-    0xc9,
-    0x05,
-    0x7c,
-    0x46,
-    0x4d,
-    0x3a,
-    0xdb,
-    0x6d,
-    0x47,
-    0x39,
-    0x56,
-    0xd7,
-    0xbc,
-    0x05,
-    0xb3,
-    0xbf,
-    0x45,
-    0xe1,
-    0xf7,
-    0xa6,
-    0xb5,
-    0x65,
-    0x2c,
-    0x00,
-    0xfc,
-    0xd2,
-    0x62,
-    0x2d,
-    0x4b,
-    0xa3,
-    0xf4,
-    0xaa,
-    0x79,
-    0x64,
-    0x0c,
-    0x89,
-    0xa6,
-    0xc7,
-    0x69,
-    0x1e,
-    0x1e,
-    0xf5,
-    0x60,
-    0xfc,
-    0x7f,
-    0x22,
-    0x21,
-    0x20,
-    0x1f,
-    0x64,
-    0x3c,
-    0x6b,
-    0xa8,
-    0xc5,
-    0x64,
-    0x56,
-    0x05,
-    0x97,
-    0x72,
-    0xe1,
-    0x82,
-    0x07,
-    0xad,
-    0xcc,
-    0x2e,
-    0xf5,
-    0x48,
-    0x0a,
-    0x84,
-    0x03,
-    0x2c,
-    0x73,
-    0x4b,
-    0xec,
-    0xf8,
-    0xb9,
-    0xbb,
-    0x18,
-    0x46,
-    0x9d,
-    0xe1,
-    0x6d,
-    0x31,
-    0x62,
-    0x45,
-    0x67,
-    0x14,
-    0x82,
-    0xc9,
-    0x6b,
-    0x93,
-    0xa1,
-    0xd4,
-    0x58,
-    0xe0,
-    0xbf,
-    0xb0,
-    0x60,
-    0x37,
-    0xb1,
-    0x31,
-    0x16,
-    0xab,
-    0xd2,
-    0x98,
-    0xc7,
-    0x25,
-    0xf6,
-    0xb6,
-    0x0e,
-    0xaa,
-    0x9f,
-    0x55,
-    0xa3,
-    0xdc,
-    0x74,
-    0xd3,
-    0x74,
-    0xc4,
-    0xee,
-    0x10,
-    0xf7,
-    0xce,
-    0x55,
-    0x8b,
-    0xbe,
-    0x15,
-    0xeb,
-    0xc7,
-    0x4c,
-    0xe1,
-    0x67,
-    0xf4,
-    0x27,
-    0x6e,
-    0xa4,
-    0xcb,
-    0x2e,
-    0xf0,
-    0x9b,
-    0xba,
-    0x2d,
-    0xd3,
-    0x8f,
-    0x41,
-    0xaf,
-    0x47,
-    0x87,
-    0x9c,
-    0x13,
-    0xfc,
-    0x01,
-    0xa2,
-    0xe2,
-    0x2a,
-    0xe5,
-    0xed,
-    0x60,
-    0xd5,
-    0xb8,
-    0x3b,
-    0x61,
-    0x4f,
-    0x12,
-    0x14,
-    0x5e,
-    0xfe,
-    0x52,
-    0xad,
-    0xc8,
-    0x5f,
-    0x90,
-    0x0d,
-    0x9c,
-    0x4b,
-    0xd3,
-    0x6e,
-    0x38,
-    0x7a,
-    0x84,
-    0xe6,
-    0x6d,
-    0x45,
-    0x23,
-    0x46,
-    0xd5,
-    0xb0,
-    0x39,
-    0x43,
-    0x67,
-    0xa7,
-    0x8e,
-    0xd3,
-    0x48,
-    0x88,
-    0x9b,
-    0xda,
-    0xe4,
-    0xe2,
-    0x42,
-    0x06,
-    0x3e,
-    0x7d,
-    0xbd,
-    0xf7,
-    0x84,
-    0x9a,
-    0xd5,
-    0xa4,
-    0xe7,
-    0x7b,
-    0x54,
-    0xfa,
-    0xaa,
-    0x26,
-    0xbc,
-    0xc6,
-    0x78,
-    0x67,
-    0x39,
-    0xd4,
-    0xfa,
-    0x14,
-    0xd5,
-    0x58,
-    0xa9,
-    0x94,
-    0xeb,
-    0x8e,
-    0xe1,
-    0xa2,
-    0xde,
-    0x9e,
-    0x37,
-    0x4f,
-    0x0a,
-    0xc2,
-    0x0d,
-    0x46,
-    0xfb,
-    0xaa,
-    0x64,
-    0x54,
-    0xdd,
-    0x20,
-    0xf1,
-    0x28,
-    0x34,
-    0xe8,
-    0x72,
-    0x57,
-    0xce,
-    0xea,
-    0x42,
-    0xa3,
-    0xf5,
-    0x93,
-    0x2b,
-    0x7c,
-    0xe9,
-    0x78,
-    0x7c,
-    0xc7,
-    0x8d,
-    0x3c,
-    0x5c,
-    0xdf,
-    0x60,
-    0xb4,
-    0x5e,
-    0xd9,
-    0xaf,
-    0x4a,
-    0x56,
-    0x0d,
-    0x09,
-    0x9f,
-    0x6a,
-    0xd1,
-    0xf4,
-    0x75,
-    0x6c,
-    0x88,
-    0xde,
-    0xcb,
-    0x67,
-    0xdc,
-    0x56,
-    0x49,
-    0x77,
-    0x47,
-    0x7c,
-    0xdf,
-    0xde,
-    0xd8,
-    0xb6,
-    0xaa,
-    0x55,
-    0x34,
-    0xa5,
-    0x17,
-    0xa0,
-    0xdb,
-    0x58,
-    0x4a,
-    0x65,
-    0xac,
-    0xbf,
-    0xc1,
-    0x3e,
-    0xac,
-    0x62,
-    0x34,
-    0x0d,
-    0x03,
-    0x52,
-    0xc0,
-    0x90,
-    0x47,
-    0x60,
-    0x45,
-    0x35,
-    0xfd,
-    0x8e,
-    0x0d,
-    0x2f,
-    0x5d,
-    0xc3,
-    0xae,
-    0xc9,
-    0x56,
-    0xc3,
-    0x31,
-    0xfa,
-    0xd2,
-    0x5d,
-    0x73,
-    0x3a,
-    0x3b,
-    0xe7,
-    0xcc,
-    0x95,
-    0x3e,
-    0xe7,
-    0xef,
-    0xfe,
-    0xcf,
-    0x13,
-    0x11,
-    0xe5,
-    0x6d,
-    0x7c,
-    0x4e,
-    0x0c,
-    0xa7,
-    0x06,
-    0x48,
-    0x96,
-    0xdf,
-    0x1b,
-    0x11,
-    0x61,
-    0x4e,
-    0xa0,
-    0x4b,
-    0x95,
-    0x48,
-    0x28,
-    0x8d,
-    0x7d,
-    0xc1,
-    0x68,
-    0x09,
-    0x96,
-    0x11,
-    0xec,
-    0x6c,
-    0xe6,
-    0xf4,
-    0x08,
-    0x06,
-    0x8f,
-    0xd5,
-    0x10,
-    0x2b,
-    0xa4,
-    0x4c,
-    0xcb,
-    0xd9,
-    0x3b,
-    0xe5,
-    0x26,
-    0x9a,
-    0xc4,
-    0x23,
-    0x26,
-    0xac,
-    0x99,
-    0xc4,
-    0x20,
-    0x60,
-    0xd6,
-    0x47,
-    0x2c,
-    0xc0,
-    0x6a,
-    0xac,
-    0xd7,
-    0x74,
-    0x6e,
-    0x7b,
-    0x18,
-    0xe7,
-    0xb6,
-    0x07,
-    0x86,
-    0xa5,
-    0xa6,
-    0xf4,
-    0xc7,
-    0x08,
-    0x47,
-    0xf7,
-    0x4c,
-    0x13,
-    0x9a,
-    0xdd,
-    0x3b,
-    0x9e,
-    0x2d,
-    0xcf,
-    0xad,
-    0xb3,
-    0xeb,
-    0xd4,
-    0x1a,
-    0x39,
-    0x38,
-    0x97,
-    0x11,
-    0xcf,
-    0x3e,
-    0x6b,
-    0x2d,
-    0xfb,
-    0x81,
-    0x8c,
-    0x44,
-    0x84,
-    0xba,
-    0xa7,
-    0xe1,
-    0x1c,
-    0xe2,
-    0x9d,
-    0xf5,
-    0x42,
-    0x8d,
-    0x85,
-    0xc9,
-    0x67,
-    0x79,
-    0xf0,
-    0x37,
-    0x50,
-    0x67,
-    0x70,
-    0x1a,
-    0xbb,
-    0x29,
-    0x5b,
-    0x03,
-    0x45,
-    0xfd,
-    0xcc,
-    0x2e,
-    0x8b,
-    0x19,
-    0xeb,
-    0xb4,
-    0x90,
-    0x87,
-    0x6e,
-    0x01,
-    0x5f,
-    0x33,
-    0x60,
-    0x89,
-    0xf1,
-    0x43,
-    0x21,
-    0xb7,
-    0x50,
-    0xa6,
-    0xaf,
-    0x26,
-    0xfd,
-    0xf0,
-    0x23,
-    0x14,
-    0x8f,
-    0x65,
-    0x7f,
-    0x14,
-    0x9e,
-    0x53,
-    0xa6,
-    0x02,
-    0xdf,
-    0xa6,
-    0xac,
-    0x3c,
-    0x90,
-    0xb6,
-    0x50,
-    0x0f,
-    0x17,
-    0x63,
-    0xc7,
-    0x70,
-    0xe6,
-    0x64,
-    0xbc,
-    0xed,
-    0xa1,
-    0xdc,
-    0x94,
-    0xe3,
-    0x83,
-    0x2e,
-    0xf6,
-    0xf0,
-    0xfe,
-    0x13,
-    0x8b,
-    0xab,
-    0xa1,
-    0xea,
-    0x02,
-    0x93,
-    0x3f,
-    0x4f,
-    0x58,
-    0x46,
-    0x4e,
-    0xee,
-    0x56,
-    0xf4,
-    0x8d,
-    0x99,
-    0x5b,
-    0x12,
-    0xea,
-    0x99,
-    0x5b,
-    0x53,
-    0xa2,
-    0x42,
-    0x28,
-    0xd4,
-    0xaa,
-    0xcb,
-    0xf0,
-    0x96,
-    0x4e,
-    0x5c,
-    0x07,
-    0x32,
-    0x18,
-    0x67,
-    0xe7,
-    0xc8,
-    0xf3,
-    0x3c,
-    0x76,
-    0x39,
-    0x90,
-    0xd8,
-    0x87,
-    0x96,
-    0x09,
-    0xfe,
-    0xa2,
-    0xd8,
-    0xc4,
-    0x8a,
-    0x08,
-    0xd1,
-    0x9b,
-    0x01,
-    0xf2,
-    0x62,
-    0x39,
-    0x6c,
-    0x1a,
-    0xef,
-    0xc7,
-    0x67,
-    0x7c,
-    0x10,
-    0xc9,
-    0x75,
-    0x5e,
-    0x89,
-    0x42,
-    0x96,
-    0x8e,
-    0x7d,
-    0x1f,
-    0x1c,
-    0xeb,
-    0xde,
-    0xd2,
-    0xba,
-    0x26,
-    0x28,
-    0x3e,
-    0xde,
-    0xca,
-    0x4f,
-    0xd3,
-    0x40,
-    0x7a,
-    0xf5,
-    0xfa,
-    0xbb,
-    0x7a,
-    0xe1,
-    0xb3,
-    0x5d,
-    0x72,
-    0xad,
-    0x7c,
-    0xba,
-    0x6e,
-    0xbe,
-    0x76,
-    0x85,
-    0x28,
-    0x7a,
-    0xc3,
-    0x61,
-    0x8a,
-    0xb4,
-    0x32,
-    0xf4,
-    0x6f,
-    0x6b,
-    0x1e,
-    0x3d,
-    0xaa,
-    0xb5,
-    0x93,
-    0x28,
-    0x49,
-    0xf6,
-    0xb3,
-    0x60,
-    0x1b,
-    0x55,
-    0x58,
-    0x65,
-    0x6f,
-    0x71,
-    0xfb,
-    0xde,
-    0x1f,
-    0x4f,
-    0xd5,
-    0x30,
-    0xcd,
-    0x98,
-    0x43,
-    0x4f,
-    0x6d,
-    0x01,
-    0x6f,
-    0xd5,
-    0x03,
-    0x0a,
-    0x2d,
-    0x51,
-    0xae,
-    0xeb,
-    0x23,
-    0xe1,
-    0xe6,
-    0xcb,
-    0x2d,
-    0x03,
-    0x02,
-    0x34,
-    0x00,
-    0xa8,
-    0xfd,
-    0xc4,
-    0x0d,
-    0x8a,
-    0x79,
-    0x25,
-    0xa8,
-    0xc0,
-    0x04,
-    0x3f,
-    0x69,
-    0x8f,
-    0x9b,
-    0xab,
-    0xd2,
-    0x84,
-    0x6c,
-    0x6b,
-    0x33,
-    0xbf,
-    0xe0,
-    0xd9,
-    0xcb,
-    0x92,
-    0xd9,
-    0xde,
-    0x30,
-    0x4b,
-    0x39,
-    0x64,
-    0xf1,
-    0x4d,
-    0xa3,
-    0x0e,
-    0x79,
-    0x66,
-    0x85,
-    0x26,
-    0x36,
-    0x5c,
-    0x56,
-    0xd7,
-    0xfb,
-    0xc9,
-    0x1c,
-    0x9c,
-    0xa3,
-    0x29,
-    0x32,
-    0xf8,
-    0xf8,
-    0x32,
-    0x48,
-    0x68,
-    0xd3,
-    0x64,
-    0xab,
-    0x96,
-    0x84,
-    0xe0,
-    0xc7,
-    0xcf,
-    0x73,
-    0x7d,
-    0xea,
-    0xb7,
-    0x08,
-    0x19,
-    0x4a,
-    0x3b,
-    0xc9,
-    0x2d,
-    0x4a,
-    0xc8,
-    0xc2,
-    0xa4,
-    0xf9,
-    0xba,
-    0x2a,
-    0xee,
-    0xdb,
-    0x18,
-    0x43,
-    0x50,
-    0xed,
-    0x7e,
-    0x82,
-    0x7e,
-    0xe3,
-    0x5a,
-    0xf0,
-    0x6b,
-    0xb4,
-    0x5b,
-    0xd0,
-    0x60,
-    0x58,
-    0x27,
-    0x82,
-    0x4c,
-    0xd0,
-    0x4d,
-    0xa7,
-    0x5b,
-    0x68,
-    0x7a,
-    0x86,
-    0xc9,
-    0x39,
-    0xef,
-    0xaf,
-    0xf9,
-    0xf1,
-    0x32,
-    0xdd,
-    0xc1,
-    0xd7,
-    0x04,
-    0x21,
-    0x08,
-    0x09,
-    0x94,
-    0x3d,
-    0x94,
-    0x08,
-    0xf2,
-    0x4e,
-    0x1d,
-    0x77,
-    0xc6,
-    0xaf,
-    0xa6,
-    0x20,
-    0x42,
-    0x19,
-    0x0d,
-    0x38,
-    0x55,
-    0x0f,
-    0xe0,
-    0xe4,
-    0x22,
-    0x79,
-    0x72,
-    0xfc,
-    0xb0,
-    0x8f,
-    0x2e,
-    0x0e,
-    0xe3,
-    0xf8,
-    0x2c,
-    0xa6,
-    0xab,
-    0x33,
-    0x02,
-    0xcc,
-    0x7b,
-    0x37,
-    0xdd,
-    0xcf,
-    0xfd,
-    0x56,
-    0xd0,
-    0x41,
-    0x04,
-    0x67,
-    0x6b,
-    0x43,
-    0xc2,
-    0x24,
-    0x90,
-    0x03,
-    0x3b,
-    0xd1,
-    0x82,
-    0x82,
-    0xf9,
-    0x1f,
-    0x3f,
-    0x9b,
-    0x01,
-    0x4f,
-    0x10,
-    0x41,
-    0x07,
-    0x9a,
-    0x5e,
-    0x08,
-    0xde,
-    0xd1,
-    0xc7,
-    0xe6,
-    0x32,
-    0x41,
-    0x71,
-    0x3b,
-    0x79,
-    0xd9,
-    0x9e,
-    0x10,
-    0x27,
-    0x8f,
-    0x81,
-    0x9c,
-    0x21,
-    0xff,
-    0x51,
-    0x0d,
-    0x75,
-    0x55,
-    0x9b,
-    0x85,
-    0x48,
-    0x6e,
-    0xdc,
-    0x62,
-    0x10,
-    0x3a,
-    0x4f,
-    0xc2,
-    0x03,
-    0x65,
-    0x04,
-    0x46,
-    0xce,
-    0x36,
-    0x32,
-    0x17,
-    0x8b,
-    0xb7,
-    0xce,
-    0x27,
-    0xed,
-    0x16,
-    0x5c,
-    0xba,
-    0xbe,
-    0x4b,
-    0x06,
-    0x24,
-    0x8c,
-    0xfb,
-    0xeb,
-    0xd4,
-    0x9f,
-    0x9c,
-    0xb9,
-    0x91,
-    0x2e,
-    0xdb,
-    0x7e,
-    0x04,
-    0xd2,
-    0x3a,
-    0xbb,
-    0x77,
-    0x3a,
-    0xfe,
-    0xbb,
-    0xdc,
-    0x21,
-    0x48,
-    0x22,
-    0x11,
-    0x7d,
-    0x82,
-    0xc9,
-    0x62,
-    0xf9,
-    0xfc,
-    0xc9,
-    0x50,
-    0xa6,
-    0xd7,
-    0xd6,
-    0x90,
-    0xed,
-    0x23,
-    0xcf,
-    0x57,
-    0xc9,
-    0x44,
-    0x92,
-    0xd5,
-    0x33,
-    0x9a,
-    0x15,
-    0xff,
-    0xdd,
-    0x61,
-    0xb3,
-    0x92,
-    0x22,
-    0xd5,
-    0xc3,
-    0x55,
-    0x3d,
-    0x9a,
-    0x6f,
-    0x9e,
-    0xba,
-    0x5c,
-    0xc4,
-    0x17,
-    0x2b,
-    0xb3,
-    0x05,
-    0xc2,
-    0x1c,
-    0x49,
-    0x45,
-    0x3b,
-    0x49,
-    0x3e,
-    0x34,
-    0x3e,
-    0x0e,
-    0xcb,
-    0x3a,
-    0x68,
-    0x1e,
-    0x26,
-    0xc2,
-    0x42,
-    0x78,
-    0xa6,
-    0xd9,
-    0x7b,
-    0x97,
-    0x28,
-    0xf7,
-    0x75,
-    0xe9,
-    0xb1,
-    0x1c,
-    0x04,
-    0x83,
-    0x55,
-    0x1f,
-    0x72,
-    0x13,
-    0x57,
-    0x43,
-    0xc6,
-    0x16,
-    0x91,
-    0x0c,
-    0x45,
-    0x4b,
-    0x16,
-    0x51,
-    0x3a,
-    0x67,
-    0x17,
-    0x91,
-    0xf3,
-    0x0a,
-    0x03,
-    0x8b,
-    0x0c,
-    0xf2,
-    0xf2,
-    0x08,
-    0xf0,
-    0x6f,
-    0x44,
-    0xfc,
-    0x9c,
-    0x16,
-    0x85,
-    0xcd,
-    0xa6,
-    0xba,
-    0x94,
-    0xf3,
-    0x7e,
-    0x98,
-    0x05,
-    0xc1,
-    0xf5,
-    0xd2,
-    0xc3,
-    0x82,
-    0xfb,
-    0x1f,
-    0xfa,
-    0xc8,
-    0xad,
-    0xc0,
-    0x34,
-    0x01,
-    0x8f,
-    0xb6,
-    0xc2,
-    0x4b,
-    0x15,
-    0x32,
-    0x5d,
-    0x8a,
-    0x69,
-    0x4d,
-    0x0d,
-    0xb7,
-    0x68,
-    0xf9,
-    0x4a,
-    0x7b,
-    0xed,
-    0x37,
-    0x61,
-    0xfc,
-    0x53,
-    0x8b,
-    0x1a,
-    0xf7,
-    0x35,
-    0xad,
-    0x98,
-    0x0f,
-    0x78,
-    0x82,
-    0x80,
-    0x64,
-    0x8c,
-    0x4a,
-    0x5e,
-    0x68,
-    0xee,
-    0x1b,
-    0x44,
-    0xee,
-    0xf2,
-    0x8e,
-    0xb4,
-    0x84,
-    0xbf,
-    0xb8,
-    0xbf,
-    0x03,
-    0x9b,
-    0x5c,
-    0x6f,
-    0x64,
-    0x69,
-    0x5e,
-    0x63,
-    0xd5
-  ],
-  const [
-    0x5e,
-    0xdb,
-    0x47,
-    0xd0,
-    0x7e,
-    0x85,
-    0x6a,
-    0x3d,
-    0xee,
-    0x51,
-    0xf6,
-    0x0a,
-    0x72,
-    0x3f,
-    0xf8,
-    0xde,
-    0xa7,
-    0xcd,
-    0x06,
-    0xc7,
-    0xf2,
-    0x1c,
-    0xd3,
-    0x7f,
-    0xb6,
-    0x4e,
-    0x00,
-    0xee,
-    0xca,
-    0x32,
-    0x34,
-    0xef,
-    0x2a,
-    0x23,
-    0x6e,
-    0x57,
-    0xec,
-    0x2d,
-    0x9a,
-    0x34,
-    0x76,
-    0x72,
-    0x63,
-    0x52,
-    0xef,
-    0xcc,
-    0x49,
-    0x04,
-    0xf3,
-    0xb4,
-    0xf3,
-    0x20,
-    0x8b,
-    0x63,
-    0xc6,
-    0x4c,
-    0x5c,
-    0x36,
-    0xb6,
-    0x78,
-    0x1e,
-    0x57,
-    0x5c,
-    0xac,
-    0x50,
-    0x9a,
-    0x49,
-    0x04,
-    0x2a,
-    0xa5,
-    0x9b,
-    0xf9,
-    0xd4,
-    0x54,
-    0xce,
-    0xe1,
-    0xd5,
-    0x5c,
-    0xd4,
-    0xb9,
-    0xce,
-    0x2e,
-    0x67,
-    0x23,
-    0x68,
-    0x1e,
-    0x9e,
-    0xab,
-    0x8b,
-    0xc4,
-    0xbe,
-    0x4e,
-    0xd1,
-    0xa2,
-    0x53,
-    0x3d,
-    0x3a,
-    0x08,
-    0x80,
-    0xde,
-    0x21,
-    0x35,
-    0x94,
-    0x14,
-    0x6e,
-    0xbf,
-    0xdd,
-    0xc0,
-    0x0e,
-    0x35,
-    0xc1,
-    0x88,
-    0xa0,
-    0x02,
-    0x0a,
-    0xd7,
-    0x71,
-    0x94,
-    0x82,
-    0x24,
-    0xab,
-    0xbe,
-    0xc0,
-    0x78,
-    0xc9,
-    0x5b,
-    0x41,
-    0x2a,
-    0x4e,
-    0x35,
-    0xbb,
-    0xed,
-    0xb7,
-    0x25,
-    0xad,
-    0x0e,
-    0xae,
-    0x7b,
-    0x3b,
-    0xf6,
-    0x80,
-    0x9f,
-    0x39,
-    0xf6,
-    0xd1,
-    0xf9,
-    0x86,
-    0x44,
-    0x8f,
-    0x0f,
-    0x9b,
-    0x40,
-    0x24,
-    0xed,
-    0x63,
-    0xfc,
-    0xf0,
-    0xca,
-    0x4e,
-    0xfc,
-    0xf6,
-    0xe8,
-    0xa1,
-    0x3a,
-    0xd5,
-    0xbc,
-    0x10,
-    0x6d,
-    0xfb,
-    0x4f,
-    0x8e,
-    0x8b,
-    0x15,
-    0xe4,
-    0x64,
-    0x8d,
-    0xc9,
-    0xdb,
-    0x80,
-    0x72,
-    0xa8,
-    0xd5,
-    0x10,
-    0x86,
-    0x5e,
-    0x19,
-    0x50,
-    0xe4,
-    0x2c,
-    0x37,
-    0xa0,
-    0x3a,
-    0x99,
-    0xeb,
-    0xda,
-    0xcc,
-    0x64,
-    0x43,
-    0xe2,
-    0xbc,
-    0xbc,
-    0x04,
-    0x7f,
-    0x88,
-    0xb3,
-    0x4b,
-    0x69,
-    0xd4,
-    0xf1,
-    0x70,
-    0xa3,
-    0x6a,
-    0xa5,
-    0x2f,
-    0x0a,
-    0x7f,
-    0xc2,
-    0x0a,
-    0x2f,
-    0x38,
-    0x67,
-    0xe9,
-    0x62,
-    0x6c,
-    0x9e,
-    0x04,
-    0x0f,
-    0xac,
-    0x4a,
-    0x02,
-    0x4e,
-    0x80,
-    0x5b,
-    0x62,
-    0xb5,
-    0xf4,
-    0x44,
-    0x1b,
-    0x70,
-    0x53,
-    0xaf,
-    0x7f,
-    0x94,
-    0x33,
-    0x6f,
-    0x65,
-    0xb1,
-    0xb1,
-    0xb6,
-    0x87,
-    0xa7,
-    0xfe,
-    0x88,
-    0x29,
-    0xba,
-    0x1b,
-    0x6f,
-    0xfc,
-    0xe8,
-    0xe0,
-    0x71,
-    0x41,
-    0x79,
-    0x43,
-    0x3f,
-    0x31,
-    0xd9,
-    0xd7,
-    0xaf,
-    0x9d,
-    0xa3,
-    0x93,
-    0x6c,
-    0xd2,
-    0xfe,
-    0xd5,
-    0xec,
-    0xbf,
-    0x2c,
-    0xa6,
-    0xa3,
-    0x5a,
-    0x60,
-    0x40,
-    0x77,
-    0x3f,
-    0xd0,
-    0xce,
-    0x73,
-    0x9a,
-    0x0c,
-    0x72,
-    0xbf,
-    0x48,
-    0x8e,
-    0x8c,
-    0xd0,
-    0x39,
-    0x92,
-    0x3a,
-    0xdc,
-    0x19,
-    0x28,
-    0x1b,
-    0x91,
-    0x2f,
-    0x87,
-    0x59,
-    0x06,
-    0x85,
-    0xa4,
-    0xe6,
-    0xf2,
-    0x49,
-    0x03,
-    0x05,
-    0x1c,
-    0x73,
-    0xcd,
-    0x0d,
-    0x12,
-    0xa8,
-    0x24,
-    0x69,
-    0x1e,
-    0x5e,
-    0xb3,
-    0xe4,
-    0x76,
-    0x42,
-    0x89,
-    0x24,
-    0xb3,
-    0xd6,
-    0x27,
-    0x73,
-    0x84,
-    0x5f,
-    0xd7,
-    0xc6,
-    0xa4,
-    0xfe,
-    0x40,
-    0xf7,
-    0x09,
-    0x1d,
-    0x38,
-    0x56,
-    0x5f,
-    0x0c,
-    0xd9,
-    0x60,
-    0xb4,
-    0xec,
-    0xd7,
-    0xce,
-    0x75,
-    0xcd,
-    0x10,
-    0xd2,
-    0x99,
-    0x13,
-    0x65,
-    0x9d,
-    0x1c,
-    0x1e,
-    0xc9,
-    0x24,
-    0xaf,
-    0x2a,
-    0x97,
-    0x24,
-    0xae,
-    0x73,
-    0x29,
-    0x63,
-    0x52,
-    0x9d,
-    0xa6,
-    0x3a,
-    0x28,
-    0x54,
-    0x1b,
-    0x50,
-    0xc1,
-    0x30,
-    0xce,
-    0xa8,
-    0xab,
-    0xdb,
-    0xcf,
-    0xde,
-    0xa1,
-    0x75,
-    0xcf,
-    0xad,
-    0xff,
-    0x37,
-    0x35,
-    0xb5,
-    0x79,
-    0x57,
-    0x6f,
-    0x7b,
-    0x0b,
-    0x2c,
-    0x86,
-    0xb2,
-    0x33,
-    0x93,
-    0xf6,
-    0xb9,
-    0x5f,
-    0x91,
-    0xbc,
-    0x64,
-    0xa1,
-    0x3a,
-    0xb0,
-    0xff,
-    0xaa,
-    0xd1,
-    0x15,
-    0x90,
-    0xf6,
-    0x30,
-    0x6f,
-    0x5d,
-    0x44,
-    0x6a,
-    0x94,
-    0xae,
-    0x49,
-    0xb0,
-    0x06,
-    0xd4,
-    0xa5,
-    0x71,
-    0x80,
-    0x6a,
-    0x16,
-    0xc5,
-    0xcf,
-    0xdb,
-    0xec,
-    0x0c,
-    0xe3,
-    0x25,
-    0xbd,
-    0xd2,
-    0x26,
-    0xdc,
-    0x59,
-    0xf7,
-    0x0d,
-    0x71,
-    0x00,
-    0x0c,
-    0xec,
-    0xb4,
-    0xd3,
-    0xff,
-    0x0e,
-    0x98,
-    0x89,
-    0xfb,
-    0x05,
-    0x36,
-    0x63,
-    0x8a,
-    0x3f,
-    0x15,
-    0x62,
-    0xfd,
-    0xda,
-    0xa9,
-    0xb7,
-    0x0d,
-    0xb9,
-    0x19,
-    0x7b,
-    0xc2,
-    0xd8,
-    0x46,
-    0xa0,
-    0x94,
-    0xdc,
-    0x08,
-    0x28,
-    0xd1,
-    0xef,
-    0xba,
-    0x94,
-    0x3e,
-    0xca,
-    0xfa,
-    0xa0,
-    0x01,
-    0x13,
-    0xaa,
-    0x2d,
-    0xbe,
-    0xea,
-    0x3a,
-    0x7f,
-    0x01,
-    0xbf,
-    0x2a,
-    0xa8,
-    0xdc,
-    0x66,
-    0xca,
-    0x44,
-    0xd1,
-    0x6d,
-    0x45,
-    0x67,
-    0xf1,
-    0xad,
-    0xdd,
-    0xd4,
-    0x46,
-    0x1f,
-    0x78,
-    0x70,
-    0x6f,
-    0xf1,
-    0x5c,
-    0xf6,
-    0x8a,
-    0xd9,
-    0x37,
-    0xeb,
-    0x57,
-    0xaa,
-    0x62,
-    0xd5,
-    0x99,
-    0x25,
-    0x66,
-    0xa8,
-    0xc0,
-    0x11,
-    0xc0,
-    0x81,
-    0xc6,
-    0x8e,
-    0xe1,
-    0x96,
-    0x57,
-    0xa6,
-    0x79,
-    0x6d,
-    0x34,
-    0x25,
-    0xf5,
-    0x4d,
-    0xd9,
-    0xaa,
-    0x46,
-    0xf3,
-    0x5e,
-    0xff,
-    0xe5,
-    0x85,
-    0x9b,
-    0xa6,
-    0x14,
-    0xcc,
-    0x8f,
-    0xb4,
-    0x66,
-    0x9d,
-    0x03,
-    0xe3,
-    0x81,
-    0x98,
-    0x6a,
-    0xe2,
-    0x23,
-    0x16,
-    0x0c,
-    0xef,
-    0x63,
-    0x5c,
-    0x63,
-    0xa8,
-    0x3a,
-    0x15,
-    0xc5,
-    0x1e,
-    0x41,
-    0xff,
-    0x44,
-    0x2c,
-    0xbc,
-    0xe4,
-    0xd3,
-    0x07,
-    0xd8,
-    0xcc,
-    0xaa,
-    0x15,
-    0x31,
-    0x71,
-    0xeb,
-    0x03,
-    0x97,
-    0xf3,
-    0x85,
-    0x12,
-    0x12,
-    0xcd,
-    0x58,
-    0xb1,
-    0x23,
-    0x08,
-    0x9b,
-    0x51,
-    0x4d,
-    0xae,
-    0x7b,
-    0x75,
-    0xd4,
-    0x82,
-    0x05,
-    0x08,
-    0xc5,
-    0xee,
-    0x46,
-    0xf4,
-    0x36,
-    0x3d,
-    0xb1,
-    0xf0,
-    0xcf,
-    0x0a,
-    0xc1,
-    0x99,
-    0x8a,
-    0xf8,
-    0xdf,
-    0xc5,
-    0xb6,
-    0xa4,
-    0x85,
-    0x14,
-    0x42,
-    0xd8,
-    0xa4,
-    0xc8,
-    0x38,
-    0x02,
-    0x43,
-    0xd6,
-    0x88,
-    0xe4,
-    0x69,
-    0x3c,
-    0x07,
-    0x8c,
-    0x3e,
-    0x96,
-    0xb7,
-    0x87,
-    0x6d,
-    0xec,
-    0x49,
-    0x52,
-    0xcc,
-    0xcf,
-    0xe0,
-    0x11,
-    0x3f,
-    0xa4,
-    0x18,
-    0x83,
-    0xda,
-    0x3f,
-    0x47,
-    0x36,
-    0x45,
-    0xb4,
-    0x03,
-    0xf7,
-    0x65,
-    0x69,
-    0xe4,
-    0x8d,
-    0x38,
-    0x70,
-    0x8a,
-    0xa7,
-    0x01,
-    0x14,
-    0xe2,
-    0x12,
-    0xa6,
-    0xb2,
-    0xa6,
-    0x2f,
-    0x56,
-    0xcb,
-    0x23,
-    0xa5,
-    0x6e,
-    0x56,
-    0x3f,
-    0x53,
-    0x9e,
-    0x5b,
-    0xba,
-    0x89,
-    0x48,
-    0xbd,
-    0xb4,
-    0x77,
-    0x28,
-    0x58,
-    0x70,
-    0xe5,
-    0x3a,
-    0x4b,
-    0x57,
-    0x25,
-    0xd8,
-    0x97,
-    0x40,
-    0x46,
-    0x23,
-    0xea,
-    0xee,
-    0x8b,
-    0xa5,
-    0xb5,
-    0xda,
-    0x1b,
-    0x35,
-    0x84,
-    0x33,
-    0xfa,
-    0x1a,
-    0x8f,
-    0x24,
-    0x38,
-    0x73,
-    0x8c,
-    0x55,
-    0x69,
-    0xd6,
-    0xc8,
-    0xb4,
-    0x55,
-    0x37,
-    0x76,
-    0x75,
-    0xf0,
-    0x0b,
-    0x47,
-    0x57,
-    0x8c,
-    0xae,
-    0x3b,
-    0x2a,
-    0x4d,
-    0x02,
-    0xb6,
-    0x8e,
-    0xdd,
-    0x5a,
-    0xd6,
-    0xfd,
-    0x62,
-    0x96,
-    0x04,
-    0x0c,
-    0xad,
-    0x8f,
-    0xc9,
-    0xed,
-    0xb4,
-    0xb5,
-    0xe3,
-    0x39,
-    0x43,
-    0xf6,
-    0x99,
-    0xec,
-    0xee,
-    0xe2,
-    0x4b,
-    0xb2,
-    0x4a,
-    0x0d,
-    0x4d,
-    0x61,
-    0x5d,
-    0xb5,
-    0xf6,
-    0xc6,
-    0x52,
-    0xa5,
-    0xf3,
-    0xa4,
-    0x71,
-    0x59,
-    0xe1,
-    0xfa,
-    0x4f,
-    0x63,
-    0x1c,
-    0x85,
-    0x42,
-    0x0e,
-    0xd1,
-    0x86,
-    0x18,
-    0x40,
-    0x5b,
-    0xc5,
-    0x09,
-    0xa5,
-    0xcc,
-    0xd6,
-    0xe9,
-    0x09,
-    0xc9,
-    0x9b,
-    0xa3,
-    0x06,
-    0x9c,
-    0x0a,
-    0xe2,
-    0xe0,
-    0x84,
-    0x30,
-    0x11,
-    0xad,
-    0x4f,
-    0x76,
-    0x86,
-    0xb9,
-    0x2b,
-    0x24,
-    0xfa,
-    0x28,
-    0xba,
-    0x23,
-    0x3d,
-    0xdd,
-    0x64,
-    0x07,
-    0x27,
-    0x9b,
-    0xf1,
-    0x4d,
-    0xd2,
-    0x6a,
-    0x57,
-    0xe0,
-    0x06,
-    0x3d,
-    0xd0,
-    0xe2,
-    0xf5,
-    0xd1,
-    0x30,
-    0xaa,
-    0x29,
-    0xd8,
-    0x76,
-    0x09,
-    0xba,
-    0x57,
-    0xa1,
-    0xd2,
-    0xc4,
-    0x4d,
-    0xc5,
-    0x99,
-    0x18,
-    0x95,
-    0x5d,
-    0xba,
-    0x32,
-    0x0d,
-    0xe3,
-    0x9e,
-    0x6c,
-    0xf8,
-    0x9e,
-    0x39,
-    0x71,
-    0xa1,
-    0xbc,
-    0xd7,
-    0xf3,
-    0x42,
-    0xa0,
-    0x19,
-    0xa1,
-    0x23,
-    0x7d,
-    0x3a,
-    0x53,
-    0x06,
-    0x24,
-    0x97,
-    0x88,
-    0xc3,
-    0x1a,
-    0x6f,
-    0x13,
-    0x30,
-    0xee,
-    0xe7,
-    0x11,
-    0x43,
-    0xc9,
-    0x51,
-    0x1e,
-    0x7b,
-    0x47,
-    0xad,
-    0xc9,
-    0x7b,
-    0x85,
-    0x70,
-    0x45,
-    0xf9,
-    0x7c,
-    0x85,
-    0x61,
-    0xd6,
-    0x8d,
-    0x92,
-    0xb9,
-    0x8e,
-    0x5c,
-    0x7c,
-    0x2e,
-    0xd3,
-    0xe2,
-    0x2d,
-    0x95,
-    0x75,
-    0xbe,
-    0x95,
-    0xac,
-    0x85,
-    0xcc,
-    0xee,
-    0x52,
-    0xba,
-    0xf9,
-    0x45,
-    0xf7,
-    0x13,
-    0x56,
-    0x36,
-    0x51,
-    0xbe,
-    0x6b,
-    0xf7,
-    0x50,
-    0x39,
-    0xcd,
-    0x98,
-    0x55,
-    0xb7,
-    0xf3,
-    0x88,
-    0x9f,
-    0xc5,
-    0x45,
-    0x5c,
-    0x05,
-    0x2d,
-    0x76,
-    0xcc,
-    0xeb,
-    0x1b,
-    0x14,
-    0xfe,
-    0x6f,
-    0x7e,
-    0x5d,
-    0x08,
-    0xe3,
-    0xb1,
-    0x55,
-    0xb0,
-    0x80,
-    0x5b,
-    0x15,
-    0x75,
-    0x58,
-    0x94,
-    0x66,
-    0xd4,
-    0x8d,
-    0x49,
-    0x8e,
-    0xc4,
-    0xc1,
-    0xe1,
-    0x6a,
-    0x83,
-    0xcd,
-    0x20,
-    0xbd,
-    0x94,
-    0xb6,
-    0x4c,
-    0xc8,
-    0x09,
-    0xdd,
-    0x8f,
-    0x1b,
-    0xfe,
-    0x75,
-    0x9d,
-    0xaa,
-    0x66,
-    0x3a,
-    0x96,
-    0x23,
-    0x0a,
-    0x60,
-    0x2e,
-    0x7f,
-    0xce,
-    0xca,
-    0x0b,
-    0xd8,
-    0x36,
-    0x7d,
-    0x6f,
-    0x7a,
-    0x2a,
-    0x54,
-    0x16,
-    0x3c,
-    0xf6,
-    0xf5,
-    0x62,
-    0x11,
-    0x95,
-    0x03,
-    0xb5,
-    0xda,
-    0x2f,
-    0x96,
-    0x1e,
-    0x7e,
-    0xe0,
-    0xe8,
-    0x39,
-    0x3d,
-    0xbb,
-    0x51,
-    0x50,
-    0x41,
-    0x0f,
-    0x75,
-    0xc6,
-    0x76,
-    0xe8,
-    0xbc,
-    0xb6,
-    0x9c,
-    0xd9,
-    0x02,
-    0xd7,
-    0x9b,
-    0xf9,
-    0x90,
-    0xa3,
-    0x16,
-    0x2c,
-    0x4b,
-    0xb8,
-    0x42,
-    0xa4,
-    0x2c,
-    0x7e,
-    0xf9,
-    0xa7,
-    0xf0,
-    0x0a,
-    0x0a,
-    0x92,
-    0x11,
-    0x42,
-    0xd4,
-    0x1e,
-    0xf4,
-    0x42,
-    0x13,
-    0xe2,
-    0x64,
-    0xff,
-    0xf9,
-    0x19,
-    0x3f,
-    0x2a,
-    0x81,
-    0xa6,
-    0x6f,
-    0x58,
-    0x00,
-    0x55,
-    0x1c,
-    0x5f,
-    0xfc,
-    0x64,
-    0x20,
-    0x03,
-    0x42,
-    0x42,
-    0xbc,
-    0xd2,
-    0x33,
-    0x96,
-    0x89,
-    0x4c,
-    0x5f,
-    0x83,
-    0xb1,
-    0x47,
-    0x55,
-    0x2a,
-    0x5e,
-    0x92,
-    0xb8,
-    0x71,
-    0x73,
-    0xd9,
-    0x96,
-    0x03,
-    0x7b,
-    0xc8,
-    0xf6,
-    0x99,
-    0xde,
-    0x73,
-    0xb0,
-    0x77,
-    0x5b,
-    0xf6,
-    0x82,
-    0x39,
-    0xb2,
-    0x58,
-    0x5f,
-    0xcf,
-    0xa1,
-    0xb6,
-    0x0a,
-    0xc7,
-    0x12,
-    0x9d,
-    0xe4,
-    0xca,
-    0x93,
-    0xb7,
-    0x03,
-    0x6a,
-    0x06,
-    0xaa,
-    0x83,
-    0x1b,
-    0x9a,
-    0x3d,
-    0x21,
-    0x7e,
-    0xfa,
-    0xbd,
-    0x05,
-    0xe6,
-    0xc4,
-    0x9f,
-    0xe0,
-    0x15,
-    0x3c,
-    0x66,
-    0x37,
-    0x46,
-    0x42,
-    0xc7,
-    0xff,
-    0x71,
-    0x81,
-    0x0b,
-    0x69,
-    0xca,
-    0xea,
-    0xb6,
-    0xff,
-    0x8a,
-    0x61,
-    0x66,
-    0xf0,
-    0xf3,
-    0xb5,
-    0xfd,
-    0xa8,
-    0x8e,
-    0xd6,
-    0x02,
-    0xa4,
-    0xb8,
-    0x42,
-    0x45,
-    0x85,
-    0x5c,
-    0xc1,
-    0xc2,
-    0x63,
-    0x02,
-    0x52,
-    0xc8,
-    0x63,
-    0x09,
-    0x65,
-    0x5b,
-    0x8c,
-    0x30,
-    0x4a,
-    0xd6,
-    0xd6,
-    0x5c,
-    0xea,
-    0xd5,
-    0x84,
-    0x95,
-    0xb5,
-    0x51,
-    0xb4,
-    0x51,
-    0xdb,
-    0x0d,
-    0x35,
-    0xf5,
-    0xbf,
-    0x31,
-    0x98,
-    0x99,
-    0xa9,
-    0x35,
-    0x8a,
-    0x0b,
-    0xba,
-    0x01,
-    0x61,
-    0x17,
-    0x26,
-    0x53,
-    0xf4,
-    0x06,
-    0x9d,
-    0x60,
-    0xb0,
-    0x65,
-    0x0a,
-    0xbe,
-    0xe8,
-    0x08,
-    0x80,
-    0x81,
-    0x6d,
-    0x4e,
-    0x71,
-    0xa5,
-    0x5f,
-    0xa5,
-    0x22,
-    0xac,
-    0x42,
-    0x51,
-    0x5b,
-    0x87,
-    0x54,
-    0x6a,
-    0x63,
-    0xba,
-    0x1e,
-    0x24,
-    0x2c,
-    0xbc,
-    0x4a,
-    0x54,
-    0xca,
-    0x9c,
-    0xb4,
-    0x2f,
-    0x29,
-    0xea,
-    0xc4,
-    0x54,
-    0x00,
-    0xd5,
-    0xfa,
-    0x0d,
-    0x01,
-    0x91,
-    0xca,
-    0xd1,
-    0x53,
-    0xfc,
-    0xab,
-    0x0e,
-    0x41,
-    0x80,
-    0x6b,
-    0x26,
-    0x34,
-    0x3b,
-    0xc5,
-    0xb7,
-    0xde,
-    0x5d,
-    0x35,
-    0x20,
-    0xb9,
-    0xd2,
-    0x0b,
-    0x41,
-    0xb0,
-    0x22,
-    0xbf,
-    0x82,
-    0x1b,
-    0x95,
-    0x84,
-    0x16,
-    0xf1,
-    0x9a,
-    0x1f,
-    0x81,
-    0x39,
-    0x69,
-    0xfa,
-    0x57,
-    0xc2,
-    0xe8,
-    0x74,
-    0x47,
-    0x14,
-    0xcb,
-    0x7c,
-    0x59,
-    0xa6,
-    0x00,
-    0x5e,
-    0x74,
-    0x52,
-    0x4a,
-    0xdc,
-    0x23,
-    0x05,
-    0x2c,
-    0x81,
-    0x98,
-    0xbb,
-    0x08,
-    0x32,
-    0xf2,
-    0xab,
-    0x88,
-    0x06,
-    0xbb,
-    0xbe,
-    0x3d,
-    0x58,
-    0xb5,
-    0x46,
-    0x86,
-    0x1a,
-    0xd6,
-    0xed,
-    0xb4,
-    0x6b,
-    0x91,
-    0xeb,
-    0x6b,
-    0x6c,
-    0x57,
-    0x7d,
-    0x4b,
-    0x50,
-    0x5e,
-    0x92,
-    0xd0,
-    0xb3,
-    0xa1,
-    0xc7,
-    0x77,
-    0x2d,
-    0x28,
-    0x95,
-    0x23,
-    0x26,
-    0x89,
-    0xc9,
-    0xbe,
-    0xec,
-    0xaf,
-    0x35,
-    0x23,
-    0x02,
-    0xda,
-    0xa6,
-    0x3c,
-    0xbc,
-    0xe7,
-    0x16,
-    0x67,
-    0x08,
-    0xd2,
-    0x22,
-    0x1f,
-    0x8f,
-    0x79,
-    0xbe,
-    0xd8,
-    0xfd,
-    0xa2,
-    0x27,
-    0x2a,
-    0x9c,
-    0x40,
-    0x19,
-    0x32,
-    0x28,
-    0xf2,
-    0x43,
-    0x36,
-    0xdf,
-    0xcd,
-    0xf8,
-    0x87,
-    0xd7,
-    0x5b,
-    0x27,
-    0xac,
-    0x94,
-    0xe3,
-    0x8d,
-    0xbc,
-    0xda,
-    0xeb,
-    0x29,
-    0x0c,
-    0xc0,
-    0xfc,
-    0xf0,
-    0x0a,
-    0x06,
-    0xa5,
-    0xc3,
-    0x69,
-    0xa8,
-    0xc2,
-    0x9e,
-    0x7f,
-    0xb3,
-    0xff,
-    0x12,
-    0xeb,
-    0x58,
-    0x97,
-    0xf5,
-    0x7a,
-    0x3f,
-    0x62,
-    0x58,
-    0x4c,
-    0x1e,
-    0x0e,
-    0xb9,
-    0x32,
-    0x89,
-    0xac,
-    0x7a,
-    0x5b,
-    0x0c,
-    0x6f,
-    0x92,
-    0x30,
-    0x77,
-    0xb1,
-    0x83,
-    0x7c,
-    0x79,
-    0x37,
-    0x8c,
-    0xd0,
-    0x70,
-    0xb6,
-    0x1f,
-    0x26,
-    0x80,
-    0x96,
-    0x95,
-    0xc4,
-    0xe2,
-    0xf5,
-    0x21,
-    0x63,
-    0x7f,
-    0xef,
-    0x02,
-    0x91,
-    0xbe,
-    0x1d,
-    0xfd,
-    0x54,
-    0x9a,
-    0x5b,
-    0x0b,
-    0x10,
-    0xf7,
-    0xcf,
-    0x4f,
-    0xaa,
-    0x36,
-    0x27,
-    0x4a,
-    0xee,
-    0x07,
-    0x21,
-    0x52,
-    0x2e,
-    0x7e,
-    0x51,
-    0x40,
-    0x2c,
-    0x6a,
-    0x1f,
-    0x6a,
-    0x3b,
-    0xe2,
-    0x0f,
-    0xd1,
-    0xa0,
-    0x20,
-    0x45,
-    0x9b,
-    0x3e,
-    0x93,
-    0x48,
-    0xc3,
-    0x73,
-    0x2f,
-    0x06,
-    0x0f,
-    0x3d,
-    0x08,
-    0x18,
-    0x42,
-    0xa1,
-    0x1f,
-    0x48,
-    0x93,
-    0x4d,
-    0x7b,
-    0x50,
-    0x5f,
-    0x7c,
-    0x7c,
-    0xe5,
-    0x1b,
-    0x1a,
-    0x6d,
-    0xf4,
-    0x8c,
-    0x28,
-    0x58,
-    0x2c,
-    0x3a,
-    0x63,
-    0x1e,
-    0xbc,
-    0x22,
-    0x20,
-    0xc6,
-    0x5e,
-    0xab,
-    0x7b,
-    0x16,
-    0x94,
-    0xdb,
-    0xb0,
-    0x60,
-    0x31,
-    0xcb,
-    0xc9,
-    0x9f,
-    0x1c,
-    0x58,
-    0x7a,
-    0xc3,
-    0x51,
-    0x1c,
-    0x49,
-    0x48,
-    0x28,
-    0x9d,
-    0xf1,
-    0x0d,
-    0xda,
-    0xc3,
-    0x09,
-    0x64,
-    0x41,
-    0x90,
-    0xe1,
-    0x65,
-    0xdf,
-    0x0b,
-    0xad,
-    0x89,
-    0x22,
-    0x7d,
-    0xe5,
-    0x74,
-    0xe6,
-    0xe0,
-    0xeb,
-    0x11,
-    0x3c,
-    0x95,
-    0xef,
-    0xe4,
-    0x6a,
-    0x55,
-    0x10,
-    0x9c,
-    0x33,
-    0x6a,
-    0xc3,
-    0xe8,
-    0x58,
-    0x1f,
-    0x79,
-    0x8c,
-    0x5e,
-    0x75,
-    0x7c,
-    0xb4,
-    0x92,
-    0x17,
-    0x1a,
-    0x88,
-    0x4b,
-    0x90,
-    0x06,
-    0x00,
-    0x6f,
-    0xbc,
-    0xfb,
-    0xfa,
-    0x38,
-    0x7c,
-    0xa2,
-    0x8a,
-    0x38,
-    0xae,
-    0xb6,
-    0x91,
-    0x9b,
-    0x5d,
-    0x66,
-    0x91,
-    0xad,
-    0x34,
-    0xfb,
-    0xbf,
-    0x9c,
-    0x39,
-    0xba,
-    0x5a,
-    0x7e,
-    0xb8,
-    0x0c,
-    0x3c,
-    0x95,
-    0x7c,
-    0xdc,
-    0xaf,
-    0xd2,
-    0x45,
-    0x41,
-    0x81,
-    0x99,
-    0x77,
-    0x5d,
-    0x5b,
-    0xc4,
-    0x10,
-    0x85,
-    0x4e,
-    0xea,
-    0xdc,
-    0xa1,
-    0xaf,
-    0xe1,
-    0xec,
-    0xd6,
-    0x25,
-    0x81,
-    0x44,
-    0x63,
-    0x00,
-    0xab,
-    0xd4,
-    0xc9,
-    0xcc,
-    0x8a,
-    0xaa,
-    0x2f,
-    0x26,
-    0x19,
-    0x65,
-    0x04,
-    0xcf,
-    0xe6,
-    0xed,
-    0xe6,
-    0xff,
-    0x15,
-    0x61,
-    0xc3,
-    0xfc,
-    0xa7,
-    0x51,
-    0x3e,
-    0xea,
-    0xfd,
-    0x2e,
-    0x54,
-    0xe5,
-    0x97,
-    0xfe,
-    0x3f,
-    0x4d,
-    0x22,
-    0x54,
-    0x9a,
-    0x61,
-    0xb2,
-    0x80,
-    0xc7,
-    0x10,
-    0x4c,
-    0x03,
-    0x8e,
-    0x0b,
-    0xa7,
-    0x46,
-    0x06,
-    0x1f,
-    0x33,
-    0x8b,
-    0xb9,
-    0xc2,
-    0x5b,
-    0x23,
-    0x03,
-    0xec,
-    0x07,
-    0xe1,
-    0xbb,
-    0x28,
-    0x66,
-    0xd0,
-    0x15,
-    0xea,
-    0xea,
-    0x21,
-    0xc7,
-    0x23,
-    0x94,
-    0x67,
-    0x6b,
-    0x13,
-    0x71,
-    0x07,
-    0x25,
-    0x5e,
-    0x65,
-    0xe9,
-    0x85,
-    0x63,
-    0x27,
-    0x74,
-    0xaf,
-    0xc9,
-    0x8d,
-    0xba,
-    0xb9,
-    0x5a,
-    0x0a,
-    0xef,
-    0x54,
-    0x15,
-    0x75,
-    0x20,
-    0xaf,
-    0x7e,
-    0x0b,
-    0x21,
-    0x98,
-    0x39,
-    0xb8,
-    0xc8,
-    0xe5,
-    0xd7,
-    0x92,
-    0x58,
-    0x12,
-    0xf0,
-    0xa6,
-    0x40,
-    0x2b,
-    0x72,
-    0xf8,
-    0x06,
-    0xec,
-    0x38,
-    0xc5,
-    0x7e,
-    0x28,
-    0xdf,
-    0x0b,
-    0x3f,
-    0x67,
-    0xd5,
-    0x4c,
-    0x57,
-    0xd3,
-    0xb2,
-    0x8e,
-    0x3e,
-    0x55,
-    0xcc,
-    0xa6,
-    0x09,
-    0xfb,
-    0x05,
-    0xb6,
-    0xe0,
-    0x9d,
-    0xe8,
-    0xf5,
-    0xb2,
-    0xc0,
-    0xf5,
-    0xae,
-    0x27,
-    0xba,
-    0x38,
-    0x8c,
-    0xd7,
-    0x17,
-    0x21,
-    0x14,
-    0xb9,
-    0x3c,
-    0x8f,
-    0x73,
-    0xde,
-    0x4a,
-    0x2e,
-    0x7a,
-    0x5f,
-    0x45,
-    0x03,
-    0xe7,
-    0x94,
-    0x76,
-    0x45,
-    0xe6,
-    0x86,
-    0x0d,
-    0x6f,
-    0xd7,
-    0xa7,
-    0x0b,
-    0x93,
-    0x52,
-    0xc1,
-    0x5f,
-    0xf1,
-    0x68,
-    0x2d,
-    0x4f,
-    0xc8,
-    0x2c,
-    0x45,
-    0x1a,
-    0x6c,
-    0x73,
-    0x1b,
-    0xdc,
-    0x99,
-    0xd7,
-    0x6c,
-    0xb1,
-    0x07,
-    0x02,
-    0xcf,
-    0x1d,
-    0x3e,
-    0x29,
-    0x32,
-    0xac,
-    0xac,
-    0xd6,
-    0x87,
-    0xd5,
-    0xf5,
-    0xeb,
-    0xbb,
-    0x24,
-    0x8a,
-    0xe4,
-    0xe8,
-    0x99,
-    0x7d,
-    0x5c,
-    0xcb,
-    0x4b,
-    0x94,
-    0xd2,
-    0x78,
-    0x50,
-    0x9c,
-    0xae,
-    0x4c,
-    0xe1,
-    0xff,
-    0x7f,
-    0x24,
-    0xba,
-    0x99,
-    0x87,
-    0xcc,
-    0xc0,
-    0xc8,
-    0x79,
-    0xbb,
-    0xe6,
-    0xc2,
-    0x81,
-    0xfd,
-    0x51,
-    0x2c,
-    0x85,
-    0x70,
-    0xbb,
-    0xe8,
-    0xab,
-    0x33,
-    0x15,
-    0x2e,
-    0x1b,
-    0x5c,
-    0x70,
-    0xde,
-    0x06,
-    0xe9,
-    0x1d,
-    0x14,
-    0xe7,
-    0xfa,
-    0x13,
-    0xfd,
-    0x08,
-    0x3d,
-    0x92,
-    0xea,
-    0x48,
-    0xa9,
-    0x06,
-    0xa3,
-    0x1d,
-    0x6f,
-    0x2e,
-    0xfe,
-    0xd5,
-    0x2d,
-    0x7d,
-    0xb0,
-    0x21,
-    0x65,
-    0xc1,
-    0x62,
-    0xd3,
-    0x2f,
-    0x02,
-    0x08,
-    0xe7,
-    0x2a,
-    0xad,
-    0x6e,
-    0xc0,
-    0xb8,
-    0xf2,
-    0x13,
-    0xb5,
-    0x6b,
-    0x6a,
-    0x3b,
-    0xcc,
-    0xba,
-    0xfd,
-    0x40,
-    0xc5,
-    0xf9,
-    0x03,
-    0x29,
-    0x5b,
-    0x88,
-    0xa9,
-    0x7d,
-    0xc6,
-    0x4a,
-    0x96,
-    0x5a,
-    0x84,
-    0x58,
-    0xcf,
-    0xc1,
-    0x59,
-    0xf7,
-    0xd8,
-    0x34,
-    0x95,
-    0xc8,
-    0x1d,
-    0x83,
-    0x95,
-    0x3f,
-    0x90,
-    0xe3,
-    0x8c,
-    0x56,
-    0x92,
-    0x40,
-    0x84,
-    0x83,
-    0x17,
-    0xd4,
-    0x9f,
-    0xe7,
-    0x05,
-    0xf9,
-    0xa3,
-    0xc8,
-    0xde,
-    0x3b,
-    0xb5,
-    0x41,
-    0x9f,
-    0xb2,
-    0x65,
-    0x38,
-    0xe8,
-    0x8f,
-    0xeb,
-    0x91,
-    0x5c,
-    0xf4,
-    0xb0,
-    0xa1,
-    0x4b,
-    0x09,
-    0x11,
-    0xe6,
-    0x8f,
-    0x4c,
-    0x5f,
-    0xf5,
-    0xb3,
-    0x28,
-    0x2a,
-    0xb3,
-    0x5b,
-    0xca,
-    0xbf,
-    0xc8,
-    0xdf,
-    0x30,
-    0xef,
-    0x51,
-    0x3a,
-    0x82,
-    0x12,
-    0xd5,
-    0x23,
-    0xa6,
-    0x4c,
-    0x7b,
-    0x79,
-    0x0f,
-    0x0f,
-    0x7a,
-    0xe4,
-    0xd5,
-    0xe1,
-    0xd0,
-    0xba,
-    0x0b,
-    0x60,
-    0x37,
-    0x1f,
-    0x4d,
-    0x83,
-    0x55,
-    0x71,
-    0x98,
-    0x22,
-    0x33,
-    0xe3,
-    0x5e,
-    0xb9,
-    0xf0,
-    0x67,
-    0xda,
-    0x69,
-    0xb7,
-    0xd2,
-    0xa2,
-    0x3f,
-    0xee,
-    0x3a,
-    0x7b,
-    0xb9,
-    0xb0,
-    0xa3,
-    0x70,
-    0x86,
-    0x7e,
-    0xdb,
-    0x26,
-    0x8e,
-    0x31,
-    0xa3,
-    0x6a,
-    0x32,
-    0x33,
-    0x0f,
-    0x0c,
-    0xd5,
-    0xef,
-    0x30,
-    0xf0,
-    0x9b,
-    0x86,
-    0xf0,
-    0x62,
-    0x70,
-    0xc4,
-    0x3c,
-    0xaa,
-    0x4d,
-    0x52,
-    0x69,
-    0xe0,
-    0xb6,
-    0x2d,
-    0xd0,
-    0x02,
-    0x88,
-    0x56,
-    0xbc,
-    0x44,
-    0xf1,
-    0xcc,
-    0x87,
-    0xa7,
-    0xc0,
-    0xb7,
-    0xff,
-    0xcd,
-    0xdf,
-    0xe6,
-    0x0e,
-    0x0c,
-    0x1d,
-    0x7b,
-    0x9b,
-    0xc1,
-    0x31,
-    0xe5,
-    0xab,
-    0xe7,
-    0xfc,
-    0x0f,
-    0xcc,
-    0xe8,
-    0x0f,
-    0xd7,
-    0xb3,
-    0xb2,
-    0x6d,
-    0xc2,
-    0x24,
-    0x0e,
-    0x92,
-    0xee,
-    0x12,
-    0x2d,
-    0xb4,
-    0x48,
-    0x08,
-    0x84,
-    0x48,
-    0xfe,
-    0xc7,
-    0xdb,
-    0xc8,
-    0x38,
-    0x31,
-    0xa0,
-    0xb4,
-    0x03,
-    0x65,
-    0x80,
-    0xd7,
-    0x8d,
-    0x2c,
-    0x39,
-    0xcb,
-    0x98,
-    0x94,
-    0xa9,
-    0xbf,
-    0x29,
-    0xda,
-    0x2b,
-    0x78,
-    0x80,
-    0x8d,
-    0x24,
-    0x96,
-    0x4d,
-    0xf1,
-    0xd9,
-    0x19,
-    0x21,
-    0xa2,
-    0x84,
-    0x23,
-    0x23,
-    0x79,
-    0xa6,
-    0xff,
-    0x04,
-    0xb3,
-    0x9e,
-    0x63,
-    0x35,
-    0x50,
-    0x7b,
-    0xf2,
-    0x57,
-    0xba,
-    0x0f,
-    0x05,
-    0xf3,
-    0xa7,
-    0x44,
-    0xab,
-    0x6b,
-    0x40,
-    0xb4,
-    0xef,
-    0x30,
-    0x83,
-    0x73,
-    0x59,
-    0x36,
-    0xe6,
-    0x2f,
-    0xb7,
-    0xa5,
-    0x3d,
-    0x7c,
-    0x1c,
-    0xd2,
-    0xdd,
-    0x69,
-    0x2a,
-    0x6d,
-    0x02,
-    0x57,
-    0x8d,
-    0xfc,
-    0x6e,
-    0x0b,
-    0xc8,
-    0x87,
-    0x53,
-    0x01,
-    0x34,
-    0x95,
-    0x73,
-    0x03,
-    0x45,
-    0x58,
-    0x86,
-    0xfb,
-    0x10,
-    0x25,
-    0xdc,
-    0x06,
-    0x0a,
-    0x27,
-    0x43,
-    0xc9,
-    0x13,
-    0x53,
-    0x2b,
-    0x08,
-    0xb3,
-    0x9e,
-    0x08,
-    0x74,
-    0xa3,
-    0x6e,
-    0xf8,
-    0xc5,
-    0x8f,
-    0x4f,
-    0xa6,
-    0x09,
-    0x1a,
-    0xe8,
-    0x6e,
-    0x3c,
-    0x23,
-    0x2d,
-    0xc2,
-    0x18,
-    0x46,
-    0xd6,
-    0xcc,
-    0x2e,
-    0xa6,
-    0x0f,
-    0x54,
-    0x36,
-    0xea,
-    0x71,
-    0xe5,
-    0xa4,
-    0x86,
-    0x31,
-    0x2b,
-    0x7c,
-    0x3c,
-    0x97,
-    0xa0,
-    0x66,
-    0xe2,
-    0xb2,
-    0x68,
-    0x05,
-    0x65,
-    0x4b,
-    0x78,
-    0x85,
-    0x0e,
-    0x17,
-    0xfe,
-    0x73,
-    0x04,
-    0x30,
-    0xfd,
-    0xd2,
-    0x13,
-    0xc6,
-    0x38,
-    0x6b,
-    0xab,
-    0x12,
-    0x52,
-    0x64,
-    0x2c,
-    0x8c,
-    0x33,
-    0x14,
-    0x60,
-    0x5e,
-    0xae,
-    0x16,
-    0x49,
-    0x18,
-    0x60,
-    0x9c,
-    0x1e,
-    0xa5,
-    0xdb,
-    0x06,
-    0x90,
-    0x7e,
-    0x04,
-    0xb4,
-    0x51,
-    0x1d,
-    0xb9,
-    0x18,
-    0xd7,
-    0xb5,
-    0xb7,
-    0x0f,
-    0x5e,
-    0x20,
-    0xbb,
-    0x71,
-    0x2c,
-    0x19,
-    0xe8,
-    0xe6,
-    0x18,
-    0xab,
-    0x69,
-    0xfc,
-    0x4d,
-    0xe9,
-    0x57,
-    0x77,
-    0x4c,
-    0xe0,
-    0xdd,
-    0xe9,
-    0x30,
-    0xca,
-    0x9a,
-    0x82,
-    0x36,
-    0x85,
-    0x46,
-    0x28,
-    0x7c,
-    0x43,
-    0x99,
-    0xca,
-    0x09,
-    0x82,
-    0x68,
-    0xf2,
-    0x0e,
-    0x3f,
-    0x12,
-    0x9a,
-    0x6b,
-    0x66,
-    0x1a,
-    0x41,
-    0x75,
-    0x8e,
-    0x15,
-    0x3e,
-    0xf7,
-    0xe3,
-    0xc7,
-    0x53,
-    0x77,
-    0x63,
-    0x89,
-    0x85,
-    0xba,
-    0x4e,
-    0xed,
-    0x2b,
-    0x8a,
-    0xd7,
-    0xa5,
-    0x46,
-    0xb6,
-    0x20,
-    0xa1,
-    0x10,
-    0x5b,
-    0x65,
-    0x78,
-    0xd8,
-    0x62,
-    0x78,
-    0x09,
-    0x0c,
-    0x4a,
-    0x6d,
-    0x62,
-    0x98,
-    0x27,
-    0x96,
-    0xe1,
-    0x6e,
-    0xeb,
-    0xb2,
-    0x98,
-    0x66,
-    0xe5,
-    0x61,
-    0xf6,
-    0x49,
-    0x87,
-    0xdb,
-    0xa4,
-    0x28,
-    0x6c,
-    0xe2,
-    0xae,
-    0xf3,
-    0x9a,
-    0xf5,
-    0xe3,
-    0x47,
-    0x04,
-    0xc7,
-    0x7e,
-    0x86,
-    0x53,
-    0xef,
-    0x06,
-    0x2d,
-    0xe5,
-    0xe1,
-    0x72,
-    0x62,
-    0x16,
-    0x1d,
-    0x91,
-    0xcd,
-    0xbf,
-    0xa6,
-    0xa9,
-    0xa9,
-    0xfd,
-    0xb6,
-    0x5f,
-    0x1b,
-    0x34,
-    0xb0,
-    0xd6,
-    0xc2,
-    0x53,
-    0x56,
-    0x1b,
-    0x8f,
-    0x59,
-    0x3c,
-    0xc1,
-    0xd7,
-    0x18,
-    0x7c,
-    0xc8,
-    0xa6,
-    0x38,
-    0xac,
-    0xc4,
-    0x57,
-    0x80,
-    0x0d,
-    0x3a,
-    0x61,
-    0x51,
-    0x05,
-    0x4e,
-    0x74,
-    0x73,
-    0xd0,
-    0x9b,
-    0xc5,
-    0x15,
-    0x72,
-    0x63,
-    0xa6,
-    0x0e,
-    0xf0,
-    0xe8,
-    0x59,
-    0x69,
-    0xbf,
-    0x19,
-    0x26,
-    0x21,
-    0x7d,
-    0x71,
-    0xab,
-    0x29,
-    0xdf,
-    0x1d,
-    0x74,
-    0xaf,
-    0xeb,
-    0x5d,
-    0xcb,
-    0xa2,
-    0x67,
-    0x2c,
-    0xd1,
-    0x72,
-    0x91,
-    0x23,
-    0xce,
-    0x17,
-    0x10,
-    0x9b,
-    0xc6,
-    0x54,
-    0x2b,
-    0x12,
-    0x4d,
-    0x3d,
-    0x39,
-    0xd0,
-    0x9b,
-    0xf7,
-    0x58,
-    0xc9,
-    0xe3,
-    0xbf,
-    0x62,
-    0xc6,
-    0xe1,
-    0x2d,
-    0x1d,
-    0xc0,
-    0xb3,
-    0xba,
-    0xb2,
-    0x8c,
-    0xe9,
-    0x81,
-    0x61,
-    0xbe,
-    0xdf,
-    0x42,
-    0x72,
-    0xc7,
-    0x4b,
-    0xac,
-    0x6f,
-    0x60,
-    0x12,
-    0xdc,
-    0x90,
-    0x2c,
-    0x60,
-    0x21,
-    0x77,
-    0x98,
-    0xf7,
-    0x02,
-    0x1d,
-    0x07,
-    0xc7,
-    0x82,
-    0x0d,
-    0x2c,
-    0xbf,
-    0xa2,
-    0xd0,
-    0xb6,
-    0xe4,
-    0x28,
-    0xa8,
-    0x33,
-    0xa0,
-    0x9f,
-    0x81,
-    0x2e,
-    0x5c,
-    0x9f,
-    0x24,
-    0x9b,
-    0x51,
-    0x4e,
-    0xae,
-    0x76,
-    0x9a,
-    0x27,
-    0x40,
-    0xa6,
-    0x8e,
-    0xfa,
-    0xf9,
-    0x27,
-    0x4e,
-    0x34,
-    0x21,
-    0x68,
-    0x9a,
-    0x61,
-    0xa7,
-    0xf2,
-    0xe9,
-    0xef,
-    0xce,
-    0x4b,
-    0xb8,
-    0x35,
-    0x23,
-    0x1a,
-    0x22,
-    0xb4,
-    0xb2,
-    0x8b,
-    0xb1,
-    0x9c,
-    0x79,
-    0xf5,
-    0x74,
-    0x92,
-    0x1d,
-    0xbb,
-    0x51,
-    0xb0,
-    0xdc,
-    0x70,
-    0x9d,
-    0xcd,
-    0xc3,
-    0x3e,
-    0xea,
-    0xff,
-    0x21,
-    0x88,
-    0x20,
-    0x5f,
-    0x3b,
-    0xce,
-    0xd0,
-    0x0c,
-    0x41,
-    0xd1,
-    0xc4,
-    0x73,
-    0x81,
-    0xf8,
-    0xdb,
-    0xcd,
-    0xdb,
-    0xf3,
-    0x14,
-    0xe8,
-    0x75,
-    0x9e,
-    0xe8,
-    0x2b,
-    0xb0,
-    0x28,
-    0xdd,
-    0xd5,
-    0x5a,
-    0x74,
-    0x58,
-    0x85,
-    0x25,
-    0xbf,
-    0xb2,
-    0xff,
-    0x57,
-    0x84,
-    0x8f,
-    0x2d,
-    0xc4,
-    0x9c,
-    0x6b,
-    0x64,
-    0xf9,
-    0xaa,
-    0x76,
-    0xe9,
-    0xbb,
-    0xb6,
-    0xa2,
-    0xb4,
-    0xb0,
-    0x18,
-    0xfa,
-    0x73,
-    0x5b,
-    0x98,
-    0x35,
-    0xd2,
-    0x4e,
-    0xd3,
-    0x8b,
-    0xfa,
-    0x9a,
-    0xe1,
-    0xc7,
-    0x57,
-    0x8b,
-    0x34,
-    0x9e,
-    0x9f,
-    0x92,
-    0xc3,
-    0x3f,
-    0x10,
-    0x83,
-    0x68,
-    0x2b,
-    0xf9,
-    0x00,
-    0x87,
-    0x47,
-    0x7b,
-    0x35,
-    0xf1,
-    0x2f,
-    0x91,
-    0xc7,
-    0x08,
-    0xce,
-    0x4e,
-    0x06,
-    0x23,
-    0x2c,
-    0x66,
-    0x6a,
-    0x34,
-    0x86,
-    0xf0,
-    0x3d,
-    0xa8,
-    0xa4,
-    0x6a,
-    0x95,
-    0x8e,
-    0x67,
-    0xfe,
-    0x85,
-    0xfc,
-    0xa2,
-    0x03,
-    0x94,
-    0xae,
-    0x2a,
-    0xc7,
-    0x6e,
-    0xf1,
-    0x31,
-    0x8c,
-    0xda,
-    0xbf,
-    0xcf,
-    0xd0,
-    0xec,
-    0x2c,
-    0xe2,
-    0xd2,
-    0x7c,
-    0x01,
-    0x18,
-    0x51,
-    0xd7,
-    0xa6,
-    0x4a,
-    0x97,
-    0xb3,
-    0x45,
-    0x0c,
-    0xb6,
-    0x69,
-    0x2c,
-    0x82,
-    0x12,
-    0x5e,
-    0x73,
-    0x75,
-    0x1f,
-    0xc2,
-    0xdf,
-    0xa5,
-    0x6c,
-    0x7e,
-    0x07,
-    0x61,
-    0xe1,
-    0x67,
-    0xb5,
-    0x56,
-    0x45,
-    0xb8,
-    0x8f,
-    0xa5,
-    0x02,
-    0xbf,
-    0xf7,
-    0x38,
-    0x2d,
-    0xd6,
-    0x2f,
-    0x55,
-    0xc1,
-    0x95,
-    0xc1,
-    0x73,
-    0x2b,
-    0x46,
-    0x1e,
-    0x4d,
-    0x0c,
-    0x99,
-    0x85,
-    0x36,
-    0x3a,
-    0x9a,
-    0x26,
-    0xac,
-    0x08,
-    0xdf,
-    0x88,
-    0x2f,
-    0xc7,
-    0x06,
-    0x28,
-    0x54,
-    0x8c,
-    0x5f,
-    0x63,
-    0x15,
-    0x34,
-    0xe5,
-    0x95,
-    0x6b,
-    0xa6,
-    0x73,
-    0x83,
-    0x1f,
-    0x58,
-    0x34,
-    0xf6,
-    0xdc,
-    0x15,
-    0x5c,
-    0xa9,
-    0x8a,
-    0xfd,
-    0x15,
-    0x65,
-    0xd7,
-    0xcd,
-    0xbc,
-    0x6b,
-    0x16,
-    0x60,
-    0x4e,
-    0x12,
-    0x4d,
-    0x76,
-    0x1d,
-    0xb1,
-    0x89,
-    0xb5,
-    0xc8,
-    0xbf,
-    0x75,
-    0xed,
-    0x69,
-    0x39,
-    0x2b,
-    0xa0,
-    0x10,
-    0x44,
-    0x4a,
-    0xc2,
-    0x71,
-    0x14,
-    0x49,
-    0xbd,
-    0xd9,
-    0x0c,
-    0x0b,
-    0xb8,
-    0x67,
-    0x27,
-    0xb3,
-    0x19,
-    0x78,
-    0x96,
-    0xb9,
-    0x48,
-    0x63,
-    0xab,
-    0x3e,
-    0xb6,
-    0x67,
-    0xf5,
-    0x9c,
-    0x1f,
-    0xe1,
-    0xad,
-    0x42,
-    0x0c,
-    0xc2,
-    0x50,
-    0xbf,
-    0x9b,
-    0x41,
-    0x8e,
-    0x1c,
-    0x82,
-    0xcd,
-    0x63,
-    0x6f,
-    0x52,
-    0x46,
-    0x84,
-    0xad,
-    0xf9,
-    0x6c,
-    0xfc,
-    0xc0,
-    0x8b,
-    0x98,
-    0x17,
-    0xd9,
-    0x42,
-    0xaa,
-    0x7f,
-    0x08,
-    0xc3,
-    0x42,
-    0xa5,
-    0x0a,
-    0xa2,
-    0x33,
-    0x62,
-    0x62,
-    0x29,
-    0x34,
-    0xdf,
-    0xab,
-    0x55,
-    0xd9,
-    0xb2,
-    0x2c,
-    0x22,
-    0xc2,
-    0x49,
-    0xad,
-    0x08,
-    0x13,
-    0x8c,
-    0x89,
-    0xc6,
-    0x23,
-    0xbe,
-    0x05,
-    0x5e,
-    0x79,
-    0xa4,
-    0xe0,
-    0x61,
-    0xf4,
-    0xea,
-    0x2b,
-    0x6c,
-    0x49,
-    0xc2,
-    0x5b,
-    0xf3,
-    0xb3,
-    0xce,
-    0x9d,
-    0x3d,
-    0xe5,
-    0x40,
-    0x69,
-    0xb0,
-    0x44,
-    0x40,
-    0x5a,
-    0x4f,
-    0x53,
-    0x8e,
-    0x3d,
-    0x81,
-    0x6e,
-    0x68,
-    0x68,
-    0x14,
-    0xbc,
-    0xae,
-    0x4d,
-    0x81,
-    0x5f,
-    0x44,
-    0x4e,
-    0x72,
-    0xed,
-    0xb8,
-    0xd3,
-    0x81,
-    0x24,
-    0x24,
-    0x9a,
-    0x43,
-    0xd9,
-    0x56,
-    0x4f,
-    0x85,
-    0x32,
-    0x2f,
-    0x5d,
-    0xd5,
-    0x15,
-    0x49,
-    0x03,
-    0x45,
-    0xe0,
-    0xdc,
-    0xaa,
-    0x6b,
-    0x5b,
-    0xe3,
-    0x76,
-    0xac,
-    0xeb,
-    0x7a,
-    0x1b,
-    0xbb,
-    0x08,
-    0x8b,
-    0xf2,
-    0x5c,
-    0xf0,
-    0xa9,
-    0x4c,
-    0x6e,
-    0x9d,
-    0x3c,
-    0x06,
-    0x28,
-    0xf5,
-    0xdf,
-    0x5d,
-    0xa3,
-    0x42,
-    0x06,
-    0x04,
-    0x98,
-    0xe1,
-    0xe4,
-    0x74,
-    0x6c,
-    0x3e,
-    0x8c,
-    0x84,
-    0x69,
-    0x00,
-    0x56,
-    0x39,
-    0x4f,
-    0x80,
-    0x84,
-    0xdf,
-    0x0b,
-    0x80,
-    0x25,
-    0x58,
-    0xc6,
-    0x1a,
-    0x3a,
-    0xb5,
-    0x21,
-    0xf6,
-    0x18,
-    0x03,
-    0xbf,
-    0xc0,
-    0x0d,
-    0x67,
-    0x05,
-    0xd9,
-    0x46,
-    0x6e,
-    0x1d,
-    0x4d,
-    0xf0,
-    0x9e,
-    0x41,
-    0x06,
-    0x9e,
-    0x51,
-    0x36,
-    0x3f,
-    0xeb,
-    0xc3,
-    0x16,
-    0x3b,
-    0x60,
-    0x69,
-    0x53,
-    0x36,
-    0x98,
-    0x84,
-    0xf9,
-    0x9c,
-    0xa1,
-    0xf7,
-    0x33,
-    0x79,
-    0xa6,
-    0x55,
-    0x11,
-    0x30,
-    0xcb,
-    0x3f,
-    0x88,
-    0x71,
-    0x59,
-    0xed,
-    0xbb,
-    0x65,
-    0x1b,
-    0x0a,
-    0x78,
-    0x2b,
-    0x08,
-    0xc5,
-    0x06,
-    0x88,
-    0x21,
-    0x25,
-    0x1e,
-    0xda,
-    0x9d,
-    0x9c,
-    0x37,
-    0x4e,
-    0x44,
-    0xe0,
-    0x07,
-    0x53,
-    0x19,
-    0xf6,
-    0x46,
-    0x4f,
-    0x3b,
-    0x8f,
-    0xb5,
-    0x90,
-    0x0d,
-    0x98,
-    0x5f,
-    0x85,
-    0x95,
-    0x0d,
-    0x1e,
-    0x2e,
-    0x22,
-    0x0e,
-    0x62,
-    0xd1,
-    0x32,
-    0x34,
-    0x2e,
-    0xef,
-    0x92,
-    0x25,
-    0x63,
-    0x76,
-    0xc7,
-    0x66,
-    0x41,
-    0x38,
-    0xad,
-    0x71,
-    0x2b,
-    0x9c,
-    0x5e,
-    0x08,
-    0xaa,
-    0x93,
-    0x55,
-    0xc8,
-    0xb5,
-    0xce,
-    0xd4,
-    0x01,
-    0x30,
-    0x2f,
-    0x82,
-    0xc5,
-    0xb2,
-    0x7d,
-    0x59,
-    0x3f,
-    0x8b,
-    0x5b,
-    0xbf,
-    0x46,
-    0x06,
-    0x7b,
-    0xf3,
-    0x32,
-    0xeb,
-    0x0f,
-    0xab,
-    0xef,
-    0x48,
-    0x80,
-    0xfc,
-    0x50,
-    0x71,
-    0x63,
-    0x79,
-    0xa5,
-    0x46,
-    0xa9,
-    0x9f,
-    0x8f,
-    0xb4,
-    0x15,
-    0x71,
-    0x13,
-    0x7f,
-    0xf4,
-    0x5f,
-    0xee,
-    0x3e,
-    0x08,
-    0x6c,
-    0x28,
-    0xa7,
-    0xc5,
-    0x90,
-    0xec,
-    0x0c,
-    0xc0,
-    0x5b,
-    0x97,
-    0x26,
-    0x64,
-    0xdc,
-    0x0f,
-    0x12,
-    0xe6,
-    0xc1,
-    0x56,
-    0x99,
-    0x7c,
-    0xbf,
-    0x5f,
-    0xb4,
-    0xca,
-    0x35,
-    0x20,
-    0x4f,
-    0x9d,
-    0x0c,
-    0xe8,
-    0x4e,
-    0xdc,
-    0xe1,
-    0xf3,
-    0xce,
-    0xbc,
-    0x66,
-    0x3c,
-    0xad,
-    0x32,
-    0x05,
-    0x92,
-    0x4c,
-    0xae,
-    0xc7,
-    0xee,
-    0x93,
-    0x06,
-    0x75,
-    0x04,
-    0x36,
-    0xb0,
-    0xfd,
-    0x18,
-    0x37,
-    0x35,
-    0x16,
-    0x13,
-    0xad,
-    0xe2,
-    0x27,
-    0xd6,
-    0xc3,
-    0xc1,
-    0x65,
-    0xce,
-    0x03,
-    0xc8,
-    0x3c,
-    0xc8,
-    0xd5,
-    0x4f,
-    0xf1,
-    0x07,
-    0x42,
-    0xc8,
-    0x85,
-    0x94,
-    0xfe,
-    0xaa,
-    0xdc,
-    0xd6,
-    0xa6,
-    0xae,
-    0x1f,
-    0x62,
-    0x46,
-    0x3e,
-    0x5e,
-    0x14,
-    0x1e,
-    0x2a,
-    0x7a,
-    0x5f,
-    0xa6,
-    0x9e,
-    0x42,
-    0xe1,
-    0xcf,
-    0x51,
-    0xdc,
-    0x3b,
-    0x8c,
-    0xfe,
-    0x67,
-    0x1f,
-    0x91,
-    0x18,
-    0xde,
-    0xab,
-    0x5a,
-    0xba,
-    0x3f,
-    0xf5,
-    0x70,
-    0xdd,
-    0xed,
-    0xe7,
-    0xe8,
-    0xcd,
-    0x53,
-    0x4d,
-    0x2c,
-    0xde,
-    0xcb,
-    0x2c,
-    0xfe,
-    0x5a,
-    0xbe,
-    0x55,
-    0xb9,
-    0xbf,
-    0x0c,
-    0x3b,
-    0xda,
-    0x27,
-    0xae,
-    0x02,
-    0xc0,
-    0x08,
-    0x9a,
-    0xd8,
-    0xb0,
-    0x1d,
-    0xe6,
-    0x88,
-    0x1c,
-    0xa4,
-    0x31,
-    0x4c,
-    0x25,
-    0xca,
-    0x3f,
-    0xe3,
-    0x5e,
-    0x64,
-    0xe3,
-    0xe4,
-    0xd3,
-    0xdf,
-    0x22,
-    0x52,
-    0x4a,
-    0x7a,
-    0x95,
-    0x70,
-    0xc8,
-    0xb2,
-    0x0f,
-    0xd7,
-    0x57,
-    0xfe,
-    0x80,
-    0xc5,
-    0x07,
-    0xbd,
-    0x19,
-    0xb8,
-    0x33,
-    0x6d,
-    0xb1,
-    0x3c,
-    0x05,
-    0x1d,
-    0x68,
-    0x01,
-    0x3c,
-    0x25,
-    0x8a,
-    0x30,
-    0x2d,
-    0x14,
-    0xb6,
-    0xff,
-    0x08,
-    0xea,
-    0x3f,
-    0x84,
-    0x5d,
-    0x88,
-    0xd2,
-    0xc6,
-    0xdf,
-    0x64,
-    0x59,
-    0x1a,
-    0x67,
-    0x81,
-    0x20,
-    0xad,
-    0x3c,
-    0x9f,
-    0x36,
-    0x5d,
-    0x91,
-    0xaf,
-    0x17,
-    0xcd,
-    0x4f,
-    0x89,
-    0x87,
-    0xb8,
-    0x15,
-    0xe1,
-    0xc1,
-    0x85,
-    0x7d,
-    0x77,
-    0xd1,
-    0x1c,
-    0xa2,
-    0x8f,
-    0x3f,
-    0xf9,
-    0xdf,
-    0xa1,
-    0xed,
-    0x7e,
-    0xd9,
-    0x51,
-    0x42,
-    0x8e,
-    0xbf,
-    0xa1,
-    0x88,
-    0x57,
-    0xd0,
-    0x66,
-    0x93,
-    0x6f,
-    0x1e,
-    0xf9,
-    0xa4,
-    0x23,
-    0x92,
-    0x2e,
-    0x8d,
-    0x0c,
-    0x31,
-    0x8a,
-    0x15,
-    0xe3,
-    0x9d,
-    0xb0,
-    0x9d,
-    0x95,
-    0xdf,
-    0x1d,
-    0x04,
-    0x9a,
-    0x63,
-    0x15,
-    0xc9,
-    0x83,
-    0x44,
-    0xdd,
-    0x6f,
-    0xd3,
-    0xcb,
-    0x2b,
-    0x26,
-    0x10,
-    0x32,
-    0xdb,
-    0xa7,
-    0x1a,
-    0xad,
-    0xe3,
-    0x60,
-    0xbb,
-    0xab,
-    0x89,
-    0xd1,
-    0x7e,
-    0x58,
-    0xd4,
-    0x36,
-    0xc5,
-    0x67,
-    0x40,
-    0x66,
-    0x16,
-    0x10,
-    0xb5,
-    0xfb,
-    0xb6,
-    0x54,
-    0xba,
-    0xb3,
-    0x79,
-    0x88,
-    0xe7,
-    0x16,
-    0xd8,
-    0x11,
-    0x98,
-    0x59,
-    0x44,
-    0x6d,
-    0xe9,
-    0x83,
-    0xba,
-    0x73,
-    0xde,
-    0xce,
-    0x98,
-    0xdb,
-    0xe1,
-    0x50,
-    0xaf,
-    0x00,
-    0x72,
-    0xda,
-    0x99,
-    0xe5,
-    0x1a,
-    0x21,
-    0x4c,
-    0x76,
-    0xa0,
-    0x1b,
-    0xf0,
-    0x11,
-    0x80,
-    0xac,
-    0xee,
-    0x45,
-    0x99,
-    0x82,
-    0x4a,
-    0xda,
-    0x26,
-    0x3e,
-    0x32,
-    0x11,
-    0xef,
-    0xd4,
-    0xd7,
-    0x2c,
-    0xc1,
-    0x34,
-    0x7b,
-    0x31,
-    0x1b,
-    0x2a,
-    0xcb,
-    0xec,
-    0x2a,
-    0x82,
-    0x70,
-    0x33,
-    0xf7,
-    0x71,
-    0xe1,
-    0x6e,
-    0xe0,
-    0x30,
-    0x7b,
-    0x56,
-    0x45,
-    0xea,
-    0xd3,
-    0xfc,
-    0x83,
-    0xd8,
-    0x4b,
-    0x0d,
-    0x26,
-    0xab,
-    0xe3,
-    0x55,
-    0x5a,
-    0x2a,
-    0x52,
-    0x83,
-    0xa3,
-    0x1c,
-    0x56,
-    0x2c,
-    0xce,
-    0x68,
-    0x48,
-    0x12,
-    0x28,
-    0x7b,
-    0xf3,
-    0xa5,
-    0xed,
-    0xea,
-    0xa6,
-    0xca,
-    0x03,
-    0x58,
-    0x88,
-    0xdc,
-    0xe8,
-    0x9b,
-    0x2c,
-    0xf0,
-    0xea,
-    0x1a,
-    0x65,
-    0x5e,
-    0x96,
-    0x79,
-    0x5c,
-    0x7d,
-    0x72,
-    0x79,
-    0xdf,
-    0xad,
-    0xef,
-    0x19,
-    0xfc,
-    0x9b,
-    0x99,
-    0x02,
-    0xcf,
-    0xc0,
-    0x91,
-    0x21,
-    0x98,
-    0x2b,
-    0x3d,
-    0x96,
-    0x10,
-    0x81,
-    0x3e,
-    0xcd,
-    0xfe,
-    0x42,
-    0xa2,
-    0xea,
-    0x05,
-    0x4d,
-    0x5b,
-    0x6b,
-    0xc0,
-    0xa7,
-    0xf0,
-    0x08,
-    0x11,
-    0x78,
-    0x73,
-    0xde,
-    0xb5,
-    0x56,
-    0xb3,
-    0xcd,
-    0x1c,
-    0xc6,
-    0xb2,
-    0x1f,
-    0x78,
-    0x00,
-    0x5a,
-    0x6a,
-    0x15,
-    0xf3,
-    0x6b,
-    0xb7,
-    0xe8,
-    0x89,
-    0xb8,
-    0xe3,
-    0x6a,
-    0x2c,
-    0x93,
-    0x46,
-    0xa7,
-    0x89,
-    0x86,
-    0x93,
-    0x91,
-    0x94,
-    0x44,
-    0xff,
-    0x9b,
-    0xcc,
-    0xde,
-    0xa6,
-    0x83,
-    0xc0,
-    0x3a,
-    0x2a,
-    0x6f,
-    0xd2,
-    0xc2,
-    0x9d,
-    0x3c,
-    0x3b,
-    0x59,
-    0xa1,
-    0x13,
-    0x4f,
-    0x93,
-    0xcd,
-    0x3d,
-    0x02,
-    0x25,
-    0x53,
-    0x38,
-    0xac,
-    0x9a,
-    0xe0,
-    0x0a,
-    0x09,
-    0x48,
-    0xc4,
-    0xd5,
-    0x84,
-    0x83,
-    0x53,
-    0xac,
-    0xb5,
-    0x10,
-    0x8b,
-    0xa5,
-    0x28,
-    0xdc,
-    0xf7,
-    0x2f,
-    0x60,
-    0xee,
-    0xd2,
-    0xa6,
-    0x1b,
-    0x9b,
-    0x70,
-    0x25,
-    0xd8,
-    0xf9,
-    0xda,
-    0x9c,
-    0x97,
-    0x96,
-    0xb9,
-    0x22,
-    0xe0,
-    0x69,
-    0x75,
-    0x8c,
-    0x06,
-    0x08,
-    0x9d,
-    0x3e,
-    0xad,
-    0x1c,
-    0x8a,
-    0x41,
-    0x8a,
-    0x12,
-    0x3f,
-    0x96,
-    0x6a,
-    0x14,
-    0x94,
-    0xca,
-    0x76,
-    0x38,
-    0x94,
-    0xcb,
-    0xb5,
-    0xf7,
-    0x23,
-    0xfa,
-    0xd2,
-    0xe0,
-    0xe4,
-    0x81,
-    0x20,
-    0x8d,
-    0x59,
-    0xe7,
-    0xdb,
-    0xd7,
-    0x4c,
-    0xe2,
-    0xb1,
-    0x46,
-    0x6e,
-    0x6c,
-    0x80,
-    0xcb,
-    0x3f,
-    0x18,
-    0x62,
-    0xb2,
-    0x2d,
-    0xa7,
-    0xe7,
-    0xd2,
-    0x00,
-    0xd6,
-    0xa1,
-    0x07,
-    0x75,
-    0x7b,
-    0xe6,
-    0xe2,
-    0x29,
-    0xd0,
-    0xd1,
-    0x9e,
-    0xb9,
-    0x0f,
-    0x8a,
-    0x56,
-    0x28,
-    0x3f,
-    0xc7,
-    0x76,
-    0x81,
-    0x4d,
-    0x93,
-    0x70,
-    0xbd,
-    0x5e,
-    0x4f,
-    0xb0,
-    0xe6,
-    0x64,
-    0xf6,
-    0xd1,
-    0x7d,
-    0xef,
-    0xa5,
-    0x11,
-    0x1a,
-    0x47,
-    0x5a,
-    0x02,
-    0x52,
-    0xb7,
-    0xfb,
-    0x83,
-    0xdd,
-    0x2b,
-    0x9b,
-    0xef,
-    0xf8,
-    0xfe,
-    0xfa,
-    0x94,
-    0x09,
-    0x0d,
-    0x4a,
-    0x67,
-    0x82,
-    0x10,
-    0x39,
-    0xf5,
-    0x07,
-    0x2a,
-    0x2b,
-    0x9d,
-    0xd3,
-    0xbe,
-    0xc7,
-    0xfd,
-    0x58,
-    0x85,
-    0xb6,
-    0xaa,
-    0x25,
-    0xdd,
-    0xa7,
-    0x24,
-    0x0d,
-    0x64,
-    0x97,
-    0x09,
-    0x86,
-    0xc6,
-    0x4f,
-    0x88,
-    0x4f,
-    0xd3,
-    0x2e,
-    0x19,
-    0x56,
-    0xd5,
-    0x28,
-    0x6b,
-    0xd8,
-    0x20,
-    0x0f,
-    0x9e,
-    0xca,
-    0xea,
-    0x11,
-    0xb3,
-    0x78,
-    0x5d,
-    0x83,
-    0x41,
-    0x6c,
-    0xeb,
-    0xdd,
-    0x69,
-    0x91,
-    0xe2,
-    0x05,
-    0x0b,
-    0x98,
-    0x40,
-    0xd0,
-    0x3a,
-    0x9b,
-    0xc8,
-    0xc6,
-    0xee,
-    0x00,
-    0x55,
-    0x25,
-    0xf9,
-    0xa1,
-    0x6f,
-    0x29,
-    0x3d,
-    0x29,
-    0x1c,
-    0x8b,
-    0x1b,
-    0xc1,
-    0xf8,
-    0x47,
-    0x2f,
-    0xed,
-    0x88,
-    0xa3,
-    0x3a,
-    0xb0,
-    0xcc,
-    0x6d,
-    0x5f,
-    0xf7,
-    0x13,
-    0x84,
-    0x93,
-    0x35,
-    0x13,
-    0x9a,
-    0x4f,
-    0x4a,
-    0x39,
-    0x37,
-    0x87,
-    0xa9,
-    0x3e,
-    0x01,
-    0xe0,
-    0xba,
-    0xfb,
-    0x3c,
-    0x1e,
-    0x7d,
-    0x7e,
-    0x8d,
-    0xdb,
-    0x71,
-    0x5d,
-    0x03,
-    0x7f,
-    0xb4,
-    0x4a,
-    0x57,
-    0x6c,
-    0x6b,
-    0xe8,
-    0x73,
-    0x79,
-    0x64,
-    0xde,
-    0x32,
-    0xa2,
-    0xfa,
-    0x29,
-    0x67,
-    0xfe,
-    0x39,
-    0xb6,
-    0x20,
-    0xf1,
-    0x43,
-    0x30,
-    0x2c,
-    0xa2,
-    0xf2,
-    0x17,
-    0xda,
-    0xaf,
-    0xbf,
-    0x12,
-    0x04,
-    0x20,
-    0xe3,
-    0x86,
-    0x4c,
-    0x9a,
-    0xbc,
-    0x67,
-    0xa6,
-    0xd5,
-    0x71,
-    0x4e,
-    0x17,
-    0x50,
-    0xd9,
-    0xcc,
-    0xbc,
-    0x44,
-    0x99,
-    0xff,
-    0x0d,
-    0xd6,
-    0x8d,
-    0x62,
-    0x63,
-    0x90,
-    0x6a,
-    0xe9,
-    0xb8,
-    0x12,
-    0xa1,
-    0x4e,
-    0xae,
-    0x05,
-    0x86,
-    0xa5,
-    0xd3,
-    0x51,
-    0xb1,
-    0x37,
-    0x24,
-    0x90,
-    0xa4,
-    0x8d,
-    0xd0,
-    0xc2,
-    0xaf,
-    0xcb,
-    0x3e,
-    0x42,
-    0x11,
-    0x40,
-    0x50,
-    0xf9,
-    0x60,
-    0x3a,
-    0xea,
-    0xd1,
-    0x2b,
-    0x1f,
-    0xae,
-    0x6c,
-    0xdd,
-    0xb9,
-    0x0a,
-    0x17,
-    0xe4,
-    0xd2,
-    0x75,
-    0xf9,
-    0x13,
-    0x01,
-    0xf5,
-    0x90,
-    0x45,
-    0xc3,
-    0xe5,
-    0x5f,
-    0x44,
-    0xcd,
-    0xf5,
-    0xe0,
-    0xe9,
-    0xa1,
-    0x72,
-    0xc0,
-    0x84,
-    0x60,
-    0xc8,
-    0x4b,
-    0x7d,
-    0xdf,
-    0x45,
-    0x26,
-    0x3c,
-    0xfc,
-    0x1f,
-    0x3c,
-    0x47,
-    0x33,
-    0xb9,
-    0xfa,
-    0xaa,
-    0x6c,
-    0x22,
-    0xbf,
-    0x9c,
-    0x17,
-    0xde,
-    0x8e,
-    0x5f,
-    0x7b,
-    0xea,
-    0x07,
-    0x68,
-    0x4b,
-    0xfa,
-    0x95,
-    0xc0,
-    0x7b,
-    0x05,
-    0xe8,
-    0xaa,
-    0x51,
-    0x03,
-    0xa6,
-    0x86,
-    0xbf,
-    0xf6,
-    0x5d,
-    0xf5,
-    0xf0,
-    0x27,
-    0xbd,
-    0x3e,
-    0x21,
-    0xb2,
-    0x04,
-    0xf1,
-    0xb2,
-    0x44,
-    0xb9,
-    0xca,
-    0x7d,
-    0x24,
-    0x9d,
-    0xd7,
-    0x66,
-    0x70,
-    0xdf,
-    0xdd,
-    0x33,
-    0xaa,
-    0x8f,
-    0xf9,
-    0x9f,
-    0x73,
-    0x55,
-    0x83,
-    0xa9,
-    0x95,
-    0x63,
-    0x37,
-    0x32,
-    0x47,
-    0xa8,
-    0x97,
-    0xc7,
-    0xad,
-    0x46,
-    0x8b,
-    0xbc,
-    0x9f,
-    0x47,
-    0x4b,
-    0x7a,
-    0xab,
-    0x8b,
-    0x7e,
-    0x19,
-    0x5d,
-    0x05,
-    0xa4,
-    0x32,
-    0xbd,
-    0x28,
-    0xb1,
-    0xee,
-    0x1a,
-    0x9b,
-    0xfa,
-    0x63,
-    0x06,
-    0x34,
-    0x55,
-    0x21,
-    0xa2,
-    0x24,
-    0x7c,
-    0x07,
-    0x1c,
-    0x6f,
-    0xb3,
-    0x5c,
-    0x75,
-    0xa0,
-    0xab,
-    0x1b,
-    0x88,
-    0xba,
-    0xa5,
-    0x8d,
-    0x48,
-    0x71,
-    0xda,
-    0x1d,
-    0x49,
-    0x9a,
-    0x1b,
-    0x69,
-    0x82,
-    0xe1,
-    0xb5,
-    0x95,
-    0x51,
-    0xba,
-    0x97,
-    0xe4,
-    0xbf,
-    0x9a,
-    0xb7,
-    0x89,
-    0x06,
-    0x66,
-    0xb1,
-    0xba,
-    0x50,
-    0x2c,
-    0xb1,
-    0x07,
-    0xc2,
-    0x11,
-    0x94,
-    0xea,
-    0xb9,
-    0x8a,
-    0x4a,
-    0x9f,
-    0x53,
-    0xcf,
-    0x7f,
-    0x35,
-    0x32,
-    0x8d,
-    0x7a,
-    0xe6,
-    0x7c,
-    0xdb,
-    0x45,
-    0xa4,
-    0x26,
-    0x70,
-    0x0e,
-    0xf4,
-    0x73,
-    0x13,
-    0xcd,
-    0xff,
-    0xb7,
-    0x52,
-    0x27,
-    0xe6,
-    0x61,
-    0x77,
-    0x92,
-    0x57,
-    0x38,
-    0xb8,
-    0xbb,
-    0x5e,
-    0xe5,
-    0xae,
-    0x25,
-    0x7d,
-    0xb2,
-    0x09,
-    0x12,
-    0xfe,
-    0x91,
-    0x81,
-    0xa6,
-    0x88,
-    0x60,
-    0x10,
-    0x4a,
-    0xf1,
-    0x6b,
-    0x5e,
-    0x4f,
-    0x53,
-    0x33,
-    0x7d,
-    0xd3,
-    0x62,
-    0x6e,
-    0xd6,
-    0xe9,
-    0xfc,
-    0x4e,
-    0x63,
-    0xf4,
-    0x02,
-    0x06,
-    0x1f,
-    0x54,
-    0x67,
-    0x8b,
-    0xbb,
-    0x45,
-    0x86,
-    0x97,
-    0x93,
-    0x03,
-    0xb9,
-    0xf4,
-    0xe0,
-    0x33,
-    0x27,
-    0xf7,
-    0x2f,
-    0x7e,
-    0xdd,
-    0x4b,
-    0x12,
-    0x7f,
-    0x21,
-    0xef,
-    0x15,
-    0xdf,
-    0x02,
-    0x82,
-    0xf3,
-    0xbe,
-    0x34,
-    0xbf,
-    0x0a,
-    0x55,
-    0x1b,
-    0x44,
-    0x0d,
-    0xda,
-    0x26,
-    0x97,
-    0xf9,
-    0xa4,
-    0x5e,
-    0x6a,
-    0x4a,
-    0x90,
-    0x3f,
-    0x1e,
-    0x6e,
-    0xa3,
-    0xc6,
-    0x87,
-    0x7a,
-    0xf1,
-    0xcb,
-    0xef,
-    0x1c,
-    0xbd,
-    0x91,
-    0x5d,
-    0xd0,
-    0xe1,
-    0x9c,
-    0x17,
-    0x57,
-    0x71,
-    0xc2,
-    0x65,
-    0x66,
-    0x9b,
-    0x85,
-    0x98,
-    0x9b,
-    0xd1,
-    0xa0,
-    0x4b,
-    0xb4,
-    0x2b,
-    0xe0,
-    0xe9,
-    0x03,
-    0x06,
-    0x35,
-    0x6f,
-    0x1d,
-    0xf2,
-    0x09,
-    0x73,
-    0xd3,
-    0xcb,
-    0xd0,
-    0x66,
-    0x63,
-    0x25,
-    0xe1,
-    0x16,
-    0xef,
-    0xed,
-    0x84,
-    0x76,
-    0x2d,
-    0x4e,
-    0x4c,
-    0xa2,
-    0x61,
-    0xd2,
-    0xa7,
-    0x1e,
-    0x88,
-    0xca,
-    0xb3,
-    0x5e,
-    0xd6,
-    0xef,
-    0x53,
-    0x8c,
-    0x63,
-    0x49,
-    0x83,
-    0x85,
-    0x22,
-    0x50,
-    0xe8,
-    0x25,
-    0x12,
-    0x52,
-    0xab,
-    0xc4,
-    0xb8,
-    0x14,
-    0x88,
-    0x00,
-    0xcc,
-    0xbc,
-    0x22,
-    0xbd,
-    0x33,
-    0xee,
-    0x9a,
-    0x6b,
-    0x2d,
-    0x36,
-    0x5f,
-    0x88,
-    0xd0,
-    0xa6,
-    0x48,
-    0x65,
-    0xb5,
-    0xc0,
-    0xe0,
-    0x2c,
-    0xf1,
-    0x96,
-    0x01,
-    0x22,
-    0x46,
-    0x2f,
-    0xa4,
-    0x2a,
-    0x9b,
-    0x2d,
-    0xf7,
-    0x8b,
-    0xaa,
-    0xad,
-    0xb0,
-    0xf2,
-    0xf9,
-    0x6f,
-    0xa1,
-    0xbb,
-    0x0b,
-    0x37,
-    0x8d,
-    0x6c,
-    0xd7,
-    0x72,
-    0x3b,
-    0x82,
-    0x79,
-    0x1d,
-    0xc8,
-    0x71,
-    0x28,
-    0xe3,
-    0x41,
-    0xe6,
-    0x68,
-    0x85,
-    0x72,
-    0x4f,
-    0x80,
-    0x7f,
-    0xf8,
-    0x9d,
-    0x2f,
-    0xe9,
-    0x9e,
-    0x48,
-    0x9b,
-    0x9b,
-    0xe6,
-    0x94,
-    0x8a,
-    0x94,
-    0xe5,
-    0x14,
-    0xd4,
-    0x9d,
-    0x54,
-    0x6c,
-    0x19,
-    0x29,
-    0xe5,
-    0x5a,
-    0xaf,
-    0x80,
-    0xd3,
-    0xf8,
-    0xde,
-    0x1c,
-    0xbd,
-    0x3b,
-    0x50,
-    0x53,
-    0xb4,
-    0xc0,
-    0xc3,
-    0x37,
-    0x93,
-    0xc8,
-    0x01,
-    0xbb,
-    0x8e,
-    0x81,
-    0x12,
-    0x17,
-    0x0e,
-    0x87,
-    0xb0,
-    0x6d,
-    0xbd,
-    0xaa,
-    0xfb,
-    0xac,
-    0xdc,
-    0xf2,
-    0x6e,
-    0xb5,
-    0xdd,
-    0xe0,
-    0x12,
-    0xbc,
-    0x2e,
-    0xf7,
-    0xf1,
-    0xf1,
-    0x53,
-    0x7b,
-    0xce,
-    0x60,
-    0x37,
-    0x79,
-    0x13,
-    0x16,
-    0xc4,
-    0x07,
-    0x0b,
-    0x86,
-    0xb1,
-    0xcd,
-    0x51,
-    0x2b,
-    0x9b,
-    0xc4,
-    0x89,
-    0x6e,
-    0x58,
-    0x3e,
-    0x4d,
-    0xc9,
-    0x88,
-    0x27,
-    0x6a,
-    0x2d,
-    0x6c,
-    0x8a,
-    0x4d,
-    0xa1,
-    0xfc,
-    0x56,
-    0xb8,
-    0x2d,
-    0x33,
-    0x63,
-    0xba,
-    0xf6,
-    0xae,
-    0xb0,
-    0xdd,
-    0xaa,
-    0x75,
-    0xef,
-    0xa1,
-    0x1e,
-    0x19,
-    0x43,
-    0x29,
-    0x36,
-    0xff,
-    0x48,
-    0x35,
-    0x06,
-    0xfb,
-    0x54,
-    0x50,
-    0x36,
-    0x20,
-    0xfc,
-    0x4b,
-    0xab,
-    0xd7,
-    0xda,
-    0xe9,
-    0x63,
-    0x2f,
-    0x8e,
-    0xdc,
-    0xa1,
-    0x74,
-    0x03,
-    0xf0,
-    0x4b,
-    0x03,
-    0xf4,
-    0x87,
-    0x90,
-    0x5c,
-    0xae,
-    0x45,
-    0xcd,
-    0x79,
-    0x17,
-    0x0c,
-    0xb2,
-    0x5f,
-    0xef,
-    0x2b,
-    0xa1,
-    0xf2,
-    0x56,
-    0xd2,
-    0x56,
-    0x0d,
-    0x8e,
-    0xca,
-    0xcd,
-    0xd2,
-    0x03,
-    0x62,
-    0x60,
-    0x3f,
-    0x88,
-    0xad,
-    0x31,
-    0x02,
-    0xe4,
-    0xea,
-    0xc7,
-    0x8f,
-    0x8d,
-    0x44,
-    0xfc,
-    0x6f,
-    0xb3,
-    0xbc,
-    0x16,
-    0xdb,
-    0x80,
-    0x63,
-    0x34,
-    0x89,
-    0x9f,
-    0xcc,
-    0xec,
-    0xc6,
-    0xfb,
-    0xc1,
-    0x32,
-    0xc5,
-    0xc9,
-    0x35,
-    0x7b,
-    0x37,
-    0xc8,
-    0x7a,
-    0x23,
-    0x1b,
-    0xc7,
-    0xb4,
-    0x0c,
-    0xd8,
-    0x69,
-    0x8e,
-    0x89,
-    0x89,
-    0x25,
-    0x2b,
-    0x7a,
-    0x98,
-    0x90,
-    0x60,
-    0xb8,
-    0x8e,
-    0xdf,
-    0x20,
-    0xb3,
-    0x29,
-    0xa7,
-    0x37,
-    0x59,
-    0xb0,
-    0xe8,
-    0x3b,
-    0x3a,
-    0x83,
-    0x4a,
-    0xc0,
-    0xea,
-    0xf6,
-    0xa6,
-    0xcc,
-    0xa7,
-    0x5f,
-    0xc8,
-    0x8b,
-    0x3c,
-    0x6e,
-    0x74,
-    0x43,
-    0x25,
-    0xbd,
-    0xa6,
-    0x89,
-    0xf4,
-    0xa8,
-    0x1e,
-    0xb6,
-    0xf4,
-    0x5f,
-    0x1c,
-    0x95,
-    0x0b,
-    0x39,
-    0x69,
-    0x5e,
-    0xe5,
-    0x4c,
-    0x96,
-    0xe8,
-    0x4e,
-    0x3a,
-    0x88,
-    0x1a,
-    0xe0,
-    0x4d,
-    0x35,
-    0xa3,
-    0xdf,
-    0xc7,
-    0xa8,
-    0xea,
-    0x61,
-    0x73,
-    0x4b,
-    0x48,
-    0xb2,
-    0x80,
-    0x65,
-    0x76,
-    0xf6,
-    0x8f,
-    0xe2,
-    0x41,
-    0x10,
-    0x0b,
-    0x53,
-    0x85,
-    0xc3,
-    0xb9,
-    0x35,
-    0x58,
-    0x17,
-    0x90,
-    0x76,
-    0x86,
-    0xff,
-    0xca,
-    0x35,
-    0x3e,
-    0x38,
-    0x3b,
-    0xca,
-    0x0a,
-    0x74,
-    0xe2,
-    0x06,
-    0x04,
-    0xb8,
-    0xbe,
-    0xbb,
-    0x48,
-    0x03,
-    0xe2,
-    0x7f,
-    0xa5,
-    0x30,
-    0xcc,
-    0xae,
-    0x98,
-    0x1d,
-    0xf3,
-    0xae,
-    0x7a,
-    0x0d,
-    0x9f,
-    0x77,
-    0xf8,
-    0x4b,
-    0xfd,
-    0x52,
-    0xc4,
-    0x11,
-    0x73,
-    0xe0,
-    0x8a,
-    0xa7,
-    0x31,
-    0x5f,
-    0x26,
-    0xcf,
-    0x09,
-    0x29,
-    0x14,
-    0x61,
-    0x80,
-    0x7d,
-    0x27,
-    0x33,
-    0x25,
-    0x82,
-    0x7e,
-    0x3b,
-    0x21,
-    0x89,
-    0xb5,
-    0xf8,
-    0x10,
-    0x93,
-    0x58,
-    0x0d,
-    0x0f,
-    0x13,
-    0x9d,
-    0x30,
-    0x16,
-    0xf5,
-    0x52,
-    0x42,
-    0x89,
-    0xde,
-    0x14,
-    0xbf,
-    0x09,
-    0xb6,
-    0xc2,
-    0x59,
-    0x90,
-    0x64,
-    0x31,
-    0xe0,
-    0xbd,
-    0xd8,
-    0x21,
-    0x65,
-    0x6c,
-    0x4f,
-    0x70,
-    0x9f,
-    0x8a,
-    0xd2,
-    0x8e,
-    0x8e,
-    0x28,
-    0x00,
-    0x31,
-    0x5d,
-    0xcd,
-    0x0e,
-    0x4a,
-    0x8d,
-    0x11,
-    0x0c,
-    0x37,
-    0x50,
-    0x67,
-    0x6a,
-    0x3a,
-    0x33,
-    0x3b,
-    0xba,
-    0x2a,
-    0x00,
-    0x3d,
-    0xb7,
-    0x68,
-    0xe3,
-    0xfc,
-    0x87,
-    0x15,
-    0xcb,
-    0xb6,
-    0x3d,
-    0x82,
-    0x13,
-    0x6e,
-    0xa2,
-    0xe8,
-    0x62,
-    0x40,
-    0x35,
-    0x5a,
-    0xd0,
-    0xf2,
-    0x70,
-    0xf7,
-    0x4a,
-    0xcb,
-    0x4d,
-    0x64,
-    0x37,
-    0xa8,
-    0x09,
-    0x7a,
-    0x5b,
-    0x4c,
-    0x28,
-    0x3b,
-    0xfc,
-    0xf8,
-    0xb9,
-    0x0b,
-    0x44,
-    0x3b,
-    0xdb,
-    0x1d,
-    0xe7,
-    0x0c,
-    0x80,
-    0x2b,
-    0x06,
-    0x16,
-    0x71,
-    0x6a,
-    0x52,
-    0x53,
-    0x93,
-    0xbd,
-    0x74,
-    0xdc,
-    0x68,
-    0x28,
-    0xad,
-    0x00,
-    0xd8,
-    0x88,
-    0xb9,
-    0x93,
-    0x32,
-    0x82,
-    0xfa,
-    0x88,
-    0x6e,
-    0xba,
-    0xd2,
-    0xc3,
-    0xb5,
-    0x45,
-    0x51,
-    0x28,
-    0x23,
-    0x60,
-    0x10,
-    0xf8,
-    0xcb,
-    0x62,
-    0x5c,
-    0x5d,
-    0xfb,
-    0xef,
-    0x97,
-    0x43,
-    0xc2,
-    0x6f,
-    0xdc,
-    0x6a,
-    0xb0,
-    0xbe,
-    0xe2,
-    0xb9,
-    0xdd,
-    0x25,
-    0x23,
-    0xd6,
-    0x2c,
-    0x8a,
-    0x3d,
-    0xf3,
-    0xd1,
-    0xe3,
-    0x98,
-    0xeb,
-    0x11,
-    0xf1,
-    0x49,
-    0x8d,
-    0x49,
-    0x2a,
-    0x36,
-    0x37,
-    0x32,
-    0xf7,
-    0x7b,
-    0xa8,
-    0x63,
-    0x1f,
-    0x0d,
-    0x0f,
-    0x18,
-    0x83,
-    0x9d,
-    0x67,
-    0x31,
-    0x0d,
-    0xc0,
-    0x07,
-    0x7e,
-    0xe3,
-    0x4c,
-    0x75,
-    0x39,
-    0xe0,
-    0x05,
-    0x7c,
-    0xd4,
-    0x44,
-    0x79,
-    0x7e,
-    0xf6,
-    0xaa,
-    0x28,
-    0x0b,
-    0xc0,
-    0x3b,
-    0xe8,
-    0xb1,
-    0x54,
-    0x22,
-    0x88,
-    0x16,
-    0x98,
-    0x3f,
-    0xb4,
-    0x45,
-    0x37,
-    0x20,
-    0x18,
-    0x46,
-    0xe9,
-    0x2d,
-    0xc9,
-    0xf1,
-    0xf5,
-    0x22,
-    0xe0,
-    0x03,
-    0xf4,
-    0xc3,
-    0x68,
-    0x72,
-    0xd7,
-    0xcb,
-    0x7a,
-    0xfe,
-    0x2b,
-    0x25,
-    0xa6,
-    0x09,
-    0x9c,
-    0x5e,
-    0x95,
-    0xa8,
-    0xb8,
-    0x5b,
-    0xed,
-    0xfa,
-    0xf6,
-    0x47,
-    0x75,
-    0xb9,
-    0xf7,
-    0xd0,
-    0x7a,
-    0x0e,
-    0x0b,
-    0x93,
-    0x71,
-    0xaa,
-    0xf7,
-    0xd4,
-    0xdd,
-    0x12,
-    0xf6,
-    0x73,
-    0x73,
-    0x3a,
-    0xfd,
-    0x1b,
-    0x7c,
-    0x56,
-    0x43,
-    0xbd,
-    0x7c,
-    0xed,
-    0x01,
-    0x3d,
-    0x11,
-    0x2f,
-    0x76,
-    0x6b,
-    0x1d,
-    0x88,
-    0x2f,
-    0x34,
-    0x27,
-    0x75,
-    0x85,
-    0x1a,
-    0xff,
-    0x97,
-    0x67,
-    0xe1,
-    0xa1,
-    0x06,
-    0x5a,
-    0x8b,
-    0x5c,
-    0xe7,
-    0xbd,
-    0x87,
-    0x34,
-    0x41,
-    0x52,
-    0x26,
-    0x84,
-    0x0c,
-    0xfa,
-    0x4e,
-    0xe8,
-    0x8b,
-    0xc0,
-    0x72,
-    0x59,
-    0xdc,
-    0x19,
-    0xc1,
-    0x9a,
-    0xce,
-    0x6a,
-    0x9e,
-    0xd4,
-    0xf2,
-    0xcb,
-    0x51,
-    0x7d,
-    0xf5,
-    0x0b,
-    0xfc,
-    0x7d,
-    0x2c,
-    0xf4,
-    0xd0,
-    0x94,
-    0x71,
-    0xd0,
-    0x80,
-    0xf6,
-    0x2e,
-    0x2c,
-    0xf6,
-    0x39,
-    0xb7,
-    0xdb,
-    0x46,
-    0x71,
-    0xdd,
-    0x3e,
-    0xe0,
-    0x9a,
-    0xc0,
-    0xc3,
-    0x09,
-    0x36,
-    0xe4,
-    0xac,
-    0x8c,
-    0x36,
-    0x87,
-    0x12,
-    0xac,
-    0x1e,
-    0x32,
-    0x29,
-    0x5e,
-    0x65,
-    0x8f,
-    0xc5,
-    0xb5,
-    0x1a,
-    0x7a,
-    0x1d,
-    0x9e,
-    0xce,
-    0x5a,
-    0xcf,
-    0xcd,
-    0xad,
-    0xb2,
-    0x25,
-    0xf7,
-    0xee,
-    0xf3,
-    0x97,
-    0x42,
-    0x6e,
-    0x95,
-    0x91,
-    0xfa,
-    0x97,
-    0x65,
-    0x76,
-    0x85,
-    0x87,
-    0x21,
-    0xe4,
-    0x99,
-    0x6e,
-    0x42,
-    0x3a,
-    0xac,
-    0x38,
-    0x19,
-    0x57,
-    0xac,
-    0x6d,
-    0x1d,
-    0xa5,
-    0xf1,
-    0x55,
-    0x84,
-    0x57,
-    0x70,
-    0x5f,
-    0x10,
-    0xee,
-    0x31,
-    0xc3,
-    0x2c,
-    0x02,
-    0x03,
-    0x67,
-    0x37,
-    0x3f,
-    0x6e,
-    0x00,
-    0x20,
-    0xae,
-    0xe9,
-    0x79,
-    0x33,
-    0x35,
-    0x4d,
-    0x98,
-    0x32,
-    0x62,
-    0x8a,
-    0xdf,
-    0xa8,
-    0x64,
-    0x98,
-    0xb0,
-    0x7a,
-    0x5a,
-    0xb1,
-    0xb5,
-    0xbf,
-    0xd1,
-    0xbe,
-    0x7f,
-    0xd1,
-    0x87,
-    0x0f,
-    0x6d,
-    0xa4,
-    0x75,
-    0x4e,
-    0xd0,
-    0x57,
-    0x0d,
-    0xb6,
-    0x4c,
-    0x09,
-    0xc1,
-    0x80,
-    0x82,
-    0xee,
-    0xc4,
-    0x9e,
-    0xeb,
-    0xa2,
-    0x14,
-    0xac,
-    0x07,
-    0xbd,
-    0xb8,
-    0x24,
-    0xb8,
-    0xa7,
-    0x46,
-    0xd1,
-    0xe8,
-    0xae,
-    0xa9,
-    0x86,
-    0x72,
-    0x55,
-    0x21,
-    0x0f
-  ],
-  const [
-    0xbb,
-    0xa0,
-    0x96,
-    0x78,
-    0x75,
-    0xc4,
-    0x74,
-    0x3a,
-    0x54,
-    0xf5,
-    0xb6,
-    0x37,
-    0x53,
-    0x52,
-    0xca,
-    0xb3,
-    0xf6,
-    0x62,
-    0xf2,
-    0x79,
-    0x2e,
-    0x60,
-    0x47,
-    0xcd,
-    0x7d,
-    0xd6,
-    0xfd,
-    0xa1,
-    0x5a,
-    0x6e,
-    0xe8,
-    0x0c,
-    0xd7,
-    0x04,
-    0x3f,
-    0xf7,
-    0x81,
-    0xff,
-    0xa1,
-    0x1a,
-    0x88,
-    0xe2,
-    0x55,
-    0x27,
-    0x20,
-    0x1e,
-    0xd6,
-    0x44,
-    0x26,
-    0x2b,
-    0x8f,
-    0xbf,
-    0x07,
-    0xd6,
-    0xe3,
-    0xfd,
-    0xde,
-    0xdd,
-    0x70,
-    0xb4,
-    0xdc,
-    0xb9,
-    0x95,
-    0x5a,
-    0xed,
-    0xbb,
-    0x31,
-    0xde,
-    0x98,
-    0x5a,
-    0xae,
-    0x95,
-    0x27,
-    0xcc,
-    0x3f,
-    0x77,
-    0x09,
-    0xd3,
-    0x65,
-    0x8b,
-    0x74,
-    0xda,
-    0xb8,
-    0xa0,
-    0x4f,
-    0x40,
-    0xe4,
-    0x3e,
-    0x4e,
-    0xf4,
-    0xf2,
-    0xdc,
-    0x5f,
-    0x42,
-    0xc9,
-    0x53,
-    0x45,
-    0xec,
-    0xf4,
-    0x93,
-    0x82,
-    0x7d,
-    0xa5,
-    0x95,
-    0x7b,
-    0xda,
-    0xfa,
-    0x91,
-    0xd7,
-    0x1a,
-    0x80,
-    0x70,
-    0x28,
-    0x97,
-    0xf6,
-    0x84,
-    0xcd,
-    0x45,
-    0x53,
-    0x77,
-    0x17,
-    0x43,
-    0x0a,
-    0x81,
-    0xaa,
-    0xb0,
-    0x8c,
-    0xde,
-    0x26,
-    0xc0,
-    0x0e,
-    0x80,
-    0x07,
-    0x0f,
-    0x8d,
-    0x01,
-    0xca,
-    0x35,
-    0x10,
-    0xdb,
-    0x52,
-    0x9a,
-    0x2e,
-    0xdb,
-    0x89,
-    0x8c,
-    0xcf,
-    0xd3,
-    0x4a,
-    0x8e,
-    0x37,
-    0x90,
-    0x7f,
-    0xf3,
-    0x40,
-    0x0b,
-    0x86,
-    0xac,
-    0xe6,
-    0xe3,
-    0xda,
-    0x5f,
-    0x09,
-    0x0b,
-    0xef,
-    0xb9,
-    0x6f,
-    0xc0,
-    0x5d,
-    0x04,
-    0x09,
-    0xbf,
-    0x41,
-    0xfc,
-    0x77,
-    0xb4,
-    0xe0,
-    0xde,
-    0xcd,
-    0xf5,
-    0x8e,
-    0xc3,
-    0x98,
-    0x70,
-    0xcf,
-    0x2c,
-    0x1c,
-    0xe3,
-    0xbb,
-    0xde,
-    0xe0,
-    0x4b,
-    0xa7,
-    0xf0,
-    0x6d,
-    0x9e,
-    0x01,
-    0x22,
-    0x52,
-    0xbc,
-    0x7c,
-    0x70,
-    0x6b,
-    0xa3,
-    0x6d,
-    0xe7,
-    0x63,
-    0xe3,
-    0x75,
-    0xb8,
-    0x78,
-    0x53,
-    0x61,
-    0x8b,
-    0x7e,
-    0x01,
-    0x4e,
-    0x15,
-    0x27,
-    0x6f,
-    0x11,
-    0xed,
-    0x81,
-    0xfc,
-    0xd6,
-    0x9b,
-    0xc0,
-    0xa0,
-    0x06,
-    0xf2,
-    0x3e,
-    0xdc,
-    0x6f,
-    0xa1,
-    0xc0,
-    0xf1,
-    0x9f,
-    0x04,
-    0xfb,
-    0x51,
-    0x90,
-    0x40,
-    0x57,
-    0x53,
-    0x8b,
-    0x8e,
-    0xf2,
-    0x2a,
-    0x46,
-    0xd7,
-    0xe8,
-    0x18,
-    0x50,
-    0x82,
-    0xd2,
-    0xdf,
-    0xae,
-    0x8a,
-    0x8c,
-    0x79,
-    0xc7,
-    0xd3,
-    0x3c,
-    0x08,
-    0x7d,
-    0xbe,
-    0x8f,
-    0x10,
-    0x9d,
-    0xfb,
-    0x46,
-    0xe4,
-    0x79,
-    0x9e,
-    0xf2,
-    0x5e,
-    0xd3,
-    0x75,
-    0xfb,
-    0xd3,
-    0xfd,
-    0x99,
-    0xe7,
-    0x46,
-    0x3f,
-    0x44,
-    0xd9,
-    0xdc,
-    0x79,
-    0xe2,
-    0x58,
-    0x90,
-    0x09,
-    0x6b,
-    0x52,
-    0x28,
-    0xef,
-    0xef,
-    0x61,
-    0x68,
-    0x2f,
-    0x73,
-    0x4c,
-    0x85,
-    0x77,
-    0xfb,
-    0xd1,
-    0xdd,
-    0x02,
-    0xe8,
-    0xa2,
-    0xe4,
-    0xbc,
-    0x84,
-    0xad,
-    0x62,
-    0xa7,
-    0xdc,
-    0xa0,
-    0xdc,
-    0x7d,
-    0xce,
-    0xad,
-    0x4f,
-    0x97,
-    0x62,
-    0x8b,
-    0x25,
-    0x0d,
-    0x5e,
-    0xbd,
-    0x61,
-    0x1f,
-    0x14,
-    0x16,
-    0x1d,
-    0xd4,
-    0x7f,
-    0x7d,
-    0x36,
-    0xe0,
-    0x8e,
-    0xee,
-    0x46,
-    0xcb,
-    0xc0,
-    0xc1,
-    0xd2,
-    0x50,
-    0xf1,
-    0x2f,
-    0xc5,
-    0x04,
-    0x74,
-    0x12,
-    0x1d,
-    0x38,
-    0x61,
-    0xec,
-    0xe5,
-    0x1f,
-    0x30,
-    0x2b,
-    0x63,
-    0x34,
-    0x87,
-    0xab,
-    0x92,
-    0xd6,
-    0x51,
-    0x7d,
-    0xd3,
-    0x35,
-    0x10,
-    0xe7,
-    0xdf,
-    0x72,
-    0x74,
-    0xab,
-    0x00,
-    0x02,
-    0x2c,
-    0x8c,
-    0x81,
-    0x54,
-    0xfc,
-    0x0f,
-    0x62,
-    0xb3,
-    0x10,
-    0x7f,
-    0x51,
-    0x6d,
-    0x90,
-    0x33,
-    0xd6,
-    0x35,
-    0x74,
-    0x14,
-    0xce,
-    0xc6,
-    0x9a,
-    0x59,
-    0x1a,
-    0xc9,
-    0x15,
-    0x95,
-    0x98,
-    0xf9,
-    0xc9,
-    0xf4,
-    0x52,
-    0x85,
-    0x35,
-    0xc1,
-    0xf6,
-    0xb5,
-    0x8f,
-    0x2c,
-    0x87,
-    0xd1,
-    0x16,
-    0x4b,
-    0x51,
-    0x3f,
-    0xa4,
-    0x5e,
-    0x22,
-    0xeb,
-    0x82,
-    0x57,
-    0xb7,
-    0xec,
-    0x81,
-    0x9a,
-    0x75,
-    0x64,
-    0x46,
-    0x01,
-    0x5a,
-    0xa7,
-    0xe6,
-    0x23,
-    0x32,
-    0xa0,
-    0xb3,
-    0xd6,
-    0x0e,
-    0x71,
-    0x55,
-    0xf2,
-    0xf2,
-    0x5a,
-    0x1c,
-    0x58,
-    0xce,
-    0xdc,
-    0x94,
-    0x33,
-    0xaf,
-    0x1e,
-    0x5a,
-    0x7e,
-    0x37,
-    0x8f,
-    0x2f,
-    0xc7,
-    0x4b,
-    0xcd,
-    0x4b,
-    0x32,
-    0x0b,
-    0xc6,
-    0xf3,
-    0xc0,
-    0x07,
-    0x1d,
-    0x4e,
-    0xd1,
-    0xaf,
-    0xcf,
-    0x75,
-    0xe8,
-    0x0c,
-    0x16,
-    0xc9,
-    0xaf,
-    0xae,
-    0x8d,
-    0x89,
-    0x3b,
-    0xe6,
-    0x95,
-    0xa4,
-    0x90,
-    0x35,
-    0xf8,
-    0xcb,
-    0x68,
-    0x03,
-    0xcd,
-    0xcb,
-    0x30,
-    0x94,
-    0x9c,
-    0x1a,
-    0x54,
-    0x39,
-    0xc2,
-    0xaf,
-    0xbc,
-    0xc3,
-    0x16,
-    0x17,
-    0x97,
-    0x3d,
-    0xcc,
-    0xc6,
-    0x57,
-    0xdb,
-    0x9a,
-    0xab,
-    0xfc,
-    0x2d,
-    0x1a,
-    0x07,
-    0x96,
-    0x98,
-    0x70,
-    0x7e,
-    0x05,
-    0x07,
-    0x2c,
-    0x6f,
-    0x04,
-    0xde,
-    0x72,
-    0x81,
-    0x66,
-    0x30,
-    0x58,
-    0x7e,
-    0x9e,
-    0x31,
-    0x8f,
-    0x65,
-    0x85,
-    0xee,
-    0x46,
-    0xba,
-    0x58,
-    0x3b,
-    0x4b,
-    0x21,
-    0x00,
-    0xed,
-    0x73,
-    0x2b,
-    0x97,
-    0x4a,
-    0x3d,
-    0x70,
-    0x27,
-    0xbe,
-    0xb2,
-    0xde,
-    0xb5,
-    0xd0,
-    0x8f,
-    0x50,
-    0x7e,
-    0x53,
-    0xa6,
-    0x62,
-    0x80,
-    0xe1,
-    0x82,
-    0x84,
-    0x3c,
-    0x85,
-    0x4a,
-    0x4e,
-    0xbb,
-    0xb8,
-    0xe7,
-    0x14,
-    0xcf,
-    0x8f,
-    0x69,
-    0xb9,
-    0x9b,
-    0x32,
-    0xa7,
-    0xc8,
-    0x55,
-    0x90,
-    0x26,
-    0xc0,
-    0x4b,
-    0x51,
-    0x3d,
-    0xb0,
-    0x24,
-    0x0c,
-    0x76,
-    0x04,
-    0x69,
-    0xbb,
-    0x36,
-    0x9f,
-    0x44,
-    0x6c,
-    0xa1,
-    0x2a,
-    0x87,
-    0x39,
-    0xb8,
-    0xab,
-    0xef,
-    0x79,
-    0xc4,
-    0x59,
-    0xab,
-    0x38,
-    0xf8,
-    0xaf,
-    0x18,
-    0xe5,
-    0x52,
-    0xbf,
-    0xcf,
-    0x4b,
-    0xc2,
-    0xc9,
-    0xe1,
-    0xc3,
-    0x8e,
-    0x0c,
-    0x61,
-    0xa7,
-    0xf5,
-    0xdc,
-    0x23,
-    0x09,
-    0x13,
-    0xf5,
-    0xc4,
-    0xa5,
-    0x04,
-    0x0f,
-    0xea,
-    0x15,
-    0x4c,
-    0xb2,
-    0xcd,
-    0x44,
-    0x76,
-    0x4c,
-    0xf7,
-    0x25,
-    0xfc,
-    0x81,
-    0x48,
-    0xa5,
-    0x67,
-    0xc2,
-    0x3c,
-    0xde,
-    0xb7,
-    0x21,
-    0x71,
-    0x8d,
-    0x05,
-    0x63,
-    0x63,
-    0xc6,
-    0x67,
-    0x57,
-    0x7a,
-    0xe6,
-    0x14,
-    0x67,
-    0x48,
-    0xca,
-    0xc9,
-    0x6d,
-    0x0b,
-    0x3e,
-    0x6b,
-    0xc8,
-    0x7a,
-    0xb8,
-    0xed,
-    0xae,
-    0xbe,
-    0x47,
-    0x74,
-    0xc3,
-    0xbe,
-    0xc6,
-    0xb9,
-    0xeb,
-    0x9f,
-    0x55,
-    0xaf,
-    0x5d,
-    0x8b,
-    0x0a,
-    0x67,
-    0xfa,
-    0xb2,
-    0xe3,
-    0x30,
-    0xdc,
-    0x8f,
-    0xff,
-    0x02,
-    0x31,
-    0x6d,
-    0x0e,
-    0x1d,
-    0x4a,
-    0x29,
-    0x07,
-    0xed,
-    0xef,
-    0x39,
-    0x19,
-    0x31,
-    0xf6,
-    0xed,
-    0xe3,
-    0x5c,
-    0x14,
-    0xf5,
-    0xe7,
-    0x3b,
-    0xf2,
-    0x24,
-    0x3c,
-    0xd9,
-    0x83,
-    0x74,
-    0x84,
-    0xa0,
-    0x96,
-    0x49,
-    0x1e,
-    0xc0,
-    0xa7,
-    0xfa,
-    0x9d,
-    0xd5,
-    0xfb,
-    0x8d,
-    0x78,
-    0xc4,
-    0xec,
-    0xc2,
-    0x02,
-    0xe5,
-    0x81,
-    0x54,
-    0x9d,
-    0x68,
-    0x41,
-    0x7b,
-    0x2b,
-    0xf1,
-    0x49,
-    0xb5,
-    0xc6,
-    0x86,
-    0x9d,
-    0xc6,
-    0xb1,
-    0xab,
-    0xbc,
-    0xfd,
-    0x8e,
-    0xcb,
-    0x77,
-    0xba,
-    0xd1,
-    0xda,
-    0x02,
-    0x2d,
-    0x74,
-    0x39,
-    0x4c,
-    0x60,
-    0xed,
-    0xda,
-    0x8c,
-    0x78,
-    0x5d,
-    0xa4,
-    0x1c,
-    0x38,
-    0x0a,
-    0x19,
-    0x8b,
-    0xc6,
-    0x0f,
-    0x36,
-    0xee,
-    0xb2,
-    0x52,
-    0x9a,
-    0x76,
-    0x34,
-    0xb7,
-    0xeb,
-    0x48,
-    0xb5,
-    0x93,
-    0x76,
-    0x88,
-    0x91,
-    0x64,
-    0x15,
-    0xb7,
-    0x1c,
-    0xbf,
-    0x56,
-    0x40,
-    0xe3,
-    0x89,
-    0xd9,
-    0x4d,
-    0x34,
-    0x6a,
-    0xfa,
-    0xdf,
-    0xe0,
-    0x7f,
-    0xb0,
-    0x1e,
-    0x3f,
-    0x4f,
-    0xb5,
-    0xee,
-    0x75,
-    0x01,
-    0xe8,
-    0xc2,
-    0xf4,
-    0xcc,
-    0xef,
-    0xb5,
-    0x42,
-    0xae,
-    0x20,
-    0xd7,
-    0xfd,
-    0x61,
-    0xa2,
-    0xc4,
-    0x1c,
-    0x8b,
-    0xcf,
-    0x7c,
-    0x77,
-    0x35,
-    0xdd,
-    0x6e,
-    0x8a,
-    0x7e,
-    0xbe,
-    0xd6,
-    0x75,
-    0x90,
-    0x44,
-    0x49,
-    0x48,
-    0xd4,
-    0x89,
-    0x8e,
-    0x7e,
-    0x62,
-    0x8e,
-    0xb0,
-    0xc7,
-    0xbc,
-    0x22,
-    0x51,
-    0x0b,
-    0xbb,
-    0x06,
-    0x41,
-    0xab,
-    0xc9,
-    0x4e,
-    0x50,
-    0x0a,
-    0x51,
-    0x0a,
-    0x60,
-    0x4c,
-    0x74,
-    0x26,
-    0xbe,
-    0x5d,
-    0xfe,
-    0x8f,
-    0xb2,
-    0x35,
-    0x98,
-    0x97,
-    0x54,
-    0x5b,
-    0x3f,
-    0x9b,
-    0xa2,
-    0xa8,
-    0xf4,
-    0xe3,
-    0xd0,
-    0x4e,
-    0xb5,
-    0xc9,
-    0xdf,
-    0x19,
-    0xad,
-    0x1e,
-    0x71,
-    0xf4,
-    0xa8,
-    0xc9,
-    0xdc,
-    0xae,
-    0xc9,
-    0xb1,
-    0x7d,
-    0xfe,
-    0x7f,
-    0xde,
-    0x4f,
-    0xc5,
-    0xb5,
-    0xdb,
-    0xbb,
-    0x94,
-    0x49,
-    0x5e,
-    0xb2,
-    0x6e,
-    0xc0,
-    0x2a,
-    0xfa,
-    0xcf,
-    0x38,
-    0x35,
-    0xc5,
-    0xec,
-    0x9d,
-    0x06,
-    0x88,
-    0x3d,
-    0x20,
-    0x62,
-    0x0a,
-    0x39,
-    0xe5,
-    0x27,
-    0xbc,
-    0x61,
-    0xfc,
-    0x78,
-    0x48,
-    0x7f,
-    0x93,
-    0x1a,
-    0x6c,
-    0x30,
-    0x6a,
-    0x1e,
-    0x09,
-    0xa0,
-    0x87,
-    0xc1,
-    0x77,
-    0x95,
-    0x2a,
-    0x90,
-    0x1c,
-    0xaf,
-    0x03,
-    0xd0,
-    0x3d,
-    0xee,
-    0xa3,
-    0x1c,
-    0x13,
-    0x74,
-    0x31,
-    0x50,
-    0x22,
-    0x8c,
-    0x5e,
-    0xa6,
-    0xc6,
-    0xec,
-    0x9a,
-    0x1f,
-    0x0f,
-    0x37,
-    0x89,
-    0x25,
-    0xce,
-    0xc6,
-    0xb0,
-    0x6e,
-    0xf0,
-    0xa8,
-    0x75,
-    0x23,
-    0x0b,
-    0xe7,
-    0x46,
-    0x42,
-    0x37,
-    0x0d,
-    0x18,
-    0x41,
-    0x1f,
-    0xe7,
-    0x13,
-    0xf4,
-    0x58,
-    0x89,
-    0x8b,
-    0xb0,
-    0xf1,
-    0x92,
-    0x33,
-    0xb1,
-    0x4b,
-    0xb2,
-    0x8d,
-    0xb9,
-    0x2a,
-    0x69,
-    0xa5,
-    0xfa,
-    0x0d,
-    0x11,
-    0xff,
-    0x36,
-    0xbb,
-    0x1e,
-    0xce,
-    0x25,
-    0x1f,
-    0xa5,
-    0x66,
-    0x17,
-    0x55,
-    0x1b,
-    0xf4,
-    0xda,
-    0x05,
-    0x60,
-    0x6d,
-    0xde,
-    0xf0,
-    0xfb,
-    0xc4,
-    0x97,
-    0xc8,
-    0xa8,
-    0x60,
-    0x23,
-    0x45,
-    0x10,
-    0xcd,
-    0x2d,
-    0x75,
-    0xd7,
-    0xb2,
-    0x11,
-    0x54,
-    0xdb,
-    0x03,
-    0x40,
-    0x9c,
-    0xbb,
-    0x77,
-    0xe7,
-    0xde,
-    0x97,
-    0x3d,
-    0xcb,
-    0xd2,
-    0x17,
-    0xeb,
-    0x77,
-    0xec,
-    0xaf,
-    0xb7,
-    0x9a,
-    0x2f,
-    0x21,
-    0xe9,
-    0xab,
-    0x46,
-    0x43,
-    0x90,
-    0xce,
-    0xd1,
-    0x02,
-    0x74,
-    0xfb,
-    0xfd,
-    0xa7,
-    0x4d,
-    0x5d,
-    0x57,
-    0x59,
-    0x32,
-    0xf8,
-    0xe2,
-    0xe3,
-    0x54,
-    0x8f,
-    0x66,
-    0xb8,
-    0xec,
-    0xc5,
-    0x0c,
-    0x34,
-    0x72,
-    0x82,
-    0x28,
-    0x25,
-    0x10,
-    0x98,
-    0x56,
-    0x8a,
-    0x56,
-    0xa7,
-    0xc8,
-    0x9b,
-    0x2f,
-    0x3e,
-    0xde,
-    0x09,
-    0x14,
-    0x42,
-    0xf7,
-    0x86,
-    0x7f,
-    0x94,
-    0x88,
-    0x88,
-    0xa3,
-    0xee,
-    0x6b,
-    0x4a,
-    0x5a,
-    0x0e,
-    0x79,
-    0x14,
-    0x5f,
-    0x17,
-    0x5a,
-    0xbd,
-    0xbd,
-    0x34,
-    0x9c,
-    0x6e,
-    0x87,
-    0x7e,
-    0x03,
-    0xa8,
-    0xca,
-    0x20,
-    0x20,
-    0x89,
-    0xc0,
-    0xb8,
-    0x25,
-    0x4b,
-    0x46,
-    0x01,
-    0xf8,
-    0x0d,
-    0x90,
-    0xb0,
-    0x86,
-    0xd6,
-    0x1c,
-    0x9b,
-    0x5a,
-    0xd7,
-    0xe4,
-    0x20,
-    0x6e,
-    0xf0,
-    0xd8,
-    0xc5,
-    0x41,
-    0x76,
-    0x8b,
-    0x1c,
-    0x29,
-    0x34,
-    0x2d,
-    0xea,
-    0xeb,
-    0xaf,
-    0xb9,
-    0x87,
-    0x89,
-    0xaf,
-    0x6f,
-    0x88,
-    0x5b,
-    0xfa,
-    0x85,
-    0x9c,
-    0x61,
-    0x63,
-    0x1a,
-    0xb4,
-    0xd8,
-    0x03,
-    0x6b,
-    0x67,
-    0x0b,
-    0xc7,
-    0x49,
-    0x94,
-    0x6c,
-    0x2b,
-    0xcb,
-    0x49,
-    0xe3,
-    0x44,
-    0x40,
-    0xe3,
-    0x66,
-    0x04,
-    0x67,
-    0x77,
-    0xca,
-    0xba,
-    0xe3,
-    0x71,
-    0xd9,
-    0xd8,
-    0xe9,
-    0x7b,
-    0xa4,
-    0xf9,
-    0x3c,
-    0xa1,
-    0x1b,
-    0x22,
-    0x5b,
-    0xb2,
-    0xda,
-    0x48,
-    0xf8,
-    0xe9,
-    0x46,
-    0x13,
-    0xad,
-    0xcc,
-    0xd9,
-    0xe2,
-    0xeb,
-    0x55,
-    0xba,
-    0x0f,
-    0x33,
-    0x50,
-    0x91,
-    0x74,
-    0x88,
-    0x04,
-    0x99,
-    0x2e,
-    0x24,
-    0x15,
-    0xf7,
-    0xa0,
-    0x6a,
-    0xa9,
-    0x4a,
-    0xbb,
-    0x1c,
-    0xca,
-    0x83,
-    0x7d,
-    0xce,
-    0x0c,
-    0xf7,
-    0xb8,
-    0x9a,
-    0x6f,
-    0xb2,
-    0x15,
-    0x16,
-    0x86,
-    0x0e,
-    0x58,
-    0x83,
-    0xd9,
-    0x85,
-    0xe6,
-    0x47,
-    0x89,
-    0xc4,
-    0x84,
-    0x9e,
-    0x32,
-    0x00,
-    0x61,
-    0x8c,
-    0x15,
-    0x8d,
-    0x57,
-    0x16,
-    0x77,
-    0xad,
-    0x6e,
-    0xb1,
-    0x44,
-    0xa6,
-    0xa2,
-    0xfb,
-    0xf8,
-    0x17,
-    0xe6,
-    0xa9,
-    0xbf,
-    0x8b,
-    0x68,
-    0xc0,
-    0xdb,
-    0x4f,
-    0x17,
-    0x09,
-    0x47,
-    0x81,
-    0x63,
-    0xbe,
-    0x9a,
-    0x6a,
-    0x43,
-    0x8a,
-    0x2d,
-    0x0e,
-    0x7d,
-    0xb1,
-    0x80,
-    0x00,
-    0x22,
-    0x8a,
-    0xda,
-    0x7b,
-    0x57,
-    0x36,
-    0x30,
-    0xaf,
-    0x5b,
-    0x8c,
-    0x48,
-    0x59,
-    0xc6,
-    0x53,
-    0x1f,
-    0x96,
-    0x0f,
-    0xb4,
-    0x87,
-    0xf9,
-    0x51,
-    0xee,
-    0x14,
-    0xdb,
-    0x4f,
-    0x4c,
-    0x39,
-    0xf2,
-    0xb5,
-    0x55,
-    0xaf,
-    0x26,
-    0xa1,
-    0x42,
-    0x16,
-    0x9f,
-    0x61,
-    0xb5,
-    0xdf,
-    0x23,
-    0x7f,
-    0xa7,
-    0x69,
-    0x9f,
-    0xfa,
-    0xa2,
-    0x6a,
-    0x03,
-    0xd7,
-    0x31,
-    0x91,
-    0x53,
-    0xd8,
-    0x96,
-    0x6a,
-    0xfb,
-    0x8c,
-    0xba,
-    0x81,
-    0x64,
-    0x88,
-    0x6a,
-    0xca,
-    0xc4,
-    0xf3,
-    0xbf,
-    0x40,
-    0x3a,
-    0x48,
-    0xde,
-    0xcd,
-    0x1a,
-    0x57,
-    0xe2,
-    0x6a,
-    0x86,
-    0x8d,
-    0x17,
-    0x87,
-    0x3e,
-    0x76,
-    0x69,
-    0xad,
-    0xb8,
-    0x80,
-    0x1c,
-    0x62,
-    0x74,
-    0x02,
-    0xbd,
-    0x4d,
-    0x8a,
-    0x7c,
-    0x58,
-    0x9a,
-    0x85,
-    0x21,
-    0xeb,
-    0xa0,
-    0x73,
-    0x92,
-    0x1b,
-    0xc1,
-    0x3d,
-    0xed,
-    0x26,
-    0x92,
-    0x35,
-    0x06,
-    0x19,
-    0x3c,
-    0xee,
-    0xf4,
-    0x43,
-    0x23,
-    0x50,
-    0xd0,
-    0xe9,
-    0xc5,
-    0xeb,
-    0xb9,
-    0x3b,
-    0xe4,
-    0x8c,
-    0x1b,
-    0x87,
-    0xe7,
-    0x0e,
-    0x31,
-    0xad,
-    0x7e,
-    0x73,
-    0xc9,
-    0xd3,
-    0x85,
-    0x34,
-    0x48,
-    0x59,
-    0x2b,
-    0xd4,
-    0xed,
-    0x0f,
-    0x53,
-    0xbb,
-    0x5a,
-    0xa6,
-    0x3a,
-    0x42,
-    0x50,
-    0x65,
-    0x5a,
-    0x0b,
-    0xba,
-    0x1d,
-    0x8f,
-    0x93,
-    0xed,
-    0x5f,
-    0x79,
-    0x0a,
-    0x2e,
-    0xec,
-    0x21,
-    0x62,
-    0x74,
-    0x6d,
-    0xdf,
-    0xa6,
-    0x70,
-    0x65,
-    0x7b,
-    0x8d,
-    0xcb,
-    0x63,
-    0x92,
-    0x4f,
-    0xaf,
-    0x7c,
-    0x3b,
-    0xb7,
-    0x88,
-    0xf8,
-    0xeb,
-    0x79,
-    0x0c,
-    0x4c,
-    0x96,
-    0xc7,
-    0x79,
-    0x49,
-    0x17,
-    0x1f,
-    0x1d,
-    0x92,
-    0xd2,
-    0x67,
-    0x1c,
-    0x53,
-    0x98,
-    0x3b,
-    0x6e,
-    0x30,
-    0xcb,
-    0x86,
-    0x27,
-    0x7c,
-    0xc2,
-    0x4f,
-    0xfb,
-    0xac,
-    0x6e,
-    0xd6,
-    0x01,
-    0x0b,
-    0x3e,
-    0xe0,
-    0xb7,
-    0xaf,
-    0x41,
-    0x4f,
-    0x47,
-    0xab,
-    0x8b,
-    0xf5,
-    0x08,
-    0x86,
-    0xd9,
-    0xaa,
-    0x48,
-    0xec,
-    0x78,
-    0x9c,
-    0x49,
-    0xa4,
-    0x62,
-    0xe7,
-    0x89,
-    0xc2,
-    0xab,
-    0x66,
-    0x46,
-    0x1e,
-    0x1b,
-    0xc8,
-    0x42,
-    0x04,
-    0x1d,
-    0xe6,
-    0xc4,
-    0x2d,
-    0xd7,
-    0x53,
-    0xdf,
-    0xee,
-    0x9b,
-    0x35,
-    0xf6,
-    0xb0,
-    0x7e,
-    0x54,
-    0x80,
-    0xa0,
-    0x46,
-    0x71,
-    0x09,
-    0xa8,
-    0x8a,
-    0xd9,
-    0x79,
-    0x9d,
-    0x14,
-    0x3a,
-    0x99,
-    0xba,
-    0x8a,
-    0xb4,
-    0xd3,
-    0x4d,
-    0x4e,
-    0x33,
-    0x3a,
-    0xb0,
-    0xa2,
-    0xfd,
-    0xca,
-    0x7b,
-    0x10,
-    0x87,
-    0xf0,
-    0xf8,
-    0x09,
-    0x8d,
-    0x4d,
-    0xd7,
-    0xcc,
-    0x61,
-    0xb7,
-    0x23,
-    0x89,
-    0x84,
-    0x80,
-    0x75,
-    0xc6,
-    0x73,
-    0xfb,
-    0x68,
-    0x03,
-    0xc3,
-    0x3d,
-    0x4c,
-    0x99,
-    0x70,
-    0x21,
-    0x1f,
-    0xe8,
-    0x73,
-    0x8f,
-    0xb9,
-    0xb1,
-    0x92,
-    0xfd,
-    0x46,
-    0xc1,
-    0x7c,
-    0x35,
-    0xf9,
-    0xd0,
-    0x15,
-    0x59,
-    0xff,
-    0xa8,
-    0x0f,
-    0x25,
-    0xb2,
-    0x8a,
-    0xba,
-    0x75,
-    0x10,
-    0xcd,
-    0x1d,
-    0x07,
-    0x6b,
-    0xc8,
-    0x45,
-    0x81,
-    0x61,
-    0xf2,
-    0xdd,
-    0xb6,
-    0x0f,
-    0x48,
-    0xff,
-    0x25,
-    0x82,
-    0xef,
-    0x4a,
-    0xc2,
-    0x6e,
-    0x1b,
-    0x35,
-    0xfa,
-    0x23,
-    0x2f,
-    0xa2,
-    0xf1,
-    0xbc,
-    0x26,
-    0xb7,
-    0x0e,
-    0x9a,
-    0x31,
-    0xe9,
-    0xb9,
-    0x11,
-    0xa1,
-    0x59,
-    0x63,
-    0x60,
-    0x08,
-    0x64,
-    0xc7,
-    0xe7,
-    0x9b,
-    0x75,
-    0x70,
-    0x94,
-    0xdb,
-    0x1e,
-    0x7c,
-    0x9f,
-    0x75,
-    0x68,
-    0x9f,
-    0x77,
-    0x66,
-    0x67,
-    0x6b,
-    0xfc,
-    0x62,
-    0x11,
-    0xce,
-    0xee,
-    0x77,
-    0x50,
-    0xdc,
-    0xa5,
-    0xee,
-    0x55,
-    0xce,
-    0x03,
-    0x72,
-    0x30,
-    0x4b,
-    0xa8,
-    0x74,
-    0x9d,
-    0xe7,
-    0x64,
-    0xcd,
-    0x21,
-    0xea,
-    0xf2,
-    0xa5,
-    0x56,
-    0x52,
-    0xe3,
-    0x94,
-    0x83,
-    0x1b,
-    0xd8,
-    0x08,
-    0x70,
-    0xbd,
-    0xf4,
-    0xe7,
-    0x79,
-    0xf7,
-    0x91,
-    0x75,
-    0xe0,
-    0xcb,
-    0x32,
-    0x77,
-    0x68,
-    0xca,
-    0xb9,
-    0x99,
-    0x1f,
-    0x91,
-    0xdb,
-    0x0d,
-    0x7b,
-    0x94,
-    0xd0,
-    0x75,
-    0xa8,
-    0x1a,
-    0x4f,
-    0x03,
-    0x21,
-    0x89,
-    0xb9,
-    0xde,
-    0x7e,
-    0xe4,
-    0x95,
-    0xc8,
-    0x8c,
-    0x92,
-    0x3c,
-    0xff,
-    0xa3,
-    0x61,
-    0xd5,
-    0x60,
-    0x34,
-    0xca,
-    0x84,
-    0xd2,
-    0xa2,
-    0x77,
-    0xdf,
-    0xe2,
-    0x53,
-    0x02,
-    0xa2,
-    0xab,
-    0x06,
-    0x00,
-    0xa3,
-    0xf9,
-    0x67,
-    0x3e,
-    0x08,
-    0xae,
-    0xe0,
-    0x4a,
-    0xb7,
-    0x64,
-    0xb3,
-    0x35,
-    0x0e,
-    0x53,
-    0x46,
-    0x98,
-    0xd5,
-    0x75,
-    0xbd,
-    0xd5,
-    0x70,
-    0xe9,
-    0xce,
-    0x9f,
-    0x59,
-    0x96,
-    0xd1,
-    0xbd,
-    0xce,
-    0x10,
-    0x17,
-    0x0a,
-    0xc7,
-    0xbf,
-    0x7d,
-    0xc1,
-    0x2b,
-    0x3e,
-    0x41,
-    0xf7,
-    0x43,
-    0x01,
-    0x14,
-    0x69,
-    0x6f,
-    0x3b,
-    0x70,
-    0x78,
-    0x18,
-    0xfe,
-    0x2b,
-    0x72,
-    0xe5,
-    0xa4,
-    0x4d,
-    0x13,
-    0x32,
-    0x6f,
-    0x1f,
-    0x4c,
-    0xbe,
-    0x6c,
-    0x84,
-    0x42,
-    0xa3,
-    0x9d,
-    0x8c,
-    0x9a,
-    0x8c,
-    0x56,
-    0x47,
-    0xf4,
-    0x22,
-    0xe8,
-    0xd7,
-    0xb5,
-    0xc7,
-    0x7d,
-    0xc9,
-    0x0a,
-    0x87,
-    0x43,
-    0xa6,
-    0x2a,
-    0x4b,
-    0xcd,
-    0xc4,
-    0xdb,
-    0x50,
-    0xb6,
-    0x62,
-    0x37,
-    0xd8,
-    0x87,
-    0xf4,
-    0xb0,
-    0x20,
-    0xda,
-    0xbc,
-    0x52,
-    0x91,
-    0xc0,
-    0x9a,
-    0x48,
-    0x3a,
-    0x61,
-    0x25,
-    0xa2,
-    0x7e,
-    0xe2,
-    0xfa,
-    0x55,
-    0x0a,
-    0x8c,
-    0x55,
-    0x83,
-    0x0b,
-    0x2a,
-    0xde,
-    0xfd,
-    0x9d,
-    0xb2,
-    0xc5,
-    0x07,
-    0x86,
-    0x28,
-    0x10,
-    0x5b,
-    0x24,
-    0xc0,
-    0x34,
-    0x70,
-    0xa4,
-    0x43,
-    0xe3,
-    0xfb,
-    0x75,
-    0xb3,
-    0x26,
-    0xb7,
-    0xfc,
-    0x32,
-    0xab,
-    0x61,
-    0x8a,
-    0x20,
-    0x60,
-    0x07,
-    0x8b,
-    0x84,
-    0x41,
-    0x83,
-    0x00,
-    0xad,
-    0x6d,
-    0x43,
-    0x2f,
-    0x19,
-    0x80,
-    0x4b,
-    0x98,
-    0x95,
-    0x1d,
-    0x7c,
-    0x2c,
-    0xa6,
-    0xca,
-    0x16,
-    0xba,
-    0x28,
-    0x01,
-    0x7c,
-    0xaa,
-    0x35,
-    0x83,
-    0x37,
-    0xed,
-    0x48,
-    0xf0,
-    0x3e,
-    0x34,
-    0xa2,
-    0x95,
-    0x74,
-    0x60,
-    0xed,
-    0x85,
-    0x73,
-    0x3a,
-    0x20,
-    0xeb,
-    0x88,
-    0x65,
-    0xa2,
-    0x9e,
-    0xfe,
-    0x91,
-    0xb2,
-    0xf6,
-    0xa0,
-    0xf0,
-    0x06,
-    0xdf,
-    0x79,
-    0xee,
-    0xb2,
-    0x2b,
-    0xde,
-    0x1d,
-    0x4c,
-    0x2d,
-    0xaf,
-    0x6e,
-    0x4e,
-    0x83,
-    0xd9,
-    0xa7,
-    0xbb,
-    0x33,
-    0x1f,
-    0x11,
-    0x06,
-    0xfa,
-    0x1b,
-    0x71,
-    0x2f,
-    0xe0,
-    0x7f,
-    0x3a,
-    0x2f,
-    0x10,
-    0xa1,
-    0x01,
-    0x96,
-    0xe7,
-    0x37,
-    0x31,
-    0x73,
-    0x4b,
-    0x5e,
-    0x00,
-    0x74,
-    0x3e,
-    0xe2,
-    0xa2,
-    0x4e,
-    0xb2,
-    0xb9,
-    0xbc,
-    0x5f,
-    0x9f,
-    0xd0,
-    0x1b,
-    0x92,
-    0x54,
-    0x0b,
-    0xa6,
-    0x84,
-    0x0b,
-    0x87,
-    0x91,
-    0xe5,
-    0xbf,
-    0x22,
-    0xd4,
-    0x20,
-    0x42,
-    0x3d,
-    0xdc,
-    0x3e,
-    0x8a,
-    0xc0,
-    0x80,
-    0x07,
-    0x4b,
-    0x5f,
-    0x36,
-    0x6b,
-    0xcc,
-    0x1c,
-    0x87,
-    0x21,
-    0xf3,
-    0x0d,
-    0xc0,
-    0x8e,
-    0xa1,
-    0x60,
-    0xeb,
-    0xe8,
-    0x46,
-    0x9c,
-    0xfd,
-    0x9b,
-    0xac,
-    0x29,
-    0x51,
-    0xec,
-    0x17,
-    0x13,
-    0x55,
-    0xdc,
-    0x90,
-    0x0b,
-    0x84,
-    0x4f,
-    0x7e,
-    0xaf,
-    0x94,
-    0x6d,
-    0x76,
-    0x0b,
-    0xf0,
-    0x49,
-    0x54,
-    0x5f,
-    0x68,
-    0xc0,
-    0x8b,
-    0x22,
-    0x27,
-    0xa5,
-    0xb9,
-    0x48,
-    0xe6,
-    0x1b,
-    0x7f,
-    0xc1,
-    0x60,
-    0x41,
-    0x8f,
-    0x42,
-    0x06,
-    0x15,
-    0x06,
-    0x47,
-    0xf3,
-    0x92,
-    0xfd,
-    0x59,
-    0x22,
-    0x1c,
-    0x5a,
-    0x8c,
-    0xdf,
-    0x1e,
-    0xec,
-    0x4d,
-    0x7b,
-    0xf2,
-    0xb8,
-    0x5a,
-    0x44,
-    0x01,
-    0x8d,
-    0x12,
-    0xb4,
-    0x2b,
-    0xdf,
-    0xef,
-    0xe9,
-    0x69,
-    0xd2,
-    0x51,
-    0x55,
-    0xb0,
-    0x94,
-    0x7d,
-    0xb7,
-    0x19,
-    0xf0,
-    0xe5,
-    0x4a,
-    0x40,
-    0x20,
-    0xaa,
-    0x3c,
-    0xe9,
-    0xe3,
-    0x5f,
-    0x61,
-    0xea,
-    0xd0,
-    0x10,
-    0x29,
-    0x45,
-    0xea,
-    0x82,
-    0xd0,
-    0x94,
-    0x74,
-    0xbd,
-    0xd4,
-    0xaa,
-    0x07,
-    0xc8,
-    0xac,
-    0x77,
-    0xe1,
-    0xb4,
-    0xb7,
-    0x2c,
-    0x80,
-    0xdb,
-    0x73,
-    0xa0,
-    0x70,
-    0x6a,
-    0xef,
-    0xf2,
-    0x61,
-    0x1d,
-    0x83,
-    0x71,
-    0x7c,
-    0x4a,
-    0xbe,
-    0xb8,
-    0xf7,
-    0x21,
-    0xa0,
-    0x1d,
-    0xe7,
-    0x32,
-    0x09,
-    0x4d,
-    0x56,
-    0x30,
-    0x72,
-    0x30,
-    0x96,
-    0xf4,
-    0xdb,
-    0x13,
-    0xd4,
-    0xc4,
-    0x04,
-    0x05,
-    0xf0,
-    0xd6,
-    0xe0,
-    0x81,
-    0x8d,
-    0x10,
-    0x47,
-    0x4e,
-    0x64,
-    0x12,
-    0xeb,
-    0xa4,
-    0xdd,
-    0x76,
-    0x8d,
-    0x90,
-    0xe0,
-    0x56,
-    0x71,
-    0x99,
-    0xe8,
-    0x0f,
-    0x0f,
-    0xa4,
-    0x5a,
-    0x45,
-    0x0b,
-    0x15,
-    0x16,
-    0x28,
-    0x67,
-    0x37,
-    0x4b,
-    0xf5,
-    0xf8,
-    0xde,
-    0x8f,
-    0xbf,
-    0x16,
-    0x4b,
-    0x2f,
-    0x6f,
-    0x98,
-    0x4f,
-    0xc3,
-    0x0a,
-    0x00,
-    0xb4,
-    0x06,
-    0x32,
-    0xf2,
-    0xd8,
-    0xe5,
-    0xf0,
-    0xeb,
-    0x9b,
-    0xd6,
-    0xb0,
-    0x2f,
-    0x7b,
-    0x6b,
-    0x8d,
-    0x03,
-    0xfe,
-    0x27,
-    0xcf,
-    0x1d,
-    0x51,
-    0x90,
-    0xb2,
-    0x59,
-    0x2e,
-    0x85,
-    0x6a,
-    0xad,
-    0x02,
-    0xd2,
-    0x63,
-    0x5f,
-    0x50,
-    0x02,
-    0xcd,
-    0x75,
-    0x50,
-    0x75,
-    0x58,
-    0x6e,
-    0xdd,
-    0xb2,
-    0x3c,
-    0x2f,
-    0x8e,
-    0xfd,
-    0x7d,
-    0x40,
-    0x22,
-    0x2d,
-    0x6d,
-    0x38,
-    0x21,
-    0xb8,
-    0x72,
-    0x76,
-    0xc0,
-    0x10,
-    0x09,
-    0x12,
-    0x05,
-    0x32,
-    0x0b,
-    0x13,
-    0x2d,
-    0x7b,
-    0x30,
-    0xe3,
-    0x4b,
-    0xbe,
-    0xd1,
-    0x00,
-    0x31,
-    0x95,
-    0xf2,
-    0xf3,
-    0x93,
-    0xf4,
-    0x7f,
-    0x86,
-    0x6a,
-    0x04,
-    0xd6,
-    0x32,
-    0x97,
-    0x2e,
-    0x86,
-    0xd7,
-    0xc9,
-    0x75,
-    0x56,
-    0xb0,
-    0xa0,
-    0x0a,
-    0x8a,
-    0x85,
-    0x13,
-    0x1a,
-    0x61,
-    0x22,
-    0x0f,
-    0xeb,
-    0xe2,
-    0x09,
-    0x60,
-    0x27,
-    0xd8,
-    0x64,
-    0xd5,
-    0x78,
-    0x1c,
-    0x3d,
-    0x9f,
-    0x54,
-    0x12,
-    0xf1,
-    0xfb,
-    0x1b,
-    0x76,
-    0xe2,
-    0x11,
-    0x5f,
-    0x59,
-    0x6d,
-    0x1b,
-    0x82,
-    0x66,
-    0x1c,
-    0xc9,
-    0x87,
-    0x6a,
-    0x1c,
-    0xe4,
-    0x22,
-    0x14,
-    0xf1,
-    0x33,
-    0x11,
-    0xf9,
-    0x68,
-    0x9b,
-    0xaf,
-    0xda,
-    0xcd,
-    0x89,
-    0xc7,
-    0x2a,
-    0x5f,
-    0x95,
-    0xa6,
-    0xcb,
-    0x01,
-    0x5f,
-    0x74,
-    0x19,
-    0x32,
-    0xbd,
-    0xc4,
-    0x29,
-    0x3f,
-    0x19,
-    0x69,
-    0x52,
-    0xb7,
-    0x14,
-    0x8b,
-    0xed,
-    0x20,
-    0x6f,
-    0xfb,
-    0x5a,
-    0xe8,
-    0x2c,
-    0xc4,
-    0x44,
-    0x9f,
-    0xf0,
-    0x03,
-    0x25,
-    0x63,
-    0xac,
-    0xf8,
-    0x0c,
-    0x9b,
-    0x7c,
-    0x5c,
-    0x9e,
-    0xe8,
-    0xd0,
-    0xf5,
-    0x5a,
-    0x58,
-    0xc9,
-    0x69,
-    0x22,
-    0xdd,
-    0xe6,
-    0x50,
-    0xf7,
-    0xfe,
-    0xdf,
-    0x8c,
-    0x05,
-    0xcd,
-    0xd1,
-    0xdd,
-    0xdf,
-    0x19,
-    0x9c,
-    0xb0,
-    0x0b,
-    0xe4,
-    0x89,
-    0x38,
-    0xc1,
-    0x17,
-    0x31,
-    0xc0,
-    0xf0,
-    0x75,
-    0x9a,
-    0x40,
-    0x82,
-    0xce,
-    0xa2,
-    0x2e,
-    0xe1,
-    0x75,
-    0xa1,
-    0x96,
-    0xba,
-    0xf4,
-    0x4a,
-    0x6d,
-    0x01,
-    0xfd,
-    0xd2,
-    0x23,
-    0x35,
-    0xa4,
-    0x55,
-    0x77,
-    0xe5,
-    0xcc,
-    0x75,
-    0x8f,
-    0x73,
-    0xdf,
-    0x44,
-    0x48,
-    0x18,
-    0xc3,
-    0x64,
-    0xcb,
-    0x28,
-    0x09,
-    0x6c,
-    0x61,
-    0x97,
-    0x67,
-    0x8e,
-    0x88,
-    0xbd,
-    0x68,
-    0x77,
-    0x46,
-    0x56,
-    0x62,
-    0x77,
-    0xbd,
-    0xcd,
-    0xa9,
-    0xe2,
-    0x00,
-    0xba,
-    0x02,
-    0xb6,
-    0x25,
-    0xa9,
-    0x5a,
-    0x7d,
-    0x9b,
-    0x1d,
-    0xb8,
-    0x75,
-    0xbe,
-    0xd4,
-    0x71,
-    0xef,
-    0xa9,
-    0x4d,
-    0x9b,
-    0xf5,
-    0x4b,
-    0x88,
-    0xc3,
-    0x2f,
-    0xbe,
-    0x0d,
-    0xe3,
-    0x08,
-    0xd3,
-    0x2f,
-    0x8e,
-    0x0c,
-    0xf2,
-    0x92,
-    0x6e,
-    0x94,
-    0x21,
-    0xeb,
-    0xf0,
-    0xa6,
-    0x62,
-    0x07,
-    0x3e,
-    0x17,
-    0x42,
-    0x0f,
-    0x6e,
-    0xf2,
-    0xaf,
-    0x0a,
-    0xf8,
-    0x1e,
-    0x0a,
-    0xa3,
-    0x6e,
-    0x3a,
-    0x7d,
-    0x2c,
-    0x67,
-    0xcc,
-    0x8f,
-    0xe4,
-    0xbd,
-    0x9b,
-    0xf5,
-    0x75,
-    0xf8,
-    0x59,
-    0xab,
-    0xc1,
-    0x09,
-    0x85,
-    0x44,
-    0xde,
-    0x3c,
-    0x90,
-    0x7f,
-    0x5f,
-    0x68,
-    0x3f,
-    0x1a,
-    0xd6,
-    0x68,
-    0x50,
-    0xeb,
-    0x97,
-    0xcf,
-    0x60,
-    0x2c,
-    0xbe,
-    0xd8,
-    0x0c,
-    0x17,
-    0x73,
-    0x9c,
-    0x57,
-    0xb3,
-    0x6c,
-    0x88,
-    0x4b,
-    0xed,
-    0xb4,
-    0x0d,
-    0xe4,
-    0xea,
-    0xab,
-    0x99,
-    0x29,
-    0x9c,
-    0x4f,
-    0xc7,
-    0x9c,
-    0x93,
-    0xb9,
-    0xd3,
-    0xd4,
-    0x16,
-    0xea,
-    0x50,
-    0x69,
-    0x73,
-    0xc8,
-    0x1d,
-    0x10,
-    0x93,
-    0x64,
-    0x95,
-    0x07,
-    0xd1,
-    0x7e,
-    0x06,
-    0xb4,
-    0x0c,
-    0x4b,
-    0x64,
-    0x89,
-    0xfb,
-    0x76,
-    0x3f,
-    0x2a,
-    0xc1,
-    0x64,
-    0xf3,
-    0xd2,
-    0xc2,
-    0xbc,
-    0x1f,
-    0xf3,
-    0xb4,
-    0x27,
-    0x58,
-    0x1c,
-    0xf9,
-    0x54,
-    0x1e,
-    0x20,
-    0x2c,
-    0x40,
-    0x0e,
-    0x75,
-    0xfa,
-    0xb4,
-    0x5a,
-    0xda,
-    0x33,
-    0x0f,
-    0x77,
-    0x3c,
-    0x20,
-    0x45,
-    0x15,
-    0xdb,
-    0x18,
-    0x28,
-    0x54,
-    0xa9,
-    0x4e,
-    0xe6,
-    0x35,
-    0xf2,
-    0xed,
-    0xd3,
-    0x4e,
-    0x42,
-    0x67,
-    0x69,
-    0xc3,
-    0x84,
-    0x09,
-    0x8d,
-    0x71,
-    0x67,
-    0xd4,
-    0x14,
-    0x6c,
-    0x06,
-    0x88,
-    0x86,
-    0xac,
-    0xc7,
-    0x01,
-    0x22,
-    0x03,
-    0x83,
-    0xc6,
-    0x22,
-    0x52,
-    0xe8,
-    0xe0,
-    0x40,
-    0xfd,
-    0x1c,
-    0xe8,
-    0x78,
-    0x9c,
-    0xa3,
-    0x64,
-    0x10,
-    0xf4,
-    0x83,
-    0x54,
-    0xd6,
-    0x25,
-    0xa6,
-    0x07,
-    0xa9,
-    0x24,
-    0x7f,
-    0x33,
-    0x3a,
-    0x6c,
-    0xf1,
-    0x45,
-    0x14,
-    0xf1,
-    0x6c,
-    0xf6,
-    0xda,
-    0x56,
-    0x59,
-    0x1f,
-    0xd0,
-    0x5f,
-    0xb8,
-    0xce,
-    0x9d,
-    0xa9,
-    0x07,
-    0x99,
-    0x50,
-    0x99,
-    0x66,
-    0x32,
-    0xa0,
-    0x92,
-    0xfa,
-    0x3c,
-    0x78,
-    0x6b,
-    0x8f,
-    0x5d,
-    0xb3,
-    0x20,
-    0x81,
-    0x95,
-    0x24,
-    0xc7,
-    0xdc,
-    0xce,
-    0xd9,
-    0xc6,
-    0xc2,
-    0xb4,
-    0xa0,
-    0x44,
-    0x0d,
-    0xc6,
-    0xcb,
-    0xdd,
-    0x36,
-    0xad,
-    0x31,
-    0x9a,
-    0x76,
-    0xcd,
-    0x75,
-    0x20,
-    0x2a,
-    0x1b,
-    0x8b,
-    0x27,
-    0x7c,
-    0x2e,
-    0x77,
-    0x2e,
-    0x40,
-    0x98,
-    0x58,
-    0x6d,
-    0x1c,
-    0x76,
-    0xa6,
-    0x0c,
-    0xec,
-    0x46,
-    0xb8,
-    0x92,
-    0x64,
-    0xf9,
-    0x89,
-    0xa0,
-    0xf7,
-    0x49,
-    0xbb,
-    0xdf,
-    0xf8,
-    0x4d,
-    0xdc,
-    0x37,
-    0x00,
-    0x4b,
-    0xe9,
-    0x42,
-    0x8f,
-    0xcd,
-    0x10,
-    0x00,
-    0xf6,
-    0xf7,
-    0xba,
-    0xcc,
-    0x74,
-    0x17,
-    0xc9,
-    0x8e,
-    0x9f,
-    0x7e,
-    0x1e,
-    0x33,
-    0x05,
-    0x8f,
-    0x5f,
-    0x5a,
-    0x14,
-    0x15,
-    0xf7,
-    0x50,
-    0x37,
-    0xda,
-    0x5e,
-    0x3f,
-    0x42,
-    0x75,
-    0x9a,
-    0xa2,
-    0x10,
-    0x63,
-    0x06,
-    0xfc,
-    0x6a,
-    0x59,
-    0x52,
-    0xca,
-    0x2b,
-    0xd9,
-    0xcb,
-    0xb6,
-    0xa2,
-    0x04,
-    0xdc,
-    0x0d,
-    0x38,
-    0xaf,
-    0xd5,
-    0x73,
-    0x53,
-    0xb8,
-    0xec,
-    0xd6,
-    0x7a,
-    0x9a,
-    0x82,
-    0xa0,
-    0xb9,
-    0x40,
-    0xa7,
-    0x31,
-    0x47,
-    0x17,
-    0xdf,
-    0x8c,
-    0x66,
-    0x67,
-    0x26,
-    0x50,
-    0x8b,
-    0xe3,
-    0x33,
-    0xeb,
-    0xbf,
-    0x7f,
-    0xfa,
-    0x0a,
-    0x45,
-    0x81,
-    0x74,
-    0x53,
-    0x7d,
-    0xdb,
-    0xa2,
-    0x57,
-    0x08,
-    0xb8,
-    0xd0,
-    0xc2,
-    0x2d,
-    0x55,
-    0x17,
-    0xd5,
-    0x7b,
-    0x12,
-    0x25,
-    0x17,
-    0xb0,
-    0xc9,
-    0x41,
-    0x47,
-    0xda,
-    0x5e,
-    0x89,
-    0x94,
-    0xbc,
-    0x97,
-    0x7e,
-    0x11,
-    0x73,
-    0x2e,
-    0xc3,
-    0x63,
-    0x5a,
-    0x25,
-    0x22,
-    0xbc,
-    0x2a,
-    0x5a,
-    0xd0,
-    0x0e,
-    0x66,
-    0x5b,
-    0xf2,
-    0x78,
-    0xf6,
-    0x7b,
-    0x5f,
-    0x05,
-    0x11,
-    0x26,
-    0xa8,
-    0x95,
-    0x61,
-    0x71,
-    0x56,
-    0x1b,
-    0x62,
-    0xf5,
-    0x72,
-    0x09,
-    0x0c,
-    0xde,
-    0x4b,
-    0x09,
-    0xb1,
-    0x3f,
-    0x73,
-    0xee,
-    0x28,
-    0xa9,
-    0x0b,
-    0xea,
-    0x2b,
-    0xfb,
-    0x40,
-    0x01,
-    0xfe,
-    0x7b,
-    0x16,
-    0xbd,
-    0x51,
-    0x26,
-    0x65,
-    0x24,
-    0x68,
-    0x45,
-    0x20,
-    0xe7,
-    0x79,
-    0x41,
-    0xdd,
-    0xdc,
-    0x56,
-    0xb8,
-    0x92,
-    0xae,
-    0x4b,
-    0xd0,
-    0x9d,
-    0xd4,
-    0x4a,
-    0xcc,
-    0x08,
-    0xbf,
-    0x45,
-    0xdd,
-    0x0a,
-    0x58,
-    0xdc,
-    0x3a,
-    0xd1,
-    0xa9,
-    0x38,
-    0x72,
-    0x7e,
-    0xda,
-    0x37,
-    0x01,
-    0x72,
-    0x60,
-    0xc9,
-    0x22,
-    0xc8,
-    0x71,
-    0x9a,
-    0xe5,
-    0x22,
-    0xbb,
-    0xf1,
-    0x81,
-    0xa9,
-    0x55,
-    0xd8,
-    0xeb,
-    0x4f,
-    0xf6,
-    0x7d,
-    0xa8,
-    0x58,
-    0x65,
-    0xd8,
-    0xdf,
-    0x18,
-    0x30,
-    0x8e,
-    0xb2,
-    0xfe,
-    0xa1,
-    0x15,
-    0xce,
-    0xd1,
-    0xee,
-    0x19,
-    0x41,
-    0x3a,
-    0xb0,
-    0x1f,
-    0x8d,
-    0x83,
-    0x96,
-    0x69,
-    0xfa,
-    0x9e,
-    0x5b,
-    0x19,
-    0x30,
-    0x69,
-    0xf5,
-    0x99,
-    0x04,
-    0x30,
-    0x10,
-    0x39,
-    0x93,
-    0x73,
-    0xba,
-    0x1a,
-    0x8d,
-    0xea,
-    0x60,
-    0x4c,
-    0xd4,
-    0xc7,
-    0xf9,
-    0x33,
-    0x46,
-    0x3b,
-    0x81,
-    0x2f,
-    0xd6,
-    0x3b,
-    0xa9,
-    0x7b,
-    0xe2,
-    0x84,
-    0xcd,
-    0x56,
-    0xc1,
-    0xdd,
-    0x26,
-    0x61,
-    0x9b,
-    0x9c,
-    0x41,
-    0x49,
-    0x7d,
-    0x6b,
-    0xaf,
-    0xa5,
-    0xac,
-    0x4c,
-    0xff,
-    0x22,
-    0x3a,
-    0xdb,
-    0xe9,
-    0xdd,
-    0xd8,
-    0xd3,
-    0xcc,
-    0x10,
-    0xeb,
-    0xd4,
-    0x5b,
-    0xf1,
-    0xe2,
-    0x64,
-    0x92,
-    0xd7,
-    0xc6,
-    0x33,
-    0xf0,
-    0x9f,
-    0x12,
-    0xa3,
-    0xe0,
-    0x4e,
-    0xc6,
-    0x87,
-    0x78,
-    0xf7,
-    0xb7,
-    0x2b,
-    0x65,
-    0xe0,
-    0x29,
-    0x96,
-    0x26,
-    0xe0,
-    0x9f,
-    0x0b,
-    0x79,
-    0x0b,
-    0xf2,
-    0xd6,
-    0x13,
-    0x92,
-    0xa1,
-    0x45,
-    0x94,
-    0xe4,
-    0x68,
-    0xf4,
-    0xba,
-    0x19,
-    0x14,
-    0x4d,
-    0xd5,
-    0x91,
-    0x95,
-    0x50,
-    0x7b,
-    0xd8,
-    0x55,
-    0x90,
-    0x7c,
-    0xcd,
-    0xc8,
-    0x7e,
-    0x18,
-    0x04,
-    0x45,
-    0xea,
-    0x70,
-    0x68,
-    0x14,
-    0xc7,
-    0x3b,
-    0x25,
-    0xc8,
-    0x2f,
-    0xba,
-    0xc5,
-    0xce,
-    0xa7,
-    0xee,
-    0x98,
-    0x47,
-    0xa3,
-    0x08,
-    0x5a,
-    0x13,
-    0x4d,
-    0x21,
-    0x10,
-    0x2e,
-    0x82,
-    0x2b,
-    0x33,
-    0x40,
-    0x1d,
-    0x28,
-    0x10,
-    0x6f,
-    0x79,
-    0x9a,
-    0x6f,
-    0x78,
-    0x31,
-    0x3a,
-    0x73,
-    0xfe,
-    0x2a,
-    0xec,
-    0xc1,
-    0x22,
-    0xd4,
-    0xf3,
-    0xe4,
-    0x53,
-    0xac,
-    0x61,
-    0xf1,
-    0x67,
-    0x06,
-    0xd2,
-    0x66,
-    0xeb,
-    0x09,
-    0x5a,
-    0x58,
-    0xb8,
-    0xfb,
-    0xbc,
-    0xce,
-    0xc7,
-    0xbf,
-    0xdd,
-    0x68,
-    0x47,
-    0x9b,
-    0x78,
-    0x44,
-    0xec,
-    0x3f,
-    0x12,
-    0x21,
-    0x89,
-    0x03,
-    0x31,
-    0xc5,
-    0xe1,
-    0x71,
-    0xc9,
-    0x9d,
-    0xbb,
-    0x03,
-    0xf7,
-    0xa4,
-    0x34,
-    0x2d,
-    0xf1,
-    0x85,
-    0x59,
-    0x9e,
-    0x3e,
-    0x04,
-    0xf5,
-    0xc4,
-    0x22,
-    0x9a,
-    0xa8,
-    0x8e,
-    0x5d,
-    0x5f,
-    0x39,
-    0x75,
-    0x15,
-    0x2e,
-    0x2d,
-    0xbd,
-    0x10,
-    0x03,
-    0x99,
-    0xf8,
-    0x26,
-    0xa7,
-    0x34,
-    0xcd,
-    0xf6,
-    0x90,
-    0xb0,
-    0xf7,
-    0xd9,
-    0x02,
-    0x4b,
-    0x90,
-    0x14,
-    0x7b,
-    0xa1,
-    0x90,
-    0x52,
-    0x4e,
-    0xc4,
-    0x91,
-    0x51,
-    0x8e,
-    0x8e,
-    0xd5,
-    0xdb,
-    0x2d,
-    0x36,
-    0x89,
-    0xf8,
-    0x65,
-    0x22,
-    0x4b,
-    0x62,
-    0x57,
-    0xfc,
-    0xeb,
-    0x39,
-    0xf3,
-    0x08,
-    0x6e,
-    0xf8,
-    0x17,
-    0xb5,
-    0x59,
-    0xa8,
-    0xfb,
-    0x72,
-    0x2c,
-    0x53,
-    0xcc,
-    0xc2,
-    0x2c,
-    0xbc,
-    0x97,
-    0x93,
-    0x65,
-    0x4d,
-    0x69,
-    0xcc,
-    0xf0,
-    0x51,
-    0xb5,
-    0x25,
-    0x72,
-    0x63,
-    0xf5,
-    0x3b,
-    0xe5,
-    0x26,
-    0x94,
-    0xe4,
-    0x9b,
-    0x37,
-    0x0c,
-    0xbf,
-    0x7f,
-    0x60,
-    0x4c,
-    0x10,
-    0x9f,
-    0x0f,
-    0x5c,
-    0xcb,
-    0xe7,
-    0x06,
-    0x43,
-    0xef,
-    0x2f,
-    0x53,
-    0x29,
-    0x15,
-    0x79,
-    0x83,
-    0xb9,
-    0x49,
-    0x73,
-    0x13,
-    0xc9,
-    0x18,
-    0x44,
-    0x27,
-    0x3d,
-    0xea,
-    0x84,
-    0x7e,
-    0x28,
-    0x93,
-    0x8c,
-    0xa6,
-    0x35,
-    0x24,
-    0xf1,
-    0x6c,
-    0x46,
-    0x07,
-    0x4b,
-    0x97,
-    0x5a,
-    0x4b,
-    0x3b,
-    0xd6,
-    0xb4,
-    0x3c,
-    0xac,
-    0xf6,
-    0x3a,
-    0x37,
-    0x58,
-    0x58,
-    0x1b,
-    0xbc,
-    0x8e,
-    0xa3,
-    0xb4,
-    0xc5,
-    0x33,
-    0xb6,
-    0xb5,
-    0x56,
-    0x08,
-    0xe1,
-    0x7f,
-    0x56,
-    0x2a,
-    0x54,
-    0xd1,
-    0x9d,
-    0xdf,
-    0xd7,
-    0xa4,
-    0x4e,
-    0x8f,
-    0xbc,
-    0x53,
-    0x67,
-    0x11,
-    0x12,
-    0xff,
-    0x96,
-    0x29,
-    0x1c,
-    0x32,
-    0x4f,
-    0x4e,
-    0x02,
-    0xc2,
-    0x1b,
-    0xb0,
-    0xc5,
-    0xf9,
-    0x33,
-    0x79,
-    0x78,
-    0xf2,
-    0x4d,
-    0x53,
-    0xae,
-    0x46,
-    0xb6,
-    0x2b,
-    0x2f,
-    0xe9,
-    0xa1,
-    0x35,
-    0xef,
-    0x4e,
-    0xbf,
-    0x31,
-    0x40,
-    0xd2,
-    0x0f,
-    0xec,
-    0x46,
-    0x57,
-    0xf8,
-    0x09,
-    0xab,
-    0x2f,
-    0x95,
-    0x01,
-    0x95,
-    0x3d,
-    0x50,
-    0x69,
-    0xd5,
-    0x56,
-    0xb2,
-    0x74,
-    0x62,
-    0xed,
-    0x79,
-    0xb8,
-    0x05,
-    0xf0,
-    0xeb,
-    0x35,
-    0x55,
-    0xed,
-    0x6b,
-    0x93,
-    0xe6,
-    0x79,
-    0x4a,
-    0xab,
-    0xbe,
-    0xd2,
-    0xdf,
-    0x49,
-    0x08,
-    0xc3,
-    0xda,
-    0x30,
-    0x0d,
-    0xc8,
-    0xd5,
-    0x5f,
-    0x5f,
-    0x73,
-    0x2c,
-    0x93,
-    0x57,
-    0x0e,
-    0x0f,
-    0x0d,
-    0xc2,
-    0x82,
-    0xd5,
-    0x95,
-    0xd8,
-    0x78,
-    0x93,
-    0xbf,
-    0x6e,
-    0xbd,
-    0xee,
-    0x6d,
-    0x6c,
-    0xeb,
-    0x2d,
-    0x95,
-    0x80,
-    0x46,
-    0x93,
-    0x45,
-    0x14,
-    0xe4,
-    0xeb,
-    0xe4,
-    0x7e,
-    0x11,
-    0x64,
-    0xba,
-    0x77,
-    0xf1,
-    0x9f,
-    0xb3,
-    0xcf,
-    0x67,
-    0x07,
-    0x5f,
-    0x5f,
-    0x36,
-    0x61,
-    0x3e,
-    0x3e,
-    0x66,
-    0xa3,
-    0x3b,
-    0x38,
-    0xea,
-    0x0a,
-    0x76,
-    0x7b,
-    0x7f,
-    0x67,
-    0x46,
-    0x94,
-    0xd7,
-    0xba,
-    0x7f,
-    0x9a,
-    0xf7,
-    0x01,
-    0xf0,
-    0xa9,
-    0xde,
-    0x52,
-    0x30,
-    0x92,
-    0x67,
-    0x28,
-    0x9b,
-    0xd1,
-    0x70,
-    0xfb,
-    0x97,
-    0xc0,
-    0x3c,
-    0x13,
-    0x1c,
-    0x0a,
-    0x16,
-    0x9d,
-    0x73,
-    0x61,
-    0x37,
-    0xff,
-    0x3d,
-    0x74,
-    0xea,
-    0x69,
-    0xb8,
-    0x1b,
-    0xee,
-    0xac,
-    0x3e,
-    0xd5,
-    0x1c,
-    0x50,
-    0x0e,
-    0x75,
-    0x49,
-    0xe0,
-    0x4f,
-    0x18,
-    0x6e,
-    0x89,
-    0x52,
-    0x5a,
-    0x07,
-    0xe4,
-    0x18,
-    0xca,
-    0xb8,
-    0x0f,
-    0x14,
-    0x9b,
-    0x36,
-    0x02,
-    0x31,
-    0x9c,
-    0x65,
-    0x20,
-    0x17,
-    0x6a,
-    0xbe,
-    0x0d,
-    0xaa,
-    0xe3,
-    0xf4,
-    0xc0,
-    0xd4,
-    0xdf,
-    0xd7,
-    0xd9,
-    0x85,
-    0x1b,
-    0x78,
-    0x34,
-    0xf8,
-    0x76,
-    0x8e,
-    0xbe,
-    0x37,
-    0x60,
-    0x18,
-    0x87,
-    0xe1,
-    0x8f,
-    0x44,
-    0x19,
-    0x2b,
-    0xf3,
-    0x90,
-    0x09,
-    0x25,
-    0xed,
-    0x2f,
-    0xcb,
-    0x3f,
-    0xbc,
-    0xae,
-    0xca,
-    0x0b,
-    0x38,
-    0xd7,
-    0xb8,
-    0x44,
-    0xc2,
-    0xd6,
-    0x23,
-    0x10,
-    0x7b,
-    0x9a,
-    0x4a,
-    0x82,
-    0xb4,
-    0x7e,
-    0x2e,
-    0x63,
-    0xa6,
-    0x29,
-    0xec,
-    0x32,
-    0x63,
-    0xb2,
-    0x49,
-    0x69,
-    0x0d,
-    0x08,
-    0x8f,
-    0x02,
-    0x46,
-    0x92,
-    0x98,
-    0x3a,
-    0xe7,
-    0x12,
-    0x28,
-    0x95,
-    0xf5,
-    0xcf,
-    0x80,
-    0x22,
-    0xd1,
-    0xf3,
-    0x2f,
-    0x00,
-    0xae,
-    0x32,
-    0x2c,
-    0x21,
-    0x48,
-    0xac,
-    0x22,
-    0x4e,
-    0xd4,
-    0x15,
-    0x0b,
-    0x6b,
-    0x32,
-    0x13,
-    0x00,
-    0xfd,
-    0x6a,
-    0xe7,
-    0x4f,
-    0xe9,
-    0x56,
-    0x50,
-    0xcf,
-    0x7e,
-    0x9c,
-    0xac,
-    0x70,
-    0xb6,
-    0xe0,
-    0x61,
-    0x16,
-    0xb9,
-    0x37,
-    0x7b,
-    0xa8,
-    0xa3,
-    0xde,
-    0x97,
-    0x63,
-    0x87,
-    0x2c,
-    0xff,
-    0x75,
-    0xb4,
-    0xc5,
-    0x16,
-    0xc7,
-    0x37,
-    0x11,
-    0xf7,
-    0x1a,
-    0xa1,
-    0xec,
-    0x59,
-    0x55,
-    0x0a,
-    0x9f,
-    0xb6,
-    0x1d,
-    0x55,
-    0x0f,
-    0xac,
-    0xa7,
-    0xb6,
-    0x35,
-    0xa3,
-    0xca,
-    0x72,
-    0xce,
-    0xb0,
-    0x59,
-    0xe6,
-    0x54,
-    0xb9,
-    0xaf,
-    0xcb,
-    0x2c,
-    0xda,
-    0x8b,
-    0xb8,
-    0x21,
-    0x08,
-    0x1f,
-    0xe8,
-    0x11,
-    0xf4,
-    0x63,
-    0x3e,
-    0xe6,
-    0x32,
-    0xaf,
-    0x86,
-    0xc8,
-    0x9b,
-    0x89,
-    0xfe,
-    0x92,
-    0xf0,
-    0xbc,
-    0x15,
-    0x82,
-    0xc0,
-    0xaa,
-    0x72,
-    0x34,
-    0x8b,
-    0xe2,
-    0x38,
-    0xd1,
-    0x27,
-    0xf5,
-    0x89,
-    0x84,
-    0x63,
-    0x86,
-    0x49,
-    0x2d,
-    0xeb,
-    0xa1,
-    0x24,
-    0x5a,
-    0x6b,
-    0x4e,
-    0xd2,
-    0x73,
-    0xf7,
-    0x65,
-    0x99,
-    0x34,
-    0xab,
-    0xa3,
-    0x14,
-    0x60,
-    0x8e,
-    0xfe,
-    0x34,
-    0xb4,
-    0xbc,
-    0x36,
-    0x84,
-    0x1a,
-    0xc5,
-    0xad,
-    0xb1,
-    0x20,
-    0x50,
-    0x78,
-    0x49,
-    0xa8,
-    0x04,
-    0xb6,
-    0xc3,
-    0xe1,
-    0xa8,
-    0x20,
-    0xc0,
-    0x76,
-    0x88,
-    0xe2,
-    0x90,
-    0x05,
-    0x1b,
-    0xaa,
-    0xf8,
-    0xd2,
-    0xe4,
-    0xfe,
-    0x32,
-    0xbd,
-    0x96,
-    0xd2,
-    0x36,
-    0x71,
-    0x7b,
-    0x5a,
-    0x38,
-    0xdf,
-    0x16,
-    0x1d,
-    0x72,
-    0xeb,
-    0x08,
-    0x4b,
-    0x23,
-    0x64,
-    0x30,
-    0x50,
-    0xd8,
-    0x3a,
-    0x16,
-    0xa9,
-    0xea,
-    0xeb,
-    0x8a,
-    0xf6,
-    0x48,
-    0x3f,
-    0x88,
-    0x51,
-    0x76,
-    0x35,
-    0x5f,
-    0xdf,
-    0xd6,
-    0x3d,
-    0x12,
-    0xa4,
-    0x27,
-    0xa7,
-    0xff,
-    0x9c,
-    0x4b,
-    0x5c,
-    0xbe,
-    0x07,
-    0x4d,
-    0xcc,
-    0x4c,
-    0x04,
-    0xa2,
-    0x27,
-    0x69,
-    0x61,
-    0xaf,
-    0xd0,
-    0x3e,
-    0xb2,
-    0x8c,
-    0x0f,
-    0x43,
-    0xa0,
-    0x08,
-    0x06,
-    0x60,
-    0x84,
-    0xed,
-    0xe6,
-    0x53,
-    0x35,
-    0x85,
-    0x62,
-    0x51,
-    0x1d,
-    0x5c,
-    0x64,
-    0xf0,
-    0x93,
-    0x48,
-    0xff,
-    0x44,
-    0x65,
-    0xa7,
-    0xa6,
-    0x48,
-    0xb3,
-    0xe8,
-    0x9b,
-    0x80,
-    0x04,
-    0x4d,
-    0xa9,
-    0xdd,
-    0x93,
-    0xee,
-    0x16,
-    0xe1,
-    0xea,
-    0x02,
-    0xd4,
-    0x03,
-    0xb2,
-    0x5a,
-    0xf7,
-    0x55,
-    0xca,
-    0x2e,
-    0x6c,
-    0x64,
-    0x96,
-    0x1c,
-    0xe7,
-    0x60,
-    0x9a,
-    0x6e,
-    0x1d,
-    0x7d,
-    0x47,
-    0x9c,
-    0x34,
-    0x98,
-    0x14,
-    0x11,
-    0x77,
-    0x1e,
-    0xd1,
-    0x32,
-    0x4f,
-    0x2a,
-    0x38,
-    0x9d,
-    0x6e,
-    0xed,
-    0xc6,
-    0xae,
-    0x4e,
-    0x53,
-    0xc9,
-    0x48,
-    0xda,
-    0xe3,
-    0xb9,
-    0xd2,
-    0x6b,
-    0xe8,
-    0xcb,
-    0x7f,
-    0xf5,
-    0xce,
-    0xc4,
-    0xd3,
-    0x83,
-    0xce,
-    0x0b,
-    0x63,
-    0xe0,
-    0xce,
-    0x03,
-    0xdc,
-    0x97,
-    0x82,
-    0x97,
-    0x46,
-    0x1e,
-    0xd8,
-    0x17,
-    0x8a,
-    0x4f,
-    0x93,
-    0x42,
-    0x32,
-    0x17,
-    0x35,
-    0xa4,
-    0x71,
-    0x72,
-    0x23,
-    0x22,
-    0x63,
-    0x97,
-    0x04,
-    0xd3,
-    0x95,
-    0x6f,
-    0x6a,
-    0x11,
-    0xc8,
-    0x4c,
-    0xb4,
-    0xd0,
-    0xf2,
-    0xd8,
-    0x33,
-    0x2f,
-    0x86,
-    0x4c,
-    0x8b,
-    0x4d,
-    0xf5,
-    0xe2,
-    0x5c,
-    0x5e,
-    0x75,
-    0x8c,
-    0x22,
-    0xfe,
-    0x01,
-    0xe6,
-    0x5a,
-    0xc4,
-    0xa1,
-    0x69,
-    0xe7,
-    0x1b,
-    0xeb,
-    0xe2,
-    0xb3,
-    0x4d,
-    0xca,
-    0x23,
-    0x99,
-    0xe1,
-    0x7e,
-    0xf9,
-    0x83,
-    0x27,
-    0xe4,
-    0x5e,
-    0xcf,
-    0x11,
-    0xf8,
-    0xef,
-    0xf8,
-    0x44,
-    0x98,
-    0xa0,
-    0x72,
-    0x6f,
-    0x8b,
-    0xae,
-    0xd5,
-    0xdc,
-    0xc1,
-    0xd5,
-    0x3e,
-    0x45,
-    0xdc,
-    0xc4,
-    0xf2,
-    0xe8,
-    0xf0,
-    0xce,
-    0x45,
-    0xdd,
-    0x87,
-    0xe2,
-    0xbb,
-    0xa8,
-    0xe9,
-    0xbd,
-    0x6c,
-    0x0b,
-    0x9a,
-    0x5e,
-    0xad,
-    0x1e,
-    0x23,
-    0xba,
-    0xec,
-    0xa1,
-    0x15,
-    0xb2,
-    0xdc,
-    0x90,
-    0x4c,
-    0x42,
-    0xd3,
-    0xf8,
-    0x71,
-    0xfb,
-    0x70,
-    0x0a,
-    0xc2,
-    0xb3,
-    0x80,
-    0x6d,
-    0x16,
-    0x7b,
-    0x22,
-    0xd9,
-    0x1b,
-    0xd1,
-    0x2a,
-    0xe2,
-    0xe3,
-    0x17,
-    0xc4,
-    0x11,
-    0x9f,
-    0x44,
-    0x5a,
-    0x39,
-    0xaa,
-    0xda,
-    0xb7,
-    0x08,
-    0xc9,
-    0x18,
-    0x6c,
-    0xdd,
-    0xb1,
-    0x70,
-    0x72,
-    0xd9,
-    0xc9,
-    0x3b,
-    0x12,
-    0x39,
-    0x32,
-    0xac,
-    0x02,
-    0xe3,
-    0x05,
-    0x02,
-    0xd1,
-    0x3e,
-    0xdb,
-    0x02,
-    0x84,
-    0x47,
-    0x93,
-    0xa5,
-    0x82,
-    0xe2,
-    0x4f,
-    0x0e,
-    0xad,
-    0x6d,
-    0xc0,
-    0xbe,
-    0xd2,
-    0x9b,
-    0xa4,
-    0x0b,
-    0x43,
-    0x80,
-    0x8c,
-    0xce,
-    0xc2,
-    0xe8,
-    0xe3,
-    0x5d,
-    0xa1,
-    0xed,
-    0x2c,
-    0xb9,
-    0x28,
-    0xc9,
-    0x8b,
-    0x08,
-    0x37,
-    0xe8,
-    0x87,
-    0x45,
-    0x2c,
-    0x42,
-    0x0e,
-    0x36,
-    0x07,
-    0xe7,
-    0xb9,
-    0x9e,
-    0xcd,
-    0xdb,
-    0x52,
-    0xb5,
-    0x2a,
-    0x25,
-    0x94,
-    0xd5,
-    0x59,
-    0x23,
-    0x31,
-    0x76,
-    0x49,
-    0x20,
-    0x1a,
-    0x5c,
-    0xf8,
-    0x28,
-    0xfa,
-    0x0f,
-    0x23,
-    0x1b,
-    0x03,
-    0x8c,
-    0x22,
-    0x01,
-    0xee,
-    0x3a,
-    0x0e,
-    0x9d,
-    0x3d,
-    0x1f,
-    0x24,
-    0x45,
-    0xc4,
-    0x54,
-    0x6e,
-    0xf1,
-    0x67,
-    0xb6,
-    0xa0,
-    0x91,
-    0x25,
-    0xdf,
-    0x40,
-    0xa4,
-    0x56,
-    0x55,
-    0x09,
-    0x06,
-    0x30,
-    0x00,
-    0x92,
-    0x09,
-    0x90,
-    0xe2,
-    0x2b,
-    0xc8,
-    0xf8,
-    0x02,
-    0x07,
-    0xb8,
-    0xd3,
-    0xa9,
-    0xa1,
-    0x80,
-    0x01,
-    0xd1,
-    0x58,
-    0x0b,
-    0x8f,
-    0xdb,
-    0x5c,
-    0xdb,
-    0xc6,
-    0x80,
-    0xce,
-    0xa0,
-    0x68,
-    0x0a,
-    0x23,
-    0x09,
-    0x36,
-    0xc4,
-    0xca,
-    0xda,
-    0xb5,
-    0xaf,
-    0x0e,
-    0x3f,
-    0x32,
-    0x76,
-    0x3d,
-    0x5f,
-    0x04,
-    0xa4,
-    0x0a,
-    0x35,
-    0x11,
-    0x15,
-    0x30,
-    0x9b,
-    0x94,
-    0xaa,
-    0x58,
-    0xa8,
-    0x1d,
-    0x41,
-    0x3d,
-    0x3c,
-    0xd9,
-    0xe5,
-    0x0e,
-    0xd9,
-    0x13,
-    0x41,
-    0x14,
-    0xb5,
-    0xfb,
-    0x5b,
-    0x94,
-    0x0d,
-    0xa6,
-    0x7f,
-    0xf7,
-    0xbb,
-    0x57,
-    0x78,
-    0x28,
-    0x0b,
-    0xfd,
-    0x07,
-    0x3e,
-    0xcb,
-    0xfc,
-    0x8d,
-    0x5b,
-    0xa1,
-    0x30,
-    0x0b,
-    0xd3,
-    0xa2,
-    0x2f,
-    0x4c,
-    0x91,
-    0x1f,
-    0xcf,
-    0x61,
-    0xb7,
-    0xc2,
-    0xe9,
-    0x4e,
-    0x85,
-    0xda,
-    0x5c,
-    0x03,
-    0x7c,
-    0xf4,
-    0x54,
-    0x8e,
-    0xc3,
-    0xab,
-    0xcc,
-    0x8e,
-    0xc9,
-    0xc1,
-    0x51,
-    0xeb,
-    0x2c,
-    0x6e,
-    0x09,
-    0xc4,
-    0xda,
-    0xf7,
-    0xf5,
-    0xa9,
-    0x76,
-    0x83,
-    0x73,
-    0x0b,
-    0xfd,
-    0x2b,
-    0x07,
-    0xf0,
-    0xa9,
-    0x50,
-    0x5a,
-    0xeb,
-    0x15,
-    0x31,
-    0x83,
-    0x4c,
-    0xa3,
-    0xbc,
-    0x86,
-    0x94,
-    0x1b,
-    0xa5,
-    0x1a,
-    0x2c,
-    0x94,
-    0xb6,
-    0xb0,
-    0x56,
-    0x98,
-    0x66,
-    0xb0,
-    0x63,
-    0x83,
-    0xac,
-    0x06,
-    0x27,
-    0x2c,
-    0x15,
-    0xdd,
-    0xaa,
-    0xc7,
-    0x15,
-    0xaa,
-    0x20,
-    0x0a,
-    0x9a,
-    0x6d,
-    0x1b,
-    0x8f,
-    0xe7,
-    0x34,
-    0x00,
-    0x7a,
-    0xa0,
-    0xe0,
-    0xb7,
-    0x5b,
-    0x21,
-    0x2b,
-    0xa7,
-    0x56,
-    0x14,
-    0xea,
-    0xe2,
-    0x81,
-    0x43,
-    0x90,
-    0x9c,
-    0x8d,
-    0xaa,
-    0xf4,
-    0xe2,
-    0xa9,
-    0xd1,
-    0x54,
-    0x89,
-    0xa3,
-    0x59,
-    0x99,
-    0x64,
-    0x50,
-    0xd4,
-    0xdc,
-    0xba,
-    0x2f,
-    0xda,
-    0x2a,
-    0xf6,
-    0x49,
-    0x59,
-    0x84,
-    0xa1,
-    0x5b,
-    0x2c,
-    0x2a,
-    0x8e,
-    0x37,
-    0xef,
-    0x1a,
-    0x54,
-    0x68,
-    0x12,
-    0xd3,
-    0x01,
-    0x15,
-    0x2d,
-    0x5e,
-    0x0d,
-    0x28,
-    0x93,
-    0x8f,
-    0x8d,
-    0xae,
-    0x2a,
-    0x89,
-    0xa9,
-    0x81,
-    0x7a,
-    0x80,
-    0x50,
-    0x25,
-    0x03,
-    0xc3,
-    0x2b,
-    0xf1,
-    0xd4,
-    0xf9,
-    0xcf,
-    0x6f,
-    0x59,
-    0xaa,
-    0x36,
-    0x05,
-    0x75,
-    0x02,
-    0x70,
-    0xd4,
-    0xd0,
-    0xd2,
-    0x96,
-    0xe0,
-    0x73,
-    0xd8,
-    0x00,
-    0x71,
-    0x92,
-    0x40,
-    0xb7,
-    0xba,
-    0xa8,
-    0x6a,
-    0x2d,
-    0xb9,
-    0xca,
-    0xee,
-    0x2c,
-    0x5e,
-    0x34,
-    0xde,
-    0x0d,
-    0xef,
-    0x29,
-    0x4b,
-    0x2a,
-    0xab,
-    0xfa,
-    0x0a,
-    0x96,
-    0xae,
-    0x64,
-    0xb7,
-    0x0b,
-    0x14,
-    0x1e,
-    0xfb,
-    0x23,
-    0x61,
-    0xb3,
-    0x0b,
-    0xcb,
-    0x21,
-    0x8e,
-    0x71,
-    0xf5,
-    0xcb,
-    0x53,
-    0x0f,
-    0x8e,
-    0xeb,
-    0x76,
-    0x61,
-    0xb0,
-    0x80,
-    0x06,
-    0x02,
-    0x18,
-    0xa3,
-    0xc9,
-    0x72,
-    0xda,
-    0x6a,
-    0x8e,
-    0x16,
-    0x53,
-    0x0c,
-    0xbf,
-    0x80,
-    0x60,
-    0x46,
-    0x36,
-    0xf1,
-    0xcd,
-    0xfd,
-    0x51,
-    0x1c,
-    0x11,
-    0x24,
-    0x49,
-    0x2d,
-    0x38,
-    0xe0,
-    0xbf,
-    0x0a,
-    0x20,
-    0xea,
-    0x98,
-    0xd9,
-    0xe8,
-    0x36,
-    0x0b,
-    0xc2,
-    0xa6,
-    0xd2,
-    0xf8,
-    0xf6,
-    0x58,
-    0x10,
-    0x7c,
-    0xf0,
-    0x1e,
-    0xe7,
-    0xc2,
-    0xfb,
-    0xa6,
-    0x97,
-    0x1c,
-    0xf4,
-    0xe7,
-    0x8c,
-    0x52,
-    0x51,
-    0x12,
-    0x85,
-    0x3a,
-    0x62,
-    0xc5,
-    0xf5,
-    0x88,
-    0xd7,
-    0x82,
-    0xa9,
-    0xe8,
-    0x83,
-    0x61,
-    0xac,
-    0x4a,
-    0x5f,
-    0x01,
-    0x68,
-    0x7d,
-    0xd2,
-    0xc4,
-    0x0d,
-    0x00,
-    0x2f,
-    0x3c,
-    0x37,
-    0x15,
-    0x80,
-    0xe0,
-    0xcb,
-    0x16,
-    0x82,
-    0x04,
-    0x21,
-    0x0c,
-    0xf0,
-    0x08,
-    0x69,
-    0x7e,
-    0x04,
-    0xcf,
-    0x47,
-    0x87,
-    0x3c,
-    0x72,
-    0xc1,
-    0x2b,
-    0x5a,
-    0x36,
-    0x5b,
-    0xeb,
-    0xae,
-    0xbc,
-    0x80,
-    0x97,
-    0x97,
-    0x78,
-    0x24,
-    0x64,
-    0x48,
-    0x64,
-    0xa8,
-    0x3f,
-    0xc8,
-    0xf6,
-    0xfe,
-    0x60,
-    0x3c,
-    0x4f,
-    0x0d,
-    0x21,
-    0x69,
-    0xb5,
-    0x57,
-    0x11,
-    0x75,
-    0x43,
-    0xd9,
-    0x44,
-    0xed,
-    0xdf,
-    0x32,
-    0xee,
-    0x0d,
-    0x6d,
-    0x08,
-    0x30,
-    0x3b,
-    0x42,
-    0xa8,
-    0x32,
-    0xd4,
-    0xdc,
-    0xec,
-    0x72,
-    0x2b,
-    0xd0,
-    0x62,
-    0x5c,
-    0xcf,
-    0x03,
-    0xaa,
-    0x1a,
-    0x0d,
-    0x1d,
-    0x20,
-    0xad,
-    0xb6,
-    0x3b,
-    0xbc,
-    0x3d,
-    0x23,
-    0xe5,
-    0x36,
-    0xad,
-    0x75,
-    0x3f,
-    0x6d,
-    0x73,
-    0x21,
-    0x83,
-    0x09,
-    0xa7,
-    0xad,
-    0xae,
-    0x5f,
-    0x59,
-    0xb4,
-    0x7a,
-    0x96,
-    0x28,
-    0x30,
-    0x8d,
-    0x08,
-    0x10,
-    0xf9,
-    0xf0,
-    0xeb,
-    0x84,
-    0x88,
-    0xc2,
-    0x31,
-    0xbd,
-    0x01,
-    0x2e,
-    0xac,
-    0x51,
-    0x71,
-    0x9a,
-    0x76,
-    0x07,
-    0x53,
-    0x21,
-    0x90,
-    0xea,
-    0x5a,
-    0x44,
-    0xc9,
-    0x9c,
-    0x6a,
-    0xdc,
-    0xe2,
-    0xed,
-    0xe7,
-    0x53,
-    0xef,
-    0xac,
-    0x33,
-    0x14,
-    0x00,
-    0xbe,
-    0x72,
-    0x40,
-    0x01,
-    0x6c,
-    0x91,
-    0xa3,
-    0xdf,
-    0x01,
-    0x86,
-    0xe6,
-    0xed,
-    0x95,
-    0xd9,
-    0x06,
-    0x85,
-    0x24,
-    0x63,
-    0x05,
-    0xf2,
-    0xe3,
-    0x56,
-    0xdf,
-    0x8d,
-    0xd3,
-    0x7d,
-    0xbf,
-    0x27,
-    0x96,
-    0xc5,
-    0x73,
-    0xa7,
-    0x82,
-    0xfd,
-    0x1d,
-    0xf4,
-    0xf4,
-    0xda,
-    0x2c,
-    0x16,
-    0xe6,
-    0x3e,
-    0x8b,
-    0x98,
-    0xc4,
-    0xb9,
-    0x18,
-    0x30,
-    0x7c,
-    0x51,
-    0x58,
-    0xa2,
-    0xd5,
-    0x7e,
-    0x69,
-    0xe1,
-    0x01,
-    0x79,
-    0x38,
-    0x77,
-    0x75,
-    0xb6,
-    0xf4,
-    0x28,
-    0xf8,
-    0xaf,
-    0xc2,
-    0xd2,
-    0xfa,
-    0xe4,
-    0xb2,
-    0x98,
-    0x28,
-    0x20,
-    0xf1,
-    0x3f,
-    0x3d,
-    0xfd,
-    0x41,
-    0xd8,
-    0x1b,
-    0xaa,
-    0xa7,
-    0xa0,
-    0x1a,
-    0xec,
-    0x63,
-    0x24,
-    0xa0,
-    0x63,
-    0x25,
-    0xa9,
-    0xf2,
-    0x0f,
-    0x7e,
-    0xca,
-    0x49,
-    0x13,
-    0x95,
-    0x63,
-    0x29,
-    0xb8,
-    0x1b,
-    0xae,
-    0xee,
-    0xb4,
-    0x81,
-    0xac,
-    0xa8,
-    0xad,
-    0x68,
-    0xc7,
-    0x28,
-    0xf9,
-    0x59,
-    0xb5,
-    0x5b,
-    0xa8,
-    0xb6,
-    0x9f,
-    0xd7,
-    0xc4,
-    0xf0,
-    0x83,
-    0xb4,
-    0xd7,
-    0xfb,
-    0xd7,
-    0x9d,
-    0xae,
-    0xff,
-    0x6f,
-    0x26,
-    0x5d,
-    0x51,
-    0xa0,
-    0x60,
-    0x83,
-    0xa1,
-    0xa6,
-    0xac,
-    0xcf,
-    0x75,
-    0x43,
-    0xcc,
-    0xc3,
-    0xd6,
-    0xa9,
-    0x40,
-    0xb8,
-    0x48,
-    0x9a,
-    0xcf,
-    0x23,
-    0x00,
-    0xce,
-    0x64,
-    0x16,
-    0x52,
-    0x95,
-    0x1b,
-    0x0a,
-    0x69,
-    0xbd,
-    0x9c,
-    0xdb,
-    0x3a,
-    0xb6,
-    0xa8,
-    0x14,
-    0xba,
-    0xf4,
-    0xf1,
-    0x6d,
-    0x4f,
-    0x95,
-    0x2f,
-    0x92,
-    0x85,
-    0x44,
-    0x70,
-    0x26,
-    0x03,
-    0x5d,
-    0xaf,
-    0x08,
-    0xbd,
-    0x51,
-    0xa9,
-    0xd5,
-    0x6b,
-    0x4d,
-    0xec,
-    0xae,
-    0x39,
-    0x16,
-    0x31,
-    0x3b,
-    0xc0,
-    0x38,
-    0xeb,
-    0xef,
-    0x35,
-    0x5f,
-    0x20,
-    0x8e,
-    0xe0,
-    0x05,
-    0x78,
-    0xed,
-    0xd0,
-    0x4d,
-    0x94,
-    0xfa,
-    0xce,
-    0x2f,
-    0xa0,
-    0xfb,
-    0x8f,
-    0xd6,
-    0x2c,
-    0x1b,
-    0x2e,
-    0x46,
-    0x37,
-    0x22,
-    0xd9,
-    0x42,
-    0x8d,
-    0x84,
-    0xca,
-    0x6d,
-    0x54,
-    0x9d,
-    0x78,
-    0xaf,
-    0xe1,
-    0x3b,
-    0x0f,
-    0xda,
-    0xd0,
-    0x5d,
-    0x1e,
-    0x8e,
-    0x53,
-    0x3a,
-    0x90,
-    0x5a,
-    0xca,
-    0x85,
-    0xde,
-    0x23,
-    0x94,
-    0xf0,
-    0x83,
-    0xca,
-    0x25,
-    0xef,
-    0xaf,
-    0x09,
-    0x59,
-    0xbe,
-    0x3f,
-    0x9e,
-    0x08,
-    0xa5,
-    0xed,
-    0xac,
-    0xdb,
-    0x7b,
-    0xc4,
-    0x5e,
-    0x5e,
-    0x69,
-    0xd8,
-    0xcd,
-    0x56,
-    0xf0,
-    0x33,
-    0x24,
-    0x54,
-    0x2d,
-    0x12,
-    0x02,
-    0x8a,
-    0x5c,
-    0x52,
-    0x1f,
-    0xde,
-    0x9c,
-    0x25,
-    0x33,
-    0x3d,
-    0xf1,
-    0x09,
-    0x13,
-    0x32,
-    0x8f,
-    0xfb,
-    0x1d,
-    0xb7,
-    0x56,
-    0xe7,
-    0xd7,
-    0x4b,
-    0x99,
-    0x64,
-    0xd3,
-    0x44,
-    0x23,
-    0x9e,
-    0xd6,
-    0x67,
-    0x7c,
-    0x93,
-    0x38,
-    0xb6,
-    0x68,
-    0x83,
-    0x8e,
-    0x89,
-    0xb1,
-    0xa1,
-    0x87,
-    0xe0,
-    0x26,
-    0x0f,
-    0x14,
-    0xf8,
-    0xe4,
-    0x09,
-    0xcc,
-    0x1c,
-    0xd4,
-    0x61,
-    0x8e,
-    0xbe,
-    0x75,
-    0x2b,
-    0x68,
-    0xc6,
-    0xdc,
-    0xb9,
-    0xb7,
-    0x2a,
-    0xf9,
-    0xca,
-    0x90,
-    0xbf,
-    0x1b,
-    0xfe,
-    0x5f,
-    0x4f,
-    0xb6,
-    0x8d,
-    0xce,
-    0xeb,
-    0x65,
-    0x39,
-    0xe9,
-    0x82,
-    0x2b,
-    0x81,
-    0x7f,
-    0xb3,
-    0xfe,
-    0x18,
-    0xcb,
-    0xe0,
-    0x86,
-    0x95,
-    0x53,
-    0x84,
-    0x22,
-    0x6c,
-    0x11,
-    0xc6,
-    0x2c,
-    0x1d,
-    0xd1,
-    0x4e,
-    0x7e,
-    0xab,
-    0xda,
-    0x57,
-    0x34,
-    0x50,
-    0xd0,
-    0x05,
-    0xb4,
-    0x6f,
-    0xd9,
-    0xf9,
-    0xec,
-    0xca,
-    0xff,
-    0x24,
-    0xdb,
-    0xf5,
-    0xd6,
-    0xd8,
-    0x53,
-    0x0b,
-    0x5e,
-    0x25,
-    0xfd,
-    0x9f,
-    0x2a,
-    0x62,
-    0x9d,
-    0xf5,
-    0xc2,
-    0x0a,
-    0x97,
-    0x72,
-    0x47,
-    0xca,
-    0xb3,
-    0x52,
-    0x55,
-    0xd7,
-    0x1d,
-    0x99,
-    0x2d,
-    0x85,
-    0xb0,
-    0x4c,
-    0x14,
-    0x16,
-    0x73,
-    0xe0,
-    0xf6,
-    0xcf,
-    0x64,
-    0xf3,
-    0x4f,
-    0x52,
-    0x75,
-    0x3a,
-    0x4c,
-    0x27,
-    0xd5,
-    0xbb,
-    0x2d,
-    0x9c,
-    0x70,
-    0x3c,
-    0xed,
-    0xcf,
-    0xb9,
-    0xfb,
-    0x25,
-    0x09,
-    0xa7,
-    0x9f,
-    0x2e,
-    0x4d,
-    0xfd,
-    0x6f,
-    0x85,
-    0x31,
-    0xcf,
-    0xc2,
-    0x74,
-    0xed,
-    0x42,
-    0xb6,
-    0xef,
-    0xb2,
-    0x93,
-    0x25,
-    0xbd,
-    0x3d,
-    0x5b,
-    0xd5,
-    0xd8,
-    0xab,
-    0x11,
-    0xef,
-    0x15,
-    0x8f,
-    0xd0,
-    0xb3,
-    0x07,
-    0x42,
-    0x5a,
-    0x69,
-    0x21,
-    0x7a,
-    0x5e,
-    0x9b,
-    0x1c,
-    0x1e,
-    0xf6,
-    0x81,
-    0x98,
-    0x59,
-    0x74,
-    0xbd,
-    0x06,
-    0xee,
-    0x5e,
-    0x49,
-    0xc5,
-    0xcb,
-    0xb7,
-    0xad,
-    0x8b,
-    0xe0,
-    0x80,
-    0x75,
-    0x07,
-    0x31,
-    0x7f,
-    0xe2,
-    0xc5,
-    0x2a,
-    0x3f,
-    0xe0,
-    0x51,
-    0x33,
-    0x58,
-    0x38,
-    0x9f,
-    0x85,
-    0xf0,
-    0x07,
-    0xaa,
-    0x3c,
-    0x82,
-    0x6f,
-    0x5c,
-    0xad,
-    0xdf,
-    0x8c,
-    0xae,
-    0xf9,
-    0x72,
-    0xa9,
-    0x10,
-    0xe3,
-    0xc7,
-    0xb4,
-    0x0b,
-    0xde,
-    0x4f,
-    0xf0,
-    0x25,
-    0x6a,
-    0x5d,
-    0xea,
-    0x05,
-    0xa1,
-    0x75,
-    0xae,
-    0xd7,
-    0x0d,
-    0xc6,
-    0x3a,
-    0xf2,
-    0xbd,
-    0xf5,
-    0x33,
-    0xb8,
-    0x98,
-    0x1c,
-    0xd7,
-    0xbe,
-    0xf1,
-    0x13,
-    0x33,
-    0x2e,
-    0x5b,
-    0xee,
-    0x96,
-    0x69,
-    0xbe,
-    0xc6,
-    0x45,
-    0xf0,
-    0xaa,
-    0xbd,
-    0x70,
-    0x84,
-    0xec,
-    0x3c,
-    0x65,
-    0x8c,
-    0x5f,
-    0x7f,
-    0x04,
-    0xb8,
-    0x05,
-    0x54,
-    0x73,
-    0xe4,
-    0x56,
-    0x1f,
-    0x13,
-    0x3f,
-    0xd8,
-    0x22,
-    0xb2,
-    0xac,
-    0xf0,
-    0xfb,
-    0x02,
-    0x68,
-    0xf8,
-    0x6e,
-    0x49,
-    0xed,
-    0x91,
-    0x65,
-    0x5b
-  ],
-  const [
-    0x52,
-    0xa7,
-    0x68,
-    0x55,
-    0xb4,
-    0x15,
-    0xa3,
-    0x57,
-    0xd6,
-    0x74,
-    0x78,
-    0x42,
-    0x14,
-    0x01,
-    0x41,
-    0xdc,
-    0xa7,
-    0x5e,
-    0x25,
-    0x7d,
-    0x1c,
-    0x37,
-    0x31,
-    0xcf,
-    0x04,
-    0x26,
-    0xaa,
-    0xd2,
-    0xee,
-    0xd4,
-    0xa2,
-    0x23,
-    0x92,
-    0x62,
-    0xca,
-    0x7d,
-    0x4f,
-    0x07,
-    0x87,
-    0x80,
-    0xd8,
-    0xfa,
-    0x48,
-    0xb1,
-    0x2a,
-    0x92,
-    0x16,
-    0xc3,
-    0xc1,
-    0xab,
-    0x6d,
-    0x15,
-    0x0b,
-    0x4d,
-    0x4a,
-    0x7b,
-    0x1d,
-    0x88,
-    0x85,
-    0x41,
-    0xa5,
-    0xa2,
-    0x61,
-    0x6d,
-    0x1f,
-    0x75,
-    0x62,
-    0x45,
-    0x4c,
-    0x12,
-    0x5e,
-    0x11,
-    0xe0,
-    0xaa,
-    0xd7,
-    0x22,
-    0x7b,
-    0xaf,
-    0x88,
-    0x13,
-    0xdb,
-    0x36,
-    0x3e,
-    0x4f,
-    0x50,
-    0xa0,
-    0xe9,
-    0xd3,
-    0x70,
-    0x79,
-    0xf3,
-    0x36,
-    0x0b,
-    0xa0,
-    0xd0,
-    0xe6,
-    0x62,
-    0xa8,
-    0xd7,
-    0xb4,
-    0x93,
-    0x7f,
-    0x50,
-    0x93,
-    0x58,
-    0x4d,
-    0xce,
-    0x9c,
-    0xf1,
-    0x9f,
-    0xbf,
-    0x56,
-    0x5f,
-    0xc5,
-    0x41,
-    0x35,
-    0xd3,
-    0x78,
-    0x37,
-    0x60,
-    0x66,
-    0xc1,
-    0x9c,
-    0xb7,
-    0x0a,
-    0x16,
-    0x18,
-    0x15,
-    0xc1,
-    0xc5,
-    0xd1,
-    0xd2,
-    0x0d,
-    0x96,
-    0x84,
-    0x8d,
-    0xa7,
-    0xab,
-    0xd4,
-    0x28,
-    0x73,
-    0xac,
-    0xe2,
-    0x13,
-    0xb4,
-    0x21,
-    0x1d,
-    0xce,
-    0x7d,
-    0x1f,
-    0x5c,
-    0xa9,
-    0x68,
-    0x27,
-    0x2a,
-    0xcf,
-    0x89,
-    0x4b,
-    0x60,
-    0x82,
-    0xa5,
-    0x92,
-    0xfa,
-    0xa8,
-    0xa0,
-    0x9e,
-    0x23,
-    0x87,
-    0x35,
-    0x8c,
-    0x92,
-    0xcd,
-    0xea,
-    0x1c,
-    0x19,
-    0xd3,
-    0x42,
-    0x12,
-    0x7b,
-    0x22,
-    0x34,
-    0xdc,
-    0x7f,
-    0x37,
-    0xdc,
-    0x74,
-    0x42,
-    0x83,
-    0x71,
-    0x88,
-    0xd1,
-    0xb6,
-    0x77,
-    0xd9,
-    0xf7,
-    0x3d,
-    0x35,
-    0xe1,
-    0x54,
-    0x09,
-    0x6a,
-    0xb8,
-    0xaf,
-    0x93,
-    0x3c,
-    0x38,
-    0x8e,
-    0x1d,
-    0x71,
-    0x60,
-    0x03,
-    0x3a,
-    0xe1,
-    0xf6,
-    0xc8,
-    0x90,
-    0x2b,
-    0x70,
-    0x8e,
-    0xdd,
-    0xa8,
-    0x15,
-    0x93,
-    0x38,
-    0x9d,
-    0x60,
-    0x73,
-    0x9a,
-    0xb5,
-    0xa5,
-    0x40,
-    0x9c,
-    0xae,
-    0xf6,
-    0xd4,
-    0x82,
-    0x52,
-    0x48,
-    0x66,
-    0x79,
-    0xa9,
-    0xd2,
-    0x5c,
-    0x1d,
-    0x6d,
-    0xb6,
-    0x60,
-    0x3e,
-    0xbe,
-    0xe3,
-    0xb6,
-    0xe4,
-    0x17,
-    0x3a,
-    0xcd,
-    0x90,
-    0x81,
-    0xf0,
-    0x14,
-    0xc5,
-    0x06,
-    0x33,
-    0x0e,
-    0xc7,
-    0x69,
-    0x10,
-    0xa9,
-    0xa3,
-    0x14,
-    0x94,
-    0xcc,
-    0x6f,
-    0x52,
-    0x31,
-    0x2f,
-    0xd3,
-    0xbe,
-    0x64,
-    0x6f,
-    0xc9,
-    0xfc,
-    0x95,
-    0x62,
-    0xa0,
-    0xa6,
-    0x3f,
-    0xa8,
-    0x47,
-    0x89,
-    0x50,
-    0x82,
-    0xc8,
-    0x12,
-    0xd3,
-    0xe7,
-    0x13,
-    0x03,
-    0xcc,
-    0xd5,
-    0xfd,
-    0x6a,
-    0x63,
-    0xe6,
-    0x88,
-    0xd4,
-    0x45,
-    0x23,
-    0x65,
-    0xbe,
-    0x48,
-    0x1c,
-    0xb7,
-    0x4c,
-    0x4e,
-    0x39,
-    0x1a,
-    0x3e,
-    0x6b,
-    0x4b,
-    0xe4,
-    0x1f,
-    0x4a,
-    0x66,
-    0xab,
-    0xbf,
-    0xcc,
-    0xf3,
-    0x07,
-    0xe4,
-    0xf3,
-    0x01,
-    0x98,
-    0x3d,
-    0xff,
-    0xdc,
-    0x4b,
-    0x97,
-    0xd6,
-    0xe1,
-    0xda,
-    0x53,
-    0xa9,
-    0x90,
-    0x92,
-    0x18,
-    0xd5,
-    0xe3,
-    0x59,
-    0xc5,
-    0x07,
-    0xde,
-    0xef,
-    0xaa,
-    0xa4,
-    0x68,
-    0x74,
-    0xf7,
-    0x68,
-    0x59,
-    0x2b,
-    0x74,
-    0x4d,
-    0xd4,
-    0x7d,
-    0x73,
-    0xae,
-    0xd7,
-    0x41,
-    0x04,
-    0xac,
-    0x10,
-    0x3a,
-    0x67,
-    0xd1,
-    0xf3,
-    0xe1,
-    0xc7,
-    0xf3,
-    0x09,
-    0x65,
-    0x25,
-    0x5b,
-    0x8b,
-    0xf1,
-    0x92,
-    0x27,
-    0x2f,
-    0x2d,
-    0xa1,
-    0xed,
-    0x42,
-    0x07,
-    0x1c,
-    0xa1,
-    0xf7,
-    0xb3,
-    0xf6,
-    0xb9,
-    0xff,
-    0xf0,
-    0x81,
-    0x8e,
-    0x59,
-    0x8e,
-    0xe1,
-    0x06,
-    0x6c,
-    0x2d,
-    0xc1,
-    0x70,
-    0x53,
-    0x47,
-    0x44,
-    0xaf,
-    0x78,
-    0x71,
-    0x3e,
-    0x9b,
-    0x64,
-    0xdd,
-    0xa5,
-    0xa4,
-    0xd5,
-    0x24,
-    0x42,
-    0xb9,
-    0x11,
-    0x42,
-    0xac,
-    0x68,
-    0x7b,
-    0xe2,
-    0x77,
-    0x46,
-    0x64,
-    0xdd,
-    0xa9,
-    0x91,
-    0x23,
-    0xfd,
-    0x6d,
-    0x14,
-    0x68,
-    0x06,
-    0x0c,
-    0x4b,
-    0xcd,
-    0xf7,
-    0x18,
-    0xc8,
-    0xae,
-    0x8d,
-    0xeb,
-    0xd5,
-    0x3b,
-    0x09,
-    0x50,
-    0x5b,
-    0xcb,
-    0x33,
-    0x7f,
-    0x02,
-    0x74,
-    0x9f,
-    0x4f,
-    0x9a,
-    0xd8,
-    0x2f,
-    0xa7,
-    0xba,
-    0x41,
-    0xd9,
-    0x35,
-    0xa6,
-    0xf1,
-    0xaa,
-    0x63,
-    0x76,
-    0xb3,
-    0x0b,
-    0x87,
-    0x75,
-    0xb6,
-    0x44,
-    0x5a,
-    0xc8,
-    0x9b,
-    0x3e,
-    0xac,
-    0x50,
-    0xcd,
-    0x8d,
-    0x56,
-    0xd1,
-    0x11,
-    0xad,
-    0x6f,
-    0x53,
-    0x5e,
-    0x8c,
-    0xc3,
-    0xc8,
-    0xee,
-    0x49,
-    0x80,
-    0xf0,
-    0x95,
-    0x3c,
-    0x33,
-    0x7a,
-    0x52,
-    0x36,
-    0xf3,
-    0x6c,
-    0x24,
-    0x0a,
-    0xdc,
-    0xc4,
-    0x1e,
-    0x4c,
-    0xc0,
-    0x5f,
-    0xbe,
-    0x58,
-    0x18,
-    0x1b,
-    0x7b,
-    0x96,
-    0x41,
-    0x39,
-    0x9d,
-    0xfd,
-    0xe5,
-    0x05,
-    0x51,
-    0xd6,
-    0xb7,
-    0xb8,
-    0xfd,
-    0xc3,
-    0x63,
-    0x9d,
-    0xd1,
-    0xff,
-    0xc4,
-    0x73,
-    0x9f,
-    0xe7,
-    0x58,
-    0x13,
-    0xec,
-    0xba,
-    0xf2,
-    0x52,
-    0x47,
-    0x9d,
-    0xaf,
-    0x29,
-    0xd9,
-    0xe2,
-    0x2b,
-    0x13,
-    0x3e,
-    0x89,
-    0xf5,
-    0xb7,
-    0x93,
-    0x07,
-    0x40,
-    0xc7,
-    0xd0,
-    0x47,
-    0xdb,
-    0x28,
-    0x58,
-    0xef,
-    0x63,
-    0x53,
-    0xcf,
-    0xe4,
-    0xb7,
-    0xfb,
-    0x2c,
-    0x10,
-    0xac,
-    0xf0,
-    0x0f,
-    0x63,
-    0x02,
-    0x43,
-    0x54,
-    0x17,
-    0x97,
-    0xab,
-    0xe8,
-    0x39,
-    0xdb,
-    0x27,
-    0xdb,
-    0x65,
-    0x84,
-    0xe5,
-    0xb7,
-    0xd1,
-    0x83,
-    0x63,
-    0x11,
-    0x8c,
-    0x36,
-    0xd4,
-    0x5d,
-    0x08,
-    0xdf,
-    0xc5,
-    0x07,
-    0xd7,
-    0x55,
-    0x00,
-    0xbf,
-    0xb2,
-    0xf9,
-    0xb0,
-    0x14,
-    0xbf,
-    0xec,
-    0xc7,
-    0x44,
-    0x14,
-    0x7f,
-    0x9d,
-    0x52,
-    0x77,
-    0xeb,
-    0xd9,
-    0x5a,
-    0x67,
-    0x43,
-    0x95,
-    0x22,
-    0x61,
-    0xa6,
-    0xbd,
-    0xf1,
-    0x5c,
-    0xb9,
-    0xb8,
-    0xa4,
-    0x96,
-    0x54,
-    0x4b,
-    0xfe,
-    0x92,
-    0x7c,
-    0xba,
-    0x40,
-    0x61,
-    0x92,
-    0x30,
-    0xf9,
-    0x22,
-    0xc9,
-    0x60,
-    0x20,
-    0xc5,
-    0xde,
-    0x6d,
-    0x60,
-    0x14,
-    0x03,
-    0x07,
-    0xb3,
-    0xf3,
-    0x1c,
-    0xd8,
-    0x32,
-    0xe6,
-    0x2d,
-    0x1e,
-    0x2c,
-    0xd5,
-    0x13,
-    0x99,
-    0x75,
-    0x0c,
-    0x73,
-    0xa7,
-    0x00,
-    0x86,
-    0xf1,
-    0xae,
-    0xb0,
-    0x6b,
-    0xa2,
-    0xba,
-    0x6c,
-    0xd7,
-    0xc3,
-    0x67,
-    0x72,
-    0xdd,
-    0xab,
-    0x02,
-    0xed,
-    0xcc,
-    0xfe,
-    0xeb,
-    0xc9,
-    0xb0,
-    0x24,
-    0x3d,
-    0xc6,
-    0x1c,
-    0xf9,
-    0xb1,
-    0xcb,
-    0x27,
-    0xc6,
-    0xc0,
-    0x7e,
-    0xb5,
-    0x71,
-    0x08,
-    0x11,
-    0xf8,
-    0xf0,
-    0xf1,
-    0x5e,
-    0x36,
-    0x03,
-    0x90,
-    0x37,
-    0xcc,
-    0x23,
-    0xcc,
-    0xf7,
-    0x73,
-    0xb5,
-    0xbf,
-    0x5d,
-    0xc2,
-    0x84,
-    0x5f,
-    0x9b,
-    0xf4,
-    0x6e,
-    0x5d,
-    0xa9,
-    0xec,
-    0x5e,
-    0x4d,
-    0xdf,
-    0x76,
-    0x7a,
-    0x08,
-    0xc3,
-    0xd0,
-    0x9d,
-    0x4e,
-    0x20,
-    0x69,
-    0x07,
-    0xb0,
-    0x58,
-    0xe8,
-    0x53,
-    0xad,
-    0xfa,
-    0x70,
-    0xaa,
-    0x1c,
-    0x97,
-    0x22,
-    0x37,
-    0xca,
-    0xd2,
-    0xe4,
-    0xda,
-    0x63,
-    0xb7,
-    0x61,
-    0x21,
-    0x96,
-    0x4e,
-    0x51,
-    0x74,
-    0x74,
-    0x6f,
-    0xfb,
-    0x8f,
-    0x19,
-    0xd7,
-    0xf8,
-    0x36,
-    0x8f,
-    0x7c,
-    0x39,
-    0x23,
-    0xef,
-    0x1e,
-    0x4c,
-    0x44,
-    0xc9,
-    0x1f,
-    0xda,
-    0x23,
-    0xc6,
-    0x94,
-    0x75,
-    0xa6,
-    0x8c,
-    0x9c,
-    0x90,
-    0xf8,
-    0xe2,
-    0xf1,
-    0xcf,
-    0xc7,
-    0x15,
-    0xbc,
-    0x82,
-    0xb0,
-    0x9a,
-    0xae,
-    0x6c,
-    0xf7,
-    0xf4,
-    0x4c,
-    0xc8,
-    0x7c,
-    0xd9,
-    0x8a,
-    0x8e,
-    0xea,
-    0x90,
-    0x9c,
-    0xf2,
-    0x32,
-    0x9d,
-    0x09,
-    0x2d,
-    0x38,
-    0xa0,
-    0x01,
-    0x81,
-    0xcb,
-    0x7b,
-    0xf0,
-    0x77,
-    0xdb,
-    0xb3,
-    0x53,
-    0x6c,
-    0xe6,
-    0x19,
-    0xcb,
-    0x4b,
-    0xb4,
-    0xa9,
-    0x6f,
-    0x9c,
-    0x44,
-    0xb2,
-    0x67,
-    0xbe,
-    0x06,
-    0x37,
-    0xb7,
-    0x70,
-    0x4b,
-    0x95,
-    0x58,
-    0x97,
-    0xf9,
-    0x67,
-    0x8d,
-    0x3b,
-    0x83,
-    0xa7,
-    0x74,
-    0xd2,
-    0x18,
-    0x16,
-    0xdb,
-    0xc1,
-    0x1b,
-    0xdd,
-    0x56,
-    0x20,
-    0xd4,
-    0x74,
-    0x8e,
-    0xbd,
-    0x65,
-    0xc3,
-    0xdc,
-    0x64,
-    0xff,
-    0x87,
-    0x17,
-    0x5e,
-    0x55,
-    0xf8,
-    0xaa,
-    0x38,
-    0x51,
-    0xa9,
-    0xe9,
-    0xc6,
-    0x06,
-    0xaf,
-    0xa5,
-    0x66,
-    0xe7,
-    0x05,
-    0xfd,
-    0x89,
-    0x36,
-    0x2f,
-    0x78,
-    0x70,
-    0xbf,
-    0x1e,
-    0x51,
-    0x34,
-    0xc5,
-    0x54,
-    0x12,
-    0x09,
-    0x3d,
-    0x48,
-    0x64,
-    0xc3,
-    0x3a,
-    0x0c,
-    0x26,
-    0x9a,
-    0xa9,
-    0x2d,
-    0xbc,
-    0x2a,
-    0x3e,
-    0xdb,
-    0xaa,
-    0xbe,
-    0xae,
-    0x49,
-    0x61,
-    0xcd,
-    0x1f,
-    0x57,
-    0x58,
-    0xc5,
-    0xdc,
-    0x6f,
-    0x5f,
-    0x08,
-    0x4e,
-    0xac,
-    0x31,
-    0x34,
-    0x28,
-    0x42,
-    0x48,
-    0xa8,
-    0xe1,
-    0x1a,
-    0xf5,
-    0x44,
-    0x67,
-    0xbc,
-    0xaf,
-    0x6f,
-    0x12,
-    0x72,
-    0xac,
-    0x5f,
-    0xd6,
-    0xaa,
-    0xae,
-    0x95,
-    0xbe,
-    0x9d,
-    0x20,
-    0xa6,
-    0x95,
-    0x2e,
-    0x61,
-    0x41,
-    0xe6,
-    0x15,
-    0x60,
-    0x6e,
-    0x28,
-    0x3c,
-    0x69,
-    0x14,
-    0x32,
-    0x69,
-    0x3e,
-    0xbe,
-    0xf5,
-    0x1e,
-    0x6a,
-    0x9e,
-    0x69,
-    0xbe,
-    0xd2,
-    0xd3,
-    0xc8,
-    0xf0,
-    0x8d,
-    0xe7,
-    0xfb,
-    0x48,
-    0xf5,
-    0x9c,
-    0x51,
-    0x25,
-    0xfe,
-    0xe8,
-    0x77,
-    0xd5,
-    0xc7,
-    0x3e,
-    0xa5,
-    0x00,
-    0x6f,
-    0x0f,
-    0x15,
-    0x43,
-    0x2a,
-    0x91,
-    0xb9,
-    0x1b,
-    0x94,
-    0xbf,
-    0x2d,
-    0x05,
-    0x45,
-    0xa1,
-    0xeb,
-    0xe3,
-    0xa5,
-    0xcd,
-    0xbe,
-    0xa2,
-    0x01,
-    0x2e,
-    0x79,
-    0x1a,
-    0xdf,
-    0x04,
-    0xe8,
-    0x35,
-    0x8f,
-    0x2c,
-    0x07,
-    0x54,
-    0x03,
-    0xa2,
-    0x72,
-    0xee,
-    0xe1,
-    0x44,
-    0x1d,
-    0x7a,
-    0xd5,
-    0xd8,
-    0x45,
-    0x90,
-    0x2c,
-    0x51,
-    0xa6,
-    0x4b,
-    0x9f,
-    0x4e,
-    0xef,
-    0xf1,
-    0x6c,
-    0xe4,
-    0x73,
-    0xd6,
-    0xac,
-    0x9d,
-    0x21,
-    0x7d,
-    0xe0,
-    0xc0,
-    0xb6,
-    0x01,
-    0xcd,
-    0xd3,
-    0x31,
-    0xb3,
-    0x8a,
-    0x5f,
-    0x87,
-    0x05,
-    0xd7,
-    0xf3,
-    0x99,
-    0xa7,
-    0xb0,
-    0x6b,
-    0x63,
-    0xef,
-    0x22,
-    0x72,
-    0x76,
-    0x7e,
-    0x5e,
-    0x46,
-    0xa8,
-    0x21,
-    0x0c,
-    0xbc,
-    0x0a,
-    0xf5,
-    0xe1,
-    0x83,
-    0x1a,
-    0xcf,
-    0x74,
-    0xac,
-    0x3a,
-    0xda,
-    0x4d,
-    0x6a,
-    0x61,
-    0x82,
-    0x3f,
-    0x17,
-    0x11,
-    0x91,
-    0xf9,
-    0x78,
-    0x89,
-    0x98,
-    0xd7,
-    0x42,
-    0x3b,
-    0x91,
-    0xfe,
-    0xdd,
-    0x80,
-    0xc2,
-    0xa7,
-    0x67,
-    0x8b,
-    0xe5,
-    0xbb,
-    0xfc,
-    0x9b,
-    0x85,
-    0xa1,
-    0x35,
-    0x75,
-    0xab,
-    0x53,
-    0xee,
-    0x12,
-    0xba,
-    0xb8,
-    0x4d,
-    0x95,
-    0x98,
-    0x2e,
-    0x00,
-    0x80,
-    0x0e,
-    0x65,
-    0xc5,
-    0x26,
-    0x72,
-    0x74,
-    0x30,
-    0x64,
-    0x83,
-    0x26,
-    0xa9,
-    0x8c,
-    0x94,
-    0x95,
-    0xb4,
-    0xa2,
-    0xed,
-    0xfb,
-    0x75,
-    0xcb,
-    0x6e,
-    0xc4,
-    0x73,
-    0x02,
-    0x75,
-    0xe8,
-    0x9c,
-    0x0d,
-    0x02,
-    0x77,
-    0x89,
-    0xaf,
-    0x19,
-    0x76,
-    0x04,
-    0x20,
-    0x68,
-    0xe9,
-    0xc7,
-    0xba,
-    0x2a,
-    0x31,
-    0x87,
-    0xf5,
-    0x4b,
-    0x98,
-    0x31,
-    0x95,
-    0xcd,
-    0x2b,
-    0x74,
-    0x22,
-    0x6a,
-    0xc8,
-    0x7f,
-    0x99,
-    0x7b,
-    0x77,
-    0x0c,
-    0x61,
-    0x18,
-    0xfd,
-    0x9d,
-    0x80,
-    0x81,
-    0xaf,
-    0x05,
-    0x0f,
-    0xbc,
-    0x85,
-    0x2b,
-    0xeb,
-    0x80,
-    0x6f,
-    0x0b,
-    0xae,
-    0x52,
-    0xec,
-    0xfd,
-    0xde,
-    0xee,
-    0xd8,
-    0x3a,
-    0x64,
-    0xe8,
-    0x85,
-    0x9c,
-    0x3f,
-    0x93,
-    0x0e,
-    0xa5,
-    0x79,
-    0x22,
-    0xe8,
-    0xc3,
-    0x5a,
-    0x0d,
-    0xba,
-    0xd2,
-    0xdd,
-    0xb7,
-    0x6f,
-    0xe3,
-    0x60,
-    0x4d,
-    0x89,
-    0x3c,
-    0x9f,
-    0xf1,
-    0xb8,
-    0xa0,
-    0xe3,
-    0x18,
-    0xab,
-    0xd0,
-    0x77,
-    0x30,
-    0x26,
-    0x51,
-    0x5c,
-    0x87,
-    0x55,
-    0x70,
-    0x3d,
-    0x68,
-    0x60,
-    0x84,
-    0xa5,
-    0x87,
-    0x3f,
-    0x73,
-    0x70,
-    0x9e,
-    0xd0,
-    0x77,
-    0x80,
-    0x59,
-    0x26,
-    0x22,
-    0xb1,
-    0x70,
-    0x24,
-    0xa0,
-    0x0e,
-    0x12,
-    0x4b,
-    0x3d,
-    0x45,
-    0x8a,
-    0xd1,
-    0x26,
-    0x58,
-    0x1d,
-    0xf3,
-    0x74,
-    0x96,
-    0x31,
-    0x8c,
-    0x66,
-    0xca,
-    0xb5,
-    0xe5,
-    0xee,
-    0xb2,
-    0xbc,
-    0xcf,
-    0x70,
-    0xb2,
-    0x6b,
-    0xef,
-    0xc6,
-    0xca,
-    0x16,
-    0x5a,
-    0x87,
-    0xc6,
-    0xa6,
-    0x62,
-    0x89,
-    0xb4,
-    0x3e,
-    0xaf,
-    0xa4,
-    0x9b,
-    0x1e,
-    0x91,
-    0xb9,
-    0x6a,
-    0xc7,
-    0x94,
-    0xf3,
-    0x2f,
-    0x5f,
-    0x55,
-    0x4d,
-    0x89,
-    0x58,
-    0x95,
-    0x55,
-    0x60,
-    0x4d,
-    0x8c,
-    0x2f,
-    0xd3,
-    0x2c,
-    0x7f,
-    0xdc,
-    0x72,
-    0x9a,
-    0x95,
-    0xbd,
-    0xae,
-    0x93,
-    0xe7,
-    0x52,
-    0x8d,
-    0x51,
-    0xd6,
-    0x48,
-    0xa3,
-    0x70,
-    0xa1,
-    0xb3,
-    0x3d,
-    0x4f,
-    0x37,
-    0x98,
-    0xdf,
-    0xb9,
-    0x49,
-    0xae,
-    0xf1,
-    0xc5,
-    0xa4,
-    0x65,
-    0xb5,
-    0xfa,
-    0xbe,
-    0x28,
-    0x7c,
-    0xb7,
-    0x8e,
-    0xdf,
-    0x1a,
-    0xd2,
-    0xa1,
-    0xb9,
-    0x97,
-    0x80,
-    0x6b,
-    0x28,
-    0x27,
-    0x75,
-    0xdb,
-    0x2d,
-    0x5c,
-    0x4c,
-    0x32,
-    0xd5,
-    0x9b,
-    0x28,
-    0x14,
-    0x04,
-    0xcd,
-    0x9c,
-    0xdf,
-    0x71,
-    0x56,
-    0xc8,
-    0x3d,
-    0xf2,
-    0x4b,
-    0xc5,
-    0xf5,
-    0xfa,
-    0xdf,
-    0x44,
-    0x07,
-    0x5f,
-    0x1f,
-    0x71,
-    0xf7,
-    0x61,
-    0xe0,
-    0x1e,
-    0x69,
-    0xe9,
-    0xf5,
-    0x1d,
-    0xee,
-    0x0e,
-    0xa5,
-    0xed,
-    0x1e,
-    0xdd,
-    0x5c,
-    0x9a,
-    0xe7,
-    0x5a,
-    0xa0,
-    0xde,
-    0x24,
-    0xc2,
-    0x47,
-    0x8c,
-    0x71,
-    0x13,
-    0xe7,
-    0x2e,
-    0x3e,
-    0xce,
-    0x8f,
-    0xed,
-    0x23,
-    0xfc,
-    0xb4,
-    0xb2,
-    0x73,
-    0x6f,
-    0x6e,
-    0x8b,
-    0x14,
-    0x4a,
-    0xe5,
-    0x50,
-    0x8e,
-    0xc4,
-    0x05,
-    0x86,
-    0x61,
-    0x28,
-    0x7a,
-    0x83,
-    0x9c,
-    0x20,
-    0xd8,
-    0xd3,
-    0xab,
-    0x34,
-    0x19,
-    0xdb,
-    0x71,
-    0x8e,
-    0x4d,
-    0xbc,
-    0x97,
-    0x00,
-    0x8d,
-    0x7b,
-    0x23,
-    0x48,
-    0x31,
-    0x5e,
-    0x4c,
-    0x92,
-    0x43,
-    0x99,
-    0x8c,
-    0x3e,
-    0x33,
-    0x29,
-    0xf8,
-    0xe4,
-    0xcb,
-    0x01,
-    0xcd,
-    0x95,
-    0x66,
-    0x64,
-    0x4b,
-    0x64,
-    0x5d,
-    0x92,
-    0xc6,
-    0x25,
-    0xc3,
-    0xa6,
-    0xfa,
-    0x75,
-    0x52,
-    0xbf,
-    0x9f,
-    0xfb,
-    0xa4,
-    0x5e,
-    0x3d,
-    0xed,
-    0xa7,
-    0x0f,
-    0x42,
-    0xd5,
-    0x4b,
-    0x4c,
-    0x52,
-    0x95,
-    0x7d,
-    0x9e,
-    0xde,
-    0xa8,
-    0x59,
-    0x05,
-    0xf8,
-    0xac,
-    0x9b,
-    0x9a,
-    0x65,
-    0x1d,
-    0x57,
-    0x73,
-    0xf4,
-    0x64,
-    0xeb,
-    0xc7,
-    0x0f,
-    0x10,
-    0x31,
-    0x52,
-    0x90,
-    0x63,
-    0xf9,
-    0xfb,
-    0xd6,
-    0x10,
-    0xb6,
-    0xb5,
-    0x17,
-    0x43,
-    0x77,
-    0xa3,
-    0xf7,
-    0xe2,
-    0x19,
-    0x7f,
-    0x5a,
-    0x12,
-    0xbb,
-    0x3c,
-    0x77,
-    0xfe,
-    0x73,
-    0xea,
-    0x2f,
-    0xd4,
-    0x3f,
-    0xdb,
-    0x9c,
-    0x0f,
-    0x3f,
-    0x04,
-    0xec,
-    0xfc,
-    0x21,
-    0xa5,
-    0x70,
-    0x77,
-    0xdc,
-    0x2d,
-    0xf0,
-    0xf6,
-    0xa1,
-    0x58,
-    0x42,
-    0xca,
-    0x0e,
-    0x9a,
-    0x1a,
-    0xa1,
-    0xa6,
-    0xc0,
-    0x24,
-    0x4e,
-    0x7e,
-    0xd5,
-    0x50,
-    0xcd,
-    0x38,
-    0x42,
-    0x6e,
-    0x81,
-    0x35,
-    0x3a,
-    0xfa,
-    0xc1,
-    0x07,
-    0x55,
-    0x39,
-    0x93,
-    0x25,
-    0x7b,
-    0x85,
-    0xb7,
-    0xe3,
-    0x04,
-    0xe4,
-    0xe8,
-    0xa1,
-    0x1d,
-    0xe0,
-    0x5e,
-    0x42,
-    0x6e,
-    0x93,
-    0x97,
-    0xe0,
-    0xfa,
-    0x02,
-    0x57,
-    0xbd,
-    0x46,
-    0xac,
-    0xee,
-    0x7d,
-    0xbd,
-    0x62,
-    0xb9,
-    0x93,
-    0x53,
-    0x58,
-    0xeb,
-    0xfa,
-    0x69,
-    0x7d,
-    0x8d,
-    0x25,
-    0xf0,
-    0x08,
-    0xc4,
-    0x38,
-    0xd2,
-    0x53,
-    0x53,
-    0x78,
-    0x8d,
-    0xed,
-    0x60,
-    0x00,
-    0x21,
-    0xeb,
-    0x7b,
-    0xb7,
-    0x2d,
-    0x7e,
-    0xdc,
-    0x7e,
-    0x55,
-    0xcb,
-    0xec,
-    0xae,
-    0xe6,
-    0xf6,
-    0x08,
-    0xc1,
-    0xbd,
-    0x80,
-    0x81,
-    0x4f,
-    0x65,
-    0xd4,
-    0xe7,
-    0x3d,
-    0x7f,
-    0x1c,
-    0x87,
-    0x31,
-    0x67,
-    0x59,
-    0x32,
-    0x48,
-    0x14,
-    0xb3,
-    0x40,
-    0x0c,
-    0x40,
-    0x0d,
-    0xd5,
-    0xa0,
-    0xc9,
-    0xdd,
-    0x63,
-    0x3e,
-    0x58,
-    0x3b,
-    0x70,
-    0xe4,
-    0x40,
-    0x38,
-    0x9a,
-    0x49,
-    0xa9,
-    0x70,
-    0xd8,
-    0x16,
-    0xed,
-    0xe3,
-    0x02,
-    0x53,
-    0x42,
-    0x00,
-    0x94,
-    0x1f,
-    0x9a,
-    0x03,
-    0xaf,
-    0xa5,
-    0xc7,
-    0x81,
-    0x60,
-    0x4b,
-    0xe3,
-    0x41,
-    0x25,
-    0x2c,
-    0xef,
-    0x4e,
-    0xad,
-    0xc9,
-    0xba,
-    0x4a,
-    0xe0,
-    0xfb,
-    0x04,
-    0x05,
-    0x1f,
-    0x2d,
-    0xe4,
-    0x4f,
-    0xcd,
-    0xc7,
-    0x67,
-    0x0a,
-    0x0e,
-    0xed,
-    0x7a,
-    0x83,
-    0xce,
-    0x6a,
-    0x0a,
-    0x02,
-    0x06,
-    0xe7,
-    0x69,
-    0x9f,
-    0x3a,
-    0x61,
-    0xf4,
-    0x58,
-    0x47,
-    0xda,
-    0xf3,
-    0x61,
-    0x5b,
-    0x4e,
-    0xc0,
-    0xbb,
-    0x45,
-    0xe8,
-    0x2c,
-    0x08,
-    0xef,
-    0x76,
-    0x1e,
-    0x9e,
-    0x28,
-    0x1b,
-    0x7d,
-    0xda,
-    0xa7,
-    0x43,
-    0x50,
-    0xb6,
-    0x4d,
-    0xdc,
-    0x24,
-    0x9e,
-    0xab,
-    0xc4,
-    0xae,
-    0x80,
-    0xc4,
-    0x7d,
-    0xb2,
-    0x23,
-    0x14,
-    0x28,
-    0x24,
-    0xb9,
-    0xd1,
-    0xb1,
-    0x8c,
-    0xb7,
-    0x70,
-    0x47,
-    0xaf,
-    0xe4,
-    0x6b,
-    0x0f,
-    0x6b,
-    0xb0,
-    0x42,
-    0x19,
-    0xe3,
-    0xc8,
-    0xc0,
-    0x93,
-    0xdc,
-    0xe7,
-    0x7f,
-    0x3c,
-    0x67,
-    0xef,
-    0xae,
-    0x1c,
-    0xc1,
-    0x38,
-    0x12,
-    0x73,
-    0x77,
-    0x28,
-    0x4b,
-    0xef,
-    0xcd,
-    0x04,
-    0x59,
-    0x21,
-    0x61,
-    0x05,
-    0x5e,
-    0x32,
-    0x0c,
-    0xaf,
-    0xa5,
-    0xd2,
-    0x09,
-    0x5e,
-    0xe4,
-    0x72,
-    0x59,
-    0x22,
-    0xbe,
-    0xb3,
-    0x65,
-    0xcc,
-    0x8c,
-    0x1e,
-    0xe6,
-    0x49,
-    0x5d,
-    0x15,
-    0x02,
-    0x2f,
-    0x3b,
-    0x09,
-    0xb7,
-    0x96,
-    0xb1,
-    0xee,
-    0x7d,
-    0x29,
-    0x8a,
-    0xec,
-    0x27,
-    0x7d,
-    0xda,
-    0x58,
-    0x0b,
-    0xa1,
-    0x43,
-    0xe2,
-    0x62,
-    0xf6,
-    0x71,
-    0x10,
-    0xf2,
-    0x40,
-    0xe7,
-    0xeb,
-    0xea,
-    0xfe,
-    0xfe,
-    0xf8,
-    0x0d,
-    0xf7,
-    0x2a,
-    0x69,
-    0x12,
-    0x16,
-    0x80,
-    0x95,
-    0x4b,
-    0x77,
-    0x75,
-    0xa6,
-    0x86,
-    0xc2,
-    0xe9,
-    0x91,
-    0x31,
-    0xb8,
-    0x64,
-    0x4c,
-    0xc1,
-    0x0b,
-    0x9f,
-    0x3b,
-    0x54,
-    0x73,
-    0x46,
-    0xeb,
-    0x94,
-    0xfe,
-    0xfc,
-    0x02,
-    0xdf,
-    0xa8,
-    0xa0,
-    0x76,
-    0xa6,
-    0x2b,
-    0xce,
-    0xfe,
-    0x13,
-    0x18,
-    0xa9,
-    0xc6,
-    0xef,
-    0x27,
-    0xd8,
-    0x67,
-    0xc2,
-    0xcb,
-    0xcf,
-    0x16,
-    0x3c,
-    0x0a,
-    0x50,
-    0x1b,
-    0xd3,
-    0x8c,
-    0x31,
-    0x86,
-    0xae,
-    0xf2,
-    0x5f,
-    0x1d,
-    0xc2,
-    0x69,
-    0x23,
-    0x98,
-    0x3b,
-    0x7e,
-    0xa4,
-    0x11,
-    0x1d,
-    0x34,
-    0xae,
-    0xb6,
-    0x2b,
-    0x53,
-    0xb1,
-    0xc1,
-    0x08,
-    0x04,
-    0x0d,
-    0xaa,
-    0x9c,
-    0x9b,
-    0x8c,
-    0x9a,
-    0xb9,
-    0xb4,
-    0x30,
-    0x24,
-    0xfe,
-    0x81,
-    0x30,
-    0x30,
-    0xfc,
-    0x62,
-    0x3d,
-    0x37,
-    0x98,
-    0xb6,
-    0x09,
-    0xb6,
-    0xb0,
-    0xf2,
-    0x0a,
-    0xdc,
-    0x02,
-    0xf0,
-    0x7c,
-    0x86,
-    0x49,
-    0x89,
-    0xa5,
-    0x6e,
-    0xa8,
-    0x65,
-    0x5c,
-    0x9f,
-    0x4c,
-    0x12,
-    0xcc,
-    0x2d,
-    0x4e,
-    0x54,
-    0x76,
-    0x22,
-    0xd6,
-    0xbc,
-    0x75,
-    0xbb,
-    0x86,
-    0x7c,
-    0x06,
-    0xd5,
-    0x16,
-    0x7a,
-    0x47,
-    0xa2,
-    0x3b,
-    0xa3,
-    0x3f,
-    0xa0,
-    0xce,
-    0x82,
-    0x1f,
-    0xcc,
-    0x2a,
-    0x11,
-    0xc7,
-    0x13,
-    0xd6,
-    0xcf,
-    0x8c,
-    0x09,
-    0x64,
-    0x12,
-    0x39,
-    0xdd,
-    0x98,
-    0x9f,
-    0x53,
-    0x8d,
-    0xcd,
-    0x78,
-    0xa2,
-    0x56,
-    0x95,
-    0xf5,
-    0xec,
-    0x6f,
-    0xa0,
-    0x16,
-    0x04,
-    0xf6,
-    0xdf,
-    0x18,
-    0x04,
-    0x2b,
-    0xe8,
-    0x46,
-    0xd6,
-    0xdc,
-    0x9d,
-    0x12,
-    0xf9,
-    0x20,
-    0x08,
-    0x64,
-    0x81,
-    0x48,
-    0x8a,
-    0x32,
-    0x60,
-    0x13,
-    0x35,
-    0x51,
-    0xe5,
-    0x21,
-    0x76,
-    0x8b,
-    0x82,
-    0xaa,
-    0xf7,
-    0xf1,
-    0xd2,
-    0x70,
-    0xc3,
-    0x72,
-    0xda,
-    0xf2,
-    0xac,
-    0xad,
-    0x90,
-    0xe3,
-    0xea,
-    0x04,
-    0x99,
-    0xda,
-    0x04,
-    0xf2,
-    0x57,
-    0x4b,
-    0xf4,
-    0x9e,
-    0x23,
-    0xb6,
-    0x86,
-    0xb0,
-    0xd7,
-    0x1e,
-    0x01,
-    0x63,
-    0x90,
-    0xbd,
-    0x09,
-    0xdb,
-    0xb2,
-    0xf6,
-    0xc4,
-    0xba,
-    0x2c,
-    0x8b,
-    0x3c,
-    0xee,
-    0xfd,
-    0x10,
-    0x04,
-    0xcc,
-    0xf7,
-    0xa0,
-    0x1f,
-    0x63,
-    0xc2,
-    0xce,
-    0x1d,
-    0x0a,
-    0x25,
-    0xde,
-    0x87,
-    0x3c,
-    0x81,
-    0x36,
-    0x7d,
-    0xa6,
-    0x9e,
-    0x0f,
-    0x9e,
-    0x7d,
-    0xaa,
-    0x70,
-    0x28,
-    0x15,
-    0x7f,
-    0x5d,
-    0x60,
-    0xb0,
-    0x25,
-    0x4c,
-    0x35,
-    0x94,
-    0x98,
-    0xd8,
-    0x20,
-    0x60,
-    0xcb,
-    0xb9,
-    0x4e,
-    0x9f,
-    0xec,
-    0xf4,
-    0x01,
-    0x9e,
-    0xea,
-    0x4f,
-    0x34,
-    0x7b,
-    0x35,
-    0x08,
-    0x7e,
-    0x7f,
-    0xc5,
-    0xc6,
-    0x38,
-    0xad,
-    0x5d,
-    0xd0,
-    0xe2,
-    0x9b,
-    0x11,
-    0x7d,
-    0xc3,
-    0x81,
-    0x06,
-    0xec,
-    0xd0,
-    0x90,
-    0x79,
-    0xf4,
-    0xcf,
-    0x85,
-    0x02,
-    0x5e,
-    0xbc,
-    0x7d,
-    0x1a,
-    0x52,
-    0x6c,
-    0x0b,
-    0xdc,
-    0x10,
-    0x70,
-    0x88,
-    0x08,
-    0xe1,
-    0x3c,
-    0xaa,
-    0x4d,
-    0x4c,
-    0x89,
-    0x58,
-    0xc8,
-    0x8c,
-    0xf7,
-    0xbd,
-    0xc8,
-    0x42,
-    0xf7,
-    0x9c,
-    0xd4,
-    0x68,
-    0xe8,
-    0xe3,
-    0xef,
-    0x86,
-    0x80,
-    0x82,
-    0x1a,
-    0x28,
-    0x6e,
-    0x7d,
-    0x1b,
-    0x8f,
-    0x3d,
-    0x40,
-    0x7d,
-    0xa7,
-    0x7c,
-    0x34,
-    0xd8,
-    0x39,
-    0x1c,
-    0x8f,
-    0x52,
-    0x62,
-    0x19,
-    0x70,
-    0x66,
-    0x44,
-    0x5d,
-    0x2b,
-    0xe4,
-    0xfb,
-    0xe1,
-    0xe1,
-    0x39,
-    0xd2,
-    0x15,
-    0x55,
-    0xf1,
-    0xb7,
-    0x82,
-    0xfa,
-    0x7a,
-    0xed,
-    0xad,
-    0x51,
-    0x2b,
-    0x01,
-    0x3f,
-    0x71,
-    0x84,
-    0xff,
-    0x64,
-    0xe7,
-    0xb8,
-    0xe5,
-    0x71,
-    0xc1,
-    0x68,
-    0x58,
-    0xc9,
-    0xe6,
-    0xb2,
-    0x96,
-    0x01,
-    0xa9,
-    0x6a,
-    0xac,
-    0x42,
-    0x9d,
-    0xa7,
-    0xe9,
-    0xef,
-    0xaa,
-    0x82,
-    0x92,
-    0x88,
-    0x60,
-    0x1a,
-    0xd7,
-    0xcf,
-    0x8c,
-    0xdc,
-    0x06,
-    0x29,
-    0x09,
-    0x01,
-    0xff,
-    0x46,
-    0xd9,
-    0x57,
-    0xe8,
-    0x04,
-    0x74,
-    0x45,
-    0x22,
-    0x91,
-    0x60,
-    0x09,
-    0x7b,
-    0xd0,
-    0x02,
-    0x45,
-    0xa5,
-    0xff,
-    0xb4,
-    0xba,
-    0xe7,
-    0x96,
-    0x18,
-    0x53,
-    0x12,
-    0x72,
-    0xab,
-    0x65,
-    0xb7,
-    0x32,
-    0x9d,
-    0x35,
-    0x97,
-    0xe2,
-    0xe0,
-    0xbb,
-    0x5b,
-    0xd7,
-    0x7f,
-    0xa5,
-    0x85,
-    0xd9,
-    0x31,
-    0x9f,
-    0xa7,
-    0x88,
-    0x2e,
-    0xd2,
-    0xd2,
-    0xf8,
-    0x41,
-    0xaa,
-    0x52,
-    0x9f,
-    0x1e,
-    0xdd,
-    0x98,
-    0x71,
-    0xf7,
-    0xa9,
-    0x78,
-    0x49,
-    0x4a,
-    0x5d,
-    0x95,
-    0x8b,
-    0xfd,
-    0x1a,
-    0x19,
-    0x07,
-    0xac,
-    0xdb,
-    0xa9,
-    0x21,
-    0x42,
-    0xb3,
-    0x98,
-    0x2f,
-    0xc6,
-    0x56,
-    0x5a,
-    0x23,
-    0x78,
-    0xdb,
-    0x3c,
-    0x6a,
-    0x1d,
-    0xc0,
-    0x53,
-    0x14,
-    0x97,
-    0x2f,
-    0xb2,
-    0x34,
-    0xb8,
-    0x7f,
-    0xe0,
-    0x8a,
-    0x58,
-    0xfe,
-    0x8a,
-    0x5f,
-    0xa5,
-    0xee,
-    0x74,
-    0xb1,
-    0xbb,
-    0xcd,
-    0xb5,
-    0x90,
-    0x75,
-    0xda,
-    0x24,
-    0xc8,
-    0x82,
-    0xd4,
-    0x0e,
-    0xc0,
-    0xbb,
-    0x05,
-    0x2a,
-    0xa2,
-    0xb3,
-    0x7f,
-    0xce,
-    0xbc,
-    0x90,
-    0xa6,
-    0x62,
-    0x27,
-    0x1a,
-    0xee,
-    0x16,
-    0xa6,
-    0x12,
-    0xe6,
-    0xd0,
-    0xd0,
-    0xc5,
-    0x76,
-    0x68,
-    0x72,
-    0xe1,
-    0x64,
-    0x18,
-    0x2f,
-    0x86,
-    0x1d,
-    0x2e,
-    0x69,
-    0xa0,
-    0xb3,
-    0x04,
-    0x65,
-    0x75,
-    0x22,
-    0x32,
-    0xa9,
-    0x7a,
-    0xd7,
-    0x02,
-    0xa9,
-    0x6b,
-    0x73,
-    0x25,
-    0xa3,
-    0x9a,
-    0xcc,
-    0xa4,
-    0xc8,
-    0x88,
-    0x34,
-    0x19,
-    0x9c,
-    0xb2,
-    0xff,
-    0x1e,
-    0x9f,
-    0xad,
-    0x3f,
-    0x06,
-    0x2d,
-    0x75,
-    0xd2,
-    0xcb,
-    0xa3,
-    0x03,
-    0x9f,
-    0x48,
-    0xc3,
-    0x1d,
-    0x1c,
-    0xa8,
-    0x5a,
-    0x72,
-    0x14,
-    0x1f,
-    0x1f,
-    0xe6,
-    0xa7,
-    0xd8,
-    0xdf,
-    0x2b,
-    0x92,
-    0x2e,
-    0xd7,
-    0x91,
-    0xb0,
-    0x1e,
-    0x62,
-    0x1f,
-    0xc1,
-    0xfc,
-    0xd4,
-    0xe2,
-    0x6b,
-    0x66,
-    0xa5,
-    0x85,
-    0x7e,
-    0x77,
-    0xd2,
-    0x22,
-    0x7c,
-    0x3c,
-    0x80,
-    0x58,
-    0x59,
-    0x6c,
-    0xe2,
-    0x9e,
-    0x7f,
-    0x53,
-    0x5e,
-    0xd6,
-    0x15,
-    0x10,
-    0xeb,
-    0x26,
-    0x81,
-    0x00,
-    0xbe,
-    0x03,
-    0x2b,
-    0x7a,
-    0x25,
-    0x8e,
-    0x84,
-    0xbd,
-    0xb3,
-    0x24,
-    0x48,
-    0x26,
-    0x9d,
-    0x30,
-    0x00,
-    0xa7,
-    0x64,
-    0x44,
-    0xca,
-    0x74,
-    0xb4,
-    0x69,
-    0x5c,
-    0xff,
-    0x8d,
-    0xb3,
-    0x47,
-    0x27,
-    0xa0,
-    0x18,
-    0x79,
-    0xac,
-    0xfc,
-    0x81,
-    0x06,
-    0xe7,
-    0xe9,
-    0x22,
-    0x28,
-    0xb8,
-    0x14,
-    0x07,
-    0x84,
-    0xbf,
-    0xed,
-    0xf0,
-    0xae,
-    0xcf,
-    0x4e,
-    0x5f,
-    0xf0,
-    0x9f,
-    0x5d,
-    0xef,
-    0x47,
-    0xc3,
-    0xb3,
-    0xe7,
-    0xaf,
-    0xdb,
-    0xbe,
-    0x0f,
-    0xa0,
-    0x0b,
-    0x63,
-    0xc3,
-    0xd9,
-    0xab,
-    0xe8,
-    0x45,
-    0x5c,
-    0x3f,
-    0x12,
-    0x58,
-    0xba,
-    0xa9,
-    0x8a,
-    0x0a,
-    0x90,
-    0x9d,
-    0x85,
-    0xd1,
-    0x52,
-    0x56,
-    0xa4,
-    0xd9,
-    0x47,
-    0x87,
-    0x19,
-    0x9d,
-    0xd5,
-    0x95,
-    0x0c,
-    0xb5,
-    0xff,
-    0x03,
-    0x3d,
-    0xee,
-    0x2c,
-    0x2e,
-    0xea,
-    0xa0,
-    0x2a,
-    0x3a,
-    0xf3,
-    0x3c,
-    0x72,
-    0x4c,
-    0x3c,
-    0x25,
-    0xae,
-    0xf9,
-    0x53,
-    0xc1,
-    0x78,
-    0xff,
-    0x53,
-    0xcf,
-    0x65,
-    0x33,
-    0x08,
-    0xfb,
-    0x42,
-    0xbb,
-    0x53,
-    0xaf,
-    0x9d,
-    0x7d,
-    0xd0,
-    0x2d,
-    0x88,
-    0xd7,
-    0xb7,
-    0xdb,
-    0x99,
-    0x91,
-    0x00,
-    0xdd,
-    0x35,
-    0x10,
-    0xcb,
-    0xe9,
-    0x0e,
-    0xcc,
-    0xfe,
-    0x57,
-    0xeb,
-    0x04,
-    0x30,
-    0x78,
-    0xa8,
-    0xb0,
-    0xc6,
-    0x29,
-    0x7d,
-    0xb7,
-    0x5b,
-    0xa8,
-    0x83,
-    0x62,
-    0x66,
-    0xa6,
-    0x73,
-    0x10,
-    0x16,
-    0x9d,
-    0xb1,
-    0x2c,
-    0x81,
-    0x63,
-    0x8a,
-    0x5d,
-    0xfe,
-    0x00,
-    0xba,
-    0xfc,
-    0xcf,
-    0xbd,
-    0x32,
-    0xcb,
-    0x04,
-    0x7d,
-    0x18,
-    0xe4,
-    0x9b,
-    0x50,
-    0x0e,
-    0xef,
-    0xec,
-    0x46,
-    0xb7,
-    0x98,
-    0x45,
-    0x81,
-    0x77,
-    0x41,
-    0xd1,
-    0x8e,
-    0x7b,
-    0xf3,
-    0xbe,
-    0xf6,
-    0xfa,
-    0x9b,
-    0x9e,
-    0x0f,
-    0xba,
-    0x73,
-    0x0e,
-    0x18,
-    0xd5,
-    0xbe,
-    0x96,
-    0x85,
-    0xbd,
-    0xb8,
-    0xd1,
-    0x98,
-    0x7e,
-    0xcd,
-    0xce,
-    0x31,
-    0x43,
-    0x09,
-    0xb5,
-    0xe7,
-    0x1c,
-    0xd0,
-    0xae,
-    0x57,
-    0xfe,
-    0xcf,
-    0xfe,
-    0xbc,
-    0x0c,
-    0x32,
-    0x73,
-    0xc1,
-    0x14,
-    0x17,
-    0x03,
-    0x93,
-    0x5d,
-    0x43,
-    0xb0,
-    0x39,
-    0xa0,
-    0x14,
-    0xaf,
-    0x28,
-    0x54,
-    0xb7,
-    0xc8,
-    0x12,
-    0x2e,
-    0x9b,
-    0x00,
-    0x00,
-    0xe9,
-    0x26,
-    0x76,
-    0xa0,
-    0x43,
-    0xa6,
-    0x8b,
-    0xe0,
-    0x48,
-    0x8a,
-    0x45,
-    0xbb,
-    0xd2,
-    0xd2,
-    0xf6,
-    0x53,
-    0x51,
-    0xc4,
-    0x18,
-    0x41,
-    0xc8,
-    0xe1,
-    0x7c,
-    0x29,
-    0x18,
-    0x17,
-    0xa4,
-    0x91,
-    0x81,
-    0x38,
-    0x6d,
-    0xf3,
-    0x66,
-    0xab,
-    0xf0,
-    0x10,
-    0x50,
-    0x62,
-    0xab,
-    0x88,
-    0x36,
-    0x0b,
-    0xdc,
-    0xa8,
-    0xfc,
-    0x8b,
-    0x2e,
-    0x83,
-    0x39,
-    0xa8,
-    0x97,
-    0x44,
-    0x3d,
-    0x05,
-    0x81,
-    0xc2,
-    0x53,
-    0x54,
-    0x28,
-    0x55,
-    0x43,
-    0xc7,
-    0x43,
-    0xe9,
-    0x1b,
-    0xc7,
-    0xe6,
-    0x50,
-    0x2f,
-    0xe9,
-    0xa7,
-    0xdd,
-    0x5f,
-    0x1e,
-    0x00,
-    0x2e,
-    0x98,
-    0x2a,
-    0xf4,
-    0x49,
-    0x9e,
-    0x57,
-    0xf5,
-    0xeb,
-    0x08,
-    0x6a,
-    0x06,
-    0x1c,
-    0x8c,
-    0xd6,
-    0x1d,
-    0x07,
-    0x7c,
-    0x30,
-    0xcb,
-    0x09,
-    0x91,
-    0xe3,
-    0x1e,
-    0x08,
-    0xe8,
-    0x25,
-    0xc7,
-    0x06,
-    0x4a,
-    0x29,
-    0x78,
-    0xf5,
-    0xb0,
-    0x96,
-    0x90,
-    0xcd,
-    0x06,
-    0x39,
-    0xfa,
-    0xdd,
-    0x30,
-    0xf6,
-    0x52,
-    0x5e,
-    0x4b,
-    0x05,
-    0x4a,
-    0x4e,
-    0x35,
-    0x5b,
-    0x4d,
-    0x7c,
-    0x4f,
-    0x65,
-    0x62,
-    0xdf,
-    0x81,
-    0xfc,
-    0x52,
-    0x2b,
-    0x7f,
-    0x96,
-    0x0d,
-    0xa6,
-    0x4b,
-    0xb9,
-    0x4a,
-    0x38,
-    0xfc,
-    0xb6,
-    0x6e,
-    0xc2,
-    0xbd,
-    0x93,
-    0xaf,
-    0xb1,
-    0x18,
-    0x49,
-    0x79,
-    0xd3,
-    0x75,
-    0x30,
-    0x10,
-    0x69,
-    0xdd,
-    0xb7,
-    0x78,
-    0x7d,
-    0x04,
-    0x58,
-    0x92,
-    0x76,
-    0x87,
-    0xcb,
-    0x87,
-    0xe9,
-    0x72,
-    0x7a,
-    0x69,
-    0xb2,
-    0x05,
-    0x36,
-    0x18,
-    0x44,
-    0xb8,
-    0x28,
-    0x63,
-    0x3d,
-    0x7c,
-    0x0a,
-    0x70,
-    0x3e,
-    0x44,
-    0x97,
-    0x5e,
-    0xf9,
-    0xc4,
-    0x3f,
-    0x28,
-    0x8b,
-    0x78,
-    0x20,
-    0xcd,
-    0x0d,
-    0xe9,
-    0x32,
-    0xae,
-    0x65,
-    0x2c,
-    0xc1,
-    0x37,
-    0x62,
-    0xab,
-    0x21,
-    0xc1,
-    0x09,
-    0x28,
-    0x9d,
-    0xb7,
-    0x29,
-    0xfe,
-    0xb0,
-    0xf8,
-    0x36,
-    0xaa,
-    0x78,
-    0x7d,
-    0x53,
-    0x8b,
-    0x67,
-    0x3c,
-    0xb1,
-    0xe6,
-    0x3c,
-    0x4c,
-    0x18,
-    0x2d,
-    0x31,
-    0x49,
-    0xc3,
-    0x81,
-    0x76,
-    0xfa,
-    0x71,
-    0x75,
-    0xdf,
-    0x31,
-    0xb9,
-    0x15,
-    0xda,
-    0xf3,
-    0x9e,
-    0x27,
-    0xa3,
-    0xd9,
-    0x63,
-    0xb0,
-    0xbb,
-    0xb6,
-    0xa1,
-    0xba,
-    0x96,
-    0x7a,
-    0x96,
-    0x55,
-    0x93,
-    0x57,
-    0xc0,
-    0xdc,
-    0x32,
-    0x22,
-    0xaa,
-    0x79,
-    0x82,
-    0xfb,
-    0x07,
-    0xeb,
-    0xd8,
-    0x30,
-    0xfd,
-    0x87,
-    0xc6,
-    0x5f,
-    0xc3,
-    0x7d,
-    0x4b,
-    0xdb,
-    0x6e,
-    0x5d,
-    0x48,
-    0x51,
-    0x08,
-    0xda,
-    0x33,
-    0xac,
-    0xe3,
-    0xcd,
-    0x0f,
-    0x35,
-    0x2c,
-    0x7d,
-    0x9c,
-    0xff,
-    0xc3,
-    0x1d,
-    0xcb,
-    0x82,
-    0x4a,
-    0x96,
-    0x74,
-    0x86,
-    0x7d,
-    0x87,
-    0x4b,
-    0x43,
-    0xc1,
-    0x8a,
-    0x11,
-    0xc6,
-    0xff,
-    0xba,
-    0x07,
-    0x96,
-    0xb2,
-    0x72,
-    0xa8,
-    0x98,
-    0x3f,
-    0x57,
-    0x97,
-    0x30,
-    0x86,
-    0x98,
-    0xd7,
-    0xa9,
-    0xb6,
-    0x74,
-    0x3a,
-    0xd7,
-    0x65,
-    0xfd,
-    0x1c,
-    0xfa,
-    0xe0,
-    0x1c,
-    0x50,
-    0xe6,
-    0xbf,
-    0xd6,
-    0x5b,
-    0x61,
-    0xbd,
-    0xcd,
-    0xe0,
-    0xcd,
-    0xc7,
-    0x0a,
-    0x5c,
-    0x07,
-    0x53,
-    0xf9,
-    0x14,
-    0x8e,
-    0xf3,
-    0xb5,
-    0x4b,
-    0xe8,
-    0x2a,
-    0x86,
-    0xb7,
-    0x41,
-    0x7e,
-    0xa9,
-    0x36,
-    0x56,
-    0xce,
-    0x4f,
-    0xbe,
-    0x91,
-    0xe6,
-    0xe7,
-    0x92,
-    0x75,
-    0x51,
-    0xa0,
-    0xbc,
-    0x3d,
-    0x6e,
-    0x2a,
-    0xb7,
-    0xc0,
-    0xc7,
-    0xbd,
-    0x6c,
-    0x98,
-    0x9d,
-    0x5d,
-    0x60,
-    0x83,
-    0xc8,
-    0x5c,
-    0x2b,
-    0x09,
-    0xbe,
-    0x20,
-    0x2c,
-    0x60,
-    0xf1,
-    0x27,
-    0x7b,
-    0x8c,
-    0x5e,
-    0x47,
-    0x1f,
-    0xca,
-    0x62,
-    0x3b,
-    0x81,
-    0x2f,
-    0xd0,
-    0x5b,
-    0x21,
-    0x8d,
-    0x42,
-    0xab,
-    0x88,
-    0x96,
-    0xac,
-    0x17,
-    0x7e,
-    0x44,
-    0x37,
-    0xfd,
-    0x7c,
-    0x78,
-    0x4c,
-    0xec,
-    0x64,
-    0xe1,
-    0xee,
-    0xac,
-    0x70,
-    0x1f,
-    0x4e,
-    0x7e,
-    0x68,
-    0x28,
-    0x99,
-    0xa4,
-    0x19,
-    0xeb,
-    0x15,
-    0x24,
-    0x02,
-    0x34,
-    0x6c,
-    0xca,
-    0x50,
-    0xd0,
-    0x48,
-    0x6c,
-    0x0d,
-    0xf1,
-    0x1f,
-    0x71,
-    0x94,
-    0xd4,
-    0x51,
-    0x94,
-    0x48,
-    0xa0,
-    0x70,
-    0xe6,
-    0x85,
-    0x92,
-    0xde,
-    0x12,
-    0xd7,
-    0x57,
-    0x9e,
-    0xe5,
-    0x6a,
-    0xb9,
-    0x64,
-    0x0e,
-    0xc2,
-    0x7e,
-    0xee,
-    0x22,
-    0xac,
-    0x8d,
-    0x97,
-    0xe3,
-    0x75,
-    0x53,
-    0x2a,
-    0xc1,
-    0x59,
-    0x65,
-    0xf4,
-    0xa1,
-    0x3e,
-    0x67,
-    0x1d,
-    0xde,
-    0xa3,
-    0x2c,
-    0x38,
-    0x8d,
-    0xd3,
-    0x1e,
-    0x18,
-    0x06,
-    0x5e,
-    0xe1,
-    0xe5,
-    0xa0,
-    0xc9,
-    0x33,
-    0x70,
-    0xbb,
-    0x85,
-    0x17,
-    0xc4,
-    0x04,
-    0x1e,
-    0x32,
-    0xfe,
-    0xf4,
-    0xb5,
-    0x75,
-    0x5e,
-    0x9a,
-    0xb0,
-    0xfc,
-    0x9d,
-    0x9b,
-    0xb0,
-    0x36,
-    0x81,
-    0x77,
-    0xc3,
-    0x47,
-    0xb0,
-    0x0d,
-    0xdc,
-    0xaa,
-    0xc2,
-    0x62,
-    0x80,
-    0x1b,
-    0x99,
-    0x9e,
-    0xc1,
-    0xb4,
-    0xf5,
-    0x57,
-    0x70,
-    0x56,
-    0x43,
-    0x12,
-    0x8f,
-    0x4a,
-    0xb6,
-    0x07,
-    0x05,
-    0x28,
-    0x99,
-    0x25,
-    0x95,
-    0xf8,
-    0xe4,
-    0x56,
-    0x11,
-    0x98,
-    0x0d,
-    0x04,
-    0xcb,
-    0x5e,
-    0x20,
-    0xdc,
-    0x4d,
-    0xfd,
-    0x12,
-    0xd2,
-    0x4a,
-    0xad,
-    0x53,
-    0x65,
-    0xd4,
-    0x86,
-    0xa2,
-    0x24,
-    0xce,
-    0x2d,
-    0x25,
-    0x71,
-    0xa5,
-    0xb3,
-    0xb9,
-    0x85,
-    0x3b,
-    0xba,
-    0x87,
-    0xb4,
-    0x24,
-    0xda,
-    0xd8,
-    0xf2,
-    0x15,
-    0x43,
-    0x2a,
-    0x97,
-    0x99,
-    0xa3,
-    0x82,
-    0x5f,
-    0x06,
-    0x4a,
-    0x05,
-    0xb5,
-    0xb0,
-    0x8c,
-    0xc2,
-    0x31,
-    0x5c,
-    0x66,
-    0xd3,
-    0x5f,
-    0xf8,
-    0x65,
-    0xa4,
-    0xc2,
-    0x89,
-    0xc4,
-    0x92,
-    0x18,
-    0x64,
-    0xd4,
-    0xb8,
-    0xe0,
-    0xa1,
-    0xa1,
-    0x05,
-    0x1a,
-    0xcd,
-    0xd3,
-    0x92,
-    0x4e,
-    0xdf,
-    0xd2,
-    0x33,
-    0xcf,
-    0x6d,
-    0x2e,
-    0x4d,
-    0x41,
-    0x20,
-    0x3d,
-    0xe7,
-    0x59,
-    0x66,
-    0x06,
-    0x03,
-    0xe4,
-    0x66,
-    0x5d,
-    0x2e,
-    0x0b,
-    0x39,
-    0x50,
-    0x56,
-    0xd5,
-    0x57,
-    0xc2,
-    0xdc,
-    0xed,
-    0x4f,
-    0x56,
-    0xea,
-    0xa6,
-    0xbc,
-    0x8f,
-    0x07,
-    0x3c,
-    0x74,
-    0x35,
-    0xe8,
-    0x5d,
-    0x02,
-    0xfa,
-    0x89,
-    0xe7,
-    0x57,
-    0x5d,
-    0x7d,
-    0xf4,
-    0xbc,
-    0xcf,
-    0x83,
-    0x14,
-    0x0b,
-    0x14,
-    0x59,
-    0xd9,
-    0x1f,
-    0xed,
-    0xd5,
-    0x99,
-    0x89,
-    0xf4,
-    0x31,
-    0x6f,
-    0x84,
-    0xc7,
-    0xa7,
-    0x83,
-    0x2c,
-    0x68,
-    0x3d,
-    0x8b,
-    0xea,
-    0xe4,
-    0xe3,
-    0x92,
-    0x33,
-    0x33,
-    0xbb,
-    0xf8,
-    0x72,
-    0x60,
-    0xb8,
-    0xbb,
-    0x42,
-    0xea,
-    0x6a,
-    0xf4,
-    0xe1,
-    0x69,
-    0x18,
-    0xa5,
-    0xe1,
-    0x74,
-    0x10,
-    0xb1,
-    0x21,
-    0xc3,
-    0x3b,
-    0x2c,
-    0xfc,
-    0x91,
-    0xf4,
-    0xd5,
-    0xc0,
-    0x44,
-    0x1a,
-    0xe1,
-    0x62,
-    0x50,
-    0x64,
-    0xfb,
-    0x70,
-    0x59,
-    0xf5,
-    0x88,
-    0x46,
-    0x98,
-    0x31,
-    0x2f,
-    0x85,
-    0x7f,
-    0xce,
-    0x99,
-    0xc1,
-    0xa0,
-    0x2e,
-    0x75,
-    0x7a,
-    0xcb,
-    0xec,
-    0xc0,
-    0x4e,
-    0x76,
-    0xb5,
-    0x43,
-    0x6c,
-    0x62,
-    0x59,
-    0x5d,
-    0x4c,
-    0x7c,
-    0x21,
-    0x02,
-    0x9e,
-    0x02,
-    0x64,
-    0x04,
-    0x80,
-    0xe6,
-    0x55,
-    0x91,
-    0xf3,
-    0x77,
-    0x1f,
-    0xfe,
-    0x90,
-    0x3e,
-    0x34,
-    0xc2,
-    0x77,
-    0x26,
-    0xe1,
-    0xc6,
-    0x89,
-    0xe1,
-    0x27,
-    0xdc,
-    0xd7,
-    0x86,
-    0xc6,
-    0x8c,
-    0x59,
-    0x7f,
-    0x9a,
-    0x17,
-    0xe4,
-    0xa2,
-    0x2a,
-    0xb6,
-    0x56,
-    0x9e,
-    0x7f,
-    0x23,
-    0x14,
-    0x99,
-    0x32,
-    0x5a,
-    0xb6,
-    0x17,
-    0xc9,
-    0xa1,
-    0x00,
-    0x1e,
-    0x44,
-    0xc6,
-    0x14,
-    0x98,
-    0xf2,
-    0xa8,
-    0xe7,
-    0xf8,
-    0x89,
-    0xf8,
-    0xf2,
-    0x20,
-    0x76,
-    0x41,
-    0x2a,
-    0x82,
-    0x72,
-    0x26,
-    0x31,
-    0x86,
-    0x56,
-    0xec,
-    0xce,
-    0x2c,
-    0x30,
-    0x38,
-    0x9b,
-    0xf3,
-    0x96,
-    0x19,
-    0xfd,
-    0xf9,
-    0x3a,
-    0x48,
-    0x59,
-    0x63,
-    0xbf,
-    0xaf,
-    0x85,
-    0xff,
-    0xcb,
-    0x29,
-    0x7d,
-    0x28,
-    0x5e,
-    0x89,
-    0x58,
-    0xeb,
-    0x62,
-    0xdd,
-    0x7a,
-    0x68,
-    0x83,
-    0xf4,
-    0x0a,
-    0x7a,
-    0x40,
-    0x1d,
-    0xa7,
-    0x9a,
-    0x42,
-    0x32,
-    0x56,
-    0x00,
-    0xed,
-    0xd5,
-    0xbf,
-    0x0c,
-    0x36,
-    0xfa,
-    0x9a,
-    0xe5,
-    0xb4,
-    0xa6,
-    0x64,
-    0x60,
-    0xf9,
-    0xf5,
-    0x56,
-    0x23,
-    0x22,
-    0x62,
-    0x97,
-    0x0a,
-    0xad,
-    0x43,
-    0xb1,
-    0xc9,
-    0x8b,
-    0x93,
-    0x42,
-    0xd3,
-    0x76,
-    0xf4,
-    0xf4,
-    0x7b,
-    0x85,
-    0xf4,
-    0xae,
-    0x59,
-    0xfe,
-    0x90,
-    0x0c,
-    0xf0,
-    0x6b,
-    0xf7,
-    0x0d,
-    0x8d,
-    0xf0,
-    0x90,
-    0x0c,
-    0x72,
-    0xdb,
-    0x3d,
-    0xf2,
-    0x34,
-    0x7d,
-    0xe2,
-    0xa9,
-    0x62,
-    0x39,
-    0x21,
-    0xd4,
-    0x67,
-    0xda,
-    0x68,
-    0xbd,
-    0xb2,
-    0x29,
-    0x2e,
-    0x8e,
-    0x14,
-    0xc0,
-    0x79,
-    0xc5,
-    0x69,
-    0x19,
-    0xa4,
-    0xe2,
-    0x7a,
-    0xea,
-    0x5f,
-    0x62,
-    0x22,
-    0xb5,
-    0xf7,
-    0xf1,
-    0xb0,
-    0x9a,
-    0xd8,
-    0xdc,
-    0x8d,
-    0x71,
-    0x50,
-    0xc5,
-    0x1f,
-    0x15,
-    0x95,
-    0x9a,
-    0xec,
-    0x02,
-    0x0a,
-    0xc8,
-    0x03,
-    0x23,
-    0xbe,
-    0xab,
-    0x98,
-    0xe5,
-    0x35,
-    0x49,
-    0xee,
-    0x90,
-    0x6c,
-    0x41,
-    0x7a,
-    0xd7,
-    0x17,
-    0xfe,
-    0x45,
-    0xae,
-    0x2d,
-    0x30,
-    0x92,
-    0x5b,
-    0xa6,
-    0x7d,
-    0xc1,
-    0xd0,
-    0x84,
-    0x73,
-    0x73,
-    0x38,
-    0x10,
-    0xc2,
-    0xef,
-    0xd0,
-    0x66,
-    0xa8,
-    0xc4,
-    0xf8,
-    0x33,
-    0xac,
-    0xb0,
-    0x8a,
-    0xbe,
-    0x8f,
-    0xc1,
-    0x6a,
-    0x25,
-    0x80,
-    0xba,
-    0x5e,
-    0xe9,
-    0x8f,
-    0xb8,
-    0x20,
-    0xad,
-    0x64,
-    0x15,
-    0xb2,
-    0x3b,
-    0x31,
-    0x8d,
-    0xf2,
-    0xc8,
-    0xe5,
-    0x9f,
-    0x6e,
-    0x79,
-    0xa3,
-    0x36,
-    0x79,
-    0x26,
-    0x72,
-    0x89,
-    0x7f,
-    0x5d,
-    0x36,
-    0x40,
-    0x95,
-    0xaa,
-    0xdf,
-    0xd8,
-    0x54,
-    0x15,
-    0xe0,
-    0x48,
-    0xe8,
-    0xed,
-    0xe2,
-    0xe5,
-    0x64,
-    0xc4,
-    0xba,
-    0x83,
-    0x58,
-    0xbb,
-    0x99,
-    0xdd,
-    0xa6,
-    0x00,
-    0x83,
-    0x37,
-    0x91,
-    0x94,
-    0x03,
-    0x41,
-    0x17,
-    0x52,
-    0x1c,
-    0x3f,
-    0x81,
-    0x2d,
-    0x82,
-    0x67,
-    0x38,
-    0xb9,
-    0x0b,
-    0x8a,
-    0xda,
-    0xed,
-    0x60,
-    0xf7,
-    0x8d,
-    0x27,
-    0xf8,
-    0x9d,
-    0x94,
-    0x70,
-    0x47,
-    0x6f,
-    0x20,
-    0x01,
-    0x32,
-    0x0d,
-    0x68,
-    0x07,
-    0xc7,
-    0xa0,
-    0xfb,
-    0xa4,
-    0x2b,
-    0x05,
-    0x55,
-    0x36,
-    0xd3,
-    0x2f,
-    0xb1,
-    0xdb,
-    0xf7,
-    0xc6,
-    0x1f,
-    0x35,
-    0x44,
-    0x14,
-    0xd6,
-    0x6a,
-    0xd2,
-    0x22,
-    0xcb,
-    0x6f,
-    0x55,
-    0x1e,
-    0x83,
-    0x87,
-    0x97,
-    0x00,
-    0x25,
-    0x06,
-    0x26,
-    0x6e,
-    0xd3,
-    0x5b,
-    0x49,
-    0xdc,
-    0x3a,
-    0x4d,
-    0x39,
-    0xf7,
-    0x68,
-    0x85,
-    0x8e,
-    0x44,
-    0xde,
-    0x4d,
-    0xf8,
-    0x04,
-    0xe7,
-    0x97,
-    0x2f,
-    0x5c,
-    0x28,
-    0x41,
-    0x2d,
-    0xb2,
-    0x77,
-    0x97,
-    0x9a,
-    0x5a,
-    0xf1,
-    0x1a,
-    0x88,
-    0x72,
-    0x46,
-    0x80,
-    0x60,
-    0x0a,
-    0x58,
-    0xfb,
-    0x1c,
-    0x89,
-    0x05,
-    0xbe,
-    0xb7,
-    0x4b,
-    0x40,
-    0xbe,
-    0xe2,
-    0x8f,
-    0x67,
-    0xb5,
-    0xf9,
-    0x91,
-    0xd0,
-    0x6d,
-    0x35,
-    0xf3,
-    0xa6,
-    0x3b,
-    0x23,
-    0x61,
-    0xf3,
-    0xc9,
-    0x55,
-    0x75,
-    0xfd,
-    0x19,
-    0x57,
-    0xd8,
-    0xd6,
-    0xc7,
-    0xe4,
-    0xab,
-    0x2f,
-    0x8f,
-    0x5a,
-    0x25,
-    0x6d,
-    0x0e,
-    0x6c,
-    0x7d,
-    0xff,
-    0xcd,
-    0x17,
-    0x0a,
-    0xee,
-    0x7b,
-    0xd7,
-    0xa9,
-    0xb5,
-    0x7a,
-    0x1a,
-    0x5f,
-    0x54,
-    0x9e,
-    0xf5,
-    0x3f,
-    0xa0,
-    0x31,
-    0x16,
-    0x8e,
-    0xdd,
-    0x3a,
-    0xfa,
-    0x26,
-    0x8e,
-    0xfe,
-    0x60,
-    0x18,
-    0x8c,
-    0xc8,
-    0xfd,
-    0x95,
-    0x56,
-    0xe6,
-    0x71,
-    0x0f,
-    0xa8,
-    0xf4,
-    0x7a,
-    0x9b,
-    0x4f,
-    0x5d,
-    0x67,
-    0x9a,
-    0x3b,
-    0x1e,
-    0xd0,
-    0x98,
-    0xd6,
-    0xcd,
-    0x85,
-    0x74,
-    0x94,
-    0xda,
-    0xc4,
-    0xc1,
-    0xcb,
-    0x16,
-    0xaf,
-    0x6d,
-    0xc6,
-    0x71,
-    0xfc,
-    0xa0,
-    0x15,
-    0x08,
-    0xef,
-    0xe7,
-    0x26,
-    0x5f,
-    0x85,
-    0x92,
-    0x1a,
-    0xea,
-    0xf3,
-    0x5b,
-    0xd1,
-    0xd3,
-    0x4e,
-    0x48,
-    0x47,
-    0xf7,
-    0x8c,
-    0xd2,
-    0x24,
-    0x32,
-    0xab,
-    0x46,
-    0x8e,
-    0xdc,
-    0x30,
-    0x6c,
-    0x42,
-    0x93,
-    0xd3,
-    0x67,
-    0xe3,
-    0x3b,
-    0x79,
-    0xdc,
-    0x91,
-    0x44,
-    0x62,
-    0x56,
-    0xbe,
-    0x2b,
-    0xa4,
-    0xe9,
-    0x3d,
-    0x44,
-    0xd8,
-    0x16,
-    0x9c,
-    0xb6,
-    0x13,
-    0xef,
-    0xb4,
-    0xc7,
-    0x18,
-    0x7b,
-    0x7e,
-    0x5a,
-    0xcb,
-    0x5c,
-    0x29,
-    0xb5,
-    0xe9,
-    0xaf,
-    0x69,
-    0x88,
-    0xf7,
-    0x34,
-    0x11,
-    0x2b,
-    0x78,
-    0xaf,
-    0xe4,
-    0x28,
-    0x63,
-    0x8e,
-    0xa8,
-    0xf9,
-    0xd4,
-    0xcb,
-    0x7d,
-    0x13,
-    0x02,
-    0x14,
-    0x6d,
-    0x23,
-    0x71,
-    0x2a,
-    0x44,
-    0x97,
-    0x69,
-    0x87,
-    0xa2,
-    0x60,
-    0xa6,
-    0x43,
-    0x4e,
-    0xf6,
-    0x51,
-    0x38,
-    0xcd,
-    0x9d,
-    0x2f,
-    0x65,
-    0x34,
-    0xe8,
-    0x19,
-    0x90,
-    0x3a,
-    0x7b,
-    0xac,
-    0x2f,
-    0x91,
-    0x14,
-    0x41,
-    0x89,
-    0x77,
-    0xcd,
-    0x1f,
-    0x19,
-    0x88,
-    0x9b,
-    0xf0,
-    0x33,
-    0xd6,
-    0x1b,
-    0x72,
-    0xea,
-    0x3b,
-    0x8e,
-    0x6f,
-    0x30,
-    0xee,
-    0x21,
-    0xef,
-    0x3f,
-    0x55,
-    0x73,
-    0xac,
-    0x38,
-    0x1a,
-    0x51,
-    0xc6,
-    0x0a,
-    0x81,
-    0xc4,
-    0xb8,
-    0x96,
-    0xf9,
-    0x4d,
-    0x8b,
-    0x11,
-    0xf1,
-    0x6f,
-    0x4a,
-    0xa9,
-    0xec,
-    0x6e,
-    0xb5,
-    0x6b,
-    0xd8,
-    0x57,
-    0x39,
-    0x64,
-    0x9b,
-    0x40,
-    0x20,
-    0x06,
-    0xf0,
-    0xd1,
-    0x06,
-    0xce,
-    0x71,
-    0x03,
-    0x8c,
-    0x24,
-    0xf4,
-    0x28,
-    0x50,
-    0x83,
-    0x1b,
-    0x2c,
-    0x1c,
-    0xd9,
-    0x27,
-    0x1a,
-    0x5d,
-    0x31,
-    0x0d,
-    0xe1,
-    0xd7,
-    0x8f,
-    0xcc,
-    0x59,
-    0x98,
-    0x1b,
-    0xfd,
-    0x81,
-    0x2a,
-    0x82,
-    0xac,
-    0x0b,
-    0x0d,
-    0x9a,
-    0x66,
-    0x1a,
-    0x64,
-    0x45,
-    0x93,
-    0x4a,
-    0xef,
-    0x97,
-    0x07,
-    0xf1,
-    0x39,
-    0x3b,
-    0xd3,
-    0xa4,
-    0x13,
-    0x12,
-    0x61,
-    0xfd,
-    0x40,
-    0x1e,
-    0xc0,
-    0x9c,
-    0x72,
-    0x9f,
-    0x3c,
-    0x6c,
-    0x76,
-    0x7b,
-    0x32,
-    0x27,
-    0xab,
-    0xe3,
-    0x22,
-    0x1d,
-    0xb8,
-    0x34,
-    0x06,
-    0x31,
-    0x7e,
-    0x1b,
-    0xe2,
-    0x24,
-    0x4c,
-    0xfd,
-    0x9d,
-    0x16,
-    0x52,
-    0x96,
-    0x0f,
-    0x49,
-    0x59,
-    0xe0,
-    0x5b,
-    0x29,
-    0xb1,
-    0x36,
-    0x7f,
-    0x89,
-    0x6a,
-    0xb9,
-    0x29,
-    0x30,
-    0xc7,
-    0xf3,
-    0xcd,
-    0x94,
-    0xef,
-    0xba,
-    0xf4,
-    0xe5,
-    0xe6,
-    0x57,
-    0xd7,
-    0x4d,
-    0xbc,
-    0xe8,
-    0x2c,
-    0x77,
-    0x04,
-    0x03,
-    0x40,
-    0x4e,
-    0x88,
-    0x9c,
-    0x46,
-    0x07,
-    0x3b,
-    0x29,
-    0xee,
-    0x61,
-    0x6f,
-    0x03,
-    0x3a,
-    0x2b,
-    0x48,
-    0x10,
-    0x8e,
-    0x07,
-    0x71,
-    0x9f,
-    0x06,
-    0x6f,
-    0x0d,
-    0x93,
-    0x0b,
-    0xf5,
-    0xf1,
-    0xc4,
-    0x29,
-    0xcf,
-    0x10,
-    0xa2,
-    0x1b,
-    0x92,
-    0x36,
-    0x1c,
-    0x28,
-    0x3e,
-    0xfa,
-    0xc0,
-    0xb3,
-    0x7b,
-    0xee,
-    0x23,
-    0x0d,
-    0x22,
-    0x18,
-    0x83,
-    0x8d,
-    0xff,
-    0xa6,
-    0xab,
-    0xe3,
-    0xd6,
-    0xdd,
-    0x17,
-    0xa9,
-    0xa3,
-    0x53,
-    0x59,
-    0x3b,
-    0x26,
-    0x5e,
-    0xbb,
-    0xc9,
-    0x9f,
-    0xcc,
-    0x26,
-    0xaa,
-    0xd7,
-    0xd4,
-    0x42,
-    0xf3,
-    0x5f,
-    0x4d,
-    0xdf,
-    0x49,
-    0x1c,
-    0x1e,
-    0x94,
-    0xf3,
-    0x04,
-    0xf6,
-    0xa5,
-    0x33,
-    0x22,
-    0x3d,
-    0x2a,
-    0xd7,
-    0xe0,
-    0x4a,
-    0x6e,
-    0x0b,
-    0x85,
-    0xd6,
-    0x96,
-    0x71,
-    0xfd,
-    0xb0,
-    0x83,
-    0x74,
-    0xd9,
-    0xb3,
-    0xf9,
-    0xd9,
-    0x96,
-    0xf6,
-    0x00,
-    0x96,
-    0x22,
-    0x42,
-    0x8a,
-    0xe8,
-    0x9c,
-    0xc9,
-    0x57,
-    0xa0,
-    0x5b,
-    0x14,
-    0x16,
-    0xbd,
-    0x33,
-    0x3e,
-    0xcd,
-    0x40,
-    0xf3,
-    0x60,
-    0x7a,
-    0x3c,
-    0x32,
-    0x4c,
-    0xfb,
-    0x2d,
-    0x4c,
-    0x7e,
-    0x2b,
-    0x8a,
-    0xa7,
-    0x4f,
-    0x4e,
-    0x9e,
-    0x3b,
-    0x6c,
-    0xaf,
-    0x93,
-    0x51,
-    0x87,
-    0x87,
-    0xd0,
-    0x8a,
-    0x4c,
-    0x21,
-    0x85,
-    0x24,
-    0x97,
-    0x3c,
-    0x83,
-    0x79,
-    0xe4,
-    0xb1,
-    0x52,
-    0xc8,
-    0x07,
-    0x55,
-    0x7d,
-    0x38,
-    0x1d,
-    0x21,
-    0x31,
-    0x1a,
-    0xc2,
-    0x90,
-    0x06,
-    0x6f,
-    0x84,
-    0x49,
-    0x1d,
-    0xaa,
-    0x98,
-    0xfe,
-    0x6b,
-    0xb7,
-    0xcc,
-    0x94,
-    0x54,
-    0x3b,
-    0xbd,
-    0x84,
-    0x7c,
-    0x1e,
-    0x4a,
-    0x81,
-    0xda,
-    0x47,
-    0x48,
-    0x5b,
-    0x0e,
-    0xa6,
-    0x77,
-    0x23,
-    0xf4,
-    0x78,
-    0xb5,
-    0x90,
-    0x79,
-    0xc6,
-    0x72,
-    0xa1,
-    0xad,
-    0x2f,
-    0x64,
-    0x84,
-    0x1a,
-    0xe8,
-    0x7c,
-    0xb7,
-    0x55,
-    0x01,
-    0x18,
-    0x6d,
-    0xd2,
-    0xea,
-    0x7a,
-    0x33,
-    0xfc,
-    0x35,
-    0x79,
-    0xd3,
-    0x85,
-    0x9d,
-    0x76,
-    0x78,
-    0xfb,
-    0x48,
-    0x92,
-    0x14,
-    0x9d,
-    0x49,
-    0x1e,
-    0xff,
-    0x6c,
-    0x69,
-    0x54,
-    0xe1,
-    0x85,
-    0x27,
-    0x44,
-    0xd1,
-    0xad,
-    0xfd,
-    0x10,
-    0xbe,
-    0x2e,
-    0xe5,
-    0x5c,
-    0x0e,
-    0xe2,
-    0x1c,
-    0x01,
-    0x86,
-    0x8d,
-    0x26,
-    0x01,
-    0x6a,
-    0x6f,
-    0x12,
-    0xc0,
-    0xe5,
-    0x1a,
-    0xff,
-    0x71,
-    0xaa,
-    0x82,
-    0xdf,
-    0xce,
-    0xdc,
-    0x53,
-    0x7b,
-    0x0c,
-    0x2c,
-    0x87,
-    0xb8,
-    0x0e,
-    0x41,
-    0x37,
-    0x18,
-    0xd9,
-    0x5c,
-    0xb1,
-    0x83,
-    0x48,
-    0x3c,
-    0xcc,
-    0x48,
-    0x00,
-    0x3f,
-    0x78,
-    0x5f,
-    0xa7,
-    0xcb,
-    0x99,
-    0xf1,
-    0x51,
-    0xec,
-    0x16,
-    0x19,
-    0x3b,
-    0x3e,
-    0x2c,
-    0xed,
-    0xbc,
-    0x0e,
-    0x09,
-    0xb8,
-    0x78,
-    0xbc,
-    0x96,
-    0x8a,
-    0xd7,
-    0x63,
-    0x94,
-    0xf3,
-    0xb6,
-    0xbc,
-    0xea,
-    0x0b,
-    0x5c,
-    0x40,
-    0x3d,
-    0xb5,
-    0xaf,
-    0x8d,
-    0xc2,
-    0x25,
-    0xa7,
-    0x0b,
-    0x50,
-    0xa0,
-    0x04,
-    0xcf,
-    0xba,
-    0x83,
-    0x3c,
-    0xc0,
-    0x5b,
-    0x87,
-    0xb8,
-    0xf8,
-    0xf2,
-    0x43,
-    0x3f,
-    0x6d,
-    0xb1,
-    0xf3,
-    0xb3,
-    0xd0,
-    0x90,
-    0x77,
-    0xfb,
-    0xb5,
-    0xe7,
-    0x9f,
-    0x40,
-    0xf5,
-    0x3c,
-    0xa5,
-    0x5c,
-    0x50,
-    0x59,
-    0xfb,
-    0x8f,
-    0x57,
-    0xa2,
-    0x47,
-    0x74,
-    0x8a,
-    0xa6,
-    0xad,
-    0x34,
-    0xbd,
-    0xf4,
-    0x4c,
-    0xfa,
-    0xc0,
-    0x30,
-    0x0b,
-    0xa7,
-    0x3e,
-    0x66,
-    0x95,
-    0xc6,
-    0xe6,
-    0x9d,
-    0xa2,
-    0xc2,
-    0xc9,
-    0xb0,
-    0x79,
-    0x56,
-    0x03,
-    0x59,
-    0xb2,
-    0x46,
-    0x9e,
-    0x8f,
-    0x41,
-    0x4d,
-    0xb3,
-    0x12,
-    0xb0,
-    0x56,
-    0xd2,
-    0x44,
-    0xac,
-    0xef,
-    0xa4,
-    0x3a,
-    0xc3,
-    0xfa,
-    0xcf,
-    0x13,
-    0x6c,
-    0xa5,
-    0x1a,
-    0x88,
-    0x48,
-    0x9d,
-    0xd2,
-    0xc5,
-    0xa7,
-    0x7f,
-    0x6c,
-    0x77,
-    0x4e,
-    0x90,
-    0x6b,
-    0x27,
-    0x78,
-    0xad,
-    0x85,
-    0xc6,
-    0x1a,
-    0x85,
-    0x01,
-    0x89,
-    0x6b,
-    0x05,
-    0x63,
-    0xf7,
-    0xa4,
-    0x14,
-    0x4b,
-    0x40,
-    0x04,
-    0x81,
-    0x9b,
-    0xd0,
-    0x18,
-    0x39,
-    0xd8,
-    0x24,
-    0x39,
-    0xbe,
-    0xd3,
-    0xdc,
-    0x56,
-    0xd4,
-    0x88,
-    0x12,
-    0xf4,
-    0x7e,
-    0x46,
-    0xeb,
-    0x72,
-    0x28,
-    0x10,
-    0x6b,
-    0x92,
-    0x26,
-    0x44,
-    0x8e,
-    0x35,
-    0x5d,
-    0x7a,
-    0x94,
-    0x66,
-    0x40,
-    0xaf,
-    0x9c,
-    0x9a,
-    0xff,
-    0xa3,
-    0x74,
-    0x36,
-    0xfa,
-    0x7f,
-    0xb0,
-    0x52,
-    0x7c,
-    0xbb,
-    0xf9,
-    0xbd,
-    0xa6,
-    0x3f,
-    0xa8,
-    0x41,
-    0xa9,
-    0xc8,
-    0x94,
-    0x28,
-    0x39,
-    0x8e,
-    0x27,
-    0xfe,
-    0x3e,
-    0x24,
-    0xb8,
-    0x99,
-    0xcc,
-    0x9f,
-    0x14,
-    0x57,
-    0x55,
-    0xfa,
-    0x5e,
-    0xa7,
-    0x1d,
-    0xb9,
-    0x1a,
-    0xcb,
-    0xef,
-    0xcd,
-    0x84,
-    0xdc,
-    0x0f,
-    0xb8,
-    0x26,
-    0x0e,
-    0x6f,
-    0xf1,
-    0xa9,
-    0x35,
-    0x25,
-    0x8a,
-    0xec,
-    0x88,
-    0x1d,
-    0x10,
-    0x53,
-    0xa5,
-    0x0b,
-    0xb3,
-    0x62,
-    0xd6,
-    0xa4,
-    0xa6,
-    0x8a,
-    0x93,
-    0x0e,
-    0xc9,
-    0x42,
-    0x48,
-    0x95,
-    0x86,
-    0x5a,
-    0x58,
-    0x9f,
-    0xf8,
-    0x8c,
-    0x61,
-    0xe2,
-    0x53,
-    0x55,
-    0xc2,
-    0xd4,
-    0x80,
-    0x03,
-    0x5a,
-    0x63,
-    0x07,
-    0x0e,
-    0x93,
-    0xe7,
-    0x32,
-    0xab,
-    0x9f,
-    0x55,
-    0x70,
-    0x9f,
-    0x02,
-    0xb5,
-    0xf7,
-    0x51,
-    0x51,
-    0xd6,
-    0xad,
-    0x24,
-    0x39,
-    0x40,
-    0x49,
-    0x03,
-    0xc2,
-    0x6a,
-    0xb5,
-    0x3e,
-    0xd5,
-    0x2d,
-    0xb7,
-    0x94,
-    0xfd,
-    0x79,
-    0xd1,
-    0x91,
-    0x6a,
-    0x47,
-    0x66,
-    0x1a,
-    0x3b,
-    0xce,
-    0x1d,
-    0x46,
-    0xfd,
-    0xfa,
-    0x8b,
-    0x6f,
-    0x6e,
-    0x1a,
-    0x0c,
-    0x89,
-    0x87,
-    0xd9,
-    0xf1,
-    0xb3,
-    0xba,
-    0x6f,
-    0xe1,
-    0x0c,
-    0x79,
-    0x18,
-    0x79,
-    0xc8,
-    0xf7,
-    0xc5,
-    0x36,
-    0x83,
-    0x32,
-    0x12,
-    0x95,
-    0xd4,
-    0x31,
-    0x79,
-    0x78,
-    0x26,
-    0x8a,
-    0xc5,
-    0xcc,
-    0xc3,
-    0x28,
-    0xc9,
-    0x69,
-    0x32,
-    0x4b,
-    0x51,
-    0x39,
-    0xc3,
-    0xd0,
-    0x59,
-    0x9d,
-    0x68,
-    0xb3,
-    0x7d,
-    0x0c,
-    0xc6,
-    0xd2,
-    0xb1,
-    0xfe,
-    0x8c,
-    0xf4,
-    0x32,
-    0x08,
-    0x04,
-    0x09,
-    0xbd,
-    0x48,
-    0xe8,
-    0xb4,
-    0xfe,
-    0x03,
-    0x76,
-    0x06,
-    0x4b,
-    0x8d,
-    0xc6,
-    0x8d,
-    0x92,
-    0x69,
-    0x5c,
-    0x8d,
-    0x90,
-    0xb2,
-    0xfa,
-    0x8d,
-    0x44,
-    0xb9,
-    0xb7,
-    0x15,
-    0xa4,
-    0xf0,
-    0x55,
-    0xb7,
-    0x8e,
-    0x07,
-    0xd0,
-    0x4c,
-    0x01,
-    0x54,
-    0x33,
-    0x80,
-    0x8d,
-    0x78,
-    0xaf,
-    0x91,
-    0x08,
-    0x40,
-    0xee,
-    0x53,
-    0x83,
-    0xc9,
-    0xa5,
-    0x78,
-    0x7c,
-    0xe8,
-    0x69,
-    0x0e,
-    0x56,
-    0xc8,
-    0xc3,
-    0x49,
-    0x06,
-    0xd5,
-    0x86,
-    0x83,
-    0x0e,
-    0xd9,
-    0x60,
-    0x81,
-    0xaf,
-    0x65,
-    0xb0,
-    0xf8,
-    0x5a,
-    0x73,
-    0x97,
-    0x4f,
-    0x69,
-    0x49,
-    0x52,
-    0xa7,
-    0x0c,
-    0xa1,
-    0xc7,
-    0x19,
-    0x86,
-    0x06,
-    0x5d,
-    0x3e,
-    0x99,
-    0x81,
-    0x11,
-    0xf5,
-    0x3e,
-    0x75,
-    0xc7,
-    0x60,
-    0x9a,
-    0xc8,
-    0xdd,
-    0x30,
-    0x2e,
-    0x43,
-    0x06,
-    0x23,
-    0x4e,
-    0x3c,
-    0x56,
-    0xca,
-    0xd4,
-    0x72,
-    0x99,
-    0x90,
-    0x15,
-    0x38,
-    0xe9,
-    0xf8,
-    0x14,
-    0xd6,
-    0x80,
-    0x26,
-    0xf6,
-    0x2c,
-    0xca,
-    0xa1,
-    0xb6,
-    0x98,
-    0xbe,
-    0x57,
-    0x1a,
-    0x1a,
-    0x6f,
-    0xe2,
-    0xe6,
-    0xb6,
-    0xde,
-    0x09,
-    0x4f,
-    0x1a,
-    0x13,
-    0x8a,
-    0xb2,
-    0x81,
-    0x6c,
-    0x17,
-    0x86,
-    0xd7,
-    0x34,
-    0x9e,
-    0x90,
-    0x1e,
-    0x77,
-    0xcd,
-    0x55,
-    0x10,
-    0x15,
-    0xd6,
-    0xd5,
-    0x06,
-    0x16,
-    0x6f,
-    0x76,
-    0x18,
-    0x3d,
-    0x1d,
-    0x3f,
-    0x86,
-    0xe0,
-    0xb3,
-    0x46,
-    0x57,
-    0xf7,
-    0x15,
-    0x6c,
-    0x3f,
-    0x72,
-    0x42,
-    0x47,
-    0xc6,
-    0xd0,
-    0x92,
-    0x60,
-    0xa7,
-    0xed,
-    0x3c,
-    0x9f,
-    0x76,
-    0x1b,
-    0x1a,
-    0x03,
-    0x86,
-    0x75,
-    0xb1,
-    0x96,
-    0x0a,
-    0x70,
-    0x6c,
-    0xa1,
-    0x7a,
-    0xb3,
-    0x28,
-    0x1c,
-    0x39,
-    0x29,
-    0xf5,
-    0x68,
-    0x74,
-    0x54,
-    0x1b,
-    0x41,
-    0x4d,
-    0xe4,
-    0x5c,
-    0xee,
-    0x39,
-    0x88,
-    0x79,
-    0xba,
-    0xa6,
-    0x04,
-    0xf8,
-    0xa8,
-    0xe2,
-    0x84,
-    0x23,
-    0x63,
-    0x38,
-    0x2f,
-    0x54,
-    0x74,
-    0x5c,
-    0x00,
-    0x70,
-    0xb7,
-    0x09,
-    0xd1,
-    0xb2,
-    0x10,
-    0xe8,
-    0xb9,
-    0xaa,
-    0x5a,
-    0xb4,
-    0x98,
-    0x85,
-    0xa0,
-    0x9c,
-    0xf0,
-    0x8e,
-    0x90,
-    0xe8,
-    0xf7,
-    0xf5,
-    0x2c,
-    0xe0,
-    0xea,
-    0xcf,
-    0xc3,
-    0xe9,
-    0xa3,
-    0x5f,
-    0x20,
-    0xf2,
-    0x6e,
-    0x94,
-    0x01,
-    0x0e,
-    0x19,
-    0xd2,
-    0xcb,
-    0x62,
-    0x4a,
-    0xf6,
-    0x7b,
-    0x42,
-    0x15,
-    0x94,
-    0xe0,
-    0x97,
-    0xce,
-    0x82,
-    0x08,
-    0x84,
-    0x1c,
-    0x9b,
-    0xf8,
-    0x49,
-    0x4f,
-    0xbd,
-    0x9f,
-    0x67,
-    0xf4,
-    0x14,
-    0x0d,
-    0x05,
-    0xa6,
-    0x9b,
-    0xe1,
-    0x92,
-    0x27,
-    0xdf,
-    0x00,
-    0xac,
-    0xaf,
-    0x07,
-    0x8d,
-    0x40,
-    0x83,
-    0x11,
-    0x15,
-    0xf3,
-    0xca,
-    0x5e,
-    0x09,
-    0xc1,
-    0x9c,
-    0x71,
-    0x72,
-    0xe4,
-    0x5d,
-    0xf4,
-    0xe0,
-    0xf8,
-    0x49,
-    0xfb,
-    0xa3,
-    0x5c,
-    0x4f,
-    0x8d,
-    0x3e,
-    0xdb,
-    0x23,
-    0x61,
-    0x19,
-    0x8c,
-    0x8f,
-    0xe5,
-    0x76,
-    0xf6,
-    0x0a,
-    0x84,
-    0xa6,
-    0x78,
-    0x8b,
-    0x29,
-    0x7d,
-    0xe9,
-    0x9f,
-    0xff,
-    0x03,
-    0x7b,
-    0xba,
-    0x7c,
-    0x6c,
-    0xe5,
-    0xca,
-    0x9d,
-    0x4b,
-    0xc1,
-    0x12,
-    0x73,
-    0x02,
-    0x32,
-    0x36,
-    0xde,
-    0x7d,
-    0xcb,
-    0x92,
-    0x99,
-    0x20,
-    0xac,
-    0xd0,
-    0x76,
-    0xfd,
-    0xee,
-    0xba,
-    0xeb,
-    0x4b,
-    0x42,
-    0x4c,
-    0xce,
-    0x13,
-    0xd4,
-    0x0e,
-    0x5d,
-    0x2d,
-    0x76,
-    0xa1,
-    0x81,
-    0x6b,
-    0xfa,
-    0x97,
-    0x54,
-    0x14,
-    0xdf,
-    0x88,
-    0xe0,
-    0x94,
-    0x31,
-    0x61,
-    0x2a,
-    0x71,
-    0xaa,
-    0x00,
-    0x6f,
-    0x81,
-    0x1d,
-    0xfe,
-    0xad,
-    0x5b,
-    0x15,
-    0xcc,
-    0x65,
-    0x0b,
-    0xb9,
-    0x02,
-    0x9f,
-    0x0a,
-    0xf2,
-    0xf3,
-    0x30,
-    0x6d,
-    0xd0,
-    0x85,
-    0x38,
-    0x5c,
-    0x2a,
-    0x40,
-    0xee,
-    0xc6,
-    0x85,
-    0xa4,
-    0xa0,
-    0x53,
-    0x37,
-    0xc0,
-    0xf5,
-    0x9a,
-    0xcd,
-    0x00,
-    0x76,
-    0x95,
-    0xa9,
-    0x47,
-    0x4c,
-    0x51,
-    0xf0,
-    0x3d,
-    0x4b,
-    0xea,
-    0xa3,
-    0xeb,
-    0x30,
-    0xb7,
-    0x0b,
-    0x85,
-    0x27,
-    0xc2,
-    0x5b,
-    0x86,
-    0x91,
-    0x7b,
-    0x91,
-    0x02,
-    0x03,
-    0xad,
-    0x9d,
-    0x38,
-    0x92,
-    0xb0,
-    0xc5,
-    0x68,
-    0x4e,
-    0xe1,
-    0x48,
-    0xe4,
-    0x0c,
-    0x4f,
-    0x41,
-    0x68,
-    0x69,
-    0xb7,
-    0xcf,
-    0xae,
-    0x0b,
-    0xb3,
-    0x73,
-    0x3e,
-    0x2a,
-    0x2e,
-    0xb9,
-    0x84,
-    0x4f,
-    0x1b,
-    0x1b,
-    0x24,
-    0x5c,
-    0x66,
-    0x22,
-    0x92,
-    0xcd,
-    0x2b,
-    0xce,
-    0xdd,
-    0x3d,
-    0x27,
-    0x38,
-    0xcb,
-    0x2c,
-    0x6c,
-    0x76,
-    0x2b,
-    0xff,
-    0x58,
-    0xbf,
-    0x67,
-    0x48,
-    0xc7,
-    0xcf,
-    0x59,
-    0x48,
-    0x88,
-    0x8d,
-    0x5f,
-    0xb3,
-    0x0e,
-    0xec,
-    0xb2,
-    0xb2,
-    0x68,
-    0x0f,
-    0xf3,
-    0x2e,
-    0x74,
-    0xb0,
-    0x07,
-    0x4c,
-    0x4f,
-    0xc2,
-    0x25,
-    0x34,
-    0x0f,
-    0x55,
-    0x2d
-  ],
-  const [
-    0x02,
-    0x87,
-    0xfa,
-    0x0e,
-    0x37,
-    0x7c,
-    0x9d,
-    0xd6,
-    0x08,
-    0xcf,
-    0x98,
-    0x53,
-    0x90,
-    0x7b,
-    0x01,
-    0x0b,
-    0xca,
-    0xe4,
-    0xc2,
-    0x16,
-    0x02,
-    0x75,
-    0xa7,
-    0xdd,
-    0x89,
-    0x88,
-    0xb5,
-    0x22,
-    0xad,
-    0x86,
-    0xbe,
-    0x41,
-    0xe8,
-    0x4f,
-    0x32,
-    0xb5,
-    0x58,
-    0xdc,
-    0x38,
-    0xdd,
-    0x6f,
-    0x23,
-    0xfd,
-    0x00,
-    0xec,
-    0x3a,
-    0x4c,
-    0x90,
-    0x0a,
-    0xc0,
-    0x60,
-    0xab,
-    0xf7,
-    0x79,
-    0xf6,
-    0xe7,
-    0x87,
-    0x38,
-    0xa6,
-    0x4f,
-    0x2a,
-    0x02,
-    0x72,
-    0xa9,
-    0x1c,
-    0x70,
-    0xa0,
-    0xfb,
-    0xdb,
-    0x55,
-    0xc5,
-    0x4d,
-    0xde,
-    0xa1,
-    0x23,
-    0xaf,
-    0x84,
-    0x85,
-    0x34,
-    0x7e,
-    0x4b,
-    0xd8,
-    0x87,
-    0xe4,
-    0x42,
-    0xba,
-    0xcb,
-    0x9e,
-    0xc1,
-    0x77,
-    0x2a,
-    0x02,
-    0x57,
-    0xae,
-    0xd8,
-    0x40,
-    0x04,
-    0xb2,
-    0xeb,
-    0xe8,
-    0xa8,
-    0x30,
-    0x6d,
-    0xac,
-    0xbc,
-    0x12,
-    0xaf,
-    0x68,
-    0x40,
-    0xa4,
-    0xe1,
-    0x5f,
-    0xf4,
-    0xf5,
-    0xe0,
-    0xc7,
-    0xcb,
-    0x81,
-    0x4f,
-    0x89,
-    0x9d,
-    0x0c,
-    0xe9,
-    0x42,
-    0x1c,
-    0xd1,
-    0x15,
-    0x8d,
-    0x09,
-    0xdc,
-    0xbb,
-    0x84,
-    0xa8,
-    0xb5,
-    0x57,
-    0x84,
-    0x71,
-    0x3e,
-    0x4c,
-    0x31,
-    0x08,
-    0xde,
-    0x7a,
-    0xba,
-    0x6f,
-    0xdf,
-    0x12,
-    0x5f,
-    0x7b,
-    0x15,
-    0xa9,
-    0x30,
-    0x84,
-    0xc1,
-    0x8c,
-    0x17,
-    0x61,
-    0xb4,
-    0x54,
-    0x18,
-    0x93,
-    0xb8,
-    0xba,
-    0xd8,
-    0xc1,
-    0x2b,
-    0xac,
-    0x5c,
-    0x65,
-    0xed,
-    0xa0,
-    0x14,
-    0xc4,
-    0x7d,
-    0x28,
-    0x18,
-    0x23,
-    0x5e,
-    0xc6,
-    0xb1,
-    0x38,
-    0xc0,
-    0x02,
-    0x1b,
-    0xdf,
-    0x5c,
-    0xbb,
-    0x89,
-    0x0e,
-    0xa0,
-    0xbb,
-    0x6a,
-    0x0b,
-    0x0c,
-    0x8e,
-    0xeb,
-    0xdc,
-    0xdc,
-    0x93,
-    0xbd,
-    0x00,
-    0xe7,
-    0x53,
-    0x18,
-    0x5c,
-    0xc7,
-    0x12,
-    0x00,
-    0x78,
-    0x3a,
-    0xa4,
-    0xc7,
-    0xeb,
-    0xc8,
-    0x82,
-    0xd3,
-    0x14,
-    0xa6,
-    0x1d,
-    0xa1,
-    0x0b,
-    0xdb,
-    0x72,
-    0x0a,
-    0xd7,
-    0xa1,
-    0xdf,
-    0xc5,
-    0xe2,
-    0x0e,
-    0x35,
-    0x2e,
-    0xaa,
-    0xf3,
-    0x0e,
-    0x45,
-    0xb8,
-    0x05,
-    0x61,
-    0xfa,
-    0xd6,
-    0x3a,
-    0x53,
-    0xa8,
-    0x7d,
-    0x76,
-    0x50,
-    0xdf,
-    0x8d,
-    0x67,
-    0x5b,
-    0x66,
-    0x40,
-    0xad,
-    0xa2,
-    0x80,
-    0x61,
-    0x3f,
-    0x56,
-    0x6f,
-    0xb9,
-    0x0a,
-    0xb9,
-    0x37,
-    0xcb,
-    0xdb,
-    0x79,
-    0xa4,
-    0xc1,
-    0x7e,
-    0x3c,
-    0x8e,
-    0xa5,
-    0x28,
-    0x7c,
-    0x5c,
-    0xd4,
-    0x12,
-    0x95,
-    0xc7,
-    0xb0,
-    0x67,
-    0x1c,
-    0xe1,
-    0x96,
-    0x60,
-    0x73,
-    0x55,
-    0x10,
-    0xad,
-    0x9a,
-    0xf0,
-    0x4b,
-    0x18,
-    0x48,
-    0x60,
-    0xcb,
-    0x65,
-    0x3b,
-    0x3c,
-    0x5d,
-    0x7c,
-    0xcc,
-    0x45,
-    0x4d,
-    0xca,
-    0xc6,
-    0xec,
-    0xda,
-    0xe4,
-    0x78,
-    0x14,
-    0xe7,
-    0x6d,
-    0x09,
-    0x18,
-    0xf3,
-    0x3b,
-    0x0c,
-    0x10,
-    0x4b,
-    0xb5,
-    0x54,
-    0x50,
-    0x7e,
-    0x7f,
-    0x0a,
-    0x32,
-    0x12,
-    0x5a,
-    0xfc,
-    0x16,
-    0x75,
-    0x45,
-    0x38,
-    0xa6,
-    0x36,
-    0xe8,
-    0xda,
-    0x5f,
-    0x75,
-    0x33,
-    0x22,
-    0x4d,
-    0x99,
-    0x43,
-    0xca,
-    0x15,
-    0x41,
-    0x85,
-    0x96,
-    0x39,
-    0x7c,
-    0x1d,
-    0x2c,
-    0x98,
-    0x3c,
-    0x89,
-    0x26,
-    0x34,
-    0x08,
-    0x81,
-    0x66,
-    0x38,
-    0xf2,
-    0x22,
-    0xa9,
-    0x3a,
-    0xc9,
-    0x4c,
-    0x5f,
-    0xbd,
-    0x8f,
-    0x49,
-    0xbb,
-    0xfa,
-    0x2d,
-    0xaf,
-    0x06,
-    0xe0,
-    0x66,
-    0x87,
-    0x38,
-    0x59,
-    0x0a,
-    0xae,
-    0xc9,
-    0xcf,
-    0x6c,
-    0x7c,
-    0xc5,
-    0xef,
-    0x15,
-    0xa4,
-    0x1f,
-    0xac,
-    0xba,
-    0x5b,
-    0x47,
-    0x87,
-    0x6c,
-    0xbd,
-    0xfe,
-    0x0e,
-    0x0f,
-    0x6c,
-    0x6a,
-    0xa3,
-    0x0d,
-    0x7a,
-    0x65,
-    0x7f,
-    0x4c,
-    0x89,
-    0x1b,
-    0xf7,
-    0x5d,
-    0x30,
-    0xd4,
-    0xfd,
-    0xf6,
-    0xa1,
-    0x0e,
-    0xe9,
-    0xa2,
-    0x89,
-    0xcf,
-    0x7a,
-    0xb7,
-    0x38,
-    0x39,
-    0x17,
-    0x88,
-    0x02,
-    0x5f,
-    0x5b,
-    0xdd,
-    0xe5,
-    0x57,
-    0xd1,
-    0xa0,
-    0x6c,
-    0x91,
-    0xfc,
-    0xd9,
-    0xd2,
-    0x66,
-    0x9b,
-    0xdd,
-    0x6b,
-    0xf4,
-    0x2a,
-    0xc1,
-    0x40,
-    0x2a,
-    0xac,
-    0x15,
-    0xf9,
-    0x1f,
-    0xa8,
-    0xcf,
-    0x01,
-    0xa8,
-    0x72,
-    0x86,
-    0xe4,
-    0x29,
-    0xab,
-    0xe1,
-    0xfc,
-    0xab,
-    0x0b,
-    0x4e,
-    0x4c,
-    0x2f,
-    0x5e,
-    0xf7,
-    0xac,
-    0x42,
-    0xcd,
-    0xf2,
-    0x27,
-    0xd2,
-    0x5f,
-    0xb7,
-    0xa1,
-    0x40,
-    0xc0,
-    0xd8,
-    0xbc,
-    0xb6,
-    0x40,
-    0xec,
-    0xfd,
-    0xbb,
-    0x1e,
-    0xcc,
-    0x2b,
-    0x05,
-    0x07,
-    0x03,
-    0xf8,
-    0x8e,
-    0xda,
-    0x7f,
-    0xe4,
-    0xea,
-    0xae,
-    0x8d,
-    0x5d,
-    0xd7,
-    0x16,
-    0x04,
-    0x2b,
-    0x16,
-    0xa4,
-    0xbf,
-    0x0b,
-    0x79,
-    0xab,
-    0x51,
-    0x9a,
-    0x3e,
-    0x49,
-    0xf5,
-    0x75,
-    0x9b,
-    0xa5,
-    0xc4,
-    0x9f,
-    0x9a,
-    0x76,
-    0x2b,
-    0x23,
-    0x27,
-    0xc5,
-    0x9b,
-    0xfa,
-    0x67,
-    0xf3,
-    0x82,
-    0x2e,
-    0x4c,
-    0xfd,
-    0x7b,
-    0x40,
-    0x67,
-    0xff,
-    0xc1,
-    0xc8,
-    0xfd,
-    0xf7,
-    0xea,
-    0x5b,
-    0x5c,
-    0xcc,
-    0xd2,
-    0xb1,
-    0x6f,
-    0x8f,
-    0xd5,
-    0x07,
-    0x91,
-    0x00,
-    0x41,
-    0xc3,
-    0x9f,
-    0x54,
-    0x0a,
-    0x57,
-    0x51,
-    0x35,
-    0xc0,
-    0x67,
-    0xca,
-    0x0b,
-    0xbf,
-    0x2e,
-    0x6d,
-    0x7a,
-    0xa6,
-    0x1e,
-    0xf3,
-    0x2b,
-    0x0a,
-    0xc6,
-    0xba,
-    0xd0,
-    0x6b,
-    0xf9,
-    0x60,
-    0x62,
-    0x66,
-    0x2d,
-    0x91,
-    0xad,
-    0x2d,
-    0x21,
-    0x1d,
-    0x0f,
-    0x35,
-    0xc3,
-    0x4e,
-    0x7d,
-    0x2e,
-    0x50,
-    0x78,
-    0xc6,
-    0x38,
-    0xbd,
-    0xd1,
-    0x1c,
-    0x54,
-    0x56,
-    0x83,
-    0xd0,
-    0x18,
-    0xa5,
-    0x00,
-    0x5d,
-    0xa8,
-    0x95,
-    0x96,
-    0xa8,
-    0xe1,
-    0xd7,
-    0x43,
-    0x86,
-    0xd7,
-    0x85,
-    0xca,
-    0x7f,
-    0x82,
-    0x05,
-    0x06,
-    0xd2,
-    0xb4,
-    0x31,
-    0x7f,
-    0xb8,
-    0x4e,
-    0xb4,
-    0x3b,
-    0xed,
-    0xb4,
-    0xb7,
-    0xd7,
-    0x6d,
-    0x7e,
-    0xbe,
-    0xd6,
-    0x7b,
-    0x71,
-    0xcc,
-    0x38,
-    0xe8,
-    0xad,
-    0xce,
-    0x4e,
-    0x92,
-    0x27,
-    0x36,
-    0xce,
-    0x2b,
-    0x5a,
-    0xe7,
-    0x23,
-    0x3c,
-    0x3a,
-    0x51,
-    0x06,
-    0x69,
-    0x6a,
-    0xdd,
-    0x52,
-    0xf6,
-    0xae,
-    0x8b,
-    0x14,
-    0x8a,
-    0xa3,
-    0xd9,
-    0xe2,
-    0x33,
-    0xae,
-    0xe8,
-    0x6f,
-    0xab,
-    0x32,
-    0xda,
-    0x5c,
-    0xda,
-    0x06,
-    0x7e,
-    0x50,
-    0x9b,
-    0x26,
-    0x2f,
-    0x4a,
-    0xc3,
-    0xa8,
-    0xf9,
-    0x36,
-    0x60,
-    0xf2,
-    0xfe,
-    0xbf,
-    0x3e,
-    0x2b,
-    0x18,
-    0x65,
-    0xb0,
-    0xef,
-    0xc0,
-    0xcf,
-    0x8c,
-    0x47,
-    0x2f,
-    0x62,
-    0x78,
-    0xd8,
-    0xc2,
-    0x12,
-    0x64,
-    0x5a,
-    0xa3,
-    0x78,
-    0x58,
-    0x4c,
-    0xa6,
-    0x25,
-    0x70,
-    0xe6,
-    0x71,
-    0x37,
-    0x25,
-    0x50,
-    0xe0,
-    0x2a,
-    0xcd,
-    0x11,
-    0xa8,
-    0xf0,
-    0x65,
-    0xca,
-    0x3a,
-    0x43,
-    0x8f,
-    0x24,
-    0xea,
-    0x3a,
-    0xd7,
-    0x07,
-    0x50,
-    0x1a,
-    0x3a,
-    0x0d,
-    0xee,
-    0x6f,
-    0xe9,
-    0x36,
-    0x14,
-    0x5c,
-    0x4a,
-    0xdd,
-    0x01,
-    0x30,
-    0x40,
-    0xea,
-    0x4b,
-    0x39,
-    0xac,
-    0x4a,
-    0x81,
-    0xdd,
-    0x34,
-    0x9c,
-    0x0e,
-    0xe6,
-    0x43,
-    0x2d,
-    0x60,
-    0x1e,
-    0x50,
-    0x27,
-    0x4a,
-    0x1c,
-    0x64,
-    0x05,
-    0xa7,
-    0x5d,
-    0xd6,
-    0x4a,
-    0x41,
-    0x97,
-    0x59,
-    0x73,
-    0xf1,
-    0x49,
-    0x3a,
-    0x2a,
-    0x07,
-    0x97,
-    0xe2,
-    0xbc,
-    0xeb,
-    0x55,
-    0xa2,
-    0xcd,
-    0x05,
-    0x62,
-    0xb0,
-    0x4b,
-    0xdb,
-    0x37,
-    0x6c,
-    0xa0,
-    0x79,
-    0xbf,
-    0xe8,
-    0x2c,
-    0x16,
-    0x6a,
-    0xa8,
-    0xf2,
-    0xf4,
-    0x7d,
-    0xa6,
-    0x91,
-    0x88,
-    0xac,
-    0x99,
-    0x77,
-    0xdb,
-    0xea,
-    0x77,
-    0x51,
-    0x30,
-    0x80,
-    0x39,
-    0xc5,
-    0xe7,
-    0x5c,
-    0xde,
-    0x64,
-    0xa1,
-    0xac,
-    0xb2,
-    0xda,
-    0xa5,
-    0xac,
-    0xd0,
-    0x68,
-    0x83,
-    0xbc,
-    0xe6,
-    0x95,
-    0xf7,
-    0xb6,
-    0x38,
-    0x20,
-    0x0f,
-    0x7e,
-    0xe8,
-    0x38,
-    0x90,
-    0xdb,
-    0x74,
-    0xef,
-    0x97,
-    0x85,
-    0x80,
-    0xed,
-    0x7c,
-    0x7f,
-    0xd6,
-    0x61,
-    0xfb,
-    0xa6,
-    0xab,
-    0x3e,
-    0x96,
-    0x8b,
-    0x24,
-    0xa3,
-    0x35,
-    0x7e,
-    0x18,
-    0x9a,
-    0x10,
-    0xeb,
-    0x18,
-    0x06,
-    0xce,
-    0xea,
-    0xac,
-    0xd7,
-    0xee,
-    0x11,
-    0xe0,
-    0x80,
-    0x67,
-    0x8c,
-    0xff,
-    0xab,
-    0x8b,
-    0x70,
-    0x9f,
-    0x2b,
-    0x31,
-    0x4d,
-    0xdd,
-    0x32,
-    0x13,
-    0x03,
-    0xea,
-    0xc4,
-    0x75,
-    0xd6,
-    0xc7,
-    0x6b,
-    0x08,
-    0xc4,
-    0x4c,
-    0x2d,
-    0x0d,
-    0x15,
-    0x6f,
-    0xbb,
-    0xbd,
-    0x35,
-    0xc3,
-    0xeb,
-    0xe9,
-    0xbf,
-    0x3f,
-    0x68,
-    0xde,
-    0xda,
-    0x41,
-    0xa8,
-    0x8b,
-    0xc8,
-    0xd2,
-    0x1f,
-    0xe6,
-    0xbc,
-    0x2c,
-    0xb3,
-    0x8b,
-    0xec,
-    0x7a,
-    0x6f,
-    0xa6,
-    0xe8,
-    0xde,
-    0x7b,
-    0x14,
-    0x2a,
-    0xb8,
-    0x4c,
-    0xc5,
-    0xee,
-    0x26,
-    0x18,
-    0x65,
-    0x44,
-    0xc7,
-    0x8d,
-    0x3b,
-    0x63,
-    0xc5,
-    0xc2,
-    0x51,
-    0x40,
-    0x12,
-    0x6e,
-    0xd5,
-    0x5f,
-    0xf1,
-    0x58,
-    0xbf,
-    0xe9,
-    0xb9,
-    0x0e,
-    0xb4,
-    0x00,
-    0xd5,
-    0xda,
-    0x2a,
-    0x4f,
-    0x10,
-    0xf2,
-    0xce,
-    0xe5,
-    0x10,
-    0xef,
-    0x22,
-    0x43,
-    0x1f,
-    0x80,
-    0x6b,
-    0xb3,
-    0x32,
-    0x60,
-    0xca,
-    0xdc,
-    0x23,
-    0x85,
-    0xa9,
-    0x94,
-    0x42,
-    0x9b,
-    0x58,
-    0xf5,
-    0x0c,
-    0xb0,
-    0xf8,
-    0xb3,
-    0x3a,
-    0x31,
-    0x99,
-    0xac,
-    0xfe,
-    0x15,
-    0x9f,
-    0xc1,
-    0x89,
-    0x58,
-    0x6a,
-    0xe5,
-    0xd0,
-    0xab,
-    0x36,
-    0x73,
-    0x90,
-    0x6a,
-    0x3f,
-    0xc5,
-    0x8f,
-    0xce,
-    0x29,
-    0x02,
-    0x26,
-    0x64,
-    0xa0,
-    0x37,
-    0xfc,
-    0xbd,
-    0x3c,
-    0xaa,
-    0x14,
-    0x67,
-    0xa7,
-    0x6b,
-    0x0a,
-    0x1d,
-    0x01,
-    0x2b,
-    0x99,
-    0x3b,
-    0x83,
-    0x51,
-    0x61,
-    0x75,
-    0x63,
-    0x4b,
-    0xe7,
-    0xc7,
-    0xf8,
-    0x22,
-    0xde,
-    0xaf,
-    0x1f,
-    0x52,
-    0xa5,
-    0x9b,
-    0xdd,
-    0xd8,
-    0x10,
-    0x9d,
-    0x46,
-    0x8c,
-    0x6b,
-    0x66,
-    0x9d,
-    0xb1,
-    0xbc,
-    0x72,
-    0xbc,
-    0xcb,
-    0x49,
-    0x80,
-    0xb6,
-    0xb0,
-    0x5a,
-    0x45,
-    0xbc,
-    0xe2,
-    0x40,
-    0x61,
-    0x3d,
-    0x1c,
-    0x96,
-    0x92,
-    0x51,
-    0x2b,
-    0xc7,
-    0x28,
-    0x58,
-    0xff,
-    0xd1,
-    0xb9,
-    0xde,
-    0x02,
-    0x48,
-    0x15,
-    0xc3,
-    0xa9,
-    0x9d,
-    0x7c,
-    0x98,
-    0x48,
-    0xa0,
-    0x0f,
-    0x4b,
-    0x2a,
-    0x44,
-    0x85,
-    0x07,
-    0xe1,
-    0xa2,
-    0x1f,
-    0x56,
-    0xdb,
-    0x41,
-    0xde,
-    0x89,
-    0x36,
-    0x95,
-    0xf3,
-    0x59,
-    0xd5,
-    0xc5,
-    0x77,
-    0xce,
-    0xb4,
-    0xb2,
-    0x5c,
-    0x60,
-    0x78,
-    0x34,
-    0xa4,
-    0x5d,
-    0x4b,
-    0xa6,
-    0xd0,
-    0x8a,
-    0xe6,
-    0xa6,
-    0x9c,
-    0x0d,
-    0xef,
-    0x16,
-    0xe9,
-    0x8a,
-    0x86,
-    0x66,
-    0xfb,
-    0x8d,
-    0x1b,
-    0x16,
-    0xe4,
-    0x28,
-    0x82,
-    0x76,
-    0x40,
-    0xdd,
-    0x49,
-    0xb1,
-    0x23,
-    0xbd,
-    0x49,
-    0x09,
-    0x50,
-    0xd2,
-    0x7b,
-    0x64,
-    0xac,
-    0xbb,
-    0x0d,
-    0x08,
-    0xf2,
-    0x96,
-    0xb5,
-    0xa3,
-    0xa7,
-    0x23,
-    0x46,
-    0x8e,
-    0x51,
-    0x25,
-    0x81,
-    0x52,
-    0xe4,
-    0x0c,
-    0x2d,
-    0x6c,
-    0x7d,
-    0xd2,
-    0x6a,
-    0x4d,
-    0x52,
-    0x23,
-    0x42,
-    0xa5,
-    0xe9,
-    0xc0,
-    0x81,
-    0xe1,
-    0x89,
-    0x25,
-    0xc6,
-    0xf2,
-    0xef,
-    0x6a,
-    0xdb,
-    0x51,
-    0x41,
-    0x67,
-    0x42,
-    0x40,
-    0x48,
-    0x1b,
-    0x10,
-    0x52,
-    0xd9,
-    0x4f,
-    0xff,
-    0x2d,
-    0x94,
-    0x76,
-    0xbe,
-    0x8f,
-    0xd2,
-    0xd8,
-    0x8b,
-    0x8f,
-    0xd8,
-    0xef,
-    0x04,
-    0x26,
-    0x51,
-    0x11,
-    0x3a,
-    0xed,
-    0xfb,
-    0x50,
-    0x08,
-    0x28,
-    0xa0,
-    0x9f,
-    0xa3,
-    0x04,
-    0x48,
-    0x36,
-    0x71,
-    0x1d,
-    0xad,
-    0x37,
-    0x1f,
-    0x43,
-    0xef,
-    0x91,
-    0xee,
-    0x7e,
-    0x89,
-    0x24,
-    0x4d,
-    0x4f,
-    0x84,
-    0x27,
-    0xad,
-    0x39,
-    0xea,
-    0xc7,
-    0x91,
-    0x80,
-    0x7e,
-    0x11,
-    0xe4,
-    0x31,
-    0xaa,
-    0x12,
-    0x90,
-    0x62,
-    0xb9,
-    0x3d,
-    0x4c,
-    0xbb,
-    0x46,
-    0x0d,
-    0xb5,
-    0x36,
-    0xf4,
-    0xeb,
-    0xa1,
-    0x22,
-    0x60,
-    0x51,
-    0xb0,
-    0x6e,
-    0x54,
-    0x30,
-    0x24,
-    0x24,
-    0x3e,
-    0x8f,
-    0xf2,
-    0x34,
-    0xe0,
-    0x75,
-    0x18,
-    0x73,
-    0x48,
-    0x0a,
-    0x32,
-    0xe3,
-    0x03,
-    0xf9,
-    0x48,
-    0x35,
-    0x8e,
-    0x18,
-    0xeb,
-    0x8c,
-    0x0d,
-    0x4b,
-    0x80,
-    0x84,
-    0x3f,
-    0xa6,
-    0xdb,
-    0x73,
-    0xb2,
-    0xd1,
-    0x10,
-    0xef,
-    0x33,
-    0xb1,
-    0x85,
-    0x90,
-    0x89,
-    0x44,
-    0x4c,
-    0xf6,
-    0x63,
-    0xcd,
-    0xb0,
-    0x0e,
-    0x8e,
-    0x32,
-    0x0e,
-    0x92,
-    0x6b,
-    0xa2,
-    0xe7,
-    0xcf,
-    0xa1,
-    0x7a,
-    0x32,
-    0xab,
-    0x0f,
-    0x6a,
-    0xf7,
-    0xe6,
-    0x05,
-    0xd4,
-    0x19,
-    0xa0,
-    0xb3,
-    0x74,
-    0x74,
-    0x1c,
-    0xe1,
-    0x46,
-    0x27,
-    0xc3,
-    0xe1,
-    0xa4,
-    0x33,
-    0x6c,
-    0xc2,
-    0xaf,
-    0x46,
-    0xda,
-    0xc7,
-    0xf1,
-    0xd1,
-    0x86,
-    0x17,
-    0x41,
-    0x60,
-    0x9f,
-    0xb6,
-    0xe6,
-    0x2b,
-    0x50,
-    0xb4,
-    0xff,
-    0xe8,
-    0x41,
-    0xa5,
-    0x22,
-    0xe4,
-    0x60,
-    0x51,
-    0x43,
-    0x52,
-    0xe1,
-    0xac,
-    0xd7,
-    0xe3,
-    0x83,
-    0x08,
-    0x3a,
-    0x97,
-    0x16,
-    0x89,
-    0x4e,
-    0xd2,
-    0x3a,
-    0xd9,
-    0x66,
-    0xb2,
-    0x69,
-    0x1e,
-    0x62,
-    0xa0,
-    0x38,
-    0x29,
-    0x1b,
-    0x25,
-    0xd9,
-    0xf0,
-    0x01,
-    0xff,
-    0xe5,
-    0x3f,
-    0x02,
-    0x75,
-    0x58,
-    0xaa,
-    0xae,
-    0xe7,
-    0xde,
-    0xc6,
-    0x99,
-    0xa9,
-    0x4d,
-    0x99,
-    0x01,
-    0x12,
-    0x72,
-    0x4e,
-    0xb1,
-    0xcf,
-    0x10,
-    0x2d,
-    0x25,
-    0x7d,
-    0x26,
-    0xcb,
-    0xef,
-    0x78,
-    0x71,
-    0x7e,
-    0x5a,
-    0xed,
-    0x32,
-    0x14,
-    0x4c,
-    0x37,
-    0x31,
-    0xc5,
-    0x71,
-    0x68,
-    0x02,
-    0x65,
-    0x95,
-    0x25,
-    0x87,
-    0xdf,
-    0x52,
-    0xb8,
-    0xb6,
-    0xde,
-    0xec,
-    0x60,
-    0x9c,
-    0xcd,
-    0x79,
-    0xeb,
-    0xa2,
-    0x02,
-    0x45,
-    0x87,
-    0x10,
-    0x36,
-    0x74,
-    0xd6,
-    0xcf,
-    0x39,
-    0xe9,
-    0x40,
-    0x73,
-    0xe3,
-    0x67,
-    0x8d,
-    0x79,
-    0x4e,
-    0xf6,
-    0xb3,
-    0xcc,
-    0x42,
-    0x89,
-    0xec,
-    0x8e,
-    0xf1,
-    0xdd,
-    0x0c,
-    0x16,
-    0xe5,
-    0xa4,
-    0x12,
-    0x35,
-    0x36,
-    0xe3,
-    0xfd,
-    0xbe,
-    0x00,
-    0x99,
-    0xe1,
-    0x45,
-    0x14,
-    0xa1,
-    0x39,
-    0x26,
-    0xee,
-    0xd9,
-    0x7f,
-    0xca,
-    0xe8,
-    0x84,
-    0xfa,
-    0x25,
-    0xad,
-    0xed,
-    0xd8,
-    0x83,
-    0xef,
-    0x4e,
-    0x7c,
-    0x85,
-    0x5d,
-    0xef,
-    0x19,
-    0x66,
-    0xcf,
-    0x92,
-    0x80,
-    0x83,
-    0xc4,
-    0x0f,
-    0x36,
-    0x1b,
-    0x0f,
-    0x3c,
-    0xca,
-    0x53,
-    0xcd,
-    0x0f,
-    0x65,
-    0x7d,
-    0x9a,
-    0x07,
-    0xa3,
-    0x99,
-    0x05,
-    0xc7,
-    0xa1,
-    0x1c,
-    0x41,
-    0x05,
-    0x58,
-    0xf1,
-    0x1d,
-    0xa2,
-    0x29,
-    0xbe,
-    0x35,
-    0x1a,
-    0xb8,
-    0x68,
-    0x6a,
-    0x1f,
-    0xfe,
-    0xd9,
-    0x91,
-    0x81,
-    0x9a,
-    0x01,
-    0x68,
-    0x51,
-    0x68,
-    0x1a,
-    0xce,
-    0x46,
-    0x55,
-    0x31,
-    0x33,
-    0x5f,
-    0x72,
-    0xe2,
-    0x4d,
-    0xca,
-    0x47,
-    0x63,
-    0x0c,
-    0x05,
-    0x69,
-    0xc4,
-    0xd1,
-    0x43,
-    0x4f,
-    0x74,
-    0xdb,
-    0x11,
-    0x61,
-    0x08,
-    0x01,
-    0x39,
-    0x52,
-    0x38,
-    0xa7,
-    0xe7,
-    0xb0,
-    0x2a,
-    0xeb,
-    0x0a,
-    0xb9,
-    0xf4,
-    0x1f,
-    0xfd,
-    0x71,
-    0x5c,
-    0x7c,
-    0x67,
-    0xf1,
-    0xe1,
-    0x14,
-    0x60,
-    0x02,
-    0x00,
-    0x09,
-    0xd5,
-    0xea,
-    0xb0,
-    0xfd,
-    0x2d,
-    0x86,
-    0x2f,
-    0xc9,
-    0x2c,
-    0x99,
-    0x00,
-    0x72,
-    0x18,
-    0x64,
-    0x35,
-    0x59,
-    0x1b,
-    0x77,
-    0xea,
-    0xb1,
-    0xe9,
-    0xc6,
-    0x12,
-    0x36,
-    0xa2,
-    0xff,
-    0x76,
-    0x1c,
-    0xfa,
-    0x1b,
-    0xfa,
-    0x46,
-    0x97,
-    0x34,
-    0x22,
-    0xb9,
-    0xbb,
-    0x96,
-    0xd6,
-    0x50,
-    0x22,
-    0x18,
-    0x62,
-    0xb1,
-    0x2e,
-    0xad,
-    0xc1,
-    0x7f,
-    0x41,
-    0x36,
-    0x1b,
-    0xd2,
-    0x6a,
-    0x9a,
-    0x8c,
-    0xe4,
-    0x45,
-    0x19,
-    0x27,
-    0x0d,
-    0x1c,
-    0xdd,
-    0x3b,
-    0xf1,
-    0x52,
-    0xd2,
-    0xd4,
-    0xf8,
-    0x02,
-    0xb8,
-    0x85,
-    0xfe,
-    0xe3,
-    0x77,
-    0x65,
-    0x4c,
-    0x6f,
-    0xb2,
-    0x58,
-    0xc7,
-    0x44,
-    0x9e,
-    0x90,
-    0x68,
-    0xca,
-    0x15,
-    0x53,
-    0xec,
-    0x16,
-    0xe6,
-    0xfe,
-    0xcd,
-    0x0e,
-    0x70,
-    0x4a,
-    0x70,
-    0xce,
-    0x6f,
-    0xce,
-    0xa0,
-    0x4b,
-    0x15,
-    0xc5,
-    0x3b,
-    0x36,
-    0x5d,
-    0x12,
-    0x2b,
-    0x24,
-    0x9c,
-    0x81,
-    0x98,
-    0xeb,
-    0x58,
-    0x50,
-    0x5c,
-    0x4f,
-    0x5e,
-    0xee,
-    0xb8,
-    0xde,
-    0x0f,
-    0x02,
-    0x45,
-    0x18,
-    0xfb,
-    0xaf,
-    0x2d,
-    0xd3,
-    0xb1,
-    0x16,
-    0x9a,
-    0xde,
-    0xd4,
-    0x1d,
-    0x6f,
-    0xe5,
-    0x72,
-    0x6f,
-    0x37,
-    0x94,
-    0x92,
-    0xc5,
-    0x5a,
-    0xff,
-    0x0c,
-    0x63,
-    0x97,
-    0x42,
-    0x9e,
-    0xe5,
-    0xae,
-    0x64,
-    0x3b,
-    0x3b,
-    0x5d,
-    0x82,
-    0xa6,
-    0xf3,
-    0x8e,
-    0x29,
-    0x40,
-    0xb6,
-    0xcf,
-    0x03,
-    0x1f,
-    0x16,
-    0x02,
-    0xb6,
-    0x5f,
-    0x87,
-    0x56,
-    0x09,
-    0xbd,
-    0xaa,
-    0x76,
-    0x49,
-    0x61,
-    0xd2,
-    0x00,
-    0xeb,
-    0xfc,
-    0xc1,
-    0x38,
-    0x72,
-    0x13,
-    0xb2,
-    0xfe,
-    0x93,
-    0x9b,
-    0x9d,
-    0xfd,
-    0x97,
-    0xc5,
-    0xb6,
-    0x26,
-    0x02,
-    0x1b,
-    0x36,
-    0x5d,
-    0x72,
-    0xcc,
-    0x5f,
-    0x71,
-    0xc9,
-    0x44,
-    0xba,
-    0x52,
-    0x8e,
-    0x00,
-    0xa4,
-    0x7e,
-    0x91,
-    0xa1,
-    0x08,
-    0xbd,
-    0xce,
-    0x3f,
-    0x6e,
-    0x0e,
-    0x94,
-    0xff,
-    0x35,
-    0xe1,
-    0xe7,
-    0xe8,
-    0x1c,
-    0x86,
-    0x22,
-    0xf2,
-    0x08,
-    0xe6,
-    0xe1,
-    0x60,
-    0x01,
-    0x71,
-    0x1d,
-    0x50,
-    0x7d,
-    0x57,
-    0x99,
-    0x91,
-    0xe1,
-    0xfb,
-    0x7d,
-    0xb4,
-    0x45,
-    0xa5,
-    0x41,
-    0x66,
-    0x77,
-    0x76,
-    0xcd,
-    0xfd,
-    0x43,
-    0xa2,
-    0xdf,
-    0x50,
-    0xf2,
-    0xd9,
-    0xac,
-    0xcc,
-    0x11,
-    0x06,
-    0xca,
-    0xc4,
-    0x74,
-    0x3c,
-    0x4d,
-    0x09,
-    0x7a,
-    0xed,
-    0x31,
-    0xbb,
-    0x91,
-    0x5e,
-    0xf8,
-    0x5e,
-    0xfd,
-    0x57,
-    0x93,
-    0x30,
-    0xd6,
-    0x1f,
-    0x86,
-    0xba,
-    0x50,
-    0xa8,
-    0x48,
-    0xa6,
-    0x40,
-    0x06,
-    0xe8,
-    0xd0,
-    0xdb,
-    0x25,
-    0xf6,
-    0xa0,
-    0xc0,
-    0xbc,
-    0xa1,
-    0x96,
-    0x39,
-    0x7d,
-    0x1d,
-    0x26,
-    0xbd,
-    0x8f,
-    0x48,
-    0xc7,
-    0xba,
-    0x3d,
-    0x8c,
-    0x47,
-    0x92,
-    0xf0,
-    0x07,
-    0x61,
-    0xe3,
-    0x5a,
-    0xe9,
-    0x91,
-    0x0c,
-    0xf5,
-    0x1e,
-    0x27,
-    0xed,
-    0xac,
-    0x2e,
-    0x9b,
-    0xee,
-    0xd7,
-    0x61,
-    0x20,
-    0x42,
-    0x6d,
-    0x26,
-    0x7b,
-    0x6d,
-    0x75,
-    0xb5,
-    0x16,
-    0x03,
-    0xbe,
-    0xf4,
-    0x50,
-    0xb3,
-    0xd0,
-    0x97,
-    0x18,
-    0x85,
-    0x22,
-    0x8c,
-    0xba,
-    0x60,
-    0x8e,
-    0x96,
-    0xf8,
-    0xcf,
-    0x01,
-    0x38,
-    0x5d,
-    0x04,
-    0x77,
-    0xd4,
-    0xce,
-    0x1e,
-    0x27,
-    0x14,
-    0x62,
-    0xa7,
-    0xfa,
-    0x89,
-    0x74,
-    0x61,
-    0x42,
-    0x92,
-    0xf6,
-    0x42,
-    0xa9,
-    0x80,
-    0x07,
-    0xbd,
-    0x67,
-    0xf7,
-    0xc8,
-    0x43,
-    0xb9,
-    0x97,
-    0x6c,
-    0x0a,
-    0x8e,
-    0xdc,
-    0x8f,
-    0x0d,
-    0x83,
-    0x43,
-    0xc9,
-    0x54,
-    0x11,
-    0xaf,
-    0x82,
-    0x75,
-    0x05,
-    0x0a,
-    0x08,
-    0x5b,
-    0x31,
-    0x2f,
-    0xde,
-    0x46,
-    0x62,
-    0x08,
-    0x58,
-    0x13,
-    0x92,
-    0xf3,
-    0x64,
-    0xbe,
-    0x5e,
-    0x6b,
-    0xab,
-    0x25,
-    0xba,
-    0xe4,
-    0xd9,
-    0x0e,
-    0xe3,
-    0xf6,
-    0x38,
-    0x6c,
-    0x95,
-    0xbe,
-    0x84,
-    0xde,
-    0x7f,
-    0x82,
-    0xfb,
-    0x79,
-    0xf4,
-    0x93,
-    0xb3,
-    0xc7,
-    0xe3,
-    0x78,
-    0x30,
-    0x0f,
-    0x09,
-    0x48,
-    0x36,
-    0xd7,
-    0x65,
-    0x58,
-    0xdc,
-    0xa8,
-    0xec,
-    0x16,
-    0xe2,
-    0x11,
-    0x7f,
-    0x35,
-    0x44,
-    0xee,
-    0x1a,
-    0x0b,
-    0x0f,
-    0xeb,
-    0x4e,
-    0x37,
-    0x74,
-    0x43,
-    0xf1,
-    0x86,
-    0x1b,
-    0xce,
-    0x14,
-    0x18,
-    0xba,
-    0x3a,
-    0x35,
-    0xbe,
-    0xe5,
-    0x98,
-    0xb6,
-    0xa7,
-    0x28,
-    0x1b,
-    0x8e,
-    0x3c,
-    0x53,
-    0x1d,
-    0x3f,
-    0x48,
-    0x15,
-    0x63,
-    0x08,
-    0x5c,
-    0xcc,
-    0xa2,
-    0x5b,
-    0x72,
-    0x9c,
-    0x42,
-    0x91,
-    0xd0,
-    0xbe,
-    0x61,
-    0xdd,
-    0x2f,
-    0x1b,
-    0x1b,
-    0x7e,
-    0x1d,
-    0x1a,
-    0x09,
-    0x39,
-    0xa0,
-    0xb6,
-    0x07,
-    0x07,
-    0x1c,
-    0xd3,
-    0x3b,
-    0x0b,
-    0x76,
-    0xd2,
-    0x53,
-    0xc6,
-    0x7a,
-    0x63,
-    0x0d,
-    0x8e,
-    0x7a,
-    0x9a,
-    0xfd,
-    0x3c,
-    0x38,
-    0x46,
-    0x8b,
-    0x26,
-    0x07,
-    0x7e,
-    0x3b,
-    0x4d,
-    0x2c,
-    0x7c,
-    0x31,
-    0xd7,
-    0x8a,
-    0xaf,
-    0xf4,
-    0xbf,
-    0x7f,
-    0x0b,
-    0x72,
-    0xcb,
-    0x09,
-    0xa4,
-    0x44,
-    0xbe,
-    0x2d,
-    0x7b,
-    0x34,
-    0xcf,
-    0x99,
-    0x97,
-    0xfc,
-    0x5b,
-    0x88,
-    0x58,
-    0x51,
-    0xd7,
-    0xe6,
-    0x09,
-    0x20,
-    0x08,
-    0xb4,
-    0xb4,
-    0x18,
-    0x76,
-    0xaf,
-    0x3a,
-    0x68,
-    0x1e,
-    0x2c,
-    0xa2,
-    0xca,
-    0x67,
-    0x47,
-    0xb2,
-    0xc0,
-    0x57,
-    0x3c,
-    0xbc,
-    0x1d,
-    0x07,
-    0x15,
-    0xbb,
-    0xc8,
-    0x54,
-    0x86,
-    0x9f,
-    0xbd,
-    0xd8,
-    0x15,
-    0xe4,
-    0x54,
-    0x19,
-    0x7d,
-    0x69,
-    0xc6,
-    0xff,
-    0x55,
-    0x80,
-    0xed,
-    0x8c,
-    0xed,
-    0x41,
-    0x4b,
-    0xc7,
-    0x79,
-    0x25,
-    0x4e,
-    0xf9,
-    0x71,
-    0xd0,
-    0xd2,
-    0x1c,
-    0x37,
-    0x2d,
-    0xe8,
-    0x91,
-    0xfb,
-    0xc0,
-    0xd6,
-    0x11,
-    0xdc,
-    0x38,
-    0x5f,
-    0xe6,
-    0x4f,
-    0x44,
-    0x44,
-    0x5b,
-    0xc5,
-    0xa8,
-    0x0a,
-    0x71,
-    0x88,
-    0x90,
-    0xfe,
-    0xd3,
-    0xe6,
-    0x24,
-    0x77,
-    0x0c,
-    0x92,
-    0x5c,
-    0x5b,
-    0xf8,
-    0x47,
-    0x16,
-    0xe4,
-    0x78,
-    0xae,
-    0x66,
-    0xa4,
-    0x6a,
-    0x82,
-    0x2d,
-    0xc7,
-    0xd9,
-    0xf2,
-    0xed,
-    0x99,
-    0x70,
-    0x47,
-    0xdb,
-    0x48,
-    0x35,
-    0xc6,
-    0x36,
-    0xea,
-    0x74,
-    0xd8,
-    0xd8,
-    0xc1,
-    0xf8,
-    0x68,
-    0x0b,
-    0xbe,
-    0x81,
-    0x8d,
-    0x9d,
-    0x45,
-    0x73,
-    0x69,
-    0x37,
-    0x30,
-    0xcc,
-    0x51,
-    0xea,
-    0x16,
-    0x58,
-    0x2d,
-    0x0b,
-    0xcd,
-    0x28,
-    0x22,
-    0x41,
-    0x2d,
-    0x40,
-    0x6f,
-    0xdc,
-    0x17,
-    0x90,
-    0x95,
-    0x68,
-    0xb6,
-    0x26,
-    0xbb,
-    0x82,
-    0x05,
-    0xa1,
-    0x50,
-    0xeb,
-    0x92,
-    0xe9,
-    0xf2,
-    0xdb,
-    0x81,
-    0x1d,
-    0x8f,
-    0x98,
-    0xd3,
-    0xcd,
-    0xca,
-    0x46,
-    0xe9,
-    0x6a,
-    0xa0,
-    0x01,
-    0x43,
-    0xfa,
-    0x4b,
-    0x29,
-    0x8e,
-    0x10,
-    0x66,
-    0xfd,
-    0xde,
-    0xfc,
-    0x53,
-    0x6c,
-    0x38,
-    0x3f,
-    0xda,
-    0x27,
-    0x53,
-    0x42,
-    0x12,
-    0xfb,
-    0x9f,
-    0x47,
-    0x85,
-    0x5e,
-    0x87,
-    0x9f,
-    0x8f,
-    0x48,
-    0xf3,
-    0x1d,
-    0x07,
-    0x44,
-    0x12,
-    0xcc,
-    0x21,
-    0xc6,
-    0x56,
-    0xdd,
-    0x93,
-    0xbf,
-    0xc0,
-    0xe3,
-    0xf7,
-    0x6f,
-    0x5d,
-    0x43,
-    0x71,
-    0x7a,
-    0x11,
-    0xe5,
-    0x91,
-    0x3f,
-    0x93,
-    0x30,
-    0x7b,
-    0x65,
-    0xb9,
-    0x36,
-    0x45,
-    0xb6,
-    0xf6,
-    0x2b,
-    0xa0,
-    0x31,
-    0x21,
-    0x1c,
-    0xbb,
-    0x5a,
-    0x77,
-    0xdd,
-    0x64,
-    0xd5,
-    0xe4,
-    0x44,
-    0x71,
-    0x33,
-    0x7e,
-    0x94,
-    0x5e,
-    0x0c,
-    0x52,
-    0x3c,
-    0x37,
-    0x4e,
-    0x64,
-    0xc2,
-    0xb8,
-    0xd4,
-    0xf1,
-    0xfa,
-    0xb4,
-    0x3b,
-    0xf7,
-    0x7b,
-    0xb3,
-    0xf1,
-    0xf8,
-    0x53,
-    0xdf,
-    0x8e,
-    0xfa,
-    0xfa,
-    0x21,
-    0x68,
-    0xd2,
-    0x85,
-    0x87,
-    0x61,
-    0xa2,
-    0x1c,
-    0xe9,
-    0x04,
-    0xa1,
-    0xae,
-    0xcc,
-    0xd1,
-    0x1a,
-    0xe3,
-    0x86,
-    0xd4,
-    0xb8,
-    0x53,
-    0xa3,
-    0x7d,
-    0x00,
-    0xf5,
-    0x88,
-    0xab,
-    0x1f,
-    0xda,
-    0x56,
-    0x0a,
-    0xe6,
-    0x1b,
-    0x11,
-    0x9f,
-    0x13,
-    0x10,
-    0x02,
-    0xa1,
-    0xd2,
-    0xc2,
-    0x59,
-    0x8b,
-    0x83,
-    0xa3,
-    0x17,
-    0x6f,
-    0xbe,
-    0x7d,
-    0x2b,
-    0x8d,
-    0x94,
-    0xa9,
-    0xdb,
-    0x24,
-    0x18,
-    0x81,
-    0x66,
-    0x88,
-    0x1f,
-    0x17,
-    0xe8,
-    0x75,
-    0x43,
-    0x28,
-    0x7d,
-    0xa3,
-    0x2e,
-    0x4b,
-    0xa9,
-    0x9a,
-    0x15,
-    0x6e,
-    0xf8,
-    0xc8,
-    0x82,
-    0x83,
-    0xe1,
-    0xd1,
-    0x57,
-    0x77,
-    0xf0,
-    0x26,
-    0x10,
-    0x64,
-    0x25,
-    0xd9,
-    0x48,
-    0x07,
-    0x97,
-    0xb0,
-    0x7e,
-    0x74,
-    0x5c,
-    0x78,
-    0x1a,
-    0x08,
-    0xad,
-    0x9b,
-    0xab,
-    0xa0,
-    0x46,
-    0xf5,
-    0x73,
-    0x08,
-    0x0c,
-    0xe4,
-    0x25,
-    0xb7,
-    0xf2,
-    0x9e,
-    0xed,
-    0xb9,
-    0x1d,
-    0xc8,
-    0xb1,
-    0xec,
-    0x47,
-    0x44,
-    0x97,
-    0x6f,
-    0x61,
-    0x4a,
-    0xc7,
-    0x58,
-    0x7c,
-    0xba,
-    0x72,
-    0xa5,
-    0xe9,
-    0xb0,
-    0x13,
-    0x76,
-    0x9f,
-    0x59,
-    0xf4,
-    0x79,
-    0xde,
-    0x06,
-    0xf4,
-    0xa5,
-    0x12,
-    0x7f,
-    0x89,
-    0x2b,
-    0xfa,
-    0x9a,
-    0x01,
-    0xa9,
-    0x09,
-    0x0c,
-    0x0d,
-    0xa1,
-    0x0d,
-    0x7e,
-    0x7f,
-    0x2b,
-    0x0e,
-    0xe4,
-    0x53,
-    0xe6,
-    0x79,
-    0x0a,
-    0xec,
-    0x34,
-    0x7e,
-    0x6f,
-    0xa1,
-    0xa7,
-    0xb6,
-    0x57,
-    0x78,
-    0xb6,
-    0x09,
-    0x1c,
-    0x31,
-    0xb5,
-    0xcf,
-    0xc5,
-    0x87,
-    0x04,
-    0x35,
-    0xd9,
-    0xb2,
-    0x86,
-    0xe2,
-    0x76,
-    0x30,
-    0x54,
-    0xdb,
-    0x9d,
-    0xc5,
-    0xb3,
-    0xa4,
-    0xd0,
-    0xc1,
-    0x44,
-    0xa9,
-    0xdf,
-    0x81,
-    0x7b,
-    0xdc,
-    0xff,
-    0x38,
-    0x52,
-    0x9e,
-    0x1c,
-    0xf0,
-    0x3f,
-    0xe3,
-    0x70,
-    0xcb,
-    0x63,
-    0x91,
-    0x55,
-    0x8f,
-    0x04,
-    0x2a,
-    0x57,
-    0x61,
-    0x3d,
-    0xab,
-    0x8e,
-    0xd1,
-    0xf4,
-    0xb4,
-    0x2b,
-    0x17,
-    0x0d,
-    0xe8,
-    0x50,
-    0x9c,
-    0xdd,
-    0x97,
-    0x25,
-    0xbd,
-    0xe2,
-    0x9b,
-    0x28,
-    0xcb,
-    0xb1,
-    0x7f,
-    0xc4,
-    0x56,
-    0x2f,
-    0xe7,
-    0x26,
-    0xab,
-    0x04,
-    0x2b,
-    0x4c,
-    0x9b,
-    0x4d,
-    0x46,
-    0x5e,
-    0x7e,
-    0x91,
-    0xef,
-    0x42,
-    0x78,
-    0xf7,
-    0x05,
-    0x6b,
-    0xfb,
-    0xb6,
-    0x30,
-    0xf1,
-    0x8d,
-    0xcc,
-    0xc6,
-    0xe7,
-    0xcc,
-    0xf3,
-    0xeb,
-    0xe9,
-    0xaf,
-    0xd1,
-    0xfd,
-    0xf4,
-    0x0e,
-    0x6f,
-    0x2f,
-    0x7a,
-    0x65,
-    0xec,
-    0x73,
-    0xb6,
-    0xd5,
-    0x73,
-    0x9e,
-    0x3e,
-    0x6b,
-    0x6a,
-    0xc6,
-    0xd7,
-    0xa5,
-    0xec,
-    0xef,
-    0x8c,
-    0x32,
-    0x7a,
-    0xe7,
-    0x02,
-    0xfa,
-    0xed,
-    0x6f,
-    0x06,
-    0x5e,
-    0xaf,
-    0x9b,
-    0x68,
-    0xc1,
-    0x2b,
-    0x7c,
-    0x0c,
-    0x47,
-    0x82,
-    0xfc,
-    0x3e,
-    0xdc,
-    0x80,
-    0x08,
-    0x46,
-    0x79,
-    0xce,
-    0xf5,
-    0x3c,
-    0xa2,
-    0x69,
-    0x1c,
-    0x1e,
-    0x34,
-    0x52,
-    0xc8,
-    0x20,
-    0x5d,
-    0x88,
-    0x53,
-    0x43,
-    0xec,
-    0x33,
-    0x8b,
-    0x29,
-    0xcb,
-    0x22,
-    0x5a,
-    0x28,
-    0xc9,
-    0x77,
-    0xa7,
-    0x9d,
-    0x9d,
-    0xa1,
-    0x77,
-    0x83,
-    0x28,
-    0x8b,
-    0x58,
-    0x44,
-    0xfb,
-    0x13,
-    0xff,
-    0xce,
-    0x19,
-    0xbe,
-    0x30,
-    0xea,
-    0xfe,
-    0xaa,
-    0xde,
-    0xc9,
-    0xe0,
-    0xc4,
-    0x94,
-    0xe0,
-    0x34,
-    0x3a,
-    0x13,
-    0xf7,
-    0x74,
-    0x34,
-    0x3d,
-    0x7c,
-    0x20,
-    0xbf,
-    0x31,
-    0x1c,
-    0x03,
-    0x09,
-    0xb8,
-    0x95,
-    0xb7,
-    0xd4,
-    0xe0,
-    0xc5,
-    0x6b,
-    0x25,
-    0xe6,
-    0x07,
-    0xe4,
-    0x3c,
-    0x59,
-    0xc0,
-    0xc2,
-    0xc9,
-    0x7d,
-    0x35,
-    0x05,
-    0x5d,
-    0xee,
-    0xa0,
-    0xcf,
-    0x1f,
-    0x85,
-    0x82,
-    0x6b,
-    0xc0,
-    0x7f,
-    0x3a,
-    0x8f,
-    0xb1,
-    0xdc,
-    0xd7,
-    0xde,
-    0x93,
-    0x06,
-    0x2b,
-    0xb1,
-    0xef,
-    0xb3,
-    0x20,
-    0x17,
-    0x27,
-    0x0c,
-    0x50,
-    0x1b,
-    0xac,
-    0x0f,
-    0xcf,
-    0x45,
-    0x72,
-    0x32,
-    0x4b,
-    0x63,
-    0xa1,
-    0x49,
-    0x58,
-    0x88,
-    0x8e,
-    0xa9,
-    0x05,
-    0x56,
-    0xe9,
-    0x8e,
-    0xb3,
-    0x79,
-    0x38,
-    0xba,
-    0x27,
-    0x74,
-    0x83,
-    0x5f,
-    0xdd,
-    0xa0,
-    0x51,
-    0x3f,
-    0x9f,
-    0x71,
-    0xd4,
-    0x12,
-    0x57,
-    0xfc,
-    0x61,
-    0x28,
-    0x22,
-    0xb6,
-    0x23,
-    0x4f,
-    0xa5,
-    0x7f,
-    0x0f,
-    0xf7,
-    0xa4,
-    0xdf,
-    0x1a,
-    0x94,
-    0xd0,
-    0x8f,
-    0xaa,
-    0x44,
-    0xe1,
-    0x3b,
-    0x4b,
-    0xb2,
-    0xe5,
-    0x86,
-    0xa4,
-    0x3a,
-    0xd8,
-    0x4f,
-    0xa9,
-    0x4e,
-    0x74,
-    0x32,
-    0x12,
-    0x18,
-    0x4a,
-    0x52,
-    0x0b,
-    0x60,
-    0x12,
-    0x56,
-    0x2d,
-    0xb1,
-    0x40,
-    0xb2,
-    0xad,
-    0xb7,
-    0xd8,
-    0x28,
-    0xd3,
-    0xec,
-    0x82,
-    0x8e,
-    0xae,
-    0x74,
-    0xe1,
-    0xd1,
-    0x07,
-    0x44,
-    0x21,
-    0x3a,
-    0x93,
-    0x8a,
-    0xcf,
-    0xf0,
-    0x6c,
-    0x49,
-    0xee,
-    0xbf,
-    0xc2,
-    0x44,
-    0x47,
-    0x17,
-    0xce,
-    0x1e,
-    0x00,
-    0x58,
-    0x08,
-    0xbf,
-    0x70,
-    0x4c,
-    0x9a,
-    0xfa,
-    0x32,
-    0xf5,
-    0x14,
-    0x6c,
-    0x78,
-    0x8a,
-    0x61,
-    0xa7,
-    0xa2,
-    0xbc,
-    0xfa,
-    0x90,
-    0x10,
-    0x3d,
-    0x59,
-    0x05,
-    0x34,
-    0x83,
-    0xb1,
-    0xc3,
-    0xeb,
-    0xca,
-    0xdc,
-    0x87,
-    0x0d,
-    0x58,
-    0x95,
-    0x74,
-    0x42,
-    0x04,
-    0xe7,
-    0xb5,
-    0x18,
-    0xf9,
-    0xe5,
-    0x63,
-    0x53,
-    0xb8,
-    0x9c,
-    0xa9,
-    0x85,
-    0x5c,
-    0x46,
-    0x26,
-    0xde,
-    0x22,
-    0xc1,
-    0x92,
-    0x44,
-    0x28,
-    0x3f,
-    0xa5,
-    0xa6,
-    0x75,
-    0x3e,
-    0x34,
-    0x8e,
-    0x3a,
-    0xbb,
-    0x9e,
-    0xf6,
-    0x57,
-    0xa2,
-    0x66,
-    0x5d,
-    0x21,
-    0x8a,
-    0x21,
-    0x1a,
-    0x63,
-    0x9f,
-    0x93,
-    0xef,
-    0xa3,
-    0xdf,
-    0x15,
-    0xe1,
-    0xa6,
-    0x8a,
-    0x39,
-    0x47,
-    0x36,
-    0xd3,
-    0xb1,
-    0x22,
-    0x22,
-    0xdc,
-    0x6d,
-    0xac,
-    0x87,
-    0xe1,
-    0x04,
-    0x34,
-    0x4e,
-    0xb4,
-    0x55,
-    0x28,
-    0xf6,
-    0x69,
-    0x6e,
-    0x74,
-    0x93,
-    0x52,
-    0xad,
-    0x0a,
-    0x17,
-    0x2e,
-    0x24,
-    0xc2,
-    0xd1,
-    0x9d,
-    0x42,
-    0x65,
-    0x33,
-    0xd7,
-    0xb0,
-    0x04,
-    0xd8,
-    0x9e,
-    0x7a,
-    0x8f,
-    0xc6,
-    0x71,
-    0x6f,
-    0xa3,
-    0xf0,
-    0x03,
-    0xca,
-    0xa2,
-    0xff,
-    0xeb,
-    0x12,
-    0x09,
-    0x51,
-    0x9d,
-    0x3e,
-    0xfe,
-    0x42,
-    0x99,
-    0x1d,
-    0x29,
-    0xab,
-    0xe2,
-    0xf5,
-    0xc5,
-    0xa9,
-    0xb2,
-    0x6b,
-    0xf7,
-    0xa0,
-    0x6c,
-    0xa2,
-    0x5e,
-    0x7f,
-    0xd2,
-    0xa7,
-    0xeb,
-    0x45,
-    0x78,
-    0x0d,
-    0xf3,
-    0xc4,
-    0x78,
-    0xd4,
-    0x82,
-    0xa4,
-    0x68,
-    0x90,
-    0xf3,
-    0xac,
-    0x89,
-    0xc6,
-    0xbd,
-    0x3d,
-    0x41,
-    0x9a,
-    0x90,
-    0x1f,
-    0xcc,
-    0xa7,
-    0xa1,
-    0x81,
-    0x2e,
-    0x2f,
-    0x42,
-    0x3a,
-    0x6c,
-    0x74,
-    0xb5,
-    0x55,
-    0xfb,
-    0x65,
-    0x42,
-    0xcd,
-    0x79,
-    0x7d,
-    0x87,
-    0x95,
-    0x9b,
-    0xe9,
-    0x10,
-    0xdb,
-    0x67,
-    0xe9,
-    0x27,
-    0x8e,
-    0xa3,
-    0x78,
-    0xed,
-    0x1e,
-    0x8d,
-    0x2f,
-    0xaa,
-    0x83,
-    0xcc,
-    0x67,
-    0x62,
-    0x80,
-    0xa7,
-    0x9e,
-    0xa9,
-    0x29,
-    0x75,
-    0x1c,
-    0xb7,
-    0xa3,
-    0x54,
-    0xd5,
-    0xbf,
-    0x2b,
-    0x1e,
-    0x92,
-    0x7d,
-    0x59,
-    0x99,
-    0x4c,
-    0x0f,
-    0xa6,
-    0xee,
-    0xd8,
-    0x05,
-    0x2d,
-    0x5d,
-    0xca,
-    0xbb,
-    0xae,
-    0x2e,
-    0x93,
-    0xe7,
-    0xd8,
-    0xeb,
-    0xec,
-    0x6e,
-    0xc8,
-    0xcc,
-    0x78,
-    0x7c,
-    0xcd,
-    0x73,
-    0xa4,
-    0xd3,
-    0x6e,
-    0xd9,
-    0xd3,
-    0x63,
-    0xae,
-    0x89,
-    0xb8,
-    0x1b,
-    0x8e,
-    0x0c,
-    0x02,
-    0x00,
-    0xd4,
-    0xa4,
-    0x3f,
-    0x7c,
-    0x0b,
-    0x3d,
-    0xfa,
-    0xf8,
-    0xcb,
-    0xa0,
-    0x27,
-    0xad,
-    0x3a,
-    0xea,
-    0xc2,
-    0xb6,
-    0xd3,
-    0x3c,
-    0xb2,
-    0x6a,
-    0x66,
-    0xb5,
-    0xf3,
-    0xea,
-    0x60,
-    0x9d,
-    0xf4,
-    0xf6,
-    0x4d,
-    0xe3,
-    0x3e,
-    0x05,
-    0x9b,
-    0xca,
-    0x57,
-    0x94,
-    0xa1,
-    0xdf,
-    0xe6,
-    0xbe,
-    0xe0,
-    0x2e,
-    0x17,
-    0x0d,
-    0x88,
-    0xb5,
-    0x41,
-    0x90,
-    0x3e,
-    0x19,
-    0xc7,
-    0x2d,
-    0x1c,
-    0x98,
-    0x3c,
-    0x39,
-    0xf9,
-    0x3f,
-    0xca,
-    0x46,
-    0xeb,
-    0x5d,
-    0xd4,
-    0x3c,
-    0x0b,
-    0x37,
-    0xda,
-    0xac,
-    0x78,
-    0xfd,
-    0x9d,
-    0x60,
-    0x9f,
-    0xfd,
-    0x84,
-    0x37,
-    0xb9,
-    0x17,
-    0x3f,
-    0x30,
-    0x94,
-    0x71,
-    0xaa,
-    0xc4,
-    0x97,
-    0x6c,
-    0xf4,
-    0x79,
-    0x01,
-    0xd6,
-    0x00,
-    0xb4,
-    0x71,
-    0x61,
-    0x0b,
-    0xce,
-    0xab,
-    0x53,
-    0x90,
-    0x6b,
-    0x99,
-    0x80,
-    0x68,
-    0x07,
-    0x90,
-    0x75,
-    0x36,
-    0xd2,
-    0xd5,
-    0xf7,
-    0x02,
-    0xbe,
-    0x60,
-    0xac,
-    0x24,
-    0xd6,
-    0xdf,
-    0x17,
-    0x64,
-    0xd1,
-    0xfe,
-    0xca,
-    0x5f,
-    0xe7,
-    0xe6,
-    0xd6,
-    0x2d,
-    0xe3,
-    0x03,
-    0x87,
-    0x40,
-    0x7a,
-    0x0b,
-    0x4e,
-    0x8f,
-    0xdb,
-    0x3c,
-    0xff,
-    0xf4,
-    0x87,
-    0xe5,
-    0x3c,
-    0xd3,
-    0x63,
-    0x27,
-    0x31,
-    0xfd,
-    0x0b,
-    0xfd,
-    0x83,
-    0xd4,
-    0x6a,
-    0x7a,
-    0x82,
-    0xaf,
-    0x88,
-    0x52,
-    0xa6,
-    0x80,
-    0xa2,
-    0x9c,
-    0x39,
-    0xb4,
-    0x80,
-    0xd6,
-    0x51,
-    0x5a,
-    0x03,
-    0x2a,
-    0x01,
-    0x88,
-    0xfe,
-    0xef,
-    0xd0,
-    0xfa,
-    0x46,
-    0x73,
-    0x6a,
-    0xfd,
-    0x0d,
-    0xf8,
-    0x96,
-    0x8b,
-    0x6b,
-    0xfc,
-    0x68,
-    0xb8,
-    0x3e,
-    0xbe,
-    0xb8,
-    0x4d,
-    0x34,
-    0xfd,
-    0xd3,
-    0xb2,
-    0x26,
-    0x03,
-    0x6f,
-    0x11,
-    0xa8,
-    0xe2,
-    0xe5,
-    0xb8,
-    0xde,
-    0xfe,
-    0x9a,
-    0xbf,
-    0x91,
-    0xcb,
-    0xbe,
-    0xeb,
-    0x81,
-    0xd8,
-    0x3a,
-    0xd3,
-    0xfd,
-    0x0d,
-    0xe3,
-    0x41,
-    0xb2,
-    0x31,
-    0xf4,
-    0xdb,
-    0xc1,
-    0xae,
-    0xbb,
-    0x03,
-    0x14,
-    0x99,
-    0x92,
-    0xfb,
-    0xf1,
-    0xed,
-    0x11,
-    0x4d,
-    0xcf,
-    0x17,
-    0x82,
-    0x6a,
-    0x69,
-    0xb8,
-    0x95,
-    0x91,
-    0x12,
-    0xa6,
-    0x56,
-    0xf2,
-    0x48,
-    0x34,
-    0x5b,
-    0x14,
-    0x8b,
-    0xb3,
-    0x42,
-    0x74,
-    0x70,
-    0x38,
-    0x5b,
-    0x6f,
-    0xf1,
-    0xa0,
-    0xa1,
-    0x61,
-    0x07,
-    0xd2,
-    0xef,
-    0x0f,
-    0x7b,
-    0x44,
-    0x70,
-    0x42,
-    0xf8,
-    0xc1,
-    0x58,
-    0xb5,
-    0x66,
-    0x69,
-    0xd1,
-    0x31,
-    0x73,
-    0xf9,
-    0x38,
-    0xf7,
-    0x72,
-    0x4c,
-    0x8a,
-    0x5e,
-    0x69,
-    0x22,
-    0x19,
-    0xbd,
-    0x65,
-    0x21,
-    0x84,
-    0x8b,
-    0x11,
-    0x19,
-    0xe5,
-    0xc5,
-    0x87,
-    0x8c,
-    0x4c,
-    0x90,
-    0x66,
-    0x6e,
-    0x6d,
-    0x20,
-    0x25,
-    0x29,
-    0x95,
-    0xd8,
-    0xa7,
-    0xe4,
-    0xe3,
-    0xb3,
-    0x0f,
-    0x05,
-    0xb4,
-    0xe2,
-    0xd5,
-    0xf4,
-    0x5f,
-    0xb7,
-    0x1a,
-    0x22,
-    0x23,
-    0xc1,
-    0x38,
-    0x4b,
-    0x5d,
-    0x39,
-    0x9e,
-    0xf8,
-    0xfe,
-    0x9c,
-    0xdb,
-    0x47,
-    0x3d,
-    0x9a,
-    0xf8,
-    0xee,
-    0x89,
-    0x2f,
-    0x0b,
-    0x7e,
-    0xc2,
-    0x10,
-    0x09,
-    0xe5,
-    0xa8,
-    0x48,
-    0xdc,
-    0x37,
-    0x94,
-    0x23,
-    0xb5,
-    0xae,
-    0x66,
-    0x4b,
-    0xa4,
-    0xef,
-    0xbe,
-    0x31,
-    0x66,
-    0x8e,
-    0x6f,
-    0xae,
-    0x7e,
-    0xd5,
-    0x30,
-    0xeb,
-    0x87,
-    0xc1,
-    0x95,
-    0x7e,
-    0xc8,
-    0x4e,
-    0x3e,
-    0xd5,
-    0x09,
-    0xf4,
-    0x4f,
-    0xd8,
-    0xa5,
-    0x72,
-    0x1f,
-    0xca,
-    0xe1,
-    0xca,
-    0x35,
-    0x70,
-    0x7c,
-    0x8d,
-    0x70,
-    0x76,
-    0x87,
-    0x58,
-    0x85,
-    0x0e,
-    0x77,
-    0x9f,
-    0xaf,
-    0xda,
-    0x79,
-    0xa9,
-    0xa1,
-    0x0c,
-    0x05,
-    0xdc,
-    0xc0,
-    0xcc,
-    0xb6,
-    0x3b,
-    0x8f,
-    0xda,
-    0x59,
-    0x2d,
-    0x6a,
-    0x74,
-    0x44,
-    0x80,
-    0x78,
-    0x7a,
-    0xe9,
-    0xad,
-    0xdb,
-    0xd0,
-    0xaa,
-    0x5e,
-    0x29,
-    0x04,
-    0xef,
-    0x2d,
-    0x20,
-    0x30,
-    0x76,
-    0xaf,
-    0x95,
-    0x22,
-    0xeb,
-    0xb1,
-    0xae,
-    0xbb,
-    0xb9,
-    0xc1,
-    0x51,
-    0x95,
-    0x1f,
-    0xf1,
-    0xdc,
-    0xe8,
-    0x86,
-    0xd7,
-    0x17,
-    0xaf,
-    0x12,
-    0xd8,
-    0x67,
-    0x06,
-    0x77,
-    0xa7,
-    0x44,
-    0xd7,
-    0x0e,
-    0x08,
-    0xec,
-    0xb5,
-    0x28,
-    0xda,
-    0x59,
-    0x08,
-    0xa2,
-    0x54,
-    0x71,
-    0x6b,
-    0xb9,
-    0x8f,
-    0x7e,
-    0x52,
-    0x20,
-    0x44,
-    0xdd,
-    0xf0,
-    0x50,
-    0xd8,
-    0xfa,
-    0x58,
-    0x20,
-    0x95,
-    0x7c,
-    0xe2,
-    0x95,
-    0x3b,
-    0xbc,
-    0xd0,
-    0xfb,
-    0xb7,
-    0x7c,
-    0x31,
-    0x34,
-    0x32,
-    0xd6,
-    0x06,
-    0x51,
-    0x4d,
-    0x72,
-    0xa4,
-    0x5f,
-    0xab,
-    0xfc,
-    0x59,
-    0x83,
-    0xb1,
-    0xd5,
-    0x52,
-    0x4a,
-    0x89,
-    0x09,
-    0xbc,
-    0x3a,
-    0x6d,
-    0x82,
-    0x2a,
-    0xad,
-    0x22,
-    0x7b,
-    0x37,
-    0xdf,
-    0xc2,
-    0x37,
-    0x6c,
-    0x45,
-    0xbf,
-    0xf2,
-    0x64,
-    0x20,
-    0x25,
-    0x18,
-    0x2d,
-    0x53,
-    0x1f,
-    0xb5,
-    0xf2,
-    0x71,
-    0xbd,
-    0x2c,
-    0xd7,
-    0x1b,
-    0xf4,
-    0x2d,
-    0x25,
-    0x89,
-    0xe7,
-    0xe1,
-    0xa7,
-    0x66,
-    0x64,
-    0x67,
-    0x54,
-    0xe1,
-    0xb2,
-    0x84,
-    0x2d,
-    0x01,
-    0x8a,
-    0x96,
-    0x69,
-    0x38,
-    0x63,
-    0xca,
-    0xd0,
-    0x3c,
-    0xf3,
-    0x8f,
-    0x65,
-    0x12,
-    0xf2,
-    0x4b,
-    0x47,
-    0x6b,
-    0x21,
-    0x4c,
-    0xd9,
-    0x34,
-    0x8b,
-    0x01,
-    0x21,
-    0x69,
-    0x0a,
-    0x6a,
-    0x6e,
-    0x2a,
-    0x0e,
-    0xcd,
-    0x3e,
-    0x10,
-    0x9a,
-    0xab,
-    0x5e,
-    0xc1,
-    0x8f,
-    0xf2,
-    0x53,
-    0xc2,
-    0x2d,
-    0x74,
-    0xf9,
-    0x8d,
-    0xd7,
-    0x98,
-    0x6a,
-    0xe4,
-    0x16,
-    0x4f,
-    0x21,
-    0x64,
-    0xe1,
-    0x4a,
-    0x60,
-    0x5d,
-    0x1c,
-    0x6b,
-    0xce,
-    0xe1,
-    0x5e,
-    0x79,
-    0x65,
-    0x1b,
-    0xf7,
-    0x17,
-    0x8b,
-    0xe2,
-    0x32,
-    0xf7,
-    0x7f,
-    0x8e,
-    0xd7,
-    0x4b,
-    0xf7,
-    0x0b,
-    0xf4,
-    0x7c,
-    0x08,
-    0x2c,
-    0xdd,
-    0x1f,
-    0x45,
-    0x41,
-    0x72,
-    0x25,
-    0x2b,
-    0xeb,
-    0xa0,
-    0x51,
-    0xbd,
-    0x2f,
-    0x2b,
-    0xf0,
-    0x6b,
-    0xca,
-    0xaa,
-    0xc4,
-    0x38,
-    0xc4,
-    0xd3,
-    0x41,
-    0x1c,
-    0x48,
-    0xf8,
-    0xfc,
-    0xa7,
-    0xb3,
-    0xd2,
-    0x60,
-    0xe8,
-    0xeb,
-    0x7e,
-    0xa2,
-    0x8d,
-    0xf2,
-    0xc5,
-    0xf8,
-    0x4b,
-    0xbb,
-    0xa0,
-    0x06,
-    0x81,
-    0x3c,
-    0xfb,
-    0x99,
-    0x18,
-    0xc4,
-    0xba,
-    0x98,
-    0xad,
-    0x8f,
-    0xfa,
-    0x38,
-    0xf2,
-    0x98,
-    0x99,
-    0x6e,
-    0x51,
-    0xae,
-    0xf8,
-    0xaa,
-    0xd3,
-    0xca,
-    0xff,
-    0xc2,
-    0x41,
-    0xa0,
-    0x62,
-    0x2c,
-    0x89,
-    0x74,
-    0x23,
-    0x71,
-    0x62,
-    0x2f,
-    0x59,
-    0xde,
-    0x33,
-    0xb2,
-    0x2f,
-    0x7d,
-    0x31,
-    0x6a,
-    0x2f,
-    0x44,
-    0xc8,
-    0x24,
-    0xc1,
-    0x8b,
-    0x3d,
-    0x23,
-    0xee,
-    0xc4,
-    0x91,
-    0x70,
-    0x6a,
-    0x66,
-    0xa8,
-    0x72,
-    0xd2,
-    0x2a,
-    0xab,
-    0xbe,
-    0x32,
-    0x7a,
-    0xaa,
-    0x30,
-    0xca,
-    0x26,
-    0x86,
-    0x3b,
-    0x12,
-    0x5a,
-    0x0e,
-    0x7d,
-    0xfb,
-    0xcd,
-    0x68,
-    0x97,
-    0x78,
-    0x3a,
-    0xb3,
-    0x3b,
-    0x3d,
-    0x14,
-    0xea,
-    0x87,
-    0xc6,
-    0x76,
-    0x0b,
-    0x91,
-    0x9c,
-    0x59,
-    0x79,
-    0x43,
-    0xd4,
-    0x09,
-    0x9f,
-    0x69,
-    0xd8,
-    0xda,
-    0xd7,
-    0x08,
-    0x6a,
-    0x16,
-    0x8a,
-    0xf1,
-    0xe5,
-    0x3b,
-    0x98,
-    0x97,
-    0xc6,
-    0x63,
-    0xfa,
-    0x1e,
-    0x6c,
-    0x04,
-    0xa6,
-    0xb4,
-    0x1c,
-    0xd9,
-    0xb2,
-    0x24,
-    0x48,
-    0x20,
-    0xbd,
-    0xa8,
-    0x11,
-    0x06,
-    0x8b,
-    0xff,
-    0x0a,
-    0x60,
-    0xef,
-    0xc0,
-    0x3f,
-    0x9b,
-    0xee,
-    0xee,
-    0x76,
-    0xf6,
-    0x21,
-    0xcc,
-    0xb4,
-    0xee,
-    0x5b,
-    0xf3,
-    0x03,
-    0xfa,
-    0x8c,
-    0xa1,
-    0x73,
-    0x79,
-    0xe5,
-    0x54,
-    0x5f,
-    0xe9,
-    0x3d,
-    0x98,
-    0xf1,
-    0x59,
-    0xb4,
-    0x1d,
-    0xe8,
-    0x21,
-    0x96,
-    0x0c,
-    0x99,
-    0xd0,
-    0x82,
-    0x9b,
-    0x34,
-    0x66,
-    0xcb,
-    0xe0,
-    0x49,
-    0xc4,
-    0x1e,
-    0xe2,
-    0x8b,
-    0x60,
-    0x65,
-    0xf6,
-    0xd3,
-    0x3d,
-    0xec,
-    0x49,
-    0x68,
-    0x1b,
-    0xc2,
-    0xb9,
-    0x7d,
-    0xeb,
-    0x63,
-    0xe9,
-    0xfb,
-    0x85,
-    0x93,
-    0x94,
-    0x81,
-    0x9d,
-    0x8d,
-    0x21,
-    0xa9,
-    0xf3,
-    0x5d,
-    0x78,
-    0x8e,
-    0xcb,
-    0x8b,
-    0x15,
-    0x8b,
-    0x9d,
-    0xf9,
-    0x5a,
-    0x45,
-    0x0d,
-    0x0e,
-    0x2a,
-    0xeb,
-    0x1d,
-    0x14,
-    0xb3,
-    0xbc,
-    0xa2,
-    0xdf,
-    0x8b,
-    0xca,
-    0xf5,
-    0xb0,
-    0xff,
-    0xfe,
-    0xea,
-    0x59,
-    0xa8,
-    0x5d,
-    0x06,
-    0xa1,
-    0x3f,
-    0x89,
-    0xec,
-    0xe9,
-    0xb1,
-    0x8b,
-    0x19,
-    0x10,
-    0x76,
-    0xcf,
-    0xd1,
-    0x95,
-    0x1f,
-    0x70,
-    0x59,
-    0xfb,
-    0x2f,
-    0xb7,
-    0x67,
-    0x72,
-    0x2c,
-    0xde,
-    0xd7,
-    0xb3,
-    0xf6,
-    0x19,
-    0x9f,
-    0x2c,
-    0x57,
-    0xd7,
-    0x05,
-    0x5d,
-    0xda,
-    0x44,
-    0x10,
-    0x82,
-    0xe1,
-    0x13,
-    0x3c,
-    0x72,
-    0xf2,
-    0x7c,
-    0x71,
-    0xc7,
-    0x52,
-    0x80,
-    0x36,
-    0x3f,
-    0xd5,
-    0x74,
-    0x23,
-    0x62,
-    0xf4,
-    0xbd,
-    0x94,
-    0x65,
-    0x20,
-    0xd9,
-    0xa5,
-    0x4f,
-    0x56,
-    0x9f,
-    0x5a,
-    0x5a,
-    0xf4,
-    0xc7,
-    0x1d,
-    0x9c,
-    0xcb,
-    0xac,
-    0x6e,
-    0xe6,
-    0x75,
-    0x51,
-    0xd6,
-    0xed,
-    0xe8,
-    0xa2,
-    0x1c,
-    0xa7,
-    0x4c,
-    0xfd,
-    0xbc,
-    0xf8,
-    0x0a,
-    0xf1,
-    0x95,
-    0x8e,
-    0x26,
-    0x46,
-    0xe2,
-    0x0a,
-    0xce,
-    0x3d,
-    0x6b,
-    0x60,
-    0x33,
-    0x18,
-    0xfd,
-    0x80,
-    0x97,
-    0xdd,
-    0x17,
-    0x36,
-    0xa7,
-    0x58,
-    0xe6,
-    0x4e,
-    0x0c,
-    0x5f,
-    0x73,
-    0xfd,
-    0x3d,
-    0x5a,
-    0x1c,
-    0x7c,
-    0x97,
-    0x02,
-    0x41,
-    0xf6,
-    0xaf,
-    0x68,
-    0x3f,
-    0xa4,
-    0xe7,
-    0x39,
-    0xa2,
-    0x37,
-    0x3f,
-    0x41,
-    0x96,
-    0x76,
-    0x6e,
-    0x2f,
-    0x9f,
-    0x28,
-    0x32,
-    0x98,
-    0x8a,
-    0x34,
-    0xe4,
-    0x3e,
-    0xa4,
-    0x07,
-    0x4f,
-    0x91,
-    0x29,
-    0x36,
-    0xc2,
-    0x76,
-    0xff,
-    0x64,
-    0x64,
-    0x48,
-    0xa4,
-    0x67,
-    0xc8,
-    0x1c,
-    0x66,
-    0xa6,
-    0xc1,
-    0x4a,
-    0xd2,
-    0xc5,
-    0x78,
-    0x29,
-    0x6e,
-    0x85,
-    0xbb,
-    0x19,
-    0xab,
-    0xe5,
-    0x98,
-    0xc7,
-    0x15,
-    0x8e,
-    0x2b,
-    0xac,
-    0xcd,
-    0x6d,
-    0xb4,
-    0xd7,
-    0x39,
-    0xa2,
-    0xec,
-    0xed,
-    0xfa,
-    0x99,
-    0x9a,
-    0x6e,
-    0x1e,
-    0x76,
-    0x61,
-    0x39,
-    0x97,
-    0xb7,
-    0xdc,
-    0x53,
-    0xec,
-    0x14,
-    0xed,
-    0xe4,
-    0x2f,
-    0xaa,
-    0x51,
-    0x82,
-    0x2f,
-    0x59,
-    0x78,
-    0xb2,
-    0xee,
-    0x6b,
-    0x94,
-    0xac,
-    0x56,
-    0x76,
-    0xf1,
-    0x5f,
-    0x27,
-    0x83,
-    0x84,
-    0xb5,
-    0x34,
-    0x6f,
-    0xc6,
-    0x18,
-    0xcf,
-    0x92,
-    0xc3,
-    0x35,
-    0x82,
-    0x9f,
-    0x6d,
-    0x00,
-    0x00,
-    0xcb,
-    0x37,
-    0xf8,
-    0x5a,
-    0x32,
-    0xdf,
-    0xac,
-    0x76,
-    0x76,
-    0x8b,
-    0x7e,
-    0xbe,
-    0xa9,
-    0x18,
-    0xa7,
-    0x15,
-    0x6d,
-    0xaf,
-    0x7b,
-    0x0f,
-    0x59,
-    0x99,
-    0xee,
-    0x61,
-    0x9f,
-    0x54,
-    0x58,
-    0x96,
-    0xec,
-    0xe6,
-    0x75,
-    0x04,
-    0x90,
-    0x71,
-    0xb0,
-    0xff,
-    0xdf,
-    0x08,
-    0xa1,
-    0x4c,
-    0xd7,
-    0xc1,
-    0xd4,
-    0xd8,
-    0x03,
-    0x0b,
-    0xcc,
-    0xaa,
-    0x9e,
-    0x42,
-    0x47,
-    0x17,
-    0xfc,
-    0x81,
-    0xc4,
-    0x35,
-    0x26,
-    0xb8,
-    0x43,
-    0x92,
-    0xc5,
-    0xfe,
-    0x4c,
-    0x25,
-    0x41,
-    0x28,
-    0x32,
-    0x84,
-    0x29,
-    0x9a,
-    0x99,
-    0x58,
-    0xd6,
-    0x5d,
-    0x36,
-    0x0e,
-    0x4b,
-    0x72,
-    0xd6,
-    0xd0,
-    0x60,
-    0x66,
-    0xa2,
-    0xb4,
-    0x20,
-    0x27,
-    0xa1,
-    0x33,
-    0x6f,
-    0x16,
-    0x7e,
-    0xdc,
-    0xf0,
-    0x5d,
-    0x8c,
-    0x49,
-    0x25,
-    0x83,
-    0x07,
-    0x53,
-    0xd8,
-    0x3e,
-    0x9d,
-    0x82,
-    0xba,
-    0x88,
-    0x2c,
-    0xc7,
-    0x4b,
-    0xf4,
-    0xce,
-    0x6e,
-    0xf9,
-    0x43,
-    0x13,
-    0x4e,
-    0x8c,
-    0x32,
-    0x8d,
-    0x43,
-    0xc1,
-    0x97,
-    0x92,
-    0xde,
-    0x35,
-    0xac,
-    0x3d,
-    0x5a,
-    0x85,
-    0xab,
-    0xb6,
-    0xd2,
-    0xb4,
-    0x9b,
-    0xb3,
-    0xb2,
-    0xcd,
-    0x69,
-    0x3f,
-    0x6c,
-    0xc9,
-    0x3a,
-    0xbb,
-    0x6c,
-    0xb2,
-    0x00,
-    0x22,
-    0x4d,
-    0x09,
-    0x4b,
-    0x91,
-    0x4d,
-    0x66,
-    0x63,
-    0x06,
-    0xfe,
-    0x5e,
-    0x93,
-    0x67,
-    0x3f,
-    0xa9,
-    0xc7,
-    0xc7,
-    0x6b,
-    0x84,
-    0x5a,
-    0xe6,
-    0xd0,
-    0x55,
-    0x29,
-    0xf6,
-    0x63,
-    0x8e,
-    0xec,
-    0xa5,
-    0xb1,
-    0xd3,
-    0xc6,
-    0x57,
-    0x19,
-    0x5f,
-    0x1a,
-    0xb3,
-    0x39,
-    0xa4,
-    0xa1,
-    0x62,
-    0xa6,
-    0x31,
-    0xb9,
-    0x13,
-    0xe0,
-    0xd9,
-    0x00,
-    0xc3,
-    0x85,
-    0x12,
-    0x22,
-    0x3b,
-    0xc4,
-    0x9b,
-    0xef,
-    0xda,
-    0x15,
-    0x62,
-    0xb1,
-    0x94,
-    0x27,
-    0xa4,
-    0xbc,
-    0x3b,
-    0x1a,
-    0x56,
-    0x46,
-    0xfd,
-    0xef,
-    0xc4,
-    0x79,
-    0x2f,
-    0x3d,
-    0x78,
-    0xc7,
-    0x49,
-    0x25,
-    0x5d,
-    0x7e,
-    0x31,
-    0x87,
-    0x24,
-    0x9c,
-    0xbc,
-    0x76,
-    0xe7,
-    0xe4,
-    0x72,
-    0xea,
-    0x0c,
-    0x31,
-    0x91,
-    0xb5,
-    0x6d,
-    0x0b,
-    0x55,
-    0xb9,
-    0xb5,
-    0x78,
-    0x77,
-    0x57,
-    0x0d,
-    0x14,
-    0xf3,
-    0x2b,
-    0xf9,
-    0x64,
-    0x0f,
-    0xf6,
-    0x7c,
-    0x68,
-    0x99,
-    0xdb,
-    0x83,
-    0x6f,
-    0x70,
-    0xcf,
-    0x81,
-    0x2f,
-    0x46,
-    0x4b,
-    0x56,
-    0x15,
-    0xa3,
-    0x43,
-    0x75,
-    0xda,
-    0x2d,
-    0x5c,
-    0x46,
-    0x57,
-    0x28,
-    0x5a,
-    0xc9,
-    0x9a,
-    0x39,
-    0xd7,
-    0x7d,
-    0x39,
-    0x6f,
-    0x3b,
-    0x80,
-    0xe6,
-    0x83,
-    0xe8,
-    0xf7,
-    0x44,
-    0x5f,
-    0xb5,
-    0xb0,
-    0xfa,
-    0xde,
-    0x9e,
-    0x06,
-    0x05,
-    0xd3,
-    0xba,
-    0x05,
-    0x52,
-    0x4c,
-    0x6d,
-    0xcf,
-    0x8c,
-    0x18,
-    0xde,
-    0x3e,
-    0x33,
-    0x86,
-    0xab,
-    0xcb,
-    0xee,
-    0x70,
-    0xdc,
-    0xaf,
-    0x22,
-    0x78,
-    0x16,
-    0x48,
-    0xc3,
-    0x92,
-    0x11,
-    0xbd,
-    0x6a,
-    0xc3,
-    0x4c,
-    0xe5,
-    0xa8,
-    0x28,
-    0x00,
-    0x65,
-    0x9b,
-    0x39,
-    0x52,
-    0x19,
-    0xbe,
-    0x4f,
-    0xcc,
-    0xb6,
-    0x05,
-    0x64,
-    0x0e,
-    0xad,
-    0x2a,
-    0x1a,
-    0xc1,
-    0x52,
-    0x41,
-    0xff,
-    0xcd,
-    0x3d,
-    0x93,
-    0x10,
-    0xcc,
-    0xf0,
-    0xa9,
-    0x7c,
-    0xbe,
-    0xbb,
-    0xa7,
-    0xaa,
-    0xfe,
-    0xdd,
-    0xdc,
-    0x7c,
-    0x75,
-    0xec,
-    0x96,
-    0xd6,
-    0x0d,
-    0x77,
-    0x3b,
-    0x5a,
-    0x68,
-    0xe9,
-    0x95,
-    0x76,
-    0xd3,
-    0xb0,
-    0x6e,
-    0xa1,
-    0x75,
-    0x9f,
-    0x5d,
-    0xe1,
-    0xcc,
-    0x91,
-    0xdf,
-    0x91,
-    0x5b,
-    0x50,
-    0xa9,
-    0x61,
-    0x9c,
-    0xb5,
-    0x3d,
-    0x9e,
-    0x3c,
-    0x10,
-    0xbc,
-    0xb4,
-    0x87,
-    0xc9,
-    0xfb,
-    0xf1,
-    0x22,
-    0x48,
-    0xd8,
-    0x8b,
-    0xf8,
-    0x13,
-    0xcf,
-    0xe5,
-    0x76,
-    0x36,
-    0xc8,
-    0x0e,
-    0xfb,
-    0xe8,
-    0x33,
-    0x8a,
-    0x8a,
-    0x6b,
-    0x57,
-    0x56,
-    0xc3,
-    0x34,
-    0xe7,
-    0x26,
-    0x11,
-    0x4c,
-    0xd7,
-    0xf1,
-    0x24,
-    0xf6,
-    0x6d,
-    0xaf,
-    0xa2,
-    0x92,
-    0x9b,
-    0x62,
-    0x19,
-    0xc1,
-    0x8c,
-    0x53,
-    0x39,
-    0xca,
-    0x7d,
-    0x9e,
-    0x40,
-    0x3d,
-    0xce,
-    0xf0,
-    0xb5,
-    0xd6,
-    0x59,
-    0x90,
-    0x59,
-    0xa3,
-    0x02,
-    0x9c,
-    0x5b,
-    0x69,
-    0x8f,
-    0x96,
-    0xcb,
-    0x45,
-    0xbb,
-    0x1f,
-    0x51,
-    0x8f,
-    0x85,
-    0x01,
-    0x1f,
-    0x03,
-    0xce,
-    0x73,
-    0x24,
-    0x23,
-    0x23,
-    0x99,
-    0x82,
-    0xd7,
-    0xd8,
-    0x4b,
-    0x43,
-    0x57,
-    0x56,
-    0x17,
-    0x47,
-    0x4a,
-    0xb5,
-    0x89,
-    0x81,
-    0x30,
-    0x8e,
-    0xa9,
-    0x64,
-    0xfd,
-    0x0a,
-    0xc6,
-    0x97,
-    0x06,
-    0x3f,
-    0x72,
-    0xf0,
-    0x21,
-    0xbd,
-    0xce,
-    0xa0,
-    0x08,
-    0x63,
-    0x08,
-    0xab,
-    0xff,
-    0x78,
-    0x21,
-    0x9c,
-    0xb7,
-    0xf7,
-    0xf4,
-    0x76,
-    0x71,
-    0x29,
-    0x74,
-    0xed,
-    0x66,
-    0x79,
-    0x35,
-    0xd6,
-    0x67,
-    0x85,
-    0x2e,
-    0xdd,
-    0xc1,
-    0x71,
-    0xbd,
-    0x76,
-    0x63,
-    0x80,
-    0xeb,
-    0x16,
-    0x43,
-    0xe5,
-    0xf2,
-    0xa2,
-    0xfd,
-    0xd6,
-    0xfc,
-    0x28,
-    0xbd,
-    0xe3,
-    0x2e,
-    0xcd,
-    0x60,
-    0x86,
-    0xe5,
-    0x06,
-    0xd6,
-    0xfb,
-    0x3f,
-    0x0b,
-    0xcb,
-    0x51,
-    0xde,
-    0x89,
-    0x86,
-    0xc2,
-    0xe8,
-    0x97,
-    0x11,
-    0x40,
-    0x52,
-    0xec,
-    0x9a,
-    0x50,
-    0x5f,
-    0x4f,
-    0x19,
-    0x1b,
-    0x63,
-    0x4e,
-    0x33,
-    0xc2,
-    0xcd,
-    0x33,
-    0x5e,
-    0xf3,
-    0x64,
-    0x34,
-    0x47,
-    0xba,
-    0xd1,
-    0xea,
-    0x71,
-    0x99,
-    0x5e,
-    0x05,
-    0x1e,
-    0xda,
-    0xfd,
-    0x3d,
-    0x72,
-    0x24,
-    0x8c,
-    0x8c,
-    0xd6,
-    0x4d,
-    0x57,
-    0x9a,
-    0x9b,
-    0x6f,
-    0xdf,
-    0x79,
-    0xdf,
-    0x3e,
-    0xda,
-    0x92,
-    0xb5,
-    0x98,
-    0x7a,
-    0xdf,
-    0x80,
-    0x5e,
-    0xf2,
-    0x5b,
-    0xa0,
-    0x83,
-    0x37,
-    0xb7,
-    0x51,
-    0x62,
-    0x03,
-    0x4f,
-    0xcf,
-    0x55,
-    0x20,
-    0x5c,
-    0xbf,
-    0x83,
-    0xe3,
-    0x6b,
-    0xca,
-    0xf9,
-    0xf7,
-    0x0e,
-    0x8b,
-    0xfd,
-    0x5b,
-    0xd1,
-    0xab,
-    0x9e,
-    0xae,
-    0x6f,
-    0x4a,
-    0x90,
-    0xab,
-    0x46,
-    0xa1,
-    0x37,
-    0xf0,
-    0x09,
-    0xe6,
-    0x02,
-    0x03,
-    0xb5,
-    0x70,
-    0xfa,
-    0x96,
-    0xc6,
-    0x1c,
-    0x9b,
-    0x0a,
-    0xaa,
-    0xef,
-    0xe2,
-    0x33,
-    0x76,
-    0xfd,
-    0xa7,
-    0x5b,
-    0xd8,
-    0x89,
-    0x2d,
-    0x89,
-    0x4c,
-    0x6d,
-    0xf8,
-    0x03,
-    0x93,
-    0xbd,
-    0xde,
-    0x11,
-    0x62,
-    0xa7,
-    0x61,
-    0x04,
-    0x57,
-    0x9d,
-    0x3c,
-    0x77,
-    0x30,
-    0xb7,
-    0x3c,
-    0xd5,
-    0x3f,
-    0x52,
-    0x51,
-    0x1b,
-    0x19,
-    0xfe,
-    0xe5,
-    0xdf,
-    0x8f,
-    0x97,
-    0x6c,
-    0x92,
-    0xdf,
-    0xb1,
-    0x3d,
-    0x02,
-    0x2b,
-    0x39,
-    0xa0,
-    0x22,
-    0x29,
-    0x5a,
-    0x28,
-    0x0e,
-    0x1d,
-    0x9e,
-    0x43,
-    0x4a,
-    0x04,
-    0x56,
-    0x0f,
-    0x4a,
-    0x12,
-    0x3b,
-    0x6f,
-    0x38,
-    0x5f,
-    0x55,
-    0x5f,
-    0xf1,
-    0xde,
-    0x1c,
-    0x84,
-    0x51,
-    0x8e,
-    0xde,
-    0x07,
-    0xb0,
-    0xf4,
-    0x60,
-    0xa4,
-    0xac,
-    0xc8,
-    0xc8,
-    0xfe,
-    0x29,
-    0xef,
-    0xba,
-    0x36,
-    0x97,
-    0xa9,
-    0xc2,
-    0xbb,
-    0x74,
-    0x0c,
-    0xf2,
-    0x64,
-    0x11,
-    0xb1,
-    0xcc,
-    0xbc,
-    0x98,
-    0xad,
-    0x62,
-    0x9d,
-    0x4e,
-    0xc2,
-    0xbb,
-    0x00,
-    0x16,
-    0xd7,
-    0x79,
-    0x13,
-    0x37,
-    0xa6,
-    0xb9,
-    0x8c,
-    0x5e,
-    0xb5,
-    0x3b,
-    0x3d,
-    0xe7,
-    0x87,
-    0xc3,
-    0xe9,
-    0x58,
-    0x13,
-    0xbe,
-    0x57,
-    0x2e,
-    0x75,
-    0x29,
-    0xa4,
-    0xdd,
-    0xe4,
-    0xaf,
-    0xdd,
-    0x12,
-    0xe4,
-    0x11,
-    0xce,
-    0x3b,
-    0xbc,
-    0xcb,
-    0x14,
-    0x49,
-    0x2b,
-    0xf5,
-    0x7a,
-    0xb4,
-    0x57,
-    0x67,
-    0x82,
-    0xc0,
-    0x06,
-    0x20,
-    0x41,
-    0x00,
-    0x10,
-    0xe9,
-    0x70,
-    0x18,
-    0x15,
-    0x35,
-    0xc1,
-    0xc6,
-    0x6b,
-    0x4c,
-    0x6f,
-    0x24,
-    0x5a,
-    0xa8,
-    0x19,
-    0x27,
-    0x8c,
-    0x9f,
-    0xd0,
-    0x6c,
-    0xbf,
-    0x43,
-    0x6f,
-    0x34,
-    0xbd,
-    0x87,
-    0x2a,
-    0xad,
-    0x8e,
-    0xa3,
-    0x6a,
-    0x73,
-    0xec,
-    0xb9,
-    0xd9,
-    0x56,
-    0xf7,
-    0xb8,
-    0xb8,
-    0x5e,
-    0x2a,
-    0x81,
-    0x79,
-    0x0c,
-    0x8e,
-    0x48,
-    0x8a,
-    0xe3,
-    0x2d,
-    0x3d,
-    0x6f,
-    0x27,
-    0xca,
-    0x6c,
-    0x13,
-    0xe5,
-    0xcf,
-    0xe2,
-    0x60,
-    0x33,
-    0x87,
-    0x12,
-    0x0d,
-    0xb9,
-    0x8d,
-    0x77,
-    0xb7,
-    0x70,
-    0x85,
-    0x7a,
-    0x34,
-    0xaa,
-    0x09,
-    0x95,
-    0x24,
-    0x53,
-    0xe6,
-    0xb9,
-    0xc8,
-    0x76,
-    0x89,
-    0xed,
-    0x18,
-    0x02,
-    0xb4,
-    0x39,
-    0x0f,
-    0xcf,
-    0x76,
-    0xc2,
-    0x4a,
-    0xdc,
-    0x59,
-    0x36,
-    0xd1,
-    0xdb,
-    0xdd,
-    0x6a,
-    0x35,
-    0xef,
-    0x25,
-    0x42,
-    0xdb,
-    0xb4,
-    0xf1,
-    0xd2,
-    0x97,
-    0x80,
-    0xcc,
-    0xc2,
-    0x7c,
-    0xe8,
-    0x87,
-    0xf7,
-    0xf3,
-    0x86,
-    0xe5,
-    0x6f,
-    0x0b,
-    0xfa,
-    0x98,
-    0x6d,
-    0x10,
-    0x2f,
-    0x6c,
-    0xd7,
-    0x5f,
-    0xe0,
-    0xc3,
-    0xdc,
-    0x78,
-    0x5a,
-    0x41,
-    0xd9,
-    0x55,
-    0x83,
-    0xc8,
-    0x7e,
-    0xfb,
-    0x1b,
-    0xa7,
-    0x2d,
-    0x4e,
-    0x42,
-    0x0e,
-    0xa2,
-    0x29,
-    0x3a,
-    0xc6,
-    0xd9,
-    0xae,
-    0x6f,
-    0x1e,
-    0x2c,
-    0xdb,
-    0xb4,
-    0x29,
-    0xbd,
-    0x5e,
-    0xd0,
-    0x26,
-    0x13,
-    0xab,
-    0x39,
-    0x40,
-    0x08,
-    0x4b,
-    0x1f,
-    0x78,
-    0xe2,
-    0x77,
-    0xac,
-    0xdf,
-    0xc0,
-    0xe5,
-    0x8b,
-    0x08,
-    0x38,
-    0xe2,
-    0xa7,
-    0xbd,
-    0x3e,
-    0xa1,
-    0x35,
-    0xf1,
-    0x47,
-    0xd3,
-    0xf4,
-    0xf6,
-    0xaf,
-    0x77,
-    0xb3,
-    0xf0,
-    0x58,
-    0xf4,
-    0x15,
-    0x8a,
-    0x95,
-    0x65,
-    0x91,
-    0xe7,
-    0x46,
-    0x34,
-    0xbc,
-    0xdc,
-    0x44,
-    0xea,
-    0xcb,
-    0x5c,
-    0xff,
-    0x45,
-    0x53,
-    0x33,
-    0x65,
-    0x8c,
-    0x54,
-    0xf7,
-    0x06,
-    0x1f,
-    0x76,
-    0x3c,
-    0x76,
-    0x52,
-    0x92,
-    0x08,
-    0xf3,
-    0x7b,
-    0x74,
-    0x87,
-    0x48,
-    0x4a,
-    0xe0,
-    0xff,
-    0xf1,
-    0x59,
-    0xd2,
-    0x05,
-    0x80,
-    0x04,
-    0x0a,
-    0xf2,
-    0x40,
-    0x7b,
-    0xc8,
-    0x91,
-    0x17,
-    0x15,
-    0xd5,
-    0x1a,
-    0xb1,
-    0xe8,
-    0xc2,
-    0x64,
-    0xda,
-    0x96,
-    0x74,
-    0x56,
-    0x2c,
-    0x69,
-    0xe1,
-    0x9f,
-    0xeb,
-    0xa3,
-    0x14,
-    0xa6,
-    0x2d,
-    0x0f,
-    0x77,
-    0xc4,
-    0x3e,
-    0xdc,
-    0x51,
-    0xb2,
-    0x42,
-    0xab,
-    0x8e,
-    0x3d,
-    0x1c,
-    0xe7,
-    0xbf,
-    0x41,
-    0x8f,
-    0x55,
-    0x61,
-    0xd4,
-    0xa3,
-    0xec,
-    0x62,
-    0xc2,
-    0x4b,
-    0xe6,
-    0xe1,
-    0x3a,
-    0x44,
-    0x17,
-    0x36,
-    0xc6,
-    0x40,
-    0x7e,
-    0x32,
-    0x80,
-    0x44,
-    0x1a,
-    0xa7,
-    0x84,
-    0x4f,
-    0xfe,
-    0x2b,
-    0xa1,
-    0x3c,
-    0xa8,
-    0x1a,
-    0x54,
-    0xe9,
-    0x8f,
-    0xda,
-    0xf6,
-    0x99,
-    0xfb,
-    0x63,
-    0x34,
-    0x97,
-    0x19,
-    0xfe,
-    0xc0,
-    0x1d,
-    0x4f,
-    0x4c,
-    0x46,
-    0x73,
-    0xcd,
-    0x8b,
-    0xa2,
-    0x5b,
-    0x65,
-    0x15,
-    0x50,
-    0xad,
-    0x9c,
-    0x29,
-    0x23,
-    0x3f,
-    0x01,
-    0xee,
-    0x3a,
-    0x07,
-    0xbd,
-    0xb5,
-    0x31,
-    0x84,
-    0x6c,
-    0x7f,
-    0x94,
-    0x59,
-    0x2b,
-    0xbf,
-    0x99,
-    0x3c,
-    0xf2,
-    0x61,
-    0x0e,
-    0x0e,
-    0x25,
-    0x0a,
-    0x90,
-    0x4b,
-    0x65,
-    0xa2,
-    0xfe,
-    0xa5,
-    0xac,
-    0x10,
-    0x2d,
-    0xec,
-    0x99,
-    0x44,
-    0xdd,
-    0x31,
-    0x08,
-    0x7b,
-    0xec,
-    0x2b,
-    0xe6,
-    0xbe,
-    0xca,
-    0xda,
-    0x44,
-    0xac,
-    0x2d,
-    0x69,
-    0xa9,
-    0x7a,
-    0x06,
-    0x59,
-    0xad,
-    0x38,
-    0xb3,
-    0xdc,
-    0xc3,
-    0x56,
-    0x76,
-    0x7f,
-    0x57,
-    0x66,
-    0x26,
-    0x0c,
-    0x19,
-    0x23,
-    0x24,
-    0xaf,
-    0x98,
-    0xb3,
-    0x91,
-    0x57,
-    0x12,
-    0x29,
-    0xbe,
-    0x5f,
-    0x8a,
-    0x4e,
-    0xe4,
-    0x6e,
-    0x1c,
-    0xa1,
-    0x16,
-    0x9c,
-    0x8e,
-    0x9c,
-    0x73,
-    0xd6,
-    0x27,
-    0x39,
-    0xa0,
-    0x83,
-    0xc4,
-    0xb5,
-    0x76,
-    0x67,
-    0x28,
-    0x94,
-    0xf7,
-    0xc8,
-    0x94,
-    0xe5,
-    0x87,
-    0xd0,
-    0x97,
-    0xc7,
-    0x59,
-    0x33,
-    0x28,
-    0x2c,
-    0x27,
-    0x12,
-    0xf2,
-    0xdd,
-    0x26,
-    0x1e,
-    0xef,
-    0xbf,
-    0x39,
-    0x00,
-    0x38,
-    0x54,
-    0x64,
-    0xf9,
-    0x1c,
-    0x84,
-    0x84,
-    0xc5,
-    0x6f,
-    0x9e,
-    0x3e,
-    0xc6
-  ],
-  const [
-    0xe3,
-    0x6e,
-    0x18,
-    0xed,
-    0xdf,
-    0xe2,
-    0xc2,
-    0x1d,
-    0x09,
-    0x7a,
-    0xf7,
-    0xbf,
-    0x9f,
-    0x8d,
-    0x89,
-    0xf1,
-    0x93,
-    0x4e,
-    0xa6,
-    0xb4,
-    0x34,
-    0xe8,
-    0xa3,
-    0xa1,
-    0x0b,
-    0xcd,
-    0xf7,
-    0xd8,
-    0x03,
-    0x4a,
-    0x8b,
-    0x3a,
-    0xce,
-    0x60,
-    0x31,
-    0xd8,
-    0x83,
-    0xcf,
-    0x71,
-    0xaa,
-    0x8c,
-    0x73,
-    0x8c,
-    0x85,
-    0xbf,
-    0xd3,
-    0xbb,
-    0x47,
-    0xcb,
-    0xf8,
-    0xb8,
-    0x55,
-    0xd6,
-    0x7b,
-    0x7f,
-    0x47,
-    0x64,
-    0xe2,
-    0x56,
-    0xe1,
-    0x7b,
-    0x2d,
-    0x0b,
-    0x45,
-    0x05,
-    0xab,
-    0x7d,
-    0x68,
-    0x75,
-    0x12,
-    0x5d,
-    0xc3,
-    0xad,
-    0xcf,
-    0x36,
-    0x4b,
-    0x1f,
-    0x9b,
-    0xab,
-    0xa2,
-    0x33,
-    0x4f,
-    0x01,
-    0x8f,
-    0xe9,
-    0xf9,
-    0xdd,
-    0xac,
-    0xc0,
-    0x2f,
-    0x4e,
-    0x5e,
-    0xd6,
-    0xa3,
-    0x0d,
-    0x0a,
-    0x50,
-    0xf8,
-    0x04,
-    0x86,
-    0xfc,
-    0xd4,
-    0x0e,
-    0xce,
-    0x35,
-    0x37,
-    0xfe,
-    0xf9,
-    0x08,
-    0x0b,
-    0xe2,
-    0x6b,
-    0x95,
-    0xfc,
-    0x89,
-    0x4b,
-    0xb7,
-    0x89,
-    0x42,
-    0x38,
-    0xe7,
-    0x5b,
-    0xe7,
-    0x37,
-    0x5d,
-    0xd6,
-    0x1a,
-    0xf0,
-    0x79,
-    0xef,
-    0xcf,
-    0x1b,
-    0x62,
-    0x3d,
-    0x0b,
-    0x35,
-    0xed,
-    0x52,
-    0xea,
-    0x77,
-    0xc0,
-    0x4b,
-    0xe7,
-    0x08,
-    0xb7,
-    0xa6,
-    0x58,
-    0x72,
-    0x86,
-    0x54,
-    0x38,
-    0x53,
-    0xa0,
-    0x0f,
-    0x29,
-    0x55,
-    0x58,
-    0xee,
-    0xb9,
-    0x5f,
-    0x46,
-    0x37,
-    0xe5,
-    0x0d,
-    0xed,
-    0x74,
-    0xdc,
-    0x5e,
-    0x9a,
-    0xc9,
-    0x05,
-    0xad,
-    0x8f,
-    0x84,
-    0x42,
-    0xe3,
-    0x61,
-    0xf6,
-    0x77,
-    0xea,
-    0x9f,
-    0x82,
-    0x46,
-    0x65,
-    0xb4,
-    0xf3,
-    0x1d,
-    0x9e,
-    0x0f,
-    0x12,
-    0x73,
-    0xbf,
-    0x81,
-    0x79,
-    0x4e,
-    0x46,
-    0xe6,
-    0xa2,
-    0x09,
-    0xb3,
-    0x07,
-    0x43,
-    0x54,
-    0x83,
-    0xbf,
-    0xde,
-    0x7c,
-    0x62,
-    0x5d,
-    0x93,
-    0xed,
-    0x9d,
-    0x4a,
-    0x3a,
-    0xf5,
-    0xd6,
-    0xec,
-    0xae,
-    0xca,
-    0xfb,
-    0xc9,
-    0x6b,
-    0xcf,
-    0x79,
-    0xf0,
-    0x5c,
-    0x13,
-    0xac,
-    0x95,
-    0xee,
-    0x1a,
-    0x9a,
-    0xfb,
-    0x69,
-    0xe1,
-    0xe2,
-    0x97,
-    0x80,
-    0x1c,
-    0xef,
-    0x72,
-    0x27,
-    0xc2,
-    0x71,
-    0xcf,
-    0xa4,
-    0xcb,
-    0x0e,
-    0x0e,
-    0xe9,
-    0x39,
-    0x54,
-    0xd0,
-    0x21,
-    0x55,
-    0xf3,
-    0x5c,
-    0x89,
-    0x3b,
-    0x29,
-    0x41,
-    0x81,
-    0x98,
-    0x7d,
-    0x3d,
-    0xe3,
-    0xb3,
-    0xb0,
-    0x5e,
-    0x93,
-    0xaa,
-    0xf1,
-    0x67,
-    0x57,
-    0xfe,
-    0x50,
-    0x75,
-    0xe9,
-    0x52,
-    0x75,
-    0xe2,
-    0x4b,
-    0x70,
-    0x92,
-    0x6a,
-    0x5b,
-    0x8d,
-    0x96,
-    0x8c,
-    0xa7,
-    0xce,
-    0xa4,
-    0x33,
-    0x82,
-    0x0b,
-    0xc3,
-    0x96,
-    0x58,
-    0xd2,
-    0xd7,
-    0x5d,
-    0x3e,
-    0xaf,
-    0xd0,
-    0x05,
-    0xcd,
-    0xaa,
-    0x21,
-    0x85,
-    0x31,
-    0x12,
-    0x73,
-    0x32,
-    0x7d,
-    0x79,
-    0x9b,
-    0xe0,
-    0x41,
-    0x00,
-    0xca,
-    0x4a,
-    0x5f,
-    0xd5,
-    0x04,
-    0xb4,
-    0x1a,
-    0xf9,
-    0xd4,
-    0xce,
-    0x70,
-    0x47,
-    0x3d,
-    0xdc,
-    0xaa,
-    0xb2,
-    0xf3,
-    0x14,
-    0x31,
-    0xce,
-    0xcc,
-    0x47,
-    0xa3,
-    0x92,
-    0x71,
-    0xc4,
-    0x26,
-    0x5c,
-    0x59,
-    0x7a,
-    0xfd,
-    0x35,
-    0xf8,
-    0x5c,
-    0x59,
-    0x56,
-    0x33,
-    0x0a,
-    0x71,
-    0xec,
-    0x18,
-    0xad,
-    0xd4,
-    0x19,
-    0xcc,
-    0x22,
-    0xfe,
-    0x3b,
-    0xc4,
-    0x5c,
-    0x2a,
-    0x70,
-    0x38,
-    0x03,
-    0x68,
-    0x5a,
-    0xd5,
-    0x61,
-    0xef,
-    0x1f,
-    0xb3,
-    0x7f,
-    0xb4,
-    0xb4,
-    0x86,
-    0x8b,
-    0x3c,
-    0x5c,
-    0x18,
-    0x7d,
-    0xae,
-    0x6b,
-    0xf7,
-    0xfb,
-    0x2c,
-    0x50,
-    0x6a,
-    0x79,
-    0x63,
-    0xd2,
-    0xaa,
-    0xa4,
-    0x61,
-    0x9a,
-    0x4f,
-    0x01,
-    0xa7,
-    0xf2,
-    0x09,
-    0xd1,
-    0x80,
-    0xcc,
-    0x90,
-    0x39,
-    0x91,
-    0x06,
-    0xde,
-    0x9f,
-    0xb0,
-    0xec,
-    0x9b,
-    0x57,
-    0xfa,
-    0xff,
-    0xd9,
-    0x7f,
-    0x1f,
-    0xf5,
-    0x01,
-    0x27,
-    0x01,
-    0x00,
-    0x0d,
-    0xb6,
-    0x7e,
-    0x53,
-    0xf8,
-    0x88,
-    0x89,
-    0xe3,
-    0x73,
-    0xdc,
-    0x80,
-    0x6a,
-    0xda,
-    0xee,
-    0xb9,
-    0xb2,
-    0x66,
-    0x60,
-    0x5f,
-    0x10,
-    0xa4,
-    0xde,
-    0x7c,
-    0x2e,
-    0x26,
-    0x02,
-    0x56,
-    0x0e,
-    0x78,
-    0x75,
-    0xff,
-    0x4c,
-    0x55,
-    0x58,
-    0x28,
-    0xa4,
-    0x1b,
-    0xe2,
-    0x36,
-    0xb3,
-    0x7d,
-    0x4a,
-    0x98,
-    0x02,
-    0x78,
-    0xe7,
-    0x57,
-    0x40,
-    0x88,
-    0x96,
-    0xee,
-    0xcf,
-    0x1b,
-    0x5c,
-    0x5d,
-    0x83,
-    0x46,
-    0x4c,
-    0x79,
-    0xa6,
-    0xb7,
-    0xab,
-    0x86,
-    0x3f,
-    0xeb,
-    0x53,
-    0x07,
-    0x93,
-    0xa1,
-    0x55,
-    0xd5,
-    0xed,
-    0x8e,
-    0xe2,
-    0x6f,
-    0x9b,
-    0x52,
-    0x6c,
-    0x91,
-    0x39,
-    0xab,
-    0x08,
-    0x08,
-    0x32,
-    0xe8,
-    0x17,
-    0xc4,
-    0x83,
-    0xa1,
-    0x25,
-    0x2f,
-    0xc2,
-    0xa6,
-    0x11,
-    0xbd,
-    0x5f,
-    0x35,
-    0x6e,
-    0xc4,
-    0x2b,
-    0x70,
-    0x2a,
-    0x8f,
-    0x16,
-    0x0d,
-    0x6d,
-    0xae,
-    0x3d,
-    0x50,
-    0xc4,
-    0x8f,
-    0x24,
-    0x36,
-    0x7f,
-    0x53,
-    0x3f,
-    0xf4,
-    0x58,
-    0xda,
-    0xb8,
-    0x9f,
-    0x55,
-    0x20,
-    0x6c,
-    0x2d,
-    0xef,
-    0xcd,
-    0x37,
-    0x9c,
-    0x73,
-    0x07,
-    0x71,
-    0x71,
-    0xa9,
-    0x8b,
-    0xb8,
-    0x64,
-    0xb4,
-    0xfc,
-    0xf0,
-    0x5a,
-    0x39,
-    0x7a,
-    0x89,
-    0x93,
-    0xc3,
-    0x77,
-    0x00,
-    0x25,
-    0x66,
-    0xc6,
-    0xa9,
-    0xa9,
-    0xa3,
-    0xf5,
-    0xab,
-    0x34,
-    0x8c,
-    0xdd,
-    0x4c,
-    0x89,
-    0x28,
-    0x77,
-    0x6f,
-    0x8c,
-    0x19,
-    0xf2,
-    0x5a,
-    0xfa,
-    0x7c,
-    0x02,
-    0xbd,
-    0x58,
-    0x11,
-    0x7a,
-    0xf0,
-    0x29,
-    0x9c,
-    0x1d,
-    0x7d,
-    0x64,
-    0x8b,
-    0xb1,
-    0xde,
-    0x25,
-    0xd8,
-    0x56,
-    0x88,
-    0xa3,
-    0x31,
-    0x16,
-    0x28,
-    0x62,
-    0x57,
-    0xbd,
-    0x2c,
-    0xaa,
-    0xc4,
-    0xeb,
-    0x85,
-    0x37,
-    0x90,
-    0x67,
-    0xab,
-    0x32,
-    0x95,
-    0xb6,
-    0xe2,
-    0x60,
-    0xd2,
-    0xed,
-    0xbd,
-    0x9a,
-    0x0d,
-    0xc3,
-    0xe0,
-    0x7d,
-    0xbc,
-    0xea,
-    0x09,
-    0x62,
-    0x26,
-    0xa0,
-    0x52,
-    0x90,
-    0xc6,
-    0x81,
-    0xb0,
-    0xb1,
-    0xf0,
-    0x9f,
-    0xc0,
-    0x83,
-    0xb7,
-    0xd4,
-    0xc3,
-    0xd0,
-    0x0d,
-    0x57,
-    0xe6,
-    0xa0,
-    0x2c,
-    0x8e,
-    0xc8,
-    0xad,
-    0x35,
-    0x23,
-    0x36,
-    0x17,
-    0x17,
-    0x5a,
-    0x39,
-    0x59,
-    0xb3,
-    0xa2,
-    0x52,
-    0x7c,
-    0x3e,
-    0x6a,
-    0x04,
-    0x8b,
-    0xe6,
-    0x35,
-    0x93,
-    0x46,
-    0xb8,
-    0xf1,
-    0x0c,
-    0x1a,
-    0xc1,
-    0x84,
-    0x85,
-    0x51,
-    0x73,
-    0xa9,
-    0xa6,
-    0x87,
-    0x4b,
-    0xfa,
-    0x68,
-    0x5d,
-    0xb1,
-    0x4d,
-    0x1d,
-    0x71,
-    0x20,
-    0x44,
-    0xb1,
-    0x8d,
-    0x86,
-    0x20,
-    0x2f,
-    0x1e,
-    0xee,
-    0xd6,
-    0x86,
-    0xe8,
-    0x5c,
-    0x65,
-    0x8e,
-    0xf9,
-    0xf8,
-    0x66,
-    0x46,
-    0xdb,
-    0x6f,
-    0xe5,
-    0x60,
-    0x0e,
-    0x97,
-    0x6f,
-    0xff,
-    0xb5,
-    0x52,
-    0x6c,
-    0xbf,
-    0x90,
-    0xb4,
-    0xb0,
-    0xf6,
-    0x2a,
-    0x68,
-    0x4c,
-    0x39,
-    0x54,
-    0x4f,
-    0xaa,
-    0x22,
-    0xd1,
-    0x6b,
-    0xd9,
-    0x51,
-    0x53,
-    0xfc,
-    0x25,
-    0xb1,
-    0xa7,
-    0xe8,
-    0xeb,
-    0xfc,
-    0x2c,
-    0x60,
-    0xab,
-    0x82,
-    0x89,
-    0xc1,
-    0x5f,
-    0x26,
-    0x9f,
-    0xb8,
-    0x0b,
-    0xa9,
-    0xbd,
-    0xaa,
-    0x96,
-    0x2b,
-    0x13,
-    0x53,
-    0xd8,
-    0xee,
-    0x6a,
-    0xad,
-    0xf4,
-    0x5e,
-    0x12,
-    0x13,
-    0xe8,
-    0x4e,
-    0x1b,
-    0xa6,
-    0x62,
-    0x85,
-    0xc8,
-    0xf0,
-    0xd6,
-    0x79,
-    0x40,
-    0xc7,
-    0xcd,
-    0x5a,
-    0x87,
-    0x74,
-    0x80,
-    0x52,
-    0xad,
-    0x15,
-    0xa5,
-    0x0c,
-    0x45,
-    0x40,
-    0x89,
-    0x73,
-    0x19,
-    0xe9,
-    0x5f,
-    0xbc,
-    0x1c,
-    0x86,
-    0xd7,
-    0xa6,
-    0xa0,
-    0x70,
-    0xf3,
-    0x00,
-    0xc9,
-    0x8d,
-    0x17,
-    0x6c,
-    0x42,
-    0x2c,
-    0x5f,
-    0x64,
-    0x2e,
-    0x30,
-    0x34,
-    0x7a,
-    0x62,
-    0x71,
-    0x22,
-    0xe4,
-    0xd1,
-    0x5f,
-    0xe4,
-    0x37,
-    0x47,
-    0xe9,
-    0xc1,
-    0x73,
-    0x5b,
-    0x9d,
-    0x1c,
-    0x40,
-    0x9f,
-    0x10,
-    0x46,
-    0x77,
-    0x19,
-    0x80,
-    0x96,
-    0xe4,
-    0xf7,
-    0xb8,
-    0xbc,
-    0x4b,
-    0x7e,
-    0x34,
-    0x52,
-    0xa8,
-    0x44,
-    0x86,
-    0xb4,
-    0xbb,
-    0x9f,
-    0xf8,
-    0x12,
-    0xc4,
-    0x5d,
-    0x73,
-    0xc3,
-    0x8c,
-    0xb5,
-    0x9f,
-    0xdc,
-    0xa4,
-    0x7e,
-    0x4c,
-    0x02,
-    0xf1,
-    0x9f,
-    0x11,
-    0x7c,
-    0x69,
-    0xc7,
-    0x32,
-    0x8c,
-    0x17,
-    0x5e,
-    0xc7,
-    0x00,
-    0x65,
-    0xbb,
-    0x1b,
-    0x04,
-    0x9a,
-    0x97,
-    0x53,
-    0x3a,
-    0xa2,
-    0xc1,
-    0x50,
-    0x0d,
-    0x0e,
-    0x14,
-    0xd6,
-    0x42,
-    0x5b,
-    0xa7,
-    0xed,
-    0xcf,
-    0x77,
-    0x43,
-    0x87,
-    0xf1,
-    0x81,
-    0x1a,
-    0x64,
-    0x79,
-    0xd0,
-    0xb5,
-    0x33,
-    0x66,
-    0x38,
-    0x2f,
-    0xfa,
-    0xb9,
-    0x88,
-    0xa1,
-    0xb7,
-    0x85,
-    0x57,
-    0xdd,
-    0x48,
-    0x46,
-    0x01,
-    0x5f,
-    0x88,
-    0x73,
-    0xec,
-    0x80,
-    0xbb,
-    0x57,
-    0x10,
-    0xed,
-    0x2c,
-    0x1c,
-    0xb6,
-    0x58,
-    0x14,
-    0x29,
-    0x7f,
-    0x6d,
-    0xbe,
-    0xae,
-    0xa9,
-    0x08,
-    0xe9,
-    0x7c,
-    0x8e,
-    0xa5,
-    0x6e,
-    0x1b,
-    0x6d,
-    0x18,
-    0x22,
-    0x16,
-    0x6d,
-    0x7e,
-    0xfe,
-    0x9a,
-    0xdf,
-    0x73,
-    0x7d,
-    0x3f,
-    0xc4,
-    0x85,
-    0x46,
-    0x26,
-    0x8f,
-    0xe9,
-    0x0b,
-    0x44,
-    0x2c,
-    0x6d,
-    0xb1,
-    0xfd,
-    0x40,
-    0xae,
-    0xb1,
-    0xf5,
-    0xb3,
-    0x8b,
-    0xbe,
-    0x23,
-    0x6c,
-    0xd9,
-    0xa8,
-    0x27,
-    0x5b,
-    0x58,
-    0x80,
-    0xdd,
-    0xbd,
-    0xe6,
-    0xfd,
-    0x32,
-    0x9b,
-    0xf3,
-    0x1e,
-    0x36,
-    0x94,
-    0x35,
-    0x11,
-    0x73,
-    0xdd,
-    0x9d,
-    0x54,
-    0x7e,
-    0x86,
-    0x89,
-    0x1a,
-    0xcb,
-    0xff,
-    0x3b,
-    0xf0,
-    0xc5,
-    0xda,
-    0x8a,
-    0xa0,
-    0x1e,
-    0xd2,
-    0xd7,
-    0x55,
-    0x64,
-    0x0d,
-    0x43,
-    0x01,
-    0xd6,
-    0x9e,
-    0x1f,
-    0xfc,
-    0x75,
-    0x4e,
-    0xa5,
-    0xee,
-    0x5e,
-    0x9c,
-    0xe5,
-    0xee,
-    0x56,
-    0x02,
-    0x01,
-    0xeb,
-    0xa7,
-    0x7a,
-    0x9d,
-    0x4b,
-    0x2b,
-    0x41,
-    0x92,
-    0xd3,
-    0xa6,
-    0xdb,
-    0xe2,
-    0xc7,
-    0x58,
-    0x57,
-    0xf1,
-    0x52,
-    0xd3,
-    0xd4,
-    0xf2,
-    0x27,
-    0x0b,
-    0x44,
-    0x9f,
-    0x69,
-    0xac,
-    0x70,
-    0x2d,
-    0xc9,
-    0xb0,
-    0x3d,
-    0x7f,
-    0xee,
-    0x30,
-    0x2d,
-    0x9a,
-    0x19,
-    0x7a,
-    0x28,
-    0x59,
-    0x09,
-    0x65,
-    0x7d,
-    0x61,
-    0x1c,
-    0xe1,
-    0x24,
-    0x58,
-    0xb8,
-    0xd2,
-    0x46,
-    0x52,
-    0xe9,
-    0x1f,
-    0xfe,
-    0x8c,
-    0x4b,
-    0x05,
-    0x62,
-    0x5d,
-    0x2b,
-    0xb2,
-    0xbd,
-    0x69,
-    0xe9,
-    0x0f,
-    0x1f,
-    0x18,
-    0xa0,
-    0xdd,
-    0x18,
-    0x47,
-    0x09,
-    0x03,
-    0xc0,
-    0x3d,
-    0x9d,
-    0x26,
-    0xfa,
-    0xe0,
-    0xfa,
-    0x7b,
-    0xfa,
-    0x28,
-    0x88,
-    0xd9,
-    0x05,
-    0xd5,
-    0x5c,
-    0x13,
-    0x78,
-    0x5d,
-    0x5d,
-    0x84,
-    0x0c,
-    0x29,
-    0xa5,
-    0xeb,
-    0x58,
-    0x00,
-    0x2a,
-    0x7a,
-    0x98,
-    0xc4,
-    0x9d,
-    0x29,
-    0xac,
-    0x5c,
-    0x92,
-    0x50,
-    0x64,
-    0xf1,
-    0xe2,
-    0x75,
-    0xfa,
-    0x5d,
-    0x4d,
-    0x62,
-    0xe0,
-    0xe0,
-    0x64,
-    0x7b,
-    0xbc,
-    0x15,
-    0xa7,
-    0x4f,
-    0xb2,
-    0x25,
-    0xea,
-    0x6d,
-    0xe1,
-    0x3b,
-    0xfd,
-    0x79,
-    0x30,
-    0x38,
-    0x8b,
-    0x7f,
-    0x4a,
-    0xa7,
-    0x43,
-    0x86,
-    0xe7,
-    0xf3,
-    0x36,
-    0x69,
-    0x4e,
-    0xd7,
-    0x80,
-    0xe2,
-    0x17,
-    0x17,
-    0x2b,
-    0xe8,
-    0x36,
-    0x6e,
-    0x50,
-    0x3b,
-    0x35,
-    0xc7,
-    0x7f,
-    0x3d,
-    0xc1,
-    0xb0,
-    0x61,
-    0x03,
-    0x68,
-    0x0b,
-    0x9c,
-    0xac,
-    0xa1,
-    0x06,
-    0xf7,
-    0xf1,
-    0x0d,
-    0x4e,
-    0xbf,
-    0xfe,
-    0xfc,
-    0x80,
-    0x69,
-    0x80,
-    0x33,
-    0xe1,
-    0x78,
-    0x00,
-    0xed,
-    0x4e,
-    0xa2,
-    0x6f,
-    0x1f,
-    0x76,
-    0x2e,
-    0x02,
-    0x00,
-    0x46,
-    0xa0,
-    0x40,
-    0xc9,
-    0xa5,
-    0x98,
-    0x59,
-    0xb9,
-    0x62,
-    0xf8,
-    0xb9,
-    0x5d,
-    0x6a,
-    0x45,
-    0xdd,
-    0x0e,
-    0x3f,
-    0x50,
-    0x65,
-    0xbb,
-    0xa5,
-    0x15,
-    0x6b,
-    0xe9,
-    0x9f,
-    0xe3,
-    0x14,
-    0xf7,
-    0x99,
-    0xbd,
-    0x64,
-    0xa7,
-    0xe7,
-    0x01,
-    0x57,
-    0xda,
-    0x6e,
-    0x47,
-    0x2d,
-    0x9b,
-    0xa1,
-    0x8c,
-    0x05,
-    0x5f,
-    0xb0,
-    0x90,
-    0xad,
-    0x8b,
-    0xfb,
-    0x7c,
-    0xb9,
-    0x37,
-    0xcd,
-    0xc8,
-    0xd2,
-    0x32,
-    0x47,
-    0x5c,
-    0x51,
-    0x46,
-    0x9a,
-    0xf5,
-    0x0d,
-    0xbd,
-    0x7a,
-    0xcb,
-    0x70,
-    0x23,
-    0xcf,
-    0x71,
-    0xd1,
-    0x4e,
-    0xad,
-    0xfc,
-    0xfd,
-    0x9c,
-    0x86,
-    0x67,
-    0x17,
-    0x7c,
-    0x9e,
-    0x36,
-    0xa3,
-    0x30,
-    0xc0,
-    0x5a,
-    0xdd,
-    0xd1,
-    0x30,
-    0x55,
-    0x4f,
-    0x93,
-    0xe0,
-    0x9e,
-    0xa2,
-    0x4a,
-    0xe6,
-    0x47,
-    0xb5,
-    0x2d,
-    0x2e,
-    0xdd,
-    0xec,
-    0xda,
-    0x6c,
-    0x90,
-    0xcb,
-    0x9b,
-    0x55,
-    0x93,
-    0xc3,
-    0xe8,
-    0x0f,
-    0xc6,
-    0x4b,
-    0x2d,
-    0xe6,
-    0x93,
-    0x33,
-    0xcd,
-    0x40,
-    0x15,
-    0x35,
-    0x66,
-    0xd3,
-    0x80,
-    0xce,
-    0x57,
-    0x15,
-    0xbd,
-    0x4c,
-    0x7f,
-    0xf4,
-    0x54,
-    0x27,
-    0x48,
-    0xc8,
-    0x8f,
-    0x94,
-    0xe4,
-    0x86,
-    0xdd,
-    0x58,
-    0xd7,
-    0x36,
-    0x74,
-    0xda,
-    0xb6,
-    0xa7,
-    0x3a,
-    0x7d,
-    0x2e,
-    0x61,
-    0xe6,
-    0x2c,
-    0x47,
-    0xdb,
-    0x62,
-    0x37,
-    0xea,
-    0xee,
-    0x74,
-    0x5d,
-    0xa2,
-    0x8a,
-    0x9e,
-    0x2a,
-    0x9f,
-    0xa8,
-    0x43,
-    0x83,
-    0x00,
-    0x7f,
-    0x0a,
-    0x7f,
-    0x52,
-    0xfb,
-    0x88,
-    0x78,
-    0x53,
-    0x6b,
-    0x19,
-    0x62,
-    0xfc,
-    0x7a,
-    0x0e,
-    0x5c,
-    0xbf,
-    0x60,
-    0x0e,
-    0x85,
-    0x0e,
-    0x59,
-    0xb6,
-    0x11,
-    0x1c,
-    0x56,
-    0x83,
-    0x9c,
-    0xe7,
-    0xf3,
-    0xf2,
-    0xbd,
-    0x76,
-    0xaa,
-    0xe5,
-    0xdf,
-    0x5f,
-    0x46,
-    0x49,
-    0x4c,
-    0x8d,
-    0x9a,
-    0xf6,
-    0x8b,
-    0x40,
-    0x72,
-    0xd6,
-    0xec,
-    0x55,
-    0xca,
-    0x4a,
-    0x61,
-    0xc8,
-    0x3e,
-    0xc9,
-    0x8f,
-    0x77,
-    0xc2,
-    0xcb,
-    0x25,
-    0x29,
-    0x93,
-    0xe5,
-    0x6d,
-    0xce,
-    0x6e,
-    0x35,
-    0x21,
-    0x09,
-    0xff,
-    0x00,
-    0x7f,
-    0xeb,
-    0x9c,
-    0x9a,
-    0x9f,
-    0x02,
-    0x33,
-    0x86,
-    0x05,
-    0x92,
-    0x81,
-    0xdf,
-    0x73,
-    0x22,
-    0x85,
-    0xf6,
-    0x00,
-    0x3a,
-    0x35,
-    0x3d,
-    0x6e,
-    0x6c,
-    0x6f,
-    0x64,
-    0xb9,
-    0x91,
-    0x32,
-    0xc1,
-    0xec,
-    0x55,
-    0x0e,
-    0xf5,
-    0x38,
-    0xf6,
-    0xd9,
-    0xcd,
-    0x47,
-    0x48,
-    0xa4,
-    0x66,
-    0xce,
-    0xfd,
-    0xed,
-    0x95,
-    0x62,
-    0x23,
-    0x17,
-    0x85,
-    0x8c,
-    0xee,
-    0x17,
-    0xa2,
-    0x1f,
-    0xb8,
-    0x6f,
-    0xb6,
-    0xc9,
-    0x46,
-    0x60,
-    0x52,
-    0xe9,
-    0x4d,
-    0x5b,
-    0x70,
-    0xa0,
-    0x34,
-    0xba,
-    0x56,
-    0x2b,
-    0x1c,
-    0xad,
-    0xbe,
-    0x70,
-    0x1e,
-    0x77,
-    0x33,
-    0xd6,
-    0xd3,
-    0xda,
-    0xbe,
-    0x5a,
-    0x1a,
-    0xcf,
-    0xc2,
-    0xe0,
-    0x15,
-    0x7b,
-    0x25,
-    0xc6,
-    0x75,
-    0x5f,
-    0xb0,
-    0xbf,
-    0xf8,
-    0xcf,
-    0xb9,
-    0xdf,
-    0x2f,
-    0xa5,
-    0xff,
-    0xf2,
-    0x85,
-    0x36,
-    0xd5,
-    0x12,
-    0x7d,
-    0x85,
-    0x83,
-    0x79,
-    0x3b,
-    0xb7,
-    0xe9,
-    0x93,
-    0x46,
-    0xc7,
-    0x65,
-    0x57,
-    0x8c,
-    0x7b,
-    0xf7,
-    0xd8,
-    0xa7,
-    0x97,
-    0xa3,
-    0x17,
-    0x5e,
-    0x50,
-    0x17,
-    0x1c,
-    0x6f,
-    0x03,
-    0x8e,
-    0x45,
-    0x8c,
-    0x27,
-    0xf4,
-    0xdd,
-    0xa3,
-    0x81,
-    0x4b,
-    0xf0,
-    0x62,
-    0x96,
-    0x4d,
-    0x5e,
-    0xfb,
-    0x66,
-    0x53,
-    0x2f,
-    0x24,
-    0x57,
-    0x75,
-    0x26,
-    0x62,
-    0x70,
-    0xf3,
-    0x99,
-    0x88,
-    0xc7,
-    0xd4,
-    0x80,
-    0x7a,
-    0x3d,
-    0xcc,
-    0xcb,
-    0x37,
-    0x68,
-    0x63,
-    0xf9,
-    0x17,
-    0xd1,
-    0x54,
-    0xe6,
-    0x51,
-    0x60,
-    0x33,
-    0xe4,
-    0xbf,
-    0x14,
-    0x53,
-    0x0e,
-    0xe6,
-    0xf7,
-    0xe7,
-    0xd9,
-    0x31,
-    0x52,
-    0x67,
-    0xec,
-    0x7d,
-    0x1d,
-    0x36,
-    0x32,
-    0xda,
-    0xb9,
-    0x81,
-    0x2d,
-    0x90,
-    0xe2,
-    0x6a,
-    0x8d,
-    0x61,
-    0xdf,
-    0x66,
-    0x01,
-    0x0e,
-    0xfb,
-    0xe3,
-    0x4d,
-    0x1d,
-    0x39,
-    0x2f,
-    0x9d,
-    0xd8,
-    0x44,
-    0x95,
-    0x18,
-    0x99,
-    0xa5,
-    0xc9,
-    0xb9,
-    0x45,
-    0x38,
-    0x86,
-    0x5a,
-    0x17,
-    0xe1,
-    0x75,
-    0x12,
-    0x9f,
-    0x7b,
-    0x51,
-    0xc1,
-    0x0a,
-    0x11,
-    0x49,
-    0xe9,
-    0xa3,
-    0x51,
-    0xa5,
-    0xc0,
-    0x9a,
-    0x3d,
-    0xad,
-    0x83,
-    0x04,
-    0x24,
-    0xc6,
-    0x0c,
-    0x24,
-    0xd1,
-    0xdf,
-    0xa7,
-    0xe9,
-    0x02,
-    0x0b,
-    0x22,
-    0xb7,
-    0x1c,
-    0x6f,
-    0x23,
-    0x6b,
-    0x1c,
-    0x5f,
-    0xbe,
-    0x99,
-    0xd1,
-    0xc4,
-    0x47,
-    0x17,
-    0x49,
-    0xc1,
-    0x65,
-    0xc0,
-    0x89,
-    0x96,
-    0x68,
-    0x72,
-    0x80,
-    0xc4,
-    0xdd,
-    0x59,
-    0x3e,
-    0x72,
-    0x5f,
-    0x70,
-    0x62,
-    0x0f,
-    0xb0,
-    0x44,
-    0xd1,
-    0x39,
-    0x08,
-    0xfc,
-    0xae,
-    0xdd,
-    0xac,
-    0x96,
-    0x86,
-    0xa0,
-    0xc3,
-    0x73,
-    0xca,
-    0x7e,
-    0x65,
-    0x16,
-    0x83,
-    0xb1,
-    0xf6,
-    0x29,
-    0x41,
-    0xd5,
-    0xb2,
-    0xc0,
-    0x54,
-    0x49,
-    0x88,
-    0xe2,
-    0x3f,
-    0xd8,
-    0x2c,
-    0x46,
-    0x6a,
-    0x99,
-    0x68,
-    0x5a,
-    0x17,
-    0x13,
-    0xb3,
-    0x89,
-    0x97,
-    0xa5,
-    0x04,
-    0xbe,
-    0xbe,
-    0x26,
-    0xe8,
-    0x24,
-    0x94,
-    0xc8,
-    0xd3,
-    0x31,
-    0x4d,
-    0x42,
-    0xb3,
-    0xe2,
-    0x7c,
-    0x2e,
-    0xcb,
-    0x48,
-    0x83,
-    0xaf,
-    0xbf,
-    0x43,
-    0x4e,
-    0x58,
-    0xeb,
-    0x8e,
-    0x41,
-    0x49,
-    0xf9,
-    0xfb,
-    0x6e,
-    0x9b,
-    0xb3,
-    0x00,
-    0x0c,
-    0xff,
-    0x15,
-    0x73,
-    0x24,
-    0xa1,
-    0xa7,
-    0x92,
-    0x8e,
-    0x53,
-    0x0a,
-    0x46,
-    0x1c,
-    0xe7,
-    0xd0,
-    0xa9,
-    0x15,
-    0xdc,
-    0x91,
-    0xc5,
-    0xe5,
-    0x3e,
-    0x3a,
-    0x9f,
-    0x12,
-    0xc7,
-    0xa9,
-    0x74,
-    0x72,
-    0x4a,
-    0x77,
-    0x42,
-    0x9c,
-    0x52,
-    0x15,
-    0x8a,
-    0x9c,
-    0x06,
-    0x1b,
-    0x54,
-    0xeb,
-    0x4f,
-    0xdc,
-    0x75,
-    0x9e,
-    0x3d,
-    0x3e,
-    0x0d,
-    0xdd,
-    0xa7,
-    0xc9,
-    0x53,
-    0x97,
-    0x12,
-    0xfd,
-    0x95,
-    0x74,
-    0xd4,
-    0xe9,
-    0x7a,
-    0x0b,
-    0x7a,
-    0xf9,
-    0x8b,
-    0x56,
-    0x66,
-    0x10,
-    0xf1,
-    0x62,
-    0xbd,
-    0xd6,
-    0x80,
-    0x4b,
-    0x80,
-    0x54,
-    0xf5,
-    0x68,
-    0xf8,
-    0xbe,
-    0x7c,
-    0xc3,
-    0x58,
-    0x8f,
-    0x76,
-    0xcc,
-    0x9e,
-    0xdb,
-    0x78,
-    0x4e,
-    0xba,
-    0xe1,
-    0x97,
-    0xa1,
-    0xf2,
-    0xe1,
-    0xe3,
-    0x22,
-    0x85,
-    0x2d,
-    0x31,
-    0xe0,
-    0x8e,
-    0x81,
-    0x1e,
-    0x98,
-    0x2c,
-    0x97,
-    0x50,
-    0xe4,
-    0xe0,
-    0xf7,
-    0xff,
-    0xaf,
-    0x36,
-    0x0d,
-    0xb4,
-    0xec,
-    0xa8,
-    0x7d,
-    0x51,
-    0x87,
-    0xbf,
-    0xbb,
-    0x52,
-    0x9c,
-    0x7b,
-    0xd6,
-    0x52,
-    0xe8,
-    0xf5,
-    0x94,
-    0xd1,
-    0x7d,
-    0x43,
-    0xc4,
-    0x34,
-    0xb9,
-    0x9c,
-    0xd0,
-    0x0d,
-    0x78,
-    0xbc,
-    0x92,
-    0x9d,
-    0x89,
-    0x8a,
-    0x68,
-    0x98,
-    0x5f,
-    0xf9,
-    0x8b,
-    0x27,
-    0x09,
-    0x2c,
-    0x9c,
-    0x33,
-    0x65,
-    0xdd,
-    0x80,
-    0xe1,
-    0x90,
-    0xff,
-    0x6e,
-    0x59,
-    0xa0,
-    0xa2,
-    0x46,
-    0xcc,
-    0x96,
-    0x18,
-    0x25,
-    0xb5,
-    0x8e,
-    0x56,
-    0x36,
-    0x5f,
-    0x39,
-    0x9c,
-    0xcb,
-    0xa7,
-    0x8d,
-    0x59,
-    0xac,
-    0x03,
-    0xbb,
-    0x49,
-    0xae,
-    0xc3,
-    0x62,
-    0xe0,
-    0x88,
-    0x97,
-    0x02,
-    0xeb,
-    0xe3,
-    0x52,
-    0xb3,
-    0x75,
-    0xb0,
-    0xed,
-    0x17,
-    0xe7,
-    0xbe,
-    0xcf,
-    0x8d,
-    0x74,
-    0x8c,
-    0x4b,
-    0xa7,
-    0xb4,
-    0x5c,
-    0x6b,
-    0xdf,
-    0x8f,
-    0x88,
-    0xec,
-    0x85,
-    0x5d,
-    0x19,
-    0x89,
-    0xfc,
-    0x4b,
-    0x96,
-    0x7d,
-    0x26,
-    0x01,
-    0x1a,
-    0x43,
-    0x1d,
-    0x82,
-    0xa9,
-    0xa0,
-    0x24,
-    0x53,
-    0xc4,
-    0xe3,
-    0xdd,
-    0xdf,
-    0x3b,
-    0x6c,
-    0xbc,
-    0x1a,
-    0x43,
-    0x6b,
-    0xbb,
-    0x65,
-    0xc8,
-    0xea,
-    0x4f,
-    0xb2,
-    0x05,
-    0x0e,
-    0x9b,
-    0xe8,
-    0x51,
-    0x99,
-    0xe4,
-    0x89,
-    0x3c,
-    0xb4,
-    0x46,
-    0x92,
-    0xda,
-    0xec,
-    0xa5,
-    0xa2,
-    0x5f,
-    0x7a,
-    0xe6,
-    0x5f,
-    0xec,
-    0xc7,
-    0x5e,
-    0x15,
-    0xa9,
-    0x2f,
-    0x8a,
-    0xa1,
-    0x14,
-    0x05,
-    0x01,
-    0x8e,
-    0x99,
-    0xd8,
-    0xa8,
-    0x7d,
-    0x62,
-    0xf5,
-    0x25,
-    0xca,
-    0x70,
-    0x2d,
-    0x96,
-    0x6c,
-    0xeb,
-    0xd9,
-    0x82,
-    0x1d,
-    0xb6,
-    0x1b,
-    0x0f,
-    0xbc,
-    0x47,
-    0x66,
-    0x76,
-    0xef,
-    0xb6,
-    0x40,
-    0xb5,
-    0x0c,
-    0x13,
-    0x46,
-    0x84,
-    0x3a,
-    0xfd,
-    0x71,
-    0x89,
-    0xd3,
-    0x70,
-    0x99,
-    0xcf,
-    0x0d,
-    0xdf,
-    0x37,
-    0x75,
-    0xda,
-    0x83,
-    0x6f,
-    0xa3,
-    0x0c,
-    0xf2,
-    0x4e,
-    0xc2,
-    0xbd,
-    0xf3,
-    0x50,
-    0xed,
-    0xee,
-    0x91,
-    0x25,
-    0xa2,
-    0x6e,
-    0x6e,
-    0xb4,
-    0xbe,
-    0xfe,
-    0x5a,
-    0x61,
-    0xa8,
-    0xb2,
-    0x24,
-    0x8b,
-    0xcc,
-    0x9a,
-    0xb0,
-    0x59,
-    0x4b,
-    0xa2,
-    0x4a,
-    0xb7,
-    0xf0,
-    0xb7,
-    0x3a,
-    0x9b,
-    0x67,
-    0x2b,
-    0x99,
-    0x8d,
-    0xa9,
-    0x5b,
-    0x63,
-    0x66,
-    0xbb,
-    0x8f,
-    0xcd,
-    0x58,
-    0x98,
-    0x21,
-    0xd8,
-    0x2e,
-    0x6c,
-    0xe2,
-    0x26,
-    0xd5,
-    0x02,
-    0xb9,
-    0x0c,
-    0x1c,
-    0x80,
-    0x8d,
-    0xea,
-    0xb8,
-    0x52,
-    0x65,
-    0xb7,
-    0x8b,
-    0x64,
-    0xce,
-    0xe0,
-    0x26,
-    0x94,
-    0x7e,
-    0x53,
-    0x8c,
-    0x67,
-    0x36,
-    0xd6,
-    0x38,
-    0xfa,
-    0xed,
-    0x9e,
-    0x62,
-    0x3c,
-    0x2a,
-    0x1d,
-    0x7f,
-    0x5b,
-    0xb2,
-    0x1b,
-    0x07,
-    0x7c,
-    0x63,
-    0x08,
-    0x7a,
-    0xaf,
-    0x60,
-    0x91,
-    0xa5,
-    0x22,
-    0x6e,
-    0x71,
-    0x22,
-    0x95,
-    0x9e,
-    0x8a,
-    0x1e,
-    0x0d,
-    0x2d,
-    0x34,
-    0x5e,
-    0xcd,
-    0xa8,
-    0xd5,
-    0x84,
-    0x82,
-    0x53,
-    0xb2,
-    0x8f,
-    0xbe,
-    0xcc,
-    0x04,
-    0xa2,
-    0xa7,
-    0xec,
-    0x4f,
-    0x06,
-    0xf1,
-    0xee,
-    0xef,
-    0x71,
-    0x09,
-    0xd3,
-    0xf3,
-    0x89,
-    0x93,
-    0x04,
-    0x2f,
-    0xa4,
-    0x17,
-    0x3a,
-    0x8d,
-    0xd2,
-    0xf7,
-    0x9b,
-    0xa4,
-    0x1d,
-    0xa5,
-    0x26,
-    0x8c,
-    0x0f,
-    0x12,
-    0x50,
-    0xf0,
-    0x75,
-    0x6a,
-    0xef,
-    0x64,
-    0x63,
-    0xfe,
-    0x58,
-    0xf9,
-    0x78,
-    0x82,
-    0xc4,
-    0x0f,
-    0x63,
-    0x78,
-    0xf9,
-    0x6b,
-    0xa6,
-    0xec,
-    0x26,
-    0x8a,
-    0x9a,
-    0x62,
-    0x0e,
-    0x34,
-    0xb4,
-    0x0d,
-    0x68,
-    0x54,
-    0x06,
-    0x41,
-    0x86,
-    0x06,
-    0x09,
-    0x2b,
-    0x36,
-    0xf2,
-    0x99,
-    0xc0,
-    0xe6,
-    0xd9,
-    0x41,
-    0xf3,
-    0x0b,
-    0x6d,
-    0xb9,
-    0x2b,
-    0xc3,
-    0x66,
-    0xad,
-    0xf4,
-    0xb8,
-    0xd2,
-    0xc0,
-    0xf4,
-    0x48,
-    0xac,
-    0xd1,
-    0x22,
-    0xe4,
-    0xb1,
-    0x7d,
-    0x32,
-    0xb6,
-    0x6f,
-    0xe5,
-    0x53,
-    0x87,
-    0x9f,
-    0xb1,
-    0x1d,
-    0xdf,
-    0xb4,
-    0x55,
-    0xc5,
-    0x6e,
-    0xb4,
-    0x92,
-    0x94,
-    0xaa,
-    0x47,
-    0x40,
-    0x97,
-    0xba,
-    0x0e,
-    0x4c,
-    0x97,
-    0x93,
-    0x35,
-    0xfd,
-    0x4b,
-    0x61,
-    0x4c,
-    0x7b,
-    0xcd,
-    0x28,
-    0x52,
-    0x91,
-    0x4b,
-    0xab,
-    0x13,
-    0xb2,
-    0xff,
-    0x8d,
-    0xb5,
-    0x3a,
-    0x61,
-    0xb6,
-    0x8d,
-    0xf7,
-    0x9b,
-    0xf8,
-    0x37,
-    0xe8,
-    0x3d,
-    0xf2,
-    0xe5,
-    0x44,
-    0x32,
-    0x35,
-    0xf7,
-    0xbe,
-    0xf3,
-    0xa6,
-    0xcc,
-    0x08,
-    0xfa,
-    0x24,
-    0xd8,
-    0x96,
-    0x7a,
-    0x6a,
-    0xf7,
-    0xa4,
-    0x4d,
-    0x36,
-    0x01,
-    0x7a,
-    0x2d,
-    0xab,
-    0x9f,
-    0xef,
-    0x28,
-    0xf3,
-    0x5d,
-    0x2c,
-    0x4e,
-    0x2a,
-    0x00,
-    0xb2,
-    0xad,
-    0x77,
-    0x19,
-    0x9f,
-    0x7f,
-    0x7c,
-    0xda,
-    0x2c,
-    0xa1,
-    0xf1,
-    0x29,
-    0x7b,
-    0x47,
-    0x8b,
-    0xf3,
-    0x90,
-    0xef,
-    0x23,
-    0xc3,
-    0x9d,
-    0x93,
-    0x14,
-    0x93,
-    0x82,
-    0x23,
-    0xe5,
-    0xe2,
-    0x94,
-    0x32,
-    0x28,
-    0x06,
-    0x9d,
-    0xf0,
-    0xa1,
-    0xc4,
-    0x25,
-    0x58,
-    0xab,
-    0x1e,
-    0xf0,
-    0xaa,
-    0xd8,
-    0x6c,
-    0xc8,
-    0x1c,
-    0xd8,
-    0xae,
-    0x7d,
-    0xcc,
-    0x9c,
-    0x21,
-    0x29,
-    0xfa,
-    0xba,
-    0x10,
-    0xb8,
-    0x74,
-    0x14,
-    0xed,
-    0xa8,
-    0x51,
-    0xb5,
-    0xa0,
-    0x0e,
-    0xe2,
-    0xfb,
-    0x1f,
-    0xda,
-    0xe6,
-    0xfb,
-    0x3f,
-    0x5b,
-    0xfd,
-    0x21,
-    0xca,
-    0x06,
-    0x60,
-    0x17,
-    0xd1,
-    0x73,
-    0xce,
-    0xe8,
-    0x43,
-    0xa8,
-    0xca,
-    0x66,
-    0xbf,
-    0x9a,
-    0x03,
-    0xc9,
-    0xa7,
-    0xf1,
-    0x14,
-    0x98,
-    0x76,
-    0x0c,
-    0x6d,
-    0xcd,
-    0x53,
-    0x45,
-    0x91,
-    0x34,
-    0xe6,
-    0x76,
-    0x83,
-    0x14,
-    0x6a,
-    0xbc,
-    0x7a,
-    0x11,
-    0x03,
-    0x7a,
-    0xdc,
-    0x51,
-    0x52,
-    0xa1,
-    0x6a,
-    0xde,
-    0x47,
-    0x2f,
-    0xb8,
-    0x4b,
-    0x37,
-    0xf6,
-    0xe1,
-    0x9b,
-    0x2f,
-    0x9f,
-    0x78,
-    0x5e,
-    0x87,
-    0xee,
-    0xc2,
-    0x1d,
-    0xba,
-    0x48,
-    0x22,
-    0xf8,
-    0x75,
-    0x72,
-    0xd4,
-    0x8e,
-    0xed,
-    0x9b,
-    0xde,
-    0x1d,
-    0x76,
-    0x9d,
-    0x44,
-    0xea,
-    0x52,
-    0x80,
-    0x7c,
-    0xe4,
-    0xc6,
-    0x3f,
-    0x21,
-    0x84,
-    0x73,
-    0xcf,
-    0xec,
-    0xf7,
-    0xe4,
-    0x5e,
-    0xdf,
-    0x7f,
-    0x64,
-    0xd9,
-    0xc3,
-    0x17,
-    0x12,
-    0xb0,
-    0xd5,
-    0x56,
-    0x37,
-    0xdd,
-    0xbd,
-    0x95,
-    0xd6,
-    0x23,
-    0xbf,
-    0x54,
-    0x85,
-    0x93,
-    0x35,
-    0xda,
-    0x7c,
-    0x55,
-    0x3d,
-    0x1c,
-    0xec,
-    0xa5,
-    0xaf,
-    0xe0,
-    0x92,
-    0x1c,
-    0x52,
-    0x22,
-    0x8b,
-    0x31,
-    0x4f,
-    0xb7,
-    0x6a,
-    0xff,
-    0xe5,
-    0x30,
-    0x88,
-    0x49,
-    0x5f,
-    0x01,
-    0x9b,
-    0xbb,
-    0x43,
-    0xe3,
-    0x8a,
-    0x72,
-    0xcd,
-    0x76,
-    0x80,
-    0xbf,
-    0x9b,
-    0x2b,
-    0x40,
-    0x28,
-    0xaa,
-    0x61,
-    0xb8,
-    0xb0,
-    0x81,
-    0xce,
-    0xd8,
-    0x59,
-    0xac,
-    0x21,
-    0xa4,
-    0xe6,
-    0x6c,
-    0xe5,
-    0x88,
-    0xe5,
-    0xad,
-    0xa9,
-    0xec,
-    0xed,
-    0x38,
-    0x5e,
-    0x09,
-    0x25,
-    0x2a,
-    0x00,
-    0xfb,
-    0x05,
-    0xa5,
-    0x79,
-    0x17,
-    0x61,
-    0xc5,
-    0xc2,
-    0x7e,
-    0xa3,
-    0xd6,
-    0x4b,
-    0xf2,
-    0x58,
-    0xc4,
-    0x9d,
-    0xe9,
-    0xee,
-    0xd2,
-    0x3e,
-    0xe0,
-    0xbb,
-    0x8f,
-    0xd4,
-    0xf2,
-    0x42,
-    0x07,
-    0x8e,
-    0xa9,
-    0xb2,
-    0x36,
-    0xc0,
-    0x14,
-    0xb0,
-    0xc2,
-    0xcd,
-    0x1a,
-    0x56,
-    0xe9,
-    0x4a,
-    0x0d,
-    0x7c,
-    0xb7,
-    0x60,
-    0x83,
-    0x36,
-    0x7d,
-    0x72,
-    0x61,
-    0x9d,
-    0x80,
-    0x00,
-    0x38,
-    0xd3,
-    0xee,
-    0xcc,
-    0xd5,
-    0x41,
-    0x16,
-    0x3b,
-    0x13,
-    0x23,
-    0xd7,
-    0xfd,
-    0xf4,
-    0x47,
-    0x59,
-    0xf0,
-    0xf0,
-    0x11,
-    0xfc,
-    0x42,
-    0x8d,
-    0xc3,
-    0x8e,
-    0xd7,
-    0x30,
-    0xfb,
-    0xc1,
-    0xea,
-    0x33,
-    0x7e,
-    0xdc,
-    0xf6,
-    0x37,
-    0x33,
-    0xb0,
-    0xd7,
-    0xbc,
-    0x73,
-    0xce,
-    0x2c,
-    0xef,
-    0x80,
-    0xf7,
-    0x01,
-    0xc2,
-    0x52,
-    0xd4,
-    0xab,
-    0x42,
-    0x9a,
-    0xe7,
-    0xf2,
-    0x26,
-    0x01,
-    0xc2,
-    0x76,
-    0xa3,
-    0xb0,
-    0x77,
-    0x4b,
-    0x88,
-    0x16,
-    0x4f,
-    0xe7,
-    0x86,
-    0xe5,
-    0xbf,
-    0x3e,
-    0xcf,
-    0x5e,
-    0x97,
-    0x2b,
-    0xe4,
-    0xcf,
-    0x7d,
-    0x12,
-    0xa7,
-    0x5a,
-    0x9a,
-    0xc4,
-    0xb8,
-    0xf7,
-    0x93,
-    0xa2,
-    0xfe,
-    0xbc,
-    0xbb,
-    0x06,
-    0x84,
-    0x5d,
-    0x87,
-    0xde,
-    0x87,
-    0xef,
-    0x42,
-    0x9a,
-    0xcd,
-    0xf1,
-    0x01,
-    0x49,
-    0x38,
-    0x8c,
-    0xda,
-    0xfe,
-    0x9a,
-    0x1a,
-    0x51,
-    0x79,
-    0xcb,
-    0xe6,
-    0x13,
-    0x03,
-    0xf9,
-    0x32,
-    0xe7,
-    0x9a,
-    0x40,
-    0x7f,
-    0xe1,
-    0x4e,
-    0x7a,
-    0x08,
-    0xd8,
-    0xeb,
-    0x59,
-    0x90,
-    0x1b,
-    0xd8,
-    0xb3,
-    0x5d,
-    0x60,
-    0x3f,
-    0x1c,
-    0x85,
-    0xfd,
-    0x6e,
-    0xba,
-    0x68,
-    0x5b,
-    0x7e,
-    0x55,
-    0x7e,
-    0xa7,
-    0x32,
-    0xae,
-    0x53,
-    0xca,
-    0x21,
-    0x12,
-    0xcf,
-    0x9c,
-    0x18,
-    0x2e,
-    0xbb,
-    0x54,
-    0xba,
-    0x25,
-    0x81,
-    0x44,
-    0x69,
-    0xe0,
-    0x33,
-    0xc3,
-    0x6a,
-    0xa6,
-    0xcf,
-    0x6a,
-    0x43,
-    0xec,
-    0xc2,
-    0x83,
-    0x68,
-    0x6e,
-    0xaa,
-    0xbe,
-    0x17,
-    0x7e,
-    0x60,
-    0x26,
-    0x81,
-    0x9c,
-    0x36,
-    0x54,
-    0x2a,
-    0x48,
-    0x7d,
-    0xe2,
-    0x92,
-    0x14,
-    0x4b,
-    0x23,
-    0x15,
-    0xfd,
-    0x7b,
-    0x11,
-    0x10,
-    0xfb,
-    0xf4,
-    0x87,
-    0x45,
-    0xd7,
-    0x2f,
-    0xb1,
-    0x81,
-    0x3d,
-    0xf3,
-    0xc0,
-    0x7c,
-    0x12,
-    0x63,
-    0xe2,
-    0x00,
-    0x07,
-    0x3b,
-    0x71,
-    0x4d,
-    0x6f,
-    0x57,
-    0x6a,
-    0xbd,
-    0x4e,
-    0x75,
-    0x22,
-    0xa4,
-    0xb2,
-    0x3b,
-    0x34,
-    0x7a,
-    0x46,
-    0x7c,
-    0xbe,
-    0x3c,
-    0x24,
-    0xb7,
-    0xcd,
-    0x0f,
-    0xeb,
-    0xe0,
-    0x15,
-    0x27,
-    0x11,
-    0x63,
-    0xe6,
-    0xe7,
-    0x7b,
-    0x67,
-    0x5b,
-    0x49,
-    0x4b,
-    0x4f,
-    0xd5,
-    0x81,
-    0xfa,
-    0x87,
-    0xa7,
-    0xdd,
-    0xa6,
-    0x7d,
-    0x13,
-    0xf0,
-    0xad,
-    0xed,
-    0x76,
-    0xef,
-    0x7a,
-    0x62,
-    0xbf,
-    0x5b,
-    0x9f,
-    0xfa,
-    0x25,
-    0xe0,
-    0x24,
-    0x69,
-    0x1a,
-    0x7e,
-    0x1f,
-    0x40,
-    0x7a,
-    0xe6,
-    0x85,
-    0x70,
-    0x09,
-    0x27,
-    0x40,
-    0x09,
-    0x1c,
-    0x89,
-    0x82,
-    0x48,
-    0x96,
-    0xb9,
-    0x58,
-    0xd1,
-    0x16,
-    0x27,
-    0x82,
-    0x39,
-    0x6f,
-    0xad,
-    0x82,
-    0xc7,
-    0x59,
-    0x71,
-    0xf3,
-    0x7c,
-    0x66,
-    0x0c,
-    0x1c,
-    0x50,
-    0x37,
-    0xec,
-    0xc5,
-    0xbf,
-    0xef,
-    0xf6,
-    0x49,
-    0x84,
-    0xe8,
-    0x70,
-    0xed,
-    0xa5,
-    0xa5,
-    0x1f,
-    0x70,
-    0xaf,
-    0x08,
-    0xac,
-    0xe4,
-    0x43,
-    0xc5,
-    0x4d,
-    0xbc,
-    0xd1,
-    0x17,
-    0xa1,
-    0x25,
-    0xa4,
-    0xb2,
-    0xdb,
-    0x9a,
-    0x1f,
-    0xf8,
-    0x22,
-    0xb2,
-    0x46,
-    0x6f,
-    0x38,
-    0x3d,
-    0x80,
-    0x73,
-    0x5a,
-    0x90,
-    0x9a,
-    0x28,
-    0x68,
-    0x1d,
-    0x10,
-    0xb3,
-    0x46,
-    0x47,
-    0x88,
-    0xaa,
-    0x82,
-    0x74,
-    0xa0,
-    0xc8,
-    0x37,
-    0x63,
-    0xe9,
-    0xe6,
-    0x31,
-    0xc0,
-    0x33,
-    0x26,
-    0x51,
-    0xf5,
-    0x0c,
-    0x72,
-    0x33,
-    0x44,
-    0x83,
-    0x25,
-    0x0f,
-    0x12,
-    0x32,
-    0x07,
-    0xdd,
-    0x86,
-    0x7b,
-    0x7f,
-    0xbd,
-    0x53,
-    0x11,
-    0x04,
-    0x95,
-    0xd2,
-    0xba,
-    0xd5,
-    0xfc,
-    0x54,
-    0x54,
-    0xea,
-    0x57,
-    0xb6,
-    0x16,
-    0x2a,
-    0x41,
-    0x36,
-    0x19,
-    0xde,
-    0x31,
-    0x84,
-    0x17,
-    0x66,
-    0x56,
-    0x1d,
-    0x72,
-    0x2a,
-    0xc6,
-    0xd4,
-    0x78,
-    0xd4,
-    0xd8,
-    0xb1,
-    0xe5,
-    0xbd,
-    0xce,
-    0xff,
-    0xa9,
-    0xa4,
-    0xb8,
-    0xa1,
-    0xec,
-    0xa6,
-    0x95,
-    0xa5,
-    0x50,
-    0x6a,
-    0xba,
-    0x1c,
-    0x76,
-    0x9d,
-    0x78,
-    0x28,
-    0xc3,
-    0x9e,
-    0xf9,
-    0x56,
-    0x64,
-    0x7a,
-    0x6b,
-    0x2e,
-    0x8f,
-    0x1a,
-    0x60,
-    0x09,
-    0x0c,
-    0xbb,
-    0x75,
-    0x23,
-    0xf5,
-    0x9f,
-    0x32,
-    0xf1,
-    0xba,
-    0x02,
-    0x32,
-    0xb5,
-    0x67,
-    0x50,
-    0x84,
-    0x4f,
-    0x2a,
-    0x95,
-    0x50,
-    0x56,
-    0x10,
-    0x35,
-    0xbe,
-    0x67,
-    0x0f,
-    0xdd,
-    0x13,
-    0xbd,
-    0x49,
-    0xb9,
-    0x1e,
-    0x02,
-    0x8f,
-    0xe8,
-    0xd2,
-    0x65,
-    0x24,
-    0x2d,
-    0x34,
-    0xed,
-    0xc4,
-    0xe7,
-    0x78,
-    0x0d,
-    0xe5,
-    0x43,
-    0x66,
-    0x78,
-    0x3d,
-    0xb0,
-    0x03,
-    0x36,
-    0x84,
-    0x93,
-    0x6e,
-    0xf8,
-    0x7b,
-    0x3c,
-    0x08,
-    0xa9,
-    0x2d,
-    0x19,
-    0xd7,
-    0x45,
-    0x75,
-    0x2a,
-    0x2d,
-    0xee,
-    0xc0,
-    0xb5,
-    0x84,
-    0x3d,
-    0x14,
-    0x3b,
-    0xad,
-    0xd6,
-    0x52,
-    0xaa,
-    0x2a,
-    0x3f,
-    0xb8,
-    0xd4,
-    0xd8,
-    0xf2,
-    0xa9,
-    0x20,
-    0xd1,
-    0xb0,
-    0xb1,
-    0x80,
-    0x90,
-    0x19,
-    0xc4,
-    0xa3,
-    0x56,
-    0x7a,
-    0xc6,
-    0x6b,
-    0xcd,
-    0xe6,
-    0x51,
-    0xa1,
-    0xeb,
-    0x88,
-    0xb2,
-    0xe8,
-    0x1a,
-    0x37,
-    0x34,
-    0xef,
-    0x96,
-    0x4b,
-    0xa2,
-    0xeb,
-    0x16,
-    0xaf,
-    0x07,
-    0x45,
-    0xae,
-    0x38,
-    0xb8,
-    0x8f,
-    0xf4,
-    0x35,
-    0x94,
-    0xbd,
-    0x62,
-    0x48,
-    0x8b,
-    0x92,
-    0xfb,
-    0x74,
-    0x5d,
-    0x58,
-    0x31,
-    0x76,
-    0xa4,
-    0xd4,
-    0x07,
-    0x59,
-    0x15,
-    0x79,
-    0x73,
-    0x45,
-    0x03,
-    0xdc,
-    0x06,
-    0x98,
-    0x24,
-    0x68,
-    0xce,
-    0x37,
-    0x98,
-    0x53,
-    0x7c,
-    0x27,
-    0x27,
-    0xd0,
-    0xc2,
-    0x57,
-    0xcb,
-    0x87,
-    0xff,
-    0xc0,
-    0x6e,
-    0x42,
-    0x1e,
-    0xb0,
-    0xf4,
-    0xe9,
-    0xbb,
-    0x63,
-    0x7c,
-    0xb0,
-    0x88,
-    0xd4,
-    0xe3,
-    0x8f,
-    0xf0,
-    0xd2,
-    0x8a,
-    0xf3,
-    0xfa,
-    0x56,
-    0x5a,
-    0xb3,
-    0x6f,
-    0x14,
-    0x05,
-    0x45,
-    0x3f,
-    0x50,
-    0x8e,
-    0x32,
-    0x21,
-    0xf3,
-    0x0b,
-    0xc7,
-    0x7a,
-    0xde,
-    0xaa,
-    0x0d,
-    0x80,
-    0x7e,
-    0xf2,
-    0xfc,
-    0x9f,
-    0xa1,
-    0x4b,
-    0xec,
-    0x1c,
-    0x88,
-    0xc1,
-    0x4c,
-    0xf8,
-    0x3d,
-    0x05,
-    0x96,
-    0x17,
-    0x27,
-    0xb4,
-    0x82,
-    0xa1,
-    0xdb,
-    0xdc,
-    0x7b,
-    0xa9,
-    0x35,
-    0xbd,
-    0x4f,
-    0x0c,
-    0xa8,
-    0xcc,
-    0x2a,
-    0x9c,
-    0xd2,
-    0xfe,
-    0xc5,
-    0x7e,
-    0x53,
-    0x42,
-    0xdb,
-    0xd1,
-    0xe0,
-    0x4f,
-    0xdd,
-    0x90,
-    0x93,
-    0xa1,
-    0xe6,
-    0xba,
-    0x85,
-    0xbe,
-    0xf1,
-    0xb0,
-    0x9f,
-    0xbe,
-    0x4a,
-    0xde,
-    0xad,
-    0x0a,
-    0x42,
-    0x9d,
-    0xb4,
-    0x64,
-    0x27,
-    0x58,
-    0x86,
-    0x28,
-    0x73,
-    0xee,
-    0x93,
-    0xd1,
-    0x44,
-    0x58,
-    0x02,
-    0xbe,
-    0x0c,
-    0x8c,
-    0x01,
-    0x37,
-    0x8a,
-    0xa1,
-    0x59,
-    0xab,
-    0xf9,
-    0x33,
-    0x45,
-    0x3b,
-    0x87,
-    0x09,
-    0x84,
-    0x7d,
-    0x08,
-    0xf5,
-    0xad,
-    0x79,
-    0xec,
-    0xfc,
-    0xc3,
-    0xf8,
-    0x6e,
-    0xb7,
-    0x09,
-    0xff,
-    0x0f,
-    0xf9,
-    0x17,
-    0x96,
-    0x43,
-    0xb3,
-    0x2e,
-    0xcd,
-    0x6a,
-    0x14,
-    0xc9,
-    0x01,
-    0x01,
-    0xf4,
-    0x74,
-    0x5c,
-    0x1a,
-    0x72,
-    0xe1,
-    0x9b,
-    0x09,
-    0xdc,
-    0x39,
-    0x14,
-    0x61,
-    0xd0,
-    0xb0,
-    0xf7,
-    0x1f,
-    0xa1,
-    0x5c,
-    0xd4,
-    0x24,
-    0xfc,
-    0x47,
-    0x5d,
-    0xe9,
-    0xcc,
-    0xc3,
-    0x6e,
-    0x6e,
-    0x5a,
-    0xfd,
-    0x4a,
-    0x73,
-    0xb9,
-    0xd5,
-    0x28,
-    0xeb,
-    0x61,
-    0xed,
-    0xee,
-    0xae,
-    0x1a,
-    0x00,
-    0x3c,
-    0x6e,
-    0x1c,
-    0x76,
-    0xac,
-    0xec,
-    0x74,
-    0x35,
-    0x58,
-    0x6b,
-    0xa9,
-    0xb9,
-    0x9d,
-    0x65,
-    0xa0,
-    0x67,
-    0x1f,
-    0x7e,
-    0xbd,
-    0x1e,
-    0x0d,
-    0xb6,
-    0x4b,
-    0x10,
-    0xa7,
-    0xe2,
-    0x1e,
-    0xd0,
-    0xfd,
-    0x5d,
-    0x76,
-    0xab,
-    0xf9,
-    0xfb,
-    0x27,
-    0x3c,
-    0x9f,
-    0x3e,
-    0xf7,
-    0x3b,
-    0x94,
-    0xcd,
-    0x48,
-    0x96,
-    0xdd,
-    0x21,
-    0xf7,
-    0xc3,
-    0xea,
-    0x82,
-    0x83,
-    0x54,
-    0xd3,
-    0x32,
-    0x72,
-    0xcc,
-    0xe1,
-    0xe8,
-    0xf0,
-    0xb1,
-    0x50,
-    0x7f,
-    0xba,
-    0xe2,
-    0x53,
-    0xf0,
-    0x3a,
-    0x2b,
-    0x59,
-    0x7e,
-    0xf3,
-    0x17,
-    0x8f,
-    0x30,
-    0x20,
-    0x05,
-    0xa6,
-    0x84,
-    0x98,
-    0x7e,
-    0xd6,
-    0x62,
-    0xf5,
-    0xc6,
-    0x23,
-    0x4f,
-    0xf5,
-    0xb1,
-    0xdf,
-    0xe3,
-    0x21,
-    0xb8,
-    0x70,
-    0x7d,
-    0xac,
-    0x4c,
-    0x53,
-    0x35,
-    0x9d,
-    0x6b,
-    0x61,
-    0x12,
-    0x31,
-    0x70,
-    0x51,
-    0x7e,
-    0x7a,
-    0x2f,
-    0x7f,
-    0xf6,
-    0x4d,
-    0x41,
-    0xeb,
-    0x06,
-    0x5b,
-    0x9d,
-    0x85,
-    0x75,
-    0x9e,
-    0x68,
-    0xa8,
-    0xbd,
-    0xf7,
-    0x0f,
-    0xe4,
-    0xbd,
-    0x15,
-    0x92,
-    0x00,
-    0xb2,
-    0x98,
-    0x23,
-    0x3f,
-    0x64,
-    0x76,
-    0xef,
-    0xe3,
-    0x9d,
-    0x9e,
-    0x3c,
-    0xf0,
-    0xdf,
-    0xdc,
-    0xb4,
-    0x32,
-    0x56,
-    0xfd,
-    0x00,
-    0x81,
-    0x0c,
-    0x33,
-    0x99,
-    0x44,
-    0x5c,
-    0xbb,
-    0xdb,
-    0x34,
-    0xa9,
-    0xbc,
-    0x5c,
-    0x63,
-    0x50,
-    0x73,
-    0x7b,
-    0x7c,
-    0xda,
-    0x8d,
-    0x3c,
-    0x4c,
-    0x77,
-    0xd4,
-    0x53,
-    0x81,
-    0xa8,
-    0x0e,
-    0x7e,
-    0xb2,
-    0x3b,
-    0x22,
-    0x18,
-    0xa0,
-    0x7c,
-    0x7d,
-    0xec,
-    0xbc,
-    0xaa,
-    0xb4,
-    0x47,
-    0xe9,
-    0xa8,
-    0x6b,
-    0x51,
-    0x82,
-    0xf5,
-    0x75,
-    0x9c,
-    0x9f,
-    0xde,
-    0x3d,
-    0xfe,
-    0x94,
-    0xf2,
-    0x64,
-    0x9c,
-    0xbb,
-    0xb7,
-    0xab,
-    0x48,
-    0x74,
-    0x9b,
-    0x14,
-    0x0d,
-    0x69,
-    0x2d,
-    0x44,
-    0x07,
-    0x17,
-    0x8d,
-    0x2c,
-    0x78,
-    0x8a,
-    0x21,
-    0xe8,
-    0x19,
-    0x67,
-    0x8a,
-    0xe7,
-    0xae,
-    0x30,
-    0xd7,
-    0x4d,
-    0xdd,
-    0xc4,
-    0xf8,
-    0x95,
-    0x40,
-    0x25,
-    0x75,
-    0x7b,
-    0xb9,
-    0x7e,
-    0x60,
-    0x19,
-    0x06,
-    0x65,
-    0x88,
-    0x50,
-    0x95,
-    0x5d,
-    0xef,
-    0x69,
-    0x99,
-    0x9f,
-    0x7e,
-    0xfc,
-    0x5d,
-    0x1a,
-    0xf8,
-    0x11,
-    0xd8,
-    0xb8,
-    0x2d,
-    0x86,
-    0x83,
-    0xe3,
-    0x70,
-    0xb1,
-    0x67,
-    0x48,
-    0x4a,
-    0x45,
-    0x7a,
-    0xda,
-    0x70,
-    0x7a,
-    0x2b,
-    0x1a,
-    0xf3,
-    0x68,
-    0x3c,
-    0x96,
-    0xb7,
-    0xb4,
-    0xd0,
-    0xb0,
-    0x26,
-    0x6f,
-    0xc5,
-    0xa1,
-    0x25,
-    0x3b,
-    0x43,
-    0xbe,
-    0x47,
-    0xb0,
-    0x95,
-    0xf9,
-    0x41,
-    0xfe,
-    0x38,
-    0xaa,
-    0x9f,
-    0xd3,
-    0x32,
-    0x90,
-    0xb5,
-    0x7f,
-    0xa5,
-    0x12,
-    0xd7,
-    0x56,
-    0xa4,
-    0xcb,
-    0xcd,
-    0x55,
-    0x45,
-    0x46,
-    0x81,
-    0x09,
-    0xf8,
-    0x06,
-    0xfb,
-    0xad,
-    0x17,
-    0xca,
-    0x8f,
-    0x93,
-    0xbe,
-    0x0f,
-    0x55,
-    0xc5,
-    0xdc,
-    0xd5,
-    0xda,
-    0xeb,
-    0x8a,
-    0xa6,
-    0x15,
-    0x6f,
-    0x9c,
-    0xd5,
-    0x9d,
-    0xe0,
-    0x76,
-    0x04,
-    0x19,
-    0x94,
-    0x22,
-    0xe8,
-    0xf7,
-    0x92,
-    0x9f,
-    0x51,
-    0x61,
-    0xae,
-    0x7b,
-    0x64,
-    0x6c,
-    0xf6,
-    0xa4,
-    0x2b,
-    0x93,
-    0x4d,
-    0x7b,
-    0x51,
-    0x65,
-    0x56,
-    0x2a,
-    0x26,
-    0x7a,
-    0x94,
-    0x37,
-    0xe9,
-    0xab,
-    0xcf,
-    0x5a,
-    0x47,
-    0x82,
-    0xb9,
-    0x8c,
-    0x1f,
-    0xf0,
-    0xd1,
-    0x61,
-    0x88,
-    0x3e,
-    0x88,
-    0x97,
-    0x15,
-    0x46,
-    0xa2,
-    0xef,
-    0x58,
-    0xe3,
-    0xe0,
-    0x3b,
-    0xa4,
-    0xa6,
-    0xdc,
-    0xb9,
-    0x17,
-    0xcb,
-    0x34,
-    0x9f,
-    0xd8,
-    0x6b,
-    0xea,
-    0xf7,
-    0x9e,
-    0xf3,
-    0x0b,
-    0xad,
-    0x72,
-    0xd4,
-    0x8f,
-    0xe7,
-    0xb5,
-    0x7c,
-    0x81,
-    0x94,
-    0x64,
-    0x86,
-    0x60,
-    0x48,
-    0x9b,
-    0x2d,
-    0xc4,
-    0x47,
-    0x58,
-    0x07,
-    0x44,
-    0xe0,
-    0x82,
-    0xf0,
-    0x98,
-    0xfc,
-    0x2a,
-    0x43,
-    0xfb,
-    0xf6,
-    0x10,
-    0x51,
-    0xd3,
-    0xad,
-    0x69,
-    0x0b,
-    0x94,
-    0xd8,
-    0xdf,
-    0x02,
-    0xe2,
-    0x9a,
-    0xda,
-    0x92,
-    0xf6,
-    0x57,
-    0xfe,
-    0x59,
-    0x42,
-    0xc5,
-    0xf5,
-    0xee,
-    0x58,
-    0x46,
-    0x6e,
-    0xd0,
-    0x08,
-    0x75,
-    0x65,
-    0x9d,
-    0xc8,
-    0xfe,
-    0xa5,
-    0x85,
-    0x5a,
-    0xb4,
-    0x8c,
-    0xfd,
-    0xa8,
-    0xdd,
-    0x0f,
-    0xb8,
-    0xf3,
-    0xd0,
-    0xfd,
-    0xd3,
-    0x2c,
-    0xc3,
-    0x88,
-    0x50,
-    0xa2,
-    0xde,
-    0x01,
-    0xc5,
-    0xde,
-    0x94,
-    0xe3,
-    0x55,
-    0xcb,
-    0x32,
-    0x13,
-    0xe0,
-    0x1b,
-    0xb8,
-    0x66,
-    0x77,
-    0xe5,
-    0xe9,
-    0x64,
-    0x13,
-    0x93,
-    0x9e,
-    0x4c,
-    0x86,
-    0xfb,
-    0x5f,
-    0x58,
-    0xb1,
-    0xcc,
-    0x34,
-    0x41,
-    0xf8,
-    0x2c,
-    0xb9,
-    0x06,
-    0xf3,
-    0x9f,
-    0x71,
-    0xea,
-    0x66,
-    0x2b,
-    0x5c,
-    0xbb,
-    0x74,
-    0xba,
-    0xcc,
-    0x5a,
-    0x0f,
-    0xbf,
-    0x74,
-    0x78,
-    0xb3,
-    0x1c,
-    0xc2,
-    0x9e,
-    0x54,
-    0x44,
-    0x6f,
-    0x70,
-    0x95,
-    0x9c,
-    0x54,
-    0x32,
-    0x3a,
-    0x28,
-    0x7f,
-    0x8b,
-    0xe0,
-    0x63,
-    0x86,
-    0x89,
-    0xeb,
-    0x6e,
-    0x1b,
-    0xe6,
-    0xc1,
-    0x6d,
-    0xe1,
-    0x8a,
-    0x36,
-    0x2f,
-    0x7e,
-    0x50,
-    0x46,
-    0x0d,
-    0xf2,
-    0x0d,
-    0x0a,
-    0x14,
-    0x27,
-    0xcf,
-    0xe5,
-    0x66,
-    0xc8,
-    0x62,
-    0xff,
-    0xdd,
-    0x57,
-    0x19,
-    0xf4,
-    0xf2,
-    0x7a,
-    0xca,
-    0xcd,
-    0xdd,
-    0x96,
-    0x1b,
-    0x2f,
-    0xfe,
-    0x9f,
-    0xfc,
-    0xd2,
-    0x7c,
-    0x2f,
-    0x75,
-    0x35,
-    0x2c,
-    0xd5,
-    0xa2,
-    0x90,
-    0xb4,
-    0xaf,
-    0xfc,
-    0x0b,
-    0xf0,
-    0x3b,
-    0xd9,
-    0x2d,
-    0x94,
-    0x6a,
-    0x37,
-    0x97,
-    0x13,
-    0xf6,
-    0xb5,
-    0xf2,
-    0xc0,
-    0xf6,
-    0xe2,
-    0x26,
-    0x33,
-    0xb0,
-    0xba,
-    0xcc,
-    0xef,
-    0xae,
-    0x6e,
-    0xe7,
-    0x42,
-    0x14,
-    0x64,
-    0xce,
-    0x6c,
-    0x30,
-    0x7f,
-    0x6d,
-    0x03,
-    0x53,
-    0xa0,
-    0xad,
-    0x95,
-    0xdf,
-    0x6d,
-    0x31,
-    0x90,
-    0xa2,
-    0x51,
-    0x43,
-    0x5f,
-    0x62,
-    0xc3,
-    0x0e,
-    0xd6,
-    0xb9,
-    0xcc,
-    0x0d,
-    0xd0,
-    0x24,
-    0xc3,
-    0xc3,
-    0x16,
-    0x56,
-    0x5c,
-    0xad,
-    0x83,
-    0xd2,
-    0xe1,
-    0x75,
-    0x66,
-    0xb8,
-    0xbe,
-    0x68,
-    0x28,
-    0xdf,
-    0x43,
-    0x2a,
-    0x2f,
-    0x25,
-    0xa6,
-    0xa8,
-    0x01,
-    0x03,
-    0x47,
-    0x4f,
-    0xad,
-    0x65,
-    0x38,
-    0x7c,
-    0x67,
-    0xb8,
-    0xfd,
-    0x33,
-    0x72,
-    0x44,
-    0x90,
-    0x13,
-    0x43,
-    0xbc,
-    0xa9,
-    0x89,
-    0xe3,
-    0x13,
-    0x3b,
-    0x45,
-    0x95,
-    0x92,
-    0x42,
-    0xea,
-    0xb9,
-    0x28,
-    0xbc,
-    0x0a,
-    0xf0,
-    0x01,
-    0xf5,
-    0x51,
-    0x81,
-    0x59,
-    0x08,
-    0x00,
-    0xfb,
-    0x93,
-    0xa3,
-    0x9d,
-    0x1c,
-    0x85,
-    0x0a,
-    0xe9,
-    0xf2,
-    0x17,
-    0x5f,
-    0x13,
-    0x40,
-    0x0c,
-    0x20,
-    0x2b,
-    0x23,
-    0x1f,
-    0xf1,
-    0xd9,
-    0xf5,
-    0x52,
-    0x9c,
-    0x4f,
-    0x72,
-    0x83,
-    0x56,
-    0x7c,
-    0x19,
-    0x40,
-    0x44,
-    0x83,
-    0xd5,
-    0xdc,
-    0x3d,
-    0x6b,
-    0xdd,
-    0xc2,
-    0xd2,
-    0x18,
-    0xd9,
-    0x0a,
-    0x8b,
-    0x7a,
-    0x46,
-    0x4a,
-    0x74,
-    0x04,
-    0x1b,
-    0xaf,
-    0xd8,
-    0x60,
-    0xad,
-    0x4c,
-    0x4d,
-    0x61,
-    0xd0,
-    0xb1,
-    0xf0,
-    0x39,
-    0x3f,
-    0xc0,
-    0xf2,
-    0xec,
-    0x3e,
-    0xbc,
-    0x54,
-    0x04,
-    0x7d,
-    0xa3,
-    0xee,
-    0x87,
-    0x40,
-    0xbe,
-    0xb6,
-    0x26,
-    0xbd,
-    0x76,
-    0x3f,
-    0xb7,
-    0xc5,
-    0x69,
-    0x80,
-    0xe5,
-    0xa7,
-    0xbd,
-    0xd7,
-    0x26,
-    0x52,
-    0xb4,
-    0x4e,
-    0xee,
-    0xb9,
-    0x81,
-    0x1c,
-    0x23,
-    0x7c,
-    0x5b,
-    0x6f,
-    0xd0,
-    0xc4,
-    0xcf,
-    0x68,
-    0x1d,
-    0x6e,
-    0x5a,
-    0x67,
-    0x7f,
-    0x6d,
-    0x37,
-    0x8a,
-    0x2c,
-    0x69,
-    0x76,
-    0x70,
-    0xd2,
-    0xac,
-    0x4e,
-    0x43,
-    0x88,
-    0x3f,
-    0xb4,
-    0xf5,
-    0x05,
-    0x50,
-    0x2c,
-    0xc9,
-    0x0f,
-    0xd7,
-    0xe0,
-    0x16,
-    0x37,
-    0x7a,
-    0xef,
-    0x48,
-    0xc4,
-    0xad,
-    0x07,
-    0x27,
-    0xed,
-    0x1d,
-    0x36,
-    0x5c,
-    0x4b,
-    0x4f,
-    0xfd,
-    0x30,
-    0x8d,
-    0x84,
-    0xa7,
-    0x98,
-    0x6e,
-    0xe1,
-    0xd8,
-    0x6f,
-    0xe4,
-    0xcc,
-    0x69,
-    0x02,
-    0x9a,
-    0x99,
-    0x73,
-    0xd1,
-    0xa1,
-    0x66,
-    0xaa,
-    0x94,
-    0x63,
-    0x43,
-    0xed,
-    0x7d,
-    0xd8,
-    0x97,
-    0x1b,
-    0xbd,
-    0xfc,
-    0xbf,
-    0x27,
-    0x49,
-    0x80,
-    0xf7,
-    0x6f,
-    0xde,
-    0xbf,
-    0x7e,
-    0x49,
-    0x42,
-    0xf5,
-    0xf5,
-    0xdf,
-    0xce,
-    0xab,
-    0x08,
-    0x3e,
-    0x29,
-    0x76,
-    0x51,
-    0xa9,
-    0x56,
-    0xe1,
-    0x79,
-    0x33,
-    0xf1,
-    0xa8,
-    0xa1,
-    0x8d,
-    0xb5,
-    0x27,
-    0x00,
-    0x1c,
-    0x42,
-    0x11,
-    0xcd,
-    0x4e,
-    0x1d,
-    0x65,
-    0x5f,
-    0x2f,
-    0xf9,
-    0x9e,
-    0x93,
-    0x37,
-    0x35,
-    0x2b,
-    0x6e,
-    0x66,
-    0xa5,
-    0x1e,
-    0x03,
-    0x94,
-    0x95,
-    0x28,
-    0x97,
-    0x02,
-    0x0b,
-    0xc5,
-    0x04,
-    0x34,
-    0x4d,
-    0xb4,
-    0x5b,
-    0x03,
-    0xa3,
-    0xaa,
-    0xcd,
-    0xee,
-    0x5e,
-    0x47,
-    0xcc,
-    0xb1,
-    0x19,
-    0x49,
-    0x6d,
-    0x19,
-    0x3f,
-    0x00,
-    0x11,
-    0x16,
-    0xce,
-    0x02,
-    0x44,
-    0x12,
-    0x5a,
-    0x1f,
-    0xe5,
-    0x81,
-    0x54,
-    0x97,
-    0x88,
-    0xb9,
-    0x8c,
-    0x8b,
-    0x18,
-    0x04,
-    0xf5,
-    0xb2,
-    0xc1,
-    0xf4,
-    0xa8,
-    0x4d,
-    0x0c,
-    0xf7,
-    0x2c,
-    0x5d,
-    0x4c,
-    0x2b,
-    0xf5,
-    0x13,
-    0x3a,
-    0x74,
-    0x2a,
-    0x88,
-    0xdc,
-    0xcb,
-    0xac,
-    0xae,
-    0xab,
-    0xd9,
-    0x53,
-    0x87,
-    0xf4,
-    0xc4,
-    0x7b,
-    0x94,
-    0x7f,
-    0x49,
-    0xbf,
-    0x91,
-    0x6f,
-    0x0b,
-    0x04,
-    0x5f,
-    0x69,
-    0x2a,
-    0xba,
-    0x42,
-    0xf8,
-    0x18,
-    0x5e,
-    0x4c,
-    0x30,
-    0xa8,
-    0x43,
-    0x19,
-    0x92,
-    0x68,
-    0x93,
-    0xbd,
-    0x30,
-    0x31,
-    0x90,
-    0xfb,
-    0x12,
-    0xfc,
-    0x20,
-    0xb8,
-    0xd7,
-    0xf7,
-    0x89,
-    0xae,
-    0x9f,
-    0xd9,
-    0x79,
-    0x65,
-    0x29,
-    0x72,
-    0x49,
-    0x5f,
-    0x39,
-    0x86,
-    0x82,
-    0x93,
-    0x3d,
-    0xdb,
-    0xa1,
-    0x1e,
-    0x2f,
-    0x91,
-    0x17,
-    0x34,
-    0xbd,
-    0xb2,
-    0x94,
-    0x5c,
-    0xa8,
-    0x0a,
-    0x85,
-    0xdd,
-    0x6a,
-    0x39,
-    0xdc,
-    0x73,
-    0x1b,
-    0x06,
-    0x0f,
-    0x47,
-    0x95,
-    0xf6,
-    0x63,
-    0x1e,
-    0xd7,
-    0x1e,
-    0x6a,
-    0xd1,
-    0xa7,
-    0x35,
-    0xca,
-    0xfd,
-    0x7c,
-    0xed,
-    0x41,
-    0xfb,
-    0x9a,
-    0x83,
-    0xe6,
-    0x13,
-    0x7f,
-    0x95,
-    0xb2,
-    0xec,
-    0x7e,
-    0x35,
-    0x3e,
-    0x47,
-    0xaa,
-    0x3b,
-    0xce,
-    0xed,
-    0xf5,
-    0xdf,
-    0x8f,
-    0xe6,
-    0x99,
-    0x87,
-    0x1d,
-    0xec,
-    0xb7,
-    0xdd,
-    0x48,
-    0x20,
-    0x3e,
-    0x25,
-    0x18,
-    0xfb,
-    0x0f,
-    0xce,
-    0x0f,
-    0x86,
-    0x5f,
-    0x46,
-    0xad,
-    0xce,
-    0x5c,
-    0x13,
-    0x3a,
-    0x92,
-    0x13,
-    0x20,
-    0xbf,
-    0x40,
-    0x91,
-    0x54,
-    0x56,
-    0x20,
-    0x48,
-    0x69,
-    0xa3,
-    0xce,
-    0xb5,
-    0xfc,
-    0xa3,
-    0xed,
-    0x40,
-    0xe0,
-    0xa4,
-    0x1a,
-    0x64,
-    0xb8,
-    0x95,
-    0x1f,
-    0x0f,
-    0xc5,
-    0x80,
-    0x69,
-    0x4c,
-    0xfc,
-    0x55,
-    0xbd,
-    0x1f,
-    0x5c,
-    0xe9,
-    0x26,
-    0xb0,
-    0x7e,
-    0x3e,
-    0x32,
-    0xac,
-    0x6e,
-    0x05,
-    0x5d,
-    0xe9,
-    0xb9,
-    0x61,
-    0xce,
-    0x49,
-    0xc7,
-    0xee,
-    0x41,
-    0xe0,
-    0x6b,
-    0x02,
-    0x45,
-    0x59,
-    0xb9,
-    0x33,
-    0xa7,
-    0x95,
-    0x18,
-    0x19,
-    0x2e,
-    0x96,
-    0x98,
-    0x55,
-    0x88,
-    0x9c,
-    0x85,
-    0xd1,
-    0x85,
-    0x8d,
-    0x3c,
-    0x4a,
-    0x83,
-    0x9a,
-    0x3d,
-    0x0c,
-    0x2a,
-    0x20,
-    0x82,
-    0xfd,
-    0x59,
-    0xcc,
-    0x0f,
-    0xdd,
-    0x5f,
-    0x03,
-    0xcb,
-    0xcc,
-    0x6f,
-    0x81,
-    0x8e,
-    0x0d,
-    0x4e,
-    0x40,
-    0x7b,
-    0x09,
-    0x4f,
-    0x9b,
-    0x90,
-    0x97,
-    0x81,
-    0xb3,
-    0x7b,
-    0x7a,
-    0x27,
-    0x12,
-    0xaf,
-    0x2b,
-    0x68,
-    0x8e,
-    0xb8,
-    0xda,
-    0x48,
-    0x70,
-    0xcb,
-    0xaf,
-    0xd7,
-    0xd6,
-    0xa2,
-    0x55,
-    0xa8,
-    0x56,
-    0x87,
-    0xb9,
-    0x85,
-    0xe4,
-    0xae,
-    0x0f,
-    0x61,
-    0xf6,
-    0xc7,
-    0x17,
-    0x8e,
-    0xe6,
-    0xd4,
-    0x9e,
-    0x31,
-    0x97,
-    0x38,
-    0x47,
-    0xf2,
-    0x5b,
-    0x11,
-    0x8b,
-    0xf8,
-    0x14,
-    0xc8,
-    0xff,
-    0x14,
-    0x9a,
-    0xe7,
-    0xd5,
-    0x3c,
-    0x5d,
-    0x2a,
-    0xa6,
-    0x3c,
-    0x4c,
-    0xd8,
-    0x6f,
-    0xa8,
-    0xf5,
-    0x53,
-    0xd9,
-    0x15,
-    0xed,
-    0xee,
-    0xbd,
-    0x88,
-    0x72,
-    0x00,
-    0xe7,
-    0x2f,
-    0x4f,
-    0x37,
-    0x1a,
-    0x4f,
-    0x00,
-    0x2e,
-    0x55,
-    0x7e,
-    0x17,
-    0x41,
-    0x55,
-    0x12,
-    0xde,
-    0xa0,
-    0x5b,
-    0xd9,
-    0x3e,
-    0xa2,
-    0x2f,
-    0x0b,
-    0xdf,
-    0x5c,
-    0x65,
-    0x7c,
-    0x91,
-    0x73,
-    0xdf,
-    0x16,
-    0xeb,
-    0x2e,
-    0x93,
-    0x87,
-    0x31,
-    0xcf,
-    0x8e,
-    0x37,
-    0x7b,
-    0x24,
-    0x39,
-    0x7d,
-    0x14,
-    0x59,
-    0xdc,
-    0x12,
-    0x21,
-    0x10,
-    0x60,
-    0xc6,
-    0x83,
-    0xb3,
-    0x59,
-    0x71,
-    0xfe,
-    0x09,
-    0x44,
-    0x2d,
-    0x9a,
-    0x08,
-    0x0c,
-    0xc2,
-    0x49,
-    0xeb,
-    0xd4,
-    0x62,
-    0xcb,
-    0x84,
-    0xf0,
-    0x97,
-    0xcf,
-    0xd2,
-    0x34,
-    0x79,
-    0x5b,
-    0xd6,
-    0x72,
-    0x24,
-    0x6d,
-    0xa3,
-    0x3e,
-    0x69,
-    0xe3,
-    0xb5,
-    0xf4,
-    0xc4,
-    0x98,
-    0x83,
-    0xfd,
-    0x8e,
-    0xd0,
-    0x57,
-    0x4d,
-    0x74,
-    0xd6,
-    0x5e,
-    0x30,
-    0x28,
-    0xe3,
-    0xfb,
-    0x47,
-    0x56,
-    0x42,
-    0x61,
-    0xcd,
-    0xda,
-    0xb2,
-    0x61,
-    0x1f,
-    0x30,
-    0x0c,
-    0x80,
-    0x7c,
-    0x2c,
-    0x25,
-    0x4d,
-    0x09,
-    0xeb,
-    0xf6,
-    0xf2,
-    0x18,
-    0x09,
-    0xfa,
-    0x08,
-    0xa9,
-    0x14,
-    0xd8,
-    0xb0,
-    0x31,
-    0x41,
-    0x42,
-    0xdf,
-    0x9b,
-    0x5e,
-    0x1d,
-    0xf9,
-    0x8d,
-    0x08,
-    0xe2,
-    0xa2,
-    0xec,
-    0x1e,
-    0x44,
-    0xd1,
-    0xa2,
-    0x76,
-    0x13,
-    0x25,
-    0x9f,
-    0xce,
-    0x60,
-    0x7d,
-    0x1d,
-    0x05,
-    0xe2,
-    0xc3,
-    0x29,
-    0x8b,
-    0x98,
-    0x08,
-    0x5f,
-    0x16,
-    0xb0,
-    0xd6,
-    0xf5,
-    0x96,
-    0xa8,
-    0xc1,
-    0xfb,
-    0x6c,
-    0xb3,
-    0x40,
-    0xe0,
-    0xd6,
-    0x5e,
-    0xbb,
-    0x39,
-    0xae,
-    0x73,
-    0xe5,
-    0xbe,
-    0x55,
-    0x1d,
-    0x4c,
-    0x95,
-    0xea,
-    0x4e,
-    0x2f,
-    0xd4,
-    0xbf,
-    0x5e,
-    0x8f,
-    0x41,
-    0x0d,
-    0xf5,
-    0x88,
-    0x5c,
-    0xe6,
-    0x2a,
-    0xe2,
-    0x9f,
-    0x6c,
-    0xec,
-    0xe4,
-    0x04,
-    0x41,
-    0xa1,
-    0x68,
-    0xc8,
-    0x3e,
-    0x0e,
-    0x35,
-    0x6e,
-    0x68,
-    0x77,
-    0x88,
-    0x08,
-    0x1f,
-    0x07,
-    0xf4,
-    0xb2,
-    0x99,
-    0x72,
-    0x6c,
-    0x5f,
-    0x8f,
-    0xd8,
-    0x9f,
-    0xd8,
-    0x36,
-    0xed,
-    0x84,
-    0x01,
-    0x71,
-    0x57,
-    0x35,
-    0x5e,
-    0x45,
-    0x57,
-    0x00,
-    0xd7,
-    0x8d,
-    0xac,
-    0xbb,
-    0xb8,
-    0xef,
-    0xb4,
-    0x59,
-    0xfc,
-    0x0e,
-    0xd5,
-    0xbb,
-    0xcb,
-    0x01,
-    0x1b,
-    0xc8,
-    0x41,
-    0x05,
-    0x22,
-    0xc0,
-    0x71,
-    0x6e,
-    0x37,
-    0xcd,
-    0xaa,
-    0xe4,
-    0xba,
-    0xdc,
-    0xf9,
-    0xcb,
-    0xc6,
-    0xaa,
-    0xee,
-    0x03,
-    0x15,
-    0x22,
-    0xa3,
-    0xd2,
-    0x1d,
-    0xe6,
-    0xfb,
-    0x1e,
-    0x7f,
-    0x2c,
-    0x28,
-    0xe0,
-    0xa2,
-    0xcb,
-    0x70,
-    0xd5,
-    0x9b,
-    0x95,
-    0x30,
-    0x77,
-    0x51,
-    0xe8,
-    0x21,
-    0x2b,
-    0xde,
-    0x80,
-    0xda,
-    0xbc,
-    0x38,
-    0x8f,
-    0x96,
-    0x08,
-    0x10,
-    0x10,
-    0x38,
-    0xf9,
-    0xfa,
-    0x58,
-    0x8c,
-    0xb7,
-    0xcf,
-    0xee,
-    0xd0,
-    0x1c,
-    0x4f,
-    0x9c,
-    0x73,
-    0x69,
-    0x0b,
-    0xc6,
-    0x1c,
-    0x37,
-    0x83,
-    0xfb,
-    0xee,
-    0xb0,
-    0x8b,
-    0xca,
-    0x0b,
-    0xfe,
-    0xf3,
-    0xd7,
-    0x56,
-    0x04,
-    0x66,
-    0x2e,
-    0x7e,
-    0x4c,
-    0x93,
-    0xd6,
-    0x38,
-    0x41,
-    0x8b,
-    0xaa,
-    0xcb,
-    0x9f,
-    0x6a,
-    0x64,
-    0xd2,
-    0x27,
-    0x3a,
-    0xfb,
-    0x3d,
-    0x97,
-    0x14,
-    0x2f,
-    0x9a,
-    0xd9,
-    0x88,
-    0x61,
-    0x93,
-    0x7b,
-    0x40,
-    0xa9,
-    0xb7,
-    0x5f,
-    0xdf,
-    0x23,
-    0x7d,
-    0xb4,
-    0x2f,
-    0x89,
-    0x85,
-    0x24,
-    0x7c,
-    0x07,
-    0x22,
-    0x4f,
-    0x3b,
-    0x4a,
-    0x16,
-    0x79,
-    0xf0,
-    0xdb,
-    0x9c,
-    0x7f,
-    0x4e,
-    0xab,
-    0xac,
-    0x10,
-    0x9f,
-    0xef,
-    0x7a,
-    0x19,
-    0x66,
-    0x2d,
-    0x40,
-    0x81,
-    0x43,
-    0x97,
-    0x3d,
-    0x17,
-    0x18,
-    0x99,
-    0xfd,
-    0xc9,
-    0x6a,
-    0xae,
-    0xdc,
-    0x16,
-    0x0a,
-    0x77,
-    0xc6,
-    0xc6,
-    0xf4,
-    0x0e,
-    0x40,
-    0xd8,
-    0x77,
-    0x98,
-    0xac,
-    0xbc,
-    0x96,
-    0x19,
-    0xc8,
-    0xc2,
-    0xaf,
-    0x8d,
-    0x79,
-    0xd3,
-    0x5a,
-    0x34,
-    0xc7,
-    0x5f,
-    0x94,
-    0x2d,
-    0x28,
-    0x96,
-    0x1d,
-    0x46,
-    0x01,
-    0xdb,
-    0x1e,
-    0x13,
-    0x6a,
-    0x75,
-    0x0f,
-    0x3d,
-    0x32,
-    0x88,
-    0xd8,
-    0x1d,
-    0x22,
-    0x44,
-    0x36,
-    0x89,
-    0x86,
-    0x5d,
-    0x61,
-    0xee,
-    0xea,
-    0xbb,
-    0xec,
-    0x9f,
-    0x22,
-    0x72,
-    0xec,
-    0x6d,
-    0x8d,
-    0xf4,
-    0x5c,
-    0x78,
-    0x9a,
-    0x86,
-    0xc0,
-    0x45,
-    0x8a,
-    0xf0,
-    0x09,
-    0x10,
-    0x78,
-    0x79,
-    0xb9,
-    0x63,
-    0x97,
-    0x12,
-    0x47,
-    0xe7,
-    0xbc,
-    0xd2,
-    0xc5,
-    0x7b,
-    0x1c,
-    0xa2,
-    0xc0,
-    0x83,
-    0x56,
-    0x3a,
-    0x68,
-    0x82,
-    0xb4,
-    0x4c,
-    0xf0,
-    0xec,
-    0xad,
-    0xfe,
-    0x38,
-    0x35,
-    0xaf,
-    0x9e,
-    0xaa,
-    0x2e,
-    0x1c,
-    0x91,
-    0x62,
-    0x91,
-    0x93,
-    0x8d,
-    0x91,
-    0xda,
-    0x70,
-    0x09,
-    0x23,
-    0x59,
-    0x96,
-    0xf1,
-    0x9f,
-    0x86,
-    0x6c,
-    0x9d,
-    0x4f,
-    0x94,
-    0x25,
-    0x04,
-    0xa2,
-    0x49,
-    0x45,
-    0x2d,
-    0xce,
-    0x0c,
-    0x60,
-    0xe7,
-    0xb9,
-    0x40,
-    0x25,
-    0xba,
-    0x1a,
-    0xd0,
-    0x9c,
-    0x1d,
-    0xdb,
-    0x0b,
-    0xac,
-    0xe9,
-    0xc3,
-    0xb3,
-    0xe0,
-    0x0e,
-    0x51,
-    0x50,
-    0x6b,
-    0x85,
-    0xeb,
-    0xca,
-    0x69,
-    0x86,
-    0x38,
-    0x37,
-    0x67,
-    0xfa,
-    0xca,
-    0xf2,
-    0x26,
-    0x33,
-    0x00,
-    0xed,
-    0x9c,
-    0xdb,
-    0x2a,
-    0x48,
-    0x3c,
-    0x2a,
-    0xef,
-    0x22,
-    0x77,
-    0x5c,
-    0xec,
-    0xaf,
-    0x83,
-    0x63,
-    0x9e,
-    0x8a,
-    0x5b,
-    0xd9,
-    0x82,
-    0x4d,
-    0x07,
-    0x38,
-    0x7a,
-    0x60,
-    0x1d,
-    0x4d,
-    0x73,
-    0x0e,
-    0x88,
-    0xea,
-    0x45,
-    0xde,
-    0x88,
-    0xdc,
-    0xda,
-    0x20,
-    0xfa,
-    0x1c,
-    0x93,
-    0xc6,
-    0xda,
-    0x4a,
-    0xe7,
-    0x75,
-    0x06,
-    0x56,
-    0x4e,
-    0xdc,
-    0x44,
-    0x81,
-    0x5d,
-    0x45,
-    0x87,
-    0x84,
-    0x32,
-    0x69,
-    0x6e,
-    0x0e,
-    0x12,
-    0x89,
-    0x0e,
-    0x74,
-    0x51,
-    0xba,
-    0xf1,
-    0xa4,
-    0x72,
-    0x81,
-    0x5e,
-    0x5c,
-    0x90,
-    0x9f,
-    0xdb,
-    0x99,
-    0xfd,
-    0x2e,
-    0xf1,
-    0x51,
-    0x28,
-    0xed,
-    0x2f,
-    0x64,
-    0xc4,
-    0xd9,
-    0x72,
-    0xd1,
-    0x26,
-    0xfd,
-    0x63,
-    0x25,
-    0xef,
-    0x8a,
-    0x40,
-    0x3a,
-    0xec,
-    0x2a,
-    0xe0,
-    0x1d,
-    0x3a,
-    0x92,
-    0xf1,
-    0x50,
-    0xae,
-    0x56,
-    0x85,
-    0x32,
-    0x73,
-    0x02,
-    0xcd,
-    0xbb,
-    0xf5,
-    0x66,
-    0x23,
-    0x6c,
-    0xfe,
-    0x31,
-    0x4e,
-    0x86,
-    0x1f,
-    0xc2,
-    0x02,
-    0x7b,
-    0x52,
-    0x3a,
-    0xa7,
-    0xa2,
-    0xdd,
-    0xd6,
-    0x5b,
-    0x2e,
-    0x7a,
-    0x7c,
-    0x3a,
-    0x61,
-    0xb4,
-    0x93,
-    0xdd,
-    0xfd,
-    0x94,
-    0x18,
-    0x20,
-    0xfc,
-    0x7d,
-    0xee,
-    0x29,
-    0x80,
-    0x55,
-    0x76,
-    0xa6,
-    0x0d,
-    0xe5,
-    0x60,
-    0x55,
-    0xf6,
-    0x83,
-    0xc1,
-    0xca,
-    0x15,
-    0xee,
-    0x65,
-    0x6d,
-    0xbf,
-    0x79,
-    0x66,
-    0xc2,
-    0xf7,
-    0x6c,
-    0xfd,
-    0xed,
-    0xe2,
-    0xa7,
-    0x99,
-    0x75,
-    0x7c,
-    0x88,
-    0x2e,
-    0x48,
-    0x88,
-    0x0f,
-    0xd0,
-    0xff,
-    0xcd,
-    0x40,
-    0x80,
-    0x64,
-    0x7f,
-    0xc9,
-    0x46,
-    0x31,
-    0xfc,
-    0xe5,
-    0x80,
-    0x1b,
-    0xb9,
-    0x80,
-    0x79,
-    0x0f,
-    0x7b,
-    0x9c,
-    0x3d,
-    0xbc,
-    0xca,
-    0xf3,
-    0xac,
-    0x51,
-    0xa2,
-    0xde,
-    0xce,
-    0x88,
-    0x6d,
-    0x75,
-    0x66,
-    0xe3,
-    0x2e,
-    0xf8,
-    0xca,
-    0x35,
-    0xff,
-    0x6e,
-    0xf1,
-    0x65,
-    0xbd,
-    0x8b,
-    0xce,
-    0x6f,
-    0x02,
-    0xd7,
-    0xdc,
-    0xab,
-    0x53,
-    0x0d,
-    0xfb,
-    0x52,
-    0x9b,
-    0xc1,
-    0x7a,
-    0x3e,
-    0xd8,
-    0x46,
-    0x75,
-    0xf1,
-    0x15,
-    0xcf,
-    0x61,
-    0xd9,
-    0x98,
-    0xd4,
-    0xe5,
-    0xd3,
-    0x5c,
-    0xb8,
-    0xeb,
-    0xed,
-    0xc2,
-    0xa8,
-    0xf8,
-    0x70,
-    0x83,
-    0xc6,
-    0xb8,
-    0x1e,
-    0xe9,
-    0x87,
-    0xde,
-    0xb8,
-    0x3f,
-    0x59,
-    0x2b,
-    0xc3,
-    0x86,
-    0x8a,
-    0xcb,
-    0x8c,
-    0x69,
-    0x65,
-    0xe8,
-    0x6a,
-    0x73,
-    0x9e,
-    0x7a,
-    0x43,
-    0x80,
-    0xf0,
-    0x5c,
-    0x51,
-    0x71,
-    0x04,
-    0xa5,
-    0x26,
-    0x24,
-    0x95,
-    0x35,
-    0xee,
-    0xa4,
-    0xd2,
-    0x8e,
-    0xf5,
-    0x9c,
-    0x03,
-    0xe6,
-    0x69,
-    0x12,
-    0x70,
-    0x7a,
-    0x60,
-    0x51,
-    0x7e,
-    0x24,
-    0x1c,
-    0x27,
-    0x1c,
-    0x30,
-    0x8e,
-    0x51,
-    0x5d,
-    0x6c,
-    0x1a,
-    0x34,
-    0x66,
-    0x7e,
-    0x9a,
-    0xce,
-    0x8b,
-    0x7a,
-    0xa5,
-    0xeb,
-    0xb5,
-    0xb4,
-    0x11,
-    0x9c,
-    0x07,
-    0xd3,
-    0xb6,
-    0xe5,
-    0xc1,
-    0x27,
-    0x75,
-    0xb6,
-    0x64,
-    0x3d,
-    0x7a,
-    0x1c,
-    0x17,
-    0xb0,
-    0xbd,
-    0xb9,
-    0x49,
-    0x41,
-    0xcf,
-    0x72,
-    0x98,
-    0x2a,
-    0xd3,
-    0x67,
-    0xf1,
-    0xb0,
-    0xca,
-    0x28,
-    0xf9
-  ],
-  const [
-    0x38,
-    0x32,
-    0x42,
-    0xc7,
-    0x09,
-    0xfe,
-    0x5f,
-    0x2c,
-    0xe7,
-    0x82,
-    0xbf,
-    0x8c,
-    0x83,
-    0xb6,
-    0x45,
-    0xd1,
-    0x71,
-    0xf2,
-    0xbd,
-    0x23,
-    0x8a,
-    0xbc,
-    0x65,
-    0x5d,
-    0x8f,
-    0xdf,
-    0xac,
-    0xbd,
-    0x0f,
-    0xbd,
-    0x39,
-    0xdf,
-    0x8a,
-    0xe5,
-    0x2f,
-    0xec,
-    0xd6,
-    0xe8,
-    0xb0,
-    0x0f,
-    0xc2,
-    0x69,
-    0xa0,
-    0x28,
-    0xfa,
-    0x74,
-    0xab,
-    0xc5,
-    0x2a,
-    0x11,
-    0x89,
-    0x4e,
-    0x66,
-    0x18,
-    0x80,
-    0x7f,
-    0xca,
-    0x46,
-    0x2b,
-    0x1b,
-    0x5d,
-    0x91,
-    0x7b,
-    0xdf,
-    0x3b,
-    0xb9,
-    0xfb,
-    0xb5,
-    0xf4,
-    0x20,
-    0x58,
-    0x2b,
-    0x2f,
-    0xdb,
-    0x20,
-    0x23,
-    0x93,
-    0x09,
-    0xca,
-    0xcc,
-    0xe7,
-    0x63,
-    0xf7,
-    0xd1,
-    0x77,
-    0x15,
-    0xf7,
-    0xd0,
-    0xba,
-    0xcd,
-    0x8f,
-    0x0d,
-    0x33,
-    0x11,
-    0xf9,
-    0x68,
-    0x95,
-    0xd5,
-    0x2d,
-    0x8c,
-    0x2a,
-    0x4d,
-    0x5f,
-    0x6a,
-    0x75,
-    0x00,
-    0xc9,
-    0xe6,
-    0x17,
-    0x1e,
-    0xaa,
-    0xcf,
-    0xef,
-    0x13,
-    0x8f,
-    0x15,
-    0x85,
-    0x5c,
-    0xd1,
-    0x36,
-    0xa9,
-    0x99,
-    0x5f,
-    0xfa,
-    0x57,
-    0xe4,
-    0xbd,
-    0x60,
-    0xde,
-    0x62,
-    0x4d,
-    0xd8,
-    0x41,
-    0x17,
-    0xce,
-    0xb2,
-    0xde,
-    0xff,
-    0x22,
-    0xd7,
-    0x4d,
-    0x5a,
-    0x54,
-    0xb7,
-    0x8b,
-    0x47,
-    0xd9,
-    0x82,
-    0x58,
-    0x94,
-    0x16,
-    0x9b,
-    0xdd,
-    0xd5,
-    0x23,
-    0x4a,
-    0x92,
-    0xb3,
-    0xcf,
-    0xb1,
-    0x5f,
-    0x87,
-    0xe4,
-    0x01,
-    0x02,
-    0x28,
-    0xac,
-    0xed,
-    0xb0,
-    0x00,
-    0xb3,
-    0x5f,
-    0xff,
-    0x66,
-    0xcf,
-    0x6a,
-    0x03,
-    0x28,
-    0x5e,
-    0x81,
-    0xb7,
-    0x66,
-    0xcf,
-    0xe6,
-    0x9f,
-    0xa7,
-    0x64,
-    0x64,
-    0xac,
-    0x26,
-    0x35,
-    0x41,
-    0x60,
-    0x6d,
-    0x79,
-    0x6f,
-    0x32,
-    0x25,
-    0x01,
-    0x02,
-    0x34,
-    0x2d,
-    0x05,
-    0xe7,
-    0xf3,
-    0xe9,
-    0x23,
-    0xd2,
-    0x9f,
-    0xdd,
-    0xa5,
-    0x78,
-    0x6c,
-    0x7a,
-    0x03,
-    0xff,
-    0x37,
-    0x37,
-    0xa8,
-    0xb2,
-    0x6d,
-    0xe4,
-    0xf9,
-    0xfa,
-    0x29,
-    0x3b,
-    0x94,
-    0x89,
-    0x9c,
-    0xb9,
-    0xd5,
-    0xd9,
-    0xb2,
-    0xac,
-    0x9f,
-    0xd5,
-    0xf2,
-    0x8c,
-    0x59,
-    0xd6,
-    0xa7,
-    0x8e,
-    0x36,
-    0xd0,
-    0x3d,
-    0x77,
-    0xba,
-    0xce,
-    0xed,
-    0xae,
-    0x7a,
-    0x9b,
-    0x9d,
-    0x96,
-    0x23,
-    0xc2,
-    0x01,
-    0x1a,
-    0xbd,
-    0xb9,
-    0x07,
-    0x8a,
-    0x31,
-    0x5a,
-    0x72,
-    0xa5,
-    0x09,
-    0x92,
-    0xc4,
-    0xf7,
-    0x78,
-    0x5d,
-    0x62,
-    0x65,
-    0x9a,
-    0xf2,
-    0xf3,
-    0x06,
-    0xfc,
-    0x3a,
-    0x09,
-    0x34,
-    0x5f,
-    0x87,
-    0x03,
-    0xe3,
-    0xb9,
-    0x83,
-    0x32,
-    0x32,
-    0x7d,
-    0x67,
-    0x3a,
-    0x40,
-    0x1c,
-    0x6d,
-    0xbb,
-    0x41,
-    0xcc,
-    0x87,
-    0x31,
-    0xd1,
-    0x88,
-    0x51,
-    0x19,
-    0x87,
-    0x58,
-    0x44,
-    0x56,
-    0xce,
-    0xd2,
-    0x2d,
-    0xd2,
-    0xf0,
-    0xe1,
-    0xde,
-    0x68,
-    0x74,
-    0xc5,
-    0x24,
-    0x02,
-    0xaa,
-    0x5b,
-    0xf9,
-    0xfe,
-    0x84,
-    0x9f,
-    0xfa,
-    0xd7,
-    0xa7,
-    0x6f,
-    0x1b,
-    0x01,
-    0xc2,
-    0x92,
-    0x99,
-    0x14,
-    0x1f,
-    0xf8,
-    0x30,
-    0x2d,
-    0x78,
-    0x43,
-    0x8f,
-    0x91,
-    0x0b,
-    0x87,
-    0x09,
-    0x94,
-    0xf0,
-    0x4e,
-    0x8d,
-    0xba,
-    0xab,
-    0xe0,
-    0xd8,
-    0x1b,
-    0xfe,
-    0xc1,
-    0xe9,
-    0x0c,
-    0x01,
-    0x7a,
-    0xb5,
-    0xfb,
-    0x74,
-    0x9c,
-    0x1d,
-    0x9b,
-    0x53,
-    0x03,
-    0x1d,
-    0x42,
-    0xab,
-    0x58,
-    0x46,
-    0x8f,
-    0xad,
-    0xd9,
-    0x6e,
-    0x4f,
-    0x00,
-    0x5d,
-    0xa6,
-    0xa1,
-    0x5c,
-    0x92,
-    0x6c,
-    0x59,
-    0x55,
-    0x8a,
-    0x22,
-    0xa3,
-    0x74,
-    0x76,
-    0xbf,
-    0xe9,
-    0x8c,
-    0xb1,
-    0xc5,
-    0xf6,
-    0x4b,
-    0x00,
-    0x73,
-    0x5b,
-    0x10,
-    0x18,
-    0x3b,
-    0x11,
-    0xfc,
-    0x60,
-    0x76,
-    0x61,
-    0x4c,
-    0xf9,
-    0x57,
-    0x01,
-    0xe6,
-    0xfc,
-    0x1d,
-    0x80,
-    0x31,
-    0x02,
-    0x8d,
-    0xe3,
-    0x2a,
-    0xea,
-    0xa0,
-    0x91,
-    0xb5,
-    0xd6,
-    0x79,
-    0x6c,
-    0x30,
-    0x77,
-    0x99,
-    0x41,
-    0x4e,
-    0x8b,
-    0x56,
-    0x62,
-    0x23,
-    0xa3,
-    0x89,
-    0x91,
-    0x7b,
-    0x2a,
-    0x88,
-    0x20,
-    0x70,
-    0xa3,
-    0x54,
-    0x57,
-    0x3c,
-    0x32,
-    0x13,
-    0x16,
-    0x4b,
-    0x5e,
-    0xc0,
-    0xbb,
-    0x95,
-    0x15,
-    0x21,
-    0x46,
-    0x2a,
-    0xf0,
-    0xf9,
-    0xbc,
-    0x0e,
-    0xb9,
-    0x80,
-    0xc9,
-    0x48,
-    0x2b,
-    0x10,
-    0xa8,
-    0x36,
-    0xf8,
-    0x21,
-    0x48,
-    0x23,
-    0x11,
-    0x77,
-    0xa7,
-    0x1b,
-    0x21,
-    0x9a,
-    0x82,
-    0xfe,
-    0x5a,
-    0x87,
-    0x31,
-    0xd4,
-    0x75,
-    0xa5,
-    0xcd,
-    0x60,
-    0xf4,
-    0xfa,
-    0x93,
-    0xf8,
-    0xab,
-    0x9f,
-    0x8d,
-    0x94,
-    0x7e,
-    0x71,
-    0x6f,
-    0x24,
-    0x6c,
-    0x0a,
-    0xbf,
-    0x27,
-    0xcd,
-    0xf0,
-    0x38,
-    0x79,
-    0xd7,
-    0x0b,
-    0x71,
-    0x6c,
-    0x67,
-    0x5d,
-    0xba,
-    0x1b,
-    0xff,
-    0xed,
-    0x46,
-    0xfb,
-    0x0a,
-    0x04,
-    0x90,
-    0xb3,
-    0x68,
-    0x9c,
-    0xf7,
-    0x2e,
-    0x26,
-    0x16,
-    0xab,
-    0xee,
-    0x8d,
-    0x2b,
-    0xcd,
-    0xa3,
-    0x5f,
-    0x25,
-    0xd2,
-    0xfc,
-    0x5d,
-    0x4f,
-    0x29,
-    0xbd,
-    0x0c,
-    0xaa,
-    0x1d,
-    0x12,
-    0xb9,
-    0xe1,
-    0xfc,
-    0x22,
-    0xbb,
-    0x7f,
-    0x79,
-    0xe8,
-    0xf8,
-    0x60,
-    0x4f,
-    0x3e,
-    0xab,
-    0x65,
-    0x27,
-    0x3b,
-    0x64,
-    0x6c,
-    0xbc,
-    0xbf,
-    0x50,
-    0x80,
-    0x3d,
-    0x4c,
-    0xba,
-    0x4c,
-    0xf3,
-    0x18,
-    0xd2,
-    0xd6,
-    0x23,
-    0x60,
-    0xad,
-    0x6a,
-    0x36,
-    0xfe,
-    0x8e,
-    0xd3,
-    0x17,
-    0x3e,
-    0x64,
-    0xd2,
-    0xdd,
-    0xee,
-    0x93,
-    0xc8,
-    0xaa,
-    0xb4,
-    0xf7,
-    0xb6,
-    0xd2,
-    0xa5,
-    0x26,
-    0x67,
-    0x40,
-    0x12,
-    0xf6,
-    0xec,
-    0x16,
-    0xa5,
-    0x40,
-    0x49,
-    0x94,
-    0xad,
-    0xe3,
-    0x6e,
-    0x3b,
-    0xb7,
-    0x0b,
-    0x69,
-    0x32,
-    0x5e,
-    0xb3,
-    0xd9,
-    0xe8,
-    0x64,
-    0x68,
-    0xa6,
-    0xfb,
-    0x01,
-    0x50,
-    0xef,
-    0x59,
-    0x7a,
-    0x6c,
-    0x44,
-    0xa5,
-    0xf6,
-    0x1a,
-    0x16,
-    0xdc,
-    0x8e,
-    0xde,
-    0x6b,
-    0x38,
-    0xa3,
-    0x61,
-    0xd6,
-    0x54,
-    0x74,
-    0xba,
-    0xa7,
-    0x92,
-    0xef,
-    0xed,
-    0x5f,
-    0xba,
-    0xc8,
-    0xb1,
-    0x67,
-    0xe3,
-    0xc9,
-    0x77,
-    0x01,
-    0x97,
-    0x69,
-    0xa7,
-    0x7e,
-    0x32,
-    0x9f,
-    0x2d,
-    0xb2,
-    0x8b,
-    0xf8,
-    0x34,
-    0xa5,
-    0xd6,
-    0xe8,
-    0x31,
-    0x8b,
-    0xc9,
-    0x5d,
-    0x24,
-    0xf6,
-    0xfe,
-    0x9a,
-    0x1b,
-    0x4b,
-    0x99,
-    0x43,
-    0xf7,
-    0x72,
-    0x2a,
-    0xb4,
-    0x72,
-    0xd2,
-    0xd5,
-    0x97,
-    0x61,
-    0x7d,
-    0xb0,
-    0xb6,
-    0x37,
-    0xa7,
-    0x6c,
-    0x0d,
-    0xcb,
-    0x5d,
-    0x38,
-    0x24,
-    0x5b,
-    0x74,
-    0xe2,
-    0x9c,
-    0xd0,
-    0xbf,
-    0x3f,
-    0x07,
-    0x43,
-    0x85,
-    0xce,
-    0xfd,
-    0xc1,
-    0x31,
-    0x98,
-    0x6c,
-    0x4b,
-    0x4c,
-    0x5a,
-    0x2f,
-    0x21,
-    0xa9,
-    0xe6,
-    0xe2,
-    0x41,
-    0xdf,
-    0xc7,
-    0xf5,
-    0x2a,
-    0xfc,
-    0x24,
-    0x00,
-    0xe5,
-    0x78,
-    0xe7,
-    0x56,
-    0x46,
-    0x68,
-    0x1d,
-    0xdd,
-    0x70,
-    0xf4,
-    0xa0,
-    0x1d,
-    0x97,
-    0x0b,
-    0xf4,
-    0x96,
-    0x0a,
-    0x56,
-    0x70,
-    0x57,
-    0x70,
-    0x6a,
-    0x9e,
-    0xcc,
-    0x51,
-    0x41,
-    0xe4,
-    0xd8,
-    0xd9,
-    0xeb,
-    0x63,
-    0x23,
-    0xd9,
-    0x81,
-    0x1f,
-    0xb6,
-    0x0f,
-    0x5b,
-    0x60,
-    0xc5,
-    0xa7,
-    0x82,
-    0x59,
-    0xcb,
-    0x01,
-    0x68,
-    0x08,
-    0xdd,
-    0xb5,
-    0xd7,
-    0x5d,
-    0x37,
-    0xd5,
-    0x28,
-    0x9e,
-    0x1c,
-    0x72,
-    0xb5,
-    0x0a,
-    0xdd,
-    0x61,
-    0x91,
-    0xbd,
-    0x37,
-    0x3e,
-    0x76,
-    0xd3,
-    0xe1,
-    0xb2,
-    0xfe,
-    0xd0,
-    0x66,
-    0xf2,
-    0x16,
-    0x40,
-    0x31,
-    0x88,
-    0xb0,
-    0x9a,
-    0xe6,
-    0x56,
-    0xb9,
-    0x6a,
-    0xf9,
-    0xd8,
-    0x4b,
-    0xaf,
-    0x79,
-    0xa9,
-    0x23,
-    0x82,
-    0x2c,
-    0x49,
-    0x55,
-    0xf9,
-    0xe1,
-    0x1d,
-    0x3e,
-    0x4b,
-    0x02,
-    0xb7,
-    0xbb,
-    0x35,
-    0x69,
-    0x58,
-    0x98,
-    0x9c,
-    0x74,
-    0xb3,
-    0x4c,
-    0x73,
-    0x5c,
-    0xf4,
-    0xe3,
-    0xdf,
-    0xc2,
-    0x01,
-    0x3b,
-    0x99,
-    0x8b,
-    0x00,
-    0x73,
-    0x95,
-    0xee,
-    0x19,
-    0xa1,
-    0xe1,
-    0xcb,
-    0x7d,
-    0xc3,
-    0xcf,
-    0x3f,
-    0xa7,
-    0xf9,
-    0x56,
-    0x75,
-    0xe2,
-    0xf1,
-    0xb6,
-    0xbf,
-    0x0b,
-    0xa2,
-    0x5b,
-    0xe5,
-    0x98,
-    0x3d,
-    0x04,
-    0xbd,
-    0xd9,
-    0x60,
-    0x24,
-    0xfb,
-    0x7e,
-    0x8d,
-    0x88,
-    0x4b,
-    0x5a,
-    0xdc,
-    0x3b,
-    0x9d,
-    0x66,
-    0xec,
-    0xa7,
-    0xc0,
-    0x09,
-    0x1f,
-    0xfc,
-    0x33,
-    0x96,
-    0x07,
-    0xd6,
-    0x38,
-    0x17,
-    0x1b,
-    0x1a,
-    0x29,
-    0x49,
-    0xaf,
-    0x20,
-    0x0f,
-    0xe7,
-    0x23,
-    0x18,
-    0x71,
-    0x2b,
-    0x5a,
-    0xa6,
-    0x6a,
-    0x93,
-    0x6d,
-    0xd0,
-    0xfe,
-    0xe1,
-    0xa1,
-    0x1a,
-    0xae,
-    0x65,
-    0x97,
-    0xef,
-    0x4a,
-    0x7e,
-    0xc3,
-    0x43,
-    0x07,
-    0x5f,
-    0x1f,
-    0x77,
-    0xd2,
-    0x0f,
-    0x21,
-    0x7d,
-    0xe3,
-    0xb3,
-    0xea,
-    0x3c,
-    0x94,
-    0x10,
-    0xc0,
-    0x36,
-    0x74,
-    0x4c,
-    0xbe,
-    0x68,
-    0x97,
-    0xf4,
-    0xca,
-    0x71,
-    0x31,
-    0x44,
-    0xc8,
-    0xf7,
-    0x63,
-    0xa2,
-    0x0d,
-    0x47,
-    0x55,
-    0x6b,
-    0x17,
-    0x3b,
-    0x85,
-    0xf2,
-    0x7b,
-    0x61,
-    0x5f,
-    0xc6,
-    0x1e,
-    0x59,
-    0x0d,
-    0x34,
-    0xa8,
-    0x7f,
-    0x90,
-    0x0d,
-    0x36,
-    0xcb,
-    0x10,
-    0xaa,
-    0x50,
-    0xf5,
-    0x70,
-    0x2c,
-    0x1a,
-    0xdc,
-    0x26,
-    0x08,
-    0xce,
-    0x28,
-    0x4a,
-    0xc4,
-    0x69,
-    0x2e,
-    0xec,
-    0xfb,
-    0xa5,
-    0x15,
-    0xab,
-    0xa7,
-    0x28,
-    0x37,
-    0x83,
-    0xa0,
-    0xfb,
-    0xca,
-    0xe7,
-    0x5f,
-    0x3d,
-    0xc0,
-    0x10,
-    0x08,
-    0x19,
-    0xeb,
-    0x94,
-    0xa8,
-    0xf5,
-    0x65,
-    0x3a,
-    0xba,
-    0xec,
-    0x2f,
-    0x0d,
-    0xf1,
-    0x7f,
-    0x18,
-    0xaf,
-    0x31,
-    0x87,
-    0xe1,
-    0xf0,
-    0xde,
-    0x6e,
-    0x9e,
-    0x9f,
-    0x5a,
-    0x9f,
-    0x5f,
-    0xa1,
-    0xc9,
-    0x3b,
-    0x10,
-    0x3f,
-    0x18,
-    0x0e,
-    0x9e,
-    0xc4,
-    0x3d,
-    0xc1,
-    0x5c,
-    0x48,
-    0xc0,
-    0x51,
-    0xa4,
-    0xc7,
-    0x7a,
-    0xc0,
-    0xc1,
-    0x76,
-    0x9d,
-    0x0a,
-    0x0c,
-    0x56,
-    0xf4,
-    0x5a,
-    0x56,
-    0x09,
-    0x6c,
-    0x7e,
-    0x86,
-    0xe5,
-    0xd4,
-    0x98,
-    0x83,
-    0x47,
-    0xe1,
-    0x17,
-    0x55,
-    0x29,
-    0x75,
-    0xe6,
-    0x87,
-    0xf7,
-    0x20,
-    0xe3,
-    0xcf,
-    0x9f,
-    0xe8,
-    0x93,
-    0xf1,
-    0xe8,
-    0x45,
-    0x14,
-    0xe0,
-    0x04,
-    0x70,
-    0x53,
-    0x26,
-    0x68,
-    0xdd,
-    0x7f,
-    0x87,
-    0xdb,
-    0x06,
-    0xbd,
-    0xe1,
-    0xcd,
-    0x6b,
-    0x1d,
-    0x57,
-    0xeb,
-    0xd7,
-    0xcc,
-    0xae,
-    0xf0,
-    0xe4,
-    0x8c,
-    0xf7,
-    0xbe,
-    0xc1,
-    0x62,
-    0x6f,
-    0xad,
-    0x33,
-    0x8e,
-    0xa3,
-    0x23,
-    0xda,
-    0xc0,
-    0xd8,
-    0x65,
-    0xb6,
-    0x89,
-    0xa9,
-    0xac,
-    0xea,
-    0x10,
-    0xf2,
-    0x7c,
-    0xbf,
-    0x06,
-    0xed,
-    0x31,
-    0xeb,
-    0xdc,
-    0x9b,
-    0xdb,
-    0x14,
-    0x33,
-    0x66,
-    0x4b,
-    0x90,
-    0x94,
-    0x04,
-    0x6e,
-    0x6f,
-    0x61,
-    0x9e,
-    0xda,
-    0xbb,
-    0x0b,
-    0x32,
-    0xa7,
-    0xfe,
-    0x86,
-    0x36,
-    0x80,
-    0x05,
-    0xfa,
-    0x7e,
-    0xf9,
-    0xe4,
-    0xbc,
-    0x5f,
-    0x23,
-    0x3a,
-    0x7c,
-    0x15,
-    0x5f,
-    0xb6,
-    0xc0,
-    0x62,
-    0x6f,
-    0xda,
-    0x91,
-    0x78,
-    0xd3,
-    0xff,
-    0x73,
-    0x19,
-    0x52,
-    0x9a,
-    0x9b,
-    0xfd,
-    0xd7,
-    0xbd,
-    0x5d,
-    0x74,
-    0x7e,
-    0xe1,
-    0xe4,
-    0x4c,
-    0xef,
-    0xe2,
-    0x25,
-    0xf5,
-    0xeb,
-    0x4b,
-    0x15,
-    0xe3,
-    0x24,
-    0xd4,
-    0x1a,
-    0x34,
-    0x52,
-    0x29,
-    0xc0,
-    0x93,
-    0x83,
-    0xed,
-    0xae,
-    0x5c,
-    0xb2,
-    0xff,
-    0xd8,
-    0x00,
-    0x9c,
-    0xfc,
-    0xf6,
-    0xac,
-    0xcf,
-    0x05,
-    0x34,
-    0x25,
-    0x04,
-    0xc2,
-    0x2b,
-    0xf7,
-    0xae,
-    0xa6,
-    0x10,
-    0xce,
-    0xd3,
-    0x75,
-    0x2b,
-    0x24,
-    0x1b,
-    0x04,
-    0x8b,
-    0x1c,
-    0x27,
-    0x41,
-    0xf9,
-    0xae,
-    0x23,
-    0x72,
-    0x2a,
-    0x05,
-    0x9f,
-    0xc2,
-    0x39,
-    0x25,
-    0x9a,
-    0xf9,
-    0x54,
-    0xd1,
-    0xe0,
-    0x8b,
-    0xb5,
-    0xac,
-    0x97,
-    0xd4,
-    0xd3,
-    0x9e,
-    0x14,
-    0xa2,
-    0xda,
-    0x79,
-    0xf3,
-    0xf4,
-    0x59,
-    0xdd,
-    0x66,
-    0x01,
-    0x3b,
-    0x59,
-    0xcd,
-    0x7c,
-    0xf9,
-    0xd2,
-    0x87,
-    0x17,
-    0x0e,
-    0x29,
-    0x08,
-    0x46,
-    0xaa,
-    0x18,
-    0x2c,
-    0x45,
-    0xaa,
-    0x5d,
-    0xcb,
-    0x5c,
-    0xc8,
-    0x1b,
-    0x8e,
-    0x62,
-    0x0f,
-    0x7d,
-    0x01,
-    0x80,
-    0x93,
-    0x9c,
-    0xe9,
-    0x37,
-    0x5e,
-    0xa3,
-    0xd7,
-    0xa4,
-    0xad,
-    0x31,
-    0xfd,
-    0x03,
-    0x5d,
-    0xfe,
-    0x41,
-    0x73,
-    0xa0,
-    0xc2,
-    0x90,
-    0xf8,
-    0xf4,
-    0x52,
-    0x75,
-    0xc6,
-    0x56,
-    0x0c,
-    0xea,
-    0xbd,
-    0xb2,
-    0x76,
-    0x6e,
-    0x30,
-    0x9f,
-    0x22,
-    0x57,
-    0xea,
-    0x49,
-    0xd5,
-    0x6a,
-    0x73,
-    0xae,
-    0xe7,
-    0xa9,
-    0x8f,
-    0x0e,
-    0xed,
-    0x6c,
-    0x08,
-    0x9c,
-    0x96,
-    0xb3,
-    0xad,
-    0x7a,
-    0xd3,
-    0xbb,
-    0x9b,
-    0xe4,
-    0x3b,
-    0xcf,
-    0xbb,
-    0xac,
-    0xad,
-    0x61,
-    0x8c,
-    0xe6,
-    0x37,
-    0x59,
-    0x23,
-    0xe4,
-    0x36,
-    0xad,
-    0x70,
-    0x65,
-    0xbf,
-    0x32,
-    0xc2,
-    0x09,
-    0x3e,
-    0xb2,
-    0x8d,
-    0x08,
-    0x5d,
-    0x3e,
-    0x6c,
-    0x24,
-    0x28,
-    0xc5,
-    0x62,
-    0xdc,
-    0x6e,
-    0xe6,
-    0x65,
-    0xe3,
-    0x6a,
-    0x03,
-    0x1d,
-    0xd0,
-    0xa2,
-    0x97,
-    0xe9,
-    0x17,
-    0x10,
-    0xc9,
-    0x23,
-    0x38,
-    0x80,
-    0x41,
-    0xa5,
-    0x36,
-    0x39,
-    0x3a,
-    0x8b,
-    0x4b,
-    0xdf,
-    0xd8,
-    0x3b,
-    0xda,
-    0x98,
-    0xbc,
-    0xa3,
-    0xa5,
-    0x6e,
-    0xd7,
-    0xc2,
-    0x40,
-    0xf5,
-    0x7b,
-    0x6a,
-    0xc6,
-    0x2d,
-    0xb8,
-    0x44,
-    0xca,
-    0xa9,
-    0xe5,
-    0x14,
-    0x90,
-    0xf1,
-    0x7d,
-    0x3e,
-    0x7d,
-    0x26,
-    0x2d,
-    0x8a,
-    0xcd,
-    0xe4,
-    0x2a,
-    0x24,
-    0x84,
-    0x6c,
-    0xc8,
-    0xe7,
-    0xa7,
-    0x03,
-    0x49,
-    0xda,
-    0xab,
-    0x95,
-    0xf2,
-    0xfb,
-    0x2e,
-    0x9e,
-    0x65,
-    0x3c,
-    0xe5,
-    0x4b,
-    0x2a,
-    0xcc,
-    0xd6,
-    0xdc,
-    0x8f,
-    0x97,
-    0xc7,
-    0x4c,
-    0xb2,
-    0x10,
-    0xf6,
-    0x34,
-    0xdc,
-    0x2e,
-    0x0a,
-    0xed,
-    0x10,
-    0xb4,
-    0x4a,
-    0xf4,
-    0xe4,
-    0xb6,
-    0x0d,
-    0x93,
-    0x90,
-    0x59,
-    0x71,
-    0xbe,
-    0x45,
-    0xda,
-    0x50,
-    0x3c,
-    0xc0,
-    0xd2,
-    0x70,
-    0x07,
-    0x1e,
-    0xb8,
-    0xfa,
-    0xf4,
-    0xf2,
-    0xa7,
-    0x2e,
-    0x96,
-    0x95,
-    0x61,
-    0x54,
-    0x60,
-    0xbd,
-    0x95,
-    0xf6,
-    0x0b,
-    0x51,
-    0x5d,
-    0x4c,
-    0x37,
-    0x7c,
-    0x0b,
-    0xf8,
-    0x55,
-    0x01,
-    0x25,
-    0xf4,
-    0xc4,
-    0xce,
-    0xae,
-    0xc8,
-    0x3a,
-    0xd3,
-    0xa7,
-    0x00,
-    0x66,
-    0x14,
-    0xd6,
-    0xdd,
-    0xd4,
-    0xfd,
-    0xc6,
-    0x4b,
-    0x10,
-    0xf6,
-    0x0f,
-    0x13,
-    0x0e,
-    0x38,
-    0xd7,
-    0x52,
-    0xc9,
-    0xdf,
-    0x99,
-    0x2a,
-    0x2b,
-    0x40,
-    0x26,
-    0xb7,
-    0x2d,
-    0x7c,
-    0xe9,
-    0x44,
-    0x3f,
-    0x56,
-    0x6e,
-    0xbf,
-    0xea,
-    0x41,
-    0x26,
-    0x6b,
-    0xb4,
-    0xbd,
-    0x64,
-    0xd5,
-    0x44,
-    0xe4,
-    0xac,
-    0x09,
-    0xc6,
-    0x40,
-    0x2d,
-    0x05,
-    0x91,
-    0xe0,
-    0x8c,
-    0x6e,
-    0x07,
-    0xab,
-    0xe3,
-    0x82,
-    0xbd,
-    0xf4,
-    0x0a,
-    0x4e,
-    0xdd,
-    0x4e,
-    0x15,
-    0x21,
-    0xc8,
-    0xa1,
-    0x1d,
-    0x40,
-    0xff,
-    0x7d,
-    0x44,
-    0xdb,
-    0x43,
-    0xaf,
-    0xf3,
-    0x40,
-    0xfb,
-    0x12,
-    0x66,
-    0x4f,
-    0xd7,
-    0xa8,
-    0x6b,
-    0x2e,
-    0xb3,
-    0xe9,
-    0x66,
-    0x3e,
-    0xbe,
-    0x5b,
-    0x99,
-    0x4d,
-    0xdb,
-    0x63,
-    0xa2,
-    0x0d,
-    0x47,
-    0x5b,
-    0x45,
-    0xc4,
-    0x7c,
-    0xe4,
-    0x6c,
-    0x46,
-    0x56,
-    0x7e,
-    0x6c,
-    0x21,
-    0x75,
-    0x56,
-    0x8a,
-    0x17,
-    0xe2,
-    0x5e,
-    0xbe,
-    0xd1,
-    0xf5,
-    0xa3,
-    0xb7,
-    0xd1,
-    0x76,
-    0xdc,
-    0x1e,
-    0xa9,
-    0x02,
-    0x3e,
-    0x1f,
-    0x6a,
-    0xb0,
-    0x98,
-    0x26,
-    0x60,
-    0xf5,
-    0x9b,
-    0xe6,
-    0xfc,
-    0xc5,
-    0x79,
-    0xa0,
-    0x12,
-    0xfb,
-    0xb3,
-    0xa2,
-    0x45,
-    0xfb,
-    0x2b,
-    0x0e,
-    0xbf,
-    0x96,
-    0x81,
-    0xdc,
-    0x25,
-    0x2e,
-    0x9c,
-    0x22,
-    0xc9,
-    0x1a,
-    0x87,
-    0x93,
-    0x22,
-    0x4b,
-    0x7f,
-    0x46,
-    0x7a,
-    0x30,
-    0x4a,
-    0xba,
-    0xe7,
-    0xd8,
-    0xca,
-    0x16,
-    0x7c,
-    0x57,
-    0xd1,
-    0xb5,
-    0xc0,
-    0x6a,
-    0x37,
-    0xe1,
-    0x5f,
-    0x5e,
-    0x2a,
-    0xdf,
-    0x20,
-    0x2d,
-    0xc6,
-    0x2d,
-    0x17,
-    0xeb,
-    0xe5,
-    0x07,
-    0x1c,
-    0x60,
-    0x39,
-    0x2f,
-    0x7c,
-    0xf7,
-    0x98,
-    0xee,
-    0xee,
-    0xd7,
-    0x96,
-    0x56,
-    0xc8,
-    0x4f,
-    0x59,
-    0xcb,
-    0x72,
-    0x77,
-    0xa9,
-    0xc2,
-    0x1b,
-    0x14,
-    0x47,
-    0xc7,
-    0xac,
-    0xbd,
-    0x80,
-    0xc5,
-    0xfa,
-    0x3c,
-    0x01,
-    0x82,
-    0x40,
-    0x37,
-    0xed,
-    0x69,
-    0xcc,
-    0x10,
-    0x2d,
-    0x8c,
-    0xf8,
-    0x09,
-    0x08,
-    0xe9,
-    0x5c,
-    0xac,
-    0xf3,
-    0xec,
-    0x42,
-    0x6a,
-    0xaa,
-    0x36,
-    0x5a,
-    0x82,
-    0x7f,
-    0x9d,
-    0xb0,
-    0x24,
-    0xf2,
-    0x74,
-    0xda,
-    0xd6,
-    0x83,
-    0x0c,
-    0x76,
-    0x18,
-    0xc4,
-    0x7a,
-    0xd4,
-    0x43,
-    0xb2,
-    0x9b,
-    0xef,
-    0xb7,
-    0x45,
-    0x56,
-    0xa2,
-    0x35,
-    0x46,
-    0x21,
-    0x18,
-    0x8a,
-    0x61,
-    0xc7,
-    0x85,
-    0x6e,
-    0x7b,
-    0x68,
-    0x13,
-    0xab,
-    0x46,
-    0xc1,
-    0x20,
-    0x82,
-    0x12,
-    0xad,
-    0xa6,
-    0x4a,
-    0xe6,
-    0xec,
-    0xfa,
-    0x5a,
-    0xcf,
-    0x24,
-    0xba,
-    0x29,
-    0x78,
-    0x25,
-    0x00,
-    0xb4,
-    0xfb,
-    0x71,
-    0xdc,
-    0x20,
-    0xf7,
-    0xfc,
-    0x02,
-    0xa1,
-    0xe3,
-    0x30,
-    0xbf,
-    0x9a,
-    0xa1,
-    0x34,
-    0x32,
-    0x06,
-    0x56,
-    0x6e,
-    0xb8,
-    0x16,
-    0x7a,
-    0x47,
-    0xa8,
-    0x1b,
-    0x2b,
-    0x2e,
-    0x41,
-    0xa7,
-    0xc7,
-    0xdf,
-    0xe0,
-    0xef,
-    0xb9,
-    0xe5,
-    0x76,
-    0x74,
-    0x93,
-    0x5d,
-    0x3a,
-    0xe3,
-    0x5e,
-    0xfe,
-    0x9b,
-    0x39,
-    0x2d,
-    0x56,
-    0x79,
-    0x2a,
-    0xf9,
-    0x56,
-    0x94,
-    0xc4,
-    0xa8,
-    0x11,
-    0x45,
-    0x50,
-    0x6f,
-    0xc1,
-    0x6c,
-    0x79,
-    0x5a,
-    0x0b,
-    0xa9,
-    0xb0,
-    0x29,
-    0x84,
-    0xcf,
-    0xce,
-    0x5e,
-    0x73,
-    0x95,
-    0xfb,
-    0x94,
-    0xd9,
-    0x8f,
-    0xcf,
-    0x12,
-    0xae,
-    0x5d,
-    0xb8,
-    0xa0,
-    0x6e,
-    0x23,
-    0x9c,
-    0x9a,
-    0xd4,
-    0x39,
-    0xbf,
-    0x42,
-    0xe5,
-    0x23,
-    0xe6,
-    0x5a,
-    0x31,
-    0xc3,
-    0xbd,
-    0xf3,
-    0x56,
-    0xcd,
-    0x76,
-    0x80,
-    0xc5,
-    0x7c,
-    0xb3,
-    0x2e,
-    0xc9,
-    0x83,
-    0xa6,
-    0x78,
-    0xc5,
-    0x47,
-    0x76,
-    0xf5,
-    0xbd,
-    0x4b,
-    0xe5,
-    0x75,
-    0x17,
-    0xeb,
-    0x31,
-    0x4d,
-    0xa3,
-    0x4e,
-    0x37,
-    0xef,
-    0xda,
-    0x96,
-    0xde,
-    0xbe,
-    0x63,
-    0x59,
-    0xb3,
-    0x20,
-    0xdc,
-    0x55,
-    0xd1,
-    0xd4,
-    0xd6,
-    0x5f,
-    0x04,
-    0x86,
-    0x21,
-    0x9d,
-    0x2e,
-    0xa0,
-    0x4b,
-    0xf5,
-    0xe9,
-    0x64,
-    0x63,
-    0xc5,
-    0x6d,
-    0x38,
-    0x02,
-    0xd5,
-    0xb5,
-    0x40,
-    0x8d,
-    0x8a,
-    0xdd,
-    0x32,
-    0xb4,
-    0x5c,
-    0xcf,
-    0x66,
-    0x3e,
-    0x89,
-    0x1e,
-    0x2d,
-    0x09,
-    0x0b,
-    0x32,
-    0x64,
-    0x4c,
-    0xc8,
-    0xa6,
-    0x49,
-    0x20,
-    0x0a,
-    0xee,
-    0x8d,
-    0x3f,
-    0x2e,
-    0x3d,
-    0xaa,
-    0x0b,
-    0xa0,
-    0xa5,
-    0x76,
-    0xd2,
-    0x07,
-    0x81,
-    0xf8,
-    0x50,
-    0xbc,
-    0x10,
-    0x7b,
-    0x75,
-    0x81,
-    0x62,
-    0xe2,
-    0x69,
-    0x70,
-    0x78,
-    0x3b,
-    0xce,
-    0x31,
-    0xa7,
-    0x97,
-    0x45,
-    0x70,
-    0x3d,
-    0x18,
-    0x33,
-    0x8e,
-    0x67,
-    0x4b,
-    0xc5,
-    0x97,
-    0x52,
-    0xb8,
-    0x31,
-    0x75,
-    0x91,
-    0xb8,
-    0x3f,
-    0x63,
-    0xbf,
-    0x87,
-    0x09,
-    0xa4,
-    0x65,
-    0x9a,
-    0xfe,
-    0x74,
-    0x1d,
-    0x33,
-    0x2d,
-    0x3f,
-    0xf8,
-    0x32,
-    0xc1,
-    0x11,
-    0x1e,
-    0x2e,
-    0xc7,
-    0x4e,
-    0xb4,
-    0xc4,
-    0x38,
-    0xa3,
-    0x03,
-    0x2f,
-    0x33,
-    0x3c,
-    0xd6,
-    0x19,
-    0x8a,
-    0x37,
-    0x23,
-    0xb1,
-    0x80,
-    0x59,
-    0xee,
-    0xfe,
-    0xd1,
-    0x00,
-    0x6b,
-    0x73,
-    0xf3,
-    0x59,
-    0x63,
-    0xc3,
-    0x9c,
-    0xd3,
-    0xd8,
-    0xf7,
-    0x84,
-    0xd4,
-    0xec,
-    0xbd,
-    0x6c,
-    0xaa,
-    0xff,
-    0x03,
-    0x5f,
-    0xc4,
-    0x18,
-    0xc4,
-    0x38,
-    0x22,
-    0x86,
-    0x22,
-    0x64,
-    0x0a,
-    0xc7,
-    0xb6,
-    0xe9,
-    0xfd,
-    0xa8,
-    0x24,
-    0xa7,
-    0xe9,
-    0xae,
-    0xf2,
-    0xde,
-    0xa0,
-    0xb5,
-    0x9a,
-    0xf1,
-    0x89,
-    0xd7,
-    0xdd,
-    0x6a,
-    0x95,
-    0x8f,
-    0x5b,
-    0x3d,
-    0x75,
-    0x1e,
-    0x61,
-    0x51,
-    0x0b,
-    0x2e,
-    0x02,
-    0x3c,
-    0x1e,
-    0xb6,
-    0x69,
-    0x4f,
-    0x51,
-    0x1d,
-    0x6d,
-    0xd2,
-    0x56,
-    0xa2,
-    0x66,
-    0x90,
-    0x5f,
-    0xfb,
-    0x3f,
-    0x97,
-    0xd5,
-    0x3c,
-    0xcd,
-    0x39,
-    0x4d,
-    0xfb,
-    0x5f,
-    0x56,
-    0xb8,
-    0xb2,
-    0x97,
-    0xde,
-    0xd9,
-    0x64,
-    0x78,
-    0x91,
-    0xfd,
-    0x84,
-    0xbf,
-    0x09,
-    0xe6,
-    0x12,
-    0x77,
-    0xfb,
-    0x08,
-    0x07,
-    0xc8,
-    0xba,
-    0xf8,
-    0xf3,
-    0x10,
-    0xfc,
-    0x21,
-    0xe5,
-    0x35,
-    0xe1,
-    0xb9,
-    0x8b,
-    0x39,
-    0x31,
-    0xf3,
-    0x9a,
-    0x0e,
-    0xe5,
-    0x76,
-    0x70,
-    0xac,
-    0xea,
-    0x0f,
-    0xf9,
-    0x62,
-    0x21,
-    0xa2,
-    0xcf,
-    0x69,
-    0xaa,
-    0x67,
-    0xa5,
-    0xbf,
-    0x62,
-    0x52,
-    0xe5,
-    0x32,
-    0xaa,
-    0xd3,
-    0x98,
-    0xbb,
-    0x6b,
-    0xc0,
-    0x87,
-    0x0e,
-    0x57,
-    0x90,
-    0x9f,
-    0x6f,
-    0x71,
-    0xc9,
-    0x9a,
-    0xc7,
-    0xcf,
-    0xbb,
-    0xdc,
-    0xf7,
-    0x9e,
-    0x6f,
-    0x9b,
-    0x6c,
-    0x68,
-    0xdb,
-    0x43,
-    0xf4,
-    0x92,
-    0x57,
-    0x19,
-    0xd0,
-    0x29,
-    0x55,
-    0x1e,
-    0x0a,
-    0xde,
-    0x4c,
-    0x36,
-    0x09,
-    0x4e,
-    0xf5,
-    0x89,
-    0x62,
-    0x87,
-    0xba,
-    0x2a,
-    0xf1,
-    0xc8,
-    0x6c,
-    0xf7,
-    0x29,
-    0x89,
-    0x34,
-    0xc0,
-    0xa8,
-    0xbb,
-    0xcc,
-    0xab,
-    0x0e,
-    0x51,
-    0xee,
-    0xd6,
-    0x10,
-    0xff,
-    0x0d,
-    0x3f,
-    0xc8,
-    0x42,
-    0x44,
-    0xe1,
-    0x4f,
-    0xa0,
-    0x8c,
-    0x20,
-    0x8e,
-    0x31,
-    0x31,
-    0x67,
-    0x51,
-    0x5e,
-    0x87,
-    0x10,
-    0x9d,
-    0xe9,
-    0xd9,
-    0x84,
-    0x44,
-    0x2e,
-    0xa2,
-    0xa3,
-    0xb6,
-    0xa8,
-    0xff,
-    0x66,
-    0x1a,
-    0xb6,
-    0x65,
-    0xc2,
-    0x9e,
-    0x9f,
-    0x8f,
-    0xd0,
-    0x0b,
-    0xd4,
-    0xbb,
-    0x2c,
-    0x9c,
-    0x76,
-    0x16,
-    0x9b,
-    0x10,
-    0x18,
-    0x75,
-    0xf0,
-    0xfe,
-    0xc6,
-    0x45,
-    0x30,
-    0x69,
-    0x46,
-    0xc5,
-    0xf4,
-    0x94,
-    0x9d,
-    0x73,
-    0x0f,
-    0x17,
-    0xd6,
-    0xc3,
-    0x71,
-    0x33,
-    0xfe,
-    0x17,
-    0x4b,
-    0x63,
-    0x73,
-    0xec,
-    0x74,
-    0x33,
-    0x5f,
-    0x51,
-    0x0c,
-    0x55,
-    0x7f,
-    0x9e,
-    0x5f,
-    0xf2,
-    0x29,
-    0x62,
-    0x0b,
-    0x3e,
-    0x8d,
-    0x9d,
-    0x66,
-    0x4f,
-    0x3b,
-    0x30,
-    0x1a,
-    0x2f,
-    0xe5,
-    0x91,
-    0x12,
-    0x30,
-    0x66,
-    0xc3,
-    0x9a,
-    0x7f,
-    0x04,
-    0x86,
-    0xc1,
-    0xfc,
-    0xf2,
-    0xcb,
-    0x02,
-    0x49,
-    0x19,
-    0x6a,
-    0x24,
-    0x21,
-    0x19,
-    0x17,
-    0x5f,
-    0xec,
-    0x8a,
-    0x93,
-    0xc0,
-    0x90,
-    0x87,
-    0x1f,
-    0xcf,
-    0x89,
-    0x6d,
-    0x36,
-    0x6e,
-    0x3c,
-    0xe0,
-    0x7b,
-    0x04,
-    0x88,
-    0x0f,
-    0xf1,
-    0xdb,
-    0x9f,
-    0x39,
-    0x6a,
-    0xc7,
-    0x14,
-    0x71,
-    0x42,
-    0x09,
-    0x35,
-    0x9e,
-    0x4c,
-    0x72,
-    0x9a,
-    0xc5,
-    0x0d,
-    0xcc,
-    0xfe,
-    0x8b,
-    0x28,
-    0x75,
-    0x4e,
-    0xf5,
-    0x1a,
-    0x4d,
-    0x00,
-    0x73,
-    0x27,
-    0xd2,
-    0xa6,
-    0x1d,
-    0x94,
-    0x8a,
-    0xc3,
-    0x3c,
-    0x17,
-    0xa2,
-    0xdd,
-    0x0c,
-    0x8c,
-    0xd4,
-    0xd3,
-    0xc0,
-    0xe9,
-    0x8e,
-    0x71,
-    0xc7,
-    0x74,
-    0x50,
-    0x42,
-    0x4e,
-    0x34,
-    0x55,
-    0xa5,
-    0x06,
-    0xa5,
-    0x77,
-    0x23,
-    0x27,
-    0xb0,
-    0x4d,
-    0x00,
-    0xb5,
-    0xd9,
-    0x96,
-    0x10,
-    0x02,
-    0xbb,
-    0xda,
-    0xcc,
-    0x74,
-    0xb1,
-    0x4e,
-    0xa5,
-    0x88,
-    0xd7,
-    0xf9,
-    0x99,
-    0x17,
-    0x31,
-    0x15,
-    0x03,
-    0xd8,
-    0x29,
-    0xb8,
-    0xb7,
-    0x27,
-    0x3f,
-    0xb3,
-    0x4e,
-    0x04,
-    0xfc,
-    0xba,
-    0xbf,
-    0x5f,
-    0x27,
-    0xc6,
-    0x30,
-    0x93,
-    0x3c,
-    0xb8,
-    0x0b,
-    0x30,
-    0x1a,
-    0x3f,
-    0x53,
-    0xfd,
-    0xfc,
-    0xfb,
-    0x39,
-    0x3d,
-    0xaa,
-    0xe3,
-    0xea,
-    0x32,
-    0xf1,
-    0xe4,
-    0xac,
-    0xe0,
-    0x50,
-    0xca,
-    0x29,
-    0x13,
-    0xf4,
-    0x64,
-    0x0a,
-    0xa3,
-    0xe7,
-    0xe3,
-    0xc8,
-    0xf7,
-    0x84,
-    0x84,
-    0xbf,
-    0xc8,
-    0x2e,
-    0x6f,
-    0x85,
-    0x27,
-    0x41,
-    0xde,
-    0x79,
-    0xc2,
-    0x49,
-    0x81,
-    0x9f,
-    0x63,
-    0x72,
-    0x22,
-    0xab,
-    0xb9,
-    0x40,
-    0x85,
-    0x5b,
-    0x5b,
-    0x80,
-    0x92,
-    0x0a,
-    0x0a,
-    0x7f,
-    0xb5,
-    0x83,
-    0x36,
-    0x79,
-    0x86,
-    0x13,
-    0xc4,
-    0x54,
-    0xa5,
-    0xe2,
-    0x0f,
-    0x8e,
-    0xe8,
-    0x82,
-    0x2d,
-    0x75,
-    0xb9,
-    0xc9,
-    0x73,
-    0x96,
-    0xb9,
-    0xdc,
-    0x3b,
-    0x77,
-    0xaa,
-    0x8d,
-    0xe4,
-    0x89,
-    0x8b,
-    0xe7,
-    0x1b,
-    0x58,
-    0x04,
-    0x06,
-    0x59,
-    0x05,
-    0x05,
-    0x2d,
-    0xad,
-    0xf6,
-    0xab,
-    0x12,
-    0xbc,
-    0xcc,
-    0x63,
-    0x7c,
-    0x06,
-    0x95,
-    0x51,
-    0x10,
-    0x6b,
-    0x43,
-    0xf3,
-    0x68,
-    0xed,
-    0x5e,
-    0x01,
-    0x66,
-    0xb7,
-    0xf5,
-    0x98,
-    0xc8,
-    0x5f,
-    0xda,
-    0x98,
-    0xfc,
-    0x68,
-    0x0f,
-    0x4b,
-    0x35,
-    0x0b,
-    0x7b,
-    0x47,
-    0xbe,
-    0x36,
-    0xe1,
-    0x95,
-    0x8f,
-    0xd6,
-    0x13,
-    0x12,
-    0x1e,
-    0x52,
-    0x63,
-    0x16,
-    0x77,
-    0x57,
-    0x5b,
-    0x54,
-    0x8f,
-    0xdb,
-    0xae,
-    0x01,
-    0xd5,
-    0x5c,
-    0x6d,
-    0x39,
-    0x0b,
-    0x69,
-    0x7e,
-    0x9e,
-    0x54,
-    0x64,
-    0x4b,
-    0x42,
-    0x8e,
-    0x86,
-    0xb7,
-    0xc7,
-    0xe1,
-    0x23,
-    0x56,
-    0xc4,
-    0x98,
-    0x30,
-    0xdd,
-    0x6b,
-    0x30,
-    0x02,
-    0xd7,
-    0x69,
-    0xaf,
-    0x58,
-    0x9a,
-    0x0e,
-    0x38,
-    0x9c,
-    0x7a,
-    0xae,
-    0xdb,
-    0x66,
-    0x3c,
-    0x47,
-    0xb1,
-    0x42,
-    0xce,
-    0x63,
-    0x29,
-    0xb3,
-    0x35,
-    0x40,
-    0x9d,
-    0x78,
-    0xc6,
-    0x2f,
-    0x29,
-    0x0d,
-    0x99,
-    0x3a,
-    0xbc,
-    0x75,
-    0x3b,
-    0x09,
-    0x6f,
-    0x37,
-    0xa3,
-    0x07,
-    0x16,
-    0xa7,
-    0x67,
-    0xc0,
-    0x15,
-    0x66,
-    0x30,
-    0x8d,
-    0x76,
-    0x2c,
-    0x6c,
-    0x74,
-    0x38,
-    0xc5,
-    0x42,
-    0x4a,
-    0xe9,
-    0x5a,
-    0xcb,
-    0x1a,
-    0x77,
-    0xf2,
-    0x7f,
-    0xcb,
-    0x43,
-    0x38,
-    0xed,
-    0xfc,
-    0x77,
-    0x7f,
-    0xb0,
-    0x33,
-    0x9a,
-    0x03,
-    0x9e,
-    0x37,
-    0x61,
-    0x72,
-    0x42,
-    0xba,
-    0xc8,
-    0xab,
-    0x8d,
-    0x3b,
-    0x62,
-    0xc5,
-    0xc8,
-    0x2b,
-    0xed,
-    0x53,
-    0xcd,
-    0x4f,
-    0x2a,
-    0xe6,
-    0x77,
-    0x65,
-    0xec,
-    0xd4,
-    0x57,
-    0x0a,
-    0x6e,
-    0x38,
-    0xa8,
-    0xdb,
-    0xe9,
-    0x3a,
-    0x85,
-    0xdb,
-    0x66,
-    0x91,
-    0x5a,
-    0x15,
-    0xd1,
-    0x46,
-    0x99,
-    0x82,
-    0x50,
-    0xba,
-    0xae,
-    0x2c,
-    0xd3,
-    0xea,
-    0x34,
-    0x94,
-    0xeb,
-    0xf2,
-    0x69,
-    0x51,
-    0xdf,
-    0xd0,
-    0xdf,
-    0xfb,
-    0xfd,
-    0x6b,
-    0x75,
-    0x47,
-    0x2e,
-    0xd4,
-    0x86,
-    0x73,
-    0xcd,
-    0xcb,
-    0x60,
-    0xe5,
-    0xb9,
-    0x85,
-    0xf8,
-    0x0f,
-    0xa9,
-    0xac,
-    0xdc,
-    0x95,
-    0xc0,
-    0xa8,
-    0x68,
-    0xb2,
-    0x62,
-    0x1d,
-    0x3d,
-    0xd8,
-    0x45,
-    0xb4,
-    0xef,
-    0x96,
-    0xcb,
-    0x1f,
-    0xfe,
-    0xbf,
-    0x8f,
-    0x57,
-    0x08,
-    0xc9,
-    0x3d,
-    0x28,
-    0x3c,
-    0x73,
-    0xa8,
-    0xf0,
-    0x12,
-    0xaa,
-    0x16,
-    0xa4,
-    0x39,
-    0xae,
-    0xde,
-    0x13,
-    0xd1,
-    0x71,
-    0x36,
-    0x6f,
-    0xdb,
-    0x40,
-    0x46,
-    0x09,
-    0xee,
-    0xa4,
-    0x81,
-    0x5c,
-    0x2b,
-    0x8b,
-    0x34,
-    0x4d,
-    0x73,
-    0xa3,
-    0x5f,
-    0xb1,
-    0xd7,
-    0x07,
-    0xc5,
-    0x10,
-    0x4f,
-    0x1d,
-    0x3f,
-    0xa8,
-    0xaf,
-    0xbe,
-    0x55,
-    0xb5,
-    0xd8,
-    0x98,
-    0x0f,
-    0xf0,
-    0x2b,
-    0xd1,
-    0x09,
-    0x56,
-    0x44,
-    0xed,
-    0xc6,
-    0x2a,
-    0xe4,
-    0xf2,
-    0x46,
-    0x3d,
-    0x2e,
-    0xca,
-    0xdb,
-    0x6d,
-    0x17,
-    0xe8,
-    0x38,
-    0x6c,
-    0x18,
-    0x2f,
-    0xcb,
-    0xc3,
-    0x25,
-    0x0f,
-    0x4d,
-    0x16,
-    0xe3,
-    0xf1,
-    0x97,
-    0xa9,
-    0x16,
-    0xd5,
-    0xb7,
-    0x23,
-    0x58,
-    0x39,
-    0x43,
-    0x92,
-    0x11,
-    0x3d,
-    0xed,
-    0xb0,
-    0xa3,
-    0x06,
-    0x58,
-    0x65,
-    0xe5,
-    0x60,
-    0x2a,
-    0x8c,
-    0xd3,
-    0xa7,
-    0x63,
-    0xfa,
-    0x84,
-    0xe7,
-    0xed,
-    0xbc,
-    0x5c,
-    0x42,
-    0x73,
-    0xa1,
-    0x82,
-    0x92,
-    0x77,
-    0xf9,
-    0x94,
-    0x50,
-    0x9f,
-    0x9b,
-    0x9a,
-    0xb5,
-    0x50,
-    0x2d,
-    0x39,
-    0x1e,
-    0x7e,
-    0x9f,
-    0x2a,
-    0xb5,
-    0xc3,
-    0xf9,
-    0xea,
-    0x4e,
-    0xae,
-    0x57,
-    0xb2,
-    0x8f,
-    0x5d,
-    0x31,
-    0xa9,
-    0x54,
-    0x4e,
-    0xe0,
-    0x59,
-    0x51,
-    0x72,
-    0x5e,
-    0x5f,
-    0xfa,
-    0x83,
-    0x4e,
-    0x67,
-    0x9f,
-    0x98,
-    0x3c,
-    0x58,
-    0xdc,
-    0xf7,
-    0x25,
-    0xcc,
-    0x30,
-    0x2a,
-    0x3a,
-    0xc3,
-    0xec,
-    0x55,
-    0xe1,
-    0x98,
-    0x4f,
-    0xc6,
-    0xfd,
-    0x34,
-    0xef,
-    0xce,
-    0x6f,
-    0x81,
-    0x5a,
-    0xcf,
-    0xdd,
-    0x21,
-    0xfe,
-    0x97,
-    0xb1,
-    0x61,
-    0x46,
-    0xec,
-    0x65,
-    0x68,
-    0x06,
-    0x68,
-    0xff,
-    0xb5,
-    0x19,
-    0x88,
-    0xd7,
-    0xc8,
-    0x49,
-    0xff,
-    0xa0,
-    0x1e,
-    0x6e,
-    0x50,
-    0xa6,
-    0x63,
-    0xda,
-    0x9b,
-    0x55,
-    0xe4,
-    0xf5,
-    0xb7,
-    0xfb,
-    0x43,
-    0x25,
-    0x82,
-    0xcf,
-    0x6e,
-    0xf1,
-    0x75,
-    0x31,
-    0xd1,
-    0x65,
-    0x7c,
-    0x33,
-    0xcb,
-    0xb8,
-    0x04,
-    0x59,
-    0x5f,
-    0x2c,
-    0x55,
-    0x9d,
-    0x2d,
-    0x36,
-    0x22,
-    0xb6,
-    0xa0,
-    0xdf,
-    0x5e,
-    0x9a,
-    0x68,
-    0x6a,
-    0x52,
-    0x42,
-    0x2b,
-    0x37,
-    0xed,
-    0xad,
-    0x77,
-    0xe7,
-    0x5b,
-    0x27,
-    0xfc,
-    0xc1,
-    0xd9,
-    0xcb,
-    0xf8,
-    0x54,
-    0xc7,
-    0x47,
-    0xf2,
-    0x5e,
-    0xfe,
-    0xdf,
-    0xab,
-    0xed,
-    0x65,
-    0xb5,
-    0x52,
-    0xc4,
-    0xbf,
-    0x47,
-    0xf7,
-    0x00,
-    0xc7,
-    0x39,
-    0x42,
-    0xfc,
-    0x7f,
-    0x55,
-    0x65,
-    0x71,
-    0xc5,
-    0xd0,
-    0x4f,
-    0xe2,
-    0x27,
-    0xce,
-    0x22,
-    0x37,
-    0xf8,
-    0x29,
-    0xe8,
-    0xa8,
-    0xa3,
-    0x6e,
-    0x82,
-    0xdc,
-    0x40,
-    0x29,
-    0xe0,
-    0x52,
-    0x65,
-    0x63,
-    0x78,
-    0x01,
-    0x3f,
-    0x68,
-    0xf0,
-    0x3b,
-    0xe1,
-    0xce,
-    0x1e,
-    0xd7,
-    0xdb,
-    0xb2,
-    0x33,
-    0x8f,
-    0x0f,
-    0x45,
-    0x33,
-    0xa7,
-    0xc0,
-    0x88,
-    0xa9,
-    0xd0,
-    0xec,
-    0x53,
-    0x98,
-    0x4b,
-    0xdc,
-    0x9c,
-    0xb4,
-    0x51,
-    0xf9,
-    0xf6,
-    0xd2,
-    0xb3,
-    0xe1,
-    0x58,
-    0x9e,
-    0xbe,
-    0xba,
-    0x20,
-    0x8c,
-    0x61,
-    0xc7,
-    0x57,
-    0x11,
-    0x92,
-    0x38,
-    0x37,
-    0x12,
-    0xed,
-    0x47,
-    0xea,
-    0x9d,
-    0x9e,
-    0x80,
-    0x95,
-    0xd7,
-    0x82,
-    0x60,
-    0x95,
-    0x35,
-    0x89,
-    0x22,
-    0x09,
-    0xef,
-    0x5f,
-    0xd6,
-    0x90,
-    0xb2,
-    0x4b,
-    0xb3,
-    0x54,
-    0x96,
-    0x57,
-    0xae,
-    0x47,
-    0x4f,
-    0xb1,
-    0x4c,
-    0xac,
-    0xa7,
-    0x51,
-    0xb4,
-    0xda,
-    0x2c,
-    0xdc,
-    0x08,
-    0x3c,
-    0x25,
-    0xc8,
-    0xf5,
-    0x9d,
-    0xcb,
-    0xc2,
-    0x89,
-    0xa2,
-    0xb6,
-    0x4c,
-    0x45,
-    0x98,
-    0x96,
-    0xab,
-    0x74,
-    0x70,
-    0x23,
-    0x00,
-    0xbb,
-    0x08,
-    0x57,
-    0xb5,
-    0xf0,
-    0xad,
-    0xda,
-    0x1a,
-    0x2f,
-    0xdd,
-    0xbe,
-    0x50,
-    0x2b,
-    0x51,
-    0x6c,
-    0x67,
-    0xc3,
-    0x3b,
-    0xde,
-    0xc3,
-    0xd6,
-    0xcc,
-    0x0f,
-    0xc4,
-    0x57,
-    0xf9,
-    0xb0,
-    0xa6,
-    0xa4,
-    0x7f,
-    0x1d,
-    0xa5,
-    0x13,
-    0x24,
-    0x8f,
-    0x65,
-    0xce,
-    0x40,
-    0x93,
-    0x92,
-    0xe2,
-    0x7d,
-    0xbb,
-    0xc3,
-    0x92,
-    0xdb,
-    0x93,
-    0xa5,
-    0xf1,
-    0xf7,
-    0xd6,
-    0x55,
-    0xb0,
-    0x8c,
-    0xe2,
-    0x0d,
-    0x34,
-    0x3a,
-    0x6a,
-    0x03,
-    0xeb,
-    0x86,
-    0x6b,
-    0x8e,
-    0xe1,
-    0x23,
-    0x61,
-    0x8b,
-    0x8e,
-    0x70,
-    0xba,
-    0xff,
-    0xf3,
-    0x41,
-    0x8b,
-    0xfe,
-    0xe5,
-    0xe2,
-    0x82,
-    0xcb,
-    0xa8,
-    0x59,
-    0x1c,
-    0x40,
-    0xbf,
-    0xec,
-    0x17,
-    0x70,
-    0x03,
-    0xe3,
-    0x2b,
-    0x8c,
-    0xf3,
-    0x8f,
-    0xf5,
-    0x03,
-    0x4b,
-    0x8b,
-    0x34,
-    0xed,
-    0xd8,
-    0x42,
-    0x37,
-    0xaa,
-    0x8a,
-    0xb1,
-    0x96,
-    0xc6,
-    0xcb,
-    0x6f,
-    0x21,
-    0x20,
-    0x0f,
-    0xea,
-    0x16,
-    0x4c,
-    0xac,
-    0xf3,
-    0x97,
-    0x35,
-    0xed,
-    0x7d,
-    0x5a,
-    0x07,
-    0x61,
-    0xa1,
-    0xa3,
-    0x4c,
-    0x79,
-    0xe6,
-    0x6f,
-    0x55,
-    0x52,
-    0xc0,
-    0xf2,
-    0xdb,
-    0xd0,
-    0x56,
-    0x44,
-    0xe6,
-    0xec,
-    0x88,
-    0x58,
-    0xee,
-    0x4f,
-    0x31,
-    0x2d,
-    0x40,
-    0x1f,
-    0xa9,
-    0x48,
-    0xa4,
-    0x19,
-    0x8f,
-    0x61,
-    0x3d,
-    0xe0,
-    0xc5,
-    0x5d,
-    0xb0,
-    0x94,
-    0xbb,
-    0x7c,
-    0x89,
-    0xa7,
-    0xf1,
-    0xd4,
-    0xda,
-    0xec,
-    0xb7,
-    0xfe,
-    0x24,
-    0xf1,
-    0x38,
-    0x0f,
-    0x7b,
-    0x8f,
-    0xb6,
-    0xc9,
-    0xe6,
-    0xbf,
-    0x17,
-    0x13,
-    0x05,
-    0xaf,
-    0xa1,
-    0xa7,
-    0xf6,
-    0x16,
-    0x02,
-    0x0b,
-    0x78,
-    0xc4,
-    0x93,
-    0xc2,
-    0x51,
-    0x7d,
-    0xdd,
-    0xc3,
-    0xee,
-    0x07,
-    0x5d,
-    0x2a,
-    0x4a,
-    0x82,
-    0x84,
-    0x2e,
-    0x11,
-    0xf8,
-    0x02,
-    0x53,
-    0x04,
-    0x35,
-    0x44,
-    0xe0,
-    0x9f,
-    0xd9,
-    0x3b,
-    0x94,
-    0xf9,
-    0xab,
-    0x60,
-    0x95,
-    0xed,
-    0x30,
-    0xf5,
-    0xa9,
-    0x77,
-    0x7d,
-    0x8d,
-    0xa8,
-    0x60,
-    0x49,
-    0xce,
-    0x32,
-    0x1e,
-    0x46,
-    0x76,
-    0x9d,
-    0xf6,
-    0xb2,
-    0x9c,
-    0x31,
-    0x63,
-    0x28,
-    0x39,
-    0x98,
-    0xbb,
-    0xbd,
-    0xe6,
-    0x90,
-    0x10,
-    0x48,
-    0xe7,
-    0xe3,
-    0x54,
-    0x01,
-    0x69,
-    0x99,
-    0xc1,
-    0x4e,
-    0x08,
-    0x6c,
-    0x78,
-    0xd9,
-    0x94,
-    0x7c,
-    0x69,
-    0xe6,
-    0x15,
-    0x44,
-    0x72,
-    0xe4,
-    0x0c,
-    0xcd,
-    0xcb,
-    0x41,
-    0xfc,
-    0x21,
-    0xa1,
-    0x83,
-    0x29,
-    0x03,
-    0x01,
-    0x95,
-    0xa0,
-    0xdd,
-    0xf8,
-    0x5e,
-    0x77,
-    0xfa,
-    0xf9,
-    0x98,
-    0x56,
-    0xf5,
-    0x7e,
-    0xe0,
-    0x37,
-    0x72,
-    0xf2,
-    0x09,
-    0x69,
-    0x0b,
-    0xcf,
-    0xb6,
-    0xdb,
-    0x8e,
-    0x04,
-    0x28,
-    0x97,
-    0x65,
-    0x99,
-    0x54,
-    0x8d,
-    0x55,
-    0x95,
-    0x39,
-    0x92,
-    0x6c,
-    0x20,
-    0x70,
-    0xa8,
-    0x34,
-    0xe5,
-    0x05,
-    0x80,
-    0x2d,
-    0xba,
-    0x85,
-    0x3d,
-    0x7a,
-    0x83,
-    0x58,
-    0x7b,
-    0xdb,
-    0x53,
-    0x51,
-    0x90,
-    0xdb,
-    0xd5,
-    0x84,
-    0x11,
-    0x4b,
-    0xeb,
-    0x58,
-    0x99,
-    0xee,
-    0x94,
-    0xdd,
-    0xc5,
-    0x76,
-    0x13,
-    0x5f,
-    0x83,
-    0xaf,
-    0x4e,
-    0x3b,
-    0x8d,
-    0xfb,
-    0x74,
-    0xf1,
-    0x30,
-    0xfe,
-    0xe2,
-    0x7b,
-    0x52,
-    0x9a,
-    0x48,
-    0xdd,
-    0xb3,
-    0x1e,
-    0x07,
-    0xfe,
-    0x73,
-    0xba,
-    0xde,
-    0xb6,
-    0xd5,
-    0x37,
-    0xc6,
-    0x28,
-    0x42,
-    0xe4,
-    0x1a,
-    0x52,
-    0x91,
-    0xd4,
-    0xfb,
-    0xe2,
-    0x85,
-    0x46,
-    0xf3,
-    0x4b,
-    0x97,
-    0x65,
-    0xd8,
-    0x19,
-    0xf6,
-    0x32,
-    0xf4,
-    0x81,
-    0xcd,
-    0xbe,
-    0x62,
-    0x3d,
-    0xc4,
-    0x9c,
-    0xbb,
-    0x97,
-    0xc9,
-    0x96,
-    0xf3,
-    0xc3,
-    0x10,
-    0x9f,
-    0x7d,
-    0x71,
-    0x58,
-    0x09,
-    0xb6,
-    0xa3,
-    0x71,
-    0xf8,
-    0x80,
-    0xbc,
-    0xfb,
-    0x17,
-    0x2d,
-    0xda,
-    0x70,
-    0x89,
-    0xa0,
-    0x66,
-    0x65,
-    0x23,
-    0xae,
-    0xea,
-    0x0c,
-    0xd8,
-    0xca,
-    0x22,
-    0xfe,
-    0x74,
-    0xe2,
-    0x55,
-    0x37,
-    0x8e,
-    0x84,
-    0xe5,
-    0x62,
-    0xb7,
-    0x45,
-    0x26,
-    0x58,
-    0xf8,
-    0x63,
-    0x6c,
-    0xe3,
-    0x7c,
-    0xa9,
-    0x68,
-    0xc7,
-    0x89,
-    0x93,
-    0xb4,
-    0x03,
-    0xb5,
-    0xb3,
-    0xac,
-    0x54,
-    0x56,
-    0x53,
-    0x80,
-    0xfb,
-    0x3a,
-    0x5c,
-    0x87,
-    0xc0,
-    0x98,
-    0x77,
-    0xd6,
-    0x37,
-    0x47,
-    0x71,
-    0x12,
-    0x42,
-    0x2e,
-    0xe4,
-    0x82,
-    0xd7,
-    0xfc,
-    0x14,
-    0x68,
-    0x03,
-    0x19,
-    0x17,
-    0x92,
-    0x2f,
-    0xdc,
-    0x39,
-    0x2c,
-    0xa3,
-    0xfe,
-    0x9e,
-    0xd8,
-    0x48,
-    0x4e,
-    0x29,
-    0x01,
-    0xb2,
-    0xa7,
-    0x9d,
-    0x6b,
-    0x5d,
-    0x1f,
-    0x02,
-    0x0f,
-    0x37,
-    0x82,
-    0x4b,
-    0x27,
-    0x5f,
-    0xff,
-    0x35,
-    0x85,
-    0x2d,
-    0x20,
-    0x72,
-    0x28,
-    0x72,
-    0x00,
-    0x07,
-    0x11,
-    0x01,
-    0xb8,
-    0xf3,
-    0x53,
-    0x6e,
-    0x1a,
-    0x11,
-    0x6a,
-    0x15,
-    0xa2,
-    0x3f,
-    0xcd,
-    0x5e,
-    0xa9,
-    0xc0,
-    0xc7,
-    0x40,
-    0xdc,
-    0xdf,
-    0x82,
-    0x04,
-    0xed,
-    0xd5,
-    0x65,
-    0x4c,
-    0x88,
-    0xed,
-    0x9f,
-    0x53,
-    0x89,
-    0xe6,
-    0x04,
-    0x76,
-    0x6c,
-    0x99,
-    0x19,
-    0xf4,
-    0x04,
-    0xdc,
-    0x6a,
-    0xf2,
-    0x70,
-    0xa5,
-    0x24,
-    0xc2,
-    0x4c,
-    0x73,
-    0xdf,
-    0x64,
-    0x24,
-    0xe9,
-    0xbc,
-    0x4d,
-    0x2e,
-    0xbc,
-    0xb0,
-    0x68,
-    0x38,
-    0xd0,
-    0x1f,
-    0x5b,
-    0xdf,
-    0x9e,
-    0xad,
-    0x0b,
-    0x02,
-    0xd9,
-    0x51,
-    0x62,
-    0x76,
-    0x51,
-    0xab,
-    0x50,
-    0xfb,
-    0x17,
-    0x97,
-    0x0f,
-    0x6f,
-    0xe2,
-    0x02,
-    0xac,
-    0x42,
-    0xb1,
-    0xfc,
-    0xc3,
-    0x2a,
-    0xb2,
-    0x0f,
-    0x8a,
-    0x18,
-    0x63,
-    0xcf,
-    0x10,
-    0x6a,
-    0xf7,
-    0xb3,
-    0xc7,
-    0x62,
-    0xfb,
-    0x23,
-    0x41,
-    0xd7,
-    0x39,
-    0xd2,
-    0x37,
-    0x2a,
-    0xdd,
-    0x4e,
-    0xcf,
-    0x7c,
-    0xd6,
-    0xd6,
-    0x1e,
-    0x1e,
-    0x7f,
-    0x6b,
-    0xec,
-    0x49,
-    0x7f,
-    0x29,
-    0xb8,
-    0x10,
-    0xee,
-    0xd8,
-    0xfc,
-    0x92,
-    0xb9,
-    0xbf,
-    0xb3,
-    0x74,
-    0x47,
-    0xb8,
-    0x17,
-    0x8f,
-    0x5c,
-    0x8a,
-    0xaf,
-    0xe5,
-    0x3e,
-    0x72,
-    0x89,
-    0xda,
-    0x17,
-    0x03,
-    0xc5,
-    0xa1,
-    0x9b,
-    0x31,
-    0x53,
-    0xf4,
-    0xea,
-    0xa8,
-    0xfc,
-    0x08,
-    0xb8,
-    0x62,
-    0xa7,
-    0xc0,
-    0xab,
-    0x78,
-    0xd5,
-    0x21,
-    0x04,
-    0x38,
-    0x6f,
-    0x06,
-    0x82,
-    0x79,
-    0xc1,
-    0x14,
-    0x83,
-    0x2b,
-    0xc6,
-    0xf1,
-    0x6d,
-    0x32,
-    0xa6,
-    0xb1,
-    0x4c,
-    0x75,
-    0x7d,
-    0x91,
-    0xbd,
-    0x31,
-    0x5e,
-    0xe8,
-    0x0a,
-    0x94,
-    0x98,
-    0x5a,
-    0x96,
-    0x87,
-    0x37,
-    0x4f,
-    0x7c,
-    0xcb,
-    0xce,
-    0xa3,
-    0x73,
-    0x47,
-    0x74,
-    0xa0,
-    0xf5,
-    0xa0,
-    0x0d,
-    0x29,
-    0xa0,
-    0x0b,
-    0xcb,
-    0x37,
-    0xdc,
-    0x5f,
-    0xf4,
-    0x8a,
-    0xbe,
-    0x6f,
-    0xe5,
-    0x98,
-    0x2c,
-    0x96,
-    0x57,
-    0xca,
-    0x42,
-    0x93,
-    0xe1,
-    0xe7,
-    0xf5,
-    0x97,
-    0xbe,
-    0xd0,
-    0xf6,
-    0x9d,
-    0xd1,
-    0x6f,
-    0xd9,
-    0xfa,
-    0xe6,
-    0xea,
-    0x77,
-    0x35,
-    0x3b,
-    0x1c,
-    0x91,
-    0x18,
-    0x3f,
-    0x45,
-    0xb6,
-    0x07,
-    0x99,
-    0x00,
-    0x66,
-    0x91,
-    0x6c,
-    0x76,
-    0x77,
-    0x45,
-    0xd9,
-    0xd2,
-    0xb8,
-    0xc7,
-    0xc6,
-    0xf5,
-    0xd5,
-    0x23,
-    0xde,
-    0x6a,
-    0x7a,
-    0x60,
-    0xd9,
-    0x9c,
-    0xbb,
-    0x59,
-    0xfe,
-    0x46,
-    0xb4,
-    0xc8,
-    0xe6,
-    0x2c,
-    0x6c,
-    0xa4,
-    0x82,
-    0x09,
-    0x00,
-    0xad,
-    0x60,
-    0xc8,
-    0xfd,
-    0x45,
-    0x29,
-    0xf6,
-    0x0d,
-    0x81,
-    0x6f,
-    0x78,
-    0xd6,
-    0x80,
-    0xa5,
-    0x79,
-    0x1f,
-    0xfb,
-    0x6f,
-    0xa7,
-    0x34,
-    0x1e,
-    0x1d,
-    0x9f,
-    0x8c,
-    0x96,
-    0x71,
-    0xa5,
-    0xaa,
-    0xec,
-    0xa9,
-    0x99,
-    0x41,
-    0x11,
-    0xb9,
-    0x26,
-    0x9b,
-    0x3a,
-    0xd9,
-    0x3d,
-    0x3b,
-    0xed,
-    0x3f,
-    0xc2,
-    0xc2,
-    0x5c,
-    0x2e,
-    0x85,
-    0x0f,
-    0xf3,
-    0x2f,
-    0x73,
-    0xaa,
-    0x2d,
-    0x9f,
-    0x0e,
-    0x63,
-    0xab,
-    0x69,
-    0x1a,
-    0x36,
-    0x87,
-    0x15,
-    0x99,
-    0x72,
-    0xe6,
-    0x02,
-    0xfa,
-    0x1b,
-    0xcc,
-    0xef,
-    0x8e,
-    0x8c,
-    0x35,
-    0xc0,
-    0x3b,
-    0x60,
-    0x61,
-    0x7f,
-    0x74,
-    0x93,
-    0x6f,
-    0xa2,
-    0x68,
-    0xe5,
-    0x2d,
-    0x8c,
-    0x7a,
-    0x7f,
-    0x2f,
-    0x56,
-    0xf2,
-    0xd9,
-    0x1e,
-    0xce,
-    0xf2,
-    0xdb,
-    0x53,
-    0xc0,
-    0xab,
-    0x43,
-    0xa4,
-    0x75,
-    0xd0,
-    0x46,
-    0x7e,
-    0x7a,
-    0x4b,
-    0x7a,
-    0x35,
-    0xa2,
-    0x30,
-    0xf3,
-    0x97,
-    0x4e,
-    0xef,
-    0xac,
-    0xc7,
-    0xec,
-    0xcd,
-    0x29,
-    0x49,
-    0xbe,
-    0x95,
-    0x5b,
-    0x59,
-    0xdd,
-    0x8a,
-    0xc4,
-    0x81,
-    0x7d,
-    0xa1,
-    0xdc,
-    0x6a,
-    0x72,
-    0xed,
-    0xb2,
-    0xf3,
-    0xf4,
-    0x5b,
-    0xd6,
-    0x80,
-    0x9f,
-    0x9f,
-    0x77,
-    0x94,
-    0xbd,
-    0x6e,
-    0xc9,
-    0xa3,
-    0xc8,
-    0xee,
-    0xa9,
-    0x21,
-    0x2b,
-    0x6b,
-    0x84,
-    0xdf,
-    0x49,
-    0x4b,
-    0x75,
-    0x97,
-    0xc0,
-    0x44,
-    0xad,
-    0xc6,
-    0xef,
-    0xcc,
-    0x18,
-    0xb9,
-    0xb6,
-    0xd1,
-    0x3e,
-    0xeb,
-    0x7c,
-    0xab,
-    0x67,
-    0x8e,
-    0x77,
-    0x4f,
-    0x02,
-    0x68,
-    0x27,
-    0xc5,
-    0x47,
-    0xe0,
-    0x24,
-    0xdc,
-    0x1c,
-    0x59,
-    0x1a,
-    0x1c,
-    0x35,
-    0xbe,
-    0x12,
-    0xfc,
-    0x80,
-    0x5e,
-    0xf3,
-    0x55,
-    0xc0,
-    0xfb,
-    0x48,
-    0x17,
-    0x77,
-    0x1d,
-    0x43,
-    0x3b,
-    0x0a,
-    0xac,
-    0x02,
-    0xf8,
-    0x20,
-    0xbe,
-    0x12,
-    0x3a,
-    0x4b,
-    0xae,
-    0x32,
-    0x50,
-    0xea,
-    0x6e,
-    0x59,
-    0xe4,
-    0x4e,
-    0x1e,
-    0xfa,
-    0x31,
-    0x1b,
-    0xdd,
-    0x86,
-    0x70,
-    0xf1,
-    0xdf,
-    0x33,
-    0x93,
-    0x4c,
-    0xbf,
-    0xfc,
-    0x36,
-    0xa9,
-    0x17,
-    0xe8,
-    0xd3,
-    0xeb,
-    0x4f,
-    0x90,
-    0x35,
-    0xfc,
-    0xb2,
-    0xdb,
-    0x2f,
-    0xb7,
-    0xc7,
-    0x0d,
-    0x8d,
-    0x06,
-    0xde,
-    0x00,
-    0x4b,
-    0x47,
-    0xe9,
-    0xb0,
-    0x05,
-    0xf5,
-    0x8d,
-    0xfe,
-    0xaf,
-    0x84,
-    0x79,
-    0xad,
-    0x86,
-    0x8c,
-    0xf7,
-    0xb1,
-    0x46,
-    0x2a,
-    0xc0,
-    0xa9,
-    0x9e,
-    0xa4,
-    0x15,
-    0xaa,
-    0xe1,
-    0x4b,
-    0x0b,
-    0x3e,
-    0xfe,
-    0xa6,
-    0x27,
-    0xac,
-    0xb2,
-    0xcc,
-    0x2a,
-    0x7a,
-    0xfc,
-    0x12,
-    0x2e,
-    0x31,
-    0xd2,
-    0xe6,
-    0xf2,
-    0x60,
-    0x12,
-    0xfb,
-    0x73,
-    0xe3,
-    0xbb,
-    0xa7,
-    0xbc,
-    0x65,
-    0x5d,
-    0x89,
-    0xfe,
-    0x24,
-    0xce,
-    0x6e,
-    0xe3,
-    0xf4,
-    0x1f,
-    0x75,
-    0x20,
-    0x87,
-    0xce,
-    0x72,
-    0x4a,
-    0xeb,
-    0x3d,
-    0x91,
-    0xea,
-    0x54,
-    0x63,
-    0x3c,
-    0xd3,
-    0x1c,
-    0xc2,
-    0x3e,
-    0xb3,
-    0x08,
-    0x99,
-    0x28,
-    0xe9,
-    0xcd,
-    0x5a,
-    0xf3,
-    0x96,
-    0xd3,
-    0x5e,
-    0xe8,
-    0xf7,
-    0x38,
-    0xd8,
-    0xbd,
-    0xf2,
-    0x18,
-    0x08,
-    0x01,
-    0xee,
-    0x0c,
-    0xb1,
-    0xba,
-    0xe8,
-    0xf0,
-    0xcc,
-    0x4c,
-    0xc3,
-    0xea,
-    0x7e,
-    0x9c,
-    0xe0,
-    0xa7,
-    0x48,
-    0x76,
-    0xef,
-    0xe8,
-    0x7e,
-    0x2c,
-    0x05,
-    0x3e,
-    0xfa,
-    0x80,
-    0xee,
-    0x11,
-    0x11,
-    0xc4,
-    0xc4,
-    0xe7,
-    0xc6,
-    0x40,
-    0xc0,
-    0xe3,
-    0x3e,
-    0xd4,
-    0x51,
-    0x8c,
-    0x74,
-    0xdf,
-    0x6b,
-    0xd1,
-    0x2e,
-    0x5f,
-    0x22,
-    0x49,
-    0x30,
-    0x59,
-    0x77,
-    0xbf,
-    0xaf,
-    0x7b,
-    0x72,
-    0xed,
-    0x08,
-    0x00,
-    0x71,
-    0x88,
-    0xb2,
-    0xd4,
-    0xbf,
-    0x7d,
-    0x71,
-    0xf8,
-    0x68,
-    0x7b,
-    0xcd,
-    0x29,
-    0x4c,
-    0xb1,
-    0xc3,
-    0xbc,
-    0x73,
-    0xd9,
-    0xba,
-    0xcd,
-    0xa0,
-    0x75,
-    0xb9,
-    0x98,
-    0x29,
-    0x58,
-    0xd6,
-    0x27,
-    0x05,
-    0x69,
-    0xf2,
-    0x2e,
-    0x27,
-    0xa4,
-    0xa3,
-    0x33,
-    0x0a,
-    0x61,
-    0x72,
-    0xf1,
-    0x8e,
-    0xd9,
-    0x47,
-    0xff,
-    0x02,
-    0xe6,
-    0x21,
-    0xad,
-    0x82,
-    0x0a,
-    0x0a,
-    0x2f,
-    0x83,
-    0xb3,
-    0x4b,
-    0xfd,
-    0xac,
-    0xbd,
-    0xdc,
-    0x79,
-    0xe8,
-    0x39,
-    0x1e,
-    0xd2,
-    0xb9,
-    0x6d,
-    0xcc,
-    0x29,
-    0xcf,
-    0x1b,
-    0x2f,
-    0xf3,
-    0xd9,
-    0x07,
-    0x92,
-    0x9f,
-    0x9b,
-    0xb3,
-    0xf6,
-    0x78,
-    0x40,
-    0x6d,
-    0x07,
-    0xcc,
-    0xf2,
-    0x8b,
-    0x4e,
-    0x4e,
-    0xa9,
-    0xf6,
-    0xa7,
-    0xb9,
-    0x40,
-    0xe5,
-    0xf6,
-    0xb6,
-    0xce,
-    0xeb,
-    0x16,
-    0x00,
-    0x33,
-    0x34,
-    0x12,
-    0xc6,
-    0xf1,
-    0x0c,
-    0x98,
-    0x51,
-    0x3e,
-    0xa0,
-    0xaa,
-    0xe6,
-    0x57,
-    0x09,
-    0x97,
-    0xee,
-    0x16,
-    0x86,
-    0x2a,
-    0x54,
-    0xc7,
-    0x09,
-    0x21,
-    0x2f,
-    0x38,
-    0xf6,
-    0xe0,
-    0xa1,
-    0x0f,
-    0x27,
-    0x67,
-    0xfe,
-    0x60,
-    0x33,
-    0x82,
-    0x31,
-    0x7f,
-    0xf0,
-    0x3f,
-    0x5c,
-    0x13,
-    0x36,
-    0xa5,
-    0xbf,
-    0x6c,
-    0xe6,
-    0xa3,
-    0xdb,
-    0x17,
-    0x2b,
-    0x47,
-    0xd7,
-    0xaf,
-    0x00,
-    0x31,
-    0x22,
-    0xf5,
-    0xf3,
-    0x46,
-    0x5a,
-    0x23,
-    0x28,
-    0xa9,
-    0x6d,
-    0x7e,
-    0xa0,
-    0xe7,
-    0xfe,
-    0x2b,
-    0xbb,
-    0x71,
-    0x0a,
-    0x43,
-    0xfc,
-    0x50,
-    0xcb,
-    0x2a,
-    0x0d,
-    0x14,
-    0xdc,
-    0x1c,
-    0x03,
-    0x0d,
-    0x9f,
-    0x08,
-    0xe2,
-    0xbe,
-    0xdc,
-    0xa2,
-    0x64,
-    0x8f,
-    0xaa,
-    0xb4,
-    0xf6,
-    0xc2,
-    0x93,
-    0xb4,
-    0x04,
-    0xa8,
-    0xf3,
-    0x9c,
-    0x76,
-    0x15,
-    0xa1,
-    0xf6,
-    0x7b,
-    0x11,
-    0xd1,
-    0x36,
-    0x85,
-    0xd0,
-    0x39,
-    0x4d,
-    0x95,
-    0xe5,
-    0x73,
-    0x7b,
-    0xb8,
-    0xb2,
-    0xa3,
-    0x65,
-    0xd1,
-    0x23,
-    0x59,
-    0x67,
-    0x9a,
-    0x9c,
-    0xb9,
-    0x2b,
-    0xe6,
-    0x2f,
-    0xd9,
-    0x7b,
-    0x29,
-    0x13,
-    0x6a,
-    0x53,
-    0x39,
-    0x51,
-    0x9b,
-    0x3b,
-    0x56,
-    0xc1,
-    0x3a,
-    0xd3,
-    0x69,
-    0x35,
-    0x1c,
-    0xb0,
-    0x89,
-    0xf4,
-    0xc0,
-    0x66,
-    0xc3,
-    0x6a,
-    0x2f,
-    0xe6,
-    0x1b,
-    0x1d,
-    0x26,
-    0x0b,
-    0xce,
-    0xe3,
-    0x77,
-    0x6f,
-    0xda,
-    0x53,
-    0xad,
-    0x83,
-    0xc0,
-    0x79,
-    0xef,
-    0xdf,
-    0x89,
-    0xce,
-    0x27,
-    0xd6,
-    0x07,
-    0x66,
-    0x63,
-    0x4e,
-    0x5d,
-    0x6c,
-    0x7b,
-    0xce,
-    0xc2,
-    0xcc,
-    0xf4,
-    0xd9,
-    0x81,
-    0x2f,
-    0x24,
-    0x7b,
-    0x44,
-    0x2c,
-    0x97,
-    0x21,
-    0x93,
-    0xbc,
-    0xb2,
-    0xae,
-    0x98,
-    0xef,
-    0x96,
-    0xca,
-    0x25,
-    0xde,
-    0x47,
-    0x7d,
-    0xf8,
-    0xe1,
-    0x0e,
-    0xfe,
-    0x3d,
-    0x02,
-    0x1b,
-    0xc5,
-    0x54,
-    0xb1,
-    0x6f,
-    0xe7,
-    0xd5,
-    0xb9,
-    0xf9,
-    0xa3,
-    0xd1,
-    0x72,
-    0xff,
-    0x38,
-    0x5b,
-    0x38,
-    0xc0,
-    0xfa,
-    0x47,
-    0x1d,
-    0x58,
-    0xa5,
-    0x32,
-    0xdb,
-    0xe3,
-    0xf1,
-    0xc3,
-    0x0d,
-    0xe5,
-    0x67,
-    0x2f,
-    0x9e,
-    0xea,
-    0x72,
-    0x03,
-    0x81,
-    0x69,
-    0xb9,
-    0x1e,
-    0xa2,
-    0xee,
-    0xac,
-    0xfc,
-    0x1d,
-    0x78,
-    0x5d,
-    0x3b,
-    0xaf,
-    0x20,
-    0x92,
-    0x57,
-    0x69,
-    0xfc,
-    0x18,
-    0xb9,
-    0xac,
-    0x43,
-    0x5a,
-    0xf0,
-    0x51,
-    0xb2,
-    0x32,
-    0x3e,
-    0x28,
-    0x2e,
-    0xfe,
-    0x56,
-    0xa4,
-    0xaa,
-    0xf7,
-    0x64,
-    0xd4,
-    0x4b,
-    0xbe,
-    0x4e,
-    0x95,
-    0xca,
-    0x38,
-    0x39,
-    0x07,
-    0x1b,
-    0x9c,
-    0x50,
-    0x3d,
-    0x4c,
-    0xca,
-    0xc0,
-    0x39,
-    0xaf,
-    0xdf,
-    0x07,
-    0x17,
-    0x3b,
-    0x06,
-    0x6f,
-    0x88,
-    0x30,
-    0x91,
-    0xd5,
-    0x82,
-    0xfa,
-    0x48,
-    0xaf,
-    0x36,
-    0x58,
-    0x00,
-    0x4e,
-    0x43,
-    0xbd,
-    0x70,
-    0x60,
-    0x29,
-    0xf7,
-    0x41,
-    0xb8,
-    0x00,
-    0x0e,
-    0x64,
-    0x52,
-    0x6a,
-    0x6f,
-    0xa8,
-    0x91,
-    0xc6,
-    0x49,
-    0x8c,
-    0xcc,
-    0xa6,
-    0x38,
-    0x51,
-    0x09,
-    0x83,
-    0x21,
-    0x54,
-    0x08,
-    0xb0,
-    0x5d,
-    0x9b,
-    0x84,
-    0x8d,
-    0x19,
-    0xae,
-    0xb5,
-    0xfd,
-    0xfc,
-    0xa8,
-    0x19,
-    0x1a,
-    0x0b,
-    0x8d,
-    0x74,
-    0x27,
-    0xca,
-    0xde,
-    0x16,
-    0xc5,
-    0xa4,
-    0x6b,
-    0x5c,
-    0x6a,
-    0x8d,
-    0x69,
-    0x79,
-    0x10,
-    0xe6,
-    0xc4,
-    0x76,
-    0x2a,
-    0xa1,
-    0xb7,
-    0x78,
-    0xdc,
-    0xa5,
-    0x99,
-    0x42,
-    0x6b,
-    0x74,
-    0xfa,
-    0xfa,
-    0xf3,
-    0x0b,
-    0xee,
-    0x30,
-    0x58,
-    0x0a,
-    0xa9,
-    0x1c,
-    0x7e,
-    0x14,
-    0x4c,
-    0x27,
-    0xbd,
-    0x79,
-    0xff,
-    0xae,
-    0x8f,
-    0x12,
-    0x40,
-    0x02,
-    0x8c,
-    0x6d,
-    0x7a,
-    0xb3,
-    0x99,
-    0x2a,
-    0xda,
-    0x0e,
-    0x5c,
-    0xa5,
-    0x5e,
-    0xe4,
-    0xf3,
-    0xd6,
-    0x2f,
-    0x8d,
-    0xe5,
-    0x75,
-    0x30,
-    0x2d,
-    0x58,
-    0x61,
-    0xd7,
-    0x36,
-    0x85,
-    0x42,
-    0x3c,
-    0x2e,
-    0x6a,
-    0x6d,
-    0x6f,
-    0xb3,
-    0xbe,
-    0x09,
-    0x0f,
-    0xbc,
-    0x2a,
-    0x70,
-    0x18,
-    0x21,
-    0xb6,
-    0xd8,
-    0xfd,
-    0x5e,
-    0x82,
-    0x33,
-    0xf7,
-    0x94,
-    0xb6,
-    0x54,
-    0x9c,
-    0xd0,
-    0xbb,
-    0x52,
-    0xb3,
-    0x90,
-    0xac,
-    0x31,
-    0x47,
-    0x83,
-    0x07,
-    0xbf,
-    0xfa,
-    0x91,
-    0xa9,
-    0xbd,
-    0x9c,
-    0x1b,
-    0xf9,
-    0x3f,
-    0xfc,
-    0x84,
-    0x63,
-    0x56,
-    0xfe,
-    0xf0,
-    0x08,
-    0xeb,
-    0xee,
-    0x4b,
-    0xb3,
-    0xee,
-    0x14,
-    0x8e,
-    0x0f,
-    0xb1,
-    0x89,
-    0x3d,
-    0x18,
-    0x8e,
-    0x49,
-    0x34,
-    0xd0,
-    0xd0,
-    0x88,
-    0xa4,
-    0x33,
-    0xd1,
-    0x4a,
-    0x59,
-    0x6c,
-    0x5f,
-    0x2e,
-    0x3e,
-    0x49,
-    0x64,
-    0x8a,
-    0x22,
-    0xed,
-    0xc6,
-    0xbd,
-    0xbc,
-    0xc5,
-    0x8d,
-    0xc1,
-    0xed,
-    0xbd,
-    0x44,
-    0x00,
-    0x46,
-    0xb3,
-    0xa1,
-    0x69,
-    0xca,
-    0x2b,
-    0x68,
-    0xc2,
-    0xf5,
-    0x45,
-    0x8c,
-    0x40,
-    0xfd,
-    0xed,
-    0x97,
-    0x55,
-    0x57,
-    0x52,
-    0x4d,
-    0xc9,
-    0x7d,
-    0x99,
-    0x8c,
-    0x0c,
-    0xef,
-    0xd2,
-    0x77,
-    0xcb,
-    0x77,
-    0x2b,
-    0xd4,
-    0xc1,
-    0xb2,
-    0x63,
-    0xb1,
-    0xd0,
-    0xcc,
-    0x82,
-    0x4e,
-    0x50,
-    0x8b,
-    0xc8,
-    0x37,
-    0xa7,
-    0x8f,
-    0xe3,
-    0xb1,
-    0x19,
-    0xd8,
-    0x65,
-    0x57,
-    0xe2,
-    0x88,
-    0x74,
-    0x05,
-    0x82,
-    0xea,
-    0xc3,
-    0xf5,
-    0x59,
-    0xb4,
-    0xc2,
-    0x28,
-    0x73,
-    0x89,
-    0x12,
-    0x08,
-    0xa5,
-    0xc2,
-    0x3c,
-    0x4b,
-    0xd9,
-    0x6e,
-    0xa2,
-    0x1a,
-    0xa6,
-    0x97,
-    0xb6,
-    0x73,
-    0x24,
-    0xc8,
-    0x69,
-    0xcc,
-    0xfe,
-    0xcb,
-    0xe7,
-    0xf9,
-    0xc8,
-    0xb7,
-    0x81,
-    0x4f,
-    0x93,
-    0x2b,
-    0xea,
-    0x0a,
-    0xbf,
-    0xd4,
-    0xa7,
-    0xec,
-    0x11,
-    0x35,
-    0xc1,
-    0x27,
-    0x05,
-    0xa7,
-    0xbd,
-    0x7d,
-    0x66,
-    0x9e,
-    0xcd,
-    0xa6,
-    0x1b,
-    0x2f,
-    0x48,
-    0xf2,
-    0x44,
-    0xcf,
-    0x58,
-    0x2f,
-    0x86,
-    0x5e,
-    0xf3,
-    0xcd,
-    0xa2,
-    0x64,
-    0x0c,
-    0x40,
-    0x4d,
-    0x9a,
-    0x0a,
-    0xa6,
-    0x3c,
-    0xac,
-    0x79,
-    0xaa,
-    0x7e,
-    0x3d,
-    0xff,
-    0xa8,
-    0x0e,
-    0x2b,
-    0x92,
-    0x12,
-    0xa9,
-    0x15,
-    0xe9,
-    0x12,
-    0xdd,
-    0x1b,
-    0x30,
-    0x70,
-    0x63,
-    0xe5,
-    0x00,
-    0xb7,
-    0xae,
-    0xe7,
-    0x8e,
-    0x93,
-    0xc4,
-    0xe3,
-    0x23,
-    0x7e,
-    0x4d,
-    0xaf,
-    0xcc,
-    0x9b,
-    0xe9,
-    0x38,
-    0x52,
-    0xe2,
-    0xc7,
-    0xc7,
-    0x6c,
-    0x7e,
-    0x74,
-    0x83,
-    0x34,
-    0x73,
-    0xf0,
-    0x38,
-    0xd8,
-    0x84,
-    0x07,
-    0x56,
-    0x92,
-    0x54,
-    0xde,
-    0x3d,
-    0xda,
-    0xcb,
-    0xcd,
-    0xb7,
-    0xda,
-    0xbb,
-    0x6c,
-    0xc6,
-    0x22,
-    0xc4,
-    0xf1,
-    0xa1,
-    0x9d,
-    0x75,
-    0xb9,
-    0xf9,
-    0xc3,
-    0xb3,
-    0x24,
-    0x80,
-    0x11,
-    0x5f,
-    0xa6,
-    0xac,
-    0xb6,
-    0x33,
-    0x1b,
-    0xb8,
-    0x90,
-    0xed,
-    0x5b,
-    0xed,
-    0x56,
-    0xb0,
-    0x0f,
-    0x1f,
-    0x17,
-    0xa7,
-    0xc3,
-    0x7a,
-    0xe3,
-    0xeb,
-    0x3c,
-    0x7f,
-    0xc8,
-    0xa7,
-    0x0b,
-    0x49,
-    0x00,
-    0x7a,
-    0x62,
-    0x15,
-    0x68,
-    0x1c,
-    0x27,
-    0x01,
-    0x34,
-    0x45,
-    0x47,
-    0x14,
-    0xe1,
-    0xca,
-    0x4d,
-    0x7f,
-    0x6c,
-    0x09,
-    0x33,
-    0x22,
-    0xc2,
-    0x88,
-    0x77,
-    0x52,
-    0x77,
-    0xd9,
-    0x72,
-    0xda,
-    0xba,
-    0xc1,
-    0xe6,
-    0x3f,
-    0x89,
-    0x99,
-    0xd6,
-    0x49,
-    0x21,
-    0xf3,
-    0x9a,
-    0xbe,
-    0xb9,
-    0x81,
-    0x32,
-    0x71,
-    0x6f,
-    0x33,
-    0xdb,
-    0x7b,
-    0x83,
-    0xa0,
-    0xe0,
-    0xc9,
-    0xc3,
-    0xa7,
-    0xb3,
-    0xd7,
-    0x46,
-    0x56,
-    0x3c,
-    0xba,
-    0x5d,
-    0x0a,
-    0x71,
-    0x64,
-    0xc7,
-    0xd8,
-    0x27,
-    0x24,
-    0x24,
-    0x2c,
-    0x27,
-    0x6c,
-    0xac,
-    0xb0,
-    0x85,
-    0xd7,
-    0x21,
-    0x70,
-    0x2d,
-    0x6a,
-    0x02,
-    0x3b,
-    0xbf,
-    0x1b,
-    0x02,
-    0x4c,
-    0x9d,
-    0x8f,
-    0xb9,
-    0x2a,
-    0x42,
-    0x28,
-    0x98,
-    0xcc,
-    0xd5,
-    0x3f,
-    0x22,
-    0x01,
-    0xfd,
-    0xae,
-    0x59,
-    0x0f,
-    0xf8,
-    0x92,
-    0x77,
-    0x9a,
-    0xe7,
-    0x4f,
-    0xdf,
-    0xc8,
-    0x6c,
-    0xd4,
-    0x53,
-    0xa3,
-    0x77,
-    0x20,
-    0x67,
-    0xbf,
-    0x5d,
-    0x04,
-    0x36,
-    0x1c,
-    0x2b,
-    0x2b,
-    0x53,
-    0x4d,
-    0x39,
-    0x59,
-    0x03,
-    0xda,
-    0x02,
-    0xf0,
-    0xa9,
-    0xe4,
-    0x32,
-    0xb8,
-    0x81,
-    0x07,
-    0x01,
-    0xdf,
-    0x91,
-    0x85,
-    0xc0,
-    0x3f,
-    0xdd,
-    0xa0,
-    0xb1,
-    0xe0,
-    0xdb,
-    0x47,
-    0x1c,
-    0xbe,
-    0x26,
-    0xf5,
-    0x9f,
-    0xcc,
-    0x76,
-    0xd7,
-    0xc6,
-    0x38,
-    0xd0,
-    0x2d,
-    0xdc,
-    0xf1,
-    0xfa,
-    0xf2,
-    0x00,
-    0x67,
-    0x32,
-    0xbf,
-    0x7b,
-    0x92,
-    0x1f,
-    0xed,
-    0x50,
-    0x35,
-    0x08,
-    0xfa,
-    0x15,
-    0x64,
-    0x44,
-    0x2d,
-    0x02,
-    0x44,
-    0xf2,
-    0x7d,
-    0x48,
-    0x12,
-    0xea,
-    0xb0,
-    0xa3,
-    0x66,
-    0xf3,
-    0xc0,
-    0x33,
-    0xb9,
-    0x36,
-    0x82,
-    0x88,
-    0x25,
-    0xf2,
-    0x89,
-    0xfc,
-    0x6d,
-    0x72,
-    0x49,
-    0x45,
-    0x3d,
-    0x3c,
-    0x78,
-    0x4a,
-    0xb3,
-    0x8c,
-    0xba,
-    0x36,
-    0x1d,
-    0x00,
-    0x7c,
-    0xcb,
-    0x05,
-    0x95,
-    0x20,
-    0xfa,
-    0x6b,
-    0xd2,
-    0x5b,
-    0xb0,
-    0x51,
-    0x43,
-    0xdc,
-    0xf2,
-    0x7d,
-    0x29,
-    0x2f,
-    0x2c,
-    0x7a,
-    0x70,
-    0xe0,
-    0xc6,
-    0xe0,
-    0xe1,
-    0xe3,
-    0xf9,
-    0xd5,
-    0x99,
-    0x33,
-    0xe1,
-    0xd4,
-    0xba,
-    0xba,
-    0xd3,
-    0xad,
-    0x60,
-    0x71,
-    0xf0,
-    0xcd,
-    0xd7,
-    0xc8,
-    0xfa,
-    0xc0,
-    0x0b,
-    0x48,
-    0x67,
-    0xf4,
-    0x3f,
-    0x77,
-    0xb4,
-    0xc0,
-    0x02,
-    0xfc,
-    0xfc,
-    0xa4,
-    0x5f,
-    0x03,
-    0xc9,
-    0xd3,
-    0x55,
-    0xe3,
-    0x2a,
-    0xee,
-    0x87,
-    0xfe,
-    0x06,
-    0x13,
-    0x33,
-    0xe9,
-    0xaf,
-    0x16,
-    0x68,
-    0xce,
-    0xba,
-    0x0e,
-    0x74,
-    0x0e,
-    0x0f,
-    0x14,
-    0x9c,
-    0x2a,
-    0x3c,
-    0x47,
-    0x11,
-    0xe3,
-    0x0f,
-    0x14,
-    0x1f,
-    0xa0,
-    0x63,
-    0xb4,
-    0xa6,
-    0x11,
-    0x3a,
-    0xf5,
-    0xce,
-    0x12,
-    0x0c,
-    0x3e,
-    0xf7,
-    0xd2,
-    0x5f,
-    0xcd,
-    0xef,
-    0x34,
-    0x98,
-    0x44,
-    0x68,
-    0x75,
-    0x11,
-    0x64,
-    0xa9,
-    0x10,
-    0x6b,
-    0x18,
-    0x83,
-    0xde,
-    0x26,
-    0xb5,
-    0x87,
-    0x82,
-    0x6e,
-    0x80,
-    0x76,
-    0x04,
-    0x38,
-    0x71,
-    0xf9,
-    0xbc,
-    0x8e,
-    0x36,
-    0x92,
-    0x72,
-    0x27,
-    0x7b,
-    0xd3,
-    0xc3,
-    0x3b,
-    0x69,
-    0xce,
-    0xc6,
-    0x95,
-    0x6c,
-    0xcc,
-    0xf0,
-    0xea,
-    0x3a,
-    0x42,
-    0x35,
-    0x69,
-    0x11,
-    0x00,
-    0x70,
-    0x93,
-    0x3f,
-    0xac,
-    0x05,
-    0x4d,
-    0xe8,
-    0x6f,
-    0xc5,
-    0x34,
-    0x04,
-    0xee,
-    0x12,
-    0x30,
-    0xa7,
-    0x7c,
-    0x43,
-    0x4c,
-    0x85,
-    0x8d,
-    0x4a,
-    0xc5,
-    0xb5,
-    0x6e,
-    0x93,
-    0x60,
-    0xb5,
-    0x34,
-    0x30,
-    0x01,
-    0xaf,
-    0xf3,
-    0x34,
-    0x7a,
-    0xfa,
-    0x30,
-    0x5c,
-    0xa1,
-    0xe4,
-    0x98,
-    0xf5,
-    0xa5,
-    0xaf,
-    0xf2,
-    0xf9,
-    0xa2,
-    0xd9,
-    0x52,
-    0x7c,
-    0x72,
-    0xa1,
-    0x8f,
-    0x46,
-    0xc7,
-    0xc6,
-    0xf8,
-    0xc2,
-    0x76,
-    0x92,
-    0x43,
-    0x17,
-    0x16,
-    0x17,
-    0xc6,
-    0x94,
-    0xca,
-    0xb9,
-    0xea,
-    0x51,
-    0x5b,
-    0xec,
-    0xdc,
-    0x13,
-    0x8a,
-    0x3f,
-    0x85,
-    0x71,
-    0xa4,
-    0x9a,
-    0xbd,
-    0x35,
-    0x56,
-    0xc3,
-    0xbb,
-    0x05,
-    0xc3,
-    0x27,
-    0xd0,
-    0x43,
-    0xd4,
-    0xd8,
-    0x56,
-    0x31,
-    0xcf,
-    0xd2,
-    0xe3,
-    0x59,
-    0x2c,
-    0x82,
-    0xc2,
-    0x2c,
-    0xa4,
-    0x89,
-    0xa3,
-    0xe9,
-    0x8a,
-    0xbd,
-    0x91,
-    0xc0,
-    0x5e,
-    0x70,
-    0x25,
-    0x38,
-    0xa0,
-    0xf6,
-    0xf9,
-    0xce,
-    0xe2,
-    0x61,
-    0x60,
-    0xde,
-    0x21,
-    0x8f,
-    0x54,
-    0xc7,
-    0x55,
-    0x67,
-    0xb0,
-    0x4b,
-    0x47,
-    0x5f,
-    0xa0,
-    0x34,
-    0xa3,
-    0x41,
-    0x55,
-    0x3d,
-    0x4e,
-    0x30,
-    0xfd,
-    0x2f,
-    0xf9,
-    0xe6,
-    0xf2,
-    0x4b,
-    0xf7,
-    0x3f,
-    0x31,
-    0xe8,
-    0x4b,
-    0xfb,
-    0x0f,
-    0x5d,
-    0x06,
-    0xbf,
-    0x27,
-    0x21,
-    0xd0,
-    0x5e,
-    0x97,
-    0x31,
-    0xc4,
-    0x57,
-    0x6c,
-    0xb2,
-    0x81,
-    0x9f,
-    0x5a,
-    0xd8,
-    0x7d,
-    0xa0,
-    0xb1,
-    0x06,
-    0x9d,
-    0x81,
-    0x8c,
-    0x37,
-    0x03,
-    0xa8,
-    0x4b,
-    0x9c,
-    0x28,
-    0x7d,
-    0x44,
-    0x86,
-    0x2a,
-    0x71,
-    0xb6,
-    0x87,
-    0x67,
-    0x40,
-    0xfe
-  ],
-  const [
-    0x9d,
-    0x18,
-    0x98,
-    0xf0,
-    0x4e,
-    0x38,
-    0xda,
-    0x85,
-    0xc2,
-    0x7e,
-    0x63,
-    0x17,
-    0xc1,
-    0x9e,
-    0xe8,
-    0x1c,
-    0x3b,
-    0xdc,
-    0x6b,
-    0x1a,
-    0xe7,
-    0x21,
-    0x02,
-    0x62,
-    0x2a,
-    0x4e,
-    0xdb,
-    0xfa,
-    0x3a,
-    0xd0,
-    0x7d,
-    0xdb,
-    0x83,
-    0x75,
-    0x50,
-    0x5c,
-    0x4a,
-    0x7d,
-    0x60,
-    0xef,
-    0x90,
-    0xf5,
-    0x5e,
-    0x0b,
-    0x39,
-    0x40,
-    0xe8,
-    0x69,
-    0x6d,
-    0xf7,
-    0x09,
-    0x73,
-    0x3f,
-    0xf3,
-    0x04,
-    0xfa,
-    0x8c,
-    0xa7,
-    0x4d,
-    0x27,
-    0x26,
-    0xb3,
-    0xd9,
-    0xb4,
-    0x32,
-    0xb7,
-    0x97,
-    0x5b,
-    0xcf,
-    0x65,
-    0x3f,
-    0x8f,
-    0xf9,
-    0xdb,
-    0x4a,
-    0x6b,
-    0xac,
-    0x2f,
-    0x41,
-    0xe8,
-    0x4c,
-    0x4b,
-    0x3b,
-    0x52,
-    0x44,
-    0xfb,
-    0xa2,
-    0xfd,
-    0xee,
-    0x44,
-    0x35,
-    0x34,
-    0xb3,
-    0xf8,
-    0x53,
-    0x72,
-    0x73,
-    0x87,
-    0x76,
-    0xd5,
-    0x26,
-    0x18,
-    0xfe,
-    0xcf,
-    0xc4,
-    0xd8,
-    0x30,
-    0x1f,
-    0x63,
-    0x92,
-    0x7e,
-    0xff,
-    0x9f,
-    0x81,
-    0x08,
-    0x9f,
-    0x3f,
-    0x62,
-    0x64,
-    0xd3,
-    0x16,
-    0xcc,
-    0x9a,
-    0x08,
-    0x26,
-    0xc4,
-    0x73,
-    0x7d,
-    0x0c,
-    0x8d,
-    0xf4,
-    0xb0,
-    0x98,
-    0xbd,
-    0x25,
-    0x16,
-    0xbb,
-    0x96,
-    0x17,
-    0x0e,
-    0xa6,
-    0x92,
-    0x24,
-    0x18,
-    0x30,
-    0x40,
-    0x79,
-    0x42,
-    0x78,
-    0x4f,
-    0xd2,
-    0xe4,
-    0xcc,
-    0xe8,
-    0x85,
-    0x8d,
-    0xca,
-    0x42,
-    0xc2,
-    0x3d,
-    0xc5,
-    0x70,
-    0x19,
-    0xd5,
-    0x6b,
-    0x7d,
-    0x3c,
-    0xcb,
-    0xa4,
-    0xba,
-    0x07,
-    0x22,
-    0xbd,
-    0x57,
-    0xbd,
-    0x9a,
-    0xc5,
-    0x31,
-    0x95,
-    0x24,
-    0x37,
-    0xeb,
-    0x75,
-    0x98,
-    0xda,
-    0x40,
-    0xfd,
-    0xaa,
-    0xe6,
-    0x97,
-    0xc7,
-    0x1b,
-    0x68,
-    0xd8,
-    0xed,
-    0x2c,
-    0xe7,
-    0x7f,
-    0xcc,
-    0x58,
-    0x48,
-    0xef,
-    0x08,
-    0x42,
-    0xef,
-    0x08,
-    0xd1,
-    0xed,
-    0x27,
-    0xfb,
-    0x64,
-    0x2b,
-    0xc4,
-    0x5d,
-    0xd4,
-    0x58,
-    0x07,
-    0x7b,
-    0x0a,
-    0x47,
-    0xc1,
-    0xee,
-    0x0a,
-    0x7d,
-    0xbb,
-    0x6f,
-    0x79,
-    0x9d,
-    0x56,
-    0xec,
-    0x5c,
-    0x24,
-    0x6f,
-    0xdb,
-    0x23,
-    0x56,
-    0x85,
-    0xce,
-    0xe6,
-    0x79,
-    0x1e,
-    0x47,
-    0xee,
-    0x40,
-    0x66,
-    0xce,
-    0x77,
-    0x8a,
-    0x1a,
-    0x42,
-    0xb4,
-    0x4d,
-    0xa4,
-    0x6d,
-    0x14,
-    0xcc,
-    0x88,
-    0xda,
-    0xc4,
-    0x11,
-    0xfe,
-    0xeb,
-    0x75,
-    0x97,
-    0xe0,
-    0x26,
-    0x5f,
-    0x47,
-    0xc7,
-    0xd0,
-    0x86,
-    0xa5,
-    0x72,
-    0xbd,
-    0x3c,
-    0x4c,
-    0x67,
-    0x66,
-    0xe7,
-    0x98,
-    0xdc,
-    0x3c,
-    0x04,
-    0xa2,
-    0xd7,
-    0x3c,
-    0x6c,
-    0x71,
-    0x95,
-    0xc4,
-    0xd6,
-    0x6e,
-    0x29,
-    0xa5,
-    0x9e,
-    0x19,
-    0x65,
-    0x79,
-    0xc5,
-    0xfb,
-    0xfd,
-    0x37,
-    0x38,
-    0xdb,
-    0xea,
-    0x04,
-    0x55,
-    0x35,
-    0x0d,
-    0x4c,
-    0xab,
-    0xe8,
-    0x15,
-    0x12,
-    0x01,
-    0x2f,
-    0xa2,
-    0x84,
-    0x9a,
-    0xd2,
-    0xaa,
-    0xd3,
-    0xb8,
-    0x9e,
-    0x1d,
-    0x41,
-    0x5f,
-    0x12,
-    0xc4,
-    0x7c,
-    0x5b,
-    0x5b,
-    0x6f,
-    0x2a,
-    0x85,
-    0x83,
-    0x4f,
-    0xc5,
-    0x41,
-    0xe5,
-    0xa1,
-    0xa9,
-    0x4b,
-    0xe4,
-    0x8c,
-    0x6b,
-    0xb4,
-    0xdc,
-    0x4d,
-    0x6d,
-    0x27,
-    0x59,
-    0x91,
-    0xaf,
-    0x71,
-    0x87,
-    0x22,
-    0xe8,
-    0x40,
-    0xea,
-    0xc6,
-    0xd6,
-    0x2b,
-    0x4f,
-    0x65,
-    0xd2,
-    0xf3,
-    0x03,
-    0x69,
-    0xa7,
-    0x09,
-    0x42,
-    0x6a,
-    0xa4,
-    0x50,
-    0xf2,
-    0x0b,
-    0xf0,
-    0x23,
-    0x92,
-    0x1f,
-    0x1e,
-    0x9a,
-    0x6d,
-    0x11,
-    0x01,
-    0x09,
-    0x13,
-    0x82,
-    0xc2,
-    0xca,
-    0x09,
-    0x33,
-    0x2f,
-    0x3d,
-    0xc0,
-    0x26,
-    0x56,
-    0x0c,
-    0xc4,
-    0x00,
-    0x53,
-    0xb4,
-    0x36,
-    0xb2,
-    0x66,
-    0x41,
-    0x7c,
-    0x58,
-    0x49,
-    0x58,
-    0x37,
-    0x61,
-    0xc0,
-    0x7b,
-    0x75,
-    0xf1,
-    0x71,
-    0x89,
-    0x29,
-    0x83,
-    0xf6,
-    0x84,
-    0xd8,
-    0xd3,
-    0x31,
-    0x97,
-    0x94,
-    0xfb,
-    0xdf,
-    0x58,
-    0x2e,
-    0xdc,
-    0x70,
-    0x4a,
-    0xa8,
-    0xbf,
-    0x17,
-    0xa6,
-    0xe9,
-    0x3c,
-    0x1d,
-    0x5b,
-    0xb4,
-    0x5c,
-    0x7a,
-    0x53,
-    0xdb,
-    0xfa,
-    0xa6,
-    0xf8,
-    0xb0,
-    0x6f,
-    0xad,
-    0xf7,
-    0xbd,
-    0x6e,
-    0x82,
-    0x43,
-    0xb5,
-    0x2c,
-    0x95,
-    0x5e,
-    0xaa,
-    0xc4,
-    0xa7,
-    0xd4,
-    0x7f,
-    0xdb,
-    0xdd,
-    0x08,
-    0xa1,
-    0x7f,
-    0x14,
-    0x32,
-    0xf2,
-    0x55,
-    0x75,
-    0xa9,
-    0x06,
-    0xf4,
-    0x49,
-    0x5e,
-    0x92,
-    0x8c,
-    0x0e,
-    0xa9,
-    0x21,
-    0xcb,
-    0xca,
-    0x49,
-    0x09,
-    0x01,
-    0x9f,
-    0xa6,
-    0x9e,
-    0x82,
-    0xa0,
-    0x58,
-    0xa5,
-    0x4c,
-    0xe3,
-    0xed,
-    0x0c,
-    0xe9,
-    0xd7,
-    0xe7,
-    0xd8,
-    0x97,
-    0xd8,
-    0x05,
-    0x5e,
-    0xa7,
-    0x01,
-    0xc4,
-    0xb6,
-    0x23,
-    0x42,
-    0x24,
-    0x6d,
-    0xb3,
-    0xb2,
-    0xaf,
-    0x7a,
-    0xc1,
-    0x26,
-    0xb8,
-    0x73,
-    0xdc,
-    0x02,
-    0xe1,
-    0x01,
-    0x5a,
-    0x4f,
-    0xe0,
-    0x92,
-    0x42,
-    0x0e,
-    0x82,
-    0x4d,
-    0x69,
-    0xcc,
-    0xef,
-    0x4b,
-    0xda,
-    0x77,
-    0x31,
-    0x04,
-    0x7b,
-    0x70,
-    0xf0,
-    0x07,
-    0xee,
-    0xe1,
-    0x7f,
-    0xef,
-    0xb6,
-    0x51,
-    0x1d,
-    0x92,
-    0x9b,
-    0x76,
-    0x74,
-    0x7b,
-    0x4f,
-    0x4a,
-    0x66,
-    0x9b,
-    0x51,
-    0x61,
-    0x09,
-    0x3b,
-    0x12,
-    0x79,
-    0xf0,
-    0x35,
-    0x57,
-    0x53,
-    0xad,
-    0x64,
-    0xde,
-    0xc1,
-    0x93,
-    0x59,
-    0x44,
-    0x01,
-    0xc1,
-    0x4f,
-    0x26,
-    0x49,
-    0x5c,
-    0x61,
-    0x87,
-    0xa3,
-    0x1b,
-    0xfb,
-    0x71,
-    0xfb,
-    0x09,
-    0x8f,
-    0xdf,
-    0x76,
-    0x86,
-    0x89,
-    0xdb,
-    0x06,
-    0x8f,
-    0x84,
-    0xe4,
-    0x3c,
-    0x40,
-    0xbe,
-    0x92,
-    0x5d,
-    0x97,
-    0xc9,
-    0x7d,
-    0xb7,
-    0x7b,
-    0x84,
-    0x5a,
-    0x35,
-    0xfd,
-    0x4a,
-    0x67,
-    0x32,
-    0xdd,
-    0x69,
-    0x0a,
-    0x8b,
-    0x50,
-    0xd6,
-    0xb4,
-    0xf8,
-    0x00,
-    0x1f,
-    0x0c,
-    0x9c,
-    0x55,
-    0xa0,
-    0x4a,
-    0xda,
-    0xf3,
-    0xfa,
-    0xe0,
-    0x6b,
-    0x84,
-    0xc1,
-    0x60,
-    0xad,
-    0xb7,
-    0x75,
-    0x9a,
-    0x3e,
-    0x88,
-    0xb4,
-    0x04,
-    0xca,
-    0xc3,
-    0xad,
-    0x60,
-    0x21,
-    0xc3,
-    0xd8,
-    0x98,
-    0x8d,
-    0x80,
-    0xe5,
-    0xed,
-    0x62,
-    0xc9,
-    0xf2,
-    0x50,
-    0xd6,
-    0xcd,
-    0x00,
-    0x10,
-    0x13,
-    0xe0,
-    0xa8,
-    0xb6,
-    0x8b,
-    0x7c,
-    0x0a,
-    0x2e,
-    0x8c,
-    0x86,
-    0x07,
-    0x27,
-    0x14,
-    0xd3,
-    0xb0,
-    0xbb,
-    0xe6,
-    0xeb,
-    0xfd,
-    0x53,
-    0xdd,
-    0x0d,
-    0xc3,
-    0xc5,
-    0x81,
-    0x73,
-    0xe0,
-    0xc0,
-    0xd8,
-    0xd6,
-    0xb8,
-    0x6a,
-    0x7f,
-    0x35,
-    0xe6,
-    0x47,
-    0xf8,
-    0xd3,
-    0x2b,
-    0x5d,
-    0x46,
-    0x7f,
-    0xaa,
-    0x96,
-    0xb7,
-    0x17,
-    0x58,
-    0x65,
-    0x02,
-    0x4f,
-    0xae,
-    0xac,
-    0x91,
-    0xaf,
-    0xa1,
-    0xde,
-    0x20,
-    0xdb,
-    0xd3,
-    0x61,
-    0x87,
-    0x17,
-    0x0b,
-    0x36,
-    0xd4,
-    0x0a,
-    0xe3,
-    0xdb,
-    0x9d,
-    0xc2,
-    0xc0,
-    0x70,
-    0x95,
-    0xf9,
-    0x07,
-    0x1a,
-    0x5c,
-    0x97,
-    0x8e,
-    0xa5,
-    0x9c,
-    0x78,
-    0x51,
-    0x6d,
-    0x51,
-    0x6e,
-    0x67,
-    0x7e,
-    0x68,
-    0x8a,
-    0x34,
-    0xfa,
-    0x8c,
-    0x97,
-    0xdf,
-    0xbb,
-    0x3d,
-    0xe8,
-    0x06,
-    0x3a,
-    0x22,
-    0x54,
-    0xb1,
-    0xaf,
-    0xa0,
-    0x7e,
-    0x85,
-    0x7a,
-    0xab,
-    0x5a,
-    0x3b,
-    0xc2,
-    0xdc,
-    0xec,
-    0x50,
-    0x5c,
-    0xc4,
-    0x53,
-    0xfd,
-    0xee,
-    0x81,
-    0x07,
-    0x69,
-    0x54,
-    0x8e,
-    0x5f,
-    0x1e,
-    0x42,
-    0xe0,
-    0x56,
-    0xb9,
-    0x2b,
-    0x2e,
-    0x8e,
-    0xe6,
-    0x62,
-    0x90,
-    0x95,
-    0x8c,
-    0x80,
-    0x4b,
-    0x68,
-    0x45,
-    0x05,
-    0xeb,
-    0x35,
-    0x11,
-    0x42,
-    0x93,
-    0x65,
-    0x4b,
-    0x76,
-    0x92,
-    0xda,
-    0xdc,
-    0x37,
-    0x36,
-    0x75,
-    0xae,
-    0x13,
-    0xe5,
-    0xdc,
-    0x64,
-    0x78,
-    0x69,
-    0x7a,
-    0x48,
-    0xd1,
-    0x8c,
-    0xc7,
-    0x84,
-    0xf2,
-    0xe5,
-    0xc9,
-    0x96,
-    0xb6,
-    0xf1,
-    0xdb,
-    0xfe,
-    0xe6,
-    0x66,
-    0xad,
-    0x39,
-    0x5d,
-    0xc3,
-    0x8c,
-    0xf3,
-    0x6a,
-    0x2c,
-    0xe3,
-    0x79,
-    0x76,
-    0x75,
-    0x02,
-    0x6d,
-    0xe7,
-    0x7d,
-    0x1f,
-    0xbd,
-    0x44,
-    0xbd,
-    0x9a,
-    0xd5,
-    0x99,
-    0x20,
-    0x86,
-    0x14,
-    0x1d,
-    0x15,
-    0x64,
-    0x7d,
-    0x12,
-    0xe3,
-    0x31,
-    0xb0,
-    0xed,
-    0x3e,
-    0xa4,
-    0x18,
-    0xb7,
-    0x17,
-    0xb1,
-    0x65,
-    0xb3,
-    0xb8,
-    0x51,
-    0x3d,
-    0x41,
-    0x0f,
-    0x85,
-    0x2e,
-    0x02,
-    0x4a,
-    0x98,
-    0xe8,
-    0x3d,
-    0xa5,
-    0xa5,
-    0xa9,
-    0x81,
-    0x80,
-    0x5a,
-    0xf8,
-    0x8c,
-    0xb5,
-    0xfb,
-    0x96,
-    0x6c,
-    0x28,
-    0xaa,
-    0xb2,
-    0xe4,
-    0xa0,
-    0xe5,
-    0x5c,
-    0x11,
-    0xd5,
-    0x50,
-    0x3c,
-    0x4d,
-    0xca,
-    0xb5,
-    0x84,
-    0x54,
-    0x5c,
-    0x49,
-    0x23,
-    0xa6,
-    0x1b,
-    0x31,
-    0x3c,
-    0x2c,
-    0x5a,
-    0x44,
-    0xd6,
-    0x1d,
-    0x82,
-    0x13,
-    0xd5,
-    0x23,
-    0xac,
-    0x26,
-    0x29,
-    0xba,
-    0x6e,
-    0x89,
-    0x45,
-    0xd9,
-    0xf4,
-    0x88,
-    0xd2,
-    0xd5,
-    0x53,
-    0xb6,
-    0xa5,
-    0x82,
-    0x1b,
-    0x34,
-    0xef,
-    0x9b,
-    0x2b,
-    0x2f,
-    0xb4,
-    0x64,
-    0xca,
-    0xab,
-    0x7f,
-    0x8d,
-    0xf3,
-    0x7f,
-    0x53,
-    0x5a,
-    0xef,
-    0xa1,
-    0xe4,
-    0x01,
-    0x2a,
-    0xa4,
-    0x07,
-    0x54,
-    0x3f,
-    0x7f,
-    0x68,
-    0x9f,
-    0x55,
-    0x90,
-    0x7b,
-    0xd4,
-    0xae,
-    0xe1,
-    0xb5,
-    0xe5,
-    0x7d,
-    0xa9,
-    0xfb,
-    0x72,
-    0xf8,
-    0x16,
-    0x5b,
-    0xa4,
-    0xaf,
-    0x49,
-    0xfa,
-    0x59,
-    0x1c,
-    0xa3,
-    0x4d,
-    0x81,
-    0x7b,
-    0x3f,
-    0x8c,
-    0xc7,
-    0xdc,
-    0xbf,
-    0x64,
-    0x75,
-    0x76,
-    0x4c,
-    0xed,
-    0x91,
-    0x3e,
-    0xd8,
-    0xdb,
-    0x4c,
-    0xb8,
-    0xa6,
-    0xf8,
-    0x9e,
-    0x0d,
-    0x0d,
-    0xd2,
-    0x2a,
-    0x5f,
-    0x79,
-    0xb0,
-    0x67,
-    0x59,
-    0xb2,
-    0xcb,
-    0x01,
-    0x0a,
-    0x61,
-    0xbb,
-    0x7d,
-    0xf3,
-    0xd0,
-    0x30,
-    0x1d,
-    0x5e,
-    0xf1,
-    0xe2,
-    0x03,
-    0xf2,
-    0xa2,
-    0xcb,
-    0x98,
-    0x85,
-    0x2f,
-    0x93,
-    0x2f,
-    0x31,
-    0x18,
-    0x4c,
-    0xe6,
-    0xaa,
-    0x15,
-    0x5f,
-    0xcd,
-    0xce,
-    0x58,
-    0xc6,
-    0x4b,
-    0x7e,
-    0x12,
-    0x7c,
-    0xbd,
-    0xad,
-    0x38,
-    0x32,
-    0x5f,
-    0xb6,
-    0x87,
-    0x44,
-    0x70,
-    0xf3,
-    0xc6,
-    0xeb,
-    0x91,
-    0x8b,
-    0x4b,
-    0xb4,
-    0x6f,
-    0x8b,
-    0xc0,
-    0x31,
-    0xa1,
-    0x39,
-    0x27,
-    0xee,
-    0xd4,
-    0xa5,
-    0x1c,
-    0xa6,
-    0x25,
-    0x80,
-    0x5a,
-    0xb7,
-    0xce,
-    0x31,
-    0x81,
-    0xd4,
-    0x05,
-    0x26,
-    0x17,
-    0xfa,
-    0x21,
-    0x68,
-    0xcc,
-    0xa5,
-    0xff,
-    0x73,
-    0x02,
-    0x43,
-    0xa4,
-    0x44,
-    0x8c,
-    0xe9,
-    0x23,
-    0xb3,
-    0xb6,
-    0x45,
-    0xc1,
-    0x03,
-    0x86,
-    0xd4,
-    0x58,
-    0xb8,
-    0x42,
-    0x54,
-    0xf9,
-    0xa8,
-    0x32,
-    0x7d,
-    0xd5,
-    0x55,
-    0xa7,
-    0xec,
-    0x5e,
-    0x7a,
-    0x3d,
-    0x60,
-    0xa9,
-    0xe4,
-    0x5c,
-    0x28,
-    0x17,
-    0x83,
-    0x05,
-    0xdc,
-    0x34,
-    0xc1,
-    0xcb,
-    0x4c,
-    0xdf,
-    0x12,
-    0x1f,
-    0xb6,
-    0xac,
-    0xcd,
-    0xd1,
-    0x3c,
-    0x86,
-    0x3a,
-    0xd4,
-    0x94,
-    0x99,
-    0xec,
-    0x42,
-    0x02,
-    0x6f,
-    0x51,
-    0x9f,
-    0x83,
-    0x58,
-    0x87,
-    0x62,
-    0x4b,
-    0x10,
-    0x71,
-    0xb1,
-    0x72,
-    0x9c,
-    0x0b,
-    0x6d,
-    0xeb,
-    0x75,
-    0xfa,
-    0x6e,
-    0xb5,
-    0xe8,
-    0x68,
-    0x10,
-    0x55,
-    0xbd,
-    0x0e,
-    0xee,
-    0x83,
-    0x17,
-    0x92,
-    0xed,
-    0x24,
-    0x9b,
-    0x14,
-    0x7d,
-    0x78,
-    0xd4,
-    0x04,
-    0x1b,
-    0x95,
-    0xd6,
-    0x36,
-    0x1a,
-    0x14,
-    0x22,
-    0x38,
-    0xa4,
-    0x0a,
-    0xca,
-    0xe3,
-    0xfc,
-    0x3a,
-    0xd6,
-    0x30,
-    0x05,
-    0x88,
-    0xe5,
-    0x4d,
-    0x08,
-    0xb1,
-    0x18,
-    0xf0,
-    0xb2,
-    0x3a,
-    0x2b,
-    0xec,
-    0x5c,
-    0xa6,
-    0xe5,
-    0x02,
-    0x90,
-    0xec,
-    0xb3,
-    0xf9,
-    0xc8,
-    0x28,
-    0x90,
-    0xf0,
-    0x78,
-    0x91,
-    0x27,
-    0xf4,
-    0x4f,
-    0xab,
-    0x3c,
-    0xce,
-    0xba,
-    0xbe,
-    0x48,
-    0x1e,
-    0xab,
-    0x86,
-    0x63,
-    0xae,
-    0x98,
-    0x2c,
-    0x67,
-    0x00,
-    0xc6,
-    0x75,
-    0x53,
-    0x29,
-    0xc7,
-    0x3a,
-    0xed,
-    0xe2,
-    0x42,
-    0x18,
-    0xac,
-    0xdd,
-    0xf2,
-    0x68,
-    0xd4,
-    0x55,
-    0xf1,
-    0x71,
-    0xe3,
-    0xe9,
-    0x37,
-    0xdd,
-    0x2c,
-    0xaa,
-    0x5d,
-    0x6a,
-    0xc2,
-    0x73,
-    0xa7,
-    0xe2,
-    0x97,
-    0x79,
-    0x42,
-    0x4d,
-    0xe5,
-    0x22,
-    0xca,
-    0x65,
-    0xcd,
-    0x1b,
-    0x10,
-    0x4a,
-    0x3f,
-    0xa5,
-    0x19,
-    0x77,
-    0x19,
-    0x2f,
-    0x6a,
-    0xf5,
-    0x93,
-    0x2a,
-    0x82,
-    0xce,
-    0xda,
-    0x19,
-    0xa9,
-    0xc5,
-    0xfb,
-    0xe7,
-    0xe8,
-    0x44,
-    0x03,
-    0x7e,
-    0x59,
-    0x96,
-    0x64,
-    0x95,
-    0xa1,
-    0x56,
-    0x9b,
-    0xc9,
-    0xba,
-    0x28,
-    0x10,
-    0xf0,
-    0xf6,
-    0xa7,
-    0x3e,
-    0xaa,
-    0x40,
-    0x9e,
-    0x13,
-    0x38,
-    0xa5,
-    0x7a,
-    0x9a,
-    0x92,
-    0x14,
-    0xff,
-    0xd7,
-    0xb3,
-    0x62,
-    0x3b,
-    0xf3,
-    0x38,
-    0x91,
-    0xb8,
-    0x99,
-    0x29,
-    0x52,
-    0xf6,
-    0x9f,
-    0x17,
-    0xc8,
-    0x18,
-    0xe9,
-    0x67,
-    0x8f,
-    0xde,
-    0x8a,
-    0xed,
-    0xfd,
-    0xd3,
-    0x2d,
-    0xbd,
-    0xa8,
-    0xc8,
-    0xb4,
-    0x3d,
-    0x28,
-    0x80,
-    0x1e,
-    0x7f,
-    0x1e,
-    0xad,
-    0xae,
-    0xce,
-    0x75,
-    0x1b,
-    0x49,
-    0x87,
-    0xe7,
-    0x2c,
-    0x21,
-    0x2b,
-    0xc3,
-    0x84,
-    0x90,
-    0xb1,
-    0xee,
-    0x05,
-    0x46,
-    0x21,
-    0x28,
-    0xfe,
-    0xa7,
-    0x5e,
-    0x91,
-    0x9f,
-    0x6f,
-    0x43,
-    0x6c,
-    0xb1,
-    0x98,
-    0xf2,
-    0x22,
-    0x84,
-    0x7d,
-    0x69,
-    0x8a,
-    0x28,
-    0x3f,
-    0x57,
-    0x67,
-    0xdf,
-    0x68,
-    0x2d,
-    0x33,
-    0xd3,
-    0xce,
-    0x77,
-    0x1b,
-    0x05,
-    0xbb,
-    0x6d,
-    0x4a,
-    0x86,
-    0x4a,
-    0xc5,
-    0x6a,
-    0xe9,
-    0x14,
-    0xcc,
-    0x68,
-    0xf8,
-    0x0c,
-    0xb5,
-    0x78,
-    0xa6,
-    0xa8,
-    0x31,
-    0x5a,
-    0x45,
-    0x42,
-    0x40,
-    0xdb,
-    0xf9,
-    0xbd,
-    0x46,
-    0x9e,
-    0x6d,
-    0x6b,
-    0x61,
-    0x1c,
-    0xc4,
-    0x2e,
-    0xfa,
-    0xea,
-    0xd3,
-    0xde,
-    0x9a,
-    0x3b,
-    0x8d,
-    0xeb,
-    0xff,
-    0xa5,
-    0xbe,
-    0x44,
-    0x70,
-    0x28,
-    0xfd,
-    0x77,
-    0x4d,
-    0x6c,
-    0xdb,
-    0x19,
-    0xea,
-    0x4a,
-    0x61,
-    0x68,
-    0x9d,
-    0x8e,
-    0xba,
-    0x2f,
-    0x16,
-    0xfb,
-    0x2c,
-    0xea,
-    0xef,
-    0x90,
-    0x4d,
-    0x2b,
-    0x84,
-    0x0a,
-    0x73,
-    0x3c,
-    0x05,
-    0xaa,
-    0x6c,
-    0x06,
-    0xca,
-    0x38,
-    0x6f,
-    0x31,
-    0xe6,
-    0x48,
-    0x53,
-    0x8d,
-    0xfe,
-    0xbc,
-    0xff,
-    0xb1,
-    0x5c,
-    0x8a,
-    0x22,
-    0xe2,
-    0x3f,
-    0xc0,
-    0x24,
-    0x36,
-    0x75,
-    0xc5,
-    0x5c,
-    0xf8,
-    0x2c,
-    0xe1,
-    0x83,
-    0x4f,
-    0x06,
-    0xff,
-    0x68,
-    0x1b,
-    0x6b,
-    0xb2,
-    0xe6,
-    0x20,
-    0x23,
-    0x77,
-    0x13,
-    0x66,
-    0x24,
-    0x3a,
-    0xbb,
-    0xdf,
-    0xa8,
-    0x1b,
-    0x0d,
-    0x4b,
-    0x83,
-    0x71,
-    0x93,
-    0x59,
-    0xb4,
-    0x0f,
-    0x68,
-    0x0f,
-    0x3a,
-    0xc7,
-    0xa5,
-    0x6b,
-    0x29,
-    0x2d,
-    0x1c,
-    0x4b,
-    0xfc,
-    0x9d,
-    0x49,
-    0x8a,
-    0x2d,
-    0x80,
-    0x85,
-    0x6c,
-    0x03,
-    0xca,
-    0x7d,
-    0x3c,
-    0xac,
-    0xc7,
-    0xe3,
-    0x33,
-    0x8b,
-    0x18,
-    0x63,
-    0x9c,
-    0xd3,
-    0xf9,
-    0xd9,
-    0x36,
-    0x55,
-    0xc5,
-    0xc1,
-    0xda,
-    0x96,
-    0xbb,
-    0xee,
-    0x5d,
-    0x25,
-    0x02,
-    0x80,
-    0xb8,
-    0x2b,
-    0xeb,
-    0x10,
-    0x66,
-    0x44,
-    0x77,
-    0x2d,
-    0x0e,
-    0x8d,
-    0x19,
-    0x0c,
-    0x62,
-    0xff,
-    0xbc,
-    0x7b,
-    0x47,
-    0xfb,
-    0x08,
-    0x17,
-    0x36,
-    0x25,
-    0xe1,
-    0xbf,
-    0xe2,
-    0x76,
-    0x31,
-    0x48,
-    0x1b,
-    0x8d,
-    0xe8,
-    0x72,
-    0xf2,
-    0x46,
-    0x41,
-    0x1b,
-    0x1e,
-    0x8e,
-    0x46,
-    0xb3,
-    0x9e,
-    0x76,
-    0x96,
-    0xf0,
-    0xa0,
-    0x86,
-    0x66,
-    0xc3,
-    0xa2,
-    0x53,
-    0xc6,
-    0x8a,
-    0xd7,
-    0x53,
-    0x25,
-    0x87,
-    0xcc,
-    0xf1,
-    0x18,
-    0x91,
-    0x4b,
-    0xdd,
-    0x57,
-    0x09,
-    0x80,
-    0xa6,
-    0x08,
-    0x10,
-    0x5a,
-    0x8a,
-    0x41,
-    0xf7,
-    0x34,
-    0x8d,
-    0xc8,
-    0xf7,
-    0xb5,
-    0xc8,
-    0x1d,
-    0x23,
-    0xf4,
-    0x04,
-    0xba,
-    0x9a,
-    0xe0,
-    0x87,
-    0x99,
-    0x01,
-    0xe0,
-    0x2e,
-    0xf7,
-    0x31,
-    0xb6,
-    0xbc,
-    0x58,
-    0x2c,
-    0xa9,
-    0x72,
-    0xcb,
-    0x56,
-    0xe3,
-    0xe0,
-    0x6f,
-    0xe2,
-    0x18,
-    0xfa,
-    0x36,
-    0x8a,
-    0x68,
-    0x6e,
-    0xe9,
-    0x83,
-    0x87,
-    0x35,
-    0x6c,
-    0xb0,
-    0x1b,
-    0x68,
-    0x44,
-    0x16,
-    0x65,
-    0x56,
-    0x56,
-    0x90,
-    0x24,
-    0xd3,
-    0xf1,
-    0xc3,
-    0xb6,
-    0xd3,
-    0x0f,
-    0x55,
-    0x81,
-    0x37,
-    0xd8,
-    0x5a,
-    0x91,
-    0xe6,
-    0x68,
-    0x0f,
-    0x82,
-    0x20,
-    0xd2,
-    0xcb,
-    0xa1,
-    0x0f,
-    0x65,
-    0x32,
-    0x4e,
-    0x9f,
-    0x2e,
-    0xac,
-    0xa5,
-    0x90,
-    0xbd,
-    0x16,
-    0x5d,
-    0xca,
-    0x2c,
-    0xb7,
-    0xef,
-    0xf0,
-    0x5e,
-    0x75,
-    0xfb,
-    0x37,
-    0x85,
-    0x48,
-    0xe8,
-    0x79,
-    0xe7,
-    0xf0,
-    0xcc,
-    0x85,
-    0xe1,
-    0xe3,
-    0x8b,
-    0xba,
-    0x2c,
-    0x8a,
-    0x42,
-    0xd4,
-    0x5f,
-    0xac,
-    0xe6,
-    0x05,
-    0xb5,
-    0x2b,
-    0x28,
-    0x48,
-    0x11,
-    0xee,
-    0x9c,
-    0xf2,
-    0x3f,
-    0x1e,
-    0x1b,
-    0x89,
-    0x7d,
-    0x95,
-    0x66,
-    0xda,
-    0x3a,
-    0x93,
-    0x0b,
-    0x46,
-    0x1d,
-    0xb3,
-    0x8d,
-    0x5d,
-    0x49,
-    0x1e,
-    0xbf,
-    0xae,
-    0xe0,
-    0xff,
-    0x71,
-    0xdc,
-    0xc5,
-    0x37,
-    0x4e,
-    0xf5,
-    0xa7,
-    0x51,
-    0x05,
-    0x00,
-    0x3b,
-    0xb8,
-    0xa7,
-    0xd5,
-    0xc8,
-    0x27,
-    0x50,
-    0x32,
-    0xe9,
-    0x62,
-    0x0a,
-    0x0a,
-    0x8f,
-    0x24,
-    0xee,
-    0x20,
-    0x45,
-    0x58,
-    0x8d,
-    0xd5,
-    0xb8,
-    0x8b,
-    0x8e,
-    0x3e,
-    0x76,
-    0xa2,
-    0x98,
-    0x7a,
-    0xf6,
-    0xc8,
-    0x72,
-    0x43,
-    0xd9,
-    0xab,
-    0x68,
-    0xc2,
-    0x6f,
-    0xe8,
-    0xf1,
-    0xa8,
-    0x7d,
-    0xc3,
-    0x90,
-    0x7a,
-    0x3d,
-    0x1c,
-    0xf8,
-    0x2c,
-    0xa7,
-    0x9f,
-    0x73,
-    0xf2,
-    0xef,
-    0x3a,
-    0x84,
-    0x53,
-    0x4f,
-    0xd4,
-    0xcb,
-    0x7f,
-    0x06,
-    0x3c,
-    0x2a,
-    0xe2,
-    0xa1,
-    0x5f,
-    0x26,
-    0xf9,
-    0x79,
-    0xbf,
-    0x90,
-    0x65,
-    0x7d,
-    0x20,
-    0x64,
-    0x3e,
-    0x31,
-    0x84,
-    0xf1,
-    0xa9,
-    0xf7,
-    0x5a,
-    0x3a,
-    0xad,
-    0x8e,
-    0xf3,
-    0x9d,
-    0x42,
-    0xd8,
-    0x35,
-    0xb2,
-    0xab,
-    0xe0,
-    0x93,
-    0x76,
-    0x06,
-    0x1b,
-    0x3d,
-    0xa9,
-    0x22,
-    0xee,
-    0x93,
-    0x74,
-    0x90,
-    0x71,
-    0xe0,
-    0x4f,
-    0xfd,
-    0x73,
-    0x45,
-    0x22,
-    0xbf,
-    0xbe,
-    0xf3,
-    0xaa,
-    0xad,
-    0x9b,
-    0x9d,
-    0x1f,
-    0x34,
-    0x99,
-    0x2e,
-    0x14,
-    0xa7,
-    0x8b,
-    0xb7,
-    0x9e,
-    0xd7,
-    0xd0,
-    0xab,
-    0xb8,
-    0xe4,
-    0xd7,
-    0x4e,
-    0xe6,
-    0x52,
-    0xe1,
-    0x6b,
-    0x19,
-    0x5f,
-    0x09,
-    0x45,
-    0xd3,
-    0x94,
-    0x82,
-    0xd1,
-    0x8b,
-    0x9b,
-    0x21,
-    0x22,
-    0x53,
-    0x50,
-    0x1b,
-    0x25,
-    0xb8,
-    0x1a,
-    0x0f,
-    0x8e,
-    0xea,
-    0x7c,
-    0x47,
-    0x12,
-    0x1d,
-    0xe7,
-    0x3b,
-    0xd7,
-    0x2e,
-    0xd3,
-    0x56,
-    0x29,
-    0x8a,
-    0x0e,
-    0xfd,
-    0x6e,
-    0x4c,
-    0x53,
-    0xce,
-    0x5c,
-    0xa5,
-    0x1e,
-    0x25,
-    0x69,
-    0x81,
-    0xbf,
-    0xe5,
-    0x83,
-    0x67,
-    0xad,
-    0x75,
-    0x02,
-    0xa1,
-    0x1e,
-    0x08,
-    0xdb,
-    0x9e,
-    0xd4,
-    0x22,
-    0x16,
-    0x94,
-    0x3a,
-    0x58,
-    0x82,
-    0x69,
-    0xaf,
-    0x57,
-    0xa7,
-    0xd4,
-    0x22,
-    0x27,
-    0xfc,
-    0xc0,
-    0xdf,
-    0xb1,
-    0x5a,
-    0xf1,
-    0xa8,
-    0x7f,
-    0xb1,
-    0xe9,
-    0x08,
-    0xc4,
-    0xfa,
-    0x0d,
-    0xe4,
-    0x9c,
-    0x6c,
-    0x04,
-    0x53,
-    0x94,
-    0xf3,
-    0x60,
-    0xb0,
-    0x6d,
-    0xde,
-    0x80,
-    0xed,
-    0x1d,
-    0xd7,
-    0xb4,
-    0x29,
-    0x17,
-    0x19,
-    0xa3,
-    0x85,
-    0xcc,
-    0xdd,
-    0xea,
-    0x34,
-    0x72,
-    0x15,
-    0x06,
-    0xd2,
-    0x04,
-    0x5d,
-    0x74,
-    0xf7,
-    0x8a,
-    0x2f,
-    0x16,
-    0x0b,
-    0x9a,
-    0x56,
-    0xd9,
-    0x5c,
-    0x1f,
-    0xa5,
-    0x95,
-    0x6d,
-    0x59,
-    0xe8,
-    0x35,
-    0x92,
-    0x25,
-    0x1b,
-    0x17,
-    0xb9,
-    0x7f,
-    0xda,
-    0xb6,
-    0x8b,
-    0x45,
-    0x19,
-    0x86,
-    0xb4,
-    0x3d,
-    0x15,
-    0x1f,
-    0x7e,
-    0x5a,
-    0x8a,
-    0x9e,
-    0xa5,
-    0x3b,
-    0x27,
-    0x48,
-    0x67,
-    0xf5,
-    0x3f,
-    0x71,
-    0xda,
-    0x12,
-    0xc1,
-    0x9d,
-    0x82,
-    0xda,
-    0x6a,
-    0xe4,
-    0x23,
-    0xd1,
-    0x39,
-    0x9b,
-    0xd4,
-    0x80,
-    0x24,
-    0x30,
-    0x55,
-    0x78,
-    0x09,
-    0x56,
-    0xa2,
-    0x95,
-    0xe7,
-    0x62,
-    0xc8,
-    0x80,
-    0x4e,
-    0xf5,
-    0xf8,
-    0x77,
-    0x14,
-    0xdc,
-    0xda,
-    0x51,
-    0x4a,
-    0x34,
-    0x23,
-    0xbc,
-    0x6e,
-    0xd2,
-    0x6a,
-    0xca,
-    0xe2,
-    0xe2,
-    0x38,
-    0xac,
-    0x9d,
-    0xcd,
-    0x5e,
-    0xbd,
-    0x21,
-    0x61,
-    0x8b,
-    0xc2,
-    0xad,
-    0x2c,
-    0x1d,
-    0x6f,
-    0xb3,
-    0x28,
-    0x38,
-    0x2e,
-    0x8c,
-    0x9e,
-    0x15,
-    0x1d,
-    0x6b,
-    0x44,
-    0x9d,
-    0x55,
-    0x90,
-    0xa8,
-    0x37,
-    0x72,
-    0xbe,
-    0xd2,
-    0xde,
-    0x50,
-    0xee,
-    0x25,
-    0x76,
-    0x12,
-    0x45,
-    0x87,
-    0x60,
-    0x69,
-    0x44,
-    0xc2,
-    0x4c,
-    0x13,
-    0x3f,
-    0x29,
-    0x4e,
-    0xa1,
-    0x10,
-    0x7e,
-    0x35,
-    0x7e,
-    0x0c,
-    0x13,
-    0x18,
-    0x2d,
-    0x36,
-    0x30,
-    0x31,
-    0xd2,
-    0xb3,
-    0xb5,
-    0xee,
-    0xf4,
-    0x7e,
-    0x00,
-    0x46,
-    0x81,
-    0x5d,
-    0x11,
-    0x4a,
-    0x12,
-    0x14,
-    0xec,
-    0xfc,
-    0x71,
-    0xd8,
-    0x3f,
-    0x63,
-    0x59,
-    0x06,
-    0x45,
-    0xdf,
-    0x7c,
-    0x15,
-    0xea,
-    0xbb,
-    0xca,
-    0xca,
-    0x30,
-    0x01,
-    0xf1,
-    0xaa,
-    0xd1,
-    0x92,
-    0x20,
-    0xb5,
-    0x26,
-    0x75,
-    0x11,
-    0x51,
-    0x47,
-    0x70,
-    0x46,
-    0x85,
-    0x74,
-    0xd5,
-    0x93,
-    0x67,
-    0xb4,
-    0x9f,
-    0xdc,
-    0xd8,
-    0xbb,
-    0xbd,
-    0x20,
-    0x6e,
-    0x11,
-    0xae,
-    0xb6,
-    0xb2,
-    0x71,
-    0x4e,
-    0xd7,
-    0x8c,
-    0x70,
-    0xf0,
-    0x5d,
-    0xfb,
-    0x5f,
-    0xac,
-    0xca,
-    0x09,
-    0x71,
-    0xfb,
-    0x8c,
-    0xff,
-    0x21,
-    0x81,
-    0x80,
-    0xd5,
-    0xce,
-    0x29,
-    0xb4,
-    0xec,
-    0xa8,
-    0x77,
-    0x71,
-    0x00,
-    0xd0,
-    0x1a,
-    0x79,
-    0x58,
-    0xbb,
-    0xc1,
-    0x8d,
-    0x3f,
-    0xd8,
-    0x30,
-    0x32,
-    0xb8,
-    0x72,
-    0x93,
-    0xb5,
-    0x6e,
-    0xd7,
-    0x12,
-    0x6d,
-    0xea,
-    0xba,
-    0xa5,
-    0x40,
-    0x08,
-    0xd6,
-    0x2a,
-    0x68,
-    0xac,
-    0xd4,
-    0xb5,
-    0x77,
-    0xb1,
-    0x6f,
-    0x27,
-    0x99,
-    0x22,
-    0xd6,
-    0x02,
-    0x1a,
-    0xad,
-    0x51,
-    0x7b,
-    0x28,
-    0x54,
-    0x28,
-    0xd1,
-    0xd9,
-    0x66,
-    0xc1,
-    0xde,
-    0x70,
-    0xae,
-    0x08,
-    0xec,
-    0xdc,
-    0xea,
-    0x13,
-    0xc9,
-    0x81,
-    0x7f,
-    0x07,
-    0x1e,
-    0x3b,
-    0x6a,
-    0x35,
-    0xfc,
-    0xa0,
-    0x7a,
-    0x89,
-    0xb8,
-    0x86,
-    0xbc,
-    0x25,
-    0xf9,
-    0xc6,
-    0x37,
-    0x49,
-    0x0f,
-    0x3f,
-    0xda,
-    0x76,
-    0x86,
-    0x1d,
-    0xb3,
-    0xd3,
-    0xfb,
-    0x5b,
-    0x62,
-    0xcf,
-    0x2f,
-    0x86,
-    0xcc,
-    0x08,
-    0x5a,
-    0xc4,
-    0x14,
-    0x6c,
-    0xc2,
-    0x16,
-    0xc7,
-    0x9d,
-    0x8b,
-    0xda,
-    0x56,
-    0x9a,
-    0xd1,
-    0x94,
-    0xca,
-    0x9d,
-    0xf4,
-    0xed,
-    0xb3,
-    0x3f,
-    0x33,
-    0xfc,
-    0x61,
-    0xe2,
-    0x7d,
-    0xc5,
-    0x57,
-    0x50,
-    0x83,
-    0xff,
-    0xfd,
-    0xa0,
-    0x12,
-    0x1b,
-    0x95,
-    0x5a,
-    0xa0,
-    0x81,
-    0x70,
-    0xdb,
-    0x25,
-    0x1d,
-    0x62,
-    0xfa,
-    0x2c,
-    0x1a,
-    0x73,
-    0xeb,
-    0x29,
-    0xed,
-    0xd7,
-    0x64,
-    0x0d,
-    0x96,
-    0x21,
-    0xff,
-    0x18,
-    0x22,
-    0xb3,
-    0xe0,
-    0xee,
-    0x75,
-    0x79,
-    0x97,
-    0xee,
-    0x46,
-    0xd7,
-    0x47,
-    0xbf,
-    0x6b,
-    0xdf,
-    0x08,
-    0x2b,
-    0x57,
-    0xc8,
-    0x8b,
-    0x31,
-    0xe1,
-    0x9b,
-    0xfd,
-    0x55,
-    0x47,
-    0x30,
-    0x2d,
-    0x3b,
-    0x72,
-    0x59,
-    0xf0,
-    0x74,
-    0x7b,
-    0x5d,
-    0xc5,
-    0x98,
-    0x6f,
-    0xa8,
-    0xb5,
-    0x95,
-    0x4f,
-    0xc0,
-    0x7d,
-    0x46,
-    0x5b,
-    0x7b,
-    0xef,
-    0x48,
-    0x90,
-    0x70,
-    0x96,
-    0x09,
-    0x70,
-    0xab,
-    0x99,
-    0x21,
-    0x01,
-    0xa5,
-    0xe1,
-    0xe6,
-    0x18,
-    0x73,
-    0x7e,
-    0x3a,
-    0xd7,
-    0x3d,
-    0x47,
-    0xa8,
-    0x75,
-    0xf2,
-    0xc1,
-    0xb0,
-    0x3d,
-    0x3a,
-    0x43,
-    0x5e,
-    0xda,
-    0xac,
-    0x57,
-    0x22,
-    0xd1,
-    0x42,
-    0x62,
-    0xdb,
-    0x4f,
-    0x09,
-    0x88,
-    0x35,
-    0x25,
-    0x1d,
-    0xca,
-    0x35,
-    0x11,
-    0xd5,
-    0x71,
-    0x12,
-    0x3f,
-    0x3b,
-    0xb0,
-    0x47,
-    0x0f,
-    0xbf,
-    0x85,
-    0xe6,
-    0x19,
-    0x2c,
-    0xe0,
-    0x2f,
-    0x6f,
-    0xda,
-    0x07,
-    0x61,
-    0x21,
-    0x26,
-    0x39,
-    0xd0,
-    0x07,
-    0x1f,
-    0x91,
-    0x38,
-    0xba,
-    0x82,
-    0x2e,
-    0x51,
-    0xe4,
-    0xe9,
-    0x91,
-    0xa3,
-    0xba,
-    0x3f,
-    0x46,
-    0x9c,
-    0xc6,
-    0x77,
-    0xc7,
-    0xe0,
-    0xea,
-    0x7d,
-    0x9d,
-    0xe0,
-    0xa2,
-    0x6d,
-    0xc8,
-    0xae,
-    0x89,
-    0x04,
-    0x61,
-    0x10,
-    0x1f,
-    0x54,
-    0x7e,
-    0xd3,
-    0xc9,
-    0xbb,
-    0x56,
-    0x61,
-    0x19,
-    0x15,
-    0xa6,
-    0x96,
-    0x50,
-    0x31,
-    0x53,
-    0xd0,
-    0x21,
-    0x82,
-    0x50,
-    0x45,
-    0xb8,
-    0x17,
-    0xc2,
-    0x9a,
-    0xfb,
-    0xcd,
-    0x62,
-    0xb1,
-    0x10,
-    0xc4,
-    0x23,
-    0xc2,
-    0x1f,
-    0x0f,
-    0x16,
-    0xad,
-    0x59,
-    0xb0,
-    0x8a,
-    0x8e,
-    0x39,
-    0xc3,
-    0x77,
-    0x92,
-    0x09,
-    0xf9,
-    0x1d,
-    0x0a,
-    0xa9,
-    0x48,
-    0xe8,
-    0xbe,
-    0x8c,
-    0xe1,
-    0x97,
-    0x84,
-    0x03,
-    0x63,
-    0x9d,
-    0x11,
-    0xbe,
-    0x4e,
-    0xc7,
-    0x0e,
-    0x8f,
-    0xba,
-    0x20,
-    0x6f,
-    0x72,
-    0x49,
-    0x12,
-    0x00,
-    0xcb,
-    0x5a,
-    0xcd,
-    0x40,
-    0xee,
-    0x7f,
-    0xed,
-    0x73,
-    0xe4,
-    0x32,
-    0x56,
-    0xf3,
-    0x6d,
-    0xc3,
-    0x63,
-    0xc7,
-    0x41,
-    0x95,
-    0x41,
-    0x76,
-    0x9b,
-    0x8a,
-    0x95,
-    0x1d,
-    0xf8,
-    0xbc,
-    0x65,
-    0xc0,
-    0x1c,
-    0x6e,
-    0x35,
-    0xde,
-    0x57,
-    0x42,
-    0x70,
-    0x48,
-    0x06,
-    0xac,
-    0x0a,
-    0x33,
-    0x5c,
-    0xa6,
-    0x64,
-    0x8b,
-    0x63,
-    0xa5,
-    0x70,
-    0x8a,
-    0x3d,
-    0xcc,
-    0x15,
-    0x8a,
-    0xb0,
-    0x60,
-    0xd5,
-    0x17,
-    0xe2,
-    0x7d,
-    0xad,
-    0x49,
-    0x60,
-    0x07,
-    0x3c,
-    0x50,
-    0x65,
-    0xe2,
-    0x28,
-    0x51,
-    0x5a,
-    0x66,
-    0xbe,
-    0x71,
-    0x99,
-    0x0d,
-    0xd8,
-    0x2f,
-    0x76,
-    0x6f,
-    0x04,
-    0xf6,
-    0x80,
-    0x71,
-    0xe2,
-    0xf2,
-    0x04,
-    0xb9,
-    0xce,
-    0x24,
-    0xd3,
-    0x65,
-    0xbf,
-    0xb1,
-    0x45,
-    0xfc,
-    0x6f,
-    0x80,
-    0x7e,
-    0xa4,
-    0xbd,
-    0x03,
-    0xf0,
-    0x96,
-    0x4f,
-    0x55,
-    0x21,
-    0xd0,
-    0x7b,
-    0x86,
-    0xaf,
-    0x09,
-    0x68,
-    0x33,
-    0x91,
-    0xea,
-    0x70,
-    0x59,
-    0x9f,
-    0x7b,
-    0xc9,
-    0x6a,
-    0x55,
-    0xdc,
-    0x65,
-    0xa1,
-    0xd4,
-    0x35,
-    0x16,
-    0x93,
-    0x29,
-    0xef,
-    0xf6,
-    0x08,
-    0xd2,
-    0x25,
-    0x06,
-    0x08,
-    0x7e,
-    0x55,
-    0x15,
-    0x39,
-    0x15,
-    0x5c,
-    0xe4,
-    0x68,
-    0xf8,
-    0xa1,
-    0x87,
-    0x65,
-    0x8a,
-    0x90,
-    0x0e,
-    0x14,
-    0xef,
-    0x4a,
-    0x65,
-    0xc1,
-    0x14,
-    0x9a,
-    0x79,
-    0xb4,
-    0xef,
-    0x2c,
-    0x9c,
-    0x05,
-    0x08,
-    0xf9,
-    0x2b,
-    0xb2,
-    0x38,
-    0x06,
-    0x6e,
-    0xef,
-    0xb0,
-    0x4e,
-    0xbf,
-    0xbd,
-    0x3e,
-    0xfc,
-    0xef,
-    0xbe,
-    0xcc,
-    0xde,
-    0xe5,
-    0x48,
-    0x2a,
-    0x17,
-    0x88,
-    0xb8,
-    0x0d,
-    0x14,
-    0xe0,
-    0x09,
-    0x57,
-    0xc1,
-    0x77,
-    0xa5,
-    0x98,
-    0xfc,
-    0x06,
-    0x7a,
-    0xd5,
-    0x4a,
-    0x4d,
-    0x51,
-    0x89,
-    0xc8,
-    0x43,
-    0x5b,
-    0xea,
-    0x65,
-    0x6f,
-    0x0d,
-    0x6d,
-    0x4f,
-    0x96,
-    0x2e,
-    0x8c,
-    0xab,
-    0x96,
-    0x2f,
-    0xc7,
-    0x89,
-    0x92,
-    0xba,
-    0xe9,
-    0x17,
-    0x4f,
-    0x8d,
-    0x8c,
-    0x14,
-    0xde,
-    0x89,
-    0xdf,
-    0x88,
-    0x7c,
-    0x06,
-    0xa7,
-    0xb3,
-    0xb6,
-    0x6a,
-    0x84,
-    0x43,
-    0xd1,
-    0xfa,
-    0x76,
-    0xca,
-    0x68,
-    0xf0,
-    0x9f,
-    0x6e,
-    0x57,
-    0xcd,
-    0x4b,
-    0xe3,
-    0xd8,
-    0xf0,
-    0x2d,
-    0x96,
-    0xec,
-    0x68,
-    0xeb,
-    0x2b,
-    0xfd,
-    0x07,
-    0xde,
-    0x2a,
-    0xc1,
-    0xb7,
-    0x13,
-    0xf5,
-    0x61,
-    0x11,
-    0x95,
-    0xfe,
-    0xdb,
-    0x2c,
-    0xee,
-    0x36,
-    0xa5,
-    0xb3,
-    0xeb,
-    0xc9,
-    0x93,
-    0x3b,
-    0xa0,
-    0x08,
-    0xfa,
-    0xd3,
-    0xac,
-    0xa6,
-    0x16,
-    0xdc,
-    0xbe,
-    0x28,
-    0xa9,
-    0x1b,
-    0x58,
-    0x97,
-    0xe5,
-    0x0c,
-    0xd3,
-    0x78,
-    0x8c,
-    0x79,
-    0xa4,
-    0xfe,
-    0x56,
-    0x4c,
-    0xdd,
-    0x7d,
-    0x93,
-    0xa2,
-    0xf7,
-    0x22,
-    0x11,
-    0x20,
-    0xce,
-    0xe2,
-    0x40,
-    0x8a,
-    0xed,
-    0xb0,
-    0x94,
-    0x91,
-    0x0c,
-    0xf3,
-    0x2b,
-    0xed,
-    0xd7,
-    0x37,
-    0xb0,
-    0xac,
-    0xf1,
-    0x22,
-    0x7f,
-    0xca,
-    0x39,
-    0xaa,
-    0x09,
-    0x01,
-    0x4c,
-    0x86,
-    0x7a,
-    0xe2,
-    0x4b,
-    0xe2,
-    0x9a,
-    0x25,
-    0xde,
-    0x57,
-    0xf1,
-    0x3e,
-    0x78,
-    0x1a,
-    0x2f,
-    0x31,
-    0xdd,
-    0x74,
-    0xcb,
-    0xa6,
-    0xe2,
-    0x72,
-    0xe9,
-    0x40,
-    0x74,
-    0xdd,
-    0x81,
-    0x2b,
-    0xdc,
-    0x6c,
-    0xbe,
-    0xf4,
-    0x41,
-    0x39,
-    0xa4,
-    0x9e,
-    0x6f,
-    0x72,
-    0xf6,
-    0xf2,
-    0xd7,
-    0x51,
-    0x57,
-    0x16,
-    0xd6,
-    0x4e,
-    0xaf,
-    0x61,
-    0x3a,
-    0x93,
-    0xd0,
-    0x6e,
-    0x02,
-    0xb0,
-    0x5a,
-    0x6f,
-    0x65,
-    0x90,
-    0xdb,
-    0xc4,
-    0x16,
-    0xab,
-    0x3b,
-    0xcd,
-    0xc7,
-    0x7e,
-    0x58,
-    0xfc,
-    0xec,
-    0x38,
-    0xed,
-    0x2e,
-    0xc1,
-    0xb7,
-    0xb8,
-    0x3b,
-    0x8e,
-    0xb2,
-    0xdc,
-    0xcb,
-    0x29,
-    0x38,
-    0x84,
-    0x6c,
-    0xbd,
-    0x59,
-    0xc9,
-    0xe2,
-    0xcb,
-    0x23,
-    0xd6,
-    0xbe,
-    0x6e,
-    0xd0,
-    0x49,
-    0x33,
-    0xe3,
-    0x3d,
-    0xdd,
-    0x24,
-    0x48,
-    0x9e,
-    0x46,
-    0x81,
-    0xa4,
-    0x71,
-    0x5d,
-    0xd4,
-    0x28,
-    0xb0,
-    0x7d,
-    0x17,
-    0xb5,
-    0x4b,
-    0x2d,
-    0xc9,
-    0x9e,
-    0xd5,
-    0xff,
-    0x41,
-    0xae,
-    0x7d,
-    0xb8,
-    0x41,
-    0x6d,
-    0x41,
-    0xb0,
-    0xce,
-    0x9f,
-    0x5e,
-    0x7c,
-    0x3f,
-    0x0e,
-    0x0b,
-    0xcb,
-    0x95,
-    0x89,
-    0x66,
-    0x8e,
-    0x0a,
-    0x2d,
-    0xaf,
-    0x5c,
-    0xed,
-    0xe3,
-    0xb4,
-    0x14,
-    0xac,
-    0x2a,
-    0x8c,
-    0xc4,
-    0x33,
-    0x17,
-    0x88,
-    0xc9,
-    0x74,
-    0x99,
-    0x67,
-    0x38,
-    0x47,
-    0x02,
-    0xc9,
-    0x7d,
-    0x75,
-    0xc3,
-    0xe7,
-    0x42,
-    0x0f,
-    0x77,
-    0x80,
-    0x93,
-    0x05,
-    0x24,
-    0x17,
-    0x3f,
-    0xf3,
-    0xbd,
-    0x5b,
-    0x81,
-    0x3e,
-    0xeb,
-    0xe7,
-    0xdf,
-    0x60,
-    0x0c,
-    0x2b,
-    0x53,
-    0x80,
-    0x7d,
-    0xaa,
-    0xa9,
-    0x46,
-    0x14,
-    0x67,
-    0x28,
-    0xed,
-    0xf1,
-    0x99,
-    0x74,
-    0x9a,
-    0x77,
-    0xa6,
-    0xb3,
-    0xec,
-    0x95,
-    0x4f,
-    0xef,
-    0xd4,
-    0x4a,
-    0x28,
-    0xbb,
-    0xa7,
-    0x68,
-    0x4c,
-    0x1a,
-    0x71,
-    0x98,
-    0x4e,
-    0x9c,
-    0x8d,
-    0x9e,
-    0x73,
-    0xca,
-    0x72,
-    0xde,
-    0x1e,
-    0xc4,
-    0xd0,
-    0x1f,
-    0x8b,
-    0x29,
-    0xdc,
-    0x90,
-    0xc0,
-    0x37,
-    0xe7,
-    0x08,
-    0xc1,
-    0x34,
-    0x36,
-    0x92,
-    0x04,
-    0x0c,
-    0x0e,
-    0x29,
-    0x24,
-    0x3b,
-    0x0e,
-    0xc0,
-    0xd9,
-    0xed,
-    0xc2,
-    0x86,
-    0x28,
-    0x64,
-    0x74,
-    0x67,
-    0xd7,
-    0x9b,
-    0x45,
-    0xd6,
-    0x24,
-    0x29,
-    0x7d,
-    0xca,
-    0xb7,
-    0x67,
-    0x20,
-    0x06,
-    0xd4,
-    0xd5,
-    0xc2,
-    0x9e,
-    0xd5,
-    0xba,
-    0x9b,
-    0xb7,
-    0xd8,
-    0x0b,
-    0xde,
-    0x8e,
-    0xb5,
-    0x8e,
-    0x47,
-    0xbc,
-    0x33,
-    0x3f,
-    0xf3,
-    0xb8,
-    0x7b,
-    0xf3,
-    0x75,
-    0x9d,
-    0xcc,
-    0x3b,
-    0x26,
-    0x2d,
-    0x71,
-    0x8b,
-    0xbc,
-    0x16,
-    0xf0,
-    0x9c,
-    0x1f,
-    0x75,
-    0x85,
-    0x0e,
-    0x78,
-    0x99,
-    0xce,
-    0x52,
-    0x8a,
-    0x09,
-    0xc8,
-    0xc7,
-    0x45,
-    0xc8,
-    0xfa,
-    0x23,
-    0x98,
-    0xd7,
-    0xf0,
-    0x15,
-    0x88,
-    0xfc,
-    0xeb,
-    0x29,
-    0x7f,
-    0xc2,
-    0xd7,
-    0xeb,
-    0xe6,
-    0xc1,
-    0x7d,
-    0x4f,
-    0xf5,
-    0x1f,
-    0xfa,
-    0x50,
-    0xca,
-    0x57,
-    0x70,
-    0xd8,
-    0xb9,
-    0x39,
-    0xfb,
-    0xe0,
-    0xe4,
-    0x33,
-    0xe7,
-    0xd8,
-    0x0b,
-    0xce,
-    0x20,
-    0x49,
-    0xa5,
-    0x7b,
-    0xe9,
-    0xb9,
-    0x2f,
-    0x90,
-    0xd1,
-    0xcf,
-    0xc4,
-    0x8e,
-    0xe3,
-    0xb7,
-    0xee,
-    0xa5,
-    0x1e,
-    0xc8,
-    0xbc,
-    0x7a,
-    0x25,
-    0x64,
-    0x14,
-    0x27,
-    0x37,
-    0x20,
-    0x4b,
-    0x83,
-    0x60,
-    0x25,
-    0xf3,
-    0xa5,
-    0xf1,
-    0xd7,
-    0xf4,
-    0xa3,
-    0x2f,
-    0xb4,
-    0xdf,
-    0x9f,
-    0x48,
-    0x7e,
-    0x7e,
-    0x05,
-    0x8b,
-    0x9c,
-    0xb0,
-    0x0e,
-    0xd7,
-    0xbe,
-    0x73,
-    0x89,
-    0x54,
-    0xc0,
-    0x43,
-    0xda,
-    0x62,
-    0xd1,
-    0xa3,
-    0x43,
-    0xcf,
-    0xd4,
-    0xf9,
-    0x62,
-    0x4d,
-    0x06,
-    0x9e,
-    0xfb,
-    0x23,
-    0xe1,
-    0x36,
-    0xf8,
-    0x22,
-    0x41,
-    0x3d,
-    0xae,
-    0xdb,
-    0xc6,
-    0xe3,
-    0x62,
-    0x0f,
-    0x79,
-    0x1a,
-    0x0c,
-    0x67,
-    0xb2,
-    0xed,
-    0x5a,
-    0x65,
-    0x39,
-    0x13,
-    0xf8,
-    0x9b,
-    0xab,
-    0xc4,
-    0x0f,
-    0x1b,
-    0x1f,
-    0xcb,
-    0x0c,
-    0x2e,
-    0x0a,
-    0xdd,
-    0xa2,
-    0x49,
-    0x60,
-    0x29,
-    0x12,
-    0x3c,
-    0xfc,
-    0x30,
-    0xaa,
-    0xad,
-    0x42,
-    0xd7,
-    0x8b,
-    0xc5,
-    0x03,
-    0xba,
-    0xb0,
-    0x29,
-    0xa0,
-    0xc4,
-    0x2c,
-    0x2c,
-    0x73,
-    0xfd,
-    0xb3,
-    0x43,
-    0x6a,
-    0xa2,
-    0x5c,
-    0xb9,
-    0xf5,
-    0x7b,
-    0xa5,
-    0xa3,
-    0x23,
-    0x69,
-    0xb8,
-    0x17,
-    0x08,
-    0x3f,
-    0xed,
-    0x99,
-    0x61,
-    0xd2,
-    0x8f,
-    0xd6,
-    0x7b,
-    0x54,
-    0xe3,
-    0x95,
-    0x50,
-    0xdd,
-    0x66,
-    0xea,
-    0xf3,
-    0x4b,
-    0x57,
-    0xac,
-    0x2f,
-    0x4c,
-    0x75,
-    0x2a,
-    0x6b,
-    0xb9,
-    0x0a,
-    0x1a,
-    0xd1,
-    0x26,
-    0x28,
-    0xd2,
-    0xb0,
-    0xb7,
-    0x33,
-    0xbb,
-    0x1e,
-    0x35,
-    0x9f,
-    0x02,
-    0xe1,
-    0x60,
-    0xfb,
-    0x90,
-    0x90,
-    0x87,
-    0x2f,
-    0x3d,
-    0xf5,
-    0x57,
-    0x02,
-    0x40,
-    0xb6,
-    0xf1,
-    0xdf,
-    0xea,
-    0x34,
-    0x3f,
-    0xd8,
-    0x95,
-    0xb4,
-    0x87,
-    0xeb,
-    0xd7,
-    0xbd,
-    0x40,
-    0x84,
-    0xfb,
-    0xc0,
-    0x25,
-    0x44,
-    0xb1,
-    0xff,
-    0x89,
-    0x01,
-    0x04,
-    0xa7,
-    0xea,
-    0x0e,
-    0x8d,
-    0x3f,
-    0xc8,
-    0xbc,
-    0xe6,
-    0x46,
-    0xb7,
-    0x20,
-    0x62,
-    0x18,
-    0xb4,
-    0x17,
-    0xfb,
-    0x12,
-    0xb5,
-    0x88,
-    0x8c,
-    0xf6,
-    0x84,
-    0xe9,
-    0x41,
-    0x91,
-    0xcc,
-    0x05,
-    0x4b,
-    0x9b,
-    0x74,
-    0xfc,
-    0xd8,
-    0xde,
-    0x2d,
-    0x8b,
-    0x42,
-    0x9b,
-    0x47,
-    0x8d,
-    0x86,
-    0x29,
-    0xc9,
-    0xc2,
-    0xf9,
-    0xdf,
-    0xc0,
-    0xd0,
-    0x36,
-    0x34,
-    0xd7,
-    0x87,
-    0x5b,
-    0x25,
-    0x28,
-    0x69,
-    0x75,
-    0xd7,
-    0x52,
-    0x6a,
-    0x38,
-    0x7e,
-    0xcc,
-    0xf4,
-    0xf4,
-    0x7d,
-    0x79,
-    0x2e,
-    0xc4,
-    0xcf,
-    0x7c,
-    0x7e,
-    0x09,
-    0xa5,
-    0x4d,
-    0x4d,
-    0x16,
-    0x50,
-    0x0c,
-    0x0a,
-    0x2d,
-    0x62,
-    0x16,
-    0x71,
-    0xab,
-    0x10,
-    0xd7,
-    0x0d,
-    0x7f,
-    0xdb,
-    0xdf,
-    0xfb,
-    0xe0,
-    0x70,
-    0x37,
-    0xf2,
-    0x40,
-    0xcc,
-    0xf5,
-    0x80,
-    0x7b,
-    0xa3,
-    0x0e,
-    0x96,
-    0x55,
-    0x03,
-    0x6c,
-    0x47,
-    0x23,
-    0x35,
-    0x40,
-    0xcd,
-    0xc8,
-    0xe4,
-    0x9a,
-    0xcd,
-    0xe3,
-    0x80,
-    0x37,
-    0xdc,
-    0x47,
-    0xe5,
-    0x99,
-    0x41,
-    0xac,
-    0x38,
-    0x5d,
-    0xfc,
-    0xa4,
-    0x12,
-    0xca,
-    0x08,
-    0xd0,
-    0xe1,
-    0xa6,
-    0xde,
-    0x53,
-    0x8b,
-    0x4d,
-    0x3a,
-    0x87,
-    0x54,
-    0x04,
-    0x21,
-    0xef,
-    0x01,
-    0x8a,
-    0x23,
-    0x6d,
-    0x3d,
-    0xf0,
-    0xde,
-    0xb5,
-    0x3d,
-    0xab,
-    0xc3,
-    0x02,
-    0xa0,
-    0xe8,
-    0x1d,
-    0x08,
-    0x99,
-    0x1f,
-    0x4e,
-    0x29,
-    0x4f,
-    0xeb,
-    0x5c,
-    0xeb,
-    0x84,
-    0x19,
-    0xad,
-    0xaa,
-    0x75,
-    0xfe,
-    0x0f,
-    0x8a,
-    0x02,
-    0x0e,
-    0xfc,
-    0xb0,
-    0x0f,
-    0xab,
-    0x1b,
-    0xb2,
-    0x2a,
-    0x3b,
-    0x09,
-    0x4b,
-    0x6e,
-    0x7d,
-    0x5a,
-    0x54,
-    0xa7,
-    0x1d,
-    0xdb,
-    0xef,
-    0xb7,
-    0x86,
-    0x1a,
-    0x06,
-    0x38,
-    0xf7,
-    0x29,
-    0xf4,
-    0x62,
-    0xd9,
-    0x9e,
-    0x81,
-    0x2f,
-    0x50,
-    0xde,
-    0x14,
-    0xbe,
-    0x10,
-    0x9c,
-    0x24,
-    0xf5,
-    0x72,
-    0x9c,
-    0xf0,
-    0x6b,
-    0xc6,
-    0xbd,
-    0x70,
-    0x85,
-    0xeb,
-    0x36,
-    0x8b,
-    0xdf,
-    0x1e,
-    0x20,
-    0x8a,
-    0xed,
-    0x10,
-    0x35,
-    0xcd,
-    0xe2,
-    0x3b,
-    0xd7,
-    0xbc,
-    0xd0,
-    0x75,
-    0x54,
-    0x01,
-    0x11,
-    0xc6,
-    0x68,
-    0xf5,
-    0xe7,
-    0x77,
-    0x03,
-    0x57,
-    0x5f,
-    0x6b,
-    0x4d,
-    0x44,
-    0x7b,
-    0xb3,
-    0xe7,
-    0x63,
-    0x8f,
-    0x5c,
-    0x74,
-    0x61,
-    0xec,
-    0x8b,
-    0x59,
-    0x9d,
-    0xbc,
-    0xcd,
-    0xc0,
-    0x24,
-    0x2d,
-    0xa8,
-    0xe3,
-    0xdf,
-    0xd2,
-    0x76,
-    0x87,
-    0x0b,
-    0x46,
-    0x73,
-    0xc6,
-    0xea,
-    0x12,
-    0x14,
-    0x12,
-    0xb8,
-    0xd0,
-    0x9a,
-    0x77,
-    0xe1,
-    0x91,
-    0xe8,
-    0x20,
-    0x71,
-    0x7d,
-    0x91,
-    0x1d,
-    0xcc,
-    0xb9,
-    0x36,
-    0x64,
-    0x9f,
-    0x8e,
-    0x0f,
-    0x15,
-    0x16,
-    0xc7,
-    0xc7,
-    0x02,
-    0x50,
-    0x5a,
-    0x8d,
-    0x6e,
-    0x10,
-    0x4b,
-    0x68,
-    0x15,
-    0xb5,
-    0xce,
-    0xca,
-    0x6d,
-    0x6c,
-    0xac,
-    0x69,
-    0x2c,
-    0xa4,
-    0xe7,
-    0x4a,
-    0x0a,
-    0xc2,
-    0xa1,
-    0x1e,
-    0xc8,
-    0x16,
-    0x3a,
-    0xd2,
-    0x71,
-    0x0e,
-    0xb9,
-    0x62,
-    0xe0,
-    0xaa,
-    0x6d,
-    0xee,
-    0x82,
-    0x30,
-    0xd4,
-    0x0f,
-    0x5d,
-    0x21,
-    0xbb,
-    0x6b,
-    0x51,
-    0x6b,
-    0xa7,
-    0x87,
-    0x9e,
-    0xe0,
-    0x74,
-    0xdd,
-    0xa7,
-    0xe7,
-    0x3c,
-    0x2f,
-    0xf6,
-    0x72,
-    0x7a,
-    0x1a,
-    0x7f,
-    0x30,
-    0x6f,
-    0xee,
-    0x29,
-    0x03,
-    0xc5,
-    0xbd,
-    0x8a,
-    0xb4,
-    0x73,
-    0xb2,
-    0xf2,
-    0xe6,
-    0xe0,
-    0xa4,
-    0xac,
-    0x48,
-    0x4b,
-    0xeb,
-    0x80,
-    0x0f,
-    0x6a,
-    0x73,
-    0x7c,
-    0xa4,
-    0x51,
-    0x0f,
-    0xf5,
-    0x99,
-    0x96,
-    0x0f,
-    0xc8,
-    0xe2,
-    0xb3,
-    0x14,
-    0xe5,
-    0x42,
-    0xab,
-    0x23,
-    0x0f,
-    0x03,
-    0xf1,
-    0xf9,
-    0xdd,
-    0xea,
-    0x85,
-    0x9e,
-    0x05,
-    0x6a,
-    0x60,
-    0x3d,
-    0xd9,
-    0x18,
-    0x12,
-    0x33,
-    0x12,
-    0x5f,
-    0xaa,
-    0x66,
-    0xcd,
-    0x75,
-    0xd6,
-    0xd8,
-    0xd3,
-    0x8d,
-    0x4b,
-    0x7c,
-    0x1d,
-    0x4f,
-    0x67,
-    0x48,
-    0x98,
-    0x85,
-    0x15,
-    0x8b,
-    0x25,
-    0x17,
-    0xf2,
-    0x81,
-    0xe4,
-    0x39,
-    0xae,
-    0x24,
-    0xb2,
-    0xe3,
-    0xb4,
-    0x46,
-    0xf0,
-    0x81,
-    0x0d,
-    0xdd,
-    0x87,
-    0xed,
-    0x81,
-    0x9e,
-    0x28,
-    0x9a,
-    0x00,
-    0xcd,
-    0xd9,
-    0x12,
-    0x41,
-    0x53,
-    0xad,
-    0xa2,
-    0xa9,
-    0x11,
-    0xd2,
-    0x53,
-    0x6e,
-    0x74,
-    0xd1,
-    0x1d,
-    0xfc,
-    0x49,
-    0x12,
-    0x58,
-    0x98,
-    0xd3,
-    0x9f,
-    0x73,
-    0x43,
-    0x1b,
-    0x29,
-    0xe8,
-    0xe1,
-    0x88,
-    0x50,
-    0x6f,
-    0x9a,
-    0xaf,
-    0x1f,
-    0x73,
-    0x81,
-    0x6c,
-    0xd6,
-    0xc2,
-    0x73,
-    0x32,
-    0xed,
-    0x88,
-    0x42,
-    0x9f,
-    0x55,
-    0x7e,
-    0x13,
-    0x54,
-    0x01,
-    0x5f,
-    0x05,
-    0x03,
-    0xa5,
-    0x9c,
-    0x14,
-    0xc9,
-    0xbe,
-    0x50,
-    0x3c,
-    0xbf,
-    0xd2,
-    0x76,
-    0xe1,
-    0xcc,
-    0xf9,
-    0x5a,
-    0x6e,
-    0xbd,
-    0x9c,
-    0x4d,
-    0x3d,
-    0x97,
-    0x7d,
-    0x9d,
-    0xb7,
-    0x2b,
-    0xf7,
-    0xc4,
-    0xbc,
-    0xec,
-    0x88,
-    0xe0,
-    0x45,
-    0xfe,
-    0x8c,
-    0x63,
-    0x47,
-    0x8f,
-    0x4b,
-    0x0c,
-    0xdb,
-    0x6a,
-    0x36,
-    0x16,
-    0x9d,
-    0xc9,
-    0x6e,
-    0xaf,
-    0x51,
-    0x6b,
-    0x86,
-    0xab,
-    0xcd,
-    0xe7,
-    0x8a,
-    0x7a,
-    0x13,
-    0x40,
-    0x40,
-    0x57,
-    0xbd,
-    0xb9,
-    0xad,
-    0xc3,
-    0x9e,
-    0xeb,
-    0xdb,
-    0x32,
-    0xa6,
-    0x14,
-    0xda,
-    0x04,
-    0x06,
-    0xb2,
-    0x05,
-    0xb6,
-    0x95,
-    0x51,
-    0x86,
-    0x5a,
-    0x72,
-    0xa1,
-    0x1d,
-    0x44,
-    0xeb,
-    0xcb,
-    0x1d,
-    0x07,
-    0x9e,
-    0x05,
-    0xb7,
-    0xa0,
-    0xde,
-    0x65,
-    0x7a,
-    0xf0,
-    0x59,
-    0xf2,
-    0x1b,
-    0x70,
-    0xf7,
-    0x01,
-    0x72,
-    0x20,
-    0x05,
-    0xbf,
-    0xc6,
-    0xc0,
-    0x92,
-    0x0a,
-    0x4a,
-    0x43,
-    0x19,
-    0x85,
-    0xe7,
-    0x81,
-    0x61,
-    0xeb,
-    0x3c,
-    0x2c,
-    0xa2,
-    0xa3,
-    0xe4,
-    0x05,
-    0xe9,
-    0x95,
-    0xf7,
-    0x4f,
-    0xbd,
-    0x3d,
-    0xd3,
-    0x84,
-    0x03,
-    0xfd,
-    0x1c,
-    0x48,
-    0x1f,
-    0xb8,
-    0x01,
-    0x9b,
-    0x5c,
-    0x9c,
-    0xc1,
-    0x52,
-    0x8e,
-    0x3f,
-    0x6e,
-    0xc8,
-    0xf6,
-    0xee,
-    0xf2,
-    0xd1,
-    0x65,
-    0x42,
-    0x4f,
-    0xef,
-    0xa4,
-    0xf3,
-    0x2b,
-    0xc9,
-    0x14,
-    0xf1,
-    0x8b,
-    0xd8,
-    0x92,
-    0xb1,
-    0xdf,
-    0x64,
-    0x9d,
-    0xc5,
-    0x3f,
-    0xaf,
-    0xbb,
-    0xb0,
-    0xf4,
-    0x70,
-    0x18,
-    0xf8,
-    0x3a,
-    0x82,
-    0x71,
-    0x7d,
-    0x44,
-    0xde,
-    0x30,
-    0x08,
-    0x81,
-    0xc7,
-    0xd9,
-    0x27,
-    0x1e,
-    0x44,
-    0xa4,
-    0x39,
-    0xcc,
-    0xd3,
-    0x6c,
-    0xc5,
-    0xc3,
-    0x5c,
-    0xc7,
-    0x10,
-    0x06,
-    0x64,
-    0x77,
-    0xee,
-    0xe9,
-    0x83,
-    0x01,
-    0xd8,
-    0xd1,
-    0x18,
-    0x9b,
-    0x3f,
-    0x3c,
-    0x3b,
-    0x4b,
-    0x20,
-    0x01,
-    0xf3,
-    0x4e,
-    0xd9,
-    0xd8,
-    0xa9,
-    0xb7,
-    0x3b,
-    0x1c,
-    0xdd,
-    0x58,
-    0xe0,
-    0xd0,
-    0x18,
-    0xe5,
-    0xbe,
-    0xe1,
-    0x22,
-    0x57,
-    0xfd,
-    0xaa,
-    0x74,
-    0x8f,
-    0x06,
-    0xbd,
-    0xf0,
-    0x3c,
-    0xdd,
-    0xe1,
-    0xd0,
-    0xfe,
-    0xb0,
-    0x57,
-    0xdd,
-    0xcc,
-    0xb0,
-    0x62,
-    0xe1,
-    0x93,
-    0x1f,
-    0x06,
-    0x5e,
-    0x1f,
-    0xaa,
-    0x0f,
-    0x80,
-    0x3f,
-    0xfa,
-    0x55,
-    0x51,
-    0x24,
-    0x86,
-    0x3f,
-    0x2c,
-    0x0b,
-    0xab,
-    0x86,
-    0x74,
-    0x1c,
-    0xfe,
-    0x3b,
-    0x85,
-    0x91,
-    0xe1,
-    0x0c,
-    0xeb,
-    0x1a,
-    0x54,
-    0xc3,
-    0xd3,
-    0x80,
-    0x0e,
-    0x0f,
-    0xbe,
-    0x89,
-    0xcd,
-    0x87,
-    0x7d,
-    0x1d,
-    0xea,
-    0xec,
-    0x59,
-    0xa6,
-    0x30,
-    0xae,
-    0x92,
-    0xbd,
-    0xee,
-    0xb2,
-    0x0b,
-    0x02,
-    0x4b,
-    0x53,
-    0x43,
-    0x4b,
-    0xda,
-    0xa7,
-    0x87,
-    0x02,
-    0x6e,
-    0x03,
-    0x66,
-    0xc8,
-    0x30,
-    0xc1,
-    0x66,
-    0x5e,
-    0xee,
-    0x40,
-    0xf5,
-    0xc6,
-    0xb6,
-    0x2d,
-    0xa2,
-    0xa5,
-    0xa4,
-    0x01,
-    0x8d,
-    0xec,
-    0xf8,
-    0xcb,
-    0x1c,
-    0xb7,
-    0x6b,
-    0x30,
-    0xf0,
-    0x76,
-    0xc4,
-    0xb0,
-    0x18,
-    0x4a,
-    0xa6,
-    0x2b,
-    0x84,
-    0xb2,
-    0xac,
-    0xa3,
-    0xbc,
-    0x66,
-    0xb8,
-    0x43,
-    0xd2,
-    0x83,
-    0x87,
-    0xa0,
-    0x94,
-    0xe9,
-    0x89,
-    0x40,
-    0x07,
-    0xe1,
-    0xf0,
-    0x59,
-    0x11,
-    0x04,
-    0x07,
-    0xda,
-    0x76,
-    0x58,
-    0xc6,
-    0xaf,
-    0x06,
-    0xbb,
-    0xa3,
-    0x41,
-    0x14,
-    0x85,
-    0xaa,
-    0x3d,
-    0x29,
-    0x69,
-    0xd0,
-    0x97,
-    0xfa,
-    0x9c,
-    0x85,
-    0xce,
-    0x98,
-    0x39,
-    0x88,
-    0x71,
-    0xe7,
-    0xe5,
-    0xff,
-    0xe2,
-    0x51,
-    0xaf,
-    0xc7,
-    0x5a,
-    0xbb,
-    0x39,
-    0x09,
-    0x2d,
-    0xb8,
-    0x1d,
-    0x0e,
-    0x50,
-    0xfd,
-    0x8a,
-    0x54,
-    0x18,
-    0x16,
-    0x2e,
-    0xe1,
-    0x44,
-    0x57,
-    0x59,
-    0xd7,
-    0x3e,
-    0x14,
-    0x5f,
-    0x49,
-    0x9e,
-    0x15,
-    0x3e,
-    0x4d,
-    0xf0,
-    0x44,
-    0x80,
-    0x52,
-    0xb7,
-    0xa9,
-    0x63,
-    0xb4,
-    0xb2,
-    0x98,
-    0x38,
-    0x8e,
-    0x5d,
-    0x29,
-    0x09,
-    0xd0,
-    0xbb,
-    0xe9,
-    0x7e,
-    0x91,
-    0x53,
-    0xcf,
-    0x01,
-    0xa6,
-    0x78,
-    0x72,
-    0x21,
-    0x73,
-    0xce,
-    0x78,
-    0x34,
-    0x01,
-    0x0a,
-    0x52,
-    0x41,
-    0x51,
-    0xf9,
-    0x27,
-    0x1d,
-    0xf0,
-    0xc4,
-    0x0d,
-    0xd3,
-    0xcc,
-    0x72,
-    0x7f,
-    0x49,
-    0x46,
-    0xae,
-    0x0c,
-    0x21,
-    0x88,
-    0xcb,
-    0x4c,
-    0xde,
-    0x19,
-    0x05,
-    0x18,
-    0x48,
-    0xae,
-    0x0a,
-    0xfa,
-    0x11,
-    0x44,
-    0xb9,
-    0xe3,
-    0xb8,
-    0x6b,
-    0x29,
-    0x1c,
-    0xae,
-    0xe5,
-    0xed,
-    0x7f,
-    0xb8,
-    0x6f,
-    0x96,
-    0xe7,
-    0x94,
-    0xdf,
-    0x7a,
-    0xe5,
-    0xdf,
-    0x6f,
-    0xb4,
-    0xb5,
-    0x36,
-    0x59,
-    0x6c,
-    0x70,
-    0x9c,
-    0xa4,
-    0x59,
-    0x82,
-    0x1b,
-    0x3d,
-    0x83,
-    0x5f,
-    0xae,
-    0x49,
-    0x4e,
-    0x72,
-    0x5f,
-    0xba,
-    0xb4,
-    0x56,
-    0xad,
-    0x20,
-    0xd2,
-    0x49,
-    0x30,
-    0xc2,
-    0xa6,
-    0xde,
-    0x80,
-    0xee,
-    0x17,
-    0xf2,
-    0x52,
-    0x8d,
-    0x35,
-    0xe0,
-    0xe4,
-    0xfa,
-    0xc3,
-    0xf9,
-    0x9c,
-    0x15,
-    0xf3,
-    0x2e,
-    0xec,
-    0x93,
-    0x70,
-    0x10,
-    0x78,
-    0x98,
-    0xa1,
-    0xfb,
-    0x7b,
-    0x87,
-    0x2d,
-    0x8d,
-    0x66,
-    0x19,
-    0xba,
-    0x5d,
-    0xcb,
-    0xac,
-    0xfb,
-    0xea,
-    0x7a,
-    0xde,
-    0xe9,
-    0xd2,
-    0xea,
-    0x5b,
-    0x50,
-    0x45,
-    0xda,
-    0xf3,
-    0x8e,
-    0xb8,
-    0x37,
-    0xf0,
-    0x97,
-    0xde,
-    0x41,
-    0xa6,
-    0x3d,
-    0xd4,
-    0xea,
-    0x4b,
-    0xaf,
-    0x9c,
-    0x7e,
-    0x09,
-    0x3f,
-    0xcc,
-    0x89,
-    0x52,
-    0x68,
-    0x87,
-    0xf6,
-    0x74,
-    0x0f,
-    0xad,
-    0x74,
-    0x6d,
-    0x09,
-    0x4f,
-    0x1e,
-    0x00,
-    0xde,
-    0x66,
-    0x5a,
-    0x08,
-    0xcc,
-    0xc4,
-    0x01,
-    0x0d,
-    0x0f,
-    0x4a,
-    0xc1,
-    0x15,
-    0x60,
-    0x5c,
-    0xc0,
-    0xbc,
-    0xbc,
-    0x92,
-    0x82,
-    0x87,
-    0x66,
-    0xb0,
-    0x0d,
-    0x76,
-    0x2f,
-    0xd9,
-    0x4b,
-    0xd8,
-    0xf5,
-    0xff,
-    0xaf,
-    0x63,
-    0x6a,
-    0x9e,
-    0x1b,
-    0x84,
-    0x16,
-    0xaa,
-    0x02,
-    0xf4,
-    0xa0,
-    0xc6,
-    0xca,
-    0x8c,
-    0x49,
-    0xb6,
-    0x74,
-    0x5a,
-    0xb9,
-    0x17,
-    0x7e,
-    0xf4,
-    0xfe,
-    0x4d,
-    0x08,
-    0x0c,
-    0xd2,
-    0xbe,
-    0x37,
-    0x45,
-    0x1c,
-    0x3e,
-    0xd7,
-    0x45,
-    0xba,
-    0xc9,
-    0x44,
-    0x0c,
-    0x7e,
-    0x78,
-    0x8a,
-    0x84,
-    0x76,
-    0xae,
-    0xcb,
-    0x59,
-    0x71,
-    0x92,
-    0xe1,
-    0x0a,
-    0xbe,
-    0xc3,
-    0x45,
-    0x41,
-    0x37,
-    0x47,
-    0x2f,
-    0x60,
-    0x7f,
-    0xc4,
-    0xff,
-    0x5c,
-    0x87,
-    0xf2,
-    0xdc,
-    0xce,
-    0x57,
-    0x50,
-    0x9b,
-    0x47,
-    0x0b,
-    0x16,
-    0xe2,
-    0xe4,
-    0x1b,
-    0x6b,
-    0x8d,
-    0x23,
-    0xe0,
-    0xd9,
-    0x50,
-    0xf5,
-    0x54,
-    0xfe,
-    0x9e,
-    0x15,
-    0x1a,
-    0x84,
-    0xca,
-    0x97,
-    0xbe,
-    0x53,
-    0x6d,
-    0xc4,
-    0x3d,
-    0x04,
-    0x07,
-    0x25,
-    0xc8,
-    0x99,
-    0xe9,
-    0xde,
-    0xc5,
-    0x6c,
-    0x52,
-    0x3e,
-    0x17,
-    0x66,
-    0xd8,
-    0x93,
-    0x9f,
-    0x71,
-    0x09,
-    0x43,
-    0x02,
-    0x30,
-    0x53,
-    0x18,
-    0xad,
-    0xed,
-    0x21,
-    0xdc,
-    0x17,
-    0xd3,
-    0x47,
-    0x26,
-    0x46,
-    0x5d,
-    0xa0,
-    0x73,
-    0x95,
-    0x0e,
-    0xf5,
-    0x78,
-    0xb4,
-    0x63,
-    0x21,
-    0xb7,
-    0xf0,
-    0x06,
-    0x73,
-    0x51,
-    0xb5,
-    0x44,
-    0x54,
-    0x1b,
-    0x51,
-    0xc1,
-    0x2a,
-    0xf3,
-    0xfa,
-    0x6a,
-    0x7c,
-    0x55,
-    0x13,
-    0xac,
-    0x56,
-    0x29,
-    0xab,
-    0xe3,
-    0xef,
-    0xdf,
-    0x47,
-    0x16,
-    0x89,
-    0xbe,
-    0xe1,
-    0xe1,
-    0x99,
-    0x79,
-    0x30,
-    0xb2,
-    0x28,
-    0x04,
-    0x2a,
-    0x39,
-    0x79,
-    0xa5,
-    0xc8,
-    0x19,
-    0xec,
-    0x4e,
-    0x09,
-    0xe4,
-    0x22,
-    0x2a,
-    0x39,
-    0x46,
-    0x62,
-    0x76,
-    0x73,
-    0x80,
-    0x3b,
-    0x92,
-    0x65,
-    0x18,
-    0x6b,
-    0x58,
-    0x53,
-    0xcf,
-    0x00,
-    0xac,
-    0x5e,
-    0xd4,
-    0xbd,
-    0x54,
-    0x07,
-    0x37,
-    0xbf,
-    0x0b,
-    0xef,
-    0xa0,
-    0x61,
-    0xd0,
-    0xe0,
-    0x41,
-    0x5c,
-    0x84,
-    0x11,
-    0x09,
-    0x33,
-    0xb4,
-    0xa6,
-    0x1b,
-    0xce,
-    0xb4,
-    0x77,
-    0x7e,
-    0x64,
-    0xed,
-    0x12,
-    0x16,
-    0x9f,
-    0x77,
-    0x03,
-    0xd3,
-    0xfb,
-    0xeb,
-    0x53,
-    0x28,
-    0x70,
-    0x72,
-    0x4e,
-    0xbf,
-    0x50,
-    0x22,
-    0x89,
-    0x6b,
-    0x72,
-    0x8b,
-    0x24,
-    0x5e,
-    0x90,
-    0x8c,
-    0x4d,
-    0x9c,
-    0xee,
-    0x6c,
-    0x05,
-    0xaf,
-    0x3c,
-    0x25,
-    0x27,
-    0x9c,
-    0xbe,
-    0x03,
-    0xa6,
-    0x17,
-    0xaa,
-    0x6e,
-    0x16,
-    0xf3,
-    0xd2,
-    0x04,
-    0x6e,
-    0xdc,
-    0x82,
-    0xec,
-    0x0c,
-    0x48,
-    0xac,
-    0x66,
-    0xf9,
-    0xab,
-    0x42,
-    0xa6,
-    0x6f,
-    0xea,
-    0xe4,
-    0xe2,
-    0x98,
-    0x13,
-    0xbb,
-    0xaa,
-    0x99,
-    0x4b,
-    0xa5,
-    0x78,
-    0xcf,
-    0x08,
-    0x92,
-    0x88,
-    0x58,
-    0x80,
-    0x2e,
-    0xe9,
-    0xd6,
-    0x61,
-    0xc0,
-    0xd5,
-    0x6f,
-    0xc2,
-    0x51,
-    0x3e,
-    0x19,
-    0x59,
-    0x12,
-    0xa9,
-    0x14,
-    0xef,
-    0xf8,
-    0x3f,
-    0xb7,
-    0x12,
-    0xa9,
-    0x21,
-    0x70,
-    0x0a,
-    0x9b,
-    0xfd,
-    0x07,
-    0x0e,
-    0x7a,
-    0xdf,
-    0x22,
-    0xb7,
-    0xcb,
-    0x49,
-    0x0e,
-    0xb4,
-    0xd0,
-    0x85,
-    0xbc,
-    0xc0,
-    0xab,
-    0x3a,
-    0x0a,
-    0xd1,
-    0xc5,
-    0x3e,
-    0x44,
-    0x92,
-    0x71,
-    0xab,
-    0xeb,
-    0x14,
-    0xcd,
-    0x35,
-    0xb5,
-    0xc0,
-    0xe9,
-    0xba,
-    0xd4,
-    0x91,
-    0x2c,
-    0x1b,
-    0x7b,
-    0x80,
-    0xf3,
-    0x4b,
-    0x9f,
-    0x3f,
-    0x7a,
-    0xa5,
-    0xfb,
-    0x29,
-    0x00,
-    0x83,
-    0x56,
-    0x7a,
-    0x26,
-    0x0c,
-    0x08,
-    0xbb,
-    0x99,
-    0x4d,
-    0xbb,
-    0x81,
-    0xf0,
-    0x8c,
-    0x6f,
-    0x57,
-    0xd8,
-    0xd8,
-    0xc1,
-    0xf9,
-    0x6e,
-    0xe5,
-    0x6c,
-    0xc3,
-    0xec,
-    0x17,
-    0x10,
-    0x68,
-    0x88,
-    0xdd,
-    0x32,
-    0xe7,
-    0x99,
-    0x40,
-    0x84,
-    0xbb,
-    0xfc,
-    0xbc,
-    0x67,
-    0x52,
-    0xb6,
-    0x4e,
-    0xaf,
-    0xc1,
-    0xda,
-    0xce,
-    0xa6,
-    0xb6,
-    0xae,
-    0x7f,
-    0x53,
-    0xae,
-    0x09,
-    0xe5,
-    0xfc,
-    0x68,
-    0xff,
-    0xd6,
-    0xe9,
-    0x99,
-    0xc0,
-    0xd4,
-    0x6b,
-    0xe1,
-    0xbe,
-    0x9a,
-    0x1d,
-    0xfe,
-    0x0e,
-    0xf5,
-    0x6a,
-    0x40,
-    0x11,
-    0xd5,
-    0x4f,
-    0x3c,
-    0x53,
-    0xa4,
-    0x62,
-    0xc5,
-    0xb3,
-    0xd6,
-    0x14,
-    0x18,
-    0xc5,
-    0xc2,
-    0x33,
-    0x57,
-    0x74,
-    0xb0,
-    0xb3,
-    0x39,
-    0xec,
-    0x33,
-    0xad,
-    0xff,
-    0xb7,
-    0xb9,
-    0xa8,
-    0xaa,
-    0x25,
-    0x60,
-    0x18,
-    0x6b,
-    0xf2,
-    0x0b,
-    0x24,
-    0x5b,
-    0x23,
-    0xb6,
-    0xac,
-    0x6c,
-    0x31,
-    0x06,
-    0x8b,
-    0x9f,
-    0x69,
-    0x24,
-    0x19,
-    0x78,
-    0x93,
-    0xcc,
-    0xf4,
-    0xb0,
-    0xd2,
-    0xa1,
-    0x01,
-    0x29,
-    0xcb,
-    0xc4,
-    0xad,
-    0x27,
-    0x09,
-    0xa4,
-    0x79,
-    0xbc,
-    0xa0,
-    0x18,
-    0xb5,
-    0x84,
-    0x11,
-    0xab,
-    0x8b,
-    0x93,
-    0x6e,
-    0x36,
-    0x40,
-    0xac,
-    0xbf,
-    0xb5,
-    0xb7,
-    0xb3,
-    0xa3,
-    0x53,
-    0x37,
-    0x65,
-    0x3b,
-    0xc7,
-    0x6d,
-    0x47,
-    0x43,
-    0xe3,
-    0xb5,
-    0xdc,
-    0x82,
-    0x6a,
-    0x95,
-    0x1b,
-    0x65,
-    0x23,
-    0x8a,
-    0x20,
-    0xe7,
-    0x2b,
-    0x08,
-    0x22,
-    0xb3,
-    0x8f,
-    0xbc,
-    0xa5,
-    0x8d,
-    0x1a,
-    0x14,
-    0xf1,
-    0xee,
-    0x6c,
-    0x01,
-    0xc2,
-    0xee,
-    0x4c,
-    0xfc,
-    0x41,
-    0x67,
-    0x40,
-    0x47,
-    0x33,
-    0x58,
-    0x5a,
-    0x75,
-    0x71,
-    0x87,
-    0x54,
-    0x2c,
-    0x98,
-    0x6b,
-    0xe0,
-    0x2a,
-    0x01,
-    0x48,
-    0x39,
-    0x86,
-    0xf4,
-    0x9c,
-    0xfe,
-    0x38,
-    0x18,
-    0xba,
-    0x40,
-    0xdc,
-    0x2e,
-    0xb5,
-    0xda,
-    0xb3,
-    0xff,
-    0x7f,
-    0x00,
-    0xeb,
-    0x93,
-    0x52,
-    0x1b,
-    0x20,
-    0xa4,
-    0x4f,
-    0xd4,
-    0x22,
-    0x52,
-    0x66,
-    0x6f,
-    0xf9,
-    0x19,
-    0x75,
-    0x5b,
-    0x26,
-    0xff,
-    0xb4,
-    0x07,
-    0x2c,
-    0x12,
-    0x50,
-    0xf7,
-    0x4f,
-    0x11,
-    0x56,
-    0x16,
-    0x9c,
-    0x6a,
-    0xd3,
-    0x4e,
-    0x29,
-    0x64,
-    0x3a,
-    0x56,
-    0x9e,
-    0x9e,
-    0x05,
-    0xcb,
-    0xf4,
-    0xb8,
-    0x9f,
-    0x83,
-    0x7d,
-    0x50,
-    0x82,
-    0x1e,
-    0x25,
-    0x30,
-    0x9c,
-    0xdd,
-    0xf7,
-    0xc5,
-    0xf8,
-    0xb8,
-    0xe3,
-    0xd4,
-    0x9a,
-    0xaa,
-    0xbe,
-    0x68,
-    0xab,
-    0x50,
-    0x8a,
-    0x0f,
-    0xd6,
-    0xb2,
-    0xf8,
-    0x45,
-    0xf1,
-    0x61,
-    0x2b,
-    0x31,
-    0xe0,
-    0xc2,
-    0xbf,
-    0x8f,
-    0xb6,
-    0xa9,
-    0x0a,
-    0xee,
-    0x1e,
-    0x29,
-    0xa1,
-    0x1b,
-    0xfa,
-    0xab,
-    0x1e,
-    0xdd,
-    0x49,
-    0x3e,
-    0x21,
-    0xe2,
-    0x4e,
-    0x2e,
-    0x95,
-    0xfa,
-    0xef,
-    0xd8,
-    0x35,
-    0x83,
-    0x5b,
-    0xbc,
-    0x4e,
-    0x24,
-    0xef,
-    0xd4,
-    0xc6,
-    0xbf,
-    0x5b,
-    0x25,
-    0x5d,
-    0xa0,
-    0x00,
-    0x93,
-    0x33,
-    0xfb,
-    0x9d,
-    0xf9,
-    0x8b,
-    0x95,
-    0x2b,
-    0x79,
-    0xce,
-    0xc1,
-    0x05,
-    0x11,
-    0xd3,
-    0x8e,
-    0x4c,
-    0x6f,
-    0x5d,
-    0x3f,
-    0x8a,
-    0x07,
-    0xe5,
-    0xfb,
-    0x95,
-    0x62,
-    0x9a,
-    0xc6,
-    0xb7,
-    0xb9,
-    0xa7,
-    0xb0,
-    0x0b,
-    0xc2,
-    0xb4,
-    0x4c,
-    0x2a,
-    0xca,
-    0xaf,
-    0x64,
-    0x07,
-    0x04,
-    0xcc,
-    0xeb,
-    0x18,
-    0x21,
-    0xca,
-    0x33,
-    0xb7,
-    0x20,
-    0x79,
-    0x61,
-    0xc7,
-    0x68,
-    0x79,
-    0x1d,
-    0x9a,
-    0x14,
-    0x44,
-    0x8e,
-    0x12,
-    0x8e,
-    0x6e,
-    0x85,
-    0x07,
-    0x5f,
-    0x2c,
-    0xf8,
-    0xe9,
-    0x45,
-    0x14,
-    0xb3,
-    0xa7,
-    0x86,
-    0x23,
-    0x4a,
-    0xcf,
-    0x85,
-    0x04,
-    0x52,
-    0xf6,
-    0x93,
-    0x8f,
-    0xd0,
-    0x5a,
-    0x07,
-    0x91,
-    0xf2,
-    0xc6,
-    0x91,
-    0xcb,
-    0xfd,
-    0xb6,
-    0xcb,
-    0x3d,
-    0x87,
-    0xbc,
-    0x11,
-    0xa4,
-    0xe6,
-    0x22,
-    0x93,
-    0x41,
-    0xe8,
-    0xd1,
-    0xa8,
-    0xdc,
-    0xc5,
-    0x71,
-    0x66,
-    0x09,
-    0x51,
-    0xd2,
-    0x6f,
-    0xaa,
-    0x76,
-    0x8b,
-    0x0d,
-    0xb5,
-    0xe2,
-    0xe1,
-    0x82,
-    0x37,
-    0xfd,
-    0xea,
-    0x99,
-    0x99,
-    0x1e,
-    0xf2,
-    0x81,
-    0x22,
-    0xfe,
-    0x1d,
-    0xdb,
-    0xbe,
-    0x6d,
-    0x4e,
-    0x12,
-    0xfe,
-    0x43,
-    0x48,
-    0xeb,
-    0x5f,
-    0x9a,
-    0x13,
-    0x5d,
-    0xcf,
-    0x3a,
-    0xa2,
-    0xa2,
-    0x6d,
-    0x55,
-    0xb2,
-    0x8e,
-    0x91,
-    0x75,
-    0xf5,
-    0x20,
-    0x0c,
-    0xb2,
-    0x70,
-    0x57,
-    0xb1,
-    0x28,
-    0x21,
-    0x46,
-    0x14,
-    0xa8,
-    0xe6,
-    0x6b,
-    0x91,
-    0xae,
-    0x9a,
-    0x3d,
-    0x90,
-    0x93,
-    0x81,
-    0x04,
-    0x08,
-    0x04,
-    0xe6,
-    0xed,
-    0x42,
-    0xb3,
-    0x02,
-    0x5e,
-    0xe0,
-    0x4c,
-    0x20,
-    0x87,
-    0x1d,
-    0xab,
-    0xff,
-    0x3a,
-    0x56,
-    0x4c,
-    0x78,
-    0xfc,
-    0xca,
-    0x03,
-    0x60,
-    0x5c,
-    0x9e,
-    0xed,
-    0xb0,
-    0x83,
-    0x24,
-    0xa6,
-    0xe3,
-    0x0d,
-    0x5c,
-    0xbc,
-    0xa0,
-    0x17,
-    0xbb,
-    0x64,
-    0x99,
-    0x99,
-    0x2c,
-    0x6c,
-    0xb3,
-    0xf7,
-    0x55,
-    0x71,
-    0x67,
-    0xd2,
-    0x1b,
-    0x52,
-    0x68,
-    0x24,
-    0x68,
-    0xe4,
-    0x86,
-    0x8c,
-    0x2b,
-    0xe8,
-    0xd2,
-    0xe6,
-    0xa1,
-    0x3a,
-    0x03,
-    0x1f,
-    0xd4,
-    0x4b,
-    0x18,
-    0x47,
-    0x61,
-    0xd0,
-    0x3f,
-    0xe8,
-    0x7d,
-    0xbc,
-    0xf6,
-    0x97,
-    0x3a,
-    0x6c,
-    0x70,
-    0xc8,
-    0x07,
-    0x22,
-    0x3a,
-    0xe7,
-    0x76,
-    0xb5,
-    0x1e,
-    0xa4,
-    0x43,
-    0x87,
-    0x48,
-    0x8e,
-    0x91,
-    0xb6,
-    0xa7,
-    0xe3,
-    0x76,
-    0x97,
-    0x96,
-    0xa6,
-    0xba,
-    0x60,
-    0xbc,
-    0xf3,
-    0xdc,
-    0x24,
-    0x30,
-    0x90,
-    0x56,
-    0x05,
-    0xe1,
-    0xc4,
-    0x22,
-    0xa5,
-    0x36,
-    0x6c,
-    0x7d,
-    0xdd,
-    0xf1,
-    0x4b,
-    0xeb,
-    0xb2,
-    0x59,
-    0xa2,
-    0x7b,
-    0x84,
-    0x98,
-    0x00,
-    0x4c,
-    0x89,
-    0x62,
-    0x5c,
-    0x50,
-    0x7a,
-    0xd7,
-    0x61,
-    0x50,
-    0x8c,
-    0xab,
-    0x09,
-    0x31,
-    0xa2,
-    0x84,
-    0x6d,
-    0x75,
-    0xc1,
-    0xa3,
-    0xdc,
-    0x05,
-    0xc4,
-    0xc7,
-    0x2a,
-    0x2d,
-    0x51,
-    0x4e,
-    0x4a,
-    0xe8,
-    0x0b,
-    0x9e,
-    0x1f,
-    0x5e,
-    0x09,
-    0xc3,
-    0x90,
-    0xab,
-    0x88,
-    0x59,
-    0xdb,
-    0xe2,
-    0xdc,
-    0xad,
-    0x2b,
-    0x51,
-    0xad,
-    0x1f,
-    0x6c,
-    0x07,
-    0x5f,
-    0xcb,
-    0x5e,
-    0x94,
-    0xd2,
-    0x68,
-    0xe8,
-    0x10,
-    0x4c,
-    0x6f,
-    0xb0,
-    0x5f,
-    0xb3,
-    0x80,
-    0xe8,
-    0xb2,
-    0x00,
-    0x03,
-    0x6b,
-    0x51,
-    0xf0,
-    0x0b,
-    0x08,
-    0x99,
-    0xfc,
-    0x7f,
-    0x1d,
-    0x40,
-    0x8c,
-    0x7b,
-    0x68,
-    0xe1,
-    0x68,
-    0xf4,
-    0x1b,
-    0xb4,
-    0x6f,
-    0x9b,
-    0x2e,
-    0x9c,
-    0x8b,
-    0x04,
-    0xf9,
-    0x68,
-    0xe4,
-    0x08,
-    0x02,
-    0x52,
-    0x54,
-    0x68,
-    0x14,
-    0xcc,
-    0x1c,
-    0xb2,
-    0x91,
-    0x7d,
-    0xd5,
-    0x69,
-    0x08,
-    0x86,
-    0xa9,
-    0x60,
-    0x0a,
-    0x09,
-    0xc2,
-    0x67,
-    0x3a,
-    0xec,
-    0x03,
-    0x29,
-    0xa4,
-    0xda,
-    0xf6,
-    0x55,
-    0x50,
-    0x8b,
-    0x06,
-    0xfc,
-    0x16,
-    0x46,
-    0xef,
-    0x3b,
-    0xb3,
-    0xa4,
-    0x72,
-    0x19,
-    0x1d,
-    0x96,
-    0x4d,
-    0xb2,
-    0x14,
-    0xa9,
-    0x6a,
-    0x96,
-    0xfa,
-    0x89,
-    0x57,
-    0x6c,
-    0xe4,
-    0xc4,
-    0xf6,
-    0xdb,
-    0xf1,
-    0xd1,
-    0x76,
-    0xaa,
-    0xdb,
-    0x51,
-    0x81,
-    0x25,
-    0xcb,
-    0x94,
-    0xb7,
-    0xc3,
-    0x72,
-    0x5f,
-    0x5c,
-    0x07,
-    0x55,
-    0xed,
-    0x4d,
-    0xa4,
-    0x68,
-    0x33,
-    0x39,
-    0xe4,
-    0xdf,
-    0x69,
-    0x0d,
-    0x4a,
-    0x41,
-    0xc5,
-    0xb0,
-    0x77,
-    0xbe,
-    0x8a,
-    0xf1,
-    0x4a,
-    0xc2,
-    0x41,
-    0xbe,
-    0x4b,
-    0xca,
-    0x46,
-    0x96,
-    0x4a,
-    0x77,
-    0x87,
-    0x40,
-    0x43,
-    0xe0,
-    0x89,
-    0xbe,
-    0x85,
-    0x2d,
-    0xac,
-    0x7d,
-    0x13,
-    0x62,
-    0xaf,
-    0xce,
-    0x4b,
-    0x78,
-    0x76,
-    0x9a,
-    0xc5,
-    0xb2,
-    0x0b,
-    0x50,
-    0x7e,
-    0x2e,
-    0xe4,
-    0x23,
-    0x36,
-    0xbb,
-    0x64,
-    0x73,
-    0x16,
-    0xea,
-    0xa3,
-    0x88,
-    0x96,
-    0x68,
-    0x72,
-    0x86,
-    0x9e,
-    0x8a,
-    0x9a,
-    0x9d,
-    0xeb,
-    0x2a,
-    0x65,
-    0x81,
-    0xb5,
-    0xb2,
-    0x60,
-    0x1a,
-    0x8f,
-    0x76,
-    0x5e,
-    0x7c,
-    0x8e,
-    0x47,
-    0xc0,
-    0x19,
-    0xad,
-    0x44,
-    0xf4,
-    0x35,
-    0x70,
-    0xf4,
-    0x3c
-  ],
-  const [
-    0xa2,
-    0x83,
-    0x31,
-    0xa9,
-    0x66,
-    0xb0,
-    0x86,
-    0x58,
-    0x92,
-    0xc2,
-    0xc7,
-    0x6c,
-    0x12,
-    0x4c,
-    0x50,
-    0xa0,
-    0x4a,
-    0x6e,
-    0xcb,
-    0xc7,
-    0x4c,
-    0x41,
-    0x01,
-    0x55,
-    0x4f,
-    0x75,
-    0xf1,
-    0x20,
-    0x5d,
-    0x39,
-    0x1f,
-    0x68,
-    0x4b,
-    0x5b,
-    0x2f,
-    0x15,
-    0xee,
-    0xb1,
-    0xb2,
-    0x41,
-    0x8c,
-    0xb7,
-    0x40,
-    0xf6,
-    0x91,
-    0x79,
-    0xc7,
-    0x39,
-    0x83,
-    0xb4,
-    0x22,
-    0x47,
-    0x38,
-    0x38,
-    0xee,
-    0x1e,
-    0x47,
-    0x90,
-    0x99,
-    0x3f,
-    0xbc,
-    0xe5,
-    0xbb,
-    0xb3,
-    0x10,
-    0x20,
-    0xaa,
-    0x4c,
-    0x58,
-    0x4f,
-    0x49,
-    0x2d,
-    0xbc,
-    0x4a,
-    0x20,
-    0x8c,
-    0x2b,
-    0x96,
-    0xb2,
-    0xb7,
-    0x4d,
-    0x89,
-    0x0a,
-    0x55,
-    0xb9,
-    0xaf,
-    0x98,
-    0xef,
-    0x69,
-    0x6d,
-    0x3b,
-    0xaf,
-    0x6a,
-    0xe4,
-    0x9f,
-    0x67,
-    0xd8,
-    0x18,
-    0xc9,
-    0xd4,
-    0x0a,
-    0x52,
-    0xf0,
-    0x25,
-    0x0a,
-    0xc3,
-    0x8f,
-    0xb7,
-    0x48,
-    0x69,
-    0xb8,
-    0x23,
-    0x8f,
-    0x37,
-    0xab,
-    0x7a,
-    0x37,
-    0x70,
-    0xa7,
-    0xcf,
-    0x9d,
-    0x54,
-    0x00,
-    0xf6,
-    0xd0,
-    0xfe,
-    0x72,
-    0x8c,
-    0x8d,
-    0x8d,
-    0xb5,
-    0x37,
-    0x6e,
-    0x82,
-    0x51,
-    0x2f,
-    0x5e,
-    0x69,
-    0xb4,
-    0xfe,
-    0x50,
-    0xbc,
-    0x82,
-    0x84,
-    0x31,
-    0x04,
-    0x2c,
-    0x3d,
-    0x1a,
-    0x41,
-    0xc4,
-    0xc7,
-    0xcb,
-    0x8c,
-    0x10,
-    0x9e,
-    0x55,
-    0xfb,
-    0xdd,
-    0x2b,
-    0x16,
-    0xc5,
-    0x95,
-    0xfd,
-    0xea,
-    0xa6,
-    0x14,
-    0x56,
-    0xa0,
-    0x85,
-    0xb8,
-    0xe9,
-    0xab,
-    0x55,
-    0xb7,
-    0xe2,
-    0x1a,
-    0x39,
-    0xb6,
-    0x27,
-    0xcb,
-    0xeb,
-    0x97,
-    0xdd,
-    0xdb,
-    0x5e,
-    0x92,
-    0x2f,
-    0x60,
-    0xa2,
-    0x87,
-    0x4a,
-    0x5b,
-    0x09,
-    0x92,
-    0xac,
-    0xe8,
-    0x88,
-    0xe1,
-    0x9f,
-    0xb8,
-    0x5f,
-    0xc2,
-    0x00,
-    0xc1,
-    0xfc,
-    0x00,
-    0x45,
-    0x34,
-    0x1d,
-    0x70,
-    0xbf,
-    0xb0,
-    0x36,
-    0xc7,
-    0x1b,
-    0xb5,
-    0x12,
-    0xae,
-    0x2f,
-    0x5b,
-    0xbc,
-    0x19,
-    0xf4,
-    0x44,
-    0xa0,
-    0xd4,
-    0xce,
-    0xcf,
-    0xee,
-    0x5e,
-    0x14,
-    0x8e,
-    0x3f,
-    0xfb,
-    0xcc,
-    0xfb,
-    0x7b,
-    0x05,
-    0xb6,
-    0x66,
-    0xfa,
-    0x83,
-    0x8d,
-    0x32,
-    0xe9,
-    0xfd,
-    0x89,
-    0x41,
-    0xf0,
-    0x8e,
-    0x28,
-    0xad,
-    0x11,
-    0x3a,
-    0x2e,
-    0xb9,
-    0xd4,
-    0x82,
-    0xea,
-    0x07,
-    0xa1,
-    0x36,
-    0xbc,
-    0x0b,
-    0x6d,
-    0x8b,
-    0xd4,
-    0xbf,
-    0x99,
-    0x6d,
-    0x3c,
-    0x98,
-    0x16,
-    0x16,
-    0x19,
-    0xb9,
-    0xce,
-    0xe0,
-    0x2e,
-    0x68,
-    0x3f,
-    0x57,
-    0xa1,
-    0xbe,
-    0x69,
-    0x93,
-    0x02,
-    0xa2,
-    0xeb,
-    0xc5,
-    0x89,
-    0xf8,
-    0x69,
-    0x0f,
-    0x9f,
-    0x15,
-    0x30,
-    0x99,
-    0xa0,
-    0x76,
-    0x1d,
-    0xe1,
-    0xe0,
-    0xb2,
-    0xbb,
-    0x52,
-    0xec,
-    0xae,
-    0xab,
-    0x19,
-    0x12,
-    0x10,
-    0x49,
-    0x34,
-    0x23,
-    0xf6,
-    0x8c,
-    0xcb,
-    0x77,
-    0xe7,
-    0x2e,
-    0xc4,
-    0x32,
-    0x0a,
-    0x0d,
-    0x92,
-    0xc6,
-    0x95,
-    0xd2,
-    0x4d,
-    0xb9,
-    0x89,
-    0xd0,
-    0x08,
-    0xa9,
-    0x9d,
-    0x2f,
-    0x5f,
-    0x8d,
-    0x77,
-    0x49,
-    0x4f,
-    0x3d,
-    0x22,
-    0x54,
-    0x4b,
-    0x35,
-    0xbd,
-    0x42,
-    0x8b,
-    0x95,
-    0x70,
-    0xe5,
-    0xa8,
-    0x6d,
-    0xa5,
-    0x57,
-    0x66,
-    0x38,
-    0x74,
-    0x99,
-    0xd0,
-    0xa6,
-    0x5e,
-    0x7a,
-    0x8b,
-    0x9f,
-    0x3f,
-    0xba,
-    0x64,
-    0x84,
-    0x7e,
-    0x70,
-    0x2b,
-    0xb8,
-    0x87,
-    0xa9,
-    0xc4,
-    0x5f,
-    0x7b,
-    0x52,
-    0x7b,
-    0x65,
-    0x25,
-    0x58,
-    0x98,
-    0xc2,
-    0x31,
-    0x0d,
-    0x33,
-    0xfd,
-    0x98,
-    0xce,
-    0x4a,
-    0xef,
-    0x5f,
-    0xe3,
-    0x11,
-    0xca,
-    0x81,
-    0xa6,
-    0x89,
-    0x5a,
-    0x2a,
-    0xe7,
-    0x54,
-    0x8a,
-    0x25,
-    0x90,
-    0xc8,
-    0x29,
-    0x98,
-    0x85,
-    0x42,
-    0xee,
-    0xef,
-    0xce,
-    0xbd,
-    0xba,
-    0x16,
-    0xf8,
-    0xa3,
-    0x1e,
-    0xeb,
-    0xb8,
-    0xe2,
-    0x1d,
-    0xf3,
-    0xd2,
-    0x43,
-    0x33,
-    0x4b,
-    0x39,
-    0xf8,
-    0x96,
-    0xe2,
-    0x78,
-    0x73,
-    0xbb,
-    0xe6,
-    0x50,
-    0x7f,
-    0x1c,
-    0x7c,
-    0xa3,
-    0x89,
-    0x39,
-    0xb4,
-    0x91,
-    0x3e,
-    0xdc,
-    0xbc,
-    0xe0,
-    0x5c,
-    0xa2,
-    0x54,
-    0xa1,
-    0xc1,
-    0xb7,
-    0x81,
-    0x10,
-    0xc9,
-    0xe1,
-    0x86,
-    0xbd,
-    0xd6,
-    0xc0,
-    0x10,
-    0xe9,
-    0x30,
-    0x54,
-    0xb1,
-    0x33,
-    0x10,
-    0xbf,
-    0x8f,
-    0x74,
-    0xf7,
-    0x4c,
-    0x5e,
-    0xe7,
-    0x44,
-    0xb1,
-    0x8b,
-    0x8d,
-    0x06,
-    0x91,
-    0xba,
-    0xcf,
-    0x0f,
-    0x45,
-    0x73,
-    0x66,
-    0x4a,
-    0xdc,
-    0x18,
-    0x78,
-    0x4e,
-    0x60,
-    0x1b,
-    0x03,
-    0x32,
-    0x5b,
-    0x6d,
-    0x7f,
-    0xa3,
-    0x9a,
-    0x3a,
-    0xbf,
-    0x35,
-    0x31,
-    0xd3,
-    0x19,
-    0xf7,
-    0xc0,
-    0xec,
-    0xc6,
-    0x4a,
-    0xf4,
-    0x07,
-    0x8b,
-    0xf3,
-    0x50,
-    0x30,
-    0x99,
-    0x6e,
-    0x2d,
-    0xeb,
-    0xb3,
-    0x85,
-    0xff,
-    0x6b,
-    0x8e,
-    0x22,
-    0xdb,
-    0x04,
-    0x7d,
-    0x62,
-    0x36,
-    0xe3,
-    0x4e,
-    0xea,
-    0xf0,
-    0xfd,
-    0x6e,
-    0x7e,
-    0x91,
-    0x45,
-    0x54,
-    0xd0,
-    0xd2,
-    0x22,
-    0x1d,
-    0x95,
-    0x5f,
-    0x20,
-    0x74,
-    0xde,
-    0xdb,
-    0xe6,
-    0xb5,
-    0xa6,
-    0x24,
-    0x68,
-    0x52,
-    0xa7,
-    0xd9,
-    0x5d,
-    0x75,
-    0x73,
-    0x1a,
-    0xf4,
-    0xe7,
-    0xbf,
-    0x8f,
-    0xc2,
-    0x30,
-    0x02,
-    0xac,
-    0xff,
-    0x00,
-    0x3f,
-    0x33,
-    0xf3,
-    0xcd,
-    0x1e,
-    0xfa,
-    0xab,
-    0xbe,
-    0x42,
-    0xee,
-    0xf0,
-    0xc8,
-    0xd7,
-    0x58,
-    0x7a,
-    0x17,
-    0x6a,
-    0x5f,
-    0x60,
-    0xaf,
-    0xfe,
-    0xce,
-    0xd3,
-    0x53,
-    0x5c,
-    0x18,
-    0x0c,
-    0xa5,
-    0xaa,
-    0x9a,
-    0x83,
-    0x90,
-    0x3f,
-    0x1f,
-    0x62,
-    0xe3,
-    0xb6,
-    0xa9,
-    0x39,
-    0x3e,
-    0x41,
-    0x6f,
-    0xf3,
-    0x32,
-    0x40,
-    0x22,
-    0x09,
-    0xa4,
-    0x13,
-    0x74,
-    0xf5,
-    0x72,
-    0x2c,
-    0xdb,
-    0xea,
-    0x5a,
-    0x68,
-    0x92,
-    0xc2,
-    0x17,
-    0x9f,
-    0xe2,
-    0x38,
-    0xcc,
-    0x7a,
-    0x9f,
-    0x57,
-    0xa6,
-    0x84,
-    0xf5,
-    0x32,
-    0xbd,
-    0x84,
-    0x65,
-    0xd6,
-    0x3c,
-    0x0b,
-    0x0a,
-    0x7d,
-    0xc2,
-    0x49,
-    0x21,
-    0x04,
-    0x08,
-    0x24,
-    0xc8,
-    0x9f,
-    0xc3,
-    0x8c,
-    0x06,
-    0xcc,
-    0xcc,
-    0x08,
-    0x0c,
-    0x85,
-    0x7e,
-    0x95,
-    0xba,
-    0xba,
-    0x5f,
-    0xb1,
-    0x65,
-    0xfe,
-    0x03,
-    0xb3,
-    0xd8,
-    0x81,
-    0x2e,
-    0x5d,
-    0x98,
-    0x3e,
-    0x39,
-    0xb4,
-    0x6d,
-    0x75,
-    0xb7,
-    0x0f,
-    0x1d,
-    0x5c,
-    0x58,
-    0x6f,
-    0x7b,
-    0x12,
-    0x0d,
-    0x0e,
-    0xa0,
-    0xd4,
-    0x6c,
-    0x3b,
-    0x79,
-    0x73,
-    0x57,
-    0x64,
-    0x82,
-    0x05,
-    0xd8,
-    0x75,
-    0xd0,
-    0xdb,
-    0x50,
-    0x61,
-    0x55,
-    0xb4,
-    0xd1,
-    0xfd,
-    0x60,
-    0x30,
-    0xc8,
-    0x15,
-    0x63,
-    0x88,
-    0xdf,
-    0xba,
-    0xf9,
-    0x7b,
-    0x21,
-    0xd9,
-    0x27,
-    0x8c,
-    0x5f,
-    0x12,
-    0xe2,
-    0x6a,
-    0xd3,
-    0xc6,
-    0xd2,
-    0xb0,
-    0x04,
-    0x72,
-    0x56,
-    0xce,
-    0xe9,
-    0x3c,
-    0xc8,
-    0x47,
-    0x51,
-    0xcc,
-    0x02,
-    0x1e,
-    0x83,
-    0x5d,
-    0x21,
-    0x8a,
-    0x21,
-    0x14,
-    0x89,
-    0xf1,
-    0x52,
-    0x90,
-    0x29,
-    0x14,
-    0x1f,
-    0xc2,
-    0x00,
-    0x88,
-    0x1e,
-    0xff,
-    0xdf,
-    0x65,
-    0x4e,
-    0x53,
-    0x71,
-    0x42,
-    0x43,
-    0x19,
-    0x7a,
-    0x60,
-    0x83,
-    0xc8,
-    0x5c,
-    0x25,
-    0x2f,
-    0x10,
-    0xdf,
-    0xcc,
-    0xe6,
-    0x26,
-    0x31,
-    0x5c,
-    0xe6,
-    0x5c,
-    0x2c,
-    0xd6,
-    0x74,
-    0xf4,
-    0xd8,
-    0xb3,
-    0x7f,
-    0x36,
-    0x31,
-    0x8d,
-    0x80,
-    0xc0,
-    0x2a,
-    0x1d,
-    0xa4,
-    0x1e,
-    0xf1,
-    0x65,
-    0x2d,
-    0x9a,
-    0x75,
-    0x2e,
-    0x15,
-    0x55,
-    0x26,
-    0xb5,
-    0xf5,
-    0x97,
-    0xfb,
-    0xa2,
-    0x26,
-    0x64,
-    0xba,
-    0x39,
-    0x26,
-    0x50,
-    0x74,
-    0xd4,
-    0x3d,
-    0x94,
-    0x4e,
-    0x91,
-    0x60,
-    0x60,
-    0x88,
-    0x48,
-    0x55,
-    0x73,
-    0xb7,
-    0xc0,
-    0x18,
-    0xea,
-    0x55,
-    0x22,
-    0x7e,
-    0x55,
-    0x7c,
-    0xad,
-    0x18,
-    0x10,
-    0xef,
-    0xac,
-    0x5a,
-    0xd1,
-    0x5a,
-    0xa5,
-    0xfc,
-    0x7d,
-    0xdb,
-    0xd4,
-    0xa1,
-    0x40,
-    0xc0,
-    0xd7,
-    0xb7,
-    0xdc,
-    0x93,
-    0xab,
-    0x9e,
-    0x41,
-    0x54,
-    0xd7,
-    0x0c,
-    0x5f,
-    0x05,
-    0xe7,
-    0xb0,
-    0x38,
-    0x6c,
-    0x1c,
-    0x15,
-    0x39,
-    0x14,
-    0x62,
-    0xca,
-    0xca,
-    0x95,
-    0x82,
-    0xc0,
-    0x24,
-    0x15,
-    0x99,
-    0xf3,
-    0x62,
-    0x0f,
-    0xc9,
-    0x4c,
-    0xdb,
-    0x53,
-    0x2e,
-    0xc6,
-    0xb0,
-    0x4e,
-    0x14,
-    0xd1,
-    0xa1,
-    0x8c,
-    0x67,
-    0xf4,
-    0x25,
-    0x7b,
-    0x6a,
-    0xb5,
-    0xb9,
-    0x72,
-    0xac,
-    0xbd,
-    0x78,
-    0xf1,
-    0x39,
-    0x38,
-    0xec,
-    0x2b,
-    0x0d,
-    0x7b,
-    0x24,
-    0xc1,
-    0xce,
-    0xe9,
-    0x06,
-    0xd1,
-    0xba,
-    0x17,
-    0xe7,
-    0x2f,
-    0xde,
-    0x2e,
-    0x59,
-    0xf2,
-    0x88,
-    0x91,
-    0x44,
-    0x33,
-    0x00,
-    0xc0,
-    0x39,
-    0x11,
-    0x73,
-    0x7d,
-    0x02,
-    0xf8,
-    0x30,
-    0x2d,
-    0x7e,
-    0x24,
-    0x17,
-    0x80,
-    0xac,
-    0x60,
-    0x4d,
-    0x54,
-    0x05,
-    0x14,
-    0x35,
-    0xd7,
-    0x0f,
-    0x7e,
-    0x9c,
-    0xec,
-    0x2f,
-    0x40,
-    0x34,
-    0xd1,
-    0xbe,
-    0x1b,
-    0x44,
-    0xfe,
-    0x60,
-    0xfa,
-    0x9d,
-    0x50,
-    0x91,
-    0x32,
-    0xd0,
-    0x66,
-    0x81,
-    0x08,
-    0x9e,
-    0x4c,
-    0x22,
-    0x74,
-    0xb0,
-    0x56,
-    0x7f,
-    0x24,
-    0x89,
-    0x4f,
-    0x4f,
-    0xc4,
-    0xb8,
-    0xd3,
-    0xca,
-    0x7d,
-    0x52,
-    0xfa,
-    0xbb,
-    0xbb,
-    0x9f,
-    0x37,
-    0xd7,
-    0x34,
-    0x14,
-    0x7f,
-    0x4d,
-    0x26,
-    0x81,
-    0xad,
-    0x9e,
-    0xdf,
-    0x8c,
-    0x25,
-    0xaf,
-    0x83,
-    0x5e,
-    0xb7,
-    0x1d,
-    0x0a,
-    0x9c,
-    0xc7,
-    0xd0,
-    0x88,
-    0x99,
-    0xab,
-    0xd3,
-    0xb1,
-    0xca,
-    0x55,
-    0x62,
-    0x9c,
-    0x7a,
-    0x32,
-    0x45,
-    0xc7,
-    0xbe,
-    0x51,
-    0x5d,
-    0x5c,
-    0xac,
-    0xc8,
-    0x7d,
-    0xb2,
-    0xc8,
-    0x54,
-    0x7b,
-    0x17,
-    0xbf,
-    0x3f,
-    0x86,
-    0xcd,
-    0x58,
-    0x87,
-    0xb9,
-    0x52,
-    0xa7,
-    0x3c,
-    0xf1,
-    0xe4,
-    0x84,
-    0x2a,
-    0xdc,
-    0x45,
-    0x3b,
-    0xb8,
-    0x53,
-    0xbc,
-    0x85,
-    0x10,
-    0xea,
-    0x5c,
-    0xb7,
-    0x80,
-    0xc5,
-    0x88,
-    0x3a,
-    0x20,
-    0xad,
-    0xb7,
-    0x3b,
-    0xb6,
-    0x62,
-    0x75,
-    0xa3,
-    0xd6,
-    0x33,
-    0xab,
-    0x4a,
-    0x4e,
-    0xcd,
-    0x1f,
-    0x67,
-    0xc1,
-    0x51,
-    0x3e,
-    0x4c,
-    0x91,
-    0xa9,
-    0x1a,
-    0x50,
-    0x02,
-    0x1b,
-    0xaf,
-    0x0c,
-    0x9d,
-    0x1e,
-    0x6a,
-    0xca,
-    0xd3,
-    0x6d,
-    0xec,
-    0x3a,
-    0xe3,
-    0x5b,
-    0x0b,
-    0x67,
-    0xfe,
-    0x66,
-    0x19,
-    0xea,
-    0xa8,
-    0x0e,
-    0x69,
-    0x5d,
-    0x61,
-    0xe8,
-    0x10,
-    0x13,
-    0x85,
-    0xee,
-    0xe9,
-    0x06,
-    0x71,
-    0x19,
-    0xdc,
-    0x11,
-    0xe7,
-    0x32,
-    0x5f,
-    0x60,
-    0xb4,
-    0xe5,
-    0x3c,
-    0x24,
-    0x8f,
-    0x17,
-    0x95,
-    0x8b,
-    0x45,
-    0x79,
-    0x26,
-    0xef,
-    0x13,
-    0x5d,
-    0xcb,
-    0x4e,
-    0x53,
-    0xc9,
-    0x42,
-    0xfa,
-    0x5c,
-    0xca,
-    0x31,
-    0x91,
-    0xa3,
-    0x0b,
-    0x6b,
-    0x30,
-    0x26,
-    0xa6,
-    0x6f,
-    0xe4,
-    0x0a,
-    0x3a,
-    0x32,
-    0x61,
-    0x82,
-    0x3e,
-    0x1e,
-    0xf7,
-    0xf4,
-    0x95,
-    0x5a,
-    0xc1,
-    0x57,
-    0x62,
-    0x4c,
-    0x20,
-    0xe0,
-    0x1d,
-    0x5c,
-    0x67,
-    0xdd,
-    0xe7,
-    0xfb,
-    0xd8,
-    0xe1,
-    0x1a,
-    0xe4,
-    0xd0,
-    0x21,
-    0x25,
-    0xa2,
-    0x3e,
-    0x1e,
-    0x97,
-    0x53,
-    0x59,
-    0x84,
-    0x79,
-    0xab,
-    0x93,
-    0x52,
-    0xe1,
-    0x3c,
-    0xc8,
-    0x3c,
-    0xc4,
-    0xf4,
-    0xbc,
-    0x4e,
-    0x0c,
-    0xe7,
-    0xc4,
-    0xd1,
-    0xea,
-    0x4e,
-    0xc3,
-    0x72,
-    0x6e,
-    0xd0,
-    0x58,
-    0xa1,
-    0x55,
-    0x01,
-    0x56,
-    0x38,
-    0x22,
-    0x29,
-    0x75,
-    0x5d,
-    0x70,
-    0x46,
-    0x47,
-    0xa9,
-    0x86,
-    0x54,
-    0x6d,
-    0x8a,
-    0x2c,
-    0xcb,
-    0x0a,
-    0xe5,
-    0xbd,
-    0x6a,
-    0x78,
-    0x00,
-    0x7e,
-    0x33,
-    0x3a,
-    0xa0,
-    0x2e,
-    0xb7,
-    0x32,
-    0x6e,
-    0xde,
-    0x93,
-    0x14,
-    0x9f,
-    0x03,
-    0x3b,
-    0x1b,
-    0xd4,
-    0xca,
-    0xf6,
-    0xfb,
-    0x3f,
-    0xab,
-    0x2a,
-    0x16,
-    0x08,
-    0x41,
-    0xda,
-    0xf2,
-    0xef,
-    0x59,
-    0x6d,
-    0xeb,
-    0x32,
-    0x49,
-    0xb1,
-    0x25,
-    0xb1,
-    0x83,
-    0x1f,
-    0xc5,
-    0x50,
-    0x69,
-    0x61,
-    0x61,
-    0x9d,
-    0x63,
-    0x11,
-    0xb4,
-    0xb3,
-    0x2f,
-    0xc4,
-    0x97,
-    0x5e,
-    0x79,
-    0x47,
-    0x2d,
-    0x7f,
-    0xac,
-    0x28,
-    0x5d,
-    0xb2,
-    0x07,
-    0x78,
-    0x85,
-    0x2f,
-    0xf3,
-    0xd0,
-    0x6c,
-    0xee,
-    0x94,
-    0x92,
-    0x79,
-    0x0f,
-    0x9e,
-    0x71,
-    0x23,
-    0x78,
-    0x6a,
-    0x34,
-    0xa9,
-    0xc0,
-    0x49,
-    0xb6,
-    0x03,
-    0x4c,
-    0x18,
-    0x32,
-    0x18,
-    0xb7,
-    0x14,
-    0xbd,
-    0x31,
-    0x77,
-    0xf0,
-    0x14,
-    0xae,
-    0xbe,
-    0x25,
-    0x98,
-    0xf8,
-    0x9f,
-    0x8a,
-    0x97,
-    0xb6,
-    0x72,
-    0x24,
-    0xcd,
-    0x44,
-    0x79,
-    0x3f,
-    0x2b,
-    0x60,
-    0xc4,
-    0xbd,
-    0xd7,
-    0x27,
-    0x51,
-    0xaf,
-    0x73,
-    0x41,
-    0x78,
-    0x22,
-    0xa2,
-    0x58,
-    0x86,
-    0x3b,
-    0xc8,
-    0xce,
-    0xa9,
-    0x87,
-    0x12,
-    0xaf,
-    0x0c,
-    0x8c,
-    0xb7,
-    0xe4,
-    0x42,
-    0xa4,
-    0x7d,
-    0xaa,
-    0xe8,
-    0x0b,
-    0x7e,
-    0x43,
-    0x86,
-    0x36,
-    0x2c,
-    0xeb,
-    0xb7,
-    0x66,
-    0x93,
-    0x0e,
-    0x8a,
-    0x7e,
-    0xde,
-    0xb8,
-    0x27,
-    0x11,
-    0x1d,
-    0x4d,
-    0xb6,
-    0xc0,
-    0x45,
-    0x7a,
-    0x7c,
-    0xc3,
-    0x78,
-    0x6b,
-    0x47,
-    0xc5,
-    0x87,
-    0x3f,
-    0x0d,
-    0xf5,
-    0xb6,
-    0xb9,
-    0xd0,
-    0x5a,
-    0xbf,
-    0x38,
-    0xc4,
-    0x66,
-    0x19,
-    0xe9,
-    0xb4,
-    0xcf,
-    0x79,
-    0x3b,
-    0xa2,
-    0x9a,
-    0x9a,
-    0x93,
-    0xae,
-    0x79,
-    0x3a,
-    0x42,
-    0x39,
-    0x56,
-    0x65,
-    0xb4,
-    0x49,
-    0x30,
-    0xf5,
-    0xe9,
-    0x2f,
-    0x26,
-    0x5a,
-    0x29,
-    0x68,
-    0xd1,
-    0x97,
-    0xf4,
-    0xc2,
-    0xd7,
-    0x8d,
-    0x39,
-    0xbf,
-    0xbd,
-    0x7c,
-    0xc8,
-    0x3e,
-    0xfd,
-    0xc7,
-    0x08,
-    0x58,
-    0x59,
-    0xf7,
-    0xed,
-    0x89,
-    0x6e,
-    0x03,
-    0x25,
-    0x10,
-    0x8c,
-    0xcf,
-    0x92,
-    0x98,
-    0xc5,
-    0xf2,
-    0xfd,
-    0x17,
-    0x44,
-    0xbc,
-    0x09,
-    0xf7,
-    0xe1,
-    0x78,
-    0x65,
-    0x74,
-    0xf2,
-    0xee,
-    0x46,
-    0x45,
-    0x63,
-    0x2c,
-    0x15,
-    0x7e,
-    0x09,
-    0x86,
-    0x64,
-    0xb5,
-    0x33,
-    0xdc,
-    0x27,
-    0x63,
-    0x82,
-    0x1b,
-    0x21,
-    0x8e,
-    0xfb,
-    0x06,
-    0x9c,
-    0xa5,
-    0x5b,
-    0x37,
-    0x5d,
-    0xac,
-    0xaa,
-    0x60,
-    0xd7,
-    0x98,
-    0x13,
-    0xd7,
-    0x9f,
-    0xfd,
-    0xf3,
-    0x52,
-    0x20,
-    0xe6,
-    0x30,
-    0xef,
-    0x90,
-    0x04,
-    0xcc,
-    0x77,
-    0x23,
-    0x0c,
-    0xba,
-    0xe3,
-    0x7e,
-    0x5a,
-    0xf0,
-    0x1f,
-    0x6e,
-    0xda,
-    0xbd,
-    0x0f,
-    0xda,
-    0x28,
-    0x5d,
-    0xd0,
-    0xf6,
-    0xf6,
-    0xcb,
-    0x40,
-    0xba,
-    0xaf,
-    0xd6,
-    0xc0,
-    0x93,
-    0x59,
-    0x77,
-    0x38,
-    0x58,
-    0xc0,
-    0x62,
-    0x5c,
-    0x7f,
-    0xd1,
-    0xdb,
-    0x2e,
-    0x91,
-    0x44,
-    0xcb,
-    0xc4,
-    0xdb,
-    0x7e,
-    0x13,
-    0x4c,
-    0x67,
-    0xb5,
-    0x20,
-    0x4d,
-    0x2a,
-    0x55,
-    0xbf,
-    0x30,
-    0x7f,
-    0xa2,
-    0x33,
-    0xfe,
-    0xd4,
-    0x9f,
-    0x86,
-    0x6b,
-    0xa3,
-    0x2f,
-    0x1c,
-    0x14,
-    0xa5,
-    0x7b,
-    0x8e,
-    0x05,
-    0x42,
-    0x93,
-    0xb5,
-    0x7e,
-    0x4b,
-    0x58,
-    0x04,
-    0xf7,
-    0xeb,
-    0x99,
-    0x1b,
-    0x61,
-    0xdb,
-    0x7c,
-    0x9a,
-    0xaf,
-    0xd6,
-    0x20,
-    0x33,
-    0x95,
-    0x4d,
-    0x80,
-    0x04,
-    0x8f,
-    0x5b,
-    0x9b,
-    0x23,
-    0x26,
-    0xfb,
-    0xd2,
-    0x7a,
-    0x6f,
-    0x79,
-    0x91,
-    0xd5,
-    0xd4,
-    0x26,
-    0x31,
-    0x39,
-    0x16,
-    0x50,
-    0x1d,
-    0x78,
-    0x93,
-    0x71,
-    0x34,
-    0x02,
-    0xc5,
-    0xa7,
-    0x6f,
-    0xfe,
-    0x0c,
-    0x64,
-    0xc4,
-    0x99,
-    0xad,
-    0x67,
-    0x4a,
-    0x9e,
-    0x1a,
-    0xeb,
-    0x9d,
-    0x48,
-    0x74,
-    0x1e,
-    0x84,
-    0x54,
-    0x4e,
-    0xd4,
-    0xd1,
-    0x59,
-    0xb4,
-    0x7d,
-    0x89,
-    0x5c,
-    0x6b,
-    0x54,
-    0x45,
-    0x9f,
-    0x7b,
-    0xda,
-    0xd8,
-    0xbb,
-    0xeb,
-    0x83,
-    0x32,
-    0xee,
-    0xcc,
-    0xaf,
-    0x85,
-    0xb6,
-    0x79,
-    0xdb,
-    0xa6,
-    0x9f,
-    0x1c,
-    0x19,
-    0xb5,
-    0x59,
-    0x74,
-    0xbd,
-    0x00,
-    0x0d,
-    0xd6,
-    0x5a,
-    0x25,
-    0xf1,
-    0x72,
-    0xed,
-    0x77,
-    0x1b,
-    0xd8,
-    0x57,
-    0xa3,
-    0x93,
-    0xbb,
-    0x11,
-    0x94,
-    0xab,
-    0xf4,
-    0x1b,
-    0x93,
-    0x93,
-    0xc9,
-    0x35,
-    0xb3,
-    0x28,
-    0x70,
-    0x52,
-    0x6c,
-    0x0d,
-    0xcf,
-    0x4a,
-    0x86,
-    0xfd,
-    0x86,
-    0xcf,
-    0x38,
-    0x5f,
-    0x2f,
-    0xa2,
-    0x92,
-    0x1b,
-    0xe4,
-    0x06,
-    0x18,
-    0xad,
-    0x02,
-    0x76,
-    0xb0,
-    0x78,
-    0x2d,
-    0x93,
-    0xbe,
-    0x5c,
-    0x95,
-    0x60,
-    0x8d,
-    0x8a,
-    0x77,
-    0xb1,
-    0xf1,
-    0x97,
-    0xe6,
-    0xe1,
-    0x2a,
-    0xd0,
-    0xcb,
-    0xc4,
-    0x0c,
-    0xce,
-    0x2b,
-    0xdc,
-    0x5d,
-    0x4a,
-    0xa8,
-    0xd0,
-    0x7f,
-    0x32,
-    0x4b,
-    0x19,
-    0x4e,
-    0xfb,
-    0x80,
-    0xff,
-    0x4c,
-    0x3a,
-    0x62,
-    0xc4,
-    0xfc,
-    0x6e,
-    0x39,
-    0x1f,
-    0x8b,
-    0x20,
-    0x41,
-    0xec,
-    0xb5,
-    0x2f,
-    0xae,
-    0x21,
-    0xe7,
-    0x65,
-    0xec,
-    0x04,
-    0xa1,
-    0x4d,
-    0x2b,
-    0x9b,
-    0x1f,
-    0x49,
-    0x1b,
-    0x64,
-    0x38,
-    0xdf,
-    0xf4,
-    0x47,
-    0x86,
-    0x54,
-    0xba,
-    0xc9,
-    0xc7,
-    0x7c,
-    0xbf,
-    0x82,
-    0x83,
-    0xd0,
-    0x69,
-    0xd1,
-    0xf0,
-    0xc1,
-    0x35,
-    0xce,
-    0x12,
-    0x4c,
-    0xfc,
-    0x80,
-    0x26,
-    0xcf,
-    0x76,
-    0x51,
-    0x41,
-    0x1b,
-    0xfc,
-    0xbe,
-    0x35,
-    0xca,
-    0x92,
-    0x53,
-    0xb4,
-    0xd3,
-    0x24,
-    0xd7,
-    0xb8,
-    0x5b,
-    0x10,
-    0xc4,
-    0x21,
-    0xce,
-    0xe5,
-    0xfa,
-    0xa0,
-    0x2f,
-    0x6a,
-    0xb3,
-    0xd5,
-    0xac,
-    0xe3,
-    0xba,
-    0xb4,
-    0x76,
-    0x8f,
-    0xd8,
-    0x2d,
-    0xcf,
-    0x75,
-    0x8f,
-    0x0c,
-    0x65,
-    0x61,
-    0x0b,
-    0x1e,
-    0xde,
-    0x29,
-    0x56,
-    0x95,
-    0xb4,
-    0x34,
-    0xcb,
-    0xad,
-    0x43,
-    0x3d,
-    0xcd,
-    0x90,
-    0x20,
-    0x55,
-    0xb9,
-    0x77,
-    0xad,
-    0x27,
-    0x18,
-    0x13,
-    0xea,
-    0x80,
-    0x1a,
-    0x2b,
-    0x8e,
-    0x0f,
-    0x40,
-    0x86,
-    0x57,
-    0x69,
-    0x58,
-    0x0b,
-    0x9e,
-    0x4f,
-    0xae,
-    0x27,
-    0x2e,
-    0x34,
-    0x81,
-    0x6f,
-    0x56,
-    0xfa,
-    0xb4,
-    0x87,
-    0x3d,
-    0xfd,
-    0xc6,
-    0x42,
-    0x76,
-    0x52,
-    0x04,
-    0x0a,
-    0xd4,
-    0x51,
-    0xfd,
-    0x83,
-    0x80,
-    0x50,
-    0x37,
-    0x6b,
-    0x48,
-    0xb2,
-    0x20,
-    0xc5,
-    0x3a,
-    0x21,
-    0x47,
-    0x36,
-    0x72,
-    0x17,
-    0xcc,
-    0xaf,
-    0x30,
-    0xa3,
-    0x16,
-    0x4c,
-    0x2e,
-    0x6a,
-    0xc3,
-    0x7c,
-    0x30,
-    0xec,
-    0xe5,
-    0x63,
-    0xdc,
-    0x08,
-    0x6b,
-    0x7c,
-    0xcc,
-    0xc2,
-    0xdd,
-    0x83,
-    0xe2,
-    0x45,
-    0x4d,
-    0x92,
-    0xdb,
-    0x24,
-    0x8a,
-    0x8a,
-    0x27,
-    0xe5,
-    0x96,
-    0xb4,
-    0xf8,
-    0xc0,
-    0x5a,
-    0xa8,
-    0x9a,
-    0xa4,
-    0x99,
-    0x6e,
-    0x02,
-    0x7b,
-    0x23,
-    0xe4,
-    0xa9,
-    0xaf,
-    0x4b,
-    0x5f,
-    0x9b,
-    0xed,
-    0x9a,
-    0x95,
-    0xca,
-    0x29,
-    0xc5,
-    0xbb,
-    0xa9,
-    0xe2,
-    0xdd,
-    0xea,
-    0xf6,
-    0xa7,
-    0xc6,
-    0xc7,
-    0xd7,
-    0xda,
-    0xea,
-    0x63,
-    0x29,
-    0xb4,
-    0x2e,
-    0x60,
-    0x15,
-    0x89,
-    0x26,
-    0x56,
-    0xe4,
-    0x4d,
-    0x84,
-    0x74,
-    0x14,
-    0x58,
-    0xd7,
-    0x6b,
-    0xab,
-    0x66,
-    0x72,
-    0x87,
-    0xcb,
-    0xe2,
-    0xa9,
-    0x1f,
-    0x87,
-    0x64,
-    0x44,
-    0x30,
-    0xf5,
-    0x78,
-    0x2d,
-    0x45,
-    0x84,
-    0xa1,
-    0x6c,
-    0x9a,
-    0x90,
-    0x9d,
-    0x55,
-    0x80,
-    0x34,
-    0xeb,
-    0x00,
-    0x03,
-    0x60,
-    0x8b,
-    0xfa,
-    0xcb,
-    0x2b,
-    0x05,
-    0x3a,
-    0x40,
-    0x6a,
-    0xac,
-    0x57,
-    0xf2,
-    0x81,
-    0x24,
-    0xf8,
-    0x37,
-    0x79,
-    0x22,
-    0x8b,
-    0x16,
-    0x53,
-    0x73,
-    0x3a,
-    0x63,
-    0x9c,
-    0x40,
-    0x1a,
-    0x2c,
-    0x42,
-    0x90,
-    0xa6,
-    0x54,
-    0xa6,
-    0x0e,
-    0x6d,
-    0x7e,
-    0xf2,
-    0x0d,
-    0x07,
-    0x2c,
-    0xad,
-    0xc9,
-    0x4d,
-    0x28,
-    0x8d,
-    0xef,
-    0xca,
-    0x24,
-    0x8c,
-    0x60,
-    0x6c,
-    0x9d,
-    0x3d,
-    0x32,
-    0x7f,
-    0x05,
-    0x61,
-    0xf8,
-    0xdc,
-    0x20,
-    0xb6,
-    0x44,
-    0x5e,
-    0xaf,
-    0x0f,
-    0x6a,
-    0x96,
-    0x4c,
-    0xa9,
-    0x86,
-    0xc0,
-    0x95,
-    0xbd,
-    0xc0,
-    0xf5,
-    0x8c,
-    0x52,
-    0xce,
-    0xa2,
-    0x3e,
-    0x55,
-    0xbb,
-    0x38,
-    0xa3,
-    0xeb,
-    0xe7,
-    0x25,
-    0xc6,
-    0x06,
-    0x50,
-    0x04,
-    0x25,
-    0x37,
-    0x0f,
-    0x10,
-    0x5b,
-    0xc3,
-    0x26,
-    0xdf,
-    0xfc,
-    0xf8,
-    0x78,
-    0x4d,
-    0xc1,
-    0xc1,
-    0x19,
-    0xb6,
-    0xe5,
-    0x79,
-    0xc8,
-    0x68,
-    0xce,
-    0xfd,
-    0xba,
-    0x57,
-    0xf0,
-    0x05,
-    0x9a,
-    0x13,
-    0xef,
-    0xb4,
-    0xcd,
-    0xf8,
-    0x03,
-    0x6d,
-    0xfa,
-    0xa4,
-    0xa1,
-    0xe9,
-    0xca,
-    0xaf,
-    0x58,
-    0x86,
-    0xec,
-    0x96,
-    0xf9,
-    0xe2,
-    0x5d,
-    0xf7,
-    0xfa,
-    0xa9,
-    0xe6,
-    0x04,
-    0x1c,
-    0xab,
-    0xe6,
-    0x32,
-    0x4c,
-    0x32,
-    0x51,
-    0x31,
-    0xc7,
-    0x92,
-    0xf9,
-    0x21,
-    0x82,
-    0x01,
-    0x0c,
-    0x03,
-    0xc9,
-    0xa9,
-    0xde,
-    0x6d,
-    0x26,
-    0xfc,
-    0xe9,
-    0x82,
-    0x84,
-    0x48,
-    0x13,
-    0x22,
-    0x94,
-    0x8b,
-    0x2f,
-    0x5e,
-    0x70,
-    0x88,
-    0xc5,
-    0x2f,
-    0x7f,
-    0x1a,
-    0x16,
-    0x67,
-    0x98,
-    0xc9,
-    0x5b,
-    0xe7,
-    0x6a,
-    0x9b,
-    0x4e,
-    0x13,
-    0x1b,
-    0x2c,
-    0xeb,
-    0x83,
-    0x2f,
-    0x01,
-    0x78,
-    0xfb,
-    0xac,
-    0x1a,
-    0xc3,
-    0x9e,
-    0x7b,
-    0xc6,
-    0xab,
-    0x5e,
-    0x12,
-    0xbc,
-    0xe1,
-    0xb7,
-    0x50,
-    0x66,
-    0xf0,
-    0x9d,
-    0xa8,
-    0x80,
-    0x7b,
-    0xb3,
-    0x82,
-    0xe2,
-    0xc6,
-    0xbd,
-    0xde,
-    0x9a,
-    0x79,
-    0x58,
-    0x3b,
-    0x3e,
-    0xa0,
-    0xe9,
-    0xb7,
-    0x81,
-    0xf5,
-    0xd3,
-    0x77,
-    0x03,
-    0x62,
-    0xed,
-    0x49,
-    0x6e,
-    0xc2,
-    0x33,
-    0x88,
-    0xbe,
-    0xe8,
-    0xbb,
-    0x41,
-    0xe0,
-    0xe2,
-    0xeb,
-    0x93,
-    0x7f,
-    0x7e,
-    0xea,
-    0x5c,
-    0x1b,
-    0x0e,
-    0x54,
-    0x12,
-    0x5b,
-    0x69,
-    0x32,
-    0xee,
-    0xa4,
-    0x32,
-    0x29,
-    0x50,
-    0xea,
-    0x5d,
-    0xf1,
-    0x5f,
-    0xc6,
-    0xee,
-    0x09,
-    0xef,
-    0xc9,
-    0x04,
-    0xa9,
-    0xa9,
-    0x11,
-    0x17,
-    0xf9,
-    0x65,
-    0x19,
-    0x7e,
-    0x80,
-    0xdb,
-    0xd5,
-    0x34,
-    0xdf,
-    0x7b,
-    0xff,
-    0xdb,
-    0xbf,
-    0x99,
-    0xac,
-    0x01,
-    0x08,
-    0xcd,
-    0x22,
-    0xa3,
-    0x53,
-    0x9a,
-    0xed,
-    0xef,
-    0xa3,
-    0x4d,
-    0x30,
-    0x4e,
-    0x4f,
-    0x28,
-    0x3a,
-    0xa2,
-    0x43,
-    0xc0,
-    0x59,
-    0xcc,
-    0x69,
-    0xa4,
-    0xf3,
-    0x72,
-    0x61,
-    0x3f,
-    0xd2,
-    0xff,
-    0x78,
-    0x00,
-    0xc0,
-    0xeb,
-    0xd8,
-    0xb8,
-    0x54,
-    0x3c,
-    0xfc,
-    0x43,
-    0x0b,
-    0x4d,
-    0x67,
-    0x6a,
-    0x9a,
-    0xce,
-    0x96,
-    0x08,
-    0x83,
-    0x0c,
-    0x33,
-    0x6c,
-    0xe7,
-    0x72,
-    0x8b,
-    0xff,
-    0x9b,
-    0x50,
-    0x42,
-    0x26,
-    0x7e,
-    0xdc,
-    0x45,
-    0x6a,
-    0x09,
-    0x77,
-    0x01,
-    0xd7,
-    0x27,
-    0x31,
-    0xd3,
-    0xa1,
-    0x47,
-    0x8e,
-    0xbf,
-    0x0e,
-    0xb0,
-    0x8b,
-    0x64,
-    0x8f,
-    0x15,
-    0xdc,
-    0x2f,
-    0x30,
-    0x6a,
-    0x78,
-    0xd0,
-    0x33,
-    0xf6,
-    0x57,
-    0xea,
-    0xf8,
-    0xa8,
-    0x7a,
-    0x0f,
-    0x21,
-    0xae,
-    0x2d,
-    0xeb,
-    0xf3,
-    0x44,
-    0x89,
-    0xbf,
-    0xfe,
-    0xca,
-    0x3c,
-    0x12,
-    0x00,
-    0x1a,
-    0x8d,
-    0xa3,
-    0x07,
-    0x18,
-    0x9a,
-    0xa1,
-    0xd6,
-    0x8b,
-    0xe4,
-    0x1e,
-    0x8a,
-    0x2b,
-    0x0e,
-    0xc2,
-    0x7d,
-    0xfa,
-    0xe2,
-    0xbc,
-    0x6b,
-    0xd8,
-    0x95,
-    0xfe,
-    0xd3,
-    0x52,
-    0x4c,
-    0xaa,
-    0xa0,
-    0xbc,
-    0xde,
-    0xc7,
-    0x09,
-    0x7f,
-    0xdc,
-    0x39,
-    0xb6,
-    0xb3,
-    0xcf,
-    0xf0,
-    0x24,
-    0xf1,
-    0xc0,
-    0x5f,
-    0x4a,
-    0x62,
-    0xfe,
-    0x30,
-    0x7d,
-    0x1c,
-    0x1b,
-    0x36,
-    0x91,
-    0xaf,
-    0x38,
-    0xa3,
-    0x41,
-    0xfa,
-    0x82,
-    0x7b,
-    0xd0,
-    0x44,
-    0xfd,
-    0x48,
-    0xf1,
-    0x88,
-    0x81,
-    0x10,
-    0xe5,
-    0x0f,
-    0x02,
-    0x84,
-    0xe3,
-    0x44,
-    0x14,
-    0x7a,
-    0xbc,
-    0xc5,
-    0xad,
-    0x9d,
-    0xbf,
-    0xb6,
-    0x2d,
-    0x63,
-    0xda,
-    0x5a,
-    0x9d,
-    0x40,
-    0x03,
-    0xe4,
-    0x34,
-    0x1a,
-    0xd6,
-    0x8a,
-    0x20,
-    0xfc,
-    0x80,
-    0xdc,
-    0x83,
-    0x0e,
-    0xdb,
-    0x54,
-    0xbb,
-    0xc5,
-    0xda,
-    0x2e,
-    0xe6,
-    0x57,
-    0x28,
-    0x79,
-    0xa5,
-    0x72,
-    0x0c,
-    0x6f,
-    0x21,
-    0x2d,
-    0x90,
-    0x02,
-    0x4c,
-    0x3f,
-    0xe2,
-    0xb7,
-    0x6a,
-    0x6e,
-    0xfa,
-    0xb7,
-    0xcf,
-    0x4b,
-    0x7d,
-    0x24,
-    0xea,
-    0x1d,
-    0xe2,
-    0xa9,
-    0x82,
-    0x1b,
-    0xd3,
-    0x55,
-    0x40,
-    0xde,
-    0xd6,
-    0xa9,
-    0x6e,
-    0x15,
-    0x2c,
-    0xef,
-    0xfe,
-    0x7b,
-    0xf9,
-    0xce,
-    0xce,
-    0x06,
-    0xa6,
-    0x1c,
-    0x2a,
-    0x61,
-    0x84,
-    0xf3,
-    0x93,
-    0x9d,
-    0xb2,
-    0x07,
-    0xbe,
-    0x24,
-    0x40,
-    0x36,
-    0xe0,
-    0xee,
-    0x94,
-    0x61,
-    0x29,
-    0xf7,
-    0x0d,
-    0x7b,
-    0x8e,
-    0xf0,
-    0xe7,
-    0xdf,
-    0xcc,
-    0x34,
-    0x5f,
-    0xe7,
-    0xaa,
-    0xff,
-    0x17,
-    0xba,
-    0x7e,
-    0xda,
-    0xbb,
-    0x65,
-    0xf2,
-    0x5a,
-    0xe5,
-    0x2e,
-    0x08,
-    0x0a,
-    0x3e,
-    0x24,
-    0x5c,
-    0xa6,
-    0xe7,
-    0xfb,
-    0xaa,
-    0x8a,
-    0x17,
-    0x17,
-    0x8f,
-    0x69,
-    0x05,
-    0xe7,
-    0x94,
-    0x42,
-    0x08,
-    0x74,
-    0x68,
-    0x90,
-    0xfc,
-    0x3a,
-    0x6d,
-    0xc2,
-    0xe9,
-    0x36,
-    0x76,
-    0xea,
-    0xdf,
-    0x40,
-    0xd0,
-    0xb9,
-    0x24,
-    0x9b,
-    0x7f,
-    0xab,
-    0x92,
-    0xcb,
-    0xc9,
-    0x7f,
-    0x3a,
-    0xa6,
-    0xf9,
-    0xea,
-    0x4d,
-    0xae,
-    0x5d,
-    0x8c,
-    0x3d,
-    0x9e,
-    0x91,
-    0x23,
-    0x1f,
-    0x43,
-    0xff,
-    0xff,
-    0x54,
-    0x8d,
-    0xa7,
-    0xb6,
-    0x68,
-    0xe6,
-    0x1c,
-    0x18,
-    0x3a,
-    0xc2,
-    0xcf,
-    0x65,
-    0x5d,
-    0x78,
-    0x90,
-    0xbe,
-    0xbf,
-    0x50,
-    0x52,
-    0xda,
-    0x88,
-    0xdd,
-    0x2f,
-    0xfa,
-    0x45,
-    0x8d,
-    0xac,
-    0x1f,
-    0x46,
-    0x7e,
-    0x3d,
-    0x7a,
-    0x44,
-    0x93,
-    0x0c,
-    0x24,
-    0x48,
-    0xc8,
-    0xf6,
-    0x0f,
-    0xc7,
-    0xc2,
-    0xd6,
-    0x3d,
-    0x12,
-    0xab,
-    0x07,
-    0x2f,
-    0xee,
-    0x3c,
-    0x24,
-    0xa1,
-    0x7e,
-    0x1b,
-    0x12,
-    0x74,
-    0x6a,
-    0x68,
-    0x41,
-    0xec,
-    0x3a,
-    0x92,
-    0x2e,
-    0x1b,
-    0x03,
-    0x70,
-    0x2d,
-    0x9d,
-    0x46,
-    0x8d,
-    0x65,
-    0x86,
-    0x15,
-    0xc3,
-    0x1c,
-    0x99,
-    0x77,
-    0x0b,
-    0x35,
-    0xbb,
-    0x0e,
-    0x93,
-    0xf6,
-    0xa7,
-    0xf7,
-    0x11,
-    0x0f,
-    0xe2,
-    0xf2,
-    0x58,
-    0xd8,
-    0xf2,
-    0xc3,
-    0x28,
-    0xdb,
-    0xcb,
-    0xd8,
-    0x4b,
-    0x92,
-    0x8a,
-    0x2b,
-    0xdd,
-    0x72,
-    0x65,
-    0x6a,
-    0xec,
-    0x28,
-    0xe2,
-    0x56,
-    0x41,
-    0x22,
-    0x48,
-    0x69,
-    0x7c,
-    0x51,
-    0x53,
-    0xbb,
-    0x67,
-    0x2d,
-    0x2c,
-    0x26,
-    0x84,
-    0xfa,
-    0x98,
-    0xa8,
-    0xe8,
-    0x4a,
-    0x70,
-    0x0a,
-    0x4c,
-    0xc4,
-    0x51,
-    0xbf,
-    0x62,
-    0x23,
-    0x94,
-    0x0f,
-    0x65,
-    0x82,
-    0x81,
-    0x75,
-    0xf4,
-    0xd6,
-    0xbf,
-    0x45,
-    0x20,
-    0xbc,
-    0x0f,
-    0x91,
-    0xc4,
-    0x75,
-    0x3b,
-    0x4e,
-    0x15,
-    0x2e,
-    0x48,
-    0xb3,
-    0x79,
-    0x85,
-    0xf3,
-    0xe2,
-    0x9d,
-    0x4a,
-    0x5c,
-    0xca,
-    0xc1,
-    0x82,
-    0xfc,
-    0x4c,
-    0x57,
-    0xb2,
-    0xdc,
-    0x9c,
-    0xcd,
-    0x5a,
-    0x09,
-    0xeb,
-    0xa7,
-    0xbf,
-    0x43,
-    0x43,
-    0xd0,
-    0xed,
-    0xf5,
-    0xb2,
-    0x32,
-    0xfd,
-    0x6a,
-    0xaa,
-    0x84,
-    0x94,
-    0x3d,
-    0xa8,
-    0x63,
-    0xac,
-    0x11,
-    0x14,
-    0xa5,
-    0x97,
-    0x83,
-    0x68,
-    0xea,
-    0x40,
-    0x5d,
-    0x95,
-    0x73,
-    0xb5,
-    0x0c,
-    0xa3,
-    0x38,
-    0xe2,
-    0x55,
-    0x97,
-    0x34,
-    0x9f,
-    0x43,
-    0x99,
-    0x04,
-    0xee,
-    0x64,
-    0x56,
-    0xb0,
-    0x7d,
-    0x35,
-    0xa4,
-    0xc9,
-    0x73,
-    0xda,
-    0x64,
-    0xb4,
-    0x69,
-    0x12,
-    0xad,
-    0x45,
-    0xb5,
-    0x6b,
-    0x27,
-    0x90,
-    0xef,
-    0xb2,
-    0xb4,
-    0xfb,
-    0xae,
-    0xae,
-    0x56,
-    0x98,
-    0x93,
-    0x0e,
-    0x4d,
-    0xb2,
-    0x89,
-    0x9f,
-    0x7f,
-    0xa6,
-    0x4a,
-    0xc2,
-    0x1d,
-    0xf4,
-    0x26,
-    0x1e,
-    0x84,
-    0x96,
-    0x00,
-    0x92,
-    0x61,
-    0x91,
-    0x99,
-    0x6d,
-    0x19,
-    0xc9,
-    0x11,
-    0xe2,
-    0x68,
-    0x19,
-    0xaa,
-    0xb6,
-    0x48,
-    0xa3,
-    0xd0,
-    0x3c,
-    0x14,
-    0x65,
-    0x56,
-    0x83,
-    0xed,
-    0x0e,
-    0x03,
-    0xce,
-    0x5d,
-    0x0f,
-    0x4d,
-    0x44,
-    0x3a,
-    0xf4,
-    0x64,
-    0xe9,
-    0xcd,
-    0xf5,
-    0x72,
-    0xcd,
-    0x34,
-    0xc8,
-    0x21,
-    0x84,
-    0x05,
-    0xba,
-    0x5f,
-    0xd5,
-    0x34,
-    0xfe,
-    0x5e,
-    0xb6,
-    0x37,
-    0x45,
-    0xde,
-    0x79,
-    0x67,
-    0x8f,
-    0xae,
-    0x40,
-    0xaa,
-    0x40,
-    0x70,
-    0xb6,
-    0x4f,
-    0x76,
-    0x9e,
-    0x01,
-    0x39,
-    0x9a,
-    0xca,
-    0xf2,
-    0x40,
-    0x35,
-    0x2a,
-    0x7f,
-    0xd4,
-    0x05,
-    0x53,
-    0x74,
-    0xe3,
-    0x51,
-    0x45,
-    0x65,
-    0xfd,
-    0x79,
-    0xa8,
-    0xe7,
-    0xb7,
-    0xd1,
-    0x55,
-    0x00,
-    0x4d,
-    0xaf,
-    0x18,
-    0xdb,
-    0x8b,
-    0xc3,
-    0xb4,
-    0xc0,
-    0xed,
-    0xa7,
-    0x28,
-    0x44,
-    0x05,
-    0xb7,
-    0x31,
-    0xbd,
-    0x1d,
-    0x23,
-    0x10,
-    0xf9,
-    0x1e,
-    0x43,
-    0x8d,
-    0x30,
-    0xb0,
-    0x2a,
-    0x3c,
-    0x36,
-    0xa3,
-    0x7d,
-    0xff,
-    0xf5,
-    0x8e,
-    0x86,
-    0xcc,
-    0x1b,
-    0xb5,
-    0x84,
-    0xb1,
-    0x10,
-    0x30,
-    0x45,
-    0x15,
-    0x2b,
-    0x4a,
-    0xf7,
-    0x40,
-    0x25,
-    0x28,
-    0x3c,
-    0x1e,
-    0xce,
-    0xab,
-    0x7c,
-    0x3f,
-    0xfe,
-    0x96,
-    0x7f,
-    0x23,
-    0xcf,
-    0xf4,
-    0x3b,
-    0xb5,
-    0x09,
-    0xb4,
-    0xea,
-    0x15,
-    0xde,
-    0x97,
-    0x60,
-    0x9a,
-    0xd8,
-    0x4c,
-    0x9c,
-    0x18,
-    0x0f,
-    0xd9,
-    0x9d,
-    0x5e,
-    0x9f,
-    0x3c,
-    0x77,
-    0x03,
-    0x59,
-    0x52,
-    0xa5,
-    0x63,
-    0xb9,
-    0xf9,
-    0xa1,
-    0xe4,
-    0x18,
-    0x71,
-    0xb2,
-    0x7e,
-    0x23,
-    0x09,
-    0x05,
-    0x7a,
-    0x8c,
-    0xf7,
-    0x00,
-    0x79,
-    0x00,
-    0x87,
-    0xd3,
-    0xb9,
-    0x58,
-    0x78,
-    0x50,
-    0x94,
-    0x13,
-    0xa2,
-    0xfc,
-    0x49,
-    0x04,
-    0xdd,
-    0x66,
-    0xff,
-    0x48,
-    0x1f,
-    0xb7,
-    0x07,
-    0x7b,
-    0xe4,
-    0x8b,
-    0x62,
-    0x2b,
-    0xd3,
-    0xff,
-    0x83,
-    0x8d,
-    0x9e,
-    0x0b,
-    0x55,
-    0x6f,
-    0x2a,
-    0x13,
-    0x80,
-    0x6e,
-    0xf0,
-    0xb8,
-    0xe9,
-    0x69,
-    0xa3,
-    0xf4,
-    0x77,
-    0x36,
-    0x12,
-    0x66,
-    0x1d,
-    0x93,
-    0x51,
-    0xea,
-    0x15,
-    0x5f,
-    0x13,
-    0x6d,
-    0x69,
-    0x0a,
-    0x5b,
-    0x00,
-    0xb8,
-    0x4a,
-    0x54,
-    0x2a,
-    0x37,
-    0x0f,
-    0x7c,
-    0x83,
-    0xf6,
-    0xba,
-    0x08,
-    0x7e,
-    0x65,
-    0x89,
-    0x85,
-    0x87,
-    0x16,
-    0x56,
-    0xbb,
-    0x4e,
-    0xc4,
-    0x82,
-    0xd6,
-    0x62,
-    0x95,
-    0x2c,
-    0xc8,
-    0x01,
-    0x9c,
-    0xa6,
-    0xe9,
-    0x2f,
-    0xa2,
-    0x29,
-    0xe0,
-    0x05,
-    0x26,
-    0xc7,
-    0xc7,
-    0x4c,
-    0xa2,
-    0xa2,
-    0x8a,
-    0x4a,
-    0x10,
-    0x5c,
-    0x90,
-    0xdc,
-    0xad,
-    0xce,
-    0x9e,
-    0xc5,
-    0xfd,
-    0xfd,
-    0xf8,
-    0x46,
-    0x0f,
-    0x49,
-    0xc9,
-    0xef,
-    0x02,
-    0xe8,
-    0xc4,
-    0xb4,
-    0xc8,
-    0x93,
-    0x0c,
-    0x43,
-    0x2a,
-    0x7f,
-    0x51,
-    0x95,
-    0x0c,
-    0x8f,
-    0x3c,
-    0xc3,
-    0xf3,
-    0xc8,
-    0x0e,
-    0x1c,
-    0xc4,
-    0x05,
-    0x84,
-    0x74,
-    0xcf,
-    0xec,
-    0xfd,
-    0xbe,
-    0x0b,
-    0x20,
-    0xde,
-    0xde,
-    0xa3,
-    0xb8,
-    0x36,
-    0xb8,
-    0xb2,
-    0xf1,
-    0x9e,
-    0x8d,
-    0x4b,
-    0x1f,
-    0x64,
-    0x87,
-    0xbd,
-    0xea,
-    0xe8,
-    0x92,
-    0x15,
-    0xb6,
-    0x45,
-    0x6e,
-    0xe4,
-    0x63,
-    0x34,
-    0x02,
-    0x42,
-    0x37,
-    0x2e,
-    0xf4,
-    0x12,
-    0x18,
-    0xd1,
-    0x76,
-    0x88,
-    0xff,
-    0x85,
-    0x63,
-    0xe9,
-    0xa9,
-    0x5f,
-    0x8a,
-    0x92,
-    0x90,
-    0x46,
-    0x4a,
-    0x3c,
-    0x19,
-    0x54,
-    0x5f,
-    0x7e,
-    0x0f,
-    0x7e,
-    0xfb,
-    0x93,
-    0x50,
-    0x78,
-    0x18,
-    0x5e,
-    0xc6,
-    0xd3,
-    0x0d,
-    0xab,
-    0x99,
-    0x69,
-    0x60,
-    0xb8,
-    0xa3,
-    0xfa,
-    0xdc,
-    0xf4,
-    0x25,
-    0x17,
-    0xe3,
-    0x06,
-    0xb8,
-    0x3f,
-    0x05,
-    0x11,
-    0x86,
-    0x49,
-    0xd1,
-    0x37,
-    0xb9,
-    0x01,
-    0xea,
-    0x5c,
-    0x34,
-    0x16,
-    0x5e,
-    0x2c,
-    0x81,
-    0x34,
-    0x34,
-    0x5f,
-    0x0b,
-    0x6d,
-    0x44,
-    0x3b,
-    0x8e,
-    0xdd,
-    0x4c,
-    0x5b,
-    0xcb,
-    0x8e,
-    0x3f,
-    0xb0,
-    0x80,
-    0x99,
-    0xe0,
-    0xc5,
-    0x97,
-    0x8e,
-    0x90,
-    0x47,
-    0x9e,
-    0x16,
-    0x64,
-    0xc4,
-    0x77,
-    0xd7,
-    0x7b,
-    0xb3,
-    0x51,
-    0x98,
-    0x8f,
-    0xb5,
-    0xd7,
-    0xa6,
-    0xc9,
-    0x1a,
-    0xa6,
-    0x76,
-    0xda,
-    0xa7,
-    0x05,
-    0x8b,
-    0x47,
-    0x96,
-    0xd0,
-    0x9a,
-    0x04,
-    0xdf,
-    0xb6,
-    0xed,
-    0x45,
-    0xb6,
-    0xa5,
-    0x05,
-    0x91,
-    0x55,
-    0x81,
-    0x83,
-    0x18,
-    0xfb,
-    0x1c,
-    0x49,
-    0x46,
-    0x35,
-    0x63,
-    0xdc,
-    0x98,
-    0x5c,
-    0xd5,
-    0x0c,
-    0xaf,
-    0x5f,
-    0x3a,
-    0xd8,
-    0xa3,
-    0xc2,
-    0x91,
-    0x8c,
-    0x99,
-    0xe7,
-    0x4a,
-    0x2c,
-    0x98,
-    0x8d,
-    0xb5,
-    0x15,
-    0x98,
-    0x96,
-    0xbb,
-    0xe2,
-    0xdc,
-    0x0d,
-    0xcc,
-    0x8d,
-    0x82,
-    0x67,
-    0x18,
-    0xd6,
-    0x59,
-    0x09,
-    0x02,
-    0xe9,
-    0xf2,
-    0x0b,
-    0xd1,
-    0x3b,
-    0xfa,
-    0x3c,
-    0xa9,
-    0xb5,
-    0xc6,
-    0x66,
-    0xbb,
-    0x14,
-    0x30,
-    0xd3,
-    0xb8,
-    0x90,
-    0xa2,
-    0x0f,
-    0x8b,
-    0xbb,
-    0x70,
-    0xf0,
-    0x47,
-    0xad,
-    0x6b,
-    0xd4,
-    0x5e,
-    0x5e,
-    0xb3,
-    0x2a,
-    0x15,
-    0x53,
-    0xcc,
-    0x34,
-    0x34,
-    0x7d,
-    0xf4,
-    0x0a,
-    0x02,
-    0x5e,
-    0xb4,
-    0xe3,
-    0x70,
-    0x6d,
-    0xb6,
-    0x90,
-    0x95,
-    0xbc,
-    0xd6,
-    0x49,
-    0x5a,
-    0xd8,
-    0x7b,
-    0xac,
-    0x77,
-    0xf0,
-    0x28,
-    0x03,
-    0x9e,
-    0x3a,
-    0x4e,
-    0xc6,
-    0xf5,
-    0x93,
-    0x65,
-    0x61,
-    0xca,
-    0x66,
-    0x3a,
-    0x36,
-    0x83,
-    0xce,
-    0x8b,
-    0xe6,
-    0xd3,
-    0xff,
-    0xd1,
-    0xcc,
-    0x34,
-    0xe2,
-    0x5d,
-    0xcb,
-    0x91,
-    0xff,
-    0xa6,
-    0x4a,
-    0x42,
-    0xa0,
-    0xe2,
-    0x7c,
-    0x3e,
-    0x33,
-    0xd3,
-    0xe5,
-    0x8c,
-    0xf1,
-    0xe4,
-    0x1a,
-    0xfb,
-    0xbd,
-    0x74,
-    0xc8,
-    0x13,
-    0x4f,
-    0x72,
-    0xf7,
-    0x4b,
-    0x91,
-    0x2a,
-    0x90,
-    0x7d,
-    0x49,
-    0x5e,
-    0x1d,
-    0x96,
-    0xf9,
-    0x99,
-    0xd1,
-    0x92,
-    0x03,
-    0xc0,
-    0xc8,
-    0xa8,
-    0x11,
-    0xea,
-    0x8f,
-    0xc1,
-    0xb4,
-    0x71,
-    0xe7,
-    0x2f,
-    0x4c,
-    0x4a,
-    0xc6,
-    0x9c,
-    0x27,
-    0x91,
-    0x9f,
-    0x40,
-    0xed,
-    0x68,
-    0xe3,
-    0x58,
-    0x3b,
-    0x02,
-    0xc8,
-    0xd3,
-    0x8e,
-    0xfb,
-    0x49,
-    0x4e,
-    0x63,
-    0xeb,
-    0x6e,
-    0x42,
-    0x9c,
-    0x3a,
-    0xcd,
-    0x7c,
-    0x26,
-    0x36,
-    0x51,
-    0xce,
-    0xd9,
-    0x62,
-    0x3a,
-    0x05,
-    0x9f,
-    0x11,
-    0x65,
-    0x1a,
-    0xd9,
-    0x34,
-    0xce,
-    0xad,
-    0xfe,
-    0x71,
-    0x53,
-    0xae,
-    0x85,
-    0x75,
-    0xbb,
-    0x5e,
-    0x06,
-    0x8a,
-    0xf6,
-    0x76,
-    0x9c,
-    0x6c,
-    0xa6,
-    0xa5,
-    0x8d,
-    0x58,
-    0xdf,
-    0x40,
-    0x2d,
-    0x67,
-    0x2b,
-    0x36,
-    0xff,
-    0x1a,
-    0xd2,
-    0x42,
-    0x1e,
-    0x36,
-    0x58,
-    0x64,
-    0xdb,
-    0xd2,
-    0x46,
-    0x91,
-    0xa8,
-    0xae,
-    0x2e,
-    0xaa,
-    0x35,
-    0xc6,
-    0xe9,
-    0xab,
-    0xd8,
-    0x27,
-    0x23,
-    0x25,
-    0x32,
-    0x02,
-    0x1a,
-    0xee,
-    0x10,
-    0xff,
-    0xa2,
-    0x16,
-    0x8f,
-    0xd3,
-    0x6d,
-    0x1e,
-    0x84,
-    0x15,
-    0x89,
-    0x65,
-    0x1a,
-    0x4d,
-    0x2a,
-    0xe3,
-    0xbd,
-    0x4f,
-    0xaa,
-    0x19,
-    0x37,
-    0xc7,
-    0xce,
-    0x48,
-    0x19,
-    0x14,
-    0x4b,
-    0xe2,
-    0x5d,
-    0x5a,
-    0x88,
-    0x3e,
-    0x49,
-    0xd2,
-    0xa6,
-    0x8f,
-    0x97,
-    0x65,
-    0xbe,
-    0x17,
-    0xd2,
-    0x7a,
-    0x69,
-    0x98,
-    0x03,
-    0x0c,
-    0x86,
-    0x0c,
-    0x8d,
-    0xff,
-    0x37,
-    0x95,
-    0x56,
-    0xb4,
-    0x2d,
-    0xb7,
-    0x27,
-    0xdb,
-    0x26,
-    0xc5,
-    0x56,
-    0x88,
-    0xb3,
-    0x99,
-    0xa2,
-    0x89,
-    0x3f,
-    0x88,
-    0x5e,
-    0xf8,
-    0x4d,
-    0x96,
-    0xd2,
-    0x0c,
-    0x01,
-    0xe5,
-    0xde,
-    0x34,
-    0xe2,
-    0x74,
-    0xe0,
-    0x67,
-    0xde,
-    0x06,
-    0xd8,
-    0xb5,
-    0x8f,
-    0x5f,
-    0xca,
-    0x23,
-    0xbc,
-    0xb6,
-    0x64,
-    0xb5,
-    0x23,
-    0x68,
-    0xe1,
-    0xcc,
-    0x75,
-    0xea,
-    0x2d,
-    0xb2,
-    0xa3,
-    0x01,
-    0x4a,
-    0x74,
-    0x58,
-    0x35,
-    0xf2,
-    0xf0,
-    0xc6,
-    0x83,
-    0x7e,
-    0x2e,
-    0xa6,
-    0x52,
-    0x06,
-    0xf4,
-    0x7a,
-    0xa8,
-    0xca,
-    0x94,
-    0x16,
-    0x9e,
-    0xd0,
-    0x09,
-    0x5e,
-    0x11,
-    0xcf,
-    0x42,
-    0x51,
-    0x9b,
-    0x4c,
-    0xbe,
-    0x47,
-    0xc1,
-    0x03,
-    0x59,
-    0x76,
-    0x6e,
-    0x88,
-    0x66,
-    0xbb,
-    0xa1,
-    0x2e,
-    0xfd,
-    0x98,
-    0x62,
-    0x28,
-    0x96,
-    0x79,
-    0xfa,
-    0xee,
-    0xd7,
-    0x3b,
-    0x63,
-    0xe3,
-    0xab,
-    0xee,
-    0xfe,
-    0x34,
-    0x94,
-    0xda,
-    0x84,
-    0x03,
-    0x42,
-    0xc1,
-    0x3f,
-    0xc5,
-    0x64,
-    0x64,
-    0x7a,
-    0xe8,
-    0xbe,
-    0x48,
-    0x36,
-    0xb9,
-    0x7c,
-    0xba,
-    0x1e,
-    0x86,
-    0xc6,
-    0x11,
-    0xbd,
-    0xff,
-    0x94,
-    0x33,
-    0xef,
-    0xe2,
-    0xc4,
-    0x5b,
-    0x95,
-    0xd8,
-    0x6a,
-    0x19,
-    0x8d,
-    0x9a,
-    0x67,
-    0x9a,
-    0xe2,
-    0x57,
-    0x3d,
-    0x29,
-    0x3f,
-    0x5a,
-    0x21,
-    0xf6,
-    0xaa,
-    0xe8,
-    0x52,
-    0x16,
-    0x6e,
-    0x67,
-    0xaa,
-    0xcc,
-    0x59,
-    0xc6,
-    0x72,
-    0x07,
-    0x28,
-    0x18,
-    0x7b,
-    0x2b,
-    0x40,
-    0x82,
-    0x6a,
-    0x14,
-    0x9f,
-    0x58,
-    0x54,
-    0x59,
-    0x11,
-    0x83,
-    0x8b,
-    0xcd,
-    0xa7,
-    0x26,
-    0xb7,
-    0x4c,
-    0x65,
-    0x81,
-    0x28,
-    0xb4,
-    0x3b,
-    0x15,
-    0x6a,
-    0x31,
-    0x37,
-    0x08,
-    0x1a,
-    0xbe,
-    0xf8,
-    0xcc,
-    0xf9,
-    0xe8,
-    0x66,
-    0xfc,
-    0x3f,
-    0xd5,
-    0xa0,
-    0x86,
-    0x32,
-    0x86,
-    0x36,
-    0x0f,
-    0xf6,
-    0x59,
-    0x99,
-    0x93,
-    0xa7,
-    0xd2,
-    0xcf,
-    0x4c,
-    0xa5,
-    0x9a,
-    0x6b,
-    0xd6,
-    0x2f,
-    0xc8,
-    0xbd,
-    0x90,
-    0x34,
-    0x60,
-    0x46,
-    0x45,
-    0x65,
-    0x19,
-    0x6e,
-    0x0c,
-    0x8f,
-    0x64,
-    0x7a,
-    0x6c,
-    0x28,
-    0xa9,
-    0xb8,
-    0xc4,
-    0x28,
-    0xd4,
-    0xfc,
-    0xea,
-    0x1a,
-    0x10,
-    0x50,
-    0x13,
-    0x72,
-    0xd2,
-    0xe8,
-    0xf3,
-    0x21,
-    0x1a,
-    0x54,
-    0x25,
-    0x67,
-    0xf6,
-    0xf9,
-    0xcc,
-    0xe8,
-    0x47,
-    0xc2,
-    0x7b,
-    0x03,
-    0xc7,
-    0x13,
-    0x52,
-    0x5f,
-    0x4b,
-    0xff,
-    0x6a,
-    0xc6,
-    0x46,
-    0xba,
-    0x74,
-    0x37,
-    0x8f,
-    0x51,
-    0x9c,
-    0x36,
-    0x64,
-    0x98,
-    0xb4,
-    0x67,
-    0xae,
-    0x64,
-    0x8e,
-    0x5b,
-    0x86,
-    0xfb,
-    0xa9,
-    0xaa,
-    0xf9,
-    0xc9,
-    0x10,
-    0x42,
-    0x08,
-    0x55,
-    0x80,
-    0xfe,
-    0xf3,
-    0x73,
-    0xc9,
-    0x7b,
-    0xb8,
-    0xba,
-    0x76,
-    0x27,
-    0xd6,
-    0x38,
-    0xb0,
-    0x9a,
-    0x56,
-    0x65,
-    0x60,
-    0x2a,
-    0x0c,
-    0x56,
-    0x94,
-    0xb9,
-    0x1b,
-    0x33,
-    0x24,
-    0xd2,
-    0xb7,
-    0xeb,
-    0x95,
-    0xf5,
-    0x2f,
-    0x26,
-    0x3d,
-    0x2e,
-    0x2a,
-    0x7c,
-    0xa8,
-    0xec,
-    0x30,
-    0xe4,
-    0x3b,
-    0x11,
-    0x6d,
-    0x6f,
-    0x17,
-    0x46,
-    0xb2,
-    0x36,
-    0x41,
-    0x91,
-    0xbd,
-    0x90,
-    0xff,
-    0x29,
-    0xba,
-    0x89,
-    0x85,
-    0x89,
-    0x0a,
-    0x90,
-    0xd0,
-    0xc3,
-    0x42,
-    0x70,
-    0xd3,
-    0x17,
-    0x77,
-    0x82,
-    0xd1,
-    0xc4,
-    0xb9,
-    0x20,
-    0x0a,
-    0x1e,
-    0xdd,
-    0x5c,
-    0x99,
-    0xe1,
-    0x80,
-    0xf2,
-    0x9d,
-    0xc5,
-    0x48,
-    0x7c,
-    0x97,
-    0x52,
-    0x6d,
-    0xe5,
-    0x13,
-    0xf6,
-    0x78,
-    0x20,
-    0x8b,
-    0x55,
-    0x4b,
-    0x1a,
-    0x88,
-    0xe0,
-    0x62,
-    0xed,
-    0x0a,
-    0xa9,
-    0x58,
-    0x56,
-    0x2a,
-    0x75,
-    0xad,
-    0x69,
-    0xfe,
-    0x13,
-    0xc6,
-    0x83,
-    0xbd,
-    0xed,
-    0x35,
-    0x81,
-    0x23,
-    0xdd,
-    0x3b,
-    0x2f,
-    0x17,
-    0x42,
-    0x8b,
-    0x03,
-    0x8c,
-    0x52,
-    0x51,
-    0x0c,
-    0xa5,
-    0xb2,
-    0x73,
-    0x25,
-    0x1c,
-    0x44,
-    0x17,
-    0x6e,
-    0xe4,
-    0x40,
-    0x65,
-    0xfd,
-    0x0d,
-    0x86,
-    0x8e,
-    0xd0,
-    0xe9,
-    0x32,
-    0x0d,
-    0x06,
-    0x6d,
-    0x71,
-    0x2d,
-    0x4f,
-    0xd9,
-    0x94,
-    0xcb,
-    0xa2,
-    0x9c,
-    0x63,
-    0x5d,
-    0x2e,
-    0x71,
-    0xb4,
-    0x33,
-    0x92,
-    0xcf,
-    0x3c,
-    0xfd,
-    0x50,
-    0x80,
-    0xa4,
-    0x8e,
-    0x7f,
-    0x8f,
-    0xdf,
-    0xdf,
-    0xc1,
-    0x68,
-    0xbc,
-    0x57,
-    0x75,
-    0x3b,
-    0xb7,
-    0x49,
-    0x2e,
-    0xa1,
-    0x15,
-    0xbf,
-    0x63,
-    0x82,
-    0x30,
-    0x76,
-    0x68,
-    0x36,
-    0x0f,
-    0x29,
-    0x9c,
-    0xea,
-    0x39,
-    0x12,
-    0xe5,
-    0x46,
-    0xcb,
-    0xaf,
-    0x59,
-    0x4d,
-    0xc9,
-    0xc2,
-    0x3e,
-    0x84,
-    0xb2,
-    0x9b,
-    0x35,
-    0x56,
-    0x57,
-    0x99,
-    0xb2,
-    0xb7,
-    0xec,
-    0xef,
-    0xaf,
-    0x08,
-    0x60,
-    0xa4,
-    0xa2,
-    0x3a,
-    0xea,
-    0xde,
-    0xac,
-    0x37,
-    0xe5,
-    0x5f,
-    0x13,
-    0x7d,
-    0xdd,
-    0x50,
-    0xf2,
-    0x0c,
-    0xea,
-    0x3d,
-    0x2f,
-    0x83,
-    0x3c,
-    0x62,
-    0xae,
-    0x86,
-    0xf8,
-    0x25,
-    0xc4,
-    0x62,
-    0x43,
-    0xe3,
-    0xef,
-    0xf4,
-    0x9b,
-    0xef,
-    0xc4,
-    0xc7,
-    0x6e,
-    0xd8,
-    0x28,
-    0x7c,
-    0xe5,
-    0xeb,
-    0xc3,
-    0x6f,
-    0x01,
-    0xf9,
-    0xb2,
-    0x97,
-    0xea,
-    0x5b,
-    0x7c,
-    0xae,
-    0x84,
-    0x32,
-    0x48,
-    0x92,
-    0x42,
-    0xf3,
-    0x4d,
-    0xec,
-    0x3f,
-    0x24,
-    0x89,
-    0x0f,
-    0x8b,
-    0x60,
-    0xb6,
-    0x23,
-    0xc2,
-    0xa1,
-    0x7a,
-    0x82,
-    0xe4,
-    0xbf,
-    0xde,
-    0x62,
-    0x60,
-    0x33,
-    0x01,
-    0xb5,
-    0x72,
-    0x21,
-    0x0e,
-    0x4d,
-    0xaf,
-    0x96,
-    0x6b,
-    0x44,
-    0xdf,
-    0x0e,
-    0x33,
-    0x9b,
-    0x0a,
-    0x39,
-    0xe7,
-    0x21,
-    0xd6,
-    0xfe,
-    0x60,
-    0x96,
-    0x10,
-    0xc1,
-    0x08,
-    0x11,
-    0x88,
-    0xe1,
-    0x4a,
-    0x9f,
-    0x22,
-    0x85,
-    0x47,
-    0x2d,
-    0x2a,
-    0x99,
-    0xcb,
-    0xa8,
-    0xe8,
-    0x13,
-    0x7f,
-    0x62,
-    0x74,
-    0x7b,
-    0x60,
-    0xb8,
-    0xcc,
-    0xaa,
-    0x6f,
-    0xf2,
-    0x24,
-    0xd2,
-    0xaa,
-    0x6a,
-    0x7d,
-    0xbe,
-    0x3c,
-    0xf1,
-    0x79,
-    0x5b,
-    0xf1,
-    0x6e,
-    0x6e,
-    0x78,
-    0xec,
-    0xc8,
-    0xb9,
-    0xca,
-    0x9c,
-    0x06,
-    0x55,
-    0x33,
-    0xec,
-    0xb5,
-    0xac,
-    0x43,
-    0xba,
-    0x8a,
-    0xac,
-    0x00,
-    0x8b,
-    0x49,
-    0x1e,
-    0xe2,
-    0x7d,
-    0xe5,
-    0x33,
-    0x22,
-    0x7d,
-    0xe9,
-    0x60,
-    0x35,
-    0xb9,
-    0x16,
-    0x6c,
-    0x93,
-    0x58,
-    0x4e,
-    0xc8,
-    0xbc,
-    0x69,
-    0xb1,
-    0x1e,
-    0x7d,
-    0x1a,
-    0x05,
-    0x2c,
-    0x6f,
-    0x2b,
-    0x5b,
-    0xd3,
-    0xc2,
-    0xa2,
-    0xef,
-    0x6b,
-    0x38,
-    0xbf,
-    0x51,
-    0x5a,
-    0x74,
-    0x32,
-    0xc2,
-    0xe5,
-    0x75,
-    0x8c,
-    0xe1,
-    0x46,
-    0x5e,
-    0xf4,
-    0x87,
-    0xfe,
-    0x78,
-    0x1b,
-    0xef,
-    0x6c,
-    0x79,
-    0x72,
-    0x1a,
-    0x9f,
-    0x07,
-    0x9a,
-    0x71,
-    0x69,
-    0x78,
-    0x1b,
-    0xad,
-    0xb4,
-    0xdc,
-    0x5a,
-    0xf4,
-    0x19,
-    0x3d,
-    0xc5,
-    0x44,
-    0xaf,
-    0x25,
-    0x51,
-    0x15,
-    0x21,
-    0x61,
-    0x26,
-    0x3a,
-    0x04,
-    0x05,
-    0x98,
-    0x09,
-    0x67,
-    0xb0,
-    0x5a,
-    0xbb,
-    0xab,
-    0x11,
-    0xee,
-    0x16,
-    0x95,
-    0xaa,
-    0x60,
-    0x49,
-    0xa1,
-    0xd4,
-    0x34,
-    0x17,
-    0x99,
-    0x04,
-    0x9d,
-    0x37,
-    0x67,
-    0x4c,
-    0xf0,
-    0xfb,
-    0x28,
-    0x25,
-    0x57,
-    0x31,
-    0x81,
-    0x6b,
-    0xca,
-    0x47,
-    0x36,
-    0xa9,
-    0x3b,
-    0xb2,
-    0xf8,
-    0x97,
-    0x11,
-    0x8f,
-    0x7f,
-    0xe1,
-    0xd8,
-    0x8b,
-    0xd9,
-    0x2a,
-    0x37,
-    0x01,
-    0x02,
-    0x51,
-    0x22,
-    0x63,
-    0xb4,
-    0xf3,
-    0x50,
-    0xdb,
-    0x80,
-    0x31,
-    0xf0,
-    0x32,
-    0x1e,
-    0xb3,
-    0x98,
-    0xf0,
-    0x02,
-    0xec,
-    0x7e,
-    0xc5,
-    0x2f,
-    0xa0,
-    0xea,
-    0x27,
-    0x50,
-    0xa4,
-    0xeb,
-    0x3d,
-    0x05,
-    0xe6,
-    0x4a,
-    0xfc,
-    0x7b,
-    0xad,
-    0xbc,
-    0x90,
-    0x3f,
-    0x21,
-    0x5b,
-    0xfd,
-    0x54,
-    0x0d,
-    0x57,
-    0x06,
-    0x83,
-    0xe4,
-    0xe9,
-    0x4e,
-    0xf2,
-    0x02,
-    0x89,
-    0xbd,
-    0xf8,
-    0x35,
-    0x61,
-    0x25,
-    0x30,
-    0x7c,
-    0x01,
-    0x25,
-    0xcc,
-    0x0e,
-    0x54,
-    0x4e,
-    0x2c,
-    0x9e,
-    0xd3,
-    0x85,
-    0xb0,
-    0xde,
-    0xf8,
-    0xa8,
-    0xca,
-    0x42,
-    0xf6,
-    0x75,
-    0x57,
-    0x06,
-    0xa7,
-    0xa7,
-    0x2f,
-    0x72,
-    0xc6,
-    0x61,
-    0xfa,
-    0x5d,
-    0x5e,
-    0xd0,
-    0x46,
-    0xf0,
-    0x82,
-    0x0d,
-    0xd7,
-    0xac,
-    0x3f,
-    0x40,
-    0x3e,
-    0xae,
-    0xcf,
-    0x0b,
-    0xae,
-    0x32,
-    0x0f,
-    0x26,
-    0x0a,
-    0x57,
-    0x34,
-    0x46,
-    0x42,
-    0x22,
-    0xb9,
-    0x44,
-    0xe0,
-    0xc4,
-    0x9b,
-    0x7b,
-    0xde,
-    0x20,
-    0xc9,
-    0x72,
-    0xbb,
-    0x88,
-    0xd6,
-    0xbb,
-    0xce,
-    0xc7,
-    0xf2,
-    0x1a,
-    0xd9,
-    0x65,
-    0x18,
-    0xea,
-    0xe1,
-    0x26,
-    0x89,
-    0xbd,
-    0x3d,
-    0xd4,
-    0x78,
-    0x43,
-    0xee,
-    0x3e,
-    0x07,
-    0x6d,
-    0x2e,
-    0x81,
-    0x72,
-    0xd1,
-    0x4b,
-    0x86,
-    0x8a,
-    0x51,
-    0xb6,
-    0xcc,
-    0x66,
-    0xf7,
-    0x57,
-    0x68,
-    0x55,
-    0x24,
-    0x24,
-    0x4a,
-    0x16,
-    0xea,
-    0xf2,
-    0xc1,
-    0x4c,
-    0xb6,
-    0x8b,
-    0x42,
-    0x2c,
-    0x32,
-    0x00,
-    0x65,
-    0x79,
-    0x69,
-    0x41,
-    0x30,
-    0xb2,
-    0x2d,
-    0xea,
-    0x98,
-    0x8a,
-    0xb5,
-    0x60,
-    0x45,
-    0x98,
-    0x8b,
-    0x1d,
-    0x96,
-    0x50,
-    0xa6,
-    0x48,
-    0xe5,
-    0x32,
-    0xd2,
-    0x89,
-    0x0c,
-    0x41,
-    0x59,
-    0x1b,
-    0x27,
-    0xb7,
-    0xdc,
-    0x23,
-    0x9c,
-    0xf7,
-    0x82,
-    0x40,
-    0x59,
-    0xc3,
-    0x55,
-    0x63,
-    0x5d,
-    0xaf,
-    0xe8,
-    0xe1,
-    0x7a,
-    0xd5,
-    0x3d,
-    0xc6,
-    0x59,
-    0xcb,
-    0xe7,
-    0x6d,
-    0xbe,
-    0xd2,
-    0x6c,
-    0x4d,
-    0x0d,
-    0x50,
-    0xed,
-    0x16,
-    0x0e,
-    0x81,
-    0x09,
-    0xfd,
-    0xed,
-    0x69,
-    0xfe,
-    0x53,
-    0x85,
-    0x0d,
-    0x11,
-    0x5d,
-    0xdd,
-    0xe2,
-    0x31,
-    0x60,
-    0xf3,
-    0x86,
-    0xd7,
-    0xfb,
-    0xb9,
-    0xae,
-    0x30,
-    0xb9,
-    0x5e,
-    0x60,
-    0x7e,
-    0xe7,
-    0xce,
-    0x62,
-    0xbc,
-    0xa3,
-    0x7c,
-    0xf2,
-    0x80,
-    0x36,
-    0x5f,
-    0xb7,
-    0x26,
-    0xa4,
-    0x3a,
-    0xf8,
-    0x2b,
-    0x81,
-    0x21,
-    0x0c,
-    0xd7,
-    0x05,
-    0x39,
-    0x11,
-    0x1f,
-    0x63,
-    0xbf,
-    0xe1,
-    0xc9,
-    0x57,
-    0x4c,
-    0x42,
-    0xd1,
-    0xfe,
-    0x57,
-    0x5d,
-    0x0c,
-    0xeb,
-    0xfb,
-    0x72,
-    0x0b,
-    0x77,
-    0xfa,
-    0xc9,
-    0x42,
-    0x58,
-    0x03,
-    0xec,
-    0x69,
-    0x76,
-    0x30,
-    0x13,
-    0x23,
-    0xfa,
-    0xd3,
-    0xe0,
-    0xde,
-    0xa7,
-    0x72,
-    0x4c,
-    0xfa,
-    0x6d,
-    0x10,
-    0xe2,
-    0x2d,
-    0x3b,
-    0xae,
-    0x2b,
-    0x26,
-    0x16,
-    0x12,
-    0x69,
-    0x70,
-    0x68,
-    0xc7,
-    0x87,
-    0x9a,
-    0x9a,
-    0x65,
-    0x51,
-    0x95,
-    0xe4,
-    0x13,
-    0xe1,
-    0x5d,
-    0x64,
-    0x49,
-    0x59,
-    0xdb,
-    0x6e,
-    0xdb,
-    0xd8,
-    0x0b,
-    0x24,
-    0x33,
-    0xa6,
-    0x5a,
-    0x46,
-    0xdd,
-    0xb2,
-    0x52,
-    0x4b,
-    0x4a,
-    0x3f,
-    0x78,
-    0xb0,
-    0xcd,
-    0xda,
-    0x75,
-    0x90,
-    0xea,
-    0x8f,
-    0x75,
-    0x75,
-    0xd0,
-    0x5c,
-    0xcd,
-    0x6e,
-    0x24,
-    0xe6,
-    0xe0,
-    0x61,
-    0x00,
-    0x6b,
-    0x43,
-    0xa3,
-    0x3c,
-    0xf8,
-    0x1f,
-    0xc6,
-    0xec,
-    0xdc,
-    0xd7,
-    0xb2,
-    0x29,
-    0x5c,
-    0xeb,
-    0xf7,
-    0x15,
-    0xa8,
-    0x1d,
-    0x62,
-    0x19,
-    0x0e,
-    0xd2,
-    0xcf,
-    0x71,
-    0x6e,
-    0xba,
-    0x3d,
-    0xeb,
-    0xee,
-    0xb3,
-    0x28,
-    0xeb,
-    0xee,
-    0xeb,
-    0x13,
-    0xb3,
-    0x3f,
-    0x45,
-    0x64,
-    0xe1,
-    0x8f,
-    0xff,
-    0x74,
-    0x39,
-    0x28,
-    0x91,
-    0xe7,
-    0xa5,
-    0xdb,
-    0xd8,
-    0x39,
-    0x7a,
-    0x36,
-    0x73,
-    0x9a,
-    0xfd,
-    0xfe,
-    0x6e,
-    0xfc,
-    0x26,
-    0xd9,
-    0x1d,
-    0x6a,
-    0xa4,
-    0x4a,
-    0x4b,
-    0x9b,
-    0x20,
-    0xe2,
-    0x95,
-    0xc7,
-    0xc6,
-    0xb5,
-    0x10,
-    0xb9,
-    0x02,
-    0x0c,
-    0x32,
-    0x26,
-    0x87,
-    0x59,
-    0xef,
-    0x3d,
-    0x96,
-    0x70,
-    0x22,
-    0x7f,
-    0x7d,
-    0xf3,
-    0x2f,
-    0xd1,
-    0x5e,
-    0x0e,
-    0xe6,
-    0xcf,
-    0x31,
-    0x65,
-    0xab,
-    0x64,
-    0x0c,
-    0x4b,
-    0xd4,
-    0x97,
-    0xa2,
-    0x35,
-    0x53,
-    0xa8,
-    0x0b,
-    0x6e,
-    0x95,
-    0x5c,
-    0xc3,
-    0x0c,
-    0xaa,
-    0x95,
-    0xf4,
-    0x22,
-    0xa5,
-    0x25,
-    0xf8,
-    0x37,
-    0x46,
-    0xe4,
-    0x19,
-    0xf7,
-    0xd6,
-    0x01,
-    0x9c,
-    0x29,
-    0x53,
-    0x95,
-    0xff,
-    0xe1,
-    0xcd,
-    0x7e,
-    0x7e,
-    0xf7,
-    0x10,
-    0x6a,
-    0xdc,
-    0xb7,
-    0x83,
-    0x32,
-    0x5f,
-    0xda,
-    0x50,
-    0x6a,
-    0x1d,
-    0xb6,
-    0xc5,
-    0x36,
-    0x76,
-    0xb1,
-    0xfb,
-    0x5e,
-    0xe2,
-    0xfb,
-    0xb5,
-    0xa5,
-    0xed,
-    0x7d,
-    0x8a,
-    0x57,
-    0x7f,
-    0x0c,
-    0x47,
-    0x22,
-    0x61,
-    0xe3,
-    0x8f,
-    0x26,
-    0xfd,
-    0x50,
-    0xc4,
-    0x4f,
-    0x65,
-    0xad,
-    0x2b,
-    0xe3,
-    0x97,
-    0x92,
-    0x4a,
-    0x57,
-    0x00,
-    0x49,
-    0x95,
-    0x67,
-    0x3e,
-    0x82,
-    0x4a,
-    0x66,
-    0x2a,
-    0x48,
-    0x9a,
-    0xd2,
-    0x16,
-    0x34,
-    0x09,
-    0x2b,
-    0x53,
-    0xe1,
-    0x17,
-    0x05,
-    0xf7,
-    0x9f,
-    0x20,
-    0x5d,
-    0xdc,
-    0x6c,
-    0x81,
-    0x29,
-    0xec,
-    0x20,
-    0xfc,
-    0x32,
-    0x9c,
-    0xe7,
-    0x5e,
-    0x26,
-    0xb7,
-    0xf4,
-    0x5e,
-    0xe9,
-    0x5d,
-    0x74,
-    0xc9,
-    0x2d,
-    0x4b,
-    0xc1,
-    0xdc,
-    0x42,
-    0x5d,
-    0xd9,
-    0xf1,
-    0x2f,
-    0x50,
-    0x0e,
-    0x5f,
-    0x01,
-    0xcd,
-    0xff,
-    0x9b,
-    0x63,
-    0xa3,
-    0xc6,
-    0xa3,
-    0x6f,
-    0x55,
-    0x73,
-    0x9c,
-    0xc4,
-    0xd4,
-    0xba,
-    0xb9,
-    0xd9,
-    0x8d,
-    0xe8,
-    0x60,
-    0x91,
-    0xa6,
-    0x1b,
-    0x88,
-    0x0f,
-    0x85,
-    0xb3,
-    0x66,
-    0xcb,
-    0x93,
-    0x04,
-    0x48,
-    0xe5,
-    0x3f,
-    0x4d,
-    0xc1,
-    0xba,
-    0x45,
-    0xee,
-    0x06,
-    0xb6,
-    0x30,
-    0xd5,
-    0x98,
-    0x69,
-    0x1d,
-    0x3a,
-    0x23,
-    0xdc,
-    0xc3,
-    0x8c,
-    0xa6,
-    0x25,
-    0xb0,
-    0xab,
-    0xd5,
-    0x39,
-    0xd5,
-    0x57,
-    0xbc,
-    0x02,
-    0x45,
-    0xe9,
-    0xa4,
-    0xb1,
-    0x3a,
-    0x40,
-    0x3a,
-    0x56,
-    0x59,
-    0xff,
-    0xee,
-    0xad,
-    0x37,
-    0xf6,
-    0x9a,
-    0x3b,
-    0x1b,
-    0xdd,
-    0x64,
-    0x9a,
-    0x06,
-    0x48,
-    0xe5,
-    0x12,
-    0xf0,
-    0xd7,
-    0x8b,
-    0x69,
-    0x55,
-    0xad,
-    0x3b,
-    0xfb,
-    0xf0,
-    0x24,
-    0x3b,
-    0x0d,
-    0xc7,
-    0xbf,
-    0x50,
-    0x5e,
-    0x67,
-    0x61,
-    0x23,
-    0xff,
-    0x71,
-    0xbc,
-    0xe9,
-    0x65,
-    0x55,
-    0x0b,
-    0x43,
-    0xbd,
-    0x5e,
-    0x04,
-    0x63,
-    0x7f,
-    0xef,
-    0x08,
-    0x71,
-    0x46,
-    0x0c,
-    0x9e,
-    0x2d,
-    0xdf,
-    0x1b,
-    0x1f,
-    0xd5,
-    0x9f,
-    0xec,
-    0xb3,
-    0x49,
-    0xfa,
-    0xf8,
-    0x7b,
-    0x6d,
-    0x52,
-    0xe6,
-    0x10,
-    0xcf,
-    0x0d,
-    0x54,
-    0x2d,
-    0x8a,
-    0xea,
-    0xd3,
-    0xa8,
-    0x6a,
-    0x95,
-    0x33,
-    0xa7,
-    0x50,
-    0x79,
-    0x02,
-    0x10,
-    0xd8,
-    0xd5,
-    0x4f,
-    0x41,
-    0x3a,
-    0x12,
-    0xb3,
-    0x02,
-    0x6e,
-    0x54,
-    0x93,
-    0xb7,
-    0x94,
-    0x4f,
-    0x9f,
-    0xdb,
-    0x92,
-    0x5c,
-    0x9e,
-    0xa9,
-    0xff,
-    0xcb,
-    0x6e,
-    0x1c,
-    0x40,
-    0x7b,
-    0x46,
-    0x1a,
-    0xf0,
-    0xa9,
-    0x3f,
-    0xec,
-    0x86,
-    0x06,
-    0x13,
-    0xf2,
-    0x31,
-    0x0c,
-    0x24,
-    0x95,
-    0x07,
-    0x91,
-    0xc0,
-    0x7c,
-    0x5f,
-    0x9d,
-    0xa3,
-    0x03,
-    0x7b,
-    0x79,
-    0xbd,
-    0xe9,
-    0x6b,
-    0x08,
-    0x36,
-    0x48,
-    0x2d,
-    0x5a,
-    0xb0,
-    0xcb,
-    0x19,
-    0x7f,
-    0xcc,
-    0x1b,
-    0x7d,
-    0x99,
-    0xef,
-    0x9a,
-    0x84,
-    0x35,
-    0x46,
-    0x54,
-    0x5c,
-    0xdc,
-    0x07,
-    0x33,
-    0x97,
-    0xe4,
-    0xfa,
-    0x72,
-    0xd2,
-    0x8c,
-    0x39,
-    0x53,
-    0x95,
-    0x49,
-    0x34,
-    0x15,
-    0x7b,
-    0x5a,
-    0xf7,
-    0x20,
-    0x93,
-    0xa2,
-    0xb0,
-    0x84,
-    0x05,
-    0xb7,
-    0x6b,
-    0xa1,
-    0xf9,
-    0x37,
-    0x21,
-    0x27,
-    0xb4,
-    0x5b,
-    0xf1,
-    0x42,
-    0x04,
-    0xce,
-    0xad,
-    0x0e,
-    0xdf,
-    0xbf,
-    0x98,
-    0x51,
-    0x47,
-    0x35,
-    0x6e,
-    0x69,
-    0x70,
-    0xa2,
-    0xa5,
-    0x83,
-    0x25,
-    0xbc,
-    0xf3,
-    0x0e,
-    0x68,
-    0x88,
-    0x10,
-    0x70,
-    0x59,
-    0xb7,
-    0xbd,
-    0xf7,
-    0x59,
-    0x36,
-    0x05,
-    0x12,
-    0x6e,
-    0x01,
-    0xc3,
-    0xc1,
-    0xe9,
-    0x38,
-    0x64,
-    0x4a,
-    0x47,
-    0x74,
-    0xee,
-    0x2e,
-    0x56,
-    0x5b,
-    0x41,
-    0x5b,
-    0x99,
-    0x72,
-    0x9e,
-    0xa3,
-    0xec,
-    0x33,
-    0x65,
-    0x6d,
-    0x6b,
-    0x60,
-    0x23,
-    0xaa,
-    0x91,
-    0x96,
-    0xcb,
-    0x0b,
-    0x9d,
-    0x25,
-    0x44,
-    0x71,
-    0x3a,
-    0x1f,
-    0x24,
-    0xa6,
-    0x5e,
-    0xaf,
-    0xbc,
-    0x4a,
-    0x73,
-    0xac,
-    0x54,
-    0x10,
-    0xb5,
-    0x6e,
-    0xb7,
-    0x2a,
-    0xdb,
-    0xe1,
-    0xf3,
-    0x01,
-    0xf9,
-    0xd7,
-    0x5a,
-    0x2a,
-    0xa5,
-    0xa3,
-    0xcc,
-    0x95,
-    0x59,
-    0xe3,
-    0x39,
-    0x08,
-    0x18,
-    0x9d,
-    0x61,
-    0xcc,
-    0x54,
-    0x8e,
-    0xde,
-    0xa7,
-    0x10,
-    0xbe,
-    0x65,
-    0x0a,
-    0x42,
-    0x58,
-    0x49,
-    0x8a,
-    0x7b,
-    0xb9,
-    0x40,
-    0x94,
-    0xc9,
-    0xc7,
-    0x6a,
-    0x5d,
-    0xdd,
-    0x84,
-    0x8f,
-    0x19,
-    0x69,
-    0xe3,
-    0xa9,
-    0x6d,
-    0xcc,
-    0xda,
-    0xa2,
-    0x26,
-    0xf1,
-    0xb8,
-    0x5e,
-    0x2b,
-    0x74,
-    0xb9,
-    0xfc,
-    0xb0,
-    0x07,
-    0xd7,
-    0x59,
-    0xad,
-    0x15,
-    0xe4,
-    0xd6,
-    0x8f,
-    0xa5,
-    0xd6,
-    0x5c,
-    0x2d,
-    0x80,
-    0x62,
-    0x9d,
-    0xfd,
-    0x96,
-    0xcc,
-    0x9c,
-    0x88,
-    0x9e,
-    0xfd,
-    0x6f,
-    0x1b,
-    0xfd,
-    0xd6,
-    0x43,
-    0xc0,
-    0xe9,
-    0xc4,
-    0xa2,
-    0x6c,
-    0xce,
-    0x94,
-    0xf1,
-    0x7a,
-    0xf0,
-    0x89,
-    0x3d,
-    0x58,
-    0x53,
-    0xac,
-    0x37,
-    0x81,
-    0xd8,
-    0x64,
-    0x7c,
-    0xab,
-    0xa8,
-    0x46,
-    0x1a,
-    0x41,
-    0xd5,
-    0x2e,
-    0x50,
-    0x13,
-    0x3f,
-    0x8f,
-    0x96,
-    0x4d,
-    0xb5,
-    0x07,
-    0xdd,
-    0xa5,
-    0x5d,
-    0x37,
-    0x18,
-    0xd9,
-    0x56,
-    0xd1,
-    0xfb,
-    0x59,
-    0x9b,
-    0xf2,
-    0x03,
-    0x40,
-    0x2b,
-    0xb3,
-    0xb6,
-    0x89,
-    0x67,
-    0xfb,
-    0x2c,
-    0x80,
-    0xbb,
-    0x97,
-    0xce,
-    0x76,
-    0x80,
-    0x8c,
-    0x5e,
-    0xb9,
-    0x21,
-    0xab,
-    0x38,
-    0xc4,
-    0x7d,
-    0x67,
-    0xd7,
-    0xb2,
-    0x8d,
-    0xe4,
-    0x9a,
-    0xf9,
-    0x47,
-    0x50,
-    0xc8,
-    0x54,
-    0xc2,
-    0x76,
-    0xd3,
-    0x01,
-    0x9a,
-    0x90,
-    0xd9,
-    0x2d,
-    0x96,
-    0x5d,
-    0x70,
-    0xad,
-    0x88,
-    0x74,
-    0xa3,
-    0xee,
-    0x75,
-    0xd8,
-    0x38,
-    0x2f,
-    0xf6,
-    0xcc,
-    0x35,
-    0xed,
-    0xde,
-    0xe9,
-    0xa2,
-    0x9f,
-    0x1d,
-    0x6d,
-    0x8f,
-    0xa4,
-    0xe5,
-    0xd6,
-    0x59,
-    0x7a,
-    0x0b,
-    0xb0,
-    0x2a,
-    0x30,
-    0xaf,
-    0xab,
-    0xbf,
-    0x1e,
-    0x1f,
-    0xf0,
-    0x6e,
-    0xd3,
-    0xf9,
-    0xb5,
-    0x67,
-    0x4f,
-    0x90,
-    0x0f,
-    0x3a,
-    0x73,
-    0x91,
-    0x08,
-    0x99,
-    0xb5,
-    0xe7,
-    0xf2,
-    0x5f,
-    0x18,
-    0xdb,
-    0xfb,
-    0xd2,
-    0x5c,
-    0x80,
-    0x01,
-    0x25,
-    0x71,
-    0x4e,
-    0xa7,
-    0x42,
-    0x32,
-    0x0d,
-    0xa8,
-    0xc6,
-    0x50,
-    0xf5,
-    0x6b,
-    0x4c,
-    0x8c,
-    0x13,
-    0xd8,
-    0xee,
-    0x2a,
-    0xee,
-    0x6b,
-    0x09,
-    0xa2,
-    0x6b,
-    0x86,
-    0x41,
-    0x98,
-    0xee,
-    0x0c,
-    0xc5,
-    0x0e,
-    0xc2,
-    0x2b,
-    0xd4,
-    0xd9,
-    0xbb,
-    0x79,
-    0x81,
-    0x51,
-    0x19,
-    0x43,
-    0xb3,
-    0x4d,
-    0xb0,
-    0x21,
-    0x6f,
-    0x4f,
-    0x46,
-    0xce,
-    0x5a,
-    0xfb,
-    0x3d,
-    0x37,
-    0x79,
-    0xce,
-    0x72,
-    0xd2,
-    0x3c,
-    0x0c,
-    0x64,
-    0x31,
-    0xbb,
-    0xfa,
-    0x99,
-    0xd7,
-    0x3f,
-    0x4e,
-    0x3d,
-    0x4a,
-    0x04,
-    0xe4,
-    0x0d,
-    0x6a,
-    0x3d,
-    0xb2,
-    0x73,
-    0x00,
-    0x59,
-    0xfe,
-    0xf2,
-    0x9a,
-    0x85,
-    0xce,
-    0xc5,
-    0x97,
-    0x72,
-    0xa1,
-    0xc3,
-    0x7e,
-    0x58,
-    0x5c,
-    0x86,
-    0x94,
-    0x3b,
-    0x87,
-    0xcc,
-    0xad,
-    0x6d,
-    0xb9,
-    0x1d,
-    0x42,
-    0x54,
-    0x51,
-    0xaf,
-    0xc4,
-    0x6d,
-    0x67,
-    0x86,
-    0x30,
-    0x91,
-    0x03,
-    0xdf,
-    0xe4,
-    0x77,
-    0x8c,
-    0xcf,
-    0xb1,
-    0x7b,
-    0x83,
-    0x28,
-    0x31,
-    0x9d,
-    0x71,
-    0x9c,
-    0x5a,
-    0xcd,
-    0x1d,
-    0x25,
-    0x54,
-    0x66,
-    0x03,
-    0xa4,
-    0x88,
-    0xf8,
-    0x02,
-    0xc8,
-    0xfa,
-    0x4a,
-    0x55,
-    0x31,
-    0xd8,
-    0x9f,
-    0xc4,
-    0xd5,
-    0x53,
-    0x39,
-    0x1b,
-    0xa3,
-    0xad,
-    0x1c,
-    0xdc,
-    0x67,
-    0x93,
-    0x14,
-    0x31,
-    0xee,
-    0xae,
-    0xf9,
-    0x24,
-    0x6a,
-    0x75,
-    0x32,
-    0x12,
-    0x17,
-    0x45,
-    0x78,
-    0x5d,
-    0x1f,
-    0xb3,
-    0xdc,
-    0x62,
-    0xbc,
-    0x21,
-    0x0c,
-    0xab,
-    0x9c,
-    0x8f,
-    0xd2,
-    0x65,
-    0x89,
-    0xb4,
-    0xdd,
-    0x14,
-    0x49,
-    0x4d,
-    0xc4,
-    0x85,
-    0xc3,
-    0xb6,
-    0x48,
-    0x04,
-    0x64,
-    0xb7,
-    0xda,
-    0xd0,
-    0xc1,
-    0xa0,
-    0x5d,
-    0xcc,
-    0x7e,
-    0x98,
-    0x2c,
-    0x77,
-    0x6e,
-    0x32,
-    0x5f,
-    0x1e,
-    0xfb,
-    0x41,
-    0x4a,
-    0x51,
-    0xc9,
-    0xee,
-    0x47,
-    0x93,
-    0x96,
-    0x07,
-    0xb6,
-    0x55,
-    0x65,
-    0x9a,
-    0x41,
-    0x26,
-    0xdb,
-    0xc3,
-    0x65,
-    0x24,
-    0xe9,
-    0xc2,
-    0x2d,
-    0xb6,
-    0xab,
-    0x50,
-    0x41,
-    0x7d,
-    0x90,
-    0x34,
-    0x20,
-    0x87,
-    0xbc,
-    0x11,
-    0xaa,
-    0xc6,
-    0xaa,
-    0x82,
-    0xe1,
-    0xc1,
-    0x16,
-    0x68,
-    0xf0,
-    0x8a,
-    0x1a,
-    0x83,
-    0x6d,
-    0xf0,
-    0x97,
-    0x40,
-    0xdb,
-    0xf5,
-    0xd6,
-    0xd2,
-    0x73,
-    0x83,
-    0x6f,
-    0x84,
-    0x24,
-    0x5a,
-    0x6a,
-    0x4e,
-    0xd8,
-    0x4d,
-    0xa5,
-    0xa6,
-    0xf9,
-    0xae,
-    0x75,
-    0x98,
-    0x33,
-    0x07,
-    0x90,
-    0x19,
-    0x7c,
-    0x0a,
-    0x2b,
-    0x99,
-    0x52,
-    0xcb,
-    0x5f,
-    0xd7,
-    0x44,
-    0x2d,
-    0xd1,
-    0xf9,
-    0xb4,
-    0x9a,
-    0x92,
-    0xdc,
-    0xdb,
-    0xf8,
-    0x44,
-    0xa9,
-    0x0e,
-    0xd8,
-    0x7f,
-    0xa9,
-    0x3f,
-    0xf0,
-    0x73,
-    0x5a,
-    0xc6,
-    0xcb,
-    0xce,
-    0xc2,
-    0x62,
-    0xbf,
-    0xe0,
-    0x03,
-    0x7a,
-    0x20,
-    0xfc,
-    0x30,
-    0xa9,
-    0xb3,
-    0x22,
-    0x5f,
-    0x7a,
-    0x65,
-    0xdc,
-    0xff,
-    0x70,
-    0x3d,
-    0x66,
-    0x6c,
-    0x4a,
-    0x90,
-    0x11,
-    0xc1,
-    0x84,
-    0x74,
-    0xe9
-  ],
-  const [
-    0x2d,
-    0x18,
-    0x66,
-    0x7c,
-    0xac,
-    0x74,
-    0x03,
-    0xce,
-    0x75,
-    0x17,
-    0x5d,
-    0x39,
-    0x0e,
-    0x00,
-    0xc5,
-    0xd4,
-    0x00,
-    0x25,
-    0xad,
-    0x5f,
-    0xda,
-    0x64,
-    0xc5,
-    0xd6,
-    0x78,
-    0xbc,
-    0x63,
-    0x46,
-    0x85,
-    0xbd,
-    0x28,
-    0xe0,
-    0x3f,
-    0x3d,
-    0xe1,
-    0x4c,
-    0x7a,
-    0x4d,
-    0xab,
-    0x40,
-    0xe8,
-    0x6c,
-    0x5b,
-    0x50,
-    0x97,
-    0xfa,
-    0x1c,
-    0x08,
-    0xbb,
-    0xef,
-    0x5a,
-    0x38,
-    0xae,
-    0xcc,
-    0xdf,
-    0x8f,
-    0x35,
-    0xd2,
-    0x3c,
-    0x6b,
-    0x05,
-    0x72,
-    0x6b,
-    0xf0,
-    0x86,
-    0x06,
-    0xb2,
-    0x58,
-    0xd6,
-    0xbe,
-    0xca,
-    0x89,
-    0x11,
-    0xdd,
-    0x41,
-    0xed,
-    0xd0,
-    0x25,
-    0x1d,
-    0x7e,
-    0xef,
-    0x8f,
-    0xc2,
-    0x20,
-    0x94,
-    0x40,
-    0x16,
-    0x34,
-    0x6c,
-    0xb9,
-    0xe2,
-    0x6a,
-    0x38,
-    0x4e,
-    0x7c,
-    0xd6,
-    0x89,
-    0xd9,
-    0xa3,
-    0x47,
-    0xc7,
-    0xaf,
-    0xaa,
-    0xd4,
-    0x78,
-    0xd3,
-    0xd9,
-    0xb7,
-    0xbf,
-    0x6a,
-    0x10,
-    0x5f,
-    0x23,
-    0x6f,
-    0xad,
-    0xc0,
-    0x92,
-    0xa8,
-    0xb0,
-    0xee,
-    0xa6,
-    0xd9,
-    0x1d,
-    0xea,
-    0x27,
-    0x37,
-    0xa2,
-    0xbb,
-    0xd0,
-    0x1f,
-    0x7a,
-    0xc1,
-    0x56,
-    0x08,
-    0x91,
-    0x47,
-    0xa6,
-    0xb7,
-    0xe9,
-    0x57,
-    0x6e,
-    0xb2,
-    0x3c,
-    0xd2,
-    0xe0,
-    0xf6,
-    0xe3,
-    0xc0,
-    0xb3,
-    0xec,
-    0xf6,
-    0xe4,
-    0x6a,
-    0x9a,
-    0xb5,
-    0x93,
-    0xd8,
-    0x16,
-    0x26,
-    0xc7,
-    0xe4,
-    0x41,
-    0x00,
-    0x70,
-    0x8a,
-    0xb1,
-    0xc8,
-    0x0a,
-    0x22,
-    0xef,
-    0x3a,
-    0x74,
-    0xe5,
-    0xe3,
-    0xea,
-    0x00,
-    0xad,
-    0x8c,
-    0x2b,
-    0xc7,
-    0xfc,
-    0xf5,
-    0x30,
-    0x3f,
-    0x40,
-    0x64,
-    0x71,
-    0x0f,
-    0x55,
-    0xd4,
-    0x50,
-    0x21,
-    0x4c,
-    0xa5,
-    0xfd,
-    0xf9,
-    0x6b,
-    0x93,
-    0x97,
-    0x46,
-    0x74,
-    0xe5,
-    0x94,
-    0xb7,
-    0x2b,
-    0xe6,
-    0x62,
-    0x10,
-    0x12,
-    0x99,
-    0x4e,
-    0x7d,
-    0x77,
-    0xa9,
-    0xa6,
-    0x26,
-    0xb0,
-    0x9f,
-    0x1a,
-    0x03,
-    0xa6,
-    0x57,
-    0x68,
-    0xf2,
-    0x90,
-    0xb5,
-    0x39,
-    0x07,
-    0x01,
-    0x94,
-    0x45,
-    0x23,
-    0x25,
-    0xff,
-    0xbe,
-    0xc8,
-    0x47,
-    0xa4,
-    0xec,
-    0x2b,
-    0x97,
-    0x85,
-    0x15,
-    0x8b,
-    0x2b,
-    0xf1,
-    0x9f,
-    0xc2,
-    0x43,
-    0xb3,
-    0x78,
-    0x1a,
-    0xd1,
-    0x89,
-    0xb6,
-    0x61,
-    0x39,
-    0xd8,
-    0x7b,
-    0x40,
-    0x55,
-    0x9d,
-    0x1c,
-    0xc8,
-    0xbc,
-    0xa7,
-    0x82,
-    0x4e,
-    0x44,
-    0x04,
-    0xd0,
-    0x79,
-    0xc5,
-    0xb9,
-    0x45,
-    0x99,
-    0x20,
-    0xb6,
-    0x65,
-    0x3a,
-    0x80,
-    0x08,
-    0x53,
-    0xfa,
-    0xe0,
-    0x51,
-    0x82,
-    0x97,
-    0xce,
-    0x75,
-    0x8c,
-    0x4c,
-    0x6e,
-    0x97,
-    0x62,
-    0x5e,
-    0xc1,
-    0x44,
-    0xa6,
-    0xf2,
-    0x27,
-    0xed,
-    0x55,
-    0x21,
-    0x23,
-    0x9b,
-    0xa9,
-    0x4e,
-    0x5f,
-    0xde,
-    0x3e,
-    0xb7,
-    0xf0,
-    0x06,
-    0x73,
-    0x4b,
-    0xda,
-    0x96,
-    0x13,
-    0xbc,
-    0xd7,
-    0xf6,
-    0x35,
-    0xd4,
-    0x54,
-    0x68,
-    0x60,
-    0x0c,
-    0xbd,
-    0x3d,
-    0xf3,
-    0x5b,
-    0xfa,
-    0x49,
-    0xc4,
-    0x4c,
-    0x3a,
-    0x94,
-    0x08,
-    0x53,
-    0xef,
-    0x52,
-    0x73,
-    0x61,
-    0x19,
-    0x16,
-    0xa0,
-    0xb6,
-    0xc8,
-    0x42,
-    0xb2,
-    0xf7,
-    0xdc,
-    0xc2,
-    0x3c,
-    0x80,
-    0x10,
-    0xfa,
-    0x5e,
-    0xfb,
-    0x37,
-    0xfc,
-    0x31,
-    0x31,
-    0xc5,
-    0xff,
-    0x65,
-    0x21,
-    0x90,
-    0x0d,
-    0x29,
-    0x4f,
-    0xd8,
-    0xfb,
-    0x4b,
-    0x5f,
-    0x85,
-    0x9e,
-    0xa1,
-    0xe2,
-    0xb1,
-    0x3c,
-    0xa7,
-    0x70,
-    0x66,
-    0x41,
-    0x69,
-    0xf7,
-    0xa9,
-    0x33,
-    0xa4,
-    0x52,
-    0xb7,
-    0xe8,
-    0x28,
-    0x1e,
-    0x8e,
-    0xf7,
-    0x80,
-    0xc9,
-    0xaf,
-    0x6c,
-    0xd5,
-    0xeb,
-    0x23,
-    0xc0,
-    0x10,
-    0xda,
-    0xbc,
-    0x08,
-    0x3f,
-    0x79,
-    0x9d,
-    0x6c,
-    0x3a,
-    0x50,
-    0xfc,
-    0xdb,
-    0x86,
-    0xe2,
-    0x27,
-    0xfd,
-    0x79,
-    0x3a,
-    0xc5,
-    0x69,
-    0x9f,
-    0xc8,
-    0x5f,
-    0x19,
-    0x5d,
-    0x6b,
-    0x1f,
-    0x1a,
-    0xd4,
-    0xcf,
-    0xd7,
-    0x88,
-    0x08,
-    0xf9,
-    0x44,
-    0xba,
-    0x42,
-    0x20,
-    0x95,
-    0xba,
-    0xb3,
-    0xbf,
-    0x27,
-    0xf8,
-    0x59,
-    0xe8,
-    0x93,
-    0x3f,
-    0x27,
-    0xdb,
-    0xea,
-    0xe7,
-    0x60,
-    0xd7,
-    0x3f,
-    0x4d,
-    0x44,
-    0x30,
-    0x66,
-    0x80,
-    0xee,
-    0xa2,
-    0xfc,
-    0x3d,
-    0x7d,
-    0xe5,
-    0xa7,
-    0x1e,
-    0x72,
-    0x81,
-    0x9f,
-    0x0e,
-    0x59,
-    0xe4,
-    0x6e,
-    0x00,
-    0xac,
-    0xb2,
-    0xf4,
-    0xe1,
-    0xf4,
-    0x5c,
-    0xad,
-    0xca,
-    0x31,
-    0xf4,
-    0x37,
-    0x7b,
-    0x7c,
-    0x40,
-    0x0e,
-    0x05,
-    0xeb,
-    0x0d,
-    0x9b,
-    0xc6,
-    0xb5,
-    0xc5,
-    0x6d,
-    0x9a,
-    0x96,
-    0x44,
-    0xc6,
-    0x50,
-    0x75,
-    0xe8,
-    0x59,
-    0x5b,
-    0x45,
-    0xe7,
-    0x52,
-    0xca,
-    0x29,
-    0xe6,
-    0x97,
-    0x7b,
-    0xdb,
-    0xc7,
-    0x4d,
-    0x8b,
-    0x4e,
-    0xc2,
-    0x9f,
-    0x10,
-    0x92,
-    0xb7,
-    0xba,
-    0x0b,
-    0xf9,
-    0xc2,
-    0x1c,
-    0x98,
-    0x78,
-    0x11,
-    0x0f,
-    0x68,
-    0x4f,
-    0xf2,
-    0x70,
-    0x71,
-    0xec,
-    0x30,
-    0xb5,
-    0xe4,
-    0x0d,
-    0xa0,
-    0x2f,
-    0x60,
-    0x26,
-    0xf7,
-    0x8b,
-    0x65,
-    0x02,
-    0xde,
-    0x9f,
-    0x0b,
-    0xac,
-    0x49,
-    0x64,
-    0xf4,
-    0x90,
-    0x04,
-    0x3e,
-    0x7f,
-    0xde,
-    0x8e,
-    0x84,
-    0x3e,
-    0x2f,
-    0x2b,
-    0x3c,
-    0xab,
-    0x6b,
-    0x35,
-    0x26,
-    0x16,
-    0xea,
-    0xb3,
-    0xfd,
-    0xe2,
-    0xd9,
-    0x2d,
-    0xf9,
-    0xf1,
-    0xe0,
-    0xbe,
-    0x98,
-    0x5d,
-    0x01,
-    0x6a,
-    0x9e,
-    0x69,
-    0xc4,
-    0xb2,
-    0x5a,
-    0xb7,
-    0x91,
-    0x66,
-    0x2c,
-    0xbb,
-    0x5d,
-    0xbb,
-    0x44,
-    0x6f,
-    0x89,
-    0x9d,
-    0xac,
-    0x48,
-    0x06,
-    0x46,
-    0x89,
-    0x69,
-    0xbe,
-    0x10,
-    0x9e,
-    0x18,
-    0x2f,
-    0x87,
-    0x11,
-    0x6e,
-    0x59,
-    0xc3,
-    0x72,
-    0x52,
-    0xdb,
-    0xf5,
-    0xf9,
-    0xa8,
-    0x59,
-    0x3f,
-    0x0f,
-    0xc5,
-    0x20,
-    0xc9,
-    0x10,
-    0x26,
-    0x0d,
-    0x11,
-    0x50,
-    0x62,
-    0xab,
-    0x82,
-    0x5c,
-    0x5e,
-    0x9b,
-    0x49,
-    0x82,
-    0xc0,
-    0x39,
-    0x64,
-    0x93,
-    0xa6,
-    0x7c,
-    0xfb,
-    0xe7,
-    0x97,
-    0x1e,
-    0xf4,
-    0xa2,
-    0xba,
-    0xfd,
-    0xc2,
-    0x36,
-    0x45,
-    0xc2,
-    0x7d,
-    0x29,
-    0x39,
-    0xc0,
-    0x38,
-    0x19,
-    0x4d,
-    0x1f,
-    0x8f,
-    0xfd,
-    0x27,
-    0x39,
-    0x7f,
-    0xad,
-    0xd2,
-    0x44,
-    0x7b,
-    0xa5,
-    0x6d,
-    0x32,
-    0xbb,
-    0x05,
-    0x20,
-    0xd5,
-    0xd8,
-    0xdd,
-    0x55,
-    0x47,
-    0x96,
-    0xa8,
-    0x24,
-    0x89,
-    0x00,
-    0x16,
-    0x0e,
-    0x6a,
-    0xbb,
-    0x0f,
-    0xef,
-    0xaa,
-    0x94,
-    0xf4,
-    0x2e,
-    0x60,
-    0x5b,
-    0x28,
-    0x37,
-    0x99,
-    0xf4,
-    0xcf,
-    0x2b,
-    0x42,
-    0xab,
-    0xd5,
-    0xd5,
-    0x48,
-    0xc8,
-    0x32,
-    0xe1,
-    0xfd,
-    0x63,
-    0x6d,
-    0x48,
-    0xbe,
-    0x7a,
-    0x5f,
-    0x0f,
-    0xd3,
-    0x41,
-    0x3a,
-    0x31,
-    0x96,
-    0xb9,
-    0xca,
-    0xda,
-    0xd7,
-    0x84,
-    0xfa,
-    0xd5,
-    0x80,
-    0xf8,
-    0x99,
-    0x48,
-    0x75,
-    0x72,
-    0x5e,
-    0x9f,
-    0xbe,
-    0xed,
-    0x2a,
-    0xc6,
-    0xe8,
-    0xd3,
-    0x8e,
-    0x9b,
-    0xa8,
-    0x12,
-    0x8d,
-    0xa3,
-    0xc2,
-    0x73,
-    0xa3,
-    0xfb,
-    0x29,
-    0x28,
-    0x06,
-    0x92,
-    0x68,
-    0xa3,
-    0x2b,
-    0x96,
-    0x40,
-    0xaf,
-    0x8c,
-    0x2c,
-    0x93,
-    0xb9,
-    0xa9,
-    0x64,
-    0x81,
-    0x6e,
-    0x4c,
-    0x6c,
-    0xd0,
-    0x8c,
-    0x12,
-    0x04,
-    0x91,
-    0xf1,
-    0x27,
-    0x31,
-    0x00,
-    0xf9,
-    0x51,
-    0x36,
-    0xad,
-    0x06,
-    0x30,
-    0xc0,
-    0xd9,
-    0x60,
-    0xc4,
-    0x61,
-    0x23,
-    0x40,
-    0x2f,
-    0x3f,
-    0x64,
-    0x27,
-    0xbc,
-    0x0e,
-    0xd7,
-    0x74,
-    0x21,
-    0x3b,
-    0x7d,
-    0x36,
-    0x01,
-    0x6a,
-    0xbf,
-    0x3f,
-    0xb5,
-    0x23,
-    0x56,
-    0x7a,
-    0x4c,
-    0xc8,
-    0x68,
-    0x7e,
-    0xd0,
-    0xcb,
-    0xf3,
-    0x62,
-    0xcb,
-    0x1d,
-    0x6f,
-    0xd3,
-    0x0a,
-    0xea,
-    0xaf,
-    0x65,
-    0xa1,
-    0x83,
-    0x09,
-    0x27,
-    0x30,
-    0x9c,
-    0xb6,
-    0x7a,
-    0x64,
-    0xb7,
-    0x7b,
-    0x23,
-    0xc0,
-    0xe0,
-    0x89,
-    0x9e,
-    0x9d,
-    0x9b,
-    0xa3,
-    0xb5,
-    0x6f,
-    0x1b,
-    0x7e,
-    0x52,
-    0x4b,
-    0xb4,
-    0x6d,
-    0x92,
-    0xa6,
-    0x93,
-    0x3e,
-    0x1a,
-    0x60,
-    0xad,
-    0x5e,
-    0xae,
-    0x01,
-    0xf5,
-    0x44,
-    0x00,
-    0x42,
-    0xd2,
-    0x0d,
-    0xc5,
-    0xcf,
-    0xd0,
-    0x64,
-    0x0e,
-    0x4b,
-    0x96,
-    0xa5,
-    0xd6,
-    0x94,
-    0x18,
-    0x42,
-    0xd7,
-    0x49,
-    0x0d,
-    0x65,
-    0xa3,
-    0x8a,
-    0xa4,
-    0xd7,
-    0xef,
-    0xff,
-    0x72,
-    0x20,
-    0x32,
-    0x1c,
-    0xaf,
-    0xf0,
-    0x6f,
-    0xa3,
-    0xa3,
-    0xbd,
-    0x4e,
-    0x6a,
-    0x5b,
-    0xae,
-    0x72,
-    0x5e,
-    0xa0,
-    0xb8,
-    0x07,
-    0xc8,
-    0x2a,
-    0x07,
-    0x9a,
-    0xcf,
-    0x10,
-    0x9f,
-    0x2e,
-    0x3e,
-    0x83,
-    0x43,
-    0x8c,
-    0x88,
-    0xbc,
-    0x95,
-    0xda,
-    0x0a,
-    0x33,
-    0x80,
-    0x6f,
-    0x8f,
-    0x12,
-    0xd3,
-    0xe6,
-    0x19,
-    0xe9,
-    0x2e,
-    0x71,
-    0xdf,
-    0xa3,
-    0x22,
-    0x70,
-    0x92,
-    0xb9,
-    0x94,
-    0x43,
-    0xe4,
-    0xa5,
-    0x62,
-    0x5c,
-    0x4b,
-    0x9a,
-    0x4a,
-    0x98,
-    0x02,
-    0x72,
-    0x07,
-    0xcf,
-    0x52,
-    0xe8,
-    0xbc,
-    0xaa,
-    0x0f,
-    0x07,
-    0x96,
-    0xb4,
-    0x65,
-    0xe2,
-    0xad,
-    0xb4,
-    0xd5,
-    0x86,
-    0x2c,
-    0x3b,
-    0x7a,
-    0x2d,
-    0xb2,
-    0x79,
-    0x91,
-    0xb4,
-    0xf8,
-    0x54,
-    0x38,
-    0x4f,
-    0xb3,
-    0xbc,
-    0x76,
-    0x7c,
-    0xbc,
-    0x38,
-    0x7c,
-    0x35,
-    0x6e,
-    0xc5,
-    0x2a,
-    0x6a,
-    0x4f,
-    0xe1,
-    0xd5,
-    0xae,
-    0xf3,
-    0xe3,
-    0x48,
-    0x31,
-    0x1e,
-    0x8d,
-    0x08,
-    0xee,
-    0x29,
-    0xe4,
-    0xdd,
-    0x25,
-    0xa7,
-    0x3f,
-    0x8d,
-    0x0c,
-    0x48,
-    0x9f,
-    0xeb,
-    0xc2,
-    0xfd,
-    0x3e,
-    0x10,
-    0x84,
-    0x5c,
-    0x6b,
-    0xe9,
-    0x23,
-    0x47,
-    0x94,
-    0xf2,
-    0xb5,
-    0xc8,
-    0xa5,
-    0x40,
-    0x8b,
-    0x40,
-    0x91,
-    0xc5,
-    0x64,
-    0xc1,
-    0x2d,
-    0xd0,
-    0xe0,
-    0xb8,
-    0x45,
-    0xd3,
-    0x38,
-    0xcf,
-    0xea,
-    0x69,
-    0x2b,
-    0x11,
-    0x09,
-    0x97,
-    0x3c,
-    0x4f,
-    0x42,
-    0x52,
-    0x1a,
-    0xc3,
-    0xf6,
-    0x42,
-    0x60,
-    0xf4,
-    0xa2,
-    0xc6,
-    0x7e,
-    0xd9,
-    0x6c,
-    0x38,
-    0xf7,
-    0x41,
-    0xfc,
-    0x72,
-    0xce,
-    0x73,
-    0x8d,
-    0x91,
-    0x3a,
-    0x11,
-    0x44,
-    0xf9,
-    0xa1,
-    0x42,
-    0xc0,
-    0x99,
-    0xc4,
-    0x0f,
-    0xf2,
-    0x70,
-    0x38,
-    0x0e,
-    0x2f,
-    0x4f,
-    0x15,
-    0x3e,
-    0x83,
-    0xe1,
-    0xf2,
-    0x33,
-    0x49,
-    0xea,
-    0x10,
-    0x73,
-    0xf8,
-    0xcc,
-    0xd5,
-    0x1f,
-    0x40,
-    0x4f,
-    0x7c,
-    0xd6,
-    0x56,
-    0xa1,
-    0x0c,
-    0xd6,
-    0x8c,
-    0x9c,
-    0x86,
-    0x64,
-    0x24,
-    0x48,
-    0x63,
-    0x6f,
-    0x66,
-    0xa1,
-    0x3d,
-    0x70,
-    0xf0,
-    0x9a,
-    0xcd,
-    0x94,
-    0x4e,
-    0x61,
-    0x15,
-    0x1d,
-    0xca,
-    0xe5,
-    0xde,
-    0x05,
-    0x85,
-    0x96,
-    0x65,
-    0xe5,
-    0xc7,
-    0x6b,
-    0x52,
-    0x16,
-    0x94,
-    0x2a,
-    0xe9,
-    0x16,
-    0x80,
-    0xe4,
-    0x84,
-    0x2d,
-    0xc4,
-    0xbe,
-    0x41,
-    0x50,
-    0x90,
-    0xf8,
-    0xf8,
-    0x45,
-    0xa3,
-    0x27,
-    0x70,
-    0x08,
-    0x1a,
-    0xc5,
-    0xd2,
-    0x6e,
-    0x85,
-    0xec,
-    0x5d,
-    0x08,
-    0x40,
-    0x5f,
-    0x5c,
-    0x4a,
-    0x01,
-    0xca,
-    0x55,
-    0xec,
-    0xad,
-    0x4b,
-    0x84,
-    0x91,
-    0x70,
-    0x30,
-    0x87,
-    0xa7,
-    0x0c,
-    0x03,
-    0x5b,
-    0x8e,
-    0x71,
-    0xc4,
-    0x87,
-    0xfc,
-    0x8f,
-    0x75,
-    0x97,
-    0xa0,
-    0x68,
-    0xdc,
-    0xcc,
-    0x05,
-    0x69,
-    0x84,
-    0x12,
-    0xba,
-    0xfa,
-    0x05,
-    0x32,
-    0xb0,
-    0x54,
-    0x85,
-    0x49,
-    0xe3,
-    0x92,
-    0x7f,
-    0x79,
-    0x3c,
-    0x0b,
-    0xc3,
-    0xde,
-    0xb6,
-    0xe0,
-    0xbe,
-    0xc4,
-    0xc1,
-    0xd1,
-    0xfc,
-    0x17,
-    0xe4,
-    0x55,
-    0xeb,
-    0x1a,
-    0xa5,
-    0xe9,
-    0xe2,
-    0x5c,
-    0xad,
-    0xa8,
-    0x61,
-    0xe9,
-    0x28,
-    0x1c,
-    0x9b,
-    0xbd,
-    0x6b,
-    0x54,
-    0x31,
-    0x7e,
-    0xd9,
-    0x36,
-    0x41,
-    0x6a,
-    0x07,
-    0x17,
-    0x9f,
-    0x8e,
-    0x1e,
-    0x89,
-    0x62,
-    0x38,
-    0x81,
-    0x74,
-    0xa3,
-    0xb0,
-    0xb0,
-    0x69,
-    0x81,
-    0x23,
-    0x6d,
-    0x32,
-    0x68,
-    0xe0,
-    0x1d,
-    0xae,
-    0x94,
-    0xc7,
-    0x70,
-    0xdc,
-    0xd0,
-    0xfd,
-    0x44,
-    0x35,
-    0x84,
-    0xe5,
-    0xc7,
-    0x3f,
-    0xee,
-    0x4c,
-    0xdc,
-    0x5f,
-    0xb0,
-    0xe4,
-    0xc1,
-    0xee,
-    0x8b,
-    0xf4,
-    0xee,
-    0x90,
-    0x6a,
-    0x4d,
-    0x40,
-    0xc1,
-    0xa2,
-    0x80,
-    0x56,
-    0xb1,
-    0x78,
-    0x4e,
-    0x3c,
-    0x52,
-    0xe4,
-    0x60,
-    0x46,
-    0xaf,
-    0x94,
-    0x39,
-    0x3f,
-    0x7f,
-    0x34,
-    0x68,
-    0xc3,
-    0xfa,
-    0xed,
-    0x02,
-    0xea,
-    0xeb,
-    0x2b,
-    0x4f,
-    0x27,
-    0x07,
-    0xa4,
-    0xc4,
-    0x6f,
-    0x7d,
-    0x96,
-    0x31,
-    0x9d,
-    0xce,
-    0x4f,
-    0x3c,
-    0x15,
-    0xdf,
-    0xf3,
-    0x0e,
-    0xa7,
-    0x4d,
-    0x7a,
-    0x4c,
-    0xb7,
-    0x00,
-    0xf8,
-    0x49,
-    0x9b,
-    0x03,
-    0x21,
-    0x7a,
-    0x45,
-    0x92,
-    0x0c,
-    0x2a,
-    0x22,
-    0x75,
-    0x37,
-    0x6e,
-    0x41,
-    0x8d,
-    0xcc,
-    0x5c,
-    0xb8,
-    0xad,
-    0x22,
-    0x78,
-    0x44,
-    0xab,
-    0x87,
-    0x6f,
-    0x2f,
-    0xb6,
-    0x3d,
-    0x08,
-    0x77,
-    0xe9,
-    0xc2,
-    0x57,
-    0x2c,
-    0x21,
-    0x54,
-    0x34,
-    0x1a,
-    0x0c,
-    0xb5,
-    0xeb,
-    0xa8,
-    0x83,
-    0x2c,
-    0x35,
-    0x00,
-    0x1a,
-    0xcc,
-    0x67,
-    0x70,
-    0xf5,
-    0xf8,
-    0xea,
-    0x10,
-    0xdd,
-    0x27,
-    0xeb,
-    0xa6,
-    0x92,
-    0xe5,
-    0x53,
-    0xc6,
-    0x63,
-    0x1b,
-    0xfa,
-    0x3e,
-    0xfd,
-    0x8f,
-    0x17,
-    0xb1,
-    0x81,
-    0xae,
-    0xfc,
-    0x81,
-    0xd9,
-    0x8a,
-    0x00,
-    0xf2,
-    0x4b,
-    0x1f,
-    0xbc,
-    0x8d,
-    0x4e,
-    0xda,
-    0x7a,
-    0xc3,
-    0x9d,
-    0x5c,
-    0xea,
-    0xd3,
-    0x8b,
-    0x7b,
-    0x17,
-    0xee,
-    0x96,
-    0x89,
-    0x9a,
-    0x98,
-    0x3e,
-    0xd9,
-    0x0d,
-    0x51,
-    0x18,
-    0x80,
-    0xc3,
-    0x75,
-    0x1e,
-    0x59,
-    0xb6,
-    0x61,
-    0x49,
-    0x4c,
-    0xc1,
-    0xd7,
-    0x62,
-    0xcf,
-    0x10,
-    0xa4,
-    0x15,
-    0xac,
-    0xd4,
-    0x7f,
-    0x47,
-    0x05,
-    0x3b,
-    0x35,
-    0xa9,
-    0x96,
-    0x9f,
-    0x03,
-    0x8d,
-    0x3b,
-    0xfe,
-    0x43,
-    0xf9,
-    0xb2,
-    0xaa,
-    0x4c,
-    0xfa,
-    0xa1,
-    0x41,
-    0x93,
-    0x3b,
-    0xdb,
-    0xe0,
-    0x16,
-    0xd6,
-    0xdf,
-    0x94,
-    0xfa,
-    0x6a,
-    0xa2,
-    0x11,
-    0x72,
-    0x6e,
-    0x8e,
-    0xa7,
-    0xe4,
-    0xc5,
-    0xca,
-    0x71,
-    0x47,
-    0x92,
-    0xbc,
-    0xd0,
-    0xd0,
-    0x4d,
-    0xcc,
-    0x17,
-    0xcd,
-    0x17,
-    0x6b,
-    0x88,
-    0xd1,
-    0x4a,
-    0x54,
-    0x80,
-    0x11,
-    0x55,
-    0x12,
-    0xee,
-    0x0e,
-    0xc7,
-    0xc3,
-    0x09,
-    0x74,
-    0xa9,
-    0x1b,
-    0x43,
-    0x42,
-    0x11,
-    0xac,
-    0x78,
-    0x2c,
-    0xf4,
-    0x64,
-    0x6c,
-    0x3e,
-    0x3c,
-    0x57,
-    0x74,
-    0xc1,
-    0x1a,
-    0xbe,
-    0x73,
-    0x62,
-    0x9e,
-    0x40,
-    0x08,
-    0x91,
-    0x85,
-    0x71,
-    0x06,
-    0x28,
-    0x52,
-    0x99,
-    0x25,
-    0x4d,
-    0xa0,
-    0xb6,
-    0xf7,
-    0x99,
-    0xb6,
-    0xc4,
-    0x1d,
-    0x7a,
-    0x5c,
-    0x3b,
-    0xba,
-    0xd5,
-    0xed,
-    0xda,
-    0x28,
-    0xf0,
-    0xae,
-    0xa3,
-    0xea,
-    0x90,
-    0x5e,
-    0x27,
-    0xe2,
-    0x5e,
-    0x0e,
-    0x03,
-    0xc4,
-    0x8f,
-    0x33,
-    0xab,
-    0xcb,
-    0xc4,
-    0xfa,
-    0x66,
-    0xab,
-    0x2f,
-    0xdb,
-    0x9a,
-    0xc6,
-    0xf8,
-    0x71,
-    0x4a,
-    0xa2,
-    0xdf,
-    0x89,
-    0xdd,
-    0x9b,
-    0x22,
-    0x79,
-    0x21,
-    0xd5,
-    0xa1,
-    0xb3,
-    0x8f,
-    0x75,
-    0x40,
-    0x99,
-    0xd1,
-    0x11,
-    0x8d,
-    0x93,
-    0x81,
-    0x64,
-    0xa3,
-    0x5f,
-    0x34,
-    0x47,
-    0x4e,
-    0xa9,
-    0xb7,
-    0xdd,
-    0x6f,
-    0xdc,
-    0x98,
-    0x0d,
-    0xa2,
-    0x37,
-    0xe8,
-    0x35,
-    0x1f,
-    0x23,
-    0x40,
-    0x1c,
-    0xde,
-    0xc4,
-    0x02,
-    0x29,
-    0xff,
-    0xce,
-    0xe1,
-    0xd3,
-    0x68,
-    0x9a,
-    0xa4,
-    0x59,
-    0xb0,
-    0x79,
-    0x26,
-    0xb3,
-    0x3c,
-    0x48,
-    0xa2,
-    0xc8,
-    0xa7,
-    0x44,
-    0x2d,
-    0xe1,
-    0x67,
-    0x20,
-    0x84,
-    0x5e,
-    0xae,
-    0x55,
-    0x08,
-    0xa8,
-    0x8f,
-    0xba,
-    0x07,
-    0x66,
-    0x62,
-    0x54,
-    0x3d,
-    0xf4,
-    0x69,
-    0x6f,
-    0x9b,
-    0x10,
-    0xb4,
-    0xed,
-    0x47,
-    0xd7,
-    0x41,
-    0xdf,
-    0xe3,
-    0xf1,
-    0x68,
-    0x52,
-    0x12,
-    0x08,
-    0x76,
-    0x6b,
-    0x38,
-    0x7e,
-    0x99,
-    0xb7,
-    0x82,
-    0x5f,
-    0xfc,
-    0xbc,
-    0x27,
-    0x94,
-    0x32,
-    0xd4,
-    0xed,
-    0x5a,
-    0xd8,
-    0x3b,
-    0xee,
-    0xf3,
-    0x76,
-    0x66,
-    0x9c,
-    0x9b,
-    0xa7,
-    0x96,
-    0x03,
-    0xbe,
-    0x7a,
-    0xae,
-    0x4e,
-    0x68,
-    0x17,
-    0x41,
-    0x8d,
-    0xfd,
-    0xa6,
-    0xf0,
-    0xb5,
-    0x2a,
-    0x6c,
-    0xf3,
-    0xe8,
-    0x1b,
-    0x37,
-    0xf5,
-    0xf7,
-    0xef,
-    0xfd,
-    0x25,
-    0x26,
-    0x69,
-    0xc0,
-    0x8a,
-    0x2f,
-    0xe8,
-    0xb4,
-    0x96,
-    0x89,
-    0x99,
-    0xa4,
-    0xff,
-    0xe9,
-    0xeb,
-    0x92,
-    0xca,
-    0x0a,
-    0x43,
-    0x9e,
-    0xa9,
-    0xaa,
-    0xf2,
-    0x29,
-    0x86,
-    0xd5,
-    0x64,
-    0x39,
-    0x60,
-    0x65,
-    0x99,
-    0x1f,
-    0x56,
-    0xca,
-    0xd9,
-    0x58,
-    0x01,
-    0x07,
-    0xa4,
-    0xb2,
-    0x07,
-    0xfd,
-    0xe9,
-    0xaf,
-    0xed,
-    0xec,
-    0x78,
-    0x2e,
-    0x2d,
-    0x37,
-    0xb8,
-    0x48,
-    0x89,
-    0x67,
-    0x9d,
-    0x79,
-    0x9e,
-    0x73,
-    0xd5,
-    0x00,
-    0xbc,
-    0x3f,
-    0x42,
-    0x88,
-    0xf5,
-    0x62,
-    0xad,
-    0x07,
-    0x74,
-    0x2c,
-    0xb9,
-    0xe7,
-    0x11,
-    0xe8,
-    0x15,
-    0x64,
-    0x22,
-    0x5e,
-    0xf6,
-    0x35,
-    0x93,
-    0x9c,
-    0xc5,
-    0x6e,
-    0x39,
-    0xf6,
-    0x14,
-    0xa5,
-    0x63,
-    0x4c,
-    0xd7,
-    0x53,
-    0xb2,
-    0x8b,
-    0xd1,
-    0x7e,
-    0x2b,
-    0x76,
-    0x4c,
-    0x95,
-    0x8b,
-    0xa7,
-    0x0d,
-    0x9c,
-    0xda,
-    0xd0,
-    0x87,
-    0x88,
-    0x43,
-    0x47,
-    0x4f,
-    0xed,
-    0x23,
-    0xc2,
-    0xd0,
-    0xd6,
-    0x60,
-    0x5f,
-    0x40,
-    0xf4,
-    0xfc,
-    0xe7,
-    0xd3,
-    0xfc,
-    0xea,
-    0x53,
-    0x2e,
-    0x4a,
-    0x20,
-    0x8f,
-    0x1e,
-    0xca,
-    0xed,
-    0x7f,
-    0x8a,
-    0x18,
-    0x8d,
-    0x40,
-    0xa6,
-    0xe6,
-    0xfb,
-    0xb0,
-    0x6a,
-    0x9f,
-    0x06,
-    0x30,
-    0x43,
-    0x49,
-    0xa7,
-    0xa8,
-    0x08,
-    0xb0,
-    0x92,
-    0xcc,
-    0x2f,
-    0xc1,
-    0x0b,
-    0x9e,
-    0x41,
-    0x34,
-    0xfb,
-    0x34,
-    0x8b,
-    0x6e,
-    0x43,
-    0xbc,
-    0x17,
-    0xa5,
-    0x50,
-    0xbd,
-    0xda,
-    0x45,
-    0xef,
-    0xa0,
-    0x2f,
-    0x92,
-    0x63,
-    0x6e,
-    0x84,
-    0x8f,
-    0xb6,
-    0xdb,
-    0x53,
-    0x1f,
-    0x4c,
-    0x84,
-    0x55,
-    0x6b,
-    0xbe,
-    0x75,
-    0xf2,
-    0x83,
-    0xe5,
-    0xee,
-    0xfb,
-    0x48,
-    0x34,
-    0x67,
-    0x9b,
-    0x89,
-    0x4b,
-    0xd1,
-    0x8b,
-    0x6c,
-    0xca,
-    0x1f,
-    0x86,
-    0x10,
-    0x63,
-    0x05,
-    0xfd,
-    0x70,
-    0x34,
-    0xff,
-    0x0b,
-    0x8b,
-    0x53,
-    0x96,
-    0xab,
-    0xc2,
-    0xaa,
-    0xdf,
-    0x29,
-    0x81,
-    0x05,
-    0x44,
-    0xd6,
-    0x21,
-    0x69,
-    0x86,
-    0x00,
-    0x0d,
-    0xa8,
-    0x03,
-    0x21,
-    0x24,
-    0x32,
-    0x35,
-    0x57,
-    0x5f,
-    0x2e,
-    0x7c,
-    0x14,
-    0xb4,
-    0xc9,
-    0x1d,
-    0x17,
-    0x3a,
-    0xce,
-    0x8a,
-    0x9b,
-    0x8d,
-    0x78,
-    0xe4,
-    0xce,
-    0x74,
-    0x84,
-    0xbe,
-    0x84,
-    0xc1,
-    0x89,
-    0x24,
-    0x2d,
-    0x79,
-    0x8c,
-    0xdb,
-    0x04,
-    0x35,
-    0xcf,
-    0xeb,
-    0x8a,
-    0xc8,
-    0xeb,
-    0x5b,
-    0x33,
-    0x22,
-    0x1e,
-    0x3c,
-    0x5f,
-    0x75,
-    0xe6,
-    0xe9,
-    0x8b,
-    0x96,
-    0xcf,
-    0x8c,
-    0xc9,
-    0xa5,
-    0x89,
-    0xe4,
-    0x6d,
-    0xf0,
-    0x3d,
-    0x46,
-    0x0a,
-    0x15,
-    0x21,
-    0xe2,
-    0x9d,
-    0x67,
-    0x4b,
-    0x48,
-    0x07,
-    0x93,
-    0xc3,
-    0x2b,
-    0xc1,
-    0x84,
-    0xdb,
-    0x64,
-    0xcb,
-    0x83,
-    0xc3,
-    0x39,
-    0xe5,
-    0xa3,
-    0x58,
-    0xe0,
-    0x02,
-    0x5c,
-    0x3d,
-    0x3f,
-    0xfa,
-    0x76,
-    0x2d,
-    0xf6,
-    0x7f,
-    0x28,
-    0x8f,
-    0x9f,
-    0x52,
-    0x82,
-    0x4b,
-    0x54,
-    0xb6,
-    0x08,
-    0xdd,
-    0x72,
-    0x26,
-    0xa0,
-    0xa8,
-    0x9d,
-    0x43,
-    0xae,
-    0x8c,
-    0x05,
-    0x10,
-    0x7d,
-    0xba,
-    0xe7,
-    0x61,
-    0xe1,
-    0xc7,
-    0x56,
-    0x91,
-    0x1a,
-    0x00,
-    0x3b,
-    0x74,
-    0xfc,
-    0xfe,
-    0x9b,
-    0x8c,
-    0x4d,
-    0x7a,
-    0x18,
-    0x80,
-    0x6f,
-    0x62,
-    0xbb,
-    0xc9,
-    0x3e,
-    0x2b,
-    0xf0,
-    0xaf,
-    0x3c,
-    0x6a,
-    0xd2,
-    0x74,
-    0xec,
-    0x9e,
-    0xa9,
-    0xcf,
-    0x7b,
-    0x50,
-    0xb1,
-    0x9c,
-    0xa5,
-    0x5f,
-    0x1e,
-    0xd1,
-    0xd7,
-    0x95,
-    0x5c,
-    0xb4,
-    0x91,
-    0x7d,
-    0x9b,
-    0x4b,
-    0x0f,
-    0x79,
-    0x8b,
-    0x14,
-    0x28,
-    0x0f,
-    0x64,
-    0xf7,
-    0x76,
-    0x84,
-    0x2a,
-    0x79,
-    0xb7,
-    0xac,
-    0x2f,
-    0x32,
-    0x73,
-    0x00,
-    0xd9,
-    0x81,
-    0xe0,
-    0xf1,
-    0xa5,
-    0x7e,
-    0x02,
-    0x7c,
-    0x6c,
-    0x30,
-    0x16,
-    0xff,
-    0xe6,
-    0x01,
-    0x31,
-    0x4b,
-    0x6c,
-    0x6e,
-    0x25,
-    0xfa,
-    0x02,
-    0x03,
-    0xa4,
-    0x03,
-    0x94,
-    0x87,
-    0xa8,
-    0x8b,
-    0x80,
-    0x74,
-    0x11,
-    0xfe,
-    0x55,
-    0xaa,
-    0x90,
-    0x5f,
-    0xda,
-    0x63,
-    0xc5,
-    0xdc,
-    0x53,
-    0x6a,
-    0xa4,
-    0xa6,
-    0xff,
-    0x88,
-    0x1d,
-    0xff,
-    0xe5,
-    0x3f,
-    0xfc,
-    0x95,
-    0xd1,
-    0xbb,
-    0x0e,
-    0x0e,
-    0x99,
-    0x06,
-    0x85,
-    0xe4,
-    0xa4,
-    0x7b,
-    0x9d,
-    0x73,
-    0xad,
-    0x7d,
-    0x80,
-    0x50,
-    0xc5,
-    0x69,
-    0x67,
-    0xdd,
-    0x97,
-    0xc8,
-    0x03,
-    0x1a,
-    0xf0,
-    0xca,
-    0x1b,
-    0xbe,
-    0x7f,
-    0xf0,
-    0x76,
-    0x87,
-    0xd9,
-    0x08,
-    0xfb,
-    0xce,
-    0xbf,
-    0x5e,
-    0x17,
-    0x5e,
-    0xa4,
-    0x31,
-    0x5f,
-    0x86,
-    0x6a,
-    0x64,
-    0x77,
-    0x6d,
-    0x6d,
-    0x76,
-    0x32,
-    0xa6,
-    0xc2,
-    0xb4,
-    0xfa,
-    0x04,
-    0xc1,
-    0xad,
-    0x73,
-    0xb0,
-    0xc0,
-    0xe7,
-    0x5b,
-    0x78,
-    0x22,
-    0xd0,
-    0xb5,
-    0x6a,
-    0x91,
-    0xf7,
-    0x26,
-    0xa2,
-    0x87,
-    0x7c,
-    0x9f,
-    0x60,
-    0x13,
-    0xc6,
-    0x3c,
-    0x5e,
-    0xda,
-    0x73,
-    0x6c,
-    0x60,
-    0x5c,
-    0x95,
-    0x53,
-    0x0c,
-    0x78,
-    0x1b,
-    0x6c,
-    0xfc,
-    0x32,
-    0x8d,
-    0x73,
-    0x12,
-    0xb5,
-    0xfd,
-    0x82,
-    0x0b,
-    0x94,
-    0x3a,
-    0x7a,
-    0x57,
-    0x55,
-    0x46,
-    0xa4,
-    0x28,
-    0x30,
-    0x0a,
-    0x98,
-    0xca,
-    0x14,
-    0x49,
-    0x5e,
-    0x32,
-    0xeb,
-    0xd3,
-    0xd4,
-    0xd9,
-    0x1f,
-    0xfb,
-    0x4f,
-    0xcb,
-    0x5d,
-    0x4a,
-    0x85,
-    0xfa,
-    0x99,
-    0x75,
-    0xab,
-    0xd9,
-    0x52,
-    0x8d,
-    0xda,
-    0x26,
-    0x17,
-    0x76,
-    0xb7,
-    0x07,
-    0x4a,
-    0x9a,
-    0x53,
-    0x59,
-    0x24,
-    0xde,
-    0x50,
-    0x45,
-    0xf9,
-    0xd6,
-    0x46,
-    0x14,
-    0xbd,
-    0x34,
-    0x64,
-    0x44,
-    0xc8,
-    0x87,
-    0x5b,
-    0xdb,
-    0xd6,
-    0x22,
-    0x77,
-    0xfb,
-    0x52,
-    0x59,
-    0x0f,
-    0xb7,
-    0xd4,
-    0xf4,
-    0x20,
-    0x25,
-    0xe8,
-    0xdd,
-    0x35,
-    0xb4,
-    0x11,
-    0x1c,
-    0x8a,
-    0xc0,
-    0x0d,
-    0x05,
-    0x70,
-    0x64,
-    0x5b,
-    0xb0,
-    0xf3,
-    0x90,
-    0xfb,
-    0xaa,
-    0xbb,
-    0x5b,
-    0x75,
-    0xea,
-    0x30,
-    0x9a,
-    0x1c,
-    0x07,
-    0xe2,
-    0xb1,
-    0x94,
-    0xa8,
-    0x27,
-    0xa9,
-    0x92,
-    0x3b,
-    0x06,
-    0x83,
-    0xe3,
-    0xea,
-    0x53,
-    0xcc,
-    0xb0,
-    0xca,
-    0x1c,
-    0x72,
-    0x00,
-    0x56,
-    0x44,
-    0xd6,
-    0x7e,
-    0x1d,
-    0x6e,
-    0x22,
-    0x7d,
-    0xb7,
-    0x1c,
-    0xdd,
-    0x39,
-    0xfd,
-    0x18,
-    0xbd,
-    0x5f,
-    0x7a,
-    0x14,
-    0xbc,
-    0xd0,
-    0x1c,
-    0x8d,
-    0x6d,
-    0xa2,
-    0x2f,
-    0xf5,
-    0x91,
-    0x68,
-    0x8c,
-    0x10,
-    0xe6,
-    0xb4,
-    0x0e,
-    0x9f,
-    0x3f,
-    0xda,
-    0x46,
-    0x3c,
-    0xd9,
-    0xf6,
-    0x70,
-    0x85,
-    0xed,
-    0x30,
-    0xa5,
-    0x7c,
-    0x82,
-    0x3e,
-    0x52,
-    0x2e,
-    0x85,
-    0x2b,
-    0xe8,
-    0x93,
-    0x1b,
-    0x57,
-    0xd5,
-    0xb6,
-    0x36,
-    0xc0,
-    0xb4,
-    0x15,
-    0x67,
-    0x7f,
-    0xc0,
-    0x4b,
-    0xf3,
-    0x96,
-    0x8f,
-    0xec,
-    0x28,
-    0xe8,
-    0xfd,
-    0xb1,
-    0xf1,
-    0x89,
-    0x66,
-    0xd5,
-    0xa9,
-    0x38,
-    0x18,
-    0xbe,
-    0x2d,
-    0x2a,
-    0x07,
-    0xe0,
-    0x35,
-    0x0a,
-    0xc3,
-    0xdf,
-    0xe4,
-    0x3d,
-    0xa8,
-    0xf3,
-    0x9d,
-    0x6a,
-    0x54,
-    0x91,
-    0x19,
-    0x3a,
-    0x5f,
-    0x48,
-    0xb6,
-    0x5c,
-    0x46,
-    0xe9,
-    0x12,
-    0xcd,
-    0xa7,
-    0xea,
-    0xd9,
-    0x56,
-    0xb4,
-    0x0c,
-    0xdb,
-    0x56,
-    0xe2,
-    0x3c,
-    0x62,
-    0xc1,
-    0xe1,
-    0xb7,
-    0xc2,
-    0x69,
-    0xd1,
-    0x72,
-    0x31,
-    0x7c,
-    0xb3,
-    0xb9,
-    0xd9,
-    0x4e,
-    0x1d,
-    0x16,
-    0x2c,
-    0x59,
-    0x32,
-    0x74,
-    0x78,
-    0x83,
-    0xd2,
-    0x84,
-    0xbb,
-    0x9f,
-    0x0e,
-    0x60,
-    0xb8,
-    0x35,
-    0xdf,
-    0x6f,
-    0x4a,
-    0x86,
-    0x17,
-    0x88,
-    0xf9,
-    0xcb,
-    0x97,
-    0x5a,
-    0xcb,
-    0xbe,
-    0xc3,
-    0x0b,
-    0x5c,
-    0x5b,
-    0x33,
-    0x1f,
-    0x31,
-    0xe8,
-    0xab,
-    0x9c,
-    0x4a,
-    0x33,
-    0x4e,
-    0x6b,
-    0xf6,
-    0x1b,
-    0x0e,
-    0x02,
-    0xec,
-    0x51,
-    0x67,
-    0x40,
-    0x96,
-    0x60,
-    0x4d,
-    0x98,
-    0xb0,
-    0xeb,
-    0x63,
-    0x72,
-    0x12,
-    0x36,
-    0x6d,
-    0xce,
-    0xca,
-    0xe9,
-    0x08,
-    0x2b,
-    0x6e,
-    0x10,
-    0x99,
-    0xa7,
-    0xb1,
-    0x65,
-    0x83,
-    0x67,
-    0x33,
-    0xd2,
-    0x9d,
-    0x39,
-    0x9e,
-    0x32,
-    0xe3,
-    0x78,
-    0xee,
-    0x58,
-    0x6b,
-    0x31,
-    0x10,
-    0x52,
-    0x9b,
-    0x83,
-    0xaf,
-    0xee,
-    0x9a,
-    0x4c,
-    0x4b,
-    0x7e,
-    0x04,
-    0x02,
-    0x8b,
-    0xd9,
-    0xe2,
-    0xde,
-    0xd4,
-    0xa2,
-    0xd9,
-    0x40,
-    0x1a,
-    0xcd,
-    0xa1,
-    0x4f,
-    0xf6,
-    0x5e,
-    0xb9,
-    0xdf,
-    0xf9,
-    0x74,
-    0x59,
-    0x99,
-    0x41,
-    0x87,
-    0xa9,
-    0x55,
-    0x49,
-    0xee,
-    0x30,
-    0xcb,
-    0x05,
-    0xa4,
-    0x8f,
-    0x6b,
-    0x2f,
-    0x4b,
-    0x6f,
-    0x89,
-    0xdc,
-    0x71,
-    0xb8,
-    0xbd,
-    0x52,
-    0x13,
-    0x03,
-    0x8a,
-    0x1d,
-    0x5f,
-    0x53,
-    0x3d,
-    0x60,
-    0xbe,
-    0xff,
-    0x18,
-    0x6a,
-    0x12,
-    0xf3,
-    0xb0,
-    0x89,
-    0x3c,
-    0x19,
-    0x94,
-    0x23,
-    0xe2,
-    0x11,
-    0x2f,
-    0x02,
-    0x6f,
-    0x28,
-    0xf0,
-    0xf0,
-    0x5b,
-    0x88,
-    0xa8,
-    0x84,
-    0xac,
-    0xac,
-    0x33,
-    0x3b,
-    0xbd,
-    0x17,
-    0x5a,
-    0xca,
-    0x3e,
-    0x46,
-    0xf8,
-    0xb3,
-    0x7c,
-    0xe3,
-    0x5c,
-    0x17,
-    0xe2,
-    0x3b,
-    0xef,
-    0xcb,
-    0xc0,
-    0xf2,
-    0x16,
-    0xae,
-    0x4c,
-    0xf5,
-    0x5a,
-    0x39,
-    0xe7,
-    0xb1,
-    0xc7,
-    0x57,
-    0xa1,
-    0x83,
-    0x91,
-    0x77,
-    0xfe,
-    0x6f,
-    0xfe,
-    0xe0,
-    0xfb,
-    0x14,
-    0x7f,
-    0x45,
-    0x4c,
-    0xdf,
-    0x20,
-    0x9a,
-    0xe8,
-    0x80,
-    0x23,
-    0x26,
-    0xc7,
-    0x9a,
-    0xe8,
-    0xd8,
-    0xea,
-    0xbf,
-    0x11,
-    0xde,
-    0x9d,
-    0x9b,
-    0xe3,
-    0x74,
-    0xf9,
-    0x6f,
-    0xee,
-    0xfa,
-    0xac,
-    0xc2,
-    0xf0,
-    0x4a,
-    0xfd,
-    0x53,
-    0xf7,
-    0x48,
-    0x0a,
-    0x51,
-    0xc6,
-    0xbb,
-    0x54,
-    0xce,
-    0x7a,
-    0x5b,
-    0x7e,
-    0x72,
-    0x6d,
-    0x2a,
-    0x52,
-    0x6c,
-    0x5b,
-    0x08,
-    0x05,
-    0xae,
-    0xc3,
-    0x82,
-    0xbc,
-    0x5a,
-    0x90,
-    0xec,
-    0x4e,
-    0x77,
-    0xf9,
-    0xaf,
-    0x4c,
-    0xe9,
-    0xa6,
-    0xe3,
-    0x3f,
-    0xa0,
-    0x14,
-    0x21,
-    0x30,
-    0x0f,
-    0x3a,
-    0x92,
-    0x6e,
-    0xe0,
-    0x6d,
-    0x4c,
-    0x8b,
-    0xe6,
-    0x81,
-    0xdf,
-    0xa8,
-    0x53,
-    0x31,
-    0x2a,
-    0xf2,
-    0x2b,
-    0xc0,
-    0x74,
-    0x6d,
-    0xf8,
-    0xe1,
-    0xb8,
-    0xf1,
-    0xc0,
-    0xd5,
-    0x3f,
-    0x72,
-    0x34,
-    0xd3,
-    0x74,
-    0x84,
-    0x2a,
-    0xac,
-    0xf5,
-    0x1d,
-    0x4d,
-    0xaf,
-    0xe6,
-    0x9d,
-    0x13,
-    0xca,
-    0x8a,
-    0x0d,
-    0xf0,
-    0xf3,
-    0x14,
-    0xa4,
-    0xca,
-    0xc6,
-    0xba,
-    0x90,
-    0xac,
-    0x70,
-    0x0c,
-    0xf3,
-    0xbe,
-    0xcb,
-    0x84,
-    0x2b,
-    0x75,
-    0xca,
-    0x5e,
-    0x56,
-    0x07,
-    0x18,
-    0xa9,
-    0x15,
-    0x22,
-    0xfc,
-    0x9f,
-    0x91,
-    0xdd,
-    0x80,
-    0x32,
-    0xbc,
-    0xef,
-    0xd2,
-    0xe7,
-    0xda,
-    0x1e,
-    0xea,
-    0xe7,
-    0x3f,
-    0xfb,
-    0x6d,
-    0x54,
-    0x5a,
-    0xcd,
-    0xd2,
-    0xd9,
-    0xf2,
-    0xcb,
-    0xc3,
-    0x85,
-    0xb0,
-    0x8e,
-    0xc6,
-    0xd9,
-    0xde,
-    0xc5,
-    0x1c,
-    0x1f,
-    0x6e,
-    0x2b,
-    0xe9,
-    0xfe,
-    0x3e,
-    0xb6,
-    0x96,
-    0x4c,
-    0x9a,
-    0x11,
-    0x74,
-    0x23,
-    0x03,
-    0x4d,
-    0xa2,
-    0x37,
-    0x2e,
-    0xd4,
-    0x30,
-    0x66,
-    0x50,
-    0x9e,
-    0x84,
-    0x91,
-    0x99,
-    0xa7,
-    0xfd,
-    0xab,
-    0xfe,
-    0xa0,
-    0xd7,
-    0x0f,
-    0x3c,
-    0xe4,
-    0x4f,
-    0x17,
-    0x1a,
-    0xaf,
-    0x07,
-    0xea,
-    0xee,
-    0x8a,
-    0xab,
-    0x95,
-    0x62,
-    0x0a,
-    0xd5,
-    0x5e,
-    0x78,
-    0xba,
-    0x2e,
-    0x54,
-    0xcc,
-    0x56,
-    0xd7,
-    0x2b,
-    0x1a,
-    0x3a,
-    0x07,
-    0x47,
-    0xff,
-    0x19,
-    0xf5,
-    0x17,
-    0x04,
-    0xf2,
-    0xf8,
-    0xa4,
-    0xd8,
-    0x40,
-    0xec,
-    0x6a,
-    0xdd,
-    0x72,
-    0xd9,
-    0x66,
-    0xe6,
-    0x9a,
-    0xcf,
-    0x70,
-    0x40,
-    0x69,
-    0x14,
-    0xcb,
-    0xef,
-    0x5b,
-    0x82,
-    0xfb,
-    0x39,
-    0x2f,
-    0x2a,
-    0xd6,
-    0x69,
-    0x9a,
-    0x3d,
-    0xde,
-    0xcd,
-    0x3c,
-    0x2d,
-    0xce,
-    0x01,
-    0xd3,
-    0x0f,
-    0x73,
-    0x6f,
-    0xaf,
-    0x44,
-    0xbd,
-    0x17,
-    0x66,
-    0x58,
-    0x16,
-    0x8c,
-    0xc8,
-    0x2a,
-    0xf2,
-    0x3f,
-    0x15,
-    0x4d,
-    0xa8,
-    0x00,
-    0x6e,
-    0xaf,
-    0x80,
-    0xc2,
-    0x8a,
-    0x78,
-    0x0d,
-    0x9f,
-    0xaa,
-    0x35,
-    0xbd,
-    0x1c,
-    0xcf,
-    0x36,
-    0xae,
-    0xad,
-    0x2a,
-    0x34,
-    0xc3,
-    0x7c,
-    0xd4,
-    0x38,
-    0xf8,
-    0x66,
-    0xbf,
-    0xb7,
-    0xf2,
-    0x46,
-    0xed,
-    0x02,
-    0xdb,
-    0x77,
-    0xdf,
-    0xde,
-    0x6c,
-    0x94,
-    0x51,
-    0x6e,
-    0x4b,
-    0x82,
-    0x24,
-    0x5a,
-    0x98,
-    0xb1,
-    0x9c,
-    0x2a,
-    0xc2,
-    0x9e,
-    0xcb,
-    0xf3,
-    0xa0,
-    0x9d,
-    0x4d,
-    0x36,
-    0xbd,
-    0xd5,
-    0x36,
-    0x05,
-    0xf3,
-    0x8c,
-    0x49,
-    0x67,
-    0x3b,
-    0xa5,
-    0x6b,
-    0xfe,
-    0xc3,
-    0x66,
-    0x57,
-    0xe7,
-    0x41,
-    0x7f,
-    0x92,
-    0xe2,
-    0x88,
-    0x48,
-    0xa2,
-    0xb3,
-    0x58,
-    0x4b,
-    0x7b,
-    0xc8,
-    0x7b,
-    0x02,
-    0x3a,
-    0x1b,
-    0x0d,
-    0xe2,
-    0x15,
-    0x5a,
-    0x1c,
-    0x98,
-    0x92,
-    0x46,
-    0x71,
-    0x92,
-    0xf8,
-    0x59,
-    0xac,
-    0xc1,
-    0x03,
-    0xab,
-    0x97,
-    0x9d,
-    0xdc,
-    0x16,
-    0xb4,
-    0x6a,
-    0x48,
-    0x98,
-    0x18,
-    0xba,
-    0x20,
-    0xfa,
-    0x7c,
-    0x34,
-    0x01,
-    0xaf,
-    0x92,
-    0x93,
-    0x44,
-    0xff,
-    0x95,
-    0xf2,
-    0x31,
-    0x65,
-    0x24,
-    0x46,
-    0x6f,
-    0x35,
-    0x50,
-    0x2c,
-    0xbf,
-    0x81,
-    0xf4,
-    0xe5,
-    0xeb,
-    0x3e,
-    0x45,
-    0x9e,
-    0xf8,
-    0xa3,
-    0xa9,
-    0xf5,
-    0xa3,
-    0xd2,
-    0xcd,
-    0xba,
-    0x0c,
-    0xba,
-    0xf1,
-    0xf2,
-    0xac,
-    0x3c,
-    0x87,
-    0x22,
-    0x8c,
-    0x8c,
-    0xfd,
-    0xca,
-    0xb9,
-    0xdb,
-    0xd7,
-    0x2f,
-    0xf3,
-    0x33,
-    0x00,
-    0x5d,
-    0xa5,
-    0xa2,
-    0x62,
-    0x6d,
-    0x1a,
-    0x9a,
-    0xb4,
-    0x04,
-    0xed,
-    0x98,
-    0x93,
-    0x1c,
-    0xc1,
-    0x04,
-    0xd5,
-    0x07,
-    0x33,
-    0x58,
-    0x1a,
-    0xb0,
-    0x0d,
-    0x85,
-    0xa3,
-    0x25,
-    0xbc,
-    0x93,
-    0x68,
-    0x52,
-    0x05,
-    0x87,
-    0x64,
-    0x0f,
-    0xf3,
-    0x89,
-    0x34,
-    0x5e,
-    0x14,
-    0x46,
-    0xe0,
-    0xed,
-    0xe5,
-    0x94,
-    0xf9,
-    0xe3,
-    0x8a,
-    0x54,
-    0xe4,
-    0xd9,
-    0xc2,
-    0x9d,
-    0x75,
-    0x25,
-    0x1b,
-    0x17,
-    0xc0,
-    0x5f,
-    0x62,
-    0xa4,
-    0x2b,
-    0x1e,
-    0x5e,
-    0x46,
-    0xc8,
-    0x03,
-    0xbe,
-    0x3d,
-    0xe2,
-    0xf9,
-    0x4f,
-    0x6f,
-    0xd6,
-    0xba,
-    0x72,
-    0x0d,
-    0x24,
-    0x96,
-    0xce,
-    0x74,
-    0xc6,
-    0x70,
-    0x42,
-    0x51,
-    0xc1,
-    0x09,
-    0x1d,
-    0x09,
-    0xf9,
-    0x81,
-    0x92,
-    0x58,
-    0x49,
-    0x1a,
-    0x66,
-    0x38,
-    0xd3,
-    0x40,
-    0xec,
-    0x04,
-    0x95,
-    0xc6,
-    0x33,
-    0xdd,
-    0x3e,
-    0x73,
-    0x7e,
-    0x4d,
-    0x3f,
-    0xbd,
-    0xf4,
-    0x2a,
-    0x24,
-    0xd4,
-    0x99,
-    0xbd,
-    0x25,
-    0xe2,
-    0x7d,
-    0x24,
-    0xf8,
-    0x91,
-    0x34,
-    0xf5,
-    0xea,
-    0xcf,
-    0x85,
-    0x24,
-    0x2e,
-    0xce,
-    0x66,
-    0x27,
-    0x75,
-    0x4e,
-    0x29,
-    0x57,
-    0xbf,
-    0x1e,
-    0xf0,
-    0x9a,
-    0x70,
-    0xe0,
-    0x66,
-    0x3f,
-    0xa6,
-    0x0e,
-    0xb1,
-    0x29,
-    0xca,
-    0x3a,
-    0xa2,
-    0x30,
-    0x65,
-    0x9a,
-    0x2f,
-    0xc4,
-    0x35,
-    0xc3,
-    0x24,
-    0xd3,
-    0x81,
-    0xb5,
-    0x15,
-    0xed,
-    0xa9,
-    0x18,
-    0x97,
-    0xa7,
-    0x01,
-    0xc5,
-    0xb0,
-    0x3d,
-    0xdf,
-    0x88,
-    0x8b,
-    0x7b,
-    0xf3,
-    0x24,
-    0x70,
-    0xdd,
-    0xd7,
-    0x98,
-    0xf4,
-    0xf5,
-    0xe7,
-    0xa1,
-    0x6d,
-    0x0d,
-    0x53,
-    0x80,
-    0xa9,
-    0x0e,
-    0x73,
-    0xfd,
-    0xe0,
-    0xa0,
-    0x5a,
-    0xac,
-    0xe6,
-    0x93,
-    0xad,
-    0x6f,
-    0xa5,
-    0x7e,
-    0xb6,
-    0x3c,
-    0xcb,
-    0xa5,
-    0xb4,
-    0x21,
-    0xc0,
-    0x20,
-    0x75,
-    0x85,
-    0xdb,
-    0x3a,
-    0x27,
-    0xb0,
-    0xd5,
-    0x18,
-    0x6c,
-    0x8e,
-    0x7e,
-    0x9b,
-    0xac,
-    0xaf,
-    0xae,
-    0x86,
-    0xaf,
-    0x93,
-    0x7f,
-    0xe4,
-    0x6b,
-    0x25,
-    0xb9,
-    0xa4,
-    0x1a,
-    0x85,
-    0x8e,
-    0x87,
-    0x90,
-    0x0a,
-    0x88,
-    0x3c,
-    0xcc,
-    0x88,
-    0xbf,
-    0xc9,
-    0xcd,
-    0xce,
-    0x4f,
-    0x2c,
-    0xa7,
-    0x73,
-    0x09,
-    0x42,
-    0xd5,
-    0xd3,
-    0x69,
-    0xe9,
-    0xd1,
-    0x54,
-    0xc8,
-    0x61,
-    0xe2,
-    0xee,
-    0xd3,
-    0xf9,
-    0x35,
-    0xea,
-    0x3c,
-    0xe7,
-    0x30,
-    0xe9,
-    0xb0,
-    0x77,
-    0x03,
-    0x29,
-    0x08,
-    0x68,
-    0x80,
-    0x04,
-    0xc3,
-    0x92,
-    0x2c,
-    0xb9,
-    0xb4,
-    0xcd,
-    0x96,
-    0x6f,
-    0xf8,
-    0x0f,
-    0xe7,
-    0x77,
-    0x2b,
-    0xd4,
-    0xbb,
-    0xd2,
-    0xdb,
-    0xc3,
-    0x2f,
-    0xf3,
-    0x3d,
-    0x8e,
-    0x3b,
-    0xc5,
-    0x1f,
-    0x1a,
-    0x43,
-    0xf0,
-    0x1e,
-    0xe0,
-    0xe8,
-    0x59,
-    0x19,
-    0x93,
-    0x24,
-    0xe7,
-    0xe6,
-    0x02,
-    0x96,
-    0x8d,
-    0x43,
-    0x41,
-    0x1a,
-    0x85,
-    0x0f,
-    0x03,
-    0x9d,
-    0xd9,
-    0xba,
-    0x4b,
-    0x30,
-    0x28,
-    0xfa,
-    0x44,
-    0x5a,
-    0xa7,
-    0xbf,
-    0x6c,
-    0xb3,
-    0x66,
-    0x6a,
-    0xf8,
-    0xae,
-    0xd5,
-    0x39,
-    0x75,
-    0xb7,
-    0x86,
-    0x06,
-    0xab,
-    0x7e,
-    0x34,
-    0x32,
-    0xc6,
-    0x92,
-    0x05,
-    0xdc,
-    0xb8,
-    0x31,
-    0x0c,
-    0x56,
-    0xd9,
-    0x5f,
-    0x12,
-    0xd9,
-    0xd0,
-    0x35,
-    0x96,
-    0x77,
-    0xb7,
-    0x7c,
-    0x12,
-    0x52,
-    0x7a,
-    0x7a,
-    0x80,
-    0x0c,
-    0x80,
-    0x0c,
-    0x1d,
-    0x7e,
-    0x8e,
-    0xf5,
-    0x6d,
-    0xad,
-    0xe8,
-    0x76,
-    0x7f,
-    0xf9,
-    0xb9,
-    0x1f,
-    0x72,
-    0x98,
-    0xb4,
-    0xe4,
-    0x38,
-    0x43,
-    0xfc,
-    0x73,
-    0x9a,
-    0x2f,
-    0x41,
-    0xc5,
-    0x7c,
-    0x3f,
-    0x2c,
-    0xf3,
-    0x63,
-    0x78,
-    0xfe,
-    0x4c,
-    0x34,
-    0xb5,
-    0x74,
-    0xa4,
-    0x3f,
-    0x9c,
-    0xed,
-    0xee,
-    0x7b,
-    0xd0,
-    0xce,
-    0x0e,
-    0x13,
-    0x68,
-    0x26,
-    0xe8,
-    0x22,
-    0xa1,
-    0x8e,
-    0xbd,
-    0xbb,
-    0xcf,
-    0x54,
-    0xb7,
-    0x2d,
-    0x9a,
-    0xd8,
-    0xc2,
-    0x85,
-    0x66,
-    0x35,
-    0x9e,
-    0x54,
-    0x13,
-    0x24,
-    0x32,
-    0xb2,
-    0xe7,
-    0x1e,
-    0x24,
-    0x82,
-    0xc8,
-    0xc1,
-    0xa6,
-    0xf8,
-    0xaf,
-    0x75,
-    0x93,
-    0x59,
-    0x59,
-    0x4f,
-    0xba,
-    0x02,
-    0x40,
-    0x36,
-    0x7a,
-    0xac,
-    0xc9,
-    0x44,
-    0x8f,
-    0xee,
-    0xbf,
-    0x6e,
-    0x2b,
-    0x03,
-    0x00,
-    0x68,
-    0x48,
-    0xce,
-    0x76,
-    0xc3,
-    0x3d,
-    0x1b,
-    0x49,
-    0x59,
-    0x90,
-    0x28,
-    0x53,
-    0xea,
-    0x0c,
-    0x64,
-    0xd5,
-    0x07,
-    0x13,
-    0x76,
-    0x68,
-    0x2f,
-    0x35,
-    0x81,
-    0x36,
-    0x39,
-    0x01,
-    0xa7,
-    0x69,
-    0xf1,
-    0x1a,
-    0xcc,
-    0xe4,
-    0x06,
-    0x8e,
-    0x9c,
-    0x31,
-    0x24,
-    0x64,
-    0xcf,
-    0xbb,
-    0x5d,
-    0x74,
-    0xab,
-    0x3e,
-    0xcd,
-    0x7c,
-    0xcb,
-    0x7b,
-    0x7e,
-    0x6f,
-    0x20,
-    0x30,
-    0x89,
-    0x10,
-    0x35,
-    0x47,
-    0x7e,
-    0xc0,
-    0xb7,
-    0x4e,
-    0x06,
-    0x94,
-    0x34,
-    0x27,
-    0xc7,
-    0xab,
-    0x23,
-    0x01,
-    0x88,
-    0xbf,
-    0x25,
-    0x87,
-    0x96,
-    0xf9,
-    0x8a,
-    0x56,
-    0x66,
-    0x0a,
-    0x17,
-    0xb5,
-    0x7b,
-    0x77,
-    0x06,
-    0x80,
-    0x8a,
-    0x34,
-    0x4f,
-    0x66,
-    0xdd,
-    0x75,
-    0x26,
-    0x55,
-    0xf5,
-    0xc1,
-    0xc5,
-    0x31,
-    0x73,
-    0x48,
-    0x6b,
-    0xcc,
-    0x39,
-    0x76,
-    0xa5,
-    0x13,
-    0xcc,
-    0xc8,
-    0xcc,
-    0x85,
-    0xfc,
-    0xdf,
-    0xcf,
-    0xea,
-    0xc8,
-    0xd3,
-    0x32,
-    0x41,
-    0x7c,
-    0xc9,
-    0x57,
-    0xfa,
-    0x1c,
-    0xc8,
-    0xfd,
-    0x65,
-    0x05,
-    0xc8,
-    0x06,
-    0x6b,
-    0xd2,
-    0x0c,
-    0x7d,
-    0x7c,
-    0x7d,
-    0xb2,
-    0xd7,
-    0xc8,
-    0xc6,
-    0x89,
-    0x79,
-    0xb2,
-    0xd9,
-    0x22,
-    0x7b,
-    0x81,
-    0x2b,
-    0x2a,
-    0xac,
-    0x59,
-    0xa5,
-    0xf6,
-    0xd6,
-    0x6b,
-    0x04,
-    0x60,
-    0x43,
-    0x68,
-    0x80,
-    0xd2,
-    0x7f,
-    0x3b,
-    0xab,
-    0xa0,
-    0x60,
-    0xf7,
-    0x9d,
-    0x9b,
-    0x44,
-    0x0e,
-    0x4e,
-    0xe3,
-    0x9a,
-    0xc5,
-    0x43,
-    0xfc,
-    0xa4,
-    0xe4,
-    0x6d,
-    0x24,
-    0x7a,
-    0xb2,
-    0x4e,
-    0xe4,
-    0x53,
-    0x20,
-    0x5d,
-    0xe6,
-    0x00,
-    0x45,
-    0xac,
-    0x06,
-    0xb9,
-    0x0a,
-    0xc8,
-    0xab,
-    0x1c,
-    0x27,
-    0xe0,
-    0x58,
-    0x73,
-    0x4e,
-    0x2a,
-    0x7e,
-    0x36,
-    0xa5,
-    0x83,
-    0x95,
-    0xd1,
-    0x7a,
-    0x56,
-    0x6a,
-    0xa6,
-    0x33,
-    0xbe,
-    0xbb,
-    0x56,
-    0x83,
-    0xef,
-    0x01,
-    0x3c,
-    0xe4,
-    0xd2,
-    0x8d,
-    0x3b,
-    0x41,
-    0xef,
-    0xd6,
-    0xba,
-    0xf2,
-    0x90,
-    0x12,
-    0xec,
-    0xee,
-    0x23,
-    0x03,
-    0x55,
-    0x3c,
-    0xe1,
-    0x14,
-    0x8a,
-    0xab,
-    0xad,
-    0xa4,
-    0x38,
-    0xc3,
-    0x3f,
-    0xa2,
-    0x67,
-    0xfb,
-    0x81,
-    0x5a,
-    0x00,
-    0x2d,
-    0x39,
-    0x8e,
-    0x8d,
-    0x46,
-    0xe9,
-    0xc9,
-    0x41,
-    0x42,
-    0xf3,
-    0xf0,
-    0x38,
-    0x58,
-    0x01,
-    0x1a,
-    0xff,
-    0x71,
-    0xa4,
-    0xa1,
-    0x57,
-    0xdf,
-    0x3c,
-    0x7a,
-    0x36,
-    0x4c,
-    0x17,
-    0xc1,
-    0x0f,
-    0xf0,
-    0xdd,
-    0x98,
-    0x53,
-    0x08,
-    0x2b,
-    0x32,
-    0x38,
-    0x83,
-    0x7e,
-    0x2b,
-    0xb9,
-    0xfe,
-    0x53,
-    0x1b,
-    0xde,
-    0xf2,
-    0x8c,
-    0x6a,
-    0x3d,
-    0x2c,
-    0x16,
-    0x66,
-    0xc1,
-    0x7e,
-    0xc9,
-    0x92,
-    0xaa,
-    0xb5,
-    0x8f,
-    0x41,
-    0xd5,
-    0xca,
-    0xc9,
-    0x64,
-    0x3e,
-    0x5d,
-    0xee,
-    0xa1,
-    0xc3,
-    0x5e,
-    0x75,
-    0xa5,
-    0x2b,
-    0x0e,
-    0xf6,
-    0xba,
-    0x66,
-    0x26,
-    0x8c,
-    0x9c,
-    0x16,
-    0x55,
-    0x7d,
-    0x88,
-    0x4f,
-    0xf0,
-    0x1d,
-    0x97,
-    0x9b,
-    0xe6,
-    0xef,
-    0x4a,
-    0x42,
-    0xf2,
-    0x0e,
-    0x66,
-    0xc8,
-    0x14,
-    0xcb,
-    0x02,
-    0xb6,
-    0x41,
-    0x98,
-    0xde,
-    0x9e,
-    0x5a,
-    0x25,
-    0xf6,
-    0x59,
-    0x5b,
-    0xc8,
-    0x57,
-    0x93,
-    0xd5,
-    0x22,
-    0x32,
-    0x8a,
-    0x9e,
-    0x00,
-    0x2f,
-    0x12,
-    0xc6,
-    0x7f,
-    0x03,
-    0xdd,
-    0xce,
-    0x74,
-    0x45,
-    0xf9,
-    0x15,
-    0x0a,
-    0x7d,
-    0x9a,
-    0x93,
-    0xad,
-    0x7f,
-    0x1a,
-    0xc9,
-    0x27,
-    0xf7,
-    0x3e,
-    0xf8,
-    0x09,
-    0x44,
-    0xbb,
-    0x92,
-    0x4d,
-    0x8a,
-    0xf8,
-    0xee,
-    0x39,
-    0x02,
-    0x16,
-    0x3f,
-    0x87,
-    0x95,
-    0x2e,
-    0xc7,
-    0xc2,
-    0xaa,
-    0xd9,
-    0x48,
-    0xf3,
-    0x3c,
-    0xf6,
-    0xbc,
-    0x7d,
-    0x2f,
-    0xa7,
-    0x45,
-    0x46,
-    0xe4,
-    0x9d,
-    0x67,
-    0x17,
-    0x0b,
-    0x96,
-    0x75,
-    0x46,
-    0xb8,
-    0x23,
-    0x49,
-    0x92,
-    0xb9,
-    0xaf,
-    0x38,
-    0x4e,
-    0x28,
-    0xbd,
-    0x46,
-    0xc2,
-    0x3c,
-    0x71,
-    0x95,
-    0xce,
-    0x64,
-    0x52,
-    0x24,
-    0xd0,
-    0x97,
-    0x4e,
-    0xb6,
-    0xc8,
-    0xe5,
-    0xff,
-    0x0f,
-    0xba,
-    0x53,
-    0x2c,
-    0x66,
-    0x54,
-    0xe5,
-    0x93,
-    0x18,
-    0xd1,
-    0xfc,
-    0xe5,
-    0x9a,
-    0x1d,
-    0xe2,
-    0x13,
-    0xb1,
-    0x3a,
-    0xa4,
-    0xc8,
-    0xe5,
-    0xe2,
-    0x20,
-    0x36,
-    0x33,
-    0x6e,
-    0x5e,
-    0x16,
-    0x02,
-    0xf6,
-    0x24,
-    0xea,
-    0x58,
-    0xba,
-    0xc4,
-    0x86,
-    0x4e,
-    0xc0,
-    0x39,
-    0xce,
-    0xc1,
-    0xbf,
-    0x72,
-    0xc1,
-    0x4b,
-    0x3c,
-    0xee,
-    0xb7,
-    0x71,
-    0xf3,
-    0x89,
-    0xe6,
-    0x1e,
-    0x78,
-    0x96,
-    0x2b,
-    0x51,
-    0x1e,
-    0x2d,
-    0x08,
-    0x12,
-    0x18,
-    0xc6,
-    0xe9,
-    0xaa,
-    0xde,
-    0x07,
-    0xab,
-    0x13,
-    0xd3,
-    0xdb,
-    0x5e,
-    0xae,
-    0x24,
-    0xc4,
-    0x4a,
-    0x34,
-    0xf3,
-    0x72,
-    0x31,
-    0xef,
-    0xb5,
-    0x94,
-    0xd4,
-    0x2a,
-    0xd8,
-    0xee,
-    0xb8,
-    0xe6,
-    0xa9,
-    0xac,
-    0x2a,
-    0xce,
-    0x76,
-    0xf6,
-    0x81,
-    0x6d,
-    0xef,
-    0xc4,
-    0xa3,
-    0x9f,
-    0xd2,
-    0xf4,
-    0xcb,
-    0x45,
-    0xc8,
-    0x9a,
-    0x89,
-    0x3d,
-    0x8a,
-    0x97,
-    0x0a,
-    0x92,
-    0x47,
-    0x6d,
-    0x99,
-    0xef,
-    0x4a,
-    0x51,
-    0x66,
-    0x5a,
-    0xd8,
-    0x82,
-    0x86,
-    0x1e,
-    0x57,
-    0xda,
-    0x3c,
-    0x09,
-    0xb6,
-    0xa2,
-    0x77,
-    0xd8,
-    0x08,
-    0xab,
-    0x9b,
-    0xf0,
-    0x72,
-    0x9a,
-    0x84,
-    0x4f,
-    0x48,
-    0x84,
-    0xc9,
-    0xc1,
-    0x73,
-    0xbb,
-    0x3d,
-    0x57,
-    0x16,
-    0xe7,
-    0xbc,
-    0x15,
-    0x71,
-    0x58,
-    0x24,
-    0xeb,
-    0x05,
-    0x9a,
-    0xa1,
-    0xe7,
-    0xf8,
-    0x4a,
-    0x2e,
-    0xa8,
-    0xbc,
-    0x29,
-    0x58,
-    0x16,
-    0xec,
-    0x6f,
-    0x45,
-    0x50,
-    0x76,
-    0x62,
-    0xf6,
-    0xe6,
-    0xff,
-    0x26,
-    0xc9,
-    0x49,
-    0x83,
-    0xd7,
-    0x42,
-    0x7f,
-    0x3c,
-    0xd5,
-    0x0a,
-    0x1b,
-    0xc6,
-    0x5f,
-    0x38,
-    0x6d,
-    0x80,
-    0x64,
-    0xd0,
-    0xf6,
-    0x35,
-    0x95,
-    0x89,
-    0x1e,
-    0xfc,
-    0xbf,
-    0xd4,
-    0x2a,
-    0x5c,
-    0x58,
-    0x19,
-    0x68,
-    0xb4,
-    0x58,
-    0x44,
-    0xac,
-    0xda,
-    0x4a,
-    0x80,
-    0x00,
-    0x03,
-    0xa2,
-    0x42,
-    0x98,
-    0xe3,
-    0x51,
-    0x8a,
-    0x04,
-    0x15,
-    0x97,
-    0x66,
-    0xa9,
-    0xbc,
-    0x18,
-    0xb7,
-    0x72,
-    0x6b,
-    0x33,
-    0x37,
-    0xc3,
-    0x42,
-    0x8f,
-    0xbb,
-    0xaf,
-    0x5a,
-    0xf6,
-    0xb6,
-    0x6a,
-    0x64,
-    0x67,
-    0xff,
-    0x01,
-    0x8c,
-    0x66,
-    0xd4,
-    0x48,
-    0xa4,
-    0x97,
-    0x1e,
-    0x14,
-    0x7e,
-    0x8b,
-    0xf6,
-    0xab,
-    0x99,
-    0xda,
-    0x69,
-    0x79,
-    0x00,
-    0x72,
-    0x78,
-    0x05,
-    0x70,
-    0x2e,
-    0x63,
-    0x23,
-    0xb9,
-    0xab,
-    0x28,
-    0x6a,
-    0x66,
-    0x57,
-    0x46,
-    0xe8,
-    0xa0,
-    0xca,
-    0xc6,
-    0x15,
-    0x50,
-    0x5a,
-    0x7c,
-    0x06,
-    0x84,
-    0xe9,
-    0x8b,
-    0xe3,
-    0x14,
-    0x02,
-    0x27,
-    0x9b,
-    0x85,
-    0x25,
-    0x9f,
-    0xd6,
-    0x2d,
-    0x5e,
-    0x9a,
-    0x2c,
-    0x98,
-    0x1c,
-    0xa0,
-    0x94,
-    0x2b,
-    0x41,
-    0xdd,
-    0x1f,
-    0x07,
-    0x76,
-    0x22,
-    0xe6,
-    0x31,
-    0xc1,
-    0x2d,
-    0x40,
-    0xef,
-    0x59,
-    0x2a,
-    0x39,
-    0x75,
-    0xb9,
-    0x7a,
-    0x40,
-    0xc0,
-    0xf3,
-    0xb2,
-    0x20,
-    0xc3,
-    0x47,
-    0xe7,
-    0x32,
-    0xc1,
-    0xf4,
-    0x29,
-    0xd0,
-    0xfa,
-    0x4e,
-    0x4d,
-    0x0c,
-    0x89,
-    0x11,
-    0xf0,
-    0xa2,
-    0x8d,
-    0xf5,
-    0xb8,
-    0x2c,
-    0x87,
-    0x82,
-    0xdd,
-    0x95,
-    0x03,
-    0x26,
-    0xe8,
-    0xd0,
-    0x7b,
-    0x85,
-    0xbb,
-    0xca,
-    0x78,
-    0x10,
-    0xd2,
-    0x9d,
-    0xfa,
-    0xd9,
-    0xc8,
-    0x06,
-    0x1a,
-    0xa5,
-    0x1d,
-    0x19,
-    0xee,
-    0x43,
-    0x36,
-    0x33,
-    0xad,
-    0x1d,
-    0xa5,
-    0x31,
-    0x13,
-    0x0d,
-    0xab,
-    0xdf,
-    0x07,
-    0x72,
-    0xfb,
-    0xb3,
-    0x7c,
-    0x82,
-    0xc1,
-    0xbc,
-    0x95,
-    0xe2,
-    0xe3,
-    0xd5,
-    0x0c,
-    0x74,
-    0x87,
-    0x1e,
-    0xd4,
-    0x70,
-    0xd5,
-    0xad,
-    0xfd,
-    0xb6,
-    0xfe,
-    0x80,
-    0xd9,
-    0x62,
-    0x7d,
-    0xb6,
-    0x5d,
-    0xa1,
-    0x9d,
-    0xff,
-    0xc9,
-    0xc4,
-    0x3b,
-    0x52,
-    0x8c,
-    0x93,
-    0xcd,
-    0xde,
-    0x61,
-    0xe4,
-    0xa3,
-    0x42,
-    0xbf,
-    0x6c,
-    0x6d,
-    0x00,
-    0x70,
-    0xd4,
-    0xfe,
-    0x2f,
-    0x7f,
-    0x0f,
-    0x4f,
-    0x71,
-    0x58,
-    0xec,
-    0xc7,
-    0x25,
-    0x2b,
-    0xe7,
-    0xb9,
-    0xde,
-    0x91,
-    0x45,
-    0x2f,
-    0x13,
-    0x72,
-    0x60,
-    0xe6,
-    0x18,
-    0x26,
-    0x3f,
-    0x99,
-    0x4c,
-    0xda,
-    0x69,
-    0x82,
-    0x95,
-    0x36,
-    0xfb,
-    0x1f,
-    0x09,
-    0x3d,
-    0xf9,
-    0x32,
-    0xee,
-    0x74,
-    0xe2,
-    0x0b,
-    0xe5,
-    0x46,
-    0x87,
-    0x09,
-    0x62,
-    0xa7,
-    0x1c,
-    0x5f,
-    0x5f,
-    0xf8,
-    0x90,
-    0x14,
-    0x52,
-    0x2a,
-    0x1a,
-    0x4e,
-    0x5c,
-    0x27,
-    0x15,
-    0xcf,
-    0xc3,
-    0x6d,
-    0x0d,
-    0xc0,
-    0xa2,
-    0xfc,
-    0x1a,
-    0xad,
-    0xdf,
-    0x73,
-    0x6c,
-    0xd2,
-    0x5e,
-    0x76,
-    0x28,
-    0x95,
-    0x74,
-    0x52,
-    0x73,
-    0x53,
-    0x9f,
-    0xe4,
-    0xcb,
-    0x5f,
-    0x74,
-    0xb7,
-    0x9e,
-    0x48,
-    0xd8,
-    0x6c,
-    0x15,
-    0x5b,
-    0x73,
-    0x5f,
-    0x31,
-    0x69,
-    0x62,
-    0x87,
-    0x1a,
-    0xcb,
-    0x2c,
-    0x9e,
-    0xb4,
-    0xa2,
-    0xf8,
-    0x82,
-    0x72,
-    0x63,
-    0xfd,
-    0xdc,
-    0x6f,
-    0x94,
-    0x39,
-    0xff,
-    0xbb,
-    0xd0,
-    0x66,
-    0x13,
-    0xf2,
-    0x11,
-    0x2a,
-    0x72,
-    0x14,
-    0x2f,
-    0x8e,
-    0x52,
-    0x90,
-    0xa3,
-    0xb1,
-    0xa5,
-    0xa2,
-    0x91,
-    0xbe,
-    0x3d,
-    0xdf,
-    0x06,
-    0x1b,
-    0x34,
-    0x0f,
-    0x7e,
-    0xe3,
-    0x8b,
-    0x3a,
-    0xa9,
-    0x97,
-    0x11,
-    0x06,
-    0x6e,
-    0x10,
-    0x86,
-    0x40,
-    0x31,
-    0xb8,
-    0x01,
-    0xb8,
-    0x51,
-    0xfa,
-    0x8f,
-    0x52,
-    0xf5,
-    0xf7,
-    0x1d,
-    0x5a,
-    0x09,
-    0x7b,
-    0x98,
-    0x18,
-    0x83,
-    0x2f,
-    0x52,
-    0xa4,
-    0xeb,
-    0x10,
-    0xa8,
-    0xfc,
-    0x1a,
-    0x1f,
-    0xe2,
-    0x54,
-    0x42,
-    0x5a,
-    0x5a,
-    0xad,
-    0x2e,
-    0xec,
-    0xe1,
-    0xa9,
-    0xcb,
-    0xa1,
-    0x5e,
-    0x9e,
-    0xe8,
-    0x9c,
-    0xb8,
-    0xe9,
-    0x3a,
-    0x4c,
-    0xf6,
-    0x85,
-    0xa3,
-    0x9c,
-    0xa5,
-    0xdc,
-    0xb3,
-    0x6a,
-    0x7a,
-    0xdc,
-    0x70,
-    0x3b,
-    0x39,
-    0x4e,
-    0x52,
-    0x2d,
-    0xd5,
-    0x63,
-    0x92,
-    0x2d,
-    0xd9,
-    0x90,
-    0xa5,
-    0x69,
-    0x06,
-    0x9c,
-    0x03,
-    0x08,
-    0x3e,
-    0xf8,
-    0x2c,
-    0x19,
-    0xa1,
-    0x4e,
-    0xed,
-    0xca,
-    0xf5,
-    0x5c,
-    0xdf,
-    0xdb,
-    0x4b,
-    0x03,
-    0x32,
-    0x52,
-    0xdf,
-    0x9b,
-    0xa8,
-    0x6f,
-    0x41,
-    0x8a,
-    0xe4,
-    0xe2,
-    0xb2,
-    0x15,
-    0xe5,
-    0x3c,
-    0xd1,
-    0x76,
-    0xce,
-    0xa4,
-    0x77,
-    0x2e,
-    0xe8,
-    0xcb,
-    0xdf,
-    0x9c,
-    0xe9,
-    0x22,
-    0x0a,
-    0xcf,
-    0x77,
-    0x4a,
-    0x61,
-    0x99,
-    0xe8,
-    0xcb,
-    0x9d,
-    0xe4,
-    0x4c,
-    0x0a,
-    0xe4,
-    0x49,
-    0xad,
-    0x75,
-    0x34,
-    0xdf,
-    0x95,
-    0x01,
-    0x05,
-    0x51,
-    0xd1,
-    0xd6,
-    0x2a,
-    0x34,
-    0x75,
-    0x48,
-    0xf9,
-    0x97,
-    0x20,
-    0x0a,
-    0xab,
-    0xdb,
-    0x81,
-    0x9e,
-    0x06,
-    0xc5,
-    0x1a,
-    0x10,
-    0x39,
-    0xd1,
-    0x44,
-    0xe4,
-    0x07,
-    0xc9,
-    0x74,
-    0x4d,
-    0x27,
-    0x97,
-    0xbc,
-    0xa0,
-    0xeb,
-    0x58,
-    0x95,
-    0x07,
-    0x21,
-    0xb1,
-    0xdb,
-    0x7a,
-    0x37,
-    0x66,
-    0x19,
-    0xeb,
-    0xa2,
-    0x28,
-    0x07,
-    0xc1,
-    0x7f,
-    0xaf,
-    0x51,
-    0x88,
-    0x7b,
-    0x09,
-    0x9a,
-    0xe7,
-    0xf1,
-    0x32,
-    0xc1,
-    0xd2,
-    0x53,
-    0xe4,
-    0x63,
-    0x00,
-    0xcb,
-    0xb0,
-    0xa1,
-    0xa0,
-    0x22,
-    0x4e,
-    0x23,
-    0x48,
-    0xe0,
-    0x32,
-    0x5c,
-    0x2e,
-    0xb5,
-    0x5f,
-    0x10,
-    0x9a,
-    0x17,
-    0x80,
-    0x14,
-    0x9b,
-    0x2d,
-    0x35,
-    0x56,
-    0xfa,
-    0xec,
-    0xab,
-    0x1d,
-    0x6c,
-    0x80,
-    0x6f,
-    0x91,
-    0x0b,
-    0xed,
-    0x84,
-    0x7d,
-    0x07,
-    0xf6,
-    0xb3,
-    0x54,
-    0x99,
-    0x3e,
-    0x22,
-    0x72,
-    0x39,
-    0xad,
-    0x28,
-    0xa5,
-    0x11,
-    0x15,
-    0x60,
-    0xec,
-    0xb1,
-    0x15,
-    0xfc,
-    0x7e,
-    0x04,
-    0x3e,
-    0x5c,
-    0x0e,
-    0x83,
-    0x75,
-    0xe0,
-    0x4e,
-    0xa8,
-    0x98,
-    0xfa,
-    0xb2,
-    0xa6,
-    0x65,
-    0x87,
-    0x76,
-    0x57,
-    0x97,
-    0x5f,
-    0xe2,
-    0x76,
-    0x51,
-    0x2a,
-    0xcd,
-    0x0e,
-    0xc0,
-    0x76,
-    0x60,
-    0x32,
-    0xfd,
-    0x07,
-    0x1c,
-    0xef,
-    0x30,
-    0x6e,
-    0x1e,
-    0x7f,
-    0xfb,
-    0xde,
-    0xa2,
-    0xbf,
-    0x16,
-    0x3a,
-    0xc7,
-    0xe4,
-    0x36,
-    0x72,
-    0x92,
-    0x69,
-    0x34,
-    0x10,
-    0x34,
-    0x4b,
-    0x6b,
-    0x0e,
-    0x90,
-    0x79,
-    0x62,
-    0xeb,
-    0xf8,
-    0x86,
-    0xab,
-    0xfe,
-    0x37,
-    0xa2,
-    0x0a,
-    0x09,
-    0xd5,
-    0xc8,
-    0xda,
-    0x11,
-    0x96,
-    0x39,
-    0xad,
-    0x6d,
-    0x44,
-    0x28,
-    0x33,
-    0x1e,
-    0xae,
-    0xb7,
-    0x5d,
-    0x5e,
-    0xf1,
-    0x22,
-    0xc1,
-    0x7b,
-    0xf6,
-    0x3a,
-    0x41,
-    0xe6,
-    0x3c,
-    0x16,
-    0xe7,
-    0x87,
-    0xd8,
-    0x05,
-    0x14,
-    0x54,
-    0xba,
-    0xc6,
-    0xda,
-    0x22,
-    0x31,
-    0xfc,
-    0xa6,
-    0xbb,
-    0xb2,
-    0xdc,
-    0x22,
-    0x30,
-    0xd5,
-    0x29,
-    0x59,
-    0x71,
-    0xa0,
-    0x62,
-    0x1d,
-    0x1a,
-    0x08,
-    0x3a,
-    0xa5,
-    0x90,
-    0xb5,
-    0x48,
-    0x7b,
-    0x4d,
-    0x06,
-    0x00,
-    0x96,
-    0x78,
-    0x55,
-    0xe2,
-    0xc2,
-    0xb9,
-    0x7c,
-    0xf1,
-    0x49,
-    0x4b,
-    0x97,
-    0x67,
-    0xcc,
-    0x53,
-    0x0c,
-    0xa7,
-    0x72,
-    0x70,
-    0xc9,
-    0x73,
-    0x45,
-    0x93,
-    0xcd,
-    0x5f,
-    0xd8,
-    0x11,
-    0xea,
-    0x85,
-    0x2d,
-    0xf6,
-    0xc9,
-    0x7b,
-    0xd7,
-    0x9d,
-    0x2e,
-    0x82,
-    0x5c,
-    0x7d,
-    0x7d,
-    0x00,
-    0xdd,
-    0x46,
-    0x7e,
-    0x31,
-    0xf9,
-    0x2d,
-    0x5d,
-    0x19,
-    0xee,
-    0x83,
-    0xf5,
-    0xbd,
-    0x01,
-    0x8d,
-    0x4d,
-    0x92,
-    0x21,
-    0x90,
-    0x63,
-    0x36,
-    0xc7,
-    0x2b,
-    0x29,
-    0x5e,
-    0x20,
-    0xe9,
-    0xce,
-    0x10,
-    0x6e,
-    0x17,
-    0x3e,
-    0x12,
-    0xac,
-    0xd3,
-    0xec,
-    0xa2,
-    0x70,
-    0x66,
-    0xcf,
-    0x67,
-    0x16,
-    0xd4,
-    0xaa,
-    0xa8,
-    0x1b,
-    0xb1,
-    0x91,
-    0xbc,
-    0xc7,
-    0x35,
-    0xa9,
-    0xc1,
-    0x0f,
-    0x93,
-    0x2f,
-    0x91,
-    0xb9,
-    0x87,
-    0xbc,
-    0xf2,
-    0xc1,
-    0x2e,
-    0xc7,
-    0x0d,
-    0xfc,
-    0x1b,
-    0x6b,
-    0x22,
-    0xfb,
-    0xa7,
-    0x6a,
-    0x79,
-    0x32,
-    0x88,
-    0x73,
-    0x9c,
-    0x59,
-    0xa6,
-    0xa0,
-    0xc3,
-    0x13,
-    0x2a,
-    0x43,
-    0x90,
-    0xce,
-    0xd7,
-    0xe2,
-    0xfc,
-    0xea,
-    0x9d,
-    0x80,
-    0x92,
-    0x1d,
-    0x6b,
-    0x1e,
-    0xdb,
-    0x16,
-    0x46,
-    0x82,
-    0x19,
-    0x60,
-    0x98,
-    0x37,
-    0x37,
-    0x8a,
-    0xca,
-    0xd5,
-    0x01,
-    0x85,
-    0x14,
-    0x83,
-    0x91,
-    0x4d,
-    0x94,
-    0xb9,
-    0x09,
-    0xcb,
-    0x9e,
-    0x4b,
-    0x88,
-    0xfb,
-    0x54,
-    0xa3,
-    0x56,
-    0x4a,
-    0x76,
-    0x4d,
-    0x62,
-    0x42,
-    0x7b,
-    0xba,
-    0xef,
-    0x68,
-    0xe0,
-    0x3d,
-    0x8a,
-    0x65,
-    0xc0,
-    0x5a,
-    0x3f,
-    0x65,
-    0xa5,
-    0x40,
-    0x0c,
-    0xbd,
-    0x9e,
-    0x94,
-    0x96,
-    0xd0,
-    0x91,
-    0x70,
-    0x1b,
-    0x33,
-    0xd3,
-    0xac,
-    0xa8,
-    0x0f,
-    0xf6,
-    0x5c,
-    0x8c,
-    0xc7,
-    0xe2,
-    0x99,
-    0x0c,
-    0xdb,
-    0x27,
-    0x85,
-    0x58,
-    0x0d,
-    0x92,
-    0x89,
-    0xbe,
-    0xc2,
-    0xff,
-    0xe1,
-    0x1e,
-    0xaa,
-    0x6d,
-    0x5b,
-    0x9e,
-    0xa3,
-    0x58,
-    0x5b,
-    0x9e,
-    0xdb,
-    0x43,
-    0x23,
-    0xef,
-    0x35,
-    0x94,
-    0x51,
-    0x3f,
-    0xef,
-    0xa4,
-    0xa9,
-    0xd8,
-    0x81,
-    0x17,
-    0x15,
-    0x8b,
-    0xc8,
-    0x69,
-    0xea,
-    0xe6,
-    0x63,
-    0xca,
-    0x6d,
-    0xae,
-    0x5e,
-    0x2c,
-    0x96,
-    0x89,
-    0x0d,
-    0x9a,
-    0x14,
-    0xfa,
-    0x3b,
-    0xcb,
-    0x90,
-    0x92,
-    0x85,
-    0xf7,
-    0x36,
-    0x65,
-    0x00,
-    0xe9,
-    0x72,
-    0xbc,
-    0x22,
-    0x56,
-    0xf7,
-    0x09,
-    0xdf,
-    0x6d,
-    0x06,
-    0x20,
-    0x12,
-    0xaf,
-    0xed,
-    0xa3,
-    0x1f,
-    0x01,
-    0xce,
-    0xbe,
-    0xd6,
-    0xff,
-    0xa1,
-    0x15,
-    0x9b,
-    0x94,
-    0x7c,
-    0xfb,
-    0xc4,
-    0xc7,
-    0x12,
-    0xe5,
-    0x43,
-    0xd8,
-    0x7b,
-    0x1e,
-    0x85,
-    0x8c,
-    0x33,
-    0xbc,
-    0x9a,
-    0xc5,
-    0x64,
-    0xd2,
-    0x95,
-    0x55,
-    0x68,
-    0xe7,
-    0x36,
-    0x14,
-    0x89,
-    0xa7,
-    0xc6,
-    0x31,
-    0x0c,
-    0xd9,
-    0x43,
-    0xc5,
-    0x6f,
-    0x91,
-    0xbd,
-    0xae,
-    0xee,
-    0xa7,
-    0x00,
-    0x9a,
-    0x4c,
-    0x67,
-    0x73,
-    0x62,
-    0xcf,
-    0x8a,
-    0x40,
-    0x9a,
-    0x8d,
-    0x66,
-    0xb5,
-    0x66,
-    0xe6,
-    0x61,
-    0xeb,
-    0x8e,
-    0x52,
-    0xab,
-    0xa5,
-    0xd5,
-    0x5d,
-    0x2d,
-    0x7a,
-    0x87,
-    0xef,
-    0xbc,
-    0x37,
-    0x52,
-    0xd1,
-    0x93,
-    0x7f,
-    0x56,
-    0x6d,
-    0x00,
-    0xb4,
-    0x7f,
-    0xd5,
-    0x5d,
-    0x1b,
-    0x13,
-    0x07,
-    0x42,
-    0x3a,
-    0x87,
-    0x70,
-    0xf9,
-    0x85,
-    0x97,
-    0xae,
-    0x32,
-    0x3a,
-    0x96,
-    0x9a,
-    0xf8,
-    0x8a,
-    0x02,
-    0x86,
-    0xe4,
-    0xf9,
-    0x5b,
-    0xc3,
-    0x91,
-    0x07,
-    0x35,
-    0x67,
-    0x4f,
-    0x10,
-    0x8d,
-    0x4c,
-    0x1c,
-    0x71,
-    0x59,
-    0x5c,
-    0xd0,
-    0xec,
-    0x62,
-    0x0c,
-    0x97,
-    0x4e,
-    0x56,
-    0x27,
-    0xa4,
-    0x4e,
-    0x19,
-    0xcd,
-    0x24,
-    0xb9,
-    0x5d,
-    0xbb,
-    0x71,
-    0xcc,
-    0x72,
-    0xcd,
-    0x89,
-    0xe1,
-    0x5f,
-    0xc0,
-    0xbe,
-    0x4f,
-    0x31,
-    0x3d,
-    0xaf,
-    0x8b,
-    0x93,
-    0x13,
-    0x76,
-    0x93,
-    0x9f,
-    0xc5,
-    0x23,
-    0x8c,
-    0xf4,
-    0x44,
-    0x6a,
-    0xa9,
-    0x09,
-    0xfd,
-    0x98,
-    0x50,
-    0xc1,
-    0x16,
-    0xcb,
-    0x78,
-    0x3f,
-    0xf5,
-    0x63,
-    0x56,
-    0xfb,
-    0x03,
-    0xb4,
-    0x38,
-    0x15,
-    0xaf,
-    0xfd,
-    0xb1,
-    0xea,
-    0xb5,
-    0x9e,
-    0xf6,
-    0xe6,
-    0xa0,
-    0x85,
-    0x88,
-    0x99,
-    0x8d,
-    0xea,
-    0x13,
-    0x0c,
-    0x33,
-    0x3c,
-    0x96,
-    0x55,
-    0x20,
-    0x5b,
-    0xc5,
-    0x69,
-    0x45,
-    0x07,
-    0xac,
-    0x32,
-    0xb5,
-    0x99,
-    0x94,
-    0xe1,
-    0xaa,
-    0xf0,
-    0x2a,
-    0x86,
-    0xc9,
-    0xaf,
-    0xde,
-    0xdd,
-    0xa7,
-    0xa6,
-    0x8a,
-    0x6b,
-    0x8b,
-    0x8d,
-    0x54,
-    0xca,
-    0x76,
-    0xf8,
-    0xd5,
-    0x42,
-    0x60,
-    0x87,
-    0x7b,
-    0x99,
-    0xc5,
-    0x5d,
-    0x2b,
-    0x2b,
-    0x60,
-    0xd4,
-    0x2b,
-    0x3d,
-    0x37,
-    0x6f,
-    0x40,
-    0x8e,
-    0xd7,
-    0x11,
-    0x13,
-    0x2f,
-    0xe1,
-    0x6c,
-    0xd9,
-    0x95,
-    0xc5,
-    0xbb,
-    0x33,
-    0xed,
-    0xce,
-    0xb4,
-    0x53,
-    0xaf,
-    0x5f,
-    0xb8,
-    0x61,
-    0x76,
-    0x7c,
-    0x4e,
-    0x1d,
-    0x0f,
-    0x8b,
-    0xcf,
-    0xc5,
-    0xcf,
-    0x5c,
-    0x63,
-    0x39,
-    0x2a,
-    0x68,
-    0x2b,
-    0x5d,
-    0x82,
-    0x56,
-    0xc0,
-    0xbf,
-    0x3d,
-    0xc4,
-    0xdd,
-    0x7a,
-    0x1a,
-    0x43,
-    0x58,
-    0x5a,
-    0xc5,
-    0xa3,
-    0x57,
-    0x40,
-    0xa9,
-    0x72,
-    0xc0,
-    0xc8,
-    0x05,
-    0xbf,
-    0xf1,
-    0x2a,
-    0x42,
-    0x23,
-    0xb2,
-    0x5e,
-    0x84,
-    0x03,
-    0x67,
-    0x84,
-    0x7f,
-    0x0f,
-    0x8b,
-    0x82,
-    0x8c,
-    0x0e,
-    0x59,
-    0xef,
-    0xfb,
-    0xde,
-    0xcc,
-    0x30,
-    0xab,
-    0xb6,
-    0xca,
-    0xe0,
-    0xd9,
-    0xaf,
-    0x9c,
-    0x76,
-    0x36,
-    0x83,
-    0xa2,
-    0x21,
-    0x3c,
-    0x94,
-    0x45,
-    0xf7,
-    0xc1,
-    0x30,
-    0x2c,
-    0x4f,
-    0xcd,
-    0x13,
-    0xb3,
-    0x6b,
-    0xa9,
-    0x2d,
-    0x99,
-    0x5b,
-    0x38,
-    0xa6,
-    0xf8,
-    0x1d,
-    0x8a,
-    0x20,
-    0x7b,
-    0x09,
-    0xaf,
-    0x3c,
-    0xcb,
-    0x6d,
-    0xc9,
-    0x5f,
-    0x4a,
-    0x74,
-    0x65,
-    0xb6,
-    0x04,
-    0x4c,
-    0x0c,
-    0x77,
-    0xe3,
-    0x87,
-    0x14,
-    0x6a,
-    0x22,
-    0xc2,
-    0xbc,
-    0xa9,
-    0x03,
-    0x85,
-    0x79,
-    0xa4,
-    0xc5,
-    0x6b,
-    0x8a,
-    0x67,
-    0xd0,
-    0x83,
-    0xd2,
-    0x20,
-    0x34,
-    0xf5,
-    0xe7,
-    0xdb,
-    0x51,
-    0xe9,
-    0x67,
-    0x91,
-    0xd7,
-    0xa4,
-    0x8b,
-    0x61,
-    0xf2,
-    0xf4,
-    0xfe,
-    0x1d,
-    0xbe,
-    0xcf,
-    0xef,
-    0x08,
-    0x01,
-    0x37,
-    0x65,
-    0xde,
-    0x19,
-    0x60,
-    0xd2,
-    0x15,
-    0x33,
-    0x15,
-    0xec,
-    0x63,
-    0xbe,
-    0x58,
-    0xb8,
-    0x80,
-    0x20,
-    0x49,
-    0xe7,
-    0x2d,
-    0xa7,
-    0x49,
-    0x66,
-    0x75,
-    0xc2,
-    0x5e,
-    0x31,
-    0x33,
-    0x71,
-    0xd9,
-    0x68,
-    0xd4,
-    0xfa,
-    0x37,
-    0xa4,
-    0x5e,
-    0xde,
-    0x46,
-    0x8b,
-    0xb1,
-    0x0b,
-    0x89,
-    0xa2,
-    0x0e,
-    0x53,
-    0xdc,
-    0x63,
-    0xd5,
-    0x1d,
-    0x5b,
-    0x90,
-    0x93,
-    0x5a,
-    0x81,
-    0xc6,
-    0x3b,
-    0xbb,
-    0x8d,
-    0x55,
-    0xb4,
-    0x21,
-    0x2a,
-    0x4f,
-    0x94,
-    0x56,
-    0x4e,
-    0xdf,
-    0x2c,
-    0xfa,
-    0x63,
-    0xdc,
-    0xc4,
-    0xc0,
-    0xa5,
-    0x9e,
-    0x27,
-    0xda,
-    0xcb,
-    0x11,
-    0x63,
-    0xb1,
-    0xe9,
-    0x07,
-    0xca,
-    0xda,
-    0x95,
-    0xd3,
-    0x3c,
-    0x45,
-    0x49,
-    0x13,
-    0xa9,
-    0xb8,
-    0x08,
-    0xcd,
-    0xd1,
-    0x7c,
-    0x44,
-    0xbe,
-    0x4e,
-    0x57,
-    0x00,
-    0xee,
-    0xd5,
-    0xba,
-    0x32,
-    0x88,
-    0xb9,
-    0x3a,
-    0x6b,
-    0xe9,
-    0xb0,
-    0x44,
-    0xb9,
-    0xf7,
-    0xda,
-    0x0d,
-    0xcd,
-    0xb4,
-    0xff,
-    0xc9,
-    0x59,
-    0x13,
-    0x19,
-    0x1d,
-    0xbc,
-    0x0a,
-    0x12,
-    0xd6,
-    0xe1,
-    0xe8,
-    0xce,
-    0xdb,
-    0x64,
-    0xe9,
-    0x6c,
-    0x60,
-    0xf7,
-    0x07,
-    0xc9,
-    0x5d,
-    0x05,
-    0x14,
-    0x46,
-    0x3f,
-    0x95,
-    0x06,
-    0xcc,
-    0xdd,
-    0x70,
-    0x92,
-    0x0d,
-    0xad,
-    0x86,
-    0xfc,
-    0x0c,
-    0x38,
-    0x8e,
-    0x2d,
-    0xdf,
-    0xcb,
-    0xed,
-    0x06,
-    0xb3,
-    0x70,
-    0xd9,
-    0xf4,
-    0x12,
-    0x1c,
-    0xbe,
-    0xc4,
-    0x61,
-    0x2a,
-    0xe0,
-    0xb9,
-    0xad,
-    0x08,
-    0x43,
-    0xdc,
-    0xa7,
-    0x31,
-    0xc8,
-    0x94,
-    0xec,
-    0x5b,
-    0x98,
-    0x76,
-    0x8a,
-    0xf1,
-    0xc5,
-    0x5e,
-    0xc0,
-    0xc3,
-    0x2f,
-    0xbf,
-    0x06,
-    0xfd,
-    0xa5,
-    0x37,
-    0x4d,
-    0x55,
-    0x4d,
-    0x67,
-    0x88,
-    0x89,
-    0x46,
-    0x01,
-    0x6b,
-    0x09,
-    0x8b,
-    0x22,
-    0x73,
-    0xf0,
-    0x1b,
-    0xe3,
-    0x26,
-    0x39,
-    0x57,
-    0x2b,
-    0x9c,
-    0x30,
-    0xab,
-    0xc7,
-    0x3e,
-    0x26,
-    0x70,
-    0xbc,
-    0xce,
-    0x69,
-    0x11,
-    0xdb,
-    0xa8,
-    0x74,
-    0x6d,
-    0x97,
-    0x47,
-    0x62,
-    0x7d,
-    0x14,
-    0x0a,
-    0xa9,
-    0x37,
-    0x80,
-    0x38,
-    0x04,
-    0xb2,
-    0xa6,
-    0x43,
-    0xb1,
-    0x8a,
-    0xc0,
-    0x49,
-    0xdd,
-    0x86,
-    0x8d,
-    0xe0,
-    0x5d,
-    0x78,
-    0xa4,
-    0x13,
-    0x9e,
-    0x65,
-    0x08,
-    0xa8,
-    0xdf,
-    0xe6,
-    0xfc,
-    0xa5,
-    0x9d,
-    0xce,
-    0x19,
-    0x12,
-    0x4f,
-    0x0d,
-    0x9d,
-    0xff,
-    0x54,
-    0xd5,
-    0x06,
-    0xc9,
-    0x2a,
-    0xfb,
-    0xe0,
-    0x9a,
-    0xe0,
-    0x9f,
-    0xdb,
-    0x2f,
-    0xce,
-    0x0f,
-    0x20,
-    0xde,
-    0x83,
-    0xe9,
-    0xe5,
-    0xd7,
-    0xff,
-    0x80,
-    0x3f,
-    0xaa,
-    0x23,
-    0x81,
-    0x38,
-    0x09,
-    0x65,
-    0xd7,
-    0x22,
-    0xcf,
-    0xc8,
-    0xcb,
-    0x2b,
-    0x42,
-    0x0c,
-    0x70,
-    0x31,
-    0x95,
-    0x21,
-    0x3e,
-    0xd7,
-    0xb2,
-    0xe2,
-    0xfd,
-    0xd8,
-    0x36,
-    0x00,
-    0xe5,
-    0x9b,
-    0xbc,
-    0x3c,
-    0x03,
-    0x08,
-    0x5e,
-    0xda,
-    0xde,
-    0x9b,
-    0x79,
-    0x52,
-    0x5b,
-    0xb6,
-    0xb1,
-    0x48,
-    0xde,
-    0x3c,
-    0x35,
-    0xbe,
-    0xb2,
-    0x5b,
-    0x44,
-    0x89,
-    0xab,
-    0xa9,
-    0xf1,
-    0x01,
-    0x09,
-    0x73,
-    0x23,
-    0xfd,
-    0xa0,
-    0x51,
-    0xdf,
-    0xff,
-    0x36,
-    0xfe,
-    0xca,
-    0xab,
-    0x2d,
-    0x67,
-    0xe9,
-    0x7e,
-    0x62,
-    0x02,
-    0xac,
-    0xbc,
-    0x54,
-    0x61,
-    0x2b,
-    0xaa,
-    0x89,
-    0x07,
-    0xaf,
-    0xfe,
-    0x2d,
-    0x7a,
-    0x74,
-    0x94,
-    0xfd,
-    0x9a,
-    0xad,
-    0x62,
-    0x63,
-    0x30,
-    0xc9,
-    0xae,
-    0xe2,
-    0xca,
-    0xf5,
-    0x7e,
-    0xb5,
-    0xc7,
-    0xe2,
-    0x51,
-    0xb3,
-    0xae,
-    0xc8,
-    0x0c,
-    0x76,
-    0xc4,
-    0xab,
-    0x37,
-    0xbc,
-    0xdd,
-    0xdd
-  ],
-  const [
-    0x3a,
-    0x14,
-    0x14,
-    0x5d,
-    0xd1,
-    0xfa,
-    0x9e,
-    0x46,
-    0xc4,
-    0x56,
-    0x2e,
-    0xed,
-    0x0b,
-    0x0d,
-    0xa1,
-    0x0d,
-    0x84,
-    0x5a,
-    0xd8,
-    0x4f,
-    0x43,
-    0xcd,
-    0xb1,
-    0x6e,
-    0x29,
-    0x93,
-    0x36,
-    0x99,
-    0xb8,
-    0xf7,
-    0x15,
-    0x19,
-    0x25,
-    0x29,
-    0x51,
-    0x33,
-    0xaf,
-    0x3e,
-    0x36,
-    0x50,
-    0x30,
-    0x79,
-    0x92,
-    0x5b,
-    0xf2,
-    0xc9,
-    0x22,
-    0x6b,
-    0xc3,
-    0x92,
-    0x4b,
-    0xa2,
-    0x4c,
-    0xb0,
-    0x0a,
-    0x55,
-    0x9e,
-    0xba,
-    0x2e,
-    0x6c,
-    0x0e,
-    0x83,
-    0xc5,
-    0x0c,
-    0x43,
-    0xe7,
-    0xd4,
-    0x74,
-    0x8d,
-    0xc4,
-    0x4b,
-    0x25,
-    0x78,
-    0x46,
-    0x37,
-    0x46,
-    0xa2,
-    0x68,
-    0x3a,
-    0x46,
-    0xc9,
-    0xb7,
-    0x38,
-    0xc3,
-    0x28,
-    0x59,
-    0x54,
-    0xab,
-    0x04,
-    0x4f,
-    0x1b,
-    0xa1,
-    0x82,
-    0xf7,
-    0xfe,
-    0xa2,
-    0xbb,
-    0xd5,
-    0x06,
-    0xe8,
-    0x12,
-    0x92,
-    0xc3,
-    0x0e,
-    0xc6,
-    0x45,
-    0x86,
-    0x76,
-    0xc3,
-    0xf2,
-    0xd0,
-    0xe8,
-    0xbe,
-    0x50,
-    0x09,
-    0x7b,
-    0x80,
-    0xd0,
-    0x75,
-    0xb9,
-    0x82,
-    0xda,
-    0x65,
-    0xfe,
-    0xbb,
-    0x5a,
-    0xaa,
-    0x21,
-    0xb6,
-    0x7b,
-    0x4f,
-    0x56,
-    0xe7,
-    0xb2,
-    0x88,
-    0x53,
-    0x3f,
-    0xff,
-    0xe5,
-    0xb2,
-    0xfe,
-    0x70,
-    0xcb,
-    0x97,
-    0xc9,
-    0xe6,
-    0x25,
-    0x92,
-    0xfc,
-    0x1b,
-    0x57,
-    0xc7,
-    0x41,
-    0xe4,
-    0x73,
-    0x4c,
-    0x62,
-    0xb4,
-    0xb0,
-    0xd2,
-    0x5b,
-    0x62,
-    0x18,
-    0x88,
-    0xb4,
-    0x2c,
-    0x80,
-    0x3c,
-    0x0d,
-    0xfb,
-    0xbd,
-    0xc3,
-    0xfb,
-    0xe9,
-    0x15,
-    0x9c,
-    0x12,
-    0x00,
-    0xf4,
-    0xd0,
-    0x43,
-    0x44,
-    0xe0,
-    0x1c,
-    0x69,
-    0xf4,
-    0xaf,
-    0x52,
-    0x1e,
-    0x0e,
-    0xf8,
-    0xfd,
-    0xd3,
-    0x11,
-    0xc7,
-    0x44,
-    0x20,
-    0x06,
-    0x95,
-    0x11,
-    0x58,
-    0xc1,
-    0x77,
-    0x72,
-    0x61,
-    0x65,
-    0x95,
-    0x3f,
-    0xc2,
-    0x26,
-    0xde,
-    0xfd,
-    0xfe,
-    0x53,
-    0xfa,
-    0x02,
-    0x21,
-    0x93,
-    0x80,
-    0xda,
-    0x98,
-    0x6f,
-    0x6a,
-    0xea,
-    0x45,
-    0x10,
-    0xc6,
-    0x53,
-    0xd3,
-    0x4a,
-    0xae,
-    0x19,
-    0x47,
-    0xda,
-    0x79,
-    0x85,
-    0xd8,
-    0xec,
-    0x33,
-    0xc7,
-    0x01,
-    0xe1,
-    0x4b,
-    0xe0,
-    0xd4,
-    0x4e,
-    0x8c,
-    0xbf,
-    0x91,
-    0x48,
-    0x4e,
-    0xaa,
-    0x77,
-    0xdf,
-    0xee,
-    0xe0,
-    0xda,
-    0xe8,
-    0x7b,
-    0x7d,
-    0x76,
-    0x00,
-    0xb2,
-    0x9d,
-    0x03,
-    0xcd,
-    0x2d,
-    0xc4,
-    0x0a,
-    0x87,
-    0xd7,
-    0x7e,
-    0xf6,
-    0xb7,
-    0xa3,
-    0x42,
-    0x6e,
-    0x3f,
-    0x7e,
-    0x9c,
-    0xe2,
-    0x9b,
-    0x82,
-    0x8c,
-    0x64,
-    0x66,
-    0x6c,
-    0x29,
-    0xba,
-    0x20,
-    0x50,
-    0x89,
-    0xb1,
-    0x2e,
-    0x8b,
-    0xe5,
-    0xb4,
-    0x22,
-    0xfa,
-    0xf9,
-    0x9c,
-    0x3d,
-    0x69,
-    0xaa,
-    0xca,
-    0x32,
-    0x4e,
-    0xeb,
-    0x73,
-    0x2d,
-    0xb8,
-    0xe1,
-    0x3c,
-    0x14,
-    0x82,
-    0x45,
-    0x07,
-    0x0d,
-    0xcc,
-    0x0b,
-    0x0c,
-    0x40,
-    0xab,
-    0x41,
-    0x2b,
-    0xde,
-    0x20,
-    0x39,
-    0x80,
-    0x62,
-    0x47,
-    0xea,
-    0x39,
-    0x17,
-    0xd1,
-    0x94,
-    0xa4,
-    0xda,
-    0xb4,
-    0xa3,
-    0x8c,
-    0x21,
-    0x21,
-    0xd6,
-    0xc6,
-    0x3c,
-    0xb7,
-    0xa0,
-    0x07,
-    0xdb,
-    0xf6,
-    0xcf,
-    0xf9,
-    0xd1,
-    0xf6,
-    0x6b,
-    0x8d,
-    0x17,
-    0x59,
-    0xe1,
-    0x92,
-    0x14,
-    0x7e,
-    0x60,
-    0x87,
-    0x1b,
-    0xf7,
-    0x84,
-    0xad,
-    0x36,
-    0x3e,
-    0x32,
-    0x61,
-    0x22,
-    0xa3,
-    0xc3,
-    0xa9,
-    0x9a,
-    0x89,
-    0x64,
-    0x0d,
-    0xd9,
-    0xd2,
-    0xbc,
-    0xa8,
-    0x5a,
-    0x98,
-    0xd0,
-    0x7e,
-    0xe2,
-    0x1e,
-    0x24,
-    0x10,
-    0xc0,
-    0x06,
-    0x23,
-    0x2e,
-    0x53,
-    0xc4,
-    0xc1,
-    0x0d,
-    0xce,
-    0x52,
-    0x5f,
-    0x99,
-    0x38,
-    0x25,
-    0xef,
-    0x0c,
-    0xb7,
-    0x61,
-    0x58,
-    0xc0,
-    0x0d,
-    0x49,
-    0x1c,
-    0x41,
-    0x63,
-    0xf9,
-    0x38,
-    0xa7,
-    0x46,
-    0x57,
-    0x4c,
-    0x23,
-    0xef,
-    0x47,
-    0xfb,
-    0xd7,
-    0xc7,
-    0x1e,
-    0x95,
-    0xeb,
-    0x2a,
-    0x5a,
-    0xf3,
-    0xdd,
-    0x6b,
-    0x90,
-    0xa3,
-    0x18,
-    0x19,
-    0xa5,
-    0x46,
-    0xc9,
-    0x81,
-    0x41,
-    0x35,
-    0xee,
-    0x74,
-    0x81,
-    0x6b,
-    0xaf,
-    0x4b,
-    0xec,
-    0x9f,
-    0xf2,
-    0x27,
-    0xa9,
-    0xb0,
-    0x2a,
-    0x7e,
-    0xef,
-    0x46,
-    0x6f,
-    0xd3,
-    0xbc,
-    0xb7,
-    0xd4,
-    0xc4,
-    0xca,
-    0x27,
-    0xf5,
-    0x4a,
-    0xbf,
-    0xf4,
-    0xcf,
-    0x3d,
-    0xa3,
-    0x51,
-    0xd5,
-    0x16,
-    0x98,
-    0x30,
-    0x40,
-    0xf9,
-    0xc5,
-    0x66,
-    0xa6,
-    0xf3,
-    0x94,
-    0x09,
-    0xce,
-    0x80,
-    0x1d,
-    0x1d,
-    0xc3,
-    0x50,
-    0xe2,
-    0x70,
-    0x27,
-    0x4a,
-    0xbc,
-    0xc3,
-    0xca,
-    0xd2,
-    0x15,
-    0x2a,
-    0x7b,
-    0x47,
-    0x58,
-    0xb6,
-    0x1e,
-    0xd0,
-    0xa6,
-    0x50,
-    0xff,
-    0x59,
-    0xcb,
-    0xe8,
-    0x66,
-    0xd8,
-    0x70,
-    0xd0,
-    0x6c,
-    0xd5,
-    0x91,
-    0x62,
-    0x0c,
-    0x29,
-    0x32,
-    0xe9,
-    0x7d,
-    0x06,
-    0x4e,
-    0xbf,
-    0xbf,
-    0x37,
-    0x11,
-    0xb2,
-    0x75,
-    0xa9,
-    0x47,
-    0xac,
-    0xf2,
-    0x2b,
-    0x13,
-    0x94,
-    0x96,
-    0x72,
-    0xe4,
-    0x6f,
-    0x5b,
-    0x60,
-    0xa5,
-    0xcb,
-    0xab,
-    0x86,
-    0x34,
-    0x5d,
-    0x75,
-    0xe7,
-    0x16,
-    0xe9,
-    0x7f,
-    0xfe,
-    0x69,
-    0x62,
-    0xfe,
-    0x03,
-    0x19,
-    0x53,
-    0x64,
-    0x6b,
-    0x57,
-    0x7d,
-    0x79,
-    0xae,
-    0x47,
-    0xc1,
-    0xad,
-    0x4c,
-    0xf9,
-    0x41,
-    0xac,
-    0x12,
-    0x9b,
-    0xc3,
-    0x34,
-    0x99,
-    0xed,
-    0x56,
-    0x23,
-    0x11,
-    0xf5,
-    0x37,
-    0xd5,
-    0x3c,
-    0xf3,
-    0xf5,
-    0xac,
-    0xbd,
-    0x97,
-    0xd4,
-    0xf0,
-    0x93,
-    0x72,
-    0x6f,
-    0xda,
-    0xe1,
-    0xab,
-    0xa2,
-    0xeb,
-    0xf0,
-    0xf3,
-    0xa7,
-    0x82,
-    0x76,
-    0xba,
-    0x7f,
-    0xae,
-    0x19,
-    0xa3,
-    0x94,
-    0x41,
-    0x2f,
-    0x36,
-    0x9c,
-    0x26,
-    0xc8,
-    0xd6,
-    0xc0,
-    0xf4,
-    0xee,
-    0xf2,
-    0xfe,
-    0xc2,
-    0x2b,
-    0x7f,
-    0xcc,
-    0x3e,
-    0x4c,
-    0xa5,
-    0xfe,
-    0xf9,
-    0x65,
-    0xb8,
-    0xe9,
-    0x05,
-    0x15,
-    0x6b,
-    0xc9,
-    0xc2,
-    0x0b,
-    0x40,
-    0x60,
-    0xf5,
-    0xc9,
-    0x43,
-    0xe0,
-    0x1a,
-    0xa8,
-    0xf8,
-    0x0b,
-    0xfc,
-    0x1d,
-    0x92,
-    0x99,
-    0x82,
-    0x3a,
-    0x65,
-    0xda,
-    0xcc,
-    0x78,
-    0x9e,
-    0x9c,
-    0x7e,
-    0xb3,
-    0x32,
-    0x4f,
-    0x5c,
-    0x76,
-    0x14,
-    0x67,
-    0x18,
-    0x79,
-    0xab,
-    0x02,
-    0x67,
-    0x68,
-    0x83,
-    0xcb,
-    0x5a,
-    0xe6,
-    0x43,
-    0x1e,
-    0xec,
-    0xd2,
-    0xdf,
-    0x6d,
-    0xd8,
-    0xc9,
-    0x0e,
-    0xe2,
-    0xad,
-    0xec,
-    0xff,
-    0x45,
-    0x23,
-    0xe3,
-    0x47,
-    0x21,
-    0xb0,
-    0x22,
-    0x1f,
-    0x22,
-    0x57,
-    0x6a,
-    0xcc,
-    0xc2,
-    0xc1,
-    0x93,
-    0x5e,
-    0x24,
-    0x8e,
-    0x8a,
-    0x9d,
-    0x40,
-    0xed,
-    0x96,
-    0x41,
-    0x41,
-    0x6a,
-    0xdf,
-    0x61,
-    0x2b,
-    0x08,
-    0x30,
-    0x2e,
-    0xc1,
-    0x90,
-    0xfc,
-    0xe1,
-    0xa6,
-    0x28,
-    0x9f,
-    0xf2,
-    0xc2,
-    0x27,
-    0xe7,
-    0x8b,
-    0xe7,
-    0x28,
-    0xd3,
-    0x3c,
-    0xb5,
-    0x5e,
-    0x9a,
-    0xf0,
-    0xbb,
-    0x27,
-    0xef,
-    0x20,
-    0xde,
-    0xe3,
-    0x84,
-    0x46,
-    0xff,
-    0x06,
-    0xcd,
-    0x95,
-    0xd8,
-    0x6c,
-    0x06,
-    0xe7,
-    0x27,
-    0xed,
-    0x77,
-    0xf7,
-    0x0f,
-    0x32,
-    0xf7,
-    0xd0,
-    0xbb,
-    0xc6,
-    0xaf,
-    0x85,
-    0x44,
-    0x70,
-    0x20,
-    0x23,
-    0xd5,
-    0xc1,
-    0x68,
-    0xe4,
-    0x0d,
-    0xe9,
-    0xc0,
-    0xa5,
-    0xa4,
-    0xcf,
-    0x4a,
-    0x9a,
-    0x52,
-    0x60,
-    0x0a,
-    0x41,
-    0xec,
-    0x26,
-    0x31,
-    0x94,
-    0xd1,
-    0x1d,
-    0xa2,
-    0x83,
-    0x84,
-    0xc3,
-    0xaf,
-    0xa1,
-    0x9a,
-    0x6f,
-    0x23,
-    0x1e,
-    0xd7,
-    0xe3,
-    0x86,
-    0xf5,
-    0x94,
-    0x24,
-    0x9c,
-    0x66,
-    0x63,
-    0x8a,
-    0x2f,
-    0xa7,
-    0xf6,
-    0x13,
-    0x0e,
-    0xd7,
-    0x3d,
-    0xfc,
-    0x56,
-    0x33,
-    0xcf,
-    0x93,
-    0xf0,
-    0x8c,
-    0x8b,
-    0x47,
-    0x5b,
-    0xf9,
-    0x7f,
-    0x01,
-    0xac,
-    0xc9,
-    0x09,
-    0xb7,
-    0xd3,
-    0xbb,
-    0x3b,
-    0x3e,
-    0x1f,
-    0x72,
-    0x84,
-    0x5f,
-    0x05,
-    0x23,
-    0x8d,
-    0x2e,
-    0x1d,
-    0x91,
-    0x62,
-    0x97,
-    0x6d,
-    0x3b,
-    0xd2,
-    0x3a,
-    0xea,
-    0xd3,
-    0x18,
-    0x79,
-    0x3c,
-    0xf3,
-    0xbb,
-    0xce,
-    0xc2,
-    0x0c,
-    0xb2,
-    0x62,
-    0xd6,
-    0x9f,
-    0xcc,
-    0xdc,
-    0x52,
-    0xaf,
-    0x4f,
-    0x77,
-    0x52,
-    0x76,
-    0xdf,
-    0x58,
-    0x3c,
-    0x57,
-    0xa2,
-    0x1e,
-    0xfe,
-    0x14,
-    0xa2,
-    0xba,
-    0x97,
-    0x41,
-    0x73,
-    0x81,
-    0xd9,
-    0xf8,
-    0x15,
-    0x7f,
-    0x6d,
-    0xcf,
-    0x1b,
-    0x0f,
-    0x17,
-    0x07,
-    0x0d,
-    0xa9,
-    0x3b,
-    0x06,
-    0x0c,
-    0xfa,
-    0xa1,
-    0x07,
-    0xb4,
-    0x3a,
-    0x75,
-    0x11,
-    0x47,
-    0xba,
-    0x92,
-    0x25,
-    0x07,
-    0xbc,
-    0x00,
-    0xbc,
-    0xe3,
-    0x88,
-    0xba,
-    0x71,
-    0x56,
-    0xbc,
-    0xb5,
-    0xfa,
-    0x8d,
-    0xe4,
-    0x1f,
-    0x5c,
-    0xc8,
-    0x4a,
-    0xe4,
-    0x5f,
-    0x02,
-    0x10,
-    0x77,
-    0x40,
-    0xd4,
-    0x7b,
-    0xcf,
-    0xa7,
-    0x97,
-    0x92,
-    0xb0,
-    0xd8,
-    0xc9,
-    0xe8,
-    0x2b,
-    0x2d,
-    0xb1,
-    0xb6,
-    0x68,
-    0xc4,
-    0x46,
-    0x2c,
-    0xa3,
-    0x75,
-    0x4e,
-    0x09,
-    0x75,
-    0x07,
-    0xc3,
-    0x6a,
-    0x55,
-    0xa3,
-    0x7a,
-    0xdf,
-    0x5e,
-    0x88,
-    0x07,
-    0xc4,
-    0x53,
-    0x01,
-    0xdb,
-    0xcf,
-    0xe0,
-    0x94,
-    0xaf,
-    0xe5,
-    0x22,
-    0x7d,
-    0x26,
-    0x32,
-    0x6a,
-    0x5b,
-    0xad,
-    0x78,
-    0x3e,
-    0x28,
-    0xa6,
-    0xa7,
-    0xa1,
-    0x6e,
-    0xc7,
-    0xaf,
-    0x95,
-    0xb8,
-    0xbc,
-    0x92,
-    0xdd,
-    0x47,
-    0x14,
-    0xbd,
-    0x07,
-    0x07,
-    0x5a,
-    0x98,
-    0xaa,
-    0xc2,
-    0x82,
-    0x5c,
-    0xed,
-    0x92,
-    0x88,
-    0x25,
-    0x48,
-    0x9c,
-    0x53,
-    0x48,
-    0x8f,
-    0xfb,
-    0xdf,
-    0xe6,
-    0x2c,
-    0xfb,
-    0x9b,
-    0xc1,
-    0xab,
-    0x88,
-    0x10,
-    0x4f,
-    0x7d,
-    0xe6,
-    0xc4,
-    0x0d,
-    0xf5,
-    0xa2,
-    0x5e,
-    0x16,
-    0x97,
-    0xc8,
-    0x0a,
-    0xf4,
-    0x92,
-    0x56,
-    0x1f,
-    0xb6,
-    0x8b,
-    0xf1,
-    0x00,
-    0x42,
-    0x9c,
-    0xd7,
-    0x40,
-    0xed,
-    0x9d,
-    0x15,
-    0x09,
-    0x49,
-    0xa2,
-    0xfa,
-    0xbe,
-    0x3e,
-    0xc4,
-    0xcb,
-    0xdf,
-    0x5d,
-    0x25,
-    0xb8,
-    0x2d,
-    0x70,
-    0x2e,
-    0x0f,
-    0x0f,
-    0x56,
-    0x1b,
-    0xb0,
-    0x35,
-    0x0e,
-    0xba,
-    0xc1,
-    0x7b,
-    0x11,
-    0x6f,
-    0xa2,
-    0x10,
-    0xe5,
-    0x7c,
-    0x23,
-    0xd7,
-    0xef,
-    0x7f,
-    0xf5,
-    0x0d,
-    0x89,
-    0x3c,
-    0x5f,
-    0x2d,
-    0x54,
-    0x9d,
-    0x32,
-    0x10,
-    0xcf,
-    0xf7,
-    0xff,
-    0x59,
-    0x29,
-    0x8f,
-    0x87,
-    0x10,
-    0x54,
-    0x5d,
-    0x73,
-    0x8d,
-    0x5b,
-    0x10,
-    0x46,
-    0x98,
-    0xf5,
-    0x52,
-    0x8f,
-    0xce,
-    0x5a,
-    0x4c,
-    0x63,
-    0x47,
-    0x55,
-    0x6d,
-    0x0a,
-    0x75,
-    0x9b,
-    0x67,
-    0xf9,
-    0x4f,
-    0x5b,
-    0x7b,
-    0x00,
-    0xaf,
-    0x16,
-    0xf7,
-    0xc5,
-    0xf9,
-    0xb1,
-    0xfd,
-    0x71,
-    0xfe,
-    0xc9,
-    0x85,
-    0xa9,
-    0x20,
-    0x46,
-    0xa5,
-    0xc0,
-    0xb6,
-    0x33,
-    0x11,
-    0x2b,
-    0xb2,
-    0xcd,
-    0xde,
-    0x35,
-    0x81,
-    0xd9,
-    0x8b,
-    0xf4,
-    0x32,
-    0x3b,
-    0x41,
-    0x7b,
-    0xdb,
-    0xc5,
-    0x5a,
-    0x51,
-    0x38,
-    0x4d,
-    0x21,
-    0x22,
-    0x96,
-    0x02,
-    0xd8,
-    0xb5,
-    0xef,
-    0x00,
-    0x00,
-    0x1e,
-    0x57,
-    0x21,
-    0xd4,
-    0x35,
-    0x96,
-    0x16,
-    0x17,
-    0x46,
-    0x17,
-    0xb7,
-    0x0f,
-    0x0a,
-    0x01,
-    0x98,
-    0xd2,
-    0xd6,
-    0xa3,
-    0xdd,
-    0xc0,
-    0x13,
-    0x15,
-    0x4f,
-    0x51,
-    0xee,
-    0x1c,
-    0xaf,
-    0x11,
-    0x50,
-    0x4f,
-    0x4a,
-    0xe8,
-    0x11,
-    0x78,
-    0xcd,
-    0x9f,
-    0x69,
-    0x3d,
-    0x5b,
-    0xa0,
-    0xa7,
-    0x00,
-    0xdd,
-    0xfd,
-    0x25,
-    0x03,
-    0x99,
-    0xb4,
-    0x7b,
-    0xd0,
-    0x07,
-    0x32,
-    0xf3,
-    0xd8,
-    0xdf,
-    0x15,
-    0x3d,
-    0x5a,
-    0x77,
-    0x36,
-    0x64,
-    0x86,
-    0x4c,
-    0xe7,
-    0x01,
-    0xe3,
-    0xde,
-    0x79,
-    0xaf,
-    0xee,
-    0xc2,
-    0x02,
-    0xbe,
-    0x04,
-    0xf2,
-    0x5c,
-    0x2c,
-    0x81,
-    0x67,
-    0x71,
-    0xd0,
-    0x2a,
-    0xea,
-    0xb6,
-    0xd9,
-    0xc8,
-    0x27,
-    0xf6,
-    0x77,
-    0x16,
-    0x03,
-    0x51,
-    0xd8,
-    0xdd,
-    0x2f,
-    0x84,
-    0x56,
-    0x5e,
-    0xfd,
-    0x6b,
-    0xef,
-    0xf0,
-    0x73,
-    0xc4,
-    0xf5,
-    0xea,
-    0x9f,
-    0x35,
-    0x06,
-    0xc3,
-    0x29,
-    0x91,
-    0x3f,
-    0x78,
-    0x2f,
-    0x57,
-    0xad,
-    0x2e,
-    0x4c,
-    0x7b,
-    0x04,
-    0x19,
-    0xfa,
-    0x69,
-    0x94,
-    0x9c,
-    0x1b,
-    0x48,
-    0x78,
-    0xb2,
-    0xd2,
-    0x7b,
-    0x11,
-    0x8c,
-    0x97,
-    0x6e,
-    0xb3,
-    0x7c,
-    0x8b,
-    0x8f,
-    0x9d,
-    0x11,
-    0x08,
-    0x9a,
-    0x2f,
-    0x84,
-    0x7d,
-    0x1a,
-    0x57,
-    0x52,
-    0x79,
-    0x2d,
-    0x4d,
-    0x2b,
-    0x05,
-    0x87,
-    0x80,
-    0x0b,
-    0x37,
-    0xb9,
-    0xd0,
-    0xa7,
-    0x04,
-    0xb3,
-    0xfd,
-    0x0a,
-    0x56,
-    0x88,
-    0x5f,
-    0x80,
-    0x5e,
-    0x72,
-    0xd8,
-    0xb3,
-    0x2c,
-    0x16,
-    0x08,
-    0x14,
-    0x7d,
-    0x09,
-    0xbf,
-    0x7c,
-    0xd4,
-    0x92,
-    0xb8,
-    0x13,
-    0xcc,
-    0xb2,
-    0x84,
-    0x72,
-    0xac,
-    0x61,
-    0xc4,
-    0x04,
-    0x3c,
-    0x1b,
-    0x9b,
-    0xb2,
-    0xd7,
-    0x9b,
-    0x63,
-    0xbf,
-    0xc2,
-    0xe7,
-    0x9f,
-    0xf0,
-    0xbc,
-    0x8c,
-    0x31,
-    0xf1,
-    0xd6,
-    0x2b,
-    0xce,
-    0xf4,
-    0x85,
-    0x34,
-    0xae,
-    0x9b,
-    0xf6,
-    0xf2,
-    0x88,
-    0x18,
-    0xa1,
-    0xc8,
-    0xbd,
-    0x93,
-    0x21,
-    0xba,
-    0xd4,
-    0xcb,
-    0x43,
-    0x2e,
-    0x26,
-    0x01,
-    0x5d,
-    0xf4,
-    0xda,
-    0x12,
-    0xe1,
-    0x85,
-    0x14,
-    0xe3,
-    0x31,
-    0x88,
-    0x6a,
-    0x01,
-    0xb5,
-    0x9b,
-    0x98,
-    0x89,
-    0x2c,
-    0x4f,
-    0x74,
-    0x46,
-    0x3f,
-    0x74,
-    0x24,
-    0x1a,
-    0x5c,
-    0x98,
-    0x8e,
-    0x9f,
-    0xc1,
-    0xca,
-    0x10,
-    0x0d,
-    0xd7,
-    0xa4,
-    0x71,
-    0x5f,
-    0xc2,
-    0x88,
-    0x18,
-    0xb1,
-    0x36,
-    0x29,
-    0x7c,
-    0xed,
-    0x8c,
-    0x4d,
-    0xdc,
-    0xa6,
-    0x15,
-    0xd2,
-    0x30,
-    0x44,
-    0xae,
-    0xef,
-    0x5f,
-    0x62,
-    0x94,
-    0xbd,
-    0xb2,
-    0x74,
-    0x7a,
-    0xf6,
-    0x89,
-    0xad,
-    0xd9,
-    0xfc,
-    0x4d,
-    0x20,
-    0x88,
-    0x1d,
-    0xa5,
-    0x25,
-    0x8c,
-    0x15,
-    0xed,
-    0xfe,
-    0x31,
-    0xd4,
-    0xe4,
-    0xba,
-    0x5a,
-    0x82,
-    0xa4,
-    0x5a,
-    0x15,
-    0xc1,
-    0xd8,
-    0x33,
-    0x72,
-    0x32,
-    0x29,
-    0x93,
-    0x96,
-    0x3a,
-    0xf9,
-    0xa7,
-    0x0b,
-    0x06,
-    0x54,
-    0x9c,
-    0x5a,
-    0xcc,
-    0x23,
-    0x05,
-    0xdc,
-    0x54,
-    0xa3,
-    0x7d,
-    0xcd,
-    0xb8,
-    0x16,
-    0x8d,
-    0xa2,
-    0x68,
-    0xb9,
-    0xd0,
-    0x9c,
-    0x70,
-    0xf5,
-    0x54,
-    0x9e,
-    0xfe,
-    0xd9,
-    0x44,
-    0x3c,
-    0x1e,
-    0xc8,
-    0xc4,
-    0x14,
-    0xc9,
-    0x6f,
-    0x1d,
-    0x61,
-    0x1e,
-    0xfa,
-    0x1a,
-    0xcd,
-    0xef,
-    0x88,
-    0xb2,
-    0x87,
-    0x7f,
-    0xdc,
-    0xe6,
-    0x96,
-    0x8a,
-    0x55,
-    0xed,
-    0x6d,
-    0x86,
-    0x20,
-    0x8f,
-    0xbf,
-    0x29,
-    0xac,
-    0xcf,
-    0x94,
-    0x2b,
-    0x5e,
-    0xcc,
-    0x9d,
-    0x4d,
-    0x87,
-    0xe9,
-    0xc4,
-    0x9a,
-    0x93,
-    0x2c,
-    0x08,
-    0xed,
-    0x83,
-    0xe4,
-    0x88,
-    0xb3,
-    0x9d,
-    0x8f,
-    0xdd,
-    0xf2,
-    0x61,
-    0xfa,
-    0xad,
-    0x8b,
-    0xc0,
-    0xaa,
-    0x7d,
-    0xbc,
-    0x89,
-    0x7b,
-    0xc7,
-    0xe8,
-    0x24,
-    0x87,
-    0x4d,
-    0x9b,
-    0x82,
-    0x49,
-    0xac,
-    0xc9,
-    0x54,
-    0x03,
-    0x34,
-    0x56,
-    0x7b,
-    0x5c,
-    0xf7,
-    0xdb,
-    0xc0,
-    0x4e,
-    0x20,
-    0xa8,
-    0xc6,
-    0x3f,
-    0x87,
-    0x05,
-    0x3c,
-    0x6e,
-    0x82,
-    0xbe,
-    0x57,
-    0x91,
-    0xfd,
-    0xde,
-    0x80,
-    0xbd,
-    0xcd,
-    0xba,
-    0x4a,
-    0x85,
-    0x41,
-    0x31,
-    0xa6,
-    0x66,
-    0xfa,
-    0x33,
-    0x5a,
-    0x63,
-    0xfd,
-    0x80,
-    0xaf,
-    0xec,
-    0x07,
-    0xb2,
-    0x6a,
-    0x04,
-    0x21,
-    0x7e,
-    0xfe,
-    0xa3,
-    0x73,
-    0x37,
-    0x00,
-    0x59,
-    0x5d,
-    0x93,
-    0xdb,
-    0x35,
-    0xc4,
-    0xb2,
-    0xc5,
-    0xe5,
-    0xaa,
-    0x5c,
-    0xf2,
-    0x1e,
-    0x02,
-    0x8b,
-    0x07,
-    0x3f,
-    0xc2,
-    0x29,
-    0xd1,
-    0x31,
-    0x39,
-    0x1a,
-    0x37,
-    0x91,
-    0xa3,
-    0x7d,
-    0x6d,
-    0x11,
-    0xfb,
-    0x2f,
-    0x6b,
-    0x1b,
-    0x10,
-    0x91,
-    0x9e,
-    0xb8,
-    0xdb,
-    0x8c,
-    0xdd,
-    0xb1,
-    0x10,
-    0xd2,
-    0x9e,
-    0xf4,
-    0xf3,
-    0x66,
-    0x6a,
-    0x38,
-    0x6d,
-    0x5e,
-    0x8e,
-    0xe4,
-    0x5f,
-    0xe8,
-    0x14,
-    0x2d,
-    0x36,
-    0x8b,
-    0xf1,
-    0x7f,
-    0xc0,
-    0xaf,
-    0x80,
-    0x1f,
-    0x3e,
-    0x60,
-    0x2f,
-    0x0e,
-    0xba,
-    0x4f,
-    0x79,
-    0x30,
-    0x9a,
-    0x19,
-    0x14,
-    0xad,
-    0x76,
-    0xcc,
-    0x6b,
-    0x98,
-    0x27,
-    0xa8,
-    0x4e,
-    0xcf,
-    0x20,
-    0x22,
-    0xe8,
-    0x22,
-    0x02,
-    0x2f,
-    0xf2,
-    0xb7,
-    0x6a,
-    0xbe,
-    0x27,
-    0xac,
-    0x0d,
-    0x86,
-    0xf8,
-    0xff,
-    0x08,
-    0x03,
-    0x80,
-    0xab,
-    0x71,
-    0xbb,
-    0xba,
-    0x14,
-    0x32,
-    0xc6,
-    0xf2,
-    0xa5,
-    0x17,
-    0x8d,
-    0x79,
-    0xb8,
-    0x25,
-    0xd2,
-    0x9d,
-    0xb6,
-    0x2e,
-    0xf1,
-    0xd8,
-    0x7f,
-    0xa2,
-    0x65,
-    0x48,
-    0x0c,
-    0xa8,
-    0x8d,
-    0x5f,
-    0x53,
-    0x6d,
-    0xb0,
-    0xdc,
-    0x6a,
-    0xbc,
-    0x40,
-    0xfa,
-    0xf0,
-    0xd0,
-    0x5b,
-    0xe7,
-    0xa9,
-    0x66,
-    0x97,
-    0x77,
-    0x68,
-    0x16,
-    0xff,
-    0x1a,
-    0x32,
-    0xe2,
-    0x59,
-    0x0c,
-    0xa0,
-    0x10,
-    0xab,
-    0xcb,
-    0x85,
-    0x35,
-    0xfd,
-    0xce,
-    0xd1,
-    0x93,
-    0x5f,
-    0x74,
-    0xb5,
-    0xa4,
-    0x2e,
-    0x3b,
-    0x08,
-    0xf7,
-    0x94,
-    0x32,
-    0xea,
-    0x3b,
-    0x4e,
-    0xb1,
-    0xa7,
-    0x9a,
-    0xb2,
-    0x47,
-    0xde,
-    0x48,
-    0xf0,
-    0xf4,
-    0xe2,
-    0x5b,
-    0x98,
-    0x98,
-    0x60,
-    0xdd,
-    0x5c,
-    0xac,
-    0x42,
-    0x1f,
-    0x18,
-    0x30,
-    0xd4,
-    0x51,
-    0x0f,
-    0xe4,
-    0x25,
-    0x50,
-    0x77,
-    0xbb,
-    0xb1,
-    0xbf,
-    0x39,
-    0x8d,
-    0x3c,
-    0x59,
-    0xf2,
-    0x0c,
-    0x01,
-    0x85,
-    0x3d,
-    0xf9,
-    0x0c,
-    0x2b,
-    0x34,
-    0x98,
-    0xe5,
-    0xc7,
-    0x34,
-    0x61,
-    0x6e,
-    0xbc,
-    0xe1,
-    0xf8,
-    0x0e,
-    0xea,
-    0x6a,
-    0x5f,
-    0x0f,
-    0x82,
-    0x0f,
-    0x6b,
-    0x45,
-    0x19,
-    0xe0,
-    0x74,
-    0xf1,
-    0xfc,
-    0xc7,
-    0x51,
-    0xe4,
-    0xc4,
-    0xc8,
-    0x83,
-    0xe8,
-    0x2a,
-    0x88,
-    0xb1,
-    0x5b,
-    0x1c,
-    0x0c,
-    0x55,
-    0x1d,
-    0x10,
-    0xc4,
-    0xb4,
-    0xad,
-    0x98,
-    0xc8,
-    0x13,
-    0x8e,
-    0x36,
-    0x61,
-    0x28,
-    0xf0,
-    0x72,
-    0xcb,
-    0xcf,
-    0x8c,
-    0x2b,
-    0x39,
-    0xfe,
-    0xd0,
-    0x2b,
-    0x1a,
-    0xfb,
-    0x3c,
-    0xfe,
-    0x9b,
-    0xcc,
-    0x0c,
-    0x03,
-    0x6d,
-    0xf0,
-    0x17,
-    0xc3,
-    0xc8,
-    0x4c,
-    0xf7,
-    0x82,
-    0xb0,
-    0x68,
-    0x6a,
-    0x14,
-    0x77,
-    0xdb,
-    0xf8,
-    0xf2,
-    0x83,
-    0x04,
-    0xd6,
-    0x8d,
-    0x51,
-    0xfb,
-    0x0b,
-    0xe2,
-    0xba,
-    0xc7,
-    0xd1,
-    0x4f,
-    0x75,
-    0xd2,
-    0x3e,
-    0xa5,
-    0xde,
-    0x9a,
-    0x23,
-    0x7e,
-    0xf5,
-    0xa8,
-    0x35,
-    0xd1,
-    0xaa,
-    0xc6,
-    0x6a,
-    0xc3,
-    0x58,
-    0x6d,
-    0xa6,
-    0xc0,
-    0x8f,
-    0x7d,
-    0x97,
-    0xcb,
-    0x16,
-    0x30,
-    0xdd,
-    0x12,
-    0x30,
-    0x51,
-    0x6f,
-    0xc6,
-    0x1f,
-    0xa9,
-    0x3a,
-    0x29,
-    0xe7,
-    0xbb,
-    0x0b,
-    0xe9,
-    0x54,
-    0xb1,
-    0xae,
-    0xac,
-    0x3e,
-    0x95,
-    0x58,
-    0xec,
-    0x0c,
-    0xc4,
-    0x42,
-    0x05,
-    0x77,
-    0xa0,
-    0x97,
-    0x8c,
-    0x91,
-    0x86,
-    0x90,
-    0xe3,
-    0x05,
-    0x00,
-    0xdd,
-    0x0a,
-    0xa0,
-    0x3b,
-    0x48,
-    0xb8,
-    0x10,
-    0xbb,
-    0x95,
-    0xab,
-    0xec,
-    0x4d,
-    0xac,
-    0x3c,
-    0xf5,
-    0x3d,
-    0xfa,
-    0x36,
-    0x9c,
-    0xca,
-    0x14,
-    0xe8,
-    0xc4,
-    0xd7,
-    0x9d,
-    0x79,
-    0xc8,
-    0xe3,
-    0x6b,
-    0x7c,
-    0xc0,
-    0x3b,
-    0xe5,
-    0xc4,
-    0x00,
-    0x6e,
-    0xaf,
-    0x7a,
-    0xe2,
-    0x02,
-    0x8a,
-    0x6c,
-    0xc6,
-    0x65,
-    0x75,
-    0xa8,
-    0x56,
-    0x26,
-    0x18,
-    0x4a,
-    0x0f,
-    0x65,
-    0x63,
-    0x92,
-    0xfd,
-    0x89,
-    0x73,
-    0x3a,
-    0xc5,
-    0x31,
-    0xb5,
-    0x06,
-    0xe9,
-    0x6c,
-    0x4d,
-    0x9c,
-    0x48,
-    0x2c,
-    0xb9,
-    0x96,
-    0xe4,
-    0xf8,
-    0xb1,
-    0xd6,
-    0xe8,
-    0xe2,
-    0x52,
-    0x19,
-    0xea,
-    0xb9,
-    0x7c,
-    0xcf,
-    0x6d,
-    0x7f,
-    0x79,
-    0x2b,
-    0xaa,
-    0x1d,
-    0xdf,
-    0x76,
-    0x90,
-    0x56,
-    0xb7,
-    0xa8,
-    0x09,
-    0xfa,
-    0xde,
-    0x39,
-    0x7f,
-    0x5c,
-    0xac,
-    0x35,
-    0x9f,
-    0x05,
-    0xd4,
-    0x8f,
-    0x5c,
-    0xaa,
-    0x8b,
-    0xb7,
-    0x37,
-    0x5c,
-    0xed,
-    0x6e,
-    0xbe,
-    0xff,
-    0x9c,
-    0xda,
-    0x53,
-    0xfd,
-    0xaa,
-    0xd5,
-    0x2f,
-    0x3c,
-    0xb9,
-    0x8b,
-    0xa7,
-    0x4d,
-    0x60,
-    0x44,
-    0xad,
-    0xe6,
-    0xd1,
-    0x7e,
-    0x99,
-    0x92,
-    0xb9,
-    0x3f,
-    0x2a,
-    0xa7,
-    0x68,
-    0xa9,
-    0xc7,
-    0x78,
-    0x32,
-    0xcf,
-    0x0b,
-    0xcd,
-    0x15,
-    0xc7,
-    0x81,
-    0x90,
-    0x9c,
-    0x01,
-    0xac,
-    0xc9,
-    0x02,
-    0xd6,
-    0x4b,
-    0xcd,
-    0x9b,
-    0x64,
-    0xda,
-    0xb1,
-    0x70,
-    0x9a,
-    0x5c,
-    0x05,
-    0x29,
-    0x8f,
-    0x58,
-    0xbf,
-    0x31,
-    0x18,
-    0x22,
-    0x76,
-    0x14,
-    0x99,
-    0x5b,
-    0xd1,
-    0x2c,
-    0x1b,
-    0xbb,
-    0x3e,
-    0x7c,
-    0x9f,
-    0x0e,
-    0xe7,
-    0xdc,
-    0xb2,
-    0x7d,
-    0xe2,
-    0x57,
-    0x42,
-    0x0f,
-    0xa7,
-    0xd1,
-    0xb0,
-    0x70,
-    0xc8,
-    0xec,
-    0x26,
-    0xf0,
-    0xdc,
-    0x2d,
-    0x2b,
-    0xce,
-    0xbc,
-    0x5b,
-    0x75,
-    0xb7,
-    0xf3,
-    0x28,
-    0xfe,
-    0x8a,
-    0x6f,
-    0x14,
-    0x5a,
-    0x5e,
-    0x7d,
-    0x8d,
-    0x47,
-    0xc6,
-    0xf4,
-    0x5b,
-    0x86,
-    0x54,
-    0xaf,
-    0x3b,
-    0xe9,
-    0x5b,
-    0x41,
-    0xca,
-    0xae,
-    0xf9,
-    0xe5,
-    0xa5,
-    0x0b,
-    0x55,
-    0xb4,
-    0xcf,
-    0x0a,
-    0x26,
-    0x1b,
-    0x53,
-    0x97,
-    0x75,
-    0x8b,
-    0x2a,
-    0xd7,
-    0xa3,
-    0x72,
-    0x5e,
-    0xbc,
-    0xad,
-    0x6b,
-    0x70,
-    0xd7,
-    0xaf,
-    0xb1,
-    0xf8,
-    0x6d,
-    0xa7,
-    0xda,
-    0x8b,
-    0xcc,
-    0x7c,
-    0xc2,
-    0xe1,
-    0xdf,
-    0x3f,
-    0xc5,
-    0x37,
-    0x01,
-    0xb0,
-    0x31,
-    0xf3,
-    0x0f,
-    0x04,
-    0xfa,
-    0x87,
-    0xc1,
-    0xe5,
-    0xb0,
-    0x97,
-    0x3a,
-    0xbb,
-    0xaf,
-    0x5e,
-    0xdd,
-    0x2a,
-    0x96,
-    0x4e,
-    0x63,
-    0xdb,
-    0xfa,
-    0xf6,
-    0x2a,
-    0x80,
-    0x5b,
-    0x29,
-    0xd0,
-    0x12,
-    0x56,
-    0x5d,
-    0x01,
-    0x5d,
-    0x1d,
-    0x51,
-    0x8d,
-    0xbf,
-    0x25,
-    0xf3,
-    0xbe,
-    0x2d,
-    0x1e,
-    0x80,
-    0xe8,
-    0x76,
-    0x28,
-    0xed,
-    0x41,
-    0xcc,
-    0x44,
-    0x86,
-    0xf3,
-    0x80,
-    0x08,
-    0xd5,
-    0x70,
-    0x0d,
-    0x98,
-    0xc5,
-    0x06,
-    0x58,
-    0xd1,
-    0x07,
-    0xb3,
-    0x36,
-    0xc7,
-    0xb5,
-    0x3a,
-    0x2f,
-    0x72,
-    0x35,
-    0x76,
-    0x82,
-    0xa4,
-    0x61,
-    0xef,
-    0x68,
-    0x3e,
-    0xe4,
-    0xab,
-    0x9d,
-    0xa4,
-    0xe7,
-    0x47,
-    0x1d,
-    0x6e,
-    0xee,
-    0x46,
-    0x2b,
-    0x61,
-    0xfc,
-    0xa8,
-    0x98,
-    0x9d,
-    0xfe,
-    0xbe,
-    0x42,
-    0x17,
-    0x66,
-    0x3e,
-    0xdb,
-    0x4a,
-    0x17,
-    0x93,
-    0xec,
-    0x2a,
-    0x81,
-    0x76,
-    0x19,
-    0x5a,
-    0x0d,
-    0xc2,
-    0xa6,
-    0x9e,
-    0xbb,
-    0x84,
-    0x3a,
-    0x93,
-    0x09,
-    0x52,
-    0xe3,
-    0x9e,
-    0x18,
-    0xdf,
-    0x5b,
-    0x22,
-    0x0a,
-    0xcc,
-    0x8a,
-    0xf6,
-    0xae,
-    0xc0,
-    0x4b,
-    0x16,
-    0x5f,
-    0xba,
-    0x73,
-    0x98,
-    0x29,
-    0xa6,
-    0x10,
-    0xe2,
-    0x2e,
-    0x2f,
-    0xee,
-    0x1b,
-    0x48,
-    0xd5,
-    0x60,
-    0xdf,
-    0xf0,
-    0x3f,
-    0x3c,
-    0x37,
-    0x5f,
-    0xd2,
-    0x28,
-    0xc8,
-    0xf2,
-    0x82,
-    0x14,
-    0x4a,
-    0xd3,
-    0xe8,
-    0x08,
-    0x3c,
-    0xd6,
-    0x95,
-    0x20,
-    0xd6,
-    0xa1,
-    0xa7,
-    0xd5,
-    0x40,
-    0x10,
-    0x9a,
-    0x7d,
-    0x01,
-    0xd8,
-    0x60,
-    0x15,
-    0xba,
-    0x6a,
-    0xb3,
-    0x3f,
-    0x14,
-    0x1a,
-    0xaa,
-    0x87,
-    0xf7,
-    0x80,
-    0x8a,
-    0xea,
-    0xfd,
-    0x1e,
-    0xdf,
-    0x99,
-    0x26,
-    0x44,
-    0xcc,
-    0xfa,
-    0xcd,
-    0x31,
-    0xa0,
-    0xf0,
-    0xda,
-    0x7b,
-    0xa9,
-    0x5c,
-    0x3a,
-    0xb1,
-    0x4d,
-    0xe4,
-    0x8c,
-    0x3e,
-    0x56,
-    0xf3,
-    0x1d,
-    0x90,
-    0x8e,
-    0x00,
-    0x17,
-    0x7a,
-    0x8c,
-    0x14,
-    0xf5,
-    0xd7,
-    0xcd,
-    0x86,
-    0x3a,
-    0x71,
-    0x07,
-    0x09,
-    0x63,
-    0x21,
-    0xb9,
-    0xea,
-    0x1a,
-    0x37,
-    0x07,
-    0x92,
-    0xac,
-    0x1b,
-    0xc5,
-    0x52,
-    0xbd,
-    0x35,
-    0xd2,
-    0x60,
-    0x3b,
-    0x0b,
-    0xa7,
-    0x1c,
-    0x90,
-    0xa9,
-    0x2f,
-    0x98,
-    0x1c,
-    0x46,
-    0xda,
-    0x58,
-    0xe2,
-    0x24,
-    0xed,
-    0x56,
-    0x81,
-    0xb8,
-    0x1c,
-    0x49,
-    0x67,
-    0x0b,
-    0x5a,
-    0x27,
-    0x41,
-    0x60,
-    0xf0,
-    0xe9,
-    0xb5,
-    0x17,
-    0xcc,
-    0x8e,
-    0x54,
-    0xd1,
-    0x1c,
-    0x62,
-    0xca,
-    0xd5,
-    0x1c,
-    0x80,
-    0x58,
-    0xb3,
-    0x2c,
-    0x96,
-    0x85,
-    0x27,
-    0x26,
-    0xe8,
-    0x10,
-    0x3f,
-    0xee,
-    0x98,
-    0x28,
-    0xc0,
-    0x4b,
-    0x24,
-    0xdf,
-    0xc7,
-    0xf5,
-    0x30,
-    0xdd,
-    0xac,
-    0xef,
-    0x86,
-    0x51,
-    0x2b,
-    0x16,
-    0x5b,
-    0x2e,
-    0xc6,
-    0xfb,
-    0xd4,
-    0x93,
-    0x65,
-    0xee,
-    0xc8,
-    0x8a,
-    0x40,
-    0x5b,
-    0xc8,
-    0xf6,
-    0xfe,
-    0x5a,
-    0x5c,
-    0xc7,
-    0x1e,
-    0x81,
-    0x90,
-    0x70,
-    0x97,
-    0xfc,
-    0xaf,
-    0x9b,
-    0xbb,
-    0xe0,
-    0x4f,
-    0x1b,
-    0x61,
-    0xbd,
-    0x8d,
-    0x22,
-    0x43,
-    0x73,
-    0x9a,
-    0xb4,
-    0xa5,
-    0x46,
-    0x77,
-    0x5b,
-    0x38,
-    0x34,
-    0xfc,
-    0x1d,
-    0x3d,
-    0x85,
-    0x1f,
-    0xab,
-    0xed,
-    0xa5,
-    0x73,
-    0xdb,
-    0x19,
-    0x2f,
-    0xef,
-    0x58,
-    0x0e,
-    0x4a,
-    0xf1,
-    0x98,
-    0xbb,
-    0x38,
-    0x82,
-    0x0f,
-    0x16,
-    0x2c,
-    0xdc,
-    0xa3,
-    0xbb,
-    0x5c,
-    0x2a,
-    0x5f,
-    0xd6,
-    0x58,
-    0x8e,
-    0x6b,
-    0x44,
-    0x9a,
-    0x68,
-    0x3c,
-    0xf5,
-    0x5e,
-    0xd6,
-    0x08,
-    0x95,
-    0xb4,
-    0x77,
-    0x7d,
-    0x6b,
-    0xd3,
-    0x75,
-    0xb2,
-    0x81,
-    0xb0,
-    0xc2,
-    0x5e,
-    0x05,
-    0xcf,
-    0xa1,
-    0x48,
-    0xef,
-    0x59,
-    0x69,
-    0xfe,
-    0xe4,
-    0x70,
-    0x85,
-    0xca,
-    0x5a,
-    0xbf,
-    0xc0,
-    0xe2,
-    0xfe,
-    0x55,
-    0xc0,
-    0xdf,
-    0x52,
-    0xb3,
-    0xcf,
-    0x70,
-    0x9b,
-    0x23,
-    0xe2,
-    0x50,
-    0xfa,
-    0x4c,
-    0xd3,
-    0x75,
-    0xd9,
-    0x04,
-    0xf2,
-    0x8b,
-    0x88,
-    0x65,
-    0xbc,
-    0xa0,
-    0x28,
-    0x23,
-    0xea,
-    0x21,
-    0xc9,
-    0x1c,
-    0xae,
-    0x05,
-    0xcf,
-    0x31,
-    0x39,
-    0x48,
-    0x9a,
-    0x55,
-    0x80,
-    0x9b,
-    0x66,
-    0xe3,
-    0x40,
-    0x5a,
-    0x6f,
-    0x35,
-    0x3f,
-    0xbe,
-    0x59,
-    0x72,
-    0xd6,
-    0x54,
-    0xd0,
-    0xa7,
-    0xac,
-    0xad,
-    0x6c,
-    0x1a,
-    0xc4,
-    0x57,
-    0xd7,
-    0xdb,
-    0xba,
-    0x0d,
-    0x31,
-    0x9b,
-    0x49,
-    0x2b,
-    0xb3,
-    0xc1,
-    0x11,
-    0x65,
-    0x93,
-    0xbb,
-    0x97,
-    0xb7,
-    0x28,
-    0x92,
-    0x8e,
-    0x9f,
-    0x4f,
-    0xc2,
-    0x55,
-    0x8b,
-    0x0d,
-    0x48,
-    0xc0,
-    0x8d,
-    0x76,
-    0xfc,
-    0x1b,
-    0x56,
-    0xcd,
-    0x21,
-    0x6c,
-    0x62,
-    0xec,
-    0x3b,
-    0xf9,
-    0x70,
-    0xe6,
-    0x20,
-    0x0a,
-    0x35,
-    0xec,
-    0x52,
-    0xf0,
-    0x51,
-    0x6d,
-    0x8c,
-    0x46,
-    0x82,
-    0x81,
-    0x9b,
-    0x77,
-    0x18,
-    0x88,
-    0x6f,
-    0x81,
-    0xa9,
-    0x0e,
-    0x72,
-    0xf8,
-    0x05,
-    0xf3,
-    0x19,
-    0x4d,
-    0x6c,
-    0xc8,
-    0xb8,
-    0x50,
-    0xff,
-    0x7b,
-    0x9a,
-    0xf4,
-    0x75,
-    0x37,
-    0x51,
-    0x52,
-    0x0f,
-    0x86,
-    0x4b,
-    0xf1,
-    0xce,
-    0xb9,
-    0xa6,
-    0x45,
-    0xe3,
-    0x89,
-    0x45,
-    0x75,
-    0x67,
-    0xfe,
-    0x24,
-    0x62,
-    0x4c,
-    0x90,
-    0xe8,
-    0xe4,
-    0x94,
-    0x8d,
-    0xbb,
-    0x56,
-    0xc0,
-    0xba,
-    0x56,
-    0x56,
-    0x8c,
-    0x3d,
-    0x5f,
-    0xc6,
-    0xd9,
-    0xba,
-    0xf6,
-    0x16,
-    0xeb,
-    0xbd,
-    0x8b,
-    0xc6,
-    0xd4,
-    0x58,
-    0xf2,
-    0x26,
-    0x30,
-    0x0d,
-    0xb9,
-    0x61,
-    0x13,
-    0xed,
-    0xb9,
-    0xb9,
-    0x40,
-    0x02,
-    0xeb,
-    0x14,
-    0x9c,
-    0xeb,
-    0x7d,
-    0xb8,
-    0xe2,
-    0xc6,
-    0x25,
-    0x53,
-    0x97,
-    0x53,
-    0xb6,
-    0x3e,
-    0x41,
-    0x55,
-    0xf1,
-    0x02,
-    0xd4,
-    0x3c,
-    0x9d,
-    0x1c,
-    0x6d,
-    0x02,
-    0xda,
-    0xfd,
-    0x42,
-    0x53,
-    0xb2,
-    0x55,
-    0xd9,
-    0xf0,
-    0xf1,
-    0x91,
-    0x79,
-    0x55,
-    0x36,
-    0xa2,
-    0xdf,
-    0x9a,
-    0x4b,
-    0x01,
-    0x31,
-    0x97,
-    0xb2,
-    0xf0,
-    0x38,
-    0x4b,
-    0x80,
-    0x02,
-    0xc9,
-    0x7f,
-    0x6f,
-    0xdd,
-    0x84,
-    0xa6,
-    0x2e,
-    0x3f,
-    0xc2,
-    0x08,
-    0xfb,
-    0x3f,
-    0xc8,
-    0x1f,
-    0x74,
-    0xd6,
-    0x41,
-    0x41,
-    0xaa,
-    0x9d,
-    0xeb,
-    0x80,
-    0x78,
-    0xd8,
-    0x90,
-    0xcf,
-    0x13,
-    0xb4,
-    0x38,
-    0x66,
-    0xe1,
-    0xcd,
-    0x9d,
-    0x67,
-    0x8f,
-    0xf3,
-    0xdf,
-    0xc1,
-    0x5e,
-    0x2e,
-    0x79,
-    0x54,
-    0xbd,
-    0xff,
-    0x74,
-    0x57,
-    0x1d,
-    0xe9,
-    0xda,
-    0xf7,
-    0x01,
-    0x30,
-    0x6e,
-    0x41,
-    0x54,
-    0xe1,
-    0x9a,
-    0x42,
-    0x00,
-    0x12,
-    0xa9,
-    0x6d,
-    0xbc,
-    0x6b,
-    0x36,
-    0x3d,
-    0x25,
-    0xe6,
-    0xe4,
-    0x1b,
-    0x11,
-    0xd2,
-    0x50,
-    0x81,
-    0x20,
-    0x1e,
-    0x44,
-    0x60,
-    0x94,
-    0xd4,
-    0x2e,
-    0xbf,
-    0x62,
-    0xe4,
-    0xd0,
-    0xa5,
-    0x88,
-    0x23,
-    0x38,
-    0x3a,
-    0xa2,
-    0x93,
-    0xf3,
-    0x29,
-    0xb8,
-    0xe5,
-    0x7e,
-    0x48,
-    0x5b,
-    0x3c,
-    0xfd,
-    0x7b,
-    0xf0,
-    0x34,
-    0x2f,
-    0xd6,
-    0x4b,
-    0x23,
-    0xa2,
-    0x01,
-    0x80,
-    0x9f,
-    0x23,
-    0xe1,
-    0xf5,
-    0x40,
-    0x79,
-    0x74,
-    0xbc,
-    0xa6,
-    0x53,
-    0xfd,
-    0x20,
-    0xbe,
-    0x7e,
-    0x62,
-    0x7e,
-    0x42,
-    0x5b,
-    0xd2,
-    0x57,
-    0x7f,
-    0x91,
-    0xaa,
-    0xa2,
-    0x5b,
-    0xff,
-    0x9a,
-    0x67,
-    0x96,
-    0xf5,
-    0x04,
-    0x89,
-    0x50,
-    0xa3,
-    0xa4,
-    0xe4,
-    0xcc,
-    0xd1,
-    0x76,
-    0x97,
-    0x73,
-    0xd1,
-    0xd4,
-    0xa3,
-    0x1c,
-    0xb2,
-    0xdf,
-    0xb6,
-    0x8a,
-    0xb7,
-    0x21,
-    0x41,
-    0x36,
-    0x07,
-    0x71,
-    0xd0,
-    0x4f,
-    0xa6,
-    0x16,
-    0x9b,
-    0x00,
-    0xa4,
-    0x2f,
-    0x58,
-    0xf1,
-    0x95,
-    0x52,
-    0x54,
-    0x10,
-    0x41,
-    0x73,
-    0xc2,
-    0x91,
-    0x9c,
-    0x07,
-    0x53,
-    0x33,
-    0xf8,
-    0x6a,
-    0x07,
-    0xc6,
-    0x79,
-    0x7e,
-    0x42,
-    0xea,
-    0xc9,
-    0x96,
-    0x22,
-    0x19,
-    0x0e,
-    0x92,
-    0x10,
-    0xe8,
-    0x19,
-    0x4b,
-    0x95,
-    0x89,
-    0xe0,
-    0x31,
-    0x6f,
-    0x95,
-    0x2f,
-    0x32,
-    0xe5,
-    0x08,
-    0x9a,
-    0xde,
-    0x57,
-    0x8e,
-    0xb6,
-    0xc9,
-    0x19,
-    0xfd,
-    0x89,
-    0x31,
-    0x82,
-    0x22,
-    0x3e,
-    0xe1,
-    0x3f,
-    0xc0,
-    0x1d,
-    0x55,
-    0xed,
-    0xd6,
-    0xbb,
-    0x1f,
-    0xe8,
-    0x21,
-    0x6e,
-    0x8a,
-    0x5d,
-    0xe2,
-    0x04,
-    0x7c,
-    0xa7,
-    0xe1,
-    0xb5,
-    0xa1,
-    0xd8,
-    0xb2,
-    0x55,
-    0xc5,
-    0x95,
-    0x37,
-    0xcf,
-    0x82,
-    0x28,
-    0x66,
-    0xce,
-    0x1c,
-    0xd0,
-    0x4c,
-    0xbd,
-    0xa9,
-    0x5b,
-    0x52,
-    0xf2,
-    0x75,
-    0xf7,
-    0xc0,
-    0x26,
-    0xa4,
-    0x46,
-    0x7f,
-    0x29,
-    0x19,
-    0xb0,
-    0x23,
-    0xd3,
-    0x97,
-    0xfd,
-    0x29,
-    0x3e,
-    0x26,
-    0x23,
-    0x7c,
-    0x32,
-    0xb9,
-    0x5c,
-    0x3e,
-    0xe1,
-    0x0d,
-    0x7c,
-    0xc6,
-    0xd5,
-    0xd4,
-    0x82,
-    0xe5,
-    0x26,
-    0x13,
-    0x6d,
-    0x6e,
-    0xf0,
-    0xc9,
-    0x51,
-    0xf5,
-    0x04,
-    0xd1,
-    0xa9,
-    0xd6,
-    0xde,
-    0x09,
-    0xef,
-    0x7a,
-    0xd8,
-    0xb4,
-    0x6a,
-    0xd5,
-    0x9d,
-    0x1d,
-    0x48,
-    0x33,
-    0xdf,
-    0x7e,
-    0xec,
-    0x35,
-    0x4d,
-    0x1f,
-    0x89,
-    0x16,
-    0xbf,
-    0xc2,
-    0xf0,
-    0x33,
-    0xb4,
-    0x3f,
-    0xa6,
-    0xcb,
-    0xff,
-    0x6c,
-    0x3a,
-    0x03,
-    0xbd,
-    0x3f,
-    0xd5,
-    0x2d,
-    0x8a,
-    0x37,
-    0x13,
-    0x49,
-    0xf5,
-    0xf7,
-    0x11,
-    0xcc,
-    0x31,
-    0x35,
-    0xc8,
-    0xa1,
-    0x0d,
-    0xd2,
-    0x99,
-    0x6e,
-    0x25,
-    0x4a,
-    0x28,
-    0x18,
-    0x5a,
-    0x4f,
-    0x6e,
-    0x89,
-    0x81,
-    0xb1,
-    0x0a,
-    0xb1,
-    0x58,
-    0x81,
-    0xd8,
-    0xca,
-    0xbe,
-    0x76,
-    0xc5,
-    0xe1,
-    0x23,
-    0x8f,
-    0xe2,
-    0x92,
-    0x3d,
-    0xfa,
-    0xb7,
-    0x13,
-    0xfc,
-    0x35,
-    0xd9,
-    0x74,
-    0xc1,
-    0x73,
-    0xbf,
-    0x24,
-    0xcb,
-    0x41,
-    0xd1,
-    0xb8,
-    0xf1,
-    0x69,
-    0xc2,
-    0xe8,
-    0x97,
-    0x17,
-    0x20,
-    0xda,
-    0xdb,
-    0x3a,
-    0x29,
-    0xa4,
-    0x0f,
-    0x2d,
-    0xe1,
-    0x0c,
-    0x6c,
-    0x97,
-    0x61,
-    0x91,
-    0x04,
-    0x90,
-    0x72,
-    0xb0,
-    0xf9,
-    0x05,
-    0x5a,
-    0x60,
-    0xed,
-    0x5d,
-    0xf6,
-    0xdf,
-    0xb9,
-    0x5c,
-    0x09,
-    0xb0,
-    0x62,
-    0x48,
-    0xd4,
-    0xe5,
-    0x49,
-    0x4b,
-    0xe7,
-    0x9a,
-    0xa1,
-    0x19,
-    0x36,
-    0xc2,
-    0x26,
-    0xd2,
-    0x6f,
-    0x26,
-    0x0c,
-    0x2a,
-    0x8b,
-    0xaa,
-    0x36,
-    0xc7,
-    0xa4,
-    0xd2,
-    0xa9,
-    0xeb,
-    0x06,
-    0x86,
-    0x40,
-    0x52,
-    0x88,
-    0x12,
-    0xa1,
-    0x5e,
-    0x1d,
-    0x71,
-    0x6f,
-    0x71,
-    0xa6,
-    0xcb,
-    0xc2,
-    0x9a,
-    0x0a,
-    0x3c,
-    0xd4,
-    0x75,
-    0x89,
-    0xd7,
-    0xfd,
-    0x4c,
-    0x4d,
-    0xeb,
-    0xe1,
-    0x82,
-    0x42,
-    0x84,
-    0xe8,
-    0x32,
-    0x28,
-    0x35,
-    0xee,
-    0x13,
-    0xe7,
-    0x15,
-    0x3c,
-    0x9f,
-    0x22,
-    0x08,
-    0xb7,
-    0x74,
-    0x0e,
-    0x40,
-    0x58,
-    0xfa,
-    0x85,
-    0x03,
-    0xdc,
-    0x46,
-    0x56,
-    0xae,
-    0xbd,
-    0x3e,
-    0xe0,
-    0xfa,
-    0x60,
-    0xfe,
-    0xdf,
-    0x7e,
-    0x90,
-    0x7b,
-    0x85,
-    0x75,
-    0x2b,
-    0x66,
-    0xcd,
-    0xc2,
-    0x1b,
-    0x54,
-    0x0c,
-    0x31,
-    0x88,
-    0x1b,
-    0xc8,
-    0x00,
-    0x4c,
-    0x7f,
-    0xce,
-    0x9e,
-    0xa8,
-    0x0e,
-    0x7f,
-    0xb2,
-    0x35,
-    0x48,
-    0x6b,
-    0x5f,
-    0x1d,
-    0x03,
-    0x21,
-    0xc6,
-    0x8a,
-    0x0e,
-    0x44,
-    0xcd,
-    0x5f,
-    0x15,
-    0xe2,
-    0x1f,
-    0x27,
-    0xc4,
-    0x02,
-    0x75,
-    0x4a,
-    0x2f,
-    0x7c,
-    0x13,
-    0x87,
-    0x72,
-    0x0e,
-    0x95,
-    0x9e,
-    0x94,
-    0xab,
-    0xeb,
-    0x4d,
-    0xb2,
-    0x16,
-    0xa3,
-    0x7e,
-    0x59,
-    0xb0,
-    0x66,
-    0xbf,
-    0x33,
-    0x8f,
-    0xc6,
-    0xf2,
-    0xe6,
-    0xcf,
-    0x37,
-    0x46,
-    0x39,
-    0x2d,
-    0x5a,
-    0x66,
-    0x79,
-    0xd1,
-    0x82,
-    0xf0,
-    0x1b,
-    0x6c,
-    0x71,
-    0x28,
-    0xa2,
-    0x83,
-    0x62,
-    0xee,
-    0xc3,
-    0x0b,
-    0x4d,
-    0xed,
-    0xc7,
-    0x35,
-    0x66,
-    0x16,
-    0x32,
-    0x8b,
-    0xe6,
-    0x4d,
-    0xa2,
-    0x3c,
-    0x0f,
-    0x61,
-    0xf9,
-    0xb4,
-    0x6a,
-    0x42,
-    0xbe,
-    0x70,
-    0x54,
-    0x6e,
-    0xc1,
-    0x11,
-    0xb8,
-    0xad,
-    0xfe,
-    0xaf,
-    0x1e,
-    0xfe,
-    0xc4,
-    0x6f,
-    0xe5,
-    0xd1,
-    0x17,
-    0x58,
-    0xcc,
-    0x76,
-    0x52,
-    0x62,
-    0xb8,
-    0xd6,
-    0x11,
-    0xd0,
-    0xb1,
-    0x61,
-    0x4d,
-    0xc0,
-    0x2d,
-    0x47,
-    0xc9,
-    0x01,
-    0x91,
-    0xeb,
-    0xad,
-    0x24,
-    0xf5,
-    0x95,
-    0x71,
-    0xd6,
-    0x27,
-    0x66,
-    0xfd,
-    0x6d,
-    0xf3,
-    0x92,
-    0x0f,
-    0xc0,
-    0xa2,
-    0xc9,
-    0xdc,
-    0x3c,
-    0xc1,
-    0xf6,
-    0xfa,
-    0x34,
-    0x24,
-    0x2c,
-    0x7d,
-    0x79,
-    0x2a,
-    0xdd,
-    0x61,
-    0x2b,
-    0x41,
-    0x4e,
-    0x28,
-    0xce,
-    0xad,
-    0x47,
-    0xc3,
-    0xa0,
-    0x86,
-    0x0f,
-    0xb6,
-    0x2a,
-    0x00,
-    0x98,
-    0x78,
-    0x16,
-    0xf0,
-    0xf6,
-    0x18,
-    0x40,
-    0x8b,
-    0x15,
-    0x26,
-    0x10,
-    0x70,
-    0xac,
-    0xd1,
-    0x06,
-    0xe9,
-    0x6d,
-    0x4d,
-    0x96,
-    0x6d,
-    0x7f,
-    0x78,
-    0x37,
-    0x6a,
-    0x2d,
-    0xbc,
-    0xb7,
-    0x42,
-    0xe0,
-    0x37,
-    0xd1,
-    0x93,
-    0x4a,
-    0x19,
-    0x01,
-    0xbc,
-    0xe5,
-    0x4e,
-    0x97,
-    0x9d,
-    0x9c,
-    0x5e,
-    0x0b,
-    0x9e,
-    0xc7,
-    0x91,
-    0x90,
-    0xf2,
-    0x5d,
-    0x56,
-    0xeb,
-    0x1d,
-    0x65,
-    0xe5,
-    0x86,
-    0xb3,
-    0xae,
-    0x24,
-    0xc0,
-    0x63,
-    0xc0,
-    0xc7,
-    0x88,
-    0x35,
-    0x12,
-    0xbc,
-    0x2a,
-    0x10,
-    0x7e,
-    0xc6,
-    0x68,
-    0x7f,
-    0xf1,
-    0x68,
-    0xcd,
-    0xb4,
-    0x67,
-    0x04,
-    0x3e,
-    0xce,
-    0x17,
-    0x44,
-    0xd2,
-    0x57,
-    0xea,
-    0xb9,
-    0xe4,
-    0x11,
-    0x32,
-    0xc2,
-    0x66,
-    0xf2,
-    0x99,
-    0xb0,
-    0x77,
-    0x6d,
-    0x57,
-    0x27,
-    0x38,
-    0xf3,
-    0xa9,
-    0xc7,
-    0xdc,
-    0xba,
-    0x7e,
-    0x0c,
-    0xff,
-    0xbd,
-    0x73,
-    0x73,
-    0x39,
-    0x04,
-    0x01,
-    0xdf,
-    0xf2,
-    0x25,
-    0xf5,
-    0x3a,
-    0x78,
-    0x0b,
-    0x21,
-    0x5f,
-    0x4e,
-    0xf6,
-    0x52,
-    0x38,
-    0xc8,
-    0xc3,
-    0x82,
-    0x23,
-    0xd4,
-    0x6e,
-    0x4e,
-    0x9b,
-    0x1b,
-    0xd5,
-    0xaa,
-    0x14,
-    0x49,
-    0xbe,
-    0xd3,
-    0x26,
-    0xa8,
-    0x1c,
-    0x85,
-    0xee,
-    0xf4,
-    0x8e,
-    0x6f,
-    0xb2,
-    0x6b,
-    0x29,
-    0xe4,
-    0xc3,
-    0x23,
-    0x77,
-    0xd3,
-    0xa8,
-    0xa0,
-    0xbf,
-    0xf9,
-    0x78,
-    0xa6,
-    0x87,
-    0x55,
-    0x88,
-    0x4c,
-    0x58,
-    0xdc,
-    0x46,
-    0x52,
-    0xc1,
-    0x6f,
-    0x65,
-    0xb4,
-    0x9e,
-    0x0a,
-    0x3b,
-    0x7f,
-    0x9b,
-    0x3e,
-    0x67,
-    0xe4,
-    0xf3,
-    0xe1,
-    0xb6,
-    0x8b,
-    0x7e,
-    0x04,
-    0x48,
-    0x2a,
-    0xea,
-    0x25,
-    0xee,
-    0x55,
-    0x48,
-    0xa6,
-    0xd7,
-    0x98,
-    0xcb,
-    0x7e,
-    0x6c,
-    0xc3,
-    0xcd,
-    0x2f,
-    0x78,
-    0x85,
-    0x13,
-    0xf8,
-    0x8c,
-    0x3c,
-    0x52,
-    0x4b,
-    0xa2,
-    0x0c,
-    0xf2,
-    0x81,
-    0x00,
-    0x2e,
-    0x11,
-    0xcd,
-    0x5f,
-    0x8b,
-    0xcb,
-    0x6e,
-    0x4d,
-    0x8a,
-    0xb9,
-    0x29,
-    0xd0,
-    0x26,
-    0xb7,
-    0xf7,
-    0x4c,
-    0x43,
-    0xeb,
-    0xfb,
-    0xa6,
-    0x42,
-    0x03,
-    0xb6,
-    0xaa,
-    0xd3,
-    0xbd,
-    0x7e,
-    0xaa,
-    0x0a,
-    0xad,
-    0x2c,
-    0x68,
-    0xb6,
-    0x3b,
-    0x16,
-    0x37,
-    0xee,
-    0xeb,
-    0x3d,
-    0x5c,
-    0xec,
-    0xe1,
-    0xc7,
-    0xba,
-    0x1f,
-    0xa4,
-    0xaf,
-    0xaf,
-    0x7b,
-    0x22,
-    0xbb,
-    0x39,
-    0x14,
-    0xf4,
-    0xae,
-    0x5d,
-    0xeb,
-    0xe4,
-    0xbf,
-    0xc9,
-    0x07,
-    0xac,
-    0x4b,
-    0xb8,
-    0xc8,
-    0x01,
-    0xc7,
-    0x16,
-    0x79,
-    0xd0,
-    0xf8,
-    0xe4,
-    0x24,
-    0xc8,
-    0x66,
-    0xdf,
-    0xaa,
-    0x18,
-    0x0e,
-    0x5c,
-    0x12,
-    0x7a,
-    0x57,
-    0x77,
-    0x22,
-    0x70,
-    0x47,
-    0x6c,
-    0x2c,
-    0xcd,
-    0xf7,
-    0x45,
-    0x2b,
-    0x78,
-    0x44,
-    0xb6,
-    0x0f,
-    0x6d,
-    0xc8,
-    0x45,
-    0x54,
-    0x04,
-    0x09,
-    0xad,
-    0xd9,
-    0x76,
-    0xef,
-    0x85,
-    0xf0,
-    0x9d,
-    0x7c,
-    0x1d,
-    0xb1,
-    0xfb,
-    0xb7,
-    0xa9,
-    0x95,
-    0xfe,
-    0xe9,
-    0xa1,
-    0x40,
-    0x82,
-    0x0c,
-    0x67,
-    0x9d,
-    0x98,
-    0x81,
-    0x2b,
-    0x30,
-    0x86,
-    0x01,
-    0x0c,
-    0xa8,
-    0x0f,
-    0xd6,
-    0x7f,
-    0xb4,
-    0xf4,
-    0x4b,
-    0xf5,
-    0x18,
-    0xba,
-    0x61,
-    0xb8,
-    0x00,
-    0xae,
-    0xc3,
-    0x16,
-    0x94,
-    0x27,
-    0xfc,
-    0xc2,
-    0xcc,
-    0x0b,
-    0xe8,
-    0x77,
-    0x86,
-    0x94,
-    0x68,
-    0xde,
-    0xd6,
-    0x54,
-    0x5a,
-    0xb2,
-    0x9d,
-    0x77,
-    0xc9,
-    0x22,
-    0x5d,
-    0x49,
-    0x60,
-    0x77,
-    0x4b,
-    0xf8,
-    0x25,
-    0xf6,
-    0xa6,
-    0x9a,
-    0x64,
-    0x08,
-    0x48,
-    0x71,
-    0xe8,
-    0x98,
-    0x7b,
-    0x6e,
-    0x71,
-    0xbd,
-    0x0d,
-    0xf5,
-    0x63,
-    0x99,
-    0xa7,
-    0xe0,
-    0xbc,
-    0x81,
-    0x5a,
-    0xc6,
-    0x48,
-    0x5d,
-    0x7b,
-    0x7d,
-    0x18,
-    0x52,
-    0xb1,
-    0xdd,
-    0x30,
-    0x9f,
-    0x4c,
-    0xc7,
-    0x80,
-    0xc5,
-    0xd8,
-    0x66,
-    0x16,
-    0xeb,
-    0xf2,
-    0xb5,
-    0x91,
-    0x80,
-    0x5b,
-    0x42,
-    0xd9,
-    0x22,
-    0x4b,
-    0x31,
-    0x0d,
-    0xbf,
-    0x08,
-    0x83,
-    0xbd,
-    0xfa,
-    0xb6,
-    0x99,
-    0x5a,
-    0xd0,
-    0x71,
-    0xf3,
-    0xea,
-    0x7b,
-    0x99,
-    0x3e,
-    0x00,
-    0x96,
-    0x6d,
-    0x8e,
-    0xec,
-    0x83,
-    0xdc,
-    0xe8,
-    0x2f,
-    0x0a,
-    0x97,
-    0x03,
-    0x32,
-    0x42,
-    0x6b,
-    0x4f,
-    0x37,
-    0xb5,
-    0xce,
-    0x37,
-    0x8f,
-    0xbf,
-    0xb8,
-    0xa3,
-    0x0d,
-    0x37,
-    0xb4,
-    0xc2,
-    0xbc,
-    0x51,
-    0x36,
-    0x06,
-    0xcd,
-    0xc3,
-    0x2f,
-    0x70,
-    0xd3,
-    0x27,
-    0xdf,
-    0x0d,
-    0x33,
-    0xa1,
-    0xea,
-    0xc1,
-    0xd5,
-    0xc1,
-    0xaf,
-    0x43,
-    0x20,
-    0xab,
-    0xd5,
-    0x69,
-    0x26,
-    0x75,
-    0x26,
-    0xa6,
-    0x1b,
-    0xd0,
-    0xa1,
-    0xd1,
-    0x0c,
-    0xeb,
-    0xca,
-    0x27,
-    0xcd,
-    0x94,
-    0x45,
-    0x94,
-    0x34,
-    0xa1,
-    0xa3,
-    0x2e,
-    0x84,
-    0x8e,
-    0x7c,
-    0x02,
-    0x2c,
-    0x67,
-    0xbe,
-    0x14,
-    0xb2,
-    0xe8,
-    0x44,
-    0xa1,
-    0xea,
-    0xe4,
-    0xab,
-    0xa7,
-    0x6b,
-    0xe3,
-    0x61,
-    0xa8,
-    0x43,
-    0x0f,
-    0xfe,
-    0xaa,
-    0xea,
-    0x51,
-    0xd8,
-    0x82,
-    0x75,
-    0xb7,
-    0xd1,
-    0x52,
-    0x0c,
-    0x19,
-    0x74,
-    0x51,
-    0x9e,
-    0xfc,
-    0x41,
-    0xca,
-    0xd3,
-    0xb6,
-    0x44,
-    0x68,
-    0x43,
-    0xd3,
-    0xed,
-    0xb0,
-    0xe5,
-    0xb8,
-    0x1b,
-    0xcf,
-    0xca,
-    0x86,
-    0x7a,
-    0x96,
-    0x0b,
-    0x41,
-    0x0f,
-    0xc3,
-    0x00,
-    0x32,
-    0x11,
-    0x82,
-    0xb2,
-    0x89,
-    0xfb,
-    0x33,
-    0x93,
-    0x47,
-    0xdf,
-    0x6e,
-    0x6d,
-    0x5b,
-    0xfd,
-    0x44,
-    0x99,
-    0x0b,
-    0x94,
-    0xc8,
-    0x71,
-    0x96,
-    0xf8,
-    0xcf,
-    0x07,
-    0x18,
-    0xe5,
-    0xf3,
-    0x18,
-    0xad,
-    0x13,
-    0xde,
-    0x3b,
-    0xd9,
-    0x0a,
-    0xc5,
-    0x5e,
-    0x28,
-    0x38,
-    0x32,
-    0x73,
-    0x11,
-    0x41,
-    0x07,
-    0x67,
-    0x20,
-    0x96,
-    0xc0,
-    0x54,
-    0x55,
-    0x49,
-    0xf8,
-    0xf7,
-    0xc7,
-    0x20,
-    0x2e,
-    0x64,
-    0x8c,
-    0xe8,
-    0xca,
-    0xf8,
-    0xdd,
-    0x0b,
-    0x5b,
-    0x90,
-    0x76,
-    0x65,
-    0x23,
-    0xf8,
-    0x3c,
-    0x54,
-    0xd5,
-    0xa7,
-    0x22,
-    0x0e,
-    0x9d,
-    0xa9,
-    0x4d,
-    0x38,
-    0x61,
-    0xdc,
-    0x77,
-    0xb4,
-    0x47,
-    0x5f,
-    0x91,
-    0xba,
-    0x77,
-    0x48,
-    0xac,
-    0x2a,
-    0x22,
-    0x95,
-    0x19,
-    0x20,
-    0xc3,
-    0x66,
-    0xcf,
-    0xc9,
-    0xa4,
-    0x69,
-    0x0e,
-    0x76,
-    0xa4,
-    0x95,
-    0x42,
-    0xef,
-    0x39,
-    0x1b,
-    0x2a,
-    0x0a,
-    0xb1,
-    0x99,
-    0x39,
-    0x7c,
-    0xbd,
-    0x91,
-    0x3d,
-    0xee,
-    0x2f,
-    0x1b,
-    0x3e,
-    0x54,
-    0x03,
-    0xd6,
-    0xa9,
-    0x7a,
-    0x9c,
-    0x24,
-    0xae,
-    0xdf,
-    0x51,
-    0x97,
-    0xe6,
-    0xc7,
-    0x28,
-    0xa6,
-    0x39,
-    0x8c,
-    0xe1,
-    0xa5,
-    0xff,
-    0x35,
-    0x37,
-    0xf4,
-    0x65,
-    0x49,
-    0x62,
-    0x76,
-    0x12,
-    0xe6,
-    0xe0,
-    0x44,
-    0x0b,
-    0x0d,
-    0x75,
-    0xa3,
-    0xd4,
-    0x40,
-    0x71,
-    0x34,
-    0xd9,
-    0x4f,
-    0x31,
-    0x6b,
-    0x0c,
-    0x6f,
-    0xe8,
-    0x42,
-    0xce,
-    0x8c,
-    0xa0,
-    0x2f,
-    0x13,
-    0xe0,
-    0x7b,
-    0x53,
-    0xc1,
-    0xc5,
-    0x3f,
-    0xf4,
-    0x5a,
-    0xc7,
-    0x11,
-    0x2d,
-    0xdb,
-    0xfe,
-    0x81,
-    0xe4,
-    0xe4,
-    0x9b,
-    0xc7,
-    0xfd,
-    0x18,
-    0xc0,
-    0x4c,
-    0xcd,
-    0xc7,
-    0x95,
-    0x6d,
-    0xd2,
-    0xcb,
-    0x98,
-    0x7b,
-    0xa1,
-    0xaf,
-    0x34,
-    0x06,
-    0x1f,
-    0x17,
-    0x96,
-    0x5b,
-    0xf4,
-    0x5b,
-    0xbc,
-    0x4b,
-    0x3d,
-    0x76,
-    0xce,
-    0x2e,
-    0x81,
-    0x1f,
-    0xb2,
-    0x28,
-    0xe7,
-    0x35,
-    0xdb,
-    0xab,
-    0xa6,
-    0x60,
-    0x61,
-    0x3d,
-    0xbc,
-    0xf6,
-    0x57,
-    0x7c,
-    0xe3,
-    0x1b,
-    0x59,
-    0x5f,
-    0xc1,
-    0x2d,
-    0x64,
-    0xbe,
-    0x5f,
-    0x5f,
-    0xea,
-    0x15,
-    0xdc,
-    0xa3,
-    0x26,
-    0x85,
-    0x63,
-    0xce,
-    0xae,
-    0x1b,
-    0x5a,
-    0xf6,
-    0x47,
-    0x55,
-    0xdc,
-    0x1f,
-    0xfc,
-    0xe2,
-    0x6a,
-    0x17,
-    0x72,
-    0xaa,
-    0xdd,
-    0x9f,
-    0x76,
-    0x0e,
-    0x9f,
-    0xcb,
-    0xd8,
-    0x71,
-    0x1b,
-    0xac,
-    0x7c,
-    0xf7,
-    0x72,
-    0x2c,
-    0xae,
-    0x8c,
-    0x70,
-    0x38,
-    0xb6,
-    0x29,
-    0xbe,
-    0x25,
-    0xac,
-    0x52,
-    0x59,
-    0x4c,
-    0x8e,
-    0xe4,
-    0x42,
-    0xf8,
-    0x90,
-    0x0d,
-    0x78,
-    0x83,
-    0xb3,
-    0x9c,
-    0x23,
-    0xbb,
-    0x99,
-    0x7b,
-    0x12,
-    0x8a,
-    0x98,
-    0x79,
-    0x67,
-    0xd7,
-    0x0d,
-    0x4d,
-    0x91,
-    0xa7,
-    0xf3,
-    0xd8,
-    0x7b,
-    0x88,
-    0xb4,
-    0xab,
-    0x03,
-    0x2f,
-    0x3e,
-    0xc9,
-    0xae,
-    0x60,
-    0x5a,
-    0xae,
-    0x9a,
-    0x0e,
-    0x39,
-    0x90,
-    0xb4,
-    0xc4,
-    0x50,
-    0xe4,
-    0x2a,
-    0x43,
-    0x67,
-    0x24,
-    0x24,
-    0x6d,
-    0xec,
-    0xd0,
-    0xaf,
-    0x61,
-    0x8c,
-    0xb3,
-    0xf9,
-    0xe8,
-    0x05,
-    0x67,
-    0xc4,
-    0x10,
-    0x35,
-    0x1b,
-    0x15,
-    0x16,
-    0x77,
-    0x94,
-    0x2c,
-    0x89,
-    0x30,
-    0x72,
-    0xb9,
-    0xad,
-    0xa5,
-    0xb5,
-    0x4d,
-    0x1e,
-    0x10,
-    0x7f,
-    0x0f,
-    0xb5,
-    0xf2,
-    0x1b,
-    0xb0,
-    0xaf,
-    0xaa,
-    0x3f,
-    0xa1,
-    0x0c,
-    0x47,
-    0x8e,
-    0x83,
-    0x36,
-    0x9b,
-    0x61,
-    0xdf,
-    0xe3,
-    0x90,
-    0xc7,
-    0x17,
-    0x3c,
-    0xc0,
-    0xcb,
-    0x9c,
-    0x3f,
-    0x3f,
-    0xf5,
-    0x62,
-    0x62,
-    0xbb,
-    0x13,
-    0x91,
-    0x79,
-    0xc8,
-    0x38,
-    0x7e,
-    0xd9,
-    0x75,
-    0x06,
-    0xd9,
-    0xbe,
-    0x23,
-    0x29,
-    0x28,
-    0xea,
-    0x97,
-    0x24,
-    0x73,
-    0x8f,
-    0x4d,
-    0x50,
-    0x41,
-    0x6f,
-    0x0f,
-    0x21,
-    0xc4,
-    0x42,
-    0xc7,
-    0xac,
-    0x51,
-    0x58,
-    0x92,
-    0x66,
-    0x13,
-    0x7f,
-    0x15,
-    0x2f,
-    0xff,
-    0x27,
-    0x14,
-    0x8f,
-    0x0a,
-    0xc4,
-    0x40,
-    0x3f,
-    0x9a,
-    0x74,
-    0x51,
-    0xeb,
-    0x3b,
-    0xe2,
-    0x55,
-    0x36,
-    0x94,
-    0x6a,
-    0x48,
-    0xff,
-    0x99,
-    0x7e,
-    0xe4,
-    0xe2,
-    0x02,
-    0x48,
-    0xba,
-    0x02,
-    0xfb,
-    0x90,
-    0x82,
-    0x06,
-    0x1d,
-    0xe1,
-    0xb0,
-    0x62,
-    0x9d,
-    0xe7,
-    0x48,
-    0xd8,
-    0xc3,
-    0x1c,
-    0xf2,
-    0x3e,
-    0x9e,
-    0xa4,
-    0x51,
-    0x81,
-    0xf7,
-    0x74,
-    0x91,
-    0xea,
-    0x83,
-    0xba,
-    0x3f,
-    0xa0,
-    0x5c,
-    0x79,
-    0x5e,
-    0x6f,
-    0xb2,
-    0x74,
-    0xb7,
-    0xc7,
-    0xbe,
-    0x4e,
-    0x70,
-    0x08,
-    0xf8,
-    0xef,
-    0xe0,
-    0xfc,
-    0x8a,
-    0x2a,
-    0xa2,
-    0xa5,
-    0x04,
-    0x9c,
-    0xe8,
-    0x3a,
-    0x51,
-    0xd7,
-    0x12,
-    0x6c,
-    0xea,
-    0xc0,
-    0x80,
-    0xed,
-    0x49,
-    0x35,
-    0xa4,
-    0x33,
-    0xa1,
-    0xf3,
-    0x5b,
-    0x7a,
-    0xcc,
-    0xb7,
-    0x7d,
-    0x08,
-    0x85,
-    0xa4,
-    0xb2,
-    0xb4,
-    0xd7,
-    0xe5,
-    0x88,
-    0xa9,
-    0xd5,
-    0x93,
-    0xc3,
-    0x68,
-    0x8c,
-    0xd9,
-    0xf5,
-    0x0c,
-    0x36,
-    0x56,
-    0x4e,
-    0xd2,
-    0xb1,
-    0xc2,
-    0xb4,
-    0xd8,
-    0x2f,
-    0xd5,
-    0x16,
-    0x25,
-    0x2e,
-    0x64,
-    0xfe,
-    0xea,
-    0xab,
-    0xce,
-    0x66,
-    0x07,
-    0x92,
-    0x96,
-    0xcd,
-    0xd1,
-    0x7a,
-    0x51,
-    0x8a,
-    0x13,
-    0x8f,
-    0xc3,
-    0x5f,
-    0x53,
-    0xcf,
-    0x45,
-    0x51,
-    0x56,
-    0x7a,
-    0x69,
-    0xb7,
-    0xe6,
-    0xc3,
-    0xe1,
-    0x92,
-    0xd2,
-    0xcc,
-    0x9d,
-    0x1c,
-    0x37,
-    0xd1,
-    0x34,
-    0xa4,
-    0xfe,
-    0xa4,
-    0x85,
-    0x98,
-    0xa6,
-    0x59,
-    0x9e,
-    0xe4,
-    0x43,
-    0x42,
-    0xdd,
-    0x7a,
-    0xc7,
-    0x1e,
-    0x54,
-    0x32,
-    0x81,
-    0x8d,
-    0x72,
-    0xd5,
-    0xe3,
-    0xc7,
-    0xe0,
-    0x74,
-    0x88,
-    0x8e,
-    0xaa,
-    0xff,
-    0x76,
-    0x61,
-    0x9f,
-    0x13,
-    0xa0,
-    0xf3,
-    0xfa,
-    0x12,
-    0xaf,
-    0xdb,
-    0x42,
-    0x79,
-    0x01,
-    0x8d,
-    0x6e,
-    0x6e,
-    0xf2,
-    0x89,
-    0x4d,
-    0x99,
-    0x5b,
-    0xd2,
-    0x25,
-    0x35,
-    0x59,
-    0xa2,
-    0x9b,
-    0x67,
-    0x50,
-    0x5c,
-    0xd2,
-    0xce,
-    0x2f,
-    0xc2,
-    0xd7,
-    0x5b,
-    0xf5,
-    0x68,
-    0x3d,
-    0x63,
-    0x74,
-    0x68,
-    0x04,
-    0xf2,
-    0x54,
-    0x58,
-    0xc0,
-    0x63,
-    0x5c,
-    0x79,
-    0xf6,
-    0x2d,
-    0xed,
-    0x31,
-    0xca,
-    0x00,
-    0xcf,
-    0xbc,
-    0xd7,
-    0x11,
-    0x31,
-    0x1e,
-    0x5f,
-    0xb2,
-    0xea,
-    0x5c,
-    0xa4,
-    0x25,
-    0x05,
-    0xeb,
-    0x95,
-    0xb2,
-    0x7d,
-    0x69,
-    0xad,
-    0xf7,
-    0x45,
-    0x8b,
-    0x19,
-    0x80,
-    0x8b,
-    0x57,
-    0x19,
-    0x97,
-    0x3e,
-    0x93,
-    0xa8,
-    0x5d,
-    0xce,
-    0x7d,
-    0x5f,
-    0x1a,
-    0x33,
-    0xbc,
-    0x97,
-    0xd2,
-    0x30,
-    0x97,
-    0xce,
-    0x19,
-    0xd9,
-    0x65,
-    0x4c,
-    0x27,
-    0x53,
-    0x44,
-    0x05,
-    0x2f,
-    0xdb,
-    0x0e,
-    0xc2,
-    0xed,
-    0x09,
-    0x89,
-    0x7c,
-    0x7f,
-    0x56,
-    0xde,
-    0x08,
-    0x75,
-    0xdd,
-    0x4d,
-    0xfa,
-    0x2b,
-    0x5e,
-    0x1e,
-    0xc3,
-    0x57,
-    0x88,
-    0xdb,
-    0x1c,
-    0xde,
-    0x78,
-    0xbc,
-    0xa8,
-    0xec,
-    0x7d,
-    0x63,
-    0xd4,
-    0x43,
-    0x1e,
-    0xc9,
-    0x03,
-    0xd3,
-    0x5e,
-    0x79,
-    0xe8,
-    0x8b,
-    0x3e,
-    0xfc,
-    0x32,
-    0x70,
-    0x84,
-    0x94,
-    0x6f,
-    0xec,
-    0xbb,
-    0x2d,
-    0x2a,
-    0x68,
-    0x7b,
-    0x90,
-    0x57,
-    0x1d,
-    0xea,
-    0xda,
-    0xf2,
-    0x26,
-    0x83,
-    0x2c,
-    0xe2,
-    0xda,
-    0x16,
-    0xa5,
-    0x23,
-    0x5a,
-    0x10,
-    0x8d,
-    0x24,
-    0x66,
-    0xfd,
-    0xd3,
-    0x6e,
-    0x75,
-    0x4b,
-    0xba,
-    0x87,
-    0x04,
-    0x51,
-    0xcf,
-    0x16,
-    0x2e,
-    0x90,
-    0x1e,
-    0x47,
-    0x7d,
-    0x38,
-    0xa5,
-    0x71,
-    0x00,
-    0xee,
-    0x09,
-    0xf7,
-    0x9d,
-    0xcc,
-    0x88,
-    0x6c,
-    0xa9,
-    0xa9,
-    0x2f,
-    0xfa,
-    0xb6,
-    0x9b,
-    0x4d,
-    0x04,
-    0xac,
-    0xbb,
-    0x27,
-    0x0a,
-    0x1c,
-    0x28,
-    0xed,
-    0xcd,
-    0xd0,
-    0x4f,
-    0xed,
-    0xb4,
-    0xa7,
-    0x69,
-    0x07,
-    0x6f,
-    0xa0,
-    0x44,
-    0x61,
-    0xda,
-    0x34,
-    0x47,
-    0x5c,
-    0x24,
-    0xe9,
-    0xb1,
-    0xc6,
-    0x30,
-    0x24,
-    0x21,
-    0x51,
-    0x3b,
-    0x3e,
-    0x5b,
-    0x43,
-    0xc0,
-    0xdb,
-    0x49,
-    0x70,
-    0x98,
-    0x77,
-    0x40,
-    0x65,
-    0x66,
-    0x42,
-    0x85,
-    0xe7,
-    0x32,
-    0x2e,
-    0x10,
-    0x9c,
-    0x54,
-    0x46,
-    0x8f,
-    0x07,
-    0x94,
-    0x41,
-    0xae,
-    0xba,
-    0x8f,
-    0x57,
-    0x96,
-    0xc6,
-    0x5d,
-    0x53,
-    0xb3,
-    0x77,
-    0x70,
-    0xea,
-    0xbb,
-    0x3e,
-    0xbf,
-    0x4b,
-    0xec,
-    0xef,
-    0x24,
-    0xf7,
-    0x95,
-    0x2c,
-    0x03,
-    0xd3,
-    0xd7,
-    0x21,
-    0x2d,
-    0x7b,
-    0xad,
-    0x73,
-    0x04,
-    0xda,
-    0x2a,
-    0x72,
-    0xdf,
-    0xf8,
-    0x02,
-    0x96,
-    0xb0,
-    0x12,
-    0x4c,
-    0x29,
-    0xe4,
-    0xf0,
-    0x86,
-    0x41,
-    0x8a,
-    0x73,
-    0xda,
-    0xf1,
-    0xb8,
-    0x6e,
-    0x9f,
-    0xc0,
-    0x2a,
-    0xb6,
-    0x23,
-    0x5a,
-    0x2d,
-    0x7d,
-    0xa8,
-    0x86,
-    0xbb,
-    0xdb,
-    0xac,
-    0x58,
-    0xe8,
-    0xae,
-    0x6e,
-    0xa8,
-    0x7d,
-    0xa4,
-    0xad,
-    0xc3,
-    0xe2,
-    0x96,
-    0xb3,
-    0x5f,
-    0x41,
-    0x18,
-    0x92,
-    0xd5,
-    0xe8,
-    0x4e,
-    0xae,
-    0x8a,
-    0xef,
-    0x01,
-    0x7b,
-    0xae,
-    0x1b,
-    0xf1,
-    0x88,
-    0x2a,
-    0x03,
-    0x6d,
-    0xbd,
-    0xd3,
-    0x71,
-    0x22,
-    0xe1,
-    0xe4,
-    0x0b,
-    0x31,
-    0x5e,
-    0xab,
-    0x33,
-    0x84,
-    0x49,
-    0x82,
-    0x2b,
-    0x61,
-    0x9d,
-    0x01,
-    0x7d,
-    0x3f,
-    0xc7,
-    0x72,
-    0x9a,
-    0xd9,
-    0x68,
-    0x85,
-    0xc1,
-    0x82,
-    0x56,
-    0x46,
-    0x22,
-    0xb8,
-    0xe4,
-    0x4b,
-    0x44,
-    0xfb,
-    0x63,
-    0x32,
-    0xa4,
-    0xe0,
-    0xe8,
-    0x4b,
-    0x9f,
-    0x61,
-    0x50,
-    0x91,
-    0x91,
-    0x77,
-    0x82,
-    0xdf,
-    0x3f,
-    0xeb,
-    0xf4,
-    0x60,
-    0x72,
-    0x68,
-    0x71,
-    0x48,
-    0xe5,
-    0xd6,
-    0x19,
-    0xc1,
-    0x61,
-    0xe3,
-    0xa9,
-    0x28,
-    0x27,
-    0xe2,
-    0xfc,
-    0x7a,
-    0x8e,
-    0xd9,
-    0xd2,
-    0x09,
-    0xed,
-    0xd5,
-    0xd1,
-    0x74,
-    0xbb,
-    0x81,
-    0xc9,
-    0xd5,
-    0xf5,
-    0xf7,
-    0x3c,
-    0x3c,
-    0xc0,
-    0xd6,
-    0x1e,
-    0x5d,
-    0x50,
-    0x95,
-    0xd9,
-    0x85,
-    0x08,
-    0x17,
-    0x94,
-    0xd3,
-    0xe3,
-    0x7f,
-    0xb5,
-    0xa4,
-    0x12,
-    0x45,
-    0xa4,
-    0x4f,
-    0xe7,
-    0x8a,
-    0xd2,
-    0x13,
-    0xf1,
-    0xa8,
-    0xfb,
-    0x4d,
-    0x69,
-    0x0e,
-    0xa8,
-    0xee,
-    0xcc,
-    0x4b,
-    0xf7,
-    0x2d,
-    0xca,
-    0x68,
-    0x9e,
-    0x79,
-    0x5f,
-    0x7b,
-    0x2e,
-    0xb2,
-    0x40,
-    0x79,
-    0x95,
-    0x98,
-    0x78,
-    0x4c,
-    0xe7,
-    0x84,
-    0x53,
-    0x25,
-    0x5e,
-    0x56,
-    0x7b,
-    0x14,
-    0x9f,
-    0xae,
-    0x61,
-    0xd6,
-    0x3e,
-    0x5f,
-    0xde,
-    0xee,
-    0x85,
-    0x20,
-    0x1b,
-    0xf7,
-    0x71,
-    0x85,
-    0xae,
-    0x38,
-    0xfe,
-    0x2e,
-    0x05,
-    0x79,
-    0xa4,
-    0x3f,
-    0x08,
-    0x15,
-    0x22,
-    0x0f,
-    0xfa,
-    0x51,
-    0x7a,
-    0x25,
-    0xa0,
-    0xec,
-    0x3d,
-    0x60,
-    0xa6,
-    0xf7,
-    0x08,
-    0x75,
-    0x3e,
-    0xe7,
-    0x4f,
-    0x9f,
-    0x0a,
-    0xe9,
-    0x59,
-    0x91,
-    0x3c,
-    0x75,
-    0x8c,
-    0xb0,
-    0xfc,
-    0x26,
-    0xeb,
-    0x7f,
-    0x0a,
-    0xc9,
-    0xdd,
-    0x5a,
-    0xa4,
-    0xb4,
-    0x30,
-    0x68,
-    0xaa,
-    0x59,
-    0x5d,
-    0xcb,
-    0x00,
-    0x1a,
-    0x0e,
-    0x19,
-    0x34,
-    0x5f,
-    0xdd,
-    0x10,
-    0x60,
-    0xe6,
-    0x5f,
-    0x85,
-    0x52,
-    0x5b,
-    0x61,
-    0x9e,
-    0xeb,
-    0x29,
-    0x71,
-    0x41,
-    0xc5,
-    0x8f,
-    0xa1,
-    0xcc,
-    0x18,
-    0xf6,
-    0x87,
-    0x07,
-    0xdf,
-    0x82,
-    0x88,
-    0x57,
-    0x36,
-    0xe7,
-    0x57,
-    0x34,
-    0x07,
-    0x7e,
-    0xb8,
-    0xdc,
-    0xe5,
-    0x98,
-    0x8a,
-    0x49,
-    0x38,
-    0x12,
-    0x04,
-    0x61,
-    0x9b,
-    0x29,
-    0x3f,
-    0x6e,
-    0x82,
-    0x90,
-    0xf4,
-    0xcd,
-    0x20,
-    0xc0,
-    0x88,
-    0xea,
-    0x88,
-    0x90,
-    0x45,
-    0x6c,
-    0x12,
-    0x05,
-    0xeb,
-    0xac,
-    0x00,
-    0x6b,
-    0x67,
-    0x6c,
-    0x61,
-    0xa4,
-    0xe2,
-    0xc6,
-    0x36,
-    0xc1,
-    0xfd,
-    0x62,
-    0xd4,
-    0xcf,
-    0x5b,
-    0xec,
-    0x89,
-    0xf3,
-    0x61,
-    0xc5,
-    0x82,
-    0xba,
-    0x39,
-    0xf9,
-    0xec,
-    0xaa,
-    0x1d,
-    0x72,
-    0x5a,
-    0x1d,
-    0xd2,
-    0x6b,
-    0x67,
-    0x4f,
-    0x72,
-    0x27,
-    0x9c,
-    0xb5,
-    0x6f,
-    0xe2,
-    0x94,
-    0x90,
-    0xd5,
-    0x08,
-    0x5d,
-    0xc3,
-    0xcf,
-    0xa5,
-    0x22,
-    0xe1,
-    0x6d,
-    0x1c,
-    0x07,
-    0x8b,
-    0xa4,
-    0x1d,
-    0x55,
-    0xf9,
-    0x97,
-    0xd1,
-    0xd7,
-    0xd6,
-    0x14,
-    0x57,
-    0x84,
-    0x51,
-    0x62,
-    0x74,
-    0x5d,
-    0x71,
-    0x3a,
-    0x86,
-    0x99,
-    0xa8,
-    0x13,
-    0xba,
-    0x00,
-    0xac,
-    0xa3,
-    0x7f,
-    0x95,
-    0x82,
-    0xa2,
-    0x3b,
-    0x77,
-    0xdb,
-    0xd1,
-    0x3c,
-    0x09,
-    0xa4,
-    0x3b,
-    0xf1,
-    0x51,
-    0xd9,
-    0xba,
-    0x5a,
-    0x9e,
-    0x9a,
-    0xbe,
-    0xbd,
-    0x6e,
-    0x80,
-    0x4a,
-    0x9b,
-    0x8e,
-    0x31,
-    0x3f,
-    0xe2,
-    0x83,
-    0x32,
-    0xdd,
-    0x64,
-    0x29,
-    0xfd,
-    0x87,
-    0x88,
-    0x9a,
-    0x54,
-    0xc6,
-    0x3f,
-    0x51,
-    0xd4,
-    0x91,
-    0x3a,
-    0x90,
-    0xcd,
-    0xcc,
-    0x5b,
-    0xfe,
-    0x51,
-    0x0e,
-    0x69,
-    0x95,
-    0x8b,
-    0xa7,
-    0x07,
-    0xbb,
-    0x52,
-    0xe2,
-    0xe7,
-    0xaf,
-    0xfe,
-    0x87,
-    0x3b,
-    0x27,
-    0x7b,
-    0xa4,
-    0x6c,
-    0x38,
-    0x9c,
-    0x8d,
-    0x0f,
-    0x75,
-    0xb1,
-    0x22,
-    0x15,
-    0x5b,
-    0x5b,
-    0x50,
-    0x41,
-    0xed,
-    0x9f,
-    0xdb,
-    0xe0,
-    0x9b,
-    0x3a,
-    0x5a,
-    0xb4,
-    0x68,
-    0x34,
-    0x83,
-    0x31,
-    0x4c,
-    0xb8,
-    0xa8,
-    0xec,
-    0xd7,
-    0x23,
-    0x82,
-    0x50,
-    0x18,
-    0x5b,
-    0x2e,
-    0x92,
-    0xbd,
-    0x62,
-    0x75,
-    0xe8,
-    0x7b,
-    0x2b,
-    0x50,
-    0xf6,
-    0xb1,
-    0xac,
-    0xab,
-    0x89,
-    0x48,
-    0x34,
-    0x6a,
-    0x88,
-    0xdd,
-    0xff,
-    0xaa,
-    0x28,
-    0x22,
-    0x08,
-    0x49,
-    0x5e,
-    0x81,
-    0x1e,
-    0xa8,
-    0x9a,
-    0x03,
-    0x3a,
-    0xaf,
-    0xb2,
-    0x71,
-    0x10,
-    0x12,
-    0x1c,
-    0xb9,
-    0xe4,
-    0xd3,
-    0x61,
-    0x92,
-    0x9f,
-    0x09,
-    0xce,
-    0x63,
-    0x22,
-    0xdf,
-    0x6d,
-    0x61,
-    0xda,
-    0xdf,
-    0x34,
-    0xf8,
-    0x94,
-    0x71,
-    0x7b,
-    0x6d,
-    0x93,
-    0x9e,
-    0xb4,
-    0xc1,
-    0xe0,
-    0x1a,
-    0x56,
-    0xd8,
-    0xe2,
-    0x82,
-    0x1a,
-    0xdb,
-    0x2e,
-    0xe2,
-    0x6a,
-    0xda,
-    0xa0,
-    0x7a,
-    0x16,
-    0xb6,
-    0xab,
-    0xc2,
-    0x4a,
-    0x3e,
-    0xed,
-    0xab,
-    0xbd,
-    0x98,
-    0x07,
-    0x28,
-    0x2a,
-    0xe3,
-    0xab,
-    0xed,
-    0x04,
-    0x1a,
-    0xf7,
-    0x76,
-    0x66,
-    0x3b,
-    0x01,
-    0x4c,
-    0x49,
-    0xa9,
-    0xb3,
-    0x84,
-    0xf9,
-    0xcf,
-    0xd9,
-    0x88,
-    0xca,
-    0x07,
-    0x78,
-    0x1a,
-    0x06,
-    0xba,
-    0x61,
-    0x95,
-    0x2b,
-    0xc8,
-    0x07,
-    0x76,
-    0x53,
-    0x2a,
-    0x8e,
-    0x1c,
-    0xf4,
-    0xd6,
-    0x24,
-    0xcc,
-    0xc9,
-    0xe2,
-    0x94,
-    0xf8,
-    0x10,
-    0xed,
-    0x18,
-    0xc1,
-    0xf6,
-    0xbb,
-    0x6f,
-    0xba,
-    0x50,
-    0x1f,
-    0x30,
-    0xef,
-    0x8b,
-    0x1e,
-    0x5e,
-    0x26,
-    0xe6,
-    0x51,
-    0x3c,
-    0x64,
-    0xde,
-    0x8b,
-    0x63,
-    0xb3,
-    0xea,
-    0xbc,
-    0x11,
-    0x23,
-    0x69,
-    0x15,
-    0xc4,
-    0x0f,
-    0xd9,
-    0x6d,
-    0x08,
-    0xa1,
-    0x49,
-    0xe4,
-    0x8d,
-    0x98,
-    0x11,
-    0xc6,
-    0x7c,
-    0x49,
-    0xc0,
-    0xb2,
-    0x0b,
-    0xe4,
-    0x56,
-    0xfb,
-    0x50,
-    0xf9,
-    0xb4,
-    0x4e,
-    0x52,
-    0x3b,
-    0x50,
-    0x95,
-    0x66,
-    0x83,
-    0x2d,
-    0x1c,
-    0xb9,
-    0x18,
-    0x0b,
-    0xf2,
-    0x29,
-    0x2d,
-    0xdb,
-    0x93,
-    0x59,
-    0xab,
-    0x75,
-    0xc3,
-    0x04,
-    0x31,
-    0x8d,
-    0xbd,
-    0x91,
-    0x59,
-    0xe3,
-    0x8d,
-    0xe8,
-    0x3e,
-    0xbb,
-    0xbb,
-    0x85,
-    0x3b,
-    0x8d,
-    0x29,
-    0xca,
-    0xf5,
-    0xfd,
-    0x3e,
-    0x9a,
-    0x9b,
-    0x0d,
-    0x44,
-    0x23,
-    0x6c,
-    0x92,
-    0x0f,
-    0xfb,
-    0x7a,
-    0xe5,
-    0xe0,
-    0x6f,
-    0xae,
-    0xda,
-    0x89,
-    0x18,
-    0x0d,
-    0xf6,
-    0xd1,
-    0xaf,
-    0x39,
-    0xdc,
-    0x19,
-    0x21,
-    0x3b,
-    0x09,
-    0x40,
-    0xe6,
-    0x7f,
-    0xc1,
-    0xc5,
-    0x8f,
-    0x20,
-    0x49,
-    0x2b,
-    0x9f,
-    0x67,
-    0x57,
-    0xa2,
-    0x9c,
-    0x8e,
-    0xc7,
-    0xe3,
-    0x66,
-    0xc9,
-    0x8f,
-    0x5c,
-    0xc7,
-    0x87,
-    0xf5,
-    0x8d,
-    0x4a,
-    0xf4,
-    0x00,
-    0xb2,
-    0x51,
-    0xc3,
-    0x2c,
-    0xa2,
-    0x62,
-    0x2c,
-    0x61,
-    0xf7,
-    0xc2,
-    0x30,
-    0x26,
-    0x6f,
-    0x45,
-    0x24,
-    0x13,
-    0x92,
-    0x64,
-    0x6d,
-    0x84,
-    0x95,
-    0x90,
-    0x89,
-    0x95,
-    0x7f,
-    0xc6,
-    0x4f,
-    0x4a,
-    0x8a,
-    0x64,
-    0x77,
-    0x0d,
-    0xcc,
-    0x3b,
-    0x5c,
-    0x5e,
-    0x16,
-    0xe5,
-    0x01,
-    0xc6,
-    0x1d,
-    0x58,
-    0x52,
-    0x0c,
-    0xd7,
-    0xbc,
-    0xad,
-    0xac,
-    0x28,
-    0x7a,
-    0xa1,
-    0x85,
-    0xbe,
-    0x96,
-    0xf6,
-    0xd2,
-    0x3a,
-    0x3e,
-    0xed,
-    0x5b,
-    0x90,
-    0xa3,
-    0xc8,
-    0xed,
-    0xb0,
-    0x07,
-    0x8d,
-    0x07,
-    0x66,
-    0x17,
-    0x08,
-    0xd6,
-    0x7e,
-    0x7c,
-    0x0f,
-    0x63,
-    0x2d,
-    0xad,
-    0x0a,
-    0x0c,
-    0xac,
-    0x07,
-    0xb2,
-    0x31,
-    0x26,
-    0x1f,
-    0x18,
-    0x2f,
-    0xd4,
-    0x57,
-    0xe9,
-    0x92,
-    0x67,
-    0xaf,
-    0xf1,
-    0x86,
-    0xa6,
-    0xde,
-    0xdf,
-    0x8f,
-    0x58,
-    0xa2,
-    0x48,
-    0x7a,
-    0x64,
-    0x54,
-    0xee,
-    0x94,
-    0x37,
-    0xbf,
-    0x41,
-    0x19,
-    0x66,
-    0x32,
-    0x26,
-    0xef,
-    0x94,
-    0xd4,
-    0xf8,
-    0x94,
-    0x97,
-    0x38,
-    0xcc,
-    0x56,
-    0xd6,
-    0x31,
-    0xfa,
-    0xc2,
-    0xf5,
-    0xe8,
-    0xd9,
-    0x5e,
-    0xb5,
-    0x2b,
-    0xc9,
-    0x9b,
-    0x15,
-    0x08,
-    0x77,
-    0x05,
-    0xbe,
-    0x9b,
-    0x5c,
-    0xbd,
-    0x9d,
-    0x24,
-    0x87,
-    0x29,
-    0xd2,
-    0x5c,
-    0x9d,
-    0xea,
-    0xc9,
-    0x0a,
-    0x1e,
-    0x0e,
-    0xa6,
-    0xd1,
-    0xe9,
-    0x87,
-    0xe7,
-    0x4c,
-    0x03,
-    0xdc,
-    0x44,
-    0x5d,
-    0x94,
-    0x1f,
-    0xda,
-    0xc1,
-    0x32,
-    0x1f,
-    0x89,
-    0xe8,
-    0x62,
-    0xde,
-    0x9b,
-    0x04,
-    0x5c,
-    0x46,
-    0xa6,
-    0x61,
-    0x0f,
-    0x17,
-    0xb3,
-    0xf4,
-    0x65,
-    0x24,
-    0x9f,
-    0x36,
-    0xc8,
-    0xbf,
-    0xc2,
-    0x33,
-    0xe5,
-    0x72,
-    0xcf,
-    0xdd,
-    0xb0,
-    0xf0,
-    0xfb,
-    0xa7,
-    0xa8,
-    0x4a,
-    0x62,
-    0x4f,
-    0x5c,
-    0x66,
-    0xa6,
-    0xfb,
-    0x2e,
-    0xae,
-    0xd9,
-    0x88,
-    0x57,
-    0x05,
-    0x9d,
-    0x1f,
-    0x2b,
-    0xff,
-    0x89,
-    0x09,
-    0x9e,
-    0x51,
-    0xcf,
-    0xc4,
-    0x08,
-    0x86,
-    0x1c,
-    0x56,
-    0x25,
-    0xf4,
-    0xc0,
-    0xe1,
-    0x60,
-    0xef,
-    0x0f,
-    0x78,
-    0x51,
-    0x3c,
-    0x07,
-    0x31,
-    0x84,
-    0xc8,
-    0x33,
-    0x7b,
-    0x7c,
-    0x9a,
-    0xce,
-    0xb2,
-    0xf7,
-    0x07,
-    0x2c,
-    0xf1,
-    0x74,
-    0x25,
-    0x56,
-    0x28,
-    0xf3,
-    0x82,
-    0xf5,
-    0x6e,
-    0xfc,
-    0x15,
-    0x71,
-    0x98,
-    0xe2,
-    0x74,
-    0x59,
-    0x0a,
-    0x49,
-    0x48,
-    0x06,
-    0xcd,
-    0xe6,
-    0xfe,
-    0x7b,
-    0xe2,
-    0x86,
-    0xc0,
-    0x90,
-    0xd6,
-    0x52,
-    0xa4,
-    0x50,
-    0x97,
-    0x51,
-    0x23,
-    0x9f,
-    0x86,
-    0x2e,
-    0xcc,
-    0x20,
-    0xcd,
-    0x3c,
-    0x39,
-    0x55,
-    0xf3,
-    0xb7,
-    0x43,
-    0x08,
-    0xae,
-    0x4d,
-    0x72,
-    0xea,
-    0xf8,
-    0xdc,
-    0xb7,
-    0x7b,
-    0x64,
-    0x7e,
-    0x5e,
-    0x29,
-    0xb3,
-    0xc3,
-    0x3e,
-    0xbc,
-    0xa2,
-    0x3d,
-    0x33,
-    0xf1
-  ],
-];
-
-const sha1_long_mds = const [
-  'd8fd6a91ef3b6ced05b98358a99107c1fac8c807',
-  '4a75a406f4de5f9e1132069d66717fc424376388',
-  'a135e32581bb06289b8c83f040e9421ec79bbe01',
-  'b22b87ea30f4050913f8f0241fc2ae2c319f52e7',
-  'd742931bc51d4d44ff938783be73dc7beccc980b',
-  '20a3a677c117c61ed3bb19e2ac77f69987896d0b',
-  'dd4374e29b17e2ec533813feddc5253765cd37ac',
-  'fdccb6e47645928fbbd51ccddc6cef48d6afc011',
-  'e50a54470f59fb9b654bffcb4c353e58b683ada5',
-  '9b3ed390fbb328a1641fca93691763000523569d',
-  '09bf403d8a9d2334f28fab704d9cab87da43731a',
-  '7f32d7486bde22ed00eeeaae073858144dc3ee37',
-  '37b7277fc606556160f9bc28b06fd55f4424d9cc',
-  'dbc7ace190c9dc985d2c3fbed5fe90328352b3b0',
-  '796135c20bfd2dfc7a1ff2087aba7f93b2814ef4',
-  'baa2e9bef9dd836d3d37013c296ec31919fe7840',
-  '3d40608ab9bce3f372bb29a62ff3fcc68e48385d',
-  '8bce8c69fd802389c805d2945c7499c9dd279ea2',
-  '064c6fccb707f0f3929084eeb0298e800d542370',
-  'bf2d47d4435ace28d3c336acdd6313aa8f9c41fd',
-  'efe28211673e7bb68657243df023d4b70c0e5325',
-  'afc01657b55fffd0c739cf017294a8379f60c2f9',
-  '8a148c03dfc846b484ec15809d9cbfaa4b74a060',
-  '8ff89c859a6ffa3d3874d3d1be4125f9de62c9bc',
-  'c0af54b14db7ef0c68b1300b7350fd2a82fe96e9',
-  '4c66ccc9d6a9f1d988bb7ae0fb41be3a1e1a648d',
-  '0f5176527280b8e3fa69a6c14ce1f759d6e9c67c',
-  'eef7dfc20c57895d31ad15aaab13cf710aa0d739',
-  '93239fa543e8bd68b59a4bd55a7be068f18c5ea1',
-  '2393e09e218261acb91ff9fb4783253e9b44b9f6',
-  '7d90c7a14fc71e228a4f4fd191d3b7ea98c6509e',
-  '07f84b3990bbeb9fc280681dc25d96bf8626992c',
-  'bfa71db73fb3d8103fd7f2965eb89f2394f0b751',
-  '92588ff54cd3903ceab98afd39f1854835f54492',
-  'd947e8fd7fb5d805d70c1a21bd6eb5368f312885',
-  '66ba577de1222642fd9e3b2a6e20741905356c2c',
-  'b1542439b3590f2e43fa30baaee0ed11a9c46bab',
-  '18de122bf588dc3d1eca78661673fa8d8acf254e',
-  'e4ae28261f24a10355fd1aa1c2554592a331ceda',
-  '290d124e77abc911e4be375232ff1798c4b48cb0',
-  'fc8456f92f8a8bb38a3248e988a3e12271061510',
-  '94a5d77bc308382a8aa317be7bad0a870f006c67',
-  '515d2a8972936e6b45b9b457d9eab8e2f62cbc3d',
-  '7fb74b4dde68f8c5e0d9b27878040123a9ed5fde',
-  '534702c37c6fa8e1bde879ce4d87aa10c4cc8c8a',
-  'cdd84a87e1457601d899b2abbe2e0974784491b7',
-  'b51232c68cd82ce9ffb4bc1fea0ea9f71354314e',
-  'adf2ebb0c337c89334fe8580b53dae70b25d00a7',
-  'e2eb69f7d6fab720a3f038ac773b3274b6d113e9',
-  '9c5bf7e24e8764745642e23e7cdc5fd44f91bbf9',
-  '7731a20dfb7725e61d7aacebb41afbb4a05ffbfb',
-  'fa47305e71a8e1e536486a806cbb839d813caf9f',
-  'a94d7bf363f32a5a5b6e9f71b2edaa3f2ae31a61',
-  'ed76c5bf4ada6a2092e6dbb40ff40909b8ec06cb',
-  '6a5fc2f4a741f17a2e62b198d65e4a5ff6a1e748',
-  '280ebf4f434e4134fce0d3f7581c2434bab1efbb',
-  'af75e59940783e84761dbe59727ed7908a8709b5',
-  '06f0df10ed7bc4b446f9271fdbe6ac81e36bc142',
-  'e900914d8a38d14b307d1eb8e569a509421d811f',
-  '581562f2a9f3097f760488cbe87f823d0fa7524c',
-  '844e1f50dd792b283902e66bc1086a273c05d511',
-  '61ca85608418090c78ebe8614bb2b80113fe130e',
-  'a1f35ddd6a6275fd21bb8c2ebf290a06a2563df7',
-  'b09d1a963ba9bf92907707b7d48b96e0d37dbd79',
-];
diff --git a/tests/compiler/dart2js/model/sha1_short_test_vectors.dart b/tests/compiler/dart2js/model/sha1_short_test_vectors.dart
deleted file mode 100644
index e41844a..0000000
--- a/tests/compiler/dart2js/model/sha1_short_test_vectors.dart
+++ /dev/null
@@ -1,2211 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of sha1_test;
-
-// Standard test vectors from:
-//   http://csrc.nist.gov/groups/STM/cavp/documents/shs/shabytetestvectors.zip
-
-const List<List<int>> sha1_short_inputs = const [
-  const [],
-  const [0x36],
-  const [0x19, 0x5a],
-  const [0xdf, 0x4b, 0xd2],
-  const [0x54, 0x9e, 0x95, 0x9e],
-  const [0xf7, 0xfb, 0x1b, 0xe2, 0x05],
-  const [0xc0, 0xe5, 0xab, 0xea, 0xea, 0x63],
-  const [0x63, 0xbf, 0xc1, 0xed, 0x7f, 0x78, 0xab],
-  const [0x7e, 0x3d, 0x7b, 0x3e, 0xad, 0xa9, 0x88, 0x66],
-  const [0x9e, 0x61, 0xe5, 0x5d, 0x9e, 0xd3, 0x7b, 0x1c, 0x20],
-  const [0x97, 0x77, 0xcf, 0x90, 0xdd, 0x7c, 0x7e, 0x86, 0x35, 0x06],
-  const [0x4e, 0xb0, 0x8c, 0x9e, 0x68, 0x3c, 0x94, 0xbe, 0xa0, 0x0d, 0xfa],
-  const [
-    0x09,
-    0x38,
-    0xf2,
-    0xe2,
-    0xeb,
-    0xb6,
-    0x4f,
-    0x8a,
-    0xf8,
-    0xbb,
-    0xfc,
-    0x91
-  ],
-  const [
-    0x74,
-    0xc9,
-    0x99,
-    0x6d,
-    0x14,
-    0xe8,
-    0x7d,
-    0x3e,
-    0x6c,
-    0xbe,
-    0xa7,
-    0x02,
-    0x9d
-  ],
-  const [
-    0x51,
-    0xdc,
-    0xa5,
-    0xc0,
-    0xf8,
-    0xe5,
-    0xd4,
-    0x95,
-    0x96,
-    0xf3,
-    0x2d,
-    0x3e,
-    0xb8,
-    0x74
-  ],
-  const [
-    0x3a,
-    0x36,
-    0xea,
-    0x49,
-    0x68,
-    0x48,
-    0x20,
-    0xa2,
-    0xad,
-    0xc7,
-    0xfc,
-    0x41,
-    0x75,
-    0xba,
-    0x78
-  ],
-  const [
-    0x35,
-    0x52,
-    0x69,
-    0x4c,
-    0xdf,
-    0x66,
-    0x3f,
-    0xd9,
-    0x4b,
-    0x22,
-    0x47,
-    0x47,
-    0xac,
-    0x40,
-    0x6a,
-    0xaf
-  ],
-  const [
-    0xf2,
-    0x16,
-    0xa1,
-    0xcb,
-    0xde,
-    0x24,
-    0x46,
-    0xb1,
-    0xed,
-    0xf4,
-    0x1e,
-    0x93,
-    0x48,
-    0x1d,
-    0x33,
-    0xe2,
-    0xed
-  ],
-  const [
-    0xa3,
-    0xcf,
-    0x71,
-    0x4b,
-    0xf1,
-    0x12,
-    0x64,
-    0x7e,
-    0x72,
-    0x7e,
-    0x8c,
-    0xfd,
-    0x46,
-    0x49,
-    0x9a,
-    0xcd,
-    0x35,
-    0xa6
-  ],
-  const [
-    0x14,
-    0x8d,
-    0xe6,
-    0x40,
-    0xf3,
-    0xc1,
-    0x15,
-    0x91,
-    0xa6,
-    0xf8,
-    0xc5,
-    0xc4,
-    0x86,
-    0x32,
-    0xc5,
-    0xfb,
-    0x79,
-    0xd3,
-    0xb7
-  ],
-  const [
-    0x63,
-    0xa3,
-    0xcc,
-    0x83,
-    0xfd,
-    0x1e,
-    0xc1,
-    0xb6,
-    0x68,
-    0x0e,
-    0x99,
-    0x74,
-    0xa0,
-    0x51,
-    0x4e,
-    0x1a,
-    0x9e,
-    0xce,
-    0xbb,
-    0x6a
-  ],
-  const [
-    0x87,
-    0x5a,
-    0x90,
-    0x90,
-    0x9a,
-    0x8a,
-    0xfc,
-    0x92,
-    0xfb,
-    0x70,
-    0x70,
-    0x04,
-    0x7e,
-    0x9d,
-    0x08,
-    0x1e,
-    0xc9,
-    0x2f,
-    0x3d,
-    0x08,
-    0xb8
-  ],
-  const [
-    0x44,
-    0x4b,
-    0x25,
-    0xf9,
-    0xc9,
-    0x25,
-    0x9d,
-    0xc2,
-    0x17,
-    0x77,
-    0x2c,
-    0xc4,
-    0x47,
-    0x8c,
-    0x44,
-    0xb6,
-    0xfe,
-    0xff,
-    0x62,
-    0x35,
-    0x36,
-    0x73
-  ],
-  const [
-    0x48,
-    0x73,
-    0x51,
-    0xc8,
-    0xa5,
-    0xf4,
-    0x40,
-    0xe4,
-    0xd0,
-    0x33,
-    0x86,
-    0x48,
-    0x3d,
-    0x5f,
-    0xe7,
-    0xbb,
-    0x66,
-    0x9d,
-    0x41,
-    0xad,
-    0xcb,
-    0xfd,
-    0xb7
-  ],
-  const [
-    0x46,
-    0xb0,
-    0x61,
-    0xef,
-    0x13,
-    0x2b,
-    0x87,
-    0xf6,
-    0xd3,
-    0xb0,
-    0xee,
-    0x24,
-    0x62,
-    0xf6,
-    0x7d,
-    0x91,
-    0x09,
-    0x77,
-    0xda,
-    0x20,
-    0xae,
-    0xd1,
-    0x37,
-    0x05
-  ],
-  const [
-    0x38,
-    0x42,
-    0xb6,
-    0x13,
-    0x7b,
-    0xb9,
-    0xd2,
-    0x7f,
-    0x3c,
-    0xa5,
-    0xba,
-    0xfe,
-    0x5b,
-    0xbb,
-    0x62,
-    0x85,
-    0x83,
-    0x44,
-    0xfe,
-    0x4b,
-    0xa5,
-    0xc4,
-    0x15,
-    0x89,
-    0xa5
-  ],
-  const [
-    0x44,
-    0xd9,
-    0x1d,
-    0x3d,
-    0x46,
-    0x5a,
-    0x41,
-    0x11,
-    0x46,
-    0x2b,
-    0xa0,
-    0xc7,
-    0xec,
-    0x22,
-    0x3d,
-    0xa6,
-    0x73,
-    0x5f,
-    0x4f,
-    0x52,
-    0x00,
-    0x45,
-    0x3c,
-    0xf1,
-    0x32,
-    0xc3
-  ],
-  const [
-    0xcc,
-    0xe7,
-    0x3f,
-    0x2e,
-    0xab,
-    0xcb,
-    0x52,
-    0xf7,
-    0x85,
-    0xd5,
-    0xa6,
-    0xdf,
-    0x63,
-    0xc0,
-    0xa1,
-    0x05,
-    0xf3,
-    0x4a,
-    0x91,
-    0xca,
-    0x23,
-    0x7f,
-    0xe5,
-    0x34,
-    0xee,
-    0x39,
-    0x9d
-  ],
-  const [
-    0x66,
-    0x4e,
-    0x6e,
-    0x79,
-    0x46,
-    0x83,
-    0x92,
-    0x03,
-    0x03,
-    0x7a,
-    0x65,
-    0xa1,
-    0x21,
-    0x74,
-    0xb2,
-    0x44,
-    0xde,
-    0x8c,
-    0xbc,
-    0x6e,
-    0xc3,
-    0xf5,
-    0x78,
-    0x96,
-    0x7a,
-    0x84,
-    0xf9,
-    0xce
-  ],
-  const [
-    0x95,
-    0x97,
-    0xf7,
-    0x14,
-    0xb2,
-    0xe4,
-    0x5e,
-    0x33,
-    0x99,
-    0xa7,
-    0xf0,
-    0x2a,
-    0xec,
-    0x44,
-    0x92,
-    0x1b,
-    0xd7,
-    0x8b,
-    0xe0,
-    0xfe,
-    0xfe,
-    0xe0,
-    0xc5,
-    0xe9,
-    0xb4,
-    0x99,
-    0x48,
-    0x8f,
-    0x6e
-  ],
-  const [
-    0x75,
-    0xc5,
-    0xad,
-    0x1f,
-    0x3c,
-    0xbd,
-    0x22,
-    0xe8,
-    0xa9,
-    0x5f,
-    0xc3,
-    0xb0,
-    0x89,
-    0x52,
-    0x67,
-    0x88,
-    0xfb,
-    0x4e,
-    0xbc,
-    0xee,
-    0xd3,
-    0xe7,
-    0xd4,
-    0x44,
-    0x3d,
-    0xa6,
-    0xe0,
-    0x81,
-    0xa3,
-    0x5e
-  ],
-  const [
-    0xdd,
-    0x24,
-    0x5b,
-    0xff,
-    0xe6,
-    0xa6,
-    0x38,
-    0x80,
-    0x66,
-    0x67,
-    0x76,
-    0x83,
-    0x60,
-    0xa9,
-    0x5d,
-    0x05,
-    0x74,
-    0xe1,
-    0xa0,
-    0xbd,
-    0x0d,
-    0x18,
-    0x32,
-    0x9f,
-    0xdb,
-    0x91,
-    0x5c,
-    0xa4,
-    0x84,
-    0xac,
-    0x0d
-  ],
-  const [
-    0x03,
-    0x21,
-    0x79,
-    0x4b,
-    0x73,
-    0x94,
-    0x18,
-    0xc2,
-    0x4e,
-    0x7c,
-    0x2e,
-    0x56,
-    0x52,
-    0x74,
-    0x79,
-    0x1c,
-    0x4b,
-    0xe7,
-    0x49,
-    0x75,
-    0x2a,
-    0xd2,
-    0x34,
-    0xed,
-    0x56,
-    0xcb,
-    0x0a,
-    0x63,
-    0x47,
-    0x43,
-    0x0c,
-    0x6b
-  ],
-  const [
-    0x4c,
-    0x3d,
-    0xcf,
-    0x95,
-    0xc2,
-    0xf0,
-    0xb5,
-    0x25,
-    0x8c,
-    0x65,
-    0x1f,
-    0xcd,
-    0x1d,
-    0x51,
-    0xbd,
-    0x10,
-    0x42,
-    0x5d,
-    0x62,
-    0x03,
-    0x06,
-    0x7d,
-    0x07,
-    0x48,
-    0xd3,
-    0x7d,
-    0x13,
-    0x40,
-    0xd9,
-    0xdd,
-    0xda,
-    0x7d,
-    0xb3
-  ],
-  const [
-    0xb8,
-    0xd1,
-    0x25,
-    0x82,
-    0xd2,
-    0x5b,
-    0x45,
-    0x29,
-    0x0a,
-    0x6e,
-    0x1b,
-    0xb9,
-    0x5d,
-    0xa4,
-    0x29,
-    0xbe,
-    0xfc,
-    0xfd,
-    0xbf,
-    0x5b,
-    0x4d,
-    0xd4,
-    0x1c,
-    0xdf,
-    0x33,
-    0x11,
-    0xd6,
-    0x98,
-    0x8f,
-    0xa1,
-    0x7c,
-    0xec,
-    0x07,
-    0x23
-  ],
-  const [
-    0x6f,
-    0xda,
-    0x97,
-    0x52,
-    0x7a,
-    0x66,
-    0x25,
-    0x52,
-    0xbe,
-    0x15,
-    0xef,
-    0xae,
-    0xba,
-    0x32,
-    0xa3,
-    0xae,
-    0xa4,
-    0xed,
-    0x44,
-    0x9a,
-    0xbb,
-    0x5c,
-    0x1e,
-    0xd8,
-    0xd9,
-    0xbf,
-    0xff,
-    0x54,
-    0x47,
-    0x08,
-    0xa4,
-    0x25,
-    0xd6,
-    0x9b,
-    0x72
-  ],
-  const [
-    0x09,
-    0xfa,
-    0x27,
-    0x92,
-    0xac,
-    0xbb,
-    0x24,
-    0x17,
-    0xe8,
-    0xed,
-    0x26,
-    0x90,
-    0x41,
-    0xcc,
-    0x03,
-    0xc7,
-    0x70,
-    0x06,
-    0x46,
-    0x6e,
-    0x6e,
-    0x7a,
-    0xe0,
-    0x02,
-    0xcf,
-    0x3f,
-    0x1a,
-    0xf5,
-    0x51,
-    0xe8,
-    0xce,
-    0x0b,
-    0xb5,
-    0x06,
-    0xd7,
-    0x05
-  ],
-  const [
-    0x5e,
-    0xfa,
-    0x29,
-    0x87,
-    0xda,
-    0x0b,
-    0xaf,
-    0x0a,
-    0x54,
-    0xd8,
-    0xd7,
-    0x28,
-    0x79,
-    0x2b,
-    0xcf,
-    0xa7,
-    0x07,
-    0xa1,
-    0x57,
-    0x98,
-    0xdc,
-    0x66,
-    0x74,
-    0x37,
-    0x54,
-    0x40,
-    0x69,
-    0x14,
-    0xd1,
-    0xcf,
-    0xe3,
-    0x70,
-    0x9b,
-    0x13,
-    0x74,
-    0xea,
-    0xeb
-  ],
-  const [
-    0x28,
-    0x36,
-    0xde,
-    0x99,
-    0xc0,
-    0xf6,
-    0x41,
-    0xcd,
-    0x55,
-    0xe8,
-    0x9f,
-    0x5a,
-    0xf7,
-    0x66,
-    0x38,
-    0x94,
-    0x7b,
-    0x82,
-    0x27,
-    0x37,
-    0x7e,
-    0xf8,
-    0x8b,
-    0xfb,
-    0xa6,
-    0x62,
-    0xe5,
-    0x68,
-    0x2b,
-    0xab,
-    0xc1,
-    0xec,
-    0x96,
-    0xc6,
-    0x99,
-    0x2b,
-    0xc9,
-    0xa0
-  ],
-  const [
-    0x42,
-    0x14,
-    0x3a,
-    0x2b,
-    0x9e,
-    0x1d,
-    0x0b,
-    0x35,
-    0x4d,
-    0xf3,
-    0x26,
-    0x4d,
-    0x08,
-    0xf7,
-    0xb6,
-    0x02,
-    0xf5,
-    0x4a,
-    0xad,
-    0x92,
-    0x2a,
-    0x3d,
-    0x63,
-    0x00,
-    0x6d,
-    0x09,
-    0x7f,
-    0x68,
-    0x3d,
-    0xc1,
-    0x1b,
-    0x90,
-    0x17,
-    0x84,
-    0x23,
-    0xbf,
-    0xf2,
-    0xf7,
-    0xfe
-  ],
-  const [
-    0xeb,
-    0x60,
-    0xc2,
-    0x8a,
-    0xd8,
-    0xae,
-    0xda,
-    0x80,
-    0x7d,
-    0x69,
-    0xeb,
-    0xc8,
-    0x75,
-    0x52,
-    0x02,
-    0x4a,
-    0xd8,
-    0xac,
-    0xa6,
-    0x82,
-    0x04,
-    0xf1,
-    0xbc,
-    0xd2,
-    0x9d,
-    0xc5,
-    0xa8,
-    0x1d,
-    0xd2,
-    0x28,
-    0xb5,
-    0x91,
-    0xe2,
-    0xef,
-    0xb7,
-    0xc4,
-    0xdf,
-    0x75,
-    0xef,
-    0x03
-  ],
-  const [
-    0x7d,
-    0xe4,
-    0xba,
-    0x85,
-    0xec,
-    0x54,
-    0x74,
-    0x7c,
-    0xdc,
-    0x42,
-    0xb1,
-    0xf2,
-    0x35,
-    0x46,
-    0xb7,
-    0xe4,
-    0x90,
-    0xe3,
-    0x12,
-    0x80,
-    0xf0,
-    0x66,
-    0xe5,
-    0x2f,
-    0xac,
-    0x11,
-    0x7f,
-    0xd3,
-    0xb0,
-    0x79,
-    0x2e,
-    0x4d,
-    0xe6,
-    0x2d,
-    0x58,
-    0x43,
-    0xee,
-    0x98,
-    0xc7,
-    0x20,
-    0x15
-  ],
-  const [
-    0xe7,
-    0x06,
-    0x53,
-    0x63,
-    0x7b,
-    0xc5,
-    0xe3,
-    0x88,
-    0xcc,
-    0xd8,
-    0xdc,
-    0x44,
-    0xe5,
-    0xea,
-    0xce,
-    0x36,
-    0xf7,
-    0x39,
-    0x8f,
-    0x2b,
-    0xac,
-    0x99,
-    0x30,
-    0x42,
-    0xb9,
-    0xbc,
-    0x2f,
-    0x4f,
-    0xb3,
-    0xb0,
-    0xee,
-    0x7e,
-    0x23,
-    0xa9,
-    0x64,
-    0x39,
-    0xdc,
-    0x01,
-    0x13,
-    0x4b,
-    0x8c,
-    0x7d
-  ],
-  const [
-    0xdd,
-    0x37,
-    0xbc,
-    0x9f,
-    0x0b,
-    0x3a,
-    0x47,
-    0x88,
-    0xf9,
-    0xb5,
-    0x49,
-    0x66,
-    0xf2,
-    0x52,
-    0x17,
-    0x4c,
-    0x8c,
-    0xe4,
-    0x87,
-    0xcb,
-    0xe5,
-    0x9c,
-    0x53,
-    0xc2,
-    0x2b,
-    0x81,
-    0xbf,
-    0x77,
-    0x62,
-    0x1a,
-    0x7c,
-    0xe7,
-    0x61,
-    0x6d,
-    0xcb,
-    0x5b,
-    0x1e,
-    0x2e,
-    0xe6,
-    0x3c,
-    0x2c,
-    0x30,
-    0x9b
-  ],
-  const [
-    0x5f,
-    0x48,
-    0x5c,
-    0x63,
-    0x7a,
-    0xe3,
-    0x0b,
-    0x1e,
-    0x30,
-    0x49,
-    0x7f,
-    0x0f,
-    0xb7,
-    0xec,
-    0x36,
-    0x4e,
-    0x13,
-    0xc9,
-    0x06,
-    0xe2,
-    0x81,
-    0x3d,
-    0xaa,
-    0x34,
-    0x16,
-    0x1b,
-    0x7a,
-    0xc4,
-    0xa4,
-    0xfd,
-    0x7a,
-    0x1b,
-    0xdd,
-    0xd7,
-    0x96,
-    0x01,
-    0xbb,
-    0xd2,
-    0x2c,
-    0xef,
-    0x1f,
-    0x57,
-    0xcb,
-    0xc7
-  ],
-  const [
-    0xf6,
-    0xc2,
-    0x37,
-    0xfb,
-    0x3c,
-    0xfe,
-    0x95,
-    0xec,
-    0x84,
-    0x14,
-    0xcc,
-    0x16,
-    0xd2,
-    0x03,
-    0xb4,
-    0x87,
-    0x4e,
-    0x64,
-    0x4c,
-    0xc9,
-    0xa5,
-    0x43,
-    0x46,
-    0x5c,
-    0xad,
-    0x2d,
-    0xc5,
-    0x63,
-    0x48,
-    0x8a,
-    0x65,
-    0x9e,
-    0x8a,
-    0x2e,
-    0x7c,
-    0x98,
-    0x1e,
-    0x2a,
-    0x9f,
-    0x22,
-    0xe5,
-    0xe8,
-    0x68,
-    0xff,
-    0xe1
-  ],
-  const [
-    0xda,
-    0x7a,
-    0xb3,
-    0x29,
-    0x15,
-    0x53,
-    0xc6,
-    0x59,
-    0x87,
-    0x3c,
-    0x95,
-    0x91,
-    0x37,
-    0x68,
-    0x95,
-    0x3c,
-    0x6e,
-    0x52,
-    0x6d,
-    0x3a,
-    0x26,
-    0x59,
-    0x08,
-    0x98,
-    0xc0,
-    0xad,
-    0xe8,
-    0x9f,
-    0xf5,
-    0x6f,
-    0xbd,
-    0x11,
-    0x0f,
-    0x14,
-    0x36,
-    0xaf,
-    0x59,
-    0x0b,
-    0x17,
-    0xfe,
-    0xd4,
-    0x9f,
-    0x8c,
-    0x4b,
-    0x2b,
-    0x1e
-  ],
-  const [
-    0x8c,
-    0xfa,
-    0x5f,
-    0xd5,
-    0x6e,
-    0xe2,
-    0x39,
-    0xca,
-    0x47,
-    0x73,
-    0x75,
-    0x91,
-    0xcb,
-    0xa1,
-    0x03,
-    0xe4,
-    0x1a,
-    0x18,
-    0xac,
-    0xf8,
-    0xe8,
-    0xd2,
-    0x57,
-    0xb0,
-    0xdb,
-    0xe8,
-    0x85,
-    0x11,
-    0x34,
-    0xa8,
-    0x1f,
-    0xf6,
-    0xb2,
-    0xe9,
-    0x71,
-    0x04,
-    0xb3,
-    0x9b,
-    0x76,
-    0xe1,
-    0x9d,
-    0xa2,
-    0x56,
-    0xa1,
-    0x7c,
-    0xe5,
-    0x2d
-  ],
-  const [
-    0x57,
-    0xe8,
-    0x96,
-    0x59,
-    0xd8,
-    0x78,
-    0xf3,
-    0x60,
-    0xaf,
-    0x6d,
-    0xe4,
-    0x5a,
-    0x9a,
-    0x5e,
-    0x37,
-    0x2e,
-    0xf4,
-    0x0c,
-    0x38,
-    0x49,
-    0x88,
-    0xe8,
-    0x26,
-    0x40,
-    0xa3,
-    0xd5,
-    0xe4,
-    0xb7,
-    0x6d,
-    0x2e,
-    0xf1,
-    0x81,
-    0x78,
-    0x0b,
-    0x9a,
-    0x09,
-    0x9a,
-    0xc0,
-    0x6e,
-    0xf0,
-    0xf8,
-    0xa7,
-    0xf3,
-    0xf7,
-    0x64,
-    0x20,
-    0x97,
-    0x20
-  ],
-  const [
-    0xb9,
-    0x1e,
-    0x64,
-    0x23,
-    0x5d,
-    0xbd,
-    0x23,
-    0x4e,
-    0xea,
-    0x2a,
-    0xe1,
-    0x4a,
-    0x92,
-    0xa1,
-    0x73,
-    0xeb,
-    0xe8,
-    0x35,
-    0x34,
-    0x72,
-    0x39,
-    0xcf,
-    0xf8,
-    0xb0,
-    0x20,
-    0x74,
-    0x41,
-    0x6f,
-    0x55,
-    0xc6,
-    0xb6,
-    0x0d,
-    0xc6,
-    0xce,
-    0xd0,
-    0x6a,
-    0xe9,
-    0xf8,
-    0xd7,
-    0x05,
-    0x50,
-    0x5f,
-    0x0d,
-    0x61,
-    0x7e,
-    0x4b,
-    0x29,
-    0xae,
-    0xf9
-  ],
-  const [
-    0xe4,
-    0x2a,
-    0x67,
-    0x36,
-    0x2a,
-    0x58,
-    0x1e,
-    0x8c,
-    0xf3,
-    0xd8,
-    0x47,
-    0x50,
-    0x22,
-    0x15,
-    0x75,
-    0x5d,
-    0x7a,
-    0xd4,
-    0x25,
-    0xca,
-    0x03,
-    0x0c,
-    0x43,
-    0x60,
-    0xb0,
-    0xf7,
-    0xef,
-    0x51,
-    0x3e,
-    0x69,
-    0x80,
-    0x26,
-    0x5f,
-    0x61,
-    0xc9,
-    0xfa,
-    0x18,
-    0xdd,
-    0x9c,
-    0xe6,
-    0x68,
-    0xf3,
-    0x8d,
-    0xbc,
-    0x2a,
-    0x1e,
-    0xf8,
-    0xf8,
-    0x3c,
-    0xd6
-  ],
-  const [
-    0x63,
-    0x4d,
-    0xb9,
-    0x2c,
-    0x22,
-    0x01,
-    0x0e,
-    0x1c,
-    0xbf,
-    0x1e,
-    0x16,
-    0x23,
-    0x92,
-    0x31,
-    0x80,
-    0x40,
-    0x6c,
-    0x51,
-    0x52,
-    0x72,
-    0x20,
-    0x9a,
-    0x8a,
-    0xcc,
-    0x42,
-    0xde,
-    0x05,
-    0xcc,
-    0x2e,
-    0x96,
-    0xa1,
-    0xe9,
-    0x4c,
-    0x1f,
-    0x9f,
-    0x6b,
-    0x93,
-    0x23,
-    0x4b,
-    0x7f,
-    0x4c,
-    0x55,
-    0xde,
-    0x8b,
-    0x19,
-    0x61,
-    0xa3,
-    0xbf,
-    0x35,
-    0x22,
-    0x59
-  ],
-  const [
-    0xcc,
-    0x6c,
-    0xa3,
-    0xa8,
-    0xcb,
-    0x39,
-    0x1c,
-    0xd8,
-    0xa5,
-    0xaf,
-    0xf1,
-    0xfa,
-    0xa7,
-    0xb3,
-    0xff,
-    0xbd,
-    0xd2,
-    0x1a,
-    0x5a,
-    0x3c,
-    0xe6,
-    0x6c,
-    0xfa,
-    0xdd,
-    0xbf,
-    0xe8,
-    0xb1,
-    0x79,
-    0xe4,
-    0xc8,
-    0x60,
-    0xbe,
-    0x5e,
-    0xc6,
-    0x6b,
-    0xd2,
-    0xc6,
-    0xde,
-    0x6a,
-    0x39,
-    0xa2,
-    0x56,
-    0x22,
-    0xf9,
-    0xf2,
-    0xfc,
-    0xb3,
-    0xfc,
-    0x05,
-    0xaf,
-    0x12,
-    0xb5
-  ],
-  const [
-    0x7c,
-    0x0e,
-    0x6a,
-    0x0d,
-    0x35,
-    0xf8,
-    0xac,
-    0x85,
-    0x4c,
-    0x72,
-    0x45,
-    0xeb,
-    0xc7,
-    0x36,
-    0x93,
-    0x73,
-    0x1b,
-    0xbb,
-    0xc3,
-    0xe6,
-    0xfa,
-    0xb6,
-    0x44,
-    0x46,
-    0x6d,
-    0xe2,
-    0x7b,
-    0xb5,
-    0x22,
-    0xfc,
-    0xb9,
-    0x93,
-    0x07,
-    0x12,
-    0x6a,
-    0xe7,
-    0x18,
-    0xfe,
-    0x8f,
-    0x00,
-    0x74,
-    0x2e,
-    0x6e,
-    0x5c,
-    0xb7,
-    0xa6,
-    0x87,
-    0xc8,
-    0x84,
-    0x47,
-    0xcb,
-    0xc9,
-    0x61
-  ],
-  const [
-    0xc5,
-    0x58,
-    0x1d,
-    0x40,
-    0xb3,
-    0x31,
-    0xe2,
-    0x40,
-    0x03,
-    0x90,
-    0x1b,
-    0xd6,
-    0xbf,
-    0x24,
-    0x4a,
-    0xca,
-    0x9e,
-    0x96,
-    0x01,
-    0xb9,
-    0xd8,
-    0x12,
-    0x52,
-    0xbb,
-    0x38,
-    0x04,
-    0x86,
-    0x42,
-    0x73,
-    0x1f,
-    0x11,
-    0x46,
-    0xb8,
-    0xa4,
-    0xc6,
-    0x9f,
-    0x88,
-    0xe1,
-    0x48,
-    0xb2,
-    0xc8,
-    0xf8,
-    0xc1,
-    0x4f,
-    0x15,
-    0xe1,
-    0xd6,
-    0xda,
-    0x57,
-    0xb2,
-    0xda,
-    0xa9,
-    0x99,
-    0x1e
-  ],
-  const [
-    0xec,
-    0x6b,
-    0x4a,
-    0x88,
-    0x71,
-    0x3d,
-    0xf2,
-    0x7c,
-    0x0f,
-    0x2d,
-    0x02,
-    0xe7,
-    0x38,
-    0xb6,
-    0x9d,
-    0xb4,
-    0x3a,
-    0xbd,
-    0xa3,
-    0x92,
-    0x13,
-    0x17,
-    0x25,
-    0x9c,
-    0x86,
-    0x4c,
-    0x1c,
-    0x38,
-    0x6e,
-    0x9a,
-    0x5a,
-    0x3f,
-    0x53,
-    0x3d,
-    0xc0,
-    0x5f,
-    0x3b,
-    0xee,
-    0xb2,
-    0xbe,
-    0xc2,
-    0xaa,
-    0xc8,
-    0xe0,
-    0x6d,
-    0xb4,
-    0xc6,
-    0xcb,
-    0x3c,
-    0xdd,
-    0xcf,
-    0x69,
-    0x7e,
-    0x03,
-    0xd5
-  ],
-  const [
-    0x03,
-    0x21,
-    0x73,
-    0x6b,
-    0xeb,
-    0xa5,
-    0x78,
-    0xe9,
-    0x0a,
-    0xbc,
-    0x1a,
-    0x90,
-    0xaa,
-    0x56,
-    0x15,
-    0x7d,
-    0x87,
-    0x16,
-    0x18,
-    0xf6,
-    0xde,
-    0x0d,
-    0x76,
-    0x4c,
-    0xc8,
-    0xc9,
-    0x1e,
-    0x06,
-    0xc6,
-    0x8e,
-    0xcd,
-    0x3b,
-    0x9d,
-    0xe3,
-    0x82,
-    0x40,
-    0x64,
-    0x50,
-    0x33,
-    0x84,
-    0xdb,
-    0x67,
-    0xbe,
-    0xb7,
-    0xfe,
-    0x01,
-    0x22,
-    0x32,
-    0xda,
-    0xca,
-    0xef,
-    0x93,
-    0xa0,
-    0x00,
-    0xfb,
-    0xa7
-  ],
-  const [
-    0xd0,
-    0xa2,
-    0x49,
-    0xa9,
-    0x7b,
-    0x5f,
-    0x14,
-    0x86,
-    0x72,
-    0x1a,
-    0x50,
-    0xd4,
-    0xc4,
-    0xab,
-    0x3f,
-    0x5d,
-    0x67,
-    0x4a,
-    0x0e,
-    0x29,
-    0x92,
-    0x5d,
-    0x5b,
-    0xf2,
-    0x67,
-    0x8e,
-    0xf6,
-    0xd8,
-    0xd5,
-    0x21,
-    0xe4,
-    0x56,
-    0xbd,
-    0x84,
-    0xaa,
-    0x75,
-    0x53,
-    0x28,
-    0xc8,
-    0x3f,
-    0xc8,
-    0x90,
-    0x83,
-    0x77,
-    0x26,
-    0xa8,
-    0xe7,
-    0x87,
-    0x7b,
-    0x57,
-    0x0d,
-    0xba,
-    0x39,
-    0x57,
-    0x9a,
-    0xab,
-    0xdd
-  ],
-  const [
-    0xc3,
-    0x21,
-    0x38,
-    0x53,
-    0x11,
-    0x18,
-    0xf0,
-    0x8c,
-    0x7d,
-    0xcc,
-    0x29,
-    0x24,
-    0x28,
-    0xad,
-    0x20,
-    0xb4,
-    0x5a,
-    0xb2,
-    0x7d,
-    0x95,
-    0x17,
-    0xa1,
-    0x84,
-    0x45,
-    0xf3,
-    0x8b,
-    0x8f,
-    0x0c,
-    0x27,
-    0x95,
-    0xbc,
-    0xdf,
-    0xe3,
-    0xff,
-    0xe3,
-    0x84,
-    0xe6,
-    0x5e,
-    0xcb,
-    0xf7,
-    0x4d,
-    0x2c,
-    0x9d,
-    0x0d,
-    0xa8,
-    0x83,
-    0x98,
-    0x57,
-    0x53,
-    0x26,
-    0x07,
-    0x49,
-    0x04,
-    0xc1,
-    0x70,
-    0x9b,
-    0xa0,
-    0x72
-  ],
-  const [
-    0xb0,
-    0xf4,
-    0xcf,
-    0xb9,
-    0x39,
-    0xea,
-    0x78,
-    0x5e,
-    0xab,
-    0xb7,
-    0xe7,
-    0xca,
-    0x7c,
-    0x47,
-    0x6c,
-    0xdd,
-    0x9b,
-    0x22,
-    0x7f,
-    0x01,
-    0x5d,
-    0x90,
-    0x53,
-    0x68,
-    0xba,
-    0x00,
-    0xae,
-    0x96,
-    0xb9,
-    0xaa,
-    0xf7,
-    0x20,
-    0x29,
-    0x74,
-    0x91,
-    0xb3,
-    0x92,
-    0x12,
-    0x67,
-    0x57,
-    0x6b,
-    0x72,
-    0xc8,
-    0xf5,
-    0x8d,
-    0x57,
-    0x76,
-    0x17,
-    0xe8,
-    0x44,
-    0xf9,
-    0xf0,
-    0x75,
-    0x9b,
-    0x39,
-    0x9c,
-    0x6b,
-    0x06,
-    0x4c
-  ],
-  const [
-    0xbd,
-    0x02,
-    0xe5,
-    0x1b,
-    0x0c,
-    0xf2,
-    0xc2,
-    0xb8,
-    0xd2,
-    0x04,
-    0xa0,
-    0x26,
-    0xb4,
-    0x1a,
-    0x66,
-    0xfb,
-    0xfc,
-    0x2a,
-    0xc3,
-    0x7e,
-    0xe9,
-    0x41,
-    0x1f,
-    0xc4,
-    0x49,
-    0xc8,
-    0xd1,
-    0x19,
-    0x4a,
-    0x07,
-    0x92,
-    0xa2,
-    0x8e,
-    0xe7,
-    0x31,
-    0x40,
-    0x7d,
-    0xfc,
-    0x89,
-    0xb6,
-    0xdf,
-    0xc2,
-    0xb1,
-    0x0f,
-    0xaa,
-    0x27,
-    0x72,
-    0x3a,
-    0x18,
-    0x4a,
-    0xfe,
-    0xf8,
-    0xfd,
-    0x83,
-    0xde,
-    0xf8,
-    0x58,
-    0xa3,
-    0x2d,
-    0x3f
-  ],
-  const [
-    0xe3,
-    0x31,
-    0x46,
-    0xb8,
-    0x3e,
-    0x4b,
-    0xb6,
-    0x71,
-    0x39,
-    0x22,
-    0x18,
-    0xda,
-    0x9a,
-    0x77,
-    0xf8,
-    0xd9,
-    0xf5,
-    0x97,
-    0x41,
-    0x47,
-    0x18,
-    0x2f,
-    0xb9,
-    0x5b,
-    0xa6,
-    0x62,
-    0xcb,
-    0x66,
-    0x01,
-    0x19,
-    0x89,
-    0xc1,
-    0x6d,
-    0x9a,
-    0xf1,
-    0x04,
-    0x73,
-    0x5d,
-    0x6f,
-    0x79,
-    0x84,
-    0x1a,
-    0xa4,
-    0xd1,
-    0xdf,
-    0x27,
-    0x66,
-    0x15,
-    0xb5,
-    0x01,
-    0x08,
-    0xdf,
-    0x8a,
-    0x29,
-    0xdb,
-    0xc9,
-    0xde,
-    0x31,
-    0xf4,
-    0x26,
-    0x0d
-  ],
-  const [
-    0x41,
-    0x1c,
-    0x13,
-    0xc7,
-    0x50,
-    0x73,
-    0xc1,
-    0xe2,
-    0xd4,
-    0xb1,
-    0xec,
-    0xf1,
-    0x31,
-    0x39,
-    0xba,
-    0x96,
-    0x56,
-    0xcd,
-    0x35,
-    0xc1,
-    0x42,
-    0x01,
-    0xf1,
-    0xc7,
-    0xc6,
-    0xf0,
-    0xee,
-    0xb5,
-    0x8d,
-    0x2d,
-    0xbf,
-    0xe3,
-    0x5b,
-    0xfd,
-    0xec,
-    0xcc,
-    0x92,
-    0xc3,
-    0x96,
-    0x1c,
-    0xfa,
-    0xbb,
-    0x59,
-    0x0b,
-    0xc1,
-    0xeb,
-    0x77,
-    0xea,
-    0xc1,
-    0x57,
-    0x32,
-    0xfb,
-    0x02,
-    0x75,
-    0x79,
-    0x86,
-    0x80,
-    0xe0,
-    0xc7,
-    0x29,
-    0x2e,
-    0x50
-  ],
-  const [
-    0xf2,
-    0xc7,
-    0x6e,
-    0xf6,
-    0x17,
-    0xfa,
-    0x2b,
-    0xfc,
-    0x8a,
-    0x4d,
-    0x6b,
-    0xcb,
-    0xb1,
-    0x5f,
-    0xe8,
-    0x84,
-    0x36,
-    0xfd,
-    0xc2,
-    0x16,
-    0x5d,
-    0x30,
-    0x74,
-    0x62,
-    0x95,
-    0x79,
-    0x07,
-    0x9d,
-    0x4d,
-    0x5b,
-    0x86,
-    0xf5,
-    0x08,
-    0x1a,
-    0xb1,
-    0x77,
-    0xb4,
-    0xc3,
-    0xf5,
-    0x30,
-    0x37,
-    0x6c,
-    0x9c,
-    0x92,
-    0x4c,
-    0xbd,
-    0x42,
-    0x1a,
-    0x8d,
-    0xaf,
-    0x88,
-    0x30,
-    0xd0,
-    0x94,
-    0x0c,
-    0x4f,
-    0xb7,
-    0x58,
-    0x98,
-    0x65,
-    0x83,
-    0x06,
-    0x99
-  ],
-  const [
-    0x45,
-    0x92,
-    0x7e,
-    0x32,
-    0xdd,
-    0xf8,
-    0x01,
-    0xca,
-    0xf3,
-    0x5e,
-    0x18,
-    0xe7,
-    0xb5,
-    0x07,
-    0x8b,
-    0x7f,
-    0x54,
-    0x35,
-    0x27,
-    0x82,
-    0x12,
-    0xec,
-    0x6b,
-    0xb9,
-    0x9d,
-    0xf8,
-    0x84,
-    0xf4,
-    0x9b,
-    0x32,
-    0x7c,
-    0x64,
-    0x86,
-    0xfe,
-    0xae,
-    0x46,
-    0xba,
-    0x18,
-    0x7d,
-    0xc1,
-    0xcc,
-    0x91,
-    0x45,
-    0x12,
-    0x1e,
-    0x14,
-    0x92,
-    0xe6,
-    0xb0,
-    0x6e,
-    0x90,
-    0x07,
-    0x39,
-    0x4d,
-    0xc3,
-    0x3b,
-    0x77,
-    0x48,
-    0xf8,
-    0x6a,
-    0xc3,
-    0x20,
-    0x7c,
-    0xfe
-  ],
-];
-
-const sha1_short_mds = const [
-  'da39a3ee5e6b4b0d3255bfef95601890afd80709',
-  'c1dfd96eea8cc2b62785275bca38ac261256e278',
-  '0a1c2d555bbe431ad6288af5a54f93e0449c9232',
-  'bf36ed5d74727dfd5d7854ec6b1d49468d8ee8aa',
-  'b78bae6d14338ffccfd5d5b5674a275f6ef9c717',
-  '60b7d5bb560a1acf6fa45721bd0abb419a841a89',
-  'a6d338459780c08363090fd8fc7d28dc80e8e01f',
-  '860328d80509500c1783169ebf0ba0c4b94da5e5',
-  '24a2c34b976305277ce58c2f42d5092031572520',
-  '411ccee1f6e3677df12698411eb09d3ff580af97',
-  '05c915b5ed4e4c4afffc202961f3174371e90b5c',
-  'af320b42d7785ca6c8dd220463be23a2d2cb5afc',
-  '9f4e66b6ceea40dcf4b9166c28f1c88474141da9',
-  'e6c4363c0852951991057f40de27ec0890466f01',
-  '046a7b396c01379a684a894558779b07d8c7da20',
-  'd58a262ee7b6577c07228e71ae9b3e04c8abcda9',
-  'a150de927454202d94e656de4c7c0ca691de955d',
-  '35a4b39fef560e7ea61246676e1b7e13d587be30',
-  '7ce69b1acdce52ea7dbd382531fa1a83df13cae7',
-  'b47be2c64124fa9a124a887af9551a74354ca411',
-  '8bb8c0d815a9c68a1d2910f39d942603d807fbcc',
-  'b486f87fb833ebf0328393128646a6f6e660fcb1',
-  '76159368f99dece30aadcfb9b7b41dab33688858',
-  'dbc1cb575ce6aeb9dc4ebf0f843ba8aeb1451e89',
-  'd7a98289679005eb930ab75efd8f650f991ee952',
-  'fda26fa9b4874ab701ed0bb64d134f89b9c4cc50',
-  'c2ff7ccde143c8f0601f6974b1903eb8d5741b6e',
-  '643c9dc20a929608f6caa9709d843ca6fa7a76f4',
-  '509ef787343d5b5a269229b961b96241864a3d74',
-  'b61ce538f1a1e6c90432b233d7af5b6524ebfbe3',
-  '5b7b94076b2fc20d6adb82479e6b28d07c902b75',
-  '6066db99fc358952cf7fb0ec4d89cb0158ed91d7',
-  'b89962c94d60f6a332fd60f6f07d4f032a586b76',
-  '17bda899c13d35413d2546212bcd8a93ceb0657b',
-  'badcdd53fdc144b8bf2cc1e64d10f676eebe66ed',
-  '01b4646180f1f6d2e06bbe22c20e50030322673a',
-  '10016dc3a2719f9034ffcc689426d28292c42fc9',
-  '9f42fa2bce6ef021d93c6b2d902273797e426535',
-  'cdf48bacbff6f6152515323f9b43a286e0cb8113',
-  'b88fb75274b9b0fd57c0045988cfcef6c3ce6554',
-  'c06d3a6a12d9e8db62e8cff40ca23820d61d8aa7',
-  '6e40f9e83a4be93874bc97cdebb8da6889ae2c7a',
-  '3efc940c312ef0dfd4e1143812248db89542f6a5',
-  'a0cf03f7badd0c3c3c4ea3717f5a4fb7e67b2e56',
-  'a544e06f1a07ceb175a51d6d9c0111b3e15e9859',
-  '199d986ed991b99a071f450c6b1121a727e8c735',
-  '33bac6104b0ad6128d091b5d5e2999099c9f05de',
-  '76d7db6e18c1f4ae225ce8ccc93c8f9a0dfeb969',
-  'f652f3b1549f16710c7402895911e2b86a9b2aee',
-  '63faebb807f32be708cf00fc35519991dc4e7f68',
-  '0e6730bc4a0e9322ea205f4edfff1fffda26af0a',
-  'b61a3a6f42e8e6604b93196c43c9e84d5359e6fe',
-  '32d979ca1b3ed0ed8c890d99ec6dd85e6c16abf4',
-  '6f18190bd2d02fc93bce64756575cea36d08b1c3',
-  '68f525feea1d8dbe0117e417ca46708d18d7629a',
-  'a7272e2308622ff7a339460adc61efd0ea8dabdc',
-  'aef843b86916c16f66c84d83a6005d23fd005c9e',
-  'be2cd6f380969be59cde2dff5e848a44e7880bd6',
-  'e5eb4543deee8f6a5287845af8b593a95a9749a1',
-  '534c850448dd486787b62bdec2d4a0b140a1b170',
-  '6fbfa6e4edce4cc85a845bf0d228dc39acefc2fa',
-  '018872691d9b04e8220e09187df5bc5fa6257cd9',
-  'd98d512a35572f8bd20de62e9510cc21145c5bf4',
-  '9f3ea255f6af95c5454e55d7354cabb45352ea0b',
-  'a70cfbfe7563dd0e665c7c6715a96a8d756950c0',
-];
diff --git a/tests/compiler/dart2js/model/sha1_test.dart b/tests/compiler/dart2js/model/sha1_test.dart
deleted file mode 100644
index f431fa6..0000000
--- a/tests/compiler/dart2js/model/sha1_test.dart
+++ /dev/null
@@ -1,579 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// This test is ripped from package:crypto to test the sha1 functionality copied
-// into the compiler.
-
-library sha1_test;
-
-import 'package:compiler/src/hash/sha1.dart';
-
-import "package:unittest/unittest.dart";
-
-part 'sha1_long_test_vectors.dart';
-part 'sha1_short_test_vectors.dart';
-
-void main() {
-  test('expected values', _testExpectedValues);
-  test('invalid use', _testInvalidUse);
-  test('repeated digest', _testRepeatedDigest);
-  test('long inputs', () {
-    _testStandardVectors(sha1_long_inputs, sha1_long_mds);
-  });
-  test('short inputs', () {
-    _testStandardVectors(sha1_short_inputs, sha1_short_mds);
-  });
-}
-
-void _testExpectedValues() {
-  var expectedValues = const [
-    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
-    "5ba93c9db0cff93f52b521d7420e43f6eda2784f",
-    "3f29546453678b855931c174a97d6c0894b8f546",
-    "0c7a623fd2bbc05b06423be359e4021d36e721ad",
-    "a02a05b025b928c039cf1ae7e8ee04e7c190c0db",
-    "1cf251472d59f8fadeb3ab258e90999d8491be19",
-    "868460d98d09d8bbb93d7b6cdd15cc7fbec676b9",
-    "6dc86f11b8cdbe879bf8ba3832499c2f93c729ba",
-    "67423ebfa8454f19ac6f4686d6c0dc731a3ddd6b",
-    "63bf60c7105a07a2b125bbf89e61abdabc6978c2",
-    "494179714a6cd627239dfededf2de9ef994caf03",
-    "2c7e7c384f7829694282b1e3a6216def8082d055",
-    "cff9611cb9aa422a16d9beee3a75319ce5395912",
-    "e51f9799c4a21bba255cf473baf95a89e1b86180",
-    "f741644ba6e1bcf5fee6d3c1b6177b78468ece99",
-    "fb1d9241f67827ce6dd7ac55f1e3c4e4f50caa03",
-    "56178b86a57fac22899a9964185c2cc96e7da589",
-    "0a0315ec7b1e22a79fc862edf79bda2fc01669e3",
-    "32af8a619c2566222bb0ba0689dabcc480c381d5",
-    "d35b5afbc48a696897c084e6e71aae67c7cd9417",
-    "602c63d2f3d13ca3206cdf204cde24e7d8f4266c",
-    "a3c6fbe5c13e8b41fadc204c0cf26f3f214189f4",
-    "25e480e9e0ca2b610105cd1424b8a35f63fb3981",
-    "45412d51d3ca7bcf452d1612720ee88f9d2427c3",
-    "ed6a95036e3e046931597a457db7a78b7309c4c0",
-    "b4fe0256d346700783420e08a4a6f7992b1e36c9",
-    "33e1799e98280e5a9ace5509477a2048607c5537",
-    "cf193837f6de43f8e38000acfcf764fa8d8fde22",
-    "7c8de247dda83599af2ec2ee2d29e20583dac34b",
-    "f38a076f70613fc251c4d21e6435ad08341a8a99",
-    "dcd68e6174bd74ba180da047a7345e8d111f85fd",
-    "43bbacb5f62a0482cbdb564171b04365ca6e27c0",
-    "ae5bd8efea5322c4d9986d06680a781392f9a642",
-    "eb90bce364635c4c23b49f493f0043579bc85c17",
-    "2942c7afa65444c43d0592d0dc73ca71db729205",
-    "abf726f5fda729fb7f3f0484d7c94b3107aa02ae",
-    "75db4f6bcc05a781dda9d17c46717286dd53654b",
-    "a82cb42d89daf5fbc1d4a48476229c495782f98d",
-    "fc1a69683744af823cd69e8a1e3f460591714028",
-    "dc68db44b48521b0700a864896a00e17777aea83",
-    "cc9ad99e917042381b0f99588896cbf236aa8ed3",
-    "ec7a68484a749c7065c6b746f9c465dcb414f370",
-    "c627c449deff14ae7ed807293d30846f061da5b8",
-    "4782f2a19b6dbb0882d656de86c3d21a7317f768",
-    "02d4eed99e7307bea39af5330bf7fb388d48b496",
-    "b3d99b9d90a69e50fd4365704f5ab2eab7bc9763",
-    "9b1c07176bb227f73e8a4e173071d39302061de2",
-    "d79097ddac552a6e02a52ce7aaf494d2d73b2557",
-    "df7f23b160e75b9bae5ea1e62b43a5a34a260127",
-    "f598f3780d8c374d97957b9b62d56106e9e0b2d2",
-    "0bd98598f9ab29c1359ef5460a206dd1370515e3",
-    "e6c320834f69d81689e1ecd5abc808d49d9c4e07",
-    "fd5ee7588cd129e12b886974621fd29facc78e19",
-    "2a9c28ef61eb536d3bbda64ad95a132554be3d6b",
-    "cfae6d86a767b9c700b5081a54265fb2fe0f6fd9",
-    "8ae2d46729cfe68ff927af5eec9c7d1b66d65ac2",
-    "636e2ec698dac903498e648bd2f3af641d3c88cb",
-    "7cb1330f35244b57437539253304ea78a6b7c443",
-    "2e780486f64bc91fbfa2785ec1ca5c9e3cc07939",
-    "4a7713d44e97d9f09ae1d786199c58ae2bfaf3eb",
-    "c98714b16f92c8a770e9fc229df834d1688e282f",
-    "aace3dd6f54a2a255aba920f5ffc8cf04b85a69a",
-    "cf8563896a3b0a0775985d8289444c4bbc478da7",
-    "6d942da0c4392b123528f2905c713a3ce28364bd",
-    "c6138d514ffa2135bfce0ed0b8fac65669917ec7",
-    "69bd728ad6e13cd76ff19751fde427b00e395746",
-    "ce705b7c60d46e7e36fe073db8822698579ca410",
-    "c717ebbf6a2bf1bb33da6257352d5085bee218b3",
-    "86151d140aafc9a4b5877d3fbb49014fe5906e57",
-    "7446b5a6bbcc58bc9662451a0a747d7d031f9a7d",
-    "c24887924f92adac5ae367995d12691c662b7362",
-    "5af83cfd42d61967778889ca911cfb6c14339ba7",
-    "587d4f6e6b4e21343423e434679009cbd3d24dcf",
-    "ac65dd946c5cc432d4d624caeb53c7363f96b7af",
-    "fa71e70750674c0f6b4aa19d0be717b2936c83fd",
-    "c9efe6dd0a019315f73f3962de38b6c848a1705b",
-    "d1d05649b952c8f6eb016be08fe1544aac5d5925",
-    "cc3081ac1d695bae51cfd5b44b9fb3a230733cc3",
-    "eb9de332558953792687d9a7f598b5d84bf0a46b",
-    "39de5efdc92e3d3678f24d2cf545ba4d172d003d",
-    "399dbc9f721e44a992a0def42d999b32af449adc",
-    "996a2817c8acbc667e1c4c27b8f4e9952736dd7a",
-    "3ef8189ce1bcc0d65aa182b1a81534635edfdf2b",
-    "d676714c6a6ff4e17a60c0511c25aa8b164fa606",
-    "4db6e3381e1b9290267c1539e1053793c8b81fa1",
-    "3a34d35b0296fe4d83eda39b742a9d8f4b13a958",
-    "54f3b45304ef1287f54b877fcce3285e154f9d6c",
-    "b1ea96216e025377ab5aa845238fc8bc65dd60e1",
-    "bc6c7488145485dede1ae1d43b594f0046bcda0f",
-    "3d9a0619ecf88c84ce86213e9aa91d9a252cbc32",
-    "92ccaa0b4ce89e2bd80a61b9bafd5ac58ab7b588",
-    "3eb326b5bf4440fb3a88e3dcb05c1db5ea01ac5c",
-    "989c63e819b13d4cadfb33f8deafbc57c1992a12",
-    "ae944552c20cf16f07a5c357713832c9d72d0c6b",
-    "46723e982569a1e2d9edced5498fc1f46f7d63fc",
-    "3bc5dae7907c83a0693f87fd8372efdd1df53e09",
-    "96d281ba44eb21ecfb1663c8ac5752c48686a927",
-    "fa0ef18178880a72b51c26555c10f5210dab4390",
-    "0c7ecac32b8ed6d9835d381bf069568722a276e1",
-    "649e44ecba85c0938ec09229cee4bb69388ec642",
-    "1e6634bfaebc0348298105923d0f26e47aa33ff5",
-    "af2af2734bb2baa288940cb62109f4849daa347f",
-    "22d14bc045cc9a3794c99beee7abe278bf24d6d8",
-    "c3164ccbed75b82ed3f59f4a47fe09b256025549",
-    "c27b5bc7cd24de4913614a769a442e9cc9fb0e08",
-    "f44d48d98cac77522ff6b9e1b9cbb8489e58e588",
-    "ea19a71ffbec9572f6cd65523acaf865ec05ab52",
-    "cda0eb9d310247bd1e8b3ea10d9b9deff6fbaba9",
-    "449dfce971b9d65d69fbc72940e9a885e8dde9ce",
-    "96eebb6b95a9da99c58190cbd77cd6fbcf638a79",
-    "670f7a869e90ce86e0a18232a9d4b1f97c1c77d0",
-    "bc544e24573d592290fdaff8ecf3f7f2b00cd483",
-    "e4ce142d09a84a8645338dd6535cbfaaf800d320",
-    "1c26461e26eb697ccc36a98714ee70caaa87a84e",
-    "51c5b1c25a71ff00394a84ab48b5733c8955551e",
-    "84803504181c0ae33a511c49af5015a5b1892bfd",
-    "7cc8bca120c2635abfea82dd203112b5c7e165da",
-    "44e2519a529d7261f1bebedc8ed95e1182cae0dc",
-    "2a81372da39c1df4251539a9922717b7cf5f0334",
-    "41c89d06001bab4ab78736b44efe7ce18ce6ae08",
-    "d3dbd653bd8597b7475321b60a36891278e6a04a",
-    "3723f8ab857804f89f80970e9fc88cf8f890adc2",
-    "d031c9fb7af0a461241e539e10db62ed28f7033b",
-    "e0b550438e794b65d89b9ee5c8f836ae737decf0",
-    "fb3998281c31d1a8eea2ea737affd0b4d6ab6ac2",
-    "7a914d8b86a534581aa71ec61912ba3f5b478698",
-    "a271f71547442dea7b2edf65cd5fbd5c751710aa",
-    "89d7312a903f65cd2b3e34a975e55dbea9033353",
-    "e6434bc401f98603d7eda504790c98c67385d535",
-    "3352e41cc30b40ae80108970492b21014049e625",
-    "6981ed7d97ffca517d531cd3d1874b43e11f1b46",
-    "76382259107c56b3f798107a8acc62b32d8ec2c6",
-    "548538582fd2e877b023be0611150df9e7ca99e8",
-    "54152ac7d9f4e686e47d3a74d96229c33793d51b",
-    "40e1b424cb6f13453ea005d077adb732b2fb9084",
-    "a47fd7470c43f7cb7e5dd4159fb0c11644f6a108",
-    "4ab5a4f084d4d95894078e8d570eb0bff13c6286",
-    "5f9de1b34863866e2c644fee51ec0bed7d6b7d91",
-    "2425097e0fea366d916d919f690e99cb6594d370",
-    "1e2cf1d35240f0b37d056c69c18ab95559e311d8",
-    "25fb08a7408a380b19074fa547f4fc4eb7d303b9",
-    "e38c3774d31cd2ab4079c38abd7876fe1ff8c1cb",
-    "e06dfc04b000d187b8bd6b539c884581e49a7b48",
-    "027f9a54264ed75254e00c6a8f821630d780c6b3",
-    "a86906b83ee8851520e2e628ab6295ce3497a2d3",
-    "3ba5b1a7c92cf4e749995b819cea8c37e479f433",
-    "e192f0d9326d7a0406b343d89e6c1b0bd1bbfb76",
-    "e5c31d8a5d94c54aba514694cb0ddcd835b328de",
-    "77237ee62b7ea8504451b6372289bba5d46d15a1",
-    "11e85e204f22d0784746ffdcf8c5bc0b5de6a211",
-    "6a2bc12e4605f27fce8c2e90a387e7dee901e48f",
-    "8c696b02e3bd3f7fb02ff852ee8bf8d1d3c9c75c",
-    "75a73cd24385a1e1768adddb23b3d7183cbb2f00",
-    "3c1a0181f2b5d470bf78df6dd596d85f63e4d855",
-    "0be0dc00e59482a360f21199abe9974a85047da2",
-    "b853306aa29ebbea560c61eb1f9a2f740b45b6c8",
-    "5e477b0a9dfe6225bdab510bd87bcecc59bc2497",
-    "9112798181ba4cc1c528a70729cf784115ca69f6",
-    "d741bec70d9070cee9960c5043a2773051e4cbaa",
-    "7135cdf89a331ca5cf339d414a950afa9e2bd786",
-    "aca27247604a6960e513b1eea56146bb4e443c47",
-    "cee02aef5cb718ab5838c9673deb86f47f479f68",
-    "cd024743ff967bf59d595461f549efe50ae155f6",
-    "c100aaa2cc196af36fcdc403e99f04f357c88131",
-    "2f33512a40135a515b68bf53b09844678c7548a1",
-    "3416bd9a3f79dbc063fff2c25bbd760831bf49cb",
-    "679256809caa8eb74c086b8c3a0e2d4abf850f86",
-    "476d4a88a9dabdf50e65dfb207b7117ff9d6e2f4",
-    "9af88ed103f83fab906e5851728b4d47c31cc5cf",
-    "c0733dd1c6ff8f9b1463c3e3ddd299cd3f81d8f0",
-    "5b19b45105657e67a75d290e52b0b12b7cb54fb5",
-    "aa6cc574968f08a0a975fbc65ae1c673125a38b6",
-    "1b3e6fa3c2a28bec0d42f4db58190bd393d372d4",
-    "97019771490e12f6b89b581c7df82ec1e250652b",
-    "37452dde0527a88d2beb55b5b98eebeceaa2b464",
-    "5ada134688493c8ff0298563b6d37e0c2b820818",
-    "27c194fd8566a2c5eff8d00a9ad2febf8105846e",
-    "b692e7fdf82422566df39942a262647fc27544db",
-    "a8df45ea509a4abbb0a9ed2af668040ab420ccca",
-    "b9aa0fd55e3da81095d899e52d6427406779e6c7",
-    "e308d9ea4b329e5ce3ae1ca31cdfc59b687cb7a7",
-    "7366daa91f296da16fc931b8d820c671674c73b1",
-    "b44ab5276973cfccf3b6e1b50f78d1dccae35e0b",
-    "48a9d63f99faea8f26c8f9b37ae8650419767808",
-    "356301d2c18c60cbf761e8820e78b2670a54ba83",
-    "c82f43012f075b3be2018878d30ba404ccde3b5d",
-    "b3d1e00b9f264ff969f7a16c6ae3901f9edb933e",
-    "0446503bbb165ad4e747ebe9e040a550cf6ea1c4",
-    "f4e0b1d08f68e38c83604fda8266535965955131",
-    "38dfba530b2a3b77c25816472c44c03b7e32fe9d",
-    "f079c4078b90472d5a6de034133e6fb6bbb16745",
-    "453e806d74a27e554f2a3395ce7917919bf3bde6",
-    "995b6f0c8f9eda20f3e5a2bd89df908747900008",
-    "c7b4dbb98c78008fd53159174b7baadf250fa5a9",
-    "2407f4de74bc711d0071476eccd73370bb6fbd0e",
-    "56b81cf38a7ad1eb515a8e21af35b308f4977cfe",
-    "de45d743c21cbe75d718086178ce454ced1dfa1a",
-    "9dcc4b7304e7305639ff55e78bf538e6e4bdc847",
-    "63cdae0a07072e387cdbcac4f73bfb0ed66432f6",
-    "20431c9fd7ed84d31937901e6c2f2263e22f2915",
-    "54d11e99127d159799dbce10f51a75e697780478",
-    "b9ae613785fc3061f9df6a4f1e86e6252a6004b3",
-    "366ab5426763b78563de648d831e6e8f02e16c4a",
-    "b5a7a52b733421f97a37319fe3580a4ba2b86a11",
-    "8ed72f03309e7ab31964e4dbfb25e8ab41684124",
-    "5afd9a289b4fce41efb7a77a2baa9314f9f11cf5",
-    "21d0451e21cae775b5f718886fd59b2ea9e9e787",
-    "696cd0f2c8a6e0fce77fac490b70621a71c51e38",
-    "5bcd7ae76d23e39340ef0a0f2fd38ddaa3b4b733",
-    "0e68e78d5d668479992fd6a7ea2879f1c0b44403",
-    "f93dbecda2f86c5c52936e986a582680bcc10953",
-    "e9ef3322618fd7db744b674620bac1d2427c79e5",
-    "2febe02de9105bf3ee4412c79c7c3df1044037ed",
-    "4f60bb9f2c379b6c6b95003d54a4b4dae47889e8",
-    "f2ce6d9c33c6dea70d4a6955f4d00fa8371e54d4",
-    "c012e1bbaac2cb4b7074a859bb98e469177e1afd",
-    "7c5c4cb81d270a5a41f7a41e6124e6028070ee97",
-    "669702442cabc5b51604234fd8ef37062a6cf11a",
-    "0b5febebdc3f4f31d6c5c52b83ef2a06c262ef8b",
-    "cf5d815b01a6a3952ff81a688341222dcbb853fe",
-    "845c71d2b20913850ef1fcfec5606412256639ab",
-    "861c969227f1043620c9833c2580e64bf4cf52d5",
-    "55241a343ca97a602f7a6c71183fe8976999651f",
-    "1d298771d3d6c35899c5604660c1f6c77d1e71c1",
-    "580cc8968318c3bf61ce62aa2ded2b15777de522",
-    "65bb4da1216214d7962733a372e78966bdfda5d5",
-    "17565818c45a669aa6bdd25a7c5c121120704731",
-    "1ad5f3869d8b92fdc30b81b06e21b9be866e103f",
-    "9b181c583aa16426c200931bfe5d4e6c269e6ca2",
-    "60c456ecebd7834f3fa8d1f4307449bf41616740",
-    "bd4c73a0a8748c627879652fad3761fd7ac36c4c",
-    "0baa214b983e58e39ecec9bf2bd537a10b2071ad",
-    "642c7c6166e4dd09183e1b32dfa62f6f3dfc8ad7",
-    "9beb03f7c76da0de2bf22a08efd1e2bf07274f0d",
-    "a0d8782e1eeccc7bb104a4c38f79f8541383fb1d",
-    "1c1b52a04ac3aa838a3698395aa3d934784b4b50",
-    "b844b4f08c5255fa66158fa18ad57154af1aa840",
-    "c07f9c996bf7327dfb47c82eb6b8bda1af065e2f",
-    "1b9fbff4d5a61741c90b6f040eac211285294510",
-    "2e4766b0ebf480a027ae6f9e59e7a2ef9e2aef2a",
-    "f7b8e5e76e6b4cb3dfa7af7070d5560400822b65",
-    "54717f94e8f3ded40b4cc1a470eacb25cb10136f",
-    "e2fce1365029e7d2e8c81f5b1f6c533629ef3752",
-    "7d7bd28f79bfba1b69dcb45f81a423d1730b56d8",
-    "1a17d4c4c689817bc9e5dce38ef79ea684eb8976",
-    "1250a5f131121f1fc0aa77d3d6dfd641526f266a",
-    "43c87ab4ed185c57ab3ccd9d89017897a4e77504",
-    "5a7d9a1c26ef0cb99fa2d7e970b19ccf5a5e4229",
-    "431e10ef7681217c353a54302c611661f5d8aa75",
-    "c572caf20d5aa8b6a8faf99f6628594fe3ddf81b",
-    "a1219d23a9efaaede86c392888a18f995b15e8e2",
-    "be9a388016c3973d9b4a8d0c2c7fb9a6d254370e",
-    "bb260e71e8bd5ed2baf5d9038600032669086ce3",
-    "10fdd35f361b080323b86b47c893cfb13879c028",
-    "154c3aed514692dfef86d89cf1dfbc4f8f1bfc92",
-    "fa2c27c443e60a0bcd8a1eb82d20fec20759c03e",
-    "4916d6bdb7f78e6803698cab32d1586ea457dfc8",
-    "89d6d7a79dfc4c2588e5ba3726d163faa67c4249",
-    "4bc7dfa199db2cc10d6fa1acbe2bea402c3f69f3",
-    "ec485bc69fb3660cdd7c650a8da191c958273534",
-    "1fb3afbdcd58e4edcd92c49f22d4caa0581749a1",
-    "0183c0e82beb55c6b2bc24b89df5dd64b87d22d8",
-    "d8dc481dbe69b312789e85b0284c114108a18bac",
-    "296f1f75500286b9b4e5ac80fba1ea8452d40792",
-    "205c3b9ed40f9f92a70e5920b85707f50689a618",
-    "77ce91d45055ca41c52fa6f9a9c3117b2aee9611",
-    "fe4c72354229cb1b9c9a05dde2ffa93ff6d12400",
-    "48174534cef0fc3fec5b1a6dadfba2281c4195bd",
-    "202413d6ea5edda76cd27e81f8700d0b379ef58e",
-    "699b731a830041cc7afc2a0e8f48df1146abb75d",
-    "3a5f338bf04229f9e45e1402988bd5c59dda930f",
-    "8c620f2651c8ad1a40f4aa2fc0687848c6db1d75",
-    "743fa8d2c15ddaa8923904ba6c2f61db15f5c71e",
-    "ee065a446ffac9e405bc0e30b8a595d898fd8f57",
-    "ba83d7ae664cde7a19ec33e839fa19b46beb7ee8",
-    "0941612acd729027440f6aeac58ac28e18a44cda",
-    "b4a3e1dab651d8e978abfa4c05c0cab1a33902f2",
-    "30666bf53a5fed4b7d6bdbc993348e56144bb1b1",
-    "f6a97e96436d9c5340009a497ba298d2901eb06d",
-    "dc0b98a0d1d20b974885aac995d8c484d6594d4d",
-    "62b3e62ba7f7194fed07c518179d0d86e4e20661",
-    "699b84e119bffbbffa1a228e92682f1f394cabcd",
-    "31ea9a067b4d9207bf4f4e4dbe3ce191cc754e05",
-    "5b9ab97c102fcfb39efda8b788a4a387f18a507f",
-    "a2f9fde34879a9e7f8caa9a21c2f2a4b47c24ede",
-    "4201b2664b010fa180ec54c37d8615b3055f8a81",
-    "84404983f08452a5ff4802e2f531602520d74546",
-    "cc0ea7cd6b40fa790570fc767b363d1482718cb2",
-    "0b0c30ce8a0770ee6a989e94bcf875494ed105d8",
-    "6f5f7e81f4102d4f76c2604d9a0f028e49c4952e",
-    "bab4994f3923af37ddbf54a1b69d5954852d1754",
-    "2c2a9d56d09c676a7b6500d3ee18b6e100cbd87f",
-    "58391cd702c86eec62fcfc9fbfff535410dfb150",
-    "e3510479f43a21b29fde3504af668d37bdbbb799",
-    "ac2369f558f15f080f68cd384fbe52f348a47e31",
-    "e090b0bf8c1b9e7607962a8523f02d82e8cc12af",
-    "262b8f0734bd8af3b42f21fefc9293a6c0bcf8d0",
-    "a4f2c68beca4ab5b4b3db1ae9d07cd1b35f9fffd",
-    "2ca39733f7a738c1fa8f515ffe2ff3ddc0c95c56",
-    "63d16097c9b701d65b33700e05512bc905b58443",
-    "bf77ecf143ceb21f1676c34b8d89c8bb3c43cc4e",
-    "862e4228ab561c475192bdbd03bb33c743fc0734",
-    "515e46b8fd51d614ca183cc8b3a076a9dbe3b70b",
-    "15cd4acbc372d214f88c908c92903c7acb958e32",
-    "26110861010beaef40f4590c701c0ff493f0ee27",
-    "bf7e80ffa9cbda63f72be2b83d732730cb953e97",
-    "d0900aeb1174173f7cc69d4788a61a574893d3b7",
-    "e79a9ff141c1279cec57f7ea34d4ac4d057f0834",
-    "a669f82976ca034e631533ce96e94b44e24dd2d8",
-    "7aab0fd3799c01adc27018aebca9b3a0e1a3d7fc",
-    "36248be03e0562a5306b30fcf7c4a4905cc41714",
-    "6bf234d718fd1f27bbfbff81fb7fd64a22ae6745",
-    "935ca3dfc9bfb1a3dccd5f794ab17e387441a4d2",
-    "bb6ac0036ee0a56803045317744d4269ecfd0e62",
-    "901406bf18a77ea00d526753957cb7423ee20b4e",
-    "b0fe8f32582fa72bddd26dd9599c8205117c6789",
-    "7d62100f74e829f7c5dd4db5817c530f3506813a",
-    "713b4f3bb5a983590b7cb3d8b68aa56abb396cd9",
-    "8e62281add5a87ba1b6df012b5fa25c7ec697265",
-    "ebaa706a4823c278319dfcae0cb4a042d13eb39c",
-    "c2e1fc39b890ff2b27ba8d0d355ef5704d792a8c",
-    "eefbfce3c1c225bb429d0f5bc2552210373aa2d9",
-    "4daea7d3291cdfb5bb13d522966c49bf1d692eac",
-    "efd657e983cc85ba14c91f33fa81cb55413fbda9",
-    "d33bce8f11c9f73666ae05446e0645235b29faf5",
-    "c0c549f0976e53d790ea9fd14aedf0a0cb86a678",
-    "44992a04e41a5cdb18833afe21a731c2b424b990",
-    "6233b62e68349b3b17ffd9eaa7395b8521e31d38",
-    "85d7f914b07ea2df148d5b1ed22f44928fce3a2a",
-    "a2a0b0917c454ba4cb1ee2c61dda863004542ed1",
-    "2411673903f84144bc5ee990f1b9160796196f1b",
-    "6ee6dd69ff465b3bbd0c72048df09f001958419e",
-    "c4493400da60de7e324dd0328ca5e3429d273c14",
-    "a9ea2b10ea549303f8a5448f3921449ce25b8c36",
-    "89725b40e71e1c0b27a68378a9e0ee0b2b0953b8",
-    "cab92400df0b6b54e05d22b6ede2a2e5a623714e",
-    "615653835fa024decf05ab5051fcabb4c6ecf853",
-    "dccbb727546f111a22dbfe140aeb1ca04d74195c",
-    "5d70ca252c600d686da9dd797018545aef3be66a",
-    "a4b6a68e3b0e76d9d97b1323f8ebf752ab8b9815",
-    "9fca700f9b8eb2159fade3e194a26a203270da3c",
-    "69f3f034ffbe3f8881c47e96d8a3c25d108b0b39",
-    "ccecfaa2c49a05caecd260b67e06b3db579aa0c8",
-    "fc97a9f84b147b2244a9c68ed6e42a2b443102e9",
-    "d64305c4b5c334fe9777f4a4c0c82389b289ff1e",
-    "bc04cd94abdf3c177c38572e0b070cfdc6bb615d",
-    "a96053be94fe5646d44c8455783180d5ad7d2ee8",
-    "d34c409ea103ec1a7d54336149f33f3688fafff8",
-    "660e49f0c60c8040ebfea6fbf9d4641bd29a50de",
-    "2f8a580637446865145b7bc1f1376e5827966b47",
-    "bca314aa8344c273ce31d86d05899c4dae043bc6",
-    "c56453208571fd9c5ecb07451ef0f3b93e057ad8",
-    "a238597192afa484d5c085938fe7e5ff5676c5e0",
-    "7c033b565ec87dd7355c42a1822f4478db8a5a06",
-    "2b0006ff2c586663fa9e60f0086ed31cbe263ae4",
-    "07497ffe076d1c6ab3115f8762959763d03a661d",
-    "5b886da6ce74d2392e79fbdf6573d37bd027e767",
-    "946aa1664ebf30f0c8a5297d0307130943516e8a",
-    "1fd32848d34600ec3dbec573897f6491f351e899",
-    "caaf2320f61e4902e0a76275eade0b7b696df011",
-    "188cf111bf5fac85bbd1234a725ae6d60c01b0be",
-    "5a4b75efd596c4b63b585de8bdd7ba32e5c9d51f",
-    "e6cde00bb218398b0746731df063d3bb566de2fa",
-    "5eccce82721de36778dc60bc2202eba25330ac6c",
-    "3f09e72b246a37847815cf6961c046fbe03a1b82",
-    "e41218b9952ed1fdf1c13f4764ce0464ab84da09",
-    "658e0bf69909da7ed06d0812743ea447f031ce20",
-    "351df1eb81e4c608b0f3ab639b4535176417a65e",
-    "8b1418a8864f2bed6f0a744d2a9bff79ce6e128c",
-    "61300adab058879efab23bec70c679a8764cd61c",
-    "c111d79fe3c572e5bb7b76665801304054f9460b",
-    "dbd3d71d83e8eb20ee962d516bc649cf7611bafc",
-    "3fd30a37347451c25842c635700d543a87159ec3",
-    "cdab33892deced0454e1918813b95444c008ad49",
-    "3e2e8c970e959b224f2333e4a9009b482e6863ea",
-    "db4a493a3da552ed75be5fe0d96f6e99e2fd8eeb",
-    "8b94a2c478e153ac9f5fc0b5de763b5124a1f70d",
-    "465059936302a4b0f5303dee926a54c983701c2f",
-    "4d2564abccc82edc1201f2f53975216586966c50",
-    "0b0aa6cf662dcd77e54d3ad8f4f3dc5cc27151a2",
-    "7918795cb32586b1e9e1024318e7eafa9b6ad18f",
-    "35b1bc29234467f581fdcd1eab41d4f5b4e12b64",
-    "abb9f092576cc104c714c930fc45ce4d64579119",
-    "4b21a2a5f59effb24c569761e6d81190178b4ada",
-    "69905ce9887ec25bba3431c58bc461cc198e216e",
-    "9550962ede872cdba5c76e4edd01e0af82627131",
-    "ba961c3cf1019b3ae55cf3cb4dfd63e56445a491",
-    "1daa88cc7b906174701a12cd4ee99db16f0ce895",
-    "1331b7f53c41c3af02675cf9bf9c90f766b15a66",
-    "4c79f5e36122bdd75f0441394e17c47d1610398e",
-    "47ca89f45df07b0cf76413b3e9501a673afaae92",
-    "aafd8ad6f2e4fc8a62a62f9aa0e4b7dfe3ced4ac",
-    "931dc6deca5a7bf14c7f09363b0128e7c2ed54c1",
-    "2860821a19639a36f466d9b609c18d8b925a17be",
-    "1b0833981cb628ba449413cf3b2298a2704aeb32",
-    "36e77b3b717a5157e12ec0c31e97cd7206da5fa2",
-    "de62d25749bd635d6bbe90c450277784a3c61cd0",
-    "dc060bc4abac7f859ce49196440be380973875ec",
-    "7f14938a411d1d43a518f616b89987754587e0a4",
-    "d213475a442062ca792da0365b65013b91bce3e1",
-    "568197b973327d6e1381fb787defb016554ff697",
-    "0f487f25e2c6d326d5842469151decd377808c31",
-    "944c6549c461c86e6efbb055ce984ce8cb477a3e",
-    "5ab47b9585d9fb2479153f5ddb34df05d0d92d2b",
-    "436104ec60d00a3d56f2715f4737b7a12141147f",
-    "c4a4e308300110262019dbbfb4e3d8ba25b15596",
-    "bc32be2415c6c9f7166cd72244aaebdb683ebc58",
-    "283d86c470fead74c4bf994cba027f7edf596747",
-    "7f387b0c27f3b2b273f85eaa35a93bf9d06d8a10",
-    "92aace99c76e474bb8adcba0a875b477fc360885",
-    "bb1cd0c8e0513222e530aa4e1f276cd3b13372ab",
-    "b837ddcbc1eb7084f3c28b6e05bcdb3fea844b56",
-    "d9a19e686d6c77640b10823a49e51b4eb8f51ee5",
-    "198d0a35c25c67b817f4851f5ce0d0056259fdc3",
-    "b5e6beb43c52ae185e2599db1927db7744335adc",
-    "761dc03843153110601ae87b6e36dc29ace16ef6",
-    "a64e92f4a324ad3ba3a116d561bd89036bc9eb71",
-    "18dc53328d39feb8cd31c172e1695093ceec915e",
-    "ae6082492d71f0ef80b402858803602ca3458153",
-    "ec6f78c1620e0bda60f630f36015226ac8639b25",
-    "c05239ff738a997fadd46525bf739e3e2c040e89",
-    "707e83ce4291c118051c5191e888c283b4e98399",
-    "cc14800d9ac3ef0c1f6731c9e70c7939c8dd0870",
-    "c5294dbe82ede53a2d8bb0418503a2deba2e4f3b",
-    "0455262dbd4b71218ed20f4162bbd0c3b7de4d07",
-    "6ccb4f7070d3c908830645cd552e3d6112d059c4",
-    "3974fab667fb7d746d5f088c6e277bfeee8128e7",
-    "065742e2a66d88b5652b2e40d46c4d50102f6db3",
-    "07fa47c9f269b323557182c61f6f6ed1c16ccafb",
-    "196987fbf33148ae33ce9f9733a97ea845cdc1c4",
-    "8139864a57098a32915f0e3aa6c0322fa9459fb6",
-    "1fcbf41589c8e7d92274e64ae6ed3ad9016c179d",
-    "055a0c549e6f648794cc65bddc08cfefffccdf9b",
-    "f956af32d67df97f6534357de15b216cc2d2d102",
-    "d7fea5323eea433ddb6277228ec0a5bc1ab4a808",
-    "083c9487c4469fda257aa45c8876ec8269aeebd8",
-    "9e88e459135e5f0b52ef6c371cca04a39d54b90b",
-    "b8c1ee8246d14bd62e5a03b94b848b534613e7d2",
-    "d26b97682f8acb1daf78be8c4418a0ebb17a05b4",
-    "68f2b5a79ddb450cd1b4d5d6e502979c9f157996",
-    "629e969018aa82b56389a3e601ef2a209f07cf07",
-    "2dca01e39393889210c566779afb65048a387785",
-    "d51c2f00f8c0fa2484497abe1bf85689c45d42ae",
-    "467dd26d49785595bba3d406de25f5df8fd8fd4f",
-    "72f9f715ea0aaf529be15e6afd7388e02341af75",
-    "25a5435435d5020c5a7cbbb84d3f9b5e8b2fb9fe",
-    "059d91ec492b6051340704b240b282d1fbe3d114",
-    "33fd244ba8454d234e7d6a8d04a55b78eff890c5",
-    "7d008c2d8d47bb97fc5dfe3de4559506e7fc4708",
-    "860ddab2982e9dac6cdd1e19f5c6c53dab82e4c1",
-    "4e39274189149868840fe7832230aa66483cd72d",
-    "c61b506b45d98fe6ce5422f8edf6f8bde43fd2df",
-    "97a8be86139d2732a9009525dff7cf77781acec1",
-    "1e83aad8918c5002eca3b07b071045d23a7213f1",
-    "d58d9ff6d19bd47651f3e2c766f869e6e07776ff",
-    "edbb172dc2004b81bf3937a0d3e54ea5ed642da1",
-    "1b144f648322f58caea9d31b3daf5ed686a3305b",
-    "0662edf0d072a4efcbb94fc855a35b0631007eff",
-    "446da0ba13c0c8cdec5dcb55beaff62f83822af7",
-    "3ecdc37d6ba572f691cf42654b182ce0cf4853e0",
-    "b9cf503328fc20919109b57a7785dbb664b2710e",
-    "8519d7c98bc7b7610ee96c047fb71ba73a441ca4",
-    "897e381dc5bac1eb7e8756dde6adae3ef2a081b8",
-    "8d1f32ea054e1d02370eb02c8ddd67bafd4138b2",
-    "d08fbd377a7f3689f881049f8c999e8c3616bdd2",
-    "ef9c6777079358192b922616871f6e6762d5a05a",
-    "63e2d52b6704f4660c1b6662a67acf385b4fb3cf",
-    "9fd8b020a14f2dd4be4ad5de13352ab8addbedaa",
-    "4481cc23334be067c5dfe87bffed1a1557fb5f64",
-    "dbb3e3d67acf2807afce8e9cdc3f670b1cfb67c2",
-    "0ab84832b324391f111b796e18dbdbf2c640f89f",
-    "742672e86dc79921ad0551daaa134baecb1f81f6",
-    "768e50efa6303a32043f7417f3360ffc3c9d4ba8",
-    "4fc6247f63a71000a794758c3d266d42acd39758",
-    "adfbec37138f84c212aab558a83e40570a349e1d",
-    "b8725701da5bb62ed2371788edb05daa9b42799a",
-    "10a0fe5f359d0f7bdcf10ed843b06a73338fa086",
-    "a30f11be717bc710d4d6dbfa02da4767eec14fc1",
-    "c0f1aba4346f0aca89f3ced0822af676a6835e87",
-    "89399c4a03e038efb7a97fe38ab3f6604f1fc37e",
-    "69ac5e45377465de71eed8a5527d7542130d8b2c",
-    "69a5899a88ad3922168116e523a59a19f5fdbe63",
-    "4da263905ead1900d957e11a24165aa5364da10c",
-    "b3f980c9a1a5939c21865e1430cdb6514c9f0787",
-    "195c2807c4b178c8d357d48560b759c70a5e1912",
-    "f5527b7bdfa0eb61b5b399c8a92ef72bcaa1dca7",
-    "60acf171a06b799678aa04c5ad2b999eba84f2e8",
-    "c357c94e288185c8c29ec2af829d159d296d5907",
-    "a7dc371d6a10326870be46b2cdf54803c4f05f2e",
-    "1f5e0cc507a3f9749d8c6377663626bd31aaa99b",
-    "8f352137a1e22f329086dd7b429049c7a8038718",
-    "879c2e232949b8ec6c9ee6529ee39d5dbc502b8c",
-    "aef44d7afe612259094ccd60494193225954bc51",
-    "1fdadca3d067bcc8db56715a9a492dfd2d4f5b3d",
-    "3b70d3d1cb0646f288537ed2695696c10b64d41b",
-    "8188a5ccd6e88caaf801c0373283c18a0b315bf9",
-    "75ebb8907480f01839e972a91051eccdd001619d",
-    "0ec661c8aa7e106c4e03acbcca84c3cd8eaaea6d",
-    "97da3e33e17f41d2187825d377bf0994c1631f89",
-    "5f7c53e4006f76cbd1777b01005d03482d616f75",
-    "50750f6ec4bdaa134369299de53d8d8b87d1ba63",
-    "5f8f7e823d4e54b02610108a86ea721e337864ec",
-    "d6cc685ba7b6ac3157adbb44c3f24c5a3c01ea67",
-    "61e297c05feecd9901ec06b314429fe6ca92f27a",
-    "d64a178d4759b796ec0e77626cf19257c28292fc",
-    "6ae457f71b1cd60b1810fd4379c90bb38154568f",
-    "063623280f208df296895ccd867dab8a73cf174d",
-    "7a8b8c9aa0591603cf08e94ec2ae6a6350cbb8a2",
-    "20c4232d3066c41e211eefe2834db78a8c083ea4",
-    "82fdf2cccc77ab556aa35557d0923b162d1b98cf",
-    "3dce8306f3c1810d5d81ed5ebb0ccea947277a61",
-    "11bca5b61fc1f6d59078ec5354bc6d9adecc0c5d",
-  ];
-  for (var i = 0; i < expectedValues.length; i++) {
-    var hash = new SHA1();
-    hash.add(new List<int>.generate(i, (j) => j, growable: false));
-    var digest = hash.close();
-    expect(expectedValues[i], bytesToHex(digest));
-  }
-}
-
-String bytesToHex(List<int> bytes) {
-  var result = new StringBuffer();
-  for (var part in bytes) {
-    result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
-  }
-  return result.toString();
-}
-
-void _testInvalidUse() {
-  var sha = new SHA1();
-  sha.close();
-  expect(() => sha.add([0]), throwsStateError);
-}
-
-void _testRepeatedDigest() {
-  var sha = new SHA1();
-  var digest = sha.close();
-  expect(digest, sha.close());
-}
-
-void _testStandardVectors(List<List<int>> inputs, mds) {
-  for (var i = 0; i < inputs.length; i++) {
-    var hash = new SHA1();
-    hash.add(inputs[i]);
-    var d = hash.close();
-    expect(mds[i], bytesToHex(d), reason: '$i');
-  }
-}
diff --git a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
index d721dc7..aeb3108 100644
--- a/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
+++ b/tests/compiler/dart2js/model/strong_mode_closed_world_test.dart
@@ -17,11 +17,18 @@
 }
 
 runTest() async {
-  CompilationResult result = await runCompiler(memorySourceFiles: {
-    'main.dart': '''
+  // Pretend this is a dart2js_native test to allow use of 'native' keyword
+  // and import of private libraries.
+  String main = 'sdk/tests/compiler/dart2js_native/main.dart';
+  Uri entryPoint = Uri.parse('memory:$main');
+
+  CompilationResult result =
+      await runCompiler(entryPoint: entryPoint, memorySourceFiles: {
+    main: '''
 class A {
   method1() {}
   method2() {}
+  method4() {}
   get getter => 42;
   set setter(_) {}
 }
@@ -29,6 +36,7 @@
 class B {
   method1() {}
   method2() {}
+  method5() {}
   get getter => 42;
   set setter(_) {}
 }
@@ -36,6 +44,7 @@
 class C extends A {
   method1() {}
   method2() {}
+  method4() {} 
   get getter => 42;
   set setter(_) {}
 }
@@ -43,6 +52,7 @@
 class D implements B {
   method1() {}
   method2() {}
+  method5() {}
   get getter => 42;
   set setter(_) {}
 }
@@ -50,6 +60,7 @@
 class E implements A {
   method1() {}
   method2() {}
+  method4() {}
   get getter => 42;
   set setter(_) {}
 }
@@ -57,6 +68,7 @@
 class F extends B {
   method1() {}
   method2() {}
+  method5() {}
   get getter => 42;
   set setter(_) {}
 }
@@ -64,6 +76,7 @@
 class G {
   method1() {}
   method2() {}
+  method4() {} 
   get getter => 42;
   set setter(_) {}
 }
@@ -73,6 +86,7 @@
 class I {
   method1() {}
   method2() {}
+  method4() {}
   get getter => 42;
   set setter(_) {}
 }
@@ -124,6 +138,12 @@
 }
 
 main() {
+  method1();
+  method2();
+}
+
+@pragma('dart2js:disableFinal')
+method1() {
   A a = new A();
   B b = new B();
   a.method1();
@@ -148,14 +168,21 @@
   new Class1b();
   new Class2().c(0, 1, 2);
 }
+
+method2() {
+  A a = new A();
+  B b = new B();
+  a.method4();
+  b.method5();
+}
 '''
   });
   Expect.isTrue(result.isSuccess);
   Compiler compiler = result.compiler;
 
   Map<String, List<String>> expectedLiveMembersMap = <String, List<String>>{
-    'A': ['method1', 'getter'],
-    'B': ['method2', 'setter'],
+    'A': ['method1', 'getter', 'method4'],
+    'B': ['method2', 'setter', 'method5'],
     'C': ['method1', 'getter'],
     'D': ['method2', 'setter'],
     'G': ['method1', 'getter'],
diff --git a/tests/compiler/dart2js/optimization/data/field_get.dart b/tests/compiler/dart2js/optimization/data/field_get.dart
new file mode 100644
index 0000000..e200302
--- /dev/null
+++ b/tests/compiler/dart2js/optimization/data/field_get.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  method1(new Class1a());
+  method2(new Class2a());
+  method2(new Class2b());
+  method3(new Class3a());
+  method3(new Class3b());
+  method4(new Class4a());
+  method4(new Class4b());
+}
+
+class Class1a {
+  int field1;
+}
+
+/*element: method1:FieldGet=[name=Class1a.field1]*/
+@pragma('dart2js:noInline')
+method1(Class1a c) {
+  return c.field1;
+}
+
+class Class2a {
+  int field2;
+}
+
+class Class2b extends Class2a {}
+
+/*element: method2:FieldGet=[name=Class2a.field2]*/
+@pragma('dart2js:noInline')
+method2(Class2a c) {
+  return c.field2;
+}
+
+class Class3a {
+  int field3;
+}
+
+class Class3b implements Class3a {
+  int get field3 => 42;
+  set field3(int _) {}
+}
+
+@pragma('dart2js:noInline')
+method3(Class3a c) {
+  return c.field3;
+}
+
+class Class4a {
+  int field4;
+}
+
+class Class4b implements Class4a {
+  int field4;
+}
+
+// TODO(johnniwinther,sra): Maybe we should optimize cases like this to a direct
+// property access, because all targets are simple fields?
+@pragma('dart2js:noInline')
+method4(Class4a c) {
+  return c.field4;
+}
diff --git a/tests/compiler/dart2js/optimization/data/field_set.dart b/tests/compiler/dart2js/optimization/data/field_set.dart
new file mode 100644
index 0000000..953fe07
--- /dev/null
+++ b/tests/compiler/dart2js/optimization/data/field_set.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  method1(new Class1a());
+  method2(new Class2a());
+  method2(new Class2b());
+  method3(new Class3a());
+  method3(new Class3b());
+  method4(new Class4a());
+  method4(new Class4b());
+}
+
+class Class1a {
+  int field1;
+}
+
+/*element: method1:FieldSet=[name=Class1a.field1]*/
+@pragma('dart2js:noInline')
+method1(Class1a c) {
+  c.field1 = 42;
+}
+
+class Class2a {
+  int field2 = 42;
+}
+
+class Class2b extends Class2a {}
+
+/*element: method2:FieldSet=[name=Class2a.field2]*/
+@pragma('dart2js:noInline')
+method2(Class2a c) {
+  c.field2 = 42;
+}
+
+class Class3a {
+  int field3;
+}
+
+class Class3b implements Class3a {
+  int get field3 => 42;
+  set field3(int _) {}
+}
+
+@pragma('dart2js:noInline')
+method3(Class3a c) {
+  c.field3 = 42;
+}
+
+class Class4a {
+  int field4;
+}
+
+class Class4b implements Class4a {
+  int field4;
+}
+
+// TODO(johnniwinther,sra): Maybe we should optimize cases like this to a direct
+// property write, because all targets are simple fields?
+@pragma('dart2js:noInline')
+method4(Class4a c) {
+  c.field4 = 42;
+}
diff --git a/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart b/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
new file mode 100644
index 0000000..6411114
--- /dev/null
+++ b/tests/compiler/dart2js/optimization/data/finalized_type_variable.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+abstract class AppView<T> {
+  T ctx;
+}
+
+class CardComponent {
+  String title;
+}
+
+class ViewCardComponent extends AppView<CardComponent> {
+  /*element: ViewCardComponent.method1:
+   FieldGet=[name=AppView.ctx],
+   FieldSet=[name=CardComponent.title]
+  */
+  @pragma('dart2js:noInline')
+  method1(String value) {
+    ctx.title = value;
+  }
+
+  /*element: ViewCardComponent.method2:
+   FieldGet=[name=AppView.ctx,name=CardComponent.title]
+  */
+  @pragma('dart2js:noInline')
+  method2() {
+    return ctx.title;
+  }
+}
+
+class CardComponent2 {
+  String title;
+}
+
+class ViewCardComponent2 extends AppView<CardComponent2> {
+  /*element: ViewCardComponent2.method1:
+   FieldGet=[name=AppView.ctx],
+   FieldSet=[name=CardComponent2.title]
+  */
+  @pragma('dart2js:noInline')
+  method1(String value) {
+    ctx.title = value;
+  }
+
+  /*element: ViewCardComponent2.method2:
+   FieldGet=[name=AppView.ctx,name=CardComponent2.title]
+  */
+  @pragma('dart2js:noInline')
+  method2() {
+    return ctx.title;
+  }
+}
+
+/*strong.element: main:*/
+/*omit.element: main:FieldSet=[name=AppView.ctx,name=AppView.ctx]*/
+main() {
+  var c1 = new ViewCardComponent();
+  c1.ctx = new CardComponent();
+  c1.method1('foo');
+  c1.method2();
+  var c2 = new ViewCardComponent2();
+  c2.ctx = new CardComponent2();
+  c2.method1('bar');
+  c2.method2();
+}
diff --git a/tests/compiler/dart2js/optimization/optimization_test.dart b/tests/compiler/dart2js/optimization/optimization_test.dart
new file mode 100644
index 0000000..0f2d013
--- /dev/null
+++ b/tests/compiler/dart2js/optimization/optimization_test.dart
@@ -0,0 +1,163 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_backend/backend.dart';
+import 'package:compiler/src/js_model/element_map.dart';
+import 'package:compiler/src/js_model/js_world.dart';
+import 'package:compiler/src/ssa/logging.dart';
+import 'package:compiler/src/ssa/ssa.dart';
+import 'package:compiler/src/util/features.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+    await checkTests(dataDir, const OptimizationDataComputer(), args: args);
+  });
+}
+
+class OptimizationDataValidator implements DataInterpreter<OptimizationLog> {
+  const OptimizationDataValidator();
+
+  @override
+  String getText(OptimizationLog actualData) {
+    Features features = new Features();
+    for (OptimizationLogEntry entry in actualData.entries) {
+      features.addElement(entry.tag, entry.features.getText());
+    }
+    return features.getText();
+  }
+
+  @override
+  bool isEmpty(OptimizationLog actualData) {
+    return actualData == null || actualData.entries.isEmpty;
+  }
+
+  @override
+  String isAsExpected(OptimizationLog actualLog, String expectedLog) {
+    expectedLog ??= '';
+    if (expectedLog == '') {
+      return actualLog.entries.isEmpty
+          ? null
+          : "Expected empty optimization log.";
+    }
+    if (expectedLog == '*') {
+      return null;
+    }
+    List<OptimizationLogEntry> actualDataEntries = actualLog.entries.toList();
+    Features expectedLogEntries = Features.fromText(expectedLog);
+    List<String> errorsFound = <String>[];
+    expectedLogEntries.forEach((String tag, dynamic expectedEntryData) {
+      List<OptimizationLogEntry> actualDataForTag =
+          actualDataEntries.where((data) => data.tag == tag).toList();
+      if (expectedEntryData == '' ||
+          expectedEntryData is List && expectedEntryData.isEmpty) {
+        if (actualDataForTag.isNotEmpty) {
+          errorsFound.add('Non-empty log found for tag $tag');
+        }
+      } else if (expectedEntryData == '*') {
+        // Anything allowed.
+      } else if (expectedEntryData is List) {
+        for (Object object in expectedEntryData) {
+          Features expectedLogEntry = Features.fromText('$object');
+          bool matchFound = false;
+          for (OptimizationLogEntry actualLogEntry in actualDataForTag) {
+            bool validData = true;
+            expectedLogEntry.forEach((String key, Object expectedValue) {
+              Object actualValue = actualLogEntry.features[key];
+              if ('$actualValue' != '$expectedValue') {
+                validData = false;
+              }
+            });
+            if (validData) {
+              actualDataForTag.remove(actualLogEntry);
+              matchFound = true;
+              break;
+            }
+          }
+          if (!matchFound) {
+            errorsFound.add("No match found for $tag=[$object]");
+          }
+        }
+      } else {
+        errorsFound.add("Unknown expected entry '$expectedEntryData'");
+      }
+    });
+    return errorsFound.isNotEmpty ? errorsFound.join(', ') : null;
+  }
+}
+
+class OptimizationDataComputer extends DataComputer<OptimizationLog> {
+  const OptimizationDataComputer();
+
+  /// Compute type inference data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<OptimizationLog>> actualMap,
+      {bool verbose: false}) {
+    JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    JsToElementMap elementMap = closedWorld.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new OptimizationIrComputer(compiler.reporter, actualMap, elementMap, member,
+            compiler.backend, closedWorld.closureDataLookup)
+        .run(definition.node);
+  }
+
+  @override
+  DataInterpreter<OptimizationLog> get dataValidator =>
+      const OptimizationDataValidator();
+}
+
+/// AST visitor for computing inference data for a member.
+class OptimizationIrComputer extends IrDataExtractor<OptimizationLog> {
+  final JavaScriptBackend backend;
+  final JsToElementMap _elementMap;
+  final ClosureData _closureDataLookup;
+
+  OptimizationIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData<OptimizationLog>> actualMap,
+      this._elementMap,
+      MemberEntity member,
+      this.backend,
+      this._closureDataLookup)
+      : super(reporter, actualMap);
+
+  OptimizationLog getLog(MemberEntity member) {
+    SsaFunctionCompiler functionCompiler = backend.functionCompiler;
+    return functionCompiler.optimizer.loggersForTesting[member];
+  }
+
+  OptimizationLog getMemberValue(MemberEntity member) {
+    if (member is FunctionEntity) {
+      return getLog(member);
+    }
+    return null;
+  }
+
+  @override
+  OptimizationLog computeMemberValue(Id id, ir.Member node) {
+    return getMemberValue(_elementMap.getMember(node));
+  }
+
+  @override
+  OptimizationLog computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
+      ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
+      return getMemberValue(info.callMethod);
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js/rti/data/as.dart b/tests/compiler/dart2js/rti/data/as.dart
new file mode 100644
index 0000000..b84f239
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/as.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Derived from dart2js_extra/generic_type_error_message_test.
+
+import 'package:expect/expect.dart';
+
+/*class: Foo:*/
+class Foo<T extends num> {}
+
+/*class: Bar:*/
+class Bar<T extends num> {}
+
+/*class: Baz:explicit=[Baz<num>],needsArgs*/
+class Baz<T extends num> {}
+
+@pragma('dart2js:disableFinal')
+main() {
+  test(new Foo(), Foo, expectTypeArguments: false);
+  // ignore: unnecessary_cast
+  test(new Bar() as Bar<num>, Bar, expectTypeArguments: false);
+  Baz<num> b = new Baz();
+  dynamic c = b;
+  test(c as Baz<num>, Baz, expectTypeArguments: true);
+}
+
+void test(dynamic object, Type type, {bool expectTypeArguments}) {
+  bool caught = false;
+  try {
+    print(type);
+    object as List<String>;
+  } catch (e) {
+    String expected = '$type';
+    if (!expectTypeArguments) {
+      expected = expected.substring(0, expected.indexOf('<'));
+    }
+    expected = "'$expected'";
+    Expect.isTrue(e.toString().contains(expected),
+        'Expected "$expected" in the message: $e');
+    caught = true;
+    print(e);
+  }
+  Expect.isTrue(caught);
+}
diff --git a/tests/compiler/dart2js/rti/data/call_typed.dart b/tests/compiler/dart2js/rti/data/call_typed.dart
index edab1dd..9731508 100644
--- a/tests/compiler/dart2js/rti/data/call_typed.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed.dart
@@ -13,6 +13,6 @@
 test(o) => o is Function(int);
 
 main() {
-  Expect.isTrue(test(new A()));
+  Expect.isFalse(test(new A()));
   Expect.isFalse(test(null));
 }
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index 7509783..f7f5de4 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -17,6 +17,7 @@
 test(o) => o is Function(int);
 
 main() {
-  Expect.isTrue(test(new A<int>()));
+  Expect.isFalse(test(new A<int>()));
   Expect.isFalse(test(new A<String>()));
+  new A().call(null); // Use .call to ensure it is live.
 }
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
deleted file mode 100644
index fd20af7..0000000
--- a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
-
-/*strong.class: A:direct,explicit=[A.T],needsArgs*/
-/*omit.class: A:*/
-class A<T> {
-  /*strong.element: A.call:*/
-  /*omit.element: A.call:*/
-  call(T t) {}
-}
-
-@noInline
-test(o) => o is Function(int);
-
-main() {
-  Expect.isFalse(test(new A<int>()));
-  Expect.isFalse(test(new A<String>()));
-}
diff --git a/tests/compiler/dart2js/rti/data/call_typed_strong.dart b/tests/compiler/dart2js/rti/data/call_typed_strong.dart
deleted file mode 100644
index 9731508..0000000
--- a/tests/compiler/dart2js/rti/data/call_typed_strong.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-import 'package:meta/dart2js.dart';
-
-class A {
-  call(int i) {}
-}
-
-@noInline
-test(o) => o is Function(int);
-
-main() {
-  Expect.isFalse(test(new A()));
-  Expect.isFalse(test(null));
-}
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
rename to tests/compiler/dart2js/rti/data/closure_generic_unneeded.dart
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded_strong.dart b/tests/compiler/dart2js/rti/data/closure_unneeded_strong.dart
deleted file mode 100644
index ad98d37..0000000
--- a/tests/compiler/dart2js/rti/data/closure_unneeded_strong.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:expect/expect.dart';
-
-/*class: A:*/
-class A<T> {
-  @NoInline()
-  m() {
-    return /**/ (int i, String s) {};
-  }
-}
-
-@NoInline()
-test(o) => o is void Function(int);
-
-main() {
-  test(new A<int>().m());
-}
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_is.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_is_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_is.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_is2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_is2.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is_closure_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_is_closure.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_is_closure_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_is_closure.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is_closure2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_is_closure2_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_is_closure2.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_not.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_not_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_not.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_not2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_not2_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_not2.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_closure_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_not_closure.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_not_closure_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_not_closure.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_not_closure2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_not_closure2_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_not_closure2.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_tear_off_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_tear_off.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_tear_off2_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_tear_off2.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_tear_off3.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off4_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_tear_off4_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_tear_off4.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_type_literal_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_type_literal.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_type_literal_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_type_literal.dart
diff --git a/tests/compiler/dart2js/rti/data/dynamic_type_literal2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/dynamic_type_literal2_strong.dart
rename to tests/compiler/dart2js/rti/data/dynamic_type_literal2.dart
diff --git a/tests/compiler/dart2js/rti/data/explicit_as.dart b/tests/compiler/dart2js/rti/data/explicit_as.dart
new file mode 100644
index 0000000..a90140a
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/explicit_as.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*strong.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
+/*omit.class: C:*/
+class C<T> {
+  T field;
+}
+
+main() {
+  explicitAs(new C<String>());
+}
+
+explicitAs(C<String> i) {
+  // ignore: unnecessary_cast
+  return i as C<String>;
+}
diff --git a/tests/compiler/dart2js/rti/data/future_or_strong.dart b/tests/compiler/dart2js/rti/data/future_or.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/future_or_strong.dart
rename to tests/compiler/dart2js/rti/data/future_or.dart
diff --git a/tests/compiler/dart2js/rti/data/future_or_future_or_strong.dart b/tests/compiler/dart2js/rti/data/future_or_future_or.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/future_or_future_or_strong.dart
rename to tests/compiler/dart2js/rti/data/future_or_future_or.dart
diff --git a/tests/compiler/dart2js/rti/data/future_or_future_or_generic_strong.dart b/tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/future_or_future_or_generic_strong.dart
rename to tests/compiler/dart2js/rti/data/future_or_future_or_generic.dart
diff --git a/tests/compiler/dart2js/rti/data/future_or_generic_strong.dart b/tests/compiler/dart2js/rti/data/future_or_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/future_or_generic_strong.dart
rename to tests/compiler/dart2js/rti/data/future_or_generic.dart
diff --git a/tests/compiler/dart2js/rti/data/future_or_generic2_strong.dart b/tests/compiler/dart2js/rti/data/future_or_generic2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/future_or_generic2_strong.dart
rename to tests/compiler/dart2js/rti/data/future_or_generic2.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_bounds_strong.dart b/tests/compiler/dart2js/rti/data/generic_bounds.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_bounds_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_bounds.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_closure_instantiate_strong.dart b/tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_closure_instantiate_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_closure_instantiate.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_method1_strong.dart b/tests/compiler/dart2js/rti/data/generic_method1.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_method1_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_method1.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_method2_strong.dart b/tests/compiler/dart2js/rti/data/generic_method2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_method2_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_method2.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_method3_strong.dart b/tests/compiler/dart2js/rti/data/generic_method3.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_method3_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_method3.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_method4_strong.dart b/tests/compiler/dart2js/rti/data/generic_method4.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_method4_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_method4.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_method_is2_strong.dart b/tests/compiler/dart2js/rti/data/generic_method_is2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_method_is2_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_method_is2.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_methods_dynamic_05.dart
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
rename to tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a.dart
diff --git a/tests/compiler/dart2js/rti/data/implicit_as.dart b/tests/compiler/dart2js/rti/data/implicit_as.dart
new file mode 100644
index 0000000..59db5dc
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/implicit_as.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*strong.class: C:direct,explicit=[C.T,C<String>],needsArgs*/
+/*omit.class: C:*/
+class C<T> {
+  T field;
+}
+
+main() {
+  implicitAs(new C<String>());
+}
+
+C<String> implicitAs(C<String> i) {
+  dynamic j = i;
+  return j;
+}
diff --git a/tests/compiler/dart2js/rti/data/list_literal_strong.dart b/tests/compiler/dart2js/rti/data/list_literal.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/list_literal_strong.dart
rename to tests/compiler/dart2js/rti/data/list_literal.dart
diff --git a/tests/compiler/dart2js/rti/data/local_function_generic_strong.dart b/tests/compiler/dart2js/rti/data/local_function_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/local_function_generic_strong.dart
rename to tests/compiler/dart2js/rti/data/local_function_generic.dart
diff --git a/tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart b/tests/compiler/dart2js/rti/data/local_function_list_literal.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/local_function_list_literal_strong.dart
rename to tests/compiler/dart2js/rti/data/local_function_list_literal.dart
diff --git a/tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart b/tests/compiler/dart2js/rti/data/local_function_map_literal.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/local_function_map_literal_strong.dart
rename to tests/compiler/dart2js/rti/data/local_function_map_literal.dart
diff --git a/tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart b/tests/compiler/dart2js/rti/data/local_function_signature2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/local_function_signature2_strong.dart
rename to tests/compiler/dart2js/rti/data/local_function_signature2.dart
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart b/tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/local_function_signatures_strong.dart
rename to tests/compiler/dart2js/rti/data/local_function_signatures_generic.dart
diff --git a/tests/compiler/dart2js/rti/data/map_literal_strong.dart b/tests/compiler/dart2js/rti/data/map_literal_strong.dart
deleted file mode 100644
index 92bb292..0000000
--- a/tests/compiler/dart2js/rti/data/map_literal_strong.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/*strong.class: global#Map:explicit=[Map],indirect,needsArgs*/
-/*omit.class: global#Map:*/
-
-/*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
-/*omit.class: global#LinkedHashMap:deps=[Map]*/
-
-/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
-/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
-
-/*strong.class: global#double:explicit=[double],implicit=[double]*/
-/*omit.class: global#double:explicit=[double]*/
-
-/*class: global#JSDouble:*/
-
-main() {
-  <int, double>{}[0] = 0.5;
-}
diff --git a/tests/compiler/dart2js/rti/data/method_signatures_strong.dart b/tests/compiler/dart2js/rti/data/method_signatures_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/method_signatures_strong.dart
rename to tests/compiler/dart2js/rti/data/method_signatures_generic.dart
diff --git a/tests/compiler/dart2js/rti/data/no_such_method1_strong.dart b/tests/compiler/dart2js/rti/data/no_such_method1.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/no_such_method1_strong.dart
rename to tests/compiler/dart2js/rti/data/no_such_method1.dart
diff --git a/tests/compiler/dart2js/rti/data/no_such_method2_strong.dart b/tests/compiler/dart2js/rti/data/no_such_method2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/no_such_method2_strong.dart
rename to tests/compiler/dart2js/rti/data/no_such_method2.dart
diff --git a/tests/compiler/dart2js/rti/data/no_such_method3_strong.dart b/tests/compiler/dart2js/rti/data/no_such_method3.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/no_such_method3_strong.dart
rename to tests/compiler/dart2js/rti/data/no_such_method3.dart
diff --git a/tests/compiler/dart2js/rti/data/private_dynamic_strong.dart b/tests/compiler/dart2js/rti/data/private_dynamic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/private_dynamic_strong.dart
rename to tests/compiler/dart2js/rti/data/private_dynamic.dart
diff --git a/tests/compiler/dart2js/rti/data/private_dynamic2_strong.dart b/tests/compiler/dart2js/rti/data/private_dynamic2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/private_dynamic2_strong.dart
rename to tests/compiler/dart2js/rti/data/private_dynamic2.dart
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1_strong.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1_strong.dart
rename to tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string1.dart
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2_strong.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2_strong.dart
rename to tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string2.dart
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3_strong.dart b/tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3_strong.dart
rename to tests/compiler/dart2js/rti/data/runtime_type_instantiate_to_string3.dart
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
index fb64484..eeb633c 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
@@ -24,4 +24,5 @@
   dynamic cls1 = new Class1<int>();
   print('${cls1.runtimeType}');
   new Class2<int>();
+  cls1 = null;
 }
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
deleted file mode 100644
index 24cc2ee..0000000
--- a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/*strong.class: A:direct,explicit=[A.T],needsArgs*/
-/*omit.class: A:*/
-class A<T> {
-  /*strong.element: A.m:*/
-  /*omit.element: A.m:*/
-  void m(T t) {}
-
-  /*element: A.f:*/
-  void f(int t) {}
-}
-
-main() {
-  new A<int>().m is void Function(int);
-  new A<int>().f is void Function(int);
-}
diff --git a/tests/compiler/dart2js/rti/data/tear_off_strong.dart b/tests/compiler/dart2js/rti/data/tear_off_strong.dart
deleted file mode 100644
index 421d480..0000000
--- a/tests/compiler/dart2js/rti/data/tear_off_strong.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/*class: A:*/
-class A<T> {
-  /*element: A.m:*/
-  void m(String t) {}
-
-  /*element: A.f:*/
-  void f(int t) {}
-}
-
-main() {
-  new A<int>().m is void Function(int);
-  new A<int>().f is void Function(int);
-}
diff --git a/tests/compiler/dart2js/rti/data/type_literal_strong.dart b/tests/compiler/dart2js/rti/data/type_literal_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/data/type_literal_strong.dart
rename to tests/compiler/dart2js/rti/data/type_literal_generic.dart
diff --git a/tests/compiler/dart2js/rti/emission/call_strong.dart b/tests/compiler/dart2js/rti/emission/call.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/call_strong.dart
rename to tests/compiler/dart2js/rti/emission/call.dart
diff --git a/tests/compiler/dart2js/rti/emission/call_typed_strong.dart b/tests/compiler/dart2js/rti/emission/call_typed.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/call_typed_strong.dart
rename to tests/compiler/dart2js/rti/emission/call_typed.dart
diff --git a/tests/compiler/dart2js/rti/emission/call_typed_generic_strong.dart b/tests/compiler/dart2js/rti/emission/call_typed_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/call_typed_generic_strong.dart
rename to tests/compiler/dart2js/rti/emission/call_typed_generic.dart
diff --git a/tests/compiler/dart2js/rti/emission/closure_function_type.dart b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
index 56d1d56..aed5de1 100644
--- a/tests/compiler/dart2js/rti/emission/closure_function_type.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_function_type.dart
@@ -8,7 +8,7 @@
 test(o) => o is Function();
 
 main() {
-  test(/*checks=[],functionType,instance*/ () {});
+  test(/*checks=[$signature],instance*/ () {});
   test(
 
       /*strong.checks=[],instance*/
diff --git a/tests/compiler/dart2js/rti/emission/closure_signature.dart b/tests/compiler/dart2js/rti/emission/closure_signature.dart
index b1250b0..aedf5f6 100644
--- a/tests/compiler/dart2js/rti/emission/closure_signature.dart
+++ b/tests/compiler/dart2js/rti/emission/closure_signature.dart
@@ -13,7 +13,7 @@
 
   @NoInline()
   f() {
-    return /*checks=[],functionType,instance*/ (int t) {};
+    return /*checks=[$signature],instance*/ (int t) {};
   }
 }
 
diff --git a/tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart b/tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/constructor_argument_static_strong.dart
rename to tests/compiler/dart2js/rti/emission/constructor_argument_static.dart
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_instance_strong.dart b/tests/compiler/dart2js/rti/emission/dynamic_instance.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/dynamic_instance_strong.dart
rename to tests/compiler/dart2js/rti/emission/dynamic_instance.dart
diff --git a/tests/compiler/dart2js/rti/emission/dynamic_type_argument_strong.dart b/tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/dynamic_type_argument_strong.dart
rename to tests/compiler/dart2js/rti/emission/dynamic_type_argument.dart
diff --git a/tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart b/tests/compiler/dart2js/rti/emission/function_type_argument.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/function_type_argument_strong.dart
rename to tests/compiler/dart2js/rti/emission/function_type_argument.dart
diff --git a/tests/compiler/dart2js/rti/emission/future_or_strong.dart b/tests/compiler/dart2js/rti/emission/future_or.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/future_or_strong.dart
rename to tests/compiler/dart2js/rti/emission/future_or.dart
diff --git a/tests/compiler/dart2js/rti/emission/future_or_as_type_argument_strong.dart b/tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/future_or_as_type_argument_strong.dart
rename to tests/compiler/dart2js/rti/emission/future_or_as_type_argument.dart
diff --git a/tests/compiler/dart2js/rti/emission/future_or_future_or_strong.dart b/tests/compiler/dart2js/rti/emission/future_or_future_or.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/future_or_future_or_strong.dart
rename to tests/compiler/dart2js/rti/emission/future_or_future_or.dart
diff --git a/tests/compiler/dart2js/rti/emission/future_or_future_or_generic_strong.dart b/tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/future_or_future_or_generic_strong.dart
rename to tests/compiler/dart2js/rti/emission/future_or_future_or_generic.dart
diff --git a/tests/compiler/dart2js/rti/emission/future_or_generic_strong.dart b/tests/compiler/dart2js/rti/emission/future_or_generic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/future_or_generic_strong.dart
rename to tests/compiler/dart2js/rti/emission/future_or_generic.dart
diff --git a/tests/compiler/dart2js/rti/emission/future_or_generic2_strong.dart b/tests/compiler/dart2js/rti/emission/future_or_generic2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/future_or_generic2_strong.dart
rename to tests/compiler/dart2js/rti/emission/future_or_generic2.dart
diff --git a/tests/compiler/dart2js/rti/emission/future_or_type_argument_strong.dart b/tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/future_or_type_argument_strong.dart
rename to tests/compiler/dart2js/rti/emission/future_or_type_argument.dart
diff --git a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart
rename to tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02.dart
diff --git a/tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart b/tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/local_function_list_literal_strong.dart
rename to tests/compiler/dart2js/rti/emission/local_function_list_literal.dart
diff --git a/tests/compiler/dart2js/rti/emission/local_function_map_literal_strong.dart b/tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/local_function_map_literal_strong.dart
rename to tests/compiler/dart2js/rti/emission/local_function_map_literal.dart
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart
new file mode 100644
index 0000000..dc43c4b
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  /*strong.checks=[$signature],instance*/
+  /*omit.checks=[],instance*/
+  T id<T>(T t) => t;
+  int Function(int) x = id;
+  print("${x.runtimeType}");
+}
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart
deleted file mode 100644
index 3123b79..0000000
--- a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string1_strong.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-main() {
-  /*strong.checks=[],functionType,instance*/
-  /*omit.checks=[],instance*/
-  T id<T>(T t) => t;
-  int Function(int) x = id;
-  print("${x.runtimeType}");
-}
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2_strong.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2_strong.dart
rename to tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string2.dart
diff --git a/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3_strong.dart b/tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3_strong.dart
rename to tests/compiler/dart2js/rti/emission/runtime_type_instantiate_to_string3.dart
diff --git a/tests/compiler/dart2js/rti/emission/static_argument_strong.dart b/tests/compiler/dart2js/rti/emission/static_argument.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/static_argument_strong.dart
rename to tests/compiler/dart2js/rti/emission/static_argument.dart
diff --git a/tests/compiler/dart2js/rti/emission/subtype_named_args.dart b/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
index 759210b..cb83d5e 100644
--- a/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
+++ b/tests/compiler/dart2js/rti/emission/subtype_named_args.dart
@@ -53,50 +53,50 @@
 
 main() {
   Expect.isTrue(
-      /*strong.checks=[],functionType,instance*/
+      /*strong.checks=[$signature],instance*/
       /*omit.checks=[],instance*/
       ({D a, B b, C c, A d}) {} is classesFunc);
   Expect.isTrue(
-      /*checks=[],functionType,instance*/
+      /*checks=[$signature],instance*/
       ({A a, A b, A c, A d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.checks=[],functionType,instance*/
+      /*strong.checks=[$signature],instance*/
       /*omit.checks=[],instance*/
       ({D a, A1 b, A1 c, A1 d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.checks=[],functionType,instance*/
+      /*strong.checks=[$signature],instance*/
       /*omit.checks=[],instance*/
       ({D a, A2 b, A2 c, A2 d}) {} is classesFunc);
   Expect.isTrue(
-      /*strong.checks=[],functionType,instance*/
+      /*strong.checks=[$signature],instance*/
       /*omit.checks=[],instance*/
       ({D a, D b, D c, D d}) {} is classesFunc);
   Expect.isTrue(
-      /*checks=[],functionType,instance*/
+      /*checks=[$signature],instance*/
       ({var a, var b, var c, var d}) {} is classesFunc);
-  Expect.isTrue(/*checks=[],functionType,instance*/
+  Expect.isTrue(/*checks=[$signature],instance*/
       ({Object a, Object b, Object c, Object d}) {} is classesFunc);
 
-  Expect.isTrue(/*checks=[],functionType,instance*/
+  Expect.isTrue(/*checks=[$signature],instance*/
       ({Map<num, num> m, List<List<A1>> l, G<A, A1, A1, A1> g}) {}
           is genericsFunc);
   Expect.isTrue(
-      /*strong.checks=[],functionType,instance*/
+      /*strong.checks=[$signature],instance*/
       /*omit.checks=[],instance*/
       ({Map<int, int> m, List<List<D>> l, G<D, D, D, D> g}) {} is genericsFunc);
   Expect.isTrue(
-      /*checks=[],functionType,instance*/
+      /*checks=[$signature],instance*/
       ({var m, var l, var g}) {} is genericsFunc);
   Expect.isTrue(
-      /*checks=[],functionType,instance*/
+      /*checks=[$signature],instance*/
       ({Object m, Object l, Object g}) {} is genericsFunc);
 
   Expect.isTrue(
-      /*strong.checks=[],functionType,instance*/
+      /*strong.checks=[$signature],instance*/
       /*omit.checks=[],instance*/
       ({A x, G y, mixFunc z, var v}) {} is dynamicFunc);
   Expect.isTrue(
-      /*strong.checks=[],functionType,instance*/
+      /*strong.checks=[$signature],instance*/
       /*omit.checks=[],instance*/
       ({int x, bool y, List<Map> z, classesFunc v}) {} is dynamicFunc);
 
@@ -106,7 +106,7 @@
           {okWithClassesFunc_1 f1,
           okWithGenericsFunc_1 f2,
           okWithDynamicFunc_1 f3}) {} is funcFunc);
-  Expect.isTrue(/*checks=[],functionType,instance*/
+  Expect.isTrue(/*checks=[$signature],instance*/
       (
           {okWithClassesFunc_2 f1,
           okWithGenericsFunc_2 f2,
diff --git a/tests/compiler/dart2js/rti/emission/type_argument_dynamic_strong.dart b/tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/type_argument_dynamic_strong.dart
rename to tests/compiler/dart2js/rti/emission/type_argument_dynamic.dart
diff --git a/tests/compiler/dart2js/rti/emission/type_argument_static_strong.dart b/tests/compiler/dart2js/rti/emission/type_argument_static.dart
similarity index 100%
rename from tests/compiler/dart2js/rti/emission/type_argument_static_strong.dart
rename to tests/compiler/dart2js/rti/emission/type_argument_static.dart
diff --git a/tests/compiler/dart2js/rti/rti_emission_test.dart b/tests/compiler/dart2js/rti/rti_emission_test.dart
index 5662705..5b7e145 100644
--- a/tests/compiler/dart2js/rti/rti_emission_test.dart
+++ b/tests/compiler/dart2js/rti/rti_emission_test.dart
@@ -13,7 +13,8 @@
 import 'package:compiler/src/js_backend/runtime_types.dart';
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:compiler/src/js_model/element_map.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
+import 'package:compiler/src/util/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -23,8 +24,7 @@
   asyncTest(() async {
     Directory dataDir =
         new Directory.fromUri(Platform.script.resolve('emission'));
-    await checkTests(dataDir, const RtiEmissionDataComputer(),
-        args: args, testOmit: true);
+    await checkTests(dataDir, const RtiEmissionDataComputer(), args: args);
   });
 }
 
@@ -91,15 +91,15 @@
   }
 }
 
-class RtiEmissionDataComputer extends DataComputer {
+class RtiEmissionDataComputer extends DataComputer<String> {
   const RtiEmissionDataComputer();
 
   @override
   bool get computesClassData => true;
 
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -111,19 +111,23 @@
 
   @override
   void computeClassData(
-      Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+      Compiler compiler, ClassEntity cls, Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
     new RtiClassEmissionIrComputer(compiler, elementMap, actualMap)
         .computeClassValue(cls);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
-class RtiClassEmissionIrComputer extends DataRegistry with ComputeValueMixin {
+class RtiClassEmissionIrComputer extends DataRegistry<String>
+    with ComputeValueMixin {
   final Compiler compiler;
   final JsToElementMap _elementMap;
-  final Map<Id, ActualData> actualMap;
+  final Map<Id, ActualData<String>> actualMap;
 
   RtiClassEmissionIrComputer(this.compiler, this._elementMap, this.actualMap);
 
@@ -137,7 +141,7 @@
   }
 }
 
-class RtiMemberEmissionIrComputer extends IrDataExtractor
+class RtiMemberEmissionIrComputer extends IrDataExtractor<String>
     with ComputeValueMixin {
   final JsToElementMap _elementMap;
   final ClosureData _closureDataLookup;
@@ -145,7 +149,7 @@
 
   RtiMemberEmissionIrComputer(
       DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
+      Map<Id, ActualData<String>> actualMap,
       this._elementMap,
       MemberEntity member,
       this.compiler,
diff --git a/tests/compiler/dart2js/rti/rti_need_test_helper.dart b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
index aa6668b..f601ebc 100644
--- a/tests/compiler/dart2js/rti/rti_need_test_helper.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
@@ -13,13 +13,14 @@
 import 'package:compiler/src/elements/types.dart';
 import 'package:compiler/src/ir/util.dart';
 import 'package:compiler/src/js_backend/runtime_types.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/kernel/element_map.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:compiler/src/universe/feature.dart';
+import 'package:compiler/src/universe/resolution_world_builder.dart';
 import 'package:compiler/src/universe/selector.dart';
-import 'package:compiler/src/universe/world_builder.dart';
+import 'package:compiler/src/util/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/check_helpers.dart';
 import '../equivalence/id_equivalence.dart';
@@ -35,7 +36,6 @@
     await checkTests(dataDir, const RtiNeedDataComputer(),
         options: [],
         args: args,
-        testOmit: true,
         shardIndex: shardIndex ?? 0,
         shards: shardIndex != null ? 2 : 1);
   });
@@ -230,7 +230,7 @@
   }
 }
 
-class RtiNeedDataComputer extends DataComputer {
+class RtiNeedDataComputer extends DataComputer<String> {
   const RtiNeedDataComputer();
 
   @override
@@ -240,8 +240,8 @@
   ///
   /// Fills [actualMap] with the data.
   @override
-  void computeMemberData(
-      Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
@@ -256,13 +256,16 @@
   /// Fills [actualMap] with the data.
   @override
   void computeClassData(
-      Compiler compiler, ClassEntity cls, Map<Id, ActualData> actualMap,
+      Compiler compiler, ClassEntity cls, Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
     new RtiClassNeedIrComputer(compiler, elementMap, actualMap)
         .computeClassValue(cls);
   }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
 abstract class IrMixin implements ComputeValueMixin {
@@ -313,11 +316,11 @@
   }
 }
 
-class RtiClassNeedIrComputer extends DataRegistry
+class RtiClassNeedIrComputer extends DataRegistry<String>
     with ComputeValueMixin, IrMixin {
   final Compiler compiler;
   final JsToElementMap _elementMap;
-  final Map<Id, ActualData> actualMap;
+  final Map<Id, ActualData<String>> actualMap;
 
   RtiClassNeedIrComputer(this.compiler, this._elementMap, this.actualMap);
 
@@ -332,7 +335,7 @@
 }
 
 /// AST visitor for computing inference data for a member.
-class RtiMemberNeedIrComputer extends IrDataExtractor
+class RtiMemberNeedIrComputer extends IrDataExtractor<String>
     with ComputeValueMixin, IrMixin {
   final JsToElementMap _elementMap;
   final ClosureData _closureDataLookup;
@@ -340,7 +343,7 @@
 
   RtiMemberNeedIrComputer(
       DiagnosticReporter reporter,
-      Map<Id, ActualData> actualMap,
+      Map<Id, ActualData<String>> actualMap,
       this._elementMap,
       MemberEntity member,
       this.compiler,
diff --git a/tests/compiler/dart2js/serialization/data/constructor_name.dart b/tests/compiler/dart2js/serialization/data/constructor_name.dart
new file mode 100644
index 0000000..dc1e3b2
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/constructor_name.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class1 {
+  var foo;
+  Class1.foo();
+}
+
+// TODO(johnniwinther): Uncomment this when #34965 is fixed:
+//class Class2 {
+//  var bar;
+//  factory Class2.bar() => null;
+//}
+
+main() {
+  new Class1.foo().foo;
+  //new Class2.bar().bar;
+}
diff --git a/tests/compiler/dart2js/serialization/data/continue.dart b/tests/compiler/dart2js/serialization/data/continue.dart
new file mode 100644
index 0000000..5d8c3ec
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/continue.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  continueInClosure();
+}
+
+void continueInClosure() {
+  () {
+    do {
+      continue;
+    } while (false);
+  }();
+}
diff --git a/tests/compiler/dart2js/serialization/data/custom_types.dart b/tests/compiler/dart2js/serialization/data/custom_types.dart
new file mode 100644
index 0000000..a301473
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/custom_types.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  method() {
+    Object c = this;
+    return c;
+  }
+}
+
+main() {
+  exactInterfaceType();
+  thisInterfaceType();
+  doesNotCompleteType();
+}
+
+exactInterfaceType() {
+  Object c = new A();
+  return c;
+}
+
+thisInterfaceType() {
+  new A().method();
+}
+
+doesNotCompleteType() {
+  Object c = throw '';
+  // ignore: dead_code
+  return c;
+}
diff --git a/tests/compiler/dart2js/serialization/data/deferred.dart b/tests/compiler/dart2js/serialization/data/deferred.dart
new file mode 100644
index 0000000..b0ea93c
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/deferred.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../libs/deferred_lib1.dart';
+import '../libs/deferred_lib2.dart' deferred as lib2;
+
+main() async {
+  C1.value;
+  print(const C(4));
+  () => print(const C(5));
+  await lib2.loadLibrary();
+  lib2.C2;
+  lib2.C3;
+  lib2.C4;
+  lib2.C5;
+  lib2.C6;
+  lib2.C7.value;
+}
diff --git a/tests/compiler/dart2js/serialization/data/jsinterop.dart b/tests/compiler/dart2js/serialization/data/jsinterop.dart
new file mode 100644
index 0000000..6996587
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/jsinterop.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+@JS()
+library lib;
+
+import 'package:js/js.dart';
+import 'package:meta/dart2js.dart';
+
+@JS()
+@anonymous
+class GenericClass<T> {
+  external factory GenericClass();
+
+  external set setter(value);
+}
+
+main() {
+  method();
+}
+
+@tryInline
+method() {
+  new GenericClass().setter = 42;
+}
diff --git a/tests/compiler/dart2js/serialization/data/labels.dart b/tests/compiler/dart2js/serialization/data/labels.dart
new file mode 100644
index 0000000..4ba9f05
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/labels.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  label:
+  {
+    break label;
+  }
+}
diff --git a/tests/compiler/dart2js/serialization/data/maps.dart b/tests/compiler/dart2js/serialization/data/maps.dart
new file mode 100644
index 0000000..ca45d28
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/maps.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  createMap();
+  createDictionary();
+  returnUnion(true);
+  returnUnion(false);
+}
+
+createMap() => {0: 1};
+
+createDictionary() => {'foo': 'bar'};
+
+returnUnion(bool b) => b ? createMap() : createDictionary();
diff --git a/tests/compiler/dart2js/serialization/data/switch.dart b/tests/compiler/dart2js/serialization/data/switch.dart
new file mode 100644
index 0000000..fc9bc83
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/switch.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  switchCaseWithContinue(null);
+}
+
+switchCaseWithContinue(e) {
+  switch (e) {
+    label:
+    case 0:
+      break;
+    case 1:
+      continue label;
+  }
+}
diff --git a/tests/compiler/dart2js/serialization/data/typedef.dart b/tests/compiler/dart2js/serialization/data/typedef.dart
new file mode 100644
index 0000000..01d991b
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/data/typedef.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  c;
+}
+
+typedef Typedef();
+
+const c = Typedef;
diff --git a/tests/compiler/dart2js/serialization/in_memory_split_test.dart b/tests/compiler/dart2js/serialization/in_memory_split_test.dart
new file mode 100644
index 0000000..33a7912
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/in_memory_split_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:args/args.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/serialization/strategies.dart';
+import 'serialization_test_helper.dart';
+import '../helpers/args_helper.dart';
+
+main(List<String> args) {
+  ArgParser argParser = createArgParser();
+  argParser.addFlag('debug', abbr: 'd', defaultsTo: false);
+  argParser.addFlag('object', abbr: 'o', defaultsTo: false);
+  argParser.addFlag('kinds', abbr: 'k', defaultsTo: false);
+
+  asyncTest(() async {
+    ArgResults argResults = argParser.parse(args);
+    bool useDataKinds = argResults['kinds'] || argResults['debug'];
+    SerializationStrategy strategy =
+        new BytesInMemorySerializationStrategy(useDataKinds: useDataKinds);
+    if (argResults['object'] || argResults['debug']) {
+      strategy =
+          new ObjectsInMemorySerializationStrategy(useDataKinds: useDataKinds);
+    }
+
+    Uri entryPoint = getEntryPoint(argResults) ??
+        Uri.base.resolve('samples-dev/swarm/swarm.dart');
+    Uri librariesSpecificationUri = getLibrariesSpec(argResults);
+    Uri packageConfig = getPackages(argResults);
+    List<String> options = getOptions(argResults);
+    await runTest(
+        entryPoint: entryPoint,
+        packageConfig: packageConfig,
+        librariesSpecificationUri: librariesSpecificationUri,
+        options: options,
+        strategy: strategy,
+        useDataKinds: useDataKinds);
+  });
+}
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart
new file mode 100644
index 0000000..361b0fd
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/libs/deferred_lib1.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library deferred_constants1_lib1;
+
+export 'deferred_lib3.dart' show C, C1;
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart
new file mode 100644
index 0000000..379239d
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/libs/deferred_lib2.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library deferred_constants1_lib2;
+
+export 'deferred_lib3.dart' show C2, C3, C4, C5, C6, C7;
diff --git a/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart b/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart
new file mode 100644
index 0000000..708a79a
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/libs/deferred_lib3.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library deferred_constants1_lib3;
+
+import 'dart:async';
+
+class C {
+  final value;
+
+  const C(this.value);
+}
+
+FutureOr<T> func<T>(@Deprecated('bar') foo) => null;
+
+/// ---------------------------------------------------------------------------
+/// Constant used from main: not deferred.
+/// ---------------------------------------------------------------------------
+
+const C1 = const C(1);
+
+/// ---------------------------------------------------------------------------
+/// Constant completely deferred.
+/// ---------------------------------------------------------------------------
+
+const C2 = C;
+
+/// ---------------------------------------------------------------------------
+/// Constant fields not used from main, but the constant value are: so the field
+/// and the constants are in different output units.
+/// ---------------------------------------------------------------------------
+
+const C3 = func;
+
+const C4 = const [1, 1.5, bool];
+
+/// ---------------------------------------------------------------------------
+/// Constant value used form a closure within main.
+/// ---------------------------------------------------------------------------
+
+const C5 = const {};
+
+/// ---------------------------------------------------------------------------
+/// Deferred constants, used after a deferred load.
+/// ---------------------------------------------------------------------------
+
+const FutureOr<int> Function(dynamic) C6 = func;
+
+const C7 = null;
diff --git a/tests/compiler/dart2js/serialization/on_disk_split_test.dart b/tests/compiler/dart2js/serialization/on_disk_split_test.dart
new file mode 100644
index 0000000..163efa5
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/on_disk_split_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/dart2js.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dir = await Directory.systemTemp.createTemp('on_disk');
+    Uri dillUri = dir.uri.resolve('out.dill');
+    Uri outUri = dir.uri.resolve('out.js');
+    await internalMain([
+      'samples-dev/swarm/swarm.dart',
+      '--out=${dillUri}',
+      Flags.writeData,
+      Flags.verbose,
+    ]);
+    await internalMain([
+      '${dillUri}',
+      '--out=${outUri}',
+      Flags.readData,
+      Flags.verbose,
+    ]);
+    await dir.delete(recursive: true);
+  });
+}
diff --git a/tests/compiler/dart2js/serialization/serialization_test.dart b/tests/compiler/dart2js/serialization/serialization_test.dart
new file mode 100644
index 0000000..6c5a1cb
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/serialization_test.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/serialization/strategies.dart';
+import 'package:expect/expect.dart';
+import 'serialization_test_helper.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+    Directory libDir = new Directory.fromUri(Platform.script.resolve('libs'));
+    await checkTests(dataDir, options: [], args: args, libDirectory: libDir);
+  });
+}
+
+Future checkTests(Directory dataDir,
+    {bool testStrongMode: true,
+    List<String> options: const <String>[],
+    List<String> args: const <String>[],
+    Directory libDirectory: null,
+    bool forUserLibrariesOnly: true,
+    int shards: 1,
+    int shardIndex: 0,
+    void onTest(Uri uri)}) async {
+  args = args.toList();
+  bool shouldContinue = args.remove('-c');
+  bool continued = false;
+  bool hasFailures = false;
+  SerializationStrategy strategy = const BytesInMemorySerializationStrategy();
+  if (args.remove('-d')) {
+    strategy = const ObjectsInMemorySerializationStrategy();
+  }
+
+  var relativeDir = dataDir.uri.path.replaceAll(Uri.base.path, '');
+  print('Data dir: ${relativeDir}');
+  List<FileSystemEntity> entities = dataDir.listSync();
+  if (shards > 1) {
+    int start = entities.length * shardIndex ~/ shards;
+    int end = entities.length * (shardIndex + 1) ~/ shards;
+    entities = entities.sublist(start, end);
+  }
+  int testCount = 0;
+  for (FileSystemEntity entity in entities) {
+    String name = entity.uri.pathSegments.last;
+    if (args.isNotEmpty && !args.contains(name) && !continued) continue;
+    if (shouldContinue) continued = true;
+    testCount++;
+    List<String> testOptions = options.toList();
+    testOptions.add(Flags.dumpInfo);
+    testOptions.add('--out=out.js');
+    if (onTest != null) {
+      onTest(entity.uri);
+    }
+    print('----------------------------------------------------------------');
+    print('Test file: ${entity.uri}');
+    // Pretend this is a dart2js_native test to allow use of 'native' keyword
+    // and import of private libraries.
+    String commonTestPath = 'sdk/tests/compiler';
+    Uri entryPoint =
+        Uri.parse('memory:$commonTestPath/dart2js_native/main.dart');
+    String mainCode = await new File.fromUri(entity.uri).readAsString();
+    Map<String, String> memorySourceFiles = {entryPoint.path: mainCode};
+
+    if (libDirectory != null) {
+      print('Supporting libraries:');
+      String filePrefix = name.substring(0, name.lastIndexOf('.'));
+      await for (FileSystemEntity libEntity in libDirectory.list()) {
+        String libFileName = libEntity.uri.pathSegments.last;
+        if (libFileName.startsWith(filePrefix)) {
+          print('    - libs/$libFileName');
+          Uri libFileUri =
+              Uri.parse('memory:$commonTestPath/libs/$libFileName');
+          String libCode = await new File.fromUri(libEntity.uri).readAsString();
+          memorySourceFiles[libFileUri.path] = libCode;
+        }
+      }
+    }
+
+    await runTest(
+        entryPoint: entryPoint,
+        memorySourceFiles: memorySourceFiles,
+        options: testOptions,
+        strategy: strategy);
+  }
+  Expect.isFalse(hasFailures, 'Errors found.');
+  Expect.isTrue(testCount > 0, "No files were tested.");
+}
diff --git a/tests/compiler/dart2js/serialization/serialization_test_helper.dart b/tests/compiler/dart2js/serialization/serialization_test_helper.dart
new file mode 100644
index 0000000..9f48d01
--- /dev/null
+++ b/tests/compiler/dart2js/serialization/serialization_test_helper.dart
@@ -0,0 +1,138 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:compiler/compiler_new.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/inferrer/types.dart';
+import 'package:compiler/src/serialization/strategies.dart';
+import 'package:expect/expect.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../helpers/memory_compiler.dart';
+import '../helpers/text_helpers.dart';
+
+/// Entries in dump info that naturally differ between compilations.
+const List<String> dumpInfoExceptions = [
+  '"compilationMoment":',
+  '"compilationDuration":',
+  '"toJsonDuration":'
+];
+
+runTest(
+    {Uri entryPoint,
+    Map<String, String> memorySourceFiles: const <String, String>{},
+    Uri packageConfig,
+    Uri librariesSpecificationUri,
+    List<String> options,
+    SerializationStrategy strategy: const BytesInMemorySerializationStrategy(),
+    bool useDataKinds: false}) async {
+  OutputCollector collector1 = new OutputCollector();
+  CompilationResult result1 = await runCompiler(
+      entryPoint: entryPoint,
+      memorySourceFiles: memorySourceFiles,
+      packageConfig: packageConfig,
+      librariesSpecificationUri: librariesSpecificationUri,
+      options: options,
+      outputProvider: collector1,
+      beforeRun: (Compiler compiler) {
+        compiler.kernelLoader.forceSerialization = true;
+      });
+  Expect.isTrue(result1.isSuccess);
+
+  OutputCollector collector2 = new OutputCollector();
+  CompilationResult result = await runCompiler(
+      entryPoint: entryPoint,
+      memorySourceFiles: memorySourceFiles,
+      packageConfig: packageConfig,
+      librariesSpecificationUri: librariesSpecificationUri,
+      options: options,
+      outputProvider: collector2,
+      beforeRun: (Compiler compiler) {
+        compiler.kernelLoader.forceSerialization = true;
+        compiler.stopAfterTypeInference = true;
+      });
+  Expect.isTrue(result.isSuccess);
+  Compiler compiler = result.compiler;
+  GlobalTypeInferenceResults globalInferenceResults =
+      compiler.globalInference.resultsForTesting;
+  GlobalTypeInferenceResults newGlobalInferenceResults =
+      cloneInferenceResults(compiler, globalInferenceResults, strategy);
+
+  Map<OutputType, Map<String, String>> output = collector1.clear();
+
+  compiler.generateJavaScriptCode(newGlobalInferenceResults);
+  Map<OutputType, Map<String, String>> newOutput = collector2.clear();
+
+  Expect.setEquals(output.keys, newOutput.keys, "Output type mismatch.");
+
+  output.forEach((OutputType outputType, Map<String, String> fileMap) {
+    Map<String, String> newFileMap = newOutput[outputType];
+    Expect.setEquals(fileMap.keys, newFileMap.keys,
+        "File mismatch for output type $outputType.");
+    fileMap.forEach((String fileName, String code) {
+      String newCode = newFileMap[fileName];
+      bool Function(int, List<String>, List<String>) filter;
+      if (outputType == OutputType.dumpInfo) {
+        filter = (int index, List<String> lines1, List<String> lines2) {
+          if (index <= lines1.length && index <= lines2.length) {
+            String line1 = lines1[index];
+            String line2 = lines2[index];
+            for (String exception in dumpInfoExceptions) {
+              if (line1.trim().startsWith(exception) &&
+                  line2.trim().startsWith(exception)) {
+                return true;
+              }
+            }
+          }
+          return false;
+        };
+      }
+      int failureLine =
+          checkEqualContentAndShowDiff(code, newCode, filter: filter);
+      Expect.isNull(
+          failureLine,
+          "Output mismatch at line $failureLine in "
+          "file '${fileName}' of type ${outputType}.");
+    });
+  });
+}
+
+GlobalTypeInferenceResults cloneInferenceResults(Compiler compiler,
+    GlobalTypeInferenceResults results, SerializationStrategy strategy) {
+  List<int> irData = strategy.serializeComponent(results);
+
+  List worldData = strategy.serializeData(results);
+  print('data size: ${worldData.length}');
+
+  ir.Component newComponent = strategy.deserializeComponent(irData);
+  GlobalTypeInferenceResults newResults = strategy.deserializeData(
+      compiler.options,
+      compiler.reporter,
+      compiler.environment,
+      compiler.abstractValueStrategy,
+      newComponent,
+      worldData);
+  List newWorldData = strategy.serializeData(newResults);
+  Expect.equals(worldData.length, newWorldData.length,
+      "Reserialization data length mismatch.");
+  for (int i = 0; i < worldData.length; i++) {
+    if (worldData[i] != newWorldData[i]) {
+      print('Reserialization data mismatch at offset $i:');
+      for (int j = i - 50; j < i + 50; j++) {
+        if (0 <= j && j <= worldData.length) {
+          String text;
+          if (worldData[j] == newWorldData[j]) {
+            text = '${worldData[j]}';
+          } else {
+            text = '${worldData[j]} <> ${newWorldData[j]}';
+          }
+          print('${j == i ? '> ' : '  '}$j: $text');
+        }
+      }
+      break;
+    }
+  }
+  Expect.listEquals(worldData, newWorldData);
+
+  return newResults;
+}
diff --git a/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart b/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart
index f724936..36ab917 100644
--- a/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/d2js_validity_test.dart
@@ -20,7 +20,7 @@
         Future<CompilationResult> result = entry.internalMain([
           mainFile,
           '-o${tmpDir.path}/out.js',
-          '--library-root=sdk',
+          '--libraries-spec=sdk/lib/libraries.json',
         ]);
         return result.then((CompilationResult result) {
           CompilerImpl compiler = result.compiler;
diff --git a/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart b/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart
index 321719b..12d983d 100644
--- a/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/deferred_d2js_validity_test.dart
@@ -19,7 +19,7 @@
         var result = entry.internalMain([
           file,
           '-o${tmpDir.path}/out.js',
-          '--library-root=sdk',
+          '--libraries-spec=sdk/lib/libraries.json',
         ]);
         return result.then((CompilationResult result) {
           CompilerImpl compiler = result.compiler;
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart b/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
index aacf1c6..bc504c76 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/js_tracer.dart
@@ -53,6 +53,7 @@
             CallPosition.getSemanticPositionForCall(node);
         sourcePositionKind = callPosition.sourcePositionKind;
         break;
+      case StepKind.ACCESS:
       case StepKind.NEW:
       case StepKind.RETURN:
       case StepKind.BREAK:
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
index e17247a..8826468 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
@@ -64,6 +64,10 @@
   OutputSink createOutputSink(String name, String extension, OutputType type) {
     return createSourceFileSink(name, extension, type);
   }
+
+  @override
+  BinaryOutputSink createBinarySink(Uri uri) =>
+      throw new UnsupportedError("OutputProvider.createBinarySink");
 }
 
 class CloningOutputProvider extends OutputProvider {
@@ -78,6 +82,10 @@
     return new CloningOutputSink(
         [output, createSourceFileSink(name, extension, type)]);
   }
+
+  @override
+  BinaryOutputSink createBinarySink(Uri uri) =>
+      throw new UnsupportedError("CloningOutputProvider.createBinarySink");
 }
 
 abstract class SourceFileManager {
@@ -515,6 +523,7 @@
   /// Called when [node] defines a step of the given [kind] at the given
   /// [offset] when the generated JavaScript code.
   void onStep(js.Node node, Offset offset, StepKind kind) {
+    if (kind == StepKind.ACCESS) return;
     register(kind, node);
   }
 
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
new file mode 100644
index 0000000..f28344a
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method3.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Error pattern: NoSuchMethodError: method not found: '([^']*)' .*
+// Kind of minified name: instance
+// Expected deobfuscated name: g1
+
+import 'package:expect/expect.dart';
+
+main() {
+  try {
+    confuse(new A());
+    dynamic x = confuse(new B());
+    x.g1;
+  } catch (e) {
+    throw e;
+  }
+}
+
+@AssumeDynamic()
+@NoInline()
+confuse(x) => x;
+
+class A {
+  int get g1 => 0;
+}
+
+class B {}
diff --git a/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart b/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
new file mode 100644
index 0000000..a8949f0
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/minified/no_such_method4.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Error pattern: NoSuchMethodError: method not found: '([^']*)' .*
+// Kind of minified name: instance
+// Expected deobfuscated name: g1=
+
+import 'package:expect/expect.dart';
+
+main() {
+  try {
+    confuse(new A());
+    dynamic x = confuse(new B());
+    x.g1 = 0;
+  } catch (e) {
+    throw e;
+  }
+}
+
+@AssumeDynamic()
+@NoInline()
+confuse(x) => x;
+
+class A {
+  set g1(int x) {}
+}
+
+class B {}
diff --git a/tests/compiler/dart2js/sourcemaps/name_test.dart b/tests/compiler/dart2js/sourcemaps/name_test.dart
index f6648d8..b6ecce8 100644
--- a/tests/compiler/dart2js/sourcemaps/name_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/name_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/io/kernel_source_information.dart';
-import 'package:compiler/src/js_model/js_strategy.dart';
+import 'package:compiler/src/js_model/js_world.dart';
 import '../helpers/memory_compiler.dart';
 
 const String SOURCE = '''
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart
new file mode 100644
index 0000000..ea1874b
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/getter_inlining.dart
@@ -0,0 +1,16 @@
+class MyClass {
+  int fieldName;
+
+  MyClass(this.fieldName);
+
+  int get getterName => /*1:getterName(inlined)*/ fieldName;
+}
+
+@pragma('dart2js:noInline')
+confuse(x) => x;
+
+main() {
+  confuse(new MyClass(3));
+  var m = confuse(null);
+  m. /*0:main*/ getterName;
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart
new file mode 100644
index 0000000..9b5ab60
--- /dev/null
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/setter_inlining.dart
@@ -0,0 +1,16 @@
+class MyClass {
+  int fieldName;
+
+  MyClass(this.fieldName);
+
+  set setterName(int v) => /*1:setterName(inlined)*/ fieldName = v;
+}
+
+@pragma('dart2js:noInline')
+confuse(x) => x;
+
+main() {
+  confuse(new MyClass(3));
+  var m = confuse(null);
+  m. /*0:main*/ setterName = 2;
+}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
index deebbc3..5d4d3b7 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace_test.dart
@@ -81,7 +81,7 @@
   return testStackTrace(test, config, (String input, String output) async {
     List<String> arguments = [
       '-o$output',
-      '--library-root=sdk',
+      '--libraries-spec=sdk/lib/libraries.json',
       '--packages=${Platform.packageConfig}',
       input,
     ]..addAll(options);
diff --git a/tests/compiler/dart2js/static_type/data/assert.dart b/tests/compiler/dart2js/static_type/data/assert.dart
new file mode 100644
index 0000000..0f0057e
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/assert.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+main() {
+  assert1(null);
+  assert2(null);
+  assert3(null);
+  assert4(null);
+  assert5(null);
+  assert6(null);
+  assert7(null);
+  assert8(null);
+}
+
+assert1(Class c) {
+  assert(/*Class*/ c /*invoke: bool*/ != null);
+  /*Class*/ c.next;
+}
+
+assert2(Class c) {
+  assert(/*Class*/ c /*invoke: bool*/ == null);
+  /*Class*/ c.next;
+}
+
+assert3(Class c) {
+  bool b;
+  assert(/*Class*/ c /*invoke: bool*/ != null);
+  if (/*bool*/ b) return;
+  /*Class*/ c.next;
+}
+
+assert4(Class c) {
+  bool b;
+  assert(/*Class*/ c /*invoke: bool*/ == null);
+  if (/*bool*/ b) return;
+  /*Class*/ c.next;
+}
+
+assert5(dynamic c) {
+  assert(/*dynamic*/ c is Class);
+  /*dynamic*/ c.next;
+}
+
+assert6(dynamic c) {
+  assert(/*dynamic*/ c is! Class);
+  /*dynamic*/ c.next;
+}
+
+assert7(dynamic c) {
+  bool b;
+  assert(/*dynamic*/ c is Class);
+  if (/*bool*/ b) return;
+  /*dynamic*/ c.next;
+}
+
+assert8(dynamic c) {
+  bool b;
+  assert(/*dynamic*/ c is! Class);
+  if (/*bool*/ b) return;
+  /*dynamic*/ c.next;
+}
diff --git a/tests/compiler/dart2js/static_type/data/assert_ea.dart b/tests/compiler/dart2js/static_type/data/assert_ea.dart
new file mode 100644
index 0000000..9e6edbd
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/assert_ea.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+main() {
+  assert1(null);
+  assert2(null);
+  assert3(null);
+  assert4(null);
+  assert5(null);
+  assert6(null);
+  assert7(null);
+  assert8(null);
+}
+
+assert1(Class c) {
+  assert(/*Class*/ c /*invoke: bool*/ != null);
+  /*Class*/ c.next;
+}
+
+assert2(Class c) {
+  assert(/*Class*/ c /*invoke: bool*/ == null);
+  /*Null*/ c.next;
+}
+
+assert3(Class c) {
+  bool b;
+  assert(/*Class*/ c /*invoke: bool*/ != null);
+  if (/*bool*/ b) return;
+  /*Class*/ c.next;
+}
+
+assert4(Class c) {
+  bool b;
+  assert(/*Class*/ c /*invoke: bool*/ == null);
+  if (/*bool*/ b) return;
+  /*Null*/ c.next;
+}
+
+assert5(dynamic c) {
+  assert(/*dynamic*/ c is Class);
+  /*Class*/ c.next;
+}
+
+assert6(dynamic c) {
+  assert(/*dynamic*/ c is! Class);
+  /*dynamic*/ c.next;
+}
+
+assert7(dynamic c) {
+  bool b;
+  assert(/*dynamic*/ c is Class);
+  if (/*bool*/ b) return;
+  /*Class*/ c.next;
+}
+
+assert8(dynamic c) {
+  bool b;
+  assert(/*dynamic*/ c is! Class);
+  if (/*bool*/ b) return;
+  /*dynamic*/ c.next;
+}
diff --git a/tests/compiler/dart2js/static_type/data/closure.dart b/tests/compiler/dart2js/static_type/data/closure.dart
new file mode 100644
index 0000000..b8768de
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/closure.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+main() {
+  closure1(null);
+  closure2(null);
+  closure3(null);
+  closure4(null);
+  closure5(null);
+}
+
+closure1(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    local() {
+      /*dynamic*/ c.next;
+      if (/*dynamic*/ c is Class) {
+        /*Class*/ c.next;
+      }
+      c = 0;
+    }
+
+    /*dynamic*/ c.next;
+    /*invoke: Null*/ local();
+    /*dynamic*/ c.next;
+  }
+}
+
+closure2(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    local() {
+      /*Class*/ c.next;
+    }
+
+    /*Class*/ c.next;
+    /*invoke: Null*/ local();
+    /*Class*/ c.next;
+  }
+}
+
+closure3(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    local() {
+      /*dynamic*/ c.next;
+    }
+
+    c = 0;
+    /*dynamic*/ c.next;
+    /*invoke: Null*/ local();
+    /*dynamic*/ c.next;
+  }
+}
+
+closure4(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    local() {
+      /*dynamic*/ c.next;
+    }
+
+    /*dynamic*/ c.next;
+    /*invoke: Null*/ local();
+    /*dynamic*/ c.next;
+    c = 0;
+    /*dynamic*/ c.next;
+  }
+}
+
+closure5(dynamic c) {
+  /*dynamic*/ c.next;
+  local() {
+    /*dynamic*/ c.next;
+    if (/*dynamic*/ c is! Class) return;
+    /*Class*/ c.next;
+  }
+
+  /*dynamic*/ c.next;
+  /*invoke: Null*/ local();
+  /*dynamic*/ c.next;
+  c = 0;
+  /*dynamic*/ c.next;
+}
diff --git a/tests/compiler/dart2js/static_type/data/do.dart b/tests/compiler/dart2js/static_type/data/do.dart
new file mode 100644
index 0000000..205480d
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/do.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+main() {
+  do1(null);
+  do2(null);
+}
+
+do1(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    do {
+      /*dynamic*/ c.next;
+      if (/*dynamic*/ c is Class) {
+        /*Class*/ c.next;
+      }
+      c = 0;
+    } while (/*dynamic*/ c /*invoke: bool*/ != null);
+    /*dynamic*/ c.next;
+  }
+}
+
+do2(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    do {
+      /*Class*/ c.next;
+    } while (/*Class*/ c /*invoke: bool*/ != null);
+    /*Class*/ c.next;
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/data/effectively_final.dart b/tests/compiler/dart2js/static_type/data/effectively_final.dart
new file mode 100644
index 0000000..58bd022
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/effectively_final.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  effectivelyFinalList();
+  notEffectivelyFinalList();
+  effectivelyFinalPromoted();
+  effectivelyFinalPromotedInvalid();
+}
+
+effectivelyFinalList() {
+  dynamic c = [];
+  /*List<dynamic>*/ c. /*invoke: void*/ add(null);
+  /*List<dynamic>*/ c.length /*invoke: int*/ + 1;
+}
+
+notEffectivelyFinalList() {
+  dynamic c = [];
+  /*dynamic*/ c. /*invoke: dynamic*/ add(null);
+  /*dynamic*/ c.length /*invoke: dynamic*/ + 1;
+  c = null;
+}
+
+num _method1() => null;
+
+effectivelyFinalPromoted() {
+  dynamic c = _method1();
+  /*num*/ c /*invoke: num*/ + 0;
+  if (/*num*/ c is int) {
+    /*int*/ c /*invoke: int*/ + 1;
+  }
+}
+
+String _method2() => null;
+
+effectivelyFinalPromotedInvalid() {
+  dynamic c = _method2();
+  /*String*/ c /*invoke: String*/ + '';
+  if (/*String*/ c is int) {
+    /*int*/ c /*invoke: int*/ + 1;
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/data/for.dart b/tests/compiler/dart2js/static_type/data/for.dart
new file mode 100644
index 0000000..d755de9
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/for.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+main() {
+  for1(null);
+  for2(null);
+  for3(null);
+  for4(null);
+}
+
+for1(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    for (/*Class*/ c.next;
+        /*dynamic*/ c /*invoke: bool*/ != null;
+        /*dynamic*/ c.next) {
+      /*dynamic*/ c.next;
+      if (/*dynamic*/ c is Class) {
+        /*Class*/ c.next;
+      }
+      c = 0;
+    }
+    /*dynamic*/ c.next;
+  }
+}
+
+for2(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    for (/*Class*/ c.next;
+        /*Class*/ c /*invoke: bool*/ != null;
+        /*Class*/ c.next) {
+      /*Class*/ c.next;
+    }
+    /*Class*/ c.next;
+  }
+}
+
+for3(dynamic c) {
+  /*dynamic*/ c.next;
+  for (/*dynamic*/ c.next; /*dynamic*/ c is Class; /*dynamic*/ c.next) {
+    /*Class*/ c.next;
+    c = 0;
+    if (/*dynamic*/ c is Class) {
+      /*Class*/ c.next;
+    }
+  }
+  /*dynamic*/ c.next;
+}
+
+for4(dynamic c) {
+  /*dynamic*/ c.next;
+  for (/*dynamic*/ c.next; /*dynamic*/ c is Class; /*Class*/ c.next) {
+    /*Class*/ c.next;
+  }
+  /*dynamic*/ c.next;
+}
diff --git a/tests/compiler/dart2js/static_type/data/for_in.dart b/tests/compiler/dart2js/static_type/data/for_in.dart
new file mode 100644
index 0000000..3168538
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/for_in.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Iterable<Class> next;
+}
+
+main() {
+  forIn1(null);
+  forIn2(null);
+}
+
+forIn1(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    // ignore: unused_local_variable
+    for (var b in /*Class*/ c.next) {
+      /*dynamic*/ c.next;
+      if (/*dynamic*/ c is Class) {
+        /*Class*/ c.next;
+      }
+      c = 0;
+    }
+    /*dynamic*/ c.next;
+  }
+}
+
+forIn2(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    // ignore: unused_local_variable
+    for (var b in /*Class*/ c.next) {
+      /*Class*/ c.next;
+    }
+    /*Class*/ c.next;
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/data/generic_method.dart b/tests/compiler/dart2js/static_type/data/generic_method.dart
new file mode 100644
index 0000000..99a2f17
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/generic_method.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class1 {
+  T method<T>(T t) => t;
+}
+
+class Class2<T> {
+  @pragma('dart2js:noInline')
+  S method<S extends T>() => null;
+}
+
+main() {
+  genericMethod1(null);
+  genericMethod2(null);
+  genericMethod3();
+}
+
+genericMethod1(c) {
+  if (/*dynamic*/ c is Class1) {
+    /*Class1*/ c. /*invoke: String*/ method('').length;
+  }
+}
+
+genericMethod2(c) {
+  if (/*dynamic*/ c is! Class1) return;
+  /*Class1*/ c. /*invoke: dynamic*/ method('').length;
+}
+
+genericMethod3() {
+  dynamic c = new Class2<int>();
+  /*Class2<int>*/ c. /*invoke: int*/ method();
+}
diff --git a/tests/compiler/dart2js/static_type/data/if.dart b/tests/compiler/dart2js/static_type/data/if.dart
new file mode 100644
index 0000000..20c3f9b
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/if.dart
@@ -0,0 +1,91 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+main() {
+  if1(null, null);
+  if2(null, null);
+  if3(null, null);
+}
+
+if1(dynamic c1, dynamic c2) {
+  /*dynamic*/ c1.next;
+  /*dynamic*/ c2.next;
+  if (/*dynamic*/ c1 is Class) {
+    /*Class*/ c1.next;
+    /*dynamic*/ c2.next;
+    if (/*dynamic*/ c2 is Class) {
+      /*Class*/ c1.next;
+      /*Class*/ c2.next;
+    } else {
+      /*Class*/ c1.next;
+      /*dynamic*/ c2.next;
+    }
+  } else {
+    /*dynamic*/ c1.next;
+    /*dynamic*/ c2.next;
+    if (/*dynamic*/ c2 is Class) {
+      /*dynamic*/ c1.next;
+      /*Class*/ c2.next;
+    } else {
+      /*dynamic*/ c1.next;
+      /*dynamic*/ c2.next;
+    }
+  }
+}
+
+if2(Class c1, Class c2) {
+  /*Class*/ c1.next;
+  /*Class*/ c2.next;
+  if (/*Class*/ c1 is Class) {
+    /*Class*/ c1.next;
+    /*Class*/ c2.next;
+    if (/*Class*/ c2 is Class) {
+      /*Class*/ c1.next;
+      /*Class*/ c2.next;
+    } else {
+      /*Class*/ c1.next;
+      /*Null*/ c2.next;
+    }
+  } else {
+    /*Null*/ c1.next;
+    /*Class*/ c2.next;
+    if (/*Class*/ c2 is Class) {
+      /*Null*/ c1.next;
+      /*Class*/ c2.next;
+    } else {
+      /*Null*/ c1.next;
+      /*Null*/ c2.next;
+    }
+  }
+}
+
+if3(dynamic c1, dynamic c2) {
+  /*dynamic*/ c1.next;
+  /*dynamic*/ c2.next;
+  if (/*dynamic*/ c1 is! Class) {
+    /*dynamic*/ c1.next;
+    /*dynamic*/ c2.next;
+    if (/*dynamic*/ c2 is! Class) {
+      /*dynamic*/ c1.next;
+      /*dynamic*/ c2.next;
+    } else {
+      /*dynamic*/ c1.next;
+      /*Class*/ c2.next;
+    }
+  } else {
+    /*Class*/ c1.next;
+    /*dynamic*/ c2.next;
+    if (/*dynamic*/ c2 is! Class) {
+      /*Class*/ c1.next;
+      /*dynamic*/ c2.next;
+    } else {
+      /*Class*/ c1.next;
+      /*Class*/ c2.next;
+    }
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/data/null.dart b/tests/compiler/dart2js/static_type/data/null.dart
new file mode 100644
index 0000000..c0b9386
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/null.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+main() {
+  null1(null);
+  null2(null);
+  null3(null);
+  null4(null);
+  null5(null);
+  null6(null);
+  null7(null);
+  null8(null);
+}
+
+null1(dynamic c) {
+  /*dynamic*/ c.next;
+  /*dynamic*/ c /*invoke: bool*/ != null;
+  /*dynamic*/ c.next;
+}
+
+null2(dynamic c) {
+  /*dynamic*/ c.next;
+  /*dynamic*/ c /*invoke: bool*/ == null;
+  /*dynamic*/ c.next;
+}
+
+null3(dynamic c) {
+  if (/*dynamic*/ c /*invoke: bool*/ == null) return;
+  /*dynamic*/ c.next;
+}
+
+null4(dynamic c) {
+  if (/*dynamic*/ c /*invoke: bool*/ != null) return;
+  /*Null*/ c.next;
+}
+
+null5(dynamic c) {
+  if (/*dynamic*/ c /*invoke: bool*/ != null) {
+    /*dynamic*/ c.next;
+  }
+}
+
+null6(dynamic c) {
+  if (/*dynamic*/ c /*invoke: bool*/ == null) {
+    /*Null*/ c.next;
+  }
+}
+
+null7(dynamic c) {
+  while (/*dynamic*/ c /*invoke: bool*/ != null) {
+    /*dynamic*/ c.next;
+  }
+}
+
+null8(dynamic c) {
+  while (/*dynamic*/ c /*invoke: bool*/ == null) {
+    /*Null*/ c.next;
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/data/switch.dart b/tests/compiler/dart2js/static_type/data/switch.dart
new file mode 100644
index 0000000..7b88d11
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/switch.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+main() {
+  switch1(null);
+  switch2(null);
+  switch3(null);
+}
+
+switch1(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    switch (/*Class*/ c) {
+      label:
+      case 0:
+        /*dynamic*/ c.next;
+        break;
+      case 1:
+        /*dynamic*/ c.next;
+        if (/*dynamic*/ c is Class) {
+          /*Class*/ c.next;
+        }
+        c = 0;
+        continue label;
+    }
+    /*dynamic*/ c.next;
+  }
+}
+
+switch2(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    switch (/*Class*/ c) {
+      case 0:
+        /*Class*/ c.next;
+        break;
+      case 1:
+        /*Class*/ c.next;
+        c = 0;
+        break;
+    }
+    /*dynamic*/ c.next;
+  }
+}
+
+switch3(dynamic c) {
+  /*dynamic*/ c.next;
+  switch (/*dynamic*/ c) {
+    case 0:
+      if (/*dynamic*/ c is! Class) return;
+      /*Class*/ c.next;
+      break;
+    case 1:
+      /*dynamic*/ c.next;
+      break;
+  }
+  /*dynamic*/ c.next;
+}
diff --git a/tests/compiler/dart2js/static_type/data/try_catch.dart b/tests/compiler/dart2js/static_type/data/try_catch.dart
new file mode 100644
index 0000000..b4680d7
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/try_catch.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Iterable<Class> next;
+}
+
+main() {
+  tryCatch1(null);
+  tryCatch2(null);
+}
+
+tryCatch1(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    try {
+      /*Class*/ c.next;
+      c = 0;
+      if (/*dynamic*/ c is Class) {
+        /*Class*/ c.next;
+      }
+    } catch (e) {
+      /*dynamic*/ c.next;
+    }
+    /*dynamic*/ c.next;
+  }
+}
+
+tryCatch2(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    try {
+      /*Class*/ c.next;
+    } catch (e) {
+      /*Class*/ c.next;
+    }
+    /*Class*/ c.next;
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/data/try_finally.dart b/tests/compiler/dart2js/static_type/data/try_finally.dart
new file mode 100644
index 0000000..62d0822
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/try_finally.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Iterable<Class> next;
+}
+
+main() {
+  tryFinally1(null);
+  tryFinally2(null);
+}
+
+tryFinally1(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    try {
+      /*Class*/ c.next;
+      c = 0;
+      if (/*dynamic*/ c is Class) {
+        /*Class*/ c.next;
+      }
+    } finally {
+      /*dynamic*/ c.next;
+    }
+    /*dynamic*/ c.next;
+  }
+}
+
+tryFinally2(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    try {
+      /*Class*/ c.next;
+    } finally {
+      /*Class*/ c.next;
+    }
+    /*Class*/ c.next;
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/data/while.dart b/tests/compiler/dart2js/static_type/data/while.dart
new file mode 100644
index 0000000..e646074
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/data/while.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Class {
+  Class next;
+}
+
+class GenericClass<T> {
+  GenericClass next;
+}
+
+main() {
+  while1(null);
+  while2(null);
+  whileNext(null);
+  whileNextGeneric(null);
+  new Class1<int>()
+    .. /*invoke: dynamic*/ whileNext1()
+    .. /*invoke: dynamic*/ whileNext2()
+    .. /*invoke: dynamic*/ whileNext3();
+}
+
+while1(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    while (/*dynamic*/ c /*invoke: bool*/ != null) {
+      /*dynamic*/ c.next;
+      if (/*dynamic*/ c is Class) {
+        /*Class*/ c.next;
+      }
+      c = 0;
+    }
+    /*dynamic*/ c.next;
+  }
+}
+
+while2(dynamic c) {
+  if (/*dynamic*/ c is Class) {
+    /*Class*/ c.next;
+    while (/*Class*/ c /*invoke: bool*/ != null) {
+      /*Class*/ c.next;
+    }
+    /*Class*/ c.next;
+  }
+}
+
+whileNext(Class c) {
+  while (/*Class*/ c /*invoke: bool*/ != null) {
+    c = /*Class*/ c.next;
+  }
+  return /*Class*/ c;
+}
+
+whileNextGeneric(GenericClass<int> c) {
+  while (/*GenericClass<int>*/ c /*invoke: bool*/ != null) {
+    c = /*GenericClass<int>*/ c.next;
+  }
+  return /*GenericClass<int>*/ c;
+}
+
+class Class1<T> {
+  whileNext1() {
+    bool b;
+    GenericClass<T> c;
+    while (/*bool*/ b) {
+      if (/*bool*/ b) {
+        GenericClass<T> next = /*GenericClass<T>*/ c.next;
+        c = /*GenericClass<T>*/ next;
+      } else {
+        c = /*GenericClass<T>*/ c.next;
+      }
+    }
+    return /*GenericClass<T>*/ c;
+  }
+
+  whileNext2() {
+    bool b;
+    GenericClass<T> c;
+    while (/*GenericClass<T>*/ c /*invoke: bool*/ != null) {
+      if (/*bool*/ b) {
+        GenericClass<T> next = /*GenericClass<T>*/ c.next;
+        c = /*GenericClass<T>*/ next;
+      } else {
+        c = /*GenericClass<T>*/ c.next;
+      }
+    }
+    return /*GenericClass<T>*/ c;
+  }
+
+  whileNext3() {
+    bool b;
+    GenericClass<T> c;
+    while (/*GenericClass<T>*/ c /*invoke: bool*/ == null) {
+      if (/*bool*/ b) {
+        GenericClass<T> next = /*Null*/ c.next;
+        c = /*GenericClass<T>*/ next;
+      } else {
+        c = /*Null*/ c.next;
+      }
+    }
+    return /*GenericClass<T>*/ c;
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/static_type_test.dart b/tests/compiler/dart2js/static_type/static_type_test.dart
new file mode 100644
index 0000000..1f935d8
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/static_type_test.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/ir/cached_static_type.dart';
+import 'package:compiler/src/ir/static_type_base.dart';
+import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/kernel_strategy.dart';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+import '../helpers/ir_types.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+    await checkTests(dataDir, new StaticTypeDataComputer(),
+        args: args, testOmit: false, testFrontend: true);
+  });
+}
+
+class StaticTypeDataComputer extends DataComputer<String> {
+  ir.TypeEnvironment _typeEnvironment;
+
+  ir.TypeEnvironment getTypeEnvironment(KernelToElementMapImpl elementMap) {
+    if (_typeEnvironment == null) {
+      ir.Component component = elementMap.env.mainComponent;
+      _typeEnvironment = new ir.TypeEnvironment(
+          new ir.CoreTypes(component), new ir.ClassHierarchy(component));
+    }
+    return _typeEnvironment;
+  }
+
+  /// Compute type inference data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose: false}) {
+    KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
+    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    Map<ir.TreeNode, ir.DartType> staticTypeCache =
+        elementMap.getCachedStaticTypes(member);
+    ir.Member node = elementMap.getMemberNode(member);
+    new StaticTypeIrComputer(
+            compiler.reporter,
+            actualMap,
+            new CachedStaticType(
+                getTypeEnvironment(elementMap),
+                staticTypeCache,
+                new ThisInterfaceType.from(node.enclosingClass?.thisType)))
+        .run(node);
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+/// IR visitor for computing inference data for a member.
+class StaticTypeIrComputer extends IrDataExtractor<String> {
+  final CachedStaticType staticTypeCache;
+
+  StaticTypeIrComputer(DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap, this.staticTypeCache)
+      : super(reporter, actualMap);
+
+  @override
+  String computeMemberValue(Id id, ir.Member node) {
+    return null;
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.VariableGet || node is ir.MethodInvocation) {
+      return typeToText(node.accept(staticTypeCache));
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart b/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart
new file mode 100644
index 0000000..1c94829
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/bottom.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {}
+
+main() {
+  conditionNullElse(null);
+  conditionNullThen(null);
+}
+
+conditionNullElse(dynamic o) {
+  /*{}*/ o;
+  /*{}*/ o is A ? /*{o:[{true:A}|A]}*/ o : null;
+  /*{}*/ o;
+}
+
+conditionNullThen(dynamic o) {
+  /*{}*/ o;
+  /*{}*/ o is! A ? null : /*{o:[{true:A}|A]}*/ o;
+  /*{}*/ o;
+}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart b/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart
new file mode 100644
index 0000000..17df94a
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/equals.dart
@@ -0,0 +1,76 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+bool equals(e1, e2, bool unordered) {
+  if (/*{}*/ e1 is Set) {
+    return /*{e1:[{true:Set<dynamic>}|Set<dynamic>]}*/
+        e2 is Set &&
+            /*{
+             e1:[{true:Set<dynamic>}|Set<dynamic>],
+             e2:[{true:Set<dynamic>}|Set<dynamic>]}
+            */
+            e1 == null;
+  }
+  if (/*{e1:[{false:Set<dynamic>}|Set<dynamic>]}*/ e1 is Map) {
+    return
+        /*{e1:[{true:Map<dynamic,dynamic>,false:Set<dynamic>}|Set<dynamic>,Map<dynamic,dynamic>]}*/
+        e2 is Map &&
+            /*{
+             e1:[{true:Map<dynamic,dynamic>,false:Set<dynamic>}|Set<dynamic>,Map<dynamic,dynamic>],
+             e2:[{true:Map<dynamic,dynamic>}|Map<dynamic,dynamic>]}
+            */
+            e1 == null;
+  }
+  if (! /*{e1:[{false:Set<dynamic>,Map<dynamic,dynamic>}|Set<dynamic>,Map<dynamic,dynamic>]}*/
+      unordered) {
+    if (/*{e1:[{false:Set<dynamic>,Map<dynamic,dynamic>}|Set<dynamic>,Map<dynamic,dynamic>]}*/
+        e1 is List) {
+      return
+          /*{e1:[{true:List<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>}|Set<dynamic>,Map<dynamic,dynamic>,List<dynamic>]}*/
+          e2 is List &&
+              /*{
+               e1:[{true:List<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>}|Set<dynamic>,Map<dynamic,dynamic>,List<dynamic>],
+               e2:[{true:List<dynamic>}|List<dynamic>]}
+              */
+              e1 == null;
+    }
+    if (/*{e1:[{false:Set<dynamic>,Map<dynamic,dynamic>,List<dynamic>}|Set<dynamic>,Map<dynamic,dynamic>,List<dynamic>]}*/
+        e1 is Iterable) {
+      return
+          /*{e1:[{true:Iterable<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>,List<dynamic>}|Set<dynamic>,Map<dynamic,dynamic>,List<dynamic>,Iterable<dynamic>]}*/
+          e2 is Iterable &&
+              /*{
+               e1:[{true:Iterable<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>,List<dynamic>}|Set<dynamic>,Map<dynamic,dynamic>,List<dynamic>,Iterable<dynamic>],
+               e2:[{true:Iterable<dynamic>}|Iterable<dynamic>]}
+              */
+              e1 == null;
+    }
+  } else if (/*{e1:[{false:Set<dynamic>,Map<dynamic,dynamic>}|Set<dynamic>,Map<dynamic,dynamic>]}*/
+      e1 is Iterable) {
+    if (
+        /*{e1:[{true:Iterable<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>}|Set<dynamic>,Map<dynamic,dynamic>,Iterable<dynamic>]}*/
+        e1 is List !=
+            /*{e1:[{true:Iterable<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>}|Set<dynamic>,Map<dynamic,dynamic>,Iterable<dynamic>]}*/
+            e2 is List) {
+      return
+          /*{e1:[{true:Iterable<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>}|Iterable<dynamic>,Set<dynamic>,Map<dynamic,dynamic>]}*/
+          e1 == null;
+    }
+    return /*{e1:[{true:Iterable<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>}|Iterable<dynamic>,Set<dynamic>,Map<dynamic,dynamic>]}*/
+        e2 is Iterable &&
+
+            /*{
+             e1:[{true:Iterable<dynamic>,false:Set<dynamic>,Map<dynamic,dynamic>}|Iterable<dynamic>,Set<dynamic>,Map<dynamic,dynamic>],
+             e2:[{true:Iterable<dynamic>}|Iterable<dynamic>]}
+            */
+            e1 == null;
+  }
+  return
+      /*{e1:[{false:Set<dynamic>,Map<dynamic,dynamic>,Iterable<dynamic>}|Set<dynamic>,Map<dynamic,dynamic>,Iterable<dynamic>]}*/
+      e1 == null;
+}
+
+main() {
+  equals(null, null, true);
+}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/if.dart b/tests/compiler/dart2js/static_type/type_promotion_data/if.dart
new file mode 100644
index 0000000..5c54faa
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/if.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {}
+
+class B {}
+
+main() {
+  ifThen(null);
+  ifThenSequence(null);
+  ifThenElse(null);
+  ifThenElseSequence(null);
+  ifNotReturn(null);
+  nestedIf(null);
+  nestedIf2(null);
+  nestedIfNotReturn(null);
+}
+
+ifThen(o) {
+  /*{}*/ o;
+  if (/*{}*/ o is A) {
+    /*{o:[{true:A}|A]}*/ o;
+  }
+  /*{}*/ o;
+}
+
+ifThenSequence(o) {
+  /*{}*/ o;
+  if (/*{}*/ o is A) {
+    /*{o:[{true:A}|A]}*/ o;
+  }
+  /*{}*/ o;
+  if (/*{}*/ o is B) {
+    /*{o:[{true:B}|B]}*/ o;
+  }
+  /*{}*/ o;
+}
+
+ifThenElse(o) {
+  /*{}*/ o;
+  if (/*{}*/ o is A) {
+    /*{o:[{true:A}|A]}*/ o;
+  } else {
+    /*{o:[{false:A}|A]}*/ o;
+  }
+  /*{}*/ o;
+}
+
+ifThenElseSequence(o) {
+  /*{}*/ o;
+  if (/*{}*/ o is A) {
+    /*{o:[{true:A}|A]}*/ o;
+  } else {
+    /*{o:[{false:A}|A]}*/ o;
+  }
+  /*{}*/ o;
+  if (/*{}*/ o is B) {
+    /*{o:[{true:B}|B]}*/ o;
+  } else {
+    /*{o:[{false:B}|B]}*/ o;
+  }
+  /*{}*/ o;
+}
+
+ifNotReturn(o) {
+  /*{}*/ o;
+  if (/*{}*/ o is! A) {
+    return /*{o:[{false:A}|A]}*/ o;
+  }
+  /*{o:[{true:A}|A]}*/ o;
+}
+
+nestedIf(o) {
+  if (/*{}*/ o is A) {
+    if (/*{o:[{true:A}|A]}*/ o is B) {
+      return /*{o:[{true:A,B}|A,B]}*/ o;
+    }
+  }
+  /*{}*/ o;
+}
+
+nestedIf2(o) {
+  if (/*{}*/ o is A) {
+    if (/*{o:[{true:A}|A]}*/ o is B) {
+      return /*{o:[{true:A,B}|A,B]}*/ o;
+    }
+  } else if (/*{o:[{false:A}|A]}*/ o is B) {
+    /*{o:[{true:B,false:A}|A,B]}*/ o;
+  }
+  /*{}*/ o;
+}
+
+nestedIfNotReturn(o) {
+  if (/*{}*/ o is A) {
+    if (/*{o:[{true:A}|A]}*/ o is! B) {
+      return /*{o:[{true:A,false:B}|A,B]}*/ o;
+    }
+    /*{o:[{true:A,B}|A,B]}*/ o;
+  }
+  /*{}*/ o;
+}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_data/null.dart b/tests/compiler/dart2js/static_type/type_promotion_data/null.dart
new file mode 100644
index 0000000..02a3697
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/type_promotion_data/null.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  ifNull(null);
+  ifNullElse(null);
+  ifNotNull(null);
+  ifNotNullElse(null);
+}
+
+ifNull(o) {
+  /*{}*/ o;
+  if (/*{}*/ o == null) {
+    /*{o:[{false:dynamic}|dynamic]}*/ o;
+  }
+  /*{}*/ o;
+}
+
+ifNullElse(o) {
+  /*{}*/ o;
+  if (/*{}*/ o == null) {
+    /*{o:[{false:dynamic}|dynamic]}*/ o;
+  } else {
+    /*{o:[{true:dynamic}|dynamic]}*/ o;
+  }
+  /*{}*/ o;
+}
+
+ifNotNull(o) {
+  /*{}*/ o;
+  if (/*{}*/ o != null) {
+    /*{o:[{true:dynamic}|dynamic]}*/ o;
+  }
+  /*{}*/ o;
+}
+
+ifNotNullElse(o) {
+  /*{}*/ o;
+  if (/*{}*/ o != null) {
+    /*{o:[{true:dynamic}|dynamic]}*/ o;
+  } else {
+    /*{o:[{false:dynamic}|dynamic]}*/ o;
+  }
+  /*{}*/ o;
+}
diff --git a/tests/compiler/dart2js/static_type/type_promotion_test.dart b/tests/compiler/dart2js/static_type/type_promotion_test.dart
new file mode 100644
index 0000000..76f448f
--- /dev/null
+++ b/tests/compiler/dart2js/static_type/type_promotion_test.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/ir/static_type.dart';
+import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/kernel_strategy.dart';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+import '../helpers/ir_types.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir =
+        new Directory.fromUri(Platform.script.resolve('type_promotion_data'));
+    await checkTests(dataDir, new TypePromotionDataComputer(),
+        args: args, testFrontend: true);
+  });
+}
+
+class TypePromotionDataComputer extends DataComputer<String> {
+  ir.TypeEnvironment _typeEnvironment;
+
+  ir.TypeEnvironment getTypeEnvironment(KernelToElementMapImpl elementMap) {
+    if (_typeEnvironment == null) {
+      ir.Component component = elementMap.env.mainComponent;
+      _typeEnvironment = new ir.TypeEnvironment(
+          new ir.CoreTypes(component), new ir.ClassHierarchy(component));
+    }
+    return _typeEnvironment;
+  }
+
+  /// Compute type inference data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose: false}) {
+    KernelFrontEndStrategy frontendStrategy = compiler.frontendStrategy;
+    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    Map<ir.Expression, TypeMap> typeMaps =
+        elementMap.getTypeMapsForTesting(member);
+    ir.Member node = elementMap.getMemberNode(member);
+    new TypePromotionIrComputer(compiler.reporter, actualMap, typeMaps)
+        .run(node);
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+/// IR visitor for computing inference data for a member.
+class TypePromotionIrComputer extends IrDataExtractor<String> {
+  final Map<ir.Expression, TypeMap> typeMaps;
+
+  TypePromotionIrComputer(DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap, this.typeMaps)
+      : super(reporter, actualMap);
+
+  @override
+  String computeMemberValue(Id id, ir.Member node) {
+    return null;
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.VariableGet) {
+      TypeMap type = typeMaps[node];
+      return type.getText(typesToText);
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js_extra/35341_test.dart b/tests/compiler/dart2js_extra/35341_test.dart
new file mode 100644
index 0000000..80310f0
--- /dev/null
+++ b/tests/compiler/dart2js_extra/35341_test.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for issue 35341.
+
+import "dart:async";
+
+@pragma('dart2js:disableFinal')
+void main() {
+  FutureOr<int> i = new Future<int>.value(0);
+  print(i.runtimeType);
+}
diff --git a/tests/compiler/dart2js_extra/35356_test.dart b/tests/compiler/dart2js_extra/35356_test.dart
new file mode 100644
index 0000000..13dc082
--- /dev/null
+++ b/tests/compiler/dart2js_extra/35356_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  bool b = true & true;
+  b |= true;
+  b = b ^ b;
+  print(b);
+}
diff --git a/tests/compiler/dart2js_extra/881_test.dart b/tests/compiler/dart2js_extra/881_test.dart
new file mode 100644
index 0000000..5be849c
--- /dev/null
+++ b/tests/compiler/dart2js_extra/881_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for DartPad issue 881.
+
+@pragma('dart2js:disableFinal')
+void main() {
+  String v = null;
+  print('${v.hashCode}');
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 2e6c022..4facaed 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -92,7 +92,6 @@
 [ $compiler == dart2js && $runtime == d8 ]
 deferred_fail_and_retry_test: RuntimeError # Uses XHR in dart:html
 deferred_with_csp_nonce_test: RuntimeError # Uses dart:html
-unconditional_dartio_import_test: RuntimeError # Uses dart:io
 
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 consistent_index_error_string_test: Pass, Slow # Issue 25940
diff --git a/tests/compiler/dart2js_extra/generic_type_error_message_test.dart b/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
index 8becaf9..038fecf 100644
--- a/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
+++ b/tests/compiler/dart2js_extra/generic_type_error_message_test.dart
@@ -10,9 +10,15 @@
 
 class Bar<T extends num> {}
 
+class Baz<T extends num> {}
+
+@pragma('dart2js:disableFinal')
 main() {
   test(new Foo(), Foo, expectTypeArguments: false);
-  test(new Bar() as Bar<num>, Bar, expectTypeArguments: true);
+  test(new Bar() as Bar<num>, Bar, expectTypeArguments: false);
+  Baz<num> b = new Baz();
+  dynamic c = b;
+  test(c as Baz<num>, Baz, expectTypeArguments: true);
 }
 
 void test(dynamic object, Type type, {bool expectTypeArguments}) {
diff --git a/tests/compiler/dart2js_extra/js_interop_cast_test.dart b/tests/compiler/dart2js_extra/js_interop_cast_test.dart
new file mode 100644
index 0000000..28c018a
--- /dev/null
+++ b/tests/compiler/dart2js_extra/js_interop_cast_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that we don't crash on computing js-interop classes when metadata
+// constants contain implicit casts.
+//
+// We need the class hierarchy to perform the evaluation the implicit casts but
+// we also change the class hierarchy when we discover that a class is a
+// js-interop class. By mixing (valid) constants that contain implicit casts
+// with the @JS annotations that define classes to be js-interop, triggering
+// the use of the class hierarchy before all js-interop classes have been
+// registered, this test causes dart2js to crash with an assertion failure.
+
+@Constant(4)
+@JS()
+@Constant(5)
+library test;
+
+import 'package:js/js.dart';
+
+@Constant(-1)
+method() {}
+
+@Constant(0)
+@JS()
+@anonymous
+@Constant(1)
+class ClassA {
+  external factory ClassA();
+
+  @Constant(2)
+  external method();
+}
+
+class Constant {
+  final int field;
+
+  const Constant(dynamic value) : field = value;
+}
+
+@Constant(0)
+@JS()
+@anonymous
+@Constant(1)
+class ClassB {
+  external factory ClassB();
+
+  @Constant(2)
+  external method();
+}
+
+class ClassC {
+  method() {}
+}
+
+main() {
+  method();
+  dynamic c = new ClassC();
+  c.method();
+  new ClassA();
+  new ClassB();
+}
diff --git a/tests/compiler/dart2js_native/native_method_inlining_test.dart b/tests/compiler/dart2js_native/native_method_inlining_test.dart
index 1dd30c1..f673eeb 100644
--- a/tests/compiler/dart2js_native/native_method_inlining_test.dart
+++ b/tests/compiler/dart2js_native/native_method_inlining_test.dart
@@ -82,13 +82,13 @@
 void match(String s, String pattern1) {
   var pattern2 = pattern1.replaceAll(' ', '');
   Expect.isTrue(s.contains(pattern1) || s.contains(pattern2),
-      "expected $pattern1 or $pattern2");
+      "expected $pattern1 or $pattern2 in '$s'");
 }
 
 void nomatch(String s, String pattern1) {
   var pattern2 = pattern1.replaceAll(' ', '');
   Expect.isFalse(s.contains(pattern1) || s.contains(pattern2),
-      "should not have $pattern1 or $pattern2");
+      "should not have $pattern1 or $pattern2 in '$s'");
 }
 
 test1() {
diff --git a/tests/compiler/dart2js_native/native_mixin_field2_test.dart b/tests/compiler/dart2js_native/native_mixin_field2_test.dart
new file mode 100644
index 0000000..408bdb6
--- /dev/null
+++ b/tests/compiler/dart2js_native/native_mixin_field2_test.dart
@@ -0,0 +1,87 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "native_testing.dart";
+
+// Test that native classes can use ordinary Dart classes with fields
+// as mixins.
+
+@Native("A")
+class A {
+  var foo;
+}
+
+class A1 {
+  get foo => 42;
+  set foo(value) {}
+}
+
+@Native("B")
+class B extends A with M1, M2 {
+  var bar;
+}
+
+class B1 extends A1 with M1, M2 {
+  get bar => 42;
+  set bar(value) {}
+}
+
+class M1 {
+  var baz; // This field is not a native field, even when mixed in.
+}
+
+class M2 {
+  var bar;
+  var buz;
+}
+
+A makeA() native;
+B makeB() native;
+
+void setup() {
+  JS('', r"""
+(function(){
+  function A() {this.foo='A-foo';}
+  function B() {A.call(this);this.bar='B-bar';this.baz='M1-baz';}
+  makeA = function(){return new A()};
+  makeB = function(){return new B()};
+
+  self.nativeConstructor(A);
+  self.nativeConstructor(B);
+})()""");
+}
+
+@AssumeDynamic()
+confuse(x) => x;
+
+main() {
+  nativeTesting();
+  setup();
+  dynamic a = makeA();
+  a ??= new A1();
+  Expect.equals("A-foo", confuse(a).foo);
+  Expect.throws(() => confuse(a).bar, (e) => e is NoSuchMethodError);
+  Expect.throws(() => confuse(a).baz, (e) => e is NoSuchMethodError);
+  Expect.throws(() => confuse(a).buz, (e) => e is NoSuchMethodError);
+
+  dynamic b = makeB();
+  b ??= new B1();
+  Expect.equals("A-foo", confuse(b).foo);
+  Expect.equals("B-bar", confuse(b).bar);
+  // Expect.equals("M1-baz", b.baz);  // not true, see M1.
+  Expect.isNull(confuse(b).baz); // native b.baz is not the same as dart b.baz.
+  Expect.isNull(confuse(b).buz);
+
+  M1 m1 = new M1();
+  Expect.throws(() => confuse(m1).foo, (e) => e is NoSuchMethodError);
+  Expect.throws(() => confuse(m1).bar, (e) => e is NoSuchMethodError);
+  Expect.isNull(m1.baz);
+  Expect.throws(() => confuse(m1).buz, (e) => e is NoSuchMethodError);
+
+  M2 m2 = new M2();
+  Expect.throws(() => confuse(m2).foo, (e) => e is NoSuchMethodError);
+  Expect.isNull(confuse(m2).bar);
+  Expect.throws(() => confuse(m2).baz, (e) => e is NoSuchMethodError);
+  Expect.isNull(confuse(m2).buz);
+}
diff --git a/tests/corelib_2/bigint_test.dart b/tests/corelib_2/bigint_test.dart
index f4e9865..7ad5309 100644
--- a/tests/corelib_2/bigint_test.dart
+++ b/tests/corelib_2/bigint_test.dart
@@ -1031,38 +1031,38 @@
 
 main() {
   for (int i = 0; i < 8; i++) {
-    Expect.equals(BigInt.parse("1234567890123456789"), foo());
-    Expect.equals(BigInt.parse("12345678901234567890"), bar());
-    testModPow();
-    testModInverse();
-    testGcd();
-    testSmiOverflow();
-    testBigintAnd();
-    testBigintOr();
-    testBigintXor();
-    testBigintAdd();
-    testBigintSub();
-    testBigintMul();
-    testBigintTruncDiv();
-    testBigintDiv();
-    testBigintModulo();
-    testBigintModPow();
-    testBigintModInverse();
-    testBigintGcd();
-    testBigintNegate();
-    testShiftAmount();
-    testPow();
-    testToRadixString();
-    testToString();
-    testFromToInt();
-    testFromToDouble();
-    Expect.equals(BigInt.parse("12345678901234567890"),
-        BigInt.parse("12345678901234567890").abs());
-    Expect.equals(BigInt.parse("12345678901234567890"),
-        BigInt.parse("-12345678901234567890").abs());
-    var a = BigInt.parse("10000000000000000000");
-    var b = BigInt.parse("10000000000000000001");
-    Expect.equals(false, a.hashCode == b.hashCode);
-    Expect.equals(true, a.hashCode == (b - BigInt.one).hashCode);
+    Expect.equals(BigInt.parse("1234567890123456789"), foo()); /// 01: ok
+    Expect.equals(BigInt.parse("12345678901234567890"), bar()); /// 02: ok
+    testModPow(); /// 03: ok
+    testModInverse(); /// 04: ok
+    testGcd(); /// 05: ok
+    testSmiOverflow(); /// 06: ok
+    testBigintAnd(); /// 07: ok
+    testBigintOr(); /// 08: ok
+    testBigintXor(); /// 09: ok
+    testBigintAdd(); /// 10: ok
+    testBigintSub(); /// 11: ok
+    testBigintMul(); /// 12: ok
+    testBigintTruncDiv(); /// 12: ok
+    testBigintDiv(); /// 13: ok
+    testBigintModulo(); /// 14: ok
+    testBigintModPow(); /// 15: ok
+    testBigintModInverse(); /// 16: ok
+    testBigintGcd(); /// 17: ok
+    testBigintNegate(); /// 18: ok
+    testShiftAmount(); /// 19: ok
+    testPow(); /// 20: ok
+    testToRadixString(); /// 21: ok
+    testToString(); /// 22: ok
+    testFromToInt(); /// 23: ok
+    testFromToDouble(); /// 24: ok
+    Expect.equals(BigInt.parse("12345678901234567890"), /// 25: ok
+        BigInt.parse("12345678901234567890").abs()); /// 25: ok
+    Expect.equals(BigInt.parse("12345678901234567890"), /// 26: ok
+        BigInt.parse("-12345678901234567890").abs()); /// 26: ok
+    var a = BigInt.parse("10000000000000000000"); /// 27: ok
+    var b = BigInt.parse("10000000000000000001"); /// 27: ok
+    Expect.equals(false, a.hashCode == b.hashCode); /// 27: ok
+    Expect.equals(true, a.hashCode == (b - BigInt.one).hashCode); /// 27: ok
   }
 }
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 2723fd2..38b98dd 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -1,7 +1,6 @@
 # Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
-maps_test: Skip # Maps class no longer exists
 
 [ $compiler == app_jitk ]
 symbol_operator_test/03: RuntimeError
@@ -115,9 +114,6 @@
 [ $fasta ]
 symbol_reserved_word_test/04: MissingCompileTimeError
 symbol_reserved_word_test/07: MissingCompileTimeError
-symbol_reserved_word_test/10: MissingCompileTimeError
-symbol_test/02: MissingCompileTimeError
-symbol_test/03: MissingCompileTimeError
 
 [ !$strong ]
 cast_test: SkipByDesign # Uses generic method parameters.
@@ -132,6 +128,9 @@
 [ $arch == x64 && $system == windows ]
 stopwatch_test: Skip # Flaky test due to expected performance behaviour.
 
+[ $builder_tag == obfuscated && $compiler == dartkp ]
+nsm_invocation_test: RuntimeError # Issue 35066
+
 [ $builder_tag == obfuscated && $runtime == dart_precompiled ]
 apply_generic_function_test: SkipByDesign # Function.apply with named args
 apply_test: Skip # Uses new Symbol via symbolMapToStringMap helper
@@ -282,6 +281,11 @@
 [ $compiler != dartk && $runtime == vm && $checked ]
 apply_test/01: RuntimeError
 
+[ $compiler != dartkb && $compiler != dartkp && $fasta ]
+symbol_reserved_word_test/10: MissingCompileTimeError
+symbol_test/02: MissingCompileTimeError
+symbol_test/03: MissingCompileTimeError
+
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
 iterable_fold_test/02: RuntimeError
 iterable_reduce_test/01: CompileTimeError # Issue 31533
@@ -404,20 +408,15 @@
 [ !$preview_dart_2 && ($runtime == dart_precompiled || $runtime == vm) ]
 *: SkipByDesign # Deprecating all Dart1 modes of execution
 
-# Sections for dartk and dartkp.
-#
-# Note: these sections are normalized so we can update them with automated
-# tools. Please add any new status lines affecting those two compilers in the
-# existing sections, if possible keep the alphabetic ordering. If we are missing
-# a section you need, please reach out to sigmund@ to see the best way to add
-# them.
-# ===== Skip dartk and darkp in !$strong mode ====
 [ !$strong && ($compiler == dartk || $compiler == dartkb || $compiler == dartkp) ]
 *: SkipByDesign
 
 [ !$strong && ($runtime == dart_precompiled || $runtime == vm) ]
 list_test/*: RuntimeError # VM doesn't implement strong mode covariance checks
 
+[ ($arch == simdbc || $arch == simdbc64) && ($hot_reload || $hot_reload_rollback) ]
+uri_parse_test: SkipSlow
+
 [ $arch == simarm || $arch == simarm64 || $arch == simdbc64 ]
 bigint_parse_radix_test: Skip # Issue 31659
 bigint_test: Skip # Issue 31659
@@ -566,7 +565,9 @@
 uri_test: Pass, Slow
 
 [ $compiler == dartkb || $compiler == dartkp ]
-bigint_test: Pass, Timeout # --no_intrinsify
+bigint_parse_radix_test: Pass, Slow # --no_intrinsify
+bigint_test/03: SkipSlow # --no_intrinsify
+bigint_test/15: SkipSlow # --no_intrinsify
 
 [ $compiler == precompiler || $runtime == vm && !$checked && !$strong ]
 int_parse_radix_test/badTypes: RuntimeError # wrong exception returned
diff --git a/tests/corelib_2/date_time_parse_test.dart b/tests/corelib_2/date_time_parse_test.dart
index 74cc78f..6b3d58d 100644
--- a/tests/corelib_2/date_time_parse_test.dart
+++ b/tests/corelib_2/date_time_parse_test.dart
@@ -18,9 +18,13 @@
   if (supportsMicroseconds) {
     check(new DateTime.utc(2012, 02, 27, 13, 27, 0, 123, 456),
         "2012-02-27 13:27:00.123456z");
+    check(new DateTime.utc(2012, 02, 27, 13, 27, 0, 123, 456),
+        "2012-02-27 13:27:00,123456z");
   } else {
     check(new DateTime.utc(2012, 02, 27, 13, 27, 0, 123, 456),
         "2012-02-27 13:27:00.123z");
+    check(new DateTime.utc(2012, 02, 27, 13, 27, 0, 123, 456),
+        "2012-02-27 13:27:00,123z");
   }
   check(new DateTime(2012, 02, 27, 13, 27), "20120227 13:27:00");
   check(new DateTime(2012, 02, 27, 13, 27), "20120227T132700");
diff --git a/tests/corelib_2/maps_test.dart b/tests/corelib_2/maps_test.dart
deleted file mode 100644
index 9183c23..0000000
--- a/tests/corelib_2/maps_test.dart
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library maps_test;
-
-import "package:expect/expect.dart";
-import 'dart:collection';
-
-main() {
-  final key1 = "key1";
-  final key2 = "key2";
-  final key3 = "key3";
-  final key4 = "key4";
-  final key5 = "key5";
-  final key6 = "key6";
-  final key7 = "key7";
-  final key8 = "key8";
-
-  final value1 = 10;
-  final value2 = 20;
-  final value3 = 30;
-  final value4 = 40;
-  final value5 = 50;
-  final value6 = 60;
-  final value7 = 70;
-  final value8 = 80;
-
-  Map map = new Map();
-
-  map[key1] = value1;
-  map[key1] = value2;
-  Expect.equals(false, Maps.containsKey(map, key2));
-  Expect.equals(1, Maps.length(map));
-
-  map[key1] = value1;
-  // Add enough entries to make sure the table grows.
-  map[key2] = value2;
-  Expect.equals(2, Maps.length(map));
-  map[key3] = value3;
-  map[key4] = value4;
-  map[key5] = value5;
-  map[key6] = value6;
-  map[key7] = value7;
-  map[key8] = value8;
-  Expect.equals(8, Maps.length(map));
-
-  map.remove(key4);
-  Expect.equals(false, Maps.containsKey(map, key4));
-  Expect.equals(7, Maps.length(map));
-
-  // Test clearing the table.
-  Maps.clear(map);
-  Expect.equals(0, Maps.length(map));
-  Expect.equals(false, Maps.containsKey(map, key1));
-  Expect.equals(false, map.containsKey(key1));
-  Expect.equals(false, Maps.containsKey(map, key2));
-  Expect.equals(false, map.containsKey(key2));
-  Expect.equals(false, Maps.containsKey(map, key3));
-  Expect.equals(false, map.containsKey(key3));
-  Expect.equals(false, Maps.containsKey(map, key4));
-  Expect.equals(false, map.containsKey(key4));
-  Expect.equals(false, Maps.containsKey(map, key5));
-  Expect.equals(false, map.containsKey(key5));
-  Expect.equals(false, Maps.containsKey(map, key6));
-  Expect.equals(false, map.containsKey(key6));
-  Expect.equals(false, Maps.containsKey(map, key7));
-  Expect.equals(false, map.containsKey(key7));
-  Expect.equals(false, Maps.containsKey(map, key8));
-  Expect.equals(false, map.containsKey(key8));
-
-  // Test adding and removing again.
-  map[key1] = value1;
-  Expect.equals(1, Maps.length(map));
-  map[key2] = value2;
-  Expect.equals(2, Maps.length(map));
-  map[key3] = value3;
-  map.remove(key3);
-  Expect.equals(2, Maps.length(map));
-  map[key4] = value4;
-  map.remove(key4);
-  Expect.equals(2, Maps.length(map));
-  map[key5] = value5;
-  map.remove(key5);
-  Expect.equals(2, Maps.length(map));
-  map[key6] = value6;
-  map.remove(key6);
-  Expect.equals(2, Maps.length(map));
-  map[key7] = value7;
-  map.remove(key7);
-  Expect.equals(2, Maps.length(map));
-  map[key8] = value8;
-  map.remove(key8);
-  Expect.equals(2, Maps.length(map));
-
-  Expect.equals(true, Maps.containsKey(map, key1));
-  Expect.equals(true, Maps.containsValue(map, value1));
-
-  // Test Map.forEach.
-  Map other_map = new Map();
-  void testForEachMap(key, value) {
-    other_map[key] = value;
-  }
-
-  Maps.forEach(map, testForEachMap);
-  Expect.equals(true, other_map.containsKey(key1));
-  Expect.equals(true, other_map.containsKey(key2));
-  Expect.equals(true, other_map.containsValue(value1));
-  Expect.equals(true, other_map.containsValue(value2));
-  Expect.equals(2, Maps.length(other_map));
-
-  // Test Collection.values.
-  void testForEachCollection(value) {
-    other_map[value] = value;
-  }
-
-  Iterable values = Maps.getValues(map);
-  other_map = new Map();
-  values.forEach(testForEachCollection);
-  Expect.equals(true, !other_map.containsKey(key1));
-  Expect.equals(true, !other_map.containsKey(key2));
-  Expect.equals(true, !other_map.containsValue(key1));
-  Expect.equals(true, !other_map.containsValue(key2));
-  Expect.equals(true, other_map.containsKey(value1));
-  Expect.equals(true, other_map.containsKey(value2));
-  Expect.equals(true, other_map.containsValue(value1));
-  Expect.equals(true, other_map.containsValue(value2));
-  Expect.equals(2, other_map.length);
-  other_map.clear();
-
-  // Test Map.putIfAbsent.
-  map.clear();
-  Expect.equals(false, Maps.containsKey(map, key1));
-  Maps.putIfAbsent(map, key1, () => 10);
-  Expect.equals(true, map.containsKey(key1));
-  Expect.equals(10, map[key1]);
-  Expect.equals(10, Maps.putIfAbsent(map, key1, () => 11));
-}
diff --git a/tests/language_2/async_star/async_star_await_for_test.dart b/tests/language_2/async_star/async_star_await_for_test.dart
new file mode 100644
index 0000000..0493a1f
--- /dev/null
+++ b/tests/language_2/async_star/async_star_await_for_test.dart
@@ -0,0 +1,376 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that `await for` and `async*` interact correctly.
+
+// An `await for` must pause its subscription immediately
+// if the `await for` body does anything asynchronous
+// (any `await`, `await for`, or pausing at a `yield`/`yield*`)
+// A pause happening synchronously in an event delivery
+// must pause the `sync*` method at the `yield` sending the event.
+// A break happening synchronously in an event delivery,
+// or while paused at a `yield`, must exit at that `yield`.
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+Stream<int> stream(List<String> log) async* {
+  log.add("^");
+  try {
+    log.add("?1");
+    yield 1;
+    log.add("?2");
+    yield 2;
+    log.add("?3");
+    yield 3;
+  } finally {
+    log.add(r"$");
+  }
+}
+
+Stream<int> consume(List<String> log,
+    {int breakAt = -1,
+    int yieldAt = -1,
+    int yieldStarAt = -1,
+    int pauseAt = -1}) async* {
+  // Create stream.
+  var s = stream(log);
+  log.add("(");
+  // The "consume loop".
+  await for (var event in s) {
+    // Should be acting synchronously wrt. the delivery of the event.
+    // The source stream should be at the yield now.
+    log.add("!$event");
+    if (event == pauseAt) {
+      log.add("p$event[");
+      // Async operation causes subscription to pause.
+      // Nothing should happen in the source stream
+      // until the end of the loop body where the subscription is resumed.
+      await Future.delayed(Duration(microseconds: 1));
+      log.add("]");
+    }
+    if (event == yieldAt) {
+      log.add("y$event[");
+      // Yield may cause subscription to pause or cancel.
+      // This loop should stay at the yield until the event has been delieverd.
+      // If the receiver pauses or cancels, we delay or break the loop here.
+      yield event;
+      log.add("]");
+    }
+    if (event == yieldStarAt) {
+      log.add("Y$event[");
+      // Yield* will always cause the subscription for this loop to pause.
+      // If the listener pauses, this stream is paused. If the listener cancels,
+      // this stream is cancelled, and the yield* acts like return, cancelling
+      // the loop subscription and waiting for the cancel future.
+      yield* Stream<int>.fromIterable([event]);
+      log.add("]");
+    }
+    if (event == breakAt) {
+      log.add("b$event");
+      // Breaks the loop. This cancels the loop subscription and waits for the
+      // cancel future.
+      break;
+    }
+  }
+  // Done event from stream or cancel future has completed.
+  log.add(")");
+}
+
+main() async {
+  asyncStart();
+
+  // Just run the loop over the stream. The consume stream emits no events.
+  {
+    var log = <String>[];
+    await for (var _ in consume(log)) {
+      throw "unreachable";
+    }
+    await Future.delayed(Duration(milliseconds: 1));
+    var trace = log.join("");
+    Expects.equals(r"(^?1!1?2!2?3!3$)", trace, "straight through");
+  }
+
+  // Pause at 1, then resume.
+  // Consume loop forces a pause when it receives the 1 event.
+  // Nothing should happen until that pause is resumed.
+  {
+    var log = <String>[];
+    await for (var _ in consume(log, pauseAt: 1)) {
+      throw "unreachable";
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "pause at 1";
+    if (trace.contains("p1[?2")) {
+      message += " (did not pause in time)";
+    }
+    Expects.equals(r"(^?1!1p1[]?2!2?3!3$)", trace, message);
+  }
+
+  // Break at 1.
+  // Consume loop breaks after receiving the 1 event.
+  // The consume stream emits no events.
+  {
+    var log = <String>[];
+    await for (var _ in consume(log, breakAt: 1)) {
+      throw "unreachable";
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "break at 1";
+    if (trace.contains("b1?2")) {
+      message += " (did not cancel in time)";
+    }
+    Expects.equals(r"(^?1!1b1$)", trace, message);
+  }
+
+  // Pause then break at 1.
+  // Consume loop pauses after receiving the 1 event,
+  // then breaks before resuming. It should still be at the yield.
+  // The consume stream emits no events.
+  {
+    var log = <String>[];
+    await for (var _ in consume(log, pauseAt: 1, breakAt: 1)) {
+      throw "unreachable";
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "pause then break at 1";
+    if (trace.contains("p1[?2")) {
+      message += " (did not pause in time)";
+    }
+    if (trace.contains("b1?2")) {
+      message += " (did not cancel in time)";
+    }
+    Expects.equals(r"(^?1!1p1[]b1$)", trace, message);
+  }
+
+  // Yield at 1.
+  // The consume loop re-emits the 1 event.
+  // The test loop should receive that event while the consume loop is still
+  // at the yield statement.
+  // The consume loop may or may not pause, it should make no difference.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldAt: 1)) {
+      log.add("e$s");
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield at 1";
+    if (trace.contains("y1[?2")) {
+      message += " (did not wait for delivery)";
+    }
+    Expects.equals(r"(^?1!1y1[e1]?2!2?3!3$)", trace, message);
+  }
+
+  // Yield at 1, then pause at yield.
+  // The consume loop re-emits the 1 event.
+  // The test loop should receive that event while the consume loop is still
+  // at the yield statement.
+  // The test loop then pauses.
+  // Nothing should happen in either the original yield
+  // or the consume-function yield until the test loop ends.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldAt: 1)) {
+      log.add("e$s<");
+      // Force pause at yield.
+      await Future.delayed(Duration(milliseconds: 1));
+      log.add(">");
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield at 1, pause at yield";
+    if (trace.contains("y1[?2")) {
+      message += " (did not wait for delivery)";
+    }
+    if (trace.contains("e1<?2")) {
+      message += " (did not pause in time)";
+    }
+    Expects.equals(r"(^?1!1y1[e1<>]?2!2?3!3$)", trace, message);
+  }
+
+  // Yield at 1, then break at yield.
+  // The consume loop re-emits the 1 event.
+  // The test loop should receive that event while the consume loop is still
+  // at the yield statement.
+  // The test loop then breaks. That makes the consume loop yield return,
+  // breaking the consume loop, which makes the source yield return.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldAt: 1)) {
+      log.add("e${s}B$s");
+      break; // Force break at yield*.
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield at 1, break at yield";
+    if (trace.contains("y1[?2")) {
+      message += " (did not wait for delivery)";
+    }
+    if (trace.contains("B1?2")) {
+      message += " (did not break in time)";
+    }
+    Expects.equals(r"(^?1!1y1[e1B1$)", trace, message);
+  }
+
+  // Yield* at 1.
+  // The consume loop re-emits a stream containing the 1 event.
+  // The test loop should receive that event before the consume loop
+  // continues from the `yield*`, which again happens before the source
+  // stream continues from its `yield`.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldStarAt: 1)) {
+      log.add("e$s");
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield* at 1";
+    if (trace.contains("Y1[?2")) {
+      message += " (did not wait for delivery)";
+    }
+    Expects.equals(r"(^?1!1Y1[e1]?2!2?3!3$)", trace, message);
+  }
+
+  // Yield* at 1, pause at yield.
+  // The consume loop re-emits a stream containing the 1 event.
+  // The test loop should receive that event before the consume loop
+  // continues from the `yield*`. The test loop then force a pause.
+  // Nothing further should happen during that pause.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldStarAt: 1)) {
+      log.add("e$s<");
+      await Future.delayed(Duration(milliseconds: 1)); // force pause.
+      log.add(">");
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield* then pause at 1";
+    if (trace.contains("Y1[?2")) {
+      message += " (did not wait for delivery)";
+    }
+    if (trace.contains("e1<?2")) {
+      message += " (did not pause in time)";
+    }
+    Expects.equals(r"(^?1!1Y1[e1<>]?2!2?3!3$)", trace, message);
+  }
+
+  // Yield* at 1, then break at 1.
+  // The consume loop re-emits a stream containing the 1 event.
+  // The test loop should receive that event before the consume loop
+  // continues from the `yield*`.
+  // When the consume loop continues, it breaks,
+  // forcing the waiting source yield to return.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldStarAt: 1, breakAt: 1)) {
+      log.add("e$s");
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield* then pause at 1";
+    if (trace.contains("Y1[?2")) {
+      message += " (did not wait for delivery)";
+    }
+    Expects.equals(r"(^?1!1Y1[e1]b1$)", trace, message);
+  }
+
+  // Yield* at 1, pause at yield, then break at 1.
+  // The consume loop re-emits a stream containing the 1 event.
+  // The test loop should receive that event before the consume loop
+  // continues from the `yield*`. After the `yield*`, the consume loop breaks.
+  // This forces the waiting source yield to return.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldStarAt: 1, breakAt: 1)) {
+      log.add("e$s<");
+      await Future.delayed(Duration(milliseconds: 1)); // force pause.
+      log.add(">");
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield* then pause at 1";
+    Expects.equals(r"(^?1!1Y1[e1<>]b1$)", trace, message);
+  }
+
+  // Yield* at 1, break at yield.
+  // The consume loop re-emits a stream containing the 1 event.
+  // The test loop should receive that event before the consume loop
+  // continues from the `yield*`. The test loop then breaks,
+  // forcing the two waiting yields to return.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldStarAt: 1)) {
+      log.add("e${s}B$s");
+      break;
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield* then break at 1";
+    if (trace.contains("Y1[?2")) {
+      message += " (did not deliver event in time)";
+    }
+    if (trace.contains("e1?2")) {
+      message += " (did not cancel in time)";
+    }
+    Expects.equals(r"(^?1!1Y1[e1B1$)", trace, message);
+  }
+
+  // Yield* at 1, pause at yield, then break at yield.
+  // The consume loop re-emits a stream containing the 1 event.
+  // The test loop should receive that event before the consume loop
+  // continues from the `yield*`. The test loop then forces a pause,
+  // and then breaks before that pause is resumed.
+  // This forces the two waiting yields to return.
+  {
+    var log = <String>[];
+    await for (var s in consume(log, yieldStarAt: 1)) {
+      log.add("e$s<");
+      await Future.delayed(Duration(milliseconds: 1)); // force pause.
+      log.add(">B$s");
+      break; // And break.
+    }
+    await Future.delayed(Duration(milliseconds: 10));
+    var trace = log.join("");
+    String message = "yield* then pause then break at 1";
+    Expects.equals(r"(^?1!1Y1[e1<>B1$)", trace, message);
+  }
+
+  Expects.summarize();
+  asyncEnd();
+}
+
+class Expects {
+  static var _errors = [];
+  static int _tests = 0;
+  static void summarize() {
+    if (_errors.isNotEmpty) {
+      var buffer = StringBuffer();
+      for (var es in _errors) {
+        buffer.writeln("FAILURE:");
+        buffer.writeln(es[0]); // error
+        buffer.writeln(es[1]); // stack trace
+      }
+      ;
+      buffer.writeln("Expectations failed: ${_errors.length}"
+          ", succeeded: ${_tests - _errors.length}");
+      throw ExpectException(buffer.toString());
+    }
+  }
+
+  static void equals(o1, o2, String message) {
+    _tests++;
+    try {
+      Expect.equals(o1, o2, message);
+    } on ExpectException catch (e) {
+      var stack = StackTrace.current;
+      _errors.add([e, stack]);
+    }
+  }
+}
diff --git a/tests/language_2/async_star/async_star_cancel_test.dart b/tests/language_2/async_star/async_star_cancel_test.dart
new file mode 100644
index 0000000..c23c6ba
--- /dev/null
+++ b/tests/language_2/async_star/async_star_cancel_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that stream cancellation is checked immediately after delivering the
+// event, and before continuing after the yield.
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+main() async {
+  asyncStart();
+  var log = [];
+  Stream<int> f() async* {
+    try {
+      log.add("-1");
+      yield 1;
+      log.add("-2");
+      yield 2;
+    } finally {
+      log.add("x");
+    }
+  }
+
+  var completer = Completer();
+  var s;
+  s = f().listen((e) {
+    log.add("+$e");
+    // The `cancel` operation makes all `yield` operations act as returns.
+    // It should make the `finally` block in `f` log an "x",
+    // and nothing else.
+    completer.complete(s.cancel());
+  }, onError: (e) {
+    // Should never be reached, but if it does, we'll make the await
+    // below terminate.
+    completer.complete(new Future.sync(() {
+      Expect.fail("$e");
+    }));
+  }, onDone: () {
+    completer.complete(null);
+  });
+  await completer.future;
+  Expect.listEquals(["-1", "+1", "x"], log, "cancel");
+  asyncEnd();
+}
diff --git a/tests/language_2/async_star/async_star_invalid_test.dart b/tests/language_2/async_star/async_star_invalid_test.dart
new file mode 100644
index 0000000..529cf25
--- /dev/null
+++ b/tests/language_2/async_star/async_star_invalid_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that various invalid uses of `yield` are disallowed.
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+var yield = 42;
+
+main() async {
+  asyncStart();
+  Stream<String> f() async* {
+    // Invalid syntax.
+    yield ("a", "b"); //# 01: compile-time error
+    yield yield "twice"; //# 02: compile-time error
+
+    // Valid but curious syntax.
+    yield throw "throw"; //# 03: runtime error
+
+    // Type error.
+    yield* "one"; //# 04: compile-time error
+
+    label: yield "ok";
+  }
+  var completer = Completer();
+  f().listen(completer.complete, onError: completer.completeError,
+      onDone: () {
+        if (!completer.isCompleted) completer.completeError("not ok?");
+      });
+  Expect.equals("ok", await completer.future);
+  asyncEnd();
+}
diff --git a/tests/language_2/async_star/async_star_test.dart b/tests/language_2/async_star/async_star_test.dart
new file mode 100644
index 0000000..819039e
--- /dev/null
+++ b/tests/language_2/async_star/async_star_test.dart
@@ -0,0 +1,195 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+main() async {
+  asyncStart();
+  // Normal operations.
+  {
+    Stream<int> f() async* {
+      yield 1;
+      yield 2;
+      yield 3;
+    }
+
+    Expect.listEquals([1, 2, 3], await f().toList(), "basic1");
+  }
+
+  {
+    Stream<int> f() async* {
+      yield 1;
+      yield 2;
+      yield 3;
+    }
+
+    var log = [];
+    var completer = Completer();
+    f().listen(log.add,
+        onError: (e) {
+          // Shouldn't be reached.
+          completer.complete(new Future.sync(() {
+            Expect.fail("$e");
+          }));
+        },
+        onDone: () => completer.complete(null));
+    await completer.future;
+    Expect.listEquals([1, 2, 3], log, "basic2");
+  }
+
+  {
+    var log = [];
+    Stream<int> f() async* {
+      log.add("-1");
+      yield 1;
+      log.add("-2");
+      yield 2;
+    }
+
+    await f().forEach((e) {
+      log.add("+$e");
+    });
+    Expect.listEquals(["-1", "+1", "-2", "+2"], log, "basic3");
+  }
+
+  {
+    var log = [];
+    Stream<int> f() async* {
+      log.add("-1");
+      yield 1;
+      log.add("-2");
+      yield 2;
+    }
+
+    await for (var e in f()) {
+      log.add("+$e");
+    }
+    Expect.listEquals(["-1", "+1", "-2", "+2"], log, "basic4");
+  }
+
+  // async
+  {
+    Stream<int> f() async* {
+      yield 1;
+      await Future(() {});
+      yield 2;
+      await Future(() {});
+      yield 3;
+    }
+
+    Expect.listEquals([1, 2, 3], await f().toList(), "async");
+  }
+
+  // Yield*
+  {
+    Stream<int> f(n) async* {
+      yield n;
+      if (n == 0) return;
+      yield* f(n - 1);
+      yield n;
+    }
+
+    Expect.listEquals([3, 2, 1, 0, 1, 2, 3], await f(3).toList(), "yield*");
+  }
+
+  // Errors
+  {
+    var log = [];
+    Stream<int> f() async* {
+      yield 1;
+      throw "error";
+    }
+
+    await f().handleError((e) {
+      log.add(e);
+    }).forEach(log.add);
+    Expect.listEquals([1, "error"], log, "error");
+  }
+
+  {
+    var log = [];
+    Stream<int> f() async* {
+      yield 1;
+      yield* Future<int>.error("error").asStream(); // Emits error as error.
+      yield 3;
+    }
+
+    await f().handleError((e) {
+      log.add(e);
+    }).forEach(log.add);
+    Expect.listEquals([1, "error", 3], log, "error2");
+  }
+
+  // Pause is checked after delivering event.
+  {
+    var log = [];
+    Stream<int> f() async* {
+      log.add("-1");
+      yield 1;
+      log.add("-2");
+      yield 2;
+    }
+
+    var completer = Completer();
+    var s;
+    s = f().listen((e) {
+      log.add("+$e");
+      s.pause(Future(() {}));
+      log.add("++$e");
+    }, onError: (e) {
+      completer.complete(new Future.sync(() {
+        Expect.fail("$e");
+      }));
+    }, onDone: () => completer.complete(null));
+    await completer.future;
+    Expect.listEquals(["-1", "+1", "++1", "-2", "+2", "++2"], log, "pause");
+  }
+
+  // Await for-loop pauses between events.
+  {
+    var log = [];
+    Stream<int> f() async* {
+      log.add("-1");
+      yield 1;
+      log.add("-2");
+      yield 2;
+    }
+
+    await for (var e in f()) {
+      log.add("+$e");
+      await Future(() {}); // One timer tick.
+      log.add("++$e");
+    }
+    Expect.listEquals(["-1", "+1", "++1", "-2", "+2", "++2"], log, "looppause");
+  }
+
+  // Await for-loop break works immediately.
+  {
+    var log = [];
+    Stream<int> f() async* {
+      try {
+        log.add("-1");
+        yield 1;
+        log.add("-2");
+        yield 2;
+        log.add("-3");
+        yield 3;
+      } finally {
+        log.add("x");
+      }
+    }
+
+    await for (var e in f()) {
+      log.add("+$e");
+      await Future(() {}); // One timer tick, pauses function at yield.
+      log.add("++$e");
+      if (e == 2) break;
+    }
+    Expect.listEquals(
+        ["-1", "+1", "++1", "-2", "+2", "++2", "x"], log, "loop-pause-break");
+  }
+  asyncEnd();
+}
diff --git a/tests/language_2/async_star_error_test.dart b/tests/language_2/async_star_error_test.dart
new file mode 100644
index 0000000..4bf2433
--- /dev/null
+++ b/tests/language_2/async_star_error_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "package:expect/async_minitest.dart";
+
+/// Tests for exceptions raised in async*
+main() {
+  test('async* with Stream.first should complete with an error', () async {
+    var expectedStack;
+    Stream<int> foo() async* {
+      try {
+        throw 'oops';
+      } catch (e, s) {
+        expectedStack = s;
+        try {
+          throw 'oops again!';
+        } catch (e2, _) {}
+        await new Future.error(e, s);
+      }
+      yield 42;
+    }
+
+    try {
+      await foo().first;
+      fail('should not get here, an error should be thrown');
+    } catch (e, s) {
+      expect(e, 'oops');
+      expect(s, expectedStack);
+    }
+  });
+}
diff --git a/tests/language_2/cascade_2_test.dart b/tests/language_2/cascade_2_test.dart
index 1742f48..11b2974 100644
--- a/tests/language_2/cascade_2_test.dart
+++ b/tests/language_2/cascade_2_test.dart
@@ -29,6 +29,14 @@
   Expect.equals(b, b.path1[2]);
 
   Expect.equals(2, b.path2.length); // NPE.
+
+  // Regression test for dartdevc comma expressions (js_ast printer did not
+  // generate parentheses around the comma expression).
+  var expectedList = [3, 2, 1];
+  for (var actual in expectedList.toList()..sort()) {
+    Expect.equals(
+        expectedList.removeLast(), actual, "list items should be sorted");
+  }
 }
 
 class Element {
diff --git a/tests/language_2/checked_method_error_order_test.dart b/tests/language_2/checked_method_error_order_test.dart
index c5370cf..04279f8 100644
--- a/tests/language_2/checked_method_error_order_test.dart
+++ b/tests/language_2/checked_method_error_order_test.dart
@@ -22,7 +22,8 @@
       if (e is TypeError) {
         var m = e.message.toString();
         return m.contains("is not a subtype of type 'int'") ||
-            m.contains("is not a subtype of expected type 'int'");
+            m.contains(
+                "Expected a value of type 'int', but got one of type 'String'");
       }
       return false;
     });
diff --git a/tests/language_2/enum_initialization_near_stack_overflow_test.dart b/tests/language_2/enum_initialization_near_stack_overflow_test.dart
new file mode 100644
index 0000000..598b382
--- /dev/null
+++ b/tests/language_2/enum_initialization_near_stack_overflow_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// https://github.com/flutter/flutter/issues/25041
+
+// This test may produce a compile time exception from stack overflow during
+// enum initialization or succeed in enum initialization depending on exactly
+// how much stack is left and used by the compiler. It should never crash nor
+// produce a runtime exception.
+
+enum Fruit {
+  apple,
+  banana,
+}
+
+getFruit() => Fruit.apple;
+
+recurse() {
+  try {
+    recurse();
+  } catch (e, st) {
+    print("$e ${getFruit()}");
+  }
+}
+
+main() {
+  try {
+    recurse();
+  } on StackOverflowError catch (e) {
+    // Swallow.
+  }
+}
diff --git a/tests/language_2/factory_and_instance_variable_test.dart b/tests/language_2/factory_and_instance_variable_test.dart
new file mode 100644
index 0000000..97f92f9
--- /dev/null
+++ b/tests/language_2/factory_and_instance_variable_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+abstract class A {
+  var bar;
+  factory A.bar() = B.bar;
+
+  get foo => bar;
+  static get baz => bar; //# 01: compile-time error
+}
+
+class B implements A {
+  var bar;
+  factory B.bar() => new C.bar();
+
+  get foo => bar;
+  static get baz => bar; //# 02: compile-time error
+
+  B() {}
+}
+
+class C extends B {
+  C.bar() {
+    bar = "foo";
+  }
+
+  static get baz => bar; //# 03: compile-time error
+}
+
+main() {
+  assert(new A.bar().foo == "foo");
+  assert(new B.bar().foo == "foo");
+  assert(new C.bar().foo == "foo");
+  assert(new A.bar().bar == "foo");
+  assert(new B.bar().bar == "foo");
+  assert(new C.bar().bar == "foo");
+}
diff --git a/tests/language_2/function_type_parameter_bound_object_test.dart b/tests/language_2/function_type_parameter_bound_object_test.dart
new file mode 100644
index 0000000..ba58f75
--- /dev/null
+++ b/tests/language_2/function_type_parameter_bound_object_test.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+Q hest<Q>(dynamic x) {
+  if (x is Q) return x;
+  return null;
+}
+
+Q Function<Q>(dynamic) pony = hest;
+Q Function<Q extends Object>(dynamic) zebra = hest;
+
+main() {
+  hest(42).fisk(); //# 01: runtime error
+  pony(42).fisk(); //# 02: runtime error
+  zebra(42).fisk(); //# 03: compile-time error
+}
diff --git a/tests/language_2/issue34489_test.dart b/tests/language_2/issue34489_test.dart
new file mode 100644
index 0000000..59553a3
--- /dev/null
+++ b/tests/language_2/issue34489_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C<T> {
+  var field = T;
+}
+
+main() {
+  new C().field = 'bad'; //# 01: compile-time error
+}
diff --git a/tests/language_2/issue34495_test.dart b/tests/language_2/issue34495_test.dart
new file mode 100644
index 0000000..e599403
--- /dev/null
+++ b/tests/language_2/issue34495_test.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+final foo = A<B>.foo(); //# 01: compile-time error
+
+main() {}
diff --git a/tests/language_2/issue35043_test.dart b/tests/language_2/issue35043_test.dart
new file mode 100644
index 0000000..95c5f13
--- /dev/null
+++ b/tests/language_2/issue35043_test.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+final foo = Map<int>(); //# 01: compile-time error
+
+main() {}
diff --git a/tests/language_2/issue35090_test.dart b/tests/language_2/issue35090_test.dart
new file mode 100644
index 0000000..3e3c564
--- /dev/null
+++ b/tests/language_2/issue35090_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class A {
+  int get g => 0;
+}
+
+class C implements A {
+  noSuchMethod(Invocation i) {
+    return 1;
+  }
+}
+
+mixin M on A {
+  int test() {
+    return super.g;
+  }
+
+  noSuchMethod(Invocation i) {
+    return 2;
+  }
+}
+
+class MA extends C with M {}
+
+main() {
+  Expect.equals(new MA().g, 2);
+  Expect.equals(new MA().test(), 2);
+}
diff --git a/tests/language_2/issue_34091.dart b/tests/language_2/issue_34091.dart
new file mode 100644
index 0000000..5756024
--- /dev/null
+++ b/tests/language_2/issue_34091.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests that stack traces from data URIs don't contain the entire URI, and
+// instead just have the substitute file name: <data:application/dart>
+
+import "dart:isolate";
+import "package:expect/expect.dart";
+import 'dart:async';
+
+void main() {
+  // This data URI encodes:
+  /*
+    import "dart:isolate";
+    void main(_, p){
+      try {
+        throw("Hello World");
+      } catch (e, s) {
+        p.send("$e\n$s");
+      }
+    }
+  */
+  final uri = Uri.parse(
+      "data:application/dart;charset=utf8,import%20%22dart%3Aisolate%22%3Bvoi" +
+          "d%20main(_%2Cp)%7Btry%7Bthrow(%22Hello%20World%22)%3B%7Dcatch(e%2C" +
+          "%20s)%7Bp.send(%22%24e%5Cn%24s%22)%3B%7D%7D");
+  ReceivePort port = new ReceivePort();
+  Isolate.spawnUri(uri, [], port.sendPort);
+  port.listen((trace) {
+    // Test that the trace contains the exception message.
+    Expect.isTrue(trace.contains("Hello World"));
+
+    // Test that the trace contains data URI substitute.
+    Expect.isTrue(trace.contains("<data:application/dart>"));
+
+    // Test that the trace doesn't contain any leftover URL encoded junk.
+    Expect.isFalse(trace.contains("%20"));
+
+    port.close();
+  });
+}
diff --git a/tests/language_2/labeled_variable_declaration_test.dart b/tests/language_2/labeled_variable_declaration_test.dart
new file mode 100644
index 0000000..6dede5a
--- /dev/null
+++ b/tests/language_2/labeled_variable_declaration_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  L:
+  var x, y;
+  x = 42;
+  y = x;
+}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 5622608..4f4d666 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -54,7 +54,6 @@
 type_checks_in_factory_method_test: SkipByDesign # Requires checked mode.
 
 [ $fasta ]
-mixin_declaration/mixin_declaration_invalid_syntax_test/none: CompileTimeError # because mixin declarations get (invalid) forwarding constructors
 partial_instantiation_static_bounds_check_test/01: MissingCompileTimeError # Issue 34327
 partial_instantiation_static_bounds_check_test/02: MissingCompileTimeError # Issue 34327
 partial_instantiation_static_bounds_check_test/03: MissingCompileTimeError # Issue 34327
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 5d74bcc..fa02ab6 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -11,10 +11,8 @@
 accessor_conflict_import_prefixed2_test: CompileTimeError # Issue 25626
 accessor_conflict_import_prefixed_test: CompileTimeError # Issue 25626
 accessor_conflict_import_test: CompileTimeError # Issue 25626
-additional_interface_adds_optional_args_test: CompileTimeError # Issue #30568
 cascaded_forwarding_stubs_test: CompileTimeError # Issue 34329
 config_import_corelib_test: CompileTimeError, StaticWarning, OK # failing-by-design: Will never pass, see Issue #34332
-conflicting_generic_interfaces_hierarchy_loop_infinite_test: Skip # Issue #34333 (loops forever)
 const_cast2_test/01: CompileTimeError # failing-by-design: Not a const expression, see Issue #34334
 const_cast2_test/none: CompileTimeError # failing-by-design: Not a const expression, see Issue #34334
 const_constructor3_test/04: MissingCompileTimeError # Side-effect of working around issue 33441 for int-to-double
@@ -73,12 +71,10 @@
 large_class_declaration_test: Slow, Pass
 malformed2_test: Pass, MissingCompileTimeError # Flaky: issue 31056.
 mixin_declaration/mixin_declaration_factory_test/02: Crash # Issue 34809
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError # Issue 30552
 mixin_method_override_test/01: MissingCompileTimeError
 mixin_super_2_test: CompileTimeError
 mixin_super_use_test: CompileTimeError
 mock_writable_final_private_field_test: CompileTimeError # failing-by-design, see Issue #34377
-multiple_interface_inheritance_test: CompileTimeError # Issue 30552
 nested_generic_closure_test: CompileTimeError # Issue #28515
 no_main_test/01: Fail # failing-by-design, the analyzer has no restriction that a library include a main function.
 no_such_constructor2_test: StaticWarning
@@ -95,17 +91,12 @@
 regress_29025_test: CompileTimeError # Issue 29081
 regress_29405_test: CompileTimeError # Issue 29421
 regress_29784_test/02: MissingCompileTimeError # Issue 29784
-regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError
 regress_33479_test/01: Crash # Issue #33479
 setter3_test/01: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
 setter3_test/02: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
-string_split_test: CompileTimeError
-string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_no_such_method1_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
-super_no_such_method2_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
-super_no_such_method3_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
+super_call4_test/01: MissingCompileTimeError
 super_setter_test: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
 syntax_test/60: MissingCompileTimeError
 syntax_test/61: MissingCompileTimeError
@@ -126,10 +117,13 @@
 vm/debug_break_vm_test/*: Skip
 vm/reflect_core_vm_test: CompileTimeError # Issue 33994
 vm/regress_27201_test: SkipByDesign # Loads bad library, so will always crash.
+vm/regression_32912_test/01: MissingCompileTimeError # Issue 32912
+vm/regression_32912_test/02: MissingCompileTimeError # Issue 32912
+vm/regression_32912_test/03: MissingCompileTimeError # Issue 32912
 void/return_future_future_or_void_async_error1_test/none: CompileTimeError # issue #34319
 void/return_future_or_future_or_void_sync_error2_test/none: CompileTimeError # issue #34319
 void/return_future_or_void_sync_error4_test/none: CompileTimeError # issue #34319
-void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError
+void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError # issue 35508
 web_int_literals_test/01: MissingCompileTimeError
 web_int_literals_test/02: MissingCompileTimeError
 web_int_literals_test/03: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index a99dd0f..afc42ff 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -5,6 +5,8 @@
 
 [ $compiler == dart2js ]
 arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+async_star/async_star_await_for_test: RuntimeError
+async_star/async_star_cancel_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError # Issue 22853
 bit_operations_test: RuntimeError, OK # non JS number semantics
 bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -18,8 +20,6 @@
 call_method_must_not_be_getter_test/03: RuntimeError # Issue 32155
 config_import_corelib_test: CompileTimeError # we need a special platform.dill file for categories=all. Once we fix that, all dart:* are supported when using '--categories=all' so this will become a RuntimeError, OK.
 config_import_test: RuntimeError # Test flag is not passed to the compiler.
-const_constructor_mixin3_test: CompileTimeError # Issue 33644.
-const_constructor_mixin_test: CompileTimeError # Issue 33644.
 const_constructor_nonconst_param_test/01: MissingCompileTimeError
 const_dynamic_type_literal_test/03: Pass # but it shouldn't until we fix issue 17207
 deopt_inlined_function_lazy_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -46,6 +46,7 @@
 int64_literal_test/19: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 int64_literal_test/none: RuntimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 issue23244_test: RuntimeError # Isolates - enum canonicalization - Issue 23244
+library_env_test/has_io_support: RuntimeError, OK # dart2js doesn't support io when compiling on --categories=Client
 library_env_test/has_mirror_support: RuntimeError, OK
 library_env_test/has_no_html_support: RuntimeError, OK
 list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
@@ -59,6 +60,7 @@
 partial_tearoff_instantiation_test/07: Pass # for the wrong reason.
 partial_tearoff_instantiation_test/08: Pass # for the wrong reason.
 private_method_tearoff_test: RuntimeError
+type_constants_test/none: RuntimeError # Issue 35052
 vm/*: SkipByDesign # Tests for the VM.
 
 [ $compiler != dart2js ]
@@ -77,6 +79,8 @@
 override_field_test/02: Pass, Slow # TODO(kasperl): Please triage.
 
 [ $compiler == dart2js && $runtime == d8 ]
+conditional_import_string_test: SkipByDesign # No XHR in d8
+conditional_import_test: SkipByDesign # No XHR in d8
 implicit_creation/implicit_new_constructor_generic_test: Pass
 
 [ $compiler == dart2js && $runtime == d8 && !$checked ]
@@ -115,12 +119,6 @@
 [ $compiler == dart2js && $system == windows ]
 string_literals_test: Pass, RuntimeError # Failures on dart2js-win7-chrome-4-4-be and dart2js-win7-ie11ff-4-4-be
 
-[ $compiler == dart2js && $browser ]
-library_env_test/has_io_support: RuntimeError, OK # dart2js doesn't support io when compiling on --categories=Client
-
-[ $compiler == dart2js && !$browser ]
-library_env_test/has_no_io_support: RuntimeError, OK # dart2js supports io when using '--categories=all'.
-
 [ $compiler == dart2js && $checked ]
 covariant_subtyping_test: CompileTimeError
 
@@ -398,7 +396,6 @@
 covariant_subtyping_test: RuntimeError
 issue23244_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
 library_env_test/has_no_html_support: RuntimeError
-library_env_test/has_no_io_support: RuntimeError
 map_literal3_test/03: MissingCompileTimeError
 partial_tearoff_instantiation_test/05: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
 partial_tearoff_instantiation_test/06: Crash # Assertion failure: kind=special,memberName=instantiate,callStructure:CallStructure(arity=0, types=1)
@@ -591,8 +588,6 @@
 stacktrace_rethrow_error_test/none: RuntimeError # Issue 12698
 stacktrace_rethrow_error_test/withtraceparameter: RuntimeError # Issue 12698
 stacktrace_rethrow_nonerror_test: RuntimeError # Issue 12698
-string_split_test: CompileTimeError
-string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_call4_test/01: MissingCompileTimeError
 super_test: RuntimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index ebdd2ea..310f9a1 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -10,8 +10,10 @@
 accessor_conflict_import_prefixed2_test: CompileTimeError # Issue 25626
 accessor_conflict_import_prefixed_test: CompileTimeError # Issue 25626
 accessor_conflict_import_test: CompileTimeError # Issue 25626
-additional_interface_adds_optional_args_test: CompileTimeError # Issue #30568
 assertion_test: RuntimeError # Issue 30326; Expect.equals(expected: <1>, actual: <0>) fails.
+async_star/async_star_await_for_test: RuntimeError
+async_star/async_star_cancel_test: RuntimeError
+async_star/async_star_test: RuntimeError
 async_star_test/01: RuntimeError
 async_star_test/03: RuntimeError
 async_star_test/04: RuntimeError
@@ -25,14 +27,9 @@
 built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 28816
 cascaded_forwarding_stubs_generic_test: RuntimeError
 cascaded_forwarding_stubs_test: CompileTimeError
-conflicting_generic_interfaces_hierarchy_loop_infinite_test: Skip # Crashes or times out
-conflicting_generic_interfaces_simple_test: MissingCompileTimeError
 const_cast2_test/01: CompileTimeError
 const_cast2_test/none: CompileTimeError
 const_constructor3_test/04: MissingCompileTimeError # Side-effect of working around issue 33441 for int-to-double
-const_constructor_mixin3_test/01: MissingCompileTimeError # Issue 33644
-const_constructor_mixin_test/01: MissingCompileTimeError # Issue 33644
-covariance_field_test/03: RuntimeError
 covariant_override/tear_off_type_test: RuntimeError # Issue 28395
 covariant_subtyping_with_mixin_test: CompileTimeError # Issue 34329
 deferred_load_library_wrong_args_test/01: MissingRuntimeError, RuntimeError # Issue 29920
@@ -87,7 +84,7 @@
 invalid_returns/sync_invalid_return_03_test/none: CompileTimeError # issue #34319
 invalid_returns/sync_invalid_return_04_test/none: CompileTimeError # issue #34319
 invalid_returns/sync_invalid_return_05_test/none: CompileTimeError # issue #34319
-issue31596_implement_covariant_test: CompileTimeError
+issue31596_implement_covariant_test: CompileTimeError # Issue #31596
 issue31596_override_test/01: CompileTimeError
 issue31596_override_test/02: CompileTimeError
 issue31596_override_test/03: CompileTimeError
@@ -101,15 +98,14 @@
 issue31596_test: CompileTimeError
 issue34498_test: MissingCompileTimeError # Issue 34500
 label_test: RuntimeError
+labeled_variable_declaration_test: RuntimeError
 large_class_declaration_test: Slow, Pass
 left_shift_test: RuntimeError # Ints and doubles are unified.
 mixin_declaration/mixin_declaration_factory_test/02: Crash
-mixin_declaration/mixin_declaration_invalid_superinvocation_test/10: CompileTimeError # Analyzer chooses wrong(?) super method.
 mixin_method_override_test/01: MissingCompileTimeError
 mixin_super_2_test: CompileTimeError # Issue 34806
 mixin_super_use_test: CompileTimeError # Issue 34806
 mock_writable_final_private_field_test: CompileTimeError # Issue 30848
-multiple_interface_inheritance_test: CompileTimeError # Issue 30552
 nested_generic_closure_test: CompileTimeError
 override_inheritance_field_test/42: CompileTimeError
 part_of_multiple_libs_test/01: MissingCompileTimeError
@@ -124,18 +120,13 @@
 regress_29405_test: CompileTimeError # Issue 29421
 regress_29784_test/02: Crash # assert initializers not implemented
 regress_29784_test/02: MissingCompileTimeError
-regress_30121_test: CompileTimeError # Issue 31087
 regress_30339_test: CompileTimeError # As expected. Should we make this a multi test?
 regress_33479_test/01: Crash # Issue #33479
 setter3_test/01: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
 setter3_test/02: CompileTimeError # Invalid test, see https://github.com/dart-lang/sdk/issues/33837
 stacktrace_test: RuntimeError # Issue 29920
-string_split_test: CompileTimeError
-string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
-super_no_such_method1_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
-super_no_such_method2_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
-super_no_such_method3_test: CompileTimeError # Invalid test, probably, see https://github.com/dart-lang/sdk/issues/33963
+super_call4_test/01: MissingCompileTimeError
 super_operator_index5_test: RuntimeError # 33470
 super_operator_index7_test: RuntimeError # 33470
 super_operator_index8_test: RuntimeError # 33470
@@ -161,6 +152,8 @@
 void/void_type_usage_test/final_local_for_in2: MissingCompileTimeError
 
 [ $compiler == dartdevk ]
+async_star/async_star_cancel_test: RuntimeError
+async_star/async_star_test: RuntimeError
 built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 30450, test name contains hyphen
 built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 30450, test name contains hyphen
@@ -181,13 +174,9 @@
 compile_time_constant_static5_test/16: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/21: CompileTimeError # Issue 31537
 compile_time_constant_static5_test/23: CompileTimeError # Issue 31537
-conditional_import_string_test: CompileTimeError # Test is broken
-conditional_import_test: CompileTimeError # Test is broken
 config_import_test: RuntimeError
 const_cast1_test/02: MissingCompileTimeError
 const_constructor3_test/04: MissingCompileTimeError
-const_constructor_mixin3_test: CompileTimeError # Issue 33644.
-const_constructor_mixin_test: CompileTimeError # Issue 33644.
 const_constructor_nonconst_field_test/01: MissingCompileTimeError
 const_constructor_nonconst_param_test/01: MissingCompileTimeError
 const_dynamic_type_literal_test/02: MissingCompileTimeError
@@ -231,7 +220,6 @@
 map_literal3_test/01: MissingCompileTimeError
 map_literal3_test/02: MissingCompileTimeError
 map_literal3_test/03: MissingCompileTimeError
-mixin_declaration/mixin_declaration_invalid_syntax_test/none: CompileTimeError
 mixin_declaration/mixin_declaration_subtype_test: RuntimeError
 mixin_illegal_super_use_test/01: MissingCompileTimeError
 mixin_illegal_super_use_test/04: MissingCompileTimeError
@@ -287,8 +275,6 @@
 regress_30339_test: RuntimeError # Uncaught Expect.isTrue(false) fails.
 regress_30339_test: CompileTimeError
 setter_no_getter_test/01: CompileTimeError
-string_split_test: CompileTimeError # Issue 31616
-string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_call4_test/01: MissingCompileTimeError
 switch_bad_case_test/01: MissingCompileTimeError
@@ -322,6 +308,7 @@
 [ $compiler == dartdevc || $compiler == dartdevk ]
 arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 async_covariant_type_test: RuntimeError # Check too late
+async_star/async_star_await_for_test: RuntimeError
 async_star_cancel_while_paused_test: RuntimeError # Issue 29920; Uncaught Expect.listEquals(list length, expected: <4>, actual: <3>) fails: Next element <*3>
 async_star_pause_test: RuntimeError # Uncaught Expect.listEquals(at index 2, expected: <0+>, actual: <0!>) fails
 async_star_test/02: RuntimeError
@@ -346,10 +333,7 @@
 const_switch_test/02: RuntimeError # Issue 29920; Expect.equals(expected: <0>, actual: <0.0>) fails.
 const_switch_test/04: RuntimeError # Ints and doubles are unified.; Expect.equals(expected: <1>, actual: <1.0>) fails.
 constructor12_test: RuntimeError # Issue 29920; ReferenceError: JSArrayOfT is not defined
-covariance_field_test/04: RuntimeError
-covariance_field_test/05: RuntimeError
 ct_const_test: RuntimeError # Issue 2992; RangeError: Maximum call stack size exceeded
-custom_await_stack_trace_test: RuntimeError # Issue 29920; Uncaught Expect.equals(at index 0: Expected <Blah \x0ABloop\x0ABleep\x0A...>
 cyclic_type2_test: RuntimeError # Issue 29920; Uncaught ReferenceError: V is not defined
 cyclic_type_test/02: RuntimeError # Issue 29920; Uncaught RangeError: Maximum call stack size exceeded
 cyclic_type_test/03: RuntimeError # Issue 29920; Uncaught ReferenceError: U is not defined
diff --git a/tests/language_2/language_2_flutter.status b/tests/language_2/language_2_flutter.status
index 852a610..aa28d79 100644
--- a/tests/language_2/language_2_flutter.status
+++ b/tests/language_2/language_2_flutter.status
@@ -4,9 +4,6 @@
 # Sections in this file should contain "$runtime == flutter".
 # What tests does this comment apply to?  Please add it to each test's line
 # or file an issue an put it there, and add the issue to the relevant tests:
-# flutter uses --error_on_bad_type and --await_is_keyword so the following tests
-# fail with a Compilation Error.
-# Note that --error_on_bad_override is ignored in strong mode.
 
 [ $runtime == flutter ]
 async_await_syntax_test/a05c: CompileTimeError
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index 9bb75b0..03b555e 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -3,12 +3,8 @@
 # BSD-style license that can be found in the LICENSE file.
 # Sections in this file should contain "$compiler == dartk" or
 # "$compiler == dartkp".
-#
-# Note: Sections in this file are normalized so we can update them with
-# automated tools. Please add any new status lines affecting those two compilers
-# in the existing sections, if possible keep the alphabetic ordering. If we are
-# missing a section you need, please reach out to sigmund@ to see the best way
-# to add them.
+
+enum_initialization_near_stack_overflow_test: Pass, CompileTimeError, OK
 
 [ $compiler == app_jitk ]
 assertion_initializer_const_error2_test/cc01: MissingCompileTimeError
@@ -130,8 +126,6 @@
 regress_29405_test: CompileTimeError
 regress_30339_test: CompileTimeError
 string_interpolation_and_buffer_test: RuntimeError
-string_split_test: CompileTimeError
-string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 super_test: RuntimeError
 type_alias_equality_test/03: RuntimeError # Issue 32783
@@ -148,6 +142,7 @@
 type_promotion_functions_test/none: CompileTimeError
 type_promotion_more_specific_test/04: CompileTimeError
 vm/bool_check_stack_traces_test/02: RuntimeError # Issue 33584
+vm/regress_27671_test: SkipByDesign # Relies on string comparison of exception message which may return '<optimized out>'
 vm/type_cast_vm_test: RuntimeError
 web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
 
@@ -171,8 +166,12 @@
 assertion_initializer_const_error2_test/cc08: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc09: MissingCompileTimeError
 assertion_initializer_const_error2_test/cc10: MissingCompileTimeError
+async_await_syntax_test/e5: Crash # Assertion error: continuation.dart: Failed assertion: 'node.expression == null || node.expression is NullLiteral': is not true.
+async_await_syntax_test/e6: Crash # Assertion error: continuation.dart: Failed assertion: 'node.expression == null || node.expression is NullLiteral': is not true.
 const_cast1_test/02: MissingCompileTimeError
 const_constructor_nonconst_param_test/01: MissingCompileTimeError
+constructor5_test: CompileTimeError # Verification error
+constructor6_test: CompileTimeError # Verification error
 implicit_creation/implicit_const_not_default_values_test/e1: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e10: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e11: MissingCompileTimeError
@@ -193,18 +192,20 @@
 implicit_creation/implicit_const_not_default_values_test/e5: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e7: MissingCompileTimeError
 implicit_creation/implicit_const_not_default_values_test/e8: MissingCompileTimeError
+mixin_method_override_test/G4: Crash # Assertion error: mixin_full_resolution.dart': 'src.typeParameters.length == dst.typeParameters.length': is not true.
 vm/regress_33469_test/01: MissingCompileTimeError
 vm/regress_33469_test/02: MissingCompileTimeError
 vm/regress_33469_test/03: MissingCompileTimeError
 vm/regress_33469_test/04: MissingCompileTimeError
+vm/regression_32912_test/01: MissingCompileTimeError
+vm/regression_32912_test/02: MissingCompileTimeError
+vm/regression_32912_test/03: MissingCompileTimeError
 web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
 
 [ $fasta ]
 async_return_types_test/nestedFuture: MissingCompileTimeError # Issue 33068
 const_cast2_test/01: CompileTimeError # Issue 32517
 const_cast2_test/none: CompileTimeError # Issue 32517
-const_constructor_mixin3_test: CompileTimeError # Issue 33644.
-const_constructor_mixin_test: CompileTimeError # Issue 33644.
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_inheritance_constraints_test/mixin: MissingCompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
@@ -226,6 +227,16 @@
 mixin_declaration/mixin_declaration_superinvocation_application_test/08: MissingCompileTimeError
 mixin_method_override_test/G5: Crash # Issue 34354
 regress_22976_test/*: CompileTimeError # Issue 31935
+set_literals/invalid_set_literal_test/08: MissingCompileTimeError # Requires constant evaluation
+set_literals/invalid_set_literal_test/09: MissingCompileTimeError # Requires constant evaluation
+set_literals/invalid_set_literal_test/10: MissingCompileTimeError # Requires constant evaluation
+set_literals/invalid_set_literal_test/23: MissingCompileTimeError # Exact types
+set_literals/invalid_set_literal_test/29: MissingCompileTimeError # Requires constant evaluation
+set_literals/invalid_set_literal_test/30: MissingCompileTimeError # Requires constant evaluation
+set_literals/invalid_set_literal_test/31: MissingCompileTimeError # Requires constant evaluation
+set_literals/invalid_set_literal_test/32: MissingCompileTimeError # Requires constant evaluation
+set_literals/invalid_set_literal_test/33: MissingCompileTimeError # Requires constant evaluation
+set_literals/invalid_set_literal_test/34: MissingCompileTimeError # Requires constant evaluation
 syntax_test/28: MissingCompileTimeError # Issue 29763 - low priority
 syntax_test/29: MissingCompileTimeError # Issue 29763 - low priority
 syntax_test/30: MissingCompileTimeError # Issue 29763 - low priority
@@ -234,6 +245,7 @@
 syntax_test/33: MissingCompileTimeError # Issue 29763 - low priority
 syntax_test/60: MissingCompileTimeError # Issue 30470
 syntax_test/61: MissingCompileTimeError # Issue 30470
+type_constants_test/04: MissingCompileTimeError # Issue 32557
 vm/debug_break_enabled_vm_test/01: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/debug_break_enabled_vm_test/none: CompileTimeError # KernelVM bug: Bad test using extended break syntax.
 vm/regress_27201_test: CompileTimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
@@ -262,9 +274,6 @@
 vm/causal_async_exception_stack2_test: RuntimeError
 vm/causal_async_exception_stack_test: RuntimeError
 
-[ $compiler == app_jitk && ($mode == debug || $mode == release) ]
-assertion_test: RuntimeError
-
 [ $compiler != app_jitk && $compiler != dart2analyzer && $compiler != dart2js && $compiler != dartk && $compiler != dartkb && $compiler != dartkp && $fasta ]
 const_optional_args_test/01: MissingCompileTimeError
 
@@ -316,6 +325,9 @@
 [ $compiler != dart2js && $compiler != dartdevk && $fasta ]
 const_native_factory_test: MissingCompileTimeError # Issue 29763
 
+[ $compiler != dart2js && $fasta ]
+type_constants_test/01: MissingCompileTimeError # Issue 32557
+
 [ $compiler == dartk && $runtime == vm && !$checked && $strong ]
 assertion_initializer_const_error2_test/cc01: MissingCompileTimeError # Not reporting failed assert() at compile time.
 assertion_initializer_const_error2_test/cc02: MissingCompileTimeError # Not reporting failed assert() at compile time.
@@ -336,11 +348,13 @@
 const_dynamic_type_literal_test/02: Pass
 map_literal3_test/01: Pass
 map_literal3_test/02: Pass
-vm/bool_check_stack_traces_test/01: RuntimeError # No support for line numbers in stacktraces
-vm/bool_check_stack_traces_test/none: RuntimeError # No support for line numbers in stacktraces
-vm/causal_async_exception_stack2_test: RuntimeError # No support for line numbers in stacktraces
-vm/causal_async_exception_stack_test: RuntimeError # No support for line numbers in stacktraces
-vm/regress_28325_test: RuntimeError # No support for line numbers in stacktraces
+vm/bool_check_stack_traces_test/02: Pass
+vm/causal_async_exception_stack2_test: RuntimeError # Please triage
+vm/causal_async_exception_stack_test: RuntimeError # Please triage
+
+[ $compiler != dartkb && $compiler != dartkp && $fasta ]
+vm/symbols_test/01: MissingCompileTimeError
+vm/symbols_test/03: MissingCompileTimeError
 
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
 external_test/13: Crash
@@ -399,6 +413,13 @@
 assertion_initializer_const_error2_test/cc11: Crash
 async_await_test: RuntimeError
 async_return_types_test/nestedFuture: Fail
+async_star/async_star_cancel_test: DartkCrash
+async_star/async_star_invalid_test/01: DartkCrash
+async_star/async_star_invalid_test/02: DartkCrash
+async_star/async_star_invalid_test/03: DartkCrash
+async_star/async_star_invalid_test/04: DartkCrash
+async_star/async_star_invalid_test/none: DartkCrash
+async_star/async_star_test: DartkCrash
 compile_time_constant_checked_test/02: MissingCompileTimeError
 covariance_type_parameter_test/01: RuntimeError
 covariance_type_parameter_test/02: RuntimeError
@@ -597,8 +618,6 @@
 setter_no_getter_test/01: Pass, CompileTimeError # Issue 31533 (started passing after switching to batch-mode)
 stacktrace_demangle_ctors_test: RuntimeError
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
-string_split_test: CompileTimeError # Issue 31616
-string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_test: Fail, OK
 syntax_test/00: MissingCompileTimeError
@@ -616,8 +635,6 @@
 vm/causal_async_exception_stack2_test: SkipByDesign
 vm/causal_async_exception_stack_test: SkipByDesign
 vm/closure_memory_retention_test: Skip # KernelVM bug: Hits OOM
-vm/optimized_stacktrace_test: Crash
-vm/optimized_stacktrace_test: Skip # Issue 30198
 vm/reflect_core_vm_test: SkipByDesign
 vm/regress_27671_test: Skip # Unsupported
 vm/regress_29145_test: Skip # Issue 29145
@@ -721,8 +738,6 @@
 regress_29405_test: CompileTimeError
 regress_30339_test: CompileTimeError
 setter_no_getter_test/01: CompileTimeError
-string_split_test: CompileTimeError
-string_supertype_checked_test: CompileTimeError
 super_bound_closure_test/none: CompileTimeError
 try_catch_test/01: MissingCompileTimeError
 type_promotion_functions_test/02: CompileTimeError
@@ -985,7 +1000,7 @@
 [ $mode == debug && ($compiler == dartk || $compiler == dartkb) && ($hot_reload || $hot_reload_rollback) ]
 enum_duplicate_test/02: Crash # Issue 34606
 enum_duplicate_test/none: Pass, Crash # Issue 34606
-enum_private_test/01: Crash # Issue 34606
+enum_private_test/01: Pass, Crash # Issue 34606
 enum_test: Crash # Issue 34606
 
 [ $mode == product && $runtime == vm && ($compiler == dartk || $compiler == dartkb) ]
@@ -1043,8 +1058,6 @@
 conditional_import_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 config_import_corelib_test: CompileTimeError # Issue 31533
 config_import_test: RuntimeError # KernelVM bug: Configurable imports.
-const_constructor_mixin3_test: CompileTimeError # Issue 33644.
-const_constructor_mixin_test: CompileTimeError # Issue 33644.
 const_dynamic_type_literal_test/02: RuntimeError # KernelVM bug: Constant map duplicated key.
 const_list_test: RuntimeError
 const_locals_test: RuntimeError
@@ -1065,7 +1078,7 @@
 deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
 deferred_redirecting_factory_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
 deferred_static_seperate_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
-disassemble_test: Pass, Slow
+disassemble_test: Pass, Slow, Crash # dartbug.com/34971
 dynamic_prefix_core_test/none: CompileTimeError
 emit_const_fields_test: CompileTimeError # Issue 31533
 example_constructor_test: Fail, OK
@@ -1124,8 +1137,6 @@
 regress_29405_test: CompileTimeError # Issue 31402 (Invocation arguments)
 regress_30339_test: CompileTimeError # Issue 31402 (Variable declaration)
 string_interpolation_and_buffer_test: RuntimeError # Issue 31402 (Return and yield statements)
-string_split_test: CompileTimeError # Issue 31616
-string_supertype_checked_test: CompileTimeError # Issue 31616
 super_bound_closure_test/none: CompileTimeError # Issue 31533
 super_call4_test/01: MissingCompileTimeError
 super_test: Fail, OK
@@ -1980,6 +1991,11 @@
 async_star_test/04: Skip # Timeout
 async_star_test/05: Skip # Timeout
 async_star_test/none: Skip # Timeout
+type_constants_test/none: Skip # Deferred libraries and hot reload.
 
 [ $compiler == dartk || $compiler == dartkb || $compiler == dartkp ]
 generic_function_bounds_test: RuntimeError # Issue 32076
+
+[ $compiler == dartkb || $compiler == dartkp ]
+mock_writable_final_private_field_test: CompileTimeError # Test uses Symbol("_...") which is a compile-time error.
+vm/reflect_core_vm_test: CompileTimeError # Test uses Symbol("_...") which is a compile-time error.
diff --git a/tests/language_2/language_2_precompiled.status b/tests/language_2/language_2_precompiled.status
index c813c7b..7416230 100644
--- a/tests/language_2/language_2_precompiled.status
+++ b/tests/language_2/language_2_precompiled.status
@@ -13,6 +13,20 @@
 [ $compiler != dart2analyzer && $runtime == dart_precompiled ]
 mixin_mixin2_test: Skip
 
+[ $compiler == dartkp && $runtime == dart_precompiled ]
+async_star/async_star_await_for_test: RuntimeError
+async_star/async_star_cancel_test: RuntimeError
+async_star/async_star_test: RuntimeError
+
+[ $compiler == precompiler && $runtime == dart_precompiled ]
+async_star/async_star_await_for_test: RuntimeError
+async_star/async_star_cancel_test: RuntimeError
+async_star/async_star_invalid_test/01: MissingCompileTimeError
+async_star/async_star_invalid_test/02: MissingCompileTimeError
+async_star/async_star_invalid_test/04: MissingCompileTimeError
+async_star/async_star_invalid_test/none: RuntimeError
+async_star/async_star_test: RuntimeError
+
 [ $runtime == dart_precompiled && $minified ]
 cyclic_type_test/*: Skip
 enum_duplicate_test/*: Skip # Uses Enum.toString()
diff --git a/tests/language_2/language_2_vm.status b/tests/language_2/language_2_vm.status
index 8bcfb7a4c..47d27f2 100644
--- a/tests/language_2/language_2_vm.status
+++ b/tests/language_2/language_2_vm.status
@@ -15,6 +15,13 @@
 assertion_initializer_const_error2_test/cc09: MissingCompileTimeError # Not reporting failed assert() at compile time.
 assertion_initializer_const_error2_test/cc10: MissingCompileTimeError # Not reporting failed assert() at compile time.
 assertion_initializer_const_error2_test/cc11: MissingCompileTimeError # Not reporting failed assert() at compile time.
+set_literals/*: Skip
+
+[ $runtime == vm ]
+async_star/async_star_await_for_test: RuntimeError
+async_star/async_star_cancel_test: RuntimeError
+async_star/async_star_test: RuntimeError
+set_literals/*: Skip
 
 [ $arch == arm64 && $runtime == vm ]
 closure_cycles_test: Pass, Slow
diff --git a/tests/language_2/mixin_super_test.dart b/tests/language_2/mixin_super_test.dart
index 75ad654..77f72d6 100644
--- a/tests/language_2/mixin_super_test.dart
+++ b/tests/language_2/mixin_super_test.dart
@@ -54,6 +54,25 @@
   }
 }
 
+abstract class Base {
+  static String log = '';
+  Base() {
+    log += 'Base()\n';
+  }
+}
+
+mixin Foo on Base {
+  var x = Base.log += 'Foo.x\n';
+}
+
+mixin Bar on Base {
+  var y = Base.log += 'Bar.y\n';
+}
+
+class Derived extends Base with Foo, Bar {
+  String get log => Base.log;
+}
+
 main() {
   Expect.equals(
       "S<int,String,bool>.foo\n"
@@ -77,4 +96,9 @@
       "N<bool>.foo\n"
       "MNA3<int, String, bool>.foo\n",
       MNA3<int, String, bool>().foo());
+  Expect.equals(
+      "Bar.y\n"
+      "Foo.x\n"
+      "Base()\n",
+      Derived().log);
 }
diff --git a/tests/language_2/regress_35258_test.dart b/tests/language_2/regress_35258_test.dart
new file mode 100644
index 0000000..d875985
--- /dev/null
+++ b/tests/language_2/regress_35258_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  new C(42);
+}
+
+class C {
+  final d;
+
+  C() {} //# 01: compile-time error
+  C(this.d) {}
+}
diff --git a/tests/language_2/regress_35259_test.dart b/tests/language_2/regress_35259_test.dart
new file mode 100644
index 0000000..145a28e
--- /dev/null
+++ b/tests/language_2/regress_35259_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Supertype {
+  factory Supertype() = Unresolved; //# 01: compile-time error
+  factory Supertype() = Unresolved; //# 01: compile-time error
+}
+
+main() {
+  print(new Supertype());
+}
diff --git a/tests/language_2/regress_35260_test.dart b/tests/language_2/regress_35260_test.dart
new file mode 100644
index 0000000..a5853ef
--- /dev/null
+++ b/tests/language_2/regress_35260_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Supertype {
+  factory Supertype() = X;
+  factory Supertype() = X; //# 01: compile-time error
+}
+
+class X implements Supertype {
+  X();
+}
+
+main() {
+  X x = new Supertype();
+}
diff --git a/tests/language_2/regress_35266_test.dart b/tests/language_2/regress_35266_test.dart
new file mode 100644
index 0000000..3d82833
--- /dev/null
+++ b/tests/language_2/regress_35266_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class B<T> extends C<T> {
+  B();
+  factory B.foo() = B<T>;
+  factory B.foo() = B<T>; //# 01: compile-time error
+}
+
+class C<K> {
+  C();
+  factory C.bar() = B<K>.foo;
+}
+
+main() {
+  new C.bar();
+}
diff --git a/tests/language_2/regress_35542_test.dart b/tests/language_2/regress_35542_test.dart
new file mode 100644
index 0000000..9b4a217
--- /dev/null
+++ b/tests/language_2/regress_35542_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+
+FutureOr<dynamic> x = 'abc';
+dynamic y = 'abc';
+
+void smi() {
+  x = 42;
+  y = 42;
+}
+
+void mint() {
+  x = 0x7fffffff00000000;
+  y = 0x7fffffff00000000;
+}
+
+void dbl() {
+  x = 1.0;
+  y = 1.0;
+}
+
+void main() {
+  smi();
+  Expect.isTrue(identical(x, y));
+  mint();
+  Expect.isTrue(identical(x, y));
+  dbl();
+  Expect.isTrue(identical(x, y));
+}
diff --git a/tests/language_2/set_literals/const_set_flag_test.dart b/tests/language_2/set_literals/const_set_flag_test.dart
new file mode 100644
index 0000000..339acaf
--- /dev/null
+++ b/tests/language_2/set_literals/const_set_flag_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Canary test to check that set literals are not enabled *without* an
+// experimental flag.
+
+// Remove this test when the set literals feature is enabled without a flag.
+
+main() {
+  var _ = {1}; //# 01: compile-time error
+  var _ = <int>{}; //# 02: compile-time error
+  Set _ = {}; //# 03: compile-time error
+  Set _ = <int>{}; //# 04: compile-time error
+  var _ = const {1}; //# 05: compile-time error
+  var _ = const <int>{}; //# 06: compile-time error
+  Set _ = const {}; //# 07: compile-time error
+  Set _ = const <int>{}; //# 08: compile-time error
+  const _ = {1}; //# 09: compile-time error
+  const _ = <int>{}; //# 10: compile-time error
+  const Set _ = {}; //# 11: compile-time error
+  const Set _ = <int>{}; //# 12: compile-time error
+}
diff --git a/tests/language_2/set_literals/const_set_literal_test.dart b/tests/language_2/set_literals/const_set_literal_test.dart
new file mode 100644
index 0000000..0e59037
--- /dev/null
+++ b/tests/language_2/set_literals/const_set_literal_test.dart
@@ -0,0 +1,130 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=set-literals
+
+import 'dart:async';
+
+import "package:expect/expect.dart";
+
+void main() {
+  test();
+}
+
+void test() {
+  checkSet<T>(Object o, List elements) {
+    Expect.type<Set<T>>(o);
+    Set<T> set = o;
+    Expect.listEquals(elements, set.toList());
+    Expect.throws<Error>(set.clear);
+  }
+
+  // Various context types for literals.
+  Object setContext<T>(Set<T> object) => object;
+  Object iterableContext<T>(Iterable<T> object) => object;
+  Object foSetContext<T>(FutureOr<Set<T>> object) => object;
+  Object foIterableContext<T>(FutureOr<Set<T>> object) => object;
+
+  // Empty literal, no type arguments.
+  // No context.
+  Expect.type<Map<dynamic, dynamic>>(const {});
+  // Set context with no inferred type argument.
+  checkSet<dynamic>(setContext(const {}), []);
+  checkSet<dynamic>(iterableContext(const {}), []);
+  checkSet<dynamic>(foSetContext(const {}), []);
+  checkSet<dynamic>(foIterableContext(const {}), []);
+  // Specific set context.
+  checkSet<int>(setContext<int>(const {}), []);
+  checkSet<int>(iterableContext<int>(const {}), []);
+  checkSet<int>(foSetContext<int>(const {}), []);
+  checkSet<int>(foIterableContext<int>(const {}), []);
+
+  // Non-empty set literal, no type argument.
+  // No context.
+  checkSet<int>(const {1}, [1]);
+  checkSet<int>(const {3, 1, 2, 4}, [3, 1, 2, 4]);
+  // Set context with no inferred type argument.
+  checkSet<int>(setContext(const {1}), [1]);
+  checkSet<int>(iterableContext(const {1}), [1]);
+  checkSet<int>(foSetContext(const {1}), [1]);
+  checkSet<int>(foIterableContext(const {1}), [1]);
+  checkSet<int>(setContext(const {3, 1, 2, 4}), [3, 1, 2, 4]);
+  checkSet<int>(iterableContext(const {3, 1, 2, 4}), [3, 1, 2, 4]);
+  checkSet<int>(foSetContext(const {1}), [1]);
+  checkSet<int>(foIterableContext(const {1}), [1]);
+  // Specific set context.
+  checkSet<num>(setContext<num>(const {1}), [1]);
+  checkSet<num>(iterableContext<num>(const {1}), [1]);
+  checkSet<num>(foSetContext<num>(const {1}), [1]);
+  checkSet<num>(foIterableContext<num>(const {1}), [1]);
+  checkSet<num>(setContext<num>(const {3, 1, 2, 4}), [3, 1, 2, 4]);
+  checkSet<num>(iterableContext<num>(const {3, 1, 2, 4}), [3, 1, 2, 4]);
+  checkSet<num>(foSetContext<num>(const {3, 1, 2, 4}), [3, 1, 2, 4]);
+  checkSet<num>(foIterableContext<num>(const {3, 1, 2, 4}), [3, 1, 2, 4]);
+
+  // Non-empty set literal with type argument.
+  checkSet<num>(const <num>{1}, [1]);
+  checkSet<num>(const <num>{3, 1, 2, 4}, [3, 1, 2, 4]);
+
+  // Integers, String and symbols work, even if they override ==.
+  checkSet<String>(const {"foo", "bar"}, ["foo", "bar"]);
+  checkSet<Symbol>(const {#foo, #bar}, [#foo, #bar]);
+  checkSet<Symbol>(const {#_foo, #_bar}, [#_foo, #_bar]);
+  const object = Object();
+  checkSet<Object>(const {#foo, 1, "string", object, true},
+      [#foo, 1, "string", object, true]);
+
+  // Nested constant literals.
+  const Object o = {{2}};
+  Expect.type<Set<Set<int>>>(o);
+  Set<Set<int>> set = o;
+  Expect.equals(1, set.length);
+  Expect.equals(1, set.first.length);
+  Expect.equals(2, set.first.first);
+
+  const Object o2 = {{2}, <int>{}};
+  Expect.type<Set<Set<int>>>(o);
+  set = o2;
+  Expect.equals(2, set.length);
+  Expect.equals(1, set.first.length);
+  Expect.equals(2, set.first.first);
+
+  const Set<Set<int>> o3 = {{}};
+  Expect.equals(1, o3.length);
+  Expect.equals(0, o3.first.length);
+
+  const o4 = {{}};
+  Expect.type<Set<Map<dynamic, dynamic>>>(o4);
+  Expect.equals(1, o4.length);
+  Expect.equals(0, o4.first.length);
+
+  const o5 = {{1}, {}};  // Set<Object>
+  Expect.type<Set<Object>>(o5);
+  Expect.notType<Set<Set<Object>>>(o5);
+
+  // User defined constant class.
+  const o6 = {
+    Something(1, "a"),
+    Something(2, "a"),
+    Something(1, "b"),
+    Something(2, "b"),
+  };
+  Expect.equals("1:a,2:a,1:b,2:b", o6.toList().join(","));
+
+  // Canonicalization of constant sets takes ordering into account,
+  // that is, o7 and o8 cannot be the same object.
+  const o7 = {1, 2, 3};
+  const o8 = {3, 2, 1};
+  Expect.notIdentical(o7, o8);
+  // But o7 and o9 must be identical.
+  const o9 = {1, 2, 3};
+  Expect.identical(o7, o9);
+}
+
+class Something {
+  final int id;
+  final String name;
+  const Something(this.id, this.name);
+  String toString() => "$id:$name";
+}
diff --git a/tests/language_2/set_literals/invalid_set_literal_test.dart b/tests/language_2/set_literals/invalid_set_literal_test.dart
new file mode 100644
index 0000000..2b6a790
--- /dev/null
+++ b/tests/language_2/set_literals/invalid_set_literal_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=set-literals
+
+import "dart:collection" show HashSet, LinkedHashSet;
+
+import "package:expect/expect.dart";
+
+const Object d = 3.5;
+
+void main() {
+   var o //
+      = <int>{1: 1} //# 01: compile-time error
+      = <int, int, int>{} //# 02: compile-time error
+      = <int, int, int>{1} //# 03: compile-time error
+      = <int, int>{1} //# 04: compile-time error
+      = const <int, int, int>{} //# 05: compile-time error
+      = const <int, int, int>{1} //# 06: compile-time error
+      = const <int, int>{1} //# 07: compile-time error
+      = const {Duration(seconds: 0)} // Overrides ==. //# 08: compile-time error
+      = const {4.2} // Overrides ==. //# 09: compile-time error
+      = const {d} // Overrides ==. //# 10: compile-time error
+      = {,} //# 11: compile-time error
+      = {1,,} //# 12: compile-time error
+      = {1,,1} //# 13: compile-time error
+      ;
+  Expect.isNull(o); // Should be unreachable with a value.
+
+  Set<int> s //
+      = {"not int"} //# 14: compile-time error
+      = {4.2} //# 15: compile-time error
+      = {1: 1} //# 16: compile-time error
+      = {{}} //# 17: compile-time error
+      ;
+  Expect.isNull(s);
+
+  Set<Set<Object>> ss //
+      = {{1: 1}} //# 19: compile-time error
+      = {<int, int>{}} //# 20: compile-time error
+      = {<int>{1: 1}} //# 21: compile-time error
+      = const {ss} //# 22: compile-time error
+      ;
+  Expect.isNull(ss);
+
+  HashSet<int> hs //
+      = {} // Exact type is LinkedHashSet //# 23: compile-time error
+      ;
+  Expect.isNull(hs);
+
+  <T>(x) {
+    // Type constants are allowed, type variables are not.
+    var o //
+        = const {T} //# 26: compile-time error
+        = const {x} //# 27: compile-time error
+        ;
+    Expect.isNull(o);
+  }<int>(42);
+
+  <T extends Set<num>>() {
+    // Regression test for http://dartbug.com/35300.
+    // The `Set<Null>` type is not assignable to `T extends Set<num>`,
+    // so we don't make this a set. You can't assign a map to `T`.
+    T o //
+    = {}; //# 28: compile-time error
+    ;
+  }();
+
+  // Constant sets must not contain equal elements.
+  const cs = {
+    1,
+    "s",
+    #foo,
+    int,
+    C(1),
+    {1},
+    1, //# 29: compile-time error
+    "s", //# 30: compile-time error
+    #foo, //# 31: compile-time error
+    int, //# 32: compile-time error
+    C(1), //# 33: compile-time error
+    {1}, //# 34: compile-time error
+  };
+}
+
+class C {
+  final Object id;
+  const C(this.id);
+}
diff --git a/tests/language_2/set_literals/set_literal_test.dart b/tests/language_2/set_literals/set_literal_test.dart
new file mode 100644
index 0000000..cc17fae
--- /dev/null
+++ b/tests/language_2/set_literals/set_literal_test.dart
@@ -0,0 +1,133 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// SharedOptions=--enable-experiment=set-literals
+
+import 'dart:async';
+import "dart:collection" show LinkedHashSet;
+
+import "package:expect/expect.dart";
+
+void main() {
+  test();
+}
+
+void test() {
+  checkSet<T>(Object o, List elements) {
+    Expect.type<LinkedHashSet<T>>(o);
+    Set<T> set = o;
+    Expect.listEquals(elements, set.toList());
+  }
+
+  Object setContext<T>(Set<T> object) => object;
+  Object iterableContext<T>(Iterable<T> object) => object;
+  Object foSetContext<T>(FutureOr<Set<T>> object) => object;
+  Object foIterableContext<T>(FutureOr<Iterable<T>> object) => object;
+
+  // Empty literal, no type arguments.
+  // No context.
+  Expect.type<Map<dynamic, dynamic>>({});
+  // Set context with no inferred type argument.
+  checkSet<dynamic>(setContext({}), []);
+  checkSet<dynamic>(iterableContext({}), []);
+  checkSet<dynamic>(foSetContext({}), []);
+  checkSet<dynamic>(foIterableContext({}), []);
+  // Specific set context.
+  checkSet<int>(setContext<int>({}), []);
+  checkSet<int>(iterableContext<int>({}), []);
+  checkSet<int>(foSetContext<int>({}), []);
+  checkSet<int>(foIterableContext<int>({}), []);
+
+  // Non-empty set literal, no type argument.
+  // No context.
+  checkSet<int>({1}, [1]);
+  checkSet<int>({3, 1, 2, 4, 1, 4}, [3, 1, 2, 4]);
+  // Set context with no inferred type argument.
+  checkSet<int>(setContext({1}), [1]);
+  checkSet<int>(iterableContext({1}), [1]);
+  checkSet<int>(foSetContext({1}), [1]);
+  checkSet<int>(foIterableContext({1}), [1]);
+  checkSet<int>(setContext({3, 1, 2, 4, 1, 4}), [3, 1, 2, 4]);
+  checkSet<int>(iterableContext({3, 1, 2, 4, 1, 4}), [3, 1, 2, 4]);
+  checkSet<int>(foSetContext({3, 1, 2, 4, 1, 4}), [3, 1, 2, 4]);
+  checkSet<int>(foIterableContext({3, 1, 2, 4, 1, 4}), [3, 1, 2, 4]);
+  // Specific set context.
+  checkSet<num>(setContext<num>({1}), [1]);
+  checkSet<num>(iterableContext<num>({1}), [1]);
+  checkSet<num>(foSetContext<num>({1}), [1]);
+  checkSet<num>(foIterableContext<num>({1}), [1]);
+  checkSet<num>(setContext<num>({3, 1, 2, 4, 1, 4}), [3, 1, 2, 4]);
+  checkSet<num>(iterableContext<num>({3, 1, 2, 4, 1, 4}), [3, 1, 2, 4]);
+  checkSet<num>(foSetContext<num>({3, 1, 2, 4, 1, 4}), [3, 1, 2, 4]);
+  checkSet<num>(foIterableContext<num>({3, 1, 2, 4, 1, 4}), [3, 1, 2, 4]);
+
+  // Non-empty set literal with type argument.
+  checkSet<num>(<num>{1}, [1]);
+  checkSet<num>(<num>{3, 1, 2, 4, 1, 4}, [3, 1, 2, 4]);
+
+  // Iteration order. Values are evaluated in first-added order.
+  var e1a = Equality(1, "a");
+  var e1b = Equality(1, "b");
+  var e2a = Equality(2, "a");
+  var e2b = Equality(2, "b");
+  var es = {e1a, e2b, e1b, e2a};
+  checkSet<Equality>(es, [e1a, e2b]);
+  Expect.equals("1:a,2:b", es.join(","));
+
+  // Evaluation order. All elements are evaluated, left to right.
+  var entries = <int>[];
+  T log<T>(T value, int entry) {
+    entries.add(entry);
+    return value;
+  }
+  checkSet<Equality>(
+      {log(e1a, 1), log(e2b, 2), log(e1b, 3), log(e2a, 4)}, [e1a, e2b]);
+  Expect.listEquals([1, 2, 3, 4], entries);
+
+  // Nested literals.
+  Object o = {{2}};
+  Expect.type<LinkedHashSet<Set<int>>>(o);
+  Expect.type<LinkedHashSet<int>>((o as Set).first);
+  Set<Set<int>> set = o;
+  Expect.equals(1, set.length);
+  Expect.equals(1, set.first.length);
+  Expect.equals(2, set.first.first);
+
+  o = {{2}, <int>{}};
+  Expect.type<LinkedHashSet<Set<int>>>(o);
+  Expect.type<LinkedHashSet<int>>((o as Set).first);
+  set = o;
+  Expect.equals(2, set.length);
+  Expect.equals(1, set.first.length);
+  Expect.equals(2, set.first.first);
+
+  var set2 = {{}};
+  Expect.type<Set<Map<dynamic, dynamic>>>(set2);
+  Expect.equals(1, set2.length);
+  Expect.equals(0, set2.first.length);
+
+  var set3 = {{1}, {}};  // Set<Object>
+  Expect.type<Set<Object>>(set3);
+  Expect.notType<Set<Set<Object>>>(set3);
+
+  // Trailing comma.
+  Iterable<Object> i;
+  i = {1,};
+  Expect.type<Set<Object>>(i);
+  Expect.equals(1, i.length);
+
+  o = {1, 2, 3,};
+  Expect.type<Set<int>>(o);
+  Set<Object> set4 = o;
+  Expect.equals(3, set4.length);
+}
+
+class Equality {
+  final int id;
+  final String name;
+  const Equality(this.id, this.name);
+  int get hashCode => id;
+  bool operator==(Object other) => other is Equality && id == other.id;
+  String toString() => "$id:$name";
+}
diff --git a/tests/language_2/static_const_field_reserved_name_test.dart b/tests/language_2/static_const_field_reserved_name_test.dart
index 8c892a1..1de0168 100644
--- a/tests/language_2/static_const_field_reserved_name_test.dart
+++ b/tests/language_2/static_const_field_reserved_name_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Dart test for testing redefinition of reserved names as static const fields.
-// Bug #587.
+// Issue https://github.com/dart-archive/dev_compiler/issues/587
 
 import "package:expect/expect.dart";
 
@@ -17,6 +17,19 @@
   }
 }
 
+class Foo {
+  int get foo => 42;
+  static final baz = new Foo();
+}
+
+class Bar extends Foo {
+  get foo => 123;
+  Bar.baz();
+}
+
 void main() {
   StaticConstFieldReservedNameTest.testMain();
+
+  // Regression test for https://github.com/dart-lang/sdk/issues/33621
+  Expect.equals(Bar.baz().foo, 123);
 }
diff --git a/tests/language_2/string_split_test.dart b/tests/language_2/string_split_test.dart
index 0cd4652..2517237 100644
--- a/tests/language_2/string_split_test.dart
+++ b/tests/language_2/string_split_test.dart
@@ -11,17 +11,17 @@
   bool noSuchMethod(Invocation im) => false; // To appease dartanalyzer.
 }
 
-class EvilIterator implements Iterator {
+class EvilIterator implements Iterator<Match> {
   bool moveNext() => true;
   EvilMatch get current => new EvilMatch();
 }
 
-class EvilIterable extends Iterable {
-  Iterator get iterator => new EvilIterator();
+class EvilIterable extends Iterable<Match> {
+  get iterator => new EvilIterator();
 }
 
 class EvilPattern implements Pattern {
-  Iterable allMatches(String s, [int start = 0]) => new EvilIterable();
+  allMatches(String s, [int start = 0]) => new EvilIterable();
   bool noSuchMethod(Invocation im) => false; // To appease dartanalyzer.
 }
 
diff --git a/tests/language_2/string_supertype_checked_test.dart b/tests/language_2/string_supertype_checked_test.dart
index 75a2a6b..016c757 100644
--- a/tests/language_2/string_supertype_checked_test.dart
+++ b/tests/language_2/string_supertype_checked_test.dart
@@ -7,12 +7,12 @@
 // This tests a bug in dart2js which caused the compiler to emit bad
 // type assertions for supertypes of String.
 
-class A implements Comparable {
+class A implements Comparable<A> {
   int value;
 
   A(this.value);
 
-  int compareTo(Comparable other) {
+  int compareTo(Object other) {
     A o = promote(other);
     return value.compareTo(o.value);
   }
diff --git a/tests/language_2/type_constants_test.dart b/tests/language_2/type_constants_test.dart
new file mode 100644
index 0000000..560e485
--- /dev/null
+++ b/tests/language_2/type_constants_test.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that the value of constant type literals are allowed as
+// constant map keys and case expressions, and the value of non-constant type
+// literals are not.
+
+import "dart:collection" deferred as prefix;
+
+main(args) {
+  testSwitch(args);
+  testMaps(args);
+}
+
+const Type numType = num;
+
+Type argumentType<T>() => T;
+
+void testSwitch<T extends MyType>(args) {
+  var types = [MyType, T, argumentType<MyType>(), argumentType<T>()];
+  for (int i = 0; i < types.length; i++) {
+    switch (types[i]) {
+      // Must be type literal or not override `==`.
+      case const MyType(): //# 01: compile-time error
+
+      // Must not be type variable.
+      case T: //# 02: compile-time error
+
+      // Must not be deferred type.
+      case prefix.HashSet: //# 03: compile-time error
+
+      // Constant type literals are valid.
+      case String:
+        throw "unreachable: String #$i";
+      case int:
+        throw "unreachable: int #$i";
+      case numType:
+        throw "unreachable: num #$i";
+      case MyType:
+        break;
+      default:
+        throw "unreachable: default #$i";
+    }
+  }
+}
+
+void testMaps<T extends MyType>(args) {
+  const map = {
+    // Must be type literal or not override `==`.
+    MyType(): 0, //# 04: compile-time error
+
+    // Must not be type variable.
+    T: 0, //# 05: compile-time error
+
+    // Must not be deferred.
+    prefix.HashSet: 0, //# 06: compile-time error
+
+    // Constant type literals are valid.
+    MyType: 0,
+    int: 1,
+    String: 2,
+    numType: 3,
+  };
+  if (map[MyType] != 0) throw "Map Error: ${MyType} as literal";
+  if (map[T] != 0) throw "Map Error: ${T} as type argument";
+  if (map[argumentType<MyType>()] != 0) {
+    throw "Map Error: ${argumentType<MyType>()} as type argument of literal";
+  }
+  if (map[argumentType<T>()] != 0) {
+    throw "Map Error: ${argumentType<T>()} as type argument of type variable";
+  }
+  if (map[num] != 3) throw "Map Error: ${num} -> ${map[num]}";
+}
+
+// An implementation of `Type` which overrides `==`,
+// but is not the value of a constant type literal.
+class MyType implements Type {
+  const MyType();
+  int get hashCode => 0;
+  bool operator ==(Object other) => identical(this, other);
+}
diff --git a/tests/language_2/vm/bitnot_int_test.dart b/tests/language_2/vm/bitnot_int_test.dart
new file mode 100644
index 0000000..f52d66b
--- /dev/null
+++ b/tests/language_2/vm/bitnot_int_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// VMOptions=--no_background_compilation --optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+// Tests for long bit-not under 64-bit arithmetic wrap-around semantics.
+
+final int maxInt32 = 2147483647;
+final int minInt32 = -2147483648;
+final int maxInt64 = 0x7fffffffffffffff;
+final int minInt64 = 0x8000000000000000;
+
+int bitnot(int x) {
+  return ~x;
+}
+
+doConstant() {
+  Expect.equals(0, bitnot(-1));
+  Expect.equals(-1, bitnot(0));
+  Expect.equals(-2, bitnot(1));
+
+  Expect.equals(minInt32, bitnot(maxInt32));
+  Expect.equals(maxInt32, bitnot(minInt32));
+  Expect.equals(minInt64, bitnot(maxInt64));
+  Expect.equals(maxInt64, bitnot(minInt64)); // sic!
+}
+
+doVar() {
+  int d = 0;
+  for (int i = -88; i < 10; i++) {
+    d += bitnot(i);
+  }
+  Expect.equals(3773, d);
+}
+
+main() {
+  // Repeat tests to enter JIT (when applicable).
+  for (int i = 0; i < 20; i++) {
+    doConstant();
+    doVar();
+  }
+}
diff --git a/tests/language_2/vm/modtruncdiv_int_test.dart b/tests/language_2/vm/modtruncdiv_int_test.dart
index 7a84d1a..8314628 100644
--- a/tests/language_2/vm/modtruncdiv_int_test.dart
+++ b/tests/language_2/vm/modtruncdiv_int_test.dart
@@ -79,6 +79,17 @@
   Expect.equals(1, mod(maxInt32 + 1, maxInt32));
   Expect.equals(maxInt32 - 2, mod(minInt32 - 1, maxInt32));
   Expect.equals(0, mod(minInt32 + 1, maxInt32));
+
+  Expect.equals(15, mod(-1, 16));
+  Expect.equals(15, mod(-17, 16));
+  Expect.equals(15, mod(-1, -16));
+  Expect.equals(15, mod(-17, -16));
+  Expect.equals(100, mod(100, 1 << 32));
+  Expect.equals(100, mod(100, -(1 << 32)));
+  Expect.equals((1 << 32) - 1, mod((1 << 35) - 1, 1 << 32));
+  Expect.equals((1 << 32) - 1, mod((1 << 35) - 1, -(1 << 32)));
+  Expect.equals(maxInt64, mod(-1, 1 << 63));
+  Expect.equals(0, mod(minInt64, 1 << 63));
 }
 
 doTruncDivConstants() {
diff --git a/tests/language_2/vm/regress_34684_test.dart b/tests/language_2/vm/regress_34684_test.dart
new file mode 100644
index 0000000..626cb50
--- /dev/null
+++ b/tests/language_2/vm/regress_34684_test.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// No LICM on array bounds check (dartbug.com/34684).
+//
+// VMOptions=--deterministic --optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+List<int> foo(int n, int k) {
+  var l = new List<int>(1);
+  var j = n - 1;
+  for (var i = 0; i < k; i++) {
+    l[j] = 10; // do not hoist
+  }
+  return l;
+}
+
+int x = -1;
+
+List<int> bar(int n, int k) {
+  x = -1;
+  var l = new List<int>(n);
+  for (var i = 0; i < k; i++) {
+    x = i;
+    l[4] = 10; // do not hoist
+  }
+  return l;
+}
+
+void main() {
+  List<int> l;
+
+  for (int i = 0; i < 20; ++i) {
+    l = foo(1, 0);
+    Expect.equals(1, l.length);
+    Expect.equals(null, l[0]);
+
+    l = foo(2, 0);
+    Expect.equals(1, l.length);
+    Expect.equals(null, l[0]);
+
+    l = foo(i, 0);
+    Expect.equals(1, l.length);
+    Expect.equals(null, l[0]);
+
+    l = foo(1, 1);
+    Expect.equals(1, l.length);
+    Expect.equals(10, l[0]);
+
+    l = foo(1, i + 1);
+    Expect.equals(1, l.length);
+    Expect.equals(10, l[0]);
+
+    try {
+      l = foo(-i, 1);
+    } catch (_) {
+      l = null;
+    }
+    Expect.equals(null, l);
+
+    l = bar(5, 0);
+    Expect.equals(5, l.length);
+    Expect.equals(null, l[4]);
+    Expect.equals(-1, x);
+
+    l = bar(5, i + 1);
+    Expect.equals(5, l.length);
+    Expect.equals(10, l[4]);
+    Expect.equals(i, x);
+
+    try {
+      l = bar(1, i + 1);
+    } catch (_) {
+      l = null;
+    }
+    Expect.equals(null, l);
+    Expect.equals(0, x);
+  }
+}
diff --git a/tests/language_2/vm/regress_35321_test.dart b/tests/language_2/vm/regress_35321_test.dart
new file mode 100644
index 0000000..8823ddb
--- /dev/null
+++ b/tests/language_2/vm/regress_35321_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Proper CP on double op (dartbug.com/35321).
+//
+// VMOptions=--deterministic --optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+double foo(bool x) {
+  if (x) return 1.0;
+}
+
+int bar(int i) {
+  if (i < 0) {
+    return bar(i + 1);
+  } else if ((foo(i == 22) / 22.0) >= (1 / 0.0)) {
+    return 1;
+  }
+  return 0;
+}
+
+void main() {
+  for (int i = 0; i < 20; ++i) {
+    var x = -1;
+    try {
+      x = bar(i);
+    } catch (_) {
+      x = -2;
+    }
+    Expect.equals(-2, x);
+  }
+}
diff --git a/tests/language_2/vm/regress_35325_test.dart b/tests/language_2/vm/regress_35325_test.dart
new file mode 100644
index 0000000..cfd9772
--- /dev/null
+++ b/tests/language_2/vm/regress_35325_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Proper nullable comparison (dartbug.com/35325).
+//
+// VMOptions=--deterministic --optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+bool var1;
+int var2;
+
+bar(List<int> par1, double par2) {
+  if (par2 == 123.0) return 456.0;
+  // fall into return null
+}
+
+bool foo(double par1) {
+  return (bar(
+          [81, 17],
+          ((!(var1))
+              ? double.maxFinite
+              : (var1 ? (80).floorToDouble() : par1))) ==
+      (((~(var2))).roundToDouble()).sign);
+}
+
+void main() {
+  for (int i = 0; i < 20; ++i) {
+    var1 = true;
+    var2 = 4;
+    var x = foo(0.0);
+    Expect.isFalse(x);
+    Expect.isTrue(var1);
+    Expect.equals(4, var2);
+  }
+}
diff --git a/tests/language_2/vm/regression_32912_test.dart b/tests/language_2/vm/regression_32912_test.dart
new file mode 100644
index 0000000..2a63ff6
--- /dev/null
+++ b/tests/language_2/vm/regression_32912_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+dynamic _defaultCallback<T>(T t) => t;
+
+void bar<T>([dynamic Function(T) f = _defaultCallback]) {}  //# 01: compile-time error
+
+class C<T> {
+  // Should be statically rejected
+  foo([dynamic Function(T) f = _defaultCallback]) {}  //# 02: compile-time error
+
+  // Should be statically rejected
+  const C({this.callback = _defaultCallback});  //# 03: compile-time error
+
+  final dynamic Function(T) callback;  //# 03: continued
+}
+
+void main() {
+  bar<int>();                    //# 01: continued
+  print(new C<int>().foo());     //# 02: continued
+  print(new C<int>().callback);  //# 03: continued
+}
diff --git a/tests/language_2/vm/symbols_test.dart b/tests/language_2/vm/symbols_test.dart
new file mode 100644
index 0000000..15f9ed1
--- /dev/null
+++ b/tests/language_2/vm/symbols_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+void main() {
+  print(const Symbol(null));                                /// 01: compile-time error
+  print(const Symbol(r''));                                 /// 02: ok
+  Expect.isTrue(identical(const Symbol(r'foo'), #foo));     /// 03: ok
+  Expect.isTrue(identical(const Symbol(r'$foo'), #$foo));   /// 03: ok
+  Expect.isTrue(identical(const Symbol(r'$_'), #$_));       /// 03: ok
+  Expect.isTrue(identical(const Symbol(r'+'), #+));         /// 03: ok
+  Expect.isTrue(identical(const Symbol(r'[]='), #[]=));     /// 03: ok
+  Expect.isTrue(identical(const Symbol(r'_foo'), #_foo));   /// 03: compile-time error
+  Expect.isTrue(identical(const Symbol(r'_$'), #_$));       /// 03: compile-time error
+  Expect.isTrue(identical(const Symbol(r'_foo$'), #_foo$)); /// 03: compile-time error
+  print(const Symbol(r'_+'));                               /// 03: compile-time error
+}
diff --git a/tests/language_2/vm/type_of_call_via_getter_test.dart b/tests/language_2/vm/type_of_call_via_getter_test.dart
new file mode 100644
index 0000000..4a6c445
--- /dev/null
+++ b/tests/language_2/vm/type_of_call_via_getter_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test verifies that compiler infers correct type from call via getter.
+
+// VMOptions=--no_background_compilation --optimization_counter_threshold=10
+
+import "package:expect/expect.dart";
+
+typedef String IntFunctionType(int _);
+
+String functionImpl(int a) => 'abc';
+
+class Box {
+  IntFunctionType get fun => functionImpl;
+}
+
+var box = new Box();
+
+void test1() {
+  Expect.isFalse(box.fun(42) is Function);
+  Expect.isTrue(box.fun(42) is String);
+}
+
+class Callable {
+  String call(int i) => 'qwe';
+}
+
+class Box2 {
+  Callable get fun => new Callable();
+}
+
+var box2 = new Box2();
+
+void test2() {
+  Expect.isFalse(box2.fun is Function);
+  Expect.isTrue(box2.fun is Callable);
+  Expect.isFalse(box2.fun(42) is Function);
+  Expect.isFalse(box2.fun(42) is Callable);
+  Expect.isTrue(box2.fun(42) is String);
+}
+
+void main() {
+  for (int i = 0; i < 20; ++i) {
+    test1();
+  }
+  for (int i = 0; i < 20; ++i) {
+    test2();
+  }
+}
diff --git a/tests/lib_2/async/timer_regress22626_test.dart b/tests/lib_2/async/timer_regress22626_test.dart
deleted file mode 100644
index c3e00df..0000000
--- a/tests/lib_2/async/timer_regress22626_test.dart
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// Test that no wakeups are being dropped if we cancel timers.
-// WARNING: For this test to work it cannot rely on any other async features
-// and will just timeout if it is failing.
-
-library timer_regress22626_test;
-
-import 'dart:async';
-import 'dart:math';
-import 'package:expect/expect.dart';
-
-int countdown = 5;
-var rng = new Random(1234);
-
-void test(int delay, int delta) {
-  var t0 = new Timer(new Duration(milliseconds: delay + delta),
-      () => Expect.fail("should have been cancelled by now"));
-  new Timer(Duration.zero, () => t0.cancel());
-  new Timer(
-      Duration.zero,
-      () => new Timer(new Duration(milliseconds: delay), () {
-            if (--countdown == 0) {
-              print("done");
-            } else {
-              test(delay, max(0, delta + rng.nextInt(2) - 1));
-            }
-          }));
-}
-
-void main() {
-  test(200, 2);
-}
diff --git a/tests/lib_2/isolate/issue_6610_test.dart b/tests/lib_2/isolate/issue_6610_test.dart
new file mode 100644
index 0000000..96cc5e8f
--- /dev/null
+++ b/tests/lib_2/isolate/issue_6610_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Testing that Isolate.spawn copies the source code of the parent isolate,
+// rather than rereading the parent's source URI.
+// https://github.com/dart-lang/sdk/issues/6610
+
+// Isolate structure:
+//     Root 1 -> Branch 1 -> Leaf 1
+//     /
+//  main
+//     \
+//     Root 2 -> Branch 2 -> Leaf 2
+
+library spawn_tests;
+
+import "dart:io";
+import 'dart:isolate';
+import 'package:expect/expect.dart';
+
+void main() {
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    var count = 0;
+    server.listen((HttpRequest request) {
+      ++count;
+      request.response.write("""
+        import 'dart:isolate';
+
+        void main(_, SendPort port) {
+          root(port);
+        }
+
+        void root(SendPort port) {
+          port.send("Root ${count}");
+          Isolate.spawn(branch, port);
+        }
+
+        void branch(SendPort port) {
+          port.send("Branch ${count}");
+          Isolate.spawn(leaf, port);
+        }
+
+        void leaf(SendPort port) {
+          port.send("Leaf ${count}");
+        }
+      """);
+      request.response.close();
+    });
+
+    ReceivePort port = new ReceivePort();
+    var messageSet = Set();
+    port.listen((message) {
+      messageSet.add(message);
+      if (messageSet.length >= 6) {
+        server.close();
+        port.close();
+        Expect.setEquals([
+          "Root 1",
+          "Root 2",
+          "Branch 1",
+          "Branch 2",
+          "Leaf 1",
+          "Leaf 2",
+        ], messageSet);
+      }
+    });
+
+    Isolate.spawnUri(
+        Uri.parse("http://127.0.0.1:${server.port}"), [], port.sendPort);
+    Isolate.spawnUri(
+        Uri.parse("http://127.0.0.1:${server.port}"), [], port.sendPort);
+  });
+}
diff --git a/tests/lib_2/isolate/spawn_uri_exported_main_test.dart b/tests/lib_2/isolate/spawn_uri_exported_main_test.dart
index e556dc6..cf0df43 100644
--- a/tests/lib_2/isolate/spawn_uri_exported_main_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_exported_main_test.dart
@@ -4,7 +4,9 @@
 
 main() {
   print("Spawning isolate.");
-  var t = new Timer(new Duration(seconds: 5), () {
+  var t = new Timer(new Duration(seconds: 30), () {
+    // it might take some time for new isolate to get spawned from source since
+    // it needs to be compiled first.
     Expect.fail("Isolate was not spawned successfully.");
   });
   var rp = new RawReceivePort();
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index f1d2f76..dc0745a 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -108,7 +108,6 @@
 
 [ $hot_reload ]
 async/stream_periodic4_test: Pass, RuntimeError # Issue 30904
-async/timer_regress22626_test: Pass, RuntimeError # Timing dependent.
 mirrors/dynamic_load_test: RuntimeError # Issue 26869 - Reload fails to preserve library identity
 
 [ $jscl ]
@@ -132,6 +131,9 @@
 [ $compiler != dartdevc && $checked && !$strong ]
 async/future_or_only_in_async_test/00: MissingCompileTimeError
 
+[ $compiler == dartk && $system == macos && $hot_reload && ($arch == simdbc || $arch == simdbc64) ]
+isolate/unresolved_ports_test: Pass, RuntimeError #  Issue 35410
+
 [ $compiler == none && $mode == product ]
 mirrors/library_enumeration_deferred_loading_test: RuntimeError, OK # Deferred loaded eagerly
 mirrors/library_import_deferred_loading_test: RuntimeError, OK # Deferred loaded eagerly
@@ -212,6 +214,7 @@
 isolate/issue_21398_parent_isolate1_test: Skip # Isolate.spawnUri
 isolate/issue_21398_parent_isolate_test: Skip # Isolate.spawnUri
 isolate/issue_24243_parent_isolate_test: Skip # Isolate.spawnUri
+isolate/issue_6610_test: Skip # Isolate.spawnUri
 isolate/mandel_isolate_test: Skip # Isolate.spawnUri
 isolate/message2_test: Skip # Isolate.spawnUri
 isolate/message_test: Skip # Isolate.spawnUri
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 44d8af1..449d91a 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -456,7 +456,6 @@
 async/timer_cancel2_test: RuntimeError # Timer interface not supported: Issue 7728.
 async/timer_cancel_test: RuntimeError # Timer interface not supported: Issue 7728.
 async/timer_isActive_test: RuntimeError # Timer interface not supported: Issue 7728.
-async/timer_regress22626_test: RuntimeError # Non-zero timers not supported; Issue 7728.
 async/timer_repeat_test: RuntimeError # Timer interface not supported: Issue 7728.
 async/timer_test: RuntimeError # Timer interface not supported: Issue 7728.
 async/zone_bind_test: Fail # Timer interface not supported: Issue 7728.
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 610f4b9..55192e7 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -9,10 +9,6 @@
 
 [ $compiler == dartdevk ]
 async/slow_consumer_test: CompileTimeError
-convert/chunked_conversion_utf82_test: RuntimeError
-convert/chunked_conversion_utf86_test: RuntimeError
-convert/chunked_conversion_utf87_test: RuntimeError
-convert/utf82_test: RuntimeError
 html/debugger_test: CompileTimeError
 
 [ $runtime == chrome && ($compiler == dartdevc || $compiler == dartdevk) ]
@@ -43,8 +39,7 @@
 convert/chunked_conversion_utf88_test: Slow, Pass
 convert/json_utf8_chunk_test: Slow, Pass
 convert/streamed_conversion_json_utf8_encode_test: Pass, Timeout # Issue 29922
-convert/streamed_conversion_utf8_decode_test: Slow, Pass
-convert/streamed_conversion_utf8_encode_test: Pass, Timeout # Issue 29922
+convert/streamed_conversion_utf8_decode_test: Slow, Pass, Timeout # Issue 29922
 convert/utf85_test: Slow, Pass
 html/async_spawnuri_test: RuntimeError # Issue 29922
 html/async_test: RuntimeError # Issue 29922
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 081f26e..ca19533 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -3,12 +3,6 @@
 # BSD-style license that can be found in the LICENSE file.
 # Sections in this file should contain "$compiler == dartk" or
 # "$compiler == dartkp".
-#
-# Note: Sections in this file are normalized so we can update them with
-# automated tools. Please add any new status lines affecting those two compilers
-# in the existing sections, if possible keep the alphabetic ordering. If we are
-# missing a section you need, please reach out to sigmund@ to see the best way
-# to add them.
 
 convert/streamed_conversion_json_utf8_decode_test: Pass, Slow # Uses --verify_before_gc --verify_after_gc --old_gen_growth_rate=1 flags
 
@@ -51,6 +45,9 @@
 [ $arch == simdbc64 && $hot_reload_rollback ]
 convert/streamed_conversion_json_utf8_decode_test: SkipSlow # Uses --verify_before_gc --verify_after_gc --old_gen_growth_rate=1 flags
 
+[ $arch == simdbc64 && $strong && ($compiler == dartk || $compiler == dartkb) ]
+isolate/issue_24243_parent_isolate_test: RuntimeError # dartbug.com/35373
+
 [ $arch == x64 && $builder_tag == asan && $compiler == dartk ]
 mirrors/dynamic_load_test: Fail # Memory leak (issue 34724)
 
@@ -142,7 +139,7 @@
 html/*: SkipByDesign # dart:html not supported on VM.
 isolate/deferred_in_isolate2_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/deferred_in_isolate_test: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/issue_21398_parent_isolate1_test: RuntimeError # Issue 31402 (List literal)
+isolate/issue_21398_parent_isolate1_test: RuntimeError, Crash # Issue 31402 (List literal), Issue 35374.
 isolate/issue_21398_parent_isolate2_test/01: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/message_test: CompileTimeError # Issue 31402 (Invocation arguments)
 isolate/mint_maker_test: CompileTimeError # Issue 31402 (Invocation arguments)
@@ -254,6 +251,9 @@
 typed_data/int32x4_static_test/01: MissingCompileTimeError
 typed_data/int32x4_static_test/02: MissingCompileTimeError
 
+[ $hot_reload && ($compiler == dartk || $compiler == dartkb) ]
+isolate/issue_6610_test: RuntimeError, Crash # Sources are looked up on every reload request.
+
 [ $hot_reload_rollback && ($compiler == dartk || $compiler == dartkb) ]
 isolate/illegal_msg_function_test: Skip # Timeout
 isolate/pause_test: Skip # Timeout
@@ -262,26 +262,8 @@
 # are to be triaged.  Isolate tests are skipped on purpose due to the usage of
 # batch mode.
 [ $strong && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) && ($compiler == dartk || $compiler == dartkb) ]
-isolate/cross_isolate_message_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/error_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/error_exit_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/exit_at_spawnuri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/issue_21398_parent_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/issue_24243_parent_isolate_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
 isolate/mandel_isolate_test: Pass, Timeout
-isolate/message2_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/nested_spawn2_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/nested_spawn_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/raw_port_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/request_reply_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/spawn_function_custom_class_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/spawn_function_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/spawn_uri_exported_main_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/spawn_uri_multi_test/none: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/spawn_uri_nested_vm_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/spawn_uri_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/spawn_uri_vm_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
-isolate/unresolved_ports_test: Skip # No support for Isolate.spawnUri in batch-mode atm.
+isolate/nested_spawn2_test: Pass, RuntimeError # RuntimeError caused by timeout
 mirrors/library_uri_io_test: RuntimeError # Please triage.
 
 [ $strong && ($compiler == dartk || $compiler == dartkb) ]
@@ -313,40 +295,8 @@
 *: SkipByDesign
 
 [ ($compiler == dartk || $compiler == dartkb) && ($hot_reload || $hot_reload_rollback) ]
-async/stream_from_iterable_test: Skip # Timeout
-async/stream_iterator_test: Skip # Timeout
-async/stream_periodic2_test: Skip # Timeout
-async/stream_periodic3_test: Skip # Timeout
-async/stream_periodic4_test: Skip # Timeout
-async/stream_periodic5_test: Skip # Timeout
-async/stream_periodic6_test: Skip # Timeout
-async/stream_periodic_test: Skip # Timeout
-async/stream_single_test: Skip # Timeout
-async/stream_single_to_multi_subscriber_test: Skip # Timeout
-async/stream_state_test: Skip # Timeout
-async/stream_timeout_test: Skip # Timeout
-async/stream_transform_test: Skip # Timeout
-async/stream_transformation_broadcast_test: Skip # Timeout
-async/timer_cancel1_test: Skip # Timeout
-async/timer_isActive_test: Skip # Timeout
-async/timer_test: Skip # Timeout
-isolate/count_test: Skip # Timeout
-isolate/cross_isolate_message_test: Skip # Timeout
-isolate/isolate_complex_messages_test: Skip # Timeout
-isolate/isolate_import_test/none: Skip # Timeout
-isolate/issue_21398_parent_isolate1_test: Skip # Timeout
-isolate/mandel_isolate_test: Skip # Timeout
-isolate/message2_test: Skip # Timeout
+isolate/mandel_isolate_test: Pass, Timeout, RuntimeError # Test can time out which results in runtime error
 isolate/message4_test: Pass, Timeout, Crash # Timeout and sporadic crash (issue 33824)
-isolate/nested_spawn2_test: Skip # Timeout
-isolate/nested_spawn_test: Skip # Timeout
-isolate/raw_port_test: Skip # Timeout
-isolate/spawn_function_test: Skip # Timeout
-isolate/spawn_uri_test: Skip # Timeout
-isolate/spawn_uri_vm_test: Skip # Timeout
-isolate/timer_isolate_test: Skip # Timeout
-isolate/timer_multiple_isolates_test: Skip # Timeout
-isolate/unresolved_ports_test: Skip # Timeout
 mirrors/dynamic_load_test: Crash
 mirrors/library_uri_io_test: Skip # Timeout
 mirrors/library_uri_package_test: Skip # Timeout
diff --git a/tests/lib_2/lib_2_precompiled.status b/tests/lib_2/lib_2_precompiled.status
index 662e008..1083bc9 100644
--- a/tests/lib_2/lib_2_precompiled.status
+++ b/tests/lib_2/lib_2_precompiled.status
@@ -12,7 +12,6 @@
 [ $compiler == app_jit || $compiler == none || $compiler == precompiler ]
 async/future_or_strong_test: RuntimeError
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
-async/timer_regress22626_test: Pass, RuntimeError # Issue 28254
 isolate/compile_time_error_test/01: Skip # Issue 12587
 isolate/ping_pause_test: Skip # Resolve test issues
 isolate/ping_test: Skip # Resolve test issues
diff --git a/tests/lib_2/mirrors/bad_argument_types_test.dart b/tests/lib_2/mirrors/bad_argument_types_test.dart
new file mode 100644
index 0000000..8063803
--- /dev/null
+++ b/tests/lib_2/mirrors/bad_argument_types_test.dart
@@ -0,0 +1,157 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+int foobar = 1;
+
+set foobaz(int x) {
+  foobar = x;
+}
+
+void foo(Map<String, String> m) {
+  print(m);
+  print(m['bar']);
+}
+
+void bar<T extends num>(T a) {
+  print(a);
+}
+
+class Foo {
+  Map<String, String> bork;
+  static Map<String, String> bark;
+  static set woof(Map<String, String> x) {
+    bark = x;
+  }
+
+  Foo(Map<String, String> m) {
+    print(m);
+  }
+
+  Foo.a();
+
+  static void baz(Map<String, String> m, {String bar}) {
+    print('baz');
+    print(m['bar']);
+    print(bar);
+  }
+
+  void bar(Map<String, String> m) {
+    print('bar');
+    print(m.runtimeType);
+  }
+}
+
+class FooBar<T extends num> {
+  T bar;
+  FooBar(this.bar) {
+    print(bar);
+  }
+
+  set barz(T x) {
+    bar = x;
+  }
+
+  factory FooBar.baz(T bar) {
+    print(bar);
+    return FooBar(bar);
+  }
+
+  void foobar<S>(T a, S b) {
+    print(a);
+    print(b);
+  }
+}
+
+void badClassStaticInvoke() {
+  Map<String, String> map = Map<String, String>();
+  map['bar'] = 'Hello world!';
+  final cm = reflectClass(Foo);
+  Expect.throwsTypeError(() => cm.invoke(#baz, [
+        map
+      ], {
+        #bar: {'boo': 'bah'}
+      }));
+}
+
+void badStaticInvoke() {
+  final ClosureMirror im = reflect(foo);
+  Expect.throwsTypeError(() => im.apply(['Hello world!']));
+}
+
+void badInstanceInvoke() {
+  final fooCls = Foo.a();
+  final im = reflect(fooCls);
+  Expect.throwsTypeError(() => im.invoke(#bar, ['Hello World!']));
+}
+
+void badConstructorInvoke() {
+  final cm = reflectClass(Foo);
+  Expect.throwsTypeError(() => cm.newInstance(Symbol(''), ['Hello World!']));
+}
+
+void badSetterInvoke() {
+  final fooCls = Foo.a();
+  final im = reflect(fooCls);
+  Expect.throwsTypeError(() => im.setField(#bork, 'Hello World!'));
+}
+
+void badStaticSetterInvoke() {
+  final cm = reflectClass(Foo);
+  Expect.throwsTypeError(() => cm.setField(#bark, 'Hello World!'));
+  Expect.throwsTypeError(() => cm.setField(#woof, 'Hello World!'));
+}
+
+void badGenericConstructorInvoke() {
+  final cm = reflectType(FooBar, [int]) as ClassMirror;
+  Expect.throwsTypeError(() => cm.newInstance(Symbol(''), ['Hello World!']));
+}
+
+void badGenericClassStaticInvoke() {
+  final cm = reflectType(FooBar, [int]) as ClassMirror;
+  final im = cm.newInstance(Symbol(''), [1]);
+  Expect.throwsTypeError(() => im.invoke(#foobar, ['Hello', 'World']));
+}
+
+void badGenericFactoryInvoke() {
+  final cm = reflectType(FooBar, [int]) as ClassMirror;
+  Expect.throwsTypeError(() => cm.newInstance(Symbol('baz'), ['Hello World!']));
+}
+
+void badGenericStaticInvoke() {
+  final ClosureMirror im = reflect(bar);
+  Expect.throwsTypeError(() => im.apply(['Hello world!']));
+}
+
+void badGenericSetterInvoke() {
+  final cm = reflectType(FooBar, [int]) as ClassMirror;
+  final im = cm.newInstance(Symbol(''), [0]);
+  Expect.throwsTypeError(() => im.setField(#bar, 'Hello world!'));
+  Expect.throwsTypeError(() => im.setField(#barz, 'Hello world!'));
+}
+
+void badLibrarySetterInvoke() {
+  final lm = currentMirrorSystem().findLibrary(Symbol(''));
+  Expect.throwsTypeError(() => lm.setField(#foobar, 'Foobaz'));
+  Expect.throwsTypeError(() => lm.setField(#foobaz, 'Foobaz'));
+}
+
+void main() {
+  badClassStaticInvoke();
+  badStaticInvoke();
+  badInstanceInvoke();
+  badConstructorInvoke();
+  badSetterInvoke();
+  badStaticSetterInvoke();
+  badGenericConstructorInvoke();
+  badGenericClassStaticInvoke();
+  badGenericFactoryInvoke();
+  badGenericStaticInvoke();
+  badGenericSetterInvoke();
+  badLibrarySetterInvoke();
+}
diff --git a/tests/standalone/dwarf_stack_trace_test.dart b/tests/standalone/dwarf_stack_trace_test.dart
deleted file mode 100644
index 6b16966..0000000
--- a/tests/standalone/dwarf_stack_trace_test.dart
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// VMOptions=--dwarf-stack-traces
-
-import 'package:unittest/unittest.dart';
-import 'dart:io';
-
-bar() {
-  // Keep the 'throw' and its argument on separate lines.
-  throw // force linebreak with dartfmt
-      "Hello, Dwarf!";
-}
-
-foo() {
-  bar();
-}
-
-main() {
-  String rawStack;
-  try {
-    foo();
-  } catch (e, st) {
-    rawStack = st.toString();
-  }
-  print(rawStack);
-
-  if (Platform.isAndroid) {
-    // Attempts to execute 'file' etc fail with security exceptions on
-    // Android.
-    print("Skipping test on Android");
-    return;
-  }
-
-  if (Platform.isMacOS) {
-    // addr2line is not part of the XCode command line tools.
-    print("Skipping test on MacOS");
-    return;
-  }
-
-  if (Platform.isWindows) {
-    // Lacks 'file' and 'addr2line'.
-    print("Skipping test on Windows");
-    return;
-  }
-
-  ProcessResult result = Process.runSync("file", ["--version"]);
-  if (result.exitCode != 0) {
-    print(result.stdout);
-    print(result.stderr);
-    throw "'file' is not present";
-  }
-
-  result = Process.runSync("addr2line", ["--version"]);
-  if (result.exitCode != 0) {
-    print(result.stdout);
-    print(result.stderr);
-    throw "'addr2line' is not present";
-  }
-
-  result = Process.runSync("file", [Platform.script.toFilePath()]);
-  if (result.exitCode != 0) {
-    print(result.stdout);
-    print(result.stderr);
-    throw "'file' failed";
-    return;
-  }
-  if (!result.stdout.contains("shared object")) {
-    print("Skipping test because we are not running from a dylib");
-    return;
-  }
-
-  var frameRegex = new RegExp("pc ([0-9a-z]+)  ([0-9a-zA-Z/\._-]+)");
-  var symbolizedStack = new StringBuffer();
-  for (var frameMatch in frameRegex.allMatches(rawStack)) {
-    var framePC = frameMatch[1];
-    var frameDSO = frameMatch[2];
-    print(framePC);
-    print(frameDSO);
-    result = Process.runSync(
-        "addr2line", ["--exe", frameDSO, "--functions", "--inlines", framePC]);
-    if (result.exitCode != 0) {
-      print(result.stdout);
-      print(result.stderr);
-      throw "'addr2line' failed";
-    }
-    print(result.stdout);
-    symbolizedStack.write(result.stdout);
-  }
-
-  print(symbolizedStack);
-  var symbolizedLines = symbolizedStack.toString().split("\n");
-  expect(symbolizedLines.length, greaterThan(8));
-  expect(
-      symbolizedStack.toString(),
-      stringContainsInOrder([
-        "bar",
-        "dwarf_stack_trace_test.dart:12",
-        "foo",
-        "dwarf_stack_trace_test.dart:17",
-        "main",
-        "dwarf_stack_trace_test.dart:23",
-        "main", // dispatcher
-        "dwarf_stack_trace_test.dart:20"
-      ]));
-}
diff --git a/tests/standalone/io/raw_datagram_socket_test.dart b/tests/standalone/io/raw_datagram_socket_test.dart
deleted file mode 100644
index 3976c54..0000000
--- a/tests/standalone/io/raw_datagram_socket_test.dart
+++ /dev/null
@@ -1,371 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:async";
-import "dart:io";
-import "dart:typed_data";
-
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-
-class FutureExpect {
-  static Future check(Future result, check) =>
-      result.then((value) => check(value));
-  static Future throws(Future result) => result.then((value) {
-        throw new ExpectException(
-            "FutureExpect.throws received $value instead of an exception");
-      }, onError: (_) => null);
-}
-
-testDatagramBroadcastOptions() {
-  test(address) {
-    asyncStart();
-    RawDatagramSocket.bind(address, 0).then((socket) {
-      Expect.isFalse(socket.broadcastEnabled);
-      socket.broadcastEnabled = true;
-      if (!Platform.isMacOS) {
-        Expect.isTrue(socket.broadcastEnabled);
-      }
-      socket.broadcastEnabled = false;
-      Expect.isFalse(socket.broadcastEnabled);
-      asyncEnd();
-    });
-  }
-
-  test(InternetAddress.loopbackIPv4);
-  test(InternetAddress.anyIPv4);
-}
-
-testDatagramMulticastOptions() {
-  test(address) {
-    asyncStart();
-    RawDatagramSocket.bind(address, 0).then((socket) {
-      Expect.isTrue(socket.multicastLoopback);
-      Expect.equals(1, socket.multicastHops);
-      Expect.throws(() => socket.multicastInterface);
-
-      socket.multicastLoopback = false;
-      socket.multicastHops = 4;
-      Expect.isFalse(socket.multicastLoopback);
-      Expect.equals(4, socket.multicastHops);
-      Expect.throws(() => socket.multicastInterface = null);
-
-      socket.multicastLoopback = true;
-      socket.multicastHops = 1;
-      Expect.isTrue(socket.multicastLoopback);
-      Expect.equals(1, socket.multicastHops);
-      Expect.throws(() => socket.multicastInterface);
-
-      asyncEnd();
-    });
-  }
-
-  test(InternetAddress.loopbackIPv4);
-  test(InternetAddress.anyIPv4);
-  test(InternetAddress.loopbackIPv6);
-  test(InternetAddress.anyIPv6);
-}
-
-testDatagramSocketReuseAddress() {
-  test(address, reuseAddress) {
-    asyncStart();
-    RawDatagramSocket.bind(address, 0,
-            reuseAddress: reuseAddress,
-            reusePort: Platform.isMacOS && reuseAddress)
-        .then((socket) {
-      if (reuseAddress) {
-        RawDatagramSocket.bind(address, socket.port,
-                reusePort: Platform.isMacOS)
-            .then((s) => Expect.isTrue(s is RawDatagramSocket))
-            .then(asyncSuccess);
-      } else {
-        FutureExpect.throws(RawDatagramSocket.bind(address, socket.port))
-            .then(asyncSuccess);
-      }
-    });
-  }
-
-  test(InternetAddress.loopbackIPv4, true);
-  test(InternetAddress.loopbackIPv4, false);
-  test(InternetAddress.loopbackIPv6, true);
-  test(InternetAddress.loopbackIPv6, false);
-}
-
-testDatagramSocketTtl() {
-  test(address, ttl, shouldSucceed) {
-    asyncStart();
-    if (shouldSucceed) {
-      RawDatagramSocket.bind(address, 0, ttl: ttl).then(asyncSuccess);
-    } else {
-      Expect.throws(() => RawDatagramSocket.bind(address, 0, ttl: ttl));
-      asyncEnd();
-    }
-  }
-
-  test(InternetAddress.loopbackIPv4, 1, true);
-  test(InternetAddress.loopbackIPv4, 255, true);
-  test(InternetAddress.loopbackIPv4, 256, false);
-  test(InternetAddress.loopbackIPv4, 0, false);
-  test(InternetAddress.loopbackIPv4, null, false);
-}
-
-testBroadcast() {
-  test(bindAddress, broadcastAddress, enabled) {
-    asyncStart();
-    Future.wait([
-      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
-      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)
-    ]).then((values) {
-      var broadcastTimer;
-      var sender = values[0];
-      var receiver = values[1];
-      // On Windows at least the receiver needs to have broadcast
-      // enabled whereas on Linux at least the sender needs to.
-      receiver.broadcastEnabled = enabled;
-      sender.broadcastEnabled = enabled;
-      receiver.listen((event) {
-        if (event == RawSocketEvent.read) {
-          Expect.isTrue(enabled);
-          sender.close();
-          receiver.close();
-          broadcastTimer.cancel();
-          asyncEnd();
-        }
-      });
-
-      int sendCount = 0;
-      send(_) {
-        int bytes =
-            sender.send(new Uint8List(1), broadcastAddress, receiver.port);
-        Expect.isTrue(bytes == 0 || bytes == 1);
-        sendCount++;
-        if (!enabled && sendCount == 50) {
-          sender.close();
-          receiver.close();
-          broadcastTimer.cancel();
-          asyncEnd();
-        }
-      }
-
-      broadcastTimer = new Timer.periodic(new Duration(milliseconds: 10), send);
-    });
-  }
-
-  var broadcast = new InternetAddress("255.255.255.255");
-  test(InternetAddress.anyIPv4, broadcast, false);
-  test(InternetAddress.anyIPv4, broadcast, true);
-}
-
-testLoopbackMulticast() {
-  test(bindAddress, multicastAddress, enabled) {
-    asyncStart();
-    Future.wait([
-      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
-      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)
-    ]).then((values) {
-      var senderTimer;
-      var sender = values[0];
-      var receiver = values[1];
-
-      sender.joinMulticast(multicastAddress);
-      receiver.joinMulticast(multicastAddress);
-      // On Windows at least the receiver needs to have multicast
-      // loop enabled whereas on Linux at least the sender needs to.
-      receiver.multicastLoopback = enabled;
-      sender.multicastLoopback = enabled;
-
-      receiver.listen((event) {
-        if (event == RawSocketEvent.read) {
-          if (!enabled) {
-            var data = receiver.receive();
-            print(data.port);
-            print(data.address);
-          }
-          Expect.isTrue(enabled);
-          sender.close();
-          receiver.close();
-          senderTimer.cancel();
-          asyncEnd();
-        }
-      });
-
-      int sendCount = 0;
-      send(_) {
-        int bytes =
-            sender.send(new Uint8List(1), multicastAddress, receiver.port);
-        Expect.isTrue(bytes == 0 || bytes == 1);
-        sendCount++;
-        if (!enabled && sendCount == 50) {
-          sender.close();
-          receiver.close();
-          senderTimer.cancel();
-          asyncEnd();
-        }
-      }
-
-      senderTimer = new Timer.periodic(new Duration(milliseconds: 10), send);
-    });
-  }
-
-  test(InternetAddress.anyIPv4, new InternetAddress("228.0.0.4"), true);
-  test(InternetAddress.anyIPv4, new InternetAddress("224.0.0.0"), false);
-  // TODO(30306): Reenable for Linux
-  if (!Platform.isMacOS && !Platform.isLinux) {
-    test(InternetAddress.anyIPv6, new InternetAddress("ff11::0"), true);
-    test(InternetAddress.anyIPv6, new InternetAddress("ff11::0"), false);
-  }
-}
-
-testLoopbackMulticastError() {
-  var bindAddress = InternetAddress.anyIPv4;
-  var multicastAddress = new InternetAddress("228.0.0.4");
-  asyncStart();
-  Future.wait([
-    RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
-    RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)
-  ]).then((values) {
-    var sender = values[0];
-    var receiver = values[1];
-    Expect.throws(() {
-      sender.joinMulticast(new InternetAddress("127.0.0.1"));
-    }, (e) => e is! TypeError);
-    sender.close();
-    receiver.close();
-    asyncEnd();
-  });
-}
-
-testSendReceive(InternetAddress bindAddress, int dataSize) {
-  asyncStart();
-
-  var total = 1000;
-
-  int receivedSeq = 0;
-
-  var ackSeq = 0;
-  Timer ackTimer;
-
-  Future.wait([
-    RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
-    RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)
-  ]).then((values) {
-    var sender = values[0];
-    var receiver = values[1];
-    if (bindAddress.isMulticast) {
-      sender.multicastLoopback = true;
-      receiver.multicastLoopback = true;
-      sender.joinMulticast(bindAddress);
-      receiver.joinMulticast(bindAddress);
-    }
-
-    Uint8List createDataPackage(int seq) {
-      var data = new Uint8List(dataSize);
-      (new ByteData.view(data.buffer, 0, 4)).setUint32(0, seq);
-      return data;
-    }
-
-    Uint8List createAckPackage(int seq) {
-      var data = new Uint8List(4);
-      new ByteData.view(data.buffer, 0, 4).setUint32(0, seq);
-      return data;
-    }
-
-    int packageSeq(Datagram datagram) =>
-        new ByteData.view((datagram.data as Uint8List).buffer).getUint32(0);
-
-    void sendData(int seq) {
-      // Send a datagram acknowledging the received sequence.
-      int bytes =
-          sender.send(createDataPackage(seq), bindAddress, receiver.port);
-      Expect.isTrue(bytes == 0 || bytes == dataSize);
-    }
-
-    void sendAck(address, port) {
-      // Send a datagram acknowledging the received sequence.
-      int bytes = receiver.send(createAckPackage(receivedSeq), address, port);
-      Expect.isTrue(bytes == 0 || bytes == 4);
-      // Start a "long" timer for more data.
-      if (ackTimer != null) ackTimer.cancel();
-      ackTimer = new Timer.periodic(
-          new Duration(milliseconds: 100), (_) => sendAck(address, port));
-    }
-
-    sender.listen((event) {
-      switch (event) {
-        case RawSocketEvent.read:
-          var datagram = sender.receive();
-          if (datagram != null) {
-            Expect.equals(datagram.port, receiver.port);
-            if (!bindAddress.isMulticast) {
-              Expect.equals(receiver.address, datagram.address);
-            }
-            ackSeq = packageSeq(datagram);
-            if (ackSeq < total) {
-              sender.writeEventsEnabled = true;
-            } else {
-              sender.close();
-              receiver.close();
-              ackTimer.cancel();
-              asyncEnd();
-            }
-          }
-          break;
-        case RawSocketEvent.write:
-          // Send the next package.
-          sendData(ackSeq + 1);
-          break;
-        case RawSocketEvent.closed:
-          break;
-        default:
-          throw "Unexpected event $event";
-      }
-    });
-
-    receiver.writeEventsEnabled = false;
-    receiver.listen((event) {
-      switch (event) {
-        case RawSocketEvent.read:
-          var datagram = receiver.receive();
-          if (datagram != null) {
-            Expect.equals(datagram.port, sender.port);
-            Expect.equals(dataSize, datagram.data.length);
-            if (!bindAddress.isMulticast) {
-              Expect.equals(receiver.address, datagram.address);
-            }
-            var seq = packageSeq(datagram);
-            if (seq == receivedSeq + 1) {
-              receivedSeq = seq;
-              sendAck(bindAddress, sender.port);
-            }
-          }
-          break;
-        case RawSocketEvent.write:
-          throw "Unexpected.write";
-          break;
-        case RawSocketEvent.closed:
-          break;
-        default:
-          throw "Unexpected event $event";
-      }
-    });
-  });
-}
-
-main() {
-  testDatagramBroadcastOptions();
-  testDatagramMulticastOptions();
-  testDatagramSocketReuseAddress();
-  testDatagramSocketTtl();
-  testBroadcast();
-  testLoopbackMulticast();
-  testLoopbackMulticastError();
-  testSendReceive(InternetAddress.loopbackIPv4, 1000);
-  testSendReceive(InternetAddress.loopbackIPv6, 1000);
-  if (!Platform.isMacOS) {
-    testSendReceive(InternetAddress.loopbackIPv4, 32 * 1024);
-    testSendReceive(InternetAddress.loopbackIPv6, 32 * 1024);
-    testSendReceive(InternetAddress.loopbackIPv4, 64 * 1024 - 32);
-    testSendReceive(InternetAddress.loopbackIPv6, 64 * 1024 - 32);
-  }
-}
diff --git a/tests/standalone_2/dwarf_stack_trace_test.dart b/tests/standalone_2/dwarf_stack_trace_test.dart
new file mode 100644
index 0000000..23a35ef
--- /dev/null
+++ b/tests/standalone_2/dwarf_stack_trace_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// VMOptions=--dwarf-stack-traces
+
+import 'package:unittest/unittest.dart';
+import 'dart:io';
+
+bar() {
+  // Keep the 'throw' and its argument on separate lines.
+  throw // force linebreak with dartfmt
+      "Hello, Dwarf!";
+}
+
+foo() {
+  bar();
+}
+
+main() {
+  String rawStack;
+  try {
+    foo();
+  } catch (e, st) {
+    rawStack = st.toString();
+  }
+  print(rawStack);
+
+  if (Platform.isAndroid) {
+    // Attempts to execute 'file' etc fail with security exceptions on
+    // Android.
+    print("Skipping test on Android");
+    return;
+  }
+
+  if (Platform.isMacOS) {
+    // addr2line is not part of the XCode command line tools.
+    print("Skipping test on MacOS");
+    return;
+  }
+
+  if (Platform.isWindows) {
+    // Lacks 'file' and 'addr2line'.
+    print("Skipping test on Windows");
+    return;
+  }
+
+  ProcessResult result = Process.runSync("file", ["--version"]);
+  if (result.exitCode != 0) {
+    print(result.stdout);
+    print(result.stderr);
+    throw "'file' is not present";
+  }
+
+  result = Process.runSync("addr2line", ["--version"]);
+  if (result.exitCode != 0) {
+    print(result.stdout);
+    print(result.stderr);
+    throw "'addr2line' is not present";
+  }
+
+  result = Process.runSync("file", [Platform.script.toFilePath()]);
+  if (result.exitCode != 0) {
+    print(result.stdout);
+    print(result.stderr);
+    throw "'file' failed";
+    return;
+  }
+  if (!result.stdout.contains("shared object")) {
+    print("Skipping test because we are not running from a dylib");
+    return;
+  }
+
+  var frameRegex = new RegExp("pc ([0-9a-z]+)  ([0-9a-zA-Z/\._-]+)");
+  var symbolizedStack = new StringBuffer();
+  for (var frameMatch in frameRegex.allMatches(rawStack)) {
+    var framePC = frameMatch[1];
+    var frameDSO = frameMatch[2];
+    print(framePC);
+    print(frameDSO);
+    result = Process.runSync(
+        "addr2line", ["--exe", frameDSO, "--functions", "--inlines", framePC]);
+    if (result.exitCode != 0) {
+      print(result.stdout);
+      print(result.stderr);
+      throw "'addr2line' failed";
+    }
+    print(result.stdout);
+    symbolizedStack.write(result.stdout);
+  }
+
+  print(symbolizedStack);
+  var symbolizedLines = symbolizedStack.toString().split("\n");
+  expect(symbolizedLines.length, greaterThan(8));
+  expect(
+      symbolizedStack.toString(),
+      stringContainsInOrder([
+        "bar",
+        "dwarf_stack_trace_test.dart:12",
+        "foo",
+        "dwarf_stack_trace_test.dart:17",
+        "main",
+        "dwarf_stack_trace_test.dart:23",
+        "main", // dispatcher
+        "dwarf_stack_trace_test.dart:?"
+      ]));
+}
diff --git a/tests/standalone_2/fragmentation_test.dart b/tests/standalone_2/fragmentation_test.dart
index 27d7497..b083ec1 100644
--- a/tests/standalone_2/fragmentation_test.dart
+++ b/tests/standalone_2/fragmentation_test.dart
@@ -10,9 +10,14 @@
 // This test is deliberately CPU-light and so it can make a lot of
 // progress before the concurrent sweepers are done sweeping the heap.
 // In that time there is no freelist and so the issue does not arise.
-// VMOptions=--no_concurrent_sweep
-// VMOptions=--use_compactor_evacuating
-// VMOptions=--use_compactor_sliding
+// VMOptions=--no_concurrent_mark --no_concurrent_sweep
+// VMOptions=--no_concurrent_mark --concurrent_sweep
+// VMOptions=--no_concurrent_mark --use_compactor
+// VMOptions=--no_concurrent_mark --use_compactor --force_evacuation
+// VMOptions=--concurrent_mark --no_concurrent_sweep
+// VMOptions=--concurrent_mark --concurrent_sweep
+// VMOptions=--concurrent_mark --use_compactor
+// VMOptions=--concurrent_mark --use_compactor --force_evacuation
 
 main() {
   final List<List> arrays = [];
diff --git a/tests/standalone_2/io/dart_std_io_pipe_test.dart b/tests/standalone_2/io/dart_std_io_pipe_test.dart
index f897c2e..474e5a8 100644
--- a/tests/standalone_2/io/dart_std_io_pipe_test.dart
+++ b/tests/standalone_2/io/dart_std_io_pipe_test.dart
@@ -118,10 +118,10 @@
   }
 
   // Run the shell script.
-  test(shellScript.path, scriptFile.path, "0", false);
-  test(shellScript.path, scriptFile.path, "0", true);
-  test(shellScript.path, scriptFile.path, "1", false);
-  test(shellScript.path, scriptFile.path, "1", true);
-  test(shellScript.path, scriptFile.path, "2", false);
-  test(shellScript.path, scriptFile.path, "2", true);
+  test(shellScript.path, scriptFile.path, "0", false); //# 01: ok
+  test(shellScript.path, scriptFile.path, "0", true); //# 02: ok
+  test(shellScript.path, scriptFile.path, "1", false); //# 03: ok
+  test(shellScript.path, scriptFile.path, "1", true); //# 04: ok
+  test(shellScript.path, scriptFile.path, "2", false); //# 05: ok
+  test(shellScript.path, scriptFile.path, "2", true); //# 06: ok
 }
diff --git a/tests/standalone_2/io/file_lock_test.dart b/tests/standalone_2/io/file_lock_test.dart
index 413288c..f117223 100644
--- a/tests/standalone_2/io/file_lock_test.dart
+++ b/tests/standalone_2/io/file_lock_test.dart
@@ -22,6 +22,7 @@
     ..add(mode == FileLock.exclusive ? 'EXCLUSIVE' : 'SHARED')
     ..add('$start')
     ..add('$end');
+  var stacktrace = StackTrace.current;
   return Process
       .run(Platform.executable, arguments)
       .then((ProcessResult result) {
@@ -33,6 +34,8 @@
       print(result.stderr);
       print("  arguments:");
       print(arguments);
+      print("  call stack:");
+      print(stacktrace);
       Expect.fail('Client subprocess exit code: ${result.exitCode}');
     }
   });
diff --git a/tests/standalone_2/io/http_client_stays_alive_test.dart b/tests/standalone_2/io/http_client_stays_alive_test.dart
index efc9c43..8666bb8 100644
--- a/tests/standalone_2/io/http_client_stays_alive_test.dart
+++ b/tests/standalone_2/io/http_client_stays_alive_test.dart
@@ -18,6 +18,7 @@
 // within +/- 2 <= seconds.
 
 const SECONDS = 4;
+const SLACK = 60;
 
 List<String> packageOptions() {
   if (Platform.packageRoot != null) {
@@ -57,9 +58,9 @@
       // NOTE: There is a slight chance this will cause flakiness, but there is
       // no other good way of testing correctness of timing-dependent code
       // form the outside.
-      if (seconds < SECONDS || (SECONDS + 30) < seconds) {
+      if (seconds < SECONDS || (SECONDS + SLACK) < seconds) {
         throw "Child did exit within $seconds seconds, but expected it to take "
-            "roughly $SECONDS seconds.";
+            "roughly between $SECONDS and ${SECONDS + SLACK} seconds.";
       }
 
       asyncEnd();
diff --git a/tests/standalone_2/io/http_compression_test.dart b/tests/standalone_2/io/http_compression_test.dart
index 35afe5a..2e0b45f 100644
--- a/tests/standalone_2/io/http_compression_test.dart
+++ b/tests/standalone_2/io/http_compression_test.dart
@@ -11,112 +11,94 @@
 import 'dart:io';
 import 'dart:typed_data';
 
-void testServerCompress({bool clientAutoUncompress: true}) {
-  void test(List<int> data) {
-    HttpServer.bind("127.0.0.1", 0).then((server) {
-      server.autoCompress = true;
-      server.listen((request) {
-        request.response.add(data);
-        request.response.close();
-      });
-      var client = new HttpClient();
-      client.autoUncompress = clientAutoUncompress;
-      client.get("127.0.0.1", server.port, "/").then((request) {
-        request.headers.set(HttpHeaders.acceptEncodingHeader, "gzip,deflate");
-        return request.close();
-      }).then((response) {
-        Expect.equals(
-            "gzip", response.headers.value(HttpHeaders.contentEncodingHeader));
-        response.fold([], (list, b) {
-          list.addAll(b);
-          return list;
-        }).then((list) {
-          if (clientAutoUncompress) {
-            Expect.listEquals(data, list);
-          } else {
-            Expect.listEquals(data, gzip.decode(list));
-          }
-          server.close();
-          client.close();
-        });
-      });
+void testServerCompress({bool clientAutoUncompress: true}) async {
+  void test(List<int> data) async {
+    final server = await HttpServer.bind("127.0.0.1", 0);
+    server.autoCompress = true;
+    server.listen((request) {
+      request.response.add(data);
+      request.response.close();
     });
+    var client = new HttpClient();
+    client.autoUncompress = clientAutoUncompress;
+    final request = await client.get("127.0.0.1", server.port, "/");
+    request.headers.set(HttpHeaders.acceptEncodingHeader, "gzip,deflate");
+    final response = await request.close();
+    Expect.equals(
+        "gzip", response.headers.value(HttpHeaders.contentEncodingHeader));
+    final list = await response.fold(<int>[], (list, b) => list..addAll(b));
+    if (clientAutoUncompress) {
+      Expect.listEquals(data, list);
+    } else {
+      Expect.listEquals(data, gzip.decode(list));
+    }
+    server.close();
+    client.close();
   }
 
-  test("My raw server provided data".codeUnits);
+  await test("My raw server provided data".codeUnits);
   var longBuffer = new Uint8List(1024 * 1024);
   for (int i = 0; i < longBuffer.length; i++) {
     longBuffer[i] = i & 0xFF;
   }
-  test(longBuffer);
+  await test(longBuffer);
 }
 
-void testAcceptEncodingHeader() {
-  void test(String encoding, bool valid) {
-    HttpServer.bind("127.0.0.1", 0).then((server) {
-      server.autoCompress = true;
-      server.listen((request) {
-        request.response.write("data");
-        request.response.close();
-      });
-      var client = new HttpClient();
-      client.get("127.0.0.1", server.port, "/").then((request) {
-        request.headers.set(HttpHeaders.acceptEncodingHeader, encoding);
-        return request.close();
-      }).then((response) {
-        Expect.equals(
-            valid,
-            ("gzip" ==
-                response.headers.value(HttpHeaders.contentEncodingHeader)));
-        response.listen((_) {}, onDone: () {
-          server.close();
-          client.close();
-        });
-      });
-    });
-  }
-
-  test('gzip', true);
-  test('deflate', false);
-  test('gzip, deflate', true);
-  test('gzip ,deflate', true);
-  test('gzip  ,  deflate', true);
-  test('deflate,gzip', true);
-  test('deflate, gzip', true);
-  test('deflate ,gzip', true);
-  test('deflate  ,  gzip', true);
-  test('abc,deflate  ,  gzip,def,,,ghi  ,jkl', true);
-  test('xgzip', false);
-  test('gzipx;', false);
-}
-
-void testDisableCompressTest() {
-  HttpServer.bind("127.0.0.1", 0).then((server) {
-    Expect.equals(false, server.autoCompress);
+void testAcceptEncodingHeader() async {
+  void test(String encoding, bool valid) async {
+    final server = await HttpServer.bind("127.0.0.1", 0);
+    server.autoCompress = true;
     server.listen((request) {
-      Expect.equals(
-          'gzip', request.headers.value(HttpHeaders.acceptEncodingHeader));
       request.response.write("data");
       request.response.close();
     });
     var client = new HttpClient();
-    client
-        .get("127.0.0.1", server.port, "/")
-        .then((request) => request.close())
-        .then((response) {
-      Expect.equals(
-          null, response.headers.value(HttpHeaders.contentEncodingHeader));
-      response.listen((_) {}, onDone: () {
-        server.close();
-        client.close();
-      });
-    });
-  });
+    final request = await client.get("127.0.0.1", server.port, "/");
+    request.headers.set(HttpHeaders.acceptEncodingHeader, encoding);
+    final response = await request.close();
+    Expect.equals(valid,
+        ("gzip" == response.headers.value(HttpHeaders.contentEncodingHeader)));
+    await response.listen((_) {}).asFuture();
+    server.close();
+    client.close();
+  }
+
+  await test('gzip', true);
+  await test('deflate', false);
+  await test('gzip, deflate', true);
+  await test('gzip ,deflate', true);
+  await test('gzip  ,  deflate', true);
+  await test('deflate,gzip', true);
+  await test('deflate, gzip', true);
+  await test('deflate ,gzip', true);
+  await test('deflate  ,  gzip', true);
+  await test('abc,deflate  ,  gzip,def,,,ghi  ,jkl', true);
+  await test('xgzip', false);
+  await test('gzipx;', false);
 }
 
-void main() {
-  testServerCompress();
-  testServerCompress(clientAutoUncompress: false);
-  testAcceptEncodingHeader();
-  testDisableCompressTest();
+void testDisableCompressTest() async {
+  final server = await HttpServer.bind("127.0.0.1", 0);
+  Expect.equals(false, server.autoCompress);
+  server.listen((request) {
+    Expect.equals(
+        'gzip', request.headers.value(HttpHeaders.acceptEncodingHeader));
+    request.response.write("data");
+    request.response.close();
+  });
+  final client = new HttpClient();
+  final request = await client.get("127.0.0.1", server.port, "/");
+  final response = await request.close();
+  Expect.equals(
+      null, response.headers.value(HttpHeaders.contentEncodingHeader));
+  await response.listen((_) {}).asFuture();
+  server.close();
+  client.close();
+}
+
+void main() async {
+  await testServerCompress();
+  await testServerCompress(clientAutoUncompress: false);
+  await testAcceptEncodingHeader();
+  await testDisableCompressTest();
 }
diff --git a/tests/standalone_2/io/http_loopback_test.dart b/tests/standalone_2/io/http_loopback_test.dart
index 11e2b16..2667091 100644
--- a/tests/standalone_2/io/http_loopback_test.dart
+++ b/tests/standalone_2/io/http_loopback_test.dart
@@ -2,61 +2,64 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "dart:async";
 import "dart:io";
 import "package:expect/expect.dart";
 
 RawServerSocket server;
 RawSocket client;
 
-serverListen(RawSocket serverSide) {
-  serveData(RawSocketEvent event) {
-    serverSide.shutdown(SocketDirection.send);
-  }
+/// Creates a callback that listens for incomming connections.
+/// If [remotePorts] is not null then callback would add remote port of each
+/// new connection to the given list.
+makeListener([List<int> remotePorts]) {
+  return (RawSocket serverSide) {
+    serveData(RawSocketEvent event) {
+      serverSide.shutdown(SocketDirection.send);
+    }
 
-  serverSide.listen(serveData);
+    remotePorts?.add(serverSide.remotePort);
+    serverSide.listen(serveData);
+  };
 }
 
-IPv4ToIPv6FailureTest() async {
-  server = await RawServerSocket.bind(InternetAddress.loopbackIPv6, 0);
-  server.listen(serverListen);
-  bool testFailure = false;
+/// Verify that you can't connect to loopback via mismatching protocol, e.g.
+/// if the server is listening to IPv4 then you can't connect via IPv6.
+Future<void> failureTest(
+    InternetAddress serverAddr, InternetAddress clientAddr) async {
+  final remotePorts = <int>[];
+  server = await RawServerSocket.bind(serverAddr, 0);
+  server.listen(makeListener(remotePorts));
+
+  bool success = false;
   try {
-    client = await RawSocket.connect(InternetAddress.loopbackIPv4, server.port);
+    client = await RawSocket.connect(clientAddr, server.port);
+    final clientPort = client.port;
+
+    // We might actually succeed in connecting somewhere (e.g. to another test
+    // which by chance started listening to the same port).
+    // To make this test more robust we add a check that verifies that we did
+    // not connect to our server by checking if clientPort is within
+    // the list of remotePorts observed by the server. It should not be there.
+    await Future.delayed(Duration(seconds: 2));
+    success = !remotePorts.contains(clientPort);
     await client.close();
-    testFailure = true;
   } on SocketException catch (e) {
-    // We shouldn't be able to connect to the IPv6 loopback adapter using the
-    // IPv4 loopback address.
+    // We expect that we fail to connect to IPv4 server via IPv6 client and
+    // vice versa.
+    success = true;
   } catch (e) {
-    testFailure = true;
+    Expect.fail('Unexpected exception: $e');
   } finally {
-    Expect.equals(testFailure, false);
+    Expect.isTrue(success,
+        'Unexpected connection to $serverAddr via $clientAddr address!');
     await server.close();
   }
 }
 
-IPv6ToIPv4FailureTest() async {
-  server = await RawServerSocket.bind(InternetAddress.loopbackIPv4, 0);
-  server.listen(serverListen);
-  bool testFailure = false;
-  try {
-    client = await RawSocket.connect(InternetAddress.loopbackIPv6, server.port);
-    await client.close();
-    testFailure = true;
-  } on SocketException catch (e) {
-    // We shouldn't be able to connect to the IPv4 loopback adapter using the
-    // IPv6 loopback address.
-  } catch (e) {
-    testFailure = true;
-  } finally {
-    Expect.equals(testFailure, false);
-    await server.close();
-  }
-}
-
-loopbackSuccessTest(InternetAddress address) async {
+Future<void> successTest(InternetAddress address) async {
   server = await RawServerSocket.bind(address, 0);
-  server.listen(serverListen);
+  server.listen(makeListener());
   bool testFailure = false;
   try {
     client = await RawSocket.connect(address, server.port);
@@ -70,8 +73,8 @@
 }
 
 main() async {
-  await IPv4ToIPv6FailureTest();
-  await IPv6ToIPv4FailureTest();
-  await loopbackSuccessTest(InternetAddress.loopbackIPv4);
-  await loopbackSuccessTest(InternetAddress.loopbackIPv6);
+  await failureTest(InternetAddress.loopbackIPv4, InternetAddress.loopbackIPv6);
+  await failureTest(InternetAddress.loopbackIPv6, InternetAddress.loopbackIPv4);
+  await successTest(InternetAddress.loopbackIPv4);
+  await successTest(InternetAddress.loopbackIPv6);
 }
diff --git a/tests/standalone_2/io/issue_31492_test.dart b/tests/standalone_2/io/issue_31492_test.dart
new file mode 100644
index 0000000..ed3c67e
--- /dev/null
+++ b/tests/standalone_2/io/issue_31492_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Testing that HttpClient throws an exception if a connection is opened after
+// the client is closed. https://github.com/dart-lang/sdk/issues/31492
+
+import "dart:io";
+import "package:expect/expect.dart";
+
+void main() {
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.listen((request) {
+      request.listen((_) {});
+    });
+    var client = new HttpClient();
+    client.close();
+    Expect.throws<StateError>(() => client.post("127.0.0.1", server.port, "/"));
+    server.close();
+  });
+}
diff --git a/tests/standalone_2/io/process_detached_test.dart b/tests/standalone_2/io/process_detached_test.dart
index 55aeb06..ee093b3 100644
--- a/tests/standalone_2/io/process_detached_test.dart
+++ b/tests/standalone_2/io/process_detached_test.dart
@@ -48,7 +48,7 @@
     process.stdin.flush().then((_) => process.stdin.close());
     var f1 = process.stdout.fold([], (p, e) => p..addAll(e));
     var f2 = process.stderr.fold([], (p, e) => p..addAll(e));
-    Future.wait([f1, f2]).then((values) {
+    return Future.wait([f1, f2]).then((values) {
       Expect.listEquals(values[0], message);
       Expect.listEquals(values[1], message);
     }).whenComplete(() {
diff --git a/tests/standalone_2/io/process_non_ascii_test.dart b/tests/standalone_2/io/process_non_ascii_test.dart
index f897f77..0f1a592 100644
--- a/tests/standalone_2/io/process_non_ascii_test.dart
+++ b/tests/standalone_2/io/process_non_ascii_test.dart
@@ -26,9 +26,11 @@
   var nonAsciiTxtFile = new File('${nonAsciiDir.path}/æøå.txt');
   nonAsciiTxtFile.writeAsStringSync('æøå');
   var script = nonAsciiFile.path;
-  Process
-      .run(executable, [script], workingDirectory: nonAsciiDir.path)
-      .then((result) {
+  // Note: we prevent this child process from using Crashpad handler because
+  // this introduces an issue with deleting the temporary directory.
+  Process.run(executable, [script],
+      workingDirectory: nonAsciiDir.path,
+      environment: {'DART_CRASHPAD_HANDLER': ''}).then((result) {
     Expect.equals(0, result.exitCode);
     tempDir.deleteSync(recursive: true);
     asyncEnd();
diff --git a/tests/standalone_2/io/raw_datagram_socket_test.dart b/tests/standalone_2/io/raw_datagram_socket_test.dart
new file mode 100644
index 0000000..a933305
--- /dev/null
+++ b/tests/standalone_2/io/raw_datagram_socket_test.dart
@@ -0,0 +1,377 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "dart:io";
+import "dart:typed_data";
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+class FutureExpect {
+  static Future check(Future result, check) =>
+      result.then((value) => check(value));
+  static Future throws(Future result) => result.then((value) {
+        throw new ExpectException(
+            "FutureExpect.throws received $value instead of an exception");
+      }, onError: (_) => null);
+}
+
+testDatagramBroadcastOptions() {
+  test(address) {
+    asyncStart();
+    RawDatagramSocket.bind(address, 0).then((socket) {
+      Expect.isFalse(socket.broadcastEnabled);
+      socket.broadcastEnabled = true;
+      if (!Platform.isMacOS) {
+        Expect.isTrue(socket.broadcastEnabled);
+      }
+      socket.broadcastEnabled = false;
+      Expect.isFalse(socket.broadcastEnabled);
+      asyncEnd();
+    });
+  }
+
+  test(InternetAddress.loopbackIPv4);
+  test(InternetAddress.anyIPv4);
+}
+
+testDatagramMulticastOptions() {
+  test(address) {
+    asyncStart();
+    RawDatagramSocket.bind(address, 0).then((socket) {
+      Expect.isTrue(socket.multicastLoopback);
+      Expect.equals(1, socket.multicastHops);
+      Expect.throws(() => socket.multicastInterface);
+
+      socket.multicastLoopback = false;
+      socket.multicastHops = 4;
+      Expect.isFalse(socket.multicastLoopback);
+      Expect.equals(4, socket.multicastHops);
+      Expect.throws(() => socket.multicastInterface = null);
+
+      socket.multicastLoopback = true;
+      socket.multicastHops = 1;
+      Expect.isTrue(socket.multicastLoopback);
+      Expect.equals(1, socket.multicastHops);
+      Expect.throws(() => socket.multicastInterface);
+
+      asyncEnd();
+    });
+  }
+
+  test(InternetAddress.loopbackIPv4);
+  test(InternetAddress.anyIPv4);
+  test(InternetAddress.loopbackIPv6);
+  test(InternetAddress.anyIPv6);
+}
+
+testDatagramSocketReuseAddress() {
+  test(address, reuseAddress) {
+    asyncStart();
+    RawDatagramSocket.bind(address, 0,
+            reuseAddress: reuseAddress,
+            reusePort: Platform.isMacOS && reuseAddress)
+        .then((socket) {
+      if (reuseAddress) {
+        RawDatagramSocket.bind(address, socket.port,
+                reusePort: Platform.isMacOS)
+            .then((s) => Expect.isTrue(s is RawDatagramSocket))
+            .then(asyncSuccess);
+      } else {
+        FutureExpect.throws(RawDatagramSocket.bind(address, socket.port))
+            .then(asyncSuccess);
+      }
+    });
+  }
+
+  test(InternetAddress.loopbackIPv4, true);
+  test(InternetAddress.loopbackIPv4, false);
+  test(InternetAddress.loopbackIPv6, true);
+  test(InternetAddress.loopbackIPv6, false);
+}
+
+testDatagramSocketTtl() {
+  test(address, ttl, shouldSucceed) {
+    asyncStart();
+    if (shouldSucceed) {
+      RawDatagramSocket.bind(address, 0, ttl: ttl).then(asyncSuccess);
+    } else {
+      Expect.throws(() => RawDatagramSocket.bind(address, 0, ttl: ttl));
+      asyncEnd();
+    }
+  }
+
+  test(InternetAddress.loopbackIPv4, 1, true);
+  test(InternetAddress.loopbackIPv4, 255, true);
+  test(InternetAddress.loopbackIPv4, 256, false);
+  test(InternetAddress.loopbackIPv4, 0, false);
+  test(InternetAddress.loopbackIPv4, null, false);
+
+  test(InternetAddress.loopbackIPv6, 1, true);
+  test(InternetAddress.loopbackIPv6, 255, true);
+  test(InternetAddress.loopbackIPv6, 256, false);
+  test(InternetAddress.loopbackIPv6, 0, false);
+  test(InternetAddress.loopbackIPv6, null, false);
+}
+
+testBroadcast() {
+  test(bindAddress, broadcastAddress, enabled) {
+    asyncStart();
+    Future.wait([
+      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
+      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)
+    ]).then((values) {
+      var broadcastTimer;
+      var sender = values[0];
+      var receiver = values[1];
+      // On Windows at least the receiver needs to have broadcast
+      // enabled whereas on Linux at least the sender needs to.
+      receiver.broadcastEnabled = enabled;
+      sender.broadcastEnabled = enabled;
+      receiver.listen((event) {
+        if (event == RawSocketEvent.read) {
+          Expect.isTrue(enabled);
+          sender.close();
+          receiver.close();
+          broadcastTimer.cancel();
+          asyncEnd();
+        }
+      });
+
+      int sendCount = 0;
+      send(_) {
+        int bytes =
+            sender.send(new Uint8List(1), broadcastAddress, receiver.port);
+        Expect.isTrue(bytes == 0 || bytes == 1);
+        sendCount++;
+        if (!enabled && sendCount == 50) {
+          sender.close();
+          receiver.close();
+          broadcastTimer.cancel();
+          asyncEnd();
+        }
+      }
+
+      broadcastTimer = new Timer.periodic(new Duration(milliseconds: 10), send);
+    });
+  }
+
+  var broadcast = new InternetAddress("255.255.255.255");
+  test(InternetAddress.anyIPv4, broadcast, false);
+  test(InternetAddress.anyIPv4, broadcast, true);
+}
+
+testLoopbackMulticast() {
+  test(bindAddress, multicastAddress, enabled) {
+    asyncStart();
+    Future.wait([
+      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
+      RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)
+    ]).then((values) {
+      var senderTimer;
+      var sender = values[0];
+      var receiver = values[1];
+
+      sender.joinMulticast(multicastAddress);
+      receiver.joinMulticast(multicastAddress);
+      // On Windows at least the receiver needs to have multicast
+      // loop enabled whereas on Linux at least the sender needs to.
+      receiver.multicastLoopback = enabled;
+      sender.multicastLoopback = enabled;
+
+      receiver.listen((event) {
+        if (event == RawSocketEvent.read) {
+          if (!enabled) {
+            var data = receiver.receive();
+            print(data.port);
+            print(data.address);
+          }
+          Expect.isTrue(enabled);
+          sender.close();
+          receiver.close();
+          senderTimer.cancel();
+          asyncEnd();
+        }
+      });
+
+      int sendCount = 0;
+      send(_) {
+        int bytes =
+            sender.send(new Uint8List(1), multicastAddress, receiver.port);
+        Expect.isTrue(bytes == 0 || bytes == 1);
+        sendCount++;
+        if (!enabled && sendCount == 50) {
+          sender.close();
+          receiver.close();
+          senderTimer.cancel();
+          asyncEnd();
+        }
+      }
+
+      senderTimer = new Timer.periodic(new Duration(milliseconds: 10), send);
+    });
+  }
+
+  test(InternetAddress.anyIPv4, new InternetAddress("228.0.0.4"), true);
+  test(InternetAddress.anyIPv4, new InternetAddress("224.0.0.0"), false);
+  // TODO(30306): Reenable for Linux
+  if (!Platform.isMacOS && !Platform.isLinux) {
+    test(InternetAddress.anyIPv6, new InternetAddress("ff11::0"), true);
+    test(InternetAddress.anyIPv6, new InternetAddress("ff11::0"), false);
+  }
+}
+
+testLoopbackMulticastError() {
+  var bindAddress = InternetAddress.anyIPv4;
+  var multicastAddress = new InternetAddress("228.0.0.4");
+  asyncStart();
+  Future.wait([
+    RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
+    RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)
+  ]).then((values) {
+    var sender = values[0];
+    var receiver = values[1];
+    Expect.throws(() {
+      sender.joinMulticast(new InternetAddress("127.0.0.1"));
+    }, (e) => e is! TypeError);
+    sender.close();
+    receiver.close();
+    asyncEnd();
+  });
+}
+
+testSendReceive(InternetAddress bindAddress, int dataSize) {
+  asyncStart();
+
+  var total = 1000;
+
+  int receivedSeq = 0;
+
+  var ackSeq = 0;
+  Timer ackTimer;
+
+  Future.wait([
+    RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false),
+    RawDatagramSocket.bind(bindAddress, 0, reuseAddress: false)
+  ]).then((values) {
+    var sender = values[0];
+    var receiver = values[1];
+    if (bindAddress.isMulticast) {
+      sender.multicastLoopback = true;
+      receiver.multicastLoopback = true;
+      sender.joinMulticast(bindAddress);
+      receiver.joinMulticast(bindAddress);
+    }
+
+    Uint8List createDataPackage(int seq) {
+      var data = new Uint8List(dataSize);
+      (new ByteData.view(data.buffer, 0, 4)).setUint32(0, seq);
+      return data;
+    }
+
+    Uint8List createAckPackage(int seq) {
+      var data = new Uint8List(4);
+      new ByteData.view(data.buffer, 0, 4).setUint32(0, seq);
+      return data;
+    }
+
+    int packageSeq(Datagram datagram) =>
+        new ByteData.view((datagram.data as Uint8List).buffer).getUint32(0);
+
+    void sendData(int seq) {
+      // Send a datagram acknowledging the received sequence.
+      int bytes =
+          sender.send(createDataPackage(seq), bindAddress, receiver.port);
+      Expect.isTrue(bytes == 0 || bytes == dataSize);
+    }
+
+    void sendAck(address, port) {
+      // Send a datagram acknowledging the received sequence.
+      int bytes = receiver.send(createAckPackage(receivedSeq), address, port);
+      Expect.isTrue(bytes == 0 || bytes == 4);
+      // Start a "long" timer for more data.
+      if (ackTimer != null) ackTimer.cancel();
+      ackTimer = new Timer.periodic(
+          new Duration(milliseconds: 100), (_) => sendAck(address, port));
+    }
+
+    sender.listen((event) {
+      switch (event) {
+        case RawSocketEvent.read:
+          var datagram = sender.receive();
+          if (datagram != null) {
+            Expect.equals(datagram.port, receiver.port);
+            if (!bindAddress.isMulticast) {
+              Expect.equals(receiver.address, datagram.address);
+            }
+            ackSeq = packageSeq(datagram);
+            if (ackSeq < total) {
+              sender.writeEventsEnabled = true;
+            } else {
+              sender.close();
+              receiver.close();
+              ackTimer.cancel();
+              asyncEnd();
+            }
+          }
+          break;
+        case RawSocketEvent.write:
+          // Send the next package.
+          sendData(ackSeq + 1);
+          break;
+        case RawSocketEvent.closed:
+          break;
+        default:
+          throw "Unexpected event $event";
+      }
+    });
+
+    receiver.writeEventsEnabled = false;
+    receiver.listen((event) {
+      switch (event) {
+        case RawSocketEvent.read:
+          var datagram = receiver.receive();
+          if (datagram != null) {
+            Expect.equals(datagram.port, sender.port);
+            Expect.equals(dataSize, datagram.data.length);
+            if (!bindAddress.isMulticast) {
+              Expect.equals(receiver.address, datagram.address);
+            }
+            var seq = packageSeq(datagram);
+            if (seq == receivedSeq + 1) {
+              receivedSeq = seq;
+              sendAck(bindAddress, sender.port);
+            }
+          }
+          break;
+        case RawSocketEvent.write:
+          throw "Unexpected.write";
+          break;
+        case RawSocketEvent.closed:
+          break;
+        default:
+          throw "Unexpected event $event";
+      }
+    });
+  });
+}
+
+main() {
+  testDatagramBroadcastOptions();
+  testDatagramMulticastOptions();
+  testDatagramSocketReuseAddress();
+  testDatagramSocketTtl();
+  testBroadcast();
+  testLoopbackMulticast();
+  testLoopbackMulticastError();
+  testSendReceive(InternetAddress.loopbackIPv4, 1000);
+  testSendReceive(InternetAddress.loopbackIPv6, 1000);
+  if (!Platform.isMacOS) {
+    testSendReceive(InternetAddress.loopbackIPv4, 32 * 1024);
+    testSendReceive(InternetAddress.loopbackIPv6, 32 * 1024);
+    testSendReceive(InternetAddress.loopbackIPv4, 64 * 1024 - 32);
+    testSendReceive(InternetAddress.loopbackIPv6, 64 * 1024 - 32);
+  }
+}
diff --git a/tests/standalone_2/io/regress_7679_test.dart b/tests/standalone_2/io/regress_7679_test.dart
index 63f11d3..3577a8b 100644
--- a/tests/standalone_2/io/regress_7679_test.dart
+++ b/tests/standalone_2/io/regress_7679_test.dart
@@ -35,9 +35,11 @@
 }
 """);
   String executable = new File(Platform.executable).resolveSymbolicLinksSync();
-  Process
-      .run(executable, ['script.dart'], workingDirectory: temp.path)
-      .then((result) {
+  // Note: we prevent this child process from using Crashpad handler because
+  // this introduces an issue with deleting the temporary directory.
+  Process.run(executable, ['script.dart'],
+      workingDirectory: temp.path,
+      environment: {'DART_CRASHPAD_HANDLER': ''}).then((result) {
     temp.deleteSync(recursive: true);
     Expect.equals(0, result.exitCode);
   });
diff --git a/tests/standalone_2/io/socket_bind_test.dart b/tests/standalone_2/io/socket_bind_test.dart
index 6e6db8c..0cc540e 100644
--- a/tests/standalone_2/io/socket_bind_test.dart
+++ b/tests/standalone_2/io/socket_bind_test.dart
@@ -5,75 +5,53 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
-import 'test_utils.dart' show freeIPv4AndIPv6Port, retry;
+import 'test_utils.dart' show retry, throws;
 
-testBindShared(String host, bool v6Only) {
-  asyncStart();
-  ServerSocket.bind(host, 0, v6Only: v6Only, shared: true).then((socket) {
-    Expect.isTrue(socket.port > 0);
+Future testBindShared(String host, bool v6Only) async {
+  final socket = await ServerSocket.bind(host, 0, v6Only: v6Only, shared: true);
+  Expect.isTrue(socket.port > 0);
 
-    asyncStart();
-    return ServerSocket
-        .bind(host, socket.port, v6Only: v6Only, shared: true)
-        .then((socket2) {
-      Expect.equals(socket.address.address, socket2.address.address);
-      Expect.equals(socket.port, socket2.port);
-      socket.close().whenComplete(asyncEnd);
-      socket2.close().whenComplete(asyncEnd);
-    });
-  });
+  final socket2 =
+      await ServerSocket.bind(host, socket.port, v6Only: v6Only, shared: true);
+
+  Expect.equals(socket.address.address, socket2.address.address);
+  Expect.equals(socket.port, socket2.port);
+
+  await socket.close();
+  await socket2.close();
 }
 
-negTestBindSharedMismatch(String host, bool v6Only) {
-  asyncStart();
-  ServerSocket.bind(host, 0, v6Only: v6Only).then((ServerSocket socket) {
-    Expect.isTrue(socket.port > 0);
+Future negTestBindSharedMismatch(String host, bool v6Only) async {
+  final socket = await ServerSocket.bind(host, 0, v6Only: v6Only);
+  Expect.isTrue(socket.port > 0);
 
-    asyncStart();
-    return ServerSocket
-        .bind(host, socket.port, v6Only: v6Only)
-        .catchError((error) {
-      Expect.isTrue(error is SocketException);
-      Expect.isTrue('$error'.contains('shared flag'));
-      socket.close().whenComplete(asyncEnd);
-      asyncEnd();
-    });
-  });
+  await throws(() => ServerSocket.bind(host, socket.port, v6Only: v6Only),
+      (error) => error is SocketException && '$error'.contains('shared flag'));
+  await socket.close();
 }
 
-negTestBindV6OnlyMismatch(String host, bool v6Only) {
-  asyncStart();
-  ServerSocket
-      .bind(host, 0, v6Only: v6Only, shared: true)
-      .then((ServerSocket socket) {
-    Expect.isTrue(socket.port > 0);
+Future negTestBindV6OnlyMismatch(String host, bool v6Only) async {
+  final socket = await ServerSocket.bind(host, 0, v6Only: v6Only, shared: true);
+  Expect.isTrue(socket.port > 0);
 
-    asyncStart();
-    return ServerSocket
-        .bind(host, socket.port, v6Only: !v6Only, shared: true)
-        .catchError((error) {
-      Expect.isTrue(error is SocketException);
-      Expect.isTrue('$error'.contains('v6Only flag'));
-      socket.close().whenComplete(asyncEnd);
-      asyncEnd();
-    });
-  });
+  await throws(
+      () => ServerSocket.bind(host, socket.port, v6Only: !v6Only, shared: true),
+      (error) => error is SocketException && '$error'.contains('v6Only flag'));
+
+  await socket.close();
 }
 
 Future testBindDifferentAddresses(InternetAddress addr1, InternetAddress addr2,
     bool addr1V6Only, bool addr2V6Only) async {
-  int freePort = await freeIPv4AndIPv6Port();
-
-  var socket = await ServerSocket.bind(addr1, freePort,
-      v6Only: addr1V6Only, shared: false);
+  var socket =
+      await ServerSocket.bind(addr1, 0, v6Only: addr1V6Only, shared: false);
 
   try {
     Expect.isTrue(socket.port > 0);
 
-    var socket2 = await ServerSocket.bind(addr2, freePort,
+    var socket2 = await ServerSocket.bind(addr2, socket.port,
         v6Only: addr2V6Only, shared: false);
     try {
       Expect.equals(socket.port, socket2.port);
@@ -85,9 +63,7 @@
   }
 }
 
-testListenCloseListenClose(String host) async {
-  asyncStart();
-
+Future testListenCloseListenClose(String host) async {
   ServerSocket socket = await ServerSocket.bind(host, 0, shared: true);
   ServerSocket socket2 =
       await ServerSocket.bind(host, socket.port, shared: true);
@@ -100,25 +76,26 @@
 
   // The second socket should have kept the OS socket alive. We can therefore
   // test if it is working correctly.
-  asyncStart();
-  socket2.first.then((socket) async {
-    await socket.drain();
-    await socket.close();
-    asyncEnd();
+
+  // For robustness we ignore any clients unrelated to this test.
+  final receivedClientPorts = <int>[];
+  socket2.listen((Socket client) async {
+    receivedClientPorts.add(client.remotePort);
+    await Future.wait([client.drain(), client.close()]);
   });
 
-  Socket client = await Socket.connect(host, socket2.port);
+  final client = await Socket.connect(host, socket2.port);
+  final clientPort = client.port;
   await client.close();
   await client.drain();
 
+  Expect.isTrue(receivedClientPorts.contains(clientPort));
+
   // Close the second server socket.
   await socket2.close();
-  asyncEnd();
 }
 
 main() async {
-  asyncStart();
-
   await retry(() async {
     await testBindDifferentAddresses(
         InternetAddress.anyIPv6, InternetAddress.anyIPv4, true, false);
@@ -129,16 +106,15 @@
   });
 
   for (var host in ['127.0.0.1', '::1']) {
-    testBindShared(host, false);
-    testBindShared(host, true);
+    await testBindShared(host, false);
+    await testBindShared(host, true);
 
-    negTestBindSharedMismatch(host, false);
-    negTestBindSharedMismatch(host, true);
+    await negTestBindSharedMismatch(host, false);
+    await negTestBindSharedMismatch(host, true);
 
-    negTestBindV6OnlyMismatch(host, true);
-    negTestBindV6OnlyMismatch(host, false);
+    await negTestBindV6OnlyMismatch(host, true);
+    await negTestBindV6OnlyMismatch(host, false);
 
-    testListenCloseListenClose(host);
+    await testListenCloseListenClose(host);
   }
-  asyncEnd();
 }
diff --git a/tests/standalone_2/io/socket_ipv6_test.dart b/tests/standalone_2/io/socket_ipv6_test.dart
index 769506f..4fb14cd 100644
--- a/tests/standalone_2/io/socket_ipv6_test.dart
+++ b/tests/standalone_2/io/socket_ipv6_test.dart
@@ -130,6 +130,7 @@
 }
 
 main() async {
+  asyncStart();
   await testIPv6toIPv6(); //               //# 01: ok
   await testIPv4toIPv6(); //               //# 02: ok
   await testIPv4toIPv4(); //               //# 03: ok
@@ -138,4 +139,5 @@
 
   await retry(testIPv6toIPv4); //          //# 06: ok
   await retry(testIPv4toIPv6_IPV6Only); // //# 07: ok
+  asyncEnd();
 }
diff --git a/tests/standalone_2/io/socket_source_address_test.dart b/tests/standalone_2/io/socket_source_address_test.dart
index 236733a..4fe8b39 100644
--- a/tests/standalone_2/io/socket_source_address_test.dart
+++ b/tests/standalone_2/io/socket_source_address_test.dart
@@ -6,39 +6,19 @@
 import "dart:async";
 import "dart:io";
 
-import "package:async_helper/async_helper.dart";
-import "package:expect/expect.dart";
-
-import 'test_utils.dart' show freeIPv4AndIPv6Port, retry;
-
-Future throws(Function f, Function check) async {
-  try {
-    await f();
-    Expect.fail('Did not throw');
-  } catch (e) {
-    if (check != null) {
-      if (!check(e)) {
-        Expect.fail('Unexpected: $e');
-      }
-    }
-  }
-}
+import 'test_utils.dart' show retry, throws;
 
 Future testArguments(connectFunction) async {
-  int freePort = await freeIPv4AndIPv6Port();
-
   var sourceAddress;
-  asyncStart();
-  var server =
-      await ServerSocket.bind(InternetAddress.loopbackIPv4, freePort);
+  final server = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
   server.listen((_) {
     throw 'Unexpected connection from address $sourceAddress';
-  }, onDone: () => asyncEnd());
+  });
 
-  asyncStart();
   // Illegal type for sourceAddress.
   for (sourceAddress in ['www.google.com', 'abc']) {
-    await throws(() => connectFunction('127.0.0.1', server.port,
+    await throws(
+        () => connectFunction('127.0.0.1', server.port,
             sourceAddress: sourceAddress),
         (e) => e is ArgumentError);
   }
@@ -58,8 +38,7 @@
             sourceAddress: sourceAddress),
         (e) => e is SocketException);
   }
-  asyncEnd();
-  server.close();
+  await server.close();
 }
 
 // IPv4 addresses to use as source address when connecting locally.
@@ -80,8 +59,6 @@
 
 Future testConnect(InternetAddress bindAddress, bool v6Only,
     Function connectFunction, Function closeDestroyFunction) async {
-  int freePort = await freeIPv4AndIPv6Port();
-
   var successCount = 0;
   if (!v6Only) successCount += ipV4SourceAddresses.length;
   if (bindAddress.type == InternetAddressType.IPv6) {
@@ -91,17 +68,14 @@
   var allConnected = new Completer();
   if (successCount == 0) allConnected.complete();
 
-  asyncStart();
-  var server = await ServerSocket.bind(bindAddress, freePort, v6Only: v6Only);
+  var server = await ServerSocket.bind(bindAddress, 0, v6Only: v6Only);
   server.listen((s) {
     s.destroy();
     count++;
     if (count == successCount) allConnected.complete();
-  }, onDone: () => asyncEnd());
+  });
 
-  asyncStart();
-
-  // Connect with IPv4 source addesses.
+  // Connect with IPv4 source addresses.
   for (var sourceAddress in ipV4SourceAddresses) {
     if (!v6Only) {
       var s = await connectFunction(InternetAddress.loopbackIPv4, server.port,
@@ -117,7 +91,7 @@
     }
   }
 
-  // Connect with IPv6 source addesses.
+  // Connect with IPv6 source addresses.
   for (var sourceAddress in ipV6SourceAddresses) {
     if (bindAddress.type == InternetAddressType.IPv6) {
       var s = await connectFunction(InternetAddress.loopbackIPv6, server.port,
@@ -134,12 +108,9 @@
 
   await allConnected.future;
   await server.close();
-  asyncEnd();
 }
 
 main() async {
-  asyncStart();
-
   await retry(() async {
     await testArguments(RawSocket.connect);
   });
@@ -171,6 +142,4 @@
     await testConnect(
         InternetAddress.anyIPv6, true, Socket.connect, (s) => s.destroy());
   });
-
-  asyncEnd();
 }
diff --git a/tests/standalone_2/io/socket_upgrade_to_secure_test.dart b/tests/standalone_2/io/socket_upgrade_to_secure_test.dart
index 1b29455..13957ca 100644
--- a/tests/standalone_2/io/socket_upgrade_to_secure_test.dart
+++ b/tests/standalone_2/io/socket_upgrade_to_secure_test.dart
@@ -103,7 +103,7 @@
   }
 
   Future<RawSocket> runClient(Socket socket) {
-    var completer = new Completer();
+    Completer<RawSocket> completer = new Completer<RawSocket>();
     var dataReceived = <int>[];
     socket.listen((data) {
       dataReceived.addAll(data);
@@ -156,14 +156,14 @@
   Future<SecureSocket> connectClient(int port) {
     if (!handshakeBeforeSecure) {
       return Socket.connect(HOST, port).then((socket) {
-        var future;
+        Future<SecureSocket> future;
         if (hostnameInConnect) {
           future = SecureSocket.secure(socket, context: clientContext);
         } else {
           future =
               SecureSocket.secure(socket, host: HOST, context: clientContext);
         }
-        return future.then((secureSocket) {
+        return future.then<SecureSocket>((SecureSocket secureSocket) {
           socket.add([0]);
           return secureSocket;
         });
diff --git a/tests/standalone_2/io/test_utils.dart b/tests/standalone_2/io/test_utils.dart
index d92a372..fb3b3ef 100644
--- a/tests/standalone_2/io/test_utils.dart
+++ b/tests/standalone_2/io/test_utils.dart
@@ -5,13 +5,7 @@
 import 'dart:async';
 import 'dart:io';
 
-Future<int> freeIPv4AndIPv6Port() async {
-  var socket =
-      await ServerSocket.bind(InternetAddress.anyIPv6, 0, v6Only: false);
-  int port = socket.port;
-  await socket.close();
-  return port;
-}
+import "package:expect/expect.dart";
 
 int lastRetryId = 0;
 
@@ -31,3 +25,15 @@
   }
   return await fun();
 }
+
+Future throws(Function f, bool check(Object exception)) async {
+  try {
+    await f();
+  } catch (e) {
+    if (!check(e)) {
+      Expect.fail('Unexpected: $e');
+    }
+    return;
+  }
+  Expect.fail('Did not throw');
+}
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index e78ae4d..7222d67 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -97,8 +97,6 @@
 [ $system == linux && ($runtime == flutter || $runtime == vm) ]
 io/http_basic_test: Pass, Slow, Timeout # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
 io/http_launch_test: Pass, Slow, Timeout # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
-io/http_proxy_test: Skip # These tests have started timing out and issue 25649 has been filed to investigate, skipping these tests temporarily to get the bots to be green again.
-io/secure_builtin_roots_test: Skip # These tests have started timing out and issue 25649 has been filed to investigate, skipping these tests temporarily to get the bots to be green again.
 
 [ $system == macos && ($runtime == dart_precompiled || $runtime == vm) ]
 io/raw_secure_server_socket_test: Pass, Crash # Issue 29524
@@ -123,7 +121,6 @@
 io/http_server_response_test: RuntimeError
 io/regress_10026_test: RuntimeError
 io/secure_socket_argument_test: CompileTimeError
-io/socket_upgrade_to_secure_test: RuntimeError
 io/web_socket_pipe_test: RuntimeError
 io/web_socket_protocol_processor_test: CompileTimeError
 io/zlib_test: RuntimeError
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index f880795..f073ec4 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -3,17 +3,14 @@
 # BSD-style license that can be found in the LICENSE file.
 # Sections in this file should contain "$compiler == dartk" or
 # "$compiler == dartkp".
-#
-# Note: Sections in this file are normalized so we can update them with
-# automated tools. Please add any new status lines affecting those two compilers
-# in the existing sections, if possible keep the alphabetic ordering. If we are
-# missing a section you need, please reach out to sigmund@ to see the best way
-# to add them.
+
+fragmentation_test: Pass, Slow # GC heavy
+io/process_sync_test: Pass, Slow # Spawns synchronously subprocesses in sequence.
 
 [ $builder_tag == asan ]
 io/file_test: Fail # Issue 34724
 io/http_server_response_test: Fail # Issue 34724
-io/process_sync_test: Fail # Issue 34724 (child process)
+io/process_sync_test: Pass, Fail # https://github.com/dart-lang/sdk/issues/34724
 io/signals_test: Fail # Issue 34724
 io/test_extension_fail_test: Fail # Issue 32187
 
@@ -22,7 +19,6 @@
 io/file_test: RuntimeError
 io/http_auth_digest_test: RuntimeError
 io/http_auth_test: RuntimeError
-io/http_compression_test: RuntimeError
 io/http_cookie_date_test: CompileTimeError
 io/http_headers_test: CompileTimeError
 io/http_parser_test: CompileTimeError
@@ -32,14 +28,14 @@
 io/platform_test: RuntimeError
 io/regress_10026_test: RuntimeError
 io/secure_socket_argument_test: CompileTimeError
-io/socket_upgrade_to_secure_test: RuntimeError
 io/test_extension_fail_test: RuntimeError
 io/test_extension_test: RuntimeError
 io/web_socket_pipe_test: RuntimeError
 io/web_socket_protocol_processor_test: CompileTimeError
 io/zlib_test: RuntimeError
-oom_error_stacktrace_test: RuntimeError
-out_of_memory_test: RuntimeError
+
+[ $compiler == dartkp ]
+io/test_runner_test: SkipByDesign # Is not relevant for AOT.
 
 [ $fasta ]
 deferred_transitive_import_error_test: CompileTimeError
@@ -61,16 +57,12 @@
 [ $arch == x64 && $builder_tag == asan && $compiler == dartk ]
 io/file_test: Fail # Memory leak (issue 34724)
 io/http_server_response_test: Fail # Memory leak (issue 34724)
-io/process_sync_test: Pass, RuntimeError # Issue 34734
 io/signals_test: Pass, RuntimeError # Issue 34734
 io/test_extension_fail_test: Fail # Memory leak (issue 34724)
 
 [ $builder_tag == optimization_counter_threshold && ($compiler == dartk || $compiler == dartkb) ]
 map_insert_remove_oom_test: Skip # Heap limit too low.
 
-[ $compiler == app_jitk && ($mode == debug || $mode == release) ]
-dart_developer_disabled_env_test: RuntimeError
-
 # The failures below still need to be investigated and possibly fixed, or marked as skipped.
 [ $compiler == dartkb && $strong ]
 io/code_collection_test: RuntimeError # Reruns the same script (dill file without AST) without passing --enable-interpreter or --use-bytecode-compiler.
@@ -85,7 +77,6 @@
 no_lazy_dispatchers_test: SkipByDesign # KBC interpreter doesn't support --no_lazy_dispatchers
 
 [ $compiler == dartkp && $mode == debug && $runtime == dart_precompiled && $strong ]
-io/compile_all_test: Crash # Issue 32373
 io/raw_socket_test: Crash
 io/skipping_dart2js_compilations_test: Crash
 io/socket_exception_test: Pass, Crash
@@ -102,12 +93,10 @@
 io/namespace_test: RuntimeError
 
 [ $compiler == dartkp && $runtime == dart_precompiled && $strong ]
-dwarf_stack_trace_test: RuntimeError
-io/compile_all_test: RuntimeError # Issue 32338
+io/compile_all_test: Skip # We do not support --compile-all for precompilation
 io/file_fuzz_test: RuntimeError, Pass
 io/http_client_connect_test: Skip # Flaky.
 io/http_close_test: Crash
-io/http_compression_test: RuntimeError
 io/http_content_length_test: Skip # Flaky.
 io/http_cookie_test: Skip # Flaky
 io/http_proxy_advanced_test: Skip # Flaky
@@ -159,7 +148,6 @@
 
 [ $runtime == vm && $strong && ($compiler == dartk || $compiler == dartkb) ]
 io/http_client_request_test: Pass, Timeout
-io/http_compression_test: RuntimeError
 io/platform_resolved_executable_test/03: Pass, RuntimeError
 io/platform_resolved_executable_test/04: Pass, RuntimeError
 io/secure_builtin_roots_test: Pass, Timeout
@@ -220,7 +208,7 @@
 io/http_advanced_test: Skip # Timeout
 io/http_auth_digest_test: Crash
 io/http_auth_test: Skip # Timeout
-io/http_basic_test: Pass, Crash # Sporadic crash, issue 33824
+io/http_basic_test: Pass, Timeout # Issue 28046
 io/http_proxy_advanced_test: Skip # Timeout
 io/http_read_test: Skip # Timeout
 io/non_utf8_directory_test: Pass, Timeout
diff --git a/tests/standalone_2/standalone_2_precompiled.status b/tests/standalone_2/standalone_2_precompiled.status
index 942a80a..64e4609 100644
--- a/tests/standalone_2/standalone_2_precompiled.status
+++ b/tests/standalone_2/standalone_2_precompiled.status
@@ -2,6 +2,9 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+[ $builder_tag == obfuscated ]
+dwarf_stack_trace_test: Pass, RuntimeError # Issue 35563
+
 [ $compiler == precompiler ]
 io/web_socket_test: Pass, RuntimeError # Issue 24674
 map_insert_remove_oom_test: Skip # Heap limit too low. Increasing iteration count to make a higher limit a meaningful test makes it too slow for simarm[64] bots.
diff --git a/tests/standalone_2/standalone_2_vm.status b/tests/standalone_2/standalone_2_vm.status
index cd92c8e..fcd29ba 100644
--- a/tests/standalone_2/standalone_2_vm.status
+++ b/tests/standalone_2/standalone_2_vm.status
@@ -73,16 +73,26 @@
 [ $arch == simdbc64 && $mode == debug && $checked ]
 io/web_socket_test: Pass, RuntimeError # Issue 26814.
 
+[ $arch == x64 && $compiler == dartkb && $runtime == vm && $system == linux ]
+io/stdout_stderr_non_blocking_test: Pass, Timeout # Issue 35192
+
 [ $compiler != dart2analyzer && $system == windows ]
 io/platform_resolved_executable_test/06: RuntimeError # Issue 23641
 
+[ $mode == release && $runtime == vm && $system == linux && ($arch == simdbc64 || $arch == x64) ]
+io/http_bind_test: Pass, Timeout # Issue 35192
+
 [ $mode == release && $runtime == vm && $system == macos ]
+io/http_server_close_response_after_error_test: Pass, Timeout # Issue 28370: timeout.
 io/named_pipe_script_test: Pass, RuntimeError # Issue 28737
 
 [ $mode == release && $runtime == vm && $system == windows ]
 io/http_server_close_response_after_error_test: Pass, Timeout # Issue 28370: timeout.
 io/regress_7191_test: Pass, Timeout # Issue 28374: timeout.
 
+[ $runtime == dart_precompiled && $system == linux && ($arch == simarm || $arch == simarm64) ]
+io/stdout_stderr_non_blocking_test: Pass, Timeout # Issue 35192
+
 [ $runtime == vm && !$checked && !$strong ]
 io/file_constructor_test: RuntimeError
 
diff --git a/third_party/.gitignore b/third_party/.gitignore
index 9faa3c6..836a11d 100644
--- a/third_party/.gitignore
+++ b/third_party/.gitignore
@@ -9,8 +9,9 @@
 !d8
 !7zip.tar.gz.sha1
 !firefox_jsshell
-!gsutil.tar.gz.sha1
 !clang.tar.gz.sha1
 !unittest.tar.gz.sha1
 !update.sh
 !/googletest
+# but ignore a subfolder of tcmalloc (some client ignores /tcmalloc/.gitignore)
+/tcmalloc/gperftools
diff --git a/third_party/gsutil.tar.gz.sha1 b/third_party/gsutil.tar.gz.sha1
deleted file mode 100644
index cfc510a..0000000
--- a/third_party/gsutil.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-99b82a42b98b78fc2a3f155995a16d8d7517b657
\ No newline at end of file
diff --git a/third_party/tcmalloc/configure_command b/third_party/tcmalloc/configure_command
index ea06910..7249c18 100644
--- a/third_party/tcmalloc/configure_command
+++ b/third_party/tcmalloc/configure_command
@@ -1 +1,2 @@
+./auto_gen.sh
 ./configure --enable-emergency-malloc --enable-frame-pointers --disable-cpu-profiler --disable-heap-checker --disable-debugalloc --enable-sized-delete --disable-libunwind
diff --git a/third_party/tcmalloc/include/config.h b/third_party/tcmalloc/include/config.h
index 16b2d7d..3cd4982 100644
--- a/third_party/tcmalloc/include/config.h
+++ b/third_party/tcmalloc/include/config.h
@@ -7,23 +7,26 @@
 
 
 /* Build new/delete operators for overaligned types */
-/* #undef ENABLE_ALIGNED_NEW_DELETE */
+#define ENABLE_ALIGNED_NEW_DELETE 1
 
 /* Build runtime detection for sized delete */
 /* #undef ENABLE_DYNAMIC_SIZED_DELETE */
 
+/* report large allocation */
+/* #undef ENABLE_LARGE_ALLOC_REPORT */
+
 /* Build sized deletion operators */
 #define ENABLE_SIZED_DELETE 1
 
-/* Define to 1 if compiler supports __builtin_expect */
-#define HAVE_BUILTIN_EXPECT 1
-
 /* Define to 1 if compiler supports __builtin_stack_pointer */
 /* #undef HAVE_BUILTIN_STACK_POINTER */
 
 /* Define to 1 if you have the <conflict-signal.h> header file. */
 /* #undef HAVE_CONFLICT_SIGNAL_H */
 
+/* define if the compiler supports basic C++11 syntax */
+#define HAVE_CXX11 1
+
 /* Define to 1 if you have the <cygwin/signal.h> header file. */
 /* #undef HAVE_CYGWIN_SIGNAL_H */
 
@@ -88,9 +91,7 @@
 #define HAVE_GETPAGESIZE 1
 
 /* Define to 1 if you have the <glob.h> header file. */
-#if !defined(__ANDROID__)
 #define HAVE_GLOB_H 1
-#endif
 
 /* Define to 1 if you have the <grp.h> header file. */
 #define HAVE_GRP_H 1
@@ -175,15 +176,13 @@
 #define HAVE_SYS_STAT_H 1
 
 /* Define to 1 if you have the <sys/syscall.h> header file. */
-#if !defined(__ANDROID__)
 #define HAVE_SYS_SYSCALL_H 1
-#endif
 
 /* Define to 1 if you have the <sys/types.h> header file. */
 #define HAVE_SYS_TYPES_H 1
 
 /* Define to 1 if you have the <sys/ucontext.h> header file. */
-#undef HAVE_SYS_UCONTEXT_H
+#define HAVE_SYS_UCONTEXT_H 1
 
 /* Define to 1 if you have the <sys/wait.h> header file. */
 #define HAVE_SYS_WAIT_H 1
@@ -213,13 +212,14 @@
 #define HAVE___ATTRIBUTE__ALIGNED_FN 1
 
 /* Define to 1 if compiler supports __environ */
-#if !defined(__ANDROID__)
 #define HAVE___ENVIRON 1
-#endif
 
 /* Define to 1 if the system has the type `__int64'. */
 /* #undef HAVE___INT64 */
 
+/* Define to 1 if you have the `__sbrk' function. */
+#define HAVE___SBRK 1
+
 /* prefix where we look for installed files */
 #define INSTALL_PREFIX "/usr/local"
 
diff --git a/tools/FAKE_COMMITS b/tools/FAKE_COMMITS
index fbe07a6..c11b0c2 100644
--- a/tools/FAKE_COMMITS
+++ b/tools/FAKE_COMMITS
@@ -24,3 +24,7 @@
 Trigger mirroring of github repository
 Force build after DEPS format revert
 Force build while trybots are broken, to check builders for brokenness.
+
+Analyzer branch commits:
+Force build on new analyzer-branch linux build with new workflow
+Trigger bots
diff --git a/tools/VERSION b/tools/VERSION
index acbf777..9a869d4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -26,6 +26,6 @@
 CHANNEL stable
 MAJOR 2
 MINOR 1
-PATCH 0
-PRERELEASE 1
+PATCH 1
+PRERELEASE 0
 PRERELEASE_PATCH 0
diff --git a/tools/addlatexhash.dart b/tools/addlatexhash.dart
index 118e4bc..21f8d52 100755
--- a/tools/addlatexhash.dart
+++ b/tools/addlatexhash.dart
@@ -11,9 +11,7 @@
 // hash listing file name as the third argument. From docs/language a
 // typical usage would be as follows:
 //
-//   dart
-//     --package-root=<build dir>/packages \
-//     ../../tools/addlatexhash.dart dartLangSpec.tex out.tex hash.txt
+// dart ../../tools/addlatexhash.dart dartLangSpec.tex out.tex hash.txt
 //
 // This will produce a normalized variant out.tex of the language
 // specification with hash values filled in, and a listing hash.txt of
@@ -207,7 +205,7 @@
 /// of its own, given the part of the RegExp that recognizes the
 /// command name, [cmdNameRE]
 lineCommandRE(cmdNameRE) =>
-    new RegExp(r"^\s*\\" + cmdNameRE + r"\s*\{.*\}\s*$");
+    new RegExp(r"^\s*\\" + cmdNameRE + r"\s*\{.*\}%?\s*$");
 
 final hashLabelStartRE = new RegExp(r"^\s*\\LMLabel\s*\{");
 final hashLabelEndRE = new RegExp(r"\}\s*$");
diff --git a/tools/android/VERSION_LINUX_NDK b/tools/android/VERSION_LINUX_NDK
index 9fff8ff..4fac77b 100644
--- a/tools/android/VERSION_LINUX_NDK
+++ b/tools/android/VERSION_LINUX_NDK
@@ -1 +1 @@
-50bb526ee77fee88b9382d2bf48e7399751b98ae
+e626c47cb82a7439b0eda03ac6e0e9e1e41c6093
diff --git a/tools/android/VERSION_MACOSX_NDK b/tools/android/VERSION_MACOSX_NDK
index aac8005..bd19b05 100644
--- a/tools/android/VERSION_MACOSX_NDK
+++ b/tools/android/VERSION_MACOSX_NDK
@@ -1 +1 @@
-ed883dfaad6f27350eb3de426ccbf9abdc2943e8
+e8b6ecb5d15c4c4018a62b52aabc13e41b17df8f
diff --git a/tools/approve_results.dart b/tools/approve_results.dart
new file mode 100755
index 0000000..eff1878
--- /dev/null
+++ b/tools/approve_results.dart
@@ -0,0 +1,659 @@
+#!/usr/bin/env dart
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// List tests whose results are different from the previously approved results,
+/// and ask whether to update the currently approved results, turning the bots
+/// green.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:math';
+
+import 'package:args/args.dart';
+import 'package:glob/glob.dart';
+
+import 'bots/results.dart';
+
+/// The bot names and named configurations are highly redundant if both are
+/// listed. This function returns a simplified named configuration that doesn't
+/// contain any aspects that's part of the bots name. This is used to get a more
+/// compact and readable output.
+String simplifyNamedConfiguration(String bot, String namedConfiguration) {
+  final botComponents = new Set<String>.from(bot.split("-"));
+  return namedConfiguration
+      .split("-")
+      .where((component) => !botComponents.contains(component))
+      .join("-");
+}
+
+/// Represents a test on a bot with the current result, the current approved
+/// result, and flakiness data.
+class Test implements Comparable {
+  final String bot;
+  final String name;
+  final Map<String, dynamic> resultData;
+  final Map<String, dynamic> approvedResultData;
+  final Map<String, dynamic> flakinessData;
+
+  Test(this.bot, this.name, this.resultData, this.approvedResultData,
+      this.flakinessData);
+
+  int compareTo(Object other) {
+    if (other is Test) {
+      if (bot.compareTo(other.bot) < 0) return -1;
+      if (other.bot.compareTo(bot) < 0) return 1;
+      if (configuration.compareTo(other.configuration) < 0) return -1;
+      if (other.configuration.compareTo(configuration) < 0) return 1;
+      if (name.compareTo(other.name) < 0) return -1;
+      if (other.name.compareTo(name) < 0) return 1;
+    }
+    return 0;
+  }
+
+  String get configuration => resultData["configuration"];
+  String get result => resultData["result"];
+  String get expected => resultData["expected"];
+  bool get matches => resultData["matches"];
+  String get approvedResult =>
+      approvedResultData != null ? approvedResultData["result"] : null;
+  bool get isApproved => result == approvedResult;
+  List<String> get flakyModes =>
+      flakinessData != null ? flakinessData["outcomes"].cast<String>() : null;
+  bool get isFlake => flakinessData != null && flakyModes.contains(result);
+}
+
+/// Loads the results file as as a map if the file exists, otherwise returns the
+/// empty map.
+Future<Map<String, Map<String, dynamic>>> loadResultsMapIfExists(
+        String path) async =>
+    await new File(path).exists()
+        ? loadResultsMap(path)
+        : <String, Map<String, dynamic>>{};
+
+/// Loads a log from logdog.
+Future<String> loadLog(String id, String step) async {
+  final logUrl = Uri.parse("https://logs.chromium.org/"
+      "logs/dart/buildbucket/cr-buildbucket.appspot.com/"
+      "$id/+/steps/$step?format=raw");
+  final client = new HttpClient();
+  final request =
+      await client.getUrl(logUrl).timeout(const Duration(seconds: 60));
+  final response = await request.close().timeout(const Duration(seconds: 60));
+  if (response.statusCode != HttpStatus.ok) {
+    throw new Exception("The log at $logUrl doesn't exist");
+  }
+  final contents = (await response
+          .transform(new Utf8Decoder())
+          .timeout(const Duration(seconds: 60))
+          .toList())
+      .join("");
+  client.close();
+  return contents;
+}
+
+/// Loads the results from the bot.
+Future<List<Test>> loadResultsFromBot(String bot, ArgResults options,
+    Map<String, dynamic> changelistBuild) async {
+  if (options["verbose"]) {
+    print("Loading $bot...");
+  }
+  // gsutil cp -r requires a destination directory, use a temporary one.
+  final tmpdir = await Directory.systemTemp.createTemp("approve_results.");
+  try {
+    // The 'latest' file contains the name of the latest build that we
+    // should download. When preapproving a changelist, we instead find out
+    // which build the commit queue was rebased on.
+    final build = (changelistBuild != null
+            ? await loadLog(changelistBuild["id"],
+                "gsutil_find_latest_build/0/logs/raw_io.output_text_latest_/0")
+            : await readFile(bot, "latest"))
+        .trim();
+
+    // Asynchronously download the latest build and the current approved
+    // results. Download try results from trybot try runs if preapproving.
+    final tryResults = <String, Map<String, dynamic>>{};
+    await Future.wait([
+      cpRecursiveGsutil(buildCloudPath(bot, build), tmpdir.path),
+      cpRecursiveGsutil(
+          "$approvedResultsStoragePath/$bot/approved_results.json",
+          "${tmpdir.path}/approved_results.json"),
+      new Future(() async {
+        if (changelistBuild != null) {
+          tryResults.addAll(parseResultsMap(await loadLog(
+              changelistBuild["id"], "test_results/0/logs/results.json/0")));
+        }
+      }),
+    ]);
+
+    // Check the build was properly downloaded.
+    final buildPath = "${tmpdir.path}/$build";
+    final buildDirectory = new Directory(buildPath);
+    if (!await buildDirectory.exists()) {
+      print("$bot: Build directory didn't exist");
+      return <Test>[];
+    }
+
+    // Load the run.json to find the named configuration.
+    final resultsFile = new File("$buildPath/results.json");
+    if (!await resultsFile.exists()) {
+      print("$bot: No results.json exists");
+      return <Test>[];
+    }
+
+    // Load the current results, the approved resutls, and the flakiness
+    // information.
+    final results = await loadResultsMapIfExists("$buildPath/results.json");
+    final flaky = await loadResultsMapIfExists("$buildPath/flaky.json");
+    final approvedResults =
+        await loadResultsMapIfExists("${tmpdir.path}/approved_results.json");
+
+    // Construct an object for every test containing its current result,
+    // what the last approved result was, and whether it's flaky.
+    final tests = <Test>[];
+    for (final key in results.keys) {
+      final result = results[key];
+      final approvedResult = approvedResults[key];
+      final flakiness = flaky[key];
+      // If preapproving results, allow new non-matching results that are
+      // different from the baseline. The approved results will be the current
+      // approved results, plus the difference between the tryrun's baseline and
+      // the tryrun's results.
+      if (tryResults.containsKey(key)) {
+        final tryResult = tryResults[key];
+        final wasFlake = flakiness != null &&
+            (flakiness["outcomes"] as List<dynamic>)
+                .contains(tryResult["result"]);
+        // Pick the try run result if the try result was not a flake and it's a
+        // non-matching result that's different than the approved result. If
+        // there is no approved result yet, use the latest result from the
+        // builder instead.
+        final baseResult = approvedResult ?? result;
+        if (!wasFlake &&
+            !tryResult["matches"] &&
+            tryResult["result"] != result["result"]) {
+          // The approved_results.json format currently does not natively
+          // support preapproval, so preapproving turning one failure into
+          // another will turn the builder in question red until the CL lands.
+          if (!baseResult["matches"] &&
+              tryResult["result"] != baseResult["result"]) {
+            print("Warning: Preapproving changed failure modes will turn the "
+                "CI red until the CL is submitted: $bot: $key: "
+                "${baseResult["result"]} -> ${tryResult["result"]}");
+          }
+          result.clear();
+          result.addAll(tryResult);
+        } else {
+          if (approvedResult != null) {
+            result.clear();
+            result.addAll(approvedResult);
+          }
+        }
+      } else if (tryResults.isNotEmpty && approvedResult != null) {
+        result.clear();
+        result.addAll(approvedResult);
+      }
+      final name = result["name"];
+      final test = new Test(bot, name, result, approvedResult, flakiness);
+      tests.add(test);
+    }
+    // If preapproving and the CL has introduced new tests, add the new tests
+    // as well to the approved data.
+    final newTestKeys = new Set<String>.from(tryResults.keys)
+        .difference(new Set<String>.from(results.keys));
+    for (final key in newTestKeys) {
+      final result = tryResults[key];
+      final flakiness = flaky[key];
+      final name = result["name"];
+      final test = new Test(bot, name, result, null, flakiness);
+      tests.add(test);
+    }
+    if (options["verbose"]) {
+      print("Loaded $bot (${tests.length} tests).");
+    }
+    return tests;
+  } finally {
+    // Always clean up the temporary directory when we don't need it.
+    await tmpdir.delete(recursive: true);
+  }
+}
+
+main(List<String> args) async {
+  final parser = new ArgParser();
+  parser.addMultiOption("bot",
+      abbr: "b",
+      help: "Select the bots matching the glob pattern [option is repeatable]",
+      splitCommas: false);
+  parser.addFlag("help", help: "Show the program usage.", negatable: false);
+  parser.addFlag("list",
+      abbr: "l", help: "List the available bots.", negatable: false);
+  parser.addFlag("no",
+      abbr: "n",
+      help: "Show changed results but don't approve.",
+      negatable: false);
+  parser.addOption("preapprove",
+      abbr: "p", help: "Preapprove the new failures in a gerrit CL.");
+  parser.addFlag("verbose",
+      abbr: "v", help: "Describe asynchronous operations.", negatable: false);
+  parser.addFlag("yes",
+      abbr: "y", help: "Approve the results.", negatable: false);
+
+  final options = parser.parse(args);
+  if ((options["preapprove"] == null &&
+          options["bot"].isEmpty &&
+          !options["list"]) ||
+      options["help"]) {
+    print("""
+Usage: approve_results.dart [OPTION]...
+List tests whose results are different from the previously approved results, and
+ask whether to update the currently approved results, turning the bots green.
+
+The options are as follows:
+
+${parser.usage}""");
+    return;
+  }
+
+  if (options["no"] && options["yes"]) {
+    stderr.writeln("The --no and --yes options are mutually incompatible");
+    exitCode = 1;
+    return;
+  }
+
+  // Load the list of bots according to the test matrix.
+  final testMatrixPath =
+      Platform.script.resolve("bots/test_matrix.json").toFilePath();
+  final testMatrix = jsonDecode(await new File(testMatrixPath).readAsString());
+  final builderConfigurations = testMatrix["builder_configurations"];
+  final testMatrixBots = <String>[];
+  for (final builderConfiguration in builderConfigurations) {
+    final steps = builderConfiguration["steps"];
+    // Only consider bots that use tools/test.py.
+    if (!steps.any((step) =>
+        step["script"] == null || step["script"] == "tools/test.py")) {
+      continue;
+    }
+    final builders = builderConfiguration["builders"].cast<String>();
+    testMatrixBots.addAll(builders);
+  }
+
+  // Load the list of bots that have data in cloud storage.
+  if (options["verbose"]) {
+    print("Loading list of bots...");
+  }
+  final botsWithData = (await listBots())
+      .where((bot) => !bot.endsWith("-try"))
+      .where((bot) => !bot.endsWith("-dev"))
+      .where((bot) => !bot.endsWith("-stable"));
+  if (options["verbose"]) {
+    print("Loaded list of bots.");
+  }
+
+  // The currently active bots are the bots both mentioned in the test matrix
+  // and that have results in cloud storage.
+  final allBots = new Set<String>.from(testMatrixBots)
+      .intersection(new Set<String>.from(botsWithData))
+      .toList()
+        ..sort();
+
+  // List the currently active bots if requested.
+  if (options["list"]) {
+    for (final bot in allBots) {
+      print(bot);
+    }
+    return;
+  }
+
+  // Determine which builders have run for the changelist.
+  final changelistBuilds = <String, Map<String, dynamic>>{};
+  if (options["preapprove"] != null) {
+    if (options["verbose"]) {
+      print("Loading list of try runs...");
+    }
+    final gerritHost = "dart-review.googlesource.com";
+    final gerritProject = "sdk";
+    final prefix = "https://$gerritHost/c/$gerritProject/+/";
+    final gerrit = options["preapprove"];
+    if (!gerrit.startsWith(prefix)) {
+      stderr.writeln("error: $gerrit doesn't start with $prefix");
+      exitCode = 1;
+      return;
+    }
+    final components = gerrit.substring(prefix.length).split("/");
+    if (components.length != 2 ||
+        int.tryParse(components[0]) == null ||
+        int.tryParse(components[1]) == null) {
+      stderr.writeln("error: $gerrit must be in the form of "
+          "$prefix<changelist>/<patchset>");
+      exitCode = 1;
+      return;
+    }
+    final changelist = int.parse(components[0]);
+    final patchset = int.parse(components[1]);
+    final buildset = "buildset:patch/gerrit/$gerritHost/$changelist/$patchset";
+    final url = Uri.parse(
+        "https://cr-buildbucket.appspot.com/_ah/api/buildbucket/v1/search"
+        "?bucket=luci.dart.try"
+        "&tag=${Uri.encodeComponent(buildset)}"
+        "&fields=builds(id%2Ctags%2Cstatus%2Cstarted_ts)");
+    final client = new HttpClient();
+    final request =
+        await client.getUrl(url).timeout(const Duration(seconds: 30));
+    final response = await request.close().timeout(const Duration(seconds: 30));
+    if (response.statusCode != HttpStatus.ok) {
+      throw new Exception("Failed to request try runs for $gerrit");
+    }
+    final Map<String, dynamic> object = await response
+        .transform(new Utf8Decoder())
+        .transform(new JsonDecoder())
+        .first
+        .timeout(const Duration(seconds: 30));
+    client.close();
+    final builds = object["builds"];
+    if (builds == null) {
+      stderr.writeln(
+          "error: $prefix$changelist has no try runs for patchset $patchset");
+      exitCode = 1;
+      return;
+    }
+
+    // Prefer the newest completed build.
+    Map<String, dynamic> preferredBuild(
+        Map<String, dynamic> a, Map<String, dynamic> b) {
+      if (a != null && b == null) return a;
+      if (a == null && b != null) return b;
+      if (a != null && b != null) {
+        if (a["status"] == "COMPLETED" && b["status"] != "COMPLETED") return a;
+        if (a["status"] != "COMPLETED" && b["status"] == "COMPLETED") return b;
+        if (a["started_ts"] == null && b["started_ts"] != null) return a;
+        if (a["started_ts"] != null && b["started_ts"] == null) return b;
+        if (a["started_ts"] != null && b["started_ts"] != null) {
+          if (int.parse(a["started_ts"]) > int.parse(b["started_ts"])) return a;
+          if (int.parse(a["started_ts"]) < int.parse(b["started_ts"])) return b;
+        }
+      }
+      return b;
+    }
+
+    for (final build in builds) {
+      final tags = (build["tags"] as List<dynamic>).cast<String>();
+      final builder = tags
+          .firstWhere((tag) => tag.startsWith("builder:"))
+          .substring("builder:".length);
+      final ciBuilder = builder.replaceFirst(new RegExp("-try\$"), "");
+      if (!allBots.contains(ciBuilder)) {
+        continue;
+      }
+      changelistBuilds[ciBuilder] =
+          preferredBuild(changelistBuilds[ciBuilder], build);
+    }
+    if (options["verbose"]) {
+      print("Loaded list of try runs.");
+    }
+  }
+  final changelistBuilders = new Set<String>.from(changelistBuilds.keys);
+
+  // Select all the bots matching the glob patterns,
+  final finalBotList =
+      options["preapprove"] != null ? changelistBuilders : allBots;
+  final botPatterns = options["preapprove"] != null && options["bot"].isEmpty
+      ? ["*"]
+      : options["bot"];
+  final bots = new Set<String>();
+  for (final botPattern in botPatterns) {
+    final glob = new Glob(botPattern);
+    bool any = false;
+    for (final bot in finalBotList) {
+      if (glob.matches(bot)) {
+        bots.add(bot);
+        any = true;
+      }
+    }
+    if (!any) {
+      stderr.writeln("error: No bots matched pattern: $botPattern");
+      stderr.writeln("Try --list to get the list of bots, or --help for help");
+      exitCode = 1;
+      return;
+    }
+  }
+  for (final bot in bots) {
+    print("Selected bot: $bot");
+  }
+
+  // Error out if any of the requested try runs are incomplete.
+  bool anyIncomplete = false;
+  for (final bot in bots) {
+    if (options["preapprove"] != null &&
+        changelistBuilds[bot]["status"] != "COMPLETED") {
+      stderr.writeln("error: The try run for $bot isn't complete yet" +
+          changelistBuilds[bot]["status"]);
+      anyIncomplete = true;
+    }
+  }
+  if (anyIncomplete) {
+    exitCode = 1;
+    return;
+  }
+
+  // Load all the latest results for the selected bots, as well as flakiness
+  // data, and the set of currently approved results. Each bot's latest build
+  // is downloaded in parallel to make this phase faster.
+  final testListFutures = <Future>[];
+  for (final String bot in bots) {
+    testListFutures
+        .add(loadResultsFromBot(bot, options, changelistBuilds[bot]));
+  }
+
+  // Collect all the tests from the synchronous downloads.
+  final tests = <Test>[];
+  for (final testList in await Future.wait(testListFutures)) {
+    tests.addAll(testList);
+  }
+  tests.sort();
+  print("");
+
+  // Compute statistics and the set of interesting tests.
+  final flakyTestsCount = tests.where((test) => test.isFlake).length;
+  final failingTestsCount =
+      tests.where((test) => !test.isFlake && !test.matches).length;
+  final unapprovedTests =
+      tests.where((test) => !test.isFlake && !test.isApproved).toList();
+  final fixedTests = unapprovedTests.where((test) => test.matches).toList();
+  final brokenTests = unapprovedTests.where((test) => !test.matches).toList();
+
+  // Find out which bots have multiple configurations.
+  final outcomes = new Set<String>();
+  final configurationsForBots = <String, Set<String>>{};
+  for (final test in tests) {
+    outcomes.add(test.result);
+    var configurationSet = configurationsForBots[test.bot];
+    if (configurationSet == null) {
+      configurationsForBots[test.bot] = configurationSet = new Set<String>();
+    }
+    configurationSet.add(test.configuration);
+  }
+
+  // Compute a nice displayed name for the bot and configuration. If the bot
+  // only has a single configuration, then only mention the bot. Otherwise,
+  // remove the redundant parts from configuration and present it compactly.
+  // This is needed to avoid the tables becoming way too large.
+  String getBotDisplayName(String bot, String configuration) {
+    if (configurationsForBots[bot].length == 1) {
+      return bot;
+    } else {
+      final simpleConfig = simplifyNamedConfiguration(bot, configuration);
+      return "$bot/$simpleConfig";
+    }
+  }
+
+  // Compute the width of the fields in the below tables.
+  final unapprovedBots = new Set<String>();
+  int longestBot = "BOT/CONFIG".length;
+  int longestTest = "TEST".length;
+  int longestResult = "RESULT".length;
+  for (final test in unapprovedTests) {
+    unapprovedBots.add(test.bot);
+    final botDisplayName = getBotDisplayName(test.bot, test.configuration);
+    longestBot = max(longestBot, botDisplayName.length);
+    if (!test.matches) {
+      longestTest = max(longestTest, test.name.length);
+      longestResult = max(longestResult, test.result.length);
+    }
+  }
+  longestTest = min(longestTest, 120); // Some tests names are extremely long.
+
+  // Table of lists that now succeed.
+  if (fixedTests.isNotEmpty) {
+    print("The following tests are now succeeding:\n");
+    print("${'BOT/CONFIG'.padRight(longestBot)}  "
+        "TEST");
+    for (final test in fixedTests) {
+      final botDisplayName = getBotDisplayName(test.bot, test.configuration);
+      print("${botDisplayName.padRight(longestBot)}  "
+          "${test.name}");
+    }
+    print("");
+  }
+
+  /// Table of lists that now fail.
+  if (brokenTests.isNotEmpty) {
+    print("The following tests are now failing:\n");
+    print("${'BOT'.padRight(longestBot)}  "
+        "${'TEST'.padRight(longestTest)}  "
+        "${'RESULT'.padRight(longestResult)}  "
+        "EXPECTED");
+    for (final test in brokenTests) {
+      final botDisplayName = getBotDisplayName(test.bot, test.configuration);
+      print("${botDisplayName.padRight(longestBot)}  "
+          "${test.name.padRight(longestTest)}  "
+          "${test.result.padRight(longestResult)}  "
+          "${test.expected}");
+    }
+    print("");
+  }
+
+  // Provide statistics on how well the bots are doing.
+  void statistic(int numerator, int denominator, String what) {
+    double percent = numerator / denominator * 100.0;
+    String percentString = percent.toStringAsFixed(2) + "%";
+    print("$numerator of $denominator $what ($percentString)");
+  }
+
+  statistic(failingTestsCount, tests.length, "tests are failing");
+  statistic(flakyTestsCount, tests.length, "tests are flaky");
+  statistic(
+      fixedTests.length, tests.length, "tests were fixed since last approval");
+  statistic(brokenTests.length, tests.length,
+      "tests were broken since last approval");
+
+  // Stop if there's nothing to do.
+  if (unapprovedBots.isEmpty) {
+    print("\nEvery test result has already been approved.");
+    return;
+  }
+
+  // Stop if this is a dry run.
+  if (options["no"]) {
+    if (unapprovedTests.length == 1) {
+      print("1 test has a changed result and needs approval");
+    } else {
+      print("${unapprovedTests.length} "
+          "tests have changed results and need approval");
+    }
+    return;
+  }
+
+  // Confirm the approval if run interactively.
+  if (!options["yes"]) {
+    print("");
+    print("Note: It is assumed bugs have been filed about the above failures "
+        "before they are approved here.");
+    if (brokenTests.isNotEmpty) {
+      final botPlural = bots.length == 1 ? "bot" : "bots";
+      print("Note: Approving the failures will turn the "
+          "$botPlural green on the next commit.");
+    }
+    if (options["preapprove"] != null) {
+      print("Warning: Preapproval is currently not sticky and somebody else "
+          "approving before your CL has landed will undo your preapproval.");
+    }
+    while (true) {
+      stdout.write("Do you want to approve? (yes/no) [yes] ");
+      final line = stdin.readLineSync();
+      // End of file condition is considered no.
+      if (line == null) {
+        print("n");
+        return;
+      }
+      if (line.toLowerCase() == "n" || line.toLowerCase() == "no") {
+        return;
+      }
+      if (line == "" ||
+          line.toLowerCase() == "y" ||
+          line.toLowerCase() == "yes") {
+        break;
+      }
+    }
+  } else {
+    print("Note: It is assumed bugs have been filed about the above failures.");
+  }
+  print("");
+
+  // Log who approved these results.
+  final username = Platform.environment["LOGNAME"] ??
+      Platform.environment["USER"] ??
+      Platform.environment["USERNAME"];
+  if (username == null || username == "") {
+    stderr.writeln("error: Your identity could not be established. "
+        "Please set one of the LOGNAME, USER, USERNAME environment variables.");
+    exitCode = 1;
+    return;
+  }
+  final now = new DateTime.now().toUtc().toIso8601String();
+
+  // Update approved_results.json for each bot with unapproved changes.
+  final outDirectory =
+      await Directory.systemTemp.createTemp("approved_results.");
+  try {
+    final testsForBots = <String, List<Test>>{};
+    for (final test in tests) {
+      if (!testsForBots.containsKey(test.bot)) {
+        testsForBots[test.bot] = <Test>[test];
+      } else {
+        testsForBots[test.bot].add(test);
+      }
+    }
+    print("Uploading approved results...");
+    final futures = <Future>[];
+    for (final String bot in unapprovedBots) {
+      Map<String, dynamic> approveData(Test test) {
+        final data = new Map<String, dynamic>.from(test.resultData);
+        if (!test.isApproved) {
+          data["approver"] = username;
+          data["approved_at"] = now;
+        }
+        return data;
+      }
+
+      final dataList = testsForBots[bot].map(approveData).toList();
+      final localPath = "${outDirectory.path}/$bot.json";
+      await new File(localPath).writeAsString(
+          dataList.map((data) => jsonEncode(data) + "\n").join(""));
+      final remotePath =
+          "$approvedResultsStoragePath/$bot/approved_results.json";
+      futures.add(cpGsutil(localPath, remotePath)
+          .then((_) => print("Uploaded approved results for $bot")));
+    }
+    await Future.wait(futures);
+    if (brokenTests.isNotEmpty) {
+      print(
+          "Successfully approved results, the next commit will turn bots green");
+    } else {
+      print("Successfully approved results");
+    }
+  } finally {
+    await outDirectory.delete(recursive: true);
+  }
+}
diff --git a/tools/apps/update_homebrew/bin/generate.dart b/tools/apps/update_homebrew/bin/generate.dart
index e91933f..ea29e06 100644
--- a/tools/apps/update_homebrew/bin/generate.dart
+++ b/tools/apps/update_homebrew/bin/generate.dart
@@ -9,14 +9,14 @@
 import 'package:stack_trace/stack_trace.dart';
 import 'package:update_homebrew/update_homebrew.dart';
 
-main(List<String> args) async {
-  final parser = new ArgParser()
+void main(List<String> args) async {
+  final parser = ArgParser()
     ..addOption('revision', abbr: 'r')
-    ..addOption('channel', abbr: 'c', allowed: ['dev', 'stable']);
+    ..addOption('channel', abbr: 'c', allowed: supportedChannels);
 
   final options = parser.parse(args);
-  final revision = options['revision'];
-  final channel = options['channel'];
+  final revision = options['revision'] as String;
+  final channel = options['channel'] as String;
   if ([revision, channel].contains(null)) {
     print(
         "Usage: generate.dart -r revision -c channel <path_to_existing_dart.rb>");
@@ -31,7 +31,7 @@
   }
   final existingDartRb = options.rest.single;
 
-  var file = new File(existingDartRb);
+  var file = File(existingDartRb);
 
   if (!file.existsSync()) {
     print("Expected '$existingDartRb' to exist.");
diff --git a/tools/apps/update_homebrew/bin/update_homebrew.dart b/tools/apps/update_homebrew/bin/update_homebrew.dart
index e61bbdd..691f0a5 100644
--- a/tools/apps/update_homebrew/bin/update_homebrew.dart
+++ b/tools/apps/update_homebrew/bin/update_homebrew.dart
@@ -8,24 +8,24 @@
 import 'package:stack_trace/stack_trace.dart';
 import 'package:update_homebrew/update_homebrew.dart';
 
-main(List<String> args) async {
-  final parser = new ArgParser()
+void main(List<String> args) async {
+  final parser = ArgParser()
     ..addOption('revision', abbr: 'r')
-    ..addOption('channel', abbr: 'c', allowed: ['dev', 'stable'])
+    ..addOption('channel', abbr: 'c', allowed: supportedChannels)
     ..addOption('key', abbr: 'k');
   final options = parser.parse(args);
-  final revision = options['revision'];
-  final channel = options['channel'];
+  final revision = options['revision'] as String;
+  final channel = options['channel'] as String;
   if ([revision, channel].contains(null)) {
     print("Usage: update_homebrew.dart -r revision -c channel [-k ssh_key]\n"
-        "  ssh_key should allow pushes to ${GITHUB_REPO} on github");
+        "  ssh_key should allow pushes to $githubRepo on github");
     exitCode = 1;
     return;
   }
 
   Map<String, String> gitEnvironment;
 
-  final key = options['key'];
+  final key = options['key'] as String;
   if (key != null) {
     final sshWrapper = Platform.script.resolve('ssh_with_key').toFilePath();
     gitEnvironment = {'GIT_SSH': sshWrapper, 'SSH_KEY_PATH': key};
@@ -37,8 +37,8 @@
     try {
       var repository = tempDir.path;
 
-      await runGit(['clone', 'git@github.com:${GITHUB_REPO}.git', '.'],
-          repository, gitEnvironment);
+      await runGit(['clone', 'git@github.com:$githubRepo.git', '.'], repository,
+          gitEnvironment);
       await writeHomebrewInfo(channel, revision, repository);
       await runGit([
         'commit',
diff --git a/tools/apps/update_homebrew/lib/src/impl.dart b/tools/apps/update_homebrew/lib/src/impl.dart
new file mode 100644
index 0000000..2c17713
--- /dev/null
+++ b/tools/apps/update_homebrew/lib/src/impl.dart
@@ -0,0 +1,133 @@
+part of '../update_homebrew.dart';
+
+const _files = {
+  'dev': [_x64File, _ia32File],
+  'stable': [_x64File, _ia32File]
+};
+
+const _urlBase = 'https://storage.googleapis.com/dart-archive/channels';
+const _x64File = 'sdk/dartsdk-macos-x64-release.zip';
+const _ia32File = 'sdk/dartsdk-macos-ia32-release.zip';
+
+Future<String> _getHash256(
+    String channel, String revision, String download) async {
+  var client = http.Client();
+  try {
+    var api = storage.StorageApi(client);
+    var media = await api.objects.get('dart-archive',
+        'channels/$channel/release/$revision/$download.sha256sum',
+        downloadOptions: DownloadOptions.FullMedia) as Media;
+
+    var hashLine = await ascii.decodeStream(media.stream);
+    return RegExp('[0-9a-fA-F]*').stringMatch(hashLine);
+  } finally {
+    client.close();
+  }
+}
+
+Future<String> _getVersion(String channel, String revision) async {
+  var client = http.Client();
+  try {
+    var api = storage.StorageApi(client);
+
+    var media = await api.objects.get(
+        'dart-archive', 'channels/$channel/release/$revision/VERSION',
+        downloadOptions: DownloadOptions.FullMedia) as Media;
+
+    var versionObject =
+        await json.fuse(ascii).decoder.bind(media.stream).first as Map;
+    return versionObject['version'] as String;
+  } finally {
+    client.close();
+  }
+}
+
+Future<Map<String, String>> _getCurrentRevisions(String repository) async {
+  var revisions = <String, String>{};
+  var lines = await (File(p.join(repository, dartRbFileName))).readAsLines();
+
+  for (var channel in supportedChannels) {
+    /// This RegExp between release/ and /sdk matches
+    /// * 1 digit followed by
+    /// * Any number of letters, numbers, dashes and dots
+    /// This covers both numeric- and version-formatted revisions
+    ///
+    /// Note: all of the regexp escape slashes `\` are double-escaped within the
+    /// Dart string
+    final regExp = RegExp('channels/$channel/release/(\\d[\\w\\d\\-\\.]*)/sdk');
+
+    revisions[channel] =
+        regExp.firstMatch(lines.firstWhere(regExp.hasMatch)).group(1);
+  }
+  return revisions;
+}
+
+Future<Map<String, Map>> _getHashes(Map<String, String> revisions) async {
+  var hashes = <String, Map>{};
+  for (var channel in supportedChannels) {
+    hashes[channel] = {};
+    for (var file in _files[channel]) {
+      var hash = await _getHash256(channel, revisions[channel], file);
+      hashes[channel][file] = hash;
+    }
+  }
+  return hashes;
+}
+
+String _createDartFormula(
+        Map revisions, Map hashes, String devVersion, String stableVersion) =>
+    '''
+class Dart < Formula
+  desc "The Dart SDK"
+  homepage "https://www.dartlang.org/"
+
+  version "$stableVersion"
+  if Hardware::CPU.is_64_bit?
+    url "$_urlBase/stable/release/${revisions['stable']}/$_x64File"
+    sha256 "${hashes['stable'][_x64File]}"
+  else
+    url "$_urlBase/stable/release/${revisions['stable']}/$_ia32File"
+    sha256 "${hashes['stable'][_ia32File]}"
+  end
+
+  devel do
+    version "$devVersion"
+    if Hardware::CPU.is_64_bit?
+      url "$_urlBase/dev/release/${revisions['dev']}/$_x64File"
+      sha256 "${hashes['dev'][_x64File]}"
+    else
+      url "$_urlBase/dev/release/${revisions['dev']}/$_ia32File"
+      sha256 "${hashes['dev'][_ia32File]}"
+    end
+  end
+
+  def install
+    libexec.install Dir["*"]
+    bin.install_symlink "#{libexec}/bin/dart"
+    bin.write_exec_script Dir["#{libexec}/bin/{pub,dart?*}"]
+  end
+
+  def shim_script(target)
+    <<~EOS
+      #!/usr/bin/env bash
+      exec "#{prefix}/#{target}" "\$@"
+    EOS
+  end
+
+  def caveats; <<~EOS
+    Please note the path to the Dart SDK:
+      #{opt_libexec}
+    EOS
+  end
+
+  test do
+    (testpath/"sample.dart").write <<~EOS
+      void main() {
+        print(r"test message");
+      }
+    EOS
+
+    assert_equal "test message\\n", shell_output("#{bin}/dart sample.dart")
+  end
+end
+''';
diff --git a/tools/apps/update_homebrew/lib/update_homebrew.dart b/tools/apps/update_homebrew/lib/update_homebrew.dart
index 890a127..c2018d7 100644
--- a/tools/apps/update_homebrew/lib/update_homebrew.dart
+++ b/tools/apps/update_homebrew/lib/update_homebrew.dart
@@ -7,166 +7,34 @@
 import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as p;
 
-const GITHUB_REPO = 'dart-lang/homebrew-dart';
+part 'src/impl.dart';
 
-const CHANNELS = const ['dev', 'stable'];
-
-const FILES = const {
-  'dev': const [x64File, ia32File],
-  'stable': const [x64File, ia32File]
-};
-
-const urlBase = 'https://storage.googleapis.com/dart-archive/channels';
-const x64File = 'sdk/dartsdk-macos-x64-release.zip';
-const ia32File = 'sdk/dartsdk-macos-ia32-release.zip';
+const githubRepo = 'dart-lang/homebrew-dart';
 
 const dartRbFileName = 'dart.rb';
 
-Future<String> getHash256(
-    String channel, String revision, String download) async {
-  var client = new http.Client();
-  try {
-    var api = new storage.StorageApi(client);
-    var media = await api.objects.get('dart-archive',
-        'channels/$channel/release/$revision/$download.sha256sum',
-        downloadOptions: DownloadOptions.FullMedia);
+Iterable<String> get supportedChannels => _files.keys;
 
-    var hashLine = await ascii.decodeStream(media.stream);
-    return new RegExp('[0-9a-fA-F]*').stringMatch(hashLine);
-  } finally {
-    client.close();
-  }
-}
-
-Future<String> getVersion(String channel, String revision) async {
-  var client = new http.Client();
-  try {
-    var api = new storage.StorageApi(client);
-
-    var media = await api.objects.get(
-        'dart-archive', 'channels/$channel/release/$revision/VERSION',
-        downloadOptions: DownloadOptions.FullMedia);
-
-    var versionObject =
-        await json.fuse(ascii).decoder.bind(media.stream).first as Map;
-    return versionObject['version'];
-  } finally {
-    client.close();
-  }
-}
-
-Future<Map> getCurrentRevisions(String repository) async {
-  var revisions = <String, String>{};
-  var lines =
-      await (new File(p.join(repository, dartRbFileName))).readAsLines();
-
-  for (var channel in CHANNELS) {
-    /// This RegExp between release/ and /sdk matches
-    /// * 1 digit followed by
-    /// * Any number of letters, numbers, dashes and dots
-    /// This covers both numeric- and version-formatted revisions
-    ///
-    /// Note: all of the regexp escape slashes `\` are double-escaped within the
-    /// Dart string
-    final regExp =
-        new RegExp('channels/$channel/release/(\\d[\\w\\d\\-\\.]*)/sdk');
-
-    revisions[channel] =
-        regExp.firstMatch(lines.firstWhere(regExp.hasMatch)).group(1);
-  }
-  return revisions;
-}
-
-Future<Map> getHashes(Map revisions) async {
-  var hashes = <String, Map>{};
-  for (var channel in CHANNELS) {
-    hashes[channel] = {};
-    for (var file in FILES[channel]) {
-      var hash = await getHash256(channel, revisions[channel], file);
-      hashes[channel][file] = hash;
-    }
-  }
-  return hashes;
-}
-
-Future writeHomebrewInfo(
+Future<void> writeHomebrewInfo(
     String channel, String revision, String repository) async {
-  var revisions = await getCurrentRevisions(repository);
+  var revisions = await _getCurrentRevisions(repository);
 
   if (revisions[channel] == revision) {
     print("Channel $channel is already at revision $revision in homebrew.");
     exit(0);
   }
   revisions[channel] = revision;
-  var hashes = await getHashes(revisions);
-  var devVersion = await getVersion('dev', revisions['dev']);
+  var hashes = await _getHashes(revisions);
+  var devVersion = await _getVersion('dev', revisions['dev']);
 
-  var stableVersion = await getVersion('stable', revisions['stable']);
+  var stableVersion = await _getVersion('stable', revisions['stable']);
 
-  await new File(p.join(repository, dartRbFileName)).writeAsString(
-      createDartFormula(revisions, hashes, devVersion, stableVersion),
+  await File(p.join(repository, dartRbFileName)).writeAsString(
+      _createDartFormula(revisions, hashes, devVersion, stableVersion),
       flush: true);
 }
 
-String createDartFormula(
-        Map revisions, Map hashes, String devVersion, String stableVersion) =>
-    '''
-class Dart < Formula
-  desc "The Dart SDK"
-  homepage "https://www.dartlang.org/"
-
-  version "$stableVersion"
-  if MacOS.prefer_64_bit?
-    url "$urlBase/stable/release/${revisions['stable']}/$x64File"
-    sha256 "${hashes['stable'][x64File]}"
-  else
-    url "$urlBase/stable/release/${revisions['stable']}/$ia32File"
-    sha256 "${hashes['stable'][ia32File]}"
-  end
-
-  devel do
-    version "$devVersion"
-    if MacOS.prefer_64_bit?
-      url "$urlBase/dev/release/${revisions['dev']}/$x64File"
-      sha256 "${hashes['dev'][x64File]}"
-    else
-      url "$urlBase/dev/release/${revisions['dev']}/$ia32File"
-      sha256 "${hashes['dev'][ia32File]}"
-    end
-  end
-
-  def install
-    libexec.install Dir["*"]
-    bin.install_symlink "#{libexec}/bin/dart"
-    bin.write_exec_script Dir["#{libexec}/bin/{pub,dart?*}"]
-  end
-
-  def shim_script(target)
-    <<~EOS
-      #!/usr/bin/env bash
-      exec "#{prefix}/#{target}" "\$@"
-    EOS
-  end
-
-  def caveats; <<~EOS
-    Please note the path to the Dart SDK:
-      #{opt_libexec}
-    EOS
-  end
-
-  test do
-    (testpath/"sample.dart").write <<~EOS
-      void main() {
-        print(r"test message");
-      }
-    EOS
-
-    assert_equal "test message\\n", shell_output("#{bin}/dart sample.dart")
-  end
-end
-''';
-
-Future runGit(List<String> args, String repository,
+Future<void> runGit(List<String> args, String repository,
     Map<String, String> gitEnvironment) async {
   print("git ${args.join(' ')}");
 
diff --git a/tools/apps/update_homebrew/pubspec.yaml b/tools/apps/update_homebrew/pubspec.yaml
index 7e342b6..9089614 100644
--- a/tools/apps/update_homebrew/pubspec.yaml
+++ b/tools/apps/update_homebrew/pubspec.yaml
@@ -1,5 +1,9 @@
 name: update_homebrew
-version: 0.1.0
+
+publish_to: none
+environment:
+  sdk: '>=2.0.0 <3.0.0'
+
 dependencies:
   _discoveryapis_commons: ^0.1.3+1
   args: ^1.5.0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index ed40447..4a8b23a 100755
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -35,11 +35,10 @@
 }
 
 ARCH_RENAMES = {
-  '32': 'ia32',
   'ia32': 'ia32',
-
-  '64': 'x64',
   'x64': 'x64',
+  'arm': 'arm',
+  'arm64': 'arm64',
 }
 
 class Channel(object):
diff --git a/tools/bots/compare_results.dart b/tools/bots/compare_results.dart
index 9d69ba3..11e2f69 100755
--- a/tools/bots/compare_results.dart
+++ b/tools/bots/compare_results.dart
@@ -15,34 +15,42 @@
 import 'results.dart';
 
 class Result {
+  final String configuration;
   final String name;
   final String outcome;
   final String expectation;
   final bool matches;
   final bool flaked;
 
-  Result(this.name, this.outcome, this.expectation, this.matches, this.flaked);
+  Result(this.configuration, this.name, this.outcome, this.expectation,
+      this.matches, this.flaked);
 
   Result.fromMap(Map<String, dynamic> map, Map<String, dynamic> flakinessData)
-      : name = map["name"],
+      : configuration = map["configuration"],
+        name = map["name"],
         outcome = map["result"],
         expectation = map["expected"],
         matches = map["matches"],
         flaked = flakinessData != null &&
             flakinessData["outcomes"].contains(map["result"]);
+
+  String get key => "$configuration:$name";
 }
 
 class Event {
   final Result before;
   final Result after;
+  final Result approved;
 
-  Event(this.before, this.after);
+  Event(this.before, this.after, this.approved);
 
   bool get isNew => before == null;
   bool get isNewPassing => before == null && after.matches;
   bool get isNewFailing => before == null && !after.matches;
   bool get changed => !unchanged;
   bool get unchanged => before != null && before.outcome == after.outcome;
+  bool get isApproved => approved != null && approved.outcome == after.outcome;
+  bool get isUnapproved => !isApproved;
   bool get remainedPassing => before.matches && after.matches;
   bool get remainedFailing => !before.matches && !after.matches;
   bool get flaked => after.flaked;
@@ -70,27 +78,41 @@
 
 bool firstSection = true;
 
-bool search(String description, String searchFor, List<Event> events,
-    ArgResults options) {
+bool search(
+    String description,
+    String searchForStatus,
+    String searchForApproval,
+    List<Event> events,
+    ArgResults options,
+    Map<String, Map<String, dynamic>> logs,
+    List<String> logSection) {
   bool judgement = false;
   bool beganSection = false;
   int count = options["count"] != null ? int.parse(options["count"]) : null;
-
+  final configurations =
+      events.map((event) => event.after.configuration).toSet();
   for (final event in events) {
-    if (searchFor == "passing" &&
+    if (searchForStatus == "passing" &&
         (event.after.flaked || !event.after.matches)) {
       continue;
     }
-    if (searchFor == "flaky" && !event.after.flaked) {
+    if (searchForStatus == "flaky" && !event.after.flaked) {
       continue;
     }
-    if (searchFor == "failing" && (event.after.flaked || event.after.matches)) {
+    if (searchForStatus == "failing" &&
+        (event.after.flaked || event.after.matches)) {
+      continue;
+    }
+    if (searchForApproval == "approved" && !event.isApproved) {
+      continue;
+    }
+    if (searchForApproval == "unapproved" && !event.isUnapproved) {
       continue;
     }
     if (options["unchanged"] && !event.unchanged) continue;
     if (options["changed"] && !event.changed) continue;
     if (!beganSection) {
-      if (options["human"]) {
+      if (options["human"] && !options["logs-only"]) {
         if (!firstSection) {
           print("");
         }
@@ -101,7 +123,12 @@
     beganSection = true;
     final before = event.before;
     final after = event.after;
-    final name = event.after.name;
+    // The --flaky option is used to get a list of tests to deflake within a
+    // single named configuration. Therefore we can't right now always emit
+    // the configuration name, so only do it if there's more than one in the
+    // results being compared (that won't happen during deflaking.
+    final name =
+        configurations.length == 1 ? event.after.name : event.after.key;
     if (!after.flaked && !after.matches) {
       judgement = true;
     }
@@ -113,30 +140,35 @@
         break;
       }
     }
-    if (options["human"]) {
-      if (options["verbose"]) {
-        String expected =
-            after.matches ? "" : ", expected ${after.expectation}";
+    String output;
+    if (options["verbose"]) {
+      if (options["human"]) {
+        String expect = after.matches ? "" : ", expected ${after.expectation}";
         if (before == null || before.outcome == after.outcome) {
-          print("${name} ${event.description} "
-              "(${event.after.outcome}${expected})");
+          output = "$name ${event.description} "
+              "(${event.after.outcome}${expect})";
         } else {
-          print("${name} ${event.description} "
-              "(${event.before?.outcome} -> ${event.after.outcome}${expected})");
+          output = "$name ${event.description} "
+              "(${event.before?.outcome} -> ${event.after.outcome}${expect})";
         }
       } else {
-        print(name);
-      }
-    } else {
-      if (options["verbose"]) {
-        print("$name "
-            "${before?.outcome} ${after.outcome} "
+        output = "$name ${before?.outcome} ${after.outcome} "
             "${before?.expectation} ${after.expectation} "
             "${before?.matches} ${after.matches} "
-            "${before?.flaked} ${after.flaked}");
-      } else {
-        print(event.after.name);
+            "${before?.flaked} ${after.flaked}";
       }
+    } else {
+      output = name;
+    }
+    if (logs != null) {
+      final log = logs[event.after.key];
+      final bar = '=' * (output.length + 2);
+      if (log != null) {
+        logSection?.add("\n\n/$bar\\\n| $output |\n\\$bar/\n\n${log["log"]}");
+      }
+    }
+    if (!options["logs-only"]) {
+      print(output);
     }
   }
 
@@ -145,6 +177,8 @@
 
 main(List<String> args) async {
   final parser = new ArgParser();
+  parser.addFlag("approved",
+      abbr: 'A', negatable: false, help: "Show approved tests.");
   parser.addFlag("changed",
       abbr: 'c',
       negatable: false,
@@ -169,6 +203,8 @@
       negatable: false);
   parser.addFlag("passing",
       abbr: 'p', negatable: false, help: "Show passing tests.");
+  parser.addFlag("unapproved",
+      abbr: 'U', negatable: false, help: "Show unapproved tests.");
   parser.addFlag("unchanged",
       abbr: 'u',
       negatable: false,
@@ -177,12 +213,18 @@
       abbr: "v",
       help: "Show the old and new result for each test",
       negatable: false);
+  parser.addOption("logs",
+      abbr: "l", help: "Path to file holding logs of failing tests.");
+  parser.addFlag("logs-only",
+      help: "Only print logs of failing tests, no other output",
+      negatable: false);
 
   final options = parser.parse(args);
   if (options["help"]) {
     print("""
-Usage: compare_results.dart [OPTION]... [BEFORE] [AFTER]
+Usage: compare_results.dart [OPTION]... BEFORE AFTER [APPROVED]
 Compare the old and new test results and list tests that pass the filters.
+Three-way compare with the approved results if provided.
 All tests are listed if no filters are given.
 
 The options are as follows:
@@ -199,8 +241,9 @@
   }
 
   final parameters = options.rest;
-  if (parameters.length != 2) {
-    print("error: Expected two parameters (results before and results after)");
+  if (parameters.length != 2 && parameters.length != 3) {
+    print("error: Expected two or three parameters "
+        "(results before, results after, and (optionally) approved results)");
     exitCode = 2;
     return;
   }
@@ -208,6 +251,12 @@
   // Load the input and the flakiness data if specified.
   final before = await loadResultsMap(parameters[0]);
   final after = await loadResultsMap(parameters[1]);
+  final approved = 3 <= parameters.length
+      ? await loadResultsMap(parameters[2])
+      : <String, Map<String, dynamic>>{};
+  final logs = options['logs'] == null
+      ? <String, Map<String, dynamic>>{}
+      : await loadResultsMap(options['logs']);
   final flakinessData = options["flakiness-data"] != null
       ? await loadResultsMap(options["flakiness-data"])
       : <String, Map<String, dynamic>>{};
@@ -219,76 +268,112 @@
   for (final name in names) {
     final mapBefore = before[name];
     final mapAfter = after[name];
+    final mapApproved = approved[name];
     final resultBefore = mapBefore != null
         ? new Result.fromMap(mapBefore, flakinessData[name])
         : null;
     final resultAfter = new Result.fromMap(mapAfter, flakinessData[name]);
-    final event = new Event(resultBefore, resultAfter);
+    final resultApproved = mapApproved != null
+        ? new Result.fromMap(mapApproved, flakinessData[name])
+        : null;
+    final event = new Event(resultBefore, resultAfter, resultApproved);
     events.add(event);
   }
 
+  final filterDescriptions = {
+    "passing": {
+      "unchanged": "continued to pass",
+      "changed": "began passing",
+      null: "passed",
+    },
+    "flaky": {
+      "unchanged": "are known to flake but didn't",
+      "changed": "flaked",
+      null: "are known to flake",
+    },
+    "failing": {
+      "unchanged": "continued to fail",
+      "changed": "began failing",
+      null: "failed",
+    },
+    null: {
+      "unchanged": "had the same result",
+      "changed": "changed result",
+      null: "ran",
+    },
+  };
+
+  final searchForStatuses =
+      ["passing", "flaky", "failing"].where((option) => options[option]);
+
+  final approvalDescriptions = {
+    "passing": {
+      "approved": " (approved)",
+      "unapproved": " (should be approved)",
+      null: "",
+    },
+    "flaky": {
+      "approved": " (approved result)",
+      "unapproved": " (unapproved result)",
+      null: "",
+    },
+    "failing": {
+      "approved": " (approved)",
+      "unapproved": " (needs approval)",
+      null: "",
+    },
+    null: {
+      "approved": " (approved)",
+      "unapproved": " (needs approval)",
+      null: "",
+    },
+  };
+
+  final searchForApprovals =
+      ["approved", "unapproved"].where((option) => options[option]);
+
   // Report tests matching the filters.
+  final logSection = <String>[];
   bool judgement = false;
-  if (options["passing"] || options["flaky"] || options["failing"]) {
-    if (options["passing"]) {
-      String sectionHeader;
-      if (options["unchanged"]) {
-        sectionHeader = "The following tests continued to pass:";
-      } else if (options["changed"]) {
-        sectionHeader = "The following tests began passing:";
-      } else {
-        sectionHeader = "The following tests passed:";
+  for (final searchForStatus
+      in searchForStatuses.isNotEmpty ? searchForStatuses : <String>[null]) {
+    for (final searchForApproval in searchForApprovals.isNotEmpty
+        ? searchForApprovals
+        : <String>[null]) {
+      final searchForChanged = options["unchanged"]
+          ? "unchanged"
+          : options["changed"] ? "changed" : null;
+      final aboutStatus = filterDescriptions[searchForStatus][searchForChanged];
+      final aboutApproval =
+          approvalDescriptions[searchForStatus][searchForApproval];
+      final sectionHeader = "The following tests $aboutStatus$aboutApproval:";
+      final logSectionArg = searchForStatus == "failing" ? logSection : null;
+      bool possibleJudgement = search(sectionHeader, searchForStatus,
+          searchForApproval, events, options, logs, logSectionArg);
+      if ((searchForStatus == null || searchForStatus == "failing") &&
+          (searchForApproval == null || searchForApproval == "unapproved")) {
+        judgement = possibleJudgement;
       }
-      search(sectionHeader, "passing", events, options);
     }
-    if (options["flaky"]) {
-      String sectionHeader;
-      if (options["unchanged"]) {
-        sectionHeader = "The following tests are known to flake but didn't:";
-      } else if (options["changed"]) {
-        sectionHeader = "The following tests flaked:";
-      } else {
-        sectionHeader = "The following tests are known to flake:";
-      }
-      search(sectionHeader, "flaky", events, options);
-    }
-    if (options["failing"]) {
-      String sectionHeader;
-      if (options["unchanged"]) {
-        sectionHeader = "The following tests continued to fail:";
-      } else if (options["changed"]) {
-        sectionHeader = "The following tests began failing:";
-      } else {
-        sectionHeader = "The following tests failed:";
-      }
-      judgement = search(sectionHeader, "failing", events, options);
-    }
-  } else {
-    String sectionHeader;
-    if (options["unchanged"]) {
-      sectionHeader = "The following tests had the same result:";
-    } else if (options["changed"]) {
-      sectionHeader = "The following tests changed result:";
-    } else {
-      sectionHeader = "The following tests ran:";
-    }
-    judgement = search(sectionHeader, null, events, options);
   }
 
+  if (logSection.isNotEmpty) {
+    print(logSection.join());
+  }
   // Exit 1 only if --judgement and any test failed.
   if (options["judgement"]) {
-    if (options["human"] && !firstSection) {
+    if (options["human"] && !options["logs-only"] && !firstSection) {
       print("");
     }
     String oldNew =
         options["unchanged"] ? "old " : options["changed"] ? "new " : "";
     if (judgement) {
-      if (options["human"]) {
+      if (options["human"] && !options["logs-only"]) {
         print("There were ${oldNew}test failures.");
       }
       exitCode = 1;
     } else {
-      if (options["human"]) {
+      if (options["human"] && !options["logs-only"]) {
         print("No ${oldNew}test failures were found.");
       }
     }
diff --git a/tools/bots/dart_sdk.py b/tools/bots/dart_sdk.py
index 4480fde..be81900 100755
--- a/tools/bots/dart_sdk.py
+++ b/tools/bots/dart_sdk.py
@@ -16,40 +16,48 @@
 utils = bot_utils.GetUtils()
 
 BUILD_OS = utils.GuessOS()
+BUILD_ARCHITECTURE = utils.GuessArchitecture()
 
 (bot_name, _) = bot.GetBotName()
 CHANNEL = bot_utils.GetChannelFromName(bot_name)
 
+def BuildArchitectures():
+ if BUILD_OS == 'linux':
+   return ['ia32', 'x64', 'arm', 'arm64']
+ else:
+   return ['ia32', 'x64']
+
 def BuildSDK():
   with bot.BuildStep('Build SDK'):
     if BUILD_OS == 'linux':
       sysroot_env = dict(os.environ)
       sysroot_env['DART_USE_WHEEZY'] = '1'
       Run([sys.executable, './tools/generate_buildfiles.py'], env=sysroot_env)
-    Run([sys.executable, './tools/build.py', '--mode=release',
-         '--arch=ia32', 'create_sdk'])
-    Run([sys.executable, './tools/build.py', '--mode=release',
-         '--arch=x64', 'create_sdk'])
+    for arch in BuildArchitectures():
+      Run([sys.executable, './tools/build.py', '--mode=release',
+           '--arch=' + arch, 'create_sdk'])
 
 def BuildDartdocAPIDocs(dirname):
   dart_sdk = os.path.join(bot_utils.DART_DIR,
-                          utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
+                          utils.GetBuildRoot(BUILD_OS, 'release',
+                                             BUILD_ARCHITECTURE),
                           'dart-sdk')
   dart_exe =  os.path.join(dart_sdk, 'bin', 'dart')
   dartdoc_dart = os.path.join(bot_utils.DART_DIR,
-                              'third_party', 'pkg' , 'dartdoc' , 'bin' , 
+                              'third_party', 'pkg', 'dartdoc', 'bin',
                               'dartdoc.dart')
   footer_file = os.path.join(bot_utils.DART_DIR,
                               'tools', 'bots', 'dartdoc_footer.html')
   url = 'https://api.dartlang.org/stable'
   with bot.BuildStep('Build API docs by dartdoc'):
     bot_utils.run([dart_exe, dartdoc_dart,
-                  '--sdk-docs','--output', dirname, '--footer' , footer_file,
+                  '--sdk-docs', '--output', dirname, '--footer', footer_file,
                   '--rel-canonical-prefix=' + url])
 
 def CreateUploadVersionFile():
   file_path = os.path.join(bot_utils.DART_DIR,
-                           utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
+                           utils.GetBuildRoot(BUILD_OS, 'release',
+                                              BUILD_ARCHITECTURE),
                            'VERSION')
   with open(file_path, 'w') as fd:
     fd.write(utils.GetVersionFileContent())
@@ -64,49 +72,35 @@
 
 def CreateUploadSDKZips():
   with bot.BuildStep('Create and upload sdk zips'):
-    sdk32_path = os.path.join(bot_utils.DART_DIR,
-                              utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
+    for arch in BuildArchitectures():
+      sdk_path = os.path.join(bot_utils.DART_DIR,
+                              utils.GetBuildRoot(BUILD_OS, 'release', arch),
                               'dart-sdk')
-    sdk64_path = os.path.join(bot_utils.DART_DIR,
-                              utils.GetBuildRoot(BUILD_OS, 'release', 'x64'),
-                              'dart-sdk')
+      sdk_zip = os.path.join(bot_utils.DART_DIR,
+                             utils.GetBuildRoot(BUILD_OS, 'release', arch),
+                             'dartsdk-%s-%s.zip' % (BUILD_OS, arch))
+      FileDelete(sdk_zip)
+      CreateZip(sdk_path, sdk_zip)
+      DartArchiveUploadSDKs(BUILD_OS, arch, sdk_zip)
 
-    sdk32_zip = os.path.join(bot_utils.DART_DIR,
-                             utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
-                             'dartsdk-%s-32.zip' % BUILD_OS)
-    sdk64_zip = os.path.join(bot_utils.DART_DIR,
-                             utils.GetBuildRoot(BUILD_OS, 'release', 'x64'),
-                             'dartsdk-%s-64.zip' % BUILD_OS)
-    FileDelete(sdk32_zip)
-    FileDelete(sdk64_zip)
-    CreateZip(sdk32_path, sdk32_zip)
-    CreateZip(sdk64_path, sdk64_zip)
-    DartArchiveUploadSDKs(BUILD_OS, sdk32_zip, sdk64_zip)
-
-def DartArchiveUploadSDKs(system, sdk32_zip, sdk64_zip):
+def DartArchiveUploadSDKs(system, arch, sdk_zip):
   namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
   git_number = utils.GetArchiveVersion()
   git_hash = 'hash/%s' % utils.GetGitRevision()
   for revision in [git_number, git_hash, 'latest']:
-    path32 = namer.sdk_zipfilepath(revision, system, 'ia32', 'release')
-    path64 = namer.sdk_zipfilepath(revision, system, 'x64', 'release')
-    DartArchiveFile(sdk32_zip, path32, checksum_files=True)
-    DartArchiveFile(sdk64_zip, path64, checksum_files=True)
+    path = namer.sdk_zipfilepath(revision, system, arch, 'release')
+    DartArchiveFile(sdk_zip, path, checksum_files=True)
 
 def DartArchiveUnstrippedBinaries():
   namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
   revision = utils.GetArchiveVersion()
   binary = namer.unstripped_filename(BUILD_OS)
-  ia32_binary = os.path.join(bot_utils.DART_DIR,
-                             utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
-                             binary)
-  x64_binary = os.path.join(bot_utils.DART_DIR,
-                            utils.GetBuildRoot(BUILD_OS, 'release', 'x64'),
-                            binary)
-  gs_ia32_path = namer.unstripped_filepath(revision, BUILD_OS, 'ia32')
-  gs_x64_path = namer.unstripped_filepath(revision, BUILD_OS, 'x64')
-  DartArchiveFile(ia32_binary, gs_ia32_path)
-  DartArchiveFile(x64_binary, gs_x64_path)
+  for arch in BuildArchitectures():
+    binary = os.path.join(bot_utils.DART_DIR,
+                          utils.GetBuildRoot(BUILD_OS, 'release', arch),
+                          binary)
+    gs_path = namer.unstripped_filepath(revision, BUILD_OS, arch)
+    DartArchiveFile(binary, gs_path)
 
 def CreateUploadSDK():
   BuildSDK()
@@ -114,12 +108,14 @@
   DartArchiveUnstrippedBinaries()
 
 def CreateUploadAPIDocs():
-  dartdoc_dir =  os.path.join(bot_utils.DART_DIR,
-                              utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
-                              'gen-dartdocs')
-  dartdoc_zip =  os.path.join(bot_utils.DART_DIR,
-                              utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
-                              'dartdocs-api.zip')
+  dartdoc_dir = os.path.join(bot_utils.DART_DIR,
+                             utils.GetBuildRoot(BUILD_OS, 'release',
+                                                BUILD_ARCHITECTURE),
+                             'gen-dartdocs')
+  dartdoc_zip = os.path.join(bot_utils.DART_DIR,
+                             utils.GetBuildRoot(BUILD_OS, 'release',
+                                                BUILD_ARCHITECTURE),
+                             'dartdocs-api.zip')
   if CHANNEL == 'try':
     BuildDartdocAPIDocs(dartdoc_dir)
   else:
@@ -176,7 +172,7 @@
       throw_on_error=False)
   # If the returncode is nonzero and we can find a specific error message,
   # we know there are no objects with a prefix of [gsu_path].
-  missing = (returncode and 'CommandException: No such object' in stderr)
+  missing = (returncode and 'CommandException: One or more URLs matched no objects.' in stderr)
   # Either the returncode has to be zero or the object must be missing,
   # otherwise throw an exception.
   if not missing and returncode:
diff --git a/tools/bots/find_base_commit.dart b/tools/bots/find_base_commit.dart
index 2df7e35..8106385 100755
--- a/tools/bots/find_base_commit.dart
+++ b/tools/bots/find_base_commit.dart
@@ -5,6 +5,7 @@
 
 // Find the newest commit that has a full set of results on the bots.
 
+import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
 import 'dart:math';
@@ -50,15 +51,31 @@
       "&max_builds=$maxBuilds"
       "&status=COMPLETED"
       "&fields=builds(url%2Cparameters_json)");
-  final client = new HttpClient();
-  final request = await client.getUrl(url).timeout(const Duration(seconds: 30));
-  final response = await request.close().timeout(const Duration(seconds: 30));
-  final Map<String, dynamic> object = await response
-      .transform(new Utf8Decoder())
-      .transform(new JsonDecoder())
-      .first
-      .timeout(const Duration(seconds: 30));
-  client.close();
+  const maxRetries = 3;
+  const timeout = const Duration(seconds: 30);
+  Map<String, dynamic> object;
+  for (int i = 1; i <= maxRetries; i++) {
+    try {
+      final client = new HttpClient();
+      final request = await client.getUrl(url).timeout(timeout);
+      final response = await request.close().timeout(timeout);
+      object = await response
+          .transform(new Utf8Decoder())
+          .transform(new JsonDecoder())
+          .first
+          .timeout(timeout);
+      client.close();
+      break;
+    } on TimeoutException catch (e) {
+      final inSeconds = e.duration.inSeconds;
+      stderr.writeln(
+          "Attempt $i of $maxRetries timed out after $inSeconds seconds");
+      if (i == maxRetries) {
+        stderr.writeln("error: Failed to download $url");
+        exit(1);
+      }
+    }
+  }
 
   // Locate the builds we're interested in and map them to each commit. The
   // builds returned by the API are sorted with the newest first. Since bots
diff --git a/tools/bots/flutter/analyze_flutter.sh b/tools/bots/flutter/analyze_flutter.sh
index 4f752e5..0685c0e 100755
--- a/tools/bots/flutter/analyze_flutter.sh
+++ b/tools/bots/flutter/analyze_flutter.sh
@@ -2,12 +2,13 @@
 # Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
-#
-# Runs flutter's analyze tests with a locally built SDK.
+
+# Runs flutter's analyzer related tests with a locally built SDK.
 set -e
 
-dart=$(pwd)/tools/sdks/dart-sdk/bin/dart
-sdk=$(pwd)/out/ReleaseX64/dart-sdk
+checkout=$(pwd)
+dart=$checkout/tools/sdks/dart-sdk/bin/dart
+sdk=$checkout/out/ReleaseX64/dart-sdk
 tmpdir=$(mktemp -d)
 cleanup() {
   rm -rf "$tmpdir"
@@ -15,8 +16,18 @@
 trap cleanup EXIT HUP INT QUIT TERM PIPE
 cd "$tmpdir"
 
-git clone --depth 1 -vv https://chromium.googlesource.com/external/github.com/flutter/flutter
+git clone -vv https://chromium.googlesource.com/external/github.com/flutter/flutter
+
 cd flutter
+
 bin/flutter config --no-analytics
+
+pinned_dart_sdk=$(cat bin/cache/dart-sdk/revision)
+patch=$checkout/tools/patches/flutter-engine/${pinned_dart_sdk}.flutter.patch
+if [ -e "$patch" ]; then
+  git apply $patch
+fi
+
 bin/flutter update-packages
-$dart dev/bots/analyze.dart --dart-sdk $sdk
\ No newline at end of file
+
+$dart dev/bots/analyze.dart --dart-sdk $sdk
diff --git a/tools/bots/pub_integration_test.py b/tools/bots/pub_integration_test.py
index 61168c2..16d084a 100755
--- a/tools/bots/pub_integration_test.py
+++ b/tools/bots/pub_integration_test.py
@@ -3,6 +3,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+import optparse
 import os
 import subprocess
 import sys
@@ -16,10 +17,19 @@
 """
 
 def Main():
+  parser = optparse.OptionParser()
+  parser.add_option('--mode', action='store', dest='mode', type='string',
+                    default='release')
+
+  (options, args) = parser.parse_args()
+
+  out_dir_subfolder = 'DebugX64' if options.mode == 'debug' else 'ReleaseX64'
+
   out_dir = 'xcodebuild' if sys.platform == 'darwin' else 'out'
   extension = '' if not sys.platform == 'win32' else '.bat'
   pub = os.path.abspath(
-    '%s/ReleaseX64/dart-sdk/bin/pub%s' % (out_dir, extension))
+    '%s/%s/dart-sdk/bin/pub%s' % (out_dir, out_dir_subfolder, extension))
+  print(pub)
 
   working_dir = tempfile.mkdtemp()
   try:
diff --git a/tools/bots/results.dart b/tools/bots/results.dart
index fbc51e7..ec760c5 100644
--- a/tools/bots/results.dart
+++ b/tools/bots/results.dart
@@ -8,6 +8,98 @@
 import 'dart:convert';
 import 'dart:io';
 
+/// gsutil.py binary to use.
+final gsutil = Platform.isWindows ? "gsutil.py.bat" : "gsutil.py";
+
+/// Cloud storage location containing results.
+const testResultsStoragePath = "gs://dart-test-results/builders";
+
+/// Cloud storage location containing approved results.
+const approvedResultsStoragePath =
+    "gs://dart-test-results-approved-results/builders";
+
+/// Runs gsutil with the provided [arguments] and returns the standard output.
+/// Returns null if the requested URL didn't exist.
+Future<String> runGsutil(List<String> arguments) async {
+  final processResult = await Process.run(gsutil, arguments,
+      environment: {"DEPOT_TOOLS_UPDATE": "0"});
+  if (processResult.exitCode != 0) {
+    if (processResult.exitCode == 1 &&
+            processResult.stderr.contains("No URLs matched") ||
+        processResult.stderr.contains("One or more URLs matched no objects")) {
+      return null;
+    }
+    throw new Exception("Failed to run: $gsutil $arguments\n"
+        "exitCode: ${processResult.exitCode}\n"
+        "stdout:\n${processResult.stdout}\n"
+        "stderr:\n${processResult.stderr}");
+  }
+  return processResult.stdout;
+}
+
+/// Returns the contents of the provided cloud storage [path], or null if it
+/// didn't exist.
+Future<String> catGsutil(String path) => runGsutil(["cat", path]);
+
+/// Returns the files and directories in the provided cloud storage [directory],
+/// or null if it didn't exist.
+Future<Iterable<String>> lsGsutil(String directory) async {
+  final contents = await runGsutil(["ls", directory]);
+  if (contents == null) {
+    return null;
+  }
+  return LineSplitter.split(contents).map((String path) {
+    final elements = path.split("/");
+    if (elements[elements.length - 1].isEmpty) {
+      return elements[elements.length - 2];
+    } else {
+      return elements[elements.length - 1];
+    }
+  });
+}
+
+/// Copies a file to or from cloud storage.
+Future cpGsutil(String source, String destination) =>
+    runGsutil(["cp", source, destination]);
+
+/// Copies a directory recursively to or from cloud strorage.
+Future cpRecursiveGsutil(String source, String destination) =>
+    runGsutil(["-m", "cp", "-r", "-Z", source, destination]);
+
+/// Lists the bots in cloud storage.
+Future<Iterable<String>> listBots() => lsGsutil("$testResultsStoragePath");
+
+/// Returns the cloud storage path for the [bot].
+String botCloudPath(String bot) => "$testResultsStoragePath/$bot";
+
+/// Returns the cloud storage path to the [build] on the [bot].
+String buildCloudPath(String bot, String build) =>
+    "${botCloudPath(bot)}/$build";
+
+/// Returns the cloud storage path to the [file] inside the [bot]'s directory.
+String fileCloudPath(String bot, String file) => "${botCloudPath(bot)}/$file";
+
+/// Reads the contents of the [file] inside the [bot]'s cloud storage.
+Future<String> readFile(String bot, String file) =>
+    catGsutil(fileCloudPath(bot, file));
+
+/// Returns the cloud storage path to the [file] inside the [build] on the
+/// [bot].
+String buildFileCloudPath(String bot, String build, String file) =>
+    "${buildCloudPath(bot, build)}/$file";
+
+/// Reads the contents of the [file] inside the [build] in the [bot]'s cloud
+/// storage.
+Future<String> readBuildFile(String bot, String build, String file) =>
+    catGsutil(buildFileCloudPath(bot, build, file));
+
+List<Map<String, dynamic>> parseResults(String contents) {
+  return LineSplitter.split(contents)
+      .map(jsonDecode)
+      .toList()
+      .cast<Map<String, dynamic>>();
+}
+
 Future<List<Map<String, dynamic>>> loadResults(String path) async {
   final results = <Map<String, dynamic>>[];
   final lines = new File(path)
@@ -24,7 +116,11 @@
 Map<String, Map<String, dynamic>> createResultsMap(
         List<Map<String, dynamic>> results) =>
     new Map<String, Map<String, dynamic>>.fromIterable(results,
-        key: (dynamic result) => (result as Map<String, dynamic>)['name']);
+        key: (dynamic result) =>
+            "${result["configuration"]}:${result["name"]}");
+
+Map<String, Map<String, dynamic>> parseResultsMap(String contents) =>
+    createResultsMap(parseResults(contents));
 
 Future<Map<String, Map<String, dynamic>>> loadResultsMap(String path) async =>
     createResultsMap(await loadResults(path));
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 2ba6dbc..715ce52 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -23,7 +23,10 @@
       "samples/",
       "sdk/",
       "tests/angular/",
-      "tests/co19_2/",
+      "tests/co19_2/co19_2-analyzer.status",
+      "tests/co19_2/co19_2-dart2js.status",
+      "tests/co19_2/co19_2-kernel.status",
+      "tests/co19_2/co19_2-runtime.status",
       "tests/compiler/",
       "tests/corelib_2/",
       "tests/dart/",
@@ -56,7 +59,10 @@
       "samples/",
       "sdk/",
       "tests/angular/",
-      "tests/co19_2/",
+      "tests/co19_2/co19_2-analyzer.status",
+      "tests/co19_2/co19_2-dart2js.status",
+      "tests/co19_2/co19_2-kernel.status",
+      "tests/co19_2/co19_2-runtime.status",
       "tests/compiler/",
       "tests/corelib_2/",
       "tests/dart/",
@@ -78,6 +84,38 @@
       "xcodebuild/ReleaseX64/dart2js_platform.dill",
       "xcodebuild/ReleaseX64/dart2js_platform_strong.dill"
     ],
+    "fuzzer": [
+      "runtime/tools/dartfuzz/",
+      "out/DebugIA32/",
+      "out/DebugSIMARM/",
+      "out/DebugSIMARM64/",
+      "out/DebugSIMDBC/",
+      "out/DebugSIMDBC64/",
+      "out/DebugX64/",
+      "out/ProductX64/",
+      "out/ReleaseIA32/",
+      "out/ReleaseSIMARM/",
+      "out/ReleaseSIMARM64/",
+      "out/ReleaseSIMDBC/",
+      "out/ReleaseSIMDBC64/",
+      "out/ReleaseX64/",
+      "third_party/pkg/",
+      "third_party/pkg_tested/",
+      "third_party/observatory_pub_packages/packages/",
+      "tools/sdks/dart-sdk/",
+      "pkg/async_helper/",
+      "pkg/build_integration/",
+      "pkg/dart_internal/",
+      "pkg/expect/",
+      "pkg/front_end/",
+      "pkg/js/",
+      "pkg/kernel/",
+      "pkg/meta/",
+      "pkg/vm/",
+      "runtime/",
+      "sdk/",
+      ".packages"
+    ],
     "vm-kernel": [
       "out/DebugIA32/",
       "out/DebugSIMARM/",
@@ -85,9 +123,11 @@
       "out/DebugSIMDBC64/",
       "out/DebugX64/",
       "out/ProductX64/",
+      "out/ReleaseAndroidARM/",
       "out/ReleaseIA32/",
       "out/ReleaseSIMARM/",
       "out/ReleaseSIMARM64/",
+      "out/ReleaseXARM64/",
       "out/ReleaseSIMDBC64/",
       "out/ReleaseX64/",
       "xcodebuild/DebugIA32/",
@@ -101,12 +141,15 @@
       "samples/",
       "samples-dev/",
       "tools/",
-      "third_party/gsutil/",
+      "third_party/android_tools/sdk/platform-tools/adb",
       "third_party/pkg/",
       "third_party/pkg_tested/",
       "third_party/observatory_pub_packages/packages/",
       "tests/angular/",
-      "tests/co19_2/",
+      "tests/co19_2/co19_2-analyzer.status",
+      "tests/co19_2/co19_2-dart2js.status",
+      "tests/co19_2/co19_2-kernel.status",
+      "tests/co19_2/co19_2-runtime.status",
       "tests/compiler/",
       "tests/corelib_2/",
       "tests/dart/",
@@ -118,6 +161,7 @@
       "tests/standalone/",
       "tests/standalone_2/",
       "pkg/async_helper/",
+      "pkg/build_integration/",
       "pkg/dart_internal/",
       "pkg/expect/",
       "pkg/front_end/",
@@ -142,24 +186,23 @@
         "runtime": "vm",
         "timeout": 240,
         "use-sdk": true
-      }},
-    "unittest-asserts-(linux|mac|win)": {
+    }},
+    "unittest-asserts-(release|debug)-(linux|mac|win)": {
+      "options": {
+        "compiler": "dartk",
+        "enable-asserts": true,
+        "runtime": "vm",
+        "timeout": 240,
+        "use-sdk": true
+    }},
+    "unittest-asserts-no-sdk-(linux|mac|win)": {
       "options": {
         "compiler": "dartk",
         "enable-asserts": true,
         "mode": "release",
         "runtime": "vm",
-        "timeout": 240,
-        "use-sdk": true
-      }},
-      "unittest-asserts-no-sdk-(linux|mac|win)": {
-        "options": {
-          "compiler": "dartk",
-          "enable-asserts": true,
-          "mode": "release",
-          "runtime": "vm",
-          "timeout": 240
-        }},
+        "timeout": 240
+    }},
     "unittest-analyzer_use_fasta-linux": {
       "options": {
         "compiler": "none",
@@ -168,76 +211,47 @@
         "use-sdk": true,
         "vm-options": ["-DuseFastaParser=true"],
         "builder-tag": "analyzer_use_fasta"
-      }},
+    }},
     "dartk-asan-linux-release-(ia32|x64)": {
       "options": {
         "builder-tag": "asan",
         "timeout": 240
-      }},
+    }},
     "dart2js-(linux|mac|win)-chrome": {
       "options": {
         "use-sdk": true
-      }},
+    }},
     "dart2js-(linux|win)-firefox": {
       "options": {
         "use-sdk": true
-      }},
+    }},
     "dart2js-win-(ie11|edge)": {
       "options": {
         "use-sdk": true
-      }},
+    }},
     "dart2js-mac-safari": {
       "options": {
         "use-sdk": true
-      }},
-    "dart2js-faststartup-(linux|mac|win)-chrome": {
-      "options": {
-        "fast-startup": true,
-        "use-sdk": true
-      }},
-    "dart2js-faststartup-(linux|win)-firefox": {
-      "options": {
-        "fast-startup": true,
-        "use-sdk": true
-      }},
-    "dart2js-faststartup-win-(ie11|edge)": {
-      "options": {
-        "fast-startup": true,
-        "use-sdk": true
-      }},
-    "dart2js-faststartup-mac-safari": {
-      "options": {
-        "fast-startup": true,
-        "use-sdk": true
-      }},
+    }},
     "dart2js-minified-csp-linux-chrome": {
       "options": {
         "minified": true,
         "csp": true,
         "use-sdk": true
-      }},
-    "dart2js-minified-faststartup-csp-linux-chrome": {
-      "options": {
-        "minified": true,
-        "csp": true,
-        "fast-startup": true,
-        "use-sdk": true
-      }},
+    }},
     "dart2js-minified-linux-d8": {
       "options": {
         "minified": true,
         "use-sdk": true
-      }},
-    "dart2js-minified-faststartup-linux-d8": {
-      "options": {
-        "minified": true,
-        "fast-startup": true,
-        "use-sdk": true
-      }},
+    }},
     "dart2js-hostasserts-linux-ia32-d8": {
       "options": {
         "host-checked": true
-      }},
+    }},
+    "dartkp-android-release-arm": {
+      "options": {
+        "use-blobs": true
+    }},
     "dartkp-linux-release-(simarm|simarm64)": {
       "options": {
         "use-blobs": true
@@ -260,6 +274,15 @@
       "options": {
         "vm-options": ["--no-enable-malloc-hooks"]
     }},
+    "dartkp-bare-linux-(debug|release)-x64": {
+      "options": {
+        "vm-options": ["--no-enable-malloc-hooks", "--use-bare-instructions"]
+    }},
+    "dartkp-bare-linux-(debug|release)-(simarm|simarm64)": {
+      "options": {
+        "vm-options": ["--no-enable-malloc-hooks", "--use-bare-instructions"],
+        "use-blobs": true
+    }},
     "dartk-(linux|mac)-(debug|release)-(ia32|x64)": { },
     "dartk-checked-linux-release-x64": {
       "options": {
@@ -268,60 +291,54 @@
     "dartk-win-(debug|release)-(ia32|x64)": { },
     "dartk-(linux|mac|win)-product-x64": { },
     "dartk-(linux|mac)-(debug|release)-simdbc64": { },
-    "dartk-linux-release-(simarm|simarm64)": { },
+    "dartk-linux-release-(arm64|simarm|simarm64)": { },
     "dartk-optcounter-linux-release-(ia32|x64)": {
       "options": {
         "builder-tag": "optimization_counter_threshold",
         "vm-options": ["--optimization-counter-threshold=5"]
-      }},
+    }},
     "dartk-reload-linux-(debug|release)-x64": {
       "options": {
         "hot-reload": true
-      }},
+    }},
     "dartk-reload-mac-(debug|release)-simdbc64": {
       "options": {
         "hot-reload": true
-      }},
+    }},
     "dartk-reload-rollback-linux-(debug|release)-x64": {
       "options": {
         "hot-reload-rollback": true
-      }},
+    }},
     "app_jitk-linux-(debug|product|release)-x64": { },
     "dartkb-interpret-linux-(debug|release)-x64": {
       "options": {
         "vm-options": ["--enable_interpreter", "--compilation-counter-threshold=-1"]
-      }},
+    }},
     "dartkb-mixed-linux-(debug|release)-x64": {
       "options": {
         "vm-options": ["--enable_interpreter"]
-      }},
+    }},
     "dartkb-compile-linux-(debug|release)-x64": {
       "options": {
         "vm-options": ["--use_bytecode_compiler"]
-      }},
+    }},
     "(dartdevc|dartdevk)-checked-(linux|mac|win)-release-chrome": {
       "options": {
         "checked": true,
         "use-sdk": true
-      }},
+    }},
     "fasta-(linux|mac|win)": { },
     "analyzer-(linux|mac|win)": {
       "options": {
         "compiler": "dart2analyzer",
         "use-sdk": true
-      }},
+    }},
     "analyzer-asserts-(linux|mac|win)": {
       "options": {
         "compiler": "dart2analyzer",
         "enable-asserts": true,
         "use-sdk": true
-      }},
-    "analyzer-fasta_parser-linux": {
-      "options": {
-        "compiler": "dart2analyzer",
-        "analyzer-use-fasta-parser": true,
-        "use-sdk": true
-      }}
+    }}
   },
   "builder_configurations": [
     {
@@ -347,7 +364,7 @@
         {
           "name": "unit tests",
           "arguments": [
-            "-nunittest-asserts-${system}",
+            "-nunittest-asserts-${mode}-${system}",
              "pkg/(kernel|front_end|fasta)"
           ]
         },
@@ -393,7 +410,6 @@
           "name": "vm mixed mode tests",
           "arguments": [
             "-ndartkb-mixed-linux-${mode}-x64",
-            "--compiler=dartkb",
             "language_2",
             "corelib_2",
             "lib_2",
@@ -406,7 +422,6 @@
           "name": "vm bytecode compiler tests",
           "arguments": [
             "-ndartkb-compile-linux-${mode}-x64",
-            "--compiler=dartkb",
             "language_2",
             "corelib_2",
             "lib_2",
@@ -419,7 +434,6 @@
           "name": "vm interpreter tests",
           "arguments": [
             "-ndartkb-interpret-linux-${mode}-x64",
-            "--compiler=dartkb",
             "language_2",
             "corelib_2",
             "lib_2",
@@ -459,6 +473,33 @@
     },
     {
       "builders": [
+        "vm-kernel-precomp-android-release-arm"
+      ],
+      "meta": {
+        "description": "This configuration is used by the vm precomp builders on Android."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "runtime_kernel",
+            "dart_precompiled_runtime",
+            "--os=android"
+          ]
+        },
+        {
+          "name": "vm tests",
+          "arguments": [
+            "-ndartkp-android-${mode}-${arch}"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 15
+        }
+      ]
+    },
+    {
+      "builders": [
         "vm-kernel-precomp-linux-debug-x64",
         "vm-kernel-precomp-linux-product-x64",
         "vm-kernel-precomp-linux-release-simarm",
@@ -492,6 +533,34 @@
     },
     {
       "builders": [
+        "vm-kernel-precomp-bare-linux-release-x64",
+        "vm-kernel-precomp-bare-linux-release-simarm",
+        "vm-kernel-precomp-bare-linux-release-simarm64"
+      ],
+      "meta": {
+        "description": "This configuration is used by the vm kernel precomp builders using bare instructions."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": [
+            "runtime_kernel",
+            "dart_precompiled_runtime"
+          ]
+        },
+        {
+          "name": "vm tests",
+          "arguments": [
+            "-ndartkp-bare-${system}-${mode}-${arch}"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 10
+        }
+      ]
+    },
+    {
+      "builders": [
         "vm-kernel-precomp-obfuscate-linux-release-x64"
       ],
       "meta": {
@@ -636,6 +705,27 @@
     },
     {
       "builders": [
+        "cross-vm-linux-release-arm64"
+      ],
+      "meta": {
+        "description": "This configuration is for the cross arm builders."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["runtime_kernel"]
+        },
+        {
+          "name": "vm tests",
+          "arguments": ["-ndartk-${system}-${mode}-${arch}"],
+          "fileset": "vm-kernel",
+          "shards": 1
+        }
+      ]
+    },
+    {
+      "builders": [
         "app-kernel-linux-debug-x64",
         "app-kernel-linux-product-x64",
         "app-kernel-linux-release-x64"
@@ -833,8 +923,10 @@
         {
           "name": "vm tests",
           "arguments": [
-            "-ndartk-reload-${system}-${mode}-${arch}"]
-        }
+            "-ndartk-reload-${system}-${mode}-${arch}"],
+            "fileset": "vm-kernel",
+            "shards": 10
+          }
       ]
     },
     {
@@ -854,8 +946,10 @@
         {
           "name": "vm tests",
           "arguments": [
-            "-ndartk-reload-rollback-linux-${mode}-x64"]
-        }
+            "-ndartk-reload-rollback-linux-${mode}-x64"],
+            "fileset": "vm-kernel",
+            "shards": 10
+          }
       ]
     },
     {
@@ -898,9 +992,9 @@
           "name": "dart2js tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8",
-            "--dart2js-batch"
+            "--dart2js-batch",
+            "--exclude_suite=observatory_ui"
           ],
-          "exclude_tests": ["observatory_ui"],
           "shards": 6,
           "fileset": "dart2js_hostasserts"
         },
@@ -918,25 +1012,26 @@
           "name": "dart2js package tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["pkg"]
+            "--dart2js-batch",
+            "pkg"
+          ]
         },
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["observatory_ui"]
+            "--dart2js-batch",
+            "observatory_ui"
+          ]
         },
         {
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-hostasserts-linux-ia32-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["dart2js_extra","dart2js_native"]
+            "--dart2js-batch",
+            "dart2js_extra",
+            "dart2js_native"
+          ]
         }
       ]
     },
@@ -965,9 +1060,9 @@
           "arguments": [
             "-ndart2js-${system}-${runtime}",
             "--dart2js-batch",
-            "--reset-browser-configuration"
+            "--reset-browser-configuration",
+            "--exclude_suite=observatory_ui"
           ],
-          "exclude_tests": ["observatory_ui"],
           "shards": 6,
           "fileset": "dart2js"
         },
@@ -987,98 +1082,28 @@
           "arguments": [
             "-ndart2js-${system}-${runtime}",
             "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["pkg"]
+            "--reset-browser-configuration",
+            "pkg"
+          ]
         },
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
             "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["observatory_ui"]
+            "--reset-browser-configuration",
+            "observatory_ui"
+          ]
         },
         {
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-${system}-${runtime}",
             "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["dart2js_extra","dart2js_native"]
-        }
-      ]
-    },
-    {
-      "builders": [
-        "dart2js-strong-faststartup-linux-x64-chrome",
-        "dart2js-strong-faststartup-linux-x64-firefox",
-        "dart2js-strong-faststartup-mac-x64-chrome",
-        "dart2js-strong-faststartup-mac-x64-safari",
-        "dart2js-strong-faststartup-win-x64-chrome",
-        "dart2js-strong-faststartup-win-x64-edge",
-        "dart2js-strong-faststartup-win-x64-firefox",
-        "dart2js-strong-faststartup-win-x64-ie11"
-      ],
-      "meta": {
-        "description": "dart2js browser tests using the fast-startup emitter for Dart 2.0."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["create_sdk"]
-        },
-        {
-          "name": "dart2js fast-startup tests",
-          "arguments": [
-            "-ndart2js-faststartup-${system}-${runtime}",
-            "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "exclude_tests": ["observatory_ui"],
-          "shards": 6,
-          "fileset": "dart2js"
-        },
-        {
-          "name": "dart2js fast-startup co19_2 tests",
-          "arguments": [
-            "-ndart2js-faststartup-${system}-${runtime}",
-            "--dart2js-batch",
             "--reset-browser-configuration",
-            "co19_2"
-          ],
-          "shards": 6,
-          "fileset": "dart2js"
-        },
-        {
-          "name": "dart2js fast-startup package tests",
-          "arguments": [
-            "-ndart2js-faststartup-${system}-${runtime}",
-            "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["pkg"]
-        },
-        {
-          "name": "dart2js fast-startup observatory-ui tests",
-          "arguments": [
-            "-ndart2js-faststartup-${system}-${runtime}",
-            "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["observatory_ui"]
-        },
-        {
-          "name": "dart2js fast-startup extra tests",
-          "arguments": [
-            "-ndart2js-faststartup-${system}-${runtime}",
-            "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["dart2js_extra","dart2js_native"]
+            "dart2js_extra",
+            "dart2js_native"
+          ]
         }
       ]
     },
@@ -1097,19 +1122,9 @@
           "name": "dart2js tests",
           "arguments": [
             "-ndart2js-minified-linux-d8",
-            "--dart2js-batch"
+            "--dart2js-batch",
+            "--exclude_suite=observatory_ui"
           ],
-          "exclude_tests": ["observatory_ui"],
-          "shards": 6,
-          "fileset": "dart2js"
-        },
-        {
-          "name": "dart2js fast-startup tests",
-          "arguments": [
-            "-ndart2js-minified-faststartup-linux-d8",
-            "--dart2js-batch"
-          ],
-          "exclude_tests": ["observatory_ui"],
           "shards": 6,
           "fileset": "dart2js"
         },
@@ -1117,49 +1132,26 @@
           "name": "dart2js package tests",
           "arguments": [
             "-ndart2js-minified-linux-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["pkg"]
+            "--dart2js-batch",
+            "pkg"
+          ]
         },
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-minified-linux-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["observatory_ui"]
+            "--dart2js-batch",
+            "observatory_ui"
+          ]
         },
         {
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-minified-linux-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["dart2js_extra","dart2js_native"]
-        },
-        {
-          "name": "dart2js fast-startup package tests",
-          "arguments": [
-            "-ndart2js-minified-faststartup-linux-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["pkg"]
-        },
-        {
-          "name": "dart2js fast-startup observatory-ui tests",
-          "arguments": [
-            "-ndart2js-minified-faststartup-linux-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["observatory_ui"]
-        },
-        {
-          "name": "dart2js fast-startup extra tests",
-          "arguments": [
-            "-ndart2js-minified-faststartup-linux-d8",
-            "--dart2js-batch"
-          ],
-          "tests": ["dart2js_extra","dart2js_native"]
+            "--dart2js-batch",
+            "dart2js_extra",
+            "dart2js_native"
+          ]
         }
       ]
     },
@@ -1179,20 +1171,9 @@
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
             "--dart2js-batch",
-            "--reset-browser-configuration"
+            "--reset-browser-configuration",
+            "--exclude_suite=observatory_ui"
           ],
-          "exclude_tests": ["observatory_ui"],
-          "shards": 4,
-          "fileset": "dart2js"
-        },
-        {
-          "name": "dart2js fast-startup tests",
-          "arguments": [
-            "-ndart2js-minified-faststartup-csp-linux-chrome",
-            "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "exclude_tests": ["observatory_ui"],
           "shards": 4,
           "fileset": "dart2js"
         },
@@ -1201,53 +1182,27 @@
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
             "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["pkg"]
+            "--reset-browser-configuration",
+            "pkg"
+          ]
         },
         {
           "name": "dart2js observatory-ui tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
             "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["observatory_ui"]
+            "--reset-browser-configuration",
+            "observatory_ui"
+          ]
         },
         {
           "name": "dart2js extra tests",
           "arguments": [
             "-ndart2js-minified-csp-linux-chrome",
-            "--dart2js-batch"
-          ],
-          "tests": ["dart2js_extra","dart2js_native"]
-        },
-        {
-          "name": "dart2js fast-startup package tests",
-          "arguments": [
-            "-ndart2js-minified-faststartup-csp-linux-chrome",
             "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["pkg"]
-        },
-        {
-          "name": "dart2js fast-startup observatory-ui tests",
-          "arguments": [
-            "-ndart2js-minified-faststartup-csp-linux-chrome",
-            "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["observatory_ui"]
-        },
-        {
-          "name": "dart2js fast-startup extra tests",
-          "arguments": [
-            "-ndart2js-minified-faststartup-csp-linux-chrome",
-            "--dart2js-batch",
-            "--reset-browser-configuration"
-          ],
-          "tests": ["dart2js_extra","dart2js_native"]
+            "dart2js_extra",
+            "dart2js_native"
+          ]
         }
       ]
     },
@@ -1261,13 +1216,17 @@
       "steps": [
         {
           "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["--arch=ia32,x64", "create_sdk" ]
+          "script": "tools/bots/dart_sdk.py",
+          "arguments": [],
+          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-linux"}
+
         },
         {
-          "name": "generate API docs",
+          "name": "build api docs",
           "script": "tools/bots/dart_sdk.py",
-          "arguments": [ "api_docs" ]
+          "arguments": [ "api_docs" ],
+          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-linux"}
+
         }
       ]
     },
@@ -1279,8 +1238,10 @@
       "steps": [
         {
           "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["--arch=ia32,x64", "create_sdk" ]
+          "script": "tools/bots/dart_sdk.py",
+          "arguments": [],
+          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-mac"}
+
         }
       ]
     },
@@ -1292,8 +1253,10 @@
       "steps": [
         {
           "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["--arch=ia32,x64", "create_sdk" ]
+          "script": "tools/bots/dart_sdk.py",
+          "arguments": [],
+          "environment": {"BUILDBOT_BUILDERNAME": "dart-sdk-win"}
+
         }
       ]
     },
@@ -1301,7 +1264,11 @@
       "builders": [
         "analyzer-linux-release",
         "analyzer-mac-release",
-        "analyzer-win-release"
+        "analyzer-win-release",
+        "analyzer-linux-release-analyzer",
+        "analyzer-linux-release-analyzer-new",
+        "analyzer-mac-release-analyzer",
+        "analyzer-win-release-analyzer"
       ],
       "meta": {
         "description": "This configuration is used by the analyzer builders."
@@ -1315,7 +1282,7 @@
         {
           "name": "analyzer unit tests",
           "arguments": [
-            "-nunittest-asserts-${system}",
+            "-nunittest-asserts-${mode}-${system}",
             "pkg/analyzer"
           ],
           "shards": 2,
@@ -1324,7 +1291,7 @@
         {
           "name": "analysis_server unit tests",
           "arguments": [
-            "-nunittest-asserts-${system}",
+            "-nunittest-asserts-${mode}-${system}",
             "pkg/analysis_server"
           ],
           "shards": 2,
@@ -1345,14 +1312,14 @@
         {
           "name": "analyzer_cli unit tests",
           "arguments": [
-            "-nunittest-asserts-${system}",
+            "-nunittest-asserts-${mode}-${system}",
             "pkg/analyzer_cli"
           ]
         },
         {
           "name": "analyzer_plugin unit tests",
           "arguments": [
-            "-nunittest-asserts-${system}",
+            "-nunittest-asserts-${mode}-${system}",
             "pkg/analyzer_plugin"
           ]
         },
@@ -1366,7 +1333,10 @@
       ]
     },
     {
-      "builders": ["analyzer-analysis-server-linux"],
+      "builders": [
+        "analyzer-analysis-server-linux",
+        "analyzer-analysis-server-linux-analyzer"
+      ],
       "meta": {
         "description": "Analyze analyzer related packages."
       },
@@ -1463,11 +1433,6 @@
           "arguments": ["--fatal-warnings", "pkg/meta"]
         },
         {
-          "name": "analyze pkg/microlytics",
-          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": ["--fatal-warnings", "pkg/microlytics"]
-        },
-        {
           "name": "analyze pkg/smith",
           "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
           "arguments": ["--fatal-warnings", "pkg/smith"]
@@ -1532,79 +1497,11 @@
       ]
     },
     {
-      "builders": ["analyzer-use-fasta-parser-linux"],
-      "meta": {
-        "description": "Run the analyzer using the Fasta parser."
-      },
-      "steps": [
-        {
-          "name": "build dart",
-          "script": "tools/build.py",
-          "arguments": ["create_sdk"]
-        },
-        {
-          "name": "analyze pkg/analyzer --use-fasta-parser",
-          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": [
-            "--use-fasta-parser",
-            "pkg/analyzer"
-          ]
-        },
-        {
-          "name": "analyze pkg/analyzer --no-use-fasta-parser",
-          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": [
-            "--no-use-fasta-parser",
-            "pkg/analyzer"
-          ]
-        },
-        {
-          "name": "analyze pkg/analyzer_cli --use-fasta-parser",
-          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": [
-            "--use-fasta-parser",
-            "pkg/analyzer_cli"
-          ]
-        },
-        {
-          "name": "run language2 tests",
-          "arguments": [
-            "-nanalyzer-fasta_parser-linux",
-            "language_2"
-          ]
-        },
-        {
-          "name": "analyze pkg/analyzer_cli --no-use-fasta-parser",
-          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": [
-            "--no-use-fasta-parser",
-            "pkg/analyzer_cli"
-          ]
-        },
-        {
-          "name": "analyze pkg/analysis_server --use-fasta-parser",
-          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": [
-            "--use-fasta-parser",
-            "pkg/analysis_server"
-          ]
-        },
-        {
-          "name": "analyze pkg/analysis_server --no-use-fasta-parser",
-          "script": "out/ReleaseX64/dart-sdk/bin/dartanalyzer",
-          "arguments": [
-            "--no-use-fasta-parser",
-            "pkg/analysis_server"
-          ]
-        }
-      ]
-    },
-    {
       "builders": ["pkg-linux-release",
                    "pkg-win-release",
                    "pkg-mac-release"],
       "meta": {
-        "description": "This configuration is used by the pkg builders."
+        "description": "This configuration is used by the release pkg builders."
       },
       "steps": [
         {
@@ -1615,18 +1512,57 @@
         {
           "name": "package unit tests",
           "arguments": [
-            "-nunittest-asserts-${system}"],
-          "tests": ["pkg"]
+            "-nunittest-asserts-${mode}-${system}",
+            "pkg"
+          ]
         },
         {
           "name": "third_party pkg_tested unit tests",
           "arguments": [
-            "-nunittest-asserts-${system}"],
-          "tests": ["pkg_tested"]
+            "-nunittest-asserts-${mode}-${system}",
+            "pkg_tested"
+          ]
         },
         {
           "name": "pub integration tests",
-          "script": "tools/bots/pub_integration_test.py"
+          "script": "tools/bots/pub_integration_test.py",
+          "arguments": [
+            "--mode=release"
+          ]
+        }
+      ]
+    },
+    {
+      "builders": ["pkg-linux-debug"],
+      "meta": {
+        "description": "This configuration is used by the debug pkg builders."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["create_sdk"]
+        },
+        {
+          "name": "package unit tests",
+          "arguments": [
+            "-nunittest-asserts-${mode}-${system}",
+            "pkg"
+          ]
+        },
+        {
+          "name": "third_party pkg_tested unit tests",
+          "arguments": [
+            "-nunittest-asserts-${mode}-${system}",
+            "pkg_tested"
+          ]
+        },
+        {
+          "name": "pub integration tests",
+          "script": "tools/bots/pub_integration_test.py",
+          "arguments": [
+            "--mode=debug"
+          ]
         }
       ]
     },
@@ -1726,9 +1662,11 @@
             "--isolates",
             "8",
             "--no-show-stats",
-            "--repeat",
-            "125"
-          ]
+            "--time",
+            "2700"
+          ],
+          "shards": 100,
+          "fileset": "fuzzer"
         }
       ]
     }
diff --git a/tools/bots/update_flakiness.dart b/tools/bots/update_flakiness.dart
index 89347f3..c1572e7 100755
--- a/tools/bots/update_flakiness.dart
+++ b/tools/bots/update_flakiness.dart
@@ -17,6 +17,9 @@
   parser.addFlag('help', help: 'Show the program usage.', negatable: false);
   parser.addOption('input', abbr: 'i', help: "Input flakiness file.");
   parser.addOption('output', abbr: 'o', help: "Output flakiness file.");
+  parser.addOption('build-id', help: "Logdog ID of this buildbot run");
+  parser.addOption('commit', help: "Commit hash of this buildbot run");
+
   final options = parser.parse(args);
   if (options["help"]) {
     print("""
@@ -38,15 +41,44 @@
   // Incrementally update the flakiness data with each observed result.
   for (final path in parameters) {
     final results = await loadResults(path);
-    for (final result in results) {
-      final String name = result["name"];
-      final Map<String, dynamic> testData =
-          data.putIfAbsent(name, () => <String, dynamic>{});
+    for (final resultObject in results) {
+      final String configuration = resultObject["configuration"];
+      final String name = resultObject["name"];
+      final String result = resultObject["result"];
+      final key = "$configuration:$name";
+      newMap() => <String, dynamic>{};
+      final Map<String, dynamic> testData = data.putIfAbsent(key, newMap);
+      testData["configuration"] = configuration;
       testData["name"] = name;
       final outcomes = testData.putIfAbsent("outcomes", () => []);
-      if (!outcomes.contains(result["result"])) {
-        outcomes.add(result["result"]);
-        outcomes..sort();
+      final time = DateTime.now().toIso8601String();
+      if (!outcomes.contains(result)) {
+        outcomes
+          ..add(result)
+          ..sort();
+        testData["last_new_result_seen"] = time;
+      }
+      if (testData["current"] == result) {
+        testData["current_counter"]++;
+      } else {
+        testData["current"] = result;
+        testData["current_counter"] = 1;
+      }
+      final occurrences = testData.putIfAbsent("occurrences", newMap);
+      occurrences.putIfAbsent(result, () => 0);
+      occurrences[result]++;
+      final firstSeen = testData.putIfAbsent("first_seen", newMap);
+      firstSeen.putIfAbsent(result, () => time);
+      final lastSeen = testData.putIfAbsent("last_seen", newMap);
+      lastSeen[result] = time;
+
+      if (options["build-id"] != null) {
+        final buildIds = testData.putIfAbsent("build_ids", newMap);
+        buildIds[result] = options["build-id"];
+      }
+      if (options["commit"] != null) {
+        final commits = testData.putIfAbsent("commits", newMap);
+        commits[result] = options["commit"];
       }
     }
   }
@@ -56,10 +88,16 @@
   final sink = options["output"] != null
       ? new File(options["output"]).openWrite()
       : stdout;
-  final names = new List<String>.from(data.keys)..sort();
-  for (final name in names) {
-    final testData = data[name];
+  final keys = new List<String>.from(data.keys)..sort();
+  for (final key in keys) {
+    final testData = data[key];
     if (testData["outcomes"].length < 2) continue;
+    // Forgive tests that have become deterministic again. If they flake less
+    // than once in a 100 (p<1%), then if they flake again, the probability of
+    // them getting past 5 runs of deflaking is 1%^5 = 0.00000001%.
+    if (100 <= testData["current_counter"]) {
+      continue;
+    }
     sink.writeln(jsonEncode(testData));
   }
 }
diff --git a/tools/build.py b/tools/build.py
index 9c72266..237c486 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -16,6 +16,10 @@
 HOST_CPUS = utils.GuessCpus()
 SCRIPT_DIR = os.path.dirname(sys.argv[0])
 DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
+AVAILABLE_ARCHS = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6',
+    'simarmv5te', 'armv5te', 'simarm64', 'arm64',
+    'simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64']
+
 
 usage = """\
 usage: %%prog [options] [targets]
@@ -28,8 +32,7 @@
   result = optparse.OptionParser(usage=usage)
   result.add_option("-a", "--arch",
       help='Target architectures (comma-separated).',
-      metavar='[all,ia32,x64,simarm,arm,simarmv6,armv6,simarmv5te,armv5te,'
-              'simarm64,arm64,simdbc,armsimdbc]',
+      metavar='[all,' + ','.join(AVAILABLE_ARCHS) + ']',
       default=utils.GuessArchitecture())
   result.add_option("-b", "--bytecode",
       help='Build with the kernel bytecode interpreter. DEPRECATED.',
@@ -82,10 +85,7 @@
       print "Unknown mode %s" % mode
       return False
   for arch in options.arch:
-    archs = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6',
-             'simarmv5te', 'armv5te', 'simarm64', 'arm64',
-             'simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64']
-    if not arch in archs:
+    if not arch in AVAILABLE_ARCHS:
       print "Unknown arch %s" % arch
       return False
   options.os = [ProcessOsOption(os_name) for os_name in options.os]
diff --git a/tools/buildtools/README.md b/tools/buildtools/README.md
index 8cd1cfb..7d79285 100644
--- a/tools/buildtools/README.md
+++ b/tools/buildtools/README.md
@@ -1,7 +1,7 @@
 To build Dart for Mac and Linux, we pull Fuchsia's buildtools, which is also
-used by Flutter. Fuchsia's buildtools includes gn, ninja, and the clang
-toolchain. Fuchsia buildtools vends clang-format as part of the clang toolchain.
-Since Fuchsia's buildtools doesn't vend a clang toolchain for Windows, we can't
+used by Flutter. Fuchsia's buildtools includes gn, and the clang toolchain.
+Fuchsia buildtools vends clang-format as part of the clang toolchain. Since
+Fuchsia's buildtools doesn't vend a clang toolchain for Windows, we can't
 get a Windows clang-format binary from it. Therefore, from Chromium's buildtools
 here:
 
diff --git a/tools/buildtools/update.py b/tools/buildtools/update.py
index 1b38f4b..936e729 100755
--- a/tools/buildtools/update.py
+++ b/tools/buildtools/update.py
@@ -5,10 +5,10 @@
 
 """Pulls down tools required to build Dart."""
 
+import errno
 import os
 import platform
 import subprocess
-import shutil
 import sys
 
 THIS_DIR = os.path.abspath(os.path.dirname(__file__))
@@ -22,34 +22,6 @@
 DEPOT_PATH = find_depot_tools.add_depot_tools_to_path()
 
 
-def Update():
-  path = os.path.join(BUILDTOOLS, 'update.sh')
-  command = ['/bin/bash', path, '--clang', '--gn']
-  return subprocess.call(command, cwd=DART_ROOT)
-
-
-def UpdateGNOnWindows():
-  sha1_file = os.path.join(TOOLS_BUILDTOOLS, 'win', 'gn.exe.sha1')
-  output_dir = os.path.join(BUILDTOOLS, 'win', 'gn.exe')
-  downloader_script = os.path.join(
-      DEPOT_PATH, 'download_from_google_storage.py')
-  download_cmd = [
-    'python',
-    downloader_script,
-    '--no_auth',
-    '--no_resume',
-    '--quiet',
-    '--platform=win*',
-    '--bucket',
-    'chromium-gn',
-    '-s',
-    sha1_file,
-    '-o',
-    output_dir
-  ]
-  return subprocess.call(download_cmd)
-
-
 def UpdateClangFormatOnWindows():
   sha1_file = os.path.join(TOOLS_BUILDTOOLS, 'win', 'clang-format.exe.sha1')
   output_dir = os.path.join(BUILDTOOLS, 'win', 'clang-format.exe')
@@ -72,9 +44,20 @@
   return subprocess.call(download_cmd)
 
 
-# On Mac and Linux we copy clang-format and gn to the place where git cl format
-# expects them to be.
-def CopyClangFormat():
+def CreateSymlink(symlink, link_name):
+  try:
+    os.symlink(symlink, link_name)
+  except OSError, e:
+    if e.errno == errno.EEXIST:
+      os.remove(link_name)
+      os.symlink(symlink, link_name)
+    else:
+      raise e
+
+
+# On Mac and Linux we symlink clang-format and gn to the place where
+# 'git cl format' expects them to be.
+def LinksForGitCLFormat():
   if sys.platform == 'darwin':
     platform = 'darwin'
     tools = 'mac'
@@ -89,14 +72,14 @@
 
   clang_format = os.path.join(
       BUILDTOOLS, toolchain, 'clang', 'bin', 'clang-format')
-  gn = os.path.join(BUILDTOOLS, toolchain, 'gn')
+  gn = os.path.join(BUILDTOOLS, 'gn')
   dest_dir = os.path.join(BUILDTOOLS, tools)
   if not os.path.exists(dest_dir):
     os.makedirs(dest_dir)
   clang_format_dest = os.path.join(dest_dir, 'clang-format')
   gn_dest = os.path.join(dest_dir, 'gn')
-  shutil.copy2(clang_format, clang_format_dest)
-  shutil.copy2(gn, gn_dest)
+  CreateSymlink(clang_format, clang_format_dest)
+  CreateSymlink(gn, gn_dest)
   return 0
 
 
@@ -107,15 +90,8 @@
     print('Not downloading buildtools binaries for ' + arch_id)
     return 0
   if sys.platform.startswith('win'):
-    result = UpdateGNOnWindows()
-    if result != 0:
-      return result
-    # TODO(zra): Re-enable clang-format download when gs is fixed for the bots.
-    # return UpdateClangFormatOnWindows()
-    return 0
-  if Update() != 0:
-    return 1
-  return CopyClangFormat()
+    return UpdateClangFormatOnWindows()
+  return LinksForGitCLFormat()
 
 
 if __name__ == '__main__':
diff --git a/tools/capture_screenshot.ps1 b/tools/capture_screenshot.ps1
deleted file mode 100644
index 322f9af..0000000
--- a/tools/capture_screenshot.ps1
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-[Reflection.Assembly]::LoadWithPartialName("System.Drawing")
-function screenshot([Drawing.Rectangle]$bounds, $path) {
-   $bmp = New-Object Drawing.Bitmap $bounds.width, $bounds.height
-   $graphics = [Drawing.Graphics]::FromImage($bmp)
-
-   $graphics.CopyFromScreen(
-       $bounds.Location, [Drawing.Point]::Empty, $bounds.size)
-
-   $bmp.Save($path)
-
-   $graphics.Dispose()
-   $bmp.Dispose()
-}
-
-$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, 2000, 4000)
-screenshot $bounds $args[0]
diff --git a/tools/create_pkg_manifest.py b/tools/create_pkg_manifest.py
index dd0c6d8..c49eac8 100755
--- a/tools/create_pkg_manifest.py
+++ b/tools/create_pkg_manifest.py
@@ -21,6 +21,11 @@
 
 # Used in parsing the DEPS file.
 class VarImpl(object):
+  _env_vars = {
+    "host_cpu": "x64",
+    "host_os": "linux",
+  }
+
   def __init__(self, local_scope):
     self._local_scope = local_scope
 
@@ -28,6 +33,9 @@
     """Implements the Var syntax."""
     if var_name in self._local_scope.get("vars", {}):
       return self._local_scope["vars"][var_name]
+    # Inject default values for env variables
+    if var_name in self._env_vars:
+      return self._env_vars[var_name]
     raise Exception("Var is not defined: %s" % var_name)
 
 
diff --git a/tools/dom/docs/docs.json b/tools/dom/docs/docs.json
index 8e2ba96..7055e99 100644
--- a/tools/dom/docs/docs.json
+++ b/tools/dom/docs/docs.json
@@ -1245,8 +1245,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [scrollByLines](http://docs.webplatform.org/wiki/dom/methods/scrollByLines)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.scrollByLines](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollByLines)",
+          "   *   from MDN.",
           "   */"
         ],
         "scrollByPages": [
@@ -1255,7 +1255,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [scrollByPages](http://docs.webplatform.org/wiki/dom/methods/scrollByPages) from WebPlatform.org.",
+          "   * * [Window.scrollByPages](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollByPages)",
+          "   *   from MDN.",
           "   */"
         ],
         "scrollEvent": [
@@ -1425,9 +1426,9 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [Using the fullscreen",
-          "   *   API](http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)",
-          "   *   tutorial from WebPlatform.org.",
+          "   * * [Fullscreen",
+          "   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)",
+          "   *   from MDN.",
           "   * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.",
           "   */"
         ],
@@ -3404,8 +3405,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [innerHeight](http://docs.webplatform.org/wiki/css/cssom/properties/innerHeight)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.innerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window/innerHeight)",
+          "   *   from MDN.",
           "   */"
         ],
         "innerWidth": [
@@ -3414,8 +3415,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [innerWidth](http://docs.webplatform.org/wiki/css/cssom/properties/innerWidth)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.innerWidth](https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth)",
+          "   *   from MDN.",
           "   */"
         ],
         "localStorage": [
@@ -3494,8 +3495,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [Window name](http://docs.webplatform.org/wiki/html/attributes/name_(window))",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.name](https://developer.mozilla.org/en-US/docs/Web/API/Window/name)",
+          "   *   from MDN.",
           "   */"
         ],
         "navigator": [
@@ -3523,7 +3524,7 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [offscreenBuffering](http://docs.webplatform.org/wiki/dom/properties/offscreenBuffering)",
+          "   * * [offscreenBuffering](https://webplatform.github.io/docs/dom/HTMLElement/offscreenBuffering/)",
           "   *   from WebPlatform.org.",
           "   */"
         ],
@@ -3709,8 +3710,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [outerHeight](http://docs.webplatform.org/wiki/css/cssom/properties/outerHeight)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.outerHeight](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerHeight)",
+          "   *   from MDN.",
           "   */"
         ],
         "outerWidth": [
@@ -3719,8 +3720,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [outerWidth](http://docs.webplatform.org/wiki/css/cssom/properties/outerWidth)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.outerWidth](https://developer.mozilla.org/en-US/docs/Web/API/Window/outerWidth)",
+          "   *   from MDN.",
           "   */"
         ],
         "pagehideEvent": [
@@ -3820,8 +3821,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [Window resizeBy](http://docs.webplatform.org/wiki/dom/methods/resizeBy)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.resizeBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/resizeBy)",
+          "   *   from MDN.",
           "   */"
         ],
         "resizeEvent": [
@@ -3838,8 +3839,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [Window resizeTo](http://docs.webplatform.org/wiki/dom/methods/resizeTo)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.resizeTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/resizeTo)",
+          "   *   from MDN.",
           "   */"
         ],
         "screen": [
@@ -3901,8 +3902,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [Window scroll](http://docs.webplatform.org/wiki/dom/methods/scroll)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll)",
+          "   *   from MDN.",
           "   */"
         ],
         "scrollbars": [
@@ -3922,8 +3923,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [Window scrollBy](http://docs.webplatform.org/wiki/dom/methods/scrollBy)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy)",
+          "   *   from MDN.",
           "   */"
         ],
         "scrollTo": [
@@ -3934,8 +3935,8 @@
           "   *",
           "   * ## Other resources",
           "   *",
-          "   * * [Window scrollTo](http://docs.webplatform.org/wiki/dom/methods/scrollTo)",
-          "   *   from WebPlatform.org.",
+          "   * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo)",
+          "   *   from MDN.",
           "   */"
         ],
         "self": [
@@ -4211,7 +4212,7 @@
           "   * response.",
           "   *",
           "   * This value must be set before the request has been sent. See also the list",
-          "   * of [IANA Official MIME types](https://www.iana.org/assignments/media-types/media-types.xhtml)",
+          "   * of [IANA Official MIME types](https://www.iana.org/assignments/media-types/media-types.xhtml).",
           "   */"
         ],
         "readyState": [
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 071dc8f..a63e560 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -7478,7 +7478,7 @@
         "comment": "http://dev.w3.org/csswg/cssom-view/#widl-Element-scrollIntoView-void-boolean-top"
       },
       "scrollIntoViewIfNeeded": {
-        "comment": "http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded",
+        "comment": "https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoViewIfNeeded",
         "support_level": "nonstandard"
       },
       "scrollLeft": {},
@@ -31541,4 +31541,4 @@
     },
     "support_level": "nonstandard"
   }
-}
\ No newline at end of file
+}
diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
index 9ca2cf9..1732c71 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -31,7 +31,8 @@
    *
    * See also:
    *
-   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   * * [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)
+   *   from MDN.
    */
   Stream<T> forTarget(EventTarget e, {bool useCapture: false}) =>
       new _EventStream<T>(e, _eventType, useCapture);
@@ -55,7 +56,8 @@
    *
    * See also:
    *
-   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   * * [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)
+   *   from MDN.
    */
   ElementStream<T> forElement(Element e, {bool useCapture: false}) {
     return new _ElementEventStreamImpl<T>(e, _eventType, useCapture);
@@ -73,7 +75,8 @@
    *
    * See also:
    *
-   * [addEventListener](http://docs.webplatform.org/wiki/dom/methods/addEventListener)
+   * * [EventTarget.addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)
+   *   from MDN.
    */
   ElementStream<T> _forElementList(ElementList<Element> e,
       {bool useCapture: false}) {
diff --git a/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate b/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
index e64c887..706bc06 100644
--- a/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
@@ -75,8 +75,8 @@
  * check out
  * [Use IndexedDB](http://www.dartlang.org/docs/tutorials/indexeddb/).
  *
- * [IndexedDB reference](http://docs.webplatform.org/wiki/apis/indexeddb)
- * provides wiki-style docs about indexedDB
+ * MDN provides [API
+ * documentation](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API).
  *
  * {@category Web}
  */
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 0b740f3..35bd16f 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -677,8 +677,10 @@
    *
    * See also:
    *
-   * * [CSS Inheritance and Cascade](http://docs.webplatform.org/wiki/tutorials/inheritance_and_cascade)
-   * * [Pseudo-elements](http://docs.webplatform.org/wiki/css/selectors/pseudo-elements)
+   * * [Cascade and Inheritance](https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Cascade_and_inheritance)
+   *   from MDN.
+   * * [Pseudo-elements](https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements)
+   *   from MDN.
    */
   CssStyleDeclaration getComputedStyle([String pseudoElement]) {
     if (pseudoElement == null) {
@@ -859,8 +861,10 @@
    *
    * See also:
    *
-   * * [scrollIntoView](http://docs.webplatform.org/wiki/dom/methods/scrollIntoView)
-   * * [scrollIntoViewIfNeeded](http://docs.webplatform.org/wiki/dom/methods/scrollIntoViewIfNeeded)
+   * * [scrollIntoView](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView)
+   *   from MDN.
+   * * [scrollIntoViewIfNeeded](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoViewIfNeeded)
+   *   from MDN.
    */
   void scrollIntoView([ScrollAlignment alignment]) {
     var hasScrollIntoViewIfNeeded = true;
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 6ad09ec..5c9f937 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -49,9 +49,9 @@
    *
    * ## Other resources
    *
-   * * [Using the fullscreen
-   *   API](http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
-   *   from WebPlatform.org.
+   * * [Fullscreen
+   *   API](https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API)
+   *   from MDN.
    * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
    */
   @SupportedBrowser(SupportedBrowser.CHROME)
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index 6575f86..59d3c33 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -54,8 +54,6 @@
    *
    * * [Window.open](https://developer.mozilla.org/en-US/docs/Web/API/Window.open)
    *   from MDN.
-   * * [Window open](http://docs.webplatform.org/wiki/dom/methods/open)
-   *   from WebPlatform.org.
    */
   WindowBase open(String url, String name, [String options]) {
     if (options == null) {
diff --git a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
index 97b141a..c15f496 100644
--- a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
+++ b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
@@ -56,9 +56,6 @@
   /**
    * Creates a GET request for the specified [url].
    *
-   * The server response must be a `text/` mime type for this request to
-   * succeed.
-   *
    * This is similar to [request] but specialized for HTTP GET requests which
    * return text content.
    *
@@ -69,7 +66,7 @@
    *     var name = Uri.encodeQueryComponent('John');
    *     var id = Uri.encodeQueryComponent('42');
    *     HttpRequest.getString('users.json?name=$name&id=$id')
-   *       .then((HttpRequest resp) {
+   *       .then((String resp) {
    *         // Do something with the response.
    *     });
    *
@@ -86,8 +83,8 @@
   /**
    * Makes a server POST request with the specified data encoded as form data.
    *
-   * This is roughly the POST equivalent of getString. This method is similar
-   * to sending a FormData object with broader browser support but limited to
+   * This is roughly the POST equivalent of [getString]. This method is similar
+   * to sending a [FormData] object with broader browser support but limited to
    * String values.
    *
    * If [data] is supplied, the key/value pairs are URI encoded with
@@ -369,11 +366,11 @@
    * Specify the desired `url`, and `method` to use in making the request.
    *
    * By default the request is done asyncronously, with no user or password
-   * authentication information. If `async` is false, the request will be send
+   * authentication information. If `async` is false, the request will be sent
    * synchronously.
    *
    * Calling `open` again on a currently active request is equivalent to
-   * calling `abort`.
+   * calling [abort].
    *
    * Note: Most simple HTTP requests can be accomplished using the [getString],
    * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
diff --git a/tools/generate_idefiles.py b/tools/generate_idefiles.py
new file mode 100755
index 0000000..900c25c
--- /dev/null
+++ b/tools/generate_idefiles.py
@@ -0,0 +1,149 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+"""Script to generate configuration files for analysis servers of C++ and Dart.
+
+It generates compile_commands.json for C++ clang and intellij and
+analysis_options.yaml for the Dart analyzer.
+"""
+
+import argparse
+import json
+import os
+import subprocess
+import sys
+
+import generate_buildfiles
+import utils
+
+HOST_OS = utils.GuessOS()
+
+
+def GenerateIdeFiles(options):
+  GenerateCompileCommands(options)
+  GenerateAnalysisOptions(options)
+
+
+def GenerateCompileCommands(options):
+  """Generate compile_commands.json for the C++ analysis servers.
+
+  compile_commands.json is used by the c++ clang and intellij language analysis
+  servers used in IDEs such as Visual Studio Code and Emacs.
+
+  Args:
+    options: supported options include: verbose, force, dir
+
+  Returns:
+    success (0) or failure (non zero)
+  """
+
+  fname = os.path.join(options.dir, "compile_commands.json")
+
+  if os.path.isfile(fname) and not options.force:
+    print fname + " already exists, use --force to override"
+    return
+
+  gn_result = generate_buildfiles.RunGn(options)
+  if gn_result != 0:
+    return gn_result
+
+  out_folder = utils.GetBuildRoot(HOST_OS, mode="debug", arch=options.arch)
+
+  if not os.path.isdir(out_folder):
+    return 1
+
+  command_set = json.loads(
+      subprocess.check_output(
+          ["ninja", "-C", out_folder, "-t", "compdb", "cxx", "cc", "h"]))
+
+  commands = []
+  for obj in command_set:
+    command = obj["command"]
+
+    # Skip precompiled mode, a lot of code is commented out in precompiled mode
+    if "-DDART_PRECOMPILED_RUNTIME" in command:
+      continue
+
+    # Remove warnings
+    command = command.replace("-Werror", "")
+
+    obj["command"] = command
+    commands += [obj]
+
+  with open(fname, "w") as f:
+    json.dump(commands, f, indent=4)
+
+  return 0
+
+
+def GenerateAnalysisOptions(options):
+  """Generate analysis_optioms.yaml for the Dart analyzer.
+
+  To prevent dartanalyzer from tripping on the non-Dart files when it is
+  started from the root dart-sdk directory.
+  https://github.com/Dart-Code/Dart-Code/issues/1295
+
+  Args:
+    options: supported options include: force, dir
+  """
+  contents = """analyzer:
+  exclude:
+    - docs/newsletter/20171103/**
+    - out/**
+    - runtime/**
+    - samples-dev/swarm/**
+    - sdk/lib/**
+    - tests/**
+    - third_party/observatory_pub_packages/**
+    - third_party/pkg/**
+    - third_party/pkg_tested/dart_style/**
+    - third_party/tcmalloc/**
+    - tools/apps/update_homebrew/**
+    - tools/dart2js/**
+    - tools/dom/**
+    - tools/sdks/dart-sdk/lib/**
+    - tools/status_clean.dart
+    - xcodebuild / **"""
+
+  fname = os.path.join(options.dir, "analysis_options.yaml")
+
+  if os.path.isfile(fname) and not options.force:
+    print fname + " already exists, use --force to override"
+    return
+
+  with open(fname, "w") as f:
+    f.write(contents)
+
+
+def main(argv):
+  parser = argparse.ArgumentParser(
+      description="Python script to generate compile_commands.json and "
+      "analysis_options.yaml which are used by the analysis servers for "
+      "c++ and Dart.")
+
+  parser.add_argument("-v", "--verbose",
+                      help="Verbose output.",
+                      action="store_true")
+
+  parser.add_argument("-f", "--force",
+                      help="Override files.",
+                      action="store_true")
+
+  parser.add_argument("-d", "--dir",
+                      help="Target directory.",
+                      default=utils.DART_DIR)
+
+  parser.add_argument("-a", "--arch",
+                      help="Target architecture for runtime sources.",
+                      default="x64")
+
+  options = parser.parse_args(argv[1:])
+
+  return GenerateIdeFiles(options)
+
+
+if __name__ == "__main__":
+  sys.exit(main(sys.argv))
diff --git a/tools/gn.py b/tools/gn.py
index 9b34862..bc05a61 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -496,16 +496,11 @@
   starttime = time.time()
   args = parse_args(argv)
 
-  if sys.platform.startswith(('cygwin', 'win')):
-    subdir = 'win'
-  elif sys.platform == 'darwin':
-    subdir = 'mac-x64'
-  elif sys.platform.startswith('linux'):
-    subdir = 'linux-x64'
-  else:
-    print 'Unknown platform: ' + sys.platform
+  gn = os.path.join(DART_ROOT, 'buildtools',
+      'gn.exe' if utils.IsWindows() else 'gn')
+  if not os.path.isfile(gn):
+    print "Couldn't find the gn binary at path: " + gn
     return 1
-  gn = os.path.join(DART_ROOT, 'buildtools', subdir, 'gn')
 
   commands = []
   for target_os in args.os:
diff --git a/tools/linux_dist_support/debian/control b/tools/linux_dist_support/debian/control
index b484bd2..04484ab 100644
--- a/tools/linux_dist_support/debian/control
+++ b/tools/linux_dist_support/debian/control
@@ -1,5 +1,5 @@
 Source: dart
-Maintainer: Soren Gjesse <sgjesse@google.com>
+Maintainer: William Hesse <whesse@google.com>
 Section: misc
 Priority: optional
 Standards-Version: 3.9.2
@@ -7,6 +7,6 @@
 	python,
 
 Package: dart
-Architecture: amd64 i386 armhf armel
+Architecture: amd64
 Depends: ${shlibs:Depends}, ${misc:Depends}
 Description: Dart SDK
diff --git a/tools/patches/flutter-engine/apply.sh b/tools/patches/flutter-engine/apply.sh
index e2ac1df..b449af1 100755
--- a/tools/patches/flutter-engine/apply.sh
+++ b/tools/patches/flutter-engine/apply.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/usr/bin/env bash
 #
 # Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
@@ -32,11 +32,55 @@
   (cd flutter && git apply ../$patch)
   need_runhooks=true
 fi
+
 patch=src/third_party/dart/tools/patches/flutter-engine/${pinned_dart_sdk}.patch
 if [ -e "$patch" ]; then
   (cd src/flutter && git apply ../../$patch)
   need_runhooks=true
 fi
+
 if [ $need_runhooks = true ]; then
+  # Check if .gclient configuration specifies a cache_dir. Local caches are used
+  # by bots to reduce amount of Git traffic. .gclient configuration file
+  # is a well-formed Python source so use Python load_source to parse it.
+  # If cache_dir is specified then we need to force update the git cache,
+  # otherwise git fetch below might fail to find tags and commits we are
+  # referencing.
+  # Normally gclient sync would update the cache - but we are bypassing
+  # it here.
+  git_cache=$(python -c 'import imp; config = imp.load_source("config", ".gclient"); print getattr(config, "cache_dir", "")')
+
+  # DEPS file might have been patched with new version of packages that
+  # Dart SDK depends on. Get information about dependencies from the
+  # DEPS file and forcefully update checkouts of those dependencies.
+  gclient revinfo | grep 'src/third_party/dart/' | while read -r line; do
+    # revinfo would produce lines in the following format:
+    #     path: git-url@tag-or-hash
+    # Where no spaces occur inside path, git-url or tag-or-hash.
+    # To extract path and tag-or-hash we replace ': ' and '@' with ' '
+    # and then create array from the resulting string which splits it
+    # by whitespace.
+    line="${line/: / }"
+    line="${line/@/ }"
+    line=(${line})
+    dependency_path=${line[0]}
+    dependency_tag_or_hash=${line[2]}
+
+    # Inside dependency compare HEAD to specified tag-or-hash by rev-parse'ing
+    # them and comparing resulting hashes.
+    # Note: tag^0 forces rev-parse to return commit hash rather then the hash of
+    # the tag object itself.
+    pushd ${dependency_path} > /dev/null
+    if [ $(git rev-parse HEAD) != $(git rev-parse ${dependency_tag_or_hash}^0) ]; then
+      echo "${dependency_path} requires update to match DEPS file"
+      if [ "$git_cache" != "" ]; then
+        echo "--- Forcing update of the git_cache ${git_cache}"
+        git cache fetch -c ${git_cache} --all -v
+      fi
+      git fetch origin
+      git checkout ${dependency_tag_or_hash}
+    fi
+    popd > /dev/null
+  done
   gclient runhooks
 fi
diff --git a/tools/patches/flutter-engine/d1817ddc91fd3aea061647b2e21860c47a5a5180.flutter.patch b/tools/patches/flutter-engine/d1817ddc91fd3aea061647b2e21860c47a5a5180.flutter.patch
new file mode 100644
index 0000000..c4dca25
--- /dev/null
+++ b/tools/patches/flutter-engine/d1817ddc91fd3aea061647b2e21860c47a5a5180.flutter.patch
@@ -0,0 +1,13 @@
+diff --git a/analysis_options.yaml b/analysis_options.yaml
+index 68eea153ee0..65056568003 100644
+--- a/analysis_options.yaml
++++ b/analysis_options.yaml
+@@ -28,6 +28,8 @@ analyzer:
+     missing_return: warning
+     # allow having TODOs in the code
+     todo: ignore
++    #
++    sdk_version_async_exported_from_core: ignore
+   exclude:
+     - 'bin/cache/**'
+     # the following two are relative to the stocks example and the flutter package respectively
diff --git a/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.flutter.patch b/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.flutter.patch
new file mode 100644
index 0000000..eeb725b
--- /dev/null
+++ b/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.flutter.patch
@@ -0,0 +1,52 @@
+diff --git a/dev/devicelab/pubspec.yaml b/dev/devicelab/pubspec.yaml
+index 9dee6de4a..806398855 100644
+--- a/dev/devicelab/pubspec.yaml
++++ b/dev/devicelab/pubspec.yaml
+@@ -5,7 +5,7 @@ homepage: https://github.com/flutter/flutter
+
+ environment:
+   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
+-  sdk: ">=2.0.0-dev.68.0 <3.0.0"
++  sdk: ">=2.1.0-dev.5.0 <3.0.0"
+
+ dependencies:
+   args: 1.5.1
+diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml
+index 81564e6a2..9f85ed7ab 100644
+--- a/packages/flutter/pubspec.yaml
++++ b/packages/flutter/pubspec.yaml
+@@ -5,7 +5,7 @@ homepage: http://flutter.io
+
+ environment:
+   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
+-  sdk: ">=2.0.0-dev.68.0 <3.0.0"
++  sdk: ">=2.1.0-dev.5.0 <3.0.0"
+
+ dependencies:
+   # To update these, use "flutter update-packages --force-upgrade".
+diff --git a/packages/flutter_test/pubspec.yaml b/packages/flutter_test/pubspec.yaml
+index aa930cbdf..531d24b71 100644
+--- a/packages/flutter_test/pubspec.yaml
++++ b/packages/flutter_test/pubspec.yaml
+@@ -2,7 +2,7 @@ name: flutter_test
+
+ environment:
+   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
+-  sdk: ">=2.0.0-dev.68.0 <3.0.0"
++  sdk: ">=2.1.0-dev.5.0 <3.0.0"
+
+ dependencies:
+   # To update these, use "flutter update-packages --force-upgrade".
+diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml
+index 5f89d0f18..a869162b0 100644
+--- a/packages/flutter_tools/pubspec.yaml
++++ b/packages/flutter_tools/pubspec.yaml
+@@ -5,7 +5,7 @@ author: Flutter Authors <flutter-dev@googlegroups.com>
+
+ environment:
+   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
+-  sdk: ">=2.0.0-dev.68.0 <3.0.0"
++  sdk: ">=2.1.0-dev.5.0 <3.0.0"
+
+ dependencies:
+   # To update these, use "flutter update-packages --force-upgrade".
diff --git a/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.patch b/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.patch
new file mode 100644
index 0000000..f0f9e8c
--- /dev/null
+++ b/tools/patches/flutter-engine/f9ebf2129732fd2b606286fdf58e500384b8a0bc.patch
@@ -0,0 +1,36 @@
+diff --git a/DEPS b/DEPS
+index 2f5a8532b..c4cb5da32 100644
+--- a/DEPS
++++ b/DEPS
+@@ -47,7 +47,7 @@ vars = {
+   'dart_convert_tag': '2.0.2',
+   'dart_crypto_tag': '2.0.6',
+   'dart_csslib_tag': '0.14.4+1',
+-  'dart_dart2js_info_tag': '0.5.13',
++  'dart_dart2js_info_tag': '0.5.15',
+   'dart_dart_style_tag': '1.2.0',
+   'dart_dartdoc_tag': 'v0.24.1',
+   'dart_fixnum_tag': '0.10.8',
+@@ -60,7 +60,7 @@ vars = {
+   'dart_http_throttle_tag': '1.0.2',
+   'dart_intl_tag': '0.15.7',
+   'dart_json_rpc_2_tag': '2.0.9',
+-  'dart_linter_tag': '0.1.71',
++  'dart_linter_tag': '0.1.75',
+   'dart_logging_tag': '0.11.3+2',
+   'dart_markdown_tag': '2.0.2',
+   'dart_matcher_tag': '0.12.3',
+diff --git a/lib/snapshot/BUILD.gn b/lib/snapshot/BUILD.gn
+index ef06063a2..4db8600ea 100644
+--- a/lib/snapshot/BUILD.gn
++++ b/lib/snapshot/BUILD.gn
+@@ -53,9 +53,6 @@ compiled_action("generate_snapshot_bin") {
+   ]
+ 
+   args = [
+-    "--strong",
+-    "--sync-async",
+-    "--reify-generic-functions",
+     "--snapshot_kind=core",
+     "--enable_mirrors=false",
+     "--vm_snapshot_data=" + rebase_path(vm_snapshot_data),
diff --git a/tools/task_kill.py b/tools/task_kill.py
index 12b185d..8c046b7 100755
--- a/tools/task_kill.py
+++ b/tools/task_kill.py
@@ -40,6 +40,7 @@
     'dart_precompiled_runtime': 'dart_precompiled_runtime',
     'firefox': 'firefox',
     'gen_snapshot': 'gen_snapshot',
+    'flutter_tester': 'flutter_tester',
     'git': 'git',
   },
   'macos': {
@@ -230,6 +231,7 @@
   status = Kill("dart", dump_stacks=True)
   status += Kill("gen_snapshot", dump_stacks=True)
   status += Kill("dart_precompiled_runtime", dump_stacks=True)
+  status += Kill("flutter_tester", dump_stacks=True)
   return status
 
 def Main():
diff --git a/tools/test.dart b/tools/test.dart
new file mode 100755
index 0000000..cd956ef
--- /dev/null
+++ b/tools/test.dart
@@ -0,0 +1,359 @@
+#!/usr/bin/env dart
+// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Run tests like on the given builder.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:args/args.dart';
+
+import 'bots/results.dart';
+
+const int deflakingCount = 5;
+
+/// Quotes a string in shell single quote mode. This function produces a single
+/// shell argument that evaluates to the exact string provided, handling any
+/// special characters in the input string. Shell single quote mode works uses
+/// the single quote character as the delimiter and uses the characters
+/// in-between verbatim without any special processing. To insert the single
+/// quote character itself, escape single quote mode, insert an escaped single
+/// quote, and then return to single quote mode.
+///
+/// Examples:
+///   foo becomes 'foo'
+///   foo bar becomes 'foo bar'
+///   foo\ bar becomes 'foo\ bar'
+///   foo's bar becomes 'foo '\''s bar'
+///   foo "b"ar becomes 'foo "b"'
+///   foo
+///   bar becomes 'foo
+///   bar'
+String shellSingleQuote(String string) {
+  return "'${string.replaceAll("'", "'\\''")}'";
+}
+
+/// Like [shellSingleQuote], but if the string only contains safe ASCII
+/// characters, don't quote it. Note that it's not always safe to omit the
+/// quotes even if the string only has safe characters, as doing so might match
+/// a shell keyword or a shell builtin in the first argument in a command. It
+/// should be safe to use this for the second argument onwards in a command.
+String simpleShellSingleQuote(String string) {
+  return new RegExp(r"^[a-zA-Z0-9%+,./:_-]*$").hasMatch(string)
+      ? string
+      : shellSingleQuote(string);
+}
+
+/// Runs a process and exits likewise if the process exits non-zero.
+Future<ProcessResult> runProcess(
+    String executable, List<String> arguments) async {
+  final processResult = await Process.run(executable, arguments);
+  if (processResult.exitCode != 0) {
+    final command =
+        ([executable]..addAll(arguments)).map(simpleShellSingleQuote).join(" ");
+    throw new Exception("Command exited ${processResult.exitCode}: $command\n"
+        "${processResult.stdout}\n${processResult.stderr}");
+  }
+  return processResult;
+}
+
+/// Runs a process and exits likewise if the process exits non-zero, but let the
+/// child process inherit out stdio handles.
+Future<ProcessResult> runProcessInheritStdio(
+    String executable, List<String> arguments) async {
+  final process = await Process.start(executable, arguments,
+      mode: ProcessStartMode.inheritStdio);
+  final exitCode = await process.exitCode;
+  final processResult = new ProcessResult(process.pid, exitCode, "", "");
+  if (processResult.exitCode != 0) {
+    final command =
+        ([executable]..addAll(arguments)).map(simpleShellSingleQuote).join(" ");
+    throw new Exception("Command exited ${processResult.exitCode}: $command");
+  }
+  return processResult;
+}
+
+/// Returns the operating system of a builder.
+String systemOfBuilder(String builder) {
+  return builder.split("-").firstWhere(
+      (component) => ["linux", "mac", "win"].contains(component),
+      orElse: () => null);
+}
+
+/// Returns the product mode of a builder.
+String modeOfBuilder(String builder) {
+  return builder.split("-").firstWhere(
+      (component) => ["debug", "product", "release"].contains(component),
+      orElse: () => null);
+}
+
+/// Returns the machine architecture of a builder.
+String archOfBuilder(String builder) {
+  return builder.split("-").firstWhere(
+      (component) => [
+            "arm",
+            "arm64",
+            "armsimdbc",
+            "armsimdbc64",
+            "ia32",
+            "simarm",
+            "simarm64",
+            "simdbc",
+            "simdbc64",
+            "x64",
+          ].contains(component),
+      orElse: () => null);
+}
+
+/// Returns the runtime environment of a builder.
+String runtimeOfBuilder(String builder) {
+  return builder.split("-").firstWhere(
+      (component) => ["chrome", "d8", "edge", "firefox", "ie11", "safari"]
+          .contains(component),
+      orElse: () => null);
+}
+
+/// Expands a variable in a test matrix step command.
+String expandVariable(String string, String variable, String value) {
+  return string.replaceAll("\${$variable}", value ?? "");
+}
+
+/// Expands all variables in a test matrix step command.
+String expandVariables(String string, String builder) {
+  string = expandVariable(string, "system", systemOfBuilder(builder));
+  string = expandVariable(string, "mode", modeOfBuilder(builder));
+  string = expandVariable(string, "arch", archOfBuilder(builder));
+  string = expandVariable(string, "runtime", runtimeOfBuilder(builder));
+  return string;
+}
+
+/// Locates the merge base between head and the [branch] on the given [remote].
+/// If a particular [commit] was requested, use that.
+Future<String> findMergeBase(
+    String commit, String remote, String branch) async {
+  if (commit != null) {
+    return commit;
+  }
+  final arguments = ["merge-base", "$remote/$branch", "HEAD"];
+  final result = await Process.run("git", arguments);
+  if (result.exitCode != 0) {
+    throw new Exception("Failed to run: git ${arguments.join(' ')}\n"
+        "stdout:\n${result.stdout}\n"
+        "stderr:\n${result.stderr}\n");
+  }
+  return LineSplitter.split(result.stdout).first;
+}
+
+/// Locates the build number of the [commit] on the [builder], or throws an
+/// exception if the builder hasn't built the commit.
+Future<int> buildNumberOfCommit(String builder, String commit) async {
+  final requestUrl = Uri.parse(
+      "https://cr-buildbucket.appspot.com/_ah/api/buildbucket/v1/search"
+      "?bucket=luci.dart.ci.sandbox"
+      "&tag=builder%3A$builder"
+      "&tag=buildset%3Acommit%2Fgit%2F$commit"
+      "&fields=builds(status%2Ctags%2Curl)");
+  final client = new HttpClient();
+  final request = await client.getUrl(requestUrl);
+  final response = await request.close();
+  final Map<String, dynamic> object = await response
+      .transform(new Utf8Decoder())
+      .transform(new JsonDecoder())
+      .first;
+  client.close();
+  final builds = object["builds"];
+  if (builds == null || builds.isEmpty) {
+    throw new Exception("Builder $builder hasn't built commit $commit");
+  }
+  final build = builds.last;
+  final tags = (build["tags"] as List).cast<String>();
+  final buildAddressTag =
+      tags.firstWhere((tag) => tag.startsWith("build_address:"));
+  final buildAddress = buildAddressTag.substring("build_address:".length);
+  if (build["status"] != "COMPLETED") {
+    throw new Exception("Build $buildAddress isn't completed yet");
+  }
+  return int.parse(buildAddress.split("/").last);
+}
+
+void main(List<String> args) async {
+  final parser = new ArgParser();
+  parser.addOption("builder",
+      abbr: "b", help: "Run tests like on the given buider");
+  parser.addOption("branch",
+      abbr: "B",
+      help: "Select the builders building this branch",
+      defaultsTo: "master");
+  parser.addOption("commit", abbr: "C", help: "Compare with this commit");
+  parser.addOption("remote",
+      abbr: "R",
+      help: "Compare with this remote and git branch",
+      defaultsTo: "origin");
+  parser.addFlag("help", help: "Show the program usage.", negatable: false);
+
+  final options = parser.parse(args);
+  if (options["help"] || options["builder"] == null) {
+    print("""
+Usage: test.dart -b [BUILDER] [OPTION]...
+Run tests and compare with the results on the given builder.
+
+${parser.usage}""");
+    return;
+  }
+
+  final builder = options["builder"];
+
+  // Find out where the current HEAD branched.
+  final commit = await findMergeBase(
+      options["commit"], options["remote"], options["branch"]);
+  print("Base commit is $commit");
+
+  // Use the buildbucket API to search for builds of the right rcommit.
+  print("Finding build to compare with...");
+  final buildNumber = await buildNumberOfCommit(builder, commit);
+  print("Comparing with build $buildNumber on $builder");
+
+  final outDirectory = await Directory.systemTemp.createTemp("test.dart.");
+  try {
+    // Download the previous results and flakiness info from cloud storage.
+    print("Downloading previous results...");
+    await cpGsutil(
+        buildFileCloudPath(builder, buildNumber.toString(), "results.json"),
+        "${outDirectory.path}/previous.json");
+    await cpGsutil(
+        buildFileCloudPath(builder, buildNumber.toString(), "flaky.json"),
+        "${outDirectory.path}/flaky.json");
+    print("Downloaded previous results");
+
+    // Load the test matrix.
+    final scriptPath = Platform.script.toFilePath();
+    final testMatrixPath =
+        scriptPath.substring(0, scriptPath.length - "test.dart".length) +
+            "bots/test_matrix.json";
+    final testMatrix =
+        jsonDecode(await new File(testMatrixPath).readAsString());
+
+    // Find the appropriate test.py steps.
+    final buildersConfigurations = testMatrix["builder_configurations"];
+    final builderConfiguration = buildersConfigurations.firstWhere(
+        (builderConfiguration) =>
+            (builderConfiguration["builders"] as List).contains(builder));
+    final steps = (builderConfiguration["steps"] as List).cast<Map>();
+    final testSteps = steps
+        .where((step) =>
+            !step.containsKey("script") || step["script"] == "tools/test.py")
+        .toList();
+
+    // Run each step like the builder would, deflaking tests that need it.
+    final stepResultsPaths = <String>[];
+    final stepLogsPaths = <String>[];
+    for (int stepIndex = 0; stepIndex < testSteps.length; stepIndex++) {
+      // Run the test step.
+      final testStep = testSteps[stepIndex];
+      final stepName = testStep["name"];
+      final stepDirectory = new Directory("${outDirectory.path}/$stepIndex");
+      await stepDirectory.create();
+      final stepArguments = testStep["arguments"]
+          .map((argument) => expandVariables(argument, builder))
+          .toList()
+          .cast<String>();
+      final fullArguments = <String>[]
+        ..addAll(stepArguments)
+        ..addAll([
+          "--output-directory=${stepDirectory.path}",
+          "--clean-exit",
+          "--silent-failures",
+          "--write-results",
+          "--write-logs",
+        ])
+        ..addAll(options.rest);
+      print("".padLeft(80, "="));
+      print("$stepName: Running tests");
+      print("".padLeft(80, "="));
+      await runProcessInheritStdio("tools/test.py", fullArguments);
+      stepResultsPaths.add("${stepDirectory.path}/results.json");
+      stepLogsPaths.add("${stepDirectory.path}/logs.json");
+      // Find the list of tests to deflake.
+      final deflakeListOutput = await runProcess(Platform.resolvedExecutable, [
+        "tools/bots/compare_results.dart",
+        "--changed",
+        "--failing",
+        "--passing",
+        "--flakiness-data=${outDirectory.path}/flaky.json",
+        "${outDirectory.path}/previous.json",
+        "${stepDirectory.path}/results.json",
+      ]);
+      final deflakeListPath = "${stepDirectory.path}/deflake.list";
+      final deflakeListFile = new File(deflakeListPath);
+      await deflakeListFile.writeAsString(deflakeListOutput.stdout);
+      // Deflake the changed tests.
+      final deflakingResultsPaths = <String>[];
+      for (int i = 1;
+          deflakeListOutput.stdout != "" && i <= deflakingCount;
+          i++) {
+        print("".padLeft(80, "="));
+        print("$stepName: Running deflaking iteration $i");
+        print("".padLeft(80, "="));
+        final deflakeDirectory = new Directory("${stepDirectory.path}/$i");
+        await deflakeDirectory.create();
+        final deflakeArguments = <String>[]
+          ..addAll(stepArguments)
+          ..addAll([
+            "--output-directory=${deflakeDirectory.path}",
+            "--clean-exit",
+            "--silent-failures",
+            "--write-results",
+            "--test-list=$deflakeListPath",
+          ])
+          ..addAll(options.rest);
+        await runProcessInheritStdio("tools/test.py", deflakeArguments);
+        deflakingResultsPaths.add("${deflakeDirectory.path}/results.json");
+      }
+      // Update the flakiness information based on what we've learned.
+      print("$stepName: Updating flakiness information");
+      await runProcess(
+          Platform.resolvedExecutable,
+          [
+            "tools/bots/update_flakiness.dart",
+            "--input=${outDirectory.path}/flaky.json",
+            "--output=${outDirectory.path}/flaky.json",
+            "${stepDirectory.path}/results.json",
+          ]..addAll(deflakingResultsPaths));
+    }
+    // Collect all the results from all the steps.
+    await new File("${outDirectory.path}/results.json").writeAsString(
+        stepResultsPaths
+            .map((path) => new File(path).readAsStringSync())
+            .join(""));
+    // Collect all the logs from all the steps.
+    await new File("${outDirectory.path}/logs.json").writeAsString(stepLogsPaths
+        .map((path) => new File(path).readAsStringSync())
+        .join(""));
+    // Write out the final comparison.
+    print("".padLeft(80, "="));
+    print("Test Results");
+    print("".padLeft(80, "="));
+    final compareOutput = await runProcess(Platform.resolvedExecutable, [
+      "tools/bots/compare_results.dart",
+      "--human",
+      "--verbose",
+      "--changed",
+      "--failing",
+      "--passing",
+      "--flakiness-data=${outDirectory.path}/flaky.json",
+      "--logs=${outDirectory.path}/logs.json",
+      "${outDirectory.path}/previous.json",
+      "${outDirectory.path}/results.json",
+    ]);
+    if (compareOutput.stdout == "") {
+      print("There were no test failures.");
+    } else {
+      stdout.write(compareOutput.stdout);
+    }
+  } finally {
+    await outDirectory.delete(recursive: true);
+  }
+}
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index faa77d7..c29fe62 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -538,12 +538,24 @@
     });
   }
 
-  // Clears the recovery cache if the static resetBrowserConfiguration flag is
-  // set.
-  Future<bool> resetConfiguration() {
-    if (!Browser.resetBrowserConfiguration) return new Future.value(true);
-    var localAppData = Platform.environment['LOCALAPPDATA'];
+  // Clears the recovery cache and allows popups on localhost if the static
+  // resetBrowserConfiguration flag is set.
+  Future<bool> resetConfiguration() async {
+    if (!Browser.resetBrowserConfiguration) return true;
+    // todo(athom) Move this into the puppet configuration
+    var args = [
+      "add",
+      r"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\New Windows\Allow",
+      "/v",
+      "127.0.0.1",
+      "/f"
+    ];
+    var result = await Process.run("reg", args);
+    if (result.exitCode != 0) {
+      _logEvent("Failed to override user popup blocker settings");
+    }
 
+    var localAppData = Platform.environment['LOCALAPPDATA'];
     Directory dir = new Directory("$localAppData\\Microsoft\\"
         "Internet Explorer\\Recovery");
     return dir.delete(recursive: true).then((_) {
@@ -972,13 +984,6 @@
     var id = status.browser.id;
 
     status.currentTest.stopwatch.stop();
-
-    // Before closing the browser, we'll try to capture a screenshot on
-    // windows when using IE (to debug flakiness).
-    if (status.browser is IE) {
-      await captureInternetExplorerScreenshot(
-          'IE screenshot for ${status.currentTest.url}');
-    }
     await status.browser.close();
     var lastKnownMessage =
         'Dom could not be fetched, since the test timed out.';
@@ -1643,57 +1648,3 @@
     return driverContent;
   }
 }
-
-Future captureInternetExplorerScreenshot(String message) async {
-  if (Platform.environment['USERNAME'] != 'chrome-bot') {
-    return;
-  }
-
-  print('--------------------------------------------------------------------');
-  final String date =
-      new DateTime.now().toUtc().toIso8601String().replaceAll(':', '_');
-  final screenshotName = 'ie_screenshot_${date}.png';
-
-  // The "capture_screen.ps1" script is next to "test.dart" in "tools/"
-  final powerShellScript =
-      Platform.script.resolve('../../capture_screenshot.ps1').toFilePath();
-  final screenshotFile =
-      Platform.script.resolve('../../../$screenshotName').toFilePath();
-
-  final args = [
-    '-ExecutionPolicy',
-    'ByPass',
-    '-File',
-    powerShellScript,
-    screenshotFile
-  ];
-  final ProcessResult result =
-      await Process.run('powershell.exe', args, runInShell: true);
-  if (result.exitCode != 0) {
-    print('[$message] Failed to capture IE screenshot on windows: '
-        'powershell.exe "${args.join(' ')}" returned with:\n'
-        'exit code: ${result.exitCode}\n'
-        'stdout: ${result.stdout}\n'
-        'stderr: ${result.stderr}');
-  } else {
-    final storageUrl = 'gs://dart-temp-crash-archive/$screenshotName';
-    final args = [
-      r'e:\b\depot_tools\gsutil.py',
-      'cp',
-      screenshotFile,
-      storageUrl,
-    ];
-    final ProcessResult result = await Process.run('python', args);
-    if (result.exitCode != 0) {
-      print('[$message] Failed upload captured IE screenshot to cloud storage: '
-          '"${args.join(' ')}" returned with:\n'
-          'exit code: ${result.exitCode}\n'
-          'stdout: ${result.stdout}\n'
-          'stderr: ${result.stderr}');
-    } else {
-      print('[$message] Successfully uploaded screenshot to $storageUrl');
-    }
-    new File(screenshotFile).deleteSync();
-  }
-  print('--------------------------------------------------------------------');
-}
diff --git a/tools/testing/dart/command.dart b/tools/testing/dart/command.dart
index fecadb4..b91201d 100644
--- a/tools/testing/dart/command.dart
+++ b/tools/testing/dart/command.dart
@@ -351,6 +351,7 @@
   @override
   List<String> get batchArguments {
     return <String>[
+      '--enable-asserts',
       _compilerLocation.resolve("batch.dart").toFilePath(),
     ];
   }
diff --git a/tools/testing/dart/command_output.dart b/tools/testing/dart/command_output.dart
index d26a4dd..a392933 100644
--- a/tools/testing/dart/command_output.dart
+++ b/tools/testing/dart/command_output.dart
@@ -66,14 +66,19 @@
     // dart2js exits with code 253 in case of unhandled exceptions.
     // The dart binary exits with code 253 in case of an API error such
     // as an invalid snapshot file.
+    // The batch mode can also exit 253 (unhandledCompilerExceptionExitCode).
     // In either case an exit code of 253 is considered a crash.
-    if (exitCode == 253) return true;
+    if (exitCode == unhandledCompilerExceptionExitCode) return true;
     if (exitCode == parseFailExitCode) return false;
     if (hasTimedOut) return false;
     if (io.Platform.isWindows) {
       // The VM uses std::abort to terminate on asserts.
       // std::abort terminates with exit code 3 on Windows.
-      if (exitCode == 3 || exitCode == browserCrashExitCode) return true;
+      if (exitCode == 3) return true;
+
+      // When VM is built with Crashpad support we get STATUS_FATAL_APP_EXIT
+      // for all crashes that Crashpad has intercepted.
+      if (exitCode == 0x40000015) return true;
 
       // If a program receives an uncaught system exception, the program
       // terminates with the exception code as exit code.
@@ -87,6 +92,11 @@
     return exitCode < 0;
   }
 
+  bool get hasCoreDump {
+    // Unhandled dart exceptions don't produce crashdumps.
+    return hasCrashed && exitCode != 253;
+  }
+
   bool _didFail(TestCase testCase) => exitCode != 0 && !hasCrashed;
 
   bool get canRunDependendCommands {
@@ -314,11 +324,6 @@
   Expectation result(TestCase testCase) {
     // Handle timeouts first.
     if (_result.didTimeout) {
-      if (testCase.configuration.runtime == Runtime.ie11) {
-        // TODO(28955): See http://dartbug.com/28955
-        DebugLogger.warning("Timeout of ie11 on test ${testCase.displayName}");
-        return Expectation.ignore;
-      }
       return Expectation.timeout;
     }
 
@@ -338,11 +343,6 @@
   Expectation realResult(TestCase testCase) {
     // Handle timeouts first.
     if (_result.didTimeout) {
-      if (testCase.configuration.runtime == Runtime.ie11) {
-        // TODO(28955): See http://dartbug.com/28955
-        DebugLogger.warning("Timeout of ie11 on test ${testCase.displayName}");
-        return Expectation.ignore;
-      }
       return Expectation.timeout;
     }
 
@@ -849,7 +849,6 @@
 
   /// Cloned code from member result(), with changes.
   /// Delete existing result() function and rename, when status files are gone.
-  /// This code can return Expectation.ignore - we may want to fix that.
   Expectation realResult(TestCase testCase) {
     if (hasCrashed) return Expectation.crash;
     if (hasTimedOut) return Expectation.timeout;
@@ -921,7 +920,6 @@
 
   /// Cloned code from member result(), with changes.
   /// Delete existing result() function and rename, when status files are gone.
-  /// This code can return Expectation.ignore - we may want to fix that.
   Expectation realResult(TestCase testCase) {
     // TODO(kustermann): Currently the batch mode runner (which can be found
     // in `test_runner.dart:BatchRunnerProcess`) does not really distinguish
@@ -987,7 +985,6 @@
 
   /// Cloned code from member result(), with changes.
   /// Delete existing result() function and rename, when status files are gone.
-  /// This code can return Expectation.ignore - we may want to fix that.
   Expectation realResult(TestCase testCase) {
     // Handle crashes and timeouts first.
     if (hasCrashed) return Expectation.crash;
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 159398e..58f0143 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -478,7 +478,7 @@
   }
 }
 
-/// Configuration for `dartdevc` and `dartdevk`
+/// Configuration for `dartdevc` and `dartdevk` (DDC with Kernel)
 class DevCompilerConfiguration extends CompilerConfiguration {
   DevCompilerConfiguration(TestConfiguration configuration)
       : super._subclass(configuration);
@@ -622,7 +622,7 @@
     commands.add(
         computeDartBootstrapCommand(tempDir, arguments, environmentOverrides));
 
-    if (previewDart2) {
+    if (previewDart2 && !_configuration.keepGeneratedFiles) {
       commands.add(computeRemoveKernelFileCommand(
           tempDir, arguments, environmentOverrides));
     }
@@ -630,8 +630,10 @@
     if (!_configuration.useBlobs) {
       commands.add(
           computeAssembleCommand(tempDir, arguments, environmentOverrides));
-      commands.add(computeRemoveAssemblyCommand(
-          tempDir, arguments, environmentOverrides));
+      if (!_configuration.keepGeneratedFiles) {
+        commands.add(computeRemoveAssemblyCommand(
+            tempDir, arguments, environmentOverrides));
+      }
     }
 
     return new CommandArtifact(
@@ -1108,6 +1110,7 @@
     if (_configuration.useKernelBytecode) {
       args.add('--gen-bytecode');
       args.add('--drop-ast');
+      args.add('--emit-bytecode-source-positions');
     }
 
     return Command.vmKernelCompilation(dillFile, true, bootstrapDependencies(),
@@ -1166,7 +1169,7 @@
         Uri.base.resolveUri(new Uri.directory(tempDir)).resolve("out.dill");
     var outputFileName = output.toFilePath();
 
-    var compilerArguments = <String>[];
+    var compilerArguments = <String>['--verify'];
     if (_isLegacy) {
       compilerArguments.add("--legacy-mode");
     }
diff --git a/tools/testing/dart/configuration.dart b/tools/testing/dart/configuration.dart
index ab0a075..aa0b4f1 100644
--- a/tools/testing/dart/configuration.dart
+++ b/tools/testing/dart/configuration.dart
@@ -26,7 +26,6 @@
       this.progress,
       this.selectors,
       this.testList,
-      this.appendLogs,
       this.repeat,
       this.batch,
       this.batchDart2JS,
@@ -34,6 +33,8 @@
       this.isVerbose,
       this.listTests,
       this.listStatusFiles,
+      this.cleanExit,
+      this.silentFailures,
       this.printTiming,
       this.printReport,
       this.reportInJson,
@@ -41,9 +42,8 @@
       this.skipCompilation,
       this.useKernelBytecode,
       this.writeDebugLog,
-      this.writeTestOutcomeLog,
-      this.writeResultLog,
       this.writeResults,
+      this.writeLogs,
       this.drtPath,
       this.chromePath,
       this.safariPath,
@@ -59,6 +59,7 @@
       this.testServerCrossOriginPort,
       this.testDriverErrorPort,
       this.localIP,
+      this.keepGeneratedFiles,
       this.dart2jsOptions,
       String packages,
       this.packageRoot,
@@ -77,7 +78,6 @@
 
   // Boolean flags.
 
-  final bool appendLogs;
   final bool batch;
   final bool batchDart2JS;
   final bool copyCoreDumps;
@@ -85,6 +85,8 @@
   final bool isVerbose;
   final bool listTests;
   final bool listStatusFiles;
+  final bool cleanExit;
+  final bool silentFailures;
   final bool printTiming;
   final bool printReport;
   final bool reportInJson;
@@ -92,9 +94,8 @@
   final bool skipCompilation;
   final bool useKernelBytecode;
   final bool writeDebugLog;
-  final bool writeTestOutcomeLog;
-  final bool writeResultLog;
   final bool writeResults;
+  final bool writeLogs;
   final bool printPassingStdout;
 
   Architecture get architecture => configuration.architecture;
@@ -141,6 +142,7 @@
   final int testServerCrossOriginPort;
   final int testDriverErrorPort;
   final String localIP;
+  final bool keepGeneratedFiles;
 
   /// Extra dart2js options passed to the testing script.
   final List<String> dart2jsOptions;
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 6deef00..b647348 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -191,6 +191,8 @@
     new _Option.bool(
         'use_blobs', 'Use mmap instead of shared libraries for precompilation.',
         hide: true),
+    new _Option.bool('keep_generated_files', 'Keep any generated files.',
+        abbr: 'k'),
     new _Option.int('timeout', 'Timeout in seconds.', abbr: 't'),
     new _Option(
         'progress',
@@ -223,6 +225,14 @@
     new _Option.bool('list_status_files',
         'List status files for test-suites. Do not run any test suites.',
         hide: true),
+    new _Option.bool(
+        'clean_exit', 'Exit 0 if tests ran and results were output.',
+        hide: true),
+    new _Option.bool(
+        'silent_failures',
+        "Don't complain about failing tests. This is useful when in "
+        "combination with --write-results.",
+        hide: true),
     new _Option.bool('report_in_json',
         'When listing with --list, output result summary in JSON.',
         hide: true),
@@ -243,26 +253,20 @@
     new _Option.bool('noBatch', 'Do not run tests in batch mode.', hide: true),
     new _Option.bool('dart2js_batch', 'Run dart2js tests in batch mode.',
         hide: true),
-    new _Option.bool(
-        'append_logs', 'Do not delete old logs but rather append to them.',
-        hide: true),
     new _Option.bool('write_debug_log',
         'Don\'t write debug messages to stdout but rather to a logfile.',
         hide: true),
-    new _Option.bool('write_test_outcome_log',
-        'Write test outcomes to a "${TestUtils.testOutcomeFileName}" file.',
-        hide: true),
-    new _Option.bool(
-        'write_result_log',
-        'Write test results to a "${TestUtils.resultLogFileName}" json file '
-        'located at the debug_output_directory.',
-        hide: true),
     new _Option.bool(
         'write_results',
         'Write results to a "${TestUtils.resultsFileName}" json file '
         'located at the debug_output_directory.',
         hide: true),
     new _Option.bool(
+        'write_logs',
+        'Include the stdout and stderr of tests that don\'t match expectations '
+        'in the "${TestUtils.logsFileName}" file',
+        hide: true),
+    new _Option.bool(
         'reset_browser_configuration',
         '''Browser specific reset of configuration.
 
@@ -330,16 +334,16 @@
   /// For printing out reproducing command lines, we don't want to add these
   /// options.
   static final _blacklistedOptions = [
-    'append_logs',
     'build_directory',
-    'debug_output_directory',
     'chrome',
+    'clean_exit',
     'copy_coredumps',
     'dart',
-    'flutter',
+    'debug_output_directory',
     'drt',
     'exclude_suite',
     'firefox',
+    'flutter',
     'local_ip',
     'output_directory',
     'progress',
@@ -347,16 +351,25 @@
     'safari',
     'shard',
     'shards',
+    'silent_failures',
     'step_name',
     'tasks',
     'time',
     'verbose',
     'write_debug_log',
-    'write_test_outcome_log',
-    'write_result_log',
+    'write_logs',
     'write_results',
   ].toSet();
 
+  /// The set of objects which the named configuration should imply.
+  static final _namedConfigurationOptions = [
+    'system',
+    'arch',
+    'mode',
+    'compiler',
+    'runtime',
+  ].toSet();
+
   /// Parses a list of strings as test options.
   ///
   /// Returns a list of configurations in which to run the tests.
@@ -473,6 +486,18 @@
       }
     }
 
+    // If a named configuration was specified ensure no other options, which are
+    // implied by the named configuration, were specified.
+    if (configuration['named_configuration'] is String) {
+      for (final optionName in _namedConfigurationOptions) {
+        if (configuration.containsKey(optionName)) {
+          final namedConfig = configuration['named_configuration'];
+          _fail("The named configuration '$namedConfig' implies "
+              "'$optionName'. Try removing '$optionName'.");
+        }
+      }
+    }
+
     // Apply default values for unspecified options.
     for (var option in _options) {
       if (!configuration.containsKey(option.name)) {
@@ -489,20 +514,18 @@
     return _createConfigurations(configuration);
   }
 
-  /// Prints [message] and exits with a non-zero exit code.
-  void _fail(String message) {
-    print(message);
-    exit(1);
-  }
-
   /// Given a set of parsed option values, returns the list of command line
   /// arguments that would reproduce that configuration.
-  List<String> _reproducingCommand(Map<String, dynamic> data) {
+  List<String> _reproducingCommand(
+      Map<String, dynamic> data, bool usingNamedConfiguration) {
     var arguments = <String>[];
 
     for (var option in _options) {
       var name = option.name;
-      if (!data.containsKey(name) || _blacklistedOptions.contains(name)) {
+      if (!data.containsKey(name) ||
+          _blacklistedOptions.contains(name) ||
+          (usingNamedConfiguration &&
+              _namedConfigurationOptions.contains(name))) {
         continue;
       }
 
@@ -634,7 +657,7 @@
         // Expand compilers.
         for (var compiler in compilers) {
           // Expand modes.
-          String modes = data["mode"] ?? compiler.defaultMode.name;
+          String modes = (data["mode"] as String) ?? compiler.defaultMode.name;
           if (modes == "all") modes = "debug,release,product";
           for (var modeName in modes.split(",")) {
             var mode = Mode.find(modeName);
@@ -668,7 +691,6 @@
                 progress: Progress.find(data["progress"] as String),
                 selectors: selectors,
                 testList: data["test_list_contents"] as List<String>,
-                appendLogs: data["append_logs"] as bool,
                 repeat: data["repeat"] as int,
                 batch: !(data["noBatch"] as bool),
                 batchDart2JS: data["dart2js_batch"] as bool,
@@ -676,16 +698,18 @@
                 isVerbose: data["verbose"] as bool,
                 listTests: data["list"] as bool,
                 listStatusFiles: data["list_status_files"] as bool,
+                cleanExit: data["clean_exit"] as bool,
+                silentFailures: data["silent_failures"] as bool,
                 printTiming: data["time"] as bool,
                 printReport: data["report"] as bool,
                 reportInJson: data["report_in_json"] as bool,
                 resetBrowser: data["reset_browser_configuration"] as bool,
                 skipCompilation: data["skip_compilation"] as bool,
-                useKernelBytecode: compiler == Compiler.dartkb,
+                useKernelBytecode:
+                    innerConfiguration.compiler == Compiler.dartkb,
                 writeDebugLog: data["write_debug_log"] as bool,
-                writeTestOutcomeLog: data["write_test_outcome_log"] as bool,
-                writeResultLog: data["write_result_log"] as bool,
                 writeResults: data["write_results"] as bool,
+                writeLogs: data["write_logs"] as bool,
                 drtPath: data["drt"] as String,
                 chromePath: data["chrome"] as String,
                 safariPath: data["safari"] as String,
@@ -693,6 +717,7 @@
                 dartPath: data["dart"] as String,
                 dartPrecompiledPath: data["dart_precompiled"] as String,
                 flutterPath: data["flutter"] as String,
+                keepGeneratedFiles: data["keep_generated_files"] as bool,
                 taskCount: data["tasks"] as int,
                 shardCount: data["shards"] as int,
                 shard: data["shard"] as int,
@@ -707,7 +732,8 @@
                 packageRoot: data["package_root"] as String,
                 suiteDirectory: data["suite_dir"] as String,
                 outputDirectory: data["output_directory"] as String,
-                reproducingArguments: _reproducingCommand(data),
+                reproducingArguments:
+                    _reproducingCommand(data, namedConfiguration != null),
                 fastTestsOnly: data["fast_tests"] as bool,
                 printPassingStdout: data["print_passing_stdout"] as bool);
 
@@ -872,7 +898,24 @@
 
 Configuration getNamedConfiguration(String template) {
   if (template == null) return null;
-  TestMatrix testMatrix = TestMatrix.fromPath("tools/bots/test_matrix.json");
-  return testMatrix.configurations
+  final testMatrixFile = "tools/bots/test_matrix.json";
+  TestMatrix testMatrix = TestMatrix.fromPath(testMatrixFile);
+  final configuration = testMatrix.configurations
       .singleWhere((c) => c.name == template, orElse: () => null);
+  if (configuration == null) {
+    final names = testMatrix.configurations
+        .map((configuration) => configuration.name)
+        .toList();
+    names.sort();
+    _fail('The named configuration "$template" does not exist. The following '
+        'configurations are available:\n  * ${names.join('\n  * ')}');
+  }
+
+  return configuration;
+}
+
+/// Prints [message] and exits with a non-zero exit code.
+void _fail(String message) {
+  print(message);
+  exit(1);
 }
diff --git a/tools/testing/dart/runtime_configuration.dart b/tools/testing/dart/runtime_configuration.dart
index ff8efbb..8330b51 100644
--- a/tools/testing/dart/runtime_configuration.dart
+++ b/tools/testing/dart/runtime_configuration.dart
@@ -81,7 +81,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     // TODO(ahe): Make this method abstract.
     throw "Unimplemented runtime '$runtimeType'";
   }
@@ -99,7 +100,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     return <Command>[];
   }
 }
@@ -125,7 +127,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     // TODO(ahe): Avoid duplication of this method between d8 and jsshell.
     checkArtifact(artifact);
     return [
@@ -147,7 +150,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     checkArtifact(artifact);
     return [
       Command.jsCommandLine(
@@ -205,7 +209,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     String script = artifact.filename;
     String type = artifact.mimeType;
     if (script != null &&
@@ -215,7 +220,9 @@
         type != 'application/kernel-ir-fully-linked') {
       throw "Dart VM cannot run files of type '$type'.";
     }
-
+    if (isCrashExpected) {
+      arguments.insert(0, '--suppress-core-dump');
+    }
     String executable = suite.dartVmBinaryFileName;
     if (type == 'application/kernel-ir-fully-linked') {
       executable = suite.dartVmExecutableFileName;
@@ -230,7 +237,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     String script = artifact.filename;
     String type = artifact.mimeType;
     if (script != null &&
@@ -252,7 +260,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     String script = artifact.filename;
     String type = artifact.mimeType;
     if (script != null && type != 'application/dart-precompiled') {
@@ -279,7 +288,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     String script = artifact.filename;
     String type = artifact.mimeType;
     if (script != null && type != 'application/dart-precompiled') {
@@ -315,7 +325,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     String executable = suite.dartVmBinaryFileName;
     return selfCheckers
         .map((String tester) => Command.vmBatch(
@@ -336,7 +347,8 @@
       TestSuite suite,
       CommandArtifact artifact,
       List<String> arguments,
-      Map<String, String> environmentOverrides) {
+      Map<String, String> environmentOverrides,
+      bool isCrashExpected) {
     throw "Unimplemented runtime '$runtimeType'";
   }
 }
diff --git a/tools/testing/dart/test_configurations.dart b/tools/testing/dart/test_configurations.dart
index 17bb379..d20f969 100644
--- a/tools/testing/dart/test_configurations.dart
+++ b/tools/testing/dart/test_configurations.dart
@@ -60,25 +60,10 @@
   var printTiming = firstConf.printTiming;
   var listTests = firstConf.listTests;
   var listStatusFiles = firstConf.listStatusFiles;
-
   var reportInJson = firstConf.reportInJson;
 
   Browser.resetBrowserConfiguration = firstConf.resetBrowser;
-
-  if (!firstConf.appendLogs) {
-    var files = [
-      new File(TestUtils.flakyFileName),
-      new File(TestUtils.testOutcomeFileName)
-    ];
-    for (var file in files) {
-      if (file.existsSync()) {
-        file.deleteSync();
-      }
-    }
-  }
-
-  DebugLogger.init(firstConf.writeDebugLog ? TestUtils.debugLogFilePath : null,
-      append: firstConf.appendLogs);
+  DebugLogger.init(firstConf.writeDebugLog ? TestUtils.debugLogFilePath : null);
 
   // Print the configurations being run by this execution of
   // test.dart. However, don't do it if the silent progress indicator
@@ -182,7 +167,9 @@
     }
 
     DebugLogger.close();
-    TestUtils.deleteTempSnapshotDirectory(configurations[0]);
+    if (!firstConf.keepGeneratedFiles) {
+      TestUtils.deleteTempSnapshotDirectory(configurations[0]);
+    }
   }
 
   var eventListener = <EventListener>[];
@@ -201,8 +188,10 @@
       printFailures = false;
       eventListener.add(new StatusFileUpdatePrinter());
     }
+    if (firstConf.silentFailures) {
+      printFailures = false;
+    }
     eventListener.add(new SummaryPrinter());
-    eventListener.add(new FlakyLogWriter());
     if (printFailures) {
       // The buildbot has it's own failure summary since it needs to wrap it
       // into '@@@'-annotated sections.
@@ -223,14 +212,6 @@
     }
   }
 
-  if (firstConf.writeTestOutcomeLog) {
-    eventListener.add(new TestOutcomeLogWriter());
-  }
-
-  if (firstConf.writeResultLog) {
-    eventListener.add(new ResultLogWriter(firstConf.outputDirectory));
-  }
-
   if (firstConf.writeResults) {
     eventListener.add(new ResultWriter(firstConf, startTime, startStopwatch));
   }
@@ -244,7 +225,9 @@
   if (listTests) {
     eventListener.add(new SummaryPrinter(jsonOnly: reportInJson));
   } else {
-    eventListener.add(new ExitCodeSetter());
+    if (!firstConf.cleanExit) {
+      eventListener.add(new ExitCodeSetter());
+    }
     eventListener.add(new IgnoredTestMonitor());
   }
 
diff --git a/tools/testing/dart/test_progress.dart b/tools/testing/dart/test_progress.dart
index f995ea7..e56e891 100644
--- a/tools/testing/dart/test_progress.dart
+++ b/tools/testing/dart/test_progress.dart
@@ -120,111 +120,14 @@
   }
 }
 
-class FlakyLogWriter extends EventListener {
-  void done(TestCase test) {
-    if (test.isFlaky && test.result != Expectation.pass) {
-      var buf = new StringBuffer();
-      for (var l in _buildFailureOutput(test)) {
-        buf.write("$l\n");
-      }
-      _appendToFlakyFile(buf.toString());
-    }
-  }
-
-  void _appendToFlakyFile(String msg) {
-    var file = new File(TestUtils.flakyFileName);
-    var fd = file.openSync(mode: FileMode.append);
-    fd.writeStringSync(msg);
-    fd.closeSync();
-  }
-}
-
-class TestOutcomeLogWriter extends EventListener {
-  /*
-   * The ".test-outcome.log" file contains one line for every executed test.
-   * Such a line is an encoded JSON data structure of the following form:
-   * The durations are double values in milliseconds.
-   *
-   *  {
-   *     name: 'co19/LibTest/math/x',
-   *     configuration: {
-   *       mode : 'release',
-   *       compiler : 'dart2js',
-   *       ....
-   *     },
-   *     test_result: {
-   *       outcome: 'RuntimeError',
-   *       expected_outcomes: ['Pass', 'Fail'],
-   *       duration: 2600.64,
-   *       command_results: [
-   *         {
-   *           name: 'dart2js',
-   *           duration: 2400.44,
-   *         },
-   *         {
-   *           name: 'ff',
-   *           duration: 200.2,
-   *         },
-   *       ],
-   *     }
-   *  },
-   */
-  IOSink _sink;
-
-  void done(TestCase test) {
-    var name = test.displayName;
-    var outcome = '${test.lastCommandOutput.result(test)}';
-    var expectations =
-        test.expectedOutcomes.map((expectation) => "$expectation").toList();
-
-    var commandResults = [];
-    double totalDuration = 0.0;
-    for (var command in test.commands) {
-      var output = test.commandOutputs[command];
-      if (output != null) {
-        double duration = output.time.inMicroseconds / 1000.0;
-        totalDuration += duration;
-        commandResults.add({
-          'name': command.displayName,
-          'duration': duration,
-        });
-      }
-    }
-    _writeTestOutcomeRecord({
-      'name': name,
-      'configuration': test.configuration.toSummaryMap(),
-      'test_result': {
-        'outcome': outcome,
-        'expected_outcomes': expectations,
-        'duration': totalDuration,
-        'command_results': commandResults,
-      },
-    });
-  }
-
-  void allDone() {
-    if (_sink != null) _sink.close();
-  }
-
-  void _writeTestOutcomeRecord(Map record) {
-    // TODO(mkroghj) change the location of this file
-    // to be in the debug_output_directory
-    // if the current location is not used.
-    if (_sink == null) {
-      _sink = new File(TestUtils.testOutcomeFileName)
-          .openWrite(mode: FileMode.append);
-    }
-    _sink.write("${jsonEncode(record)}\n");
-  }
-}
-
 class UnexpectedCrashLogger extends EventListener {
   final archivedBinaries = <String, String>{};
 
   void done(TestCase test) {
     if (test.unexpectedOutput &&
         test.result == Expectation.crash &&
-        test.lastCommandExecuted is ProcessCommand) {
+        test.lastCommandExecuted is ProcessCommand &&
+        test.lastCommandOutput.hasCoreDump) {
       var pid = "${test.lastCommandOutput.pid}";
       var lastCommand = test.lastCommandExecuted as ProcessCommand;
 
@@ -244,6 +147,13 @@
         var arch = test.configuration.architecture.name;
         var archived = "binary.${mode}_${arch}_${binBaseName}";
         TestUtils.copyFile(new Path(binName), new Path(archived));
+        // On Windows also copy PDB file for the binary.
+        if (Platform.isWindows) {
+          final pdbPath = new Path("$binName.pdb");
+          if (new File(pdbPath.toNativePath()).existsSync()) {
+            TestUtils.copyFile(pdbPath, new Path("$archived.pdb"));
+          }
+        }
         archivedBinaries[binName] = archived;
       }
 
@@ -677,7 +587,23 @@
     [Formatter formatter = Formatter.normal]) {
   var lines = <String>[];
   var output = new OutputWriter(formatter, lines);
+  _writeFailureStatus(test, formatter, output);
+  _writeFailureOutput(test, formatter, output);
+  _writeFailureReproductionCommands(test, formatter, output);
+  return lines;
+}
 
+List<String> _buildFailureLog(TestCase test) {
+  final formatter = Formatter.normal;
+  final lines = <String>[];
+  final output = new OutputWriter(formatter, lines);
+  _writeFailureOutput(test, formatter, output);
+  _writeFailureReproductionCommands(test, formatter, output);
+  return lines;
+}
+
+void _writeFailureStatus(
+    TestCase test, Formatter formatter, OutputWriter output) {
   output.write('');
   output.write(formatter
       .failed('FAILED: ${test.configurationString} ${test.displayName}'));
@@ -685,7 +611,7 @@
   output.write('Expected: ${test.expectedOutcomes.join(" ")}');
   output.write('Actual: ${test.result}');
 
-  var ranAllCommands = test.commandOutputs.length == test.commands.length;
+  final ranAllCommands = test.commandOutputs.length == test.commands.length;
   if (!test.lastCommandOutput.hasTimedOut) {
     if (!ranAllCommands && !test.expectCompileError) {
       output.write('Unexpected compile error.');
@@ -701,7 +627,10 @@
       }
     }
   }
+}
 
+void _writeFailureOutput(
+    TestCase test, Formatter formatter, OutputWriter output) {
   for (var i = 0; i < test.commands.length; i++) {
     var command = test.commands[i];
     var commandOutput = test.commandOutputs[command];
@@ -712,7 +641,11 @@
     output.write(command.toString());
     commandOutput.describe(test.configuration.progress, output);
   }
+}
 
+void _writeFailureReproductionCommands(
+    TestCase test, Formatter formatter, OutputWriter output) {
+  final ranAllCommands = test.commandOutputs.length == test.commands.length;
   if (test.configuration.runtime.isBrowser && ranAllCommands) {
     // Additional command for rerunning the steps locally after the fact.
     output.section('To debug locally, run');
@@ -730,7 +663,6 @@
   arguments.add(test.displayName);
 
   output.write(arguments.map(escapeCommandLineArgument).join(' '));
-  return lines;
 }
 
 String _buildSummaryEnd(Formatter formatter, int failedTests) {
@@ -743,89 +675,6 @@
   }
 }
 
-class ResultLogWriter extends EventListener {
-  Map<String, Map> _configurations = {};
-  List<Map> _results = [];
-  String _outputDirectory;
-
-  ResultLogWriter(this._outputDirectory);
-
-  void allTestsKnown() {
-    // Write an empty result log file, that will be overwritten if any tests
-    // are actually run, when the allDone event handler is invoked.
-    writeToFile({}, []);
-  }
-
-  void done(TestCase test) {
-    // We try to find an existing configuration, so as to not duplicate this
-    // for each test.
-    var thisConf = test.configuration.toSummaryMap();
-    String key = _configurations.keys.firstWhere(
-        (key) => identical(_configurations[key], thisConf), orElse: () {
-      var newKey = "conf${_configurations.length + 1}";
-      _configurations[newKey] = thisConf;
-      return newKey;
-    });
-    var commands = test.commands.map((command) {
-      var output = test.commandOutputs[command];
-      if (output == null) {
-        return {'name': command.displayName};
-      }
-      return {
-        'name': command.displayName,
-        'exitCode': output.exitCode,
-        'timeout': output.hasTimedOut,
-        'duration': output.time.inMilliseconds
-      };
-    }).toList();
-
-    // Compute inlined expectations.
-    var inlineExpectations = <String>[];
-    if (test.hasStaticWarning) {
-      inlineExpectations.add("static-type-warning");
-    }
-    if (test.hasRuntimeError) {
-      inlineExpectations.add("runtime-error");
-    }
-    if (test.hasSyntaxError) {
-      inlineExpectations.add("syntax-error");
-    }
-    if (test.hasCompileError) {
-      inlineExpectations.add("compile-time-error");
-    }
-    if (test.hasCompileErrorIfChecked) {
-      inlineExpectations.add("checked-compile-time-error");
-    }
-    if (test.isNegativeIfChecked) {
-      inlineExpectations.add("dynamic-type-error");
-    }
-    _results.add({
-      'configuration': key,
-      'name': test.displayName,
-      'result': test.lastCommandOutput.result(test).toString(),
-      'test_expectation': inlineExpectations,
-      'flaky': test.isFlaky,
-      'negative': test.isNegative,
-      'commands': commands
-    });
-  }
-
-  void allDone() {
-    writeToFile(_configurations, _results);
-  }
-
-  void writeToFile(Map<String, Map> configurations, List<Map> results) {
-    if (_outputDirectory != null) {
-      var path = new Path(_outputDirectory);
-      var file =
-          new File(path.append(TestUtils.resultLogFileName).toNativePath());
-      file.createSync(recursive: true);
-      file.writeAsStringSync(
-          jsonEncode({'configurations': configurations, 'results': results}));
-    }
-  }
-}
-
 /// Writes a results.json file with a line for each test.
 /// Each line is a json map with the test name and result and expected result.
 /// Also writes a run.json file with a json map containing the configuration
@@ -833,6 +682,7 @@
 class ResultWriter extends EventListener {
   final TestConfiguration _configuration;
   final List<Map> _results = [];
+  final List<Map> _logs = [];
   final String _outputDirectory;
   final Stopwatch _startStopwatch;
   final DateTime _startTime;
@@ -843,9 +693,13 @@
   void allTestsKnown() {
     // Write an empty result log file, that will be overwritten if any tests
     // are actually run, when the allDone event handler is invoked.
-    writeResultsFile([]);
+    writeOutputFile([], TestUtils.resultsFileName);
+    writeOutputFile([], TestUtils.logsFileName);
   }
 
+  String newlineTerminated(Iterable<String> lines) =>
+      lines.map((l) => l + '\n').join();
+
   void done(TestCase test) {
     if (_configuration != test.configuration) {
       throw new Exception("Two configurations in the same run. "
@@ -858,7 +712,7 @@
     Duration time =
         test.commandOutputs.values.fold(Duration.zero, (d, o) => d + o.time);
 
-    var record = {
+    final record = {
       "name": name,
       "configuration": _configuration.configuration.name,
       "suite": suite,
@@ -869,19 +723,28 @@
       "matches": test.realResult.canBeOutcomeOf(test.realExpected)
     };
     _results.add(record);
+    if (test.configuration.writeLogs && record['matches'] != true) {
+      final log = {
+        'name': name,
+        'configuration': record['configuration'],
+        'result': record['result'],
+        'log': newlineTerminated(_buildFailureLog(test))
+      };
+      _logs.add(log);
+    }
   }
 
   void allDone() {
-    writeResultsFile(_results);
+    writeOutputFile(_results, TestUtils.resultsFileName);
+    writeOutputFile(_logs, TestUtils.logsFileName);
     writeRunFile();
   }
 
-  void writeResultsFile(List<Map> results) {
+  void writeOutputFile(List<Map> results, String fileName) {
     if (_outputDirectory == null) return;
-    final path =
-        Uri.directory(_outputDirectory).resolve(TestUtils.resultsFileName);
-    String jsonLine(Map x) => jsonEncode(x) + '\n';
-    File.fromUri(path).writeAsStringSync(results.map(jsonLine).join());
+    final path = Uri.directory(_outputDirectory).resolve(fileName);
+    File.fromUri(path)
+        .writeAsStringSync(newlineTerminated(results.map(jsonEncode)));
   }
 
   void writeRunFile() {
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 17e0b60..2081403 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -31,7 +31,7 @@
 import 'test_suite.dart';
 import 'utils.dart';
 
-const int browserCrashExitCode = -10;
+const int unhandledCompilerExceptionExitCode = 253;
 const int parseFailExitCode = 245;
 const int slowTimeoutMultiplier = 4;
 const int extraSlowTimeoutMultiplier = 8;
@@ -712,7 +712,7 @@
 
     var outcome = _status.split(" ")[2];
     var exitCode = 0;
-    if (outcome == "CRASH") exitCode = browserCrashExitCode;
+    if (outcome == "CRASH") exitCode = unhandledCompilerExceptionExitCode;
     if (outcome == "PARSE_FAIL") exitCode = parseFailExitCode;
     if (outcome == "FAIL" || outcome == "TIMEOUT") exitCode = 1;
     var output = createCommandOutput(
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 96533ad..3afc50e 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -128,9 +128,14 @@
     _environmentOverrides = {
       'DART_CONFIGURATION': configuration.configurationDirectory,
     };
-    if (configuration.copyCoreDumps && Platform.isWindows) {
-      _environmentOverrides['DART_CRASHPAD_HANDLER'] =
-          new Path(buildDir + '/crashpad_handler.exe').toNativePath();
+    if (Platform.isWindows) {
+      _environmentOverrides['DART_SUPPRESS_WER'] = '1';
+      if (configuration.copyCoreDumps) {
+        _environmentOverrides['DART_CRASHPAD_HANDLER'] =
+            new Path(buildDir + '/crashpad_handler.exe')
+                .absolute
+                .toNativePath();
+      }
     }
   }
 
@@ -446,12 +451,13 @@
   VMTestSuite(TestConfiguration configuration)
       : dartDir = Repository.dir.toNativePath(),
         super(configuration, "vm", ["runtime/tests/vm/vm.status"]) {
+    var binarySuffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
+
     // For running the tests we use the given '$runnerName' binary
-    targetRunnerPath = '$buildDir/run_vm_tests';
+    targetRunnerPath = '$buildDir/run_vm_tests$binarySuffix';
 
     // For listing the tests we use the '$runnerName.host' binary if it exists
     // and use '$runnerName' if it doesn't.
-    var binarySuffix = Platform.operatingSystem == 'windows' ? '.exe' : '';
     var hostBinary = '$targetRunnerPath.host$binarySuffix';
     if (new File(hostBinary).existsSync()) {
       hostRunnerPath = hostBinary;
@@ -482,18 +488,25 @@
   }
 
   void _addTest(ExpectationSet testExpectations, String testName) {
+    var fullName = 'cc/$testName';
+    var expectations = testExpectations.expectations(fullName);
+
     var args = configuration.standardOptions.toList();
     if (configuration.compilerConfiguration.previewDart2) {
+      final dfePath = new Path("$buildDir/gen/kernel-service.dart.snapshot")
+          .absolute
+          .toNativePath();
       // '--dfe' has to be the first argument for run_vm_test to pick it up.
-      args.insert(0, '--dfe=$buildDir/gen/kernel-service.dart.snapshot');
+      args.insert(0, '--dfe=$dfePath');
+    }
+    if (expectations.contains(Expectation.crash)) {
+      args.insert(0, '--suppress-core-dump');
     }
 
     args.add(testName);
 
     var command = Command.process(
         'run_vm_unittest', targetRunnerPath, args, environmentOverrides);
-    var fullName = 'cc/$testName';
-    var expectations = testExpectations.expectations(fullName);
     enqueueNewTestCase(fullName, [command], expectations);
   }
 
@@ -551,8 +564,7 @@
   final List<String> extraVmOptions;
   List<Uri> _dart2JsBootstrapDependencies;
   Set<String> _testListPossibleFilenames;
-
-  static final Uri co19SuiteLocation = Repository.uri.resolve("tests/co19_2/");
+  RegExp _selectorFilenameRegExp;
 
   StandardTestSuite(TestConfiguration configuration, String suiteName,
       Path suiteDirectory, List<String> statusFilePaths,
@@ -562,6 +574,7 @@
         suiteDir = Repository.dir.join(suiteDirectory),
         extraVmOptions = configuration.vmOptions,
         super(configuration, suiteName, statusFilePaths) {
+    // Initialize _dart2JsBootstrapDependencies
     if (!useSdk) {
       _dart2JsBootstrapDependencies = [];
     } else {
@@ -571,6 +584,8 @@
             .resolve('dart-sdk/bin/snapshots/dart2js.dart.snapshot')
       ];
     }
+
+    // Initialize _testListPossibleFilenames
     if (configuration.testList != null) {
       _testListPossibleFilenames = Set<String>();
       for (String s in configuration.testList) {
@@ -587,6 +602,18 @@
         }
       }
     }
+
+    // Initialize _selectorFilenameRegExp
+    String pattern = configuration.selectors[suiteName].pattern;
+    if (pattern.contains("/")) {
+      String lastPart = pattern.substring(pattern.lastIndexOf("/") + 1);
+      // If the selector is a multitest name ending in a number or 'none'
+      // we also accept test file names that don't contain that last part.
+      if (int.tryParse(lastPart) != null || lastPart == "none") {
+        pattern = pattern.substring(0, pattern.lastIndexOf("/"));
+      }
+    }
+    _selectorFilenameRegExp = new RegExp(pattern);
   }
 
   /**
@@ -709,26 +736,14 @@
     // The definitive check against configuration.testList is performed in
     // TestSuite.enqueueNewTestCase().
     if (_testListPossibleFilenames?.contains(filename) == false) return;
-    bool match = false;
-    for (var regex in configuration.selectors.values) {
-      String pattern = regex.pattern;
-      if (pattern.contains("/")) {
-        String lastPart = pattern.substring(pattern.lastIndexOf("/") + 1);
-        if (int.tryParse(lastPart) != null ||
-            lastPart.toLowerCase() == "none") {
-          pattern = pattern.substring(0, pattern.lastIndexOf("/"));
-        }
-      }
-      if (pattern != regex.pattern) {
-        regex = new RegExp(pattern);
-      }
-      if (regex.hasMatch(filename)) match = true;
-      if (match) break;
-    }
-    if (!match) return;
+    // Note: have to use Path instead of a filename for matching because
+    // on Windows we need to convert backward slashes to forward slashes.
+    // Our display test names (and filters) are given using forward slashes
+    // while filenames on Windows use backwards slashes.
+    final Path filePath = Path(filename);
+    if (!_selectorFilenameRegExp.hasMatch(filePath.toString())) return;
 
     if (!isTestFile(filename)) return;
-    Path filePath = new Path(filename);
 
     var optionsFromFile = readOptionsFromFile(new Uri.file(filename));
     CreateTest createTestCase = makeTestCaseCreator(optionsFromFile);
@@ -802,12 +817,6 @@
     var commonArguments =
         commonArgumentsFromFile(info.filePath, info.optionsFromFile);
 
-    // TODO(floitsch): Hack. When running the 2.0 tests always start
-    // async functions synchronously.
-    if (suiteName.endsWith("_2")) {
-      commonArguments.insert(0, "--sync-async");
-    }
-
     var vmOptionsList = getVmOptions(info.optionsFromFile);
     assert(!vmOptionsList.isEmpty);
 
@@ -820,15 +829,16 @@
         allVmOptions = vmOptions.toList()..addAll(extraVmOptions);
       }
 
-      var commands =
-          makeCommands(info, vmOptionsVariant, allVmOptions, commonArguments);
       var expectations = testExpectations.expectations(testName);
+      var isCrashExpected = expectations.contains(Expectation.crash);
+      var commands = makeCommands(info, vmOptionsVariant, allVmOptions,
+          commonArguments, isCrashExpected);
       enqueueNewTestCase(testName, commands, expectations, info);
     }
   }
 
   List<Command> makeCommands(TestInformation info, int vmOptionsVariant,
-      List<String> vmOptions, List<String> args) {
+      List<String> vmOptions, List<String> args, bool isCrashExpected) {
     var commands = <Command>[];
     var compilerConfiguration = configuration.compilerConfiguration;
     var sharedOptions = info.optionsFromFile['sharedOptions'] as List<String>;
@@ -883,14 +893,14 @@
             compilationArtifact);
 
     Map<String, String> environment = environmentOverrides;
-    Map<String, String> extraEnv = info.optionsFromFile['environment'];
+    var extraEnv = info.optionsFromFile['environment'] as Map<String, String>;
     if (extraEnv != null) {
       environment = new Map.from(environment)..addAll(extraEnv);
     }
 
     return commands
-      ..addAll(configuration.runtimeConfiguration.computeRuntimeCommands(
-          this, compilationArtifact, runtimeArguments, environment));
+      ..addAll(configuration.runtimeConfiguration.computeRuntimeCommands(this,
+          compilationArtifact, runtimeArguments, environment, isCrashExpected));
   }
 
   CreateTest makeTestCaseCreator(Map<String, dynamic> optionsFromFile) {
@@ -1021,27 +1031,6 @@
     var htmlPath = '$tempDir/test.html';
     new File(htmlPath).writeAsStringSync(content);
 
-    // TODO(floitsch): Hack. When running the 2.0 tests always start
-    // async functions synchronously.
-    if (suiteName.endsWith("_2") &&
-        configuration.compiler == Compiler.dart2js) {
-      if (optionsFromFile == null) {
-        optionsFromFile = const <String, dynamic>{
-          'sharedOptions': const ['--sync-async']
-        };
-      } else {
-        optionsFromFile = new Map<String, dynamic>.from(optionsFromFile);
-        var sharedOptions = optionsFromFile['sharedOptions'];
-        if (sharedOptions == null) {
-          sharedOptions = const <String>['--sync-async'];
-        } else {
-          sharedOptions = sharedOptions.toList();
-          sharedOptions.insert(0, "--sync-async");
-        }
-        optionsFromFile['sharedOptions'] = sharedOptions;
-      }
-    }
-
     // Construct the command(s) that compile all the inputs needed by the
     // browser test.
     var commands = <Command>[];
@@ -1258,8 +1247,6 @@
   Map<String, dynamic> readOptionsFromFile(Uri uri) {
     if (uri.path.endsWith('.dill')) {
       return optionsFromKernelFile();
-    } else if ("$uri".startsWith("$co19SuiteLocation")) {
-      return readOptionsFromCo19File(uri);
     }
     RegExp testOptionsRegExp = new RegExp(r"// VMOptions=(.*)");
     RegExp environmentRegExp = new RegExp(r"// Environment=(.*)");
@@ -1403,9 +1390,11 @@
     //
     // Redo this code once we have a more precise test framework for detecting
     // and locating these errors.
-    var hasSyntaxError = contents.contains("/*@syntax-error=");
-    var hasCompileError =
-        hasSyntaxError || contents.contains("/*@compile-error=");
+    final hasSyntaxError = contents.contains("@syntax-error");
+    final hasCompileError =
+        hasSyntaxError || contents.contains("@compile-error");
+    final hasRuntimeError = contents.contains("@runtime-error");
+    final hasStaticWarning = contents.contains("@static-warning");
 
     return {
       "vmOptions": result,
@@ -1418,8 +1407,8 @@
       "packages": packages,
       "hasSyntaxError": hasSyntaxError,
       "hasCompileError": hasCompileError,
-      "hasRuntimeError": false,
-      "hasStaticWarning": false,
+      "hasRuntimeError": hasRuntimeError,
+      "hasStaticWarning": hasStaticWarning,
       "otherScripts": otherScripts,
       "otherResources": otherResources,
       "isMultitest": isMultitest,
@@ -1458,7 +1447,8 @@
       Compiler.dartkb,
       Compiler.dartkp,
       Compiler.precompiler,
-      Compiler.appJit
+      Compiler.appJit,
+      Compiler.appJitk,
     ];
 
     const runtimes = const [Runtime.none, Runtime.dartPrecompiled, Runtime.vm];
@@ -1468,50 +1458,6 @@
     if (!needsVmOptions) return [[]];
     return optionsFromFile['vmOptions'] as List<List<String>>;
   }
-
-  /**
-   * Read options from a co19 test file.
-   *
-   * The reason this is different from [readOptionsFromFile] is that
-   * co19 is developed based on a contract which defines certain test
-   * tags. These tags may appear unused, but should not be removed
-   * without consulting with the co19 team.
-   *
-   * Also, [readOptionsFromFile] recognizes a number of additional
-   * tags that are not appropriate for use in general tests of
-   * conformance to the Dart language. Any Dart implementation must
-   * pass the co19 test suite as is, and not require extra flags,
-   * environment variables, configuration files, etc.
-   */
-  Map<String, dynamic> readOptionsFromCo19File(Uri uri) {
-    String contents = decodeUtf8(new File.fromUri(uri).readAsBytesSync());
-
-    bool hasSyntaxError = contents.contains("@syntax-error");
-    bool hasCompileError =
-        hasSyntaxError || contents.contains("@compile-error");
-    bool hasRuntimeError = contents.contains("@runtime-error");
-    bool hasStaticWarning = contents.contains("@static-warning");
-    bool isMultitest = multiTestRegExp.hasMatch(contents);
-
-    return {
-      "vmOptions": <List<String>>[[]],
-      "sharedOptions": <String>[],
-      "dart2jsOptions": <String>[],
-      "dartOptions": null,
-      "packageRoot": null,
-      "hasSyntaxError": hasSyntaxError,
-      "hasCompileError": hasCompileError,
-      "hasRuntimeError": hasRuntimeError,
-      "hasStaticWarning": hasStaticWarning,
-      "otherScripts": <String>[],
-      "otherResources": <String>[],
-      "isMultitest": isMultitest,
-      "isMultiHtmlTest": false,
-      "subtestNames": <String>[],
-      "isolateStubs": '',
-      "containsDomImport": false,
-    };
-  }
 }
 
 /// Used for testing packages in one-off settings, i.e., we pass in the actual
diff --git a/tools/testing/dart/utils.dart b/tools/testing/dart/utils.dart
index 35a2b1a..0da3dbf 100644
--- a/tools/testing/dart/utils.dart
+++ b/tools/testing/dart/utils.dart
@@ -37,10 +37,9 @@
   /**
    * If [path] was null, the DebugLogger will write messages to stdout.
    */
-  static void init(Path path, {bool append: false}) {
+  static void init(Path path) {
     if (path != null) {
-      var mode = append ? FileMode.append : FileMode.write;
-      _sink = new File(path.toNativePath()).openWrite(mode: mode);
+      _sink = new File(path.toNativePath()).openWrite(mode: FileMode.append);
     }
   }
 
@@ -462,29 +461,18 @@
 
   static final debugLogFilePath = new Path(".debug.log");
 
-  /// If a flaky test failed, information about it (test name, stdin, stdout)
-  /// is written to this file.
-  ///
-  /// This is useful for debugging flaky tests. When running on a buildbot, the
-  /// file can be made visible in the waterfall UI.
-  static const flakyFileName = ".flaky.log";
-
-  /// If test.py was invoked with '--write-test-outcome-log it will write
-  /// test outcomes to this file.
-  static const testOutcomeFileName = ".test-outcome.log";
-
-  /// If test.py was invoked with '--write-result-log it will write
-  /// test outcomes to this file in the '--output-directory'.
-  static const resultLogFileName = "result.log";
-
-  /// If test.py was invoked with '--write-results it will write
+  /// If test.py was invoked with '--write-results' it will write
   /// test outcomes to this file in the '--output-directory'.
   static const resultsFileName = "results.json";
 
-  /// If test.py was invoked with '--write-results it will write
+  /// If test.py was invoked with '--write-results' it will write
   /// data about this run of test.py to this file in the '--output-directory'.
   static const resultsInstanceFileName = "run.json";
 
+  /// If test.py was invoked with '--write-results' and '--write-logs", save
+  /// the stdout and stderr to this file in the '--output-directory'.
+  static const logsFileName = "logs.json";
+
   static void ensureExists(String filename, TestConfiguration configuration) {
     if (!configuration.listTests && !existsCache.doesFileExist(filename)) {
       throw "'$filename' does not exist";
diff --git a/tools/utils.py b/tools/utils.py
index c550045..ac9dcbf 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -779,11 +779,20 @@
     pass
 
   def __enter__(self):
+    print "INFO: Enabling coredump archiving into %s" % (WindowsCoreDumpEnabler.CRASHPAD_DB_FOLDER)
     os.environ['DART_CRASHPAD_CRASHES_DIR'] = WindowsCoreDumpEnabler.CRASHPAD_DB_FOLDER
 
   def __exit__(self, *_):
     del os.environ['DART_CRASHPAD_CRASHES_DIR']
 
+
+def TryUnlink(file):
+  try:
+    os.unlink(file)
+  except Exception as error:
+    print "ERROR: Failed to remove %s: %s" % (file, error)
+
+
 class BaseCoreDumpArchiver(object):
   """This class reads coredumps file written by UnexpectedCrashDumpArchiver
   into the current working directory and uploads all cores and binaries
@@ -799,9 +808,18 @@
     self._search_dir = search_dir
     self._output_directory = output_directory
 
+  def _safe_cleanup(self):
+    try:
+      return self._cleanup();
+    except Exception as error:
+      print "ERROR: Failure during cleanup: %s" % error
+      return False
+
   def __enter__(self):
+    print "INFO: Core dump archiving is activated"
+
     # Cleanup any stale files
-    if self._cleanup():
+    if self._safe_cleanup():
       print "WARNING: Found and removed stale coredumps"
 
   def __exit__(self, *_):
@@ -817,8 +835,20 @@
         sys.stdout.flush()
 
         self._archive(archive_crashes)
+      else:
+        print "INFO: No unexpected crashes recorded"
+        dumps = self._find_all_coredumps()
+        if dumps:
+          print "INFO: However there are %d core dumps found" % len(dumps)
+          for dump in dumps:
+            print "INFO:        -> %s" % dump
+          print
+    except Exception as error:
+      print "ERROR: Failed to archive crashes: %s" % error
+      raise
+
     finally:
-      self._cleanup()
+      self._safe_cleanup()
 
   def _archive(self, crashes):
     files = set()
@@ -830,16 +860,27 @@
         files.add(core)
       else:
         missing.append(crash)
-    if (self._output_directory is None
-        or os.environ.containsKey('BUILDBOT_BUILDERNAME')):
-      self._upload(files)
-    else:
-      # This is a sharded test run: copy the dump to the output_directory
+    if self._output_directory is not None and self._is_shard():
+      print (
+          "INFO: Copying collected dumps and binaries into output directory\n"
+          "INFO: They will be uploaded to isolate server. Look for \"isolated"
+          " out\" under the failed step on the build page.\n"
+          "INFO: For more information see runtime/docs/infra/coredumps.md")
       self._copy(files)
+    else:
+      print (
+          "INFO: Uploading collected dumps and binaries into Cloud Storage\n"
+          "INFO: Use `gsutil.py cp from-url to-path` to download them.\n"
+          "INFO: For more information see runtime/docs/infra/coredumps.md")
+      self._upload(files)
 
     if missing:
       self._report_missing_crashes(missing, throw=True)
 
+  # todo(athom): move the logic to decide where to copy core dumps into the recipes.
+  def _is_shard(self):
+    return 'BUILDBOT_BUILDERNAME' not in os.environ
+
   def _report_missing_crashes(self, missing, throw=True):
     missing_as_string = ', '.join([str(c) for c in missing])
     other_files = list(glob.glob(os.path.join(self._search_dir, '*')))
@@ -859,17 +900,24 @@
 
   def _tar(self, file):
     # Sanitize the name: actual cores follow 'core.%d' pattern, crashed
-    # binaries are copied next to cores and named 'binary.<binary_name>'.
+    # binaries are copied next to cores and named
+    # 'binary.<mode>_<arch>_<binary_name>'.
+    # This should match the code in testing/dart/test_progress.dart
     name = os.path.basename(file)
     (prefix, suffix) = name.split('.', 1)
-    if prefix == 'binary':
-      name = suffix
+    is_binary = prefix == 'binary'
+    if is_binary:
+      (mode, arch, binary_name) = suffix.split('_', 2)
+      name = binary_name
 
     tarname = '%s.tar.gz' % name
 
     # Compress the file.
     tar = tarfile.open(tarname, mode='w:gz')
     tar.add(file, arcname=name)
+    if is_binary and os.path.exists(file + '.pdb'):
+      # Also add a PDB file if there is one.
+      tar.add(file + '.pdb', arcname=name + '.pdb')
     tar.close()
     return tarname
 
@@ -894,9 +942,16 @@
       except Exception as error:
         print '!!! Failed to upload %s, error: %s' % (tarname, error)
 
-      os.unlink(tarname)
+      TryUnlink(tarname)
+
     print '--- Done ---\n'
 
+  def _find_all_coredumps(self):
+    """Return coredumps that were recorded (if supported by the platform).
+    This method will be overriden by concrete platform specific implementations.
+    """
+    return []
+
   def _find_unexpected_crashes(self):
     """Load coredumps file. Each line has the following format:
 
@@ -915,7 +970,8 @@
       found = True
     for binary in glob.glob(os.path.join(self._binaries_dir, 'binary.*')):
       found = True
-      os.unlink(binary)
+      TryUnlink(binary)
+
     return found
 
 class PosixCoreDumpArchiver(BaseCoreDumpArchiver):
@@ -926,10 +982,7 @@
     found = super(PosixCoreDumpArchiver, self)._cleanup()
     for core in glob.glob(os.path.join(self._search_dir, 'core.*')):
       found = True
-      try:
-        os.unlink(core)
-      except:
-        pass
+      TryUnlink(core)
     return found
 
   def _find_coredump_file(self, crash):
@@ -954,13 +1007,81 @@
         WindowsCoreDumpEnabler.DUMPS_FOLDER, output_directory)
     self._dumps_by_pid = None
 
+  # Find CDB.exe in the win_toolchain that we are using.
+  def _find_cdb(self):
+    win_toolchain_json_path = os.path.join(
+        DART_DIR, 'build', 'win_toolchain.json')
+    if not os.path.exists(win_toolchain_json_path):
+      return None
+
+    with open(win_toolchain_json_path, "r") as f:
+      win_toolchain_info = json.loads(f.read())
+
+    win_sdk_path = win_toolchain_info['win_sdk']
+
+    # We assume that we are running on 64-bit Windows.
+    # Note: x64 CDB can work with both X64 and IA32 dumps.
+    cdb_path = os.path.join(win_sdk_path, 'Debuggers', 'x64', 'cdb.exe')
+    if not os.path.exists(cdb_path):
+      return None
+
+    return cdb_path
+
+  CDBG_PROMPT_RE = re.compile(r'^\d+:\d+>')
+
+  def _dump_all_stacks(self):
+    # On Windows due to crashpad integration crashes do not produce any
+    # stacktraces. Dump stack traces from dumps Crashpad collected using
+    # CDB (if available).
+    cdb_path = self._find_cdb()
+    if cdb_path is None:
+      return
+
+    dumps = self._find_all_coredumps()
+    if not dumps:
+      return
+
+    print "### Collected %d crash dumps" % len(dumps)
+    for dump in dumps:
+      print
+      print "### Dumping stacks from %s using CDB" % dump
+      cdb_output = subprocess.check_output(
+          '"%s" -z "%s" -kqm -c "!uniqstack -b -v -p;qd"' % (cdb_path, dump),
+          stderr=subprocess.STDOUT)
+      # Extract output of uniqstack from the whole output of CDB.
+      output = False
+      for line in cdb_output.split('\n'):
+        if re.match(WindowsCoreDumpArchiver.CDBG_PROMPT_RE, line):
+          output = True
+        elif line.startswith("quit:"):
+          break
+        elif output:
+          print line
+    print
+    print "#############################################"
+    print
+
+
+  def __exit__(self, *args):
+    try:
+      self._dump_all_stacks()
+    except Exception as error:
+      print "ERROR: Unable to dump stacks from dumps: %s" % error
+
+    super(WindowsCoreDumpArchiver, self).__exit__(*args)
+
+
   def _cleanup(self):
     found = super(WindowsCoreDumpArchiver, self)._cleanup()
     for core in glob.glob(os.path.join(self._search_dir, '*')):
       found = True
-      os.unlink(core)
+      TryUnlink(core)
     return found
 
+  def _find_all_coredumps(self):
+    pattern = os.path.join(self._search_dir, '*.dmp')
+    return [core_filename for core_filename in glob.glob(pattern)]
+
   def _find_coredump_file(self, crash):
     if self._dumps_by_pid is None:
       # If this function is invoked the first time then look through the directory
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index 45faa40..a9a0145 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -132,7 +132,7 @@
   Target target;
   var summaryOnly = parsedArgs['summary-only'] as bool;
   var excludeNonSources = parsedArgs['exclude-non-sources'] as bool;
-  var targetFlags = new TargetFlags(syncAsync: true);
+  var targetFlags = new TargetFlags();
   if (summaryOnly) {
     target = new SummaryTarget(sources, excludeNonSources, targetFlags);
   } else {
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index d1614e3..f40512c 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -70,8 +70,7 @@
   main_dart = "$target_gen_dir/dart2js.dart"
   training_args = [
     "--packages=" + rebase_path("../../.packages"),
-    "--library-root=" + rebase_path("../../sdk"),
-    "--categories=all",
+    "--libraries-spec=" + rebase_path("../../sdk/lib/libraries.json"),
     rebase_path("$target_gen_dir/dart2js.dart"),
   ]
 }
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 04dd2fc..039604a 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -9,6 +9,7 @@
 patched_sdk_dir = "$target_gen_dir/patched_sdk"
 sdk_summary = "$target_gen_dir/ddc_sdk.sum"
 sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
+sdk_libraries_json = "$target_gen_dir/libraries.json"
 
 application_snapshot("dartdevc") {
   main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
@@ -32,25 +33,6 @@
   inputs = [ sdk_summary ]
 }
 
-application_snapshot("dartdevk") {
-  main_dart = "../../pkg/dev_compiler/bin/dartdevk.dart"
-
-  training_args = [
-    "--dart-sdk-summary",
-    rebase_path(sdk_dill),
-    "-o",
-    "dartdevk.js",
-    rebase_path("../../pkg/dev_compiler/bin/dartdevk.dart"),
-  ]
-
-  deps = [
-    ":dartdevc_sdk",
-    ":dartdevk_sdk",
-  ]
-
-  inputs = [ sdk_dill ]
-}
-
 sdk_lib_files = exec_script("../../tools/list_dart_files.py",
                             [
                               "absolute",
@@ -224,25 +206,24 @@
   ]
 }
 
-# Builds everything needed to run dartdevc and dartdevk tests using test.dart.
+# Builds everything needed to run dartdevc tests using test.dart.
 group("dartdevc_test") {
   deps = [
     ":dartdevc",
     ":dartdevc_sdk",
-    ":dartdevk_sdk",
+    ":dartdevc_kernel_sdk",
     ":dartdevc_test_pkg",
-    ":dartdevk",
     "../../sdk:create_sdk",
   ]
 }
 
-# Builds everything needed to run dartdevc and dartdevk tests locally using
-# test.dart without --use-sdk. This is the same as dartdevc_test, but skips
-# things rely on building the Dart VM and create_sdk.
+# Builds everything needed to run dartdevc tests locally using test.dart without
+# --use-sdk. This is the same as dartdevc_test, but skips things rely on
+# building the Dart VM and create_sdk.
 group("dartdevc_test_local") {
   deps = [
     ":dartdevc_sdk",
-    ":dartdevk_sdk",
+    ":dartdevc_kernel_sdk",
     ":dartdevc_test_pkg",
   ]
 }
@@ -263,12 +244,13 @@
   deps = [
     ":dartdevc_files_stamp",
     ":dartdevc_sdk",
-    ":dartdevk_sdk",
+    ":dartdevc_kernel_sdk",
     "../../pkg:pkg_files_stamp",
   ]
 
   inputs = [
     sdk_dill,
+    sdk_libraries_json,
     sdk_summary,
     "$target_gen_dir/dartdevc_files.stamp",
     "$root_gen_dir/pkg_files.stamp",
@@ -333,7 +315,7 @@
 }
 
 # Compiles the DDC SDK's kernel summary and JS code.
-prebuilt_dart_action("dartdevk_sdk") {
+prebuilt_dart_action("dartdevc_kernel_sdk") {
   deps = [
     "../../pkg:pkg_files_stamp",
     ":dartdevc_files_stamp",
@@ -348,6 +330,7 @@
 
   outputs = [
     sdk_dill,
+    sdk_libraries_json,
     "$target_gen_dir/kernel/amd/dart_sdk.js",
     "$target_gen_dir/kernel/amd/dart_sdk.js.map",
     "$target_gen_dir/kernel/common/dart_sdk.js",